<?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>CMSFoundation</name>
	<version>1.4.1</version>
  <mincmsversion>1.7</mincmsversion>
	<help><![CDATA[LS0gTWlzc2luZyBMYW5ndWFnZXN0cmluZyAtIG1vZHVsZTpDTVNGb3VuZGF0aW9uIHN0cmluZzpoZWxwLS08aDM+RGVwZW5kZW5jaWVzPC9oMz48dWw+PGxpPkNHRXh0ZW5zaW9ucyA9Jmd0OyAxLjI0PC9saT48bGk+Q0dTaW1wbGVTbWFydHkgPSZndDsgMS40LjQ8L2xpPjxsaT5KUXVlcnlUb29scyA9Jmd0OyAxLjAuMTE8L2xpPjwvdWw+PGgzPlBhcmFtZXRlcnM8L2gzPjx1bD48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBsYW5nPSJlbl9VUyIgLSBQYXJhbSZlZ3JhdmU7dHJlIHV0aWxpcyZlYWN1dGU7IHBvdXIgc3AmZWFjdXRlO2NpZmllciBkYW5zIHF1ZWxsZSBsYW5ndWUgYWZmaWNoZXIgbGUgbW9kdWxlIGRhbnMgbGEgcGFydGllIHB1YmxpcXVlLiBDZSBwYXJhbSZlZ3JhdmU7dHJlIG4mIzAzOTtlc3QgcGFzIHN1cHBvcnQmZWFjdXRlOyBvdSB1dGlsZSBwb3VyIHRvdXMgbGVzIG1vZHVsZXMuPC9saT48L3VsPg==]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBOaWNvbGFzIEdyaWxsZXQgJmx0O24uZ3JpbGxldDAxQGdtYWlsLmNvbSZndDs8YnIgLz48YnIgLz5WZXJzaW9uOiAxLjQuMTxiciAvPjxiciAvPkNoYW5nZSBIaXN0b3J5OjxiciAvPi0tIE1pc3NpbmcgTGFuZ3VhZ2VzdHJpbmcgLSBtb2R1bGU6Q01TRm91bmRhdGlvbiBzdHJpbmc6Y2hhbmdlbG9nLS08YnIgLz4=]]></about>
	<description><![CDATA[-- Missing Languagestring - module:CMSFoundation string:moddescription--]]></description>
	<requires>
	  <requiredname>CGExtensions</requiredname>
	  <requiredversion>1.24</requiredversion>
	</requires>
	<requires>
	  <requiredname>CGSimpleSmarty</requiredname>
	  <requiredversion>1.4.4</requiredversion>
	</requires>
	<requires>
	  <requiredname>JQueryTools</requiredname>
	  <requiredversion>1.0.11</requiredversion>
	</requires>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.default.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCmlmICghaXNzZXQoJGdDbXMpKSBleGl0Ow0KJGNvbmZpZyA9IGNtc21zKCktPkdldENvbmZpZygpOw0KJGYgPSAkY29uZmlnWydyb290X3VybCddLiIvbW9kdWxlcy9DTVNGb3VuZGF0aW9uL2Fzc2V0cy8iOw0KJGNhY2hlX2lkID0gJ3xucycubWQ1KHNlcmlhbGl6ZSgkcGFyYW1zKSk7DQokY29tcGlsZV9pZCA9ICcnOw0KJHN0ciA9ICI8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMFwiIC8+XG4iOw0KJHN0ciAuPSAiPGxpbmsgaHJlZj1cIiIuJGYuIi9zdHlsZXNoZWV0cy9mb3VuZGF0aW9uLm1pbi5jc3NcIiB0eXBlPVwidGV4dC9jc3NcIiByZWw9XCJzdHlsZXNoZWV0XCIgLz5cbiI7DQokc3RyIC49ICI8c2NyaXB0IHNyYz1cIiIuJGYuIi9qYXZhc2NyaXB0cy9tb2Rlcm5penIuZm91bmRhdGlvbi5qc1wiIHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj48L3NjcmlwdD5cbiI7DQokc3RyIC49ICI8c2NyaXB0IHNyYz1cIiIuJGYuIi9qYXZhc2NyaXB0cy9mb3VuZGF0aW9uLm1pbi5qc1wiIHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj48L3NjcmlwdD5cbiI7DQplY2hvICRzdHI7DQokb2JqID0gY2dlX3V0aWxzOjpnZXRfbW9kdWxlKCdKUXVlcnlUb29scycpOw0KaWYoIGlzX29iamVjdCgkb2JqKSApDQp7DQokdG1wbCA9IDw8PEVPVA0Ke0pRdWVyeVRvb2xzIGFjdGlvbj0naW5janMnIGV4Y2x1ZGU9J2Zvcm0sdWksdGFibGVzb3J0ZXIsZmlsZXVwbG9hZCxmYW5jeWJveCxjbHVldGlwLGxpZ2h0Ym94LGNnZm9ybSxqcXVlcnl0b29scyxqc29uJ30NCkVPVDsNCmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZUZyb21EYXRhKCR0bXBsKTsNCn0NCj8+]]></data>
	</file>
	<file>
	  <filename>/assets/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/assets/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/assets/images/foundation/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/assets/images/foundation/orbit/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/assets/images/foundation/orbit/bullets.jpg</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAZAAA/+4ADkFkb2JlAGTAAAAAAf/bAIQAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAwMDAwMDAwMDAwEBAQEBAQECAQECAgIBAgIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD/8AAEQgADAAVAwERAAIRAQMRAf/EAGUAAQEBAAAAAAAAAAAAAAAAAAkIBAEBAAAAAAAAAAAAAAAAAAAAABAAAAIIBAYCAwEAAAAAAAAAAgcDEwQFBhcIGQEVFgkAEhQlJhgRIkEjRQoRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AMbt/wBY1ZTVu1IKdE5CFhhS011XApkRloGGIpAfLO5kxnSuQxYKKRRMJjGZaN5DwbUjpxdWDvFhhi7sAhS9w4BiWsqjC3k9wrcBKk5qpqkCCpT2+Y4LYjS6p3pgNNqJeITFMCK4IFGESncdETulgan/ABA6mlOITPDLF9WMKBAsRK0iNsxbwmWH3PWS9KnDb2JmncSqBwKyB6iqd4kclWjPFzp9zRUomnSrVCd0UUrPg2BOoTbgZAIoJ10JHbEgABeuMPCbkwwCd6t1ABckFia5im6f0gufZ6kWcmkpvzC6Aa/k/hTny7mWcvlSv55vzwBK7vmiLhsQW2bh90eUEHe1NvPQ8uJSfrl37aTD8NmPp/l0v8dwy/pl/wBcv4CaXdbMtyRjld1q4HcKLbXPSLbulyuWprSpz9X4zoSUussoW9g0/mSrvy7gP//ZCg==]]></data>
	</file>
	<file>
	  <filename>/assets/images/foundation/orbit/left-arrow-small.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACcAAAAyCAYAAADfuMIdAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAYZJREFUeNrs2b9qg1AUBvDv6uDokMlHCOgjZFXyBHkIn8AtQ56jDskQEExUmpJCsxTaoVPB0o4lBEKmOhSKUKGLBAJdoufIGRzu4vTDf/c73wWAGwARgKWgFdUuRAC2ADaC1rZ2YVlfyAStTe3qcT2ux3WJSwGsJeISTdOyyWTyYprmXQ0VgUuUUslisdgfDofvwWAgBpcopZL5fL4/nU4/juPsACQSHusFzLbtHYCVhHeOAsaCo4KR4yhhpDhqGBmOA0aC44K1xnHCWuG4YY1xXcAa4dKOYFfjUsMwsjAMP4/HIzfsalzs+/5rVVXVcDh8ABBLCpvr0Wj0WBRFGQTBW33XUklJeOW67lNZlr/T6fSdGdjoa409z+sC2Pg/1wWw1Q7BDWy9t3ICSVIJF5Asz3EASZMwNZB8hqAEskxfVEC2uZUCyDrx/wcUVeScgbPZ7EPX9RTCWqZ4PB4/53n+ZVnWvaSW6RztDcO4VUqJbTZTCG02+064x/U4KpzoI02xh8F/AwBbM/bc28sm5gAAAABJRU5ErkJgggo=]]></data>
	</file>
	<file>
	  <filename>/assets/images/foundation/orbit/left-arrow.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAE4AAABkCAYAAAAonQZNAAAB0UlEQVR42u3cO07DQBSFYRdpU2QZKbK2LMSSq+wgS8ACWYYtkA6EIiogFQ0FlWVAligoY6SZOefmt3QkV3OvPvk1Y8tVVVVX5F8BATjggAOOAAcccMABR4ADDjjggCPAAQcccKpZLBbtbrd76vv+bbVa3QB3JlrXda/fv9tms7kDbiZaXdcPnKoz0ZqmeeQap4/mByeC5gUnhOYDJ4bmASeIpg8niqYNJ4ymCyeOpglngKYHZ4KmBWeEpgNnhqYBZ4hWHs4UrSycMVo5OHO0MnAB0PLDBUHLCxcILR9cMLQ8cAHR0sMFRUsLFxgtHVxwtDRwF4CWBm6/3z8HR0sDdzqdPie06ajjM68Zadv2ZYIbx/Fru93eA3dmlsvl9eFweA+Ol2bgC8BLN3hwvLQFAuOlLxIUL0+hgHj5igXDy1swEF7+okHwyhQOgFeuuDle2QaM8co3YYqn0Yghnk4zZnhaDRnh6TVlgqd5Khjg6V6AxfG0b/vCePoPm6J4HlMcQTyfibUYntdyjhCe3yKiCJ7n0rUAnu8Lk8J43q/p/uINwzCu1+tb4GbgTf9VOh6PH9M+cKzHAUeAAw444IAjwAEHHHDAEeCAAw44AhxwwLnkB9OTz7qHLRlAAAAAAElFTkSuQmCCCg==]]></data>
	</file>
	<file>
	  <filename>/assets/images/foundation/orbit/loading.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhHwAfAPUAAAAAAP///xYWFiwsLEJCQlBQUFxcXCIiIkZGRmRkZBoaGiYmJlRUVF5eXk5OTjIyMggICFZWVioqKhgYGMjIyNjY2K6urjo6Oo6OjmxsbKioqAQEBJaWlri4uDg4OAYGBra2tszMzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH+GkNyZWF0ZWQgd2l0aCBhamF4bG9hZC5pbmZvACH5BAAKAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAHwAfAAAG/0CAcEgUDAgFA4BiwSQexKh0eEAkrldAZbvlOD5TqYKALWu5XIwnPFwwymY0GsRgAxrwuJwbCi8aAHlYZ3sVdwtRCm8JgVgODwoQAAIXGRpojQwKRGSDCRESYRsGHYZlBFR5AJt2a3kHQlZlERN2QxMRcAiTeaG2QxJ5RnAOv1EOcEdwUMZDD3BIcKzNq3BJcJLUABBwStrNBtjf3GUGBdLfCtadWMzUz6cDxN/IZQMCvdTBcAIAsli0jOHSJeSAqmlhNr0awo7RJ19TJORqdAXVEEVZyjyKtE3Bg3oZE2iK8oeiKkFZGiCaggelSTiA2LhxiZLBSjZjBL2siNBOFQ84LxHA+mYEiRJzBO7ZCQIAIfkEAAoAAQAsAAAAAB8AHwAABv9AgHBIFAwIBQPAUCAMBMSodHhAJK5XAPaKOEynCsIWqx0nCIrvcMEwZ90JxkINaMATZXfju9jf82YAIQxRCm14Ww4PChAAEAoPDlsAFRUgHkRiZAkREmoSEXiVlRgfQgeBaXRpo6MOQlZbERN0Qx4drRUcAAJmnrVDBrkVDwNjr8BDGxq5Z2MPyUQZuRgFY6rRABe5FgZjjdm8uRTh2d5b4NkQY0zX5QpjTc/lD2NOx+WSW0++2RJmUGJhmZVsQqgtCE6lqpXGjBchmt50+hQKEAEiht5gUcTIESR9GhlgE9IH0BiTkxrMmWIHDkose9SwcQlHDsOIk9ygiVbl5JgMLuV4HUmypMkTOkEAACH5BAAKAAIALAAAAAAfAB8AAAb/QIBwSBQMCAUDwFAgDATEqHR4QCSuVwD2ijhMpwrCFqsdJwiK73DBMGfdCcZCDWjAE2V347vY3/NmdXNECm14Ww4PChAAEAoPDltlDGlDYmQJERJqEhGHWARUgZVqaWZeAFZbERN0QxOeWwgAAmabrkMSZkZjDrhRkVtHYw+/RA9jSGOkxgpjSWOMxkIQY0rT0wbR2LQV3t4UBcvcF9/eFpdYxdgZ5hUYA73YGxruCbVjt78G7hXFqlhY/fLQwR0HIQdGuUrTz5eQdIc0cfIEwByGD0MKvcGSaFGjR8GyeAPhIUofQGNQSgrB4IsdOCqx7FHDBiYcOQshYjKDxliVDpRjunCjdSTJkiZP6AQBACH5BAAKAAMALAAAAAAfAB8AAAb/QIBwSBQMCAUDwFAgDATEqHR4QCSuVwD2ijhMpwrCFqsdJwiK73DBMGfdCcZCDWjAE2V347vY3/NmdXNECm14Ww4PChAAEAoPDltlDGlDYmQJERJqEhGHWARUgZVqaWZeAFZbERN0QxOeWwgAAmabrkMSZkZjDrhRkVtHYw+/RA9jSGOkxgpjSWOMxkIQY0rT0wbR2I3WBcvczltNxNzIW0693MFYT7bTumNQqlisv7BjswAHo64egFdQAbj0RtOXDQY6VAAUakihN1gSLaJ1IYOGChgXXqEUpQ9ASRlDYhT0xQ4cACJDhqDD5mRKjCAYuArjBmVKDP9+VRljMyMHDwcfuBlBooSCBQwJiqkJAgAh+QQACgAEACwAAAAAHwAfAAAG/0CAcEgUDAgFA8BQIAwExKh0eEAkrlcA9oo4TKcKwharHScIiu9wwTBn3QnGQg1owBNld+O72N/zZnVzRApteFsODwoQABAKDw5bZQxpQ2JkCRESahIRh1gEVIGVamlmXgBWWxETdEMTnlsIAAJmm65DEmZGYw64UZFbR2MPv0QPY0hjpMYKY0ljjMZCEGNK09MG0diN1gXL3M5bTcTcyFtOvdzBWE+207pjUKpYrL+wY7MAB4EerqZjUAG4lKVCBwMbvnT6dCXUkEIFK0jUkOECFEeQJF2hFKUPAIkgQwIaI+hLiJAoR27Zo4YBCJQgVW4cpMYDBpgVZKL59cEBhw+U+QROQ4bBAoUlTZ7QCQIAIfkEAAoABQAsAAAAAB8AHwAABv9AgHBIFAwIBQPAUCAMBMSodHhAJK5XAPaKOEynCsIWqx0nCIrvcMEwZ90JxkINaMATZXfju9jf82Z1c0QKbXhbDg8KEAAQCg8OW2UMaUNiZAkREmoSEYdYBFSBlWppZl4AVlsRE3RDE55bCAACZpuuQxJmRmMOuFGRW0djD79ED2NIY6TGCmNJY4zGQhBjStPTFBXb21DY1VsGFtzbF9gAzlsFGOQVGefIW2LtGhvYwVgDD+0V17+6Y6BwaNfBwy9YY2YBcMAPnStTY1B9YMdNiyZOngCFGuIBxDZAiRY1eoTvE6UoDEIAGrNSUoNBUuzAaYlljxo2M+HIeXiJpRsRNMaq+JSFCpsRJEqYOPH2JQgAIfkEAAoABgAsAAAAAB8AHwAABv9AgHBIFAwIBQPAUCAMBMSodHhAJK5XAPaKOEynCsIWqx0nCIrvcMEwZ90JxkINaMATZXfjywjlzX9jdXNEHiAVFX8ODwoQABAKDw5bZQxpQh8YiIhaERJqEhF4WwRDDpubAJdqaWZeAByoFR0edEMTolsIAA+yFUq2QxJmAgmyGhvBRJNbA5qoGcpED2MEFrIX0kMKYwUUslDaj2PA4soGY47iEOQFY6vS3FtNYw/m1KQDYw7mzFhPZj5JGzYGipUtESYowzVmF4ADgOCBCZTgFQAxZBJ4AiXqT6ltbUZhWdToUSR/Ii1FWbDnDkUyDQhJsQPn5ZU9atjUhCPHVhgTNy/RSKsiqKFFbUaQKGHiJNyXIAAh+QQACgAHACwAAAAAHwAfAAAG/0CAcEh8JDAWCsBQIAwExKhU+HFwKlgsIMHlIg7TqQeTLW+7XYIiPGSAymY0mrFgA0LwuLzbCC/6eVlnewkADXVECgxcAGUaGRdQEAoPDmhnDGtDBJcVHQYbYRIRhWgEQwd7AB52AGt7YAAIchETrUITpGgIAAJ7ErdDEnsCA3IOwUSWaAOcaA/JQ0amBXKa0QpyBQZyENFCEHIG39HcaN7f4WhM1uTZaE1y0N/TacZoyN/LXU+/0cNyoMxCUytYLjm8AKSS46rVKzmxADhjlCACMFGkBiU4NUQRxS4OHijwNqnSJS6ZovzRyJAQo0NhGrgs5bIPmwWLCLHsQsfhxBWTe9QkOzCwC8sv5Ho127akyRM7QQAAOwAAAAAAAAAAAAo=]]></data>
	</file>
	<file>
	  <filename>/assets/images/foundation/orbit/mask-black.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAAH7+Yj7AAAB1UlEQVRYw81YQWcEMRQOZU9l6KkMcy17WoZee13KnErpqT+gP6MMpaeyp7IsQ+lf2WuvpZSelmUZliXNbJPtzORl8jLJbPL4LvHNt1+Sl5e8JZRSInCI1iDdA2DiBpufs0ilHzqwWoOypmpQ/hx0IUgdRBHf4MwBIsESqY5o7JHoiEJthSVq17E9GS1xxokfOuIpdh3XnFh0ES9NkyLHEOPOdUT8SrURCXoHkZsl542hoIiIoQREi76CcPr/4c5WMJZELQWzluDORjAFpnxmKnjNUwba6dhV2jzZ5OGOYc4wIsp9xwuqRRyclFfXggJXQ5zl5yGKQ2ZTHPLOitPzpCSA4MK22uToC82ifDkXTFwLjl0LjmwEI9dr2L6oShvBL8Bdaio4YXhRnJJ1EBe9XsxS8N1FgV02SpWNYM+ZLPlGTknfGNgghJLfGlGoBuvYMjyEbLCOx2MZPOFVJ+N908rAZMU9H9qgKqpu6wdpdOzDYN3oFnGQIl8Gyb5N+G9yVVj4NAg1S1RqnkweDAMYHKFy0aPBC4TBxKfBmcbcp88czBGrd+/DYNz481CNt2PWwYhfYyWySBeh3sUVbkN9LMxDfM1sGG5Ceg9uePKnvl/UE+IwfgEt5tjhwATtOwAAAABJRU5ErkJgggo=]]></data>
	</file>
	<file>
	  <filename>/assets/images/foundation/orbit/pause-black.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACgAAABQCAYAAABrjzfBAAAA50lEQVRo3u3WwaaCQRTA8f88QT1hjxFxibhERLRqcyPuA7S8T9GqbUS0ShER19zNDN+mxbdI5+p/NjOGmfmZ48xMyjkTOZJAgQIFChQoUODTgCmlDnBuDpW2uWg353wRKFCgQIECBfqbEShQoECBAgUKFChQoECBAgVGAqaUWs9pu99bAH+APrCJCqwLfAMfwC4qEOAOLIAhcIoIrHEFJsC09MMBaxyBUTnV34jAGiugFxG4BQbAOlqKD6VQljW1UYAXYAzMgFukKr4Dc+Dz0fXySuBXSefet9j/oECBAgUKFCjw3wH/AMYfhXCrzL4NAAAAAElFTkSuQmCCCg==]]></data>
	</file>
	<file>
	  <filename>/assets/images/foundation/orbit/right-arrow-small.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACcAAAAyCAYAAADfuMIdAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAYxJREFUeNrs2b1qwlAUB/D/1eFuWTL5CIHrI7gafII8RJ4gW4Y8Rx10EATTJFSxUJeCHToVLO1YiiBOdShIoIEuGVroILnnpHe4w1ky/bgf55ycCwBXAOYAZgbFvHZhDmANYGlQrGsXZvWHwqBY1i6LsziL08VdA8hNw+WO46yCIHjsdDoFgMwonOu6q/1+/zmdTt+FEBkTsPG2Zv1+f3M8Hs+TyYQLqHXmUqUUJ1D7tnICSVIJF5Asz3EASZMwNZC8QlACWcoXFZCttlIAWQu/LpC9K9EBttIy/QXMTernUqXU5nA4nMfj8ZuUsrgA2GqzufA8766qqioMwycAC1NwOYA0iqLn0+lUDgaD+7pZ/XdcDiCN4/ilLMuv4XC4BZCacOZ+wXzf316wna3gdGCsOF0YG44CxoKjgpHjKGGkOGoYGY4DRoLjgmnjOGH6P9WMsOa4brebJ0nyyghrPsjp9Xq3u93uYzQaPTDBmq+cEKKQUt4wjr9ILoQdu1qcxVncD5zRT5rGPgZ/DwBv2PbZe2Kf8QAAAABJRU5ErkJgggo=]]></data>
	</file>
	<file>
	  <filename>/assets/images/foundation/orbit/right-arrow.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAE4AAABkCAYAAAAonQZNAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAdVJREFUeNrs2jFuwkAQhWEXtC44BgVn4yBIVNyAI8QispxcIXSJIpQqQJWGIhVyNk2KlECx897ot/TqGX2Svd7daZqmeSB3BQTggAMOOAIccMABBxwBDjjggAOOAAcccMDdm+l0+jgMw3G9Xr9PJpMOuCszn8+fy9/T9/0hCV6dQsvl8jUZXr1iq9XqLRFe3YKJ8OoXTYIXUzgBXlxxc7zYBozx4pswxdNoxBBPpxkzPK2GjPD0mjLB03wVDPB0P8DieNrLvjCe/s+mKJ7HFkcQz2djLYbndZwjhOd3iCiC53l0LYDne2ESjOd9TReI5385HISXYyQhAC/PPEdlvFzDMBXx8k0S/cfbbDYfwN2Qvu8PpZRyOp2+gbsyi8XiZRzHn1JK6bruE7gb0Xa73VfbtlvgdNDywFVGywEXgOYPF4TmDReI5gsXjOYJJ4DmByeC5gUnhOYDJ4bmASeIpg8niqYNJ4ymCyeOpglngKYHZ4KmBWeEpgNnhqYBZ4gWD2eKFgtnjBYHZ44WA5cArT5cErS6cInQ6sElQ6sDN5vNni6Xy5gIrQ5c27bb/X5/HobhmAQt75gXcMABR4ADDjjggCPAAQcccMAR4IADDjgCAHBV8zsAtj7Pup2IuboAAAAASUVORK5CYIIK]]></data>
	</file>
	<file>
	  <filename>/assets/images/foundation/orbit/rotator-black.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAAH7+Yj7AAAB30lEQVRYw82XQWcDQRTH/4Rcl5zKEkoJIZQln6GUPZVS+m3CnnoqoZQSlnyYXnvqqZSelhBCKdNDZ9vp5GXn7czbnTz2kPHff37zZua9WcAIpRSUUn+/f8b2B8Ee3Hv9V1UPXpuqelBRSnIQ1Ot1XNkU5Nv6Gdv2pnBqCNEkNB3fXEIyU01CADh1CVWbWTcK19xZ/xOJChOXcOazMqyE37VdmTpK179wDB9t3BBDyqhoShg7iaaRj+GYMESI4VDaEAB2luFnqCEAVAcW5h7Aue+2geS2oeICwLOkYR1ZqOEZgK3UlLeSOVRdn2Vvw5Iw2bnKbpvi8B5yUm6lz/KrZVaGGtp0E2nDJNTwyzLMQw1XluEm1DAhpp2FFljqdMxDDE8OmFYALn1bQCFdHABg0UULGOmuJ95TBrrjqS56ih1DvVgPAF58ZiINOAKwJE6p99pJARYuoFiArcH6Akx1LeQCVXrpc13uBl0CzphQH3aZ9CmZbQFHxA1bETfuuWvTdgVYOuA2ehKIAThklI+cW4+6AJwy9l0SEzBlAE5iAsJuV8Szig14w8hiEROQuryqA58saSxATrkxP9QW1OHpoxfnvn2479vM8tgBzYxujhnQjDGApybg2ICuz4BMGvAby7rZRPnVapoAAAAASUVORK5CYIIK]]></data>
	</file>
	<file>
	  <filename>/assets/images/foundation/orbit/timer-black.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAAH7+Yj7AAAB1UlEQVRYw81YQWcEMRQOZU9l6KkMcy17WoZee13KnErpqT+gP6MMpaeyp7IsQ+lf2WuvpZSelmUZliXNbJPtzORl8jLJbPL4LvHNt1+Sl5e8JZRSInCI1iDdA2DiBpufs0ilHzqwWoOypmpQ/hx0IUgdRBHf4MwBIsESqY5o7JHoiEJthSVq17E9GS1xxokfOuIpdh3XnFh0ES9NkyLHEOPOdUT8SrURCXoHkZsl542hoIiIoQREi76CcPr/4c5WMJZELQWzluDORjAFpnxmKnjNUwba6dhV2jzZ5OGOYc4wIsp9xwuqRRyclFfXggJXQ5zl5yGKQ2ZTHPLOitPzpCSA4MK22uToC82ifDkXTFwLjl0LjmwEI9dr2L6oShvBL8Bdaio4YXhRnJJ1EBe9XsxS8N1FgV02SpWNYM+ZLPlGTknfGNgghJLfGlGoBuvYMjyEbLCOx2MZPOFVJ+N908rAZMU9H9qgKqpu6wdpdOzDYN3oFnGQIl8Gyb5N+G9yVVj4NAg1S1RqnkweDAMYHKFy0aPBC4TBxKfBmcbcp88czBGrd+/DYNz481CNt2PWwYhfYyWySBeh3sUVbkN9LMxDfM1sGG5Ceg9uePKnvl/UE+IwfgEt5tjhwATtOwAAAABJRU5ErkJgggo=]]></data>
	</file>
	<file>
	  <filename>/assets/javascripts/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/assets/javascripts/app.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[OyhmdW5jdGlvbiAoJCwgd2luZG93LCB1bmRlZmluZWQpIHsKICAndXNlIHN0cmljdCc7CgogIHZhciAkZG9jID0gJChkb2N1bWVudCksCiAgICAgIE1vZGVybml6ciA9IHdpbmRvdy5Nb2Rlcm5penI7CgogICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewogICAgJC5mbi5mb3VuZGF0aW9uQWxlcnRzICAgICAgICAgICA/ICRkb2MuZm91bmRhdGlvbkFsZXJ0cygpIDogbnVsbDsKICAgICQuZm4uZm91bmRhdGlvbkJ1dHRvbnMgICAgICAgICAgPyAkZG9jLmZvdW5kYXRpb25CdXR0b25zKCkgOiBudWxsOwogICAgJC5mbi5mb3VuZGF0aW9uQWNjb3JkaW9uICAgICAgICA/ICRkb2MuZm91bmRhdGlvbkFjY29yZGlvbigpIDogbnVsbDsKICAgICQuZm4uZm91bmRhdGlvbk5hdmlnYXRpb24gICAgICAgPyAkZG9jLmZvdW5kYXRpb25OYXZpZ2F0aW9uKCkgOiBudWxsOwogICAgJC5mbi5mb3VuZGF0aW9uVG9wQmFyICAgICAgICAgICA/ICRkb2MuZm91bmRhdGlvblRvcEJhcigpIDogbnVsbDsKICAgICQuZm4uZm91bmRhdGlvbkN1c3RvbUZvcm1zICAgICAgPyAkZG9jLmZvdW5kYXRpb25DdXN0b21Gb3JtcygpIDogbnVsbDsKICAgICQuZm4uZm91bmRhdGlvbk1lZGlhUXVlcnlWaWV3ZXIgPyAkZG9jLmZvdW5kYXRpb25NZWRpYVF1ZXJ5Vmlld2VyKCkgOiBudWxsOwogICAgJC5mbi5mb3VuZGF0aW9uVGFicyAgICAgICAgICAgICA/ICRkb2MuZm91bmRhdGlvblRhYnMoe2NhbGxiYWNrIDogJC5mb3VuZGF0aW9uLmN1c3RvbUZvcm1zLmFwcGVuZEN1c3RvbU1hcmt1cH0pIDogbnVsbDsKICAgICQuZm4uZm91bmRhdGlvblRvb2x0aXBzICAgICAgICAgPyAkZG9jLmZvdW5kYXRpb25Ub29sdGlwcygpIDogbnVsbDsKICAgICQuZm4uZm91bmRhdGlvbk1hZ2VsbGFuICAgICAgICAgPyAkZG9jLmZvdW5kYXRpb25NYWdlbGxhbigpIDogbnVsbDsKICAgICQuZm4uZm91bmRhdGlvbkNsZWFyaW5nICAgICAgICAgPyAkZG9jLmZvdW5kYXRpb25DbGVhcmluZygpIDogbnVsbDsKCiAgICAkLmZuLnBsYWNlaG9sZGVyICAgICAgICAgICAgICAgID8gJCgnaW5wdXQsIHRleHRhcmVhJykucGxhY2Vob2xkZXIoKSA6IG51bGw7CiAgfSk7CgogIC8vIFVOQ09NTUVOVCBUSEUgTElORSBZT1UgV0FOVCBCRUxPVyBJRiBZT1UgV0FOVCBJRTggU1VQUE9SVCBBTkQgQVJFIFVTSU5HIC5ibG9jay1ncmlkcwogIC8vICQoJy5ibG9jay1ncmlkLnR3by11cD5saTpudGgtY2hpbGQoMm4rMSknKS5jc3Moe2NsZWFyOiAnYm90aCd9KTsKICAvLyAkKCcuYmxvY2stZ3JpZC50aHJlZS11cD5saTpudGgtY2hpbGQoM24rMSknKS5jc3Moe2NsZWFyOiAnYm90aCd9KTsKICAvLyAkKCcuYmxvY2stZ3JpZC5mb3VyLXVwPmxpOm50aC1jaGlsZCg0bisxKScpLmNzcyh7Y2xlYXI6ICdib3RoJ30pOwogIC8vICQoJy5ibG9jay1ncmlkLmZpdmUtdXA+bGk6bnRoLWNoaWxkKDVuKzEpJykuY3NzKHtjbGVhcjogJ2JvdGgnfSk7CgogIC8vIEhpZGUgYWRkcmVzcyBiYXIgb24gbW9iaWxlIGRldmljZXMgKGV4Y2VwdCBpZiAjaGFzaCBwcmVzZW50LCBzbyB3ZSBkb24ndCBtZXNzIHVwIGRlZXAgbGlua2luZykuCiAgaWYgKE1vZGVybml6ci50b3VjaCAmJiAhd2luZG93LmxvY2F0aW9uLmhhc2gpIHsKICAgICQod2luZG93KS5sb2FkKGZ1bmN0aW9uICgpIHsKICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIDEpOwogICAgICB9LCAwKTsKICAgIH0pOwogIH0KCn0pKGpRdWVyeSwgdGhpcyk7Cg==]]></data>
	</file>
	<file>
	  <filename>/assets/javascripts/foundation.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogTW9kZXJuaXpyIDIuNi4yIChDdXN0b20gQnVpbGQpIHwgTUlUICYgQlNECiAqIEJ1aWxkOiBodHRwOi8vbW9kZXJuaXpyLmNvbS9kb3dubG9hZC8jLWlubGluZXN2Zy1zdmctc3ZnY2xpcHBhdGhzLXRvdWNoLXNoaXYtbXEtY3NzY2xhc3Nlcy10ZXN0c3R5bGVzLXByZWZpeGVzLWllOGNvbXBhdC1sb2FkCiAqLwp3aW5kb3cuTW9kZXJuaXpyPWZ1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiByKGUpe2QuY3NzVGV4dD1lfWZ1bmN0aW9uIGkoZSx0KXtyZXR1cm4gcihnLmpvaW4oZSsiOyIpKyh0fHwiIikpfWZ1bmN0aW9uIHMoZSx0KXtyZXR1cm4gdHlwZW9mIGU9PT10fWZ1bmN0aW9uIG8oZSx0KXtyZXR1cm4hIX4oIiIrZSkuaW5kZXhPZih0KX1mdW5jdGlvbiB1KGUsdCxyKXtmb3IodmFyIGkgaW4gZSl7dmFyIG89dFtlW2ldXTtpZihvIT09bilyZXR1cm4gcj09PSExP2VbaV06cyhvLCJmdW5jdGlvbiIpP28uYmluZChyfHx0KTpvfXJldHVybiExfXZhciBhPSIyLjYuMiIsZj17fSxsPSEwLGM9dC5kb2N1bWVudEVsZW1lbnQsaD0ibW9kZXJuaXpyIixwPXQuY3JlYXRlRWxlbWVudChoKSxkPXAuc3R5bGUsdixtPXt9LnRvU3RyaW5nLGc9IiAtd2Via2l0LSAtbW96LSAtby0gLW1zLSAiLnNwbGl0KCIgIikseT17c3ZnOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyJ9LGI9e30sdz17fSxFPXt9LFM9W10seD1TLnNsaWNlLFQsTj1mdW5jdGlvbihlLG4scixpKXt2YXIgcyxvLHUsYSxmPXQuY3JlYXRlRWxlbWVudCgiZGl2IiksbD10LmJvZHkscD1sfHx0LmNyZWF0ZUVsZW1lbnQoImJvZHkiKTtpZihwYXJzZUludChyLDEwKSl3aGlsZShyLS0pdT10LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHUuaWQ9aT9pW3JdOmgrKHIrMSksZi5hcHBlbmRDaGlsZCh1KTtyZXR1cm4gcz1bIiYjMTczOyIsJzxzdHlsZSBpZD0icycsaCwnIj4nLGUsIjwvc3R5bGU+Il0uam9pbigiIiksZi5pZD1oLChsP2Y6cCkuaW5uZXJIVE1MKz1zLHAuYXBwZW5kQ2hpbGQoZiksbHx8KHAuc3R5bGUuYmFja2dyb3VuZD0iIixwLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLGE9Yy5zdHlsZS5vdmVyZmxvdyxjLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLGMuYXBwZW5kQ2hpbGQocCkpLG89bihmLGUpLGw/Zi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGYpOihwLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocCksYy5zdHlsZS5vdmVyZmxvdz1hKSwhIW99LEM9ZnVuY3Rpb24odCl7dmFyIG49ZS5tYXRjaE1lZGlhfHxlLm1zTWF0Y2hNZWRpYTtpZihuKXJldHVybiBuKHQpLm1hdGNoZXM7dmFyIHI7cmV0dXJuIE4oIkBtZWRpYSAiK3QrIiB7ICMiK2grIiB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgfSB9IixmdW5jdGlvbih0KXtyPShlLmdldENvbXB1dGVkU3R5bGU/Z2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpOnQuY3VycmVudFN0eWxlKVsicG9zaXRpb24iXT09ImFic29sdXRlIn0pLHJ9LGs9e30uaGFzT3duUHJvcGVydHksTDshcyhrLCJ1bmRlZmluZWQiKSYmIXMoay5jYWxsLCJ1bmRlZmluZWQiKT9MPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGsuY2FsbChlLHQpfTpMPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQgaW4gZSYmcyhlLmNvbnN0cnVjdG9yLnByb3RvdHlwZVt0XSwidW5kZWZpbmVkIil9LEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kfHwoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZih0eXBlb2YgdCE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yO3ZhciBuPXguY2FsbChhcmd1bWVudHMsMSkscj1mdW5jdGlvbigpe2lmKHRoaXMgaW5zdGFuY2VvZiByKXt2YXIgaT1mdW5jdGlvbigpe307aS5wcm90b3R5cGU9dC5wcm90b3R5cGU7dmFyIHM9bmV3IGksbz10LmFwcGx5KHMsbi5jb25jYXQoeC5jYWxsKGFyZ3VtZW50cykpKTtyZXR1cm4gT2JqZWN0KG8pPT09bz9vOnN9cmV0dXJuIHQuYXBwbHkoZSxuLmNvbmNhdCh4LmNhbGwoYXJndW1lbnRzKSkpfTtyZXR1cm4gcn0pLGIudG91Y2g9ZnVuY3Rpb24oKXt2YXIgbjtyZXR1cm4ib250b3VjaHN0YXJ0ImluIGV8fGUuRG9jdW1lbnRUb3VjaCYmdCBpbnN0YW5jZW9mIERvY3VtZW50VG91Y2g/bj0hMDpOKFsiQG1lZGlhICgiLGcuam9pbigidG91Y2gtZW5hYmxlZCksKCIpLGgsIikiLCJ7I21vZGVybml6cnt0b3A6OXB4O3Bvc2l0aW9uOmFic29sdXRlfX0iXS5qb2luKCIiKSxmdW5jdGlvbihlKXtuPWUub2Zmc2V0VG9wPT09OX0pLG59LGIuc3ZnPWZ1bmN0aW9uKCl7cmV0dXJuISF0LmNyZWF0ZUVsZW1lbnROUyYmISF0LmNyZWF0ZUVsZW1lbnROUyh5LnN2Zywic3ZnIikuY3JlYXRlU1ZHUmVjdH0sYi5pbmxpbmVzdmc9ZnVuY3Rpb24oKXt2YXIgZT10LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBlLmlubmVySFRNTD0iPHN2Zy8+IiwoZS5maXJzdENoaWxkJiZlLmZpcnN0Q2hpbGQubmFtZXNwYWNlVVJJKT09eS5zdmd9LGIuc3ZnY2xpcHBhdGhzPWZ1bmN0aW9uKCl7cmV0dXJuISF0LmNyZWF0ZUVsZW1lbnROUyYmL1NWR0NsaXBQYXRoLy50ZXN0KG0uY2FsbCh0LmNyZWF0ZUVsZW1lbnROUyh5LnN2ZywiY2xpcFBhdGgiKSkpfTtmb3IodmFyIEEgaW4gYilMKGIsQSkmJihUPUEudG9Mb3dlckNhc2UoKSxmW1RdPWJbQV0oKSxTLnB1c2goKGZbVF0/IiI6Im5vLSIpK1QpKTtyZXR1cm4gZi5hZGRUZXN0PWZ1bmN0aW9uKGUsdCl7aWYodHlwZW9mIGU9PSJvYmplY3QiKWZvcih2YXIgciBpbiBlKUwoZSxyKSYmZi5hZGRUZXN0KHIsZVtyXSk7ZWxzZXtlPWUudG9Mb3dlckNhc2UoKTtpZihmW2VdIT09bilyZXR1cm4gZjt0PXR5cGVvZiB0PT0iZnVuY3Rpb24iP3QoKTp0LHR5cGVvZiBsIT0idW5kZWZpbmVkIiYmbCYmKGMuY2xhc3NOYW1lKz0iICIrKHQ/IiI6Im5vLSIpK2UpLGZbZV09dH1yZXR1cm4gZn0scigiIikscD12PW51bGwsZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUsdCl7dmFyIG49ZS5jcmVhdGVFbGVtZW50KCJwIikscj1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGUuZG9jdW1lbnRFbGVtZW50O3JldHVybiBuLmlubmVySFRNTD0ieDxzdHlsZT4iK3QrIjwvc3R5bGU+IixyLmluc2VydEJlZm9yZShuLmxhc3RDaGlsZCxyLmZpcnN0Q2hpbGQpfWZ1bmN0aW9uIHIoKXt2YXIgZT1nLmVsZW1lbnRzO3JldHVybiB0eXBlb2YgZT09InN0cmluZyI/ZS5zcGxpdCgiICIpOmV9ZnVuY3Rpb24gaShlKXt2YXIgdD12W2VbcF1dO3JldHVybiB0fHwodD17fSxkKyssZVtwXT1kLHZbZF09dCksdH1mdW5jdGlvbiBzKGUsbixyKXtufHwobj10KTtpZihtKXJldHVybiBuLmNyZWF0ZUVsZW1lbnQoZSk7cnx8KHI9aShuKSk7dmFyIHM7cmV0dXJuIHIuY2FjaGVbZV0/cz1yLmNhY2hlW2VdLmNsb25lTm9kZSgpOmMudGVzdChlKT9zPShyLmNhY2hlW2VdPXIuY3JlYXRlRWxlbShlKSkuY2xvbmVOb2RlKCk6cz1yLmNyZWF0ZUVsZW0oZSkscy5jYW5IYXZlQ2hpbGRyZW4mJiFsLnRlc3QoZSk/ci5mcmFnLmFwcGVuZENoaWxkKHMpOnN9ZnVuY3Rpb24gbyhlLG4pe2V8fChlPXQpO2lmKG0pcmV0dXJuIGUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO249bnx8aShlKTt2YXIgcz1uLmZyYWcuY2xvbmVOb2RlKCksbz0wLHU9cigpLGE9dS5sZW5ndGg7Zm9yKDtvPGE7bysrKXMuY3JlYXRlRWxlbWVudCh1W29dKTtyZXR1cm4gc31mdW5jdGlvbiB1KGUsdCl7dC5jYWNoZXx8KHQuY2FjaGU9e30sdC5jcmVhdGVFbGVtPWUuY3JlYXRlRWxlbWVudCx0LmNyZWF0ZUZyYWc9ZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50LHQuZnJhZz10LmNyZWF0ZUZyYWcoKSksZS5jcmVhdGVFbGVtZW50PWZ1bmN0aW9uKG4pe3JldHVybiBnLnNoaXZNZXRob2RzP3MobixlLHQpOnQuY3JlYXRlRWxlbShuKX0sZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50PUZ1bmN0aW9uKCJoLGYiLCJyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1mLmNsb25lTm9kZSgpLGM9bi5jcmVhdGVFbGVtZW50O2guc2hpdk1ldGhvZHMmJigiK3IoKS5qb2luKCkucmVwbGFjZSgvXHcrL2csZnVuY3Rpb24oZSl7cmV0dXJuIHQuY3JlYXRlRWxlbShlKSx0LmZyYWcuY3JlYXRlRWxlbWVudChlKSwnYygiJytlKyciKSd9KSsiKTtyZXR1cm4gbn0iKShnLHQuZnJhZyl9ZnVuY3Rpb24gYShlKXtlfHwoZT10KTt2YXIgcj1pKGUpO3JldHVybiBnLnNoaXZDU1MmJiFoJiYhci5oYXNDU1MmJihyLmhhc0NTUz0hIW4oZSwiYXJ0aWNsZSxhc2lkZSxmaWdjYXB0aW9uLGZpZ3VyZSxmb290ZXIsaGVhZGVyLGhncm91cCxuYXYsc2VjdGlvbntkaXNwbGF5OmJsb2NrfW1hcmt7YmFja2dyb3VuZDojRkYwO2NvbG9yOiMwMDB9IikpLG18fHUoZSxyKSxlfXZhciBmPWUuaHRtbDV8fHt9LGw9L148fF4oPzpidXR0b258bWFwfHNlbGVjdHx0ZXh0YXJlYXxvYmplY3R8aWZyYW1lfG9wdGlvbnxvcHRncm91cCkkL2ksYz0vXig/OmF8Ynxjb2RlfGRpdnxmaWVsZHNldHxoMXxoMnxoM3xoNHxoNXxoNnxpfGxhYmVsfGxpfG9sfHB8cXxzcGFufHN0cm9uZ3xzdHlsZXx0YWJsZXx0Ym9keXx0ZHx0aHx0cnx1bCkkL2ksaCxwPSJfaHRtbDVzaGl2IixkPTAsdj17fSxtOyhmdW5jdGlvbigpe3RyeXt2YXIgZT10LmNyZWF0ZUVsZW1lbnQoImEiKTtlLmlubmVySFRNTD0iPHh5ej48L3h5ej4iLGg9ImhpZGRlbiJpbiBlLG09ZS5jaGlsZE5vZGVzLmxlbmd0aD09MXx8ZnVuY3Rpb24oKXt0LmNyZWF0ZUVsZW1lbnQoImEiKTt2YXIgZT10LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtyZXR1cm4gdHlwZW9mIGUuY2xvbmVOb2RlPT0idW5kZWZpbmVkInx8dHlwZW9mIGUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudD09InVuZGVmaW5lZCJ8fHR5cGVvZiBlLmNyZWF0ZUVsZW1lbnQ9PSJ1bmRlZmluZWQifSgpfWNhdGNoKG4pe2g9ITAsbT0hMH19KSgpO3ZhciBnPXtlbGVtZW50czpmLmVsZW1lbnRzfHwiYWJiciBhcnRpY2xlIGFzaWRlIGF1ZGlvIGJkaSBjYW52YXMgZGF0YSBkYXRhbGlzdCBkZXRhaWxzIGZpZ2NhcHRpb24gZmlndXJlIGZvb3RlciBoZWFkZXIgaGdyb3VwIG1hcmsgbWV0ZXIgbmF2IG91dHB1dCBwcm9ncmVzcyBzZWN0aW9uIHN1bW1hcnkgdGltZSB2aWRlbyIsc2hpdkNTUzpmLnNoaXZDU1MhPT0hMSxzdXBwb3J0c1Vua25vd25FbGVtZW50czptLHNoaXZNZXRob2RzOmYuc2hpdk1ldGhvZHMhPT0hMSx0eXBlOiJkZWZhdWx0IixzaGl2RG9jdW1lbnQ6YSxjcmVhdGVFbGVtZW50OnMsY3JlYXRlRG9jdW1lbnRGcmFnbWVudDpvfTtlLmh0bWw1PWcsYSh0KX0odGhpcyx0KSxmLl92ZXJzaW9uPWEsZi5fcHJlZml4ZXM9ZyxmLm1xPUMsZi50ZXN0U3R5bGVzPU4sYy5jbGFzc05hbWU9Yy5jbGFzc05hbWUucmVwbGFjZSgvKF58XHMpbm8tanMoXHN8JCkvLCIkMSQyIikrKGw/IiBqcyAiK1Muam9pbigiICIpOiIiKSxmfSh0aGlzLHRoaXMuZG9jdW1lbnQpLGZ1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiByKGUpe3JldHVybiJbb2JqZWN0IEZ1bmN0aW9uXSI9PWQuY2FsbChlKX1mdW5jdGlvbiBpKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZX1mdW5jdGlvbiBzKCl7fWZ1bmN0aW9uIG8oZSl7cmV0dXJuIWV8fCJsb2FkZWQiPT1lfHwiY29tcGxldGUiPT1lfHwidW5pbml0aWFsaXplZCI9PWV9ZnVuY3Rpb24gdSgpe3ZhciBlPXYuc2hpZnQoKTttPTEsZT9lLnQ/aChmdW5jdGlvbigpeygiYyI9PWUudD9rLmluamVjdENzczprLmluamVjdEpzKShlLnMsMCxlLmEsZS54LGUuZSwxKX0sMCk6KGUoKSx1KCkpOm09MH1mdW5jdGlvbiBhKGUsbixyLGkscyxhLGYpe2Z1bmN0aW9uIGwodCl7aWYoIWQmJm8oYy5yZWFkeVN0YXRlKSYmKHcucj1kPTEsIW0mJnUoKSxjLm9ubG9hZD1jLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLHQpKXsiaW1nIiE9ZSYmaChmdW5jdGlvbigpe2IucmVtb3ZlQ2hpbGQoYyl9LDUwKTtmb3IodmFyIHIgaW4gVFtuXSlUW25dLmhhc093blByb3BlcnR5KHIpJiZUW25dW3JdLm9ubG9hZCgpfX12YXIgZj1mfHxrLmVycm9yVGltZW91dCxjPXQuY3JlYXRlRWxlbWVudChlKSxkPTAsZz0wLHc9e3Q6cixzOm4sZTpzLGE6YSx4OmZ9OzE9PT1UW25dJiYoZz0xLFRbbl09W10pLCJvYmplY3QiPT1lP2MuZGF0YT1uOihjLnNyYz1uLGMudHlwZT1lKSxjLndpZHRoPWMuaGVpZ2h0PSIwIixjLm9uZXJyb3I9Yy5vbmxvYWQ9Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtsLmNhbGwodGhpcyxnKX0sdi5zcGxpY2UoaSwwLHcpLCJpbWciIT1lJiYoZ3x8Mj09PVRbbl0/KGIuaW5zZXJ0QmVmb3JlKGMseT9udWxsOnApLGgobCxmKSk6VFtuXS5wdXNoKGMpKX1mdW5jdGlvbiBmKGUsdCxuLHIscyl7cmV0dXJuIG09MCx0PXR8fCJqIixpKGUpP2EoImMiPT10P0U6dyxlLHQsdGhpcy5pKyssbixyLHMpOih2LnNwbGljZSh0aGlzLmkrKywwLGUpLDE9PXYubGVuZ3RoJiZ1KCkpLHRoaXN9ZnVuY3Rpb24gbCgpe3ZhciBlPWs7cmV0dXJuIGUubG9hZGVyPXtsb2FkOmYsaTowfSxlfXZhciBjPXQuZG9jdW1lbnRFbGVtZW50LGg9ZS5zZXRUaW1lb3V0LHA9dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IilbMF0sZD17fS50b1N0cmluZyx2PVtdLG09MCxnPSJNb3pBcHBlYXJhbmNlImluIGMuc3R5bGUseT1nJiYhIXQuY3JlYXRlUmFuZ2UoKS5jb21wYXJlTm9kZSxiPXk/YzpwLnBhcmVudE5vZGUsYz1lLm9wZXJhJiYiW29iamVjdCBPcGVyYV0iPT1kLmNhbGwoZS5vcGVyYSksYz0hIXQuYXR0YWNoRXZlbnQmJiFjLHc9Zz8ib2JqZWN0IjpjPyJzY3JpcHQiOiJpbWciLEU9Yz8ic2NyaXB0Ijp3LFM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09ZC5jYWxsKGUpfSx4PVtdLFQ9e30sTj17dGltZW91dDpmdW5jdGlvbihlLHQpe3JldHVybiB0Lmxlbmd0aCYmKGUudGltZW91dD10WzBdKSxlfX0sQyxrO2s9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXt2YXIgZT1lLnNwbGl0KCIhIiksdD14Lmxlbmd0aCxuPWUucG9wKCkscj1lLmxlbmd0aCxuPXt1cmw6bixvcmlnVXJsOm4scHJlZml4ZXM6ZX0saSxzLG87Zm9yKHM9MDtzPHI7cysrKW89ZVtzXS5zcGxpdCgiPSIpLChpPU5bby5zaGlmdCgpXSkmJihuPWkobixvKSk7Zm9yKHM9MDtzPHQ7cysrKW49eFtzXShuKTtyZXR1cm4gbn1mdW5jdGlvbiBvKGUsaSxzLG8sdSl7dmFyIGE9dChlKSxmPWEuYXV0b0NhbGxiYWNrO2EudXJsLnNwbGl0KCIuIikucG9wKCkuc3BsaXQoIj8iKS5zaGlmdCgpLGEuYnlwYXNzfHwoaSYmKGk9cihpKT9pOmlbZV18fGlbb118fGlbZS5zcGxpdCgiLyIpLnBvcCgpLnNwbGl0KCI/IilbMF1dKSxhLmluc3RlYWQ/YS5pbnN0ZWFkKGUsaSxzLG8sdSk6KFRbYS51cmxdP2Eubm9leGVjPSEwOlRbYS51cmxdPTEscy5sb2FkKGEudXJsLGEuZm9yY2VDU1N8fCFhLmZvcmNlSlMmJiJjc3MiPT1hLnVybC5zcGxpdCgiLiIpLnBvcCgpLnNwbGl0KCI/Iikuc2hpZnQoKT8iYyI6bixhLm5vZXhlYyxhLmF0dHJzLGEudGltZW91dCksKHIoaSl8fHIoZikpJiZzLmxvYWQoZnVuY3Rpb24oKXtsKCksaSYmaShhLm9yaWdVcmwsdSxvKSxmJiZmKGEub3JpZ1VybCx1LG8pLFRbYS51cmxdPTJ9KSkpfWZ1bmN0aW9uIHUoZSx0KXtmdW5jdGlvbiBuKGUsbil7aWYoZSl7aWYoaShlKSlufHwoZj1mdW5jdGlvbigpe3ZhciBlPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtsLmFwcGx5KHRoaXMsZSksYygpfSksbyhlLGYsdCwwLHUpO2Vsc2UgaWYoT2JqZWN0KGUpPT09ZSlmb3IocCBpbiBoPWZ1bmN0aW9uKCl7dmFyIHQ9MCxuO2ZvcihuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmdCsrO3JldHVybiB0fSgpLGUpZS5oYXNPd25Qcm9wZXJ0eShwKSYmKCFuJiYhLS1oJiYocihmKT9mPWZ1bmN0aW9uKCl7dmFyIGU9W10uc2xpY2UuY2FsbChhcmd1bWVudHMpO2wuYXBwbHkodGhpcyxlKSxjKCl9OmZbcF09ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9W10uc2xpY2UuY2FsbChhcmd1bWVudHMpO2UmJmUuYXBwbHkodGhpcyx0KSxjKCl9fShsW3BdKSksbyhlW3BdLGYsdCxwLHUpKX1lbHNlIW4mJmMoKX12YXIgdT0hIWUudGVzdCxhPWUubG9hZHx8ZS5ib3RoLGY9ZS5jYWxsYmFja3x8cyxsPWYsYz1lLmNvbXBsZXRlfHxzLGgscDtuKHU/ZS55ZXA6ZS5ub3BlLCEhYSksYSYmbihhKX12YXIgYSxmLGM9dGhpcy55ZXBub3BlLmxvYWRlcjtpZihpKGUpKW8oZSwwLGMsMCk7ZWxzZSBpZihTKGUpKWZvcihhPTA7YTxlLmxlbmd0aDthKyspZj1lW2FdLGkoZik/byhmLDAsYywwKTpTKGYpP2soZik6T2JqZWN0KGYpPT09ZiYmdShmLGMpO2Vsc2UgT2JqZWN0KGUpPT09ZSYmdShlLGMpfSxrLmFkZFByZWZpeD1mdW5jdGlvbihlLHQpe05bZV09dH0say5hZGRGaWx0ZXI9ZnVuY3Rpb24oZSl7eC5wdXNoKGUpfSxrLmVycm9yVGltZW91dD0xZTQsbnVsbD09dC5yZWFkeVN0YXRlJiZ0LmFkZEV2ZW50TGlzdGVuZXImJih0LnJlYWR5U3RhdGU9ImxvYWRpbmciLHQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQz1mdW5jdGlvbigpe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQywwKSx0LnJlYWR5U3RhdGU9ImNvbXBsZXRlIn0sMCkpLGUueWVwbm9wZT1sKCksZS55ZXBub3BlLmV4ZWN1dGVTdGFjaz11LGUueWVwbm9wZS5pbmplY3RKcz1mdW5jdGlvbihlLG4scixpLGEsZil7dmFyIGw9dC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxjLGQsaT1pfHxrLmVycm9yVGltZW91dDtsLnNyYz1lO2ZvcihkIGluIHIpbC5zZXRBdHRyaWJ1dGUoZCxyW2RdKTtuPWY/dTpufHxzLGwub25yZWFkeXN0YXRlY2hhbmdlPWwub25sb2FkPWZ1bmN0aW9uKCl7IWMmJm8obC5yZWFkeVN0YXRlKSYmKGM9MSxuKCksbC5vbmxvYWQ9bC5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCl9LGgoZnVuY3Rpb24oKXtjfHwoYz0xLG4oMSkpfSxpKSxhP2wub25sb2FkKCk6cC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShsLHApfSxlLnllcG5vcGUuaW5qZWN0Q3NzPWZ1bmN0aW9uKGUsbixyLGksbyxhKXt2YXIgaT10LmNyZWF0ZUVsZW1lbnQoImxpbmsiKSxmLG49YT91Om58fHM7aS5ocmVmPWUsaS5yZWw9InN0eWxlc2hlZXQiLGkudHlwZT0idGV4dC9jc3MiO2ZvcihmIGluIHIpaS5zZXRBdHRyaWJ1dGUoZixyW2ZdKTtvfHwocC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShpLHApLGgobiwwKSl9fSh0aGlzLGRvY3VtZW50KSxNb2Rlcm5penIubG9hZD1mdW5jdGlvbigpe3llcG5vcGUuYXBwbHkod2luZG93LFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApKX0sTW9kZXJuaXpyLmFkZFRlc3QoImllOGNvbXBhdCIsZnVuY3Rpb24oKXtyZXR1cm4hd2luZG93LmFkZEV2ZW50TGlzdGVuZXImJmRvY3VtZW50LmRvY3VtZW50TW9kZSYmZG9jdW1lbnQuZG9jdW1lbnRNb2RlPT09N30pOwovKiEKICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2MS44LjIKICogaHR0cDovL2pxdWVyeS5jb20vCiAqCiAqIEluY2x1ZGVzIFNpenpsZS5qcwogKiBodHRwOi8vc2l6emxlanMuY29tLwogKgogKiBDb3B5cmlnaHQgMjAxMiBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIERhdGU6IFRodSBTZXAgMjAgMjAxMiAyMToxMzowNSBHTVQtMDQwMCAoRWFzdGVybiBEYXlsaWdodCBUaW1lKQogKi8KKGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gXyhlKXt2YXIgdD1NW2VdPXt9O3JldHVybiB2LmVhY2goZS5zcGxpdCh5KSxmdW5jdGlvbihlLG4pe3Rbbl09ITB9KSx0fWZ1bmN0aW9uIEgoZSxuLHIpe2lmKHI9PT10JiZlLm5vZGVUeXBlPT09MSl7dmFyIGk9ImRhdGEtIituLnJlcGxhY2UoUCwiLSQxIikudG9Mb3dlckNhc2UoKTtyPWUuZ2V0QXR0cmlidXRlKGkpO2lmKHR5cGVvZiByPT0ic3RyaW5nIil7dHJ5e3I9cj09PSJ0cnVlIj8hMDpyPT09ImZhbHNlIj8hMTpyPT09Im51bGwiP251bGw6K3IrIiI9PT1yPytyOkQudGVzdChyKT92LnBhcnNlSlNPTihyKTpyfWNhdGNoKHMpe312LmRhdGEoZSxuLHIpfWVsc2Ugcj10fXJldHVybiByfWZ1bmN0aW9uIEIoZSl7dmFyIHQ7Zm9yKHQgaW4gZSl7aWYodD09PSJkYXRhIiYmdi5pc0VtcHR5T2JqZWN0KGVbdF0pKWNvbnRpbnVlO2lmKHQhPT0idG9KU09OIilyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBldCgpe3JldHVybiExfWZ1bmN0aW9uIHR0KCl7cmV0dXJuITB9ZnVuY3Rpb24gdXQoZSl7cmV0dXJuIWV8fCFlLnBhcmVudE5vZGV8fGUucGFyZW50Tm9kZS5ub2RlVHlwZT09PTExfWZ1bmN0aW9uIGF0KGUsdCl7ZG8gZT1lW3RdO3doaWxlKGUmJmUubm9kZVR5cGUhPT0xKTtyZXR1cm4gZX1mdW5jdGlvbiBmdChlLHQsbil7dD10fHwwO2lmKHYuaXNGdW5jdGlvbih0KSlyZXR1cm4gdi5ncmVwKGUsZnVuY3Rpb24oZSxyKXt2YXIgaT0hIXQuY2FsbChlLHIsZSk7cmV0dXJuIGk9PT1ufSk7aWYodC5ub2RlVHlwZSlyZXR1cm4gdi5ncmVwKGUsZnVuY3Rpb24oZSxyKXtyZXR1cm4gZT09PXQ9PT1ufSk7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXt2YXIgcj12LmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4gZS5ub2RlVHlwZT09PTF9KTtpZihpdC50ZXN0KHQpKXJldHVybiB2LmZpbHRlcih0LHIsIW4pO3Q9di5maWx0ZXIodCxyKX1yZXR1cm4gdi5ncmVwKGUsZnVuY3Rpb24oZSxyKXtyZXR1cm4gdi5pbkFycmF5KGUsdCk+PTA9PT1ufSl9ZnVuY3Rpb24gbHQoZSl7dmFyIHQ9Y3Quc3BsaXQoInwiKSxuPWUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2lmKG4uY3JlYXRlRWxlbWVudCl3aGlsZSh0Lmxlbmd0aCluLmNyZWF0ZUVsZW1lbnQodC5wb3AoKSk7cmV0dXJuIG59ZnVuY3Rpb24gTHQoZSx0KXtyZXR1cm4gZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KVswXXx8ZS5hcHBlbmRDaGlsZChlLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0KSl9ZnVuY3Rpb24gQXQoZSx0KXtpZih0Lm5vZGVUeXBlIT09MXx8IXYuaGFzRGF0YShlKSlyZXR1cm47dmFyIG4scixpLHM9di5fZGF0YShlKSxvPXYuX2RhdGEodCxzKSx1PXMuZXZlbnRzO2lmKHUpe2RlbGV0ZSBvLmhhbmRsZSxvLmV2ZW50cz17fTtmb3IobiBpbiB1KWZvcihyPTAsaT11W25dLmxlbmd0aDtyPGk7cisrKXYuZXZlbnQuYWRkKHQsbix1W25dW3JdKX1vLmRhdGEmJihvLmRhdGE9di5leHRlbmQoe30sby5kYXRhKSl9ZnVuY3Rpb24gT3QoZSx0KXt2YXIgbjtpZih0Lm5vZGVUeXBlIT09MSlyZXR1cm47dC5jbGVhckF0dHJpYnV0ZXMmJnQuY2xlYXJBdHRyaWJ1dGVzKCksdC5tZXJnZUF0dHJpYnV0ZXMmJnQubWVyZ2VBdHRyaWJ1dGVzKGUpLG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLG49PT0ib2JqZWN0Ij8odC5wYXJlbnROb2RlJiYodC5vdXRlckhUTUw9ZS5vdXRlckhUTUwpLHYuc3VwcG9ydC5odG1sNUNsb25lJiZlLmlubmVySFRNTCYmIXYudHJpbSh0LmlubmVySFRNTCkmJih0LmlubmVySFRNTD1lLmlubmVySFRNTCkpOm49PT0iaW5wdXQiJiZFdC50ZXN0KGUudHlwZSk/KHQuZGVmYXVsdENoZWNrZWQ9dC5jaGVja2VkPWUuY2hlY2tlZCx0LnZhbHVlIT09ZS52YWx1ZSYmKHQudmFsdWU9ZS52YWx1ZSkpOm49PT0ib3B0aW9uIj90LnNlbGVjdGVkPWUuZGVmYXVsdFNlbGVjdGVkOm49PT0iaW5wdXQifHxuPT09InRleHRhcmVhIj90LmRlZmF1bHRWYWx1ZT1lLmRlZmF1bHRWYWx1ZTpuPT09InNjcmlwdCImJnQudGV4dCE9PWUudGV4dCYmKHQudGV4dD1lLnRleHQpLHQucmVtb3ZlQXR0cmlidXRlKHYuZXhwYW5kbyl9ZnVuY3Rpb24gTXQoZSl7cmV0dXJuIHR5cGVvZiBlLmdldEVsZW1lbnRzQnlUYWdOYW1lIT0idW5kZWZpbmVkIj9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik6dHlwZW9mIGUucXVlcnlTZWxlY3RvckFsbCE9InVuZGVmaW5lZCI/ZS5xdWVyeVNlbGVjdG9yQWxsKCIqIik6W119ZnVuY3Rpb24gX3QoZSl7RXQudGVzdChlLnR5cGUpJiYoZS5kZWZhdWx0Q2hlY2tlZD1lLmNoZWNrZWQpfWZ1bmN0aW9uIFF0KGUsdCl7aWYodCBpbiBlKXJldHVybiB0O3ZhciBuPXQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKSxyPXQsaT1KdC5sZW5ndGg7d2hpbGUoaS0tKXt0PUp0W2ldK247aWYodCBpbiBlKXJldHVybiB0fXJldHVybiByfWZ1bmN0aW9uIEd0KGUsdCl7cmV0dXJuIGU9dHx8ZSx2LmNzcyhlLCJkaXNwbGF5Iik9PT0ibm9uZSJ8fCF2LmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKX1mdW5jdGlvbiBZdChlLHQpe3ZhciBuLHIsaT1bXSxzPTAsbz1lLmxlbmd0aDtmb3IoO3M8bztzKyspe249ZVtzXTtpZighbi5zdHlsZSljb250aW51ZTtpW3NdPXYuX2RhdGEobiwib2xkZGlzcGxheSIpLHQ/KCFpW3NdJiZuLnN0eWxlLmRpc3BsYXk9PT0ibm9uZSImJihuLnN0eWxlLmRpc3BsYXk9IiIpLG4uc3R5bGUuZGlzcGxheT09PSIiJiZHdChuKSYmKGlbc109di5fZGF0YShuLCJvbGRkaXNwbGF5IixubihuLm5vZGVOYW1lKSkpKToocj1EdChuLCJkaXNwbGF5IiksIWlbc10mJnIhPT0ibm9uZSImJnYuX2RhdGEobiwib2xkZGlzcGxheSIscikpfWZvcihzPTA7czxvO3MrKyl7bj1lW3NdO2lmKCFuLnN0eWxlKWNvbnRpbnVlO2lmKCF0fHxuLnN0eWxlLmRpc3BsYXk9PT0ibm9uZSJ8fG4uc3R5bGUuZGlzcGxheT09PSIiKW4uc3R5bGUuZGlzcGxheT10P2lbc118fCIiOiJub25lIn1yZXR1cm4gZX1mdW5jdGlvbiBadChlLHQsbil7dmFyIHI9UnQuZXhlYyh0KTtyZXR1cm4gcj9NYXRoLm1heCgwLHJbMV0tKG58fDApKSsoclsyXXx8InB4Iik6dH1mdW5jdGlvbiBlbihlLHQsbixyKXt2YXIgaT1uPT09KHI/ImJvcmRlciI6ImNvbnRlbnQiKT80OnQ9PT0id2lkdGgiPzE6MCxzPTA7Zm9yKDtpPDQ7aSs9MiluPT09Im1hcmdpbiImJihzKz12LmNzcyhlLG4rJHRbaV0sITApKSxyPyhuPT09ImNvbnRlbnQiJiYocy09cGFyc2VGbG9hdChEdChlLCJwYWRkaW5nIiskdFtpXSkpfHwwKSxuIT09Im1hcmdpbiImJihzLT1wYXJzZUZsb2F0KER0KGUsImJvcmRlciIrJHRbaV0rIldpZHRoIikpfHwwKSk6KHMrPXBhcnNlRmxvYXQoRHQoZSwicGFkZGluZyIrJHRbaV0pKXx8MCxuIT09InBhZGRpbmciJiYocys9cGFyc2VGbG9hdChEdChlLCJib3JkZXIiKyR0W2ldKyJXaWR0aCIpKXx8MCkpO3JldHVybiBzfWZ1bmN0aW9uIHRuKGUsdCxuKXt2YXIgcj10PT09IndpZHRoIj9lLm9mZnNldFdpZHRoOmUub2Zmc2V0SGVpZ2h0LGk9ITAscz12LnN1cHBvcnQuYm94U2l6aW5nJiZ2LmNzcyhlLCJib3hTaXppbmciKT09PSJib3JkZXItYm94IjtpZihyPD0wfHxyPT1udWxsKXtyPUR0KGUsdCk7aWYocjwwfHxyPT1udWxsKXI9ZS5zdHlsZVt0XTtpZihVdC50ZXN0KHIpKXJldHVybiByO2k9cyYmKHYuc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZXx8cj09PWUuc3R5bGVbdF0pLHI9cGFyc2VGbG9hdChyKXx8MH1yZXR1cm4gcitlbihlLHQsbnx8KHM/ImJvcmRlciI6ImNvbnRlbnQiKSxpKSsicHgifWZ1bmN0aW9uIG5uKGUpe2lmKFd0W2VdKXJldHVybiBXdFtlXTt2YXIgdD12KCI8IitlKyI+IikuYXBwZW5kVG8oaS5ib2R5KSxuPXQuY3NzKCJkaXNwbGF5Iik7dC5yZW1vdmUoKTtpZihuPT09Im5vbmUifHxuPT09IiIpe1B0PWkuYm9keS5hcHBlbmRDaGlsZChQdHx8di5leHRlbmQoaS5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKSx7ZnJhbWVCb3JkZXI6MCx3aWR0aDowLGhlaWdodDowfSkpO2lmKCFIdHx8IVB0LmNyZWF0ZUVsZW1lbnQpSHQ9KFB0LmNvbnRlbnRXaW5kb3d8fFB0LmNvbnRlbnREb2N1bWVudCkuZG9jdW1lbnQsSHQud3JpdGUoIjwhZG9jdHlwZSBodG1sPjxodG1sPjxib2R5PiIpLEh0LmNsb3NlKCk7dD1IdC5ib2R5LmFwcGVuZENoaWxkKEh0LmNyZWF0ZUVsZW1lbnQoZSkpLG49RHQodCwiZGlzcGxheSIpLGkuYm9keS5yZW1vdmVDaGlsZChQdCl9cmV0dXJuIFd0W2VdPW4sbn1mdW5jdGlvbiBmbihlLHQsbixyKXt2YXIgaTtpZih2LmlzQXJyYXkodCkpdi5lYWNoKHQsZnVuY3Rpb24odCxpKXtufHxzbi50ZXN0KGUpP3IoZSxpKTpmbihlKyJbIisodHlwZW9mIGk9PSJvYmplY3QiP3Q6IiIpKyJdIixpLG4scil9KTtlbHNlIGlmKCFuJiZ2LnR5cGUodCk9PT0ib2JqZWN0Iilmb3IoaSBpbiB0KWZuKGUrIlsiK2krIl0iLHRbaV0sbixyKTtlbHNlIHIoZSx0KX1mdW5jdGlvbiBDbihlKXtyZXR1cm4gZnVuY3Rpb24odCxuKXt0eXBlb2YgdCE9InN0cmluZyImJihuPXQsdD0iKiIpO3ZhciByLGkscyxvPXQudG9Mb3dlckNhc2UoKS5zcGxpdCh5KSx1PTAsYT1vLmxlbmd0aDtpZih2LmlzRnVuY3Rpb24obikpZm9yKDt1PGE7dSsrKXI9b1t1XSxzPS9eXCsvLnRlc3QocikscyYmKHI9ci5zdWJzdHIoMSl8fCIqIiksaT1lW3JdPWVbcl18fFtdLGlbcz8idW5zaGlmdCI6InB1c2giXShuKX19ZnVuY3Rpb24ga24oZSxuLHIsaSxzLG8pe3M9c3x8bi5kYXRhVHlwZXNbMF0sbz1vfHx7fSxvW3NdPSEwO3ZhciB1LGE9ZVtzXSxmPTAsbD1hP2EubGVuZ3RoOjAsYz1lPT09U247Zm9yKDtmPGwmJihjfHwhdSk7ZisrKXU9YVtmXShuLHIsaSksdHlwZW9mIHU9PSJzdHJpbmciJiYoIWN8fG9bdV0/dT10OihuLmRhdGFUeXBlcy51bnNoaWZ0KHUpLHU9a24oZSxuLHIsaSx1LG8pKSk7cmV0dXJuKGN8fCF1KSYmIW9bIioiXSYmKHU9a24oZSxuLHIsaSwiKiIsbykpLHV9ZnVuY3Rpb24gTG4oZSxuKXt2YXIgcixpLHM9di5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihyIGluIG4pbltyXSE9PXQmJigoc1tyXT9lOml8fChpPXt9KSlbcl09bltyXSk7aSYmdi5leHRlbmQoITAsZSxpKX1mdW5jdGlvbiBBbihlLG4scil7dmFyIGkscyxvLHUsYT1lLmNvbnRlbnRzLGY9ZS5kYXRhVHlwZXMsbD1lLnJlc3BvbnNlRmllbGRzO2ZvcihzIGluIGwpcyBpbiByJiYobltsW3NdXT1yW3NdKTt3aGlsZShmWzBdPT09IioiKWYuc2hpZnQoKSxpPT09dCYmKGk9ZS5taW1lVHlwZXx8bi5nZXRSZXNwb25zZUhlYWRlcigiY29udGVudC10eXBlIikpO2lmKGkpZm9yKHMgaW4gYSlpZihhW3NdJiZhW3NdLnRlc3QoaSkpe2YudW5zaGlmdChzKTticmVha31pZihmWzBdaW4gcilvPWZbMF07ZWxzZXtmb3IocyBpbiByKXtpZighZlswXXx8ZS5jb252ZXJ0ZXJzW3MrIiAiK2ZbMF1dKXtvPXM7YnJlYWt9dXx8KHU9cyl9bz1vfHx1fWlmKG8pcmV0dXJuIG8hPT1mWzBdJiZmLnVuc2hpZnQobykscltvXX1mdW5jdGlvbiBPbihlLHQpe3ZhciBuLHIsaSxzLG89ZS5kYXRhVHlwZXMuc2xpY2UoKSx1PW9bMF0sYT17fSxmPTA7ZS5kYXRhRmlsdGVyJiYodD1lLmRhdGFGaWx0ZXIodCxlLmRhdGFUeXBlKSk7aWYob1sxXSlmb3IobiBpbiBlLmNvbnZlcnRlcnMpYVtuLnRvTG93ZXJDYXNlKCldPWUuY29udmVydGVyc1tuXTtmb3IoO2k9b1srK2ZdOylpZihpIT09IioiKXtpZih1IT09IioiJiZ1IT09aSl7bj1hW3UrIiAiK2ldfHxhWyIqICIraV07aWYoIW4pZm9yKHIgaW4gYSl7cz1yLnNwbGl0KCIgIik7aWYoc1sxXT09PWkpe249YVt1KyIgIitzWzBdXXx8YVsiKiAiK3NbMF1dO2lmKG4pe249PT0hMD9uPWFbcl06YVtyXSE9PSEwJiYoaT1zWzBdLG8uc3BsaWNlKGYtLSwwLGkpKTticmVha319fWlmKG4hPT0hMClpZihuJiZlWyJ0aHJvd3MiXSl0PW4odCk7ZWxzZSB0cnl7dD1uKHQpfWNhdGNoKGwpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOm4/bDoiTm8gY29udmVyc2lvbiBmcm9tICIrdSsiIHRvICIraX19fXU9aX1yZXR1cm57c3RhdGU6InN1Y2Nlc3MiLGRhdGE6dH19ZnVuY3Rpb24gRm4oKXt0cnl7cmV0dXJuIG5ldyBlLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKHQpe319ZnVuY3Rpb24gSW4oKXt0cnl7cmV0dXJuIG5ldyBlLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2godCl7fX1mdW5jdGlvbiAkbigpe3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cW49dH0sMCkscW49di5ub3coKX1mdW5jdGlvbiBKbihlLHQpe3YuZWFjaCh0LGZ1bmN0aW9uKHQsbil7dmFyIHI9KFZuW3RdfHxbXSkuY29uY2F0KFZuWyIqIl0pLGk9MCxzPXIubGVuZ3RoO2Zvcig7aTxzO2krKylpZihyW2ldLmNhbGwoZSx0LG4pKXJldHVybn0pfWZ1bmN0aW9uIEtuKGUsdCxuKXt2YXIgcixpPTAscz0wLG89WG4ubGVuZ3RoLHU9di5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSBhLmVsZW19KSxhPWZ1bmN0aW9uKCl7dmFyIHQ9cW58fCRuKCksbj1NYXRoLm1heCgwLGYuc3RhcnRUaW1lK2YuZHVyYXRpb24tdCkscj0xLShuL2YuZHVyYXRpb258fDApLGk9MCxzPWYudHdlZW5zLmxlbmd0aDtmb3IoO2k8cztpKyspZi50d2VlbnNbaV0ucnVuKHIpO3JldHVybiB1Lm5vdGlmeVdpdGgoZSxbZixyLG5dKSxyPDEmJnM/bjoodS5yZXNvbHZlV2l0aChlLFtmXSksITEpfSxmPXUucHJvbWlzZSh7ZWxlbTplLHByb3BzOnYuZXh0ZW5kKHt9LHQpLG9wdHM6di5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e319LG4pLG9yaWdpbmFsUHJvcGVydGllczp0LG9yaWdpbmFsT3B0aW9uczpuLHN0YXJ0VGltZTpxbnx8JG4oKSxkdXJhdGlvbjpuLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbih0LG4scil7dmFyIGk9di5Ud2VlbihlLGYub3B0cyx0LG4sZi5vcHRzLnNwZWNpYWxFYXNpbmdbdF18fGYub3B0cy5lYXNpbmcpO3JldHVybiBmLnR3ZWVucy5wdXNoKGkpLGl9LHN0b3A6ZnVuY3Rpb24odCl7dmFyIG49MCxyPXQ/Zi50d2VlbnMubGVuZ3RoOjA7Zm9yKDtuPHI7bisrKWYudHdlZW5zW25dLnJ1bigxKTtyZXR1cm4gdD91LnJlc29sdmVXaXRoKGUsW2YsdF0pOnUucmVqZWN0V2l0aChlLFtmLHRdKSx0aGlzfX0pLGw9Zi5wcm9wcztRbihsLGYub3B0cy5zcGVjaWFsRWFzaW5nKTtmb3IoO2k8bztpKyspe3I9WG5baV0uY2FsbChmLGUsbCxmLm9wdHMpO2lmKHIpcmV0dXJuIHJ9cmV0dXJuIEpuKGYsbCksdi5pc0Z1bmN0aW9uKGYub3B0cy5zdGFydCkmJmYub3B0cy5zdGFydC5jYWxsKGUsZiksdi5meC50aW1lcih2LmV4dGVuZChhLHthbmltOmYscXVldWU6Zi5vcHRzLnF1ZXVlLGVsZW06ZX0pKSxmLnByb2dyZXNzKGYub3B0cy5wcm9ncmVzcykuZG9uZShmLm9wdHMuZG9uZSxmLm9wdHMuY29tcGxldGUpLmZhaWwoZi5vcHRzLmZhaWwpLmFsd2F5cyhmLm9wdHMuYWx3YXlzKX1mdW5jdGlvbiBRbihlLHQpe3ZhciBuLHIsaSxzLG87Zm9yKG4gaW4gZSl7cj12LmNhbWVsQ2FzZShuKSxpPXRbcl0scz1lW25dLHYuaXNBcnJheShzKSYmKGk9c1sxXSxzPWVbbl09c1swXSksbiE9PXImJihlW3JdPXMsZGVsZXRlIGVbbl0pLG89di5jc3NIb29rc1tyXTtpZihvJiYiZXhwYW5kImluIG8pe3M9by5leHBhbmQocyksZGVsZXRlIGVbcl07Zm9yKG4gaW4gcyluIGluIGV8fChlW25dPXNbbl0sdFtuXT1pKX1lbHNlIHRbcl09aX19ZnVuY3Rpb24gR24oZSx0LG4pe3ZhciByLGkscyxvLHUsYSxmLGwsYz10aGlzLGg9ZS5zdHlsZSxwPXt9LGQ9W10sbT1lLm5vZGVUeXBlJiZHdChlKTtuLnF1ZXVlfHwoZj12Ll9xdWV1ZUhvb2tzKGUsImZ4IiksZi51bnF1ZXVlZD09bnVsbCYmKGYudW5xdWV1ZWQ9MCxsPWYuZW1wdHkuZmlyZSxmLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXtmLnVucXVldWVkfHxsKCl9KSxmLnVucXVldWVkKyssYy5hbHdheXMoZnVuY3Rpb24oKXtjLmFsd2F5cyhmdW5jdGlvbigpe2YudW5xdWV1ZWQtLSx2LnF1ZXVlKGUsImZ4IikubGVuZ3RofHxmLmVtcHR5LmZpcmUoKX0pfSkpLGUubm9kZVR5cGU9PT0xJiYoImhlaWdodCJpbiB0fHwid2lkdGgiaW4gdCkmJihuLm92ZXJmbG93PVtoLm92ZXJmbG93LGgub3ZlcmZsb3dYLGgub3ZlcmZsb3dZXSx2LmNzcyhlLCJkaXNwbGF5Iik9PT0iaW5saW5lIiYmdi5jc3MoZSwiZmxvYXQiKT09PSJub25lIiYmKCF2LnN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dHx8bm4oZS5ub2RlTmFtZSk9PT0iaW5saW5lIj9oLmRpc3BsYXk9ImlubGluZS1ibG9jayI6aC56b29tPTEpKSxuLm92ZXJmbG93JiYoaC5vdmVyZmxvdz0iaGlkZGVuIix2LnN1cHBvcnQuc2hyaW5rV3JhcEJsb2Nrc3x8Yy5kb25lKGZ1bmN0aW9uKCl7aC5vdmVyZmxvdz1uLm92ZXJmbG93WzBdLGgub3ZlcmZsb3dYPW4ub3ZlcmZsb3dbMV0saC5vdmVyZmxvd1k9bi5vdmVyZmxvd1syXX0pKTtmb3IociBpbiB0KXtzPXRbcl07aWYoVW4uZXhlYyhzKSl7ZGVsZXRlIHRbcl07aWYocz09PShtPyJoaWRlIjoic2hvdyIpKWNvbnRpbnVlO2QucHVzaChyKX19bz1kLmxlbmd0aDtpZihvKXt1PXYuX2RhdGEoZSwiZnhzaG93Iil8fHYuX2RhdGEoZSwiZnhzaG93Iix7fSksbT92KGUpLnNob3coKTpjLmRvbmUoZnVuY3Rpb24oKXt2KGUpLmhpZGUoKX0pLGMuZG9uZShmdW5jdGlvbigpe3ZhciB0O3YucmVtb3ZlRGF0YShlLCJmeHNob3ciLCEwKTtmb3IodCBpbiBwKXYuc3R5bGUoZSx0LHBbdF0pfSk7Zm9yKHI9MDtyPG87cisrKWk9ZFtyXSxhPWMuY3JlYXRlVHdlZW4oaSxtP3VbaV06MCkscFtpXT11W2ldfHx2LnN0eWxlKGUsaSksaSBpbiB1fHwodVtpXT1hLnN0YXJ0LG0mJihhLmVuZD1hLnN0YXJ0LGEuc3RhcnQ9aT09PSJ3aWR0aCJ8fGk9PT0iaGVpZ2h0Ij8xOjApKX19ZnVuY3Rpb24gWW4oZSx0LG4scixpKXtyZXR1cm4gbmV3IFluLnByb3RvdHlwZS5pbml0KGUsdCxuLHIsaSl9ZnVuY3Rpb24gWm4oZSx0KXt2YXIgbixyPXtoZWlnaHQ6ZX0saT0wO3Q9dD8xOjA7Zm9yKDtpPDQ7aSs9Mi10KW49JHRbaV0sclsibWFyZ2luIituXT1yWyJwYWRkaW5nIituXT1lO3JldHVybiB0JiYoci5vcGFjaXR5PXIud2lkdGg9ZSkscn1mdW5jdGlvbiB0cihlKXtyZXR1cm4gdi5pc1dpbmRvdyhlKT9lOmUubm9kZVR5cGU9PT05P2UuZGVmYXVsdFZpZXd8fGUucGFyZW50V2luZG93OiExfXZhciBuLHIsaT1lLmRvY3VtZW50LHM9ZS5sb2NhdGlvbixvPWUubmF2aWdhdG9yLHU9ZS5qUXVlcnksYT1lLiQsZj1BcnJheS5wcm90b3R5cGUucHVzaCxsPUFycmF5LnByb3RvdHlwZS5zbGljZSxjPUFycmF5LnByb3RvdHlwZS5pbmRleE9mLGg9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxwPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksZD1TdHJpbmcucHJvdG90eXBlLnRyaW0sdj1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgdi5mbi5pbml0KGUsdCxuKX0sbT0vW1wtK10/KD86XGQqXC58KVxkKyg/OltlRV1bXC0rXT9cZCt8KS8uc291cmNlLGc9L1xTLyx5PS9ccysvLGI9L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLHc9L14oPzpbXiM8XSooPFtcd1xXXSs+KVtePl0qJHwjKFtcd1wtXSopJCkvLEU9L148KFx3KylccypcLz8+KD86PFwvXDE+fCkkLyxTPS9eW1xdLDp7fVxzXSokLyx4PS8oPzpefDp8LCkoPzpccypcWykrL2csVD0vXFwoPzpbIlxcXC9iZm5ydF18dVtcZGEtZkEtRl17NH0pL2csTj0vIlteIlxcXHJcbl0qInx0cnVlfGZhbHNlfG51bGx8LT8oPzpcZFxkKlwufClcZCsoPzpbZUVdW1wtK10/XGQrfCkvZyxDPS9eLW1zLS8saz0vLShbXGRhLXpdKS9naSxMPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKHQrIiIpLnRvVXBwZXJDYXNlKCl9LEE9ZnVuY3Rpb24oKXtpLmFkZEV2ZW50TGlzdGVuZXI/KGkucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQSwhMSksdi5yZWFkeSgpKTppLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiJiYoaS5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixBKSx2LnJlYWR5KCkpfSxPPXt9O3YuZm49di5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnYsaW5pdDpmdW5jdGlvbihlLG4scil7dmFyIHMsbyx1LGE7aWYoIWUpcmV0dXJuIHRoaXM7aWYoZS5ub2RlVHlwZSlyZXR1cm4gdGhpcy5jb250ZXh0PXRoaXNbMF09ZSx0aGlzLmxlbmd0aD0xLHRoaXM7aWYodHlwZW9mIGU9PSJzdHJpbmciKXtlLmNoYXJBdCgwKT09PSI8IiYmZS5jaGFyQXQoZS5sZW5ndGgtMSk9PT0iPiImJmUubGVuZ3RoPj0zP3M9W251bGwsZSxudWxsXTpzPXcuZXhlYyhlKTtpZihzJiYoc1sxXXx8IW4pKXtpZihzWzFdKXJldHVybiBuPW4gaW5zdGFuY2VvZiB2P25bMF06bixhPW4mJm4ubm9kZVR5cGU/bi5vd25lckRvY3VtZW50fHxuOmksZT12LnBhcnNlSFRNTChzWzFdLGEsITApLEUudGVzdChzWzFdKSYmdi5pc1BsYWluT2JqZWN0KG4pJiZ0aGlzLmF0dHIuY2FsbChlLG4sITApLHYubWVyZ2UodGhpcyxlKTtvPWkuZ2V0RWxlbWVudEJ5SWQoc1syXSk7aWYobyYmby5wYXJlbnROb2RlKXtpZihvLmlkIT09c1syXSlyZXR1cm4gci5maW5kKGUpO3RoaXMubGVuZ3RoPTEsdGhpc1swXT1vfXJldHVybiB0aGlzLmNvbnRleHQ9aSx0aGlzLnNlbGVjdG9yPWUsdGhpc31yZXR1cm4hbnx8bi5qcXVlcnk/KG58fHIpLmZpbmQoZSk6dGhpcy5jb25zdHJ1Y3RvcihuKS5maW5kKGUpfXJldHVybiB2LmlzRnVuY3Rpb24oZSk/ci5yZWFkeShlKTooZS5zZWxlY3RvciE9PXQmJih0aGlzLnNlbGVjdG9yPWUuc2VsZWN0b3IsdGhpcy5jb250ZXh0PWUuY29udGV4dCksdi5tYWtlQXJyYXkoZSx0aGlzKSl9LHNlbGVjdG9yOiIiLGpxdWVyeToiMS44LjIiLGxlbmd0aDowLHNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gbC5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PW51bGw/dGhpcy50b0FycmF5KCk6ZTwwP3RoaXNbdGhpcy5sZW5ndGgrZV06dGhpc1tlXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj12Lm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxlKTtyZXR1cm4gci5wcmV2T2JqZWN0PXRoaXMsci5jb250ZXh0PXRoaXMuY29udGV4dCx0PT09ImZpbmQiP3Iuc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisodGhpcy5zZWxlY3Rvcj8iICI6IiIpK246dCYmKHIuc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisiLiIrdCsiKCIrbisiKSIpLHJ9LGVhY2g6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdi5lYWNoKHRoaXMsZSx0KX0scmVhZHk6ZnVuY3Rpb24oZSl7cmV0dXJuIHYucmVhZHkucHJvbWlzZSgpLmRvbmUoZSksdGhpc30sZXE6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9K2UsZT09PS0xP3RoaXMuc2xpY2UoZSk6dGhpcy5zbGljZShlLGUrMSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGwuYXBwbHkodGhpcyxhcmd1bWVudHMpLCJzbGljZSIsbC5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX0sbWFwOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayh2Lm1hcCh0aGlzLGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuY2FsbCh0LG4sdCl9KSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IobnVsbCl9LHB1c2g6Zixzb3J0OltdLnNvcnQsc3BsaWNlOltdLnNwbGljZX0sdi5mbi5pbml0LnByb3RvdHlwZT12LmZuLHYuZXh0ZW5kPXYuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGUsbixyLGkscyxvLHU9YXJndW1lbnRzWzBdfHx7fSxhPTEsZj1hcmd1bWVudHMubGVuZ3RoLGw9ITE7dHlwZW9mIHU9PSJib29sZWFuIiYmKGw9dSx1PWFyZ3VtZW50c1sxXXx8e30sYT0yKSx0eXBlb2YgdSE9Im9iamVjdCImJiF2LmlzRnVuY3Rpb24odSkmJih1PXt9KSxmPT09YSYmKHU9dGhpcywtLWEpO2Zvcig7YTxmO2ErKylpZigoZT1hcmd1bWVudHNbYV0pIT1udWxsKWZvcihuIGluIGUpe3I9dVtuXSxpPWVbbl07aWYodT09PWkpY29udGludWU7bCYmaSYmKHYuaXNQbGFpbk9iamVjdChpKXx8KHM9di5pc0FycmF5KGkpKSk/KHM/KHM9ITEsbz1yJiZ2LmlzQXJyYXkocik/cjpbXSk6bz1yJiZ2LmlzUGxhaW5PYmplY3Qocik/cjp7fSx1W25dPXYuZXh0ZW5kKGwsbyxpKSk6aSE9PXQmJih1W25dPWkpfXJldHVybiB1fSx2LmV4dGVuZCh7bm9Db25mbGljdDpmdW5jdGlvbih0KXtyZXR1cm4gZS4kPT09diYmKGUuJD1hKSx0JiZlLmpRdWVyeT09PXYmJihlLmpRdWVyeT11KSx2fSxpc1JlYWR5OiExLHJlYWR5V2FpdDoxLGhvbGRSZWFkeTpmdW5jdGlvbihlKXtlP3YucmVhZHlXYWl0Kys6di5yZWFkeSghMCl9LHJlYWR5OmZ1bmN0aW9uKGUpe2lmKGU9PT0hMD8tLXYucmVhZHlXYWl0OnYuaXNSZWFkeSlyZXR1cm47aWYoIWkuYm9keSlyZXR1cm4gc2V0VGltZW91dCh2LnJlYWR5LDEpO3YuaXNSZWFkeT0hMDtpZihlIT09ITAmJi0tdi5yZWFkeVdhaXQ+MClyZXR1cm47ci5yZXNvbHZlV2l0aChpLFt2XSksdi5mbi50cmlnZ2VyJiZ2KGkpLnRyaWdnZXIoInJlYWR5Iikub2ZmKCJyZWFkeSIpfSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGUpe3JldHVybiB2LnR5cGUoZSk9PT0iZnVuY3Rpb24ifSxpc0FycmF5OkFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiB2LnR5cGUoZSk9PT0iYXJyYXkifSxpc1dpbmRvdzpmdW5jdGlvbihlKXtyZXR1cm4gZSE9bnVsbCYmZT09ZS53aW5kb3d9LGlzTnVtZXJpYzpmdW5jdGlvbihlKXtyZXR1cm4haXNOYU4ocGFyc2VGbG9hdChlKSkmJmlzRmluaXRlKGUpfSx0eXBlOmZ1bmN0aW9uKGUpe3JldHVybiBlPT1udWxsP1N0cmluZyhlKTpPW2guY2FsbChlKV18fCJvYmplY3QifSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGUpe2lmKCFlfHx2LnR5cGUoZSkhPT0ib2JqZWN0Inx8ZS5ub2RlVHlwZXx8di5pc1dpbmRvdyhlKSlyZXR1cm4hMTt0cnl7aWYoZS5jb25zdHJ1Y3RvciYmIXAuY2FsbChlLCJjb25zdHJ1Y3RvciIpJiYhcC5jYWxsKGUuY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIikpcmV0dXJuITF9Y2F0Y2gobil7cmV0dXJuITF9dmFyIHI7Zm9yKHIgaW4gZSk7cmV0dXJuIHI9PT10fHxwLmNhbGwoZSxyKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihlKXt2YXIgdDtmb3IodCBpbiBlKXJldHVybiExO3JldHVybiEwfSxlcnJvcjpmdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoZSl9LHBhcnNlSFRNTDpmdW5jdGlvbihlLHQsbil7dmFyIHI7cmV0dXJuIWV8fHR5cGVvZiBlIT0ic3RyaW5nIj9udWxsOih0eXBlb2YgdD09ImJvb2xlYW4iJiYobj10LHQ9MCksdD10fHxpLChyPUUuZXhlYyhlKSk/W3QuY3JlYXRlRWxlbWVudChyWzFdKV06KHI9di5idWlsZEZyYWdtZW50KFtlXSx0LG4/bnVsbDpbXSksdi5tZXJnZShbXSwoci5jYWNoZWFibGU/di5jbG9uZShyLmZyYWdtZW50KTpyLmZyYWdtZW50KS5jaGlsZE5vZGVzKSkpfSxwYXJzZUpTT046ZnVuY3Rpb24odCl7aWYoIXR8fHR5cGVvZiB0IT0ic3RyaW5nIilyZXR1cm4gbnVsbDt0PXYudHJpbSh0KTtpZihlLkpTT04mJmUuSlNPTi5wYXJzZSlyZXR1cm4gZS5KU09OLnBhcnNlKHQpO2lmKFMudGVzdCh0LnJlcGxhY2UoVCwiQCIpLnJlcGxhY2UoTiwiXSIpLnJlcGxhY2UoeCwiIikpKXJldHVybihuZXcgRnVuY3Rpb24oInJldHVybiAiK3QpKSgpO3YuZXJyb3IoIkludmFsaWQgSlNPTjogIit0KX0scGFyc2VYTUw6ZnVuY3Rpb24obil7dmFyIHIsaTtpZighbnx8dHlwZW9mIG4hPSJzdHJpbmciKXJldHVybiBudWxsO3RyeXtlLkRPTVBhcnNlcj8oaT1uZXcgRE9NUGFyc2VyLHI9aS5wYXJzZUZyb21TdHJpbmcobiwidGV4dC94bWwiKSk6KHI9bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxyLmFzeW5jPSJmYWxzZSIsci5sb2FkWE1MKG4pKX1jYXRjaChzKXtyPXR9cmV0dXJuKCFyfHwhci5kb2N1bWVudEVsZW1lbnR8fHIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RoKSYmdi5lcnJvcigiSW52YWxpZCBYTUw6ICIrbikscn0sbm9vcDpmdW5jdGlvbigpe30sZ2xvYmFsRXZhbDpmdW5jdGlvbih0KXt0JiZnLnRlc3QodCkmJihlLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKHQpe2UuZXZhbC5jYWxsKGUsdCl9KSh0KX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoQywibXMtIikucmVwbGFjZShrLEwpfSxub2RlTmFtZTpmdW5jdGlvbihlLHQpe3JldHVybiBlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10LnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpLHM9MCxvPWUubGVuZ3RoLHU9bz09PXR8fHYuaXNGdW5jdGlvbihlKTtpZihyKXtpZih1KXtmb3IoaSBpbiBlKWlmKG4uYXBwbHkoZVtpXSxyKT09PSExKWJyZWFrfWVsc2UgZm9yKDtzPG87KWlmKG4uYXBwbHkoZVtzKytdLHIpPT09ITEpYnJlYWt9ZWxzZSBpZih1KXtmb3IoaSBpbiBlKWlmKG4uY2FsbChlW2ldLGksZVtpXSk9PT0hMSlicmVha31lbHNlIGZvcig7czxvOylpZihuLmNhbGwoZVtzXSxzLGVbcysrXSk9PT0hMSlicmVhaztyZXR1cm4gZX0sdHJpbTpkJiYhZC5jYWxsKCLvu7/CoCIpP2Z1bmN0aW9uKGUpe3JldHVybiBlPT1udWxsPyIiOmQuY2FsbChlKX06ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PW51bGw/IiI6KGUrIiIpLnJlcGxhY2UoYiwiIil9LG1ha2VBcnJheTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9dHx8W107cmV0dXJuIGUhPW51bGwmJihuPXYudHlwZShlKSxlLmxlbmd0aD09bnVsbHx8bj09PSJzdHJpbmcifHxuPT09ImZ1bmN0aW9uInx8bj09PSJyZWdleHAifHx2LmlzV2luZG93KGUpP2YuY2FsbChyLGUpOnYubWVyZ2UocixlKSkscn0saW5BcnJheTpmdW5jdGlvbihlLHQsbil7dmFyIHI7aWYodCl7aWYoYylyZXR1cm4gYy5jYWxsKHQsZSxuKTtyPXQubGVuZ3RoLG49bj9uPDA/TWF0aC5tYXgoMCxyK24pOm46MDtmb3IoO248cjtuKyspaWYobiBpbiB0JiZ0W25dPT09ZSlyZXR1cm4gbn1yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oZSxuKXt2YXIgcj1uLmxlbmd0aCxpPWUubGVuZ3RoLHM9MDtpZih0eXBlb2Ygcj09Im51bWJlciIpZm9yKDtzPHI7cysrKWVbaSsrXT1uW3NdO2Vsc2Ugd2hpbGUobltzXSE9PXQpZVtpKytdPW5bcysrXTtyZXR1cm4gZS5sZW5ndGg9aSxlfSxncmVwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPVtdLHM9MCxvPWUubGVuZ3RoO249ISFuO2Zvcig7czxvO3MrKylyPSEhdChlW3NdLHMpLG4hPT1yJiZpLnB1c2goZVtzXSk7cmV0dXJuIGl9LG1hcDpmdW5jdGlvbihlLG4scil7dmFyIGkscyxvPVtdLHU9MCxhPWUubGVuZ3RoLGY9ZSBpbnN0YW5jZW9mIHZ8fGEhPT10JiZ0eXBlb2YgYT09Im51bWJlciImJihhPjAmJmVbMF0mJmVbYS0xXXx8YT09PTB8fHYuaXNBcnJheShlKSk7aWYoZilmb3IoO3U8YTt1KyspaT1uKGVbdV0sdSxyKSxpIT1udWxsJiYob1tvLmxlbmd0aF09aSk7ZWxzZSBmb3IocyBpbiBlKWk9bihlW3NdLHMsciksaSE9bnVsbCYmKG9bby5sZW5ndGhdPWkpO3JldHVybiBvLmNvbmNhdC5hcHBseShbXSxvKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGUsbil7dmFyIHIsaSxzO3JldHVybiB0eXBlb2Ygbj09InN0cmluZyImJihyPWVbbl0sbj1lLGU9ciksdi5pc0Z1bmN0aW9uKGUpPyhpPWwuY2FsbChhcmd1bWVudHMsMikscz1mdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KG4saS5jb25jYXQobC5jYWxsKGFyZ3VtZW50cykpKX0scy5ndWlkPWUuZ3VpZD1lLmd1aWR8fHYuZ3VpZCsrLHMpOnR9LGFjY2VzczpmdW5jdGlvbihlLG4scixpLHMsbyx1KXt2YXIgYSxmPXI9PW51bGwsbD0wLGM9ZS5sZW5ndGg7aWYociYmdHlwZW9mIHI9PSJvYmplY3QiKXtmb3IobCBpbiByKXYuYWNjZXNzKGUsbixsLHJbbF0sMSxvLGkpO3M9MX1lbHNlIGlmKGkhPT10KXthPXU9PT10JiZ2LmlzRnVuY3Rpb24oaSksZiYmKGE/KGE9bixuPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gYS5jYWxsKHYoZSksbil9KToobi5jYWxsKGUsaSksbj1udWxsKSk7aWYobilmb3IoO2w8YztsKyspbihlW2xdLHIsYT9pLmNhbGwoZVtsXSxsLG4oZVtsXSxyKSk6aSx1KTtzPTF9cmV0dXJuIHM/ZTpmP24uY2FsbChlKTpjP24oZVswXSxyKTpvfSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX19KSx2LnJlYWR5LnByb21pc2U9ZnVuY3Rpb24odCl7aWYoIXIpe3I9di5EZWZlcnJlZCgpO2lmKGkucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpc2V0VGltZW91dCh2LnJlYWR5LDEpO2Vsc2UgaWYoaS5hZGRFdmVudExpc3RlbmVyKWkuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQSwhMSksZS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIix2LnJlYWR5LCExKTtlbHNle2kuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsQSksZS5hdHRhY2hFdmVudCgib25sb2FkIix2LnJlYWR5KTt2YXIgbj0hMTt0cnl7bj1lLmZyYW1lRWxlbWVudD09bnVsbCYmaS5kb2N1bWVudEVsZW1lbnR9Y2F0Y2gocyl7fW4mJm4uZG9TY3JvbGwmJmZ1bmN0aW9uIG8oKXtpZighdi5pc1JlYWR5KXt0cnl7bi5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGUpe3JldHVybiBzZXRUaW1lb3V0KG8sNTApfXYucmVhZHkoKX19KCl9fXJldHVybiByLnByb21pc2UodCl9LHYuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe09bIltvYmplY3QgIit0KyJdIl09dC50b0xvd2VyQ2FzZSgpfSksbj12KGkpO3ZhciBNPXt9O3YuQ2FsbGJhY2tzPWZ1bmN0aW9uKGUpe2U9dHlwZW9mIGU9PSJzdHJpbmciP01bZV18fF8oZSk6di5leHRlbmQoe30sZSk7dmFyIG4scixpLHMsbyx1LGE9W10sZj0hZS5vbmNlJiZbXSxsPWZ1bmN0aW9uKHQpe249ZS5tZW1vcnkmJnQscj0hMCx1PXN8fDAscz0wLG89YS5sZW5ndGgsaT0hMDtmb3IoO2EmJnU8bzt1KyspaWYoYVt1XS5hcHBseSh0WzBdLHRbMV0pPT09ITEmJmUuc3RvcE9uRmFsc2Upe249ITE7YnJlYWt9aT0hMSxhJiYoZj9mLmxlbmd0aCYmbChmLnNoaWZ0KCkpOm4/YT1bXTpjLmRpc2FibGUoKSl9LGM9e2FkZDpmdW5jdGlvbigpe2lmKGEpe3ZhciB0PWEubGVuZ3RoOyhmdW5jdGlvbiByKHQpe3YuZWFjaCh0LGZ1bmN0aW9uKHQsbil7dmFyIGk9di50eXBlKG4pO2k9PT0iZnVuY3Rpb24iJiYoIWUudW5pcXVlfHwhYy5oYXMobikpP2EucHVzaChuKTpuJiZuLmxlbmd0aCYmaSE9PSJzdHJpbmciJiZyKG4pfSl9KShhcmd1bWVudHMpLGk/bz1hLmxlbmd0aDpuJiYocz10LGwobikpfXJldHVybiB0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gYSYmdi5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbihlLHQpe3ZhciBuO3doaWxlKChuPXYuaW5BcnJheSh0LGEsbikpPi0xKWEuc3BsaWNlKG4sMSksaSYmKG48PW8mJm8tLSxuPD11JiZ1LS0pfSksdGhpc30saGFzOmZ1bmN0aW9uKGUpe3JldHVybiB2LmluQXJyYXkoZSxhKT4tMX0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gYT1bXSx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGE9Zj1uPXQsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hYX0sbG9jazpmdW5jdGlvbigpe3JldHVybiBmPXQsbnx8Yy5kaXNhYmxlKCksdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuIWZ9LGZpcmVXaXRoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ9dHx8W10sdD1bZSx0LnNsaWNlP3Quc2xpY2UoKTp0XSxhJiYoIXJ8fGYpJiYoaT9mLnB1c2godCk6bCh0KSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBjLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhcn19O3JldHVybiBjfSx2LmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9W1sicmVzb2x2ZSIsImRvbmUiLHYuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsdi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlamVjdGVkIl0sWyJub3RpZnkiLCJwcm9ncmVzcyIsdi5DYWxsYmFja3MoIm1lbW9yeSIpXV0sbj0icGVuZGluZyIscj17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gbn0sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGkuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSx0aGVuOmZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzO3JldHVybiB2LkRlZmVycmVkKGZ1bmN0aW9uKG4pe3YuZWFjaCh0LGZ1bmN0aW9uKHQscil7dmFyIHM9clswXSxvPWVbdF07aVtyWzFdXSh2LmlzRnVuY3Rpb24obyk/ZnVuY3Rpb24oKXt2YXIgZT1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtlJiZ2LmlzRnVuY3Rpb24oZS5wcm9taXNlKT9lLnByb21pc2UoKS5kb25lKG4ucmVzb2x2ZSkuZmFpbChuLnJlamVjdCkucHJvZ3Jlc3Mobi5ub3RpZnkpOm5bcysiV2l0aCJdKHRoaXM9PT1pP246dGhpcyxbZV0pfTpuW3NdKX0pLGU9bnVsbH0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihlKXtyZXR1cm4gZSE9bnVsbD92LmV4dGVuZChlLHIpOnJ9fSxpPXt9O3JldHVybiByLnBpcGU9ci50aGVuLHYuZWFjaCh0LGZ1bmN0aW9uKGUscyl7dmFyIG89c1syXSx1PXNbM107cltzWzFdXT1vLmFkZCx1JiZvLmFkZChmdW5jdGlvbigpe249dX0sdFtlXjFdWzJdLmRpc2FibGUsdFsyXVsyXS5sb2NrKSxpW3NbMF1dPW8uZmlyZSxpW3NbMF0rIldpdGgiXT1vLmZpcmVXaXRofSksci5wcm9taXNlKGkpLGUmJmUuY2FsbChpLGkpLGl9LHdoZW46ZnVuY3Rpb24oZSl7dmFyIHQ9MCxuPWwuY2FsbChhcmd1bWVudHMpLHI9bi5sZW5ndGgsaT1yIT09MXx8ZSYmdi5pc0Z1bmN0aW9uKGUucHJvbWlzZSk/cjowLHM9aT09PTE/ZTp2LkRlZmVycmVkKCksbz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKHIpe3RbZV09dGhpcyxuW2VdPWFyZ3VtZW50cy5sZW5ndGg+MT9sLmNhbGwoYXJndW1lbnRzKTpyLG49PT11P3Mubm90aWZ5V2l0aCh0LG4pOi0taXx8cy5yZXNvbHZlV2l0aCh0LG4pfX0sdSxhLGY7aWYocj4xKXt1PW5ldyBBcnJheShyKSxhPW5ldyBBcnJheShyKSxmPW5ldyBBcnJheShyKTtmb3IoO3Q8cjt0Kyspblt0XSYmdi5pc0Z1bmN0aW9uKG5bdF0ucHJvbWlzZSk/blt0XS5wcm9taXNlKCkuZG9uZShvKHQsZixuKSkuZmFpbChzLnJlamVjdCkucHJvZ3Jlc3Mobyh0LGEsdSkpOi0taX1yZXR1cm4gaXx8cy5yZXNvbHZlV2l0aChmLG4pLHMucHJvbWlzZSgpfX0pLHYuc3VwcG9ydD1mdW5jdGlvbigpe3ZhciB0LG4scixzLG8sdSxhLGYsbCxjLGgscD1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3Auc2V0QXR0cmlidXRlKCJjbGFzc05hbWUiLCJ0IikscC5pbm5lckhUTUw9IiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsbj1wLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikscj1wLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF0sci5zdHlsZS5jc3NUZXh0PSJ0b3A6MXB4O2Zsb2F0OmxlZnQ7b3BhY2l0eTouNSI7aWYoIW58fCFuLmxlbmd0aClyZXR1cm57fTtzPWkuY3JlYXRlRWxlbWVudCgic2VsZWN0Iiksbz1zLmFwcGVuZENoaWxkKGkuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLHU9cC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKVswXSx0PXtsZWFkaW5nV2hpdGVzcGFjZTpwLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT0zLHRib2R5OiFwLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpLmxlbmd0aCxodG1sU2VyaWFsaXplOiEhcC5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxzdHlsZTovdG9wLy50ZXN0KHIuZ2V0QXR0cmlidXRlKCJzdHlsZSIpKSxocmVmTm9ybWFsaXplZDpyLmdldEF0dHJpYnV0ZSgiaHJlZiIpPT09Ii9hIixvcGFjaXR5Oi9eMC41Ly50ZXN0KHIuc3R5bGUub3BhY2l0eSksY3NzRmxvYXQ6ISFyLnN0eWxlLmNzc0Zsb2F0LGNoZWNrT246dS52YWx1ZT09PSJvbiIsb3B0U2VsZWN0ZWQ6by5zZWxlY3RlZCxnZXRTZXRBdHRyaWJ1dGU6cC5jbGFzc05hbWUhPT0idCIsZW5jdHlwZTohIWkuY3JlYXRlRWxlbWVudCgiZm9ybSIpLmVuY3R5cGUsaHRtbDVDbG9uZTppLmNyZWF0ZUVsZW1lbnQoIm5hdiIpLmNsb25lTm9kZSghMCkub3V0ZXJIVE1MIT09Ijw6bmF2PjwvOm5hdj4iLGJveE1vZGVsOmkuY29tcGF0TW9kZT09PSJDU1MxQ29tcGF0IixzdWJtaXRCdWJibGVzOiEwLGNoYW5nZUJ1YmJsZXM6ITAsZm9jdXNpbkJ1YmJsZXM6ITEsZGVsZXRlRXhwYW5kbzohMCxub0Nsb25lRXZlbnQ6ITAsaW5saW5lQmxvY2tOZWVkc0xheW91dDohMSxzaHJpbmtXcmFwQmxvY2tzOiExLHJlbGlhYmxlTWFyZ2luUmlnaHQ6ITAsYm94U2l6aW5nUmVsaWFibGU6ITAscGl4ZWxQb3NpdGlvbjohMX0sdS5jaGVja2VkPSEwLHQubm9DbG9uZUNoZWNrZWQ9dS5jbG9uZU5vZGUoITApLmNoZWNrZWQscy5kaXNhYmxlZD0hMCx0Lm9wdERpc2FibGVkPSFvLmRpc2FibGVkO3RyeXtkZWxldGUgcC50ZXN0fWNhdGNoKGQpe3QuZGVsZXRlRXhwYW5kbz0hMX0hcC5hZGRFdmVudExpc3RlbmVyJiZwLmF0dGFjaEV2ZW50JiZwLmZpcmVFdmVudCYmKHAuYXR0YWNoRXZlbnQoIm9uY2xpY2siLGg9ZnVuY3Rpb24oKXt0Lm5vQ2xvbmVFdmVudD0hMX0pLHAuY2xvbmVOb2RlKCEwKS5maXJlRXZlbnQoIm9uY2xpY2siKSxwLmRldGFjaEV2ZW50KCJvbmNsaWNrIixoKSksdT1pLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksdS52YWx1ZT0idCIsdS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLHQucmFkaW9WYWx1ZT11LnZhbHVlPT09InQiLHUuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpLHUuc2V0QXR0cmlidXRlKCJuYW1lIiwidCIpLHAuYXBwZW5kQ2hpbGQodSksYT1pLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxhLmFwcGVuZENoaWxkKHAubGFzdENoaWxkKSx0LmNoZWNrQ2xvbmU9YS5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsdC5hcHBlbmRDaGVja2VkPXUuY2hlY2tlZCxhLnJlbW92ZUNoaWxkKHUpLGEuYXBwZW5kQ2hpbGQocCk7aWYocC5hdHRhY2hFdmVudClmb3IobCBpbntzdWJtaXQ6ITAsY2hhbmdlOiEwLGZvY3VzaW46ITB9KWY9Im9uIitsLGM9ZiBpbiBwLGN8fChwLnNldEF0dHJpYnV0ZShmLCJyZXR1cm47IiksYz10eXBlb2YgcFtmXT09ImZ1bmN0aW9uIiksdFtsKyJCdWJibGVzIl09YztyZXR1cm4gdihmdW5jdGlvbigpe3ZhciBuLHIscyxvLHU9InBhZGRpbmc6MDttYXJnaW46MDtib3JkZXI6MDtkaXNwbGF5OmJsb2NrO292ZXJmbG93OmhpZGRlbjsiLGE9aS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdO2lmKCFhKXJldHVybjtuPWkuY3JlYXRlRWxlbWVudCgiZGl2Iiksbi5zdHlsZS5jc3NUZXh0PSJ2aXNpYmlsaXR5OmhpZGRlbjtib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3Bvc2l0aW9uOnN0YXRpYzt0b3A6MDttYXJnaW4tdG9wOjFweCIsYS5pbnNlcnRCZWZvcmUobixhLmZpcnN0Q2hpbGQpLHI9aS5jcmVhdGVFbGVtZW50KCJkaXYiKSxuLmFwcGVuZENoaWxkKHIpLHIuaW5uZXJIVE1MPSI8dGFibGU+PHRyPjx0ZD48L3RkPjx0ZD50PC90ZD48L3RyPjwvdGFibGU+IixzPXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIiksc1swXS5zdHlsZS5jc3NUZXh0PSJwYWRkaW5nOjA7bWFyZ2luOjA7Ym9yZGVyOjA7ZGlzcGxheTpub25lIixjPXNbMF0ub2Zmc2V0SGVpZ2h0PT09MCxzWzBdLnN0eWxlLmRpc3BsYXk9IiIsc1sxXS5zdHlsZS5kaXNwbGF5PSJub25lIix0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cz1jJiZzWzBdLm9mZnNldEhlaWdodD09PTAsci5pbm5lckhUTUw9IiIsci5zdHlsZS5jc3NUZXh0PSJib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzoxcHg7Ym9yZGVyOjFweDtkaXNwbGF5OmJsb2NrO3dpZHRoOjRweDttYXJnaW4tdG9wOjElO3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxJTsiLHQuYm94U2l6aW5nPXIub2Zmc2V0V2lkdGg9PT00LHQuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQ9YS5vZmZzZXRUb3AhPT0xLGUuZ2V0Q29tcHV0ZWRTdHlsZSYmKHQucGl4ZWxQb3NpdGlvbj0oZS5nZXRDb21wdXRlZFN0eWxlKHIsbnVsbCl8fHt9KS50b3AhPT0iMSUiLHQuYm94U2l6aW5nUmVsaWFibGU9KGUuZ2V0Q29tcHV0ZWRTdHlsZShyLG51bGwpfHx7d2lkdGg6IjRweCJ9KS53aWR0aD09PSI0cHgiLG89aS5jcmVhdGVFbGVtZW50KCJkaXYiKSxvLnN0eWxlLmNzc1RleHQ9ci5zdHlsZS5jc3NUZXh0PXUsby5zdHlsZS5tYXJnaW5SaWdodD1vLnN0eWxlLndpZHRoPSIwIixyLnN0eWxlLndpZHRoPSIxcHgiLHIuYXBwZW5kQ2hpbGQobyksdC5yZWxpYWJsZU1hcmdpblJpZ2h0PSFwYXJzZUZsb2F0KChlLmdldENvbXB1dGVkU3R5bGUobyxudWxsKXx8e30pLm1hcmdpblJpZ2h0KSksdHlwZW9mIHIuc3R5bGUuem9vbSE9InVuZGVmaW5lZCImJihyLmlubmVySFRNTD0iIixyLnN0eWxlLmNzc1RleHQ9dSsid2lkdGg6MXB4O3BhZGRpbmc6MXB4O2Rpc3BsYXk6aW5saW5lO3pvb206MSIsdC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0PXIub2Zmc2V0V2lkdGg9PT0zLHIuc3R5bGUuZGlzcGxheT0iYmxvY2siLHIuc3R5bGUub3ZlcmZsb3c9InZpc2libGUiLHIuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiIsci5maXJzdENoaWxkLnN0eWxlLndpZHRoPSI1cHgiLHQuc2hyaW5rV3JhcEJsb2Nrcz1yLm9mZnNldFdpZHRoIT09MyxuLnN0eWxlLnpvb209MSksYS5yZW1vdmVDaGlsZChuKSxuPXI9cz1vPW51bGx9KSxhLnJlbW92ZUNoaWxkKHApLG49cj1zPW89dT1hPXA9bnVsbCx0fSgpO3ZhciBEPS8oPzpce1tcc1xTXSpcfXxcW1tcc1xTXSpcXSkkLyxQPS8oW0EtWl0pL2c7di5leHRlbmQoe2NhY2hlOnt9LGRlbGV0ZWRJZHM6W10sdXVpZDowLGV4cGFuZG86ImpRdWVyeSIrKHYuZm4uanF1ZXJ5K01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLG5vRGF0YTp7ZW1iZWQ6ITAsb2JqZWN0OiJjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDAiLGFwcGxldDohMH0saGFzRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gZT1lLm5vZGVUeXBlP3YuY2FjaGVbZVt2LmV4cGFuZG9dXTplW3YuZXhwYW5kb10sISFlJiYhQihlKX0sZGF0YTpmdW5jdGlvbihlLG4scixpKXtpZighdi5hY2NlcHREYXRhKGUpKXJldHVybjt2YXIgcyxvLHU9di5leHBhbmRvLGE9dHlwZW9mIG49PSJzdHJpbmciLGY9ZS5ub2RlVHlwZSxsPWY/di5jYWNoZTplLGM9Zj9lW3VdOmVbdV0mJnU7aWYoKCFjfHwhbFtjXXx8IWkmJiFsW2NdLmRhdGEpJiZhJiZyPT09dClyZXR1cm47Y3x8KGY/ZVt1XT1jPXYuZGVsZXRlZElkcy5wb3AoKXx8di5ndWlkKys6Yz11KSxsW2NdfHwobFtjXT17fSxmfHwobFtjXS50b0pTT049di5ub29wKSk7aWYodHlwZW9mIG49PSJvYmplY3QifHx0eXBlb2Ygbj09ImZ1bmN0aW9uIilpP2xbY109di5leHRlbmQobFtjXSxuKTpsW2NdLmRhdGE9di5leHRlbmQobFtjXS5kYXRhLG4pO3JldHVybiBzPWxbY10saXx8KHMuZGF0YXx8KHMuZGF0YT17fSkscz1zLmRhdGEpLHIhPT10JiYoc1t2LmNhbWVsQ2FzZShuKV09ciksYT8obz1zW25dLG89PW51bGwmJihvPXNbdi5jYW1lbENhc2UobildKSk6bz1zLG99LHJlbW92ZURhdGE6ZnVuY3Rpb24oZSx0LG4pe2lmKCF2LmFjY2VwdERhdGEoZSkpcmV0dXJuO3ZhciByLGkscyxvPWUubm9kZVR5cGUsdT1vP3YuY2FjaGU6ZSxhPW8/ZVt2LmV4cGFuZG9dOnYuZXhwYW5kbztpZighdVthXSlyZXR1cm47aWYodCl7cj1uP3VbYV06dVthXS5kYXRhO2lmKHIpe3YuaXNBcnJheSh0KXx8KHQgaW4gcj90PVt0XToodD12LmNhbWVsQ2FzZSh0KSx0IGluIHI/dD1bdF06dD10LnNwbGl0KCIgIikpKTtmb3IoaT0wLHM9dC5sZW5ndGg7aTxzO2krKylkZWxldGUgclt0W2ldXTtpZighKG4/Qjp2LmlzRW1wdHlPYmplY3QpKHIpKXJldHVybn19aWYoIW4pe2RlbGV0ZSB1W2FdLmRhdGE7aWYoIUIodVthXSkpcmV0dXJufW8/di5jbGVhbkRhdGEoW2VdLCEwKTp2LnN1cHBvcnQuZGVsZXRlRXhwYW5kb3x8dSE9dS53aW5kb3c/ZGVsZXRlIHVbYV06dVthXT1udWxsfSxfZGF0YTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHYuZGF0YShlLHQsbiwhMCl9LGFjY2VwdERhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZSYmdi5ub0RhdGFbZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXTtyZXR1cm4hdHx8dCE9PSEwJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3NpZCIpPT09dH19KSx2LmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihlLG4pe3ZhciByLGkscyxvLHUsYT10aGlzWzBdLGY9MCxsPW51bGw7aWYoZT09PXQpe2lmKHRoaXMubGVuZ3RoKXtsPXYuZGF0YShhKTtpZihhLm5vZGVUeXBlPT09MSYmIXYuX2RhdGEoYSwicGFyc2VkQXR0cnMiKSl7cz1hLmF0dHJpYnV0ZXM7Zm9yKHU9cy5sZW5ndGg7Zjx1O2YrKylvPXNbZl0ubmFtZSxvLmluZGV4T2YoImRhdGEtIil8fChvPXYuY2FtZWxDYXNlKG8uc3Vic3RyaW5nKDUpKSxIKGEsbyxsW29dKSk7di5fZGF0YShhLCJwYXJzZWRBdHRycyIsITApfX1yZXR1cm4gbH1yZXR1cm4gdHlwZW9mIGU9PSJvYmplY3QiP3RoaXMuZWFjaChmdW5jdGlvbigpe3YuZGF0YSh0aGlzLGUpfSk6KHI9ZS5zcGxpdCgiLiIsMiksclsxXT1yWzFdPyIuIityWzFdOiIiLGk9clsxXSsiISIsdi5hY2Nlc3ModGhpcyxmdW5jdGlvbihuKXtpZihuPT09dClyZXR1cm4gbD10aGlzLnRyaWdnZXJIYW5kbGVyKCJnZXREYXRhIitpLFtyWzBdXSksbD09PXQmJmEmJihsPXYuZGF0YShhLGUpLGw9SChhLGUsbCkpLGw9PT10JiZyWzFdP3RoaXMuZGF0YShyWzBdKTpsO3JbMV09bix0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD12KHRoaXMpO3QudHJpZ2dlckhhbmRsZXIoInNldERhdGEiK2ksciksdi5kYXRhKHRoaXMsZSxuKSx0LnRyaWdnZXJIYW5kbGVyKCJjaGFuZ2VEYXRhIitpLHIpfSl9LG51bGwsbixhcmd1bWVudHMubGVuZ3RoPjEsbnVsbCwhMSkpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2LnJlbW92ZURhdGEodGhpcyxlKX0pfX0pLHYuZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI7aWYoZSlyZXR1cm4gdD0odHx8ImZ4IikrInF1ZXVlIixyPXYuX2RhdGEoZSx0KSxuJiYoIXJ8fHYuaXNBcnJheShuKT9yPXYuX2RhdGEoZSx0LHYubWFrZUFycmF5KG4pKTpyLnB1c2gobikpLHJ8fFtdfSxkZXF1ZXVlOmZ1bmN0aW9uKGUsdCl7dD10fHwiZngiO3ZhciBuPXYucXVldWUoZSx0KSxyPW4ubGVuZ3RoLGk9bi5zaGlmdCgpLHM9di5fcXVldWVIb29rcyhlLHQpLG89ZnVuY3Rpb24oKXt2LmRlcXVldWUoZSx0KX07aT09PSJpbnByb2dyZXNzIiYmKGk9bi5zaGlmdCgpLHItLSksaSYmKHQ9PT0iZngiJiZuLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgcy5zdG9wLGkuY2FsbChlLG8scykpLCFyJiZzJiZzLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10KyJxdWV1ZUhvb2tzIjtyZXR1cm4gdi5fZGF0YShlLG4pfHx2Ll9kYXRhKGUsbix7ZW1wdHk6di5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7di5yZW1vdmVEYXRhKGUsdCsicXVldWUiLCEwKSx2LnJlbW92ZURhdGEoZSxuLCEwKX0pfSl9fSksdi5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGUsbil7dmFyIHI9MjtyZXR1cm4gdHlwZW9mIGUhPSJzdHJpbmciJiYobj1lLGU9ImZ4IixyLS0pLGFyZ3VtZW50cy5sZW5ndGg8cj92LnF1ZXVlKHRoaXNbMF0sZSk6bj09PXQ/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD12LnF1ZXVlKHRoaXMsZSxuKTt2Ll9xdWV1ZUhvb2tzKHRoaXMsZSksZT09PSJmeCImJnRbMF0hPT0iaW5wcm9ncmVzcyImJnYuZGVxdWV1ZSh0aGlzLGUpfSl9LGRlcXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3YuZGVxdWV1ZSh0aGlzLGUpfSl9LGRlbGF5OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9di5meD92LmZ4LnNwZWVkc1tlXXx8ZTplLHQ9dHx8ImZ4Iix0aGlzLnF1ZXVlKHQsZnVuY3Rpb24odCxuKXt2YXIgcj1zZXRUaW1lb3V0KHQsZSk7bi5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHIpfX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnF1ZXVlKGV8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGUsbil7dmFyIHIsaT0xLHM9di5EZWZlcnJlZCgpLG89dGhpcyx1PXRoaXMubGVuZ3RoLGE9ZnVuY3Rpb24oKXstLWl8fHMucmVzb2x2ZVdpdGgobyxbb10pfTt0eXBlb2YgZSE9InN0cmluZyImJihuPWUsZT10KSxlPWV8fCJmeCI7d2hpbGUodS0tKXI9di5fZGF0YShvW3VdLGUrInF1ZXVlSG9va3MiKSxyJiZyLmVtcHR5JiYoaSsrLHIuZW1wdHkuYWRkKGEpKTtyZXR1cm4gYSgpLHMucHJvbWlzZShuKX19KTt2YXIgaixGLEkscT0vW1x0XHJcbl0vZyxSPS9cci9nLFU9L14oPzpidXR0b258aW5wdXQpJC9pLHo9L14oPzpidXR0b258aW5wdXR8b2JqZWN0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksVz0vXmEoPzpyZWF8KSQvaSxYPS9eKD86YXV0b2ZvY3VzfGF1dG9wbGF5fGFzeW5jfGNoZWNrZWR8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWR8c2VsZWN0ZWQpJC9pLFY9di5zdXBwb3J0LmdldFNldEF0dHJpYnV0ZTt2LmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihlLHQpe3JldHVybiB2LmFjY2Vzcyh0aGlzLHYuYXR0cixlLHQsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7di5yZW1vdmVBdHRyKHRoaXMsZSl9KX0scHJvcDpmdW5jdGlvbihlLHQpe3JldHVybiB2LmFjY2Vzcyh0aGlzLHYucHJvcCxlLHQsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihlKXtyZXR1cm4gZT12LnByb3BGaXhbZV18fGUsdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dHJ5e3RoaXNbZV09dCxkZWxldGUgdGhpc1tlXX1jYXRjaChuKXt9fSl9LGFkZENsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLHMsbyx1O2lmKHYuaXNGdW5jdGlvbihlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3YodGhpcykuYWRkQ2xhc3MoZS5jYWxsKHRoaXMsdCx0aGlzLmNsYXNzTmFtZSkpfSk7aWYoZSYmdHlwZW9mIGU9PSJzdHJpbmciKXt0PWUuc3BsaXQoeSk7Zm9yKG49MCxyPXRoaXMubGVuZ3RoO248cjtuKyspe2k9dGhpc1tuXTtpZihpLm5vZGVUeXBlPT09MSlpZighaS5jbGFzc05hbWUmJnQubGVuZ3RoPT09MSlpLmNsYXNzTmFtZT1lO2Vsc2V7cz0iICIraS5jbGFzc05hbWUrIiAiO2ZvcihvPTAsdT10Lmxlbmd0aDtvPHU7bysrKXMuaW5kZXhPZigiICIrdFtvXSsiICIpPDAmJihzKz10W29dKyIgIik7aS5jbGFzc05hbWU9di50cmltKHMpfX19cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGUpe3ZhciBuLHIsaSxzLG8sdSxhO2lmKHYuaXNGdW5jdGlvbihlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3YodGhpcykucmVtb3ZlQ2xhc3MoZS5jYWxsKHRoaXMsdCx0aGlzLmNsYXNzTmFtZSkpfSk7aWYoZSYmdHlwZW9mIGU9PSJzdHJpbmcifHxlPT09dCl7bj0oZXx8IiIpLnNwbGl0KHkpO2Zvcih1PTAsYT10aGlzLmxlbmd0aDt1PGE7dSsrKXtpPXRoaXNbdV07aWYoaS5ub2RlVHlwZT09PTEmJmkuY2xhc3NOYW1lKXtyPSgiICIraS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKHEsIiAiKTtmb3Iocz0wLG89bi5sZW5ndGg7czxvO3MrKyl3aGlsZShyLmluZGV4T2YoIiAiK25bc10rIiAiKT49MClyPXIucmVwbGFjZSgiICIrbltzXSsiICIsIiAiKTtpLmNsYXNzTmFtZT1lP3YudHJpbShyKToiIn19fXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihlLHQpe3ZhciBuPXR5cGVvZiBlLHI9dHlwZW9mIHQ9PSJib29sZWFuIjtyZXR1cm4gdi5pc0Z1bmN0aW9uKGUpP3RoaXMuZWFjaChmdW5jdGlvbihuKXt2KHRoaXMpLnRvZ2dsZUNsYXNzKGUuY2FsbCh0aGlzLG4sdGhpcy5jbGFzc05hbWUsdCksdCl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXtpZihuPT09InN0cmluZyIpe3ZhciBpLHM9MCxvPXYodGhpcyksdT10LGE9ZS5zcGxpdCh5KTt3aGlsZShpPWFbcysrXSl1PXI/dTohby5oYXNDbGFzcyhpKSxvW3U/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXShpKX1lbHNlIGlmKG49PT0idW5kZWZpbmVkInx8bj09PSJib29sZWFuIil0aGlzLmNsYXNzTmFtZSYmdi5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGU9PT0hMT8iIjp2Ll9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiJ9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQ9IiAiK2UrIiAiLG49MCxyPXRoaXMubGVuZ3RoO2Zvcig7bjxyO24rKylpZih0aGlzW25dLm5vZGVUeXBlPT09MSYmKCIgIit0aGlzW25dLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UocSwiICIpLmluZGV4T2YodCk+PTApcmV0dXJuITA7cmV0dXJuITF9LHZhbDpmdW5jdGlvbihlKXt2YXIgbixyLGkscz10aGlzWzBdO2lmKCFhcmd1bWVudHMubGVuZ3RoKXtpZihzKXJldHVybiBuPXYudmFsSG9va3Nbcy50eXBlXXx8di52YWxIb29rc1tzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLG4mJiJnZXQiaW4gbiYmKHI9bi5nZXQocywidmFsdWUiKSkhPT10P3I6KHI9cy52YWx1ZSx0eXBlb2Ygcj09InN0cmluZyI/ci5yZXBsYWNlKFIsIiIpOnI9PW51bGw/IiI6cik7cmV0dXJufXJldHVybiBpPXYuaXNGdW5jdGlvbihlKSx0aGlzLmVhY2goZnVuY3Rpb24ocil7dmFyIHMsbz12KHRoaXMpO2lmKHRoaXMubm9kZVR5cGUhPT0xKXJldHVybjtpP3M9ZS5jYWxsKHRoaXMscixvLnZhbCgpKTpzPWUscz09bnVsbD9zPSIiOnR5cGVvZiBzPT0ibnVtYmVyIj9zKz0iIjp2LmlzQXJyYXkocykmJihzPXYubWFwKHMsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PW51bGw/IiI6ZSsiIn0pKSxuPXYudmFsSG9va3NbdGhpcy50eXBlXXx8di52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldO2lmKCFufHwhKCJzZXQiaW4gbil8fG4uc2V0KHRoaXMscywidmFsdWUiKT09PXQpdGhpcy52YWx1ZT1zfSl9fSksdi5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihlKXt2YXIgdD1lLmF0dHJpYnV0ZXMudmFsdWU7cmV0dXJuIXR8fHQuc3BlY2lmaWVkP2UudmFsdWU6ZS50ZXh0fX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGkscz1lLnNlbGVjdGVkSW5kZXgsbz1bXSx1PWUub3B0aW9ucyxhPWUudHlwZT09PSJzZWxlY3Qtb25lIjtpZihzPDApcmV0dXJuIG51bGw7bj1hP3M6MCxyPWE/cysxOnUubGVuZ3RoO2Zvcig7bjxyO24rKyl7aT11W25dO2lmKGkuc2VsZWN0ZWQmJih2LnN1cHBvcnQub3B0RGlzYWJsZWQ/IWkuZGlzYWJsZWQ6aS5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIik9PT1udWxsKSYmKCFpLnBhcmVudE5vZGUuZGlzYWJsZWR8fCF2Lm5vZGVOYW1lKGkucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe3Q9dihpKS52YWwoKTtpZihhKXJldHVybiB0O28ucHVzaCh0KX19cmV0dXJuIGEmJiFvLmxlbmd0aCYmdS5sZW5ndGg/dih1W3NdKS52YWwoKTpvfSxzZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj12Lm1ha2VBcnJheSh0KTtyZXR1cm4gdihlKS5maW5kKCJvcHRpb24iKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZD12LmluQXJyYXkodih0aGlzKS52YWwoKSxuKT49MH0pLG4ubGVuZ3RofHwoZS5zZWxlY3RlZEluZGV4PS0xKSxufX19LGF0dHJGbjp7fSxhdHRyOmZ1bmN0aW9uKGUsbixyLGkpe3ZhciBzLG8sdSxhPWUubm9kZVR5cGU7aWYoIWV8fGE9PT0zfHxhPT09OHx8YT09PTIpcmV0dXJuO2lmKGkmJnYuaXNGdW5jdGlvbih2LmZuW25dKSlyZXR1cm4gdihlKVtuXShyKTtpZih0eXBlb2YgZS5nZXRBdHRyaWJ1dGU9PSJ1bmRlZmluZWQiKXJldHVybiB2LnByb3AoZSxuLHIpO3U9YSE9PTF8fCF2LmlzWE1MRG9jKGUpLHUmJihuPW4udG9Mb3dlckNhc2UoKSxvPXYuYXR0ckhvb2tzW25dfHwoWC50ZXN0KG4pP0Y6aikpO2lmKHIhPT10KXtpZihyPT09bnVsbCl7di5yZW1vdmVBdHRyKGUsbik7cmV0dXJufXJldHVybiBvJiYic2V0ImluIG8mJnUmJihzPW8uc2V0KGUscixuKSkhPT10P3M6KGUuc2V0QXR0cmlidXRlKG4scisiIikscil9cmV0dXJuIG8mJiJnZXQiaW4gbyYmdSYmKHM9by5nZXQoZSxuKSkhPT1udWxsP3M6KHM9ZS5nZXRBdHRyaWJ1dGUobikscz09PW51bGw/dDpzKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxzLG89MDtpZih0JiZlLm5vZGVUeXBlPT09MSl7cj10LnNwbGl0KHkpO2Zvcig7bzxyLmxlbmd0aDtvKyspaT1yW29dLGkmJihuPXYucHJvcEZpeFtpXXx8aSxzPVgudGVzdChpKSxzfHx2LmF0dHIoZSxpLCIiKSxlLnJlbW92ZUF0dHJpYnV0ZShWP2k6bikscyYmbiBpbiBlJiYoZVtuXT0hMSkpfX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oZSx0KXtpZihVLnRlc3QoZS5ub2RlTmFtZSkmJmUucGFyZW50Tm9kZSl2LmVycm9yKCJ0eXBlIHByb3BlcnR5IGNhbid0IGJlIGNoYW5nZWQiKTtlbHNlIGlmKCF2LnN1cHBvcnQucmFkaW9WYWx1ZSYmdD09PSJyYWRpbyImJnYubm9kZU5hbWUoZSwiaW5wdXQiKSl7dmFyIG49ZS52YWx1ZTtyZXR1cm4gZS5zZXRBdHRyaWJ1dGUoInR5cGUiLHQpLG4mJihlLnZhbHVlPW4pLHR9fX0sdmFsdWU6e2dldDpmdW5jdGlvbihlLHQpe3JldHVybiBqJiZ2Lm5vZGVOYW1lKGUsImJ1dHRvbiIpP2ouZ2V0KGUsdCk6dCBpbiBlP2UudmFsdWU6bnVsbH0sc2V0OmZ1bmN0aW9uKGUsdCxuKXtpZihqJiZ2Lm5vZGVOYW1lKGUsImJ1dHRvbiIpKXJldHVybiBqLnNldChlLHQsbik7ZS52YWx1ZT10fX19LHByb3BGaXg6e3RhYmluZGV4OiJ0YWJJbmRleCIscmVhZG9ubHk6InJlYWRPbmx5IiwiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIixtYXhsZW5ndGg6Im1heExlbmd0aCIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjZWxscGFkZGluZzoiY2VsbFBhZGRpbmciLHJvd3NwYW46InJvd1NwYW4iLGNvbHNwYW46ImNvbFNwYW4iLHVzZW1hcDoidXNlTWFwIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGNvbnRlbnRlZGl0YWJsZToiY29udGVudEVkaXRhYmxlIn0scHJvcDpmdW5jdGlvbihlLG4scil7dmFyIGkscyxvLHU9ZS5ub2RlVHlwZTtpZighZXx8dT09PTN8fHU9PT04fHx1PT09MilyZXR1cm47cmV0dXJuIG89dSE9PTF8fCF2LmlzWE1MRG9jKGUpLG8mJihuPXYucHJvcEZpeFtuXXx8bixzPXYucHJvcEhvb2tzW25dKSxyIT09dD9zJiYic2V0ImluIHMmJihpPXMuc2V0KGUscixuKSkhPT10P2k6ZVtuXT1yOnMmJiJnZXQiaW4gcyYmKGk9cy5nZXQoZSxuKSkhPT1udWxsP2k6ZVtuXX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciBuPWUuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKTtyZXR1cm4gbiYmbi5zcGVjaWZpZWQ/cGFyc2VJbnQobi52YWx1ZSwxMCk6ei50ZXN0KGUubm9kZU5hbWUpfHxXLnRlc3QoZS5ub2RlTmFtZSkmJmUuaHJlZj8wOnR9fX19KSxGPXtnZXQ6ZnVuY3Rpb24oZSxuKXt2YXIgcixpPXYucHJvcChlLG4pO3JldHVybiBpPT09ITB8fHR5cGVvZiBpIT0iYm9vbGVhbiImJihyPWUuZ2V0QXR0cmlidXRlTm9kZShuKSkmJnIubm9kZVZhbHVlIT09ITE/bi50b0xvd2VyQ2FzZSgpOnR9LHNldDpmdW5jdGlvbihlLHQsbil7dmFyIHI7cmV0dXJuIHQ9PT0hMT92LnJlbW92ZUF0dHIoZSxuKToocj12LnByb3BGaXhbbl18fG4sciBpbiBlJiYoZVtyXT0hMCksZS5zZXRBdHRyaWJ1dGUobixuLnRvTG93ZXJDYXNlKCkpKSxufX0sVnx8KEk9e25hbWU6ITAsaWQ6ITAsY29vcmRzOiEwfSxqPXYudmFsSG9va3MuYnV0dG9uPXtnZXQ6ZnVuY3Rpb24oZSxuKXt2YXIgcjtyZXR1cm4gcj1lLmdldEF0dHJpYnV0ZU5vZGUobiksciYmKElbbl0/ci52YWx1ZSE9PSIiOnIuc3BlY2lmaWVkKT9yLnZhbHVlOnR9LHNldDpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5nZXRBdHRyaWJ1dGVOb2RlKG4pO3JldHVybiByfHwocj1pLmNyZWF0ZUF0dHJpYnV0ZShuKSxlLnNldEF0dHJpYnV0ZU5vZGUocikpLHIudmFsdWU9dCsiIn19LHYuZWFjaChbIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oZSx0KXt2LmF0dHJIb29rc1t0XT12LmV4dGVuZCh2LmF0dHJIb29rc1t0XSx7c2V0OmZ1bmN0aW9uKGUsbil7aWYobj09PSIiKXJldHVybiBlLnNldEF0dHJpYnV0ZSh0LCJhdXRvIiksbn19KX0pLHYuYXR0ckhvb2tzLmNvbnRlbnRlZGl0YWJsZT17Z2V0OmouZ2V0LHNldDpmdW5jdGlvbihlLHQsbil7dD09PSIiJiYodD0iZmFsc2UiKSxqLnNldChlLHQsbil9fSksdi5zdXBwb3J0LmhyZWZOb3JtYWxpemVkfHx2LmVhY2goWyJocmVmIiwic3JjIiwid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbigKZSxuKXt2LmF0dHJIb29rc1tuXT12LmV4dGVuZCh2LmF0dHJIb29rc1tuXSx7Z2V0OmZ1bmN0aW9uKGUpe3ZhciByPWUuZ2V0QXR0cmlidXRlKG4sMik7cmV0dXJuIHI9PT1udWxsP3Q6cn19KX0pLHYuc3VwcG9ydC5zdHlsZXx8KHYuYXR0ckhvb2tzLnN0eWxlPXtnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3R5bGUuY3NzVGV4dC50b0xvd2VyQ2FzZSgpfHx0fSxzZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5zdHlsZS5jc3NUZXh0PXQrIiJ9fSksdi5zdXBwb3J0Lm9wdFNlbGVjdGVkfHwodi5wcm9wSG9va3Muc2VsZWN0ZWQ9di5leHRlbmQodi5wcm9wSG9va3Muc2VsZWN0ZWQse2dldDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJih0LnNlbGVjdGVkSW5kZXgsdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCksbnVsbH19KSksdi5zdXBwb3J0LmVuY3R5cGV8fCh2LnByb3BGaXguZW5jdHlwZT0iZW5jb2RpbmciKSx2LnN1cHBvcnQuY2hlY2tPbnx8di5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7di52YWxIb29rc1t0aGlzXT17Z2V0OmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSgidmFsdWUiKT09PW51bGw/Im9uIjplLnZhbHVlfX19KSx2LmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXt2LnZhbEhvb2tzW3RoaXNdPXYuZXh0ZW5kKHYudmFsSG9va3NbdGhpc10se3NldDpmdW5jdGlvbihlLHQpe2lmKHYuaXNBcnJheSh0KSlyZXR1cm4gZS5jaGVja2VkPXYuaW5BcnJheSh2KGUpLnZhbCgpLHQpPj0wfX0pfSk7dmFyICQ9L14oPzp0ZXh0YXJlYXxpbnB1dHxzZWxlY3QpJC9pLEo9L14oW15cLl0qfCkoPzpcLiguKyl8KSQvLEs9Lyg/Ol58XHMpaG92ZXIoXC5cUyt8KVxiLyxRPS9ea2V5LyxHPS9eKD86bW91c2V8Y29udGV4dG1lbnUpfGNsaWNrLyxZPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxaPWZ1bmN0aW9uKGUpe3JldHVybiB2LmV2ZW50LnNwZWNpYWwuaG92ZXI/ZTplLnJlcGxhY2UoSywibW91c2VlbnRlciQxIG1vdXNlbGVhdmUkMSIpfTt2LmV2ZW50PXthZGQ6ZnVuY3Rpb24oZSxuLHIsaSxzKXt2YXIgbyx1LGEsZixsLGMsaCxwLGQsbSxnO2lmKGUubm9kZVR5cGU9PT0zfHxlLm5vZGVUeXBlPT09OHx8IW58fCFyfHwhKG89di5fZGF0YShlKSkpcmV0dXJuO3IuaGFuZGxlciYmKGQ9cixyPWQuaGFuZGxlcixzPWQuc2VsZWN0b3IpLHIuZ3VpZHx8KHIuZ3VpZD12Lmd1aWQrKyksYT1vLmV2ZW50cyxhfHwoby5ldmVudHM9YT17fSksdT1vLmhhbmRsZSx1fHwoby5oYW5kbGU9dT1mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIHY9PSJ1bmRlZmluZWQifHwhIWUmJnYuZXZlbnQudHJpZ2dlcmVkPT09ZS50eXBlP3Q6di5ldmVudC5kaXNwYXRjaC5hcHBseSh1LmVsZW0sYXJndW1lbnRzKX0sdS5lbGVtPWUpLG49di50cmltKFoobikpLnNwbGl0KCIgIik7Zm9yKGY9MDtmPG4ubGVuZ3RoO2YrKyl7bD1KLmV4ZWMobltmXSl8fFtdLGM9bFsxXSxoPShsWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZz12LmV2ZW50LnNwZWNpYWxbY118fHt9LGM9KHM/Zy5kZWxlZ2F0ZVR5cGU6Zy5iaW5kVHlwZSl8fGMsZz12LmV2ZW50LnNwZWNpYWxbY118fHt9LHA9di5leHRlbmQoe3R5cGU6YyxvcmlnVHlwZTpsWzFdLGRhdGE6aSxoYW5kbGVyOnIsZ3VpZDpyLmd1aWQsc2VsZWN0b3I6cyxuZWVkc0NvbnRleHQ6cyYmdi5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KHMpLG5hbWVzcGFjZTpoLmpvaW4oIi4iKX0sZCksbT1hW2NdO2lmKCFtKXttPWFbY109W10sbS5kZWxlZ2F0ZUNvdW50PTA7aWYoIWcuc2V0dXB8fGcuc2V0dXAuY2FsbChlLGksaCx1KT09PSExKWUuYWRkRXZlbnRMaXN0ZW5lcj9lLmFkZEV2ZW50TGlzdGVuZXIoYyx1LCExKTplLmF0dGFjaEV2ZW50JiZlLmF0dGFjaEV2ZW50KCJvbiIrYyx1KX1nLmFkZCYmKGcuYWRkLmNhbGwoZSxwKSxwLmhhbmRsZXIuZ3VpZHx8KHAuaGFuZGxlci5ndWlkPXIuZ3VpZCkpLHM/bS5zcGxpY2UobS5kZWxlZ2F0ZUNvdW50KyssMCxwKTptLnB1c2gocCksdi5ldmVudC5nbG9iYWxbY109ITB9ZT1udWxsfSxnbG9iYWw6e30scmVtb3ZlOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIHMsbyx1LGEsZixsLGMsaCxwLGQsbSxnPXYuaGFzRGF0YShlKSYmdi5fZGF0YShlKTtpZighZ3x8IShoPWcuZXZlbnRzKSlyZXR1cm47dD12LnRyaW0oWih0fHwiIikpLnNwbGl0KCIgIik7Zm9yKHM9MDtzPHQubGVuZ3RoO3MrKyl7bz1KLmV4ZWModFtzXSl8fFtdLHU9YT1vWzFdLGY9b1syXTtpZighdSl7Zm9yKHUgaW4gaCl2LmV2ZW50LnJlbW92ZShlLHUrdFtzXSxuLHIsITApO2NvbnRpbnVlfXA9di5ldmVudC5zcGVjaWFsW3VdfHx7fSx1PShyP3AuZGVsZWdhdGVUeXBlOnAuYmluZFR5cGUpfHx1LGQ9aFt1XXx8W10sbD1kLmxlbmd0aCxmPWY/bmV3IFJlZ0V4cCgiKF58XFwuKSIrZi5zcGxpdCgiLiIpLnNvcnQoKS5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsO2ZvcihjPTA7YzxkLmxlbmd0aDtjKyspbT1kW2NdLChpfHxhPT09bS5vcmlnVHlwZSkmJighbnx8bi5ndWlkPT09bS5ndWlkKSYmKCFmfHxmLnRlc3QobS5uYW1lc3BhY2UpKSYmKCFyfHxyPT09bS5zZWxlY3Rvcnx8cj09PSIqKiImJm0uc2VsZWN0b3IpJiYoZC5zcGxpY2UoYy0tLDEpLG0uc2VsZWN0b3ImJmQuZGVsZWdhdGVDb3VudC0tLHAucmVtb3ZlJiZwLnJlbW92ZS5jYWxsKGUsbSkpO2QubGVuZ3RoPT09MCYmbCE9PWQubGVuZ3RoJiYoKCFwLnRlYXJkb3dufHxwLnRlYXJkb3duLmNhbGwoZSxmLGcuaGFuZGxlKT09PSExKSYmdi5yZW1vdmVFdmVudChlLHUsZy5oYW5kbGUpLGRlbGV0ZSBoW3VdKX12LmlzRW1wdHlPYmplY3QoaCkmJihkZWxldGUgZy5oYW5kbGUsdi5yZW1vdmVEYXRhKGUsImV2ZW50cyIsITApKX0sY3VzdG9tRXZlbnQ6e2dldERhdGE6ITAsc2V0RGF0YTohMCxjaGFuZ2VEYXRhOiEwfSx0cmlnZ2VyOmZ1bmN0aW9uKG4scixzLG8pe2lmKCFzfHxzLm5vZGVUeXBlIT09MyYmcy5ub2RlVHlwZSE9PTgpe3ZhciB1LGEsZixsLGMsaCxwLGQsbSxnLHk9bi50eXBlfHxuLGI9W107aWYoWS50ZXN0KHkrdi5ldmVudC50cmlnZ2VyZWQpKXJldHVybjt5LmluZGV4T2YoIiEiKT49MCYmKHk9eS5zbGljZSgwLC0xKSxhPSEwKSx5LmluZGV4T2YoIi4iKT49MCYmKGI9eS5zcGxpdCgiLiIpLHk9Yi5zaGlmdCgpLGIuc29ydCgpKTtpZigoIXN8fHYuZXZlbnQuY3VzdG9tRXZlbnRbeV0pJiYhdi5ldmVudC5nbG9iYWxbeV0pcmV0dXJuO249dHlwZW9mIG49PSJvYmplY3QiP25bdi5leHBhbmRvXT9uOm5ldyB2LkV2ZW50KHksbik6bmV3IHYuRXZlbnQoeSksbi50eXBlPXksbi5pc1RyaWdnZXI9ITAsbi5leGNsdXNpdmU9YSxuLm5hbWVzcGFjZT1iLmpvaW4oIi4iKSxuLm5hbWVzcGFjZV9yZT1uLm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIitiLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsaD15LmluZGV4T2YoIjoiKTwwPyJvbiIreToiIjtpZighcyl7dT12LmNhY2hlO2ZvcihmIGluIHUpdVtmXS5ldmVudHMmJnVbZl0uZXZlbnRzW3ldJiZ2LmV2ZW50LnRyaWdnZXIobixyLHVbZl0uaGFuZGxlLmVsZW0sITApO3JldHVybn1uLnJlc3VsdD10LG4udGFyZ2V0fHwobi50YXJnZXQ9cykscj1yIT1udWxsP3YubWFrZUFycmF5KHIpOltdLHIudW5zaGlmdChuKSxwPXYuZXZlbnQuc3BlY2lhbFt5XXx8e307aWYocC50cmlnZ2VyJiZwLnRyaWdnZXIuYXBwbHkocyxyKT09PSExKXJldHVybjttPVtbcyxwLmJpbmRUeXBlfHx5XV07aWYoIW8mJiFwLm5vQnViYmxlJiYhdi5pc1dpbmRvdyhzKSl7Zz1wLmRlbGVnYXRlVHlwZXx8eSxsPVkudGVzdChnK3kpP3M6cy5wYXJlbnROb2RlO2ZvcihjPXM7bDtsPWwucGFyZW50Tm9kZSltLnB1c2goW2wsZ10pLGM9bDtjPT09KHMub3duZXJEb2N1bWVudHx8aSkmJm0ucHVzaChbYy5kZWZhdWx0Vmlld3x8Yy5wYXJlbnRXaW5kb3d8fGUsZ10pfWZvcihmPTA7ZjxtLmxlbmd0aCYmIW4uaXNQcm9wYWdhdGlvblN0b3BwZWQoKTtmKyspbD1tW2ZdWzBdLG4udHlwZT1tW2ZdWzFdLGQ9KHYuX2RhdGEobCwiZXZlbnRzIil8fHt9KVtuLnR5cGVdJiZ2Ll9kYXRhKGwsImhhbmRsZSIpLGQmJmQuYXBwbHkobCxyKSxkPWgmJmxbaF0sZCYmdi5hY2NlcHREYXRhKGwpJiZkLmFwcGx5JiZkLmFwcGx5KGwscik9PT0hMSYmbi5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBuLnR5cGU9eSwhbyYmIW4uaXNEZWZhdWx0UHJldmVudGVkKCkmJighcC5fZGVmYXVsdHx8cC5fZGVmYXVsdC5hcHBseShzLm93bmVyRG9jdW1lbnQscik9PT0hMSkmJih5IT09ImNsaWNrInx8IXYubm9kZU5hbWUocywiYSIpKSYmdi5hY2NlcHREYXRhKHMpJiZoJiZzW3ldJiYoeSE9PSJmb2N1cyImJnkhPT0iYmx1ciJ8fG4udGFyZ2V0Lm9mZnNldFdpZHRoIT09MCkmJiF2LmlzV2luZG93KHMpJiYoYz1zW2hdLGMmJihzW2hdPW51bGwpLHYuZXZlbnQudHJpZ2dlcmVkPXksc1t5XSgpLHYuZXZlbnQudHJpZ2dlcmVkPXQsYyYmKHNbaF09YykpLG4ucmVzdWx0fXJldHVybn0sZGlzcGF0Y2g6ZnVuY3Rpb24obil7bj12LmV2ZW50LmZpeChufHxlLmV2ZW50KTt2YXIgcixpLHMsbyx1LGEsZixjLGgscCxkPSh2Ll9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbbi50eXBlXXx8W10sbT1kLmRlbGVnYXRlQ291bnQsZz1sLmNhbGwoYXJndW1lbnRzKSx5PSFuLmV4Y2x1c2l2ZSYmIW4ubmFtZXNwYWNlLGI9di5ldmVudC5zcGVjaWFsW24udHlwZV18fHt9LHc9W107Z1swXT1uLG4uZGVsZWdhdGVUYXJnZXQ9dGhpcztpZihiLnByZURpc3BhdGNoJiZiLnByZURpc3BhdGNoLmNhbGwodGhpcyxuKT09PSExKXJldHVybjtpZihtJiYoIW4uYnV0dG9ufHxuLnR5cGUhPT0iY2xpY2siKSlmb3Iocz1uLnRhcmdldDtzIT10aGlzO3M9cy5wYXJlbnROb2RlfHx0aGlzKWlmKHMuZGlzYWJsZWQhPT0hMHx8bi50eXBlIT09ImNsaWNrIil7dT17fSxmPVtdO2ZvcihyPTA7cjxtO3IrKyljPWRbcl0saD1jLnNlbGVjdG9yLHVbaF09PT10JiYodVtoXT1jLm5lZWRzQ29udGV4dD92KGgsdGhpcykuaW5kZXgocyk+PTA6di5maW5kKGgsdGhpcyxudWxsLFtzXSkubGVuZ3RoKSx1W2hdJiZmLnB1c2goYyk7Zi5sZW5ndGgmJncucHVzaCh7ZWxlbTpzLG1hdGNoZXM6Zn0pfWQubGVuZ3RoPm0mJncucHVzaCh7ZWxlbTp0aGlzLG1hdGNoZXM6ZC5zbGljZShtKX0pO2ZvcihyPTA7cjx3Lmxlbmd0aCYmIW4uaXNQcm9wYWdhdGlvblN0b3BwZWQoKTtyKyspe2E9d1tyXSxuLmN1cnJlbnRUYXJnZXQ9YS5lbGVtO2ZvcihpPTA7aTxhLm1hdGNoZXMubGVuZ3RoJiYhbi5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpO2krKyl7Yz1hLm1hdGNoZXNbaV07aWYoeXx8IW4ubmFtZXNwYWNlJiYhYy5uYW1lc3BhY2V8fG4ubmFtZXNwYWNlX3JlJiZuLm5hbWVzcGFjZV9yZS50ZXN0KGMubmFtZXNwYWNlKSluLmRhdGE9Yy5kYXRhLG4uaGFuZGxlT2JqPWMsbz0oKHYuZXZlbnQuc3BlY2lhbFtjLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8Yy5oYW5kbGVyKS5hcHBseShhLmVsZW0sZyksbyE9PXQmJihuLnJlc3VsdD1vLG89PT0hMSYmKG4ucHJldmVudERlZmF1bHQoKSxuLnN0b3BQcm9wYWdhdGlvbigpKSl9fXJldHVybiBiLnBvc3REaXNwYXRjaCYmYi5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLG4pLG4ucmVzdWx0fSxwcm9wczoiYXR0ckNoYW5nZSBhdHRyTmFtZSByZWxhdGVkTm9kZSBzcmNFbGVtZW50IGFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaCIuc3BsaXQoIiAiKSxmaXhIb29rczp7fSxrZXlIb29rczp7cHJvcHM6ImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGUiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUud2hpY2g9PW51bGwmJihlLndoaWNoPXQuY2hhckNvZGUhPW51bGw/dC5jaGFyQ29kZTp0LmtleUNvZGUpLGV9fSxtb3VzZUhvb2tzOntwcm9wczoiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIGZyb21FbGVtZW50IG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50Ii5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihlLG4pe3ZhciByLHMsbyx1PW4uYnV0dG9uLGE9bi5mcm9tRWxlbWVudDtyZXR1cm4gZS5wYWdlWD09bnVsbCYmbi5jbGllbnRYIT1udWxsJiYocj1lLnRhcmdldC5vd25lckRvY3VtZW50fHxpLHM9ci5kb2N1bWVudEVsZW1lbnQsbz1yLmJvZHksZS5wYWdlWD1uLmNsaWVudFgrKHMmJnMuc2Nyb2xsTGVmdHx8byYmby5zY3JvbGxMZWZ0fHwwKS0ocyYmcy5jbGllbnRMZWZ0fHxvJiZvLmNsaWVudExlZnR8fDApLGUucGFnZVk9bi5jbGllbnRZKyhzJiZzLnNjcm9sbFRvcHx8byYmby5zY3JvbGxUb3B8fDApLShzJiZzLmNsaWVudFRvcHx8byYmby5jbGllbnRUb3B8fDApKSwhZS5yZWxhdGVkVGFyZ2V0JiZhJiYoZS5yZWxhdGVkVGFyZ2V0PWE9PT1lLnRhcmdldD9uLnRvRWxlbWVudDphKSwhZS53aGljaCYmdSE9PXQmJihlLndoaWNoPXUmMT8xOnUmMj8zOnUmND8yOjApLGV9fSxmaXg6ZnVuY3Rpb24oZSl7aWYoZVt2LmV4cGFuZG9dKXJldHVybiBlO3ZhciB0LG4scj1lLHM9di5ldmVudC5maXhIb29rc1tlLnR5cGVdfHx7fSxvPXMucHJvcHM/dGhpcy5wcm9wcy5jb25jYXQocy5wcm9wcyk6dGhpcy5wcm9wcztlPXYuRXZlbnQocik7Zm9yKHQ9by5sZW5ndGg7dDspbj1vWy0tdF0sZVtuXT1yW25dO3JldHVybiBlLnRhcmdldHx8KGUudGFyZ2V0PXIuc3JjRWxlbWVudHx8aSksZS50YXJnZXQubm9kZVR5cGU9PT0zJiYoZS50YXJnZXQ9ZS50YXJnZXQucGFyZW50Tm9kZSksZS5tZXRhS2V5PSEhZS5tZXRhS2V5LHMuZmlsdGVyP3MuZmlsdGVyKGUscik6ZX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGZvY3VzOntkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOntkZWxlZ2F0ZVR5cGU6ImZvY3Vzb3V0In0sYmVmb3JldW5sb2FkOntzZXR1cDpmdW5jdGlvbihlLHQsbil7di5pc1dpbmRvdyh0aGlzKSYmKHRoaXMub25iZWZvcmV1bmxvYWQ9bil9LHRlYXJkb3duOmZ1bmN0aW9uKGUsdCl7dGhpcy5vbmJlZm9yZXVubG9hZD09PXQmJih0aGlzLm9uYmVmb3JldW5sb2FkPW51bGwpfX19LHNpbXVsYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXYuZXh0ZW5kKG5ldyB2LkV2ZW50LG4se3R5cGU6ZSxpc1NpbXVsYXRlZDohMCxvcmlnaW5hbEV2ZW50Ont9fSk7cj92LmV2ZW50LnRyaWdnZXIoaSxudWxsLHQpOnYuZXZlbnQuZGlzcGF0Y2guY2FsbCh0LGkpLGkuaXNEZWZhdWx0UHJldmVudGVkKCkmJm4ucHJldmVudERlZmF1bHQoKX19LHYuZXZlbnQuaGFuZGxlPXYuZXZlbnQuZGlzcGF0Y2gsdi5yZW1vdmVFdmVudD1pLnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oZSx0LG4pe2UucmVtb3ZlRXZlbnRMaXN0ZW5lciYmZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiwhMSl9OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0ib24iK3Q7ZS5kZXRhY2hFdmVudCYmKHR5cGVvZiBlW3JdPT0idW5kZWZpbmVkIiYmKGVbcl09bnVsbCksZS5kZXRhY2hFdmVudChyLG4pKX0sdi5FdmVudD1mdW5jdGlvbihlLHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHYuRXZlbnQpKXJldHVybiBuZXcgdi5FdmVudChlLHQpO2UmJmUudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWUsdGhpcy50eXBlPWUudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1lLmRlZmF1bHRQcmV2ZW50ZWR8fGUucmV0dXJuVmFsdWU9PT0hMXx8ZS5nZXRQcmV2ZW50RGVmYXVsdCYmZS5nZXRQcmV2ZW50RGVmYXVsdCgpP3R0OmV0KTp0aGlzLnR5cGU9ZSx0JiZ2LmV4dGVuZCh0aGlzLHQpLHRoaXMudGltZVN0YW1wPWUmJmUudGltZVN0YW1wfHx2Lm5vdygpLHRoaXNbdi5leHBhbmRvXT0hMH0sdi5FdmVudC5wcm90b3R5cGU9e3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9dHQ7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O2lmKCFlKXJldHVybjtlLnByZXZlbnREZWZhdWx0P2UucHJldmVudERlZmF1bHQoKTplLnJldHVyblZhbHVlPSExfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPXR0O3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDtpZighZSlyZXR1cm47ZS5zdG9wUHJvcGFnYXRpb24mJmUuc3RvcFByb3BhZ2F0aW9uKCksZS5jYW5jZWxCdWJibGU9ITB9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9dHQsdGhpcy5zdG9wUHJvcGFnYXRpb24oKX0saXNEZWZhdWx0UHJldmVudGVkOmV0LGlzUHJvcGFnYXRpb25TdG9wcGVkOmV0LGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOmV0fSx2LmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSxmdW5jdGlvbihlLHQpe3YuZXZlbnQuc3BlY2lhbFtlXT17ZGVsZWdhdGVUeXBlOnQsYmluZFR5cGU6dCxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIG4scj10aGlzLGk9ZS5yZWxhdGVkVGFyZ2V0LHM9ZS5oYW5kbGVPYmosbz1zLnNlbGVjdG9yO2lmKCFpfHxpIT09ciYmIXYuY29udGFpbnMocixpKSllLnR5cGU9cy5vcmlnVHlwZSxuPXMuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS50eXBlPXQ7cmV0dXJuIG59fX0pLHYuc3VwcG9ydC5zdWJtaXRCdWJibGVzfHwodi5ldmVudC5zcGVjaWFsLnN1Ym1pdD17c2V0dXA6ZnVuY3Rpb24oKXtpZih2Lm5vZGVOYW1lKHRoaXMsImZvcm0iKSlyZXR1cm4hMTt2LmV2ZW50LmFkZCh0aGlzLCJjbGljay5fc3VibWl0IGtleXByZXNzLl9zdWJtaXQiLGZ1bmN0aW9uKGUpe3ZhciBuPWUudGFyZ2V0LHI9di5ub2RlTmFtZShuLCJpbnB1dCIpfHx2Lm5vZGVOYW1lKG4sImJ1dHRvbiIpP24uZm9ybTp0O3ImJiF2Ll9kYXRhKHIsIl9zdWJtaXRfYXR0YWNoZWQiKSYmKHYuZXZlbnQuYWRkKHIsInN1Ym1pdC5fc3VibWl0IixmdW5jdGlvbihlKXtlLl9zdWJtaXRfYnViYmxlPSEwfSksdi5fZGF0YShyLCJfc3VibWl0X2F0dGFjaGVkIiwhMCkpfSl9LHBvc3REaXNwYXRjaDpmdW5jdGlvbihlKXtlLl9zdWJtaXRfYnViYmxlJiYoZGVsZXRlIGUuX3N1Ym1pdF9idWJibGUsdGhpcy5wYXJlbnROb2RlJiYhZS5pc1RyaWdnZXImJnYuZXZlbnQuc2ltdWxhdGUoInN1Ym1pdCIsdGhpcy5wYXJlbnROb2RlLGUsITApKX0sdGVhcmRvd246ZnVuY3Rpb24oKXtpZih2Lm5vZGVOYW1lKHRoaXMsImZvcm0iKSlyZXR1cm4hMTt2LmV2ZW50LnJlbW92ZSh0aGlzLCIuX3N1Ym1pdCIpfX0pLHYuc3VwcG9ydC5jaGFuZ2VCdWJibGVzfHwodi5ldmVudC5zcGVjaWFsLmNoYW5nZT17c2V0dXA6ZnVuY3Rpb24oKXtpZigkLnRlc3QodGhpcy5ub2RlTmFtZSkpe2lmKHRoaXMudHlwZT09PSJjaGVja2JveCJ8fHRoaXMudHlwZT09PSJyYWRpbyIpdi5ldmVudC5hZGQodGhpcywicHJvcGVydHljaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oZSl7ZS5vcmlnaW5hbEV2ZW50LnByb3BlcnR5TmFtZT09PSJjaGVja2VkIiYmKHRoaXMuX2p1c3RfY2hhbmdlZD0hMCl9KSx2LmV2ZW50LmFkZCh0aGlzLCJjbGljay5fY2hhbmdlIixmdW5jdGlvbihlKXt0aGlzLl9qdXN0X2NoYW5nZWQmJiFlLmlzVHJpZ2dlciYmKHRoaXMuX2p1c3RfY2hhbmdlZD0hMSksdi5ldmVudC5zaW11bGF0ZSgiY2hhbmdlIix0aGlzLGUsITApfSk7cmV0dXJuITF9di5ldmVudC5hZGQodGhpcywiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZSIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YXJnZXQ7JC50ZXN0KHQubm9kZU5hbWUpJiYhdi5fZGF0YSh0LCJfY2hhbmdlX2F0dGFjaGVkIikmJih2LmV2ZW50LmFkZCh0LCJjaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiYhZS5pc1NpbXVsYXRlZCYmIWUuaXNUcmlnZ2VyJiZ2LmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMucGFyZW50Tm9kZSxlLCEwKX0pLHYuX2RhdGEodCwiX2NoYW5nZV9hdHRhY2hlZCIsITApKX0pfSxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YXJnZXQ7aWYodGhpcyE9PXR8fGUuaXNTaW11bGF0ZWR8fGUuaXNUcmlnZ2VyfHx0LnR5cGUhPT0icmFkaW8iJiZ0LnR5cGUhPT0iY2hlY2tib3giKXJldHVybiBlLmhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sdGVhcmRvd246ZnVuY3Rpb24oKXtyZXR1cm4gdi5ldmVudC5yZW1vdmUodGhpcywiLl9jaGFuZ2UiKSwhJC50ZXN0KHRoaXMubm9kZU5hbWUpfX0pLHYuc3VwcG9ydC5mb2N1c2luQnViYmxlc3x8di5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihlLHQpe3ZhciBuPTAscj1mdW5jdGlvbihlKXt2LmV2ZW50LnNpbXVsYXRlKHQsZS50YXJnZXQsdi5ldmVudC5maXgoZSksITApfTt2LmV2ZW50LnNwZWNpYWxbdF09e3NldHVwOmZ1bmN0aW9uKCl7bisrPT09MCYmaS5hZGRFdmVudExpc3RlbmVyKGUsciwhMCl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7LS1uPT09MCYmaS5yZW1vdmVFdmVudExpc3RlbmVyKGUsciwhMCl9fX0pLHYuZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihlLG4scixpLHMpe3ZhciBvLHU7aWYodHlwZW9mIGU9PSJvYmplY3QiKXt0eXBlb2YgbiE9InN0cmluZyImJihyPXJ8fG4sbj10KTtmb3IodSBpbiBlKXRoaXMub24odSxuLHIsZVt1XSxzKTtyZXR1cm4gdGhpc31yPT1udWxsJiZpPT1udWxsPyhpPW4scj1uPXQpOmk9PW51bGwmJih0eXBlb2Ygbj09InN0cmluZyI/KGk9cixyPXQpOihpPXIscj1uLG49dCkpO2lmKGk9PT0hMSlpPWV0O2Vsc2UgaWYoIWkpcmV0dXJuIHRoaXM7cmV0dXJuIHM9PT0xJiYobz1pLGk9ZnVuY3Rpb24oZSl7cmV0dXJuIHYoKS5vZmYoZSksby5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGkuZ3VpZD1vLmd1aWR8fChvLmd1aWQ9di5ndWlkKyspKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2LmV2ZW50LmFkZCh0aGlzLGUsaSxyLG4pfSl9LG9uZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5vbihlLHQsbixyLDEpfSxvZmY6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpLHM7aWYoZSYmZS5wcmV2ZW50RGVmYXVsdCYmZS5oYW5kbGVPYmopcmV0dXJuIGk9ZS5oYW5kbGVPYmosdihlLmRlbGVnYXRlVGFyZ2V0KS5vZmYoaS5uYW1lc3BhY2U/aS5vcmlnVHlwZSsiLiIraS5uYW1lc3BhY2U6aS5vcmlnVHlwZSxpLnNlbGVjdG9yLGkuaGFuZGxlciksdGhpcztpZih0eXBlb2YgZT09Im9iamVjdCIpe2ZvcihzIGluIGUpdGhpcy5vZmYocyxuLGVbc10pO3JldHVybiB0aGlzfWlmKG49PT0hMXx8dHlwZW9mIG49PSJmdW5jdGlvbiIpcj1uLG49dDtyZXR1cm4gcj09PSExJiYocj1ldCksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7di5ldmVudC5yZW1vdmUodGhpcyxlLHIsbil9KX0sYmluZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub24oZSxudWxsLHQsbil9LHVuYmluZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm9mZihlLG51bGwsdCl9LGxpdmU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2KHRoaXMuY29udGV4dCkub24oZSx0aGlzLnNlbGVjdG9yLHQsbiksdGhpc30sZGllOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHYodGhpcy5jb250ZXh0KS5vZmYoZSx0aGlzLnNlbGVjdG9yfHwiKioiLHQpLHRoaXN9LGRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLm9uKHQsZSxuLHIpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTE/dGhpcy5vZmYoZSwiKioiKTp0aGlzLm9mZih0LGV8fCIqKiIsbil9LHRyaWdnZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7di5ldmVudC50cmlnZ2VyKGUsdCx0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihlLHQpe2lmKHRoaXNbMF0pcmV0dXJuIHYuZXZlbnQudHJpZ2dlcihlLHQsdGhpc1swXSwhMCl9LHRvZ2dsZTpmdW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHMsbj1lLmd1aWR8fHYuZ3VpZCsrLHI9MCxpPWZ1bmN0aW9uKG4pe3ZhciBpPSh2Ll9kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2UuZ3VpZCl8fDApJXI7cmV0dXJuIHYuX2RhdGEodGhpcywibGFzdFRvZ2dsZSIrZS5ndWlkLGkrMSksbi5wcmV2ZW50RGVmYXVsdCgpLHRbaV0uYXBwbHkodGhpcyxhcmd1bWVudHMpfHwhMX07aS5ndWlkPW47d2hpbGUocjx0Lmxlbmd0aCl0W3IrK10uZ3VpZD1uO3JldHVybiB0aGlzLmNsaWNrKGkpfSxob3ZlcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoZSkubW91c2VsZWF2ZSh0fHxlKX19KSx2LmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXt2LmZuW3RdPWZ1bmN0aW9uKGUsbil7cmV0dXJuIG49PW51bGwmJihuPWUsZT1udWxsKSxhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5vbih0LG51bGwsZSxuKTp0aGlzLnRyaWdnZXIodCl9LFEudGVzdCh0KSYmKHYuZXZlbnQuZml4SG9va3NbdF09di5ldmVudC5rZXlIb29rcyksRy50ZXN0KHQpJiYodi5ldmVudC5maXhIb29rc1t0XT12LmV2ZW50Lm1vdXNlSG9va3MpfSksZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBudChlLHQsbixyKXtuPW58fFtdLHQ9dHx8Zzt2YXIgaSxzLGEsZixsPXQubm9kZVR5cGU7aWYoIWV8fHR5cGVvZiBlIT0ic3RyaW5nIilyZXR1cm4gbjtpZihsIT09MSYmbCE9PTkpcmV0dXJuW107YT1vKHQpO2lmKCFhJiYhcilpZihpPVIuZXhlYyhlKSlpZihmPWlbMV0pe2lmKGw9PT05KXtzPXQuZ2V0RWxlbWVudEJ5SWQoZik7aWYoIXN8fCFzLnBhcmVudE5vZGUpcmV0dXJuIG47aWYocy5pZD09PWYpcmV0dXJuIG4ucHVzaChzKSxufWVsc2UgaWYodC5vd25lckRvY3VtZW50JiYocz10Lm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZikpJiZ1KHQscykmJnMuaWQ9PT1mKXJldHVybiBuLnB1c2gocyksbn1lbHNle2lmKGlbMl0pcmV0dXJuIFMuYXBwbHkobix4LmNhbGwodC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSwwKSksbjtpZigoZj1pWzNdKSYmWiYmdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBTLmFwcGx5KG4seC5jYWxsKHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShmKSwwKSksbn1yZXR1cm4gdnQoZS5yZXBsYWNlKGosIiQxIiksdCxuLHIsYSl9ZnVuY3Rpb24gcnQoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gbj09PSJpbnB1dCImJnQudHlwZT09PWV9fWZ1bmN0aW9uIGl0KGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKG49PT0iaW5wdXQifHxuPT09ImJ1dHRvbiIpJiZ0LnR5cGU9PT1lfX1mdW5jdGlvbiBzdChlKXtyZXR1cm4gTihmdW5jdGlvbih0KXtyZXR1cm4gdD0rdCxOKGZ1bmN0aW9uKG4scil7dmFyIGkscz1lKFtdLG4ubGVuZ3RoLHQpLG89cy5sZW5ndGg7d2hpbGUoby0tKW5baT1zW29dXSYmKG5baV09IShyW2ldPW5baV0pKX0pfSl9ZnVuY3Rpb24gb3QoZSx0LG4pe2lmKGU9PT10KXJldHVybiBuO3ZhciByPWUubmV4dFNpYmxpbmc7d2hpbGUocil7aWYocj09PXQpcmV0dXJuLTE7cj1yLm5leHRTaWJsaW5nfXJldHVybiAxfWZ1bmN0aW9uIHV0KGUsdCl7dmFyIG4scixzLG8sdSxhLGYsbD1MW2RdW2VdO2lmKGwpcmV0dXJuIHQ/MDpsLnNsaWNlKDApO3U9ZSxhPVtdLGY9aS5wcmVGaWx0ZXI7d2hpbGUodSl7aWYoIW58fChyPUYuZXhlYyh1KSkpciYmKHU9dS5zbGljZShyWzBdLmxlbmd0aCkpLGEucHVzaChzPVtdKTtuPSExO2lmKHI9SS5leGVjKHUpKXMucHVzaChuPW5ldyBtKHIuc2hpZnQoKSkpLHU9dS5zbGljZShuLmxlbmd0aCksbi50eXBlPXJbMF0ucmVwbGFjZShqLCIgIik7Zm9yKG8gaW4gaS5maWx0ZXIpKHI9SltvXS5leGVjKHUpKSYmKCFmW29dfHwocj1mW29dKHIsZywhMCkpKSYmKHMucHVzaChuPW5ldyBtKHIuc2hpZnQoKSkpLHU9dS5zbGljZShuLmxlbmd0aCksbi50eXBlPW8sbi5tYXRjaGVzPXIpO2lmKCFuKWJyZWFrfXJldHVybiB0P3UubGVuZ3RoOnU/bnQuZXJyb3IoZSk6TChlLGEpLnNsaWNlKDApfWZ1bmN0aW9uIGF0KGUsdCxyKXt2YXIgaT10LmRpcixzPXImJnQuZGlyPT09InBhcmVudE5vZGUiLG89dysrO3JldHVybiB0LmZpcnN0P2Z1bmN0aW9uKHQsbixyKXt3aGlsZSh0PXRbaV0paWYoc3x8dC5ub2RlVHlwZT09PTEpcmV0dXJuIGUodCxuLHIpfTpmdW5jdGlvbih0LHIsdSl7aWYoIXUpe3ZhciBhLGY9YisiICIrbysiICIsbD1mK247d2hpbGUodD10W2ldKWlmKHN8fHQubm9kZVR5cGU9PT0xKXtpZigoYT10W2RdKT09PWwpcmV0dXJuIHQuc2l6c2V0O2lmKHR5cGVvZiBhPT0ic3RyaW5nIiYmYS5pbmRleE9mKGYpPT09MCl7aWYodC5zaXpzZXQpcmV0dXJuIHR9ZWxzZXt0W2RdPWw7aWYoZSh0LHIsdSkpcmV0dXJuIHQuc2l6c2V0PSEwLHQ7dC5zaXpzZXQ9ITF9fX1lbHNlIHdoaWxlKHQ9dFtpXSlpZihzfHx0Lm5vZGVUeXBlPT09MSlpZihlKHQscix1KSlyZXR1cm4gdH19ZnVuY3Rpb24gZnQoZSl7cmV0dXJuIGUubGVuZ3RoPjE/ZnVuY3Rpb24odCxuLHIpe3ZhciBpPWUubGVuZ3RoO3doaWxlKGktLSlpZighZVtpXSh0LG4scikpcmV0dXJuITE7cmV0dXJuITB9OmVbMF19ZnVuY3Rpb24gbHQoZSx0LG4scixpKXt2YXIgcyxvPVtdLHU9MCxhPWUubGVuZ3RoLGY9dCE9bnVsbDtmb3IoO3U8YTt1KyspaWYocz1lW3VdKWlmKCFufHxuKHMscixpKSlvLnB1c2gocyksZiYmdC5wdXNoKHUpO3JldHVybiBvfWZ1bmN0aW9uIGN0KGUsdCxuLHIsaSxzKXtyZXR1cm4gciYmIXJbZF0mJihyPWN0KHIpKSxpJiYhaVtkXSYmKGk9Y3QoaSxzKSksTihmdW5jdGlvbihzLG8sdSxhKXtpZihzJiZpKXJldHVybjt2YXIgZixsLGMsaD1bXSxwPVtdLGQ9by5sZW5ndGgsdj1zfHxkdCh0fHwiKiIsdS5ub2RlVHlwZT9bdV06dSxbXSxzKSxtPWUmJihzfHwhdCk/bHQodixoLGUsdSxhKTp2LGc9bj9pfHwocz9lOmR8fHIpP1tdOm86bTtuJiZuKG0sZyx1LGEpO2lmKHIpe2M9bHQoZyxwKSxyKGMsW10sdSxhKSxmPWMubGVuZ3RoO3doaWxlKGYtLSlpZihsPWNbZl0pZ1twW2ZdXT0hKG1bcFtmXV09bCl9aWYocyl7Zj1lJiZnLmxlbmd0aDt3aGlsZShmLS0paWYobD1nW2ZdKXNbaFtmXV09IShvW2hbZl1dPWwpfWVsc2UgZz1sdChnPT09bz9nLnNwbGljZShkLGcubGVuZ3RoKTpnKSxpP2kobnVsbCxvLGcsYSk6Uy5hcHBseShvLGcpfSl9ZnVuY3Rpb24gaHQoZSl7dmFyIHQsbixyLHM9ZS5sZW5ndGgsbz1pLnJlbGF0aXZlW2VbMF0udHlwZV0sdT1vfHxpLnJlbGF0aXZlWyIgIl0sYT1vPzE6MCxmPWF0KGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dH0sdSwhMCksbD1hdChmdW5jdGlvbihlKXtyZXR1cm4gVC5jYWxsKHQsZSk+LTF9LHUsITApLGg9W2Z1bmN0aW9uKGUsbixyKXtyZXR1cm4hbyYmKHJ8fG4hPT1jKXx8KCh0PW4pLm5vZGVUeXBlP2YoZSxuLHIpOmwoZSxuLHIpKX1dO2Zvcig7YTxzO2ErKylpZihuPWkucmVsYXRpdmVbZVthXS50eXBlXSloPVthdChmdChoKSxuKV07ZWxzZXtuPWkuZmlsdGVyW2VbYV0udHlwZV0uYXBwbHkobnVsbCxlW2FdLm1hdGNoZXMpO2lmKG5bZF0pe3I9KythO2Zvcig7cjxzO3IrKylpZihpLnJlbGF0aXZlW2Vbcl0udHlwZV0pYnJlYWs7cmV0dXJuIGN0KGE+MSYmZnQoaCksYT4xJiZlLnNsaWNlKDAsYS0xKS5qb2luKCIiKS5yZXBsYWNlKGosIiQxIiksbixhPHImJmh0KGUuc2xpY2UoYSxyKSkscjxzJiZodChlPWUuc2xpY2UocikpLHI8cyYmZS5qb2luKCIiKSl9aC5wdXNoKG4pfXJldHVybiBmdChoKX1mdW5jdGlvbiBwdChlLHQpe3ZhciByPXQubGVuZ3RoPjAscz1lLmxlbmd0aD4wLG89ZnVuY3Rpb24odSxhLGYsbCxoKXt2YXIgcCxkLHYsbT1bXSx5PTAsdz0iMCIseD11JiZbXSxUPWghPW51bGwsTj1jLEM9dXx8cyYmaS5maW5kLlRBRygiKiIsaCYmYS5wYXJlbnROb2RlfHxhKSxrPWIrPU49PW51bGw/MTpNYXRoLkU7VCYmKGM9YSE9PWcmJmEsbj1vLmVsKTtmb3IoOyhwPUNbd10pIT1udWxsO3crKyl7aWYocyYmcCl7Zm9yKGQ9MDt2PWVbZF07ZCsrKWlmKHYocCxhLGYpKXtsLnB1c2gocCk7YnJlYWt9VCYmKGI9ayxuPSsrby5lbCl9ciYmKChwPSF2JiZwKSYmeS0tLHUmJngucHVzaChwKSl9eSs9dztpZihyJiZ3IT09eSl7Zm9yKGQ9MDt2PXRbZF07ZCsrKXYoeCxtLGEsZik7aWYodSl7aWYoeT4wKXdoaWxlKHctLSkheFt3XSYmIW1bd10mJihtW3ddPUUuY2FsbChsKSk7bT1sdChtKX1TLmFwcGx5KGwsbSksVCYmIXUmJm0ubGVuZ3RoPjAmJnkrdC5sZW5ndGg+MSYmbnQudW5pcXVlU29ydChsKX1yZXR1cm4gVCYmKGI9ayxjPU4pLHh9O3JldHVybiBvLmVsPTAscj9OKG8pOm99ZnVuY3Rpb24gZHQoZSx0LG4scil7dmFyIGk9MCxzPXQubGVuZ3RoO2Zvcig7aTxzO2krKyludChlLHRbaV0sbixyKTtyZXR1cm4gbn1mdW5jdGlvbiB2dChlLHQsbixyLHMpe3ZhciBvLHUsZixsLGMsaD11dChlKSxwPWgubGVuZ3RoO2lmKCFyJiZoLmxlbmd0aD09PTEpe3U9aFswXT1oWzBdLnNsaWNlKDApO2lmKHUubGVuZ3RoPjImJihmPXVbMF0pLnR5cGU9PT0iSUQiJiZ0Lm5vZGVUeXBlPT09OSYmIXMmJmkucmVsYXRpdmVbdVsxXS50eXBlXSl7dD1pLmZpbmQuSUQoZi5tYXRjaGVzWzBdLnJlcGxhY2UoJCwiIiksdCxzKVswXTtpZighdClyZXR1cm4gbjtlPWUuc2xpY2UodS5zaGlmdCgpLmxlbmd0aCl9Zm9yKG89Si5QT1MudGVzdChlKT8tMTp1Lmxlbmd0aC0xO28+PTA7by0tKXtmPXVbb107aWYoaS5yZWxhdGl2ZVtsPWYudHlwZV0pYnJlYWs7aWYoYz1pLmZpbmRbbF0paWYocj1jKGYubWF0Y2hlc1swXS5yZXBsYWNlKCQsIiIpLHoudGVzdCh1WzBdLnR5cGUpJiZ0LnBhcmVudE5vZGV8fHQscykpe3Uuc3BsaWNlKG8sMSksZT1yLmxlbmd0aCYmdS5qb2luKCIiKTtpZighZSlyZXR1cm4gUy5hcHBseShuLHguY2FsbChyLDApKSxuO2JyZWFrfX19cmV0dXJuIGEoZSxoKShyLHQscyxuLHoudGVzdChlKSksbn1mdW5jdGlvbiBtdCgpe312YXIgbixyLGkscyxvLHUsYSxmLGwsYyxoPSEwLHA9InVuZGVmaW5lZCIsZD0oInNpemNhY2hlIitNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKCIuIiwiIiksbT1TdHJpbmcsZz1lLmRvY3VtZW50LHk9Zy5kb2N1bWVudEVsZW1lbnQsYj0wLHc9MCxFPVtdLnBvcCxTPVtdLnB1c2gseD1bXS5zbGljZSxUPVtdLmluZGV4T2Z8fGZ1bmN0aW9uKGUpe3ZhciB0PTAsbj10aGlzLmxlbmd0aDtmb3IoO3Q8bjt0KyspaWYodGhpc1t0XT09PWUpcmV0dXJuIHQ7cmV0dXJuLTF9LE49ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZVtkXT10PT1udWxsfHx0LGV9LEM9ZnVuY3Rpb24oKXt2YXIgZT17fSx0PVtdO3JldHVybiBOKGZ1bmN0aW9uKG4scil7cmV0dXJuIHQucHVzaChuKT5pLmNhY2hlTGVuZ3RoJiZkZWxldGUgZVt0LnNoaWZ0KCldLGVbbl09cn0sZSl9LGs9QygpLEw9QygpLEE9QygpLE89IltcXHgyMFxcdFxcclxcblxcZl0iLE09Iig/OlxcXFwufFstXFx3XXxbXlxceDAwLVxceGEwXSkrIixfPU0ucmVwbGFjZSgidyIsIncjIiksRD0iKFsqXiR8IX5dPz0pIixQPSJcXFsiK08rIiooIitNKyIpIitPKyIqKD86IitEK08rIiooPzooWydcIl0pKCg/OlxcXFwufFteXFxcXF0pKj8pXFwzfCgiK18rIil8KXwpIitPKyIqXFxdIixIPSI6KCIrTSsiKSg/OlxcKCg/OihbJ1wiXSkoKD86XFxcXC58W15cXFxcXSkqPylcXDJ8KFteKClbXFxdXSp8KD86KD86IitQKyIpfFteOl18XFxcXC4pKnwuKikpXFwpfCkiLEI9IjooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitPKyIqKCg/Oi1cXGQpP1xcZCopIitPKyIqXFwpfCkoPz1bXi1dfCQpIixqPW5ldyBSZWdFeHAoIl4iK08rIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrTysiKyQiLCJnIiksRj1uZXcgUmVnRXhwKCJeIitPKyIqLCIrTysiKiIpLEk9bmV3IFJlZ0V4cCgiXiIrTysiKihbXFx4MjBcXHRcXHJcXG5cXGY+K35dKSIrTysiKiIpLHE9bmV3IFJlZ0V4cChIKSxSPS9eKD86IyhbXHdcLV0rKXwoXHcrKXxcLihbXHdcLV0rKSkkLyxVPS9eOm5vdC8sej0vW1x4MjBcdFxyXG5cZl0qWyt+XS8sVz0vOm5vdFwoJC8sWD0vaFxkL2ksVj0vaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbi9pLCQ9L1xcKD8hXFwpL2csSj17SUQ6bmV3IFJlZ0V4cCgiXiMoIitNKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK00rIikiKSxOQU1FOm5ldyBSZWdFeHAoIl5cXFtuYW1lPVsnXCJdPygiK00rIilbJ1wiXT9cXF0iKSxUQUc6bmV3IFJlZ0V4cCgiXigiK00ucmVwbGFjZSgidyIsIncqIikrIikiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK1ApLFBTRVVETzpuZXcgUmVnRXhwKCJeIitIKSxQT1M6bmV3IFJlZ0V4cChCLCJpIiksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxudGh8Zmlyc3R8bGFzdCktY2hpbGQoPzpcXCgiK08rIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK08rIiooPzooWystXXwpIitPKyIqKFxcZCspfCkpIitPKyIqXFwpfCkiLCJpIiksbmVlZHNDb250ZXh0Om5ldyBSZWdFeHAoIl4iK08rIipbPit+XXwiK0IsImkiKX0sSz1mdW5jdGlvbihlKXt2YXIgdD1nLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RyeXtyZXR1cm4gZSh0KX1jYXRjaChuKXtyZXR1cm4hMX1maW5hbGx5e3Q9bnVsbH19LFE9SyhmdW5jdGlvbihlKXtyZXR1cm4gZS5hcHBlbmRDaGlsZChnLmNyZWF0ZUNvbW1lbnQoIiIpKSwhZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLEc9SyhmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLGUuZmlyc3RDaGlsZCYmdHlwZW9mIGUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUhPT1wJiZlLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIik9PT0iIyJ9KSxZPUsoZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9IjxzZWxlY3Q+PC9zZWxlY3Q+Ijt2YXIgdD10eXBlb2YgZS5sYXN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJtdWx0aXBsZSIpO3JldHVybiB0IT09ImJvb2xlYW4iJiZ0IT09InN0cmluZyJ9KSxaPUsoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8ZGl2IGNsYXNzPSdoaWRkZW4gZSc+PC9kaXY+PGRpdiBjbGFzcz0naGlkZGVuJz48L2Rpdj4iLCFlLmdldEVsZW1lbnRzQnlDbGFzc05hbWV8fCFlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGg/ITE6KGUubGFzdENoaWxkLmNsYXNzTmFtZT0iZSIsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoPT09Mil9KSxldD1LKGZ1bmN0aW9uKGUpe2UuaWQ9ZCswLGUuaW5uZXJIVE1MPSI8YSBuYW1lPSciK2QrIic+PC9hPjxkaXYgbmFtZT0nIitkKyInPjwvZGl2PiIseS5pbnNlcnRCZWZvcmUoZSx5LmZpcnN0Q2hpbGQpO3ZhciB0PWcuZ2V0RWxlbWVudHNCeU5hbWUmJmcuZ2V0RWxlbWVudHNCeU5hbWUoZCkubGVuZ3RoPT09MitnLmdldEVsZW1lbnRzQnlOYW1lKGQrMCkubGVuZ3RoO3JldHVybiByPSFnLmdldEVsZW1lbnRCeUlkKGQpLHkucmVtb3ZlQ2hpbGQoZSksdH0pO3RyeXt4LmNhbGwoeS5jaGlsZE5vZGVzLDApWzBdLm5vZGVUeXBlfWNhdGNoKHR0KXt4PWZ1bmN0aW9uKGUpe3ZhciB0LG49W107Zm9yKDt0PXRoaXNbZV07ZSsrKW4ucHVzaCh0KTtyZXR1cm4gbn19bnQubWF0Y2hlcz1mdW5jdGlvbihlLHQpe3JldHVybiBudChlLG51bGwsbnVsbCx0KX0sbnQubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG50KHQsbnVsbCxudWxsLFtlXSkubGVuZ3RoPjB9LHM9bnQuZ2V0VGV4dD1mdW5jdGlvbihlKXt2YXIgdCxuPSIiLHI9MCxpPWUubm9kZVR5cGU7aWYoaSl7aWYoaT09PTF8fGk9PT05fHxpPT09MTEpe2lmKHR5cGVvZiBlLnRleHRDb250ZW50PT0ic3RyaW5nIilyZXR1cm4gZS50ZXh0Q29udGVudDtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpbis9cyhlKX1lbHNlIGlmKGk9PT0zfHxpPT09NClyZXR1cm4gZS5ub2RlVmFsdWV9ZWxzZSBmb3IoO3Q9ZVtyXTtyKyspbis9cyh0KTtyZXR1cm4gbn0sbz1udC5pc1hNTD1mdW5jdGlvbihlKXt2YXIgdD1lJiYoZS5vd25lckRvY3VtZW50fHxlKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIHQ/dC5ub2RlTmFtZSE9PSJIVE1MIjohMX0sdT1udC5jb250YWlucz15LmNvbnRhaW5zP2Z1bmN0aW9uKGUsdCl7dmFyIG49ZS5ub2RlVHlwZT09PTk/ZS5kb2N1bWVudEVsZW1lbnQ6ZSxyPXQmJnQucGFyZW50Tm9kZTtyZXR1cm4gZT09PXJ8fCEhKHImJnIubm9kZVR5cGU9PT0xJiZuLmNvbnRhaW5zJiZuLmNvbnRhaW5zKHIpKX06eS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9mdW5jdGlvbihlLHQpe3JldHVybiB0JiYhIShlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpJjE2KX06ZnVuY3Rpb24oZSx0KXt3aGlsZSh0PXQucGFyZW50Tm9kZSlpZih0PT09ZSlyZXR1cm4hMDtyZXR1cm4hMX0sbnQuYXR0cj1mdW5jdGlvbihlLHQpe3ZhciBuLHI9byhlKTtyZXR1cm4gcnx8KHQ9dC50b0xvd2VyQ2FzZSgpKSwobj1pLmF0dHJIYW5kbGVbdF0pP24oZSk6cnx8WT9lLmdldEF0dHJpYnV0ZSh0KToobj1lLmdldEF0dHJpYnV0ZU5vZGUodCksbj90eXBlb2YgZVt0XT09ImJvb2xlYW4iP2VbdF0/dDpudWxsOm4uc3BlY2lmaWVkP24udmFsdWU6bnVsbDpudWxsKX0saT1udC5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpOLG1hdGNoOkosYXR0ckhhbmRsZTpHP3t9OntocmVmOmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSgiaHJlZiIsMil9LHR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlKCJ0eXBlIil9fSxmaW5kOntJRDpyP2Z1bmN0aW9uKGUsdCxuKXtpZih0eXBlb2YgdC5nZXRFbGVtZW50QnlJZCE9PXAmJiFuKXt2YXIgcj10LmdldEVsZW1lbnRCeUlkKGUpO3JldHVybiByJiZyLnBhcmVudE5vZGU/W3JdOltdfX06ZnVuY3Rpb24oZSxuLHIpe2lmKHR5cGVvZiBuLmdldEVsZW1lbnRCeUlkIT09cCYmIXIpe3ZhciBpPW4uZ2V0RWxlbWVudEJ5SWQoZSk7cmV0dXJuIGk/aS5pZD09PWV8fHR5cGVvZiBpLmdldEF0dHJpYnV0ZU5vZGUhPT1wJiZpLmdldEF0dHJpYnV0ZU5vZGUoImlkIikudmFsdWU9PT1lP1tpXTp0OltdfX0sVEFHOlE/ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgdC5nZXRFbGVtZW50c0J5VGFnTmFtZSE9PXApcmV0dXJuIHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSl9OmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKTtpZihlPT09IioiKXt2YXIgcixpPVtdLHM9MDtmb3IoO3I9bltzXTtzKyspci5ub2RlVHlwZT09PTEmJmkucHVzaChyKTtyZXR1cm4gaX1yZXR1cm4gbn0sTkFNRTpldCYmZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgdC5nZXRFbGVtZW50c0J5TmFtZSE9PXApcmV0dXJuIHQuZ2V0RWxlbWVudHNCeU5hbWUobmFtZSl9LENMQVNTOlomJmZ1bmN0aW9uKGUsdCxuKXtpZih0eXBlb2YgdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lIT09cCYmIW4pcmV0dXJuIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShlKX19LHJlbGF0aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVbMV0ucmVwbGFjZSgkLCIiKSxlWzNdPShlWzRdfHxlWzVdfHwiIikucmVwbGFjZSgkLCIiKSxlWzJdPT09In49IiYmKGVbM109IiAiK2VbM10rIiAiKSxlLnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVbMV0udG9Mb3dlckNhc2UoKSxlWzFdPT09Im50aCI/KGVbMl18fG50LmVycm9yKGVbMF0pLGVbM109KyhlWzNdP2VbNF0rKGVbNV18fDEpOjIqKGVbMl09PT0iZXZlbiJ8fGVbMl09PT0ib2RkIikpLGVbNF09KyhlWzZdK2VbN118fGVbMl09PT0ib2RkIikpOmVbMl0mJm50LmVycm9yKGVbMF0pLGV9LFBTRVVETzpmdW5jdGlvbihlKXt2YXIgdCxuO2lmKEouQ0hJTEQudGVzdChlWzBdKSlyZXR1cm4gbnVsbDtpZihlWzNdKWVbMl09ZVszXTtlbHNlIGlmKHQ9ZVs0XSlxLnRlc3QodCkmJihuPXV0KHQsITApKSYmKG49dC5pbmRleE9mKCIpIix0Lmxlbmd0aC1uKS10Lmxlbmd0aCkmJih0PXQuc2xpY2UoMCxuKSxlWzBdPWVbMF0uc2xpY2UoMCxuKSksZVsyXT10O3JldHVybiBlLnNsaWNlKDAsMyl9fSxmaWx0ZXI6e0lEOnI/ZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZS5yZXBsYWNlKCQsIiIpLGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEF0dHJpYnV0ZSgiaWQiKT09PWV9fTpmdW5jdGlvbihlKXtyZXR1cm4gZT1lLnJlcGxhY2UoJCwiIiksZnVuY3Rpb24odCl7dmFyIG49dHlwZW9mIHQuZ2V0QXR0cmlidXRlTm9kZSE9PXAmJnQuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gbiYmbi52YWx1ZT09PWV9fSxUQUc6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT0iKiI/ZnVuY3Rpb24oKXtyZXR1cm4hMH06KGU9ZS5yZXBsYWNlKCQsIiIpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24odCl7cmV0dXJuIHQubm9kZU5hbWUmJnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWV9KX0sQ0xBU1M6ZnVuY3Rpb24oZSl7dmFyIHQ9a1tkXVtlXTtyZXR1cm4gdHx8KHQ9ayhlLG5ldyBSZWdFeHAoIihefCIrTysiKSIrZSsiKCIrTysifCQpIikpKSxmdW5jdGlvbihlKXtyZXR1cm4gdC50ZXN0KGUuY2xhc3NOYW1lfHx0eXBlb2YgZS5nZXRBdHRyaWJ1dGUhPT1wJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfX0sQVRUUjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKHIsaSl7dmFyIHM9bnQuYXR0cihyLGUpO3JldHVybiBzPT1udWxsP3Q9PT0iIT0iOnQ/KHMrPSIiLHQ9PT0iPSI/cz09PW46dD09PSIhPSI/cyE9PW46dD09PSJePSI/biYmcy5pbmRleE9mKG4pPT09MDp0PT09Iio9Ij9uJiZzLmluZGV4T2Yobik+LTE6dD09PSIkPSI/biYmcy5zdWJzdHIocy5sZW5ndGgtbi5sZW5ndGgpPT09bjp0PT09In49Ij8oIiAiK3MrIiAiKS5pbmRleE9mKG4pPi0xOnQ9PT0ifD0iP3M9PT1ufHxzLnN1YnN0cigwLG4ubGVuZ3RoKzEpPT09bisiLSI6ITEpOiEwfX0sQ0hJTEQ6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIGU9PT0ibnRoIj9mdW5jdGlvbihlKXt2YXIgdCxpLHM9ZS5wYXJlbnROb2RlO2lmKG49PT0xJiZyPT09MClyZXR1cm4hMDtpZihzKXtpPTA7Zm9yKHQ9cy5maXJzdENoaWxkO3Q7dD10Lm5leHRTaWJsaW5nKWlmKHQubm9kZVR5cGU9PT0xKXtpKys7aWYoZT09PXQpYnJlYWt9fXJldHVybiBpLT1yLGk9PT1ufHxpJW49PT0wJiZpL24+PTB9OmZ1bmN0aW9uKHQpe3ZhciBuPXQ7c3dpdGNoKGUpe2Nhc2Uib25seSI6Y2FzZSJmaXJzdCI6d2hpbGUobj1uLnByZXZpb3VzU2libGluZylpZihuLm5vZGVUeXBlPT09MSlyZXR1cm4hMTtpZihlPT09ImZpcnN0IilyZXR1cm4hMDtuPXQ7Y2FzZSJsYXN0Ijp3aGlsZShuPW4ubmV4dFNpYmxpbmcpaWYobi5ub2RlVHlwZT09PTEpcmV0dXJuITE7cmV0dXJuITB9fX0sUFNFVURPOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1pLnBzZXVkb3NbZV18fGkuc2V0RmlsdGVyc1tlLnRvTG93ZXJDYXNlKCldfHxudC5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2UpO3JldHVybiByW2RdP3IodCk6ci5sZW5ndGg+MT8obj1bZSxlLCIiLHRdLGkuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpP04oZnVuY3Rpb24oZSxuKXt2YXIgaSxzPXIoZSx0KSxvPXMubGVuZ3RoO3doaWxlKG8tLSlpPVQuY2FsbChlLHNbb10pLGVbaV09IShuW2ldPXNbb10pfSk6ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZSwwLG4pfSk6cn19LHBzZXVkb3M6e25vdDpOKGZ1bmN0aW9uKGUpe3ZhciB0PVtdLG49W10scj1hKGUucmVwbGFjZShqLCIkMSIpKTtyZXR1cm4gcltkXT9OKGZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBzLG89cihlLG51bGwsaSxbXSksdT1lLmxlbmd0aDt3aGlsZSh1LS0paWYocz1vW3VdKWVbdV09ISh0W3VdPXMpfSk6ZnVuY3Rpb24oZSxpLHMpe3JldHVybiB0WzBdPWUscih0LG51bGwscyxuKSwhbi5wb3AoKX19KSxoYXM6TihmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG50KGUsdCkubGVuZ3RoPjB9fSksY29udGFpbnM6TihmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuKHQudGV4dENvbnRlbnR8fHQuaW5uZXJUZXh0fHxzKHQpKS5pbmRleE9mKGUpPi0xfX0pLGVuYWJsZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZGlzYWJsZWQ9PT0hMX0sZGlzYWJsZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZGlzYWJsZWQ9PT0hMH0sY2hlY2tlZDpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHQ9PT0iaW5wdXQiJiYhIWUuY2hlY2tlZHx8dD09PSJvcHRpb24iJiYhIWUuc2VsZWN0ZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKGUpe3JldHVybiBlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LGUuc2VsZWN0ZWQ9PT0hMH0scGFyZW50OmZ1bmN0aW9uKGUpe3JldHVybiFpLnBzZXVkb3MuZW1wdHkoZSl9LGVtcHR5OmZ1bmN0aW9uKGUpe3ZhciB0O2U9ZS5maXJzdENoaWxkO3doaWxlKGUpe2lmKGUubm9kZU5hbWU+IkAifHwodD1lLm5vZGVUeXBlKT09PTN8fHQ9PT00KXJldHVybiExO2U9ZS5uZXh0U2libGluZ31yZXR1cm4hMH0saGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBYLnRlc3QoZS5ub2RlTmFtZSl9LHRleHQ6ZnVuY3Rpb24oZSl7dmFyIHQsbjtyZXR1cm4gZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmKHQ9ZS50eXBlKT09PSJ0ZXh0IiYmKChuPWUuZ2V0QXR0cmlidXRlKCJ0eXBlIikpPT1udWxsfHxuLnRvTG93ZXJDYXNlKCk9PT10KX0scmFkaW86cnQoInJhZGlvIiksY2hlY2tib3g6cnQoImNoZWNrYm94IiksZmlsZTpydCgiZmlsZSIpLHBhc3N3b3JkOnJ0KCJwYXNzd29yZCIpLGltYWdlOnJ0KCJpbWFnZSIpLHN1Ym1pdDppdCgic3VibWl0IikscmVzZXQ6aXQoInJlc2V0IiksYnV0dG9uOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gdD09PSJpbnB1dCImJmUudHlwZT09PSJidXR0b24ifHx0PT09ImJ1dHRvbiJ9LGlucHV0OmZ1bmN0aW9uKGUpe3JldHVybiBWLnRlc3QoZS5ub2RlTmFtZSl9LGZvY3VzOmZ1bmN0aW9uKGUpe3ZhciB0PWUub3duZXJEb2N1bWVudDtyZXR1cm4gZT09PXQuYWN0aXZlRWxlbWVudCYmKCF0Lmhhc0ZvY3VzfHx0Lmhhc0ZvY3VzKCkpJiYoISFlLnR5cGV8fCEhZS5ocmVmKX0sYWN0aXZlOmZ1bmN0aW9uKGUpe3JldHVybiBlPT09ZS5vd25lckRvY3VtZW50LmFjdGl2ZUVsZW1lbnR9LGZpcnN0OnN0KGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm5bMF19KSxsYXN0OnN0KGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm5bdC0xXX0pLGVxOnN0KGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm5bbjwwP24rdDpuXX0pLGV2ZW46c3QoZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj0wO3I8dDtyKz0yKWUucHVzaChyKTtyZXR1cm4gZX0pLG9kZDpzdChmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPTE7cjx0O3IrPTIpZS5wdXNoKHIpO3JldHVybiBlfSksbHQ6c3QoZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1uPDA/bit0Om47LS1yPj0wOyllLnB1c2gocik7cmV0dXJuIGV9KSxndDpzdChmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPW48MD9uK3Q6bjsrK3I8dDspZS5wdXNoKHIpO3JldHVybiBlfSl9fSxmPXkuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PXQ/KGw9ITAsMCk6KCFlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9ufHwhdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9lLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCkmNCk/LTE6MX06ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4gbD0hMCwwO2lmKGUuc291cmNlSW5kZXgmJnQuc291cmNlSW5kZXgpcmV0dXJuIGUuc291cmNlSW5kZXgtdC5zb3VyY2VJbmRleDt2YXIgbixyLGk9W10scz1bXSxvPWUucGFyZW50Tm9kZSx1PXQucGFyZW50Tm9kZSxhPW87aWYobz09PXUpcmV0dXJuIG90KGUsdCk7aWYoIW8pcmV0dXJuLTE7aWYoIXUpcmV0dXJuIDE7d2hpbGUoYSlpLnVuc2hpZnQoYSksYT1hLnBhcmVudE5vZGU7YT11O3doaWxlKGEpcy51bnNoaWZ0KGEpLGE9YS5wYXJlbnROb2RlO249aS5sZW5ndGgscj1zLmxlbmd0aDtmb3IodmFyIGY9MDtmPG4mJmY8cjtmKyspaWYoaVtmXSE9PXNbZl0pcmV0dXJuIG90KGlbZl0sc1tmXSk7cmV0dXJuIGY9PT1uP290KGUsc1tmXSwtMSk6b3QoaVtmXSx0LDEpfSxbMCwwXS5zb3J0KGYpLGg9IWwsbnQudW5pcXVlU29ydD1mdW5jdGlvbihlKXt2YXIgdCxuPTE7bD1oLGUuc29ydChmKTtpZihsKWZvcig7dD1lW25dO24rKyl0PT09ZVtuLTFdJiZlLnNwbGljZShuLS0sMSk7cmV0dXJuIGV9LG50LmVycm9yPWZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIitlKX0sYT1udC5jb21waWxlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPVtdLHM9QVtkXVtlXTtpZighcyl7dHx8KHQ9dXQoZSkpLG49dC5sZW5ndGg7d2hpbGUobi0tKXM9aHQodFtuXSksc1tkXT9yLnB1c2gocyk6aS5wdXNoKHMpO3M9QShlLHB0KGkscikpfXJldHVybiBzfSxnLnF1ZXJ5U2VsZWN0b3JBbGwmJmZ1bmN0aW9uKCl7dmFyIGUsdD12dCxuPS8nfFxcL2cscj0vXD1bXHgyMFx0XHJcblxmXSooW14nIlxdXSopW1x4MjBcdFxyXG5cZl0qXF0vZyxpPVsiOmZvY3VzIl0scz1bIjphY3RpdmUiLCI6Zm9jdXMiXSx1PXkubWF0Y2hlc1NlbGVjdG9yfHx5Lm1vek1hdGNoZXNTZWxlY3Rvcnx8eS53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fHkub01hdGNoZXNTZWxlY3Rvcnx8eS5tc01hdGNoZXNTZWxlY3RvcjtLKGZ1bmN0aW9uKGUpe2UuaW5uZXJIVE1MPSI8c2VsZWN0PjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IixlLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fGkucHVzaCgiXFxbIitPKyIqKD86Y2hlY2tlZHxkaXNhYmxlZHxpc21hcHxtdWx0aXBsZXxyZWFkb25seXxzZWxlY3RlZHx2YWx1ZSkiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxpLnB1c2goIjpjaGVja2VkIil9KSxLKGZ1bmN0aW9uKGUpe2UuaW5uZXJIVE1MPSI8cCB0ZXN0PScnPjwvcD4iLGUucXVlcnlTZWxlY3RvckFsbCgiW3Rlc3RePScnXSIpLmxlbmd0aCYmaS5wdXNoKCJbKl4kXT0iK08rIiooPzpcIlwifCcnKSIpLGUuaW5uZXJIVE1MPSI8aW5wdXQgdHlwZT0naGlkZGVuJy8+IixlLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RofHxpLnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIil9KSxpPW5ldyBSZWdFeHAoaS5qb2luKCJ8IikpLHZ0PWZ1bmN0aW9uKGUscixzLG8sdSl7aWYoIW8mJiF1JiYoIWl8fCFpLnRlc3QoZSkpKXt2YXIgYSxmLGw9ITAsYz1kLGg9cixwPXIubm9kZVR5cGU9PT05JiZlO2lmKHIubm9kZVR5cGU9PT0xJiZyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT0ib2JqZWN0Iil7YT11dChlKSwobD1yLmdldEF0dHJpYnV0ZSgiaWQiKSk/Yz1sLnJlcGxhY2UobiwiXFwkJiIpOnIuc2V0QXR0cmlidXRlKCJpZCIsYyksYz0iW2lkPSciK2MrIiddICIsZj1hLmxlbmd0aDt3aGlsZShmLS0pYVtmXT1jK2FbZl0uam9pbigiIik7aD16LnRlc3QoZSkmJnIucGFyZW50Tm9kZXx8cixwPWEuam9pbigiLCIpfWlmKHApdHJ5e3JldHVybiBTLmFwcGx5KHMseC5jYWxsKGgucXVlcnlTZWxlY3RvckFsbChwKSwwKSksc31jYXRjaCh2KXt9ZmluYWxseXtsfHxyLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19cmV0dXJuIHQoZSxyLHMsbyx1KX0sdSYmKEsoZnVuY3Rpb24odCl7ZT11LmNhbGwodCwiZGl2Iik7dHJ5e3UuY2FsbCh0LCJbdGVzdCE9JyddOnNpenpsZSIpLHMucHVzaCgiIT0iLEgpfWNhdGNoKG4pe319KSxzPW5ldyBSZWdFeHAocy5qb2luKCJ8IikpLG50Lm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbih0LG4pe249bi5yZXBsYWNlKHIsIj0nJDEnXSIpO2lmKCFvKHQpJiYhcy50ZXN0KG4pJiYoIWl8fCFpLnRlc3QobikpKXRyeXt2YXIgYT11LmNhbGwodCxuKTtpZihhfHxlfHx0LmRvY3VtZW50JiZ0LmRvY3VtZW50Lm5vZGVUeXBlIT09MTEpcmV0dXJuIGF9Y2F0Y2goZil7fXJldHVybiBudChuLG51bGwsbnVsbCxbdF0pLmxlbmd0aD4wfSl9KCksaS5wc2V1ZG9zLm50aD1pLnBzZXVkb3MuZXEsaS5maWx0ZXJzPW10LnByb3RvdHlwZT1pLnBzZXVkb3MsaS5zZXRGaWx0ZXJzPW5ldyBtdCxudC5hdHRyPXYuYXR0cix2LmZpbmQ9bnQsdi5leHByPW50LnNlbGVjdG9ycyx2LmV4cHJbIjoiXT12LmV4cHIucHNldWRvcyx2LnVuaXF1ZT1udC51bmlxdWVTb3J0LHYudGV4dD1udC5nZXRUZXh0LHYuaXNYTUxEb2M9bnQuaXNYTUwsdi5jb250YWlucz1udC5jb250YWluc30oZSk7dmFyIG50PS9VbnRpbCQvLHJ0PS9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLGl0PS9eLlteOiNcW1wuLF0qJC8sc3Q9di5leHByLm1hdGNoLm5lZWRzQ29udGV4dCxvdD17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTt2LmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxzLG8sdT10aGlzO2lmKHR5cGVvZiBlIT0ic3RyaW5nIilyZXR1cm4gdihlKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodD0wLG49dS5sZW5ndGg7dDxuO3QrKylpZih2LmNvbnRhaW5zKHVbdF0sdGhpcykpcmV0dXJuITB9KTtvPXRoaXMucHVzaFN0YWNrKCIiLCJmaW5kIixlKTtmb3IodD0wLG49dGhpcy5sZW5ndGg7dDxuO3QrKyl7cj1vLmxlbmd0aCx2LmZpbmQoZSx0aGlzW3RdLG8pO2lmKHQ+MClmb3IoaT1yO2k8by5sZW5ndGg7aSsrKWZvcihzPTA7czxyO3MrKylpZihvW3NdPT09b1tpXSl7by5zcGxpY2UoaS0tLDEpO2JyZWFrfX1yZXR1cm4gb30saGFzOmZ1bmN0aW9uKGUpe3ZhciB0LG49dihlLHRoaXMpLHI9bi5sZW5ndGg7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHQ9MDt0PHI7dCsrKWlmKHYuY29udGFpbnModGhpcyxuW3RdKSlyZXR1cm4hMH0pfSxub3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGZ0KHRoaXMsZSwhMSksIm5vdCIsZSl9LGZpbHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZnQodGhpcyxlLCEwKSwiZmlsdGVyIixlKX0saXM6ZnVuY3Rpb24oZSl7cmV0dXJuISFlJiYodHlwZW9mIGU9PSJzdHJpbmciP3N0LnRlc3QoZSk/dihlLHRoaXMuY29udGV4dCkuaW5kZXgodGhpc1swXSk+PTA6di5maWx0ZXIoZSx0aGlzKS5sZW5ndGg+MDp0aGlzLmZpbHRlcihlKS5sZW5ndGg+MCl9LGNsb3Nlc3Q6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTAsaT10aGlzLmxlbmd0aCxzPVtdLG89c3QudGVzdChlKXx8dHlwZW9mIGUhPSJzdHJpbmciP3YoZSx0fHx0aGlzLmNvbnRleHQpOjA7Zm9yKDtyPGk7cisrKXtuPXRoaXNbcl07d2hpbGUobiYmbi5vd25lckRvY3VtZW50JiZuIT09dCYmbi5ub2RlVHlwZSE9PTExKXtpZihvP28uaW5kZXgobik+LTE6di5maW5kLm1hdGNoZXNTZWxlY3RvcihuLGUpKXtzLnB1c2gobik7YnJlYWt9bj1uLnBhcmVudE5vZGV9fXJldHVybiBzPXMubGVuZ3RoPjE/di51bmlxdWUocyk6cyx0aGlzLnB1c2hTdGFjayhzLCJjbG9zZXN0IixlKX0saW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/dHlwZW9mIGU9PSJzdHJpbmciP3YuaW5BcnJheSh0aGlzWzBdLHYoZSkpOnYuaW5BcnJheShlLmpxdWVyeT9lWzBdOmUsdGhpcyk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMucHJldkFsbCgpLmxlbmd0aDotMX0sYWRkOmZ1bmN0aW9uKGUsdCl7dmFyIG49dHlwZW9mIGU9PSJzdHJpbmciP3YoZSx0KTp2Lm1ha2VBcnJheShlJiZlLm5vZGVUeXBlP1tlXTplKSxyPXYubWVyZ2UodGhpcy5nZXQoKSxuKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2sodXQoblswXSl8fHV0KHJbMF0pP3I6di51bmlxdWUocikpfSxhZGRCYWNrOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmFkZChlPT1udWxsP3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKGUpKX19KSx2LmZuLmFuZFNlbGY9di5mbi5hZGRCYWNrLHYuZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmdC5ub2RlVHlwZSE9PTExP3Q6bnVsbH0scGFyZW50czpmdW5jdGlvbihlKXtyZXR1cm4gdi5kaXIoZSwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2LmRpcihlLCJwYXJlbnROb2RlIixuKX0sbmV4dDpmdW5jdGlvbihlKXtyZXR1cm4gYXQoZSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihlKXtyZXR1cm4gYXQoZSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIHYuZGlyKGUsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIHYuZGlyKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2LmRpcihlLCJuZXh0U2libGluZyIsbil9LHByZXZVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHYuZGlyKGUsInByZXZpb3VzU2libGluZyIsbil9LHNpYmxpbmdzOmZ1bmN0aW9uKGUpe3JldHVybiB2LnNpYmxpbmcoKGUucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsZSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGUpe3JldHVybiB2LnNpYmxpbmcoZS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuIHYubm9kZU5hbWUoZSwiaWZyYW1lIik/ZS5jb250ZW50RG9jdW1lbnR8fGUuY29udGVudFdpbmRvdy5kb2N1bWVudDp2Lm1lcmdlKFtdLGUuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihlLHQpe3YuZm5bZV09ZnVuY3Rpb24obixyKXt2YXIgaT12Lm1hcCh0aGlzLHQsbik7cmV0dXJuIG50LnRlc3QoZSl8fChyPW4pLHImJnR5cGVvZiByPT0ic3RyaW5nIiYmKGk9di5maWx0ZXIocixpKSksaT10aGlzLmxlbmd0aD4xJiYhb3RbZV0/di51bmlxdWUoaSk6aSx0aGlzLmxlbmd0aD4xJiZydC50ZXN0KGUpJiYoaT1pLnJldmVyc2UoKSksdGhpcy5wdXNoU3RhY2soaSxlLGwuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSl9fSksdi5leHRlbmQoe2ZpbHRlcjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIG4mJihlPSI6bm90KCIrZSsiKSIpLHQubGVuZ3RoPT09MT92LmZpbmQubWF0Y2hlc1NlbGVjdG9yKHRbMF0sZSk/W3RbMF1dOltdOnYuZmluZC5tYXRjaGVzKGUsdCl9LGRpcjpmdW5jdGlvbihlLG4scil7dmFyIGk9W10scz1lW25dO3doaWxlKHMmJnMubm9kZVR5cGUhPT05JiYocj09PXR8fHMubm9kZVR5cGUhPT0xfHwhdihzKS5pcyhyKSkpcy5ub2RlVHlwZT09PTEmJmkucHVzaChzKSxzPXNbbl07cmV0dXJuIGl9LHNpYmxpbmc6ZnVuY3Rpb24oZSx0KXt2YXIgbj1bXTtmb3IoO2U7ZT1lLm5leHRTaWJsaW5nKWUubm9kZVR5cGU9PT0xJiZlIT09dCYmbi5wdXNoKGUpO3JldHVybiBufX0pO3ZhciBjdD0iYWJicnxhcnRpY2xlfGFzaWRlfGF1ZGlvfGJkaXxjYW52YXN8ZGF0YXxkYXRhbGlzdHxkZXRhaWxzfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnxoZWFkZXJ8aGdyb3VwfG1hcmt8bWV0ZXJ8bmF2fG91dHB1dHxwcm9ncmVzc3xzZWN0aW9ufHN1bW1hcnl8dGltZXx2aWRlbyIsaHQ9LyBqUXVlcnlcZCs9Iig/Om51bGx8XGQrKSIvZyxwdD0vXlxzKy8sZHQ9LzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Ol0rKVtePl0qKVwvPi9naSx2dD0vPChbXHc6XSspLyxtdD0vPHRib2R5L2ksZ3Q9Lzx8JiM/XHcrOy8seXQ9LzwoPzpzY3JpcHR8c3R5bGV8bGluaykvaSxidD0vPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLHd0PW5ldyBSZWdFeHAoIjwoPzoiK2N0KyIpW1xccy8+XSIsImkiKSxFdD0vXig/OmNoZWNrYm94fHJhZGlvKSQvLFN0PS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLHh0PS9cLyhqYXZhfGVjbWEpc2NyaXB0L2ksVHQ9L15ccyo8ISg/OlxbQ0RBVEFcW3xcLVwtKXxbXF1cLV17Mn0+XHMqJC9nLE50PXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSxsZWdlbmQ6WzEsIjxmaWVsZHNldD4iLCI8L2ZpZWxkc2V0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sYXJlYTpbMSwiPG1hcD4iLCI8L21hcD4iXSxfZGVmYXVsdDpbMCwiIiwiIl19LEN0PWx0KGkpLGt0PUN0LmFwcGVuZENoaWxkKGkuY3JlYXRlRWxlbWVudCgiZGl2IikpO050Lm9wdGdyb3VwPU50Lm9wdGlvbixOdC50Ym9keT1OdC50Zm9vdD1OdC5jb2xncm91cD1OdC5jYXB0aW9uPQpOdC50aGVhZCxOdC50aD1OdC50ZCx2LnN1cHBvcnQuaHRtbFNlcmlhbGl6ZXx8KE50Ll9kZWZhdWx0PVsxLCJYPGRpdj4iLCI8L2Rpdj4iXSksdi5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHYuYWNjZXNzKHRoaXMsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10P3YudGV4dCh0aGlzKTp0aGlzLmVtcHR5KCkuYXBwZW5kKCh0aGlzWzBdJiZ0aGlzWzBdLm93bmVyRG9jdW1lbnR8fGkpLmNyZWF0ZVRleHROb2RlKGUpKX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSx3cmFwQWxsOmZ1bmN0aW9uKGUpe2lmKHYuaXNGdW5jdGlvbihlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3YodGhpcykud3JhcEFsbChlLmNhbGwodGhpcyx0KSl9KTtpZih0aGlzWzBdKXt2YXIgdD12KGUsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCk7dGhpc1swXS5wYXJlbnROb2RlJiZ0Lmluc2VydEJlZm9yZSh0aGlzWzBdKSx0Lm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXM7d2hpbGUoZS5maXJzdENoaWxkJiZlLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT0xKWU9ZS5maXJzdENoaWxkO3JldHVybiBlfSkuYXBwZW5kKHRoaXMpfXJldHVybiB0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHYuaXNGdW5jdGlvbihlKT90aGlzLmVhY2goZnVuY3Rpb24odCl7dih0aGlzKS53cmFwSW5uZXIoZS5jYWxsKHRoaXMsdCkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9dih0aGlzKSxuPXQuY29udGVudHMoKTtuLmxlbmd0aD9uLndyYXBBbGwoZSk6dC5hcHBlbmQoZSl9KX0sd3JhcDpmdW5jdGlvbihlKXt2YXIgdD12LmlzRnVuY3Rpb24oZSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihuKXt2KHRoaXMpLndyYXBBbGwodD9lLmNhbGwodGhpcyxuKTplKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7di5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fHYodGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITAsZnVuY3Rpb24oZSl7KHRoaXMubm9kZVR5cGU9PT0xfHx0aGlzLm5vZGVUeXBlPT09MTEpJiZ0aGlzLmFwcGVuZENoaWxkKGUpfSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITAsZnVuY3Rpb24oZSl7KHRoaXMubm9kZVR5cGU9PT0xfHx0aGlzLm5vZGVUeXBlPT09MTEpJiZ0aGlzLmluc2VydEJlZm9yZShlLHRoaXMuZmlyc3RDaGlsZCl9KX0sYmVmb3JlOmZ1bmN0aW9uKCl7aWYoIXV0KHRoaXNbMF0pKXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMSxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcyl9KTtpZihhcmd1bWVudHMubGVuZ3RoKXt2YXIgZT12LmNsZWFuKGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHYubWVyZ2UoZSx0aGlzKSwiYmVmb3JlIix0aGlzLnNlbGVjdG9yKX19LGFmdGVyOmZ1bmN0aW9uKCl7aWYoIXV0KHRoaXNbMF0pKXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMSxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcy5uZXh0U2libGluZyl9KTtpZihhcmd1bWVudHMubGVuZ3RoKXt2YXIgZT12LmNsZWFuKGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHYubWVyZ2UodGhpcyxlKSwiYWZ0ZXIiLHRoaXMuc2VsZWN0b3IpfX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wO2Zvcig7KG49dGhpc1tyXSkhPW51bGw7cisrKWlmKCFlfHx2LmZpbHRlcihlLFtuXSkubGVuZ3RoKSF0JiZuLm5vZGVUeXBlPT09MSYmKHYuY2xlYW5EYXRhKG4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSksdi5jbGVhbkRhdGEoW25dKSksbi5wYXJlbnROb2RlJiZuLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobik7cmV0dXJuIHRoaXN9LGVtcHR5OmZ1bmN0aW9uKCl7dmFyIGUsdD0wO2Zvcig7KGU9dGhpc1t0XSkhPW51bGw7dCsrKXtlLm5vZGVUeXBlPT09MSYmdi5jbGVhbkRhdGEoZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKTt3aGlsZShlLmZpcnN0Q2hpbGQpZS5yZW1vdmVDaGlsZChlLmZpcnN0Q2hpbGQpfXJldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihlLHQpe3JldHVybiBlPWU9PW51bGw/ITE6ZSx0PXQ9PW51bGw/ZTp0LHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHYuY2xvbmUodGhpcyxlLHQpfSl9LGh0bWw6ZnVuY3Rpb24oZSl7cmV0dXJuIHYuYWNjZXNzKHRoaXMsZnVuY3Rpb24oZSl7dmFyIG49dGhpc1swXXx8e30scj0wLGk9dGhpcy5sZW5ndGg7aWYoZT09PXQpcmV0dXJuIG4ubm9kZVR5cGU9PT0xP24uaW5uZXJIVE1MLnJlcGxhY2UoaHQsIiIpOnQ7aWYodHlwZW9mIGU9PSJzdHJpbmciJiYheXQudGVzdChlKSYmKHYuc3VwcG9ydC5odG1sU2VyaWFsaXplfHwhd3QudGVzdChlKSkmJih2LnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2V8fCFwdC50ZXN0KGUpKSYmIU50Wyh2dC5leGVjKGUpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7ZT1lLnJlcGxhY2UoZHQsIjwkMT48LyQyPiIpO3RyeXtmb3IoO3I8aTtyKyspbj10aGlzW3JdfHx7fSxuLm5vZGVUeXBlPT09MSYmKHYuY2xlYW5EYXRhKG4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSksbi5pbm5lckhUTUw9ZSk7bj0wfWNhdGNoKHMpe319biYmdGhpcy5lbXB0eSgpLmFwcGVuZChlKX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbihlKXtyZXR1cm4gdXQodGhpc1swXSk/dGhpcy5sZW5ndGg/dGhpcy5wdXNoU3RhY2sodih2LmlzRnVuY3Rpb24oZSk/ZSgpOmUpLCJyZXBsYWNlV2l0aCIsZSk6dGhpczp2LmlzRnVuY3Rpb24oZSk/dGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3ZhciBuPXYodGhpcykscj1uLmh0bWwoKTtuLnJlcGxhY2VXaXRoKGUuY2FsbCh0aGlzLHQscikpfSk6KHR5cGVvZiBlIT0ic3RyaW5nIiYmKGU9dihlKS5kZXRhY2goKSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5uZXh0U2libGluZyxuPXRoaXMucGFyZW50Tm9kZTt2KHRoaXMpLnJlbW92ZSgpLHQ/dih0KS5iZWZvcmUoZSk6dihuKS5hcHBlbmQoZSl9KSl9LGRldGFjaDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZW1vdmUoZSwhMCl9LGRvbU1hbmlwOmZ1bmN0aW9uKGUsbixyKXtlPVtdLmNvbmNhdC5hcHBseShbXSxlKTt2YXIgaSxzLG8sdSxhPTAsZj1lWzBdLGw9W10sYz10aGlzLmxlbmd0aDtpZighdi5zdXBwb3J0LmNoZWNrQ2xvbmUmJmM+MSYmdHlwZW9mIGY9PSJzdHJpbmciJiZTdC50ZXN0KGYpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2KHRoaXMpLmRvbU1hbmlwKGUsbixyKX0pO2lmKHYuaXNGdW5jdGlvbihmKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpe3ZhciBzPXYodGhpcyk7ZVswXT1mLmNhbGwodGhpcyxpLG4/cy5odG1sKCk6dCkscy5kb21NYW5pcChlLG4scil9KTtpZih0aGlzWzBdKXtpPXYuYnVpbGRGcmFnbWVudChlLHRoaXMsbCksbz1pLmZyYWdtZW50LHM9by5maXJzdENoaWxkLG8uY2hpbGROb2Rlcy5sZW5ndGg9PT0xJiYobz1zKTtpZihzKXtuPW4mJnYubm9kZU5hbWUocywidHIiKTtmb3IodT1pLmNhY2hlYWJsZXx8Yy0xO2E8YzthKyspci5jYWxsKG4mJnYubm9kZU5hbWUodGhpc1thXSwidGFibGUiKT9MdCh0aGlzW2FdLCJ0Ym9keSIpOnRoaXNbYV0sYT09PXU/bzp2LmNsb25lKG8sITAsITApKX1vPXM9bnVsbCxsLmxlbmd0aCYmdi5lYWNoKGwsZnVuY3Rpb24oZSx0KXt0LnNyYz92LmFqYXg/di5hamF4KHt1cmw6dC5zcmMsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0Iixhc3luYzohMSxnbG9iYWw6ITEsInRocm93cyI6ITB9KTp2LmVycm9yKCJubyBhamF4Iik6di5nbG9iYWxFdmFsKCh0LnRleHR8fHQudGV4dENvbnRlbnR8fHQuaW5uZXJIVE1MfHwiIikucmVwbGFjZShUdCwiIikpLHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpfSl9cmV0dXJuIHRoaXN9fSksdi5idWlsZEZyYWdtZW50PWZ1bmN0aW9uKGUsbixyKXt2YXIgcyxvLHUsYT1lWzBdO3JldHVybiBuPW58fGksbj0hbi5ub2RlVHlwZSYmblswXXx8bixuPW4ub3duZXJEb2N1bWVudHx8bixlLmxlbmd0aD09PTEmJnR5cGVvZiBhPT0ic3RyaW5nIiYmYS5sZW5ndGg8NTEyJiZuPT09aSYmYS5jaGFyQXQoMCk9PT0iPCImJiFidC50ZXN0KGEpJiYodi5zdXBwb3J0LmNoZWNrQ2xvbmV8fCFTdC50ZXN0KGEpKSYmKHYuc3VwcG9ydC5odG1sNUNsb25lfHwhd3QudGVzdChhKSkmJihvPSEwLHM9di5mcmFnbWVudHNbYV0sdT1zIT09dCksc3x8KHM9bi5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksdi5jbGVhbihlLG4scyxyKSxvJiYodi5mcmFnbWVudHNbYV09dSYmcykpLHtmcmFnbWVudDpzLGNhY2hlYWJsZTpvfX0sdi5mcmFnbWVudHM9e30sdi5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oZSx0KXt2LmZuW2VdPWZ1bmN0aW9uKG4pe3ZhciByLGk9MCxzPVtdLG89dihuKSx1PW8ubGVuZ3RoLGE9dGhpcy5sZW5ndGg9PT0xJiZ0aGlzWzBdLnBhcmVudE5vZGU7aWYoKGE9PW51bGx8fGEmJmEubm9kZVR5cGU9PT0xMSYmYS5jaGlsZE5vZGVzLmxlbmd0aD09PTEpJiZ1PT09MSlyZXR1cm4gb1t0XSh0aGlzWzBdKSx0aGlzO2Zvcig7aTx1O2krKylyPShpPjA/dGhpcy5jbG9uZSghMCk6dGhpcykuZ2V0KCksdihvW2ldKVt0XShyKSxzPXMuY29uY2F0KHIpO3JldHVybiB0aGlzLnB1c2hTdGFjayhzLGUsby5zZWxlY3Rvcil9fSksdi5leHRlbmQoe2Nsb25lOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLHMsbzt2LnN1cHBvcnQuaHRtbDVDbG9uZXx8di5pc1hNTERvYyhlKXx8IXd0LnRlc3QoIjwiK2Uubm9kZU5hbWUrIj4iKT9vPWUuY2xvbmVOb2RlKCEwKTooa3QuaW5uZXJIVE1MPWUub3V0ZXJIVE1MLGt0LnJlbW92ZUNoaWxkKG89a3QuZmlyc3RDaGlsZCkpO2lmKCghdi5zdXBwb3J0Lm5vQ2xvbmVFdmVudHx8IXYuc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCkmJihlLm5vZGVUeXBlPT09MXx8ZS5ub2RlVHlwZT09PTExKSYmIXYuaXNYTUxEb2MoZSkpe090KGUsbykscj1NdChlKSxpPU10KG8pO2ZvcihzPTA7cltzXTsrK3MpaVtzXSYmT3QocltzXSxpW3NdKX1pZih0KXtBdChlLG8pO2lmKG4pe3I9TXQoZSksaT1NdChvKTtmb3Iocz0wO3Jbc107KytzKUF0KHJbc10saVtzXSl9fXJldHVybiByPWk9bnVsbCxvfSxjbGVhbjpmdW5jdGlvbihlLHQsbixyKXt2YXIgcyxvLHUsYSxmLGwsYyxoLHAsZCxtLGcseT10PT09aSYmQ3QsYj1bXTtpZighdHx8dHlwZW9mIHQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudD09InVuZGVmaW5lZCIpdD1pO2ZvcihzPTA7KHU9ZVtzXSkhPW51bGw7cysrKXt0eXBlb2YgdT09Im51bWJlciImJih1Kz0iIik7aWYoIXUpY29udGludWU7aWYodHlwZW9mIHU9PSJzdHJpbmciKWlmKCFndC50ZXN0KHUpKXU9dC5jcmVhdGVUZXh0Tm9kZSh1KTtlbHNle3k9eXx8bHQodCksYz10LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHkuYXBwZW5kQ2hpbGQoYyksdT11LnJlcGxhY2UoZHQsIjwkMT48LyQyPiIpLGE9KHZ0LmV4ZWModSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksZj1OdFthXXx8TnQuX2RlZmF1bHQsbD1mWzBdLGMuaW5uZXJIVE1MPWZbMV0rdStmWzJdO3doaWxlKGwtLSljPWMubGFzdENoaWxkO2lmKCF2LnN1cHBvcnQudGJvZHkpe2g9bXQudGVzdCh1KSxwPWE9PT0idGFibGUiJiYhaD9jLmZpcnN0Q2hpbGQmJmMuZmlyc3RDaGlsZC5jaGlsZE5vZGVzOmZbMV09PT0iPHRhYmxlPiImJiFoP2MuY2hpbGROb2RlczpbXTtmb3Iobz1wLmxlbmd0aC0xO28+PTA7LS1vKXYubm9kZU5hbWUocFtvXSwidGJvZHkiKSYmIXBbb10uY2hpbGROb2Rlcy5sZW5ndGgmJnBbb10ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwW29dKX0hdi5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlJiZwdC50ZXN0KHUpJiZjLmluc2VydEJlZm9yZSh0LmNyZWF0ZVRleHROb2RlKHB0LmV4ZWModSlbMF0pLGMuZmlyc3RDaGlsZCksdT1jLmNoaWxkTm9kZXMsYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpfXUubm9kZVR5cGU/Yi5wdXNoKHUpOnYubWVyZ2UoYix1KX1jJiYodT1jPXk9bnVsbCk7aWYoIXYuc3VwcG9ydC5hcHBlbmRDaGVja2VkKWZvcihzPTA7KHU9YltzXSkhPW51bGw7cysrKXYubm9kZU5hbWUodSwiaW5wdXQiKT9fdCh1KTp0eXBlb2YgdS5nZXRFbGVtZW50c0J5VGFnTmFtZSE9InVuZGVmaW5lZCImJnYuZ3JlcCh1LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLF90KTtpZihuKXttPWZ1bmN0aW9uKGUpe2lmKCFlLnR5cGV8fHh0LnRlc3QoZS50eXBlKSlyZXR1cm4gcj9yLnB1c2goZS5wYXJlbnROb2RlP2UucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKTplKTpuLmFwcGVuZENoaWxkKGUpfTtmb3Iocz0wOyh1PWJbc10pIT1udWxsO3MrKylpZighdi5ub2RlTmFtZSh1LCJzY3JpcHQiKXx8IW0odSkpbi5hcHBlbmRDaGlsZCh1KSx0eXBlb2YgdS5nZXRFbGVtZW50c0J5VGFnTmFtZSE9InVuZGVmaW5lZCImJihnPXYuZ3JlcCh2Lm1lcmdlKFtdLHUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpKSxtKSxiLnNwbGljZS5hcHBseShiLFtzKzEsMF0uY29uY2F0KGcpKSxzKz1nLmxlbmd0aCl9cmV0dXJuIGJ9LGNsZWFuRGF0YTpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxzLG89MCx1PXYuZXhwYW5kbyxhPXYuY2FjaGUsZj12LnN1cHBvcnQuZGVsZXRlRXhwYW5kbyxsPXYuZXZlbnQuc3BlY2lhbDtmb3IoOyhpPWVbb10pIT1udWxsO28rKylpZih0fHx2LmFjY2VwdERhdGEoaSkpe3I9aVt1XSxuPXImJmFbcl07aWYobil7aWYobi5ldmVudHMpZm9yKHMgaW4gbi5ldmVudHMpbFtzXT92LmV2ZW50LnJlbW92ZShpLHMpOnYucmVtb3ZlRXZlbnQoaSxzLG4uaGFuZGxlKTthW3JdJiYoZGVsZXRlIGFbcl0sZj9kZWxldGUgaVt1XTppLnJlbW92ZUF0dHJpYnV0ZT9pLnJlbW92ZUF0dHJpYnV0ZSh1KTppW3VdPW51bGwsdi5kZWxldGVkSWRzLnB1c2gocikpfX19fSksZnVuY3Rpb24oKXt2YXIgZSx0O3YudWFNYXRjaD1mdW5jdGlvbihlKXtlPWUudG9Mb3dlckNhc2UoKTt2YXIgdD0vKGNocm9tZSlbIFwvXShbXHcuXSspLy5leGVjKGUpfHwvKHdlYmtpdClbIFwvXShbXHcuXSspLy5leGVjKGUpfHwvKG9wZXJhKSg/Oi4qdmVyc2lvbnwpWyBcL10oW1x3Ll0rKS8uZXhlYyhlKXx8Lyhtc2llKSAoW1x3Ll0rKS8uZXhlYyhlKXx8ZS5pbmRleE9mKCJjb21wYXRpYmxlIik8MCYmLyhtb3ppbGxhKSg/Oi4qPyBydjooW1x3Ll0rKXwpLy5leGVjKGUpfHxbXTtyZXR1cm57YnJvd3Nlcjp0WzFdfHwiIix2ZXJzaW9uOnRbMl18fCIwIn19LGU9di51YU1hdGNoKG8udXNlckFnZW50KSx0PXt9LGUuYnJvd3NlciYmKHRbZS5icm93c2VyXT0hMCx0LnZlcnNpb249ZS52ZXJzaW9uKSx0LmNocm9tZT90LndlYmtpdD0hMDp0LndlYmtpdCYmKHQuc2FmYXJpPSEwKSx2LmJyb3dzZXI9dCx2LnN1Yj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxuKXtyZXR1cm4gbmV3IGUuZm4uaW5pdCh0LG4pfXYuZXh0ZW5kKCEwLGUsdGhpcyksZS5zdXBlcmNsYXNzPXRoaXMsZS5mbj1lLnByb3RvdHlwZT10aGlzKCksZS5mbi5jb25zdHJ1Y3Rvcj1lLGUuc3ViPXRoaXMuc3ViLGUuZm4uaW5pdD1mdW5jdGlvbihyLGkpe3JldHVybiBpJiZpIGluc3RhbmNlb2YgdiYmIShpIGluc3RhbmNlb2YgZSkmJihpPWUoaSkpLHYuZm4uaW5pdC5jYWxsKHRoaXMscixpLHQpfSxlLmZuLmluaXQucHJvdG90eXBlPWUuZm47dmFyIHQ9ZShpKTtyZXR1cm4gZX19KCk7dmFyIER0LFB0LEh0LEJ0PS9hbHBoYVwoW14pXSpcKS9pLGp0PS9vcGFjaXR5PShbXildKikvLEZ0PS9eKHRvcHxyaWdodHxib3R0b218bGVmdCkkLyxJdD0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8scXQ9L15tYXJnaW4vLFJ0PW5ldyBSZWdFeHAoIl4oIittKyIpKC4qKSQiLCJpIiksVXQ9bmV3IFJlZ0V4cCgiXigiK20rIikoPyFweClbYS16JV0rJCIsImkiKSx6dD1uZXcgUmVnRXhwKCJeKFstK10pPSgiK20rIikiLCJpIiksV3Q9e30sWHQ9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LFZ0PXtsZXR0ZXJTcGFjaW5nOjAsZm9udFdlaWdodDo0MDB9LCR0PVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sSnQ9WyJXZWJraXQiLCJPIiwiTW96IiwibXMiXSxLdD12LmZuLnRvZ2dsZTt2LmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKGUsbil7cmV0dXJuIHYuYWNjZXNzKHRoaXMsZnVuY3Rpb24oZSxuLHIpe3JldHVybiByIT09dD92LnN0eWxlKGUsbixyKTp2LmNzcyhlLG4pfSxlLG4sYXJndW1lbnRzLmxlbmd0aD4xKX0sc2hvdzpmdW5jdGlvbigpe3JldHVybiBZdCh0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBZdCh0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dHlwZW9mIGU9PSJib29sZWFuIjtyZXR1cm4gdi5pc0Z1bmN0aW9uKGUpJiZ2LmlzRnVuY3Rpb24odCk/S3QuYXBwbHkodGhpcyxhcmd1bWVudHMpOnRoaXMuZWFjaChmdW5jdGlvbigpeyhuP2U6R3QodGhpcykpP3YodGhpcykuc2hvdygpOnYodGhpcykuaGlkZSgpfSl9fSksdi5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oZSx0KXtpZih0KXt2YXIgbj1EdChlLCJvcGFjaXR5Iik7cmV0dXJuIG49PT0iIj8iMSI6bn19fX0sY3NzTnVtYmVyOntmaWxsT3BhY2l0eTohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6di5zdXBwb3J0LmNzc0Zsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQifSxzdHlsZTpmdW5jdGlvbihlLG4scixpKXtpZighZXx8ZS5ub2RlVHlwZT09PTN8fGUubm9kZVR5cGU9PT04fHwhZS5zdHlsZSlyZXR1cm47dmFyIHMsbyx1LGE9di5jYW1lbENhc2UobiksZj1lLnN0eWxlO249di5jc3NQcm9wc1thXXx8KHYuY3NzUHJvcHNbYV09UXQoZixhKSksdT12LmNzc0hvb2tzW25dfHx2LmNzc0hvb2tzW2FdO2lmKHI9PT10KXJldHVybiB1JiYiZ2V0ImluIHUmJihzPXUuZ2V0KGUsITEsaSkpIT09dD9zOmZbbl07bz10eXBlb2YgcixvPT09InN0cmluZyImJihzPXp0LmV4ZWMocikpJiYocj0oc1sxXSsxKSpzWzJdK3BhcnNlRmxvYXQodi5jc3MoZSxuKSksbz0ibnVtYmVyIik7aWYocj09bnVsbHx8bz09PSJudW1iZXIiJiZpc05hTihyKSlyZXR1cm47bz09PSJudW1iZXIiJiYhdi5jc3NOdW1iZXJbYV0mJihyKz0icHgiKTtpZighdXx8ISgic2V0ImluIHUpfHwocj11LnNldChlLHIsaSkpIT09dCl0cnl7ZltuXT1yfWNhdGNoKGwpe319LGNzczpmdW5jdGlvbihlLG4scixpKXt2YXIgcyxvLHUsYT12LmNhbWVsQ2FzZShuKTtyZXR1cm4gbj12LmNzc1Byb3BzW2FdfHwodi5jc3NQcm9wc1thXT1RdChlLnN0eWxlLGEpKSx1PXYuY3NzSG9va3Nbbl18fHYuY3NzSG9va3NbYV0sdSYmImdldCJpbiB1JiYocz11LmdldChlLCEwLGkpKSxzPT09dCYmKHM9RHQoZSxuKSkscz09PSJub3JtYWwiJiZuIGluIFZ0JiYocz1WdFtuXSkscnx8aSE9PXQ/KG89cGFyc2VGbG9hdChzKSxyfHx2LmlzTnVtZXJpYyhvKT9vfHwwOnMpOnN9LHN3YXA6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGkscz17fTtmb3IoaSBpbiB0KXNbaV09ZS5zdHlsZVtpXSxlLnN0eWxlW2ldPXRbaV07cj1uLmNhbGwoZSk7Zm9yKGkgaW4gdCllLnN0eWxlW2ldPXNbaV07cmV0dXJuIHJ9fSksZS5nZXRDb21wdXRlZFN0eWxlP0R0PWZ1bmN0aW9uKHQsbil7dmFyIHIsaSxzLG8sdT1lLmdldENvbXB1dGVkU3R5bGUodCxudWxsKSxhPXQuc3R5bGU7cmV0dXJuIHUmJihyPXVbbl0scj09PSIiJiYhdi5jb250YWlucyh0Lm93bmVyRG9jdW1lbnQsdCkmJihyPXYuc3R5bGUodCxuKSksVXQudGVzdChyKSYmcXQudGVzdChuKSYmKGk9YS53aWR0aCxzPWEubWluV2lkdGgsbz1hLm1heFdpZHRoLGEubWluV2lkdGg9YS5tYXhXaWR0aD1hLndpZHRoPXIscj11LndpZHRoLGEud2lkdGg9aSxhLm1pbldpZHRoPXMsYS5tYXhXaWR0aD1vKSkscn06aS5kb2N1bWVudEVsZW1lbnQuY3VycmVudFN0eWxlJiYoRHQ9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9ZS5jdXJyZW50U3R5bGUmJmUuY3VycmVudFN0eWxlW3RdLHM9ZS5zdHlsZTtyZXR1cm4gaT09bnVsbCYmcyYmc1t0XSYmKGk9c1t0XSksVXQudGVzdChpKSYmIUZ0LnRlc3QodCkmJihuPXMubGVmdCxyPWUucnVudGltZVN0eWxlJiZlLnJ1bnRpbWVTdHlsZS5sZWZ0LHImJihlLnJ1bnRpbWVTdHlsZS5sZWZ0PWUuY3VycmVudFN0eWxlLmxlZnQpLHMubGVmdD10PT09ImZvbnRTaXplIj8iMWVtIjppLGk9cy5waXhlbExlZnQrInB4IixzLmxlZnQ9bixyJiYoZS5ydW50aW1lU3R5bGUubGVmdD1yKSksaT09PSIiPyJhdXRvIjppfSksdi5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihlLHQpe3YuY3NzSG9va3NbdF09e2dldDpmdW5jdGlvbihlLG4scil7aWYobilyZXR1cm4gZS5vZmZzZXRXaWR0aD09PTAmJkl0LnRlc3QoRHQoZSwiZGlzcGxheSIpKT92LnN3YXAoZSxYdCxmdW5jdGlvbigpe3JldHVybiB0bihlLHQscil9KTp0bihlLHQscil9LHNldDpmdW5jdGlvbihlLG4scil7cmV0dXJuIFp0KGUsbixyP2VuKGUsdCxyLHYuc3VwcG9ydC5ib3hTaXppbmcmJnYuY3NzKGUsImJveFNpemluZyIpPT09ImJvcmRlci1ib3giKTowKX19fSksdi5zdXBwb3J0Lm9wYWNpdHl8fCh2LmNzc0hvb2tzLm9wYWNpdHk9e2dldDpmdW5jdGlvbihlLHQpe3JldHVybiBqdC50ZXN0KCh0JiZlLmN1cnJlbnRTdHlsZT9lLmN1cnJlbnRTdHlsZS5maWx0ZXI6ZS5zdHlsZS5maWx0ZXIpfHwiIik/LjAxKnBhcnNlRmxvYXQoUmVnRXhwLiQxKSsiIjp0PyIxIjoiIn0sc2V0OmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5zdHlsZSxyPWUuY3VycmVudFN0eWxlLGk9di5pc051bWVyaWModCk/ImFscGhhKG9wYWNpdHk9Iit0KjEwMCsiKSI6IiIscz1yJiZyLmZpbHRlcnx8bi5maWx0ZXJ8fCIiO24uem9vbT0xO2lmKHQ+PTEmJnYudHJpbShzLnJlcGxhY2UoQnQsIiIpKT09PSIiJiZuLnJlbW92ZUF0dHJpYnV0ZSl7bi5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpO2lmKHImJiFyLmZpbHRlcilyZXR1cm59bi5maWx0ZXI9QnQudGVzdChzKT9zLnJlcGxhY2UoQnQsaSk6cysiICIraX19KSx2KGZ1bmN0aW9uKCl7di5zdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHR8fCh2LmNzc0hvb2tzLm1hcmdpblJpZ2h0PXtnZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdi5zd2FwKGUse2Rpc3BsYXk6ImlubGluZS1ibG9jayJ9LGZ1bmN0aW9uKCl7aWYodClyZXR1cm4gRHQoZSwibWFyZ2luUmlnaHQiKX0pfX0pLCF2LnN1cHBvcnQucGl4ZWxQb3NpdGlvbiYmdi5mbi5wb3NpdGlvbiYmdi5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGUsdCl7di5jc3NIb29rc1t0XT17Z2V0OmZ1bmN0aW9uKGUsbil7aWYobil7dmFyIHI9RHQoZSx0KTtyZXR1cm4gVXQudGVzdChyKT92KGUpLnBvc2l0aW9uKClbdF0rInB4IjpyfX19fSl9KSx2LmV4cHImJnYuZXhwci5maWx0ZXJzJiYodi5leHByLmZpbHRlcnMuaGlkZGVuPWZ1bmN0aW9uKGUpe3JldHVybiBlLm9mZnNldFdpZHRoPT09MCYmZS5vZmZzZXRIZWlnaHQ9PT0wfHwhdi5zdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyYmKGUuc3R5bGUmJmUuc3R5bGUuZGlzcGxheXx8RHQoZSwiZGlzcGxheSIpKT09PSJub25lIn0sdi5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihlKXtyZXR1cm4hdi5leHByLmZpbHRlcnMuaGlkZGVuKGUpfSksdi5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oZSx0KXt2LmNzc0hvb2tzW2UrdF09e2V4cGFuZDpmdW5jdGlvbihuKXt2YXIgcixpPXR5cGVvZiBuPT0ic3RyaW5nIj9uLnNwbGl0KCIgIik6W25dLHM9e307Zm9yKHI9MDtyPDQ7cisrKXNbZSskdFtyXSt0XT1pW3JdfHxpW3ItMl18fGlbMF07cmV0dXJuIHN9fSxxdC50ZXN0KGUpfHwodi5jc3NIb29rc1tlK3RdLnNldD1adCl9KTt2YXIgcm49LyUyMC9nLHNuPS9cW1xdJC8sb249L1xyP1xuL2csdW49L14oPzpjb2xvcnxkYXRlfGRhdGV0aW1lfGRhdGV0aW1lLWxvY2FsfGVtYWlsfGhpZGRlbnxtb250aHxudW1iZXJ8cGFzc3dvcmR8cmFuZ2V8c2VhcmNofHRlbHx0ZXh0fHRpbWV8dXJsfHdlZWspJC9pLGFuPS9eKD86c2VsZWN0fHRleHRhcmVhKS9pO3YuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdi5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnRzP3YubWFrZUFycmF5KHRoaXMuZWxlbWVudHMpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lJiYhdGhpcy5kaXNhYmxlZCYmKHRoaXMuY2hlY2tlZHx8YW4udGVzdCh0aGlzLm5vZGVOYW1lKXx8dW4udGVzdCh0aGlzLnR5cGUpKX0pLm1hcChmdW5jdGlvbihlLHQpe3ZhciBuPXYodGhpcykudmFsKCk7cmV0dXJuIG49PW51bGw/bnVsbDp2LmlzQXJyYXkobik/di5tYXAobixmdW5jdGlvbihlLG4pe3JldHVybntuYW1lOnQubmFtZSx2YWx1ZTplLnJlcGxhY2Uob24sIlxyXG4iKX19KTp7bmFtZTp0Lm5hbWUsdmFsdWU6bi5yZXBsYWNlKG9uLCJcclxuIil9fSkuZ2V0KCl9fSksdi5wYXJhbT1mdW5jdGlvbihlLG4pe3ZhciByLGk9W10scz1mdW5jdGlvbihlLHQpe3Q9di5pc0Z1bmN0aW9uKHQpP3QoKTp0PT1udWxsPyIiOnQsaVtpLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGUpKyI9IitlbmNvZGVVUklDb21wb25lbnQodCl9O249PT10JiYobj12LmFqYXhTZXR0aW5ncyYmdi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpO2lmKHYuaXNBcnJheShlKXx8ZS5qcXVlcnkmJiF2LmlzUGxhaW5PYmplY3QoZSkpdi5lYWNoKGUsZnVuY3Rpb24oKXtzKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKHIgaW4gZSlmbihyLGVbcl0sbixzKTtyZXR1cm4gaS5qb2luKCImIikucmVwbGFjZShybiwiKyIpfTt2YXIgbG4sY24saG49LyMuKiQvLHBuPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvbWcsZG49L14oPzphYm91dHxhcHB8YXBwXC1zdG9yYWdlfC4rXC1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyx2bj0vXig/OkdFVHxIRUFEKSQvLG1uPS9eXC9cLy8sZ249L1w/Lyx5bj0vPHNjcmlwdFxiW148XSooPzooPyE8XC9zY3JpcHQ+KTxbXjxdKikqPFwvc2NyaXB0Pi9naSxibj0vKFs/Jl0pXz1bXiZdKi8sd249L14oW1x3XCtcLlwtXSs6KSg/OlwvXC8oW15cLz8jOl0qKSg/OjooXGQrKXwpfCkvLEVuPXYuZm4ubG9hZCxTbj17fSx4bj17fSxUbj1bIiovIl0rWyIqIl07dHJ5e2NuPXMuaHJlZn1jYXRjaChObil7Y249aS5jcmVhdGVFbGVtZW50KCJhIiksY24uaHJlZj0iIixjbj1jbi5ocmVmfWxuPXduLmV4ZWMoY24udG9Mb3dlckNhc2UoKSl8fFtdLHYuZm4ubG9hZD1mdW5jdGlvbihlLG4scil7aWYodHlwZW9mIGUhPSJzdHJpbmciJiZFbilyZXR1cm4gRW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpczt2YXIgaSxzLG8sdT10aGlzLGE9ZS5pbmRleE9mKCIgIik7cmV0dXJuIGE+PTAmJihpPWUuc2xpY2UoYSxlLmxlbmd0aCksZT1lLnNsaWNlKDAsYSkpLHYuaXNGdW5jdGlvbihuKT8ocj1uLG49dCk6biYmdHlwZW9mIG49PSJvYmplY3QiJiYocz0iUE9TVCIpLHYuYWpheCh7dXJsOmUsdHlwZTpzLGRhdGFUeXBlOiJodG1sIixkYXRhOm4sY29tcGxldGU6ZnVuY3Rpb24oZSx0KXtyJiZ1LmVhY2gocixvfHxbZS5yZXNwb25zZVRleHQsdCxlXSl9fSkuZG9uZShmdW5jdGlvbihlKXtvPWFyZ3VtZW50cyx1Lmh0bWwoaT92KCI8ZGl2PiIpLmFwcGVuZChlLnJlcGxhY2UoeW4sIiIpKS5maW5kKGkpOmUpfSksdGhpc30sdi5lYWNoKCJhamF4U3RhcnQgYWpheFN0b3AgYWpheENvbXBsZXRlIGFqYXhFcnJvciBhamF4U3VjY2VzcyBhamF4U2VuZCIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe3YuZm5bdF09ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub24odCxlKX19KSx2LmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oZSxuKXt2W25dPWZ1bmN0aW9uKGUscixpLHMpe3JldHVybiB2LmlzRnVuY3Rpb24ocikmJihzPXN8fGksaT1yLHI9dCksdi5hamF4KHt0eXBlOm4sdXJsOmUsZGF0YTpyLHN1Y2Nlc3M6aSxkYXRhVHlwZTpzfSl9fSksdi5leHRlbmQoe2dldFNjcmlwdDpmdW5jdGlvbihlLG4pe3JldHVybiB2LmdldChlLHQsbiwic2NyaXB0Iil9LGdldEpTT046ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2LmdldChlLHQsbiwianNvbiIpfSxhamF4U2V0dXA6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9MbihlLHYuYWpheFNldHRpbmdzKToodD1lLGU9di5hamF4U2V0dGluZ3MpLExuKGUsdCksZX0sYWpheFNldHRpbmdzOnt1cmw6Y24saXNMb2NhbDpkbi50ZXN0KGxuWzFdKSxnbG9iYWw6ITAsdHlwZToiR0VUIixjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04Iixwcm9jZXNzRGF0YTohMCxhc3luYzohMCxhY2NlcHRzOnt4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGh0bWw6InRleHQvaHRtbCIsdGV4dDoidGV4dC9wbGFpbiIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0IiwiKiI6VG59LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjplLlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjp2LnBhcnNlSlNPTiwidGV4dCB4bWwiOnYucGFyc2VYTUx9LGZsYXRPcHRpb25zOntjb250ZXh0OiEwLHVybDohMH19LGFqYXhQcmVmaWx0ZXI6Q24oU24pLGFqYXhUcmFuc3BvcnQ6Q24oeG4pLGFqYXg6ZnVuY3Rpb24oZSxuKXtmdW5jdGlvbiBUKGUsbixzLGEpe3ZhciBsLHksYix3LFMsVD1uO2lmKEU9PT0yKXJldHVybjtFPTIsdSYmY2xlYXJUaW1lb3V0KHUpLG89dCxpPWF8fCIiLHgucmVhZHlTdGF0ZT1lPjA/NDowLHMmJih3PUFuKGMseCxzKSk7aWYoZT49MjAwJiZlPDMwMHx8ZT09PTMwNCljLmlmTW9kaWZpZWQmJihTPXguZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSxTJiYodi5sYXN0TW9kaWZpZWRbcl09UyksUz14LmdldFJlc3BvbnNlSGVhZGVyKCJFdGFnIiksUyYmKHYuZXRhZ1tyXT1TKSksZT09PTMwND8oVD0ibm90bW9kaWZpZWQiLGw9ITApOihsPU9uKGMsdyksVD1sLnN0YXRlLHk9bC5kYXRhLGI9bC5lcnJvcixsPSFiKTtlbHNle2I9VDtpZighVHx8ZSlUPSJlcnJvciIsZTwwJiYoZT0wKX14LnN0YXR1cz1lLHguc3RhdHVzVGV4dD0obnx8VCkrIiIsbD9kLnJlc29sdmVXaXRoKGgsW3ksVCx4XSk6ZC5yZWplY3RXaXRoKGgsW3gsVCxiXSkseC5zdGF0dXNDb2RlKGcpLGc9dCxmJiZwLnRyaWdnZXIoImFqYXgiKyhsPyJTdWNjZXNzIjoiRXJyb3IiKSxbeCxjLGw/eTpiXSksbS5maXJlV2l0aChoLFt4LFRdKSxmJiYocC50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFt4LGNdKSwtLXYuYWN0aXZlfHx2LmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpfXR5cGVvZiBlPT0ib2JqZWN0IiYmKG49ZSxlPXQpLG49bnx8e307dmFyIHIsaSxzLG8sdSxhLGYsbCxjPXYuYWpheFNldHVwKHt9LG4pLGg9Yy5jb250ZXh0fHxjLHA9aCE9PWMmJihoLm5vZGVUeXBlfHxoIGluc3RhbmNlb2Ygdik/dihoKTp2LmV2ZW50LGQ9di5EZWZlcnJlZCgpLG09di5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksZz1jLnN0YXR1c0NvZGV8fHt9LGI9e30sdz17fSxFPTAsUz0iY2FuY2VsZWQiLHg9e3JlYWR5U3RhdGU6MCxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGUsdCl7aWYoIUUpe3ZhciBuPWUudG9Mb3dlckNhc2UoKTtlPXdbbl09d1tuXXx8ZSxiW2VdPXR9cmV0dXJuIHRoaXN9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBFPT09Mj9pOm51bGx9LGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGUpe3ZhciBuO2lmKEU9PT0yKXtpZighcyl7cz17fTt3aGlsZShuPXBuLmV4ZWMoaSkpc1tuWzFdLnRvTG93ZXJDYXNlKCldPW5bMl19bj1zW2UudG9Mb3dlckNhc2UoKV19cmV0dXJuIG49PT10P251bGw6bn0sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihlKXtyZXR1cm4gRXx8KGMubWltZVR5cGU9ZSksdGhpc30sYWJvcnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZXx8UyxvJiZvLmFib3J0KGUpLFQoMCxlKSx0aGlzfX07ZC5wcm9taXNlKHgpLHguc3VjY2Vzcz14LmRvbmUseC5lcnJvcj14LmZhaWwseC5jb21wbGV0ZT1tLmFkZCx4LnN0YXR1c0NvZGU9ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ7aWYoRTwyKWZvcih0IGluIGUpZ1t0XT1bZ1t0XSxlW3RdXTtlbHNlIHQ9ZVt4LnN0YXR1c10seC5hbHdheXModCl9cmV0dXJuIHRoaXN9LGMudXJsPSgoZXx8Yy51cmwpKyIiKS5yZXBsYWNlKGhuLCIiKS5yZXBsYWNlKG1uLGxuWzFdKyIvLyIpLGMuZGF0YVR5cGVzPXYudHJpbShjLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoeSksYy5jcm9zc0RvbWFpbj09bnVsbCYmKGE9d24uZXhlYyhjLnVybC50b0xvd2VyQ2FzZSgpKXx8ITEsYy5jcm9zc0RvbWFpbj1hJiZhLmpvaW4oIjoiKSsoYVszXT8iIjphWzFdPT09Imh0dHA6Ij84MDo0NDMpIT09bG4uam9pbigiOiIpKyhsblszXT8iIjpsblsxXT09PSJodHRwOiI/ODA6NDQzKSksYy5kYXRhJiZjLnByb2Nlc3NEYXRhJiZ0eXBlb2YgYy5kYXRhIT0ic3RyaW5nIiYmKGMuZGF0YT12LnBhcmFtKGMuZGF0YSxjLnRyYWRpdGlvbmFsKSksa24oU24sYyxuLHgpO2lmKEU9PT0yKXJldHVybiB4O2Y9Yy5nbG9iYWwsYy50eXBlPWMudHlwZS50b1VwcGVyQ2FzZSgpLGMuaGFzQ29udGVudD0hdm4udGVzdChjLnR5cGUpLGYmJnYuYWN0aXZlKys9PT0wJiZ2LmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpO2lmKCFjLmhhc0NvbnRlbnQpe2MuZGF0YSYmKGMudXJsKz0oZ24udGVzdChjLnVybCk/IiYiOiI/IikrYy5kYXRhLGRlbGV0ZSBjLmRhdGEpLHI9Yy51cmw7aWYoYy5jYWNoZT09PSExKXt2YXIgTj12Lm5vdygpLEM9Yy51cmwucmVwbGFjZShibiwiJDFfPSIrTik7Yy51cmw9QysoQz09PWMudXJsPyhnbi50ZXN0KGMudXJsKT8iJiI6Ij8iKSsiXz0iK046IiIpfX0oYy5kYXRhJiZjLmhhc0NvbnRlbnQmJmMuY29udGVudFR5cGUhPT0hMXx8bi5jb250ZW50VHlwZSkmJnguc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixjLmNvbnRlbnRUeXBlKSxjLmlmTW9kaWZpZWQmJihyPXJ8fGMudXJsLHYubGFzdE1vZGlmaWVkW3JdJiZ4LnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIix2Lmxhc3RNb2RpZmllZFtyXSksdi5ldGFnW3JdJiZ4LnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLHYuZXRhZ1tyXSkpLHguc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixjLmRhdGFUeXBlc1swXSYmYy5hY2NlcHRzW2MuZGF0YVR5cGVzWzBdXT9jLmFjY2VwdHNbYy5kYXRhVHlwZXNbMF1dKyhjLmRhdGFUeXBlc1swXSE9PSIqIj8iLCAiK1RuKyI7IHE9MC4wMSI6IiIpOmMuYWNjZXB0c1siKiJdKTtmb3IobCBpbiBjLmhlYWRlcnMpeC5zZXRSZXF1ZXN0SGVhZGVyKGwsYy5oZWFkZXJzW2xdKTtpZighYy5iZWZvcmVTZW5kfHxjLmJlZm9yZVNlbmQuY2FsbChoLHgsYykhPT0hMSYmRSE9PTIpe1M9ImFib3J0Ijtmb3IobCBpbntzdWNjZXNzOjEsZXJyb3I6MSxjb21wbGV0ZToxfSl4W2xdKGNbbF0pO289a24oeG4sYyxuLHgpO2lmKCFvKVQoLTEsIk5vIFRyYW5zcG9ydCIpO2Vsc2V7eC5yZWFkeVN0YXRlPTEsZiYmcC50cmlnZ2VyKCJhamF4U2VuZCIsW3gsY10pLGMuYXN5bmMmJmMudGltZW91dD4wJiYodT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7eC5hYm9ydCgidGltZW91dCIpfSxjLnRpbWVvdXQpKTt0cnl7RT0xLG8uc2VuZChiLFQpfWNhdGNoKGspe2lmKCEoRTwyKSl0aHJvdyBrO1QoLTEsayl9fXJldHVybiB4fXJldHVybiB4LmFib3J0KCl9LGFjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9fSk7dmFyIE1uPVtdLF9uPS9cPy8sRG49Lyg9KVw/KD89JnwkKXxcP1w/LyxQbj12Lm5vdygpO3YuYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXt2YXIgZT1Nbi5wb3AoKXx8di5leHBhbmRvKyJfIitQbisrO3JldHVybiB0aGlzW2VdPSEwLGV9fSksdi5hamF4UHJlZmlsdGVyKCJqc29uIGpzb25wIixmdW5jdGlvbihuLHIsaSl7dmFyIHMsbyx1LGE9bi5kYXRhLGY9bi51cmwsbD1uLmpzb25wIT09ITEsYz1sJiZEbi50ZXN0KGYpLGg9bCYmIWMmJnR5cGVvZiBhPT0ic3RyaW5nIiYmIShuLmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJkRuLnRlc3QoYSk7aWYobi5kYXRhVHlwZXNbMF09PT0ianNvbnAifHxjfHxoKXJldHVybiBzPW4uanNvbnBDYWxsYmFjaz12LmlzRnVuY3Rpb24obi5qc29ucENhbGxiYWNrKT9uLmpzb25wQ2FsbGJhY2soKTpuLmpzb25wQ2FsbGJhY2ssbz1lW3NdLGM/bi51cmw9Zi5yZXBsYWNlKERuLCIkMSIrcyk6aD9uLmRhdGE9YS5yZXBsYWNlKERuLCIkMSIrcyk6bCYmKG4udXJsKz0oX24udGVzdChmKT8iJiI6Ij8iKStuLmpzb25wKyI9IitzKSxuLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gdXx8di5lcnJvcihzKyIgd2FzIG5vdCBjYWxsZWQiKSx1WzBdfSxuLmRhdGFUeXBlc1swXT0ianNvbiIsZVtzXT1mdW5jdGlvbigpe3U9YXJndW1lbnRzfSxpLmFsd2F5cyhmdW5jdGlvbigpe2Vbc109byxuW3NdJiYobi5qc29ucENhbGxiYWNrPXIuanNvbnBDYWxsYmFjayxNbi5wdXNoKHMpKSx1JiZ2LmlzRnVuY3Rpb24obykmJm8odVswXSksdT1vPXR9KSwic2NyaXB0In0pLHYuYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovamF2YXNjcmlwdHxlY21hc2NyaXB0L30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbihlKXtyZXR1cm4gdi5nbG9iYWxFdmFsKGUpLGV9fX0pLHYuYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihlKXtlLmNhY2hlPT09dCYmKGUuY2FjaGU9ITEpLGUuY3Jvc3NEb21haW4mJihlLnR5cGU9IkdFVCIsZS5nbG9iYWw9ITEpfSksdi5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKGUpe2lmKGUuY3Jvc3NEb21haW4pe3ZhciBuLHI9aS5oZWFkfHxpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGkuZG9jdW1lbnRFbGVtZW50O3JldHVybntzZW5kOmZ1bmN0aW9uKHMsbyl7bj1pLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLG4uYXN5bmM9ImFzeW5jIixlLnNjcmlwdENoYXJzZXQmJihuLmNoYXJzZXQ9ZS5zY3JpcHRDaGFyc2V0KSxuLnNyYz1lLnVybCxuLm9ubG9hZD1uLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihlLGkpe2lmKGl8fCFuLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3Qobi5yZWFkeVN0YXRlKSluLm9ubG9hZD1uLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLHImJm4ucGFyZW50Tm9kZSYmci5yZW1vdmVDaGlsZChuKSxuPXQsaXx8bygyMDAsInN1Y2Nlc3MiKX0sci5pbnNlcnRCZWZvcmUobixyLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe24mJm4ub25sb2FkKDAsMSl9fX19KTt2YXIgSG4sQm49ZS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7Zm9yKHZhciBlIGluIEhuKUhuW2VdKDAsMSl9OiExLGpuPTA7di5hamF4U2V0dGluZ3MueGhyPWUuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe3JldHVybiF0aGlzLmlzTG9jYWwmJkZuKCl8fEluKCl9OkZuLGZ1bmN0aW9uKGUpe3YuZXh0ZW5kKHYuc3VwcG9ydCx7YWpheDohIWUsY29yczohIWUmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gZX0pfSh2LmFqYXhTZXR0aW5ncy54aHIoKSksdi5zdXBwb3J0LmFqYXgmJnYuYWpheFRyYW5zcG9ydChmdW5jdGlvbihuKXtpZighbi5jcm9zc0RvbWFpbnx8di5zdXBwb3J0LmNvcnMpe3ZhciByO3JldHVybntzZW5kOmZ1bmN0aW9uKGkscyl7dmFyIG8sdSxhPW4ueGhyKCk7bi51c2VybmFtZT9hLm9wZW4obi50eXBlLG4udXJsLG4uYXN5bmMsbi51c2VybmFtZSxuLnBhc3N3b3JkKTphLm9wZW4obi50eXBlLG4udXJsLG4uYXN5bmMpO2lmKG4ueGhyRmllbGRzKWZvcih1IGluIG4ueGhyRmllbGRzKWFbdV09bi54aHJGaWVsZHNbdV07bi5taW1lVHlwZSYmYS5vdmVycmlkZU1pbWVUeXBlJiZhLm92ZXJyaWRlTWltZVR5cGUobi5taW1lVHlwZSksIW4uY3Jvc3NEb21haW4mJiFpWyJYLVJlcXVlc3RlZC1XaXRoIl0mJihpWyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0Iik7dHJ5e2Zvcih1IGluIGkpYS5zZXRSZXF1ZXN0SGVhZGVyKHUsaVt1XSl9Y2F0Y2goZil7fWEuc2VuZChuLmhhc0NvbnRlbnQmJm4uZGF0YXx8bnVsbCkscj1mdW5jdGlvbihlLGkpe3ZhciB1LGYsbCxjLGg7dHJ5e2lmKHImJihpfHxhLnJlYWR5U3RhdGU9PT00KSl7cj10LG8mJihhLm9ucmVhZHlzdGF0ZWNoYW5nZT12Lm5vb3AsQm4mJmRlbGV0ZSBIbltvXSk7aWYoaSlhLnJlYWR5U3RhdGUhPT00JiZhLmFib3J0KCk7ZWxzZXt1PWEuc3RhdHVzLGw9YS5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSxjPXt9LGg9YS5yZXNwb25zZVhNTCxoJiZoLmRvY3VtZW50RWxlbWVudCYmKGMueG1sPWgpO3RyeXtjLnRleHQ9YS5yZXNwb25zZVRleHR9Y2F0Y2goZSl7fXRyeXtmPWEuc3RhdHVzVGV4dH1jYXRjaChwKXtmPSIifSF1JiZuLmlzTG9jYWwmJiFuLmNyb3NzRG9tYWluP3U9Yy50ZXh0PzIwMDo0MDQ6dT09PTEyMjMmJih1PTIwNCl9fX1jYXRjaChkKXtpfHxzKC0xLGQpfWMmJnModSxmLGMsbCl9LG4uYXN5bmM/YS5yZWFkeVN0YXRlPT09ND9zZXRUaW1lb3V0KHIsMCk6KG89KytqbixCbiYmKEhufHwoSG49e30sdihlKS51bmxvYWQoQm4pKSxIbltvXT1yKSxhLm9ucmVhZHlzdGF0ZWNoYW5nZT1yKTpyKCl9LGFib3J0OmZ1bmN0aW9uKCl7ciYmcigwLDEpfX19fSk7dmFyIHFuLFJuLFVuPS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyx6bj1uZXcgUmVnRXhwKCJeKD86KFstK10pPXwpKCIrbSsiKShbYS16JV0qKSQiLCJpIiksV249L3F1ZXVlSG9va3MkLyxYbj1bR25dLFZuPXsiKiI6W2Z1bmN0aW9uKGUsdCl7dmFyIG4scixpPXRoaXMuY3JlYXRlVHdlZW4oZSx0KSxzPXpuLmV4ZWModCksbz1pLmN1cigpLHU9K298fDAsYT0xLGY9MjA7aWYocyl7bj0rc1syXSxyPXNbM118fCh2LmNzc051bWJlcltlXT8iIjoicHgiKTtpZihyIT09InB4IiYmdSl7dT12LmNzcyhpLmVsZW0sZSwhMCl8fG58fDE7ZG8gYT1hfHwiLjUiLHUvPWEsdi5zdHlsZShpLmVsZW0sZSx1K3IpO3doaWxlKGEhPT0oYT1pLmN1cigpL28pJiZhIT09MSYmLS1mKX1pLnVuaXQ9cixpLnN0YXJ0PXUsaS5lbmQ9c1sxXT91KyhzWzFdKzEpKm46bn1yZXR1cm4gaX1dfTt2LkFuaW1hdGlvbj12LmV4dGVuZChLbix7dHdlZW5lcjpmdW5jdGlvbihlLHQpe3YuaXNGdW5jdGlvbihlKT8odD1lLGU9WyIqIl0pOmU9ZS5zcGxpdCgiICIpO3ZhciBuLHI9MCxpPWUubGVuZ3RoO2Zvcig7cjxpO3IrKyluPWVbcl0sVm5bbl09Vm5bbl18fFtdLFZuW25dLnVuc2hpZnQodCl9LHByZWZpbHRlcjpmdW5jdGlvbihlLHQpe3Q/WG4udW5zaGlmdChlKTpYbi5wdXNoKGUpfX0pLHYuVHdlZW49WW4sWW4ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpZbixpbml0OmZ1bmN0aW9uKGUsdCxuLHIsaSxzKXt0aGlzLmVsZW09ZSx0aGlzLnByb3A9bix0aGlzLmVhc2luZz1pfHwic3dpbmciLHRoaXMub3B0aW9ucz10LHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1yLHRoaXMudW5pdD1zfHwodi5jc3NOdW1iZXJbbl0/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBlPVluLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBlJiZlLmdldD9lLmdldCh0aGlzKTpZbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oZSl7dmFyIHQsbj1Zbi5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPXQ9di5lYXNpbmdbdGhpcy5lYXNpbmddKGUsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmUsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9dD1lLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSp0K3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLG4mJm4uc2V0P24uc2V0KHRoaXMpOlluLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LFluLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT1Zbi5wcm90b3R5cGUsWW4ucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiBlLmVsZW1bZS5wcm9wXT09bnVsbHx8ISFlLmVsZW0uc3R5bGUmJmUuZWxlbS5zdHlsZVtlLnByb3BdIT1udWxsPyh0PXYuY3NzKGUuZWxlbSxlLnByb3AsITEsIiIpLCF0fHx0PT09ImF1dG8iPzA6dCk6ZS5lbGVtW2UucHJvcF19LHNldDpmdW5jdGlvbihlKXt2LmZ4LnN0ZXBbZS5wcm9wXT92LmZ4LnN0ZXBbZS5wcm9wXShlKTplLmVsZW0uc3R5bGUmJihlLmVsZW0uc3R5bGVbdi5jc3NQcm9wc1tlLnByb3BdXSE9bnVsbHx8di5jc3NIb29rc1tlLnByb3BdKT92LnN0eWxlKGUuZWxlbSxlLnByb3AsZS5ub3crZS51bml0KTplLmVsZW1bZS5wcm9wXT1lLm5vd319fSxZbi5wcm9wSG9va3Muc2Nyb2xsVG9wPVluLnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oZSl7ZS5lbGVtLm5vZGVUeXBlJiZlLmVsZW0ucGFyZW50Tm9kZSYmKGUuZWxlbVtlLnByb3BdPWUubm93KX19LHYuZWFjaChbInRvZ2dsZSIsInNob3ciLCJoaWRlIl0sZnVuY3Rpb24oZSx0KXt2YXIgbj12LmZuW3RdO3YuZm5bdF09ZnVuY3Rpb24ocixpLHMpe3JldHVybiByPT1udWxsfHx0eXBlb2Ygcj09ImJvb2xlYW4ifHwhZSYmdi5pc0Z1bmN0aW9uKHIpJiZ2LmlzRnVuY3Rpb24oaSk/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKFpuKHQsITApLHIsaSxzKX19KSx2LmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLmZpbHRlcihHdCkuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTp0fSxlLG4scil9LGFuaW1hdGU6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9di5pc0VtcHR5T2JqZWN0KGUpLHM9di5zcGVlZCh0LG4sciksbz1mdW5jdGlvbigpe3ZhciB0PUtuKHRoaXMsdi5leHRlbmQoe30sZSkscyk7aSYmdC5zdG9wKCEwKX07cmV0dXJuIGl8fHMucXVldWU9PT0hMT90aGlzLmVhY2gobyk6dGhpcy5xdWV1ZShzLnF1ZXVlLG8pfSxzdG9wOmZ1bmN0aW9uKGUsbixyKXt2YXIgaT1mdW5jdGlvbihlKXt2YXIgdD1lLnN0b3A7ZGVsZXRlIGUuc3RvcCx0KHIpfTtyZXR1cm4gdHlwZW9mIGUhPSJzdHJpbmciJiYocj1uLG49ZSxlPXQpLG4mJmUhPT0hMSYmdGhpcy5xdWV1ZShlfHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD0hMCxuPWUhPW51bGwmJmUrInF1ZXVlSG9va3MiLHM9di50aW1lcnMsbz12Ll9kYXRhKHRoaXMpO2lmKG4pb1tuXSYmb1tuXS5zdG9wJiZpKG9bbl0pO2Vsc2UgZm9yKG4gaW4gbylvW25dJiZvW25dLnN0b3AmJlduLnRlc3QobikmJmkob1tuXSk7Zm9yKG49cy5sZW5ndGg7bi0tOylzW25dLmVsZW09PT10aGlzJiYoZT09bnVsbHx8c1tuXS5xdWV1ZT09PWUpJiYoc1tuXS5hbmltLnN0b3AociksdD0hMSxzLnNwbGljZShuLDEpKTsodHx8IXIpJiZ2LmRlcXVldWUodGhpcyxlKX0pfX0pLHYuZWFjaCh7c2xpZGVEb3duOlpuKCJzaG93Iiksc2xpZGVVcDpabigiaGlkZSIpLHNsaWRlVG9nZ2xlOlpuKCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGUsdCl7di5mbltlXT1mdW5jdGlvbihlLG4scil7cmV0dXJuIHRoaXMuYW5pbWF0ZSh0LGUsbixyKX19KSx2LnNwZWVkPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lJiZ0eXBlb2YgZT09Im9iamVjdCI/di5leHRlbmQoe30sZSk6e2NvbXBsZXRlOm58fCFuJiZ0fHx2LmlzRnVuY3Rpb24oZSkmJmUsZHVyYXRpb246ZSxlYXNpbmc6biYmdHx8dCYmIXYuaXNGdW5jdGlvbih0KSYmdH07ci5kdXJhdGlvbj12LmZ4Lm9mZj8wOnR5cGVvZiByLmR1cmF0aW9uPT0ibnVtYmVyIj9yLmR1cmF0aW9uOnIuZHVyYXRpb24gaW4gdi5meC5zcGVlZHM/di5meC5zcGVlZHNbci5kdXJhdGlvbl06di5meC5zcGVlZHMuX2RlZmF1bHQ7aWYoci5xdWV1ZT09bnVsbHx8ci5xdWV1ZT09PSEwKXIucXVldWU9ImZ4IjtyZXR1cm4gci5vbGQ9ci5jb21wbGV0ZSxyLmNvbXBsZXRlPWZ1bmN0aW9uKCl7di5pc0Z1bmN0aW9uKHIub2xkKSYmci5vbGQuY2FsbCh0aGlzKSxyLnF1ZXVlJiZ2LmRlcXVldWUodGhpcyxyLnF1ZXVlKX0scn0sdi5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihlKXtyZXR1cm4gZX0sc3dpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuLjUtTWF0aC5jb3MoZSpNYXRoLlBJKS8yfX0sdi50aW1lcnM9W10sdi5meD1Zbi5wcm90b3R5cGUuaW5pdCx2LmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgZSx0PXYudGltZXJzLG49MDtmb3IoO248dC5sZW5ndGg7bisrKWU9dFtuXSwhZSgpJiZ0W25dPT09ZSYmdC5zcGxpY2Uobi0tLDEpO3QubGVuZ3RofHx2LmZ4LnN0b3AoKX0sdi5meC50aW1lcj1mdW5jdGlvbihlKXtlKCkmJnYudGltZXJzLnB1c2goZSkmJiFSbiYmKFJuPXNldEludGVydmFsKHYuZngudGljayx2LmZ4LmludGVydmFsKSl9LHYuZnguaW50ZXJ2YWw9MTMsdi5meC5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbChSbiksUm49bnVsbH0sdi5meC5zcGVlZHM9e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0sdi5meC5zdGVwPXt9LHYuZXhwciYmdi5leHByLmZpbHRlcnMmJih2LmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gdi5ncmVwKHYudGltZXJzLGZ1bmN0aW9uKHQpe3JldHVybiBlPT09dC5lbGVtfSkubGVuZ3RofSk7dmFyIGVyPS9eKD86Ym9keXxodG1sKSQvaTt2LmZuLm9mZnNldD1mdW5jdGlvbihlKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBlPT09dD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbih0KXt2Lm9mZnNldC5zZXRPZmZzZXQodGhpcyxlLHQpfSk7dmFyIG4scixpLHMsbyx1LGEsZj17dG9wOjAsbGVmdDowfSxsPXRoaXNbMF0sYz1sJiZsLm93bmVyRG9jdW1lbnQ7aWYoIWMpcmV0dXJuO3JldHVybihyPWMuYm9keSk9PT1sP3Yub2Zmc2V0LmJvZHlPZmZzZXQobCk6KG49Yy5kb2N1bWVudEVsZW1lbnQsdi5jb250YWlucyhuLGwpPyh0eXBlb2YgbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QhPSJ1bmRlZmluZWQiJiYoZj1sLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSxpPXRyKGMpLHM9bi5jbGllbnRUb3B8fHIuY2xpZW50VG9wfHwwLG89bi5jbGllbnRMZWZ0fHxyLmNsaWVudExlZnR8fDAsdT1pLnBhZ2VZT2Zmc2V0fHxuLnNjcm9sbFRvcCxhPWkucGFnZVhPZmZzZXR8fG4uc2Nyb2xsTGVmdCx7dG9wOmYudG9wK3UtcyxsZWZ0OmYubGVmdCthLW99KTpmKX0sdi5vZmZzZXQ9e2JvZHlPZmZzZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vZmZzZXRUb3Asbj1lLm9mZnNldExlZnQ7cmV0dXJuIHYuc3VwcG9ydC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCYmKHQrPXBhcnNlRmxvYXQodi5jc3MoZSwibWFyZ2luVG9wIikpfHwwLG4rPXBhcnNlRmxvYXQodi5jc3MoZSwibWFyZ2luTGVmdCIpKXx8MCkse3RvcDp0LGxlZnQ6bn19LHNldE9mZnNldDpmdW5jdGlvbihlLHQsbil7dmFyIHI9di5jc3MoZSwicG9zaXRpb24iKTtyPT09InN0YXRpYyImJihlLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpO3ZhciBpPXYoZSkscz1pLm9mZnNldCgpLG89di5jc3MoZSwidG9wIiksdT12LmNzcyhlLCJsZWZ0IiksYT0ocj09PSJhYnNvbHV0ZSJ8fHI9PT0iZml4ZWQiKSYmdi5pbkFycmF5KCJhdXRvIixbbyx1XSk+LTEsZj17fSxsPXt9LGMsaDthPyhsPWkucG9zaXRpb24oKSxjPWwudG9wLGg9bC5sZWZ0KTooYz1wYXJzZUZsb2F0KG8pfHwwLGg9cGFyc2VGbG9hdCh1KXx8MCksdi5pc0Z1bmN0aW9uKHQpJiYodD10LmNhbGwoZSxuLHMpKSx0LnRvcCE9bnVsbCYmKGYudG9wPXQudG9wLXMudG9wK2MpLHQubGVmdCE9bnVsbCYmKGYubGVmdD10LmxlZnQtcy5sZWZ0K2gpLCJ1c2luZyJpbiB0P3QudXNpbmcuY2FsbChlLGYpOmkuY3NzKGYpfX0sdi5mbi5leHRlbmQoe3Bvc2l0aW9uOmZ1bmN0aW9uKCl7aWYoIXRoaXNbMF0pcmV0dXJuO3ZhciBlPXRoaXNbMF0sdD10aGlzLm9mZnNldFBhcmVudCgpLG49dGhpcy5vZmZzZXQoKSxyPWVyLnRlc3QodFswXS5ub2RlTmFtZSk/e3RvcDowLGxlZnQ6MH06dC5vZmZzZXQoKTtyZXR1cm4gbi50b3AtPXBhcnNlRmxvYXQodi5jc3MoZSwibWFyZ2luVG9wIikpfHwwLG4ubGVmdC09cGFyc2VGbG9hdCh2LmNzcyhlLCJtYXJnaW5MZWZ0IikpfHwwLHIudG9wKz1wYXJzZUZsb2F0KHYuY3NzKHRbMF0sImJvcmRlclRvcFdpZHRoIikpfHwwLHIubGVmdCs9cGFyc2VGbG9hdCh2LmNzcyh0WzBdLCJib3JkZXJMZWZ0V2lkdGgiKSl8fDAse3RvcDpuLnRvcC1yLnRvcCxsZWZ0Om4ubGVmdC1yLmxlZnR9fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9mZnNldFBhcmVudHx8aS5ib2R5O3doaWxlKGUmJiFlci50ZXN0KGUubm9kZU5hbWUpJiZ2LmNzcyhlLCJwb3NpdGlvbiIpPT09InN0YXRpYyIpZT1lLm9mZnNldFBhcmVudDtyZXR1cm4gZXx8aS5ib2R5fSl9fSksdi5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKGUsbil7dmFyIHI9L1kvLnRlc3Qobik7di5mbltlXT1mdW5jdGlvbihpKXtyZXR1cm4gdi5hY2Nlc3ModGhpcyxmdW5jdGlvbihlLGkscyl7dmFyIG89dHIoZSk7aWYocz09PXQpcmV0dXJuIG8/biBpbiBvP29bbl06by5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbaV06ZVtpXTtvP28uc2Nyb2xsVG8ocj92KG8pLnNjcm9sbExlZnQoKTpzLHI/czp2KG8pLnNjcm9sbFRvcCgpKTplW2ldPXN9LGUsaSxhcmd1bWVudHMubGVuZ3RoLG51bGwpfX0pLHYuZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKGUsbil7di5lYWNoKHtwYWRkaW5nOiJpbm5lciIrZSxjb250ZW50Om4sIiI6Im91dGVyIitlfSxmdW5jdGlvbihyLGkpe3YuZm5baV09ZnVuY3Rpb24oaSxzKXt2YXIgbz1hcmd1bWVudHMubGVuZ3RoJiYocnx8dHlwZW9mIGkhPSJib29sZWFuIiksdT1yfHwoaT09PSEwfHxzPT09ITA/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiB2LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKG4scixpKXt2YXIgcztyZXR1cm4gdi5pc1dpbmRvdyhuKT9uLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IitlXTpuLm5vZGVUeXBlPT09OT8ocz1uLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChuLmJvZHlbInNjcm9sbCIrZV0sc1sic2Nyb2xsIitlXSxuLmJvZHlbIm9mZnNldCIrZV0sc1sib2Zmc2V0IitlXSxzWyJjbGllbnQiK2VdKSk6aT09PXQ/di5jc3MobixyLGksdSk6di5zdHlsZShuLHIsaSx1KX0sbixvP2k6dCxvLG51bGwpfX0pfSksZS5qUXVlcnk9ZS4kPXYsdHlwZW9mIGRlZmluZT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZCYmZGVmaW5lLmFtZC5qUXVlcnkmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiB2fSl9KSh3aW5kb3cpOwooZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlLmZuLmZvdW5kYXRpb25NZWRpYVF1ZXJ5Vmlld2VyPWZ1bmN0aW9uKHQpe3ZhciBuPWUuZXh0ZW5kKHQse3RvZ2dsZUtleTo3N30pLHI9ZShkb2N1bWVudCk7ci5vbigia2V5dXAubWVkaWFRdWVyeVZpZXdlciIsIjppbnB1dCIsZnVuY3Rpb24oZSl7ZS53aGljaD09PW4udG9nZ2xlS2V5JiZlLnN0b3BQcm9wYWdhdGlvbigpfSksci5vbigia2V5dXAubWVkaWFRdWVyeVZpZXdlciIsZnVuY3Rpb24odCl7dmFyIHI9ZSgiI2ZxdiIpO3Qud2hpY2g9PT1uLnRvZ2dsZUtleSYmKHIubGVuZ3RoPjA/ci5yZW1vdmUoKTplKCJib2R5IikucHJlcGVuZCgnPGRpdiBpZD0iZnF2IiBzdHlsZT0icG9zaXRpb246Zml4ZWQ7dG9wOjRweDtsZWZ0OjRweDt6LWluZGV4Ojk5OTtjb2xvcjojZmZmOyI+PHAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjc1KTtwYWRkaW5nOjVweDttYXJnaW4tYm90dG9tOjFweDtsaW5lLWhlaWdodDoxLjI7Ij48c3BhbiBjbGFzcz0ibGVmdCI+TWVkaWE6PC9zcGFuPiA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6Ym9sZDsiIGNsYXNzPSJzaG93LWZvci14bGFyZ2UiPkV4dHJhIExhcmdlPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDpib2xkOyIgY2xhc3M9InNob3ctZm9yLWxhcmdlIj5MYXJnZTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6Ym9sZDsiIGNsYXNzPSJzaG93LWZvci1tZWRpdW0iPk1lZGl1bTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6Ym9sZDsiIGNsYXNzPSJzaG93LWZvci1zbWFsbCI+U21hbGw8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OmJvbGQ7IiBjbGFzcz0ic2hvdy1mb3ItbGFuZHNjYXBlIj5MYW5kc2NhcGU8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OmJvbGQ7IiBjbGFzcz0ic2hvdy1mb3ItcG9ydHJhaXQiPlBvcnRyYWl0PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDpib2xkOyIgY2xhc3M9InNob3ctZm9yLXRvdWNoIj5Ub3VjaDwvc3Bhbj48L3A+PC9kaXY+JykpfSl9fSkoalF1ZXJ5LHRoaXMpOwovKgogKiBqUXVlcnkgQ3VzdG9tIEZvcm1zIFBsdWdpbiAxLjAKICogd3d3LlpVUkIuY29tCiAqIENvcHlyaWdodCAyMDEwLCBaVVJCCiAqIEZyZWUgdG8gdXNlIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAKKi8KKGZ1bmN0aW9uKGUpe3ZhciB0PWZ1bmN0aW9uKCl7cmV0dXJue3RtcDpbXSxoaWRkZW46bnVsbCxhZGp1c3Q6ZnVuY3Rpb24odCl7dmFyIG49dGhpcztuLmhpZGRlbj10LnBhcmVudHMoKS5hbmRTZWxmKCkuZmlsdGVyKCI6aGlkZGVuIiksbi5oaWRkZW4uZWFjaChmdW5jdGlvbigpe3ZhciB0PWUodGhpcyk7bi50bXAucHVzaCh0LmF0dHIoInN0eWxlIikpLHQuY3NzKHt2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0pfSl9LHJlc2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0LmhpZGRlbi5lYWNoKGZ1bmN0aW9uKG4pe3ZhciByPWUodGhpcyksaT10LnRtcFtuXTtpPT09dW5kZWZpbmVkP3IucmVtb3ZlQXR0cigic3R5bGUiKTpyLmF0dHIoInN0eWxlIixpKX0pLHQudG1wPVtdLHQuaGlkZGVuPW51bGx9fX07alF1ZXJ5LmZvdW5kYXRpb249alF1ZXJ5LmZvdW5kYXRpb258fHt9LGpRdWVyeS5mb3VuZGF0aW9uLmN1c3RvbUZvcm1zPWpRdWVyeS5mb3VuZGF0aW9uLmN1c3RvbUZvcm1zfHx7fSxlLmZvdW5kYXRpb24uY3VzdG9tRm9ybXMuYXBwZW5kQ3VzdG9tTWFya3VwPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIGkodCxuKXt2YXIgcj1lKG4pLmhpZGUoKSxpPXIuYXR0cigidHlwZSIpLHM9ci5uZXh0KCJzcGFuLmN1c3RvbS4iK2kpO3MubGVuZ3RoPT09MCYmKHM9ZSgnPHNwYW4gY2xhc3M9ImN1c3RvbSAnK2krJyI+PC9zcGFuPicpLmluc2VydEFmdGVyKHIpKSxzLnRvZ2dsZUNsYXNzKCJjaGVja2VkIixyLmlzKCI6Y2hlY2tlZCIpKSxzLnRvZ2dsZUNsYXNzKCJkaXNhYmxlZCIsci5pcygiOmRpc2FibGVkIikpfWZ1bmN0aW9uIHMocixpKXt2YXIgcz10KCksbz1lKGkpLHU9by5uZXh0KCJkaXYuY3VzdG9tLmRyb3Bkb3duIiksYT11LmZpbmQoInVsIiksZj11LmZpbmQoIi5jdXJyZW50IiksbD11LmZpbmQoIi5zZWxlY3RvciIpLGM9by5maW5kKCJvcHRpb24iKSxoPWMuZmlsdGVyKCI6c2VsZWN0ZWQiKSxwPTAsZD0iIix2LG09ITE7aWYoby5oYXNDbGFzcyhuLmRpc2FibGVfY2xhc3MpKXJldHVybjtpZih1Lmxlbmd0aD09PTApe3ZhciBnPW8uaGFzQ2xhc3MoInNtYWxsIik/InNtYWxsIjpvLmhhc0NsYXNzKCJtZWRpdW0iKT8ibWVkaXVtIjpvLmhhc0NsYXNzKCJsYXJnZSIpPyJsYXJnZSI6by5oYXNDbGFzcygiZXhwYW5kIik/ImV4cGFuZCI6IiI7dT1lKCc8ZGl2IGNsYXNzPSInK1siY3VzdG9tIiwiZHJvcGRvd24iLGddLmpvaW4oIiAiKSsnIj48YSBocmVmPSIjIiBjbGFzcz0ic2VsZWN0b3IiPjwvYT48dWwgLz48L2Rpdj4nKSxsPXUuZmluZCgiLnNlbGVjdG9yIiksYT11LmZpbmQoInVsIiksZD1jLm1hcChmdW5jdGlvbigpe3JldHVybiI8bGk+IitlKHRoaXMpLmh0bWwoKSsiPC9saT4ifSkuZ2V0KCkuam9pbigiIiksYS5hcHBlbmQoZCksbT11LnByZXBlbmQoJzxhIGhyZWY9IiMiIGNsYXNzPSJjdXJyZW50Ij4nK2guaHRtbCgpKyI8L2E+IikuZmluZCgiLmN1cnJlbnQiKSxvLmFmdGVyKHUpLmhpZGUoKX1lbHNlIGQ9Yy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4iPGxpPiIrZSh0aGlzKS5odG1sKCkrIjwvbGk+In0pLmdldCgpLmpvaW4oIiIpLGEuaHRtbCgiIikuYXBwZW5kKGQpO3UudG9nZ2xlQ2xhc3MoImRpc2FibGVkIixvLmlzKCI6ZGlzYWJsZWQiKSksdj1hLmZpbmQoImxpIiksYy5lYWNoKGZ1bmN0aW9uKHQpe3RoaXMuc2VsZWN0ZWQmJih2LmVxKHQpLmFkZENsYXNzKCJzZWxlY3RlZCIpLG0mJm0uaHRtbChlKHRoaXMpLmh0bWwoKSkpfSksYS5jc3MoIndpZHRoIiwiYXV0byIpLHUuY3NzKCJ3aWR0aCIsImF1dG8iKSx1LmlzKCIuc21hbGwsIC5tZWRpdW0sIC5sYXJnZSwgLmV4cGFuZCIpfHwodS5hZGRDbGFzcygib3BlbiIpLHMuYWRqdXN0KGEpLHA9di5vdXRlcldpZHRoKCk+cD92Lm91dGVyV2lkdGgoKTpwLHMucmVzZXQoKSx1LnJlbW92ZUNsYXNzKCJvcGVuIiksdS53aWR0aChwKzE4KSxhLndpZHRoKHArMTYpKX12YXIgcj17ZGlzYWJsZV9jbGFzczoibm8tY3VzdG9tIn07bj1lLmV4dGVuZChyLG4pLGUoImZvcm0uY3VzdG9tIGlucHV0OnJhZGlvW2RhdGEtY3VzdG9tZm9ybXMhPWRpc2FibGVkXSIpLmVhY2goaSksZSgiZm9ybS5jdXN0b20gaW5wdXQ6Y2hlY2tib3hbZGF0YS1jdXN0b21mb3JtcyE9ZGlzYWJsZWRdIikuZWFjaChpKSxlKCJmb3JtLmN1c3RvbSBzZWxlY3RbZGF0YS1jdXN0b21mb3JtcyE9ZGlzYWJsZWRdIikuZWFjaChzKX07dmFyIG49ZnVuY3Rpb24odCl7dmFyIG49MCxyPXQubmV4dCgpOyRvcHRpb25zPXQuZmluZCgib3B0aW9uIiksci5maW5kKCJ1bCIpLmh0bWwoIiIpLCRvcHRpb25zLmVhY2goZnVuY3Rpb24oKXskbGk9ZSgiPGxpPiIrZSh0aGlzKS5odG1sKCkrIjwvbGk+Iiksci5maW5kKCJ1bCIpLmFwcGVuZCgkbGkpfSksJG9wdGlvbnMuZWFjaChmdW5jdGlvbih0KXt0aGlzLnNlbGVjdGVkJiYoci5maW5kKCJsaSIpLmVxKHQpLmFkZENsYXNzKCJzZWxlY3RlZCIpLHIuZmluZCgiLmN1cnJlbnQiKS5odG1sKGUodGhpcykuaHRtbCgpKSl9KSxyLnJlbW92ZUF0dHIoInN0eWxlIikuZmluZCgidWwiKS5yZW1vdmVBdHRyKCJzdHlsZSIpLHIuZmluZCgibGkiKS5lYWNoKGZ1bmN0aW9uKCl7ci5hZGRDbGFzcygib3BlbiIpLGUodGhpcykub3V0ZXJXaWR0aCgpPm4mJihuPWUodGhpcykub3V0ZXJXaWR0aCgpKSxyLnJlbW92ZUNsYXNzKCJvcGVuIil9KSxyLmNzcygid2lkdGgiLG4rMTgrInB4Iiksci5maW5kKCJ1bCIpLmNzcygid2lkdGgiLG4rMTYrInB4Iil9LHI9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wcmV2KCksbj10WzBdOyExPT09dC5pcygiOmRpc2FibGVkIikmJihuLmNoZWNrZWQ9bi5jaGVja2VkPyExOiEwLGUudG9nZ2xlQ2xhc3MoImNoZWNrZWQiKSx0LnRyaWdnZXIoImNoYW5nZSIpKX0saT1mdW5jdGlvbihlKXt2YXIgdD1lLnByZXYoKSxuPXQuY2xvc2VzdCgiZm9ybS5jdXN0b20iKSxyPXRbMF07ITE9PT10LmlzKCI6ZGlzYWJsZWQiKSYmKG4uZmluZCgnaW5wdXQ6cmFkaW9bbmFtZT0iJyt0LmF0dHIoIm5hbWUiKSsnIl0nKS5uZXh0KCkubm90KGUpLnJlbW92ZUNsYXNzKCJjaGVja2VkIiksZS5oYXNDbGFzcygiY2hlY2tlZCIpfHxlLnRvZ2dsZUNsYXNzKCJjaGVja2VkIiksci5jaGVja2VkPWUuaGFzQ2xhc3MoImNoZWNrZWQiKSx0LnRyaWdnZXIoImNoYW5nZSIpKX07ZShkb2N1bWVudCkub24oImNsaWNrIiwiZm9ybS5jdXN0b20gc3Bhbi5jdXN0b20uY2hlY2tib3giLGZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLHIoZSh0aGlzKSl9KSxlKGRvY3VtZW50KS5vbigiY2xpY2siLCJmb3JtLmN1c3RvbSBzcGFuLmN1c3RvbS5yYWRpbyIsZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksaShlKHRoaXMpKX0pLGUoZG9jdW1lbnQpLm9uKCJjaGFuZ2UiLCJmb3JtLmN1c3RvbSBzZWxlY3RbZGF0YS1jdXN0b21mb3JtcyE9ZGlzYWJsZWRdIixmdW5jdGlvbih0KXtuKGUodGhpcykpfSksZShkb2N1bWVudCkub24oImNsaWNrIiwiZm9ybS5jdXN0b20gbGFiZWwiLGZ1bmN0aW9uKHQpe3ZhciBuPWUoIiMiK2UodGhpcykuYXR0cigiZm9yIikrIltkYXRhLWN1c3RvbWZvcm1zIT1kaXNhYmxlZF0iKSxzLG87bi5sZW5ndGghPT0wJiYobi5hdHRyKCJ0eXBlIik9PT0iY2hlY2tib3giPyh0LnByZXZlbnREZWZhdWx0KCkscz1lKHRoaXMpLmZpbmQoInNwYW4uY3VzdG9tLmNoZWNrYm94Iikscy5sZW5ndGg9PTAmJihzPWUodGhpcykubmV4dCgic3Bhbi5jdXN0b20uY2hlY2tib3giKSkscy5sZW5ndGg9PTAmJihzPWUodGhpcykucHJldigic3Bhbi5jdXN0b20uY2hlY2tib3giKSkscihzKSk6bi5hdHRyKCJ0eXBlIik9PT0icmFkaW8iJiYodC5wcmV2ZW50RGVmYXVsdCgpLG89ZSh0aGlzKS5maW5kKCJzcGFuLmN1c3RvbS5yYWRpbyIpLG8ubGVuZ3RoPT0wJiYobz1lKHRoaXMpLm5leHQoInNwYW4uY3VzdG9tLnJhZGlvIikpLG8ubGVuZ3RoPT0wJiYobz1lKHRoaXMpLnByZXYoInNwYW4uY3VzdG9tLnJhZGlvIikpLGkobykpKX0pLGUoZG9jdW1lbnQpLm9uKCJjbGljayIsImZvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24gYS5jdXJyZW50LCBmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duIGEuc2VsZWN0b3IiLGZ1bmN0aW9uKHQpe3ZhciBuPWUodGhpcykscj1uLmNsb3Nlc3QoImRpdi5jdXN0b20uZHJvcGRvd24iKSxpPXIucHJldigpO3QucHJldmVudERlZmF1bHQoKSxlKCJkaXYuZHJvcGRvd24iKS5yZW1vdmVDbGFzcygib3BlbiIpO2lmKCExPT09aS5pcygiOmRpc2FibGVkIikpcmV0dXJuIHIudG9nZ2xlQ2xhc3MoIm9wZW4iKSxyLmhhc0NsYXNzKCJvcGVuIik/ZShkb2N1bWVudCkuYmluZCgiY2xpY2suY3VzdG9tZHJvcGRvd24iLGZ1bmN0aW9uKHQpe3IucmVtb3ZlQ2xhc3MoIm9wZW4iKSxlKGRvY3VtZW50KS51bmJpbmQoIi5jdXN0b21kcm9wZG93biIpfSk6ZShkb2N1bWVudCkudW5iaW5kKCIuY3VzdG9tZHJvcGRvd24iKSwhMX0pLGUoZG9jdW1lbnQpLm9uKCJjbGljayIsImZvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24gbGkiLGZ1bmN0aW9uKHQpe3ZhciBuPWUodGhpcykscj1uLmNsb3Nlc3QoImRpdi5jdXN0b20uZHJvcGRvd24iKSxpPXIucHJldigpLHM9MDt0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSxlKCJkaXYuZHJvcGRvd24iKS5yZW1vdmVDbGFzcygib3BlbiIpLG4uY2xvc2VzdCgidWwiKS5maW5kKCJsaSIpLnJlbW92ZUNsYXNzKCJzZWxlY3RlZCIpLG4uYWRkQ2xhc3MoInNlbGVjdGVkIiksci5yZW1vdmVDbGFzcygib3BlbiIpLmZpbmQoImEuY3VycmVudCIpLmh0bWwobi5odG1sKCkpLG4uY2xvc2VzdCgidWwiKS5maW5kKCJsaSIpLmVhY2goZnVuY3Rpb24oZSl7blswXT09dGhpcyYmKHM9ZSl9KSxpWzBdLnNlbGVjdGVkSW5kZXg9cyxpLnRyaWdnZXIoImNoYW5nZSIpfSksZS5mbi5mb3VuZGF0aW9uQ3VzdG9tRm9ybXM9ZS5mb3VuZGF0aW9uLmN1c3RvbUZvcm1zLmFwcGVuZEN1c3RvbU1hcmt1cH0pKGpRdWVyeSk7Ci8vIGpxdWVyeS5ldmVudC5tb3ZlCi8vCi8vIDEuMy4xCi8vCi8vIFN0ZXBoZW4gQmFuZAovLwovLyBUcmlnZ2VycyAnbW92ZXN0YXJ0JywgJ21vdmUnIGFuZCAnbW92ZWVuZCcgZXZlbnRzIGFmdGVyCi8vIG1vdXNlbW92ZXMgZm9sbG93aW5nIGEgbW91c2Vkb3duIGNyb3NzIGEgZGlzdGFuY2UgdGhyZXNob2xkLAovLyBzaW1pbGFyIHRvIHRoZSBuYXRpdmUgJ2RyYWdzdGFydCcsICdkcmFnJyBhbmQgJ2RyYWdlbmQnIGV2ZW50cy4KLy8gTW92ZSBldmVudHMgYXJlIHRocm90dGxlZCB0byBhbmltYXRpb24gZnJhbWVzLiBNb3ZlIGV2ZW50IG9iamVjdHMKLy8gaGF2ZSB0aGUgcHJvcGVydGllczoKLy8KLy8gcGFnZVg6Ci8vIHBhZ2VZOiAgIFBhZ2UgY29vcmRpbmF0ZXMgb2YgcG9pbnRlci4KLy8gc3RhcnRYOgovLyBzdGFydFk6ICBQYWdlIGNvb3JkaW5hdGVzIG9mIHBvaW50ZXIgYXQgbW92ZXN0YXJ0LgovLyBkaXN0WDoKLy8gZGlzdFk6ICBEaXN0YW5jZSB0aGUgcG9pbnRlciBoYXMgbW92ZWQgc2luY2UgbW92ZXN0YXJ0LgovLyBkZWx0YVg6Ci8vIGRlbHRhWTogIERpc3RhbmNlIHRoZSBmaW5nZXIgaGFzIG1vdmVkIHNpbmNlIGxhc3QgZXZlbnQuCi8vIHZlbG9jaXR5WDoKLy8gdmVsb2NpdHlZOiAgQXZlcmFnZSB2ZWxvY2l0eSBvdmVyIGxhc3QgZmV3IGV2ZW50cy4KKGZ1bmN0aW9uKGUpe3R5cGVvZiBkZWZpbmU9PSJmdW5jdGlvbiImJmRlZmluZS5hbWQ/ZGVmaW5lKFsianF1ZXJ5Il0sZSk6ZShqUXVlcnkpfSkoZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBsKGUpe2Z1bmN0aW9uIGkoZSl7bj8odCgpLG8oaSkscj0hMCxuPSExKTpyPSExfXZhciB0PWUsbj0hMSxyPSExO3RoaXMua2ljaz1mdW5jdGlvbihlKXtuPSEwLHJ8fGkoKX0sdGhpcy5lbmQ9ZnVuY3Rpb24oZSl7dmFyIGk9dDtpZighZSlyZXR1cm47cj8odD1uP2Z1bmN0aW9uKCl7aSgpLGUoKX06ZSxuPSEwKTplKCl9fWZ1bmN0aW9uIGMoKXtyZXR1cm4hMH1mdW5jdGlvbiBoKCl7cmV0dXJuITF9ZnVuY3Rpb24gcChlKXtlLnByZXZlbnREZWZhdWx0KCl9ZnVuY3Rpb24gZChlKXtpZih1W2UudGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKV0pcmV0dXJuO2UucHJldmVudERlZmF1bHQoKX1mdW5jdGlvbiB2KGUpe3JldHVybiBlLndoaWNoPT09MSYmIWUuY3RybEtleSYmIWUuYWx0S2V5fWZ1bmN0aW9uIG0oZSx0KXt2YXIgbixyO2lmKGUuaWRlbnRpZmllZFRvdWNoKXJldHVybiBlLmlkZW50aWZpZWRUb3VjaCh0KTtuPS0xLHI9ZS5sZW5ndGg7d2hpbGUoKytuPHIpaWYoZVtuXS5pZGVudGlmaWVyPT09dClyZXR1cm4gZVtuXX1mdW5jdGlvbiBnKGUsdCl7dmFyIG49bShlLmNoYW5nZWRUb3VjaGVzLHQuaWRlbnRpZmllcik7aWYoIW4pcmV0dXJuO2lmKG4ucGFnZVg9PT10LnBhZ2VYJiZuLnBhZ2VZPT09dC5wYWdlWSlyZXR1cm47cmV0dXJuIG59ZnVuY3Rpb24geShlKXt2YXIgdDtpZighdihlKSlyZXR1cm47dD17dGFyZ2V0OmUudGFyZ2V0LHN0YXJ0WDplLnBhZ2VYLHN0YXJ0WTplLnBhZ2VZLHRpbWVTdGFtcDplLnRpbWVTdGFtcH0scihkb2N1bWVudCxhLm1vdmUsYix0KSxyKGRvY3VtZW50LGEuY2FuY2VsLHcsdCl9ZnVuY3Rpb24gYihlKXt2YXIgdD1lLmRhdGE7QyhlLHQsZSxFKX1mdW5jdGlvbiB3KGUpe0UoKX1mdW5jdGlvbiBFKCl7aShkb2N1bWVudCxhLm1vdmUsYiksaShkb2N1bWVudCxhLmNhbmNlbCxFKX1mdW5jdGlvbiBTKGUpe3ZhciB0LG47aWYodVtlLnRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCldKXJldHVybjt0PWUuY2hhbmdlZFRvdWNoZXNbMF0sbj17dGFyZ2V0OnQudGFyZ2V0LHN0YXJ0WDp0LnBhZ2VYLHN0YXJ0WTp0LnBhZ2VZLHRpbWVTdGFtcDplLnRpbWVTdGFtcCxpZGVudGlmaWVyOnQuaWRlbnRpZmllcn0scihkb2N1bWVudCxmLm1vdmUrIi4iK3QuaWRlbnRpZmllcix4LG4pLHIoZG9jdW1lbnQsZi5jYW5jZWwrIi4iK3QuaWRlbnRpZmllcixULG4pfWZ1bmN0aW9uIHgoZSl7dmFyIHQ9ZS5kYXRhLG49ZyhlLHQpO2lmKCFuKXJldHVybjtDKGUsdCxuLE4pfWZ1bmN0aW9uIFQoZSl7dmFyIHQ9ZS5kYXRhLG49bShlLmNoYW5nZWRUb3VjaGVzLHQuaWRlbnRpZmllcik7aWYoIW4pcmV0dXJuO04odC5pZGVudGlmaWVyKX1mdW5jdGlvbiBOKGUpe2koZG9jdW1lbnQsIi4iK2UseCksaShkb2N1bWVudCwiLiIrZSxUKX1mdW5jdGlvbiBDKGUsdCxyLGkpe3ZhciBzPXIucGFnZVgtdC5zdGFydFgsbz1yLnBhZ2VZLXQuc3RhcnRZO2lmKHMqcytvKm88bipuKXJldHVybjtBKGUsdCxyLHMsbyxpKX1mdW5jdGlvbiBrKCl7cmV0dXJuIHRoaXMuX2hhbmRsZWQ9YywhMX1mdW5jdGlvbiBMKGUpe2UuX2hhbmRsZWQoKX1mdW5jdGlvbiBBKGUsdCxuLHIsaSxvKXt2YXIgdT10LnRhcmdldCxhLGY7YT1lLnRhcmdldFRvdWNoZXMsZj1lLnRpbWVTdGFtcC10LnRpbWVTdGFtcCx0LnR5cGU9Im1vdmVzdGFydCIsdC5kaXN0WD1yLHQuZGlzdFk9aSx0LmRlbHRhWD1yLHQuZGVsdGFZPWksdC5wYWdlWD1uLnBhZ2VYLHQucGFnZVk9bi5wYWdlWSx0LnZlbG9jaXR5WD1yL2YsdC52ZWxvY2l0eVk9aS9mLHQudGFyZ2V0VG91Y2hlcz1hLHQuZmluZ2VyPWE/YS5sZW5ndGg6MSx0Ll9oYW5kbGVkPWssdC5fcHJldmVudFRvdWNobW92ZURlZmF1bHQ9ZnVuY3Rpb24oKXtlLnByZXZlbnREZWZhdWx0KCl9LHModC50YXJnZXQsdCksbyh0LmlkZW50aWZpZXIpfWZ1bmN0aW9uIE8oZSl7dmFyIHQ9ZS5kYXRhLmV2ZW50LG49ZS5kYXRhLnRpbWVyO0IodCxlLGUudGltZVN0YW1wLG4pfWZ1bmN0aW9uIE0oZSl7dmFyIHQ9ZS5kYXRhLmV2ZW50LG49ZS5kYXRhLnRpbWVyO18oKSxqKHQsbixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtpKHQudGFyZ2V0LCJjbGljayIsaCl9LDApfSl9ZnVuY3Rpb24gXyhlKXtpKGRvY3VtZW50LGEubW92ZSxPKSxpKGRvY3VtZW50LGEuZW5kLE0pfWZ1bmN0aW9uIEQoZSl7dmFyIHQ9ZS5kYXRhLmV2ZW50LG49ZS5kYXRhLnRpbWVyLHI9ZyhlLHQpO2lmKCFyKXJldHVybjtlLnByZXZlbnREZWZhdWx0KCksdC50YXJnZXRUb3VjaGVzPWUudGFyZ2V0VG91Y2hlcyxCKHQscixlLnRpbWVTdGFtcCxuKX1mdW5jdGlvbiBQKGUpe3ZhciB0PWUuZGF0YS5ldmVudCxuPWUuZGF0YS50aW1lcixyPW0oZS5jaGFuZ2VkVG91Y2hlcyx0LmlkZW50aWZpZXIpO2lmKCFyKXJldHVybjtIKHQpLGoodCxuKX1mdW5jdGlvbiBIKGUpe2koZG9jdW1lbnQsIi4iK2UuaWRlbnRpZmllcixEKSxpKGRvY3VtZW50LCIuIitlLmlkZW50aWZpZXIsUCl9ZnVuY3Rpb24gQihlLHQsbixyKXt2YXIgaT1uLWUudGltZVN0YW1wO2UudHlwZT0ibW92ZSIsZS5kaXN0WD10LnBhZ2VYLWUuc3RhcnRYLGUuZGlzdFk9dC5wYWdlWS1lLnN0YXJ0WSxlLmRlbHRhWD10LnBhZ2VYLWUucGFnZVgsZS5kZWx0YVk9dC5wYWdlWS1lLnBhZ2VZLGUudmVsb2NpdHlYPS4zKmUudmVsb2NpdHlYKy43KmUuZGVsdGFYL2ksZS52ZWxvY2l0eVk9LjMqZS52ZWxvY2l0eVkrLjcqZS5kZWx0YVkvaSxlLnBhZ2VYPXQucGFnZVgsZS5wYWdlWT10LnBhZ2VZLHIua2ljaygpfWZ1bmN0aW9uIGooZSx0LG4pe3QuZW5kKGZ1bmN0aW9uKCl7cmV0dXJuIGUudHlwZT0ibW92ZWVuZCIscyhlLnRhcmdldCxlKSxuJiZuKCl9KX1mdW5jdGlvbiBGKGUsdCxuKXtyZXR1cm4gcih0aGlzLCJtb3Zlc3RhcnQubW92ZSIsTCksITB9ZnVuY3Rpb24gSShlKXtyZXR1cm4gaSh0aGlzLCJkcmFnc3RhcnQgZHJhZyIscCksaSh0aGlzLCJtb3VzZWRvd24gdG91Y2hzdGFydCIsZCksaSh0aGlzLCJtb3Zlc3RhcnQiLEwpLCEwfWZ1bmN0aW9uIHEoZSl7aWYoZS5uYW1lc3BhY2U9PT0ibW92ZSJ8fGUubmFtZXNwYWNlPT09Im1vdmVlbmQiKXJldHVybjtyKHRoaXMsImRyYWdzdGFydC4iK2UuZ3VpZCsiIGRyYWcuIitlLmd1aWQscCx0LGUuc2VsZWN0b3IpLHIodGhpcywibW91c2Vkb3duLiIrZS5ndWlkLGQsdCxlLnNlbGVjdG9yKX1mdW5jdGlvbiBSKGUpe2lmKGUubmFtZXNwYWNlPT09Im1vdmUifHxlLm5hbWVzcGFjZT09PSJtb3ZlZW5kIilyZXR1cm47aSh0aGlzLCJkcmFnc3RhcnQuIitlLmd1aWQrIiBkcmFnLiIrZS5ndWlkKSxpKHRoaXMsIm1vdXNlZG93bi4iK2UuZ3VpZCl9dmFyIG49NixyPWUuZXZlbnQuYWRkLGk9ZS5ldmVudC5yZW1vdmUscz1mdW5jdGlvbih0LG4scil7ZS5ldmVudC50cmlnZ2VyKG4scix0KX0sbz1mdW5jdGlvbigpe3JldHVybiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cub1JlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lfHxmdW5jdGlvbihlLHQpe3JldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UoKX0sMjUpfX0oKSx1PXt0ZXh0YXJlYTohMCxpbnB1dDohMCxzZWxlY3Q6ITAsYnV0dG9uOiEwfSxhPXttb3ZlOiJtb3VzZW1vdmUiLGNhbmNlbDoibW91c2V1cCBkcmFnc3RhcnQiLGVuZDoibW91c2V1cCJ9LGY9e21vdmU6InRvdWNobW92ZSIsY2FuY2VsOiJ0b3VjaGVuZCIsZW5kOiJ0b3VjaGVuZCJ9O2UuZXZlbnQuc3BlY2lhbC5tb3Zlc3RhcnQ9e3NldHVwOkYsdGVhcmRvd246SSxhZGQ6cSxyZW1vdmU6UixfZGVmYXVsdDpmdW5jdGlvbihlKXt2YXIgbixpO2lmKCFlLl9oYW5kbGVkKCkpcmV0dXJuO249e3RhcmdldDplLnRhcmdldCxzdGFydFg6ZS5zdGFydFgsc3RhcnRZOmUuc3RhcnRZLHBhZ2VYOmUucGFnZVgscGFnZVk6ZS5wYWdlWSxkaXN0WDplLmRpc3RYLGRpc3RZOmUuZGlzdFksZGVsdGFYOmUuZGVsdGFYLGRlbHRhWTplLmRlbHRhWSx2ZWxvY2l0eVg6ZS52ZWxvY2l0eVgsdmVsb2NpdHlZOmUudmVsb2NpdHlZLHRpbWVTdGFtcDplLnRpbWVTdGFtcCxpZGVudGlmaWVyOmUuaWRlbnRpZmllcix0YXJnZXRUb3VjaGVzOmUudGFyZ2V0VG91Y2hlcyxmaW5nZXI6ZS5maW5nZXJ9LGk9e2V2ZW50Om4sdGltZXI6bmV3IGwoZnVuY3Rpb24odCl7cyhlLnRhcmdldCxuKX0pfSxlLmlkZW50aWZpZXI9PT10PyhyKGUudGFyZ2V0LCJjbGljayIsaCkscihkb2N1bWVudCxhLm1vdmUsTyxpKSxyKGRvY3VtZW50LGEuZW5kLE0saSkpOihlLl9wcmV2ZW50VG91Y2htb3ZlRGVmYXVsdCgpLHIoZG9jdW1lbnQsZi5tb3ZlKyIuIitlLmlkZW50aWZpZXIsRCxpKSxyKGRvY3VtZW50LGYuZW5kKyIuIitlLmlkZW50aWZpZXIsUCxpKSl9fSxlLmV2ZW50LnNwZWNpYWwubW92ZT17c2V0dXA6ZnVuY3Rpb24oKXtyKHRoaXMsIm1vdmVzdGFydC5tb3ZlIixlLm5vb3ApfSx0ZWFyZG93bjpmdW5jdGlvbigpe2kodGhpcywibW92ZXN0YXJ0Lm1vdmUiLGUubm9vcCl9fSxlLmV2ZW50LnNwZWNpYWwubW92ZWVuZD17c2V0dXA6ZnVuY3Rpb24oKXtyKHRoaXMsIm1vdmVzdGFydC5tb3ZlZW5kIixlLm5vb3ApfSx0ZWFyZG93bjpmdW5jdGlvbigpe2kodGhpcywibW92ZXN0YXJ0Lm1vdmVlbmQiLGUubm9vcCl9fSxyKGRvY3VtZW50LCJtb3VzZWRvd24ubW92ZSIseSkscihkb2N1bWVudCwidG91Y2hzdGFydC5tb3ZlIixTKSx0eXBlb2YgQXJyYXkucHJvdG90eXBlLmluZGV4T2Y9PSJmdW5jdGlvbiImJmZ1bmN0aW9uKGUsdCl7dmFyIG49WyJjaGFuZ2VkVG91Y2hlcyIsInRhcmdldFRvdWNoZXMiXSxyPW4ubGVuZ3RoO3doaWxlKHItLSllLmV2ZW50LnByb3BzLmluZGV4T2YobltyXSk9PT0tMSYmZS5ldmVudC5wcm9wcy5wdXNoKG5bcl0pfShlKX0pOwovLyBqUXVlcnkuZXZlbnQuc3dpcGUKLy8gMC41Ci8vIFN0ZXBoZW4gQmFuZAovLyBEZXBlbmRlbmNpZXMKLy8galF1ZXJ5LmV2ZW50Lm1vdmUgMS4yCi8vIE9uZSBvZiBzd2lwZWxlZnQsIHN3aXBlcmlnaHQsIHN3aXBldXAgb3Igc3dpcGVkb3duIGlzIHRyaWdnZXJlZCBvbgovLyBtb3ZlZW5kLCB3aGVuIHRoZSBtb3ZlIGhhcyBjb3ZlcmVkIGEgdGhyZXNob2xkIHJhdGlvIG9mIHRoZSBkaW1lbnNpb24KLy8gb2YgdGhlIHRhcmdldCBub2RlLCBvciBoYXMgZ29uZSByZWFsbHkgZmFzdC4gVGhyZXNob2xkIGFuZCB2ZWxvY2l0eQovLyBzZW5zaXRpdml0eSBjaGFuZ2VkIHdpdGg6Ci8vCi8vIGpRdWVyeS5ldmVudC5zcGVjaWFsLnN3aXBlLnNldHRpbmdzLnRocmVzaG9sZAovLyBqUXVlcnkuZXZlbnQuc3BlY2lhbC5zd2lwZS5zZXR0aW5ncy5zZW5zaXRpdml0eQooZnVuY3Rpb24oZSl7dHlwZW9mIGRlZmluZT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZD9kZWZpbmUoWyJqcXVlcnkiXSxlKTplKGpRdWVyeSl9KShmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG8oZSl7dmFyIHQsbixyO3Q9ZS50YXJnZXQub2Zmc2V0V2lkdGgsbj1lLnRhcmdldC5vZmZzZXRIZWlnaHQscj17ZGlzdFg6ZS5kaXN0WCxkaXN0WTplLmRpc3RZLHZlbG9jaXR5WDplLnZlbG9jaXR5WCx2ZWxvY2l0eVk6ZS52ZWxvY2l0eVksZmluZ2VyOmUuZmluZ2VyfTtpZihlLmRpc3RYPmUuZGlzdFkpe2lmKGUuZGlzdFg+LWUuZGlzdFkpe2lmKGUuZGlzdFgvdD5zLnRocmVzaG9sZHx8ZS52ZWxvY2l0eVgqZS5kaXN0WC90KnMuc2Vuc2l0aXZpdHk+MSlyLnR5cGU9InN3aXBlcmlnaHQiLGkoZS5jdXJyZW50VGFyZ2V0LHIpfWVsc2UgaWYoLWUuZGlzdFkvbj5zLnRocmVzaG9sZHx8ZS52ZWxvY2l0eVkqZS5kaXN0WS90KnMuc2Vuc2l0aXZpdHk+MSlyLnR5cGU9InN3aXBldXAiLGkoZS5jdXJyZW50VGFyZ2V0LHIpfWVsc2UgaWYoZS5kaXN0WD4tZS5kaXN0WSl7aWYoZS5kaXN0WS9uPnMudGhyZXNob2xkfHxlLnZlbG9jaXR5WSplLmRpc3RZL3Qqcy5zZW5zaXRpdml0eT4xKXIudHlwZT0ic3dpcGVkb3duIixpKGUuY3VycmVudFRhcmdldCxyKX1lbHNlIGlmKC1lLmRpc3RYL3Q+cy50aHJlc2hvbGR8fGUudmVsb2NpdHlYKmUuZGlzdFgvdCpzLnNlbnNpdGl2aXR5PjEpci50eXBlPSJzd2lwZWxlZnQiLGkoZS5jdXJyZW50VGFyZ2V0LHIpfWZ1bmN0aW9uIHUodCl7dmFyIG49ZS5kYXRhKHQsImV2ZW50X3N3aXBlIik7cmV0dXJuIG58fChuPXtjb3VudDowfSxlLmRhdGEodCwiZXZlbnRfc3dpcGUiLG4pKSxufXZhciBuPWUuZXZlbnQuYWRkLHI9ZS5ldmVudC5yZW1vdmUsaT1mdW5jdGlvbih0LG4scil7ZS5ldmVudC50cmlnZ2VyKG4scix0KX0scz17dGhyZXNob2xkOi40LHNlbnNpdGl2aXR5OjZ9O2UuZXZlbnQuc3BlY2lhbC5zd2lwZT1lLmV2ZW50LnNwZWNpYWwuc3dpcGVsZWZ0PWUuZXZlbnQuc3BlY2lhbC5zd2lwZXJpZ2h0PWUuZXZlbnQuc3BlY2lhbC5zd2lwZXVwPWUuZXZlbnQuc3BlY2lhbC5zd2lwZWRvd249e3NldHVwOmZ1bmN0aW9uKGUsdCxyKXt2YXIgZT11KHRoaXMpO2lmKGUuY291bnQrKz4wKXJldHVybjtyZXR1cm4gbih0aGlzLCJtb3ZlZW5kIixvKSwhMH0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgZT11KHRoaXMpO2lmKC0tZS5jb3VudD4wKXJldHVybjtyZXR1cm4gcih0aGlzLCJtb3ZlZW5kIixvKSwhMH0sc2V0dGluZ3M6c319KTsKLyoKICogalF1ZXJ5IFJldmVhbCBQbHVnaW4gMS4xCiAqIHd3dy5aVVJCLmNvbQogKiBDb3B5cmlnaHQgMjAxMCwgWlVSQgogKiBGcmVlIHRvIHVzZSB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwCiovCi8qZ2xvYmFscyBqUXVlcnkgKi8KKGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgdD0hMTtlKGRvY3VtZW50KS5vbigiY2xpY2siLCJhW2RhdGEtcmV2ZWFsLWlkXSIsZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpO3ZhciBuPWUodGhpcykuYXR0cigiZGF0YS1yZXZlYWwtaWQiKTtlKCIjIituKS5yZXZlYWwoZSh0aGlzKS5kYXRhKCkpfSksZS5mbi5yZXZlYWw9ZnVuY3Rpb24obil7dmFyIHI9ZShkb2N1bWVudCksaT17YW5pbWF0aW9uOiJmYWRlQW5kUG9wIixhbmltYXRpb25TcGVlZDozMDAsY2xvc2VPbkJhY2tncm91bmRDbGljazohMCxkaXNtaXNzTW9kYWxDbGFzczoiY2xvc2UtcmV2ZWFsLW1vZGFsIixvcGVuOmUubm9vcCxvcGVuZWQ6ZS5ub29wLGNsb3NlOmUubm9vcCxjbG9zZWQ6ZS5ub29wfTtyZXR1cm4gbj1lLmV4dGVuZCh7fSxpLG4pLHRoaXMubm90KCIucmV2ZWFsLW1vZGFsLm9wZW4iKS5lYWNoKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYygpe3U9ITF9ZnVuY3Rpb24gaCgpe3U9ITB9ZnVuY3Rpb24gcCgpe3ZhciBuPWUoIi5yZXZlYWwtbW9kYWwub3BlbiIpO24ubGVuZ3RoPT09MSYmKHQ9ITAsbi50cmlnZ2VyKCJyZXZlYWw6Y2xvc2UiKSl9ZnVuY3Rpb24gZCgpe3V8fChoKCkscCgpLGkuYWRkQ2xhc3MoIm9wZW4iKSxuLmFuaW1hdGlvbj09PSJmYWRlQW5kUG9wIiYmKGYub3Blbi50b3A9ci5zY3JvbGxUb3AoKS1vLGYub3Blbi5vcGFjaXR5PTAsaS5jc3MoZi5vcGVuKSxhLmZhZGVJbihuLmFuaW1hdGlvblNwZWVkLzIpLGkuZGVsYXkobi5hbmltYXRpb25TcGVlZC8yKS5hbmltYXRlKHt0b3A6ci5zY3JvbGxUb3AoKStzKyJweCIsb3BhY2l0eToxfSxuLmFuaW1hdGlvblNwZWVkLGZ1bmN0aW9uKCl7aS50cmlnZ2VyKCJyZXZlYWw6b3BlbmVkIil9KSksbi5hbmltYXRpb249PT0iZmFkZSImJihmLm9wZW4udG9wPXIuc2Nyb2xsVG9wKCkrcyxmLm9wZW4ub3BhY2l0eT0wLGkuY3NzKGYub3BlbiksYS5mYWRlSW4obi5hbmltYXRpb25TcGVlZC8yKSxpLmRlbGF5KG4uYW5pbWF0aW9uU3BlZWQvMikuYW5pbWF0ZSh7b3BhY2l0eToxfSxuLmFuaW1hdGlvblNwZWVkLGZ1bmN0aW9uKCl7aS50cmlnZ2VyKCJyZXZlYWw6b3BlbmVkIil9KSksbi5hbmltYXRpb249PT0ibm9uZSImJihmLm9wZW4udG9wPXIuc2Nyb2xsVG9wKCkrcyxmLm9wZW4ub3BhY2l0eT0xLGkuY3NzKGYub3BlbiksYS5jc3Moe2Rpc3BsYXk6ImJsb2NrIn0pLGkudHJpZ2dlcigicmV2ZWFsOm9wZW5lZCIpKSl9ZnVuY3Rpb24gdigpe3ZhciBlPWkuZmluZCgiLmZsZXgtdmlkZW8iKSx0PWUuZmluZCgiaWZyYW1lIik7dC5sZW5ndGg+MCYmKHQuYXR0cigic3JjIix0LmRhdGEoInNyYyIpKSxlLmZhZGVJbigxMDApKX1mdW5jdGlvbiBtKCl7dXx8KGgoKSxpLnJlbW92ZUNsYXNzKCJvcGVuIiksbi5hbmltYXRpb249PT0iZmFkZUFuZFBvcCImJihpLmFuaW1hdGUoe3RvcDpyLnNjcm9sbFRvcCgpLW8rInB4IixvcGFjaXR5OjB9LG4uYW5pbWF0aW9uU3BlZWQvMixmdW5jdGlvbigpe2kuY3NzKGYuY2xvc2UpfSksdD9pLnRyaWdnZXIoInJldmVhbDpjbG9zZWQiKTphLmRlbGF5KG4uYW5pbWF0aW9uU3BlZWQpLmZhZGVPdXQobi5hbmltYXRpb25TcGVlZCxmdW5jdGlvbigpe2kudHJpZ2dlcigicmV2ZWFsOmNsb3NlZCIpfSkpLG4uYW5pbWF0aW9uPT09ImZhZGUiJiYoaS5hbmltYXRlKHtvcGFjaXR5OjB9LG4uYW5pbWF0aW9uU3BlZWQsZnVuY3Rpb24oKXtpLmNzcyhmLmNsb3NlKX0pLHQ/aS50cmlnZ2VyKCJyZXZlYWw6Y2xvc2VkIik6YS5kZWxheShuLmFuaW1hdGlvblNwZWVkKS5mYWRlT3V0KG4uYW5pbWF0aW9uU3BlZWQsZnVuY3Rpb24oKXtpLnRyaWdnZXIoInJldmVhbDpjbG9zZWQiKX0pKSxuLmFuaW1hdGlvbj09PSJub25lIiYmKGkuY3NzKGYuY2xvc2UpLHR8fGEuY3NzKHtkaXNwbGF5OiJub25lIn0pLGkudHJpZ2dlcigicmV2ZWFsOmNsb3NlZCIpKSx0PSExKX1mdW5jdGlvbiBnKCl7aS51bmJpbmQoIi5yZXZlYWwiKSxhLnVuYmluZCgiLnJldmVhbCIpLGwudW5iaW5kKCIucmV2ZWFsIiksZSgiYm9keSIpLnVuYmluZCgiLnJldmVhbCIpfWZ1bmN0aW9uIHkoKXt2YXIgZT1pLmZpbmQoIi5mbGV4LXZpZGVvIiksdD1lLmZpbmQoImlmcmFtZSIpO3QubGVuZ3RoPjAmJih0LmRhdGEoInNyYyIsdC5hdHRyKCJzcmMiKSksdC5hdHRyKCJzcmMiLCIiKSxlLmZhZGVPdXQoMTAwKSl9dmFyIGk9ZSh0aGlzKSxzPXBhcnNlSW50KGkuY3NzKCJ0b3AiKSwxMCksbz1pLmhlaWdodCgpK3MsdT0hMSxhPWUoIi5yZXZlYWwtbW9kYWwtYmciKSxmPXtvcGVuOnt0b3A6MCxvcGFjaXR5OjAsdmlzaWJpbGl0eToidmlzaWJsZSIsZGlzcGxheToiYmxvY2sifSxjbG9zZTp7dG9wOnMsb3BhY2l0eToxLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToibm9uZSJ9fSxsO2EubGVuZ3RoPT09MCYmKGE9ZSgiPGRpdiAvPiIseyJjbGFzcyI6InJldmVhbC1tb2RhbC1iZyJ9KS5pbnNlcnRBZnRlcihpKSxhLmZhZGVUbygiZmFzdCIsLjgpKSxpLmJpbmQoInJldmVhbDpvcGVuLnJldmVhbCIsZCksaS5iaW5kKCJyZXZlYWw6b3Blbi5yZXZlYWwiLHYpLGkuYmluZCgicmV2ZWFsOmNsb3NlLnJldmVhbCIsbSksaS5iaW5kKCJyZXZlYWw6Y2xvc2VkLnJldmVhbCIseSksaS5iaW5kKCJyZXZlYWw6b3BlbmVkLnJldmVhbCByZXZlYWw6Y2xvc2VkLnJldmVhbCIsYyksaS5iaW5kKCJyZXZlYWw6Y2xvc2VkLnJldmVhbCIsZyksaS5iaW5kKCJyZXZlYWw6b3Blbi5yZXZlYWwiLG4ub3BlbiksaS5iaW5kKCJyZXZlYWw6b3BlbmVkLnJldmVhbCIsbi5vcGVuZWQpLGkuYmluZCgicmV2ZWFsOmNsb3NlLnJldmVhbCIsbi5jbG9zZSksaS5iaW5kKCJyZXZlYWw6Y2xvc2VkLnJldmVhbCIsbi5jbG9zZWQpLGkudHJpZ2dlcigicmV2ZWFsOm9wZW4iKSxsPWUoIi4iK24uZGlzbWlzc01vZGFsQ2xhc3MpLmJpbmQoImNsaWNrLnJldmVhbCIsZnVuY3Rpb24oKXtpLnRyaWdnZXIoInJldmVhbDpjbG9zZSIpfSksbi5jbG9zZU9uQmFja2dyb3VuZENsaWNrJiYoYS5jc3Moe2N1cnNvcjoicG9pbnRlciJ9KSxhLmJpbmQoImNsaWNrLnJldmVhbCIsZnVuY3Rpb24oKXtpLnRyaWdnZXIoInJldmVhbDpjbG9zZSIpfSkpLGUoImJvZHkiKS5iaW5kKCJrZXl1cC5yZXZlYWwiLGZ1bmN0aW9uKGUpe2Uud2hpY2g9PT0yNyYmaS50cmlnZ2VyKCJyZXZlYWw6Y2xvc2UiKX0pfSl9fSkoalF1ZXJ5KTsKLyoKICogalF1ZXJ5IE9yYml0IFBsdWdpbiAxLjQuMAogKiB3d3cuWlVSQi5jb20vcGxheWdyb3VuZAogKiBDb3B5cmlnaHQgMjAxMCwgWlVSQgogKiBGcmVlIHRvIHVzZSB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwCiovCihmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7ZS5mbi5maW5kRmlyc3RJbWFnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpcnN0KCkuZmluZCgiaW1nIikuYW5kU2VsZigpLmZpbHRlcigiaW1nIikuZmlyc3QoKX07dmFyIHQ9e2RlZmF1bHRzOnthbmltYXRpb246Imhvcml6b250YWwtcHVzaCIsYW5pbWF0aW9uU3BlZWQ6NjAwLHRpbWVyOiEwLGFkdmFuY2VTcGVlZDo0ZTMscGF1c2VPbkhvdmVyOiExLHN0YXJ0Q2xvY2tPbk1vdXNlT3V0OiExLHN0YXJ0Q2xvY2tPbk1vdXNlT3V0QWZ0ZXI6MWUzLGRpcmVjdGlvbmFsTmF2OiEwLGRpcmVjdGlvbmFsTmF2UmlnaHRUZXh0OiJSaWdodCIsZGlyZWN0aW9uYWxOYXZMZWZ0VGV4dDoiTGVmdCIsY2FwdGlvbnM6ITAsY2FwdGlvbkFuaW1hdGlvbjoiZmFkZSIsY2FwdGlvbkFuaW1hdGlvblNwZWVkOjYwMCxyZXNldFRpbWVyT25DbGljazohMSxidWxsZXRzOiExLGJ1bGxldFRodW1iczohMSxidWxsZXRUaHVtYkxvY2F0aW9uOiIiLGJ1bGxldFRodW1ic0hpZGVPblNtYWxsOiEwLGFmdGVyU2xpZGVDaGFuZ2U6ZS5ub29wLGFmdGVyTG9hZENvbXBsZXRlOmUubm9vcCxmbHVpZDohMCxjZW50ZXJCdWxsZXRzOiEwLHNpbmdsZUN5Y2xlOiExLHNsaWRlTnVtYmVyOiExLHN0YWNrT25TbWFsbDohMX0sYWN0aXZlU2xpZGU6MCxudW1iZXJTbGlkZXM6MCxvcmJpdFdpZHRoOm51bGwsb3JiaXRIZWlnaHQ6bnVsbCxsb2NrZWQ6bnVsbCx0aW1lclJ1bm5pbmc6bnVsbCxkZWdyZWVzOjAsd3JhcHBlckhUTUw6JzxkaXYgY2xhc3M9Im9yYml0LXdyYXBwZXIiIC8+Jyx0aW1lckhUTUw6JzxkaXYgY2xhc3M9InRpbWVyIj48c3BhbiBjbGFzcz0ibWFzayI+PHNwYW4gY2xhc3M9InJvdGF0b3IiPjwvc3Bhbj48L3NwYW4+PHNwYW4gY2xhc3M9InBhdXNlIj48L3NwYW4+PC9kaXY+JyxjYXB0aW9uSFRNTDonPGRpdiBjbGFzcz0ib3JiaXQtY2FwdGlvbiI+PC9kaXY+JyxkaXJlY3Rpb25hbE5hdkhUTUw6JzxkaXYgY2xhc3M9InNsaWRlci1uYXYgaGlkZS1mb3Itc21hbGwiPjxzcGFuIGNsYXNzPSJyaWdodCI+PC9zcGFuPjxzcGFuIGNsYXNzPSJsZWZ0Ij48L3NwYW4+PC9kaXY+JyxidWxsZXRIVE1MOic8dWwgY2xhc3M9Im9yYml0LWJ1bGxldHMiPjwvdWw+JyxzbGlkZU51bWJlckhUTUw6JzxzcGFuIGNsYXNzPSJvcmJpdC1zbGlkZS1jb3VudGVyIj48L3NwYW4+Jyxpbml0OmZ1bmN0aW9uKHQsbil7dmFyIHIsaT0wLHM9dGhpczt0aGlzLmNsaWNrVGltZXI9ZS5wcm94eSh0aGlzLmNsaWNrVGltZXIsdGhpcyksdGhpcy5hZGRCdWxsZXQ9ZS5wcm94eSh0aGlzLmFkZEJ1bGxldCx0aGlzKSx0aGlzLnJlc2V0QW5kVW5sb2NrPWUucHJveHkodGhpcy5yZXNldEFuZFVubG9jayx0aGlzKSx0aGlzLnN0b3BDbG9jaz1lLnByb3h5KHRoaXMuc3RvcENsb2NrLHRoaXMpLHRoaXMuc3RhcnRUaW1lckFmdGVyTW91c2VMZWF2ZT1lLnByb3h5KHRoaXMuc3RhcnRUaW1lckFmdGVyTW91c2VMZWF2ZSx0aGlzKSx0aGlzLmNsZWFyQ2xvY2tNb3VzZUxlYXZlVGltZXI9ZS5wcm94eSh0aGlzLmNsZWFyQ2xvY2tNb3VzZUxlYXZlVGltZXIsdGhpcyksdGhpcy5yb3RhdGVUaW1lcj1lLnByb3h5KHRoaXMucm90YXRlVGltZXIsdGhpcyksdGhpcy5vcHRpb25zPWUuZXh0ZW5kKHt9LHRoaXMuZGVmYXVsdHMsbiksdGhpcy5vcHRpb25zLnRpbWVyPT09ImZhbHNlIiYmKHRoaXMub3B0aW9ucy50aW1lcj0hMSksdGhpcy5vcHRpb25zLmNhcHRpb25zPT09ImZhbHNlIiYmKHRoaXMub3B0aW9ucy5jYXB0aW9ucz0hMSksdGhpcy5vcHRpb25zLmRpcmVjdGlvbmFsTmF2PT09ImZhbHNlIiYmKHRoaXMub3B0aW9ucy5kaXJlY3Rpb25hbE5hdj0hMSksdGhpcy4kZWxlbWVudD1lKHQpLHRoaXMuJHdyYXBwZXI9dGhpcy4kZWxlbWVudC53cmFwKHRoaXMud3JhcHBlckhUTUwpLnBhcmVudCgpLHRoaXMuJHNsaWRlcz10aGlzLiRlbGVtZW50LmNoaWxkcmVuKCJpbWcsIGEsIGRpdiwgZmlndXJlLCBsaSIpLHRoaXMuJGVsZW1lbnQub24oIm1vdmVzdGFydCIsZnVuY3Rpb24oZSl7KGUuZGlzdFg+ZS5kaXN0WSYmZS5kaXN0WDwtZS5kaXN0WXx8ZS5kaXN0WDxlLmRpc3RZJiZlLmRpc3RYPi1lLmRpc3RZKSYmZS5wcmV2ZW50RGVmYXVsdCgpfSksdGhpcy4kZWxlbWVudC5iaW5kKCJvcmJpdC5uZXh0IixmdW5jdGlvbigpe3Muc2hpZnQoIm5leHQiKX0pLHRoaXMuJGVsZW1lbnQuYmluZCgib3JiaXQucHJldiIsZnVuY3Rpb24oKXtzLnNoaWZ0KCJwcmV2Iil9KSx0aGlzLiRlbGVtZW50LmJpbmQoInN3aXBlbGVmdCIsZnVuY3Rpb24oKXtlKHRoaXMpLnRyaWdnZXIoIm9yYml0Lm5leHQiKX0pLHRoaXMuJGVsZW1lbnQuYmluZCgic3dpcGVyaWdodCIsZnVuY3Rpb24oKXtlKHRoaXMpLnRyaWdnZXIoIm9yYml0LnByZXYiKX0pLHRoaXMuJGVsZW1lbnQuYmluZCgib3JiaXQuZ290byIsZnVuY3Rpb24oZSx0KXtzLnNoaWZ0KHQpfSksdGhpcy4kZWxlbWVudC5iaW5kKCJvcmJpdC5zdGFydCIsZnVuY3Rpb24oZSx0KXtzLnN0YXJ0Q2xvY2soKX0pLHRoaXMuJGVsZW1lbnQuYmluZCgib3JiaXQuc3RvcCIsZnVuY3Rpb24oZSx0KXtzLnN0b3BDbG9jaygpfSkscj10aGlzLiRzbGlkZXMuZmlsdGVyKCJpbWciKSxyLmxlbmd0aD09PTA/dGhpcy5sb2FkZWQoKTpyLmJpbmQoImltYWdlcmVhZHkiLGZ1bmN0aW9uKCl7aSs9MSxpPT09ci5sZW5ndGgmJnMubG9hZGVkKCl9KX0sbG9hZGVkOmZ1bmN0aW9uKCl7dGhpcy4kZWxlbWVudC5hZGRDbGFzcygib3JiaXQiKS5jc3Moe3dpZHRoOiIxcHgiLGhlaWdodDoiMXB4In0pLHRoaXMub3B0aW9ucy5zdGFja09uU21hbGwmJnRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoIm9yYml0LXN0YWNrLW9uLXNtYWxsIiksdGhpcy4kc2xpZGVzLmFkZENsYXNzKCJvcmJpdC1zbGlkZSIpLmNzcyh7b3BhY2l0eTowfSksdGhpcy5zZXREaW1lbnRpb25zRnJvbUxhcmdlc3RTbGlkZSgpLHRoaXMudXBkYXRlT3B0aW9uc0lmT25seU9uZVNsaWRlKCksdGhpcy5zZXR1cEZpcnN0U2xpZGUoKSx0aGlzLm5vdGlmeVNsaWRlQ2hhbmdlKCksdGhpcy5vcHRpb25zLnRpbWVyJiYodGhpcy5zZXR1cFRpbWVyKCksdGhpcy5zdGFydENsb2NrKCkpLHRoaXMub3B0aW9ucy5jYXB0aW9ucyYmdGhpcy5zZXR1cENhcHRpb25zKCksdGhpcy5vcHRpb25zLmRpcmVjdGlvbmFsTmF2JiZ0aGlzLnNldHVwRGlyZWN0aW9uYWxOYXYoKSx0aGlzLm9wdGlvbnMuYnVsbGV0cyYmKHRoaXMuc2V0dXBCdWxsZXROYXYoKSx0aGlzLnNldEFjdGl2ZUJ1bGxldCgpKSx0aGlzLm9wdGlvbnMuYWZ0ZXJMb2FkQ29tcGxldGUuY2FsbCh0aGlzKSxIb2xkZXIucnVuKCl9LGN1cnJlbnRTbGlkZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRzbGlkZXMuZXEodGhpcy5hY3RpdmVTbGlkZSl9LG5vdGlmeVNsaWRlQ2hhbmdlOmZ1bmN0aW9uKCl7aWYodGhpcy5vcHRpb25zLnNsaWRlTnVtYmVyKXt2YXIgdD10aGlzLmFjdGl2ZVNsaWRlKzErIiBvZiAiK3RoaXMuJHNsaWRlcy5sZW5ndGg7dGhpcy4kZWxlbWVudC50cmlnZ2VyKCJvcmJpdC5jaGFuZ2UiLHtzbGlkZUluZGV4OnRoaXMuYWN0aXZlU2xpZGUsc2xpZGVDb3VudDp0aGlzLiRzbGlkZXMubGVuZ3RofSk7aWYodGhpcy4kY291bnRlcj09PXVuZGVmaW5lZCl7dmFyIG49ZSh0aGlzLnNsaWRlTnVtYmVySFRNTCkuaHRtbCh0KTt0aGlzLiRjb3VudGVyPW4sdGhpcy4kd3JhcHBlci5hcHBlbmQodGhpcy4kY291bnRlcil9ZWxzZSB0aGlzLiRjb3VudGVyLmh0bWwodCl9fSxzZXREaW1lbnRpb25zRnJvbUxhcmdlc3RTbGlkZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsbjt0LiRlbGVtZW50LmFkZCh0LiR3cmFwcGVyKS53aWR0aCh0aGlzLiRzbGlkZXMuZmlyc3QoKS5vdXRlcldpZHRoKCkpLHQuJGVsZW1lbnQuYWRkKHQuJHdyYXBwZXIpLmhlaWdodCh0aGlzLiRzbGlkZXMuZmlyc3QoKS5oZWlnaHQoKSksdC5vcmJpdFdpZHRoPXRoaXMuJHNsaWRlcy5maXJzdCgpLm91dGVyV2lkdGgoKSx0Lm9yYml0SGVpZ2h0PXRoaXMuJHNsaWRlcy5maXJzdCgpLmhlaWdodCgpLG49dGhpcy4kc2xpZGVzLmZpcnN0KCkuZmluZEZpcnN0SW1hZ2UoKS5jbG9uZSgpLHRoaXMuJHNsaWRlcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHI9ZSh0aGlzKSxpPXIub3V0ZXJXaWR0aCgpLHM9ci5oZWlnaHQoKTtpPnQuJGVsZW1lbnQub3V0ZXJXaWR0aCgpJiYodC4kZWxlbWVudC5hZGQodC4kd3JhcHBlcikud2lkdGgoaSksdC5vcmJpdFdpZHRoPXQuJGVsZW1lbnQub3V0ZXJXaWR0aCgpKSxzPnQuJGVsZW1lbnQuaGVpZ2h0KCkmJih0LiRlbGVtZW50LmFkZCh0LiR3cmFwcGVyKS5oZWlnaHQocyksdC5vcmJpdEhlaWdodD10LiRlbGVtZW50LmhlaWdodCgpLG49ZSh0aGlzKS5maW5kRmlyc3RJbWFnZSgpLmNsb25lKCkpLHQubnVtYmVyU2xpZGVzKz0xfSksdGhpcy5vcHRpb25zLmZsdWlkJiYodHlwZW9mIHRoaXMub3B0aW9ucy5mbHVpZD09InN0cmluZyImJihuPWUoIjxpbWc+IikuYXR0cigiZGF0YS1zcmMiLCJob2xkZXIuanMvIit0aGlzLm9wdGlvbnMuZmx1aWQpKSx0LiRlbGVtZW50LnByZXBlbmQobiksbi5hZGRDbGFzcygiZmx1aWQtcGxhY2Vob2xkZXIiKSx0LiRlbGVtZW50LmFkZCh0LiR3cmFwcGVyKS5jc3Moe3dpZHRoOiJpbmhlcml0In0pLHQuJGVsZW1lbnQuYWRkKHQuJHdyYXBwZXIpLmNzcyh7aGVpZ2h0OiJpbmhlcml0In0pLGUod2luZG93KS5iaW5kKCJyZXNpemUiLGZ1bmN0aW9uKCl7dC5vcmJpdFdpZHRoPXQuJGVsZW1lbnQub3V0ZXJXaWR0aCgpLHQub3JiaXRIZWlnaHQ9dC4kZWxlbWVudC5oZWlnaHQoKX0pKX0sbG9jazpmdW5jdGlvbigpe3RoaXMubG9ja2VkPSEwfSx1bmxvY2s6ZnVuY3Rpb24oKXt0aGlzLmxvY2tlZD0hMX0sdXBkYXRlT3B0aW9uc0lmT25seU9uZVNsaWRlOmZ1bmN0aW9uKCl7dGhpcy4kc2xpZGVzLmxlbmd0aD09PTEmJih0aGlzLm9wdGlvbnMuZGlyZWN0aW9uYWxOYXY9ITEsdGhpcy5vcHRpb25zLnRpbWVyPSExLHRoaXMub3B0aW9ucy5idWxsZXRzPSExKX0sc2V0dXBGaXJzdFNsaWRlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLiRzbGlkZXMuZmlyc3QoKS5jc3MoeyJ6LWluZGV4IjozLG9wYWNpdHk6MX0pLmZhZGVJbihmdW5jdGlvbigpe2UuJHNsaWRlcy5jc3Moe2Rpc3BsYXk6ImJsb2NrIn0pfSl9LHN0YXJ0Q2xvY2s6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKCF0aGlzLm9wdGlvbnMudGltZXIpcmV0dXJuITE7dGhpcy4kdGltZXIuaXMoIjpoaWRkZW4iKT90aGlzLmNsb2NrPXNldEludGVydmFsKGZ1bmN0aW9uKCl7ZS4kZWxlbWVudC50cmlnZ2VyKCJvcmJpdC5uZXh0Iil9LHRoaXMub3B0aW9ucy5hZHZhbmNlU3BlZWQpOih0aGlzLnRpbWVyUnVubmluZz0hMCx0aGlzLiRwYXVzZS5yZW1vdmVDbGFzcygiYWN0aXZlIiksdGhpcy5jbG9jaz1zZXRJbnRlcnZhbCh0aGlzLnJvdGF0ZVRpbWVyLHRoaXMub3B0aW9ucy5hZHZhbmNlU3BlZWQvMTgwLCExKSl9LHJvdGF0ZVRpbWVyOmZ1bmN0aW9uKGUpe3ZhciB0PSJyb3RhdGUoIit0aGlzLmRlZ3JlZXMrImRlZykiO3RoaXMuZGVncmVlcys9Mix0aGlzLiRyb3RhdG9yLmNzcyh7Ii13ZWJraXQtdHJhbnNmb3JtIjp0LCItbW96LXRyYW5zZm9ybSI6dCwiLW8tdHJhbnNmb3JtIjp0LCItbXMtdHJhbnNmb3JtIjp0fSksZSYmKHRoaXMuZGVncmVlcz0wLHRoaXMuJHJvdGF0b3IucmVtb3ZlQ2xhc3MoIm1vdmUiKSx0aGlzLiRtYXNrLnJlbW92ZUNsYXNzKCJtb3ZlIikpLHRoaXMuZGVncmVlcz4xODAmJih0aGlzLiRyb3RhdG9yLmFkZENsYXNzKCJtb3ZlIiksdGhpcy4kbWFzay5hZGRDbGFzcygibW92ZSIpKSx0aGlzLmRlZ3JlZXM+MzYwJiYodGhpcy4kcm90YXRvci5yZW1vdmVDbGFzcygibW92ZSIpLHRoaXMuJG1hc2sucmVtb3ZlQ2xhc3MoIm1vdmUiKSx0aGlzLmRlZ3JlZXM9MCx0aGlzLiRlbGVtZW50LnRyaWdnZXIoIm9yYml0Lm5leHQiKSl9LHN0b3BDbG9jazpmdW5jdGlvbigpe2lmKCF0aGlzLm9wdGlvbnMudGltZXIpcmV0dXJuITE7dGhpcy50aW1lclJ1bm5pbmc9ITEsY2xlYXJJbnRlcnZhbCh0aGlzLmNsb2NrKSx0aGlzLiRwYXVzZS5hZGRDbGFzcygiYWN0aXZlIil9LHNldHVwVGltZXI6ZnVuY3Rpb24oKXt0aGlzLiR0aW1lcj1lKHRoaXMudGltZXJIVE1MKSx0aGlzLiR3cmFwcGVyLmFwcGVuZCh0aGlzLiR0aW1lciksdGhpcy4kcm90YXRvcj10aGlzLiR0aW1lci5maW5kKCIucm90YXRvciIpLHRoaXMuJG1hc2s9dGhpcy4kdGltZXIuZmluZCgiLm1hc2siKSx0aGlzLiRwYXVzZT10aGlzLiR0aW1lci5maW5kKCIucGF1c2UiKSx0aGlzLiR0aW1lci5jbGljayh0aGlzLmNsaWNrVGltZXIpLHRoaXMub3B0aW9ucy5zdGFydENsb2NrT25Nb3VzZU91dCYmKHRoaXMuJHdyYXBwZXIubW91c2VsZWF2ZSh0aGlzLnN0YXJ0VGltZXJBZnRlck1vdXNlTGVhdmUpLHRoaXMuJHdyYXBwZXIubW91c2VlbnRlcih0aGlzLmNsZWFyQ2xvY2tNb3VzZUxlYXZlVGltZXIpKSx0aGlzLm9wdGlvbnMucGF1c2VPbkhvdmVyJiZ0aGlzLiR3cmFwcGVyLm1vdXNlZW50ZXIodGhpcy5zdG9wQ2xvY2spfSxzdGFydFRpbWVyQWZ0ZXJNb3VzZUxlYXZlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLm91dFRpbWVyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnRpbWVyUnVubmluZ3x8ZS5zdGFydENsb2NrKCl9LHRoaXMub3B0aW9ucy5zdGFydENsb2NrT25Nb3VzZU91dEFmdGVyKX0sY2xlYXJDbG9ja01vdXNlTGVhdmVUaW1lcjpmdW5jdGlvbigpe2NsZWFyVGltZW91dCh0aGlzLm91dFRpbWVyKX0sY2xpY2tUaW1lcjpmdW5jdGlvbigpe3RoaXMudGltZXJSdW5uaW5nP3RoaXMuc3RvcENsb2NrKCk6dGhpcy5zdGFydENsb2NrKCl9LHNldHVwQ2FwdGlvbnM6ZnVuY3Rpb24oKXt0aGlzLiRjYXB0aW9uPWUodGhpcy5jYXB0aW9uSFRNTCksdGhpcy4kd3JhcHBlci5hcHBlbmQodGhpcy4kY2FwdGlvbiksdGhpcy5zZXRDYXB0aW9uKCl9LHNldENhcHRpb246ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmN1cnJlbnRTbGlkZSgpLmF0dHIoImRhdGEtY2FwdGlvbiIpLG47aWYoIXRoaXMub3B0aW9ucy5jYXB0aW9ucylyZXR1cm4hMTtpZih0KXtpZihlLnRyaW0oZSh0KS50ZXh0KCkpLmxlbmd0aDwxKXJldHVybiExO3QuY2hhckF0KDApPT0iIyImJih0PXQuc3Vic3RyaW5nKDEsdC5sZW5ndGgpKSxuPWUoIiMiK3QpLmh0bWwoKSx0aGlzLiRjYXB0aW9uLmF0dHIoImlkIix0KS5odG1sKG4pO3N3aXRjaCh0aGlzLm9wdGlvbnMuY2FwdGlvbkFuaW1hdGlvbil7Y2FzZSJub25lIjp0aGlzLiRjYXB0aW9uLnNob3coKTticmVhaztjYXNlImZhZGUiOnRoaXMuJGNhcHRpb24uZmFkZUluKHRoaXMub3B0aW9ucy5jYXB0aW9uQW5pbWF0aW9uU3BlZWQpO2JyZWFrO2Nhc2Uic2xpZGVPcGVuIjp0aGlzLiRjYXB0aW9uLnNsaWRlRG93bih0aGlzLm9wdGlvbnMuY2FwdGlvbkFuaW1hdGlvblNwZWVkKX19ZWxzZSBzd2l0Y2godGhpcy5vcHRpb25zLmNhcHRpb25BbmltYXRpb24pe2Nhc2Uibm9uZSI6dGhpcy4kY2FwdGlvbi5oaWRlKCk7YnJlYWs7Y2FzZSJmYWRlIjp0aGlzLiRjYXB0aW9uLmZhZGVPdXQodGhpcy5vcHRpb25zLmNhcHRpb25BbmltYXRpb25TcGVlZCk7YnJlYWs7Y2FzZSJzbGlkZU9wZW4iOnRoaXMuJGNhcHRpb24uc2xpZGVVcCh0aGlzLm9wdGlvbnMuY2FwdGlvbkFuaW1hdGlvblNwZWVkKX19LHNldHVwRGlyZWN0aW9uYWxOYXY6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49ZSh0aGlzLmRpcmVjdGlvbmFsTmF2SFRNTCk7bi5maW5kKCIucmlnaHQiKS5odG1sKHRoaXMub3B0aW9ucy5kaXJlY3Rpb25hbE5hdlJpZ2h0VGV4dCksbi5maW5kKCIubGVmdCIpLmh0bWwodGhpcy5vcHRpb25zLmRpcmVjdGlvbmFsTmF2TGVmdFRleHQpLHRoaXMuJHdyYXBwZXIuYXBwZW5kKG4pLHRoaXMuJHdyYXBwZXIuZmluZCgiLmxlZnQiKS5jbGljayhmdW5jdGlvbigpe3Quc3RvcENsb2NrKCksdC5vcHRpb25zLnJlc2V0VGltZXJPbkNsaWNrJiYodC5yb3RhdGVUaW1lcighMCksdC5zdGFydENsb2NrKCkpLHQuJGVsZW1lbnQudHJpZ2dlcigib3JiaXQucHJldiIpfSksdGhpcy4kd3JhcHBlci5maW5kKCIucmlnaHQiKS5jbGljayhmdW5jdGlvbigpe3Quc3RvcENsb2NrKCksdC5vcHRpb25zLnJlc2V0VGltZXJPbkNsaWNrJiYodC5yb3RhdGVUaW1lcighMCksdC5zdGFydENsb2NrKCkpLHQuJGVsZW1lbnQudHJpZ2dlcigib3JiaXQubmV4dCIpfSl9LHNldHVwQnVsbGV0TmF2OmZ1bmN0aW9uKCl7dGhpcy4kYnVsbGV0cz1lKHRoaXMuYnVsbGV0SFRNTCksdGhpcy4kd3JhcHBlci5hcHBlbmQodGhpcy4kYnVsbGV0cyksdGhpcy4kc2xpZGVzLmVhY2godGhpcy5hZGRCdWxsZXQpLHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoIndpdGgtYnVsbGV0cyIpLHRoaXMub3B0aW9ucy5jZW50ZXJCdWxsZXRzJiZ0aGlzLiRidWxsZXRzLmNzcygibWFyZ2luLWxlZnQiLC10aGlzLiRidWxsZXRzLm91dGVyV2lkdGgoKS8yKSx0aGlzLm9wdGlvbnMuYnVsbGV0VGh1bWJzSGlkZU9uU21hbGwmJnRoaXMuJGJ1bGxldHMuYWRkQ2xhc3MoImhpZGUtZm9yLXNtYWxsIil9LGFkZEJ1bGxldDpmdW5jdGlvbih0LG4pe3ZhciByPXQrMSxpPWUoIjxsaT4iK3IrIjwvbGk+IikscyxvPXRoaXM7dGhpcy5vcHRpb25zLmJ1bGxldFRodW1icyYmKHM9ZShuKS5hdHRyKCJkYXRhLXRodW1iIikscyYmaS5hZGRDbGFzcygiaGFzLXRodW1iIikuY3NzKHtiYWNrZ3JvdW5kOiJ1cmwoIit0aGlzLm9wdGlvbnMuYnVsbGV0VGh1bWJMb2NhdGlvbitzKyIpIG5vLXJlcGVhdCJ9KSksdGhpcy4kYnVsbGV0cy5hcHBlbmQoaSksaS5kYXRhKCJpbmRleCIsdCksaS5jbGljayhmdW5jdGlvbigpe28uc3RvcENsb2NrKCksby5vcHRpb25zLnJlc2V0VGltZXJPbkNsaWNrJiYoby5yb3RhdGVUaW1lcighMCksby5zdGFydENsb2NrKCkpLG8uJGVsZW1lbnQudHJpZ2dlcigib3JiaXQuZ290byIsW2kuZGF0YSgiaW5kZXgiKV0pfSl9LHNldEFjdGl2ZUJ1bGxldDpmdW5jdGlvbigpe2lmKCF0aGlzLm9wdGlvbnMuYnVsbGV0cylyZXR1cm4hMTt0aGlzLiRidWxsZXRzLmZpbmQoImxpIikucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpLmVxKHRoaXMuYWN0aXZlU2xpZGUpLmFkZENsYXNzKCJhY3RpdmUiKX0scmVzZXRBbmRVbmxvY2s6ZnVuY3Rpb24oKXt0aGlzLiRzbGlkZXMuZXEodGhpcy5wcmV2QWN0aXZlU2xpZGUpLmNzcyh7InotaW5kZXgiOjF9KSx0aGlzLnVubG9jaygpLHRoaXMub3B0aW9ucy5hZnRlclNsaWRlQ2hhbmdlLmNhbGwodGhpcyx0aGlzLiRzbGlkZXMuZXEodGhpcy5wcmV2QWN0aXZlU2xpZGUpLHRoaXMuJHNsaWRlcy5lcSh0aGlzLmFjdGl2ZVNsaWRlKSl9LHNoaWZ0OmZ1bmN0aW9uKHQpe3ZhciBuPXQ7dGhpcy5wcmV2QWN0aXZlU2xpZGU9dGhpcy5hY3RpdmVTbGlkZTtpZih0aGlzLnByZXZBY3RpdmVTbGlkZT09bilyZXR1cm4hMTtpZih0aGlzLiRzbGlkZXMubGVuZ3RoPT0iMSIpcmV0dXJuITE7dGhpcy5sb2NrZWR8fCh0aGlzLmxvY2soKSx0PT0ibmV4dCI/KHRoaXMuYWN0aXZlU2xpZGUrKyx0aGlzLmFjdGl2ZVNsaWRlPT10aGlzLm51bWJlclNsaWRlcyYmKHRoaXMuYWN0aXZlU2xpZGU9MCkpOnQ9PSJwcmV2Ij8odGhpcy5hY3RpdmVTbGlkZS0tLHRoaXMuYWN0aXZlU2xpZGU8MCYmKHRoaXMuYWN0aXZlU2xpZGU9dGhpcy5udW1iZXJTbGlkZXMtMSkpOih0aGlzLmFjdGl2ZVNsaWRlPXQsdGhpcy5wcmV2QWN0aXZlU2xpZGU8dGhpcy5hY3RpdmVTbGlkZT9uPSJuZXh0Ijp0aGlzLnByZXZBY3RpdmVTbGlkZT50aGlzLmFjdGl2ZVNsaWRlJiYobj0icHJldiIpKSx0aGlzLnNldEFjdGl2ZUJ1bGxldCgpLHRoaXMubm90aWZ5U2xpZGVDaGFuZ2UoKSx0aGlzLiRzbGlkZXMuZXEodGhpcy5wcmV2QWN0aXZlU2xpZGUpLmNzcyh7InotaW5kZXgiOjJ9KSx0aGlzLm9wdGlvbnMuYW5pbWF0aW9uPT0iZmFkZSImJih0aGlzLiRzbGlkZXMuZXEodGhpcy5hY3RpdmVTbGlkZSkuY3NzKHtvcGFjaXR5OjAsInotaW5kZXgiOjN9KS5hbmltYXRlKHtvcGFjaXR5OjF9LHRoaXMub3B0aW9ucy5hbmltYXRpb25TcGVlZCx0aGlzLnJlc2V0QW5kVW5sb2NrKSx0aGlzLiRzbGlkZXMuZXEodGhpcy5wcmV2QWN0aXZlU2xpZGUpLmFuaW1hdGUoe29wYWNpdHk6MH0sdGhpcy5vcHRpb25zLmFuaW1hdGlvblNwZWVkKSksdGhpcy5vcHRpb25zLmFuaW1hdGlvbj09Imhvcml6b250YWwtc2xpZGUiJiYobj09Im5leHQiJiZ0aGlzLiRzbGlkZXMuZXEodGhpcy5hY3RpdmVTbGlkZSkuY3NzKHtsZWZ0OnRoaXMub3JiaXRXaWR0aCwiei1pbmRleCI6M30pLmNzcygib3BhY2l0eSIsMSkuYW5pbWF0ZSh7bGVmdDowfSx0aGlzLm9wdGlvbnMuYW5pbWF0aW9uU3BlZWQsdGhpcy5yZXNldEFuZFVubG9jayksbj09InByZXYiJiZ0aGlzLiRzbGlkZXMuZXEodGhpcy5hY3RpdmVTbGlkZSkuY3NzKHtsZWZ0Oi10aGlzLm9yYml0V2lkdGgsInotaW5kZXgiOjN9KS5jc3MoIm9wYWNpdHkiLDEpLmFuaW1hdGUoe2xlZnQ6MH0sdGhpcy5vcHRpb25zLmFuaW1hdGlvblNwZWVkLHRoaXMucmVzZXRBbmRVbmxvY2spLHRoaXMuJHNsaWRlcy5lcSh0aGlzLnByZXZBY3RpdmVTbGlkZSkuY3NzKCJvcGFjaXR5IiwwKSksdGhpcy5vcHRpb25zLmFuaW1hdGlvbj09InZlcnRpY2FsLXNsaWRlIiYmKG49PSJwcmV2IiYmKHRoaXMuJHNsaWRlcy5lcSh0aGlzLmFjdGl2ZVNsaWRlKS5jc3Moe3RvcDp0aGlzLm9yYml0SGVpZ2h0LCJ6LWluZGV4IjozfSkuY3NzKCJvcGFjaXR5IiwxKS5hbmltYXRlKHt0b3A6MH0sdGhpcy5vcHRpb25zLmFuaW1hdGlvblNwZWVkLHRoaXMucmVzZXRBbmRVbmxvY2spLHRoaXMuJHNsaWRlcy5lcSh0aGlzLnByZXZBY3RpdmVTbGlkZSkuY3NzKCJvcGFjaXR5IiwwKSksbj09Im5leHQiJiZ0aGlzLiRzbGlkZXMuZXEodGhpcy5hY3RpdmVTbGlkZSkuY3NzKHt0b3A6LXRoaXMub3JiaXRIZWlnaHQsInotaW5kZXgiOjN9KS5jc3MoIm9wYWNpdHkiLDEpLmFuaW1hdGUoe3RvcDowfSx0aGlzLm9wdGlvbnMuYW5pbWF0aW9uU3BlZWQsdGhpcy5yZXNldEFuZFVubG9jayksdGhpcy4kc2xpZGVzLmVxKHRoaXMucHJldkFjdGl2ZVNsaWRlKS5jc3MoIm9wYWNpdHkiLDApKSx0aGlzLm9wdGlvbnMuYW5pbWF0aW9uPT0iaG9yaXpvbnRhbC1wdXNoIiYmKG49PSJuZXh0IiYmKHRoaXMuJHNsaWRlcy5lcSh0aGlzLmFjdGl2ZVNsaWRlKS5jc3Moe2xlZnQ6dGhpcy5vcmJpdFdpZHRoLCJ6LWluZGV4IjozfSkuYW5pbWF0ZSh7bGVmdDowLG9wYWNpdHk6MX0sdGhpcy5vcHRpb25zLmFuaW1hdGlvblNwZWVkLHRoaXMucmVzZXRBbmRVbmxvY2spLHRoaXMuJHNsaWRlcy5lcSh0aGlzLnByZXZBY3RpdmVTbGlkZSkuYW5pbWF0ZSh7bGVmdDotdGhpcy5vcmJpdFdpZHRofSx0aGlzLm9wdGlvbnMuYW5pbWF0aW9uU3BlZWQsIiIsZnVuY3Rpb24oKXtlKHRoaXMpLmNzcyh7b3BhY2l0eTowfSl9KSksbj09InByZXYiJiYodGhpcy4kc2xpZGVzLmVxKHRoaXMuYWN0aXZlU2xpZGUpLmNzcyh7bGVmdDotdGhpcy5vcmJpdFdpZHRoLCJ6LWluZGV4IjozfSkuYW5pbWF0ZSh7bGVmdDowLG9wYWNpdHk6MX0sdGhpcy5vcHRpb25zLmFuaW1hdGlvblNwZWVkLHRoaXMucmVzZXRBbmRVbmxvY2spLHRoaXMuJHNsaWRlcy5lcSh0aGlzLnByZXZBY3RpdmVTbGlkZSkuYW5pbWF0ZSh7bGVmdDp0aGlzLm9yYml0V2lkdGh9LHRoaXMub3B0aW9ucy5hbmltYXRpb25TcGVlZCwiIixmdW5jdGlvbigpe2UodGhpcykuY3NzKHtvcGFjaXR5OjB9KX0pKSksdGhpcy5vcHRpb25zLmFuaW1hdGlvbj09InZlcnRpY2FsLXB1c2giJiYobj09Im5leHQiJiYodGhpcy4kc2xpZGVzLmVxKHRoaXMuYWN0aXZlU2xpZGUpLmNzcyh7dG9wOi10aGlzLm9yYml0SGVpZ2h0LCJ6LWluZGV4IjozfSkuY3NzKCJvcGFjaXR5IiwxKS5hbmltYXRlKHt0b3A6MCxvcGFjaXR5OjF9LHRoaXMub3B0aW9ucy5hbmltYXRpb25TcGVlZCx0aGlzLnJlc2V0QW5kVW5sb2NrKSx0aGlzLiRzbGlkZXMuZXEodGhpcy5wcmV2QWN0aXZlU2xpZGUpLmNzcygib3BhY2l0eSIsMCkuYW5pbWF0ZSh7dG9wOnRoaXMub3JiaXRIZWlnaHR9LHRoaXMub3B0aW9ucy5hbmltYXRpb25TcGVlZCwiIikpLG49PSJwcmV2IiYmKHRoaXMuJHNsaWRlcy5lcSh0aGlzLmFjdGl2ZVNsaWRlKS5jc3Moe3RvcDp0aGlzLm9yYml0SGVpZ2h0LCJ6LWluZGV4IjozfSkuY3NzKCJvcGFjaXR5IiwxKS5hbmltYXRlKHt0b3A6MH0sdGhpcy5vcHRpb25zLmFuaW1hdGlvblNwZWVkLHRoaXMucmVzZXRBbmRVbmxvY2spLHRoaXMuJHNsaWRlcy5lcSh0aGlzLnByZXZBY3RpdmVTbGlkZSkuY3NzKCJvcGFjaXR5IiwwKS5hbmltYXRlKHt0b3A6LXRoaXMub3JiaXRIZWlnaHR9LHRoaXMub3B0aW9ucy5hbmltYXRpb25TcGVlZCkpKSx0aGlzLnNldENhcHRpb24oKSksdGhpcy5hY3RpdmVTbGlkZT09PXRoaXMuJHNsaWRlcy5sZW5ndGgtMSYmdGhpcy5vcHRpb25zLnNpbmdsZUN5Y2xlJiZ0aGlzLnN0b3BDbG9jaygpfX07ZS5mbi5vcmJpdD1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHI9ZS5leHRlbmQoe30sdCk7ci5pbml0KHRoaXMsbil9KX19KShqUXVlcnkpLGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4odCxuKXt2YXIgcj1lKHQpO3IuYmluZCgibG9hZC5pbWFnZXJlYWR5IixmdW5jdGlvbigpe24uYXBwbHkodCxhcmd1bWVudHMpLHIudW5iaW5kKCJsb2FkLmltYWdlcmVhZHkiKX0pfXZhciB0PXt9O2UuZXZlbnQuc3BlY2lhbC5pbWFnZXJlYWR5PXtzZXR1cDpmdW5jdGlvbihlLG4scil7dD1lfHx0fSxhZGQ6ZnVuY3Rpb24ocil7dmFyIGk9ZSh0aGlzKSxzO3RoaXMubm9kZVR5cGU9PT0xJiZ0aGlzLnRhZ05hbWUudG9Mb3dlckNhc2UoKT09PSJpbWciJiZ0aGlzLnNyYyE9PSIiJiYodC5mb3JjZUxvYWQ/KHM9aS5hdHRyKCJzcmMiKSxpLmF0dHIoInNyYyIsIiIpLG4odGhpcyxyLmhhbmRsZXIpLGkuYXR0cigic3JjIixzKSk6dGhpcy5jb21wbGV0ZXx8dGhpcy5yZWFkeVN0YXRlPT09ND9yLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpOm4odGhpcyxyLmhhbmRsZXIpKX0sdGVhcmRvd246ZnVuY3Rpb24odCl7ZSh0aGlzKS51bmJpbmQoIi5pbWFnZXJlYWR5Iil9fX0oalF1ZXJ5KTt2YXIgSG9sZGVyPUhvbGRlcnx8e307KGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gcyhlLHQpe3ZhciBuPSJjb21wbGV0ZSIscj0icmVhZHlzdGF0ZWNoYW5nZSIsaT0hMSxzPWksbz0hMCx1PWUuZG9jdW1lbnQsYT11LmRvY3VtZW50RWxlbWVudCxmPXUuYWRkRXZlbnRMaXN0ZW5lcj8iYWRkRXZlbnRMaXN0ZW5lciI6ImF0dGFjaEV2ZW50IixsPXUuYWRkRXZlbnRMaXN0ZW5lcj8icmVtb3ZlRXZlbnRMaXN0ZW5lciI6ImRldGFjaEV2ZW50IixjPXUuYWRkRXZlbnRMaXN0ZW5lcj8iIjoib24iLGg9ZnVuY3Rpb24obyl7KG8udHlwZSE9cnx8dS5yZWFkeVN0YXRlPT1uKSYmKChvLnR5cGU9PSJsb2FkIj9lOnUpW2xdKGMrby50eXBlLGgsaSksIXMmJihzPSEwKSYmdC5jYWxsKGUsbnVsbCkpfSxwPWZ1bmN0aW9uKCl7dHJ5e2EuZG9TY3JvbGwoImxlZnQiKX1jYXRjaChlKXtzZXRUaW1lb3V0KHAsNTApO3JldHVybn1oKCJwb2xsIil9O2lmKHUucmVhZHlTdGF0ZT09bil0LmNhbGwoZSwibGF6eSIpO2Vsc2V7aWYodS5jcmVhdGVFdmVudE9iamVjdCYmYS5kb1Njcm9sbCl7dHJ5e289IWUuZnJhbWVFbGVtZW50fWNhdGNoKGQpe31vJiZwKCl9dVtmXShjKyJET01Db250ZW50TG9hZGVkIixoLGkpLHVbZl0oYytyLGgsaSksZVtmXShjKyJsb2FkIixoLGkpfX1mdW5jdGlvbiBvKGUpe2U9ZS5tYXRjaCgvXihcVyk/KC4qKS8pO3ZhciB0PWRvY3VtZW50WyJnZXRFbGVtZW50IisoZVsxXT9lWzFdPT0iIyI/IkJ5SWQiOiJzQnlDbGFzc05hbWUiOiJzQnlUYWdOYW1lIildKGVbMl0pLG49W107cmV0dXJuIHQhPW51bGwmJih0Lmxlbmd0aD9uPXQ6dC5sZW5ndGg9PTA/bj10Om49W3RdKSxufWZ1bmN0aW9uIHUoZSx0KXt2YXIgbj17fTtmb3IodmFyIHIgaW4gZSluW3JdPWVbcl07Zm9yKHZhciBpIGluIHQpbltpXT10W2ldO3JldHVybiBufWZ1bmN0aW9uIGEoZSx0LG4pe3ZhciByPVt0LmhlaWdodCx0LndpZHRoXS5zb3J0KCkscz1NYXRoLnJvdW5kKHJbMV0vMTYpLG89TWF0aC5yb3VuZChyWzBdLzE2KSx1PU1hdGgubWF4KG4uc2l6ZSxzKTtpLndpZHRoPXQud2lkdGgsaS5oZWlnaHQ9dC5oZWlnaHQsZS50ZXh0QWxpZ249ImNlbnRlciIsZS50ZXh0QmFzZWxpbmU9Im1pZGRsZSIsZS5maWxsU3R5bGU9bi5iYWNrZ3JvdW5kLGUuZmlsbFJlY3QoMCwwLHQud2lkdGgsdC5oZWlnaHQpLGUuZmlsbFN0eWxlPW4uZm9yZWdyb3VuZCxlLmZvbnQ9ImJvbGQgIit1KyJweCBzYW5zLXNlcmlmIjt2YXIgYT1uLnRleHQ/bi50ZXh0OnQud2lkdGgrIngiK3QuaGVpZ2h0O3JldHVybiBNYXRoLnJvdW5kKGUubWVhc3VyZVRleHQoYSkud2lkdGgpL3Qud2lkdGg+MSYmKHU9TWF0aC5tYXgobyxuLnNpemUpKSxlLmZvbnQ9ImJvbGQgIit1KyJweCBzYW5zLXNlcmlmIixlLmZpbGxUZXh0KGEsdC53aWR0aC8yLHQuaGVpZ2h0LzIsdC53aWR0aCksaS50b0RhdGFVUkwoImltYWdlL3BuZyIpfXZhciBuPSExLHI9ITEsaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTtpZighaS5nZXRDb250ZXh0KXI9ITA7ZWxzZSBpZihpLnRvRGF0YVVSTCgiaW1hZ2UvcG5nIikuaW5kZXhPZigiZGF0YTppbWFnZS9wbmciKTwwKXI9ITA7ZWxzZSB2YXIgZj1pLmdldENvbnRleHQoIjJkIik7dmFyIGw9e2RvbWFpbjoiaG9sZGVyLmpzIixpbWFnZXM6ImltZyIsdGhlbWVzOntncmF5OntiYWNrZ3JvdW5kOiIjZWVlIixmb3JlZ3JvdW5kOiIjYWFhIixzaXplOjEyfSxzb2NpYWw6e2JhY2tncm91bmQ6IiMzYTVhOTciLGZvcmVncm91bmQ6IiNmZmYiLHNpemU6MTJ9LGluZHVzdHJpYWw6e2JhY2tncm91bmQ6IiM0MzRBNTIiLGZvcmVncm91bmQ6IiNDMkYyMDAiLHNpemU6MTJ9fX07ZS5mbGFncz17ZGltZW5zaW9uczp7cmVnZXg6LyhbMC05XSspeChbMC05XSspLyxvdXRwdXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5yZWdleC5leGVjKGUpO3JldHVybnt3aWR0aDordFsxXSxoZWlnaHQ6K3RbMl19fX0sY29sb3JzOntyZWdleDovIyhbMC05YS1mXXszLH0pXDojKFswLTlhLWZdezMsfSkvaSxvdXRwdXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5yZWdleC5leGVjKGUpO3JldHVybntzaXplOmwudGhlbWVzLmdyYXkuc2l6ZSxmb3JlZ3JvdW5kOiIjIit0WzJdLGJhY2tncm91bmQ6IiMiK3RbMV19fX0sdGV4dDp7cmVnZXg6L3RleHRcOiguKikvLG91dHB1dDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZWdleC5leGVjKGUpWzFdfX19O2Zvcih2YXIgYyBpbiBlLmZsYWdzKWUuZmxhZ3NbY10ubWF0Y2g9ZnVuY3Rpb24oZSl7cmV0dXJuIGUubWF0Y2godGhpcy5yZWdleCl9O2UuYWRkX3RoZW1lPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHQhPW51bGwmJm4hPW51bGwmJihsLnRoZW1lc1t0XT1uKSxlfSxlLmFkZF9pbWFnZT1mdW5jdGlvbih0LG4pe3ZhciByPW8obik7aWYoci5sZW5ndGgpZm9yKHZhciBpPTAscz1yLmxlbmd0aDtpPHM7aSsrKXt2YXIgdT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTt1LnNldEF0dHJpYnV0ZSgiZGF0YS1zcmMiLHQpLHJbaV0uYXBwZW5kQ2hpbGQodSl9cmV0dXJuIGV9LGUucnVuPWZ1bmN0aW9uKHQpe3ZhciBuPXUobCx0KSxpPW8obi5pbWFnZXMpLHM9ITA7Zm9yKHZhciBjPWkubGVuZ3RoLGg9MDtoPGM7aCsrKXt2YXIgcD1sLnRoZW1lcy5ncmF5LGQ9aVtoXS5nZXRBdHRyaWJ1dGUoImRhdGEtc3JjIil8fGlbaF0uZ2V0QXR0cmlidXRlKCJzcmMiKTtpZihkJiYhIX5kLmluZGV4T2Yobi5kb21haW4pKXt2YXIgdj0hMSxtPW51bGwsZz1udWxsLHk9ZC5zdWJzdHIoZC5pbmRleE9mKG4uZG9tYWluKStuLmRvbWFpbi5sZW5ndGgrMSkuc3BsaXQoIi8iKTtmb3Ioc2w9eS5sZW5ndGgsaj0wO2o8c2w7aisrKWUuZmxhZ3MuZGltZW5zaW9ucy5tYXRjaCh5W2pdKT8odj0hMCxtPWUuZmxhZ3MuZGltZW5zaW9ucy5vdXRwdXQoeVtqXSkpOmUuZmxhZ3MuY29sb3JzLm1hdGNoKHlbal0pP3A9ZS5mbGFncy5jb2xvcnMub3V0cHV0KHlbal0pOm4udGhlbWVzW3lbal1dP3A9bi50aGVtZXNbeVtqXV06ZS5mbGFncy50ZXh0Lm1hdGNoKHlbal0pJiYoZz1lLmZsYWdzLnRleHQub3V0cHV0KHlbal0pKTtpZih2KXtpW2hdLnNldEF0dHJpYnV0ZSgiZGF0YS1zcmMiLGQpO3ZhciBiPW0ud2lkdGgrIngiK20uaGVpZ2h0O2lbaF0uc2V0QXR0cmlidXRlKCJhbHQiLGc/ZzpwLnRleHQ/cC50ZXh0KyIgWyIrYisiXSI6YiksaVtoXS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9cC5iYWNrZ3JvdW5kO3ZhciBwPWc/dShwLHt0ZXh0Omd9KTpwO3J8fGlbaF0uc2V0QXR0cmlidXRlKCJzcmMiLGEoZixtLHApKX19fXJldHVybiBlfSxzKHQsZnVuY3Rpb24oKXtufHxlLnJ1bigpfSl9KShIb2xkZXIsd2luZG93KTsKKGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5mbi5mb3VuZGF0aW9uTmF2aWdhdGlvbj1mdW5jdGlvbih0KXt2YXIgbj0hMTtNb2Rlcm5penIudG91Y2h8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1dpbmRvd3MgUGhvbmUvaSk/KGUoZG9jdW1lbnQpLm9uKCJjbGljay5mbmR0biB0b3VjaHN0YXJ0LmZuZHRuIiwiLm5hdi1iYXIgYS5mbHlvdXQtdG9nZ2xlIixmdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCk7dmFyIHI9ZSh0aGlzKS5zaWJsaW5ncygiLmZseW91dCIpLmZpcnN0KCk7bj09PSExJiYoZSgiLm5hdi1iYXIgLmZseW91dCIpLm5vdChyKS5zbGlkZVVwKDUwMCksci5zbGlkZVRvZ2dsZSg1MDAsZnVuY3Rpb24oKXtuPSExfSkpLG49ITB9KSxlKCIubmF2LWJhcj5saS5oYXMtZmx5b3V0Iix0aGlzKS5hZGRDbGFzcygiaXMtdG91Y2giKSk6ZSgiLm5hdi1iYXI+bGkuaGFzLWZseW91dCIsdGhpcykub24oIm1vdXNlZW50ZXIgbW91c2VsZWF2ZSIsZnVuY3Rpb24odCl7dC50eXBlPT0ibW91c2VlbnRlciImJihlKCIubmF2LWJhciIpLmZpbmQoIi5mbHlvdXQiKS5oaWRlKCksZSh0aGlzKS5jaGlsZHJlbigiLmZseW91dCIpLnNob3coKSk7aWYodC50eXBlPT0ibW91c2VsZWF2ZSIpe3ZhciBuPWUodGhpcykuY2hpbGRyZW4oIi5mbHlvdXQiKSxyPW4uZmluZCgiaW5wdXQiKSxpPWZ1bmN0aW9uKHQpe3ZhciBuO3JldHVybiB0Lmxlbmd0aD4wPyh0LmVhY2goZnVuY3Rpb24oKXtlKHRoaXMpLmlzKCI6Zm9jdXMiKSYmKG49ITApfSksbik6ITF9O2kocil8fGUodGhpcykuY2hpbGRyZW4oIi5mbHlvdXQiKS5oaWRlKCl9fSl9fSkoalF1ZXJ5LHRoaXMpOwooZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlLmZuLmZvdW5kYXRpb25CdXR0b25zPWZ1bmN0aW9uKHQpe3ZhciByPWUoZG9jdW1lbnQpLGk9ZS5leHRlbmQoe2Ryb3Bkb3duQXNUb2dnbGU6ITEsYWN0aXZlQ2xhc3M6ImFjdGl2ZSJ9LHQpLHM9ZnVuY3Rpb24odCl7ZSgiLmJ1dHRvbi5kcm9wZG93biIpLmZpbmQoInVsIikubm90KHQpLnJlbW92ZUNsYXNzKCJzaG93LWRyb3Bkb3duIil9LG89ZnVuY3Rpb24odCl7dmFyIG49ZSgiLmJ1dHRvbi5kcm9wZG93biIpLm5vdCh0KTtuLmFkZChlKCI+IHNwYW4uIitpLmFjdGl2ZUNsYXNzLG4pKS5yZW1vdmVDbGFzcyhpLmFjdGl2ZUNsYXNzKX07ci5vbigiY2xpY2suZm5kdG4iLCIuYnV0dG9uLmRpc2FibGVkIixmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCl9KSxlKCIuYnV0dG9uLmRyb3Bkb3duID4gdWwiLHRoaXMpLmFkZENsYXNzKCJuby1ob3ZlciIpLHIub24oImNsaWNrLmZuZHRuIiwiLmJ1dHRvbi5kcm9wZG93bjpub3QoLnNwbGl0KSwgLmJ1dHRvbi5kcm9wZG93bi5zcGxpdCBzcGFuIixmdW5jdGlvbih0KXt2YXIgbj1lKHRoaXMpLHI9bi5jbG9zZXN0KCIuYnV0dG9uLmRyb3Bkb3duIiksdT1lKCI+IHVsIixyKTtbIkEiLCJCVVRUT04iXS5pbmRleE9mKHQudGFyZ2V0Lm5vZGVOYW1lKT09LTEmJnQucHJldmVudERlZmF1bHQoKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cyhpLmRyb3Bkb3duQXNUb2dnbGU/IiI6dSksdS50b2dnbGVDbGFzcygic2hvdy1kcm9wZG93biIpLGkuZHJvcGRvd25Bc1RvZ2dsZSYmKG8ociksbi50b2dnbGVDbGFzcyhpLmFjdGl2ZUNsYXNzKSl9LDApfSksci5vbigiY2xpY2suZm5kdG4iLCJib2R5LCBodG1sIixmdW5jdGlvbih0KXtpZihuPT10Lm9yaWdpbmFsRXZlbnQpcmV0dXJuO2UodC5vcmlnaW5hbEV2ZW50LnRhcmdldCkuaXMoIi5idXR0b24uZHJvcGRvd246bm90KC5zcGxpdCksIC5idXR0b24uZHJvcGRvd24uc3BsaXQgc3BhbiIpfHwocygpLGkuZHJvcGRvd25Bc1RvZ2dsZSYmbygpKX0pO3ZhciB1PWUoIi5idXR0b24uZHJvcGRvd246bm90KC5sYXJnZSk6bm90KC5zbWFsbCk6bm90KC50aW55KTp2aXNpYmxlIix0aGlzKS5vdXRlckhlaWdodCgpLTEsYT1lKCIuYnV0dG9uLmxhcmdlLmRyb3Bkb3duOnZpc2libGUiLHRoaXMpLm91dGVySGVpZ2h0KCktMSxmPWUoIi5idXR0b24uc21hbGwuZHJvcGRvd246dmlzaWJsZSIsdGhpcykub3V0ZXJIZWlnaHQoKS0xLGw9ZSgiLmJ1dHRvbi50aW55LmRyb3Bkb3duOnZpc2libGUiLHRoaXMpLm91dGVySGVpZ2h0KCktMTtlKCIuYnV0dG9uLmRyb3Bkb3duOm5vdCgubGFyZ2UpOm5vdCguc21hbGwpOm5vdCgudGlueSkgPiB1bCIsdGhpcykuY3NzKCJ0b3AiLHUpLGUoIi5idXR0b24uZHJvcGRvd24ubGFyZ2UgPiB1bCIsdGhpcykuY3NzKCJ0b3AiLGEpLGUoIi5idXR0b24uZHJvcGRvd24uc21hbGwgPiB1bCIsdGhpcykuY3NzKCJ0b3AiLGYpLGUoIi5idXR0b24uZHJvcGRvd24udGlueSA+IHVsIix0aGlzKS5jc3MoInRvcCIsbCksZSgiLmJ1dHRvbi5kcm9wZG93bi51cDpub3QoLmxhcmdlKTpub3QoLnNtYWxsKTpub3QoLnRpbnkpID4gdWwiLHRoaXMpLmNzcygidG9wIiwiYXV0byIpLmNzcygiYm90dG9tIix1LTIpLGUoIi5idXR0b24uZHJvcGRvd24udXAubGFyZ2UgPiB1bCIsdGhpcykuY3NzKCJ0b3AiLCJhdXRvIikuY3NzKCJib3R0b20iLGEtMiksZSgiLmJ1dHRvbi5kcm9wZG93bi51cC5zbWFsbCA+IHVsIix0aGlzKS5jc3MoInRvcCIsImF1dG8iKS5jc3MoImJvdHRvbSIsZi0yKSxlKCIuYnV0dG9uLmRyb3Bkb3duLnVwLnRpbnkgPiB1bCIsdGhpcykuY3NzKCJ0b3AiLCJhdXRvIikuY3NzKCJib3R0b20iLGwtMil9fSkoalF1ZXJ5LHRoaXMpOwooZnVuY3Rpb24oZSx0LG4scil7InVzZSBzdHJpY3QiO3ZhciBpPXtjYWxsYmFjazplLm5vb3AsZGVlcF9saW5raW5nOiEwLGluaXQ6ITF9LHM9e2luaXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGk9ZS5leHRlbmQoe30saSx0KSx0aGlzLmVhY2goZnVuY3Rpb24oKXtpLmluaXR8fHMuZXZlbnRzKCksaS5kZWVwX2xpbmtpbmcmJnMuZnJvbV9oYXNoKCl9KX0sZXZlbnRzOmZ1bmN0aW9uKCl7ZShuKS5vbigiY2xpY2suZm5kdG4iLCIudGFicyBhIixmdW5jdGlvbih0KXtzLnNldF90YWIoZSh0aGlzKS5wYXJlbnQoImRkLCBsaSIpLHQpfSksaS5pbml0PSEwfSxzZXRfdGFiOmZ1bmN0aW9uKHQsbil7dmFyIHI9dC5jbG9zZXN0KCJkbCwgdWwiKS5maW5kKCIuYWN0aXZlIikscz10LmNoaWxkcmVuKCJhIikuYXR0cigiaHJlZiIpLG89L14jLy50ZXN0KHMpLHU9ZShzKyJUYWIiKTtvJiZ1Lmxlbmd0aD4wJiYobiYmIWkuZGVlcF9saW5raW5nJiZuLnByZXZlbnREZWZhdWx0KCksdS5jbG9zZXN0KCIudGFicy1jb250ZW50IikuY2hpbGRyZW4oImxpIikucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpLmhpZGUoKSx1LmNzcygiZGlzcGxheSIsImJsb2NrIikuYWRkQ2xhc3MoImFjdGl2ZSIpKSxyLnJlbW92ZUNsYXNzKCJhY3RpdmUiKSx0LmFkZENsYXNzKCJhY3RpdmUiKSxpLmNhbGxiYWNrKCl9LGZyb21faGFzaDpmdW5jdGlvbigpe3ZhciBuPXQubG9jYXRpb24uaGFzaCxyPWUoJ2FbaHJlZj0iJytuKyciXScpO3IudHJpZ2dlcigiY2xpY2suZm5kdG4iKX19O2UuZm4uZm91bmRhdGlvblRhYnM9ZnVuY3Rpb24odCl7aWYoc1t0XSlyZXR1cm4gc1t0XS5hcHBseSh0aGlzLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSk7aWYodHlwZW9mIHQ9PSJvYmplY3QifHwhdClyZXR1cm4gcy5pbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtlLmVycm9yKCJNZXRob2QgIit0KyIgZG9lcyBub3QgZXhpc3Qgb24galF1ZXJ5LmZvdW5kYXRpb25UYWJzIil9fSkoalF1ZXJ5LHRoaXMsdGhpcy5kb2N1bWVudCk7Ci8qCiAqIGpRdWVyeSBGb3VuZGF0aW9uIFRvb2x0aXBzIDIuMC4yCiAqIGh0dHA6Ly9mb3VuZGF0aW9uLnp1cmIuY29tCiAqIENvcHlyaWdodCAyMDEyLCBaVVJCCiAqIEZyZWUgdG8gdXNlIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAKKi8KLypqc2xpbnQgdW5wYXJhbTogdHJ1ZSwgYnJvd3NlcjogdHJ1ZSwgaW5kZW50OiAyICovCihmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXtib2R5SGVpZ2h0OjAsc2VsZWN0b3I6Ii5oYXMtdGlwIixhZGRpdGlvbmFsSW5oZXJpdGFibGVDbGFzc2VzOltdLHRvb2x0aXBDbGFzczoiLnRvb2x0aXAiLHRpcFRlbXBsYXRlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuJzxzcGFuIGRhdGEtc2VsZWN0b3I9IicrZSsnIiBjbGFzcz0iJytyLnRvb2x0aXBDbGFzcy5zdWJzdHJpbmcoMSkrJyI+Jyt0Kyc8c3BhbiBjbGFzcz0ibnViIj48L3NwYW4+PC9zcGFuPid9fSxpPXtpbml0OmZ1bmN0aW9uKHQpe3JldHVybiByPWUuZXh0ZW5kKHIsdCksci5zZWxlY3Rvcj1yLnRhcmdldENsYXNzP3IudGFyZ2V0Q2xhc3M6ci5zZWxlY3Rvcix0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKCJib2R5Iik7TW9kZXJuaXpyLnRvdWNoPyh0Lm9uKCJjbGljay50b29sdGlwIHRvdWNoc3RhcnQudG9vbHRpcCB0b3VjaGVuZC50b29sdGlwIixyLnNlbGVjdG9yLGZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSxlKHIudG9vbHRpcENsYXNzKS5oaWRlKCksaS5zaG93T3JDcmVhdGVUaXAoZSh0aGlzKSl9KSx0Lm9uKCJjbGljay50b29sdGlwIHRvdWNoc3RhcnQudG9vbHRpcCB0b3VjaGVuZC50b29sdGlwIixyLnRvb2x0aXBDbGFzcyxmdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCksZSh0aGlzKS5mYWRlT3V0KDE1MCl9KSk6dC5vbigibW91c2VlbnRlci50b29sdGlwIG1vdXNlbGVhdmUudG9vbHRpcCIsci5zZWxlY3RvcixmdW5jdGlvbih0KXt2YXIgbj1lKHRoaXMpO3QudHlwZT09PSJtb3VzZWVudGVyIj9pLnNob3dPckNyZWF0ZVRpcChuKTp0LnR5cGU9PT0ibW91c2VsZWF2ZSImJmkuaGlkZShuKX0pLGUodGhpcykuZGF0YSgidG9vbHRpcHMiLCEwKX0pfSxzaG93T3JDcmVhdGVUaXA6ZnVuY3Rpb24oZSx0KXt2YXIgbj1pLmdldFRpcChlKTtuJiZuLmxlbmd0aD4wP2kuc2hvdyhlKTppLmNyZWF0ZShlLHQpfSxnZXRUaXA6ZnVuY3Rpb24odCl7dmFyIG49aS5zZWxlY3Rvcih0KSxzPW51bGw7cmV0dXJuIG4mJihzPWUoInNwYW5bZGF0YS1zZWxlY3Rvcj0iK24rIl0iK3IudG9vbHRpcENsYXNzKSkscy5sZW5ndGg+MD9zOiExfSxzZWxlY3RvcjpmdW5jdGlvbihlKXt2YXIgdD1lLmF0dHIoImlkIikscj1lLmRhdGEoInNlbGVjdG9yIik7cmV0dXJuIHQ9PT1uJiZyPT09biYmKHI9InRvb2x0aXAiK01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZyg3KSxlLmF0dHIoImRhdGEtc2VsZWN0b3IiLHIpKSx0P3Q6cn0sY3JlYXRlOmZ1bmN0aW9uKHQsbil7dmFyIHM9ZShyLnRpcFRlbXBsYXRlKGkuc2VsZWN0b3IodCksZSgiPGRpdj4iKS5odG1sKG4/bjp0LmF0dHIoInRpdGxlIikpLmh0bWwoKSkpLG89aS5pbmhlcml0YWJsZV9jbGFzc2VzKHQpO3MuYWRkQ2xhc3MobykuYXBwZW5kVG8oImJvZHkiKSxNb2Rlcm5penIudG91Y2gmJnMuYXBwZW5kKCc8c3BhbiBjbGFzcz0idGFwLXRvLWNsb3NlIj50YXAgdG8gY2xvc2UgPC9zcGFuPicpLHQucmVtb3ZlQXR0cigidGl0bGUiKSxpLnNob3codCl9LHJlcG9zaXRpb246ZnVuY3Rpb24obixyLGkpe3ZhciBzLG8sdSxhLGYsbDtyLmNzcygidmlzaWJpbGl0eSIsImhpZGRlbiIpLnNob3coKSxzPW4uZGF0YSgid2lkdGgiKSxvPXIuY2hpbGRyZW4oIi5udWIiKSx1PW8ub3V0ZXJIZWlnaHQoKSxhPW8ub3V0ZXJXaWR0aCgpLGw9ZnVuY3Rpb24oZSx0LG4scixpLHMpe3JldHVybiBlLmNzcyh7dG9wOnQsYm90dG9tOnIsbGVmdDppLHJpZ2h0Om4sIm1heC13aWR0aCI6cz9zOiJhdXRvIn0pLmVuZCgpfSxsKHIsbi5vZmZzZXQoKS50b3Arbi5vdXRlckhlaWdodCgpKzEwLCJhdXRvIiwiYXV0byIsbi5vZmZzZXQoKS5sZWZ0LHMpLGwobywtdSwiYXV0byIsImF1dG8iLDEwKSxlKHQpLndpZHRoKCk8NzY3PyhmPW4uY2xvc2VzdCgiLmNvbHVtbnMiKSxmLmxlbmd0aDwwJiYoZj1lKCJib2R5IikpLHIud2lkdGgoZi5vdXRlcldpZHRoKCktMjUpLmNzcygibGVmdCIsMTUpLmFkZENsYXNzKCJ0aXAtb3ZlcnJpZGUiKSxsKG8sLXUsImF1dG8iLCJhdXRvIixuLm9mZnNldCgpLmxlZnQpKTppJiZpLmluZGV4T2YoInRpcC10b3AiKT4tMT8obChyLG4ub2Zmc2V0KCkudG9wLXIub3V0ZXJIZWlnaHQoKS11LCJhdXRvIiwiYXV0byIsbi5vZmZzZXQoKS5sZWZ0LHMpLnJlbW92ZUNsYXNzKCJ0aXAtb3ZlcnJpZGUiKSxsKG8sImF1dG8iLCJhdXRvIiwtdSwiYXV0byIpKTppJiZpLmluZGV4T2YoInRpcC1sZWZ0Iik+LTE/KGwocixuLm9mZnNldCgpLnRvcCtuLm91dGVySGVpZ2h0KCkvMi11LCJhdXRvIiwiYXV0byIsbi5vZmZzZXQoKS5sZWZ0LXIub3V0ZXJXaWR0aCgpLTEwLHMpLnJlbW92ZUNsYXNzKCJ0aXAtb3ZlcnJpZGUiKSxsKG8sci5vdXRlckhlaWdodCgpLzItdS8yLC11LCJhdXRvIiwiYXV0byIpKTppJiZpLmluZGV4T2YoInRpcC1yaWdodCIpPi0xPyhsKHIsbi5vZmZzZXQoKS50b3Arbi5vdXRlckhlaWdodCgpLzItdSwiYXV0byIsImF1dG8iLG4ub2Zmc2V0KCkubGVmdCtuLm91dGVyV2lkdGgoKSsxMCxzKS5yZW1vdmVDbGFzcygidGlwLW92ZXJyaWRlIiksbChvLHIub3V0ZXJIZWlnaHQoKS8yLXUvMiwiYXV0byIsImF1dG8iLC11KSk6aSYmaS5pbmRleE9mKCJ0aXAtY2VudGVyZWQtdG9wIik+LTE/KGwocixuLm9mZnNldCgpLnRvcC1yLm91dGVySGVpZ2h0KCktdSwiYXV0byIsImF1dG8iLG4ub2Zmc2V0KCkubGVmdCsobi5vdXRlcldpZHRoKCktci5vdXRlcldpZHRoKCkpLzIscykucmVtb3ZlQ2xhc3MoInRpcC1vdmVycmlkZSIpLGwobywiYXV0byIsci5vdXRlcldpZHRoKCkvMi11LzIsLXUsImF1dG8iKSk6aSYmaS5pbmRleE9mKCJ0aXAtY2VudGVyZWQtYm90dG9tIik+LTEmJihsKHIsbi5vZmZzZXQoKS50b3Arbi5vdXRlckhlaWdodCgpKzEwLCJhdXRvIiwiYXV0byIsbi5vZmZzZXQoKS5sZWZ0KyhuLm91dGVyV2lkdGgoKS1yLm91dGVyV2lkdGgoKSkvMixzKS5yZW1vdmVDbGFzcygidGlwLW92ZXJyaWRlIiksbChvLC11LHIub3V0ZXJXaWR0aCgpLzItdS8yLCJhdXRvIiwiYXV0byIpKSxyLmNzcygidmlzaWJpbGl0eSIsInZpc2libGUiKS5oaWRlKCl9LGluaGVyaXRhYmxlX2NsYXNzZXM6ZnVuY3Rpb24odCl7dmFyIG49WyJ0aXAtdG9wIiwidGlwLWxlZnQiLCJ0aXAtYm90dG9tIiwidGlwLXJpZ2h0IiwidGlwLWNlbnRlcmVkLXRvcCIsInRpcC1jZW50ZXJlZC1ib3R0b20iLCJub3JhZGl1cyJdLmNvbmNhdChyLmFkZGl0aW9uYWxJbmhlcml0YWJsZUNsYXNzZXMpLGk9dC5hdHRyKCJjbGFzcyIpLHM9aT9lLm1hcChpLnNwbGl0KCIgIiksZnVuY3Rpb24odCxyKXtpZihlLmluQXJyYXkodCxuKSE9PS0xKXJldHVybiB0fSkuam9pbigiICIpOiIiO3JldHVybiBlLnRyaW0ocyl9LHNob3c6ZnVuY3Rpb24oZSl7dmFyIHQ9aS5nZXRUaXAoZSk7aS5yZXBvc2l0aW9uKGUsdCxlLmF0dHIoImNsYXNzIikpLHQuZmFkZUluKDE1MCl9LGhpZGU6ZnVuY3Rpb24oZSl7dmFyIHQ9aS5nZXRUaXAoZSk7dC5mYWRlT3V0KDE1MCl9LHJlbG9hZDpmdW5jdGlvbigpe3ZhciB0PWUodGhpcyk7cmV0dXJuIHQuZGF0YSgidG9vbHRpcHMiKT90LmZvdW5kYXRpb25Ub29sdGlwcygiZGVzdHJveSIpLmZvdW5kYXRpb25Ub29sdGlwcygiaW5pdCIpOnQuZm91bmRhdGlvblRvb2x0aXBzKCJpbml0Iil9LGRlc3Ryb3k6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZSh0KS5vZmYoIi50b29sdGlwIiksZShyLnNlbGVjdG9yKS5vZmYoIi50b29sdGlwIiksZShyLnRvb2x0aXBDbGFzcykuZWFjaChmdW5jdGlvbih0KXtlKGUoci5zZWxlY3RvcikuZ2V0KHQpKS5hdHRyKCJ0aXRsZSIsZSh0aGlzKS50ZXh0KCkpfSkucmVtb3ZlKCl9KX19O2UuZm4uZm91bmRhdGlvblRvb2x0aXBzPWZ1bmN0aW9uKHQpe2lmKGlbdF0pcmV0dXJuIGlbdF0uYXBwbHkodGhpcyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSkpO2lmKHR5cGVvZiB0PT0ib2JqZWN0Inx8IXQpcmV0dXJuIGkuaW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZS5lcnJvcigiTWV0aG9kICIrdCsiIGRvZXMgbm90IGV4aXN0IG9uIGpRdWVyeS5mb3VuZGF0aW9uVG9vbHRpcHMiKX19KShqUXVlcnksdGhpcyk7CihmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UuZm4uZm91bmRhdGlvbkFjY29yZGlvbj1mdW5jdGlvbih0KXt2YXIgbj1mdW5jdGlvbihlKXtyZXR1cm4gZS5oYXNDbGFzcygiaG92ZXIiKSYmIU1vZGVybml6ci50b3VjaH07ZShkb2N1bWVudCkub24oIm1vdXNlZW50ZXIiLCIuYWNjb3JkaW9uIGxpIixmdW5jdGlvbigpe3ZhciB0PWUodGhpcykucGFyZW50KCk7aWYobih0KSl7dmFyIHI9ZSh0aGlzKS5jaGlsZHJlbigiLmNvbnRlbnQiKS5maXJzdCgpO2UoIi5jb250ZW50Iix0KS5ub3QocikuaGlkZSgpLnBhcmVudCgibGkiKS5yZW1vdmVDbGFzcygiYWN0aXZlIiksci5zaG93KDAsZnVuY3Rpb24oKXtyLnBhcmVudCgibGkiKS5hZGRDbGFzcygiYWN0aXZlIil9KX19KSxlKGRvY3VtZW50KS5vbigiY2xpY2suZm5kdG4iLCIuYWNjb3JkaW9uIGxpIC50aXRsZSIsZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLmNsb3Nlc3QoImxpIikscj10LnBhcmVudCgpO2lmKCFuKHIpKXt2YXIgaT10LmNoaWxkcmVuKCIuY29udGVudCIpLmZpcnN0KCk7dC5oYXNDbGFzcygiYWN0aXZlIik/ci5maW5kKCJsaSIpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKS5lbmQoKS5maW5kKCIuY29udGVudCIpLmhpZGUoKTooZSgiLmNvbnRlbnQiLHIpLm5vdChpKS5oaWRlKCkucGFyZW50KCJsaSIpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKSxpLnNob3coMCxmdW5jdGlvbigpe2kucGFyZW50KCJsaSIpLmFkZENsYXNzKCJhY3RpdmUiKX0pKX19KX19KShqUXVlcnksdGhpcyk7Ci8qISBodHRwOi8vbXRocy5iZS9wbGFjZWhvbGRlciB2Mi4wLjcgYnkgQG1hdGhpYXMgKi8KKGZ1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiBmKGUpe3ZhciB0PXt9LHI9L15qUXVlcnlcZCskLztyZXR1cm4gbi5lYWNoKGUuYXR0cmlidXRlcyxmdW5jdGlvbihlLG4pe24uc3BlY2lmaWVkJiYhci50ZXN0KG4ubmFtZSkmJih0W24ubmFtZV09bi52YWx1ZSl9KSx0fWZ1bmN0aW9uIGwoZSxyKXt2YXIgaT10aGlzLHM9bihpKTtpZihpLnZhbHVlPT1zLmF0dHIoInBsYWNlaG9sZGVyIikmJnMuaGFzQ2xhc3MoInBsYWNlaG9sZGVyIikpaWYocy5kYXRhKCJwbGFjZWhvbGRlci1wYXNzd29yZCIpKXtzPXMuaGlkZSgpLm5leHQoKS5zaG93KCkuYXR0cigiaWQiLHMucmVtb3ZlQXR0cigiaWQiKS5kYXRhKCJwbGFjZWhvbGRlci1pZCIpKTtpZihlPT09ITApcmV0dXJuIHNbMF0udmFsdWU9cjtzLmZvY3VzKCl9ZWxzZSBpLnZhbHVlPSIiLHMucmVtb3ZlQ2xhc3MoInBsYWNlaG9sZGVyIiksaT09dC5hY3RpdmVFbGVtZW50JiZpLnNlbGVjdCgpfWZ1bmN0aW9uIGMoKXt2YXIgZSx0PXRoaXMscj1uKHQpLGk9cixzPXRoaXMuaWQ7aWYodC52YWx1ZT09IiIpe2lmKHQudHlwZT09InBhc3N3b3JkIil7aWYoIXIuZGF0YSgicGxhY2Vob2xkZXItdGV4dGlucHV0Iikpe3RyeXtlPXIuY2xvbmUoKS5hdHRyKHt0eXBlOiJ0ZXh0In0pfWNhdGNoKG8pe2U9bigiPGlucHV0PiIpLmF0dHIobi5leHRlbmQoZih0aGlzKSx7dHlwZToidGV4dCJ9KSl9ZS5yZW1vdmVBdHRyKCJuYW1lIikuZGF0YSh7InBsYWNlaG9sZGVyLXBhc3N3b3JkIjohMCwicGxhY2Vob2xkZXItaWQiOnN9KS5iaW5kKCJmb2N1cy5wbGFjZWhvbGRlciIsbCksci5kYXRhKHsicGxhY2Vob2xkZXItdGV4dGlucHV0IjplLCJwbGFjZWhvbGRlci1pZCI6c30pLmJlZm9yZShlKX1yPXIucmVtb3ZlQXR0cigiaWQiKS5oaWRlKCkucHJldigpLmF0dHIoImlkIixzKS5zaG93KCl9ci5hZGRDbGFzcygicGxhY2Vob2xkZXIiKSxyWzBdLnZhbHVlPXIuYXR0cigicGxhY2Vob2xkZXIiKX1lbHNlIHIucmVtb3ZlQ2xhc3MoInBsYWNlaG9sZGVyIil9dmFyIHI9InBsYWNlaG9sZGVyImluIHQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxpPSJwbGFjZWhvbGRlciJpbiB0LmNyZWF0ZUVsZW1lbnQoInRleHRhcmVhIikscz1uLmZuLG89bi52YWxIb29rcyx1LGE7ciYmaT8oYT1zLnBsYWNlaG9sZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGEuaW5wdXQ9YS50ZXh0YXJlYT0hMCk6KGE9cy5wbGFjZWhvbGRlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIGUuZmlsdGVyKChyPyJ0ZXh0YXJlYSI6IjppbnB1dCIpKyJbcGxhY2Vob2xkZXJdIikubm90KCIucGxhY2Vob2xkZXIiKS5iaW5kKHsiZm9jdXMucGxhY2Vob2xkZXIiOmwsImJsdXIucGxhY2Vob2xkZXIiOmN9KS5kYXRhKCJwbGFjZWhvbGRlci1lbmFibGVkIiwhMCkudHJpZ2dlcigiYmx1ci5wbGFjZWhvbGRlciIpLGV9LGEuaW5wdXQ9cixhLnRleHRhcmVhPWksdT17Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PW4oZSk7cmV0dXJuIHQuZGF0YSgicGxhY2Vob2xkZXItZW5hYmxlZCIpJiZ0Lmhhc0NsYXNzKCJwbGFjZWhvbGRlciIpPyIiOmUudmFsdWV9LHNldDpmdW5jdGlvbihlLHIpe3ZhciBpPW4oZSk7cmV0dXJuIGkuZGF0YSgicGxhY2Vob2xkZXItZW5hYmxlZCIpPyhyPT0iIj8oZS52YWx1ZT1yLGUhPXQuYWN0aXZlRWxlbWVudCYmYy5jYWxsKGUpKTppLmhhc0NsYXNzKCJwbGFjZWhvbGRlciIpP2wuY2FsbChlLCEwLHIpfHwoZS52YWx1ZT1yKTplLnZhbHVlPXIsaSk6ZS52YWx1ZT1yfX0scnx8KG8uaW5wdXQ9dSksaXx8KG8udGV4dGFyZWE9dSksbihmdW5jdGlvbigpe24odCkuZGVsZWdhdGUoImZvcm0iLCJzdWJtaXQucGxhY2Vob2xkZXIiLGZ1bmN0aW9uKCl7dmFyIGU9bigiLnBsYWNlaG9sZGVyIix0aGlzKS5lYWNoKGwpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmVhY2goYyl9LDEwKX0pfSksbihlKS5iaW5kKCJiZWZvcmV1bmxvYWQucGxhY2Vob2xkZXIiLGZ1bmN0aW9uKCl7bigiLnBsYWNlaG9sZGVyIikuZWFjaChmdW5jdGlvbigpe3RoaXMudmFsdWU9IiJ9KX0pKX0pKHRoaXMsZG9jdW1lbnQsalF1ZXJ5KTsKKGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5mbi5mb3VuZGF0aW9uQWxlcnRzPWZ1bmN0aW9uKHQpe3ZhciBuPWUuZXh0ZW5kKHtjYWxsYmFjazplLm5vb3B9LHQpO2UoZG9jdW1lbnQpLm9uKCJjbGljayIsIi5hbGVydC1ib3ggYS5jbG9zZSIsZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLGUodGhpcykuY2xvc2VzdCgiLmFsZXJ0LWJveCIpLmZhZGVPdXQoZnVuY3Rpb24oKXtlKHRoaXMpLnJlbW92ZSgpLG4uY2FsbGJhY2soKX0pfSl9fSkoalF1ZXJ5LHRoaXMpOwovKgogKiBqUXVlcnkgRm91bmRhdGlvbiBUb3AgQmFyIDIuMC4zCiAqIGh0dHA6Ly9mb3VuZGF0aW9uLnp1cmIuY29tCiAqIENvcHlyaWdodCAyMDEyLCBaVVJCCiAqIEZyZWUgdG8gdXNlIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAKKi8KLypqc2xpbnQgdW5wYXJhbTogdHJ1ZSwgYnJvd3NlcjogdHJ1ZSwgaW5kZW50OiAyICovCihmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXtpbmRleDowLGluaXRpYWxpemVkOiExfSxpPXtpbml0OmZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtyPWUuZXh0ZW5kKHIsbiksci4kdz1lKHQpLHIuJHRvcGJhcj1lKCJuYXYudG9wLWJhciIpLHIuJHNlY3Rpb249ci4kdG9wYmFyLmZpbmQoInNlY3Rpb24iKSxyLiR0aXRsZWJhcj1yLiR0b3BiYXIuY2hpbGRyZW4oInVsOmZpcnN0Iik7dmFyIHM9ZSgiPGRpdiBjbGFzcz0ndG9wLWJhci1qcy1icmVha3BvaW50Jy8+IikuYXBwZW5kVG8oImJvZHkiKTtyLmJyZWFrUG9pbnQ9cy53aWR0aCgpLHMucmVtb3ZlKCksci5pbml0aWFsaXplZHx8KGkuYXNzZW1ibGUoKSxyLmluaXRpYWxpemVkPSEwKSxyLmhlaWdodHx8aS5sYXJnZXN0VUwoKSxyLiR0b3BiYXIucGFyZW50KCkuaGFzQ2xhc3MoImZpeGVkIikmJmUoImJvZHkiKS5jc3MoInBhZGRpbmctdG9wIixyLiR0b3BiYXIub3V0ZXJIZWlnaHQoKSksZSgiLnRvcC1iYXIgLnRvZ2dsZS10b3BiYXIiKS5kaWUoImNsaWNrLmZuZHRuIikubGl2ZSgiY2xpY2suZm5kdG4iLGZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKSxpLmJyZWFrcG9pbnQoKSYmKHIuJHRvcGJhci50b2dnbGVDbGFzcygiZXhwYW5kZWQiKSxyLiR0b3BiYXIuY3NzKCJtaW4taGVpZ2h0IiwiIikpLHIuJHRvcGJhci5oYXNDbGFzcygiZXhwYW5kZWQiKXx8KHIuJHNlY3Rpb24uY3NzKHtsZWZ0OiIwJSJ9KSxyLiRzZWN0aW9uLmZpbmQoIj4ubmFtZSIpLmNzcyh7bGVmdDoiMTAwJSJ9KSxyLiRzZWN0aW9uLmZpbmQoImxpLm1vdmVkIikucmVtb3ZlQ2xhc3MoIm1vdmVkIiksci5pbmRleD0wKX0pLGUoIi50b3AtYmFyIC5oYXMtZHJvcGRvd24+YSIpLmRpZSgiY2xpY2suZm5kdG4iKS5saXZlKCJjbGljay5mbmR0biIsZnVuY3Rpb24odCl7KE1vZGVybml6ci50b3VjaHx8aS5icmVha3BvaW50KCkpJiZ0LnByZXZlbnREZWZhdWx0KCk7aWYoaS5icmVha3BvaW50KCkpe3ZhciBuPWUodGhpcykscz1uLmNsb3Nlc3QoImxpIik7ci5pbmRleCs9MSxzLmFkZENsYXNzKCJtb3ZlZCIpLHIuJHNlY3Rpb24uY3NzKHtsZWZ0Oi0oMTAwKnIuaW5kZXgpKyIlIn0pLHIuJHNlY3Rpb24uZmluZCgiPi5uYW1lIikuY3NzKHtsZWZ0OjEwMCpyLmluZGV4KyIlIn0pLG4uc2libGluZ3MoInVsIikuaGVpZ2h0KHIuaGVpZ2h0K3IuJHRpdGxlYmFyLm91dGVySGVpZ2h0KCEwKSksci4kdG9wYmFyLmNzcygibWluLWhlaWdodCIsci5oZWlnaHQrci4kdGl0bGViYXIub3V0ZXJIZWlnaHQoITApKjIpfX0pLGUodCkub24oInJlc2l6ZS5mbmR0bi50b3BiYXIiLGZ1bmN0aW9uKCl7aS5icmVha3BvaW50KCl8fHIuJHRvcGJhci5jc3MoIm1pbi1oZWlnaHQiLCIiKX0pLGUoIi50b3AtYmFyIC5oYXMtZHJvcGRvd24gLmJhY2siKS5kaWUoImNsaWNrLmZuZHRuIikubGl2ZSgiY2xpY2suZm5kdG4iLGZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKTt2YXIgbj1lKHRoaXMpLGk9bi5jbG9zZXN0KCJsaS5tb3ZlZCIpLHM9aS5wYXJlbnQoKTtyLmluZGV4LT0xLHIuJHNlY3Rpb24uY3NzKHtsZWZ0Oi0oMTAwKnIuaW5kZXgpKyIlIn0pLHIuJHNlY3Rpb24uZmluZCgiPi5uYW1lIikuY3NzKHtsZWZ0OjEwMCpyLmluZGV4KyIlIn0pLHIuaW5kZXg9PT0wJiZyLiR0b3BiYXIuY3NzKCJtaW4taGVpZ2h0IiwwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aS5yZW1vdmVDbGFzcygibW92ZWQiKX0sMzAwKX0pfSl9LGJyZWFrcG9pbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gci4kdy53aWR0aCgpPHIuYnJlYWtQb2ludH0sYXNzZW1ibGU6ZnVuY3Rpb24oKXtyLiRzZWN0aW9uLmRldGFjaCgpLHIuJHNlY3Rpb24uZmluZCgiLmhhcy1kcm9wZG93bj5hIikuZWFjaChmdW5jdGlvbigpe3ZhciB0PWUodGhpcyksbj10LnNpYmxpbmdzKCIuZHJvcGRvd24iKSxyPWUoJzxsaSBjbGFzcz0idGl0bGUgYmFjayBqcy1nZW5lcmF0ZWQiPjxoNT48YSBocmVmPSIjIj48L2E+PC9oNT48L2xpPicpO3IuZmluZCgiaDU+YSIpLmh0bWwodC5odG1sKCkpLG4ucHJlcGVuZChyKX0pLHIuJHNlY3Rpb24uYXBwZW5kVG8oci4kdG9wYmFyKX0sbGFyZ2VzdFVMOmZ1bmN0aW9uKCl7dmFyIHQ9ci4kdG9wYmFyLmZpbmQoInNlY3Rpb24gdWwgdWwiKSxuPXQuZmlyc3QoKSxpPTA7dC5lYWNoKGZ1bmN0aW9uKCl7ZSh0aGlzKS5jaGlsZHJlbigibGkiKS5sZW5ndGg+bi5jaGlsZHJlbigibGkiKS5sZW5ndGgmJihuPWUodGhpcykpfSksbi5jaGlsZHJlbigibGkiKS5lYWNoKGZ1bmN0aW9uKCl7aSs9ZSh0aGlzKS5vdXRlckhlaWdodCghMCl9KSxyLmhlaWdodD1pfX07ZS5mbi5mb3VuZGF0aW9uVG9wQmFyPWZ1bmN0aW9uKHQpe2lmKGlbdF0pcmV0dXJuIGlbdF0uYXBwbHkodGhpcyxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSkpO2lmKHR5cGVvZiB0PT0ib2JqZWN0Inx8IXQpcmV0dXJuIGkuaW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZS5lcnJvcigiTWV0aG9kICIrdCsiIGRvZXMgbm90IGV4aXN0IG9uIGpRdWVyeS5mb3VuZGF0aW9uVG9wQmFyIil9O2lmKGUoIi5zdGlja3kiKS5sZW5ndGg+MCl7dmFyIHM9ZSgiLnN0aWNreSIpLmxlbmd0aD9lKCIuc3RpY2t5Iikub2Zmc2V0KCkudG9wOjAsbz1lKHQpO28uc2Nyb2xsKGZ1bmN0aW9uKCl7by5zY3JvbGxUb3AoKT49cz9lKCIuc3RpY2t5IikuYWRkQ2xhc3MoImZpeGVkIik6by5zY3JvbGxUb3AoKTxzJiZlKCIuc3RpY2t5IikucmVtb3ZlQ2xhc3MoImZpeGVkIil9KX19KShqUXVlcnksdGhpcyk7Ci8qCiAqIGpRdWVyeSBGb3VuZGF0aW9uIEpveXJpZGUgUGx1Z2luIDIuMC4zCiAqIGh0dHA6Ly9mb3VuZGF0aW9uLnp1cmIuY29tCiAqIENvcHlyaWdodCAyMDEyLCBaVVJCCiAqIEZyZWUgdG8gdXNlIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAKKi8KLypqc2xpbnQgdW5wYXJhbTogdHJ1ZSwgYnJvd3NlcjogdHJ1ZSwgaW5kZW50OiAyICovCihmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXt2ZXJzaW9uOiIyLjAuMyIsdGlwTG9jYXRpb246ImJvdHRvbSIsbnViUG9zaXRpb246ImF1dG8iLHNjcm9sbFNwZWVkOjMwMCx0aW1lcjowLHN0YXJ0VGltZXJPbkNsaWNrOiEwLHN0YXJ0T2Zmc2V0OjAsbmV4dEJ1dHRvbjohMCx0aXBBbmltYXRpb246ImZhZGUiLHBhdXNlQWZ0ZXI6W10sdGlwQW5pbWF0aW9uRmFkZVNwZWVkOjMwMCxjb29raWVNb25zdGVyOiExLGNvb2tpZU5hbWU6ImpveXJpZGUiLGNvb2tpZURvbWFpbjohMSx0aXBDb250YWluZXI6ImJvZHkiLHBvc3RSaWRlQ2FsbGJhY2s6ZS5ub29wLHBvc3RTdGVwQ2FsbGJhY2s6ZS5ub29wLHRlbXBsYXRlOntsaW5rOic8YSBocmVmPSIjY2xvc2UiIGNsYXNzPSJqb3lyaWRlLWNsb3NlLXRpcCI+WDwvYT4nLHRpbWVyOic8ZGl2IGNsYXNzPSJqb3lyaWRlLXRpbWVyLWluZGljYXRvci13cmFwIj48c3BhbiBjbGFzcz0iam95cmlkZS10aW1lci1pbmRpY2F0b3IiPjwvc3Bhbj48L2Rpdj4nLHRpcDonPGRpdiBjbGFzcz0iam95cmlkZS10aXAtZ3VpZGUiPjxzcGFuIGNsYXNzPSJqb3lyaWRlLW51YiI+PC9zcGFuPjwvZGl2Picsd3JhcHBlcjonPGRpdiBjbGFzcz0iam95cmlkZS1jb250ZW50LXdyYXBwZXIiPjwvZGl2PicsYnV0dG9uOic8YSBocmVmPSIjIiBjbGFzcz0ic21hbGwgYnV0dG9uIGpveXJpZGUtbmV4dC10aXAiPjwvYT4nfX0saT1pfHwhMSxzPXt9LG89e2luaXQ6ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKGUuaXNFbXB0eU9iamVjdChzKSl7cz1lLmV4dGVuZCghMCxyLG4pLHMuZG9jdW1lbnQ9dC5kb2N1bWVudCxzLiRkb2N1bWVudD1lKHMuZG9jdW1lbnQpLHMuJHdpbmRvdz1lKHQpLHMuJGNvbnRlbnRfZWw9ZSh0aGlzKSxzLmJvZHlfb2Zmc2V0PWUocy50aXBDb250YWluZXIpLnBvc2l0aW9uKCkscy4kdGlwX2NvbnRlbnQ9ZSgiPiBsaSIscy4kY29udGVudF9lbCkscy5wYXVzZWQ9ITEscy5hdHRlbXB0cz0wLHMudGlwTG9jYXRpb25QYXR0ZXJucz17dG9wOlsiYm90dG9tIl0sYm90dG9tOltdLGxlZnQ6WyJyaWdodCIsInRvcCIsImJvdHRvbSJdLHJpZ2h0OlsibGVmdCIsInRvcCIsImJvdHRvbSJdfSxvLmpxdWVyeV9jaGVjaygpLGUuaXNGdW5jdGlvbihlLmNvb2tpZSl8fChzLmNvb2tpZU1vbnN0ZXI9ITEpO2lmKCFzLmNvb2tpZU1vbnN0ZXJ8fCFlLmNvb2tpZShzLmNvb2tpZU5hbWUpKXMuJHRpcF9jb250ZW50LmVhY2goZnVuY3Rpb24odCl7by5jcmVhdGUoeyRsaTplKHRoaXMpLGluZGV4OnR9KX0pLCFzLnN0YXJ0VGltZXJPbkNsaWNrJiZzLnRpbWVyPjA/KG8uc2hvdygiaW5pdCIpLG8uc3RhcnRUaW1lcigpKTpvLnNob3coImluaXQiKTtzLiRkb2N1bWVudC5vbigiY2xpY2suam95cmlkZSIsIi5qb3lyaWRlLW5leHQtdGlwLCAuam95cmlkZS1tb2RhbC1iZyIsZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpLHMuJGxpLm5leHQoKS5sZW5ndGg8MT9vLmVuZCgpOnMudGltZXI+MD8oY2xlYXJUaW1lb3V0KHMuYXV0b21hdGUpLG8uaGlkZSgpLG8uc2hvdygpLG8uc3RhcnRUaW1lcigpKTooby5oaWRlKCksby5zaG93KCkpfSkscy4kZG9jdW1lbnQub24oImNsaWNrLmpveXJpZGUiLCIuam95cmlkZS1jbG9zZS10aXAiLGZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKSxvLmVuZCgpfSkscy4kd2luZG93LmJpbmQoInJlc2l6ZS5qb3lyaWRlIixmdW5jdGlvbihlKXtvLmlzX3Bob25lKCk/by5wb3NfcGhvbmUoKTpvLnBvc19kZWZhdWx0KCl9KX1lbHNlIG8ucmVzdGFydCgpfSl9LHJlc3VtZTpmdW5jdGlvbigpe28uc2V0X2xpKCksby5zaG93KCl9LHRpcF90ZW1wbGF0ZTpmdW5jdGlvbih0KXt2YXIgbixyO3JldHVybiB0LnRpcF9jbGFzcz10LnRpcF9jbGFzc3x8IiIsbj1lKHMudGVtcGxhdGUudGlwKS5hZGRDbGFzcyh0LnRpcF9jbGFzcykscj1lLnRyaW0oZSh0LmxpKS5odG1sKCkpK28uYnV0dG9uX3RleHQodC5idXR0b25fdGV4dCkrcy50ZW1wbGF0ZS5saW5rK28udGltZXJfaW5zdGFuY2UodC5pbmRleCksbi5hcHBlbmQoZShzLnRlbXBsYXRlLndyYXBwZXIpKSxuLmZpcnN0KCkuYXR0cigiZGF0YS1pbmRleCIsdC5pbmRleCksZSgiLmpveXJpZGUtY29udGVudC13cmFwcGVyIixuKS5hcHBlbmQociksblswXX0sdGltZXJfaW5zdGFuY2U6ZnVuY3Rpb24odCl7dmFyIG47cmV0dXJuIHQ9PT0wJiZzLnN0YXJ0VGltZXJPbkNsaWNrJiZzLnRpbWVyPjB8fHMudGltZXI9PT0wP249IiI6bj1vLm91dGVySFRNTChlKHMudGVtcGxhdGUudGltZXIpWzBdKSxufSxidXR0b25fdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gcy5uZXh0QnV0dG9uPyh0PWUudHJpbSh0KXx8Ik5leHQiLHQ9by5vdXRlckhUTUwoZShzLnRlbXBsYXRlLmJ1dHRvbikuYXBwZW5kKHQpWzBdKSk6dD0iIix0fSxjcmVhdGU6ZnVuY3Rpb24odCl7dmFyIG49dC4kbGkuYXR0cigiZGF0YS1idXR0b24iKXx8dC4kbGkuYXR0cigiZGF0YS10ZXh0Iikscj10LiRsaS5hdHRyKCJjbGFzcyIpLGk9ZShvLnRpcF90ZW1wbGF0ZSh7dGlwX2NsYXNzOnIsaW5kZXg6dC5pbmRleCxidXR0b25fdGV4dDpuLGxpOnQuJGxpfSkpO2Uocy50aXBDb250YWluZXIpLmFwcGVuZChpKX0sc2hvdzpmdW5jdGlvbih0KXt2YXIgcj17fSxpLHU9W10sYT0wLGYsbD1udWxsO2lmKHMuJGxpPT09bnx8ZS5pbkFycmF5KHMuJGxpLmluZGV4KCkscy5wYXVzZUFmdGVyKT09PS0xKXtzLnBhdXNlZD9zLnBhdXNlZD0hMTpvLnNldF9saSh0KSxzLmF0dGVtcHRzPTA7aWYocy4kbGkubGVuZ3RoJiZzLiR0YXJnZXQubGVuZ3RoPjApe3U9KHMuJGxpLmRhdGEoIm9wdGlvbnMiKXx8IjoiKS5zcGxpdCgiOyIpLGE9dS5sZW5ndGg7Zm9yKGk9YS0xO2k+PTA7aS0tKWY9dVtpXS5zcGxpdCgiOiIpLGYubGVuZ3RoPT09MiYmKHJbZS50cmltKGZbMF0pXT1lLnRyaW0oZlsxXSkpO3MudGlwU2V0dGluZ3M9ZS5leHRlbmQoe30scyxyKSxzLnRpcFNldHRpbmdzLnRpcExvY2F0aW9uUGF0dGVybj1zLnRpcExvY2F0aW9uUGF0dGVybnNbcy50aXBTZXR0aW5ncy50aXBMb2NhdGlvbl0sL2JvZHkvaS50ZXN0KHMuJHRhcmdldC5zZWxlY3Rvcil8fG8uc2Nyb2xsX3RvKCksby5pc19waG9uZSgpP28ucG9zX3Bob25lKCEwKTpvLnBvc19kZWZhdWx0KCEwKSxsPWUoIi5qb3lyaWRlLXRpbWVyLWluZGljYXRvciIscy4kbmV4dF90aXApLC9wb3AvaS50ZXN0KHMudGlwQW5pbWF0aW9uKT8obC5vdXRlcldpZHRoKDApLHMudGltZXI+MD8ocy4kbmV4dF90aXAuc2hvdygpLGwuYW5pbWF0ZSh7d2lkdGg6ZSgiLmpveXJpZGUtdGltZXItaW5kaWNhdG9yLXdyYXAiLHMuJG5leHRfdGlwKS5vdXRlcldpZHRoKCl9LHMudGltZXIpKTpzLiRuZXh0X3RpcC5zaG93KCkpOi9mYWRlL2kudGVzdChzLnRpcEFuaW1hdGlvbikmJihsLm91dGVyV2lkdGgoMCkscy50aW1lcj4wPyhzLiRuZXh0X3RpcC5mYWRlSW4ocy50aXBBbmltYXRpb25GYWRlU3BlZWQpLHMuJG5leHRfdGlwLnNob3coKSxsLmFuaW1hdGUoe3dpZHRoOmUoIi5qb3lyaWRlLXRpbWVyLWluZGljYXRvci13cmFwIixzLiRuZXh0X3RpcCkub3V0ZXJXaWR0aCgpfSxzLnRpbWVyKSk6cy4kbmV4dF90aXAuZmFkZUluKHMudGlwQW5pbWF0aW9uRmFkZVNwZWVkKSkscy4kY3VycmVudF90aXA9cy4kbmV4dF90aXB9ZWxzZSBzLiRsaSYmcy4kdGFyZ2V0Lmxlbmd0aDwxP28uc2hvdygpOm8uZW5kKCl9ZWxzZSBzLnBhdXNlZD0hMH0saXNfcGhvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gaT9pLm1xKCJvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY3cHgpIik6cy4kd2luZG93LndpZHRoKCk8NzY3PyEwOiExfSxoaWRlOmZ1bmN0aW9uKCl7cy5wb3N0U3RlcENhbGxiYWNrKHMuJGxpLmluZGV4KCkscy4kY3VycmVudF90aXApLGUoIi5qb3lyaWRlLW1vZGFsLWJnIikuaGlkZSgpLHMuJGN1cnJlbnRfdGlwLmhpZGUoKX0sc2V0X2xpOmZ1bmN0aW9uKGUpe2U/KHMuJGxpPXMuJHRpcF9jb250ZW50LmVxKHMuc3RhcnRPZmZzZXQpLG8uc2V0X25leHRfdGlwKCkscy4kY3VycmVudF90aXA9cy4kbmV4dF90aXApOihzLiRsaT1zLiRsaS5uZXh0KCksby5zZXRfbmV4dF90aXAoKSksby5zZXRfdGFyZ2V0KCl9LHNldF9uZXh0X3RpcDpmdW5jdGlvbigpe3MuJG5leHRfdGlwPWUoIi5qb3lyaWRlLXRpcC1ndWlkZVtkYXRhLWluZGV4PSIrcy4kbGkuaW5kZXgoKSsiXSIpfSxzZXRfdGFyZ2V0OmZ1bmN0aW9uKCl7dmFyIHQ9cy4kbGkuYXR0cigiZGF0YS1jbGFzcyIpLG49cy4kbGkuYXR0cigiZGF0YS1pZCIpLHI9ZnVuY3Rpb24oKXtyZXR1cm4gbj9lKHMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobikpOnQ/ZSgiLiIrdCkuZmlyc3QoKTplKCJib2R5Iil9O3MuJHRhcmdldD1yKCl9LHNjcm9sbF90bzpmdW5jdGlvbigpe3ZhciB0LG47dD1zLiR3aW5kb3cuaGVpZ2h0KCkvMixuPU1hdGguY2VpbChzLiR0YXJnZXQub2Zmc2V0KCkudG9wLXQrcy4kbmV4dF90aXAub3V0ZXJIZWlnaHQoKSksZSgiaHRtbCwgYm9keSIpLnN0b3AoKS5hbmltYXRlKHtzY3JvbGxUb3A6bn0scy5zY3JvbGxTcGVlZCl9LHBhdXNlZDpmdW5jdGlvbigpe3JldHVybiBlLmluQXJyYXkocy4kbGkuaW5kZXgoKSsxLHMucGF1c2VBZnRlcik9PT0tMT8hMDohMX0sZGVzdHJveTpmdW5jdGlvbigpe3MuJGRvY3VtZW50Lm9mZigiLmpveXJpZGUiKSxlKHQpLm9mZigiLmpveXJpZGUiKSxlKCIuam95cmlkZS1jbG9zZS10aXAsIC5qb3lyaWRlLW5leHQtdGlwLCAuam95cmlkZS1tb2RhbC1iZyIpLm9mZigiLmpveXJpZGUiKSxlKCIuam95cmlkZS10aXAtZ3VpZGUsIC5qb3lyaWRlLW1vZGFsLWJnIikucmVtb3ZlKCksY2xlYXJUaW1lb3V0KHMuYXV0b21hdGUpLHM9e319LHJlc3RhcnQ6ZnVuY3Rpb24oKXtvLmhpZGUoKSxzLiRsaT1uLG8uc2hvdygiaW5pdCIpfSxwb3NfZGVmYXVsdDpmdW5jdGlvbih0KXt2YXIgbj1NYXRoLmNlaWwocy4kd2luZG93LmhlaWdodCgpLzIpLHI9cy4kbmV4dF90aXAub2Zmc2V0KCksaT1lKCIuam95cmlkZS1udWIiLHMuJG5leHRfdGlwKSx1PU1hdGguY2VpbChpLm91dGVySGVpZ2h0KCkvMiksYT10fHwhMTthJiYocy4kbmV4dF90aXAuY3NzKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIikscy4kbmV4dF90aXAuc2hvdygpKSwvYm9keS9pLnRlc3Qocy4kdGFyZ2V0LnNlbGVjdG9yKT9zLiRsaS5sZW5ndGgmJm8ucG9zX21vZGFsKGkpOihvLmJvdHRvbSgpPyhzLiRuZXh0X3RpcC5jc3Moe3RvcDpzLiR0YXJnZXQub2Zmc2V0KCkudG9wK3Urcy4kdGFyZ2V0Lm91dGVySGVpZ2h0KCksbGVmdDpzLiR0YXJnZXQub2Zmc2V0KCkubGVmdH0pLG8ubnViX3Bvc2l0aW9uKGkscy50aXBTZXR0aW5ncy5udWJQb3NpdGlvbiwidG9wIikpOm8udG9wKCk/KHMuJG5leHRfdGlwLmNzcyh7dG9wOnMuJHRhcmdldC5vZmZzZXQoKS50b3Atcy4kbmV4dF90aXAub3V0ZXJIZWlnaHQoKS11LGxlZnQ6cy4kdGFyZ2V0Lm9mZnNldCgpLmxlZnR9KSxvLm51Yl9wb3NpdGlvbihpLHMudGlwU2V0dGluZ3MubnViUG9zaXRpb24sImJvdHRvbSIpKTpvLnJpZ2h0KCk/KHMuJG5leHRfdGlwLmNzcyh7dG9wOnMuJHRhcmdldC5vZmZzZXQoKS50b3AsbGVmdDpzLiR0YXJnZXQub3V0ZXJXaWR0aCgpK3MuJHRhcmdldC5vZmZzZXQoKS5sZWZ0fSksby5udWJfcG9zaXRpb24oaSxzLnRpcFNldHRpbmdzLm51YlBvc2l0aW9uLCJsZWZ0IikpOm8ubGVmdCgpJiYocy4kbmV4dF90aXAuY3NzKHt0b3A6cy4kdGFyZ2V0Lm9mZnNldCgpLnRvcCxsZWZ0OnMuJHRhcmdldC5vZmZzZXQoKS5sZWZ0LXMuJG5leHRfdGlwLm91dGVyV2lkdGgoKS11fSksby5udWJfcG9zaXRpb24oaSxzLnRpcFNldHRpbmdzLm51YlBvc2l0aW9uLCJyaWdodCIpKSwhby52aXNpYmxlKG8uY29ybmVycyhzLiRuZXh0X3RpcCkpJiZzLmF0dGVtcHRzPHMudGlwU2V0dGluZ3MudGlwTG9jYXRpb25QYXR0ZXJuLmxlbmd0aCYmKGkucmVtb3ZlQ2xhc3MoImJvdHRvbSIpLnJlbW92ZUNsYXNzKCJ0b3AiKS5yZW1vdmVDbGFzcygicmlnaHQiKS5yZW1vdmVDbGFzcygibGVmdCIpLHMudGlwU2V0dGluZ3MudGlwTG9jYXRpb249cy50aXBTZXR0aW5ncy50aXBMb2NhdGlvblBhdHRlcm5bcy5hdHRlbXB0c10scy5hdHRlbXB0cysrLG8ucG9zX2RlZmF1bHQoITApKSksYSYmKHMuJG5leHRfdGlwLmhpZGUoKSxzLiRuZXh0X3RpcC5jc3MoInZpc2liaWxpdHkiLCJ2aXNpYmxlIikpfSxwb3NfcGhvbmU6ZnVuY3Rpb24odCl7dmFyIG49cy4kbmV4dF90aXAub3V0ZXJIZWlnaHQoKSxyPXMuJG5leHRfdGlwLm9mZnNldCgpLGk9cy4kdGFyZ2V0Lm91dGVySGVpZ2h0KCksdT1lKCIuam95cmlkZS1udWIiLHMuJG5leHRfdGlwKSxhPU1hdGguY2VpbCh1Lm91dGVySGVpZ2h0KCkvMiksZj10fHwhMTt1LnJlbW92ZUNsYXNzKCJib3R0b20iKS5yZW1vdmVDbGFzcygidG9wIikucmVtb3ZlQ2xhc3MoInJpZ2h0IikucmVtb3ZlQ2xhc3MoImxlZnQiKSxmJiYocy4kbmV4dF90aXAuY3NzKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIikscy4kbmV4dF90aXAuc2hvdygpKSwvYm9keS9pLnRlc3Qocy4kdGFyZ2V0LnNlbGVjdG9yKT9zLiRsaS5sZW5ndGgmJm8ucG9zX21vZGFsKHUpOm8udG9wKCk/KHMuJG5leHRfdGlwLm9mZnNldCh7dG9wOnMuJHRhcmdldC5vZmZzZXQoKS50b3Atbi1hfSksdS5hZGRDbGFzcygiYm90dG9tIikpOihzLiRuZXh0X3RpcC5vZmZzZXQoe3RvcDpzLiR0YXJnZXQub2Zmc2V0KCkudG9wK2krYX0pLHUuYWRkQ2xhc3MoInRvcCIpKSxmJiYocy4kbmV4dF90aXAuaGlkZSgpLHMuJG5leHRfdGlwLmNzcygidmlzaWJpbGl0eSIsInZpc2libGUiKSl9LHBvc19tb2RhbDpmdW5jdGlvbih0KXtvLmNlbnRlcigpLHQuaGlkZSgpLGUoIi5qb3lyaWRlLW1vZGFsLWJnIikubGVuZ3RoPDEmJmUoImJvZHkiKS5hcHBlbmQoJzxkaXYgY2xhc3M9ImpveXJpZGUtbW9kYWwtYmciPicpLnNob3coKSwvcG9wL2kudGVzdChzLnRpcEFuaW1hdGlvbik/ZSgiLmpveXJpZGUtbW9kYWwtYmciKS5zaG93KCk6ZSgiLmpveXJpZGUtbW9kYWwtYmciKS5mYWRlSW4ocy50aXBBbmltYXRpb25GYWRlU3BlZWQpfSxjZW50ZXI6ZnVuY3Rpb24oKXt2YXIgZT1zLiR3aW5kb3c7cmV0dXJuIHMuJG5leHRfdGlwLmNzcyh7dG9wOihlLmhlaWdodCgpLXMuJG5leHRfdGlwLm91dGVySGVpZ2h0KCkpLzIrZS5zY3JvbGxUb3AoKSxsZWZ0OihlLndpZHRoKCktcy4kbmV4dF90aXAub3V0ZXJXaWR0aCgpKS8yK2Uuc2Nyb2xsTGVmdCgpfSksITB9LGJvdHRvbTpmdW5jdGlvbigpe3JldHVybi9ib3R0b20vaS50ZXN0KHMudGlwU2V0dGluZ3MudGlwTG9jYXRpb24pfSx0b3A6ZnVuY3Rpb24oKXtyZXR1cm4vdG9wL2kudGVzdChzLnRpcFNldHRpbmdzLnRpcExvY2F0aW9uKX0scmlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4vcmlnaHQvaS50ZXN0KHMudGlwU2V0dGluZ3MudGlwTG9jYXRpb24pfSxsZWZ0OmZ1bmN0aW9uKCl7cmV0dXJuL2xlZnQvaS50ZXN0KHMudGlwU2V0dGluZ3MudGlwTG9jYXRpb24pfSxjb3JuZXJzOmZ1bmN0aW9uKGUpe3ZhciB0PXMuJHdpbmRvdyxuPXQud2lkdGgoKSt0LnNjcm9sbExlZnQoKSxyPXQud2lkdGgoKSt0LnNjcm9sbFRvcCgpO3JldHVybltlLm9mZnNldCgpLnRvcDw9dC5zY3JvbGxUb3AoKSxuPD1lLm9mZnNldCgpLmxlZnQrZS5vdXRlcldpZHRoKCkscjw9ZS5vZmZzZXQoKS50b3ArZS5vdXRlckhlaWdodCgpLHQuc2Nyb2xsTGVmdCgpPj1lLm9mZnNldCgpLmxlZnRdfSx2aXNpYmxlOmZ1bmN0aW9uKGUpe3ZhciB0PWUubGVuZ3RoO3doaWxlKHQtLSlpZihlW3RdKXJldHVybiExO3JldHVybiEwfSxudWJfcG9zaXRpb246ZnVuY3Rpb24oZSx0LG4pe3Q9PT0iYXV0byI/ZS5hZGRDbGFzcyhuKTplLmFkZENsYXNzKHQpfSxzdGFydFRpbWVyOmZ1bmN0aW9uKCl7cy4kbGkubGVuZ3RoP3MuYXV0b21hdGU9c2V0VGltZW91dChmdW5jdGlvbigpe28uaGlkZSgpLG8uc2hvdygpLG8uc3RhcnRUaW1lcigpfSxzLnRpbWVyKTpjbGVhclRpbWVvdXQocy5hdXRvbWF0ZSl9LGVuZDpmdW5jdGlvbigpe3MuY29va2llTW9uc3RlciYmZS5jb29raWUocy5jb29raWVOYW1lLCJyaWRkZW4iLHtleHBpcmVzOjM2NSxkb21haW46cy5jb29raWVEb21haW59KSxzLnRpbWVyPjAmJmNsZWFyVGltZW91dChzLmF1dG9tYXRlKSxlKCIuam95cmlkZS1tb2RhbC1iZyIpLmhpZGUoKSxzLiRjdXJyZW50X3RpcC5oaWRlKCkscy5wb3N0U3RlcENhbGxiYWNrKHMuJGxpLmluZGV4KCkscy4kY3VycmVudF90aXApLHMucG9zdFJpZGVDYWxsYmFjayhzLiRsaS5pbmRleCgpLHMuJGN1cnJlbnRfdGlwKX0sanF1ZXJ5X2NoZWNrOmZ1bmN0aW9uKCl7cmV0dXJuIGUuaXNGdW5jdGlvbihlLmZuLm9uKT8hMDooZS5mbi5vbj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuZGVsZWdhdGUodCxlLG4pfSxlLmZuLm9mZj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMudW5kZWxlZ2F0ZSh0LGUsbil9LCExKX0sb3V0ZXJIVE1MOmZ1bmN0aW9uKGUpe3JldHVybiBlLm91dGVySFRNTHx8KG5ldyBYTUxTZXJpYWxpemVyKS5zZXJpYWxpemVUb1N0cmluZyhlKX0sdmVyc2lvbjpmdW5jdGlvbigpe3JldHVybiBzLnZlcnNpb259fTtlLmZuLmpveXJpZGU9ZnVuY3Rpb24odCl7aWYob1t0XSlyZXR1cm4gb1t0XS5hcHBseSh0aGlzLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSk7aWYodHlwZW9mIHQ9PSJvYmplY3QifHwhdClyZXR1cm4gby5pbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtlLmVycm9yKCJNZXRob2QgIit0KyIgZG9lcyBub3QgZXhpc3Qgb24galF1ZXJ5LmpveXJpZGUiKX19KShqUXVlcnksdGhpcyk7Ci8qCiAqIGpRdWVyeSBGb3VuZGF0aW9uIENsZWFyaW5nIDEuMi4xCiAqIGh0dHA6Ly9mb3VuZGF0aW9uLnp1cmIuY29tCiAqIENvcHlyaWdodCAyMDEyLCBaVVJCCiAqIEZyZWUgdG8gdXNlIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAKKi8KLypqc2xpbnQgdW5wYXJhbTogdHJ1ZSwgYnJvd3NlcjogdHJ1ZSwgaW5kZW50OiAyICovCihmdW5jdGlvbihlLHQsbixyKXsidXNlIHN0cmljdCI7dmFyIGk9e3RlbXBsYXRlczp7dmlld2luZzonPGEgaHJlZj0iIyIgY2xhc3M9ImNsZWFyaW5nLWNsb3NlIj4mdGltZXM7PC9hPjxkaXYgY2xhc3M9InZpc2libGUtaW1nIiBzdHlsZT0iZGlzcGxheTogbm9uZSI+PGltZyBzcmM9IiMiPjxwIGNsYXNzPSJjbGVhcmluZy1jYXB0aW9uIj48L3A+PGEgaHJlZj0iIyIgY2xhc3M9ImNsZWFyaW5nLW1haW4tbGVmdCI+PC9hPjxhIGhyZWY9IiMiIGNsYXNzPSJjbGVhcmluZy1tYWluLXJpZ2h0Ij48L2E+PC9kaXY+J30sY2xvc2Vfc2VsZWN0b3JzOiJhLmNsZWFyaW5nLWNsb3NlIixpbml0aWFsaXplZDohMSxsb2NrZWQ6ITF9LHM9e2luaXQ6ZnVuY3Rpb24odCxyKXtyZXR1cm4gdGhpcy5maW5kKCJ1bFtkYXRhLWNsZWFyaW5nXSIpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKG4pLHI9ZSh0aGlzKSxvPW98fHt9LHU9dXx8e30sYT1yLmRhdGEoImZuZHRuLmNsZWFyaW5nLnNldHRpbmdzIik7YXx8KG8uJHBhcmVudD1yLnBhcmVudCgpLHIuZGF0YSgiZm5kdG4uY2xlYXJpbmcuc2V0dGluZ3MiLGUuZXh0ZW5kKHt9LGksbykpLHMuYXNzZW1ibGUoci5maW5kKCJsaSIpKSxpLmluaXRpYWxpemVkfHwocy5ldmVudHMociksTW9kZXJuaXpyLnRvdWNoJiZzLnN3aXBlX2V2ZW50cygpKSl9KX0sZXZlbnRzOmZ1bmN0aW9uKHIpe3ZhciBvPXIuZGF0YSgiZm5kdG4uY2xlYXJpbmcuc2V0dGluZ3MiKTtlKG4pLm9uKCJjbGljay5mbmR0bi5jbGVhcmluZyIsInVsW2RhdGEtY2xlYXJpbmddIGxpIixmdW5jdGlvbih0LG4scil7dmFyIG49bnx8ZSh0aGlzKSxyPXJ8fG4saT1uLnBhcmVudCgpLmRhdGEoImZuZHRuLmNsZWFyaW5nLnNldHRpbmdzIik7dC5wcmV2ZW50RGVmYXVsdCgpLGl8fG4ucGFyZW50KCkuZm91bmRhdGlvbkNsZWFyaW5nKCkscy5vcGVuKGUodC50YXJnZXQpLG4scikscy51cGRhdGVfcGFkZGxlcyhyKX0pLm9uKCJjbGljay5mbmR0bi5jbGVhcmluZyIsIi5jbGVhcmluZy1tYWluLXJpZ2h0IixmdW5jdGlvbihlKXtzLm5hdihlLCJuZXh0Iil9KS5vbigiY2xpY2suZm5kdG4uY2xlYXJpbmciLCIuY2xlYXJpbmctbWFpbi1sZWZ0IixmdW5jdGlvbihlKXtzLm5hdihlLCJwcmV2Iil9KS5vbigiY2xpY2suZm5kdG4uY2xlYXJpbmciLG8uY2xvc2Vfc2VsZWN0b3JzLHRoaXMuY2xvc2UpLm9uKCJrZXlkb3duLmZuZHRuLmNsZWFyaW5nIix0aGlzLmtleWRvd24pLGUodCkub24oInJlc2l6ZS5mbmR0bi5jbGVhcmluZyIsdGhpcy5yZXNpemUpLGkuaW5pdGlhbGl6ZWQ9ITB9LHN3aXBlX2V2ZW50czpmdW5jdGlvbigpe2UobikuYmluZCgic3dpcGVsZWZ0IiwidWxbZGF0YS1jbGVhcmluZ10iLGZ1bmN0aW9uKGUpe3MubmF2KGUsIm5leHQiKX0pLmJpbmQoInN3aXBlcmlnaHQiLCJ1bFtkYXRhLWNsZWFyaW5nXSIsZnVuY3Rpb24oZSl7cy5uYXYoZSwicHJldiIpfSkuYmluZCgibW92ZXN0YXJ0IiwidWxbZGF0YS1jbGVhcmluZ10iLGZ1bmN0aW9uKGUpeyhlLmRpc3RYPmUuZGlzdFkmJmUuZGlzdFg8LWUuZGlzdFl8fGUuZGlzdFg8ZS5kaXN0WSYmZS5kaXN0WD4tZS5kaXN0WSkmJmUucHJldmVudERlZmF1bHQoKX0pfSxhc3NlbWJsZTpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudCgpLG49dC5kYXRhKCJmbmR0bi5jbGVhcmluZy5zZXR0aW5ncyIpLHI9dC5kZXRhY2goKSxpPXtncmlkOic8ZGl2IGNsYXNzPSJjYXJvdXNlbCI+Jyt0aGlzLm91dGVySFRNTChyWzBdKSsiPC9kaXY+Iix2aWV3aW5nOm4udGVtcGxhdGVzLnZpZXdpbmd9LHM9JzxkaXYgY2xhc3M9ImNsZWFyaW5nLWFzc2VtYmxlZCI+PGRpdj4nK2kudmlld2luZytpLmdyaWQrIjwvZGl2PjwvZGl2PiI7cmV0dXJuIG4uJHBhcmVudC5hcHBlbmQocyl9LG9wZW46ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4uY2xvc2VzdCgiLmNsZWFyaW5nLWFzc2VtYmxlZCIpLGk9ci5maW5kKCJkaXY6Zmlyc3QiKSxvPWkuZmluZCgiLnZpc2libGUtaW1nIiksdT1vLmZpbmQoImltZyIpLm5vdChlKTtzLmxvY2tlZCgpfHwodS5hdHRyKCJzcmMiLHRoaXMubG9hZChlKSksdS5sb2FkZWQoZnVuY3Rpb24oKXtyLmFkZENsYXNzKCJjbGVhcmluZy1ibGFja291dCIpLGkuYWRkQ2xhc3MoImNsZWFyaW5nLWNvbnRhaW5lciIpLHRoaXMuY2FwdGlvbihvLmZpbmQoIi5jbGVhcmluZy1jYXB0aW9uIiksZSksby5zaG93KCksdGhpcy5maXhfaGVpZ2h0KG4pLHRoaXMuY2VudGVyKHUpLHRoaXMuc2hpZnQodCxuLGZ1bmN0aW9uKCl7bi5zaWJsaW5ncygpLnJlbW92ZUNsYXNzKCJ2aXNpYmxlIiksbi5hZGRDbGFzcygidmlzaWJsZSIpfSl9LmJpbmQodGhpcykpKX0sY2xvc2U6ZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpO3ZhciBuPWZ1bmN0aW9uKGUpe3JldHVybi9ibGFja291dC8udGVzdChlLnNlbGVjdG9yKT9lOmUuY2xvc2VzdCgiLmNsZWFyaW5nLWJsYWNrb3V0Iil9KGUodGhpcykpLHIscztyZXR1cm4gdGhpcz09PXQudGFyZ2V0JiZuJiYocj1uLmZpbmQoImRpdjpmaXJzdCIpLHM9ci5maW5kKCIudmlzaWJsZS1pbWciKSxpLnByZXZfaW5kZXg9MCxuLmZpbmQoInVsW2RhdGEtY2xlYXJpbmddIikuYXR0cigic3R5bGUiLCIiKSxuLnJlbW92ZUNsYXNzKCJjbGVhcmluZy1ibGFja291dCIpLHIucmVtb3ZlQ2xhc3MoImNsZWFyaW5nLWNvbnRhaW5lciIpLHMuaGlkZSgpKSwhMX0sa2V5ZG93bjpmdW5jdGlvbih0KXt2YXIgbj1lKCIuY2xlYXJpbmctYmxhY2tvdXQiKS5maW5kKCJ1bFtkYXRhLWNsZWFyaW5nXSIpO3Qud2hpY2g9PT0zOSYmcy5nbyhuLCJuZXh0IiksdC53aGljaD09PTM3JiZzLmdvKG4sInByZXYiKSx0LndoaWNoPT09MjcmJmUoImEuY2xlYXJpbmctY2xvc2UiKS50cmlnZ2VyKCJjbGljayIpfSxuYXY6ZnVuY3Rpb24odCxuKXt2YXIgcj1lKCIuY2xlYXJpbmctYmxhY2tvdXQiKS5maW5kKCJ1bFtkYXRhLWNsZWFyaW5nXSIpO3QucHJldmVudERlZmF1bHQoKSx0aGlzLmdvKHIsbil9LHJlc2l6ZTpmdW5jdGlvbigpe3ZhciB0PWUoIi5jbGVhcmluZy1ibGFja291dCAudmlzaWJsZS1pbWciKS5maW5kKCJpbWciKTt0Lmxlbmd0aD4wJiZzLmNlbnRlcih0KX0sZml4X2hlaWdodDpmdW5jdGlvbih0KXt2YXIgbj10LnNpYmxpbmdzKCk7bi5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKSxuPXQuZmluZCgiaW1nIik7dC5oZWlnaHQoKT5uLm91dGVySGVpZ2h0KCkmJnQuYWRkQ2xhc3MoImZpeC1oZWlnaHQiKX0pLmNsb3Nlc3QoInVsIikud2lkdGgobi5sZW5ndGgqMTAwKyIlIil9LHVwZGF0ZV9wYWRkbGVzOmZ1bmN0aW9uKGUpe3ZhciB0PWUuY2xvc2VzdCgiLmNhcm91c2VsIikuc2libGluZ3MoIi52aXNpYmxlLWltZyIpO2UubmV4dCgpLmxlbmd0aD4wP3QuZmluZCgiLmNsZWFyaW5nLW1haW4tcmlnaHQiKS5yZW1vdmVDbGFzcygiZGlzYWJsZWQiKTp0LmZpbmQoIi5jbGVhcmluZy1tYWluLXJpZ2h0IikuYWRkQ2xhc3MoImRpc2FibGVkIiksZS5wcmV2KCkubGVuZ3RoPjA/dC5maW5kKCIuY2xlYXJpbmctbWFpbi1sZWZ0IikucmVtb3ZlQ2xhc3MoImRpc2FibGVkIik6dC5maW5kKCIuY2xlYXJpbmctbWFpbi1sZWZ0IikuYWRkQ2xhc3MoImRpc2FibGVkIil9LGxvYWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnQoKS5hdHRyKCJocmVmIik7cmV0dXJuIHRoaXMucHJlbG9hZChlKSx0P3Q6ZS5hdHRyKCJzcmMiKX0scHJlbG9hZDpmdW5jdGlvbihlKXt0aGlzLmltZyhlLmNsb3Nlc3QoImxpIikubmV4dCgpKSx0aGlzLmltZyhlLmNsb3Nlc3QoImxpIikucHJldigpKX0saW1nOmZ1bmN0aW9uKGUpe2lmKGUubGVuZ3RoPjApe3ZhciB0PW5ldyBJbWFnZSxuPWUuZmluZCgiYSIpO24ubGVuZ3RoPjA/dC5zcmM9bi5hdHRyKCJocmVmIik6dC5zcmM9ZS5maW5kKCJpbWciKS5hdHRyKCJzcmMiKX19LGNhcHRpb246ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmRhdGEoImNhcHRpb24iKTtuP2UudGV4dChuKS5zaG93KCk6ZS50ZXh0KCIiKS5oaWRlKCl9LGdvOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5maW5kKCIudmlzaWJsZSIpLHI9blt0XSgpO3IubGVuZ3RoPjAmJnIuZmluZCgiaW1nIikudHJpZ2dlcigiY2xpY2siLFtuLHJdKX0sc2hpZnQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXQucGFyZW50KCkscz1pLnByZXZfaW5kZXgsbz10aGlzLmRpcmVjdGlvbihyLGUsdCksdT1wYXJzZUludChyLmNzcygibGVmdCIpLDEwKSxhPXQub3V0ZXJXaWR0aCgpLGY7dC5pbmRleCgpIT09cyYmIS9za2lwLy50ZXN0KG8pPy9sZWZ0Ly50ZXN0KG8pPyh0aGlzLmxvY2soKSxyLmFuaW1hdGUoe2xlZnQ6dSthfSwzMDAsdGhpcy51bmxvY2spKTovcmlnaHQvLnRlc3QobykmJih0aGlzLmxvY2soKSxyLmFuaW1hdGUoe2xlZnQ6dS1hfSwzMDAsdGhpcy51bmxvY2spKTovc2tpcC8udGVzdChvKSYmKGY9dC5pbmRleCgpLWkudXBfY291bnQsdGhpcy5sb2NrKCksZj4wP3IuYW5pbWF0ZSh7bGVmdDotKGYqYSl9LDMwMCx0aGlzLnVubG9jayk6ci5hbmltYXRlKHtsZWZ0OjB9LDMwMCx0aGlzLnVubG9jaykpLG4oKX0sbG9jazpmdW5jdGlvbigpe2kubG9ja2VkPSEwfSx1bmxvY2s6ZnVuY3Rpb24oKXtpLmxvY2tlZD0hMX0sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuIGkubG9ja2VkfSxkaXJlY3Rpb246ZnVuY3Rpb24odCxuLHIpe3ZhciBzPXQuZmluZCgibGkiKSxvPXMub3V0ZXJXaWR0aCgpK3Mub3V0ZXJXaWR0aCgpLzQsdT1NYXRoLmZsb29yKGUoIi5jbGVhcmluZy1jb250YWluZXIiKS5vdXRlcldpZHRoKCkvbyktMSxhPXMuaW5kZXgociksZjtyZXR1cm4gaS51cF9jb3VudD11LHRoaXMuYWRqYWNlbnQoaS5wcmV2X2luZGV4LGEpP2E+dSYmYT5pLnByZXZfaW5kZXg/Zj0icmlnaHQiOmE+dS0xJiZhPD1pLnByZXZfaW5kZXg/Zj0ibGVmdCI6Zj0hMTpmPSJza2lwIixpLnByZXZfaW5kZXg9YSxmfSxhZGphY2VudDpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj10KzE7bj49dC0xO24tLSlpZihuPT09ZSlyZXR1cm4hMDtyZXR1cm4hMX0sY2VudGVyOmZ1bmN0aW9uKGUpe2UuY3NzKHttYXJnaW5MZWZ0Oi0oZS5vdXRlcldpZHRoKCkvMiksbWFyZ2luVG9wOi0oZS5vdXRlckhlaWdodCgpLzIpfSl9LG91dGVySFRNTDpmdW5jdGlvbihlKXtyZXR1cm4gZS5vdXRlckhUTUx8fChuZXcgWE1MU2VyaWFsaXplcikuc2VyaWFsaXplVG9TdHJpbmcoZSl9fTtlLmZuLmZvdW5kYXRpb25DbGVhcmluZz1mdW5jdGlvbih0KXtpZihzW3RdKXJldHVybiBzW3RdLmFwcGx5KHRoaXMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKTtpZih0eXBlb2YgdD09Im9iamVjdCJ8fCF0KXJldHVybiBzLmluaXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO2UuZXJyb3IoIk1ldGhvZCAiK3QrIiBkb2VzIG5vdCBleGlzdCBvbiBqUXVlcnkuZm91bmRhdGlvbkNsZWFyaW5nIil9LGZ1bmN0aW9uKGUpe2UuZm4ubG9hZGVkPWZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gbygpe3MtPTEsIXMmJnQoKX1mdW5jdGlvbiB1KCl7dGhpcy5vbmUoImxvYWQiLG8pO2lmKGUuYnJvd3Nlci5tc2llKXt2YXIgdD10aGlzLmF0dHIoInNyYyIpLG49dC5tYXRjaCgvXD8vKT8iJiI6Ij8iO24rPXIuY2FjaGVQcmVmaXgrIj0iKyhuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuYXR0cigic3JjIix0K24pfX12YXIgcj1lLmV4dGVuZCh7fSxlLmZuLmxvYWRlZC5kZWZhdWx0cyxuKSxpPXRoaXMuZmluZCgiaW1nIikuYWRkKHRoaXMuZmlsdGVyKCJpbWciKSkscz1pLmxlbmd0aDtyZXR1cm4gaS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKTtpZighdC5hdHRyKCJzcmMiKSl7bygpO3JldHVybn10aGlzLmNvbXBsZXRlfHx0aGlzLnJlYWR5U3RhdGU9PT00P28oKTp1LmNhbGwodCl9KX0sZS5mbi5sb2FkZWQuZGVmYXVsdHM9e2NhY2hlUHJlZml4OiJyYW5kb20ifX0oalF1ZXJ5KX0pKGpRdWVyeSx0aGlzLHRoaXMuZG9jdW1lbnQpOwovKgogKiBqUXVlcnkgRm91bmRhdGlvbiBNYWdlbGxhbiAwLjAuMQogKiBodHRwOi8vZm91bmRhdGlvbi56dXJiLmNvbQogKiBDb3B5cmlnaHQgMjAxMiwgWlVSQgogKiBGcmVlIHRvIHVzZSB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwCiovCi8qanNsaW50IHVucGFyYW06IHRydWUsIGJyb3dzZXI6IHRydWUsIGluZGVudDogMiAqLwooZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlLmZuLmZvdW5kYXRpb25NYWdlbGxhbj1mdW5jdGlvbihuKXt2YXIgcj1lKHQpLGk9ZShkb2N1bWVudCkscz1lKCJbZGF0YS1tYWdlbGxhbi1leHBlZGl0aW9uPWZpeGVkXSIpLG89e3RocmVzaG9sZDpzLmxlbmd0aD9zLm91dGVySGVpZ2h0KCEwKTowLGFjdGl2ZUNsYXNzOiJhY3RpdmUifSxuPWUuZXh0ZW5kKHt9LG8sbik7aS5vbigibWFnZWxsYW4uYXJyaXZhbCIsIltkYXRhLW1hZ2VsbGFuLWFycml2YWxdIixmdW5jdGlvbih0KXt2YXIgcj1lKHRoaXMpLGk9ci5jbG9zZXN0KCJbZGF0YS1tYWdlbGxhbi1leHBlZGl0aW9uXSIpLHM9aS5hdHRyKCJkYXRhLW1hZ2VsbGFuLWFjdGl2ZS1jbGFzcyIpfHxuLmFjdGl2ZUNsYXNzO3IuY2xvc2VzdCgiW2RhdGEtbWFnZWxsYW4tZXhwZWRpdGlvbl0iKS5maW5kKCJbZGF0YS1tYWdlbGxhbi1hcnJpdmFsXSIpLm5vdCh0aGlzKS5yZW1vdmVDbGFzcyhzKSxyLmFkZENsYXNzKHMpfSk7dmFyIHU9ZSgiW2RhdGEtbWFnZWxsYW4tZXhwZWRpdGlvbl0iKTt1LmZpbmQoIltkYXRhLW1hZ2VsbGFuLWFycml2YWxdOmZpcnN0IikuYWRkQ2xhc3ModS5hdHRyKCJkYXRhLW1hZ2VsbGFuLWFjdGl2ZS1jbGFzcyIpfHxuLmFjdGl2ZUNsYXNzKSxzLm9uKCJtYWdlbGxhbi51cGRhdGUtcG9zaXRpb24iLGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKTt0LmRhdGEoIm1hZ2VsbGFuLWZpeGVkLXBvc2l0aW9uIiwiIiksdC5kYXRhKCJtYWdlbGxhbi10b3Atb2Zmc2V0IiwiIil9KS50cmlnZ2VyKCJtYWdlbGxhbi51cGRhdGUtcG9zaXRpb24iKSxyLm9uKCJyZXNpemUubWFnZWxsYW4iLGZ1bmN0aW9uKCl7cy50cmlnZ2VyKCJtYWdlbGxhbi51cGRhdGUtcG9zaXRpb24iKX0pLHIub24oInNjcm9sbC5tYWdlbGxhbiIsZnVuY3Rpb24oKXt2YXIgdD1yLnNjcm9sbFRvcCgpO3MuZWFjaChmdW5jdGlvbigpe3ZhciByPWUodGhpcyk7ci5kYXRhKCJtYWdlbGxhbi10b3Atb2Zmc2V0Iik9PT0iIiYmci5kYXRhKCJtYWdlbGxhbi10b3Atb2Zmc2V0IixyLm9mZnNldCgpLnRvcCk7dmFyIGk9dCtuLnRocmVzaG9sZD5yLmRhdGEoIm1hZ2VsbGFuLXRvcC1vZmZzZXQiKTtyLmRhdGEoIm1hZ2VsbGFuLWZpeGVkLXBvc2l0aW9uIikhPWkmJihyLmRhdGEoIm1hZ2VsbGFuLWZpeGVkLXBvc2l0aW9uIixpKSxpP3IuY3NzKHtwb3NpdGlvbjoiZml4ZWQiLHRvcDowfSk6ci5jc3Moe3Bvc2l0aW9uOiIiLHRvcDoiIn0pKX0pfSk7dmFyIGE9ZSgiW2RhdGEtbWFnZWxsYW4tZGVzdGluYXRpb25dOmxhc3QiKTtyLm9uKCJzY3JvbGwubWFnZWxsYW4iLGZ1bmN0aW9uKHQpe3ZhciBzPXIuc2Nyb2xsVG9wKCksbz1zK3Iub3V0ZXJIZWlnaHQoITApLHU9TWF0aC5jZWlsKGEub2Zmc2V0KCkudG9wKTtlKCJbZGF0YS1tYWdlbGxhbi1kZXN0aW5hdGlvbl0iKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKSxyPXQuYXR0cigiZGF0YS1tYWdlbGxhbi1kZXN0aW5hdGlvbiIpLGE9dC5vZmZzZXQoKS50b3AtczthPD1uLnRocmVzaG9sZCYmZSgiW2RhdGEtbWFnZWxsYW4tYXJyaXZhbD0iK3IrIl0iKS50cmlnZ2VyKCJtYWdlbGxhbi5hcnJpdmFsIiksbz49aS5vdXRlckhlaWdodCghMCkmJnU+cyYmdTxvJiZlKCJbZGF0YS1tYWdlbGxhbi1hcnJpdmFsXTpsYXN0IikudHJpZ2dlcigibWFnZWxsYW4uYXJyaXZhbCIpfSl9KX19KShqUXVlcnksdGhpcyk7Cg==]]></data>
	</file>
	<file>
	  <filename>/assets/javascripts/jquery.event.move.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8ganF1ZXJ5LmV2ZW50Lm1vdmUKLy8KLy8gMS4zLjEKLy8KLy8gU3RlcGhlbiBCYW5kCi8vCi8vIFRyaWdnZXJzICdtb3Zlc3RhcnQnLCAnbW92ZScgYW5kICdtb3ZlZW5kJyBldmVudHMgYWZ0ZXIKLy8gbW91c2Vtb3ZlcyBmb2xsb3dpbmcgYSBtb3VzZWRvd24gY3Jvc3MgYSBkaXN0YW5jZSB0aHJlc2hvbGQsCi8vIHNpbWlsYXIgdG8gdGhlIG5hdGl2ZSAnZHJhZ3N0YXJ0JywgJ2RyYWcnIGFuZCAnZHJhZ2VuZCcgZXZlbnRzLgovLyBNb3ZlIGV2ZW50cyBhcmUgdGhyb3R0bGVkIHRvIGFuaW1hdGlvbiBmcmFtZXMuIE1vdmUgZXZlbnQgb2JqZWN0cwovLyBoYXZlIHRoZSBwcm9wZXJ0aWVzOgovLwovLyBwYWdlWDoKLy8gcGFnZVk6ICAgUGFnZSBjb29yZGluYXRlcyBvZiBwb2ludGVyLgovLyBzdGFydFg6Ci8vIHN0YXJ0WTogIFBhZ2UgY29vcmRpbmF0ZXMgb2YgcG9pbnRlciBhdCBtb3Zlc3RhcnQuCi8vIGRpc3RYOgovLyBkaXN0WTogIERpc3RhbmNlIHRoZSBwb2ludGVyIGhhcyBtb3ZlZCBzaW5jZSBtb3Zlc3RhcnQuCi8vIGRlbHRhWDoKLy8gZGVsdGFZOiAgRGlzdGFuY2UgdGhlIGZpbmdlciBoYXMgbW92ZWQgc2luY2UgbGFzdCBldmVudC4KLy8gdmVsb2NpdHlYOgovLyB2ZWxvY2l0eVk6ICBBdmVyYWdlIHZlbG9jaXR5IG92ZXIgbGFzdCBmZXcgZXZlbnRzLgoKCihmdW5jdGlvbiAobW9kdWxlKSB7CglpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CgkJLy8gQU1ELiBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgbW9kdWxlLgoJCWRlZmluZShbJ2pxdWVyeSddLCBtb2R1bGUpOwoJfSBlbHNlIHsKCQkvLyBCcm93c2VyIGdsb2JhbHMKCQltb2R1bGUoalF1ZXJ5KTsKCX0KfSkoZnVuY3Rpb24oalF1ZXJ5LCB1bmRlZmluZWQpewoKCXZhciAvLyBOdW1iZXIgb2YgcGl4ZWxzIGEgcHJlc3NlZCBwb2ludGVyIHRyYXZlbHMgYmVmb3JlIG1vdmVzdGFydAoJICAgIC8vIGV2ZW50IGlzIGZpcmVkLgoJICAgIHRocmVzaG9sZCA9IDYsCgkKCSAgICBhZGQgPSBqUXVlcnkuZXZlbnQuYWRkLAoJCgkgICAgcmVtb3ZlID0galF1ZXJ5LmV2ZW50LnJlbW92ZSwKCgkgICAgLy8gSnVzdCBzdWdhciwgc28gd2UgY2FuIGhhdmUgYXJndW1lbnRzIGluIHRoZSBzYW1lIG9yZGVyIGFzCgkgICAgLy8gYWRkIGFuZCByZW1vdmUuCgkgICAgdHJpZ2dlciA9IGZ1bmN0aW9uKG5vZGUsIHR5cGUsIGRhdGEpIHsKCSAgICAJalF1ZXJ5LmV2ZW50LnRyaWdnZXIodHlwZSwgZGF0YSwgbm9kZSk7CgkgICAgfSwKCgkgICAgLy8gU2hpbSBmb3IgcmVxdWVzdEFuaW1hdGlvbkZyYW1lLCBmYWxsaW5nIGJhY2sgdG8gdGltZXIuIFNlZToKCSAgICAvLyBzZWUgaHR0cDovL3BhdWxpcmlzaC5jb20vMjAxMS9yZXF1ZXN0YW5pbWF0aW9uZnJhbWUtZm9yLXNtYXJ0LWFuaW1hdGluZy8KCSAgICByZXF1ZXN0RnJhbWUgPSAoZnVuY3Rpb24oKXsKCSAgICAJcmV0dXJuICgKCSAgICAJCXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwKCSAgICAJCXdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwKCSAgICAJCXdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwKCSAgICAJCXdpbmRvdy5vUmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8CgkgICAgCQl3aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwKCSAgICAJCWZ1bmN0aW9uKGZuLCBlbGVtZW50KXsKCSAgICAJCQlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXsKCSAgICAJCQkJZm4oKTsKCSAgICAJCQl9LCAyNSk7CgkgICAgCQl9CgkgICAgCSk7CgkgICAgfSkoKSwKCSAgICAKCSAgICBpZ25vcmVUYWdzID0gewoJICAgIAl0ZXh0YXJlYTogdHJ1ZSwKCSAgICAJaW5wdXQ6IHRydWUsCgkgICAgCXNlbGVjdDogdHJ1ZSwKCSAgICAJYnV0dG9uOiB0cnVlCgkgICAgfSwKCSAgICAKCSAgICBtb3VzZWV2ZW50cyA9IHsKCSAgICAJbW92ZTogJ21vdXNlbW92ZScsCgkgICAgCWNhbmNlbDogJ21vdXNldXAgZHJhZ3N0YXJ0JywKCSAgICAJZW5kOiAnbW91c2V1cCcKCSAgICB9LAoJICAgIAoJICAgIHRvdWNoZXZlbnRzID0gewoJICAgIAltb3ZlOiAndG91Y2htb3ZlJywKCSAgICAJY2FuY2VsOiAndG91Y2hlbmQnLAoJICAgIAllbmQ6ICd0b3VjaGVuZCcKCSAgICB9OwoKCgkvLyBDb25zdHJ1Y3RvcnMKCQoJZnVuY3Rpb24gVGltZXIoZm4pewoJCXZhciBjYWxsYmFjayA9IGZuLAoJCQkJYWN0aXZlID0gZmFsc2UsCgkJCQlydW5uaW5nID0gZmFsc2U7CgkJCgkJZnVuY3Rpb24gdHJpZ2dlcih0aW1lKSB7CgkJCWlmIChhY3RpdmUpewoJCQkJY2FsbGJhY2soKTsKCQkJCXJlcXVlc3RGcmFtZSh0cmlnZ2VyKTsKCQkJCXJ1bm5pbmcgPSB0cnVlOwoJCQkJYWN0aXZlID0gZmFsc2U7CgkJCX0KCQkJZWxzZSB7CgkJCQlydW5uaW5nID0gZmFsc2U7CgkJCX0KCQl9CgkJCgkJdGhpcy5raWNrID0gZnVuY3Rpb24oZm4pIHsKCQkJYWN0aXZlID0gdHJ1ZTsKCQkJaWYgKCFydW5uaW5nKSB7IHRyaWdnZXIoKTsgfQoJCX07CgkJCgkJdGhpcy5lbmQgPSBmdW5jdGlvbihmbikgewoJCQl2YXIgY2IgPSBjYWxsYmFjazsKCQkJCgkJCWlmICghZm4pIHsgcmV0dXJuOyB9CgkJCQoJCQkvLyBJZiB0aGUgdGltZXIgaXMgbm90IHJ1bm5pbmcsIHNpbXBseSBjYWxsIHRoZSBlbmQgY2FsbGJhY2suCgkJCWlmICghcnVubmluZykgewoJCQkJZm4oKTsKCQkJfQoJCQkvLyBJZiB0aGUgdGltZXIgaXMgcnVubmluZywgYW5kIGhhcyBiZWVuIGtpY2tlZCBsYXRlbHksIHRoZW4KCQkJLy8gcXVldWUgdXAgdGhlIGN1cnJlbnQgY2FsbGJhY2sgYW5kIHRoZSBlbmQgY2FsbGJhY2ssIG90aGVyd2lzZQoJCQkvLyBqdXN0IHRoZSBlbmQgY2FsbGJhY2suCgkJCWVsc2UgewoJCQkJY2FsbGJhY2sgPSBhY3RpdmUgPwoJCQkJCWZ1bmN0aW9uKCl7IGNiKCk7IGZuKCk7IH0gOiAKCQkJCQlmbiA7CgkJCQkKCQkJCWFjdGl2ZSA9IHRydWU7CgkJCX0KCQl9OwoJfQoKCgkvLyBGdW5jdGlvbnMKCQoJZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KCQoJZnVuY3Rpb24gcmV0dXJuRmFsc2UoKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoJCglmdW5jdGlvbiBwcmV2ZW50RGVmYXVsdChlKSB7CgkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJfQoJCglmdW5jdGlvbiBwcmV2ZW50SWdub3JlVGFncyhlKSB7CgkJLy8gRG9uJ3QgcHJldmVudCBpbnRlcmFjdGlvbiB3aXRoIGZvcm0gZWxlbWVudHMuCgkJaWYgKGlnbm9yZVRhZ3NbIGUudGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSBdKSB7IHJldHVybjsgfQoJCQoJCWUucHJldmVudERlZmF1bHQoKTsKCX0KCglmdW5jdGlvbiBpc0xlZnRCdXR0b24oZSkgewoJCS8vIElnbm9yZSBtb3VzZWRvd25zIG9uIGFueSBidXR0b24gb3RoZXIgdGhhbiB0aGUgbGVmdCAob3IgcHJpbWFyeSkKCQkvLyBtb3VzZSBidXR0b24sIG9yIHdoZW4gYSBtb2RpZmllciBrZXkgaXMgcHJlc3NlZC4KCQlyZXR1cm4gKGUud2hpY2ggPT09IDEgJiYgIWUuY3RybEtleSAmJiAhZS5hbHRLZXkpOwoJfQoKCWZ1bmN0aW9uIGlkZW50aWZpZWRUb3VjaCh0b3VjaExpc3QsIGlkKSB7CgkJdmFyIGksIGw7CgoJCWlmICh0b3VjaExpc3QuaWRlbnRpZmllZFRvdWNoKSB7CgkJCXJldHVybiB0b3VjaExpc3QuaWRlbnRpZmllZFRvdWNoKGlkKTsKCQl9CgkJCgkJLy8gdG91Y2hMaXN0LmlkZW50aWZpZWRUb3VjaCgpIGRvZXMgbm90IGV4aXN0IGluCgkJLy8gd2Via2l0IHlldOKApiB3ZSBtdXN0IGRvIHRoZSBzZWFyY2ggb3Vyc2VsdmVzLi4uCgkJCgkJaSA9IC0xOwoJCWwgPSB0b3VjaExpc3QubGVuZ3RoOwoJCQoJCXdoaWxlICgrK2kgPCBsKSB7CgkJCWlmICh0b3VjaExpc3RbaV0uaWRlbnRpZmllciA9PT0gaWQpIHsKCQkJCXJldHVybiB0b3VjaExpc3RbaV07CgkJCX0KCQl9Cgl9CgoJZnVuY3Rpb24gY2hhbmdlZFRvdWNoKGUsIGV2ZW50KSB7CgkJdmFyIHRvdWNoID0gaWRlbnRpZmllZFRvdWNoKGUuY2hhbmdlZFRvdWNoZXMsIGV2ZW50LmlkZW50aWZpZXIpOwoKCQkvLyBUaGlzIGlzbid0IHRoZSB0b3VjaCB5b3UncmUgbG9va2luZyBmb3IuCgkJaWYgKCF0b3VjaCkgeyByZXR1cm47IH0KCgkJLy8gQ2hyb21lIEFuZHJvaWQgKGF0IGxlYXN0KSBpbmNsdWRlcyB0b3VjaGVzIHRoYXQgaGF2ZSBub3QKCQkvLyBjaGFuZ2VkIGluIGUuY2hhbmdlZFRvdWNoZXMuIFRoYXQncyBhIGJpdCBhbm5veWluZy4gQ2hlY2sKCQkvLyB0aGF0IHRoaXMgdG91Y2ggaGFzIGNoYW5nZWQuCgkJaWYgKHRvdWNoLnBhZ2VYID09PSBldmVudC5wYWdlWCAmJiB0b3VjaC5wYWdlWSA9PT0gZXZlbnQucGFnZVkpIHsgcmV0dXJuOyB9CgoJCXJldHVybiB0b3VjaDsKCX0KCgoJLy8gSGFuZGxlcnMgdGhhdCBkZWNpZGUgd2hlbiB0aGUgZmlyc3QgbW92ZXN0YXJ0IGlzIHRyaWdnZXJlZAoJCglmdW5jdGlvbiBtb3VzZWRvd24oZSl7CgkJdmFyIGRhdGE7CgoJCWlmICghaXNMZWZ0QnV0dG9uKGUpKSB7IHJldHVybjsgfQoKCQlkYXRhID0gewoJCQl0YXJnZXQ6IGUudGFyZ2V0LAoJCQlzdGFydFg6IGUucGFnZVgsCgkJCXN0YXJ0WTogZS5wYWdlWSwKCQkJdGltZVN0YW1wOiBlLnRpbWVTdGFtcAoJCX07CgoJCWFkZChkb2N1bWVudCwgbW91c2VldmVudHMubW92ZSwgbW91c2Vtb3ZlLCBkYXRhKTsKCQlhZGQoZG9jdW1lbnQsIG1vdXNlZXZlbnRzLmNhbmNlbCwgbW91c2VlbmQsIGRhdGEpOwoJfQoKCWZ1bmN0aW9uIG1vdXNlbW92ZShlKXsKCQl2YXIgZGF0YSA9IGUuZGF0YTsKCgkJY2hlY2tUaHJlc2hvbGQoZSwgZGF0YSwgZSwgcmVtb3ZlTW91c2UpOwoJfQoKCWZ1bmN0aW9uIG1vdXNlZW5kKGUpIHsKCQlyZW1vdmVNb3VzZSgpOwoJfQoKCWZ1bmN0aW9uIHJlbW92ZU1vdXNlKCkgewoJCXJlbW92ZShkb2N1bWVudCwgbW91c2VldmVudHMubW92ZSwgbW91c2Vtb3ZlKTsKCQlyZW1vdmUoZG9jdW1lbnQsIG1vdXNlZXZlbnRzLmNhbmNlbCwgcmVtb3ZlTW91c2UpOwoJfQoKCWZ1bmN0aW9uIHRvdWNoc3RhcnQoZSkgewoJCXZhciB0b3VjaCwgdGVtcGxhdGU7CgoJCS8vIERvbid0IGdldCBpbiB0aGUgd2F5IG9mIGludGVyYWN0aW9uIHdpdGggZm9ybSBlbGVtZW50cy4KCQlpZiAoaWdub3JlVGFnc1sgZS50YXJnZXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpIF0pIHsgcmV0dXJuOyB9CgoJCXRvdWNoID0gZS5jaGFuZ2VkVG91Y2hlc1swXTsKCQkKCQkvLyBpT1MgbGl2ZSB1cGRhdGVzIHRoZSB0b3VjaCBvYmplY3RzIHdoZXJlYXMgQW5kcm9pZCBnaXZlcyB1cyBjb3BpZXMuCgkJLy8gVGhhdCBtZWFucyB3ZSBjYW4ndCB0cnVzdCB0aGUgdG91Y2hzdGFydCBvYmplY3QgdG8gc3RheSB0aGUgc2FtZSwKCQkvLyBzbyB3ZSBtdXN0IGNvcHkgdGhlIGRhdGEuIFRoaXMgb2JqZWN0IGFjdHMgYXMgYSB0ZW1wbGF0ZSBmb3IKCQkvLyBtb3Zlc3RhcnQsIG1vdmUgYW5kIG1vdmVlbmQgZXZlbnQgb2JqZWN0cy4KCQl0ZW1wbGF0ZSA9IHsKCQkJdGFyZ2V0OiB0b3VjaC50YXJnZXQsCgkJCXN0YXJ0WDogdG91Y2gucGFnZVgsCgkJCXN0YXJ0WTogdG91Y2gucGFnZVksCgkJCXRpbWVTdGFtcDogZS50aW1lU3RhbXAsCgkJCWlkZW50aWZpZXI6IHRvdWNoLmlkZW50aWZpZXIKCQl9OwoKCQkvLyBVc2UgdGhlIHRvdWNoIGlkZW50aWZpZXIgYXMgYSBuYW1lc3BhY2UsIHNvIHRoYXQgd2UgY2FuIGxhdGVyCgkJLy8gcmVtb3ZlIGhhbmRsZXJzIHBlcnRhaW5pbmcgb25seSB0byB0aGlzIHRvdWNoLgoJCWFkZChkb2N1bWVudCwgdG91Y2hldmVudHMubW92ZSArICcuJyArIHRvdWNoLmlkZW50aWZpZXIsIHRvdWNobW92ZSwgdGVtcGxhdGUpOwoJCWFkZChkb2N1bWVudCwgdG91Y2hldmVudHMuY2FuY2VsICsgJy4nICsgdG91Y2guaWRlbnRpZmllciwgdG91Y2hlbmQsIHRlbXBsYXRlKTsKCX0KCglmdW5jdGlvbiB0b3VjaG1vdmUoZSl7CgkJdmFyIGRhdGEgPSBlLmRhdGEsCgkJICAgIHRvdWNoID0gY2hhbmdlZFRvdWNoKGUsIGRhdGEpOwoKCQlpZiAoIXRvdWNoKSB7IHJldHVybjsgfQoKCQljaGVja1RocmVzaG9sZChlLCBkYXRhLCB0b3VjaCwgcmVtb3ZlVG91Y2gpOwoJfQoKCWZ1bmN0aW9uIHRvdWNoZW5kKGUpIHsKCQl2YXIgdGVtcGxhdGUgPSBlLmRhdGEsCgkJICAgIHRvdWNoID0gaWRlbnRpZmllZFRvdWNoKGUuY2hhbmdlZFRvdWNoZXMsIHRlbXBsYXRlLmlkZW50aWZpZXIpOwoKCQlpZiAoIXRvdWNoKSB7IHJldHVybjsgfQoKCQlyZW1vdmVUb3VjaCh0ZW1wbGF0ZS5pZGVudGlmaWVyKTsKCX0KCglmdW5jdGlvbiByZW1vdmVUb3VjaChpZGVudGlmaWVyKSB7CgkJcmVtb3ZlKGRvY3VtZW50LCAnLicgKyBpZGVudGlmaWVyLCB0b3VjaG1vdmUpOwoJCXJlbW92ZShkb2N1bWVudCwgJy4nICsgaWRlbnRpZmllciwgdG91Y2hlbmQpOwoJfQoKCgkvLyBMb2dpYyBmb3IgZGVjaWRpbmcgd2hlbiB0byB0cmlnZ2VyIGEgbW92ZXN0YXJ0LgoKCWZ1bmN0aW9uIGNoZWNrVGhyZXNob2xkKGUsIHRlbXBsYXRlLCB0b3VjaCwgZm4pIHsKCQl2YXIgZGlzdFggPSB0b3VjaC5wYWdlWCAtIHRlbXBsYXRlLnN0YXJ0WCwKCQkgICAgZGlzdFkgPSB0b3VjaC5wYWdlWSAtIHRlbXBsYXRlLnN0YXJ0WTsKCgkJLy8gRG8gbm90aGluZyBpZiB0aGUgdGhyZXNob2xkIGhhcyBub3QgYmVlbiBjcm9zc2VkLgoJCWlmICgoZGlzdFggKiBkaXN0WCkgKyAoZGlzdFkgKiBkaXN0WSkgPCAodGhyZXNob2xkICogdGhyZXNob2xkKSkgeyByZXR1cm47IH0KCgkJdHJpZ2dlclN0YXJ0KGUsIHRlbXBsYXRlLCB0b3VjaCwgZGlzdFgsIGRpc3RZLCBmbik7Cgl9CgoJZnVuY3Rpb24gaGFuZGxlZCgpIHsKCQkvLyB0aGlzLl9oYW5kbGVkIHNob3VsZCByZXR1cm4gZmFsc2Ugb25jZSwgYW5kIGFmdGVyIHJldHVybiB0cnVlLgoJCXRoaXMuX2hhbmRsZWQgPSByZXR1cm5UcnVlOwoJCXJldHVybiBmYWxzZTsKCX0KCglmdW5jdGlvbiBmbGFnQXNIYW5kbGVkKGUpIHsKCQllLl9oYW5kbGVkKCk7Cgl9CgoJZnVuY3Rpb24gdHJpZ2dlclN0YXJ0KGUsIHRlbXBsYXRlLCB0b3VjaCwgZGlzdFgsIGRpc3RZLCBmbikgewoJCXZhciBub2RlID0gdGVtcGxhdGUudGFyZ2V0LAoJCSAgICB0b3VjaGVzLCB0aW1lOwoKCQl0b3VjaGVzID0gZS50YXJnZXRUb3VjaGVzOwoJCXRpbWUgPSBlLnRpbWVTdGFtcCAtIHRlbXBsYXRlLnRpbWVTdGFtcDsKCgkJLy8gQ3JlYXRlIGEgbW92ZXN0YXJ0IG9iamVjdCB3aXRoIHNvbWUgc3BlY2lhbCBwcm9wZXJ0aWVzIHRoYXQKCQkvLyBhcmUgcGFzc2VkIG9ubHkgdG8gdGhlIG1vdmVzdGFydCBoYW5kbGVycy4KCQl0ZW1wbGF0ZS50eXBlID0gJ21vdmVzdGFydCc7CgkJdGVtcGxhdGUuZGlzdFggPSBkaXN0WDsKCQl0ZW1wbGF0ZS5kaXN0WSA9IGRpc3RZOwoJCXRlbXBsYXRlLmRlbHRhWCA9IGRpc3RYOwoJCXRlbXBsYXRlLmRlbHRhWSA9IGRpc3RZOwoJCXRlbXBsYXRlLnBhZ2VYID0gdG91Y2gucGFnZVg7CgkJdGVtcGxhdGUucGFnZVkgPSB0b3VjaC5wYWdlWTsKCQl0ZW1wbGF0ZS52ZWxvY2l0eVggPSBkaXN0WCAvIHRpbWU7CgkJdGVtcGxhdGUudmVsb2NpdHlZID0gZGlzdFkgLyB0aW1lOwoJCXRlbXBsYXRlLnRhcmdldFRvdWNoZXMgPSB0b3VjaGVzOwoJCXRlbXBsYXRlLmZpbmdlciA9IHRvdWNoZXMgPwoJCQl0b3VjaGVzLmxlbmd0aCA6CgkJCTEgOwoKCQkvLyBUaGUgX2hhbmRsZWQgbWV0aG9kIGlzIGZpcmVkIHRvIHRlbGwgdGhlIGRlZmF1bHQgbW92ZXN0YXJ0CgkJLy8gaGFuZGxlciB0aGF0IG9uZSBvZiB0aGUgbW92ZSBldmVudHMgaXMgYm91bmQuCgkJdGVtcGxhdGUuX2hhbmRsZWQgPSBoYW5kbGVkOwoJCQkKCQkvLyBQYXNzIHRoZSB0b3VjaG1vdmUgZXZlbnQgc28gaXQgY2FuIGJlIHByZXZlbnRlZCBpZiBvciB3aGVuCgkJLy8gbW92ZXN0YXJ0IGlzIGhhbmRsZWQuCgkJdGVtcGxhdGUuX3ByZXZlbnRUb3VjaG1vdmVEZWZhdWx0ID0gZnVuY3Rpb24oKSB7CgkJCWUucHJldmVudERlZmF1bHQoKTsKCQl9OwoKCQkvLyBUcmlnZ2VyIHRoZSBtb3Zlc3RhcnQgZXZlbnQuCgkJdHJpZ2dlcih0ZW1wbGF0ZS50YXJnZXQsIHRlbXBsYXRlKTsKCgkJLy8gVW5iaW5kIGhhbmRsZXJzIHRoYXQgdHJhY2tlZCB0aGUgdG91Y2ggb3IgbW91c2UgdXAgdGlsbCBub3cuCgkJZm4odGVtcGxhdGUuaWRlbnRpZmllcik7Cgl9CgoKCS8vIEhhbmRsZXJzIHRoYXQgY29udHJvbCB3aGF0IGhhcHBlbnMgZm9sbG93aW5nIGEgbW92ZXN0YXJ0CgoJZnVuY3Rpb24gYWN0aXZlTW91c2Vtb3ZlKGUpIHsKCQl2YXIgZXZlbnQgPSBlLmRhdGEuZXZlbnQsCgkJICAgIHRpbWVyID0gZS5kYXRhLnRpbWVyOwoKCQl1cGRhdGVFdmVudChldmVudCwgZSwgZS50aW1lU3RhbXAsIHRpbWVyKTsKCX0KCglmdW5jdGlvbiBhY3RpdmVNb3VzZWVuZChlKSB7CgkJdmFyIGV2ZW50ID0gZS5kYXRhLmV2ZW50LAoJCSAgICB0aW1lciA9IGUuZGF0YS50aW1lcjsKCQkKCQlyZW1vdmVBY3RpdmVNb3VzZSgpOwoKCQllbmRFdmVudChldmVudCwgdGltZXIsIGZ1bmN0aW9uKCkgewoJCQkvLyBVbmJpbmQgdGhlIGNsaWNrIHN1cHByZXNzb3IsIHdhaXRpbmcgdW50aWwgYWZ0ZXIgbW91c2V1cAoJCQkvLyBoYXMgYmVlbiBoYW5kbGVkLgoJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgkJCQlyZW1vdmUoZXZlbnQudGFyZ2V0LCAnY2xpY2snLCByZXR1cm5GYWxzZSk7CgkJCX0sIDApOwoJCX0pOwoJfQoKCWZ1bmN0aW9uIHJlbW92ZUFjdGl2ZU1vdXNlKGV2ZW50KSB7CgkJcmVtb3ZlKGRvY3VtZW50LCBtb3VzZWV2ZW50cy5tb3ZlLCBhY3RpdmVNb3VzZW1vdmUpOwoJCXJlbW92ZShkb2N1bWVudCwgbW91c2VldmVudHMuZW5kLCBhY3RpdmVNb3VzZWVuZCk7Cgl9CgoJZnVuY3Rpb24gYWN0aXZlVG91Y2htb3ZlKGUpIHsKCQl2YXIgZXZlbnQgPSBlLmRhdGEuZXZlbnQsCgkJICAgIHRpbWVyID0gZS5kYXRhLnRpbWVyLAoJCSAgICB0b3VjaCA9IGNoYW5nZWRUb3VjaChlLCBldmVudCk7CgoJCWlmICghdG91Y2gpIHsgcmV0dXJuOyB9CgoJCS8vIFN0b3AgdGhlIGludGVyZmFjZSBmcm9tIGdlc3R1cmluZwoJCWUucHJldmVudERlZmF1bHQoKTsKCgkJZXZlbnQudGFyZ2V0VG91Y2hlcyA9IGUudGFyZ2V0VG91Y2hlczsKCQl1cGRhdGVFdmVudChldmVudCwgdG91Y2gsIGUudGltZVN0YW1wLCB0aW1lcik7Cgl9CgoJZnVuY3Rpb24gYWN0aXZlVG91Y2hlbmQoZSkgewoJCXZhciBldmVudCA9IGUuZGF0YS5ldmVudCwKCQkgICAgdGltZXIgPSBlLmRhdGEudGltZXIsCgkJICAgIHRvdWNoID0gaWRlbnRpZmllZFRvdWNoKGUuY2hhbmdlZFRvdWNoZXMsIGV2ZW50LmlkZW50aWZpZXIpOwoKCQkvLyBUaGlzIGlzbid0IHRoZSB0b3VjaCB5b3UncmUgbG9va2luZyBmb3IuCgkJaWYgKCF0b3VjaCkgeyByZXR1cm47IH0KCgkJcmVtb3ZlQWN0aXZlVG91Y2goZXZlbnQpOwoJCWVuZEV2ZW50KGV2ZW50LCB0aW1lcik7Cgl9CgoJZnVuY3Rpb24gcmVtb3ZlQWN0aXZlVG91Y2goZXZlbnQpIHsKCQlyZW1vdmUoZG9jdW1lbnQsICcuJyArIGV2ZW50LmlkZW50aWZpZXIsIGFjdGl2ZVRvdWNobW92ZSk7CgkJcmVtb3ZlKGRvY3VtZW50LCAnLicgKyBldmVudC5pZGVudGlmaWVyLCBhY3RpdmVUb3VjaGVuZCk7Cgl9CgoKCS8vIExvZ2ljIGZvciB0cmlnZ2VyaW5nIG1vdmUgYW5kIG1vdmVlbmQgZXZlbnRzCgoJZnVuY3Rpb24gdXBkYXRlRXZlbnQoZXZlbnQsIHRvdWNoLCB0aW1lU3RhbXAsIHRpbWVyKSB7CgkJdmFyIHRpbWUgPSB0aW1lU3RhbXAgLSBldmVudC50aW1lU3RhbXA7CgoJCWV2ZW50LnR5cGUgPSAnbW92ZSc7CgkJZXZlbnQuZGlzdFggPSAgdG91Y2gucGFnZVggLSBldmVudC5zdGFydFg7CgkJZXZlbnQuZGlzdFkgPSAgdG91Y2gucGFnZVkgLSBldmVudC5zdGFydFk7CgkJZXZlbnQuZGVsdGFYID0gdG91Y2gucGFnZVggLSBldmVudC5wYWdlWDsKCQlldmVudC5kZWx0YVkgPSB0b3VjaC5wYWdlWSAtIGV2ZW50LnBhZ2VZOwoJCQoJCS8vIEF2ZXJhZ2UgdGhlIHZlbG9jaXR5IG9mIHRoZSBsYXN0IGZldyBldmVudHMgdXNpbmcgYSBkZWNheQoJCS8vIGN1cnZlIHRvIGV2ZW4gb3V0IHNwdXJpb3VzIGp1bXBzIGluIHZhbHVlcy4KCQlldmVudC52ZWxvY2l0eVggPSAwLjMgKiBldmVudC52ZWxvY2l0eVggKyAwLjcgKiBldmVudC5kZWx0YVggLyB0aW1lOwoJCWV2ZW50LnZlbG9jaXR5WSA9IDAuMyAqIGV2ZW50LnZlbG9jaXR5WSArIDAuNyAqIGV2ZW50LmRlbHRhWSAvIHRpbWU7CgkJZXZlbnQucGFnZVggPSAgdG91Y2gucGFnZVg7CgkJZXZlbnQucGFnZVkgPSAgdG91Y2gucGFnZVk7CgoJCXRpbWVyLmtpY2soKTsKCX0KCglmdW5jdGlvbiBlbmRFdmVudChldmVudCwgdGltZXIsIGZuKSB7CgkJdGltZXIuZW5kKGZ1bmN0aW9uKCl7CgkJCWV2ZW50LnR5cGUgPSAnbW92ZWVuZCc7CgoJCQl0cmlnZ2VyKGV2ZW50LnRhcmdldCwgZXZlbnQpOwoJCQkKCQkJcmV0dXJuIGZuICYmIGZuKCk7CgkJfSk7Cgl9CgoKCS8vIGpRdWVyeSBzcGVjaWFsIGV2ZW50IGRlZmluaXRpb24KCglmdW5jdGlvbiBzZXR1cChkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSkgewoJCS8vIFN0b3AgdGhlIG5vZGUgZnJvbSBiZWluZyBkcmFnZ2VkCgkJLy9hZGQodGhpcywgJ2RyYWdzdGFydC5tb3ZlIGRyYWcubW92ZScsIHByZXZlbnREZWZhdWx0KTsKCQkKCQkvLyBQcmV2ZW50IHRleHQgc2VsZWN0aW9uIGFuZCB0b3VjaCBpbnRlcmZhY2Ugc2Nyb2xsaW5nCgkJLy9hZGQodGhpcywgJ21vdXNlZG93bi5tb3ZlJywgcHJldmVudElnbm9yZVRhZ3MpOwoJCQoJCS8vIFRlbGwgbW92ZXN0YXJ0IGRlZmF1bHQgaGFuZGxlciB0aGF0IHdlJ3ZlIGhhbmRsZWQgdGhpcwoJCWFkZCh0aGlzLCAnbW92ZXN0YXJ0Lm1vdmUnLCBmbGFnQXNIYW5kbGVkKTsKCgkJLy8gRG9uJ3QgYmluZCB0byB0aGUgRE9NLiBGb3Igc3BlZWQuCgkJcmV0dXJuIHRydWU7Cgl9CgkKCWZ1bmN0aW9uIHRlYXJkb3duKG5hbWVzcGFjZXMpIHsKCQlyZW1vdmUodGhpcywgJ2RyYWdzdGFydCBkcmFnJywgcHJldmVudERlZmF1bHQpOwoJCXJlbW92ZSh0aGlzLCAnbW91c2Vkb3duIHRvdWNoc3RhcnQnLCBwcmV2ZW50SWdub3JlVGFncyk7CgkJcmVtb3ZlKHRoaXMsICdtb3Zlc3RhcnQnLCBmbGFnQXNIYW5kbGVkKTsKCQkKCQkvLyBEb24ndCBiaW5kIHRvIHRoZSBET00uIEZvciBzcGVlZC4KCQlyZXR1cm4gdHJ1ZTsKCX0KCQoJZnVuY3Rpb24gYWRkTWV0aG9kKGhhbmRsZU9iaikgewoJCS8vIFdlJ3JlIG5vdCBpbnRlcmVzdGVkIGluIHByZXZlbnRpbmcgZGVmYXVsdHMgZm9yIGhhbmRsZXJzIHRoYXQKCQkvLyBjb21lIGZyb20gaW50ZXJuYWwgbW92ZSBvciBtb3ZlZW5kIGJpbmRpbmdzCgkJaWYgKGhhbmRsZU9iai5uYW1lc3BhY2UgPT09ICJtb3ZlIiB8fCBoYW5kbGVPYmoubmFtZXNwYWNlID09PSAibW92ZWVuZCIpIHsKCQkJcmV0dXJuOwoJCX0KCQkKCQkvLyBTdG9wIHRoZSBub2RlIGZyb20gYmVpbmcgZHJhZ2dlZAoJCWFkZCh0aGlzLCAnZHJhZ3N0YXJ0LicgKyBoYW5kbGVPYmouZ3VpZCArICcgZHJhZy4nICsgaGFuZGxlT2JqLmd1aWQsIHByZXZlbnREZWZhdWx0LCB1bmRlZmluZWQsIGhhbmRsZU9iai5zZWxlY3Rvcik7CgkJCgkJLy8gUHJldmVudCB0ZXh0IHNlbGVjdGlvbiBhbmQgdG91Y2ggaW50ZXJmYWNlIHNjcm9sbGluZwoJCWFkZCh0aGlzLCAnbW91c2Vkb3duLicgKyBoYW5kbGVPYmouZ3VpZCwgcHJldmVudElnbm9yZVRhZ3MsIHVuZGVmaW5lZCwgaGFuZGxlT2JqLnNlbGVjdG9yKTsKCX0KCQoJZnVuY3Rpb24gcmVtb3ZlTWV0aG9kKGhhbmRsZU9iaikgewoJCWlmIChoYW5kbGVPYmoubmFtZXNwYWNlID09PSAibW92ZSIgfHwgaGFuZGxlT2JqLm5hbWVzcGFjZSA9PT0gIm1vdmVlbmQiKSB7CgkJCXJldHVybjsKCQl9CgkJCgkJcmVtb3ZlKHRoaXMsICdkcmFnc3RhcnQuJyArIGhhbmRsZU9iai5ndWlkICsgJyBkcmFnLicgKyBoYW5kbGVPYmouZ3VpZCk7CgkJcmVtb3ZlKHRoaXMsICdtb3VzZWRvd24uJyArIGhhbmRsZU9iai5ndWlkKTsKCX0KCQoJalF1ZXJ5LmV2ZW50LnNwZWNpYWwubW92ZXN0YXJ0ID0gewoJCXNldHVwOiBzZXR1cCwKCQl0ZWFyZG93bjogdGVhcmRvd24sCgkJYWRkOiBhZGRNZXRob2QsCgkJcmVtb3ZlOiByZW1vdmVNZXRob2QsCgoJCV9kZWZhdWx0OiBmdW5jdGlvbihlKSB7CgkJCXZhciB0ZW1wbGF0ZSwgZGF0YTsKCQkJCgkJCS8vIElmIG5vIG1vdmUgZXZlbnRzIHdlcmUgYm91bmQgdG8gYW55IGFuY2VzdG9ycyBvZiB0aGlzCgkJCS8vIHRhcmdldCwgaGlnaCB0YWlsIGl0IG91dCBvZiBoZXJlLgoJCQlpZiAoIWUuX2hhbmRsZWQoKSkgeyByZXR1cm47IH0KCgkJCXRlbXBsYXRlID0gewoJCQkJdGFyZ2V0OiBlLnRhcmdldCwKCQkJCXN0YXJ0WDogZS5zdGFydFgsCgkJCQlzdGFydFk6IGUuc3RhcnRZLAoJCQkJcGFnZVg6IGUucGFnZVgsCgkJCQlwYWdlWTogZS5wYWdlWSwKCQkJCWRpc3RYOiBlLmRpc3RYLAoJCQkJZGlzdFk6IGUuZGlzdFksCgkJCQlkZWx0YVg6IGUuZGVsdGFYLAoJCQkJZGVsdGFZOiBlLmRlbHRhWSwKCQkJCXZlbG9jaXR5WDogZS52ZWxvY2l0eVgsCgkJCQl2ZWxvY2l0eVk6IGUudmVsb2NpdHlZLAoJCQkJdGltZVN0YW1wOiBlLnRpbWVTdGFtcCwKCQkJCWlkZW50aWZpZXI6IGUuaWRlbnRpZmllciwKCQkJCXRhcmdldFRvdWNoZXM6IGUudGFyZ2V0VG91Y2hlcywKCQkJCWZpbmdlcjogZS5maW5nZXIKCQkJfTsKCgkJCWRhdGEgPSB7CgkJCQlldmVudDogdGVtcGxhdGUsCgkJCQl0aW1lcjogbmV3IFRpbWVyKGZ1bmN0aW9uKHRpbWUpewoJCQkJCXRyaWdnZXIoZS50YXJnZXQsIHRlbXBsYXRlKTsKCQkJCX0pCgkJCX07CgkJCQoJCQlpZiAoZS5pZGVudGlmaWVyID09PSB1bmRlZmluZWQpIHsKCQkJCS8vIFdlJ3JlIGRlYWxpbmcgd2l0aCBhIG1vdXNlCgkJCQkvLyBTdG9wIGNsaWNrcyBmcm9tIHByb3BhZ2F0aW5nIGR1cmluZyBhIG1vdmUKCQkJCWFkZChlLnRhcmdldCwgJ2NsaWNrJywgcmV0dXJuRmFsc2UpOwoJCQkJYWRkKGRvY3VtZW50LCBtb3VzZWV2ZW50cy5tb3ZlLCBhY3RpdmVNb3VzZW1vdmUsIGRhdGEpOwoJCQkJYWRkKGRvY3VtZW50LCBtb3VzZWV2ZW50cy5lbmQsIGFjdGl2ZU1vdXNlZW5kLCBkYXRhKTsKCQkJfQoJCQllbHNlIHsKCQkJCS8vIFdlJ3JlIGRlYWxpbmcgd2l0aCBhIHRvdWNoLiBTdG9wIHRvdWNobW92ZSBkb2luZwoJCQkJLy8gYW55dGhpbmcgZGVmYXVsdHkuCgkJCQllLl9wcmV2ZW50VG91Y2htb3ZlRGVmYXVsdCgpOwoJCQkJYWRkKGRvY3VtZW50LCB0b3VjaGV2ZW50cy5tb3ZlICsgJy4nICsgZS5pZGVudGlmaWVyLCBhY3RpdmVUb3VjaG1vdmUsIGRhdGEpOwoJCQkJYWRkKGRvY3VtZW50LCB0b3VjaGV2ZW50cy5lbmQgKyAnLicgKyBlLmlkZW50aWZpZXIsIGFjdGl2ZVRvdWNoZW5kLCBkYXRhKTsKCQkJfQoJCX0KCX07CgoJalF1ZXJ5LmV2ZW50LnNwZWNpYWwubW92ZSA9IHsKCQlzZXR1cDogZnVuY3Rpb24oKSB7CgkJCS8vIEJpbmQgYSBub29wIHRvIG1vdmVzdGFydC4gV2h5PyBJdCdzIHRoZSBtb3Zlc3RhcnQKCQkJLy8gc2V0dXAgdGhhdCBkZWNpZGVzIHdoZXRoZXIgb3RoZXIgbW92ZSBldmVudHMgYXJlIGZpcmVkLgoJCQlhZGQodGhpcywgJ21vdmVzdGFydC5tb3ZlJywgalF1ZXJ5Lm5vb3ApOwoJCX0sCgkJCgkJdGVhcmRvd246IGZ1bmN0aW9uKCkgewoJCQlyZW1vdmUodGhpcywgJ21vdmVzdGFydC5tb3ZlJywgalF1ZXJ5Lm5vb3ApOwoJCX0KCX07CgkKCWpRdWVyeS5ldmVudC5zcGVjaWFsLm1vdmVlbmQgPSB7CgkJc2V0dXA6IGZ1bmN0aW9uKCkgewoJCQkvLyBCaW5kIGEgbm9vcCB0byBtb3Zlc3RhcnQuIFdoeT8gSXQncyB0aGUgbW92ZXN0YXJ0CgkJCS8vIHNldHVwIHRoYXQgZGVjaWRlcyB3aGV0aGVyIG90aGVyIG1vdmUgZXZlbnRzIGFyZSBmaXJlZC4KCQkJYWRkKHRoaXMsICdtb3Zlc3RhcnQubW92ZWVuZCcsIGpRdWVyeS5ub29wKTsKCQl9LAoJCQoJCXRlYXJkb3duOiBmdW5jdGlvbigpIHsKCQkJcmVtb3ZlKHRoaXMsICdtb3Zlc3RhcnQubW92ZWVuZCcsIGpRdWVyeS5ub29wKTsKCQl9Cgl9OwoKCWFkZChkb2N1bWVudCwgJ21vdXNlZG93bi5tb3ZlJywgbW91c2Vkb3duKTsKCWFkZChkb2N1bWVudCwgJ3RvdWNoc3RhcnQubW92ZScsIHRvdWNoc3RhcnQpOwoKCS8vIE1ha2UgalF1ZXJ5IGNvcHkgdG91Y2ggZXZlbnQgcHJvcGVydGllcyBvdmVyIHRvIHRoZSBqUXVlcnkgZXZlbnQKCS8vIG9iamVjdCwgaWYgdGhleSBhcmUgbm90IGFscmVhZHkgbGlzdGVkLiBCdXQgb25seSBkbyB0aGUgb25lcyB3ZQoJLy8gcmVhbGx5IG5lZWQuIElFNy84IGRvIG5vdCBoYXZlIEFycmF5I2luZGV4T2YoKSwgYnV0IG5vciBkbyB0aGV5CgkvLyBoYXZlIHRvdWNoIGV2ZW50cywgc28gbGV0J3MgYXNzdW1lIHdlIGNhbiBpZ25vcmUgdGhlbS4KCWlmICh0eXBlb2YgQXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHsKCQkoZnVuY3Rpb24oalF1ZXJ5LCB1bmRlZmluZWQpewoJCQl2YXIgcHJvcHMgPSBbImNoYW5nZWRUb3VjaGVzIiwgInRhcmdldFRvdWNoZXMiXSwKCQkJICAgIGwgPSBwcm9wcy5sZW5ndGg7CgkJCQoJCQl3aGlsZSAobC0tKSB7CgkJCQlpZiAoalF1ZXJ5LmV2ZW50LnByb3BzLmluZGV4T2YocHJvcHNbbF0pID09PSAtMSkgewoJCQkJCWpRdWVyeS5ldmVudC5wcm9wcy5wdXNoKHByb3BzW2xdKTsKCQkJCX0KCQkJfQoJCX0pKGpRdWVyeSk7Cgl9Owp9KTsK]]></data>
	</file>
	<file>
	  <filename>/assets/javascripts/jquery.event.swipe.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8galF1ZXJ5LmV2ZW50LnN3aXBlCi8vIDAuNQovLyBTdGVwaGVuIEJhbmQKCi8vIERlcGVuZGVuY2llcwovLyBqUXVlcnkuZXZlbnQubW92ZSAxLjIKCi8vIE9uZSBvZiBzd2lwZWxlZnQsIHN3aXBlcmlnaHQsIHN3aXBldXAgb3Igc3dpcGVkb3duIGlzIHRyaWdnZXJlZCBvbgovLyBtb3ZlZW5kLCB3aGVuIHRoZSBtb3ZlIGhhcyBjb3ZlcmVkIGEgdGhyZXNob2xkIHJhdGlvIG9mIHRoZSBkaW1lbnNpb24KLy8gb2YgdGhlIHRhcmdldCBub2RlLCBvciBoYXMgZ29uZSByZWFsbHkgZmFzdC4gVGhyZXNob2xkIGFuZCB2ZWxvY2l0eQovLyBzZW5zaXRpdml0eSBjaGFuZ2VkIHdpdGg6Ci8vCi8vIGpRdWVyeS5ldmVudC5zcGVjaWFsLnN3aXBlLnNldHRpbmdzLnRocmVzaG9sZAovLyBqUXVlcnkuZXZlbnQuc3BlY2lhbC5zd2lwZS5zZXR0aW5ncy5zZW5zaXRpdml0eQoKKGZ1bmN0aW9uIChtb2R1bGUpIHsKCWlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKCQkvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuCgkJZGVmaW5lKFsnanF1ZXJ5J10sIG1vZHVsZSk7Cgl9IGVsc2UgewoJCS8vIEJyb3dzZXIgZ2xvYmFscwoJCW1vZHVsZShqUXVlcnkpOwoJfQp9KShmdW5jdGlvbihqUXVlcnksIHVuZGVmaW5lZCl7Cgl2YXIgYWRkID0galF1ZXJ5LmV2ZW50LmFkZCwKCSAgIAoJICAgIHJlbW92ZSA9IGpRdWVyeS5ldmVudC5yZW1vdmUsCgoJICAgIC8vIEp1c3Qgc3VnYXIsIHNvIHdlIGNhbiBoYXZlIGFyZ3VtZW50cyBpbiB0aGUgc2FtZSBvcmRlciBhcwoJICAgIC8vIGFkZCBhbmQgcmVtb3ZlLgoJICAgIHRyaWdnZXIgPSBmdW5jdGlvbihub2RlLCB0eXBlLCBkYXRhKSB7CgkgICAgCWpRdWVyeS5ldmVudC50cmlnZ2VyKHR5cGUsIGRhdGEsIG5vZGUpOwoJICAgIH0sCgoJICAgIHNldHRpbmdzID0gewoJICAgIAkvLyBSYXRpbyBvZiBkaXN0YW5jZSBvdmVyIHRhcmdldCBmaW5nZXIgbXVzdCB0cmF2ZWwgdG8gYmUKCSAgICAJLy8gY29uc2lkZXJlZCBhIHN3aXBlLgoJICAgIAl0aHJlc2hvbGQ6IDAuNCwKCSAgICAJLy8gRmFzdGVyIGZpbmdlcnMgY2FuIHRyYXZlbCBzaG9ydGVyIGRpc3RhbmNlcyB0byBiZSBjb25zaWRlcmVkCgkgICAgCS8vIHN3aXBlcy4gJ3NlbnNpdGl2aXR5JyBjb250cm9scyBob3cgbXVjaC4gQmlnZ2VyIGlzIHNob3J0ZXIuCgkgICAgCXNlbnNpdGl2aXR5OiA2CgkgICAgfTsKCglmdW5jdGlvbiBtb3ZlZW5kKGUpIHsKCQl2YXIgdywgaCwgZXZlbnQ7CgoJCXcgPSBlLnRhcmdldC5vZmZzZXRXaWR0aDsKCQloID0gZS50YXJnZXQub2Zmc2V0SGVpZ2h0OwoKCQkvLyBDb3B5IG92ZXIgc29tZSB1c2VmdWwgcHJvcGVydGllcyBmcm9tIHRoZSBtb3ZlIGV2ZW50CgkJZXZlbnQgPSB7CgkJCWRpc3RYOiBlLmRpc3RYLAoJCQlkaXN0WTogZS5kaXN0WSwKCQkJdmVsb2NpdHlYOiBlLnZlbG9jaXR5WCwKCQkJdmVsb2NpdHlZOiBlLnZlbG9jaXR5WSwKCQkJZmluZ2VyOiBlLmZpbmdlcgoJCX07CgoJCS8vIEZpbmQgb3V0IHdoaWNoIG9mIHRoZSBmb3VyIGRpcmVjdGlvbnMgd2FzIHN3aXBlZAoJCWlmIChlLmRpc3RYID4gZS5kaXN0WSkgewoJCQlpZiAoZS5kaXN0WCA+IC1lLmRpc3RZKSB7CgkJCQlpZiAoZS5kaXN0WC93ID4gc2V0dGluZ3MudGhyZXNob2xkIHx8IGUudmVsb2NpdHlYICogZS5kaXN0WC93ICogc2V0dGluZ3Muc2Vuc2l0aXZpdHkgPiAxKSB7CgkJCQkJZXZlbnQudHlwZSA9ICdzd2lwZXJpZ2h0JzsKCQkJCQl0cmlnZ2VyKGUuY3VycmVudFRhcmdldCwgZXZlbnQpOwoJCQkJfQoJCQl9CgkJCWVsc2UgewoJCQkJaWYgKC1lLmRpc3RZL2ggPiBzZXR0aW5ncy50aHJlc2hvbGQgfHwgZS52ZWxvY2l0eVkgKiBlLmRpc3RZL3cgKiBzZXR0aW5ncy5zZW5zaXRpdml0eSA+IDEpIHsKCQkJCQlldmVudC50eXBlID0gJ3N3aXBldXAnOwoJCQkJCXRyaWdnZXIoZS5jdXJyZW50VGFyZ2V0LCBldmVudCk7CgkJCQl9CgkJCX0KCQl9CgkJZWxzZSB7CgkJCWlmIChlLmRpc3RYID4gLWUuZGlzdFkpIHsKCQkJCWlmIChlLmRpc3RZL2ggPiBzZXR0aW5ncy50aHJlc2hvbGQgfHwgZS52ZWxvY2l0eVkgKiBlLmRpc3RZL3cgKiBzZXR0aW5ncy5zZW5zaXRpdml0eSA+IDEpIHsKCQkJCQlldmVudC50eXBlID0gJ3N3aXBlZG93bic7CgkJCQkJdHJpZ2dlcihlLmN1cnJlbnRUYXJnZXQsIGV2ZW50KTsKCQkJCX0KCQkJfQoJCQllbHNlIHsKCQkJCWlmICgtZS5kaXN0WC93ID4gc2V0dGluZ3MudGhyZXNob2xkIHx8IGUudmVsb2NpdHlYICogZS5kaXN0WC93ICogc2V0dGluZ3Muc2Vuc2l0aXZpdHkgPiAxKSB7CgkJCQkJZXZlbnQudHlwZSA9ICdzd2lwZWxlZnQnOwoJCQkJCXRyaWdnZXIoZS5jdXJyZW50VGFyZ2V0LCBldmVudCk7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJZnVuY3Rpb24gZ2V0RGF0YShub2RlKSB7CgkJdmFyIGRhdGEgPSBqUXVlcnkuZGF0YShub2RlLCAnZXZlbnRfc3dpcGUnKTsKCQkKCQlpZiAoIWRhdGEpIHsKCQkJZGF0YSA9IHsgY291bnQ6IDAgfTsKCQkJalF1ZXJ5LmRhdGEobm9kZSwgJ2V2ZW50X3N3aXBlJywgZGF0YSk7CgkJfQoJCQoJCXJldHVybiBkYXRhOwoJfQoKCWpRdWVyeS5ldmVudC5zcGVjaWFsLnN3aXBlID0KCWpRdWVyeS5ldmVudC5zcGVjaWFsLnN3aXBlbGVmdCA9CglqUXVlcnkuZXZlbnQuc3BlY2lhbC5zd2lwZXJpZ2h0ID0KCWpRdWVyeS5ldmVudC5zcGVjaWFsLnN3aXBldXAgPQoJalF1ZXJ5LmV2ZW50LnNwZWNpYWwuc3dpcGVkb3duID0gewoJCXNldHVwOiBmdW5jdGlvbiggZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSB7CgkJCXZhciBkYXRhID0gZ2V0RGF0YSh0aGlzKTsKCgkJCS8vIElmIGFub3RoZXIgc3dpcGUgZXZlbnQgaXMgYWxyZWFkeSBzZXR1cCwgZG9uJ3Qgc2V0dXAgYWdhaW4uCgkJCWlmIChkYXRhLmNvdW50KysgPiAwKSB7IHJldHVybjsgfQoKCQkJYWRkKHRoaXMsICdtb3ZlZW5kJywgbW92ZWVuZCk7CgoJCQlyZXR1cm4gdHJ1ZTsKCQl9LAoKCQl0ZWFyZG93bjogZnVuY3Rpb24oKSB7CgkJCXZhciBkYXRhID0gZ2V0RGF0YSh0aGlzKTsKCgkJCS8vIElmIGFub3RoZXIgc3dpcGUgZXZlbnQgaXMgc3RpbGwgc2V0dXAsIGRvbid0IHRlYXJkb3duLgoJCQlpZiAoLS1kYXRhLmNvdW50ID4gMCkgeyByZXR1cm47IH0KCgkJCXJlbW92ZSh0aGlzLCAnbW92ZWVuZCcsIG1vdmVlbmQpOwoKCQkJcmV0dXJuIHRydWU7CgkJfSwKCgkJc2V0dGluZ3M6IHNldHRpbmdzCgl9Owp9KTsK]]></data>
	</file>
	<file>
	  <filename>/assets/javascripts/jquery.foundation.accordion.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[OyhmdW5jdGlvbiAoJCwgd2luZG93LCB1bmRlZmluZWQpewogICd1c2Ugc3RyaWN0JzsKCiAgJC5mbi5mb3VuZGF0aW9uQWNjb3JkaW9uID0gZnVuY3Rpb24gKG9wdGlvbnMpIHsKCiAgICAvLyBEUlkgdXAgdGhlIGxvZ2ljIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBldmVudCBsb2dpYyBzaG91bGQgZXhlY3V0ZS4KICAgIHZhciBoYXNIb3ZlciA9IGZ1bmN0aW9uKGFjY29yZGlvbikgewogICAgICByZXR1cm4gYWNjb3JkaW9uLmhhc0NsYXNzKCdob3ZlcicpICYmICFNb2Rlcm5penIudG91Y2gKICAgIH07CgogICAgJChkb2N1bWVudCkub24oJ21vdXNlZW50ZXInLCAnLmFjY29yZGlvbiBsaScsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgcCA9ICQodGhpcykucGFyZW50KCk7CgogICAgICAgIGlmIChoYXNIb3ZlcihwKSkgewogICAgICAgICAgdmFyIGZseW91dCA9ICQodGhpcykuY2hpbGRyZW4oJy5jb250ZW50JykuZmlyc3QoKTsKCiAgICAgICAgICAkKCcuY29udGVudCcsIHApLm5vdChmbHlvdXQpLmhpZGUoKS5wYXJlbnQoJ2xpJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwogICAgICAgICAgZmx5b3V0LnNob3coMCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBmbHlvdXQucGFyZW50KCdsaScpLmFkZENsYXNzKCdhY3RpdmUnKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgKTsKCiAgICAkKGRvY3VtZW50KS5vbignY2xpY2suZm5kdG4nLCAnLmFjY29yZGlvbiBsaSAudGl0bGUnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGxpID0gJCh0aGlzKS5jbG9zZXN0KCdsaScpLAogICAgICAgICAgICBwID0gbGkucGFyZW50KCk7CgogICAgICAgIGlmKCFoYXNIb3ZlcihwKSkgewogICAgICAgICAgdmFyIGZseW91dCA9IGxpLmNoaWxkcmVuKCcuY29udGVudCcpLmZpcnN0KCk7CgogICAgICAgICAgaWYgKGxpLmhhc0NsYXNzKCdhY3RpdmUnKSkgewogICAgICAgICAgICBwLmZpbmQoJ2xpJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpLmVuZCgpLmZpbmQoJy5jb250ZW50JykuaGlkZSgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJCgnLmNvbnRlbnQnLCBwKS5ub3QoZmx5b3V0KS5oaWRlKCkucGFyZW50KCdsaScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsKICAgICAgICAgICAgZmx5b3V0LnNob3coMCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIGZseW91dC5wYXJlbnQoJ2xpJykuYWRkQ2xhc3MoJ2FjdGl2ZScpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICApOwoKICB9OwoKfSkoIGpRdWVyeSwgdGhpcyApOwoK]]></data>
	</file>
	<file>
	  <filename>/assets/javascripts/jquery.foundation.alerts.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[OyhmdW5jdGlvbiAoJCwgd2luZG93LCB1bmRlZmluZWQpIHsKICAndXNlIHN0cmljdCc7CiAgCiAgJC5mbi5mb3VuZGF0aW9uQWxlcnRzID0gZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgIHZhciBzZXR0aW5ncyA9ICQuZXh0ZW5kKHsKICAgICAgY2FsbGJhY2s6ICQubm9vcAogICAgfSwgb3B0aW9ucyk7CiAgICAKICAgICQoZG9jdW1lbnQpLm9uKCJjbGljayIsICIuYWxlcnQtYm94IGEuY2xvc2UiLCBmdW5jdGlvbiAoZSkgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICQodGhpcykuY2xvc2VzdCgiLmFsZXJ0LWJveCIpLmZhZGVPdXQoZnVuY3Rpb24gKCkgewogICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgLy8gRG8gc29tZXRoaW5nIGVsc2UgYWZ0ZXIgdGhlIGFsZXJ0IGNsb3NlcwogICAgICAgIHNldHRpbmdzLmNhbGxiYWNrKCk7CiAgICAgIH0pOwogICAgfSk7CiAgICAKICB9OwoKfSkoalF1ZXJ5LCB0aGlzKTsK]]></data>
	</file>
	<file>
	  <filename>/assets/javascripts/jquery.foundation.buttons.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[OyhmdW5jdGlvbiAoJCwgd2luZG93LCB1bmRlZmluZWQpIHsKICAndXNlIHN0cmljdCc7CgogICQuZm4uZm91bmRhdGlvbkJ1dHRvbnMgPSBmdW5jdGlvbiAob3B0aW9ucykgewogICAgdmFyICRkb2MgPSAkKGRvY3VtZW50KSwKICAgICAgY29uZmlnID0gJC5leHRlbmQoewogICAgICAgIGRyb3Bkb3duQXNUb2dnbGU6ZmFsc2UsCiAgICAgICAgYWN0aXZlQ2xhc3M6J2FjdGl2ZScKICAgICAgfSwgb3B0aW9ucyksCgogICAgLy8gY2xvc2UgYWxsIGRyb3Bkb3ducyBleGNlcHQgZm9yIHRoZSBkcm9wZG93biBwYXNzZWQKICAgICAgY2xvc2VEcm9wZG93bnMgPSBmdW5jdGlvbiAoZHJvcGRvd24pIHsKICAgICAgICAvLyBhbGVydChkcm9wZG93bi5odG1sKCkpOwogICAgICAgICQoJy5idXR0b24uZHJvcGRvd24nKS5maW5kKCd1bCcpLm5vdChkcm9wZG93bikucmVtb3ZlQ2xhc3MoJ3Nob3ctZHJvcGRvd24nKTsKICAgICAgfSwKICAgIC8vIHJlc2V0IGFsbCB0b2dnbGUgc3RhdGVzIGV4Y2VwdCBmb3IgdGhlIGJ1dHRvbiBwYXNzZWQKICAgICAgcmVzZXRUb2dnbGVzID0gZnVuY3Rpb24gKGJ1dHRvbikgewogICAgICAgIC8vIGFsZXJ0KGJ1dHRvbi5odG1sKCkpOwogICAgICAgIHZhciBidXR0b25zID0gJCgnLmJ1dHRvbi5kcm9wZG93bicpLm5vdChidXR0b24pOwogICAgICAgIGJ1dHRvbnMuYWRkKCQoJz4gc3Bhbi4nICsgY29uZmlnLmFjdGl2ZUNsYXNzLCBidXR0b25zKSkucmVtb3ZlQ2xhc3MoY29uZmlnLmFjdGl2ZUNsYXNzKTsKICAgICAgfTsKCiAgICAvLyBQcmV2ZW50IGV2ZW50IHByb3BhZ2F0aW9uIG9uIGRpc2FibGVkIGJ1dHRvbnMKICAgICRkb2Mub24oJ2NsaWNrLmZuZHRuJywgJy5idXR0b24uZGlzYWJsZWQnLCBmdW5jdGlvbiAoZSkgewogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICB9KTsKCiAgICAkKCcuYnV0dG9uLmRyb3Bkb3duID4gdWwnLCB0aGlzKS5hZGRDbGFzcygnbm8taG92ZXInKTsKCiAgICAvLyByZXNldCBvdGhlciBhY3RpdmUgc3RhdGVzCiAgICAkZG9jLm9uKCdjbGljay5mbmR0bicsICcuYnV0dG9uLmRyb3Bkb3duOm5vdCguc3BsaXQpLCAuYnV0dG9uLmRyb3Bkb3duLnNwbGl0IHNwYW4nLCBmdW5jdGlvbiAoZSkgewogICAgICB2YXIgJGVsID0gJCh0aGlzKSwKICAgICAgICBidXR0b24gPSAkZWwuY2xvc2VzdCgnLmJ1dHRvbi5kcm9wZG93bicpLAogICAgICAgIGRyb3Bkb3duID0gJCgnPiB1bCcsIGJ1dHRvbik7CgogICAgICAgIC8vIElmIHRoZSBjbGljayBpcyByZWdpc3RlcmVkIG9uIGFuIGFjdHVhbCBsaW5rIG9yIG9uIGJ1dHRvbiBlbGVtZW50IHRoZW4gZG8gbm90IHByZXZlbnREZWZhdWx0IHdoaWNoIHN0b3BzIHRoZSBicm93c2VyIGZyb20gZm9sbG93aW5nIHRoZSBsaW5rCiAgICAgICAgaWYgKFsiQSIsICJCVVRUT04iXS5pbmRleE9mKGUudGFyZ2V0Lm5vZGVOYW1lKSA9PSAtMSl7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgfQoKICAgICAgLy8gY2xvc2Ugb3RoZXIgZHJvcGRvd25zCiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgIGNsb3NlRHJvcGRvd25zKGNvbmZpZy5kcm9wZG93bkFzVG9nZ2xlID8gJycgOiBkcm9wZG93bik7CiAgICAgICAgZHJvcGRvd24udG9nZ2xlQ2xhc3MoJ3Nob3ctZHJvcGRvd24nKTsKCiAgICAgICAgaWYgKGNvbmZpZy5kcm9wZG93bkFzVG9nZ2xlKSB7CiAgICAgICAgICByZXNldFRvZ2dsZXMoYnV0dG9uKTsKICAgICAgICAgICRlbC50b2dnbGVDbGFzcyhjb25maWcuYWN0aXZlQ2xhc3MpOwogICAgICAgIH0KICAgICAgfSwgMCk7CiAgICB9KTsKCiAgICAvLyBjbG9zZSBhbGwgZHJvcGRvd25zIGFuZCBkZWFjdGl2YXRlIGFsbCBidXR0b25zCiAgICAkZG9jLm9uKCdjbGljay5mbmR0bicsICdib2R5LCBodG1sJywgZnVuY3Rpb24gKGUpIHsKICAgICAgaWYgKHVuZGVmaW5lZCA9PSBlLm9yaWdpbmFsRXZlbnQpIHsgcmV0dXJuOyB9CiAgICAgIC8vIGNoZWNrIG9yaWdpbmFsIHRhcmdldCBpbnN0ZWFkIG9mIHN0b3BwaW5nIGV2ZW50IHByb3BhZ2F0aW9uIHRvIHBsYXkgbmljZSB3aXRoIG90aGVyIGV2ZW50cwogICAgICBpZiAoISQoZS5vcmlnaW5hbEV2ZW50LnRhcmdldCkuaXMoJy5idXR0b24uZHJvcGRvd246bm90KC5zcGxpdCksIC5idXR0b24uZHJvcGRvd24uc3BsaXQgc3BhbicpKSB7CiAgICAgICAgY2xvc2VEcm9wZG93bnMoKTsKICAgICAgICBpZiAoY29uZmlnLmRyb3Bkb3duQXNUb2dnbGUpIHsKICAgICAgICAgIHJlc2V0VG9nZ2xlcygpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CgogICAgLy8gUG9zaXRpb25pbmcgdGhlIEZseW91dCBMaXN0CiAgICB2YXIgbm9ybWFsQnV0dG9uSGVpZ2h0ICA9ICQoJy5idXR0b24uZHJvcGRvd246bm90KC5sYXJnZSk6bm90KC5zbWFsbCk6bm90KC50aW55KTp2aXNpYmxlJywgdGhpcykub3V0ZXJIZWlnaHQoKSAtIDEsCiAgICAgICAgbGFyZ2VCdXR0b25IZWlnaHQgICA9ICQoJy5idXR0b24ubGFyZ2UuZHJvcGRvd246dmlzaWJsZScsIHRoaXMpLm91dGVySGVpZ2h0KCkgLSAxLAogICAgICAgIHNtYWxsQnV0dG9uSGVpZ2h0ICAgPSAkKCcuYnV0dG9uLnNtYWxsLmRyb3Bkb3duOnZpc2libGUnLCB0aGlzKS5vdXRlckhlaWdodCgpIC0gMSwKICAgICAgICB0aW55QnV0dG9uSGVpZ2h0ICAgID0gJCgnLmJ1dHRvbi50aW55LmRyb3Bkb3duOnZpc2libGUnLCB0aGlzKS5vdXRlckhlaWdodCgpIC0gMTsKCiAgICAkKCcuYnV0dG9uLmRyb3Bkb3duOm5vdCgubGFyZ2UpOm5vdCguc21hbGwpOm5vdCgudGlueSkgPiB1bCcsIHRoaXMpLmNzcygndG9wJywgbm9ybWFsQnV0dG9uSGVpZ2h0KTsKICAgICQoJy5idXR0b24uZHJvcGRvd24ubGFyZ2UgPiB1bCcsIHRoaXMpLmNzcygndG9wJywgbGFyZ2VCdXR0b25IZWlnaHQpOwogICAgJCgnLmJ1dHRvbi5kcm9wZG93bi5zbWFsbCA+IHVsJywgdGhpcykuY3NzKCd0b3AnLCBzbWFsbEJ1dHRvbkhlaWdodCk7CiAgICAkKCcuYnV0dG9uLmRyb3Bkb3duLnRpbnkgPiB1bCcsIHRoaXMpLmNzcygndG9wJywgdGlueUJ1dHRvbkhlaWdodCk7CgogICAgJCgnLmJ1dHRvbi5kcm9wZG93bi51cDpub3QoLmxhcmdlKTpub3QoLnNtYWxsKTpub3QoLnRpbnkpID4gdWwnLCB0aGlzKS5jc3MoJ3RvcCcsICdhdXRvJykuY3NzKCdib3R0b20nLCBub3JtYWxCdXR0b25IZWlnaHQgLSAyKTsKICAgICQoJy5idXR0b24uZHJvcGRvd24udXAubGFyZ2UgPiB1bCcsIHRoaXMpLmNzcygndG9wJywgJ2F1dG8nKS5jc3MoJ2JvdHRvbScsIGxhcmdlQnV0dG9uSGVpZ2h0IC0gMik7CiAgICAkKCcuYnV0dG9uLmRyb3Bkb3duLnVwLnNtYWxsID4gdWwnLCB0aGlzKS5jc3MoJ3RvcCcsICdhdXRvJykuY3NzKCdib3R0b20nLCBzbWFsbEJ1dHRvbkhlaWdodCAtIDIpOwogICAgJCgnLmJ1dHRvbi5kcm9wZG93bi51cC50aW55ID4gdWwnLCB0aGlzKS5jc3MoJ3RvcCcsICdhdXRvJykuY3NzKCdib3R0b20nLCB0aW55QnV0dG9uSGVpZ2h0IC0gMik7CgogIH07Cgp9KSggalF1ZXJ5LCB0aGlzICk7Cg==]]></data>
	</file>
	<file>
	  <filename>/assets/javascripts/jquery.foundation.clearing.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IEZvdW5kYXRpb24gQ2xlYXJpbmcgMS4yLjEKICogaHR0cDovL2ZvdW5kYXRpb24uenVyYi5jb20KICogQ29weXJpZ2h0IDIwMTIsIFpVUkIKICogRnJlZSB0byB1c2UgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAoqLwoKLypqc2xpbnQgdW5wYXJhbTogdHJ1ZSwgYnJvd3NlcjogdHJ1ZSwgaW5kZW50OiAyICovCgo7KGZ1bmN0aW9uICgkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHsKICAndXNlIHN0cmljdCc7CgogIHZhciBkZWZhdWx0cyA9IHsKICAgICAgICB0ZW1wbGF0ZXMgOiB7CiAgICAgICAgICB2aWV3aW5nIDogJzxhIGhyZWY9IiMiIGNsYXNzPSJjbGVhcmluZy1jbG9zZSI+JnRpbWVzOzwvYT4nICsKICAgICAgICAgICAgJzxkaXYgY2xhc3M9InZpc2libGUtaW1nIiBzdHlsZT0iZGlzcGxheTogbm9uZSI+PGltZyBzcmM9IiMiPicgKwogICAgICAgICAgICAnPHAgY2xhc3M9ImNsZWFyaW5nLWNhcHRpb24iPjwvcD48YSBocmVmPSIjIiBjbGFzcz0iY2xlYXJpbmctbWFpbi1sZWZ0Ij48L2E+JyArCiAgICAgICAgICAgICc8YSBocmVmPSIjIiBjbGFzcz0iY2xlYXJpbmctbWFpbi1yaWdodCI+PC9hPjwvZGl2PicKICAgICAgICB9LAoKICAgICAgICAvLyBjb21tYSBkZWxpbWl0ZWQgbGlzdCBvZiBzZWxlY3RvcnMgdGhhdCwgb24gY2xpY2ssIHdpbGwgY2xvc2UgY2xlYXJpbmcsIAogICAgICAgIC8vIGFkZCAnZGl2LmNsZWFyaW5nLWJsYWNrb3V0LCBkaXYudmlzaWJsZS1pbWcnIHRvIGNsb3NlIG9uIGJhY2tncm91bmQgY2xpY2sKICAgICAgICBjbG9zZV9zZWxlY3RvcnMgOiAnYS5jbGVhcmluZy1jbG9zZScsCgogICAgICAgIC8vIGV2ZW50IGluaXRpYWxpemVycyBhbmQgbG9ja3MKICAgICAgICBpbml0aWFsaXplZCA6IGZhbHNlLAogICAgICAgIGxvY2tlZCA6IGZhbHNlCiAgICAgIH0sCgogICAgICBjbCA9IHsKICAgICAgICBpbml0IDogZnVuY3Rpb24gKG9wdGlvbnMsIGV4dGVuZE1ldGhvZHMpIHsKICAgICAgICAgIHJldHVybiB0aGlzLmZpbmQoJ3VsW2RhdGEtY2xlYXJpbmddJykuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBkb2MgPSAkKGRvY3VtZW50KSwKICAgICAgICAgICAgICAgICRlbCA9ICQodGhpcyksCiAgICAgICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fSwKICAgICAgICAgICAgICAgIGV4dGVuZE1ldGhvZHMgPSBleHRlbmRNZXRob2RzIHx8IHt9LAogICAgICAgICAgICAgICAgc2V0dGluZ3MgPSAkZWwuZGF0YSgnZm5kdG4uY2xlYXJpbmcuc2V0dGluZ3MnKTsKCiAgICAgICAgICAgIGlmICghc2V0dGluZ3MpIHsKICAgICAgICAgICAgICBvcHRpb25zLiRwYXJlbnQgPSAkZWwucGFyZW50KCk7CgogICAgICAgICAgICAgICRlbC5kYXRhKCdmbmR0bi5jbGVhcmluZy5zZXR0aW5ncycsICQuZXh0ZW5kKHt9LCBkZWZhdWx0cywgb3B0aW9ucykpOwoKICAgICAgICAgICAgICBjbC5hc3NlbWJsZSgkZWwuZmluZCgnbGknKSk7CgogICAgICAgICAgICAgIGlmICghZGVmYXVsdHMuaW5pdGlhbGl6ZWQpIHsKICAgICAgICAgICAgICAgIGNsLmV2ZW50cygkZWwpOwogICAgICAgICAgICAgICAgaWYgKE1vZGVybml6ci50b3VjaCkgY2wuc3dpcGVfZXZlbnRzKCk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgZXZlbnRzIDogZnVuY3Rpb24gKGVsKSB7CiAgICAgICAgICB2YXIgc2V0dGluZ3MgPSBlbC5kYXRhKCdmbmR0bi5jbGVhcmluZy5zZXR0aW5ncycpOwoKICAgICAgICAgICQoZG9jdW1lbnQpCiAgICAgICAgICAgIC5vbignY2xpY2suZm5kdG4uY2xlYXJpbmcnLCAndWxbZGF0YS1jbGVhcmluZ10gbGknLCBmdW5jdGlvbiAoZSwgY3VycmVudCwgdGFyZ2V0KSB7CiAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBjdXJyZW50IHx8ICQodGhpcyksCiAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBjdXJyZW50LAogICAgICAgICAgICAgICAgICBzZXR0aW5ncyA9IGN1cnJlbnQucGFyZW50KCkuZGF0YSgnZm5kdG4uY2xlYXJpbmcuc2V0dGluZ3MnKTsKCiAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICAgICAgICBpZiAoIXNldHRpbmdzKSB7CiAgICAgICAgICAgICAgICBjdXJyZW50LnBhcmVudCgpLmZvdW5kYXRpb25DbGVhcmluZygpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgLy8gc2V0IGN1cnJlbnQgYW5kIHRhcmdldCB0byB0aGUgY2xpY2tlZCBsaSBpZiBub3Qgb3RoZXJ3aXNlIGRlZmluZWQuCiAgICAgICAgICAgICAgY2wub3BlbigkKGUudGFyZ2V0KSwgY3VycmVudCwgdGFyZ2V0KTsKICAgICAgICAgICAgICBjbC51cGRhdGVfcGFkZGxlcyh0YXJnZXQpOwogICAgICAgICAgICB9KQoKICAgICAgICAgICAgLm9uKCdjbGljay5mbmR0bi5jbGVhcmluZycsICcuY2xlYXJpbmctbWFpbi1yaWdodCcsIGZ1bmN0aW9uIChlKSB7IGNsLm5hdihlLCAnbmV4dCcpIH0pCiAgICAgICAgICAgIC5vbignY2xpY2suZm5kdG4uY2xlYXJpbmcnLCAnLmNsZWFyaW5nLW1haW4tbGVmdCcsIGZ1bmN0aW9uIChlKSB7IGNsLm5hdihlLCAncHJldicpIH0pCiAgICAgICAgICAgIC5vbignY2xpY2suZm5kdG4uY2xlYXJpbmcnLCBzZXR0aW5ncy5jbG9zZV9zZWxlY3RvcnMsIHRoaXMuY2xvc2UpCiAgICAgICAgICAgIC5vbigna2V5ZG93bi5mbmR0bi5jbGVhcmluZycsIHRoaXMua2V5ZG93bik7CgogICAgICAgICAgJCh3aW5kb3cpLm9uKCdyZXNpemUuZm5kdG4uY2xlYXJpbmcnLCB0aGlzLnJlc2l6ZSk7CgogICAgICAgICAgZGVmYXVsdHMuaW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgICAgIH0sCgogICAgICAgIHN3aXBlX2V2ZW50cyA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICQoZG9jdW1lbnQpCiAgICAgICAgICAgIC5iaW5kKCdzd2lwZWxlZnQnLCAndWxbZGF0YS1jbGVhcmluZ10nLCBmdW5jdGlvbiAoZSkgeyBjbC5uYXYoZSwgJ25leHQnKSB9KQogICAgICAgICAgICAuYmluZCgnc3dpcGVyaWdodCcsICd1bFtkYXRhLWNsZWFyaW5nXScsIGZ1bmN0aW9uIChlKSB7IGNsLm5hdihlLCAncHJldicpIH0pCiAgICAgICAgICAgIC5iaW5kKCdtb3Zlc3RhcnQnLCAndWxbZGF0YS1jbGVhcmluZ10nLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgIGlmICgoZS5kaXN0WCA+IGUuZGlzdFkgJiYgZS5kaXN0WCA8IC1lLmRpc3RZKSB8fAogICAgICAgICAgICAgICAgICAoZS5kaXN0WCA8IGUuZGlzdFkgJiYgZS5kaXN0WCA+IC1lLmRpc3RZKSkgewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSwKCiAgICAgICAgYXNzZW1ibGUgOiBmdW5jdGlvbiAoJGxpKSB7CiAgICAgICAgICB2YXIgJGVsID0gJGxpLnBhcmVudCgpLAogICAgICAgICAgICAgIHNldHRpbmdzID0gJGVsLmRhdGEoJ2ZuZHRuLmNsZWFyaW5nLnNldHRpbmdzJyksCiAgICAgICAgICAgICAgZ3JpZCA9ICRlbC5kZXRhY2goKSwKICAgICAgICAgICAgICBkYXRhID0gewogICAgICAgICAgICAgICAgZ3JpZDogJzxkaXYgY2xhc3M9ImNhcm91c2VsIj4nICsgdGhpcy5vdXRlckhUTUwoZ3JpZFswXSkgKyAnPC9kaXY+JywKICAgICAgICAgICAgICAgIHZpZXdpbmc6IHNldHRpbmdzLnRlbXBsYXRlcy52aWV3aW5nCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICB3cmFwcGVyID0gJzxkaXYgY2xhc3M9ImNsZWFyaW5nLWFzc2VtYmxlZCI+PGRpdj4nICsgZGF0YS52aWV3aW5nICsgZGF0YS5ncmlkICsgJzwvZGl2PjwvZGl2Pic7CgogICAgICAgICAgcmV0dXJuIHNldHRpbmdzLiRwYXJlbnQuYXBwZW5kKHdyYXBwZXIpOwogICAgICAgIH0sCgogICAgICAgIG9wZW4gOiBmdW5jdGlvbiAoJGltYWdlLCBjdXJyZW50LCB0YXJnZXQpIHsKICAgICAgICAgIHZhciByb290ID0gdGFyZ2V0LmNsb3Nlc3QoJy5jbGVhcmluZy1hc3NlbWJsZWQnKSwKICAgICAgICAgICAgICBjb250YWluZXIgPSByb290LmZpbmQoJ2RpdjpmaXJzdCcpLAogICAgICAgICAgICAgIHZpc2libGVfaW1hZ2UgPSBjb250YWluZXIuZmluZCgnLnZpc2libGUtaW1nJyksCiAgICAgICAgICAgICAgaW1hZ2UgPSB2aXNpYmxlX2ltYWdlLmZpbmQoJ2ltZycpLm5vdCgkaW1hZ2UpOwoKICAgICAgICAgIGlmICghY2wubG9ja2VkKCkpIHsKCiAgICAgICAgICAgIC8vIHNldCB0aGUgaW1hZ2UgdG8gdGhlIHNlbGVjdGVkIHRodW1ibmFpbAogICAgICAgICAgICBpbWFnZS5hdHRyKCdzcmMnLCB0aGlzLmxvYWQoJGltYWdlKSk7CgogICAgICAgICAgICBpbWFnZS5sb2FkZWQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIC8vIHRvZ2dsZSB0aGUgZ2FsbGVyeSBpZiBub3QgdmlzaWJsZQogICAgICAgICAgICAgIHJvb3QuYWRkQ2xhc3MoJ2NsZWFyaW5nLWJsYWNrb3V0Jyk7CiAgICAgICAgICAgICAgY29udGFpbmVyLmFkZENsYXNzKCdjbGVhcmluZy1jb250YWluZXInKTsKICAgICAgICAgICAgICB0aGlzLmNhcHRpb24odmlzaWJsZV9pbWFnZS5maW5kKCcuY2xlYXJpbmctY2FwdGlvbicpLCAkaW1hZ2UpOwogICAgICAgICAgICAgIHZpc2libGVfaW1hZ2Uuc2hvdygpOwogICAgICAgICAgICAgIHRoaXMuZml4X2hlaWdodCh0YXJnZXQpOwogICAgICAgICAgICAgIHRoaXMuY2VudGVyKGltYWdlKTsKCiAgICAgICAgICAgICAgLy8gc2hpZnQgdGhlIHRodW1ibmFpbHMgaWYgbmVjZXNzYXJ5CiAgICAgICAgICAgICAgdGhpcy5zaGlmdChjdXJyZW50LCB0YXJnZXQsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHRhcmdldC5zaWJsaW5ncygpLnJlbW92ZUNsYXNzKCd2aXNpYmxlJyk7CiAgICAgICAgICAgICAgICB0YXJnZXQuYWRkQ2xhc3MoJ3Zpc2libGUnKTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTsKICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBjbG9zZSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CgogICAgICAgICAgdmFyIHJvb3QgPSAoZnVuY3Rpb24gKHRhcmdldCkgewogICAgICAgICAgICAgICAgaWYgKC9ibGFja291dC8udGVzdCh0YXJnZXQuc2VsZWN0b3IpKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmNsb3Nlc3QoJy5jbGVhcmluZy1ibGFja291dCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0oJCh0aGlzKSkpLCBjb250YWluZXIsIHZpc2libGVfaW1hZ2U7CgogICAgICAgICAgaWYgKHRoaXMgPT09IGUudGFyZ2V0ICYmIHJvb3QpIHsKICAgICAgICAgICAgY29udGFpbmVyID0gcm9vdC5maW5kKCdkaXY6Zmlyc3QnKSwKICAgICAgICAgICAgdmlzaWJsZV9pbWFnZSA9IGNvbnRhaW5lci5maW5kKCcudmlzaWJsZS1pbWcnKTsKCiAgICAgICAgICAgIGRlZmF1bHRzLnByZXZfaW5kZXggPSAwOwoKICAgICAgICAgICAgcm9vdC5maW5kKCd1bFtkYXRhLWNsZWFyaW5nXScpLmF0dHIoJ3N0eWxlJywgJycpCiAgICAgICAgICAgIHJvb3QucmVtb3ZlQ2xhc3MoJ2NsZWFyaW5nLWJsYWNrb3V0Jyk7CiAgICAgICAgICAgIGNvbnRhaW5lci5yZW1vdmVDbGFzcygnY2xlYXJpbmctY29udGFpbmVyJyk7CiAgICAgICAgICAgIHZpc2libGVfaW1hZ2UuaGlkZSgpOwogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9LAoKICAgICAgICBrZXlkb3duIDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgIHZhciBjbGVhcmluZyA9ICQoJy5jbGVhcmluZy1ibGFja291dCcpLmZpbmQoJ3VsW2RhdGEtY2xlYXJpbmddJyk7CgogICAgICAgICAgaWYgKGUud2hpY2ggPT09IDM5KSBjbC5nbyhjbGVhcmluZywgJ25leHQnKTsKICAgICAgICAgIGlmIChlLndoaWNoID09PSAzNykgY2wuZ28oY2xlYXJpbmcsICdwcmV2Jyk7CiAgICAgICAgICBpZiAoZS53aGljaCA9PT0gMjcpICQoJ2EuY2xlYXJpbmctY2xvc2UnKS50cmlnZ2VyKCdjbGljaycpOwogICAgICAgIH0sCgogICAgICAgIG5hdiA6IGZ1bmN0aW9uIChlLCBkaXJlY3Rpb24pIHsKICAgICAgICAgIHZhciBjbGVhcmluZyA9ICQoJy5jbGVhcmluZy1ibGFja291dCcpLmZpbmQoJ3VsW2RhdGEtY2xlYXJpbmddJyk7CgogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgdGhpcy5nbyhjbGVhcmluZywgZGlyZWN0aW9uKTsKICAgICAgICB9LAoKICAgICAgICByZXNpemUgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB2YXIgaW1hZ2UgPSAkKCcuY2xlYXJpbmctYmxhY2tvdXQgLnZpc2libGUtaW1nJykuZmluZCgnaW1nJyk7CgogICAgICAgICAgaWYgKGltYWdlLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgY2wuY2VudGVyKGltYWdlKTsKICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBmaXhfaGVpZ2h0IDogZnVuY3Rpb24gKHRhcmdldCkgewogICAgICAgICAgdmFyIGxpcyA9IHRhcmdldC5zaWJsaW5ncygpOwoKICAgICAgICAgIGxpcy5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICB2YXIgbGkgPSAkKHRoaXMpLAogICAgICAgICAgICAgICAgICBpbWFnZSA9IGxpLmZpbmQoJ2ltZycpOwoKICAgICAgICAgICAgICBpZiAobGkuaGVpZ2h0KCkgPiBpbWFnZS5vdXRlckhlaWdodCgpKSB7CiAgICAgICAgICAgICAgICBsaS5hZGRDbGFzcygnZml4LWhlaWdodCcpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICAgICAgLmNsb3Nlc3QoJ3VsJykud2lkdGgobGlzLmxlbmd0aCAqIDEwMCArICclJyk7CiAgICAgICAgfSwKCiAgICAgICAgdXBkYXRlX3BhZGRsZXMgOiBmdW5jdGlvbiAodGFyZ2V0KSB7CiAgICAgICAgICB2YXIgdmlzaWJsZV9pbWFnZSA9IHRhcmdldC5jbG9zZXN0KCcuY2Fyb3VzZWwnKS5zaWJsaW5ncygnLnZpc2libGUtaW1nJyk7CgogICAgICAgICAgaWYgKHRhcmdldC5uZXh0KCkubGVuZ3RoID4gMCkgewogICAgICAgICAgICB2aXNpYmxlX2ltYWdlLmZpbmQoJy5jbGVhcmluZy1tYWluLXJpZ2h0JykucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2aXNpYmxlX2ltYWdlLmZpbmQoJy5jbGVhcmluZy1tYWluLXJpZ2h0JykuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKHRhcmdldC5wcmV2KCkubGVuZ3RoID4gMCkgewogICAgICAgICAgICB2aXNpYmxlX2ltYWdlLmZpbmQoJy5jbGVhcmluZy1tYWluLWxlZnQnKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZpc2libGVfaW1hZ2UuZmluZCgnLmNsZWFyaW5nLW1haW4tbGVmdCcpLmFkZENsYXNzKCdkaXNhYmxlZCcpOwogICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIGxvYWQgOiBmdW5jdGlvbiAoJGltYWdlKSB7CiAgICAgICAgICB2YXIgaHJlZiA9ICRpbWFnZS5wYXJlbnQoKS5hdHRyKCdocmVmJyk7CgogICAgICAgICAgdGhpcy5wcmVsb2FkKCRpbWFnZSk7CgogICAgICAgICAgaWYgKGhyZWYpIHJldHVybiBocmVmOwogICAgICAgICAgcmV0dXJuICRpbWFnZS5hdHRyKCdzcmMnKTsKICAgICAgICB9LAoKICAgICAgICBwcmVsb2FkIDogZnVuY3Rpb24gKCRpbWFnZSkgewogICAgICAgICAgdGhpcy5pbWcoJGltYWdlLmNsb3Nlc3QoJ2xpJykubmV4dCgpKTsKICAgICAgICAgIHRoaXMuaW1nKCRpbWFnZS5jbG9zZXN0KCdsaScpLnByZXYoKSk7CiAgICAgICAgfSwKCiAgICAgICAgaW1nIDogZnVuY3Rpb24gKGltZykgewogICAgICAgICAgaWYgKGltZy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHZhciBuZXdfaW1nID0gbmV3IEltYWdlKCksCiAgICAgICAgICAgICAgICBuZXdfYSA9IGltZy5maW5kKCdhJyk7CgogICAgICAgICAgICBpZiAobmV3X2EubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgIG5ld19pbWcuc3JjID0gbmV3X2EuYXR0cignaHJlZicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIG5ld19pbWcuc3JjID0gaW1nLmZpbmQoJ2ltZycpLmF0dHIoJ3NyYycpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgY2FwdGlvbiA6IGZ1bmN0aW9uIChjb250YWluZXIsICRpbWFnZSkgewogICAgICAgICAgdmFyIGNhcHRpb24gPSAkaW1hZ2UuZGF0YSgnY2FwdGlvbicpOwoKICAgICAgICAgIGlmIChjYXB0aW9uKSB7CiAgICAgICAgICAgIGNvbnRhaW5lci50ZXh0KGNhcHRpb24pLnNob3coKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnRhaW5lci50ZXh0KCcnKS5oaWRlKCk7CiAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZ28gOiBmdW5jdGlvbiAoJHVsLCBkaXJlY3Rpb24pIHsKICAgICAgICAgIHZhciBjdXJyZW50ID0gJHVsLmZpbmQoJy52aXNpYmxlJyksCiAgICAgICAgICAgICAgdGFyZ2V0ID0gY3VycmVudFtkaXJlY3Rpb25dKCk7CgogICAgICAgICAgaWYgKHRhcmdldC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHRhcmdldC5maW5kKCdpbWcnKS50cmlnZ2VyKCdjbGljaycsIFtjdXJyZW50LCB0YXJnZXRdKTsKICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBzaGlmdCA6IGZ1bmN0aW9uIChjdXJyZW50LCB0YXJnZXQsIGNhbGxiYWNrKSB7CiAgICAgICAgICB2YXIgY2xlYXJpbmcgPSB0YXJnZXQucGFyZW50KCksCiAgICAgICAgICAgICAgb2xkX2luZGV4ID0gZGVmYXVsdHMucHJldl9pbmRleCwKICAgICAgICAgICAgICBkaXJlY3Rpb24gPSB0aGlzLmRpcmVjdGlvbihjbGVhcmluZywgY3VycmVudCwgdGFyZ2V0KSwKICAgICAgICAgICAgICBsZWZ0ID0gcGFyc2VJbnQoY2xlYXJpbmcuY3NzKCdsZWZ0JyksIDEwKSwKICAgICAgICAgICAgICB3aWR0aCA9IHRhcmdldC5vdXRlcldpZHRoKCksCiAgICAgICAgICAgICAgc2tpcF9zaGlmdDsKCiAgICAgICAgICAvLyB3ZSB1c2UgalF1ZXJ5IGFuaW1hdGUgaW5zdGVhZCBvZiBDU1MgdHJhbnNpdGlvbnMgYmVjYXVzZSB3ZQogICAgICAgICAgLy8gbmVlZCBhIGNhbGxiYWNrIHRvIHVubG9jayB0aGUgbmV4dCBhbmltYXRpb24KICAgICAgICAgIGlmICh0YXJnZXQuaW5kZXgoKSAhPT0gb2xkX2luZGV4ICYmICEvc2tpcC8udGVzdChkaXJlY3Rpb24pKXsKICAgICAgICAgICAgaWYgKC9sZWZ0Ly50ZXN0KGRpcmVjdGlvbikpIHsKICAgICAgICAgICAgICB0aGlzLmxvY2soKTsKICAgICAgICAgICAgICBjbGVhcmluZy5hbmltYXRlKHtsZWZ0IDogbGVmdCArIHdpZHRofSwgMzAwLCB0aGlzLnVubG9jayk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoL3JpZ2h0Ly50ZXN0KGRpcmVjdGlvbikpIHsKICAgICAgICAgICAgICB0aGlzLmxvY2soKTsKICAgICAgICAgICAgICBjbGVhcmluZy5hbmltYXRlKHtsZWZ0IDogbGVmdCAtIHdpZHRofSwgMzAwLCB0aGlzLnVubG9jayk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAoL3NraXAvLnRlc3QoZGlyZWN0aW9uKSkgewoKICAgICAgICAgICAgLy8gdGhlIHRhcmdldCBpbWFnZSBpcyBub3QgYWRqYWNlbnQgdG8gdGhlIGN1cnJlbnQgaW1hZ2UsIHNvCiAgICAgICAgICAgIC8vIGRvIHdlIHNjcm9sbCByaWdodCBvciBub3QKICAgICAgICAgICAgc2tpcF9zaGlmdCA9IHRhcmdldC5pbmRleCgpIC0gZGVmYXVsdHMudXBfY291bnQ7CiAgICAgICAgICAgIHRoaXMubG9jaygpOwoKICAgICAgICAgICAgaWYgKHNraXBfc2hpZnQgPiAwKSB7CiAgICAgICAgICAgICAgY2xlYXJpbmcuYW5pbWF0ZSh7bGVmdCA6IC0oc2tpcF9zaGlmdCAqIHdpZHRoKX0sIDMwMCwgdGhpcy51bmxvY2spOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGNsZWFyaW5nLmFuaW1hdGUoe2xlZnQgOiAwfSwgMzAwLCB0aGlzLnVubG9jayk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0sCgogICAgICAgIGxvY2sgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBkZWZhdWx0cy5sb2NrZWQgPSB0cnVlOwogICAgICAgIH0sCgogICAgICAgIHVubG9jayA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGRlZmF1bHRzLmxvY2tlZCA9IGZhbHNlOwogICAgICAgIH0sCgogICAgICAgIGxvY2tlZCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHJldHVybiBkZWZhdWx0cy5sb2NrZWQ7CiAgICAgICAgfSwKCiAgICAgICAgZGlyZWN0aW9uIDogZnVuY3Rpb24gKCRlbCwgY3VycmVudCwgdGFyZ2V0KSB7CiAgICAgICAgICB2YXIgbGlzID0gJGVsLmZpbmQoJ2xpJyksCiAgICAgICAgICAgICAgbGlfd2lkdGggPSBsaXMub3V0ZXJXaWR0aCgpICsgKGxpcy5vdXRlcldpZHRoKCkgLyA0KSwKICAgICAgICAgICAgICB1cF9jb3VudCA9IE1hdGguZmxvb3IoJCgnLmNsZWFyaW5nLWNvbnRhaW5lcicpLm91dGVyV2lkdGgoKSAvIGxpX3dpZHRoKSAtIDEsCiAgICAgICAgICAgICAgdGFyZ2V0X2luZGV4ID0gbGlzLmluZGV4KHRhcmdldCksCiAgICAgICAgICAgICAgcmVzcG9uc2U7CgogICAgICAgICAgZGVmYXVsdHMudXBfY291bnQgPSB1cF9jb3VudDsKCiAgICAgICAgICBpZiAodGhpcy5hZGphY2VudChkZWZhdWx0cy5wcmV2X2luZGV4LCB0YXJnZXRfaW5kZXgpKSB7CiAgICAgICAgICAgIGlmICgodGFyZ2V0X2luZGV4ID4gdXBfY291bnQpICYmIHRhcmdldF9pbmRleCA+IGRlZmF1bHRzLnByZXZfaW5kZXgpIHsKICAgICAgICAgICAgICByZXNwb25zZSA9ICdyaWdodCc7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRhcmdldF9pbmRleCA+IHVwX2NvdW50IC0gMSkgJiYgdGFyZ2V0X2luZGV4IDw9IGRlZmF1bHRzLnByZXZfaW5kZXgpIHsKICAgICAgICAgICAgICByZXNwb25zZSA9ICdsZWZ0JzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByZXNwb25zZSA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXNwb25zZSA9ICdza2lwJzsKICAgICAgICAgIH0KCiAgICAgICAgICBkZWZhdWx0cy5wcmV2X2luZGV4ID0gdGFyZ2V0X2luZGV4OwoKICAgICAgICAgIHJldHVybiByZXNwb25zZTsKICAgICAgICB9LAoKICAgICAgICBhZGphY2VudCA6IGZ1bmN0aW9uIChjdXJyZW50X2luZGV4LCB0YXJnZXRfaW5kZXgpIHsKICAgICAgICAgIGZvciAodmFyIGkgPSB0YXJnZXRfaW5kZXggKyAxOyBpID49IHRhcmdldF9pbmRleCAtIDE7IGktLSkgewogICAgICAgICAgICBpZiAoaSA9PT0gY3VycmVudF9pbmRleCkgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSwKCiAgICAgICAgY2VudGVyIDogZnVuY3Rpb24gKHRhcmdldCkgewogICAgICAgICAgdGFyZ2V0LmNzcyh7CiAgICAgICAgICAgIG1hcmdpbkxlZnQgOiAtKHRhcmdldC5vdXRlcldpZHRoKCkgLyAyKSwKICAgICAgICAgICAgbWFyZ2luVG9wIDogLSh0YXJnZXQub3V0ZXJIZWlnaHQoKSAvIDIpCiAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBvdXRlckhUTUwgOiBmdW5jdGlvbiAoZWwpIHsKICAgICAgICAgIC8vIHN1cHBvcnQgRmlyZUZveCA8IDExCiAgICAgICAgICByZXR1cm4gZWwub3V0ZXJIVE1MIHx8IG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcoZWwpOwogICAgICAgIH0KCiAgICAgIH07CgogICQuZm4uZm91bmRhdGlvbkNsZWFyaW5nID0gZnVuY3Rpb24gKG1ldGhvZCkgewogICAgaWYgKGNsW21ldGhvZF0pIHsKICAgICAgcmV0dXJuIGNsW21ldGhvZF0uYXBwbHkodGhpcywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtZXRob2QgPT09ICdvYmplY3QnIHx8ICFtZXRob2QpIHsKICAgICAgcmV0dXJuIGNsLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH0gZWxzZSB7CiAgICAgICQuZXJyb3IoJ01ldGhvZCAnICsgIG1ldGhvZCArICcgZG9lcyBub3QgZXhpc3Qgb24galF1ZXJ5LmZvdW5kYXRpb25DbGVhcmluZycpOwogICAgfQogIH07CgogIC8vIGpxdWVyeS5pbWFnZXJlYWR5LmpzCiAgLy8gQHdlYmxpbmMsIEBqc2FudGVsbCwgKGMpIDIwMTIKCiAgKGZ1bmN0aW9uKCAkICkgewogICAgJC5mbi5sb2FkZWQgPSBmdW5jdGlvbiAoIGNhbGxiYWNrLCB1c2VyU2V0dGluZ3MgKSB7CiAgICAgIHZhcgogICAgICAgIG9wdGlvbnMgPSAkLmV4dGVuZCgge30sICQuZm4ubG9hZGVkLmRlZmF1bHRzLCB1c2VyU2V0dGluZ3MgKSwKICAgICAgICAkaW1hZ2VzID0gdGhpcy5maW5kKCAnaW1nJyApLmFkZCggdGhpcy5maWx0ZXIoICdpbWcnICkgKSwKICAgICAgICB1bmxvYWRlZEltYWdlcyA9ICRpbWFnZXMubGVuZ3RoOwoKICAgICAgZnVuY3Rpb24gbG9hZGVkICgpIHsKICAgICAgICB1bmxvYWRlZEltYWdlcyAtPSAxOwogICAgICAgICF1bmxvYWRlZEltYWdlcyAmJiBjYWxsYmFjaygpOwogICAgICB9CgogICAgICBmdW5jdGlvbiBiaW5kTG9hZCAoKSB7CiAgICAgICAgdGhpcy5vbmUoICdsb2FkJywgbG9hZGVkICk7CiAgICAgICAgaWYgKCAkLmJyb3dzZXIubXNpZSApIHsKICAgICAgICAgIHZhcgogICAgICAgICAgICBzcmMgICA9IHRoaXMuYXR0ciggJ3NyYycgKSwKICAgICAgICAgICAgcGFyYW0gPSBzcmMubWF0Y2goIC9cPy8gKSA/ICcmJyA6ICc/JzsKICAgICAgICAgIHBhcmFtICArPSBvcHRpb25zLmNhY2hlUHJlZml4ICsgJz0nICsgKCBuZXcgRGF0ZSgpICkuZ2V0VGltZSgpOwogICAgICAgICAgdGhpcy5hdHRyKCAnc3JjJywgc3JjICsgcGFyYW0gKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiAkaW1hZ2VzLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgIHZhciAkdGhpcyA9ICQoIHRoaXMgKTsKICAgICAgICBpZiAoICEkdGhpcy5hdHRyKCAnc3JjJyApICkgewogICAgICAgICAgbG9hZGVkKCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuY29tcGxldGUgfHwgdGhpcy5yZWFkeVN0YXRlID09PSA0ID8KICAgICAgICAgIGxvYWRlZCgpIDoKICAgICAgICAgIGJpbmRMb2FkLmNhbGwoICR0aGlzICk7CiAgICAgIH0pOwogICAgfTsKCiAgICAkLmZuLmxvYWRlZC5kZWZhdWx0cyA9IHsKICAgICAgY2FjaGVQcmVmaXg6ICdyYW5kb20nCiAgICB9OwoKICB9KGpRdWVyeSkpOwoKfShqUXVlcnksIHRoaXMsIHRoaXMuZG9jdW1lbnQpKTsK]]></data>
	</file>
	<file>
	  <filename>/assets/javascripts/jquery.foundation.forms.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IEN1c3RvbSBGb3JtcyBQbHVnaW4gMS4wCiAqIHd3dy5aVVJCLmNvbQogKiBDb3B5cmlnaHQgMjAxMCwgWlVSQgogKiBGcmVlIHRvIHVzZSB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwCiovCgooZnVuY3Rpb24oICQgKXsKCiAgLyoqCiAgICogSGVscGVyIG9iamVjdCB1c2VkIHRvIHF1aWNrbHkgYWRqdXN0IGFsbCBoaWRkZW4gcGFyZW50IGVsZW1lbnQncywgZGlzcGxheSBhbmQgdmlzaWJpbGl0eSBwcm9wZXJ0aWVzLgogICAqIFRoaXMgaXMgY3VycmVudGx5IHVzZWQgZm9yIHRoZSBjdXN0b20gZHJvcCBkb3ducy4gV2hlbiB0aGUgZHJvcGRvd25zIGFyZSBjb250YWluZWQgd2l0aGluIGEgcmV2ZWFsIG1vZGFsCiAgICogd2UgY2Fubm90IGFjY3VyYXRlbHkgZGV0ZXJtaW5lIHRoZSBsaXN0LWl0ZW0gZWxlbWVudHMgd2lkdGggcHJvcGVydHksIHNpbmNlIHRoZSBtb2RhbCdzIGRpc3BsYXkgcHJvcGVydHkgaXMgc2V0CiAgICogdG8gJ25vbmUnLgogICAqCiAgICogVGhpcyBvYmplY3Qgd2lsbCBoZWxwIHVzIHdvcmsgYXJvdW5kIHRoYXQgcHJvYmxlbS4KICAgKgogICAqIE5PVEU6IFRoaXMgY291bGQgYWxzbyBiZSBwbHVnaW4uCiAgICoKICAgKiBAZnVuY3Rpb24gaGlkZGVuRml4CiAgICovCiAgdmFyIGhpZGRlbkZpeCA9IGZ1bmN0aW9uKCkgewoKICAgIHJldHVybiB7CiAgICAgIC8qKgogICAgICAgKiBTZXRzIGFsbCBoaWRkZW4gcGFyZW50IGVsZW1lbnRzIGFuZCBzZWxmIHRvIHZpc2liaWxlLgogICAgICAgKgogICAgICAgKiBAbWV0aG9kIGFkanVzdAogICAgICAgKiBAcGFyYW0ge2pRdWVyeSBPYmplY3R9ICRjaGlsZAogICAgICAgKi8KCiAgICAgIC8vIFdlJ2xsIHVzZSB0aGlzIHRvIHRlbXBvcmFyaWx5IHN0b3JlIHN0eWxlIHByb3BlcnRpZXMuCiAgICAgIHRtcCA6IFtdLAoKICAgICAgLy8gV2UnbGwgdXNlIHRoaXMgdG8gc2V0IGhpZGRlbiBwYXJlbnQgZWxlbWVudHMuCiAgICAgIGhpZGRlbiA6IG51bGwsCgogICAgICBhZGp1c3QgOiBmdW5jdGlvbiggJGNoaWxkICkgewogICAgICAgIC8vIEludGVybmFsIHJlZmVyZW5jZS4KICAgICAgICB2YXIgX3NlbGYgPSB0aGlzOwoKICAgICAgICAvLyBTZXQgYWxsIGhpZGRlbiBwYXJlbnQgZWxlbWVudHMsIGluY2x1ZGluZyB0aGlzIGVsZW1lbnQuCiAgICAgICAgX3NlbGYuaGlkZGVuID0gJGNoaWxkLnBhcmVudHMoKS5hbmRTZWxmKCkuZmlsdGVyKCAiOmhpZGRlbiIgKTsKCiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBoaWRkZW4gZWxlbWVudHMuCiAgICAgICAgX3NlbGYuaGlkZGVuLmVhY2goIGZ1bmN0aW9uKCkgewoKICAgICAgICAgIC8vIENhY2hlIHRoZSBlbGVtZW50LgogICAgICAgICAgdmFyICRlbGVtID0gJCggdGhpcyApOwoKICAgICAgICAgIC8vIFN0b3JlIHRoZSBzdHlsZSBhdHRyaWJ1dGUuCiAgICAgICAgICAvLyBVbmRlZmluZWQgaWYgZWxlbWVudCBkb2Vzbid0IGhhdmUgYSBzdHlsZSBhdHRyaWJ1dGUuCiAgICAgICAgICBfc2VsZi50bXAucHVzaCggJGVsZW0uYXR0ciggJ3N0eWxlJyApICk7CgogICAgICAgICAgLy8gU2V0IHRoZSBlbGVtZW50J3MgZGlzcGxheSBwcm9wZXJ0eSB0byBibG9jaywKICAgICAgICAgIC8vIGJ1dCBlbnN1cmUgaXQncyB2aXNpYmlsaXR5IGlzIGhpZGRlbi4KICAgICAgICAgICRlbGVtLmNzcyggeyAndmlzaWJpbGl0eScgOiAnaGlkZGVuJywgJ2Rpc3BsYXknIDogJ2Jsb2NrJyB9ICk7CiAgICAgICAgfSk7CgogICAgICB9LCAvLyBlbmQgYWRqdXN0CgogICAgICAvKioKICAgICAgICogUmVzZXRzIHRoZSBlbGVtZW50cyBwcmV2aW91cyBzdGF0ZS4KICAgICAgICoKICAgICAgICogQG1ldGhvZCByZXNldAogICAgICAgKi8KICAgICAgcmVzZXQgOiBmdW5jdGlvbigpIHsKICAgICAgICAvLyBJbnRlcm5hbCByZWZlcmVuY2UuCiAgICAgICAgdmFyIF9zZWxmID0gdGhpczsKICAgICAgICAvLyBMb29wIHRocm91Z2ggb3VyIGhpZGRlbiBlbGVtZW50IGNvbGxlY3Rpb24uCiAgICAgICAgX3NlbGYuaGlkZGVuLmVhY2goIGZ1bmN0aW9uKCBpICkgewogICAgICAgICAgLy8gQ2FjaGUgdGhpcyBlbGVtZW50LgogICAgICAgICAgdmFyICRlbGVtID0gJCggdGhpcyApLAogICAgICAgICAgICAgIF90bXAgPSBfc2VsZi50bXBbIGkgXTsgLy8gR2V0IHRoZSBzdG9yZWQgJ3N0eWxlJyB2YWx1ZSBmb3IgdGhpcyBlbGVtZW50LgoKICAgICAgICAgIC8vIElmIHRoZSBzdG9yZWQgdmFsdWUgaXMgdW5kZWZpbmVkLgogICAgICAgICAgaWYoIF90bXAgPT09IHVuZGVmaW5lZCApCiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgc3R5bGUgYXR0cmlidXRlLgogICAgICAgICAgICAkZWxlbS5yZW1vdmVBdHRyKCAnc3R5bGUnICk7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgcmVzZXQgdGhlIGVsZW1lbnQgc3R5bGUgYXR0cmlidXRlLgogICAgICAgICAgICAkZWxlbS5hdHRyKCAnc3R5bGUnLCBfdG1wICk7CgogICAgICAgIH0pOwogICAgICAgIC8vIFJlc2V0IHRoZSB0bXAgYXJyYXkuCiAgICAgICAgX3NlbGYudG1wID0gW107CiAgICAgICAgLy8gUmVzZXQgdGhlIGhpZGRlbiBlbGVtZW50cyB2YXJpYWJsZS4KICAgICAgICBfc2VsZi5oaWRkZW4gPSBudWxsOwoKICAgICAgfSAvLyBlbmQgcmVzZXQKCiAgICB9OyAvLyBlbmQgcmV0dXJuCgogIH07CgogIGpRdWVyeS5mb3VuZGF0aW9uID0galF1ZXJ5LmZvdW5kYXRpb24gfHwge307CiAgalF1ZXJ5LmZvdW5kYXRpb24uY3VzdG9tRm9ybXMgPSBqUXVlcnkuZm91bmRhdGlvbi5jdXN0b21Gb3JtcyB8fCB7fTsKCiAgJC5mb3VuZGF0aW9uLmN1c3RvbUZvcm1zLmFwcGVuZEN1c3RvbU1hcmt1cCA9IGZ1bmN0aW9uICggb3B0aW9ucyApIHsKCiAgICB2YXIgZGVmYXVsdHMgPSB7CiAgICAgIGRpc2FibGVfY2xhc3M6ICJuby1jdXN0b20iCiAgICB9OwoKICAgIG9wdGlvbnMgPSAkLmV4dGVuZCggZGVmYXVsdHMsIG9wdGlvbnMgKTsKCiAgICBmdW5jdGlvbiBhcHBlbmRDdXN0b21NYXJrdXAoaWR4LCBzZWwpIHsKICAgICAgdmFyICR0aGlzID0gJChzZWwpLmhpZGUoKSwKICAgICAgICAgIHR5cGUgID0gJHRoaXMuYXR0cigndHlwZScpLAogICAgICAgICAgJHNwYW4gPSAkdGhpcy5uZXh0KCdzcGFuLmN1c3RvbS4nICsgdHlwZSk7CgogICAgICBpZiAoJHNwYW4ubGVuZ3RoID09PSAwKSB7CiAgICAgICAgJHNwYW4gPSAkKCc8c3BhbiBjbGFzcz0iY3VzdG9tICcgKyB0eXBlICsgJyI+PC9zcGFuPicpLmluc2VydEFmdGVyKCR0aGlzKTsKICAgICAgfQoKICAgICAgJHNwYW4udG9nZ2xlQ2xhc3MoJ2NoZWNrZWQnLCAkdGhpcy5pcygnOmNoZWNrZWQnKSk7CiAgICAgICRzcGFuLnRvZ2dsZUNsYXNzKCdkaXNhYmxlZCcsICR0aGlzLmlzKCc6ZGlzYWJsZWQnKSk7CiAgICB9CgogICAgZnVuY3Rpb24gYXBwZW5kQ3VzdG9tU2VsZWN0KGlkeCwgc2VsKSB7CiAgICAgIHZhciBoaWRkZW5GaXhPYmogPSBoaWRkZW5GaXgoKTsKICAgICAgICAgIC8vCiAgICAgICAgICAvLyBqUXVlcnlpZnkgdGhlIDxzZWxlY3Q+IGVsZW1lbnQgYW5kIGNhY2hlIGl0LgogICAgICAgICAgLy8KICAgICAgdmFyICR0aGlzID0gJCggc2VsICksCiAgICAgICAgICAvLwogICAgICAgICAgLy8gRmluZCB0aGUgY3VzdG9tIGRyb3AgZG93biBlbGVtZW50LgogICAgICAgICAgLy8KICAgICAgICAgICRjdXN0b21TZWxlY3QgPSAkdGhpcy5uZXh0KCAnZGl2LmN1c3RvbS5kcm9wZG93bicgKSwKICAgICAgICAgIC8vCiAgICAgICAgICAvLyBGaW5kIHRoZSBjdXN0b20gc2VsZWN0IGVsZW1lbnQgd2l0aGluIHRoZSBjdXN0b20gZHJvcCBkb3duLgogICAgICAgICAgLy8KICAgICAgICAgICRjdXN0b21MaXN0ID0gJGN1c3RvbVNlbGVjdC5maW5kKCAndWwnICksCiAgICAgICAgICAvLwogICAgICAgICAgLy8gRmluZCB0aGUgY3VzdG9tIGEuY3VycmVudCBlbGVtZW50LgogICAgICAgICAgLy8KICAgICAgICAgICRzZWxlY3RDdXJyZW50ID0gJGN1c3RvbVNlbGVjdC5maW5kKCAiLmN1cnJlbnQiICksCiAgICAgICAgICAvLwogICAgICAgICAgLy8gRmluZCB0aGUgY3VzdG9tIGEuc2VsZWN0b3IgZWxlbWVudCAodGhlIGRyb3AtZG93biBpY29uKS4KICAgICAgICAgIC8vCiAgICAgICAgICAkc2VsZWN0b3IgPSAkY3VzdG9tU2VsZWN0LmZpbmQoICIuc2VsZWN0b3IiICksCiAgICAgICAgICAvLwogICAgICAgICAgLy8gR2V0IHRoZSA8b3B0aW9ucz4gZnJvbSB0aGUgPHNlbGVjdD4gZWxlbWVudC4KICAgICAgICAgIC8vCiAgICAgICAgICAkb3B0aW9ucyA9ICR0aGlzLmZpbmQoICdvcHRpb24nICksCiAgICAgICAgICAvLwogICAgICAgICAgLy8gRmlsdGVyIGRvd24gdGhlIHNlbGVjdGVkIG9wdGlvbnMKICAgICAgICAgIC8vCiAgICAgICAgICAkc2VsZWN0ZWRPcHRpb24gPSAkb3B0aW9ucy5maWx0ZXIoICc6c2VsZWN0ZWQnICksCiAgICAgICAgICAvLwogICAgICAgICAgLy8gSW5pdGlhbCBtYXggd2lkdGguCiAgICAgICAgICAvLwogICAgICAgICAgbWF4V2lkdGggPSAwLAogICAgICAgICAgLy8KICAgICAgICAgIC8vIFdlJ2xsIHVzZSB0aGlzIHZhcmlhYmxlIHRvIGNyZWF0ZSB0aGUgPGxpPiBlbGVtZW50cyBmb3Igb3VyIGN1c3RvbSBzZWxlY3QuCiAgICAgICAgICAvLwogICAgICAgICAgbGlIdG1sID0gJycsCiAgICAgICAgICAvLwogICAgICAgICAgLy8gV2UnbGwgdXNlIHRoaXMgdG8gY2FjaGUgdGhlIGNyZWF0ZWQgPGxpPiBlbGVtZW50cyB3aXRoaW4gb3VyIGN1c3RvbSBzZWxlY3QuCiAgICAgICAgICAvLwogICAgICAgICAgJGxpc3RJdGVtcwogICAgICA7CiAgICAgIHZhciAkY3VycmVudFNlbGVjdCA9IGZhbHNlOwogICAgICAvLwogICAgICAvLyBTaG91bGQgd2Ugbm90IGNyZWF0ZSBhIGN1c3RvbSBsaXN0PwogICAgICAvLwogICAgICBpZiAoICR0aGlzLmhhc0NsYXNzKCBvcHRpb25zLmRpc2FibGVfY2xhc3MgKSApIHJldHVybjsKCiAgICAgIC8vCiAgICAgIC8vIERpZCB3ZSBub3QgY3JlYXRlIGEgY3VzdG9tIHNlbGVjdCBlbGVtZW50IHlldD8KICAgICAgLy8KICAgICAgaWYgKCAkY3VzdG9tU2VsZWN0Lmxlbmd0aCA9PT0gMCApIHsKICAgICAgICAvLwogICAgICAgIC8vIExldCdzIGNyZWF0ZSBvdXIgY3VzdG9tIHNlbGVjdCBlbGVtZW50IQogICAgICAgIC8vCgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBEZXRlcm1pbmUgd2hhdCBzZWxlY3Qgc2l6ZSB0byB1c2UuCiAgICAgICAgICAgIC8vCiAgICAgICAgdmFyIGN1c3RvbVNlbGVjdFNpemUgPSAkdGhpcy5oYXNDbGFzcyggJ3NtYWxsJyApICAgPyAnc21hbGwnICAgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMuaGFzQ2xhc3MoICdtZWRpdW0nICkgID8gJ21lZGl1bScgIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLmhhc0NsYXNzKCAnbGFyZ2UnICkgICA/ICdsYXJnZScgICA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy5oYXNDbGFzcyggJ2V4cGFuZCcgKSAgPyAnZXhwYW5kJyAgOiAnJwogICAgICAgIDsKICAgICAgICAvLwogICAgICAgIC8vIEJ1aWxkIG91ciBjdXN0b20gbGlzdC4KICAgICAgICAvLwogICAgICAgICRjdXN0b21TZWxlY3QgPSAkKCc8ZGl2IGNsYXNzPSInICsgWydjdXN0b20nLCAnZHJvcGRvd24nLCBjdXN0b21TZWxlY3RTaXplIF0uam9pbiggJyAnICkgKyAnIj48YSBocmVmPSIjIiBjbGFzcz0ic2VsZWN0b3IiPjwvYT48dWwgLz48L2Rpdj4nKTsKICAgICAgICAvLwogICAgICAgIC8vIEdyYWIgdGhlIHNlbGVjdG9yIGVsZW1lbnQKICAgICAgICAvLwogICAgICAgICRzZWxlY3RvciA9ICRjdXN0b21TZWxlY3QuZmluZCggIi5zZWxlY3RvciIgKTsKICAgICAgICAvLwogICAgICAgIC8vIEdyYWIgdGhlIHVub3JkZXJlZCBsaXN0IGVsZW1lbnQgZnJvbSB0aGUgY3VzdG9tIGxpc3QuCiAgICAgICAgLy8KICAgICAgICAkY3VzdG9tTGlzdCA9ICRjdXN0b21TZWxlY3QuZmluZCggInVsIiApOwogICAgICAgIC8vCiAgICAgICAgLy8gQnVpbGQgb3VyIDxsaT4gZWxlbWVudHMuCiAgICAgICAgLy8KICAgICAgICBsaUh0bWwgPSAkb3B0aW9ucy5tYXAoIGZ1bmN0aW9uKCkgeyByZXR1cm4gIjxsaT4iICsgJCggdGhpcyApLmh0bWwoKSArICI8L2xpPiI7IH0gKS5nZXQoKS5qb2luKCAnJyApOwogICAgICAgIC8vCiAgICAgICAgLy8gQXBwZW5kIG91ciA8bGk+IGVsZW1lbnRzIHRvIHRoZSBjdXN0b20gbGlzdCAoPHVsPikuCiAgICAgICAgLy8KICAgICAgICAkY3VzdG9tTGlzdC5hcHBlbmQoIGxpSHRtbCApOwogICAgICAgIC8vCiAgICAgICAgLy8gSW5zZXJ0IHRoZSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGxpc3QgaXRlbSBiZWZvcmUgYWxsIG90aGVyIGVsZW1lbnRzLgogICAgICAgIC8vIFRoZW4sIGZpbmQgdGhlIGVsZW1lbnQgYW5kIGFzc2lnbiBpdCB0byAkY3VycmVudFNlbGVjdC4KICAgICAgICAvLwoKICAgICAgICAkY3VycmVudFNlbGVjdCA9ICRjdXN0b21TZWxlY3QucHJlcGVuZCggJzxhIGhyZWY9IiMiIGNsYXNzPSJjdXJyZW50Ij4nICsgJHNlbGVjdGVkT3B0aW9uLmh0bWwoKSArICc8L2E+JyApLmZpbmQoICIuY3VycmVudCIgKTsKICAgICAgICAvLwogICAgICAgIC8vIEFkZCB0aGUgY3VzdG9tIHNlbGVjdCBlbGVtZW50IGFmdGVyIHRoZSA8c2VsZWN0PiBlbGVtZW50LgogICAgICAgIC8vCiAgICAgICAgJHRoaXMuYWZ0ZXIoICRjdXN0b21TZWxlY3QgKQogICAgICAgIC8vCiAgICAgICAgLy90aGVuIGhpZGUgdGhlIDxzZWxlY3Q+IGVsZW1lbnQuCiAgICAgICAgLy8KICAgICAgICAuaGlkZSgpOwoKICAgICAgfSBlbHNlIHsKICAgICAgICAvLwogICAgICAgIC8vIENyZWF0ZSBvdXIgbGlzdCBpdGVtIDxsaT4gZWxlbWVudHMuCiAgICAgICAgLy8KICAgICAgICBsaUh0bWwgPSAkb3B0aW9ucy5tYXAoIGZ1bmN0aW9uKCkgeyByZXR1cm4gIjxsaT4iICsgJCggdGhpcyApLmh0bWwoKSArICI8L2xpPiI7IH0gKS5nZXQoKS5qb2luKCAnJyApOwogICAgICAgIC8vCiAgICAgICAgLy8gUmVmcmVzaCB0aGUgdWwgd2l0aCBvcHRpb25zIGZyb20gdGhlIHNlbGVjdCBpbiBjYXNlIHRoZSBzdXBwbGllZCBtYXJrdXAgZG9lc24ndCBtYXRjaC4KICAgICAgICAvLyBDbGVhciB3aGF0J3MgY3VycmVudGx5IGluIHRoZSA8dWw+IGVsZW1lbnQuCiAgICAgICAgLy8KICAgICAgICAkY3VzdG9tTGlzdC5odG1sKCAnJyApCiAgICAgICAgLy8KICAgICAgICAvLyBQb3B1bGF0ZSB0aGUgbGlzdCBpdGVtIDxsaT4gZWxlbWVudHMuCiAgICAgICAgLy8KICAgICAgICAuYXBwZW5kKCBsaUh0bWwgKTsKCiAgICAgIH0gLy8gZW5kaWYgJGN1c3RvbVNlbGVjdC5sZW5ndGggPT09IDAKCiAgICAgIC8vCiAgICAgIC8vIERldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGUgY3VzdG9tIHNlbGVjdCBlbGVtZW50IHNob3VsZCBiZSBkaXNhYmxlZC4KICAgICAgLy8KICAgICAgJGN1c3RvbVNlbGVjdC50b2dnbGVDbGFzcyggJ2Rpc2FibGVkJywgJHRoaXMuaXMoICc6ZGlzYWJsZWQnICkgKTsKICAgICAgLy8KICAgICAgLy8gQ2FjaGUgb3VyIExpc3QgaXRlbSBlbGVtZW50cy4KICAgICAgLy8KICAgICAgJGxpc3RJdGVtcyA9ICRjdXN0b21MaXN0LmZpbmQoICdsaScgKTsKCiAgICAgIC8vCiAgICAgIC8vIERldGVybWluZSB3aGljaCBlbGVtZW50cyB0byBzZWxlY3QgaW4gb3VyIGN1c3RvbSBsaXN0LgogICAgICAvLwogICAgICAkb3B0aW9ucy5lYWNoKCBmdW5jdGlvbiAoIGluZGV4ICkgewoKICAgICAgICBpZiAoIHRoaXMuc2VsZWN0ZWQgKSB7CiAgICAgICAgICAvLwogICAgICAgICAgLy8gQWRkIHRoZSBzZWxlY3RlZCBjbGFzcyB0byB0aGUgY3VycmVudCBsaSBlbGVtZW50CiAgICAgICAgICAvLwogICAgICAgICAgJGxpc3RJdGVtcy5lcSggaW5kZXggKS5hZGRDbGFzcyggJ3NlbGVjdGVkJyApOwogICAgICAgICAgLy8KICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgY3VycmVudCBlbGVtZW50IHdpdGggdGhlIG9wdGlvbiB2YWx1ZS4KICAgICAgICAgIC8vCiAgICAgICAgICBpZiAoJGN1cnJlbnRTZWxlY3QpIHsKICAgICAgICAgICAgJGN1cnJlbnRTZWxlY3QuaHRtbCggJCggdGhpcyApLmh0bWwoKSApOwogICAgICAgICAgfQoKICAgICAgICB9CgogICAgICB9KTsKCiAgICAgIC8vCiAgICAgIC8vIFVwZGF0ZSB0aGUgY3VzdG9tIDx1bD4gbGlzdCB3aWR0aCBwcm9wZXJ0eS4KICAgICAgLy8KICAgICAgJGN1c3RvbUxpc3QuY3NzKCAnd2lkdGgnLCAnYXV0bycgKTsKICAgICAgLy8KICAgICAgLy8gU2V0IHRoZSBjdXN0b20gc2VsZWN0IHdpZHRoIHByb3BlcnR5LgogICAgICAvLwogICAgICAkY3VzdG9tU2VsZWN0LmNzcyggJ3dpZHRoJywgJ2F1dG8nICk7CgogICAgICAvLwogICAgICAvLyBJZiB3ZSdyZSBub3Qgc3BlY2lmeWluZyBhIHByZWRldGVybWluZWQgZm9ybSBzaXplLgogICAgICAvLwogICAgICBpZiAoICEkY3VzdG9tU2VsZWN0LmlzKCAnLnNtYWxsLCAubWVkaXVtLCAubGFyZ2UsIC5leHBhbmQnICkgKSB7CgogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIC8vIFRoaXMgaXMgYSB3b3JrLWFyb3VuZCBmb3Igd2hlbiBlbGVtZW50cyBhcmUgY29udGFpbmVkIHdpdGhpbiBoaWRkZW4gcGFyZW50cy4KICAgICAgICAvLyBGb3IgZXhhbXBsZSwgd2hlbiBjdXN0b20tZm9ybSBlbGVtZW50cyBhcmUgaW5zaWRlIG9mIGEgaGlkZGVuIHJldmVhbCBtb2RhbC4KICAgICAgICAvLwogICAgICAgIC8vIFdlIG5lZWQgdG8gZGlzcGxheSB0aGUgY3VycmVudCBjdXN0b20gbGlzdCBlbGVtZW50IGFzIHdlbGwgYXMgaGlkZGVuIHBhcmVudCBlbGVtZW50cwogICAgICAgIC8vIGluIG9yZGVyIHRvIHByb3Blcmx5IGNhbGN1bGF0ZSB0aGUgbGlzdCBpdGVtIGVsZW1lbnQncyB3aWR0aCBwcm9wZXJ0eS4KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAgIC8vCiAgICAgICAgLy8gU2hvdyB0aGUgZHJvcCBkb3duLgogICAgICAgIC8vIFRoaXMgc2hvdWxkIGVuc3VyZSB0aGF0IHRoZSBsaXN0IGl0ZW0ncyB3aWR0aCB2YWx1ZXMgYXJlIHByb3Blcmx5IGNhbGN1bGF0ZWQuCiAgICAgICAgLy8KICAgICAgICAkY3VzdG9tU2VsZWN0LmFkZENsYXNzKCAnb3BlbicgKTsKICAgICAgICAvLwogICAgICAgIC8vIFF1aWNrbHksIGRpc3BsYXkgYWxsIHBhcmVudCBlbGVtZW50cy4KICAgICAgICAvLyBUaGlzIHNob3VsZCBoZWxwIHVzIGNhbGN1YWxhdGUgdGhlIHdpZHRoIG9mIHRoZSBsaXN0IGl0ZW0ncyB3aXRoaW4gdGhlIGRyb3AgZG93bi4KICAgICAgICAvLwogICAgICAgIGhpZGRlbkZpeE9iai5hZGp1c3QoICRjdXN0b21MaXN0ICk7CiAgICAgICAgLy8KICAgICAgICAvLyBHcmFiIHRoZSBsYXJnZXN0IGxpc3QgaXRlbSB3aWR0aC4KICAgICAgICAvLwogICAgICAgIG1heFdpZHRoID0gKCAkbGlzdEl0ZW1zLm91dGVyV2lkdGgoKSA+IG1heFdpZHRoICkgPyAkbGlzdEl0ZW1zLm91dGVyV2lkdGgoKSA6IG1heFdpZHRoOwogICAgICAgIC8vCiAgICAgICAgLy8gT2theSwgbm93IHJlc2V0IHRoZSBwYXJlbnQgZWxlbWVudHMuCiAgICAgICAgLy8gVGhpcyB3aWxsIGhpZGUgdGhlbSBhZ2Fpbi4KICAgICAgICAvLwogICAgICAgIGhpZGRlbkZpeE9iai5yZXNldCgpOwogICAgICAgIC8vCiAgICAgICAgLy8gRmluYWxseSwgaGlkZSB0aGUgZHJvcCBkb3duLgogICAgICAgIC8vCiAgICAgICAgJGN1c3RvbVNlbGVjdC5yZW1vdmVDbGFzcyggJ29wZW4nICk7CiAgICAgICAgLy8KICAgICAgICAvLyBTZXQgdGhlIGN1c3RvbSBsaXN0IHdpZHRoLgogICAgICAgIC8vCiAgICAgICAgJGN1c3RvbVNlbGVjdC53aWR0aCggbWF4V2lkdGggKyAxOCk7CiAgICAgICAgLy8KICAgICAgICAvLyBTZXQgdGhlIGN1c3RvbSBsaXN0IGVsZW1lbnQgKDx1bCAvPikgd2lkdGguCiAgICAgICAgLy8KICAgICAgICAkY3VzdG9tTGlzdC53aWR0aCggIG1heFdpZHRoICsgMTYgKTsKCiAgICAgIH0gLy8gZW5kaWYKCiAgICB9CgogICAgJCgnZm9ybS5jdXN0b20gaW5wdXQ6cmFkaW9bZGF0YS1jdXN0b21mb3JtcyE9ZGlzYWJsZWRdJykuZWFjaChhcHBlbmRDdXN0b21NYXJrdXApOwogICAgJCgnZm9ybS5jdXN0b20gaW5wdXQ6Y2hlY2tib3hbZGF0YS1jdXN0b21mb3JtcyE9ZGlzYWJsZWRdJykuZWFjaChhcHBlbmRDdXN0b21NYXJrdXApOwogICAgJCgnZm9ybS5jdXN0b20gc2VsZWN0W2RhdGEtY3VzdG9tZm9ybXMhPWRpc2FibGVkXScpLmVhY2goYXBwZW5kQ3VzdG9tU2VsZWN0KTsKICB9OwoKICB2YXIgcmVmcmVzaEN1c3RvbVNlbGVjdCA9IGZ1bmN0aW9uKCRzZWxlY3QpIHsKICAgIHZhciBtYXhXaWR0aCA9IDAsCiAgICAgICAgJGN1c3RvbVNlbGVjdCA9ICRzZWxlY3QubmV4dCgpOwogICAgJG9wdGlvbnMgPSAkc2VsZWN0LmZpbmQoJ29wdGlvbicpOwogICAgJGN1c3RvbVNlbGVjdC5maW5kKCd1bCcpLmh0bWwoJycpOwoKICAgICRvcHRpb25zLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAkbGkgPSAkKCc8bGk+JyArICQodGhpcykuaHRtbCgpICsgJzwvbGk+Jyk7CiAgICAgICRjdXN0b21TZWxlY3QuZmluZCgndWwnKS5hcHBlbmQoJGxpKTsKICAgIH0pOwoKICAgIC8vIHJlLXBvcHVsYXRlCiAgICAkb3B0aW9ucy5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICBpZiAodGhpcy5zZWxlY3RlZCkgewogICAgICAgICRjdXN0b21TZWxlY3QuZmluZCgnbGknKS5lcShpbmRleCkuYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7CiAgICAgICAgJGN1c3RvbVNlbGVjdC5maW5kKCcuY3VycmVudCcpLmh0bWwoJCh0aGlzKS5odG1sKCkpOwogICAgICB9CiAgICB9KTsKCiAgICAvLyBmaXggd2lkdGgKICAgICRjdXN0b21TZWxlY3QucmVtb3ZlQXR0cignc3R5bGUnKQogICAgICAuZmluZCgndWwnKS5yZW1vdmVBdHRyKCdzdHlsZScpOwogICAgJGN1c3RvbVNlbGVjdC5maW5kKCdsaScpLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAkY3VzdG9tU2VsZWN0LmFkZENsYXNzKCdvcGVuJyk7CiAgICAgIGlmICgkKHRoaXMpLm91dGVyV2lkdGgoKSA+IG1heFdpZHRoKSB7CiAgICAgICAgbWF4V2lkdGggPSAkKHRoaXMpLm91dGVyV2lkdGgoKTsKICAgICAgfQogICAgICAkY3VzdG9tU2VsZWN0LnJlbW92ZUNsYXNzKCdvcGVuJyk7CiAgICB9KTsKICAgICRjdXN0b21TZWxlY3QuY3NzKCd3aWR0aCcsIG1heFdpZHRoICsgMTggKyAncHgnKTsKICAgICRjdXN0b21TZWxlY3QuZmluZCgndWwnKS5jc3MoJ3dpZHRoJywgbWF4V2lkdGggKyAxNiArICdweCcpOwoKICB9OwoKICB2YXIgdG9nZ2xlQ2hlY2tib3ggPSBmdW5jdGlvbigkZWxlbWVudCkgewogICAgdmFyICRpbnB1dCA9ICRlbGVtZW50LnByZXYoKSwKICAgICAgICBpbnB1dCA9ICRpbnB1dFswXTsKCiAgICBpZiAoZmFsc2UgPT09ICRpbnB1dC5pcygnOmRpc2FibGVkJykpIHsKICAgICAgICBpbnB1dC5jaGVja2VkID0gKChpbnB1dC5jaGVja2VkKSA/IGZhbHNlIDogdHJ1ZSk7CiAgICAgICAgJGVsZW1lbnQudG9nZ2xlQ2xhc3MoJ2NoZWNrZWQnKTsKCiAgICAgICAgJGlucHV0LnRyaWdnZXIoJ2NoYW5nZScpOwogICAgfQogIH07CgogIHZhciB0b2dnbGVSYWRpbyA9IGZ1bmN0aW9uKCRlbGVtZW50KSB7CiAgICB2YXIgJGlucHV0ID0gJGVsZW1lbnQucHJldigpLAogICAgICAgICRmb3JtID0gJGlucHV0LmNsb3Nlc3QoJ2Zvcm0uY3VzdG9tJyksCiAgICAgICAgaW5wdXQgPSAkaW5wdXRbMF07CgogICAgaWYgKGZhbHNlID09PSAkaW5wdXQuaXMoJzpkaXNhYmxlZCcpKSB7CiAgICAgICRmb3JtLmZpbmQoJ2lucHV0OnJhZGlvW25hbWU9IicgKyAkaW5wdXQuYXR0cignbmFtZScpICsgJyJdJykubmV4dCgpLm5vdCgkZWxlbWVudCkucmVtb3ZlQ2xhc3MoJ2NoZWNrZWQnKTsKICAgICAgaWYgKCAhJGVsZW1lbnQuaGFzQ2xhc3MoJ2NoZWNrZWQnKSApIHsKICAgICAgICAkZWxlbWVudC50b2dnbGVDbGFzcygnY2hlY2tlZCcpOwogICAgICB9CiAgICAgIGlucHV0LmNoZWNrZWQgPSAkZWxlbWVudC5oYXNDbGFzcygnY2hlY2tlZCcpOwoKICAgICAgJGlucHV0LnRyaWdnZXIoJ2NoYW5nZScpOwogICAgfQogIH07CgogICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICdmb3JtLmN1c3RvbSBzcGFuLmN1c3RvbS5jaGVja2JveCcsIGZ1bmN0aW9uIChldmVudCkgewogICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwoKICAgIHRvZ2dsZUNoZWNrYm94KCQodGhpcykpOwogIH0pOwoKICAkKGRvY3VtZW50KS5vbignY2xpY2snLCAnZm9ybS5jdXN0b20gc3Bhbi5jdXN0b20ucmFkaW8nLCBmdW5jdGlvbiAoZXZlbnQpIHsKICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICB0b2dnbGVSYWRpbygkKHRoaXMpKTsKICB9KTsKCiAgJChkb2N1bWVudCkub24oJ2NoYW5nZScsICdmb3JtLmN1c3RvbSBzZWxlY3RbZGF0YS1jdXN0b21mb3JtcyE9ZGlzYWJsZWRdJywgZnVuY3Rpb24gKGV2ZW50KSB7CiAgICByZWZyZXNoQ3VzdG9tU2VsZWN0KCQodGhpcykpOwogIH0pOwoKICAkKGRvY3VtZW50KS5vbignY2xpY2snLCAnZm9ybS5jdXN0b20gbGFiZWwnLCBmdW5jdGlvbiAoZXZlbnQpIHsKICAgIHZhciAkYXNzb2NpYXRlZEVsZW1lbnQgPSAkKCcjJyArICQodGhpcykuYXR0cignZm9yJykgKyAnW2RhdGEtY3VzdG9tZm9ybXMhPWRpc2FibGVkXScpLAogICAgICAgICRjdXN0b21DaGVja2JveCwKICAgICAgICAkY3VzdG9tUmFkaW87CiAgICBpZiAoJGFzc29jaWF0ZWRFbGVtZW50Lmxlbmd0aCAhPT0gMCkgewogICAgICBpZiAoJGFzc29jaWF0ZWRFbGVtZW50LmF0dHIoJ3R5cGUnKSA9PT0gJ2NoZWNrYm94JykgewogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgJGN1c3RvbUNoZWNrYm94ID0gJCh0aGlzKS5maW5kKCdzcGFuLmN1c3RvbS5jaGVja2JveCcpOwogICAgICAgIC8vdGhlIGNoZWNrYm94IG1pZ2h0IGJlIG91dHNpZGUgYWZ0ZXIgdGhlIGxhYmVsCiAgICAgICAgaWYgKCRjdXN0b21DaGVja2JveC5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAkY3VzdG9tQ2hlY2tib3ggPSAkKHRoaXMpLm5leHQoJ3NwYW4uY3VzdG9tLmNoZWNrYm94Jyk7CiAgICAgICAgfQogICAgICAgIC8vdGhlIGNoZWNrYm94IG1pZ2h0IGJlIG91dHNpZGUgYmVmb3JlIHRoZSBsYWJlbAogICAgICAgIGlmICgkY3VzdG9tQ2hlY2tib3gubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgJGN1c3RvbUNoZWNrYm94ID0gJCh0aGlzKS5wcmV2KCdzcGFuLmN1c3RvbS5jaGVja2JveCcpOwogICAgICAgIH0KICAgICAgICB0b2dnbGVDaGVja2JveCgkY3VzdG9tQ2hlY2tib3gpOwogICAgICB9IGVsc2UgaWYgKCRhc3NvY2lhdGVkRWxlbWVudC5hdHRyKCd0eXBlJykgPT09ICdyYWRpbycpIHsKICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICRjdXN0b21SYWRpbyA9ICQodGhpcykuZmluZCgnc3Bhbi5jdXN0b20ucmFkaW8nKTsKICAgICAgICAvL3RoZSByYWRpbyBtaWdodCBiZSBvdXRzaWRlIGFmdGVyIHRoZSBsYWJlbAogICAgICAgIGlmICgkY3VzdG9tUmFkaW8ubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgJGN1c3RvbVJhZGlvID0gJCh0aGlzKS5uZXh0KCdzcGFuLmN1c3RvbS5yYWRpbycpOwogICAgICAgIH0KICAgICAgICAvL3RoZSByYWRpbyBtaWdodCBiZSBvdXRzaWRlIGJlZm9yZSB0aGUgbGFiZWwKICAgICAgICBpZiAoJGN1c3RvbVJhZGlvLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICRjdXN0b21SYWRpbyA9ICQodGhpcykucHJldignc3Bhbi5jdXN0b20ucmFkaW8nKTsKICAgICAgICB9CiAgICAgICAgdG9nZ2xlUmFkaW8oJGN1c3RvbVJhZGlvKTsKICAgICAgfQogICAgfQogIH0pOwoKICAkKGRvY3VtZW50KS5vbignY2xpY2snLCAnZm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93biBhLmN1cnJlbnQsIGZvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24gYS5zZWxlY3RvcicsIGZ1bmN0aW9uIChldmVudCkgewogICAgdmFyICR0aGlzID0gJCh0aGlzKSwKICAgICAgICAkZHJvcGRvd24gPSAkdGhpcy5jbG9zZXN0KCdkaXYuY3VzdG9tLmRyb3Bkb3duJyksCiAgICAgICAgJHNlbGVjdCA9ICRkcm9wZG93bi5wcmV2KCk7CgogICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICQoJ2Rpdi5kcm9wZG93bicpLnJlbW92ZUNsYXNzKCdvcGVuJyk7CgogICAgaWYgKGZhbHNlID09PSAkc2VsZWN0LmlzKCc6ZGlzYWJsZWQnKSkgewogICAgICAgICRkcm9wZG93bi50b2dnbGVDbGFzcygnb3BlbicpOwoKICAgICAgICBpZiAoJGRyb3Bkb3duLmhhc0NsYXNzKCdvcGVuJykpIHsKICAgICAgICAgICQoZG9jdW1lbnQpLmJpbmQoJ2NsaWNrLmN1c3RvbWRyb3Bkb3duJywgZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgICAgICRkcm9wZG93bi5yZW1vdmVDbGFzcygnb3BlbicpOwogICAgICAgICAgICAkKGRvY3VtZW50KS51bmJpbmQoJy5jdXN0b21kcm9wZG93bicpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICQoZG9jdW1lbnQpLnVuYmluZCgnLmN1c3RvbWRyb3Bkb3duJyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9KTsKCiAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJ2Zvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24gbGknLCBmdW5jdGlvbiAoZXZlbnQpIHsKICAgIHZhciAkdGhpcyA9ICQodGhpcyksCiAgICAgICAgJGN1c3RvbURyb3Bkb3duID0gJHRoaXMuY2xvc2VzdCgnZGl2LmN1c3RvbS5kcm9wZG93bicpLAogICAgICAgICRzZWxlY3QgPSAkY3VzdG9tRHJvcGRvd24ucHJldigpLAogICAgICAgIHNlbGVjdGVkSW5kZXggPSAwOwoKICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICQoJ2Rpdi5kcm9wZG93bicpLnJlbW92ZUNsYXNzKCdvcGVuJyk7CgogICAgJHRoaXMKICAgICAgLmNsb3Nlc3QoJ3VsJykKICAgICAgLmZpbmQoJ2xpJykKICAgICAgLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpOwogICAgJHRoaXMuYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7CgogICAgJGN1c3RvbURyb3Bkb3duCiAgICAgIC5yZW1vdmVDbGFzcygnb3BlbicpCiAgICAgIC5maW5kKCdhLmN1cnJlbnQnKQogICAgICAuaHRtbCgkdGhpcy5odG1sKCkpOwoKICAgICR0aGlzLmNsb3Nlc3QoJ3VsJykuZmluZCgnbGknKS5lYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICBpZiAoJHRoaXNbMF0gPT0gdGhpcykgewogICAgICAgIHNlbGVjdGVkSW5kZXggPSBpbmRleDsKICAgICAgfQoKICAgIH0pOwogICAgJHNlbGVjdFswXS5zZWxlY3RlZEluZGV4ID0gc2VsZWN0ZWRJbmRleDsKCiAgICAkc2VsZWN0LnRyaWdnZXIoJ2NoYW5nZScpOwogIH0pOwoKCiAgJC5mbi5mb3VuZGF0aW9uQ3VzdG9tRm9ybXMgPSAkLmZvdW5kYXRpb24uY3VzdG9tRm9ybXMuYXBwZW5kQ3VzdG9tTWFya3VwOwoKfSkoIGpRdWVyeSApOwo=]]></data>
	</file>
	<file>
	  <filename>/assets/javascripts/jquery.foundation.joyride.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IEZvdW5kYXRpb24gSm95cmlkZSBQbHVnaW4gMi4wLjMKICogaHR0cDovL2ZvdW5kYXRpb24uenVyYi5jb20KICogQ29weXJpZ2h0IDIwMTIsIFpVUkIKICogRnJlZSB0byB1c2UgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAoqLwoKLypqc2xpbnQgdW5wYXJhbTogdHJ1ZSwgYnJvd3NlcjogdHJ1ZSwgaW5kZW50OiAyICovCgo7KGZ1bmN0aW9uICgkLCB3aW5kb3csIHVuZGVmaW5lZCkgewogICd1c2Ugc3RyaWN0JzsKCiAgdmFyIGRlZmF1bHRzID0gewogICAgICAndmVyc2lvbicgICAgICAgICAgICAgIDogJzIuMC4zJywKICAgICAgJ3RpcExvY2F0aW9uJyAgICAgICAgICA6ICdib3R0b20nLCAgLy8gJ3RvcCcgb3IgJ2JvdHRvbScgaW4gcmVsYXRpb24gdG8gcGFyZW50CiAgICAgICdudWJQb3NpdGlvbicgICAgICAgICAgOiAnYXV0bycsICAgIC8vIG92ZXJyaWRlIG9uIGEgcGVyIHRvb2x0aXAgYmFzZXMKICAgICAgJ3Njcm9sbFNwZWVkJyAgICAgICAgICA6IDMwMCwgICAgICAgLy8gUGFnZSBzY3JvbGxpbmcgc3BlZWQgaW4gbWlsbGlzZWNvbmRzCiAgICAgICd0aW1lcicgICAgICAgICAgICAgICAgOiAwLCAgICAgICAgIC8vIDAgPSBubyB0aW1lciAsIGFsbCBvdGhlciBudW1iZXJzID0gdGltZXIgaW4gbWlsbGlzZWNvbmRzCiAgICAgICdzdGFydFRpbWVyT25DbGljaycgICAgOiB0cnVlLCAgICAgIC8vIHRydWUgb3IgZmFsc2UgLSB0cnVlIHJlcXVpcmVzIGNsaWNraW5nIHRoZSBmaXJzdCBidXR0b24gc3RhcnQgdGhlIHRpbWVyCiAgICAgICdzdGFydE9mZnNldCcgICAgICAgICAgOiAwLCAgICAgICAgIC8vIHRoZSBpbmRleCBvZiB0aGUgdG9vbHRpcCB5b3Ugd2FudCB0byBzdGFydCBvbiAoaW5kZXggb2YgdGhlIGxpKQogICAgICAnbmV4dEJ1dHRvbicgICAgICAgICAgIDogdHJ1ZSwgICAgICAvLyB0cnVlIG9yIGZhbHNlIHRvIGNvbnRyb2wgd2hldGhlciBhIG5leHQgYnV0dG9uIGlzIHVzZWQKICAgICAgJ3RpcEFuaW1hdGlvbicgICAgICAgICA6ICdmYWRlJywgICAgLy8gJ3BvcCcgb3IgJ2ZhZGUnIGluIGVhY2ggdGlwCiAgICAgICdwYXVzZUFmdGVyJyAgICAgICAgICAgOiBbXSwgICAgICAgIC8vIGFycmF5IG9mIGluZGV4ZXMgd2hlcmUgdG8gcGF1c2UgdGhlIHRvdXIgYWZ0ZXIKICAgICAgJ3RpcEFuaW1hdGlvbkZhZGVTcGVlZCc6IDMwMCwgICAgICAgLy8gd2hlbiB0aXBBbmltYXRpb24gPSAnZmFkZScgdGhpcyBpcyBzcGVlZCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSB0cmFuc2l0aW9uCiAgICAgICdjb29raWVNb25zdGVyJyAgICAgICAgOiBmYWxzZSwgICAgIC8vIHRydWUgb3IgZmFsc2UgdG8gY29udHJvbCB3aGV0aGVyIGNvb2tpZXMgYXJlIHVzZWQKICAgICAgJ2Nvb2tpZU5hbWUnICAgICAgICAgICA6ICdqb3lyaWRlJywgLy8gTmFtZSB0aGUgY29va2llIHlvdSdsbCB1c2UKICAgICAgJ2Nvb2tpZURvbWFpbicgICAgICAgICA6IGZhbHNlLCAgICAgLy8gV2lsbCB0aGlzIGNvb2tpZSBiZSBhdHRhY2hlZCB0byBhIGRvbWFpbiwgaWUuICcubm90YWJsZWFwcC5jb20nCiAgICAgICd0aXBDb250YWluZXInICAgICAgICAgOiAnYm9keScsICAgIC8vIFdoZXJlIHdpbGwgdGhlIHRpcCBiZSBhdHRhY2hlZAogICAgICAncG9zdFJpZGVDYWxsYmFjaycgICAgIDogJC5ub29wLCAgICAvLyBBIG1ldGhvZCB0byBjYWxsIG9uY2UgdGhlIHRvdXIgY2xvc2VzIChjYW5jZWxlZCBvciBjb21wbGV0ZSkKICAgICAgJ3Bvc3RTdGVwQ2FsbGJhY2snICAgICA6ICQubm9vcCwgICAgLy8gQSBtZXRob2QgdG8gY2FsbCBhZnRlciBlYWNoIHN0ZXAKICAgICAgJ3RlbXBsYXRlJyA6IHsgLy8gSFRNTCBzZWdtZW50cyBmb3IgdGlwIGxheW91dAogICAgICAgICdsaW5rJyAgICA6ICc8YSBocmVmPSIjY2xvc2UiIGNsYXNzPSJqb3lyaWRlLWNsb3NlLXRpcCI+WDwvYT4nLAogICAgICAgICd0aW1lcicgICA6ICc8ZGl2IGNsYXNzPSJqb3lyaWRlLXRpbWVyLWluZGljYXRvci13cmFwIj48c3BhbiBjbGFzcz0iam95cmlkZS10aW1lci1pbmRpY2F0b3IiPjwvc3Bhbj48L2Rpdj4nLAogICAgICAgICd0aXAnICAgICA6ICc8ZGl2IGNsYXNzPSJqb3lyaWRlLXRpcC1ndWlkZSI+PHNwYW4gY2xhc3M9ImpveXJpZGUtbnViIj48L3NwYW4+PC9kaXY+JywKICAgICAgICAnd3JhcHBlcicgOiAnPGRpdiBjbGFzcz0iam95cmlkZS1jb250ZW50LXdyYXBwZXIiPjwvZGl2PicsCiAgICAgICAgJ2J1dHRvbicgIDogJzxhIGhyZWY9IiMiIGNsYXNzPSJzbWFsbCBidXR0b24gam95cmlkZS1uZXh0LXRpcCI+PC9hPicKICAgICAgfQogICAgfSwKCiAgICBNb2Rlcm5penIgPSBNb2Rlcm5penIgfHwgZmFsc2UsCgogICAgc2V0dGluZ3MgPSB7fSwKCiAgICBtZXRob2RzID0gewoKICAgICAgaW5pdCA6IGZ1bmN0aW9uIChvcHRzKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7CgogICAgICAgICAgaWYgKCQuaXNFbXB0eU9iamVjdChzZXR0aW5ncykpIHsKICAgICAgICAgICAgc2V0dGluZ3MgPSAkLmV4dGVuZCh0cnVlLCBkZWZhdWx0cywgb3B0cyk7CgogICAgICAgICAgICAvLyBub24gY29uZmlndXJhYmxlIHNldHRpbmdzCiAgICAgICAgICAgIHNldHRpbmdzLmRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50OwogICAgICAgICAgICBzZXR0aW5ncy4kZG9jdW1lbnQgPSAkKHNldHRpbmdzLmRvY3VtZW50KTsKICAgICAgICAgICAgc2V0dGluZ3MuJHdpbmRvdyA9ICQod2luZG93KTsKICAgICAgICAgICAgc2V0dGluZ3MuJGNvbnRlbnRfZWwgPSAkKHRoaXMpOwogICAgICAgICAgICBzZXR0aW5ncy5ib2R5X29mZnNldCA9ICQoc2V0dGluZ3MudGlwQ29udGFpbmVyKS5wb3NpdGlvbigpOwogICAgICAgICAgICBzZXR0aW5ncy4kdGlwX2NvbnRlbnQgPSAkKCc+IGxpJywgc2V0dGluZ3MuJGNvbnRlbnRfZWwpOwogICAgICAgICAgICBzZXR0aW5ncy5wYXVzZWQgPSBmYWxzZTsKICAgICAgICAgICAgc2V0dGluZ3MuYXR0ZW1wdHMgPSAwOwoKICAgICAgICAgICAgc2V0dGluZ3MudGlwTG9jYXRpb25QYXR0ZXJucyA9IHsKICAgICAgICAgICAgICB0b3A6IFsnYm90dG9tJ10sCiAgICAgICAgICAgICAgYm90dG9tOiBbXSwgLy8gYm90dG9tIHNob3VsZCBub3QgbmVlZCB0byBiZSByZXBvc2l0aW9uZWQKICAgICAgICAgICAgICBsZWZ0OiBbJ3JpZ2h0JywgJ3RvcCcsICdib3R0b20nXSwKICAgICAgICAgICAgICByaWdodDogWydsZWZ0JywgJ3RvcCcsICdib3R0b20nXQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gYXJlIHdlIHVzaW5nIGpRdWVyeSAxLjcrCiAgICAgICAgICAgIG1ldGhvZHMuanF1ZXJ5X2NoZWNrKCk7CgogICAgICAgICAgICAvLyBjYW4gd2UgY3JlYXRlIGNvb2tpZXM/CiAgICAgICAgICAgIGlmICghJC5pc0Z1bmN0aW9uKCQuY29va2llKSkgewogICAgICAgICAgICAgIHNldHRpbmdzLmNvb2tpZU1vbnN0ZXIgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZ2VuZXJhdGUgdGhlIHRpcHMgYW5kIGluc2VydCBpbnRvIGRvbS4KICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy5jb29raWVNb25zdGVyIHx8ICEkLmNvb2tpZShzZXR0aW5ncy5jb29raWVOYW1lKSkgewoKICAgICAgICAgICAgICBzZXR0aW5ncy4kdGlwX2NvbnRlbnQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgIG1ldGhvZHMuY3JlYXRlKHskbGkgOiAkKHRoaXMpLCBpbmRleCA6IGluZGV4fSk7CiAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgIC8vIHNob3cgZmlyc3QgdGlwCiAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy5zdGFydFRpbWVyT25DbGljayAmJiBzZXR0aW5ncy50aW1lciA+IDApIHsKICAgICAgICAgICAgICAgIG1ldGhvZHMuc2hvdygnaW5pdCcpOwogICAgICAgICAgICAgICAgbWV0aG9kcy5zdGFydFRpbWVyKCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG1ldGhvZHMuc2hvdygnaW5pdCcpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNldHRpbmdzLiRkb2N1bWVudC5vbignY2xpY2suam95cmlkZScsICcuam95cmlkZS1uZXh0LXRpcCwgLmpveXJpZGUtbW9kYWwtYmcnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLiRsaS5uZXh0KCkubGVuZ3RoIDwgMSkgewogICAgICAgICAgICAgICAgbWV0aG9kcy5lbmQoKTsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNldHRpbmdzLnRpbWVyID4gMCkgewogICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHNldHRpbmdzLmF1dG9tYXRlKTsKICAgICAgICAgICAgICAgIG1ldGhvZHMuaGlkZSgpOwogICAgICAgICAgICAgICAgbWV0aG9kcy5zaG93KCk7CiAgICAgICAgICAgICAgICBtZXRob2RzLnN0YXJ0VGltZXIoKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbWV0aG9kcy5oaWRlKCk7CiAgICAgICAgICAgICAgICBtZXRob2RzLnNob3coKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHNldHRpbmdzLiRkb2N1bWVudC5vbignY2xpY2suam95cmlkZScsICcuam95cmlkZS1jbG9zZS10aXAnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICBtZXRob2RzLmVuZCgpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHNldHRpbmdzLiR3aW5kb3cuYmluZCgncmVzaXplLmpveXJpZGUnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgIGlmIChtZXRob2RzLmlzX3Bob25lKCkpIHsKICAgICAgICAgICAgICAgIG1ldGhvZHMucG9zX3Bob25lKCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG1ldGhvZHMucG9zX2RlZmF1bHQoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbWV0aG9kcy5yZXN0YXJ0KCk7CiAgICAgICAgICB9CgogICAgICAgIH0pOwogICAgICB9LAoKICAgICAgLy8gY2FsbCB0aGlzIG1ldGhvZCB3aGVuIHlvdSB3YW50IHRvIHJlc3VtZSB0aGUgdG91cgogICAgICByZXN1bWUgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgbWV0aG9kcy5zZXRfbGkoKTsKICAgICAgICBtZXRob2RzLnNob3coKTsKICAgICAgfSwKCiAgICAgIHRpcF90ZW1wbGF0ZSA6IGZ1bmN0aW9uIChvcHRzKSB7CiAgICAgICAgdmFyICRibGFuaywgY29udGVudDsKCiAgICAgICAgb3B0cy50aXBfY2xhc3MgPSBvcHRzLnRpcF9jbGFzcyB8fCAnJzsKCiAgICAgICAgJGJsYW5rID0gJChzZXR0aW5ncy50ZW1wbGF0ZS50aXApLmFkZENsYXNzKG9wdHMudGlwX2NsYXNzKTsKICAgICAgICBjb250ZW50ID0gJC50cmltKCQob3B0cy5saSkuaHRtbCgpKSArCiAgICAgICAgICBtZXRob2RzLmJ1dHRvbl90ZXh0KG9wdHMuYnV0dG9uX3RleHQpICsKICAgICAgICAgIHNldHRpbmdzLnRlbXBsYXRlLmxpbmsgKwogICAgICAgICAgbWV0aG9kcy50aW1lcl9pbnN0YW5jZShvcHRzLmluZGV4KTsKCiAgICAgICAgJGJsYW5rLmFwcGVuZCgkKHNldHRpbmdzLnRlbXBsYXRlLndyYXBwZXIpKTsKICAgICAgICAkYmxhbmsuZmlyc3QoKS5hdHRyKCdkYXRhLWluZGV4Jywgb3B0cy5pbmRleCk7CiAgICAgICAgJCgnLmpveXJpZGUtY29udGVudC13cmFwcGVyJywgJGJsYW5rKS5hcHBlbmQoY29udGVudCk7CgogICAgICAgIHJldHVybiAkYmxhbmtbMF07CiAgICAgIH0sCgogICAgICB0aW1lcl9pbnN0YW5jZSA6IGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgIHZhciB0eHQ7CgogICAgICAgIGlmICgoaW5kZXggPT09IDAgJiYgc2V0dGluZ3Muc3RhcnRUaW1lck9uQ2xpY2sgJiYgc2V0dGluZ3MudGltZXIgPiAwKSB8fCBzZXR0aW5ncy50aW1lciA9PT0gMCkgewogICAgICAgICAgdHh0ID0gJyc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHR4dCA9IG1ldGhvZHMub3V0ZXJIVE1MKCQoc2V0dGluZ3MudGVtcGxhdGUudGltZXIpWzBdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHR4dDsKICAgICAgfSwKCiAgICAgIGJ1dHRvbl90ZXh0IDogZnVuY3Rpb24gKHR4dCkgewogICAgICAgIGlmIChzZXR0aW5ncy5uZXh0QnV0dG9uKSB7CiAgICAgICAgICB0eHQgPSAkLnRyaW0odHh0KSB8fCAnTmV4dCc7CiAgICAgICAgICB0eHQgPSBtZXRob2RzLm91dGVySFRNTCgkKHNldHRpbmdzLnRlbXBsYXRlLmJ1dHRvbikuYXBwZW5kKHR4dClbMF0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0eHQgPSAnJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHR4dDsKICAgICAgfSwKCiAgICAgIGNyZWF0ZSA6IGZ1bmN0aW9uIChvcHRzKSB7CiAgICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBkYXRhLXRleHQgYXR0cmlidXRlCiAgICAgICAgdmFyIGJ1dHRvblRleHQgPSBvcHRzLiRsaS5hdHRyKCdkYXRhLWJ1dHRvbicpIHx8IG9wdHMuJGxpLmF0dHIoJ2RhdGEtdGV4dCcpLAogICAgICAgICAgdGlwQ2xhc3MgPSBvcHRzLiRsaS5hdHRyKCdjbGFzcycpLAogICAgICAgICAgJHRpcF9jb250ZW50ID0gJChtZXRob2RzLnRpcF90ZW1wbGF0ZSh7CiAgICAgICAgICAgIHRpcF9jbGFzcyA6IHRpcENsYXNzLAogICAgICAgICAgICBpbmRleCA6IG9wdHMuaW5kZXgsCiAgICAgICAgICAgIGJ1dHRvbl90ZXh0IDogYnV0dG9uVGV4dCwKICAgICAgICAgICAgbGkgOiBvcHRzLiRsaQogICAgICAgICAgfSkpOwoKICAgICAgICAkKHNldHRpbmdzLnRpcENvbnRhaW5lcikuYXBwZW5kKCR0aXBfY29udGVudCk7CiAgICAgIH0sCgogICAgICBzaG93IDogZnVuY3Rpb24gKGluaXQpIHsKICAgICAgICB2YXIgb3B0cyA9IHt9LCBpaSwgb3B0c19hcnIgPSBbXSwgb3B0c19sZW4gPSAwLCBwLAogICAgICAgICAgICAkdGltZXIgPSBudWxsOwoKICAgICAgICAvLyBhcmUgd2UgcGF1c2VkPwogICAgICAgIGlmIChzZXR0aW5ncy4kbGkgPT09IHVuZGVmaW5lZCB8fCAoJC5pbkFycmF5KHNldHRpbmdzLiRsaS5pbmRleCgpLCBzZXR0aW5ncy5wYXVzZUFmdGVyKSA9PT0gLTEpKSB7CgogICAgICAgICAgLy8gZG9uJ3QgZ28gdG8gdGhlIG5leHQgbGkgaWYgdGhlIHRvdXIgd2FzIHBhdXNlZAogICAgICAgICAgaWYgKHNldHRpbmdzLnBhdXNlZCkgewogICAgICAgICAgICBzZXR0aW5ncy5wYXVzZWQgPSBmYWxzZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG1ldGhvZHMuc2V0X2xpKGluaXQpOwogICAgICAgICAgfQoKICAgICAgICAgIHNldHRpbmdzLmF0dGVtcHRzID0gMDsKCiAgICAgICAgICBpZiAoc2V0dGluZ3MuJGxpLmxlbmd0aCAmJiBzZXR0aW5ncy4kdGFyZ2V0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgb3B0c19hcnIgPSAoc2V0dGluZ3MuJGxpLmRhdGEoJ29wdGlvbnMnKSB8fCAnOicpLnNwbGl0KCc7Jyk7CiAgICAgICAgICAgIG9wdHNfbGVuID0gb3B0c19hcnIubGVuZ3RoOwoKICAgICAgICAgICAgLy8gcGFyc2Ugb3B0aW9ucwogICAgICAgICAgICBmb3IgKGlpID0gb3B0c19sZW4gLSAxOyBpaSA+PSAwOyBpaS0tKSB7CiAgICAgICAgICAgICAgcCA9IG9wdHNfYXJyW2lpXS5zcGxpdCgnOicpOwoKICAgICAgICAgICAgICBpZiAocC5sZW5ndGggPT09IDIpIHsKICAgICAgICAgICAgICAgIG9wdHNbJC50cmltKHBbMF0pXSA9ICQudHJpbShwWzFdKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNldHRpbmdzLnRpcFNldHRpbmdzID0gJC5leHRlbmQoe30sIHNldHRpbmdzLCBvcHRzKTsKCiAgICAgICAgICAgIHNldHRpbmdzLnRpcFNldHRpbmdzLnRpcExvY2F0aW9uUGF0dGVybiA9IHNldHRpbmdzLnRpcExvY2F0aW9uUGF0dGVybnNbc2V0dGluZ3MudGlwU2V0dGluZ3MudGlwTG9jYXRpb25dOwoKICAgICAgICAgICAgLy8gc2Nyb2xsIGlmIG5vdCBtb2RhbAogICAgICAgICAgICBpZiAoIS9ib2R5L2kudGVzdChzZXR0aW5ncy4kdGFyZ2V0LnNlbGVjdG9yKSkgewogICAgICAgICAgICAgIG1ldGhvZHMuc2Nyb2xsX3RvKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChtZXRob2RzLmlzX3Bob25lKCkpIHsKICAgICAgICAgICAgICBtZXRob2RzLnBvc19waG9uZSh0cnVlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBtZXRob2RzLnBvc19kZWZhdWx0KHRydWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGltZXIgPSAkKCcuam95cmlkZS10aW1lci1pbmRpY2F0b3InLCBzZXR0aW5ncy4kbmV4dF90aXApOwoKICAgICAgICAgICAgaWYgKC9wb3AvaS50ZXN0KHNldHRpbmdzLnRpcEFuaW1hdGlvbikpIHsKCiAgICAgICAgICAgICAgJHRpbWVyLm91dGVyV2lkdGgoMCk7CgogICAgICAgICAgICAgIGlmIChzZXR0aW5ncy50aW1lciA+IDApIHsKCiAgICAgICAgICAgICAgICBzZXR0aW5ncy4kbmV4dF90aXAuc2hvdygpOwogICAgICAgICAgICAgICAgJHRpbWVyLmFuaW1hdGUoewogICAgICAgICAgICAgICAgICB3aWR0aDogJCgnLmpveXJpZGUtdGltZXItaW5kaWNhdG9yLXdyYXAnLCBzZXR0aW5ncy4kbmV4dF90aXApLm91dGVyV2lkdGgoKQogICAgICAgICAgICAgICAgfSwgc2V0dGluZ3MudGltZXIpOwoKICAgICAgICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgICAgIHNldHRpbmdzLiRuZXh0X3RpcC5zaG93KCk7CgogICAgICAgICAgICAgIH0KCgogICAgICAgICAgICB9IGVsc2UgaWYgKC9mYWRlL2kudGVzdChzZXR0aW5ncy50aXBBbmltYXRpb24pKSB7CgogICAgICAgICAgICAgICR0aW1lci5vdXRlcldpZHRoKDApOwoKICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MudGltZXIgPiAwKSB7CgogICAgICAgICAgICAgICAgc2V0dGluZ3MuJG5leHRfdGlwLmZhZGVJbihzZXR0aW5ncy50aXBBbmltYXRpb25GYWRlU3BlZWQpOwoKICAgICAgICAgICAgICAgIHNldHRpbmdzLiRuZXh0X3RpcC5zaG93KCk7CiAgICAgICAgICAgICAgICAkdGltZXIuYW5pbWF0ZSh7CiAgICAgICAgICAgICAgICAgIHdpZHRoOiAkKCcuam95cmlkZS10aW1lci1pbmRpY2F0b3Itd3JhcCcsIHNldHRpbmdzLiRuZXh0X3RpcCkub3V0ZXJXaWR0aCgpCiAgICAgICAgICAgICAgICB9LCBzZXR0aW5ncy50aW1lcik7CgogICAgICAgICAgICAgIH0gZWxzZSB7CgogICAgICAgICAgICAgICAgc2V0dGluZ3MuJG5leHRfdGlwLmZhZGVJbihzZXR0aW5ncy50aXBBbmltYXRpb25GYWRlU3BlZWQpOwoKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNldHRpbmdzLiRjdXJyZW50X3RpcCA9IHNldHRpbmdzLiRuZXh0X3RpcDsKCiAgICAgICAgICAvLyBza2lwIG5vbi1leGlzdGVudCB0YXJnZXRzCiAgICAgICAgICB9IGVsc2UgaWYgKHNldHRpbmdzLiRsaSAmJiBzZXR0aW5ncy4kdGFyZ2V0Lmxlbmd0aCA8IDEpIHsKCiAgICAgICAgICAgIG1ldGhvZHMuc2hvdygpOwoKICAgICAgICAgIH0gZWxzZSB7CgogICAgICAgICAgICBtZXRob2RzLmVuZCgpOwoKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewoKICAgICAgICAgIHNldHRpbmdzLnBhdXNlZCA9IHRydWU7CgogICAgICAgIH0KCiAgICAgIH0sCgogICAgICAvLyBkZXRlY3QgcGhvbmVzIHdpdGggbWVkaWEgcXVlcmllcyBpZiBzdXBwb3J0ZWQuCiAgICAgIGlzX3Bob25lIDogZnVuY3Rpb24gKCkgewogICAgICAgIGlmIChNb2Rlcm5penIpIHsKICAgICAgICAgIHJldHVybiBNb2Rlcm5penIubXEoJ29ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjdweCknKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAoc2V0dGluZ3MuJHdpbmRvdy53aWR0aCgpIDwgNzY3KSA/IHRydWUgOiBmYWxzZTsKICAgICAgfSwKCiAgICAgIGhpZGUgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgc2V0dGluZ3MucG9zdFN0ZXBDYWxsYmFjayhzZXR0aW5ncy4kbGkuaW5kZXgoKSwgc2V0dGluZ3MuJGN1cnJlbnRfdGlwKTsKICAgICAgICAkKCcuam95cmlkZS1tb2RhbC1iZycpLmhpZGUoKTsKICAgICAgICBzZXR0aW5ncy4kY3VycmVudF90aXAuaGlkZSgpOwogICAgICB9LAoKICAgICAgc2V0X2xpIDogZnVuY3Rpb24gKGluaXQpIHsKICAgICAgICBpZiAoaW5pdCkgewogICAgICAgICAgc2V0dGluZ3MuJGxpID0gc2V0dGluZ3MuJHRpcF9jb250ZW50LmVxKHNldHRpbmdzLnN0YXJ0T2Zmc2V0KTsKICAgICAgICAgIG1ldGhvZHMuc2V0X25leHRfdGlwKCk7CiAgICAgICAgICBzZXR0aW5ncy4kY3VycmVudF90aXAgPSBzZXR0aW5ncy4kbmV4dF90aXA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNldHRpbmdzLiRsaSA9IHNldHRpbmdzLiRsaS5uZXh0KCk7CiAgICAgICAgICBtZXRob2RzLnNldF9uZXh0X3RpcCgpOwogICAgICAgIH0KCiAgICAgICAgbWV0aG9kcy5zZXRfdGFyZ2V0KCk7CiAgICAgIH0sCgogICAgICBzZXRfbmV4dF90aXAgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgc2V0dGluZ3MuJG5leHRfdGlwID0gJCgnLmpveXJpZGUtdGlwLWd1aWRlW2RhdGEtaW5kZXg9JyArIHNldHRpbmdzLiRsaS5pbmRleCgpICsgJ10nKTsKICAgICAgfSwKCiAgICAgIHNldF90YXJnZXQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGNsID0gc2V0dGluZ3MuJGxpLmF0dHIoJ2RhdGEtY2xhc3MnKSwKICAgICAgICAgICAgaWQgPSBzZXR0aW5ncy4kbGkuYXR0cignZGF0YS1pZCcpLAogICAgICAgICAgICAkc2VsID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIGlmIChpZCkgewogICAgICAgICAgICAgICAgcmV0dXJuICQoc2V0dGluZ3MuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpKTsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJCgnLicgKyBjbCkuZmlyc3QoKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICQoJ2JvZHknKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgIHNldHRpbmdzLiR0YXJnZXQgPSAkc2VsKCk7CiAgICAgIH0sCgogICAgICBzY3JvbGxfdG8gOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIHdpbmRvd19oYWxmLCB0aXBPZmZzZXQ7CgogICAgICAgIHdpbmRvd19oYWxmID0gc2V0dGluZ3MuJHdpbmRvdy5oZWlnaHQoKSAvIDI7CiAgICAgICAgdGlwT2Zmc2V0ID0gTWF0aC5jZWlsKHNldHRpbmdzLiR0YXJnZXQub2Zmc2V0KCkudG9wIC0gd2luZG93X2hhbGYgKyBzZXR0aW5ncy4kbmV4dF90aXAub3V0ZXJIZWlnaHQoKSk7CgogICAgICAgICQoImh0bWwsIGJvZHkiKS5zdG9wKCkuYW5pbWF0ZSh7CiAgICAgICAgICBzY3JvbGxUb3A6IHRpcE9mZnNldAogICAgICAgIH0sIHNldHRpbmdzLnNjcm9sbFNwZWVkKTsKICAgICAgfSwKCiAgICAgIHBhdXNlZCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoKCQuaW5BcnJheSgoc2V0dGluZ3MuJGxpLmluZGV4KCkgKyAxKSwgc2V0dGluZ3MucGF1c2VBZnRlcikgPT09IC0xKSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0sCgogICAgICBkZXN0cm95IDogZnVuY3Rpb24gKCkgewogICAgICAgIHNldHRpbmdzLiRkb2N1bWVudC5vZmYoJy5qb3lyaWRlJyk7CiAgICAgICAgJCh3aW5kb3cpLm9mZignLmpveXJpZGUnKTsKICAgICAgICAkKCcuam95cmlkZS1jbG9zZS10aXAsIC5qb3lyaWRlLW5leHQtdGlwLCAuam95cmlkZS1tb2RhbC1iZycpLm9mZignLmpveXJpZGUnKTsKICAgICAgICAkKCcuam95cmlkZS10aXAtZ3VpZGUsIC5qb3lyaWRlLW1vZGFsLWJnJykucmVtb3ZlKCk7CiAgICAgICAgY2xlYXJUaW1lb3V0KHNldHRpbmdzLmF1dG9tYXRlKTsKICAgICAgICBzZXR0aW5ncyA9IHt9OwogICAgICB9LAoKICAgICAgcmVzdGFydCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICBtZXRob2RzLmhpZGUoKTsKICAgICAgICBzZXR0aW5ncy4kbGkgPSB1bmRlZmluZWQ7CiAgICAgICAgbWV0aG9kcy5zaG93KCdpbml0Jyk7CiAgICAgIH0sCgogICAgICBwb3NfZGVmYXVsdCA6IGZ1bmN0aW9uIChpbml0KSB7CiAgICAgICAgdmFyIGhhbGZfZm9sZCA9IE1hdGguY2VpbChzZXR0aW5ncy4kd2luZG93LmhlaWdodCgpIC8gMiksCiAgICAgICAgICAgIHRpcF9wb3NpdGlvbiA9IHNldHRpbmdzLiRuZXh0X3RpcC5vZmZzZXQoKSwKICAgICAgICAgICAgJG51YiA9ICQoJy5qb3lyaWRlLW51YicsIHNldHRpbmdzLiRuZXh0X3RpcCksCiAgICAgICAgICAgIG51Yl9oZWlnaHQgPSBNYXRoLmNlaWwoJG51Yi5vdXRlckhlaWdodCgpIC8gMiksCiAgICAgICAgICAgIHRvZ2dsZSA9IGluaXQgfHwgZmFsc2U7CgogICAgICAgIC8vIHRpcCBtdXN0IG5vdCBiZSAiZGlzcGxheTogbm9uZSIgdG8gY2FsY3VsYXRlIHBvc2l0aW9uCiAgICAgICAgaWYgKHRvZ2dsZSkgewogICAgICAgICAgc2V0dGluZ3MuJG5leHRfdGlwLmNzcygndmlzaWJpbGl0eScsICdoaWRkZW4nKTsKICAgICAgICAgIHNldHRpbmdzLiRuZXh0X3RpcC5zaG93KCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIS9ib2R5L2kudGVzdChzZXR0aW5ncy4kdGFyZ2V0LnNlbGVjdG9yKSkgewoKICAgICAgICAgICAgaWYgKG1ldGhvZHMuYm90dG9tKCkpIHsKICAgICAgICAgICAgICBzZXR0aW5ncy4kbmV4dF90aXAuY3NzKHsKICAgICAgICAgICAgICAgIHRvcDogKHNldHRpbmdzLiR0YXJnZXQub2Zmc2V0KCkudG9wICsgbnViX2hlaWdodCArIHNldHRpbmdzLiR0YXJnZXQub3V0ZXJIZWlnaHQoKSksCiAgICAgICAgICAgICAgICBsZWZ0OiBzZXR0aW5ncy4kdGFyZ2V0Lm9mZnNldCgpLmxlZnR9KTsKCiAgICAgICAgICAgICAgbWV0aG9kcy5udWJfcG9zaXRpb24oJG51Yiwgc2V0dGluZ3MudGlwU2V0dGluZ3MubnViUG9zaXRpb24sICd0b3AnKTsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kcy50b3AoKSkgewoKICAgICAgICAgICAgICBzZXR0aW5ncy4kbmV4dF90aXAuY3NzKHsKICAgICAgICAgICAgICAgIHRvcDogKHNldHRpbmdzLiR0YXJnZXQub2Zmc2V0KCkudG9wIC0gc2V0dGluZ3MuJG5leHRfdGlwLm91dGVySGVpZ2h0KCkgLSBudWJfaGVpZ2h0KSwKICAgICAgICAgICAgICAgIGxlZnQ6IHNldHRpbmdzLiR0YXJnZXQub2Zmc2V0KCkubGVmdH0pOwoKICAgICAgICAgICAgICBtZXRob2RzLm51Yl9wb3NpdGlvbigkbnViLCBzZXR0aW5ncy50aXBTZXR0aW5ncy5udWJQb3NpdGlvbiwgJ2JvdHRvbScpOwoKICAgICAgICAgICAgfSBlbHNlIGlmIChtZXRob2RzLnJpZ2h0KCkpIHsKCiAgICAgICAgICAgICAgc2V0dGluZ3MuJG5leHRfdGlwLmNzcyh7CiAgICAgICAgICAgICAgICB0b3A6IHNldHRpbmdzLiR0YXJnZXQub2Zmc2V0KCkudG9wLAogICAgICAgICAgICAgICAgbGVmdDogKHNldHRpbmdzLiR0YXJnZXQub3V0ZXJXaWR0aCgpICsgc2V0dGluZ3MuJHRhcmdldC5vZmZzZXQoKS5sZWZ0KX0pOwoKICAgICAgICAgICAgICBtZXRob2RzLm51Yl9wb3NpdGlvbigkbnViLCBzZXR0aW5ncy50aXBTZXR0aW5ncy5udWJQb3NpdGlvbiwgJ2xlZnQnKTsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kcy5sZWZ0KCkpIHsKCiAgICAgICAgICAgICAgc2V0dGluZ3MuJG5leHRfdGlwLmNzcyh7CiAgICAgICAgICAgICAgICB0b3A6IHNldHRpbmdzLiR0YXJnZXQub2Zmc2V0KCkudG9wLAogICAgICAgICAgICAgICAgbGVmdDogKHNldHRpbmdzLiR0YXJnZXQub2Zmc2V0KCkubGVmdCAtIHNldHRpbmdzLiRuZXh0X3RpcC5vdXRlcldpZHRoKCkgLSBudWJfaGVpZ2h0KX0pOwoKICAgICAgICAgICAgICBtZXRob2RzLm51Yl9wb3NpdGlvbigkbnViLCBzZXR0aW5ncy50aXBTZXR0aW5ncy5udWJQb3NpdGlvbiwgJ3JpZ2h0Jyk7CgogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIW1ldGhvZHMudmlzaWJsZShtZXRob2RzLmNvcm5lcnMoc2V0dGluZ3MuJG5leHRfdGlwKSkgJiYgc2V0dGluZ3MuYXR0ZW1wdHMgPCBzZXR0aW5ncy50aXBTZXR0aW5ncy50aXBMb2NhdGlvblBhdHRlcm4ubGVuZ3RoKSB7CgogICAgICAgICAgICAgICRudWIucmVtb3ZlQ2xhc3MoJ2JvdHRvbScpCiAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ3RvcCcpCiAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ3JpZ2h0JykKICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnbGVmdCcpOwoKICAgICAgICAgICAgICBzZXR0aW5ncy50aXBTZXR0aW5ncy50aXBMb2NhdGlvbiA9IHNldHRpbmdzLnRpcFNldHRpbmdzLnRpcExvY2F0aW9uUGF0dGVybltzZXR0aW5ncy5hdHRlbXB0c107CgogICAgICAgICAgICAgIHNldHRpbmdzLmF0dGVtcHRzKys7CgogICAgICAgICAgICAgIG1ldGhvZHMucG9zX2RlZmF1bHQodHJ1ZSk7CgogICAgICAgICAgICB9CgogICAgICAgIH0gZWxzZSBpZiAoc2V0dGluZ3MuJGxpLmxlbmd0aCkgewoKICAgICAgICAgIG1ldGhvZHMucG9zX21vZGFsKCRudWIpOwoKICAgICAgICB9CgogICAgICAgIGlmICh0b2dnbGUpIHsKICAgICAgICAgIHNldHRpbmdzLiRuZXh0X3RpcC5oaWRlKCk7CiAgICAgICAgICBzZXR0aW5ncy4kbmV4dF90aXAuY3NzKCd2aXNpYmlsaXR5JywgJ3Zpc2libGUnKTsKICAgICAgICB9CgogICAgICB9LAoKICAgICAgcG9zX3Bob25lIDogZnVuY3Rpb24gKGluaXQpIHsKICAgICAgICB2YXIgdGlwX2hlaWdodCA9IHNldHRpbmdzLiRuZXh0X3RpcC5vdXRlckhlaWdodCgpLAogICAgICAgICAgICB0aXBfb2Zmc2V0ID0gc2V0dGluZ3MuJG5leHRfdGlwLm9mZnNldCgpLAogICAgICAgICAgICB0YXJnZXRfaGVpZ2h0ID0gc2V0dGluZ3MuJHRhcmdldC5vdXRlckhlaWdodCgpLAogICAgICAgICAgICAkbnViID0gJCgnLmpveXJpZGUtbnViJywgc2V0dGluZ3MuJG5leHRfdGlwKSwKICAgICAgICAgICAgbnViX2hlaWdodCA9IE1hdGguY2VpbCgkbnViLm91dGVySGVpZ2h0KCkgLyAyKSwKICAgICAgICAgICAgdG9nZ2xlID0gaW5pdCB8fCBmYWxzZTsKCiAgICAgICAgJG51Yi5yZW1vdmVDbGFzcygnYm90dG9tJykKICAgICAgICAgIC5yZW1vdmVDbGFzcygndG9wJykKICAgICAgICAgIC5yZW1vdmVDbGFzcygncmlnaHQnKQogICAgICAgICAgLnJlbW92ZUNsYXNzKCdsZWZ0Jyk7CgogICAgICAgIGlmICh0b2dnbGUpIHsKICAgICAgICAgIHNldHRpbmdzLiRuZXh0X3RpcC5jc3MoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7CiAgICAgICAgICBzZXR0aW5ncy4kbmV4dF90aXAuc2hvdygpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEvYm9keS9pLnRlc3Qoc2V0dGluZ3MuJHRhcmdldC5zZWxlY3RvcikpIHsKCiAgICAgICAgICBpZiAobWV0aG9kcy50b3AoKSkgewoKICAgICAgICAgICAgICBzZXR0aW5ncy4kbmV4dF90aXAub2Zmc2V0KHt0b3A6IHNldHRpbmdzLiR0YXJnZXQub2Zmc2V0KCkudG9wIC0gdGlwX2hlaWdodCAtIG51Yl9oZWlnaHR9KTsKICAgICAgICAgICAgICAkbnViLmFkZENsYXNzKCdib3R0b20nKTsKCiAgICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgc2V0dGluZ3MuJG5leHRfdGlwLm9mZnNldCh7dG9wOiBzZXR0aW5ncy4kdGFyZ2V0Lm9mZnNldCgpLnRvcCArIHRhcmdldF9oZWlnaHQgKyBudWJfaGVpZ2h0fSk7CiAgICAgICAgICAgICRudWIuYWRkQ2xhc3MoJ3RvcCcpOwoKICAgICAgICAgIH0KCiAgICAgICAgfSBlbHNlIGlmIChzZXR0aW5ncy4kbGkubGVuZ3RoKSB7CgogICAgICAgICAgbWV0aG9kcy5wb3NfbW9kYWwoJG51Yik7CgogICAgICAgIH0KCiAgICAgICAgaWYgKHRvZ2dsZSkgewogICAgICAgICAgc2V0dGluZ3MuJG5leHRfdGlwLmhpZGUoKTsKICAgICAgICAgIHNldHRpbmdzLiRuZXh0X3RpcC5jc3MoJ3Zpc2liaWxpdHknLCAndmlzaWJsZScpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIHBvc19tb2RhbCA6IGZ1bmN0aW9uICgkbnViKSB7CiAgICAgICAgbWV0aG9kcy5jZW50ZXIoKTsKICAgICAgICAkbnViLmhpZGUoKTsKCiAgICAgICAgaWYgKCQoJy5qb3lyaWRlLW1vZGFsLWJnJykubGVuZ3RoIDwgMSkgewogICAgICAgICAgJCgnYm9keScpLmFwcGVuZCgnPGRpdiBjbGFzcz0iam95cmlkZS1tb2RhbC1iZyI+Jykuc2hvdygpOwogICAgICAgIH0KCiAgICAgICAgaWYgKC9wb3AvaS50ZXN0KHNldHRpbmdzLnRpcEFuaW1hdGlvbikpIHsKICAgICAgICAgICQoJy5qb3lyaWRlLW1vZGFsLWJnJykuc2hvdygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAkKCcuam95cmlkZS1tb2RhbC1iZycpLmZhZGVJbihzZXR0aW5ncy50aXBBbmltYXRpb25GYWRlU3BlZWQpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIGNlbnRlciA6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgJHcgPSBzZXR0aW5ncy4kd2luZG93OwoKICAgICAgICBzZXR0aW5ncy4kbmV4dF90aXAuY3NzKHsKICAgICAgICAgIHRvcCA6ICgoKCR3LmhlaWdodCgpIC0gc2V0dGluZ3MuJG5leHRfdGlwLm91dGVySGVpZ2h0KCkpIC8gMikgKyAkdy5zY3JvbGxUb3AoKSksCiAgICAgICAgICBsZWZ0IDogKCgoJHcud2lkdGgoKSAtIHNldHRpbmdzLiRuZXh0X3RpcC5vdXRlcldpZHRoKCkpIC8gMikgKyAkdy5zY3JvbGxMZWZ0KCkpCiAgICAgICAgfSk7CgogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9LAoKICAgICAgYm90dG9tIDogZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiAvYm90dG9tL2kudGVzdChzZXR0aW5ncy50aXBTZXR0aW5ncy50aXBMb2NhdGlvbik7CiAgICAgIH0sCgogICAgICB0b3AgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIC90b3AvaS50ZXN0KHNldHRpbmdzLnRpcFNldHRpbmdzLnRpcExvY2F0aW9uKTsKICAgICAgfSwKCiAgICAgIHJpZ2h0IDogZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiAvcmlnaHQvaS50ZXN0KHNldHRpbmdzLnRpcFNldHRpbmdzLnRpcExvY2F0aW9uKTsKICAgICAgfSwKCiAgICAgIGxlZnQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIC9sZWZ0L2kudGVzdChzZXR0aW5ncy50aXBTZXR0aW5ncy50aXBMb2NhdGlvbik7CiAgICAgIH0sCgogICAgICBjb3JuZXJzIDogZnVuY3Rpb24gKGVsKSB7CiAgICAgICAgdmFyIHcgPSBzZXR0aW5ncy4kd2luZG93LAogICAgICAgICAgICByaWdodCA9IHcud2lkdGgoKSArIHcuc2Nyb2xsTGVmdCgpLAogICAgICAgICAgICBib3R0b20gPSB3LndpZHRoKCkgKyB3LnNjcm9sbFRvcCgpOwoKICAgICAgICByZXR1cm4gWwogICAgICAgICAgZWwub2Zmc2V0KCkudG9wIDw9IHcuc2Nyb2xsVG9wKCksCiAgICAgICAgICByaWdodCA8PSBlbC5vZmZzZXQoKS5sZWZ0ICsgZWwub3V0ZXJXaWR0aCgpLAogICAgICAgICAgYm90dG9tIDw9IGVsLm9mZnNldCgpLnRvcCArIGVsLm91dGVySGVpZ2h0KCksCiAgICAgICAgICB3LnNjcm9sbExlZnQoKSA+PSBlbC5vZmZzZXQoKS5sZWZ0CiAgICAgICAgXTsKICAgICAgfSwKCiAgICAgIHZpc2libGUgOiBmdW5jdGlvbiAoaGlkZGVuX2Nvcm5lcnMpIHsKICAgICAgICB2YXIgaSA9IGhpZGRlbl9jb3JuZXJzLmxlbmd0aDsKCiAgICAgICAgd2hpbGUgKGktLSkgewogICAgICAgICAgaWYgKGhpZGRlbl9jb3JuZXJzW2ldKSByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSwKCiAgICAgIG51Yl9wb3NpdGlvbiA6IGZ1bmN0aW9uIChudWIsIHBvcywgZGVmKSB7CiAgICAgICAgaWYgKHBvcyA9PT0gJ2F1dG8nKSB7CiAgICAgICAgICBudWIuYWRkQ2xhc3MoZGVmKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbnViLmFkZENsYXNzKHBvcyk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgc3RhcnRUaW1lciA6IGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoc2V0dGluZ3MuJGxpLmxlbmd0aCkgewogICAgICAgICAgc2V0dGluZ3MuYXV0b21hdGUgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgbWV0aG9kcy5oaWRlKCk7CiAgICAgICAgICAgIG1ldGhvZHMuc2hvdygpOwogICAgICAgICAgICBtZXRob2RzLnN0YXJ0VGltZXIoKTsKICAgICAgICAgIH0sIHNldHRpbmdzLnRpbWVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY2xlYXJUaW1lb3V0KHNldHRpbmdzLmF1dG9tYXRlKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICBlbmQgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKHNldHRpbmdzLmNvb2tpZU1vbnN0ZXIpIHsKICAgICAgICAgICQuY29va2llKHNldHRpbmdzLmNvb2tpZU5hbWUsICdyaWRkZW4nLCB7IGV4cGlyZXM6IDM2NSwgZG9tYWluOiBzZXR0aW5ncy5jb29raWVEb21haW4gfSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2V0dGluZ3MudGltZXIgPiAwKSB7CiAgICAgICAgICBjbGVhclRpbWVvdXQoc2V0dGluZ3MuYXV0b21hdGUpOwogICAgICAgIH0KCiAgICAgICAgJCgnLmpveXJpZGUtbW9kYWwtYmcnKS5oaWRlKCk7CiAgICAgICAgc2V0dGluZ3MuJGN1cnJlbnRfdGlwLmhpZGUoKTsKICAgICAgICBzZXR0aW5ncy5wb3N0U3RlcENhbGxiYWNrKHNldHRpbmdzLiRsaS5pbmRleCgpLCBzZXR0aW5ncy4kY3VycmVudF90aXApOwogICAgICAgIHNldHRpbmdzLnBvc3RSaWRlQ2FsbGJhY2soc2V0dGluZ3MuJGxpLmluZGV4KCksIHNldHRpbmdzLiRjdXJyZW50X3RpcCk7CiAgICAgIH0sCgogICAgICBqcXVlcnlfY2hlY2sgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gZGVmaW5lIG9uKCkgYW5kIG9mZigpIGZvciBvbGRlciBqUXVlcnkKICAgICAgICBpZiAoISQuaXNGdW5jdGlvbigkLmZuLm9uKSkgewoKICAgICAgICAgICQuZm4ub24gPSBmdW5jdGlvbiAodHlwZXMsIHNlbCwgZm4pIHsKCiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlKHNlbCwgdHlwZXMsIGZuKTsKCiAgICAgICAgICB9OwoKICAgICAgICAgICQuZm4ub2ZmID0gZnVuY3Rpb24gKHR5cGVzLCBzZWwsIGZuKSB7CgogICAgICAgICAgICByZXR1cm4gdGhpcy51bmRlbGVnYXRlKHNlbCwgdHlwZXMsIGZuKTsKCiAgICAgICAgICB9OwoKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9LAoKICAgICAgb3V0ZXJIVE1MIDogZnVuY3Rpb24gKGVsKSB7CiAgICAgICAgLy8gc3VwcG9ydCBGaXJlRm94IDwgMTEKICAgICAgICByZXR1cm4gZWwub3V0ZXJIVE1MIHx8IG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcoZWwpOwogICAgICB9LAoKICAgICAgdmVyc2lvbiA6IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gc2V0dGluZ3MudmVyc2lvbjsKICAgICAgfQoKICAgIH07CgogICQuZm4uam95cmlkZSA9IGZ1bmN0aW9uIChtZXRob2QpIHsKICAgIGlmIChtZXRob2RzW21ldGhvZF0pIHsKICAgICAgcmV0dXJuIG1ldGhvZHNbbWV0aG9kXS5hcHBseSh0aGlzLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIG1ldGhvZCA9PT0gJ29iamVjdCcgfHwgIW1ldGhvZCkgewogICAgICByZXR1cm4gbWV0aG9kcy5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9IGVsc2UgewogICAgICAkLmVycm9yKCdNZXRob2QgJyArICBtZXRob2QgKyAnIGRvZXMgbm90IGV4aXN0IG9uIGpRdWVyeS5qb3lyaWRlJyk7CiAgICB9CiAgfTsKCn0oalF1ZXJ5LCB0aGlzKSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/assets/javascripts/jquery.foundation.magellan.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IEZvdW5kYXRpb24gTWFnZWxsYW4gMC4wLjEKICogaHR0cDovL2ZvdW5kYXRpb24uenVyYi5jb20KICogQ29weXJpZ2h0IDIwMTIsIFpVUkIKICogRnJlZSB0byB1c2UgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAoqLwoKLypqc2xpbnQgdW5wYXJhbTogdHJ1ZSwgYnJvd3NlcjogdHJ1ZSwgaW5kZW50OiAyICovCgo7KGZ1bmN0aW9uICgkLCB3aW5kb3csIHVuZGVmaW5lZCkgewogICd1c2Ugc3RyaWN0JzsKCiAgJC5mbi5mb3VuZGF0aW9uTWFnZWxsYW4gPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICB2YXIgJHdpbmRvdyA9ICQod2luZG93KSwKICAJCSRkb2N1bWVudCA9ICQoZG9jdW1lbnQpLAogIAkJJGZpeGVkTWFnZWxsYW4gPSAkKCdbZGF0YS1tYWdlbGxhbi1leHBlZGl0aW9uPWZpeGVkXScpLAogICAgCWRlZmF1bHRzID0gewoJICAgICAgdGhyZXNob2xkOiAoJGZpeGVkTWFnZWxsYW4ubGVuZ3RoKSA/ICRmaXhlZE1hZ2VsbGFuLm91dGVySGVpZ2h0KHRydWUpIDogMCwKCSAgICAgIGFjdGl2ZUNsYXNzOiAnYWN0aXZlJwoJICAgIH0sCgkJb3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBkZWZhdWx0cywgb3B0aW9ucyk7CgkKICAgIC8vIEluZGljYXRlIHdlIGhhdmUgYXJyaXZlZCBhdCBhIGRlc3RpbmF0aW9uCiAgICAkZG9jdW1lbnQub24oJ21hZ2VsbGFuLmFycml2YWwnLCAnW2RhdGEtbWFnZWxsYW4tYXJyaXZhbF0nLCBmdW5jdGlvbihlKSB7CgkJdmFyICRkZXN0aW5hdGlvbiA9ICQodGhpcyksCiAgICAgIAkJJGV4cGVkaXRpb24gPSAkZGVzdGluYXRpb24uY2xvc2VzdCgnW2RhdGEtbWFnZWxsYW4tZXhwZWRpdGlvbl0nKSwKCQkJYWN0aXZlQ2xhc3MgPSAkZXhwZWRpdGlvbi5hdHRyKCdkYXRhLW1hZ2VsbGFuLWFjdGl2ZS1jbGFzcycpIHx8IG9wdGlvbnMuYWN0aXZlQ2xhc3M7CiAgICAgICRkZXN0aW5hdGlvbgogICAgICAgIC5jbG9zZXN0KCdbZGF0YS1tYWdlbGxhbi1leHBlZGl0aW9uXScpCiAgICAgICAgLmZpbmQoJ1tkYXRhLW1hZ2VsbGFuLWFycml2YWxdJykKICAgICAgICAubm90KHRoaXMpCiAgICAgICAgLnJlbW92ZUNsYXNzKGFjdGl2ZUNsYXNzKTsKICAgICAgJGRlc3RpbmF0aW9uLmFkZENsYXNzKGFjdGl2ZUNsYXNzKTsKICAgIH0pOwoKICAgIC8vIFNldCBzdGFydGluZyBwb2ludCBhcyB0aGUgY3VycmVudCBkZXN0aW5hdGlvbgogICAgdmFyICRleHBlZGl0aW9uID0gJCgnW2RhdGEtbWFnZWxsYW4tZXhwZWRpdGlvbl0nKTsKICAgICRleHBlZGl0aW9uLmZpbmQoJ1tkYXRhLW1hZ2VsbGFuLWFycml2YWxdOmZpcnN0JykKICAgICAgLmFkZENsYXNzKCRleHBlZGl0aW9uLmF0dHIoJ2RhdGEtbWFnZWxsYW4tYWN0aXZlLWNsYXNzJykgfHwgb3B0aW9ucy5hY3RpdmVDbGFzcyk7CgogICAgLy8gVXBkYXRlIGZpeGVkIHBvc2l0aW9uCiAgICAkZml4ZWRNYWdlbGxhbi5vbignbWFnZWxsYW4udXBkYXRlLXBvc2l0aW9uJywgZnVuY3Rpb24oKXsKICAgICAgdmFyICRlbCA9ICQodGhpcyk7CiAgICAgICRlbC5kYXRhKCJtYWdlbGxhbi1maXhlZC1wb3NpdGlvbiIsIiIpOwogICAgICAkZWwuZGF0YSgibWFnZWxsYW4tdG9wLW9mZnNldCIsICIiKTsKICAgIH0pCiAgICAudHJpZ2dlcignbWFnZWxsYW4udXBkYXRlLXBvc2l0aW9uJyk7CgogICAgJHdpbmRvdy5vbigncmVzaXplLm1hZ2VsbGFuJywgZnVuY3Rpb24oKSB7CiAgICAgICRmaXhlZE1hZ2VsbGFuLnRyaWdnZXIoJ21hZ2VsbGFuLnVwZGF0ZS1wb3NpdGlvbicpOwogICAgfSk7CiAgICAKICAgICR3aW5kb3cub24oJ3Njcm9sbC5tYWdlbGxhbicsIGZ1bmN0aW9uKCkgewogICAgICB2YXIgd2luZG93U2Nyb2xsVG9wID0gJHdpbmRvdy5zY3JvbGxUb3AoKTsKICAgICAgJGZpeGVkTWFnZWxsYW4uZWFjaChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgJGV4cGVkaXRpb24gPSAkKHRoaXMpOwogICAgICAgIGlmICgkZXhwZWRpdGlvbi5kYXRhKCJtYWdlbGxhbi10b3Atb2Zmc2V0IikgPT09ICIiKSB7CiAgICAgICAgICAkZXhwZWRpdGlvbi5kYXRhKCJtYWdlbGxhbi10b3Atb2Zmc2V0IiwgJGV4cGVkaXRpb24ub2Zmc2V0KCkudG9wKTsKICAgICAgICB9CiAgICAgICAgdmFyIGZpeGVkX3Bvc2l0aW9uID0gKHdpbmRvd1Njcm9sbFRvcCArIG9wdGlvbnMudGhyZXNob2xkKSA+ICRleHBlZGl0aW9uLmRhdGEoIm1hZ2VsbGFuLXRvcC1vZmZzZXQiKTsKICAgICAgICBpZiAoJGV4cGVkaXRpb24uZGF0YSgibWFnZWxsYW4tZml4ZWQtcG9zaXRpb24iKSAhPSBmaXhlZF9wb3NpdGlvbikgewogICAgICAgICAgJGV4cGVkaXRpb24uZGF0YSgibWFnZWxsYW4tZml4ZWQtcG9zaXRpb24iLCBmaXhlZF9wb3NpdGlvbik7CiAgICAgICAgICBpZiAoZml4ZWRfcG9zaXRpb24pIHsKICAgICAgICAgICAgJGV4cGVkaXRpb24uY3NzKHtwb3NpdGlvbjoiZml4ZWQiLCB0b3A6MH0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGV4cGVkaXRpb24uY3NzKHtwb3NpdGlvbjoiIiwgdG9wOiIifSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwoKICAgIC8vIERldGVybWluZSB3aGVuIGEgZGVzdGluYXRpb24gaGFzIGJlZW4gcmVhY2hlZCwgYWgweSEKICAgIHZhciAkbGFzdERlc3RpbmF0aW9uID0gJCgnW2RhdGEtbWFnZWxsYW4tZGVzdGluYXRpb25dOmxhc3QnKTsKICAgICR3aW5kb3cub24oJ3Njcm9sbC5tYWdlbGxhbicsIGZ1bmN0aW9uKGUpewoJICB2YXIgd2luZG93U2Nyb2xsVG9wID0gJHdpbmRvdy5zY3JvbGxUb3AoKSwKCQkgIHNjcm9sbHRvcFBsdXNIZWlnaHQgPSB3aW5kb3dTY3JvbGxUb3ArJHdpbmRvdy5vdXRlckhlaWdodCh0cnVlKSwKCQkgIGxhc3REZXN0aW5hdGlvblRvcCA9IE1hdGguY2VpbCgkbGFzdERlc3RpbmF0aW9uLm9mZnNldCgpLnRvcCk7CiAgICAgICQoJ1tkYXRhLW1hZ2VsbGFuLWRlc3RpbmF0aW9uXScpLmVhY2goZnVuY3Rpb24oKXsKICAgICAgICB2YXIgJGRlc3RpbmF0aW9uID0gJCh0aGlzKSwKICAgICAgICAgICAgZGVzdGluYXRpb25fbmFtZSA9ICRkZXN0aW5hdGlvbi5hdHRyKCdkYXRhLW1hZ2VsbGFuLWRlc3RpbmF0aW9uJyksCiAgICAgICAgICAgIHRvcE9mZnNldCA9ICRkZXN0aW5hdGlvbi5vZmZzZXQoKS50b3AgLSB3aW5kb3dTY3JvbGxUb3A7CiAgICAgICAgaWYgKHRvcE9mZnNldCA8PSBvcHRpb25zLnRocmVzaG9sZCkgewogICAgICAgICAgJCgnW2RhdGEtbWFnZWxsYW4tYXJyaXZhbD0nICsgZGVzdGluYXRpb25fbmFtZSArICddJykudHJpZ2dlcignbWFnZWxsYW4uYXJyaXZhbCcpOwogICAgICAgIH0KICAgICAgICAvLyBJbiBsYXJnZSBzY3JlZW5zIHdlIG1heSBoaXQgdGhlIGJvdHRvbSBvZiB0aGUgcGFnZSBhbmQgZG9udCByZWFjaCB0aGUgdG9wIG9mIHRoZSBsYXN0IG1hZ2VsbGFuLWRlc3RpbmF0aW9uLCBzbyBsZXRzIGZvcmNlIGl0CiAgICAgICAgaWYgKHNjcm9sbHRvcFBsdXNIZWlnaHQgPj0gJGRvY3VtZW50Lm91dGVySGVpZ2h0KHRydWUpICYmIGxhc3REZXN0aW5hdGlvblRvcCA+IHdpbmRvd1Njcm9sbFRvcCAmJiBsYXN0RGVzdGluYXRpb25Ub3AgPCBzY3JvbGx0b3BQbHVzSGVpZ2h0KSB7CiAgICAgICAgCSAkKCdbZGF0YS1tYWdlbGxhbi1hcnJpdmFsXTpsYXN0JykudHJpZ2dlcignbWFnZWxsYW4uYXJyaXZhbCcpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICB9Owp9KGpRdWVyeSwgdGhpcykpOwo=]]></data>
	</file>
	<file>
	  <filename>/assets/javascripts/jquery.foundation.mediaQueryToggle.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[OyhmdW5jdGlvbiAoJCwgd2luZG93LCB1bmRlZmluZWQpIHsKICAndXNlIHN0cmljdCc7CiAgCiAgJC5mbi5mb3VuZGF0aW9uTWVkaWFRdWVyeVZpZXdlciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICB2YXIgc2V0dGluZ3MgPSAkLmV4dGVuZChvcHRpb25zLHt0b2dnbGVLZXk6Nzd9KSwgLy8gUHJlc3MgJ00nCiAgICAgICAgJGRvYyA9ICQoZG9jdW1lbnQpOwoKICAgICRkb2Mub24oImtleXVwLm1lZGlhUXVlcnlWaWV3ZXIiLCAiOmlucHV0IiwgZnVuY3Rpb24gKGUpewogICAgICBpZiAoZS53aGljaCA9PT0gc2V0dGluZ3MudG9nZ2xlS2V5KSB7CiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgfQogICAgfSk7CiAgICAkZG9jLm9uKCJrZXl1cC5tZWRpYVF1ZXJ5Vmlld2VyIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgdmFyICRtcVZpZXdlciA9ICQoJyNmcXYnKTsKCiAgICAgIGlmIChlLndoaWNoID09PSBzZXR0aW5ncy50b2dnbGVLZXkpIHsgCiAgICAgICAgaWYgKCRtcVZpZXdlci5sZW5ndGggPiAwKSB7CiAgICAgICAgICAkbXFWaWV3ZXIucmVtb3ZlKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICQoJ2JvZHknKS5wcmVwZW5kKCc8ZGl2IGlkPSJmcXYiIHN0eWxlPSJwb3NpdGlvbjpmaXhlZDt0b3A6NHB4O2xlZnQ6NHB4O3otaW5kZXg6OTk5O2NvbG9yOiNmZmY7Ij48cCBzdHlsZT0iZm9udC1zaXplOjEycHg7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuNzUpO3BhZGRpbmc6NXB4O21hcmdpbi1ib3R0b206MXB4O2xpbmUtaGVpZ2h0OjEuMjsiPjxzcGFuIGNsYXNzPSJsZWZ0Ij5NZWRpYTo8L3NwYW4+IDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDpib2xkOyIgY2xhc3M9InNob3ctZm9yLXhsYXJnZSI+RXh0cmEgTGFyZ2U8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OmJvbGQ7IiBjbGFzcz0ic2hvdy1mb3ItbGFyZ2UiPkxhcmdlPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDpib2xkOyIgY2xhc3M9InNob3ctZm9yLW1lZGl1bSI+TWVkaXVtPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDpib2xkOyIgY2xhc3M9InNob3ctZm9yLXNtYWxsIj5TbWFsbDwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6Ym9sZDsiIGNsYXNzPSJzaG93LWZvci1sYW5kc2NhcGUiPkxhbmRzY2FwZTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6Ym9sZDsiIGNsYXNzPSJzaG93LWZvci1wb3J0cmFpdCI+UG9ydHJhaXQ8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OmJvbGQ7IiBjbGFzcz0ic2hvdy1mb3ItdG91Y2giPlRvdWNoPC9zcGFuPjwvcD48L2Rpdj4nKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwoKICB9OwoKfSkoalF1ZXJ5LCB0aGlzKTsK]]></data>
	</file>
	<file>
	  <filename>/assets/javascripts/jquery.foundation.navigation.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[OyhmdW5jdGlvbiAoJCwgd2luZG93LCB1bmRlZmluZWQpIHsKICAndXNlIHN0cmljdCc7CgogICQuZm4uZm91bmRhdGlvbk5hdmlnYXRpb24gPSBmdW5jdGlvbiAob3B0aW9ucykgewoKICAgIHZhciBsb2NrTmF2QmFyID0gZmFsc2U7CiAgICAvLyBXaW5kb3dzIFBob25lLCBzYWRseSwgZG9lcyBub3QgcmVnaXN0ZXIgdG91Y2ggZXZlbnRzIDooCiAgICBpZiAoTW9kZXJuaXpyLnRvdWNoIHx8IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1dpbmRvd3MgUGhvbmUvaSkpIHsKICAgICAgJChkb2N1bWVudCkub24oJ2NsaWNrLmZuZHRuIHRvdWNoc3RhcnQuZm5kdG4nLCAnLm5hdi1iYXIgYS5mbHlvdXQtdG9nZ2xlJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdmFyIGZseW91dCA9ICQodGhpcykuc2libGluZ3MoJy5mbHlvdXQnKS5maXJzdCgpOwogICAgICAgIGlmIChsb2NrTmF2QmFyID09PSBmYWxzZSkgewogICAgICAgICAgJCgnLm5hdi1iYXIgLmZseW91dCcpLm5vdChmbHlvdXQpLnNsaWRlVXAoNTAwKTsKICAgICAgICAgIGZseW91dC5zbGlkZVRvZ2dsZSg1MDAsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgbG9ja05hdkJhciA9IGZhbHNlOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGxvY2tOYXZCYXIgPSB0cnVlOwogICAgICB9KTsKICAgICAgJCgnLm5hdi1iYXI+bGkuaGFzLWZseW91dCcsIHRoaXMpLmFkZENsYXNzKCdpcy10b3VjaCcpOwogICAgfSBlbHNlIHsKICAgICAgJCgnLm5hdi1iYXI+bGkuaGFzLWZseW91dCcsIHRoaXMpLm9uKCdtb3VzZWVudGVyIG1vdXNlbGVhdmUnLCBmdW5jdGlvbiAoZSkgewogICAgICAgIGlmIChlLnR5cGUgPT0gJ21vdXNlZW50ZXInKSB7CiAgICAgICAgICAkKCcubmF2LWJhcicpLmZpbmQoJy5mbHlvdXQnKS5oaWRlKCk7CiAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCcuZmx5b3V0Jykuc2hvdygpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGUudHlwZSA9PSAnbW91c2VsZWF2ZScpIHsKICAgICAgICAgIHZhciBmbHlvdXQgPSAkKHRoaXMpLmNoaWxkcmVuKCcuZmx5b3V0JyksCiAgICAgICAgICAgICAgaW5wdXRzID0gZmx5b3V0LmZpbmQoJ2lucHV0JyksCiAgICAgICAgICAgICAgaGFzRm9jdXMgPSBmdW5jdGlvbiAoaW5wdXRzKSB7CiAgICAgICAgICAgICAgICB2YXIgZm9jdXM7CiAgICAgICAgICAgICAgICBpZiAoaW5wdXRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgaW5wdXRzLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLmlzKCI6Zm9jdXMiKSkgewogICAgICAgICAgICAgICAgICAgICAgZm9jdXMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgIHJldHVybiBmb2N1czsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICBpZiAoIWhhc0ZvY3VzKGlucHV0cykpIHsKICAgICAgICAgICAgJCh0aGlzKS5jaGlsZHJlbignLmZseW91dCcpLmhpZGUoKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICB9KTsKICAgIH0KCiAgfTsKCn0pKCBqUXVlcnksIHRoaXMgKTsK]]></data>
	</file>
	<file>
	  <filename>/assets/javascripts/jquery.foundation.orbit.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IE9yYml0IFBsdWdpbiAxLjQuMAogKiB3d3cuWlVSQi5jb20vcGxheWdyb3VuZAogKiBDb3B5cmlnaHQgMjAxMCwgWlVSQgogKiBGcmVlIHRvIHVzZSB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwCiovCgoKKGZ1bmN0aW9uICgkKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAkLmZuLmZpbmRGaXJzdEltYWdlID0gZnVuY3Rpb24gKCkgewogICAgcmV0dXJuIHRoaXMuZmlyc3QoKQogICAgICAgICAgICAuZmluZCgnaW1nJykKICAgICAgICAgICAgLmFuZFNlbGYoKS5maWx0ZXIoJ2ltZycpCiAgICAgICAgICAgIC5maXJzdCgpOwogIH07CgogIHZhciBPUkJJVCA9IHsKCiAgICBkZWZhdWx0czogewogICAgICBhbmltYXRpb246ICdob3Jpem9udGFsLXB1c2gnLCAgICAgLy8gZmFkZSwgaG9yaXpvbnRhbC1zbGlkZSwgdmVydGljYWwtc2xpZGUsIGhvcml6b250YWwtcHVzaCwgdmVydGljYWwtcHVzaAogICAgICBhbmltYXRpb25TcGVlZDogNjAwLCAgICAgICAgICAgICAgLy8gaG93IGZhc3QgYW5pbWF0aW9ucyBhcmUKICAgICAgdGltZXI6IHRydWUsICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc3BsYXkgdGltZXI/CiAgICAgIGFkdmFuY2VTcGVlZDogNDAwMCwgICAgICAgICAgICAgICAvLyBpZiB0aW1lciBpcyBlbmFibGVkLCB0aW1lIGJldHdlZW4gdHJhbnNpdGlvbnMKICAgICAgcGF1c2VPbkhvdmVyOiBmYWxzZSwgICAgICAgICAgICAgIC8vIGlmIHlvdSBob3ZlciBwYXVzZXMgdGhlIHNsaWRlcgogICAgICBzdGFydENsb2NrT25Nb3VzZU91dDogZmFsc2UsICAgICAgLy8gaWYgY2xvY2sgc2hvdWxkIHN0YXJ0IG9uIE1vdXNlT3V0CiAgICAgIHN0YXJ0Q2xvY2tPbk1vdXNlT3V0QWZ0ZXI6IDEwMDAsICAvLyBob3cgbG9uZyBhZnRlciBNb3VzZU91dCBzaG91bGQgdGhlIHRpbWVyIHN0YXJ0IGFnYWluCiAgICAgIGRpcmVjdGlvbmFsTmF2OiB0cnVlLCAgICAgICAgICAgICAvLyBtYW51YWwgYWR2YW5jaW5nIGRpcmVjdGlvbmFsIG5hdnMKICAgICAgZGlyZWN0aW9uYWxOYXZSaWdodFRleHQ6ICdSaWdodCcsIC8vIHRleHQgb2YgcmlnaHQgZGlyZWN0aW9uYWwgZWxlbWVudCBmb3IgYWNjZXNzaWJpbGl0eQogICAgICBkaXJlY3Rpb25hbE5hdkxlZnRUZXh0OiAnTGVmdCcsICAgLy8gdGV4dCBvZiBsZWZ0IGRpcmVjdGlvbmFsIGVsZW1lbnQgZm9yIGFjY2Vzc2liaWxpdHkKICAgICAgY2FwdGlvbnM6IHRydWUsICAgICAgICAgICAgICAgICAgIC8vIGRvIHlvdSB3YW50IGNhcHRpb25zPwogICAgICBjYXB0aW9uQW5pbWF0aW9uOiAnZmFkZScsICAgICAgICAgLy8gZmFkZSwgc2xpZGVPcGVuLCBub25lCiAgICAgIGNhcHRpb25BbmltYXRpb25TcGVlZDogNjAwLCAgICAgICAvLyBpZiBzbyBob3cgcXVpY2tseSBzaG91bGQgdGhleSBhbmltYXRlIGluCiAgICAgIHJlc2V0VGltZXJPbkNsaWNrOiBmYWxzZSwgICAgICAgICAvLyB0cnVlIHJlc2V0cyB0aGUgdGltZXIgaW5zdGVhZCBvZiBwYXVzaW5nIHNsaWRlc2hvdyBwcm9ncmVzcyBvbiBtYW51YWwgbmF2aWdhdGlvbgogICAgICBidWxsZXRzOiBmYWxzZSwgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZSBvciBmYWxzZSB0byBhY3RpdmF0ZSB0aGUgYnVsbGV0IG5hdmlnYXRpb24KICAgICAgYnVsbGV0VGh1bWJzOiBmYWxzZSwgICAgICAgICAgICAgIC8vIHRodW1ibmFpbHMgZm9yIHRoZSBidWxsZXRzCiAgICAgIGJ1bGxldFRodW1iTG9jYXRpb246ICcnLCAgICAgICAgICAvLyByZWxhdGl2ZSBwYXRoIHRvIHRodW1ibmFpbHMgZnJvbSB0aGlzIGZpbGUKICAgICAgYnVsbGV0VGh1bWJzSGlkZU9uU21hbGw6IHRydWUsCS8vIGhpZGUgdGh1bWJzIG9uIHNtYWxsIGRldmljZXMKICAgICAgYWZ0ZXJTbGlkZUNoYW5nZTogJC5ub29wLCAgICAgICAgIC8vIGNhbGxiYWNrIHRvIGV4ZWN1dGUgYWZ0ZXIgc2xpZGUgY2hhbmdlcwogICAgICBhZnRlckxvYWRDb21wbGV0ZTogJC5ub29wLCAgICAgICAgLy8gY2FsbGJhY2sgdG8gZXhlY3V0ZSBhZnRlciBldmVyeXRoaW5nIGhhcyBiZWVuIGxvYWRlZAogICAgICBmbHVpZDogdHJ1ZSwKICAgICAgY2VudGVyQnVsbGV0czogdHJ1ZSwgICAgICAgICAgICAgIC8vIGNlbnRlciBidWxsZXQgbmF2IHdpdGgganMsIHR1cm4gdGhpcyBvZmYgaWYgeW91IHdhbnQgdG8gcG9zaXRpb24gdGhlIGJ1bGxldCBuYXYgbWFudWFsbHkKICAgICAgc2luZ2xlQ3ljbGU6IGZhbHNlLCAgICAgICAgICAgICAgIC8vIGN5Y2xlcyB0aHJvdWdoIG9yYml0IHNsaWRlcyBvbmx5IG9uY2UKICAgICAgc2xpZGVOdW1iZXI6IGZhbHNlLCAgICAgICAgICAgICAgIC8vIGRpc3BsYXkgc2xpZGUgbnVtYmVycz8KICAgICAgc3RhY2tPblNtYWxsOiBmYWxzZSAgICAgICAgICAgICAgIC8vIHN0YWNrIHNsaWRlcyBvbiBzbWFsbCBkZXZpY2VzIChpLmUuIHBob25lcykKICAgIH0sCgogICAgYWN0aXZlU2xpZGU6IDAsCiAgICBudW1iZXJTbGlkZXM6IDAsCiAgICBvcmJpdFdpZHRoOiBudWxsLAogICAgb3JiaXRIZWlnaHQ6IG51bGwsCiAgICBsb2NrZWQ6IG51bGwsCiAgICB0aW1lclJ1bm5pbmc6IG51bGwsCiAgICBkZWdyZWVzOiAwLAogICAgd3JhcHBlckhUTUw6ICc8ZGl2IGNsYXNzPSJvcmJpdC13cmFwcGVyIiAvPicsCiAgICB0aW1lckhUTUw6ICc8ZGl2IGNsYXNzPSJ0aW1lciI+PHNwYW4gY2xhc3M9Im1hc2siPjxzcGFuIGNsYXNzPSJyb3RhdG9yIj48L3NwYW4+PC9zcGFuPjxzcGFuIGNsYXNzPSJwYXVzZSI+PC9zcGFuPjwvZGl2PicsCiAgICBjYXB0aW9uSFRNTDogJzxkaXYgY2xhc3M9Im9yYml0LWNhcHRpb24iPjwvZGl2PicsCiAgICBkaXJlY3Rpb25hbE5hdkhUTUw6ICc8ZGl2IGNsYXNzPSJzbGlkZXItbmF2IGhpZGUtZm9yLXNtYWxsIj48c3BhbiBjbGFzcz0icmlnaHQiPjwvc3Bhbj48c3BhbiBjbGFzcz0ibGVmdCI+PC9zcGFuPjwvZGl2PicsCiAgICBidWxsZXRIVE1MOiAnPHVsIGNsYXNzPSJvcmJpdC1idWxsZXRzIj48L3VsPicsCiAgICBzbGlkZU51bWJlckhUTUw6ICc8c3BhbiBjbGFzcz0ib3JiaXQtc2xpZGUtY291bnRlciI+PC9zcGFuPicsCgogICAgaW5pdDogZnVuY3Rpb24gKGVsZW1lbnQsIG9wdGlvbnMpIHsKICAgICAgdmFyICRpbWFnZVNsaWRlcywKICAgICAgICAgIGltYWdlc0xvYWRlZENvdW50ID0gMCwKICAgICAgICAgIHNlbGYgPSB0aGlzOwoKICAgICAgLy8gQmluZCBmdW5jdGlvbnMgdG8gY29ycmVjdCBjb250ZXh0CiAgICAgIHRoaXMuY2xpY2tUaW1lciA9ICQucHJveHkodGhpcy5jbGlja1RpbWVyLCB0aGlzKTsKICAgICAgdGhpcy5hZGRCdWxsZXQgPSAkLnByb3h5KHRoaXMuYWRkQnVsbGV0LCB0aGlzKTsKICAgICAgdGhpcy5yZXNldEFuZFVubG9jayA9ICQucHJveHkodGhpcy5yZXNldEFuZFVubG9jaywgdGhpcyk7CiAgICAgIHRoaXMuc3RvcENsb2NrID0gJC5wcm94eSh0aGlzLnN0b3BDbG9jaywgdGhpcyk7CiAgICAgIHRoaXMuc3RhcnRUaW1lckFmdGVyTW91c2VMZWF2ZSA9ICQucHJveHkodGhpcy5zdGFydFRpbWVyQWZ0ZXJNb3VzZUxlYXZlLCB0aGlzKTsKICAgICAgdGhpcy5jbGVhckNsb2NrTW91c2VMZWF2ZVRpbWVyID0gJC5wcm94eSh0aGlzLmNsZWFyQ2xvY2tNb3VzZUxlYXZlVGltZXIsIHRoaXMpOwogICAgICB0aGlzLnJvdGF0ZVRpbWVyID0gJC5wcm94eSh0aGlzLnJvdGF0ZVRpbWVyLCB0aGlzKTsKCiAgICAgIHRoaXMub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCB0aGlzLmRlZmF1bHRzLCBvcHRpb25zKTsKICAgICAgaWYgKHRoaXMub3B0aW9ucy50aW1lciA9PT0gJ2ZhbHNlJykgdGhpcy5vcHRpb25zLnRpbWVyID0gZmFsc2U7CiAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2FwdGlvbnMgPT09ICdmYWxzZScpIHRoaXMub3B0aW9ucy5jYXB0aW9ucyA9IGZhbHNlOwogICAgICBpZiAodGhpcy5vcHRpb25zLmRpcmVjdGlvbmFsTmF2ID09PSAnZmFsc2UnKSB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uYWxOYXYgPSBmYWxzZTsKCiAgICAgIHRoaXMuJGVsZW1lbnQgPSAkKGVsZW1lbnQpOwogICAgICB0aGlzLiR3cmFwcGVyID0gdGhpcy4kZWxlbWVudC53cmFwKHRoaXMud3JhcHBlckhUTUwpLnBhcmVudCgpOwogICAgICB0aGlzLiRzbGlkZXMgPSB0aGlzLiRlbGVtZW50LmNoaWxkcmVuKCdpbWcsIGEsIGRpdiwgZmlndXJlLCBsaScpOwoKICAgICAgdGhpcy4kZWxlbWVudC5vbignbW92ZXN0YXJ0JywgZnVuY3Rpb24oZSkgewogICAgICAgIC8vIElmIHRoZSBtb3Zlc3RhcnQgaXMgaGVhZGluZyBvZmYgaW4gYW4gdXB3YXJkcyBvciBkb3dud2FyZHMKICAgICAgICAvLyBkaXJlY3Rpb24sIHByZXZlbnQgaXQgc28gdGhhdCB0aGUgYnJvd3NlciBzY3JvbGxzIG5vcm1hbGx5LgogICAgICAgIGlmICgoZS5kaXN0WCA+IGUuZGlzdFkgJiYgZS5kaXN0WCA8IC1lLmRpc3RZKSB8fAogICAgICAgICAgICAoZS5kaXN0WCA8IGUuZGlzdFkgJiYgZS5kaXN0WCA+IC1lLmRpc3RZKSkgewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgfSk7CgogICAgICB0aGlzLiRlbGVtZW50LmJpbmQoJ29yYml0Lm5leHQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgc2VsZi5zaGlmdCgnbmV4dCcpOwogICAgICB9KTsKCiAgICAgIHRoaXMuJGVsZW1lbnQuYmluZCgnb3JiaXQucHJldicsIGZ1bmN0aW9uICgpIHsKICAgICAgICBzZWxmLnNoaWZ0KCdwcmV2Jyk7CiAgICAgIH0pOwoKICAgICAgdGhpcy4kZWxlbWVudC5iaW5kKCdzd2lwZWxlZnQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgJCh0aGlzKS50cmlnZ2VyKCdvcmJpdC5uZXh0Jyk7CiAgICAgIH0pOwoKICAgICAgdGhpcy4kZWxlbWVudC5iaW5kKCdzd2lwZXJpZ2h0JywgZnVuY3Rpb24gKCkgewogICAgICAgICQodGhpcykudHJpZ2dlcignb3JiaXQucHJldicpOwogICAgICB9KTsKCiAgICAgIHRoaXMuJGVsZW1lbnQuYmluZCgnb3JiaXQuZ290bycsIGZ1bmN0aW9uIChldmVudCwgaW5kZXgpIHsKICAgICAgICBzZWxmLnNoaWZ0KGluZGV4KTsKICAgICAgfSk7CgogICAgICB0aGlzLiRlbGVtZW50LmJpbmQoJ29yYml0LnN0YXJ0JywgZnVuY3Rpb24gKGV2ZW50LCBpbmRleCkgewogICAgICAgIHNlbGYuc3RhcnRDbG9jaygpOwogICAgICB9KTsKCiAgICAgIHRoaXMuJGVsZW1lbnQuYmluZCgnb3JiaXQuc3RvcCcsIGZ1bmN0aW9uIChldmVudCwgaW5kZXgpIHsKICAgICAgICBzZWxmLnN0b3BDbG9jaygpOwogICAgICB9KTsKCiAgICAgICRpbWFnZVNsaWRlcyA9IHRoaXMuJHNsaWRlcy5maWx0ZXIoJ2ltZycpOwoKICAgICAgaWYgKCRpbWFnZVNsaWRlcy5sZW5ndGggPT09IDApIHsKICAgICAgICB0aGlzLmxvYWRlZCgpOwogICAgICB9IGVsc2UgewogICAgICAgICRpbWFnZVNsaWRlcy5iaW5kKCdpbWFnZXJlYWR5JywgZnVuY3Rpb24gKCkgewogICAgICAgICAgaW1hZ2VzTG9hZGVkQ291bnQgKz0gMTsKICAgICAgICAgIGlmIChpbWFnZXNMb2FkZWRDb3VudCA9PT0gJGltYWdlU2xpZGVzLmxlbmd0aCkgewogICAgICAgICAgICBzZWxmLmxvYWRlZCgpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9LAoKICAgIGxvYWRlZDogZnVuY3Rpb24gKCkgewogICAgICB0aGlzLiRlbGVtZW50CiAgICAgICAgLmFkZENsYXNzKCdvcmJpdCcpCiAgICAgICAgLmNzcyh7d2lkdGg6ICcxcHgnLCBoZWlnaHQ6ICcxcHgnfSk7CgogICAgICBpZiAodGhpcy5vcHRpb25zLnN0YWNrT25TbWFsbCkgewogICAgICAgIHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoJ29yYml0LXN0YWNrLW9uLXNtYWxsJyk7CiAgICAgIH0KCiAgICAgIHRoaXMuJHNsaWRlcy5hZGRDbGFzcygnb3JiaXQtc2xpZGUnKS5jc3MoeyJvcGFjaXR5IiA6IDB9KTsKCiAgICAgIHRoaXMuc2V0RGltZW50aW9uc0Zyb21MYXJnZXN0U2xpZGUoKTsKICAgICAgdGhpcy51cGRhdGVPcHRpb25zSWZPbmx5T25lU2xpZGUoKTsKICAgICAgdGhpcy5zZXR1cEZpcnN0U2xpZGUoKTsKICAgICAgdGhpcy5ub3RpZnlTbGlkZUNoYW5nZSgpOwoKICAgICAgaWYgKHRoaXMub3B0aW9ucy50aW1lcikgewogICAgICAgIHRoaXMuc2V0dXBUaW1lcigpOwogICAgICAgIHRoaXMuc3RhcnRDbG9jaygpOwogICAgICB9CgogICAgICBpZiAodGhpcy5vcHRpb25zLmNhcHRpb25zKSB7CiAgICAgICAgdGhpcy5zZXR1cENhcHRpb25zKCk7CiAgICAgIH0KCiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGlyZWN0aW9uYWxOYXYpIHsKICAgICAgICB0aGlzLnNldHVwRGlyZWN0aW9uYWxOYXYoKTsKICAgICAgfQoKICAgICAgaWYgKHRoaXMub3B0aW9ucy5idWxsZXRzKSB7CiAgICAgICAgdGhpcy5zZXR1cEJ1bGxldE5hdigpOwogICAgICAgIHRoaXMuc2V0QWN0aXZlQnVsbGV0KCk7CiAgICAgIH0KCiAgICAgIHRoaXMub3B0aW9ucy5hZnRlckxvYWRDb21wbGV0ZS5jYWxsKHRoaXMpOwogICAgICBIb2xkZXIucnVuKCk7CiAgICB9LAoKICAgIGN1cnJlbnRTbGlkZTogZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gdGhpcy4kc2xpZGVzLmVxKHRoaXMuYWN0aXZlU2xpZGUpOwogICAgfSwKCiAgICBub3RpZnlTbGlkZUNoYW5nZTogZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2xpZGVOdW1iZXIpIHsKICAgICAgICB2YXIgdHh0ID0gKHRoaXMuYWN0aXZlU2xpZGUrMSkgKyAnIG9mICcgKyB0aGlzLiRzbGlkZXMubGVuZ3RoOwogICAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcigib3JiaXQuY2hhbmdlIiwge3NsaWRlSW5kZXg6IHRoaXMuYWN0aXZlU2xpZGUsIHNsaWRlQ291bnQ6IHRoaXMuJHNsaWRlcy5sZW5ndGh9KTsKICAgICAgICBpZiAodGhpcy4kY291bnRlciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICB2YXIgJGNvdW50ZXIgPSAkKHRoaXMuc2xpZGVOdW1iZXJIVE1MKS5odG1sKHR4dCk7CiAgICAgICAgICB0aGlzLiRjb3VudGVyID0gJGNvdW50ZXI7CiAgICAgICAgICB0aGlzLiR3cmFwcGVyLmFwcGVuZCh0aGlzLiRjb3VudGVyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy4kY291bnRlci5odG1sKHR4dCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAoKICAgIHNldERpbWVudGlvbnNGcm9tTGFyZ2VzdFNsaWRlOiBmdW5jdGlvbiAoKSB7CiAgICAgIC8vQ29sbGVjdCBhbGwgc2xpZGVzIGFuZCBzZXQgc2xpZGVyIHNpemUgb2YgbGFyZ2VzdCBpbWFnZQogICAgICB2YXIgc2VsZiA9IHRoaXMsCiAgICAgICAgICAkZmx1aWRQbGFjZWhvbGRlcjsKCiAgICAgIHNlbGYuJGVsZW1lbnQuYWRkKHNlbGYuJHdyYXBwZXIpLndpZHRoKHRoaXMuJHNsaWRlcy5maXJzdCgpLm91dGVyV2lkdGgoKSk7CiAgICAgIHNlbGYuJGVsZW1lbnQuYWRkKHNlbGYuJHdyYXBwZXIpLmhlaWdodCh0aGlzLiRzbGlkZXMuZmlyc3QoKS5oZWlnaHQoKSk7CiAgICAgIHNlbGYub3JiaXRXaWR0aCA9IHRoaXMuJHNsaWRlcy5maXJzdCgpLm91dGVyV2lkdGgoKTsKICAgICAgc2VsZi5vcmJpdEhlaWdodCA9IHRoaXMuJHNsaWRlcy5maXJzdCgpLmhlaWdodCgpOwogICAgICAkZmx1aWRQbGFjZWhvbGRlciA9IHRoaXMuJHNsaWRlcy5maXJzdCgpLmZpbmRGaXJzdEltYWdlKCkuY2xvbmUoKTsKCgogICAgICB0aGlzLiRzbGlkZXMuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIHNsaWRlID0gJCh0aGlzKSwKICAgICAgICAgICAgc2xpZGVXaWR0aCA9IHNsaWRlLm91dGVyV2lkdGgoKSwKICAgICAgICAgICAgc2xpZGVIZWlnaHQgPSBzbGlkZS5oZWlnaHQoKTsKCiAgICAgICAgaWYgKHNsaWRlV2lkdGggPiBzZWxmLiRlbGVtZW50Lm91dGVyV2lkdGgoKSkgewogICAgICAgICAgc2VsZi4kZWxlbWVudC5hZGQoc2VsZi4kd3JhcHBlcikud2lkdGgoc2xpZGVXaWR0aCk7CiAgICAgICAgICBzZWxmLm9yYml0V2lkdGggPSBzZWxmLiRlbGVtZW50Lm91dGVyV2lkdGgoKTsKICAgICAgICB9CiAgICAgICAgaWYgKHNsaWRlSGVpZ2h0ID4gc2VsZi4kZWxlbWVudC5oZWlnaHQoKSkgewogICAgICAgICAgc2VsZi4kZWxlbWVudC5hZGQoc2VsZi4kd3JhcHBlcikuaGVpZ2h0KHNsaWRlSGVpZ2h0KTsKICAgICAgICAgIHNlbGYub3JiaXRIZWlnaHQgPSBzZWxmLiRlbGVtZW50LmhlaWdodCgpOwogICAgICAgICAgJGZsdWlkUGxhY2Vob2xkZXIgPSAkKHRoaXMpLmZpbmRGaXJzdEltYWdlKCkuY2xvbmUoKTsKICAgICAgICB9CiAgICAgICAgc2VsZi5udW1iZXJTbGlkZXMgKz0gMTsKICAgICAgfSk7CgogICAgICBpZiAodGhpcy5vcHRpb25zLmZsdWlkKSB7CiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuZmx1aWQgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAvLyAkZmx1aWRQbGFjZWhvbGRlciA9ICQoIjxpbWc+IikuYXR0cigic3JjIiwgImh0dHA6Ly9wbGFjZWhvbGQuaXQvIiArIHRoaXMub3B0aW9ucy5mbHVpZCk7CiAgICAgICAgICAkZmx1aWRQbGFjZWhvbGRlciA9ICQoIjxpbWc+IikuYXR0cigiZGF0YS1zcmMiLCAiaG9sZGVyLmpzLyIgKyB0aGlzLm9wdGlvbnMuZmx1aWQpOwogICAgICAgICAgLy92YXIgaW5uZXIgPSAkKCI8ZGl2Lz4iKS5jc3MoeyJkaXNwbGF5IjoiaW5saW5lLWJsb2NrIiwgIndpZHRoIjoiMnB4IiwgImhlaWdodCI6IjJweCJ9KTsKICAgICAgICAgIC8vJGZsdWlkUGxhY2Vob2xkZXIgPSAkKCI8ZGl2Lz4iKS5jc3MoeyJmbG9hdCI6ImxlZnQifSk7CiAgICAgICAgICAvLyRmbHVpZFBsYWNlaG9sZGVyLndyYXBJbm5lcihpbm5lcik7CgogICAgICAgICAgLy8kZmx1aWRQbGFjZWhvbGRlciA9ICQoIjxkaXYvPiIpLmNzcyh7ImhlaWdodCI6IjFweCIsICJ3aWR0aCI6IjJweCJ9KTsKICAgICAgICAgIC8vJGZsdWlkUGxhY2Vob2xkZXIgPSAkKCI8ZGl2IHN0eWxlPSdkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoycHg7aGVpZ2h0OjFweDsnPjwvZGl2PiIpOwogICAgICAgIH0KCiAgICAgICAgc2VsZi4kZWxlbWVudC5wcmVwZW5kKCRmbHVpZFBsYWNlaG9sZGVyKTsKICAgICAgICAkZmx1aWRQbGFjZWhvbGRlci5hZGRDbGFzcygnZmx1aWQtcGxhY2Vob2xkZXInKTsKICAgICAgICBzZWxmLiRlbGVtZW50LmFkZChzZWxmLiR3cmFwcGVyKS5jc3Moe3dpZHRoOiAnaW5oZXJpdCd9KTsKICAgICAgICBzZWxmLiRlbGVtZW50LmFkZChzZWxmLiR3cmFwcGVyKS5jc3Moe2hlaWdodDogJ2luaGVyaXQnfSk7CgogICAgICAgICQod2luZG93KS5iaW5kKCdyZXNpemUnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBzZWxmLm9yYml0V2lkdGggPSBzZWxmLiRlbGVtZW50Lm91dGVyV2lkdGgoKTsKICAgICAgICAgIHNlbGYub3JiaXRIZWlnaHQgPSBzZWxmLiRlbGVtZW50LmhlaWdodCgpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9LAoKICAgIC8vQW5pbWF0aW9uIGxvY2tpbmcgZnVuY3Rpb25zCiAgICBsb2NrOiBmdW5jdGlvbiAoKSB7CiAgICAgIHRoaXMubG9ja2VkID0gdHJ1ZTsKICAgIH0sCgogICAgdW5sb2NrOiBmdW5jdGlvbiAoKSB7CiAgICAgIHRoaXMubG9ja2VkID0gZmFsc2U7CiAgICB9LAoKICAgIHVwZGF0ZU9wdGlvbnNJZk9ubHlPbmVTbGlkZTogZnVuY3Rpb24gKCkgewogICAgICBpZih0aGlzLiRzbGlkZXMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgdGhpcy5vcHRpb25zLmRpcmVjdGlvbmFsTmF2ID0gZmFsc2U7CiAgICAgICAgdGhpcy5vcHRpb25zLnRpbWVyID0gZmFsc2U7CiAgICAgICAgdGhpcy5vcHRpb25zLmJ1bGxldHMgPSBmYWxzZTsKICAgICAgfQogICAgfSwKCiAgICBzZXR1cEZpcnN0U2xpZGU6IGZ1bmN0aW9uICgpIHsKICAgICAgLy9TZXQgaW5pdGlhbCBmcm9udCBwaG90byB6LWluZGV4IGFuZCBmYWRlcyBpdCBpbgogICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgIHRoaXMuJHNsaWRlcy5maXJzdCgpCiAgICAgICAgLmNzcyh7InotaW5kZXgiIDogMywgIm9wYWNpdHkiIDogMX0pCiAgICAgICAgLmZhZGVJbihmdW5jdGlvbigpIHsKICAgICAgICAgIC8vYnJpbmdzIGluIGFsbCBvdGhlciBzbGlkZXMgSUYgY3NzIGRlY2xhcmVzIGEgZGlzcGxheTogbm9uZQogICAgICAgICAgc2VsZi4kc2xpZGVzLmNzcyh7ImRpc3BsYXkiOiJibG9jayJ9KQogICAgICB9KTsKICAgIH0sCgogICAgc3RhcnRDbG9jazogZnVuY3Rpb24gKCkgewogICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICBpZighdGhpcy5vcHRpb25zLnRpbWVyKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICBpZiAodGhpcy4kdGltZXIuaXMoJzpoaWRkZW4nKSkgewogICAgICAgIHRoaXMuY2xvY2sgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7CiAgICAgICAgICBzZWxmLiRlbGVtZW50LnRyaWdnZXIoJ29yYml0Lm5leHQnKTsKICAgICAgICB9LCB0aGlzLm9wdGlvbnMuYWR2YW5jZVNwZWVkKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnRpbWVyUnVubmluZyA9IHRydWU7CiAgICAgICAgdGhpcy4kcGF1c2UucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwogICAgICAgIHRoaXMuY2xvY2sgPSBzZXRJbnRlcnZhbCh0aGlzLnJvdGF0ZVRpbWVyLCB0aGlzLm9wdGlvbnMuYWR2YW5jZVNwZWVkIC8gMTgwLCBmYWxzZSk7CiAgICAgIH0KICAgIH0sCgogICAgcm90YXRlVGltZXI6IGZ1bmN0aW9uIChyZXNldCkgewogICAgICB2YXIgZGVncmVlQ1NTID0gInJvdGF0ZSgiICsgdGhpcy5kZWdyZWVzICsgImRlZykiOwogICAgICB0aGlzLmRlZ3JlZXMgKz0gMjsKICAgICAgdGhpcy4kcm90YXRvci5jc3MoewogICAgICAgICItd2Via2l0LXRyYW5zZm9ybSI6IGRlZ3JlZUNTUywKICAgICAgICAiLW1vei10cmFuc2Zvcm0iOiBkZWdyZWVDU1MsCiAgICAgICAgIi1vLXRyYW5zZm9ybSI6IGRlZ3JlZUNTUywKICAgICAgICAiLW1zLXRyYW5zZm9ybSI6IGRlZ3JlZUNTUwogICAgICB9KTsKICAgICAgaWYgKHJlc2V0KSB7CiAgICAgICAgdGhpcy5kZWdyZWVzID0gMDsKICAgICAgICB0aGlzLiRyb3RhdG9yLnJlbW92ZUNsYXNzKCdtb3ZlJyk7CiAgICAgICAgdGhpcy4kbWFzay5yZW1vdmVDbGFzcygnbW92ZScpOwogICAgICB9CiAgICAgIGlmKHRoaXMuZGVncmVlcyA+IDE4MCkgewogICAgICAgIHRoaXMuJHJvdGF0b3IuYWRkQ2xhc3MoJ21vdmUnKTsKICAgICAgICB0aGlzLiRtYXNrLmFkZENsYXNzKCdtb3ZlJyk7CiAgICAgIH0KICAgICAgaWYodGhpcy5kZWdyZWVzID4gMzYwKSB7CiAgICAgICAgdGhpcy4kcm90YXRvci5yZW1vdmVDbGFzcygnbW92ZScpOwogICAgICAgIHRoaXMuJG1hc2sucmVtb3ZlQ2xhc3MoJ21vdmUnKTsKICAgICAgICB0aGlzLmRlZ3JlZXMgPSAwOwogICAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcignb3JiaXQubmV4dCcpOwogICAgICB9CiAgICB9LAoKICAgIHN0b3BDbG9jazogZnVuY3Rpb24gKCkgewogICAgICBpZiAoIXRoaXMub3B0aW9ucy50aW1lcikgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnRpbWVyUnVubmluZyA9IGZhbHNlOwogICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5jbG9jayk7CiAgICAgICAgdGhpcy4kcGF1c2UuYWRkQ2xhc3MoJ2FjdGl2ZScpOwogICAgICB9CiAgICB9LAoKICAgIHNldHVwVGltZXI6IGZ1bmN0aW9uICgpIHsKICAgICAgdGhpcy4kdGltZXIgPSAkKHRoaXMudGltZXJIVE1MKTsKICAgICAgdGhpcy4kd3JhcHBlci5hcHBlbmQodGhpcy4kdGltZXIpOwoKICAgICAgdGhpcy4kcm90YXRvciA9IHRoaXMuJHRpbWVyLmZpbmQoJy5yb3RhdG9yJyk7CiAgICAgIHRoaXMuJG1hc2sgPSB0aGlzLiR0aW1lci5maW5kKCcubWFzaycpOwogICAgICB0aGlzLiRwYXVzZSA9IHRoaXMuJHRpbWVyLmZpbmQoJy5wYXVzZScpOwoKICAgICAgdGhpcy4kdGltZXIuY2xpY2sodGhpcy5jbGlja1RpbWVyKTsKCiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3RhcnRDbG9ja09uTW91c2VPdXQpIHsKICAgICAgICB0aGlzLiR3cmFwcGVyLm1vdXNlbGVhdmUodGhpcy5zdGFydFRpbWVyQWZ0ZXJNb3VzZUxlYXZlKTsKICAgICAgICB0aGlzLiR3cmFwcGVyLm1vdXNlZW50ZXIodGhpcy5jbGVhckNsb2NrTW91c2VMZWF2ZVRpbWVyKTsKICAgICAgfQoKICAgICAgaWYgKHRoaXMub3B0aW9ucy5wYXVzZU9uSG92ZXIpIHsKICAgICAgICB0aGlzLiR3cmFwcGVyLm1vdXNlZW50ZXIodGhpcy5zdG9wQ2xvY2spOwogICAgICB9CiAgICB9LAoKICAgIHN0YXJ0VGltZXJBZnRlck1vdXNlTGVhdmU6IGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgdGhpcy5vdXRUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgaWYoIXNlbGYudGltZXJSdW5uaW5nKXsKICAgICAgICAgIHNlbGYuc3RhcnRDbG9jaygpOwogICAgICAgIH0KICAgICAgfSwgdGhpcy5vcHRpb25zLnN0YXJ0Q2xvY2tPbk1vdXNlT3V0QWZ0ZXIpCiAgICB9LAoKICAgIGNsZWFyQ2xvY2tNb3VzZUxlYXZlVGltZXI6IGZ1bmN0aW9uICgpIHsKICAgICAgY2xlYXJUaW1lb3V0KHRoaXMub3V0VGltZXIpOwogICAgfSwKCiAgICBjbGlja1RpbWVyOiBmdW5jdGlvbiAoKSB7CiAgICAgIGlmKCF0aGlzLnRpbWVyUnVubmluZykgewogICAgICAgICAgdGhpcy5zdGFydENsb2NrKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnN0b3BDbG9jaygpOwogICAgICB9CiAgICB9LAoKICAgIHNldHVwQ2FwdGlvbnM6IGZ1bmN0aW9uICgpIHsKICAgICAgdGhpcy4kY2FwdGlvbiA9ICQodGhpcy5jYXB0aW9uSFRNTCk7CiAgICAgIHRoaXMuJHdyYXBwZXIuYXBwZW5kKHRoaXMuJGNhcHRpb24pOwogICAgICB0aGlzLnNldENhcHRpb24oKTsKICAgIH0sCgogICAgc2V0Q2FwdGlvbjogZnVuY3Rpb24gKCkgewogICAgICB2YXIgY2FwdGlvbkxvY2F0aW9uID0gdGhpcy5jdXJyZW50U2xpZGUoKS5hdHRyKCdkYXRhLWNhcHRpb24nKSwKICAgICAgICAgIGNhcHRpb25IVE1MOwoKICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuY2FwdGlvbnMpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8vU2V0IEhUTUwgZm9yIHRoZSBjYXB0aW9uIGlmIGl0IGV4aXN0cwogICAgICBpZiAoY2FwdGlvbkxvY2F0aW9uKSB7CiAgICAgICAgLy9pZiBjYXB0aW9uIHRleHQgaXMgYmxhbmssIGRvbid0IHNob3cgY2FwdGlvbnMKICAgICAgICBpZiAoJC50cmltKCQoY2FwdGlvbkxvY2F0aW9uKS50ZXh0KCkpLmxlbmd0aCA8IDEpewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBpZiBsb2NhdGlvbiBzZWxlY3RvciBzdGFydHMgd2l0aCAnIycsIHJlbW92ZSBpdCBzbyB3ZSBkb24ndCBzZWUgaWQ9IiNzZWxlY3RvciIKICAgICAgICBpZiAoY2FwdGlvbkxvY2F0aW9uLmNoYXJBdCgwKSA9PSAnIycpIHsKICAgICAgICAgICAgY2FwdGlvbkxvY2F0aW9uID0gY2FwdGlvbkxvY2F0aW9uLnN1YnN0cmluZygxLCBjYXB0aW9uTG9jYXRpb24ubGVuZ3RoKTsKICAgICAgICB9CiAgICAgICAgY2FwdGlvbkhUTUwgPSAkKCcjJyArIGNhcHRpb25Mb2NhdGlvbikuaHRtbCgpOyAvL2dldCBIVE1MIGZyb20gdGhlIG1hdGNoaW5nIEhUTUwgZW50aXR5CiAgICAgICAgdGhpcy4kY2FwdGlvbgogICAgICAgICAgLmF0dHIoJ2lkJywgY2FwdGlvbkxvY2F0aW9uKSAvLyBBZGQgSUQgY2FwdGlvbiBUT0RPIHdoeSBpcyB0aGUgaWQgYmVpbmcgc2V0PwogICAgICAgICAgLmh0bWwoY2FwdGlvbkhUTUwpOyAvLyBDaGFuZ2UgSFRNTCBpbiBDYXB0aW9uCiAgICAgICAgICAvL0FuaW1hdGlvbnMgZm9yIENhcHRpb24gZW50cmFuY2VzCiAgICAgICAgc3dpdGNoICh0aGlzLm9wdGlvbnMuY2FwdGlvbkFuaW1hdGlvbikgewogICAgICAgICAgY2FzZSAnbm9uZSc6CiAgICAgICAgICAgIHRoaXMuJGNhcHRpb24uc2hvdygpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ2ZhZGUnOgogICAgICAgICAgICB0aGlzLiRjYXB0aW9uLmZhZGVJbih0aGlzLm9wdGlvbnMuY2FwdGlvbkFuaW1hdGlvblNwZWVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdzbGlkZU9wZW4nOgogICAgICAgICAgICB0aGlzLiRjYXB0aW9uLnNsaWRlRG93bih0aGlzLm9wdGlvbnMuY2FwdGlvbkFuaW1hdGlvblNwZWVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIC8vQW5pbWF0aW9ucyBmb3IgQ2FwdGlvbiBleGl0cwogICAgICAgIHN3aXRjaCAodGhpcy5vcHRpb25zLmNhcHRpb25BbmltYXRpb24pIHsKICAgICAgICAgIGNhc2UgJ25vbmUnOgogICAgICAgICAgICB0aGlzLiRjYXB0aW9uLmhpZGUoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdmYWRlJzoKICAgICAgICAgICAgdGhpcy4kY2FwdGlvbi5mYWRlT3V0KHRoaXMub3B0aW9ucy5jYXB0aW9uQW5pbWF0aW9uU3BlZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ3NsaWRlT3Blbic6CiAgICAgICAgICAgIHRoaXMuJGNhcHRpb24uc2xpZGVVcCh0aGlzLm9wdGlvbnMuY2FwdGlvbkFuaW1hdGlvblNwZWVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9LAoKICAgIHNldHVwRGlyZWN0aW9uYWxOYXY6IGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHNlbGYgPSB0aGlzLAogICAgICAgICAgJGRpcmVjdGlvbmFsTmF2ID0gJCh0aGlzLmRpcmVjdGlvbmFsTmF2SFRNTCk7CgogICAgICAkZGlyZWN0aW9uYWxOYXYuZmluZCgnLnJpZ2h0JykuaHRtbCh0aGlzLm9wdGlvbnMuZGlyZWN0aW9uYWxOYXZSaWdodFRleHQpOwogICAgICAkZGlyZWN0aW9uYWxOYXYuZmluZCgnLmxlZnQnKS5odG1sKHRoaXMub3B0aW9ucy5kaXJlY3Rpb25hbE5hdkxlZnRUZXh0KTsKCiAgICAgIHRoaXMuJHdyYXBwZXIuYXBwZW5kKCRkaXJlY3Rpb25hbE5hdik7CgogICAgICB0aGlzLiR3cmFwcGVyLmZpbmQoJy5sZWZ0JykuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgIHNlbGYuc3RvcENsb2NrKCk7CiAgICAgICAgaWYgKHNlbGYub3B0aW9ucy5yZXNldFRpbWVyT25DbGljaykgewogICAgICAgICAgc2VsZi5yb3RhdGVUaW1lcih0cnVlKTsKICAgICAgICAgIHNlbGYuc3RhcnRDbG9jaygpOwogICAgICAgIH0KICAgICAgICBzZWxmLiRlbGVtZW50LnRyaWdnZXIoJ29yYml0LnByZXYnKTsKICAgICAgfSk7CgogICAgICB0aGlzLiR3cmFwcGVyLmZpbmQoJy5yaWdodCcpLmNsaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICBzZWxmLnN0b3BDbG9jaygpOwogICAgICAgIGlmIChzZWxmLm9wdGlvbnMucmVzZXRUaW1lck9uQ2xpY2spIHsKICAgICAgICAgIHNlbGYucm90YXRlVGltZXIodHJ1ZSk7CiAgICAgICAgICBzZWxmLnN0YXJ0Q2xvY2soKTsKICAgICAgICB9CiAgICAgICAgc2VsZi4kZWxlbWVudC50cmlnZ2VyKCdvcmJpdC5uZXh0Jyk7CiAgICAgIH0pOwogICAgfSwKCiAgICBzZXR1cEJ1bGxldE5hdjogZnVuY3Rpb24gKCkgewogICAgICB0aGlzLiRidWxsZXRzID0gJCh0aGlzLmJ1bGxldEhUTUwpOwogICAgICB0aGlzLiR3cmFwcGVyLmFwcGVuZCh0aGlzLiRidWxsZXRzKTsKICAgICAgdGhpcy4kc2xpZGVzLmVhY2godGhpcy5hZGRCdWxsZXQpOwogICAgICB0aGlzLiRlbGVtZW50LmFkZENsYXNzKCd3aXRoLWJ1bGxldHMnKTsKICAgICAgaWYgKHRoaXMub3B0aW9ucy5jZW50ZXJCdWxsZXRzKSB0aGlzLiRidWxsZXRzLmNzcygnbWFyZ2luLWxlZnQnLCAtdGhpcy4kYnVsbGV0cy5vdXRlcldpZHRoKCkgLyAyKTsKICAgICAgaWYgKHRoaXMub3B0aW9ucy5idWxsZXRUaHVtYnNIaWRlT25TbWFsbCkgdGhpcy4kYnVsbGV0cy5hZGRDbGFzcygnaGlkZS1mb3Itc21hbGwnKTsKICAgIH0sCgogICAgYWRkQnVsbGV0OiBmdW5jdGlvbiAoaW5kZXgsIHNsaWRlKSB7CiAgICAgIHZhciBwb3NpdGlvbiA9IGluZGV4ICsgMSwKICAgICAgICAgICRsaSA9ICQoJzxsaT4nICsgKHBvc2l0aW9uKSArICc8L2xpPicpLAogICAgICAgICAgdGh1bWJOYW1lLAogICAgICAgICAgc2VsZiA9IHRoaXM7CgogICAgICBpZiAodGhpcy5vcHRpb25zLmJ1bGxldFRodW1icykgewogICAgICAgIHRodW1iTmFtZSA9ICQoc2xpZGUpLmF0dHIoJ2RhdGEtdGh1bWInKTsKICAgICAgICBpZiAodGh1bWJOYW1lKSB7CiAgICAgICAgICAkbGkKICAgICAgICAgICAgLmFkZENsYXNzKCdoYXMtdGh1bWInKQogICAgICAgICAgICAuY3NzKHtiYWNrZ3JvdW5kOiAidXJsKCIgKyB0aGlzLm9wdGlvbnMuYnVsbGV0VGh1bWJMb2NhdGlvbiArIHRodW1iTmFtZSArICIpIG5vLXJlcGVhdCJ9KTs7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMuJGJ1bGxldHMuYXBwZW5kKCRsaSk7CiAgICAgICRsaS5kYXRhKCdpbmRleCcsIGluZGV4KTsKICAgICAgJGxpLmNsaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICBzZWxmLnN0b3BDbG9jaygpOwogICAgICAgIGlmIChzZWxmLm9wdGlvbnMucmVzZXRUaW1lck9uQ2xpY2spIHsKICAgICAgICAgIHNlbGYucm90YXRlVGltZXIodHJ1ZSk7CiAgICAgICAgICBzZWxmLnN0YXJ0Q2xvY2soKTsKICAgICAgICB9CiAgICAgICAgc2VsZi4kZWxlbWVudC50cmlnZ2VyKCdvcmJpdC5nb3RvJywgWyRsaS5kYXRhKCdpbmRleCcpXSkKICAgICAgfSk7CiAgICB9LAoKICAgIHNldEFjdGl2ZUJ1bGxldDogZnVuY3Rpb24gKCkgewogICAgICBpZighdGhpcy5vcHRpb25zLmJ1bGxldHMpIHsgcmV0dXJuIGZhbHNlOyB9IGVsc2UgewogICAgICAgIHRoaXMuJGJ1bGxldHMuZmluZCgnbGknKQogICAgICAgICAgLnJlbW92ZUNsYXNzKCdhY3RpdmUnKQogICAgICAgICAgLmVxKHRoaXMuYWN0aXZlU2xpZGUpCiAgICAgICAgICAuYWRkQ2xhc3MoJ2FjdGl2ZScpOwogICAgICB9CiAgICB9LAoKICAgIHJlc2V0QW5kVW5sb2NrOiBmdW5jdGlvbiAoKSB7CiAgICAgIHRoaXMuJHNsaWRlcwogICAgICAgIC5lcSh0aGlzLnByZXZBY3RpdmVTbGlkZSkKICAgICAgICAuY3NzKHsiei1pbmRleCIgOiAxfSk7CiAgICAgIHRoaXMudW5sb2NrKCk7CiAgICAgIHRoaXMub3B0aW9ucy5hZnRlclNsaWRlQ2hhbmdlLmNhbGwodGhpcywgdGhpcy4kc2xpZGVzLmVxKHRoaXMucHJldkFjdGl2ZVNsaWRlKSwgdGhpcy4kc2xpZGVzLmVxKHRoaXMuYWN0aXZlU2xpZGUpKTsKICAgIH0sCgogICAgc2hpZnQ6IGZ1bmN0aW9uIChkaXJlY3Rpb24pIHsKICAgICAgdmFyIHNsaWRlRGlyZWN0aW9uID0gZGlyZWN0aW9uOwoKICAgICAgLy9yZW1lbWJlciBwcmV2aW91cyBhY3RpdmVTbGlkZQogICAgICB0aGlzLnByZXZBY3RpdmVTbGlkZSA9IHRoaXMuYWN0aXZlU2xpZGU7CgogICAgICAvL2V4aXQgZnVuY3Rpb24gaWYgYnVsbGV0IGNsaWNrZWQgaXMgc2FtZSBhcyB0aGUgY3VycmVudCBpbWFnZQogICAgICBpZiAodGhpcy5wcmV2QWN0aXZlU2xpZGUgPT0gc2xpZGVEaXJlY3Rpb24pIHsgcmV0dXJuIGZhbHNlOyB9CgogICAgICBpZiAodGhpcy4kc2xpZGVzLmxlbmd0aCA9PSAiMSIpIHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgIGlmICghdGhpcy5sb2NrZWQpIHsKICAgICAgICB0aGlzLmxvY2soKTsKICAgICAgICAvL2RlZHVjZSB0aGUgcHJvcGVyIGFjdGl2ZUltYWdlCiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSAibmV4dCIpIHsKICAgICAgICAgIHRoaXMuYWN0aXZlU2xpZGUrKzsKICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZVNsaWRlID09IHRoaXMubnVtYmVyU2xpZGVzKSB7CiAgICAgICAgICAgICAgdGhpcy5hY3RpdmVTbGlkZSA9IDA7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gInByZXYiKSB7CiAgICAgICAgICB0aGlzLmFjdGl2ZVNsaWRlLS0KICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZVNsaWRlIDwgMCkgewogICAgICAgICAgICB0aGlzLmFjdGl2ZVNsaWRlID0gdGhpcy5udW1iZXJTbGlkZXMgLSAxOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmFjdGl2ZVNsaWRlID0gZGlyZWN0aW9uOwogICAgICAgICAgaWYgKHRoaXMucHJldkFjdGl2ZVNsaWRlIDwgdGhpcy5hY3RpdmVTbGlkZSkgewogICAgICAgICAgICBzbGlkZURpcmVjdGlvbiA9ICJuZXh0IjsKICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcmV2QWN0aXZlU2xpZGUgPiB0aGlzLmFjdGl2ZVNsaWRlKSB7CiAgICAgICAgICAgIHNsaWRlRGlyZWN0aW9uID0gInByZXYiCiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvL3NldCB0byBjb3JyZWN0IGJ1bGxldAogICAgICAgIHRoaXMuc2V0QWN0aXZlQnVsbGV0KCk7CiAgICAgICAgdGhpcy5ub3RpZnlTbGlkZUNoYW5nZSgpOwoKICAgICAgICAvL3NldCBwcmV2aW91cyBzbGlkZSB6LWluZGV4IHRvIG9uZSBiZWxvdyB3aGF0IG5ldyBhY3RpdmVTbGlkZSB3aWxsIGJlCiAgICAgICAgdGhpcy4kc2xpZGVzCiAgICAgICAgICAuZXEodGhpcy5wcmV2QWN0aXZlU2xpZGUpCiAgICAgICAgICAuY3NzKHsiei1pbmRleCIgOiAyfSk7CgogICAgICAgIC8vZmFkZQogICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYW5pbWF0aW9uID09ICJmYWRlIikgewogICAgICAgICAgdGhpcy4kc2xpZGVzCiAgICAgICAgICAgIC5lcSh0aGlzLmFjdGl2ZVNsaWRlKQogICAgICAgICAgICAuY3NzKHsib3BhY2l0eSIgOiAwLCAiei1pbmRleCIgOiAzfSkKICAgICAgICAgICAgLmFuaW1hdGUoeyJvcGFjaXR5IiA6IDF9LCB0aGlzLm9wdGlvbnMuYW5pbWF0aW9uU3BlZWQsIHRoaXMucmVzZXRBbmRVbmxvY2spOwogICAgICAgICAgdGhpcy4kc2xpZGVzCiAgICAgICAgICAgICAgLmVxKHRoaXMucHJldkFjdGl2ZVNsaWRlKQogICAgICAgICAgICAgIC5hbmltYXRlKHsib3BhY2l0eSI6MH0sIHRoaXMub3B0aW9ucy5hbmltYXRpb25TcGVlZCk7CiAgICAgICAgfQoKICAgICAgICAvL2hvcml6b250YWwtc2xpZGUKICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFuaW1hdGlvbiA9PSAiaG9yaXpvbnRhbC1zbGlkZSIpIHsKICAgICAgICAgIGlmIChzbGlkZURpcmVjdGlvbiA9PSAibmV4dCIpIHsKICAgICAgICAgICAgdGhpcy4kc2xpZGVzCiAgICAgICAgICAgICAgLmVxKHRoaXMuYWN0aXZlU2xpZGUpCiAgICAgICAgICAgICAgLmNzcyh7ImxlZnQiOiB0aGlzLm9yYml0V2lkdGgsICJ6LWluZGV4IiA6IDN9KQogICAgICAgICAgICAgIC5jc3MoIm9wYWNpdHkiLCAxKQogICAgICAgICAgICAgIC5hbmltYXRlKHsibGVmdCIgOiAwfSwgdGhpcy5vcHRpb25zLmFuaW1hdGlvblNwZWVkLCB0aGlzLnJlc2V0QW5kVW5sb2NrKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzbGlkZURpcmVjdGlvbiA9PSAicHJldiIpIHsKICAgICAgICAgICAgdGhpcy4kc2xpZGVzCiAgICAgICAgICAgICAgLmVxKHRoaXMuYWN0aXZlU2xpZGUpCiAgICAgICAgICAgICAgLmNzcyh7ImxlZnQiOiAtdGhpcy5vcmJpdFdpZHRoLCAiei1pbmRleCIgOiAzfSkKICAgICAgICAgICAgICAuY3NzKCJvcGFjaXR5IiwgMSkKICAgICAgICAgICAgICAuYW5pbWF0ZSh7ImxlZnQiIDogMH0sIHRoaXMub3B0aW9ucy5hbmltYXRpb25TcGVlZCwgdGhpcy5yZXNldEFuZFVubG9jayk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLiRzbGlkZXMKICAgICAgICAgICAgICAuZXEodGhpcy5wcmV2QWN0aXZlU2xpZGUpCiAgICAgICAgICAgICAgLmNzcygib3BhY2l0eSIsIDApOwogICAgICAgIH0KCiAgICAgICAgLy92ZXJ0aWNhbC1zbGlkZQogICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYW5pbWF0aW9uID09ICJ2ZXJ0aWNhbC1zbGlkZSIpIHsKICAgICAgICAgIGlmIChzbGlkZURpcmVjdGlvbiA9PSAicHJldiIpIHsKICAgICAgICAgICAgdGhpcy4kc2xpZGVzCiAgICAgICAgICAgICAgLmVxKHRoaXMuYWN0aXZlU2xpZGUpCiAgICAgICAgICAgICAgLmNzcyh7InRvcCI6IHRoaXMub3JiaXRIZWlnaHQsICJ6LWluZGV4IiA6IDN9KQogICAgICAgICAgICAgIC5jc3MoIm9wYWNpdHkiLCAxKQogICAgICAgICAgICAgIC5hbmltYXRlKHsidG9wIiA6IDB9LCB0aGlzLm9wdGlvbnMuYW5pbWF0aW9uU3BlZWQsIHRoaXMucmVzZXRBbmRVbmxvY2spOwogICAgICAgICAgICB0aGlzLiRzbGlkZXMKICAgICAgICAgICAgICAuZXEodGhpcy5wcmV2QWN0aXZlU2xpZGUpCiAgICAgICAgICAgICAgLmNzcygib3BhY2l0eSIsIDApOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHNsaWRlRGlyZWN0aW9uID09ICJuZXh0IikgewogICAgICAgICAgICB0aGlzLiRzbGlkZXMKICAgICAgICAgICAgICAuZXEodGhpcy5hY3RpdmVTbGlkZSkKICAgICAgICAgICAgICAuY3NzKHsidG9wIjogLXRoaXMub3JiaXRIZWlnaHQsICJ6LWluZGV4IiA6IDN9KQogICAgICAgICAgICAgIC5jc3MoIm9wYWNpdHkiLCAxKQogICAgICAgICAgICAgIC5hbmltYXRlKHsidG9wIiA6IDB9LCB0aGlzLm9wdGlvbnMuYW5pbWF0aW9uU3BlZWQsIHRoaXMucmVzZXRBbmRVbmxvY2spOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy4kc2xpZGVzCiAgICAgICAgICAgICAgLmVxKHRoaXMucHJldkFjdGl2ZVNsaWRlKQogICAgICAgICAgICAgIC5jc3MoIm9wYWNpdHkiLCAwKTsKICAgICAgICB9CgogICAgICAgIC8vaG9yaXpvbnRhbC1wdXNoCiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hbmltYXRpb24gPT0gImhvcml6b250YWwtcHVzaCIpIHsKICAgICAgICAgIGlmIChzbGlkZURpcmVjdGlvbiA9PSAibmV4dCIpIHsKICAgICAgICAgICAgdGhpcy4kc2xpZGVzCiAgICAgICAgICAgICAgLmVxKHRoaXMuYWN0aXZlU2xpZGUpCiAgICAgICAgICAgICAgLmNzcyh7ImxlZnQiOiB0aGlzLm9yYml0V2lkdGgsICJ6LWluZGV4IiA6IDN9KQogICAgICAgICAgICAgIC5hbmltYXRlKHsibGVmdCIgOiAwLCAib3BhY2l0eSIgOiAxfSwgdGhpcy5vcHRpb25zLmFuaW1hdGlvblNwZWVkLCB0aGlzLnJlc2V0QW5kVW5sb2NrKTsKICAgICAgICAgICAgdGhpcy4kc2xpZGVzCiAgICAgICAgICAgICAgLmVxKHRoaXMucHJldkFjdGl2ZVNsaWRlKQogICAgICAgICAgICAgIC5hbmltYXRlKHsibGVmdCIgOiAtdGhpcy5vcmJpdFdpZHRofSwgdGhpcy5vcHRpb25zLmFuaW1hdGlvblNwZWVkLCAiIiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICQodGhpcykuY3NzKHsib3BhY2l0eSIgOiAwfSk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc2xpZGVEaXJlY3Rpb24gPT0gInByZXYiKSB7CiAgICAgICAgICAgIHRoaXMuJHNsaWRlcwogICAgICAgICAgICAgIC5lcSh0aGlzLmFjdGl2ZVNsaWRlKQogICAgICAgICAgICAgIC5jc3MoeyJsZWZ0IjogLXRoaXMub3JiaXRXaWR0aCwgInotaW5kZXgiIDogM30pCiAgICAgICAgICAgICAgLmFuaW1hdGUoeyJsZWZ0IiA6IDAsICJvcGFjaXR5IiA6IDF9LCB0aGlzLm9wdGlvbnMuYW5pbWF0aW9uU3BlZWQsIHRoaXMucmVzZXRBbmRVbmxvY2spOwogICAgICAgICAgICB0aGlzLiRzbGlkZXMKICAgICAgICAgICAgICAuZXEodGhpcy5wcmV2QWN0aXZlU2xpZGUpCiAgICAgICAgICAgICAgLmFuaW1hdGUoeyJsZWZ0IiA6IHRoaXMub3JiaXRXaWR0aH0sIHRoaXMub3B0aW9ucy5hbmltYXRpb25TcGVlZCwgIiIsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmNzcyh7Im9wYWNpdHkiIDogMH0pOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy92ZXJ0aWNhbC1wdXNoCiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hbmltYXRpb24gPT0gInZlcnRpY2FsLXB1c2giKSB7CiAgICAgICAgICBpZiAoc2xpZGVEaXJlY3Rpb24gPT0gIm5leHQiKSB7CiAgICAgICAgICAgIHRoaXMuJHNsaWRlcwogICAgICAgICAgICAgIC5lcSh0aGlzLmFjdGl2ZVNsaWRlKQogICAgICAgICAgICAgIC5jc3Moe3RvcDogLXRoaXMub3JiaXRIZWlnaHQsICJ6LWluZGV4IiA6IDN9KQogICAgICAgICAgICAgIC5jc3MoIm9wYWNpdHkiLCAxKQogICAgICAgICAgICAgIC5hbmltYXRlKHt0b3AgOiAwLCAib3BhY2l0eSI6MX0sIHRoaXMub3B0aW9ucy5hbmltYXRpb25TcGVlZCwgdGhpcy5yZXNldEFuZFVubG9jayk7CiAgICAgICAgICAgIHRoaXMuJHNsaWRlcwogICAgICAgICAgICAgIC5lcSh0aGlzLnByZXZBY3RpdmVTbGlkZSkKICAgICAgICAgICAgICAuY3NzKCJvcGFjaXR5IiwgMCkKICAgICAgICAgICAgICAuYW5pbWF0ZSh7dG9wIDogdGhpcy5vcmJpdEhlaWdodH0sIHRoaXMub3B0aW9ucy5hbmltYXRpb25TcGVlZCwgIiIpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHNsaWRlRGlyZWN0aW9uID09ICJwcmV2IikgewogICAgICAgICAgICB0aGlzLiRzbGlkZXMKICAgICAgICAgICAgICAuZXEodGhpcy5hY3RpdmVTbGlkZSkKICAgICAgICAgICAgICAuY3NzKHt0b3A6IHRoaXMub3JiaXRIZWlnaHQsICJ6LWluZGV4IiA6IDN9KQogICAgICAgICAgICAgIC5jc3MoIm9wYWNpdHkiLCAxKQogICAgICAgICAgICAgIC5hbmltYXRlKHt0b3AgOiAwfSwgdGhpcy5vcHRpb25zLmFuaW1hdGlvblNwZWVkLCB0aGlzLnJlc2V0QW5kVW5sb2NrKTsKICAgICAgICAgICAgdGhpcy4kc2xpZGVzCiAgICAgICAgICAgICAgLmVxKHRoaXMucHJldkFjdGl2ZVNsaWRlKQogICAgICAgICAgICAgIC5jc3MoIm9wYWNpdHkiLCAwKQogICAgICAgICAgICAgIC5hbmltYXRlKHt0b3AgOiAtdGhpcy5vcmJpdEhlaWdodH0sIHRoaXMub3B0aW9ucy5hbmltYXRpb25TcGVlZCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB0aGlzLnNldENhcHRpb24oKTsKICAgICAgfQoKICAgICAgLy8gaWYgb24gbGFzdCBzbGlkZSBhbmQgc2luZ2xlQ3ljbGUgaXMgdHJ1ZSwgZG9uJ3QgbG9vcCB0aHJvdWdoIHNsaWRlcyBhZ2FpbgogICAgICAvLyAubGVuZ3RoIGlzIHplcm8gYmFzZWQgc28gbXVzdCBtaW51cyAxIHRvIG1hdGNoIGFjdGl2ZVNsaWRlIGluZGV4CiAgICAgIGlmICh0aGlzLmFjdGl2ZVNsaWRlID09PSB0aGlzLiRzbGlkZXMubGVuZ3RoLTEgJiYgdGhpcy5vcHRpb25zLnNpbmdsZUN5Y2xlKSB7CiAgICAgICAgdGhpcy5zdG9wQ2xvY2soKTsKICAgICAgfQogICAgfQogIH07CgogICQuZm4ub3JiaXQgPSBmdW5jdGlvbiAob3B0aW9ucykgewogICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBvcmJpdCA9ICQuZXh0ZW5kKHt9LCBPUkJJVCk7CiAgICAgIG9yYml0LmluaXQodGhpcywgb3B0aW9ucyk7CiAgICB9KTsKICB9OwoKfSkoalF1ZXJ5KTsKCi8qIQogKiBqUXVlcnkgaW1hZ2VyZWFkeSBQbHVnaW4KICogaHR0cDovL3d3dy56dXJiLmNvbS9wbGF5Z3JvdW5kLwogKgogKiBDb3B5cmlnaHQgMjAxMSwgWlVSQgogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UKICovCihmdW5jdGlvbiAoJCkgewoKICB2YXIgb3B0aW9ucyA9IHt9OwoKICAkLmV2ZW50LnNwZWNpYWwuaW1hZ2VyZWFkeSA9IHsKCiAgICBzZXR1cDogZnVuY3Rpb24gKGRhdGEsIG5hbWVzcGFjZXMsIGV2ZW50SGFuZGxlKSB7CiAgICAgIG9wdGlvbnMgPSBkYXRhIHx8IG9wdGlvbnM7CiAgICB9LAoKICAgIGFkZDogZnVuY3Rpb24gKGhhbmRsZU9iaikgewogICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLAogICAgICAgICAgc3JjOwoKICAgICAgaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxICYmIHRoaXMudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW1nJyAmJiB0aGlzLnNyYyAhPT0gJycgKSB7CiAgICAgICAgaWYgKG9wdGlvbnMuZm9yY2VMb2FkKSB7CiAgICAgICAgICBzcmMgPSAkdGhpcy5hdHRyKCdzcmMnKTsKICAgICAgICAgICR0aGlzLmF0dHIoJ3NyYycsICcnKTsKICAgICAgICAgIGJpbmRUb0xvYWQodGhpcywgaGFuZGxlT2JqLmhhbmRsZXIpOwogICAgICAgICAgJHRoaXMuYXR0cignc3JjJywgc3JjKTsKICAgICAgICB9IGVsc2UgaWYgKCB0aGlzLmNvbXBsZXRlIHx8IHRoaXMucmVhZHlTdGF0ZSA9PT0gNCApIHsKICAgICAgICAgIGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGJpbmRUb0xvYWQodGhpcywgaGFuZGxlT2JqLmhhbmRsZXIpOwogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICB0ZWFyZG93bjogZnVuY3Rpb24gKG5hbWVzcGFjZXMpIHsKICAgICAgJCh0aGlzKS51bmJpbmQoJy5pbWFnZXJlYWR5Jyk7CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gYmluZFRvTG9hZChlbGVtZW50LCBjYWxsYmFjaykgewogICAgdmFyICR0aGlzID0gJChlbGVtZW50KTsKCiAgICAkdGhpcy5iaW5kKCdsb2FkLmltYWdlcmVhZHknLCBmdW5jdGlvbiAoKSB7CiAgICAgICBjYWxsYmFjay5hcHBseShlbGVtZW50LCBhcmd1bWVudHMpOwogICAgICAgJHRoaXMudW5iaW5kKCdsb2FkLmltYWdlcmVhZHknKTsKICAgICB9KTsKICB9Cgp9KGpRdWVyeSkpOwoKLyoKCkhvbGRlciAtIDEuMyAtIGNsaWVudCBzaWRlIGltYWdlIHBsYWNlaG9sZGVycwooYykgMjAxMiBJdmFuIE1hbG9waW5za3kgLyBodHRwOi8vaW1za3kuY28KClByb3ZpZGVkIHVuZGVyIHRoZSBBcGFjaGUgMi4wIExpY2Vuc2U6IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMApDb21tZXJjaWFsIHVzZSByZXF1aXJlcyBhdHRyaWJ1dGlvbi4KCiovCgp2YXIgSG9sZGVyID0gSG9sZGVyIHx8IHt9OwooZnVuY3Rpb24gKGFwcCwgd2luKSB7Cgp2YXIgcHJlZW1wdGVkID0gZmFsc2UsCmZhbGxiYWNrID0gZmFsc2UsCmNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOwoKLy9odHRwOi8vamF2YXNjcmlwdC5ud2JveC5jb20vQ29udGVudExvYWRlZCBieSBEaWVnbyBQZXJpbmkgd2l0aCBtb2RpZmljYXRpb25zCmZ1bmN0aW9uIGNvbnRlbnRMb2FkZWQobix0KXt2YXIgbD0iY29tcGxldGUiLHM9InJlYWR5c3RhdGVjaGFuZ2UiLHU9ITEsaD11LGM9ITAsaT1uLmRvY3VtZW50LGE9aS5kb2N1bWVudEVsZW1lbnQsZT1pLmFkZEV2ZW50TGlzdGVuZXI/ImFkZEV2ZW50TGlzdGVuZXIiOiJhdHRhY2hFdmVudCIsdj1pLmFkZEV2ZW50TGlzdGVuZXI/InJlbW92ZUV2ZW50TGlzdGVuZXIiOiJkZXRhY2hFdmVudCIsZj1pLmFkZEV2ZW50TGlzdGVuZXI/IiI6Im9uIixyPWZ1bmN0aW9uKGUpeyhlLnR5cGUhPXN8fGkucmVhZHlTdGF0ZT09bCkmJigoZS50eXBlPT0ibG9hZCI/bjppKVt2XShmK2UudHlwZSxyLHUpLCFoJiYoaD0hMCkmJnQuY2FsbChuLG51bGwpKX0sbz1mdW5jdGlvbigpe3RyeXthLmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2gobil7c2V0VGltZW91dChvLDUwKTtyZXR1cm59cigicG9sbCIpfTtpZihpLnJlYWR5U3RhdGU9PWwpdC5jYWxsKG4sImxhenkiKTtlbHNle2lmKGkuY3JlYXRlRXZlbnRPYmplY3QmJmEuZG9TY3JvbGwpe3RyeXtjPSFuLmZyYW1lRWxlbWVudH1jYXRjaCh5KXt9YyYmbygpfWlbZV0oZisiRE9NQ29udGVudExvYWRlZCIscix1KSxpW2VdKGYrcyxyLHUpLG5bZV0oZisibG9hZCIscix1KX19OwoKLy9odHRwczovL2dpc3QuZ2l0aHViLmNvbS85OTEwNTcgYnkgSmVkIFNjaG1pZHQgd2l0aCBtb2RpZmljYXRpb25zCmZ1bmN0aW9uIHNlbGVjdG9yKGEpewoJYT1hLm1hdGNoKC9eKFxXKT8oLiopLyk7dmFyIGI9ZG9jdW1lbnRbImdldEVsZW1lbnQiKyhhWzFdP2FbMV09PSIjIj8iQnlJZCI6InNCeUNsYXNzTmFtZSI6InNCeVRhZ05hbWUiKV0oYVsyXSk7Cgl2YXIgcmV0PVtdOwliIT1udWxsJiYoYi5sZW5ndGg/cmV0PWI6Yi5sZW5ndGg9PTA/cmV0PWI6cmV0PVtiXSk7CXJldHVybiByZXQ7Cn0KCi8vc2hhbGxvdyBvYmplY3QgcHJvcGVydHkgZXh0ZW5kCmZ1bmN0aW9uIGV4dGVuZChhLGIpe3ZhciBjPXt9O2Zvcih2YXIgZCBpbiBhKWNbZF09YVtkXTtmb3IodmFyIGUgaW4gYiljW2VdPWJbZV07cmV0dXJuIGN9CgpmdW5jdGlvbiBkcmF3KGN0eCwgZGltZW5zaW9ucywgdGVtcGxhdGUpIHsKCXZhciBkaW1lbnNpb25fYXJyID0gW2RpbWVuc2lvbnMuaGVpZ2h0LCBkaW1lbnNpb25zLndpZHRoXS5zb3J0KCk7Cgl2YXIgbWF4RmFjdG9yID0gTWF0aC5yb3VuZChkaW1lbnNpb25fYXJyWzFdIC8gMTYpLAoJCW1pbkZhY3RvciA9IE1hdGgucm91bmQoZGltZW5zaW9uX2FyclswXSAvIDE2KTsKCXZhciB0ZXh0X2hlaWdodCA9IE1hdGgubWF4KHRlbXBsYXRlLnNpemUsIG1heEZhY3Rvcik7CgljYW52YXMud2lkdGggPSBkaW1lbnNpb25zLndpZHRoOwoJY2FudmFzLmhlaWdodCA9IGRpbWVuc2lvbnMuaGVpZ2h0OwoJY3R4LnRleHRBbGlnbiA9ICJjZW50ZXIiOwoJY3R4LnRleHRCYXNlbGluZSA9ICJtaWRkbGUiOwoJY3R4LmZpbGxTdHlsZSA9IHRlbXBsYXRlLmJhY2tncm91bmQ7CgljdHguZmlsbFJlY3QoMCwgMCwgZGltZW5zaW9ucy53aWR0aCwgZGltZW5zaW9ucy5oZWlnaHQpOwoJY3R4LmZpbGxTdHlsZSA9IHRlbXBsYXRlLmZvcmVncm91bmQ7CgljdHguZm9udCA9ICJib2xkICIgKyB0ZXh0X2hlaWdodCArICJweCBzYW5zLXNlcmlmIjsKCXZhciB0ZXh0ID0gdGVtcGxhdGUudGV4dCA/IHRlbXBsYXRlLnRleHQgOiAoZGltZW5zaW9ucy53aWR0aCArICJ4IiArIGRpbWVuc2lvbnMuaGVpZ2h0KTsKCWlmIChNYXRoLnJvdW5kKGN0eC5tZWFzdXJlVGV4dCh0ZXh0KS53aWR0aCkgLyBkaW1lbnNpb25zLndpZHRoID4gMSkgewoJCXRleHRfaGVpZ2h0ID0gTWF0aC5tYXgobWluRmFjdG9yLCB0ZW1wbGF0ZS5zaXplKTsKCX0KCWN0eC5mb250ID0gImJvbGQgIiArIHRleHRfaGVpZ2h0ICsgInB4IHNhbnMtc2VyaWYiOwoJY3R4LmZpbGxUZXh0KHRleHQsIChkaW1lbnNpb25zLndpZHRoIC8gMiksIChkaW1lbnNpb25zLmhlaWdodCAvIDIpLCBkaW1lbnNpb25zLndpZHRoKTsKCXJldHVybiBjYW52YXMudG9EYXRhVVJMKCJpbWFnZS9wbmciKTsKfQoKaWYgKCFjYW52YXMuZ2V0Q29udGV4dCkgewoJZmFsbGJhY2sgPSB0cnVlOwp9IGVsc2UgewoJaWYgKGNhbnZhcy50b0RhdGFVUkwoImltYWdlL3BuZyIpLmluZGV4T2YoImRhdGE6aW1hZ2UvcG5nIikgPCAwKSB7CgkJLy9BbmRyb2lkIGRvZXNuJ3Qgc3VwcG9ydCBkYXRhIFVSSQoJCWZhbGxiYWNrID0gdHJ1ZTsKCX0gZWxzZSB7CgkJdmFyIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwoJfQp9Cgp2YXIgc2V0dGluZ3MgPSB7Cglkb21haW46ICJob2xkZXIuanMiLAoJaW1hZ2VzOiAiaW1nIiwKCXRoZW1lczogewoJCSJncmF5IjogewoJCQliYWNrZ3JvdW5kOiAiI2VlZSIsCgkJCWZvcmVncm91bmQ6ICIjYWFhIiwKCQkJc2l6ZTogMTIKCQl9LAoJCSJzb2NpYWwiOiB7CgkJCWJhY2tncm91bmQ6ICIjM2E1YTk3IiwKCQkJZm9yZWdyb3VuZDogIiNmZmYiLAoJCQlzaXplOiAxMgoJCX0sCgkJImluZHVzdHJpYWwiOiB7CgkJCWJhY2tncm91bmQ6ICIjNDM0QTUyIiwKCQkJZm9yZWdyb3VuZDogIiNDMkYyMDAiLAoJCQlzaXplOiAxMgoJCX0KCX0KfTsKCgoKYXBwLmZsYWdzID0gewoJZGltZW5zaW9uczogewoJCXJlZ2V4OiAvKFswLTldKyl4KFswLTldKykvLAoJCW91dHB1dDogZnVuY3Rpb24odmFsKXsKCQkJdmFyIGV4ZWMgPSB0aGlzLnJlZ2V4LmV4ZWModmFsKTsKCQkJcmV0dXJuIHsKCQkJCXdpZHRoOiArZXhlY1sxXSwKCQkJCWhlaWdodDogK2V4ZWNbMl0KCQkJfQoJCX0KCX0sCgljb2xvcnM6IHsKCQlyZWdleDogLyMoWzAtOWEtZl17Myx9KVw6IyhbMC05YS1mXXszLH0pL2ksCgkJb3V0cHV0OiBmdW5jdGlvbih2YWwpewoJCQl2YXIgZXhlYyA9IHRoaXMucmVnZXguZXhlYyh2YWwpOwoJCQlyZXR1cm4gewoJCQkJCXNpemU6IHNldHRpbmdzLnRoZW1lcy5ncmF5LnNpemUsCgkJCQkJZm9yZWdyb3VuZDogIiMiICsgZXhlY1syXSwKCQkJCQliYWNrZ3JvdW5kOiAiIyIgKyBleGVjWzFdCgkJCQkJfQoJCX0KCX0sCgl0ZXh0OiB7CgkJcmVnZXg6IC90ZXh0XDooLiopLywKCQlvdXRwdXQ6IGZ1bmN0aW9uKHZhbCl7CgkJCXJldHVybiB0aGlzLnJlZ2V4LmV4ZWModmFsKVsxXTsKCQl9Cgl9Cn0KCmZvcih2YXIgZmxhZyBpbiBhcHAuZmxhZ3MpewoJYXBwLmZsYWdzW2ZsYWddLm1hdGNoID0gZnVuY3Rpb24gKHZhbCl7CgkJcmV0dXJuIHZhbC5tYXRjaCh0aGlzLnJlZ2V4KQoJfQp9CgphcHAuYWRkX3RoZW1lID0gZnVuY3Rpb24gKG5hbWUsIHRoZW1lKSB7CgluYW1lICE9IG51bGwgJiYgdGhlbWUgIT0gbnVsbCAmJiAoc2V0dGluZ3MudGhlbWVzW25hbWVdID0gdGhlbWUpOwoJcmV0dXJuIGFwcDsKfTsKCmFwcC5hZGRfaW1hZ2UgPSBmdW5jdGlvbiAoc3JjLCBlbCkgewoJdmFyIG5vZGUgPSBzZWxlY3RvcihlbCk7CglpZiAobm9kZS5sZW5ndGgpIHsKCQlmb3IgKHZhciBpID0gMCwgbCA9IG5vZGUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CgkJCXZhciBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKQoJCQlpbWcuc2V0QXR0cmlidXRlKCJkYXRhLXNyYyIsIHNyYyk7CgkJCW5vZGVbaV0uYXBwZW5kQ2hpbGQoaW1nKTsKCQl9Cgl9CglyZXR1cm4gYXBwOwp9OwoKYXBwLnJ1biA9IGZ1bmN0aW9uIChvKSB7Cgl2YXIgb3B0aW9ucyA9IGV4dGVuZChzZXR0aW5ncywgbyksCgkJaW1hZ2VzID0gc2VsZWN0b3Iob3B0aW9ucy5pbWFnZXMpLAoJCXByZWVtcHRlZCA9IHRydWU7CgoJZm9yICh2YXIgbCA9IGltYWdlcy5sZW5ndGgsIGkgPSAwOyBpIDwgbDsgaSsrKSB7CgkJdmFyIHRoZW1lID0gc2V0dGluZ3MudGhlbWVzLmdyYXk7CgkJdmFyIHNyYyA9IGltYWdlc1tpXS5nZXRBdHRyaWJ1dGUoImRhdGEtc3JjIikgfHwgaW1hZ2VzW2ldLmdldEF0dHJpYnV0ZSgic3JjIik7CgkJaWYgKHNyYyAmJiAhISB+c3JjLmluZGV4T2Yob3B0aW9ucy5kb21haW4pKSB7CgkJCXZhciByZW5kZXIgPSBmYWxzZSwKCQkJCWRpbWVuc2lvbnMgPSBudWxsLAoJCQkJdGV4dCA9IG51bGw7CgkJCXZhciBmbGFncyA9IHNyYy5zdWJzdHIoc3JjLmluZGV4T2Yob3B0aW9ucy5kb21haW4pICsgb3B0aW9ucy5kb21haW4ubGVuZ3RoICsgMSkuc3BsaXQoIi8iKTsKCQkJZm9yIChzbCA9IGZsYWdzLmxlbmd0aCwgaiA9IDA7IGogPCBzbDsgaisrKSB7CgkJCQlpZiAoYXBwLmZsYWdzLmRpbWVuc2lvbnMubWF0Y2goZmxhZ3Nbal0pKSB7CgkJCQkJcmVuZGVyID0gdHJ1ZTsKCQkJCQlkaW1lbnNpb25zID0gYXBwLmZsYWdzLmRpbWVuc2lvbnMub3V0cHV0KGZsYWdzW2pdKTsKCQkJCX0gZWxzZSBpZiAoYXBwLmZsYWdzLmNvbG9ycy5tYXRjaChmbGFnc1tqXSkpIHsKCQkJCQl0aGVtZSA9IGFwcC5mbGFncy5jb2xvcnMub3V0cHV0KGZsYWdzW2pdKTsKCQkJCX0gZWxzZSBpZiAob3B0aW9ucy50aGVtZXNbZmxhZ3Nbal1dKSB7CgkJCQkJLy9JZiBhIHRoZW1lIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBvdmVycmlkZSBjdXN0b20gY29sb3JzCgkJCQkJdGhlbWUgPSBvcHRpb25zLnRoZW1lc1tmbGFnc1tqXV07CgkJCQl9IGVsc2UgaWYgKGFwcC5mbGFncy50ZXh0Lm1hdGNoKGZsYWdzW2pdKSkgewoJCQkJCXRleHQgPSBhcHAuZmxhZ3MudGV4dC5vdXRwdXQoZmxhZ3Nbal0pOwoJCQkJfQoJCQl9CgkJCWlmIChyZW5kZXIpIHsKCQkJCWltYWdlc1tpXS5zZXRBdHRyaWJ1dGUoImRhdGEtc3JjIiwgc3JjKTsKCQkJCXZhciBkaW1lbnNpb25zX2NhcHRpb24gPSBkaW1lbnNpb25zLndpZHRoICsgIngiICsgZGltZW5zaW9ucy5oZWlnaHQ7CgkJCQlpbWFnZXNbaV0uc2V0QXR0cmlidXRlKCJhbHQiLCB0ZXh0ID8gdGV4dCA6IHRoZW1lLnRleHQgPyB0aGVtZS50ZXh0ICsgIiBbIiArIGRpbWVuc2lvbnNfY2FwdGlvbiArICJdIiA6IGRpbWVuc2lvbnNfY2FwdGlvbik7CgoJCQkJLy8gRmFsbGJhY2sKICAgICAgICAvLyBpbWFnZXNbaV0uc3R5bGUud2lkdGggPSBkaW1lbnNpb25zLndpZHRoICsgInB4IjsKICAgICAgICAvLyBpbWFnZXNbaV0uc3R5bGUuaGVpZ2h0ID0gZGltZW5zaW9ucy5oZWlnaHQgKyAicHgiOwoJCQkJaW1hZ2VzW2ldLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoZW1lLmJhY2tncm91bmQ7CgoJCQkJdmFyIHRoZW1lID0gKHRleHQgPyBleHRlbmQodGhlbWUsIHsKCQkJCQkJdGV4dDogdGV4dAoJCQkJCX0pIDogdGhlbWUpOwoKCQkJCWlmICghZmFsbGJhY2spIHsKCQkJCQlpbWFnZXNbaV0uc2V0QXR0cmlidXRlKCJzcmMiLCBkcmF3KGN0eCwgZGltZW5zaW9ucywgdGhlbWUpKTsKCQkJCX0KCQkJfQoJCX0KCX0KCXJldHVybiBhcHA7Cn07CmNvbnRlbnRMb2FkZWQod2luLCBmdW5jdGlvbiAoKSB7CglwcmVlbXB0ZWQgfHwgYXBwLnJ1bigpCn0pCgp9KShIb2xkZXIsIHdpbmRvdyk7Cg==]]></data>
	</file>
	<file>
	  <filename>/assets/javascripts/jquery.foundation.reveal.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IFJldmVhbCBQbHVnaW4gMS4xCiAqIHd3dy5aVVJCLmNvbQogKiBDb3B5cmlnaHQgMjAxMCwgWlVSQgogKiBGcmVlIHRvIHVzZSB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwCiovCi8qZ2xvYmFscyBqUXVlcnkgKi8KCihmdW5jdGlvbiAoJCkgewogICd1c2Ugc3RyaWN0JzsKICAvLwogIC8vIEdsb2JhbCB2YXJpYWJsZS4KICAvLyBIZWxwcyB1cyBkZXRlcm1pbmUgaWYgdGhlIGN1cnJlbnQgbW9kYWwgaXMgYmVpbmcgcXVldWVkIGZvciBkaXNwbGF5LgogIC8vCiAgdmFyIG1vZGFsUXVldWVkID0gZmFsc2U7CgogIC8vCiAgLy8gQmluZCB0aGUgbGl2ZSAnY2xpY2snIGV2ZW50IHRvIGFsbCBhbmNob3IgZWxlbW5ldHMgd2l0aCB0aGUgZGF0YS1yZXZlYWwtaWQgYXR0cmlidXRlLgogIC8vCiAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJ2FbZGF0YS1yZXZlYWwtaWRdJywgZnVuY3Rpb24gKCBldmVudCApIHsKICAgIC8vCiAgICAvLyBQcmV2ZW50IGRlZmF1bHQgYWN0aW9uIG9mIHRoZSBldmVudC4KICAgIC8vCiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgLy8KICAgIC8vIEdldCB0aGUgY2xpY2tlZCBhbmNob3IgZGF0YS1yZXZlYWwtaWQgYXR0cmlidXRlIHZhbHVlLgogICAgLy8KICAgIHZhciBtb2RhbExvY2F0aW9uID0gJCggdGhpcyApLmF0dHIoICdkYXRhLXJldmVhbC1pZCcgKTsKICAgIC8vCiAgICAvLyBGaW5kIHRoZSBlbGVtZW50IHdpdGggdGhhdCBtb2RhbExvY2F0aW9uIGlkIGFuZCBjYWxsIHRoZSByZXZlYWwgcGx1Z2luLgogICAgLy8KICAgICQoICcjJyArIG1vZGFsTG9jYXRpb24gKS5yZXZlYWwoICQoIHRoaXMgKS5kYXRhKCkgKTsKCiAgfSk7CgogIC8qKgogICAqIEBtb2R1bGUgcmV2ZWFsCiAgICogQHByb3BlcnR5IHtPYmplY3R9IFtvcHRpb25zXSBSZXZlYWwgb3B0aW9ucwogICAqLwogICQuZm4ucmV2ZWFsID0gZnVuY3Rpb24gKCBvcHRpb25zICkgewogICAgICAvKgogICAgICAgKiBDYWNoZSB0aGUgZG9jdW1lbnQgb2JqZWN0LgogICAgICAgKi8KICAgIHZhciAkZG9jID0gJCggZG9jdW1lbnQgKSwKICAgICAgICAvKgogICAgICAgICAqIERlZmF1bHQgcHJvcGVydHkgdmFsdWVzLgogICAgICAgICAqLwogICAgICAgIGRlZmF1bHRzID0gewogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBQb3NzaWJsZSBvcHRpb25zOiBmYWRlLCBmYWRlQW5kUG9wLCBub25lCiAgICAgICAgICAgKgogICAgICAgICAgICogQHByb3BlcnR5IGFuaW1hdGlvbgogICAgICAgICAgICogQHR5cGUge1N0cmluZ30KICAgICAgICAgICAqIEBkZWZhdWx0IGZhZGVBbmRQb3AKICAgICAgICAgICAqLwogICAgICAgICAgYW5pbWF0aW9uOiAnZmFkZUFuZFBvcCcsCiAgICAgICAgICAvKioKICAgICAgICAgICAqIFNwZWVkIGF0IHdoaWNoIHRoZSByZXZlYWwgc2hvdWxkIHNob3cuIEhvdyBmYXN0IGFuaW10aW9ucyBhcmUuCiAgICAgICAgICAgKgogICAgICAgICAgICogQHByb3BlcnR5IGFuaW1hdGlvblNwZWVkCiAgICAgICAgICAgKiBAdHlwZSB7SW50ZWdlcn0KICAgICAgICAgICAqIEBkZWZhdWx0IDMwMAogICAgICAgICAgICovCiAgICAgICAgICBhbmltYXRpb25TcGVlZDogMzAwLAogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBTaG91bGQgdGhlIG1vZGFsIGNsb3NlIHdoZW4gdGhlIGJhY2tncm91bmQgaXMgY2xpY2tlZD8KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJvcGVydHkgY2xvc2VPbkJhY2tncm91bmRDbGljawogICAgICAgICAgICogQHR5cGUge0Jvb2xlYW59CiAgICAgICAgICAgKiBAZGVmYXVsdCB0cnVlCiAgICAgICAgICAgKi8KICAgICAgICAgIGNsb3NlT25CYWNrZ3JvdW5kQ2xpY2s6IHRydWUsCiAgICAgICAgICAvKioKICAgICAgICAgICAqIFNwZWNpZnkgYSBjbGFzcyBuYW1lIGZvciB0aGUgJ2Nsb3NlIG1vZGFsJyBlbGVtZW50LgogICAgICAgICAgICogVGhpcyBlbGVtZW50IHdpbGwgY2xvc2UgYW4gb3BlbiBtb2RhbC4KICAgICAgICAgICAqCiAgICAgICAgICAgQGV4YW1wbGUKICAgICAgICAgICA8YSBocmVmPScjY2xvc2UnIGNsYXNzPSdjbG9zZS1yZXZlYWwtbW9kYWwnPkNsb3NlIE1lPC9hPgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcm9wZXJ0eSBkaXNtaXNzTW9kYWxDbGFzcwogICAgICAgICAgICogQHR5cGUge1N0cmluZ30KICAgICAgICAgICAqIEBkZWZhdWx0IGNsb3NlLXJldmVhbC1tb2RhbAogICAgICAgICAgICovCiAgICAgICAgICBkaXNtaXNzTW9kYWxDbGFzczogJ2Nsb3NlLXJldmVhbC1tb2RhbCcsCiAgICAgICAgICAvKioKICAgICAgICAgICAqIFNwZWNpZnkgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHRyaWdnZXJzICdiZWZvcmUnIHRoZSBtb2RhbCBvcGVucy4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJvcGVydHkgb3BlbgogICAgICAgICAgICogQHR5cGUge0Z1bmN0aW9ufQogICAgICAgICAgICogQGRlZmF1bHQgZnVuY3Rpb24oKXt9CiAgICAgICAgICAgKi8KICAgICAgICAgIG9wZW46ICQubm9vcCwKICAgICAgICAgIC8qKgogICAgICAgICAgICogU3BlY2lmeSBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgdHJpZ2dlcnMgJ2FmdGVyJyB0aGUgbW9kYWwgaXMgb3BlbmVkLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcm9wZXJ0eSBvcGVuZWQKICAgICAgICAgICAqIEB0eXBlIHtGdW5jdGlvbn0KICAgICAgICAgICAqIEBkZWZhdWx0IGZ1bmN0aW9uKCl7fQogICAgICAgICAgICovCiAgICAgICAgICBvcGVuZWQ6ICQubm9vcCwKICAgICAgICAgIC8qKgogICAgICAgICAgICogU3BlY2lmeSBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgdHJpZ2dlcnMgJ2JlZm9yZScgdGhlIG1vZGFsIHByZXBhcmVzIHRvIGNsb3NlLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBwcm9wZXJ0eSBjbG9zZQogICAgICAgICAgICogQHR5cGUge0Z1bmN0aW9ufQogICAgICAgICAgICogQGRlZmF1bHQgZnVuY3Rpb24oKXt9CiAgICAgICAgICAgKi8KICAgICAgICAgIGNsb3NlOiAkLm5vb3AsCiAgICAgICAgICAvKioKICAgICAgICAgICAqIFNwZWNpZnkgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHRyaWdnZXJzICdhZnRlcicgdGhlIG1vZGFsIGlzIGNsb3NlZC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAcHJvcGVydHkgY2xvc2VkCiAgICAgICAgICAgKiBAdHlwZSB7RnVuY3Rpb259CiAgICAgICAgICAgKiBAZGVmYXVsdCBmdW5jdGlvbigpe30KICAgICAgICAgICAqLwogICAgICAgICAgY2xvc2VkOiAkLm5vb3AKICAgICAgICB9CiAgICA7CiAgICAvLwogICAgLy8gRXh0ZW5kIHRoZSBkZWZhdWx0IG9wdGlvbnMuCiAgICAvLyBUaGlzIHJlcGxhY2VzIHRoZSBwYXNzZWQgaW4gb3B0aW9uIChvcHRpb25zKSB2YWx1ZXMgd2l0aCBkZWZhdWx0IHZhbHVlcy4KICAgIC8vCiAgICBvcHRpb25zID0gJC5leHRlbmQoIHt9LCBkZWZhdWx0cywgb3B0aW9ucyApOwoKICAgIC8vCiAgICAvLyBBcHBseSB0aGUgcGx1Z2luIGZ1bmN0aW9uYWxpdHkgdG8gZWFjaCBlbGVtZW50IGluIHRoZSBqUXVlcnkgY29sbGVjdGlvbi4KICAgIC8vCiAgICByZXR1cm4gdGhpcy5ub3QoJy5yZXZlYWwtbW9kYWwub3BlbicpLmVhY2goIGZ1bmN0aW9uICgpIHsKICAgICAgICAvLwogICAgICAgIC8vIENhY2hlIHRoZSBtb2RhbCBlbGVtZW50CiAgICAgICAgLy8KICAgICAgdmFyIG1vZGFsID0gJCggdGhpcyApLAogICAgICAgIC8vCiAgICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IGNzcyAndG9wJyBwcm9wZXJ0eSB2YWx1ZSBpbiBkZWNpbWFsIGZvcm1hdC4KICAgICAgICAvLwogICAgICAgIHRvcE1lYXN1cmUgPSBwYXJzZUludCggbW9kYWwuY3NzKCAndG9wJyApLCAxMCApLAogICAgICAgIC8vCiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB0b3Agb2Zmc2V0LgogICAgICAgIC8vCiAgICAgICAgdG9wT2Zmc2V0ID0gbW9kYWwuaGVpZ2h0KCkgKyB0b3BNZWFzdXJlLAogICAgICAgIC8vCiAgICAgICAgLy8gSGVscHMgZGV0ZXJtaW5lIGlmIHRoZSBtb2RhbCBpcyBsb2NrZWQuCiAgICAgICAgLy8gVGhpcyB3YXkgd2Uga2VlcCB0aGUgbW9kYWwgZnJvbSB0cmlnZ2VyaW5nIHdoaWxlIGl0J3MgaW4gdGhlIG1pZGRsZSBvZiBhbmltYXRpbmcuCiAgICAgICAgLy8KICAgICAgICBsb2NrZWQgPSBmYWxzZSwKICAgICAgICAvLwogICAgICAgIC8vIEdldCB0aGUgbW9kYWwgYmFja2dyb3VuZCBlbGVtZW50LgogICAgICAgIC8vCiAgICAgICAgbW9kYWxCZyA9ICQoICcucmV2ZWFsLW1vZGFsLWJnJyApLAogICAgICAgIC8vCiAgICAgICAgLy8gU2hvdyBtb2RhbCBwcm9wZXJ0aWVzCiAgICAgICAgLy8KICAgICAgICBjc3NPcHRzID0gewogICAgICAgICAgLy8KICAgICAgICAgIC8vIFVzZWQsIHdoZW4gd2Ugc2hvdyB0aGUgbW9kYWwuCiAgICAgICAgICAvLwogICAgICAgICAgb3BlbiA6IHsKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gU2V0IHRoZSAndG9wJyBwcm9wZXJ0eSB0byB0aGUgZG9jdW1lbnQgc2Nyb2xsIG1pbnVzIHRoZSBjYWxjdWxhdGVkIHRvcCBvZmZzZXQuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgICd0b3AnOiAwLAogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBPcGFjaXR5IGdldHMgc2V0IHRvIDAuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgICdvcGFjaXR5JzogMCwKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gU2hvdyB0aGUgbW9kYWwKICAgICAgICAgICAgLy8KICAgICAgICAgICAgJ3Zpc2liaWxpdHknOiAndmlzaWJsZScsCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIEVuc3VyZSBpdCdzIGRpc3BsYXllZCBhcyBhIGJsb2NrIGVsZW1lbnQuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgICdkaXNwbGF5JzogJ2Jsb2NrJwogICAgICAgICAgfSwKICAgICAgICAgIC8vCiAgICAgICAgICAvLyBVc2VkLCB3aGVuIHdlIGhpZGUgdGhlIG1vZGFsLgogICAgICAgICAgLy8KICAgICAgICAgIGNsb3NlIDogewogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBTZXQgdGhlIGRlZmF1bHQgJ3RvcCcgcHJvcGVydHkgdmFsdWUuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgICd0b3AnOiB0b3BNZWFzdXJlLAogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBIYXMgZnVsbCBvcGFjaXR5LgogICAgICAgICAgICAvLwogICAgICAgICAgICAnb3BhY2l0eSc6IDEsCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIEhpZGUgdGhlIG1vZGFsCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgICd2aXNpYmlsaXR5JzogJ2hpZGRlbicsCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIEVuc3VyZSB0aGUgZWxtZW50IGlzIGhpZGRlbi4KICAgICAgICAgICAgLy8KICAgICAgICAgICAgJ2Rpc3BsYXknOiAnbm9uZScKICAgICAgICAgIH0KCiAgICAgICAgfSwKICAgICAgICAvLwogICAgICAgIC8vIEluaXRpYWwgY2xvc2VCdXR0b24gdmFyaWFibGUuCiAgICAgICAgLy8KICAgICAgICAkY2xvc2VCdXR0b24KICAgICAgOwoKICAgICAgLy8KICAgICAgLy8gRG8gd2UgaGF2ZSBhIG1vZGFsIGJhY2tncm91bmQgZWxlbWVudD8KICAgICAgLy8KICAgICAgaWYgKCBtb2RhbEJnLmxlbmd0aCA9PT0gMCApIHsKICAgICAgICAvLwogICAgICAgIC8vIE5vIHdlIGRvbid0LiBTbywgbGV0J3MgY3JlYXRlIG9uZS4KICAgICAgICAvLwogICAgICAgIG1vZGFsQmcgPSAkKCAnPGRpdiAvPicsIHsgJ2NsYXNzJyA6ICdyZXZlYWwtbW9kYWwtYmcnIH0gKQogICAgICAgIC8vCiAgICAgICAgLy8gVGhlbiBpbnNlcnQgaXQgYWZ0ZXIgdGhlIG1vZGFsIGVsZW1lbnQuCiAgICAgICAgLy8KICAgICAgICAuaW5zZXJ0QWZ0ZXIoIG1vZGFsICk7CiAgICAgICAgLy8KICAgICAgICAvLyBOb3csIGZhZGUgaXQgb3V0IGEgYml0LgogICAgICAgIC8vCiAgICAgICAgbW9kYWxCZy5mYWRlVG8oICdmYXN0JywgMC44ICk7CiAgICAgIH0KCiAgICAgIC8vCiAgICAgIC8vIEhlbHBlciBNZXRob2RzCiAgICAgIC8vCgogICAgICAvKioKICAgICAgICogVW5sb2NrIHRoZSBtb2RhbCBmb3IgYW5pbWF0aW9uLgogICAgICAgKgogICAgICAgKiBAbWV0aG9kIHVubG9ja01vZGFsCiAgICAgICAqLwogICAgICBmdW5jdGlvbiB1bmxvY2tNb2RhbCgpIHsKICAgICAgICBsb2NrZWQgPSBmYWxzZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIExvY2sgdGhlIG1vZGFsIHRvIHByZXZlbnQgZnVydGhlciBhbmltYXRpb24uCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgbG9ja01vZGFsCiAgICAgICAqLwogICAgICBmdW5jdGlvbiBsb2NrTW9kYWwoKSB7CiAgICAgICAgbG9ja2VkID0gdHJ1ZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENsb3NlcyBhbGwgb3BlbiBtb2RhbHMuCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgY2xvc2VPcGVuTW9kYWwKICAgICAgICovCiAgICAgIGZ1bmN0aW9uIGNsb3NlT3Blbk1vZGFscygpIHsKICAgICAgICAvLwogICAgICAgIC8vIEdldCBhbGwgcmV2ZWFsLW1vZGFsIGVsZW1lbnRzIHdpdGggdGhlIC5vcGVuIGNsYXNzLgogICAgICAgIC8vCiAgICAgICAgdmFyICRvcGVuTW9kYWxzID0gJCggIi5yZXZlYWwtbW9kYWwub3BlbiIgKTsKICAgICAgICAvLwogICAgICAgIC8vIERvIHdlIGhhdmUgbW9kYWxzIHRvIGNsb3NlPwogICAgICAgIC8vCiAgICAgICAgaWYgKCAkb3Blbk1vZGFscy5sZW5ndGggPT09IDEgKSB7CiAgICAgICAgICAvLwogICAgICAgICAgLy8gU2V0IHRoZSBtb2RhbHMgZm9yIGFuaW1hdGlvbiBxdWV1aW5nLgogICAgICAgICAgLy8KICAgICAgICAgIG1vZGFsUXVldWVkID0gdHJ1ZTsKICAgICAgICAgIC8vCiAgICAgICAgICAvLyBUcmlnZ2VyIHRoZSBtb2RhbCBjbG9zZSBldmVudC4KICAgICAgICAgIC8vCiAgICAgICAgICAkb3Blbk1vZGFscy50cmlnZ2VyKCAicmV2ZWFsOmNsb3NlIiApOwogICAgICAgIH0KCiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEFuaW1hdGVzIHRoZSBtb2RhbCBvcGVuaW5nLgogICAgICAgKiBIYW5kbGVzIHRoZSBtb2RhbCAnb3BlbicgZXZlbnQuCiAgICAgICAqCiAgICAgICAqIEBtZXRob2Qgb3BlbkFuaW1hdGlvbgogICAgICAgKi8KICAgICAgZnVuY3Rpb24gb3BlbkFuaW1hdGlvbigpIHsKICAgICAgICAvLwogICAgICAgIC8vIEZpcnN0LCBkZXRlcm1pbmUgaWYgd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhbmltYXRpb24uCiAgICAgICAgLy8KICAgICAgICBpZiAoICFsb2NrZWQgKSB7CiAgICAgICAgICAvLwogICAgICAgICAgLy8gV2UncmUgbm90IGFuaW1hdGluZywgbGV0J3MgbG9jayB0aGUgbW9kYWwgZm9yIGFuaW1hdGlvbi4KICAgICAgICAgIC8vCiAgICAgICAgICBsb2NrTW9kYWwoKTsKICAgICAgICAgIC8vCiAgICAgICAgICAvLyBDbG9zZSBhbnkgb3BlbmVkIG1vZGFscy4KICAgICAgICAgIC8vCiAgICAgICAgICBjbG9zZU9wZW5Nb2RhbHMoKTsKICAgICAgICAgIC8vCiAgICAgICAgICAvLyBOb3csIGFkZCB0aGUgb3BlbiBjbGFzcyB0byB0aGlzIG1vZGFsLgogICAgICAgICAgLy8KICAgICAgICAgIG1vZGFsLmFkZENsYXNzKCAib3BlbiIgKTsKCiAgICAgICAgICAvLwogICAgICAgICAgLy8gQXJlIHdlIGV4ZWN1dGluZyB0aGUgJ2ZhZGVBbmRQb3AnIGFuaW1hdGlvbj8KICAgICAgICAgIC8vCiAgICAgICAgICBpZiAoIG9wdGlvbnMuYW5pbWF0aW9uID09PSAiZmFkZUFuZFBvcCIgKSB7CiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFllcywgd2UncmUgZG9pbmcgdGhlICdmYWRlQW5kUG9wJyBhbmltYXRpb24uCiAgICAgICAgICAgIC8vIE9rYXksIHNldCB0aGUgbW9kYWwgY3NzIHByb3BlcnRpZXMuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFNldCB0aGUgJ3RvcCcgcHJvcGVydHkgdG8gdGhlIGRvY3VtZW50IHNjcm9sbCBtaW51cyB0aGUgY2FsY3VsYXRlZCB0b3Agb2Zmc2V0LgogICAgICAgICAgICAvLwogICAgICAgICAgICBjc3NPcHRzLm9wZW4udG9wID0gJGRvYy5zY3JvbGxUb3AoKSAtIHRvcE9mZnNldDsKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gRmxpcCB0aGUgb3BhY2l0eSB0byAwLgogICAgICAgICAgICAvLwogICAgICAgICAgICBjc3NPcHRzLm9wZW4ub3BhY2l0eSA9IDA7CiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFNldCB0aGUgY3NzIG9wdGlvbnMuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIG1vZGFsLmNzcyggY3NzT3B0cy5vcGVuICk7CiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIEZhZGUgaW4gdGhlIGJhY2tncm91bmQgZWxlbWVudCwgYXQgaGFsZiB0aGUgc3BlZWQgb2YgdGhlIG1vZGFsIGVsZW1lbnQuCiAgICAgICAgICAgIC8vIFNvLCBmYXN0ZXIgdGhhbiB0aGUgbW9kYWwgZWxlbWVudC4KICAgICAgICAgICAgLy8KICAgICAgICAgICAgbW9kYWxCZy5mYWRlSW4oIG9wdGlvbnMuYW5pbWF0aW9uU3BlZWQgLyAyICk7CgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBMZXQncyBkZWxheSB0aGUgbmV4dCBhbmltYXRpb24gcXVldWUuCiAgICAgICAgICAgIC8vIFdlJ2xsIHdhaXQgdW50aWwgdGhlIGJhY2tncm91bmQgZWxlbWVudCBpcyBmYWRlZCBpbi4KICAgICAgICAgICAgLy8KICAgICAgICAgICAgbW9kYWwuZGVsYXkoIG9wdGlvbnMuYW5pbWF0aW9uU3BlZWQgLyAyICkKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gQW5pbWF0ZSB0aGUgZm9sbG93aW5nIGNzcyBwcm9wZXJ0aWVzLgogICAgICAgICAgICAvLwogICAgICAgICAgICAuYW5pbWF0ZSggewogICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgLy8gU2V0IHRoZSAndG9wJyBwcm9wZXJ0eSB0byB0aGUgZG9jdW1lbnQgc2Nyb2xsIHBsdXMgdGhlIGNhbGN1bGF0ZWQgdG9wIG1lYXN1cmUuCiAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAidG9wIjogJGRvYy5zY3JvbGxUb3AoKSArIHRvcE1lYXN1cmUgKyAncHgnLAogICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgLy8gU2V0IGl0IHRvIGZ1bGwgb3BhY2l0eS4KICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICJvcGFjaXR5IjogMQoKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogRmFkZSBzcGVlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9wdGlvbnMuYW5pbWF0aW9uU3BlZWQsCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIEVuZCBvZiBhbmltYXRpb24gY2FsbGJhY2suCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAvLyBUcmlnZ2VyIHRoZSBtb2RhbCByZXZlYWw6b3BlbmVkIGV2ZW50LgogICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIHRyaWdnZXIgdGhlIGZ1bmN0aW9ucyBzZXQgaW4gdGhlIG9wdGlvbnMub3BlbmVkIHByb3BlcnR5LgogICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgbW9kYWwudHJpZ2dlciggJ3JldmVhbDpvcGVuZWQnICk7CgogICAgICAgICAgICB9KTsgLy8gZW5kIG9mIGFuaW1hdGUuCgogICAgICAgICAgfSAvLyBlbmQgaWYgJ2ZhZGVBbmRQb3AnCgogICAgICAgICAgLy8KICAgICAgICAgIC8vIEFyZSBleGVjdXRpbmcgdGhlICdmYWRlJyBhbmltYXRpb24/CiAgICAgICAgICAvLwogICAgICAgICAgaWYgKCBvcHRpb25zLmFuaW1hdGlvbiA9PT0gImZhZGUiICkgewogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBZZXMsIHdlcmUgZXhlY3V0aW5nICdmYWRlJy4KICAgICAgICAgICAgLy8gT2theSwgbGV0J3Mgc2V0IHRoZSBtb2RhbCBwcm9wZXJ0aWVzLgogICAgICAgICAgICAvLwogICAgICAgICAgICBjc3NPcHRzLm9wZW4udG9wID0gJGRvYy5zY3JvbGxUb3AoKSArIHRvcE1lYXN1cmU7CiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIEZsaXAgdGhlIG9wYWNpdHkgdG8gMC4KICAgICAgICAgICAgLy8KICAgICAgICAgICAgY3NzT3B0cy5vcGVuLm9wYWNpdHkgPSAwOwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBTZXQgdGhlIGNzcyBvcHRpb25zLgogICAgICAgICAgICAvLwogICAgICAgICAgICBtb2RhbC5jc3MoIGNzc09wdHMub3BlbiApOwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBGYWRlIGluIHRoZSBtb2RhbCBiYWNrZ3JvdW5kIGF0IGhhbGYgdGhlIHNwZWVkIG9mIHRoZSBtb2RhbC4KICAgICAgICAgICAgLy8gU28sIGZhc3RlciB0aGFuIG1vZGFsLgogICAgICAgICAgICAvLwogICAgICAgICAgICBtb2RhbEJnLmZhZGVJbiggb3B0aW9ucy5hbmltYXRpb25TcGVlZCAvIDIgKTsKCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIERlbGF5IHRoZSBtb2RhbCBhbmltYXRpb24uCiAgICAgICAgICAgIC8vIFdhaXQgdGlsbCB0aGUgbW9kYWwgYmFja2dyb3VuZCBpcyBkb25lIGFuaW1hdGluZy4KICAgICAgICAgICAgLy8KICAgICAgICAgICAgbW9kYWwuZGVsYXkoIG9wdGlvbnMuYW5pbWF0aW9uU3BlZWQgLyAyICkKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gTm93IGFuaW1hdGUgdGhlIG1vZGFsLgogICAgICAgICAgICAvLwogICAgICAgICAgICAuYW5pbWF0ZSggewogICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgLy8gU2V0IHRvIGZ1bGwgb3BhY2l0eS4KICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICJvcGFjaXR5IjogMQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogQW5pbWF0aW9uIHNwZWVkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb3B0aW9ucy5hbmltYXRpb25TcGVlZCwKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIEVuZCBvZiBhbmltYXRpb24gY2FsbGJhY2suCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAvLyBUcmlnZ2VyIHRoZSBtb2RhbCByZXZlYWw6b3BlbmVkIGV2ZW50LgogICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIHRyaWdnZXIgdGhlIGZ1bmN0aW9ucyBzZXQgaW4gdGhlIG9wdGlvbnMub3BlbmVkIHByb3BlcnR5LgogICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgbW9kYWwudHJpZ2dlciggJ3JldmVhbDpvcGVuZWQnICk7CgogICAgICAgICAgICB9KTsKCiAgICAgICAgICB9IC8vIGVuZCBpZiAnZmFkZScKCiAgICAgICAgICAvLwogICAgICAgICAgLy8gQXJlIHdlIG5vdCBhbmltYXRpbmc/CiAgICAgICAgICAvLwogICAgICAgICAgaWYgKCBvcHRpb25zLmFuaW1hdGlvbiA9PT0gIm5vbmUiICkgewogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBXZSdyZSBub3QgYW5pbWF0aW5nLgogICAgICAgICAgICAvLyBPa2F5LCBsZXQncyBzZXQgdGhlIG1vZGFsIGNzcyBwcm9wZXJ0aWVzLgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBTZXQgdGhlIHRvcCBwcm9wZXJ0eS4KICAgICAgICAgICAgLy8KICAgICAgICAgICAgY3NzT3B0cy5vcGVuLnRvcCA9ICRkb2Muc2Nyb2xsVG9wKCkgKyB0b3BNZWFzdXJlOwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBTZXQgdGhlIG9wYWNpdHkgcHJvcGVydHkgdG8gZnVsbCBvcGFjaXR5LCBzaW5jZSB3ZSdyZSBub3QgZmFkaW5nIChhbmltYXRpbmcpLgogICAgICAgICAgICAvLwogICAgICAgICAgICBjc3NPcHRzLm9wZW4ub3BhY2l0eSA9IDE7CiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFNldCB0aGUgY3NzIHByb3BlcnR5LgogICAgICAgICAgICAvLwogICAgICAgICAgICBtb2RhbC5jc3MoIGNzc09wdHMub3BlbiApOwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBTaG93IHRoZSBtb2RhbCBCYWNrZ3JvdW5kLgogICAgICAgICAgICAvLwogICAgICAgICAgICBtb2RhbEJnLmNzcyggeyAiZGlzcGxheSI6ICJibG9jayIgfSApOwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBUcmlnZ2VyIHRoZSBtb2RhbCBvcGVuZWQgZXZlbnQuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIG1vZGFsLnRyaWdnZXIoICdyZXZlYWw6b3BlbmVkJyApOwoKICAgICAgICAgIH0gLy8gZW5kIGlmIGFuaW1hdGluZyAnbm9uZScKCiAgICAgICAgfS8vIGVuZCBpZiAhbG9ja2VkCgogICAgICB9Ly8gZW5kIG9wZW5BbmltYXRpb24KCgogICAgICBmdW5jdGlvbiBvcGVuVmlkZW9zKCkgewogICAgICAgIHZhciB2aWRlbyA9IG1vZGFsLmZpbmQoJy5mbGV4LXZpZGVvJyksCiAgICAgICAgICAgIGlmcmFtZSA9IHZpZGVvLmZpbmQoJ2lmcmFtZScpOwogICAgICAgIGlmIChpZnJhbWUubGVuZ3RoID4gMCkgewogICAgICAgICAgaWZyYW1lLmF0dHIoInNyYyIsIGlmcmFtZS5kYXRhKCJzcmMiKSk7CiAgICAgICAgICB2aWRlby5mYWRlSW4oMTAwKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vCiAgICAgIC8vIEJpbmQgdGhlIHJldmVhbCAnb3BlbicgZXZlbnQuCiAgICAgIC8vIFdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZCwgb3BlbkFuaW1hdGlvbiBpcyBjYWxsZWQKICAgICAgLy8gYWxvbmcgd2l0aCBhbnkgZnVuY3Rpb24gc2V0IGluIHRoZSBvcHRpb25zLm9wZW4gcHJvcGVydHkuCiAgICAgIC8vCiAgICAgIG1vZGFsLmJpbmQoICdyZXZlYWw6b3Blbi5yZXZlYWwnLCBvcGVuQW5pbWF0aW9uICk7CiAgICAgIG1vZGFsLmJpbmQoICdyZXZlYWw6b3Blbi5yZXZlYWwnLCBvcGVuVmlkZW9zKTsKCiAgICAgIC8qKgogICAgICAgKiBDbG9zZXMgdGhlIG1vZGFsIGVsZW1lbnQocykKICAgICAgICogSGFuZGxlcyB0aGUgbW9kYWwgJ2Nsb3NlJyBldmVudC4KICAgICAgICoKICAgICAgICogQG1ldGhvZCBjbG9zZUFuaW1hdGlvbgogICAgICAgKi8KICAgICAgZnVuY3Rpb24gY2xvc2VBbmltYXRpb24oKSB7CiAgICAgICAgLy8KICAgICAgICAvLyBGaXJzdCwgZGV0ZXJtaW5lIGlmIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYW5pbWF0aW9uLgogICAgICAgIC8vCiAgICAgICAgaWYgKCAhbG9ja2VkICkgewogICAgICAgICAgLy8KICAgICAgICAgIC8vIFdlJ3JlIG5vdCBhbmltYXRpbmcsIGxldCdzIGxvY2sgdGhlIG1vZGFsIGZvciBhbmltYXRpb24uCiAgICAgICAgICAvLwogICAgICAgICAgbG9ja01vZGFsKCk7CiAgICAgICAgICAvLwogICAgICAgICAgLy8gQ2xlYXIgdGhlIG1vZGFsIG9mIHRoZSBvcGVuIGNsYXNzLgogICAgICAgICAgLy8KICAgICAgICAgIG1vZGFsLnJlbW92ZUNsYXNzKCAib3BlbiIgKTsKCiAgICAgICAgICAvLwogICAgICAgICAgLy8gQXJlIHdlIHVzaW5nIHRoZSAnZmFkZUFuZFBvcCcgYW5pbWF0aW9uPwogICAgICAgICAgLy8KICAgICAgICAgIGlmICggb3B0aW9ucy5hbmltYXRpb24gPT09ICJmYWRlQW5kUG9wIiApIHsKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gWWVzLCBva2F5LCBsZXQncyBzZXQgdGhlIGFuaW1hdGlvbiBwcm9wZXJ0aWVzLgogICAgICAgICAgICAvLwogICAgICAgICAgICBtb2RhbC5hbmltYXRlKCB7CiAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAvLyBTZXQgdGhlIHRvcCBwcm9wZXJ0eSB0byB0aGUgZG9jdW1lbnQgc2Nyb2xsVG9wIG1pbnVzIGNhbGN1bGF0ZWQgdG9wT2Zmc2V0LgogICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgInRvcCI6ICAkZG9jLnNjcm9sbFRvcCgpIC0gdG9wT2Zmc2V0ICsgJ3B4JywKICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgIC8vIEZhZGUgdGhlIG1vZGFsIG91dCwgYnkgdXNpbmcgdGhlIG9wYWNpdHkgcHJvcGVydHkuCiAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAib3BhY2l0eSI6IDAKCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIEZhZGUgc3BlZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvcHRpb25zLmFuaW1hdGlvblNwZWVkIC8gMiwKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogRW5kIG9mIGFuaW1hdGlvbiBjYWxsYmFjay4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgIC8vIFNldCB0aGUgY3NzIGhpZGRlbiBvcHRpb25zLgogICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgbW9kYWwuY3NzKCBjc3NPcHRzLmNsb3NlICk7CgogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gSXMgdGhlIG1vZGFsIGFuaW1hdGlvbiBxdWV1ZWQ/CiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIGlmICggIW1vZGFsUXVldWVkICkgewogICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgLy8gT2gsIHRoZSBtb2RhbChzKSBhcmUgbWlkIGFuaW1hdGluZy4KICAgICAgICAgICAgICAvLyBMZXQncyBkZWxheSB0aGUgYW5pbWF0aW9uIHF1ZXVlLgogICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgbW9kYWxCZy5kZWxheSggb3B0aW9ucy5hbmltYXRpb25TcGVlZCApCiAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAvLyBGYWRlIG91dCB0aGUgbW9kYWwgYmFja2dyb3VuZC4KICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgIC5mYWRlT3V0KAogICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICogQW5pbWF0aW9uIHNwZWVkLgogICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgIG9wdGlvbnMuYW5pbWF0aW9uU3BlZWQsCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogRW5kIG9mIGFuaW1hdGlvbiBjYWxsYmFjay4KICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIHRoZSBtb2RhbCAnY2xvc2VkJyBldmVudC4KICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIHRyaWdnZXIgYW55IG1ldGhvZCBzZXQgaW4gdGhlIG9wdGlvbnMuY2xvc2VkIHByb3BlcnR5LgogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIG1vZGFsLnRyaWdnZXIoICdyZXZlYWw6Y2xvc2VkJyApOwoKICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgbWlkIHF1ZXVlLgogICAgICAgICAgICAgIC8vIFRyaWdnZXIgdGhlIG1vZGFsICdjbG9zZWQnIGV2ZW50LgogICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIHRyaWdnZXIgYW55IG1ldGhvZCBzZXQgaW4gdGhlIG9wdGlvbnMuY2xvc2VkIHByb3BldHkuCiAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICBtb2RhbC50cmlnZ2VyKCAncmV2ZWFsOmNsb3NlZCcgKTsKCiAgICAgICAgICAgIH0gLy8gZW5kIGlmICFtb2RhbFF1ZXVlZAoKICAgICAgICAgIH0gLy8gZW5kIGlmIGFuaW1hdGlvbiAnZmFkZUFuZFBvcCcKCiAgICAgICAgICAvLwogICAgICAgICAgLy8gQXJlIHdlIHVzaW5nIHRoZSAnZmFkZScgYW5pbWF0aW9uLgogICAgICAgICAgLy8KICAgICAgICAgIGlmICggb3B0aW9ucy5hbmltYXRpb24gPT09ICJmYWRlIiApIHsKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gWWVzLCB3ZSdyZSB1c2luZyB0aGUgJ2ZhZGUnIGFuaW1hdGlvbi4KICAgICAgICAgICAgLy8KICAgICAgICAgICAgbW9kYWwuYW5pbWF0ZSggeyAib3BhY2l0eSIgOiAwIH0sCiAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgKiBBbmltYXRpb24gc3BlZWQuCiAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgb3B0aW9ucy5hbmltYXRpb25TcGVlZCwKICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAqIEVuZCBvZiBhbmltYXRpb24gY2FsbGJhY2suCiAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgLy8gU2V0IHRoZSBjc3MgY2xvc2Ugb3B0aW9ucy4KICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgIG1vZGFsLmNzcyggY3NzT3B0cy5jbG9zZSApOwoKICAgICAgICAgICAgfSk7IC8vIGVuZCBhbmltYXRlCgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBBcmUgd2UgbWlkIGFuaW1hdGluZyB0aGUgbW9kYWwocyk/CiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIGlmICggIW1vZGFsUXVldWVkICkgewogICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgLy8gT2gsIHRoZSBtb2RhbChzKSBhcmUgbWlkIGFuaW1hdGluZy4KICAgICAgICAgICAgICAvLyBMZXQncyBkZWxheSB0aGUgYW5pbWF0aW9uIHF1ZXVlLgogICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgbW9kYWxCZy5kZWxheSggb3B0aW9ucy5hbmltYXRpb25TcGVlZCApCiAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAvLyBMZXQncyBmYWRlIG91dCB0aGUgbW9kYWwgYmFja2dyb3VuZCBlbGVtZW50LgogICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgLmZhZGVPdXQoCiAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgKiBBbmltYXRpb24gc3BlZWQuCiAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgb3B0aW9ucy5hbmltYXRpb25TcGVlZCwKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBFbmQgb2YgYW5pbWF0aW9uIGNhbGxiYWNrLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgIC8vIFRyaWdnZXIgdGhlIG1vZGFsICdjbG9zZWQnIGV2ZW50LgogICAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCB0cmlnZ2VyIGFueSBtZXRob2Qgc2V0IGluIHRoZSBvcHRpb25zLmNsb3NlZCBwcm9wZXR5LgogICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgICBtb2RhbC50cmlnZ2VyKCAncmV2ZWFsOmNsb3NlZCcgKTsKCiAgICAgICAgICAgICAgfSk7IC8vIGVuZCBmYWRlT3V0CgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgLy8gV2UncmUgbm90IG1pZCBxdWV1ZS4KICAgICAgICAgICAgICAvLyBUcmlnZ2VyIHRoZSBtb2RhbCAnY2xvc2VkJyBldmVudC4KICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCB0cmlnZ2VyIGFueSBtZXRob2Qgc2V0IGluIHRoZSBvcHRpb25zLmNsb3NlZCBwcm9wZXR5LgogICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgbW9kYWwudHJpZ2dlciggJ3JldmVhbDpjbG9zZWQnICk7CgogICAgICAgICAgICB9IC8vIGVuZCBpZiAhbW9kYWxRdWV1ZWQKCiAgICAgICAgICB9IC8vIGVuZCBpZiBhbmltYXRpb24gJ2ZhZGUnCgogICAgICAgICAgLy8KICAgICAgICAgIC8vIEFyZSB3ZSBub3QgYW5pbWF0aW5nPwogICAgICAgICAgLy8KICAgICAgICAgIGlmICggb3B0aW9ucy5hbmltYXRpb24gPT09ICJub25lIiApIHsKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gV2UncmUgbm90IGFuaW1hdGluZy4KICAgICAgICAgICAgLy8gU2V0IHRoZSBtb2RhbCBjbG9zZSBjc3Mgb3B0aW9ucy4KICAgICAgICAgICAgLy8KICAgICAgICAgICAgbW9kYWwuY3NzKCBjc3NPcHRzLmNsb3NlICk7CiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIElzIHRoZSBtb2RhbCBpbiB0aGUgbWlkZGxlIG9mIGFuIGFuaW1hdGlvbiBxdWV1ZT8KICAgICAgICAgICAgLy8KICAgICAgICAgICAgaWYgKCAhbW9kYWxRdWV1ZWQgKSB7CiAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAvLyBJdCdzIG5vdCBtaWQgcXVldWV1LiBKdXN0IGhpZGUgaXQuCiAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICBtb2RhbEJnLmNzcyggeyAnZGlzcGxheSc6ICdub25lJyB9ICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gVHJpZ2dlciB0aGUgbW9kYWwgJ2Nsb3NlZCcgZXZlbnQuCiAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIHRyaWdnZXIgYW55IG1ldGhvZCBzZXQgaW4gdGhlIG9wdGlvbnMuY2xvc2VkIHByb3BldHkuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIG1vZGFsLnRyaWdnZXIoICdyZXZlYWw6Y2xvc2VkJyApOwoKICAgICAgICAgIH0gLy8gZW5kIGlmIG5vdCBhbmltYXRpbmcKICAgICAgICAgIC8vCiAgICAgICAgICAvLyBSZXNldCB0aGUgbW9kYWxRdWV1ZWQgdmFyaWFibGUuCiAgICAgICAgICAvLwogICAgICAgICAgbW9kYWxRdWV1ZWQgPSBmYWxzZTsKICAgICAgICB9IC8vIGVuZCBpZiAhbG9ja2VkCgogICAgICB9IC8vIGVuZCBjbG9zZUFuaW1hdGlvbgoKICAgICAgLyoqCiAgICAgICAqIERlc3Ryb3lzIHRoZSBtb2RhbCBhbmQgaXQncyBldmVudHMuCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgZGVzdHJveQogICAgICAgKi8KICAgICAgZnVuY3Rpb24gZGVzdHJveSgpIHsKICAgICAgICAvLwogICAgICAgIC8vIFVuYmluZCBhbGwgLnJldmVhbCBldmVudHMgZnJvbSB0aGUgbW9kYWwuCiAgICAgICAgLy8KICAgICAgICBtb2RhbC51bmJpbmQoICcucmV2ZWFsJyApOwogICAgICAgIC8vCiAgICAgICAgLy8gVW5iaW5kIGFsbCAucmV2ZWFsIGV2ZW50cyBmcm9tIHRoZSBtb2RhbCBiYWNrZ3JvdW5kLgogICAgICAgIC8vCiAgICAgICAgbW9kYWxCZy51bmJpbmQoICcucmV2ZWFsJyApOwogICAgICAgIC8vCiAgICAgICAgLy8gVW5iaW5kIGFsbCAucmV2ZWFsIGV2ZW50cyBmcm9tIHRoZSBtb2RhbCAnY2xvc2UnIGJ1dHRvbi4KICAgICAgICAvLwogICAgICAgICRjbG9zZUJ1dHRvbi51bmJpbmQoICcucmV2ZWFsJyApOwogICAgICAgIC8vCiAgICAgICAgLy8gVW5iaW5kIGFsbCAucmV2ZWFsIGV2ZW50cyBmcm9tIHRoZSBib2R5LgogICAgICAgIC8vCiAgICAgICAgJCggJ2JvZHknICkudW5iaW5kKCAnLnJldmVhbCcgKTsKCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGNsb3NlVmlkZW9zKCkgewogICAgICAgIHZhciB2aWRlbyA9IG1vZGFsLmZpbmQoJy5mbGV4LXZpZGVvJyksCiAgICAgICAgICAgIGlmcmFtZSA9IHZpZGVvLmZpbmQoJ2lmcmFtZScpOwogICAgICAgIGlmIChpZnJhbWUubGVuZ3RoID4gMCkgewogICAgICAgICAgaWZyYW1lLmRhdGEoInNyYyIsIGlmcmFtZS5hdHRyKCJzcmMiKSk7CiAgICAgICAgICBpZnJhbWUuYXR0cigic3JjIiwgIiIpOwogICAgICAgICAgdmlkZW8uZmFkZU91dCgxMDApOyAgCiAgICAgICAgfQogICAgICB9CgogICAgICAvLwogICAgICAvLyBCaW5kIHRoZSBtb2RhbCAnY2xvc2UnIGV2ZW50CiAgICAgIC8vCiAgICAgIG1vZGFsLmJpbmQoICdyZXZlYWw6Y2xvc2UucmV2ZWFsJywgY2xvc2VBbmltYXRpb24gKTsKICAgICAgbW9kYWwuYmluZCggJ3JldmVhbDpjbG9zZWQucmV2ZWFsJywgY2xvc2VWaWRlb3MgKTsKICAgICAgLy8KICAgICAgLy8gQmluZCB0aGUgbW9kYWwgJ29wZW5lZCcgKyAnY2xvc2VkJyBldmVudAogICAgICAvLyBDYWxscyB0aGUgdW5sb2NrTW9kYWwgbWV0aG9kLgogICAgICAvLwogICAgICBtb2RhbC5iaW5kKCAncmV2ZWFsOm9wZW5lZC5yZXZlYWwgcmV2ZWFsOmNsb3NlZC5yZXZlYWwnLCB1bmxvY2tNb2RhbCApOwogICAgICAvLwogICAgICAvLyBCaW5kIHRoZSBtb2RhbCAnY2xvc2VkJyBldmVudC4KICAgICAgLy8gQ2FsbHMgdGhlIGRlc3Ryb3kgbWV0aG9kLgogICAgICAvLwogICAgICBtb2RhbC5iaW5kKCAncmV2ZWFsOmNsb3NlZC5yZXZlYWwnLCBkZXN0cm95ICk7CiAgICAgIC8vCiAgICAgIC8vIEJpbmQgdGhlIG1vZGFsICdvcGVuJyBldmVudAogICAgICAvLyBIYW5kbGVkIGJ5IHRoZSBvcHRpb25zLm9wZW4gcHJvcGVydHkgZnVuY3Rpb24uCiAgICAgIC8vCiAgICAgIG1vZGFsLmJpbmQoICdyZXZlYWw6b3Blbi5yZXZlYWwnLCBvcHRpb25zLm9wZW4gKTsKICAgICAgLy8KICAgICAgLy8gQmluZCB0aGUgbW9kYWwgJ29wZW5lZCcgZXZlbnQuCiAgICAgIC8vIEhhbmRsZWQgYnkgdGhlIG9wdGlvbnMub3BlbmVkIHByb3BlcnR5IGZ1bmN0aW9uLgogICAgICAvLwogICAgICBtb2RhbC5iaW5kKCAncmV2ZWFsOm9wZW5lZC5yZXZlYWwnLCBvcHRpb25zLm9wZW5lZCApOwogICAgICAvLwogICAgICAvLyBCaW5kIHRoZSBtb2RhbCAnY2xvc2UnIGV2ZW50LgogICAgICAvLyBIYW5kbGVkIGJ5IHRoZSBvcHRpb25zLmNsb3NlIHByb3BlcnR5IGZ1bmN0aW9uLgogICAgICAvLwogICAgICBtb2RhbC5iaW5kKCAncmV2ZWFsOmNsb3NlLnJldmVhbCcsIG9wdGlvbnMuY2xvc2UgKTsKICAgICAgLy8KICAgICAgLy8gQmluZCB0aGUgbW9kYWwgJ2Nsb3NlZCcgZXZlbnQuCiAgICAgIC8vIEhhbmRsZWQgYnkgdGhlIG9wdGlvbnMuY2xvc2VkIHByb3BlcnR5IGZ1bmN0aW9uLgogICAgICAvLwogICAgICBtb2RhbC5iaW5kKCAncmV2ZWFsOmNsb3NlZC5yZXZlYWwnLCBvcHRpb25zLmNsb3NlZCApOwoKICAgICAgLy8KICAgICAgLy8gV2UncmUgcnVubmluZyB0aGlzIGZvciB0aGUgZmlyc3QgdGltZS4KICAgICAgLy8gVHJpZ2dlciB0aGUgbW9kYWwgJ29wZW4nIGV2ZW50LgogICAgICAvLwogICAgICBtb2RhbC50cmlnZ2VyKCAncmV2ZWFsOm9wZW4nICk7CgogICAgICAvLwogICAgICAvLyBHZXQgdGhlIGNsb3NlQnV0dG9uIHZhcmlhYmxlIGVsZW1lbnQocykuCiAgICAgIC8vCiAgICAgJGNsb3NlQnV0dG9uID0gJCggJy4nICsgb3B0aW9ucy5kaXNtaXNzTW9kYWxDbGFzcyApCiAgICAgLy8KICAgICAvLyBCaW5kIHRoZSBlbGVtZW50ICdjbGljaycgZXZlbnQgYW5kIGhhbmRsZXIuCiAgICAgLy8KICAgICAuYmluZCggJ2NsaWNrLnJldmVhbCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAvLwogICAgICAgIC8vIFRyaWdnZXIgdGhlIG1vZGFsICdjbG9zZScgZXZlbnQuCiAgICAgICAgLy8KICAgICAgICBtb2RhbC50cmlnZ2VyKCAncmV2ZWFsOmNsb3NlJyApOwoKICAgICAgfSk7CgogICAgIC8vCiAgICAgLy8gU2hvdWxkIHdlIGNsb3NlIHRoZSBtb2RhbCBiYWNrZ3JvdW5kIG9uIGNsaWNrPwogICAgIC8vCiAgICAgaWYgKCBvcHRpb25zLmNsb3NlT25CYWNrZ3JvdW5kQ2xpY2sgKSB7CiAgICAgIC8vCiAgICAgIC8vIFllcywgY2xvc2UgdGhlIG1vZGFsIGJhY2tncm91bmQgb24gJ2NsaWNrJwogICAgICAvLyBTZXQgdGhlIG1vZGFsIGJhY2tncm91bmQgY3NzICdjdXJzb3InIHByb3BldHkgdG8gcG9pbnRlci4KICAgICAgLy8gQWRkcyBhIHBvaW50ZXIgc3ltYm9sIHdoZW4geW91IG1vdXNlIG92ZXIgdGhlIG1vZGFsIGJhY2tncm91bmQuCiAgICAgIC8vCiAgICAgIG1vZGFsQmcuY3NzKCB7ICJjdXJzb3IiOiAicG9pbnRlciIgfSApOwogICAgICAvLwogICAgICAvLyBCaW5kIGEgJ2NsaWNrJyBldmVudCBoYW5kbGVyIHRvIHRoZSBtb2RhbCBiYWNrZ3JvdW5kLgogICAgICAvLwogICAgICBtb2RhbEJnLmJpbmQoICdjbGljay5yZXZlYWwnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8KICAgICAgICAvLyBUcmlnZ2VyIHRoZSBtb2RhbCAnY2xvc2UnIGV2ZW50LgogICAgICAgIC8vCiAgICAgICAgbW9kYWwudHJpZ2dlciggJ3JldmVhbDpjbG9zZScgKTsKCiAgICAgIH0pOwoKICAgICB9CgogICAgIC8vCiAgICAgLy8gQmluZCBrZXl1cCBmdW5jdGlvbnMgb24gdGhlIGJvZHkgZWxlbWVudC4KICAgICAvLyBXZSdsbCB3YW50IHRvIGNsb3NlIHRoZSBtb2RhbCB3aGVuIHRoZSAnZXNjYXBlJyBrZXkgaXMgaGl0LgogICAgIC8vCiAgICAgJCggJ2JvZHknICkuYmluZCggJ2tleXVwLnJldmVhbCcsIGZ1bmN0aW9uICggZXZlbnQgKSB7CiAgICAgIC8vCiAgICAgIC8vIERpZCB0aGUgZXNjYXBlIGtleSBnZXQgdHJpZ2dlcmVkPwogICAgICAvLwogICAgICAgaWYgKCBldmVudC53aGljaCA9PT0gMjcgKSB7IC8vIDI3IGlzIHRoZSBrZXljb2RlIGZvciB0aGUgRXNjYXBlIGtleQogICAgICAgICAvLwogICAgICAgICAvLyBFc2NhcGUga2V5IHdhcyB0cmlnZ2VyZWQuCiAgICAgICAgIC8vIFRyaWdnZXIgdGhlIG1vZGFsICdjbG9zZScgZXZlbnQuCiAgICAgICAgIC8vCiAgICAgICAgIG1vZGFsLnRyaWdnZXIoICdyZXZlYWw6Y2xvc2UnICk7CiAgICAgICB9CgogICAgICB9KTsgLy8gZW5kICQoYm9keSkKCiAgICB9KTsgLy8gZW5kIHRoaXMuZWFjaAoKICB9OyAvLyBlbmQgJC5mbgoKfSAoIGpRdWVyeSApICk7Cg==]]></data>
	</file>
	<file>
	  <filename>/assets/javascripts/jquery.foundation.tabs.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[OyhmdW5jdGlvbiAoJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgc2V0dGluZ3MgPSB7CiAgICAgICAgY2FsbGJhY2s6ICQubm9vcCwKICAgICAgICBkZWVwX2xpbmtpbmc6IHRydWUsCiAgICAgICAgaW5pdDogZmFsc2UKICAgICAgfSwKCiAgICAgIG1ldGhvZHMgPSB7CiAgICAgICAgaW5pdCA6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICBzZXR0aW5ncyA9ICQuZXh0ZW5kKHt9LCBzZXR0aW5ncywgb3B0aW9ucyk7CgogICAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICghc2V0dGluZ3MuaW5pdCkgbWV0aG9kcy5ldmVudHMoKTsKCiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5kZWVwX2xpbmtpbmcpIG1ldGhvZHMuZnJvbV9oYXNoKCk7CiAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBldmVudHMgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAkKGRvY3VtZW50KS5vbignY2xpY2suZm5kdG4nLCAnLnRhYnMgYScsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIG1ldGhvZHMuc2V0X3RhYigkKHRoaXMpLnBhcmVudCgnZGQsIGxpJyksIGUpOwogICAgICAgICAgfSk7CiAgICAgICAgICAKICAgICAgICAgIHNldHRpbmdzLmluaXQgPSB0cnVlOwogICAgICAgIH0sCgogICAgICAgIHNldF90YWIgOiBmdW5jdGlvbiAoJHRhYiwgZSkgewogICAgICAgICAgdmFyICRhY3RpdmVUYWIgPSAkdGFiLmNsb3Nlc3QoJ2RsLCB1bCcpLmZpbmQoJy5hY3RpdmUnKSwKICAgICAgICAgICAgICB0YXJnZXQgPSAkdGFiLmNoaWxkcmVuKCdhJykuYXR0cigiaHJlZiIpLAogICAgICAgICAgICAgIGhhc0hhc2ggPSAvXiMvLnRlc3QodGFyZ2V0KSwKICAgICAgICAgICAgICAkY29udGVudCA9ICQodGFyZ2V0ICsgJ1RhYicpOwoKICAgICAgICAgIGlmIChoYXNIYXNoICYmICRjb250ZW50Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgLy8gU2hvdyB0YWIgY29udGVudAogICAgICAgICAgICBpZiAoZSAmJiAhc2V0dGluZ3MuZGVlcF9saW5raW5nKSBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICRjb250ZW50LmNsb3Nlc3QoJy50YWJzLWNvbnRlbnQnKS5jaGlsZHJlbignbGknKS5yZW1vdmVDbGFzcygnYWN0aXZlJykuaGlkZSgpOwogICAgICAgICAgICAkY29udGVudC5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKS5hZGRDbGFzcygnYWN0aXZlJyk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gTWFrZSBhY3RpdmUgdGFiCiAgICAgICAgICAkYWN0aXZlVGFiLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsKICAgICAgICAgICR0YWIuYWRkQ2xhc3MoJ2FjdGl2ZScpOwoKICAgICAgICAgIHNldHRpbmdzLmNhbGxiYWNrKCk7CiAgICAgICAgfSwKCiAgICAgICAgZnJvbV9oYXNoIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIGhhc2ggPSB3aW5kb3cubG9jYXRpb24uaGFzaCwKICAgICAgICAgICAgICAkdGFiID0gJCgnYVtocmVmPSInICsgaGFzaCArICciXScpOwoKICAgICAgICAgICR0YWIudHJpZ2dlcignY2xpY2suZm5kdG4nKTsKICAgICAgICB9CiAgICAgIH0KCiAgJC5mbi5mb3VuZGF0aW9uVGFicyA9IGZ1bmN0aW9uIChtZXRob2QpIHsKICAgIGlmIChtZXRob2RzW21ldGhvZF0pIHsKICAgICAgcmV0dXJuIG1ldGhvZHNbbWV0aG9kXS5hcHBseSh0aGlzLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIG1ldGhvZCA9PT0gJ29iamVjdCcgfHwgIW1ldGhvZCkgewogICAgICByZXR1cm4gbWV0aG9kcy5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9IGVsc2UgewogICAgICAkLmVycm9yKCdNZXRob2QgJyArICBtZXRob2QgKyAnIGRvZXMgbm90IGV4aXN0IG9uIGpRdWVyeS5mb3VuZGF0aW9uVGFicycpOwogICAgfQogIH07Cn0oalF1ZXJ5LCB0aGlzLCB0aGlzLmRvY3VtZW50KSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/assets/javascripts/jquery.foundation.tooltips.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IEZvdW5kYXRpb24gVG9vbHRpcHMgMi4wLjIKICogaHR0cDovL2ZvdW5kYXRpb24uenVyYi5jb20KICogQ29weXJpZ2h0IDIwMTIsIFpVUkIKICogRnJlZSB0byB1c2UgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAoqLwoKLypqc2xpbnQgdW5wYXJhbTogdHJ1ZSwgYnJvd3NlcjogdHJ1ZSwgaW5kZW50OiAyICovCgo7KGZ1bmN0aW9uICgkLCB3aW5kb3csIHVuZGVmaW5lZCkgewogICd1c2Ugc3RyaWN0JzsKICAKICB2YXIgc2V0dGluZ3MgPSB7CiAgICAgIGJvZHlIZWlnaHQgOiAwLAogICAgICBzZWxlY3RvciA6ICcuaGFzLXRpcCcsCiAgICAgIGFkZGl0aW9uYWxJbmhlcml0YWJsZUNsYXNzZXMgOiBbXSwKICAgICAgdG9vbHRpcENsYXNzIDogJy50b29sdGlwJywKICAgICAgdGlwVGVtcGxhdGUgOiBmdW5jdGlvbiAoc2VsZWN0b3IsIGNvbnRlbnQpIHsKICAgICAgICByZXR1cm4gJzxzcGFuIGRhdGEtc2VsZWN0b3I9IicgKyBzZWxlY3RvciArICciIGNsYXNzPSInICsgc2V0dGluZ3MudG9vbHRpcENsYXNzLnN1YnN0cmluZygxKSArICciPicgKyBjb250ZW50ICsgJzxzcGFuIGNsYXNzPSJudWIiPjwvc3Bhbj48L3NwYW4+JzsKICAgICAgfQogICAgfSwKICAgIG1ldGhvZHMgPSB7CiAgICAgIGluaXQgOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgIHNldHRpbmdzID0gJC5leHRlbmQoc2V0dGluZ3MsIG9wdGlvbnMpOwoKICAgICAgICAvLyBhbGlhcyB0aGUgb2xkIHRhcmdldENsYXNzIG9wdGlvbgogICAgICAgIHNldHRpbmdzLnNlbGVjdG9yID0gc2V0dGluZ3MudGFyZ2V0Q2xhc3MgPyBzZXR0aW5ncy50YXJnZXRDbGFzcyA6IHNldHRpbmdzLnNlbGVjdG9yOwoKICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHZhciAkYm9keSA9ICQoJ2JvZHknKTsKCiAgICAgICAgICBpZiAoTW9kZXJuaXpyLnRvdWNoKSB7CiAgICAgICAgICAgICRib2R5Lm9uKCdjbGljay50b29sdGlwIHRvdWNoc3RhcnQudG9vbHRpcCB0b3VjaGVuZC50b29sdGlwJywgc2V0dGluZ3Muc2VsZWN0b3IsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICQoc2V0dGluZ3MudG9vbHRpcENsYXNzKS5oaWRlKCk7CiAgICAgICAgICAgICAgbWV0aG9kcy5zaG93T3JDcmVhdGVUaXAoJCh0aGlzKSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAkYm9keS5vbignY2xpY2sudG9vbHRpcCB0b3VjaHN0YXJ0LnRvb2x0aXAgdG91Y2hlbmQudG9vbHRpcCcsIHNldHRpbmdzLnRvb2x0aXBDbGFzcywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgJCh0aGlzKS5mYWRlT3V0KDE1MCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGJvZHkub24oJ21vdXNlZW50ZXIudG9vbHRpcCBtb3VzZWxlYXZlLnRvb2x0aXAnLCBzZXR0aW5ncy5zZWxlY3RvciwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpOwoKICAgICAgICAgICAgICBpZiAoZS50eXBlID09PSAnbW91c2VlbnRlcicpIHsKICAgICAgICAgICAgICAgIG1ldGhvZHMuc2hvd09yQ3JlYXRlVGlwKCR0aGlzKTsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUudHlwZSA9PT0gJ21vdXNlbGVhdmUnKSB7CiAgICAgICAgICAgICAgICBtZXRob2RzLmhpZGUoJHRoaXMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CgogICAgICAgICAgJCh0aGlzKS5kYXRhKCd0b29sdGlwcycsIHRydWUpOwoKICAgICAgICB9KTsKICAgICAgfSwKICAgICAgc2hvd09yQ3JlYXRlVGlwIDogZnVuY3Rpb24gKCR0YXJnZXQsIGNvbnRlbnQpIHsKICAgICAgICB2YXIgJHRpcCA9IG1ldGhvZHMuZ2V0VGlwKCR0YXJnZXQpOwoKICAgICAgICBpZiAoJHRpcCAmJiAkdGlwLmxlbmd0aCA+IDApIHsKICAgICAgICAgIG1ldGhvZHMuc2hvdygkdGFyZ2V0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbWV0aG9kcy5jcmVhdGUoJHRhcmdldCwgY29udGVudCk7CiAgICAgICAgfQogICAgICB9LAogICAgICBnZXRUaXAgOiBmdW5jdGlvbiAoJHRhcmdldCkgewogICAgICAgIHZhciBzZWxlY3RvciA9IG1ldGhvZHMuc2VsZWN0b3IoJHRhcmdldCksCiAgICAgICAgICB0aXAgPSBudWxsOwoKICAgICAgICBpZiAoc2VsZWN0b3IpIHsKICAgICAgICAgIHRpcCA9ICQoJ3NwYW5bZGF0YS1zZWxlY3Rvcj0nICsgc2VsZWN0b3IgKyAnXScgKyBzZXR0aW5ncy50b29sdGlwQ2xhc3MpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKHRpcC5sZW5ndGggPiAwKSA/IHRpcCA6IGZhbHNlOwogICAgICB9LAogICAgICBzZWxlY3RvciA6IGZ1bmN0aW9uICgkdGFyZ2V0KSB7CiAgICAgICAgdmFyIGlkID0gJHRhcmdldC5hdHRyKCdpZCcpLAogICAgICAgICAgZGF0YVNlbGVjdG9yID0gJHRhcmdldC5kYXRhKCdzZWxlY3RvcicpOwoKICAgICAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCAmJiBkYXRhU2VsZWN0b3IgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgZGF0YVNlbGVjdG9yID0gJ3Rvb2x0aXAnICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpOwogICAgICAgICAgJHRhcmdldC5hdHRyKCdkYXRhLXNlbGVjdG9yJywgZGF0YVNlbGVjdG9yKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIChpZCkgPyBpZCA6IGRhdGFTZWxlY3RvcjsKICAgICAgfSwKICAgICAgY3JlYXRlIDogZnVuY3Rpb24gKCR0YXJnZXQsIGNvbnRlbnQpIHsKICAgICAgICB2YXIgJHRpcCA9ICQoc2V0dGluZ3MudGlwVGVtcGxhdGUobWV0aG9kcy5zZWxlY3RvcigkdGFyZ2V0KSwKICAgICAgICAgICQoJzxkaXY+JykuaHRtbChjb250ZW50ID8gY29udGVudCA6ICR0YXJnZXQuYXR0cigndGl0bGUnKSkuaHRtbCgpKSksCiAgICAgICAgICBjbGFzc2VzID0gbWV0aG9kcy5pbmhlcml0YWJsZV9jbGFzc2VzKCR0YXJnZXQpOwoKICAgICAgICAkdGlwLmFkZENsYXNzKGNsYXNzZXMpLmFwcGVuZFRvKCdib2R5Jyk7CiAgICAgICAgaWYgKE1vZGVybml6ci50b3VjaCkgewogICAgICAgICAgJHRpcC5hcHBlbmQoJzxzcGFuIGNsYXNzPSJ0YXAtdG8tY2xvc2UiPnRhcCB0byBjbG9zZSA8L3NwYW4+Jyk7CiAgICAgICAgfQogICAgICAgICR0YXJnZXQucmVtb3ZlQXR0cigndGl0bGUnKTsKICAgICAgICBtZXRob2RzLnNob3coJHRhcmdldCk7CiAgICAgIH0sCiAgICAgIHJlcG9zaXRpb24gOiBmdW5jdGlvbiAodGFyZ2V0LCB0aXAsIGNsYXNzZXMpIHsKICAgICAgICB2YXIgd2lkdGgsIG51YiwgbnViSGVpZ2h0LCBudWJXaWR0aCwgY29sdW1uLCBvYmpQb3M7CgogICAgICAgIHRpcC5jc3MoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJykuc2hvdygpOwoKICAgICAgICB3aWR0aCA9IHRhcmdldC5kYXRhKCd3aWR0aCcpOwogICAgICAgIG51YiA9IHRpcC5jaGlsZHJlbignLm51YicpOwogICAgICAgIG51YkhlaWdodCA9IG51Yi5vdXRlckhlaWdodCgpOwogICAgICAgIG51YldpZHRoID0gbnViLm91dGVyV2lkdGgoKTsKCiAgICAgICAgb2JqUG9zID0gZnVuY3Rpb24gKG9iaiwgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LCB3aWR0aCkgewogICAgICAgICAgcmV0dXJuIG9iai5jc3MoewogICAgICAgICAgICAndG9wJyA6IHRvcCwKICAgICAgICAgICAgJ2JvdHRvbScgOiBib3R0b20sCiAgICAgICAgICAgICdsZWZ0JyA6IGxlZnQsCiAgICAgICAgICAgICdyaWdodCcgOiByaWdodCwKICAgICAgICAgICAgJ21heC13aWR0aCcgOiAod2lkdGgpID8gd2lkdGggOiAnYXV0bycKICAgICAgICAgIH0pLmVuZCgpOwogICAgICAgIH07CgogICAgICAgIG9ialBvcyh0aXAsICh0YXJnZXQub2Zmc2V0KCkudG9wICsgdGFyZ2V0Lm91dGVySGVpZ2h0KCkgKyAxMCksICdhdXRvJywgJ2F1dG8nLCB0YXJnZXQub2Zmc2V0KCkubGVmdCwgd2lkdGgpOwogICAgICAgIG9ialBvcyhudWIsIC1udWJIZWlnaHQsICdhdXRvJywgJ2F1dG8nLCAxMCk7CgogICAgICAgIGlmICgkKHdpbmRvdykud2lkdGgoKSA8IDc2NykgewogICAgICAgICAgY29sdW1uID0gdGFyZ2V0LmNsb3Nlc3QoJy5jb2x1bW5zJyk7CgogICAgICAgICAgaWYgKGNvbHVtbi5sZW5ndGggPCAwKSB7CiAgICAgICAgICAgIC8vIGlmIG5vdCB1c2luZyBGb3VuZGF0aW9uCiAgICAgICAgICAgIGNvbHVtbiA9ICQoJ2JvZHknKTsKICAgICAgICAgIH0KICAgICAgICAgIHRpcC53aWR0aChjb2x1bW4ub3V0ZXJXaWR0aCgpIC0gMjUpLmNzcygnbGVmdCcsIDE1KS5hZGRDbGFzcygndGlwLW92ZXJyaWRlJyk7CiAgICAgICAgICBvYmpQb3MobnViLCAtbnViSGVpZ2h0LCAnYXV0bycsICdhdXRvJywgdGFyZ2V0Lm9mZnNldCgpLmxlZnQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoY2xhc3NlcyAmJiBjbGFzc2VzLmluZGV4T2YoJ3RpcC10b3AnKSA+IC0xKSB7CiAgICAgICAgICAgIG9ialBvcyh0aXAsICh0YXJnZXQub2Zmc2V0KCkudG9wIC0gdGlwLm91dGVySGVpZ2h0KCkgLSBudWJIZWlnaHQpLCAnYXV0bycsICdhdXRvJywgdGFyZ2V0Lm9mZnNldCgpLmxlZnQsIHdpZHRoKQogICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygndGlwLW92ZXJyaWRlJyk7CiAgICAgICAgICAgIG9ialBvcyhudWIsICdhdXRvJywgJ2F1dG8nLCAtbnViSGVpZ2h0LCAnYXV0bycpOwogICAgICAgICAgfSBlbHNlIGlmIChjbGFzc2VzICYmIGNsYXNzZXMuaW5kZXhPZigndGlwLWxlZnQnKSA+IC0xKSB7CiAgICAgICAgICAgIG9ialBvcyh0aXAsICh0YXJnZXQub2Zmc2V0KCkudG9wICsgKHRhcmdldC5vdXRlckhlaWdodCgpIC8gMikgLSBudWJIZWlnaHQpLCAnYXV0bycsICdhdXRvJywgKHRhcmdldC5vZmZzZXQoKS5sZWZ0IC0gdGlwLm91dGVyV2lkdGgoKSAtIDEwKSwgd2lkdGgpCiAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCd0aXAtb3ZlcnJpZGUnKTsKICAgICAgICAgICAgb2JqUG9zKG51YiwgKHRpcC5vdXRlckhlaWdodCgpIC8gMikgLSAobnViSGVpZ2h0IC8gMiksIC1udWJIZWlnaHQsICdhdXRvJywgJ2F1dG8nKTsKICAgICAgICAgIH0gZWxzZSBpZiAoY2xhc3NlcyAmJiBjbGFzc2VzLmluZGV4T2YoJ3RpcC1yaWdodCcpID4gLTEpIHsKICAgICAgICAgICAgb2JqUG9zKHRpcCwgKHRhcmdldC5vZmZzZXQoKS50b3AgKyAodGFyZ2V0Lm91dGVySGVpZ2h0KCkgLyAyKSAtIG51YkhlaWdodCksICdhdXRvJywgJ2F1dG8nLCAodGFyZ2V0Lm9mZnNldCgpLmxlZnQgKyB0YXJnZXQub3V0ZXJXaWR0aCgpICsgMTApLCB3aWR0aCkKICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ3RpcC1vdmVycmlkZScpOwogICAgICAgICAgICBvYmpQb3MobnViLCAodGlwLm91dGVySGVpZ2h0KCkgLyAyKSAtIChudWJIZWlnaHQgLyAyKSwgJ2F1dG8nLCAnYXV0bycsIC1udWJIZWlnaHQpOwogICAgICAgICAgfSBlbHNlIGlmIChjbGFzc2VzICYmIGNsYXNzZXMuaW5kZXhPZigndGlwLWNlbnRlcmVkLXRvcCcpID4gLTEpIHsKICAgICAgICAgICAgb2JqUG9zKHRpcCwgKHRhcmdldC5vZmZzZXQoKS50b3AgLSB0aXAub3V0ZXJIZWlnaHQoKSAtIG51YkhlaWdodCksICdhdXRvJywgJ2F1dG8nLCAodGFyZ2V0Lm9mZnNldCgpLmxlZnQgKyAoKHRhcmdldC5vdXRlcldpZHRoKCkgLSB0aXAub3V0ZXJXaWR0aCgpKSAvIDIpICksIHdpZHRoKQogICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygndGlwLW92ZXJyaWRlJyk7CiAgICAgICAgICAgIG9ialBvcyhudWIsICdhdXRvJywgKCh0aXAub3V0ZXJXaWR0aCgpIC8gMikgLShudWJIZWlnaHQgLyAyKSksIC1udWJIZWlnaHQsICdhdXRvJyk7CiAgICAgICAgICB9IGVsc2UgaWYgKGNsYXNzZXMgJiYgY2xhc3Nlcy5pbmRleE9mKCd0aXAtY2VudGVyZWQtYm90dG9tJykgPiAtMSkgewogICAgICAgICAgICBvYmpQb3ModGlwLCAodGFyZ2V0Lm9mZnNldCgpLnRvcCArIHRhcmdldC5vdXRlckhlaWdodCgpICsgMTApLCAnYXV0bycsICdhdXRvJywgKHRhcmdldC5vZmZzZXQoKS5sZWZ0ICsgKCh0YXJnZXQub3V0ZXJXaWR0aCgpIC0gdGlwLm91dGVyV2lkdGgoKSkgLyAyKSApLCB3aWR0aCkKICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ3RpcC1vdmVycmlkZScpOwogICAgICAgICAgICBvYmpQb3MobnViLCAtbnViSGVpZ2h0LCAoKHRpcC5vdXRlcldpZHRoKCkgLyAyKSAtKG51YkhlaWdodCAvIDIpKSwgJ2F1dG8nLCAnYXV0bycpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aXAuY3NzKCd2aXNpYmlsaXR5JywgJ3Zpc2libGUnKS5oaWRlKCk7CiAgICAgIH0sCiAgICAgIGluaGVyaXRhYmxlX2NsYXNzZXMgOiBmdW5jdGlvbiAodGFyZ2V0KSB7CiAgICAgICAgdmFyIGluaGVyaXRhYmxlcyA9IFsndGlwLXRvcCcsICd0aXAtbGVmdCcsICd0aXAtYm90dG9tJywgJ3RpcC1yaWdodCcsICd0aXAtY2VudGVyZWQtdG9wJywgJ3RpcC1jZW50ZXJlZC1ib3R0b20nLCAnbm9yYWRpdXMnXS5jb25jYXQoc2V0dGluZ3MuYWRkaXRpb25hbEluaGVyaXRhYmxlQ2xhc3NlcyksCiAgICAgICAgICBjbGFzc2VzID0gdGFyZ2V0LmF0dHIoJ2NsYXNzJyksCiAgICAgICAgICBmaWx0ZXJlZCA9IGNsYXNzZXMgPyAkLm1hcChjbGFzc2VzLnNwbGl0KCcgJyksIGZ1bmN0aW9uIChlbCwgaSkgewogICAgICAgICAgICAgIGlmICgkLmluQXJyYXkoZWwsIGluaGVyaXRhYmxlcykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZWw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfSkuam9pbignICcpIDogJyc7CiAgICAgICAgICAKICAgICAgICByZXR1cm4gJC50cmltKGZpbHRlcmVkKTsKICAgICAgfSwKICAgICAgc2hvdyA6IGZ1bmN0aW9uICgkdGFyZ2V0KSB7CiAgICAgICAgdmFyICR0aXAgPSBtZXRob2RzLmdldFRpcCgkdGFyZ2V0KTsKCiAgICAgICAgbWV0aG9kcy5yZXBvc2l0aW9uKCR0YXJnZXQsICR0aXAsICR0YXJnZXQuYXR0cignY2xhc3MnKSk7CiAgICAgICAgJHRpcC5mYWRlSW4oMTUwKTsKICAgICAgfSwKICAgICAgaGlkZSA6IGZ1bmN0aW9uICgkdGFyZ2V0KSB7CiAgICAgICAgdmFyICR0aXAgPSBtZXRob2RzLmdldFRpcCgkdGFyZ2V0KTsKCiAgICAgICAgJHRpcC5mYWRlT3V0KDE1MCk7CiAgICAgIH0sCiAgICAgIHJlbG9hZCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgJHNlbGYgPSAkKHRoaXMpOwoKICAgICAgICByZXR1cm4gKCRzZWxmLmRhdGEoJ3Rvb2x0aXBzJykpID8gJHNlbGYuZm91bmRhdGlvblRvb2x0aXBzKCdkZXN0cm95JykuZm91bmRhdGlvblRvb2x0aXBzKCdpbml0JykgOiAkc2VsZi5mb3VuZGF0aW9uVG9vbHRpcHMoJ2luaXQnKTsKICAgICAgfSwKICAgICAgZGVzdHJveSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICQod2luZG93KS5vZmYoJy50b29sdGlwJyk7CiAgICAgICAgICAkKHNldHRpbmdzLnNlbGVjdG9yKS5vZmYoJy50b29sdGlwJyk7CiAgICAgICAgICAkKHNldHRpbmdzLnRvb2x0aXBDbGFzcykuZWFjaChmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAkKCQoc2V0dGluZ3Muc2VsZWN0b3IpLmdldChpKSkuYXR0cigndGl0bGUnLCAkKHRoaXMpLnRleHQoKSk7CiAgICAgICAgICB9KS5yZW1vdmUoKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfTsKCiAgJC5mbi5mb3VuZGF0aW9uVG9vbHRpcHMgPSBmdW5jdGlvbiAobWV0aG9kKSB7CiAgICBpZiAobWV0aG9kc1ttZXRob2RdKSB7CiAgICAgIHJldHVybiBtZXRob2RzW21ldGhvZF0uYXBwbHkodGhpcywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtZXRob2QgPT09ICdvYmplY3QnIHx8ICFtZXRob2QpIHsKICAgICAgcmV0dXJuIG1ldGhvZHMuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfSBlbHNlIHsKICAgICAgJC5lcnJvcignTWV0aG9kICcgKyAgbWV0aG9kICsgJyBkb2VzIG5vdCBleGlzdCBvbiBqUXVlcnkuZm91bmRhdGlvblRvb2x0aXBzJyk7CiAgICB9CiAgfTsKfShqUXVlcnksIHRoaXMpKTsK]]></data>
	</file>
	<file>
	  <filename>/assets/javascripts/jquery.foundation.topbar.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IEZvdW5kYXRpb24gVG9wIEJhciAyLjAuMwogKiBodHRwOi8vZm91bmRhdGlvbi56dXJiLmNvbQogKiBDb3B5cmlnaHQgMjAxMiwgWlVSQgogKiBGcmVlIHRvIHVzZSB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwCiovCgovKmpzbGludCB1bnBhcmFtOiB0cnVlLCBicm93c2VyOiB0cnVlLCBpbmRlbnQ6IDIgKi8KCjsoZnVuY3Rpb24gKCQsIHdpbmRvdywgdW5kZWZpbmVkKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgc2V0dGluZ3MgPSB7CiAgICAgIGluZGV4IDogMCwKICAgICAgaW5pdGlhbGl6ZWQgOiBmYWxzZQogICAgfSwKCiAgICBtZXRob2RzID0gewogICAgICBpbml0IDogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHNldHRpbmdzID0gJC5leHRlbmQoc2V0dGluZ3MsIG9wdGlvbnMpOwogICAgICAgICAgc2V0dGluZ3MuJHcgPSAkKHdpbmRvdyksCiAgICAgICAgICBzZXR0aW5ncy4kdG9wYmFyID0gJCgnbmF2LnRvcC1iYXInKSwKICAgICAgICAgIHNldHRpbmdzLiRzZWN0aW9uID0gc2V0dGluZ3MuJHRvcGJhci5maW5kKCdzZWN0aW9uJyksCiAgICAgICAgICBzZXR0aW5ncy4kdGl0bGViYXIgPSBzZXR0aW5ncy4kdG9wYmFyLmNoaWxkcmVuKCd1bDpmaXJzdCcpOwoKICAgICAgICAgIHZhciBicmVha3BvaW50ID0gJCgiPGRpdiBjbGFzcz0ndG9wLWJhci1qcy1icmVha3BvaW50Jy8+IikuYXBwZW5kVG8oImJvZHkiKTsKICAgICAgICAgIHNldHRpbmdzLmJyZWFrUG9pbnQgPSBicmVha3BvaW50LndpZHRoKCk7CiAgICAgICAgICBicmVha3BvaW50LnJlbW92ZSgpOwoKICAgICAgICAgIGlmICghc2V0dGluZ3MuaW5pdGlhbGl6ZWQpIHsKICAgICAgICAgICAgbWV0aG9kcy5hc3NlbWJsZSgpOwogICAgICAgICAgICBzZXR0aW5ncy5pbml0aWFsaXplZCA9IHRydWU7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKCFzZXR0aW5ncy5oZWlnaHQpIHsKICAgICAgICAgICAgbWV0aG9kcy5sYXJnZXN0VUwoKTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoc2V0dGluZ3MuJHRvcGJhci5wYXJlbnQoKS5oYXNDbGFzcygnZml4ZWQnKSkgewogICAgICAgICAgICAkKCdib2R5JykuY3NzKCdwYWRkaW5nLXRvcCcsc2V0dGluZ3MuJHRvcGJhci5vdXRlckhlaWdodCgpKQogICAgICAgICAgfQoKICAgICAgICAgICQoJy50b3AtYmFyIC50b2dnbGUtdG9wYmFyJykuZGllKCdjbGljay5mbmR0bicpLmxpdmUoJ2NsaWNrLmZuZHRuJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICAgICAgaWYgKG1ldGhvZHMuYnJlYWtwb2ludCgpKSB7CiAgICAgICAgICAgICAgc2V0dGluZ3MuJHRvcGJhci50b2dnbGVDbGFzcygnZXhwYW5kZWQnKTsKICAgICAgICAgICAgICBzZXR0aW5ncy4kdG9wYmFyLmNzcygnbWluLWhlaWdodCcsICcnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy4kdG9wYmFyLmhhc0NsYXNzKCdleHBhbmRlZCcpKSB7CiAgICAgICAgICAgICAgc2V0dGluZ3MuJHNlY3Rpb24uY3NzKHtsZWZ0OiAnMCUnfSk7CiAgICAgICAgICAgICAgc2V0dGluZ3MuJHNlY3Rpb24uZmluZCgnPi5uYW1lJykuY3NzKHtsZWZ0OiAnMTAwJSd9KTsKICAgICAgICAgICAgICBzZXR0aW5ncy4kc2VjdGlvbi5maW5kKCdsaS5tb3ZlZCcpLnJlbW92ZUNsYXNzKCdtb3ZlZCcpOwogICAgICAgICAgICAgIHNldHRpbmdzLmluZGV4ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CgogICAgICAgICAgLy8gU2hvdyB0aGUgRHJvcGRvd24gTGV2ZWxzIG9uIENsaWNrCiAgICAgICAgICAkKCcudG9wLWJhciAuaGFzLWRyb3Bkb3duPmEnKS5kaWUoJ2NsaWNrLmZuZHRuJykubGl2ZSgnY2xpY2suZm5kdG4nLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBpZiAoTW9kZXJuaXpyLnRvdWNoIHx8IG1ldGhvZHMuYnJlYWtwb2ludCgpKQogICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgIGlmIChtZXRob2RzLmJyZWFrcG9pbnQoKSkgewogICAgICAgICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyksCiAgICAgICAgICAgICAgICAgICRzZWxlY3RlZExpID0gJHRoaXMuY2xvc2VzdCgnbGknKTsKCiAgICAgICAgICAgICAgc2V0dGluZ3MuaW5kZXggKz0gMTsKICAgICAgICAgICAgICAkc2VsZWN0ZWRMaS5hZGRDbGFzcygnbW92ZWQnKTsKICAgICAgICAgICAgICBzZXR0aW5ncy4kc2VjdGlvbi5jc3Moe2xlZnQ6IC0oMTAwICogc2V0dGluZ3MuaW5kZXgpICsgJyUnfSk7CiAgICAgICAgICAgICAgc2V0dGluZ3MuJHNlY3Rpb24uZmluZCgnPi5uYW1lJykuY3NzKHtsZWZ0OiAxMDAgKiBzZXR0aW5ncy5pbmRleCArICclJ30pOwoKICAgICAgICAgICAgICAkdGhpcy5zaWJsaW5ncygndWwnKS5oZWlnaHQoc2V0dGluZ3MuaGVpZ2h0ICsgc2V0dGluZ3MuJHRpdGxlYmFyLm91dGVySGVpZ2h0KHRydWUpKTsKICAgICAgICAgICAgICBzZXR0aW5ncy4kdG9wYmFyLmNzcygnbWluLWhlaWdodCcsIHNldHRpbmdzLmhlaWdodCArIHNldHRpbmdzLiR0aXRsZWJhci5vdXRlckhlaWdodCh0cnVlKSAqIDIpCiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwoKICAgICAgICAgICQod2luZG93KS5vbigncmVzaXplLmZuZHRuLnRvcGJhcicsZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghbWV0aG9kcy5icmVha3BvaW50KCkpIHsKICAgICAgICAgICAgICBzZXR0aW5ncy4kdG9wYmFyLmNzcygnbWluLWhlaWdodCcsICcnKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CgogICAgICAgICAgLy8gR28gdXAgYSBsZXZlbCBvbiBDbGljawogICAgICAgICAgJCgnLnRvcC1iYXIgLmhhcy1kcm9wZG93biAuYmFjaycpLmRpZSgnY2xpY2suZm5kdG4nKS5saXZlKCdjbGljay5mbmR0bicsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyksCiAgICAgICAgICAgICAgJG1vdmVkTGkgPSAkdGhpcy5jbG9zZXN0KCdsaS5tb3ZlZCcpLAogICAgICAgICAgICAgICRwcmV2aW91c0xldmVsVWwgPSAkbW92ZWRMaS5wYXJlbnQoKTsKCiAgICAgICAgICAgIHNldHRpbmdzLmluZGV4IC09IDE7CiAgICAgICAgICAgIHNldHRpbmdzLiRzZWN0aW9uLmNzcyh7bGVmdDogLSgxMDAgKiBzZXR0aW5ncy5pbmRleCkgKyAnJSd9KTsKICAgICAgICAgICAgc2V0dGluZ3MuJHNlY3Rpb24uZmluZCgnPi5uYW1lJykuY3NzKHsnbGVmdCc6IDEwMCAqIHNldHRpbmdzLmluZGV4ICsgJyUnfSk7CgogICAgICAgICAgICBpZiAoc2V0dGluZ3MuaW5kZXggPT09IDApIHsKICAgICAgICAgICAgICBzZXR0aW5ncy4kdG9wYmFyLmNzcygnbWluLWhlaWdodCcsIDApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAkbW92ZWRMaS5yZW1vdmVDbGFzcygnbW92ZWQnKTsKICAgICAgICAgICAgfSwgMzAwKTsKICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9LAoKICAgICAgYnJlYWtwb2ludCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gc2V0dGluZ3MuJHcud2lkdGgoKSA8IHNldHRpbmdzLmJyZWFrUG9pbnQ7CiAgICAgIH0sCgogICAgICBhc3NlbWJsZSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAvLyBQdWxsIGVsZW1lbnQgb3V0IG9mIHRoZSBET00gZm9yIG1hbmlwdWxhdGlvbgogICAgICAgIHNldHRpbmdzLiRzZWN0aW9uLmRldGFjaCgpOwoKICAgICAgICBzZXR0aW5ncy4kc2VjdGlvbi5maW5kKCcuaGFzLWRyb3Bkb3duPmEnKS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHZhciAkbGluayA9ICQodGhpcyksCiAgICAgICAgICAgICAgJGRyb3Bkb3duID0gJGxpbmsuc2libGluZ3MoJy5kcm9wZG93bicpLAogICAgICAgICAgICAgICR0aXRsZUxpID0gJCgnPGxpIGNsYXNzPSJ0aXRsZSBiYWNrIGpzLWdlbmVyYXRlZCI+PGg1PjxhIGhyZWY9IiMiPjwvYT48L2g1PjwvbGk+Jyk7CgogICAgICAgICAgLy8gQ29weSBsaW5rIHRvIHN1Ym5hdgogICAgICAgICAgJHRpdGxlTGkuZmluZCgnaDU+YScpLmh0bWwoJGxpbmsuaHRtbCgpKTsKICAgICAgICAgICRkcm9wZG93bi5wcmVwZW5kKCR0aXRsZUxpKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gUHV0IGVsZW1lbnQgYmFjayBpbiB0aGUgRE9NCiAgICAgICAgc2V0dGluZ3MuJHNlY3Rpb24uYXBwZW5kVG8oc2V0dGluZ3MuJHRvcGJhcik7CiAgICAgIH0sCgogICAgICBsYXJnZXN0VUwgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIHVscyA9IHNldHRpbmdzLiR0b3BiYXIuZmluZCgnc2VjdGlvbiB1bCB1bCcpLAogICAgICAgICAgICBsYXJnZXN0ID0gdWxzLmZpcnN0KCksCiAgICAgICAgICAgIHRvdGFsID0gMDsKCiAgICAgICAgdWxzLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgaWYgKCQodGhpcykuY2hpbGRyZW4oJ2xpJykubGVuZ3RoID4gbGFyZ2VzdC5jaGlsZHJlbignbGknKS5sZW5ndGgpIHsKICAgICAgICAgICAgbGFyZ2VzdCA9ICQodGhpcyk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIGxhcmdlc3QuY2hpbGRyZW4oJ2xpJykuZWFjaChmdW5jdGlvbiAoKSB7IHRvdGFsICs9ICQodGhpcykub3V0ZXJIZWlnaHQodHJ1ZSk7IH0pOwoKICAgICAgICBzZXR0aW5ncy5oZWlnaHQgPSB0b3RhbDsKICAgICAgfQogICAgfTsKCiAgJC5mbi5mb3VuZGF0aW9uVG9wQmFyID0gZnVuY3Rpb24gKG1ldGhvZCkgewogICAgaWYgKG1ldGhvZHNbbWV0aG9kXSkgewogICAgICByZXR1cm4gbWV0aG9kc1ttZXRob2RdLmFwcGx5KHRoaXMsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgbWV0aG9kID09PSAnb2JqZWN0JyB8fCAhbWV0aG9kKSB7CiAgICAgIHJldHVybiBtZXRob2RzLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH0gZWxzZSB7CiAgICAgICQuZXJyb3IoJ01ldGhvZCAnICsgIG1ldGhvZCArICcgZG9lcyBub3QgZXhpc3Qgb24galF1ZXJ5LmZvdW5kYXRpb25Ub3BCYXInKTsKICAgIH0KICB9OwoKICAvLyBNb25pdG9yIHNjcm9sbCBwb3NpdGlvbiBmb3Igc3RpY2t5CiAgaWYgKCQoJy5zdGlja3knKS5sZW5ndGggPiAwKSB7CiAgICB2YXIgZGlzdGFuY2UgPSAkKCcuc3RpY2t5JykubGVuZ3RoID8gJCgnLnN0aWNreScpLm9mZnNldCgpLnRvcDogMCwKICAgICAgICAkd2luZG93ID0gJCh3aW5kb3cpOwoKICAgICAgJHdpbmRvdy5zY3JvbGwoZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKCAkd2luZG93LnNjcm9sbFRvcCgpID49IGRpc3RhbmNlICkgewogICAgICAgICAgICQoIi5zdGlja3kiKS5hZGRDbGFzcygiZml4ZWQiKTsKICAgICAgICB9CgogICAgICAgZWxzZSBpZiAoICR3aW5kb3cuc2Nyb2xsVG9wKCkgPCBkaXN0YW5jZSApIHsKICAgICAgICAgICQoIi5zdGlja3kiKS5yZW1vdmVDbGFzcygiZml4ZWQiKTsKICAgICAgIH0KICAgIH0pOwogIH0KCn0oalF1ZXJ5LCB0aGlzKSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/assets/javascripts/jquery.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuOC4yCiAqIGh0dHA6Ly9qcXVlcnkuY29tLwogKgogKiBJbmNsdWRlcyBTaXp6bGUuanMKICogaHR0cDovL3NpenpsZWpzLmNvbS8KICoKICogQ29weXJpZ2h0IDIwMTIgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UKICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBEYXRlOiBUaHUgU2VwIDIwIDIwMTIgMjE6MTM6MDUgR01ULTA0MDAgKEVhc3Rlcm4gRGF5bGlnaHQgVGltZSkKICovCihmdW5jdGlvbiggd2luZG93LCB1bmRlZmluZWQgKSB7CnZhcgoJLy8gQSBjZW50cmFsIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBqUXVlcnkoZG9jdW1lbnQpCglyb290alF1ZXJ5LAoKCS8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeQoJcmVhZHlMaXN0LAoKCS8vIFVzZSB0aGUgY29ycmVjdCBkb2N1bWVudCBhY2NvcmRpbmdseSB3aXRoIHdpbmRvdyBhcmd1bWVudCAoc2FuZGJveCkKCWRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50LAoJbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb24sCgluYXZpZ2F0b3IgPSB3aW5kb3cubmF2aWdhdG9yLAoKCS8vIE1hcCBvdmVyIGpRdWVyeSBpbiBjYXNlIG9mIG92ZXJ3cml0ZQoJX2pRdWVyeSA9IHdpbmRvdy5qUXVlcnksCgoJLy8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGUKCV8kID0gd2luZG93LiQsCgoJLy8gU2F2ZSBhIHJlZmVyZW5jZSB0byBzb21lIGNvcmUgbWV0aG9kcwoJY29yZV9wdXNoID0gQXJyYXkucHJvdG90eXBlLnB1c2gsCgljb3JlX3NsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLAoJY29yZV9pbmRleE9mID0gQXJyYXkucHJvdG90eXBlLmluZGV4T2YsCgljb3JlX3RvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZywKCWNvcmVfaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSwKCWNvcmVfdHJpbSA9IFN0cmluZy5wcm90b3R5cGUudHJpbSwKCgkvLyBEZWZpbmUgYSBsb2NhbCBjb3B5IG9mIGpRdWVyeQoJalF1ZXJ5ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJCS8vIFRoZSBqUXVlcnkgb2JqZWN0IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2VkJwoJCXJldHVybiBuZXcgalF1ZXJ5LmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0LCByb290alF1ZXJ5ICk7Cgl9LAoKCS8vIFVzZWQgZm9yIG1hdGNoaW5nIG51bWJlcnMKCWNvcmVfcG51bSA9IC9bXC0rXT8oPzpcZCpcLnwpXGQrKD86W2VFXVtcLStdP1xkK3wpLy5zb3VyY2UsCgoJLy8gVXNlZCBmb3IgZGV0ZWN0aW5nIGFuZCB0cmltbWluZyB3aGl0ZXNwYWNlCgljb3JlX3Jub3R3aGl0ZSA9IC9cUy8sCgljb3JlX3JzcGFjZSA9IC9ccysvLAoKCS8vIE1ha2Ugc3VyZSB3ZSB0cmltIEJPTSBhbmQgTkJTUCAoaGVyZSdzIGxvb2tpbmcgYXQgeW91LCBTYWZhcmkgNS4wIGFuZCBJRSkKCXJ0cmltID0gL15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLAoKCS8vIEEgc2ltcGxlIHdheSB0byBjaGVjayBmb3IgSFRNTCBzdHJpbmdzCgkvLyBQcmlvcml0aXplICNpZCBvdmVyIDx0YWc+IHRvIGF2b2lkIFhTUyB2aWEgbG9jYXRpb24uaGFzaCAoIzk1MjEpCglycXVpY2tFeHByID0gL14oPzpbXiM8XSooPFtcd1xXXSs+KVtePl0qJHwjKFtcd1wtXSopJCkvLAoKCS8vIE1hdGNoIGEgc3RhbmRhbG9uZSB0YWcKCXJzaW5nbGVUYWcgPSAvXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT58KSQvLAoKCS8vIEpTT04gUmVnRXhwCglydmFsaWRjaGFycyA9IC9eW1xdLDp7fVxzXSokLywKCXJ2YWxpZGJyYWNlcyA9IC8oPzpefDp8LCkoPzpccypcWykrL2csCglydmFsaWRlc2NhcGUgPSAvXFwoPzpbIlxcXC9iZm5ydF18dVtcZGEtZkEtRl17NH0pL2csCglydmFsaWR0b2tlbnMgPSAvIlteIlxcXHJcbl0qInx0cnVlfGZhbHNlfG51bGx8LT8oPzpcZFxkKlwufClcZCsoPzpbZUVdW1wtK10/XGQrfCkvZywKCgkvLyBNYXRjaGVzIGRhc2hlZCBzdHJpbmcgZm9yIGNhbWVsaXppbmcKCXJtc1ByZWZpeCA9IC9eLW1zLS8sCglyZGFzaEFscGhhID0gLy0oW1xkYS16XSkvZ2ksCgoJLy8gVXNlZCBieSBqUXVlcnkuY2FtZWxDYXNlIGFzIGNhbGxiYWNrIHRvIHJlcGxhY2UoKQoJZmNhbWVsQ2FzZSA9IGZ1bmN0aW9uKCBhbGwsIGxldHRlciApIHsKCQlyZXR1cm4gKCBsZXR0ZXIgKyAiIiApLnRvVXBwZXJDYXNlKCk7Cgl9LAoKCS8vIFRoZSByZWFkeSBldmVudCBoYW5kbGVyIGFuZCBzZWxmIGNsZWFudXAgbWV0aG9kCglET01Db250ZW50TG9hZGVkID0gZnVuY3Rpb24oKSB7CgkJaWYgKCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyICkgewoJCQlkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIERPTUNvbnRlbnRMb2FkZWQsIGZhbHNlICk7CgkJCWpRdWVyeS5yZWFkeSgpOwoJCX0gZWxzZSBpZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIgKSB7CgkJCS8vIHdlJ3JlIGhlcmUgYmVjYXVzZSByZWFkeVN0YXRlID09PSAiY29tcGxldGUiIGluIG9sZElFCgkJCS8vIHdoaWNoIGlzIGdvb2QgZW5vdWdoIGZvciB1cyB0byBjYWxsIHRoZSBkb20gcmVhZHkhCgkJCWRvY3VtZW50LmRldGFjaEV2ZW50KCAib25yZWFkeXN0YXRlY2hhbmdlIiwgRE9NQ29udGVudExvYWRlZCApOwoJCQlqUXVlcnkucmVhZHkoKTsKCQl9Cgl9LAoKCS8vIFtbQ2xhc3NdXSAtPiB0eXBlIHBhaXJzCgljbGFzczJ0eXBlID0ge307CgpqUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0gewoJY29uc3RydWN0b3I6IGpRdWVyeSwKCWluaXQ6IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCwgcm9vdGpRdWVyeSApIHsKCQl2YXIgbWF0Y2gsIGVsZW0sIHJldCwgZG9jOwoKCQkvLyBIYW5kbGUgJCgiIiksICQobnVsbCksICQodW5kZWZpbmVkKSwgJChmYWxzZSkKCQlpZiAoICFzZWxlY3RvciApIHsKCQkJcmV0dXJuIHRoaXM7CgkJfQoKCQkvLyBIYW5kbGUgJChET01FbGVtZW50KQoJCWlmICggc2VsZWN0b3Iubm9kZVR5cGUgKSB7CgkJCXRoaXMuY29udGV4dCA9IHRoaXNbMF0gPSBzZWxlY3RvcjsKCQkJdGhpcy5sZW5ndGggPSAxOwoJCQlyZXR1cm4gdGhpczsKCQl9CgoJCS8vIEhhbmRsZSBIVE1MIHN0cmluZ3MKCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCWlmICggc2VsZWN0b3IuY2hhckF0KDApID09PSAiPCIgJiYgc2VsZWN0b3IuY2hhckF0KCBzZWxlY3Rvci5sZW5ndGggLSAxICkgPT09ICI+IiAmJiBzZWxlY3Rvci5sZW5ndGggPj0gMyApIHsKCQkJCS8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrCgkJCQltYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTsKCgkJCX0gZWxzZSB7CgkJCQltYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTsKCQkJfQoKCQkJLy8gTWF0Y2ggaHRtbCBvciBtYWtlIHN1cmUgbm8gY29udGV4dCBpcyBzcGVjaWZpZWQgZm9yICNpZAoJCQlpZiAoIG1hdGNoICYmIChtYXRjaFsxXSB8fCAhY29udGV4dCkgKSB7CgoJCQkJLy8gSEFORExFOiAkKGh0bWwpIC0+ICQoYXJyYXkpCgkJCQlpZiAoIG1hdGNoWzFdICkgewoJCQkJCWNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4dFswXSA6IGNvbnRleHQ7CgkJCQkJZG9jID0gKCBjb250ZXh0ICYmIGNvbnRleHQubm9kZVR5cGUgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IGRvY3VtZW50ICk7CgoJCQkJCS8vIHNjcmlwdHMgaXMgdHJ1ZSBmb3IgYmFjay1jb21wYXQKCQkJCQlzZWxlY3RvciA9IGpRdWVyeS5wYXJzZUhUTUwoIG1hdGNoWzFdLCBkb2MsIHRydWUgKTsKCQkJCQlpZiAoIHJzaW5nbGVUYWcudGVzdCggbWF0Y2hbMV0gKSAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29udGV4dCApICkgewoJCQkJCQl0aGlzLmF0dHIuY2FsbCggc2VsZWN0b3IsIGNvbnRleHQsIHRydWUgKTsKCQkJCQl9CgoJCQkJCXJldHVybiBqUXVlcnkubWVyZ2UoIHRoaXMsIHNlbGVjdG9yICk7CgoJCQkJLy8gSEFORExFOiAkKCNpZCkKCQkJCX0gZWxzZSB7CgkJCQkJZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtYXRjaFsyXSApOwoKCQkJCQkvLyBDaGVjayBwYXJlbnROb2RlIHRvIGNhdGNoIHdoZW4gQmxhY2tiZXJyeSA0LjYgcmV0dXJucwoJCQkJCS8vIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgIzY5NjMKCQkJCQlpZiAoIGVsZW0gJiYgZWxlbS5wYXJlbnROb2RlICkgewoJCQkJCQkvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgSUUgYW5kIE9wZXJhIHJldHVybiBpdGVtcwoJCQkJCQkvLyBieSBuYW1lIGluc3RlYWQgb2YgSUQKCQkJCQkJaWYgKCBlbGVtLmlkICE9PSBtYXRjaFsyXSApIHsKCQkJCQkJCXJldHVybiByb290alF1ZXJ5LmZpbmQoIHNlbGVjdG9yICk7CgkJCQkJCX0KCgkJCQkJCS8vIE90aGVyd2lzZSwgd2UgaW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3QKCQkJCQkJdGhpcy5sZW5ndGggPSAxOwoJCQkJCQl0aGlzWzBdID0gZWxlbTsKCQkJCQl9CgoJCQkJCXRoaXMuY29udGV4dCA9IGRvY3VtZW50OwoJCQkJCXRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0KCgkJCS8vIEhBTkRMRTogJChleHByLCAkKC4uLikpCgkJCX0gZWxzZSBpZiAoICFjb250ZXh0IHx8IGNvbnRleHQuanF1ZXJ5ICkgewoJCQkJcmV0dXJuICggY29udGV4dCB8fCByb290alF1ZXJ5ICkuZmluZCggc2VsZWN0b3IgKTsKCgkJCS8vIEhBTkRMRTogJChleHByLCBjb250ZXh0KQoJCQkvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcikKCQkJfSBlbHNlIHsKCQkJCXJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTsKCQkJfQoKCQkvLyBIQU5ETEU6ICQoZnVuY3Rpb24pCgkJLy8gU2hvcnRjdXQgZm9yIGRvY3VtZW50IHJlYWR5CgkJfSBlbHNlIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHNlbGVjdG9yICkgKSB7CgkJCXJldHVybiByb290alF1ZXJ5LnJlYWR5KCBzZWxlY3RvciApOwoJCX0KCgkJaWYgKCBzZWxlY3Rvci5zZWxlY3RvciAhPT0gdW5kZWZpbmVkICkgewoJCQl0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3Iuc2VsZWN0b3I7CgkJCXRoaXMuY29udGV4dCA9IHNlbGVjdG9yLmNvbnRleHQ7CgkJfQoKCQlyZXR1cm4galF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTsKCX0sCgoJLy8gU3RhcnQgd2l0aCBhbiBlbXB0eSBzZWxlY3RvcgoJc2VsZWN0b3I6ICIiLAoKCS8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWQKCWpxdWVyeTogIjEuOC4yIiwKCgkvLyBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYSBqUXVlcnkgb2JqZWN0IGlzIDAKCWxlbmd0aDogMCwKCgkvLyBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldAoJc2l6ZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubGVuZ3RoOwoJfSwKCgl0b0FycmF5OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gY29yZV9zbGljZS5jYWxsKCB0aGlzICk7Cgl9LAoKCS8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1IKCS8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5CglnZXQ6IGZ1bmN0aW9uKCBudW0gKSB7CgkJcmV0dXJuIG51bSA9PSBudWxsID8KCgkJCS8vIFJldHVybiBhICdjbGVhbicgYXJyYXkKCQkJdGhpcy50b0FycmF5KCkgOgoKCQkJLy8gUmV0dXJuIGp1c3QgdGhlIG9iamVjdAoJCQkoIG51bSA8IDAgPyB0aGlzWyB0aGlzLmxlbmd0aCArIG51bSBdIDogdGhpc1sgbnVtIF0gKTsKCX0sCgoJLy8gVGFrZSBhbiBhcnJheSBvZiBlbGVtZW50cyBhbmQgcHVzaCBpdCBvbnRvIHRoZSBzdGFjawoJLy8gKHJldHVybmluZyB0aGUgbmV3IG1hdGNoZWQgZWxlbWVudCBzZXQpCglwdXNoU3RhY2s6IGZ1bmN0aW9uKCBlbGVtcywgbmFtZSwgc2VsZWN0b3IgKSB7CgoJCS8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0CgkJdmFyIHJldCA9IGpRdWVyeS5tZXJnZSggdGhpcy5jb25zdHJ1Y3RvcigpLCBlbGVtcyApOwoKCQkvLyBBZGQgdGhlIG9sZCBvYmplY3Qgb250byB0aGUgc3RhY2sgKGFzIGEgcmVmZXJlbmNlKQoJCXJldC5wcmV2T2JqZWN0ID0gdGhpczsKCgkJcmV0LmNvbnRleHQgPSB0aGlzLmNvbnRleHQ7CgoJCWlmICggbmFtZSA9PT0gImZpbmQiICkgewoJCQlyZXQuc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yICsgKCB0aGlzLnNlbGVjdG9yID8gIiAiIDogIiIgKSArIHNlbGVjdG9yOwoJCX0gZWxzZSBpZiAoIG5hbWUgKSB7CgkJCXJldC5zZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IgKyAiLiIgKyBuYW1lICsgIigiICsgc2VsZWN0b3IgKyAiKSI7CgkJfQoKCQkvLyBSZXR1cm4gdGhlIG5ld2x5LWZvcm1lZCBlbGVtZW50IHNldAoJCXJldHVybiByZXQ7Cgl9LAoKCS8vIEV4ZWN1dGUgYSBjYWxsYmFjayBmb3IgZXZlcnkgZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBzZXQuCgkvLyAoWW91IGNhbiBzZWVkIHRoZSBhcmd1bWVudHMgd2l0aCBhbiBhcnJheSBvZiBhcmdzLCBidXQgdGhpcyBpcwoJLy8gb25seSB1c2VkIGludGVybmFsbHkuKQoJZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrLCBhcmdzICkgewoJCXJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJhY2ssIGFyZ3MgKTsKCX0sCgoJcmVhZHk6IGZ1bmN0aW9uKCBmbiApIHsKCQkvLyBBZGQgdGhlIGNhbGxiYWNrCgkJalF1ZXJ5LnJlYWR5LnByb21pc2UoKS5kb25lKCBmbiApOwoKCQlyZXR1cm4gdGhpczsKCX0sCgoJZXE6IGZ1bmN0aW9uKCBpICkgewoJCWkgPSAraTsKCQlyZXR1cm4gaSA9PT0gLTEgPwoJCQl0aGlzLnNsaWNlKCBpICkgOgoJCQl0aGlzLnNsaWNlKCBpLCBpICsgMSApOwoJfSwKCglmaXJzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIDAgKTsKCX0sCgoJbGFzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIC0xICk7Cgl9LAoKCXNsaWNlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGNvcmVfc2xpY2UuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApLAoJCQkic2xpY2UiLCBjb3JlX3NsaWNlLmNhbGwoYXJndW1lbnRzKS5qb2luKCIsIikgKTsKCX0sCgoJbWFwOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkubWFwKHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBpICkgewoJCQlyZXR1cm4gY2FsbGJhY2suY2FsbCggZWxlbSwgaSwgZWxlbSApOwoJCX0pKTsKCX0sCgoJZW5kOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wcmV2T2JqZWN0IHx8IHRoaXMuY29uc3RydWN0b3IobnVsbCk7Cgl9LAoKCS8vIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KCS8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLgoJcHVzaDogY29yZV9wdXNoLAoJc29ydDogW10uc29ydCwKCXNwbGljZTogW10uc3BsaWNlCn07CgovLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uCmpRdWVyeS5mbi5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjsKCmpRdWVyeS5leHRlbmQgPSBqUXVlcnkuZm4uZXh0ZW5kID0gZnVuY3Rpb24oKSB7Cgl2YXIgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5LCBjb3B5SXNBcnJheSwgY2xvbmUsCgkJdGFyZ2V0ID0gYXJndW1lbnRzWzBdIHx8IHt9LAoJCWkgPSAxLAoJCWxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsCgkJZGVlcCA9IGZhbHNlOwoKCS8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb24KCWlmICggdHlwZW9mIHRhcmdldCA9PT0gImJvb2xlYW4iICkgewoJCWRlZXAgPSB0YXJnZXQ7CgkJdGFyZ2V0ID0gYXJndW1lbnRzWzFdIHx8IHt9OwoJCS8vIHNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXQKCQlpID0gMjsKCX0KCgkvLyBIYW5kbGUgY2FzZSB3aGVuIHRhcmdldCBpcyBhIHN0cmluZyBvciBzb21ldGhpbmcgKHBvc3NpYmxlIGluIGRlZXAgY29weSkKCWlmICggdHlwZW9mIHRhcmdldCAhPT0gIm9iamVjdCIgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKHRhcmdldCkgKSB7CgkJdGFyZ2V0ID0ge307Cgl9CgoJLy8gZXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkCglpZiAoIGxlbmd0aCA9PT0gaSApIHsKCQl0YXJnZXQgPSB0aGlzOwoJCS0taTsKCX0KCglmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzCgkJaWYgKCAob3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdKSAhPSBudWxsICkgewoJCQkvLyBFeHRlbmQgdGhlIGJhc2Ugb2JqZWN0CgkJCWZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHsKCQkJCXNyYyA9IHRhcmdldFsgbmFtZSBdOwoJCQkJY29weSA9IG9wdGlvbnNbIG5hbWUgXTsKCgkJCQkvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wCgkJCQlpZiAoIHRhcmdldCA9PT0gY29weSApIHsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQkvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXMKCQkJCWlmICggZGVlcCAmJiBjb3B5ICYmICggalF1ZXJ5LmlzUGxhaW5PYmplY3QoY29weSkgfHwgKGNvcHlJc0FycmF5ID0galF1ZXJ5LmlzQXJyYXkoY29weSkpICkgKSB7CgkJCQkJaWYgKCBjb3B5SXNBcnJheSApIHsKCQkJCQkJY29weUlzQXJyYXkgPSBmYWxzZTsKCQkJCQkJY2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzQXJyYXkoc3JjKSA/IHNyYyA6IFtdOwoKCQkJCQl9IGVsc2UgewoJCQkJCQljbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdChzcmMpID8gc3JjIDoge307CgkJCQkJfQoKCQkJCQkvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW0KCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7CgoJCQkJLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlcwoJCQkJfSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXRhcmdldFsgbmFtZSBdID0gY29weTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdAoJcmV0dXJuIHRhcmdldDsKfTsKCmpRdWVyeS5leHRlbmQoewoJbm9Db25mbGljdDogZnVuY3Rpb24oIGRlZXAgKSB7CgkJaWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkgewoJCQl3aW5kb3cuJCA9IF8kOwoJCX0KCgkJaWYgKCBkZWVwICYmIHdpbmRvdy5qUXVlcnkgPT09IGpRdWVyeSApIHsKCQkJd2luZG93LmpRdWVyeSA9IF9qUXVlcnk7CgkJfQoKCQlyZXR1cm4galF1ZXJ5OwoJfSwKCgkvLyBJcyB0aGUgRE9NIHJlYWR5IHRvIGJlIHVzZWQ/IFNldCB0byB0cnVlIG9uY2UgaXQgb2NjdXJzLgoJaXNSZWFkeTogZmFsc2UsCgoJLy8gQSBjb3VudGVyIHRvIHRyYWNrIGhvdyBtYW55IGl0ZW1zIHRvIHdhaXQgZm9yIGJlZm9yZQoJLy8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgIzY3ODEKCXJlYWR5V2FpdDogMSwKCgkvLyBIb2xkIChvciByZWxlYXNlKSB0aGUgcmVhZHkgZXZlbnQKCWhvbGRSZWFkeTogZnVuY3Rpb24oIGhvbGQgKSB7CgkJaWYgKCBob2xkICkgewoJCQlqUXVlcnkucmVhZHlXYWl0Kys7CgkJfSBlbHNlIHsKCQkJalF1ZXJ5LnJlYWR5KCB0cnVlICk7CgkJfQoJfSwKCgkvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5CglyZWFkeTogZnVuY3Rpb24oIHdhaXQgKSB7CgoJCS8vIEFib3J0IGlmIHRoZXJlIGFyZSBwZW5kaW5nIGhvbGRzIG9yIHdlJ3JlIGFscmVhZHkgcmVhZHkKCQlpZiAoIHdhaXQgPT09IHRydWUgPyAtLWpRdWVyeS5yZWFkeVdhaXQgOiBqUXVlcnkuaXNSZWFkeSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gTWFrZSBzdXJlIGJvZHkgZXhpc3RzLCBhdCBsZWFzdCwgaW4gY2FzZSBJRSBnZXRzIGEgbGl0dGxlIG92ZXJ6ZWFsb3VzICh0aWNrZXQgIzU0NDMpLgoJCWlmICggIWRvY3VtZW50LmJvZHkgKSB7CgkJCXJldHVybiBzZXRUaW1lb3V0KCBqUXVlcnkucmVhZHksIDEgKTsKCQl9CgoJCS8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeQoJCWpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTsKCgkJLy8gSWYgYSBub3JtYWwgRE9NIFJlYWR5IGV2ZW50IGZpcmVkLCBkZWNyZW1lbnQsIGFuZCB3YWl0IGlmIG5lZWQgYmUKCQlpZiAoIHdhaXQgIT09IHRydWUgJiYgLS1qUXVlcnkucmVhZHlXYWl0ID4gMCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZQoJCXJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTsKCgkJLy8gVHJpZ2dlciBhbnkgYm91bmQgcmVhZHkgZXZlbnRzCgkJaWYgKCBqUXVlcnkuZm4udHJpZ2dlciApIHsKCQkJalF1ZXJ5KCBkb2N1bWVudCApLnRyaWdnZXIoInJlYWR5Iikub2ZmKCJyZWFkeSIpOwoJCX0KCX0sCgoJLy8gU2VlIHRlc3QvdW5pdC9jb3JlLmpzIGZvciBkZXRhaWxzIGNvbmNlcm5pbmcgaXNGdW5jdGlvbi4KCS8vIFNpbmNlIHZlcnNpb24gMS4zLCBET00gbWV0aG9kcyBhbmQgZnVuY3Rpb25zIGxpa2UgYWxlcnQKCS8vIGFyZW4ndCBzdXBwb3J0ZWQuIFRoZXkgcmV0dXJuIGZhbHNlIG9uIElFICgjMjk2OCkuCglpc0Z1bmN0aW9uOiBmdW5jdGlvbiggb2JqICkgewoJCXJldHVybiBqUXVlcnkudHlwZShvYmopID09PSAiZnVuY3Rpb24iOwoJfSwKCglpc0FycmF5OiBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uKCBvYmogKSB7CgkJcmV0dXJuIGpRdWVyeS50eXBlKG9iaikgPT09ICJhcnJheSI7Cgl9LAoKCWlzV2luZG93OiBmdW5jdGlvbiggb2JqICkgewoJCXJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT0gb2JqLndpbmRvdzsKCX0sCgoJaXNOdW1lcmljOiBmdW5jdGlvbiggb2JqICkgewoJCXJldHVybiAhaXNOYU4oIHBhcnNlRmxvYXQob2JqKSApICYmIGlzRmluaXRlKCBvYmogKTsKCX0sCgoJdHlwZTogZnVuY3Rpb24oIG9iaiApIHsKCQlyZXR1cm4gb2JqID09IG51bGwgPwoJCQlTdHJpbmcoIG9iaiApIDoKCQkJY2xhc3MydHlwZVsgY29yZV90b1N0cmluZy5jYWxsKG9iaikgXSB8fCAib2JqZWN0IjsKCX0sCgoJaXNQbGFpbk9iamVjdDogZnVuY3Rpb24oIG9iaiApIHsKCQkvLyBNdXN0IGJlIGFuIE9iamVjdC4KCQkvLyBCZWNhdXNlIG9mIElFLCB3ZSBhbHNvIGhhdmUgdG8gY2hlY2sgdGhlIHByZXNlbmNlIG9mIHRoZSBjb25zdHJ1Y3RvciBwcm9wZXJ0eS4KCQkvLyBNYWtlIHN1cmUgdGhhdCBET00gbm9kZXMgYW5kIHdpbmRvdyBvYmplY3RzIGRvbid0IHBhc3MgdGhyb3VnaCwgYXMgd2VsbAoJCWlmICggIW9iaiB8fCBqUXVlcnkudHlwZShvYmopICE9PSAib2JqZWN0IiB8fCBvYmoubm9kZVR5cGUgfHwgalF1ZXJ5LmlzV2luZG93KCBvYmogKSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJdHJ5IHsKCQkJLy8gTm90IG93biBjb25zdHJ1Y3RvciBwcm9wZXJ0eSBtdXN0IGJlIE9iamVjdAoJCQlpZiAoIG9iai5jb25zdHJ1Y3RvciAmJgoJCQkJIWNvcmVfaGFzT3duLmNhbGwob2JqLCAiY29uc3RydWN0b3IiKSAmJgoJCQkJIWNvcmVfaGFzT3duLmNhbGwob2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgImlzUHJvdG90eXBlT2YiKSApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0gY2F0Y2ggKCBlICkgewoJCQkvLyBJRTgsOSBXaWxsIHRocm93IGV4Y2VwdGlvbnMgb24gY2VydGFpbiBob3N0IG9iamVjdHMgIzk4OTcKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJLy8gT3duIHByb3BlcnRpZXMgYXJlIGVudW1lcmF0ZWQgZmlyc3RseSwgc28gdG8gc3BlZWQgdXAsCgkJLy8gaWYgbGFzdCBvbmUgaXMgb3duLCB0aGVuIGFsbCBwcm9wZXJ0aWVzIGFyZSBvd24uCgoJCXZhciBrZXk7CgkJZm9yICgga2V5IGluIG9iaiApIHt9CgoJCXJldHVybiBrZXkgPT09IHVuZGVmaW5lZCB8fCBjb3JlX2hhc093bi5jYWxsKCBvYmosIGtleSApOwoJfSwKCglpc0VtcHR5T2JqZWN0OiBmdW5jdGlvbiggb2JqICkgewoJCXZhciBuYW1lOwoJCWZvciAoIG5hbWUgaW4gb2JqICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXJldHVybiB0cnVlOwoJfSwKCgllcnJvcjogZnVuY3Rpb24oIG1zZyApIHsKCQl0aHJvdyBuZXcgRXJyb3IoIG1zZyApOwoJfSwKCgkvLyBkYXRhOiBzdHJpbmcgb2YgaHRtbAoJLy8gY29udGV4dCAob3B0aW9uYWwpOiBJZiBzcGVjaWZpZWQsIHRoZSBmcmFnbWVudCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhpcyBjb250ZXh0LCBkZWZhdWx0cyB0byBkb2N1bWVudAoJLy8gc2NyaXB0cyAob3B0aW9uYWwpOiBJZiB0cnVlLCB3aWxsIGluY2x1ZGUgc2NyaXB0cyBwYXNzZWQgaW4gdGhlIGh0bWwgc3RyaW5nCglwYXJzZUhUTUw6IGZ1bmN0aW9uKCBkYXRhLCBjb250ZXh0LCBzY3JpcHRzICkgewoJCXZhciBwYXJzZWQ7CgkJaWYgKCAhZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gInN0cmluZyIgKSB7CgkJCXJldHVybiBudWxsOwoJCX0KCQlpZiAoIHR5cGVvZiBjb250ZXh0ID09PSAiYm9vbGVhbiIgKSB7CgkJCXNjcmlwdHMgPSBjb250ZXh0OwoJCQljb250ZXh0ID0gMDsKCQl9CgkJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CgoJCS8vIFNpbmdsZSB0YWcKCQlpZiAoIChwYXJzZWQgPSByc2luZ2xlVGFnLmV4ZWMoIGRhdGEgKSkgKSB7CgkJCXJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWzFdICkgXTsKCQl9CgoJCXBhcnNlZCA9IGpRdWVyeS5idWlsZEZyYWdtZW50KCBbIGRhdGEgXSwgY29udGV4dCwgc2NyaXB0cyA/IG51bGwgOiBbXSApOwoJCXJldHVybiBqUXVlcnkubWVyZ2UoIFtdLAoJCQkocGFyc2VkLmNhY2hlYWJsZSA/IGpRdWVyeS5jbG9uZSggcGFyc2VkLmZyYWdtZW50ICkgOiBwYXJzZWQuZnJhZ21lbnQpLmNoaWxkTm9kZXMgKTsKCX0sCgoJcGFyc2VKU09OOiBmdW5jdGlvbiggZGF0YSApIHsKCQlpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSAic3RyaW5nIikgewoJCQlyZXR1cm4gbnVsbDsKCQl9CgoJCS8vIE1ha2Ugc3VyZSBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UgaXMgcmVtb3ZlZCAoSUUgY2FuJ3QgaGFuZGxlIGl0KQoJCWRhdGEgPSBqUXVlcnkudHJpbSggZGF0YSApOwoKCQkvLyBBdHRlbXB0IHRvIHBhcnNlIHVzaW5nIHRoZSBuYXRpdmUgSlNPTiBwYXJzZXIgZmlyc3QKCQlpZiAoIHdpbmRvdy5KU09OICYmIHdpbmRvdy5KU09OLnBhcnNlICkgewoJCQlyZXR1cm4gd2luZG93LkpTT04ucGFyc2UoIGRhdGEgKTsKCQl9CgoJCS8vIE1ha2Ugc3VyZSB0aGUgaW5jb21pbmcgZGF0YSBpcyBhY3R1YWwgSlNPTgoJCS8vIExvZ2ljIGJvcnJvd2VkIGZyb20gaHR0cDovL2pzb24ub3JnL2pzb24yLmpzCgkJaWYgKCBydmFsaWRjaGFycy50ZXN0KCBkYXRhLnJlcGxhY2UoIHJ2YWxpZGVzY2FwZSwgIkAiICkKCQkJLnJlcGxhY2UoIHJ2YWxpZHRva2VucywgIl0iICkKCQkJLnJlcGxhY2UoIHJ2YWxpZGJyYWNlcywgIiIpKSApIHsKCgkJCXJldHVybiAoIG5ldyBGdW5jdGlvbiggInJldHVybiAiICsgZGF0YSApICkoKTsKCgkJfQoJCWpRdWVyeS5lcnJvciggIkludmFsaWQgSlNPTjogIiArIGRhdGEgKTsKCX0sCgoJLy8gQ3Jvc3MtYnJvd3NlciB4bWwgcGFyc2luZwoJcGFyc2VYTUw6IGZ1bmN0aW9uKCBkYXRhICkgewoJCXZhciB4bWwsIHRtcDsKCQlpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSAic3RyaW5nIiApIHsKCQkJcmV0dXJuIG51bGw7CgkJfQoJCXRyeSB7CgkJCWlmICggd2luZG93LkRPTVBhcnNlciApIHsgLy8gU3RhbmRhcmQKCQkJCXRtcCA9IG5ldyBET01QYXJzZXIoKTsKCQkJCXhtbCA9IHRtcC5wYXJzZUZyb21TdHJpbmcoIGRhdGEgLCAidGV4dC94bWwiICk7CgkJCX0gZWxzZSB7IC8vIElFCgkJCQl4bWwgPSBuZXcgQWN0aXZlWE9iamVjdCggIk1pY3Jvc29mdC5YTUxET00iICk7CgkJCQl4bWwuYXN5bmMgPSAiZmFsc2UiOwoJCQkJeG1sLmxvYWRYTUwoIGRhdGEgKTsKCQkJfQoJCX0gY2F0Y2goIGUgKSB7CgkJCXhtbCA9IHVuZGVmaW5lZDsKCQl9CgkJaWYgKCAheG1sIHx8ICF4bWwuZG9jdW1lbnRFbGVtZW50IHx8IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSggInBhcnNlcmVycm9yIiApLmxlbmd0aCApIHsKCQkJalF1ZXJ5LmVycm9yKCAiSW52YWxpZCBYTUw6ICIgKyBkYXRhICk7CgkJfQoJCXJldHVybiB4bWw7Cgl9LAoKCW5vb3A6IGZ1bmN0aW9uKCkge30sCgoJLy8gRXZhbHVhdGVzIGEgc2NyaXB0IGluIGEgZ2xvYmFsIGNvbnRleHQKCS8vIFdvcmthcm91bmRzIGJhc2VkIG9uIGZpbmRpbmdzIGJ5IEppbSBEcmlzY29sbAoJLy8gaHR0cDovL3dlYmxvZ3MuamF2YS5uZXQvYmxvZy9kcmlzY29sbC9hcmNoaXZlLzIwMDkvMDkvMDgvZXZhbC1qYXZhc2NyaXB0LWdsb2JhbC1jb250ZXh0CglnbG9iYWxFdmFsOiBmdW5jdGlvbiggZGF0YSApIHsKCQlpZiAoIGRhdGEgJiYgY29yZV9ybm90d2hpdGUudGVzdCggZGF0YSApICkgewoJCQkvLyBXZSB1c2UgZXhlY1NjcmlwdCBvbiBJbnRlcm5ldCBFeHBsb3JlcgoJCQkvLyBXZSB1c2UgYW4gYW5vbnltb3VzIGZ1bmN0aW9uIHNvIHRoYXQgY29udGV4dCBpcyB3aW5kb3cKCQkJLy8gcmF0aGVyIHRoYW4galF1ZXJ5IGluIEZpcmVmb3gKCQkJKCB3aW5kb3cuZXhlY1NjcmlwdCB8fCBmdW5jdGlvbiggZGF0YSApIHsKCQkJCXdpbmRvd1sgImV2YWwiIF0uY2FsbCggd2luZG93LCBkYXRhICk7CgkJCX0gKSggZGF0YSApOwoJCX0KCX0sCgoJLy8gQ29udmVydCBkYXNoZWQgdG8gY2FtZWxDYXNlOyB1c2VkIGJ5IHRoZSBjc3MgYW5kIGRhdGEgbW9kdWxlcwoJLy8gTWljcm9zb2Z0IGZvcmdvdCB0byBodW1wIHRoZWlyIHZlbmRvciBwcmVmaXggKCM5NTcyKQoJY2FtZWxDYXNlOiBmdW5jdGlvbiggc3RyaW5nICkgewoJCXJldHVybiBzdHJpbmcucmVwbGFjZSggcm1zUHJlZml4LCAibXMtIiApLnJlcGxhY2UoIHJkYXNoQWxwaGEsIGZjYW1lbENhc2UgKTsKCX0sCgoJbm9kZU5hbWU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCXJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpOwoJfSwKCgkvLyBhcmdzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CgllYWNoOiBmdW5jdGlvbiggb2JqLCBjYWxsYmFjaywgYXJncyApIHsKCQl2YXIgbmFtZSwKCQkJaSA9IDAsCgkJCWxlbmd0aCA9IG9iai5sZW5ndGgsCgkJCWlzT2JqID0gbGVuZ3RoID09PSB1bmRlZmluZWQgfHwgalF1ZXJ5LmlzRnVuY3Rpb24oIG9iaiApOwoKCQlpZiAoIGFyZ3MgKSB7CgkJCWlmICggaXNPYmogKSB7CgkJCQlmb3IgKCBuYW1lIGluIG9iaiApIHsKCQkJCQlpZiAoIGNhbGxiYWNrLmFwcGx5KCBvYmpbIG5hbWUgXSwgYXJncyApID09PSBmYWxzZSApIHsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQl9IGVsc2UgewoJCQkJZm9yICggOyBpIDwgbGVuZ3RoOyApIHsKCQkJCQlpZiAoIGNhbGxiYWNrLmFwcGx5KCBvYmpbIGkrKyBdLCBhcmdzICkgPT09IGZhbHNlICkgewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJLy8gQSBzcGVjaWFsLCBmYXN0LCBjYXNlIGZvciB0aGUgbW9zdCBjb21tb24gdXNlIG9mIGVhY2gKCQl9IGVsc2UgewoJCQlpZiAoIGlzT2JqICkgewoJCQkJZm9yICggbmFtZSBpbiBvYmogKSB7CgkJCQkJaWYgKCBjYWxsYmFjay5jYWxsKCBvYmpbIG5hbWUgXSwgbmFtZSwgb2JqWyBuYW1lIF0gKSA9PT0gZmFsc2UgKSB7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCWZvciAoIDsgaSA8IGxlbmd0aDsgKSB7CgkJCQkJaWYgKCBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpKysgXSApID09PSBmYWxzZSApIHsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gb2JqOwoJfSwKCgkvLyBVc2UgbmF0aXZlIFN0cmluZy50cmltIGZ1bmN0aW9uIHdoZXJldmVyIHBvc3NpYmxlCgl0cmltOiBjb3JlX3RyaW0gJiYgIWNvcmVfdHJpbS5jYWxsKCJcdUZFRkZceEEwIikgPwoJCWZ1bmN0aW9uKCB0ZXh0ICkgewoJCQlyZXR1cm4gdGV4dCA9PSBudWxsID8KCQkJCSIiIDoKCQkJCWNvcmVfdHJpbS5jYWxsKCB0ZXh0ICk7CgkJfSA6CgoJCS8vIE90aGVyd2lzZSB1c2Ugb3VyIG93biB0cmltbWluZyBmdW5jdGlvbmFsaXR5CgkJZnVuY3Rpb24oIHRleHQgKSB7CgkJCXJldHVybiB0ZXh0ID09IG51bGwgPwoJCQkJIiIgOgoJCQkJKCB0ZXh0ICsgIiIgKS5yZXBsYWNlKCBydHJpbSwgIiIgKTsKCQl9LAoKCS8vIHJlc3VsdHMgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHkKCW1ha2VBcnJheTogZnVuY3Rpb24oIGFyciwgcmVzdWx0cyApIHsKCQl2YXIgdHlwZSwKCQkJcmV0ID0gcmVzdWx0cyB8fCBbXTsKCgkJaWYgKCBhcnIgIT0gbnVsbCApIHsKCQkJLy8gVGhlIHdpbmRvdywgc3RyaW5ncyAoYW5kIGZ1bmN0aW9ucykgYWxzbyBoYXZlICdsZW5ndGgnCgkJCS8vIFR3ZWFrZWQgbG9naWMgc2xpZ2h0bHkgdG8gaGFuZGxlIEJsYWNrYmVycnkgNC43IFJlZ0V4cCBpc3N1ZXMgIzY5MzAKCQkJdHlwZSA9IGpRdWVyeS50eXBlKCBhcnIgKTsKCgkJCWlmICggYXJyLmxlbmd0aCA9PSBudWxsIHx8IHR5cGUgPT09ICJzdHJpbmciIHx8IHR5cGUgPT09ICJmdW5jdGlvbiIgfHwgdHlwZSA9PT0gInJlZ2V4cCIgfHwgalF1ZXJ5LmlzV2luZG93KCBhcnIgKSApIHsKCQkJCWNvcmVfcHVzaC5jYWxsKCByZXQsIGFyciApOwoJCQl9IGVsc2UgewoJCQkJalF1ZXJ5Lm1lcmdlKCByZXQsIGFyciApOwoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0OwoJfSwKCglpbkFycmF5OiBmdW5jdGlvbiggZWxlbSwgYXJyLCBpICkgewoJCXZhciBsZW47CgoJCWlmICggYXJyICkgewoJCQlpZiAoIGNvcmVfaW5kZXhPZiApIHsKCQkJCXJldHVybiBjb3JlX2luZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7CgkJCX0KCgkJCWxlbiA9IGFyci5sZW5ndGg7CgkJCWkgPSBpID8gaSA8IDAgPyBNYXRoLm1heCggMCwgbGVuICsgaSApIDogaSA6IDA7CgoJCQlmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKCQkJCS8vIFNraXAgYWNjZXNzaW5nIGluIHNwYXJzZSBhcnJheXMKCQkJCWlmICggaSBpbiBhcnIgJiYgYXJyWyBpIF0gPT09IGVsZW0gKSB7CgkJCQkJcmV0dXJuIGk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiAtMTsKCX0sCgoJbWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkgewoJCXZhciBsID0gc2Vjb25kLmxlbmd0aCwKCQkJaSA9IGZpcnN0Lmxlbmd0aCwKCQkJaiA9IDA7CgoJCWlmICggdHlwZW9mIGwgPT09ICJudW1iZXIiICkgewoJCQlmb3IgKCA7IGogPCBsOyBqKysgKSB7CgkJCQlmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTsKCQkJfQoKCQl9IGVsc2UgewoJCQl3aGlsZSAoIHNlY29uZFtqXSAhPT0gdW5kZWZpbmVkICkgewoJCQkJZmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqKysgXTsKCQkJfQoJCX0KCgkJZmlyc3QubGVuZ3RoID0gaTsKCgkJcmV0dXJuIGZpcnN0OwoJfSwKCglncmVwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBpbnYgKSB7CgkJdmFyIHJldFZhbCwKCQkJcmV0ID0gW10sCgkJCWkgPSAwLAoJCQlsZW5ndGggPSBlbGVtcy5sZW5ndGg7CgkJaW52ID0gISFpbnY7CgoJCS8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmluZyB0aGUgaXRlbXMKCQkvLyB0aGF0IHBhc3MgdGhlIHZhbGlkYXRvciBmdW5jdGlvbgoJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgewoJCQlyZXRWYWwgPSAhIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7CgkJCWlmICggaW52ICE9PSByZXRWYWwgKSB7CgkJCQlyZXQucHVzaCggZWxlbXNbIGkgXSApOwoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0OwoJfSwKCgkvLyBhcmcgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHkKCW1hcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgYXJnICkgewoJCXZhciB2YWx1ZSwga2V5LAoJCQlyZXQgPSBbXSwKCQkJaSA9IDAsCgkJCWxlbmd0aCA9IGVsZW1zLmxlbmd0aCwKCQkJLy8ganF1ZXJ5IG9iamVjdHMgYXJlIHRyZWF0ZWQgYXMgYXJyYXlzCgkJCWlzQXJyYXkgPSBlbGVtcyBpbnN0YW5jZW9mIGpRdWVyeSB8fCBsZW5ndGggIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgbGVuZ3RoID09PSAibnVtYmVyIiAmJiAoICggbGVuZ3RoID4gMCAmJiBlbGVtc1sgMCBdICYmIGVsZW1zWyBsZW5ndGggLTEgXSApIHx8IGxlbmd0aCA9PT0gMCB8fCBqUXVlcnkuaXNBcnJheSggZWxlbXMgKSApIDsKCgkJLy8gR28gdGhyb3VnaCB0aGUgYXJyYXksIHRyYW5zbGF0aW5nIGVhY2ggb2YgdGhlIGl0ZW1zIHRvIHRoZWlyCgkJaWYgKCBpc0FycmF5ICkgewoJCQlmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkJCXZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGksIGFyZyApOwoKCQkJCWlmICggdmFsdWUgIT0gbnVsbCApIHsKCQkJCQlyZXRbIHJldC5sZW5ndGggXSA9IHZhbHVlOwoJCQkJfQoJCQl9CgoJCS8vIEdvIHRocm91Z2ggZXZlcnkga2V5IG9uIHRoZSBvYmplY3QsCgkJfSBlbHNlIHsKCQkJZm9yICgga2V5IGluIGVsZW1zICkgewoJCQkJdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGtleSBdLCBrZXksIGFyZyApOwoKCQkJCWlmICggdmFsdWUgIT0gbnVsbCApIHsKCQkJCQlyZXRbIHJldC5sZW5ndGggXSA9IHZhbHVlOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzCgkJcmV0dXJuIHJldC5jb25jYXQuYXBwbHkoIFtdLCByZXQgKTsKCX0sCgoJLy8gQSBnbG9iYWwgR1VJRCBjb3VudGVyIGZvciBvYmplY3RzCglndWlkOiAxLAoKCS8vIEJpbmQgYSBmdW5jdGlvbiB0byBhIGNvbnRleHQsIG9wdGlvbmFsbHkgcGFydGlhbGx5IGFwcGx5aW5nIGFueQoJLy8gYXJndW1lbnRzLgoJcHJveHk6IGZ1bmN0aW9uKCBmbiwgY29udGV4dCApIHsKCQl2YXIgdG1wLCBhcmdzLCBwcm94eTsKCgkJaWYgKCB0eXBlb2YgY29udGV4dCA9PT0gInN0cmluZyIgKSB7CgkJCXRtcCA9IGZuWyBjb250ZXh0IF07CgkJCWNvbnRleHQgPSBmbjsKCQkJZm4gPSB0bXA7CgkJfQoKCQkvLyBRdWljayBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGFyZ2V0IGlzIGNhbGxhYmxlLCBpbiB0aGUgc3BlYwoJCS8vIHRoaXMgdGhyb3dzIGEgVHlwZUVycm9yLCBidXQgd2Ugd2lsbCBqdXN0IHJldHVybiB1bmRlZmluZWQuCgkJaWYgKCAhalF1ZXJ5LmlzRnVuY3Rpb24oIGZuICkgKSB7CgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoKCQkvLyBTaW11bGF0ZWQgYmluZAoJCWFyZ3MgPSBjb3JlX3NsaWNlLmNhbGwoIGFyZ3VtZW50cywgMiApOwoJCXByb3h5ID0gZnVuY3Rpb24oKSB7CgkJCXJldHVybiBmbi5hcHBseSggY29udGV4dCwgYXJncy5jb25jYXQoIGNvcmVfc2xpY2UuY2FsbCggYXJndW1lbnRzICkgKSApOwoJCX07CgoJCS8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZAoJCXByb3h5Lmd1aWQgPSBmbi5ndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrOwoKCQlyZXR1cm4gcHJveHk7Cgl9LAoKCS8vIE11bHRpZnVuY3Rpb25hbCBtZXRob2QgdG8gZ2V0IGFuZCBzZXQgdmFsdWVzIG9mIGEgY29sbGVjdGlvbgoJLy8gVGhlIHZhbHVlL3MgY2FuIG9wdGlvbmFsbHkgYmUgZXhlY3V0ZWQgaWYgaXQncyBhIGZ1bmN0aW9uCglhY2Nlc3M6IGZ1bmN0aW9uKCBlbGVtcywgZm4sIGtleSwgdmFsdWUsIGNoYWluYWJsZSwgZW1wdHlHZXQsIHBhc3MgKSB7CgkJdmFyIGV4ZWMsCgkJCWJ1bGsgPSBrZXkgPT0gbnVsbCwKCQkJaSA9IDAsCgkJCWxlbmd0aCA9IGVsZW1zLmxlbmd0aDsKCgkJLy8gU2V0cyBtYW55IHZhbHVlcwoJCWlmICgga2V5ICYmIHR5cGVvZiBrZXkgPT09ICJvYmplY3QiICkgewoJCQlmb3IgKCBpIGluIGtleSApIHsKCQkJCWpRdWVyeS5hY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5W2ldLCAxLCBlbXB0eUdldCwgdmFsdWUgKTsKCQkJfQoJCQljaGFpbmFibGUgPSAxOwoKCQkvLyBTZXRzIG9uZSB2YWx1ZQoJCX0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCS8vIE9wdGlvbmFsbHksIGZ1bmN0aW9uIHZhbHVlcyBnZXQgZXhlY3V0ZWQgaWYgZXhlYyBpcyB0cnVlCgkJCWV4ZWMgPSBwYXNzID09PSB1bmRlZmluZWQgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICk7CgoJCQlpZiAoIGJ1bGsgKSB7CgkJCQkvLyBCdWxrIG9wZXJhdGlvbnMgb25seSBpdGVyYXRlIHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlcwoJCQkJaWYgKCBleGVjICkgewoJCQkJCWV4ZWMgPSBmbjsKCQkJCQlmbiA9IGZ1bmN0aW9uKCBlbGVtLCBrZXksIHZhbHVlICkgewoJCQkJCQlyZXR1cm4gZXhlYy5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdmFsdWUgKTsKCQkJCQl9OwoKCQkJCS8vIE90aGVyd2lzZSB0aGV5IHJ1biBhZ2FpbnN0IHRoZSBlbnRpcmUgc2V0CgkJCQl9IGVsc2UgewoJCQkJCWZuLmNhbGwoIGVsZW1zLCB2YWx1ZSApOwoJCQkJCWZuID0gbnVsbDsKCQkJCX0KCQkJfQoKCQkJaWYgKCBmbiApIHsKCQkJCWZvciAoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQkJZm4oIGVsZW1zW2ldLCBrZXksIGV4ZWMgPyB2YWx1ZS5jYWxsKCBlbGVtc1tpXSwgaSwgZm4oIGVsZW1zW2ldLCBrZXkgKSApIDogdmFsdWUsIHBhc3MgKTsKCQkJCX0KCQkJfQoKCQkJY2hhaW5hYmxlID0gMTsKCQl9CgoJCXJldHVybiBjaGFpbmFibGUgPwoJCQllbGVtcyA6CgoJCQkvLyBHZXRzCgkJCWJ1bGsgPwoJCQkJZm4uY2FsbCggZWxlbXMgKSA6CgkJCQlsZW5ndGggPyBmbiggZWxlbXNbMF0sIGtleSApIDogZW1wdHlHZXQ7Cgl9LAoKCW5vdzogZnVuY3Rpb24oKSB7CgkJcmV0dXJuICggbmV3IERhdGUoKSApLmdldFRpbWUoKTsKCX0KfSk7CgpqUXVlcnkucmVhZHkucHJvbWlzZSA9IGZ1bmN0aW9uKCBvYmogKSB7CglpZiAoICFyZWFkeUxpc3QgKSB7CgoJCXJlYWR5TGlzdCA9IGpRdWVyeS5EZWZlcnJlZCgpOwoKCQkvLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZCBhZnRlciB0aGUgYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC4KCQkvLyB3ZSBvbmNlIHRyaWVkIHRvIHVzZSByZWFkeVN0YXRlICJpbnRlcmFjdGl2ZSIgaGVyZSwgYnV0IGl0IGNhdXNlZCBpc3N1ZXMgbGlrZSB0aGUgb25lCgkJLy8gZGlzY292ZXJlZCBieSBDaHJpc1MgaGVyZTogaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIyODIjY29tbWVudDoxNQoJCWlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIiApIHsKCQkJLy8gSGFuZGxlIGl0IGFzeW5jaHJvbm91c2x5IHRvIGFsbG93IHNjcmlwdHMgdGhlIG9wcG9ydHVuaXR5IHRvIGRlbGF5IHJlYWR5CgkJCXNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSwgMSApOwoKCQkvLyBTdGFuZGFyZHMtYmFzZWQgYnJvd3NlcnMgc3VwcG9ydCBET01Db250ZW50TG9hZGVkCgkJfSBlbHNlIGlmICggZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciApIHsKCQkJLy8gVXNlIHRoZSBoYW5keSBldmVudCBjYWxsYmFjawoJCQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIERPTUNvbnRlbnRMb2FkZWQsIGZhbHNlICk7CgoJCQkvLyBBIGZhbGxiYWNrIHRvIHdpbmRvdy5vbmxvYWQsIHRoYXQgd2lsbCBhbHdheXMgd29yawoJCQl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggImxvYWQiLCBqUXVlcnkucmVhZHksIGZhbHNlICk7CgoJCS8vIElmIElFIGV2ZW50IG1vZGVsIGlzIHVzZWQKCQl9IGVsc2UgewoJCQkvLyBFbnN1cmUgZmlyaW5nIGJlZm9yZSBvbmxvYWQsIG1heWJlIGxhdGUgYnV0IHNhZmUgYWxzbyBmb3IgaWZyYW1lcwoJCQlkb2N1bWVudC5hdHRhY2hFdmVudCggIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIERPTUNvbnRlbnRMb2FkZWQgKTsKCgkJCS8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrCgkJCXdpbmRvdy5hdHRhY2hFdmVudCggIm9ubG9hZCIsIGpRdWVyeS5yZWFkeSApOwoKCQkJLy8gSWYgSUUgYW5kIG5vdCBhIGZyYW1lCgkJCS8vIGNvbnRpbnVhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGUgZG9jdW1lbnQgaXMgcmVhZHkKCQkJdmFyIHRvcCA9IGZhbHNlOwoKCQkJdHJ5IHsKCQkJCXRvcCA9IHdpbmRvdy5mcmFtZUVsZW1lbnQgPT0gbnVsbCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CgkJCX0gY2F0Y2goZSkge30KCgkJCWlmICggdG9wICYmIHRvcC5kb1Njcm9sbCApIHsKCQkJCShmdW5jdGlvbiBkb1Njcm9sbENoZWNrKCkgewoJCQkJCWlmICggIWpRdWVyeS5pc1JlYWR5ICkgewoKCQkJCQkJdHJ5IHsKCQkJCQkJCS8vIFVzZSB0aGUgdHJpY2sgYnkgRGllZ28gUGVyaW5pCgkJCQkJCQkvLyBodHRwOi8vamF2YXNjcmlwdC5ud2JveC5jb20vSUVDb250ZW50TG9hZGVkLwoJCQkJCQkJdG9wLmRvU2Nyb2xsKCJsZWZ0Iik7CgkJCQkJCX0gY2F0Y2goZSkgewoJCQkJCQkJcmV0dXJuIHNldFRpbWVvdXQoIGRvU2Nyb2xsQ2hlY2ssIDUwICk7CgkJCQkJCX0KCgkJCQkJCS8vIGFuZCBleGVjdXRlIGFueSB3YWl0aW5nIGZ1bmN0aW9ucwoJCQkJCQlqUXVlcnkucmVhZHkoKTsKCQkJCQl9CgkJCQl9KSgpOwoJCQl9CgkJfQoJfQoJcmV0dXJuIHJlYWR5TGlzdC5wcm9taXNlKCBvYmogKTsKfTsKCi8vIFBvcHVsYXRlIHRoZSBjbGFzczJ0eXBlIG1hcApqUXVlcnkuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCIuc3BsaXQoIiAiKSwgZnVuY3Rpb24oaSwgbmFtZSkgewoJY2xhc3MydHlwZVsgIltvYmplY3QgIiArIG5hbWUgKyAiXSIgXSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKfSk7CgovLyBBbGwgalF1ZXJ5IG9iamVjdHMgc2hvdWxkIHBvaW50IGJhY2sgdG8gdGhlc2UKcm9vdGpRdWVyeSA9IGpRdWVyeShkb2N1bWVudCk7Ci8vIFN0cmluZyB0byBPYmplY3Qgb3B0aW9ucyBmb3JtYXQgY2FjaGUKdmFyIG9wdGlvbnNDYWNoZSA9IHt9OwoKLy8gQ29udmVydCBTdHJpbmctZm9ybWF0dGVkIG9wdGlvbnMgaW50byBPYmplY3QtZm9ybWF0dGVkIG9uZXMgYW5kIHN0b3JlIGluIGNhY2hlCmZ1bmN0aW9uIGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSB7Cgl2YXIgb2JqZWN0ID0gb3B0aW9uc0NhY2hlWyBvcHRpb25zIF0gPSB7fTsKCWpRdWVyeS5lYWNoKCBvcHRpb25zLnNwbGl0KCBjb3JlX3JzcGFjZSApLCBmdW5jdGlvbiggXywgZmxhZyApIHsKCQlvYmplY3RbIGZsYWcgXSA9IHRydWU7Cgl9KTsKCXJldHVybiBvYmplY3Q7Cn0KCi8qCiAqIENyZWF0ZSBhIGNhbGxiYWNrIGxpc3QgdXNpbmcgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgogKgogKglvcHRpb25zOiBhbiBvcHRpb25hbCBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBvcHRpb25zIHRoYXQgd2lsbCBjaGFuZ2UgaG93CiAqCQkJdGhlIGNhbGxiYWNrIGxpc3QgYmVoYXZlcyBvciBhIG1vcmUgdHJhZGl0aW9uYWwgb3B0aW9uIG9iamVjdAogKgogKiBCeSBkZWZhdWx0IGEgY2FsbGJhY2sgbGlzdCB3aWxsIGFjdCBsaWtlIGFuIGV2ZW50IGNhbGxiYWNrIGxpc3QgYW5kIGNhbiBiZQogKiAiZmlyZWQiIG11bHRpcGxlIHRpbWVzLgogKgogKiBQb3NzaWJsZSBvcHRpb25zOgogKgogKglvbmNlOgkJCXdpbGwgZW5zdXJlIHRoZSBjYWxsYmFjayBsaXN0IGNhbiBvbmx5IGJlIGZpcmVkIG9uY2UgKGxpa2UgYSBEZWZlcnJlZCkKICoKICoJbWVtb3J5OgkJCXdpbGwga2VlcCB0cmFjayBvZiBwcmV2aW91cyB2YWx1ZXMgYW5kIHdpbGwgY2FsbCBhbnkgY2FsbGJhY2sgYWRkZWQKICoJCQkJCWFmdGVyIHRoZSBsaXN0IGhhcyBiZWVuIGZpcmVkIHJpZ2h0IGF3YXkgd2l0aCB0aGUgbGF0ZXN0ICJtZW1vcml6ZWQiCiAqCQkJCQl2YWx1ZXMgKGxpa2UgYSBEZWZlcnJlZCkKICoKICoJdW5pcXVlOgkJCXdpbGwgZW5zdXJlIGEgY2FsbGJhY2sgY2FuIG9ubHkgYmUgYWRkZWQgb25jZSAobm8gZHVwbGljYXRlIGluIHRoZSBsaXN0KQogKgogKglzdG9wT25GYWxzZToJaW50ZXJydXB0IGNhbGxpbmdzIHdoZW4gYSBjYWxsYmFjayByZXR1cm5zIGZhbHNlCiAqCiAqLwpqUXVlcnkuQ2FsbGJhY2tzID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7CgoJLy8gQ29udmVydCBvcHRpb25zIGZyb20gU3RyaW5nLWZvcm1hdHRlZCB0byBPYmplY3QtZm9ybWF0dGVkIGlmIG5lZWRlZAoJLy8gKHdlIGNoZWNrIGluIGNhY2hlIGZpcnN0KQoJb3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiA/CgkJKCBvcHRpb25zQ2FjaGVbIG9wdGlvbnMgXSB8fCBjcmVhdGVPcHRpb25zKCBvcHRpb25zICkgKSA6CgkJalF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTsKCgl2YXIgLy8gTGFzdCBmaXJlIHZhbHVlIChmb3Igbm9uLWZvcmdldHRhYmxlIGxpc3RzKQoJCW1lbW9yeSwKCQkvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCB3YXMgYWxyZWFkeSBmaXJlZAoJCWZpcmVkLAoJCS8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IGlzIGN1cnJlbnRseSBmaXJpbmcKCQlmaXJpbmcsCgkJLy8gRmlyc3QgY2FsbGJhY2sgdG8gZmlyZSAodXNlZCBpbnRlcm5hbGx5IGJ5IGFkZCBhbmQgZmlyZVdpdGgpCgkJZmlyaW5nU3RhcnQsCgkJLy8gRW5kIG9mIHRoZSBsb29wIHdoZW4gZmlyaW5nCgkJZmlyaW5nTGVuZ3RoLAoJCS8vIEluZGV4IG9mIGN1cnJlbnRseSBmaXJpbmcgY2FsbGJhY2sgKG1vZGlmaWVkIGJ5IHJlbW92ZSBpZiBuZWVkZWQpCgkJZmlyaW5nSW5kZXgsCgkJLy8gQWN0dWFsIGNhbGxiYWNrIGxpc3QKCQlsaXN0ID0gW10sCgkJLy8gU3RhY2sgb2YgZmlyZSBjYWxscyBmb3IgcmVwZWF0YWJsZSBsaXN0cwoJCXN0YWNrID0gIW9wdGlvbnMub25jZSAmJiBbXSwKCQkvLyBGaXJlIGNhbGxiYWNrcwoJCWZpcmUgPSBmdW5jdGlvbiggZGF0YSApIHsKCQkJbWVtb3J5ID0gb3B0aW9ucy5tZW1vcnkgJiYgZGF0YTsKCQkJZmlyZWQgPSB0cnVlOwoJCQlmaXJpbmdJbmRleCA9IGZpcmluZ1N0YXJ0IHx8IDA7CgkJCWZpcmluZ1N0YXJ0ID0gMDsKCQkJZmlyaW5nTGVuZ3RoID0gbGlzdC5sZW5ndGg7CgkJCWZpcmluZyA9IHRydWU7CgkJCWZvciAoIDsgbGlzdCAmJiBmaXJpbmdJbmRleCA8IGZpcmluZ0xlbmd0aDsgZmlyaW5nSW5kZXgrKyApIHsKCQkJCWlmICggbGlzdFsgZmlyaW5nSW5kZXggXS5hcHBseSggZGF0YVsgMCBdLCBkYXRhWyAxIF0gKSA9PT0gZmFsc2UgJiYgb3B0aW9ucy5zdG9wT25GYWxzZSApIHsKCQkJCQltZW1vcnkgPSBmYWxzZTsgLy8gVG8gcHJldmVudCBmdXJ0aGVyIGNhbGxzIHVzaW5nIGFkZAoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJCWZpcmluZyA9IGZhbHNlOwoJCQlpZiAoIGxpc3QgKSB7CgkJCQlpZiAoIHN0YWNrICkgewoJCQkJCWlmICggc3RhY2subGVuZ3RoICkgewoJCQkJCQlmaXJlKCBzdGFjay5zaGlmdCgpICk7CgkJCQkJfQoJCQkJfSBlbHNlIGlmICggbWVtb3J5ICkgewoJCQkJCWxpc3QgPSBbXTsKCQkJCX0gZWxzZSB7CgkJCQkJc2VsZi5kaXNhYmxlKCk7CgkJCQl9CgkJCX0KCQl9LAoJCS8vIEFjdHVhbCBDYWxsYmFja3Mgb2JqZWN0CgkJc2VsZiA9IHsKCQkJLy8gQWRkIGEgY2FsbGJhY2sgb3IgYSBjb2xsZWN0aW9uIG9mIGNhbGxiYWNrcyB0byB0aGUgbGlzdAoJCQlhZGQ6IGZ1bmN0aW9uKCkgewoJCQkJaWYgKCBsaXN0ICkgewoJCQkJCS8vIEZpcnN0LCB3ZSBzYXZlIHRoZSBjdXJyZW50IGxlbmd0aAoJCQkJCXZhciBzdGFydCA9IGxpc3QubGVuZ3RoOwoJCQkJCShmdW5jdGlvbiBhZGQoIGFyZ3MgKSB7CgkJCQkJCWpRdWVyeS5lYWNoKCBhcmdzLCBmdW5jdGlvbiggXywgYXJnICkgewoJCQkJCQkJdmFyIHR5cGUgPSBqUXVlcnkudHlwZSggYXJnICk7CgkJCQkJCQlpZiAoIHR5cGUgPT09ICJmdW5jdGlvbiIgJiYgKCAhb3B0aW9ucy51bmlxdWUgfHwgIXNlbGYuaGFzKCBhcmcgKSApICkgewoJCQkJCQkJCWxpc3QucHVzaCggYXJnICk7CgkJCQkJCQl9IGVsc2UgaWYgKCBhcmcgJiYgYXJnLmxlbmd0aCAmJiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJCQkJCQkvLyBJbnNwZWN0IHJlY3Vyc2l2ZWx5CgkJCQkJCQkJYWRkKCBhcmcgKTsKCQkJCQkJCX0KCQkJCQkJfSk7CgkJCQkJfSkoIGFyZ3VtZW50cyApOwoJCQkJCS8vIERvIHdlIG5lZWQgdG8gYWRkIHRoZSBjYWxsYmFja3MgdG8gdGhlCgkJCQkJLy8gY3VycmVudCBmaXJpbmcgYmF0Y2g/CgkJCQkJaWYgKCBmaXJpbmcgKSB7CgkJCQkJCWZpcmluZ0xlbmd0aCA9IGxpc3QubGVuZ3RoOwoJCQkJCS8vIFdpdGggbWVtb3J5LCBpZiB3ZSdyZSBub3QgZmlyaW5nIHRoZW4KCQkJCQkvLyB3ZSBzaG91bGQgY2FsbCByaWdodCBhd2F5CgkJCQkJfSBlbHNlIGlmICggbWVtb3J5ICkgewoJCQkJCQlmaXJpbmdTdGFydCA9IHN0YXJ0OwoJCQkJCQlmaXJlKCBtZW1vcnkgKTsKCQkJCQl9CgkJCQl9CgkJCQlyZXR1cm4gdGhpczsKCQkJfSwKCQkJLy8gUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgbGlzdAoJCQlyZW1vdmU6IGZ1bmN0aW9uKCkgewoJCQkJaWYgKCBsaXN0ICkgewoJCQkJCWpRdWVyeS5lYWNoKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7CgkJCQkJCXZhciBpbmRleDsKCQkJCQkJd2hpbGUoICggaW5kZXggPSBqUXVlcnkuaW5BcnJheSggYXJnLCBsaXN0LCBpbmRleCApICkgPiAtMSApIHsKCQkJCQkJCWxpc3Quc3BsaWNlKCBpbmRleCwgMSApOwoJCQkJCQkJLy8gSGFuZGxlIGZpcmluZyBpbmRleGVzCgkJCQkJCQlpZiAoIGZpcmluZyApIHsKCQkJCQkJCQlpZiAoIGluZGV4IDw9IGZpcmluZ0xlbmd0aCApIHsKCQkJCQkJCQkJZmlyaW5nTGVuZ3RoLS07CgkJCQkJCQkJfQoJCQkJCQkJCWlmICggaW5kZXggPD0gZmlyaW5nSW5kZXggKSB7CgkJCQkJCQkJCWZpcmluZ0luZGV4LS07CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfSk7CgkJCQl9CgkJCQlyZXR1cm4gdGhpczsKCQkJfSwKCQkJLy8gQ29udHJvbCBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0CgkJCWhhczogZnVuY3Rpb24oIGZuICkgewoJCQkJcmV0dXJuIGpRdWVyeS5pbkFycmF5KCBmbiwgbGlzdCApID4gLTE7CgkJCX0sCgkJCS8vIFJlbW92ZSBhbGwgY2FsbGJhY2tzIGZyb20gdGhlIGxpc3QKCQkJZW1wdHk6IGZ1bmN0aW9uKCkgewoJCQkJbGlzdCA9IFtdOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgkJCS8vIEhhdmUgdGhlIGxpc3QgZG8gbm90aGluZyBhbnltb3JlCgkJCWRpc2FibGU6IGZ1bmN0aW9uKCkgewoJCQkJbGlzdCA9IHN0YWNrID0gbWVtb3J5ID0gdW5kZWZpbmVkOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgkJCS8vIElzIGl0IGRpc2FibGVkPwoJCQlkaXNhYmxlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gIWxpc3Q7CgkJCX0sCgkJCS8vIExvY2sgdGhlIGxpc3QgaW4gaXRzIGN1cnJlbnQgc3RhdGUKCQkJbG9jazogZnVuY3Rpb24oKSB7CgkJCQlzdGFjayA9IHVuZGVmaW5lZDsKCQkJCWlmICggIW1lbW9yeSApIHsKCQkJCQlzZWxmLmRpc2FibGUoKTsKCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9LAoJCQkvLyBJcyBpdCBsb2NrZWQ/CgkJCWxvY2tlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gIXN0YWNrOwoJCQl9LAoJCQkvLyBDYWxsIGFsbCBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgYXJndW1lbnRzCgkJCWZpcmVXaXRoOiBmdW5jdGlvbiggY29udGV4dCwgYXJncyApIHsKCQkJCWFyZ3MgPSBhcmdzIHx8IFtdOwoJCQkJYXJncyA9IFsgY29udGV4dCwgYXJncy5zbGljZSA/IGFyZ3Muc2xpY2UoKSA6IGFyZ3MgXTsKCQkJCWlmICggbGlzdCAmJiAoICFmaXJlZCB8fCBzdGFjayApICkgewoJCQkJCWlmICggZmlyaW5nICkgewoJCQkJCQlzdGFjay5wdXNoKCBhcmdzICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJZmlyZSggYXJncyApOwoJCQkJCX0KCQkJCX0KCQkJCXJldHVybiB0aGlzOwoJCQl9LAoJCQkvLyBDYWxsIGFsbCB0aGUgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cwoJCQlmaXJlOiBmdW5jdGlvbigpIHsKCQkJCXNlbGYuZmlyZVdpdGgoIHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgkJCS8vIFRvIGtub3cgaWYgdGhlIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZQoJCQlmaXJlZDogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gISFmaXJlZDsKCQkJfQoJCX07CgoJcmV0dXJuIHNlbGY7Cn07CmpRdWVyeS5leHRlbmQoewoKCURlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHsKCQl2YXIgdHVwbGVzID0gWwoJCQkJLy8gYWN0aW9uLCBhZGQgbGlzdGVuZXIsIGxpc3RlbmVyIGxpc3QsIGZpbmFsIHN0YXRlCgkJCQlbICJyZXNvbHZlIiwgImRvbmUiLCBqUXVlcnkuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCAicmVzb2x2ZWQiIF0sCgkJCQlbICJyZWplY3QiLCAiZmFpbCIsIGpRdWVyeS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksICJyZWplY3RlZCIgXSwKCQkJCVsgIm5vdGlmeSIsICJwcm9ncmVzcyIsIGpRdWVyeS5DYWxsYmFja3MoIm1lbW9yeSIpIF0KCQkJXSwKCQkJc3RhdGUgPSAicGVuZGluZyIsCgkJCXByb21pc2UgPSB7CgkJCQlzdGF0ZTogZnVuY3Rpb24oKSB7CgkJCQkJcmV0dXJuIHN0YXRlOwoJCQkJfSwKCQkJCWFsd2F5czogZnVuY3Rpb24oKSB7CgkJCQkJZGVmZXJyZWQuZG9uZSggYXJndW1lbnRzICkuZmFpbCggYXJndW1lbnRzICk7CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoJCQkJdGhlbjogZnVuY3Rpb24oIC8qIGZuRG9uZSwgZm5GYWlsLCBmblByb2dyZXNzICovICkgewoJCQkJCXZhciBmbnMgPSBhcmd1bWVudHM7CgkJCQkJcmV0dXJuIGpRdWVyeS5EZWZlcnJlZChmdW5jdGlvbiggbmV3RGVmZXIgKSB7CgkJCQkJCWpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHsKCQkJCQkJCXZhciBhY3Rpb24gPSB0dXBsZVsgMCBdLAoJCQkJCQkJCWZuID0gZm5zWyBpIF07CgkJCQkJCQkvLyBkZWZlcnJlZFsgZG9uZSB8IGZhaWwgfCBwcm9ncmVzcyBdIGZvciBmb3J3YXJkaW5nIGFjdGlvbnMgdG8gbmV3RGVmZXIKCQkJCQkJCWRlZmVycmVkWyB0dXBsZVsxXSBdKCBqUXVlcnkuaXNGdW5jdGlvbiggZm4gKSA/CgkJCQkJCQkJZnVuY3Rpb24oKSB7CgkJCQkJCQkJCXZhciByZXR1cm5lZCA9IGZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJCQkJCQkJaWYgKCByZXR1cm5lZCAmJiBqUXVlcnkuaXNGdW5jdGlvbiggcmV0dXJuZWQucHJvbWlzZSApICkgewoJCQkJCQkJCQkJcmV0dXJuZWQucHJvbWlzZSgpCgkJCQkJCQkJCQkJLmRvbmUoIG5ld0RlZmVyLnJlc29sdmUgKQoJCQkJCQkJCQkJCS5mYWlsKCBuZXdEZWZlci5yZWplY3QgKQoJCQkJCQkJCQkJCS5wcm9ncmVzcyggbmV3RGVmZXIubm90aWZ5ICk7CgkJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCQluZXdEZWZlclsgYWN0aW9uICsgIldpdGgiIF0oIHRoaXMgPT09IGRlZmVycmVkID8gbmV3RGVmZXIgOiB0aGlzLCBbIHJldHVybmVkIF0gKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0gOgoJCQkJCQkJCW5ld0RlZmVyWyBhY3Rpb24gXQoJCQkJCQkJKTsKCQkJCQkJfSk7CgkJCQkJCWZucyA9IG51bGw7CgkJCQkJfSkucHJvbWlzZSgpOwoJCQkJfSwKCQkJCS8vIEdldCBhIHByb21pc2UgZm9yIHRoaXMgZGVmZXJyZWQKCQkJCS8vIElmIG9iaiBpcyBwcm92aWRlZCwgdGhlIHByb21pc2UgYXNwZWN0IGlzIGFkZGVkIHRvIHRoZSBvYmplY3QKCQkJCXByb21pc2U6IGZ1bmN0aW9uKCBvYmogKSB7CgkJCQkJcmV0dXJuIG9iaiAhPSBudWxsID8galF1ZXJ5LmV4dGVuZCggb2JqLCBwcm9taXNlICkgOiBwcm9taXNlOwoJCQkJfQoJCQl9LAoJCQlkZWZlcnJlZCA9IHt9OwoKCQkvLyBLZWVwIHBpcGUgZm9yIGJhY2stY29tcGF0CgkJcHJvbWlzZS5waXBlID0gcHJvbWlzZS50aGVuOwoKCQkvLyBBZGQgbGlzdC1zcGVjaWZpYyBtZXRob2RzCgkJalF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIGksIHR1cGxlICkgewoJCQl2YXIgbGlzdCA9IHR1cGxlWyAyIF0sCgkJCQlzdGF0ZVN0cmluZyA9IHR1cGxlWyAzIF07CgoJCQkvLyBwcm9taXNlWyBkb25lIHwgZmFpbCB8IHByb2dyZXNzIF0gPSBsaXN0LmFkZAoJCQlwcm9taXNlWyB0dXBsZVsxXSBdID0gbGlzdC5hZGQ7CgoJCQkvLyBIYW5kbGUgc3RhdGUKCQkJaWYgKCBzdGF0ZVN0cmluZyApIHsKCQkJCWxpc3QuYWRkKGZ1bmN0aW9uKCkgewoJCQkJCS8vIHN0YXRlID0gWyByZXNvbHZlZCB8IHJlamVjdGVkIF0KCQkJCQlzdGF0ZSA9IHN0YXRlU3RyaW5nOwoKCQkJCS8vIFsgcmVqZWN0X2xpc3QgfCByZXNvbHZlX2xpc3QgXS5kaXNhYmxlOyBwcm9ncmVzc19saXN0LmxvY2sKCQkJCX0sIHR1cGxlc1sgaSBeIDEgXVsgMiBdLmRpc2FibGUsIHR1cGxlc1sgMiBdWyAyIF0ubG9jayApOwoJCQl9CgoJCQkvLyBkZWZlcnJlZFsgcmVzb2x2ZSB8IHJlamVjdCB8IG5vdGlmeSBdID0gbGlzdC5maXJlCgkJCWRlZmVycmVkWyB0dXBsZVswXSBdID0gbGlzdC5maXJlOwoJCQlkZWZlcnJlZFsgdHVwbGVbMF0gKyAiV2l0aCIgXSA9IGxpc3QuZmlyZVdpdGg7CgkJfSk7CgoJCS8vIE1ha2UgdGhlIGRlZmVycmVkIGEgcHJvbWlzZQoJCXByb21pc2UucHJvbWlzZSggZGVmZXJyZWQgKTsKCgkJLy8gQ2FsbCBnaXZlbiBmdW5jIGlmIGFueQoJCWlmICggZnVuYyApIHsKCQkJZnVuYy5jYWxsKCBkZWZlcnJlZCwgZGVmZXJyZWQgKTsKCQl9CgoJCS8vIEFsbCBkb25lIQoJCXJldHVybiBkZWZlcnJlZDsKCX0sCgoJLy8gRGVmZXJyZWQgaGVscGVyCgl3aGVuOiBmdW5jdGlvbiggc3Vib3JkaW5hdGUgLyogLCAuLi4sIHN1Ym9yZGluYXRlTiAqLyApIHsKCQl2YXIgaSA9IDAsCgkJCXJlc29sdmVWYWx1ZXMgPSBjb3JlX3NsaWNlLmNhbGwoIGFyZ3VtZW50cyApLAoJCQlsZW5ndGggPSByZXNvbHZlVmFsdWVzLmxlbmd0aCwKCgkJCS8vIHRoZSBjb3VudCBvZiB1bmNvbXBsZXRlZCBzdWJvcmRpbmF0ZXMKCQkJcmVtYWluaW5nID0gbGVuZ3RoICE9PSAxIHx8ICggc3Vib3JkaW5hdGUgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHN1Ym9yZGluYXRlLnByb21pc2UgKSApID8gbGVuZ3RoIDogMCwKCgkJCS8vIHRoZSBtYXN0ZXIgRGVmZXJyZWQuIElmIHJlc29sdmVWYWx1ZXMgY29uc2lzdCBvZiBvbmx5IGEgc2luZ2xlIERlZmVycmVkLCBqdXN0IHVzZSB0aGF0LgoJCQlkZWZlcnJlZCA9IHJlbWFpbmluZyA9PT0gMSA/IHN1Ym9yZGluYXRlIDogalF1ZXJ5LkRlZmVycmVkKCksCgoJCQkvLyBVcGRhdGUgZnVuY3Rpb24gZm9yIGJvdGggcmVzb2x2ZSBhbmQgcHJvZ3Jlc3MgdmFsdWVzCgkJCXVwZGF0ZUZ1bmMgPSBmdW5jdGlvbiggaSwgY29udGV4dHMsIHZhbHVlcyApIHsKCQkJCXJldHVybiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJCQkJY29udGV4dHNbIGkgXSA9IHRoaXM7CgkJCQkJdmFsdWVzWyBpIF0gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGNvcmVfc2xpY2UuY2FsbCggYXJndW1lbnRzICkgOiB2YWx1ZTsKCQkJCQlpZiggdmFsdWVzID09PSBwcm9ncmVzc1ZhbHVlcyApIHsKCQkJCQkJZGVmZXJyZWQubm90aWZ5V2l0aCggY29udGV4dHMsIHZhbHVlcyApOwoJCQkJCX0gZWxzZSBpZiAoICEoIC0tcmVtYWluaW5nICkgKSB7CgkJCQkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBjb250ZXh0cywgdmFsdWVzICk7CgkJCQkJfQoJCQkJfTsKCQkJfSwKCgkJCXByb2dyZXNzVmFsdWVzLCBwcm9ncmVzc0NvbnRleHRzLCByZXNvbHZlQ29udGV4dHM7CgoJCS8vIGFkZCBsaXN0ZW5lcnMgdG8gRGVmZXJyZWQgc3Vib3JkaW5hdGVzOyB0cmVhdCBvdGhlcnMgYXMgcmVzb2x2ZWQKCQlpZiAoIGxlbmd0aCA+IDEgKSB7CgkJCXByb2dyZXNzVmFsdWVzID0gbmV3IEFycmF5KCBsZW5ndGggKTsKCQkJcHJvZ3Jlc3NDb250ZXh0cyA9IG5ldyBBcnJheSggbGVuZ3RoICk7CgkJCXJlc29sdmVDb250ZXh0cyA9IG5ldyBBcnJheSggbGVuZ3RoICk7CgkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgewoJCQkJaWYgKCByZXNvbHZlVmFsdWVzWyBpIF0gJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHJlc29sdmVWYWx1ZXNbIGkgXS5wcm9taXNlICkgKSB7CgkJCQkJcmVzb2x2ZVZhbHVlc1sgaSBdLnByb21pc2UoKQoJCQkJCQkuZG9uZSggdXBkYXRlRnVuYyggaSwgcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICkgKQoJCQkJCQkuZmFpbCggZGVmZXJyZWQucmVqZWN0ICkKCQkJCQkJLnByb2dyZXNzKCB1cGRhdGVGdW5jKCBpLCBwcm9ncmVzc0NvbnRleHRzLCBwcm9ncmVzc1ZhbHVlcyApICk7CgkJCQl9IGVsc2UgewoJCQkJCS0tcmVtYWluaW5nOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBpZiB3ZSdyZSBub3Qgd2FpdGluZyBvbiBhbnl0aGluZywgcmVzb2x2ZSB0aGUgbWFzdGVyCgkJaWYgKCAhcmVtYWluaW5nICkgewoJCQlkZWZlcnJlZC5yZXNvbHZlV2l0aCggcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICk7CgkJfQoKCQlyZXR1cm4gZGVmZXJyZWQucHJvbWlzZSgpOwoJfQp9KTsKalF1ZXJ5LnN1cHBvcnQgPSAoZnVuY3Rpb24oKSB7CgoJdmFyIHN1cHBvcnQsCgkJYWxsLAoJCWEsCgkJc2VsZWN0LAoJCW9wdCwKCQlpbnB1dCwKCQlmcmFnbWVudCwKCQlldmVudE5hbWUsCgkJaSwKCQlpc1N1cHBvcnRlZCwKCQljbGlja0ZuLAoJCWRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoKCS8vIFByZWxpbWluYXJ5IHRlc3RzCglkaXYuc2V0QXR0cmlidXRlKCAiY2xhc3NOYW1lIiwgInQiICk7CglkaXYuaW5uZXJIVE1MID0gIiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiI7CgoJYWxsID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7CglhID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbIDAgXTsKCWEuc3R5bGUuY3NzVGV4dCA9ICJ0b3A6MXB4O2Zsb2F0OmxlZnQ7b3BhY2l0eTouNSI7CgoJLy8gQ2FuJ3QgZ2V0IGJhc2ljIHRlc3Qgc3VwcG9ydAoJaWYgKCAhYWxsIHx8ICFhbGwubGVuZ3RoICkgewoJCXJldHVybiB7fTsKCX0KCgkvLyBGaXJzdCBiYXRjaCBvZiBzdXBwb3J0cyB0ZXN0cwoJc2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0Iik7CglvcHQgPSBzZWxlY3QuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpICk7CglpbnB1dCA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKVsgMCBdOwoKCXN1cHBvcnQgPSB7CgkJLy8gSUUgc3RyaXBzIGxlYWRpbmcgd2hpdGVzcGFjZSB3aGVuIC5pbm5lckhUTUwgaXMgdXNlZAoJCWxlYWRpbmdXaGl0ZXNwYWNlOiAoIGRpdi5maXJzdENoaWxkLm5vZGVUeXBlID09PSAzICksCgoJCS8vIE1ha2Ugc3VyZSB0aGF0IHRib2R5IGVsZW1lbnRzIGFyZW4ndCBhdXRvbWF0aWNhbGx5IGluc2VydGVkCgkJLy8gSUUgd2lsbCBpbnNlcnQgdGhlbSBpbnRvIGVtcHR5IHRhYmxlcwoJCXRib2R5OiAhZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpLmxlbmd0aCwKCgkJLy8gTWFrZSBzdXJlIHRoYXQgbGluayBlbGVtZW50cyBnZXQgc2VyaWFsaXplZCBjb3JyZWN0bHkgYnkgaW5uZXJIVE1MCgkJLy8gVGhpcyByZXF1aXJlcyBhIHdyYXBwZXIgZWxlbWVudCBpbiBJRQoJCWh0bWxTZXJpYWxpemU6ICEhZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIikubGVuZ3RoLAoKCQkvLyBHZXQgdGhlIHN0eWxlIGluZm9ybWF0aW9uIGZyb20gZ2V0QXR0cmlidXRlCgkJLy8gKElFIHVzZXMgLmNzc1RleHQgaW5zdGVhZCkKCQlzdHlsZTogL3RvcC8udGVzdCggYS5nZXRBdHRyaWJ1dGUoInN0eWxlIikgKSwKCgkJLy8gTWFrZSBzdXJlIHRoYXQgVVJMcyBhcmVuJ3QgbWFuaXB1bGF0ZWQKCQkvLyAoSUUgbm9ybWFsaXplcyBpdCBieSBkZWZhdWx0KQoJCWhyZWZOb3JtYWxpemVkOiAoIGEuZ2V0QXR0cmlidXRlKCJocmVmIikgPT09ICIvYSIgKSwKCgkJLy8gTWFrZSBzdXJlIHRoYXQgZWxlbWVudCBvcGFjaXR5IGV4aXN0cwoJCS8vIChJRSB1c2VzIGZpbHRlciBpbnN0ZWFkKQoJCS8vIFVzZSBhIHJlZ2V4IHRvIHdvcmsgYXJvdW5kIGEgV2ViS2l0IGlzc3VlLiBTZWUgIzUxNDUKCQlvcGFjaXR5OiAvXjAuNS8udGVzdCggYS5zdHlsZS5vcGFjaXR5ICksCgoJCS8vIFZlcmlmeSBzdHlsZSBmbG9hdCBleGlzdGVuY2UKCQkvLyAoSUUgdXNlcyBzdHlsZUZsb2F0IGluc3RlYWQgb2YgY3NzRmxvYXQpCgkJY3NzRmxvYXQ6ICEhYS5zdHlsZS5jc3NGbG9hdCwKCgkJLy8gTWFrZSBzdXJlIHRoYXQgaWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkIGZvciBhIGNoZWNrYm94CgkJLy8gdGhhdCBpdCBkZWZhdWx0cyB0byAib24iLgoJCS8vIChXZWJLaXQgZGVmYXVsdHMgdG8gIiIgaW5zdGVhZCkKCQljaGVja09uOiAoIGlucHV0LnZhbHVlID09PSAib24iICksCgoJCS8vIE1ha2Ugc3VyZSB0aGF0IGEgc2VsZWN0ZWQtYnktZGVmYXVsdCBvcHRpb24gaGFzIGEgd29ya2luZyBzZWxlY3RlZCBwcm9wZXJ0eS4KCQkvLyAoV2ViS2l0IGRlZmF1bHRzIHRvIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZSwgSUUgdG9vLCBpZiBpdCdzIGluIGFuIG9wdGdyb3VwKQoJCW9wdFNlbGVjdGVkOiBvcHQuc2VsZWN0ZWQsCgoJCS8vIFRlc3Qgc2V0QXR0cmlidXRlIG9uIGNhbWVsQ2FzZSBjbGFzcy4gSWYgaXQgd29ya3MsIHdlIG5lZWQgYXR0ckZpeGVzIHdoZW4gZG9pbmcgZ2V0L3NldEF0dHJpYnV0ZSAoaWU2LzcpCgkJZ2V0U2V0QXR0cmlidXRlOiBkaXYuY2xhc3NOYW1lICE9PSAidCIsCgoJCS8vIFRlc3RzIGZvciBlbmN0eXBlIHN1cHBvcnQgb24gYSBmb3JtKCM2NzQzKQoJCWVuY3R5cGU6ICEhZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZm9ybSIpLmVuY3R5cGUsCgoJCS8vIE1ha2VzIHN1cmUgY2xvbmluZyBhbiBodG1sNSBlbGVtZW50IGRvZXMgbm90IGNhdXNlIHByb2JsZW1zCgkJLy8gV2hlcmUgb3V0ZXJIVE1MIGlzIHVuZGVmaW5lZCwgdGhpcyBzdGlsbCB3b3JrcwoJCWh0bWw1Q2xvbmU6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm5hdiIpLmNsb25lTm9kZSggdHJ1ZSApLm91dGVySFRNTCAhPT0gIjw6bmF2PjwvOm5hdj4iLAoKCQkvLyBqUXVlcnkuc3VwcG9ydC5ib3hNb2RlbCBERVBSRUNBVEVEIGluIDEuOCBzaW5jZSB3ZSBkb24ndCBzdXBwb3J0IFF1aXJrcyBNb2RlCgkJYm94TW9kZWw6ICggZG9jdW1lbnQuY29tcGF0TW9kZSA9PT0gIkNTUzFDb21wYXQiICksCgoJCS8vIFdpbGwgYmUgZGVmaW5lZCBsYXRlcgoJCXN1Ym1pdEJ1YmJsZXM6IHRydWUsCgkJY2hhbmdlQnViYmxlczogdHJ1ZSwKCQlmb2N1c2luQnViYmxlczogZmFsc2UsCgkJZGVsZXRlRXhwYW5kbzogdHJ1ZSwKCQlub0Nsb25lRXZlbnQ6IHRydWUsCgkJaW5saW5lQmxvY2tOZWVkc0xheW91dDogZmFsc2UsCgkJc2hyaW5rV3JhcEJsb2NrczogZmFsc2UsCgkJcmVsaWFibGVNYXJnaW5SaWdodDogdHJ1ZSwKCQlib3hTaXppbmdSZWxpYWJsZTogdHJ1ZSwKCQlwaXhlbFBvc2l0aW9uOiBmYWxzZQoJfTsKCgkvLyBNYWtlIHN1cmUgY2hlY2tlZCBzdGF0dXMgaXMgcHJvcGVybHkgY2xvbmVkCglpbnB1dC5jaGVja2VkID0gdHJ1ZTsKCXN1cHBvcnQubm9DbG9uZUNoZWNrZWQgPSBpbnB1dC5jbG9uZU5vZGUoIHRydWUgKS5jaGVja2VkOwoKCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBvcHRpb25zIGluc2lkZSBkaXNhYmxlZCBzZWxlY3RzIGFyZW4ndCBtYXJrZWQgYXMgZGlzYWJsZWQKCS8vIChXZWJLaXQgbWFya3MgdGhlbSBhcyBkaXNhYmxlZCkKCXNlbGVjdC5kaXNhYmxlZCA9IHRydWU7CglzdXBwb3J0Lm9wdERpc2FibGVkID0gIW9wdC5kaXNhYmxlZDsKCgkvLyBUZXN0IHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRlbGV0ZSBhbiBleHBhbmRvIGZyb20gYW4gZWxlbWVudAoJLy8gRmFpbHMgaW4gSW50ZXJuZXQgRXhwbG9yZXIKCXRyeSB7CgkJZGVsZXRlIGRpdi50ZXN0OwoJfSBjYXRjaCggZSApIHsKCQlzdXBwb3J0LmRlbGV0ZUV4cGFuZG8gPSBmYWxzZTsKCX0KCglpZiAoICFkaXYuYWRkRXZlbnRMaXN0ZW5lciAmJiBkaXYuYXR0YWNoRXZlbnQgJiYgZGl2LmZpcmVFdmVudCApIHsKCQlkaXYuYXR0YWNoRXZlbnQoICJvbmNsaWNrIiwgY2xpY2tGbiA9IGZ1bmN0aW9uKCkgewoJCQkvLyBDbG9uaW5nIGEgbm9kZSBzaG91bGRuJ3QgY29weSBvdmVyIGFueQoJCQkvLyBib3VuZCBldmVudCBoYW5kbGVycyAoSUUgZG9lcyB0aGlzKQoJCQlzdXBwb3J0Lm5vQ2xvbmVFdmVudCA9IGZhbHNlOwoJCX0pOwoJCWRpdi5jbG9uZU5vZGUoIHRydWUgKS5maXJlRXZlbnQoIm9uY2xpY2siKTsKCQlkaXYuZGV0YWNoRXZlbnQoICJvbmNsaWNrIiwgY2xpY2tGbiApOwoJfQoKCS8vIENoZWNrIGlmIGEgcmFkaW8gbWFpbnRhaW5zIGl0cyB2YWx1ZQoJLy8gYWZ0ZXIgYmVpbmcgYXBwZW5kZWQgdG8gdGhlIERPTQoJaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwoJaW5wdXQudmFsdWUgPSAidCI7CglpbnB1dC5zZXRBdHRyaWJ1dGUoICJ0eXBlIiwgInJhZGlvIiApOwoJc3VwcG9ydC5yYWRpb1ZhbHVlID0gaW5wdXQudmFsdWUgPT09ICJ0IjsKCglpbnB1dC5zZXRBdHRyaWJ1dGUoICJjaGVja2VkIiwgImNoZWNrZWQiICk7CgoJLy8gIzExMjE3IC0gV2ViS2l0IGxvc2VzIGNoZWNrIHdoZW4gdGhlIG5hbWUgaXMgYWZ0ZXIgdGhlIGNoZWNrZWQgYXR0cmlidXRlCglpbnB1dC5zZXRBdHRyaWJ1dGUoICJuYW1lIiwgInQiICk7CgoJZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApOwoJZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CglmcmFnbWVudC5hcHBlbmRDaGlsZCggZGl2Lmxhc3RDaGlsZCApOwoKCS8vIFdlYktpdCBkb2Vzbid0IGNsb25lIGNoZWNrZWQgc3RhdGUgY29ycmVjdGx5IGluIGZyYWdtZW50cwoJc3VwcG9ydC5jaGVja0Nsb25lID0gZnJhZ21lbnQuY2xvbmVOb2RlKCB0cnVlICkuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmNoZWNrZWQ7CgoJLy8gQ2hlY2sgaWYgYSBkaXNjb25uZWN0ZWQgY2hlY2tib3ggd2lsbCByZXRhaW4gaXRzIGNoZWNrZWQKCS8vIHZhbHVlIG9mIHRydWUgYWZ0ZXIgYXBwZW5kZWQgdG8gdGhlIERPTSAoSUU2LzcpCglzdXBwb3J0LmFwcGVuZENoZWNrZWQgPSBpbnB1dC5jaGVja2VkOwoKCWZyYWdtZW50LnJlbW92ZUNoaWxkKCBpbnB1dCApOwoJZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGRpdiApOwoKCS8vIFRlY2huaXF1ZSBmcm9tIEp1cml5IFpheXRzZXYKCS8vIGh0dHA6Ly9wZXJmZWN0aW9ua2lsbHMuY29tL2RldGVjdGluZy1ldmVudC1zdXBwb3J0LXdpdGhvdXQtYnJvd3Nlci1zbmlmZmluZy8KCS8vIFdlIG9ubHkgY2FyZSBhYm91dCB0aGUgY2FzZSB3aGVyZSBub24tc3RhbmRhcmQgZXZlbnQgc3lzdGVtcwoJLy8gYXJlIHVzZWQsIG5hbWVseSBpbiBJRS4gU2hvcnQtY2lyY3VpdGluZyBoZXJlIGhlbHBzIHVzIHRvCgkvLyBhdm9pZCBhbiBldmFsIGNhbGwgKGluIHNldEF0dHJpYnV0ZSkgd2hpY2ggY2FuIGNhdXNlIENTUAoJLy8gdG8gZ28gaGF5d2lyZS4gU2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9TZWN1cml0eS9DU1AKCWlmICggZGl2LmF0dGFjaEV2ZW50ICkgewoJCWZvciAoIGkgaW4gewoJCQlzdWJtaXQ6IHRydWUsCgkJCWNoYW5nZTogdHJ1ZSwKCQkJZm9jdXNpbjogdHJ1ZQoJCX0pIHsKCQkJZXZlbnROYW1lID0gIm9uIiArIGk7CgkJCWlzU3VwcG9ydGVkID0gKCBldmVudE5hbWUgaW4gZGl2ICk7CgkJCWlmICggIWlzU3VwcG9ydGVkICkgewoJCQkJZGl2LnNldEF0dHJpYnV0ZSggZXZlbnROYW1lLCAicmV0dXJuOyIgKTsKCQkJCWlzU3VwcG9ydGVkID0gKCB0eXBlb2YgZGl2WyBldmVudE5hbWUgXSA9PT0gImZ1bmN0aW9uIiApOwoJCQl9CgkJCXN1cHBvcnRbIGkgKyAiQnViYmxlcyIgXSA9IGlzU3VwcG9ydGVkOwoJCX0KCX0KCgkvLyBSdW4gdGVzdHMgdGhhdCBuZWVkIGEgYm9keSBhdCBkb2MgcmVhZHkKCWpRdWVyeShmdW5jdGlvbigpIHsKCQl2YXIgY29udGFpbmVyLCBkaXYsIHRkcywgbWFyZ2luRGl2LAoJCQlkaXZSZXNldCA9ICJwYWRkaW5nOjA7bWFyZ2luOjA7Ym9yZGVyOjA7ZGlzcGxheTpibG9jaztvdmVyZmxvdzpoaWRkZW47IiwKCQkJYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07CgoJCWlmICggIWJvZHkgKSB7CgkJCS8vIFJldHVybiBmb3IgZnJhbWVzZXQgZG9jcyB0aGF0IGRvbid0IGhhdmUgYSBib2R5CgkJCXJldHVybjsKCQl9CgoJCWNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoJCWNvbnRhaW5lci5zdHlsZS5jc3NUZXh0ID0gInZpc2liaWxpdHk6aGlkZGVuO2JvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7cG9zaXRpb246c3RhdGljO3RvcDowO21hcmdpbi10b3A6MXB4IjsKCQlib2R5Lmluc2VydEJlZm9yZSggY29udGFpbmVyLCBib2R5LmZpcnN0Q2hpbGQgKTsKCgkJLy8gQ29uc3RydWN0IHRoZSB0ZXN0IGVsZW1lbnQKCQlkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKCQljb250YWluZXIuYXBwZW5kQ2hpbGQoIGRpdiApOwoKCQkvLyBDaGVjayBpZiB0YWJsZSBjZWxscyBzdGlsbCBoYXZlIG9mZnNldFdpZHRoL0hlaWdodCB3aGVuIHRoZXkgYXJlIHNldAoJCS8vIHRvIGRpc3BsYXk6bm9uZSBhbmQgdGhlcmUgYXJlIHN0aWxsIG90aGVyIHZpc2libGUgdGFibGUgY2VsbHMgaW4gYQoJCS8vIHRhYmxlIHJvdzsgaWYgc28sIG9mZnNldFdpZHRoL0hlaWdodCBhcmUgbm90IHJlbGlhYmxlIGZvciB1c2Ugd2hlbgoJCS8vIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQgaGFzIGJlZW4gaGlkZGVuIGRpcmVjdGx5IHVzaW5nCgkJLy8gZGlzcGxheTpub25lIChpdCBpcyBzdGlsbCBzYWZlIHRvIHVzZSBvZmZzZXRzIGlmIGEgcGFyZW50IGVsZW1lbnQgaXMKCQkvLyBoaWRkZW47IGRvbiBzYWZldHkgZ29nZ2xlcyBhbmQgc2VlIGJ1ZyAjNDUxMiBmb3IgbW9yZSBpbmZvcm1hdGlvbikuCgkJLy8gKG9ubHkgSUUgOCBmYWlscyB0aGlzIHRlc3QpCgkJZGl2LmlubmVySFRNTCA9ICI8dGFibGU+PHRyPjx0ZD48L3RkPjx0ZD50PC90ZD48L3RyPjwvdGFibGU+IjsKCQl0ZHMgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7CgkJdGRzWyAwIF0uc3R5bGUuY3NzVGV4dCA9ICJwYWRkaW5nOjA7bWFyZ2luOjA7Ym9yZGVyOjA7ZGlzcGxheTpub25lIjsKCQlpc1N1cHBvcnRlZCA9ICggdGRzWyAwIF0ub2Zmc2V0SGVpZ2h0ID09PSAwICk7CgoJCXRkc1sgMCBdLnN0eWxlLmRpc3BsYXkgPSAiIjsKCQl0ZHNbIDEgXS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwoKCQkvLyBDaGVjayBpZiBlbXB0eSB0YWJsZSBjZWxscyBzdGlsbCBoYXZlIG9mZnNldFdpZHRoL0hlaWdodAoJCS8vIChJRSA8PSA4IGZhaWwgdGhpcyB0ZXN0KQoJCXN1cHBvcnQucmVsaWFibGVIaWRkZW5PZmZzZXRzID0gaXNTdXBwb3J0ZWQgJiYgKCB0ZHNbIDAgXS5vZmZzZXRIZWlnaHQgPT09IDAgKTsKCgkJLy8gQ2hlY2sgYm94LXNpemluZyBhbmQgbWFyZ2luIGJlaGF2aW9yCgkJZGl2LmlubmVySFRNTCA9ICIiOwoJCWRpdi5zdHlsZS5jc3NUZXh0ID0gImJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDstd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjFweDtib3JkZXI6MXB4O2Rpc3BsYXk6YmxvY2s7d2lkdGg6NHB4O21hcmdpbi10b3A6MSU7cG9zaXRpb246YWJzb2x1dGU7dG9wOjElOyI7CgkJc3VwcG9ydC5ib3hTaXppbmcgPSAoIGRpdi5vZmZzZXRXaWR0aCA9PT0gNCApOwoJCXN1cHBvcnQuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQgPSAoIGJvZHkub2Zmc2V0VG9wICE9PSAxICk7CgoJCS8vIE5PVEU6IFRvIGFueSBmdXR1cmUgbWFpbnRhaW5lciwgd2UndmUgd2luZG93LmdldENvbXB1dGVkU3R5bGUKCQkvLyBiZWNhdXNlIGpzZG9tIG9uIG5vZGUuanMgd2lsbCBicmVhayB3aXRob3V0IGl0LgoJCWlmICggd2luZG93LmdldENvbXB1dGVkU3R5bGUgKSB7CgkJCXN1cHBvcnQucGl4ZWxQb3NpdGlvbiA9ICggd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGRpdiwgbnVsbCApIHx8IHt9ICkudG9wICE9PSAiMSUiOwoJCQlzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlID0gKCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggZGl2LCBudWxsICkgfHwgeyB3aWR0aDogIjRweCIgfSApLndpZHRoID09PSAiNHB4IjsKCgkJCS8vIENoZWNrIGlmIGRpdiB3aXRoIGV4cGxpY2l0IHdpZHRoIGFuZCBubyBtYXJnaW4tcmlnaHQgaW5jb3JyZWN0bHkKCQkJLy8gZ2V0cyBjb21wdXRlZCBtYXJnaW4tcmlnaHQgYmFzZWQgb24gd2lkdGggb2YgY29udGFpbmVyLiBGb3IgbW9yZQoJCQkvLyBpbmZvIHNlZSBidWcgIzMzMzMKCQkJLy8gRmFpbHMgaW4gV2ViS2l0IGJlZm9yZSBGZWIgMjAxMSBuaWdodGxpZXMKCQkJLy8gV2ViS2l0IEJ1ZyAxMzM0MyAtIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyB3cm9uZyB2YWx1ZSBmb3IgbWFyZ2luLXJpZ2h0CgkJCW1hcmdpbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoJCQltYXJnaW5EaXYuc3R5bGUuY3NzVGV4dCA9IGRpdi5zdHlsZS5jc3NUZXh0ID0gZGl2UmVzZXQ7CgkJCW1hcmdpbkRpdi5zdHlsZS5tYXJnaW5SaWdodCA9IG1hcmdpbkRpdi5zdHlsZS53aWR0aCA9ICIwIjsKCQkJZGl2LnN0eWxlLndpZHRoID0gIjFweCI7CgkJCWRpdi5hcHBlbmRDaGlsZCggbWFyZ2luRGl2ICk7CgkJCXN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodCA9CgkJCQkhcGFyc2VGbG9hdCggKCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggbWFyZ2luRGl2LCBudWxsICkgfHwge30gKS5tYXJnaW5SaWdodCApOwoJCX0KCgkJaWYgKCB0eXBlb2YgZGl2LnN0eWxlLnpvb20gIT09ICJ1bmRlZmluZWQiICkgewoJCQkvLyBDaGVjayBpZiBuYXRpdmVseSBibG9jay1sZXZlbCBlbGVtZW50cyBhY3QgbGlrZSBpbmxpbmUtYmxvY2sKCQkJLy8gZWxlbWVudHMgd2hlbiBzZXR0aW5nIHRoZWlyIGRpc3BsYXkgdG8gJ2lubGluZScgYW5kIGdpdmluZwoJCQkvLyB0aGVtIGxheW91dAoJCQkvLyAoSUUgPCA4IGRvZXMgdGhpcykKCQkJZGl2LmlubmVySFRNTCA9ICIiOwoJCQlkaXYuc3R5bGUuY3NzVGV4dCA9IGRpdlJlc2V0ICsgIndpZHRoOjFweDtwYWRkaW5nOjFweDtkaXNwbGF5OmlubGluZTt6b29tOjEiOwoJCQlzdXBwb3J0LmlubGluZUJsb2NrTmVlZHNMYXlvdXQgPSAoIGRpdi5vZmZzZXRXaWR0aCA9PT0gMyApOwoKCQkJLy8gQ2hlY2sgaWYgZWxlbWVudHMgd2l0aCBsYXlvdXQgc2hyaW5rLXdyYXAgdGhlaXIgY2hpbGRyZW4KCQkJLy8gKElFIDYgZG9lcyB0aGlzKQoJCQlkaXYuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CgkJCWRpdi5zdHlsZS5vdmVyZmxvdyA9ICJ2aXNpYmxlIjsKCQkJZGl2LmlubmVySFRNTCA9ICI8ZGl2PjwvZGl2PiI7CgkJCWRpdi5maXJzdENoaWxkLnN0eWxlLndpZHRoID0gIjVweCI7CgkJCXN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcyA9ICggZGl2Lm9mZnNldFdpZHRoICE9PSAzICk7CgoJCQljb250YWluZXIuc3R5bGUuem9vbSA9IDE7CgkJfQoKCQkvLyBOdWxsIGVsZW1lbnRzIHRvIGF2b2lkIGxlYWtzIGluIElFCgkJYm9keS5yZW1vdmVDaGlsZCggY29udGFpbmVyICk7CgkJY29udGFpbmVyID0gZGl2ID0gdGRzID0gbWFyZ2luRGl2ID0gbnVsbDsKCX0pOwoKCS8vIE51bGwgZWxlbWVudHMgdG8gYXZvaWQgbGVha3MgaW4gSUUKCWZyYWdtZW50LnJlbW92ZUNoaWxkKCBkaXYgKTsKCWFsbCA9IGEgPSBzZWxlY3QgPSBvcHQgPSBpbnB1dCA9IGZyYWdtZW50ID0gZGl2ID0gbnVsbDsKCglyZXR1cm4gc3VwcG9ydDsKfSkoKTsKdmFyIHJicmFjZSA9IC8oPzpce1tcc1xTXSpcfXxcW1tcc1xTXSpcXSkkLywKCXJtdWx0aURhc2ggPSAvKFtBLVpdKS9nOwoKalF1ZXJ5LmV4dGVuZCh7CgljYWNoZToge30sCgoJZGVsZXRlZElkczogW10sCgoJLy8gUmVtb3ZlIGF0IG5leHQgbWFqb3IgcmVsZWFzZSAoMS45LzIuMCkKCXV1aWQ6IDAsCgoJLy8gVW5pcXVlIGZvciBlYWNoIGNvcHkgb2YgalF1ZXJ5IG9uIHRoZSBwYWdlCgkvLyBOb24tZGlnaXRzIHJlbW92ZWQgdG8gbWF0Y2ggcmlubGluZWpRdWVyeQoJZXhwYW5kbzogImpRdWVyeSIgKyAoIGpRdWVyeS5mbi5qcXVlcnkgKyBNYXRoLnJhbmRvbSgpICkucmVwbGFjZSggL1xEL2csICIiICksCgoJLy8gVGhlIGZvbGxvd2luZyBlbGVtZW50cyB0aHJvdyB1bmNhdGNoYWJsZSBleGNlcHRpb25zIGlmIHlvdQoJLy8gYXR0ZW1wdCB0byBhZGQgZXhwYW5kbyBwcm9wZXJ0aWVzIHRvIHRoZW0uCglub0RhdGE6IHsKCQkiZW1iZWQiOiB0cnVlLAoJCS8vIEJhbiBhbGwgb2JqZWN0cyBleGNlcHQgZm9yIEZsYXNoICh3aGljaCBoYW5kbGUgZXhwYW5kb3MpCgkJIm9iamVjdCI6ICJjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDAiLAoJCSJhcHBsZXQiOiB0cnVlCgl9LAoKCWhhc0RhdGE6IGZ1bmN0aW9uKCBlbGVtICkgewoJCWVsZW0gPSBlbGVtLm5vZGVUeXBlID8galF1ZXJ5LmNhY2hlWyBlbGVtW2pRdWVyeS5leHBhbmRvXSBdIDogZWxlbVsgalF1ZXJ5LmV4cGFuZG8gXTsKCQlyZXR1cm4gISFlbGVtICYmICFpc0VtcHR5RGF0YU9iamVjdCggZWxlbSApOwoJfSwKCglkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSwgcHZ0IC8qIEludGVybmFsIFVzZSBPbmx5ICovICkgewoJCWlmICggIWpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciB0aGlzQ2FjaGUsIHJldCwKCQkJaW50ZXJuYWxLZXkgPSBqUXVlcnkuZXhwYW5kbywKCQkJZ2V0QnlOYW1lID0gdHlwZW9mIG5hbWUgPT09ICJzdHJpbmciLAoKCQkJLy8gV2UgaGF2ZSB0byBoYW5kbGUgRE9NIG5vZGVzIGFuZCBKUyBvYmplY3RzIGRpZmZlcmVudGx5IGJlY2F1c2UgSUU2LTcKCQkJLy8gY2FuJ3QgR0Mgb2JqZWN0IHJlZmVyZW5jZXMgcHJvcGVybHkgYWNyb3NzIHRoZSBET00tSlMgYm91bmRhcnkKCQkJaXNOb2RlID0gZWxlbS5ub2RlVHlwZSwKCgkJCS8vIE9ubHkgRE9NIG5vZGVzIG5lZWQgdGhlIGdsb2JhbCBqUXVlcnkgY2FjaGU7IEpTIG9iamVjdCBkYXRhIGlzCgkJCS8vIGF0dGFjaGVkIGRpcmVjdGx5IHRvIHRoZSBvYmplY3Qgc28gR0MgY2FuIG9jY3VyIGF1dG9tYXRpY2FsbHkKCQkJY2FjaGUgPSBpc05vZGUgPyBqUXVlcnkuY2FjaGUgOiBlbGVtLAoKCQkJLy8gT25seSBkZWZpbmluZyBhbiBJRCBmb3IgSlMgb2JqZWN0cyBpZiBpdHMgY2FjaGUgYWxyZWFkeSBleGlzdHMgYWxsb3dzCgkJCS8vIHRoZSBjb2RlIHRvIHNob3J0Y3V0IG9uIHRoZSBzYW1lIHBhdGggYXMgYSBET00gbm9kZSB3aXRoIG5vIGNhY2hlCgkJCWlkID0gaXNOb2RlID8gZWxlbVsgaW50ZXJuYWxLZXkgXSA6IGVsZW1bIGludGVybmFsS2V5IF0gJiYgaW50ZXJuYWxLZXk7CgoJCS8vIEF2b2lkIGRvaW5nIGFueSBtb3JlIHdvcmsgdGhhbiB3ZSBuZWVkIHRvIHdoZW4gdHJ5aW5nIHRvIGdldCBkYXRhIG9uIGFuCgkJLy8gb2JqZWN0IHRoYXQgaGFzIG5vIGRhdGEgYXQgYWxsCgkJaWYgKCAoIWlkIHx8ICFjYWNoZVtpZF0gfHwgKCFwdnQgJiYgIWNhY2hlW2lkXS5kYXRhKSkgJiYgZ2V0QnlOYW1lICYmIGRhdGEgPT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCAhaWQgKSB7CgkJCS8vIE9ubHkgRE9NIG5vZGVzIG5lZWQgYSBuZXcgdW5pcXVlIElEIGZvciBlYWNoIGVsZW1lbnQgc2luY2UgdGhlaXIgZGF0YQoJCQkvLyBlbmRzIHVwIGluIHRoZSBnbG9iYWwgY2FjaGUKCQkJaWYgKCBpc05vZGUgKSB7CgkJCQllbGVtWyBpbnRlcm5hbEtleSBdID0gaWQgPSBqUXVlcnkuZGVsZXRlZElkcy5wb3AoKSB8fCBqUXVlcnkuZ3VpZCsrOwoJCQl9IGVsc2UgewoJCQkJaWQgPSBpbnRlcm5hbEtleTsKCQkJfQoJCX0KCgkJaWYgKCAhY2FjaGVbIGlkIF0gKSB7CgkJCWNhY2hlWyBpZCBdID0ge307CgoJCQkvLyBBdm9pZHMgZXhwb3NpbmcgalF1ZXJ5IG1ldGFkYXRhIG9uIHBsYWluIEpTIG9iamVjdHMgd2hlbiB0aGUgb2JqZWN0CgkJCS8vIGlzIHNlcmlhbGl6ZWQgdXNpbmcgSlNPTi5zdHJpbmdpZnkKCQkJaWYgKCAhaXNOb2RlICkgewoJCQkJY2FjaGVbIGlkIF0udG9KU09OID0galF1ZXJ5Lm5vb3A7CgkJCX0KCQl9CgoJCS8vIEFuIG9iamVjdCBjYW4gYmUgcGFzc2VkIHRvIGpRdWVyeS5kYXRhIGluc3RlYWQgb2YgYSBrZXkvdmFsdWUgcGFpcjsgdGhpcyBnZXRzCgkJLy8gc2hhbGxvdyBjb3BpZWQgb3ZlciBvbnRvIHRoZSBleGlzdGluZyBjYWNoZQoJCWlmICggdHlwZW9mIG5hbWUgPT09ICJvYmplY3QiIHx8IHR5cGVvZiBuYW1lID09PSAiZnVuY3Rpb24iICkgewoJCQlpZiAoIHB2dCApIHsKCQkJCWNhY2hlWyBpZCBdID0galF1ZXJ5LmV4dGVuZCggY2FjaGVbIGlkIF0sIG5hbWUgKTsKCQkJfSBlbHNlIHsKCQkJCWNhY2hlWyBpZCBdLmRhdGEgPSBqUXVlcnkuZXh0ZW5kKCBjYWNoZVsgaWQgXS5kYXRhLCBuYW1lICk7CgkJCX0KCQl9CgoJCXRoaXNDYWNoZSA9IGNhY2hlWyBpZCBdOwoKCQkvLyBqUXVlcnkgZGF0YSgpIGlzIHN0b3JlZCBpbiBhIHNlcGFyYXRlIG9iamVjdCBpbnNpZGUgdGhlIG9iamVjdCdzIGludGVybmFsIGRhdGEKCQkvLyBjYWNoZSBpbiBvcmRlciB0byBhdm9pZCBrZXkgY29sbGlzaW9ucyBiZXR3ZWVuIGludGVybmFsIGRhdGEgYW5kIHVzZXItZGVmaW5lZAoJCS8vIGRhdGEuCgkJaWYgKCAhcHZ0ICkgewoJCQlpZiAoICF0aGlzQ2FjaGUuZGF0YSApIHsKCQkJCXRoaXNDYWNoZS5kYXRhID0ge307CgkJCX0KCgkJCXRoaXNDYWNoZSA9IHRoaXNDYWNoZS5kYXRhOwoJCX0KCgkJaWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7CgkJCXRoaXNDYWNoZVsgalF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApIF0gPSBkYXRhOwoJCX0KCgkJLy8gQ2hlY2sgZm9yIGJvdGggY29udmVydGVkLXRvLWNhbWVsIGFuZCBub24tY29udmVydGVkIGRhdGEgcHJvcGVydHkgbmFtZXMKCQkvLyBJZiBhIGRhdGEgcHJvcGVydHkgd2FzIHNwZWNpZmllZAoJCWlmICggZ2V0QnlOYW1lICkgewoKCQkJLy8gRmlyc3QgVHJ5IHRvIGZpbmQgYXMtaXMgcHJvcGVydHkgZGF0YQoJCQlyZXQgPSB0aGlzQ2FjaGVbIG5hbWUgXTsKCgkJCS8vIFRlc3QgZm9yIG51bGx8dW5kZWZpbmVkIHByb3BlcnR5IGRhdGEKCQkJaWYgKCByZXQgPT0gbnVsbCApIHsKCgkJCQkvLyBUcnkgdG8gZmluZCB0aGUgY2FtZWxDYXNlZCBwcm9wZXJ0eQoJCQkJcmV0ID0gdGhpc0NhY2hlWyBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICkgXTsKCQkJfQoJCX0gZWxzZSB7CgkJCXJldCA9IHRoaXNDYWNoZTsKCQl9CgoJCXJldHVybiByZXQ7Cgl9LAoKCXJlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBwdnQgLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7CgkJaWYgKCAhalF1ZXJ5LmFjY2VwdERhdGEoIGVsZW0gKSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJdmFyIHRoaXNDYWNoZSwgaSwgbCwKCgkJCWlzTm9kZSA9IGVsZW0ubm9kZVR5cGUsCgoJCQkvLyBTZWUgalF1ZXJ5LmRhdGEgZm9yIG1vcmUgaW5mb3JtYXRpb24KCQkJY2FjaGUgPSBpc05vZGUgPyBqUXVlcnkuY2FjaGUgOiBlbGVtLAoJCQlpZCA9IGlzTm9kZSA/IGVsZW1bIGpRdWVyeS5leHBhbmRvIF0gOiBqUXVlcnkuZXhwYW5kbzsKCgkJLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBubyBjYWNoZSBlbnRyeSBmb3IgdGhpcyBvYmplY3QsIHRoZXJlIGlzIG5vCgkJLy8gcHVycG9zZSBpbiBjb250aW51aW5nCgkJaWYgKCAhY2FjaGVbIGlkIF0gKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICggbmFtZSApIHsKCgkJCXRoaXNDYWNoZSA9IHB2dCA/IGNhY2hlWyBpZCBdIDogY2FjaGVbIGlkIF0uZGF0YTsKCgkJCWlmICggdGhpc0NhY2hlICkgewoKCQkJCS8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBuYW1lcyBmb3IgZGF0YSBrZXlzCgkJCQlpZiAoICFqUXVlcnkuaXNBcnJheSggbmFtZSApICkgewoKCQkJCQkvLyB0cnkgdGhlIHN0cmluZyBhcyBhIGtleSBiZWZvcmUgYW55IG1hbmlwdWxhdGlvbgoJCQkJCWlmICggbmFtZSBpbiB0aGlzQ2FjaGUgKSB7CgkJCQkJCW5hbWUgPSBbIG5hbWUgXTsKCQkJCQl9IGVsc2UgewoKCQkJCQkJLy8gc3BsaXQgdGhlIGNhbWVsIGNhc2VkIHZlcnNpb24gYnkgc3BhY2VzIHVubGVzcyBhIGtleSB3aXRoIHRoZSBzcGFjZXMgZXhpc3RzCgkJCQkJCW5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICk7CgkJCQkJCWlmICggbmFtZSBpbiB0aGlzQ2FjaGUgKSB7CgkJCQkJCQluYW1lID0gWyBuYW1lIF07CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQluYW1lID0gbmFtZS5zcGxpdCgiICIpOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoKCQkJCWZvciAoIGkgPSAwLCBsID0gbmFtZS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQkJZGVsZXRlIHRoaXNDYWNoZVsgbmFtZVtpXSBdOwoJCQkJfQoKCQkJCS8vIElmIHRoZXJlIGlzIG5vIGRhdGEgbGVmdCBpbiB0aGUgY2FjaGUsIHdlIHdhbnQgdG8gY29udGludWUKCQkJCS8vIGFuZCBsZXQgdGhlIGNhY2hlIG9iamVjdCBpdHNlbGYgZ2V0IGRlc3Ryb3llZAoJCQkJaWYgKCAhKCBwdnQgPyBpc0VtcHR5RGF0YU9iamVjdCA6IGpRdWVyeS5pc0VtcHR5T2JqZWN0ICkoIHRoaXNDYWNoZSApICkgewoJCQkJCXJldHVybjsKCQkJCX0KCQkJfQoJCX0KCgkJLy8gU2VlIGpRdWVyeS5kYXRhIGZvciBtb3JlIGluZm9ybWF0aW9uCgkJaWYgKCAhcHZ0ICkgewoJCQlkZWxldGUgY2FjaGVbIGlkIF0uZGF0YTsKCgkJCS8vIERvbid0IGRlc3Ryb3kgdGhlIHBhcmVudCBjYWNoZSB1bmxlc3MgdGhlIGludGVybmFsIGRhdGEgb2JqZWN0CgkJCS8vIGhhZCBiZWVuIHRoZSBvbmx5IHRoaW5nIGxlZnQgaW4gaXQKCQkJaWYgKCAhaXNFbXB0eURhdGFPYmplY3QoIGNhY2hlWyBpZCBdICkgKSB7CgkJCQlyZXR1cm47CgkJCX0KCQl9CgoJCS8vIERlc3Ryb3kgdGhlIGNhY2hlCgkJaWYgKCBpc05vZGUgKSB7CgkJCWpRdWVyeS5jbGVhbkRhdGEoIFsgZWxlbSBdLCB0cnVlICk7CgoJCS8vIFVzZSBkZWxldGUgd2hlbiBzdXBwb3J0ZWQgZm9yIGV4cGFuZG9zIG9yIGBjYWNoZWAgaXMgbm90IGEgd2luZG93IHBlciBpc1dpbmRvdyAoIzEwMDgwKQoJCX0gZWxzZSBpZiAoIGpRdWVyeS5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8gfHwgY2FjaGUgIT0gY2FjaGUud2luZG93ICkgewoJCQlkZWxldGUgY2FjaGVbIGlkIF07CgoJCS8vIFdoZW4gYWxsIGVsc2UgZmFpbHMsIG51bGwKCQl9IGVsc2UgewoJCQljYWNoZVsgaWQgXSA9IG51bGw7CgkJfQoJfSwKCgkvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCglfZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7CgkJcmV0dXJuIGpRdWVyeS5kYXRhKCBlbGVtLCBuYW1lLCBkYXRhLCB0cnVlICk7Cgl9LAoKCS8vIEEgbWV0aG9kIGZvciBkZXRlcm1pbmluZyBpZiBhIERPTSBub2RlIGNhbiBoYW5kbGUgdGhlIGRhdGEgZXhwYW5kbwoJYWNjZXB0RGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIG5vRGF0YSA9IGVsZW0ubm9kZU5hbWUgJiYgalF1ZXJ5Lm5vRGF0YVsgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCS8vIG5vZGVzIGFjY2VwdCBkYXRhIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkOyByZWplY3Rpb24gY2FuIGJlIGNvbmRpdGlvbmFsCgkJcmV0dXJuICFub0RhdGEgfHwgbm9EYXRhICE9PSB0cnVlICYmIGVsZW0uZ2V0QXR0cmlidXRlKCJjbGFzc2lkIikgPT09IG5vRGF0YTsKCX0KfSk7CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewoJCXZhciBwYXJ0cywgcGFydCwgYXR0ciwgbmFtZSwgbCwKCQkJZWxlbSA9IHRoaXNbMF0sCgkJCWkgPSAwLAoJCQlkYXRhID0gbnVsbDsKCgkJLy8gR2V0cyBhbGwgdmFsdWVzCgkJaWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHsKCQkJaWYgKCB0aGlzLmxlbmd0aCApIHsKCQkJCWRhdGEgPSBqUXVlcnkuZGF0YSggZWxlbSApOwoKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAhalF1ZXJ5Ll9kYXRhKCBlbGVtLCAicGFyc2VkQXR0cnMiICkgKSB7CgkJCQkJYXR0ciA9IGVsZW0uYXR0cmlidXRlczsKCQkJCQlmb3IgKCBsID0gYXR0ci5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQkJCW5hbWUgPSBhdHRyW2ldLm5hbWU7CgoJCQkJCQlpZiAoICFuYW1lLmluZGV4T2YoICJkYXRhLSIgKSApIHsKCQkJCQkJCW5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lLnN1YnN0cmluZyg1KSApOwoKCQkJCQkJCWRhdGFBdHRyKCBlbGVtLCBuYW1lLCBkYXRhWyBuYW1lIF0gKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQlqUXVlcnkuX2RhdGEoIGVsZW0sICJwYXJzZWRBdHRycyIsIHRydWUgKTsKCQkJCX0KCQkJfQoKCQkJcmV0dXJuIGRhdGE7CgkJfQoKCQkvLyBTZXRzIG11bHRpcGxlIHZhbHVlcwoJCWlmICggdHlwZW9mIGtleSA9PT0gIm9iamVjdCIgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCQlqUXVlcnkuZGF0YSggdGhpcywga2V5ICk7CgkJCX0pOwoJCX0KCgkJcGFydHMgPSBrZXkuc3BsaXQoICIuIiwgMiApOwoJCXBhcnRzWzFdID0gcGFydHNbMV0gPyAiLiIgKyBwYXJ0c1sxXSA6ICIiOwoJCXBhcnQgPSBwYXJ0c1sxXSArICIhIjsKCgkJcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCgkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKCQkJCWRhdGEgPSB0aGlzLnRyaWdnZXJIYW5kbGVyKCAiZ2V0RGF0YSIgKyBwYXJ0LCBbIHBhcnRzWzBdIF0gKTsKCgkJCQkvLyBUcnkgdG8gZmV0Y2ggYW55IGludGVybmFsbHkgc3RvcmVkIGRhdGEgZmlyc3QKCQkJCWlmICggZGF0YSA9PT0gdW5kZWZpbmVkICYmIGVsZW0gKSB7CgkJCQkJZGF0YSA9IGpRdWVyeS5kYXRhKCBlbGVtLCBrZXkgKTsKCQkJCQlkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGtleSwgZGF0YSApOwoJCQkJfQoKCQkJCXJldHVybiBkYXRhID09PSB1bmRlZmluZWQgJiYgcGFydHNbMV0gPwoJCQkJCXRoaXMuZGF0YSggcGFydHNbMF0gKSA6CgkJCQkJZGF0YTsKCQkJfQoKCQkJcGFydHNbMV0gPSB2YWx1ZTsKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIHNlbGYgPSBqUXVlcnkoIHRoaXMgKTsKCgkJCQlzZWxmLnRyaWdnZXJIYW5kbGVyKCAic2V0RGF0YSIgKyBwYXJ0LCBwYXJ0cyApOwoJCQkJalF1ZXJ5LmRhdGEoIHRoaXMsIGtleSwgdmFsdWUgKTsKCQkJCXNlbGYudHJpZ2dlckhhbmRsZXIoICJjaGFuZ2VEYXRhIiArIHBhcnQsIHBhcnRzICk7CgkJCX0pOwoJCX0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSwgbnVsbCwgZmFsc2UgKTsKCX0sCgoJcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGtleSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkucmVtb3ZlRGF0YSggdGhpcywga2V5ICk7CgkJfSk7Cgl9Cn0pOwoKZnVuY3Rpb24gZGF0YUF0dHIoIGVsZW0sIGtleSwgZGF0YSApIHsKCS8vIElmIG5vdGhpbmcgd2FzIGZvdW5kIGludGVybmFsbHksIHRyeSB0byBmZXRjaCBhbnkKCS8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZQoJaWYgKCBkYXRhID09PSB1bmRlZmluZWQgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCgkJdmFyIG5hbWUgPSAiZGF0YS0iICsga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsICItJDEiICkudG9Mb3dlckNhc2UoKTsKCgkJZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7CgoJCWlmICggdHlwZW9mIGRhdGEgPT09ICJzdHJpbmciICkgewoJCQl0cnkgewoJCQkJZGF0YSA9IGRhdGEgPT09ICJ0cnVlIiA/IHRydWUgOgoJCQkJZGF0YSA9PT0gImZhbHNlIiA/IGZhbHNlIDoKCQkJCWRhdGEgPT09ICJudWxsIiA/IG51bGwgOgoJCQkJLy8gT25seSBjb252ZXJ0IHRvIGEgbnVtYmVyIGlmIGl0IGRvZXNuJ3QgY2hhbmdlIHRoZSBzdHJpbmcKCQkJCStkYXRhICsgIiIgPT09IGRhdGEgPyArZGF0YSA6CgkJCQlyYnJhY2UudGVzdCggZGF0YSApID8galF1ZXJ5LnBhcnNlSlNPTiggZGF0YSApIDoKCQkJCQlkYXRhOwoJCQl9IGNhdGNoKCBlICkge30KCgkJCS8vIE1ha2Ugc3VyZSB3ZSBzZXQgdGhlIGRhdGEgc28gaXQgaXNuJ3QgY2hhbmdlZCBsYXRlcgoJCQlqUXVlcnkuZGF0YSggZWxlbSwga2V5LCBkYXRhICk7CgoJCX0gZWxzZSB7CgkJCWRhdGEgPSB1bmRlZmluZWQ7CgkJfQoJfQoKCXJldHVybiBkYXRhOwp9CgovLyBjaGVja3MgYSBjYWNoZSBvYmplY3QgZm9yIGVtcHRpbmVzcwpmdW5jdGlvbiBpc0VtcHR5RGF0YU9iamVjdCggb2JqICkgewoJdmFyIG5hbWU7Cglmb3IgKCBuYW1lIGluIG9iaiApIHsKCgkJLy8gaWYgdGhlIHB1YmxpYyBkYXRhIG9iamVjdCBpcyBlbXB0eSwgdGhlIHByaXZhdGUgaXMgc3RpbGwgZW1wdHkKCQlpZiAoIG5hbWUgPT09ICJkYXRhIiAmJiBqUXVlcnkuaXNFbXB0eU9iamVjdCggb2JqW25hbWVdICkgKSB7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoIG5hbWUgIT09ICJ0b0pTT04iICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfQoKCXJldHVybiB0cnVlOwp9CmpRdWVyeS5leHRlbmQoewoJcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkgewoJCXZhciBxdWV1ZTsKCgkJaWYgKCBlbGVtICkgewoJCQl0eXBlID0gKCB0eXBlIHx8ICJmeCIgKSArICJxdWV1ZSI7CgkJCXF1ZXVlID0galF1ZXJ5Ll9kYXRhKCBlbGVtLCB0eXBlICk7CgoJCQkvLyBTcGVlZCB1cCBkZXF1ZXVlIGJ5IGdldHRpbmcgb3V0IHF1aWNrbHkgaWYgdGhpcyBpcyBqdXN0IGEgbG9va3VwCgkJCWlmICggZGF0YSApIHsKCQkJCWlmICggIXF1ZXVlIHx8IGpRdWVyeS5pc0FycmF5KGRhdGEpICkgewoJCQkJCXF1ZXVlID0galF1ZXJ5Ll9kYXRhKCBlbGVtLCB0eXBlLCBqUXVlcnkubWFrZUFycmF5KGRhdGEpICk7CgkJCQl9IGVsc2UgewoJCQkJCXF1ZXVlLnB1c2goIGRhdGEgKTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gcXVldWUgfHwgW107CgkJfQoJfSwKCglkZXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKCQl0eXBlID0gdHlwZSB8fCAiZngiOwoKCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSwKCQkJc3RhcnRMZW5ndGggPSBxdWV1ZS5sZW5ndGgsCgkJCWZuID0gcXVldWUuc2hpZnQoKSwKCQkJaG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIHR5cGUgKSwKCQkJbmV4dCA9IGZ1bmN0aW9uKCkgewoJCQkJalF1ZXJ5LmRlcXVldWUoIGVsZW0sIHR5cGUgKTsKCQkJfTsKCgkJLy8gSWYgdGhlIGZ4IHF1ZXVlIGlzIGRlcXVldWVkLCBhbHdheXMgcmVtb3ZlIHRoZSBwcm9ncmVzcyBzZW50aW5lbAoJCWlmICggZm4gPT09ICJpbnByb2dyZXNzIiApIHsKCQkJZm4gPSBxdWV1ZS5zaGlmdCgpOwoJCQlzdGFydExlbmd0aC0tOwoJCX0KCgkJaWYgKCBmbiApIHsKCgkJCS8vIEFkZCBhIHByb2dyZXNzIHNlbnRpbmVsIHRvIHByZXZlbnQgdGhlIGZ4IHF1ZXVlIGZyb20gYmVpbmcKCQkJLy8gYXV0b21hdGljYWxseSBkZXF1ZXVlZAoJCQlpZiAoIHR5cGUgPT09ICJmeCIgKSB7CgkJCQlxdWV1ZS51bnNoaWZ0KCAiaW5wcm9ncmVzcyIgKTsKCQkJfQoKCQkJLy8gY2xlYXIgdXAgdGhlIGxhc3QgcXVldWUgc3RvcCBmdW5jdGlvbgoJCQlkZWxldGUgaG9va3Muc3RvcDsKCQkJZm4uY2FsbCggZWxlbSwgbmV4dCwgaG9va3MgKTsKCQl9CgoJCWlmICggIXN0YXJ0TGVuZ3RoICYmIGhvb2tzICkgewoJCQlob29rcy5lbXB0eS5maXJlKCk7CgkJfQoJfSwKCgkvLyBub3QgaW50ZW5kZWQgZm9yIHB1YmxpYyBjb25zdW1wdGlvbiAtIGdlbmVyYXRlcyBhIHF1ZXVlSG9va3Mgb2JqZWN0LCBvciByZXR1cm5zIHRoZSBjdXJyZW50IG9uZQoJX3F1ZXVlSG9va3M6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkgewoJCXZhciBrZXkgPSB0eXBlICsgInF1ZXVlSG9va3MiOwoJCXJldHVybiBqUXVlcnkuX2RhdGEoIGVsZW0sIGtleSApIHx8IGpRdWVyeS5fZGF0YSggZWxlbSwga2V5LCB7CgkJCWVtcHR5OiBqUXVlcnkuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpIHsKCQkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtLCB0eXBlICsgInF1ZXVlIiwgdHJ1ZSApOwoJCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sIGtleSwgdHJ1ZSApOwoJCQl9KQoJCX0pOwoJfQp9KTsKCmpRdWVyeS5mbi5leHRlbmQoewoJcXVldWU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCXZhciBzZXR0ZXIgPSAyOwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJZGF0YSA9IHR5cGU7CgkJCXR5cGUgPSAiZngiOwoJCQlzZXR0ZXItLTsKCQl9CgoJCWlmICggYXJndW1lbnRzLmxlbmd0aCA8IHNldHRlciApIHsKCQkJcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1swXSwgdHlwZSApOwoJCX0KCgkJcmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCA/CgkJCXRoaXMgOgoJCQl0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTsKCgkJCQkvLyBlbnN1cmUgYSBob29rcyBmb3IgdGhpcyBxdWV1ZQoJCQkJalF1ZXJ5Ll9xdWV1ZUhvb2tzKCB0aGlzLCB0eXBlICk7CgoJCQkJaWYgKCB0eXBlID09PSAiZngiICYmIHF1ZXVlWzBdICE9PSAiaW5wcm9ncmVzcyIgKSB7CgkJCQkJalF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTsKCQkJCX0KCQkJfSk7Cgl9LAoJZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7CgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJalF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTsKCQl9KTsKCX0sCgkvLyBCYXNlZCBvZmYgb2YgdGhlIHBsdWdpbiBieSBDbGludCBIZWxmZXJzLCB3aXRoIHBlcm1pc3Npb24uCgkvLyBodHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvCglkZWxheTogZnVuY3Rpb24oIHRpbWUsIHR5cGUgKSB7CgkJdGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTsKCQl0eXBlID0gdHlwZSB8fCAiZngiOwoKCQlyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSwgZnVuY3Rpb24oIG5leHQsIGhvb2tzICkgewoJCQl2YXIgdGltZW91dCA9IHNldFRpbWVvdXQoIG5leHQsIHRpbWUgKTsKCQkJaG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkgewoJCQkJY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7CgkJCX07CgkJfSk7Cgl9LAoJY2xlYXJRdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7CgkJcmV0dXJuIHRoaXMucXVldWUoIHR5cGUgfHwgImZ4IiwgW10gKTsKCX0sCgkvLyBHZXQgYSBwcm9taXNlIHJlc29sdmVkIHdoZW4gcXVldWVzIG9mIGEgY2VydGFpbiB0eXBlCgkvLyBhcmUgZW1wdGllZCAoZnggaXMgdGhlIHR5cGUgYnkgZGVmYXVsdCkKCXByb21pc2U6IGZ1bmN0aW9uKCB0eXBlLCBvYmogKSB7CgkJdmFyIHRtcCwKCQkJY291bnQgPSAxLAoJCQlkZWZlciA9IGpRdWVyeS5EZWZlcnJlZCgpLAoJCQllbGVtZW50cyA9IHRoaXMsCgkJCWkgPSB0aGlzLmxlbmd0aCwKCQkJcmVzb2x2ZSA9IGZ1bmN0aW9uKCkgewoJCQkJaWYgKCAhKCAtLWNvdW50ICkgKSB7CgkJCQkJZGVmZXIucmVzb2x2ZVdpdGgoIGVsZW1lbnRzLCBbIGVsZW1lbnRzIF0gKTsKCQkJCX0KCQkJfTsKCgkJaWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7CgkJCW9iaiA9IHR5cGU7CgkJCXR5cGUgPSB1bmRlZmluZWQ7CgkJfQoJCXR5cGUgPSB0eXBlIHx8ICJmeCI7CgoJCXdoaWxlKCBpLS0gKSB7CgkJCXRtcCA9IGpRdWVyeS5fZGF0YSggZWxlbWVudHNbIGkgXSwgdHlwZSArICJxdWV1ZUhvb2tzIiApOwoJCQlpZiAoIHRtcCAmJiB0bXAuZW1wdHkgKSB7CgkJCQljb3VudCsrOwoJCQkJdG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApOwoJCQl9CgkJfQoJCXJlc29sdmUoKTsKCQlyZXR1cm4gZGVmZXIucHJvbWlzZSggb2JqICk7Cgl9Cn0pOwp2YXIgbm9kZUhvb2ssIGJvb2xIb29rLCBmaXhTcGVjaWZpZWQsCglyY2xhc3MgPSAvW1x0XHJcbl0vZywKCXJyZXR1cm4gPSAvXHIvZywKCXJ0eXBlID0gL14oPzpidXR0b258aW5wdXQpJC9pLAoJcmZvY3VzYWJsZSA9IC9eKD86YnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpJC9pLAoJcmNsaWNrYWJsZSA9IC9eYSg/OnJlYXwpJC9pLAoJcmJvb2xlYW4gPSAvXig/OmF1dG9mb2N1c3xhdXRvcGxheXxhc3luY3xjaGVja2VkfGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkfHNlbGVjdGVkKSQvaSwKCWdldFNldEF0dHJpYnV0ZSA9IGpRdWVyeS5zdXBwb3J0LmdldFNldEF0dHJpYnV0ZTsKCmpRdWVyeS5mbi5leHRlbmQoewoJYXR0cjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkgewoJCXJldHVybiBqUXVlcnkuYWNjZXNzKCB0aGlzLCBqUXVlcnkuYXR0ciwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7Cgl9LAoKCXJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkgewoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5yZW1vdmVBdHRyKCB0aGlzLCBuYW1lICk7CgkJfSk7Cgl9LAoKCXByb3A6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgalF1ZXJ5LnByb3AsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApOwoJfSwKCglyZW1vdmVQcm9wOiBmdW5jdGlvbiggbmFtZSApIHsKCQluYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lOwoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCS8vIHRyeS9jYXRjaCBoYW5kbGVzIGNhc2VzIHdoZXJlIElFIGJhbGtzIChzdWNoIGFzIHJlbW92aW5nIGEgcHJvcGVydHkgb24gd2luZG93KQoJCQl0cnkgewoJCQkJdGhpc1sgbmFtZSBdID0gdW5kZWZpbmVkOwoJCQkJZGVsZXRlIHRoaXNbIG5hbWUgXTsKCQkJfSBjYXRjaCggZSApIHt9CgkJfSk7Cgl9LAoKCWFkZENsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGNsYXNzTmFtZXMsIGksIGwsIGVsZW0sCgkJCXNldENsYXNzLCBjLCBjbDsKCgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaiApIHsKCQkJCWpRdWVyeSggdGhpcyApLmFkZENsYXNzKCB2YWx1ZS5jYWxsKHRoaXMsIGosIHRoaXMuY2xhc3NOYW1lKSApOwoJCQl9KTsKCQl9CgoJCWlmICggdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiApIHsKCQkJY2xhc3NOYW1lcyA9IHZhbHVlLnNwbGl0KCBjb3JlX3JzcGFjZSApOwoKCQkJZm9yICggaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJCWVsZW0gPSB0aGlzWyBpIF07CgoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCWlmICggIWVsZW0uY2xhc3NOYW1lICYmIGNsYXNzTmFtZXMubGVuZ3RoID09PSAxICkgewoJCQkJCQllbGVtLmNsYXNzTmFtZSA9IHZhbHVlOwoKCQkJCQl9IGVsc2UgewoJCQkJCQlzZXRDbGFzcyA9ICIgIiArIGVsZW0uY2xhc3NOYW1lICsgIiAiOwoKCQkJCQkJZm9yICggYyA9IDAsIGNsID0gY2xhc3NOYW1lcy5sZW5ndGg7IGMgPCBjbDsgYysrICkgewoJCQkJCQkJaWYgKCBzZXRDbGFzcy5pbmRleE9mKCAiICIgKyBjbGFzc05hbWVzWyBjIF0gKyAiICIgKSA8IDAgKSB7CgkJCQkJCQkJc2V0Q2xhc3MgKz0gY2xhc3NOYW1lc1sgYyBdICsgIiAiOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWVsZW0uY2xhc3NOYW1lID0galF1ZXJ5LnRyaW0oIHNldENsYXNzICk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJcmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQl2YXIgcmVtb3ZlcywgY2xhc3NOYW1lLCBlbGVtLCBjLCBjbCwgaSwgbDsKCgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaiApIHsKCQkJCWpRdWVyeSggdGhpcyApLnJlbW92ZUNsYXNzKCB2YWx1ZS5jYWxsKHRoaXMsIGosIHRoaXMuY2xhc3NOYW1lKSApOwoJCQl9KTsKCQl9CgkJaWYgKCAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIikgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKCQkJcmVtb3ZlcyA9ICggdmFsdWUgfHwgIiIgKS5zcGxpdCggY29yZV9yc3BhY2UgKTsKCgkJCWZvciAoIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQllbGVtID0gdGhpc1sgaSBdOwoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmIGVsZW0uY2xhc3NOYW1lICkgewoKCQkJCQljbGFzc05hbWUgPSAoIiAiICsgZWxlbS5jbGFzc05hbWUgKyAiICIpLnJlcGxhY2UoIHJjbGFzcywgIiAiICk7CgoJCQkJCS8vIGxvb3Agb3ZlciBlYWNoIGl0ZW0gaW4gdGhlIHJlbW92YWwgbGlzdAoJCQkJCWZvciAoIGMgPSAwLCBjbCA9IHJlbW92ZXMubGVuZ3RoOyBjIDwgY2w7IGMrKyApIHsKCQkJCQkJLy8gUmVtb3ZlIHVudGlsIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmVtb3ZlLAoJCQkJCQl3aGlsZSAoIGNsYXNzTmFtZS5pbmRleE9mKCIgIiArIHJlbW92ZXNbIGMgXSArICIgIikgPj0gMCApIHsKCQkJCQkJCWNsYXNzTmFtZSA9IGNsYXNzTmFtZS5yZXBsYWNlKCAiICIgKyByZW1vdmVzWyBjIF0gKyAiICIgLCAiICIgKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQllbGVtLmNsYXNzTmFtZSA9IHZhbHVlID8galF1ZXJ5LnRyaW0oIGNsYXNzTmFtZSApIDogIiI7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgl0b2dnbGVDbGFzczogZnVuY3Rpb24oIHZhbHVlLCBzdGF0ZVZhbCApIHsKCQl2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZSwKCQkJaXNCb29sID0gdHlwZW9mIHN0YXRlVmFsID09PSAiYm9vbGVhbiI7CgoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcyggdmFsdWUuY2FsbCh0aGlzLCBpLCB0aGlzLmNsYXNzTmFtZSwgc3RhdGVWYWwpLCBzdGF0ZVZhbCApOwoJCQl9KTsKCQl9CgoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCWlmICggdHlwZSA9PT0gInN0cmluZyIgKSB7CgkJCQkvLyB0b2dnbGUgaW5kaXZpZHVhbCBjbGFzcyBuYW1lcwoJCQkJdmFyIGNsYXNzTmFtZSwKCQkJCQlpID0gMCwKCQkJCQlzZWxmID0galF1ZXJ5KCB0aGlzICksCgkJCQkJc3RhdGUgPSBzdGF0ZVZhbCwKCQkJCQljbGFzc05hbWVzID0gdmFsdWUuc3BsaXQoIGNvcmVfcnNwYWNlICk7CgoJCQkJd2hpbGUgKCAoY2xhc3NOYW1lID0gY2xhc3NOYW1lc1sgaSsrIF0pICkgewoJCQkJCS8vIGNoZWNrIGVhY2ggY2xhc3NOYW1lIGdpdmVuLCBzcGFjZSBzZXBhcmF0ZWQgbGlzdAoJCQkJCXN0YXRlID0gaXNCb29sID8gc3RhdGUgOiAhc2VsZi5oYXNDbGFzcyggY2xhc3NOYW1lICk7CgkJCQkJc2VsZlsgc3RhdGUgPyAiYWRkQ2xhc3MiIDogInJlbW92ZUNsYXNzIiBdKCBjbGFzc05hbWUgKTsKCQkJCX0KCgkJCX0gZWxzZSBpZiAoIHR5cGUgPT09ICJ1bmRlZmluZWQiIHx8IHR5cGUgPT09ICJib29sZWFuIiApIHsKCQkJCWlmICggdGhpcy5jbGFzc05hbWUgKSB7CgkJCQkJLy8gc3RvcmUgY2xhc3NOYW1lIGlmIHNldAoJCQkJCWpRdWVyeS5fZGF0YSggdGhpcywgIl9fY2xhc3NOYW1lX18iLCB0aGlzLmNsYXNzTmFtZSApOwoJCQkJfQoKCQkJCS8vIHRvZ2dsZSB3aG9sZSBjbGFzc05hbWUKCQkJCXRoaXMuY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWUgfHwgdmFsdWUgPT09IGZhbHNlID8gIiIgOiBqUXVlcnkuX2RhdGEoIHRoaXMsICJfX2NsYXNzTmFtZV9fIiApIHx8ICIiOwoJCQl9CgkJfSk7Cgl9LAoKCWhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJdmFyIGNsYXNzTmFtZSA9ICIgIiArIHNlbGVjdG9yICsgIiAiLAoJCQlpID0gMCwKCQkJbCA9IHRoaXMubGVuZ3RoOwoJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKCQkJaWYgKCB0aGlzW2ldLm5vZGVUeXBlID09PSAxICYmICgiICIgKyB0aGlzW2ldLmNsYXNzTmFtZSArICIgIikucmVwbGFjZShyY2xhc3MsICIgIikuaW5kZXhPZiggY2xhc3NOYW1lICkgPj0gMCApIHsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJfQoKCQlyZXR1cm4gZmFsc2U7Cgl9LAoKCXZhbDogZnVuY3Rpb24oIHZhbHVlICkgewoJCXZhciBob29rcywgcmV0LCBpc0Z1bmN0aW9uLAoJCQllbGVtID0gdGhpc1swXTsKCgkJaWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHsKCQkJaWYgKCBlbGVtICkgewoJCQkJaG9va3MgPSBqUXVlcnkudmFsSG9va3NbIGVsZW0udHlwZSBdIHx8IGpRdWVyeS52YWxIb29rc1sgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCQkJaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBlbGVtLCAidmFsdWUiICkpICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIHJldDsKCQkJCX0KCgkJCQlyZXQgPSBlbGVtLnZhbHVlOwoKCQkJCXJldHVybiB0eXBlb2YgcmV0ID09PSAic3RyaW5nIiA/CgkJCQkJLy8gaGFuZGxlIG1vc3QgY29tbW9uIHN0cmluZyBjYXNlcwoJCQkJCXJldC5yZXBsYWNlKHJyZXR1cm4sICIiKSA6CgkJCQkJLy8gaGFuZGxlIGNhc2VzIHdoZXJlIHZhbHVlIGlzIG51bGwvdW5kZWYgb3IgbnVtYmVyCgkJCQkJcmV0ID09IG51bGwgPyAiIiA6IHJldDsKCQkJfQoKCQkJcmV0dXJuOwoJCX0KCgkJaXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApOwoKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkgewoJCQl2YXIgdmFsLAoJCQkJc2VsZiA9IGpRdWVyeSh0aGlzKTsKCgkJCWlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKCBpc0Z1bmN0aW9uICkgewoJCQkJdmFsID0gdmFsdWUuY2FsbCggdGhpcywgaSwgc2VsZi52YWwoKSApOwoJCQl9IGVsc2UgewoJCQkJdmFsID0gdmFsdWU7CgkJCX0KCgkJCS8vIFRyZWF0IG51bGwvdW5kZWZpbmVkIGFzICIiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nCgkJCWlmICggdmFsID09IG51bGwgKSB7CgkJCQl2YWwgPSAiIjsKCQkJfSBlbHNlIGlmICggdHlwZW9mIHZhbCA9PT0gIm51bWJlciIgKSB7CgkJCQl2YWwgKz0gIiI7CgkJCX0gZWxzZSBpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWwgKSApIHsKCQkJCXZhbCA9IGpRdWVyeS5tYXAodmFsLCBmdW5jdGlvbiAoIHZhbHVlICkgewoJCQkJCXJldHVybiB2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZSArICIiOwoJCQkJfSk7CgkJCX0KCgkJCWhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyB0aGlzLnR5cGUgXSB8fCBqUXVlcnkudmFsSG9va3NbIHRoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdOwoKCQkJLy8gSWYgc2V0IHJldHVybnMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmcKCQkJaWYgKCAhaG9va3MgfHwgISgic2V0IiBpbiBob29rcykgfHwgaG9va3Muc2V0KCB0aGlzLCB2YWwsICJ2YWx1ZSIgKSA9PT0gdW5kZWZpbmVkICkgewoJCQkJdGhpcy52YWx1ZSA9IHZhbDsKCQkJfQoJCX0pOwoJfQp9KTsKCmpRdWVyeS5leHRlbmQoewoJdmFsSG9va3M6IHsKCQlvcHRpb246IHsKCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCS8vIGF0dHJpYnV0ZXMudmFsdWUgaXMgdW5kZWZpbmVkIGluIEJsYWNrYmVycnkgNC43IGJ1dAoJCQkJLy8gdXNlcyAudmFsdWUuIFNlZSAjNjkzMgoJCQkJdmFyIHZhbCA9IGVsZW0uYXR0cmlidXRlcy52YWx1ZTsKCQkJCXJldHVybiAhdmFsIHx8IHZhbC5zcGVjaWZpZWQgPyBlbGVtLnZhbHVlIDogZWxlbS50ZXh0OwoJCQl9CgkJfSwKCQlzZWxlY3Q6IHsKCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXZhciB2YWx1ZSwgaSwgbWF4LCBvcHRpb24sCgkJCQkJaW5kZXggPSBlbGVtLnNlbGVjdGVkSW5kZXgsCgkJCQkJdmFsdWVzID0gW10sCgkJCQkJb3B0aW9ucyA9IGVsZW0ub3B0aW9ucywKCQkJCQlvbmUgPSBlbGVtLnR5cGUgPT09ICJzZWxlY3Qtb25lIjsKCgkJCQkvLyBOb3RoaW5nIHdhcyBzZWxlY3RlZAoJCQkJaWYgKCBpbmRleCA8IDAgKSB7CgkJCQkJcmV0dXJuIG51bGw7CgkJCQl9CgoJCQkJLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgc2VsZWN0ZWQgb3B0aW9ucwoJCQkJaSA9IG9uZSA/IGluZGV4IDogMDsKCQkJCW1heCA9IG9uZSA/IGluZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3RoOwoJCQkJZm9yICggOyBpIDwgbWF4OyBpKysgKSB7CgkJCQkJb3B0aW9uID0gb3B0aW9uc1sgaSBdOwoKCQkJCQkvLyBEb24ndCByZXR1cm4gb3B0aW9ucyB0aGF0IGFyZSBkaXNhYmxlZCBvciBpbiBhIGRpc2FibGVkIG9wdGdyb3VwCgkJCQkJaWYgKCBvcHRpb24uc2VsZWN0ZWQgJiYgKGpRdWVyeS5zdXBwb3J0Lm9wdERpc2FibGVkID8gIW9wdGlvbi5kaXNhYmxlZCA6IG9wdGlvbi5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikgPT09IG51bGwpICYmCgkJCQkJCQkoIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8ICFqUXVlcnkubm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCAib3B0Z3JvdXAiICkpICkgewoKCQkJCQkJLy8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvbgoJCQkJCQl2YWx1ZSA9IGpRdWVyeSggb3B0aW9uICkudmFsKCk7CgoJCQkJCQkvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0cwoJCQkJCQlpZiAoIG9uZSApIHsKCQkJCQkJCXJldHVybiB2YWx1ZTsKCQkJCQkJfQoKCQkJCQkJLy8gTXVsdGktU2VsZWN0cyByZXR1cm4gYW4gYXJyYXkKCQkJCQkJdmFsdWVzLnB1c2goIHZhbHVlICk7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIEZpeGVzIEJ1ZyAjMjU1MSAtLSBzZWxlY3QudmFsKCkgYnJva2VuIGluIElFIGFmdGVyIGZvcm0ucmVzZXQoKQoJCQkJaWYgKCBvbmUgJiYgIXZhbHVlcy5sZW5ndGggJiYgb3B0aW9ucy5sZW5ndGggKSB7CgkJCQkJcmV0dXJuIGpRdWVyeSggb3B0aW9uc1sgaW5kZXggXSApLnZhbCgpOwoJCQkJfQoKCQkJCXJldHVybiB2YWx1ZXM7CgkJCX0sCgoJCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKCQkJCXZhciB2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApOwoKCQkJCWpRdWVyeShlbGVtKS5maW5kKCJvcHRpb24iKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJCXRoaXMuc2VsZWN0ZWQgPSBqUXVlcnkuaW5BcnJheSggalF1ZXJ5KHRoaXMpLnZhbCgpLCB2YWx1ZXMgKSA+PSAwOwoJCQkJfSk7CgoJCQkJaWYgKCAhdmFsdWVzLmxlbmd0aCApIHsKCQkJCQllbGVtLnNlbGVjdGVkSW5kZXggPSAtMTsKCQkJCX0KCQkJCXJldHVybiB2YWx1ZXM7CgkJCX0KCQl9Cgl9LAoKCS8vIFVudXNlZCBpbiAxLjgsIGxlZnQgaW4gc28gYXR0ckZuLXN0YWJiZXJzIHdvbid0IGRpZTsgcmVtb3ZlIGluIDEuOQoJYXR0ckZuOiB7fSwKCglhdHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUsIHBhc3MgKSB7CgkJdmFyIHJldCwgaG9va3MsIG5vdHhtbCwKCQkJblR5cGUgPSBlbGVtLm5vZGVUeXBlOwoKCQkvLyBkb24ndCBnZXQvc2V0IGF0dHJpYnV0ZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzCgkJaWYgKCAhZWxlbSB8fCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCBwYXNzICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBqUXVlcnkuZm5bIG5hbWUgXSApICkgewoJCQlyZXR1cm4galF1ZXJ5KCBlbGVtIClbIG5hbWUgXSggdmFsdWUgKTsKCQl9CgoJCS8vIEZhbGxiYWNrIHRvIHByb3Agd2hlbiBhdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkCgkJaWYgKCB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUgPT09ICJ1bmRlZmluZWQiICkgewoJCQlyZXR1cm4galF1ZXJ5LnByb3AoIGVsZW0sIG5hbWUsIHZhbHVlICk7CgkJfQoKCQlub3R4bWwgPSBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICk7CgoJCS8vIEFsbCBhdHRyaWJ1dGVzIGFyZSBsb3dlcmNhc2UKCQkvLyBHcmFiIG5lY2Vzc2FyeSBob29rIGlmIG9uZSBpcyBkZWZpbmVkCgkJaWYgKCBub3R4bWwgKSB7CgkJCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CgkJCWhvb2tzID0galF1ZXJ5LmF0dHJIb29rc1sgbmFtZSBdIHx8ICggcmJvb2xlYW4udGVzdCggbmFtZSApID8gYm9vbEhvb2sgOiBub2RlSG9vayApOwoJCX0KCgkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewoKCQkJaWYgKCB2YWx1ZSA9PT0gbnVsbCApIHsKCQkJCWpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7CgkJCQlyZXR1cm47CgoJCQl9IGVsc2UgaWYgKCBob29rcyAmJiAic2V0IiBpbiBob29rcyAmJiBub3R4bWwgJiYgKHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSkgIT09IHVuZGVmaW5lZCApIHsKCQkJCXJldHVybiByZXQ7CgoJCQl9IGVsc2UgewoJCQkJZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIHZhbHVlICsgIiIgKTsKCQkJCXJldHVybiB2YWx1ZTsKCQkJfQoKCQl9IGVsc2UgaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyAmJiBub3R4bWwgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApKSAhPT0gbnVsbCApIHsKCQkJcmV0dXJuIHJldDsKCgkJfSBlbHNlIHsKCgkJCXJldCA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7CgoJCQkvLyBOb24tZXhpc3RlbnQgYXR0cmlidXRlcyByZXR1cm4gbnVsbCwgd2Ugbm9ybWFsaXplIHRvIHVuZGVmaW5lZAoJCQlyZXR1cm4gcmV0ID09PSBudWxsID8KCQkJCXVuZGVmaW5lZCA6CgkJCQlyZXQ7CgkJfQoJfSwKCglyZW1vdmVBdHRyOiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJdmFyIHByb3BOYW1lLCBhdHRyTmFtZXMsIG5hbWUsIGlzQm9vbCwKCQkJaSA9IDA7CgoJCWlmICggdmFsdWUgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCgkJCWF0dHJOYW1lcyA9IHZhbHVlLnNwbGl0KCBjb3JlX3JzcGFjZSApOwoKCQkJZm9yICggOyBpIDwgYXR0ck5hbWVzLmxlbmd0aDsgaSsrICkgewoJCQkJbmFtZSA9IGF0dHJOYW1lc1sgaSBdOwoKCQkJCWlmICggbmFtZSApIHsKCQkJCQlwcm9wTmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKCQkJCQlpc0Jvb2wgPSByYm9vbGVhbi50ZXN0KCBuYW1lICk7CgoJCQkJCS8vIFNlZSAjOTY5OSBmb3IgZXhwbGFuYXRpb24gb2YgdGhpcyBhcHByb2FjaCAoc2V0dGluZyBmaXJzdCwgdGhlbiByZW1vdmFsKQoJCQkJCS8vIERvIG5vdCBkbyB0aGlzIGZvciBib29sZWFuIGF0dHJpYnV0ZXMgKHNlZSAjMTA4NzApCgkJCQkJaWYgKCAhaXNCb29sICkgewoJCQkJCQlqUXVlcnkuYXR0ciggZWxlbSwgbmFtZSwgIiIgKTsKCQkJCQl9CgkJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIGdldFNldEF0dHJpYnV0ZSA/IG5hbWUgOiBwcm9wTmFtZSApOwoKCQkJCQkvLyBTZXQgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB0byBmYWxzZSBmb3IgYm9vbGVhbiBhdHRyaWJ1dGVzCgkJCQkJaWYgKCBpc0Jvb2wgJiYgcHJvcE5hbWUgaW4gZWxlbSApIHsKCQkJCQkJZWxlbVsgcHJvcE5hbWUgXSA9IGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0sCgoJYXR0ckhvb2tzOiB7CgkJdHlwZTogewoJCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKCQkJCS8vIFdlIGNhbid0IGFsbG93IHRoZSB0eXBlIHByb3BlcnR5IHRvIGJlIGNoYW5nZWQgKHNpbmNlIGl0IGNhdXNlcyBwcm9ibGVtcyBpbiBJRSkKCQkJCWlmICggcnR5cGUudGVzdCggZWxlbS5ub2RlTmFtZSApICYmIGVsZW0ucGFyZW50Tm9kZSApIHsKCQkJCQlqUXVlcnkuZXJyb3IoICJ0eXBlIHByb3BlcnR5IGNhbid0IGJlIGNoYW5nZWQiICk7CgkJCQl9IGVsc2UgaWYgKCAhalF1ZXJ5LnN1cHBvcnQucmFkaW9WYWx1ZSAmJiB2YWx1ZSA9PT0gInJhZGlvIiAmJiBqUXVlcnkubm9kZU5hbWUoZWxlbSwgImlucHV0IikgKSB7CgkJCQkJLy8gU2V0dGluZyB0aGUgdHlwZSBvbiBhIHJhZGlvIGJ1dHRvbiBhZnRlciB0aGUgdmFsdWUgcmVzZXRzIHRoZSB2YWx1ZSBpbiBJRTYtOQoJCQkJCS8vIFJlc2V0IHZhbHVlIHRvIGl0J3MgZGVmYXVsdCBpbiBjYXNlIHR5cGUgaXMgc2V0IGFmdGVyIHZhbHVlCgkJCQkJLy8gVGhpcyBpcyBmb3IgZWxlbWVudCBjcmVhdGlvbgoJCQkJCXZhciB2YWwgPSBlbGVtLnZhbHVlOwoJCQkJCWVsZW0uc2V0QXR0cmlidXRlKCAidHlwZSIsIHZhbHVlICk7CgkJCQkJaWYgKCB2YWwgKSB7CgkJCQkJCWVsZW0udmFsdWUgPSB2YWw7CgkJCQkJfQoJCQkJCXJldHVybiB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0sCgkJLy8gVXNlIHRoZSB2YWx1ZSBwcm9wZXJ0eSBmb3IgYmFjayBjb21wYXQKCQkvLyBVc2UgdGhlIG5vZGVIb29rIGZvciBidXR0b24gZWxlbWVudHMgaW4gSUU2LzcgKCMxOTU0KQoJCXZhbHVlOiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkJCQlpZiAoIG5vZGVIb29rICYmIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImJ1dHRvbiIgKSApIHsKCQkJCQlyZXR1cm4gbm9kZUhvb2suZ2V0KCBlbGVtLCBuYW1lICk7CgkJCQl9CgkJCQlyZXR1cm4gbmFtZSBpbiBlbGVtID8KCQkJCQllbGVtLnZhbHVlIDoKCQkJCQludWxsOwoJCQl9LAoJCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHsKCQkJCWlmICggbm9kZUhvb2sgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiYnV0dG9uIiApICkgewoJCQkJCXJldHVybiBub2RlSG9vay5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICk7CgkJCQl9CgkJCQkvLyBEb2VzIG5vdCByZXR1cm4gc28gdGhhdCBzZXRBdHRyaWJ1dGUgaXMgYWxzbyB1c2VkCgkJCQllbGVtLnZhbHVlID0gdmFsdWU7CgkJCX0KCQl9Cgl9LAoKCXByb3BGaXg6IHsKCQl0YWJpbmRleDogInRhYkluZGV4IiwKCQlyZWFkb25seTogInJlYWRPbmx5IiwKCQkiZm9yIjogImh0bWxGb3IiLAoJCSJjbGFzcyI6ICJjbGFzc05hbWUiLAoJCW1heGxlbmd0aDogIm1heExlbmd0aCIsCgkJY2VsbHNwYWNpbmc6ICJjZWxsU3BhY2luZyIsCgkJY2VsbHBhZGRpbmc6ICJjZWxsUGFkZGluZyIsCgkJcm93c3BhbjogInJvd1NwYW4iLAoJCWNvbHNwYW46ICJjb2xTcGFuIiwKCQl1c2VtYXA6ICJ1c2VNYXAiLAoJCWZyYW1lYm9yZGVyOiAiZnJhbWVCb3JkZXIiLAoJCWNvbnRlbnRlZGl0YWJsZTogImNvbnRlbnRFZGl0YWJsZSIKCX0sCgoJcHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewoJCXZhciByZXQsIGhvb2tzLCBub3R4bWwsCgkJCW5UeXBlID0gZWxlbS5ub2RlVHlwZTsKCgkJLy8gZG9uJ3QgZ2V0L3NldCBwcm9wZXJ0aWVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2RlcwoJCWlmICggIWVsZW0gfHwgblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7CgkJCXJldHVybjsKCQl9CgoJCW5vdHhtbCA9IG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKTsKCgkJaWYgKCBub3R4bWwgKSB7CgkJCS8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3MKCQkJbmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKCQkJaG9va3MgPSBqUXVlcnkucHJvcEhvb2tzWyBuYW1lIF07CgkJfQoKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCWlmICggaG9va3MgJiYgInNldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSkgIT09IHVuZGVmaW5lZCApIHsKCQkJCXJldHVybiByZXQ7CgoJCQl9IGVsc2UgewoJCQkJcmV0dXJuICggZWxlbVsgbmFtZSBdID0gdmFsdWUgKTsKCQkJfQoKCQl9IGVsc2UgewoJCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwgKSB7CgkJCQlyZXR1cm4gcmV0OwoKCQkJfSBlbHNlIHsKCQkJCXJldHVybiBlbGVtWyBuYW1lIF07CgkJCX0KCQl9Cgl9LAoKCXByb3BIb29rczogewoJCXRhYkluZGV4OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkvLyBlbGVtLnRhYkluZGV4IGRvZXNuJ3QgYWx3YXlzIHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSB3aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0CgkJCQkvLyBodHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0LwoJCQkJdmFyIGF0dHJpYnV0ZU5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoInRhYmluZGV4Iik7CgoJCQkJcmV0dXJuIGF0dHJpYnV0ZU5vZGUgJiYgYXR0cmlidXRlTm9kZS5zcGVjaWZpZWQgPwoJCQkJCXBhcnNlSW50KCBhdHRyaWJ1dGVOb2RlLnZhbHVlLCAxMCApIDoKCQkJCQlyZm9jdXNhYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSB8fCByY2xpY2thYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJiBlbGVtLmhyZWYgPwoJCQkJCQkwIDoKCQkJCQkJdW5kZWZpbmVkOwoJCQl9CgkJfQoJfQp9KTsKCi8vIEhvb2sgZm9yIGJvb2xlYW4gYXR0cmlidXRlcwpib29sSG9vayA9IHsKCWdldDogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkJLy8gQWxpZ24gYm9vbGVhbiBhdHRyaWJ1dGVzIHdpdGggY29ycmVzcG9uZGluZyBwcm9wZXJ0aWVzCgkJLy8gRmFsbCBiYWNrIHRvIGF0dHJpYnV0ZSBwcmVzZW5jZSB3aGVyZSBzb21lIGJvb2xlYW5zIGFyZSBub3Qgc3VwcG9ydGVkCgkJdmFyIGF0dHJOb2RlLAoJCQlwcm9wZXJ0eSA9IGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lICk7CgkJcmV0dXJuIHByb3BlcnR5ID09PSB0cnVlIHx8IHR5cGVvZiBwcm9wZXJ0eSAhPT0gImJvb2xlYW4iICYmICggYXR0ck5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUobmFtZSkgKSAmJiBhdHRyTm9kZS5ub2RlVmFsdWUgIT09IGZhbHNlID8KCQkJbmFtZS50b0xvd2VyQ2FzZSgpIDoKCQkJdW5kZWZpbmVkOwoJfSwKCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgewoJCXZhciBwcm9wTmFtZTsKCQlpZiAoIHZhbHVlID09PSBmYWxzZSApIHsKCQkJLy8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZQoJCQlqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOwoJCX0gZWxzZSB7CgkJCS8vIHZhbHVlIGlzIHRydWUgc2luY2Ugd2Uga25vdyBhdCB0aGlzIHBvaW50IGl0J3MgdHlwZSBib29sZWFuIGFuZCBub3QgZmFsc2UKCQkJLy8gU2V0IGJvb2xlYW4gYXR0cmlidXRlcyB0byB0aGUgc2FtZSBuYW1lIGFuZCBzZXQgdGhlIERPTSBwcm9wZXJ0eQoJCQlwcm9wTmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKCQkJaWYgKCBwcm9wTmFtZSBpbiBlbGVtICkgewoJCQkJLy8gT25seSBzZXQgdGhlIElETCBzcGVjaWZpY2FsbHkgaWYgaXQgYWxyZWFkeSBleGlzdHMgb24gdGhlIGVsZW1lbnQKCQkJCWVsZW1bIHByb3BOYW1lIF0gPSB0cnVlOwoJCQl9CgoJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgbmFtZS50b0xvd2VyQ2FzZSgpICk7CgkJfQoJCXJldHVybiBuYW1lOwoJfQp9OwoKLy8gSUU2LzcgZG8gbm90IHN1cHBvcnQgZ2V0dGluZy9zZXR0aW5nIHNvbWUgYXR0cmlidXRlcyB3aXRoIGdldC9zZXRBdHRyaWJ1dGUKaWYgKCAhZ2V0U2V0QXR0cmlidXRlICkgewoKCWZpeFNwZWNpZmllZCA9IHsKCQluYW1lOiB0cnVlLAoJCWlkOiB0cnVlLAoJCWNvb3JkczogdHJ1ZQoJfTsKCgkvLyBVc2UgdGhpcyBmb3IgYW55IGF0dHJpYnV0ZSBpbiBJRTYvNwoJLy8gVGhpcyBmaXhlcyBhbG1vc3QgZXZlcnkgSUU2LzcgaXNzdWUKCW5vZGVIb29rID0galF1ZXJ5LnZhbEhvb2tzLmJ1dHRvbiA9IHsKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCQl2YXIgcmV0OwoJCQlyZXQgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUgKTsKCQkJcmV0dXJuIHJldCAmJiAoIGZpeFNwZWNpZmllZFsgbmFtZSBdID8gcmV0LnZhbHVlICE9PSAiIiA6IHJldC5zcGVjaWZpZWQgKSA/CgkJCQlyZXQudmFsdWUgOgoJCQkJdW5kZWZpbmVkOwoJCX0sCgkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7CgkJCS8vIFNldCB0aGUgZXhpc3Rpbmcgb3IgY3JlYXRlIGEgbmV3IGF0dHJpYnV0ZSBub2RlCgkJCXZhciByZXQgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUgKTsKCQkJaWYgKCAhcmV0ICkgewoJCQkJcmV0ID0gZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKCBuYW1lICk7CgkJCQllbGVtLnNldEF0dHJpYnV0ZU5vZGUoIHJldCApOwoJCQl9CgkJCXJldHVybiAoIHJldC52YWx1ZSA9IHZhbHVlICsgIiIgKTsKCQl9Cgl9OwoKCS8vIFNldCB3aWR0aCBhbmQgaGVpZ2h0IHRvIGF1dG8gaW5zdGVhZCBvZiAwIG9uIGVtcHR5IHN0cmluZyggQnVnICM4MTUwICkKCS8vIFRoaXMgaXMgZm9yIHJlbW92YWxzCglqUXVlcnkuZWFjaChbICJ3aWR0aCIsICJoZWlnaHQiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgewoJCWpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSwgewoJCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKCQkJCWlmICggdmFsdWUgPT09ICIiICkgewoJCQkJCWVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCAiYXV0byIgKTsKCQkJCQlyZXR1cm4gdmFsdWU7CgkJCQl9CgkJCX0KCQl9KTsKCX0pOwoKCS8vIFNldCBjb250ZW50ZWRpdGFibGUgdG8gZmFsc2Ugb24gcmVtb3ZhbHMoIzEwNDI5KQoJLy8gU2V0dGluZyB0byBlbXB0eSBzdHJpbmcgdGhyb3dzIGFuIGVycm9yIGFzIGFuIGludmFsaWQgdmFsdWUKCWpRdWVyeS5hdHRySG9va3MuY29udGVudGVkaXRhYmxlID0gewoJCWdldDogbm9kZUhvb2suZ2V0LAoJCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgewoJCQlpZiAoIHZhbHVlID09PSAiIiApIHsKCQkJCXZhbHVlID0gImZhbHNlIjsKCQkJfQoJCQlub2RlSG9vay5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICk7CgkJfQoJfTsKfQoKCi8vIFNvbWUgYXR0cmlidXRlcyByZXF1aXJlIGEgc3BlY2lhbCBjYWxsIG9uIElFCmlmICggIWpRdWVyeS5zdXBwb3J0LmhyZWZOb3JtYWxpemVkICkgewoJalF1ZXJ5LmVhY2goWyAiaHJlZiIsICJzcmMiLCAid2lkdGgiLCAiaGVpZ2h0IiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCQlqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0sIHsKCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXZhciByZXQgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgMiApOwoJCQkJcmV0dXJuIHJldCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJldDsKCQkJfQoJCX0pOwoJfSk7Cn0KCmlmICggIWpRdWVyeS5zdXBwb3J0LnN0eWxlICkgewoJalF1ZXJ5LmF0dHJIb29rcy5zdHlsZSA9IHsKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkvLyBSZXR1cm4gdW5kZWZpbmVkIGluIHRoZSBjYXNlIG9mIGVtcHR5IHN0cmluZwoJCQkvLyBOb3JtYWxpemUgdG8gbG93ZXJjYXNlIHNpbmNlIElFIHVwcGVyY2FzZXMgY3NzIHByb3BlcnR5IG5hbWVzCgkJCXJldHVybiBlbGVtLnN0eWxlLmNzc1RleHQudG9Mb3dlckNhc2UoKSB8fCB1bmRlZmluZWQ7CgkJfSwKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKCQkJcmV0dXJuICggZWxlbS5zdHlsZS5jc3NUZXh0ID0gdmFsdWUgKyAiIiApOwoJCX0KCX07Cn0KCi8vIFNhZmFyaSBtaXMtcmVwb3J0cyB0aGUgZGVmYXVsdCBzZWxlY3RlZCBwcm9wZXJ0eSBvZiBhbiBvcHRpb24KLy8gQWNjZXNzaW5nIHRoZSBwYXJlbnQncyBzZWxlY3RlZEluZGV4IHByb3BlcnR5IGZpeGVzIGl0CmlmICggIWpRdWVyeS5zdXBwb3J0Lm9wdFNlbGVjdGVkICkgewoJalF1ZXJ5LnByb3BIb29rcy5zZWxlY3RlZCA9IGpRdWVyeS5leHRlbmQoIGpRdWVyeS5wcm9wSG9va3Muc2VsZWN0ZWQsIHsKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQl2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlOwoKCQkJaWYgKCBwYXJlbnQgKSB7CgkJCQlwYXJlbnQuc2VsZWN0ZWRJbmRleDsKCgkJCQkvLyBNYWtlIHN1cmUgdGhhdCBpdCBhbHNvIHdvcmtzIHdpdGggb3B0Z3JvdXBzLCBzZWUgIzU3MDEKCQkJCWlmICggcGFyZW50LnBhcmVudE5vZGUgKSB7CgkJCQkJcGFyZW50LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9KTsKfQoKLy8gSUU2LzcgY2FsbCBlbmN0eXBlIGVuY29kaW5nCmlmICggIWpRdWVyeS5zdXBwb3J0LmVuY3R5cGUgKSB7CglqUXVlcnkucHJvcEZpeC5lbmN0eXBlID0gImVuY29kaW5nIjsKfQoKLy8gUmFkaW9zIGFuZCBjaGVja2JveGVzIGdldHRlci9zZXR0ZXIKaWYgKCAhalF1ZXJ5LnN1cHBvcnQuY2hlY2tPbiApIHsKCWpRdWVyeS5lYWNoKFsgInJhZGlvIiwgImNoZWNrYm94IiBdLCBmdW5jdGlvbigpIHsKCQlqUXVlcnkudmFsSG9va3NbIHRoaXMgXSA9IHsKCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCS8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBpbiBXZWJraXQgIiIgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiAib24iIGlmIGEgdmFsdWUgaXNuJ3Qgc3BlY2lmaWVkCgkJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoInZhbHVlIikgPT09IG51bGwgPyAib24iIDogZWxlbS52YWx1ZTsKCQkJfQoJCX07Cgl9KTsKfQpqUXVlcnkuZWFjaChbICJyYWRpbyIsICJjaGVja2JveCIgXSwgZnVuY3Rpb24oKSB7CglqUXVlcnkudmFsSG9va3NbIHRoaXMgXSA9IGpRdWVyeS5leHRlbmQoIGpRdWVyeS52YWxIb29rc1sgdGhpcyBdLCB7CgkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCWlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbHVlICkgKSB7CgkJCQlyZXR1cm4gKCBlbGVtLmNoZWNrZWQgPSBqUXVlcnkuaW5BcnJheSggalF1ZXJ5KGVsZW0pLnZhbCgpLCB2YWx1ZSApID49IDAgKTsKCQkJfQoJCX0KCX0pOwp9KTsKdmFyIHJmb3JtRWxlbXMgPSAvXig/OnRleHRhcmVhfGlucHV0fHNlbGVjdCkkL2ksCglydHlwZW5hbWVzcGFjZSA9IC9eKFteXC5dKnwpKD86XC4oLispfCkkLywKCXJob3ZlckhhY2sgPSAvKD86Xnxccylob3ZlcihcLlxTK3wpXGIvLAoJcmtleUV2ZW50ID0gL15rZXkvLAoJcm1vdXNlRXZlbnQgPSAvXig/Om1vdXNlfGNvbnRleHRtZW51KXxjbGljay8sCglyZm9jdXNNb3JwaCA9IC9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLywKCWhvdmVySGFjayA9IGZ1bmN0aW9uKCBldmVudHMgKSB7CgkJcmV0dXJuIGpRdWVyeS5ldmVudC5zcGVjaWFsLmhvdmVyID8gZXZlbnRzIDogZXZlbnRzLnJlcGxhY2UoIHJob3ZlckhhY2ssICJtb3VzZWVudGVyJDEgbW91c2VsZWF2ZSQxIiApOwoJfTsKCi8qCiAqIEhlbHBlciBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIGV2ZW50cyAtLSBub3QgcGFydCBvZiB0aGUgcHVibGljIGludGVyZmFjZS4KICogUHJvcHMgdG8gRGVhbiBFZHdhcmRzJyBhZGRFdmVudCBsaWJyYXJ5IGZvciBtYW55IG9mIHRoZSBpZGVhcy4KICovCmpRdWVyeS5ldmVudCA9IHsKCglhZGQ6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgZGF0YSwgc2VsZWN0b3IgKSB7CgoJCXZhciBlbGVtRGF0YSwgZXZlbnRIYW5kbGUsIGV2ZW50cywKCQkJdCwgdG5zLCB0eXBlLCBuYW1lc3BhY2VzLCBoYW5kbGVPYmosCgkJCWhhbmRsZU9iakluLCBoYW5kbGVycywgc3BlY2lhbDsKCgkJLy8gRG9uJ3QgYXR0YWNoIGV2ZW50cyB0byBub0RhdGEgb3IgdGV4dC9jb21tZW50IG5vZGVzIChhbGxvdyBwbGFpbiBvYmplY3RzIHRobykKCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCB8fCAhdHlwZXMgfHwgIWhhbmRsZXIgfHwgIShlbGVtRGF0YSA9IGpRdWVyeS5fZGF0YSggZWxlbSApKSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gQ2FsbGVyIGNhbiBwYXNzIGluIGFuIG9iamVjdCBvZiBjdXN0b20gZGF0YSBpbiBsaWV1IG9mIHRoZSBoYW5kbGVyCgkJaWYgKCBoYW5kbGVyLmhhbmRsZXIgKSB7CgkJCWhhbmRsZU9iakluID0gaGFuZGxlcjsKCQkJaGFuZGxlciA9IGhhbmRsZU9iakluLmhhbmRsZXI7CgkJCXNlbGVjdG9yID0gaGFuZGxlT2JqSW4uc2VsZWN0b3I7CgkJfQoKCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaGFuZGxlciBoYXMgYSB1bmlxdWUgSUQsIHVzZWQgdG8gZmluZC9yZW1vdmUgaXQgbGF0ZXIKCQlpZiAoICFoYW5kbGVyLmd1aWQgKSB7CgkJCWhhbmRsZXIuZ3VpZCA9IGpRdWVyeS5ndWlkKys7CgkJfQoKCQkvLyBJbml0IHRoZSBlbGVtZW50J3MgZXZlbnQgc3RydWN0dXJlIGFuZCBtYWluIGhhbmRsZXIsIGlmIHRoaXMgaXMgdGhlIGZpcnN0CgkJZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzOwoJCWlmICggIWV2ZW50cyApIHsKCQkJZWxlbURhdGEuZXZlbnRzID0gZXZlbnRzID0ge307CgkJfQoJCWV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlOwoJCWlmICggIWV2ZW50SGFuZGxlICkgewoJCQllbGVtRGF0YS5oYW5kbGUgPSBldmVudEhhbmRsZSA9IGZ1bmN0aW9uKCBlICkgewoJCQkJLy8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmQKCQkJCS8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWQKCQkJCXJldHVybiB0eXBlb2YgalF1ZXJ5ICE9PSAidW5kZWZpbmVkIiAmJiAoIWUgfHwgalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCAhPT0gZS50eXBlKSA/CgkJCQkJalF1ZXJ5LmV2ZW50LmRpc3BhdGNoLmFwcGx5KCBldmVudEhhbmRsZS5lbGVtLCBhcmd1bWVudHMgKSA6CgkJCQkJdW5kZWZpbmVkOwoJCQl9OwoJCQkvLyBBZGQgZWxlbSBhcyBhIHByb3BlcnR5IG9mIHRoZSBoYW5kbGUgZm4gdG8gcHJldmVudCBhIG1lbW9yeSBsZWFrIHdpdGggSUUgbm9uLW5hdGl2ZSBldmVudHMKCQkJZXZlbnRIYW5kbGUuZWxlbSA9IGVsZW07CgkJfQoKCQkvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlCgkJLy8galF1ZXJ5KC4uLikuYmluZCgibW91c2VvdmVyIG1vdXNlb3V0IiwgZm4pOwoJCXR5cGVzID0galF1ZXJ5LnRyaW0oIGhvdmVySGFjayh0eXBlcykgKS5zcGxpdCggIiAiICk7CgkJZm9yICggdCA9IDA7IHQgPCB0eXBlcy5sZW5ndGg7IHQrKyApIHsKCgkJCXRucyA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzW3RdICkgfHwgW107CgkJCXR5cGUgPSB0bnNbMV07CgkJCW5hbWVzcGFjZXMgPSAoIHRuc1syXSB8fCAiIiApLnNwbGl0KCAiLiIgKS5zb3J0KCk7CgoJCQkvLyBJZiBldmVudCBjaGFuZ2VzIGl0cyB0eXBlLCB1c2UgdGhlIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMgZm9yIHRoZSBjaGFuZ2VkIHR5cGUKCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307CgoJCQkvLyBJZiBzZWxlY3RvciBkZWZpbmVkLCBkZXRlcm1pbmUgc3BlY2lhbCBldmVudCBhcGkgdHlwZSwgb3RoZXJ3aXNlIGdpdmVuIHR5cGUKCQkJdHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlOwoKCQkJLy8gVXBkYXRlIHNwZWNpYWwgYmFzZWQgb24gbmV3bHkgcmVzZXQgdHlwZQoJCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKCgkJCS8vIGhhbmRsZU9iaiBpcyBwYXNzZWQgdG8gYWxsIGV2ZW50IGhhbmRsZXJzCgkJCWhhbmRsZU9iaiA9IGpRdWVyeS5leHRlbmQoewoJCQkJdHlwZTogdHlwZSwKCQkJCW9yaWdUeXBlOiB0bnNbMV0sCgkJCQlkYXRhOiBkYXRhLAoJCQkJaGFuZGxlcjogaGFuZGxlciwKCQkJCWd1aWQ6IGhhbmRsZXIuZ3VpZCwKCQkJCXNlbGVjdG9yOiBzZWxlY3RvciwKCQkJCW5lZWRzQ29udGV4dDogc2VsZWN0b3IgJiYgalF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICksCgkJCQluYW1lc3BhY2U6IG5hbWVzcGFjZXMuam9pbigiLiIpCgkJCX0sIGhhbmRsZU9iakluICk7CgoJCQkvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlIGlmIHdlJ3JlIHRoZSBmaXJzdAoJCQloYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdOwoJCQlpZiAoICFoYW5kbGVycyApIHsKCQkJCWhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTsKCQkJCWhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwOwoKCQkJCS8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIvYXR0YWNoRXZlbnQgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZQoJCQkJaWYgKCAhc3BlY2lhbC5zZXR1cCB8fCBzcGVjaWFsLnNldHVwLmNhbGwoIGVsZW0sIGRhdGEsIG5hbWVzcGFjZXMsIGV2ZW50SGFuZGxlICkgPT09IGZhbHNlICkgewoJCQkJCS8vIEJpbmQgdGhlIGdsb2JhbCBldmVudCBoYW5kbGVyIHRvIHRoZSBlbGVtZW50CgkJCQkJaWYgKCBlbGVtLmFkZEV2ZW50TGlzdGVuZXIgKSB7CgkJCQkJCWVsZW0uYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgZXZlbnRIYW5kbGUsIGZhbHNlICk7CgoJCQkJCX0gZWxzZSBpZiAoIGVsZW0uYXR0YWNoRXZlbnQgKSB7CgkJCQkJCWVsZW0uYXR0YWNoRXZlbnQoICJvbiIgKyB0eXBlLCBldmVudEhhbmRsZSApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJaWYgKCBzcGVjaWFsLmFkZCApIHsKCQkJCXNwZWNpYWwuYWRkLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOwoKCQkJCWlmICggIWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgKSB7CgkJCQkJaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCA9IGhhbmRsZXIuZ3VpZDsKCQkJCX0KCQkJfQoKCQkJLy8gQWRkIHRvIHRoZSBlbGVtZW50J3MgaGFuZGxlciBsaXN0LCBkZWxlZ2F0ZXMgaW4gZnJvbnQKCQkJaWYgKCBzZWxlY3RvciApIHsKCQkJCWhhbmRsZXJzLnNwbGljZSggaGFuZGxlcnMuZGVsZWdhdGVDb3VudCsrLCAwLCBoYW5kbGVPYmogKTsKCQkJfSBlbHNlIHsKCQkJCWhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApOwoJCQl9CgoJCQkvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGV2ZXIgYmVlbiB1c2VkLCBmb3IgZXZlbnQgb3B0aW1pemF0aW9uCgkJCWpRdWVyeS5ldmVudC5nbG9iYWxbIHR5cGUgXSA9IHRydWU7CgkJfQoKCQkvLyBOdWxsaWZ5IGVsZW0gdG8gcHJldmVudCBtZW1vcnkgbGVha3MgaW4gSUUKCQllbGVtID0gbnVsbDsKCX0sCgoJZ2xvYmFsOiB7fSwKCgkvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnQKCXJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBzZWxlY3RvciwgbWFwcGVkVHlwZXMgKSB7CgoJCXZhciB0LCB0bnMsIHR5cGUsIG9yaWdUeXBlLCBuYW1lc3BhY2VzLCBvcmlnQ291bnQsCgkJCWosIGV2ZW50cywgc3BlY2lhbCwgZXZlbnRUeXBlLCBoYW5kbGVPYmosCgkJCWVsZW1EYXRhID0galF1ZXJ5Lmhhc0RhdGEoIGVsZW0gKSAmJiBqUXVlcnkuX2RhdGEoIGVsZW0gKTsKCgkJaWYgKCAhZWxlbURhdGEgfHwgIShldmVudHMgPSBlbGVtRGF0YS5ldmVudHMpICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBPbmNlIGZvciBlYWNoIHR5cGUubmFtZXNwYWNlIGluIHR5cGVzOyB0eXBlIG1heSBiZSBvbWl0dGVkCgkJdHlwZXMgPSBqUXVlcnkudHJpbSggaG92ZXJIYWNrKCB0eXBlcyB8fCAiIiApICkuc3BsaXQoIiAiKTsKCQlmb3IgKCB0ID0gMDsgdCA8IHR5cGVzLmxlbmd0aDsgdCsrICkgewoJCQl0bnMgPSBydHlwZW5hbWVzcGFjZS5leGVjKCB0eXBlc1t0XSApIHx8IFtdOwoJCQl0eXBlID0gb3JpZ1R5cGUgPSB0bnNbMV07CgkJCW5hbWVzcGFjZXMgPSB0bnNbMl07CgoJCQkvLyBVbmJpbmQgYWxsIGV2ZW50cyAob24gdGhpcyBuYW1lc3BhY2UsIGlmIHByb3ZpZGVkKSBmb3IgdGhlIGVsZW1lbnQKCQkJaWYgKCAhdHlwZSApIHsKCQkJCWZvciAoIHR5cGUgaW4gZXZlbnRzICkgewoJCQkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKyB0eXBlc1sgdCBdLCBoYW5kbGVyLCBzZWxlY3RvciwgdHJ1ZSApOwoJCQkJfQoJCQkJY29udGludWU7CgkJCX0KCgkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OwoJCQl0eXBlID0gKCBzZWxlY3Rvcj8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTsKCQkJZXZlbnRUeXBlID0gZXZlbnRzWyB0eXBlIF0gfHwgW107CgkJCW9yaWdDb3VudCA9IGV2ZW50VHlwZS5sZW5ndGg7CgkJCW5hbWVzcGFjZXMgPSBuYW1lc3BhY2VzID8gbmV3IFJlZ0V4cCgiKF58XFwuKSIgKyBuYW1lc3BhY2VzLnNwbGl0KCIuIikuc29ydCgpLmpvaW4oIlxcLig/Oi4qXFwufCkiKSArICIoXFwufCQpIikgOiBudWxsOwoKCQkJLy8gUmVtb3ZlIG1hdGNoaW5nIGV2ZW50cwoJCQlmb3IgKCBqID0gMDsgaiA8IGV2ZW50VHlwZS5sZW5ndGg7IGorKyApIHsKCQkJCWhhbmRsZU9iaiA9IGV2ZW50VHlwZVsgaiBdOwoKCQkJCWlmICggKCBtYXBwZWRUeXBlcyB8fCBvcmlnVHlwZSA9PT0gaGFuZGxlT2JqLm9yaWdUeXBlICkgJiYKCQkJCQkgKCAhaGFuZGxlciB8fCBoYW5kbGVyLmd1aWQgPT09IGhhbmRsZU9iai5ndWlkICkgJiYKCQkJCQkgKCAhbmFtZXNwYWNlcyB8fCBuYW1lc3BhY2VzLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApICYmCgkJCQkJICggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09ICIqKiIgJiYgaGFuZGxlT2JqLnNlbGVjdG9yICkgKSB7CgkJCQkJZXZlbnRUeXBlLnNwbGljZSggai0tLCAxICk7CgoJCQkJCWlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkgewoJCQkJCQlldmVudFR5cGUuZGVsZWdhdGVDb3VudC0tOwoJCQkJCX0KCQkJCQlpZiAoIHNwZWNpYWwucmVtb3ZlICkgewoJCQkJCQlzcGVjaWFsLnJlbW92ZS5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCS8vIFJlbW92ZSBnZW5lcmljIGV2ZW50IGhhbmRsZXIgaWYgd2UgcmVtb3ZlZCBzb21ldGhpbmcgYW5kIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3QKCQkJLy8gKGF2b2lkcyBwb3RlbnRpYWwgZm9yIGVuZGxlc3MgcmVjdXJzaW9uIGR1cmluZyByZW1vdmFsIG9mIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMpCgkJCWlmICggZXZlbnRUeXBlLmxlbmd0aCA9PT0gMCAmJiBvcmlnQ291bnQgIT09IGV2ZW50VHlwZS5sZW5ndGggKSB7CgkJCQlpZiAoICFzcGVjaWFsLnRlYXJkb3duIHx8IHNwZWNpYWwudGVhcmRvd24uY2FsbCggZWxlbSwgbmFtZXNwYWNlcywgZWxlbURhdGEuaGFuZGxlICkgPT09IGZhbHNlICkgewoJCQkJCWpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZWxlbURhdGEuaGFuZGxlICk7CgkJCQl9CgoJCQkJZGVsZXRlIGV2ZW50c1sgdHlwZSBdOwoJCQl9CgkJfQoKCQkvLyBSZW1vdmUgdGhlIGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZAoJCWlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGV2ZW50cyApICkgewoJCQlkZWxldGUgZWxlbURhdGEuaGFuZGxlOwoKCQkJLy8gcmVtb3ZlRGF0YSBhbHNvIGNoZWNrcyBmb3IgZW1wdGluZXNzIGFuZCBjbGVhcnMgdGhlIGV4cGFuZG8gaWYgZW1wdHkKCQkJLy8gc28gdXNlIGl0IGluc3RlYWQgb2YgZGVsZXRlCgkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtLCAiZXZlbnRzIiwgdHJ1ZSApOwoJCX0KCX0sCgoJLy8gRXZlbnRzIHRoYXQgYXJlIHNhZmUgdG8gc2hvcnQtY2lyY3VpdCBpZiBubyBoYW5kbGVycyBhcmUgYXR0YWNoZWQuCgkvLyBOYXRpdmUgRE9NIGV2ZW50cyBzaG91bGQgbm90IGJlIGFkZGVkLCB0aGV5IG1heSBoYXZlIGlubGluZSBoYW5kbGVycy4KCWN1c3RvbUV2ZW50OiB7CgkJImdldERhdGEiOiB0cnVlLAoJCSJzZXREYXRhIjogdHJ1ZSwKCQkiY2hhbmdlRGF0YSI6IHRydWUKCX0sCgoJdHJpZ2dlcjogZnVuY3Rpb24oIGV2ZW50LCBkYXRhLCBlbGVtLCBvbmx5SGFuZGxlcnMgKSB7CgkJLy8gRG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXMKCQlpZiAoIGVsZW0gJiYgKGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCkgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIEV2ZW50IG9iamVjdCBvciBldmVudCB0eXBlCgkJdmFyIGNhY2hlLCBleGNsdXNpdmUsIGksIGN1ciwgb2xkLCBvbnR5cGUsIHNwZWNpYWwsIGhhbmRsZSwgZXZlbnRQYXRoLCBidWJibGVUeXBlLAoJCQl0eXBlID0gZXZlbnQudHlwZSB8fCBldmVudCwKCQkJbmFtZXNwYWNlcyA9IFtdOwoKCQkvLyBmb2N1cy9ibHVyIG1vcnBocyB0byBmb2N1c2luL291dDsgZW5zdXJlIHdlJ3JlIG5vdCBmaXJpbmcgdGhlbSByaWdodCBub3cKCQlpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICggdHlwZS5pbmRleE9mKCAiISIgKSA+PSAwICkgewoJCQkvLyBFeGNsdXNpdmUgZXZlbnRzIHRyaWdnZXIgb25seSBmb3IgdGhlIGV4YWN0IGV2ZW50IChubyBuYW1lc3BhY2VzKQoJCQl0eXBlID0gdHlwZS5zbGljZSgwLCAtMSk7CgkJCWV4Y2x1c2l2ZSA9IHRydWU7CgkJfQoKCQlpZiAoIHR5cGUuaW5kZXhPZiggIi4iICkgPj0gMCApIHsKCQkJLy8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKQoJCQluYW1lc3BhY2VzID0gdHlwZS5zcGxpdCgiLiIpOwoJCQl0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpOwoJCQluYW1lc3BhY2VzLnNvcnQoKTsKCQl9CgoJCWlmICggKCFlbGVtIHx8IGpRdWVyeS5ldmVudC5jdXN0b21FdmVudFsgdHlwZSBdKSAmJiAhalF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdICkgewoJCQkvLyBObyBqUXVlcnkgaGFuZGxlcnMgZm9yIHRoaXMgZXZlbnQgdHlwZSwgYW5kIGl0IGNhbid0IGhhdmUgaW5saW5lIGhhbmRsZXJzCgkJCXJldHVybjsKCQl9CgoJCS8vIENhbGxlciBjYW4gcGFzcyBpbiBhbiBFdmVudCwgT2JqZWN0LCBvciBqdXN0IGFuIGV2ZW50IHR5cGUgc3RyaW5nCgkJZXZlbnQgPSB0eXBlb2YgZXZlbnQgPT09ICJvYmplY3QiID8KCQkJLy8galF1ZXJ5LkV2ZW50IG9iamVjdAoJCQlldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/IGV2ZW50IDoKCQkJLy8gT2JqZWN0IGxpdGVyYWwKCQkJbmV3IGpRdWVyeS5FdmVudCggdHlwZSwgZXZlbnQgKSA6CgkJCS8vIEp1c3QgdGhlIGV2ZW50IHR5cGUgKHN0cmluZykKCQkJbmV3IGpRdWVyeS5FdmVudCggdHlwZSApOwoKCQlldmVudC50eXBlID0gdHlwZTsKCQlldmVudC5pc1RyaWdnZXIgPSB0cnVlOwoJCWV2ZW50LmV4Y2x1c2l2ZSA9IGV4Y2x1c2l2ZTsKCQlldmVudC5uYW1lc3BhY2UgPSBuYW1lc3BhY2VzLmpvaW4oICIuIiApOwoJCWV2ZW50Lm5hbWVzcGFjZV9yZSA9IGV2ZW50Lm5hbWVzcGFjZT8gbmV3IFJlZ0V4cCgiKF58XFwuKSIgKyBuYW1lc3BhY2VzLmpvaW4oIlxcLig/Oi4qXFwufCkiKSArICIoXFwufCQpIikgOiBudWxsOwoJCW9udHlwZSA9IHR5cGUuaW5kZXhPZiggIjoiICkgPCAwID8gIm9uIiArIHR5cGUgOiAiIjsKCgkJLy8gSGFuZGxlIGEgZ2xvYmFsIHRyaWdnZXIKCQlpZiAoICFlbGVtICkgewoKCQkJLy8gVE9ETzogU3RvcCB0YXVudGluZyB0aGUgZGF0YSBjYWNoZTsgcmVtb3ZlIGdsb2JhbCBldmVudHMgYW5kIGFsd2F5cyBhdHRhY2ggdG8gZG9jdW1lbnQKCQkJY2FjaGUgPSBqUXVlcnkuY2FjaGU7CgkJCWZvciAoIGkgaW4gY2FjaGUgKSB7CgkJCQlpZiAoIGNhY2hlWyBpIF0uZXZlbnRzICYmIGNhY2hlWyBpIF0uZXZlbnRzWyB0eXBlIF0gKSB7CgkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGV2ZW50LCBkYXRhLCBjYWNoZVsgaSBdLmhhbmRsZS5lbGVtLCB0cnVlICk7CgkJCQl9CgkJCX0KCQkJcmV0dXJuOwoJCX0KCgkJLy8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkCgkJZXZlbnQucmVzdWx0ID0gdW5kZWZpbmVkOwoJCWlmICggIWV2ZW50LnRhcmdldCApIHsKCQkJZXZlbnQudGFyZ2V0ID0gZWxlbTsKCQl9CgoJCS8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3QKCQlkYXRhID0gZGF0YSAhPSBudWxsID8galF1ZXJ5Lm1ha2VBcnJheSggZGF0YSApIDogW107CgkJZGF0YS51bnNoaWZ0KCBldmVudCApOwoKCQkvLyBBbGxvdyBzcGVjaWFsIGV2ZW50cyB0byBkcmF3IG91dHNpZGUgdGhlIGxpbmVzCgkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307CgkJaWYgKCBzcGVjaWFsLnRyaWdnZXIgJiYgc3BlY2lhbC50cmlnZ2VyLmFwcGx5KCBlbGVtLCBkYXRhICkgPT09IGZhbHNlICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBEZXRlcm1pbmUgZXZlbnQgcHJvcGFnYXRpb24gcGF0aCBpbiBhZHZhbmNlLCBwZXIgVzNDIGV2ZW50cyBzcGVjICgjOTk1MSkKCQkvLyBCdWJibGUgdXAgdG8gZG9jdW1lbnQsIHRoZW4gdG8gd2luZG93OyB3YXRjaCBmb3IgYSBnbG9iYWwgb3duZXJEb2N1bWVudCB2YXIgKCM5NzI0KQoJCWV2ZW50UGF0aCA9IFtbIGVsZW0sIHNwZWNpYWwuYmluZFR5cGUgfHwgdHlwZSBdXTsKCQlpZiAoICFvbmx5SGFuZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUgJiYgIWpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkgewoKCQkJYnViYmxlVHlwZSA9IHNwZWNpYWwuZGVsZWdhdGVUeXBlIHx8IHR5cGU7CgkJCWN1ciA9IHJmb2N1c01vcnBoLnRlc3QoIGJ1YmJsZVR5cGUgKyB0eXBlICkgPyBlbGVtIDogZWxlbS5wYXJlbnROb2RlOwoJCQlmb3IgKCBvbGQgPSBlbGVtOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkgewoJCQkJZXZlbnRQYXRoLnB1c2goWyBjdXIsIGJ1YmJsZVR5cGUgXSk7CgkJCQlvbGQgPSBjdXI7CgkJCX0KCgkJCS8vIE9ubHkgYWRkIHdpbmRvdyBpZiB3ZSBnb3QgdG8gZG9jdW1lbnQgKGUuZy4sIG5vdCBwbGFpbiBvYmogb3IgZGV0YWNoZWQgRE9NKQoJCQlpZiAoIG9sZCA9PT0gKGVsZW0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCkgKSB7CgkJCQlldmVudFBhdGgucHVzaChbIG9sZC5kZWZhdWx0VmlldyB8fCBvbGQucGFyZW50V2luZG93IHx8IHdpbmRvdywgYnViYmxlVHlwZSBdKTsKCQkJfQoJCX0KCgkJLy8gRmlyZSBoYW5kbGVycyBvbiB0aGUgZXZlbnQgcGF0aAoJCWZvciAoIGkgPSAwOyBpIDwgZXZlbnRQYXRoLmxlbmd0aCAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTsgaSsrICkgewoKCQkJY3VyID0gZXZlbnRQYXRoW2ldWzBdOwoJCQlldmVudC50eXBlID0gZXZlbnRQYXRoW2ldWzFdOwoKCQkJaGFuZGxlID0gKCBqUXVlcnkuX2RhdGEoIGN1ciwgImV2ZW50cyIgKSB8fCB7fSApWyBldmVudC50eXBlIF0gJiYgalF1ZXJ5Ll9kYXRhKCBjdXIsICJoYW5kbGUiICk7CgkJCWlmICggaGFuZGxlICkgewoJCQkJaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTsKCQkJfQoJCQkvLyBOb3RlIHRoYXQgdGhpcyBpcyBhIGJhcmUgSlMgZnVuY3Rpb24gYW5kIG5vdCBhIGpRdWVyeSBoYW5kbGVyCgkJCWhhbmRsZSA9IG9udHlwZSAmJiBjdXJbIG9udHlwZSBdOwoJCQlpZiAoIGhhbmRsZSAmJiBqUXVlcnkuYWNjZXB0RGF0YSggY3VyICkgJiYgaGFuZGxlLmFwcGx5ICYmIGhhbmRsZS5hcHBseSggY3VyLCBkYXRhICkgPT09IGZhbHNlICkgewoJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJfQoJCX0KCQlldmVudC50eXBlID0gdHlwZTsKCgkJLy8gSWYgbm9ib2R5IHByZXZlbnRlZCB0aGUgZGVmYXVsdCBhY3Rpb24sIGRvIGl0IG5vdwoJCWlmICggIW9ubHlIYW5kbGVycyAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7CgoJCQlpZiAoICghc3BlY2lhbC5fZGVmYXVsdCB8fCBzcGVjaWFsLl9kZWZhdWx0LmFwcGx5KCBlbGVtLm93bmVyRG9jdW1lbnQsIGRhdGEgKSA9PT0gZmFsc2UpICYmCgkJCQkhKHR5cGUgPT09ICJjbGljayIgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiYSIgKSkgJiYgalF1ZXJ5LmFjY2VwdERhdGEoIGVsZW0gKSApIHsKCgkJCQkvLyBDYWxsIGEgbmF0aXZlIERPTSBtZXRob2Qgb24gdGhlIHRhcmdldCB3aXRoIHRoZSBzYW1lIG5hbWUgbmFtZSBhcyB0aGUgZXZlbnQuCgkJCQkvLyBDYW4ndCB1c2UgYW4gLmlzRnVuY3Rpb24oKSBjaGVjayBoZXJlIGJlY2F1c2UgSUU2LzcgZmFpbHMgdGhhdCB0ZXN0LgoJCQkJLy8gRG9uJ3QgZG8gZGVmYXVsdCBhY3Rpb25zIG9uIHdpbmRvdywgdGhhdCdzIHdoZXJlIGdsb2JhbCB2YXJpYWJsZXMgYmUgKCM2MTcwKQoJCQkJLy8gSUU8OSBkaWVzIG9uIGZvY3VzL2JsdXIgdG8gaGlkZGVuIGVsZW1lbnQgKCMxNDg2KQoJCQkJaWYgKCBvbnR5cGUgJiYgZWxlbVsgdHlwZSBdICYmICgodHlwZSAhPT0gImZvY3VzIiAmJiB0eXBlICE9PSAiYmx1ciIpIHx8IGV2ZW50LnRhcmdldC5vZmZzZXRXaWR0aCAhPT0gMCkgJiYgIWpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkgewoKCQkJCQkvLyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBpdHMgRk9PKCkgbWV0aG9kCgkJCQkJb2xkID0gZWxlbVsgb250eXBlIF07CgoJCQkJCWlmICggb2xkICkgewoJCQkJCQllbGVtWyBvbnR5cGUgXSA9IG51bGw7CgkJCQkJfQoKCQkJCQkvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNhbWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZQoJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlOwoJCQkJCWVsZW1bIHR5cGUgXSgpOwoJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB1bmRlZmluZWQ7CgoJCQkJCWlmICggb2xkICkgewoJCQkJCQllbGVtWyBvbnR5cGUgXSA9IG9sZDsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBldmVudC5yZXN1bHQ7Cgl9LAoKCWRpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7CgoJCS8vIE1ha2UgYSB3cml0YWJsZSBqUXVlcnkuRXZlbnQgZnJvbSB0aGUgbmF0aXZlIGV2ZW50IG9iamVjdAoJCWV2ZW50ID0galF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgfHwgd2luZG93LmV2ZW50ICk7CgoJCXZhciBpLCBqLCBjdXIsIHJldCwgc2VsTWF0Y2gsIG1hdGNoZWQsIG1hdGNoZXMsIGhhbmRsZU9iaiwgc2VsLCByZWxhdGVkLAoJCQloYW5kbGVycyA9ICggKGpRdWVyeS5fZGF0YSggdGhpcywgImV2ZW50cyIgKSB8fCB7fSApWyBldmVudC50eXBlIF0gfHwgW10pLAoJCQlkZWxlZ2F0ZUNvdW50ID0gaGFuZGxlcnMuZGVsZWdhdGVDb3VudCwKCQkJYXJncyA9IGNvcmVfc2xpY2UuY2FsbCggYXJndW1lbnRzICksCgkJCXJ1bl9hbGwgPSAhZXZlbnQuZXhjbHVzaXZlICYmICFldmVudC5uYW1lc3BhY2UsCgkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZXZlbnQudHlwZSBdIHx8IHt9LAoJCQloYW5kbGVyUXVldWUgPSBbXTsKCgkJLy8gVXNlIHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRpdmUgZXZlbnQKCQlhcmdzWzBdID0gZXZlbnQ7CgkJZXZlbnQuZGVsZWdhdGVUYXJnZXQgPSB0aGlzOwoKCQkvLyBDYWxsIHRoZSBwcmVEaXNwYXRjaCBob29rIGZvciB0aGUgbWFwcGVkIHR5cGUsIGFuZCBsZXQgaXQgYmFpbCBpZiBkZXNpcmVkCgkJaWYgKCBzcGVjaWFsLnByZURpc3BhdGNoICYmIHNwZWNpYWwucHJlRGlzcGF0Y2guY2FsbCggdGhpcywgZXZlbnQgKSA9PT0gZmFsc2UgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIERldGVybWluZSBoYW5kbGVycyB0aGF0IHNob3VsZCBydW4gaWYgdGhlcmUgYXJlIGRlbGVnYXRlZCBldmVudHMKCQkvLyBBdm9pZCBub24tbGVmdC1jbGljayBidWJibGluZyBpbiBGaXJlZm94ICgjMzg2MSkKCQlpZiAoIGRlbGVnYXRlQ291bnQgJiYgIShldmVudC5idXR0b24gJiYgZXZlbnQudHlwZSA9PT0gImNsaWNrIikgKSB7CgoJCQlmb3IgKCBjdXIgPSBldmVudC50YXJnZXQ7IGN1ciAhPSB0aGlzOyBjdXIgPSBjdXIucGFyZW50Tm9kZSB8fCB0aGlzICkgewoKCQkJCS8vIERvbid0IHByb2Nlc3MgY2xpY2tzIChPTkxZKSBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NCkKCQkJCWlmICggY3VyLmRpc2FibGVkICE9PSB0cnVlIHx8IGV2ZW50LnR5cGUgIT09ICJjbGljayIgKSB7CgkJCQkJc2VsTWF0Y2ggPSB7fTsKCQkJCQltYXRjaGVzID0gW107CgkJCQkJZm9yICggaSA9IDA7IGkgPCBkZWxlZ2F0ZUNvdW50OyBpKysgKSB7CgkJCQkJCWhhbmRsZU9iaiA9IGhhbmRsZXJzWyBpIF07CgkJCQkJCXNlbCA9IGhhbmRsZU9iai5zZWxlY3RvcjsKCgkJCQkJCWlmICggc2VsTWF0Y2hbIHNlbCBdID09PSB1bmRlZmluZWQgKSB7CgkJCQkJCQlzZWxNYXRjaFsgc2VsIF0gPSBoYW5kbGVPYmoubmVlZHNDb250ZXh0ID8KCQkJCQkJCQlqUXVlcnkoIHNlbCwgdGhpcyApLmluZGV4KCBjdXIgKSA+PSAwIDoKCQkJCQkJCQlqUXVlcnkuZmluZCggc2VsLCB0aGlzLCBudWxsLCBbIGN1ciBdICkubGVuZ3RoOwoJCQkJCQl9CgkJCQkJCWlmICggc2VsTWF0Y2hbIHNlbCBdICkgewoJCQkJCQkJbWF0Y2hlcy5wdXNoKCBoYW5kbGVPYmogKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQlpZiAoIG1hdGNoZXMubGVuZ3RoICkgewoJCQkJCQloYW5kbGVyUXVldWUucHVzaCh7IGVsZW06IGN1ciwgbWF0Y2hlczogbWF0Y2hlcyB9KTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCS8vIEFkZCB0aGUgcmVtYWluaW5nIChkaXJlY3RseS1ib3VuZCkgaGFuZGxlcnMKCQlpZiAoIGhhbmRsZXJzLmxlbmd0aCA+IGRlbGVnYXRlQ291bnQgKSB7CgkJCWhhbmRsZXJRdWV1ZS5wdXNoKHsgZWxlbTogdGhpcywgbWF0Y2hlczogaGFuZGxlcnMuc2xpY2UoIGRlbGVnYXRlQ291bnQgKSB9KTsKCQl9CgoJCS8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkgbWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzCgkJZm9yICggaSA9IDA7IGkgPCBoYW5kbGVyUXVldWUubGVuZ3RoICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpOyBpKysgKSB7CgkJCW1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkgXTsKCQkJZXZlbnQuY3VycmVudFRhcmdldCA9IG1hdGNoZWQuZWxlbTsKCgkJCWZvciAoIGogPSAwOyBqIDwgbWF0Y2hlZC5tYXRjaGVzLmxlbmd0aCAmJiAhZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKTsgaisrICkgewoJCQkJaGFuZGxlT2JqID0gbWF0Y2hlZC5tYXRjaGVzWyBqIF07CgoJCQkJLy8gVHJpZ2dlcmVkIGV2ZW50IG11c3QgZWl0aGVyIDEpIGJlIG5vbi1leGNsdXNpdmUgYW5kIGhhdmUgbm8gbmFtZXNwYWNlLCBvcgoJCQkJLy8gMikgaGF2ZSBuYW1lc3BhY2UocykgYSBzdWJzZXQgb3IgZXF1YWwgdG8gdGhvc2UgaW4gdGhlIGJvdW5kIGV2ZW50IChib3RoIGNhbiBoYXZlIG5vIG5hbWVzcGFjZSkuCgkJCQlpZiAoIHJ1bl9hbGwgfHwgKCFldmVudC5uYW1lc3BhY2UgJiYgIWhhbmRsZU9iai5uYW1lc3BhY2UpIHx8IGV2ZW50Lm5hbWVzcGFjZV9yZSAmJiBldmVudC5uYW1lc3BhY2VfcmUudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkgewoKCQkJCQlldmVudC5kYXRhID0gaGFuZGxlT2JqLmRhdGE7CgkJCQkJZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqOwoKCQkJCQlyZXQgPSAoIChqUXVlcnkuZXZlbnQuc3BlY2lhbFsgaGFuZGxlT2JqLm9yaWdUeXBlIF0gfHwge30pLmhhbmRsZSB8fCBoYW5kbGVPYmouaGFuZGxlciApCgkJCQkJCQkuYXBwbHkoIG1hdGNoZWQuZWxlbSwgYXJncyApOwoKCQkJCQlpZiAoIHJldCAhPT0gdW5kZWZpbmVkICkgewoJCQkJCQlldmVudC5yZXN1bHQgPSByZXQ7CgkJCQkJCWlmICggcmV0ID09PSBmYWxzZSApIHsKCQkJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJLy8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZQoJCWlmICggc3BlY2lhbC5wb3N0RGlzcGF0Y2ggKSB7CgkJCXNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7CgkJfQoKCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCgkvLyBJbmNsdWRlcyBzb21lIGV2ZW50IHByb3BzIHNoYXJlZCBieSBLZXlFdmVudCBhbmQgTW91c2VFdmVudAoJLy8gKioqIGF0dHJDaGFuZ2UgYXR0ck5hbWUgcmVsYXRlZE5vZGUgc3JjRWxlbWVudCAgYXJlIG5vdCBub3JtYWxpemVkLCBub24tVzNDLCBkZXByZWNhdGVkLCB3aWxsIGJlIHJlbW92ZWQgaW4gMS44ICoqKgoJcHJvcHM6ICJhdHRyQ2hhbmdlIGF0dHJOYW1lIHJlbGF0ZWROb2RlIHNyY0VsZW1lbnQgYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLAoKCWZpeEhvb2tzOiB7fSwKCglrZXlIb29rczogewoJCXByb3BzOiAiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSwKCQlmaWx0ZXI6IGZ1bmN0aW9uKCBldmVudCwgb3JpZ2luYWwgKSB7CgoJCQkvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHMKCQkJaWYgKCBldmVudC53aGljaCA9PSBudWxsICkgewoJCQkJZXZlbnQud2hpY2ggPSBvcmlnaW5hbC5jaGFyQ29kZSAhPSBudWxsID8gb3JpZ2luYWwuY2hhckNvZGUgOiBvcmlnaW5hbC5rZXlDb2RlOwoJCQl9CgoJCQlyZXR1cm4gZXZlbnQ7CgkJfQoJfSwKCgltb3VzZUhvb2tzOiB7CgkJcHJvcHM6ICJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksCgkJZmlsdGVyOiBmdW5jdGlvbiggZXZlbnQsIG9yaWdpbmFsICkgewoJCQl2YXIgZXZlbnREb2MsIGRvYywgYm9keSwKCQkJCWJ1dHRvbiA9IG9yaWdpbmFsLmJ1dHRvbiwKCQkJCWZyb21FbGVtZW50ID0gb3JpZ2luYWwuZnJvbUVsZW1lbnQ7CgoJCQkvLyBDYWxjdWxhdGUgcGFnZVgvWSBpZiBtaXNzaW5nIGFuZCBjbGllbnRYL1kgYXZhaWxhYmxlCgkJCWlmICggZXZlbnQucGFnZVggPT0gbnVsbCAmJiBvcmlnaW5hbC5jbGllbnRYICE9IG51bGwgKSB7CgkJCQlldmVudERvYyA9IGV2ZW50LnRhcmdldC5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50OwoJCQkJZG9jID0gZXZlbnREb2MuZG9jdW1lbnRFbGVtZW50OwoJCQkJYm9keSA9IGV2ZW50RG9jLmJvZHk7CgoJCQkJZXZlbnQucGFnZVggPSBvcmlnaW5hbC5jbGllbnRYICsgKCBkb2MgJiYgZG9jLnNjcm9sbExlZnQgfHwgYm9keSAmJiBib2R5LnNjcm9sbExlZnQgfHwgMCApIC0gKCBkb2MgJiYgZG9jLmNsaWVudExlZnQgfHwgYm9keSAmJiBib2R5LmNsaWVudExlZnQgfHwgMCApOwoJCQkJZXZlbnQucGFnZVkgPSBvcmlnaW5hbC5jbGllbnRZICsgKCBkb2MgJiYgZG9jLnNjcm9sbFRvcCAgfHwgYm9keSAmJiBib2R5LnNjcm9sbFRvcCAgfHwgMCApIC0gKCBkb2MgJiYgZG9jLmNsaWVudFRvcCAgfHwgYm9keSAmJiBib2R5LmNsaWVudFRvcCAgfHwgMCApOwoJCQl9CgoJCQkvLyBBZGQgcmVsYXRlZFRhcmdldCwgaWYgbmVjZXNzYXJ5CgkJCWlmICggIWV2ZW50LnJlbGF0ZWRUYXJnZXQgJiYgZnJvbUVsZW1lbnQgKSB7CgkJCQlldmVudC5yZWxhdGVkVGFyZ2V0ID0gZnJvbUVsZW1lbnQgPT09IGV2ZW50LnRhcmdldCA/IG9yaWdpbmFsLnRvRWxlbWVudCA6IGZyb21FbGVtZW50OwoJCQl9CgoJCQkvLyBBZGQgd2hpY2ggZm9yIGNsaWNrOiAxID09PSBsZWZ0OyAyID09PSBtaWRkbGU7IDMgPT09IHJpZ2h0CgkJCS8vIE5vdGU6IGJ1dHRvbiBpcyBub3Qgbm9ybWFsaXplZCwgc28gZG9uJ3QgdXNlIGl0CgkJCWlmICggIWV2ZW50LndoaWNoICYmIGJ1dHRvbiAhPT0gdW5kZWZpbmVkICkgewoJCQkJZXZlbnQud2hpY2ggPSAoIGJ1dHRvbiAmIDEgPyAxIDogKCBidXR0b24gJiAyID8gMyA6ICggYnV0dG9uICYgNCA/IDIgOiAwICkgKSApOwoJCQl9CgoJCQlyZXR1cm4gZXZlbnQ7CgkJfQoJfSwKCglmaXg6IGZ1bmN0aW9uKCBldmVudCApIHsKCQlpZiAoIGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdICkgewoJCQlyZXR1cm4gZXZlbnQ7CgkJfQoKCQkvLyBDcmVhdGUgYSB3cml0YWJsZSBjb3B5IG9mIHRoZSBldmVudCBvYmplY3QgYW5kIG5vcm1hbGl6ZSBzb21lIHByb3BlcnRpZXMKCQl2YXIgaSwgcHJvcCwKCQkJb3JpZ2luYWxFdmVudCA9IGV2ZW50LAoJCQlmaXhIb29rID0galF1ZXJ5LmV2ZW50LmZpeEhvb2tzWyBldmVudC50eXBlIF0gfHwge30sCgkJCWNvcHkgPSBmaXhIb29rLnByb3BzID8gdGhpcy5wcm9wcy5jb25jYXQoIGZpeEhvb2sucHJvcHMgKSA6IHRoaXMucHJvcHM7CgoJCWV2ZW50ID0galF1ZXJ5LkV2ZW50KCBvcmlnaW5hbEV2ZW50ICk7CgoJCWZvciAoIGkgPSBjb3B5Lmxlbmd0aDsgaTsgKSB7CgkJCXByb3AgPSBjb3B5WyAtLWkgXTsKCQkJZXZlbnRbIHByb3AgXSA9IG9yaWdpbmFsRXZlbnRbIHByb3AgXTsKCQl9CgoJCS8vIEZpeCB0YXJnZXQgcHJvcGVydHksIGlmIG5lY2Vzc2FyeSAoIzE5MjUsIElFIDYvNy84ICYgU2FmYXJpMikKCQlpZiAoICFldmVudC50YXJnZXQgKSB7CgkJCWV2ZW50LnRhcmdldCA9IG9yaWdpbmFsRXZlbnQuc3JjRWxlbWVudCB8fCBkb2N1bWVudDsKCQl9CgoJCS8vIFRhcmdldCBzaG91bGQgbm90IGJlIGEgdGV4dCBub2RlICgjNTA0LCBTYWZhcmkpCgkJaWYgKCBldmVudC50YXJnZXQubm9kZVR5cGUgPT09IDMgKSB7CgkJCWV2ZW50LnRhcmdldCA9IGV2ZW50LnRhcmdldC5wYXJlbnROb2RlOwoJCX0KCgkJLy8gRm9yIG1vdXNlL2tleSBldmVudHMsIG1ldGFLZXk9PWZhbHNlIGlmIGl0J3MgdW5kZWZpbmVkICgjMzM2OCwgIzExMzI4OyBJRTYvNy84KQoJCWV2ZW50Lm1ldGFLZXkgPSAhIWV2ZW50Lm1ldGFLZXk7CgoJCXJldHVybiBmaXhIb29rLmZpbHRlcj8gZml4SG9vay5maWx0ZXIoIGV2ZW50LCBvcmlnaW5hbEV2ZW50ICkgOiBldmVudDsKCX0sCgoJc3BlY2lhbDogewoJCWxvYWQ6IHsKCQkJLy8gUHJldmVudCB0cmlnZ2VyZWQgaW1hZ2UubG9hZCBldmVudHMgZnJvbSBidWJibGluZyB0byB3aW5kb3cubG9hZAoJCQlub0J1YmJsZTogdHJ1ZQoJCX0sCgoJCWZvY3VzOiB7CgkJCWRlbGVnYXRlVHlwZTogImZvY3VzaW4iCgkJfSwKCQlibHVyOiB7CgkJCWRlbGVnYXRlVHlwZTogImZvY3Vzb3V0IgoJCX0sCgoJCWJlZm9yZXVubG9hZDogewoJCQlzZXR1cDogZnVuY3Rpb24oIGRhdGEsIG5hbWVzcGFjZXMsIGV2ZW50SGFuZGxlICkgewoJCQkJLy8gV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgc3BlY2lhbCBjYXNlIG9uIHdpbmRvd3MKCQkJCWlmICggalF1ZXJ5LmlzV2luZG93KCB0aGlzICkgKSB7CgkJCQkJdGhpcy5vbmJlZm9yZXVubG9hZCA9IGV2ZW50SGFuZGxlOwoJCQkJfQoJCQl9LAoKCQkJdGVhcmRvd246IGZ1bmN0aW9uKCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApIHsKCQkJCWlmICggdGhpcy5vbmJlZm9yZXVubG9hZCA9PT0gZXZlbnRIYW5kbGUgKSB7CgkJCQkJdGhpcy5vbmJlZm9yZXVubG9hZCA9IG51bGw7CgkJCQl9CgkJCX0KCQl9Cgl9LAoKCXNpbXVsYXRlOiBmdW5jdGlvbiggdHlwZSwgZWxlbSwgZXZlbnQsIGJ1YmJsZSApIHsKCQkvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmUuCgkJLy8gRmFrZSBvcmlnaW5hbEV2ZW50IHRvIGF2b2lkIGRvbm9yJ3Mgc3RvcFByb3BhZ2F0aW9uLCBidXQgaWYgdGhlCgkJLy8gc2ltdWxhdGVkIGV2ZW50IHByZXZlbnRzIGRlZmF1bHQgdGhlbiB3ZSBkbyB0aGUgc2FtZSBvbiB0aGUgZG9ub3IuCgkJdmFyIGUgPSBqUXVlcnkuZXh0ZW5kKAoJCQluZXcgalF1ZXJ5LkV2ZW50KCksCgkJCWV2ZW50LAoJCQl7IHR5cGU6IHR5cGUsCgkJCQlpc1NpbXVsYXRlZDogdHJ1ZSwKCQkJCW9yaWdpbmFsRXZlbnQ6IHt9CgkJCX0KCQkpOwoJCWlmICggYnViYmxlICkgewoJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggZSwgbnVsbCwgZWxlbSApOwoJCX0gZWxzZSB7CgkJCWpRdWVyeS5ldmVudC5kaXNwYXRjaC5jYWxsKCBlbGVtLCBlICk7CgkJfQoJCWlmICggZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHsKCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQl9Cgl9Cn07CgovLyBTb21lIHBsdWdpbnMgYXJlIHVzaW5nLCBidXQgaXQncyB1bmRvY3VtZW50ZWQvZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkLgovLyBUaGUgMS43IHNwZWNpYWwgZXZlbnQgaW50ZXJmYWNlIHNob3VsZCBwcm92aWRlIGFsbCB0aGUgaG9va3MgbmVlZGVkIG5vdy4KalF1ZXJ5LmV2ZW50LmhhbmRsZSA9IGpRdWVyeS5ldmVudC5kaXNwYXRjaDsKCmpRdWVyeS5yZW1vdmVFdmVudCA9IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIgPwoJZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHsKCQlpZiAoIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciApIHsKCQkJZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUsIGZhbHNlICk7CgkJfQoJfSA6CglmdW5jdGlvbiggZWxlbSwgdHlwZSwgaGFuZGxlICkgewoJCXZhciBuYW1lID0gIm9uIiArIHR5cGU7CgoJCWlmICggZWxlbS5kZXRhY2hFdmVudCApIHsKCgkJCS8vICM4NTQ1LCAjNzA1NCwgcHJldmVudGluZyBtZW1vcnkgbGVha3MgZm9yIGN1c3RvbSBldmVudHMgaW4gSUU2LTgg4oCTCgkJCS8vIGRldGFjaEV2ZW50IG5lZWRlZCBwcm9wZXJ0eSBvbiBlbGVtZW50LCBieSBuYW1lIG9mIHRoYXQgZXZlbnQsIHRvIHByb3Blcmx5IGV4cG9zZSBpdCB0byBHQwoJCQlpZiAoIHR5cGVvZiBlbGVtWyBuYW1lIF0gPT09ICJ1bmRlZmluZWQiICkgewoJCQkJZWxlbVsgbmFtZSBdID0gbnVsbDsKCQkJfQoKCQkJZWxlbS5kZXRhY2hFdmVudCggbmFtZSwgaGFuZGxlICk7CgkJfQoJfTsKCmpRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMsIHByb3BzICkgewoJLy8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkCglpZiAoICEodGhpcyBpbnN0YW5jZW9mIGpRdWVyeS5FdmVudCkgKSB7CgkJcmV0dXJuIG5ldyBqUXVlcnkuRXZlbnQoIHNyYywgcHJvcHMgKTsKCX0KCgkvLyBFdmVudCBvYmplY3QKCWlmICggc3JjICYmIHNyYy50eXBlICkgewoJCXRoaXMub3JpZ2luYWxFdmVudCA9IHNyYzsKCQl0aGlzLnR5cGUgPSBzcmMudHlwZTsKCgkJLy8gRXZlbnRzIGJ1YmJsaW5nIHVwIHRoZSBkb2N1bWVudCBtYXkgaGF2ZSBiZWVuIG1hcmtlZCBhcyBwcmV2ZW50ZWQKCQkvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS4KCQl0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9ICggc3JjLmRlZmF1bHRQcmV2ZW50ZWQgfHwgc3JjLnJldHVyblZhbHVlID09PSBmYWxzZSB8fAoJCQlzcmMuZ2V0UHJldmVudERlZmF1bHQgJiYgc3JjLmdldFByZXZlbnREZWZhdWx0KCkgKSA/IHJldHVyblRydWUgOiByZXR1cm5GYWxzZTsKCgkvLyBFdmVudCB0eXBlCgl9IGVsc2UgewoJCXRoaXMudHlwZSA9IHNyYzsKCX0KCgkvLyBQdXQgZXhwbGljaXRseSBwcm92aWRlZCBwcm9wZXJ0aWVzIG9udG8gdGhlIGV2ZW50IG9iamVjdAoJaWYgKCBwcm9wcyApIHsKCQlqUXVlcnkuZXh0ZW5kKCB0aGlzLCBwcm9wcyApOwoJfQoKCS8vIENyZWF0ZSBhIHRpbWVzdGFtcCBpZiBpbmNvbWluZyBldmVudCBkb2Vzbid0IGhhdmUgb25lCgl0aGlzLnRpbWVTdGFtcCA9IHNyYyAmJiBzcmMudGltZVN0YW1wIHx8IGpRdWVyeS5ub3coKTsKCgkvLyBNYXJrIGl0IGFzIGZpeGVkCgl0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTsKfTsKCmZ1bmN0aW9uIHJldHVybkZhbHNlKCkgewoJcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIHJldHVyblRydWUoKSB7CglyZXR1cm4gdHJ1ZTsKfQoKLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nCi8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbApqUXVlcnkuRXZlbnQucHJvdG90eXBlID0gewoJcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTsKCgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgkJaWYgKCAhZSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gaWYgcHJldmVudERlZmF1bHQgZXhpc3RzIHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnQKCQlpZiAoIGUucHJldmVudERlZmF1bHQgKSB7CgkJCWUucHJldmVudERlZmF1bHQoKTsKCgkJLy8gb3RoZXJ3aXNlIHNldCB0aGUgcmV0dXJuVmFsdWUgcHJvcGVydHkgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IHRvIGZhbHNlIChJRSkKCQl9IGVsc2UgewoJCQllLnJldHVyblZhbHVlID0gZmFsc2U7CgkJfQoJfSwKCXN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CgkJdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7CgoJCXZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50OwoJCWlmICggIWUgKSB7CgkJCXJldHVybjsKCQl9CgkJLy8gaWYgc3RvcFByb3BhZ2F0aW9uIGV4aXN0cyBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50CgkJaWYgKCBlLnN0b3BQcm9wYWdhdGlvbiApIHsKCQkJZS5zdG9wUHJvcGFnYXRpb24oKTsKCQl9CgkJLy8gb3RoZXJ3aXNlIHNldCB0aGUgY2FuY2VsQnViYmxlIHByb3BlcnR5IG9mIHRoZSBvcmlnaW5hbCBldmVudCB0byB0cnVlIChJRSkKCQllLmNhbmNlbEJ1YmJsZSA9IHRydWU7Cgl9LAoJc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHsKCQl0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTsKCQl0aGlzLnN0b3BQcm9wYWdhdGlvbigpOwoJfSwKCWlzRGVmYXVsdFByZXZlbnRlZDogcmV0dXJuRmFsc2UsCglpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsCglpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UKfTsKCi8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrcwpqUXVlcnkuZWFjaCh7Cgltb3VzZWVudGVyOiAibW91c2VvdmVyIiwKCW1vdXNlbGVhdmU6ICJtb3VzZW91dCIKfSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHsKCWpRdWVyeS5ldmVudC5zcGVjaWFsWyBvcmlnIF0gPSB7CgkJZGVsZWdhdGVUeXBlOiBmaXgsCgkJYmluZFR5cGU6IGZpeCwKCgkJaGFuZGxlOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCXZhciByZXQsCgkJCQl0YXJnZXQgPSB0aGlzLAoJCQkJcmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQsCgkJCQloYW5kbGVPYmogPSBldmVudC5oYW5kbGVPYmosCgkJCQlzZWxlY3RvciA9IGhhbmRsZU9iai5zZWxlY3RvcjsKCgkJCS8vIEZvciBtb3VzZW50ZXIvbGVhdmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC4KCQkJLy8gTkI6IE5vIHJlbGF0ZWRUYXJnZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3cKCQkJaWYgKCAhcmVsYXRlZCB8fCAocmVsYXRlZCAhPT0gdGFyZ2V0ICYmICFqUXVlcnkuY29udGFpbnMoIHRhcmdldCwgcmVsYXRlZCApKSApIHsKCQkJCWV2ZW50LnR5cGUgPSBoYW5kbGVPYmoub3JpZ1R5cGU7CgkJCQlyZXQgPSBoYW5kbGVPYmouaGFuZGxlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCQlldmVudC50eXBlID0gZml4OwoJCQl9CgkJCXJldHVybiByZXQ7CgkJfQoJfTsKfSk7CgovLyBJRSBzdWJtaXQgZGVsZWdhdGlvbgppZiAoICFqUXVlcnkuc3VwcG9ydC5zdWJtaXRCdWJibGVzICkgewoKCWpRdWVyeS5ldmVudC5zcGVjaWFsLnN1Ym1pdCA9IHsKCQlzZXR1cDogZnVuY3Rpb24oKSB7CgkJCS8vIE9ubHkgbmVlZCB0aGlzIGZvciBkZWxlZ2F0ZWQgZm9ybSBzdWJtaXQgZXZlbnRzCgkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCAiZm9ybSIgKSApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoKCQkJLy8gTGF6eS1hZGQgYSBzdWJtaXQgaGFuZGxlciB3aGVuIGEgZGVzY2VuZGFudCBmb3JtIG1heSBwb3RlbnRpYWxseSBiZSBzdWJtaXR0ZWQKCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgImNsaWNrLl9zdWJtaXQga2V5cHJlc3MuX3N1Ym1pdCIsIGZ1bmN0aW9uKCBlICkgewoJCQkJLy8gTm9kZSBuYW1lIGNoZWNrIGF2b2lkcyBhIFZNTC1yZWxhdGVkIGNyYXNoIGluIElFICgjOTgwNykKCQkJCXZhciBlbGVtID0gZS50YXJnZXQsCgkJCQkJZm9ybSA9IGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlucHV0IiApIHx8IGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImJ1dHRvbiIgKSA/IGVsZW0uZm9ybSA6IHVuZGVmaW5lZDsKCQkJCWlmICggZm9ybSAmJiAhalF1ZXJ5Ll9kYXRhKCBmb3JtLCAiX3N1Ym1pdF9hdHRhY2hlZCIgKSApIHsKCQkJCQlqUXVlcnkuZXZlbnQuYWRkKCBmb3JtLCAic3VibWl0Ll9zdWJtaXQiLCBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkJCWV2ZW50Ll9zdWJtaXRfYnViYmxlID0gdHJ1ZTsKCQkJCQl9KTsKCQkJCQlqUXVlcnkuX2RhdGEoIGZvcm0sICJfc3VibWl0X2F0dGFjaGVkIiwgdHJ1ZSApOwoJCQkJfQoJCQl9KTsKCQkJLy8gcmV0dXJuIHVuZGVmaW5lZCBzaW5jZSB3ZSBkb24ndCBuZWVkIGFuIGV2ZW50IGxpc3RlbmVyCgkJfSwKCgkJcG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCS8vIElmIGZvcm0gd2FzIHN1Ym1pdHRlZCBieSB0aGUgdXNlciwgYnViYmxlIHRoZSBldmVudCB1cCB0aGUgdHJlZQoJCQlpZiAoIGV2ZW50Ll9zdWJtaXRfYnViYmxlICkgewoJCQkJZGVsZXRlIGV2ZW50Ll9zdWJtaXRfYnViYmxlOwoJCQkJaWYgKCB0aGlzLnBhcmVudE5vZGUgJiYgIWV2ZW50LmlzVHJpZ2dlciApIHsKCQkJCQlqUXVlcnkuZXZlbnQuc2ltdWxhdGUoICJzdWJtaXQiLCB0aGlzLnBhcmVudE5vZGUsIGV2ZW50LCB0cnVlICk7CgkJCQl9CgkJCX0KCQl9LAoKCQl0ZWFyZG93bjogZnVuY3Rpb24oKSB7CgkJCS8vIE9ubHkgbmVlZCB0aGlzIGZvciBkZWxlZ2F0ZWQgZm9ybSBzdWJtaXQgZXZlbnRzCgkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCAiZm9ybSIgKSApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoKCQkJLy8gUmVtb3ZlIGRlbGVnYXRlZCBoYW5kbGVyczsgY2xlYW5EYXRhIGV2ZW50dWFsbHkgcmVhcHMgc3VibWl0IGhhbmRsZXJzIGF0dGFjaGVkIGFib3ZlCgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsICIuX3N1Ym1pdCIgKTsKCQl9Cgl9Owp9CgovLyBJRSBjaGFuZ2UgZGVsZWdhdGlvbiBhbmQgY2hlY2tib3gvcmFkaW8gZml4CmlmICggIWpRdWVyeS5zdXBwb3J0LmNoYW5nZUJ1YmJsZXMgKSB7CgoJalF1ZXJ5LmV2ZW50LnNwZWNpYWwuY2hhbmdlID0gewoKCQlzZXR1cDogZnVuY3Rpb24oKSB7CgoJCQlpZiAoIHJmb3JtRWxlbXMudGVzdCggdGhpcy5ub2RlTmFtZSApICkgewoJCQkJLy8gSUUgZG9lc24ndCBmaXJlIGNoYW5nZSBvbiBhIGNoZWNrL3JhZGlvIHVudGlsIGJsdXI7IHRyaWdnZXIgaXQgb24gY2xpY2sKCQkJCS8vIGFmdGVyIGEgcHJvcGVydHljaGFuZ2UuIEVhdCB0aGUgYmx1ci1jaGFuZ2UgaW4gc3BlY2lhbC5jaGFuZ2UuaGFuZGxlLgoJCQkJLy8gVGhpcyBzdGlsbCBmaXJlcyBvbmNoYW5nZSBhIHNlY29uZCB0aW1lIGZvciBjaGVjay9yYWRpbyBhZnRlciBibHVyLgoJCQkJaWYgKCB0aGlzLnR5cGUgPT09ICJjaGVja2JveCIgfHwgdGhpcy50eXBlID09PSAicmFkaW8iICkgewoJCQkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsICJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdlIiwgZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJCQlpZiAoIGV2ZW50Lm9yaWdpbmFsRXZlbnQucHJvcGVydHlOYW1lID09PSAiY2hlY2tlZCIgKSB7CgkJCQkJCQl0aGlzLl9qdXN0X2NoYW5nZWQgPSB0cnVlOwoJCQkJCQl9CgkJCQkJfSk7CgkJCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgImNsaWNrLl9jaGFuZ2UiLCBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkJCWlmICggdGhpcy5fanVzdF9jaGFuZ2VkICYmICFldmVudC5pc1RyaWdnZXIgKSB7CgkJCQkJCQl0aGlzLl9qdXN0X2NoYW5nZWQgPSBmYWxzZTsKCQkJCQkJfQoJCQkJCQkvLyBBbGxvdyB0cmlnZ2VyZWQsIHNpbXVsYXRlZCBjaGFuZ2UgZXZlbnRzICgjMTE1MDApCgkJCQkJCWpRdWVyeS5ldmVudC5zaW11bGF0ZSggImNoYW5nZSIsIHRoaXMsIGV2ZW50LCB0cnVlICk7CgkJCQkJfSk7CgkJCQl9CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQkJLy8gRGVsZWdhdGVkIGV2ZW50OyBsYXp5LWFkZCBhIGNoYW5nZSBoYW5kbGVyIG9uIGRlc2NlbmRhbnQgaW5wdXRzCgkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsICJiZWZvcmVhY3RpdmF0ZS5fY2hhbmdlIiwgZnVuY3Rpb24oIGUgKSB7CgkJCQl2YXIgZWxlbSA9IGUudGFyZ2V0OwoKCQkJCWlmICggcmZvcm1FbGVtcy50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiYgIWpRdWVyeS5fZGF0YSggZWxlbSwgIl9jaGFuZ2VfYXR0YWNoZWQiICkgKSB7CgkJCQkJalF1ZXJ5LmV2ZW50LmFkZCggZWxlbSwgImNoYW5nZS5fY2hhbmdlIiwgZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJCQlpZiAoIHRoaXMucGFyZW50Tm9kZSAmJiAhZXZlbnQuaXNTaW11bGF0ZWQgJiYgIWV2ZW50LmlzVHJpZ2dlciApIHsKCQkJCQkJCWpRdWVyeS5ldmVudC5zaW11bGF0ZSggImNoYW5nZSIsIHRoaXMucGFyZW50Tm9kZSwgZXZlbnQsIHRydWUgKTsKCQkJCQkJfQoJCQkJCX0pOwoJCQkJCWpRdWVyeS5fZGF0YSggZWxlbSwgIl9jaGFuZ2VfYXR0YWNoZWQiLCB0cnVlICk7CgkJCQl9CgkJCX0pOwoJCX0sCgoJCWhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQl2YXIgZWxlbSA9IGV2ZW50LnRhcmdldDsKCgkJCS8vIFN3YWxsb3cgbmF0aXZlIGNoYW5nZSBldmVudHMgZnJvbSBjaGVja2JveC9yYWRpbywgd2UgYWxyZWFkeSB0cmlnZ2VyZWQgdGhlbSBhYm92ZQoJCQlpZiAoIHRoaXMgIT09IGVsZW0gfHwgZXZlbnQuaXNTaW11bGF0ZWQgfHwgZXZlbnQuaXNUcmlnZ2VyIHx8IChlbGVtLnR5cGUgIT09ICJyYWRpbyIgJiYgZWxlbS50eXBlICE9PSAiY2hlY2tib3giKSApIHsKCQkJCXJldHVybiBldmVudC5oYW5kbGVPYmouaGFuZGxlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCX0KCQl9LAoKCQl0ZWFyZG93bjogZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsICIuX2NoYW5nZSIgKTsKCgkJCXJldHVybiAhcmZvcm1FbGVtcy50ZXN0KCB0aGlzLm5vZGVOYW1lICk7CgkJfQoJfTsKfQoKLy8gQ3JlYXRlICJidWJibGluZyIgZm9jdXMgYW5kIGJsdXIgZXZlbnRzCmlmICggIWpRdWVyeS5zdXBwb3J0LmZvY3VzaW5CdWJibGVzICkgewoJalF1ZXJ5LmVhY2goeyBmb2N1czogImZvY3VzaW4iLCBibHVyOiAiZm9jdXNvdXQiIH0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7CgoJCS8vIEF0dGFjaCBhIHNpbmdsZSBjYXB0dXJpbmcgaGFuZGxlciB3aGlsZSBzb21lb25lIHdhbnRzIGZvY3VzaW4vZm9jdXNvdXQKCQl2YXIgYXR0YWNoZXMgPSAwLAoJCQloYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJalF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCBmaXgsIGV2ZW50LnRhcmdldCwgalF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgKSwgdHJ1ZSApOwoJCQl9OwoKCQlqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7CgkJCXNldHVwOiBmdW5jdGlvbigpIHsKCQkJCWlmICggYXR0YWNoZXMrKyA9PT0gMCApIHsKCQkJCQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCBvcmlnLCBoYW5kbGVyLCB0cnVlICk7CgkJCQl9CgkJCX0sCgkJCXRlYXJkb3duOiBmdW5jdGlvbigpIHsKCQkJCWlmICggLS1hdHRhY2hlcyA9PT0gMCApIHsKCQkJCQlkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCBvcmlnLCBoYW5kbGVyLCB0cnVlICk7CgkJCQl9CgkJCX0KCQl9OwoJfSk7Cn0KCmpRdWVyeS5mbi5leHRlbmQoewoKCW9uOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgLypJTlRFUk5BTCovIG9uZSApIHsKCQl2YXIgb3JpZ0ZuLCB0eXBlOwoKCQkvLyBUeXBlcyBjYW4gYmUgYSBtYXAgb2YgdHlwZXMvaGFuZGxlcnMKCQlpZiAoIHR5cGVvZiB0eXBlcyA9PT0gIm9iamVjdCIgKSB7CgkJCS8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApCgkJCWlmICggdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiApIHsgLy8gJiYgc2VsZWN0b3IgIT0gbnVsbAoJCQkJLy8gKCB0eXBlcy1PYmplY3QsIGRhdGEgKQoJCQkJZGF0YSA9IGRhdGEgfHwgc2VsZWN0b3I7CgkJCQlzZWxlY3RvciA9IHVuZGVmaW5lZDsKCQkJfQoJCQlmb3IgKCB0eXBlIGluIHR5cGVzICkgewoJCQkJdGhpcy5vbiggdHlwZSwgc2VsZWN0b3IsIGRhdGEsIHR5cGVzWyB0eXBlIF0sIG9uZSApOwoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJaWYgKCBkYXRhID09IG51bGwgJiYgZm4gPT0gbnVsbCApIHsKCQkJLy8gKCB0eXBlcywgZm4gKQoJCQlmbiA9IHNlbGVjdG9yOwoJCQlkYXRhID0gc2VsZWN0b3IgPSB1bmRlZmluZWQ7CgkJfSBlbHNlIGlmICggZm4gPT0gbnVsbCApIHsKCQkJaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciICkgewoJCQkJLy8gKCB0eXBlcywgc2VsZWN0b3IsIGZuICkKCQkJCWZuID0gZGF0YTsKCQkJCWRhdGEgPSB1bmRlZmluZWQ7CgkJCX0gZWxzZSB7CgkJCQkvLyAoIHR5cGVzLCBkYXRhLCBmbiApCgkJCQlmbiA9IGRhdGE7CgkJCQlkYXRhID0gc2VsZWN0b3I7CgkJCQlzZWxlY3RvciA9IHVuZGVmaW5lZDsKCQkJfQoJCX0KCQlpZiAoIGZuID09PSBmYWxzZSApIHsKCQkJZm4gPSByZXR1cm5GYWxzZTsKCQl9IGVsc2UgaWYgKCAhZm4gKSB7CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJaWYgKCBvbmUgPT09IDEgKSB7CgkJCW9yaWdGbiA9IGZuOwoJCQlmbiA9IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCS8vIENhbiB1c2UgYW4gZW1wdHkgc2V0LCBzaW5jZSBldmVudCBjb250YWlucyB0aGUgaW5mbwoJCQkJalF1ZXJ5KCkub2ZmKCBldmVudCApOwoJCQkJcmV0dXJuIG9yaWdGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCX07CgkJCS8vIFVzZSBzYW1lIGd1aWQgc28gY2FsbGVyIGNhbiByZW1vdmUgdXNpbmcgb3JpZ0ZuCgkJCWZuLmd1aWQgPSBvcmlnRm4uZ3VpZCB8fCAoIG9yaWdGbi5ndWlkID0galF1ZXJ5Lmd1aWQrKyApOwoJCX0KCQlyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHsKCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgdHlwZXMsIGZuLCBkYXRhLCBzZWxlY3RvciApOwoJCX0pOwoJfSwKCW9uZTogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7CgkJcmV0dXJuIHRoaXMub24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIDEgKTsKCX0sCglvZmY6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGZuICkgewoJCXZhciBoYW5kbGVPYmosIHR5cGU7CgkJaWYgKCB0eXBlcyAmJiB0eXBlcy5wcmV2ZW50RGVmYXVsdCAmJiB0eXBlcy5oYW5kbGVPYmogKSB7CgkJCS8vICggZXZlbnQgKSAgZGlzcGF0Y2hlZCBqUXVlcnkuRXZlbnQKCQkJaGFuZGxlT2JqID0gdHlwZXMuaGFuZGxlT2JqOwoJCQlqUXVlcnkoIHR5cGVzLmRlbGVnYXRlVGFyZ2V0ICkub2ZmKAoJCQkJaGFuZGxlT2JqLm5hbWVzcGFjZSA/IGhhbmRsZU9iai5vcmlnVHlwZSArICIuIiArIGhhbmRsZU9iai5uYW1lc3BhY2UgOiBoYW5kbGVPYmoub3JpZ1R5cGUsCgkJCQloYW5kbGVPYmouc2VsZWN0b3IsCgkJCQloYW5kbGVPYmouaGFuZGxlcgoJCQkpOwoJCQlyZXR1cm4gdGhpczsKCQl9CgkJaWYgKCB0eXBlb2YgdHlwZXMgPT09ICJvYmplY3QiICkgewoJCQkvLyAoIHR5cGVzLW9iamVjdCBbLCBzZWxlY3Rvcl0gKQoJCQlmb3IgKCB0eXBlIGluIHR5cGVzICkgewoJCQkJdGhpcy5vZmYoIHR5cGUsIHNlbGVjdG9yLCB0eXBlc1sgdHlwZSBdICk7CgkJCX0KCQkJcmV0dXJuIHRoaXM7CgkJfQoJCWlmICggc2VsZWN0b3IgPT09IGZhbHNlIHx8IHR5cGVvZiBzZWxlY3RvciA9PT0gImZ1bmN0aW9uIiApIHsKCQkJLy8gKCB0eXBlcyBbLCBmbl0gKQoJCQlmbiA9IHNlbGVjdG9yOwoJCQlzZWxlY3RvciA9IHVuZGVmaW5lZDsKCQl9CgkJaWYgKCBmbiA9PT0gZmFsc2UgKSB7CgkJCWZuID0gcmV0dXJuRmFsc2U7CgkJfQoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIHR5cGVzLCBmbiwgc2VsZWN0b3IgKTsKCQl9KTsKCX0sCgoJYmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHsKCQlyZXR1cm4gdGhpcy5vbiggdHlwZXMsIG51bGwsIGRhdGEsIGZuICk7Cgl9LAoJdW5iaW5kOiBmdW5jdGlvbiggdHlwZXMsIGZuICkgewoJCXJldHVybiB0aGlzLm9mZiggdHlwZXMsIG51bGwsIGZuICk7Cgl9LAoKCWxpdmU6IGZ1bmN0aW9uKCB0eXBlcywgZGF0YSwgZm4gKSB7CgkJalF1ZXJ5KCB0aGlzLmNvbnRleHQgKS5vbiggdHlwZXMsIHRoaXMuc2VsZWN0b3IsIGRhdGEsIGZuICk7CgkJcmV0dXJuIHRoaXM7Cgl9LAoJZGllOiBmdW5jdGlvbiggdHlwZXMsIGZuICkgewoJCWpRdWVyeSggdGhpcy5jb250ZXh0ICkub2ZmKCB0eXBlcywgdGhpcy5zZWxlY3RvciB8fCAiKioiLCBmbiApOwoJCXJldHVybiB0aGlzOwoJfSwKCglkZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZGF0YSwgZm4gKSB7CgkJcmV0dXJuIHRoaXMub24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTsKCX0sCgl1bmRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBmbiApIHsKCQkvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApCgkJcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyB0aGlzLm9mZiggc2VsZWN0b3IsICIqKiIgKSA6IHRoaXMub2ZmKCB0eXBlcywgc2VsZWN0b3IgfHwgIioqIiwgZm4gKTsKCX0sCgoJdHJpZ2dlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7CgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIHRoaXMgKTsKCQl9KTsKCX0sCgl0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7CgkJaWYgKCB0aGlzWzBdICkgewoJCQlyZXR1cm4galF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIHRoaXNbMF0sIHRydWUgKTsKCQl9Cgl9LAoKCXRvZ2dsZTogZnVuY3Rpb24oIGZuICkgewoJCS8vIFNhdmUgcmVmZXJlbmNlIHRvIGFyZ3VtZW50cyBmb3IgYWNjZXNzIGluIGNsb3N1cmUKCQl2YXIgYXJncyA9IGFyZ3VtZW50cywKCQkJZ3VpZCA9IGZuLmd1aWQgfHwgalF1ZXJ5Lmd1aWQrKywKCQkJaSA9IDAsCgkJCXRvZ2dsZXIgPSBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkvLyBGaWd1cmUgb3V0IHdoaWNoIGZ1bmN0aW9uIHRvIGV4ZWN1dGUKCQkJCXZhciBsYXN0VG9nZ2xlID0gKCBqUXVlcnkuX2RhdGEoIHRoaXMsICJsYXN0VG9nZ2xlIiArIGZuLmd1aWQgKSB8fCAwICkgJSBpOwoJCQkJalF1ZXJ5Ll9kYXRhKCB0aGlzLCAibGFzdFRvZ2dsZSIgKyBmbi5ndWlkLCBsYXN0VG9nZ2xlICsgMSApOwoKCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IGNsaWNrcyBzdG9wCgkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoKCQkJCS8vIGFuZCBleGVjdXRlIHRoZSBmdW5jdGlvbgoJCQkJcmV0dXJuIGFyZ3NbIGxhc3RUb2dnbGUgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgfHwgZmFsc2U7CgkJCX07CgoJCS8vIGxpbmsgYWxsIHRoZSBmdW5jdGlvbnMsIHNvIGFueSBvZiB0aGVtIGNhbiB1bmJpbmQgdGhpcyBjbGljayBoYW5kbGVyCgkJdG9nZ2xlci5ndWlkID0gZ3VpZDsKCQl3aGlsZSAoIGkgPCBhcmdzLmxlbmd0aCApIHsKCQkJYXJnc1sgaSsrIF0uZ3VpZCA9IGd1aWQ7CgkJfQoKCQlyZXR1cm4gdGhpcy5jbGljayggdG9nZ2xlciApOwoJfSwKCglob3ZlcjogZnVuY3Rpb24oIGZuT3ZlciwgZm5PdXQgKSB7CgkJcmV0dXJuIHRoaXMubW91c2VlbnRlciggZm5PdmVyICkubW91c2VsZWF2ZSggZm5PdXQgfHwgZm5PdmVyICk7Cgl9Cn0pOwoKalF1ZXJ5LmVhY2goICgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgIiArCgkibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgIiArCgkiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIpLnNwbGl0KCIgIiksIGZ1bmN0aW9uKCBpLCBuYW1lICkgewoKCS8vIEhhbmRsZSBldmVudCBiaW5kaW5nCglqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBkYXRhLCBmbiApIHsKCQlpZiAoIGZuID09IG51bGwgKSB7CgkJCWZuID0gZGF0YTsKCQkJZGF0YSA9IG51bGw7CgkJfQoKCQlyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDAgPwoJCQl0aGlzLm9uKCBuYW1lLCBudWxsLCBkYXRhLCBmbiApIDoKCQkJdGhpcy50cmlnZ2VyKCBuYW1lICk7Cgl9OwoKCWlmICggcmtleUV2ZW50LnRlc3QoIG5hbWUgKSApIHsKCQlqUXVlcnkuZXZlbnQuZml4SG9va3NbIG5hbWUgXSA9IGpRdWVyeS5ldmVudC5rZXlIb29rczsKCX0KCglpZiAoIHJtb3VzZUV2ZW50LnRlc3QoIG5hbWUgKSApIHsKCQlqUXVlcnkuZXZlbnQuZml4SG9va3NbIG5hbWUgXSA9IGpRdWVyeS5ldmVudC5tb3VzZUhvb2tzOwoJfQp9KTsKLyohCiAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lCiAqIENvcHlyaWdodCAyMDEyIGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAqIGh0dHA6Ly9zaXp6bGVqcy5jb20vCiAqLwooZnVuY3Rpb24oIHdpbmRvdywgdW5kZWZpbmVkICkgewoKdmFyIGNhY2hlZHJ1bnMsCglhc3NlcnRHZXRJZE5vdE5hbWUsCglFeHByLAoJZ2V0VGV4dCwKCWlzWE1MLAoJY29udGFpbnMsCgljb21waWxlLAoJc29ydE9yZGVyLAoJaGFzRHVwbGljYXRlLAoJb3V0ZXJtb3N0Q29udGV4dCwKCgliYXNlSGFzRHVwbGljYXRlID0gdHJ1ZSwKCXN0cnVuZGVmaW5lZCA9ICJ1bmRlZmluZWQiLAoKCWV4cGFuZG8gPSAoICJzaXpjYWNoZSIgKyBNYXRoLnJhbmRvbSgpICkucmVwbGFjZSggIi4iLCAiIiApLAoKCVRva2VuID0gU3RyaW5nLAoJZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQsCglkb2NFbGVtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LAoJZGlycnVucyA9IDAsCglkb25lID0gMCwKCXBvcCA9IFtdLnBvcCwKCXB1c2ggPSBbXS5wdXNoLAoJc2xpY2UgPSBbXS5zbGljZSwKCS8vIFVzZSBhIHN0cmlwcGVkLWRvd24gaW5kZXhPZiBpZiBhIG5hdGl2ZSBvbmUgaXMgdW5hdmFpbGFibGUKCWluZGV4T2YgPSBbXS5pbmRleE9mIHx8IGZ1bmN0aW9uKCBlbGVtICkgewoJCXZhciBpID0gMCwKCQkJbGVuID0gdGhpcy5sZW5ndGg7CgkJZm9yICggOyBpIDwgbGVuOyBpKysgKSB7CgkJCWlmICggdGhpc1tpXSA9PT0gZWxlbSApIHsKCQkJCXJldHVybiBpOwoJCQl9CgkJfQoJCXJldHVybiAtMTsKCX0sCgoJLy8gQXVnbWVudCBhIGZ1bmN0aW9uIGZvciBzcGVjaWFsIHVzZSBieSBTaXp6bGUKCW1hcmtGdW5jdGlvbiA9IGZ1bmN0aW9uKCBmbiwgdmFsdWUgKSB7CgkJZm5bIGV4cGFuZG8gXSA9IHZhbHVlID09IG51bGwgfHwgdmFsdWU7CgkJcmV0dXJuIGZuOwoJfSwKCgljcmVhdGVDYWNoZSA9IGZ1bmN0aW9uKCkgewoJCXZhciBjYWNoZSA9IHt9LAoJCQlrZXlzID0gW107CgoJCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJCS8vIE9ubHkga2VlcCB0aGUgbW9zdCByZWNlbnQgZW50cmllcwoJCQlpZiAoIGtleXMucHVzaCgga2V5ICkgPiBFeHByLmNhY2hlTGVuZ3RoICkgewoJCQkJZGVsZXRlIGNhY2hlWyBrZXlzLnNoaWZ0KCkgXTsKCQkJfQoKCQkJcmV0dXJuIChjYWNoZVsga2V5IF0gPSB2YWx1ZSk7CgkJfSwgY2FjaGUgKTsKCX0sCgoJY2xhc3NDYWNoZSA9IGNyZWF0ZUNhY2hlKCksCgl0b2tlbkNhY2hlID0gY3JlYXRlQ2FjaGUoKSwKCWNvbXBpbGVyQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLAoKCS8vIFJlZ2V4CgoJLy8gV2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc2VsZWN0b3JzLyN3aGl0ZXNwYWNlCgl3aGl0ZXNwYWNlID0gIltcXHgyMFxcdFxcclxcblxcZl0iLAoJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zeW50YXgvI2NoYXJhY3RlcnMKCWNoYXJhY3RlckVuY29kaW5nID0gIig/OlxcXFwufFstXFx3XXxbXlxceDAwLVxceGEwXSkrIiwKCgkvLyBMb29zZWx5IG1vZGVsZWQgb24gQ1NTIGlkZW50aWZpZXIgY2hhcmFjdGVycwoJLy8gQW4gdW5xdW90ZWQgdmFsdWUgc2hvdWxkIGJlIGEgQ1NTIGlkZW50aWZpZXIgKGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzKQoJLy8gUHJvcGVyIHN5bnRheDogaHR0cDovL3d3dy53My5vcmcvVFIvQ1NTMjEvc3luZGF0YS5odG1sI3ZhbHVlLWRlZi1pZGVudGlmaWVyCglpZGVudGlmaWVyID0gY2hhcmFjdGVyRW5jb2RpbmcucmVwbGFjZSggInciLCAidyMiICksCgoJLy8gQWNjZXB0YWJsZSBvcGVyYXRvcnMgaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzCglvcGVyYXRvcnMgPSAiKFsqXiR8IX5dPz0pIiwKCWF0dHJpYnV0ZXMgPSAiXFxbIiArIHdoaXRlc3BhY2UgKyAiKigiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyAiKSIgKyB3aGl0ZXNwYWNlICsKCQkiKig/OiIgKyBvcGVyYXRvcnMgKyB3aGl0ZXNwYWNlICsgIiooPzooWydcIl0pKCg/OlxcXFwufFteXFxcXF0pKj8pXFwzfCgiICsgaWRlbnRpZmllciArICIpfCl8KSIgKyB3aGl0ZXNwYWNlICsgIipcXF0iLAoKCS8vIFByZWZlciBhcmd1bWVudHMgbm90IGluIHBhcmVucy9icmFja2V0cywKCS8vICAgdGhlbiBhdHRyaWJ1dGUgc2VsZWN0b3JzIGFuZCBub24tcHNldWRvcyAoZGVub3RlZCBieSA6KSwKCS8vICAgdGhlbiBhbnl0aGluZyBlbHNlCgkvLyBUaGVzZSBwcmVmZXJlbmNlcyBhcmUgaGVyZSB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBzZWxlY3RvcnMKCS8vICAgbmVlZGluZyB0b2tlbml6ZSBpbiB0aGUgUFNFVURPIHByZUZpbHRlcgoJcHNldWRvcyA9ICI6KCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArICIpKD86XFwoKD86KFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcMnwoW14oKVtcXF1dKnwoPzooPzoiICsgYXR0cmlidXRlcyArICIpfFteOl18XFxcXC4pKnwuKikpXFwpfCkiLAoKCS8vIEZvciBtYXRjaEV4cHIuUE9TIGFuZCBtYXRjaEV4cHIubmVlZHNDb250ZXh0Cglwb3MgPSAiOihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiICsgd2hpdGVzcGFjZSArCgkJIiooKD86LVxcZCk/XFxkKikiICsgd2hpdGVzcGFjZSArICIqXFwpfCkoPz1bXi1dfCQpIiwKCgkvLyBMZWFkaW5nIGFuZCBub24tZXNjYXBlZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBjYXB0dXJpbmcgc29tZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZGluZyB0aGUgbGF0dGVyCglydHJpbSA9IG5ldyBSZWdFeHAoICJeIiArIHdoaXRlc3BhY2UgKyAiK3woKD86XnxbXlxcXFxdKSg/OlxcXFwuKSopIiArIHdoaXRlc3BhY2UgKyAiKyQiLCAiZyIgKSwKCglyY29tbWEgPSBuZXcgUmVnRXhwKCAiXiIgKyB3aGl0ZXNwYWNlICsgIiosIiArIHdoaXRlc3BhY2UgKyAiKiIgKSwKCXJjb21iaW5hdG9ycyA9IG5ldyBSZWdFeHAoICJeIiArIHdoaXRlc3BhY2UgKyAiKihbXFx4MjBcXHRcXHJcXG5cXGY+K35dKSIgKyB3aGl0ZXNwYWNlICsgIioiICksCglycHNldWRvID0gbmV3IFJlZ0V4cCggcHNldWRvcyApLAoKCS8vIEVhc2lseS1wYXJzZWFibGUvcmV0cmlldmFibGUgSUQgb3IgVEFHIG9yIENMQVNTIHNlbGVjdG9ycwoJcnF1aWNrRXhwciA9IC9eKD86IyhbXHdcLV0rKXwoXHcrKXxcLihbXHdcLV0rKSkkLywKCglybm90ID0gL146bm90LywKCXJzaWJsaW5nID0gL1tceDIwXHRcclxuXGZdKlsrfl0vLAoJcmVuZHNXaXRoTm90ID0gLzpub3RcKCQvLAoKCXJoZWFkZXIgPSAvaFxkL2ksCglyaW5wdXRzID0gL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24vaSwKCglyYmFja3NsYXNoID0gL1xcKD8hXFwpL2csCgoJbWF0Y2hFeHByID0gewoJCSJJRCI6IG5ldyBSZWdFeHAoICJeIygiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyAiKSIgKSwKCQkiQ0xBU1MiOiBuZXcgUmVnRXhwKCAiXlxcLigiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyAiKSIgKSwKCQkiTkFNRSI6IG5ldyBSZWdFeHAoICJeXFxbbmFtZT1bJ1wiXT8oIiArIGNoYXJhY3RlckVuY29kaW5nICsgIilbJ1wiXT9cXF0iICksCgkJIlRBRyI6IG5ldyBSZWdFeHAoICJeKCIgKyBjaGFyYWN0ZXJFbmNvZGluZy5yZXBsYWNlKCAidyIsICJ3KiIgKSArICIpIiApLAoJCSJBVFRSIjogbmV3IFJlZ0V4cCggIl4iICsgYXR0cmlidXRlcyApLAoJCSJQU0VVRE8iOiBuZXcgUmVnRXhwKCAiXiIgKyBwc2V1ZG9zICksCgkJIlBPUyI6IG5ldyBSZWdFeHAoIHBvcywgImkiICksCgkJIkNISUxEIjogbmV3IFJlZ0V4cCggIl46KG9ubHl8bnRofGZpcnN0fGxhc3QpLWNoaWxkKD86XFwoIiArIHdoaXRlc3BhY2UgKwoJCQkiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIgKyB3aGl0ZXNwYWNlICsgIiooPzooWystXXwpIiArIHdoaXRlc3BhY2UgKwoJCQkiKihcXGQrKXwpKSIgKyB3aGl0ZXNwYWNlICsgIipcXCl8KSIsICJpIiApLAoJCS8vIEZvciB1c2UgaW4gbGlicmFyaWVzIGltcGxlbWVudGluZyAuaXMoKQoJCSJuZWVkc0NvbnRleHQiOiBuZXcgUmVnRXhwKCAiXiIgKyB3aGl0ZXNwYWNlICsgIipbPit+XXwiICsgcG9zLCAiaSIgKQoJfSwKCgkvLyBTdXBwb3J0CgoJLy8gVXNlZCBmb3IgdGVzdGluZyBzb21ldGhpbmcgb24gYW4gZWxlbWVudAoJYXNzZXJ0ID0gZnVuY3Rpb24oIGZuICkgewoJCXZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKCgkJdHJ5IHsKCQkJcmV0dXJuIGZuKCBkaXYgKTsKCQl9IGNhdGNoIChlKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9IGZpbmFsbHkgewoJCQkvLyByZWxlYXNlIG1lbW9yeSBpbiBJRQoJCQlkaXYgPSBudWxsOwoJCX0KCX0sCgoJLy8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSByZXR1cm5zIG9ubHkgZWxlbWVudHMKCWFzc2VydFRhZ05hbWVOb0NvbW1lbnRzID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7CgkJZGl2LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKSApOwoJCXJldHVybiAhZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RoOwoJfSksCgoJLy8gQ2hlY2sgaWYgZ2V0QXR0cmlidXRlIHJldHVybnMgbm9ybWFsaXplZCBocmVmIGF0dHJpYnV0ZXMKCWFzc2VydEhyZWZOb3ROb3JtYWxpemVkID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7CgkJZGl2LmlubmVySFRNTCA9ICI8YSBocmVmPScjJz48L2E+IjsKCQlyZXR1cm4gZGl2LmZpcnN0Q2hpbGQgJiYgdHlwZW9mIGRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSAhPT0gc3RydW5kZWZpbmVkICYmCgkJCWRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpID09PSAiIyI7Cgl9KSwKCgkvLyBDaGVjayBpZiBhdHRyaWJ1dGVzIHNob3VsZCBiZSByZXRyaWV2ZWQgYnkgYXR0cmlidXRlIG5vZGVzCglhc3NlcnRBdHRyaWJ1dGVzID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7CgkJZGl2LmlubmVySFRNTCA9ICI8c2VsZWN0Pjwvc2VsZWN0PiI7CgkJdmFyIHR5cGUgPSB0eXBlb2YgZGl2Lmxhc3RDaGlsZC5nZXRBdHRyaWJ1dGUoIm11bHRpcGxlIik7CgkJLy8gSUU4IHJldHVybnMgYSBzdHJpbmcgZm9yIHNvbWUgYXR0cmlidXRlcyBldmVuIHdoZW4gbm90IHByZXNlbnQKCQlyZXR1cm4gdHlwZSAhPT0gImJvb2xlYW4iICYmIHR5cGUgIT09ICJzdHJpbmciOwoJfSksCgoJLy8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSBjYW4gYmUgdHJ1c3RlZAoJYXNzZXJ0VXNhYmxlQ2xhc3NOYW1lID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7CgkJLy8gT3BlcmEgY2FuJ3QgZmluZCBhIHNlY29uZCBjbGFzc25hbWUgKGluIDkuNikKCQlkaXYuaW5uZXJIVE1MID0gIjxkaXYgY2xhc3M9J2hpZGRlbiBlJz48L2Rpdj48ZGl2IGNsYXNzPSdoaWRkZW4nPjwvZGl2PiI7CgkJaWYgKCAhZGl2LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgfHwgIWRpdi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQkvLyBTYWZhcmkgMy4yIGNhY2hlcyBjbGFzcyBhdHRyaWJ1dGVzIGFuZCBkb2Vzbid0IGNhdGNoIGNoYW5nZXMKCQlkaXYubGFzdENoaWxkLmNsYXNzTmFtZSA9ICJlIjsKCQlyZXR1cm4gZGl2LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGggPT09IDI7Cgl9KSwKCgkvLyBDaGVjayBpZiBnZXRFbGVtZW50QnlJZCByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWUKCS8vIENoZWNrIGlmIGdldEVsZW1lbnRzQnlOYW1lIHByaXZpbGVnZXMgZm9ybSBjb250cm9scyBvciByZXR1cm5zIGVsZW1lbnRzIGJ5IElECglhc3NlcnRVc2FibGVOYW1lID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7CgkJLy8gSW5qZWN0IGNvbnRlbnQKCQlkaXYuaWQgPSBleHBhbmRvICsgMDsKCQlkaXYuaW5uZXJIVE1MID0gIjxhIG5hbWU9JyIgKyBleHBhbmRvICsgIic+PC9hPjxkaXYgbmFtZT0nIiArIGV4cGFuZG8gKyAiJz48L2Rpdj4iOwoJCWRvY0VsZW0uaW5zZXJ0QmVmb3JlKCBkaXYsIGRvY0VsZW0uZmlyc3RDaGlsZCApOwoKCQkvLyBUZXN0CgkJdmFyIHBhc3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSAmJgoJCQkvLyBidWdneSBicm93c2VycyB3aWxsIHJldHVybiBmZXdlciB0aGFuIHRoZSBjb3JyZWN0IDIKCQkJZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoIGV4cGFuZG8gKS5sZW5ndGggPT09IDIgKwoJCQkvLyBidWdneSBicm93c2VycyB3aWxsIHJldHVybiBtb3JlIHRoYW4gdGhlIGNvcnJlY3QgMAoJCQlkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSggZXhwYW5kbyArIDAgKS5sZW5ndGg7CgkJYXNzZXJ0R2V0SWROb3ROYW1lID0gIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBleHBhbmRvICk7CgoJCS8vIENsZWFudXAKCQlkb2NFbGVtLnJlbW92ZUNoaWxkKCBkaXYgKTsKCgkJcmV0dXJuIHBhc3M7Cgl9KTsKCi8vIElmIHNsaWNlIGlzIG5vdCBhdmFpbGFibGUsIHByb3ZpZGUgYSBiYWNrdXAKdHJ5IHsKCXNsaWNlLmNhbGwoIGRvY0VsZW0uY2hpbGROb2RlcywgMCApWzBdLm5vZGVUeXBlOwp9IGNhdGNoICggZSApIHsKCXNsaWNlID0gZnVuY3Rpb24oIGkgKSB7CgkJdmFyIGVsZW0sCgkJCXJlc3VsdHMgPSBbXTsKCQlmb3IgKCA7IChlbGVtID0gdGhpc1tpXSk7IGkrKyApIHsKCQkJcmVzdWx0cy5wdXNoKCBlbGVtICk7CgkJfQoJCXJldHVybiByZXN1bHRzOwoJfTsKfQoKZnVuY3Rpb24gU2l6emxlKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHsKCXJlc3VsdHMgPSByZXN1bHRzIHx8IFtdOwoJY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7Cgl2YXIgbWF0Y2gsIGVsZW0sIHhtbCwgbSwKCQlub2RlVHlwZSA9IGNvbnRleHQubm9kZVR5cGU7CgoJaWYgKCAhc2VsZWN0b3IgfHwgdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiApIHsKCQlyZXR1cm4gcmVzdWx0czsKCX0KCglpZiAoIG5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICkgewoJCXJldHVybiBbXTsKCX0KCgl4bWwgPSBpc1hNTCggY29udGV4dCApOwoKCWlmICggIXhtbCAmJiAhc2VlZCApIHsKCQlpZiAoIChtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKSkgKSB7CgkJCS8vIFNwZWVkLXVwOiBTaXp6bGUoIiNJRCIpCgkJCWlmICggKG0gPSBtYXRjaFsxXSkgKSB7CgkJCQlpZiAoIG5vZGVUeXBlID09PSA5ICkgewoJCQkJCWVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICk7CgkJCQkJLy8gQ2hlY2sgcGFyZW50Tm9kZSB0byBjYXRjaCB3aGVuIEJsYWNrYmVycnkgNC42IHJldHVybnMKCQkJCQkvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICM2OTYzCgkJCQkJaWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHsKCQkJCQkJLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIElFLCBPcGVyYSwgYW5kIFdlYmtpdCByZXR1cm4gaXRlbXMKCQkJCQkJLy8gYnkgbmFtZSBpbnN0ZWFkIG9mIElECgkJCQkJCWlmICggZWxlbS5pZCA9PT0gbSApIHsKCQkJCQkJCXJlc3VsdHMucHVzaCggZWxlbSApOwoJCQkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQkJCX0KCQkJCQl9IGVsc2UgewoJCQkJCQlyZXR1cm4gcmVzdWx0czsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCS8vIENvbnRleHQgaXMgbm90IGEgZG9jdW1lbnQKCQkJCQlpZiAoIGNvbnRleHQub3duZXJEb2N1bWVudCAmJiAoZWxlbSA9IGNvbnRleHQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZCggbSApKSAmJgoJCQkJCQljb250YWlucyggY29udGV4dCwgZWxlbSApICYmIGVsZW0uaWQgPT09IG0gKSB7CgkJCQkJCXJlc3VsdHMucHVzaCggZWxlbSApOwoJCQkJCQlyZXR1cm4gcmVzdWx0czsKCQkJCQl9CgkJCQl9CgoJCQkvLyBTcGVlZC11cDogU2l6emxlKCJUQUciKQoJCQl9IGVsc2UgaWYgKCBtYXRjaFsyXSApIHsKCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIHNsaWNlLmNhbGwoY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSwgMCkgKTsKCQkJCXJldHVybiByZXN1bHRzOwoKCQkJLy8gU3BlZWQtdXA6IFNpenpsZSgiLkNMQVNTIikKCQkJfSBlbHNlIGlmICggKG0gPSBtYXRjaFszXSkgJiYgYXNzZXJ0VXNhYmxlQ2xhc3NOYW1lICYmIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIHsKCQkJCXB1c2guYXBwbHkoIHJlc3VsdHMsIHNsaWNlLmNhbGwoY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBtICksIDApICk7CgkJCQlyZXR1cm4gcmVzdWx0czsKCQkJfQoJCX0KCX0KCgkvLyBBbGwgb3RoZXJzCglyZXR1cm4gc2VsZWN0KCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgIiQxIiApLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkLCB4bWwgKTsKfQoKU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlvbiggZXhwciwgZWxlbWVudHMgKSB7CglyZXR1cm4gU2l6emxlKCBleHByLCBudWxsLCBudWxsLCBlbGVtZW50cyApOwp9OwoKU2l6emxlLm1hdGNoZXNTZWxlY3RvciA9IGZ1bmN0aW9uKCBlbGVtLCBleHByICkgewoJcmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgWyBlbGVtIF0gKS5sZW5ndGggPiAwOwp9OwoKLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlcwpmdW5jdGlvbiBjcmVhdGVJbnB1dFBzZXVkbyggdHlwZSApIHsKCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKCQl2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCQlyZXR1cm4gbmFtZSA9PT0gImlucHV0IiAmJiBlbGVtLnR5cGUgPT09IHR5cGU7Cgl9Owp9CgovLyBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIGJ1dHRvbnMKZnVuY3Rpb24gY3JlYXRlQnV0dG9uUHNldWRvKCB0eXBlICkgewoJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCXZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwoJCXJldHVybiAobmFtZSA9PT0gImlucHV0IiB8fCBuYW1lID09PSAiYnV0dG9uIikgJiYgZWxlbS50eXBlID09PSB0eXBlOwoJfTsKfQoKLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBwb3NpdGlvbmFscwpmdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHsKCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIGFyZ3VtZW50ICkgewoJCWFyZ3VtZW50ID0gK2FyZ3VtZW50OwoJCXJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7CgkJCXZhciBqLAoJCQkJbWF0Y2hJbmRleGVzID0gZm4oIFtdLCBzZWVkLmxlbmd0aCwgYXJndW1lbnQgKSwKCQkJCWkgPSBtYXRjaEluZGV4ZXMubGVuZ3RoOwoKCQkJLy8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzCgkJCXdoaWxlICggaS0tICkgewoJCQkJaWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHsKCQkJCQlzZWVkW2pdID0gIShtYXRjaGVzW2pdID0gc2VlZFtqXSk7CgkJCQl9CgkJCX0KCQl9KTsKCX0pOwp9CgovKioKICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgcmV0cmlldmluZyB0aGUgdGV4dCB2YWx1ZSBvZiBhbiBhcnJheSBvZiBET00gbm9kZXMKICogQHBhcmFtIHtBcnJheXxFbGVtZW50fSBlbGVtCiAqLwpnZXRUZXh0ID0gU2l6emxlLmdldFRleHQgPSBmdW5jdGlvbiggZWxlbSApIHsKCXZhciBub2RlLAoJCXJldCA9ICIiLAoJCWkgPSAwLAoJCW5vZGVUeXBlID0gZWxlbS5ub2RlVHlwZTsKCglpZiAoIG5vZGVUeXBlICkgewoJCWlmICggbm9kZVR5cGUgPT09IDEgfHwgbm9kZVR5cGUgPT09IDkgfHwgbm9kZVR5cGUgPT09IDExICkgewoJCQkvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzCgkJCS8vIGlubmVyVGV4dCB1c2FnZSByZW1vdmVkIGZvciBjb25zaXN0ZW5jeSBvZiBuZXcgbGluZXMgKHNlZSAjMTExNTMpCgkJCWlmICggdHlwZW9mIGVsZW0udGV4dENvbnRlbnQgPT09ICJzdHJpbmciICkgewoJCQkJcmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7CgkJCX0gZWxzZSB7CgkJCQkvLyBUcmF2ZXJzZSBpdHMgY2hpbGRyZW4KCQkJCWZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkgewoJCQkJCXJldCArPSBnZXRUZXh0KCBlbGVtICk7CgkJCQl9CgkJCX0KCQl9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0gMyB8fCBub2RlVHlwZSA9PT0gNCApIHsKCQkJcmV0dXJuIGVsZW0ubm9kZVZhbHVlOwoJCX0KCQkvLyBEbyBub3QgaW5jbHVkZSBjb21tZW50IG9yIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gbm9kZXMKCX0gZWxzZSB7CgoJCS8vIElmIG5vIG5vZGVUeXBlLCB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5CgkJZm9yICggOyAobm9kZSA9IGVsZW1baV0pOyBpKysgKSB7CgkJCS8vIERvIG5vdCB0cmF2ZXJzZSBjb21tZW50IG5vZGVzCgkJCXJldCArPSBnZXRUZXh0KCBub2RlICk7CgkJfQoJfQoJcmV0dXJuIHJldDsKfTsKCmlzWE1MID0gU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0CgkvLyAoc3VjaCBhcyBsb2FkaW5nIGlmcmFtZXMgaW4gSUUgLSAjNDgzMykKCXZhciBkb2N1bWVudEVsZW1lbnQgPSBlbGVtICYmIChlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSkuZG9jdW1lbnRFbGVtZW50OwoJcmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIDogZmFsc2U7Cn07CgovLyBFbGVtZW50IGNvbnRhaW5zIGFub3RoZXIKY29udGFpbnMgPSBTaXp6bGUuY29udGFpbnMgPSBkb2NFbGVtLmNvbnRhaW5zID8KCWZ1bmN0aW9uKCBhLCBiICkgewoJCXZhciBhZG93biA9IGEubm9kZVR5cGUgPT09IDkgPyBhLmRvY3VtZW50RWxlbWVudCA6IGEsCgkJCWJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlOwoJCXJldHVybiBhID09PSBidXAgfHwgISEoIGJ1cCAmJiBidXAubm9kZVR5cGUgPT09IDEgJiYgYWRvd24uY29udGFpbnMgJiYgYWRvd24uY29udGFpbnMoYnVwKSApOwoJfSA6Cglkb2NFbGVtLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uID8KCWZ1bmN0aW9uKCBhLCBiICkgewoJCXJldHVybiBiICYmICEhKCBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBiICkgJiAxNiApOwoJfSA6CglmdW5jdGlvbiggYSwgYiApIHsKCQl3aGlsZSAoIChiID0gYi5wYXJlbnROb2RlKSApIHsKCQkJaWYgKCBiID09PSBhICkgewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9CgkJcmV0dXJuIGZhbHNlOwoJfTsKClNpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7Cgl2YXIgdmFsLAoJCXhtbCA9IGlzWE1MKCBlbGVtICk7CgoJaWYgKCAheG1sICkgewoJCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7Cgl9CglpZiAoICh2YWwgPSBFeHByLmF0dHJIYW5kbGVbIG5hbWUgXSkgKSB7CgkJcmV0dXJuIHZhbCggZWxlbSApOwoJfQoJaWYgKCB4bWwgfHwgYXNzZXJ0QXR0cmlidXRlcyApIHsKCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKCX0KCXZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApOwoJcmV0dXJuIHZhbCA/CgkJdHlwZW9mIGVsZW1bIG5hbWUgXSA9PT0gImJvb2xlYW4iID8KCQkJZWxlbVsgbmFtZSBdID8gbmFtZSA6IG51bGwgOgoJCQl2YWwuc3BlY2lmaWVkID8gdmFsLnZhbHVlIDogbnVsbCA6CgkJbnVsbDsKfTsKCkV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzID0gewoKCS8vIENhbiBiZSBhZGp1c3RlZCBieSB0aGUgdXNlcgoJY2FjaGVMZW5ndGg6IDUwLAoKCWNyZWF0ZVBzZXVkbzogbWFya0Z1bmN0aW9uLAoKCW1hdGNoOiBtYXRjaEV4cHIsCgoJLy8gSUU2LzcgcmV0dXJuIGEgbW9kaWZpZWQgaHJlZgoJYXR0ckhhbmRsZTogYXNzZXJ0SHJlZk5vdE5vcm1hbGl6ZWQgPwoJCXt9IDoKCQl7CgkJCSJocmVmIjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoICJocmVmIiwgMiApOwoJCQl9LAoJCQkidHlwZSI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCJ0eXBlIik7CgkJCX0KCQl9LAoKCWZpbmQ6IHsKCQkiSUQiOiBhc3NlcnRHZXRJZE5vdE5hbWUgPwoJCQlmdW5jdGlvbiggaWQsIGNvbnRleHQsIHhtbCApIHsKCQkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09IHN0cnVuZGVmaW5lZCAmJiAheG1sICkgewoJCQkJCXZhciBtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTsKCQkJCQkvLyBDaGVjayBwYXJlbnROb2RlIHRvIGNhdGNoIHdoZW4gQmxhY2tiZXJyeSA0LjYgcmV0dXJucwoJCQkJCS8vIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgIzY5NjMKCQkJCQlyZXR1cm4gbSAmJiBtLnBhcmVudE5vZGUgPyBbbV0gOiBbXTsKCQkJCX0KCQkJfSA6CgkJCWZ1bmN0aW9uKCBpZCwgY29udGV4dCwgeG1sICkgewoJCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gc3RydW5kZWZpbmVkICYmICF4bWwgKSB7CgkJCQkJdmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBpZCApOwoKCQkJCQlyZXR1cm4gbSA/CgkJCQkJCW0uaWQgPT09IGlkIHx8IHR5cGVvZiBtLmdldEF0dHJpYnV0ZU5vZGUgIT09IHN0cnVuZGVmaW5lZCAmJiBtLmdldEF0dHJpYnV0ZU5vZGUoImlkIikudmFsdWUgPT09IGlkID8KCQkJCQkJCVttXSA6CgkJCQkJCQl1bmRlZmluZWQgOgoJCQkJCQlbXTsKCQkJCX0KCQkJfSwKCgkJIlRBRyI6IGFzc2VydFRhZ05hbWVOb0NvbW1lbnRzID8KCQkJZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHsKCQkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IHN0cnVuZGVmaW5lZCApIHsKCQkJCQlyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7CgkJCQl9CgkJCX0gOgoJCQlmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkgewoJCQkJdmFyIHJlc3VsdHMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKTsKCgkJCQkvLyBGaWx0ZXIgb3V0IHBvc3NpYmxlIGNvbW1lbnRzCgkJCQlpZiAoIHRhZyA9PT0gIioiICkgewoJCQkJCXZhciBlbGVtLAoJCQkJCQl0bXAgPSBbXSwKCQkJCQkJaSA9IDA7CgoJCQkJCWZvciAoIDsgKGVsZW0gPSByZXN1bHRzW2ldKTsgaSsrICkgewoJCQkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgkJCQkJCQl0bXAucHVzaCggZWxlbSApOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQlyZXR1cm4gdG1wOwoJCQkJfQoJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCX0sCgoJCSJOQU1FIjogYXNzZXJ0VXNhYmxlTmFtZSAmJiBmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkgewoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlOYW1lICE9PSBzdHJ1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSggbmFtZSApOwoJCQl9CgkJfSwKCgkJIkNMQVNTIjogYXNzZXJ0VXNhYmxlQ2xhc3NOYW1lICYmIGZ1bmN0aW9uKCBjbGFzc05hbWUsIGNvbnRleHQsIHhtbCApIHsKCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICE9PSBzdHJ1bmRlZmluZWQgJiYgIXhtbCApIHsKCQkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIGNsYXNzTmFtZSApOwoJCQl9CgkJfQoJfSwKCglyZWxhdGl2ZTogewoJCSI+IjogeyBkaXI6ICJwYXJlbnROb2RlIiwgZmlyc3Q6IHRydWUgfSwKCQkiICI6IHsgZGlyOiAicGFyZW50Tm9kZSIgfSwKCQkiKyI6IHsgZGlyOiAicHJldmlvdXNTaWJsaW5nIiwgZmlyc3Q6IHRydWUgfSwKCQkifiI6IHsgZGlyOiAicHJldmlvdXNTaWJsaW5nIiB9Cgl9LAoKCXByZUZpbHRlcjogewoJCSJBVFRSIjogZnVuY3Rpb24oIG1hdGNoICkgewoJCQltYXRjaFsxXSA9IG1hdGNoWzFdLnJlcGxhY2UoIHJiYWNrc2xhc2gsICIiICk7CgoJCQkvLyBNb3ZlIHRoZSBnaXZlbiB2YWx1ZSB0byBtYXRjaFszXSB3aGV0aGVyIHF1b3RlZCBvciB1bnF1b3RlZAoJCQltYXRjaFszXSA9ICggbWF0Y2hbNF0gfHwgbWF0Y2hbNV0gfHwgIiIgKS5yZXBsYWNlKCByYmFja3NsYXNoLCAiIiApOwoKCQkJaWYgKCBtYXRjaFsyXSA9PT0gIn49IiApIHsKCQkJCW1hdGNoWzNdID0gIiAiICsgbWF0Y2hbM10gKyAiICI7CgkJCX0KCgkJCXJldHVybiBtYXRjaC5zbGljZSggMCwgNCApOwoJCX0sCgoJCSJDSElMRCI6IGZ1bmN0aW9uKCBtYXRjaCApIHsKCQkJLyogbWF0Y2hlcyBmcm9tIG1hdGNoRXhwclsiQ0hJTEQiXQoJCQkJMSB0eXBlIChvbmx5fG50aHwuLi4pCgkJCQkyIGFyZ3VtZW50IChldmVufG9kZHxcZCp8XGQqbihbKy1dXGQrKT98Li4uKQoJCQkJMyB4bi1jb21wb25lbnQgb2YgeG4reSBhcmd1bWVudCAoWystXT9cZCpufCkKCQkJCTQgc2lnbiBvZiB4bi1jb21wb25lbnQKCQkJCTUgeCBvZiB4bi1jb21wb25lbnQKCQkJCTYgc2lnbiBvZiB5LWNvbXBvbmVudAoJCQkJNyB5IG9mIHktY29tcG9uZW50CgkJCSovCgkJCW1hdGNoWzFdID0gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKTsKCgkJCWlmICggbWF0Y2hbMV0gPT09ICJudGgiICkgewoJCQkJLy8gbnRoLWNoaWxkIHJlcXVpcmVzIGFyZ3VtZW50CgkJCQlpZiAoICFtYXRjaFsyXSApIHsKCQkJCQlTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7CgkJCQl9CgoJCQkJLy8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxECgkJCQkvLyByZW1lbWJlciB0aGF0IGZhbHNlL3RydWUgY2FzdCByZXNwZWN0aXZlbHkgdG8gMC8xCgkJCQltYXRjaFszXSA9ICsoIG1hdGNoWzNdID8gbWF0Y2hbNF0gKyAobWF0Y2hbNV0gfHwgMSkgOiAyICogKCBtYXRjaFsyXSA9PT0gImV2ZW4iIHx8IG1hdGNoWzJdID09PSAib2RkIiApICk7CgkJCQltYXRjaFs0XSA9ICsoICggbWF0Y2hbNl0gKyBtYXRjaFs3XSApIHx8IG1hdGNoWzJdID09PSAib2RkIiApOwoKCQkJLy8gb3RoZXIgdHlwZXMgcHJvaGliaXQgYXJndW1lbnRzCgkJCX0gZWxzZSBpZiAoIG1hdGNoWzJdICkgewoJCQkJU2l6emxlLmVycm9yKCBtYXRjaFswXSApOwoJCQl9CgoJCQlyZXR1cm4gbWF0Y2g7CgkJfSwKCgkJIlBTRVVETyI6IGZ1bmN0aW9uKCBtYXRjaCApIHsKCQkJdmFyIHVucXVvdGVkLCBleGNlc3M7CgkJCWlmICggbWF0Y2hFeHByWyJDSElMRCJdLnRlc3QoIG1hdGNoWzBdICkgKSB7CgkJCQlyZXR1cm4gbnVsbDsKCQkJfQoKCQkJaWYgKCBtYXRjaFszXSApIHsKCQkJCW1hdGNoWzJdID0gbWF0Y2hbM107CgkJCX0gZWxzZSBpZiAoICh1bnF1b3RlZCA9IG1hdGNoWzRdKSApIHsKCQkJCS8vIE9ubHkgY2hlY2sgYXJndW1lbnRzIHRoYXQgY29udGFpbiBhIHBzZXVkbwoJCQkJaWYgKCBycHNldWRvLnRlc3QodW5xdW90ZWQpICYmCgkJCQkJLy8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSkKCQkJCQkoZXhjZXNzID0gdG9rZW5pemUoIHVucXVvdGVkLCB0cnVlICkpICYmCgkJCQkJLy8gYWR2YW5jZSB0byB0aGUgbmV4dCBjbG9zaW5nIHBhcmVudGhlc2lzCgkJCQkJKGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoICIpIiwgdW5xdW90ZWQubGVuZ3RoIC0gZXhjZXNzICkgLSB1bnF1b3RlZC5sZW5ndGgpICkgewoKCQkJCQkvLyBleGNlc3MgaXMgYSBuZWdhdGl2ZSBpbmRleAoJCQkJCXVucXVvdGVkID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApOwoJCQkJCW1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAsIGV4Y2VzcyApOwoJCQkJfQoJCQkJbWF0Y2hbMl0gPSB1bnF1b3RlZDsKCQkJfQoKCQkJLy8gUmV0dXJuIG9ubHkgY2FwdHVyZXMgbmVlZGVkIGJ5IHRoZSBwc2V1ZG8gZmlsdGVyIG1ldGhvZCAodHlwZSBhbmQgYXJndW1lbnQpCgkJCXJldHVybiBtYXRjaC5zbGljZSggMCwgMyApOwoJCX0KCX0sCgoJZmlsdGVyOiB7CgkJIklEIjogYXNzZXJ0R2V0SWROb3ROYW1lID8KCQkJZnVuY3Rpb24oIGlkICkgewoJCQkJaWQgPSBpZC5yZXBsYWNlKCByYmFja3NsYXNoLCAiIiApOwoJCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSA9PT0gaWQ7CgkJCQl9OwoJCQl9IDoKCQkJZnVuY3Rpb24oIGlkICkgewoJCQkJaWQgPSBpZC5yZXBsYWNlKCByYmFja3NsYXNoLCAiIiApOwoJCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJCXZhciBub2RlID0gdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSAhPT0gc3RydW5kZWZpbmVkICYmIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTsKCQkJCQlyZXR1cm4gbm9kZSAmJiBub2RlLnZhbHVlID09PSBpZDsKCQkJCX07CgkJCX0sCgoJCSJUQUciOiBmdW5jdGlvbiggbm9kZU5hbWUgKSB7CgkJCWlmICggbm9kZU5hbWUgPT09ICIqIiApIHsKCQkJCXJldHVybiBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH07CgkJCX0KCQkJbm9kZU5hbWUgPSBub2RlTmFtZS5yZXBsYWNlKCByYmFja3NsYXNoLCAiIiApLnRvTG93ZXJDYXNlKCk7CgoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQlyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5vZGVOYW1lOwoJCQl9OwoJCX0sCgoJCSJDTEFTUyI6IGZ1bmN0aW9uKCBjbGFzc05hbWUgKSB7CgkJCXZhciBwYXR0ZXJuID0gY2xhc3NDYWNoZVsgZXhwYW5kbyBdWyBjbGFzc05hbWUgXTsKCQkJaWYgKCAhcGF0dGVybiApIHsKCQkJCXBhdHRlcm4gPSBjbGFzc0NhY2hlKCBjbGFzc05hbWUsIG5ldyBSZWdFeHAoIihefCIgKyB3aGl0ZXNwYWNlICsgIikiICsgY2xhc3NOYW1lICsgIigiICsgd2hpdGVzcGFjZSArICJ8JCkiKSApOwoJCQl9CgkJCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXJldHVybiBwYXR0ZXJuLnRlc3QoIGVsZW0uY2xhc3NOYW1lIHx8ICh0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUgIT09IHN0cnVuZGVmaW5lZCAmJiBlbGVtLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSkgfHwgIiIgKTsKCQkJfTsKCQl9LAoKCQkiQVRUUiI6IGZ1bmN0aW9uKCBuYW1lLCBvcGVyYXRvciwgY2hlY2sgKSB7CgkJCXJldHVybiBmdW5jdGlvbiggZWxlbSwgY29udGV4dCApIHsKCQkJCXZhciByZXN1bHQgPSBTaXp6bGUuYXR0ciggZWxlbSwgbmFtZSApOwoKCQkJCWlmICggcmVzdWx0ID09IG51bGwgKSB7CgkJCQkJcmV0dXJuIG9wZXJhdG9yID09PSAiIT0iOwoJCQkJfQoJCQkJaWYgKCAhb3BlcmF0b3IgKSB7CgkJCQkJcmV0dXJuIHRydWU7CgkJCQl9CgoJCQkJcmVzdWx0ICs9ICIiOwoKCQkJCXJldHVybiBvcGVyYXRvciA9PT0gIj0iID8gcmVzdWx0ID09PSBjaGVjayA6CgkJCQkJb3BlcmF0b3IgPT09ICIhPSIgPyByZXN1bHQgIT09IGNoZWNrIDoKCQkJCQlvcGVyYXRvciA9PT0gIl49IiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID09PSAwIDoKCQkJCQlvcGVyYXRvciA9PT0gIio9IiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID4gLTEgOgoJCQkJCW9wZXJhdG9yID09PSAiJD0iID8gY2hlY2sgJiYgcmVzdWx0LnN1YnN0ciggcmVzdWx0Lmxlbmd0aCAtIGNoZWNrLmxlbmd0aCApID09PSBjaGVjayA6CgkJCQkJb3BlcmF0b3IgPT09ICJ+PSIgPyAoICIgIiArIHJlc3VsdCArICIgIiApLmluZGV4T2YoIGNoZWNrICkgPiAtMSA6CgkJCQkJb3BlcmF0b3IgPT09ICJ8PSIgPyByZXN1bHQgPT09IGNoZWNrIHx8IHJlc3VsdC5zdWJzdHIoIDAsIGNoZWNrLmxlbmd0aCArIDEgKSA9PT0gY2hlY2sgKyAiLSIgOgoJCQkJCWZhbHNlOwoJCQl9OwoJCX0sCgoJCSJDSElMRCI6IGZ1bmN0aW9uKCB0eXBlLCBhcmd1bWVudCwgZmlyc3QsIGxhc3QgKSB7CgoJCQlpZiAoIHR5cGUgPT09ICJudGgiICkgewoJCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJCXZhciBub2RlLCBkaWZmLAoJCQkJCQlwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CgoJCQkJCWlmICggZmlyc3QgPT09IDEgJiYgbGFzdCA9PT0gMCApIHsKCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJfQoKCQkJCQlpZiAoIHBhcmVudCApIHsKCQkJCQkJZGlmZiA9IDA7CgkJCQkJCWZvciAoIG5vZGUgPSBwYXJlbnQuZmlyc3RDaGlsZDsgbm9kZTsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcgKSB7CgkJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7CgkJCQkJCQkJZGlmZisrOwoJCQkJCQkJCWlmICggZWxlbSA9PT0gbm9kZSApIHsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBJbmNvcnBvcmF0ZSB0aGUgb2Zmc2V0IChvciBjYXN0IHRvIE5hTiksIHRoZW4gY2hlY2sgYWdhaW5zdCBjeWNsZSBzaXplCgkJCQkJZGlmZiAtPSBsYXN0OwoJCQkJCXJldHVybiBkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApOwoJCQkJfTsKCQkJfQoKCQkJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJdmFyIG5vZGUgPSBlbGVtOwoKCQkJCXN3aXRjaCAoIHR5cGUgKSB7CgkJCQkJY2FzZSAib25seSI6CgkJCQkJY2FzZSAiZmlyc3QiOgoJCQkJCQl3aGlsZSAoIChub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmcpICkgewoJCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJCX0KCQkJCQkJfQoKCQkJCQkJaWYgKCB0eXBlID09PSAiZmlyc3QiICkgewoJCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJCX0KCgkJCQkJCW5vZGUgPSBlbGVtOwoKCQkJCQkJLyogZmFsbHMgdGhyb3VnaCAqLwoJCQkJCWNhc2UgImxhc3QiOgoJCQkJCQl3aGlsZSAoIChub2RlID0gbm9kZS5uZXh0U2libGluZykgKSB7CgkJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7CgkJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0KCQkJfTsKCQl9LAoKCQkiUFNFVURPIjogZnVuY3Rpb24oIHBzZXVkbywgYXJndW1lbnQgKSB7CgkJCS8vIHBzZXVkby1jbGFzcyBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZQoJCQkvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI3BzZXVkby1jbGFzc2VzCgkJCS8vIFByaW9yaXRpemUgYnkgY2FzZSBzZW5zaXRpdml0eSBpbiBjYXNlIGN1c3RvbSBwc2V1ZG9zIGFyZSBhZGRlZCB3aXRoIHVwcGVyY2FzZSBsZXR0ZXJzCgkJCS8vIFJlbWVtYmVyIHRoYXQgc2V0RmlsdGVycyBpbmhlcml0cyBmcm9tIHBzZXVkb3MKCQkJdmFyIGFyZ3MsCgkJCQlmbiA9IEV4cHIucHNldWRvc1sgcHNldWRvIF0gfHwgRXhwci5zZXRGaWx0ZXJzWyBwc2V1ZG8udG9Mb3dlckNhc2UoKSBdIHx8CgkJCQkJU2l6emxlLmVycm9yKCAidW5zdXBwb3J0ZWQgcHNldWRvOiAiICsgcHNldWRvICk7CgoJCQkvLyBUaGUgdXNlciBtYXkgdXNlIGNyZWF0ZVBzZXVkbyB0byBpbmRpY2F0ZSB0aGF0CgkJCS8vIGFyZ3VtZW50cyBhcmUgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgZmlsdGVyIGZ1bmN0aW9uCgkJCS8vIGp1c3QgYXMgU2l6emxlIGRvZXMKCQkJaWYgKCBmblsgZXhwYW5kbyBdICkgewoJCQkJcmV0dXJuIGZuKCBhcmd1bWVudCApOwoJCQl9CgoJCQkvLyBCdXQgbWFpbnRhaW4gc3VwcG9ydCBmb3Igb2xkIHNpZ25hdHVyZXMKCQkJaWYgKCBmbi5sZW5ndGggPiAxICkgewoJCQkJYXJncyA9IFsgcHNldWRvLCBwc2V1ZG8sICIiLCBhcmd1bWVudCBdOwoJCQkJcmV0dXJuIEV4cHIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eSggcHNldWRvLnRvTG93ZXJDYXNlKCkgKSA/CgkJCQkJbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzICkgewoJCQkJCQl2YXIgaWR4LAoJCQkJCQkJbWF0Y2hlZCA9IGZuKCBzZWVkLCBhcmd1bWVudCApLAoJCQkJCQkJaSA9IG1hdGNoZWQubGVuZ3RoOwoJCQkJCQl3aGlsZSAoIGktLSApIHsKCQkJCQkJCWlkeCA9IGluZGV4T2YuY2FsbCggc2VlZCwgbWF0Y2hlZFtpXSApOwoJCQkJCQkJc2VlZFsgaWR4IF0gPSAhKCBtYXRjaGVzWyBpZHggXSA9IG1hdGNoZWRbaV0gKTsKCQkJCQkJfQoJCQkJCX0pIDoKCQkJCQlmdW5jdGlvbiggZWxlbSApIHsKCQkJCQkJcmV0dXJuIGZuKCBlbGVtLCAwLCBhcmdzICk7CgkJCQkJfTsKCQkJfQoKCQkJcmV0dXJuIGZuOwoJCX0KCX0sCgoJcHNldWRvczogewoJCSJub3QiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCQkvLyBUcmltIHRoZSBzZWxlY3RvciBwYXNzZWQgdG8gY29tcGlsZQoJCQkvLyB0byBhdm9pZCB0cmVhdGluZyBsZWFkaW5nIGFuZCB0cmFpbGluZwoJCQkvLyBzcGFjZXMgYXMgY29tYmluYXRvcnMKCQkJdmFyIGlucHV0ID0gW10sCgkJCQlyZXN1bHRzID0gW10sCgkJCQltYXRjaGVyID0gY29tcGlsZSggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sICIkMSIgKSApOwoKCQkJcmV0dXJuIG1hdGNoZXJbIGV4cGFuZG8gXSA/CgkJCQltYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMsIGNvbnRleHQsIHhtbCApIHsKCQkJCQl2YXIgZWxlbSwKCQkJCQkJdW5tYXRjaGVkID0gbWF0Y2hlciggc2VlZCwgbnVsbCwgeG1sLCBbXSApLAoJCQkJCQlpID0gc2VlZC5sZW5ndGg7CgoJCQkJCS8vIE1hdGNoIGVsZW1lbnRzIHVubWF0Y2hlZCBieSBgbWF0Y2hlcmAKCQkJCQl3aGlsZSAoIGktLSApIHsKCQkJCQkJaWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7CgkJCQkJCQlzZWVkW2ldID0gIShtYXRjaGVzW2ldID0gZWxlbSk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9KSA6CgkJCQlmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgewoJCQkJCWlucHV0WzBdID0gZWxlbTsKCQkJCQltYXRjaGVyKCBpbnB1dCwgbnVsbCwgeG1sLCByZXN1bHRzICk7CgkJCQkJcmV0dXJuICFyZXN1bHRzLnBvcCgpOwoJCQkJfTsKCQl9KSwKCgkJImhhcyI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJCXJldHVybiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXJldHVybiBTaXp6bGUoIHNlbGVjdG9yLCBlbGVtICkubGVuZ3RoID4gMDsKCQkJfTsKCQl9KSwKCgkJImNvbnRhaW5zIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCB0ZXh0ICkgewoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQlyZXR1cm4gKCBlbGVtLnRleHRDb250ZW50IHx8IGVsZW0uaW5uZXJUZXh0IHx8IGdldFRleHQoIGVsZW0gKSApLmluZGV4T2YoIHRleHQgKSA+IC0xOwoJCQl9OwoJCX0pLAoKCQkiZW5hYmxlZCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZmFsc2U7CgkJfSwKCgkJImRpc2FibGVkIjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLmRpc2FibGVkID09PSB0cnVlOwoJCX0sCgoJCSJjaGVja2VkIjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCS8vIEluIENTUzMsIDpjaGVja2VkIHNob3VsZCByZXR1cm4gYm90aCBjaGVja2VkIGFuZCBzZWxlY3RlZCBlbGVtZW50cwoJCQkvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZAoJCQl2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJCXJldHVybiAobm9kZU5hbWUgPT09ICJpbnB1dCIgJiYgISFlbGVtLmNoZWNrZWQpIHx8IChub2RlTmFtZSA9PT0gIm9wdGlvbiIgJiYgISFlbGVtLnNlbGVjdGVkKTsKCQl9LAoKCQkic2VsZWN0ZWQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJLy8gQWNjZXNzaW5nIHRoaXMgcHJvcGVydHkgbWFrZXMgc2VsZWN0ZWQtYnktZGVmYXVsdAoJCQkvLyBvcHRpb25zIGluIFNhZmFyaSB3b3JrIHByb3Blcmx5CgkJCWlmICggZWxlbS5wYXJlbnROb2RlICkgewoJCQkJZWxlbS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7CgkJCX0KCgkJCXJldHVybiBlbGVtLnNlbGVjdGVkID09PSB0cnVlOwoJCX0sCgoJCSJwYXJlbnQiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuICFFeHByLnBzZXVkb3NbImVtcHR5Il0oIGVsZW0gKTsKCQl9LAoKCQkiZW1wdHkiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJLy8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG8KCQkJLy8gOmVtcHR5IGlzIG9ubHkgYWZmZWN0ZWQgYnkgZWxlbWVudCBub2RlcyBhbmQgY29udGVudCBub2RlcyhpbmNsdWRpbmcgdGV4dCgzKSwgY2RhdGEoNCkpLAoJCQkvLyAgIG5vdCBjb21tZW50LCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucywgb3Igb3RoZXJzCgkJCS8vIFRoYW5rcyB0byBEaWVnbyBQZXJpbmkgZm9yIHRoZSBub2RlTmFtZSBzaG9ydGN1dAoJCQkvLyAgIEdyZWF0ZXIgdGhhbiAiQCIgbWVhbnMgYWxwaGEgY2hhcmFjdGVycyAoc3BlY2lmaWNhbGx5IG5vdCBzdGFydGluZyB3aXRoICIjIiBvciAiPyIpCgkJCXZhciBub2RlVHlwZTsKCQkJZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsKCQkJd2hpbGUgKCBlbGVtICkgewoJCQkJaWYgKCBlbGVtLm5vZGVOYW1lID4gIkAiIHx8IChub2RlVHlwZSA9IGVsZW0ubm9kZVR5cGUpID09PSAzIHx8IG5vZGVUeXBlID09PSA0ICkgewoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJCWVsZW0gPSBlbGVtLm5leHRTaWJsaW5nOwoJCQl9CgkJCXJldHVybiB0cnVlOwoJCX0sCgoJCSJoZWFkZXIiOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIHJoZWFkZXIudGVzdCggZWxlbS5ub2RlTmFtZSApOwoJCX0sCgoJCSJ0ZXh0IjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXZhciB0eXBlLCBhdHRyOwoJCQkvLyBJRTYgYW5kIDcgd2lsbCBtYXAgZWxlbS50eXBlIHRvICd0ZXh0JyBmb3IgbmV3IEhUTUw1IHR5cGVzIChzZWFyY2gsIGV0YykKCQkJLy8gdXNlIGdldEF0dHJpYnV0ZSBpbnN0ZWFkIHRvIHRlc3QgdGhpcyBjYXNlCgkJCXJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgJiYKCQkJCSh0eXBlID0gZWxlbS50eXBlKSA9PT0gInRleHQiICYmCgkJCQkoIChhdHRyID0gZWxlbS5nZXRBdHRyaWJ1dGUoInR5cGUiKSkgPT0gbnVsbCB8fCBhdHRyLnRvTG93ZXJDYXNlKCkgPT09IHR5cGUgKTsKCQl9LAoKCQkvLyBJbnB1dCB0eXBlcwoJCSJyYWRpbyI6IGNyZWF0ZUlucHV0UHNldWRvKCJyYWRpbyIpLAoJCSJjaGVja2JveCI6IGNyZWF0ZUlucHV0UHNldWRvKCJjaGVja2JveCIpLAoJCSJmaWxlIjogY3JlYXRlSW5wdXRQc2V1ZG8oImZpbGUiKSwKCQkicGFzc3dvcmQiOiBjcmVhdGVJbnB1dFBzZXVkbygicGFzc3dvcmQiKSwKCQkiaW1hZ2UiOiBjcmVhdGVJbnB1dFBzZXVkbygiaW1hZ2UiKSwKCgkJInN1Ym1pdCI6IGNyZWF0ZUJ1dHRvblBzZXVkbygic3VibWl0IiksCgkJInJlc2V0IjogY3JlYXRlQnV0dG9uUHNldWRvKCJyZXNldCIpLAoKCQkiYnV0dG9uIjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwoJCQlyZXR1cm4gbmFtZSA9PT0gImlucHV0IiAmJiBlbGVtLnR5cGUgPT09ICJidXR0b24iIHx8IG5hbWUgPT09ICJidXR0b24iOwoJCX0sCgoJCSJpbnB1dCI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gcmlucHV0cy50ZXN0KCBlbGVtLm5vZGVOYW1lICk7CgkJfSwKCgkJImZvY3VzIjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXZhciBkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQ7CgkJCXJldHVybiBlbGVtID09PSBkb2MuYWN0aXZlRWxlbWVudCAmJiAoIWRvYy5oYXNGb2N1cyB8fCBkb2MuaGFzRm9jdXMoKSkgJiYgISEoZWxlbS50eXBlIHx8IGVsZW0uaHJlZik7CgkJfSwKCgkJImFjdGl2ZSI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbSA9PT0gZWxlbS5vd25lckRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7CgkJfSwKCgkJLy8gUG9zaXRpb25hbCB0eXBlcwoJCSJmaXJzdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHsKCQkJcmV0dXJuIFsgMCBdOwoJCX0pLAoKCQkibGFzdCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHsKCQkJcmV0dXJuIFsgbGVuZ3RoIC0gMSBdOwoJCX0pLAoKCQkiZXEiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7CgkJCXJldHVybiBbIGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQgXTsKCQl9KSwKCgkJImV2ZW4iOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7CgkJCWZvciAoIHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAyICkgewoJCQkJbWF0Y2hJbmRleGVzLnB1c2goIGkgKTsKCQkJfQoJCQlyZXR1cm4gbWF0Y2hJbmRleGVzOwoJCX0pLAoKCQkib2RkIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgewoJCQlmb3IgKCB2YXIgaSA9IDE7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHsKCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CgkJCX0KCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsKCQl9KSwKCgkJImx0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgewoJCQlmb3IgKCB2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7IC0taSA+PSAwOyApIHsKCQkJCW1hdGNoSW5kZXhlcy5wdXNoKCBpICk7CgkJCX0KCQkJcmV0dXJuIG1hdGNoSW5kZXhlczsKCQl9KSwKCgkJImd0IjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkgewoJCQlmb3IgKCB2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7ICsraSA8IGxlbmd0aDsgKSB7CgkJCQltYXRjaEluZGV4ZXMucHVzaCggaSApOwoJCQl9CgkJCXJldHVybiBtYXRjaEluZGV4ZXM7CgkJfSkKCX0KfTsKCmZ1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiwgcmV0ICkgewoJaWYgKCBhID09PSBiICkgewoJCXJldHVybiByZXQ7Cgl9CgoJdmFyIGN1ciA9IGEubmV4dFNpYmxpbmc7CgoJd2hpbGUgKCBjdXIgKSB7CgkJaWYgKCBjdXIgPT09IGIgKSB7CgkJCXJldHVybiAtMTsKCQl9CgoJCWN1ciA9IGN1ci5uZXh0U2libGluZzsKCX0KCglyZXR1cm4gMTsKfQoKc29ydE9yZGVyID0gZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/CglmdW5jdGlvbiggYSwgYiApIHsKCQlpZiAoIGEgPT09IGIgKSB7CgkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CgkJCXJldHVybiAwOwoJCX0KCgkJcmV0dXJuICggIWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gfHwgIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb24gPwoJCQlhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIDoKCQkJYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIDQKCQkpID8gLTEgOiAxOwoJfSA6CglmdW5jdGlvbiggYSwgYiApIHsKCQkvLyBUaGUgbm9kZXMgYXJlIGlkZW50aWNhbCwgd2UgY2FuIGV4aXQgZWFybHkKCQlpZiAoIGEgPT09IGIgKSB7CgkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CgkJCXJldHVybiAwOwoKCQkvLyBGYWxsYmFjayB0byB1c2luZyBzb3VyY2VJbmRleCAoaW4gSUUpIGlmIGl0J3MgYXZhaWxhYmxlIG9uIGJvdGggbm9kZXMKCQl9IGVsc2UgaWYgKCBhLnNvdXJjZUluZGV4ICYmIGIuc291cmNlSW5kZXggKSB7CgkJCXJldHVybiBhLnNvdXJjZUluZGV4IC0gYi5zb3VyY2VJbmRleDsKCQl9CgoJCXZhciBhbCwgYmwsCgkJCWFwID0gW10sCgkJCWJwID0gW10sCgkJCWF1cCA9IGEucGFyZW50Tm9kZSwKCQkJYnVwID0gYi5wYXJlbnROb2RlLAoJCQljdXIgPSBhdXA7CgoJCS8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MgKG9yIGlkZW50aWNhbCkgd2UgY2FuIGRvIGEgcXVpY2sgY2hlY2sKCQlpZiAoIGF1cCA9PT0gYnVwICkgewoJCQlyZXR1cm4gc2libGluZ0NoZWNrKCBhLCBiICk7CgoJCS8vIElmIG5vIHBhcmVudHMgd2VyZSBmb3VuZCB0aGVuIHRoZSBub2RlcyBhcmUgZGlzY29ubmVjdGVkCgkJfSBlbHNlIGlmICggIWF1cCApIHsKCQkJcmV0dXJuIC0xOwoKCQl9IGVsc2UgaWYgKCAhYnVwICkgewoJCQlyZXR1cm4gMTsKCQl9CgoJCS8vIE90aGVyd2lzZSB0aGV5J3JlIHNvbWV3aGVyZSBlbHNlIGluIHRoZSB0cmVlIHNvIHdlIG5lZWQKCQkvLyB0byBidWlsZCB1cCBhIGZ1bGwgbGlzdCBvZiB0aGUgcGFyZW50Tm9kZXMgZm9yIGNvbXBhcmlzb24KCQl3aGlsZSAoIGN1ciApIHsKCQkJYXAudW5zaGlmdCggY3VyICk7CgkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOwoJCX0KCgkJY3VyID0gYnVwOwoKCQl3aGlsZSAoIGN1ciApIHsKCQkJYnAudW5zaGlmdCggY3VyICk7CgkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOwoJCX0KCgkJYWwgPSBhcC5sZW5ndGg7CgkJYmwgPSBicC5sZW5ndGg7CgoJCS8vIFN0YXJ0IHdhbGtpbmcgZG93biB0aGUgdHJlZSBsb29raW5nIGZvciBhIGRpc2NyZXBhbmN5CgkJZm9yICggdmFyIGkgPSAwOyBpIDwgYWwgJiYgaSA8IGJsOyBpKysgKSB7CgkJCWlmICggYXBbaV0gIT09IGJwW2ldICkgewoJCQkJcmV0dXJuIHNpYmxpbmdDaGVjayggYXBbaV0sIGJwW2ldICk7CgkJCX0KCQl9CgoJCS8vIFdlIGVuZGVkIHNvbWVwbGFjZSB1cCB0aGUgdHJlZSBzbyBkbyBhIHNpYmxpbmcgY2hlY2sKCQlyZXR1cm4gaSA9PT0gYWwgPwoJCQlzaWJsaW5nQ2hlY2soIGEsIGJwW2ldLCAtMSApIDoKCQkJc2libGluZ0NoZWNrKCBhcFtpXSwgYiwgMSApOwoJfTsKCi8vIEFsd2F5cyBhc3N1bWUgdGhlIHByZXNlbmNlIG9mIGR1cGxpY2F0ZXMgaWYgc29ydCBkb2Vzbid0Ci8vIHBhc3MgdGhlbSB0byBvdXIgY29tcGFyaXNvbiBmdW5jdGlvbiAoYXMgaW4gR29vZ2xlIENocm9tZSkuClswLCAwXS5zb3J0KCBzb3J0T3JkZXIgKTsKYmFzZUhhc0R1cGxpY2F0ZSA9ICFoYXNEdXBsaWNhdGU7CgovLyBEb2N1bWVudCBzb3J0aW5nIGFuZCByZW1vdmluZyBkdXBsaWNhdGVzClNpenpsZS51bmlxdWVTb3J0ID0gZnVuY3Rpb24oIHJlc3VsdHMgKSB7Cgl2YXIgZWxlbSwKCQlpID0gMTsKCgloYXNEdXBsaWNhdGUgPSBiYXNlSGFzRHVwbGljYXRlOwoJcmVzdWx0cy5zb3J0KCBzb3J0T3JkZXIgKTsKCglpZiAoIGhhc0R1cGxpY2F0ZSApIHsKCQlmb3IgKCA7IChlbGVtID0gcmVzdWx0c1tpXSk7IGkrKyApIHsKCQkJaWYgKCBlbGVtID09PSByZXN1bHRzWyBpIC0gMSBdICkgewoJCQkJcmVzdWx0cy5zcGxpY2UoIGktLSwgMSApOwoJCQl9CgkJfQoJfQoKCXJldHVybiByZXN1bHRzOwp9OwoKU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHsKCXRocm93IG5ldyBFcnJvciggIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBtc2cgKTsKfTsKCmZ1bmN0aW9uIHRva2VuaXplKCBzZWxlY3RvciwgcGFyc2VPbmx5ICkgewoJdmFyIG1hdGNoZWQsIG1hdGNoLCB0b2tlbnMsIHR5cGUsIHNvRmFyLCBncm91cHMsIHByZUZpbHRlcnMsCgkJY2FjaGVkID0gdG9rZW5DYWNoZVsgZXhwYW5kbyBdWyBzZWxlY3RvciBdOwoKCWlmICggY2FjaGVkICkgewoJCXJldHVybiBwYXJzZU9ubHkgPyAwIDogY2FjaGVkLnNsaWNlKCAwICk7Cgl9CgoJc29GYXIgPSBzZWxlY3RvcjsKCWdyb3VwcyA9IFtdOwoJcHJlRmlsdGVycyA9IEV4cHIucHJlRmlsdGVyOwoKCXdoaWxlICggc29GYXIgKSB7CgoJCS8vIENvbW1hIGFuZCBmaXJzdCBydW4KCQlpZiAoICFtYXRjaGVkIHx8IChtYXRjaCA9IHJjb21tYS5leGVjKCBzb0ZhciApKSApIHsKCQkJaWYgKCBtYXRjaCApIHsKCQkJCXNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoWzBdLmxlbmd0aCApOwoJCQl9CgkJCWdyb3Vwcy5wdXNoKCB0b2tlbnMgPSBbXSApOwoJCX0KCgkJbWF0Y2hlZCA9IGZhbHNlOwoKCQkvLyBDb21iaW5hdG9ycwoJCWlmICggKG1hdGNoID0gcmNvbWJpbmF0b3JzLmV4ZWMoIHNvRmFyICkpICkgewoJCQl0b2tlbnMucHVzaCggbWF0Y2hlZCA9IG5ldyBUb2tlbiggbWF0Y2guc2hpZnQoKSApICk7CgkJCXNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7CgoJCQkvLyBDYXN0IGRlc2NlbmRhbnQgY29tYmluYXRvcnMgdG8gc3BhY2UKCQkJbWF0Y2hlZC50eXBlID0gbWF0Y2hbMF0ucmVwbGFjZSggcnRyaW0sICIgIiApOwoJCX0KCgkJLy8gRmlsdGVycwoJCWZvciAoIHR5cGUgaW4gRXhwci5maWx0ZXIgKSB7CgkJCWlmICggKG1hdGNoID0gbWF0Y2hFeHByWyB0eXBlIF0uZXhlYyggc29GYXIgKSkgJiYgKCFwcmVGaWx0ZXJzWyB0eXBlIF0gfHwKCQkJCS8vIFRoZSBsYXN0IHR3byBhcmd1bWVudHMgaGVyZSBhcmUgKGNvbnRleHQsIHhtbCkgZm9yIGJhY2tDb21wYXQKCQkJCShtYXRjaCA9IHByZUZpbHRlcnNbIHR5cGUgXSggbWF0Y2gsIGRvY3VtZW50LCB0cnVlICkpKSApIHsKCgkJCQl0b2tlbnMucHVzaCggbWF0Y2hlZCA9IG5ldyBUb2tlbiggbWF0Y2guc2hpZnQoKSApICk7CgkJCQlzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVkLmxlbmd0aCApOwoJCQkJbWF0Y2hlZC50eXBlID0gdHlwZTsKCQkJCW1hdGNoZWQubWF0Y2hlcyA9IG1hdGNoOwoJCQl9CgkJfQoKCQlpZiAoICFtYXRjaGVkICkgewoJCQlicmVhazsKCQl9Cgl9CgoJLy8gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGludmFsaWQgZXhjZXNzCgkvLyBpZiB3ZSdyZSBqdXN0IHBhcnNpbmcKCS8vIE90aGVyd2lzZSwgdGhyb3cgYW4gZXJyb3Igb3IgcmV0dXJuIHRva2VucwoJcmV0dXJuIHBhcnNlT25seSA/CgkJc29GYXIubGVuZ3RoIDoKCQlzb0ZhciA/CgkJCVNpenpsZS5lcnJvciggc2VsZWN0b3IgKSA6CgkJCS8vIENhY2hlIHRoZSB0b2tlbnMKCQkJdG9rZW5DYWNoZSggc2VsZWN0b3IsIGdyb3VwcyApLnNsaWNlKCAwICk7Cn0KCmZ1bmN0aW9uIGFkZENvbWJpbmF0b3IoIG1hdGNoZXIsIGNvbWJpbmF0b3IsIGJhc2UgKSB7Cgl2YXIgZGlyID0gY29tYmluYXRvci5kaXIsCgkJY2hlY2tOb25FbGVtZW50cyA9IGJhc2UgJiYgY29tYmluYXRvci5kaXIgPT09ICJwYXJlbnROb2RlIiwKCQlkb25lTmFtZSA9IGRvbmUrKzsKCglyZXR1cm4gY29tYmluYXRvci5maXJzdCA/CgkJLy8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50CgkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJd2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHsKCQkJCWlmICggY2hlY2tOb25FbGVtZW50cyB8fCBlbGVtLm5vZGVUeXBlID09PSAxICApIHsKCQkJCQlyZXR1cm4gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICk7CgkJCQl9CgkJCX0KCQl9IDoKCgkJLy8gQ2hlY2sgYWdhaW5zdCBhbGwgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRzCgkJZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHsKCQkJLy8gV2UgY2FuJ3Qgc2V0IGFyYml0cmFyeSBkYXRhIG9uIFhNTCBub2Rlcywgc28gdGhleSBkb24ndCBiZW5lZml0IGZyb20gZGlyIGNhY2hpbmcKCQkJaWYgKCAheG1sICkgewoJCQkJdmFyIGNhY2hlLAoJCQkJCWRpcmtleSA9IGRpcnJ1bnMgKyAiICIgKyBkb25lTmFtZSArICIgIiwKCQkJCQljYWNoZWRrZXkgPSBkaXJrZXkgKyBjYWNoZWRydW5zOwoJCQkJd2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHsKCQkJCQlpZiAoIGNoZWNrTm9uRWxlbWVudHMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCQkJaWYgKCAoY2FjaGUgPSBlbGVtWyBleHBhbmRvIF0pID09PSBjYWNoZWRrZXkgKSB7CgkJCQkJCQlyZXR1cm4gZWxlbS5zaXpzZXQ7CgkJCQkJCX0gZWxzZSBpZiAoIHR5cGVvZiBjYWNoZSA9PT0gInN0cmluZyIgJiYgY2FjaGUuaW5kZXhPZihkaXJrZXkpID09PSAwICkgewoJCQkJCQkJaWYgKCBlbGVtLnNpenNldCApIHsKCQkJCQkJCQlyZXR1cm4gZWxlbTsKCQkJCQkJCX0KCQkJCQkJfSBlbHNlIHsKCQkJCQkJCWVsZW1bIGV4cGFuZG8gXSA9IGNhY2hlZGtleTsKCQkJCQkJCWlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7CgkJCQkJCQkJZWxlbS5zaXpzZXQgPSB0cnVlOwoJCQkJCQkJCXJldHVybiBlbGVtOwoJCQkJCQkJfQoJCQkJCQkJZWxlbS5zaXpzZXQgPSBmYWxzZTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7CgkJCQkJaWYgKCBjaGVja05vbkVsZW1lbnRzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgkJCQkJCWlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7CgkJCQkJCQlyZXR1cm4gZWxlbTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX07Cn0KCmZ1bmN0aW9uIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApIHsKCXJldHVybiBtYXRjaGVycy5sZW5ndGggPiAxID8KCQlmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgewoJCQl2YXIgaSA9IG1hdGNoZXJzLmxlbmd0aDsKCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQlpZiAoICFtYXRjaGVyc1tpXSggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgkJCXJldHVybiB0cnVlOwoJCX0gOgoJCW1hdGNoZXJzWzBdOwp9CgpmdW5jdGlvbiBjb25kZW5zZSggdW5tYXRjaGVkLCBtYXAsIGZpbHRlciwgY29udGV4dCwgeG1sICkgewoJdmFyIGVsZW0sCgkJbmV3VW5tYXRjaGVkID0gW10sCgkJaSA9IDAsCgkJbGVuID0gdW5tYXRjaGVkLmxlbmd0aCwKCQltYXBwZWQgPSBtYXAgIT0gbnVsbDsKCglmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKCQlpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHsKCQkJaWYgKCAhZmlsdGVyIHx8IGZpbHRlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7CgkJCQluZXdVbm1hdGNoZWQucHVzaCggZWxlbSApOwoJCQkJaWYgKCBtYXBwZWQgKSB7CgkJCQkJbWFwLnB1c2goIGkgKTsKCQkJCX0KCQkJfQoJCX0KCX0KCglyZXR1cm4gbmV3VW5tYXRjaGVkOwp9CgpmdW5jdGlvbiBzZXRNYXRjaGVyKCBwcmVGaWx0ZXIsIHNlbGVjdG9yLCBtYXRjaGVyLCBwb3N0RmlsdGVyLCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKSB7CglpZiAoIHBvc3RGaWx0ZXIgJiYgIXBvc3RGaWx0ZXJbIGV4cGFuZG8gXSApIHsKCQlwb3N0RmlsdGVyID0gc2V0TWF0Y2hlciggcG9zdEZpbHRlciApOwoJfQoJaWYgKCBwb3N0RmluZGVyICYmICFwb3N0RmluZGVyWyBleHBhbmRvIF0gKSB7CgkJcG9zdEZpbmRlciA9IHNldE1hdGNoZXIoIHBvc3RGaW5kZXIsIHBvc3RTZWxlY3RvciApOwoJfQoJcmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgcmVzdWx0cywgY29udGV4dCwgeG1sICkgewoJCS8vIFBvc2l0aW9uYWwgc2VsZWN0b3JzIGFwcGx5IHRvIHNlZWQgZWxlbWVudHMsIHNvIGl0IGlzIGludmFsaWQgdG8gZm9sbG93IHRoZW0gd2l0aCByZWxhdGl2ZSBvbmVzCgkJaWYgKCBzZWVkICYmIHBvc3RGaW5kZXIgKSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciBpLCBlbGVtLCBwb3N0RmlsdGVySW4sCgkJCXByZU1hcCA9IFtdLAoJCQlwb3N0TWFwID0gW10sCgkJCXByZWV4aXN0aW5nID0gcmVzdWx0cy5sZW5ndGgsCgoJCQkvLyBHZXQgaW5pdGlhbCBlbGVtZW50cyBmcm9tIHNlZWQgb3IgY29udGV4dAoJCQllbGVtcyA9IHNlZWQgfHwgbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IgfHwgIioiLCBjb250ZXh0Lm5vZGVUeXBlID8gWyBjb250ZXh0IF0gOiBjb250ZXh0LCBbXSwgc2VlZCApLAoKCQkJLy8gUHJlZmlsdGVyIHRvIGdldCBtYXRjaGVyIGlucHV0LCBwcmVzZXJ2aW5nIGEgbWFwIGZvciBzZWVkLXJlc3VsdHMgc3luY2hyb25pemF0aW9uCgkJCW1hdGNoZXJJbiA9IHByZUZpbHRlciAmJiAoIHNlZWQgfHwgIXNlbGVjdG9yICkgPwoJCQkJY29uZGVuc2UoIGVsZW1zLCBwcmVNYXAsIHByZUZpbHRlciwgY29udGV4dCwgeG1sICkgOgoJCQkJZWxlbXMsCgoJCQltYXRjaGVyT3V0ID0gbWF0Y2hlciA/CgkJCQkvLyBJZiB3ZSBoYXZlIGEgcG9zdEZpbmRlciwgb3IgZmlsdGVyZWQgc2VlZCwgb3Igbm9uLXNlZWQgcG9zdEZpbHRlciBvciBwcmVleGlzdGluZyByZXN1bHRzLAoJCQkJcG9zdEZpbmRlciB8fCAoIHNlZWQgPyBwcmVGaWx0ZXIgOiBwcmVleGlzdGluZyB8fCBwb3N0RmlsdGVyICkgPwoKCQkJCQkvLyAuLi5pbnRlcm1lZGlhdGUgcHJvY2Vzc2luZyBpcyBuZWNlc3NhcnkKCQkJCQlbXSA6CgoJCQkJCS8vIC4uLm90aGVyd2lzZSB1c2UgcmVzdWx0cyBkaXJlY3RseQoJCQkJCXJlc3VsdHMgOgoJCQkJbWF0Y2hlckluOwoKCQkvLyBGaW5kIHByaW1hcnkgbWF0Y2hlcwoJCWlmICggbWF0Y2hlciApIHsKCQkJbWF0Y2hlciggbWF0Y2hlckluLCBtYXRjaGVyT3V0LCBjb250ZXh0LCB4bWwgKTsKCQl9CgoJCS8vIEFwcGx5IHBvc3RGaWx0ZXIKCQlpZiAoIHBvc3RGaWx0ZXIgKSB7CgkJCXBvc3RGaWx0ZXJJbiA9IGNvbmRlbnNlKCBtYXRjaGVyT3V0LCBwb3N0TWFwICk7CgkJCXBvc3RGaWx0ZXIoIHBvc3RGaWx0ZXJJbiwgW10sIGNvbnRleHQsIHhtbCApOwoKCQkJLy8gVW4tbWF0Y2ggZmFpbGluZyBlbGVtZW50cyBieSBtb3ZpbmcgdGhlbSBiYWNrIHRvIG1hdGNoZXJJbgoJCQlpID0gcG9zdEZpbHRlckluLmxlbmd0aDsKCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQlpZiAoIChlbGVtID0gcG9zdEZpbHRlckluW2ldKSApIHsKCQkJCQltYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIEtlZXAgc2VlZCBhbmQgcmVzdWx0cyBzeW5jaHJvbml6ZWQKCQlpZiAoIHNlZWQgKSB7CgkJCS8vIElnbm9yZSBwb3N0RmluZGVyIGJlY2F1c2UgaXQgY2FuJ3QgY29leGlzdCB3aXRoIHNlZWQKCQkJaSA9IHByZUZpbHRlciAmJiBtYXRjaGVyT3V0Lmxlbmd0aDsKCQkJd2hpbGUgKCBpLS0gKSB7CgkJCQlpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgKSB7CgkJCQkJc2VlZFsgcHJlTWFwW2ldIF0gPSAhKHJlc3VsdHNbIHByZU1hcFtpXSBdID0gZWxlbSk7CgkJCQl9CgkJCX0KCQl9IGVsc2UgewoJCQltYXRjaGVyT3V0ID0gY29uZGVuc2UoCgkJCQltYXRjaGVyT3V0ID09PSByZXN1bHRzID8KCQkJCQltYXRjaGVyT3V0LnNwbGljZSggcHJlZXhpc3RpbmcsIG1hdGNoZXJPdXQubGVuZ3RoICkgOgoJCQkJCW1hdGNoZXJPdXQKCQkJKTsKCQkJaWYgKCBwb3N0RmluZGVyICkgewoJCQkJcG9zdEZpbmRlciggbnVsbCwgcmVzdWx0cywgbWF0Y2hlck91dCwgeG1sICk7CgkJCX0gZWxzZSB7CgkJCQlwdXNoLmFwcGx5KCByZXN1bHRzLCBtYXRjaGVyT3V0ICk7CgkJCX0KCQl9Cgl9KTsKfQoKZnVuY3Rpb24gbWF0Y2hlckZyb21Ub2tlbnMoIHRva2VucyApIHsKCXZhciBjaGVja0NvbnRleHQsIG1hdGNoZXIsIGosCgkJbGVuID0gdG9rZW5zLmxlbmd0aCwKCQlsZWFkaW5nUmVsYXRpdmUgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMF0udHlwZSBdLAoJCWltcGxpY2l0UmVsYXRpdmUgPSBsZWFkaW5nUmVsYXRpdmUgfHwgRXhwci5yZWxhdGl2ZVsiICJdLAoJCWkgPSBsZWFkaW5nUmVsYXRpdmUgPyAxIDogMCwKCgkJLy8gVGhlIGZvdW5kYXRpb25hbCBtYXRjaGVyIGVuc3VyZXMgdGhhdCBlbGVtZW50cyBhcmUgcmVhY2hhYmxlIGZyb20gdG9wLWxldmVsIGNvbnRleHQocykKCQltYXRjaENvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0gPT09IGNoZWNrQ29udGV4dDsKCQl9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksCgkJbWF0Y2hBbnlDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBpbmRleE9mLmNhbGwoIGNoZWNrQ29udGV4dCwgZWxlbSApID4gLTE7CgkJfSwgaW1wbGljaXRSZWxhdGl2ZSwgdHJ1ZSApLAoJCW1hdGNoZXJzID0gWyBmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkgewoJCQlyZXR1cm4gKCAhbGVhZGluZ1JlbGF0aXZlICYmICggeG1sIHx8IGNvbnRleHQgIT09IG91dGVybW9zdENvbnRleHQgKSApIHx8ICgKCQkJCShjaGVja0NvbnRleHQgPSBjb250ZXh0KS5ub2RlVHlwZSA/CgkJCQkJbWF0Y2hDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSA6CgkJCQkJbWF0Y2hBbnlDb250ZXh0KCBlbGVtLCBjb250ZXh0LCB4bWwgKSApOwoJCX0gXTsKCglmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKCQlpZiAoIChtYXRjaGVyID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2ldLnR5cGUgXSkgKSB7CgkJCW1hdGNoZXJzID0gWyBhZGRDb21iaW5hdG9yKCBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwgbWF0Y2hlciApIF07CgkJfSBlbHNlIHsKCQkJLy8gVGhlIGNvbmNhdGVuYXRlZCB2YWx1ZXMgYXJlIChjb250ZXh0LCB4bWwpIGZvciBiYWNrQ29tcGF0CgkJCW1hdGNoZXIgPSBFeHByLmZpbHRlclsgdG9rZW5zW2ldLnR5cGUgXS5hcHBseSggbnVsbCwgdG9rZW5zW2ldLm1hdGNoZXMgKTsKCgkJCS8vIFJldHVybiBzcGVjaWFsIHVwb24gc2VlaW5nIGEgcG9zaXRpb25hbCBtYXRjaGVyCgkJCWlmICggbWF0Y2hlclsgZXhwYW5kbyBdICkgewoJCQkJLy8gRmluZCB0aGUgbmV4dCByZWxhdGl2ZSBvcGVyYXRvciAoaWYgYW55KSBmb3IgcHJvcGVyIGhhbmRsaW5nCgkJCQlqID0gKytpOwoJCQkJZm9yICggOyBqIDwgbGVuOyBqKysgKSB7CgkJCQkJaWYgKCBFeHByLnJlbGF0aXZlWyB0b2tlbnNbal0udHlwZSBdICkgewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCQlyZXR1cm4gc2V0TWF0Y2hlcigKCQkJCQlpID4gMSAmJiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwKCQkJCQlpID4gMSAmJiB0b2tlbnMuc2xpY2UoIDAsIGkgLSAxICkuam9pbigiIikucmVwbGFjZSggcnRyaW0sICIkMSIgKSwKCQkJCQltYXRjaGVyLAoJCQkJCWkgPCBqICYmIG1hdGNoZXJGcm9tVG9rZW5zKCB0b2tlbnMuc2xpY2UoIGksIGogKSApLAoJCQkJCWogPCBsZW4gJiYgbWF0Y2hlckZyb21Ub2tlbnMoICh0b2tlbnMgPSB0b2tlbnMuc2xpY2UoIGogKSkgKSwKCQkJCQlqIDwgbGVuICYmIHRva2Vucy5qb2luKCIiKQoJCQkJKTsKCQkJfQoJCQltYXRjaGVycy5wdXNoKCBtYXRjaGVyICk7CgkJfQoJfQoKCXJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTsKfQoKZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgewoJdmFyIGJ5U2V0ID0gc2V0TWF0Y2hlcnMubGVuZ3RoID4gMCwKCQlieUVsZW1lbnQgPSBlbGVtZW50TWF0Y2hlcnMubGVuZ3RoID4gMCwKCQlzdXBlck1hdGNoZXIgPSBmdW5jdGlvbiggc2VlZCwgY29udGV4dCwgeG1sLCByZXN1bHRzLCBleHBhbmRDb250ZXh0ICkgewoJCQl2YXIgZWxlbSwgaiwgbWF0Y2hlciwKCQkJCXNldE1hdGNoZWQgPSBbXSwKCQkJCW1hdGNoZWRDb3VudCA9IDAsCgkJCQlpID0gIjAiLAoJCQkJdW5tYXRjaGVkID0gc2VlZCAmJiBbXSwKCQkJCW91dGVybW9zdCA9IGV4cGFuZENvbnRleHQgIT0gbnVsbCwKCQkJCWNvbnRleHRCYWNrdXAgPSBvdXRlcm1vc3RDb250ZXh0LAoJCQkJLy8gV2UgbXVzdCBhbHdheXMgaGF2ZSBlaXRoZXIgc2VlZCBlbGVtZW50cyBvciBjb250ZXh0CgkJCQllbGVtcyA9IHNlZWQgfHwgYnlFbGVtZW50ICYmIEV4cHIuZmluZFsiVEFHIl0oICIqIiwgZXhwYW5kQ29udGV4dCAmJiBjb250ZXh0LnBhcmVudE5vZGUgfHwgY29udGV4dCApLAoJCQkJLy8gTmVzdGVkIG1hdGNoZXJzIHNob3VsZCB1c2Ugbm9uLWludGVnZXIgZGlycnVucwoJCQkJZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLkUpOwoKCQkJaWYgKCBvdXRlcm1vc3QgKSB7CgkJCQlvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dCAhPT0gZG9jdW1lbnQgJiYgY29udGV4dDsKCQkJCWNhY2hlZHJ1bnMgPSBzdXBlck1hdGNoZXIuZWw7CgkJCX0KCgkJCS8vIEFkZCBlbGVtZW50cyBwYXNzaW5nIGVsZW1lbnRNYXRjaGVycyBkaXJlY3RseSB0byByZXN1bHRzCgkJCWZvciAoIDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBieUVsZW1lbnQgJiYgZWxlbSApIHsKCQkJCQlmb3IgKCBqID0gMDsgKG1hdGNoZXIgPSBlbGVtZW50TWF0Y2hlcnNbal0pOyBqKysgKSB7CgkJCQkJCWlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7CgkJCQkJCQlyZXN1bHRzLnB1c2goIGVsZW0gKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfQoJCQkJCWlmICggb3V0ZXJtb3N0ICkgewoJCQkJCQlkaXJydW5zID0gZGlycnVuc1VuaXF1ZTsKCQkJCQkJY2FjaGVkcnVucyA9ICsrc3VwZXJNYXRjaGVyLmVsOwoJCQkJCX0KCQkJCX0KCgkJCQkvLyBUcmFjayB1bm1hdGNoZWQgZWxlbWVudHMgZm9yIHNldCBmaWx0ZXJzCgkJCQlpZiAoIGJ5U2V0ICkgewoJCQkJCS8vIFRoZXkgd2lsbCBoYXZlIGdvbmUgdGhyb3VnaCBhbGwgcG9zc2libGUgbWF0Y2hlcnMKCQkJCQlpZiAoIChlbGVtID0gIW1hdGNoZXIgJiYgZWxlbSkgKSB7CgkJCQkJCW1hdGNoZWRDb3VudC0tOwoJCQkJCX0KCgkJCQkJLy8gTGVuZ3RoZW4gdGhlIGFycmF5IGZvciBldmVyeSBlbGVtZW50LCBtYXRjaGVkIG9yIG5vdAoJCQkJCWlmICggc2VlZCApIHsKCQkJCQkJdW5tYXRjaGVkLnB1c2goIGVsZW0gKTsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCS8vIEFwcGx5IHNldCBmaWx0ZXJzIHRvIHVubWF0Y2hlZCBlbGVtZW50cwoJCQltYXRjaGVkQ291bnQgKz0gaTsKCQkJaWYgKCBieVNldCAmJiBpICE9PSBtYXRjaGVkQ291bnQgKSB7CgkJCQlmb3IgKCBqID0gMDsgKG1hdGNoZXIgPSBzZXRNYXRjaGVyc1tqXSk7IGorKyApIHsKCQkJCQltYXRjaGVyKCB1bm1hdGNoZWQsIHNldE1hdGNoZWQsIGNvbnRleHQsIHhtbCApOwoJCQkJfQoKCQkJCWlmICggc2VlZCApIHsKCQkJCQkvLyBSZWludGVncmF0ZSBlbGVtZW50IG1hdGNoZXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciBzb3J0aW5nCgkJCQkJaWYgKCBtYXRjaGVkQ291bnQgPiAwICkgewoJCQkJCQl3aGlsZSAoIGktLSApIHsKCQkJCQkJCWlmICggISh1bm1hdGNoZWRbaV0gfHwgc2V0TWF0Y2hlZFtpXSkgKSB7CgkJCQkJCQkJc2V0TWF0Y2hlZFtpXSA9IHBvcC5jYWxsKCByZXN1bHRzICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIERpc2NhcmQgaW5kZXggcGxhY2Vob2xkZXIgdmFsdWVzIHRvIGdldCBvbmx5IGFjdHVhbCBtYXRjaGVzCgkJCQkJc2V0TWF0Y2hlZCA9IGNvbmRlbnNlKCBzZXRNYXRjaGVkICk7CgkJCQl9CgoJCQkJLy8gQWRkIG1hdGNoZXMgdG8gcmVzdWx0cwoJCQkJcHVzaC5hcHBseSggcmVzdWx0cywgc2V0TWF0Y2hlZCApOwoKCQkJCS8vIFNlZWRsZXNzIHNldCBtYXRjaGVzIHN1Y2NlZWRpbmcgbXVsdGlwbGUgc3VjY2Vzc2Z1bCBtYXRjaGVycyBzdGlwdWxhdGUgc29ydGluZwoJCQkJaWYgKCBvdXRlcm1vc3QgJiYgIXNlZWQgJiYgc2V0TWF0Y2hlZC5sZW5ndGggPiAwICYmCgkJCQkJKCBtYXRjaGVkQ291bnQgKyBzZXRNYXRjaGVycy5sZW5ndGggKSA+IDEgKSB7CgoJCQkJCVNpenpsZS51bmlxdWVTb3J0KCByZXN1bHRzICk7CgkJCQl9CgkJCX0KCgkJCS8vIE92ZXJyaWRlIG1hbmlwdWxhdGlvbiBvZiBnbG9iYWxzIGJ5IG5lc3RlZCBtYXRjaGVycwoJCQlpZiAoIG91dGVybW9zdCApIHsKCQkJCWRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlOwoJCQkJb3V0ZXJtb3N0Q29udGV4dCA9IGNvbnRleHRCYWNrdXA7CgkJCX0KCgkJCXJldHVybiB1bm1hdGNoZWQ7CgkJfTsKCglzdXBlck1hdGNoZXIuZWwgPSAwOwoJcmV0dXJuIGJ5U2V0ID8KCQltYXJrRnVuY3Rpb24oIHN1cGVyTWF0Y2hlciApIDoKCQlzdXBlck1hdGNoZXI7Cn0KCmNvbXBpbGUgPSBTaXp6bGUuY29tcGlsZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgZ3JvdXAgLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7Cgl2YXIgaSwKCQlzZXRNYXRjaGVycyA9IFtdLAoJCWVsZW1lbnRNYXRjaGVycyA9IFtdLAoJCWNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIGV4cGFuZG8gXVsgc2VsZWN0b3IgXTsKCglpZiAoICFjYWNoZWQgKSB7CgkJLy8gR2VuZXJhdGUgYSBmdW5jdGlvbiBvZiByZWN1cnNpdmUgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgZWFjaCBlbGVtZW50CgkJaWYgKCAhZ3JvdXAgKSB7CgkJCWdyb3VwID0gdG9rZW5pemUoIHNlbGVjdG9yICk7CgkJfQoJCWkgPSBncm91cC5sZW5ndGg7CgkJd2hpbGUgKCBpLS0gKSB7CgkJCWNhY2hlZCA9IG1hdGNoZXJGcm9tVG9rZW5zKCBncm91cFtpXSApOwoJCQlpZiAoIGNhY2hlZFsgZXhwYW5kbyBdICkgewoJCQkJc2V0TWF0Y2hlcnMucHVzaCggY2FjaGVkICk7CgkJCX0gZWxzZSB7CgkJCQllbGVtZW50TWF0Y2hlcnMucHVzaCggY2FjaGVkICk7CgkJCX0KCQl9CgoJCS8vIENhY2hlIHRoZSBjb21waWxlZCBmdW5jdGlvbgoJCWNhY2hlZCA9IGNvbXBpbGVyQ2FjaGUoIHNlbGVjdG9yLCBtYXRjaGVyRnJvbUdyb3VwTWF0Y2hlcnMoIGVsZW1lbnRNYXRjaGVycywgc2V0TWF0Y2hlcnMgKSApOwoJfQoJcmV0dXJuIGNhY2hlZDsKfTsKCmZ1bmN0aW9uIG11bHRpcGxlQ29udGV4dHMoIHNlbGVjdG9yLCBjb250ZXh0cywgcmVzdWx0cywgc2VlZCApIHsKCXZhciBpID0gMCwKCQlsZW4gPSBjb250ZXh0cy5sZW5ndGg7Cglmb3IgKCA7IGkgPCBsZW47IGkrKyApIHsKCQlTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0c1tpXSwgcmVzdWx0cywgc2VlZCApOwoJfQoJcmV0dXJuIHJlc3VsdHM7Cn0KCmZ1bmN0aW9uIHNlbGVjdCggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQsIHhtbCApIHsKCXZhciBpLCB0b2tlbnMsIHRva2VuLCB0eXBlLCBmaW5kLAoJCW1hdGNoID0gdG9rZW5pemUoIHNlbGVjdG9yICksCgkJaiA9IG1hdGNoLmxlbmd0aDsKCglpZiAoICFzZWVkICkgewoJCS8vIFRyeSB0byBtaW5pbWl6ZSBvcGVyYXRpb25zIGlmIHRoZXJlIGlzIG9ubHkgb25lIGdyb3VwCgkJaWYgKCBtYXRjaC5sZW5ndGggPT09IDEgKSB7CgoJCQkvLyBUYWtlIGEgc2hvcnRjdXQgYW5kIHNldCB0aGUgY29udGV4dCBpZiB0aGUgcm9vdCBzZWxlY3RvciBpcyBhbiBJRAoJCQl0b2tlbnMgPSBtYXRjaFswXSA9IG1hdGNoWzBdLnNsaWNlKCAwICk7CgkJCWlmICggdG9rZW5zLmxlbmd0aCA+IDIgJiYgKHRva2VuID0gdG9rZW5zWzBdKS50eXBlID09PSAiSUQiICYmCgkJCQkJY29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiAheG1sICYmCgkJCQkJRXhwci5yZWxhdGl2ZVsgdG9rZW5zWzFdLnR5cGUgXSApIHsKCgkJCQljb250ZXh0ID0gRXhwci5maW5kWyJJRCJdKCB0b2tlbi5tYXRjaGVzWzBdLnJlcGxhY2UoIHJiYWNrc2xhc2gsICIiICksIGNvbnRleHQsIHhtbCApWzBdOwoJCQkJaWYgKCAhY29udGV4dCApIHsKCQkJCQlyZXR1cm4gcmVzdWx0czsKCQkJCX0KCgkJCQlzZWxlY3RvciA9IHNlbGVjdG9yLnNsaWNlKCB0b2tlbnMuc2hpZnQoKS5sZW5ndGggKTsKCQkJfQoKCQkJLy8gRmV0Y2ggYSBzZWVkIHNldCBmb3IgcmlnaHQtdG8tbGVmdCBtYXRjaGluZwoJCQlmb3IgKCBpID0gbWF0Y2hFeHByWyJQT1MiXS50ZXN0KCBzZWxlY3RvciApID8gLTEgOiB0b2tlbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0gKSB7CgkJCQl0b2tlbiA9IHRva2Vuc1tpXTsKCgkJCQkvLyBBYm9ydCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9yCgkJCQlpZiAoIEV4cHIucmVsYXRpdmVbICh0eXBlID0gdG9rZW4udHlwZSkgXSApIHsKCQkJCQlicmVhazsKCQkJCX0KCQkJCWlmICggKGZpbmQgPSBFeHByLmZpbmRbIHR5cGUgXSkgKSB7CgkJCQkJLy8gU2VhcmNoLCBleHBhbmRpbmcgY29udGV4dCBmb3IgbGVhZGluZyBzaWJsaW5nIGNvbWJpbmF0b3JzCgkJCQkJaWYgKCAoc2VlZCA9IGZpbmQoCgkJCQkJCXRva2VuLm1hdGNoZXNbMF0ucmVwbGFjZSggcmJhY2tzbGFzaCwgIiIgKSwKCQkJCQkJcnNpYmxpbmcudGVzdCggdG9rZW5zWzBdLnR5cGUgKSAmJiBjb250ZXh0LnBhcmVudE5vZGUgfHwgY29udGV4dCwKCQkJCQkJeG1sCgkJCQkJKSkgKSB7CgoJCQkJCQkvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHkKCQkJCQkJdG9rZW5zLnNwbGljZSggaSwgMSApOwoJCQkJCQlzZWxlY3RvciA9IHNlZWQubGVuZ3RoICYmIHRva2Vucy5qb2luKCIiKTsKCQkJCQkJaWYgKCAhc2VsZWN0b3IgKSB7CgkJCQkJCQlwdXNoLmFwcGx5KCByZXN1bHRzLCBzbGljZS5jYWxsKCBzZWVkLCAwICkgKTsKCQkJCQkJCXJldHVybiByZXN1bHRzOwoJCQkJCQl9CgoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9CgoJLy8gQ29tcGlsZSBhbmQgZXhlY3V0ZSBhIGZpbHRlcmluZyBmdW5jdGlvbgoJLy8gUHJvdmlkZSBgbWF0Y2hgIHRvIGF2b2lkIHJldG9rZW5pemF0aW9uIGlmIHdlIG1vZGlmaWVkIHRoZSBzZWxlY3RvciBhYm92ZQoJY29tcGlsZSggc2VsZWN0b3IsIG1hdGNoICkoCgkJc2VlZCwKCQljb250ZXh0LAoJCXhtbCwKCQlyZXN1bHRzLAoJCXJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkKCSk7CglyZXR1cm4gcmVzdWx0czsKfQoKaWYgKCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsICkgewoJKGZ1bmN0aW9uKCkgewoJCXZhciBkaXNjb25uZWN0ZWRNYXRjaCwKCQkJb2xkU2VsZWN0ID0gc2VsZWN0LAoJCQlyZXNjYXBlID0gLyd8XFwvZywKCQkJcmF0dHJpYnV0ZVF1b3RlcyA9IC9cPVtceDIwXHRcclxuXGZdKihbXiciXF1dKilbXHgyMFx0XHJcblxmXSpcXS9nLAoKCQkJLy8gcVNhKDpmb2N1cykgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKENocm9tZSAyMSksCgkJCS8vIEEgc3VwcG9ydCB0ZXN0IHdvdWxkIHJlcXVpcmUgdG9vIG11Y2ggY29kZSAod291bGQgaW5jbHVkZSBkb2N1bWVudCByZWFkeSkKCQkJcmJ1Z2d5UVNBID0gWyI6Zm9jdXMiXSwKCgkJCS8vIG1hdGNoZXNTZWxlY3Rvcig6Zm9jdXMpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChDaHJvbWUgMjEpLAoJCQkvLyBtYXRjaGVzU2VsZWN0b3IoOmFjdGl2ZSkgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKElFOS9PcGVyYSAxMS41KQoJCQkvLyBBIHN1cHBvcnQgdGVzdCB3b3VsZCByZXF1aXJlIHRvbyBtdWNoIGNvZGUgKHdvdWxkIGluY2x1ZGUgZG9jdW1lbnQgcmVhZHkpCgkJCS8vIGp1c3Qgc2tpcCBtYXRjaGVzU2VsZWN0b3IgZm9yIDphY3RpdmUKCQkJcmJ1Z2d5TWF0Y2hlcyA9IFsgIjphY3RpdmUiLCAiOmZvY3VzIiBdLAoJCQltYXRjaGVzID0gZG9jRWxlbS5tYXRjaGVzU2VsZWN0b3IgfHwKCQkJCWRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8CgkJCQlkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fAoJCQkJZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8CgkJCQlkb2NFbGVtLm1zTWF0Y2hlc1NlbGVjdG9yOwoKCQkvLyBCdWlsZCBRU0EgcmVnZXgKCQkvLyBSZWdleCBzdHJhdGVneSBhZG9wdGVkIGZyb20gRGllZ28gUGVyaW5pCgkJYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7CgkJCS8vIFNlbGVjdCBpcyBzZXQgdG8gZW1wdHkgc3RyaW5nIG9uIHB1cnBvc2UKCQkJLy8gVGhpcyBpcyB0byB0ZXN0IElFJ3MgdHJlYXRtZW50IG9mIG5vdCBleHBsaWN0bHkKCQkJLy8gc2V0dGluZyBhIGJvb2xlYW4gY29udGVudCBhdHRyaWJ1dGUsCgkJCS8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoCgkJCS8vIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEyMzU5CgkJCWRpdi5pbm5lckhUTUwgPSAiPHNlbGVjdD48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiI7CgoJCQkvLyBJRTggLSBTb21lIGJvb2xlYW4gYXR0cmlidXRlcyBhcmUgbm90IHRyZWF0ZWQgY29ycmVjdGx5CgkJCWlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goICJcXFsiICsgd2hpdGVzcGFjZSArICIqKD86Y2hlY2tlZHxkaXNhYmxlZHxpc21hcHxtdWx0aXBsZXxyZWFkb25seXxzZWxlY3RlZHx2YWx1ZSkiICk7CgkJCX0KCgkJCS8vIFdlYmtpdC9PcGVyYSAtIDpjaGVja2VkIHNob3VsZCByZXR1cm4gc2VsZWN0ZWQgb3B0aW9uIGVsZW1lbnRzCgkJCS8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkCgkJCS8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSAoZG8gbm90IHB1dCB0ZXN0cyBhZnRlciB0aGlzIG9uZSkKCQkJaWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RoICkgewoJCQkJcmJ1Z2d5UVNBLnB1c2goIjpjaGVja2VkIik7CgkJCX0KCQl9KTsKCgkJYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7CgoJCQkvLyBPcGVyYSAxMC0xMi9JRTkgLSBePSAkPSAqPSBhbmQgZW1wdHkgdmFsdWVzCgkJCS8vIFNob3VsZCBub3Qgc2VsZWN0IGFueXRoaW5nCgkJCWRpdi5pbm5lckhUTUwgPSAiPHAgdGVzdD0nJz48L3A+IjsKCQkJaWYgKCBkaXYucXVlcnlTZWxlY3RvckFsbCgiW3Rlc3RePScnXSIpLmxlbmd0aCApIHsKCQkJCXJidWdneVFTQS5wdXNoKCAiWypeJF09IiArIHdoaXRlc3BhY2UgKyAiKig/OlwiXCJ8JycpIiApOwoJCQl9CgoJCQkvLyBGRiAzLjUgLSA6ZW5hYmxlZC86ZGlzYWJsZWQgYW5kIGhpZGRlbiBlbGVtZW50cyAoaGlkZGVuIGVsZW1lbnRzIGFyZSBzdGlsbCBlbmFibGVkKQoJCQkvLyBJRTggdGhyb3dzIGVycm9yIGhlcmUgKGRvIG5vdCBwdXQgdGVzdHMgYWZ0ZXIgdGhpcyBvbmUpCgkJCWRpdi5pbm5lckhUTUwgPSAiPGlucHV0IHR5cGU9J2hpZGRlbicvPiI7CgkJCWlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aCApIHsKCQkJCXJidWdneVFTQS5wdXNoKCI6ZW5hYmxlZCIsICI6ZGlzYWJsZWQiKTsKCQkJfQoJCX0pOwoKCQkvLyByYnVnZ3lRU0EgYWx3YXlzIGNvbnRhaW5zIDpmb2N1cywgc28gbm8gbmVlZCBmb3IgYSBsZW5ndGggY2hlY2sKCQlyYnVnZ3lRU0EgPSAvKiByYnVnZ3lRU0EubGVuZ3RoICYmICovIG5ldyBSZWdFeHAoIHJidWdneVFTQS5qb2luKCJ8IikgKTsKCgkJc2VsZWN0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkLCB4bWwgKSB7CgkJCS8vIE9ubHkgdXNlIHF1ZXJ5U2VsZWN0b3JBbGwgd2hlbiBub3QgZmlsdGVyaW5nLAoJCQkvLyB3aGVuIHRoaXMgaXMgbm90IHhtbCwKCQkJLy8gYW5kIHdoZW4gbm8gUVNBIGJ1Z3MgYXBwbHkKCQkJaWYgKCAhc2VlZCAmJiAheG1sICYmICghcmJ1Z2d5UVNBIHx8ICFyYnVnZ3lRU0EudGVzdCggc2VsZWN0b3IgKSkgKSB7CgkJCQl2YXIgZ3JvdXBzLCBpLAoJCQkJCW9sZCA9IHRydWUsCgkJCQkJbmlkID0gZXhwYW5kbywKCQkJCQluZXdDb250ZXh0ID0gY29udGV4dCwKCQkJCQluZXdTZWxlY3RvciA9IGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgc2VsZWN0b3I7CgoJCQkJLy8gcVNBIHdvcmtzIHN0cmFuZ2VseSBvbiBFbGVtZW50LXJvb3RlZCBxdWVyaWVzCgkJCQkvLyBXZSBjYW4gd29yayBhcm91bmQgdGhpcyBieSBzcGVjaWZ5aW5nIGFuIGV4dHJhIElEIG9uIHRoZSByb290CgkJCQkvLyBhbmQgd29ya2luZyB1cCBmcm9tIHRoZXJlIChUaGFua3MgdG8gQW5kcmV3IER1cG9udCBmb3IgdGhlIHRlY2huaXF1ZSkKCQkJCS8vIElFIDggZG9lc24ndCB3b3JrIG9uIG9iamVjdCBlbGVtZW50cwoJCQkJaWYgKCBjb250ZXh0Lm5vZGVUeXBlID09PSAxICYmIGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gIm9iamVjdCIgKSB7CgkJCQkJZ3JvdXBzID0gdG9rZW5pemUoIHNlbGVjdG9yICk7CgoJCQkJCWlmICggKG9sZCA9IGNvbnRleHQuZ2V0QXR0cmlidXRlKCJpZCIpKSApIHsKCQkJCQkJbmlkID0gb2xkLnJlcGxhY2UoIHJlc2NhcGUsICJcXCQmIiApOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWNvbnRleHQuc2V0QXR0cmlidXRlKCAiaWQiLCBuaWQgKTsKCQkJCQl9CgkJCQkJbmlkID0gIltpZD0nIiArIG5pZCArICInXSAiOwoKCQkJCQlpID0gZ3JvdXBzLmxlbmd0aDsKCQkJCQl3aGlsZSAoIGktLSApIHsKCQkJCQkJZ3JvdXBzW2ldID0gbmlkICsgZ3JvdXBzW2ldLmpvaW4oIiIpOwoJCQkJCX0KCQkJCQluZXdDb250ZXh0ID0gcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiBjb250ZXh0LnBhcmVudE5vZGUgfHwgY29udGV4dDsKCQkJCQluZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKCIsIik7CgkJCQl9CgoJCQkJaWYgKCBuZXdTZWxlY3RvciApIHsKCQkJCQl0cnkgewoJCQkJCQlwdXNoLmFwcGx5KCByZXN1bHRzLCBzbGljZS5jYWxsKCBuZXdDb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoCgkJCQkJCQluZXdTZWxlY3RvcgoJCQkJCQkpLCAwICkgKTsKCQkJCQkJcmV0dXJuIHJlc3VsdHM7CgkJCQkJfSBjYXRjaChxc2FFcnJvcikgewoJCQkJCX0gZmluYWxseSB7CgkJCQkJCWlmICggIW9sZCApIHsKCQkJCQkJCWNvbnRleHQucmVtb3ZlQXR0cmlidXRlKCJpZCIpOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQlyZXR1cm4gb2xkU2VsZWN0KCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCwgeG1sICk7CgkJfTsKCgkJaWYgKCBtYXRjaGVzICkgewoJCQlhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHsKCQkJCS8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvcgoJCQkJLy8gb24gYSBkaXNjb25uZWN0ZWQgbm9kZSAoSUUgOSkKCQkJCWRpc2Nvbm5lY3RlZE1hdGNoID0gbWF0Y2hlcy5jYWxsKCBkaXYsICJkaXYiICk7CgoJCQkJLy8gVGhpcyBzaG91bGQgZmFpbCB3aXRoIGFuIGV4Y2VwdGlvbgoJCQkJLy8gR2Vja28gZG9lcyBub3QgZXJyb3IsIHJldHVybnMgZmFsc2UgaW5zdGVhZAoJCQkJdHJ5IHsKCQkJCQltYXRjaGVzLmNhbGwoIGRpdiwgIlt0ZXN0IT0nJ106c2l6emxlIiApOwoJCQkJCXJidWdneU1hdGNoZXMucHVzaCggIiE9IiwgcHNldWRvcyApOwoJCQkJfSBjYXRjaCAoIGUgKSB7fQoJCQl9KTsKCgkJCS8vIHJidWdneU1hdGNoZXMgYWx3YXlzIGNvbnRhaW5zIDphY3RpdmUgYW5kIDpmb2N1cywgc28gbm8gbmVlZCBmb3IgYSBsZW5ndGggY2hlY2sKCQkJcmJ1Z2d5TWF0Y2hlcyA9IC8qIHJidWdneU1hdGNoZXMubGVuZ3RoICYmICovIG5ldyBSZWdFeHAoIHJidWdneU1hdGNoZXMuam9pbigifCIpICk7CgoJCQlTaXp6bGUubWF0Y2hlc1NlbGVjdG9yID0gZnVuY3Rpb24oIGVsZW0sIGV4cHIgKSB7CgkJCQkvLyBNYWtlIHN1cmUgdGhhdCBhdHRyaWJ1dGUgc2VsZWN0b3JzIGFyZSBxdW90ZWQKCQkJCWV4cHIgPSBleHByLnJlcGxhY2UoIHJhdHRyaWJ1dGVRdW90ZXMsICI9JyQxJ10iICk7CgoJCQkJLy8gcmJ1Z2d5TWF0Y2hlcyBhbHdheXMgY29udGFpbnMgOmFjdGl2ZSwgc28gbm8gbmVlZCBmb3IgYW4gZXhpc3RlbmNlIGNoZWNrCgkJCQlpZiAoICFpc1hNTCggZWxlbSApICYmICFyYnVnZ3lNYXRjaGVzLnRlc3QoIGV4cHIgKSAmJiAoIXJidWdneVFTQSB8fCAhcmJ1Z2d5UVNBLnRlc3QoIGV4cHIgKSkgKSB7CgkJCQkJdHJ5IHsKCQkJCQkJdmFyIHJldCA9IG1hdGNoZXMuY2FsbCggZWxlbSwgZXhwciApOwoKCQkJCQkJLy8gSUUgOSdzIG1hdGNoZXNTZWxlY3RvciByZXR1cm5zIGZhbHNlIG9uIGRpc2Nvbm5lY3RlZCBub2RlcwoJCQkJCQlpZiAoIHJldCB8fCBkaXNjb25uZWN0ZWRNYXRjaCB8fAoJCQkJCQkJCS8vIEFzIHdlbGwsIGRpc2Nvbm5lY3RlZCBub2RlcyBhcmUgc2FpZCB0byBiZSBpbiBhIGRvY3VtZW50CgkJCQkJCQkJLy8gZnJhZ21lbnQgaW4gSUUgOQoJCQkJCQkJCWVsZW0uZG9jdW1lbnQgJiYgZWxlbS5kb2N1bWVudC5ub2RlVHlwZSAhPT0gMTEgKSB7CgkJCQkJCQlyZXR1cm4gcmV0OwoJCQkJCQl9CgkJCQkJfSBjYXRjaChlKSB7fQoJCQkJfQoKCQkJCXJldHVybiBTaXp6bGUoIGV4cHIsIG51bGwsIG51bGwsIFsgZWxlbSBdICkubGVuZ3RoID4gMDsKCQkJfTsKCQl9Cgl9KSgpOwp9CgovLyBEZXByZWNhdGVkCkV4cHIucHNldWRvc1sibnRoIl0gPSBFeHByLnBzZXVkb3NbImVxIl07CgovLyBCYWNrLWNvbXBhdApmdW5jdGlvbiBzZXRGaWx0ZXJzKCkge30KRXhwci5maWx0ZXJzID0gc2V0RmlsdGVycy5wcm90b3R5cGUgPSBFeHByLnBzZXVkb3M7CkV4cHIuc2V0RmlsdGVycyA9IG5ldyBzZXRGaWx0ZXJzKCk7CgovLyBPdmVycmlkZSBzaXp6bGUgYXR0cmlidXRlIHJldHJpZXZhbApTaXp6bGUuYXR0ciA9IGpRdWVyeS5hdHRyOwpqUXVlcnkuZmluZCA9IFNpenpsZTsKalF1ZXJ5LmV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzOwpqUXVlcnkuZXhwclsiOiJdID0galF1ZXJ5LmV4cHIucHNldWRvczsKalF1ZXJ5LnVuaXF1ZSA9IFNpenpsZS51bmlxdWVTb3J0OwpqUXVlcnkudGV4dCA9IFNpenpsZS5nZXRUZXh0OwpqUXVlcnkuaXNYTUxEb2MgPSBTaXp6bGUuaXNYTUw7CmpRdWVyeS5jb250YWlucyA9IFNpenpsZS5jb250YWluczsKCgp9KSggd2luZG93ICk7CnZhciBydW50aWwgPSAvVW50aWwkLywKCXJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLAoJaXNTaW1wbGUgPSAvXi5bXjojXFtcLixdKiQvLAoJcm5lZWRzQ29udGV4dCA9IGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dCwKCS8vIG1ldGhvZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlxdWUgc2V0CglndWFyYW50ZWVkVW5pcXVlID0gewoJCWNoaWxkcmVuOiB0cnVlLAoJCWNvbnRlbnRzOiB0cnVlLAoJCW5leHQ6IHRydWUsCgkJcHJldjogdHJ1ZQoJfTsKCmpRdWVyeS5mbi5leHRlbmQoewoJZmluZDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciBpLCBsLCBsZW5ndGgsIG4sIHIsIHJldCwKCQkJc2VsZiA9IHRoaXM7CgoJCWlmICggdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiApIHsKCQkJcmV0dXJuIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIoZnVuY3Rpb24oKSB7CgkJCQlmb3IgKCBpID0gMCwgbCA9IHNlbGYubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWlmICggalF1ZXJ5LmNvbnRhaW5zKCBzZWxmWyBpIF0sIHRoaXMgKSApIHsKCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQl9CgoJCXJldCA9IHRoaXMucHVzaFN0YWNrKCAiIiwgImZpbmQiLCBzZWxlY3RvciApOwoKCQlmb3IgKCBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQlsZW5ndGggPSByZXQubGVuZ3RoOwoJCQlqUXVlcnkuZmluZCggc2VsZWN0b3IsIHRoaXNbaV0sIHJldCApOwoKCQkJaWYgKCBpID4gMCApIHsKCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSByZXN1bHRzIGFyZSB1bmlxdWUKCQkJCWZvciAoIG4gPSBsZW5ndGg7IG4gPCByZXQubGVuZ3RoOyBuKysgKSB7CgkJCQkJZm9yICggciA9IDA7IHIgPCBsZW5ndGg7IHIrKyApIHsKCQkJCQkJaWYgKCByZXRbcl0gPT09IHJldFtuXSApIHsKCQkJCQkJCXJldC5zcGxpY2Uobi0tLCAxKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0OwoJfSwKCgloYXM6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7CgkJdmFyIGksCgkJCXRhcmdldHMgPSBqUXVlcnkoIHRhcmdldCwgdGhpcyApLAoJCQlsZW4gPSB0YXJnZXRzLmxlbmd0aDsKCgkJcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCkgewoJCQlmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkgewoJCQkJaWYgKCBqUXVlcnkuY29udGFpbnMoIHRoaXMsIHRhcmdldHNbaV0gKSApIHsKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCX0KCQkJfQoJCX0pOwoJfSwKCglub3Q6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyh0aGlzLCBzZWxlY3RvciwgZmFsc2UpLCAibm90Iiwgc2VsZWN0b3IpOwoJfSwKCglmaWx0ZXI6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyh0aGlzLCBzZWxlY3RvciwgdHJ1ZSksICJmaWx0ZXIiLCBzZWxlY3RvciApOwoJfSwKCglpczogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiAhIXNlbGVjdG9yICYmICgKCQkJdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiA/CgkJCQkvLyBJZiB0aGlzIGlzIGEgcG9zaXRpb25hbC9yZWxhdGl2ZSBzZWxlY3RvciwgY2hlY2sgbWVtYmVyc2hpcCBpbiB0aGUgcmV0dXJuZWQgc2V0CgkJCQkvLyBzbyAkKCJwOmZpcnN0IikuaXMoInA6bGFzdCIpIHdvbid0IHJldHVybiB0cnVlIGZvciBhIGRvYyB3aXRoIHR3byAicCIuCgkJCQlybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICkgPwoJCQkJCWpRdWVyeSggc2VsZWN0b3IsIHRoaXMuY29udGV4dCApLmluZGV4KCB0aGlzWzBdICkgPj0gMCA6CgkJCQkJalF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIHRoaXMgKS5sZW5ndGggPiAwIDoKCQkJCXRoaXMuZmlsdGVyKCBzZWxlY3RvciApLmxlbmd0aCA+IDAgKTsKCX0sCgoJY2xvc2VzdDogZnVuY3Rpb24oIHNlbGVjdG9ycywgY29udGV4dCApIHsKCQl2YXIgY3VyLAoJCQlpID0gMCwKCQkJbCA9IHRoaXMubGVuZ3RoLAoJCQlyZXQgPSBbXSwKCQkJcG9zID0gcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvcnMgKSB8fCB0eXBlb2Ygc2VsZWN0b3JzICE9PSAic3RyaW5nIiA/CgkJCQlqUXVlcnkoIHNlbGVjdG9ycywgY29udGV4dCB8fCB0aGlzLmNvbnRleHQgKSA6CgkJCQkwOwoKCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCWN1ciA9IHRoaXNbaV07CgoJCQl3aGlsZSAoIGN1ciAmJiBjdXIub3duZXJEb2N1bWVudCAmJiBjdXIgIT09IGNvbnRleHQgJiYgY3VyLm5vZGVUeXBlICE9PSAxMSApIHsKCQkJCWlmICggcG9zID8gcG9zLmluZGV4KGN1cikgPiAtMSA6IGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvcihjdXIsIHNlbGVjdG9ycykgKSB7CgkJCQkJcmV0LnB1c2goIGN1ciApOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQkJY3VyID0gY3VyLnBhcmVudE5vZGU7CgkJCX0KCQl9CgoJCXJldCA9IHJldC5sZW5ndGggPiAxID8galF1ZXJ5LnVuaXF1ZSggcmV0ICkgOiByZXQ7CgoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0LCAiY2xvc2VzdCIsIHNlbGVjdG9ycyApOwoJfSwKCgkvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluCgkvLyB0aGUgbWF0Y2hlZCBzZXQgb2YgZWxlbWVudHMKCWluZGV4OiBmdW5jdGlvbiggZWxlbSApIHsKCgkJLy8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnQKCQlpZiAoICFlbGVtICkgewoJCQlyZXR1cm4gKCB0aGlzWzBdICYmIHRoaXNbMF0ucGFyZW50Tm9kZSApID8gdGhpcy5wcmV2QWxsKCkubGVuZ3RoIDogLTE7CgkJfQoKCQkvLyBpbmRleCBpbiBzZWxlY3RvcgoJCWlmICggdHlwZW9mIGVsZW0gPT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4galF1ZXJ5LmluQXJyYXkoIHRoaXNbMF0sIGpRdWVyeSggZWxlbSApICk7CgkJfQoKCQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKCQlyZXR1cm4galF1ZXJ5LmluQXJyYXkoCgkJCS8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZAoJCQllbGVtLmpxdWVyeSA/IGVsZW1bMF0gOiBlbGVtLCB0aGlzICk7Cgl9LAoKCWFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJCXZhciBzZXQgPSB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciID8KCQkJCWpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSA6CgkJCQlqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciAmJiBzZWxlY3Rvci5ub2RlVHlwZSA/IFsgc2VsZWN0b3IgXSA6IHNlbGVjdG9yICksCgkJCWFsbCA9IGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgc2V0ICk7CgoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggaXNEaXNjb25uZWN0ZWQoIHNldFswXSApIHx8IGlzRGlzY29ubmVjdGVkKCBhbGxbMF0gKSA/CgkJCWFsbCA6CgkJCWpRdWVyeS51bmlxdWUoIGFsbCApICk7Cgl9LAoKCWFkZEJhY2s6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1cm4gdGhpcy5hZGQoIHNlbGVjdG9yID09IG51bGwgPwoJCQl0aGlzLnByZXZPYmplY3QgOiB0aGlzLnByZXZPYmplY3QuZmlsdGVyKHNlbGVjdG9yKQoJCSk7Cgl9Cn0pOwoKalF1ZXJ5LmZuLmFuZFNlbGYgPSBqUXVlcnkuZm4uYWRkQmFjazsKCi8vIEEgcGFpbmZ1bGx5IHNpbXBsZSBjaGVjayB0byBzZWUgaWYgYW4gZWxlbWVudCBpcyBkaXNjb25uZWN0ZWQKLy8gZnJvbSBhIGRvY3VtZW50IChzaG91bGQgYmUgaW1wcm92ZWQsIHdoZXJlIGZlYXNpYmxlKS4KZnVuY3Rpb24gaXNEaXNjb25uZWN0ZWQoIG5vZGUgKSB7CglyZXR1cm4gIW5vZGUgfHwgIW5vZGUucGFyZW50Tm9kZSB8fCBub2RlLnBhcmVudE5vZGUubm9kZVR5cGUgPT09IDExOwp9CgpmdW5jdGlvbiBzaWJsaW5nKCBjdXIsIGRpciApIHsKCWRvIHsKCQljdXIgPSBjdXJbIGRpciBdOwoJfSB3aGlsZSAoIGN1ciAmJiBjdXIubm9kZVR5cGUgIT09IDEgKTsKCglyZXR1cm4gY3VyOwp9CgpqUXVlcnkuZWFjaCh7CglwYXJlbnQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7CgkJcmV0dXJuIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgIT09IDExID8gcGFyZW50IDogbnVsbDsKCX0sCglwYXJlbnRzOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInBhcmVudE5vZGUiICk7Cgl9LAoJcGFyZW50c1VudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7CgkJcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJwYXJlbnROb2RlIiwgdW50aWwgKTsKCX0sCgluZXh0OiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gc2libGluZyggZWxlbSwgIm5leHRTaWJsaW5nIiApOwoJfSwKCXByZXY6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBzaWJsaW5nKCBlbGVtLCAicHJldmlvdXNTaWJsaW5nIiApOwoJfSwKCW5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAibmV4dFNpYmxpbmciICk7Cgl9LAoJcHJldkFsbDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJwcmV2aW91c1NpYmxpbmciICk7Cgl9LAoJbmV4dFVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7CgkJcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJuZXh0U2libGluZyIsIHVudGlsICk7Cgl9LAoJcHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7CgkJcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJwcmV2aW91c1NpYmxpbmciLCB1bnRpbCApOwoJfSwKCXNpYmxpbmdzOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4galF1ZXJ5LnNpYmxpbmcoICggZWxlbS5wYXJlbnROb2RlIHx8IHt9ICkuZmlyc3RDaGlsZCwgZWxlbSApOwoJfSwKCWNoaWxkcmVuOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4galF1ZXJ5LnNpYmxpbmcoIGVsZW0uZmlyc3RDaGlsZCApOwoJfSwKCWNvbnRlbnRzOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4galF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiaWZyYW1lIiApID8KCQkJZWxlbS5jb250ZW50RG9jdW1lbnQgfHwgZWxlbS5jb250ZW50V2luZG93LmRvY3VtZW50IDoKCQkJalF1ZXJ5Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7Cgl9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBmbiApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGlsLCBzZWxlY3RvciApIHsKCQl2YXIgcmV0ID0galF1ZXJ5Lm1hcCggdGhpcywgZm4sIHVudGlsICk7CgoJCWlmICggIXJ1bnRpbC50ZXN0KCBuYW1lICkgKSB7CgkJCXNlbGVjdG9yID0gdW50aWw7CgkJfQoKCQlpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCXJldCA9IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCByZXQgKTsKCQl9CgoJCXJldCA9IHRoaXMubGVuZ3RoID4gMSAmJiAhZ3VhcmFudGVlZFVuaXF1ZVsgbmFtZSBdID8galF1ZXJ5LnVuaXF1ZSggcmV0ICkgOiByZXQ7CgoJCWlmICggdGhpcy5sZW5ndGggPiAxICYmIHJwYXJlbnRzcHJldi50ZXN0KCBuYW1lICkgKSB7CgkJCXJldCA9IHJldC5yZXZlcnNlKCk7CgkJfQoKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCwgbmFtZSwgY29yZV9zbGljZS5jYWxsKCBhcmd1bWVudHMgKS5qb2luKCIsIikgKTsKCX07Cn0pOwoKalF1ZXJ5LmV4dGVuZCh7CglmaWx0ZXI6IGZ1bmN0aW9uKCBleHByLCBlbGVtcywgbm90ICkgewoJCWlmICggbm90ICkgewoJCQlleHByID0gIjpub3QoIiArIGV4cHIgKyAiKSI7CgkJfQoKCQlyZXR1cm4gZWxlbXMubGVuZ3RoID09PSAxID8KCQkJalF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKGVsZW1zWzBdLCBleHByKSA/IFsgZWxlbXNbMF0gXSA6IFtdIDoKCQkJalF1ZXJ5LmZpbmQubWF0Y2hlcyhleHByLCBlbGVtcyk7Cgl9LAoKCWRpcjogZnVuY3Rpb24oIGVsZW0sIGRpciwgdW50aWwgKSB7CgkJdmFyIG1hdGNoZWQgPSBbXSwKCQkJY3VyID0gZWxlbVsgZGlyIF07CgoJCXdoaWxlICggY3VyICYmIGN1ci5ub2RlVHlwZSAhPT0gOSAmJiAodW50aWwgPT09IHVuZGVmaW5lZCB8fCBjdXIubm9kZVR5cGUgIT09IDEgfHwgIWpRdWVyeSggY3VyICkuaXMoIHVudGlsICkpICkgewoJCQlpZiAoIGN1ci5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCW1hdGNoZWQucHVzaCggY3VyICk7CgkJCX0KCQkJY3VyID0gY3VyW2Rpcl07CgkJfQoJCXJldHVybiBtYXRjaGVkOwoJfSwKCglzaWJsaW5nOiBmdW5jdGlvbiggbiwgZWxlbSApIHsKCQl2YXIgciA9IFtdOwoKCQlmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkgewoJCQlpZiAoIG4ubm9kZVR5cGUgPT09IDEgJiYgbiAhPT0gZWxlbSApIHsKCQkJCXIucHVzaCggbiApOwoJCQl9CgkJfQoKCQlyZXR1cm4gcjsKCX0KfSk7CgovLyBJbXBsZW1lbnQgdGhlIGlkZW50aWNhbCBmdW5jdGlvbmFsaXR5IGZvciBmaWx0ZXIgYW5kIG5vdApmdW5jdGlvbiB3aW5ub3coIGVsZW1lbnRzLCBxdWFsaWZpZXIsIGtlZXAgKSB7CgoJLy8gQ2FuJ3QgcGFzcyBudWxsIG9yIHVuZGVmaW5lZCB0byBpbmRleE9mIGluIEZpcmVmb3ggNAoJLy8gU2V0IHRvIDAgdG8gc2tpcCBzdHJpbmcgY2hlY2sKCXF1YWxpZmllciA9IHF1YWxpZmllciB8fCAwOwoKCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHF1YWxpZmllciApICkgewoJCXJldHVybiBqUXVlcnkuZ3JlcChlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7CgkJCXZhciByZXRWYWwgPSAhIXF1YWxpZmllci5jYWxsKCBlbGVtLCBpLCBlbGVtICk7CgkJCXJldHVybiByZXRWYWwgPT09IGtlZXA7CgkJfSk7CgoJfSBlbHNlIGlmICggcXVhbGlmaWVyLm5vZGVUeXBlICkgewoJCXJldHVybiBqUXVlcnkuZ3JlcChlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7CgkJCXJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApID09PSBrZWVwOwoJCX0pOwoKCX0gZWxzZSBpZiAoIHR5cGVvZiBxdWFsaWZpZXIgPT09ICJzdHJpbmciICkgewoJCXZhciBmaWx0ZXJlZCA9IGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDE7CgkJfSk7CgoJCWlmICggaXNTaW1wbGUudGVzdCggcXVhbGlmaWVyICkgKSB7CgkJCXJldHVybiBqUXVlcnkuZmlsdGVyKHF1YWxpZmllciwgZmlsdGVyZWQsICFrZWVwKTsKCQl9IGVsc2UgewoJCQlxdWFsaWZpZXIgPSBqUXVlcnkuZmlsdGVyKCBxdWFsaWZpZXIsIGZpbHRlcmVkICk7CgkJfQoJfQoKCXJldHVybiBqUXVlcnkuZ3JlcChlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7CgkJcmV0dXJuICggalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHF1YWxpZmllciApID49IDAgKSA9PT0ga2VlcDsKCX0pOwp9CmZ1bmN0aW9uIGNyZWF0ZVNhZmVGcmFnbWVudCggZG9jdW1lbnQgKSB7Cgl2YXIgbGlzdCA9IG5vZGVOYW1lcy5zcGxpdCggInwiICksCglzYWZlRnJhZyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKCglpZiAoIHNhZmVGcmFnLmNyZWF0ZUVsZW1lbnQgKSB7CgkJd2hpbGUgKCBsaXN0Lmxlbmd0aCApIHsKCQkJc2FmZUZyYWcuY3JlYXRlRWxlbWVudCgKCQkJCWxpc3QucG9wKCkKCQkJKTsKCQl9Cgl9CglyZXR1cm4gc2FmZUZyYWc7Cn0KCnZhciBub2RlTmFtZXMgPSAiYWJicnxhcnRpY2xlfGFzaWRlfGF1ZGlvfGJkaXxjYW52YXN8ZGF0YXxkYXRhbGlzdHxkZXRhaWxzfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnwiICsKCQkiaGVhZGVyfGhncm91cHxtYXJrfG1ldGVyfG5hdnxvdXRwdXR8cHJvZ3Jlc3N8c2VjdGlvbnxzdW1tYXJ5fHRpbWV8dmlkZW8iLAoJcmlubGluZWpRdWVyeSA9IC8galF1ZXJ5XGQrPSIoPzpudWxsfFxkKykiL2csCglybGVhZGluZ1doaXRlc3BhY2UgPSAvXlxzKy8sCglyeGh0bWxUYWcgPSAvPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2dpLAoJcnRhZ05hbWUgPSAvPChbXHc6XSspLywKCXJ0Ym9keSA9IC88dGJvZHkvaSwKCXJodG1sID0gLzx8JiM/XHcrOy8sCglybm9Jbm5lcmh0bWwgPSAvPCg/OnNjcmlwdHxzdHlsZXxsaW5rKS9pLAoJcm5vY2FjaGUgPSAvPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLAoJcm5vc2hpbWNhY2hlID0gbmV3IFJlZ0V4cCgiPCg/OiIgKyBub2RlTmFtZXMgKyAiKVtcXHMvPl0iLCAiaSIpLAoJcmNoZWNrYWJsZVR5cGUgPSAvXig/OmNoZWNrYm94fHJhZGlvKSQvLAoJLy8gY2hlY2tlZD0iY2hlY2tlZCIgb3IgY2hlY2tlZAoJcmNoZWNrZWQgPSAvY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSwKCXJzY3JpcHRUeXBlID0gL1wvKGphdmF8ZWNtYSlzY3JpcHQvaSwKCXJjbGVhblNjcmlwdCA9IC9eXHMqPCEoPzpcW0NEQVRBXFt8XC1cLSl8W1xdXC1dezJ9PlxzKiQvZywKCXdyYXBNYXAgPSB7CgkJb3B0aW9uOiBbIDEsICI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwgIjwvc2VsZWN0PiIgXSwKCQlsZWdlbmQ6IFsgMSwgIjxmaWVsZHNldD4iLCAiPC9maWVsZHNldD4iIF0sCgkJdGhlYWQ6IFsgMSwgIjx0YWJsZT4iLCAiPC90YWJsZT4iIF0sCgkJdHI6IFsgMiwgIjx0YWJsZT48dGJvZHk+IiwgIjwvdGJvZHk+PC90YWJsZT4iIF0sCgkJdGQ6IFsgMywgIjx0YWJsZT48dGJvZHk+PHRyPiIsICI8L3RyPjwvdGJvZHk+PC90YWJsZT4iIF0sCgkJY29sOiBbIDIsICI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsICI8L2NvbGdyb3VwPjwvdGFibGU+IiBdLAoJCWFyZWE6IFsgMSwgIjxtYXA+IiwgIjwvbWFwPiIgXSwKCQlfZGVmYXVsdDogWyAwLCAiIiwgIiIgXQoJfSwKCXNhZmVGcmFnbWVudCA9IGNyZWF0ZVNhZmVGcmFnbWVudCggZG9jdW1lbnQgKSwKCWZyYWdtZW50RGl2ID0gc2FmZUZyYWdtZW50LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSApOwoKd3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uOwp3cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkOwp3cmFwTWFwLnRoID0gd3JhcE1hcC50ZDsKCi8vIElFNi04IGNhbid0IHNlcmlhbGl6ZSBsaW5rLCBzY3JpcHQsIHN0eWxlLCBvciBhbnkgaHRtbDUgKE5vU2NvcGUpIHRhZ3MsCi8vIHVubGVzcyB3cmFwcGVkIGluIGEgZGl2IHdpdGggbm9uLWJyZWFraW5nIGNoYXJhY3RlcnMgaW4gZnJvbnQgb2YgaXQuCmlmICggIWpRdWVyeS5zdXBwb3J0Lmh0bWxTZXJpYWxpemUgKSB7Cgl3cmFwTWFwLl9kZWZhdWx0ID0gWyAxLCAiWDxkaXY+IiwgIjwvZGl2PiIgXTsKfQoKalF1ZXJ5LmZuLmV4dGVuZCh7Cgl0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPwoJCQkJalF1ZXJ5LnRleHQoIHRoaXMgKSA6CgkJCQl0aGlzLmVtcHR5KCkuYXBwZW5kKCAoIHRoaXNbMF0gJiYgdGhpc1swXS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50ICkuY3JlYXRlVGV4dE5vZGUoIHZhbHVlICkgKTsKCQl9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApOwoJfSwKCgl3cmFwQWxsOiBmdW5jdGlvbiggaHRtbCApIHsKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICkgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSkgewoJCQkJalF1ZXJ5KHRoaXMpLndyYXBBbGwoIGh0bWwuY2FsbCh0aGlzLCBpKSApOwoJCQl9KTsKCQl9CgoJCWlmICggdGhpc1swXSApIHsKCQkJLy8gVGhlIGVsZW1lbnRzIHRvIHdyYXAgdGhlIHRhcmdldCBhcm91bmQKCQkJdmFyIHdyYXAgPSBqUXVlcnkoIGh0bWwsIHRoaXNbMF0ub3duZXJEb2N1bWVudCApLmVxKDApLmNsb25lKHRydWUpOwoKCQkJaWYgKCB0aGlzWzBdLnBhcmVudE5vZGUgKSB7CgkJCQl3cmFwLmluc2VydEJlZm9yZSggdGhpc1swXSApOwoJCQl9CgoJCQl3cmFwLm1hcChmdW5jdGlvbigpIHsKCQkJCXZhciBlbGVtID0gdGhpczsKCgkJCQl3aGlsZSAoIGVsZW0uZmlyc3RDaGlsZCAmJiBlbGVtLmZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IDEgKSB7CgkJCQkJZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsKCQkJCX0KCgkJCQlyZXR1cm4gZWxlbTsKCQkJfSkuYXBwZW5kKCB0aGlzICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJd3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHsKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICkgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSkgewoJCQkJalF1ZXJ5KHRoaXMpLndyYXBJbm5lciggaHRtbC5jYWxsKHRoaXMsIGkpICk7CgkJCX0pOwoJCX0KCgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJdmFyIHNlbGYgPSBqUXVlcnkoIHRoaXMgKSwKCQkJCWNvbnRlbnRzID0gc2VsZi5jb250ZW50cygpOwoKCQkJaWYgKCBjb250ZW50cy5sZW5ndGggKSB7CgkJCQljb250ZW50cy53cmFwQWxsKCBodG1sICk7CgoJCQl9IGVsc2UgewoJCQkJc2VsZi5hcHBlbmQoIGh0bWwgKTsKCQkJfQoJCX0pOwoJfSwKCgl3cmFwOiBmdW5jdGlvbiggaHRtbCApIHsKCQl2YXIgaXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICk7CgoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSkgewoJCQlqUXVlcnkoIHRoaXMgKS53cmFwQWxsKCBpc0Z1bmN0aW9uID8gaHRtbC5jYWxsKHRoaXMsIGkpIDogaHRtbCApOwoJCX0pOwoJfSwKCgl1bndyYXA6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnBhcmVudCgpLmVhY2goZnVuY3Rpb24oKSB7CgkJCWlmICggIWpRdWVyeS5ub2RlTmFtZSggdGhpcywgImJvZHkiICkgKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS5yZXBsYWNlV2l0aCggdGhpcy5jaGlsZE5vZGVzICk7CgkJCX0KCQl9KS5lbmQoKTsKCX0sCgoJYXBwZW5kOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIHRydWUsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgKSB7CgkJCQl0aGlzLmFwcGVuZENoaWxkKCBlbGVtICk7CgkJCX0KCQl9KTsKCX0sCgoJcHJlcGVuZDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCB0cnVlLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExICkgewoJCQkJdGhpcy5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMuZmlyc3RDaGlsZCApOwoJCQl9CgkJfSk7Cgl9LAoKCWJlZm9yZTogZnVuY3Rpb24oKSB7CgkJaWYgKCAhaXNEaXNjb25uZWN0ZWQoIHRoaXNbMF0gKSApIHsKCQkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCBmYWxzZSwgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzICk7CgkJCX0pOwoJCX0KCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoICkgewoJCQl2YXIgc2V0ID0galF1ZXJ5LmNsZWFuKCBhcmd1bWVudHMgKTsKCQkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkubWVyZ2UoIHNldCwgdGhpcyApLCAiYmVmb3JlIiwgdGhpcy5zZWxlY3RvciApOwoJCX0KCX0sCgoJYWZ0ZXI6IGZ1bmN0aW9uKCkgewoJCWlmICggIWlzRGlzY29ubmVjdGVkKCB0aGlzWzBdICkgKSB7CgkJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgZmFsc2UsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcy5uZXh0U2libGluZyApOwoJCQl9KTsKCQl9CgoJCWlmICggYXJndW1lbnRzLmxlbmd0aCApIHsKCQkJdmFyIHNldCA9IGpRdWVyeS5jbGVhbiggYXJndW1lbnRzICk7CgkJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1lcmdlKCB0aGlzLCBzZXQgKSwgImFmdGVyIiwgdGhpcy5zZWxlY3RvciApOwoJCX0KCX0sCgoJLy8ga2VlcERhdGEgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LS1kbyBub3QgZG9jdW1lbnQKCXJlbW92ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCBrZWVwRGF0YSApIHsKCQl2YXIgZWxlbSwKCQkJaSA9IDA7CgoJCWZvciAoIDsgKGVsZW0gPSB0aGlzW2ldKSAhPSBudWxsOyBpKysgKSB7CgkJCWlmICggIXNlbGVjdG9yIHx8IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCBbIGVsZW0gXSApLmxlbmd0aCApIHsKCQkJCWlmICggIWtlZXBEYXRhICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgkJCQkJalF1ZXJ5LmNsZWFuRGF0YSggZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpICk7CgkJCQkJalF1ZXJ5LmNsZWFuRGF0YSggWyBlbGVtIF0gKTsKCQkJCX0KCgkJCQlpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHsKCQkJCQllbGVtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGVsZW0gKTsKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCWVtcHR5OiBmdW5jdGlvbigpIHsKCQl2YXIgZWxlbSwKCQkJaSA9IDA7CgoJCWZvciAoIDsgKGVsZW0gPSB0aGlzW2ldKSAhPSBudWxsOyBpKysgKSB7CgkJCS8vIFJlbW92ZSBlbGVtZW50IG5vZGVzIGFuZCBwcmV2ZW50IG1lbW9yeSBsZWFrcwoJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgkJCQlqUXVlcnkuY2xlYW5EYXRhKCBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikgKTsKCQkJfQoKCQkJLy8gUmVtb3ZlIGFueSByZW1haW5pbmcgbm9kZXMKCQkJd2hpbGUgKCBlbGVtLmZpcnN0Q2hpbGQgKSB7CgkJCQllbGVtLnJlbW92ZUNoaWxkKCBlbGVtLmZpcnN0Q2hpbGQgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCWNsb25lOiBmdW5jdGlvbiggZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7CgkJZGF0YUFuZEV2ZW50cyA9IGRhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGZhbHNlIDogZGF0YUFuZEV2ZW50czsKCQlkZWVwRGF0YUFuZEV2ZW50cyA9IGRlZXBEYXRhQW5kRXZlbnRzID09IG51bGwgPyBkYXRhQW5kRXZlbnRzIDogZGVlcERhdGFBbmRFdmVudHM7CgoJCXJldHVybiB0aGlzLm1hcCggZnVuY3Rpb24gKCkgewoJCQlyZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApOwoJCX0pOwoJfSwKCglodG1sOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQkJdmFyIGVsZW0gPSB0aGlzWzBdIHx8IHt9LAoJCQkJaSA9IDAsCgkJCQlsID0gdGhpcy5sZW5ndGg7CgoJCQlpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMSA/CgkJCQkJZWxlbS5pbm5lckhUTUwucmVwbGFjZSggcmlubGluZWpRdWVyeSwgIiIgKSA6CgkJCQkJdW5kZWZpbmVkOwoJCQl9CgoJCQkvLyBTZWUgaWYgd2UgY2FuIHRha2UgYSBzaG9ydGN1dCBhbmQganVzdCB1c2UgaW5uZXJIVE1MCgkJCWlmICggdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiAmJiAhcm5vSW5uZXJodG1sLnRlc3QoIHZhbHVlICkgJiYKCQkJCSggalF1ZXJ5LnN1cHBvcnQuaHRtbFNlcmlhbGl6ZSB8fCAhcm5vc2hpbWNhY2hlLnRlc3QoIHZhbHVlICkgICkgJiYKCQkJCSggalF1ZXJ5LnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2UgfHwgIXJsZWFkaW5nV2hpdGVzcGFjZS50ZXN0KCB2YWx1ZSApICkgJiYKCQkJCSF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyIiLCAiIl0gKVsxXS50b0xvd2VyQ2FzZSgpIF0gKSB7CgoJCQkJdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKCByeGh0bWxUYWcsICI8JDE+PC8kMj4iICk7CgoJCQkJdHJ5IHsKCQkJCQlmb3IgKDsgaSA8IGw7IGkrKyApIHsKCQkJCQkJLy8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzCgkJCQkJCWVsZW0gPSB0aGlzW2ldIHx8IHt9OwoJCQkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgkJCQkJCQlqUXVlcnkuY2xlYW5EYXRhKCBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCAiKiIgKSApOwoJCQkJCQkJZWxlbS5pbm5lckhUTUwgPSB2YWx1ZTsKCQkJCQkJfQoJCQkJCX0KCgkJCQkJZWxlbSA9IDA7CgoJCQkJLy8gSWYgdXNpbmcgaW5uZXJIVE1MIHRocm93cyBhbiBleGNlcHRpb24sIHVzZSB0aGUgZmFsbGJhY2sgbWV0aG9kCgkJCQl9IGNhdGNoKGUpIHt9CgkJCX0KCgkJCWlmICggZWxlbSApIHsKCQkJCXRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7CgkJCX0KCQl9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApOwoJfSwKCglyZXBsYWNlV2l0aDogZnVuY3Rpb24oIHZhbHVlICkgewoJCWlmICggIWlzRGlzY29ubmVjdGVkKCB0aGlzWzBdICkgKSB7CgkJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBlbGVtZW50cyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBET00gYmVmb3JlIHRoZXkgYXJlIGluc2VydGVkCgkJCS8vIHRoaXMgY2FuIGhlbHAgZml4IHJlcGxhY2luZyBhIHBhcmVudCB3aXRoIGNoaWxkIGVsZW1lbnRzCgkJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CgkJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpIHsKCQkJCQl2YXIgc2VsZiA9IGpRdWVyeSh0aGlzKSwgb2xkID0gc2VsZi5odG1sKCk7CgkJCQkJc2VsZi5yZXBsYWNlV2l0aCggdmFsdWUuY2FsbCggdGhpcywgaSwgb2xkICkgKTsKCQkJCX0pOwoJCQl9CgoJCQlpZiAoIHR5cGVvZiB2YWx1ZSAhPT0gInN0cmluZyIgKSB7CgkJCQl2YWx1ZSA9IGpRdWVyeSggdmFsdWUgKS5kZXRhY2goKTsKCQkJfQoKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCXZhciBuZXh0ID0gdGhpcy5uZXh0U2libGluZywKCQkJCQlwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CgoJCQkJalF1ZXJ5KCB0aGlzICkucmVtb3ZlKCk7CgoJCQkJaWYgKCBuZXh0ICkgewoJCQkJCWpRdWVyeShuZXh0KS5iZWZvcmUoIHZhbHVlICk7CgkJCQl9IGVsc2UgewoJCQkJCWpRdWVyeShwYXJlbnQpLmFwcGVuZCggdmFsdWUgKTsKCQkJCX0KCQkJfSk7CgkJfQoKCQlyZXR1cm4gdGhpcy5sZW5ndGggPwoJCQl0aGlzLnB1c2hTdGFjayggalF1ZXJ5KGpRdWVyeS5pc0Z1bmN0aW9uKHZhbHVlKSA/IHZhbHVlKCkgOiB2YWx1ZSksICJyZXBsYWNlV2l0aCIsIHZhbHVlICkgOgoJCQl0aGlzOwoJfSwKCglkZXRhY2g6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1cm4gdGhpcy5yZW1vdmUoIHNlbGVjdG9yLCB0cnVlICk7Cgl9LAoKCWRvbU1hbmlwOiBmdW5jdGlvbiggYXJncywgdGFibGUsIGNhbGxiYWNrICkgewoKCQkvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzCgkJYXJncyA9IFtdLmNvbmNhdC5hcHBseSggW10sIGFyZ3MgKTsKCgkJdmFyIHJlc3VsdHMsIGZpcnN0LCBmcmFnbWVudCwgaU5vQ2xvbmUsCgkJCWkgPSAwLAoJCQl2YWx1ZSA9IGFyZ3NbMF0sCgkJCXNjcmlwdHMgPSBbXSwKCQkJbCA9IHRoaXMubGVuZ3RoOwoKCQkvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXQKCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5jaGVja0Nsb25lICYmIGwgPiAxICYmIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYgcmNoZWNrZWQudGVzdCggdmFsdWUgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCWpRdWVyeSh0aGlzKS5kb21NYW5pcCggYXJncywgdGFibGUsIGNhbGxiYWNrICk7CgkJCX0pOwoJCX0KCgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbih2YWx1ZSkgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSkgewoJCQkJdmFyIHNlbGYgPSBqUXVlcnkodGhpcyk7CgkJCQlhcmdzWzBdID0gdmFsdWUuY2FsbCggdGhpcywgaSwgdGFibGUgPyBzZWxmLmh0bWwoKSA6IHVuZGVmaW5lZCApOwoJCQkJc2VsZi5kb21NYW5pcCggYXJncywgdGFibGUsIGNhbGxiYWNrICk7CgkJCX0pOwoJCX0KCgkJaWYgKCB0aGlzWzBdICkgewoJCQlyZXN1bHRzID0galF1ZXJ5LmJ1aWxkRnJhZ21lbnQoIGFyZ3MsIHRoaXMsIHNjcmlwdHMgKTsKCQkJZnJhZ21lbnQgPSByZXN1bHRzLmZyYWdtZW50OwoJCQlmaXJzdCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7CgoJCQlpZiAoIGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAxICkgewoJCQkJZnJhZ21lbnQgPSBmaXJzdDsKCQkJfQoKCQkJaWYgKCBmaXJzdCApIHsKCQkJCXRhYmxlID0gdGFibGUgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBmaXJzdCwgInRyIiApOwoKCQkJCS8vIFVzZSB0aGUgb3JpZ2luYWwgZnJhZ21lbnQgZm9yIHRoZSBsYXN0IGl0ZW0gaW5zdGVhZCBvZiB0aGUgZmlyc3QgYmVjYXVzZSBpdCBjYW4gZW5kIHVwCgkJCQkvLyBiZWluZyBlbXB0aWVkIGluY29ycmVjdGx5IGluIGNlcnRhaW4gc2l0dWF0aW9ucyAoIzgwNzApLgoJCQkJLy8gRnJhZ21lbnRzIGZyb20gdGhlIGZyYWdtZW50IGNhY2hlIG11c3QgYWx3YXlzIGJlIGNsb25lZCBhbmQgbmV2ZXIgdXNlZCBpbiBwbGFjZS4KCQkJCWZvciAoIGlOb0Nsb25lID0gcmVzdWx0cy5jYWNoZWFibGUgfHwgbCAtIDE7IGkgPCBsOyBpKysgKSB7CgkJCQkJY2FsbGJhY2suY2FsbCgKCQkJCQkJdGFibGUgJiYgalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzW2ldLCAidGFibGUiICkgPwoJCQkJCQkJZmluZE9yQXBwZW5kKCB0aGlzW2ldLCAidGJvZHkiICkgOgoJCQkJCQkJdGhpc1tpXSwKCQkJCQkJaSA9PT0gaU5vQ2xvbmUgPwoJCQkJCQkJZnJhZ21lbnQgOgoJCQkJCQkJalF1ZXJ5LmNsb25lKCBmcmFnbWVudCwgdHJ1ZSwgdHJ1ZSApCgkJCQkJKTsKCQkJCX0KCQkJfQoKCQkJLy8gRml4ICMxMTgwOTogQXZvaWQgbGVha2luZyBtZW1vcnkKCQkJZnJhZ21lbnQgPSBmaXJzdCA9IG51bGw7CgoJCQlpZiAoIHNjcmlwdHMubGVuZ3RoICkgewoJCQkJalF1ZXJ5LmVhY2goIHNjcmlwdHMsIGZ1bmN0aW9uKCBpLCBlbGVtICkgewoJCQkJCWlmICggZWxlbS5zcmMgKSB7CgkJCQkJCWlmICggalF1ZXJ5LmFqYXggKSB7CgkJCQkJCQlqUXVlcnkuYWpheCh7CgkJCQkJCQkJdXJsOiBlbGVtLnNyYywKCQkJCQkJCQl0eXBlOiAiR0VUIiwKCQkJCQkJCQlkYXRhVHlwZTogInNjcmlwdCIsCgkJCQkJCQkJYXN5bmM6IGZhbHNlLAoJCQkJCQkJCWdsb2JhbDogZmFsc2UsCgkJCQkJCQkJInRocm93cyI6IHRydWUKCQkJCQkJCX0pOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJalF1ZXJ5LmVycm9yKCJubyBhamF4Iik7CgkJCQkJCX0KCQkJCQl9IGVsc2UgewoJCQkJCQlqUXVlcnkuZ2xvYmFsRXZhbCggKCBlbGVtLnRleHQgfHwgZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVySFRNTCB8fCAiIiApLnJlcGxhY2UoIHJjbGVhblNjcmlwdCwgIiIgKSApOwoJCQkJCX0KCgkJCQkJaWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7CgkJCQkJCWVsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZWxlbSApOwoJCQkJCX0KCQkJCX0pOwoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0KfSk7CgpmdW5jdGlvbiBmaW5kT3JBcHBlbmQoIGVsZW0sIHRhZyApIHsKCXJldHVybiBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKVswXSB8fCBlbGVtLmFwcGVuZENoaWxkKCBlbGVtLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCggdGFnICkgKTsKfQoKZnVuY3Rpb24gY2xvbmVDb3B5RXZlbnQoIHNyYywgZGVzdCApIHsKCglpZiAoIGRlc3Qubm9kZVR5cGUgIT09IDEgfHwgIWpRdWVyeS5oYXNEYXRhKCBzcmMgKSApIHsKCQlyZXR1cm47Cgl9CgoJdmFyIHR5cGUsIGksIGwsCgkJb2xkRGF0YSA9IGpRdWVyeS5fZGF0YSggc3JjICksCgkJY3VyRGF0YSA9IGpRdWVyeS5fZGF0YSggZGVzdCwgb2xkRGF0YSApLAoJCWV2ZW50cyA9IG9sZERhdGEuZXZlbnRzOwoKCWlmICggZXZlbnRzICkgewoJCWRlbGV0ZSBjdXJEYXRhLmhhbmRsZTsKCQljdXJEYXRhLmV2ZW50cyA9IHt9OwoKCQlmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKCQkJZm9yICggaSA9IDAsIGwgPSBldmVudHNbIHR5cGUgXS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQlqUXVlcnkuZXZlbnQuYWRkKCBkZXN0LCB0eXBlLCBldmVudHNbIHR5cGUgXVsgaSBdICk7CgkJCX0KCQl9Cgl9CgoJLy8gbWFrZSB0aGUgY2xvbmVkIHB1YmxpYyBkYXRhIG9iamVjdCBhIGNvcHkgZnJvbSB0aGUgb3JpZ2luYWwKCWlmICggY3VyRGF0YS5kYXRhICkgewoJCWN1ckRhdGEuZGF0YSA9IGpRdWVyeS5leHRlbmQoIHt9LCBjdXJEYXRhLmRhdGEgKTsKCX0KfQoKZnVuY3Rpb24gY2xvbmVGaXhBdHRyaWJ1dGVzKCBzcmMsIGRlc3QgKSB7Cgl2YXIgbm9kZU5hbWU7CgoJLy8gV2UgZG8gbm90IG5lZWQgdG8gZG8gYW55dGhpbmcgZm9yIG5vbi1FbGVtZW50cwoJaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkgewoJCXJldHVybjsKCX0KCgkvLyBjbGVhckF0dHJpYnV0ZXMgcmVtb3ZlcyB0aGUgYXR0cmlidXRlcywgd2hpY2ggd2UgZG9uJ3Qgd2FudCwKCS8vIGJ1dCBhbHNvIHJlbW92ZXMgdGhlIGF0dGFjaEV2ZW50IGV2ZW50cywgd2hpY2ggd2UgKmRvKiB3YW50CglpZiAoIGRlc3QuY2xlYXJBdHRyaWJ1dGVzICkgewoJCWRlc3QuY2xlYXJBdHRyaWJ1dGVzKCk7Cgl9CgoJLy8gbWVyZ2VBdHRyaWJ1dGVzLCBpbiBjb250cmFzdCwgb25seSBtZXJnZXMgYmFjayBvbiB0aGUKCS8vIG9yaWdpbmFsIGF0dHJpYnV0ZXMsIG5vdCB0aGUgZXZlbnRzCglpZiAoIGRlc3QubWVyZ2VBdHRyaWJ1dGVzICkgewoJCWRlc3QubWVyZ2VBdHRyaWJ1dGVzKCBzcmMgKTsKCX0KCglub2RlTmFtZSA9IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCglpZiAoIG5vZGVOYW1lID09PSAib2JqZWN0IiApIHsKCQkvLyBJRTYtMTAgaW1wcm9wZXJseSBjbG9uZXMgY2hpbGRyZW4gb2Ygb2JqZWN0IGVsZW1lbnRzIHVzaW5nIGNsYXNzaWQuCgkJLy8gSUUxMCB0aHJvd3MgTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyb3IgaWYgcGFyZW50IGlzIG51bGwsICMxMjEzMi4KCQlpZiAoIGRlc3QucGFyZW50Tm9kZSApIHsKCQkJZGVzdC5vdXRlckhUTUwgPSBzcmMub3V0ZXJIVE1MOwoJCX0KCgkJLy8gVGhpcyBwYXRoIGFwcGVhcnMgdW5hdm9pZGFibGUgZm9yIElFOS4gV2hlbiBjbG9uaW5nIGFuIG9iamVjdAoJCS8vIGVsZW1lbnQgaW4gSUU5LCB0aGUgb3V0ZXJIVE1MIHN0cmF0ZWd5IGFib3ZlIGlzIG5vdCBzdWZmaWNpZW50LgoJCS8vIElmIHRoZSBzcmMgaGFzIGlubmVySFRNTCBhbmQgdGhlIGRlc3RpbmF0aW9uIGRvZXMgbm90LAoJCS8vIGNvcHkgdGhlIHNyYy5pbm5lckhUTUwgaW50byB0aGUgZGVzdC5pbm5lckhUTUwuICMxMDMyNAoJCWlmICggalF1ZXJ5LnN1cHBvcnQuaHRtbDVDbG9uZSAmJiAoc3JjLmlubmVySFRNTCAmJiAhalF1ZXJ5LnRyaW0oZGVzdC5pbm5lckhUTUwpKSApIHsKCQkJZGVzdC5pbm5lckhUTUwgPSBzcmMuaW5uZXJIVE1MOwoJCX0KCgl9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gImlucHV0IiAmJiByY2hlY2thYmxlVHlwZS50ZXN0KCBzcmMudHlwZSApICkgewoJCS8vIElFNi04IGZhaWxzIHRvIHBlcnNpc3QgdGhlIGNoZWNrZWQgc3RhdGUgb2YgYSBjbG9uZWQgY2hlY2tib3gKCQkvLyBvciByYWRpbyBidXR0b24uIFdvcnNlLCBJRTYtNyBmYWlsIHRvIGdpdmUgdGhlIGNsb25lZCBlbGVtZW50CgkJLy8gYSBjaGVja2VkIGFwcGVhcmFuY2UgaWYgdGhlIGRlZmF1bHRDaGVja2VkIHZhbHVlIGlzbid0IGFsc28gc2V0CgoJCWRlc3QuZGVmYXVsdENoZWNrZWQgPSBkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDsKCgkJLy8gSUU2LTcgZ2V0IGNvbmZ1c2VkIGFuZCBlbmQgdXAgc2V0dGluZyB0aGUgdmFsdWUgb2YgYSBjbG9uZWQKCQkvLyBjaGVja2JveC9yYWRpbyBidXR0b24gdG8gYW4gZW1wdHkgc3RyaW5nIGluc3RlYWQgb2YgIm9uIgoJCWlmICggZGVzdC52YWx1ZSAhPT0gc3JjLnZhbHVlICkgewoJCQlkZXN0LnZhbHVlID0gc3JjLnZhbHVlOwoJCX0KCgkvLyBJRTYtOCBmYWlscyB0byByZXR1cm4gdGhlIHNlbGVjdGVkIG9wdGlvbiB0byB0aGUgZGVmYXVsdCBzZWxlY3RlZAoJLy8gc3RhdGUgd2hlbiBjbG9uaW5nIG9wdGlvbnMKCX0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSAib3B0aW9uIiApIHsKCQlkZXN0LnNlbGVjdGVkID0gc3JjLmRlZmF1bHRTZWxlY3RlZDsKCgkvLyBJRTYtOCBmYWlscyB0byBzZXQgdGhlIGRlZmF1bHRWYWx1ZSB0byB0aGUgY29ycmVjdCB2YWx1ZSB3aGVuCgkvLyBjbG9uaW5nIG90aGVyIHR5cGVzIG9mIGlucHV0IGZpZWxkcwoJfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgfHwgbm9kZU5hbWUgPT09ICJ0ZXh0YXJlYSIgKSB7CgkJZGVzdC5kZWZhdWx0VmFsdWUgPSBzcmMuZGVmYXVsdFZhbHVlOwoKCS8vIElFIGJsYW5rcyBjb250ZW50cyB3aGVuIGNsb25pbmcgc2NyaXB0cwoJfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJzY3JpcHQiICYmIGRlc3QudGV4dCAhPT0gc3JjLnRleHQgKSB7CgkJZGVzdC50ZXh0ID0gc3JjLnRleHQ7Cgl9CgoJLy8gRXZlbnQgZGF0YSBnZXRzIHJlZmVyZW5jZWQgaW5zdGVhZCBvZiBjb3BpZWQgaWYgdGhlIGV4cGFuZG8KCS8vIGdldHMgY29waWVkIHRvbwoJZGVzdC5yZW1vdmVBdHRyaWJ1dGUoIGpRdWVyeS5leHBhbmRvICk7Cn0KCmpRdWVyeS5idWlsZEZyYWdtZW50ID0gZnVuY3Rpb24oIGFyZ3MsIGNvbnRleHQsIHNjcmlwdHMgKSB7Cgl2YXIgZnJhZ21lbnQsIGNhY2hlYWJsZSwgY2FjaGVoaXQsCgkJZmlyc3QgPSBhcmdzWyAwIF07CgoJLy8gU2V0IGNvbnRleHQgZnJvbSB3aGF0IG1heSBjb21lIGluIGFzIHVuZGVmaW5lZCBvciBhIGpRdWVyeSBjb2xsZWN0aW9uIG9yIGEgbm9kZQoJLy8gVXBkYXRlZCB0byBmaXggIzEyMjY2IHdoZXJlIGFjY2Vzc2luZyBjb250ZXh0WzBdIGNvdWxkIHRocm93IGFuIGV4Y2VwdGlvbiBpbiBJRTkvMTAgJgoJLy8gYWxzbyBkb3VibGVzIGFzIGZpeCBmb3IgIzg5NTAgd2hlcmUgcGxhaW4gb2JqZWN0cyBjYXVzZWQgY3JlYXRlRG9jdW1lbnRGcmFnbWVudCBleGNlcHRpb24KCWNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50OwoJY29udGV4dCA9ICFjb250ZXh0Lm5vZGVUeXBlICYmIGNvbnRleHRbMF0gfHwgY29udGV4dDsKCWNvbnRleHQgPSBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dDsKCgkvLyBPbmx5IGNhY2hlICJzbWFsbCIgKDEvMiBLQikgSFRNTCBzdHJpbmdzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWFpbiBkb2N1bWVudAoJLy8gQ2xvbmluZyBvcHRpb25zIGxvc2VzIHRoZSBzZWxlY3RlZCBzdGF0ZSwgc28gZG9uJ3QgY2FjaGUgdGhlbQoJLy8gSUUgNiBkb2Vzbid0IGxpa2UgaXQgd2hlbiB5b3UgcHV0IDxvYmplY3Q+IG9yIDxlbWJlZD4gZWxlbWVudHMgaW4gYSBmcmFnbWVudAoJLy8gQWxzbywgV2ViS2l0IGRvZXMgbm90IGNsb25lICdjaGVja2VkJyBhdHRyaWJ1dGVzIG9uIGNsb25lTm9kZSwgc28gZG9uJ3QgY2FjaGUKCS8vIExhc3RseSwgSUU2LDcsOCB3aWxsIG5vdCBjb3JyZWN0bHkgcmV1c2UgY2FjaGVkIGZyYWdtZW50cyB0aGF0IHdlcmUgY3JlYXRlZCBmcm9tIHVua25vd24gZWxlbXMgIzEwNTAxCglpZiAoIGFyZ3MubGVuZ3RoID09PSAxICYmIHR5cGVvZiBmaXJzdCA9PT0gInN0cmluZyIgJiYgZmlyc3QubGVuZ3RoIDwgNTEyICYmIGNvbnRleHQgPT09IGRvY3VtZW50ICYmCgkJZmlyc3QuY2hhckF0KDApID09PSAiPCIgJiYgIXJub2NhY2hlLnRlc3QoIGZpcnN0ICkgJiYKCQkoalF1ZXJ5LnN1cHBvcnQuY2hlY2tDbG9uZSB8fCAhcmNoZWNrZWQudGVzdCggZmlyc3QgKSkgJiYKCQkoalF1ZXJ5LnN1cHBvcnQuaHRtbDVDbG9uZSB8fCAhcm5vc2hpbWNhY2hlLnRlc3QoIGZpcnN0ICkpICkgewoKCQkvLyBNYXJrIGNhY2hlYWJsZSBhbmQgbG9vayBmb3IgYSBoaXQKCQljYWNoZWFibGUgPSB0cnVlOwoJCWZyYWdtZW50ID0galF1ZXJ5LmZyYWdtZW50c1sgZmlyc3QgXTsKCQljYWNoZWhpdCA9IGZyYWdtZW50ICE9PSB1bmRlZmluZWQ7Cgl9CgoJaWYgKCAhZnJhZ21lbnQgKSB7CgkJZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKCQlqUXVlcnkuY2xlYW4oIGFyZ3MsIGNvbnRleHQsIGZyYWdtZW50LCBzY3JpcHRzICk7CgoJCS8vIFVwZGF0ZSB0aGUgY2FjaGUsIGJ1dCBvbmx5IHN0b3JlIGZhbHNlCgkJLy8gdW5sZXNzIHRoaXMgaXMgYSBzZWNvbmQgcGFyc2luZyBvZiB0aGUgc2FtZSBjb250ZW50CgkJaWYgKCBjYWNoZWFibGUgKSB7CgkJCWpRdWVyeS5mcmFnbWVudHNbIGZpcnN0IF0gPSBjYWNoZWhpdCAmJiBmcmFnbWVudDsKCQl9Cgl9CgoJcmV0dXJuIHsgZnJhZ21lbnQ6IGZyYWdtZW50LCBjYWNoZWFibGU6IGNhY2hlYWJsZSB9Owp9OwoKalF1ZXJ5LmZyYWdtZW50cyA9IHt9OwoKalF1ZXJ5LmVhY2goewoJYXBwZW5kVG86ICJhcHBlbmQiLAoJcHJlcGVuZFRvOiAicHJlcGVuZCIsCglpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAoJaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsCglyZXBsYWNlQWxsOiAicmVwbGFjZVdpdGgiCn0sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5hbCApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciBlbGVtcywKCQkJaSA9IDAsCgkJCXJldCA9IFtdLAoJCQlpbnNlcnQgPSBqUXVlcnkoIHNlbGVjdG9yICksCgkJCWwgPSBpbnNlcnQubGVuZ3RoLAoJCQlwYXJlbnQgPSB0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzWzBdLnBhcmVudE5vZGU7CgoJCWlmICggKHBhcmVudCA9PSBudWxsIHx8IHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgPT09IDExICYmIHBhcmVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSkgJiYgbCA9PT0gMSApIHsKCQkJaW5zZXJ0WyBvcmlnaW5hbCBdKCB0aGlzWzBdICk7CgkJCXJldHVybiB0aGlzOwoJCX0gZWxzZSB7CgkJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKCQkJCWVsZW1zID0gKCBpID4gMCA/IHRoaXMuY2xvbmUodHJ1ZSkgOiB0aGlzICkuZ2V0KCk7CgkJCQlqUXVlcnkoIGluc2VydFtpXSApWyBvcmlnaW5hbCBdKCBlbGVtcyApOwoJCQkJcmV0ID0gcmV0LmNvbmNhdCggZWxlbXMgKTsKCQkJfQoKCQkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQsIG5hbWUsIGluc2VydC5zZWxlY3RvciApOwoJCX0KCX07Cn0pOwoKZnVuY3Rpb24gZ2V0QWxsKCBlbGVtICkgewoJaWYgKCB0eXBlb2YgZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gInVuZGVmaW5lZCIgKSB7CgkJcmV0dXJuIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoICIqIiApOwoKCX0gZWxzZSBpZiAoIHR5cGVvZiBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwgIT09ICJ1bmRlZmluZWQiICkgewoJCXJldHVybiBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoICIqIiApOwoKCX0gZWxzZSB7CgkJcmV0dXJuIFtdOwoJfQp9CgovLyBVc2VkIGluIGNsZWFuLCBmaXhlcyB0aGUgZGVmYXVsdENoZWNrZWQgcHJvcGVydHkKZnVuY3Rpb24gZml4RGVmYXVsdENoZWNrZWQoIGVsZW0gKSB7CglpZiAoIHJjaGVja2FibGVUeXBlLnRlc3QoIGVsZW0udHlwZSApICkgewoJCWVsZW0uZGVmYXVsdENoZWNrZWQgPSBlbGVtLmNoZWNrZWQ7Cgl9Cn0KCmpRdWVyeS5leHRlbmQoewoJY2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQl2YXIgc3JjRWxlbWVudHMsCgkJCWRlc3RFbGVtZW50cywKCQkJaSwKCQkJY2xvbmU7CgoJCWlmICggalF1ZXJ5LnN1cHBvcnQuaHRtbDVDbG9uZSB8fCBqUXVlcnkuaXNYTUxEb2MoZWxlbSkgfHwgIXJub3NoaW1jYWNoZS50ZXN0KCAiPCIgKyBlbGVtLm5vZGVOYW1lICsgIj4iICkgKSB7CgkJCWNsb25lID0gZWxlbS5jbG9uZU5vZGUoIHRydWUgKTsKCgkJLy8gSUU8PTggZG9lcyBub3QgcHJvcGVybHkgY2xvbmUgZGV0YWNoZWQsIHVua25vd24gZWxlbWVudCBub2RlcwoJCX0gZWxzZSB7CgkJCWZyYWdtZW50RGl2LmlubmVySFRNTCA9IGVsZW0ub3V0ZXJIVE1MOwoJCQlmcmFnbWVudERpdi5yZW1vdmVDaGlsZCggY2xvbmUgPSBmcmFnbWVudERpdi5maXJzdENoaWxkICk7CgkJfQoKCQlpZiAoICghalF1ZXJ5LnN1cHBvcnQubm9DbG9uZUV2ZW50IHx8ICFqUXVlcnkuc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCkgJiYKCQkJCShlbGVtLm5vZGVUeXBlID09PSAxIHx8IGVsZW0ubm9kZVR5cGUgPT09IDExKSAmJiAhalF1ZXJ5LmlzWE1MRG9jKGVsZW0pICkgewoJCQkvLyBJRSBjb3BpZXMgZXZlbnRzIGJvdW5kIHZpYSBhdHRhY2hFdmVudCB3aGVuIHVzaW5nIGNsb25lTm9kZS4KCQkJLy8gQ2FsbGluZyBkZXRhY2hFdmVudCBvbiB0aGUgY2xvbmUgd2lsbCBhbHNvIHJlbW92ZSB0aGUgZXZlbnRzCgkJCS8vIGZyb20gdGhlIG9yaWdpbmFsLiBJbiBvcmRlciB0byBnZXQgYXJvdW5kIHRoaXMsIHdlIHVzZSBzb21lCgkJCS8vIHByb3ByaWV0YXJ5IG1ldGhvZHMgdG8gY2xlYXIgdGhlIGV2ZW50cy4gVGhhbmtzIHRvIE1vb1Rvb2xzCgkJCS8vIGd1eXMgZm9yIHRoaXMgaG90bmVzcy4KCgkJCWNsb25lRml4QXR0cmlidXRlcyggZWxlbSwgY2xvbmUgKTsKCgkJCS8vIFVzaW5nIFNpenpsZSBoZXJlIGlzIGNyYXp5IHNsb3csIHNvIHdlIHVzZSBnZXRFbGVtZW50c0J5VGFnTmFtZSBpbnN0ZWFkCgkJCXNyY0VsZW1lbnRzID0gZ2V0QWxsKCBlbGVtICk7CgkJCWRlc3RFbGVtZW50cyA9IGdldEFsbCggY2xvbmUgKTsKCgkJCS8vIFdlaXJkIGl0ZXJhdGlvbiBiZWNhdXNlIElFIHdpbGwgcmVwbGFjZSB0aGUgbGVuZ3RoIHByb3BlcnR5CgkJCS8vIHdpdGggYW4gZWxlbWVudCBpZiB5b3UgYXJlIGNsb25pbmcgdGhlIGJvZHkgYW5kIG9uZSBvZiB0aGUKCQkJLy8gZWxlbWVudHMgb24gdGhlIHBhZ2UgaGFzIGEgbmFtZSBvciBpZCBvZiAibGVuZ3RoIgoJCQlmb3IgKCBpID0gMDsgc3JjRWxlbWVudHNbaV07ICsraSApIHsKCQkJCS8vIEVuc3VyZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBub2RlIGlzIG5vdCBudWxsOyBGaXhlcyAjOTU4NwoJCQkJaWYgKCBkZXN0RWxlbWVudHNbaV0gKSB7CgkJCQkJY2xvbmVGaXhBdHRyaWJ1dGVzKCBzcmNFbGVtZW50c1tpXSwgZGVzdEVsZW1lbnRzW2ldICk7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIENvcHkgdGhlIGV2ZW50cyBmcm9tIHRoZSBvcmlnaW5hbCB0byB0aGUgY2xvbmUKCQlpZiAoIGRhdGFBbmRFdmVudHMgKSB7CgkJCWNsb25lQ29weUV2ZW50KCBlbGVtLCBjbG9uZSApOwoKCQkJaWYgKCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQkJCXNyY0VsZW1lbnRzID0gZ2V0QWxsKCBlbGVtICk7CgkJCQlkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lICk7CgoJCQkJZm9yICggaSA9IDA7IHNyY0VsZW1lbnRzW2ldOyArK2kgKSB7CgkJCQkJY2xvbmVDb3B5RXZlbnQoIHNyY0VsZW1lbnRzW2ldLCBkZXN0RWxlbWVudHNbaV0gKTsKCQkJCX0KCQkJfQoJCX0KCgkJc3JjRWxlbWVudHMgPSBkZXN0RWxlbWVudHMgPSBudWxsOwoKCQkvLyBSZXR1cm4gdGhlIGNsb25lZCBzZXQKCQlyZXR1cm4gY2xvbmU7Cgl9LAoKCWNsZWFuOiBmdW5jdGlvbiggZWxlbXMsIGNvbnRleHQsIGZyYWdtZW50LCBzY3JpcHRzICkgewoJCXZhciBpLCBqLCBlbGVtLCB0YWcsIHdyYXAsIGRlcHRoLCBkaXYsIGhhc0JvZHksIHRib2R5LCBsZW4sIGhhbmRsZVNjcmlwdCwganNUYWdzLAoJCQlzYWZlID0gY29udGV4dCA9PT0gZG9jdW1lbnQgJiYgc2FmZUZyYWdtZW50LAoJCQlyZXQgPSBbXTsKCgkJLy8gRW5zdXJlIHRoYXQgY29udGV4dCBpcyBhIGRvY3VtZW50CgkJaWYgKCAhY29udGV4dCB8fCB0eXBlb2YgY29udGV4dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50ID09PSAidW5kZWZpbmVkIiApIHsKCQkJY29udGV4dCA9IGRvY3VtZW50OwoJCX0KCgkJLy8gVXNlIHRoZSBhbHJlYWR5LWNyZWF0ZWQgc2FmZSBmcmFnbWVudCBpZiBjb250ZXh0IHBlcm1pdHMKCQlmb3IgKCBpID0gMDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQlpZiAoIHR5cGVvZiBlbGVtID09PSAibnVtYmVyIiApIHsKCQkJCWVsZW0gKz0gIiI7CgkJCX0KCgkJCWlmICggIWVsZW0gKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy8gQ29udmVydCBodG1sIHN0cmluZyBpbnRvIERPTSBub2RlcwoJCQlpZiAoIHR5cGVvZiBlbGVtID09PSAic3RyaW5nIiApIHsKCQkJCWlmICggIXJodG1sLnRlc3QoIGVsZW0gKSApIHsKCQkJCQllbGVtID0gY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApOwoJCQkJfSBlbHNlIHsKCQkJCQkvLyBFbnN1cmUgYSBzYWZlIGNvbnRhaW5lciBpbiB3aGljaCB0byByZW5kZXIgdGhlIGh0bWwKCQkJCQlzYWZlID0gc2FmZSB8fCBjcmVhdGVTYWZlRnJhZ21lbnQoIGNvbnRleHQgKTsKCQkJCQlkaXYgPSBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoJCQkJCXNhZmUuYXBwZW5kQ2hpbGQoIGRpdiApOwoKCQkJCQkvLyBGaXggIlhIVE1MIi1zdHlsZSB0YWdzIGluIGFsbCBicm93c2VycwoJCQkJCWVsZW0gPSBlbGVtLnJlcGxhY2UocnhodG1sVGFnLCAiPCQxPjwvJDI+Iik7CgoJCQkJCS8vIEdvIHRvIGh0bWwgYW5kIGJhY2ssIHRoZW4gcGVlbCBvZmYgZXh0cmEgd3JhcHBlcnMKCQkJCQl0YWcgPSAoIHJ0YWdOYW1lLmV4ZWMoIGVsZW0gKSB8fCBbIiIsICIiXSApWzFdLnRvTG93ZXJDYXNlKCk7CgkJCQkJd3JhcCA9IHdyYXBNYXBbIHRhZyBdIHx8IHdyYXBNYXAuX2RlZmF1bHQ7CgkJCQkJZGVwdGggPSB3cmFwWzBdOwoJCQkJCWRpdi5pbm5lckhUTUwgPSB3cmFwWzFdICsgZWxlbSArIHdyYXBbMl07CgoJCQkJCS8vIE1vdmUgdG8gdGhlIHJpZ2h0IGRlcHRoCgkJCQkJd2hpbGUgKCBkZXB0aC0tICkgewoJCQkJCQlkaXYgPSBkaXYubGFzdENoaWxkOwoJCQkJCX0KCgkJCQkJLy8gUmVtb3ZlIElFJ3MgYXV0b2luc2VydGVkIDx0Ym9keT4gZnJvbSB0YWJsZSBmcmFnbWVudHMKCQkJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC50Ym9keSApIHsKCgkJCQkJCS8vIFN0cmluZyB3YXMgYSA8dGFibGU+LCAqbWF5KiBoYXZlIHNwdXJpb3VzIDx0Ym9keT4KCQkJCQkJaGFzQm9keSA9IHJ0Ym9keS50ZXN0KGVsZW0pOwoJCQkJCQkJdGJvZHkgPSB0YWcgPT09ICJ0YWJsZSIgJiYgIWhhc0JvZHkgPwoJCQkJCQkJCWRpdi5maXJzdENoaWxkICYmIGRpdi5maXJzdENoaWxkLmNoaWxkTm9kZXMgOgoKCQkJCQkJCQkvLyBTdHJpbmcgd2FzIGEgYmFyZSA8dGhlYWQ+IG9yIDx0Zm9vdD4KCQkJCQkJCQl3cmFwWzFdID09PSAiPHRhYmxlPiIgJiYgIWhhc0JvZHkgPwoJCQkJCQkJCQlkaXYuY2hpbGROb2RlcyA6CgkJCQkJCQkJCVtdOwoKCQkJCQkJZm9yICggaiA9IHRib2R5Lmxlbmd0aCAtIDE7IGogPj0gMCA7IC0taiApIHsKCQkJCQkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0Ym9keVsgaiBdLCAidGJvZHkiICkgJiYgIXRib2R5WyBqIF0uY2hpbGROb2Rlcy5sZW5ndGggKSB7CgkJCQkJCQkJdGJvZHlbIGogXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0Ym9keVsgaiBdICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIElFIGNvbXBsZXRlbHkga2lsbHMgbGVhZGluZyB3aGl0ZXNwYWNlIHdoZW4gaW5uZXJIVE1MIGlzIHVzZWQKCQkJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSAmJiBybGVhZGluZ1doaXRlc3BhY2UudGVzdCggZWxlbSApICkgewoJCQkJCQlkaXYuaW5zZXJ0QmVmb3JlKCBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBybGVhZGluZ1doaXRlc3BhY2UuZXhlYyhlbGVtKVswXSApLCBkaXYuZmlyc3RDaGlsZCApOwoJCQkJCX0KCgkJCQkJZWxlbSA9IGRpdi5jaGlsZE5vZGVzOwoKCQkJCQkvLyBUYWtlIG91dCBvZiBmcmFnbWVudCBjb250YWluZXIgKHdlIG5lZWQgYSBmcmVzaCBkaXYgZWFjaCB0aW1lKQoJCQkJCWRpdi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBkaXYgKTsKCQkJCX0KCQkJfQoKCQkJaWYgKCBlbGVtLm5vZGVUeXBlICkgewoJCQkJcmV0LnB1c2goIGVsZW0gKTsKCQkJfSBlbHNlIHsKCQkJCWpRdWVyeS5tZXJnZSggcmV0LCBlbGVtICk7CgkJCX0KCQl9CgoJCS8vIEZpeCAjMTEzNTY6IENsZWFyIGVsZW1lbnRzIGZyb20gc2FmZUZyYWdtZW50CgkJaWYgKCBkaXYgKSB7CgkJCWVsZW0gPSBkaXYgPSBzYWZlID0gbnVsbDsKCQl9CgoJCS8vIFJlc2V0IGRlZmF1bHRDaGVja2VkIGZvciBhbnkgcmFkaW9zIGFuZCBjaGVja2JveGVzCgkJLy8gYWJvdXQgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIERPTSBpbiBJRSA2LzcgKCM4MDYwKQoJCWlmICggIWpRdWVyeS5zdXBwb3J0LmFwcGVuZENoZWNrZWQgKSB7CgkJCWZvciAoIGkgPSAwOyAoZWxlbSA9IHJldFtpXSkgIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJpbnB1dCIgKSApIHsKCQkJCQlmaXhEZWZhdWx0Q2hlY2tlZCggZWxlbSApOwoJCQkJfSBlbHNlIGlmICggdHlwZW9mIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCQkJCWpRdWVyeS5ncmVwKCBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLCBmaXhEZWZhdWx0Q2hlY2tlZCApOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBBcHBlbmQgZWxlbWVudHMgdG8gYSBwcm92aWRlZCBkb2N1bWVudCBmcmFnbWVudAoJCWlmICggZnJhZ21lbnQgKSB7CgkJCS8vIFNwZWNpYWwgaGFuZGxpbmcgb2YgZWFjaCBzY3JpcHQgZWxlbWVudAoJCQloYW5kbGVTY3JpcHQgPSBmdW5jdGlvbiggZWxlbSApIHsKCQkJCS8vIENoZWNrIGlmIHdlIGNvbnNpZGVyIGl0IGV4ZWN1dGFibGUKCQkJCWlmICggIWVsZW0udHlwZSB8fCByc2NyaXB0VHlwZS50ZXN0KCBlbGVtLnR5cGUgKSApIHsKCQkJCQkvLyBEZXRhY2ggdGhlIHNjcmlwdCBhbmQgc3RvcmUgaXQgaW4gdGhlIHNjcmlwdHMgYXJyYXkgKGlmIHByb3ZpZGVkKSBvciB0aGUgZnJhZ21lbnQKCQkJCQkvLyBSZXR1cm4gdHJ1dGh5IHRvIGluZGljYXRlIHRoYXQgaXQgaGFzIGJlZW4gaGFuZGxlZAoJCQkJCXJldHVybiBzY3JpcHRzID8KCQkJCQkJc2NyaXB0cy5wdXNoKCBlbGVtLnBhcmVudE5vZGUgPyBlbGVtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGVsZW0gKSA6IGVsZW0gKSA6CgkJCQkJCWZyYWdtZW50LmFwcGVuZENoaWxkKCBlbGVtICk7CgkJCQl9CgkJCX07CgoJCQlmb3IgKCBpID0gMDsgKGVsZW0gPSByZXRbaV0pICE9IG51bGw7IGkrKyApIHsKCQkJCS8vIENoZWNrIGlmIHdlJ3JlIGRvbmUgYWZ0ZXIgaGFuZGxpbmcgYW4gZXhlY3V0YWJsZSBzY3JpcHQKCQkJCWlmICggISggalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAic2NyaXB0IiApICYmIGhhbmRsZVNjcmlwdCggZWxlbSApICkgKSB7CgkJCQkJLy8gQXBwZW5kIHRvIGZyYWdtZW50IGFuZCBoYW5kbGUgZW1iZWRkZWQgc2NyaXB0cwoJCQkJCWZyYWdtZW50LmFwcGVuZENoaWxkKCBlbGVtICk7CgkJCQkJaWYgKCB0eXBlb2YgZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gInVuZGVmaW5lZCIgKSB7CgkJCQkJCS8vIGhhbmRsZVNjcmlwdCBhbHRlcnMgdGhlIERPTSwgc28gdXNlIGpRdWVyeS5tZXJnZSB0byBlbnN1cmUgc25hcHNob3QgaXRlcmF0aW9uCgkJCQkJCWpzVGFncyA9IGpRdWVyeS5ncmVwKCBqUXVlcnkubWVyZ2UoIFtdLCBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSApLCBoYW5kbGVTY3JpcHQgKTsKCgkJCQkJCS8vIFNwbGljZSB0aGUgc2NyaXB0cyBpbnRvIHJldCBhZnRlciB0aGVpciBmb3JtZXIgYW5jZXN0b3IgYW5kIGFkdmFuY2Ugb3VyIGluZGV4IGJleW9uZCB0aGVtCgkJCQkJCXJldC5zcGxpY2UuYXBwbHkoIHJldCwgW2kgKyAxLCAwXS5jb25jYXQoIGpzVGFncyApICk7CgkJCQkJCWkgKz0ganNUYWdzLmxlbmd0aDsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiByZXQ7Cgl9LAoKCWNsZWFuRGF0YTogZnVuY3Rpb24oIGVsZW1zLCAvKiBpbnRlcm5hbCAqLyBhY2NlcHREYXRhICkgewoJCXZhciBkYXRhLCBpZCwgZWxlbSwgdHlwZSwKCQkJaSA9IDAsCgkJCWludGVybmFsS2V5ID0galF1ZXJ5LmV4cGFuZG8sCgkJCWNhY2hlID0galF1ZXJ5LmNhY2hlLAoJCQlkZWxldGVFeHBhbmRvID0galF1ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbywKCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsOwoKCQlmb3IgKCA7IChlbGVtID0gZWxlbXNbaV0pICE9IG51bGw7IGkrKyApIHsKCgkJCWlmICggYWNjZXB0RGF0YSB8fCBqUXVlcnkuYWNjZXB0RGF0YSggZWxlbSApICkgewoKCQkJCWlkID0gZWxlbVsgaW50ZXJuYWxLZXkgXTsKCQkJCWRhdGEgPSBpZCAmJiBjYWNoZVsgaWQgXTsKCgkJCQlpZiAoIGRhdGEgKSB7CgkJCQkJaWYgKCBkYXRhLmV2ZW50cyApIHsKCQkJCQkJZm9yICggdHlwZSBpbiBkYXRhLmV2ZW50cyApIHsKCQkJCQkJCWlmICggc3BlY2lhbFsgdHlwZSBdICkgewoJCQkJCQkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKTsKCgkJCQkJCQkvLyBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYXZvaWQgalF1ZXJ5LmV2ZW50LnJlbW92ZSdzIG92ZXJoZWFkCgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCWpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZGF0YS5oYW5kbGUgKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCgkJCQkJLy8gUmVtb3ZlIGNhY2hlIG9ubHkgaWYgaXQgd2FzIG5vdCBhbHJlYWR5IHJlbW92ZWQgYnkgalF1ZXJ5LmV2ZW50LnJlbW92ZQoJCQkJCWlmICggY2FjaGVbIGlkIF0gKSB7CgoJCQkJCQlkZWxldGUgY2FjaGVbIGlkIF07CgoJCQkJCQkvLyBJRSBkb2VzIG5vdCBhbGxvdyB1cyB0byBkZWxldGUgZXhwYW5kbyBwcm9wZXJ0aWVzIGZyb20gbm9kZXMsCgkJCQkJCS8vIG5vciBkb2VzIGl0IGhhdmUgYSByZW1vdmVBdHRyaWJ1dGUgZnVuY3Rpb24gb24gRG9jdW1lbnQgbm9kZXM7CgkJCQkJCS8vIHdlIG11c3QgaGFuZGxlIGFsbCBvZiB0aGVzZSBjYXNlcwoJCQkJCQlpZiAoIGRlbGV0ZUV4cGFuZG8gKSB7CgkJCQkJCQlkZWxldGUgZWxlbVsgaW50ZXJuYWxLZXkgXTsKCgkJCQkJCX0gZWxzZSBpZiAoIGVsZW0ucmVtb3ZlQXR0cmlidXRlICkgewoJCQkJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIGludGVybmFsS2V5ICk7CgoJCQkJCQl9IGVsc2UgewoJCQkJCQkJZWxlbVsgaW50ZXJuYWxLZXkgXSA9IG51bGw7CgkJCQkJCX0KCgkJCQkJCWpRdWVyeS5kZWxldGVkSWRzLnB1c2goIGlkICk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQp9KTsKLy8gTGltaXQgc2NvcGUgcG9sbHV0aW9uIGZyb20gYW55IGRlcHJlY2F0ZWQgQVBJCihmdW5jdGlvbigpIHsKCnZhciBtYXRjaGVkLCBicm93c2VyOwoKLy8gVXNlIG9mIGpRdWVyeS5icm93c2VyIGlzIGZyb3duZWQgdXBvbi4KLy8gTW9yZSBkZXRhaWxzOiBodHRwOi8vYXBpLmpxdWVyeS5jb20valF1ZXJ5LmJyb3dzZXIKLy8galF1ZXJ5LnVhTWF0Y2ggbWFpbnRhaW5lZCBmb3IgYmFjay1jb21wYXQKalF1ZXJ5LnVhTWF0Y2ggPSBmdW5jdGlvbiggdWEgKSB7Cgl1YSA9IHVhLnRvTG93ZXJDYXNlKCk7CgoJdmFyIG1hdGNoID0gLyhjaHJvbWUpWyBcL10oW1x3Ll0rKS8uZXhlYyggdWEgKSB8fAoJCS8od2Via2l0KVsgXC9dKFtcdy5dKykvLmV4ZWMoIHVhICkgfHwKCQkvKG9wZXJhKSg/Oi4qdmVyc2lvbnwpWyBcL10oW1x3Ll0rKS8uZXhlYyggdWEgKSB8fAoJCS8obXNpZSkgKFtcdy5dKykvLmV4ZWMoIHVhICkgfHwKCQl1YS5pbmRleE9mKCJjb21wYXRpYmxlIikgPCAwICYmIC8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKyl8KS8uZXhlYyggdWEgKSB8fAoJCVtdOwoKCXJldHVybiB7CgkJYnJvd3NlcjogbWF0Y2hbIDEgXSB8fCAiIiwKCQl2ZXJzaW9uOiBtYXRjaFsgMiBdIHx8ICIwIgoJfTsKfTsKCm1hdGNoZWQgPSBqUXVlcnkudWFNYXRjaCggbmF2aWdhdG9yLnVzZXJBZ2VudCApOwpicm93c2VyID0ge307CgppZiAoIG1hdGNoZWQuYnJvd3NlciApIHsKCWJyb3dzZXJbIG1hdGNoZWQuYnJvd3NlciBdID0gdHJ1ZTsKCWJyb3dzZXIudmVyc2lvbiA9IG1hdGNoZWQudmVyc2lvbjsKfQoKLy8gQ2hyb21lIGlzIFdlYmtpdCwgYnV0IFdlYmtpdCBpcyBhbHNvIFNhZmFyaS4KaWYgKCBicm93c2VyLmNocm9tZSApIHsKCWJyb3dzZXIud2Via2l0ID0gdHJ1ZTsKfSBlbHNlIGlmICggYnJvd3Nlci53ZWJraXQgKSB7Cglicm93c2VyLnNhZmFyaSA9IHRydWU7Cn0KCmpRdWVyeS5icm93c2VyID0gYnJvd3NlcjsKCmpRdWVyeS5zdWIgPSBmdW5jdGlvbigpIHsKCWZ1bmN0aW9uIGpRdWVyeVN1Yiggc2VsZWN0b3IsIGNvbnRleHQgKSB7CgkJcmV0dXJuIG5ldyBqUXVlcnlTdWIuZm4uaW5pdCggc2VsZWN0b3IsIGNvbnRleHQgKTsKCX0KCWpRdWVyeS5leHRlbmQoIHRydWUsIGpRdWVyeVN1YiwgdGhpcyApOwoJalF1ZXJ5U3ViLnN1cGVyY2xhc3MgPSB0aGlzOwoJalF1ZXJ5U3ViLmZuID0galF1ZXJ5U3ViLnByb3RvdHlwZSA9IHRoaXMoKTsKCWpRdWVyeVN1Yi5mbi5jb25zdHJ1Y3RvciA9IGpRdWVyeVN1YjsKCWpRdWVyeVN1Yi5zdWIgPSB0aGlzLnN1YjsKCWpRdWVyeVN1Yi5mbi5pbml0ID0gZnVuY3Rpb24gaW5pdCggc2VsZWN0b3IsIGNvbnRleHQgKSB7CgkJaWYgKCBjb250ZXh0ICYmIGNvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgJiYgIShjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5U3ViKSApIHsKCQkJY29udGV4dCA9IGpRdWVyeVN1YiggY29udGV4dCApOwoJCX0KCgkJcmV0dXJuIGpRdWVyeS5mbi5pbml0LmNhbGwoIHRoaXMsIHNlbGVjdG9yLCBjb250ZXh0LCByb290alF1ZXJ5U3ViICk7Cgl9OwoJalF1ZXJ5U3ViLmZuLmluaXQucHJvdG90eXBlID0galF1ZXJ5U3ViLmZuOwoJdmFyIHJvb3RqUXVlcnlTdWIgPSBqUXVlcnlTdWIoZG9jdW1lbnQpOwoJcmV0dXJuIGpRdWVyeVN1YjsKfTsKCn0pKCk7CnZhciBjdXJDU1MsIGlmcmFtZSwgaWZyYW1lRG9jLAoJcmFscGhhID0gL2FscGhhXChbXildKlwpL2ksCglyb3BhY2l0eSA9IC9vcGFjaXR5PShbXildKikvLAoJcnBvc2l0aW9uID0gL14odG9wfHJpZ2h0fGJvdHRvbXxsZWZ0KSQvLAoJLy8gc3dhcHBhYmxlIGlmIGRpc3BsYXkgaXMgbm9uZSBvciBzdGFydHMgd2l0aCB0YWJsZSBleGNlcHQgInRhYmxlIiwgInRhYmxlLWNlbGwiLCBvciAidGFibGUtY2FwdGlvbiIKCS8vIHNlZSBoZXJlIGZvciBkaXNwbGF5IHZhbHVlczogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9DU1MvZGlzcGxheQoJcmRpc3BsYXlzd2FwID0gL14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLAoJcm1hcmdpbiA9IC9ebWFyZ2luLywKCXJudW1zcGxpdCA9IG5ldyBSZWdFeHAoICJeKCIgKyBjb3JlX3BudW0gKyAiKSguKikkIiwgImkiICksCglybnVtbm9ucHggPSBuZXcgUmVnRXhwKCAiXigiICsgY29yZV9wbnVtICsgIikoPyFweClbYS16JV0rJCIsICJpIiApLAoJcnJlbE51bSA9IG5ldyBSZWdFeHAoICJeKFstK10pPSgiICsgY29yZV9wbnVtICsgIikiLCAiaSIgKSwKCWVsZW1kaXNwbGF5ID0ge30sCgoJY3NzU2hvdyA9IHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBkaXNwbGF5OiAiYmxvY2siIH0sCgljc3NOb3JtYWxUcmFuc2Zvcm0gPSB7CgkJbGV0dGVyU3BhY2luZzogMCwKCQlmb250V2VpZ2h0OiA0MDAKCX0sCgoJY3NzRXhwYW5kID0gWyAiVG9wIiwgIlJpZ2h0IiwgIkJvdHRvbSIsICJMZWZ0IiBdLAoJY3NzUHJlZml4ZXMgPSBbICJXZWJraXQiLCAiTyIsICJNb3oiLCAibXMiIF0sCgoJZXZlbnRzVG9nZ2xlID0galF1ZXJ5LmZuLnRvZ2dsZTsKCi8vIHJldHVybiBhIGNzcyBwcm9wZXJ0eSBtYXBwZWQgdG8gYSBwb3RlbnRpYWxseSB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHkKZnVuY3Rpb24gdmVuZG9yUHJvcE5hbWUoIHN0eWxlLCBuYW1lICkgewoKCS8vIHNob3J0Y3V0IGZvciBuYW1lcyB0aGF0IGFyZSBub3QgdmVuZG9yIHByZWZpeGVkCglpZiAoIG5hbWUgaW4gc3R5bGUgKSB7CgkJcmV0dXJuIG5hbWU7Cgl9CgoJLy8gY2hlY2sgZm9yIHZlbmRvciBwcmVmaXhlZCBuYW1lcwoJdmFyIGNhcE5hbWUgPSBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKSwKCQlvcmlnTmFtZSA9IG5hbWUsCgkJaSA9IGNzc1ByZWZpeGVzLmxlbmd0aDsKCgl3aGlsZSAoIGktLSApIHsKCQluYW1lID0gY3NzUHJlZml4ZXNbIGkgXSArIGNhcE5hbWU7CgkJaWYgKCBuYW1lIGluIHN0eWxlICkgewoJCQlyZXR1cm4gbmFtZTsKCQl9Cgl9CgoJcmV0dXJuIG9yaWdOYW1lOwp9CgpmdW5jdGlvbiBpc0hpZGRlbiggZWxlbSwgZWwgKSB7CgllbGVtID0gZWwgfHwgZWxlbTsKCXJldHVybiBqUXVlcnkuY3NzKCBlbGVtLCAiZGlzcGxheSIgKSA9PT0gIm5vbmUiIHx8ICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApOwp9CgpmdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7Cgl2YXIgZWxlbSwgZGlzcGxheSwKCQl2YWx1ZXMgPSBbXSwKCQlpbmRleCA9IDAsCgkJbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoOwoKCWZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7CgkJZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdOwoJCWlmICggIWVsZW0uc3R5bGUgKSB7CgkJCWNvbnRpbnVlOwoJCX0KCQl2YWx1ZXNbIGluZGV4IF0gPSBqUXVlcnkuX2RhdGEoIGVsZW0sICJvbGRkaXNwbGF5IiApOwoJCWlmICggc2hvdyApIHsKCQkJLy8gUmVzZXQgdGhlIGlubGluZSBkaXNwbGF5IG9mIHRoaXMgZWxlbWVudCB0byBsZWFybiBpZiBpdCBpcwoJCQkvLyBiZWluZyBoaWRkZW4gYnkgY2FzY2FkZWQgcnVsZXMgb3Igbm90CgkJCWlmICggIXZhbHVlc1sgaW5kZXggXSAmJiBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICJub25lIiApIHsKCQkJCWVsZW0uc3R5bGUuZGlzcGxheSA9ICIiOwoJCQl9CgoJCQkvLyBTZXQgZWxlbWVudHMgd2hpY2ggaGF2ZSBiZWVuIG92ZXJyaWRkZW4gd2l0aCBkaXNwbGF5OiBub25lCgkJCS8vIGluIGEgc3R5bGVzaGVldCB0byB3aGF0ZXZlciB0aGUgZGVmYXVsdCBicm93c2VyIHN0eWxlIGlzCgkJCS8vIGZvciBzdWNoIGFuIGVsZW1lbnQKCQkJaWYgKCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICYmIGlzSGlkZGVuKCBlbGVtICkgKSB7CgkJCQl2YWx1ZXNbIGluZGV4IF0gPSBqUXVlcnkuX2RhdGEoIGVsZW0sICJvbGRkaXNwbGF5IiwgY3NzX2RlZmF1bHREaXNwbGF5KGVsZW0ubm9kZU5hbWUpICk7CgkJCX0KCQl9IGVsc2UgewoJCQlkaXNwbGF5ID0gY3VyQ1NTKCBlbGVtLCAiZGlzcGxheSIgKTsKCgkJCWlmICggIXZhbHVlc1sgaW5kZXggXSAmJiBkaXNwbGF5ICE9PSAibm9uZSIgKSB7CgkJCQlqUXVlcnkuX2RhdGEoIGVsZW0sICJvbGRkaXNwbGF5IiwgZGlzcGxheSApOwoJCQl9CgkJfQoJfQoKCS8vIFNldCB0aGUgZGlzcGxheSBvZiBtb3N0IG9mIHRoZSBlbGVtZW50cyBpbiBhIHNlY29uZCBsb29wCgkvLyB0byBhdm9pZCB0aGUgY29uc3RhbnQgcmVmbG93Cglmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkgewoJCWVsZW0gPSBlbGVtZW50c1sgaW5kZXggXTsKCQlpZiAoICFlbGVtLnN0eWxlICkgewoJCQljb250aW51ZTsKCQl9CgkJaWYgKCAhc2hvdyB8fCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICJub25lIiB8fCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09ICIiICkgewoJCQllbGVtLnN0eWxlLmRpc3BsYXkgPSBzaG93ID8gdmFsdWVzWyBpbmRleCBdIHx8ICIiIDogIm5vbmUiOwoJCX0KCX0KCglyZXR1cm4gZWxlbWVudHM7Cn0KCmpRdWVyeS5mbi5leHRlbmQoewoJY3NzOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHsKCQkJcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPwoJCQkJalF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lLCB2YWx1ZSApIDoKCQkJCWpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTsKCQl9LCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTsKCX0sCglzaG93OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gc2hvd0hpZGUoIHRoaXMsIHRydWUgKTsKCX0sCgloaWRlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gc2hvd0hpZGUoIHRoaXMgKTsKCX0sCgl0b2dnbGU6IGZ1bmN0aW9uKCBzdGF0ZSwgZm4yICkgewoJCXZhciBib29sID0gdHlwZW9mIHN0YXRlID09PSAiYm9vbGVhbiI7CgoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHN0YXRlICkgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIGZuMiApICkgewoJCQlyZXR1cm4gZXZlbnRzVG9nZ2xlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQl9CgoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCWlmICggYm9vbCA/IHN0YXRlIDogaXNIaWRkZW4oIHRoaXMgKSApIHsKCQkJCWpRdWVyeSggdGhpcyApLnNob3coKTsKCQkJfSBlbHNlIHsKCQkJCWpRdWVyeSggdGhpcyApLmhpZGUoKTsKCQkJfQoJCX0pOwoJfQp9KTsKCmpRdWVyeS5leHRlbmQoewoJLy8gQWRkIGluIHN0eWxlIHByb3BlcnR5IGhvb2tzIGZvciBvdmVycmlkaW5nIHRoZSBkZWZhdWx0CgkvLyBiZWhhdmlvciBvZiBnZXR0aW5nIGFuZCBzZXR0aW5nIGEgc3R5bGUgcHJvcGVydHkKCWNzc0hvb2tzOiB7CgkJb3BhY2l0eTogewoJCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHsKCQkJCWlmICggY29tcHV0ZWQgKSB7CgkJCQkJLy8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHkKCQkJCQl2YXIgcmV0ID0gY3VyQ1NTKCBlbGVtLCAib3BhY2l0eSIgKTsKCQkJCQlyZXR1cm4gcmV0ID09PSAiIiA/ICIxIiA6IHJldDsKCgkJCQl9CgkJCX0KCQl9Cgl9LAoKCS8vIEV4Y2x1ZGUgdGhlIGZvbGxvd2luZyBjc3MgcHJvcGVydGllcyB0byBhZGQgcHgKCWNzc051bWJlcjogewoJCSJmaWxsT3BhY2l0eSI6IHRydWUsCgkJImZvbnRXZWlnaHQiOiB0cnVlLAoJCSJsaW5lSGVpZ2h0IjogdHJ1ZSwKCQkib3BhY2l0eSI6IHRydWUsCgkJIm9ycGhhbnMiOiB0cnVlLAoJCSJ3aWRvd3MiOiB0cnVlLAoJCSJ6SW5kZXgiOiB0cnVlLAoJCSJ6b29tIjogdHJ1ZQoJfSwKCgkvLyBBZGQgaW4gcHJvcGVydGllcyB3aG9zZSBuYW1lcyB5b3Ugd2lzaCB0byBmaXggYmVmb3JlCgkvLyBzZXR0aW5nIG9yIGdldHRpbmcgdGhlIHZhbHVlCgljc3NQcm9wczogewoJCS8vIG5vcm1hbGl6ZSBmbG9hdCBjc3MgcHJvcGVydHkKCQkiZmxvYXQiOiBqUXVlcnkuc3VwcG9ydC5jc3NGbG9hdCA/ICJjc3NGbG9hdCIgOiAic3R5bGVGbG9hdCIKCX0sCgoJLy8gR2V0IGFuZCBzZXQgdGhlIHN0eWxlIHByb3BlcnR5IG9uIGEgRE9NIE5vZGUKCXN0eWxlOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUsIGV4dHJhICkgewoJCS8vIERvbid0IHNldCBzdHlsZXMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwoJCWlmICggIWVsZW0gfHwgZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4IHx8ICFlbGVtLnN0eWxlICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUKCQl2YXIgcmV0LCB0eXBlLCBob29rcywKCQkJb3JpZ05hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICksCgkJCXN0eWxlID0gZWxlbS5zdHlsZTsKCgkJbmFtZSA9IGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSB8fCAoIGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSA9IHZlbmRvclByb3BOYW1lKCBzdHlsZSwgb3JpZ05hbWUgKSApOwoKCQkvLyBnZXRzIGhvb2sgZm9yIHRoZSBwcmVmaXhlZCB2ZXJzaW9uCgkJLy8gZm9sbG93ZWQgYnkgdGhlIHVucHJlZml4ZWQgdmVyc2lvbgoJCWhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdOwoKCQkvLyBDaGVjayBpZiB3ZSdyZSBzZXR0aW5nIGEgdmFsdWUKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCXR5cGUgPSB0eXBlb2YgdmFsdWU7CgoJCQkvLyBjb252ZXJ0IHJlbGF0aXZlIG51bWJlciBzdHJpbmdzICgrPSBvciAtPSkgdG8gcmVsYXRpdmUgbnVtYmVycy4gIzczNDUKCQkJaWYgKCB0eXBlID09PSAic3RyaW5nIiAmJiAocmV0ID0gcnJlbE51bS5leGVjKCB2YWx1ZSApKSApIHsKCQkJCXZhbHVlID0gKCByZXRbMV0gKyAxICkgKiByZXRbMl0gKyBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKCBlbGVtLCBuYW1lICkgKTsKCQkJCS8vIEZpeGVzIGJ1ZyAjOTIzNwoJCQkJdHlwZSA9ICJudW1iZXIiOwoJCQl9CgoJCQkvLyBNYWtlIHN1cmUgdGhhdCBOYU4gYW5kIG51bGwgdmFsdWVzIGFyZW4ndCBzZXQuIFNlZTogIzcxMTYKCQkJaWYgKCB2YWx1ZSA9PSBudWxsIHx8IHR5cGUgPT09ICJudW1iZXIiICYmIGlzTmFOKCB2YWx1ZSApICkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBJZiBhIG51bWJlciB3YXMgcGFzc2VkIGluLCBhZGQgJ3B4JyB0byB0aGUgKGV4Y2VwdCBmb3IgY2VydGFpbiBDU1MgcHJvcGVydGllcykKCQkJaWYgKCB0eXBlID09PSAibnVtYmVyIiAmJiAhalF1ZXJ5LmNzc051bWJlclsgb3JpZ05hbWUgXSApIHsKCQkJCXZhbHVlICs9ICJweCI7CgkJCX0KCgkJCS8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQsIHVzZSB0aGF0IHZhbHVlLCBvdGhlcndpc2UganVzdCBzZXQgdGhlIHNwZWNpZmllZCB2YWx1ZQoJCQlpZiAoICFob29rcyB8fCAhKCJzZXQiIGluIGhvb2tzKSB8fCAodmFsdWUgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBleHRyYSApKSAhPT0gdW5kZWZpbmVkICkgewoJCQkJLy8gV3JhcHBlZCB0byBwcmV2ZW50IElFIGZyb20gdGhyb3dpbmcgZXJyb3JzIHdoZW4gJ2ludmFsaWQnIHZhbHVlcyBhcmUgcHJvdmlkZWQKCQkJCS8vIEZpeGVzIGJ1ZyAjNTUwOQoJCQkJdHJ5IHsKCQkJCQlzdHlsZVsgbmFtZSBdID0gdmFsdWU7CgkJCQl9IGNhdGNoKGUpIHt9CgkJCX0KCgkJfSBlbHNlIHsKCQkJLy8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIG5vbi1jb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlCgkJCWlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkpICE9PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gcmV0OwoJCQl9CgoJCQkvLyBPdGhlcndpc2UganVzdCBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIHN0eWxlIG9iamVjdAoJCQlyZXR1cm4gc3R5bGVbIG5hbWUgXTsKCQl9Cgl9LAoKCWNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIG51bWVyaWMsIGV4dHJhICkgewoJCXZhciB2YWwsIG51bSwgaG9va3MsCgkJCW9yaWdOYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApOwoKCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUKCQluYW1lID0galF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8ICggalF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdID0gdmVuZG9yUHJvcE5hbWUoIGVsZW0uc3R5bGUsIG9yaWdOYW1lICkgKTsKCgkJLy8gZ2V0cyBob29rIGZvciB0aGUgcHJlZml4ZWQgdmVyc2lvbgoJCS8vIGZvbGxvd2VkIGJ5IHRoZSB1bnByZWZpeGVkIHZlcnNpb24KCQlob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTsKCgkJLy8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmUKCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICkgewoJCQl2YWwgPSBob29rcy5nZXQoIGVsZW0sIHRydWUsIGV4dHJhICk7CgkJfQoKCQkvLyBPdGhlcndpc2UsIGlmIGEgd2F5IHRvIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZXhpc3RzLCB1c2UgdGhhdAoJCWlmICggdmFsID09PSB1bmRlZmluZWQgKSB7CgkJCXZhbCA9IGN1ckNTUyggZWxlbSwgbmFtZSApOwoJCX0KCgkJLy9jb252ZXJ0ICJub3JtYWwiIHRvIGNvbXB1dGVkIHZhbHVlCgkJaWYgKCB2YWwgPT09ICJub3JtYWwiICYmIG5hbWUgaW4gY3NzTm9ybWFsVHJhbnNmb3JtICkgewoJCQl2YWwgPSBjc3NOb3JtYWxUcmFuc2Zvcm1bIG5hbWUgXTsKCQl9CgoJCS8vIFJldHVybiwgY29udmVydGluZyB0byBudW1iZXIgaWYgZm9yY2VkIG9yIGEgcXVhbGlmaWVyIHdhcyBwcm92aWRlZCBhbmQgdmFsIGxvb2tzIG51bWVyaWMKCQlpZiAoIG51bWVyaWMgfHwgZXh0cmEgIT09IHVuZGVmaW5lZCApIHsKCQkJbnVtID0gcGFyc2VGbG9hdCggdmFsICk7CgkJCXJldHVybiBudW1lcmljIHx8IGpRdWVyeS5pc051bWVyaWMoIG51bSApID8gbnVtIHx8IDAgOiB2YWw7CgkJfQoJCXJldHVybiB2YWw7Cgl9LAoKCS8vIEEgbWV0aG9kIGZvciBxdWlja2x5IHN3YXBwaW5nIGluL291dCBDU1MgcHJvcGVydGllcyB0byBnZXQgY29ycmVjdCBjYWxjdWxhdGlvbnMKCXN3YXA6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBjYWxsYmFjayApIHsKCQl2YXIgcmV0LCBuYW1lLAoJCQlvbGQgPSB7fTsKCgkJLy8gUmVtZW1iZXIgdGhlIG9sZCB2YWx1ZXMsIGFuZCBpbnNlcnQgdGhlIG5ldyBvbmVzCgkJZm9yICggbmFtZSBpbiBvcHRpb25zICkgewoJCQlvbGRbIG5hbWUgXSA9IGVsZW0uc3R5bGVbIG5hbWUgXTsKCQkJZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdOwoJCX0KCgkJcmV0ID0gY2FsbGJhY2suY2FsbCggZWxlbSApOwoKCQkvLyBSZXZlcnQgdGhlIG9sZCB2YWx1ZXMKCQlmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7CgkJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdOwoJCX0KCgkJcmV0dXJuIHJldDsKCX0KfSk7CgovLyBOT1RFOiBUbyBhbnkgZnV0dXJlIG1haW50YWluZXIsIHdlJ3ZlIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlCi8vIGJlY2F1c2UganNkb20gb24gbm9kZS5qcyB3aWxsIGJyZWFrIHdpdGhvdXQgaXQuCmlmICggd2luZG93LmdldENvbXB1dGVkU3R5bGUgKSB7CgljdXJDU1MgPSBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQl2YXIgcmV0LCB3aWR0aCwgbWluV2lkdGgsIG1heFdpZHRoLAoJCQljb21wdXRlZCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtLCBudWxsICksCgkJCXN0eWxlID0gZWxlbS5zdHlsZTsKCgkJaWYgKCBjb21wdXRlZCApIHsKCgkJCXJldCA9IGNvbXB1dGVkWyBuYW1lIF07CgkJCWlmICggcmV0ID09PSAiIiAmJiAhalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKSApIHsKCQkJCXJldCA9IGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSApOwoJCQl9CgoJCQkvLyBBIHRyaWJ1dGUgdG8gdGhlICJhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzIgoJCQkvLyBDaHJvbWUgPCAxNyBhbmQgU2FmYXJpIDUuMCB1c2VzICJjb21wdXRlZCB2YWx1ZSIgaW5zdGVhZCBvZiAidXNlZCB2YWx1ZSIgZm9yIG1hcmdpbi1yaWdodAoJCQkvLyBTYWZhcmkgNS4xLjcgKGF0IGxlYXN0KSByZXR1cm5zIHBlcmNlbnRhZ2UgZm9yIGEgbGFyZ2VyIHNldCBvZiB2YWx1ZXMsIGJ1dCB3aWR0aCBzZWVtcyB0byBiZSByZWxpYWJseSBwaXhlbHMKCQkJLy8gdGhpcyBpcyBhZ2FpbnN0IHRoZSBDU1NPTSBkcmFmdCBzcGVjOiBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3NvbS8jcmVzb2x2ZWQtdmFsdWVzCgkJCWlmICggcm51bW5vbnB4LnRlc3QoIHJldCApICYmIHJtYXJnaW4udGVzdCggbmFtZSApICkgewoJCQkJd2lkdGggPSBzdHlsZS53aWR0aDsKCQkJCW1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7CgkJCQltYXhXaWR0aCA9IHN0eWxlLm1heFdpZHRoOwoKCQkJCXN0eWxlLm1pbldpZHRoID0gc3R5bGUubWF4V2lkdGggPSBzdHlsZS53aWR0aCA9IHJldDsKCQkJCXJldCA9IGNvbXB1dGVkLndpZHRoOwoKCQkJCXN0eWxlLndpZHRoID0gd2lkdGg7CgkJCQlzdHlsZS5taW5XaWR0aCA9IG1pbldpZHRoOwoJCQkJc3R5bGUubWF4V2lkdGggPSBtYXhXaWR0aDsKCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX07Cn0gZWxzZSBpZiAoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jdXJyZW50U3R5bGUgKSB7CgljdXJDU1MgPSBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQl2YXIgbGVmdCwgcnNMZWZ0LAoJCQlyZXQgPSBlbGVtLmN1cnJlbnRTdHlsZSAmJiBlbGVtLmN1cnJlbnRTdHlsZVsgbmFtZSBdLAoJCQlzdHlsZSA9IGVsZW0uc3R5bGU7CgoJCS8vIEF2b2lkIHNldHRpbmcgcmV0IHRvIGVtcHR5IHN0cmluZyBoZXJlCgkJLy8gc28gd2UgZG9uJ3QgZGVmYXVsdCB0byBhdXRvCgkJaWYgKCByZXQgPT0gbnVsbCAmJiBzdHlsZSAmJiBzdHlsZVsgbmFtZSBdICkgewoJCQlyZXQgPSBzdHlsZVsgbmFtZSBdOwoJCX0KCgkJLy8gRnJvbSB0aGUgYXdlc29tZSBoYWNrIGJ5IERlYW4gRWR3YXJkcwoJCS8vIGh0dHA6Ly9lcmlrLmVhZS5uZXQvYXJjaGl2ZXMvMjAwNy8wNy8yNy8xOC41NC4xNS8jY29tbWVudC0xMDIyOTEKCgkJLy8gSWYgd2UncmUgbm90IGRlYWxpbmcgd2l0aCBhIHJlZ3VsYXIgcGl4ZWwgbnVtYmVyCgkJLy8gYnV0IGEgbnVtYmVyIHRoYXQgaGFzIGEgd2VpcmQgZW5kaW5nLCB3ZSBuZWVkIHRvIGNvbnZlcnQgaXQgdG8gcGl4ZWxzCgkJLy8gYnV0IG5vdCBwb3NpdGlvbiBjc3MgYXR0cmlidXRlcywgYXMgdGhvc2UgYXJlIHByb3BvcnRpb25hbCB0byB0aGUgcGFyZW50IGVsZW1lbnQgaW5zdGVhZAoJCS8vIGFuZCB3ZSBjYW4ndCBtZWFzdXJlIHRoZSBwYXJlbnQgaW5zdGVhZCBiZWNhdXNlIGl0IG1pZ2h0IHRyaWdnZXIgYSAic3RhY2tpbmcgZG9sbHMiIHByb2JsZW0KCQlpZiAoIHJudW1ub25weC50ZXN0KCByZXQgKSAmJiAhcnBvc2l0aW9uLnRlc3QoIG5hbWUgKSApIHsKCgkJCS8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXMKCQkJbGVmdCA9IHN0eWxlLmxlZnQ7CgkJCXJzTGVmdCA9IGVsZW0ucnVudGltZVN0eWxlICYmIGVsZW0ucnVudGltZVN0eWxlLmxlZnQ7CgoJCQkvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0CgkJCWlmICggcnNMZWZ0ICkgewoJCQkJZWxlbS5ydW50aW1lU3R5bGUubGVmdCA9IGVsZW0uY3VycmVudFN0eWxlLmxlZnQ7CgkJCX0KCQkJc3R5bGUubGVmdCA9IG5hbWUgPT09ICJmb250U2l6ZSIgPyAiMWVtIiA6IHJldDsKCQkJcmV0ID0gc3R5bGUucGl4ZWxMZWZ0ICsgInB4IjsKCgkJCS8vIFJldmVydCB0aGUgY2hhbmdlZCB2YWx1ZXMKCQkJc3R5bGUubGVmdCA9IGxlZnQ7CgkJCWlmICggcnNMZWZ0ICkgewoJCQkJZWxlbS5ydW50aW1lU3R5bGUubGVmdCA9IHJzTGVmdDsKCQkJfQoJCX0KCgkJcmV0dXJuIHJldCA9PT0gIiIgPyAiYXV0byIgOiByZXQ7Cgl9Owp9CgpmdW5jdGlvbiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICkgewoJdmFyIG1hdGNoZXMgPSBybnVtc3BsaXQuZXhlYyggdmFsdWUgKTsKCXJldHVybiBtYXRjaGVzID8KCQkJTWF0aC5tYXgoIDAsIG1hdGNoZXNbIDEgXSAtICggc3VidHJhY3QgfHwgMCApICkgKyAoIG1hdGNoZXNbIDIgXSB8fCAicHgiICkgOgoJCQl2YWx1ZTsKfQoKZnVuY3Rpb24gYXVnbWVudFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhLCBpc0JvcmRlckJveCApIHsKCXZhciBpID0gZXh0cmEgPT09ICggaXNCb3JkZXJCb3ggPyAiYm9yZGVyIiA6ICJjb250ZW50IiApID8KCQkvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIHJpZ2h0IG1lYXN1cmVtZW50LCBhdm9pZCBhdWdtZW50YXRpb24KCQk0IDoKCQkvLyBPdGhlcndpc2UgaW5pdGlhbGl6ZSBmb3IgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBwcm9wZXJ0aWVzCgkJbmFtZSA9PT0gIndpZHRoIiA/IDEgOiAwLAoKCQl2YWwgPSAwOwoKCWZvciAoIDsgaSA8IDQ7IGkgKz0gMiApIHsKCQkvLyBib3RoIGJveCBtb2RlbHMgZXhjbHVkZSBtYXJnaW4sIHNvIGFkZCBpdCBpZiB3ZSB3YW50IGl0CgkJaWYgKCBleHRyYSA9PT0gIm1hcmdpbiIgKSB7CgkJCS8vIHdlIHVzZSBqUXVlcnkuY3NzIGluc3RlYWQgb2YgY3VyQ1NTIGhlcmUKCQkJLy8gYmVjYXVzZSBvZiB0aGUgcmVsaWFibGVNYXJnaW5SaWdodCBDU1MgaG9vayEKCQkJdmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIGV4dHJhICsgY3NzRXhwYW5kWyBpIF0sIHRydWUgKTsKCQl9CgoJCS8vIEZyb20gdGhpcyBwb2ludCBvbiB3ZSB1c2UgY3VyQ1NTIGZvciBtYXhpbXVtIHBlcmZvcm1hbmNlIChyZWxldmFudCBpbiBhbmltYXRpb25zKQoJCWlmICggaXNCb3JkZXJCb3ggKSB7CgkJCS8vIGJvcmRlci1ib3ggaW5jbHVkZXMgcGFkZGluZywgc28gcmVtb3ZlIGl0IGlmIHdlIHdhbnQgY29udGVudAoJCQlpZiAoIGV4dHJhID09PSAiY29udGVudCIgKSB7CgkJCQl2YWwgLT0gcGFyc2VGbG9hdCggY3VyQ1NTKCBlbGVtLCAicGFkZGluZyIgKyBjc3NFeHBhbmRbIGkgXSApICkgfHwgMDsKCQkJfQoKCQkJLy8gYXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgYm9yZGVyIG5vciBtYXJnaW4sIHNvIHJlbW92ZSBib3JkZXIKCQkJaWYgKCBleHRyYSAhPT0gIm1hcmdpbiIgKSB7CgkJCQl2YWwgLT0gcGFyc2VGbG9hdCggY3VyQ1NTKCBlbGVtLCAiYm9yZGVyIiArIGNzc0V4cGFuZFsgaSBdICsgIldpZHRoIiApICkgfHwgMDsKCQkJfQoJCX0gZWxzZSB7CgkJCS8vIGF0IHRoaXMgcG9pbnQsIGV4dHJhIGlzbid0IGNvbnRlbnQsIHNvIGFkZCBwYWRkaW5nCgkJCXZhbCArPSBwYXJzZUZsb2F0KCBjdXJDU1MoIGVsZW0sICJwYWRkaW5nIiArIGNzc0V4cGFuZFsgaSBdICkgKSB8fCAwOwoKCQkJLy8gYXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgY29udGVudCBub3IgcGFkZGluZywgc28gYWRkIGJvcmRlcgoJCQlpZiAoIGV4dHJhICE9PSAicGFkZGluZyIgKSB7CgkJCQl2YWwgKz0gcGFyc2VGbG9hdCggY3VyQ1NTKCBlbGVtLCAiYm9yZGVyIiArIGNzc0V4cGFuZFsgaSBdICsgIldpZHRoIiApICkgfHwgMDsKCQkJfQoJCX0KCX0KCglyZXR1cm4gdmFsOwp9CgpmdW5jdGlvbiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSApIHsKCgkvLyBTdGFydCB3aXRoIG9mZnNldCBwcm9wZXJ0eSwgd2hpY2ggaXMgZXF1aXZhbGVudCB0byB0aGUgYm9yZGVyLWJveCB2YWx1ZQoJdmFyIHZhbCA9IG5hbWUgPT09ICJ3aWR0aCIgPyBlbGVtLm9mZnNldFdpZHRoIDogZWxlbS5vZmZzZXRIZWlnaHQsCgkJdmFsdWVJc0JvcmRlckJveCA9IHRydWUsCgkJaXNCb3JkZXJCb3ggPSBqUXVlcnkuc3VwcG9ydC5ib3hTaXppbmcgJiYgalF1ZXJ5LmNzcyggZWxlbSwgImJveFNpemluZyIgKSA9PT0gImJvcmRlci1ib3giOwoKCS8vIHNvbWUgbm9uLWh0bWwgZWxlbWVudHMgcmV0dXJuIHVuZGVmaW5lZCBmb3Igb2Zmc2V0V2lkdGgsIHNvIGNoZWNrIGZvciBudWxsL3VuZGVmaW5lZAoJLy8gc3ZnIC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjQ5Mjg1CgkvLyBNYXRoTUwgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD00OTE2NjgKCWlmICggdmFsIDw9IDAgfHwgdmFsID09IG51bGwgKSB7CgkJLy8gRmFsbCBiYWNrIHRvIGNvbXB1dGVkIHRoZW4gdW5jb21wdXRlZCBjc3MgaWYgbmVjZXNzYXJ5CgkJdmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lICk7CgkJaWYgKCB2YWwgPCAwIHx8IHZhbCA9PSBudWxsICkgewoJCQl2YWwgPSBlbGVtLnN0eWxlWyBuYW1lIF07CgkJfQoKCQkvLyBDb21wdXRlZCB1bml0IGlzIG5vdCBwaXhlbHMuIFN0b3AgaGVyZSBhbmQgcmV0dXJuLgoJCWlmICggcm51bW5vbnB4LnRlc3QodmFsKSApIHsKCQkJcmV0dXJuIHZhbDsKCQl9CgoJCS8vIHdlIG5lZWQgdGhlIGNoZWNrIGZvciBzdHlsZSBpbiBjYXNlIGEgYnJvd3NlciB3aGljaCByZXR1cm5zIHVucmVsaWFibGUgdmFsdWVzCgkJLy8gZm9yIGdldENvbXB1dGVkU3R5bGUgc2lsZW50bHkgZmFsbHMgYmFjayB0byB0aGUgcmVsaWFibGUgZWxlbS5zdHlsZQoJCXZhbHVlSXNCb3JkZXJCb3ggPSBpc0JvcmRlckJveCAmJiAoIGpRdWVyeS5zdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlIHx8IHZhbCA9PT0gZWxlbS5zdHlsZVsgbmFtZSBdICk7CgoJCS8vIE5vcm1hbGl6ZSAiIiwgYXV0bywgYW5kIHByZXBhcmUgZm9yIGV4dHJhCgkJdmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDsKCX0KCgkvLyB1c2UgdGhlIGFjdGl2ZSBib3gtc2l6aW5nIG1vZGVsIHRvIGFkZC9zdWJ0cmFjdCBpcnJlbGV2YW50IHN0eWxlcwoJcmV0dXJuICggdmFsICsKCQlhdWdtZW50V2lkdGhPckhlaWdodCgKCQkJZWxlbSwKCQkJbmFtZSwKCQkJZXh0cmEgfHwgKCBpc0JvcmRlckJveCA/ICJib3JkZXIiIDogImNvbnRlbnQiICksCgkJCXZhbHVlSXNCb3JkZXJCb3gKCQkpCgkpICsgInB4IjsKfQoKCi8vIFRyeSB0byBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgZGlzcGxheSB2YWx1ZSBvZiBhbiBlbGVtZW50CmZ1bmN0aW9uIGNzc19kZWZhdWx0RGlzcGxheSggbm9kZU5hbWUgKSB7CglpZiAoIGVsZW1kaXNwbGF5WyBub2RlTmFtZSBdICkgewoJCXJldHVybiBlbGVtZGlzcGxheVsgbm9kZU5hbWUgXTsKCX0KCgl2YXIgZWxlbSA9IGpRdWVyeSggIjwiICsgbm9kZU5hbWUgKyAiPiIgKS5hcHBlbmRUbyggZG9jdW1lbnQuYm9keSApLAoJCWRpc3BsYXkgPSBlbGVtLmNzcygiZGlzcGxheSIpOwoJZWxlbS5yZW1vdmUoKTsKCgkvLyBJZiB0aGUgc2ltcGxlIHdheSBmYWlscywKCS8vIGdldCBlbGVtZW50J3MgcmVhbCBkZWZhdWx0IGRpc3BsYXkgYnkgYXR0YWNoaW5nIGl0IHRvIGEgdGVtcCBpZnJhbWUKCWlmICggZGlzcGxheSA9PT0gIm5vbmUiIHx8IGRpc3BsYXkgPT09ICIiICkgewoJCS8vIFVzZSB0aGUgYWxyZWFkeS1jcmVhdGVkIGlmcmFtZSBpZiBwb3NzaWJsZQoJCWlmcmFtZSA9IGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoCgkJCWlmcmFtZSB8fCBqUXVlcnkuZXh0ZW5kKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKSwgewoJCQkJZnJhbWVCb3JkZXI6IDAsCgkJCQl3aWR0aDogMCwKCQkJCWhlaWdodDogMAoJCQl9KQoJCSk7CgoJCS8vIENyZWF0ZSBhIGNhY2hlYWJsZSBjb3B5IG9mIHRoZSBpZnJhbWUgZG9jdW1lbnQgb24gZmlyc3QgY2FsbC4KCQkvLyBJRSBhbmQgT3BlcmEgd2lsbCBhbGxvdyB1cyB0byByZXVzZSB0aGUgaWZyYW1lRG9jIHdpdGhvdXQgcmUtd3JpdGluZyB0aGUgZmFrZSBIVE1MCgkJLy8gZG9jdW1lbnQgdG8gaXQ7IFdlYktpdCAmIEZpcmVmb3ggd29uJ3QgYWxsb3cgcmV1c2luZyB0aGUgaWZyYW1lIGRvY3VtZW50LgoJCWlmICggIWlmcmFtZURvYyB8fCAhaWZyYW1lLmNyZWF0ZUVsZW1lbnQgKSB7CgkJCWlmcmFtZURvYyA9ICggaWZyYW1lLmNvbnRlbnRXaW5kb3cgfHwgaWZyYW1lLmNvbnRlbnREb2N1bWVudCApLmRvY3VtZW50OwoJCQlpZnJhbWVEb2Mud3JpdGUoIjwhZG9jdHlwZSBodG1sPjxodG1sPjxib2R5PiIpOwoJCQlpZnJhbWVEb2MuY2xvc2UoKTsKCQl9CgoJCWVsZW0gPSBpZnJhbWVEb2MuYm9keS5hcHBlbmRDaGlsZCggaWZyYW1lRG9jLmNyZWF0ZUVsZW1lbnQobm9kZU5hbWUpICk7CgoJCWRpc3BsYXkgPSBjdXJDU1MoIGVsZW0sICJkaXNwbGF5IiApOwoJCWRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoIGlmcmFtZSApOwoJfQoKCS8vIFN0b3JlIHRoZSBjb3JyZWN0IGRlZmF1bHQgZGlzcGxheQoJZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF0gPSBkaXNwbGF5OwoKCXJldHVybiBkaXNwbGF5Owp9CgpqUXVlcnkuZWFjaChbICJoZWlnaHQiLCAid2lkdGgiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgewoJalF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gPSB7CgkJZ2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQsIGV4dHJhICkgewoJCQlpZiAoIGNvbXB1dGVkICkgewoJCQkJLy8gY2VydGFpbiBlbGVtZW50cyBjYW4gaGF2ZSBkaW1lbnNpb24gaW5mbyBpZiB3ZSBpbnZpc2libHkgc2hvdyB0aGVtCgkJCQkvLyBob3dldmVyLCBpdCBtdXN0IGhhdmUgYSBjdXJyZW50IGRpc3BsYXkgc3R5bGUgdGhhdCB3b3VsZCBiZW5lZml0IGZyb20gdGhpcwoJCQkJaWYgKCBlbGVtLm9mZnNldFdpZHRoID09PSAwICYmIHJkaXNwbGF5c3dhcC50ZXN0KCBjdXJDU1MoIGVsZW0sICJkaXNwbGF5IiApICkgKSB7CgkJCQkJcmV0dXJuIGpRdWVyeS5zd2FwKCBlbGVtLCBjc3NTaG93LCBmdW5jdGlvbigpIHsKCQkJCQkJcmV0dXJuIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICk7CgkJCQkJfSk7CgkJCQl9IGVsc2UgewoJCQkJCXJldHVybiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSApOwoJCQkJfQoJCQl9CgkJfSwKCgkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIGV4dHJhICkgewoJCQlyZXR1cm4gc2V0UG9zaXRpdmVOdW1iZXIoIGVsZW0sIHZhbHVlLCBleHRyYSA/CgkJCQlhdWdtZW50V2lkdGhPckhlaWdodCgKCQkJCQllbGVtLAoJCQkJCW5hbWUsCgkJCQkJZXh0cmEsCgkJCQkJalF1ZXJ5LnN1cHBvcnQuYm94U2l6aW5nICYmIGpRdWVyeS5jc3MoIGVsZW0sICJib3hTaXppbmciICkgPT09ICJib3JkZXItYm94IgoJCQkJKSA6IDAKCQkJKTsKCQl9Cgl9Owp9KTsKCmlmICggIWpRdWVyeS5zdXBwb3J0Lm9wYWNpdHkgKSB7CglqUXVlcnkuY3NzSG9va3Mub3BhY2l0eSA9IHsKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHsKCQkJLy8gSUUgdXNlcyBmaWx0ZXJzIGZvciBvcGFjaXR5CgkJCXJldHVybiByb3BhY2l0eS50ZXN0KCAoY29tcHV0ZWQgJiYgZWxlbS5jdXJyZW50U3R5bGUgPyBlbGVtLmN1cnJlbnRTdHlsZS5maWx0ZXIgOiBlbGVtLnN0eWxlLmZpbHRlcikgfHwgIiIgKSA/CgkJCQkoIDAuMDEgKiBwYXJzZUZsb2F0KCBSZWdFeHAuJDEgKSApICsgIiIgOgoJCQkJY29tcHV0ZWQgPyAiMSIgOiAiIjsKCQl9LAoKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKCQkJdmFyIHN0eWxlID0gZWxlbS5zdHlsZSwKCQkJCWN1cnJlbnRTdHlsZSA9IGVsZW0uY3VycmVudFN0eWxlLAoJCQkJb3BhY2l0eSA9IGpRdWVyeS5pc051bWVyaWMoIHZhbHVlICkgPyAiYWxwaGEob3BhY2l0eT0iICsgdmFsdWUgKiAxMDAgKyAiKSIgOiAiIiwKCQkJCWZpbHRlciA9IGN1cnJlbnRTdHlsZSAmJiBjdXJyZW50U3R5bGUuZmlsdGVyIHx8IHN0eWxlLmZpbHRlciB8fCAiIjsKCgkJCS8vIElFIGhhcyB0cm91YmxlIHdpdGggb3BhY2l0eSBpZiBpdCBkb2VzIG5vdCBoYXZlIGxheW91dAoJCQkvLyBGb3JjZSBpdCBieSBzZXR0aW5nIHRoZSB6b29tIGxldmVsCgkJCXN0eWxlLnpvb20gPSAxOwoKCQkJLy8gaWYgc2V0dGluZyBvcGFjaXR5IHRvIDEsIGFuZCBubyBvdGhlciBmaWx0ZXJzIGV4aXN0IC0gYXR0ZW1wdCB0byByZW1vdmUgZmlsdGVyIGF0dHJpYnV0ZSAjNjY1MgoJCQlpZiAoIHZhbHVlID49IDEgJiYgalF1ZXJ5LnRyaW0oIGZpbHRlci5yZXBsYWNlKCByYWxwaGEsICIiICkgKSA9PT0gIiIgJiYKCQkJCXN0eWxlLnJlbW92ZUF0dHJpYnV0ZSApIHsKCgkJCQkvLyBTZXR0aW5nIHN0eWxlLmZpbHRlciB0byBudWxsLCAiIiAmICIgIiBzdGlsbCBsZWF2ZSAiZmlsdGVyOiIgaW4gdGhlIGNzc1RleHQKCQkJCS8vIGlmICJmaWx0ZXI6IiBpcyBwcmVzZW50IGF0IGFsbCwgY2xlYXJUeXBlIGlzIGRpc2FibGVkLCB3ZSB3YW50IHRvIGF2b2lkIHRoaXMKCQkJCS8vIHN0eWxlLnJlbW92ZUF0dHJpYnV0ZSBpcyBJRSBPbmx5LCBidXQgc28gYXBwYXJlbnRseSBpcyB0aGlzIGNvZGUgcGF0aC4uLgoJCQkJc3R5bGUucmVtb3ZlQXR0cmlidXRlKCAiZmlsdGVyIiApOwoKCQkJCS8vIGlmIHRoZXJlIHRoZXJlIGlzIG5vIGZpbHRlciBzdHlsZSBhcHBsaWVkIGluIGEgY3NzIHJ1bGUsIHdlIGFyZSBkb25lCgkJCQlpZiAoIGN1cnJlbnRTdHlsZSAmJiAhY3VycmVudFN0eWxlLmZpbHRlciApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCX0KCgkJCS8vIG90aGVyd2lzZSwgc2V0IG5ldyBmaWx0ZXIgdmFsdWVzCgkJCXN0eWxlLmZpbHRlciA9IHJhbHBoYS50ZXN0KCBmaWx0ZXIgKSA/CgkJCQlmaWx0ZXIucmVwbGFjZSggcmFscGhhLCBvcGFjaXR5ICkgOgoJCQkJZmlsdGVyICsgIiAiICsgb3BhY2l0eTsKCQl9Cgl9Owp9CgovLyBUaGVzZSBob29rcyBjYW5ub3QgYmUgYWRkZWQgdW50aWwgRE9NIHJlYWR5IGJlY2F1c2UgdGhlIHN1cHBvcnQgdGVzdAovLyBmb3IgaXQgaXMgbm90IHJ1biB1bnRpbCBhZnRlciBET00gcmVhZHkKalF1ZXJ5KGZ1bmN0aW9uKCkgewoJaWYgKCAhalF1ZXJ5LnN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodCApIHsKCQlqUXVlcnkuY3NzSG9va3MubWFyZ2luUmlnaHQgPSB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQkJLy8gV2ViS2l0IEJ1ZyAxMzM0MyAtIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyB3cm9uZyB2YWx1ZSBmb3IgbWFyZ2luLXJpZ2h0CgkJCQkvLyBXb3JrIGFyb3VuZCBieSB0ZW1wb3JhcmlseSBzZXR0aW5nIGVsZW1lbnQgZGlzcGxheSB0byBpbmxpbmUtYmxvY2sKCQkJCXJldHVybiBqUXVlcnkuc3dhcCggZWxlbSwgeyAiZGlzcGxheSI6ICJpbmxpbmUtYmxvY2siIH0sIGZ1bmN0aW9uKCkgewoJCQkJCWlmICggY29tcHV0ZWQgKSB7CgkJCQkJCXJldHVybiBjdXJDU1MoIGVsZW0sICJtYXJnaW5SaWdodCIgKTsKCQkJCQl9CgkJCQl9KTsKCQkJfQoJCX07Cgl9CgoJLy8gV2Via2l0IGJ1ZzogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI5MDg0CgkvLyBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgcGVyY2VudCB3aGVuIHNwZWNpZmllZCBmb3IgdG9wL2xlZnQvYm90dG9tL3JpZ2h0CgkvLyByYXRoZXIgdGhhbiBtYWtlIHRoZSBjc3MgbW9kdWxlIGRlcGVuZCBvbiB0aGUgb2Zmc2V0IG1vZHVsZSwgd2UganVzdCBjaGVjayBmb3IgaXQgaGVyZQoJaWYgKCAhalF1ZXJ5LnN1cHBvcnQucGl4ZWxQb3NpdGlvbiAmJiBqUXVlcnkuZm4ucG9zaXRpb24gKSB7CgkJalF1ZXJ5LmVhY2goIFsgInRvcCIsICJsZWZ0IiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHsKCQkJalF1ZXJ5LmNzc0hvb2tzWyBwcm9wIF0gPSB7CgkJCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHsKCQkJCQlpZiAoIGNvbXB1dGVkICkgewoJCQkJCQl2YXIgcmV0ID0gY3VyQ1NTKCBlbGVtLCBwcm9wICk7CgkJCQkJCS8vIGlmIGN1ckNTUyByZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNrIHRvIG9mZnNldAoJCQkJCQlyZXR1cm4gcm51bW5vbnB4LnRlc3QoIHJldCApID8galF1ZXJ5KCBlbGVtICkucG9zaXRpb24oKVsgcHJvcCBdICsgInB4IiA6IHJldDsKCQkJCQl9CgkJCQl9CgkJCX07CgkJfSk7Cgl9Cgp9KTsKCmlmICggalF1ZXJ5LmV4cHIgJiYgalF1ZXJ5LmV4cHIuZmlsdGVycyApIHsKCWpRdWVyeS5leHByLmZpbHRlcnMuaGlkZGVuID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuICggZWxlbS5vZmZzZXRXaWR0aCA9PT0gMCAmJiBlbGVtLm9mZnNldEhlaWdodCA9PT0gMCApIHx8ICghalF1ZXJ5LnN1cHBvcnQucmVsaWFibGVIaWRkZW5PZmZzZXRzICYmICgoZWxlbS5zdHlsZSAmJiBlbGVtLnN0eWxlLmRpc3BsYXkpIHx8IGN1ckNTUyggZWxlbSwgImRpc3BsYXkiICkpID09PSAibm9uZSIpOwoJfTsKCglqUXVlcnkuZXhwci5maWx0ZXJzLnZpc2libGUgPSBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gIWpRdWVyeS5leHByLmZpbHRlcnMuaGlkZGVuKCBlbGVtICk7Cgl9Owp9CgovLyBUaGVzZSBob29rcyBhcmUgdXNlZCBieSBhbmltYXRlIHRvIGV4cGFuZCBwcm9wZXJ0aWVzCmpRdWVyeS5lYWNoKHsKCW1hcmdpbjogIiIsCglwYWRkaW5nOiAiIiwKCWJvcmRlcjogIldpZHRoIgp9LCBmdW5jdGlvbiggcHJlZml4LCBzdWZmaXggKSB7CglqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdID0gewoJCWV4cGFuZDogZnVuY3Rpb24oIHZhbHVlICkgewoJCQl2YXIgaSwKCgkJCQkvLyBhc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmcKCQkJCXBhcnRzID0gdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiA/IHZhbHVlLnNwbGl0KCIgIikgOiBbIHZhbHVlIF0sCgkJCQlleHBhbmRlZCA9IHt9OwoKCQkJZm9yICggaSA9IDA7IGkgPCA0OyBpKysgKSB7CgkJCQlleHBhbmRlZFsgcHJlZml4ICsgY3NzRXhwYW5kWyBpIF0gKyBzdWZmaXggXSA9CgkJCQkJcGFydHNbIGkgXSB8fCBwYXJ0c1sgaSAtIDIgXSB8fCBwYXJ0c1sgMCBdOwoJCQl9CgoJCQlyZXR1cm4gZXhwYW5kZWQ7CgkJfQoJfTsKCglpZiAoICFybWFyZ2luLnRlc3QoIHByZWZpeCApICkgewoJCWpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0uc2V0ID0gc2V0UG9zaXRpdmVOdW1iZXI7Cgl9Cn0pOwp2YXIgcjIwID0gLyUyMC9nLAoJcmJyYWNrZXQgPSAvXFtcXSQvLAoJckNSTEYgPSAvXHI/XG4vZywKCXJpbnB1dCA9IC9eKD86Y29sb3J8ZGF0ZXxkYXRldGltZXxkYXRldGltZS1sb2NhbHxlbWFpbHxoaWRkZW58bW9udGh8bnVtYmVyfHBhc3N3b3JkfHJhbmdlfHNlYXJjaHx0ZWx8dGV4dHx0aW1lfHVybHx3ZWVrKSQvaSwKCXJzZWxlY3RUZXh0YXJlYSA9IC9eKD86c2VsZWN0fHRleHRhcmVhKS9pOwoKalF1ZXJ5LmZuLmV4dGVuZCh7CglzZXJpYWxpemU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBqUXVlcnkucGFyYW0oIHRoaXMuc2VyaWFsaXplQXJyYXkoKSApOwoJfSwKCXNlcmlhbGl6ZUFycmF5OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXsKCQkJcmV0dXJuIHRoaXMuZWxlbWVudHMgPyBqUXVlcnkubWFrZUFycmF5KCB0aGlzLmVsZW1lbnRzICkgOiB0aGlzOwoJCX0pCgkJLmZpbHRlcihmdW5jdGlvbigpewoJCQlyZXR1cm4gdGhpcy5uYW1lICYmICF0aGlzLmRpc2FibGVkICYmCgkJCQkoIHRoaXMuY2hlY2tlZCB8fCByc2VsZWN0VGV4dGFyZWEudGVzdCggdGhpcy5ub2RlTmFtZSApIHx8CgkJCQkJcmlucHV0LnRlc3QoIHRoaXMudHlwZSApICk7CgkJfSkKCQkubWFwKGZ1bmN0aW9uKCBpLCBlbGVtICl7CgkJCXZhciB2YWwgPSBqUXVlcnkoIHRoaXMgKS52YWwoKTsKCgkJCXJldHVybiB2YWwgPT0gbnVsbCA/CgkJCQludWxsIDoKCQkJCWpRdWVyeS5pc0FycmF5KCB2YWwgKSA/CgkJCQkJalF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsLCBpICl7CgkJCQkJCXJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgIlxyXG4iICkgfTsKCQkJCQl9KSA6CgkJCQkJeyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsICJcclxuIiApIH07CgkJfSkuZ2V0KCk7Cgl9Cn0pOwoKLy9TZXJpYWxpemUgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cyBvciBhIHNldCBvZgovL2tleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZwpqUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7Cgl2YXIgcHJlZml4LAoJCXMgPSBbXSwKCQlhZGQgPSBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQkJLy8gSWYgdmFsdWUgaXMgYSBmdW5jdGlvbiwgaW52b2tlIGl0IGFuZCByZXR1cm4gaXRzIHZhbHVlCgkJCXZhbHVlID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgPyB2YWx1ZSgpIDogKCB2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZSApOwoJCQlzWyBzLmxlbmd0aCBdID0gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKSArICI9IiArIGVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgKTsKCQl9OwoKCS8vIFNldCB0cmFkaXRpb25hbCB0byB0cnVlIGZvciBqUXVlcnkgPD0gMS4zLjIgYmVoYXZpb3IuCglpZiAoIHRyYWRpdGlvbmFsID09PSB1bmRlZmluZWQgKSB7CgkJdHJhZGl0aW9uYWwgPSBqUXVlcnkuYWpheFNldHRpbmdzICYmIGpRdWVyeS5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWw7Cgl9CgoJLy8gSWYgYW4gYXJyYXkgd2FzIHBhc3NlZCBpbiwgYXNzdW1lIHRoYXQgaXQgaXMgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cy4KCWlmICggalF1ZXJ5LmlzQXJyYXkoIGEgKSB8fCAoIGEuanF1ZXJ5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggYSApICkgKSB7CgkJLy8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzCgkJalF1ZXJ5LmVhY2goIGEsIGZ1bmN0aW9uKCkgewoJCQlhZGQoIHRoaXMubmFtZSwgdGhpcy52YWx1ZSApOwoJCX0pOwoKCX0gZWxzZSB7CgkJLy8gSWYgdHJhZGl0aW9uYWwsIGVuY29kZSB0aGUgIm9sZCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyCgkJLy8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuCgkJZm9yICggcHJlZml4IGluIGEgKSB7CgkJCWJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwgYWRkICk7CgkJfQoJfQoKCS8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb24KCXJldHVybiBzLmpvaW4oICImIiApLnJlcGxhY2UoIHIyMCwgIisiICk7Cn07CgpmdW5jdGlvbiBidWlsZFBhcmFtcyggcHJlZml4LCBvYmosIHRyYWRpdGlvbmFsLCBhZGQgKSB7Cgl2YXIgbmFtZTsKCglpZiAoIGpRdWVyeS5pc0FycmF5KCBvYmogKSApIHsKCQkvLyBTZXJpYWxpemUgYXJyYXkgaXRlbS4KCQlqUXVlcnkuZWFjaCggb2JqLCBmdW5jdGlvbiggaSwgdiApIHsKCQkJaWYgKCB0cmFkaXRpb25hbCB8fCByYnJhY2tldC50ZXN0KCBwcmVmaXggKSApIHsKCQkJCS8vIFRyZWF0IGVhY2ggYXJyYXkgaXRlbSBhcyBhIHNjYWxhci4KCQkJCWFkZCggcHJlZml4LCB2ICk7CgoJCQl9IGVsc2UgewoJCQkJLy8gSWYgYXJyYXkgaXRlbSBpcyBub24tc2NhbGFyIChhcnJheSBvciBvYmplY3QpLCBlbmNvZGUgaXRzCgkJCQkvLyBudW1lcmljIGluZGV4IHRvIHJlc29sdmUgZGVzZXJpYWxpemF0aW9uIGFtYmlndWl0eSBpc3N1ZXMuCgkJCQkvLyBOb3RlIHRoYXQgcmFjayAoYXMgb2YgMS4wLjApIGNhbid0IGN1cnJlbnRseSBkZXNlcmlhbGl6ZQoJCQkJLy8gbmVzdGVkIGFycmF5cyBwcm9wZXJseSwgYW5kIGF0dGVtcHRpbmcgdG8gZG8gc28gbWF5IGNhdXNlCgkJCQkvLyBhIHNlcnZlciBlcnJvci4gUG9zc2libGUgZml4ZXMgYXJlIHRvIG1vZGlmeSByYWNrJ3MKCQkJCS8vIGRlc2VyaWFsaXphdGlvbiBhbGdvcml0aG0gb3IgdG8gcHJvdmlkZSBhbiBvcHRpb24gb3IgZmxhZwoJCQkJLy8gdG8gZm9yY2UgYXJyYXkgc2VyaWFsaXphdGlvbiB0byBiZSBzaGFsbG93LgoJCQkJYnVpbGRQYXJhbXMoIHByZWZpeCArICJbIiArICggdHlwZW9mIHYgPT09ICJvYmplY3QiID8gaSA6ICIiICkgKyAiXSIsIHYsIHRyYWRpdGlvbmFsLCBhZGQgKTsKCQkJfQoJCX0pOwoKCX0gZWxzZSBpZiAoICF0cmFkaXRpb25hbCAmJiBqUXVlcnkudHlwZSggb2JqICkgPT09ICJvYmplY3QiICkgewoJCS8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS4KCQlmb3IgKCBuYW1lIGluIG9iaiApIHsKCQkJYnVpbGRQYXJhbXMoIHByZWZpeCArICJbIiArIG5hbWUgKyAiXSIsIG9ialsgbmFtZSBdLCB0cmFkaXRpb25hbCwgYWRkICk7CgkJfQoKCX0gZWxzZSB7CgkJLy8gU2VyaWFsaXplIHNjYWxhciBpdGVtLgoJCWFkZCggcHJlZml4LCBvYmogKTsKCX0KfQp2YXIKCS8vIERvY3VtZW50IGxvY2F0aW9uCglhamF4TG9jUGFydHMsCglhamF4TG9jYXRpb24sCgoJcmhhc2ggPSAvIy4qJC8sCglyaGVhZGVycyA9IC9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvbWcsIC8vIElFIGxlYXZlcyBhbiBcciBjaGFyYWN0ZXIgYXQgRU9MCgkvLyAjNzY1MywgIzgxMjUsICM4MTUyOiBsb2NhbCBwcm90b2NvbCBkZXRlY3Rpb24KCXJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwXC1zdG9yYWdlfC4rXC1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLywKCXJub0NvbnRlbnQgPSAvXig/OkdFVHxIRUFEKSQvLAoJcnByb3RvY29sID0gL15cL1wvLywKCXJxdWVyeSA9IC9cPy8sCglyc2NyaXB0ID0gLzxzY3JpcHRcYltePF0qKD86KD8hPFwvc2NyaXB0Pik8W148XSopKjxcL3NjcmlwdD4vZ2ksCglydHMgPSAvKFs/Jl0pXz1bXiZdKi8sCglydXJsID0gL14oW1x3XCtcLlwtXSs6KSg/OlwvXC8oW15cLz8jOl0qKSg/OjooXGQrKXwpfCkvLAoKCS8vIEtlZXAgYSBjb3B5IG9mIHRoZSBvbGQgbG9hZCBtZXRob2QKCV9sb2FkID0galF1ZXJ5LmZuLmxvYWQsCgoJLyogUHJlZmlsdGVycwoJICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSkKCSAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6CgkgKiAgICAtIEJFRk9SRSBhc2tpbmcgZm9yIGEgdHJhbnNwb3J0CgkgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpCgkgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiA0KSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gY29udGludWUgZG93biB0byAiKiIgaWYgbmVlZGVkCgkgKi8KCXByZWZpbHRlcnMgPSB7fSwKCgkvKiBUcmFuc3BvcnRzIGJpbmRpbmdzCgkgKiAxKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogMykgc2VsZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gIioiIGlmIG5lZWRlZAoJICovCgl0cmFuc3BvcnRzID0ge30sCgoJLy8gQXZvaWQgY29tbWVudC1wcm9sb2cgY2hhciBzZXF1ZW5jZSAoIzEwMDk4KTsgbXVzdCBhcHBlYXNlIGxpbnQgYW5kIGV2YWRlIGNvbXByZXNzaW9uCglhbGxUeXBlcyA9IFsiKi8iXSArIFsiKiJdOwoKLy8gIzgxMzgsIElFIG1heSB0aHJvdyBhbiBleGNlcHRpb24gd2hlbiBhY2Nlc3NpbmcKLy8gYSBmaWVsZCBmcm9tIHdpbmRvdy5sb2NhdGlvbiBpZiBkb2N1bWVudC5kb21haW4gaGFzIGJlZW4gc2V0CnRyeSB7CglhamF4TG9jYXRpb24gPSBsb2NhdGlvbi5ocmVmOwp9IGNhdGNoKCBlICkgewoJLy8gVXNlIHRoZSBocmVmIGF0dHJpYnV0ZSBvZiBhbiBBIGVsZW1lbnQKCS8vIHNpbmNlIElFIHdpbGwgbW9kaWZ5IGl0IGdpdmVuIGRvY3VtZW50LmxvY2F0aW9uCglhamF4TG9jYXRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiYSIgKTsKCWFqYXhMb2NhdGlvbi5ocmVmID0gIiI7CglhamF4TG9jYXRpb24gPSBhamF4TG9jYXRpb24uaHJlZjsKfQoKLy8gU2VnbWVudCBsb2NhdGlvbiBpbnRvIHBhcnRzCmFqYXhMb2NQYXJ0cyA9IHJ1cmwuZXhlYyggYWpheExvY2F0aW9uLnRvTG93ZXJDYXNlKCkgKSB8fCBbXTsKCi8vIEJhc2UgImNvbnN0cnVjdG9yIiBmb3IgalF1ZXJ5LmFqYXhQcmVmaWx0ZXIgYW5kIGpRdWVyeS5hamF4VHJhbnNwb3J0CmZ1bmN0aW9uIGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlICkgewoKCS8vIGRhdGFUeXBlRXhwcmVzc2lvbiBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gIioiCglyZXR1cm4gZnVuY3Rpb24oIGRhdGFUeXBlRXhwcmVzc2lvbiwgZnVuYyApIHsKCgkJaWYgKCB0eXBlb2YgZGF0YVR5cGVFeHByZXNzaW9uICE9PSAic3RyaW5nIiApIHsKCQkJZnVuYyA9IGRhdGFUeXBlRXhwcmVzc2lvbjsKCQkJZGF0YVR5cGVFeHByZXNzaW9uID0gIioiOwoJCX0KCgkJdmFyIGRhdGFUeXBlLCBsaXN0LCBwbGFjZUJlZm9yZSwKCQkJZGF0YVR5cGVzID0gZGF0YVR5cGVFeHByZXNzaW9uLnRvTG93ZXJDYXNlKCkuc3BsaXQoIGNvcmVfcnNwYWNlICksCgkJCWkgPSAwLAoJCQlsZW5ndGggPSBkYXRhVHlwZXMubGVuZ3RoOwoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBmdW5jICkgKSB7CgkJCS8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBkYXRhVHlwZUV4cHJlc3Npb24KCQkJZm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQlkYXRhVHlwZSA9IGRhdGFUeXBlc1sgaSBdOwoJCQkJLy8gV2UgY29udHJvbCBpZiB3ZSdyZSBhc2tlZCB0byBhZGQgYmVmb3JlCgkJCQkvLyBhbnkgZXhpc3RpbmcgZWxlbWVudAoJCQkJcGxhY2VCZWZvcmUgPSAvXlwrLy50ZXN0KCBkYXRhVHlwZSApOwoJCQkJaWYgKCBwbGFjZUJlZm9yZSApIHsKCQkJCQlkYXRhVHlwZSA9IGRhdGFUeXBlLnN1YnN0ciggMSApIHx8ICIqIjsKCQkJCX0KCQkJCWxpc3QgPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW107CgkJCQkvLyB0aGVuIHdlIGFkZCB0byB0aGUgc3RydWN0dXJlIGFjY29yZGluZ2x5CgkJCQlsaXN0WyBwbGFjZUJlZm9yZSA/ICJ1bnNoaWZ0IiA6ICJwdXNoIiBdKCBmdW5jICk7CgkJCX0KCQl9Cgl9Owp9CgovLyBCYXNlIGluc3BlY3Rpb24gZnVuY3Rpb24gZm9yIHByZWZpbHRlcnMgYW5kIHRyYW5zcG9ydHMKZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiwKCQlkYXRhVHlwZSAvKiBpbnRlcm5hbCAqLywgaW5zcGVjdGVkIC8qIGludGVybmFsICovICkgewoKCWRhdGFUeXBlID0gZGF0YVR5cGUgfHwgb3B0aW9ucy5kYXRhVHlwZXNbIDAgXTsKCWluc3BlY3RlZCA9IGluc3BlY3RlZCB8fCB7fTsKCglpbnNwZWN0ZWRbIGRhdGFUeXBlIF0gPSB0cnVlOwoKCXZhciBzZWxlY3Rpb24sCgkJbGlzdCA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSwKCQlpID0gMCwKCQlsZW5ndGggPSBsaXN0ID8gbGlzdC5sZW5ndGggOiAwLAoJCWV4ZWN1dGVPbmx5ID0gKCBzdHJ1Y3R1cmUgPT09IHByZWZpbHRlcnMgKTsKCglmb3IgKCA7IGkgPCBsZW5ndGggJiYgKCBleGVjdXRlT25seSB8fCAhc2VsZWN0aW9uICk7IGkrKyApIHsKCQlzZWxlY3Rpb24gPSBsaXN0WyBpIF0oIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTsKCQkvLyBJZiB3ZSBnb3QgcmVkaXJlY3RlZCB0byBhbm90aGVyIGRhdGFUeXBlCgkJLy8gd2UgdHJ5IHRoZXJlIGlmIGV4ZWN1dGluZyBvbmx5IGFuZCBub3QgZG9uZSBhbHJlYWR5CgkJaWYgKCB0eXBlb2Ygc2VsZWN0aW9uID09PSAic3RyaW5nIiApIHsKCQkJaWYgKCAhZXhlY3V0ZU9ubHkgfHwgaW5zcGVjdGVkWyBzZWxlY3Rpb24gXSApIHsKCQkJCXNlbGVjdGlvbiA9IHVuZGVmaW5lZDsKCQkJfSBlbHNlIHsKCQkJCW9wdGlvbnMuZGF0YVR5cGVzLnVuc2hpZnQoIHNlbGVjdGlvbiApOwoJCQkJc2VsZWN0aW9uID0gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoCgkJCQkJCXN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiwgc2VsZWN0aW9uLCBpbnNwZWN0ZWQgKTsKCQkJfQoJCX0KCX0KCS8vIElmIHdlJ3JlIG9ubHkgZXhlY3V0aW5nIG9yIG5vdGhpbmcgd2FzIHNlbGVjdGVkCgkvLyB3ZSB0cnkgdGhlIGNhdGNoYWxsIGRhdGFUeXBlIGlmIG5vdCBkb25lIGFscmVhZHkKCWlmICggKCBleGVjdXRlT25seSB8fCAhc2VsZWN0aW9uICkgJiYgIWluc3BlY3RlZFsgIioiIF0gKSB7CgkJc2VsZWN0aW9uID0gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoCgkJCQlzdHJ1Y3R1cmUsIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIsICIqIiwgaW5zcGVjdGVkICk7Cgl9CgkvLyB1bm5lY2Vzc2FyeSB3aGVuIG9ubHkgZXhlY3V0aW5nIChwcmVmaWx0ZXJzKQoJLy8gYnV0IGl0J2xsIGJlIGlnbm9yZWQgYnkgdGhlIGNhbGxlciBpbiB0aGF0IGNhc2UKCXJldHVybiBzZWxlY3Rpb247Cn0KCi8vIEEgc3BlY2lhbCBleHRlbmQgZm9yIGFqYXggb3B0aW9ucwovLyB0aGF0IHRha2VzICJmbGF0IiBvcHRpb25zIChub3QgdG8gYmUgZGVlcCBleHRlbmRlZCkKLy8gRml4ZXMgIzk4ODcKZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7Cgl2YXIga2V5LCBkZWVwLAoJCWZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTsKCWZvciAoIGtleSBpbiBzcmMgKSB7CgkJaWYgKCBzcmNbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7CgkJCSggZmxhdE9wdGlvbnNbIGtleSBdID8gdGFyZ2V0IDogKCBkZWVwIHx8ICggZGVlcCA9IHt9ICkgKSApWyBrZXkgXSA9IHNyY1sga2V5IF07CgkJfQoJfQoJaWYgKCBkZWVwICkgewoJCWpRdWVyeS5leHRlbmQoIHRydWUsIHRhcmdldCwgZGVlcCApOwoJfQp9CgpqUXVlcnkuZm4ubG9hZCA9IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7CglpZiAoIHR5cGVvZiB1cmwgIT09ICJzdHJpbmciICYmIF9sb2FkICkgewoJCXJldHVybiBfbG9hZC5hcHBseSggdGhpcywgYXJndW1lbnRzICk7Cgl9CgoJLy8gRG9uJ3QgZG8gYSByZXF1ZXN0IGlmIG5vIGVsZW1lbnRzIGFyZSBiZWluZyByZXF1ZXN0ZWQKCWlmICggIXRoaXMubGVuZ3RoICkgewoJCXJldHVybiB0aGlzOwoJfQoKCXZhciBzZWxlY3RvciwgdHlwZSwgcmVzcG9uc2UsCgkJc2VsZiA9IHRoaXMsCgkJb2ZmID0gdXJsLmluZGV4T2YoIiAiKTsKCglpZiAoIG9mZiA+PSAwICkgewoJCXNlbGVjdG9yID0gdXJsLnNsaWNlKCBvZmYsIHVybC5sZW5ndGggKTsKCQl1cmwgPSB1cmwuc2xpY2UoIDAsIG9mZiApOwoJfQoKCS8vIElmIGl0J3MgYSBmdW5jdGlvbgoJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcGFyYW1zICkgKSB7CgoJCS8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrCgkJY2FsbGJhY2sgPSBwYXJhbXM7CgkJcGFyYW1zID0gdW5kZWZpbmVkOwoKCS8vIE90aGVyd2lzZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmcKCX0gZWxzZSBpZiAoIHBhcmFtcyAmJiB0eXBlb2YgcGFyYW1zID09PSAib2JqZWN0IiApIHsKCQl0eXBlID0gIlBPU1QiOwoJfQoKCS8vIFJlcXVlc3QgdGhlIHJlbW90ZSBkb2N1bWVudAoJalF1ZXJ5LmFqYXgoewoJCXVybDogdXJsLAoKCQkvLyBpZiAidHlwZSIgdmFyaWFibGUgaXMgdW5kZWZpbmVkLCB0aGVuICJHRVQiIG1ldGhvZCB3aWxsIGJlIHVzZWQKCQl0eXBlOiB0eXBlLAoJCWRhdGFUeXBlOiAiaHRtbCIsCgkJZGF0YTogcGFyYW1zLAoJCWNvbXBsZXRlOiBmdW5jdGlvbigganFYSFIsIHN0YXR1cyApIHsKCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCXNlbGYuZWFjaCggY2FsbGJhY2ssIHJlc3BvbnNlIHx8IFsganFYSFIucmVzcG9uc2VUZXh0LCBzdGF0dXMsIGpxWEhSIF0gKTsKCQkJfQoJCX0KCX0pLmRvbmUoZnVuY3Rpb24oIHJlc3BvbnNlVGV4dCApIHsKCgkJLy8gU2F2ZSByZXNwb25zZSBmb3IgdXNlIGluIGNvbXBsZXRlIGNhbGxiYWNrCgkJcmVzcG9uc2UgPSBhcmd1bWVudHM7CgoJCS8vIFNlZSBpZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQKCQlzZWxmLmh0bWwoIHNlbGVjdG9yID8KCgkJCS8vIENyZWF0ZSBhIGR1bW15IGRpdiB0byBob2xkIHRoZSByZXN1bHRzCgkJCWpRdWVyeSgiPGRpdj4iKQoKCQkJCS8vIGluamVjdCB0aGUgY29udGVudHMgb2YgdGhlIGRvY3VtZW50IGluLCByZW1vdmluZyB0aGUgc2NyaXB0cwoJCQkJLy8gdG8gYXZvaWQgYW55ICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzIGluIElFCgkJCQkuYXBwZW5kKCByZXNwb25zZVRleHQucmVwbGFjZSggcnNjcmlwdCwgIiIgKSApCgoJCQkJLy8gTG9jYXRlIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMKCQkJCS5maW5kKCBzZWxlY3RvciApIDoKCgkJCS8vIElmIG5vdCwganVzdCBpbmplY3QgdGhlIGZ1bGwgcmVzdWx0CgkJCXJlc3BvbnNlVGV4dCApOwoKCX0pOwoKCXJldHVybiB0aGlzOwp9OwoKLy8gQXR0YWNoIGEgYnVuY2ggb2YgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBjb21tb24gQUpBWCBldmVudHMKalF1ZXJ5LmVhY2goICJhamF4U3RhcnQgYWpheFN0b3AgYWpheENvbXBsZXRlIGFqYXhFcnJvciBhamF4U3VjY2VzcyBhamF4U2VuZCIuc3BsaXQoICIgIiApLCBmdW5jdGlvbiggaSwgbyApewoJalF1ZXJ5LmZuWyBvIF0gPSBmdW5jdGlvbiggZiApewoJCXJldHVybiB0aGlzLm9uKCBvLCBmICk7Cgl9Owp9KTsKCmpRdWVyeS5lYWNoKCBbICJnZXQiLCAicG9zdCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCApIHsKCWpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKCQkvLyBzaGlmdCBhcmd1bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3YXMgb21pdHRlZAoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7CgkJCWNhbGxiYWNrID0gZGF0YTsKCQkJZGF0YSA9IHVuZGVmaW5lZDsKCQl9CgoJCXJldHVybiBqUXVlcnkuYWpheCh7CgkJCXR5cGU6IG1ldGhvZCwKCQkJdXJsOiB1cmwsCgkJCWRhdGE6IGRhdGEsCgkJCXN1Y2Nlc3M6IGNhbGxiYWNrLAoJCQlkYXRhVHlwZTogdHlwZQoJCX0pOwoJfTsKfSk7CgpqUXVlcnkuZXh0ZW5kKHsKCglnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkgewoJCXJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssICJzY3JpcHQiICk7Cgl9LAoKCWdldEpTT046IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrICkgewoJCXJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIGRhdGEsIGNhbGxiYWNrLCAianNvbiIgKTsKCX0sCgoJLy8gQ3JlYXRlcyBhIGZ1bGwgZmxlZGdlZCBzZXR0aW5ncyBvYmplY3QgaW50byB0YXJnZXQKCS8vIHdpdGggYm90aCBhamF4U2V0dGluZ3MgYW5kIHNldHRpbmdzIGZpZWxkcy4KCS8vIElmIHRhcmdldCBpcyBvbWl0dGVkLCB3cml0ZXMgaW50byBhamF4U2V0dGluZ3MuCglhamF4U2V0dXA6IGZ1bmN0aW9uKCB0YXJnZXQsIHNldHRpbmdzICkgewoJCWlmICggc2V0dGluZ3MgKSB7CgkJCS8vIEJ1aWxkaW5nIGEgc2V0dGluZ3Mgb2JqZWN0CgkJCWFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApOwoJCX0gZWxzZSB7CgkJCS8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3MKCQkJc2V0dGluZ3MgPSB0YXJnZXQ7CgkJCXRhcmdldCA9IGpRdWVyeS5hamF4U2V0dGluZ3M7CgkJfQoJCWFqYXhFeHRlbmQoIHRhcmdldCwgc2V0dGluZ3MgKTsKCQlyZXR1cm4gdGFyZ2V0OwoJfSwKCglhamF4U2V0dGluZ3M6IHsKCQl1cmw6IGFqYXhMb2NhdGlvbiwKCQlpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBhamF4TG9jUGFydHNbIDEgXSApLAoJCWdsb2JhbDogdHJ1ZSwKCQl0eXBlOiAiR0VUIiwKCQljb250ZW50VHlwZTogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsCgkJcHJvY2Vzc0RhdGE6IHRydWUsCgkJYXN5bmM6IHRydWUsCgkJLyoKCQl0aW1lb3V0OiAwLAoJCWRhdGE6IG51bGwsCgkJZGF0YVR5cGU6IG51bGwsCgkJdXNlcm5hbWU6IG51bGwsCgkJcGFzc3dvcmQ6IG51bGwsCgkJY2FjaGU6IG51bGwsCgkJdGhyb3dzOiBmYWxzZSwKCQl0cmFkaXRpb25hbDogZmFsc2UsCgkJaGVhZGVyczoge30sCgkJKi8KCgkJYWNjZXB0czogewoJCQl4bWw6ICJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIiwKCQkJaHRtbDogInRleHQvaHRtbCIsCgkJCXRleHQ6ICJ0ZXh0L3BsYWluIiwKCQkJanNvbjogImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCIsCgkJCSIqIjogYWxsVHlwZXMKCQl9LAoKCQljb250ZW50czogewoJCQl4bWw6IC94bWwvLAoJCQlodG1sOiAvaHRtbC8sCgkJCWpzb246IC9qc29uLwoJCX0sCgoJCXJlc3BvbnNlRmllbGRzOiB7CgkJCXhtbDogInJlc3BvbnNlWE1MIiwKCQkJdGV4dDogInJlc3BvbnNlVGV4dCIKCQl9LAoKCQkvLyBMaXN0IG9mIGRhdGEgY29udmVydGVycwoJCS8vIDEpIGtleSBmb3JtYXQgaXMgInNvdXJjZV90eXBlIGRlc3RpbmF0aW9uX3R5cGUiIChhIHNpbmdsZSBzcGFjZSBpbi1iZXR3ZWVuKQoJCS8vIDIpIHRoZSBjYXRjaGFsbCBzeW1ib2wgIioiIGNhbiBiZSB1c2VkIGZvciBzb3VyY2VfdHlwZQoJCWNvbnZlcnRlcnM6IHsKCgkJCS8vIENvbnZlcnQgYW55dGhpbmcgdG8gdGV4dAoJCQkiKiB0ZXh0Ijogd2luZG93LlN0cmluZywKCgkJCS8vIFRleHQgdG8gaHRtbCAodHJ1ZSA9IG5vIHRyYW5zZm9ybWF0aW9uKQoJCQkidGV4dCBodG1sIjogdHJ1ZSwKCgkJCS8vIEV2YWx1YXRlIHRleHQgYXMgYSBqc29uIGV4cHJlc3Npb24KCQkJInRleHQganNvbiI6IGpRdWVyeS5wYXJzZUpTT04sCgoJCQkvLyBQYXJzZSB0ZXh0IGFzIHhtbAoJCQkidGV4dCB4bWwiOiBqUXVlcnkucGFyc2VYTUwKCQl9LAoKCQkvLyBGb3Igb3B0aW9ucyB0aGF0IHNob3VsZG4ndCBiZSBkZWVwIGV4dGVuZGVkOgoJCS8vIHlvdSBjYW4gYWRkIHlvdXIgb3duIGN1c3RvbSBvcHRpb25zIGhlcmUgaWYKCQkvLyBhbmQgd2hlbiB5b3UgY3JlYXRlIG9uZSB0aGF0IHNob3VsZG4ndCBiZQoJCS8vIGRlZXAgZXh0ZW5kZWQgKHNlZSBhamF4RXh0ZW5kKQoJCWZsYXRPcHRpb25zOiB7CgkJCWNvbnRleHQ6IHRydWUsCgkJCXVybDogdHJ1ZQoJCX0KCX0sCgoJYWpheFByZWZpbHRlcjogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzICksCglhamF4VHJhbnNwb3J0OiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMgKSwKCgkvLyBNYWluIG1ldGhvZAoJYWpheDogZnVuY3Rpb24oIHVybCwgb3B0aW9ucyApIHsKCgkJLy8gSWYgdXJsIGlzIGFuIG9iamVjdCwgc2ltdWxhdGUgcHJlLTEuNSBzaWduYXR1cmUKCQlpZiAoIHR5cGVvZiB1cmwgPT09ICJvYmplY3QiICkgewoJCQlvcHRpb25zID0gdXJsOwoJCQl1cmwgPSB1bmRlZmluZWQ7CgkJfQoKCQkvLyBGb3JjZSBvcHRpb25zIHRvIGJlIGFuIG9iamVjdAoJCW9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoKCQl2YXIgLy8gaWZNb2RpZmllZCBrZXkKCQkJaWZNb2RpZmllZEtleSwKCQkJLy8gUmVzcG9uc2UgaGVhZGVycwoJCQlyZXNwb25zZUhlYWRlcnNTdHJpbmcsCgkJCXJlc3BvbnNlSGVhZGVycywKCQkJLy8gdHJhbnNwb3J0CgkJCXRyYW5zcG9ydCwKCQkJLy8gdGltZW91dCBoYW5kbGUKCQkJdGltZW91dFRpbWVyLAoJCQkvLyBDcm9zcy1kb21haW4gZGV0ZWN0aW9uIHZhcnMKCQkJcGFydHMsCgkJCS8vIFRvIGtub3cgaWYgZ2xvYmFsIGV2ZW50cyBhcmUgdG8gYmUgZGlzcGF0Y2hlZAoJCQlmaXJlR2xvYmFscywKCQkJLy8gTG9vcCB2YXJpYWJsZQoJCQlpLAoJCQkvLyBDcmVhdGUgdGhlIGZpbmFsIG9wdGlvbnMgb2JqZWN0CgkJCXMgPSBqUXVlcnkuYWpheFNldHVwKCB7fSwgb3B0aW9ucyApLAoJCQkvLyBDYWxsYmFja3MgY29udGV4dAoJCQljYWxsYmFja0NvbnRleHQgPSBzLmNvbnRleHQgfHwgcywKCQkJLy8gQ29udGV4dCBmb3IgZ2xvYmFsIGV2ZW50cwoJCQkvLyBJdCdzIHRoZSBjYWxsYmFja0NvbnRleHQgaWYgb25lIHdhcyBwcm92aWRlZCBpbiB0aGUgb3B0aW9ucwoJCQkvLyBhbmQgaWYgaXQncyBhIERPTSBub2RlIG9yIGEgalF1ZXJ5IGNvbGxlY3Rpb24KCQkJZ2xvYmFsRXZlbnRDb250ZXh0ID0gY2FsbGJhY2tDb250ZXh0ICE9PSBzICYmCgkJCQkoIGNhbGxiYWNrQ29udGV4dC5ub2RlVHlwZSB8fCBjYWxsYmFja0NvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgKSA/CgkJCQkJCWpRdWVyeSggY2FsbGJhY2tDb250ZXh0ICkgOiBqUXVlcnkuZXZlbnQsCgkJCS8vIERlZmVycmVkcwoJCQlkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLAoJCQljb21wbGV0ZURlZmVycmVkID0galF1ZXJ5LkNhbGxiYWNrcyggIm9uY2UgbWVtb3J5IiApLAoJCQkvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrcwoJCQlzdGF0dXNDb2RlID0gcy5zdGF0dXNDb2RlIHx8IHt9LAoJCQkvLyBIZWFkZXJzICh0aGV5IGFyZSBzZW50IGFsbCBhdCBvbmNlKQoJCQlyZXF1ZXN0SGVhZGVycyA9IHt9LAoJCQlyZXF1ZXN0SGVhZGVyc05hbWVzID0ge30sCgkJCS8vIFRoZSBqcVhIUiBzdGF0ZQoJCQlzdGF0ZSA9IDAsCgkJCS8vIERlZmF1bHQgYWJvcnQgbWVzc2FnZQoJCQlzdHJBYm9ydCA9ICJjYW5jZWxlZCIsCgkJCS8vIEZha2UgeGhyCgkJCWpxWEhSID0gewoKCQkJCXJlYWR5U3RhdGU6IDAsCgoJCQkJLy8gQ2FjaGVzIHRoZSBoZWFkZXIKCQkJCXNldFJlcXVlc3RIZWFkZXI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKCQkJCQlpZiAoICFzdGF0ZSApIHsKCQkJCQkJdmFyIGxuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwoJCQkJCQluYW1lID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbG5hbWUgXSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIGxuYW1lIF0gfHwgbmFtZTsKCQkJCQkJcmVxdWVzdEhlYWRlcnNbIG5hbWUgXSA9IHZhbHVlOwoJCQkJCX0KCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0sCgoJCQkJLy8gUmF3IHN0cmluZwoJCQkJZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOiBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gc3RhdGUgPT09IDIgPyByZXNwb25zZUhlYWRlcnNTdHJpbmcgOiBudWxsOwoJCQkJfSwKCgkJCQkvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkCgkJCQlnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rpb24oIGtleSApIHsKCQkJCQl2YXIgbWF0Y2g7CgkJCQkJaWYgKCBzdGF0ZSA9PT0gMiApIHsKCQkJCQkJaWYgKCAhcmVzcG9uc2VIZWFkZXJzICkgewoJCQkJCQkJcmVzcG9uc2VIZWFkZXJzID0ge307CgkJCQkJCQl3aGlsZSggKCBtYXRjaCA9IHJoZWFkZXJzLmV4ZWMoIHJlc3BvbnNlSGVhZGVyc1N0cmluZyApICkgKSB7CgkJCQkJCQkJcmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpIF0gPSBtYXRjaFsgMiBdOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCW1hdGNoID0gcmVzcG9uc2VIZWFkZXJzWyBrZXkudG9Mb3dlckNhc2UoKSBdOwoJCQkJCX0KCQkJCQlyZXR1cm4gbWF0Y2ggPT09IHVuZGVmaW5lZCA/IG51bGwgOiBtYXRjaDsKCQkJCX0sCgoJCQkJLy8gT3ZlcnJpZGVzIHJlc3BvbnNlIGNvbnRlbnQtdHlwZSBoZWFkZXIKCQkJCW92ZXJyaWRlTWltZVR5cGU6IGZ1bmN0aW9uKCB0eXBlICkgewoJCQkJCWlmICggIXN0YXRlICkgewoJCQkJCQlzLm1pbWVUeXBlID0gdHlwZTsKCQkJCQl9CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIENhbmNlbCB0aGUgcmVxdWVzdAoJCQkJYWJvcnQ6IGZ1bmN0aW9uKCBzdGF0dXNUZXh0ICkgewoJCQkJCXN0YXR1c1RleHQgPSBzdGF0dXNUZXh0IHx8IHN0ckFib3J0OwoJCQkJCWlmICggdHJhbnNwb3J0ICkgewoJCQkJCQl0cmFuc3BvcnQuYWJvcnQoIHN0YXR1c1RleHQgKTsKCQkJCQl9CgkJCQkJZG9uZSggMCwgc3RhdHVzVGV4dCApOwoJCQkJCXJldHVybiB0aGlzOwoJCQkJfQoJCQl9OwoKCQkvLyBDYWxsYmFjayBmb3Igd2hlbiBldmVyeXRoaW5nIGlzIGRvbmUKCQkvLyBJdCBpcyBkZWZpbmVkIGhlcmUgYmVjYXVzZSBqc2xpbnQgY29tcGxhaW5zIGlmIGl0IGlzIGRlY2xhcmVkCgkJLy8gYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24gKHdoaWNoIHdvdWxkIGJlIG1vcmUgbG9naWNhbCBhbmQgcmVhZGFibGUpCgkJZnVuY3Rpb24gZG9uZSggc3RhdHVzLCBuYXRpdmVTdGF0dXNUZXh0LCByZXNwb25zZXMsIGhlYWRlcnMgKSB7CgkJCXZhciBpc1N1Y2Nlc3MsIHN1Y2Nlc3MsIGVycm9yLCByZXNwb25zZSwgbW9kaWZpZWQsCgkJCQlzdGF0dXNUZXh0ID0gbmF0aXZlU3RhdHVzVGV4dDsKCgkJCS8vIENhbGxlZCBvbmNlCgkJCWlmICggc3RhdGUgPT09IDIgKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCS8vIFN0YXRlIGlzICJkb25lIiBub3cKCQkJc3RhdGUgPSAyOwoKCQkJLy8gQ2xlYXIgdGltZW91dCBpZiBpdCBleGlzdHMKCQkJaWYgKCB0aW1lb3V0VGltZXIgKSB7CgkJCQljbGVhclRpbWVvdXQoIHRpbWVvdXRUaW1lciApOwoJCQl9CgoJCQkvLyBEZXJlZmVyZW5jZSB0cmFuc3BvcnQgZm9yIGVhcmx5IGdhcmJhZ2UgY29sbGVjdGlvbgoJCQkvLyAobm8gbWF0dGVyIGhvdyBsb25nIHRoZSBqcVhIUiBvYmplY3Qgd2lsbCBiZSB1c2VkKQoJCQl0cmFuc3BvcnQgPSB1bmRlZmluZWQ7CgoJCQkvLyBDYWNoZSByZXNwb25zZSBoZWFkZXJzCgkJCXJlc3BvbnNlSGVhZGVyc1N0cmluZyA9IGhlYWRlcnMgfHwgIiI7CgoJCQkvLyBTZXQgcmVhZHlTdGF0ZQoJCQlqcVhIUi5yZWFkeVN0YXRlID0gc3RhdHVzID4gMCA/IDQgOiAwOwoKCQkJLy8gR2V0IHJlc3BvbnNlIGRhdGEKCQkJaWYgKCByZXNwb25zZXMgKSB7CgkJCQlyZXNwb25zZSA9IGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKTsKCQkJfQoKCQkJLy8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5cGUgY2hhaW5pbmcKCQkJaWYgKCBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMCB8fCBzdGF0dXMgPT09IDMwNCApIHsKCgkJCQkvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNpbmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLgoJCQkJaWYgKCBzLmlmTW9kaWZpZWQgKSB7CgoJCQkJCW1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKTsKCQkJCQlpZiAoIG1vZGlmaWVkICkgewoJCQkJCQlqUXVlcnkubGFzdE1vZGlmaWVkWyBpZk1vZGlmaWVkS2V5IF0gPSBtb2RpZmllZDsKCQkJCQl9CgkJCQkJbW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlcigiRXRhZyIpOwoJCQkJCWlmICggbW9kaWZpZWQgKSB7CgkJCQkJCWpRdWVyeS5ldGFnWyBpZk1vZGlmaWVkS2V5IF0gPSBtb2RpZmllZDsKCQkJCQl9CgkJCQl9CgoJCQkJLy8gSWYgbm90IG1vZGlmaWVkCgkJCQlpZiAoIHN0YXR1cyA9PT0gMzA0ICkgewoKCQkJCQlzdGF0dXNUZXh0ID0gIm5vdG1vZGlmaWVkIjsKCQkJCQlpc1N1Y2Nlc3MgPSB0cnVlOwoKCQkJCS8vIElmIHdlIGhhdmUgZGF0YQoJCQkJfSBlbHNlIHsKCgkJCQkJaXNTdWNjZXNzID0gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlICk7CgkJCQkJc3RhdHVzVGV4dCA9IGlzU3VjY2Vzcy5zdGF0ZTsKCQkJCQlzdWNjZXNzID0gaXNTdWNjZXNzLmRhdGE7CgkJCQkJZXJyb3IgPSBpc1N1Y2Nlc3MuZXJyb3I7CgkJCQkJaXNTdWNjZXNzID0gIWVycm9yOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJLy8gV2UgZXh0cmFjdCBlcnJvciBmcm9tIHN0YXR1c1RleHQKCQkJCS8vIHRoZW4gbm9ybWFsaXplIHN0YXR1c1RleHQgYW5kIHN0YXR1cyBmb3Igbm9uLWFib3J0cwoJCQkJZXJyb3IgPSBzdGF0dXNUZXh0OwoJCQkJaWYgKCAhc3RhdHVzVGV4dCB8fCBzdGF0dXMgKSB7CgkJCQkJc3RhdHVzVGV4dCA9ICJlcnJvciI7CgkJCQkJaWYgKCBzdGF0dXMgPCAwICkgewoJCQkJCQlzdGF0dXMgPSAwOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gU2V0IGRhdGEgZm9yIHRoZSBmYWtlIHhociBvYmplY3QKCQkJanFYSFIuc3RhdHVzID0gc3RhdHVzOwoJCQlqcVhIUi5zdGF0dXNUZXh0ID0gKCBuYXRpdmVTdGF0dXNUZXh0IHx8IHN0YXR1c1RleHQgKSArICIiOwoKCQkJLy8gU3VjY2Vzcy9FcnJvcgoJCQlpZiAoIGlzU3VjY2VzcyApIHsKCQkJCWRlZmVycmVkLnJlc29sdmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsgc3VjY2Vzcywgc3RhdHVzVGV4dCwganFYSFIgXSApOwoJCQl9IGVsc2UgewoJCQkJZGVmZXJyZWQucmVqZWN0V2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0LCBlcnJvciBdICk7CgkJCX0KCgkJCS8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzCgkJCWpxWEhSLnN0YXR1c0NvZGUoIHN0YXR1c0NvZGUgKTsKCQkJc3RhdHVzQ29kZSA9IHVuZGVmaW5lZDsKCgkJCWlmICggZmlyZUdsb2JhbHMgKSB7CgkJCQlnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggImFqYXgiICsgKCBpc1N1Y2Nlc3MgPyAiU3VjY2VzcyIgOiAiRXJyb3IiICksCgkJCQkJCVsganFYSFIsIHMsIGlzU3VjY2VzcyA/IHN1Y2Nlc3MgOiBlcnJvciBdICk7CgkJCX0KCgkJCS8vIENvbXBsZXRlCgkJCWNvbXBsZXRlRGVmZXJyZWQuZmlyZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBqcVhIUiwgc3RhdHVzVGV4dCBdICk7CgoJCQlpZiAoIGZpcmVHbG9iYWxzICkgewoJCQkJZ2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoICJhamF4Q29tcGxldGUiLCBbIGpxWEhSLCBzIF0gKTsKCQkJCS8vIEhhbmRsZSB0aGUgZ2xvYmFsIEFKQVggY291bnRlcgoJCQkJaWYgKCAhKCAtLWpRdWVyeS5hY3RpdmUgKSApIHsKCQkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggImFqYXhTdG9wIiApOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBBdHRhY2ggZGVmZXJyZWRzCgkJZGVmZXJyZWQucHJvbWlzZSgganFYSFIgKTsKCQlqcVhIUi5zdWNjZXNzID0ganFYSFIuZG9uZTsKCQlqcVhIUi5lcnJvciA9IGpxWEhSLmZhaWw7CgkJanFYSFIuY29tcGxldGUgPSBjb21wbGV0ZURlZmVycmVkLmFkZDsKCgkJLy8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3MKCQlqcVhIUi5zdGF0dXNDb2RlID0gZnVuY3Rpb24oIG1hcCApIHsKCQkJaWYgKCBtYXAgKSB7CgkJCQl2YXIgdG1wOwoJCQkJaWYgKCBzdGF0ZSA8IDIgKSB7CgkJCQkJZm9yICggdG1wIGluIG1hcCApIHsKCQkJCQkJc3RhdHVzQ29kZVsgdG1wIF0gPSBbIHN0YXR1c0NvZGVbdG1wXSwgbWFwW3RtcF0gXTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCXRtcCA9IG1hcFsganFYSFIuc3RhdHVzIF07CgkJCQkJanFYSFIuYWx3YXlzKCB0bXAgKTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gdGhpczsKCQl9OwoKCQkvLyBSZW1vdmUgaGFzaCBjaGFyYWN0ZXIgKCM3NTMxOiBhbmQgc3RyaW5nIHByb21vdGlvbikKCQkvLyBBZGQgcHJvdG9jb2wgaWYgbm90IHByb3ZpZGVkICgjNTg2NjogSUU3IGlzc3VlIHdpdGggcHJvdG9jb2wtbGVzcyB1cmxzKQoJCS8vIFdlIGFsc28gdXNlIHRoZSB1cmwgcGFyYW1ldGVyIGlmIGF2YWlsYWJsZQoJCXMudXJsID0gKCAoIHVybCB8fCBzLnVybCApICsgIiIgKS5yZXBsYWNlKCByaGFzaCwgIiIgKS5yZXBsYWNlKCBycHJvdG9jb2wsIGFqYXhMb2NQYXJ0c1sgMSBdICsgIi8vIiApOwoKCQkvLyBFeHRyYWN0IGRhdGFUeXBlcyBsaXN0CgkJcy5kYXRhVHlwZXMgPSBqUXVlcnkudHJpbSggcy5kYXRhVHlwZSB8fCAiKiIgKS50b0xvd2VyQ2FzZSgpLnNwbGl0KCBjb3JlX3JzcGFjZSApOwoKCQkvLyBBIGNyb3NzLWRvbWFpbiByZXF1ZXN0IGlzIGluIG9yZGVyIHdoZW4gd2UgaGF2ZSBhIHByb3RvY29sOmhvc3Q6cG9ydCBtaXNtYXRjaAoJCWlmICggcy5jcm9zc0RvbWFpbiA9PSBudWxsICkgewoJCQlwYXJ0cyA9IHJ1cmwuZXhlYyggcy51cmwudG9Mb3dlckNhc2UoKSApIHx8IGZhbHNlOwoJCQlzLmNyb3NzRG9tYWluID0gcGFydHMgJiYgKCBwYXJ0cy5qb2luKCI6IikgKyAoIHBhcnRzWyAzIF0gPyAiIiA6IHBhcnRzWyAxIF0gPT09ICJodHRwOiIgPyA4MCA6IDQ0MyApICkgIT09CgkJCQkoIGFqYXhMb2NQYXJ0cy5qb2luKCI6IikgKyAoIGFqYXhMb2NQYXJ0c1sgMyBdID8gIiIgOiBhamF4TG9jUGFydHNbIDEgXSA9PT0gImh0dHA6IiA/IDgwIDogNDQzICkgKTsKCQl9CgoJCS8vIENvbnZlcnQgZGF0YSBpZiBub3QgYWxyZWFkeSBhIHN0cmluZwoJCWlmICggcy5kYXRhICYmIHMucHJvY2Vzc0RhdGEgJiYgdHlwZW9mIHMuZGF0YSAhPT0gInN0cmluZyIgKSB7CgkJCXMuZGF0YSA9IGpRdWVyeS5wYXJhbSggcy5kYXRhLCBzLnRyYWRpdGlvbmFsICk7CgkJfQoKCQkvLyBBcHBseSBwcmVmaWx0ZXJzCgkJaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHByZWZpbHRlcnMsIHMsIG9wdGlvbnMsIGpxWEhSICk7CgoJCS8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGEgcHJlZmlsdGVyLCBzdG9wIHRoZXJlCgkJaWYgKCBzdGF0ZSA9PT0gMiApIHsKCQkJcmV0dXJuIGpxWEhSOwoJCX0KCgkJLy8gV2UgY2FuIGZpcmUgZ2xvYmFsIGV2ZW50cyBhcyBvZiBub3cgaWYgYXNrZWQgdG8KCQlmaXJlR2xvYmFscyA9IHMuZ2xvYmFsOwoKCQkvLyBVcHBlcmNhc2UgdGhlIHR5cGUKCQlzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTsKCgkJLy8gRGV0ZXJtaW5lIGlmIHJlcXVlc3QgaGFzIGNvbnRlbnQKCQlzLmhhc0NvbnRlbnQgPSAhcm5vQ29udGVudC50ZXN0KCBzLnR5cGUgKTsKCgkJLy8gV2F0Y2ggZm9yIGEgbmV3IHNldCBvZiByZXF1ZXN0cwoJCWlmICggZmlyZUdsb2JhbHMgJiYgalF1ZXJ5LmFjdGl2ZSsrID09PSAwICkgewoJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggImFqYXhTdGFydCIgKTsKCQl9CgoJCS8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50CgkJaWYgKCAhcy5oYXNDb250ZW50ICkgewoKCQkJLy8gSWYgZGF0YSBpcyBhdmFpbGFibGUsIGFwcGVuZCBkYXRhIHRvIHVybAoJCQlpZiAoIHMuZGF0YSApIHsKCQkJCXMudXJsICs9ICggcnF1ZXJ5LnRlc3QoIHMudXJsICkgPyAiJiIgOiAiPyIgKSArIHMuZGF0YTsKCQkJCS8vICM5NjgyOiByZW1vdmUgZGF0YSBzbyB0aGF0IGl0J3Mgbm90IHVzZWQgaW4gYW4gZXZlbnR1YWwgcmV0cnkKCQkJCWRlbGV0ZSBzLmRhdGE7CgkJCX0KCgkJCS8vIEdldCBpZk1vZGlmaWVkS2V5IGJlZm9yZSBhZGRpbmcgdGhlIGFudGktY2FjaGUgcGFyYW1ldGVyCgkJCWlmTW9kaWZpZWRLZXkgPSBzLnVybDsKCgkJCS8vIEFkZCBhbnRpLWNhY2hlIGluIHVybCBpZiBuZWVkZWQKCQkJaWYgKCBzLmNhY2hlID09PSBmYWxzZSApIHsKCgkJCQl2YXIgdHMgPSBqUXVlcnkubm93KCksCgkJCQkJLy8gdHJ5IHJlcGxhY2luZyBfPSBpZiBpdCBpcyB0aGVyZQoJCQkJCXJldCA9IHMudXJsLnJlcGxhY2UoIHJ0cywgIiQxXz0iICsgdHMgKTsKCgkJCQkvLyBpZiBub3RoaW5nIHdhcyByZXBsYWNlZCwgYWRkIHRpbWVzdGFtcCB0byB0aGUgZW5kCgkJCQlzLnVybCA9IHJldCArICggKCByZXQgPT09IHMudXJsICkgPyAoIHJxdWVyeS50ZXN0KCBzLnVybCApID8gIiYiIDogIj8iICkgKyAiXz0iICsgdHMgOiAiIiApOwoJCQl9CgkJfQoKCQkvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnQKCQlpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHsKCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIkNvbnRlbnQtVHlwZSIsIHMuY29udGVudFR5cGUgKTsKCQl9CgoJCS8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuCgkJaWYgKCBzLmlmTW9kaWZpZWQgKSB7CgkJCWlmTW9kaWZpZWRLZXkgPSBpZk1vZGlmaWVkS2V5IHx8IHMudXJsOwoJCQlpZiAoIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGlmTW9kaWZpZWRLZXkgXSApIHsKCQkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Nb2RpZmllZC1TaW5jZSIsIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGlmTW9kaWZpZWRLZXkgXSApOwoJCQl9CgkJCWlmICggalF1ZXJ5LmV0YWdbIGlmTW9kaWZpZWRLZXkgXSApIHsKCQkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Ob25lLU1hdGNoIiwgalF1ZXJ5LmV0YWdbIGlmTW9kaWZpZWRLZXkgXSApOwoJCQl9CgkJfQoKCQkvLyBTZXQgdGhlIEFjY2VwdHMgaGVhZGVyIGZvciB0aGUgc2VydmVyLCBkZXBlbmRpbmcgb24gdGhlIGRhdGFUeXBlCgkJanFYSFIuc2V0UmVxdWVzdEhlYWRlcigKCQkJIkFjY2VwdCIsCgkJCXMuZGF0YVR5cGVzWyAwIF0gJiYgcy5hY2NlcHRzWyBzLmRhdGFUeXBlc1swXSBdID8KCQkJCXMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbMF0gXSArICggcy5kYXRhVHlwZXNbIDAgXSAhPT0gIioiID8gIiwgIiArIGFsbFR5cGVzICsgIjsgcT0wLjAxIiA6ICIiICkgOgoJCQkJcy5hY2NlcHRzWyAiKiIgXQoJCSk7CgoJCS8vIENoZWNrIGZvciBoZWFkZXJzIG9wdGlvbgoJCWZvciAoIGkgaW4gcy5oZWFkZXJzICkgewoJCQlqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApOwoJCX0KCgkJLy8gQWxsb3cgY3VzdG9tIGhlYWRlcnMvbWltZXR5cGVzIGFuZCBlYXJseSBhYm9ydAoJCWlmICggcy5iZWZvcmVTZW5kICYmICggcy5iZWZvcmVTZW5kLmNhbGwoIGNhbGxiYWNrQ29udGV4dCwganFYSFIsIHMgKSA9PT0gZmFsc2UgfHwgc3RhdGUgPT09IDIgKSApIHsKCQkJCS8vIEFib3J0IGlmIG5vdCBkb25lIGFscmVhZHkgYW5kIHJldHVybgoJCQkJcmV0dXJuIGpxWEhSLmFib3J0KCk7CgoJCX0KCgkJLy8gYWJvcnRpbmcgaXMgbm8gbG9uZ2VyIGEgY2FuY2VsbGF0aW9uCgkJc3RyQWJvcnQgPSAiYWJvcnQiOwoKCQkvLyBJbnN0YWxsIGNhbGxiYWNrcyBvbiBkZWZlcnJlZHMKCQlmb3IgKCBpIGluIHsgc3VjY2VzczogMSwgZXJyb3I6IDEsIGNvbXBsZXRlOiAxIH0gKSB7CgkJCWpxWEhSWyBpIF0oIHNbIGkgXSApOwoJCX0KCgkJLy8gR2V0IHRyYW5zcG9ydAoJCXRyYW5zcG9ydCA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzLCBzLCBvcHRpb25zLCBqcVhIUiApOwoKCQkvLyBJZiBubyB0cmFuc3BvcnQsIHdlIGF1dG8tYWJvcnQKCQlpZiAoICF0cmFuc3BvcnQgKSB7CgkJCWRvbmUoIC0xLCAiTm8gVHJhbnNwb3J0IiApOwoJCX0gZWxzZSB7CgkJCWpxWEhSLnJlYWR5U3RhdGUgPSAxOwoJCQkvLyBTZW5kIGdsb2JhbCBldmVudAoJCQlpZiAoIGZpcmVHbG9iYWxzICkgewoJCQkJZ2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoICJhamF4U2VuZCIsIFsganFYSFIsIHMgXSApOwoJCQl9CgkJCS8vIFRpbWVvdXQKCQkJaWYgKCBzLmFzeW5jICYmIHMudGltZW91dCA+IDAgKSB7CgkJCQl0aW1lb3V0VGltZXIgPSBzZXRUaW1lb3V0KCBmdW5jdGlvbigpewoJCQkJCWpxWEhSLmFib3J0KCAidGltZW91dCIgKTsKCQkJCX0sIHMudGltZW91dCApOwoJCQl9CgoJCQl0cnkgewoJCQkJc3RhdGUgPSAxOwoJCQkJdHJhbnNwb3J0LnNlbmQoIHJlcXVlc3RIZWFkZXJzLCBkb25lICk7CgkJCX0gY2F0Y2ggKGUpIHsKCQkJCS8vIFByb3BhZ2F0ZSBleGNlcHRpb24gYXMgZXJyb3IgaWYgbm90IGRvbmUKCQkJCWlmICggc3RhdGUgPCAyICkgewoJCQkJCWRvbmUoIC0xLCBlICk7CgkJCQkvLyBTaW1wbHkgcmV0aHJvdyBvdGhlcndpc2UKCQkJCX0gZWxzZSB7CgkJCQkJdGhyb3cgZTsKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIGpxWEhSOwoJfSwKCgkvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXMKCWFjdGl2ZTogMCwKCgkvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0CglsYXN0TW9kaWZpZWQ6IHt9LAoJZXRhZzoge30KCn0pOwoKLyogSGFuZGxlcyByZXNwb25zZXMgdG8gYW4gYWpheCByZXF1ZXN0OgogKiAtIHNldHMgYWxsIHJlc3BvbnNlWFhYIGZpZWxkcyBhY2NvcmRpbmdseQogKiAtIGZpbmRzIHRoZSByaWdodCBkYXRhVHlwZSAobWVkaWF0ZXMgYmV0d2VlbiBjb250ZW50LXR5cGUgYW5kIGV4cGVjdGVkIGRhdGFUeXBlKQogKiAtIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UKICovCmZ1bmN0aW9uIGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKSB7CgoJdmFyIGN0LCB0eXBlLCBmaW5hbERhdGFUeXBlLCBmaXJzdERhdGFUeXBlLAoJCWNvbnRlbnRzID0gcy5jb250ZW50cywKCQlkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcywKCQlyZXNwb25zZUZpZWxkcyA9IHMucmVzcG9uc2VGaWVsZHM7CgoJLy8gRmlsbCByZXNwb25zZVhYWCBmaWVsZHMKCWZvciAoIHR5cGUgaW4gcmVzcG9uc2VGaWVsZHMgKSB7CgkJaWYgKCB0eXBlIGluIHJlc3BvbnNlcyApIHsKCQkJanFYSFJbIHJlc3BvbnNlRmllbGRzW3R5cGVdIF0gPSByZXNwb25zZXNbIHR5cGUgXTsKCQl9Cgl9CgoJLy8gUmVtb3ZlIGF1dG8gZGF0YVR5cGUgYW5kIGdldCBjb250ZW50LXR5cGUgaW4gdGhlIHByb2Nlc3MKCXdoaWxlKCBkYXRhVHlwZXNbIDAgXSA9PT0gIioiICkgewoJCWRhdGFUeXBlcy5zaGlmdCgpOwoJCWlmICggY3QgPT09IHVuZGVmaW5lZCApIHsKCQkJY3QgPSBzLm1pbWVUeXBlIHx8IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCAiY29udGVudC10eXBlIiApOwoJCX0KCX0KCgkvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBrbm93biBjb250ZW50LXR5cGUKCWlmICggY3QgKSB7CgkJZm9yICggdHlwZSBpbiBjb250ZW50cyApIHsKCQkJaWYgKCBjb250ZW50c1sgdHlwZSBdICYmIGNvbnRlbnRzWyB0eXBlIF0udGVzdCggY3QgKSApIHsKCQkJCWRhdGFUeXBlcy51bnNoaWZ0KCB0eXBlICk7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KCgkvLyBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIHJlc3BvbnNlIGZvciB0aGUgZXhwZWN0ZWQgZGF0YVR5cGUKCWlmICggZGF0YVR5cGVzWyAwIF0gaW4gcmVzcG9uc2VzICkgewoJCWZpbmFsRGF0YVR5cGUgPSBkYXRhVHlwZXNbIDAgXTsKCX0gZWxzZSB7CgkJLy8gVHJ5IGNvbnZlcnRpYmxlIGRhdGFUeXBlcwoJCWZvciAoIHR5cGUgaW4gcmVzcG9uc2VzICkgewoJCQlpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5cGUgKyAiICIgKyBkYXRhVHlwZXNbMF0gXSApIHsKCQkJCWZpbmFsRGF0YVR5cGUgPSB0eXBlOwoJCQkJYnJlYWs7CgkJCX0KCQkJaWYgKCAhZmlyc3REYXRhVHlwZSApIHsKCQkJCWZpcnN0RGF0YVR5cGUgPSB0eXBlOwoJCQl9CgkJfQoJCS8vIE9yIGp1c3QgdXNlIGZpcnN0IG9uZQoJCWZpbmFsRGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlIHx8IGZpcnN0RGF0YVR5cGU7Cgl9CgoJLy8gSWYgd2UgZm91bmQgYSBkYXRhVHlwZQoJLy8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWQKCS8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UKCWlmICggZmluYWxEYXRhVHlwZSApIHsKCQlpZiAoIGZpbmFsRGF0YVR5cGUgIT09IGRhdGFUeXBlc1sgMCBdICkgewoJCQlkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlwZSApOwoJCX0KCQlyZXR1cm4gcmVzcG9uc2VzWyBmaW5hbERhdGFUeXBlIF07Cgl9Cn0KCi8vIENoYWluIGNvbnZlcnNpb25zIGdpdmVuIHRoZSByZXF1ZXN0IGFuZCB0aGUgb3JpZ2luYWwgcmVzcG9uc2UKZnVuY3Rpb24gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlICkgewoKCXZhciBjb252LCBjb252MiwgY3VycmVudCwgdG1wLAoJCS8vIFdvcmsgd2l0aCBhIGNvcHkgb2YgZGF0YVR5cGVzIGluIGNhc2Ugd2UgbmVlZCB0byBtb2RpZnkgaXQgZm9yIGNvbnZlcnNpb24KCQlkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcy5zbGljZSgpLAoJCXByZXYgPSBkYXRhVHlwZXNbIDAgXSwKCQljb252ZXJ0ZXJzID0ge30sCgkJaSA9IDA7CgoJLy8gQXBwbHkgdGhlIGRhdGFGaWx0ZXIgaWYgcHJvdmlkZWQKCWlmICggcy5kYXRhRmlsdGVyICkgewoJCXJlc3BvbnNlID0gcy5kYXRhRmlsdGVyKCByZXNwb25zZSwgcy5kYXRhVHlwZSApOwoJfQoKCS8vIENyZWF0ZSBjb252ZXJ0ZXJzIG1hcCB3aXRoIGxvd2VyY2FzZWQga2V5cwoJaWYgKCBkYXRhVHlwZXNbIDEgXSApIHsKCQlmb3IgKCBjb252IGluIHMuY29udmVydGVycyApIHsKCQkJY29udmVydGVyc1sgY29udi50b0xvd2VyQ2FzZSgpIF0gPSBzLmNvbnZlcnRlcnNbIGNvbnYgXTsKCQl9Cgl9CgoJLy8gQ29udmVydCB0byBlYWNoIHNlcXVlbnRpYWwgZGF0YVR5cGUsIHRvbGVyYXRpbmcgbGlzdCBtb2RpZmljYXRpb24KCWZvciAoIDsgKGN1cnJlbnQgPSBkYXRhVHlwZXNbKytpXSk7ICkgewoKCQkvLyBUaGVyZSdzIG9ubHkgd29yayB0byBkbyBpZiBjdXJyZW50IGRhdGFUeXBlIGlzIG5vbi1hdXRvCgkJaWYgKCBjdXJyZW50ICE9PSAiKiIgKSB7CgoJCQkvLyBDb252ZXJ0IHJlc3BvbnNlIGlmIHByZXYgZGF0YVR5cGUgaXMgbm9uLWF1dG8gYW5kIGRpZmZlcnMgZnJvbSBjdXJyZW50CgkJCWlmICggcHJldiAhPT0gIioiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7CgoJCQkJLy8gU2VlayBhIGRpcmVjdCBjb252ZXJ0ZXIKCQkJCWNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgIiAiICsgY3VycmVudCBdIHx8IGNvbnZlcnRlcnNbICIqICIgKyBjdXJyZW50IF07CgoJCQkJLy8gSWYgbm9uZSBmb3VuZCwgc2VlayBhIHBhaXIKCQkJCWlmICggIWNvbnYgKSB7CgkJCQkJZm9yICggY29udjIgaW4gY29udmVydGVycyApIHsKCgkJCQkJCS8vIElmIGNvbnYyIG91dHB1dHMgY3VycmVudAoJCQkJCQl0bXAgPSBjb252Mi5zcGxpdCgiICIpOwoJCQkJCQlpZiAoIHRtcFsgMSBdID09PSBjdXJyZW50ICkgewoKCQkJCQkJCS8vIElmIHByZXYgY2FuIGJlIGNvbnZlcnRlZCB0byBhY2NlcHRlZCBpbnB1dAoJCQkJCQkJY29udiA9IGNvbnZlcnRlcnNbIHByZXYgKyAiICIgKyB0bXBbIDAgXSBdIHx8CgkJCQkJCQkJY29udmVydGVyc1sgIiogIiArIHRtcFsgMCBdIF07CgkJCQkJCQlpZiAoIGNvbnYgKSB7CgkJCQkJCQkJLy8gQ29uZGVuc2UgZXF1aXZhbGVuY2UgY29udmVydGVycwoJCQkJCQkJCWlmICggY29udiA9PT0gdHJ1ZSApIHsKCQkJCQkJCQkJY29udiA9IGNvbnZlcnRlcnNbIGNvbnYyIF07CgoJCQkJCQkJCS8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0YVR5cGUKCQkJCQkJCQl9IGVsc2UgaWYgKCBjb252ZXJ0ZXJzWyBjb252MiBdICE9PSB0cnVlICkgewoJCQkJCQkJCQljdXJyZW50ID0gdG1wWyAwIF07CgkJCQkJCQkJCWRhdGFUeXBlcy5zcGxpY2UoIGktLSwgMCwgY3VycmVudCApOwoJCQkJCQkJCX0KCgkJCQkJCQkJYnJlYWs7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgoJCQkJLy8gQXBwbHkgY29udmVydGVyIChpZiBub3QgYW4gZXF1aXZhbGVuY2UpCgkJCQlpZiAoIGNvbnYgIT09IHRydWUgKSB7CgoJCQkJCS8vIFVubGVzcyBlcnJvcnMgYXJlIGFsbG93ZWQgdG8gYnViYmxlLCBjYXRjaCBhbmQgcmV0dXJuIHRoZW0KCQkJCQlpZiAoIGNvbnYgJiYgc1sidGhyb3dzIl0gKSB7CgkJCQkJCXJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQl0cnkgewoJCQkJCQkJcmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApOwoJCQkJCQl9IGNhdGNoICggZSApIHsKCQkJCQkJCXJldHVybiB7IHN0YXRlOiAicGFyc2VyZXJyb3IiLCBlcnJvcjogY29udiA/IGUgOiAiTm8gY29udmVyc2lvbiBmcm9tICIgKyBwcmV2ICsgIiB0byAiICsgY3VycmVudCB9OwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQkvLyBVcGRhdGUgcHJldiBmb3IgbmV4dCBpdGVyYXRpb24KCQkJcHJldiA9IGN1cnJlbnQ7CgkJfQoJfQoKCXJldHVybiB7IHN0YXRlOiAic3VjY2VzcyIsIGRhdGE6IHJlc3BvbnNlIH07Cn0KdmFyIG9sZENhbGxiYWNrcyA9IFtdLAoJcnF1ZXN0aW9uID0gL1w/LywKCXJqc29ucCA9IC8oPSlcPyg/PSZ8JCl8XD9cPy8sCglub25jZSA9IGpRdWVyeS5ub3coKTsKCi8vIERlZmF1bHQganNvbnAgc2V0dGluZ3MKalF1ZXJ5LmFqYXhTZXR1cCh7Cglqc29ucDogImNhbGxiYWNrIiwKCWpzb25wQ2FsbGJhY2s6IGZ1bmN0aW9uKCkgewoJCXZhciBjYWxsYmFjayA9IG9sZENhbGxiYWNrcy5wb3AoKSB8fCAoIGpRdWVyeS5leHBhbmRvICsgIl8iICsgKCBub25jZSsrICkgKTsKCQl0aGlzWyBjYWxsYmFjayBdID0gdHJ1ZTsKCQlyZXR1cm4gY2FsbGJhY2s7Cgl9Cn0pOwoKLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzCmpRdWVyeS5hamF4UHJlZmlsdGVyKCAianNvbiBqc29ucCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHsKCgl2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsCgkJZGF0YSA9IHMuZGF0YSwKCQl1cmwgPSBzLnVybCwKCQloYXNDYWxsYmFjayA9IHMuanNvbnAgIT09IGZhbHNlLAoJCXJlcGxhY2VJblVybCA9IGhhc0NhbGxiYWNrICYmIHJqc29ucC50ZXN0KCB1cmwgKSwKCQlyZXBsYWNlSW5EYXRhID0gaGFzQ2FsbGJhY2sgJiYgIXJlcGxhY2VJblVybCAmJiB0eXBlb2YgZGF0YSA9PT0gInN0cmluZyIgJiYKCQkJISggcy5jb250ZW50VHlwZSB8fCAiIiApLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpICYmCgkJCXJqc29ucC50ZXN0KCBkYXRhICk7CgoJLy8gSGFuZGxlIGlmZiB0aGUgZXhwZWN0ZWQgZGF0YSB0eXBlIGlzICJqc29ucCIgb3Igd2UgaGF2ZSBhIHBhcmFtZXRlciB0byBzZXQKCWlmICggcy5kYXRhVHlwZXNbIDAgXSA9PT0gImpzb25wIiB8fCByZXBsYWNlSW5VcmwgfHwgcmVwbGFjZUluRGF0YSApIHsKCgkJLy8gR2V0IGNhbGxiYWNrIG5hbWUsIHJlbWVtYmVyaW5nIHByZWV4aXN0aW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBpdAoJCWNhbGxiYWNrTmFtZSA9IHMuanNvbnBDYWxsYmFjayA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBzLmpzb25wQ2FsbGJhY2sgKSA/CgkJCXMuanNvbnBDYWxsYmFjaygpIDoKCQkJcy5qc29ucENhbGxiYWNrOwoJCW92ZXJ3cml0dGVuID0gd2luZG93WyBjYWxsYmFja05hbWUgXTsKCgkJLy8gSW5zZXJ0IGNhbGxiYWNrIGludG8gdXJsIG9yIGZvcm0gZGF0YQoJCWlmICggcmVwbGFjZUluVXJsICkgewoJCQlzLnVybCA9IHVybC5yZXBsYWNlKCByanNvbnAsICIkMSIgKyBjYWxsYmFja05hbWUgKTsKCQl9IGVsc2UgaWYgKCByZXBsYWNlSW5EYXRhICkgewoJCQlzLmRhdGEgPSBkYXRhLnJlcGxhY2UoIHJqc29ucCwgIiQxIiArIGNhbGxiYWNrTmFtZSApOwoJCX0gZWxzZSBpZiAoIGhhc0NhbGxiYWNrICkgewoJCQlzLnVybCArPSAoIHJxdWVzdGlvbi50ZXN0KCB1cmwgKSA/ICImIiA6ICI/IiApICsgcy5qc29ucCArICI9IiArIGNhbGxiYWNrTmFtZTsKCQl9CgoJCS8vIFVzZSBkYXRhIGNvbnZlcnRlciB0byByZXRyaWV2ZSBqc29uIGFmdGVyIHNjcmlwdCBleGVjdXRpb24KCQlzLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl0gPSBmdW5jdGlvbigpIHsKCQkJaWYgKCAhcmVzcG9uc2VDb250YWluZXIgKSB7CgkJCQlqUXVlcnkuZXJyb3IoIGNhbGxiYWNrTmFtZSArICIgd2FzIG5vdCBjYWxsZWQiICk7CgkJCX0KCQkJcmV0dXJuIHJlc3BvbnNlQ29udGFpbmVyWyAwIF07CgkJfTsKCgkJLy8gZm9yY2UganNvbiBkYXRhVHlwZQoJCXMuZGF0YVR5cGVzWyAwIF0gPSAianNvbiI7CgoJCS8vIEluc3RhbGwgY2FsbGJhY2sKCQl3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gZnVuY3Rpb24oKSB7CgkJCXJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzOwoJCX07CgoJCS8vIENsZWFuLXVwIGZ1bmN0aW9uIChmaXJlcyBhZnRlciBjb252ZXJ0ZXJzKQoJCWpxWEhSLmFsd2F5cyhmdW5jdGlvbigpIHsKCQkJLy8gUmVzdG9yZSBwcmVleGlzdGluZyB2YWx1ZQoJCQl3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gb3ZlcndyaXR0ZW47CgoJCQkvLyBTYXZlIGJhY2sgYXMgZnJlZQoJCQlpZiAoIHNbIGNhbGxiYWNrTmFtZSBdICkgewoJCQkJLy8gbWFrZSBzdXJlIHRoYXQgcmUtdXNpbmcgdGhlIG9wdGlvbnMgZG9lc24ndCBzY3JldyB0aGluZ3MgYXJvdW5kCgkJCQlzLmpzb25wQ2FsbGJhY2sgPSBvcmlnaW5hbFNldHRpbmdzLmpzb25wQ2FsbGJhY2s7CgoJCQkJLy8gc2F2ZSB0aGUgY2FsbGJhY2sgbmFtZSBmb3IgZnV0dXJlIHVzZQoJCQkJb2xkQ2FsbGJhY2tzLnB1c2goIGNhbGxiYWNrTmFtZSApOwoJCQl9CgoJCQkvLyBDYWxsIGlmIGl0IHdhcyBhIGZ1bmN0aW9uIGFuZCB3ZSBoYXZlIGEgcmVzcG9uc2UKCQkJaWYgKCByZXNwb25zZUNvbnRhaW5lciAmJiBqUXVlcnkuaXNGdW5jdGlvbiggb3ZlcndyaXR0ZW4gKSApIHsKCQkJCW92ZXJ3cml0dGVuKCByZXNwb25zZUNvbnRhaW5lclsgMCBdICk7CgkJCX0KCgkJCXJlc3BvbnNlQ29udGFpbmVyID0gb3ZlcndyaXR0ZW4gPSB1bmRlZmluZWQ7CgkJfSk7CgoJCS8vIERlbGVnYXRlIHRvIHNjcmlwdAoJCXJldHVybiAic2NyaXB0IjsKCX0KfSk7Ci8vIEluc3RhbGwgc2NyaXB0IGRhdGFUeXBlCmpRdWVyeS5hamF4U2V0dXAoewoJYWNjZXB0czogewoJCXNjcmlwdDogInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0IgoJfSwKCWNvbnRlbnRzOiB7CgkJc2NyaXB0OiAvamF2YXNjcmlwdHxlY21hc2NyaXB0LwoJfSwKCWNvbnZlcnRlcnM6IHsKCQkidGV4dCBzY3JpcHQiOiBmdW5jdGlvbiggdGV4dCApIHsKCQkJalF1ZXJ5Lmdsb2JhbEV2YWwoIHRleHQgKTsKCQkJcmV0dXJuIHRleHQ7CgkJfQoJfQp9KTsKCi8vIEhhbmRsZSBjYWNoZSdzIHNwZWNpYWwgY2FzZSBhbmQgZ2xvYmFsCmpRdWVyeS5hamF4UHJlZmlsdGVyKCAic2NyaXB0IiwgZnVuY3Rpb24oIHMgKSB7CglpZiAoIHMuY2FjaGUgPT09IHVuZGVmaW5lZCApIHsKCQlzLmNhY2hlID0gZmFsc2U7Cgl9CglpZiAoIHMuY3Jvc3NEb21haW4gKSB7CgkJcy50eXBlID0gIkdFVCI7CgkJcy5nbG9iYWwgPSBmYWxzZTsKCX0KfSk7CgovLyBCaW5kIHNjcmlwdCB0YWcgaGFjayB0cmFuc3BvcnQKalF1ZXJ5LmFqYXhUcmFuc3BvcnQoICJzY3JpcHQiLCBmdW5jdGlvbihzKSB7CgoJLy8gVGhpcyB0cmFuc3BvcnQgb25seSBkZWFscyB3aXRoIGNyb3NzIGRvbWFpbiByZXF1ZXN0cwoJaWYgKCBzLmNyb3NzRG9tYWluICkgewoKCQl2YXIgc2NyaXB0LAoJCQloZWFkID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggImhlYWQiIClbMF0gfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwoKCQlyZXR1cm4gewoKCQkJc2VuZDogZnVuY3Rpb24oIF8sIGNhbGxiYWNrICkgewoKCQkJCXNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzY3JpcHQiICk7CgoJCQkJc2NyaXB0LmFzeW5jID0gImFzeW5jIjsKCgkJCQlpZiAoIHMuc2NyaXB0Q2hhcnNldCApIHsKCQkJCQlzY3JpcHQuY2hhcnNldCA9IHMuc2NyaXB0Q2hhcnNldDsKCQkJCX0KCgkJCQlzY3JpcHQuc3JjID0gcy51cmw7CgoJCQkJLy8gQXR0YWNoIGhhbmRsZXJzIGZvciBhbGwgYnJvd3NlcnMKCQkJCXNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oIF8sIGlzQWJvcnQgKSB7CgoJCQkJCWlmICggaXNBYm9ydCB8fCAhc2NyaXB0LnJlYWR5U3RhdGUgfHwgL2xvYWRlZHxjb21wbGV0ZS8udGVzdCggc2NyaXB0LnJlYWR5U3RhdGUgKSApIHsKCgkJCQkJCS8vIEhhbmRsZSBtZW1vcnkgbGVhayBpbiBJRQoJCQkJCQlzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7CgoJCQkJCQkvLyBSZW1vdmUgdGhlIHNjcmlwdAoJCQkJCQlpZiAoIGhlYWQgJiYgc2NyaXB0LnBhcmVudE5vZGUgKSB7CgkJCQkJCQloZWFkLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTsKCQkJCQkJfQoKCQkJCQkJLy8gRGVyZWZlcmVuY2UgdGhlIHNjcmlwdAoJCQkJCQlzY3JpcHQgPSB1bmRlZmluZWQ7CgoJCQkJCQkvLyBDYWxsYmFjayBpZiBub3QgYWJvcnQKCQkJCQkJaWYgKCAhaXNBYm9ydCApIHsKCQkJCQkJCWNhbGxiYWNrKCAyMDAsICJzdWNjZXNzIiApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfTsKCQkJCS8vIFVzZSBpbnNlcnRCZWZvcmUgaW5zdGVhZCBvZiBhcHBlbmRDaGlsZCAgdG8gY2lyY3VtdmVudCBhbiBJRTYgYnVnLgoJCQkJLy8gVGhpcyBhcmlzZXMgd2hlbiBhIGJhc2Ugbm9kZSBpcyB1c2VkICgjMjcwOSBhbmQgIzQzNzgpLgoJCQkJaGVhZC5pbnNlcnRCZWZvcmUoIHNjcmlwdCwgaGVhZC5maXJzdENoaWxkICk7CgkJCX0sCgoJCQlhYm9ydDogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIHNjcmlwdCApIHsKCQkJCQlzY3JpcHQub25sb2FkKCAwLCAxICk7CgkJCQl9CgkJCX0KCQl9OwoJfQp9KTsKdmFyIHhockNhbGxiYWNrcywKCS8vICM1MjgwOiBJbnRlcm5ldCBFeHBsb3JlciB3aWxsIGtlZXAgY29ubmVjdGlvbnMgYWxpdmUgaWYgd2UgZG9uJ3QgYWJvcnQgb24gdW5sb2FkCgl4aHJPblVubG9hZEFib3J0ID0gd2luZG93LkFjdGl2ZVhPYmplY3QgPyBmdW5jdGlvbigpIHsKCQkvLyBBYm9ydCBhbGwgcGVuZGluZyByZXF1ZXN0cwoJCWZvciAoIHZhciBrZXkgaW4geGhyQ2FsbGJhY2tzICkgewoJCQl4aHJDYWxsYmFja3NbIGtleSBdKCAwLCAxICk7CgkJfQoJfSA6IGZhbHNlLAoJeGhySWQgPSAwOwoKLy8gRnVuY3Rpb25zIHRvIGNyZWF0ZSB4aHJzCmZ1bmN0aW9uIGNyZWF0ZVN0YW5kYXJkWEhSKCkgewoJdHJ5IHsKCQlyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpOwoJfSBjYXRjaCggZSApIHt9Cn0KCmZ1bmN0aW9uIGNyZWF0ZUFjdGl2ZVhIUigpIHsKCXRyeSB7CgkJcmV0dXJuIG5ldyB3aW5kb3cuQWN0aXZlWE9iamVjdCggIk1pY3Jvc29mdC5YTUxIVFRQIiApOwoJfSBjYXRjaCggZSApIHt9Cn0KCi8vIENyZWF0ZSB0aGUgcmVxdWVzdCBvYmplY3QKLy8gKFRoaXMgaXMgc3RpbGwgYXR0YWNoZWQgdG8gYWpheFNldHRpbmdzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KQpqUXVlcnkuYWpheFNldHRpbmdzLnhociA9IHdpbmRvdy5BY3RpdmVYT2JqZWN0ID8KCS8qIE1pY3Jvc29mdCBmYWlsZWQgdG8gcHJvcGVybHkKCSAqIGltcGxlbWVudCB0aGUgWE1MSHR0cFJlcXVlc3QgaW4gSUU3IChjYW4ndCByZXF1ZXN0IGxvY2FsIGZpbGVzKSwKCSAqIHNvIHdlIHVzZSB0aGUgQWN0aXZlWE9iamVjdCB3aGVuIGl0IGlzIGF2YWlsYWJsZQoJICogQWRkaXRpb25hbGx5IFhNTEh0dHBSZXF1ZXN0IGNhbiBiZSBkaXNhYmxlZCBpbiBJRTcvSUU4IHNvCgkgKiB3ZSBuZWVkIGEgZmFsbGJhY2suCgkgKi8KCWZ1bmN0aW9uKCkgewoJCXJldHVybiAhdGhpcy5pc0xvY2FsICYmIGNyZWF0ZVN0YW5kYXJkWEhSKCkgfHwgY3JlYXRlQWN0aXZlWEhSKCk7Cgl9IDoKCS8vIEZvciBhbGwgb3RoZXIgYnJvd3NlcnMsIHVzZSB0aGUgc3RhbmRhcmQgWE1MSHR0cFJlcXVlc3Qgb2JqZWN0CgljcmVhdGVTdGFuZGFyZFhIUjsKCi8vIERldGVybWluZSBzdXBwb3J0IHByb3BlcnRpZXMKKGZ1bmN0aW9uKCB4aHIgKSB7CglqUXVlcnkuZXh0ZW5kKCBqUXVlcnkuc3VwcG9ydCwgewoJCWFqYXg6ICEheGhyLAoJCWNvcnM6ICEheGhyICYmICggIndpdGhDcmVkZW50aWFscyIgaW4geGhyICkKCX0pOwp9KSggalF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIoKSApOwoKLy8gQ3JlYXRlIHRyYW5zcG9ydCBpZiB0aGUgYnJvd3NlciBjYW4gcHJvdmlkZSBhbiB4aHIKaWYgKCBqUXVlcnkuc3VwcG9ydC5hamF4ICkgewoKCWpRdWVyeS5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKCBzICkgewoJCS8vIENyb3NzIGRvbWFpbiBvbmx5IGFsbG93ZWQgaWYgc3VwcG9ydGVkIHRocm91Z2ggWE1MSHR0cFJlcXVlc3QKCQlpZiAoICFzLmNyb3NzRG9tYWluIHx8IGpRdWVyeS5zdXBwb3J0LmNvcnMgKSB7CgoJCQl2YXIgY2FsbGJhY2s7CgoJCQlyZXR1cm4gewoJCQkJc2VuZDogZnVuY3Rpb24oIGhlYWRlcnMsIGNvbXBsZXRlICkgewoKCQkJCQkvLyBHZXQgYSBuZXcgeGhyCgkJCQkJdmFyIGhhbmRsZSwgaSwKCQkJCQkJeGhyID0gcy54aHIoKTsKCgkJCQkJLy8gT3BlbiB0aGUgc29ja2V0CgkJCQkJLy8gUGFzc2luZyBudWxsIHVzZXJuYW1lLCBnZW5lcmF0ZXMgYSBsb2dpbiBwb3B1cCBvbiBPcGVyYSAoIzI4NjUpCgkJCQkJaWYgKCBzLnVzZXJuYW1lICkgewoJCQkJCQl4aHIub3Blbiggcy50eXBlLCBzLnVybCwgcy5hc3luYywgcy51c2VybmFtZSwgcy5wYXNzd29yZCApOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXhoci5vcGVuKCBzLnR5cGUsIHMudXJsLCBzLmFzeW5jICk7CgkJCQkJfQoKCQkJCQkvLyBBcHBseSBjdXN0b20gZmllbGRzIGlmIHByb3ZpZGVkCgkJCQkJaWYgKCBzLnhockZpZWxkcyApIHsKCQkJCQkJZm9yICggaSBpbiBzLnhockZpZWxkcyApIHsKCQkJCQkJCXhoclsgaSBdID0gcy54aHJGaWVsZHNbIGkgXTsKCQkJCQkJfQoJCQkJCX0KCgkJCQkJLy8gT3ZlcnJpZGUgbWltZSB0eXBlIGlmIG5lZWRlZAoJCQkJCWlmICggcy5taW1lVHlwZSAmJiB4aHIub3ZlcnJpZGVNaW1lVHlwZSApIHsKCQkJCQkJeGhyLm92ZXJyaWRlTWltZVR5cGUoIHMubWltZVR5cGUgKTsKCQkJCQl9CgoJCQkJCS8vIFgtUmVxdWVzdGVkLVdpdGggaGVhZGVyCgkJCQkJLy8gRm9yIGNyb3NzLWRvbWFpbiByZXF1ZXN0cywgc2VlaW5nIGFzIGNvbmRpdGlvbnMgZm9yIGEgcHJlZmxpZ2h0IGFyZQoJCQkJCS8vIGFraW4gdG8gYSBqaWdzYXcgcHV6emxlLCB3ZSBzaW1wbHkgbmV2ZXIgc2V0IGl0IHRvIGJlIHN1cmUuCgkJCQkJLy8gKGl0IGNhbiBhbHdheXMgYmUgc2V0IG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgb3IgZXZlbiB1c2luZyBhamF4U2V0dXApCgkJCQkJLy8gRm9yIHNhbWUtZG9tYWluIHJlcXVlc3RzLCB3b24ndCBjaGFuZ2UgaGVhZGVyIGlmIGFscmVhZHkgcHJvdmlkZWQuCgkJCQkJaWYgKCAhcy5jcm9zc0RvbWFpbiAmJiAhaGVhZGVyc1siWC1SZXF1ZXN0ZWQtV2l0aCJdICkgewoJCQkJCQloZWFkZXJzWyAiWC1SZXF1ZXN0ZWQtV2l0aCIgXSA9ICJYTUxIdHRwUmVxdWVzdCI7CgkJCQkJfQoKCQkJCQkvLyBOZWVkIGFuIGV4dHJhIHRyeS9jYXRjaCBmb3IgY3Jvc3MgZG9tYWluIHJlcXVlc3RzIGluIEZpcmVmb3ggMwoJCQkJCXRyeSB7CgkJCQkJCWZvciAoIGkgaW4gaGVhZGVycyApIHsKCQkJCQkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTsKCQkJCQkJfQoJCQkJCX0gY2F0Y2goIF8gKSB7fQoKCQkJCQkvLyBEbyBzZW5kIHRoZSByZXF1ZXN0CgkJCQkJLy8gVGhpcyBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uIHdoaWNoIGlzIGFjdHVhbGx5CgkJCQkJLy8gaGFuZGxlZCBpbiBqUXVlcnkuYWpheCAoc28gbm8gdHJ5L2NhdGNoIGhlcmUpCgkJCQkJeGhyLnNlbmQoICggcy5oYXNDb250ZW50ICYmIHMuZGF0YSApIHx8IG51bGwgKTsKCgkJCQkJLy8gTGlzdGVuZXIKCQkJCQljYWxsYmFjayA9IGZ1bmN0aW9uKCBfLCBpc0Fib3J0ICkgewoKCQkJCQkJdmFyIHN0YXR1cywKCQkJCQkJCXN0YXR1c1RleHQsCgkJCQkJCQlyZXNwb25zZUhlYWRlcnMsCgkJCQkJCQlyZXNwb25zZXMsCgkJCQkJCQl4bWw7CgoJCQkJCQkvLyBGaXJlZm94IHRocm93cyBleGNlcHRpb25zIHdoZW4gYWNjZXNzaW5nIHByb3BlcnRpZXMKCQkJCQkJLy8gb2YgYW4geGhyIHdoZW4gYSBuZXR3b3JrIGVycm9yIG9jY3VycmVkCgkJCQkJCS8vIGh0dHA6Ly9oZWxwZnVsLmtub2JzLWRpYWxzLmNvbS9pbmRleC5waHAvQ29tcG9uZW50X3JldHVybmVkX2ZhaWx1cmVfY29kZTpfMHg4MDA0MDExMV8oTlNfRVJST1JfTk9UX0FWQUlMQUJMRSkKCQkJCQkJdHJ5IHsKCgkJCQkJCQkvLyBXYXMgbmV2ZXIgY2FsbGVkIGFuZCBpcyBhYm9ydGVkIG9yIGNvbXBsZXRlCgkJCQkJCQlpZiAoIGNhbGxiYWNrICYmICggaXNBYm9ydCB8fCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApICkgewoKCQkJCQkJCQkvLyBPbmx5IGNhbGxlZCBvbmNlCgkJCQkJCQkJY2FsbGJhY2sgPSB1bmRlZmluZWQ7CgoJCQkJCQkJCS8vIERvIG5vdCBrZWVwIGFzIGFjdGl2ZSBhbnltb3JlCgkJCQkJCQkJaWYgKCBoYW5kbGUgKSB7CgkJCQkJCQkJCXhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBqUXVlcnkubm9vcDsKCQkJCQkJCQkJaWYgKCB4aHJPblVubG9hZEFib3J0ICkgewoJCQkJCQkJCQkJZGVsZXRlIHhockNhbGxiYWNrc1sgaGFuZGxlIF07CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgoJCQkJCQkJCS8vIElmIGl0J3MgYW4gYWJvcnQKCQkJCQkJCQlpZiAoIGlzQWJvcnQgKSB7CgkJCQkJCQkJCS8vIEFib3J0IGl0IG1hbnVhbGx5IGlmIG5lZWRlZAoJCQkJCQkJCQlpZiAoIHhoci5yZWFkeVN0YXRlICE9PSA0ICkgewoJCQkJCQkJCQkJeGhyLmFib3J0KCk7CgkJCQkJCQkJCX0KCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQlzdGF0dXMgPSB4aHIuc3RhdHVzOwoJCQkJCQkJCQlyZXNwb25zZUhlYWRlcnMgPSB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7CgkJCQkJCQkJCXJlc3BvbnNlcyA9IHt9OwoJCQkJCQkJCQl4bWwgPSB4aHIucmVzcG9uc2VYTUw7CgoJCQkJCQkJCQkvLyBDb25zdHJ1Y3QgcmVzcG9uc2UgbGlzdAoJCQkJCQkJCQlpZiAoIHhtbCAmJiB4bWwuZG9jdW1lbnRFbGVtZW50IC8qICM0OTU4ICovICkgewoJCQkJCQkJCQkJcmVzcG9uc2VzLnhtbCA9IHhtbDsKCQkJCQkJCQkJfQoKCQkJCQkJCQkJLy8gV2hlbiByZXF1ZXN0aW5nIGJpbmFyeSBkYXRhLCBJRTYtOSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbgoJCQkJCQkJCQkvLyBvbiBhbnkgYXR0ZW1wdCB0byBhY2Nlc3MgcmVzcG9uc2VUZXh0ICgjMTE0MjYpCgkJCQkJCQkJCXRyeSB7CgkJCQkJCQkJCQlyZXNwb25zZXMudGV4dCA9IHhoci5yZXNwb25zZVRleHQ7CgkJCQkJCQkJCX0gY2F0Y2goIF8gKSB7CgkJCQkJCQkJCX0KCgkJCQkJCQkJCS8vIEZpcmVmb3ggdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuIGFjY2Vzc2luZwoJCQkJCQkJCQkvLyBzdGF0dXNUZXh0IGZvciBmYXVsdHkgY3Jvc3MtZG9tYWluIHJlcXVlc3RzCgkJCQkJCQkJCXRyeSB7CgkJCQkJCQkJCQlzdGF0dXNUZXh0ID0geGhyLnN0YXR1c1RleHQ7CgkJCQkJCQkJCX0gY2F0Y2goIGUgKSB7CgkJCQkJCQkJCQkvLyBXZSBub3JtYWxpemUgd2l0aCBXZWJraXQgZ2l2aW5nIGFuIGVtcHR5IHN0YXR1c1RleHQKCQkJCQkJCQkJCXN0YXR1c1RleHQgPSAiIjsKCQkJCQkJCQkJfQoKCQkJCQkJCQkJLy8gRmlsdGVyIHN0YXR1cyBmb3Igbm9uIHN0YW5kYXJkIGJlaGF2aW9ycwoKCQkJCQkJCQkJLy8gSWYgdGhlIHJlcXVlc3QgaXMgbG9jYWwgYW5kIHdlIGhhdmUgZGF0YTogYXNzdW1lIGEgc3VjY2VzcwoJCQkJCQkJCQkvLyAoc3VjY2VzcyB3aXRoIG5vIGRhdGEgd29uJ3QgZ2V0IG5vdGlmaWVkLCB0aGF0J3MgdGhlIGJlc3Qgd2UKCQkJCQkJCQkJLy8gY2FuIGRvIGdpdmVuIGN1cnJlbnQgaW1wbGVtZW50YXRpb25zKQoJCQkJCQkJCQlpZiAoICFzdGF0dXMgJiYgcy5pc0xvY2FsICYmICFzLmNyb3NzRG9tYWluICkgewoJCQkJCQkJCQkJc3RhdHVzID0gcmVzcG9uc2VzLnRleHQgPyAyMDAgOiA0MDQ7CgkJCQkJCQkJCS8vIElFIC0gIzE0NTA6IHNvbWV0aW1lcyByZXR1cm5zIDEyMjMgd2hlbiBpdCBzaG91bGQgYmUgMjA0CgkJCQkJCQkJCX0gZWxzZSBpZiAoIHN0YXR1cyA9PT0gMTIyMyApIHsKCQkJCQkJCQkJCXN0YXR1cyA9IDIwNDsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJfSBjYXRjaCggZmlyZWZveEFjY2Vzc0V4Y2VwdGlvbiApIHsKCQkJCQkJCWlmICggIWlzQWJvcnQgKSB7CgkJCQkJCQkJY29tcGxldGUoIC0xLCBmaXJlZm94QWNjZXNzRXhjZXB0aW9uICk7CgkJCQkJCQl9CgkJCQkJCX0KCgkJCQkJCS8vIENhbGwgY29tcGxldGUgaWYgbmVlZGVkCgkJCQkJCWlmICggcmVzcG9uc2VzICkgewoJCQkJCQkJY29tcGxldGUoIHN0YXR1cywgc3RhdHVzVGV4dCwgcmVzcG9uc2VzLCByZXNwb25zZUhlYWRlcnMgKTsKCQkJCQkJfQoJCQkJCX07CgoJCQkJCWlmICggIXMuYXN5bmMgKSB7CgkJCQkJCS8vIGlmIHdlJ3JlIGluIHN5bmMgbW9kZSB3ZSBmaXJlIHRoZSBjYWxsYmFjawoJCQkJCQljYWxsYmFjaygpOwoJCQkJCX0gZWxzZSBpZiAoIHhoci5yZWFkeVN0YXRlID09PSA0ICkgewoJCQkJCQkvLyAoSUU2ICYgSUU3KSBpZiBpdCdzIGluIGNhY2hlIGFuZCBoYXMgYmVlbgoJCQkJCQkvLyByZXRyaWV2ZWQgZGlyZWN0bHkgd2UgbmVlZCB0byBmaXJlIHRoZSBjYWxsYmFjawoJCQkJCQlzZXRUaW1lb3V0KCBjYWxsYmFjaywgMCApOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWhhbmRsZSA9ICsreGhySWQ7CgkJCQkJCWlmICggeGhyT25VbmxvYWRBYm9ydCApIHsKCQkJCQkJCS8vIENyZWF0ZSB0aGUgYWN0aXZlIHhocnMgY2FsbGJhY2tzIGxpc3QgaWYgbmVlZGVkCgkJCQkJCQkvLyBhbmQgYXR0YWNoIHRoZSB1bmxvYWQgaGFuZGxlcgoJCQkJCQkJaWYgKCAheGhyQ2FsbGJhY2tzICkgewoJCQkJCQkJCXhockNhbGxiYWNrcyA9IHt9OwoJCQkJCQkJCWpRdWVyeSggd2luZG93ICkudW5sb2FkKCB4aHJPblVubG9hZEFib3J0ICk7CgkJCQkJCQl9CgkJCQkJCQkvLyBBZGQgdG8gbGlzdCBvZiBhY3RpdmUgeGhycyBjYWxsYmFja3MKCQkJCQkJCXhockNhbGxiYWNrc1sgaGFuZGxlIF0gPSBjYWxsYmFjazsKCQkJCQkJfQoJCQkJCQl4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gY2FsbGJhY2s7CgkJCQkJfQoJCQkJfSwKCgkJCQlhYm9ydDogZnVuY3Rpb24oKSB7CgkJCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCQkJY2FsbGJhY2soMCwxKTsKCQkJCQl9CgkJCQl9CgkJCX07CgkJfQoJfSk7Cn0KdmFyIGZ4Tm93LCB0aW1lcklkLAoJcmZ4dHlwZXMgPSAvXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sCglyZnhudW0gPSBuZXcgUmVnRXhwKCAiXig/OihbLStdKT18KSgiICsgY29yZV9wbnVtICsgIikoW2EteiVdKikkIiwgImkiICksCglycnVuID0gL3F1ZXVlSG9va3MkLywKCWFuaW1hdGlvblByZWZpbHRlcnMgPSBbIGRlZmF1bHRQcmVmaWx0ZXIgXSwKCXR3ZWVuZXJzID0gewoJCSIqIjogW2Z1bmN0aW9uKCBwcm9wLCB2YWx1ZSApIHsKCQkJdmFyIGVuZCwgdW5pdCwKCQkJCXR3ZWVuID0gdGhpcy5jcmVhdGVUd2VlbiggcHJvcCwgdmFsdWUgKSwKCQkJCXBhcnRzID0gcmZ4bnVtLmV4ZWMoIHZhbHVlICksCgkJCQl0YXJnZXQgPSB0d2Vlbi5jdXIoKSwKCQkJCXN0YXJ0ID0gK3RhcmdldCB8fCAwLAoJCQkJc2NhbGUgPSAxLAoJCQkJbWF4SXRlcmF0aW9ucyA9IDIwOwoKCQkJaWYgKCBwYXJ0cyApIHsKCQkJCWVuZCA9ICtwYXJ0c1syXTsKCQkJCXVuaXQgPSBwYXJ0c1szXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/ICIiIDogInB4IiApOwoKCQkJCS8vIFdlIG5lZWQgdG8gY29tcHV0ZSBzdGFydGluZyB2YWx1ZQoJCQkJaWYgKCB1bml0ICE9PSAicHgiICYmIHN0YXJ0ICkgewoJCQkJCS8vIEl0ZXJhdGl2ZWx5IGFwcHJveGltYXRlIGZyb20gYSBub256ZXJvIHN0YXJ0aW5nIHBvaW50CgkJCQkJLy8gUHJlZmVyIHRoZSBjdXJyZW50IHByb3BlcnR5LCBiZWNhdXNlIHRoaXMgcHJvY2VzcyB3aWxsIGJlIHRyaXZpYWwgaWYgaXQgdXNlcyB0aGUgc2FtZSB1bml0cwoJCQkJCS8vIEZhbGxiYWNrIHRvIGVuZCBvciBhIHNpbXBsZSBjb25zdGFudAoJCQkJCXN0YXJ0ID0galF1ZXJ5LmNzcyggdHdlZW4uZWxlbSwgcHJvcCwgdHJ1ZSApIHx8IGVuZCB8fCAxOwoKCQkJCQlkbyB7CgkJCQkJCS8vIElmIHByZXZpb3VzIGl0ZXJhdGlvbiB6ZXJvZWQgb3V0LCBkb3VibGUgdW50aWwgd2UgZ2V0ICpzb21ldGhpbmcqCgkJCQkJCS8vIFVzZSBhIHN0cmluZyBmb3IgZG91YmxpbmcgZmFjdG9yIHNvIHdlIGRvbid0IGFjY2lkZW50YWxseSBzZWUgc2NhbGUgYXMgdW5jaGFuZ2VkIGJlbG93CgkJCQkJCXNjYWxlID0gc2NhbGUgfHwgIi41IjsKCgkJCQkJCS8vIEFkanVzdCBhbmQgYXBwbHkKCQkJCQkJc3RhcnQgPSBzdGFydCAvIHNjYWxlOwoJCQkJCQlqUXVlcnkuc3R5bGUoIHR3ZWVuLmVsZW0sIHByb3AsIHN0YXJ0ICsgdW5pdCApOwoKCQkJCQkvLyBVcGRhdGUgc2NhbGUsIHRvbGVyYXRpbmcgemVybyBvciBOYU4gZnJvbSB0d2Vlbi5jdXIoKQoJCQkJCS8vIEFuZCBicmVha2luZyB0aGUgbG9vcCBpZiBzY2FsZSBpcyB1bmNoYW5nZWQgb3IgcGVyZmVjdCwgb3IgaWYgd2UndmUganVzdCBoYWQgZW5vdWdoCgkJCQkJfSB3aGlsZSAoIHNjYWxlICE9PSAoc2NhbGUgPSB0d2Vlbi5jdXIoKSAvIHRhcmdldCkgJiYgc2NhbGUgIT09IDEgJiYgLS1tYXhJdGVyYXRpb25zICk7CgkJCQl9CgoJCQkJdHdlZW4udW5pdCA9IHVuaXQ7CgkJCQl0d2Vlbi5zdGFydCA9IHN0YXJ0OwoJCQkJLy8gSWYgYSArPS8tPSB0b2tlbiB3YXMgcHJvdmlkZWQsIHdlJ3JlIGRvaW5nIGEgcmVsYXRpdmUgYW5pbWF0aW9uCgkJCQl0d2Vlbi5lbmQgPSBwYXJ0c1sxXSA/IHN0YXJ0ICsgKCBwYXJ0c1sxXSArIDEgKSAqIGVuZCA6IGVuZDsKCQkJfQoJCQlyZXR1cm4gdHdlZW47CgkJfV0KCX07CgovLyBBbmltYXRpb25zIGNyZWF0ZWQgc3luY2hyb25vdXNseSB3aWxsIHJ1biBzeW5jaHJvbm91c2x5CmZ1bmN0aW9uIGNyZWF0ZUZ4Tm93KCkgewoJc2V0VGltZW91dChmdW5jdGlvbigpIHsKCQlmeE5vdyA9IHVuZGVmaW5lZDsKCX0sIDAgKTsKCXJldHVybiAoIGZ4Tm93ID0galF1ZXJ5Lm5vdygpICk7Cn0KCmZ1bmN0aW9uIGNyZWF0ZVR3ZWVucyggYW5pbWF0aW9uLCBwcm9wcyApIHsKCWpRdWVyeS5lYWNoKCBwcm9wcywgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkgewoJCXZhciBjb2xsZWN0aW9uID0gKCB0d2VlbmVyc1sgcHJvcCBdIHx8IFtdICkuY29uY2F0KCB0d2VlbmVyc1sgIioiIF0gKSwKCQkJaW5kZXggPSAwLAoJCQlsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDsKCQlmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkgewoJCQlpZiAoIGNvbGxlY3Rpb25bIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBwcm9wLCB2YWx1ZSApICkgewoKCQkJCS8vIHdlJ3JlIGRvbmUgd2l0aCB0aGlzIHByb3BlcnR5CgkJCQlyZXR1cm47CgkJCX0KCQl9Cgl9KTsKfQoKZnVuY3Rpb24gQW5pbWF0aW9uKCBlbGVtLCBwcm9wZXJ0aWVzLCBvcHRpb25zICkgewoJdmFyIHJlc3VsdCwKCQlpbmRleCA9IDAsCgkJdHdlZW5lckluZGV4ID0gMCwKCQlsZW5ndGggPSBhbmltYXRpb25QcmVmaWx0ZXJzLmxlbmd0aCwKCQlkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLmFsd2F5cyggZnVuY3Rpb24oKSB7CgkJCS8vIGRvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3RvcgoJCQlkZWxldGUgdGljay5lbGVtOwoJCX0pLAoJCXRpY2sgPSBmdW5jdGlvbigpIHsKCQkJdmFyIGN1cnJlbnRUaW1lID0gZnhOb3cgfHwgY3JlYXRlRnhOb3coKSwKCQkJCXJlbWFpbmluZyA9IE1hdGgubWF4KCAwLCBhbmltYXRpb24uc3RhcnRUaW1lICsgYW5pbWF0aW9uLmR1cmF0aW9uIC0gY3VycmVudFRpbWUgKSwKCQkJCXBlcmNlbnQgPSAxIC0gKCByZW1haW5pbmcgLyBhbmltYXRpb24uZHVyYXRpb24gfHwgMCApLAoJCQkJaW5kZXggPSAwLAoJCQkJbGVuZ3RoID0gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGg7CgoJCQlmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHsKCQkJCWFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCBwZXJjZW50ICk7CgkJCX0KCgkJCWRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBwZXJjZW50LCByZW1haW5pbmcgXSk7CgoJCQlpZiAoIHBlcmNlbnQgPCAxICYmIGxlbmd0aCApIHsKCQkJCXJldHVybiByZW1haW5pbmc7CgkJCX0gZWxzZSB7CgkJCQlkZWZlcnJlZC5yZXNvbHZlV2l0aCggZWxlbSwgWyBhbmltYXRpb24gXSApOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfSwKCQlhbmltYXRpb24gPSBkZWZlcnJlZC5wcm9taXNlKHsKCQkJZWxlbTogZWxlbSwKCQkJcHJvcHM6IGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wZXJ0aWVzICksCgkJCW9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHsgc3BlY2lhbEVhc2luZzoge30gfSwgb3B0aW9ucyApLAoJCQlvcmlnaW5hbFByb3BlcnRpZXM6IHByb3BlcnRpZXMsCgkJCW9yaWdpbmFsT3B0aW9uczogb3B0aW9ucywKCQkJc3RhcnRUaW1lOiBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLAoJCQlkdXJhdGlvbjogb3B0aW9ucy5kdXJhdGlvbiwKCQkJdHdlZW5zOiBbXSwKCQkJY3JlYXRlVHdlZW46IGZ1bmN0aW9uKCBwcm9wLCBlbmQsIGVhc2luZyApIHsKCQkJCXZhciB0d2VlbiA9IGpRdWVyeS5Ud2VlbiggZWxlbSwgYW5pbWF0aW9uLm9wdHMsIHByb3AsIGVuZCwKCQkJCQkJYW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZ1sgcHJvcCBdIHx8IGFuaW1hdGlvbi5vcHRzLmVhc2luZyApOwoJCQkJYW5pbWF0aW9uLnR3ZWVucy5wdXNoKCB0d2VlbiApOwoJCQkJcmV0dXJuIHR3ZWVuOwoJCQl9LAoJCQlzdG9wOiBmdW5jdGlvbiggZ290b0VuZCApIHsKCQkJCXZhciBpbmRleCA9IDAsCgkJCQkJLy8gaWYgd2UgYXJlIGdvaW5nIHRvIHRoZSBlbmQsIHdlIHdhbnQgdG8gcnVuIGFsbCB0aGUgdHdlZW5zCgkJCQkJLy8gb3RoZXJ3aXNlIHdlIHNraXAgdGhpcyBwYXJ0CgkJCQkJbGVuZ3RoID0gZ290b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDsKCgkJCQlmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHsKCQkJCQlhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggMSApOwoJCQkJfQoKCQkJCS8vIHJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWUKCQkJCS8vIG90aGVyd2lzZSwgcmVqZWN0CgkJCQlpZiAoIGdvdG9FbmQgKSB7CgkJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTsKCQkJCX0gZWxzZSB7CgkJCQkJZGVmZXJyZWQucmVqZWN0V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIGdvdG9FbmQgXSApOwoJCQkJfQoJCQkJcmV0dXJuIHRoaXM7CgkJCX0KCQl9KSwKCQlwcm9wcyA9IGFuaW1hdGlvbi5wcm9wczsKCglwcm9wRmlsdGVyKCBwcm9wcywgYW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZyApOwoKCWZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkgewoJCXJlc3VsdCA9IGFuaW1hdGlvblByZWZpbHRlcnNbIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBlbGVtLCBwcm9wcywgYW5pbWF0aW9uLm9wdHMgKTsKCQlpZiAoIHJlc3VsdCApIHsKCQkJcmV0dXJuIHJlc3VsdDsKCQl9Cgl9CgoJY3JlYXRlVHdlZW5zKCBhbmltYXRpb24sIHByb3BzICk7CgoJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggYW5pbWF0aW9uLm9wdHMuc3RhcnQgKSApIHsKCQlhbmltYXRpb24ub3B0cy5zdGFydC5jYWxsKCBlbGVtLCBhbmltYXRpb24gKTsKCX0KCglqUXVlcnkuZngudGltZXIoCgkJalF1ZXJ5LmV4dGVuZCggdGljaywgewoJCQlhbmltOiBhbmltYXRpb24sCgkJCXF1ZXVlOiBhbmltYXRpb24ub3B0cy5xdWV1ZSwKCQkJZWxlbTogZWxlbQoJCX0pCgkpOwoKCS8vIGF0dGFjaCBjYWxsYmFja3MgZnJvbSBvcHRpb25zCglyZXR1cm4gYW5pbWF0aW9uLnByb2dyZXNzKCBhbmltYXRpb24ub3B0cy5wcm9ncmVzcyApCgkJLmRvbmUoIGFuaW1hdGlvbi5vcHRzLmRvbmUsIGFuaW1hdGlvbi5vcHRzLmNvbXBsZXRlICkKCQkuZmFpbCggYW5pbWF0aW9uLm9wdHMuZmFpbCApCgkJLmFsd2F5cyggYW5pbWF0aW9uLm9wdHMuYWx3YXlzICk7Cn0KCmZ1bmN0aW9uIHByb3BGaWx0ZXIoIHByb3BzLCBzcGVjaWFsRWFzaW5nICkgewoJdmFyIGluZGV4LCBuYW1lLCBlYXNpbmcsIHZhbHVlLCBob29rczsKCgkvLyBjYW1lbENhc2UsIHNwZWNpYWxFYXNpbmcgYW5kIGV4cGFuZCBjc3NIb29rIHBhc3MKCWZvciAoIGluZGV4IGluIHByb3BzICkgewoJCW5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBpbmRleCApOwoJCWVhc2luZyA9IHNwZWNpYWxFYXNpbmdbIG5hbWUgXTsKCQl2YWx1ZSA9IHByb3BzWyBpbmRleCBdOwoJCWlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbHVlICkgKSB7CgkJCWVhc2luZyA9IHZhbHVlWyAxIF07CgkJCXZhbHVlID0gcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgMCBdOwoJCX0KCgkJaWYgKCBpbmRleCAhPT0gbmFtZSApIHsKCQkJcHJvcHNbIG5hbWUgXSA9IHZhbHVlOwoJCQlkZWxldGUgcHJvcHNbIGluZGV4IF07CgkJfQoKCQlob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdOwoJCWlmICggaG9va3MgJiYgImV4cGFuZCIgaW4gaG9va3MgKSB7CgkJCXZhbHVlID0gaG9va3MuZXhwYW5kKCB2YWx1ZSApOwoJCQlkZWxldGUgcHJvcHNbIG5hbWUgXTsKCgkJCS8vIG5vdCBxdWl0ZSAkLmV4dGVuZCwgdGhpcyB3b250IG92ZXJ3cml0ZSBrZXlzIGFscmVhZHkgcHJlc2VudC4KCQkJLy8gYWxzbyAtIHJldXNpbmcgJ2luZGV4JyBmcm9tIGFib3ZlIGJlY2F1c2Ugd2UgaGF2ZSB0aGUgY29ycmVjdCAibmFtZSIKCQkJZm9yICggaW5kZXggaW4gdmFsdWUgKSB7CgkJCQlpZiAoICEoIGluZGV4IGluIHByb3BzICkgKSB7CgkJCQkJcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgaW5kZXggXTsKCQkJCQlzcGVjaWFsRWFzaW5nWyBpbmRleCBdID0gZWFzaW5nOwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJc3BlY2lhbEVhc2luZ1sgbmFtZSBdID0gZWFzaW5nOwoJCX0KCX0KfQoKalF1ZXJ5LkFuaW1hdGlvbiA9IGpRdWVyeS5leHRlbmQoIEFuaW1hdGlvbiwgewoKCXR3ZWVuZXI6IGZ1bmN0aW9uKCBwcm9wcywgY2FsbGJhY2sgKSB7CgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcHJvcHMgKSApIHsKCQkJY2FsbGJhY2sgPSBwcm9wczsKCQkJcHJvcHMgPSBbICIqIiBdOwoJCX0gZWxzZSB7CgkJCXByb3BzID0gcHJvcHMuc3BsaXQoIiAiKTsKCQl9CgoJCXZhciBwcm9wLAoJCQlpbmRleCA9IDAsCgkJCWxlbmd0aCA9IHByb3BzLmxlbmd0aDsKCgkJZm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7CgkJCXByb3AgPSBwcm9wc1sgaW5kZXggXTsKCQkJdHdlZW5lcnNbIHByb3AgXSA9IHR3ZWVuZXJzWyBwcm9wIF0gfHwgW107CgkJCXR3ZWVuZXJzWyBwcm9wIF0udW5zaGlmdCggY2FsbGJhY2sgKTsKCQl9Cgl9LAoKCXByZWZpbHRlcjogZnVuY3Rpb24oIGNhbGxiYWNrLCBwcmVwZW5kICkgewoJCWlmICggcHJlcGVuZCApIHsKCQkJYW5pbWF0aW9uUHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayApOwoJCX0gZWxzZSB7CgkJCWFuaW1hdGlvblByZWZpbHRlcnMucHVzaCggY2FsbGJhY2sgKTsKCQl9Cgl9Cn0pOwoKZnVuY3Rpb24gZGVmYXVsdFByZWZpbHRlciggZWxlbSwgcHJvcHMsIG9wdHMgKSB7Cgl2YXIgaW5kZXgsIHByb3AsIHZhbHVlLCBsZW5ndGgsIGRhdGFTaG93LCB0d2VlbiwgaG9va3MsIG9sZGZpcmUsCgkJYW5pbSA9IHRoaXMsCgkJc3R5bGUgPSBlbGVtLnN0eWxlLAoJCW9yaWcgPSB7fSwKCQloYW5kbGVkID0gW10sCgkJaGlkZGVuID0gZWxlbS5ub2RlVHlwZSAmJiBpc0hpZGRlbiggZWxlbSApOwoKCS8vIGhhbmRsZSBxdWV1ZTogZmFsc2UgcHJvbWlzZXMKCWlmICggIW9wdHMucXVldWUgKSB7CgkJaG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sICJmeCIgKTsKCQlpZiAoIGhvb2tzLnVucXVldWVkID09IG51bGwgKSB7CgkJCWhvb2tzLnVucXVldWVkID0gMDsKCQkJb2xkZmlyZSA9IGhvb2tzLmVtcHR5LmZpcmU7CgkJCWhvb2tzLmVtcHR5LmZpcmUgPSBmdW5jdGlvbigpIHsKCQkJCWlmICggIWhvb2tzLnVucXVldWVkICkgewoJCQkJCW9sZGZpcmUoKTsKCQkJCX0KCQkJfTsKCQl9CgkJaG9va3MudW5xdWV1ZWQrKzsKCgkJYW5pbS5hbHdheXMoZnVuY3Rpb24oKSB7CgkJCS8vIGRvaW5nIHRoaXMgbWFrZXMgc3VyZSB0aGF0IHRoZSBjb21wbGV0ZSBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkCgkJCS8vIGJlZm9yZSB0aGlzIGNvbXBsZXRlcwoJCQlhbmltLmFsd2F5cyhmdW5jdGlvbigpIHsKCQkJCWhvb2tzLnVucXVldWVkLS07CgkJCQlpZiAoICFqUXVlcnkucXVldWUoIGVsZW0sICJmeCIgKS5sZW5ndGggKSB7CgkJCQkJaG9va3MuZW1wdHkuZmlyZSgpOwoJCQkJfQoJCQl9KTsKCQl9KTsKCX0KCgkvLyBoZWlnaHQvd2lkdGggb3ZlcmZsb3cgcGFzcwoJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICggImhlaWdodCIgaW4gcHJvcHMgfHwgIndpZHRoIiBpbiBwcm9wcyApICkgewoJCS8vIE1ha2Ugc3VyZSB0aGF0IG5vdGhpbmcgc25lYWtzIG91dAoJCS8vIFJlY29yZCBhbGwgMyBvdmVyZmxvdyBhdHRyaWJ1dGVzIGJlY2F1c2UgSUUgZG9lcyBub3QKCQkvLyBjaGFuZ2UgdGhlIG92ZXJmbG93IGF0dHJpYnV0ZSB3aGVuIG92ZXJmbG93WCBhbmQKCQkvLyBvdmVyZmxvd1kgYXJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZQoJCW9wdHMub3ZlcmZsb3cgPSBbIHN0eWxlLm92ZXJmbG93LCBzdHlsZS5vdmVyZmxvd1gsIHN0eWxlLm92ZXJmbG93WSBdOwoKCQkvLyBTZXQgZGlzcGxheSBwcm9wZXJ0eSB0byBpbmxpbmUtYmxvY2sgZm9yIGhlaWdodC93aWR0aAoJCS8vIGFuaW1hdGlvbnMgb24gaW5saW5lIGVsZW1lbnRzIHRoYXQgYXJlIGhhdmluZyB3aWR0aC9oZWlnaHQgYW5pbWF0ZWQKCQlpZiAoIGpRdWVyeS5jc3MoIGVsZW0sICJkaXNwbGF5IiApID09PSAiaW5saW5lIiAmJgoJCQkJalF1ZXJ5LmNzcyggZWxlbSwgImZsb2F0IiApID09PSAibm9uZSIgKSB7CgoJCQkvLyBpbmxpbmUtbGV2ZWwgZWxlbWVudHMgYWNjZXB0IGlubGluZS1ibG9jazsKCQkJLy8gYmxvY2stbGV2ZWwgZWxlbWVudHMgbmVlZCB0byBiZSBpbmxpbmUgd2l0aCBsYXlvdXQKCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dCB8fCBjc3NfZGVmYXVsdERpc3BsYXkoIGVsZW0ubm9kZU5hbWUgKSA9PT0gImlubGluZSIgKSB7CgkJCQlzdHlsZS5kaXNwbGF5ID0gImlubGluZS1ibG9jayI7CgoJCQl9IGVsc2UgewoJCQkJc3R5bGUuem9vbSA9IDE7CgkJCX0KCQl9Cgl9CgoJaWYgKCBvcHRzLm92ZXJmbG93ICkgewoJCXN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CgkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcyApIHsKCQkJYW5pbS5kb25lKGZ1bmN0aW9uKCkgewoJCQkJc3R5bGUub3ZlcmZsb3cgPSBvcHRzLm92ZXJmbG93WyAwIF07CgkJCQlzdHlsZS5vdmVyZmxvd1ggPSBvcHRzLm92ZXJmbG93WyAxIF07CgkJCQlzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07CgkJCX0pOwoJCX0KCX0KCgoJLy8gc2hvdy9oaWRlIHBhc3MKCWZvciAoIGluZGV4IGluIHByb3BzICkgewoJCXZhbHVlID0gcHJvcHNbIGluZGV4IF07CgkJaWYgKCByZnh0eXBlcy5leGVjKCB2YWx1ZSApICkgewoJCQlkZWxldGUgcHJvcHNbIGluZGV4IF07CgkJCWlmICggdmFsdWUgPT09ICggaGlkZGVuID8gImhpZGUiIDogInNob3ciICkgKSB7CgkJCQljb250aW51ZTsKCQkJfQoJCQloYW5kbGVkLnB1c2goIGluZGV4ICk7CgkJfQoJfQoKCWxlbmd0aCA9IGhhbmRsZWQubGVuZ3RoOwoJaWYgKCBsZW5ndGggKSB7CgkJZGF0YVNob3cgPSBqUXVlcnkuX2RhdGEoIGVsZW0sICJmeHNob3ciICkgfHwgalF1ZXJ5Ll9kYXRhKCBlbGVtLCAiZnhzaG93Iiwge30gKTsKCQlpZiAoIGhpZGRlbiApIHsKCQkJalF1ZXJ5KCBlbGVtICkuc2hvdygpOwoJCX0gZWxzZSB7CgkJCWFuaW0uZG9uZShmdW5jdGlvbigpIHsKCQkJCWpRdWVyeSggZWxlbSApLmhpZGUoKTsKCQkJfSk7CgkJfQoJCWFuaW0uZG9uZShmdW5jdGlvbigpIHsKCQkJdmFyIHByb3A7CgkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtLCAiZnhzaG93IiwgdHJ1ZSApOwoJCQlmb3IgKCBwcm9wIGluIG9yaWcgKSB7CgkJCQlqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIG9yaWdbIHByb3AgXSApOwoJCQl9CgkJfSk7CgkJZm9yICggaW5kZXggPSAwIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkgewoJCQlwcm9wID0gaGFuZGxlZFsgaW5kZXggXTsKCQkJdHdlZW4gPSBhbmltLmNyZWF0ZVR3ZWVuKCBwcm9wLCBoaWRkZW4gPyBkYXRhU2hvd1sgcHJvcCBdIDogMCApOwoJCQlvcmlnWyBwcm9wIF0gPSBkYXRhU2hvd1sgcHJvcCBdIHx8IGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCApOwoKCQkJaWYgKCAhKCBwcm9wIGluIGRhdGFTaG93ICkgKSB7CgkJCQlkYXRhU2hvd1sgcHJvcCBdID0gdHdlZW4uc3RhcnQ7CgkJCQlpZiAoIGhpZGRlbiApIHsKCQkJCQl0d2Vlbi5lbmQgPSB0d2Vlbi5zdGFydDsKCQkJCQl0d2Vlbi5zdGFydCA9IHByb3AgPT09ICJ3aWR0aCIgfHwgcHJvcCA9PT0gImhlaWdodCIgPyAxIDogMDsKCQkJCX0KCQkJfQoJCX0KCX0KfQoKZnVuY3Rpb24gVHdlZW4oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICkgewoJcmV0dXJuIG5ldyBUd2Vlbi5wcm90b3R5cGUuaW5pdCggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKTsKfQpqUXVlcnkuVHdlZW4gPSBUd2VlbjsKClR3ZWVuLnByb3RvdHlwZSA9IHsKCWNvbnN0cnVjdG9yOiBUd2VlbiwKCWluaXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZywgdW5pdCApIHsKCQl0aGlzLmVsZW0gPSBlbGVtOwoJCXRoaXMucHJvcCA9IHByb3A7CgkJdGhpcy5lYXNpbmcgPSBlYXNpbmcgfHwgInN3aW5nIjsKCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJCXRoaXMuc3RhcnQgPSB0aGlzLm5vdyA9IHRoaXMuY3VyKCk7CgkJdGhpcy5lbmQgPSBlbmQ7CgkJdGhpcy51bml0ID0gdW5pdCB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/ICIiIDogInB4IiApOwoJfSwKCWN1cjogZnVuY3Rpb24oKSB7CgkJdmFyIGhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTsKCgkJcmV0dXJuIGhvb2tzICYmIGhvb2tzLmdldCA/CgkJCWhvb2tzLmdldCggdGhpcyApIDoKCQkJVHdlZW4ucHJvcEhvb2tzLl9kZWZhdWx0LmdldCggdGhpcyApOwoJfSwKCXJ1bjogZnVuY3Rpb24oIHBlcmNlbnQgKSB7CgkJdmFyIGVhc2VkLAoJCQlob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07CgoJCWlmICggdGhpcy5vcHRpb25zLmR1cmF0aW9uICkgewoJCQl0aGlzLnBvcyA9IGVhc2VkID0galF1ZXJ5LmVhc2luZ1sgdGhpcy5lYXNpbmcgXSgKCQkJCXBlcmNlbnQsIHRoaXMub3B0aW9ucy5kdXJhdGlvbiAqIHBlcmNlbnQsIDAsIDEsIHRoaXMub3B0aW9ucy5kdXJhdGlvbgoJCQkpOwoJCX0gZWxzZSB7CgkJCXRoaXMucG9zID0gZWFzZWQgPSBwZXJjZW50OwoJCX0KCQl0aGlzLm5vdyA9ICggdGhpcy5lbmQgLSB0aGlzLnN0YXJ0ICkgKiBlYXNlZCArIHRoaXMuc3RhcnQ7CgoJCWlmICggdGhpcy5vcHRpb25zLnN0ZXAgKSB7CgkJCXRoaXMub3B0aW9ucy5zdGVwLmNhbGwoIHRoaXMuZWxlbSwgdGhpcy5ub3csIHRoaXMgKTsKCQl9CgoJCWlmICggaG9va3MgJiYgaG9va3Muc2V0ICkgewoJCQlob29rcy5zZXQoIHRoaXMgKTsKCQl9IGVsc2UgewoJCQlUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KCB0aGlzICk7CgkJfQoJCXJldHVybiB0aGlzOwoJfQp9OwoKVHdlZW4ucHJvdG90eXBlLmluaXQucHJvdG90eXBlID0gVHdlZW4ucHJvdG90eXBlOwoKVHdlZW4ucHJvcEhvb2tzID0gewoJX2RlZmF1bHQ6IHsKCQlnZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHsKCQkJdmFyIHJlc3VsdDsKCgkJCWlmICggdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdICE9IG51bGwgJiYKCQkJCSghdHdlZW4uZWxlbS5zdHlsZSB8fCB0d2Vlbi5lbGVtLnN0eWxlWyB0d2Vlbi5wcm9wIF0gPT0gbnVsbCkgKSB7CgkJCQlyZXR1cm4gdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdOwoJCQl9CgoJCQkvLyBwYXNzaW5nIGFueSB2YWx1ZSBhcyBhIDR0aCBwYXJhbWV0ZXIgdG8gLmNzcyB3aWxsIGF1dG9tYXRpY2FsbHkKCQkJLy8gYXR0ZW1wdCBhIHBhcnNlRmxvYXQgYW5kIGZhbGxiYWNrIHRvIGEgc3RyaW5nIGlmIHRoZSBwYXJzZSBmYWlscwoJCQkvLyBzbywgc2ltcGxlIHZhbHVlcyBzdWNoIGFzICIxMHB4IiBhcmUgcGFyc2VkIHRvIEZsb2F0LgoJCQkvLyBjb21wbGV4IHZhbHVlcyBzdWNoIGFzICJyb3RhdGUoMXJhZCkiIGFyZSByZXR1cm5lZCBhcyBpcy4KCQkJcmVzdWx0ID0galF1ZXJ5LmNzcyggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgZmFsc2UsICIiICk7CgkJCS8vIEVtcHR5IHN0cmluZ3MsIG51bGwsIHVuZGVmaW5lZCBhbmQgImF1dG8iIGFyZSBjb252ZXJ0ZWQgdG8gMC4KCQkJcmV0dXJuICFyZXN1bHQgfHwgcmVzdWx0ID09PSAiYXV0byIgPyAwIDogcmVzdWx0OwoJCX0sCgkJc2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7CgkJCS8vIHVzZSBzdGVwIGhvb2sgZm9yIGJhY2sgY29tcGF0IC0gdXNlIGNzc0hvb2sgaWYgaXRzIHRoZXJlIC0gdXNlIC5zdHlsZSBpZiBpdHMKCQkJLy8gYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUKCQkJaWYgKCBqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdICkgewoJCQkJalF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSggdHdlZW4gKTsKCQkJfSBlbHNlIGlmICggdHdlZW4uZWxlbS5zdHlsZSAmJiAoIHR3ZWVuLmVsZW0uc3R5bGVbIGpRdWVyeS5jc3NQcm9wc1sgdHdlZW4ucHJvcCBdIF0gIT0gbnVsbCB8fCBqUXVlcnkuY3NzSG9va3NbIHR3ZWVuLnByb3AgXSApICkgewoJCQkJalF1ZXJ5LnN0eWxlKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCB0d2Vlbi5ub3cgKyB0d2Vlbi51bml0ICk7CgkJCX0gZWxzZSB7CgkJCQl0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7CgkJCX0KCQl9Cgl9Cn07CgovLyBSZW1vdmUgaW4gMi4wIC0gdGhpcyBzdXBwb3J0cyBJRTgncyBwYW5pYyBiYXNlZCBhcHByb2FjaAovLyB0byBzZXR0aW5nIHRoaW5ncyBvbiBkaXNjb25uZWN0ZWQgbm9kZXMKClR3ZWVuLnByb3BIb29rcy5zY3JvbGxUb3AgPSBUd2Vlbi5wcm9wSG9va3Muc2Nyb2xsTGVmdCA9IHsKCXNldDogZnVuY3Rpb24oIHR3ZWVuICkgewoJCWlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7CgkJCXR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdzsKCQl9Cgl9Cn07CgpqUXVlcnkuZWFjaChbICJ0b2dnbGUiLCAic2hvdyIsICJoaWRlIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCXZhciBjc3NGbiA9IGpRdWVyeS5mblsgbmFtZSBdOwoJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7CgkJcmV0dXJuIHNwZWVkID09IG51bGwgfHwgdHlwZW9mIHNwZWVkID09PSAiYm9vbGVhbiIgfHwKCQkJLy8gc3BlY2lhbCBjaGVjayBmb3IgLnRvZ2dsZSggaGFuZGxlciwgaGFuZGxlciwgLi4uICkKCQkJKCAhaSAmJiBqUXVlcnkuaXNGdW5jdGlvbiggc3BlZWQgKSAmJiBqUXVlcnkuaXNGdW5jdGlvbiggZWFzaW5nICkgKSA/CgkJCWNzc0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSA6CgkJCXRoaXMuYW5pbWF0ZSggZ2VuRngoIG5hbWUsIHRydWUgKSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTsKCX07Cn0pOwoKalF1ZXJ5LmZuLmV4dGVuZCh7CglmYWRlVG86IGZ1bmN0aW9uKCBzcGVlZCwgdG8sIGVhc2luZywgY2FsbGJhY2sgKSB7CgoJCS8vIHNob3cgYW55IGhpZGRlbiBlbGVtZW50cyBhZnRlciBzZXR0aW5nIG9wYWNpdHkgdG8gMAoJCXJldHVybiB0aGlzLmZpbHRlciggaXNIaWRkZW4gKS5jc3MoICJvcGFjaXR5IiwgMCApLnNob3coKQoKCQkJLy8gYW5pbWF0ZSB0byB0aGUgdmFsdWUgc3BlY2lmaWVkCgkJCS5lbmQoKS5hbmltYXRlKHsgb3BhY2l0eTogdG8gfSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTsKCX0sCglhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7CgkJdmFyIGVtcHR5ID0galF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3AgKSwKCQkJb3B0YWxsID0galF1ZXJ5LnNwZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLAoJCQlkb0FuaW1hdGlvbiA9IGZ1bmN0aW9uKCkgewoJCQkJLy8gT3BlcmF0ZSBvbiBhIGNvcHkgb2YgcHJvcCBzbyBwZXItcHJvcGVydHkgZWFzaW5nIHdvbid0IGJlIGxvc3QKCQkJCXZhciBhbmltID0gQW5pbWF0aW9uKCB0aGlzLCBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcCApLCBvcHRhbGwgKTsKCgkJCQkvLyBFbXB0eSBhbmltYXRpb25zIHJlc29sdmUgaW1tZWRpYXRlbHkKCQkJCWlmICggZW1wdHkgKSB7CgkJCQkJYW5pbS5zdG9wKCB0cnVlICk7CgkJCQl9CgkJCX07CgoJCXJldHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNlID8KCQkJdGhpcy5lYWNoKCBkb0FuaW1hdGlvbiApIDoKCQkJdGhpcy5xdWV1ZSggb3B0YWxsLnF1ZXVlLCBkb0FuaW1hdGlvbiApOwoJfSwKCXN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkgewoJCXZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7CgkJCXZhciBzdG9wID0gaG9va3Muc3RvcDsKCQkJZGVsZXRlIGhvb2tzLnN0b3A7CgkJCXN0b3AoIGdvdG9FbmQgKTsKCQl9OwoKCQlpZiAoIHR5cGVvZiB0eXBlICE9PSAic3RyaW5nIiApIHsKCQkJZ290b0VuZCA9IGNsZWFyUXVldWU7CgkJCWNsZWFyUXVldWUgPSB0eXBlOwoJCQl0eXBlID0gdW5kZWZpbmVkOwoJCX0KCQlpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7CgkJCXRoaXMucXVldWUoIHR5cGUgfHwgImZ4IiwgW10gKTsKCQl9CgoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCXZhciBkZXF1ZXVlID0gdHJ1ZSwKCQkJCWluZGV4ID0gdHlwZSAhPSBudWxsICYmIHR5cGUgKyAicXVldWVIb29rcyIsCgkJCQl0aW1lcnMgPSBqUXVlcnkudGltZXJzLAoJCQkJZGF0YSA9IGpRdWVyeS5fZGF0YSggdGhpcyApOwoKCQkJaWYgKCBpbmRleCApIHsKCQkJCWlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgKSB7CgkJCQkJc3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlmb3IgKCBpbmRleCBpbiBkYXRhICkgewoJCQkJCWlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgJiYgcnJ1bi50ZXN0KCBpbmRleCApICkgewoJCQkJCQlzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCWZvciAoIGluZGV4ID0gdGltZXJzLmxlbmd0aDsgaW5kZXgtLTsgKSB7CgkJCQlpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmICh0eXBlID09IG51bGwgfHwgdGltZXJzWyBpbmRleCBdLnF1ZXVlID09PSB0eXBlKSApIHsKCQkJCQl0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCBnb3RvRW5kICk7CgkJCQkJZGVxdWV1ZSA9IGZhbHNlOwoJCQkJCXRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7CgkJCQl9CgkJCX0KCgkJCS8vIHN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQKCQkJLy8gdGltZXJzIGN1cnJlbnRseSB3aWxsIGNhbGwgdGhlaXIgY29tcGxldGUgY2FsbGJhY2tzLCB3aGljaCB3aWxsIGRlcXVldWUKCQkJLy8gYnV0IG9ubHkgaWYgdGhleSB3ZXJlIGdvdG9FbmQKCQkJaWYgKCBkZXF1ZXVlIHx8ICFnb3RvRW5kICkgewoJCQkJalF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTsKCQkJfQoJCX0pOwoJfQp9KTsKCi8vIEdlbmVyYXRlIHBhcmFtZXRlcnMgdG8gY3JlYXRlIGEgc3RhbmRhcmQgYW5pbWF0aW9uCmZ1bmN0aW9uIGdlbkZ4KCB0eXBlLCBpbmNsdWRlV2lkdGggKSB7Cgl2YXIgd2hpY2gsCgkJYXR0cnMgPSB7IGhlaWdodDogdHlwZSB9LAoJCWkgPSAwOwoKCS8vIGlmIHdlIGluY2x1ZGUgd2lkdGgsIHN0ZXAgdmFsdWUgaXMgMSB0byBkbyBhbGwgY3NzRXhwYW5kIHZhbHVlcywKCS8vIGlmIHdlIGRvbid0IGluY2x1ZGUgd2lkdGgsIHN0ZXAgdmFsdWUgaXMgMiB0byBza2lwIG92ZXIgTGVmdCBhbmQgUmlnaHQKCWluY2x1ZGVXaWR0aCA9IGluY2x1ZGVXaWR0aD8gMSA6IDA7Cglmb3IoIDsgaSA8IDQgOyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7CgkJd2hpY2ggPSBjc3NFeHBhbmRbIGkgXTsKCQlhdHRyc1sgIm1hcmdpbiIgKyB3aGljaCBdID0gYXR0cnNbICJwYWRkaW5nIiArIHdoaWNoIF0gPSB0eXBlOwoJfQoKCWlmICggaW5jbHVkZVdpZHRoICkgewoJCWF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7Cgl9CgoJcmV0dXJuIGF0dHJzOwp9CgovLyBHZW5lcmF0ZSBzaG9ydGN1dHMgZm9yIGN1c3RvbSBhbmltYXRpb25zCmpRdWVyeS5lYWNoKHsKCXNsaWRlRG93bjogZ2VuRngoInNob3ciKSwKCXNsaWRlVXA6IGdlbkZ4KCJoaWRlIiksCglzbGlkZVRvZ2dsZTogZ2VuRngoInRvZ2dsZSIpLAoJZmFkZUluOiB7IG9wYWNpdHk6ICJzaG93IiB9LAoJZmFkZU91dDogeyBvcGFjaXR5OiAiaGlkZSIgfSwKCWZhZGVUb2dnbGU6IHsgb3BhY2l0eTogInRvZ2dsZSIgfQp9LCBmdW5jdGlvbiggbmFtZSwgcHJvcHMgKSB7CglqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHsKCQlyZXR1cm4gdGhpcy5hbmltYXRlKCBwcm9wcywgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTsKCX07Cn0pOwoKalF1ZXJ5LnNwZWVkID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGZuICkgewoJdmFyIG9wdCA9IHNwZWVkICYmIHR5cGVvZiBzcGVlZCA9PT0gIm9iamVjdCIgPyBqUXVlcnkuZXh0ZW5kKCB7fSwgc3BlZWQgKSA6IHsKCQljb21wbGV0ZTogZm4gfHwgIWZuICYmIGVhc2luZyB8fAoJCQlqUXVlcnkuaXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCwKCQlkdXJhdGlvbjogc3BlZWQsCgkJZWFzaW5nOiBmbiAmJiBlYXNpbmcgfHwgZWFzaW5nICYmICFqUXVlcnkuaXNGdW5jdGlvbiggZWFzaW5nICkgJiYgZWFzaW5nCgl9OwoKCW9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5vZmYgPyAwIDogdHlwZW9mIG9wdC5kdXJhdGlvbiA9PT0gIm51bWJlciIgPyBvcHQuZHVyYXRpb24gOgoJCW9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzID8galF1ZXJ5LmZ4LnNwZWVkc1sgb3B0LmR1cmF0aW9uIF0gOiBqUXVlcnkuZnguc3BlZWRzLl9kZWZhdWx0OwoKCS8vIG5vcm1hbGl6ZSBvcHQucXVldWUgLSB0cnVlL3VuZGVmaW5lZC9udWxsIC0+ICJmeCIKCWlmICggb3B0LnF1ZXVlID09IG51bGwgfHwgb3B0LnF1ZXVlID09PSB0cnVlICkgewoJCW9wdC5xdWV1ZSA9ICJmeCI7Cgl9CgoJLy8gUXVldWVpbmcKCW9wdC5vbGQgPSBvcHQuY29tcGxldGU7CgoJb3B0LmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7CgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0Lm9sZCApICkgewoJCQlvcHQub2xkLmNhbGwoIHRoaXMgKTsKCQl9CgoJCWlmICggb3B0LnF1ZXVlICkgewoJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7CgkJfQoJfTsKCglyZXR1cm4gb3B0Owp9OwoKalF1ZXJ5LmVhc2luZyA9IHsKCWxpbmVhcjogZnVuY3Rpb24oIHAgKSB7CgkJcmV0dXJuIHA7Cgl9LAoJc3dpbmc6IGZ1bmN0aW9uKCBwICkgewoJCXJldHVybiAwLjUgLSBNYXRoLmNvcyggcCpNYXRoLlBJICkgLyAyOwoJfQp9OwoKalF1ZXJ5LnRpbWVycyA9IFtdOwpqUXVlcnkuZnggPSBUd2Vlbi5wcm90b3R5cGUuaW5pdDsKalF1ZXJ5LmZ4LnRpY2sgPSBmdW5jdGlvbigpIHsKCXZhciB0aW1lciwKCQl0aW1lcnMgPSBqUXVlcnkudGltZXJzLAoJCWkgPSAwOwoKCWZvciAoIDsgaSA8IHRpbWVycy5sZW5ndGg7IGkrKyApIHsKCQl0aW1lciA9IHRpbWVyc1sgaSBdOwoJCS8vIENoZWNrcyB0aGUgdGltZXIgaGFzIG5vdCBhbHJlYWR5IGJlZW4gcmVtb3ZlZAoJCWlmICggIXRpbWVyKCkgJiYgdGltZXJzWyBpIF0gPT09IHRpbWVyICkgewoJCQl0aW1lcnMuc3BsaWNlKCBpLS0sIDEgKTsKCQl9Cgl9CgoJaWYgKCAhdGltZXJzLmxlbmd0aCApIHsKCQlqUXVlcnkuZnguc3RvcCgpOwoJfQp9OwoKalF1ZXJ5LmZ4LnRpbWVyID0gZnVuY3Rpb24oIHRpbWVyICkgewoJaWYgKCB0aW1lcigpICYmIGpRdWVyeS50aW1lcnMucHVzaCggdGltZXIgKSAmJiAhdGltZXJJZCApIHsKCQl0aW1lcklkID0gc2V0SW50ZXJ2YWwoIGpRdWVyeS5meC50aWNrLCBqUXVlcnkuZnguaW50ZXJ2YWwgKTsKCX0KfTsKCmpRdWVyeS5meC5pbnRlcnZhbCA9IDEzOwoKalF1ZXJ5LmZ4LnN0b3AgPSBmdW5jdGlvbigpIHsKCWNsZWFySW50ZXJ2YWwoIHRpbWVySWQgKTsKCXRpbWVySWQgPSBudWxsOwp9OwoKalF1ZXJ5LmZ4LnNwZWVkcyA9IHsKCXNsb3c6IDYwMCwKCWZhc3Q6IDIwMCwKCS8vIERlZmF1bHQgc3BlZWQKCV9kZWZhdWx0OiA0MDAKfTsKCi8vIEJhY2sgQ29tcGF0IDwxLjggZXh0ZW5zaW9uIHBvaW50CmpRdWVyeS5meC5zdGVwID0ge307CgppZiAoIGpRdWVyeS5leHByICYmIGpRdWVyeS5leHByLmZpbHRlcnMgKSB7CglqUXVlcnkuZXhwci5maWx0ZXJzLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuIGpRdWVyeS5ncmVwKGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHsKCQkJcmV0dXJuIGVsZW0gPT09IGZuLmVsZW07CgkJfSkubGVuZ3RoOwoJfTsKfQp2YXIgcnJvb3QgPSAvXig/OmJvZHl8aHRtbCkkL2k7CgpqUXVlcnkuZm4ub2Zmc2V0ID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7CglpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJcmV0dXJuIG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/CgkJCXRoaXMgOgoJCQl0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApOwoJCQl9KTsKCX0KCgl2YXIgZG9jRWxlbSwgYm9keSwgd2luLCBjbGllbnRUb3AsIGNsaWVudExlZnQsIHNjcm9sbFRvcCwgc2Nyb2xsTGVmdCwKCQlib3ggPSB7IHRvcDogMCwgbGVmdDogMCB9LAoJCWVsZW0gPSB0aGlzWyAwIF0sCgkJZG9jID0gZWxlbSAmJiBlbGVtLm93bmVyRG9jdW1lbnQ7CgoJaWYgKCAhZG9jICkgewoJCXJldHVybjsKCX0KCglpZiAoIChib2R5ID0gZG9jLmJvZHkpID09PSBlbGVtICkgewoJCXJldHVybiBqUXVlcnkub2Zmc2V0LmJvZHlPZmZzZXQoIGVsZW0gKTsKCX0KCglkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudDsKCgkvLyBNYWtlIHN1cmUgaXQncyBub3QgYSBkaXNjb25uZWN0ZWQgRE9NIG5vZGUKCWlmICggIWpRdWVyeS5jb250YWlucyggZG9jRWxlbSwgZWxlbSApICkgewoJCXJldHVybiBib3g7Cgl9CgoJLy8gSWYgd2UgZG9uJ3QgaGF2ZSBnQkNSLCBqdXN0IHVzZSAwLDAgcmF0aGVyIHRoYW4gZXJyb3IKCS8vIEJsYWNrQmVycnkgNSwgaU9TIDMgKG9yaWdpbmFsIGlQaG9uZSkKCWlmICggdHlwZW9mIGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0ICE9PSAidW5kZWZpbmVkIiApIHsKCQlib3ggPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwoJfQoJd2luID0gZ2V0V2luZG93KCBkb2MgKTsKCWNsaWVudFRvcCAgPSBkb2NFbGVtLmNsaWVudFRvcCAgfHwgYm9keS5jbGllbnRUb3AgIHx8IDA7CgljbGllbnRMZWZ0ID0gZG9jRWxlbS5jbGllbnRMZWZ0IHx8IGJvZHkuY2xpZW50TGVmdCB8fCAwOwoJc2Nyb2xsVG9wICA9IHdpbi5wYWdlWU9mZnNldCB8fCBkb2NFbGVtLnNjcm9sbFRvcDsKCXNjcm9sbExlZnQgPSB3aW4ucGFnZVhPZmZzZXQgfHwgZG9jRWxlbS5zY3JvbGxMZWZ0OwoJcmV0dXJuIHsKCQl0b3A6IGJveC50b3AgICsgc2Nyb2xsVG9wICAtIGNsaWVudFRvcCwKCQlsZWZ0OiBib3gubGVmdCArIHNjcm9sbExlZnQgLSBjbGllbnRMZWZ0Cgl9Owp9OwoKalF1ZXJ5Lm9mZnNldCA9IHsKCglib2R5T2Zmc2V0OiBmdW5jdGlvbiggYm9keSApIHsKCQl2YXIgdG9wID0gYm9keS5vZmZzZXRUb3AsCgkJCWxlZnQgPSBib2R5Lm9mZnNldExlZnQ7CgoJCWlmICggalF1ZXJ5LnN1cHBvcnQuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQgKSB7CgkJCXRvcCAgKz0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhib2R5LCAibWFyZ2luVG9wIikgKSB8fCAwOwoJCQlsZWZ0ICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoYm9keSwgIm1hcmdpbkxlZnQiKSApIHx8IDA7CgkJfQoKCQlyZXR1cm4geyB0b3A6IHRvcCwgbGVmdDogbGVmdCB9OwoJfSwKCglzZXRPZmZzZXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBpICkgewoJCXZhciBwb3NpdGlvbiA9IGpRdWVyeS5jc3MoIGVsZW0sICJwb3NpdGlvbiIgKTsKCgkJLy8gc2V0IHBvc2l0aW9uIGZpcnN0LCBpbi1jYXNlIHRvcC9sZWZ0IGFyZSBzZXQgZXZlbiBvbiBzdGF0aWMgZWxlbQoJCWlmICggcG9zaXRpb24gPT09ICJzdGF0aWMiICkgewoJCQllbGVtLnN0eWxlLnBvc2l0aW9uID0gInJlbGF0aXZlIjsKCQl9CgoJCXZhciBjdXJFbGVtID0galF1ZXJ5KCBlbGVtICksCgkJCWN1ck9mZnNldCA9IGN1ckVsZW0ub2Zmc2V0KCksCgkJCWN1ckNTU1RvcCA9IGpRdWVyeS5jc3MoIGVsZW0sICJ0b3AiICksCgkJCWN1ckNTU0xlZnQgPSBqUXVlcnkuY3NzKCBlbGVtLCAibGVmdCIgKSwKCQkJY2FsY3VsYXRlUG9zaXRpb24gPSAoIHBvc2l0aW9uID09PSAiYWJzb2x1dGUiIHx8IHBvc2l0aW9uID09PSAiZml4ZWQiICkgJiYgalF1ZXJ5LmluQXJyYXkoImF1dG8iLCBbY3VyQ1NTVG9wLCBjdXJDU1NMZWZ0XSkgPiAtMSwKCQkJcHJvcHMgPSB7fSwgY3VyUG9zaXRpb24gPSB7fSwgY3VyVG9wLCBjdXJMZWZ0OwoKCQkvLyBuZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlciB0b3Agb3IgbGVmdCBpcyBhdXRvIGFuZCBwb3NpdGlvbiBpcyBlaXRoZXIgYWJzb2x1dGUgb3IgZml4ZWQKCQlpZiAoIGNhbGN1bGF0ZVBvc2l0aW9uICkgewoJCQljdXJQb3NpdGlvbiA9IGN1ckVsZW0ucG9zaXRpb24oKTsKCQkJY3VyVG9wID0gY3VyUG9zaXRpb24udG9wOwoJCQljdXJMZWZ0ID0gY3VyUG9zaXRpb24ubGVmdDsKCQl9IGVsc2UgewoJCQljdXJUb3AgPSBwYXJzZUZsb2F0KCBjdXJDU1NUb3AgKSB8fCAwOwoJCQljdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7CgkJfQoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBvcHRpb25zICkgKSB7CgkJCW9wdGlvbnMgPSBvcHRpb25zLmNhbGwoIGVsZW0sIGksIGN1ck9mZnNldCApOwoJCX0KCgkJaWYgKCBvcHRpb25zLnRvcCAhPSBudWxsICkgewoJCQlwcm9wcy50b3AgPSAoIG9wdGlvbnMudG9wIC0gY3VyT2Zmc2V0LnRvcCApICsgY3VyVG9wOwoJCX0KCQlpZiAoIG9wdGlvbnMubGVmdCAhPSBudWxsICkgewoJCQlwcm9wcy5sZWZ0ID0gKCBvcHRpb25zLmxlZnQgLSBjdXJPZmZzZXQubGVmdCApICsgY3VyTGVmdDsKCQl9CgoJCWlmICggInVzaW5nIiBpbiBvcHRpb25zICkgewoJCQlvcHRpb25zLnVzaW5nLmNhbGwoIGVsZW0sIHByb3BzICk7CgkJfSBlbHNlIHsKCQkJY3VyRWxlbS5jc3MoIHByb3BzICk7CgkJfQoJfQp9OwoKCmpRdWVyeS5mbi5leHRlbmQoewoKCXBvc2l0aW9uOiBmdW5jdGlvbigpIHsKCQlpZiAoICF0aGlzWzBdICkgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIgZWxlbSA9IHRoaXNbMF0sCgoJCS8vIEdldCAqcmVhbCogb2Zmc2V0UGFyZW50CgkJb2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQoKSwKCgkJLy8gR2V0IGNvcnJlY3Qgb2Zmc2V0cwoJCW9mZnNldCAgICAgICA9IHRoaXMub2Zmc2V0KCksCgkJcGFyZW50T2Zmc2V0ID0gcnJvb3QudGVzdChvZmZzZXRQYXJlbnRbMF0ubm9kZU5hbWUpID8geyB0b3A6IDAsIGxlZnQ6IDAgfSA6IG9mZnNldFBhcmVudC5vZmZzZXQoKTsKCgkJLy8gU3VidHJhY3QgZWxlbWVudCBtYXJnaW5zCgkJLy8gbm90ZTogd2hlbiBhbiBlbGVtZW50IGhhcyBtYXJnaW46IGF1dG8gdGhlIG9mZnNldExlZnQgYW5kIG1hcmdpbkxlZnQKCQkvLyBhcmUgdGhlIHNhbWUgaW4gU2FmYXJpIGNhdXNpbmcgb2Zmc2V0LmxlZnQgdG8gaW5jb3JyZWN0bHkgYmUgMAoJCW9mZnNldC50b3AgIC09IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoZWxlbSwgIm1hcmdpblRvcCIpICkgfHwgMDsKCQlvZmZzZXQubGVmdCAtPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKGVsZW0sICJtYXJnaW5MZWZ0IikgKSB8fCAwOwoKCQkvLyBBZGQgb2Zmc2V0UGFyZW50IGJvcmRlcnMKCQlwYXJlbnRPZmZzZXQudG9wICArPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKG9mZnNldFBhcmVudFswXSwgImJvcmRlclRvcFdpZHRoIikgKSB8fCAwOwoJCXBhcmVudE9mZnNldC5sZWZ0ICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3Mob2Zmc2V0UGFyZW50WzBdLCAiYm9yZGVyTGVmdFdpZHRoIikgKSB8fCAwOwoKCQkvLyBTdWJ0cmFjdCB0aGUgdHdvIG9mZnNldHMKCQlyZXR1cm4gewoJCQl0b3A6ICBvZmZzZXQudG9wICAtIHBhcmVudE9mZnNldC50b3AsCgkJCWxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQKCQl9OwoJfSwKCglvZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLm1hcChmdW5jdGlvbigpIHsKCQkJdmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50LmJvZHk7CgkJCXdoaWxlICggb2Zmc2V0UGFyZW50ICYmICghcnJvb3QudGVzdChvZmZzZXRQYXJlbnQubm9kZU5hbWUpICYmIGpRdWVyeS5jc3Mob2Zmc2V0UGFyZW50LCAicG9zaXRpb24iKSA9PT0gInN0YXRpYyIpICkgewoJCQkJb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDsKCQkJfQoJCQlyZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50LmJvZHk7CgkJfSk7Cgl9Cn0pOwoKCi8vIENyZWF0ZSBzY3JvbGxMZWZ0IGFuZCBzY3JvbGxUb3AgbWV0aG9kcwpqUXVlcnkuZWFjaCgge3Njcm9sbExlZnQ6ICJwYWdlWE9mZnNldCIsIHNjcm9sbFRvcDogInBhZ2VZT2Zmc2V0In0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7Cgl2YXIgdG9wID0gL1kvLnRlc3QoIHByb3AgKTsKCglqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVuY3Rpb24oIHZhbCApIHsKCQlyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG1ldGhvZCwgdmFsICkgewoJCQl2YXIgd2luID0gZ2V0V2luZG93KCBlbGVtICk7CgoJCQlpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkgewoJCQkJcmV0dXJuIHdpbiA/IChwcm9wIGluIHdpbikgPyB3aW5bIHByb3AgXSA6CgkJCQkJd2luLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgbWV0aG9kIF0gOgoJCQkJCWVsZW1bIG1ldGhvZCBdOwoJCQl9CgoJCQlpZiAoIHdpbiApIHsKCQkJCXdpbi5zY3JvbGxUbygKCQkJCQkhdG9wID8gdmFsIDogalF1ZXJ5KCB3aW4gKS5zY3JvbGxMZWZ0KCksCgkJCQkJIHRvcCA/IHZhbCA6IGpRdWVyeSggd2luICkuc2Nyb2xsVG9wKCkKCQkJCSk7CgoJCQl9IGVsc2UgewoJCQkJZWxlbVsgbWV0aG9kIF0gPSB2YWw7CgkJCX0KCQl9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCwgbnVsbCApOwoJfTsKfSk7CgpmdW5jdGlvbiBnZXRXaW5kb3coIGVsZW0gKSB7CglyZXR1cm4galF1ZXJ5LmlzV2luZG93KCBlbGVtICkgPwoJCWVsZW0gOgoJCWVsZW0ubm9kZVR5cGUgPT09IDkgPwoJCQllbGVtLmRlZmF1bHRWaWV3IHx8IGVsZW0ucGFyZW50V2luZG93IDoKCQkJZmFsc2U7Cn0KLy8gQ3JlYXRlIGlubmVySGVpZ2h0LCBpbm5lcldpZHRoLCBoZWlnaHQsIHdpZHRoLCBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBtZXRob2RzCmpRdWVyeS5lYWNoKCB7IEhlaWdodDogImhlaWdodCIsIFdpZHRoOiAid2lkdGgiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkgewoJalF1ZXJ5LmVhY2goIHsgcGFkZGluZzogImlubmVyIiArIG5hbWUsIGNvbnRlbnQ6IHR5cGUsICIiOiAib3V0ZXIiICsgbmFtZSB9LCBmdW5jdGlvbiggZGVmYXVsdEV4dHJhLCBmdW5jTmFtZSApIHsKCQkvLyBtYXJnaW4gaXMgb25seSBmb3Igb3V0ZXJIZWlnaHQsIG91dGVyV2lkdGgKCQlqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHsKCQkJdmFyIGNoYWluYWJsZSA9IGFyZ3VtZW50cy5sZW5ndGggJiYgKCBkZWZhdWx0RXh0cmEgfHwgdHlwZW9mIG1hcmdpbiAhPT0gImJvb2xlYW4iICksCgkJCQlleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/ICJtYXJnaW4iIDogImJvcmRlciIgKTsKCgkJCXJldHVybiBqUXVlcnkuYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgdHlwZSwgdmFsdWUgKSB7CgkJCQl2YXIgZG9jOwoKCQkJCWlmICggalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7CgkJCQkJLy8gQXMgb2YgNS84LzIwMTIgdGhpcyB3aWxsIHlpZWxkIGluY29ycmVjdCByZXN1bHRzIGZvciBNb2JpbGUgU2FmYXJpLCBidXQgdGhlcmUKCQkJCQkvLyBpc24ndCBhIHdob2xlIGxvdCB3ZSBjYW4gZG8uIFNlZSBwdWxsIHJlcXVlc3QgYXQgdGhpcyBVUkwgZm9yIGRpc2N1c3Npb246CgkJCQkJLy8gaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvcHVsbC83NjQKCQkJCQlyZXR1cm4gZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbICJjbGllbnQiICsgbmFtZSBdOwoJCQkJfQoKCQkJCS8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHQKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHsKCQkJCQlkb2MgPSBlbGVtLmRvY3VtZW50RWxlbWVudDsKCgkJCQkJLy8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLCB3aGljaGV2ZXIgaXMgZ3JlYXRlc3QKCQkJCQkvLyB1bmZvcnR1bmF0ZWx5LCB0aGlzIGNhdXNlcyBidWcgIzM4MzggaW4gSUU2Lzggb25seSwgYnV0IHRoZXJlIGlzIGN1cnJlbnRseSBubyBnb29kLCBzbWFsbCB3YXkgdG8gZml4IGl0LgoJCQkJCXJldHVybiBNYXRoLm1heCgKCQkJCQkJZWxlbS5ib2R5WyAic2Nyb2xsIiArIG5hbWUgXSwgZG9jWyAic2Nyb2xsIiArIG5hbWUgXSwKCQkJCQkJZWxlbS5ib2R5WyAib2Zmc2V0IiArIG5hbWUgXSwgZG9jWyAib2Zmc2V0IiArIG5hbWUgXSwKCQkJCQkJZG9jWyAiY2xpZW50IiArIG5hbWUgXQoJCQkJCSk7CgkJCQl9CgoJCQkJcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPwoJCQkJCS8vIEdldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQsIHJlcXVlc3RpbmcgYnV0IG5vdCBmb3JjaW5nIHBhcnNlRmxvYXQKCQkJCQlqUXVlcnkuY3NzKCBlbGVtLCB0eXBlLCB2YWx1ZSwgZXh0cmEgKSA6CgoJCQkJCS8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKCQkJCQlqUXVlcnkuc3R5bGUoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApOwoJCQl9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSwgbnVsbCApOwoJCX07Cgl9KTsKfSk7Ci8vIEV4cG9zZSBqUXVlcnkgdG8gdGhlIGdsb2JhbCBvYmplY3QKd2luZG93LmpRdWVyeSA9IHdpbmRvdy4kID0galF1ZXJ5OwoKLy8gRXhwb3NlIGpRdWVyeSBhcyBhbiBBTUQgbW9kdWxlLCBidXQgb25seSBmb3IgQU1EIGxvYWRlcnMgdGhhdAovLyB1bmRlcnN0YW5kIHRoZSBpc3N1ZXMgd2l0aCBsb2FkaW5nIG11bHRpcGxlIHZlcnNpb25zIG9mIGpRdWVyeQovLyBpbiBhIHBhZ2UgdGhhdCBhbGwgbWlnaHQgY2FsbCBkZWZpbmUoKS4gVGhlIGxvYWRlciB3aWxsIGluZGljYXRlCi8vIHRoZXkgaGF2ZSBzcGVjaWFsIGFsbG93YW5jZXMgZm9yIG11bHRpcGxlIGpRdWVyeSB2ZXJzaW9ucyBieQovLyBzcGVjaWZ5aW5nIGRlZmluZS5hbWQualF1ZXJ5ID0gdHJ1ZS4gUmVnaXN0ZXIgYXMgYSBuYW1lZCBtb2R1bGUsCi8vIHNpbmNlIGpRdWVyeSBjYW4gYmUgY29uY2F0ZW5hdGVkIHdpdGggb3RoZXIgZmlsZXMgdGhhdCBtYXkgdXNlIGRlZmluZSwKLy8gYnV0IG5vdCB1c2UgYSBwcm9wZXIgY29uY2F0ZW5hdGlvbiBzY3JpcHQgdGhhdCB1bmRlcnN0YW5kcyBhbm9ueW1vdXMKLy8gQU1EIG1vZHVsZXMuIEEgbmFtZWQgQU1EIGlzIHNhZmVzdCBhbmQgbW9zdCByb2J1c3Qgd2F5IHRvIHJlZ2lzdGVyLgovLyBMb3dlcmNhc2UganF1ZXJ5IGlzIHVzZWQgYmVjYXVzZSBBTUQgbW9kdWxlIG5hbWVzIGFyZSBkZXJpdmVkIGZyb20KLy8gZmlsZSBuYW1lcywgYW5kIGpRdWVyeSBpcyBub3JtYWxseSBkZWxpdmVyZWQgaW4gYSBsb3dlcmNhc2UgZmlsZSBuYW1lLgovLyBEbyB0aGlzIGFmdGVyIGNyZWF0aW5nIHRoZSBnbG9iYWwgc28gdGhhdCBpZiBhbiBBTUQgbW9kdWxlIHdhbnRzIHRvIGNhbGwKLy8gbm9Db25mbGljdCB0byBoaWRlIHRoaXMgdmVyc2lvbiBvZiBqUXVlcnksIGl0IHdpbGwgd29yay4KaWYgKCB0eXBlb2YgZGVmaW5lID09PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQgJiYgZGVmaW5lLmFtZC5qUXVlcnkgKSB7CglkZWZpbmUoICJqcXVlcnkiLCBbXSwgZnVuY3Rpb24gKCkgeyByZXR1cm4galF1ZXJ5OyB9ICk7Cn0KCn0pKCB3aW5kb3cgKTsK]]></data>
	</file>
	<file>
	  <filename>/assets/javascripts/jquery.placeholder.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGh0dHA6Ly9tdGhzLmJlL3BsYWNlaG9sZGVyIHYyLjAuNyBieSBAbWF0aGlhcyAqLwo7KGZ1bmN0aW9uKHdpbmRvdywgZG9jdW1lbnQsICQpIHsKCgl2YXIgaXNJbnB1dFN1cHBvcnRlZCA9ICdwbGFjZWhvbGRlcicgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKSwKCSAgICBpc1RleHRhcmVhU3VwcG9ydGVkID0gJ3BsYWNlaG9sZGVyJyBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpLAoJICAgIHByb3RvdHlwZSA9ICQuZm4sCgkgICAgdmFsSG9va3MgPSAkLnZhbEhvb2tzLAoJICAgIGhvb2tzLAoJICAgIHBsYWNlaG9sZGVyOwoKCWlmIChpc0lucHV0U3VwcG9ydGVkICYmIGlzVGV4dGFyZWFTdXBwb3J0ZWQpIHsKCgkJcGxhY2Vob2xkZXIgPSBwcm90b3R5cGUucGxhY2Vob2xkZXIgPSBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIHRoaXM7CgkJfTsKCgkJcGxhY2Vob2xkZXIuaW5wdXQgPSBwbGFjZWhvbGRlci50ZXh0YXJlYSA9IHRydWU7CgoJfSBlbHNlIHsKCgkJcGxhY2Vob2xkZXIgPSBwcm90b3R5cGUucGxhY2Vob2xkZXIgPSBmdW5jdGlvbigpIHsKCQkJdmFyICR0aGlzID0gdGhpczsKCQkJJHRoaXMKCQkJCS5maWx0ZXIoKGlzSW5wdXRTdXBwb3J0ZWQgPyAndGV4dGFyZWEnIDogJzppbnB1dCcpICsgJ1twbGFjZWhvbGRlcl0nKQoJCQkJLm5vdCgnLnBsYWNlaG9sZGVyJykKCQkJCS5iaW5kKHsKCQkJCQknZm9jdXMucGxhY2Vob2xkZXInOiBjbGVhclBsYWNlaG9sZGVyLAoJCQkJCSdibHVyLnBsYWNlaG9sZGVyJzogc2V0UGxhY2Vob2xkZXIKCQkJCX0pCgkJCQkuZGF0YSgncGxhY2Vob2xkZXItZW5hYmxlZCcsIHRydWUpCgkJCQkudHJpZ2dlcignYmx1ci5wbGFjZWhvbGRlcicpOwoJCQlyZXR1cm4gJHRoaXM7CgkJfTsKCgkJcGxhY2Vob2xkZXIuaW5wdXQgPSBpc0lucHV0U3VwcG9ydGVkOwoJCXBsYWNlaG9sZGVyLnRleHRhcmVhID0gaXNUZXh0YXJlYVN1cHBvcnRlZDsKCgkJaG9va3MgPSB7CgkJCSdnZXQnOiBmdW5jdGlvbihlbGVtZW50KSB7CgkJCQl2YXIgJGVsZW1lbnQgPSAkKGVsZW1lbnQpOwoJCQkJcmV0dXJuICRlbGVtZW50LmRhdGEoJ3BsYWNlaG9sZGVyLWVuYWJsZWQnKSAmJiAkZWxlbWVudC5oYXNDbGFzcygncGxhY2Vob2xkZXInKSA/ICcnIDogZWxlbWVudC52YWx1ZTsKCQkJfSwKCQkJJ3NldCc6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7CgkJCQl2YXIgJGVsZW1lbnQgPSAkKGVsZW1lbnQpOwoJCQkJaWYgKCEkZWxlbWVudC5kYXRhKCdwbGFjZWhvbGRlci1lbmFibGVkJykpIHsKCQkJCQlyZXR1cm4gZWxlbWVudC52YWx1ZSA9IHZhbHVlOwoJCQkJfQoJCQkJaWYgKHZhbHVlID09ICcnKSB7CgkJCQkJZWxlbWVudC52YWx1ZSA9IHZhbHVlOwoJCQkJCS8vIElzc3VlICM1NjogU2V0dGluZyB0aGUgcGxhY2Vob2xkZXIgY2F1c2VzIHByb2JsZW1zIGlmIHRoZSBlbGVtZW50IGNvbnRpbnVlcyB0byBoYXZlIGZvY3VzLgoJCQkJCWlmIChlbGVtZW50ICE9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpIHsKCQkJCQkJLy8gV2UgY2FuJ3QgdXNlIGB0cmlnZ2VySGFuZGxlcmAgaGVyZSBiZWNhdXNlIG9mIGR1bW15IHRleHQvcGFzc3dvcmQgaW5wdXRzIDooCgkJCQkJCXNldFBsYWNlaG9sZGVyLmNhbGwoZWxlbWVudCk7CgkJCQkJfQoJCQkJfSBlbHNlIGlmICgkZWxlbWVudC5oYXNDbGFzcygncGxhY2Vob2xkZXInKSkgewoJCQkJCWNsZWFyUGxhY2Vob2xkZXIuY2FsbChlbGVtZW50LCB0cnVlLCB2YWx1ZSkgfHwgKGVsZW1lbnQudmFsdWUgPSB2YWx1ZSk7CgkJCQl9IGVsc2UgewoJCQkJCWVsZW1lbnQudmFsdWUgPSB2YWx1ZTsKCQkJCX0KCQkJCS8vIGBzZXRgIGNhbiBub3QgcmV0dXJuIGB1bmRlZmluZWRgOyBzZWUgaHR0cDovL2pzYXBpLmluZm8vanF1ZXJ5LzEuNy4xL3ZhbCNMMjM2MwoJCQkJcmV0dXJuICRlbGVtZW50OwoJCQl9CgkJfTsKCgkJaXNJbnB1dFN1cHBvcnRlZCB8fCAodmFsSG9va3MuaW5wdXQgPSBob29rcyk7CgkJaXNUZXh0YXJlYVN1cHBvcnRlZCB8fCAodmFsSG9va3MudGV4dGFyZWEgPSBob29rcyk7CgoJCSQoZnVuY3Rpb24oKSB7CgkJCS8vIExvb2sgZm9yIGZvcm1zCgkJCSQoZG9jdW1lbnQpLmRlbGVnYXRlKCdmb3JtJywgJ3N1Ym1pdC5wbGFjZWhvbGRlcicsIGZ1bmN0aW9uKCkgewoJCQkJLy8gQ2xlYXIgdGhlIHBsYWNlaG9sZGVyIHZhbHVlcyBzbyB0aGV5IGRvbid0IGdldCBzdWJtaXR0ZWQKCQkJCXZhciAkaW5wdXRzID0gJCgnLnBsYWNlaG9sZGVyJywgdGhpcykuZWFjaChjbGVhclBsYWNlaG9sZGVyKTsKCQkJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCQkJJGlucHV0cy5lYWNoKHNldFBsYWNlaG9sZGVyKTsKCQkJCX0sIDEwKTsKCQkJfSk7CgkJfSk7CgoJCS8vIENsZWFyIHBsYWNlaG9sZGVyIHZhbHVlcyB1cG9uIHBhZ2UgcmVsb2FkCgkJJCh3aW5kb3cpLmJpbmQoJ2JlZm9yZXVubG9hZC5wbGFjZWhvbGRlcicsIGZ1bmN0aW9uKCkgewoJCQkkKCcucGxhY2Vob2xkZXInKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdGhpcy52YWx1ZSA9ICcnOwoJCQl9KTsKCQl9KTsKCgl9CgoJZnVuY3Rpb24gYXJncyhlbGVtKSB7CgkJLy8gUmV0dXJuIGFuIG9iamVjdCBvZiBlbGVtZW50IGF0dHJpYnV0ZXMKCQl2YXIgbmV3QXR0cnMgPSB7fSwKCQkgICAgcmlubGluZWpRdWVyeSA9IC9ealF1ZXJ5XGQrJC87CgkJJC5lYWNoKGVsZW0uYXR0cmlidXRlcywgZnVuY3Rpb24oaSwgYXR0cikgewoJCQlpZiAoYXR0ci5zcGVjaWZpZWQgJiYgIXJpbmxpbmVqUXVlcnkudGVzdChhdHRyLm5hbWUpKSB7CgkJCQluZXdBdHRyc1thdHRyLm5hbWVdID0gYXR0ci52YWx1ZTsKCQkJfQoJCX0pOwoJCXJldHVybiBuZXdBdHRyczsKCX0KCglmdW5jdGlvbiBjbGVhclBsYWNlaG9sZGVyKGV2ZW50LCB2YWx1ZSkgewoJCXZhciBpbnB1dCA9IHRoaXMsCgkJICAgICRpbnB1dCA9ICQoaW5wdXQpOwoJCWlmIChpbnB1dC52YWx1ZSA9PSAkaW5wdXQuYXR0cigncGxhY2Vob2xkZXInKSAmJiAkaW5wdXQuaGFzQ2xhc3MoJ3BsYWNlaG9sZGVyJykpIHsKCQkJaWYgKCRpbnB1dC5kYXRhKCdwbGFjZWhvbGRlci1wYXNzd29yZCcpKSB7CgkJCQkkaW5wdXQgPSAkaW5wdXQuaGlkZSgpLm5leHQoKS5zaG93KCkuYXR0cignaWQnLCAkaW5wdXQucmVtb3ZlQXR0cignaWQnKS5kYXRhKCdwbGFjZWhvbGRlci1pZCcpKTsKCQkJCS8vIElmIGBjbGVhclBsYWNlaG9sZGVyYCB3YXMgY2FsbGVkIGZyb20gYCQudmFsSG9va3MuaW5wdXQuc2V0YAoJCQkJaWYgKGV2ZW50ID09PSB0cnVlKSB7CgkJCQkJcmV0dXJuICRpbnB1dFswXS52YWx1ZSA9IHZhbHVlOwoJCQkJfQoJCQkJJGlucHV0LmZvY3VzKCk7CgkJCX0gZWxzZSB7CgkJCQlpbnB1dC52YWx1ZSA9ICcnOwoJCQkJJGlucHV0LnJlbW92ZUNsYXNzKCdwbGFjZWhvbGRlcicpOwoJCQkJaW5wdXQgPT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiBpbnB1dC5zZWxlY3QoKTsKCQkJfQoJCX0KCX0KCglmdW5jdGlvbiBzZXRQbGFjZWhvbGRlcigpIHsKCQl2YXIgJHJlcGxhY2VtZW50LAoJCSAgICBpbnB1dCA9IHRoaXMsCgkJICAgICRpbnB1dCA9ICQoaW5wdXQpLAoJCSAgICAkb3JpZ0lucHV0ID0gJGlucHV0LAoJCSAgICBpZCA9IHRoaXMuaWQ7CgkJaWYgKGlucHV0LnZhbHVlID09ICcnKSB7CgkJCWlmIChpbnB1dC50eXBlID09ICdwYXNzd29yZCcpIHsKCQkJCWlmICghJGlucHV0LmRhdGEoJ3BsYWNlaG9sZGVyLXRleHRpbnB1dCcpKSB7CgkJCQkJdHJ5IHsKCQkJCQkJJHJlcGxhY2VtZW50ID0gJGlucHV0LmNsb25lKCkuYXR0cih7ICd0eXBlJzogJ3RleHQnIH0pOwoJCQkJCX0gY2F0Y2goZSkgewoJCQkJCQkkcmVwbGFjZW1lbnQgPSAkKCc8aW5wdXQ+JykuYXR0cigkLmV4dGVuZChhcmdzKHRoaXMpLCB7ICd0eXBlJzogJ3RleHQnIH0pKTsKCQkJCQl9CgkJCQkJJHJlcGxhY2VtZW50CgkJCQkJCS5yZW1vdmVBdHRyKCduYW1lJykKCQkJCQkJLmRhdGEoewoJCQkJCQkJJ3BsYWNlaG9sZGVyLXBhc3N3b3JkJzogdHJ1ZSwKCQkJCQkJCSdwbGFjZWhvbGRlci1pZCc6IGlkCgkJCQkJCX0pCgkJCQkJCS5iaW5kKCdmb2N1cy5wbGFjZWhvbGRlcicsIGNsZWFyUGxhY2Vob2xkZXIpOwoJCQkJCSRpbnB1dAoJCQkJCQkuZGF0YSh7CgkJCQkJCQkncGxhY2Vob2xkZXItdGV4dGlucHV0JzogJHJlcGxhY2VtZW50LAoJCQkJCQkJJ3BsYWNlaG9sZGVyLWlkJzogaWQKCQkJCQkJfSkKCQkJCQkJLmJlZm9yZSgkcmVwbGFjZW1lbnQpOwoJCQkJfQoJCQkJJGlucHV0ID0gJGlucHV0LnJlbW92ZUF0dHIoJ2lkJykuaGlkZSgpLnByZXYoKS5hdHRyKCdpZCcsIGlkKS5zaG93KCk7CgkJCQkvLyBOb3RlOiBgJGlucHV0WzBdICE9IGlucHV0YCBub3chCgkJCX0KCQkJJGlucHV0LmFkZENsYXNzKCdwbGFjZWhvbGRlcicpOwoJCQkkaW5wdXRbMF0udmFsdWUgPSAkaW5wdXQuYXR0cigncGxhY2Vob2xkZXInKTsKCQl9IGVsc2UgewoJCQkkaW5wdXQucmVtb3ZlQ2xhc3MoJ3BsYWNlaG9sZGVyJyk7CgkJfQoJfQoKfSh0aGlzLCBkb2N1bWVudCwgalF1ZXJ5KSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/assets/javascripts/modernizr.foundation.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogTW9kZXJuaXpyIDIuNi4yIChDdXN0b20gQnVpbGQpIHwgTUlUICYgQlNECiAqIEJ1aWxkOiBodHRwOi8vbW9kZXJuaXpyLmNvbS9kb3dubG9hZC8jLWlubGluZXN2Zy1zdmctc3ZnY2xpcHBhdGhzLXRvdWNoLXNoaXYtbXEtY3NzY2xhc3Nlcy10ZXN0c3R5bGVzLXByZWZpeGVzLWllOGNvbXBhdC1sb2FkCiAqLwo7d2luZG93Lk1vZGVybml6cj1mdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24geShhKXtqLmNzc1RleHQ9YX1mdW5jdGlvbiB6KGEsYil7cmV0dXJuIHkobS5qb2luKGErIjsiKSsoYnx8IiIpKX1mdW5jdGlvbiBBKGEsYil7cmV0dXJuIHR5cGVvZiBhPT09Yn1mdW5jdGlvbiBCKGEsYil7cmV0dXJuISF+KCIiK2EpLmluZGV4T2YoYil9ZnVuY3Rpb24gQyhhLGIsZCl7Zm9yKHZhciBlIGluIGEpe3ZhciBmPWJbYVtlXV07aWYoZiE9PWMpcmV0dXJuIGQ9PT0hMT9hW2VdOkEoZiwiZnVuY3Rpb24iKT9mLmJpbmQoZHx8Yik6Zn1yZXR1cm4hMX12YXIgZD0iMi42LjIiLGU9e30sZj0hMCxnPWIuZG9jdW1lbnRFbGVtZW50LGg9Im1vZGVybml6ciIsaT1iLmNyZWF0ZUVsZW1lbnQoaCksaj1pLnN0eWxlLGssbD17fS50b1N0cmluZyxtPSIgLXdlYmtpdC0gLW1vei0gLW8tIC1tcy0gIi5zcGxpdCgiICIpLG49e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcifSxvPXt9LHA9e30scT17fSxyPVtdLHM9ci5zbGljZSx0LHU9ZnVuY3Rpb24oYSxjLGQsZSl7dmFyIGYsaSxqLGssbD1iLmNyZWF0ZUVsZW1lbnQoImRpdiIpLG09Yi5ib2R5LG49bXx8Yi5jcmVhdGVFbGVtZW50KCJib2R5Iik7aWYocGFyc2VJbnQoZCwxMCkpd2hpbGUoZC0tKWo9Yi5jcmVhdGVFbGVtZW50KCJkaXYiKSxqLmlkPWU/ZVtkXTpoKyhkKzEpLGwuYXBwZW5kQ2hpbGQoaik7cmV0dXJuIGY9WyImIzE3MzsiLCc8c3R5bGUgaWQ9InMnLGgsJyI+JyxhLCI8L3N0eWxlPiJdLmpvaW4oIiIpLGwuaWQ9aCwobT9sOm4pLmlubmVySFRNTCs9ZixuLmFwcGVuZENoaWxkKGwpLG18fChuLnN0eWxlLmJhY2tncm91bmQ9IiIsbi5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixrPWcuc3R5bGUub3ZlcmZsb3csZy5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixnLmFwcGVuZENoaWxkKG4pKSxpPWMobCxhKSxtP2wucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChsKToobi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG4pLGcuc3R5bGUub3ZlcmZsb3c9ayksISFpfSx2PWZ1bmN0aW9uKGIpe3ZhciBjPWEubWF0Y2hNZWRpYXx8YS5tc01hdGNoTWVkaWE7aWYoYylyZXR1cm4gYyhiKS5tYXRjaGVzO3ZhciBkO3JldHVybiB1KCJAbWVkaWEgIitiKyIgeyAjIitoKyIgeyBwb3NpdGlvbjogYWJzb2x1dGU7IH0gfSIsZnVuY3Rpb24oYil7ZD0oYS5nZXRDb21wdXRlZFN0eWxlP2dldENvbXB1dGVkU3R5bGUoYixudWxsKTpiLmN1cnJlbnRTdHlsZSlbInBvc2l0aW9uIl09PSJhYnNvbHV0ZSJ9KSxkfSx3PXt9Lmhhc093blByb3BlcnR5LHg7IUEodywidW5kZWZpbmVkIikmJiFBKHcuY2FsbCwidW5kZWZpbmVkIik/eD1mdW5jdGlvbihhLGIpe3JldHVybiB3LmNhbGwoYSxiKX06eD1mdW5jdGlvbihhLGIpe3JldHVybiBiIGluIGEmJkEoYS5jb25zdHJ1Y3Rvci5wcm90b3R5cGVbYl0sInVuZGVmaW5lZCIpfSxGdW5jdGlvbi5wcm90b3R5cGUuYmluZHx8KEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kPWZ1bmN0aW9uKGIpe3ZhciBjPXRoaXM7aWYodHlwZW9mIGMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcjt2YXIgZD1zLmNhbGwoYXJndW1lbnRzLDEpLGU9ZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2YgZSl7dmFyIGE9ZnVuY3Rpb24oKXt9O2EucHJvdG90eXBlPWMucHJvdG90eXBlO3ZhciBmPW5ldyBhLGc9Yy5hcHBseShmLGQuY29uY2F0KHMuY2FsbChhcmd1bWVudHMpKSk7cmV0dXJuIE9iamVjdChnKT09PWc/ZzpmfXJldHVybiBjLmFwcGx5KGIsZC5jb25jYXQocy5jYWxsKGFyZ3VtZW50cykpKX07cmV0dXJuIGV9KSxvLnRvdWNoPWZ1bmN0aW9uKCl7dmFyIGM7cmV0dXJuIm9udG91Y2hzdGFydCJpbiBhfHxhLkRvY3VtZW50VG91Y2gmJmIgaW5zdGFuY2VvZiBEb2N1bWVudFRvdWNoP2M9ITA6dShbIkBtZWRpYSAoIixtLmpvaW4oInRvdWNoLWVuYWJsZWQpLCgiKSxoLCIpIiwieyNtb2Rlcm5penJ7dG9wOjlweDtwb3NpdGlvbjphYnNvbHV0ZX19Il0uam9pbigiIiksZnVuY3Rpb24oYSl7Yz1hLm9mZnNldFRvcD09PTl9KSxjfSxvLnN2Zz1mdW5jdGlvbigpe3JldHVybiEhYi5jcmVhdGVFbGVtZW50TlMmJiEhYi5jcmVhdGVFbGVtZW50TlMobi5zdmcsInN2ZyIpLmNyZWF0ZVNWR1JlY3R9LG8uaW5saW5lc3ZnPWZ1bmN0aW9uKCl7dmFyIGE9Yi5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gYS5pbm5lckhUTUw9IjxzdmcvPiIsKGEuZmlyc3RDaGlsZCYmYS5maXJzdENoaWxkLm5hbWVzcGFjZVVSSSk9PW4uc3ZnfSxvLnN2Z2NsaXBwYXRocz1mdW5jdGlvbigpe3JldHVybiEhYi5jcmVhdGVFbGVtZW50TlMmJi9TVkdDbGlwUGF0aC8udGVzdChsLmNhbGwoYi5jcmVhdGVFbGVtZW50TlMobi5zdmcsImNsaXBQYXRoIikpKX07Zm9yKHZhciBEIGluIG8peChvLEQpJiYodD1ELnRvTG93ZXJDYXNlKCksZVt0XT1vW0RdKCksci5wdXNoKChlW3RdPyIiOiJuby0iKSt0KSk7cmV0dXJuIGUuYWRkVGVzdD1mdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT0ib2JqZWN0Iilmb3IodmFyIGQgaW4gYSl4KGEsZCkmJmUuYWRkVGVzdChkLGFbZF0pO2Vsc2V7YT1hLnRvTG93ZXJDYXNlKCk7aWYoZVthXSE9PWMpcmV0dXJuIGU7Yj10eXBlb2YgYj09ImZ1bmN0aW9uIj9iKCk6Yix0eXBlb2YgZiE9InVuZGVmaW5lZCImJmYmJihnLmNsYXNzTmFtZSs9IiAiKyhiPyIiOiJuby0iKSthKSxlW2FdPWJ9cmV0dXJuIGV9LHkoIiIpLGk9az1udWxsLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gayhhLGIpe3ZhciBjPWEuY3JlYXRlRWxlbWVudCgicCIpLGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdfHxhLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gYy5pbm5lckhUTUw9Ing8c3R5bGU+IitiKyI8L3N0eWxlPiIsZC5pbnNlcnRCZWZvcmUoYy5sYXN0Q2hpbGQsZC5maXJzdENoaWxkKX1mdW5jdGlvbiBsKCl7dmFyIGE9ci5lbGVtZW50cztyZXR1cm4gdHlwZW9mIGE9PSJzdHJpbmciP2Euc3BsaXQoIiAiKTphfWZ1bmN0aW9uIG0oYSl7dmFyIGI9aVthW2ddXTtyZXR1cm4gYnx8KGI9e30saCsrLGFbZ109aCxpW2hdPWIpLGJ9ZnVuY3Rpb24gbihhLGMsZil7Y3x8KGM9Yik7aWYoailyZXR1cm4gYy5jcmVhdGVFbGVtZW50KGEpO2Z8fChmPW0oYykpO3ZhciBnO3JldHVybiBmLmNhY2hlW2FdP2c9Zi5jYWNoZVthXS5jbG9uZU5vZGUoKTplLnRlc3QoYSk/Zz0oZi5jYWNoZVthXT1mLmNyZWF0ZUVsZW0oYSkpLmNsb25lTm9kZSgpOmc9Zi5jcmVhdGVFbGVtKGEpLGcuY2FuSGF2ZUNoaWxkcmVuJiYhZC50ZXN0KGEpP2YuZnJhZy5hcHBlbmRDaGlsZChnKTpnfWZ1bmN0aW9uIG8oYSxjKXthfHwoYT1iKTtpZihqKXJldHVybiBhLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtjPWN8fG0oYSk7dmFyIGQ9Yy5mcmFnLmNsb25lTm9kZSgpLGU9MCxmPWwoKSxnPWYubGVuZ3RoO2Zvcig7ZTxnO2UrKylkLmNyZWF0ZUVsZW1lbnQoZltlXSk7cmV0dXJuIGR9ZnVuY3Rpb24gcChhLGIpe2IuY2FjaGV8fChiLmNhY2hlPXt9LGIuY3JlYXRlRWxlbT1hLmNyZWF0ZUVsZW1lbnQsYi5jcmVhdGVGcmFnPWEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCxiLmZyYWc9Yi5jcmVhdGVGcmFnKCkpLGEuY3JlYXRlRWxlbWVudD1mdW5jdGlvbihjKXtyZXR1cm4gci5zaGl2TWV0aG9kcz9uKGMsYSxiKTpiLmNyZWF0ZUVsZW0oYyl9LGEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudD1GdW5jdGlvbigiaCxmIiwicmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49Zi5jbG9uZU5vZGUoKSxjPW4uY3JlYXRlRWxlbWVudDtoLnNoaXZNZXRob2RzJiYoIitsKCkuam9pbigpLnJlcGxhY2UoL1x3Ky9nLGZ1bmN0aW9uKGEpe3JldHVybiBiLmNyZWF0ZUVsZW0oYSksYi5mcmFnLmNyZWF0ZUVsZW1lbnQoYSksJ2MoIicrYSsnIiknfSkrIik7cmV0dXJuIG59IikocixiLmZyYWcpfWZ1bmN0aW9uIHEoYSl7YXx8KGE9Yik7dmFyIGM9bShhKTtyZXR1cm4gci5zaGl2Q1NTJiYhZiYmIWMuaGFzQ1NTJiYoYy5oYXNDU1M9ISFrKGEsImFydGljbGUsYXNpZGUsZmlnY2FwdGlvbixmaWd1cmUsZm9vdGVyLGhlYWRlcixoZ3JvdXAsbmF2LHNlY3Rpb257ZGlzcGxheTpibG9ja31tYXJre2JhY2tncm91bmQ6I0ZGMDtjb2xvcjojMDAwfSIpKSxqfHxwKGEsYyksYX12YXIgYz1hLmh0bWw1fHx7fSxkPS9ePHxeKD86YnV0dG9ufG1hcHxzZWxlY3R8dGV4dGFyZWF8b2JqZWN0fGlmcmFtZXxvcHRpb258b3B0Z3JvdXApJC9pLGU9L14oPzphfGJ8Y29kZXxkaXZ8ZmllbGRzZXR8aDF8aDJ8aDN8aDR8aDV8aDZ8aXxsYWJlbHxsaXxvbHxwfHF8c3BhbnxzdHJvbmd8c3R5bGV8dGFibGV8dGJvZHl8dGR8dGh8dHJ8dWwpJC9pLGYsZz0iX2h0bWw1c2hpdiIsaD0wLGk9e30sajsoZnVuY3Rpb24oKXt0cnl7dmFyIGE9Yi5jcmVhdGVFbGVtZW50KCJhIik7YS5pbm5lckhUTUw9Ijx4eXo+PC94eXo+IixmPSJoaWRkZW4iaW4gYSxqPWEuY2hpbGROb2Rlcy5sZW5ndGg9PTF8fGZ1bmN0aW9uKCl7Yi5jcmVhdGVFbGVtZW50KCJhIik7dmFyIGE9Yi5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7cmV0dXJuIHR5cGVvZiBhLmNsb25lTm9kZT09InVuZGVmaW5lZCJ8fHR5cGVvZiBhLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQ9PSJ1bmRlZmluZWQifHx0eXBlb2YgYS5jcmVhdGVFbGVtZW50PT0idW5kZWZpbmVkIn0oKX1jYXRjaChjKXtmPSEwLGo9ITB9fSkoKTt2YXIgcj17ZWxlbWVudHM6Yy5lbGVtZW50c3x8ImFiYnIgYXJ0aWNsZSBhc2lkZSBhdWRpbyBiZGkgY2FudmFzIGRhdGEgZGF0YWxpc3QgZGV0YWlscyBmaWdjYXB0aW9uIGZpZ3VyZSBmb290ZXIgaGVhZGVyIGhncm91cCBtYXJrIG1ldGVyIG5hdiBvdXRwdXQgcHJvZ3Jlc3Mgc2VjdGlvbiBzdW1tYXJ5IHRpbWUgdmlkZW8iLHNoaXZDU1M6Yy5zaGl2Q1NTIT09ITEsc3VwcG9ydHNVbmtub3duRWxlbWVudHM6aixzaGl2TWV0aG9kczpjLnNoaXZNZXRob2RzIT09ITEsdHlwZToiZGVmYXVsdCIsc2hpdkRvY3VtZW50OnEsY3JlYXRlRWxlbWVudDpuLGNyZWF0ZURvY3VtZW50RnJhZ21lbnQ6b307YS5odG1sNT1yLHEoYil9KHRoaXMsYiksZS5fdmVyc2lvbj1kLGUuX3ByZWZpeGVzPW0sZS5tcT12LGUudGVzdFN0eWxlcz11LGcuY2xhc3NOYW1lPWcuY2xhc3NOYW1lLnJlcGxhY2UoLyhefFxzKW5vLWpzKFxzfCQpLywiJDEkMiIpKyhmPyIganMgIityLmpvaW4oIiAiKToiIiksZX0odGhpcyx0aGlzLmRvY3VtZW50KSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXtyZXR1cm4iW29iamVjdCBGdW5jdGlvbl0iPT1vLmNhbGwoYSl9ZnVuY3Rpb24gZShhKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGF9ZnVuY3Rpb24gZigpe31mdW5jdGlvbiBnKGEpe3JldHVybiFhfHwibG9hZGVkIj09YXx8ImNvbXBsZXRlIj09YXx8InVuaW5pdGlhbGl6ZWQiPT1hfWZ1bmN0aW9uIGgoKXt2YXIgYT1wLnNoaWZ0KCk7cT0xLGE/YS50P20oZnVuY3Rpb24oKXsoImMiPT1hLnQ/Qi5pbmplY3RDc3M6Qi5pbmplY3RKcykoYS5zLDAsYS5hLGEueCxhLmUsMSl9LDApOihhKCksaCgpKTpxPTB9ZnVuY3Rpb24gaShhLGMsZCxlLGYsaSxqKXtmdW5jdGlvbiBrKGIpe2lmKCFvJiZnKGwucmVhZHlTdGF0ZSkmJih1LnI9bz0xLCFxJiZoKCksbC5vbmxvYWQ9bC5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxiKSl7ImltZyIhPWEmJm0oZnVuY3Rpb24oKXt0LnJlbW92ZUNoaWxkKGwpfSw1MCk7Zm9yKHZhciBkIGluIHlbY10peVtjXS5oYXNPd25Qcm9wZXJ0eShkKSYmeVtjXVtkXS5vbmxvYWQoKX19dmFyIGo9anx8Qi5lcnJvclRpbWVvdXQsbD1iLmNyZWF0ZUVsZW1lbnQoYSksbz0wLHI9MCx1PXt0OmQsczpjLGU6ZixhOmkseDpqfTsxPT09eVtjXSYmKHI9MSx5W2NdPVtdKSwib2JqZWN0Ij09YT9sLmRhdGE9YzoobC5zcmM9YyxsLnR5cGU9YSksbC53aWR0aD1sLmhlaWdodD0iMCIsbC5vbmVycm9yPWwub25sb2FkPWwub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7ay5jYWxsKHRoaXMscil9LHAuc3BsaWNlKGUsMCx1KSwiaW1nIiE9YSYmKHJ8fDI9PT15W2NdPyh0Lmluc2VydEJlZm9yZShsLHM/bnVsbDpuKSxtKGssaikpOnlbY10ucHVzaChsKSl9ZnVuY3Rpb24gaihhLGIsYyxkLGYpe3JldHVybiBxPTAsYj1ifHwiaiIsZShhKT9pKCJjIj09Yj92OnUsYSxiLHRoaXMuaSsrLGMsZCxmKToocC5zcGxpY2UodGhpcy5pKyssMCxhKSwxPT1wLmxlbmd0aCYmaCgpKSx0aGlzfWZ1bmN0aW9uIGsoKXt2YXIgYT1CO3JldHVybiBhLmxvYWRlcj17bG9hZDpqLGk6MH0sYX12YXIgbD1iLmRvY3VtZW50RWxlbWVudCxtPWEuc2V0VGltZW91dCxuPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpWzBdLG89e30udG9TdHJpbmcscD1bXSxxPTAscj0iTW96QXBwZWFyYW5jZSJpbiBsLnN0eWxlLHM9ciYmISFiLmNyZWF0ZVJhbmdlKCkuY29tcGFyZU5vZGUsdD1zP2w6bi5wYXJlbnROb2RlLGw9YS5vcGVyYSYmIltvYmplY3QgT3BlcmFdIj09by5jYWxsKGEub3BlcmEpLGw9ISFiLmF0dGFjaEV2ZW50JiYhbCx1PXI/Im9iamVjdCI6bD8ic2NyaXB0IjoiaW1nIix2PWw/InNjcmlwdCI6dSx3PUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGEpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PW8uY2FsbChhKX0seD1bXSx5PXt9LHo9e3RpbWVvdXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5sZW5ndGgmJihhLnRpbWVvdXQ9YlswXSksYX19LEEsQjtCPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGE9YS5zcGxpdCgiISIpLGI9eC5sZW5ndGgsYz1hLnBvcCgpLGQ9YS5sZW5ndGgsYz17dXJsOmMsb3JpZ1VybDpjLHByZWZpeGVzOmF9LGUsZixnO2ZvcihmPTA7ZjxkO2YrKylnPWFbZl0uc3BsaXQoIj0iKSwoZT16W2cuc2hpZnQoKV0pJiYoYz1lKGMsZykpO2ZvcihmPTA7ZjxiO2YrKyljPXhbZl0oYyk7cmV0dXJuIGN9ZnVuY3Rpb24gZyhhLGUsZixnLGgpe3ZhciBpPWIoYSksaj1pLmF1dG9DYWxsYmFjaztpLnVybC5zcGxpdCgiLiIpLnBvcCgpLnNwbGl0KCI/Iikuc2hpZnQoKSxpLmJ5cGFzc3x8KGUmJihlPWQoZSk/ZTplW2FdfHxlW2ddfHxlW2Euc3BsaXQoIi8iKS5wb3AoKS5zcGxpdCgiPyIpWzBdXSksaS5pbnN0ZWFkP2kuaW5zdGVhZChhLGUsZixnLGgpOih5W2kudXJsXT9pLm5vZXhlYz0hMDp5W2kudXJsXT0xLGYubG9hZChpLnVybCxpLmZvcmNlQ1NTfHwhaS5mb3JjZUpTJiYiY3NzIj09aS51cmwuc3BsaXQoIi4iKS5wb3AoKS5zcGxpdCgiPyIpLnNoaWZ0KCk/ImMiOmMsaS5ub2V4ZWMsaS5hdHRycyxpLnRpbWVvdXQpLChkKGUpfHxkKGopKSYmZi5sb2FkKGZ1bmN0aW9uKCl7aygpLGUmJmUoaS5vcmlnVXJsLGgsZyksaiYmaihpLm9yaWdVcmwsaCxnKSx5W2kudXJsXT0yfSkpKX1mdW5jdGlvbiBoKGEsYil7ZnVuY3Rpb24gYyhhLGMpe2lmKGEpe2lmKGUoYSkpY3x8KGo9ZnVuY3Rpb24oKXt2YXIgYT1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7ay5hcHBseSh0aGlzLGEpLGwoKX0pLGcoYSxqLGIsMCxoKTtlbHNlIGlmKE9iamVjdChhKT09PWEpZm9yKG4gaW4gbT1mdW5jdGlvbigpe3ZhciBiPTAsYztmb3IoYyBpbiBhKWEuaGFzT3duUHJvcGVydHkoYykmJmIrKztyZXR1cm4gYn0oKSxhKWEuaGFzT3duUHJvcGVydHkobikmJighYyYmIS0tbSYmKGQoaik/aj1mdW5jdGlvbigpe3ZhciBhPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtrLmFwcGx5KHRoaXMsYSksbCgpfTpqW25dPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBiPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTthJiZhLmFwcGx5KHRoaXMsYiksbCgpfX0oa1tuXSkpLGcoYVtuXSxqLGIsbixoKSl9ZWxzZSFjJiZsKCl9dmFyIGg9ISFhLnRlc3QsaT1hLmxvYWR8fGEuYm90aCxqPWEuY2FsbGJhY2t8fGYsaz1qLGw9YS5jb21wbGV0ZXx8ZixtLG47YyhoP2EueWVwOmEubm9wZSwhIWkpLGkmJmMoaSl9dmFyIGksaixsPXRoaXMueWVwbm9wZS5sb2FkZXI7aWYoZShhKSlnKGEsMCxsLDApO2Vsc2UgaWYodyhhKSlmb3IoaT0wO2k8YS5sZW5ndGg7aSsrKWo9YVtpXSxlKGopP2coaiwwLGwsMCk6dyhqKT9CKGopOk9iamVjdChqKT09PWomJmgoaixsKTtlbHNlIE9iamVjdChhKT09PWEmJmgoYSxsKX0sQi5hZGRQcmVmaXg9ZnVuY3Rpb24oYSxiKXt6W2FdPWJ9LEIuYWRkRmlsdGVyPWZ1bmN0aW9uKGEpe3gucHVzaChhKX0sQi5lcnJvclRpbWVvdXQ9MWU0LG51bGw9PWIucmVhZHlTdGF0ZSYmYi5hZGRFdmVudExpc3RlbmVyJiYoYi5yZWFkeVN0YXRlPSJsb2FkaW5nIixiLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEE9ZnVuY3Rpb24oKXtiLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEEsMCksYi5yZWFkeVN0YXRlPSJjb21wbGV0ZSJ9LDApKSxhLnllcG5vcGU9aygpLGEueWVwbm9wZS5leGVjdXRlU3RhY2s9aCxhLnllcG5vcGUuaW5qZWN0SnM9ZnVuY3Rpb24oYSxjLGQsZSxpLGope3ZhciBrPWIuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksbCxvLGU9ZXx8Qi5lcnJvclRpbWVvdXQ7ay5zcmM9YTtmb3IobyBpbiBkKWsuc2V0QXR0cmlidXRlKG8sZFtvXSk7Yz1qP2g6Y3x8ZixrLm9ucmVhZHlzdGF0ZWNoYW5nZT1rLm9ubG9hZD1mdW5jdGlvbigpeyFsJiZnKGsucmVhZHlTdGF0ZSkmJihsPTEsYygpLGsub25sb2FkPWsub25yZWFkeXN0YXRlY2hhbmdlPW51bGwpfSxtKGZ1bmN0aW9uKCl7bHx8KGw9MSxjKDEpKX0sZSksaT9rLm9ubG9hZCgpOm4ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoayxuKX0sYS55ZXBub3BlLmluamVjdENzcz1mdW5jdGlvbihhLGMsZCxlLGcsaSl7dmFyIGU9Yi5jcmVhdGVFbGVtZW50KCJsaW5rIiksaixjPWk/aDpjfHxmO2UuaHJlZj1hLGUucmVsPSJzdHlsZXNoZWV0IixlLnR5cGU9InRleHQvY3NzIjtmb3IoaiBpbiBkKWUuc2V0QXR0cmlidXRlKGosZFtqXSk7Z3x8KG4ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxuKSxtKGMsMCkpfX0odGhpcyxkb2N1bWVudCksTW9kZXJuaXpyLmxvYWQ9ZnVuY3Rpb24oKXt5ZXBub3BlLmFwcGx5KHdpbmRvdyxbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSl9LE1vZGVybml6ci5hZGRUZXN0KCJpZThjb21wYXQiLGZ1bmN0aW9uKCl7cmV0dXJuIXdpbmRvdy5hZGRFdmVudExpc3RlbmVyJiZkb2N1bWVudC5kb2N1bWVudE1vZGUmJmRvY3VtZW50LmRvY3VtZW50TW9kZT09PTd9KTsK]]></data>
	</file>
	<file>
	  <filename>/assets/stylesheets/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/assets/stylesheets/app.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogQXJ0ZnVsbHkgbWFzdGVybWluZGVkIGJ5IFpVUkIgICovCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKICAgVGFibGUgb2YgQ29udGVudHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KOjogU2hhcmVkIFN0eWxlcwo6OiBQYWdlIE5hbWUgMQo6OiBQYWdlIE5hbWUgMgoqLwoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFNoYXJlZCBTdHlsZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgUGFnZSBOYW1lIDEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCgoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFBhZ2UgTmFtZSAyCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoK]]></data>
	</file>
	<file>
	  <filename>/assets/stylesheets/foundation.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogUmVxdWlyZXM6IG5vcm1hbGl6ZS5jc3MgKi8KLyogR2xvYmFsIFJlc2V0ICYgU3RhbmRhcmRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKiwgKjpiZWZvcmUsICo6YWZ0ZXIgeyAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7IC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgfQoKaHRtbCB7IGZvbnQtc2l6ZTogNjIuNSU7IH0KCmJvZHkgeyBiYWNrZ3JvdW5kOiB3aGl0ZTsgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsICJIZWx2ZXRpY2EiLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogbm9ybWFsOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDE7IGNvbG9yOiAjMjIyMjIyOyBwb3NpdGlvbjogcmVsYXRpdmU7IC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOyB9CgovKiBMaW5rcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmEgaW1nIHsgYm9yZGVyOiBub25lOyB9CgphIHsgY29sb3I6ICMyYmE2Y2I7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgbGluZS1oZWlnaHQ6IGluaGVyaXQ7IH0KCmE6aG92ZXIgeyBjb2xvcjogIzI3OTViNjsgfQoKYTpmb2N1cyB7IGNvbG9yOiAjMjc5NWI2OyB9CgpwIGEsIHAgYTp2aXNpdGVkIHsgbGluZS1oZWlnaHQ6IGluaGVyaXQ7IH0KCi8qIE1pc2MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubGVmdCB7IGZsb2F0OiBsZWZ0OyB9CgoucmlnaHQgeyBmbG9hdDogcmlnaHQ7IH0KCi50ZXh0LWxlZnQgeyB0ZXh0LWFsaWduOiBsZWZ0OyB9CgoudGV4dC1yaWdodCB7IHRleHQtYWxpZ246IHJpZ2h0OyB9CgoudGV4dC1jZW50ZXIgeyB0ZXh0LWFsaWduOiBjZW50ZXI7IH0KCi5oaWRlIHsgZGlzcGxheTogbm9uZTsgfQoKLmhpZGUtb3ZlcnJpZGUgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0KCi5oaWdobGlnaHQgeyBiYWNrZ3JvdW5kOiAjZmZmZjk5OyB9CgojZ29vZ2xlbWFwIGltZywgb2JqZWN0LCBlbWJlZCB7IG1heC13aWR0aDogbm9uZTsgfQoKI21hcF9jYW52YXMgZW1iZWQgeyBtYXgtd2lkdGg6IG5vbmU7IH0KCiNtYXBfY2FudmFzIGltZyB7IG1heC13aWR0aDogbm9uZTsgfQoKI21hcF9jYW52YXMgb2JqZWN0IHsgbWF4LXdpZHRoOiBub25lOyB9CgovKiBSZXNldCBmb3Igc3RyYW5nZSBtYXJnaW5zIGJ5IGRlZmF1bHQgb24gPGZpZ3VyZT4gZWxlbWVudHMgKi8KZmlndXJlIHsgbWFyZ2luOiAwOyB9CgovKiBCYXNlIFR5cGUgU3R5bGVzIFVzaW5nIE1vZHVsYXIgU2NhbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpib2R5LCBkaXYsIGRsLCBkdCwgZGQsIHVsLCBvbCwgbGksIGgxLCBoMiwgaDMsIGg0LCBoNSwgaDYsIHByZSwgZm9ybSwgcCwgYmxvY2txdW90ZSwgdGgsIHRkIHsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyBmb250LXNpemU6IDE0cHg7IGRpcmVjdGlvbjogbHRyOyB9CgpwIHsgZm9udC1mYW1pbHk6IGluaGVyaXQ7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDEuNjsgbWFyZ2luLWJvdHRvbTogMTdweDsgfQpwLmxlYWQgeyBmb250LXNpemU6IDE3LjVweDsgbGluZS1oZWlnaHQ6IDEuNjsgbWFyZ2luLWJvdHRvbTogMTdweDsgfQoKYXNpZGUgcCB7IGZvbnQtc2l6ZTogMTNweDsgbGluZS1oZWlnaHQ6IDEuMzU7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQoKaDEsIGgyLCBoMywgaDQsIGg1LCBoNiB7IGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCAiSGVsdmV0aWNhIiwgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtc3R5bGU6IG5vcm1hbDsgY29sb3I6ICMyMjIyMjI7IHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7IGxpbmUtaGVpZ2h0OiAxLjE7IG1hcmdpbi1ib3R0b206IDE0cHg7IG1hcmdpbi10b3A6IDE0cHg7IH0KaDEgc21hbGwsIGgyIHNtYWxsLCBoMyBzbWFsbCwgaDQgc21hbGwsIGg1IHNtYWxsLCBoNiBzbWFsbCB7IGZvbnQtc2l6ZTogNjAlOyBjb2xvcjogIzZmNmY2ZjsgbGluZS1oZWlnaHQ6IDA7IH0KCmgxIHsgZm9udC1zaXplOiA0NHB4OyB9CgpoMiB7IGZvbnQtc2l6ZTogMzdweDsgfQoKaDMgeyBmb250LXNpemU6IDI3cHg7IH0KCmg0IHsgZm9udC1zaXplOiAyM3B4OyB9CgpoNSB7IGZvbnQtc2l6ZTogMTdweDsgfQoKaDYgeyBmb250LXNpemU6IDE0cHg7IH0KCmhyIHsgYm9yZGVyOiBzb2xpZCAjZGRkOyBib3JkZXItd2lkdGg6IDFweCAwIDA7IGNsZWFyOiBib3RoOyBtYXJnaW46IDIycHggMCAyMXB4OyBoZWlnaHQ6IDA7IH0KCi5zdWJoZWFkZXIgeyBsaW5lLWhlaWdodDogMS4zOyBjb2xvcjogIzZmNmY2ZjsgZm9udC13ZWlnaHQ6IDMwMDsgbWFyZ2luLWJvdHRvbTogMTdweDsgfQoKZW0sIGkgeyBmb250LXN0eWxlOiBpdGFsaWM7IGxpbmUtaGVpZ2h0OiBpbmhlcml0OyB9CgpzdHJvbmcsIGIgeyBmb250LXdlaWdodDogYm9sZDsgbGluZS1oZWlnaHQ6IGluaGVyaXQ7IH0KCnNtYWxsIHsgZm9udC1zaXplOiA2MCU7IGxpbmUtaGVpZ2h0OiBpbmhlcml0OyB9Cgpjb2RlIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IGJhY2tncm91bmQ6ICNmZmZmOTk7IH0KCi8qIExpc3RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KdWwsIG9sLCBkbCB7IGZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDEuNjsgbWFyZ2luLWJvdHRvbTogMTdweDsgbGlzdC1zdHlsZS1wb3NpdGlvbjogb3V0c2lkZTsgfQoKdWwgbGkgdWwsIHVsIGxpIG9sIHsgbWFyZ2luLWxlZnQ6IDIwcHg7IG1hcmdpbi1ib3R0b206IDA7IH0KdWwuc3F1YXJlLCB1bC5jaXJjbGUsIHVsLmRpc2MgeyBtYXJnaW4tbGVmdDogMTdweDsgfQp1bC5zcXVhcmUgeyBsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsgfQp1bC5zcXVhcmUgbGkgdWwgeyBsaXN0LXN0eWxlOiBpbmhlcml0OyB9CnVsLmNpcmNsZSB7IGxpc3Qtc3R5bGUtdHlwZTogY2lyY2xlOyB9CnVsLmNpcmNsZSBsaSB1bCB7IGxpc3Qtc3R5bGU6IGluaGVyaXQ7IH0KdWwuZGlzYyB7IGxpc3Qtc3R5bGUtdHlwZTogZGlzYzsgfQp1bC5kaXNjIGxpIHVsIHsgbGlzdC1zdHlsZTogaW5oZXJpdDsgfQp1bC5uby1idWxsZXQgeyBsaXN0LXN0eWxlOiBub25lOyB9CnVsLmxhcmdlIGxpIHsgbGluZS1oZWlnaHQ6IDIxcHg7IH0KCm9sIHsgbWFyZ2luLWxlZnQ6IDIwcHg7IH0Kb2wgbGkgdWwsIG9sIGxpIG9sIHsgbWFyZ2luLWxlZnQ6IDIwcHg7IG1hcmdpbi1ib3R0b206IDA7IH0KCi8qIEJsb2NrcXVvdGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KYmxvY2txdW90ZSwgYmxvY2txdW90ZSBwIHsgbGluZS1oZWlnaHQ6IDEuNTsgY29sb3I6ICM2ZjZmNmY7IH0KCmJsb2NrcXVvdGUgeyBtYXJnaW46IDAgMCAxN3B4OyBwYWRkaW5nOiA5cHggMjBweCAwIDE5cHg7IGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2RkZDsgfQpibG9ja3F1b3RlIGNpdGUgeyBkaXNwbGF5OiBibG9jazsgZm9udC1zaXplOiAxM3B4OyBjb2xvcjogIzU1NTU1NTsgfQpibG9ja3F1b3RlIGNpdGU6YmVmb3JlIHsgY29udGVudDogIlwyMDE0IFwwMDIwIjsgfQpibG9ja3F1b3RlIGNpdGUgYSwgYmxvY2txdW90ZSBjaXRlIGE6dmlzaXRlZCB7IGNvbG9yOiAjNTU1NTU1OyB9CgphYmJyLCBhY3JvbnltIHsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgZm9udC1zaXplOiA5MCU7IGNvbG9yOiAjMjIyMjIyOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDsgY3Vyc29yOiBoZWxwOyB9CgphYmJyIHsgdGV4dC10cmFuc2Zvcm06IG5vbmU7IH0KCi8qIFByaW50IHN0eWxlcy4gIElubGluZWQgdG8gYXZvaWQgcmVxdWlyZWQgSFRUUCBjb25uZWN0aW9uOiB3d3cucGhwaWVkLmNvbS9kZWxheS1sb2FkaW5nLXlvdXItcHJpbnQtY3NzLyBDcmVkaXQgdG8gUGF1bCBJcmlzaCBhbmQgSFRNTDUgQm9pbGVycGxhdGUgKGh0bWw1Ym9pbGVycGxhdGUuY29tKQoqLwoucHJpbnQtb25seSB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfQoKQG1lZGlhIHByaW50IHsgKiB7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7IGNvbG9yOiBibGFjayAhaW1wb3J0YW50OyBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7IHRleHQtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7IGZpbHRlcjogbm9uZSAhaW1wb3J0YW50OyAtbXMtZmlsdGVyOiBub25lICFpbXBvcnRhbnQ7IH0KICAvKiBCbGFjayBwcmludHMgZmFzdGVyOiBoNWJwLmNvbS9zICovCiAgYSwgYTp2aXNpdGVkIHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KICBhW2hyZWZdOmFmdGVyIHsgY29udGVudDogIiAoIiBhdHRyKGhyZWYpICIpIjsgfQogIGFiYnJbdGl0bGVdOmFmdGVyIHsgY29udGVudDogIiAoIiBhdHRyKHRpdGxlKSAiKSI7IH0KICAuaXIgYTphZnRlciwgYVtocmVmXj0iamF2YXNjcmlwdDoiXTphZnRlciwgYVtocmVmXj0iIyJdOmFmdGVyIHsgY29udGVudDogIiI7IH0KICAvKiBEb24ndCBzaG93IGxpbmtzIGZvciBpbWFnZXMsIG9yIGphdmFzY3JpcHQvaW50ZXJuYWwgbGlua3MgKi8KICBwcmUsIGJsb2NrcXVvdGUgeyBib3JkZXI6IDFweCBzb2xpZCAjOTk5OyBwYWdlLWJyZWFrLWluc2lkZTogYXZvaWQ7IH0KICB0aGVhZCB7IGRpc3BsYXk6IHRhYmxlLWhlYWRlci1ncm91cDsgfQogIC8qIGg1YnAuY29tL3QgKi8KICB0ciwgaW1nIHsgcGFnZS1icmVhay1pbnNpZGU6IGF2b2lkOyB9CiAgaW1nIHsgbWF4LXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IH0KICBAcGFnZSB7IG1hcmdpbjogMC41Y207IH0KICBwLCBoMiwgaDMgeyBvcnBoYW5zOiAzOyB3aWRvd3M6IDM7IH0KICBoMiwgaDMgeyBwYWdlLWJyZWFrLWFmdGVyOiBhdm9pZDsgfQogIC5oaWRlLW9uLXByaW50IHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9CiAgLnByaW50LW9ubHkgeyBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyB9CiAgLmhpZGUtZm9yLXByaW50IHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9CiAgLnNob3ctZm9yLXByaW50IHsgZGlzcGxheTogaW5oZXJpdCAhaW1wb3J0YW50OyB9IH0KLyogUmVxdWlyZXMgZ2xvYmFscy5jc3MgKi8KLyogU3RhbmRhcmQgRm9ybXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpmb3JtIHsgbWFyZ2luOiAwIDAgMTkuNDE2NDFweDsgfQoKLnJvdyBmb3JtIC5yb3cgeyBtYXJnaW46IDAgLTZweDsgfQoucm93IGZvcm0gLnJvdyAuY29sdW1uLCAucm93IGZvcm0gLnJvdyAuY29sdW1ucyB7IHBhZGRpbmc6IDAgNnB4OyB9Ci5yb3cgZm9ybSAucm93LmNvbGxhcHNlIHsgbWFyZ2luOiAwOyB9Ci5yb3cgZm9ybSAucm93LmNvbGxhcHNlIC5jb2x1bW4sIC5yb3cgZm9ybSAucm93LmNvbGxhcHNlIC5jb2x1bW5zIHsgcGFkZGluZzogMDsgfQoKbGFiZWwgeyBmb250LXNpemU6IDE0cHg7IGNvbG9yOiAjNGQ0ZDRkOyBjdXJzb3I6IHBvaW50ZXI7IGRpc3BsYXk6IGJsb2NrOyBmb250LXdlaWdodDogNTAwOyBtYXJnaW4tYm90dG9tOiAzcHg7IH0KbGFiZWwucmlnaHQgeyBmbG9hdDogbm9uZTsgdGV4dC1hbGlnbjogcmlnaHQ7IH0KbGFiZWwuaW5saW5lIHsgbGluZS1oZWlnaHQ6IDMycHg7IG1hcmdpbjogMCAwIDEycHggMDsgfQoKLnByZWZpeCwgLnBvc3RmaXggeyBkaXNwbGF5OiBibG9jazsgcG9zaXRpb246IHJlbGF0aXZlOyB6LWluZGV4OiAyOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHdpZHRoOiAxMDAlOyBwYWRkaW5nLXRvcDogMDsgcGFkZGluZy1ib3R0b206IDA7IGhlaWdodDogMzJweDsgbGluZS1oZWlnaHQ6IDMxcHg7IH0KCmEuYnV0dG9uLnByZWZpeCwgYS5idXR0b24ucG9zdGZpeCB7IHBhZGRpbmctbGVmdDogMDsgcGFkZGluZy1yaWdodDogMDsgdGV4dC1hbGlnbjogY2VudGVyOyB9CgpzcGFuLnByZWZpeCwgc3Bhbi5wb3N0Zml4IHsgYmFja2dyb3VuZDogI2YyZjJmMjsgYm9yZGVyOiAxcHggc29saWQgI2NjY2NjYzsgfQoKLnByZWZpeCB7IGxlZnQ6IDJweDsgLW1vei1ib3JkZXItcmFkaXVzLXRvcGxlZnQ6IDJweDsgLXdlYmtpdC1ib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAycHg7IGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDJweDsgLW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbWxlZnQ6IDJweDsgLXdlYmtpdC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAycHg7IGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDJweDsgb3ZlcmZsb3c6IGhpZGRlbjsgfQoKLnBvc3RmaXggeyByaWdodDogMnB4OyAtbW96LWJvcmRlci1yYWRpdXMtdG9wcmlnaHQ6IDJweDsgLXdlYmtpdC1ib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMnB4OyBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMnB4OyAtbW96LWJvcmRlci1yYWRpdXMtYm90dG9tcmlnaHQ6IDJweDsgLXdlYmtpdC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMnB4OyBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMnB4OyB9CgppbnB1dFt0eXBlPSJ0ZXh0Il0sIGlucHV0W3R5cGU9InBhc3N3b3JkIl0sIGlucHV0W3R5cGU9ImRhdGUiXSwgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXSwgaW5wdXRbdHlwZT0iZW1haWwiXSwgaW5wdXRbdHlwZT0ibnVtYmVyIl0sIGlucHV0W3R5cGU9InNlYXJjaCJdLCBpbnB1dFt0eXBlPSJ0ZWwiXSwgaW5wdXRbdHlwZT0idGltZSJdLCBpbnB1dFt0eXBlPSJ1cmwiXSwgdGV4dGFyZWEgeyBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgZm9udC1mYW1pbHk6IGluaGVyaXQ7IGJvcmRlcjogMXB4IHNvbGlkICNjY2NjY2M7IC13ZWJraXQtYm9yZGVyLXJhZGl1czogMnB4OyAtbW96LWJvcmRlci1yYWRpdXM6IDJweDsgLW1zLWJvcmRlci1yYWRpdXM6IDJweDsgLW8tYm9yZGVyLXJhZGl1czogMnB4OyBib3JkZXItcmFkaXVzOiAycHg7IC13ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xKTsgLW1vei1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjEpOyBib3gtc2hhZG93OiBpbnNldCAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjEpOyBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjc1KTsgZGlzcGxheTogYmxvY2s7IGZvbnQtc2l6ZTogMTRweDsgbWFyZ2luOiAwIDAgMTJweCAwOyBwYWRkaW5nOiA2cHg7IGhlaWdodDogMzJweDsgd2lkdGg6IDEwMCU7IC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuMTVzIGxpbmVhcjsgLW1vei10cmFuc2l0aW9uOiBhbGwgMC4xNXMgbGluZWFyOyAtby10cmFuc2l0aW9uOiBhbGwgMC4xNXMgbGluZWFyOyB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgbGluZWFyOyB9CmlucHV0W3R5cGU9InRleHQiXS5vdmVyc2l6ZSwgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS5vdmVyc2l6ZSwgaW5wdXRbdHlwZT0iZGF0ZSJdLm92ZXJzaXplLCBpbnB1dFt0eXBlPSJkYXRldGltZSJdLm92ZXJzaXplLCBpbnB1dFt0eXBlPSJlbWFpbCJdLm92ZXJzaXplLCBpbnB1dFt0eXBlPSJudW1iZXIiXS5vdmVyc2l6ZSwgaW5wdXRbdHlwZT0ic2VhcmNoIl0ub3ZlcnNpemUsIGlucHV0W3R5cGU9InRlbCJdLm92ZXJzaXplLCBpbnB1dFt0eXBlPSJ0aW1lIl0ub3ZlcnNpemUsIGlucHV0W3R5cGU9InVybCJdLm92ZXJzaXplLCB0ZXh0YXJlYS5vdmVyc2l6ZSB7IGZvbnQtc2l6ZTogMTdweDsgcGFkZGluZzogNHB4IDZweDsgfQppbnB1dFt0eXBlPSJ0ZXh0Il06Zm9jdXMsIGlucHV0W3R5cGU9InBhc3N3b3JkIl06Zm9jdXMsIGlucHV0W3R5cGU9ImRhdGUiXTpmb2N1cywgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXTpmb2N1cywgaW5wdXRbdHlwZT0iZW1haWwiXTpmb2N1cywgaW5wdXRbdHlwZT0ibnVtYmVyIl06Zm9jdXMsIGlucHV0W3R5cGU9InNlYXJjaCJdOmZvY3VzLCBpbnB1dFt0eXBlPSJ0ZWwiXTpmb2N1cywgaW5wdXRbdHlwZT0idGltZSJdOmZvY3VzLCBpbnB1dFt0eXBlPSJ1cmwiXTpmb2N1cywgdGV4dGFyZWE6Zm9jdXMgeyBiYWNrZ3JvdW5kOiAjZmFmYWZhOyBib3JkZXItY29sb3I6ICNiM2IzYjM7IH0KaW5wdXRbdHlwZT0idGV4dCJdW2Rpc2FibGVkXSwgaW5wdXRbdHlwZT0icGFzc3dvcmQiXVtkaXNhYmxlZF0sIGlucHV0W3R5cGU9ImRhdGUiXVtkaXNhYmxlZF0sIGlucHV0W3R5cGU9ImRhdGV0aW1lIl1bZGlzYWJsZWRdLCBpbnB1dFt0eXBlPSJlbWFpbCJdW2Rpc2FibGVkXSwgaW5wdXRbdHlwZT0ibnVtYmVyIl1bZGlzYWJsZWRdLCBpbnB1dFt0eXBlPSJzZWFyY2giXVtkaXNhYmxlZF0sIGlucHV0W3R5cGU9InRlbCJdW2Rpc2FibGVkXSwgaW5wdXRbdHlwZT0idGltZSJdW2Rpc2FibGVkXSwgaW5wdXRbdHlwZT0idXJsIl1bZGlzYWJsZWRdLCB0ZXh0YXJlYVtkaXNhYmxlZF0geyBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkOyB9Cgp0ZXh0YXJlYSB7IGhlaWdodDogYXV0bzsgfQoKc2VsZWN0IHsgd2lkdGg6IDEwMCU7IH0KCi8qIEZpZWxkc2V0cyAqLwpmaWVsZHNldCB7IGJvcmRlcjogc29saWQgMXB4ICNkZGQ7IC13ZWJraXQtYm9yZGVyLXJhZGl1czogM3B4OyAtbW96LWJvcmRlci1yYWRpdXM6IDNweDsgLW1zLWJvcmRlci1yYWRpdXM6IDNweDsgLW8tYm9yZGVyLXJhZGl1czogM3B4OyBib3JkZXItcmFkaXVzOiAzcHg7IHBhZGRpbmc6IDEycHg7IG1hcmdpbjogMThweCAwOyB9CmZpZWxkc2V0IGxlZ2VuZCB7IGZvbnQtd2VpZ2h0OiBib2xkOyBiYWNrZ3JvdW5kOiB3aGl0ZTsgcGFkZGluZzogMCAzcHg7IG1hcmdpbjogMDsgbWFyZ2luLWxlZnQ6IC0zcHg7IH0KCi8qIEVycm9ycyAqLwouZXJyb3IgaW5wdXQsIGlucHV0LmVycm9yLCAuZXJyb3IgdGV4dGFyZWEsIHRleHRhcmVhLmVycm9yLCAuZXJyb3IgaW5wdXQ6Zm9jdXMsIGlucHV0LmVycm9yOmZvY3VzLCAuZXJyb3IgdGV4dGFyZWE6Zm9jdXMsIHRleHRhcmVhLmVycm9yOmZvY3VzIHsgYm9yZGVyLWNvbG9yOiAjYzYwZjEzOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDE5OCwgMTUsIDE5LCAwLjEpOyB9CgouZXJyb3IgaW5wdXQ6Zm9jdXMsIGlucHV0LmVycm9yOmZvY3VzLCAuZXJyb3IgdGV4dGFyZWE6Zm9jdXMsIHRleHRhcmVhLmVycm9yOmZvY3VzIHsgb3V0bGluZS1jb2xvcjogI2Y1Nzk3YzsgfQoKLmVycm9yIGxhYmVsLCBsYWJlbC5lcnJvciB7IGNvbG9yOiAjYzYwZjEzOyB9CgouZXJyb3Igc21hbGwsIHNtYWxsLmVycm9yIHsgZGlzcGxheTogYmxvY2s7IHBhZGRpbmc6IDZweCA0cHg7IG1hcmdpbi10b3A6IC0xM3B4OyBtYXJnaW4tYm90dG9tOiAxMnB4OyBiYWNrZ3JvdW5kOiAjYzYwZjEzOyBjb2xvcjogI2ZmZjsgZm9udC1zaXplOiAxMnB4OyBmb250LXdlaWdodDogYm9sZDsgLW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbWxlZnQ6IDJweDsgLXdlYmtpdC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAycHg7IGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDJweDsgLW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbXJpZ2h0OiAycHg7IC13ZWJraXQtYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDJweDsgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDJweDsgfQoKLyogQ3VzdG9tIEZvcm1zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZm9ybS5jdXN0b20geyAvKiBDdXN0b20gaW5wdXQsIGRpc2FibGVkICovIH0KZm9ybS5jdXN0b20gc3Bhbi5jdXN0b20geyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdpZHRoOiAxNnB4OyBoZWlnaHQ6IDE2cHg7IHBvc2l0aW9uOiByZWxhdGl2ZTsgdG9wOiAycHg7IGJvcmRlcjogc29saWQgMXB4ICNjY2NjY2M7IGJhY2tncm91bmQ6IHdoaXRlOyB9CmZvcm0uY3VzdG9tIHNwYW4uY3VzdG9tLnJhZGlvIHsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxMDBweDsgLW1vei1ib3JkZXItcmFkaXVzOiAxMDBweDsgLW1zLWJvcmRlci1yYWRpdXM6IDEwMHB4OyAtby1ib3JkZXItcmFkaXVzOiAxMDBweDsgYm9yZGVyLXJhZGl1czogMTAwcHg7IH0KZm9ybS5jdXN0b20gc3Bhbi5jdXN0b20uY2hlY2tib3g6YmVmb3JlIHsgY29udGVudDogIiI7IGRpc3BsYXk6IGJsb2NrOyBsaW5lLWhlaWdodDogMC44OyBoZWlnaHQ6IDE0cHg7IHdpZHRoOiAxNHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyBmb250LXNpemU6IDE0cHg7IGNvbG9yOiAjZmZmOyB9CmZvcm0uY3VzdG9tIHNwYW4uY3VzdG9tLnJhZGlvLmNoZWNrZWQ6YmVmb3JlIHsgY29udGVudDogIiI7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogOHB4OyBoZWlnaHQ6IDhweDsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxMDBweDsgLW1vei1ib3JkZXItcmFkaXVzOiAxMDBweDsgLW1zLWJvcmRlci1yYWRpdXM6IDEwMHB4OyAtby1ib3JkZXItcmFkaXVzOiAxMDBweDsgYm9yZGVyLXJhZGl1czogMTAwcHg7IGJhY2tncm91bmQ6ICMyMjIyMjI7IHBvc2l0aW9uOiByZWxhdGl2ZTsgdG9wOiAzcHg7IGxlZnQ6IDNweDsgfQpmb3JtLmN1c3RvbSBzcGFuLmN1c3RvbS5jaGVja2JveC5jaGVja2VkOmJlZm9yZSB7IGNvbnRlbnQ6ICJcMDBkNyI7IGNvbG9yOiAjMjIyMjIyOyB9CmZvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24geyBkaXNwbGF5OiBibG9jazsgcG9zaXRpb246IHJlbGF0aXZlOyB3aWR0aDogYXV0bzsgaGVpZ2h0OiAyOHB4OyBtYXJnaW4tYm90dG9tOiA5cHg7IG1hcmdpbi10b3A6IDJweDsgfQpmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duIHVsIHsgb3ZlcmZsb3cteTogYXV0bzsgbWF4LWhlaWdodDogMjAwcHg7IH0KZm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93biBhLmN1cnJlbnQgeyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IGF1dG87IGxpbmUtaGVpZ2h0OiAyNnB4OyBtaW4taGVpZ2h0OiAyOHB4OyBwYWRkaW5nOiAwOyBwYWRkaW5nLWxlZnQ6IDZweDsgcGFkZGluZy1yaWdodDogMzhweDsgYm9yZGVyOiBzb2xpZCAxcHggI2RkZGRkZDsgY29sb3I6ICMxNDE0MTQ7IGJhY2tncm91bmQtY29sb3I6IHdoaXRlOyB3aGl0ZS1zcGFjZTogbm93cmFwOyB9CmZvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24gYS5zZWxlY3RvciB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgd2lkdGg6IDI3cHg7IGhlaWdodDogMjhweDsgZGlzcGxheTogYmxvY2s7IHJpZ2h0OiAwOyB0b3A6IDA7IGJvcmRlcjogc29saWQgMXB4ICNkZGRkZGQ7IH0KZm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93biBhLnNlbGVjdG9yOmFmdGVyIHsgY29udGVudDogIiI7IGRpc3BsYXk6IGJsb2NrOyBjb250ZW50OiAiIjsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAwOyBoZWlnaHQ6IDA7IGJvcmRlcjogc29saWQgNXB4OyBib3JkZXItY29sb3I6ICNhYWFhYWEgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogNTAlOyB0b3A6IDUwJTsgbWFyZ2luLXRvcDogLTJweDsgbWFyZ2luLWxlZnQ6IC01cHg7IH0KZm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93bjpob3ZlciBhLnNlbGVjdG9yOmFmdGVyLCBmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duLm9wZW4gYS5zZWxlY3RvcjphZnRlciB7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDA7IGhlaWdodDogMDsgYm9yZGVyOiBzb2xpZCA1cHg7IGJvcmRlci1jb2xvcjogIzIyMjIyMiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDsgfQpmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duLm9wZW4gdWwgeyBkaXNwbGF5OiBibG9jazsgei1pbmRleDogMTA7IH0KZm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93bi5zbWFsbCB7IHdpZHRoOiAxMzRweCAhaW1wb3J0YW50OyB9CmZvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24ubWVkaXVtIHsgd2lkdGg6IDI1NHB4ICFpbXBvcnRhbnQ7IH0KZm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93bi5sYXJnZSB7IHdpZHRoOiA0MzRweCAhaW1wb3J0YW50OyB9CmZvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24uZXhwYW5kIHsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsgfQpmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duLm9wZW4uc21hbGwgdWwgeyB3aWR0aDogMTM0cHggIWltcG9ydGFudDsgfQpmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duLm9wZW4ubWVkaXVtIHVsIHsgd2lkdGg6IDI1NHB4ICFpbXBvcnRhbnQ7IH0KZm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93bi5vcGVuLmxhcmdlIHVsIHsgd2lkdGg6IDQzNHB4ICFpbXBvcnRhbnQ7IH0KZm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93bi5vcGVuLmV4cGFuZCB1bCB7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IH0KZm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93biB1bCB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgd2lkdGg6IGF1dG87IGRpc3BsYXk6IG5vbmU7IG1hcmdpbjogMDsgbGVmdDogMDsgdG9wOiAyN3B4OyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IGJhY2tncm91bmQ6IHdoaXRlOyBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpOyBib3JkZXI6IHNvbGlkIDFweCAjY2NjY2NjOyB9CmZvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24gdWwgbGkgeyBjb2xvcjogIzU1NTU1NTsgZm9udC1zaXplOiAxM3B4OyBjdXJzb3I6IHBvaW50ZXI7IHBhZGRpbmc6IDNweDsgcGFkZGluZy1sZWZ0OiA2cHg7IHBhZGRpbmctcmlnaHQ6IDM4cHg7IG1pbi1oZWlnaHQ6IDE4cHg7IGxpbmUtaGVpZ2h0OiAxOHB4OyBtYXJnaW46IDA7IHdoaXRlLXNwYWNlOiBub3dyYXA7IGxpc3Qtc3R5bGU6IG5vbmU7IH0KZm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93biB1bCBsaS5zZWxlY3RlZCB7IGJhY2tncm91bmQ6ICNjZGViZjU7IGNvbG9yOiBibGFjazsgfQpmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duIHVsIGxpLnNlbGVjdGVkOmFmdGVyIHsgY29udGVudDogIlwyMDEzIjsgcG9zaXRpb246IGFic29sdXRlOyByaWdodDogMTBweDsgfQpmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duIHVsIGxpOmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjogI2NkZWJmNTsgY29sb3I6IGJsYWNrOyB9CmZvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24gdWwgbGk6aG92ZXI6YWZ0ZXIgeyBjb250ZW50OiAiXDIwMTMiOyBwb3NpdGlvbjogYWJzb2x1dGU7IHJpZ2h0OiAxMHB4OyBjb2xvcjogI2EzZGJlYzsgfQpmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duIHVsIGxpLnNlbGVjdGVkOmhvdmVyIHsgYmFja2dyb3VuZDogI2NkZWJmNTsgY3Vyc29yOiBkZWZhdWx0OyBjb2xvcjogYmxhY2s7IH0KZm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93biB1bCBsaS5zZWxlY3RlZDpob3ZlcjphZnRlciB7IGNvbG9yOiBibGFjazsgfQpmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duIHVsLnNob3cgeyBkaXNwbGF5OiBibG9jazsgfQpmb3JtLmN1c3RvbSAuY3VzdG9tLmRpc2FibGVkIHsgYmFja2dyb3VuZC1jb2xvcjogI2RkZGRkZDsgfQoKLyogQ29ycmVjdCBGRiBjdXN0b20gZHJvcGRvd24gaGVpZ2h0ICovCkAtbW96LWRvY3VtZW50IHVybC1wcmVmaXgoKSB7IGZvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24gYS5zZWxlY3RvciB7IGhlaWdodDogMjhweDsgfSB9CgoubHQtaWU5IGZvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24gYS5zZWxlY3RvciB7IGhlaWdodDogMjhweDsgfQoKLyogVGhlIEdyaWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoucm93IHsgd2lkdGg6IDk0MHB4OyBtYXgtd2lkdGg6IDEwMCU7IG1pbi13aWR0aDogNzY4cHg7IG1hcmdpbjogMCBhdXRvOyB9Ci5yb3cgLnJvdyB7IHdpZHRoOiBhdXRvOyBtYXgtd2lkdGg6IG5vbmU7IG1pbi13aWR0aDogMDsgbWFyZ2luOiAwIC0xNXB4OyB9Ci5yb3cuY29sbGFwc2UgLmNvbHVtbiwgLnJvdy5jb2xsYXBzZSAuY29sdW1ucyB7IHBhZGRpbmc6IDA7IH0KLnJvdyAucm93IHsgd2lkdGg6IGF1dG87IG1heC13aWR0aDogbm9uZTsgbWluLXdpZHRoOiAwOyBtYXJnaW46IDAgLTE1cHg7IH0KLnJvdyAucm93LmNvbGxhcHNlIHsgbWFyZ2luOiAwOyB9CgouY29sdW1uLCAuY29sdW1ucyB7IGZsb2F0OiBsZWZ0OyBtaW4taGVpZ2h0OiAxcHg7IHBhZGRpbmc6IDAgMTVweDsgcG9zaXRpb246IHJlbGF0aXZlOyB9Ci5jb2x1bW4uY2VudGVyZWQsIC5jb2x1bW5zLmNlbnRlcmVkIHsgZmxvYXQ6IG5vbmU7IG1hcmdpbjogMCBhdXRvOyB9CgpbY2xhc3MqPSJjb2x1bW4iXSArIFtjbGFzcyo9ImNvbHVtbiJdOmxhc3QtY2hpbGQgeyBmbG9hdDogcmlnaHQ7IH0KCltjbGFzcyo9ImNvbHVtbiJdICsgW2NsYXNzKj0iY29sdW1uIl0uZW5kIHsgZmxvYXQ6IGxlZnQ7IH0KCi5vbmUsIC5yb3cgLm9uZSB7IHdpZHRoOiA4LjMzMzMzJTsgfQoKLnR3bywgLnJvdyAudHdvIHsgd2lkdGg6IDE2LjY2NjY3JTsgfQoKLnRocmVlLCAucm93IC50aHJlZSB7IHdpZHRoOiAyNSU7IH0KCi5mb3VyLCAucm93IC5mb3VyIHsgd2lkdGg6IDMzLjMzMzMzJTsgfQoKLmZpdmUsIC5yb3cgLmZpdmUgeyB3aWR0aDogNDEuNjY2NjclOyB9Cgouc2l4LCAucm93IC5zaXggeyB3aWR0aDogNTAlOyB9Cgouc2V2ZW4sIC5yb3cgLnNldmVuIHsgd2lkdGg6IDU4LjMzMzMzJTsgfQoKLmVpZ2h0LCAucm93IC5laWdodCB7IHdpZHRoOiA2Ni42NjY2NyU7IH0KCi5uaW5lLCAucm93IC5uaW5lIHsgd2lkdGg6IDc1JTsgfQoKLnRlbiwgLnJvdyAudGVuIHsgd2lkdGg6IDgzLjMzMzMzJTsgfQoKLmVsZXZlbiwgLnJvdyAuZWxldmVuIHsgd2lkdGg6IDkxLjY2NjY3JTsgfQoKLnR3ZWx2ZSwgLnJvdyAudHdlbHZlIHsgd2lkdGg6IDEwMCU7IH0KCi5yb3cgLm9mZnNldC1ieS1vbmUgeyBtYXJnaW4tbGVmdDogOC4zMzMzMyU7IH0KCi5yb3cgLm9mZnNldC1ieS10d28geyBtYXJnaW4tbGVmdDogMTYuNjY2NjclOyB9Cgoucm93IC5vZmZzZXQtYnktdGhyZWUgeyBtYXJnaW4tbGVmdDogMjUlOyB9Cgoucm93IC5vZmZzZXQtYnktZm91ciB7IG1hcmdpbi1sZWZ0OiAzMy4zMzMzMyU7IH0KCi5yb3cgLm9mZnNldC1ieS1maXZlIHsgbWFyZ2luLWxlZnQ6IDQxLjY2NjY3JTsgfQoKLnJvdyAub2Zmc2V0LWJ5LXNpeCB7IG1hcmdpbi1sZWZ0OiA1MCU7IH0KCi5yb3cgLm9mZnNldC1ieS1zZXZlbiB7IG1hcmdpbi1sZWZ0OiA1OC4zMzMzMyU7IH0KCi5yb3cgLm9mZnNldC1ieS1laWdodCB7IG1hcmdpbi1sZWZ0OiA2Ni42NjY2NyU7IH0KCi5yb3cgLm9mZnNldC1ieS1uaW5lIHsgbWFyZ2luLWxlZnQ6IDc1JTsgfQoKLnJvdyAub2Zmc2V0LWJ5LXRlbiB7IG1hcmdpbi1sZWZ0OiA4My4zMzMzMyU7IH0KCi5wdXNoLXR3byB7IGxlZnQ6IDE2LjY2NjY3JTsgfQoKLnB1bGwtdHdvIHsgcmlnaHQ6IDE2LjY2NjY3JTsgfQoKLnB1c2gtdGhyZWUgeyBsZWZ0OiAyNSU7IH0KCi5wdWxsLXRocmVlIHsgcmlnaHQ6IDI1JTsgfQoKLnB1c2gtZm91ciB7IGxlZnQ6IDMzLjMzMzMzJTsgfQoKLnB1bGwtZm91ciB7IHJpZ2h0OiAzMy4zMzMzMyU7IH0KCi5wdXNoLWZpdmUgeyBsZWZ0OiA0MS42NjY2NyU7IH0KCi5wdWxsLWZpdmUgeyByaWdodDogNDEuNjY2NjclOyB9CgoucHVzaC1zaXggeyBsZWZ0OiA1MCU7IH0KCi5wdWxsLXNpeCB7IHJpZ2h0OiA1MCU7IH0KCi5wdXNoLXNldmVuIHsgbGVmdDogNTguMzMzMzMlOyB9CgoucHVsbC1zZXZlbiB7IHJpZ2h0OiA1OC4zMzMzMyU7IH0KCi5wdXNoLWVpZ2h0IHsgbGVmdDogNjYuNjY2NjclOyB9CgoucHVsbC1laWdodCB7IHJpZ2h0OiA2Ni42NjY2NyU7IH0KCi5wdXNoLW5pbmUgeyBsZWZ0OiA3NSU7IH0KCi5wdWxsLW5pbmUgeyByaWdodDogNzUlOyB9CgoucHVzaC10ZW4geyBsZWZ0OiA4My4zMzMzMyU7IH0KCi5wdWxsLXRlbiB7IHJpZ2h0OiA4My4zMzMzMyU7IH0KCmltZyB7IGhlaWdodDogYXV0bzsgfQoKaW1nLCBvYmplY3QsIGVtYmVkIHsgbWF4LXdpZHRoOiAxMDAlOyB9CgppbWcgeyAtbXMtaW50ZXJwb2xhdGlvbi1tb2RlOiBiaWN1YmljOyB9CgojbWFwX2NhbnZhcyBpbWcsIC5tYXBfY2FudmFzIGltZyB7IG1heC13aWR0aDogbm9uZSFpbXBvcnRhbnQ7IH0KCi8qIE5pY29sYXMgR2FsbGFnaGVyJ3MgbWljcm8gY2xlYXJmaXggKi8KLnJvdyB7ICp6b29tOiAxOyB9Ci5yb3c6YmVmb3JlLCAucm93OmFmdGVyIHsgY29udGVudDogIiAiOyBkaXNwbGF5OiB0YWJsZTsgfQoucm93OmFmdGVyIHsgY2xlYXI6IGJvdGg7IH0KCi8qIEJsb2NrIEdyaWRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogVGhlc2UgYXJlIDItdXAsIDMtdXAsIDQtdXAgYW5kIDUtdXAgVUxzLCBzdWl0ZWQKZm9yIHJlcGVhdGluZyBibG9ja3Mgb2YgY29udGVudC4gQWRkICdtb2JpbGUnIHRvCnRoZW0gdG8gc3dpdGNoIHRoZW0ganVzdCBsaWtlIHRoZSBsYXlvdXQgZ3JpZAoob25lIGl0ZW0gcGVyIGxpbmUpIG9uIHBob25lcwoKRm9yIElFNy84IGNvbXBhdGliaWxpdHkgYmxvY2stZ3JpZCBpdGVtcyBuZWVkIHRvIGJlCnRoZSBzYW1lIGhlaWdodC4gWW91IGNhbiBvcHRpb25hbGx5IHVuY29tbWVudCB0aGUKbGluZXMgYmVsb3cgdG8gc3VwcG9ydCBhcmJpdHJhcnkgaGVpZ2h0LCBidXQga25vdwp0aGF0IElFNy84IGRvIG5vdCBzdXBwb3J0IDpudGgtY2hpbGQuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5ibG9jay1ncmlkIHsgZGlzcGxheTogYmxvY2s7IG92ZXJmbG93OiBoaWRkZW47IHBhZGRpbmc6IDA7IH0KLmJsb2NrLWdyaWQgPiBsaSB7IGRpc3BsYXk6IGJsb2NrOyBoZWlnaHQ6IGF1dG87IGZsb2F0OiBsZWZ0OyB9Ci5ibG9jay1ncmlkLm9uZS11cCB7IG1hcmdpbjogMDsgfQouYmxvY2stZ3JpZC5vbmUtdXAgPiBsaSB7IHdpZHRoOiAxMDAlOyBwYWRkaW5nOiAwIDAgMTVweDsgfQouYmxvY2stZ3JpZC50d28tdXAgeyBtYXJnaW46IDAgLTE1cHg7IH0KLmJsb2NrLWdyaWQudHdvLXVwID4gbGkgeyB3aWR0aDogNTAlOyBwYWRkaW5nOiAwIDE1cHggMTVweDsgfQouYmxvY2stZ3JpZC50d28tdXAgPiBsaTpudGgtY2hpbGQoMm4rMSkgeyBjbGVhcjogYm90aDsgfQouYmxvY2stZ3JpZC50aHJlZS11cCB7IG1hcmdpbjogMCAtMTJweDsgfQouYmxvY2stZ3JpZC50aHJlZS11cCA+IGxpIHsgd2lkdGg6IDMzLjMzMzMzJTsgcGFkZGluZzogMCAxMnB4IDEycHg7IH0KLmJsb2NrLWdyaWQudGhyZWUtdXAgPiBsaTpudGgtY2hpbGQoM24rMSkgeyBjbGVhcjogYm90aDsgfQouYmxvY2stZ3JpZC5mb3VyLXVwIHsgbWFyZ2luOiAwIC0xMHB4OyB9Ci5ibG9jay1ncmlkLmZvdXItdXAgPiBsaSB7IHdpZHRoOiAyNSU7IHBhZGRpbmc6IDAgMTBweCAxMHB4OyB9Ci5ibG9jay1ncmlkLmZvdXItdXAgPiBsaTpudGgtY2hpbGQoNG4rMSkgeyBjbGVhcjogYm90aDsgfQouYmxvY2stZ3JpZC5maXZlLXVwIHsgbWFyZ2luOiAwIC04cHg7IH0KLmJsb2NrLWdyaWQuZml2ZS11cCA+IGxpIHsgd2lkdGg6IDIwJTsgcGFkZGluZzogMCA4cHggOHB4OyB9Ci5ibG9jay1ncmlkLmZpdmUtdXAgPiBsaTpudGgtY2hpbGQoNW4rMSkgeyBjbGVhcjogYm90aDsgfQouYmxvY2stZ3JpZC5zaXgtdXAgeyBtYXJnaW46IDAgLThweDsgfQouYmxvY2stZ3JpZC5zaXgtdXAgPiBsaSB7IHdpZHRoOiAxNi42NjY2NyU7IHBhZGRpbmc6IDAgOHB4IDhweDsgfQouYmxvY2stZ3JpZC5zaXgtdXAgPiBsaTpudGgtY2hpbGQoNm4rMSkgeyBjbGVhcjogYm90aDsgfQouYmxvY2stZ3JpZC5zZXZlbi11cCB7IG1hcmdpbjogMCAtOHB4OyB9Ci5ibG9jay1ncmlkLnNldmVuLXVwID4gbGkgeyB3aWR0aDogMTQuMjg1NzElOyBwYWRkaW5nOiAwIDhweCA4cHg7IH0KLmJsb2NrLWdyaWQuc2V2ZW4tdXAgPiBsaTpudGgtY2hpbGQoN24rMSkgeyBjbGVhcjogYm90aDsgfQouYmxvY2stZ3JpZC5laWdodC11cCB7IG1hcmdpbjogMCAtOHB4OyB9Ci5ibG9jay1ncmlkLmVpZ2h0LXVwID4gbGkgeyB3aWR0aDogMTIuNSU7IHBhZGRpbmc6IDAgOHB4IDhweDsgfQouYmxvY2stZ3JpZC5laWdodC11cCA+IGxpOm50aC1jaGlsZCg4bisxKSB7IGNsZWFyOiBib3RoOyB9Ci5ibG9jay1ncmlkLm5pbmUtdXAgeyBtYXJnaW46IDAgLThweDsgfQouYmxvY2stZ3JpZC5uaW5lLXVwID4gbGkgeyB3aWR0aDogMTEuMTExMTElOyBwYWRkaW5nOiAwIDhweCA4cHg7IH0KLmJsb2NrLWdyaWQubmluZS11cCA+IGxpOm50aC1jaGlsZCg5bisxKSB7IGNsZWFyOiBib3RoOyB9Ci5ibG9jay1ncmlkLnRlbi11cCB7IG1hcmdpbjogMCAtOHB4OyB9Ci5ibG9jay1ncmlkLnRlbi11cCA+IGxpIHsgd2lkdGg6IDEwJTsgcGFkZGluZzogMCA4cHggOHB4OyB9Ci5ibG9jay1ncmlkLnRlbi11cCA+IGxpOm50aC1jaGlsZCgxMG4rMSkgeyBjbGVhcjogYm90aDsgfQouYmxvY2stZ3JpZC5lbGV2ZW4tdXAgeyBtYXJnaW46IDAgLThweDsgfQouYmxvY2stZ3JpZC5lbGV2ZW4tdXAgPiBsaSB7IHdpZHRoOiA5LjA5MDkxJTsgcGFkZGluZzogMCA4cHggOHB4OyB9Ci5ibG9jay1ncmlkLmVsZXZlbi11cCA+IGxpOm50aC1jaGlsZCgxMW4rMSkgeyBjbGVhcjogYm90aDsgfQouYmxvY2stZ3JpZC50d2VsdmUtdXAgeyBtYXJnaW46IDAgLThweDsgfQouYmxvY2stZ3JpZC50d2VsdmUtdXAgPiBsaSB7IHdpZHRoOiA4LjMzMzMzJTsgcGFkZGluZzogMCA4cHggOHB4OyB9Ci5ibG9jay1ncmlkLnR3ZWx2ZS11cCA+IGxpOm50aC1jaGlsZCgxMm4rMSkgeyBjbGVhcjogYm90aDsgfQoKLyogTm9ybWFsIEJ1dHRvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwouYnV0dG9uIHsgd2lkdGg6IGF1dG87IGJhY2tncm91bmQ6ICMyYmE2Y2I7IGJvcmRlcjogMXB4IHNvbGlkICMxZTcyOGM7IC13ZWJraXQtYm94LXNoYWRvdzogMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSkgaW5zZXQ7IC1tb3otYm94LXNoYWRvdzogMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSkgaW5zZXQ7IGJveC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpIGluc2V0OyBjb2xvcjogd2hpdGU7IGN1cnNvcjogcG9pbnRlcjsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBmb250LWZhbWlseTogaW5oZXJpdDsgZm9udC1zaXplOiAxNHB4OyBmb250LXdlaWdodDogYm9sZDsgbGluZS1oZWlnaHQ6IDE7IG1hcmdpbjogMDsgcGFkZGluZzogMTBweCAyMHB4IDExcHg7IHBvc2l0aW9uOiByZWxhdGl2ZTsgdGV4dC1hbGlnbjogY2VudGVyOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IC13ZWJraXQtdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjE1cyBlYXNlLWluLW91dDsgLW1vei10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0OyAtby10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0OyB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0OyAvKiBIb3ZlcnMgKi8gLyogU2l6ZXMgKi8gLyogQ29sb3JzICovIC8qIFJhZGlpICovIC8qIExheW91dCAqLyAvKiBEaXNhYmxlZCAtLS0tLS0tLS0tICovIH0KLmJ1dHRvbjpob3ZlciwgLmJ1dHRvbjpmb2N1cyB7IGNvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogIzIyODRhMTsgfQouYnV0dG9uOmFjdGl2ZSB7IC13ZWJraXQtYm94LXNoYWRvdzogMCAxcHggMCByZ2JhKDAsIDAsIDAsIDAuMikgaW5zZXQ7IC1tb3otYm94LXNoYWRvdzogMCAxcHggMCByZ2JhKDAsIDAsIDAsIDAuMikgaW5zZXQ7IGJveC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgwLCAwLCAwLCAwLjIpIGluc2V0OyB9Ci5idXR0b24ubGFyZ2UgeyBmb250LXNpemU6IDE3cHg7IHBhZGRpbmc6IDE1cHggMzBweCAxNnB4OyB9Ci5idXR0b24ubWVkaXVtIHsgZm9udC1zaXplOiAxNHB4OyB9Ci5idXR0b24uc21hbGwgeyBmb250LXNpemU6IDExcHg7IHBhZGRpbmc6IDdweCAxNHB4IDhweDsgfQouYnV0dG9uLnRpbnkgeyBmb250LXNpemU6IDEwcHg7IHBhZGRpbmc6IDVweCAxMHB4IDZweDsgfQouYnV0dG9uLmV4cGFuZCB7IHdpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBjZW50ZXI7IH0KLmJ1dHRvbi5wcmltYXJ5IHsgYmFja2dyb3VuZC1jb2xvcjogIzJiYTZjYjsgYm9yZGVyOiAxcHggc29saWQgIzFlNzI4YzsgfQouYnV0dG9uLnByaW1hcnk6aG92ZXIsIC5idXR0b24ucHJpbWFyeTpmb2N1cyB7IGJhY2tncm91bmQtY29sb3I6ICMyMjg0YTE7IH0KLmJ1dHRvbi5zdWNjZXNzIHsgYmFja2dyb3VuZC1jb2xvcjogIzVkYTQyMzsgYm9yZGVyOiAxcHggc29saWQgIzM5NjUxNjsgfQouYnV0dG9uLnN1Y2Nlc3M6aG92ZXIsIC5idXR0b24uc3VjY2Vzczpmb2N1cyB7IGJhY2tncm91bmQtY29sb3I6ICM0NTdhMWE7IH0KLmJ1dHRvbi5hbGVydCB7IGJhY2tncm91bmQtY29sb3I6ICNjNjBmMTM7IGJvcmRlcjogMXB4IHNvbGlkICM3ZjBhMGM7IH0KLmJ1dHRvbi5hbGVydDpob3ZlciwgLmJ1dHRvbi5hbGVydDpmb2N1cyB7IGJhY2tncm91bmQtY29sb3I6ICM5NzBiMGU7IH0KLmJ1dHRvbi5zZWNvbmRhcnkgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5OyBjb2xvcjogIzFkMWQxZDsgYm9yZGVyOiAxcHggc29saWQgI2MzYzNjMzsgfQouYnV0dG9uLnNlY29uZGFyeTpob3ZlciwgLmJ1dHRvbi5zZWNvbmRhcnk6Zm9jdXMgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZDBkMGQwOyB9Ci5idXR0b24ucmFkaXVzIHsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAzcHg7IC1tb3otYm9yZGVyLXJhZGl1czogM3B4OyAtbXMtYm9yZGVyLXJhZGl1czogM3B4OyAtby1ib3JkZXItcmFkaXVzOiAzcHg7IGJvcmRlci1yYWRpdXM6IDNweDsgfQouYnV0dG9uLnJvdW5kIHsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxMDAwcHg7IC1tb3otYm9yZGVyLXJhZGl1czogMTAwMHB4OyAtbXMtYm9yZGVyLXJhZGl1czogMTAwMHB4OyAtby1ib3JkZXItcmFkaXVzOiAxMDAwcHg7IGJvcmRlci1yYWRpdXM6IDEwMDBweDsgfQouYnV0dG9uLmZ1bGwtd2lkdGggeyB3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nLWxlZnQ6IDBweCAhaW1wb3J0YW50OyBwYWRkaW5nLXJpZ2h0OiAwcHggIWltcG9ydGFudDsgfQouYnV0dG9uLmxlZnQtYWxpZ24geyB0ZXh0LWFsaWduOiBsZWZ0OyB0ZXh0LWluZGVudDogMTJweDsgfQouYnV0dG9uLmRpc2FibGVkLCAuYnV0dG9uW2Rpc2FibGVkXSB7IG9wYWNpdHk6IDAuNjsgY3Vyc29yOiBkZWZhdWx0OyBiYWNrZ3JvdW5kOiAjMmJhNmNiOyAtd2Via2l0LWJveC1zaGFkb3c6IG5vbmU7IC1tb3otYm94LXNoYWRvdzogbm9uZTsgYm94LXNoYWRvdzogbm9uZTsgfQouYnV0dG9uLmRpc2FibGVkOmhvdmVyLCAuYnV0dG9uW2Rpc2FibGVkXTpob3ZlciB7IGJhY2tncm91bmQ6ICMyYmE2Y2I7IH0KLmJ1dHRvbi5kaXNhYmxlZC5zdWNjZXNzLCAuYnV0dG9uW2Rpc2FibGVkXS5zdWNjZXNzIHsgYmFja2dyb3VuZC1jb2xvcjogIzVkYTQyMzsgfQouYnV0dG9uLmRpc2FibGVkLnN1Y2Nlc3M6aG92ZXIsIC5idXR0b24uZGlzYWJsZWQuc3VjY2Vzczpmb2N1cywgLmJ1dHRvbltkaXNhYmxlZF0uc3VjY2Vzczpob3ZlciwgLmJ1dHRvbltkaXNhYmxlZF0uc3VjY2Vzczpmb2N1cyB7IGJhY2tncm91bmQtY29sb3I6ICM1ZGE0MjM7IG91dGxpbmU6IG5vbmU7IH0KLmJ1dHRvbi5kaXNhYmxlZC5hbGVydCwgLmJ1dHRvbltkaXNhYmxlZF0uYWxlcnQgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjYzYwZjEzOyB9Ci5idXR0b24uZGlzYWJsZWQuYWxlcnQ6aG92ZXIsIC5idXR0b24uZGlzYWJsZWQuYWxlcnQ6Zm9jdXMsIC5idXR0b25bZGlzYWJsZWRdLmFsZXJ0OmhvdmVyLCAuYnV0dG9uW2Rpc2FibGVkXS5hbGVydDpmb2N1cyB7IGJhY2tncm91bmQtY29sb3I6ICNjNjBmMTM7IG91dGxpbmU6IG5vbmU7IH0KLmJ1dHRvbi5kaXNhYmxlZC5zZWNvbmRhcnksIC5idXR0b25bZGlzYWJsZWRdLnNlY29uZGFyeSB7IGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7IH0KLmJ1dHRvbi5kaXNhYmxlZC5zZWNvbmRhcnk6aG92ZXIsIC5idXR0b24uZGlzYWJsZWQuc2Vjb25kYXJ5OmZvY3VzLCAuYnV0dG9uW2Rpc2FibGVkXS5zZWNvbmRhcnk6aG92ZXIsIC5idXR0b25bZGlzYWJsZWRdLnNlY29uZGFyeTpmb2N1cyB7IGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7IG91dGxpbmU6IG5vbmU7IH0KCi8qIERvbid0IHVzZSBuYXRpdmUgYnV0dG9ucyBvbiBpT1MgKi8KaW5wdXRbdHlwZT1zdWJtaXRdLmJ1dHRvbiwgYnV0dG9uLmJ1dHRvbiB7IC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsgfQoKLyogQ29ycmVjdCBGRiBidXR0b24gcGFkZGluZyAqLwpALW1vei1kb2N1bWVudCB1cmwtcHJlZml4KCkgeyBidXR0b246Oi1tb3otZm9jdXMtaW5uZXIsIGlucHV0W3R5cGU9InJlc2V0Il06Oi1tb3otZm9jdXMtaW5uZXIsIGlucHV0W3R5cGU9ImJ1dHRvbiJdOjotbW96LWZvY3VzLWlubmVyLCBpbnB1dFt0eXBlPSJzdWJtaXQiXTo6LW1vei1mb2N1cy1pbm5lciwgaW5wdXRbdHlwZT0iZmlsZSJdID4gaW5wdXRbdHlwZT0iYnV0dG9uIl06Oi1tb3otZm9jdXMtaW5uZXIgeyBib3JkZXI6IG5vbmU7IHBhZGRpbmc6IDA7IH0KICBpbnB1dFt0eXBlPSJzdWJtaXQiXS50aW55LmJ1dHRvbiB7IHBhZGRpbmc6IDNweCAxMHB4IDRweDsgfQogIGlucHV0W3R5cGU9InN1Ym1pdCJdLnNtYWxsLmJ1dHRvbiB7IHBhZGRpbmc6IDVweCAxNHB4IDZweDsgfQogIGlucHV0W3R5cGU9InN1Ym1pdCJdLmJ1dHRvbiwgaW5wdXRbdHlwZT1zdWJtaXRdLm1lZGl1bS5idXR0b24geyBwYWRkaW5nOiA4cHggMjBweCA5cHg7IH0KICBpbnB1dFt0eXBlPSJzdWJtaXQiXS5sYXJnZS5idXR0b24geyBwYWRkaW5nOiAxM3B4IDMwcHggMTRweDsgfSB9CgovKiBCdXR0b25zIHdpdGggRHJvcGRvd25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLmJ1dHRvbi5kcm9wZG93biB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgcGFkZGluZy1yaWdodDogNDRweDsgLyogU2l6ZXMgKi8gLyogVHJpYW5nbGVzICovIC8qIEZseW91dCBMaXN0ICovIC8qIFNwbGl0IERyb3Bkb3duIEJ1dHRvbnMgKi8gfQouYnV0dG9uLmRyb3Bkb3duLmxhcmdlIHsgcGFkZGluZy1yaWdodDogNjBweDsgfQouYnV0dG9uLmRyb3Bkb3duLnNtYWxsIHsgcGFkZGluZy1yaWdodDogMjhweDsgfQouYnV0dG9uLmRyb3Bkb3duLnRpbnkgeyBwYWRkaW5nLXJpZ2h0OiAyMHB4OyB9Ci5idXR0b24uZHJvcGRvd246YWZ0ZXIgeyBjb250ZW50OiAiIjsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAwOyBoZWlnaHQ6IDA7IGJvcmRlcjogc29saWQgNnB4OyBib3JkZXItY29sb3I6IHdoaXRlIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50OyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogNTAlOyByaWdodDogMjBweDsgbWFyZ2luLXRvcDogLTJweDsgfQouYnV0dG9uLmRyb3Bkb3duLmxhcmdlOmFmdGVyIHsgY29udGVudDogIiI7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMDsgaGVpZ2h0OiAwOyBib3JkZXI6IHNvbGlkIDdweDsgYm9yZGVyLWNvbG9yOiB3aGl0ZSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDsgbWFyZ2luLXRvcDogLTNweDsgcmlnaHQ6IDMwcHg7IH0KLmJ1dHRvbi5kcm9wZG93bi5zbWFsbDphZnRlciB7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDA7IGhlaWdodDogMDsgYm9yZGVyOiBzb2xpZCA1cHg7IGJvcmRlci1jb2xvcjogd2hpdGUgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7IG1hcmdpbi10b3A6IC0ycHg7IHJpZ2h0OiAxNHB4OyB9Ci5idXR0b24uZHJvcGRvd24udGlueTphZnRlciB7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDA7IGhlaWdodDogMDsgYm9yZGVyOiBzb2xpZCA0cHg7IGJvcmRlci1jb2xvcjogd2hpdGUgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7IG1hcmdpbi10b3A6IC0xcHg7IHJpZ2h0OiAxMHB4OyB9Ci5idXR0b24uZHJvcGRvd24gPiB1bCB7IC13ZWJraXQtYm94LXNpemluZzogY29udGVudC1ib3g7IC1tb3otYm94LXNpemluZzogY29udGVudC1ib3g7IGJveC1zaXppbmc6IGNvbnRlbnQtYm94OyBkaXNwbGF5OiBub25lOyBwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IC0xcHg7IGJhY2tncm91bmQ6ICNmZmY7IGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSk7IGxpc3Qtc3R5bGU6IG5vbmU7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgYm9yZGVyOiAxcHggc29saWQgI2NjY2NjYzsgYm9yZGVyLXRvcDogbm9uZTsgbWluLXdpZHRoOiAxMDAlOyB6LWluZGV4OiA0MDsgfQouYnV0dG9uLmRyb3Bkb3duID4gdWwgbGkgeyB3aWR0aDogMTAwJTsgY3Vyc29yOiBwb2ludGVyOyBwYWRkaW5nOiAwOyBtaW4taGVpZ2h0OiAxOHB4OyBsaW5lLWhlaWdodDogMThweDsgbWFyZ2luOiAwOyB3aGl0ZS1zcGFjZTogbm93cmFwOyBsaXN0LXN0eWxlOiBub25lOyB9Ci5idXR0b24uZHJvcGRvd24gPiB1bCBsaSBhLCAuYnV0dG9uLmRyb3Bkb3duID4gdWwgbGkgYnV0dG9uIHsgZGlzcGxheTogYmxvY2s7IGNvbG9yOiAjNTU1OyBmb250LXNpemU6IDEzcHg7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IHBhZGRpbmc6IDZweCAxNHB4OyB0ZXh0LWFsaWduOiBsZWZ0OyB9Ci5idXR0b24uZHJvcGRvd24gPiB1bCBsaSBidXR0b24geyB3aWR0aDogMTAwJTsgYm9yZGVyOiBpbmhlcml0OyBiYWNrZ3JvdW5kOiBpbmhlcml0OyBmb250LWZhbWlseTogaW5oZXJpdDsgbWFyZ2luOiBpbmhlcml0OyAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsgfQouYnV0dG9uLmRyb3Bkb3duID4gdWwgbGk6aG92ZXIsIC5idXR0b24uZHJvcGRvd24gPiB1bCBsaTpmb2N1cyB7IGJhY2tncm91bmQtY29sb3I6ICNlM2Y0Zjk7IGNvbG9yOiAjMjIyOyB9Ci5idXR0b24uZHJvcGRvd24gPiB1bCBsaS5kaXZpZGVyIHsgbWluLWhlaWdodDogMDsgcGFkZGluZzogMDsgaGVpZ2h0OiAxcHg7IG1hcmdpbjogNHB4IDA7IGJhY2tncm91bmQ6ICNlZGVkZWQ7IH0KLmJ1dHRvbi5kcm9wZG93bi51cCA+IHVsIHsgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNjY2NjY2M7IGJvcmRlci1ib3R0b206IG5vbmU7IH0KLmJ1dHRvbi5kcm9wZG93biB1bC5uby1ob3Zlci5zaG93LWRyb3Bkb3duIHsgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsgfQouYnV0dG9uLmRyb3Bkb3duOmhvdmVyID4gdWwubm8taG92ZXIgeyBkaXNwbGF5OiBub25lOyB9Ci5idXR0b24uZHJvcGRvd24uc3BsaXQgeyBwYWRkaW5nOiAwOyBwb3NpdGlvbjogcmVsYXRpdmU7IC8qIFNpemVzICovIC8qIFRyaWFuZ2xlIFNwYW5zICovIC8qIENvbG9ycyAqLyB9Ci5idXR0b24uZHJvcGRvd24uc3BsaXQ6YWZ0ZXIgeyBkaXNwbGF5OiBub25lOyB9Ci5idXR0b24uZHJvcGRvd24uc3BsaXQ6aG92ZXIsIC5idXR0b24uZHJvcGRvd24uc3BsaXQ6Zm9jdXMgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjMmJhNmNiOyB9Ci5idXR0b24uZHJvcGRvd24uc3BsaXQuYWxlcnQ6aG92ZXIsIC5idXR0b24uZHJvcGRvd24uc3BsaXQuYWxlcnQ6Zm9jdXMgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjYzYwZjEzOyB9Ci5idXR0b24uZHJvcGRvd24uc3BsaXQuc3VjY2Vzczpob3ZlciwgLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5zdWNjZXNzOmZvY3VzIHsgYmFja2dyb3VuZC1jb2xvcjogIzVkYTQyMzsgfQouYnV0dG9uLmRyb3Bkb3duLnNwbGl0LnNlY29uZGFyeTpob3ZlciwgLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5zZWNvbmRhcnk6Zm9jdXMgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5OyB9Ci5idXR0b24uZHJvcGRvd24uc3BsaXQgPiBhIHsgY29sb3I6IHdoaXRlOyBkaXNwbGF5OiBibG9jazsgcGFkZGluZzogMTBweCA1MHB4IDExcHggMjBweDsgcGFkZGluZy1sZWZ0OiAyMHB4OyBwYWRkaW5nLXJpZ2h0OiA1MHB4OyAtd2Via2l0LXRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4xNXMgZWFzZS1pbi1vdXQ7IC1tb3otdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjE1cyBlYXNlLWluLW91dDsgLW8tdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjE1cyBlYXNlLWluLW91dDsgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjE1cyBlYXNlLWluLW91dDsgfQouYnV0dG9uLmRyb3Bkb3duLnNwbGl0ID4gYTpob3ZlciwgLmJ1dHRvbi5kcm9wZG93bi5zcGxpdCA+IGE6Zm9jdXMgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjMjI4NGExOyAtd2Via2l0LWJveC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpIGluc2V0OyAtbW96LWJveC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpIGluc2V0OyBib3gtc2hhZG93OiAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSBpbnNldDsgfQouYnV0dG9uLmRyb3Bkb3duLnNwbGl0LmxhcmdlID4gYSB7IHBhZGRpbmc6IDE1cHggNzVweCAxNnB4IDMwcHg7IHBhZGRpbmctbGVmdDogMzBweDsgcGFkZGluZy1yaWdodDogNzVweDsgfQouYnV0dG9uLmRyb3Bkb3duLnNwbGl0LnNtYWxsID4gYSB7IHBhZGRpbmc6IDdweCAzNXB4IDhweCAxNHB4OyBwYWRkaW5nLWxlZnQ6IDE0cHg7IHBhZGRpbmctcmlnaHQ6IDM1cHg7IH0KLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC50aW55ID4gYSB7IHBhZGRpbmc6IDVweCAyNXB4IDZweCAxMHB4OyBwYWRkaW5nLWxlZnQ6IDEwcHg7IHBhZGRpbmctcmlnaHQ6IDI1cHg7IH0KLmJ1dHRvbi5kcm9wZG93bi5zcGxpdCA+IHNwYW4geyBiYWNrZ3JvdW5kLWNvbG9yOiAjMmJhNmNiOyBwb3NpdGlvbjogYWJzb2x1dGU7IHJpZ2h0OiAwOyB0b3A6IDA7IGhlaWdodDogMTAwJTsgd2lkdGg6IDMwcHg7IGJvcmRlci1sZWZ0OiAxcHggc29saWQgIzFlNzI4YzsgLXdlYmtpdC1ib3gtc2hhZG93OiAxcHggMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpIGluc2V0OyAtbW96LWJveC1zaGFkb3c6IDFweCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSkgaW5zZXQ7IGJveC1zaGFkb3c6IDFweCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSkgaW5zZXQ7IC13ZWJraXQtdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjE1cyBlYXNlLWluLW91dDsgLW1vei10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0OyAtby10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0OyB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0OyB9Ci5idXR0b24uZHJvcGRvd24uc3BsaXQgPiBzcGFuOmhvdmVyLCAuYnV0dG9uLmRyb3Bkb3duLnNwbGl0ID4gc3Bhbjpmb2N1cyB7IGJhY2tncm91bmQtY29sb3I6ICMyMjg0YTE7IH0KLmJ1dHRvbi5kcm9wZG93bi5zcGxpdCA+IHNwYW46YWZ0ZXIgeyBjb250ZW50OiAiIjsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAwOyBoZWlnaHQ6IDA7IGJvcmRlcjogc29saWQgNnB4OyBib3JkZXItY29sb3I6IHdoaXRlIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50OyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogNTAlOyBsZWZ0OiA1MCU7IG1hcmdpbi1sZWZ0OiAtNnB4OyBtYXJnaW4tdG9wOiAtMnB4OyB9Ci5idXR0b24uZHJvcGRvd24uc3BsaXQuc2Vjb25kYXJ5ID4gc3BhbjphZnRlciB7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDA7IGhlaWdodDogMDsgYm9yZGVyOiBzb2xpZCA2cHg7IGJvcmRlci1jb2xvcjogIzFkMWQxZCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDsgfQouYnV0dG9uLmRyb3Bkb3duLnNwbGl0LmxhcmdlIHNwYW4geyB3aWR0aDogNDVweDsgfQouYnV0dG9uLmRyb3Bkb3duLnNwbGl0LnNtYWxsIHNwYW4geyB3aWR0aDogMjFweDsgfQouYnV0dG9uLmRyb3Bkb3duLnNwbGl0LnRpbnkgc3BhbiB7IHdpZHRoOiAxNXB4OyB9Ci5idXR0b24uZHJvcGRvd24uc3BsaXQubGFyZ2Ugc3BhbjphZnRlciB7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDA7IGhlaWdodDogMDsgYm9yZGVyOiBzb2xpZCA3cHg7IGJvcmRlci1jb2xvcjogd2hpdGUgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7IG1hcmdpbi10b3A6IC0zcHg7IG1hcmdpbi1sZWZ0OiAtN3B4OyB9Ci5idXR0b24uZHJvcGRvd24uc3BsaXQuc21hbGwgc3BhbjphZnRlciB7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDA7IGhlaWdodDogMDsgYm9yZGVyOiBzb2xpZCA0cHg7IGJvcmRlci1jb2xvcjogd2hpdGUgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7IG1hcmdpbi10b3A6IC0xcHg7IG1hcmdpbi1sZWZ0OiAtNHB4OyB9Ci5idXR0b24uZHJvcGRvd24uc3BsaXQudGlueSBzcGFuOmFmdGVyIHsgY29udGVudDogIiI7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMDsgaGVpZ2h0OiAwOyBib3JkZXI6IHNvbGlkIDNweDsgYm9yZGVyLWNvbG9yOiB3aGl0ZSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDsgbWFyZ2luLXRvcDogLTFweDsgbWFyZ2luLWxlZnQ6IC0zcHg7IH0KLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5hbGVydCA+IHNwYW4geyBiYWNrZ3JvdW5kLWNvbG9yOiAjYzYwZjEzOyBib3JkZXItbGVmdC1jb2xvcjogIzdmMGEwYzsgfQouYnV0dG9uLmRyb3Bkb3duLnNwbGl0LnN1Y2Nlc3MgPiBzcGFuIHsgYmFja2dyb3VuZC1jb2xvcjogIzVkYTQyMzsgYm9yZGVyLWxlZnQtY29sb3I6ICMzOTY1MTY7IH0KLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5zZWNvbmRhcnkgPiBzcGFuIHsgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTsgYm9yZGVyLWxlZnQtY29sb3I6ICNjM2MzYzM7IH0KLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5zZWNvbmRhcnkgPiBhIHsgY29sb3I6ICMxZDFkMWQ7IH0KLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5hbGVydCA+IGE6aG92ZXIsIC5idXR0b24uZHJvcGRvd24uc3BsaXQuYWxlcnQgPiBzcGFuOmhvdmVyLCAuYnV0dG9uLmRyb3Bkb3duLnNwbGl0LmFsZXJ0ID4gYTpmb2N1cywgLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5hbGVydCA+IHNwYW46Zm9jdXMgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjOTcwYjBlOyB9Ci5idXR0b24uZHJvcGRvd24uc3BsaXQuc3VjY2VzcyA+IGE6aG92ZXIsIC5idXR0b24uZHJvcGRvd24uc3BsaXQuc3VjY2VzcyA+IHNwYW46aG92ZXIsIC5idXR0b24uZHJvcGRvd24uc3BsaXQuc3VjY2VzcyA+IGE6Zm9jdXMsIC5idXR0b24uZHJvcGRvd24uc3BsaXQuc3VjY2VzcyA+IHNwYW46Zm9jdXMgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjNDU3YTFhOyB9Ci5idXR0b24uZHJvcGRvd24uc3BsaXQuc2Vjb25kYXJ5ID4gYTpob3ZlciwgLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5zZWNvbmRhcnkgPiBzcGFuOmhvdmVyLCAuYnV0dG9uLmRyb3Bkb3duLnNwbGl0LnNlY29uZGFyeSA+IGE6Zm9jdXMsIC5idXR0b24uZHJvcGRvd24uc3BsaXQuc2Vjb25kYXJ5ID4gc3Bhbjpmb2N1cyB7IGJhY2tncm91bmQtY29sb3I6ICNkMGQwZDA7IH0KCi8qIEJ1dHRvbiBHcm91cHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwp1bC5idXR0b24tZ3JvdXAgeyBsaXN0LXN0eWxlOiBub25lOyBwYWRkaW5nOiAwOyBtYXJnaW46IDAgMCAxMnB4OyAqem9vbTogMTsgfQp1bC5idXR0b24tZ3JvdXA6YmVmb3JlLCB1bC5idXR0b24tZ3JvdXA6YWZ0ZXIgeyBjb250ZW50OiAiICI7IGRpc3BsYXk6IHRhYmxlOyB9CnVsLmJ1dHRvbi1ncm91cDphZnRlciB7IGNsZWFyOiBib3RoOyB9CnVsLmJ1dHRvbi1ncm91cCBsaSB7IHBhZGRpbmc6IDA7IG1hcmdpbjogMCAwIDAgLTFweDsgZmxvYXQ6IGxlZnQ7IH0KdWwuYnV0dG9uLWdyb3VwIGxpOmZpcnN0LWNoaWxkIHsgbWFyZ2luLWxlZnQ6IDA7IH0KdWwuYnV0dG9uLWdyb3VwLnJhZGl1cyBsaSAuYnV0dG9uLCB1bC5idXR0b24tZ3JvdXAucmFkaXVzIGxpIC5idXR0b24ucmFkaXVzLCB1bC5idXR0b24tZ3JvdXAucmFkaXVzIGxpIC5idXR0b24tcm91bmRlZCB7IC13ZWJraXQtYm9yZGVyLXJhZGl1czogMHB4OyAtbW96LWJvcmRlci1yYWRpdXM6IDBweDsgLW1zLWJvcmRlci1yYWRpdXM6IDBweDsgLW8tYm9yZGVyLXJhZGl1czogMHB4OyBib3JkZXItcmFkaXVzOiAwcHg7IH0KdWwuYnV0dG9uLWdyb3VwLnJhZGl1cyBsaTpmaXJzdC1jaGlsZCAuYnV0dG9uLCB1bC5idXR0b24tZ3JvdXAucmFkaXVzIGxpOmZpcnN0LWNoaWxkIC5idXR0b24ucmFkaXVzIHsgLW1vei1ib3JkZXItcmFkaXVzLXRvcGxlZnQ6IDNweDsgLXdlYmtpdC1ib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAzcHg7IGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDNweDsgLW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbWxlZnQ6IDNweDsgLXdlYmtpdC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAzcHg7IGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDNweDsgfQp1bC5idXR0b24tZ3JvdXAucmFkaXVzIGxpOmZpcnN0LWNoaWxkIC5idXR0b24ucm91bmRlZCB7IC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0OiAxMDAwcHg7IC13ZWJraXQtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMTAwMHB4OyBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAxMDAwcHg7IC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OiAxMDAwcHg7IC13ZWJraXQtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMTAwMHB4OyBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAxMDAwcHg7IH0KdWwuYnV0dG9uLWdyb3VwLnJhZGl1cyBsaTpsYXN0LWNoaWxkIC5idXR0b24sIHVsLmJ1dHRvbi1ncm91cC5yYWRpdXMgbGk6bGFzdC1jaGlsZCAuYnV0dG9uLnJhZGl1cyB7IC1tb3otYm9yZGVyLXJhZGl1cy10b3ByaWdodDogM3B4OyAtd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAzcHg7IGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAzcHg7IC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodDogM3B4OyAtd2Via2l0LWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAzcHg7IGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAzcHg7IH0KdWwuYnV0dG9uLWdyb3VwLnJhZGl1cyBsaTpsYXN0LWNoaWxkIC5idXR0b24ucm91bmRlZCB7IC1tb3otYm9yZGVyLXJhZGl1cy10b3ByaWdodDogMTAwMHB4OyAtd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAxMDAwcHg7IGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAxMDAwcHg7IC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodDogMTAwMHB4OyAtd2Via2l0LWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAxMDAwcHg7IGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAxMDAwcHg7IH0KdWwuYnV0dG9uLWdyb3VwLmV2ZW4gLmJ1dHRvbiB7IHdpZHRoOiAxMDAlOyB9CnVsLmJ1dHRvbi1ncm91cC5ldmVuLnR3by11cCBsaSB7IHdpZHRoOiA1MCU7IH0KdWwuYnV0dG9uLWdyb3VwLmV2ZW4udGhyZWUtdXAgbGkgeyB3aWR0aDogMzMuMyU7IH0KdWwuYnV0dG9uLWdyb3VwLmV2ZW4udGhyZWUtdXAgbGk6Zmlyc3QtY2hpbGQgeyB3aWR0aDogMzMuNCU7IH0KdWwuYnV0dG9uLWdyb3VwLmV2ZW4uZm91ci11cCBsaSB7IHdpZHRoOiAyNSU7IH0KdWwuYnV0dG9uLWdyb3VwLmV2ZW4uZml2ZS11cCBsaSB7IHdpZHRoOiAyMCU7IH0KCmRpdi5idXR0b24tYmFyIHsgb3ZlcmZsb3c6IGhpZGRlbjsgfQpkaXYuYnV0dG9uLWJhciB1bC5idXR0b24tZ3JvdXAgeyBmbG9hdDogbGVmdDsgbWFyZ2luLXJpZ2h0OiA4cHg7IH0KZGl2LmJ1dHRvbi1iYXIgdWwuYnV0dG9uLWdyb3VwOmxhc3QtY2hpbGQgeyBtYXJnaW4tbGVmdDogMDsgfQoKLm5hdi1iYXIgeyBoZWlnaHQ6IDQwcHg7IGJhY2tncm91bmQ6ICM0ZDRkNGQ7IG1hcmdpbi1sZWZ0OiAwOyBtYXJnaW4tdG9wOiAyMHB4OyBwYWRkaW5nOiAwOyB9Ci5uYXYtYmFyID4gbGkgeyBmbG9hdDogbGVmdDsgZGlzcGxheTogYmxvY2s7IHBvc2l0aW9uOiByZWxhdGl2ZTsgcGFkZGluZzogMDsgbWFyZ2luOiAwOyBib3JkZXI6IDFweCBzb2xpZCAjMzMzMzMzOyBib3JkZXItcmlnaHQ6IG5vbmU7IGxpbmUtaGVpZ2h0OiAzOHB4OyAtd2Via2l0LWJveC1zaGFkb3c6IDFweCAwIDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpIGluc2V0OyAtbW96LWJveC1zaGFkb3c6IDFweCAwIDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpIGluc2V0OyBib3gtc2hhZG93OiAxcHggMCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSBpbnNldDsgfQoubmF2LWJhciA+IGxpOmZpcnN0LWNoaWxkIHsgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgMDsgLW1vei1ib3gtc2hhZG93OiAwIDAgMDsgYm94LXNoYWRvdzogMCAwIDA7IH0KLm5hdi1iYXIgPiBsaTpsYXN0LWNoaWxkIHsgYm9yZGVyLXJpZ2h0OiBzb2xpZCAxcHggIzMzMzMzMzsgLXdlYmtpdC1ib3gtc2hhZG93OiAxcHggMCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSBpbnNldCwgMXB4IDAgMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7IC1tb3otYm94LXNoYWRvdzogMXB4IDAgMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMikgaW5zZXQsIDFweCAwIDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpOyBib3gtc2hhZG93OiAxcHggMCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSBpbnNldCwgMXB4IDAgMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7IH0KLm5hdi1iYXIgPiBsaS5hY3RpdmUgeyBiYWNrZ3JvdW5kOiAjMmJhNmNiOyBib3JkZXItY29sb3I6ICMyMjg0YTE7IH0KLm5hdi1iYXIgPiBsaS5hY3RpdmUgPiBhIHsgY29sb3I6IHdoaXRlOyBjdXJzb3I6IGRlZmF1bHQ7IH0KLm5hdi1iYXIgPiBsaS5hY3RpdmU6aG92ZXIgeyBiYWNrZ3JvdW5kOiAjMmJhNmNiOyBjdXJzb3I6IGRlZmF1bHQ7IH0KLm5hdi1iYXIgPiBsaTpob3ZlciB7IGJhY2tncm91bmQ6ICMzMzMzMzM7IH0KLm5hdi1iYXIgPiBsaSA+IGEgeyBjb2xvcjogI2U2ZTZlNjsgfQoubmF2LWJhciA+IGxpIHVsIHsgbWFyZ2luLWJvdHRvbTogMDsgfQoubmF2LWJhciA+IGxpIC5mbHlvdXQgeyBkaXNwbGF5OiBub25lOyB9Ci5uYXYtYmFyID4gbGkuaGFzLWZseW91dCA+IGE6Zmlyc3QtY2hpbGQgeyBwYWRkaW5nLXJpZ2h0OiA0MHB4OyBwb3NpdGlvbjogcmVsYXRpdmU7IH0KLm5hdi1iYXIgPiBsaS5oYXMtZmx5b3V0ID4gYTpmaXJzdC1jaGlsZDphZnRlciB7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDA7IGhlaWdodDogMDsgYm9yZGVyOiBzb2xpZCA0cHg7IGJvcmRlci1jb2xvcjogI2U2ZTZlNiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDsgcG9zaXRpb246IGFic29sdXRlOyByaWdodDogMjBweDsgdG9wOiAxN3B4OyB9Ci5uYXYtYmFyID4gbGkuaGFzLWZseW91dCA+IGEuZmx5b3V0LXRvZ2dsZSB7IGJvcmRlci1sZWZ0OiAwICFpbXBvcnRhbnQ7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgcmlnaHQ6IDA7IHRvcDogMDsgcGFkZGluZzogMjBweDsgei1pbmRleDogMjsgZGlzcGxheTogYmxvY2s7IH0KLm5hdi1iYXIgPiBsaS5oYXMtZmx5b3V0LmlzLXRvdWNoID4gYTpmaXJzdC1jaGlsZCB7IHBhZGRpbmctcmlnaHQ6IDU1cHg7IH0KLm5hdi1iYXIgPiBsaS5oYXMtZmx5b3V0LmlzLXRvdWNoID4gYS5mbHlvdXQtdG9nZ2xlIHsgYm9yZGVyLWxlZnQ6IDFweCBkYXNoZWQgIzY2NjsgfQoubmF2LWJhciA+IGxpID4gYTpmaXJzdC1jaGlsZCB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgcGFkZGluZzogMCAyMHB4OyBkaXNwbGF5OiBibG9jazsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBmb250LXNpemU6IDE0cHg7IH0KLm5hdi1iYXIgPiBsaSA+IGlucHV0IHsgbWFyZ2luOiAwIDEwcHg7IH0KLm5hdi1iYXIudmVydGljYWwgeyBoZWlnaHQ6IGF1dG87IG1hcmdpbi10b3A6IDA7IH0KLm5hdi1iYXIudmVydGljYWwgPiBsaSB7IGZsb2F0OiBub25lOyBib3JkZXItYm90dG9tOiBub25lOyBib3JkZXItcmlnaHQ6IHNvbGlkIDFweCAjMzMzMzMzOyAtd2Via2l0LWJveC1zaGFkb3c6IG5vbmU7IC1tb3otYm94LXNoYWRvdzogbm9uZTsgYm94LXNoYWRvdzogbm9uZTsgfQoubmF2LWJhci52ZXJ0aWNhbCA+IGxpLmhhcy1mbHlvdXQgPiBhOmZpcnN0LWNoaWxkOmFmdGVyIHsgY29udGVudDogIiI7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMDsgaGVpZ2h0OiAwOyBib3JkZXI6IHNvbGlkIDRweDsgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCAjZTZlNmU2OyB9Ci5uYXYtYmFyLnZlcnRpY2FsID4gbGkgLmZseW91dCB7IGxlZnQ6IDEwMCU7IHRvcDogLTFweDsgfQoubmF2LWJhci52ZXJ0aWNhbCA+IGxpIC5mbHlvdXQucmlnaHQgeyBsZWZ0OiBhdXRvOyByaWdodDogMTAwJTsgfQoubmF2LWJhci52ZXJ0aWNhbCA+IGxpLmFjdGl2ZSB7IGJvcmRlci1yaWdodDogc29saWQgMXB4ICMyMjg0YTE7IH0KLm5hdi1iYXIudmVydGljYWwgPiBsaTpsYXN0LWNoaWxkIHsgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4ICMzMzMzMzM7IH0KCi5mbHlvdXQgeyBiYWNrZ3JvdW5kOiAjZjJmMmYyOyBwYWRkaW5nOiAyMHB4OyBtYXJnaW46IDA7IGJvcmRlcjogMXB4IHNvbGlkICNkOWQ5ZDk7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAzOXB4OyBsZWZ0OiAtMXB4OyB3aWR0aDogMjUwcHg7IHotaW5kZXg6IDQwOyAtd2Via2l0LWJveC1zaGFkb3c6IDAgMXB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMSk7IC1tb3otYm94LXNoYWRvdzogMCAxcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xKTsgYm94LXNoYWRvdzogMCAxcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xKTsgLyogcmVtb3ZlIG1hcmdpbiBvbiBhbnkgZmlyc3QtY2hpbGQgZWxlbWVudCAqLyAvKiByZW1vdmUgbWFyZ2luIG9uIGxhc3QgZWxlbWVudCAqLyB9Ci5mbHlvdXQgcCB7IGxpbmUtaGVpZ2h0OiAxLjI7IGZvbnQtc2l6ZTogMTNweDsgfQouZmx5b3V0ICo6Zmlyc3QtY2hpbGQgeyBtYXJnaW4tdG9wOiAwOyB9Ci5mbHlvdXQgKjpsYXN0LWNoaWxkIHsgbWFyZ2luLWJvdHRvbTogMDsgfQouZmx5b3V0LnNtYWxsIHsgd2lkdGg6IDE2Ni42NjY2N3B4OyB9Ci5mbHlvdXQubGFyZ2UgeyB3aWR0aDogNDM3LjVweDsgfQouZmx5b3V0LnJpZ2h0IHsgbGVmdDogYXV0bzsgcmlnaHQ6IC0ycHg7IH0KLmZseW91dC5sZWZ0IHsgcmlnaHQ6IGF1dG87IGxlZnQ6IC0ycHg7IH0KLmZseW91dC51cCB7IHRvcDogYXV0bzsgYm90dG9tOiAzOXB4OyB9Cgp1bC5mbHlvdXQsIC5uYXYtYmFyIGxpIHVsIHsgcGFkZGluZzogMDsgbGlzdC1zdHlsZTogbm9uZTsgfQp1bC5mbHlvdXQgbGksIC5uYXYtYmFyIGxpIHVsIGxpIHsgYm9yZGVyLWxlZnQ6IHNvbGlkIDNweCAjQ0NDOyB9CnVsLmZseW91dCBsaSBhLCAubmF2LWJhciBsaSB1bCBsaSBhIHsgYmFja2dyb3VuZDogI2YyZjJmMjsgYm9yZGVyOiAxcHggc29saWQgI2U2ZTZlNjsgYm9yZGVyLXdpZHRoOiAxcHggMXB4IDAgMDsgY29sb3I6ICM1NTU7IGRpc3BsYXk6IGJsb2NrOyBmb250LXNpemU6IDE0cHg7IGhlaWdodDogYXV0bzsgbGluZS1oZWlnaHQ6IDE7IHBhZGRpbmc6IDE1cHggMjBweDsgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSBpbnNldDsgLW1vei1ib3gtc2hhZG93OiAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSBpbnNldDsgYm94LXNoYWRvdzogMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSkgaW5zZXQ7IH0KdWwuZmx5b3V0IGxpIGE6aG92ZXIsIHVsLmZseW91dCBsaSBhOmZvY3VzLCAubmF2LWJhciBsaSB1bCBsaSBhOmhvdmVyLCAubmF2LWJhciBsaSB1bCBsaSBhOmZvY3VzIHsgYmFja2dyb3VuZDogI2ViZWJlYjsgY29sb3I6ICMzMzM7IH0KdWwuZmx5b3V0IGxpLmFjdGl2ZSwgLm5hdi1iYXIgbGkgdWwgbGkuYWN0aXZlIHsgbWFyZ2luLXRvcDogMDsgYm9yZGVyLXRvcDogMXB4IHNvbGlkICM0ZDRkNGQ7IGJvcmRlci1sZWZ0OiA0cHggc29saWQgIzFhMWExYTsgfQp1bC5mbHlvdXQgbGkuYWN0aXZlIGEsIC5uYXYtYmFyIGxpIHVsIGxpLmFjdGl2ZSBhIHsgYmFja2dyb3VuZDogIzRkNGQ0ZDsgYm9yZGVyOiBub25lOyBjb2xvcjogI2ZmZjsgaGVpZ2h0OiBhdXRvOyBtYXJnaW46IDA7IHBvc2l0aW9uOiBzdGF0aWM7IHRvcDogMDsgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgMDsgLW1vei1ib3gtc2hhZG93OiAwIDAgMDsgYm94LXNoYWRvdzogMCAwIDA7IH0KCi8qIENTUyBmb3IgalF1ZXJ5IE9yYml0IFBsdWdpbiAxLjQuMCBNYWludGFpbmVkIGZvciBGb3VuZGF0aW9uLiBmb3VuZGF0aW9uLnp1cmIuY29tIEZyZWUgdG8gdXNlIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAKKi8KLyogQ29udGFpbmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm9yYml0LXdyYXBwZXIgeyB3aWR0aDogMXB4OyBoZWlnaHQ6IDFweDsgcG9zaXRpb246IHJlbGF0aXZlOyB9Cgoub3JiaXQgeyB3aWR0aDogMXB4OyBoZWlnaHQ6IDFweDsgcG9zaXRpb246IHJlbGF0aXZlOyBvdmVyZmxvdzogaGlkZGVuOyBtYXJnaW4tYm90dG9tOiAxN3B4OyB9Ci5vcmJpdC53aXRoLWJ1bGxldHMgeyBtYXJnaW4tYm90dG9tOiA0MHB4OyB9Ci5vcmJpdCAub3JiaXQtc2xpZGUgeyBtYXgtd2lkdGg6IDEwMCU7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBsZWZ0OiAwOyB9Ci5vcmJpdCBhLm9yYml0LXNsaWRlIHsgYm9yZGVyOiBub25lOyBsaW5lLWhlaWdodDogMDsgZGlzcGxheTogbm9uZTsgfQoub3JiaXQgZGl2Lm9yYml0LXNsaWRlIHsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGEoT3BhY2l0eT0wKTsgb3BhY2l0eTogMDsgfQoKLyogTm90ZTogSWYgeW91ciBzbGlkZXIgb25seSB1c2VzIGNvbnRlbnQgb3IgYW5jaG9ycywgeW91J3JlIGdvaW5nIHRvIHdhbnQgdG8gcHV0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGRlY2xhcmF0aW9ucyBvbiB0aGUgIi5vcmJpdD5kaXYiIGFuZCAiZGl2Lm9yYml0PmEiIHRhZ3MgaW4gYWRkaXRpb24gdG8ganVzdCB0aGUgLm9yYml0LXdyYXBwZXIgKi8KLyogVGltZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoub3JiaXQtd3JhcHBlciAudGltZXIgeyB3aWR0aDogNDBweDsgaGVpZ2h0OiA0MHB4OyBvdmVyZmxvdzogaGlkZGVuOyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMTBweDsgcmlnaHQ6IDEwcHg7IG9wYWNpdHk6IC42OyBjdXJzb3I6IHBvaW50ZXI7IHotaW5kZXg6IDMxOyB9Ci5vcmJpdC13cmFwcGVyIHNwYW4ucm90YXRvciB7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogNDBweDsgaGVpZ2h0OiA0MHB4OyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgbGVmdDogLTIwcHg7IGJhY2tncm91bmQ6IHVybCgnLi4vaW1hZ2VzL2ZvdW5kYXRpb24vb3JiaXQvcm90YXRvci1ibGFjay5wbmcnKSBuby1yZXBlYXQ7IHotaW5kZXg6IDM7IH0KLm9yYml0LXdyYXBwZXIgc3Bhbi5yb3RhdG9yLm1vdmUgeyBsZWZ0OiAwOyB9Ci5vcmJpdC13cmFwcGVyIHNwYW4ubWFzayB7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMjBweDsgaGVpZ2h0OiA0MHB4OyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgcmlnaHQ6IDA7IHotaW5kZXg6IDI7IG92ZXJmbG93OiBoaWRkZW47IH0KLm9yYml0LXdyYXBwZXIgc3Bhbi5tYXNrLm1vdmUgeyB3aWR0aDogNDBweDsgbGVmdDogMDsgYmFja2dyb3VuZDogdXJsKCcuLi9pbWFnZXMvZm91bmRhdGlvbi9vcmJpdC90aW1lci1ibGFjay5wbmcnKSByZXBlYXQgMCAwOyB9Ci5vcmJpdC13cmFwcGVyIHNwYW4ucGF1c2UgeyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDQwcHg7IGhlaWdodDogNDBweDsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDA7IGxlZnQ6IDA7IGJhY2tncm91bmQ6IHVybCgnLi4vaW1hZ2VzL2ZvdW5kYXRpb24vb3JiaXQvcGF1c2UtYmxhY2sucG5nJykgbm8tcmVwZWF0OyB6LWluZGV4OiA0OyBvcGFjaXR5OiAwOyB9Ci5vcmJpdC13cmFwcGVyIHNwYW4ucGF1c2UuYWN0aXZlIHsgYmFja2dyb3VuZDogdXJsKCcuLi9pbWFnZXMvZm91bmRhdGlvbi9vcmJpdC9wYXVzZS1ibGFjay5wbmcnKSBuby1yZXBlYXQgMCAtNDBweDsgfQoub3JiaXQtd3JhcHBlciAudGltZXI6aG92ZXIgc3Bhbi5wYXVzZSwgLm9yYml0LXdyYXBwZXIgLnRpbWVyOmZvY3VzIHNwYW4ucGF1c2UsIC5vcmJpdC13cmFwcGVyIHNwYW4ucGF1c2UuYWN0aXZlIHsgb3BhY2l0eTogMTsgfQoKLyogQ2FwdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoub3JiaXQtY2FwdGlvbiB7IGRpc3BsYXk6IG5vbmU7IGZvbnQtZmFtaWx5OiBpbmhlcml0OyB9Cgoub3JiaXQtd3JhcHBlciAub3JiaXQtY2FwdGlvbiB7IGJhY2tncm91bmQ6IGJsYWNrOyBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNik7IHotaW5kZXg6IDMwOyBjb2xvcjogd2hpdGU7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogN3B4IDA7IGZvbnQtc2l6ZTogMTNweDsgcG9zaXRpb246IGFic29sdXRlOyByaWdodDogMDsgYm90dG9tOiAwOyB3aWR0aDogMTAwJTsgfQoKLyogRGlyZWN0aW9uYWwgTmF2IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLm9yYml0LXdyYXBwZXIgLnNsaWRlci1uYXYgeyBkaXNwbGF5OiBibG9jazsgfQoub3JiaXQtd3JhcHBlciAuc2xpZGVyLW5hdiBzcGFuIHsgd2lkdGg6IDM5cHg7IGhlaWdodDogNTBweDsgdGV4dC1pbmRlbnQ6IC05OTk5cHg7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgei1pbmRleDogMzA7IHRvcDogNTAlOyBtYXJnaW4tdG9wOiAtMjVweDsgY3Vyc29yOiBwb2ludGVyOyB9Ci5vcmJpdC13cmFwcGVyIC5zbGlkZXItbmF2IHNwYW4ucmlnaHQgeyBiYWNrZ3JvdW5kOiB1cmwoJy4uL2ltYWdlcy9mb3VuZGF0aW9uL29yYml0L3JpZ2h0LWFycm93LnBuZycpOyBiYWNrZ3JvdW5kLXNpemU6IDEwMCU7IHJpZ2h0OiAwOyB9Ci5vcmJpdC13cmFwcGVyIC5zbGlkZXItbmF2IHNwYW4ubGVmdCB7IGJhY2tncm91bmQ6IHVybCgnLi4vaW1hZ2VzL2ZvdW5kYXRpb24vb3JiaXQvbGVmdC1hcnJvdy5wbmcnKTsgYmFja2dyb3VuZC1zaXplOiAxMDAlOyBsZWZ0OiAwOyB9CgoubHQtaWU5IC5vcmJpdC13cmFwcGVyIC5zbGlkZXItbmF2IHNwYW4ucmlnaHQgeyBiYWNrZ3JvdW5kOiB1cmwoJy4uL2ltYWdlcy9mb3VuZGF0aW9uL29yYml0L3JpZ2h0LWFycm93LXNtYWxsLnBuZycpOyB9Ci5sdC1pZTkgLm9yYml0LXdyYXBwZXIgLnNsaWRlci1uYXYgc3Bhbi5sZWZ0IHsgYmFja2dyb3VuZDogdXJsKCcuLi9pbWFnZXMvZm91bmRhdGlvbi9vcmJpdC9sZWZ0LWFycm93LXNtYWxsLnBuZycpOyB9CgovKiBCdWxsZXQgTmF2IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KdWwub3JiaXQtYnVsbGV0cyB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgei1pbmRleDogMzA7IGxpc3Qtc3R5bGU6IG5vbmU7IGJvdHRvbTogLTQwcHg7IGxlZnQ6IDUwJTsgbWFyZ2luLWxlZnQ6IC01MHB4OyBwYWRkaW5nOiAwOyB9CnVsLm9yYml0LWJ1bGxldHMgbGkgeyBmbG9hdDogbGVmdDsgbWFyZ2luLWxlZnQ6IDVweDsgY3Vyc29yOiBwb2ludGVyOyBjb2xvcjogIzk5OTk5OTsgdGV4dC1pbmRlbnQ6IC05OTk5cHg7IGJhY2tncm91bmQ6IHVybCgnLi4vaW1hZ2VzL2ZvdW5kYXRpb24vb3JiaXQvYnVsbGV0cy5qcGcnKSBuby1yZXBlYXQgNHB4IDA7IHdpZHRoOiAxM3B4OyBoZWlnaHQ6IDEycHg7IG92ZXJmbG93OiBoaWRkZW47IH0KdWwub3JiaXQtYnVsbGV0cyBsaS5hY3RpdmUgeyBjb2xvcjogIzIyMjIyMjsgYmFja2dyb3VuZC1wb3NpdGlvbjogLThweCAwOyB9CnVsLm9yYml0LWJ1bGxldHMgbGkuaGFzLXRodW1iIHsgYmFja2dyb3VuZDogbm9uZTsgd2lkdGg6IDEwMHB4OyBoZWlnaHQ6IDc1cHg7IH0KdWwub3JiaXQtYnVsbGV0cyBsaS5hY3RpdmUuaGFzLXRodW1iIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAwOyBib3JkZXItdG9wOiAycHggc29saWQgYmxhY2s7IH0KCi8qIE9yYml0IFNsaWRlIENvdW50ZXIgKi8KLm9yYml0LXNsaWRlLWNvdW50ZXIgeyBwb3NpdGlvbjogYWJzb2x1dGU7IGJvdHRvbTogMDsgei1pbmRleDogOTk7IGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC43KTsgY29sb3I6IHdoaXRlOyBwYWRkaW5nOiA1cHg7IH0KCi8qIEZsdWlkIExheW91dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5vcmJpdCBpbWcuZmx1aWQtcGxhY2Vob2xkZXIgeyB2aXNpYmlsaXR5OiBoaWRkZW47IHBvc2l0aW9uOiBzdGF0aWM7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMTAwJTsgfQoKLm9yYml0LCAub3JiaXQtd3JhcHBlciB7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IH0KCi8qIENvcnJlY3QgdGltZXIgaW4gSUUgKi8KLmx0LWllOSAudGltZXIgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0KCi5sdC1pZTkgLm9yYml0LWNhcHRpb24geyBiYWNrZ3JvdW5kOiBibGFjazsgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0jOTkwMDAwMDAsZW5kQ29sb3JzdHI9Izk5MDAwMDAwKTsgem9vbTogMTsgfQoKQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjdweCkgeyAub3JiaXQub3JiaXQtc3RhY2stb24tc21hbGwgaW1nLmZsdWlkLXBsYWNlaG9sZGVyIHsgdmlzaWJpbGl0eTogdmlzaWJsZTsgfQogIC5vcmJpdC5vcmJpdC1zdGFjay1vbi1zbWFsbCAub3JiaXQtc2xpZGUgeyBwb3NpdGlvbjogc3RhdGljOyBtYXJnaW4tYm90dG9tOiAxMHB4OyB9IH0KLyogQ1NTIGZvciBqUXVlcnkgUmV2ZWFsIFBsdWdpbiBNYWludGFpbmVkIGZvciBGb3VuZGF0aW9uLiBmb3VuZGF0aW9uLnp1cmIuY29tIEZyZWUgdG8gdXNlIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAgKi8KLyogUmV2ZWFsIE1vZGFscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5yZXZlYWwtbW9kYWwtYmcgeyBwb3NpdGlvbjogZml4ZWQ7IGhlaWdodDogMTAwJTsgd2lkdGg6IDEwMCU7IGJhY2tncm91bmQ6ICMwMDA7IGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC40NSk7IHotaW5kZXg6IDQwOyBkaXNwbGF5OiBub25lOyB0b3A6IDA7IGxlZnQ6IDA7IH0KCi5yZXZlYWwtbW9kYWwgeyBiYWNrZ3JvdW5kOiAjZmZmOyB2aXNpYmlsaXR5OiBoaWRkZW47IGRpc3BsYXk6IG5vbmU7IHRvcDogMTAwcHg7IGxlZnQ6IDUwJTsgbWFyZ2luLWxlZnQ6IC0yNjBweDsgd2lkdGg6IDUyMHB4OyBwb3NpdGlvbjogYWJzb2x1dGU7IHotaW5kZXg6IDQxOyBwYWRkaW5nOiAzMHB4OyAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCAxMHB4IHJnYmEoMCwgMCwgMCwgMC40KTsgLW1vei1ib3gtc2hhZG93OiAwIDAgMTBweCByZ2JhKDAsIDAsIDAsIDAuNCk7IGJveC1zaGFkb3c6IDAgMCAxMHB4IHJnYmEoMCwgMCwgMCwgMC40KTsgfQoucmV2ZWFsLW1vZGFsIC5jbG9zZS1yZXZlYWwtbW9kYWw6bm90KC5idXR0b24pIHsgZm9udC1zaXplOiAyMnB4OyBmb250LXNpemU6IDIuMnJlbTsgbGluZS1oZWlnaHQ6IC41OyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogOHB4OyByaWdodDogMTFweDsgY29sb3I6ICNhYWE7IHRleHQtc2hhZG93OiAwIC0xcHggMXB4IHJnYmEoMCwgMCwgMCwgMC42KTsgZm9udC13ZWlnaHQ6IGJvbGQ7IGN1cnNvcjogcG9pbnRlcjsgfQoucmV2ZWFsLW1vZGFsLnNtYWxsIHsgd2lkdGg6IDMwJTsgbWFyZ2luLWxlZnQ6IC0xNSU7IH0KLnJldmVhbC1tb2RhbC5tZWRpdW0geyB3aWR0aDogNDAlOyBtYXJnaW4tbGVmdDogLTIwJTsgfQoucmV2ZWFsLW1vZGFsLmxhcmdlIHsgd2lkdGg6IDYwJTsgbWFyZ2luLWxlZnQ6IC0zMCU7IH0KLnJldmVhbC1tb2RhbC54bGFyZ2UgeyB3aWR0aDogNzAlOyBtYXJnaW4tbGVmdDogLTM1JTsgfQoucmV2ZWFsLW1vZGFsLmV4cGFuZCB7IHdpZHRoOiA5MCU7IG1hcmdpbi1sZWZ0OiAtNDUlOyB9Ci5yZXZlYWwtbW9kYWwgLnJvdyB7IG1pbi13aWR0aDogMDsgbWFyZ2luLWJvdHRvbTogMTBweDsgfQoucmV2ZWFsLW1vZGFsID4gOmZpcnN0LWNoaWxkIHsgbWFyZ2luLXRvcDogMDsgfQoucmV2ZWFsLW1vZGFsID4gOmxhc3QtY2hpbGQgeyBtYXJnaW4tYm90dG9tOiAwOyB9CgpAbWVkaWEgcHJpbnQgeyAucmV2ZWFsLW1vZGFsIHsgYm9yZGVyOiBzb2xpZCAxcHggIzAwMDsgYmFja2dyb3VuZDogI2ZmZjsgfSB9Ci8qIFRhYnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoudGFicyB7IGxpc3Qtc3R5bGU6IG5vbmU7IGJvcmRlci1ib3R0b206IHNvbGlkIDFweCAjZTZlNmU2OyBkaXNwbGF5OiBibG9jazsgaGVpZ2h0OiA0MHB4OyBwYWRkaW5nOiAwOyBtYXJnaW4tYm90dG9tOiAyMHB4OyB9Ci50YWJzLmNvbnRhaW5lZCB7IG1hcmdpbi1ib3R0b206IDA7IG1hcmdpbi1sZWZ0OiAwOyB9Ci50YWJzIGR0LCAudGFicyBsaS5zZWN0aW9uLXRpdGxlIHsgY29sb3I6ICNiM2IzYjM7IGN1cnNvcjogZGVmYXVsdDsgZGlzcGxheTogYmxvY2s7IGZsb2F0OiBsZWZ0OyBmb250LXNpemU6IDEycHg7IGhlaWdodDogNDBweDsgbGluZS1oZWlnaHQ6IDQwcHg7IHBhZGRpbmc6IDA7IHBhZGRpbmctcmlnaHQ6IDlweDsgcGFkZGluZy1sZWZ0OiAyMHB4OyBmb250LXdlaWdodDogbm9ybWFsOyB3aWR0aDogYXV0bzsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgfQoudGFicyBkdDpmaXJzdC1jaGlsZCwgLnRhYnMgbGkuc2VjdGlvbi10aXRsZTpmaXJzdC1jaGlsZCB7IHBhZGRpbmc6IDA7IHBhZGRpbmctcmlnaHQ6IDlweDsgfQoudGFicyBkZCwgLnRhYnMgbGkgeyBkaXNwbGF5OiBibG9jazsgZmxvYXQ6IGxlZnQ7IHBhZGRpbmc6IDA7IG1hcmdpbjogMDsgfQoudGFicyBkZCBhLCAudGFicyBsaSBhIHsgY29sb3I6ICM2ZjZmNmY7IGRpc3BsYXk6IGJsb2NrOyBmb250LXNpemU6IDE0cHg7IGhlaWdodDogNDBweDsgbGluZS1oZWlnaHQ6IDQwcHg7IHBhZGRpbmc6IDBweCAyMy44cHg7IH0KLnRhYnMgZGQgYTpmb2N1cywgLnRhYnMgbGkgYTpmb2N1cyB7IGZvbnQtd2VpZ2h0OiBib2xkOyBjb2xvcjogIzJiYTZjYjsgfQoudGFicyBkZC5hY3RpdmUsIC50YWJzIGxpLmFjdGl2ZSB7IGJvcmRlci10b3A6IDNweCBzb2xpZCAjMmJhNmNiOyBtYXJnaW4tdG9wOiAtM3B4OyB9Ci50YWJzIGRkLmFjdGl2ZSBhLCAudGFicyBsaS5hY3RpdmUgYSB7IGN1cnNvcjogZGVmYXVsdDsgY29sb3I6ICMzYzNjM2M7IGJhY2tncm91bmQ6ICNmZmY7IGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2U2ZTZlNjsgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2U2ZTZlNjsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLnRhYnMgZGQ6Zmlyc3QtY2hpbGQsIC50YWJzIGxpOmZpcnN0LWNoaWxkIHsgbWFyZ2luLWxlZnQ6IDA7IH0KLnRhYnMudmVydGljYWwgeyBoZWlnaHQ6IGF1dG87IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTZlNmU2OyB9Ci50YWJzLnZlcnRpY2FsIGR0LCAudGFicy52ZXJ0aWNhbCBkZCwgLnRhYnMudmVydGljYWwgbGkgeyBmbG9hdDogbm9uZTsgaGVpZ2h0OiBhdXRvOyB9Ci50YWJzLnZlcnRpY2FsIGRkLCAudGFicy52ZXJ0aWNhbCBsaSB7IGJvcmRlci1sZWZ0OiAzcHggc29saWQgI2NjY2NjYzsgfQoudGFicy52ZXJ0aWNhbCBkZCBhLCAudGFicy52ZXJ0aWNhbCBsaSBhIHsgYmFja2dyb3VuZDogI2YyZjJmMjsgYm9yZGVyOiBub25lOyBib3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2OyBib3JkZXItd2lkdGg6IDFweCAxcHggMCAwOyBjb2xvcjogIzU1NTsgZGlzcGxheTogYmxvY2s7IGZvbnQtc2l6ZTogMTRweDsgaGVpZ2h0OiBhdXRvOyBsaW5lLWhlaWdodDogMTsgcGFkZGluZzogMTVweCAyMHB4OyAtd2Via2l0LWJveC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpIGluc2V0OyAtbW96LWJveC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpIGluc2V0OyBib3gtc2hhZG93OiAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KSBpbnNldDsgfQoudGFicy52ZXJ0aWNhbCBkZC5hY3RpdmUsIC50YWJzLnZlcnRpY2FsIGxpLmFjdGl2ZSB7IG1hcmdpbi10b3A6IDA7IGJvcmRlci10b3A6IDFweCBzb2xpZCAjNGQ0ZDRkOyBib3JkZXItbGVmdDogNHB4IHNvbGlkICMxYTFhMWE7IH0KLnRhYnMudmVydGljYWwgZGQuYWN0aXZlIGEsIC50YWJzLnZlcnRpY2FsIGxpLmFjdGl2ZSBhIHsgYmFja2dyb3VuZDogIzRkNGQ0ZDsgYm9yZGVyOiBub25lOyBjb2xvcjogI2ZmZjsgaGVpZ2h0OiBhdXRvOyBtYXJnaW46IDA7IHBvc2l0aW9uOiBzdGF0aWM7IHRvcDogMDsgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgMDsgLW1vei1ib3gtc2hhZG93OiAwIDAgMDsgYm94LXNoYWRvdzogMCAwIDA7IH0KLnRhYnMudmVydGljYWwgZGQ6Zmlyc3QtY2hpbGQgYS5hY3RpdmUsIC50YWJzLnZlcnRpY2FsIGxpOmZpcnN0LWNoaWxkIGEuYWN0aXZlIHsgbWFyZ2luOiAwOyB9Ci50YWJzLnBpbGwgeyBib3JkZXItYm90dG9tOiBub25lOyBtYXJnaW4tYm90dG9tOiAxMHB4OyB9Ci50YWJzLnBpbGwgZGQsIC50YWJzLnBpbGwgbGkgeyBtYXJnaW4tcmlnaHQ6IDEwcHg7IH0KLnRhYnMucGlsbCBkZDpsYXN0LWNoaWxkLCAudGFicy5waWxsIGxpOmxhc3QtY2hpbGQgeyBtYXJnaW4tcmlnaHQ6IDA7IH0KLnRhYnMucGlsbCBkZCBhLCAudGFicy5waWxsIGxpIGEgeyAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDEwMDBweDsgLW1vei1ib3JkZXItcmFkaXVzOiAxMDAwcHg7IC1tcy1ib3JkZXItcmFkaXVzOiAxMDAwcHg7IC1vLWJvcmRlci1yYWRpdXM6IDEwMDBweDsgYm9yZGVyLXJhZGl1czogMTAwMHB4OyBiYWNrZ3JvdW5kOiAjZTZlNmU2OyBoZWlnaHQ6IDI2cHg7IGxpbmUtaGVpZ2h0OiAyNnB4OyBjb2xvcjogIzY2NjsgfQoudGFicy5waWxsIGRkLmFjdGl2ZSwgLnRhYnMucGlsbCBsaS5hY3RpdmUgeyBib3JkZXI6IG5vbmU7IG1hcmdpbi10b3A6IDA7IH0KLnRhYnMucGlsbCBkZC5hY3RpdmUgYSwgLnRhYnMucGlsbCBsaS5hY3RpdmUgYSB7IGJhY2tncm91bmQtY29sb3I6ICMyYmE2Y2I7IGJvcmRlcjogbm9uZTsgY29sb3I6ICNmZmY7IH0KLnRhYnMucGlsbC5jb250YWluZWQgeyBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggI2VlZTsgbWFyZ2luLWJvdHRvbTogMDsgfQoudGFicy5waWxsLnR3by11cCBkZCwgLnRhYnMucGlsbC50d28tdXAgbGksIC50YWJzLnBpbGwudGhyZWUtdXAgZGQsIC50YWJzLnBpbGwudGhyZWUtdXAgbGksIC50YWJzLnBpbGwuZm91ci11cCBkZCwgLnRhYnMucGlsbC5mb3VyLXVwIGxpLCAudGFicy5waWxsLmZpdmUtdXAgZGQsIC50YWJzLnBpbGwuZml2ZS11cCBsaSB7IG1hcmdpbi1yaWdodDogMDsgfQoudGFicy50d28tdXAgZHQgYSwgLnRhYnMudHdvLXVwIGRkIGEsIC50YWJzLnR3by11cCBsaSBhLCAudGFicy50aHJlZS11cCBkdCBhLCAudGFicy50aHJlZS11cCBkZCBhLCAudGFicy50aHJlZS11cCBsaSBhLCAudGFicy5mb3VyLXVwIGR0IGEsIC50YWJzLmZvdXItdXAgZGQgYSwgLnRhYnMuZm91ci11cCBsaSBhLCAudGFicy5maXZlLXVwIGR0IGEsIC50YWJzLmZpdmUtdXAgZGQgYSwgLnRhYnMuZml2ZS11cCBsaSBhIHsgcGFkZGluZzogMCAxN3B4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IG92ZXJmbG93OiBoaWRkZW47IH0KLnRhYnMudHdvLXVwIGR0LCAudGFicy50d28tdXAgZGQsIC50YWJzLnR3by11cCBsaSB7IHdpZHRoOiA1MCU7IH0KLnRhYnMudGhyZWUtdXAgZHQsIC50YWJzLnRocmVlLXVwIGRkLCAudGFicy50aHJlZS11cCBsaSB7IHdpZHRoOiAzMy4zMyU7IH0KLnRhYnMuZm91ci11cCBkdCwgLnRhYnMuZm91ci11cCBkZCwgLnRhYnMuZm91ci11cCBsaSB7IHdpZHRoOiAyNSU7IH0KLnRhYnMuZml2ZS11cCBkdCwgLnRhYnMuZml2ZS11cCBkZCwgLnRhYnMuZml2ZS11cCBsaSB7IHdpZHRoOiAyMCU7IH0KCnVsLnRhYnMtY29udGVudCB7IGRpc3BsYXk6IGJsb2NrOyBtYXJnaW46IDAgMCAyMHB4OyBwYWRkaW5nOiAwOyB9CnVsLnRhYnMtY29udGVudCA+IGxpIHsgZGlzcGxheTogbm9uZTsgfQp1bC50YWJzLWNvbnRlbnQgPiBsaS5hY3RpdmUgeyBkaXNwbGF5OiBibG9jazsgfQp1bC50YWJzLWNvbnRlbnQuY29udGFpbmVkIHsgcGFkZGluZzogMDsgfQp1bC50YWJzLWNvbnRlbnQuY29udGFpbmVkID4gbGkgeyBib3JkZXI6IHNvbGlkIDAgI2U2ZTZlNjsgYm9yZGVyLXdpZHRoOiAwIDFweCAxcHggMXB4OyBwYWRkaW5nOiAyMHB4OyB9CnVsLnRhYnMtY29udGVudC5jb250YWluZWQudmVydGljYWwgPiBsaSB7IGJvcmRlci13aWR0aDogMXB4IDFweCAxcHggMXB4OyB9Cgoubm8tanMgdWwudGFicy1jb250ZW50ID4gbGkgeyBkaXNwbGF5OiBibG9jazsgfQoKLyogVGFibGUgb2YgQ29udGVudHMKCjo6IFZpc2liaWxpdHkKOjogQWxlcnRzCjo6IExhYmVscwo6OiBUb29sdGlwcwo6OiBQYW5lbHMKOjogQWNjb3JkaW9uCjo6IFNpZGUgTmF2Cjo6IFN1YiBOYXYKOjogUGFnaW5hdGlvbgo6OiBCcmVhZGNydW1icwo6OiBMaXN0cwo6OiBJbmxpbmUvTGluayBMaXN0cwo6OiBLZXlzdHJva2UgQ2hhcnMKOjogSW1hZ2UgVGh1bWJuYWlscwo6OiBWaWRlbwo6OiBUYWJsZXMKOjogTWljcm9mb3JtYXRzCjo6IFByb2dyZXNzIEJhcnMKOjogUHJpY2luZyBUYWJsZXMKCiovCi8qIEFsZXJ0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpdi5hbGVydC1ib3ggeyBkaXNwbGF5OiBibG9jazsgcGFkZGluZzogNnB4IDdweCA3cHg7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDE0cHg7IGNvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogIzJiYTZjYjsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjEpOyBtYXJnaW4tYm90dG9tOiAxMnB4OyAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDNweDsgLW1vei1ib3JkZXItcmFkaXVzOiAzcHg7IC1tcy1ib3JkZXItcmFkaXVzOiAzcHg7IC1vLWJvcmRlci1yYWRpdXM6IDNweDsgYm9yZGVyLXJhZGl1czogM3B4OyB0ZXh0LXNoYWRvdzogMCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4zKTsgcG9zaXRpb246IHJlbGF0aXZlOyB9CmRpdi5hbGVydC1ib3guc3VjY2VzcyB7IGJhY2tncm91bmQtY29sb3I6ICM1ZGE0MjM7IGNvbG9yOiAjZmZmOyB0ZXh0LXNoYWRvdzogMCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4zKTsgfQpkaXYuYWxlcnQtYm94LmFsZXJ0IHsgYmFja2dyb3VuZC1jb2xvcjogI2M2MGYxMzsgY29sb3I6ICNmZmY7IHRleHQtc2hhZG93OiAwIC0xcHggcmdiYSgwLCAwLCAwLCAwLjMpOyB9CmRpdi5hbGVydC1ib3guc2Vjb25kYXJ5IHsgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTsgY29sb3I6ICM1MDUwNTA7IHRleHQtc2hhZG93OiAwIDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMyk7IH0KZGl2LmFsZXJ0LWJveCBhLmNsb3NlIHsgY29sb3I6ICMzMzM7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgcmlnaHQ6IDRweDsgdG9wOiAtMXB4OyBmb250LXNpemU6IDE3cHg7IG9wYWNpdHk6IDAuMjsgcGFkZGluZzogNHB4OyB9CmRpdi5hbGVydC1ib3ggYS5jbG9zZTpob3ZlciwgZGl2LmFsZXJ0LWJveCBhLmNsb3NlOmZvY3VzIHsgb3BhY2l0eTogMC40OyB9CgovKiBMYWJlbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoubGFiZWwgeyBwYWRkaW5nOiAxcHggNHB4IDJweDsgZm9udC1zaXplOiAxMnB4OyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1hbGlnbjogY2VudGVyOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGxpbmUtaGVpZ2h0OiAxOyB3aGl0ZS1zcGFjZTogbm93cmFwOyBkaXNwbGF5OiBpbmxpbmU7IHBvc2l0aW9uOiByZWxhdGl2ZTsgYm90dG9tOiAxcHg7IGNvbG9yOiAjZmZmOyBiYWNrZ3JvdW5kOiAjMmJhNmNiOyB9Ci5sYWJlbC5yYWRpdXMgeyAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDNweDsgLW1vei1ib3JkZXItcmFkaXVzOiAzcHg7IC1tcy1ib3JkZXItcmFkaXVzOiAzcHg7IC1vLWJvcmRlci1yYWRpdXM6IDNweDsgYm9yZGVyLXJhZGl1czogM3B4OyB9Ci5sYWJlbC5yb3VuZCB7IHBhZGRpbmc6IDFweCA3cHggMnB4OyAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDEwMDBweDsgLW1vei1ib3JkZXItcmFkaXVzOiAxMDAwcHg7IC1tcy1ib3JkZXItcmFkaXVzOiAxMDAwcHg7IC1vLWJvcmRlci1yYWRpdXM6IDEwMDBweDsgYm9yZGVyLXJhZGl1czogMTAwMHB4OyB9Ci5sYWJlbC5hbGVydCB7IGJhY2tncm91bmQtY29sb3I6ICNjNjBmMTM7IH0KLmxhYmVsLnN1Y2Nlc3MgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjNWRhNDIzOyB9Ci5sYWJlbC5zZWNvbmRhcnkgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5OyBjb2xvcjogIzUwNTA1MDsgfQoKLyogVG9vbHRpcHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwouaGFzLXRpcCB7IGJvcmRlci1ib3R0b206IGRvdHRlZCAxcHggI2NjY2NjYzsgY3Vyc29yOiBoZWxwOyBmb250LXdlaWdodDogYm9sZDsgY29sb3I6ICMzMzMzMzM7IH0KLmhhcy10aXA6aG92ZXIsIC5oYXMtdGlwOmZvY3VzIHsgYm9yZGVyLWJvdHRvbTogZG90dGVkIDFweCAjMTk2MTc3OyBjb2xvcjogIzJiYTZjYjsgfQouaGFzLXRpcC50aXAtbGVmdCwgLmhhcy10aXAudGlwLXJpZ2h0IHsgZmxvYXQ6IG5vbmUgIWltcG9ydGFudDsgfQoKLnRvb2x0aXAgeyBkaXNwbGF5OiBub25lOyBiYWNrZ3JvdW5kOiBibGFjazsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjg1KTsgcG9zaXRpb246IGFic29sdXRlOyBjb2xvcjogd2hpdGU7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDEycHg7IHBhZGRpbmc6IDVweDsgei1pbmRleDogOTk5OyAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweDsgLW1vei1ib3JkZXItcmFkaXVzOiA0cHg7IC1tcy1ib3JkZXItcmFkaXVzOiA0cHg7IC1vLWJvcmRlci1yYWRpdXM6IDRweDsgYm9yZGVyLXJhZGl1czogNHB4OyBsaW5lLWhlaWdodDogbm9ybWFsOyB9Ci50b29sdGlwID4gLm51YiB7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMDsgaGVpZ2h0OiAwOyBib3JkZXI6IHNvbGlkIDVweDsgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCBibGFjayB0cmFuc3BhcmVudDsgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCByZ2JhKDAsIDAsIDAsIDAuODUpIHRyYW5zcGFyZW50OyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogLTEwcHg7IGxlZnQ6IDEwcHg7IH0KLnRvb2x0aXAudGlwLW92ZXJyaWRlID4gLm51YiB7IGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgYmxhY2sgdHJhbnNwYXJlbnQgIWltcG9ydGFudDsgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCByZ2JhKDAsIDAsIDAsIDAuODUpIHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7IHRvcDogLTEwcHggIWltcG9ydGFudDsgfQoudG9vbHRpcC50aXAtdG9wID4gLm51YiwgLnRvb2x0aXAudGlwLWNlbnRlcmVkLXRvcCA+IC5udWIgeyBib3JkZXItY29sb3I6IGJsYWNrIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50OyBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44NSkgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7IHRvcDogYXV0bzsgYm90dG9tOiAtMTBweDsgfQoudG9vbHRpcC50aXAtbGVmdCwgLnRvb2x0aXAudGlwLXJpZ2h0IHsgZmxvYXQ6IG5vbmUgIWltcG9ydGFudDsgfQoudG9vbHRpcC50aXAtbGVmdCA+IC5udWIgeyBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IGJsYWNrOyBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHJnYmEoMCwgMCwgMCwgMC44NSk7IHJpZ2h0OiAtMTBweDsgbGVmdDogYXV0bzsgfQoudG9vbHRpcC50aXAtcmlnaHQgPiAubnViIHsgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCBibGFjayB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDsgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCByZ2JhKDAsIDAsIDAsIDAuODUpIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50OyByaWdodDogYXV0bzsgbGVmdDogLTEwcHg7IH0KLnRvb2x0aXAubm9yYWRpdXMgeyAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDA7IC1tb3otYm9yZGVyLXJhZGl1czogMDsgLW1zLWJvcmRlci1yYWRpdXM6IDA7IC1vLWJvcmRlci1yYWRpdXM6IDA7IGJvcmRlci1yYWRpdXM6IDA7IH0KLnRvb2x0aXAub3BlbmVkIHsgY29sb3I6ICMyYmE2Y2IgIWltcG9ydGFudDsgYm9yZGVyLWJvdHRvbTogZG90dGVkIDFweCAjMTk2MTc3ICFpbXBvcnRhbnQ7IH0KCi50YXAtdG8tY2xvc2UgeyBkaXNwbGF5OiBibG9jazsgZm9udC1zaXplOiAxMHB4OyBmb250LXNpemU6IDFyZW07IGNvbG9yOiAjODg4ODg4OyBmb250LXdlaWdodDogbm9ybWFsOyB9CgovKiBQYW5lbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoucGFuZWwgeyBiYWNrZ3JvdW5kOiAjZjJmMmYyOyBib3JkZXI6IHNvbGlkIDFweCAjZTZlNmU2OyBtYXJnaW46IDAgMCAyMnB4IDA7IHBhZGRpbmc6IDIwcHg7IH0KLnBhbmVsID4gOmZpcnN0LWNoaWxkIHsgbWFyZ2luLXRvcDogMDsgfQoucGFuZWwgPiA6bGFzdC1jaGlsZCB7IG1hcmdpbi1ib3R0b206IDA7IH0KLnBhbmVsLmNhbGxvdXQgeyBiYWNrZ3JvdW5kOiAjMmJhNmNiOyBjb2xvcjogI2ZmZjsgYm9yZGVyLWNvbG9yOiAjMjI4NGExOyAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDBweCAxcHggMHB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KTsgLW1vei1ib3gtc2hhZG93OiBpbnNldCAwcHggMXB4IDBweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSk7IGJveC1zaGFkb3c6IGluc2V0IDBweCAxcHggMHB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KTsgfQoucGFuZWwuY2FsbG91dCBhIHsgY29sb3I6ICNmZmY7IH0KLnBhbmVsLmNhbGxvdXQgLmJ1dHRvbiB7IGJhY2tncm91bmQ6IHdoaXRlOyBib3JkZXI6IG5vbmU7IGNvbG9yOiAjMmJhNmNiOyB0ZXh0LXNoYWRvdzogbm9uZTsgfQoucGFuZWwuY2FsbG91dCAuYnV0dG9uOmhvdmVyLCAucGFuZWwuY2FsbG91dCAuYnV0dG9uOmZvY3VzIHsgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpOyB9Ci5wYW5lbC5yYWRpdXMgeyAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDNweDsgLW1vei1ib3JkZXItcmFkaXVzOiAzcHg7IC1tcy1ib3JkZXItcmFkaXVzOiAzcHg7IC1vLWJvcmRlci1yYWRpdXM6IDNweDsgYm9yZGVyLXJhZGl1czogM3B4OyB9CgovKiBBY2NvcmRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwp1bC5hY2NvcmRpb24geyBtYXJnaW46IDAgMCAyMnB4IDA7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTllOWU5OyB9CnVsLmFjY29yZGlvbiA+IGxpIHsgbGlzdC1zdHlsZTogbm9uZTsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyBib3JkZXItdG9wOiAxcHggc29saWQgI2U5ZTllOTsgfQp1bC5hY2NvcmRpb24gPiBsaSA+IGRpdi50aXRsZSB7IGN1cnNvcjogcG9pbnRlcjsgYmFja2dyb3VuZDogI2Y2ZjZmNjsgcGFkZGluZzogMTVweDsgbWFyZ2luOiAwOyBwb3NpdGlvbjogcmVsYXRpdmU7IGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2U5ZTllOTsgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2U5ZTllOTsgLXdlYmtpdC10cmFuc2l0aW9uOiAwLjE1cyBiYWNrZ3JvdW5kIGxpbmVhcjsgLW1vei10cmFuc2l0aW9uOiAwLjE1cyBiYWNrZ3JvdW5kIGxpbmVhcjsgLW8tdHJhbnNpdGlvbjogMC4xNXMgYmFja2dyb3VuZCBsaW5lYXI7IHRyYW5zaXRpb246IDAuMTVzIGJhY2tncm91bmQgbGluZWFyOyB9CnVsLmFjY29yZGlvbiA+IGxpID4gZGl2LnRpdGxlIGgxLCB1bC5hY2NvcmRpb24gPiBsaSA+IGRpdi50aXRsZSBoMiwgdWwuYWNjb3JkaW9uID4gbGkgPiBkaXYudGl0bGUgaDMsIHVsLmFjY29yZGlvbiA+IGxpID4gZGl2LnRpdGxlIGg0LCB1bC5hY2NvcmRpb24gPiBsaSA+IGRpdi50aXRsZSBoNSB7IG1hcmdpbjogMDsgfQp1bC5hY2NvcmRpb24gPiBsaSA+IGRpdi50aXRsZTphZnRlciB7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDA7IGhlaWdodDogMDsgYm9yZGVyOiBzb2xpZCA2cHg7IGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgIzlkOWQ5ZCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDsgcG9zaXRpb246IGFic29sdXRlOyByaWdodDogMTVweDsgdG9wOiAyMXB4OyB9CnVsLmFjY29yZGlvbiA+IGxpIC5jb250ZW50IHsgZGlzcGxheTogbm9uZTsgcGFkZGluZzogMTVweDsgfQp1bC5hY2NvcmRpb24gPiBsaS5hY3RpdmUgeyBib3JkZXItdG9wOiAzcHggc29saWQgIzJiYTZjYjsgfQp1bC5hY2NvcmRpb24gPiBsaS5hY3RpdmUgLnRpdGxlIHsgYmFja2dyb3VuZDogd2hpdGU7IHBhZGRpbmctdG9wOiAxM3B4OyB9CnVsLmFjY29yZGlvbiA+IGxpLmFjdGl2ZSAudGl0bGU6YWZ0ZXIgeyBjb250ZW50OiAiIjsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAwOyBoZWlnaHQ6IDA7IGJvcmRlcjogc29saWQgNnB4OyBib3JkZXItY29sb3I6ICM5ZDlkOWQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7IH0KdWwuYWNjb3JkaW9uID4gbGkuYWN0aXZlIC5jb250ZW50IHsgYmFja2dyb3VuZDogd2hpdGU7IGRpc3BsYXk6IGJsb2NrOyBib3JkZXItbGVmdDogMXB4IHNvbGlkICNlOWU5ZTk7IGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNlOWU5ZTk7IH0KCi8qIFNpZGUgTmF2IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KdWwuc2lkZS1uYXYgeyBkaXNwbGF5OiBibG9jazsgbGlzdC1zdHlsZTogbm9uZTsgbWFyZ2luOiAwOyBwYWRkaW5nOiAxN3B4IDA7IH0KdWwuc2lkZS1uYXYgbGkgeyBkaXNwbGF5OiBibG9jazsgbGlzdC1zdHlsZTogbm9uZTsgbWFyZ2luOiAwIDAgN3B4IDA7IH0KdWwuc2lkZS1uYXYgbGkgYSB7IGRpc3BsYXk6IGJsb2NrOyB9CnVsLnNpZGUtbmF2IGxpLmFjdGl2ZSBhIHsgY29sb3I6ICM0ZDRkNGQ7IGZvbnQtd2VpZ2h0OiBib2xkOyB9CnVsLnNpZGUtbmF2IGxpLmRpdmlkZXIgeyBib3JkZXItdG9wOiAxcHggc29saWQgI2U2ZTZlNjsgaGVpZ2h0OiAwOyBwYWRkaW5nOiAwOyB9CgovKiBTdWIgTmF2cyBodHRwOi8vd3d3Lnp1cmIuY29tL2FydGljbGUvMjkyL2hvdy10by1jcmVhdGUtc2ltcGxlLWFuZC1lZmZlY3RpdmUtc3ViLW5hIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGwuc3ViLW5hdiB7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogYXV0bzsgb3ZlcmZsb3c6IGhpZGRlbjsgbWFyZ2luOiAtNHB4IDAgMThweDsgbWFyZ2luLXJpZ2h0OiAwOyBtYXJnaW4tbGVmdDogLTlweDsgcGFkZGluZy10b3A6IDRweDsgfQpkbC5zdWItbmF2IGR0LCBkbC5zdWItbmF2IGRkIHsgZmxvYXQ6IGxlZnQ7IGRpc3BsYXk6IGlubGluZTsgbWFyZ2luLWxlZnQ6IDlweDsgbWFyZ2luLWJvdHRvbTogMTBweDsgfQpkbC5zdWItbmF2IGR0IHsgY29sb3I6ICM5OTk7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0KZGwuc3ViLW5hdiBkZCBhIHsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDEwMDBweDsgLW1vei1ib3JkZXItcmFkaXVzOiAxMDAwcHg7IC1tcy1ib3JkZXItcmFkaXVzOiAxMDAwcHg7IC1vLWJvcmRlci1yYWRpdXM6IDEwMDBweDsgYm9yZGVyLXJhZGl1czogMTAwMHB4OyB9CmRsLnN1Yi1uYXYgZGQuYWN0aXZlIGEgeyBmb250LXdlaWdodDogYm9sZDsgYmFja2dyb3VuZDogIzJiYTZjYjsgY29sb3I6ICNmZmY7IHBhZGRpbmc6IDNweCA5cHg7IGN1cnNvcjogZGVmYXVsdDsgfQoKLyogUGFnaW5hdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCnVsLnBhZ2luYXRpb24geyBkaXNwbGF5OiBibG9jazsgaGVpZ2h0OiAyNHB4OyBtYXJnaW4tbGVmdDogLTVweDsgfQp1bC5wYWdpbmF0aW9uIGxpIHsgZmxvYXQ6IGxlZnQ7IGRpc3BsYXk6IGJsb2NrOyBoZWlnaHQ6IDI0cHg7IGNvbG9yOiAjOTk5OyBmb250LXNpemU6IDE0cHg7IG1hcmdpbi1sZWZ0OiA1cHg7IH0KdWwucGFnaW5hdGlvbiBsaSBhIHsgZGlzcGxheTogYmxvY2s7IHBhZGRpbmc6IDFweCA3cHggMXB4OyBjb2xvcjogIzU1NTsgfQp1bC5wYWdpbmF0aW9uIGxpOmhvdmVyIGEsIHVsLnBhZ2luYXRpb24gbGkgYTpmb2N1cyB7IGJhY2tncm91bmQ6ICNlNmU2ZTY7IH0KdWwucGFnaW5hdGlvbiBsaS51bmF2YWlsYWJsZSBhIHsgY3Vyc29yOiBkZWZhdWx0OyBjb2xvcjogIzk5OTsgfQp1bC5wYWdpbmF0aW9uIGxpLnVuYXZhaWxhYmxlOmhvdmVyIGEsIHVsLnBhZ2luYXRpb24gbGkudW5hdmFpbGFibGUgYTpmb2N1cyB7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyB9CnVsLnBhZ2luYXRpb24gbGkuY3VycmVudCBhIHsgYmFja2dyb3VuZDogIzJiYTZjYjsgY29sb3I6IHdoaXRlOyBmb250LXdlaWdodDogYm9sZDsgY3Vyc29yOiBkZWZhdWx0OyB9CnVsLnBhZ2luYXRpb24gbGkuY3VycmVudCBhOmhvdmVyLCB1bC5wYWdpbmF0aW9uIGxpLmN1cnJlbnQgYTpmb2N1cyB7IGJhY2tncm91bmQ6ICMyYmE2Y2I7IH0KCmRpdi5wYWdpbmF0aW9uLWNlbnRlcmVkIHsgdGV4dC1hbGlnbjogY2VudGVyOyB9CmRpdi5wYWdpbmF0aW9uLWNlbnRlcmVkIHVsID4gbGkgeyBmbG9hdDogbm9uZTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyB9CgovKiBCcmVhZGNydW1zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KdWwuYnJlYWRjcnVtYnMgeyBkaXNwbGF5OiBibG9jazsgYmFja2dyb3VuZDogI2Y2ZjZmNjsgcGFkZGluZzogNnB4IDEwcHggN3B4OyBib3JkZXI6IDFweCBzb2xpZCAjZTllOWU5OyAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDJweDsgLW1vei1ib3JkZXItcmFkaXVzOiAycHg7IC1tcy1ib3JkZXItcmFkaXVzOiAycHg7IC1vLWJvcmRlci1yYWRpdXM6IDJweDsgYm9yZGVyLXJhZGl1czogMnB4OyBvdmVyZmxvdzogaGlkZGVuOyBtYXJnaW4tbGVmdDogMDsgfQp1bC5icmVhZGNydW1icyBsaSB7IG1hcmdpbjogMDsgcGFkZGluZzogMCAxMnB4IDAgMDsgZmxvYXQ6IGxlZnQ7IGxpc3Qtc3R5bGU6IG5vbmU7IH0KdWwuYnJlYWRjcnVtYnMgbGkgYSwgdWwuYnJlYWRjcnVtYnMgbGkgc3BhbiB7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGZvbnQtc2l6ZTogMTFweDsgZm9udC1zaXplOiAxLjFyZW07IHBhZGRpbmctbGVmdDogMTJweDsgfQp1bC5icmVhZGNydW1icyBsaTpmaXJzdC1jaGlsZCBhLCB1bC5icmVhZGNydW1icyBsaTpmaXJzdC1jaGlsZCBzcGFuIHsgcGFkZGluZy1sZWZ0OiAwOyB9CnVsLmJyZWFkY3J1bWJzIGxpOmJlZm9yZSB7IGNvbnRlbnQ6ICIvIjsgY29sb3I6ICNhYWE7IH0KdWwuYnJlYWRjcnVtYnMgbGk6Zmlyc3QtY2hpbGQ6YmVmb3JlIHsgY29udGVudDogIiAiOyB9CnVsLmJyZWFkY3J1bWJzIGxpLmN1cnJlbnQgYSB7IGN1cnNvcjogZGVmYXVsdDsgY29sb3I6ICMzMzM7IH0KdWwuYnJlYWRjcnVtYnMgbGk6aG92ZXIgYSwgdWwuYnJlYWRjcnVtYnMgbGkgYTpmb2N1cyB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9CnVsLmJyZWFkY3J1bWJzIGxpLmN1cnJlbnQ6aG92ZXIgYSwgdWwuYnJlYWRjcnVtYnMgbGkuY3VycmVudCBhOmZvY3VzIHsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyB9CnVsLmJyZWFkY3J1bWJzIGxpLnVuYXZhaWxhYmxlIGEgeyBjb2xvcjogIzk5OTsgfQp1bC5icmVhZGNydW1icyBsaS51bmF2YWlsYWJsZTpob3ZlciBhLCB1bC5icmVhZGNydW1icyBsaS51bmF2YWlsYWJsZSBhOmZvY3VzIHsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBjb2xvcjogIzk5OTsgY3Vyc29yOiBkZWZhdWx0OyB9CgovKiBJbmxpbmUgTGluayBMaXN0ICovCnVsLmlubGluZS1saXN0LCB1bC5saW5rLWxpc3QgeyBtYXJnaW46IDAgMCAxN3B4IC0yMnB4OyBwYWRkaW5nOiAwOyBsaXN0LXN0eWxlOiBub25lOyBvdmVyZmxvdzogaGlkZGVuOyB9CnVsLmlubGluZS1saXN0ID4gbGksIHVsLmxpbmstbGlzdCA+IGxpIHsgbGlzdC1zdHlsZTogbm9uZTsgZmxvYXQ6IGxlZnQ7IG1hcmdpbi1sZWZ0OiAyMnB4OyBkaXNwbGF5OiBibG9jazsgfQp1bC5pbmxpbmUtbGlzdCA+IGxpID4gKiwgdWwubGluay1saXN0ID4gbGkgPiAqIHsgZGlzcGxheTogYmxvY2s7IH0KCi8qIEtleXRyb2tlIENoYXJhY3RlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoua2V5c3Ryb2tlLCBrYmQgeyBmb250LWZhbWlseTogIkNvbnNvbGFzIiwgIk1lbmxvIiwgIkNvdXJpZXIiLCBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMTNweDsgcGFkZGluZzogMnB4IDRweCAwcHg7IG1hcmdpbjogMDsgYmFja2dyb3VuZDogI2VkZWRlZDsgYm9yZGVyOiBzb2xpZCAxcHggI2RiZGJkYjsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAzcHg7IC1tb3otYm9yZGVyLXJhZGl1czogM3B4OyAtbXMtYm9yZGVyLXJhZGl1czogM3B4OyAtby1ib3JkZXItcmFkaXVzOiAzcHg7IGJvcmRlci1yYWRpdXM6IDNweDsgfQoKLyogSW1hZ2UgVGh1bWJuYWlscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi50aCB7IGRpc3BsYXk6IGJsb2NrOyB9Ci50aCBpbWcgeyBkaXNwbGF5OiBibG9jazsgYm9yZGVyOiBzb2xpZCA0cHggI2ZmZjsgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgwLCAwLCAwLCAwLjIpOyAtbW96LWJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDAsIDAsIDAsIDAuMik7IGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDAsIDAsIDAsIDAuMik7IC13ZWJraXQtYm9yZGVyLXJhZGl1czogM3B4OyAtbW96LWJvcmRlci1yYWRpdXM6IDNweDsgLW1zLWJvcmRlci1yYWRpdXM6IDNweDsgLW8tYm9yZGVyLXJhZGl1czogM3B4OyBib3JkZXItcmFkaXVzOiAzcHg7IC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogYm94LXNoYWRvdzsgLW1vei10cmFuc2l0aW9uLXByb3BlcnR5OiBib3gtc2hhZG93OyAtby10cmFuc2l0aW9uLXByb3BlcnR5OiBib3gtc2hhZG93OyB0cmFuc2l0aW9uLXByb3BlcnR5OiBib3gtc2hhZG93OyAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDMwMG1zOyAtbW96LXRyYW5zaXRpb24tZHVyYXRpb246IDMwMG1zOyAtby10cmFuc2l0aW9uLWR1cmF0aW9uOiAzMDBtczsgdHJhbnNpdGlvbi1kdXJhdGlvbjogMzAwbXM7IH0KLnRoOmhvdmVyIGltZywgLnRoOmZvY3VzIGltZyB7IC13ZWJraXQtYm94LXNoYWRvdzogMCAwIDZweCAxcHggcmdiYSg0MywgMTY2LCAyMDMsIDAuNSk7IC1tb3otYm94LXNoYWRvdzogMCAwIDZweCAxcHggcmdiYSg0MywgMTY2LCAyMDMsIDAuNSk7IGJveC1zaGFkb3c6IDAgMCA2cHggMXB4IHJnYmEoNDMsIDE2NiwgMjAzLCAwLjUpOyB9CgovKiBWaWRlbyAtIE1hZCBwcm9wcyB0byBodHRwOi8vd3d3LmFsaXN0YXBhcnQuY29tL2FydGljbGVzL2NyZWF0aW5nLWludHJpbnNpYy1yYXRpb3MtZm9yLXZpZGVvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5mbGV4LXZpZGVvIHsgcG9zaXRpb246IHJlbGF0aXZlOyBwYWRkaW5nLXRvcDogMjVweDsgcGFkZGluZy1ib3R0b206IDY3LjUlOyBoZWlnaHQ6IDA7IG1hcmdpbi1ib3R0b206IDE2cHg7IG92ZXJmbG93OiBoaWRkZW47IH0KLmZsZXgtdmlkZW8ud2lkZXNjcmVlbiB7IHBhZGRpbmctYm90dG9tOiA1Ny4yNSU7IH0KLmZsZXgtdmlkZW8udmltZW8geyBwYWRkaW5nLXRvcDogMDsgfQouZmxleC12aWRlbyBpZnJhbWUsIC5mbGV4LXZpZGVvIG9iamVjdCwgLmZsZXgtdmlkZW8gZW1iZWQsIC5mbGV4LXZpZGVvIHZpZGVvIHsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDA7IGxlZnQ6IDA7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IH0KCi8qIFRhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCnRhYmxlIHsgYmFja2dyb3VuZDogI2ZmZjsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAzcHg7IC1tb3otYm9yZGVyLXJhZGl1czogM3B4OyAtbXMtYm9yZGVyLXJhZGl1czogM3B4OyAtby1ib3JkZXItcmFkaXVzOiAzcHg7IGJvcmRlci1yYWRpdXM6IDNweDsgbWFyZ2luOiAwIDAgMThweDsgYm9yZGVyOiAxcHggc29saWQgI2RkZDsgfQoKdGFibGUgdGhlYWQsIHRhYmxlIHRmb290IHsgYmFja2dyb3VuZDogI2Y1ZjVmNTsgfQoKdGFibGUgdGhlYWQgdHIgdGgsIHRhYmxlIHRmb290IHRyIHRoLCB0YWJsZSB0Ym9keSB0ciB0ZCwgdGFibGUgdHIgdGQsIHRhYmxlIHRmb290IHRyIHRkIHsgZGlzcGxheTogdGFibGUtY2VsbDsgZm9udC1zaXplOiAxNHB4OyBsaW5lLWhlaWdodDogMThweDsgdGV4dC1hbGlnbjogbGVmdDsgfQoKdGFibGUgdGhlYWQgdHIgdGgsIHRhYmxlIHRmb290IHRyIHRkIHsgcGFkZGluZzogOHB4IDEwcHggOXB4OyBmb250LXNpemU6IDE0cHg7IGZvbnQtd2VpZ2h0OiBib2xkOyBjb2xvcjogIzIyMjsgfQoKdGFibGUgdGhlYWQgdHIgdGg6Zmlyc3QtY2hpbGQsIHRhYmxlIHRmb290IHRyIHRkOmZpcnN0LWNoaWxkIHsgYm9yZGVyLWxlZnQ6IG5vbmU7IH0KCnRhYmxlIHRoZWFkIHRyIHRoOmxhc3QtY2hpbGQsIHRhYmxlIHRmb290IHRyIHRkOmxhc3QtY2hpbGQgeyBib3JkZXItcmlnaHQ6IG5vbmU7IH0KCnRhYmxlIHRib2R5IHRyLmV2ZW4sIHRhYmxlIHRib2R5IHRyLmFsdCB7IGJhY2tncm91bmQ6ICNmOWY5Zjk7IH0KCnRhYmxlIHRib2R5IHRyOm50aC1jaGlsZChldmVuKSB7IGJhY2tncm91bmQ6ICNmOWY5Zjk7IH0KCnRhYmxlIHRib2R5IHRyIHRkIHsgY29sb3I6ICMzMzM7IHBhZGRpbmc6IDlweCAxMHB4OyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyBib3JkZXI6IG5vbmU7IH0KCi8qIE1pY3JvZm9ybWF0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCnVsLnZjYXJkIHsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBtYXJnaW46IDAgMCAxMnB4IDA7IGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7IHBhZGRpbmc6IDEwcHg7IH0KdWwudmNhcmQgbGkgeyBtYXJnaW46IDA7IGRpc3BsYXk6IGJsb2NrOyB9CnVsLnZjYXJkIGxpLmZuIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtc2l6ZTogMTVweDsgfQoKcC52ZXZlbnQgc3Bhbi5zdW1tYXJ5IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KcC52ZXZlbnQgYWJiciB7IGN1cnNvcjogZGVmYXVsdDsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBmb250LXdlaWdodDogYm9sZDsgYm9yZGVyOiBub25lOyBwYWRkaW5nOiAwIDFweDsgfQoKLyogUHJvZ3Jlc3MgQmFyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGl2LnByb2dyZXNzIHsgcGFkZGluZzogMnB4OyBtYXJnaW4tYm90dG9tOiAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCAjY2NjY2NjOyBoZWlnaHQ6IDI1cHg7IC8qIG1ldGVyICovIC8qIGJvcmRlciByYWRpaSAqLyB9CmRpdi5wcm9ncmVzcyAubWV0ZXIgeyBiYWNrZ3JvdW5kOiAjMmJhNmNiOyBoZWlnaHQ6IDEwMCU7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogNTAlOyB9CmRpdi5wcm9ncmVzcy5zZWNvbmRhcnkgLm1ldGVyIHsgYmFja2dyb3VuZDogI2U5ZTllOTsgfQpkaXYucHJvZ3Jlc3Muc3VjY2VzcyAubWV0ZXIgeyBiYWNrZ3JvdW5kOiAjNWRhNDIzOyB9CmRpdi5wcm9ncmVzcy5hbGVydCAubWV0ZXIgeyBiYWNrZ3JvdW5kOiAjYzYwZjEzOyB9CmRpdi5wcm9ncmVzcy5yYWRpdXMgeyAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDNweDsgLW1vei1ib3JkZXItcmFkaXVzOiAzcHg7IC1tcy1ib3JkZXItcmFkaXVzOiAzcHg7IC1vLWJvcmRlci1yYWRpdXM6IDNweDsgYm9yZGVyLXJhZGl1czogM3B4OyB9CmRpdi5wcm9ncmVzcy5yYWRpdXMgLm1ldGVyIHsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAycHg7IC1tb3otYm9yZGVyLXJhZGl1czogMnB4OyAtbXMtYm9yZGVyLXJhZGl1czogMnB4OyAtby1ib3JkZXItcmFkaXVzOiAycHg7IGJvcmRlci1yYWRpdXM6IDJweDsgfQpkaXYucHJvZ3Jlc3Mucm91bmQgeyAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDEwMDBweDsgLW1vei1ib3JkZXItcmFkaXVzOiAxMDAwcHg7IC1tcy1ib3JkZXItcmFkaXVzOiAxMDAwcHg7IC1vLWJvcmRlci1yYWRpdXM6IDEwMDBweDsgYm9yZGVyLXJhZGl1czogMTAwMHB4OyB9CmRpdi5wcm9ncmVzcy5yb3VuZCAubWV0ZXIgeyAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDEwMDBweDsgLW1vei1ib3JkZXItcmFkaXVzOiAxMDAwcHg7IC1tcy1ib3JkZXItcmFkaXVzOiAxMDAwcHg7IC1vLWJvcmRlci1yYWRpdXM6IDEwMDBweDsgYm9yZGVyLXJhZGl1czogMTAwMHB4OyB9CgovKiBQcmljaW5nIFRhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5wcmljaW5nLXRhYmxlIHsgYm9yZGVyOiBzb2xpZCAxcHggI2RkZGRkZDsgbWFyZ2luLWxlZnQ6IDA7IG1hcmdpbi1ib3R0b206IDIwcHg7IH0KLnByaWNpbmctdGFibGUgKiB7IGxpc3Qtc3R5bGU6IG5vbmU7IGxpbmUtaGVpZ2h0OiAxOyB9Ci5wcmljaW5nLXRhYmxlIC50aXRsZSB7IGJhY2tncm91bmQtY29sb3I6ICNkZGRkZGQ7IHBhZGRpbmc6IDE1cHggMjBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogIzMzMzMzMzsgZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtc2l6ZTogMTZweDsgfQoucHJpY2luZy10YWJsZSAucHJpY2UgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWVlOyBwYWRkaW5nOiAxNXB4IDIwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6ICMzMzMzMzM7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IGZvbnQtc2l6ZTogMjBweDsgfQoucHJpY2luZy10YWJsZSAuZGVzY3JpcHRpb24geyBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgcGFkZGluZzogMTVweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogIzc3Nzc3NzsgZm9udC1zaXplOiAxMnB4OyBmb250LXdlaWdodDogbm9ybWFsOyBsaW5lLWhlaWdodDogMS40OyBib3JkZXItYm90dG9tOiBkb3R0ZWQgMXB4ICNkZGRkZGQ7IH0KLnByaWNpbmctdGFibGUgLmJ1bGxldC1pdGVtIHsgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IHBhZGRpbmc6IDE1cHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6ICMzMzMzMzM7IGZvbnQtc2l6ZTogMTRweDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgYm9yZGVyLWJvdHRvbTogZG90dGVkIDFweCAjZGRkZGRkOyB9Ci5wcmljaW5nLXRhYmxlIC5jdGEtYnV0dG9uIHsgYmFja2dyb3VuZC1jb2xvcjogd2hpdGVzbW9rZTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAyMHB4OyB9CgovKiBGb3VuZGF0aW9uIFRvcCBCYXIKIFJlcXVpcmVzOiAtanF1ZXJ5LmZvdW5kYXRpb24udG9wYmFyLmpzCiBOb3RlczogLSA8bmF2IGNsYXNzPSJ0b3AtYmFyIj4gY2FuIGhhdmUgLmZpeGVkIGFkZGVkIHRvIG1ha2UgaXQgc3RpY2sgdG8gdGhlIHRvcCBvZiB2aWV3cG9ydC4gQ2FuIGFkZCAuY29udGFpbi10by1ncmlkIHRvIHRvcC1iYXIgdG8gbWFrZSBpdCBmdWxsIHdpZHRoIGJ1dCBjb250ZW50IG9uIGdyaWQuIC0gPGxpIGNsYXNzPSJuYW1lIj4gY3JlYXRlcyBhIGJyYW5kaW5nIGFyZWEgdGhhdCBjYW4gYmUgbGlua2VkIHRvIGhvbWVwYWdlIC0gQ2FuIGluY2x1ZGUgdGV4dCwgaW1hZ2Ugb3IgYm90aCBpbnNpZGUgdGhpcyA8bGk+LiAtIDxsaSBjbGFzcz0iZGl2aWRlciI+IGNyZWF0ZXMgYSBkaXZpZGVyIGJldHdlZW4gbmF2IGl0ZW1zLCBhZGQgbWFyZ2lucyBmb3Igc3BhY2UgLSA8bGkgY2xhc3M9InNlYXJjaCI+IE5lZWRzIHRvIGhvbGQgYSA8Zm9ybT4gd2hpY2ggY2FuIHVzZSAucm93LmNvbGxhcHNlIGFuZCBwcmUvcG9zdGZpeCBidXR0b25zIG9yIGRlZmF1bHQgdHlwZT0ic2VhcmNoIgoqLwovKiBFbGVtZW50IHRoYXQgY29udHJvbHMgYnJlYWtwb2ludCwgbm8gbmVlZCB0byBjaGFuZ2UgdGhpcyBldmVyICovCi50b3AtYmFyLWpzLWJyZWFrcG9pbnQgeyB3aWR0aDogOTQwcHggIWltcG9ydGFudDsgdmlzaWJpbGl0eTogaGlkZGVuOyB9CgovKiBXcmFwcGVkIGFyb3VuZCAudG9wLWJhciB0byBjb250YWluIHRvIGdyaWQgd2lkdGggKi8KLmNvbnRhaW4tdG8tZ3JpZCB7IHdpZHRoOiAxMDAlOyBiYWNrZ3JvdW5kOiAjMjIyMjIyOyB9CgovKiBXcmFwcGVkIGFyb3VuZCAudG9wLWJhciB0byBtYWtlIGl0IGZpeGVkIGF0IHRoZSB0b3AgKi8KLmZpeGVkIHsgd2lkdGg6IDEwMCU7IGxlZnQ6IDA7IHBvc2l0aW9uOiBmaXhlZDsgdG9wOiAwOyB6LWluZGV4OiA5OTsgfQoKLyogQWRkIC5zdGlja3kgY2xhc3MgZm9yIHVzaW5nIHRvcCBiYXIgYXMgYSBzdGlja3kgbmF2aWdhdGlvbiB3aGVuIHNjcm9sbGluZyBwYXNzZWQgaXQuIEFkZCB0aGUgY2xhc3MgLnN0aWNreSB0byBhIHRvcCBiYXIgdXNpbmcgLmNvbnRhaW4tdG8tZ3JpZCBidXQgbGVhdmUgb2ZmIC5maXhlZCwgamF2YXNjcmlwdCB3aWxsIHRha2UgY2FyZSBvZiB0aGF0ICovCi5zdGlja3kgeyBmbG9hdDogbGVmdDsgb3ZlcmZsb3c6IGhpZGRlbjsgfQouc3RpY2t5LmZpeGVkIHsgZmxvYXQ6IG5vbmU7IH0KCi8qIDxuYXY+ICovCi50b3AtYmFyIHsgYmFja2dyb3VuZDogIzIyMjIyMjsgbWluLWhlaWdodDogNDVweDsgbGluZS1oZWlnaHQ6IDQ1cHg7IG1hcmdpbjogMCAwIDMwcHggMDsgcGFkZGluZzogMDsgd2lkdGg6IDEwMCU7IHBvc2l0aW9uOiByZWxhdGl2ZTsgLyogQ29udGFpbiB3aWR0aCB0byAucm93IHdpZHRoICovIC8qIEZpcnN0IDx1bD4gZm9yIGJyYW5kaW5nLCB0aXRsZSwgbmFtZSwgZXRjICovIC8qIHRvcGJhciBnbG9iYWwgPHVsPiBzdHlsZXMgKi8gfQouY29udGFpbi10by1ncmlkIC50b3AtYmFyIHsgbWF4LXdpZHRoOiA5NDBweDsgbWFyZ2luOiAwIGF1dG87IH0KLnRvcC1iYXIgPiB1bCAubmFtZSBoMSB7IGxpbmUtaGVpZ2h0OiA0NXB4OyBtYXJnaW46IDA7IH0KLnRvcC1iYXIgPiB1bCAubmFtZSBoMSBhIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IHBhZGRpbmc6IDAgMjIuNXB4OyBmb250LXNpemU6IDE3cHggIWltcG9ydGFudDsgfQoudG9wLWJhciA+IHVsIC5uYW1lIGltZyB7IG1hcmdpbi10b3A6IC01cHg7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IH0KLnRvcC1iYXIuZXhwYW5kZWQgeyBoZWlnaHQ6IGluaGVyaXQ7IH0KLnRvcC1iYXIgdWwgeyBtYXJnaW4tbGVmdDogMDsgZGlzcGxheTogaW5saW5lOyBoZWlnaHQ6IDQ1cHg7IGxpbmUtaGVpZ2h0OiA0NXB4OyBsaXN0LXN0eWxlOiBub25lOyAvKiBNYWluIE5hdmlnYXRpb24gbGlua3Mgc3R5bGUgKi8gLyogTGVmdCBTaWRlIDx1bD4gKi8gLyogUmlnaHQgU2lkZSA8dWw+ICovIH0KLnRvcC1iYXIgdWwgPiBsaSB7IGZsb2F0OiBsZWZ0OyAvKiBEaXZpZGVycyBiZXR3ZWVuIG5hdmlnYXRpb24gKi8gLyogUHV0IGEgYnV0dG9uIGluIGFuIDxsaT4gYnV0IGdpdmUgaXMgYSBjbGFzcyAqLyAvKiBQdXQgYSBzZWFyY2ggYmFyIG9yIHRleHQgaW5wdXQgaW4gdGhlIGJhciAqLyAvKiBQdXQgbG9naW4gYmFyIGluIHRoZSB0b3AgYmFyICovIC8qIEhpZGUgdGhlIHRyaWFuZ2xlIGZvciBicmVha3BvaW50IG1lbnUgKi8gLyogbGkuaGFzLWRyb3Bkb3duICovIH0KLnRvcC1iYXIgdWwgPiBsaSBhOm5vdCguYnV0dG9uKSB7IGNvbG9yOiB3aGl0ZTsgZGlzcGxheTogYmxvY2s7IGZvbnQtc2l6ZTogMTNweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGhlaWdodDogNDVweDsgbGluZS1oZWlnaHQ6IDQ1cHg7IHBhZGRpbmc6IDAgMTVweDsgfQoudG9wLWJhciB1bCA+IGxpOm5vdCgubmFtZSk6aG92ZXIsIC50b3AtYmFyIHVsID4gbGk6bm90KC5uYW1lKS5hY3RpdmUsIC50b3AtYmFyIHVsID4gbGk6bm90KC5uYW1lKTpmb2N1cyB7IGJhY2tncm91bmQ6IGJsYWNrOyB9Ci50b3AtYmFyIHVsID4gbGk6bm90KC5uYW1lKTpob3ZlciBhLCAudG9wLWJhciB1bCA+IGxpOm5vdCgubmFtZSkuYWN0aXZlIGEsIC50b3AtYmFyIHVsID4gbGk6bm90KC5uYW1lKTpmb2N1cyBhIHsgY29sb3I6ICNkOWQ5ZDk7IH0KLnRvcC1iYXIgdWwgPiBsaS5kaXZpZGVyIHsgYmFja2dyb3VuZDogYmxhY2s7IC13ZWJraXQtYm94LXNoYWRvdzogMXB4IDAgMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7IC1tb3otYm94LXNoYWRvdzogMXB4IDAgMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7IGJveC1zaGFkb3c6IDFweCAwIDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOyBoZWlnaHQ6IDEwMCU7IG1hcmdpbi1yaWdodDogMXB4OyB3aWR0aDogMXB4OyB9Ci50b3AtYmFyIHVsID4gbGkuaGFzLWJ1dHRvbiBhLmJ1dHRvbiB7IG1hcmdpbjogMCAxMS4yNXB4OyB9Ci50b3AtYmFyIHVsID4gbGkuaGFzLWJ1dHRvbjpob3ZlciwgLnRvcC1iYXIgdWwgPiBsaS5oYXMtYnV0dG9uOmZvY3VzIHsgYmFja2dyb3VuZDogIzIyMjIyMjsgfQoudG9wLWJhciB1bCA+IGxpLmhhcy1idXR0b246aG92ZXIgYSwgLnRvcC1iYXIgdWwgPiBsaS5oYXMtYnV0dG9uOmZvY3VzIGEgeyBjb2xvcjogI2ZmZjsgfQoudG9wLWJhciB1bCA+IGxpLnNlYXJjaCB7IHBhZGRpbmc6IDAgMTVweDsgfQoudG9wLWJhciB1bCA+IGxpLnNlYXJjaCBmb3JtIHsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBtYXJnaW4tYm90dG9tOiAwOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyB3aWR0aDogMjAwcHg7IH0KLnRvcC1iYXIgdWwgPiBsaS5zZWFyY2ggZm9ybSBpbnB1dFt0eXBlPXRleHRdIHsgLW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0OiAwOyAtd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwOyBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDsgLW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbXJpZ2h0OiAwOyAtd2Via2l0LWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwOyBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMDsgZmxvYXQ6IGxlZnQ7IGZvbnQtc2l6ZTogMTNweDsgbWFyZ2luLXRvcDogLTFweDsgaGVpZ2h0OiAyMi41cHg7IG1hcmdpbi1ib3R0b206IDA7IHdpZHRoOiAxMzBweDsgfQoudG9wLWJhciB1bCA+IGxpLnNlYXJjaCBmb3JtIGlucHV0W3R5cGU9dGV4dF0gKyAuYnV0dG9uIHsgYm9yZGVyLWxlZnQ6IG5vbmU7IC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0OiAwOyAtd2Via2l0LWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7IGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7IC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OiAwOyAtd2Via2l0LWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7IGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7IGZsb2F0OiBsZWZ0OyBmb250LXNpemU6IDEycHg7IG1hcmdpbi10b3A6IC0xcHg7IHBhZGRpbmc6IDVweCAxMnB4IDRweDsgfQoudG9wLWJhciB1bCA+IGxpLnNlYXJjaCBmb3JtIGlucHV0W3R5cGU9c2VhcmNoXSB7IGZvbnQtc2l6ZTogMTZweDsgbWFyZ2luLWJvdHRvbTogMDsgfQoudG9wLWJhciB1bCA+IGxpLnNlYXJjaDpob3ZlciwgLnRvcC1iYXIgdWwgPiBsaS5zZWFyY2g6Zm9jdXMgeyBiYWNrZ3JvdW5kOiAjMjIyMjIyOyB9Ci50b3AtYmFyIHVsID4gbGkubG9naW4geyBwYWRkaW5nOiAwIDE1cHg7IH0KLnRvcC1iYXIgdWwgPiBsaS5sb2dpbiBmb3JtIHsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBtYXJnaW4tYm90dG9tOiAwOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyB3aWR0aDogMzAwcHg7IH0KLnRvcC1iYXIgdWwgPiBsaS5sb2dpbiBmb3JtIGlucHV0IHsgZmxvYXQ6IGxlZnQ7IHdpZHRoOiBhdXRvOyBmb250LXNpemU6IDEzcHg7IG1hcmdpbi10b3A6IC0xcHg7IGhlaWdodDogMjIuNXB4OyBtYXJnaW4tYm90dG9tOiAwOyB9Ci50b3AtYmFyIHVsID4gbGkubG9naW4gZm9ybSBpbnB1dFt0eXBlPXRleHRdIHsgLW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0OiAwOyAtd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwOyBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDsgLW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbXJpZ2h0OiAwOyAtd2Via2l0LWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwOyBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMDsgd2lkdGg6IDEyMHB4OyB9Ci50b3AtYmFyIHVsID4gbGkubG9naW4gZm9ybSBpbnB1dFt0eXBlPXBhc3N3b3JkXSB7IG1hcmdpbi1ib3R0b206IDA7IC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0OiAwOyAtd2Via2l0LWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7IGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7IC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OiAwOyAtd2Via2l0LWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7IGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7IHdpZHRoOiAxMjBweDsgfQoudG9wLWJhciB1bCA+IGxpLmxvZ2luIGZvcm0gaW5wdXRbdHlwZT1wYXNzd29yZF0gKyAuYnV0dG9uIHsgYm9yZGVyLWxlZnQ6IG5vbmU7IC1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0OiAwOyAtd2Via2l0LWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7IGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDA7IC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OiAwOyAtd2Via2l0LWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7IGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7IC1tb3otYm9yZGVyLXJhZGl1cy10b3ByaWdodDogMnB4OyAtd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAycHg7IGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAycHg7IC1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodDogMnB4OyAtd2Via2l0LWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAycHg7IGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAycHg7IGZsb2F0OiBsZWZ0OyBmb250LXNpemU6IDEycHg7IG1hcmdpbi10b3A6IC0xcHg7IHBhZGRpbmc6IDVweCAxMnB4IDRweDsgd2lkdGg6IDYwcHg7IH0KLnRvcC1iYXIgdWwgPiBsaS5sb2dpbjpob3ZlciwgLnRvcC1iYXIgdWwgPiBsaS5sb2dpbjpmb2N1cyB7IGJhY2tncm91bmQ6ICMyMjIyMjI7IH0KLnRvcC1iYXIgdWwgPiBsaS50b2dnbGUtdG9wYmFyIHsgZGlzcGxheTogbm9uZTsgfQoudG9wLWJhciB1bCA+IGxpLmhhcy1kcm9wZG93biB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgLyogRHJvcGRvd24gTGV2ZWwgMisgKi8gfQoudG9wLWJhciB1bCA+IGxpLmhhcy1kcm9wZG93bjpob3ZlciA+IC5kcm9wZG93biwgLnRvcC1iYXIgdWwgPiBsaS5oYXMtZHJvcGRvd246Zm9jdXMgPiAuZHJvcGRvd24geyBkaXNwbGF5OiBibG9jazsgdmlzaWJpbGl0eTogdmlzaWJsZTsgfQoudG9wLWJhciB1bCA+IGxpLmhhcy1kcm9wZG93biBhIHsgcGFkZGluZy1yaWdodDogMzMuNzVweDsgfQoudG9wLWJhciB1bCA+IGxpLmhhcy1kcm9wZG93biBhOmFmdGVyIHsgY29udGVudDogIiI7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMDsgaGVpZ2h0OiAwOyBib3JkZXI6IHNvbGlkIDVweDsgYm9yZGVyLWNvbG9yOiB3aGl0ZSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDsgbWFyZ2luLXJpZ2h0OiAxNXB4OyBtYXJnaW4tdG9wOiAtMi41cHg7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgcmlnaHQ6IDA7IHRvcDogNTAlOyB9Ci50b3AtYmFyIHVsID4gbGkuaGFzLWRyb3Bkb3duIC5kcm9wZG93biB7IGJhY2tncm91bmQ6ICMyMjIyMjI7IGxlZnQ6IDA7IG1hcmdpbjogMDsgcGFkZGluZzogOXB4IDAgMCAwOyBwb3NpdGlvbjogYWJzb2x1dGU7IHZpc2liaWxpdHk6IGhpZGRlbjsgei1pbmRleDogOTk7IH0KLnRvcC1iYXIgdWwgPiBsaS5oYXMtZHJvcGRvd24gLmRyb3Bkb3duIGxpIHsgYmFja2dyb3VuZDogIzIyMjIyMjsgbGluZS1oZWlnaHQ6IDE7IG1pbi13aWR0aDogMTAwJTsgcGFkZGluZy1ib3R0b206IDVweDsgfQoudG9wLWJhciB1bCA+IGxpLmhhcy1kcm9wZG93biAuZHJvcGRvd24gbGkgYSB7IGNvbG9yOiB3aGl0ZTsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgaGVpZ2h0OiAxMDAlOyBsaW5lLWhlaWdodDogMTsgcGFkZGluZzogNXB4IDE3cHggNXB4IDE1cHg7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0KLnRvcC1iYXIgdWwgPiBsaS5oYXMtZHJvcGRvd24gLmRyb3Bkb3duIGxpIGE6YWZ0ZXIgeyBib3JkZXI6IG5vbmU7IH0KLnRvcC1iYXIgdWwgPiBsaS5oYXMtZHJvcGRvd24gLmRyb3Bkb3duIGxpIGE6aG92ZXIsIC50b3AtYmFyIHVsID4gbGkuaGFzLWRyb3Bkb3duIC5kcm9wZG93biBsaSBhOmZvY3VzIHsgYmFja2dyb3VuZDogIzNjM2MzYzsgfQoudG9wLWJhciB1bCA+IGxpLmhhcy1kcm9wZG93biAuZHJvcGRvd24gbGkgbGFiZWwgeyBjb2xvcjogIzZmNmY2ZjsgZm9udC1zaXplOiAxMHB4OyBmb250LXdlaWdodDogYm9sZDsgbWFyZ2luOiAwOyBwYWRkaW5nLWxlZnQ6IDE1cHg7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IH0KLnRvcC1iYXIgdWwgPiBsaS5oYXMtZHJvcGRvd24gLmRyb3Bkb3duIGxpLmRpdmlkZXIgeyBib3JkZXItdG9wOiBzb2xpZCAxcHggYmxhY2s7IC13ZWJraXQtYm94LXNoYWRvdzogMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkgaW5zZXQ7IC1tb3otYm94LXNoYWRvdzogMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkgaW5zZXQ7IGJveC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpIGluc2V0OyBoZWlnaHQ6IDEwcHg7IHBhZGRpbmc6IDA7IHdpZHRoOiAxMDAlOyB9Ci50b3AtYmFyIHVsID4gbGkuaGFzLWRyb3Bkb3duIC5kcm9wZG93biBsaTpsYXN0LWNoaWxkIHsgcGFkZGluZy1ib3R0b206IDEwcHg7IH0KLnRvcC1iYXIgdWwgPiBsaS5oYXMtZHJvcGRvd24gLmRyb3Bkb3duIGxpLmFjdGl2ZSBhIHsgYmFja2dyb3VuZDogYmxhY2s7IH0KLnRvcC1iYXIgdWwgPiBsaS5oYXMtZHJvcGRvd24gLmRyb3Bkb3duIGxpLmhhcy1kcm9wZG93biA+IGEgeyBwYWRkaW5nLXJpZ2h0OiAzMHB4OyB9Ci50b3AtYmFyIHVsID4gbGkuaGFzLWRyb3Bkb3duIC5kcm9wZG93biBsaS5oYXMtZHJvcGRvd24gPiBhOmFmdGVyIHsgYm9yZGVyOiBub25lOyBjb250ZW50OiAiXDAwYmIiOyByaWdodDogNXB4OyB0b3A6IDZweDsgfQoudG9wLWJhciB1bCA+IGxpLmhhcy1kcm9wZG93biAuZHJvcGRvd24gbGkuaGFzLWRyb3Bkb3duIC5kcm9wZG93biB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMTAwJTsgdG9wOiAwOyB9Ci50b3AtYmFyIHVsID4gbGkuaGFzLWRyb3Bkb3duIC5kcm9wZG93biBsaS5oYXMtZHJvcGRvd246aG92ZXIgPiAuZHJvcGRvd24sIC50b3AtYmFyIHVsID4gbGkuaGFzLWRyb3Bkb3duIC5kcm9wZG93biBsaS5oYXMtZHJvcGRvd246Zm9jdXMgPiAuZHJvcGRvd24geyBkaXNwbGF5OiBibG9jazsgfQoudG9wLWJhciB1bC5sZWZ0IHsgZmxvYXQ6IGxlZnQ7IHdpZHRoOiBhdXRvOyBtYXJnaW4tYm90dG9tOiAwOyB9Ci50b3AtYmFyIHVsLnJpZ2h0IHsgZmxvYXQ6IHJpZ2h0OyB3aWR0aDogYXV0bzsgbWFyZ2luLWJvdHRvbTogMDsgLyogRHJvcGRvd24gUmlnaHQgU2lkZSBBbGlnbm1lbnQgKi8gfQoudG9wLWJhciB1bC5yaWdodCAuaGFzLWRyb3Bkb3duIC5kcm9wZG93biB7IGxlZnQ6IGF1dG87IHJpZ2h0OiAwcHg7IH0KLnRvcC1iYXIgdWwucmlnaHQgLmhhcy1kcm9wZG93biAuZHJvcGRvd24gbGkuaGFzLWRyb3Bkb3duID4gLmRyb3Bkb3duIHsgcmlnaHQ6IDEwMCU7IGxlZnQ6IGF1dG87IHdpZHRoOiAxMDAlOyB9Ci50b3AtYmFyIC5qcy1nZW5lcmF0ZWQgeyBkaXNwbGF5OiBub25lOyB9CgovKiBGaXJlZm94IEZpeGVzICovCkAtbW96LWRvY3VtZW50IHVybC1wcmVmaXgoKSB7IC50b3AtYmFyIHVsIGxpIC5idXR0b24uc21hbGwgeyBwYWRkaW5nLWJvdHRvbTogNnB4OyB9CiAgLnRvcC1iYXIgdWwgbGkuc2VhcmNoIGZvcm0gaW5wdXRbdHlwZT1zZWFyY2hdIHsgZm9udC1zaXplOiAxNHB4OyBoZWlnaHQ6IDIycHg7IHBhZGRpbmc6IDNweDsgfSB9CgovKiBJRTggRml4ZXMgKi8KLmx0LWllOSAudG9wLWJhciB1bCBsaSBhIHsgY29sb3I6IHdoaXRlOyBkaXNwbGF5OiBibG9jazsgZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtc2l6ZTogMTNweDsgaGVpZ2h0OiA0NXB4OyBsaW5lLWhlaWdodDogNDVweDsgcGFkZGluZzogMCAxNXB4OyB9Ci5sdC1pZTkgLnRvcC1iYXIgdWwgbGkgYS5idXR0b24geyBoZWlnaHQ6IGF1dG87IGxpbmUtaGVpZ2h0OiAzMHB4OyBtYXJnaW4tdG9wOiA3cHg7IH0KLmx0LWllOSAudG9wLWJhciB1bCBsaSBhIGltZyB7IG1hcmdpbi10b3A6IC01cHg7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IH0KCi5sdC1pZTkgLnRvcC1iYXIgc2VjdGlvbiA+IHVsID4gbGkgYTpob3ZlciwgLmx0LWllOSAudG9wLWJhciBzZWN0aW9uID4gdWwgPiBsaSBhOmZvY3VzIHsgY29sb3I6ICNjY2NjY2M7IH0KLmx0LWllOSAudG9wLWJhciBzZWN0aW9uID4gdWwgPiBsaTpob3ZlciwgLmx0LWllOSAudG9wLWJhciBzZWN0aW9uID4gdWwgPiBsaTpmb2N1cyB7IGJhY2tncm91bmQ6IGJsYWNrOyB9Ci5sdC1pZTkgLnRvcC1iYXIgc2VjdGlvbiA+IHVsID4gbGkuc2VhcmNoOmhvdmVyLCAubHQtaWU5IC50b3AtYmFyIHNlY3Rpb24gPiB1bCA+IGxpLnNlYXJjaDpmb2N1cywgLmx0LWllOSAudG9wLWJhciBzZWN0aW9uID4gdWwgPiBsaS5oYXMtYnV0dG9uOmhvdmVyLCAubHQtaWU5IC50b3AtYmFyIHNlY3Rpb24gPiB1bCA+IGxpLmhhcy1idXR0b246Zm9jdXMgeyBiYWNrZ3JvdW5kOiBub25lOyB9Ci5sdC1pZTkgLnRvcC1iYXIgc2VjdGlvbiA+IHVsID4gbGkuYWN0aXZlIHsgYmFja2dyb3VuZDogYmxhY2s7IGNvbG9yOiAjZDlkOWQ5OyB9CgoubHQtaWU5IC50b3AtYmFyIHVsIGxpLmhhcy1kcm9wZG93biB7IHBhZGRpbmctcmlnaHQ6IDMzLjc1cHg7IH0KLmx0LWllOSAudG9wLWJhciB1bCBsaS5oYXMtZHJvcGRvd24gPiB1bCBsaSB7IHBhZGRpbmctcmlnaHQ6IDA7IH0KCiNqb3lSaWRlVGlwQ29udGVudCB7IGRpc3BsYXk6IG5vbmU7IH0KCi8qIERlZmF1bHQgc3R5bGVzIGZvciB0aGUgY29udGFpbmVyICovCi5qb3lyaWRlLXRpcC1ndWlkZSB7IGRpc3BsYXk6IG5vbmU7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgYmFja2dyb3VuZDogYmxhY2s7IGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC44KTsgY29sb3I6IHdoaXRlOyB3aWR0aDogMzAwcHg7IHotaW5kZXg6IDEwMTsgdG9wOiAwOyBsZWZ0OiAwOyBmb250LWZhbWlseTogaW5oZXJpdDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA0cHg7IC1tb3otYm9yZGVyLXJhZGl1czogNHB4OyAtbXMtYm9yZGVyLXJhZGl1czogNHB4OyAtby1ib3JkZXItcmFkaXVzOiA0cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgfQoKLmpveXJpZGUtY29udGVudC13cmFwcGVyIHsgcGFkZGluZzogMThweCAyMHB4IDI0cHg7IH0KCi8qIEFkZCBhIGxpdHRsZSBjc3MgdHJpYW5nbGUgcGlwLCBvbGRlciBicm93c2VyIGp1c3QgbWlzcyBvdXQgb24gdGhlIGZhbmNpbmVzcyBvZiBpdCAqLwouam95cmlkZS10aXAtZ3VpZGUgc3Bhbi5qb3lyaWRlLW51YiB7IGRpc3BsYXk6IGJsb2NrOyBwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IDIycHg7IHdpZHRoOiAwOyBoZWlnaHQ6IDA7IGJvcmRlcjogc29saWQgMTRweDsgfQouam95cmlkZS10aXAtZ3VpZGUgc3Bhbi5qb3lyaWRlLW51Yi50b3AgeyBib3JkZXItY29sb3I6IGJsYWNrOyBib3JkZXItY29sb3I6IHJnYmEoMCwgMCwgMCwgMC44KTsgYm9yZGVyLXRvcC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsgYm9yZGVyLWxlZnQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7IGJvcmRlci1yaWdodC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsgdG9wOiAtMjhweDsgYm90dG9tOiBub25lOyB9Ci5qb3lyaWRlLXRpcC1ndWlkZSBzcGFuLmpveXJpZGUtbnViLmJvdHRvbSB7IGJvcmRlci1jb2xvcjogYmxhY2s7IGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjgpICFpbXBvcnRhbnQ7IGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7IGJvcmRlci1sZWZ0LWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OyBib3JkZXItcmlnaHQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7IGJvdHRvbTogLTI4cHg7IGJvdHRvbTogbm9uZTsgfQouam95cmlkZS10aXAtZ3VpZGUgc3Bhbi5qb3lyaWRlLW51Yi5yaWdodCB7IGJvcmRlci1jb2xvcjogYmxhY2s7IGJvcmRlci1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjgpICFpbXBvcnRhbnQ7IGJvcmRlci10b3AtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7IGJvcmRlci1yaWdodC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsgYm9yZGVyLWJvdHRvbS1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsgdG9wOiAyMnB4OyBib3R0b206IG5vbmU7IGxlZnQ6IGF1dG87IHJpZ2h0OiAtMjhweDsgfQouam95cmlkZS10aXAtZ3VpZGUgc3Bhbi5qb3lyaWRlLW51Yi5sZWZ0IHsgYm9yZGVyLWNvbG9yOiBibGFjazsgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuOCkgIWltcG9ydGFudDsgYm9yZGVyLXRvcC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsgYm9yZGVyLWxlZnQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7IGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7IHRvcDogMjJweDsgbGVmdDogLTI4cHg7IHJpZ2h0OiBhdXRvOyBib3R0b206IG5vbmU7IH0KCi8qIFR5cG9ncmFwaHkgKi8KLmpveXJpZGUtdGlwLWd1aWRlIGgxLCAuam95cmlkZS10aXAtZ3VpZGUgaDIsIC5qb3lyaWRlLXRpcC1ndWlkZSBoMywgLmpveXJpZGUtdGlwLWd1aWRlIGg0LCAuam95cmlkZS10aXAtZ3VpZGUgaDUsIC5qb3lyaWRlLXRpcC1ndWlkZSBoNiB7IGxpbmUtaGVpZ2h0OiAxLjI1OyBtYXJnaW46IDA7IGZvbnQtd2VpZ2h0OiBib2xkOyBjb2xvcjogd2hpdGU7IH0KCi5qb3lyaWRlLXRpcC1ndWlkZSBwIHsgbWFyZ2luOiAwIDAgMThweCAwOyBmb250LXNpemU6IDE0cHg7IGxpbmUtaGVpZ2h0OiAxLjM7IH0KCi5qb3lyaWRlLXRpbWVyLWluZGljYXRvci13cmFwIHsgd2lkdGg6IDUwcHg7IGhlaWdodDogM3B4OyBib3JkZXI6IHNvbGlkIDFweCAjNTU1NTU1OyBwb3NpdGlvbjogYWJzb2x1dGU7IHJpZ2h0OiAxN3B4OyBib3R0b206IDE2cHg7IH0KCi5qb3lyaWRlLXRpbWVyLWluZGljYXRvciB7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMDsgaGVpZ2h0OiBpbmhlcml0OyBiYWNrZ3JvdW5kOiAjNjY2NjY2OyB9Cgouam95cmlkZS1jbG9zZS10aXAgeyBwb3NpdGlvbjogYWJzb2x1dGU7IHJpZ2h0OiAxMHB4OyB0b3A6IDEwcHg7IGNvbG9yOiAjNzc3Nzc3ICFpbXBvcnRhbnQ7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC1zaXplOiAyMHB4OyBmb250LXdlaWdodDogbm9ybWFsOyBsaW5lLWhlaWdodDogLjUgIWltcG9ydGFudDsgfQouam95cmlkZS1jbG9zZS10aXA6aG92ZXIsIC5qb3lyaWRlLWNsb3NlLXRpcDpmb2N1cyB7IGNvbG9yOiAjZWVlICFpbXBvcnRhbnQ7IH0KCi5qb3lyaWRlLW1vZGFsLWJnIHsgcG9zaXRpb246IGZpeGVkOyBoZWlnaHQ6IDEwMCU7IHdpZHRoOiAxMDAlOyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjUpOyB6LWluZGV4OiAxMDA7IGRpc3BsYXk6IG5vbmU7IHRvcDogMDsgbGVmdDogMDsgY3Vyc29yOiBwb2ludGVyOyB9CgouY2xlYXJpbmctYmxhY2tvdXQgeyBiYWNrZ3JvdW5kOiBibGFjazsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjgpOyBwb3NpdGlvbjogZml4ZWQ7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IHRvcDogMDsgbGVmdDogMDsgei1pbmRleDogOTk5OyB9Ci5jbGVhcmluZy1ibGFja291dCAuY2xlYXJpbmctY2xvc2UgeyBkaXNwbGF5OiBibG9jazsgfQoKLmNsZWFyaW5nLWNvbnRhaW5lciB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgei1pbmRleDogOTk5OyBoZWlnaHQ6IDEwMCU7IG92ZXJmbG93OiBoaWRkZW47IH0KCi52aXNpYmxlLWltZyB7IGhlaWdodDogNzUlOyBwb3NpdGlvbjogcmVsYXRpdmU7IH0KLnZpc2libGUtaW1nIGltZyB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogNTAlOyB0b3A6IDUwJTsgbWFyZ2luLWxlZnQ6IC01MCU7IG1heC1oZWlnaHQ6IDEwMCU7IG1heC13aWR0aDogMTAwJTsgfQoudmlzaWJsZS1pbWcgLmNsZWFyaW5nLWNhcHRpb24geyBjb2xvcjogd2hpdGU7IG1hcmdpbi1ib3R0b206IDA7IHRleHQtYWxpZ246IGNlbnRlcjsgcG9zaXRpb246IGFic29sdXRlOyBib3R0b206IDA7IGJhY2tncm91bmQ6IGJsYWNrOyBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNyk7IHdpZHRoOiAxMDAlOyBwYWRkaW5nOiAxMHB4IDEwMHB4OyB9CgouY2xlYXJpbmctY2xvc2UgeyB6LWluZGV4OiA5OTk7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAxMHB4OyByaWdodDogMjBweDsgZm9udC1zaXplOiAzMHB4OyBsaW5lLWhlaWdodDogMTsgY29sb3I6IHdoaXRlOyBkaXNwbGF5OiBub25lOyB9Ci5jbGVhcmluZy1jbG9zZTpob3ZlciwgLmNsZWFyaW5nLWNsb3NlOmZvY3VzIHsgY29sb3I6ICNjY2M7IH0KCi5jbGVhcmluZy1tYWluLWxlZnQsIC5jbGVhcmluZy1tYWluLXJpZ2h0IHsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDUwJTsgbWFyZ2luLXRvcDogLTE2cHg7IH0KCi5jbGVhcmluZy1tYWluLWxlZnQuZGlzYWJsZWQsIC5jbGVhcmluZy1tYWluLXJpZ2h0LmRpc2FibGVkIHsgb3BhY2l0eTogMC41OyB9CgouY2xlYXJpbmctbWFpbi1sZWZ0OmFjdGl2ZSwgLmNsZWFyaW5nLW1haW4tcmlnaHQ6YWN0aXZlIHsgbWFyZ2luLXRvcDogLTE1cHg7IH0KCi5jbGVhcmluZy1tYWluLWxlZnQgeyBsZWZ0OiAxMHB4OyBjb250ZW50OiAiIjsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAwOyBoZWlnaHQ6IDA7IGJvcmRlcjogc29saWQgMTZweDsgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCB3aGl0ZSB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDsgfQoKLmNsZWFyaW5nLW1haW4tcmlnaHQgeyByaWdodDogMTBweDsgY29udGVudDogIiI7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMDsgaGVpZ2h0OiAwOyBib3JkZXI6IHNvbGlkIDE2cHg7IGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgd2hpdGU7IH0KCnVsW2RhdGEtY2xlYXJpbmddLmJsb2NrLWdyaWQudGhyZWUtdXAgPiBsaTpudGgtY2hpbGQoM24rMSkgeyBjbGVhcjogbm9uZTsgfQoKdWxbZGF0YS1jbGVhcmluZ10gbGkgeyBjdXJzb3I6IHBvaW50ZXI7IGRpc3BsYXk6IGJsb2NrOyB9CnVsW2RhdGEtY2xlYXJpbmddIGxpLmNsZWFyaW5nLWZlYXR1cmUgfiBsaSB7IGRpc3BsYXk6IG5vbmU7IH0KCi5jbGVhcmluZy1hc3NlbWJsZWQgLmNsZWFyaW5nLWNvbnRhaW5lciAuY2Fyb3VzZWwgeyBiYWNrZ3JvdW5kOiBibGFjazsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjc1KTsgaGVpZ2h0OiAxNTBweDsgbWFyZ2luLXRvcDogNXB4OyB9Ci5jbGVhcmluZy1hc3NlbWJsZWQgLmNsZWFyaW5nLWNvbnRhaW5lciAudmlzaWJsZS1pbWcgeyBiYWNrZ3JvdW5kOiBibGFjazsgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjc1KTsgb3ZlcmZsb3c6IGhpZGRlbjsgfQouY2xlYXJpbmctYXNzZW1ibGVkIC5jbGVhcmluZy1jb250YWluZXIgdWxbZGF0YS1jbGVhcmluZ10geyB6LWluZGV4OiA5OTk7IHdpZHRoOiAyMDAlOyBoZWlnaHQ6IDEwMCU7IG1hcmdpbi1sZWZ0OiAwOyBwb3NpdGlvbjogcmVsYXRpdmU7IGxlZnQ6IDA7IH0KLmNsZWFyaW5nLWFzc2VtYmxlZCAuY2xlYXJpbmctY29udGFpbmVyIHVsW2RhdGEtY2xlYXJpbmddIGxpIHsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxNzVweDsgaGVpZ2h0OiBpbmhlcml0OyBwYWRkaW5nOiAwOyBmbG9hdDogbGVmdDsgb3ZlcmZsb3c6IGhpZGRlbjsgYmFja2dyb3VuZDogIzIyMjsgbWFyZ2luLXJpZ2h0OiAxcHg7IHBvc2l0aW9uOiByZWxhdGl2ZTsgfQouY2xlYXJpbmctYXNzZW1ibGVkIC5jbGVhcmluZy1jb250YWluZXIgdWxbZGF0YS1jbGVhcmluZ10gbGkuZml4LWhlaWdodCBpbWcgeyBtaW4taGVpZ2h0OiAxMDAlOyBoZWlnaHQ6IDEwMCU7IG1heC13aWR0aDogbm9uZTsgfQouY2xlYXJpbmctYXNzZW1ibGVkIC5jbGVhcmluZy1jb250YWluZXIgdWxbZGF0YS1jbGVhcmluZ10gbGkgaW1nIHsgY3Vyc29yOiBwb2ludGVyICFpbXBvcnRhbnQ7IG1pbi13aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9Ci5jbGVhcmluZy1hc3NlbWJsZWQgLmNsZWFyaW5nLWNvbnRhaW5lciB1bFtkYXRhLWNsZWFyaW5nXSBsaS52aXNpYmxlIHsgYm9yZGVyLXRvcDogNHB4IHNvbGlkIHdoaXRlOyB9CgovKiBPdmVycmlkZXMgY2xlYXI6Ym90aDsgd2hlbiB1c2luZyBibG9jay1ncmlkIHdpdGggQ2xlYXJpbmcuIEFsc28gb3ZlcnJpZGVkIC50aCBzdHlsaW5nIHdoZW4gQ2xlYXJpbmcgaXMgb3BlbiAqLwp1bC5ibG9jay1ncmlkW2RhdGEtY2xlYXJpbmddIHsgb3ZlcmZsb3c6IHZpc2libGU7IH0KCi5jbGVhcmluZy1ibGFja291dCB1bC5ibG9jay1ncmlkW2RhdGEtY2xlYXJpbmddLnR3by11cCA+IGxpOm50aC1jaGlsZCgybisxKSB7IGNsZWFyOiBub25lOyB9Ci5jbGVhcmluZy1ibGFja291dCB1bC5ibG9jay1ncmlkW2RhdGEtY2xlYXJpbmddLnRocmVlLXVwID4gbGk6bnRoLWNoaWxkKDNuKzEpIHsgY2xlYXI6IG5vbmU7IH0KLmNsZWFyaW5nLWJsYWNrb3V0IHVsLmJsb2NrLWdyaWRbZGF0YS1jbGVhcmluZ10uZm91ci11cCA+IGxpOm50aC1jaGlsZCg0bisxKSB7IGNsZWFyOiBub25lOyB9Ci5jbGVhcmluZy1ibGFja291dCB1bC5ibG9jay1ncmlkW2RhdGEtY2xlYXJpbmddLmZpdmUtdXAgPiBsaTpudGgtY2hpbGQoNW4rMSkgeyBjbGVhcjogbm9uZTsgfQouY2xlYXJpbmctYmxhY2tvdXQgdWwuYmxvY2stZ3JpZFtkYXRhLWNsZWFyaW5nXS5zaXgtdXAgPiBsaTpudGgtY2hpbGQoNm4rMSkgeyBjbGVhcjogbm9uZTsgfQouY2xlYXJpbmctYmxhY2tvdXQgdWwuYmxvY2stZ3JpZFtkYXRhLWNsZWFyaW5nXS5zZXZlbi11cCA+IGxpOm50aC1jaGlsZCg3bisxKSB7IGNsZWFyOiBub25lOyB9Ci5jbGVhcmluZy1ibGFja291dCB1bC5ibG9jay1ncmlkW2RhdGEtY2xlYXJpbmddLmVpZ2h0LXVwID4gbGk6bnRoLWNoaWxkKDhuKzEpIHsgY2xlYXI6IG5vbmU7IH0KLmNsZWFyaW5nLWJsYWNrb3V0IHVsLmJsb2NrLWdyaWRbZGF0YS1jbGVhcmluZ10ubmluZS11cCA+IGxpOm50aC1jaGlsZCg5bisxKSB7IGNsZWFyOiBub25lOyB9Ci5jbGVhcmluZy1ibGFja291dCB1bC5ibG9jay1ncmlkW2RhdGEtY2xlYXJpbmddLnRlbi11cCA+IGxpOm50aC1jaGlsZCgxMG4rMSkgeyBjbGVhcjogbm9uZTsgfQouY2xlYXJpbmctYmxhY2tvdXQgdWwuYmxvY2stZ3JpZFtkYXRhLWNsZWFyaW5nXS5lbGV2ZW4tdXAgPiBsaTpudGgtY2hpbGQoMTFuKzEpIHsgY2xlYXI6IG5vbmU7IH0KLmNsZWFyaW5nLWJsYWNrb3V0IHVsLmJsb2NrLWdyaWRbZGF0YS1jbGVhcmluZ10udHdlbHZlLXVwID4gbGk6bnRoLWNoaWxkKDEybisxKSB7IGNsZWFyOiBub25lOyB9Ci5jbGVhcmluZy1ibGFja291dCAudGggaW1nIHsgYm9yZGVyOiBub25lOyAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCAwIDAgcmdiYSgwLCAwLCAwLCAwKTsgLW1vei1ib3gtc2hhZG93OiAwIDAgMCAwIHJnYmEoMCwgMCwgMCwgMCk7IGJveC1zaGFkb3c6IDAgMCAwIDAgcmdiYSgwLCAwLCAwLCAwKTsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAwOyAtbW96LWJvcmRlci1yYWRpdXM6IDA7IC1tcy1ib3JkZXItcmFkaXVzOiAwOyAtby1ib3JkZXItcmFkaXVzOiAwOyBib3JkZXItcmFkaXVzOiAwOyB9Ci5jbGVhcmluZy1ibGFja291dDpob3ZlciBpbWcsIC5jbGVhcmluZy1ibGFja291dDpmb2N1cyBpbWcgeyAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCAwIDAgcmdiYSgwLCAwLCAwLCAwKTsgLW1vei1ib3gtc2hhZG93OiAwIDAgMCAwIHJnYmEoMCwgMCwgMCwgMCk7IGJveC1zaGFkb3c6IDAgMCAwIDAgcmdiYSgwLCAwLCAwLCAwKTsgfQoKLyogVmlzaWJpbGl0eSBDbGFzc2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogU3RhbmRhcmQgKGxhcmdlKSBkaXNwbGF5IHRhcmdldGluZyAqLwouc2hvdy1mb3Itc21hbGwsIC5zaG93LWZvci1tZWRpdW0sIC5zaG93LWZvci1tZWRpdW0tZG93biwgLmhpZGUtZm9yLWxhcmdlLCAuaGlkZS1mb3ItbGFyZ2UtdXAsIC5zaG93LWZvci14bGFyZ2UsIC5zaG93LWZvci1wcmludCB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfQoKLmhpZGUtZm9yLXNtYWxsLCAuaGlkZS1mb3ItbWVkaXVtLCAuaGlkZS1mb3ItbWVkaXVtLWRvd24sIC5zaG93LWZvci1sYXJnZSwgLnNob3ctZm9yLWxhcmdlLXVwLCAuaGlkZS1mb3IteGxhcmdlLCAuaGlkZS1mb3ItcHJpbnQgeyBkaXNwbGF5OiBpbmhlcml0ICFpbXBvcnRhbnQ7IH0KCi8qIFZlcnkgbGFyZ2UgZGlzcGxheSB0YXJnZXRpbmcgKi8KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAxNDQxcHgpIHsgLmhpZGUtZm9yLXNtYWxsLCAuaGlkZS1mb3ItbWVkaXVtLCAuaGlkZS1mb3ItbWVkaXVtLWRvd24sIC5oaWRlLWZvci1sYXJnZSwgLnNob3ctZm9yLWxhcmdlLXVwLCAuc2hvdy1mb3IteGxhcmdlIHsgZGlzcGxheTogaW5oZXJpdCAhaW1wb3J0YW50OyB9CiAgLnNob3ctZm9yLXNtYWxsLCAuc2hvdy1mb3ItbWVkaXVtLCAuc2hvdy1mb3ItbWVkaXVtLWRvd24sIC5zaG93LWZvci1sYXJnZSwgLmhpZGUtZm9yLWxhcmdlLXVwLCAuaGlkZS1mb3IteGxhcmdlIHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9IH0KLyogTWVkaXVtIGRpc3BsYXkgdGFyZ2V0aW5nICovCkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTI3OXB4KSBhbmQgKG1pbi13aWR0aDogNzY4cHgpIHsgLmhpZGUtZm9yLXNtYWxsLCAuc2hvdy1mb3ItbWVkaXVtLCAuc2hvdy1mb3ItbWVkaXVtLWRvd24sIC5oaWRlLWZvci1sYXJnZSwgLmhpZGUtZm9yLWxhcmdlLXVwLCAuaGlkZS1mb3IteGxhcmdlIHsgZGlzcGxheTogaW5oZXJpdCAhaW1wb3J0YW50OyB9CiAgLnNob3ctZm9yLXNtYWxsLCAuaGlkZS1mb3ItbWVkaXVtLCAuaGlkZS1mb3ItbWVkaXVtLWRvd24sIC5zaG93LWZvci1sYXJnZSwgLnNob3ctZm9yLWxhcmdlLXVwLCAuc2hvdy1mb3IteGxhcmdlIHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9IH0KLyogU21hbGwgZGlzcGxheSB0YXJnZXRpbmcgKi8KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjdweCkgeyAuc2hvdy1mb3Itc21hbGwsIC5oaWRlLWZvci1tZWRpdW0sIC5zaG93LWZvci1tZWRpdW0tZG93biwgLmhpZGUtZm9yLWxhcmdlLCAuaGlkZS1mb3ItbGFyZ2UtdXAsIC5oaWRlLWZvci14bGFyZ2UgeyBkaXNwbGF5OiBpbmhlcml0ICFpbXBvcnRhbnQ7IH0KICAuaGlkZS1mb3Itc21hbGwsIC5zaG93LWZvci1tZWRpdW0sIC5oaWRlLWZvci1tZWRpdW0tZG93biwgLnNob3ctZm9yLWxhcmdlLCAuc2hvdy1mb3ItbGFyZ2UtdXAsIC5zaG93LWZvci14bGFyZ2UgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0gfQovKiBPcmllbnRhdGlvbiB0YXJnZXRpbmcgKi8KLnNob3ctZm9yLWxhbmRzY2FwZSwgLmhpZGUtZm9yLXBvcnRyYWl0IHsgZGlzcGxheTogaW5oZXJpdCAhaW1wb3J0YW50OyB9CgouaGlkZS1mb3ItbGFuZHNjYXBlLCAuc2hvdy1mb3ItcG9ydHJhaXQgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0KCkBtZWRpYSBzY3JlZW4gYW5kIChvcmllbnRhdGlvbjogbGFuZHNjYXBlKSB7IC5zaG93LWZvci1sYW5kc2NhcGUsIC5oaWRlLWZvci1wb3J0cmFpdCB7IGRpc3BsYXk6IGluaGVyaXQgIWltcG9ydGFudDsgfQogIC5oaWRlLWZvci1sYW5kc2NhcGUsIC5zaG93LWZvci1wb3J0cmFpdCB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfSB9CkBtZWRpYSBzY3JlZW4gYW5kIChvcmllbnRhdGlvbjogcG9ydHJhaXQpIHsgLnNob3ctZm9yLXBvcnRyYWl0LCAuaGlkZS1mb3ItbGFuZHNjYXBlIHsgZGlzcGxheTogaW5oZXJpdCAhaW1wb3J0YW50OyB9CiAgLmhpZGUtZm9yLXBvcnRyYWl0LCAuc2hvdy1mb3ItbGFuZHNjYXBlIHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9IH0KLyogVG91Y2gtZW5hYmxlZCBkZXZpY2UgdGFyZ2V0aW5nICovCi5zaG93LWZvci10b3VjaCB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfQoKLmhpZGUtZm9yLXRvdWNoIHsgZGlzcGxheTogaW5oZXJpdCAhaW1wb3J0YW50OyB9CgoudG91Y2ggLnNob3ctZm9yLXRvdWNoIHsgZGlzcGxheTogaW5oZXJpdCAhaW1wb3J0YW50OyB9CgoudG91Y2ggLmhpZGUtZm9yLXRvdWNoIHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9CgovKiBTcGVjaWZpYyBvdmVycmlkZXMgZm9yIGVsZW1lbnRzIHRoYXQgcmVxdWlyZSBzb21ldGhpbmcgb3RoZXIgdGhhbiBkaXNwbGF5OiBibG9jayAqLwp0YWJsZS5zaG93LWZvci14bGFyZ2UsIHRhYmxlLnNob3ctZm9yLWxhcmdlLCB0YWJsZS5oaWRlLWZvci1zbWFsbCwgdGFibGUuaGlkZS1mb3ItbWVkaXVtIHsgZGlzcGxheTogdGFibGUgIWltcG9ydGFudDsgfQoKQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMjc5cHgpIGFuZCAobWluLXdpZHRoOiA3NjhweCkgeyAudG91Y2ggdGFibGUuaGlkZS1mb3IteGxhcmdlLCAudG91Y2ggdGFibGUuaGlkZS1mb3ItbGFyZ2UsIC50b3VjaCB0YWJsZS5oaWRlLWZvci1zbWFsbCwgLnRvdWNoIHRhYmxlLnNob3ctZm9yLW1lZGl1bSB7IGRpc3BsYXk6IHRhYmxlICFpbXBvcnRhbnQ7IH0gfQpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2N3B4KSB7IHRhYmxlLmhpZGUtZm9yLXhsYXJnZSwgdGFibGUuaGlkZS1mb3ItbGFyZ2UsIHRhYmxlLmhpZGUtZm9yLW1lZGl1bSwgdGFibGUuc2hvdy1mb3Itc21hbGwgeyBkaXNwbGF5OiB0YWJsZSAhaW1wb3J0YW50OyB9IH0KLyogMTI4MCB0YWJsZXQgLS0tLS0tLS0tLS0tICovCkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC1kZXZpY2Utd2lkdGg6IDEyODBweCkgeyAvKiBOYXZCYXIgLS0tICovCiAgLyogICAgICAgICAgICAqLwogIC50b3VjaCAubmF2LWJhciBsaS5oYXMtZmx5b3V0ID4gYSB7IHBhZGRpbmctcmlnaHQ6IDM2cHggIWltcG9ydGFudDsgfSB9Ci8qIENvdmVyaW5nIGFsbW9zdCBhbGwgLS0tLS0gKi8KQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LWRldmljZS13aWR0aDogODAwcHgpLCBvbmx5IHNjcmVlbiBhbmQgKGRldmljZS13aWR0aDogMTAyNHB4KSBhbmQgKGRldmljZS1oZWlnaHQ6IDYwMHB4KSwgb25seSBzY3JlZW4gYW5kICh3aWR0aDogMTI4MHB4KSBhbmQgKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpLCBvbmx5IHNjcmVlbiBhbmQgKGRldmljZS13aWR0aDogODAwcHgpLCBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY3cHgpIHsgLmZsZXgtdmlkZW8geyBwYWRkaW5nLXRvcDogMDsgfSB9Ci8qIEJldHdlZW4gTWVkaXVtIGFuZCBTbWFsbCAqLwpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEyNzlweCkgYW5kIChtaW4td2lkdGg6IDc2OHB4KSB7IC8qIE5hdkJhciAtLS0gKi8KICAvKiAgICAgICAgICAgICovCiAgLnRvdWNoIC5uYXYtYmFyIGxpIGEgeyBmb250LXNpemU6IDEzcHg7IH0KICAudG91Y2ggLm5hdi1iYXIgbGkuaGFzLWZseW91dCA+IGEuZmx5b3V0LXRvZ2dsZSB7IHBhZGRpbmc6IDIwcHggIWltcG9ydGFudDsgfQogIC50b3VjaCAubmF2LWJhciBsaS5oYXMtZmx5b3V0ID4gYSB7IHBhZGRpbmctcmlnaHQ6IDM2cHggIWltcG9ydGFudDsgfQogIC8qIENsZWFyaW5nIC0tLSAqLwogIC8qICAgICAgICAgICAgICAqLwogIC5jbGVhcmluZy1tYWluLXJpZ2h0LCAuY2xlYXJpbmctbWFpbi1sZWZ0IHsgaGVpZ2h0OiAxMDAlOyB3aWR0aDogNDBweDsgdG9wOiAwOyBib3JkZXI6IG5vbmU7IH0KICAuY2xlYXJpbmctbWFpbi1yaWdodDpiZWZvcmUsIC5jbGVhcmluZy1tYWluLWxlZnQ6YmVmb3JlIHsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDUwJTsgfQogIC5jbGVhcmluZy1tYWluLWxlZnQgeyBsZWZ0OiAwOyB9CiAgLmNsZWFyaW5nLW1haW4tbGVmdDpiZWZvcmUgeyBsZWZ0OiA1cHg7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDA7IGhlaWdodDogMDsgYm9yZGVyOiBzb2xpZCAxNnB4OyBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHdoaXRlIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50OyB9CiAgLmNsZWFyaW5nLW1haW4tcmlnaHQgeyBoZWlnaHQ6IDEwMCU7IHJpZ2h0OiAwOyB9CiAgLmNsZWFyaW5nLW1haW4tcmlnaHQ6YmVmb3JlIHsgY29udGVudDogIiI7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMDsgaGVpZ2h0OiAwOyBib3JkZXI6IHNvbGlkIDE2cHg7IGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgd2hpdGU7IH0gfQovKiBTbWFsbCBEZXZpY2VzIC0tLS0tLS0tLS0tLSAqLwpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2N3B4KSB7IC8qIEdsb2JhbCBNaXNjIC0tLSAqLwogIC8qICAgICAgICAgICAgICAgICAqLwogIC5sZWZ0LCAucmlnaHQgeyBmbG9hdDogbm9uZTsgfQogIGJvZHkgeyAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IG5vbmU7IC1tcy10ZXh0LXNpemUtYWRqdXN0OiBub25lOyB3aWR0aDogMTAwJTsgbWluLXdpZHRoOiAwOyBtYXJnaW4tbGVmdDogMDsgbWFyZ2luLXJpZ2h0OiAwOyBwYWRkaW5nLWxlZnQ6IDA7IHBhZGRpbmctcmlnaHQ6IDA7IH0KICAvKiBUaGUgR3JpZCAtLS0gKi8KICAvKiAgICAgICAgICAgICAgKi8KICAucm93IHsgd2lkdGg6IGF1dG87IG1pbi13aWR0aDogMDsgbWFyZ2luLWxlZnQ6IDA7IG1hcmdpbi1yaWdodDogMDsgfQogIC5jb2x1bW4sIC5jb2x1bW5zIHsgd2lkdGg6IGF1dG8gIWltcG9ydGFudDsgZmxvYXQ6IG5vbmU7IH0KICAuY29sdW1uOmxhc3QtY2hpbGQsIC5jb2x1bW5zOmxhc3QtY2hpbGQgeyBmbG9hdDogbm9uZTsgfQogIFtjbGFzcyo9ImNvbHVtbiJdICsgW2NsYXNzKj0iY29sdW1uIl06bGFzdC1jaGlsZCB7IGZsb2F0OiBub25lOyB9CiAgLmNvbHVtbjpiZWZvcmUsIC5jb2x1bW5zOmJlZm9yZSwgLmNvbHVtbjphZnRlciwgLmNvbHVtbnM6YWZ0ZXIgeyBjb250ZW50OiAiIjsgZGlzcGxheTogdGFibGU7IH0KICAuY29sdW1uOmFmdGVyLCAuY29sdW1uczphZnRlciB7IGNsZWFyOiBib3RoOyB9CiAgLm9mZnNldC1ieS1vbmUsIC5vZmZzZXQtYnktdHdvLCAub2Zmc2V0LWJ5LXRocmVlLCAub2Zmc2V0LWJ5LWZvdXIsIC5vZmZzZXQtYnktZml2ZSwgLm9mZnNldC1ieS1zaXgsIC5vZmZzZXQtYnktc2V2ZW4sIC5vZmZzZXQtYnktZWlnaHQsIC5vZmZzZXQtYnktbmluZSwgLm9mZnNldC1ieS10ZW4geyBtYXJnaW4tbGVmdDogMCAhaW1wb3J0YW50OyB9CiAgLnB1c2gtdHdvLCAucHVzaC10aHJlZSwgLnB1c2gtZm91ciwgLnB1c2gtZml2ZSwgLnB1c2gtc2l4LCAucHVzaC1zZXZlbiwgLnB1c2gtZWlnaHQsIC5wdXNoLW5pbmUsIC5wdXNoLXRlbiB7IGxlZnQ6IGF1dG87IH0KICAucHVsbC10d28sIC5wdWxsLXRocmVlLCAucHVsbC1mb3VyLCAucHVsbC1maXZlLCAucHVsbC1zaXgsIC5wdWxsLXNldmVuLCAucHVsbC1laWdodCwgLnB1bGwtbmluZSwgLnB1bGwtdGVuIHsgcmlnaHQ6IGF1dG87IH0KICAvKiBNb2JpbGUgNC1jb2x1bW4gR3JpZCAqLwogIC5yb3cgLm1vYmlsZS1vbmUgeyB3aWR0aDogMjUlICFpbXBvcnRhbnQ7IGZsb2F0OiBsZWZ0OyBwYWRkaW5nOiAwIDE1cHg7IH0KICAucm93IC5tb2JpbGUtb25lOmxhc3QtY2hpbGQgeyBmbG9hdDogcmlnaHQ7IH0KICAucm93IC5tb2JpbGUtb25lLmVuZCB7IGZsb2F0OiBsZWZ0OyB9CiAgLnJvdy5jb2xsYXBzZSAubW9iaWxlLW9uZSB7IHBhZGRpbmc6IDA7IH0KICAucm93IC5tb2JpbGUtdHdvIHsgd2lkdGg6IDUwJSAhaW1wb3J0YW50OyBmbG9hdDogbGVmdDsgcGFkZGluZzogMCAxNXB4OyB9CiAgLnJvdyAubW9iaWxlLXR3bzpsYXN0LWNoaWxkIHsgZmxvYXQ6IHJpZ2h0OyB9CiAgLnJvdyAubW9iaWxlLXR3by5lbmQgeyBmbG9hdDogbGVmdDsgfQogIC5yb3cuY29sbGFwc2UgLm1vYmlsZS10d28geyBwYWRkaW5nOiAwOyB9CiAgLnJvdyAubW9iaWxlLXRocmVlIHsgd2lkdGg6IDc1JSAhaW1wb3J0YW50OyBmbG9hdDogbGVmdDsgcGFkZGluZzogMCAxNXB4OyB9CiAgLnJvdyAubW9iaWxlLXRocmVlOmxhc3QtY2hpbGQgeyBmbG9hdDogcmlnaHQ7IH0KICAucm93IC5tb2JpbGUtdGhyZWUuZW5kIHsgZmxvYXQ6IGxlZnQ7IH0KICAucm93LmNvbGxhcHNlIC5tb2JpbGUtdGhyZWUgeyBwYWRkaW5nOiAwOyB9CiAgLnJvdyAubW9iaWxlLWZvdXIgeyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyBmbG9hdDogbGVmdDsgcGFkZGluZzogMCAxNXB4OyB9CiAgLnJvdyAubW9iaWxlLWZvdXI6bGFzdC1jaGlsZCB7IGZsb2F0OiByaWdodDsgfQogIC5yb3cgLm1vYmlsZS1mb3VyLmVuZCB7IGZsb2F0OiBsZWZ0OyB9CiAgLnJvdy5jb2xsYXBzZSAubW9iaWxlLWZvdXIgeyBwYWRkaW5nOiAwOyB9CiAgLnB1c2gtb25lLW1vYmlsZSB7IGxlZnQ6IDI1JTsgfQogIC5wdWxsLW9uZS1tb2JpbGUgeyByaWdodDogMjUlOyB9CiAgLnB1c2gtdHdvLW1vYmlsZSB7IGxlZnQ6IDUwJTsgfQogIC5wdWxsLXR3by1tb2JpbGUgeyByaWdodDogNTAlOyB9CiAgLnB1c2gtdGhyZWUtbW9iaWxlIHsgbGVmdDogNzUlOyB9CiAgLnB1bGwtdGhyZWUtbW9iaWxlIHsgcmlnaHQ6IDc1JTsgfQogIC8qIEJsb2NrIEdyaWRzIC0tLSAqLwogIC8qICAgICAgICAgICAgICAgICAqLwogIC5ibG9jay1ncmlkLm1vYmlsZSA+IGxpIHsgZmxvYXQ6IG5vbmU7IHdpZHRoOiAxMDAlOyBtYXJnaW4tbGVmdDogMDsgfQogIC5ibG9jay1ncmlkID4gbGkgeyBjbGVhcjogbm9uZTsgfQogIC5ibG9jay1ncmlkLm1vYmlsZS1vbmUtdXAgPiBsaSB7IHdpZHRoOiAxMDAlOyB9CiAgLmJsb2NrLWdyaWQubW9iaWxlLXR3by11cCA+IGxpIHsgd2lkdGg6IDUwJTsgfQogIC5ibG9jay1ncmlkLm1vYmlsZS10d28tdXAgPiBsaTpudGgtY2hpbGQoMm4rMSkgeyBjbGVhcjogYm90aDsgfQogIC5ibG9jay1ncmlkLm1vYmlsZS10aHJlZS11cCA+IGxpIHsgd2lkdGg6IDMzLjMzMzMzJTsgfQogIC5ibG9jay1ncmlkLm1vYmlsZS10aHJlZS11cCA+IGxpOm50aC1jaGlsZCgzbisxKSB7IGNsZWFyOiBib3RoOyB9CiAgLmJsb2NrLWdyaWQubW9iaWxlLWZvdXItdXAgPiBsaSB7IHdpZHRoOiAyNSU7IH0KICAuYmxvY2stZ3JpZC5tb2JpbGUtZm91ci11cCA+IGxpOm50aC1jaGlsZCg0bisxKSB7IGNsZWFyOiBib3RoOyB9CiAgLmJsb2NrLWdyaWQubW9iaWxlLWZpdmUtdXAgPiBsaSB7IHdpZHRoOiAyMCU7IH0KICAuYmxvY2stZ3JpZC5tb2JpbGUtZml2ZS11cCA+IGxpOm50aC1jaGlsZCg1bisxKSB7IGNsZWFyOiBib3RoOyB9CiAgLmJsb2NrLWdyaWQubW9iaWxlLXNpeC11cCA+IGxpIHsgd2lkdGg6IDE2LjY2NjY3JTsgfQogIC5ibG9jay1ncmlkLm1vYmlsZS1zaXgtdXAgPiBsaTpudGgtY2hpbGQoNm4rMSkgeyBjbGVhcjogYm90aDsgfQogIC5ibG9jay1ncmlkLm1vYmlsZS1zZXZlbi11cCA+IGxpIHsgd2lkdGg6IDE0LjI4NTcxJTsgfQogIC5ibG9jay1ncmlkLm1vYmlsZS1zZXZlbi11cCA+IGxpOm50aC1jaGlsZCg3bisxKSB7IGNsZWFyOiBib3RoOyB9CiAgLmJsb2NrLWdyaWQubW9iaWxlLWVpZ2h0LXVwID4gbGkgeyB3aWR0aDogMTIuNSU7IH0KICAuYmxvY2stZ3JpZC5tb2JpbGUtZWlnaHQtdXAgPiBsaTpudGgtY2hpbGQoOG4rMSkgeyBjbGVhcjogYm90aDsgfQogIC5ibG9jay1ncmlkLm1vYmlsZS1uaW5lLXVwID4gbGkgeyB3aWR0aDogMTEuMTExMTElOyB9CiAgLmJsb2NrLWdyaWQubW9iaWxlLW5pbmUtdXAgPiBsaTpudGgtY2hpbGQoOW4rMSkgeyBjbGVhcjogYm90aDsgfQogIC5ibG9jay1ncmlkLm1vYmlsZS10ZW4tdXAgPiBsaSB7IHdpZHRoOiAxMCU7IH0KICAuYmxvY2stZ3JpZC5tb2JpbGUtdGVuLXVwID4gbGk6bnRoLWNoaWxkKDEwbisxKSB7IGNsZWFyOiBib3RoOyB9CiAgLmJsb2NrLWdyaWQubW9iaWxlLWVsZXZlbi11cCA+IGxpIHsgd2lkdGg6IDkuMDkwOTElOyB9CiAgLmJsb2NrLWdyaWQubW9iaWxlLWVsZXZlbi11cCA+IGxpOm50aC1jaGlsZCgxMW4rMSkgeyBjbGVhcjogYm90aDsgfQogIC5ibG9jay1ncmlkLm1vYmlsZS10d2VsdmUtdXAgPiBsaSB7IHdpZHRoOiA4LjMzMzMzJTsgfQogIC5ibG9jay1ncmlkLm1vYmlsZS10d2VsdmUtdXAgPiBsaTpudGgtY2hpbGQoMTJuKzEpIHsgY2xlYXI6IGJvdGg7IH0KICAvKiBGb3JtcyAtLS0gKi8KICAvKiAgICAgICAgICAgKi8KICAvKiBMYWJlbCBhbGlnbm1lbnQgKi8KICBsYWJlbC5yaWdodCB7IHRleHQtYWxpZ246IGxlZnQ7IH0KICAvKiBFeHRlbmQgd2lkdGggb2YgYWxsIGlucHV0cyAqLwogIGlucHV0W3R5cGU9InRleHQiXS5vbmUsIC5yb3cgaW5wdXRbdHlwZT0idGV4dCJdLm9uZSwgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS5vbmUsIC5yb3cgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS5vbmUsIGlucHV0W3R5cGU9ImRhdGUiXS5vbmUsIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZSJdLm9uZSwgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS5vbmUsIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS5vbmUsIGlucHV0W3R5cGU9ImVtYWlsIl0ub25lLCAucm93IGlucHV0W3R5cGU9ImVtYWlsIl0ub25lLCBpbnB1dFt0eXBlPSJudW1iZXIiXS5vbmUsIC5yb3cgaW5wdXRbdHlwZT0ibnVtYmVyIl0ub25lLCBpbnB1dFt0eXBlPSJzZWFyY2giXS5vbmUsIC5yb3cgaW5wdXRbdHlwZT0ic2VhcmNoIl0ub25lLCBpbnB1dFt0eXBlPSJ0ZWwiXS5vbmUsIC5yb3cgaW5wdXRbdHlwZT0idGVsIl0ub25lLCBpbnB1dFt0eXBlPSJ0aW1lIl0ub25lLCAucm93IGlucHV0W3R5cGU9InRpbWUiXS5vbmUsIGlucHV0W3R5cGU9InVybCJdLm9uZSwgLnJvdyBpbnB1dFt0eXBlPSJ1cmwiXS5vbmUsIHRleHRhcmVhLm9uZSwgLnJvdyB0ZXh0YXJlYS5vbmUgeyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9CiAgaW5wdXRbdHlwZT0idGV4dCJdLnR3bywgLnJvdyBpbnB1dFt0eXBlPSJ0ZXh0Il0udHdvLCBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLnR3bywgLnJvdyBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLnR3bywgaW5wdXRbdHlwZT0iZGF0ZSJdLnR3bywgLnJvdyBpbnB1dFt0eXBlPSJkYXRlIl0udHdvLCBpbnB1dFt0eXBlPSJkYXRldGltZSJdLnR3bywgLnJvdyBpbnB1dFt0eXBlPSJkYXRldGltZSJdLnR3bywgaW5wdXRbdHlwZT0iZW1haWwiXS50d28sIC5yb3cgaW5wdXRbdHlwZT0iZW1haWwiXS50d28sIGlucHV0W3R5cGU9Im51bWJlciJdLnR3bywgLnJvdyBpbnB1dFt0eXBlPSJudW1iZXIiXS50d28sIGlucHV0W3R5cGU9InNlYXJjaCJdLnR3bywgLnJvdyBpbnB1dFt0eXBlPSJzZWFyY2giXS50d28sIGlucHV0W3R5cGU9InRlbCJdLnR3bywgLnJvdyBpbnB1dFt0eXBlPSJ0ZWwiXS50d28sIGlucHV0W3R5cGU9InRpbWUiXS50d28sIC5yb3cgaW5wdXRbdHlwZT0idGltZSJdLnR3bywgaW5wdXRbdHlwZT0idXJsIl0udHdvLCAucm93IGlucHV0W3R5cGU9InVybCJdLnR3bywgdGV4dGFyZWEudHdvLCAucm93IHRleHRhcmVhLnR3byB7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IH0KICBpbnB1dFt0eXBlPSJ0ZXh0Il0udGhyZWUsIC5yb3cgaW5wdXRbdHlwZT0idGV4dCJdLnRocmVlLCBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLnRocmVlLCAucm93IGlucHV0W3R5cGU9InBhc3N3b3JkIl0udGhyZWUsIGlucHV0W3R5cGU9ImRhdGUiXS50aHJlZSwgLnJvdyBpbnB1dFt0eXBlPSJkYXRlIl0udGhyZWUsIGlucHV0W3R5cGU9ImRhdGV0aW1lIl0udGhyZWUsIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS50aHJlZSwgaW5wdXRbdHlwZT0iZW1haWwiXS50aHJlZSwgLnJvdyBpbnB1dFt0eXBlPSJlbWFpbCJdLnRocmVlLCBpbnB1dFt0eXBlPSJudW1iZXIiXS50aHJlZSwgLnJvdyBpbnB1dFt0eXBlPSJudW1iZXIiXS50aHJlZSwgaW5wdXRbdHlwZT0ic2VhcmNoIl0udGhyZWUsIC5yb3cgaW5wdXRbdHlwZT0ic2VhcmNoIl0udGhyZWUsIGlucHV0W3R5cGU9InRlbCJdLnRocmVlLCAucm93IGlucHV0W3R5cGU9InRlbCJdLnRocmVlLCBpbnB1dFt0eXBlPSJ0aW1lIl0udGhyZWUsIC5yb3cgaW5wdXRbdHlwZT0idGltZSJdLnRocmVlLCBpbnB1dFt0eXBlPSJ1cmwiXS50aHJlZSwgLnJvdyBpbnB1dFt0eXBlPSJ1cmwiXS50aHJlZSwgdGV4dGFyZWEudGhyZWUsIC5yb3cgdGV4dGFyZWEudGhyZWUgeyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9CiAgaW5wdXRbdHlwZT0idGV4dCJdLmZvdXIsIC5yb3cgaW5wdXRbdHlwZT0idGV4dCJdLmZvdXIsIGlucHV0W3R5cGU9InBhc3N3b3JkIl0uZm91ciwgLnJvdyBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLmZvdXIsIGlucHV0W3R5cGU9ImRhdGUiXS5mb3VyLCAucm93IGlucHV0W3R5cGU9ImRhdGUiXS5mb3VyLCBpbnB1dFt0eXBlPSJkYXRldGltZSJdLmZvdXIsIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS5mb3VyLCBpbnB1dFt0eXBlPSJlbWFpbCJdLmZvdXIsIC5yb3cgaW5wdXRbdHlwZT0iZW1haWwiXS5mb3VyLCBpbnB1dFt0eXBlPSJudW1iZXIiXS5mb3VyLCAucm93IGlucHV0W3R5cGU9Im51bWJlciJdLmZvdXIsIGlucHV0W3R5cGU9InNlYXJjaCJdLmZvdXIsIC5yb3cgaW5wdXRbdHlwZT0ic2VhcmNoIl0uZm91ciwgaW5wdXRbdHlwZT0idGVsIl0uZm91ciwgLnJvdyBpbnB1dFt0eXBlPSJ0ZWwiXS5mb3VyLCBpbnB1dFt0eXBlPSJ0aW1lIl0uZm91ciwgLnJvdyBpbnB1dFt0eXBlPSJ0aW1lIl0uZm91ciwgaW5wdXRbdHlwZT0idXJsIl0uZm91ciwgLnJvdyBpbnB1dFt0eXBlPSJ1cmwiXS5mb3VyLCB0ZXh0YXJlYS5mb3VyLCAucm93IHRleHRhcmVhLmZvdXIgeyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9CiAgaW5wdXRbdHlwZT0idGV4dCJdLmZpdmUsIC5yb3cgaW5wdXRbdHlwZT0idGV4dCJdLmZpdmUsIGlucHV0W3R5cGU9InBhc3N3b3JkIl0uZml2ZSwgLnJvdyBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLmZpdmUsIGlucHV0W3R5cGU9ImRhdGUiXS5maXZlLCAucm93IGlucHV0W3R5cGU9ImRhdGUiXS5maXZlLCBpbnB1dFt0eXBlPSJkYXRldGltZSJdLmZpdmUsIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS5maXZlLCBpbnB1dFt0eXBlPSJlbWFpbCJdLmZpdmUsIC5yb3cgaW5wdXRbdHlwZT0iZW1haWwiXS5maXZlLCBpbnB1dFt0eXBlPSJudW1iZXIiXS5maXZlLCAucm93IGlucHV0W3R5cGU9Im51bWJlciJdLmZpdmUsIGlucHV0W3R5cGU9InNlYXJjaCJdLmZpdmUsIC5yb3cgaW5wdXRbdHlwZT0ic2VhcmNoIl0uZml2ZSwgaW5wdXRbdHlwZT0idGVsIl0uZml2ZSwgLnJvdyBpbnB1dFt0eXBlPSJ0ZWwiXS5maXZlLCBpbnB1dFt0eXBlPSJ0aW1lIl0uZml2ZSwgLnJvdyBpbnB1dFt0eXBlPSJ0aW1lIl0uZml2ZSwgaW5wdXRbdHlwZT0idXJsIl0uZml2ZSwgLnJvdyBpbnB1dFt0eXBlPSJ1cmwiXS5maXZlLCB0ZXh0YXJlYS5maXZlLCAucm93IHRleHRhcmVhLmZpdmUgeyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9CiAgaW5wdXRbdHlwZT0idGV4dCJdLnNpeCwgLnJvdyBpbnB1dFt0eXBlPSJ0ZXh0Il0uc2l4LCBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLnNpeCwgLnJvdyBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLnNpeCwgaW5wdXRbdHlwZT0iZGF0ZSJdLnNpeCwgLnJvdyBpbnB1dFt0eXBlPSJkYXRlIl0uc2l4LCBpbnB1dFt0eXBlPSJkYXRldGltZSJdLnNpeCwgLnJvdyBpbnB1dFt0eXBlPSJkYXRldGltZSJdLnNpeCwgaW5wdXRbdHlwZT0iZW1haWwiXS5zaXgsIC5yb3cgaW5wdXRbdHlwZT0iZW1haWwiXS5zaXgsIGlucHV0W3R5cGU9Im51bWJlciJdLnNpeCwgLnJvdyBpbnB1dFt0eXBlPSJudW1iZXIiXS5zaXgsIGlucHV0W3R5cGU9InNlYXJjaCJdLnNpeCwgLnJvdyBpbnB1dFt0eXBlPSJzZWFyY2giXS5zaXgsIGlucHV0W3R5cGU9InRlbCJdLnNpeCwgLnJvdyBpbnB1dFt0eXBlPSJ0ZWwiXS5zaXgsIGlucHV0W3R5cGU9InRpbWUiXS5zaXgsIC5yb3cgaW5wdXRbdHlwZT0idGltZSJdLnNpeCwgaW5wdXRbdHlwZT0idXJsIl0uc2l4LCAucm93IGlucHV0W3R5cGU9InVybCJdLnNpeCwgdGV4dGFyZWEuc2l4LCAucm93IHRleHRhcmVhLnNpeCB7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IH0KICBpbnB1dFt0eXBlPSJ0ZXh0Il0uc2V2ZW4sIC5yb3cgaW5wdXRbdHlwZT0idGV4dCJdLnNldmVuLCBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLnNldmVuLCAucm93IGlucHV0W3R5cGU9InBhc3N3b3JkIl0uc2V2ZW4sIGlucHV0W3R5cGU9ImRhdGUiXS5zZXZlbiwgLnJvdyBpbnB1dFt0eXBlPSJkYXRlIl0uc2V2ZW4sIGlucHV0W3R5cGU9ImRhdGV0aW1lIl0uc2V2ZW4sIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS5zZXZlbiwgaW5wdXRbdHlwZT0iZW1haWwiXS5zZXZlbiwgLnJvdyBpbnB1dFt0eXBlPSJlbWFpbCJdLnNldmVuLCBpbnB1dFt0eXBlPSJudW1iZXIiXS5zZXZlbiwgLnJvdyBpbnB1dFt0eXBlPSJudW1iZXIiXS5zZXZlbiwgaW5wdXRbdHlwZT0ic2VhcmNoIl0uc2V2ZW4sIC5yb3cgaW5wdXRbdHlwZT0ic2VhcmNoIl0uc2V2ZW4sIGlucHV0W3R5cGU9InRlbCJdLnNldmVuLCAucm93IGlucHV0W3R5cGU9InRlbCJdLnNldmVuLCBpbnB1dFt0eXBlPSJ0aW1lIl0uc2V2ZW4sIC5yb3cgaW5wdXRbdHlwZT0idGltZSJdLnNldmVuLCBpbnB1dFt0eXBlPSJ1cmwiXS5zZXZlbiwgLnJvdyBpbnB1dFt0eXBlPSJ1cmwiXS5zZXZlbiwgdGV4dGFyZWEuc2V2ZW4sIC5yb3cgdGV4dGFyZWEuc2V2ZW4geyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9CiAgaW5wdXRbdHlwZT0idGV4dCJdLmVpZ2h0LCAucm93IGlucHV0W3R5cGU9InRleHQiXS5laWdodCwgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS5laWdodCwgLnJvdyBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLmVpZ2h0LCBpbnB1dFt0eXBlPSJkYXRlIl0uZWlnaHQsIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZSJdLmVpZ2h0LCBpbnB1dFt0eXBlPSJkYXRldGltZSJdLmVpZ2h0LCAucm93IGlucHV0W3R5cGU9ImRhdGV0aW1lIl0uZWlnaHQsIGlucHV0W3R5cGU9ImVtYWlsIl0uZWlnaHQsIC5yb3cgaW5wdXRbdHlwZT0iZW1haWwiXS5laWdodCwgaW5wdXRbdHlwZT0ibnVtYmVyIl0uZWlnaHQsIC5yb3cgaW5wdXRbdHlwZT0ibnVtYmVyIl0uZWlnaHQsIGlucHV0W3R5cGU9InNlYXJjaCJdLmVpZ2h0LCAucm93IGlucHV0W3R5cGU9InNlYXJjaCJdLmVpZ2h0LCBpbnB1dFt0eXBlPSJ0ZWwiXS5laWdodCwgLnJvdyBpbnB1dFt0eXBlPSJ0ZWwiXS5laWdodCwgaW5wdXRbdHlwZT0idGltZSJdLmVpZ2h0LCAucm93IGlucHV0W3R5cGU9InRpbWUiXS5laWdodCwgaW5wdXRbdHlwZT0idXJsIl0uZWlnaHQsIC5yb3cgaW5wdXRbdHlwZT0idXJsIl0uZWlnaHQsIHRleHRhcmVhLmVpZ2h0LCAucm93IHRleHRhcmVhLmVpZ2h0IHsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsgfQogIGlucHV0W3R5cGU9InRleHQiXS5uaW5lLCAucm93IGlucHV0W3R5cGU9InRleHQiXS5uaW5lLCBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLm5pbmUsIC5yb3cgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS5uaW5lLCBpbnB1dFt0eXBlPSJkYXRlIl0ubmluZSwgLnJvdyBpbnB1dFt0eXBlPSJkYXRlIl0ubmluZSwgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS5uaW5lLCAucm93IGlucHV0W3R5cGU9ImRhdGV0aW1lIl0ubmluZSwgaW5wdXRbdHlwZT0iZW1haWwiXS5uaW5lLCAucm93IGlucHV0W3R5cGU9ImVtYWlsIl0ubmluZSwgaW5wdXRbdHlwZT0ibnVtYmVyIl0ubmluZSwgLnJvdyBpbnB1dFt0eXBlPSJudW1iZXIiXS5uaW5lLCBpbnB1dFt0eXBlPSJzZWFyY2giXS5uaW5lLCAucm93IGlucHV0W3R5cGU9InNlYXJjaCJdLm5pbmUsIGlucHV0W3R5cGU9InRlbCJdLm5pbmUsIC5yb3cgaW5wdXRbdHlwZT0idGVsIl0ubmluZSwgaW5wdXRbdHlwZT0idGltZSJdLm5pbmUsIC5yb3cgaW5wdXRbdHlwZT0idGltZSJdLm5pbmUsIGlucHV0W3R5cGU9InVybCJdLm5pbmUsIC5yb3cgaW5wdXRbdHlwZT0idXJsIl0ubmluZSwgdGV4dGFyZWEubmluZSwgLnJvdyB0ZXh0YXJlYS5uaW5lIHsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsgfQogIGlucHV0W3R5cGU9InRleHQiXS50ZW4sIC5yb3cgaW5wdXRbdHlwZT0idGV4dCJdLnRlbiwgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS50ZW4sIC5yb3cgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS50ZW4sIGlucHV0W3R5cGU9ImRhdGUiXS50ZW4sIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZSJdLnRlbiwgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS50ZW4sIC5yb3cgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS50ZW4sIGlucHV0W3R5cGU9ImVtYWlsIl0udGVuLCAucm93IGlucHV0W3R5cGU9ImVtYWlsIl0udGVuLCBpbnB1dFt0eXBlPSJudW1iZXIiXS50ZW4sIC5yb3cgaW5wdXRbdHlwZT0ibnVtYmVyIl0udGVuLCBpbnB1dFt0eXBlPSJzZWFyY2giXS50ZW4sIC5yb3cgaW5wdXRbdHlwZT0ic2VhcmNoIl0udGVuLCBpbnB1dFt0eXBlPSJ0ZWwiXS50ZW4sIC5yb3cgaW5wdXRbdHlwZT0idGVsIl0udGVuLCBpbnB1dFt0eXBlPSJ0aW1lIl0udGVuLCAucm93IGlucHV0W3R5cGU9InRpbWUiXS50ZW4sIGlucHV0W3R5cGU9InVybCJdLnRlbiwgLnJvdyBpbnB1dFt0eXBlPSJ1cmwiXS50ZW4sIHRleHRhcmVhLnRlbiwgLnJvdyB0ZXh0YXJlYS50ZW4geyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyB9CiAgaW5wdXRbdHlwZT0idGV4dCJdLmVsZXZlbiwgLnJvdyBpbnB1dFt0eXBlPSJ0ZXh0Il0uZWxldmVuLCBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLmVsZXZlbiwgLnJvdyBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLmVsZXZlbiwgaW5wdXRbdHlwZT0iZGF0ZSJdLmVsZXZlbiwgLnJvdyBpbnB1dFt0eXBlPSJkYXRlIl0uZWxldmVuLCBpbnB1dFt0eXBlPSJkYXRldGltZSJdLmVsZXZlbiwgLnJvdyBpbnB1dFt0eXBlPSJkYXRldGltZSJdLmVsZXZlbiwgaW5wdXRbdHlwZT0iZW1haWwiXS5lbGV2ZW4sIC5yb3cgaW5wdXRbdHlwZT0iZW1haWwiXS5lbGV2ZW4sIGlucHV0W3R5cGU9Im51bWJlciJdLmVsZXZlbiwgLnJvdyBpbnB1dFt0eXBlPSJudW1iZXIiXS5lbGV2ZW4sIGlucHV0W3R5cGU9InNlYXJjaCJdLmVsZXZlbiwgLnJvdyBpbnB1dFt0eXBlPSJzZWFyY2giXS5lbGV2ZW4sIGlucHV0W3R5cGU9InRlbCJdLmVsZXZlbiwgLnJvdyBpbnB1dFt0eXBlPSJ0ZWwiXS5lbGV2ZW4sIGlucHV0W3R5cGU9InRpbWUiXS5lbGV2ZW4sIC5yb3cgaW5wdXRbdHlwZT0idGltZSJdLmVsZXZlbiwgaW5wdXRbdHlwZT0idXJsIl0uZWxldmVuLCAucm93IGlucHV0W3R5cGU9InVybCJdLmVsZXZlbiwgdGV4dGFyZWEuZWxldmVuLCAucm93IHRleHRhcmVhLmVsZXZlbiB7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IH0KICBpbnB1dFt0eXBlPSJ0ZXh0Il0udHdlbHZlLCAucm93IGlucHV0W3R5cGU9InRleHQiXS50d2VsdmUsIGlucHV0W3R5cGU9InBhc3N3b3JkIl0udHdlbHZlLCAucm93IGlucHV0W3R5cGU9InBhc3N3b3JkIl0udHdlbHZlLCBpbnB1dFt0eXBlPSJkYXRlIl0udHdlbHZlLCAucm93IGlucHV0W3R5cGU9ImRhdGUiXS50d2VsdmUsIGlucHV0W3R5cGU9ImRhdGV0aW1lIl0udHdlbHZlLCAucm93IGlucHV0W3R5cGU9ImRhdGV0aW1lIl0udHdlbHZlLCBpbnB1dFt0eXBlPSJlbWFpbCJdLnR3ZWx2ZSwgLnJvdyBpbnB1dFt0eXBlPSJlbWFpbCJdLnR3ZWx2ZSwgaW5wdXRbdHlwZT0ibnVtYmVyIl0udHdlbHZlLCAucm93IGlucHV0W3R5cGU9Im51bWJlciJdLnR3ZWx2ZSwgaW5wdXRbdHlwZT0ic2VhcmNoIl0udHdlbHZlLCAucm93IGlucHV0W3R5cGU9InNlYXJjaCJdLnR3ZWx2ZSwgaW5wdXRbdHlwZT0idGVsIl0udHdlbHZlLCAucm93IGlucHV0W3R5cGU9InRlbCJdLnR3ZWx2ZSwgaW5wdXRbdHlwZT0idGltZSJdLnR3ZWx2ZSwgLnJvdyBpbnB1dFt0eXBlPSJ0aW1lIl0udHdlbHZlLCBpbnB1dFt0eXBlPSJ1cmwiXS50d2VsdmUsIC5yb3cgaW5wdXRbdHlwZT0idXJsIl0udHdlbHZlLCB0ZXh0YXJlYS50d2VsdmUsIC5yb3cgdGV4dGFyZWEudHdlbHZlIHsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsgfQogIC8qIEJ1dHRvbnMgLS0tICovCiAgLyogICAgICAgICAgICAgKi8KICAvKiBCYXNpYyBvdmVycmlkZXMgKi8KICAuYnV0dG9uIHsgZGlzcGxheTogYmxvY2s7IH0KICBidXR0b24uYnV0dG9uLCBpbnB1dFt0eXBlPSJzdWJtaXQiXS5idXR0b24sIGlucHV0W3R5cGU9InJlc2V0Il0uYnV0dG9uIHsgd2lkdGg6IDEwMCU7IHBhZGRpbmctbGVmdDogMDsgcGFkZGluZy1yaWdodDogMDsgfQogIC8qIEJ1dHRvbiBHcm91cHMgKi8KICAuYnV0dG9uLWdyb3VwIGJ1dHRvbi5idXR0b24sIC5idXR0b24tZ3JvdXAgaW5wdXRbdHlwZT0ic3VibWl0Il0uYnV0dG9uIHsgd2lkdGg6IGF1dG87IHBhZGRpbmc6IDEwcHggMjBweCAxMXB4OyB9CiAgLmJ1dHRvbi1ncm91cCBidXR0b24uYnV0dG9uLmxhcmdlLCAuYnV0dG9uLWdyb3VwIGlucHV0W3R5cGU9InN1Ym1pdCJdLmJ1dHRvbi5sYXJnZSB7IHBhZGRpbmc6IDE1cHggMzBweCAxNnB4OyB9CiAgLmJ1dHRvbi1ncm91cCBidXR0b24uYnV0dG9uLm1lZGl1bSwgLmJ1dHRvbi1ncm91cCBpbnB1dFt0eXBlPSJzdWJtaXQiXS5idXR0b24ubWVkaXVtIHsgcGFkZGluZzogMTBweCAyMHB4IDExcHg7IH0KICAuYnV0dG9uLWdyb3VwIGJ1dHRvbi5idXR0b24uc21hbGwsIC5idXR0b24tZ3JvdXAgaW5wdXRbdHlwZT0ic3VibWl0Il0uYnV0dG9uLnNtYWxsIHsgcGFkZGluZzogN3B4IDE0cHggOHB4OyB9CiAgLmJ1dHRvbi1ncm91cCBidXR0b24uYnV0dG9uLnRpbnksIC5idXR0b24tZ3JvdXAgaW5wdXRbdHlwZT0ic3VibWl0Il0uYnV0dG9uLnRpbnkgeyBwYWRkaW5nOiA1cHggMTBweCA2cHg7IH0KICAuYnV0dG9uLWdyb3VwLmV2ZW4gYnV0dG9uLmJ1dHRvbiwgLmJ1dHRvbi1ncm91cC5ldmVuIGlucHV0W3R5cGU9InN1Ym1pdCJdLmJ1dHRvbiB7IHdpZHRoOiAxMDAlOyBwYWRkaW5nLWxlZnQ6IDA7IHBhZGRpbmctcmlnaHQ6IDA7IH0KICAvKiBOYXZiYXIgLS0tICovCiAgLyogICAgICAgICAgICAqLwogIC5uYXYtYmFyIHsgaGVpZ2h0OiBhdXRvOyB9CiAgLm5hdi1iYXIgPiBsaSB7IGZsb2F0OiBub25lOyBkaXNwbGF5OiBibG9jazsgYm9yZGVyLXJpZ2h0OiBub25lOyB9CiAgLm5hdi1iYXIgPiBsaSA+IGEubWFpbiB7IHRleHQtYWxpZ246IGxlZnQ7IGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkOyBib3JkZXItcmlnaHQ6IG5vbmU7IH0KICAubmF2LWJhciA+IGxpOmZpcnN0LWNoaWxkID4gYS5tYWluIHsgYm9yZGVyLXRvcDogbm9uZTsgfQogIC5uYXYtYmFyID4gbGkuaGFzLWZseW91dCA+IGEuZmx5b3V0LXRvZ2dsZSB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgcmlnaHQ6IDA7IHRvcDogMDsgcGFkZGluZzogMjJweDsgei1pbmRleDogMjsgZGlzcGxheTogYmxvY2s7IH0KICAubmF2LWJhciA+IGxpLmhhcy1mbHlvdXQuaXMtdG91Y2ggPiBhLmZseW91dC10b2dnbGUgc3BhbiB7IGNvbnRlbnQ6ICIiOyB3aWR0aDogMDsgaGVpZ2h0OiAwOyBkaXNwbGF5OiBibG9jazsgfQogIC5uYXYtYmFyID4gbGkuaGFzLWZseW91dCA+IGEuZmx5b3V0LXRvZ2dsZTpob3ZlciBzcGFuIHsgYm9yZGVyLXRvcC1jb2xvcjogIzE0MTQxNDsgfQogIC5uYXYtYmFyLnZlcnRpY2FsID4gbGkuaGFzLWZseW91dCA+IC5mbHlvdXQgeyBsZWZ0OiAwOyB9CiAgLmZseW91dCB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsgdG9wOiBhdXRvOyBtYXJnaW4tcmlnaHQ6IC0ycHg7IGJvcmRlci13aWR0aDogMXB4IDFweCAwIDFweDsgfQogIC5mbHlvdXQucmlnaHQgeyBmbG9hdDogbm9uZTsgcmlnaHQ6IGF1dG87IGxlZnQ6IC0xcHg7IH0KICAuZmx5b3V0LnNtYWxsLCAuZmx5b3V0LmxhcmdlIHsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsgfQogIC5mbHlvdXQgcDpsYXN0LWNoaWxkIHsgbWFyZ2luLWJvdHRvbTogMThweDsgfQogIC8qIFJldmVhbCAtLS0gKi8KICAvKiAgICAgICAgICAgICovCiAgLnJldmVhbC1tb2RhbC1iZyB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgfQogIC5yZXZlYWwtbW9kYWwsIC5yZXZlYWwtbW9kYWwuc21hbGwsIC5yZXZlYWwtbW9kYWwubWVkaXVtLCAucmV2ZWFsLW1vZGFsLmxhcmdlLCAucmV2ZWFsLW1vZGFsLnhsYXJnZSB7IHdpZHRoOiA4MCU7IHRvcDogMTVweDsgbGVmdDogNTAlOyBtYXJnaW4tbGVmdDogLTQwJTsgcGFkZGluZzogMjBweDsgaGVpZ2h0OiBhdXRvOyB9CiAgLyogQ2xlYXJpbmcgLS0tICovCiAgLyogICAgICAgICAgICAgICovCiAgLmNsZWFyaW5nLWNvbnRhaW5lciB7IG1hcmdpbjogMDsgfQogIC5jbGVhcmluZy1jbG9zZSB7IHotaW5kZXg6IDk5OyBmb250LXNpemU6IDM3cHg7IHRvcDogMHB4OyByaWdodDogNXB4OyB9CiAgLmNsZWFyaW5nLWNhcHRpb24geyBwb3NpdGlvbjogZml4ZWQ7IGJvdHRvbTogMDsgbGVmdDogMDsgcGFkZGluZzogMTBweCAhaW1wb3J0YW50OyBsaW5lLWhlaWdodDogMS4zOyB9CiAgLmNsZWFyaW5nLW1haW4tcmlnaHQsIC5jbGVhcmluZy1tYWluLWxlZnQgeyBkaXNwbGF5OiBub25lOyB9CiAgLmNsZWFyaW5nLWJsYWNrb3V0LmNsZWFyaW5nLWFzc2VtYmxlZCAudmlzaWJsZS1pbWcsIC5jbGVhcmluZy1ibGFja291dC5jbGVhcmluZy1hc3NlbWJsZWQgLmNsZWFyaW5nLWNvbnRhaW5lciB7IGhlaWdodDogMTAwJTsgfQogIC5jbGVhcmluZy1ibGFja291dC5jbGVhcmluZy1hc3NlbWJsZWQgdWxbZGF0YS1jbGVhcmluZ10geyBkaXNwbGF5OiBub25lOyB9CiAgLyogSm95cmlkZSAtLS0gKi8KICAvKiAgICAgICAgICAgICAqLwogIC5qb3lyaWRlLXRpcC1ndWlkZSB7IHdpZHRoOiA5NSUgIWltcG9ydGFudDsgbGVmdDogMi41JSAhaW1wb3J0YW50OyAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweDsgLW1vei1ib3JkZXItcmFkaXVzOiA0cHg7IC1tcy1ib3JkZXItcmFkaXVzOiA0cHg7IC1vLWJvcmRlci1yYWRpdXM6IDRweDsgYm9yZGVyLXJhZGl1czogNHB4OyB9CiAgLmpveXJpZGUtdGlwLWd1aWRlLXdyYXBwZXIgeyB3aWR0aDogMTAwJTsgfQogIC8qIFRhYnMgLS0tICovCiAgLyogICAgICAgICAgKi8KICAudGFicy5tb2JpbGUgeyB3aWR0aDogYXV0bzsgbWFyZ2luOiAyMHB4IC0yMHB4IDQwcHg7IGJvcmRlci1ib3R0b206IHNvbGlkIDFweCAjY2NjOyBoZWlnaHQ6IGF1dG87IG1hcmdpbjogMjBweCAtMTVweCAwcHggLTE1cHg7IH0KICAudGFicy5tb2JpbGUgZHQsIC50YWJzLm1vYmlsZSBsaSwgLnRhYnMubW9iaWxlIGRkIHsgZmxvYXQ6IG5vbmU7IGhlaWdodDogYXV0bzsgfQogIC50YWJzLm1vYmlsZSBkZCBhLCAudGFicy5tb2JpbGUgbGkgYSB7IGZvbnQtc2l6ZTogMTVweDsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiBhdXRvOyBoZWlnaHQ6IGF1dG87IHBhZGRpbmc6IDE4cHggMjBweDsgbWFyZ2luOiAwOyBjb2xvcjogIzU1NTsgbGluZS1oZWlnaHQ6IDE7IGJvcmRlcjogbm9uZTsgYm9yZGVyLWxlZnQ6IG5vbmU7IGJvcmRlci1yaWdodDogbm9uZTsgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNjY2M7IGJhY2tncm91bmQ6ICNmZmY7IH0KICAudGFicy5tb2JpbGUgZGQgYS5hY3RpdmUsIC50YWJzLm1vYmlsZSBsaSBhLmFjdGl2ZSB7IGJvcmRlcjogbm9uZTsgYmFja2dyb3VuZDogIzJiYTZjYjsgY29sb3I6ICNmZmY7IG1hcmdpbjogMDsgcG9zaXRpb246IHN0YXRpYzsgdG9wOiAwOyBoZWlnaHQ6IGF1dG87IH0KICAudGFicy5tb2JpbGUgZGQ6Zmlyc3QtY2hpbGQgYS5hY3RpdmUsIC50YWJzLm1vYmlsZSBsaTpmaXJzdC1jaGlsZCBhLmFjdGl2ZSB7IG1hcmdpbjogMDsgfQogIC50YWJzLm1vYmlsZSArIC50YWJzLWNvbnRlbnQuY29udGFpbmVkIHsgbWFyZ2luLWxlZnQ6IC0xNXB4OyBtYXJnaW4tcmlnaHQ6IC0xNXB4OyB9CiAgLnRhYnMubW9iaWxlIC5zZWN0aW9uLXRpdGxlIHsgcGFkZGluZy1sZWZ0OiAyMHB4ICFpbXBvcnRhbnQ7IH0KICAuY29udGFpbmVkLm1vYmlsZSB7IG1hcmdpbi1ib3R0b206IDA7IH0KICAuY29udGFpbmVkLnRhYnMubW9iaWxlIGRkIGEsIC5jb250YWluZWQudGFicy5tb2JpbGUgbGkgYSB7IHBhZGRpbmc6IDE4cHggMjBweDsgfQogIC50YWJzLm1vYmlsZSArIHVsLmNvbnRhaW5lZCB7IG1hcmdpbi1sZWZ0OiAtMjBweDsgbWFyZ2luLXJpZ2h0OiAtMjBweDsgYm9yZGVyLXdpZHRoOiAwIDAgMXB4IDA7IH0KICAvKiBVSSBFbGVtZW50cyAtLS0gKi8KICAvKiAgICAgICAgICAgICAgICAgKi8KICAvKiBUb29sdGlwcyAqLwogIC50b29sdGlwIHsgZm9udC1zaXplOiAxNHB4OyBsaW5lLWhlaWdodDogMS40OyBwYWRkaW5nOiA3cHggMTBweCA5cHggMTBweDsgbGVmdDogNTAlICFpbXBvcnRhbnQ7IG1heC13aWR0aDogODAlICFpbXBvcnRhbnQ7IG1hcmdpbi1sZWZ0OiAtNDAlOyBmb250LXNpemU6IDExMCU7IH0KICAudG9vbHRpcCA+IC5udWIsIC50b29sdGlwLnRvcCA+IC5udWIsIC50b29sdGlwLmxlZnQgPiAubnViLCAudG9vbHRpcC5yaWdodCA+IC5udWIgeyBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IGJsYWNrIHRyYW5zcGFyZW50OyBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHJnYmEoMCwgMCwgMCwgMC44NSkgdHJhbnNwYXJlbnQ7IHRvcDogLTEycHg7IGxlZnQ6IDEwcHg7IH0gfQovKiBUb3BiYXIgU3BlY2lmaWMgQnJlYWtwb2ludCB0aGF0IHlvdSBjYW4gY3VzdG9taXplICovCkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogOTQwcHgpIHsgLnRvcC1iYXIgeyBtYXJnaW4tYm90dG9tOiAwOyBvdmVyZmxvdzogaGlkZGVuOyBoZWlnaHQ6IDQ1cHg7IGJhY2tncm91bmQ6ICMyMjIyMjI7IC8qIE92ZXJyaWRlIGNvbnRhaW4gdG8gZ3JpZCBzdHVmZiBmb3IgYnJlYWtwb2ludCAqLyAvKiBTZXR0aW5nIHVwIHRoZSBzbGlkaW5nIGFyZWEgKi8gLyogV2hlbiB0aGUgU21hbGwgTmF2IGlzIFNob3dpbmcgKi8gfQogIC50b3AtYmFyIC5qcy1nZW5lcmF0ZWQgeyBkaXNwbGF5OiBibG9jazsgfQogIC5jb250YWluLXRvLWdyaWQgLnRvcC1iYXIgeyB3aWR0aDogYXV0bzsgfQogIC50b3AtYmFyIHNlY3Rpb24geyBsZWZ0OiAwOyBwb3NpdGlvbjogcmVsYXRpdmU7IHdpZHRoOiBhdXRvOyAtd2Via2l0LXRyYW5zaXRpb246IGxlZnQgMzAwbXMgMDsgLW1vei10cmFuc2l0aW9uOiBsZWZ0IDMwMG1zIDA7IC1vLXRyYW5zaXRpb246IGxlZnQgMzAwbXMgMDsgdHJhbnNpdGlvbjogbGVmdCAzMDBtcyAwOyB9CiAgLnRvcC1iYXIgdWwgeyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyBtYXJnaW4tYm90dG9tOiAwOyBkaXNwbGF5OiBibG9jazsgfQogIC50b3AtYmFyIHVsID4gbGkgeyBmbG9hdDogbm9uZTsgLyogQnJhbmRpbmcgYW5kIG5hbWUgKi8gLyogRHJvcGRvd24gVG9nZ2xlICovIC8qIERpdmlkZXIgZm9yIGJyZWFrcG9pbnQgKi8gLyogU2VhcmNoIE92ZXJyaWRlcyBmb3IgYnJlYWtwb2ludCBzaXplICovIC8qIERyb3Bkb3duIExldmVsIDEgKi8gLyogRHJvcGRvd24gTGV2ZWwgMiAqLyB9CiAgLnRvcC1iYXIgdWwgPiBsaS5hY3RpdmUsIC50b3AtYmFyIHVsID4gbGk6aG92ZXIgeyBiYWNrZ3JvdW5kOiAjMTUxNTE1OyB9CiAgLnRvcC1iYXIgdWwgPiBsaS5uYW1lIHsgaGVpZ2h0OiA0NXB4OyB9CiAgLnRvcC1iYXIgdWwgPiBsaS5uYW1lIGgxIHsgbGluZS1oZWlnaHQ6IDE7IH0KICAudG9wLWJhciB1bCA+IGxpLm5hbWUgaDEgYSB7IGNvbG9yOiB3aGl0ZTsgZGlzcGxheTogYmxvY2s7IGxpbmUtaGVpZ2h0OiA0NXB4ICFpbXBvcnRhbnQ7IHBhZGRpbmctbGVmdDogMTVweDsgaGVpZ2h0OiA0NXB4OyB9CiAgLnRvcC1iYXIgdWwgPiBsaTpob3ZlciBhLCAudG9wLWJhciB1bCA+IGxpLmFjdGl2ZSBhIHsgY29sb3I6IHdoaXRlOyB9CiAgLnRvcC1iYXIgdWwgPiBsaSBhOm5vdCguYnV0dG9uKSB7IGNvbG9yOiB3aGl0ZTsgfQogIC50b3AtYmFyIHVsID4gbGkudG9nZ2xlLXRvcGJhciB7IGN1cnNvcjogcG9pbnRlcjsgZGlzcGxheTogYmxvY2s7IGhlaWdodDogNDVweDsgcG9zaXRpb246IGFic29sdXRlOyByaWdodDogMDsgdG9wOiAwOyB3aWR0aDogNTAlOyB9CiAgLnRvcC1iYXIgdWwgPiBsaS50b2dnbGUtdG9wYmFyIGEgeyBjb250ZW50OiAiIjsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAwOyBoZWlnaHQ6IDA7IGJvcmRlcjogc29saWQgOHB4OyBib3JkZXItY29sb3I6IHdoaXRlIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50OyBwYWRkaW5nOiAwOyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogNTAlOyByaWdodDogMjIuNXB4OyBtYXJnaW4tdG9wOiAtNHB4OyB9CiAgLnRvcC1iYXIgdWwgPiBsaS50b2dnbGUtdG9wYmFyOmhvdmVyIHsgYmFja2dyb3VuZDogaW5oZXJpdDsgfQogIC50b3AtYmFyIHVsID4gbGkudG9nZ2xlLXRvcGJhciBhIHsgcGFkZGluZzogMCAhaW1wb3J0YW50OyB9CiAgLnRvcC1iYXIgdWwgPiBsaS5kaXZpZGVyIHsgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4ICMzYzNjM2M7IGJvcmRlci10b3A6IHNvbGlkIDFweCBibGFjazsgY2xlYXI6IGJvdGg7IGhlaWdodDogMXB4ICFpbXBvcnRhbnQ7IG1hcmdpbjogOHB4IDAgIWltcG9ydGFudDsgd2lkdGg6IDEwMCU7IH0KICAudG9wLWJhciB1bCA+IGxpLnNlYXJjaCB7IHBhZGRpbmc6IDAgMjIuNXB4OyB9CiAgLnRvcC1iYXIgdWwgPiBsaS5zZWFyY2ggZm9ybSB7IHdpZHRoOiAxMDAlOyB9CiAgLnRvcC1iYXIgdWwgPiBsaS5zZWFyY2ggZm9ybSBpbnB1dFt0eXBlPXRleHRdIHsgd2lkdGg6IDc1JTsgfQogIC50b3AtYmFyIHVsID4gbGkuc2VhcmNoIGZvcm0gLmJ1dHRvbiB7IHRvcDogLTFweDsgd2lkdGg6IDI1JTsgfQogIC50b3AtYmFyIHVsID4gbGkuaGFzLWRyb3Bkb3duIGEgeyBwYWRkaW5nLXJpZ2h0OiAzMy43NXB4OyB9CiAgLnRvcC1iYXIgdWwgPiBsaS5oYXMtZHJvcGRvd24gYTphZnRlciB7IGNvbnRlbnQ6ICIiOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDA7IGhlaWdodDogMDsgYm9yZGVyOiBzb2xpZCA1cHg7IGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpOyBtYXJnaW4tcmlnaHQ6IDE1cHg7IG1hcmdpbi10b3A6IC00LjVweDsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDUwJTsgfQogIC50b3AtYmFyIHVsID4gbGkuaGFzLWRyb3Bkb3duOmhvdmVyID4gLmRyb3Bkb3duIHsgZGlzcGxheTogYmxvY2s7IHZpc2liaWxpdHk6IGhpZGRlbjsgfQogIC50b3AtYmFyIHVsID4gbGkuaGFzLWRyb3Bkb3duIC5kcm9wZG93biB7IHZpc2liaWxpdHk6IGhpZGRlbjsgei1pbmRleDogMCAhaW1wb3J0YW50OyB9CiAgLnRvcC1iYXIgdWwgPiBsaS5oYXMtZHJvcGRvd24ubW92ZWQgeyBwb3NpdGlvbjogc3RhdGljOyB9CiAgLnRvcC1iYXIgdWwgPiBsaS5oYXMtZHJvcGRvd24ubW92ZWQgPiAuZHJvcGRvd24geyB0b3A6IDA7IHZpc2liaWxpdHk6IHZpc2libGU7IH0KICAudG9wLWJhciB1bCA+IGxpLmhhcy1kcm9wZG93bi5tb3ZlZCA+IC5kcm9wZG93biBsaSBsYWJlbCB7IG1hcmdpbi1ib3R0b206IDZweDsgcGFkZGluZy10b3A6IDZweCAhaW1wb3J0YW50OyBmb250LXNpemU6IDExcHg7IH0KICAudG9wLWJhciB1bCA+IGxpLmhhcy1kcm9wZG93bi5tb3ZlZCA+IC5kcm9wZG93biBsaTpub3QoLnRpdGxlKSB7IHBhZGRpbmctYm90dG9tOiAwOyB9CiAgLnRvcC1iYXIgdWwgPiBsaS5oYXMtZHJvcGRvd24ubW92ZWQgPiAuZHJvcGRvd24gbGk6bm90KC50aXRsZSkgYSB7IHBhZGRpbmc6IDhweCAyMi41cHg7IGZvbnQtc2l6ZTogMTRweDsgfQogIC50b3AtYmFyIHVsID4gbGkuaGFzLWRyb3Bkb3duLm1vdmVkID4gLmRyb3Bkb3duIGxpIGEsIC50b3AtYmFyIHVsID4gbGkuaGFzLWRyb3Bkb3duLm1vdmVkID4gLmRyb3Bkb3duIGxpIGxhYmVsIHsgcGFkZGluZzogMCAyMi41cHg7IH0KICAudG9wLWJhciB1bCA+IGxpLmhhcy1kcm9wZG93bi5tb3ZlZCA+IC5kcm9wZG93biBsaSBhOmhvdmVyIHsgYmFja2dyb3VuZDogIzNjM2MzYzsgZGlzcGxheTogYmxvY2s7IH0KICAudG9wLWJhciB1bCA+IGxpLmhhcy1kcm9wZG93bi5tb3ZlZCA+IC5kcm9wZG93biBsaS5kaXZpZGVyIHsgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsgbWFyZ2luLXRvcDogOHB4ICFpbXBvcnRhbnQ7IG1hcmdpbi1ib3R0b206IDhweCAhaW1wb3J0YW50OyB9CiAgLnRvcC1iYXIgdWwgPiBsaS5oYXMtZHJvcGRvd24ubW92ZWQgLmJhY2sudGl0bGUgeyBwYWRkaW5nLWJvdHRvbTogMDsgfQogIC50b3AtYmFyIHVsID4gbGkuaGFzLWRyb3Bkb3duLm1vdmVkIC5iYWNrLnRpdGxlIGE6YmVmb3JlIHsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDUwJTsgbGVmdDogMTcuNXB4OyBtYXJnaW4tdG9wOiAtNXB4OyB3aWR0aDogMDsgaGVpZ2h0OiAwOyBjb250ZW50OiAiIjsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAwOyBoZWlnaHQ6IDA7IGJvcmRlcjogc29saWQgNXB4OyBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHdoaXRlIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50OyB9CiAgLnRvcC1iYXIgdWwgPiBsaS5oYXMtZHJvcGRvd24ubW92ZWQgLmJhY2sudGl0bGUgaDUgeyBtYXJnaW46IDA7IHBhZGRpbmctbGVmdDogMTVweDsgcG9zaXRpb246IHJlbGF0aXZlOyB9CiAgLnRvcC1iYXIgdWwgPiBsaS5oYXMtZHJvcGRvd24ubW92ZWQgLmJhY2sudGl0bGUgaDUgYSB7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBwYWRkaW5nLXRvcDogOHB4OyBwYWRkaW5nLWJvdHRvbTogOHB4OyBmb250LXNpemU6IDIzcHg7IGZvbnQtd2VpZ2h0OiBib2xkOyB9CiAgLnRvcC1iYXIgdWwgPiBsaS5oYXMtZHJvcGRvd24gLmRyb3Bkb3duIGxpIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IH0KICAudG9wLWJhciB1bCA+IGxpLmhhcy1kcm9wZG93biAuZHJvcGRvd24gbGkuaGFzLWRyb3Bkb3duIC5kcm9wZG93biB7IGxlZnQ6IDEwMCUgIWltcG9ydGFudDsgdG9wOiAwOyByaWdodDogYXV0byAhaW1wb3J0YW50OyB9CiAgLnRvcC1iYXIgdWwgPiBsaS5oYXMtZHJvcGRvd24gLmRyb3Bkb3duIGxpLmhhcy1kcm9wZG93biA+IGEgeyBwYWRkaW5nLXJpZ2h0OiAzMy43NXB4OyB9CiAgLnRvcC1iYXIgdWwgPiBsaS5oYXMtZHJvcGRvd24gLmRyb3Bkb3duIGxpLmhhcy1kcm9wZG93biA+IGE6YWZ0ZXIgeyBjb250ZW50OiAiIjsgbWFyZ2luLXJpZ2h0OiAxNXB4OyBjb250ZW50OiAiIjsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAwOyBoZWlnaHQ6IDA7IGJvcmRlcjogc29saWQgNXB4OyBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KTsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDUwJTsgbWFyZ2luLXRvcDogLTQuNXB4OyB9CiAgLnRvcC1iYXIgdWwgPiBsaS5oYXMtZHJvcGRvd24gLmRyb3Bkb3duIGxpLmhhcy1kcm9wZG93biA+IGEgbGkgYTpob3ZlciB7IGJhY2tncm91bmQ6ICMzYzNjM2M7IH0KICAudG9wLWJhciB1bCA+IGxpLmhhcy1kcm9wZG93biAuZHJvcGRvd24gbGkuaGFzLWRyb3Bkb3duLm1vdmVkIHsgcG9zaXRpb246IHN0YXRpYzsgfQogIC50b3AtYmFyIHVsID4gbGkuaGFzLWRyb3Bkb3duIC5kcm9wZG93biBsaS5oYXMtZHJvcGRvd24ubW92ZWQgLmRyb3Bkb3duIHsgdG9wOiAwOyB2aXNpYmlsaXR5OiB2aXNpYmxlOyB9CiAgLnRvcC1iYXIgdWwgPiBsaS5oYXMtZHJvcGRvd24gLmRyb3Bkb3duIGxpLmhhcy1kcm9wZG93bjpob3ZlciB7IGRpc3BsYXk6IGJsb2NrOyB9CiAgLnRvcC1iYXIgdWwubGVmdCwgLnRvcC1iYXIgdWwucmlnaHQgeyBmbG9hdDogbm9uZTsgd2lkdGg6IDEwMCU7IH0KICAudG9wLWJhciB1bC5sZWZ0ID4gbGksIC50b3AtYmFyIHVsLnJpZ2h0ID4gbGkgeyBkaXNwbGF5OiBibG9jazsgZmxvYXQ6IG5vbmU7IG1hcmdpbjogMCAhaW1wb3J0YW50OyB9CiAgLnRvcC1iYXIgdWwubGVmdCA+IGxpLmhhcy1kcm9wZG93biAuZHJvcGRvd24sIC50b3AtYmFyIHVsLnJpZ2h0ID4gbGkuaGFzLWRyb3Bkb3duIC5kcm9wZG93biB7IGxlZnQ6IDEwMCUgIWltcG9ydGFudDsgdG9wOiAwOyByaWdodDogYXV0byAhaW1wb3J0YW50OyB9CiAgLnRvcC1iYXIgc2VjdGlvbiA+IHVsIGxpIGE6bm90KC5idXR0b24pIHsgcGFkZGluZy1sZWZ0OiAyMi41cHggIWltcG9ydGFudDsgfQogIC50b3AtYmFyLmV4cGFuZGVkIHsgaGVpZ2h0OiAxMDAlOyB9CiAgLnRvcC1iYXIuZXhwYW5kZWQgdWwgbGkudG9nZ2xlLXRvcGJhciBhIHsgY29udGVudDogIiI7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMDsgaGVpZ2h0OiAwOyBib3JkZXI6IHNvbGlkIDhweDsgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCAjY2NjY2NjIHRyYW5zcGFyZW50OyB0b3A6IGF1dG87IGJvdHRvbTogNTAlOyBtYXJnaW4tYm90dG9tOiAtNHB4OyB9CiAgLnRvcC1iYXIgdWwgbGkuaGFzLWJ1dHRvbiB7IHBhZGRpbmc6IDVweCAxNXB4OyB9CiAgLnRvcC1iYXIgdWwgbGkgLmJ1dHRvbi5zbWFsbCB7IG1hcmdpbjogMCAhaW1wb3J0YW50OyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdpZHRoOiAxMDAlOyB9CiAgLnRvcC1iYXIgdWwgPiBsaS5oYXMtYnV0dG9uIGEuYnV0dG9uIHsgbWFyZ2luOiAwOyB9IH0K]]></data>
	</file>
	<file>
	  <filename>/assets/stylesheets/foundation.min.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KiwqOmJlZm9yZSwqOmFmdGVyey13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveH1odG1se2ZvbnQtc2l6ZTo2Mi41JX1ib2R5e2JhY2tncm91bmQ6I2ZmZjtmb250LWZhbWlseToiSGVsdmV0aWNhIE5ldWUiLCJIZWx2ZXRpY2EiLEhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0eWxlOm5vcm1hbDtmb250LXNpemU6MTRweDtsaW5lLWhlaWdodDoxO2NvbG9yOiMyMjI7cG9zaXRpb246cmVsYXRpdmU7LXdlYmtpdC1mb250LXNtb290aGluZzphbnRpYWxpYXNlZH1hIGltZ3tib3JkZXI6bm9uZX1he2NvbG9yOiMyYmE2Y2I7dGV4dC1kZWNvcmF0aW9uOm5vbmU7bGluZS1oZWlnaHQ6aW5oZXJpdH1hOmhvdmVye2NvbG9yOiMyNzk1YjZ9YTpmb2N1c3tjb2xvcjojMjc5NWI2fXAgYSxwIGE6dmlzaXRlZHtsaW5lLWhlaWdodDppbmhlcml0fS5sZWZ0e2Zsb2F0OmxlZnR9LnJpZ2h0e2Zsb2F0OnJpZ2h0fS50ZXh0LWxlZnR7dGV4dC1hbGlnbjpsZWZ0fS50ZXh0LXJpZ2h0e3RleHQtYWxpZ246cmlnaHR9LnRleHQtY2VudGVye3RleHQtYWxpZ246Y2VudGVyfS5oaWRle2Rpc3BsYXk6bm9uZX0uaGlkZS1vdmVycmlkZXtkaXNwbGF5Om5vbmUgIWltcG9ydGFudH0uaGlnaGxpZ2h0e2JhY2tncm91bmQ6I2ZmOX0jZ29vZ2xlbWFwIGltZyxvYmplY3QsZW1iZWR7bWF4LXdpZHRoOm5vbmV9I21hcF9jYW52YXMgZW1iZWR7bWF4LXdpZHRoOm5vbmV9I21hcF9jYW52YXMgaW1ne21heC13aWR0aDpub25lfSNtYXBfY2FudmFzIG9iamVjdHttYXgtd2lkdGg6bm9uZX1maWd1cmV7bWFyZ2luOjB9Ym9keSxkaXYsZGwsZHQsZGQsdWwsb2wsbGksaDEsaDIsaDMsaDQsaDUsaDYscHJlLGZvcm0scCxibG9ja3F1b3RlLHRoLHRke21hcmdpbjowO3BhZGRpbmc6MDtmb250LXNpemU6MTRweDtkaXJlY3Rpb246bHRyfXB7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MS42O21hcmdpbi1ib3R0b206MTdweH1wLmxlYWR7Zm9udC1zaXplOjE3LjVweDtsaW5lLWhlaWdodDoxLjY7bWFyZ2luLWJvdHRvbToxN3B4fWFzaWRlIHB7Zm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6MS4zNTtmb250LXN0eWxlOml0YWxpY31oMSxoMixoMyxoNCxoNSxoNntmb250LWZhbWlseToiSGVsdmV0aWNhIE5ldWUiLCJIZWx2ZXRpY2EiLEhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zdHlsZTpub3JtYWw7Y29sb3I6IzIyMjt0ZXh0LXJlbmRlcmluZzpvcHRpbWl6ZUxlZ2liaWxpdHk7bGluZS1oZWlnaHQ6MS4xO21hcmdpbi1ib3R0b206MTRweDttYXJnaW4tdG9wOjE0cHh9aDEgc21hbGwsaDIgc21hbGwsaDMgc21hbGwsaDQgc21hbGwsaDUgc21hbGwsaDYgc21hbGx7Zm9udC1zaXplOjYwJTtjb2xvcjojNmY2ZjZmO2xpbmUtaGVpZ2h0OjB9aDF7Zm9udC1zaXplOjQ0cHh9aDJ7Zm9udC1zaXplOjM3cHh9aDN7Zm9udC1zaXplOjI3cHh9aDR7Zm9udC1zaXplOjIzcHh9aDV7Zm9udC1zaXplOjE3cHh9aDZ7Zm9udC1zaXplOjE0cHh9aHJ7Ym9yZGVyOnNvbGlkICNkZGQ7Ym9yZGVyLXdpZHRoOjFweCAwIDA7Y2xlYXI6Ym90aDttYXJnaW46MjJweCAwIDIxcHg7aGVpZ2h0OjB9LnN1YmhlYWRlcntsaW5lLWhlaWdodDoxLjM7Y29sb3I6IzZmNmY2Zjtmb250LXdlaWdodDozMDA7bWFyZ2luLWJvdHRvbToxN3B4fWVtLGl7Zm9udC1zdHlsZTppdGFsaWM7bGluZS1oZWlnaHQ6aW5oZXJpdH1zdHJvbmcsYntmb250LXdlaWdodDpib2xkO2xpbmUtaGVpZ2h0OmluaGVyaXR9c21hbGx7Zm9udC1zaXplOjYwJTtsaW5lLWhlaWdodDppbmhlcml0fWNvZGV7Zm9udC13ZWlnaHQ6Ym9sZDtiYWNrZ3JvdW5kOiNmZjl9dWwsb2wsZGx7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MS42O21hcmdpbi1ib3R0b206MTdweDtsaXN0LXN0eWxlLXBvc2l0aW9uOm91dHNpZGV9dWwgbGkgdWwsdWwgbGkgb2x7bWFyZ2luLWxlZnQ6MjBweDttYXJnaW4tYm90dG9tOjB9dWwuc3F1YXJlLHVsLmNpcmNsZSx1bC5kaXNje21hcmdpbi1sZWZ0OjE3cHh9dWwuc3F1YXJle2xpc3Qtc3R5bGUtdHlwZTpzcXVhcmV9dWwuc3F1YXJlIGxpIHVse2xpc3Qtc3R5bGU6aW5oZXJpdH11bC5jaXJjbGV7bGlzdC1zdHlsZS10eXBlOmNpcmNsZX11bC5jaXJjbGUgbGkgdWx7bGlzdC1zdHlsZTppbmhlcml0fXVsLmRpc2N7bGlzdC1zdHlsZS10eXBlOmRpc2N9dWwuZGlzYyBsaSB1bHtsaXN0LXN0eWxlOmluaGVyaXR9dWwubm8tYnVsbGV0e2xpc3Qtc3R5bGU6bm9uZX11bC5sYXJnZSBsaXtsaW5lLWhlaWdodDoyMXB4fW9se21hcmdpbi1sZWZ0OjIwcHh9b2wgbGkgdWwsb2wgbGkgb2x7bWFyZ2luLWxlZnQ6MjBweDttYXJnaW4tYm90dG9tOjB9YmxvY2txdW90ZSxibG9ja3F1b3RlIHB7bGluZS1oZWlnaHQ6MS41O2NvbG9yOiM2ZjZmNmZ9YmxvY2txdW90ZXttYXJnaW46MCAwIDE3cHg7cGFkZGluZzo5cHggMjBweCAwIDE5cHg7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICNkZGR9YmxvY2txdW90ZSBjaXRle2Rpc3BsYXk6YmxvY2s7Zm9udC1zaXplOjEzcHg7Y29sb3I6IzU1NX1ibG9ja3F1b3RlIGNpdGU6YmVmb3Jle2NvbnRlbnQ6IlwyMDE0IFwwMDIwIn1ibG9ja3F1b3RlIGNpdGUgYSxibG9ja3F1b3RlIGNpdGUgYTp2aXNpdGVke2NvbG9yOiM1NTV9YWJicixhY3Jvbnlte3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtmb250LXNpemU6OTAlO2NvbG9yOiMyMjI7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2RkZDtjdXJzb3I6aGVscH1hYmJye3RleHQtdHJhbnNmb3JtOm5vbmV9LnByaW50LW9ubHl7ZGlzcGxheTpub25lICFpbXBvcnRhbnR9QG1lZGlhIHByaW50eyp7YmFja2dyb3VuZDp0cmFuc3BhcmVudCAhaW1wb3J0YW50O2NvbG9yOmJsYWNrICFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lICFpbXBvcnRhbnQ7dGV4dC1zaGFkb3c6bm9uZSAhaW1wb3J0YW50O2ZpbHRlcjpub25lICFpbXBvcnRhbnQ7LW1zLWZpbHRlcjpub25lICFpbXBvcnRhbnR9YSxhOnZpc2l0ZWR7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX1hW2hyZWZdOmFmdGVye2NvbnRlbnQ6IiAoIiBhdHRyKGhyZWYpICIpIn1hYmJyW3RpdGxlXTphZnRlcntjb250ZW50OiIgKCIgYXR0cih0aXRsZSkgIikifS5pciBhOmFmdGVyLGFbaHJlZl49ImphdmFzY3JpcHQ6Il06YWZ0ZXIsYVtocmVmXj0iIyJdOmFmdGVye2NvbnRlbnQ6IiJ9cHJlLGJsb2NrcXVvdGV7Ym9yZGVyOjFweCBzb2xpZCAjOTk5O3BhZ2UtYnJlYWstaW5zaWRlOmF2b2lkfXRoZWFke2Rpc3BsYXk6dGFibGUtaGVhZGVyLWdyb3VwfXRyLGltZ3twYWdlLWJyZWFrLWluc2lkZTphdm9pZH1pbWd7bWF4LXdpZHRoOjEwMCUgIWltcG9ydGFudH1AcGFnZXttYXJnaW46MC41Y219cCxoMixoM3tvcnBoYW5zOjM7d2lkb3dzOjN9aDIsaDN7cGFnZS1icmVhay1hZnRlcjphdm9pZH0uaGlkZS1vbi1wcmludHtkaXNwbGF5Om5vbmUgIWltcG9ydGFudH0ucHJpbnQtb25seXtkaXNwbGF5OmJsb2NrICFpbXBvcnRhbnR9LmhpZGUtZm9yLXByaW50e2Rpc3BsYXk6bm9uZSAhaW1wb3J0YW50fS5zaG93LWZvci1wcmludHtkaXNwbGF5OmluaGVyaXQgIWltcG9ydGFudH19Zm9ybXttYXJnaW46MCAwIDE5LjQxNjQxcHh9LnJvdyBmb3JtIC5yb3d7bWFyZ2luOjAgLTZweH0ucm93IGZvcm0gLnJvdyAuY29sdW1uLC5yb3cgZm9ybSAucm93IC5jb2x1bW5ze3BhZGRpbmc6MCA2cHh9LnJvdyBmb3JtIC5yb3cuY29sbGFwc2V7bWFyZ2luOjB9LnJvdyBmb3JtIC5yb3cuY29sbGFwc2UgLmNvbHVtbiwucm93IGZvcm0gLnJvdy5jb2xsYXBzZSAuY29sdW1uc3twYWRkaW5nOjB9bGFiZWx7Zm9udC1zaXplOjE0cHg7Y29sb3I6IzRkNGQ0ZDtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjUwMDttYXJnaW4tYm90dG9tOjNweH1sYWJlbC5yaWdodHtmbG9hdDpub25lO3RleHQtYWxpZ246cmlnaHR9bGFiZWwuaW5saW5le2xpbmUtaGVpZ2h0OjMycHg7bWFyZ2luOjAgMCAxMnB4IDB9LnByZWZpeCwucG9zdGZpeHtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6Mjt0ZXh0LWFsaWduOmNlbnRlcjt3aWR0aDoxMDAlO3BhZGRpbmctdG9wOjA7cGFkZGluZy1ib3R0b206MDtoZWlnaHQ6MzJweDtsaW5lLWhlaWdodDozMXB4fWEuYnV0dG9uLnByZWZpeCxhLmJ1dHRvbi5wb3N0Zml4e3BhZGRpbmctbGVmdDowO3BhZGRpbmctcmlnaHQ6MDt0ZXh0LWFsaWduOmNlbnRlcn1zcGFuLnByZWZpeCxzcGFuLnBvc3RmaXh7YmFja2dyb3VuZDojZjJmMmYyO2JvcmRlcjoxcHggc29saWQgI2NjY30ucHJlZml4e2xlZnQ6MnB4Oy1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0OjJweDstd2Via2l0LWJvcmRlci10b3AtbGVmdC1yYWRpdXM6MnB4O2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MnB4Oy1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0OjJweDstd2Via2l0LWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MnB4O2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MnB4O292ZXJmbG93OmhpZGRlbn0ucG9zdGZpeHtyaWdodDoycHg7LW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0OjJweDstd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOjJweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czoycHg7LW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbXJpZ2h0OjJweDstd2Via2l0LWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjJweDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czoycHh9aW5wdXRbdHlwZT0idGV4dCJdLGlucHV0W3R5cGU9InBhc3N3b3JkIl0saW5wdXRbdHlwZT0iZGF0ZSJdLGlucHV0W3R5cGU9ImRhdGV0aW1lIl0saW5wdXRbdHlwZT0iZW1haWwiXSxpbnB1dFt0eXBlPSJudW1iZXIiXSxpbnB1dFt0eXBlPSJzZWFyY2giXSxpbnB1dFt0eXBlPSJ0ZWwiXSxpbnB1dFt0eXBlPSJ0aW1lIl0saW5wdXRbdHlwZT0idXJsIl0sdGV4dGFyZWF7YmFja2dyb3VuZC1jb2xvcjojZmZmO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Ym9yZGVyOjFweCBzb2xpZCAjY2NjOy13ZWJraXQtYm9yZGVyLXJhZGl1czoycHg7LW1vei1ib3JkZXItcmFkaXVzOjJweDstbXMtYm9yZGVyLXJhZGl1czoycHg7LW8tYm9yZGVyLXJhZGl1czoycHg7Ym9yZGVyLXJhZGl1czoycHg7LXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDJweCByZ2JhKDAsMCwwLDAuMSk7LW1vei1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDJweCByZ2JhKDAsMCwwLDAuMSk7Ym94LXNoYWRvdzppbnNldCAwIDFweCAycHggcmdiYSgwLDAsMCwwLjEpO2NvbG9yOnJnYmEoMCwwLDAsMC43NSk7ZGlzcGxheTpibG9jaztmb250LXNpemU6MTRweDttYXJnaW46MCAwIDEycHggMDtwYWRkaW5nOjZweDtoZWlnaHQ6MzJweDt3aWR0aDoxMDAlOy13ZWJraXQtdHJhbnNpdGlvbjphbGwgMC4xNXMgbGluZWFyOy1tb3otdHJhbnNpdGlvbjphbGwgMC4xNXMgbGluZWFyOy1vLXRyYW5zaXRpb246YWxsIDAuMTVzIGxpbmVhcjt0cmFuc2l0aW9uOmFsbCAwLjE1cyBsaW5lYXJ9aW5wdXRbdHlwZT0idGV4dCJdLm92ZXJzaXplLGlucHV0W3R5cGU9InBhc3N3b3JkIl0ub3ZlcnNpemUsaW5wdXRbdHlwZT0iZGF0ZSJdLm92ZXJzaXplLGlucHV0W3R5cGU9ImRhdGV0aW1lIl0ub3ZlcnNpemUsaW5wdXRbdHlwZT0iZW1haWwiXS5vdmVyc2l6ZSxpbnB1dFt0eXBlPSJudW1iZXIiXS5vdmVyc2l6ZSxpbnB1dFt0eXBlPSJzZWFyY2giXS5vdmVyc2l6ZSxpbnB1dFt0eXBlPSJ0ZWwiXS5vdmVyc2l6ZSxpbnB1dFt0eXBlPSJ0aW1lIl0ub3ZlcnNpemUsaW5wdXRbdHlwZT0idXJsIl0ub3ZlcnNpemUsdGV4dGFyZWEub3ZlcnNpemV7Zm9udC1zaXplOjE3cHg7cGFkZGluZzo0cHggNnB4fWlucHV0W3R5cGU9InRleHQiXTpmb2N1cyxpbnB1dFt0eXBlPSJwYXNzd29yZCJdOmZvY3VzLGlucHV0W3R5cGU9ImRhdGUiXTpmb2N1cyxpbnB1dFt0eXBlPSJkYXRldGltZSJdOmZvY3VzLGlucHV0W3R5cGU9ImVtYWlsIl06Zm9jdXMsaW5wdXRbdHlwZT0ibnVtYmVyIl06Zm9jdXMsaW5wdXRbdHlwZT0ic2VhcmNoIl06Zm9jdXMsaW5wdXRbdHlwZT0idGVsIl06Zm9jdXMsaW5wdXRbdHlwZT0idGltZSJdOmZvY3VzLGlucHV0W3R5cGU9InVybCJdOmZvY3VzLHRleHRhcmVhOmZvY3Vze2JhY2tncm91bmQ6I2ZhZmFmYTtib3JkZXItY29sb3I6I2IzYjNiM31pbnB1dFt0eXBlPSJ0ZXh0Il1bZGlzYWJsZWRdLGlucHV0W3R5cGU9InBhc3N3b3JkIl1bZGlzYWJsZWRdLGlucHV0W3R5cGU9ImRhdGUiXVtkaXNhYmxlZF0saW5wdXRbdHlwZT0iZGF0ZXRpbWUiXVtkaXNhYmxlZF0saW5wdXRbdHlwZT0iZW1haWwiXVtkaXNhYmxlZF0saW5wdXRbdHlwZT0ibnVtYmVyIl1bZGlzYWJsZWRdLGlucHV0W3R5cGU9InNlYXJjaCJdW2Rpc2FibGVkXSxpbnB1dFt0eXBlPSJ0ZWwiXVtkaXNhYmxlZF0saW5wdXRbdHlwZT0idGltZSJdW2Rpc2FibGVkXSxpbnB1dFt0eXBlPSJ1cmwiXVtkaXNhYmxlZF0sdGV4dGFyZWFbZGlzYWJsZWRde2JhY2tncm91bmQtY29sb3I6I2RkZH10ZXh0YXJlYXtoZWlnaHQ6YXV0b31zZWxlY3R7d2lkdGg6MTAwJX1maWVsZHNldHtib3JkZXI6c29saWQgMXB4ICNkZGQ7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjNweDstbW96LWJvcmRlci1yYWRpdXM6M3B4Oy1tcy1ib3JkZXItcmFkaXVzOjNweDstby1ib3JkZXItcmFkaXVzOjNweDtib3JkZXItcmFkaXVzOjNweDtwYWRkaW5nOjEycHg7bWFyZ2luOjE4cHggMH1maWVsZHNldCBsZWdlbmR7Zm9udC13ZWlnaHQ6Ym9sZDtiYWNrZ3JvdW5kOiNmZmY7cGFkZGluZzowIDNweDttYXJnaW46MDttYXJnaW4tbGVmdDotM3B4fS5lcnJvciBpbnB1dCxpbnB1dC5lcnJvciwuZXJyb3IgdGV4dGFyZWEsdGV4dGFyZWEuZXJyb3IsLmVycm9yIGlucHV0OmZvY3VzLGlucHV0LmVycm9yOmZvY3VzLC5lcnJvciB0ZXh0YXJlYTpmb2N1cyx0ZXh0YXJlYS5lcnJvcjpmb2N1c3tib3JkZXItY29sb3I6I2M2MGYxMztiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMTk4LDE1LDE5LDAuMSl9LmVycm9yIGlucHV0OmZvY3VzLGlucHV0LmVycm9yOmZvY3VzLC5lcnJvciB0ZXh0YXJlYTpmb2N1cyx0ZXh0YXJlYS5lcnJvcjpmb2N1c3tvdXRsaW5lLWNvbG9yOiNmNTc5N2N9LmVycm9yIGxhYmVsLGxhYmVsLmVycm9ye2NvbG9yOiNjNjBmMTN9LmVycm9yIHNtYWxsLHNtYWxsLmVycm9ye2Rpc3BsYXk6YmxvY2s7cGFkZGluZzo2cHggNHB4O21hcmdpbi10b3A6LTEzcHg7bWFyZ2luLWJvdHRvbToxMnB4O2JhY2tncm91bmQ6I2M2MGYxMztjb2xvcjojZmZmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OmJvbGQ7LW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbWxlZnQ6MnB4Oy13ZWJraXQtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czoycHg7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czoycHg7LW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbXJpZ2h0OjJweDstd2Via2l0LWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjJweDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czoycHh9Zm9ybS5jdXN0b20gc3Bhbi5jdXN0b217ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTZweDtoZWlnaHQ6MTZweDtwb3NpdGlvbjpyZWxhdGl2ZTt0b3A6MnB4O2JvcmRlcjpzb2xpZCAxcHggI2NjYztiYWNrZ3JvdW5kOiNmZmZ9Zm9ybS5jdXN0b20gc3Bhbi5jdXN0b20ucmFkaW97LXdlYmtpdC1ib3JkZXItcmFkaXVzOjEwMHB4Oy1tb3otYm9yZGVyLXJhZGl1czoxMDBweDstbXMtYm9yZGVyLXJhZGl1czoxMDBweDstby1ib3JkZXItcmFkaXVzOjEwMHB4O2JvcmRlci1yYWRpdXM6MTAwcHh9Zm9ybS5jdXN0b20gc3Bhbi5jdXN0b20uY2hlY2tib3g6YmVmb3Jle2NvbnRlbnQ6IiI7ZGlzcGxheTpibG9jaztsaW5lLWhlaWdodDowLjg7aGVpZ2h0OjE0cHg7d2lkdGg6MTRweDt0ZXh0LWFsaWduOmNlbnRlcjtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7Zm9udC1zaXplOjE0cHg7Y29sb3I6I2ZmZn1mb3JtLmN1c3RvbSBzcGFuLmN1c3RvbS5yYWRpby5jaGVja2VkOmJlZm9yZXtjb250ZW50OiIiO2Rpc3BsYXk6YmxvY2s7d2lkdGg6OHB4O2hlaWdodDo4cHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjEwMHB4Oy1tb3otYm9yZGVyLXJhZGl1czoxMDBweDstbXMtYm9yZGVyLXJhZGl1czoxMDBweDstby1ib3JkZXItcmFkaXVzOjEwMHB4O2JvcmRlci1yYWRpdXM6MTAwcHg7YmFja2dyb3VuZDojMjIyO3Bvc2l0aW9uOnJlbGF0aXZlO3RvcDozcHg7bGVmdDozcHh9Zm9ybS5jdXN0b20gc3Bhbi5jdXN0b20uY2hlY2tib3guY2hlY2tlZDpiZWZvcmV7Y29udGVudDoiXDAwZDciO2NvbG9yOiMyMjJ9Zm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93bntkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOmF1dG87aGVpZ2h0OjI4cHg7bWFyZ2luLWJvdHRvbTo5cHg7bWFyZ2luLXRvcDoycHh9Zm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93biB1bHtvdmVyZmxvdy15OmF1dG87bWF4LWhlaWdodDoyMDBweH1mb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duIGEuY3VycmVudHtkaXNwbGF5OmJsb2NrO3dpZHRoOmF1dG87bGluZS1oZWlnaHQ6MjZweDttaW4taGVpZ2h0OjI4cHg7cGFkZGluZzowO3BhZGRpbmctbGVmdDo2cHg7cGFkZGluZy1yaWdodDozOHB4O2JvcmRlcjpzb2xpZCAxcHggI2RkZDtjb2xvcjojMTQxNDE0O2JhY2tncm91bmQtY29sb3I6I2ZmZjt3aGl0ZS1zcGFjZTpub3dyYXB9Zm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93biBhLnNlbGVjdG9ye3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjI3cHg7aGVpZ2h0OjI4cHg7ZGlzcGxheTpibG9jaztyaWdodDowO3RvcDowO2JvcmRlcjpzb2xpZCAxcHggI2RkZH1mb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duIGEuc2VsZWN0b3I6YWZ0ZXJ7Y29udGVudDoiIjtkaXNwbGF5OmJsb2NrO2NvbnRlbnQ6IiI7ZGlzcGxheTpibG9jazt3aWR0aDowO2hlaWdodDowO2JvcmRlcjpzb2xpZCA1cHg7Ym9yZGVyLWNvbG9yOiNhYWEgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7cG9zaXRpb246YWJzb2x1dGU7bGVmdDo1MCU7dG9wOjUwJTttYXJnaW4tdG9wOi0ycHg7bWFyZ2luLWxlZnQ6LTVweH1mb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duOmhvdmVyIGEuc2VsZWN0b3I6YWZ0ZXIsZm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93bi5vcGVuIGEuc2VsZWN0b3I6YWZ0ZXJ7Y29udGVudDoiIjtkaXNwbGF5OmJsb2NrO3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyOnNvbGlkIDVweDtib3JkZXItY29sb3I6IzIyMiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudH1mb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duLm9wZW4gdWx7ZGlzcGxheTpibG9jazt6LWluZGV4OjEwfWZvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24uc21hbGx7d2lkdGg6MTM0cHggIWltcG9ydGFudH1mb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duLm1lZGl1bXt3aWR0aDoyNTRweCAhaW1wb3J0YW50fWZvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24ubGFyZ2V7d2lkdGg6NDM0cHggIWltcG9ydGFudH1mb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duLmV4cGFuZHt3aWR0aDoxMDAlICFpbXBvcnRhbnR9Zm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93bi5vcGVuLnNtYWxsIHVse3dpZHRoOjEzNHB4ICFpbXBvcnRhbnR9Zm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93bi5vcGVuLm1lZGl1bSB1bHt3aWR0aDoyNTRweCAhaW1wb3J0YW50fWZvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24ub3Blbi5sYXJnZSB1bHt3aWR0aDo0MzRweCAhaW1wb3J0YW50fWZvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24ub3Blbi5leHBhbmQgdWx7d2lkdGg6MTAwJSAhaW1wb3J0YW50fWZvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24gdWx7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6YXV0bztkaXNwbGF5Om5vbmU7bWFyZ2luOjA7bGVmdDowO3RvcDoyN3B4O21hcmdpbjowO3BhZGRpbmc6MDtiYWNrZ3JvdW5kOiNmZmY7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LDAuOTUpO2JvcmRlcjpzb2xpZCAxcHggI2NjY31mb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duIHVsIGxpe2NvbG9yOiM1NTU7Zm9udC1zaXplOjEzcHg7Y3Vyc29yOnBvaW50ZXI7cGFkZGluZzozcHg7cGFkZGluZy1sZWZ0OjZweDtwYWRkaW5nLXJpZ2h0OjM4cHg7bWluLWhlaWdodDoxOHB4O2xpbmUtaGVpZ2h0OjE4cHg7bWFyZ2luOjA7d2hpdGUtc3BhY2U6bm93cmFwO2xpc3Qtc3R5bGU6bm9uZX1mb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duIHVsIGxpLnNlbGVjdGVke2JhY2tncm91bmQ6I2NkZWJmNTtjb2xvcjojMDAwfWZvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24gdWwgbGkuc2VsZWN0ZWQ6YWZ0ZXJ7Y29udGVudDoiXDIwMTMiO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjEwcHh9Zm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93biB1bCBsaTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNjZGViZjU7Y29sb3I6IzAwMH1mb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duIHVsIGxpOmhvdmVyOmFmdGVye2NvbnRlbnQ6IlwyMDEzIjtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDoxMHB4O2NvbG9yOiNhM2RiZWN9Zm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93biB1bCBsaS5zZWxlY3RlZDpob3ZlcntiYWNrZ3JvdW5kOiNjZGViZjU7Y3Vyc29yOmRlZmF1bHQ7Y29sb3I6IzAwMH1mb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duIHVsIGxpLnNlbGVjdGVkOmhvdmVyOmFmdGVye2NvbG9yOiMwMDB9Zm9ybS5jdXN0b20gZGl2LmN1c3RvbS5kcm9wZG93biB1bC5zaG93e2Rpc3BsYXk6YmxvY2t9Zm9ybS5jdXN0b20gLmN1c3RvbS5kaXNhYmxlZHtiYWNrZ3JvdW5kLWNvbG9yOiNkZGR9QC1tb3otZG9jdW1lbnQgdXJsLXByZWZpeCgpe2Zvcm0uY3VzdG9tIGRpdi5jdXN0b20uZHJvcGRvd24gYS5zZWxlY3RvcntoZWlnaHQ6MjhweH19Lmx0LWllOSBmb3JtLmN1c3RvbSBkaXYuY3VzdG9tLmRyb3Bkb3duIGEuc2VsZWN0b3J7aGVpZ2h0OjI4cHh9LnJvd3t3aWR0aDo5NDBweDttYXgtd2lkdGg6MTAwJTttaW4td2lkdGg6NzY4cHg7bWFyZ2luOjAgYXV0b30ucm93IC5yb3d7d2lkdGg6YXV0bzttYXgtd2lkdGg6bm9uZTttaW4td2lkdGg6MDttYXJnaW46MCAtMTVweH0ucm93LmNvbGxhcHNlIC5jb2x1bW4sLnJvdy5jb2xsYXBzZSAuY29sdW1uc3twYWRkaW5nOjB9LnJvdyAucm93e3dpZHRoOmF1dG87bWF4LXdpZHRoOm5vbmU7bWluLXdpZHRoOjA7bWFyZ2luOjAgLTE1cHh9LnJvdyAucm93LmNvbGxhcHNle21hcmdpbjowfS5jb2x1bW4sLmNvbHVtbnN7ZmxvYXQ6bGVmdDttaW4taGVpZ2h0OjFweDtwYWRkaW5nOjAgMTVweDtwb3NpdGlvbjpyZWxhdGl2ZX0uY29sdW1uLmNlbnRlcmVkLC5jb2x1bW5zLmNlbnRlcmVke2Zsb2F0Om5vbmU7bWFyZ2luOjAgYXV0b31bY2xhc3MqPSJjb2x1bW4iXStbY2xhc3MqPSJjb2x1bW4iXTpsYXN0LWNoaWxke2Zsb2F0OnJpZ2h0fVtjbGFzcyo9ImNvbHVtbiJdK1tjbGFzcyo9ImNvbHVtbiJdLmVuZHtmbG9hdDpsZWZ0fS5vbmUsLnJvdyAub25le3dpZHRoOjguMzMzMzMlfS50d28sLnJvdyAudHdve3dpZHRoOjE2LjY2NjY3JX0udGhyZWUsLnJvdyAudGhyZWV7d2lkdGg6MjUlfS5mb3VyLC5yb3cgLmZvdXJ7d2lkdGg6MzMuMzMzMzMlfS5maXZlLC5yb3cgLmZpdmV7d2lkdGg6NDEuNjY2NjclfS5zaXgsLnJvdyAuc2l4e3dpZHRoOjUwJX0uc2V2ZW4sLnJvdyAuc2V2ZW57d2lkdGg6NTguMzMzMzMlfS5laWdodCwucm93IC5laWdodHt3aWR0aDo2Ni42NjY2NyV9Lm5pbmUsLnJvdyAubmluZXt3aWR0aDo3NSV9LnRlbiwucm93IC50ZW57d2lkdGg6ODMuMzMzMzMlfS5lbGV2ZW4sLnJvdyAuZWxldmVue3dpZHRoOjkxLjY2NjY3JX0udHdlbHZlLC5yb3cgLnR3ZWx2ZXt3aWR0aDoxMDAlfS5yb3cgLm9mZnNldC1ieS1vbmV7bWFyZ2luLWxlZnQ6OC4zMzMzMyV9LnJvdyAub2Zmc2V0LWJ5LXR3b3ttYXJnaW4tbGVmdDoxNi42NjY2NyV9LnJvdyAub2Zmc2V0LWJ5LXRocmVle21hcmdpbi1sZWZ0OjI1JX0ucm93IC5vZmZzZXQtYnktZm91cnttYXJnaW4tbGVmdDozMy4zMzMzMyV9LnJvdyAub2Zmc2V0LWJ5LWZpdmV7bWFyZ2luLWxlZnQ6NDEuNjY2NjclfS5yb3cgLm9mZnNldC1ieS1zaXh7bWFyZ2luLWxlZnQ6NTAlfS5yb3cgLm9mZnNldC1ieS1zZXZlbnttYXJnaW4tbGVmdDo1OC4zMzMzMyV9LnJvdyAub2Zmc2V0LWJ5LWVpZ2h0e21hcmdpbi1sZWZ0OjY2LjY2NjY3JX0ucm93IC5vZmZzZXQtYnktbmluZXttYXJnaW4tbGVmdDo3NSV9LnJvdyAub2Zmc2V0LWJ5LXRlbnttYXJnaW4tbGVmdDo4My4zMzMzMyV9LnB1c2gtdHdve2xlZnQ6MTYuNjY2NjclfS5wdWxsLXR3b3tyaWdodDoxNi42NjY2NyV9LnB1c2gtdGhyZWV7bGVmdDoyNSV9LnB1bGwtdGhyZWV7cmlnaHQ6MjUlfS5wdXNoLWZvdXJ7bGVmdDozMy4zMzMzMyV9LnB1bGwtZm91cntyaWdodDozMy4zMzMzMyV9LnB1c2gtZml2ZXtsZWZ0OjQxLjY2NjY3JX0ucHVsbC1maXZle3JpZ2h0OjQxLjY2NjY3JX0ucHVzaC1zaXh7bGVmdDo1MCV9LnB1bGwtc2l4e3JpZ2h0OjUwJX0ucHVzaC1zZXZlbntsZWZ0OjU4LjMzMzMzJX0ucHVsbC1zZXZlbntyaWdodDo1OC4zMzMzMyV9LnB1c2gtZWlnaHR7bGVmdDo2Ni42NjY2NyV9LnB1bGwtZWlnaHR7cmlnaHQ6NjYuNjY2NjclfS5wdXNoLW5pbmV7bGVmdDo3NSV9LnB1bGwtbmluZXtyaWdodDo3NSV9LnB1c2gtdGVue2xlZnQ6ODMuMzMzMzMlfS5wdWxsLXRlbntyaWdodDo4My4zMzMzMyV9aW1ne2hlaWdodDphdXRvfWltZyxvYmplY3QsZW1iZWR7bWF4LXdpZHRoOjEwMCV9aW1ney1tcy1pbnRlcnBvbGF0aW9uLW1vZGU6YmljdWJpY30jbWFwX2NhbnZhcyBpbWcsLm1hcF9jYW52YXMgaW1ne21heC13aWR0aDpub25lIWltcG9ydGFudH0ucm93eyp6b29tOjF9LnJvdzpiZWZvcmUsLnJvdzphZnRlcntjb250ZW50OiIgIjtkaXNwbGF5OnRhYmxlfS5yb3c6YWZ0ZXJ7Y2xlYXI6Ym90aH0uYmxvY2stZ3JpZHtkaXNwbGF5OmJsb2NrO292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjB9LmJsb2NrLWdyaWQ+bGl7ZGlzcGxheTpibG9jaztoZWlnaHQ6YXV0bztmbG9hdDpsZWZ0fS5ibG9jay1ncmlkLm9uZS11cHttYXJnaW46MH0uYmxvY2stZ3JpZC5vbmUtdXA+bGl7d2lkdGg6MTAwJTtwYWRkaW5nOjAgMCAxNXB4fS5ibG9jay1ncmlkLnR3by11cHttYXJnaW46MCAtMTVweH0uYmxvY2stZ3JpZC50d28tdXA+bGl7d2lkdGg6NTAlO3BhZGRpbmc6MCAxNXB4IDE1cHh9LmJsb2NrLWdyaWQudHdvLXVwPmxpOm50aC1jaGlsZCgybisxKXtjbGVhcjpib3RofS5ibG9jay1ncmlkLnRocmVlLXVwe21hcmdpbjowIC0xMnB4fS5ibG9jay1ncmlkLnRocmVlLXVwPmxpe3dpZHRoOjMzLjMzMzMzJTtwYWRkaW5nOjAgMTJweCAxMnB4fS5ibG9jay1ncmlkLnRocmVlLXVwPmxpOm50aC1jaGlsZCgzbisxKXtjbGVhcjpib3RofS5ibG9jay1ncmlkLmZvdXItdXB7bWFyZ2luOjAgLTEwcHh9LmJsb2NrLWdyaWQuZm91ci11cD5saXt3aWR0aDoyNSU7cGFkZGluZzowIDEwcHggMTBweH0uYmxvY2stZ3JpZC5mb3VyLXVwPmxpOm50aC1jaGlsZCg0bisxKXtjbGVhcjpib3RofS5ibG9jay1ncmlkLmZpdmUtdXB7bWFyZ2luOjAgLThweH0uYmxvY2stZ3JpZC5maXZlLXVwPmxpe3dpZHRoOjIwJTtwYWRkaW5nOjAgOHB4IDhweH0uYmxvY2stZ3JpZC5maXZlLXVwPmxpOm50aC1jaGlsZCg1bisxKXtjbGVhcjpib3RofS5ibG9jay1ncmlkLnNpeC11cHttYXJnaW46MCAtOHB4fS5ibG9jay1ncmlkLnNpeC11cD5saXt3aWR0aDoxNi42NjY2NyU7cGFkZGluZzowIDhweCA4cHh9LmJsb2NrLWdyaWQuc2l4LXVwPmxpOm50aC1jaGlsZCg2bisxKXtjbGVhcjpib3RofS5ibG9jay1ncmlkLnNldmVuLXVwe21hcmdpbjowIC04cHh9LmJsb2NrLWdyaWQuc2V2ZW4tdXA+bGl7d2lkdGg6MTQuMjg1NzElO3BhZGRpbmc6MCA4cHggOHB4fS5ibG9jay1ncmlkLnNldmVuLXVwPmxpOm50aC1jaGlsZCg3bisxKXtjbGVhcjpib3RofS5ibG9jay1ncmlkLmVpZ2h0LXVwe21hcmdpbjowIC04cHh9LmJsb2NrLWdyaWQuZWlnaHQtdXA+bGl7d2lkdGg6MTIuNSU7cGFkZGluZzowIDhweCA4cHh9LmJsb2NrLWdyaWQuZWlnaHQtdXA+bGk6bnRoLWNoaWxkKDhuKzEpe2NsZWFyOmJvdGh9LmJsb2NrLWdyaWQubmluZS11cHttYXJnaW46MCAtOHB4fS5ibG9jay1ncmlkLm5pbmUtdXA+bGl7d2lkdGg6MTEuMTExMTElO3BhZGRpbmc6MCA4cHggOHB4fS5ibG9jay1ncmlkLm5pbmUtdXA+bGk6bnRoLWNoaWxkKDluKzEpe2NsZWFyOmJvdGh9LmJsb2NrLWdyaWQudGVuLXVwe21hcmdpbjowIC04cHh9LmJsb2NrLWdyaWQudGVuLXVwPmxpe3dpZHRoOjEwJTtwYWRkaW5nOjAgOHB4IDhweH0uYmxvY2stZ3JpZC50ZW4tdXA+bGk6bnRoLWNoaWxkKDEwbisxKXtjbGVhcjpib3RofS5ibG9jay1ncmlkLmVsZXZlbi11cHttYXJnaW46MCAtOHB4fS5ibG9jay1ncmlkLmVsZXZlbi11cD5saXt3aWR0aDo5LjA5MDkxJTtwYWRkaW5nOjAgOHB4IDhweH0uYmxvY2stZ3JpZC5lbGV2ZW4tdXA+bGk6bnRoLWNoaWxkKDExbisxKXtjbGVhcjpib3RofS5ibG9jay1ncmlkLnR3ZWx2ZS11cHttYXJnaW46MCAtOHB4fS5ibG9jay1ncmlkLnR3ZWx2ZS11cD5saXt3aWR0aDo4LjMzMzMzJTtwYWRkaW5nOjAgOHB4IDhweH0uYmxvY2stZ3JpZC50d2VsdmUtdXA+bGk6bnRoLWNoaWxkKDEybisxKXtjbGVhcjpib3RofS5idXR0b257d2lkdGg6YXV0bztiYWNrZ3JvdW5kOiMyYmE2Y2I7Ym9yZGVyOjFweCBzb2xpZCAjMWU3MjhjOy13ZWJraXQtYm94LXNoYWRvdzowIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsMC41KSBpbnNldDstbW96LWJveC1zaGFkb3c6MCAxcHggMCByZ2JhKDI1NSwyNTUsMjU1LDAuNSkgaW5zZXQ7Ym94LXNoYWRvdzowIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsMC41KSBpbnNldDtjb2xvcjojZmZmO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6Ym9sZDtsaW5lLWhlaWdodDoxO21hcmdpbjowO3BhZGRpbmc6MTBweCAyMHB4IDExcHg7cG9zaXRpb246cmVsYXRpdmU7dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC1kZWNvcmF0aW9uOm5vbmU7LXdlYmtpdC10cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgMC4xNXMgZWFzZS1pbi1vdXQ7LW1vei10cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgMC4xNXMgZWFzZS1pbi1vdXQ7LW8tdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0O3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciAwLjE1cyBlYXNlLWluLW91dH0uYnV0dG9uOmhvdmVyLC5idXR0b246Zm9jdXN7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMyMjg0YTF9LmJ1dHRvbjphY3RpdmV7LXdlYmtpdC1ib3gtc2hhZG93OjAgMXB4IDAgcmdiYSgwLDAsMCwwLjIpIGluc2V0Oy1tb3otYm94LXNoYWRvdzowIDFweCAwIHJnYmEoMCwwLDAsMC4yKSBpbnNldDtib3gtc2hhZG93OjAgMXB4IDAgcmdiYSgwLDAsMCwwLjIpIGluc2V0fS5idXR0b24ubGFyZ2V7Zm9udC1zaXplOjE3cHg7cGFkZGluZzoxNXB4IDMwcHggMTZweH0uYnV0dG9uLm1lZGl1bXtmb250LXNpemU6MTRweH0uYnV0dG9uLnNtYWxse2ZvbnQtc2l6ZToxMXB4O3BhZGRpbmc6N3B4IDE0cHggOHB4fS5idXR0b24udGlueXtmb250LXNpemU6MTBweDtwYWRkaW5nOjVweCAxMHB4IDZweH0uYnV0dG9uLmV4cGFuZHt3aWR0aDoxMDAlO3RleHQtYWxpZ246Y2VudGVyfS5idXR0b24ucHJpbWFyeXtiYWNrZ3JvdW5kLWNvbG9yOiMyYmE2Y2I7Ym9yZGVyOjFweCBzb2xpZCAjMWU3MjhjfS5idXR0b24ucHJpbWFyeTpob3ZlciwuYnV0dG9uLnByaW1hcnk6Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjojMjI4NGExfS5idXR0b24uc3VjY2Vzc3tiYWNrZ3JvdW5kLWNvbG9yOiM1ZGE0MjM7Ym9yZGVyOjFweCBzb2xpZCAjMzk2NTE2fS5idXR0b24uc3VjY2Vzczpob3ZlciwuYnV0dG9uLnN1Y2Nlc3M6Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjojNDU3YTFhfS5idXR0b24uYWxlcnR7YmFja2dyb3VuZC1jb2xvcjojYzYwZjEzO2JvcmRlcjoxcHggc29saWQgIzdmMGEwY30uYnV0dG9uLmFsZXJ0OmhvdmVyLC5idXR0b24uYWxlcnQ6Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjojOTcwYjBlfS5idXR0b24uc2Vjb25kYXJ5e2JhY2tncm91bmQtY29sb3I6I2U5ZTllOTtjb2xvcjojMWQxZDFkO2JvcmRlcjoxcHggc29saWQgI2MzYzNjM30uYnV0dG9uLnNlY29uZGFyeTpob3ZlciwuYnV0dG9uLnNlY29uZGFyeTpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOiNkMGQwZDB9LmJ1dHRvbi5yYWRpdXN7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjNweDstbW96LWJvcmRlci1yYWRpdXM6M3B4Oy1tcy1ib3JkZXItcmFkaXVzOjNweDstby1ib3JkZXItcmFkaXVzOjNweDtib3JkZXItcmFkaXVzOjNweH0uYnV0dG9uLnJvdW5key13ZWJraXQtYm9yZGVyLXJhZGl1czoxMDAwcHg7LW1vei1ib3JkZXItcmFkaXVzOjEwMDBweDstbXMtYm9yZGVyLXJhZGl1czoxMDAwcHg7LW8tYm9yZGVyLXJhZGl1czoxMDAwcHg7Ym9yZGVyLXJhZGl1czoxMDAwcHh9LmJ1dHRvbi5mdWxsLXdpZHRoe3dpZHRoOjEwMCU7dGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZy1sZWZ0OjBweCAhaW1wb3J0YW50O3BhZGRpbmctcmlnaHQ6MHB4ICFpbXBvcnRhbnR9LmJ1dHRvbi5sZWZ0LWFsaWdue3RleHQtYWxpZ246bGVmdDt0ZXh0LWluZGVudDoxMnB4fS5idXR0b24uZGlzYWJsZWQsLmJ1dHRvbltkaXNhYmxlZF17b3BhY2l0eTowLjY7Y3Vyc29yOmRlZmF1bHQ7YmFja2dyb3VuZDojMmJhNmNiOy13ZWJraXQtYm94LXNoYWRvdzpub25lOy1tb3otYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0uYnV0dG9uLmRpc2FibGVkOmhvdmVyLC5idXR0b25bZGlzYWJsZWRdOmhvdmVye2JhY2tncm91bmQ6IzJiYTZjYn0uYnV0dG9uLmRpc2FibGVkLnN1Y2Nlc3MsLmJ1dHRvbltkaXNhYmxlZF0uc3VjY2Vzc3tiYWNrZ3JvdW5kLWNvbG9yOiM1ZGE0MjN9LmJ1dHRvbi5kaXNhYmxlZC5zdWNjZXNzOmhvdmVyLC5idXR0b24uZGlzYWJsZWQuc3VjY2Vzczpmb2N1cywuYnV0dG9uW2Rpc2FibGVkXS5zdWNjZXNzOmhvdmVyLC5idXR0b25bZGlzYWJsZWRdLnN1Y2Nlc3M6Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjojNWRhNDIzO291dGxpbmU6bm9uZX0uYnV0dG9uLmRpc2FibGVkLmFsZXJ0LC5idXR0b25bZGlzYWJsZWRdLmFsZXJ0e2JhY2tncm91bmQtY29sb3I6I2M2MGYxM30uYnV0dG9uLmRpc2FibGVkLmFsZXJ0OmhvdmVyLC5idXR0b24uZGlzYWJsZWQuYWxlcnQ6Zm9jdXMsLmJ1dHRvbltkaXNhYmxlZF0uYWxlcnQ6aG92ZXIsLmJ1dHRvbltkaXNhYmxlZF0uYWxlcnQ6Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjojYzYwZjEzO291dGxpbmU6bm9uZX0uYnV0dG9uLmRpc2FibGVkLnNlY29uZGFyeSwuYnV0dG9uW2Rpc2FibGVkXS5zZWNvbmRhcnl7YmFja2dyb3VuZC1jb2xvcjojZTllOWU5fS5idXR0b24uZGlzYWJsZWQuc2Vjb25kYXJ5OmhvdmVyLC5idXR0b24uZGlzYWJsZWQuc2Vjb25kYXJ5OmZvY3VzLC5idXR0b25bZGlzYWJsZWRdLnNlY29uZGFyeTpob3ZlciwuYnV0dG9uW2Rpc2FibGVkXS5zZWNvbmRhcnk6Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjojZTllOWU5O291dGxpbmU6bm9uZX1pbnB1dFt0eXBlPXN1Ym1pdF0uYnV0dG9uLGJ1dHRvbi5idXR0b257LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmV9QC1tb3otZG9jdW1lbnQgdXJsLXByZWZpeCgpe2J1dHRvbjo6LW1vei1mb2N1cy1pbm5lcixpbnB1dFt0eXBlPSJyZXNldCJdOjotbW96LWZvY3VzLWlubmVyLGlucHV0W3R5cGU9ImJ1dHRvbiJdOjotbW96LWZvY3VzLWlubmVyLGlucHV0W3R5cGU9InN1Ym1pdCJdOjotbW96LWZvY3VzLWlubmVyLGlucHV0W3R5cGU9ImZpbGUiXT5pbnB1dFt0eXBlPSJidXR0b24iXTo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6bm9uZTtwYWRkaW5nOjB9aW5wdXRbdHlwZT0ic3VibWl0Il0udGlueS5idXR0b257cGFkZGluZzozcHggMTBweCA0cHh9aW5wdXRbdHlwZT0ic3VibWl0Il0uc21hbGwuYnV0dG9ue3BhZGRpbmc6NXB4IDE0cHggNnB4fWlucHV0W3R5cGU9InN1Ym1pdCJdLmJ1dHRvbixpbnB1dFt0eXBlPXN1Ym1pdF0ubWVkaXVtLmJ1dHRvbntwYWRkaW5nOjhweCAyMHB4IDlweH1pbnB1dFt0eXBlPSJzdWJtaXQiXS5sYXJnZS5idXR0b257cGFkZGluZzoxM3B4IDMwcHggMTRweH19LmJ1dHRvbi5kcm9wZG93bntwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nLXJpZ2h0OjQ0cHh9LmJ1dHRvbi5kcm9wZG93bi5sYXJnZXtwYWRkaW5nLXJpZ2h0OjYwcHh9LmJ1dHRvbi5kcm9wZG93bi5zbWFsbHtwYWRkaW5nLXJpZ2h0OjI4cHh9LmJ1dHRvbi5kcm9wZG93bi50aW55e3BhZGRpbmctcmlnaHQ6MjBweH0uYnV0dG9uLmRyb3Bkb3duOmFmdGVye2NvbnRlbnQ6IiI7ZGlzcGxheTpibG9jazt3aWR0aDowO2hlaWdodDowO2JvcmRlcjpzb2xpZCA2cHg7Ym9yZGVyLWNvbG9yOiNmZmYgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTtyaWdodDoyMHB4O21hcmdpbi10b3A6LTJweH0uYnV0dG9uLmRyb3Bkb3duLmxhcmdlOmFmdGVye2NvbnRlbnQ6IiI7ZGlzcGxheTpibG9jazt3aWR0aDowO2hlaWdodDowO2JvcmRlcjpzb2xpZCA3cHg7Ym9yZGVyLWNvbG9yOiNmZmYgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7bWFyZ2luLXRvcDotM3B4O3JpZ2h0OjMwcHh9LmJ1dHRvbi5kcm9wZG93bi5zbWFsbDphZnRlcntjb250ZW50OiIiO2Rpc3BsYXk6YmxvY2s7d2lkdGg6MDtoZWlnaHQ6MDtib3JkZXI6c29saWQgNXB4O2JvcmRlci1jb2xvcjojZmZmIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O21hcmdpbi10b3A6LTJweDtyaWdodDoxNHB4fS5idXR0b24uZHJvcGRvd24udGlueTphZnRlcntjb250ZW50OiIiO2Rpc3BsYXk6YmxvY2s7d2lkdGg6MDtoZWlnaHQ6MDtib3JkZXI6c29saWQgNHB4O2JvcmRlci1jb2xvcjojZmZmIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O21hcmdpbi10b3A6LTFweDtyaWdodDoxMHB4fS5idXR0b24uZHJvcGRvd24+dWx7LXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xcHg7YmFja2dyb3VuZDojZmZmO2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwwLjk1KTtsaXN0LXN0eWxlOm5vbmU7bWFyZ2luOjA7cGFkZGluZzowO2JvcmRlcjoxcHggc29saWQgI2NjYztib3JkZXItdG9wOm5vbmU7bWluLXdpZHRoOjEwMCU7ei1pbmRleDo0MH0uYnV0dG9uLmRyb3Bkb3duPnVsIGxpe3dpZHRoOjEwMCU7Y3Vyc29yOnBvaW50ZXI7cGFkZGluZzowO21pbi1oZWlnaHQ6MThweDtsaW5lLWhlaWdodDoxOHB4O21hcmdpbjowO3doaXRlLXNwYWNlOm5vd3JhcDtsaXN0LXN0eWxlOm5vbmV9LmJ1dHRvbi5kcm9wZG93bj51bCBsaSBhLC5idXR0b24uZHJvcGRvd24+dWwgbGkgYnV0dG9ue2Rpc3BsYXk6YmxvY2s7Y29sb3I6IzU1NTtmb250LXNpemU6MTNweDtmb250LXdlaWdodDpub3JtYWw7cGFkZGluZzo2cHggMTRweDt0ZXh0LWFsaWduOmxlZnR9LmJ1dHRvbi5kcm9wZG93bj51bCBsaSBidXR0b257d2lkdGg6MTAwJTtib3JkZXI6aW5oZXJpdDtiYWNrZ3JvdW5kOmluaGVyaXQ7Zm9udC1mYW1pbHk6aW5oZXJpdDttYXJnaW46aW5oZXJpdDstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkfS5idXR0b24uZHJvcGRvd24+dWwgbGk6aG92ZXIsLmJ1dHRvbi5kcm9wZG93bj51bCBsaTpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOiNlM2Y0Zjk7Y29sb3I6IzIyMn0uYnV0dG9uLmRyb3Bkb3duPnVsIGxpLmRpdmlkZXJ7bWluLWhlaWdodDowO3BhZGRpbmc6MDtoZWlnaHQ6MXB4O21hcmdpbjo0cHggMDtiYWNrZ3JvdW5kOiNlZGVkZWR9LmJ1dHRvbi5kcm9wZG93bi51cD51bHtib3JkZXItdG9wOjFweCBzb2xpZCAjY2NjO2JvcmRlci1ib3R0b206bm9uZX0uYnV0dG9uLmRyb3Bkb3duIHVsLm5vLWhvdmVyLnNob3ctZHJvcGRvd257ZGlzcGxheTpibG9jayAhaW1wb3J0YW50fS5idXR0b24uZHJvcGRvd246aG92ZXI+dWwubm8taG92ZXJ7ZGlzcGxheTpub25lfS5idXR0b24uZHJvcGRvd24uc3BsaXR7cGFkZGluZzowO3Bvc2l0aW9uOnJlbGF0aXZlfS5idXR0b24uZHJvcGRvd24uc3BsaXQ6YWZ0ZXJ7ZGlzcGxheTpub25lfS5idXR0b24uZHJvcGRvd24uc3BsaXQ6aG92ZXIsLmJ1dHRvbi5kcm9wZG93bi5zcGxpdDpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOiMyYmE2Y2J9LmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5hbGVydDpob3ZlciwuYnV0dG9uLmRyb3Bkb3duLnNwbGl0LmFsZXJ0OmZvY3Vze2JhY2tncm91bmQtY29sb3I6I2M2MGYxM30uYnV0dG9uLmRyb3Bkb3duLnNwbGl0LnN1Y2Nlc3M6aG92ZXIsLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5zdWNjZXNzOmZvY3Vze2JhY2tncm91bmQtY29sb3I6IzVkYTQyM30uYnV0dG9uLmRyb3Bkb3duLnNwbGl0LnNlY29uZGFyeTpob3ZlciwuYnV0dG9uLmRyb3Bkb3duLnNwbGl0LnNlY29uZGFyeTpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOiNlOWU5ZTl9LmJ1dHRvbi5kcm9wZG93bi5zcGxpdD5he2NvbG9yOiNmZmY7ZGlzcGxheTpibG9jaztwYWRkaW5nOjEwcHggNTBweCAxMXB4IDIwcHg7cGFkZGluZy1sZWZ0OjIwcHg7cGFkZGluZy1yaWdodDo1MHB4Oy13ZWJraXQtdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0Oy1tb3otdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0Oy1vLXRyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciAwLjE1cyBlYXNlLWluLW91dDt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgMC4xNXMgZWFzZS1pbi1vdXR9LmJ1dHRvbi5kcm9wZG93bi5zcGxpdD5hOmhvdmVyLC5idXR0b24uZHJvcGRvd24uc3BsaXQ+YTpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOiMyMjg0YTE7LXdlYmtpdC1ib3gtc2hhZG93OjAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwwLjUpIGluc2V0Oy1tb3otYm94LXNoYWRvdzowIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsMC41KSBpbnNldDtib3gtc2hhZG93OjAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwwLjUpIGluc2V0fS5idXR0b24uZHJvcGRvd24uc3BsaXQubGFyZ2U+YXtwYWRkaW5nOjE1cHggNzVweCAxNnB4IDMwcHg7cGFkZGluZy1sZWZ0OjMwcHg7cGFkZGluZy1yaWdodDo3NXB4fS5idXR0b24uZHJvcGRvd24uc3BsaXQuc21hbGw+YXtwYWRkaW5nOjdweCAzNXB4IDhweCAxNHB4O3BhZGRpbmctbGVmdDoxNHB4O3BhZGRpbmctcmlnaHQ6MzVweH0uYnV0dG9uLmRyb3Bkb3duLnNwbGl0LnRpbnk+YXtwYWRkaW5nOjVweCAyNXB4IDZweCAxMHB4O3BhZGRpbmctbGVmdDoxMHB4O3BhZGRpbmctcmlnaHQ6MjVweH0uYnV0dG9uLmRyb3Bkb3duLnNwbGl0PnNwYW57YmFja2dyb3VuZC1jb2xvcjojMmJhNmNiO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7dG9wOjA7aGVpZ2h0OjEwMCU7d2lkdGg6MzBweDtib3JkZXItbGVmdDoxcHggc29saWQgIzFlNzI4Yzstd2Via2l0LWJveC1zaGFkb3c6MXB4IDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsMC41KSBpbnNldDstbW96LWJveC1zaGFkb3c6MXB4IDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsMC41KSBpbnNldDtib3gtc2hhZG93OjFweCAxcHggMCByZ2JhKDI1NSwyNTUsMjU1LDAuNSkgaW5zZXQ7LXdlYmtpdC10cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgMC4xNXMgZWFzZS1pbi1vdXQ7LW1vei10cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgMC4xNXMgZWFzZS1pbi1vdXQ7LW8tdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0O3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciAwLjE1cyBlYXNlLWluLW91dH0uYnV0dG9uLmRyb3Bkb3duLnNwbGl0PnNwYW46aG92ZXIsLmJ1dHRvbi5kcm9wZG93bi5zcGxpdD5zcGFuOmZvY3Vze2JhY2tncm91bmQtY29sb3I6IzIyODRhMX0uYnV0dG9uLmRyb3Bkb3duLnNwbGl0PnNwYW46YWZ0ZXJ7Y29udGVudDoiIjtkaXNwbGF5OmJsb2NrO3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyOnNvbGlkIDZweDtib3JkZXItY29sb3I6I2ZmZiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlO2xlZnQ6NTAlO21hcmdpbi1sZWZ0Oi02cHg7bWFyZ2luLXRvcDotMnB4fS5idXR0b24uZHJvcGRvd24uc3BsaXQuc2Vjb25kYXJ5PnNwYW46YWZ0ZXJ7Y29udGVudDoiIjtkaXNwbGF5OmJsb2NrO3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyOnNvbGlkIDZweDtib3JkZXItY29sb3I6IzFkMWQxZCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudH0uYnV0dG9uLmRyb3Bkb3duLnNwbGl0LmxhcmdlIHNwYW57d2lkdGg6NDVweH0uYnV0dG9uLmRyb3Bkb3duLnNwbGl0LnNtYWxsIHNwYW57d2lkdGg6MjFweH0uYnV0dG9uLmRyb3Bkb3duLnNwbGl0LnRpbnkgc3Bhbnt3aWR0aDoxNXB4fS5idXR0b24uZHJvcGRvd24uc3BsaXQubGFyZ2Ugc3BhbjphZnRlcntjb250ZW50OiIiO2Rpc3BsYXk6YmxvY2s7d2lkdGg6MDtoZWlnaHQ6MDtib3JkZXI6c29saWQgN3B4O2JvcmRlci1jb2xvcjojZmZmIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O21hcmdpbi10b3A6LTNweDttYXJnaW4tbGVmdDotN3B4fS5idXR0b24uZHJvcGRvd24uc3BsaXQuc21hbGwgc3BhbjphZnRlcntjb250ZW50OiIiO2Rpc3BsYXk6YmxvY2s7d2lkdGg6MDtoZWlnaHQ6MDtib3JkZXI6c29saWQgNHB4O2JvcmRlci1jb2xvcjojZmZmIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O21hcmdpbi10b3A6LTFweDttYXJnaW4tbGVmdDotNHB4fS5idXR0b24uZHJvcGRvd24uc3BsaXQudGlueSBzcGFuOmFmdGVye2NvbnRlbnQ6IiI7ZGlzcGxheTpibG9jazt3aWR0aDowO2hlaWdodDowO2JvcmRlcjpzb2xpZCAzcHg7Ym9yZGVyLWNvbG9yOiNmZmYgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7bWFyZ2luLXRvcDotMXB4O21hcmdpbi1sZWZ0Oi0zcHh9LmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5hbGVydD5zcGFue2JhY2tncm91bmQtY29sb3I6I2M2MGYxMztib3JkZXItbGVmdC1jb2xvcjojN2YwYTBjfS5idXR0b24uZHJvcGRvd24uc3BsaXQuc3VjY2Vzcz5zcGFue2JhY2tncm91bmQtY29sb3I6IzVkYTQyMztib3JkZXItbGVmdC1jb2xvcjojMzk2NTE2fS5idXR0b24uZHJvcGRvd24uc3BsaXQuc2Vjb25kYXJ5PnNwYW57YmFja2dyb3VuZC1jb2xvcjojZTllOWU5O2JvcmRlci1sZWZ0LWNvbG9yOiNjM2MzYzN9LmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5zZWNvbmRhcnk+YXtjb2xvcjojMWQxZDFkfS5idXR0b24uZHJvcGRvd24uc3BsaXQuYWxlcnQ+YTpob3ZlciwuYnV0dG9uLmRyb3Bkb3duLnNwbGl0LmFsZXJ0PnNwYW46aG92ZXIsLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5hbGVydD5hOmZvY3VzLC5idXR0b24uZHJvcGRvd24uc3BsaXQuYWxlcnQ+c3Bhbjpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOiM5NzBiMGV9LmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5zdWNjZXNzPmE6aG92ZXIsLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5zdWNjZXNzPnNwYW46aG92ZXIsLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5zdWNjZXNzPmE6Zm9jdXMsLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5zdWNjZXNzPnNwYW46Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjojNDU3YTFhfS5idXR0b24uZHJvcGRvd24uc3BsaXQuc2Vjb25kYXJ5PmE6aG92ZXIsLmJ1dHRvbi5kcm9wZG93bi5zcGxpdC5zZWNvbmRhcnk+c3Bhbjpob3ZlciwuYnV0dG9uLmRyb3Bkb3duLnNwbGl0LnNlY29uZGFyeT5hOmZvY3VzLC5idXR0b24uZHJvcGRvd24uc3BsaXQuc2Vjb25kYXJ5PnNwYW46Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjojZDBkMGQwfXVsLmJ1dHRvbi1ncm91cHtsaXN0LXN0eWxlOm5vbmU7cGFkZGluZzowO21hcmdpbjowIDAgMTJweDsqem9vbToxfXVsLmJ1dHRvbi1ncm91cDpiZWZvcmUsdWwuYnV0dG9uLWdyb3VwOmFmdGVye2NvbnRlbnQ6IiAiO2Rpc3BsYXk6dGFibGV9dWwuYnV0dG9uLWdyb3VwOmFmdGVye2NsZWFyOmJvdGh9dWwuYnV0dG9uLWdyb3VwIGxpe3BhZGRpbmc6MDttYXJnaW46MCAwIDAgLTFweDtmbG9hdDpsZWZ0fXVsLmJ1dHRvbi1ncm91cCBsaTpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDowfXVsLmJ1dHRvbi1ncm91cC5yYWRpdXMgbGkgLmJ1dHRvbix1bC5idXR0b24tZ3JvdXAucmFkaXVzIGxpIC5idXR0b24ucmFkaXVzLHVsLmJ1dHRvbi1ncm91cC5yYWRpdXMgbGkgLmJ1dHRvbi1yb3VuZGVkey13ZWJraXQtYm9yZGVyLXJhZGl1czowcHg7LW1vei1ib3JkZXItcmFkaXVzOjBweDstbXMtYm9yZGVyLXJhZGl1czowcHg7LW8tYm9yZGVyLXJhZGl1czowcHg7Ym9yZGVyLXJhZGl1czowcHh9dWwuYnV0dG9uLWdyb3VwLnJhZGl1cyBsaTpmaXJzdC1jaGlsZCAuYnV0dG9uLHVsLmJ1dHRvbi1ncm91cC5yYWRpdXMgbGk6Zmlyc3QtY2hpbGQgLmJ1dHRvbi5yYWRpdXN7LW1vei1ib3JkZXItcmFkaXVzLXRvcGxlZnQ6M3B4Oy13ZWJraXQtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czozcHg7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czozcHg7LW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbWxlZnQ6M3B4Oy13ZWJraXQtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czozcHg7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czozcHh9dWwuYnV0dG9uLWdyb3VwLnJhZGl1cyBsaTpmaXJzdC1jaGlsZCAuYnV0dG9uLnJvdW5kZWR7LW1vei1ib3JkZXItcmFkaXVzLXRvcGxlZnQ6MTAwMHB4Oy13ZWJraXQtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czoxMDAwcHg7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czoxMDAwcHg7LW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbWxlZnQ6MTAwMHB4Oy13ZWJraXQtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czoxMDAwcHg7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czoxMDAwcHh9dWwuYnV0dG9uLWdyb3VwLnJhZGl1cyBsaTpsYXN0LWNoaWxkIC5idXR0b24sdWwuYnV0dG9uLWdyb3VwLnJhZGl1cyBsaTpsYXN0LWNoaWxkIC5idXR0b24ucmFkaXVzey1tb3otYm9yZGVyLXJhZGl1cy10b3ByaWdodDozcHg7LXdlYmtpdC1ib3JkZXItdG9wLXJpZ2h0LXJhZGl1czozcHg7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6M3B4Oy1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21yaWdodDozcHg7LXdlYmtpdC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czozcHg7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6M3B4fXVsLmJ1dHRvbi1ncm91cC5yYWRpdXMgbGk6bGFzdC1jaGlsZCAuYnV0dG9uLnJvdW5kZWR7LW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0OjEwMDBweDstd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOjEwMDBweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czoxMDAwcHg7LW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbXJpZ2h0OjEwMDBweDstd2Via2l0LWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjEwMDBweDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czoxMDAwcHh9dWwuYnV0dG9uLWdyb3VwLmV2ZW4gLmJ1dHRvbnt3aWR0aDoxMDAlfXVsLmJ1dHRvbi1ncm91cC5ldmVuLnR3by11cCBsaXt3aWR0aDo1MCV9dWwuYnV0dG9uLWdyb3VwLmV2ZW4udGhyZWUtdXAgbGl7d2lkdGg6MzMuMyV9dWwuYnV0dG9uLWdyb3VwLmV2ZW4udGhyZWUtdXAgbGk6Zmlyc3QtY2hpbGR7d2lkdGg6MzMuNCV9dWwuYnV0dG9uLWdyb3VwLmV2ZW4uZm91ci11cCBsaXt3aWR0aDoyNSV9dWwuYnV0dG9uLWdyb3VwLmV2ZW4uZml2ZS11cCBsaXt3aWR0aDoyMCV9ZGl2LmJ1dHRvbi1iYXJ7b3ZlcmZsb3c6aGlkZGVufWRpdi5idXR0b24tYmFyIHVsLmJ1dHRvbi1ncm91cHtmbG9hdDpsZWZ0O21hcmdpbi1yaWdodDo4cHh9ZGl2LmJ1dHRvbi1iYXIgdWwuYnV0dG9uLWdyb3VwOmxhc3QtY2hpbGR7bWFyZ2luLWxlZnQ6MH0ubmF2LWJhcntoZWlnaHQ6NDBweDtiYWNrZ3JvdW5kOiM0ZDRkNGQ7bWFyZ2luLWxlZnQ6MDttYXJnaW4tdG9wOjIwcHg7cGFkZGluZzowfS5uYXYtYmFyPmxpe2Zsb2F0OmxlZnQ7ZGlzcGxheTpibG9jaztwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nOjA7bWFyZ2luOjA7Ym9yZGVyOjFweCBzb2xpZCAjMzMzO2JvcmRlci1yaWdodDpub25lO2xpbmUtaGVpZ2h0OjM4cHg7LXdlYmtpdC1ib3gtc2hhZG93OjFweCAwIDAgcmdiYSgyNTUsMjU1LDI1NSwwLjIpIGluc2V0Oy1tb3otYm94LXNoYWRvdzoxcHggMCAwIHJnYmEoMjU1LDI1NSwyNTUsMC4yKSBpbnNldDtib3gtc2hhZG93OjFweCAwIDAgcmdiYSgyNTUsMjU1LDI1NSwwLjIpIGluc2V0fS5uYXYtYmFyPmxpOmZpcnN0LWNoaWxkey13ZWJraXQtYm94LXNoYWRvdzowIDAgMDstbW96LWJveC1zaGFkb3c6MCAwIDA7Ym94LXNoYWRvdzowIDAgMH0ubmF2LWJhcj5saTpsYXN0LWNoaWxke2JvcmRlci1yaWdodDpzb2xpZCAxcHggIzMzMzstd2Via2l0LWJveC1zaGFkb3c6MXB4IDAgMCByZ2JhKDI1NSwyNTUsMjU1LDAuMikgaW5zZXQsMXB4IDAgMCByZ2JhKDI1NSwyNTUsMjU1LDAuMik7LW1vei1ib3gtc2hhZG93OjFweCAwIDAgcmdiYSgyNTUsMjU1LDI1NSwwLjIpIGluc2V0LDFweCAwIDAgcmdiYSgyNTUsMjU1LDI1NSwwLjIpO2JveC1zaGFkb3c6MXB4IDAgMCByZ2JhKDI1NSwyNTUsMjU1LDAuMikgaW5zZXQsMXB4IDAgMCByZ2JhKDI1NSwyNTUsMjU1LDAuMil9Lm5hdi1iYXI+bGkuYWN0aXZle2JhY2tncm91bmQ6IzJiYTZjYjtib3JkZXItY29sb3I6IzIyODRhMX0ubmF2LWJhcj5saS5hY3RpdmU+YXtjb2xvcjojZmZmO2N1cnNvcjpkZWZhdWx0fS5uYXYtYmFyPmxpLmFjdGl2ZTpob3ZlcntiYWNrZ3JvdW5kOiMyYmE2Y2I7Y3Vyc29yOmRlZmF1bHR9Lm5hdi1iYXI+bGk6aG92ZXJ7YmFja2dyb3VuZDojMzMzfS5uYXYtYmFyPmxpPmF7Y29sb3I6I2U2ZTZlNn0ubmF2LWJhcj5saSB1bHttYXJnaW4tYm90dG9tOjB9Lm5hdi1iYXI+bGkgLmZseW91dHtkaXNwbGF5Om5vbmV9Lm5hdi1iYXI+bGkuaGFzLWZseW91dD5hOmZpcnN0LWNoaWxke3BhZGRpbmctcmlnaHQ6NDBweDtwb3NpdGlvbjpyZWxhdGl2ZX0ubmF2LWJhcj5saS5oYXMtZmx5b3V0PmE6Zmlyc3QtY2hpbGQ6YWZ0ZXJ7Y29udGVudDoiIjtkaXNwbGF5OmJsb2NrO3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyOnNvbGlkIDRweDtib3JkZXItY29sb3I6I2U2ZTZlNiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDoyMHB4O3RvcDoxN3B4fS5uYXYtYmFyPmxpLmhhcy1mbHlvdXQ+YS5mbHlvdXQtdG9nZ2xle2JvcmRlci1sZWZ0OjAgIWltcG9ydGFudDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO3RvcDowO3BhZGRpbmc6MjBweDt6LWluZGV4OjI7ZGlzcGxheTpibG9ja30ubmF2LWJhcj5saS5oYXMtZmx5b3V0LmlzLXRvdWNoPmE6Zmlyc3QtY2hpbGR7cGFkZGluZy1yaWdodDo1NXB4fS5uYXYtYmFyPmxpLmhhcy1mbHlvdXQuaXMtdG91Y2g+YS5mbHlvdXQtdG9nZ2xle2JvcmRlci1sZWZ0OjFweCBkYXNoZWQgIzY2Nn0ubmF2LWJhcj5saT5hOmZpcnN0LWNoaWxke3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6MCAyMHB4O2Rpc3BsYXk6YmxvY2s7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Zm9udC1zaXplOjE0cHh9Lm5hdi1iYXI+bGk+aW5wdXR7bWFyZ2luOjAgMTBweH0ubmF2LWJhci52ZXJ0aWNhbHtoZWlnaHQ6YXV0bzttYXJnaW4tdG9wOjB9Lm5hdi1iYXIudmVydGljYWw+bGl7ZmxvYXQ6bm9uZTtib3JkZXItYm90dG9tOm5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCAjMzMzOy13ZWJraXQtYm94LXNoYWRvdzpub25lOy1tb3otYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0ubmF2LWJhci52ZXJ0aWNhbD5saS5oYXMtZmx5b3V0PmE6Zmlyc3QtY2hpbGQ6YWZ0ZXJ7Y29udGVudDoiIjtkaXNwbGF5OmJsb2NrO3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyOnNvbGlkIDRweDtib3JkZXItY29sb3I6dHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgI2U2ZTZlNn0ubmF2LWJhci52ZXJ0aWNhbD5saSAuZmx5b3V0e2xlZnQ6MTAwJTt0b3A6LTFweH0ubmF2LWJhci52ZXJ0aWNhbD5saSAuZmx5b3V0LnJpZ2h0e2xlZnQ6YXV0bztyaWdodDoxMDAlfS5uYXYtYmFyLnZlcnRpY2FsPmxpLmFjdGl2ZXtib3JkZXItcmlnaHQ6c29saWQgMXB4ICMyMjg0YTF9Lm5hdi1iYXIudmVydGljYWw+bGk6bGFzdC1jaGlsZHtib3JkZXItYm90dG9tOnNvbGlkIDFweCAjMzMzfS5mbHlvdXR7YmFja2dyb3VuZDojZjJmMmYyO3BhZGRpbmc6MjBweDttYXJnaW46MDtib3JkZXI6MXB4IHNvbGlkICNkOWQ5ZDk7cG9zaXRpb246YWJzb2x1dGU7dG9wOjM5cHg7bGVmdDotMXB4O3dpZHRoOjI1MHB4O3otaW5kZXg6NDA7LXdlYmtpdC1ib3gtc2hhZG93OjAgMXB4IDVweCByZ2JhKDAsMCwwLDAuMSk7LW1vei1ib3gtc2hhZG93OjAgMXB4IDVweCByZ2JhKDAsMCwwLDAuMSk7Ym94LXNoYWRvdzowIDFweCA1cHggcmdiYSgwLDAsMCwwLjEpfS5mbHlvdXQgcHtsaW5lLWhlaWdodDoxLjI7Zm9udC1zaXplOjEzcHh9LmZseW91dCAqOmZpcnN0LWNoaWxke21hcmdpbi10b3A6MH0uZmx5b3V0ICo6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9LmZseW91dC5zbWFsbHt3aWR0aDoxNjYuNjY2NjdweH0uZmx5b3V0Lmxhcmdle3dpZHRoOjQzNy41cHh9LmZseW91dC5yaWdodHtsZWZ0OmF1dG87cmlnaHQ6LTJweH0uZmx5b3V0LmxlZnR7cmlnaHQ6YXV0bztsZWZ0Oi0ycHh9LmZseW91dC51cHt0b3A6YXV0bztib3R0b206MzlweH11bC5mbHlvdXQsLm5hdi1iYXIgbGkgdWx7cGFkZGluZzowO2xpc3Qtc3R5bGU6bm9uZX11bC5mbHlvdXQgbGksLm5hdi1iYXIgbGkgdWwgbGl7Ym9yZGVyLWxlZnQ6c29saWQgM3B4ICNDQ0N9dWwuZmx5b3V0IGxpIGEsLm5hdi1iYXIgbGkgdWwgbGkgYXtiYWNrZ3JvdW5kOiNmMmYyZjI7Ym9yZGVyOjFweCBzb2xpZCAjZTZlNmU2O2JvcmRlci13aWR0aDoxcHggMXB4IDAgMDtjb2xvcjojNTU1O2Rpc3BsYXk6YmxvY2s7Zm9udC1zaXplOjE0cHg7aGVpZ2h0OmF1dG87bGluZS1oZWlnaHQ6MTtwYWRkaW5nOjE1cHggMjBweDstd2Via2l0LWJveC1zaGFkb3c6MCAxcHggMCByZ2JhKDI1NSwyNTUsMjU1LDAuNSkgaW5zZXQ7LW1vei1ib3gtc2hhZG93OjAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwwLjUpIGluc2V0O2JveC1zaGFkb3c6MCAxcHggMCByZ2JhKDI1NSwyNTUsMjU1LDAuNSkgaW5zZXR9dWwuZmx5b3V0IGxpIGE6aG92ZXIsdWwuZmx5b3V0IGxpIGE6Zm9jdXMsLm5hdi1iYXIgbGkgdWwgbGkgYTpob3ZlciwubmF2LWJhciBsaSB1bCBsaSBhOmZvY3Vze2JhY2tncm91bmQ6I2ViZWJlYjtjb2xvcjojMzMzfXVsLmZseW91dCBsaS5hY3RpdmUsLm5hdi1iYXIgbGkgdWwgbGkuYWN0aXZle21hcmdpbi10b3A6MDtib3JkZXItdG9wOjFweCBzb2xpZCAjNGQ0ZDRkO2JvcmRlci1sZWZ0OjRweCBzb2xpZCAjMWExYTFhfXVsLmZseW91dCBsaS5hY3RpdmUgYSwubmF2LWJhciBsaSB1bCBsaS5hY3RpdmUgYXtiYWNrZ3JvdW5kOiM0ZDRkNGQ7Ym9yZGVyOm5vbmU7Y29sb3I6I2ZmZjtoZWlnaHQ6YXV0bzttYXJnaW46MDtwb3NpdGlvbjpzdGF0aWM7dG9wOjA7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwOy1tb3otYm94LXNoYWRvdzowIDAgMDtib3gtc2hhZG93OjAgMCAwfS5vcmJpdC13cmFwcGVye3dpZHRoOjFweDtoZWlnaHQ6MXB4O3Bvc2l0aW9uOnJlbGF0aXZlfS5vcmJpdHt3aWR0aDoxcHg7aGVpZ2h0OjFweDtwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzpoaWRkZW47bWFyZ2luLWJvdHRvbToxN3B4fS5vcmJpdC53aXRoLWJ1bGxldHN7bWFyZ2luLWJvdHRvbTo0MHB4fS5vcmJpdCAub3JiaXQtc2xpZGV7bWF4LXdpZHRoOjEwMCU7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowfS5vcmJpdCBhLm9yYml0LXNsaWRle2JvcmRlcjpub25lO2xpbmUtaGVpZ2h0OjA7ZGlzcGxheTpub25lfS5vcmJpdCBkaXYub3JiaXQtc2xpZGV7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtmaWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkFscGhhKE9wYWNpdHk9MCk7b3BhY2l0eTowfS5vcmJpdC13cmFwcGVyIC50aW1lcnt3aWR0aDo0MHB4O2hlaWdodDo0MHB4O292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTBweDtyaWdodDoxMHB4O29wYWNpdHk6LjY7Y3Vyc29yOnBvaW50ZXI7ei1pbmRleDozMX0ub3JiaXQtd3JhcHBlciBzcGFuLnJvdGF0b3J7ZGlzcGxheTpibG9jazt3aWR0aDo0MHB4O2hlaWdodDo0MHB4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6LTIwcHg7YmFja2dyb3VuZDp1cmwoJy4uL2ltYWdlcy9mb3VuZGF0aW9uL29yYml0L3JvdGF0b3ItYmxhY2sucG5nJykgbm8tcmVwZWF0O3otaW5kZXg6M30ub3JiaXQtd3JhcHBlciBzcGFuLnJvdGF0b3IubW92ZXtsZWZ0OjB9Lm9yYml0LXdyYXBwZXIgc3Bhbi5tYXNre2Rpc3BsYXk6YmxvY2s7d2lkdGg6MjBweDtoZWlnaHQ6NDBweDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtyaWdodDowO3otaW5kZXg6MjtvdmVyZmxvdzpoaWRkZW59Lm9yYml0LXdyYXBwZXIgc3Bhbi5tYXNrLm1vdmV7d2lkdGg6NDBweDtsZWZ0OjA7YmFja2dyb3VuZDp1cmwoJy4uL2ltYWdlcy9mb3VuZGF0aW9uL29yYml0L3RpbWVyLWJsYWNrLnBuZycpIHJlcGVhdCAwIDB9Lm9yYml0LXdyYXBwZXIgc3Bhbi5wYXVzZXtkaXNwbGF5OmJsb2NrO3dpZHRoOjQwcHg7aGVpZ2h0OjQwcHg7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO2JhY2tncm91bmQ6dXJsKCcuLi9pbWFnZXMvZm91bmRhdGlvbi9vcmJpdC9wYXVzZS1ibGFjay5wbmcnKSBuby1yZXBlYXQ7ei1pbmRleDo0O29wYWNpdHk6MH0ub3JiaXQtd3JhcHBlciBzcGFuLnBhdXNlLmFjdGl2ZXtiYWNrZ3JvdW5kOnVybCgnLi4vaW1hZ2VzL2ZvdW5kYXRpb24vb3JiaXQvcGF1c2UtYmxhY2sucG5nJykgbm8tcmVwZWF0IDAgLTQwcHh9Lm9yYml0LXdyYXBwZXIgLnRpbWVyOmhvdmVyIHNwYW4ucGF1c2UsLm9yYml0LXdyYXBwZXIgLnRpbWVyOmZvY3VzIHNwYW4ucGF1c2UsLm9yYml0LXdyYXBwZXIgc3Bhbi5wYXVzZS5hY3RpdmV7b3BhY2l0eToxfS5vcmJpdC1jYXB0aW9ue2Rpc3BsYXk6bm9uZTtmb250LWZhbWlseTppbmhlcml0fS5vcmJpdC13cmFwcGVyIC5vcmJpdC1jYXB0aW9ue2JhY2tncm91bmQ6IzAwMDtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMC42KTt6LWluZGV4OjMwO2NvbG9yOiNmZmY7dGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZzo3cHggMDtmb250LXNpemU6MTNweDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO2JvdHRvbTowO3dpZHRoOjEwMCV9Lm9yYml0LXdyYXBwZXIgLnNsaWRlci1uYXZ7ZGlzcGxheTpibG9ja30ub3JiaXQtd3JhcHBlciAuc2xpZGVyLW5hdiBzcGFue3dpZHRoOjM5cHg7aGVpZ2h0OjUwcHg7dGV4dC1pbmRlbnQ6LTk5OTlweDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjMwO3RvcDo1MCU7bWFyZ2luLXRvcDotMjVweDtjdXJzb3I6cG9pbnRlcn0ub3JiaXQtd3JhcHBlciAuc2xpZGVyLW5hdiBzcGFuLnJpZ2h0e2JhY2tncm91bmQ6dXJsKCcuLi9pbWFnZXMvZm91bmRhdGlvbi9vcmJpdC9yaWdodC1hcnJvdy5wbmcnKTtiYWNrZ3JvdW5kLXNpemU6MTAwJTtyaWdodDowfS5vcmJpdC13cmFwcGVyIC5zbGlkZXItbmF2IHNwYW4ubGVmdHtiYWNrZ3JvdW5kOnVybCgnLi4vaW1hZ2VzL2ZvdW5kYXRpb24vb3JiaXQvbGVmdC1hcnJvdy5wbmcnKTtiYWNrZ3JvdW5kLXNpemU6MTAwJTtsZWZ0OjB9Lmx0LWllOSAub3JiaXQtd3JhcHBlciAuc2xpZGVyLW5hdiBzcGFuLnJpZ2h0e2JhY2tncm91bmQ6dXJsKCcuLi9pbWFnZXMvZm91bmRhdGlvbi9vcmJpdC9yaWdodC1hcnJvdy1zbWFsbC5wbmcnKX0ubHQtaWU5IC5vcmJpdC13cmFwcGVyIC5zbGlkZXItbmF2IHNwYW4ubGVmdHtiYWNrZ3JvdW5kOnVybCgnLi4vaW1hZ2VzL2ZvdW5kYXRpb24vb3JiaXQvbGVmdC1hcnJvdy1zbWFsbC5wbmcnKX11bC5vcmJpdC1idWxsZXRze3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MzA7bGlzdC1zdHlsZTpub25lO2JvdHRvbTotNDBweDtsZWZ0OjUwJTttYXJnaW4tbGVmdDotNTBweDtwYWRkaW5nOjB9dWwub3JiaXQtYnVsbGV0cyBsaXtmbG9hdDpsZWZ0O21hcmdpbi1sZWZ0OjVweDtjdXJzb3I6cG9pbnRlcjtjb2xvcjojOTk5O3RleHQtaW5kZW50Oi05OTk5cHg7YmFja2dyb3VuZDp1cmwoJy4uL2ltYWdlcy9mb3VuZGF0aW9uL29yYml0L2J1bGxldHMuanBnJykgbm8tcmVwZWF0IDRweCAwO3dpZHRoOjEzcHg7aGVpZ2h0OjEycHg7b3ZlcmZsb3c6aGlkZGVufXVsLm9yYml0LWJ1bGxldHMgbGkuYWN0aXZle2NvbG9yOiMyMjI7YmFja2dyb3VuZC1wb3NpdGlvbjotOHB4IDB9dWwub3JiaXQtYnVsbGV0cyBsaS5oYXMtdGh1bWJ7YmFja2dyb3VuZDpub25lO3dpZHRoOjEwMHB4O2hlaWdodDo3NXB4fXVsLm9yYml0LWJ1bGxldHMgbGkuYWN0aXZlLmhhcy10aHVtYntiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgMDtib3JkZXItdG9wOjJweCBzb2xpZCAjMDAwfS5vcmJpdC1zbGlkZS1jb3VudGVye3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbTowO3otaW5kZXg6OTk7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuNyk7Y29sb3I6I2ZmZjtwYWRkaW5nOjVweH0ub3JiaXQgaW1nLmZsdWlkLXBsYWNlaG9sZGVye3Zpc2liaWxpdHk6aGlkZGVuO3Bvc2l0aW9uOnN0YXRpYztkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCV9Lm9yYml0LC5vcmJpdC13cmFwcGVye3dpZHRoOjEwMCUgIWltcG9ydGFudH0ubHQtaWU5IC50aW1lcntkaXNwbGF5Om5vbmUgIWltcG9ydGFudH0ubHQtaWU5IC5vcmJpdC1jYXB0aW9ue2JhY2tncm91bmQ6IzAwMDtmaWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9Izk5MDAwMDAwLGVuZENvbG9yc3RyPSM5OTAwMDAwMCk7em9vbToxfUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY3cHgpey5vcmJpdC5vcmJpdC1zdGFjay1vbi1zbWFsbCBpbWcuZmx1aWQtcGxhY2Vob2xkZXJ7dmlzaWJpbGl0eTp2aXNpYmxlfS5vcmJpdC5vcmJpdC1zdGFjay1vbi1zbWFsbCAub3JiaXQtc2xpZGV7cG9zaXRpb246c3RhdGljO21hcmdpbi1ib3R0b206MTBweH19LnJldmVhbC1tb2RhbC1iZ3twb3NpdGlvbjpmaXhlZDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlO2JhY2tncm91bmQ6IzAwMDtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMC40NSk7ei1pbmRleDo0MDtkaXNwbGF5Om5vbmU7dG9wOjA7bGVmdDowfS5yZXZlYWwtbW9kYWx7YmFja2dyb3VuZDojZmZmO3Zpc2liaWxpdHk6aGlkZGVuO2Rpc3BsYXk6bm9uZTt0b3A6MTAwcHg7bGVmdDo1MCU7bWFyZ2luLWxlZnQ6LTI2MHB4O3dpZHRoOjUyMHB4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6NDE7cGFkZGluZzozMHB4Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMTBweCByZ2JhKDAsMCwwLDAuNCk7LW1vei1ib3gtc2hhZG93OjAgMCAxMHB4IHJnYmEoMCwwLDAsMC40KTtib3gtc2hhZG93OjAgMCAxMHB4IHJnYmEoMCwwLDAsMC40KX0ucmV2ZWFsLW1vZGFsIC5jbG9zZS1yZXZlYWwtbW9kYWw6bm90KC5idXR0b24pe2ZvbnQtc2l6ZToyMnB4O2ZvbnQtc2l6ZToyLjJyZW07bGluZS1oZWlnaHQ6LjU7cG9zaXRpb246YWJzb2x1dGU7dG9wOjhweDtyaWdodDoxMXB4O2NvbG9yOiNhYWE7dGV4dC1zaGFkb3c6MCAtMXB4IDFweCByZ2JhKDAsMCwwLDAuNik7Zm9udC13ZWlnaHQ6Ym9sZDtjdXJzb3I6cG9pbnRlcn0ucmV2ZWFsLW1vZGFsLnNtYWxse3dpZHRoOjMwJTttYXJnaW4tbGVmdDotMTUlfS5yZXZlYWwtbW9kYWwubWVkaXVte3dpZHRoOjQwJTttYXJnaW4tbGVmdDotMjAlfS5yZXZlYWwtbW9kYWwubGFyZ2V7d2lkdGg6NjAlO21hcmdpbi1sZWZ0Oi0zMCV9LnJldmVhbC1tb2RhbC54bGFyZ2V7d2lkdGg6NzAlO21hcmdpbi1sZWZ0Oi0zNSV9LnJldmVhbC1tb2RhbC5leHBhbmR7d2lkdGg6OTAlO21hcmdpbi1sZWZ0Oi00NSV9LnJldmVhbC1tb2RhbCAucm93e21pbi13aWR0aDowO21hcmdpbi1ib3R0b206MTBweH0ucmV2ZWFsLW1vZGFsPjpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjB9LnJldmVhbC1tb2RhbD46bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9QG1lZGlhIHByaW50ey5yZXZlYWwtbW9kYWx7Ym9yZGVyOnNvbGlkIDFweCAjMDAwO2JhY2tncm91bmQ6I2ZmZn19LnRhYnN7bGlzdC1zdHlsZTpub25lO2JvcmRlci1ib3R0b206c29saWQgMXB4ICNlNmU2ZTY7ZGlzcGxheTpibG9jaztoZWlnaHQ6NDBweDtwYWRkaW5nOjA7bWFyZ2luLWJvdHRvbToyMHB4fS50YWJzLmNvbnRhaW5lZHttYXJnaW4tYm90dG9tOjA7bWFyZ2luLWxlZnQ6MH0udGFicyBkdCwudGFicyBsaS5zZWN0aW9uLXRpdGxle2NvbG9yOiNiM2IzYjM7Y3Vyc29yOmRlZmF1bHQ7ZGlzcGxheTpibG9jaztmbG9hdDpsZWZ0O2ZvbnQtc2l6ZToxMnB4O2hlaWdodDo0MHB4O2xpbmUtaGVpZ2h0OjQwcHg7cGFkZGluZzowO3BhZGRpbmctcmlnaHQ6OXB4O3BhZGRpbmctbGVmdDoyMHB4O2ZvbnQtd2VpZ2h0Om5vcm1hbDt3aWR0aDphdXRvO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZX0udGFicyBkdDpmaXJzdC1jaGlsZCwudGFicyBsaS5zZWN0aW9uLXRpdGxlOmZpcnN0LWNoaWxke3BhZGRpbmc6MDtwYWRkaW5nLXJpZ2h0OjlweH0udGFicyBkZCwudGFicyBsaXtkaXNwbGF5OmJsb2NrO2Zsb2F0OmxlZnQ7cGFkZGluZzowO21hcmdpbjowfS50YWJzIGRkIGEsLnRhYnMgbGkgYXtjb2xvcjojNmY2ZjZmO2Rpc3BsYXk6YmxvY2s7Zm9udC1zaXplOjE0cHg7aGVpZ2h0OjQwcHg7bGluZS1oZWlnaHQ6NDBweDtwYWRkaW5nOjBweCAyMy44cHh9LnRhYnMgZGQgYTpmb2N1cywudGFicyBsaSBhOmZvY3Vze2ZvbnQtd2VpZ2h0OmJvbGQ7Y29sb3I6IzJiYTZjYn0udGFicyBkZC5hY3RpdmUsLnRhYnMgbGkuYWN0aXZle2JvcmRlci10b3A6M3B4IHNvbGlkICMyYmE2Y2I7bWFyZ2luLXRvcDotM3B4fS50YWJzIGRkLmFjdGl2ZSBhLC50YWJzIGxpLmFjdGl2ZSBhe2N1cnNvcjpkZWZhdWx0O2NvbG9yOiMzYzNjM2M7YmFja2dyb3VuZDojZmZmO2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjZTZlNmU2O2JvcmRlci1yaWdodDoxcHggc29saWQgI2U2ZTZlNjtmb250LXdlaWdodDpib2xkfS50YWJzIGRkOmZpcnN0LWNoaWxkLC50YWJzIGxpOmZpcnN0LWNoaWxke21hcmdpbi1sZWZ0OjB9LnRhYnMudmVydGljYWx7aGVpZ2h0OmF1dG87Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2U2ZTZlNn0udGFicy52ZXJ0aWNhbCBkdCwudGFicy52ZXJ0aWNhbCBkZCwudGFicy52ZXJ0aWNhbCBsaXtmbG9hdDpub25lO2hlaWdodDphdXRvfS50YWJzLnZlcnRpY2FsIGRkLC50YWJzLnZlcnRpY2FsIGxpe2JvcmRlci1sZWZ0OjNweCBzb2xpZCAjY2NjfS50YWJzLnZlcnRpY2FsIGRkIGEsLnRhYnMudmVydGljYWwgbGkgYXtiYWNrZ3JvdW5kOiNmMmYyZjI7Ym9yZGVyOm5vbmU7Ym9yZGVyOjFweCBzb2xpZCAjZTZlNmU2O2JvcmRlci13aWR0aDoxcHggMXB4IDAgMDtjb2xvcjojNTU1O2Rpc3BsYXk6YmxvY2s7Zm9udC1zaXplOjE0cHg7aGVpZ2h0OmF1dG87bGluZS1oZWlnaHQ6MTtwYWRkaW5nOjE1cHggMjBweDstd2Via2l0LWJveC1zaGFkb3c6MCAxcHggMCByZ2JhKDI1NSwyNTUsMjU1LDAuNSkgaW5zZXQ7LW1vei1ib3gtc2hhZG93OjAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwwLjUpIGluc2V0O2JveC1zaGFkb3c6MCAxcHggMCByZ2JhKDI1NSwyNTUsMjU1LDAuNSkgaW5zZXR9LnRhYnMudmVydGljYWwgZGQuYWN0aXZlLC50YWJzLnZlcnRpY2FsIGxpLmFjdGl2ZXttYXJnaW4tdG9wOjA7Ym9yZGVyLXRvcDoxcHggc29saWQgIzRkNGQ0ZDtib3JkZXItbGVmdDo0cHggc29saWQgIzFhMWExYX0udGFicy52ZXJ0aWNhbCBkZC5hY3RpdmUgYSwudGFicy52ZXJ0aWNhbCBsaS5hY3RpdmUgYXtiYWNrZ3JvdW5kOiM0ZDRkNGQ7Ym9yZGVyOm5vbmU7Y29sb3I6I2ZmZjtoZWlnaHQ6YXV0bzttYXJnaW46MDtwb3NpdGlvbjpzdGF0aWM7dG9wOjA7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwOy1tb3otYm94LXNoYWRvdzowIDAgMDtib3gtc2hhZG93OjAgMCAwfS50YWJzLnZlcnRpY2FsIGRkOmZpcnN0LWNoaWxkIGEuYWN0aXZlLC50YWJzLnZlcnRpY2FsIGxpOmZpcnN0LWNoaWxkIGEuYWN0aXZle21hcmdpbjowfS50YWJzLnBpbGx7Ym9yZGVyLWJvdHRvbTpub25lO21hcmdpbi1ib3R0b206MTBweH0udGFicy5waWxsIGRkLC50YWJzLnBpbGwgbGl7bWFyZ2luLXJpZ2h0OjEwcHh9LnRhYnMucGlsbCBkZDpsYXN0LWNoaWxkLC50YWJzLnBpbGwgbGk6bGFzdC1jaGlsZHttYXJnaW4tcmlnaHQ6MH0udGFicy5waWxsIGRkIGEsLnRhYnMucGlsbCBsaSBhey13ZWJraXQtYm9yZGVyLXJhZGl1czoxMDAwcHg7LW1vei1ib3JkZXItcmFkaXVzOjEwMDBweDstbXMtYm9yZGVyLXJhZGl1czoxMDAwcHg7LW8tYm9yZGVyLXJhZGl1czoxMDAwcHg7Ym9yZGVyLXJhZGl1czoxMDAwcHg7YmFja2dyb3VuZDojZTZlNmU2O2hlaWdodDoyNnB4O2xpbmUtaGVpZ2h0OjI2cHg7Y29sb3I6IzY2Nn0udGFicy5waWxsIGRkLmFjdGl2ZSwudGFicy5waWxsIGxpLmFjdGl2ZXtib3JkZXI6bm9uZTttYXJnaW4tdG9wOjB9LnRhYnMucGlsbCBkZC5hY3RpdmUgYSwudGFicy5waWxsIGxpLmFjdGl2ZSBhe2JhY2tncm91bmQtY29sb3I6IzJiYTZjYjtib3JkZXI6bm9uZTtjb2xvcjojZmZmfS50YWJzLnBpbGwuY29udGFpbmVke2JvcmRlci1ib3R0b206c29saWQgMXB4ICNlZWU7bWFyZ2luLWJvdHRvbTowfS50YWJzLnBpbGwudHdvLXVwIGRkLC50YWJzLnBpbGwudHdvLXVwIGxpLC50YWJzLnBpbGwudGhyZWUtdXAgZGQsLnRhYnMucGlsbC50aHJlZS11cCBsaSwudGFicy5waWxsLmZvdXItdXAgZGQsLnRhYnMucGlsbC5mb3VyLXVwIGxpLC50YWJzLnBpbGwuZml2ZS11cCBkZCwudGFicy5waWxsLmZpdmUtdXAgbGl7bWFyZ2luLXJpZ2h0OjB9LnRhYnMudHdvLXVwIGR0IGEsLnRhYnMudHdvLXVwIGRkIGEsLnRhYnMudHdvLXVwIGxpIGEsLnRhYnMudGhyZWUtdXAgZHQgYSwudGFicy50aHJlZS11cCBkZCBhLC50YWJzLnRocmVlLXVwIGxpIGEsLnRhYnMuZm91ci11cCBkdCBhLC50YWJzLmZvdXItdXAgZGQgYSwudGFicy5mb3VyLXVwIGxpIGEsLnRhYnMuZml2ZS11cCBkdCBhLC50YWJzLmZpdmUtdXAgZGQgYSwudGFicy5maXZlLXVwIGxpIGF7cGFkZGluZzowIDE3cHg7dGV4dC1hbGlnbjpjZW50ZXI7b3ZlcmZsb3c6aGlkZGVufS50YWJzLnR3by11cCBkdCwudGFicy50d28tdXAgZGQsLnRhYnMudHdvLXVwIGxpe3dpZHRoOjUwJX0udGFicy50aHJlZS11cCBkdCwudGFicy50aHJlZS11cCBkZCwudGFicy50aHJlZS11cCBsaXt3aWR0aDozMy4zMyV9LnRhYnMuZm91ci11cCBkdCwudGFicy5mb3VyLXVwIGRkLC50YWJzLmZvdXItdXAgbGl7d2lkdGg6MjUlfS50YWJzLmZpdmUtdXAgZHQsLnRhYnMuZml2ZS11cCBkZCwudGFicy5maXZlLXVwIGxpe3dpZHRoOjIwJX11bC50YWJzLWNvbnRlbnR7ZGlzcGxheTpibG9jazttYXJnaW46MCAwIDIwcHg7cGFkZGluZzowfXVsLnRhYnMtY29udGVudD5saXtkaXNwbGF5Om5vbmV9dWwudGFicy1jb250ZW50PmxpLmFjdGl2ZXtkaXNwbGF5OmJsb2NrfXVsLnRhYnMtY29udGVudC5jb250YWluZWR7cGFkZGluZzowfXVsLnRhYnMtY29udGVudC5jb250YWluZWQ+bGl7Ym9yZGVyOnNvbGlkIDAgI2U2ZTZlNjtib3JkZXItd2lkdGg6MCAxcHggMXB4IDFweDtwYWRkaW5nOjIwcHh9dWwudGFicy1jb250ZW50LmNvbnRhaW5lZC52ZXJ0aWNhbD5saXtib3JkZXItd2lkdGg6MXB4IDFweCAxcHggMXB4fS5uby1qcyB1bC50YWJzLWNvbnRlbnQ+bGl7ZGlzcGxheTpibG9ja31kaXYuYWxlcnQtYm94e2Rpc3BsYXk6YmxvY2s7cGFkZGluZzo2cHggN3B4IDdweDtmb250LXdlaWdodDpib2xkO2ZvbnQtc2l6ZToxNHB4O2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMmJhNmNiO2JvcmRlcjoxcHggc29saWQgcmdiYSgwLDAsMCwwLjEpO21hcmdpbi1ib3R0b206MTJweDstd2Via2l0LWJvcmRlci1yYWRpdXM6M3B4Oy1tb3otYm9yZGVyLXJhZGl1czozcHg7LW1zLWJvcmRlci1yYWRpdXM6M3B4Oy1vLWJvcmRlci1yYWRpdXM6M3B4O2JvcmRlci1yYWRpdXM6M3B4O3RleHQtc2hhZG93OjAgLTFweCByZ2JhKDAsMCwwLDAuMyk7cG9zaXRpb246cmVsYXRpdmV9ZGl2LmFsZXJ0LWJveC5zdWNjZXNze2JhY2tncm91bmQtY29sb3I6IzVkYTQyMztjb2xvcjojZmZmO3RleHQtc2hhZG93OjAgLTFweCByZ2JhKDAsMCwwLDAuMyl9ZGl2LmFsZXJ0LWJveC5hbGVydHtiYWNrZ3JvdW5kLWNvbG9yOiNjNjBmMTM7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzowIC0xcHggcmdiYSgwLDAsMCwwLjMpfWRpdi5hbGVydC1ib3guc2Vjb25kYXJ5e2JhY2tncm91bmQtY29sb3I6I2U5ZTllOTtjb2xvcjojNTA1MDUwO3RleHQtc2hhZG93OjAgMXB4IHJnYmEoMjU1LDI1NSwyNTUsMC4zKX1kaXYuYWxlcnQtYm94IGEuY2xvc2V7Y29sb3I6IzMzMztwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDo0cHg7dG9wOi0xcHg7Zm9udC1zaXplOjE3cHg7b3BhY2l0eTowLjI7cGFkZGluZzo0cHh9ZGl2LmFsZXJ0LWJveCBhLmNsb3NlOmhvdmVyLGRpdi5hbGVydC1ib3ggYS5jbG9zZTpmb2N1c3tvcGFjaXR5OjAuNH0ubGFiZWx7cGFkZGluZzoxcHggNHB4IDJweDtmb250LXNpemU6MTJweDtmb250LXdlaWdodDpib2xkO3RleHQtYWxpZ246Y2VudGVyO3RleHQtZGVjb3JhdGlvbjpub25lO2xpbmUtaGVpZ2h0OjE7d2hpdGUtc3BhY2U6bm93cmFwO2Rpc3BsYXk6aW5saW5lO3Bvc2l0aW9uOnJlbGF0aXZlO2JvdHRvbToxcHg7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiMyYmE2Y2J9LmxhYmVsLnJhZGl1c3std2Via2l0LWJvcmRlci1yYWRpdXM6M3B4Oy1tb3otYm9yZGVyLXJhZGl1czozcHg7LW1zLWJvcmRlci1yYWRpdXM6M3B4Oy1vLWJvcmRlci1yYWRpdXM6M3B4O2JvcmRlci1yYWRpdXM6M3B4fS5sYWJlbC5yb3VuZHtwYWRkaW5nOjFweCA3cHggMnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czoxMDAwcHg7LW1vei1ib3JkZXItcmFkaXVzOjEwMDBweDstbXMtYm9yZGVyLXJhZGl1czoxMDAwcHg7LW8tYm9yZGVyLXJhZGl1czoxMDAwcHg7Ym9yZGVyLXJhZGl1czoxMDAwcHh9LmxhYmVsLmFsZXJ0e2JhY2tncm91bmQtY29sb3I6I2M2MGYxM30ubGFiZWwuc3VjY2Vzc3tiYWNrZ3JvdW5kLWNvbG9yOiM1ZGE0MjN9LmxhYmVsLnNlY29uZGFyeXtiYWNrZ3JvdW5kLWNvbG9yOiNlOWU5ZTk7Y29sb3I6IzUwNTA1MH0uaGFzLXRpcHtib3JkZXItYm90dG9tOmRvdHRlZCAxcHggI2NjYztjdXJzb3I6aGVscDtmb250LXdlaWdodDpib2xkO2NvbG9yOiMzMzN9Lmhhcy10aXA6aG92ZXIsLmhhcy10aXA6Zm9jdXN7Ym9yZGVyLWJvdHRvbTpkb3R0ZWQgMXB4ICMxOTYxNzc7Y29sb3I6IzJiYTZjYn0uaGFzLXRpcC50aXAtbGVmdCwuaGFzLXRpcC50aXAtcmlnaHR7ZmxvYXQ6bm9uZSAhaW1wb3J0YW50fS50b29sdGlwe2Rpc3BsYXk6bm9uZTtiYWNrZ3JvdW5kOiMwMDA7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuODUpO3Bvc2l0aW9uOmFic29sdXRlO2NvbG9yOiNmZmY7Zm9udC13ZWlnaHQ6Ym9sZDtmb250LXNpemU6MTJweDtwYWRkaW5nOjVweDt6LWluZGV4Ojk5OTstd2Via2l0LWJvcmRlci1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1czo0cHg7LW1zLWJvcmRlci1yYWRpdXM6NHB4Oy1vLWJvcmRlci1yYWRpdXM6NHB4O2JvcmRlci1yYWRpdXM6NHB4O2xpbmUtaGVpZ2h0Om5vcm1hbH0udG9vbHRpcD4ubnVie2Rpc3BsYXk6YmxvY2s7d2lkdGg6MDtoZWlnaHQ6MDtib3JkZXI6c29saWQgNXB4O2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudCB0cmFuc3BhcmVudCAjMDAwIHRyYW5zcGFyZW50O2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudCB0cmFuc3BhcmVudCByZ2JhKDAsMCwwLDAuODUpIHRyYW5zcGFyZW50O3Bvc2l0aW9uOmFic29sdXRlO3RvcDotMTBweDtsZWZ0OjEwcHh9LnRvb2x0aXAudGlwLW92ZXJyaWRlPi5udWJ7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICMwMDAgdHJhbnNwYXJlbnQgIWltcG9ydGFudDtib3JkZXItY29sb3I6dHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgcmdiYSgwLDAsMCwwLjg1KSB0cmFuc3BhcmVudCAhaW1wb3J0YW50O3RvcDotMTBweCAhaW1wb3J0YW50fS50b29sdGlwLnRpcC10b3A+Lm51YiwudG9vbHRpcC50aXAtY2VudGVyZWQtdG9wPi5udWJ7Ym9yZGVyLWNvbG9yOiMwMDAgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsMC44NSkgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7dG9wOmF1dG87Ym90dG9tOi0xMHB4fS50b29sdGlwLnRpcC1sZWZ0LC50b29sdGlwLnRpcC1yaWdodHtmbG9hdDpub25lICFpbXBvcnRhbnR9LnRvb2x0aXAudGlwLWxlZnQ+Lm51Yntib3JkZXItY29sb3I6dHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgIzAwMDtib3JkZXItY29sb3I6dHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgcmdiYSgwLDAsMCwwLjg1KTtyaWdodDotMTBweDtsZWZ0OmF1dG99LnRvb2x0aXAudGlwLXJpZ2h0Pi5udWJ7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50ICMwMDAgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50IHJnYmEoMCwwLDAsMC44NSkgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7cmlnaHQ6YXV0bztsZWZ0Oi0xMHB4fS50b29sdGlwLm5vcmFkaXVzey13ZWJraXQtYm9yZGVyLXJhZGl1czowOy1tb3otYm9yZGVyLXJhZGl1czowOy1tcy1ib3JkZXItcmFkaXVzOjA7LW8tYm9yZGVyLXJhZGl1czowO2JvcmRlci1yYWRpdXM6MH0udG9vbHRpcC5vcGVuZWR7Y29sb3I6IzJiYTZjYiAhaW1wb3J0YW50O2JvcmRlci1ib3R0b206ZG90dGVkIDFweCAjMTk2MTc3ICFpbXBvcnRhbnR9LnRhcC10by1jbG9zZXtkaXNwbGF5OmJsb2NrO2ZvbnQtc2l6ZToxMHB4O2ZvbnQtc2l6ZToxcmVtO2NvbG9yOiM4ODg7Zm9udC13ZWlnaHQ6bm9ybWFsfS5wYW5lbHtiYWNrZ3JvdW5kOiNmMmYyZjI7Ym9yZGVyOnNvbGlkIDFweCAjZTZlNmU2O21hcmdpbjowIDAgMjJweCAwO3BhZGRpbmc6MjBweH0ucGFuZWw+OmZpcnN0LWNoaWxke21hcmdpbi10b3A6MH0ucGFuZWw+Omxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfS5wYW5lbC5jYWxsb3V0e2JhY2tncm91bmQ6IzJiYTZjYjtjb2xvcjojZmZmO2JvcmRlci1jb2xvcjojMjI4NGExOy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwcHggMXB4IDBweCByZ2JhKDI1NSwyNTUsMjU1LDAuNSk7LW1vei1ib3gtc2hhZG93Omluc2V0IDBweCAxcHggMHB4IHJnYmEoMjU1LDI1NSwyNTUsMC41KTtib3gtc2hhZG93Omluc2V0IDBweCAxcHggMHB4IHJnYmEoMjU1LDI1NSwyNTUsMC41KX0ucGFuZWwuY2FsbG91dCBhe2NvbG9yOiNmZmZ9LnBhbmVsLmNhbGxvdXQgLmJ1dHRvbntiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyOm5vbmU7Y29sb3I6IzJiYTZjYjt0ZXh0LXNoYWRvdzpub25lfS5wYW5lbC5jYWxsb3V0IC5idXR0b246aG92ZXIsLnBhbmVsLmNhbGxvdXQgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsMC44KX0ucGFuZWwucmFkaXVzey13ZWJraXQtYm9yZGVyLXJhZGl1czozcHg7LW1vei1ib3JkZXItcmFkaXVzOjNweDstbXMtYm9yZGVyLXJhZGl1czozcHg7LW8tYm9yZGVyLXJhZGl1czozcHg7Ym9yZGVyLXJhZGl1czozcHh9dWwuYWNjb3JkaW9ue21hcmdpbjowIDAgMjJweCAwO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlOWU5ZTl9dWwuYWNjb3JkaW9uPmxpe2xpc3Qtc3R5bGU6bm9uZTttYXJnaW46MDtwYWRkaW5nOjA7Ym9yZGVyLXRvcDoxcHggc29saWQgI2U5ZTllOX11bC5hY2NvcmRpb24+bGk+ZGl2LnRpdGxle2N1cnNvcjpwb2ludGVyO2JhY2tncm91bmQ6I2Y2ZjZmNjtwYWRkaW5nOjE1cHg7bWFyZ2luOjA7cG9zaXRpb246cmVsYXRpdmU7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICNlOWU5ZTk7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjZTllOWU5Oy13ZWJraXQtdHJhbnNpdGlvbjowLjE1cyBiYWNrZ3JvdW5kIGxpbmVhcjstbW96LXRyYW5zaXRpb246MC4xNXMgYmFja2dyb3VuZCBsaW5lYXI7LW8tdHJhbnNpdGlvbjowLjE1cyBiYWNrZ3JvdW5kIGxpbmVhcjt0cmFuc2l0aW9uOjAuMTVzIGJhY2tncm91bmQgbGluZWFyfXVsLmFjY29yZGlvbj5saT5kaXYudGl0bGUgaDEsdWwuYWNjb3JkaW9uPmxpPmRpdi50aXRsZSBoMix1bC5hY2NvcmRpb24+bGk+ZGl2LnRpdGxlIGgzLHVsLmFjY29yZGlvbj5saT5kaXYudGl0bGUgaDQsdWwuYWNjb3JkaW9uPmxpPmRpdi50aXRsZSBoNXttYXJnaW46MH11bC5hY2NvcmRpb24+bGk+ZGl2LnRpdGxlOmFmdGVye2NvbnRlbnQ6IiI7ZGlzcGxheTpibG9jazt3aWR0aDowO2hlaWdodDowO2JvcmRlcjpzb2xpZCA2cHg7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50ICM5ZDlkOWQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MTVweDt0b3A6MjFweH11bC5hY2NvcmRpb24+bGkgLmNvbnRlbnR7ZGlzcGxheTpub25lO3BhZGRpbmc6MTVweH11bC5hY2NvcmRpb24+bGkuYWN0aXZle2JvcmRlci10b3A6M3B4IHNvbGlkICMyYmE2Y2J9dWwuYWNjb3JkaW9uPmxpLmFjdGl2ZSAudGl0bGV7YmFja2dyb3VuZDojZmZmO3BhZGRpbmctdG9wOjEzcHh9dWwuYWNjb3JkaW9uPmxpLmFjdGl2ZSAudGl0bGU6YWZ0ZXJ7Y29udGVudDoiIjtkaXNwbGF5OmJsb2NrO3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyOnNvbGlkIDZweDtib3JkZXItY29sb3I6IzlkOWQ5ZCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudH11bC5hY2NvcmRpb24+bGkuYWN0aXZlIC5jb250ZW50e2JhY2tncm91bmQ6I2ZmZjtkaXNwbGF5OmJsb2NrO2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjZTllOWU5O2JvcmRlci1yaWdodDoxcHggc29saWQgI2U5ZTllOX11bC5zaWRlLW5hdntkaXNwbGF5OmJsb2NrO2xpc3Qtc3R5bGU6bm9uZTttYXJnaW46MDtwYWRkaW5nOjE3cHggMH11bC5zaWRlLW5hdiBsaXtkaXNwbGF5OmJsb2NrO2xpc3Qtc3R5bGU6bm9uZTttYXJnaW46MCAwIDdweCAwfXVsLnNpZGUtbmF2IGxpIGF7ZGlzcGxheTpibG9ja311bC5zaWRlLW5hdiBsaS5hY3RpdmUgYXtjb2xvcjojNGQ0ZDRkO2ZvbnQtd2VpZ2h0OmJvbGR9dWwuc2lkZS1uYXYgbGkuZGl2aWRlcntib3JkZXItdG9wOjFweCBzb2xpZCAjZTZlNmU2O2hlaWdodDowO3BhZGRpbmc6MH1kbC5zdWItbmF2e2Rpc3BsYXk6YmxvY2s7d2lkdGg6YXV0bztvdmVyZmxvdzpoaWRkZW47bWFyZ2luOi00cHggMCAxOHB4O21hcmdpbi1yaWdodDowO21hcmdpbi1sZWZ0Oi05cHg7cGFkZGluZy10b3A6NHB4fWRsLnN1Yi1uYXYgZHQsZGwuc3ViLW5hdiBkZHtmbG9hdDpsZWZ0O2Rpc3BsYXk6aW5saW5lO21hcmdpbi1sZWZ0OjlweDttYXJnaW4tYm90dG9tOjEwcHh9ZGwuc3ViLW5hdiBkdHtjb2xvcjojOTk5O2ZvbnQtd2VpZ2h0Om5vcm1hbH1kbC5zdWItbmF2IGRkIGF7dGV4dC1kZWNvcmF0aW9uOm5vbmU7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjEwMDBweDstbW96LWJvcmRlci1yYWRpdXM6MTAwMHB4Oy1tcy1ib3JkZXItcmFkaXVzOjEwMDBweDstby1ib3JkZXItcmFkaXVzOjEwMDBweDtib3JkZXItcmFkaXVzOjEwMDBweH1kbC5zdWItbmF2IGRkLmFjdGl2ZSBhe2ZvbnQtd2VpZ2h0OmJvbGQ7YmFja2dyb3VuZDojMmJhNmNiO2NvbG9yOiNmZmY7cGFkZGluZzozcHggOXB4O2N1cnNvcjpkZWZhdWx0fXVsLnBhZ2luYXRpb257ZGlzcGxheTpibG9jaztoZWlnaHQ6MjRweDttYXJnaW4tbGVmdDotNXB4fXVsLnBhZ2luYXRpb24gbGl7ZmxvYXQ6bGVmdDtkaXNwbGF5OmJsb2NrO2hlaWdodDoyNHB4O2NvbG9yOiM5OTk7Zm9udC1zaXplOjE0cHg7bWFyZ2luLWxlZnQ6NXB4fXVsLnBhZ2luYXRpb24gbGkgYXtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6MXB4IDdweCAxcHg7Y29sb3I6IzU1NX11bC5wYWdpbmF0aW9uIGxpOmhvdmVyIGEsdWwucGFnaW5hdGlvbiBsaSBhOmZvY3Vze2JhY2tncm91bmQ6I2U2ZTZlNn11bC5wYWdpbmF0aW9uIGxpLnVuYXZhaWxhYmxlIGF7Y3Vyc29yOmRlZmF1bHQ7Y29sb3I6Izk5OX11bC5wYWdpbmF0aW9uIGxpLnVuYXZhaWxhYmxlOmhvdmVyIGEsdWwucGFnaW5hdGlvbiBsaS51bmF2YWlsYWJsZSBhOmZvY3Vze2JhY2tncm91bmQ6dHJhbnNwYXJlbnR9dWwucGFnaW5hdGlvbiBsaS5jdXJyZW50IGF7YmFja2dyb3VuZDojMmJhNmNiO2NvbG9yOiNmZmY7Zm9udC13ZWlnaHQ6Ym9sZDtjdXJzb3I6ZGVmYXVsdH11bC5wYWdpbmF0aW9uIGxpLmN1cnJlbnQgYTpob3Zlcix1bC5wYWdpbmF0aW9uIGxpLmN1cnJlbnQgYTpmb2N1c3tiYWNrZ3JvdW5kOiMyYmE2Y2J9ZGl2LnBhZ2luYXRpb24tY2VudGVyZWR7dGV4dC1hbGlnbjpjZW50ZXJ9ZGl2LnBhZ2luYXRpb24tY2VudGVyZWQgdWw+bGl7ZmxvYXQ6bm9uZTtkaXNwbGF5OmlubGluZS1ibG9ja311bC5icmVhZGNydW1ic3tkaXNwbGF5OmJsb2NrO2JhY2tncm91bmQ6I2Y2ZjZmNjtwYWRkaW5nOjZweCAxMHB4IDdweDtib3JkZXI6MXB4IHNvbGlkICNlOWU5ZTk7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjJweDstbW96LWJvcmRlci1yYWRpdXM6MnB4Oy1tcy1ib3JkZXItcmFkaXVzOjJweDstby1ib3JkZXItcmFkaXVzOjJweDtib3JkZXItcmFkaXVzOjJweDtvdmVyZmxvdzpoaWRkZW47bWFyZ2luLWxlZnQ6MH11bC5icmVhZGNydW1icyBsaXttYXJnaW46MDtwYWRkaW5nOjAgMTJweCAwIDA7ZmxvYXQ6bGVmdDtsaXN0LXN0eWxlOm5vbmV9dWwuYnJlYWRjcnVtYnMgbGkgYSx1bC5icmVhZGNydW1icyBsaSBzcGFue3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtmb250LXNpemU6MTFweDtmb250LXNpemU6MS4xcmVtO3BhZGRpbmctbGVmdDoxMnB4fXVsLmJyZWFkY3J1bWJzIGxpOmZpcnN0LWNoaWxkIGEsdWwuYnJlYWRjcnVtYnMgbGk6Zmlyc3QtY2hpbGQgc3BhbntwYWRkaW5nLWxlZnQ6MH11bC5icmVhZGNydW1icyBsaTpiZWZvcmV7Y29udGVudDoiLyI7Y29sb3I6I2FhYX11bC5icmVhZGNydW1icyBsaTpmaXJzdC1jaGlsZDpiZWZvcmV7Y29udGVudDoiICJ9dWwuYnJlYWRjcnVtYnMgbGkuY3VycmVudCBhe2N1cnNvcjpkZWZhdWx0O2NvbG9yOiMzMzN9dWwuYnJlYWRjcnVtYnMgbGk6aG92ZXIgYSx1bC5icmVhZGNydW1icyBsaSBhOmZvY3Vze3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmV9dWwuYnJlYWRjcnVtYnMgbGkuY3VycmVudDpob3ZlciBhLHVsLmJyZWFkY3J1bWJzIGxpLmN1cnJlbnQgYTpmb2N1c3t0ZXh0LWRlY29yYXRpb246bm9uZX11bC5icmVhZGNydW1icyBsaS51bmF2YWlsYWJsZSBhe2NvbG9yOiM5OTl9dWwuYnJlYWRjcnVtYnMgbGkudW5hdmFpbGFibGU6aG92ZXIgYSx1bC5icmVhZGNydW1icyBsaS51bmF2YWlsYWJsZSBhOmZvY3Vze3RleHQtZGVjb3JhdGlvbjpub25lO2NvbG9yOiM5OTk7Y3Vyc29yOmRlZmF1bHR9dWwuaW5saW5lLWxpc3QsdWwubGluay1saXN0e21hcmdpbjowIDAgMTdweCAtMjJweDtwYWRkaW5nOjA7bGlzdC1zdHlsZTpub25lO292ZXJmbG93OmhpZGRlbn11bC5pbmxpbmUtbGlzdD5saSx1bC5saW5rLWxpc3Q+bGl7bGlzdC1zdHlsZTpub25lO2Zsb2F0OmxlZnQ7bWFyZ2luLWxlZnQ6MjJweDtkaXNwbGF5OmJsb2NrfXVsLmlubGluZS1saXN0PmxpPiosdWwubGluay1saXN0PmxpPip7ZGlzcGxheTpibG9ja30ua2V5c3Ryb2tlLGtiZHtmb250LWZhbWlseToiQ29uc29sYXMiLCAiTWVubG8iLCAiQ291cmllciIsIG1vbm9zcGFjZTtmb250LXNpemU6MTNweDtwYWRkaW5nOjJweCA0cHggMHB4O21hcmdpbjowO2JhY2tncm91bmQ6I2VkZWRlZDtib3JkZXI6c29saWQgMXB4ICNkYmRiZGI7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjNweDstbW96LWJvcmRlci1yYWRpdXM6M3B4Oy1tcy1ib3JkZXItcmFkaXVzOjNweDstby1ib3JkZXItcmFkaXVzOjNweDtib3JkZXItcmFkaXVzOjNweH0udGh7ZGlzcGxheTpibG9ja30udGggaW1ne2Rpc3BsYXk6YmxvY2s7Ym9yZGVyOnNvbGlkIDRweCAjZmZmOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggcmdiYSgwLDAsMCwwLjIpOy1tb3otYm94LXNoYWRvdzowIDAgMCAxcHggcmdiYSgwLDAsMCwwLjIpO2JveC1zaGFkb3c6MCAwIDAgMXB4IHJnYmEoMCwwLDAsMC4yKTstd2Via2l0LWJvcmRlci1yYWRpdXM6M3B4Oy1tb3otYm9yZGVyLXJhZGl1czozcHg7LW1zLWJvcmRlci1yYWRpdXM6M3B4Oy1vLWJvcmRlci1yYWRpdXM6M3B4O2JvcmRlci1yYWRpdXM6M3B4Oy13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTpib3gtc2hhZG93Oy1tb3otdHJhbnNpdGlvbi1wcm9wZXJ0eTpib3gtc2hhZG93Oy1vLXRyYW5zaXRpb24tcHJvcGVydHk6Ym94LXNoYWRvdzt0cmFuc2l0aW9uLXByb3BlcnR5OmJveC1zaGFkb3c7LXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOjMwMG1zOy1tb3otdHJhbnNpdGlvbi1kdXJhdGlvbjozMDBtczstby10cmFuc2l0aW9uLWR1cmF0aW9uOjMwMG1zO3RyYW5zaXRpb24tZHVyYXRpb246MzAwbXN9LnRoOmhvdmVyIGltZywudGg6Zm9jdXMgaW1ney13ZWJraXQtYm94LXNoYWRvdzowIDAgNnB4IDFweCByZ2JhKDQzLDE2NiwyMDMsMC41KTstbW96LWJveC1zaGFkb3c6MCAwIDZweCAxcHggcmdiYSg0MywxNjYsMjAzLDAuNSk7Ym94LXNoYWRvdzowIDAgNnB4IDFweCByZ2JhKDQzLDE2NiwyMDMsMC41KX0uZmxleC12aWRlb3twb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nLXRvcDoyNXB4O3BhZGRpbmctYm90dG9tOjY3LjUlO2hlaWdodDowO21hcmdpbi1ib3R0b206MTZweDtvdmVyZmxvdzpoaWRkZW59LmZsZXgtdmlkZW8ud2lkZXNjcmVlbntwYWRkaW5nLWJvdHRvbTo1Ny4yNSV9LmZsZXgtdmlkZW8udmltZW97cGFkZGluZy10b3A6MH0uZmxleC12aWRlbyBpZnJhbWUsLmZsZXgtdmlkZW8gb2JqZWN0LC5mbGV4LXZpZGVvIGVtYmVkLC5mbGV4LXZpZGVvIHZpZGVve3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlfXRhYmxle2JhY2tncm91bmQ6I2ZmZjstd2Via2l0LWJvcmRlci1yYWRpdXM6M3B4Oy1tb3otYm9yZGVyLXJhZGl1czozcHg7LW1zLWJvcmRlci1yYWRpdXM6M3B4Oy1vLWJvcmRlci1yYWRpdXM6M3B4O2JvcmRlci1yYWRpdXM6M3B4O21hcmdpbjowIDAgMThweDtib3JkZXI6MXB4IHNvbGlkICNkZGR9dGFibGUgdGhlYWQsdGFibGUgdGZvb3R7YmFja2dyb3VuZDojZjVmNWY1fXRhYmxlIHRoZWFkIHRyIHRoLHRhYmxlIHRmb290IHRyIHRoLHRhYmxlIHRib2R5IHRyIHRkLHRhYmxlIHRyIHRkLHRhYmxlIHRmb290IHRyIHRke2Rpc3BsYXk6dGFibGUtY2VsbDtmb250LXNpemU6MTRweDtsaW5lLWhlaWdodDoxOHB4O3RleHQtYWxpZ246bGVmdH10YWJsZSB0aGVhZCB0ciB0aCx0YWJsZSB0Zm9vdCB0ciB0ZHtwYWRkaW5nOjhweCAxMHB4IDlweDtmb250LXNpemU6MTRweDtmb250LXdlaWdodDpib2xkO2NvbG9yOiMyMjJ9dGFibGUgdGhlYWQgdHIgdGg6Zmlyc3QtY2hpbGQsdGFibGUgdGZvb3QgdHIgdGQ6Zmlyc3QtY2hpbGR7Ym9yZGVyLWxlZnQ6bm9uZX10YWJsZSB0aGVhZCB0ciB0aDpsYXN0LWNoaWxkLHRhYmxlIHRmb290IHRyIHRkOmxhc3QtY2hpbGR7Ym9yZGVyLXJpZ2h0Om5vbmV9dGFibGUgdGJvZHkgdHIuZXZlbix0YWJsZSB0Ym9keSB0ci5hbHR7YmFja2dyb3VuZDojZjlmOWY5fXRhYmxlIHRib2R5IHRyOm50aC1jaGlsZChldmVuKXtiYWNrZ3JvdW5kOiNmOWY5Zjl9dGFibGUgdGJvZHkgdHIgdGR7Y29sb3I6IzMzMztwYWRkaW5nOjlweCAxMHB4O3ZlcnRpY2FsLWFsaWduOnRvcDtib3JkZXI6bm9uZX11bC52Y2FyZHtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW46MCAwIDEycHggMDtib3JkZXI6MXB4IHNvbGlkICNkZGQ7cGFkZGluZzoxMHB4fXVsLnZjYXJkIGxpe21hcmdpbjowO2Rpc3BsYXk6YmxvY2t9dWwudmNhcmQgbGkuZm57Zm9udC13ZWlnaHQ6Ym9sZDtmb250LXNpemU6MTVweH1wLnZldmVudCBzcGFuLnN1bW1hcnl7Zm9udC13ZWlnaHQ6Ym9sZH1wLnZldmVudCBhYmJye2N1cnNvcjpkZWZhdWx0O3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOm5vbmU7cGFkZGluZzowIDFweH1kaXYucHJvZ3Jlc3N7cGFkZGluZzoycHg7bWFyZ2luLWJvdHRvbToxMHB4O2JvcmRlcjoxcHggc29saWQgI2NjYztoZWlnaHQ6MjVweH1kaXYucHJvZ3Jlc3MgLm1ldGVye2JhY2tncm91bmQ6IzJiYTZjYjtoZWlnaHQ6MTAwJTtkaXNwbGF5OmJsb2NrO3dpZHRoOjUwJX1kaXYucHJvZ3Jlc3Muc2Vjb25kYXJ5IC5tZXRlcntiYWNrZ3JvdW5kOiNlOWU5ZTl9ZGl2LnByb2dyZXNzLnN1Y2Nlc3MgLm1ldGVye2JhY2tncm91bmQ6IzVkYTQyM31kaXYucHJvZ3Jlc3MuYWxlcnQgLm1ldGVye2JhY2tncm91bmQ6I2M2MGYxM31kaXYucHJvZ3Jlc3MucmFkaXVzey13ZWJraXQtYm9yZGVyLXJhZGl1czozcHg7LW1vei1ib3JkZXItcmFkaXVzOjNweDstbXMtYm9yZGVyLXJhZGl1czozcHg7LW8tYm9yZGVyLXJhZGl1czozcHg7Ym9yZGVyLXJhZGl1czozcHh9ZGl2LnByb2dyZXNzLnJhZGl1cyAubWV0ZXJ7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjJweDstbW96LWJvcmRlci1yYWRpdXM6MnB4Oy1tcy1ib3JkZXItcmFkaXVzOjJweDstby1ib3JkZXItcmFkaXVzOjJweDtib3JkZXItcmFkaXVzOjJweH1kaXYucHJvZ3Jlc3Mucm91bmR7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjEwMDBweDstbW96LWJvcmRlci1yYWRpdXM6MTAwMHB4Oy1tcy1ib3JkZXItcmFkaXVzOjEwMDBweDstby1ib3JkZXItcmFkaXVzOjEwMDBweDtib3JkZXItcmFkaXVzOjEwMDBweH1kaXYucHJvZ3Jlc3Mucm91bmQgLm1ldGVyey13ZWJraXQtYm9yZGVyLXJhZGl1czoxMDAwcHg7LW1vei1ib3JkZXItcmFkaXVzOjEwMDBweDstbXMtYm9yZGVyLXJhZGl1czoxMDAwcHg7LW8tYm9yZGVyLXJhZGl1czoxMDAwcHg7Ym9yZGVyLXJhZGl1czoxMDAwcHh9LnByaWNpbmctdGFibGV7Ym9yZGVyOnNvbGlkIDFweCAjZGRkO21hcmdpbi1sZWZ0OjA7bWFyZ2luLWJvdHRvbToyMHB4fS5wcmljaW5nLXRhYmxlICp7bGlzdC1zdHlsZTpub25lO2xpbmUtaGVpZ2h0OjF9LnByaWNpbmctdGFibGUgLnRpdGxle2JhY2tncm91bmQtY29sb3I6I2RkZDtwYWRkaW5nOjE1cHggMjBweDt0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojMzMzO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zaXplOjE2cHh9LnByaWNpbmctdGFibGUgLnByaWNle2JhY2tncm91bmQtY29sb3I6I2VlZTtwYWRkaW5nOjE1cHggMjBweDt0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojMzMzO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXNpemU6MjBweH0ucHJpY2luZy10YWJsZSAuZGVzY3JpcHRpb257YmFja2dyb3VuZC1jb2xvcjojZmZmO3BhZGRpbmc6MTVweDt0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojNzc3O2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0Om5vcm1hbDtsaW5lLWhlaWdodDoxLjQ7Ym9yZGVyLWJvdHRvbTpkb3R0ZWQgMXB4ICNkZGR9LnByaWNpbmctdGFibGUgLmJ1bGxldC1pdGVte2JhY2tncm91bmQtY29sb3I6I2ZmZjtwYWRkaW5nOjE1cHg7dGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6IzMzMztmb250LXNpemU6MTRweDtmb250LXdlaWdodDpub3JtYWw7Ym9yZGVyLWJvdHRvbTpkb3R0ZWQgMXB4ICNkZGR9LnByaWNpbmctdGFibGUgLmN0YS1idXR0b257YmFja2dyb3VuZC1jb2xvcjojZjVmNWY1O3RleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MjBweH0udG9wLWJhci1qcy1icmVha3BvaW50e3dpZHRoOjk0MHB4ICFpbXBvcnRhbnQ7dmlzaWJpbGl0eTpoaWRkZW59LmNvbnRhaW4tdG8tZ3JpZHt3aWR0aDoxMDAlO2JhY2tncm91bmQ6IzIyMn0uZml4ZWR7d2lkdGg6MTAwJTtsZWZ0OjA7cG9zaXRpb246Zml4ZWQ7dG9wOjA7ei1pbmRleDo5OX0uc3RpY2t5e2Zsb2F0OmxlZnQ7b3ZlcmZsb3c6aGlkZGVufS5zdGlja3kuZml4ZWR7ZmxvYXQ6bm9uZX0udG9wLWJhcntiYWNrZ3JvdW5kOiMyMjI7bWluLWhlaWdodDo0NXB4O2xpbmUtaGVpZ2h0OjQ1cHg7bWFyZ2luOjAgMCAzMHB4IDA7cGFkZGluZzowO3dpZHRoOjEwMCU7cG9zaXRpb246cmVsYXRpdmV9LmNvbnRhaW4tdG8tZ3JpZCAudG9wLWJhcnttYXgtd2lkdGg6OTQwcHg7bWFyZ2luOjAgYXV0b30udG9wLWJhcj51bCAubmFtZSBoMXtsaW5lLWhlaWdodDo0NXB4O21hcmdpbjowfS50b3AtYmFyPnVsIC5uYW1lIGgxIGF7Zm9udC13ZWlnaHQ6Ym9sZDtwYWRkaW5nOjAgMjIuNXB4O2ZvbnQtc2l6ZToxN3B4ICFpbXBvcnRhbnR9LnRvcC1iYXI+dWwgLm5hbWUgaW1ne21hcmdpbi10b3A6LTVweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LnRvcC1iYXIuZXhwYW5kZWR7aGVpZ2h0OmluaGVyaXR9LnRvcC1iYXIgdWx7bWFyZ2luLWxlZnQ6MDtkaXNwbGF5OmlubGluZTtoZWlnaHQ6NDVweDtsaW5lLWhlaWdodDo0NXB4O2xpc3Qtc3R5bGU6bm9uZX0udG9wLWJhciB1bD5saXtmbG9hdDpsZWZ0fS50b3AtYmFyIHVsPmxpIGE6bm90KC5idXR0b24pe2NvbG9yOiNmZmY7ZGlzcGxheTpibG9jaztmb250LXNpemU6MTNweDtmb250LXdlaWdodDpib2xkO2hlaWdodDo0NXB4O2xpbmUtaGVpZ2h0OjQ1cHg7cGFkZGluZzowIDE1cHh9LnRvcC1iYXIgdWw+bGk6bm90KC5uYW1lKTpob3ZlciwudG9wLWJhciB1bD5saTpub3QoLm5hbWUpLmFjdGl2ZSwudG9wLWJhciB1bD5saTpub3QoLm5hbWUpOmZvY3Vze2JhY2tncm91bmQ6IzAwMH0udG9wLWJhciB1bD5saTpub3QoLm5hbWUpOmhvdmVyIGEsLnRvcC1iYXIgdWw+bGk6bm90KC5uYW1lKS5hY3RpdmUgYSwudG9wLWJhciB1bD5saTpub3QoLm5hbWUpOmZvY3VzIGF7Y29sb3I6I2Q5ZDlkOX0udG9wLWJhciB1bD5saS5kaXZpZGVye2JhY2tncm91bmQ6IzAwMDstd2Via2l0LWJveC1zaGFkb3c6MXB4IDAgMCByZ2JhKDI1NSwyNTUsMjU1LDAuMSk7LW1vei1ib3gtc2hhZG93OjFweCAwIDAgcmdiYSgyNTUsMjU1LDI1NSwwLjEpO2JveC1zaGFkb3c6MXB4IDAgMCByZ2JhKDI1NSwyNTUsMjU1LDAuMSk7aGVpZ2h0OjEwMCU7bWFyZ2luLXJpZ2h0OjFweDt3aWR0aDoxcHh9LnRvcC1iYXIgdWw+bGkuaGFzLWJ1dHRvbiBhLmJ1dHRvbnttYXJnaW46MCAxMS4yNXB4fS50b3AtYmFyIHVsPmxpLmhhcy1idXR0b246aG92ZXIsLnRvcC1iYXIgdWw+bGkuaGFzLWJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kOiMyMjJ9LnRvcC1iYXIgdWw+bGkuaGFzLWJ1dHRvbjpob3ZlciBhLC50b3AtYmFyIHVsPmxpLmhhcy1idXR0b246Zm9jdXMgYXtjb2xvcjojZmZmfS50b3AtYmFyIHVsPmxpLnNlYXJjaHtwYWRkaW5nOjAgMTVweH0udG9wLWJhciB1bD5saS5zZWFyY2ggZm9ybXtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tYm90dG9tOjA7dmVydGljYWwtYWxpZ246bWlkZGxlO3dpZHRoOjIwMHB4fS50b3AtYmFyIHVsPmxpLnNlYXJjaCBmb3JtIGlucHV0W3R5cGU9dGV4dF17LW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0OjA7LXdlYmtpdC1ib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowO2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjA7LW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbXJpZ2h0OjA7LXdlYmtpdC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjA7ZmxvYXQ6bGVmdDtmb250LXNpemU6MTNweDttYXJnaW4tdG9wOi0xcHg7aGVpZ2h0OjIyLjVweDttYXJnaW4tYm90dG9tOjA7d2lkdGg6MTMwcHh9LnRvcC1iYXIgdWw+bGkuc2VhcmNoIGZvcm0gaW5wdXRbdHlwZT10ZXh0XSsuYnV0dG9ue2JvcmRlci1sZWZ0Om5vbmU7LW1vei1ib3JkZXItcmFkaXVzLXRvcGxlZnQ6MDstd2Via2l0LWJvcmRlci10b3AtbGVmdC1yYWRpdXM6MDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjA7LW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbWxlZnQ6MDstd2Via2l0LWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjA7ZmxvYXQ6bGVmdDtmb250LXNpemU6MTJweDttYXJnaW4tdG9wOi0xcHg7cGFkZGluZzo1cHggMTJweCA0cHh9LnRvcC1iYXIgdWw+bGkuc2VhcmNoIGZvcm0gaW5wdXRbdHlwZT1zZWFyY2hde2ZvbnQtc2l6ZToxNnB4O21hcmdpbi1ib3R0b206MH0udG9wLWJhciB1bD5saS5zZWFyY2g6aG92ZXIsLnRvcC1iYXIgdWw+bGkuc2VhcmNoOmZvY3Vze2JhY2tncm91bmQ6IzIyMn0udG9wLWJhciB1bD5saS5sb2dpbntwYWRkaW5nOjAgMTVweH0udG9wLWJhciB1bD5saS5sb2dpbiBmb3Jte2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1ib3R0b206MDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7d2lkdGg6MzAwcHh9LnRvcC1iYXIgdWw+bGkubG9naW4gZm9ybSBpbnB1dHtmbG9hdDpsZWZ0O3dpZHRoOmF1dG87Zm9udC1zaXplOjEzcHg7bWFyZ2luLXRvcDotMXB4O2hlaWdodDoyMi41cHg7bWFyZ2luLWJvdHRvbTowfS50b3AtYmFyIHVsPmxpLmxvZ2luIGZvcm0gaW5wdXRbdHlwZT10ZXh0XXstbW96LWJvcmRlci1yYWRpdXMtdG9wcmlnaHQ6MDstd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOjA7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MDstbW96LWJvcmRlci1yYWRpdXMtYm90dG9tcmlnaHQ6MDstd2Via2l0LWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MDt3aWR0aDoxMjBweH0udG9wLWJhciB1bD5saS5sb2dpbiBmb3JtIGlucHV0W3R5cGU9cGFzc3dvcmRde21hcmdpbi1ib3R0b206MDstbW96LWJvcmRlci1yYWRpdXMtdG9wbGVmdDowOy13ZWJraXQtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czowO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MDstbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdDowOy13ZWJraXQtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MDt3aWR0aDoxMjBweH0udG9wLWJhciB1bD5saS5sb2dpbiBmb3JtIGlucHV0W3R5cGU9cGFzc3dvcmRdKy5idXR0b257Ym9yZGVyLWxlZnQ6bm9uZTstbW96LWJvcmRlci1yYWRpdXMtdG9wbGVmdDowOy13ZWJraXQtYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czowO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MDstbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdDowOy13ZWJraXQtYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MDstbW96LWJvcmRlci1yYWRpdXMtdG9wcmlnaHQ6MnB4Oy13ZWJraXQtYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MnB4O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjJweDstbW96LWJvcmRlci1yYWRpdXMtYm90dG9tcmlnaHQ6MnB4Oy13ZWJraXQtYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MnB4O2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjJweDtmbG9hdDpsZWZ0O2ZvbnQtc2l6ZToxMnB4O21hcmdpbi10b3A6LTFweDtwYWRkaW5nOjVweCAxMnB4IDRweDt3aWR0aDo2MHB4fS50b3AtYmFyIHVsPmxpLmxvZ2luOmhvdmVyLC50b3AtYmFyIHVsPmxpLmxvZ2luOmZvY3Vze2JhY2tncm91bmQ6IzIyMn0udG9wLWJhciB1bD5saS50b2dnbGUtdG9wYmFye2Rpc3BsYXk6bm9uZX0udG9wLWJhciB1bD5saS5oYXMtZHJvcGRvd257cG9zaXRpb246cmVsYXRpdmV9LnRvcC1iYXIgdWw+bGkuaGFzLWRyb3Bkb3duOmhvdmVyPi5kcm9wZG93biwudG9wLWJhciB1bD5saS5oYXMtZHJvcGRvd246Zm9jdXM+LmRyb3Bkb3due2Rpc3BsYXk6YmxvY2s7dmlzaWJpbGl0eTp2aXNpYmxlfS50b3AtYmFyIHVsPmxpLmhhcy1kcm9wZG93biBhe3BhZGRpbmctcmlnaHQ6MzMuNzVweH0udG9wLWJhciB1bD5saS5oYXMtZHJvcGRvd24gYTphZnRlcntjb250ZW50OiIiO2Rpc3BsYXk6YmxvY2s7d2lkdGg6MDtoZWlnaHQ6MDtib3JkZXI6c29saWQgNXB4O2JvcmRlci1jb2xvcjojZmZmIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O21hcmdpbi1yaWdodDoxNXB4O21hcmdpbi10b3A6LTIuNXB4O3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7dG9wOjUwJX0udG9wLWJhciB1bD5saS5oYXMtZHJvcGRvd24gLmRyb3Bkb3due2JhY2tncm91bmQ6IzIyMjtsZWZ0OjA7bWFyZ2luOjA7cGFkZGluZzo5cHggMCAwIDA7cG9zaXRpb246YWJzb2x1dGU7dmlzaWJpbGl0eTpoaWRkZW47ei1pbmRleDo5OX0udG9wLWJhciB1bD5saS5oYXMtZHJvcGRvd24gLmRyb3Bkb3duIGxpe2JhY2tncm91bmQ6IzIyMjtsaW5lLWhlaWdodDoxO21pbi13aWR0aDoxMDAlO3BhZGRpbmctYm90dG9tOjVweH0udG9wLWJhciB1bD5saS5oYXMtZHJvcGRvd24gLmRyb3Bkb3duIGxpIGF7Y29sb3I6I2ZmZjtmb250LXdlaWdodDpub3JtYWw7aGVpZ2h0OjEwMCU7bGluZS1oZWlnaHQ6MTtwYWRkaW5nOjVweCAxN3B4IDVweCAxNXB4O3doaXRlLXNwYWNlOm5vd3JhcH0udG9wLWJhciB1bD5saS5oYXMtZHJvcGRvd24gLmRyb3Bkb3duIGxpIGE6YWZ0ZXJ7Ym9yZGVyOm5vbmV9LnRvcC1iYXIgdWw+bGkuaGFzLWRyb3Bkb3duIC5kcm9wZG93biBsaSBhOmhvdmVyLC50b3AtYmFyIHVsPmxpLmhhcy1kcm9wZG93biAuZHJvcGRvd24gbGkgYTpmb2N1c3tiYWNrZ3JvdW5kOiMzYzNjM2N9LnRvcC1iYXIgdWw+bGkuaGFzLWRyb3Bkb3duIC5kcm9wZG93biBsaSBsYWJlbHtjb2xvcjojNmY2ZjZmO2ZvbnQtc2l6ZToxMHB4O2ZvbnQtd2VpZ2h0OmJvbGQ7bWFyZ2luOjA7cGFkZGluZy1sZWZ0OjE1cHg7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlfS50b3AtYmFyIHVsPmxpLmhhcy1kcm9wZG93biAuZHJvcGRvd24gbGkuZGl2aWRlcntib3JkZXItdG9wOnNvbGlkIDFweCAjMDAwOy13ZWJraXQtYm94LXNoYWRvdzowIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsMC4xKSBpbnNldDstbW96LWJveC1zaGFkb3c6MCAxcHggMCByZ2JhKDI1NSwyNTUsMjU1LDAuMSkgaW5zZXQ7Ym94LXNoYWRvdzowIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsMC4xKSBpbnNldDtoZWlnaHQ6MTBweDtwYWRkaW5nOjA7d2lkdGg6MTAwJX0udG9wLWJhciB1bD5saS5oYXMtZHJvcGRvd24gLmRyb3Bkb3duIGxpOmxhc3QtY2hpbGR7cGFkZGluZy1ib3R0b206MTBweH0udG9wLWJhciB1bD5saS5oYXMtZHJvcGRvd24gLmRyb3Bkb3duIGxpLmFjdGl2ZSBhe2JhY2tncm91bmQ6IzAwMH0udG9wLWJhciB1bD5saS5oYXMtZHJvcGRvd24gLmRyb3Bkb3duIGxpLmhhcy1kcm9wZG93bj5he3BhZGRpbmctcmlnaHQ6MzBweH0udG9wLWJhciB1bD5saS5oYXMtZHJvcGRvd24gLmRyb3Bkb3duIGxpLmhhcy1kcm9wZG93bj5hOmFmdGVye2JvcmRlcjpub25lO2NvbnRlbnQ6IlwwMGJiIjtyaWdodDo1cHg7dG9wOjZweH0udG9wLWJhciB1bD5saS5oYXMtZHJvcGRvd24gLmRyb3Bkb3duIGxpLmhhcy1kcm9wZG93biAuZHJvcGRvd257cG9zaXRpb246YWJzb2x1dGU7bGVmdDoxMDAlO3RvcDowfS50b3AtYmFyIHVsPmxpLmhhcy1kcm9wZG93biAuZHJvcGRvd24gbGkuaGFzLWRyb3Bkb3duOmhvdmVyPi5kcm9wZG93biwudG9wLWJhciB1bD5saS5oYXMtZHJvcGRvd24gLmRyb3Bkb3duIGxpLmhhcy1kcm9wZG93bjpmb2N1cz4uZHJvcGRvd257ZGlzcGxheTpibG9ja30udG9wLWJhciB1bC5sZWZ0e2Zsb2F0OmxlZnQ7d2lkdGg6YXV0bzttYXJnaW4tYm90dG9tOjB9LnRvcC1iYXIgdWwucmlnaHR7ZmxvYXQ6cmlnaHQ7d2lkdGg6YXV0bzttYXJnaW4tYm90dG9tOjB9LnRvcC1iYXIgdWwucmlnaHQgLmhhcy1kcm9wZG93biAuZHJvcGRvd257bGVmdDphdXRvO3JpZ2h0OjBweH0udG9wLWJhciB1bC5yaWdodCAuaGFzLWRyb3Bkb3duIC5kcm9wZG93biBsaS5oYXMtZHJvcGRvd24+LmRyb3Bkb3due3JpZ2h0OjEwMCU7bGVmdDphdXRvO3dpZHRoOjEwMCV9LnRvcC1iYXIgLmpzLWdlbmVyYXRlZHtkaXNwbGF5Om5vbmV9QC1tb3otZG9jdW1lbnQgdXJsLXByZWZpeCgpey50b3AtYmFyIHVsIGxpIC5idXR0b24uc21hbGx7cGFkZGluZy1ib3R0b206NnB4fS50b3AtYmFyIHVsIGxpLnNlYXJjaCBmb3JtIGlucHV0W3R5cGU9c2VhcmNoXXtmb250LXNpemU6MTRweDtoZWlnaHQ6MjJweDtwYWRkaW5nOjNweH19Lmx0LWllOSAudG9wLWJhciB1bCBsaSBhe2NvbG9yOiNmZmY7ZGlzcGxheTpibG9jaztmb250LXdlaWdodDpib2xkO2ZvbnQtc2l6ZToxM3B4O2hlaWdodDo0NXB4O2xpbmUtaGVpZ2h0OjQ1cHg7cGFkZGluZzowIDE1cHh9Lmx0LWllOSAudG9wLWJhciB1bCBsaSBhLmJ1dHRvbntoZWlnaHQ6YXV0bztsaW5lLWhlaWdodDozMHB4O21hcmdpbi10b3A6N3B4fS5sdC1pZTkgLnRvcC1iYXIgdWwgbGkgYSBpbWd7bWFyZ2luLXRvcDotNXB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0ubHQtaWU5IC50b3AtYmFyIHNlY3Rpb24+dWw+bGkgYTpob3ZlciwubHQtaWU5IC50b3AtYmFyIHNlY3Rpb24+dWw+bGkgYTpmb2N1c3tjb2xvcjojY2NjfS5sdC1pZTkgLnRvcC1iYXIgc2VjdGlvbj51bD5saTpob3ZlciwubHQtaWU5IC50b3AtYmFyIHNlY3Rpb24+dWw+bGk6Zm9jdXN7YmFja2dyb3VuZDojMDAwfS5sdC1pZTkgLnRvcC1iYXIgc2VjdGlvbj51bD5saS5zZWFyY2g6aG92ZXIsLmx0LWllOSAudG9wLWJhciBzZWN0aW9uPnVsPmxpLnNlYXJjaDpmb2N1cywubHQtaWU5IC50b3AtYmFyIHNlY3Rpb24+dWw+bGkuaGFzLWJ1dHRvbjpob3ZlciwubHQtaWU5IC50b3AtYmFyIHNlY3Rpb24+dWw+bGkuaGFzLWJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kOm5vbmV9Lmx0LWllOSAudG9wLWJhciBzZWN0aW9uPnVsPmxpLmFjdGl2ZXtiYWNrZ3JvdW5kOiMwMDA7Y29sb3I6I2Q5ZDlkOX0ubHQtaWU5IC50b3AtYmFyIHVsIGxpLmhhcy1kcm9wZG93bntwYWRkaW5nLXJpZ2h0OjMzLjc1cHh9Lmx0LWllOSAudG9wLWJhciB1bCBsaS5oYXMtZHJvcGRvd24+dWwgbGl7cGFkZGluZy1yaWdodDowfSNqb3lSaWRlVGlwQ29udGVudHtkaXNwbGF5Om5vbmV9LmpveXJpZGUtdGlwLWd1aWRle2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTtiYWNrZ3JvdW5kOiMwMDA7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuOCk7Y29sb3I6I2ZmZjt3aWR0aDozMDBweDt6LWluZGV4OjEwMTt0b3A6MDtsZWZ0OjA7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXdlaWdodDpub3JtYWw7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXM6NHB4Oy1tcy1ib3JkZXItcmFkaXVzOjRweDstby1ib3JkZXItcmFkaXVzOjRweDtib3JkZXItcmFkaXVzOjRweH0uam95cmlkZS1jb250ZW50LXdyYXBwZXJ7cGFkZGluZzoxOHB4IDIwcHggMjRweH0uam95cmlkZS10aXAtZ3VpZGUgc3Bhbi5qb3lyaWRlLW51YntkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MjJweDt3aWR0aDowO2hlaWdodDowO2JvcmRlcjpzb2xpZCAxNHB4fS5qb3lyaWRlLXRpcC1ndWlkZSBzcGFuLmpveXJpZGUtbnViLnRvcHtib3JkZXItY29sb3I6IzAwMDtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwwLjgpO2JvcmRlci10b3AtY29sb3I6dHJhbnNwYXJlbnQgIWltcG9ydGFudDtib3JkZXItbGVmdC1jb2xvcjp0cmFuc3BhcmVudCAhaW1wb3J0YW50O2JvcmRlci1yaWdodC1jb2xvcjp0cmFuc3BhcmVudCAhaW1wb3J0YW50O3RvcDotMjhweDtib3R0b206bm9uZX0uam95cmlkZS10aXAtZ3VpZGUgc3Bhbi5qb3lyaWRlLW51Yi5ib3R0b217Ym9yZGVyLWNvbG9yOiMwMDA7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsMC44KSAhaW1wb3J0YW50O2JvcmRlci1ib3R0b20tY29sb3I6dHJhbnNwYXJlbnQgIWltcG9ydGFudDtib3JkZXItbGVmdC1jb2xvcjp0cmFuc3BhcmVudCAhaW1wb3J0YW50O2JvcmRlci1yaWdodC1jb2xvcjp0cmFuc3BhcmVudCAhaW1wb3J0YW50O2JvdHRvbTotMjhweDtib3R0b206bm9uZX0uam95cmlkZS10aXAtZ3VpZGUgc3Bhbi5qb3lyaWRlLW51Yi5yaWdodHtib3JkZXItY29sb3I6IzAwMDtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwwLjgpICFpbXBvcnRhbnQ7Ym9yZGVyLXRvcC1jb2xvcjp0cmFuc3BhcmVudCAhaW1wb3J0YW50O2JvcmRlci1yaWdodC1jb2xvcjp0cmFuc3BhcmVudCAhaW1wb3J0YW50O2JvcmRlci1ib3R0b20tY29sb3I6dHJhbnNwYXJlbnQgIWltcG9ydGFudDt0b3A6MjJweDtib3R0b206bm9uZTtsZWZ0OmF1dG87cmlnaHQ6LTI4cHh9LmpveXJpZGUtdGlwLWd1aWRlIHNwYW4uam95cmlkZS1udWIubGVmdHtib3JkZXItY29sb3I6IzAwMDtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwwLjgpICFpbXBvcnRhbnQ7Ym9yZGVyLXRvcC1jb2xvcjp0cmFuc3BhcmVudCAhaW1wb3J0YW50O2JvcmRlci1sZWZ0LWNvbG9yOnRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbS1jb2xvcjp0cmFuc3BhcmVudCAhaW1wb3J0YW50O3RvcDoyMnB4O2xlZnQ6LTI4cHg7cmlnaHQ6YXV0bztib3R0b206bm9uZX0uam95cmlkZS10aXAtZ3VpZGUgaDEsLmpveXJpZGUtdGlwLWd1aWRlIGgyLC5qb3lyaWRlLXRpcC1ndWlkZSBoMywuam95cmlkZS10aXAtZ3VpZGUgaDQsLmpveXJpZGUtdGlwLWd1aWRlIGg1LC5qb3lyaWRlLXRpcC1ndWlkZSBoNntsaW5lLWhlaWdodDoxLjI1O21hcmdpbjowO2ZvbnQtd2VpZ2h0OmJvbGQ7Y29sb3I6I2ZmZn0uam95cmlkZS10aXAtZ3VpZGUgcHttYXJnaW46MCAwIDE4cHggMDtmb250LXNpemU6MTRweDtsaW5lLWhlaWdodDoxLjN9LmpveXJpZGUtdGltZXItaW5kaWNhdG9yLXdyYXB7d2lkdGg6NTBweDtoZWlnaHQ6M3B4O2JvcmRlcjpzb2xpZCAxcHggIzU1NTtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDoxN3B4O2JvdHRvbToxNnB4fS5qb3lyaWRlLXRpbWVyLWluZGljYXRvcntkaXNwbGF5OmJsb2NrO3dpZHRoOjA7aGVpZ2h0OmluaGVyaXQ7YmFja2dyb3VuZDojNjY2fS5qb3lyaWRlLWNsb3NlLXRpcHtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDoxMHB4O3RvcDoxMHB4O2NvbG9yOiM3NzcgIWltcG9ydGFudDt0ZXh0LWRlY29yYXRpb246bm9uZTtmb250LXNpemU6MjBweDtmb250LXdlaWdodDpub3JtYWw7bGluZS1oZWlnaHQ6LjUgIWltcG9ydGFudH0uam95cmlkZS1jbG9zZS10aXA6aG92ZXIsLmpveXJpZGUtY2xvc2UtdGlwOmZvY3Vze2NvbG9yOiNlZWUgIWltcG9ydGFudH0uam95cmlkZS1tb2RhbC1iZ3twb3NpdGlvbjpmaXhlZDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuNSk7ei1pbmRleDoxMDA7ZGlzcGxheTpub25lO3RvcDowO2xlZnQ6MDtjdXJzb3I6cG9pbnRlcn0uY2xlYXJpbmctYmxhY2tvdXR7YmFja2dyb3VuZDojMDAwO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjgpO3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7dG9wOjA7bGVmdDowO3otaW5kZXg6OTk5fS5jbGVhcmluZy1ibGFja291dCAuY2xlYXJpbmctY2xvc2V7ZGlzcGxheTpibG9ja30uY2xlYXJpbmctY29udGFpbmVye3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6OTk5O2hlaWdodDoxMDAlO292ZXJmbG93OmhpZGRlbn0udmlzaWJsZS1pbWd7aGVpZ2h0Ojc1JTtwb3NpdGlvbjpyZWxhdGl2ZX0udmlzaWJsZS1pbWcgaW1ne3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6NTAlO3RvcDo1MCU7bWFyZ2luLWxlZnQ6LTUwJTttYXgtaGVpZ2h0OjEwMCU7bWF4LXdpZHRoOjEwMCV9LnZpc2libGUtaW1nIC5jbGVhcmluZy1jYXB0aW9ue2NvbG9yOiNmZmY7bWFyZ2luLWJvdHRvbTowO3RleHQtYWxpZ246Y2VudGVyO3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbTowO2JhY2tncm91bmQ6IzAwMDtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMC43KTt3aWR0aDoxMDAlO3BhZGRpbmc6MTBweCAxMDBweH0uY2xlYXJpbmctY2xvc2V7ei1pbmRleDo5OTk7cG9zaXRpb246YWJzb2x1dGU7dG9wOjEwcHg7cmlnaHQ6MjBweDtmb250LXNpemU6MzBweDtsaW5lLWhlaWdodDoxO2NvbG9yOiNmZmY7ZGlzcGxheTpub25lfS5jbGVhcmluZy1jbG9zZTpob3ZlciwuY2xlYXJpbmctY2xvc2U6Zm9jdXN7Y29sb3I6I2NjY30uY2xlYXJpbmctbWFpbi1sZWZ0LC5jbGVhcmluZy1tYWluLXJpZ2h0e3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7bWFyZ2luLXRvcDotMTZweH0uY2xlYXJpbmctbWFpbi1sZWZ0LmRpc2FibGVkLC5jbGVhcmluZy1tYWluLXJpZ2h0LmRpc2FibGVke29wYWNpdHk6MC41fS5jbGVhcmluZy1tYWluLWxlZnQ6YWN0aXZlLC5jbGVhcmluZy1tYWluLXJpZ2h0OmFjdGl2ZXttYXJnaW4tdG9wOi0xNXB4fS5jbGVhcmluZy1tYWluLWxlZnR7bGVmdDoxMHB4O2NvbnRlbnQ6IiI7ZGlzcGxheTpibG9jazt3aWR0aDowO2hlaWdodDowO2JvcmRlcjpzb2xpZCAxNnB4O2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudCAjZmZmIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50fS5jbGVhcmluZy1tYWluLXJpZ2h0e3JpZ2h0OjEwcHg7Y29udGVudDoiIjtkaXNwbGF5OmJsb2NrO3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyOnNvbGlkIDE2cHg7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICNmZmZ9dWxbZGF0YS1jbGVhcmluZ10uYmxvY2stZ3JpZC50aHJlZS11cD5saTpudGgtY2hpbGQoM24rMSl7Y2xlYXI6bm9uZX11bFtkYXRhLWNsZWFyaW5nXSBsaXtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmJsb2NrfXVsW2RhdGEtY2xlYXJpbmddIGxpLmNsZWFyaW5nLWZlYXR1cmUgfiBsaXtkaXNwbGF5Om5vbmV9LmNsZWFyaW5nLWFzc2VtYmxlZCAuY2xlYXJpbmctY29udGFpbmVyIC5jYXJvdXNlbHtiYWNrZ3JvdW5kOiMwMDA7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuNzUpO2hlaWdodDoxNTBweDttYXJnaW4tdG9wOjVweH0uY2xlYXJpbmctYXNzZW1ibGVkIC5jbGVhcmluZy1jb250YWluZXIgLnZpc2libGUtaW1ne2JhY2tncm91bmQ6IzAwMDtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMC43NSk7b3ZlcmZsb3c6aGlkZGVufS5jbGVhcmluZy1hc3NlbWJsZWQgLmNsZWFyaW5nLWNvbnRhaW5lciB1bFtkYXRhLWNsZWFyaW5nXXt6LWluZGV4Ojk5OTt3aWR0aDoyMDAlO2hlaWdodDoxMDAlO21hcmdpbi1sZWZ0OjA7cG9zaXRpb246cmVsYXRpdmU7bGVmdDowfS5jbGVhcmluZy1hc3NlbWJsZWQgLmNsZWFyaW5nLWNvbnRhaW5lciB1bFtkYXRhLWNsZWFyaW5nXSBsaXtkaXNwbGF5OmJsb2NrO3dpZHRoOjE3NXB4O2hlaWdodDppbmhlcml0O3BhZGRpbmc6MDtmbG9hdDpsZWZ0O292ZXJmbG93OmhpZGRlbjtiYWNrZ3JvdW5kOiMyMjI7bWFyZ2luLXJpZ2h0OjFweDtwb3NpdGlvbjpyZWxhdGl2ZX0uY2xlYXJpbmctYXNzZW1ibGVkIC5jbGVhcmluZy1jb250YWluZXIgdWxbZGF0YS1jbGVhcmluZ10gbGkuZml4LWhlaWdodCBpbWd7bWluLWhlaWdodDoxMDAlO2hlaWdodDoxMDAlO21heC13aWR0aDpub25lfS5jbGVhcmluZy1hc3NlbWJsZWQgLmNsZWFyaW5nLWNvbnRhaW5lciB1bFtkYXRhLWNsZWFyaW5nXSBsaSBpbWd7Y3Vyc29yOnBvaW50ZXIgIWltcG9ydGFudDttaW4td2lkdGg6MTAwJSAhaW1wb3J0YW50fS5jbGVhcmluZy1hc3NlbWJsZWQgLmNsZWFyaW5nLWNvbnRhaW5lciB1bFtkYXRhLWNsZWFyaW5nXSBsaS52aXNpYmxle2JvcmRlci10b3A6NHB4IHNvbGlkICNmZmZ9dWwuYmxvY2stZ3JpZFtkYXRhLWNsZWFyaW5nXXtvdmVyZmxvdzp2aXNpYmxlfS5jbGVhcmluZy1ibGFja291dCB1bC5ibG9jay1ncmlkW2RhdGEtY2xlYXJpbmddLnR3by11cD5saTpudGgtY2hpbGQoMm4rMSl7Y2xlYXI6bm9uZX0uY2xlYXJpbmctYmxhY2tvdXQgdWwuYmxvY2stZ3JpZFtkYXRhLWNsZWFyaW5nXS50aHJlZS11cD5saTpudGgtY2hpbGQoM24rMSl7Y2xlYXI6bm9uZX0uY2xlYXJpbmctYmxhY2tvdXQgdWwuYmxvY2stZ3JpZFtkYXRhLWNsZWFyaW5nXS5mb3VyLXVwPmxpOm50aC1jaGlsZCg0bisxKXtjbGVhcjpub25lfS5jbGVhcmluZy1ibGFja291dCB1bC5ibG9jay1ncmlkW2RhdGEtY2xlYXJpbmddLmZpdmUtdXA+bGk6bnRoLWNoaWxkKDVuKzEpe2NsZWFyOm5vbmV9LmNsZWFyaW5nLWJsYWNrb3V0IHVsLmJsb2NrLWdyaWRbZGF0YS1jbGVhcmluZ10uc2l4LXVwPmxpOm50aC1jaGlsZCg2bisxKXtjbGVhcjpub25lfS5jbGVhcmluZy1ibGFja291dCB1bC5ibG9jay1ncmlkW2RhdGEtY2xlYXJpbmddLnNldmVuLXVwPmxpOm50aC1jaGlsZCg3bisxKXtjbGVhcjpub25lfS5jbGVhcmluZy1ibGFja291dCB1bC5ibG9jay1ncmlkW2RhdGEtY2xlYXJpbmddLmVpZ2h0LXVwPmxpOm50aC1jaGlsZCg4bisxKXtjbGVhcjpub25lfS5jbGVhcmluZy1ibGFja291dCB1bC5ibG9jay1ncmlkW2RhdGEtY2xlYXJpbmddLm5pbmUtdXA+bGk6bnRoLWNoaWxkKDluKzEpe2NsZWFyOm5vbmV9LmNsZWFyaW5nLWJsYWNrb3V0IHVsLmJsb2NrLWdyaWRbZGF0YS1jbGVhcmluZ10udGVuLXVwPmxpOm50aC1jaGlsZCgxMG4rMSl7Y2xlYXI6bm9uZX0uY2xlYXJpbmctYmxhY2tvdXQgdWwuYmxvY2stZ3JpZFtkYXRhLWNsZWFyaW5nXS5lbGV2ZW4tdXA+bGk6bnRoLWNoaWxkKDExbisxKXtjbGVhcjpub25lfS5jbGVhcmluZy1ibGFja291dCB1bC5ibG9jay1ncmlkW2RhdGEtY2xlYXJpbmddLnR3ZWx2ZS11cD5saTpudGgtY2hpbGQoMTJuKzEpe2NsZWFyOm5vbmV9LmNsZWFyaW5nLWJsYWNrb3V0IC50aCBpbWd7Ym9yZGVyOm5vbmU7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgwLDAsMCwwKTstbW96LWJveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDAsMCwwLDApO2JveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDAsMCwwLDApOy13ZWJraXQtYm9yZGVyLXJhZGl1czowOy1tb3otYm9yZGVyLXJhZGl1czowOy1tcy1ib3JkZXItcmFkaXVzOjA7LW8tYm9yZGVyLXJhZGl1czowO2JvcmRlci1yYWRpdXM6MH0uY2xlYXJpbmctYmxhY2tvdXQ6aG92ZXIgaW1nLC5jbGVhcmluZy1ibGFja291dDpmb2N1cyBpbWd7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgwLDAsMCwwKTstbW96LWJveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDAsMCwwLDApO2JveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDAsMCwwLDApfS5zaG93LWZvci1zbWFsbCwuc2hvdy1mb3ItbWVkaXVtLC5zaG93LWZvci1tZWRpdW0tZG93biwuaGlkZS1mb3ItbGFyZ2UsLmhpZGUtZm9yLWxhcmdlLXVwLC5zaG93LWZvci14bGFyZ2UsLnNob3ctZm9yLXByaW50e2Rpc3BsYXk6bm9uZSAhaW1wb3J0YW50fS5oaWRlLWZvci1zbWFsbCwuaGlkZS1mb3ItbWVkaXVtLC5oaWRlLWZvci1tZWRpdW0tZG93biwuc2hvdy1mb3ItbGFyZ2UsLnNob3ctZm9yLWxhcmdlLXVwLC5oaWRlLWZvci14bGFyZ2UsLmhpZGUtZm9yLXByaW50e2Rpc3BsYXk6aW5oZXJpdCAhaW1wb3J0YW50fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMTQ0MXB4KXsuaGlkZS1mb3Itc21hbGwsLmhpZGUtZm9yLW1lZGl1bSwuaGlkZS1mb3ItbWVkaXVtLWRvd24sLmhpZGUtZm9yLWxhcmdlLC5zaG93LWZvci1sYXJnZS11cCwuc2hvdy1mb3IteGxhcmdle2Rpc3BsYXk6aW5oZXJpdCAhaW1wb3J0YW50fS5zaG93LWZvci1zbWFsbCwuc2hvdy1mb3ItbWVkaXVtLC5zaG93LWZvci1tZWRpdW0tZG93biwuc2hvdy1mb3ItbGFyZ2UsLmhpZGUtZm9yLWxhcmdlLXVwLC5oaWRlLWZvci14bGFyZ2V7ZGlzcGxheTpub25lICFpbXBvcnRhbnR9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTI3OXB4KSBhbmQgKG1pbi13aWR0aDogNzY4cHgpey5oaWRlLWZvci1zbWFsbCwuc2hvdy1mb3ItbWVkaXVtLC5zaG93LWZvci1tZWRpdW0tZG93biwuaGlkZS1mb3ItbGFyZ2UsLmhpZGUtZm9yLWxhcmdlLXVwLC5oaWRlLWZvci14bGFyZ2V7ZGlzcGxheTppbmhlcml0ICFpbXBvcnRhbnR9LnNob3ctZm9yLXNtYWxsLC5oaWRlLWZvci1tZWRpdW0sLmhpZGUtZm9yLW1lZGl1bS1kb3duLC5zaG93LWZvci1sYXJnZSwuc2hvdy1mb3ItbGFyZ2UtdXAsLnNob3ctZm9yLXhsYXJnZXtkaXNwbGF5Om5vbmUgIWltcG9ydGFudH19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjdweCl7LnNob3ctZm9yLXNtYWxsLC5oaWRlLWZvci1tZWRpdW0sLnNob3ctZm9yLW1lZGl1bS1kb3duLC5oaWRlLWZvci1sYXJnZSwuaGlkZS1mb3ItbGFyZ2UtdXAsLmhpZGUtZm9yLXhsYXJnZXtkaXNwbGF5OmluaGVyaXQgIWltcG9ydGFudH0uaGlkZS1mb3Itc21hbGwsLnNob3ctZm9yLW1lZGl1bSwuaGlkZS1mb3ItbWVkaXVtLWRvd24sLnNob3ctZm9yLWxhcmdlLC5zaG93LWZvci1sYXJnZS11cCwuc2hvdy1mb3IteGxhcmdle2Rpc3BsYXk6bm9uZSAhaW1wb3J0YW50fX0uc2hvdy1mb3ItbGFuZHNjYXBlLC5oaWRlLWZvci1wb3J0cmFpdHtkaXNwbGF5OmluaGVyaXQgIWltcG9ydGFudH0uaGlkZS1mb3ItbGFuZHNjYXBlLC5zaG93LWZvci1wb3J0cmFpdHtkaXNwbGF5Om5vbmUgIWltcG9ydGFudH1AbWVkaWEgc2NyZWVuIGFuZCAob3JpZW50YXRpb246IGxhbmRzY2FwZSl7LnNob3ctZm9yLWxhbmRzY2FwZSwuaGlkZS1mb3ItcG9ydHJhaXR7ZGlzcGxheTppbmhlcml0ICFpbXBvcnRhbnR9LmhpZGUtZm9yLWxhbmRzY2FwZSwuc2hvdy1mb3ItcG9ydHJhaXR7ZGlzcGxheTpub25lICFpbXBvcnRhbnR9fUBtZWRpYSBzY3JlZW4gYW5kIChvcmllbnRhdGlvbjogcG9ydHJhaXQpey5zaG93LWZvci1wb3J0cmFpdCwuaGlkZS1mb3ItbGFuZHNjYXBle2Rpc3BsYXk6aW5oZXJpdCAhaW1wb3J0YW50fS5oaWRlLWZvci1wb3J0cmFpdCwuc2hvdy1mb3ItbGFuZHNjYXBle2Rpc3BsYXk6bm9uZSAhaW1wb3J0YW50fX0uc2hvdy1mb3ItdG91Y2h7ZGlzcGxheTpub25lICFpbXBvcnRhbnR9LmhpZGUtZm9yLXRvdWNoe2Rpc3BsYXk6aW5oZXJpdCAhaW1wb3J0YW50fS50b3VjaCAuc2hvdy1mb3ItdG91Y2h7ZGlzcGxheTppbmhlcml0ICFpbXBvcnRhbnR9LnRvdWNoIC5oaWRlLWZvci10b3VjaHtkaXNwbGF5Om5vbmUgIWltcG9ydGFudH10YWJsZS5zaG93LWZvci14bGFyZ2UsdGFibGUuc2hvdy1mb3ItbGFyZ2UsdGFibGUuaGlkZS1mb3Itc21hbGwsdGFibGUuaGlkZS1mb3ItbWVkaXVte2Rpc3BsYXk6dGFibGUgIWltcG9ydGFudH1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEyNzlweCkgYW5kIChtaW4td2lkdGg6IDc2OHB4KXsudG91Y2ggdGFibGUuaGlkZS1mb3IteGxhcmdlLC50b3VjaCB0YWJsZS5oaWRlLWZvci1sYXJnZSwudG91Y2ggdGFibGUuaGlkZS1mb3Itc21hbGwsLnRvdWNoIHRhYmxlLnNob3ctZm9yLW1lZGl1bXtkaXNwbGF5OnRhYmxlICFpbXBvcnRhbnR9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY3cHgpe3RhYmxlLmhpZGUtZm9yLXhsYXJnZSx0YWJsZS5oaWRlLWZvci1sYXJnZSx0YWJsZS5oaWRlLWZvci1tZWRpdW0sdGFibGUuc2hvdy1mb3Itc21hbGx7ZGlzcGxheTp0YWJsZSAhaW1wb3J0YW50fX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtZGV2aWNlLXdpZHRoOiAxMjgwcHgpey50b3VjaCAubmF2LWJhciBsaS5oYXMtZmx5b3V0PmF7cGFkZGluZy1yaWdodDozNnB4ICFpbXBvcnRhbnR9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC1kZXZpY2Utd2lkdGg6IDgwMHB4KSwgb25seSBzY3JlZW4gYW5kIChkZXZpY2Utd2lkdGg6IDEwMjRweCkgYW5kIChkZXZpY2UtaGVpZ2h0OiA2MDBweCksIG9ubHkgc2NyZWVuIGFuZCAod2lkdGg6IDEyODBweCkgYW5kIChvcmllbnRhdGlvbjogbGFuZHNjYXBlKSwgb25seSBzY3JlZW4gYW5kIChkZXZpY2Utd2lkdGg6IDgwMHB4KSwgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2N3B4KXsuZmxleC12aWRlb3twYWRkaW5nLXRvcDowfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEyNzlweCkgYW5kIChtaW4td2lkdGg6IDc2OHB4KXsudG91Y2ggLm5hdi1iYXIgbGkgYXtmb250LXNpemU6MTNweH0udG91Y2ggLm5hdi1iYXIgbGkuaGFzLWZseW91dD5hLmZseW91dC10b2dnbGV7cGFkZGluZzoyMHB4ICFpbXBvcnRhbnR9LnRvdWNoIC5uYXYtYmFyIGxpLmhhcy1mbHlvdXQ+YXtwYWRkaW5nLXJpZ2h0OjM2cHggIWltcG9ydGFudH0uY2xlYXJpbmctbWFpbi1yaWdodCwuY2xlYXJpbmctbWFpbi1sZWZ0e2hlaWdodDoxMDAlO3dpZHRoOjQwcHg7dG9wOjA7Ym9yZGVyOm5vbmV9LmNsZWFyaW5nLW1haW4tcmlnaHQ6YmVmb3JlLC5jbGVhcmluZy1tYWluLWxlZnQ6YmVmb3Jle3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCV9LmNsZWFyaW5nLW1haW4tbGVmdHtsZWZ0OjB9LmNsZWFyaW5nLW1haW4tbGVmdDpiZWZvcmV7bGVmdDo1cHg7Y29udGVudDoiIjtkaXNwbGF5OmJsb2NrO3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyOnNvbGlkIDE2cHg7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50ICNmZmYgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnR9LmNsZWFyaW5nLW1haW4tcmlnaHR7aGVpZ2h0OjEwMCU7cmlnaHQ6MH0uY2xlYXJpbmctbWFpbi1yaWdodDpiZWZvcmV7Y29udGVudDoiIjtkaXNwbGF5OmJsb2NrO3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyOnNvbGlkIDE2cHg7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICNmZmZ9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY3cHgpey5sZWZ0LC5yaWdodHtmbG9hdDpub25lfWJvZHl7LXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0Om5vbmU7LW1zLXRleHQtc2l6ZS1hZGp1c3Q6bm9uZTt3aWR0aDoxMDAlO21pbi13aWR0aDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjA7cGFkZGluZy1yaWdodDowfS5yb3d7d2lkdGg6YXV0bzttaW4td2lkdGg6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowfS5jb2x1bW4sLmNvbHVtbnN7d2lkdGg6YXV0byAhaW1wb3J0YW50O2Zsb2F0Om5vbmV9LmNvbHVtbjpsYXN0LWNoaWxkLC5jb2x1bW5zOmxhc3QtY2hpbGR7ZmxvYXQ6bm9uZX1bY2xhc3MqPSJjb2x1bW4iXStbY2xhc3MqPSJjb2x1bW4iXTpsYXN0LWNoaWxke2Zsb2F0Om5vbmV9LmNvbHVtbjpiZWZvcmUsLmNvbHVtbnM6YmVmb3JlLC5jb2x1bW46YWZ0ZXIsLmNvbHVtbnM6YWZ0ZXJ7Y29udGVudDoiIjtkaXNwbGF5OnRhYmxlfS5jb2x1bW46YWZ0ZXIsLmNvbHVtbnM6YWZ0ZXJ7Y2xlYXI6Ym90aH0ub2Zmc2V0LWJ5LW9uZSwub2Zmc2V0LWJ5LXR3bywub2Zmc2V0LWJ5LXRocmVlLC5vZmZzZXQtYnktZm91ciwub2Zmc2V0LWJ5LWZpdmUsLm9mZnNldC1ieS1zaXgsLm9mZnNldC1ieS1zZXZlbiwub2Zmc2V0LWJ5LWVpZ2h0LC5vZmZzZXQtYnktbmluZSwub2Zmc2V0LWJ5LXRlbnttYXJnaW4tbGVmdDowICFpbXBvcnRhbnR9LnB1c2gtdHdvLC5wdXNoLXRocmVlLC5wdXNoLWZvdXIsLnB1c2gtZml2ZSwucHVzaC1zaXgsLnB1c2gtc2V2ZW4sLnB1c2gtZWlnaHQsLnB1c2gtbmluZSwucHVzaC10ZW57bGVmdDphdXRvfS5wdWxsLXR3bywucHVsbC10aHJlZSwucHVsbC1mb3VyLC5wdWxsLWZpdmUsLnB1bGwtc2l4LC5wdWxsLXNldmVuLC5wdWxsLWVpZ2h0LC5wdWxsLW5pbmUsLnB1bGwtdGVue3JpZ2h0OmF1dG99LnJvdyAubW9iaWxlLW9uZXt3aWR0aDoyNSUgIWltcG9ydGFudDtmbG9hdDpsZWZ0O3BhZGRpbmc6MCAxNXB4fS5yb3cgLm1vYmlsZS1vbmU6bGFzdC1jaGlsZHtmbG9hdDpyaWdodH0ucm93IC5tb2JpbGUtb25lLmVuZHtmbG9hdDpsZWZ0fS5yb3cuY29sbGFwc2UgLm1vYmlsZS1vbmV7cGFkZGluZzowfS5yb3cgLm1vYmlsZS10d297d2lkdGg6NTAlICFpbXBvcnRhbnQ7ZmxvYXQ6bGVmdDtwYWRkaW5nOjAgMTVweH0ucm93IC5tb2JpbGUtdHdvOmxhc3QtY2hpbGR7ZmxvYXQ6cmlnaHR9LnJvdyAubW9iaWxlLXR3by5lbmR7ZmxvYXQ6bGVmdH0ucm93LmNvbGxhcHNlIC5tb2JpbGUtdHdve3BhZGRpbmc6MH0ucm93IC5tb2JpbGUtdGhyZWV7d2lkdGg6NzUlICFpbXBvcnRhbnQ7ZmxvYXQ6bGVmdDtwYWRkaW5nOjAgMTVweH0ucm93IC5tb2JpbGUtdGhyZWU6bGFzdC1jaGlsZHtmbG9hdDpyaWdodH0ucm93IC5tb2JpbGUtdGhyZWUuZW5ke2Zsb2F0OmxlZnR9LnJvdy5jb2xsYXBzZSAubW9iaWxlLXRocmVle3BhZGRpbmc6MH0ucm93IC5tb2JpbGUtZm91cnt3aWR0aDoxMDAlICFpbXBvcnRhbnQ7ZmxvYXQ6bGVmdDtwYWRkaW5nOjAgMTVweH0ucm93IC5tb2JpbGUtZm91cjpsYXN0LWNoaWxke2Zsb2F0OnJpZ2h0fS5yb3cgLm1vYmlsZS1mb3VyLmVuZHtmbG9hdDpsZWZ0fS5yb3cuY29sbGFwc2UgLm1vYmlsZS1mb3Vye3BhZGRpbmc6MH0ucHVzaC1vbmUtbW9iaWxle2xlZnQ6MjUlfS5wdWxsLW9uZS1tb2JpbGV7cmlnaHQ6MjUlfS5wdXNoLXR3by1tb2JpbGV7bGVmdDo1MCV9LnB1bGwtdHdvLW1vYmlsZXtyaWdodDo1MCV9LnB1c2gtdGhyZWUtbW9iaWxle2xlZnQ6NzUlfS5wdWxsLXRocmVlLW1vYmlsZXtyaWdodDo3NSV9LmJsb2NrLWdyaWQubW9iaWxlPmxpe2Zsb2F0Om5vbmU7d2lkdGg6MTAwJTttYXJnaW4tbGVmdDowfS5ibG9jay1ncmlkPmxpe2NsZWFyOm5vbmV9LmJsb2NrLWdyaWQubW9iaWxlLW9uZS11cD5saXt3aWR0aDoxMDAlfS5ibG9jay1ncmlkLm1vYmlsZS10d28tdXA+bGl7d2lkdGg6NTAlfS5ibG9jay1ncmlkLm1vYmlsZS10d28tdXA+bGk6bnRoLWNoaWxkKDJuKzEpe2NsZWFyOmJvdGh9LmJsb2NrLWdyaWQubW9iaWxlLXRocmVlLXVwPmxpe3dpZHRoOjMzLjMzMzMzJX0uYmxvY2stZ3JpZC5tb2JpbGUtdGhyZWUtdXA+bGk6bnRoLWNoaWxkKDNuKzEpe2NsZWFyOmJvdGh9LmJsb2NrLWdyaWQubW9iaWxlLWZvdXItdXA+bGl7d2lkdGg6MjUlfS5ibG9jay1ncmlkLm1vYmlsZS1mb3VyLXVwPmxpOm50aC1jaGlsZCg0bisxKXtjbGVhcjpib3RofS5ibG9jay1ncmlkLm1vYmlsZS1maXZlLXVwPmxpe3dpZHRoOjIwJX0uYmxvY2stZ3JpZC5tb2JpbGUtZml2ZS11cD5saTpudGgtY2hpbGQoNW4rMSl7Y2xlYXI6Ym90aH0uYmxvY2stZ3JpZC5tb2JpbGUtc2l4LXVwPmxpe3dpZHRoOjE2LjY2NjY3JX0uYmxvY2stZ3JpZC5tb2JpbGUtc2l4LXVwPmxpOm50aC1jaGlsZCg2bisxKXtjbGVhcjpib3RofS5ibG9jay1ncmlkLm1vYmlsZS1zZXZlbi11cD5saXt3aWR0aDoxNC4yODU3MSV9LmJsb2NrLWdyaWQubW9iaWxlLXNldmVuLXVwPmxpOm50aC1jaGlsZCg3bisxKXtjbGVhcjpib3RofS5ibG9jay1ncmlkLm1vYmlsZS1laWdodC11cD5saXt3aWR0aDoxMi41JX0uYmxvY2stZ3JpZC5tb2JpbGUtZWlnaHQtdXA+bGk6bnRoLWNoaWxkKDhuKzEpe2NsZWFyOmJvdGh9LmJsb2NrLWdyaWQubW9iaWxlLW5pbmUtdXA+bGl7d2lkdGg6MTEuMTExMTElfS5ibG9jay1ncmlkLm1vYmlsZS1uaW5lLXVwPmxpOm50aC1jaGlsZCg5bisxKXtjbGVhcjpib3RofS5ibG9jay1ncmlkLm1vYmlsZS10ZW4tdXA+bGl7d2lkdGg6MTAlfS5ibG9jay1ncmlkLm1vYmlsZS10ZW4tdXA+bGk6bnRoLWNoaWxkKDEwbisxKXtjbGVhcjpib3RofS5ibG9jay1ncmlkLm1vYmlsZS1lbGV2ZW4tdXA+bGl7d2lkdGg6OS4wOTA5MSV9LmJsb2NrLWdyaWQubW9iaWxlLWVsZXZlbi11cD5saTpudGgtY2hpbGQoMTFuKzEpe2NsZWFyOmJvdGh9LmJsb2NrLWdyaWQubW9iaWxlLXR3ZWx2ZS11cD5saXt3aWR0aDo4LjMzMzMzJX0uYmxvY2stZ3JpZC5tb2JpbGUtdHdlbHZlLXVwPmxpOm50aC1jaGlsZCgxMm4rMSl7Y2xlYXI6Ym90aH1sYWJlbC5yaWdodHt0ZXh0LWFsaWduOmxlZnR9aW5wdXRbdHlwZT0idGV4dCJdLm9uZSwucm93IGlucHV0W3R5cGU9InRleHQiXS5vbmUsaW5wdXRbdHlwZT0icGFzc3dvcmQiXS5vbmUsLnJvdyBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLm9uZSxpbnB1dFt0eXBlPSJkYXRlIl0ub25lLC5yb3cgaW5wdXRbdHlwZT0iZGF0ZSJdLm9uZSxpbnB1dFt0eXBlPSJkYXRldGltZSJdLm9uZSwucm93IGlucHV0W3R5cGU9ImRhdGV0aW1lIl0ub25lLGlucHV0W3R5cGU9ImVtYWlsIl0ub25lLC5yb3cgaW5wdXRbdHlwZT0iZW1haWwiXS5vbmUsaW5wdXRbdHlwZT0ibnVtYmVyIl0ub25lLC5yb3cgaW5wdXRbdHlwZT0ibnVtYmVyIl0ub25lLGlucHV0W3R5cGU9InNlYXJjaCJdLm9uZSwucm93IGlucHV0W3R5cGU9InNlYXJjaCJdLm9uZSxpbnB1dFt0eXBlPSJ0ZWwiXS5vbmUsLnJvdyBpbnB1dFt0eXBlPSJ0ZWwiXS5vbmUsaW5wdXRbdHlwZT0idGltZSJdLm9uZSwucm93IGlucHV0W3R5cGU9InRpbWUiXS5vbmUsaW5wdXRbdHlwZT0idXJsIl0ub25lLC5yb3cgaW5wdXRbdHlwZT0idXJsIl0ub25lLHRleHRhcmVhLm9uZSwucm93IHRleHRhcmVhLm9uZXt3aWR0aDoxMDAlICFpbXBvcnRhbnR9aW5wdXRbdHlwZT0idGV4dCJdLnR3bywucm93IGlucHV0W3R5cGU9InRleHQiXS50d28saW5wdXRbdHlwZT0icGFzc3dvcmQiXS50d28sLnJvdyBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLnR3byxpbnB1dFt0eXBlPSJkYXRlIl0udHdvLC5yb3cgaW5wdXRbdHlwZT0iZGF0ZSJdLnR3byxpbnB1dFt0eXBlPSJkYXRldGltZSJdLnR3bywucm93IGlucHV0W3R5cGU9ImRhdGV0aW1lIl0udHdvLGlucHV0W3R5cGU9ImVtYWlsIl0udHdvLC5yb3cgaW5wdXRbdHlwZT0iZW1haWwiXS50d28saW5wdXRbdHlwZT0ibnVtYmVyIl0udHdvLC5yb3cgaW5wdXRbdHlwZT0ibnVtYmVyIl0udHdvLGlucHV0W3R5cGU9InNlYXJjaCJdLnR3bywucm93IGlucHV0W3R5cGU9InNlYXJjaCJdLnR3byxpbnB1dFt0eXBlPSJ0ZWwiXS50d28sLnJvdyBpbnB1dFt0eXBlPSJ0ZWwiXS50d28saW5wdXRbdHlwZT0idGltZSJdLnR3bywucm93IGlucHV0W3R5cGU9InRpbWUiXS50d28saW5wdXRbdHlwZT0idXJsIl0udHdvLC5yb3cgaW5wdXRbdHlwZT0idXJsIl0udHdvLHRleHRhcmVhLnR3bywucm93IHRleHRhcmVhLnR3b3t3aWR0aDoxMDAlICFpbXBvcnRhbnR9aW5wdXRbdHlwZT0idGV4dCJdLnRocmVlLC5yb3cgaW5wdXRbdHlwZT0idGV4dCJdLnRocmVlLGlucHV0W3R5cGU9InBhc3N3b3JkIl0udGhyZWUsLnJvdyBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLnRocmVlLGlucHV0W3R5cGU9ImRhdGUiXS50aHJlZSwucm93IGlucHV0W3R5cGU9ImRhdGUiXS50aHJlZSxpbnB1dFt0eXBlPSJkYXRldGltZSJdLnRocmVlLC5yb3cgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS50aHJlZSxpbnB1dFt0eXBlPSJlbWFpbCJdLnRocmVlLC5yb3cgaW5wdXRbdHlwZT0iZW1haWwiXS50aHJlZSxpbnB1dFt0eXBlPSJudW1iZXIiXS50aHJlZSwucm93IGlucHV0W3R5cGU9Im51bWJlciJdLnRocmVlLGlucHV0W3R5cGU9InNlYXJjaCJdLnRocmVlLC5yb3cgaW5wdXRbdHlwZT0ic2VhcmNoIl0udGhyZWUsaW5wdXRbdHlwZT0idGVsIl0udGhyZWUsLnJvdyBpbnB1dFt0eXBlPSJ0ZWwiXS50aHJlZSxpbnB1dFt0eXBlPSJ0aW1lIl0udGhyZWUsLnJvdyBpbnB1dFt0eXBlPSJ0aW1lIl0udGhyZWUsaW5wdXRbdHlwZT0idXJsIl0udGhyZWUsLnJvdyBpbnB1dFt0eXBlPSJ1cmwiXS50aHJlZSx0ZXh0YXJlYS50aHJlZSwucm93IHRleHRhcmVhLnRocmVle3dpZHRoOjEwMCUgIWltcG9ydGFudH1pbnB1dFt0eXBlPSJ0ZXh0Il0uZm91ciwucm93IGlucHV0W3R5cGU9InRleHQiXS5mb3VyLGlucHV0W3R5cGU9InBhc3N3b3JkIl0uZm91ciwucm93IGlucHV0W3R5cGU9InBhc3N3b3JkIl0uZm91cixpbnB1dFt0eXBlPSJkYXRlIl0uZm91ciwucm93IGlucHV0W3R5cGU9ImRhdGUiXS5mb3VyLGlucHV0W3R5cGU9ImRhdGV0aW1lIl0uZm91ciwucm93IGlucHV0W3R5cGU9ImRhdGV0aW1lIl0uZm91cixpbnB1dFt0eXBlPSJlbWFpbCJdLmZvdXIsLnJvdyBpbnB1dFt0eXBlPSJlbWFpbCJdLmZvdXIsaW5wdXRbdHlwZT0ibnVtYmVyIl0uZm91ciwucm93IGlucHV0W3R5cGU9Im51bWJlciJdLmZvdXIsaW5wdXRbdHlwZT0ic2VhcmNoIl0uZm91ciwucm93IGlucHV0W3R5cGU9InNlYXJjaCJdLmZvdXIsaW5wdXRbdHlwZT0idGVsIl0uZm91ciwucm93IGlucHV0W3R5cGU9InRlbCJdLmZvdXIsaW5wdXRbdHlwZT0idGltZSJdLmZvdXIsLnJvdyBpbnB1dFt0eXBlPSJ0aW1lIl0uZm91cixpbnB1dFt0eXBlPSJ1cmwiXS5mb3VyLC5yb3cgaW5wdXRbdHlwZT0idXJsIl0uZm91cix0ZXh0YXJlYS5mb3VyLC5yb3cgdGV4dGFyZWEuZm91cnt3aWR0aDoxMDAlICFpbXBvcnRhbnR9aW5wdXRbdHlwZT0idGV4dCJdLmZpdmUsLnJvdyBpbnB1dFt0eXBlPSJ0ZXh0Il0uZml2ZSxpbnB1dFt0eXBlPSJwYXNzd29yZCJdLmZpdmUsLnJvdyBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLmZpdmUsaW5wdXRbdHlwZT0iZGF0ZSJdLmZpdmUsLnJvdyBpbnB1dFt0eXBlPSJkYXRlIl0uZml2ZSxpbnB1dFt0eXBlPSJkYXRldGltZSJdLmZpdmUsLnJvdyBpbnB1dFt0eXBlPSJkYXRldGltZSJdLmZpdmUsaW5wdXRbdHlwZT0iZW1haWwiXS5maXZlLC5yb3cgaW5wdXRbdHlwZT0iZW1haWwiXS5maXZlLGlucHV0W3R5cGU9Im51bWJlciJdLmZpdmUsLnJvdyBpbnB1dFt0eXBlPSJudW1iZXIiXS5maXZlLGlucHV0W3R5cGU9InNlYXJjaCJdLmZpdmUsLnJvdyBpbnB1dFt0eXBlPSJzZWFyY2giXS5maXZlLGlucHV0W3R5cGU9InRlbCJdLmZpdmUsLnJvdyBpbnB1dFt0eXBlPSJ0ZWwiXS5maXZlLGlucHV0W3R5cGU9InRpbWUiXS5maXZlLC5yb3cgaW5wdXRbdHlwZT0idGltZSJdLmZpdmUsaW5wdXRbdHlwZT0idXJsIl0uZml2ZSwucm93IGlucHV0W3R5cGU9InVybCJdLmZpdmUsdGV4dGFyZWEuZml2ZSwucm93IHRleHRhcmVhLmZpdmV7d2lkdGg6MTAwJSAhaW1wb3J0YW50fWlucHV0W3R5cGU9InRleHQiXS5zaXgsLnJvdyBpbnB1dFt0eXBlPSJ0ZXh0Il0uc2l4LGlucHV0W3R5cGU9InBhc3N3b3JkIl0uc2l4LC5yb3cgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS5zaXgsaW5wdXRbdHlwZT0iZGF0ZSJdLnNpeCwucm93IGlucHV0W3R5cGU9ImRhdGUiXS5zaXgsaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS5zaXgsLnJvdyBpbnB1dFt0eXBlPSJkYXRldGltZSJdLnNpeCxpbnB1dFt0eXBlPSJlbWFpbCJdLnNpeCwucm93IGlucHV0W3R5cGU9ImVtYWlsIl0uc2l4LGlucHV0W3R5cGU9Im51bWJlciJdLnNpeCwucm93IGlucHV0W3R5cGU9Im51bWJlciJdLnNpeCxpbnB1dFt0eXBlPSJzZWFyY2giXS5zaXgsLnJvdyBpbnB1dFt0eXBlPSJzZWFyY2giXS5zaXgsaW5wdXRbdHlwZT0idGVsIl0uc2l4LC5yb3cgaW5wdXRbdHlwZT0idGVsIl0uc2l4LGlucHV0W3R5cGU9InRpbWUiXS5zaXgsLnJvdyBpbnB1dFt0eXBlPSJ0aW1lIl0uc2l4LGlucHV0W3R5cGU9InVybCJdLnNpeCwucm93IGlucHV0W3R5cGU9InVybCJdLnNpeCx0ZXh0YXJlYS5zaXgsLnJvdyB0ZXh0YXJlYS5zaXh7d2lkdGg6MTAwJSAhaW1wb3J0YW50fWlucHV0W3R5cGU9InRleHQiXS5zZXZlbiwucm93IGlucHV0W3R5cGU9InRleHQiXS5zZXZlbixpbnB1dFt0eXBlPSJwYXNzd29yZCJdLnNldmVuLC5yb3cgaW5wdXRbdHlwZT0icGFzc3dvcmQiXS5zZXZlbixpbnB1dFt0eXBlPSJkYXRlIl0uc2V2ZW4sLnJvdyBpbnB1dFt0eXBlPSJkYXRlIl0uc2V2ZW4saW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS5zZXZlbiwucm93IGlucHV0W3R5cGU9ImRhdGV0aW1lIl0uc2V2ZW4saW5wdXRbdHlwZT0iZW1haWwiXS5zZXZlbiwucm93IGlucHV0W3R5cGU9ImVtYWlsIl0uc2V2ZW4saW5wdXRbdHlwZT0ibnVtYmVyIl0uc2V2ZW4sLnJvdyBpbnB1dFt0eXBlPSJudW1iZXIiXS5zZXZlbixpbnB1dFt0eXBlPSJzZWFyY2giXS5zZXZlbiwucm93IGlucHV0W3R5cGU9InNlYXJjaCJdLnNldmVuLGlucHV0W3R5cGU9InRlbCJdLnNldmVuLC5yb3cgaW5wdXRbdHlwZT0idGVsIl0uc2V2ZW4saW5wdXRbdHlwZT0idGltZSJdLnNldmVuLC5yb3cgaW5wdXRbdHlwZT0idGltZSJdLnNldmVuLGlucHV0W3R5cGU9InVybCJdLnNldmVuLC5yb3cgaW5wdXRbdHlwZT0idXJsIl0uc2V2ZW4sdGV4dGFyZWEuc2V2ZW4sLnJvdyB0ZXh0YXJlYS5zZXZlbnt3aWR0aDoxMDAlICFpbXBvcnRhbnR9aW5wdXRbdHlwZT0idGV4dCJdLmVpZ2h0LC5yb3cgaW5wdXRbdHlwZT0idGV4dCJdLmVpZ2h0LGlucHV0W3R5cGU9InBhc3N3b3JkIl0uZWlnaHQsLnJvdyBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLmVpZ2h0LGlucHV0W3R5cGU9ImRhdGUiXS5laWdodCwucm93IGlucHV0W3R5cGU9ImRhdGUiXS5laWdodCxpbnB1dFt0eXBlPSJkYXRldGltZSJdLmVpZ2h0LC5yb3cgaW5wdXRbdHlwZT0iZGF0ZXRpbWUiXS5laWdodCxpbnB1dFt0eXBlPSJlbWFpbCJdLmVpZ2h0LC5yb3cgaW5wdXRbdHlwZT0iZW1haWwiXS5laWdodCxpbnB1dFt0eXBlPSJudW1iZXIiXS5laWdodCwucm93IGlucHV0W3R5cGU9Im51bWJlciJdLmVpZ2h0LGlucHV0W3R5cGU9InNlYXJjaCJdLmVpZ2h0LC5yb3cgaW5wdXRbdHlwZT0ic2VhcmNoIl0uZWlnaHQsaW5wdXRbdHlwZT0idGVsIl0uZWlnaHQsLnJvdyBpbnB1dFt0eXBlPSJ0ZWwiXS5laWdodCxpbnB1dFt0eXBlPSJ0aW1lIl0uZWlnaHQsLnJvdyBpbnB1dFt0eXBlPSJ0aW1lIl0uZWlnaHQsaW5wdXRbdHlwZT0idXJsIl0uZWlnaHQsLnJvdyBpbnB1dFt0eXBlPSJ1cmwiXS5laWdodCx0ZXh0YXJlYS5laWdodCwucm93IHRleHRhcmVhLmVpZ2h0e3dpZHRoOjEwMCUgIWltcG9ydGFudH1pbnB1dFt0eXBlPSJ0ZXh0Il0ubmluZSwucm93IGlucHV0W3R5cGU9InRleHQiXS5uaW5lLGlucHV0W3R5cGU9InBhc3N3b3JkIl0ubmluZSwucm93IGlucHV0W3R5cGU9InBhc3N3b3JkIl0ubmluZSxpbnB1dFt0eXBlPSJkYXRlIl0ubmluZSwucm93IGlucHV0W3R5cGU9ImRhdGUiXS5uaW5lLGlucHV0W3R5cGU9ImRhdGV0aW1lIl0ubmluZSwucm93IGlucHV0W3R5cGU9ImRhdGV0aW1lIl0ubmluZSxpbnB1dFt0eXBlPSJlbWFpbCJdLm5pbmUsLnJvdyBpbnB1dFt0eXBlPSJlbWFpbCJdLm5pbmUsaW5wdXRbdHlwZT0ibnVtYmVyIl0ubmluZSwucm93IGlucHV0W3R5cGU9Im51bWJlciJdLm5pbmUsaW5wdXRbdHlwZT0ic2VhcmNoIl0ubmluZSwucm93IGlucHV0W3R5cGU9InNlYXJjaCJdLm5pbmUsaW5wdXRbdHlwZT0idGVsIl0ubmluZSwucm93IGlucHV0W3R5cGU9InRlbCJdLm5pbmUsaW5wdXRbdHlwZT0idGltZSJdLm5pbmUsLnJvdyBpbnB1dFt0eXBlPSJ0aW1lIl0ubmluZSxpbnB1dFt0eXBlPSJ1cmwiXS5uaW5lLC5yb3cgaW5wdXRbdHlwZT0idXJsIl0ubmluZSx0ZXh0YXJlYS5uaW5lLC5yb3cgdGV4dGFyZWEubmluZXt3aWR0aDoxMDAlICFpbXBvcnRhbnR9aW5wdXRbdHlwZT0idGV4dCJdLnRlbiwucm93IGlucHV0W3R5cGU9InRleHQiXS50ZW4saW5wdXRbdHlwZT0icGFzc3dvcmQiXS50ZW4sLnJvdyBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLnRlbixpbnB1dFt0eXBlPSJkYXRlIl0udGVuLC5yb3cgaW5wdXRbdHlwZT0iZGF0ZSJdLnRlbixpbnB1dFt0eXBlPSJkYXRldGltZSJdLnRlbiwucm93IGlucHV0W3R5cGU9ImRhdGV0aW1lIl0udGVuLGlucHV0W3R5cGU9ImVtYWlsIl0udGVuLC5yb3cgaW5wdXRbdHlwZT0iZW1haWwiXS50ZW4saW5wdXRbdHlwZT0ibnVtYmVyIl0udGVuLC5yb3cgaW5wdXRbdHlwZT0ibnVtYmVyIl0udGVuLGlucHV0W3R5cGU9InNlYXJjaCJdLnRlbiwucm93IGlucHV0W3R5cGU9InNlYXJjaCJdLnRlbixpbnB1dFt0eXBlPSJ0ZWwiXS50ZW4sLnJvdyBpbnB1dFt0eXBlPSJ0ZWwiXS50ZW4saW5wdXRbdHlwZT0idGltZSJdLnRlbiwucm93IGlucHV0W3R5cGU9InRpbWUiXS50ZW4saW5wdXRbdHlwZT0idXJsIl0udGVuLC5yb3cgaW5wdXRbdHlwZT0idXJsIl0udGVuLHRleHRhcmVhLnRlbiwucm93IHRleHRhcmVhLnRlbnt3aWR0aDoxMDAlICFpbXBvcnRhbnR9aW5wdXRbdHlwZT0idGV4dCJdLmVsZXZlbiwucm93IGlucHV0W3R5cGU9InRleHQiXS5lbGV2ZW4saW5wdXRbdHlwZT0icGFzc3dvcmQiXS5lbGV2ZW4sLnJvdyBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLmVsZXZlbixpbnB1dFt0eXBlPSJkYXRlIl0uZWxldmVuLC5yb3cgaW5wdXRbdHlwZT0iZGF0ZSJdLmVsZXZlbixpbnB1dFt0eXBlPSJkYXRldGltZSJdLmVsZXZlbiwucm93IGlucHV0W3R5cGU9ImRhdGV0aW1lIl0uZWxldmVuLGlucHV0W3R5cGU9ImVtYWlsIl0uZWxldmVuLC5yb3cgaW5wdXRbdHlwZT0iZW1haWwiXS5lbGV2ZW4saW5wdXRbdHlwZT0ibnVtYmVyIl0uZWxldmVuLC5yb3cgaW5wdXRbdHlwZT0ibnVtYmVyIl0uZWxldmVuLGlucHV0W3R5cGU9InNlYXJjaCJdLmVsZXZlbiwucm93IGlucHV0W3R5cGU9InNlYXJjaCJdLmVsZXZlbixpbnB1dFt0eXBlPSJ0ZWwiXS5lbGV2ZW4sLnJvdyBpbnB1dFt0eXBlPSJ0ZWwiXS5lbGV2ZW4saW5wdXRbdHlwZT0idGltZSJdLmVsZXZlbiwucm93IGlucHV0W3R5cGU9InRpbWUiXS5lbGV2ZW4saW5wdXRbdHlwZT0idXJsIl0uZWxldmVuLC5yb3cgaW5wdXRbdHlwZT0idXJsIl0uZWxldmVuLHRleHRhcmVhLmVsZXZlbiwucm93IHRleHRhcmVhLmVsZXZlbnt3aWR0aDoxMDAlICFpbXBvcnRhbnR9aW5wdXRbdHlwZT0idGV4dCJdLnR3ZWx2ZSwucm93IGlucHV0W3R5cGU9InRleHQiXS50d2VsdmUsaW5wdXRbdHlwZT0icGFzc3dvcmQiXS50d2VsdmUsLnJvdyBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLnR3ZWx2ZSxpbnB1dFt0eXBlPSJkYXRlIl0udHdlbHZlLC5yb3cgaW5wdXRbdHlwZT0iZGF0ZSJdLnR3ZWx2ZSxpbnB1dFt0eXBlPSJkYXRldGltZSJdLnR3ZWx2ZSwucm93IGlucHV0W3R5cGU9ImRhdGV0aW1lIl0udHdlbHZlLGlucHV0W3R5cGU9ImVtYWlsIl0udHdlbHZlLC5yb3cgaW5wdXRbdHlwZT0iZW1haWwiXS50d2VsdmUsaW5wdXRbdHlwZT0ibnVtYmVyIl0udHdlbHZlLC5yb3cgaW5wdXRbdHlwZT0ibnVtYmVyIl0udHdlbHZlLGlucHV0W3R5cGU9InNlYXJjaCJdLnR3ZWx2ZSwucm93IGlucHV0W3R5cGU9InNlYXJjaCJdLnR3ZWx2ZSxpbnB1dFt0eXBlPSJ0ZWwiXS50d2VsdmUsLnJvdyBpbnB1dFt0eXBlPSJ0ZWwiXS50d2VsdmUsaW5wdXRbdHlwZT0idGltZSJdLnR3ZWx2ZSwucm93IGlucHV0W3R5cGU9InRpbWUiXS50d2VsdmUsaW5wdXRbdHlwZT0idXJsIl0udHdlbHZlLC5yb3cgaW5wdXRbdHlwZT0idXJsIl0udHdlbHZlLHRleHRhcmVhLnR3ZWx2ZSwucm93IHRleHRhcmVhLnR3ZWx2ZXt3aWR0aDoxMDAlICFpbXBvcnRhbnR9LmJ1dHRvbntkaXNwbGF5OmJsb2NrfWJ1dHRvbi5idXR0b24saW5wdXRbdHlwZT0ic3VibWl0Il0uYnV0dG9uLGlucHV0W3R5cGU9InJlc2V0Il0uYnV0dG9ue3dpZHRoOjEwMCU7cGFkZGluZy1sZWZ0OjA7cGFkZGluZy1yaWdodDowfS5idXR0b24tZ3JvdXAgYnV0dG9uLmJ1dHRvbiwuYnV0dG9uLWdyb3VwIGlucHV0W3R5cGU9InN1Ym1pdCJdLmJ1dHRvbnt3aWR0aDphdXRvO3BhZGRpbmc6MTBweCAyMHB4IDExcHh9LmJ1dHRvbi1ncm91cCBidXR0b24uYnV0dG9uLmxhcmdlLC5idXR0b24tZ3JvdXAgaW5wdXRbdHlwZT0ic3VibWl0Il0uYnV0dG9uLmxhcmdle3BhZGRpbmc6MTVweCAzMHB4IDE2cHh9LmJ1dHRvbi1ncm91cCBidXR0b24uYnV0dG9uLm1lZGl1bSwuYnV0dG9uLWdyb3VwIGlucHV0W3R5cGU9InN1Ym1pdCJdLmJ1dHRvbi5tZWRpdW17cGFkZGluZzoxMHB4IDIwcHggMTFweH0uYnV0dG9uLWdyb3VwIGJ1dHRvbi5idXR0b24uc21hbGwsLmJ1dHRvbi1ncm91cCBpbnB1dFt0eXBlPSJzdWJtaXQiXS5idXR0b24uc21hbGx7cGFkZGluZzo3cHggMTRweCA4cHh9LmJ1dHRvbi1ncm91cCBidXR0b24uYnV0dG9uLnRpbnksLmJ1dHRvbi1ncm91cCBpbnB1dFt0eXBlPSJzdWJtaXQiXS5idXR0b24udGlueXtwYWRkaW5nOjVweCAxMHB4IDZweH0uYnV0dG9uLWdyb3VwLmV2ZW4gYnV0dG9uLmJ1dHRvbiwuYnV0dG9uLWdyb3VwLmV2ZW4gaW5wdXRbdHlwZT0ic3VibWl0Il0uYnV0dG9ue3dpZHRoOjEwMCU7cGFkZGluZy1sZWZ0OjA7cGFkZGluZy1yaWdodDowfS5uYXYtYmFye2hlaWdodDphdXRvfS5uYXYtYmFyPmxpe2Zsb2F0Om5vbmU7ZGlzcGxheTpibG9jaztib3JkZXItcmlnaHQ6bm9uZX0ubmF2LWJhcj5saT5hLm1haW57dGV4dC1hbGlnbjpsZWZ0O2JvcmRlci10b3A6MXB4IHNvbGlkICNkZGQ7Ym9yZGVyLXJpZ2h0Om5vbmV9Lm5hdi1iYXI+bGk6Zmlyc3QtY2hpbGQ+YS5tYWlue2JvcmRlci10b3A6bm9uZX0ubmF2LWJhcj5saS5oYXMtZmx5b3V0PmEuZmx5b3V0LXRvZ2dsZXtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO3RvcDowO3BhZGRpbmc6MjJweDt6LWluZGV4OjI7ZGlzcGxheTpibG9ja30ubmF2LWJhcj5saS5oYXMtZmx5b3V0LmlzLXRvdWNoPmEuZmx5b3V0LXRvZ2dsZSBzcGFue2NvbnRlbnQ6IiI7d2lkdGg6MDtoZWlnaHQ6MDtkaXNwbGF5OmJsb2NrfS5uYXYtYmFyPmxpLmhhcy1mbHlvdXQ+YS5mbHlvdXQtdG9nZ2xlOmhvdmVyIHNwYW57Ym9yZGVyLXRvcC1jb2xvcjojMTQxNDE0fS5uYXYtYmFyLnZlcnRpY2FsPmxpLmhhcy1mbHlvdXQ+LmZseW91dHtsZWZ0OjB9LmZseW91dHtwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxMDAlICFpbXBvcnRhbnQ7dG9wOmF1dG87bWFyZ2luLXJpZ2h0Oi0ycHg7Ym9yZGVyLXdpZHRoOjFweCAxcHggMCAxcHh9LmZseW91dC5yaWdodHtmbG9hdDpub25lO3JpZ2h0OmF1dG87bGVmdDotMXB4fS5mbHlvdXQuc21hbGwsLmZseW91dC5sYXJnZXt3aWR0aDoxMDAlICFpbXBvcnRhbnR9LmZseW91dCBwOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbToxOHB4fS5yZXZlYWwtbW9kYWwtYmd7cG9zaXRpb246YWJzb2x1dGV9LnJldmVhbC1tb2RhbCwucmV2ZWFsLW1vZGFsLnNtYWxsLC5yZXZlYWwtbW9kYWwubWVkaXVtLC5yZXZlYWwtbW9kYWwubGFyZ2UsLnJldmVhbC1tb2RhbC54bGFyZ2V7d2lkdGg6ODAlO3RvcDoxNXB4O2xlZnQ6NTAlO21hcmdpbi1sZWZ0Oi00MCU7cGFkZGluZzoyMHB4O2hlaWdodDphdXRvfS5jbGVhcmluZy1jb250YWluZXJ7bWFyZ2luOjB9LmNsZWFyaW5nLWNsb3Nle3otaW5kZXg6OTk7Zm9udC1zaXplOjM3cHg7dG9wOjBweDtyaWdodDo1cHh9LmNsZWFyaW5nLWNhcHRpb257cG9zaXRpb246Zml4ZWQ7Ym90dG9tOjA7bGVmdDowO3BhZGRpbmc6MTBweCAhaW1wb3J0YW50O2xpbmUtaGVpZ2h0OjEuM30uY2xlYXJpbmctbWFpbi1yaWdodCwuY2xlYXJpbmctbWFpbi1sZWZ0e2Rpc3BsYXk6bm9uZX0uY2xlYXJpbmctYmxhY2tvdXQuY2xlYXJpbmctYXNzZW1ibGVkIC52aXNpYmxlLWltZywuY2xlYXJpbmctYmxhY2tvdXQuY2xlYXJpbmctYXNzZW1ibGVkIC5jbGVhcmluZy1jb250YWluZXJ7aGVpZ2h0OjEwMCV9LmNsZWFyaW5nLWJsYWNrb3V0LmNsZWFyaW5nLWFzc2VtYmxlZCB1bFtkYXRhLWNsZWFyaW5nXXtkaXNwbGF5Om5vbmV9LmpveXJpZGUtdGlwLWd1aWRle3dpZHRoOjk1JSAhaW1wb3J0YW50O2xlZnQ6Mi41JSAhaW1wb3J0YW50Oy13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzOjRweDstbXMtYm9yZGVyLXJhZGl1czo0cHg7LW8tYm9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLXJhZGl1czo0cHh9LmpveXJpZGUtdGlwLWd1aWRlLXdyYXBwZXJ7d2lkdGg6MTAwJX0udGFicy5tb2JpbGV7d2lkdGg6YXV0bzttYXJnaW46MjBweCAtMjBweCA0MHB4O2JvcmRlci1ib3R0b206c29saWQgMXB4ICNjY2M7aGVpZ2h0OmF1dG87bWFyZ2luOjIwcHggLTE1cHggMHB4IC0xNXB4fS50YWJzLm1vYmlsZSBkdCwudGFicy5tb2JpbGUgbGksLnRhYnMubW9iaWxlIGRke2Zsb2F0Om5vbmU7aGVpZ2h0OmF1dG99LnRhYnMubW9iaWxlIGRkIGEsLnRhYnMubW9iaWxlIGxpIGF7Zm9udC1zaXplOjE1cHg7ZGlzcGxheTpibG9jazt3aWR0aDphdXRvO2hlaWdodDphdXRvO3BhZGRpbmc6MThweCAyMHB4O21hcmdpbjowO2NvbG9yOiM1NTU7bGluZS1oZWlnaHQ6MTtib3JkZXI6bm9uZTtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpub25lO2JvcmRlci10b3A6MXB4IHNvbGlkICNjY2M7YmFja2dyb3VuZDojZmZmfS50YWJzLm1vYmlsZSBkZCBhLmFjdGl2ZSwudGFicy5tb2JpbGUgbGkgYS5hY3RpdmV7Ym9yZGVyOm5vbmU7YmFja2dyb3VuZDojMmJhNmNiO2NvbG9yOiNmZmY7bWFyZ2luOjA7cG9zaXRpb246c3RhdGljO3RvcDowO2hlaWdodDphdXRvfS50YWJzLm1vYmlsZSBkZDpmaXJzdC1jaGlsZCBhLmFjdGl2ZSwudGFicy5tb2JpbGUgbGk6Zmlyc3QtY2hpbGQgYS5hY3RpdmV7bWFyZ2luOjB9LnRhYnMubW9iaWxlKy50YWJzLWNvbnRlbnQuY29udGFpbmVke21hcmdpbi1sZWZ0Oi0xNXB4O21hcmdpbi1yaWdodDotMTVweH0udGFicy5tb2JpbGUgLnNlY3Rpb24tdGl0bGV7cGFkZGluZy1sZWZ0OjIwcHggIWltcG9ydGFudH0uY29udGFpbmVkLm1vYmlsZXttYXJnaW4tYm90dG9tOjB9LmNvbnRhaW5lZC50YWJzLm1vYmlsZSBkZCBhLC5jb250YWluZWQudGFicy5tb2JpbGUgbGkgYXtwYWRkaW5nOjE4cHggMjBweH0udGFicy5tb2JpbGUrdWwuY29udGFpbmVke21hcmdpbi1sZWZ0Oi0yMHB4O21hcmdpbi1yaWdodDotMjBweDtib3JkZXItd2lkdGg6MCAwIDFweCAwfS50b29sdGlwe2ZvbnQtc2l6ZToxNHB4O2xpbmUtaGVpZ2h0OjEuNDtwYWRkaW5nOjdweCAxMHB4IDlweCAxMHB4O2xlZnQ6NTAlICFpbXBvcnRhbnQ7bWF4LXdpZHRoOjgwJSAhaW1wb3J0YW50O21hcmdpbi1sZWZ0Oi00MCU7Zm9udC1zaXplOjExMCV9LnRvb2x0aXA+Lm51YiwudG9vbHRpcC50b3A+Lm51YiwudG9vbHRpcC5sZWZ0Pi5udWIsLnRvb2x0aXAucmlnaHQ+Lm51Yntib3JkZXItY29sb3I6dHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgIzAwMCB0cmFuc3BhcmVudDtib3JkZXItY29sb3I6dHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgcmdiYSgwLDAsMCwwLjg1KSB0cmFuc3BhcmVudDt0b3A6LTEycHg7bGVmdDoxMHB4fX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDk0MHB4KXsudG9wLWJhcnttYXJnaW4tYm90dG9tOjA7b3ZlcmZsb3c6aGlkZGVuO2hlaWdodDo0NXB4O2JhY2tncm91bmQ6IzIyMn0udG9wLWJhciAuanMtZ2VuZXJhdGVke2Rpc3BsYXk6YmxvY2t9LmNvbnRhaW4tdG8tZ3JpZCAudG9wLWJhcnt3aWR0aDphdXRvfS50b3AtYmFyIHNlY3Rpb257bGVmdDowO3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOmF1dG87LXdlYmtpdC10cmFuc2l0aW9uOmxlZnQgMzAwbXMgMDstbW96LXRyYW5zaXRpb246bGVmdCAzMDBtcyAwOy1vLXRyYW5zaXRpb246bGVmdCAzMDBtcyAwO3RyYW5zaXRpb246bGVmdCAzMDBtcyAwfS50b3AtYmFyIHVse3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7bWFyZ2luLWJvdHRvbTowO2Rpc3BsYXk6YmxvY2t9LnRvcC1iYXIgdWw+bGl7ZmxvYXQ6bm9uZX0udG9wLWJhciB1bD5saS5hY3RpdmUsLnRvcC1iYXIgdWw+bGk6aG92ZXJ7YmFja2dyb3VuZDojMTUxNTE1fS50b3AtYmFyIHVsPmxpLm5hbWV7aGVpZ2h0OjQ1cHh9LnRvcC1iYXIgdWw+bGkubmFtZSBoMXtsaW5lLWhlaWdodDoxfS50b3AtYmFyIHVsPmxpLm5hbWUgaDEgYXtjb2xvcjojZmZmO2Rpc3BsYXk6YmxvY2s7bGluZS1oZWlnaHQ6NDVweCAhaW1wb3J0YW50O3BhZGRpbmctbGVmdDoxNXB4O2hlaWdodDo0NXB4fS50b3AtYmFyIHVsPmxpOmhvdmVyIGEsLnRvcC1iYXIgdWw+bGkuYWN0aXZlIGF7Y29sb3I6I2ZmZn0udG9wLWJhciB1bD5saSBhOm5vdCguYnV0dG9uKXtjb2xvcjojZmZmfS50b3AtYmFyIHVsPmxpLnRvZ2dsZS10b3BiYXJ7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTpibG9jaztoZWlnaHQ6NDVweDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO3RvcDowO3dpZHRoOjUwJX0udG9wLWJhciB1bD5saS50b2dnbGUtdG9wYmFyIGF7Y29udGVudDoiIjtkaXNwbGF5OmJsb2NrO3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyOnNvbGlkIDhweDtib3JkZXItY29sb3I6I2ZmZiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTtyaWdodDoyMi41cHg7bWFyZ2luLXRvcDotNHB4fS50b3AtYmFyIHVsPmxpLnRvZ2dsZS10b3BiYXI6aG92ZXJ7YmFja2dyb3VuZDppbmhlcml0fS50b3AtYmFyIHVsPmxpLnRvZ2dsZS10b3BiYXIgYXtwYWRkaW5nOjAgIWltcG9ydGFudH0udG9wLWJhciB1bD5saS5kaXZpZGVye2JvcmRlci1ib3R0b206c29saWQgMXB4ICMzYzNjM2M7Ym9yZGVyLXRvcDpzb2xpZCAxcHggIzAwMDtjbGVhcjpib3RoO2hlaWdodDoxcHggIWltcG9ydGFudDttYXJnaW46OHB4IDAgIWltcG9ydGFudDt3aWR0aDoxMDAlfS50b3AtYmFyIHVsPmxpLnNlYXJjaHtwYWRkaW5nOjAgMjIuNXB4fS50b3AtYmFyIHVsPmxpLnNlYXJjaCBmb3Jte3dpZHRoOjEwMCV9LnRvcC1iYXIgdWw+bGkuc2VhcmNoIGZvcm0gaW5wdXRbdHlwZT10ZXh0XXt3aWR0aDo3NSV9LnRvcC1iYXIgdWw+bGkuc2VhcmNoIGZvcm0gLmJ1dHRvbnt0b3A6LTFweDt3aWR0aDoyNSV9LnRvcC1iYXIgdWw+bGkuaGFzLWRyb3Bkb3duIGF7cGFkZGluZy1yaWdodDozMy43NXB4fS50b3AtYmFyIHVsPmxpLmhhcy1kcm9wZG93biBhOmFmdGVye2NvbnRlbnQ6IiI7ZGlzcGxheTpibG9jazt3aWR0aDowO2hlaWdodDowO2JvcmRlcjpzb2xpZCA1cHg7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHJnYmEoMjU1LDI1NSwyNTUsMC41KTttYXJnaW4tcmlnaHQ6MTVweDttYXJnaW4tdG9wOi00LjVweDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlfS50b3AtYmFyIHVsPmxpLmhhcy1kcm9wZG93bjpob3Zlcj4uZHJvcGRvd257ZGlzcGxheTpibG9jazt2aXNpYmlsaXR5OmhpZGRlbn0udG9wLWJhciB1bD5saS5oYXMtZHJvcGRvd24gLmRyb3Bkb3due3Zpc2liaWxpdHk6aGlkZGVuO3otaW5kZXg6MCAhaW1wb3J0YW50fS50b3AtYmFyIHVsPmxpLmhhcy1kcm9wZG93bi5tb3ZlZHtwb3NpdGlvbjpzdGF0aWN9LnRvcC1iYXIgdWw+bGkuaGFzLWRyb3Bkb3duLm1vdmVkPi5kcm9wZG93bnt0b3A6MDt2aXNpYmlsaXR5OnZpc2libGV9LnRvcC1iYXIgdWw+bGkuaGFzLWRyb3Bkb3duLm1vdmVkPi5kcm9wZG93biBsaSBsYWJlbHttYXJnaW4tYm90dG9tOjZweDtwYWRkaW5nLXRvcDo2cHggIWltcG9ydGFudDtmb250LXNpemU6MTFweH0udG9wLWJhciB1bD5saS5oYXMtZHJvcGRvd24ubW92ZWQ+LmRyb3Bkb3duIGxpOm5vdCgudGl0bGUpe3BhZGRpbmctYm90dG9tOjB9LnRvcC1iYXIgdWw+bGkuaGFzLWRyb3Bkb3duLm1vdmVkPi5kcm9wZG93biBsaTpub3QoLnRpdGxlKSBhe3BhZGRpbmc6OHB4IDIyLjVweDtmb250LXNpemU6MTRweH0udG9wLWJhciB1bD5saS5oYXMtZHJvcGRvd24ubW92ZWQ+LmRyb3Bkb3duIGxpIGEsLnRvcC1iYXIgdWw+bGkuaGFzLWRyb3Bkb3duLm1vdmVkPi5kcm9wZG93biBsaSBsYWJlbHtwYWRkaW5nOjAgMjIuNXB4fS50b3AtYmFyIHVsPmxpLmhhcy1kcm9wZG93bi5tb3ZlZD4uZHJvcGRvd24gbGkgYTpob3ZlcntiYWNrZ3JvdW5kOiMzYzNjM2M7ZGlzcGxheTpibG9ja30udG9wLWJhciB1bD5saS5oYXMtZHJvcGRvd24ubW92ZWQ+LmRyb3Bkb3duIGxpLmRpdmlkZXJ7Ym9yZGVyLWJvdHRvbTpzb2xpZCAxcHggcmdiYSgyNTUsMjU1LDI1NSwwLjEpO21hcmdpbi10b3A6OHB4ICFpbXBvcnRhbnQ7bWFyZ2luLWJvdHRvbTo4cHggIWltcG9ydGFudH0udG9wLWJhciB1bD5saS5oYXMtZHJvcGRvd24ubW92ZWQgLmJhY2sudGl0bGV7cGFkZGluZy1ib3R0b206MH0udG9wLWJhciB1bD5saS5oYXMtZHJvcGRvd24ubW92ZWQgLmJhY2sudGl0bGUgYTpiZWZvcmV7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTtsZWZ0OjE3LjVweDttYXJnaW4tdG9wOi01cHg7d2lkdGg6MDtoZWlnaHQ6MDtjb250ZW50OiIiO2Rpc3BsYXk6YmxvY2s7d2lkdGg6MDtoZWlnaHQ6MDtib3JkZXI6c29saWQgNXB4O2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudCAjZmZmIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50fS50b3AtYmFyIHVsPmxpLmhhcy1kcm9wZG93bi5tb3ZlZCAuYmFjay50aXRsZSBoNXttYXJnaW46MDtwYWRkaW5nLWxlZnQ6MTVweDtwb3NpdGlvbjpyZWxhdGl2ZX0udG9wLWJhciB1bD5saS5oYXMtZHJvcGRvd24ubW92ZWQgLmJhY2sudGl0bGUgaDUgYXtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHg7Zm9udC1zaXplOjIzcHg7Zm9udC13ZWlnaHQ6Ym9sZH0udG9wLWJhciB1bD5saS5oYXMtZHJvcGRvd24gLmRyb3Bkb3duIGxpe2JhY2tncm91bmQ6dHJhbnNwYXJlbnR9LnRvcC1iYXIgdWw+bGkuaGFzLWRyb3Bkb3duIC5kcm9wZG93biBsaS5oYXMtZHJvcGRvd24gLmRyb3Bkb3due2xlZnQ6MTAwJSAhaW1wb3J0YW50O3RvcDowO3JpZ2h0OmF1dG8gIWltcG9ydGFudH0udG9wLWJhciB1bD5saS5oYXMtZHJvcGRvd24gLmRyb3Bkb3duIGxpLmhhcy1kcm9wZG93bj5he3BhZGRpbmctcmlnaHQ6MzMuNzVweH0udG9wLWJhciB1bD5saS5oYXMtZHJvcGRvd24gLmRyb3Bkb3duIGxpLmhhcy1kcm9wZG93bj5hOmFmdGVye2NvbnRlbnQ6IiI7bWFyZ2luLXJpZ2h0OjE1cHg7Y29udGVudDoiIjtkaXNwbGF5OmJsb2NrO3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyOnNvbGlkIDVweDtib3JkZXItY29sb3I6dHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgcmdiYSgyNTUsMjU1LDI1NSwwLjUpO3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7bWFyZ2luLXRvcDotNC41cHh9LnRvcC1iYXIgdWw+bGkuaGFzLWRyb3Bkb3duIC5kcm9wZG93biBsaS5oYXMtZHJvcGRvd24+YSBsaSBhOmhvdmVye2JhY2tncm91bmQ6IzNjM2MzY30udG9wLWJhciB1bD5saS5oYXMtZHJvcGRvd24gLmRyb3Bkb3duIGxpLmhhcy1kcm9wZG93bi5tb3ZlZHtwb3NpdGlvbjpzdGF0aWN9LnRvcC1iYXIgdWw+bGkuaGFzLWRyb3Bkb3duIC5kcm9wZG93biBsaS5oYXMtZHJvcGRvd24ubW92ZWQgLmRyb3Bkb3due3RvcDowO3Zpc2liaWxpdHk6dmlzaWJsZX0udG9wLWJhciB1bD5saS5oYXMtZHJvcGRvd24gLmRyb3Bkb3duIGxpLmhhcy1kcm9wZG93bjpob3ZlcntkaXNwbGF5OmJsb2NrfS50b3AtYmFyIHVsLmxlZnQsLnRvcC1iYXIgdWwucmlnaHR7ZmxvYXQ6bm9uZTt3aWR0aDoxMDAlfS50b3AtYmFyIHVsLmxlZnQ+bGksLnRvcC1iYXIgdWwucmlnaHQ+bGl7ZGlzcGxheTpibG9jaztmbG9hdDpub25lO21hcmdpbjowICFpbXBvcnRhbnR9LnRvcC1iYXIgdWwubGVmdD5saS5oYXMtZHJvcGRvd24gLmRyb3Bkb3duLC50b3AtYmFyIHVsLnJpZ2h0PmxpLmhhcy1kcm9wZG93biAuZHJvcGRvd257bGVmdDoxMDAlICFpbXBvcnRhbnQ7dG9wOjA7cmlnaHQ6YXV0byAhaW1wb3J0YW50fS50b3AtYmFyIHNlY3Rpb24+dWwgbGkgYTpub3QoLmJ1dHRvbil7cGFkZGluZy1sZWZ0OjIyLjVweCAhaW1wb3J0YW50fS50b3AtYmFyLmV4cGFuZGVke2hlaWdodDoxMDAlfS50b3AtYmFyLmV4cGFuZGVkIHVsIGxpLnRvZ2dsZS10b3BiYXIgYXtjb250ZW50OiIiO2Rpc3BsYXk6YmxvY2s7d2lkdGg6MDtoZWlnaHQ6MDtib3JkZXI6c29saWQgOHB4O2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudCB0cmFuc3BhcmVudCAjY2NjIHRyYW5zcGFyZW50O3RvcDphdXRvO2JvdHRvbTo1MCU7bWFyZ2luLWJvdHRvbTotNHB4fS50b3AtYmFyIHVsIGxpLmhhcy1idXR0b257cGFkZGluZzo1cHggMTVweH0udG9wLWJhciB1bCBsaSAuYnV0dG9uLnNtYWxse21hcmdpbjowICFpbXBvcnRhbnQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTAwJX0udG9wLWJhciB1bD5saS5oYXMtYnV0dG9uIGEuYnV0dG9ue21hcmdpbjowfX0K]]></data>
	</file>
	<file>
	  <filename>/CMSFoundation.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCmNsYXNzIENNU0ZvdW5kYXRpb24gZXh0ZW5kcyBDTVNNb2R1bGUNCg0Kew0KDQoJZnVuY3Rpb24gR2V0TmFtZSgpDQoNCgl7DQoNCgkJcmV0dXJuICdDTVNGb3VuZGF0aW9uJzsNCg0KCX0NCg0KCWZ1bmN0aW9uIEdldEZyaWVuZGx5TmFtZSgpDQoNCgl7DQoNCgkJcmV0dXJuICJDTVMgRm91bmRhdGlvbiI7DQoNCgl9DQoNCglmdW5jdGlvbiBHZXRWZXJzaW9uKCkNCg0KCXsNCg0KCQlyZXR1cm4gJzEuNC4xJzsNCg0KCX0NCg0KCWZ1bmN0aW9uIE1pbmltdW1DTVNWZXJzaW9uKCkNCg0KCXsNCg0KCQlyZXR1cm4gJzEuNyc7DQoNCgl9DQoNCglmdW5jdGlvbiBHZXRIZWxwKCkNCg0KCXsNCg0KCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ2hlbHAnKTsNCg0KCX0NCg0KCWZ1bmN0aW9uIEdldEF1dGhvcigpDQoNCgl7DQoNCgkJcmV0dXJuICdOaWNvbGFzIEdyaWxsZXQnOw0KDQoJfQ0KDQoJZnVuY3Rpb24gR2V0QXV0aG9yRW1haWwoKQ0KDQoJew0KDQoJCXJldHVybiAnbi5ncmlsbGV0MDFAZ21haWwuY29tJzsNCg0KCX0NCg0KCWZ1bmN0aW9uIEdldENoYW5nZUxvZygpDQoNCgl7DQoNCgkJcmV0dXJuICR0aGlzLT5MYW5nKCdjaGFuZ2Vsb2cnKTsNCg0KCX0NCg0KCWZ1bmN0aW9uIElzUGx1Z2luTW9kdWxlKCkNCg0KCXsNCg0KCQlyZXR1cm4gdHJ1ZTsNCg0KCX0NCg0KCWZ1bmN0aW9uIEhhc0FkbWluKCkNCg0KCXsNCg0KCQlyZXR1cm4gdHJ1ZTsNCg0KCX0NCg0KCWZ1bmN0aW9uIEdldEFkbWluU2VjdGlvbigpDQoNCgl7DQoNCgkJcmV0dXJuICdleHRlbnNpb25zJzsNCg0KCX0NCg0KCWZ1bmN0aW9uIEdldEFkbWluRGVzY3JpcHRpb24oKQ0KDQoJew0KDQoJCXJldHVybiAkdGhpcy0+TGFuZygnbW9kZGVzY3JpcHRpb24nKTsNCg0KCX0NCg0KCWZ1bmN0aW9uIFZpc2libGVUb0FkbWluVXNlcigpIA0KDQoJew0KDQoJCXJldHVybiAoJHRoaXMtPkNoZWNrUGVybWlzc2lvbignVmlldyBDTVNGb3VuZGF0aW9uJykgfHwgJHRoaXMtPkNoZWNrUGVybWlzc2lvbignQWRtaW5pc3RyYXRlIENNU0ZvdW5kYXRpb24nKSk7DQoNCgl9CQ0KDQoJZnVuY3Rpb24gR2V0RGVwZW5kZW5jaWVzKCkNCgl7DQoJcmV0dXJuIGFycmF5KCdDR0V4dGVuc2lvbnMnPT4nMS4yNCcsDQoJCQkJICdDR1NpbXBsZVNtYXJ0eSc9PicxLjQuNCcsDQoJCQkJICdKUXVlcnlUb29scyc9PicxLjAuMTEnKTsNCgl9DQoNCglmdW5jdGlvbiBBbGxvd0F1dG9JbnN0YWxsKCkNCgl7DQoJcmV0dXJuIEZBTFNFOw0KCX0NCg0KCWZ1bmN0aW9uIEFsbG93QXV0b1VwZ3JhZGUoKQ0KCXsNCglyZXR1cm4gRkFMU0U7DQoJfQ0KDQoJZnVuY3Rpb24gSW5zdGFsbCgpDQoNCgl7DQoJCSRkYiA9ICR0aGlzLT5HZXREYigpOw0KCQkkcXVlcnkgPSAnSU5TRVJUIElOVE8gJy5jbXNfZGJfcHJlZml4KCkuJ21vZHVsZV90ZW1wbGF0ZXMgKG1vZHVsZV9uYW1lLCB0ZW1wbGF0ZV9uYW1lLCBjb250ZW50LCBjcmVhdGVfZGF0ZSwgbW9kaWZpZWRfZGF0ZSkgVkFMVUVTICg/LD8sPyw/LD8pJzsNCgkgICAgJGRiciA9ICRkYi0+RXhlY3V0ZSgkcXVlcnksIGFycmF5KCJNZW51TWFuYWdlciIsICJyZXNwb25zaXZlX21lbnUiLCAiPGRpdiBjbGFzcz1cInJvd1wiPg0KICA8ZGl2IGNsYXNzPVwidHdlbHZlIGNvbHVtbnNcIj4NCntpZiAgXCRjb3VudCA+IDB9DQo8bmF2IGNsYXNzPVwidG9wLWJhclwiPg0KPHVsPg0KICAgICAgICA8bGkgY2xhc3M9XCJuYW1lXCI+DQogICAgICAgICAgPGgxPg0KICAgICAgICAgICAgPGEgaHJlZj1cIiNcIj4NCiAgICAgICAgICAgICANCiAgICAgICAgICAgIDwvYT4NCiAgICAgICAgICA8L2gxPg0KICAgICAgICA8L2xpPg0KICAgICAgICA8bGkgY2xhc3M9XCJ0b2dnbGUtdG9wYmFyXCI+PGEgaHJlZj1cIiNcIj48L2E+PC9saT4NCiAgICAgIDwvdWw+DQo8c2VjdGlvbj4NCjx1bCBjbGFzcz1cImxlZnRcIj4NCiA8bGkgY2xhc3M9XCJkaXZpZGVyIHNob3ctZm9yLW1lZGl1bS1hbmQtdXBcIj48L2xpPg0Ke2ZvcmVhY2ggZnJvbT1cJG5vZGVsaXN0IGl0ZW09bm9kZX0NCgl7aWYgXCRub2RlLT5jaGlsZHJlbl9leGlzdCA9PSB0cnVlIG9yIFwkbm9kZS0+cGFyZW50ID09IHRydWV9DQoJCXtpZiBcJG5vZGUtPmRlcHRoIDwgXCRub2RlLT5wcmV2ZGVwdGh9DQoJCQk8L3VsPjwvbGk+DQoJCXsvaWZ9DQoJCTxsaSBjbGFzcz1cImhhcy1kcm9wZG93blwiIGlkPVwiY3NzX3tcJG5vZGUtPmFsaWFzfVwiPg0KCQkJPGEgaHJlZj1cIntpZiBcJG5vZGUtPnVybCE9Jyd9e2Vsc2V9I3svaWZ9XCI+e1wkbm9kZS0+bWVudXRleHR9PC9hPg0KCQkJPHVsIGNsYXNzPVwiZHJvcGRvd25cIj4NCgl7ZWxzZX0NCgkJe2lmIFwkbm9kZS0+dHlwZSA9PSdzZWN0aW9uaGVhZGVyJ30NCiAgICAgICAgICAgICAgICAgICAgIDxsaSBpZD1cImNzc197XCRub2RlLT5hbGlhc31cIj48bGFiZWw+e1wkbm9kZS0+bWVudXRleHR9PC9sYWJlbD48L2xpPg0KCQl7ZWxzZWlmIFwkbm9kZS0+dHlwZSA9PSdzZXBhcmF0b3InfQ0KICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZGl2aWRlclwiIGlkPVwiY3NzX3tcJG5vZGUtPmFsaWFzfVwiPjwvbGk+DQogICAgICAgICAgICAgICAge2Vsc2V9DQogICAgICAgICAgICAgICAgICAgICA8bGkgaWQ9XCJjc3Nfe1wkbm9kZS0+YWxpYXN9XCI+PGEgaHJlZj1cIntpZiBcJG5vZGUtPnVybCE9Jyd9e1wkbm9kZS0+dXJsfXtlbHNlfSN7L2lmfVwiPntcJG5vZGUtPm1lbnV0ZXh0fTwvYT48L2xpPg0KICAgICAgICAgICAgICAgIHsvaWZ9DQoJey9pZn0NCnsvZm9yZWFjaH0NCjwvdWw+DQogPHVsIGNsYXNzPVwicmlnaHRcIj48bGk+PC9saT4NCjwvdWw+DQo8L3NlY3Rpb24+DQo8L25hdj4NCnsvaWZ9DQo8L2Rpdj4NCjwvZGl2PiIsIHRyaW0oJGRiLT5EQlRpbWVTdGFtcCh0aW1lKCkpLCAiJyIpLCB0cmltKCRkYi0+REJUaW1lU3RhbXAodGltZSgpKSwgIiciKSkpOw0KCQkkcXVlcnkgPSAnSU5TRVJUIElOVE8gJy5jbXNfZGJfcHJlZml4KCkuJ21vZHVsZV9zbWFydHlfcGx1Z2lucyAoc2lnLG5hbWUsbW9kdWxlLHR5cGUsY2FsbGJhY2ssYXZhaWxhYmxlLGNhY2hhYmxlKSBWQUxVRVMgKD8sPyw/LD8sPyw/LD8pJzsNCgkgICAgJGRiciA9ICRkYi0+RXhlY3V0ZSgkcXVlcnksIGFycmF5KG1kNSgiY21zZm91bmRhdGlvbiIpLCJDTVNGb3VuZGF0aW9uIiwiQ01TRm91bmRhdGlvbiIsImZ1bmN0aW9uIiwiczoxNTpcImZ1bmN0aW9uX3BsdWdpblwiIiwxLDApKTsNCg0KCQkkdGhpcy0+Q3JlYXRlUGVybWlzc2lvbignQ01TRm91bmRhdGlvbiBBZG1pbicsICdNYW5hZ2UgQ01TRm91bmRhdGlvbicpOw0KCQkkdGhpcy0+Q3JlYXRlUGVybWlzc2lvbignQ01TRm91bmRhdGlvbiBWaWV3JywgJ1ZpZXcgQ01TRm91bmRhdGlvbicpOw0KDQoJfQ0KDQoJZnVuY3Rpb24gU2V0UGFyYW1ldGVycygpIA0KDQoJew0KDQoJCSR0aGlzLT5SZXN0cmljdFVua25vd25QYXJhbXMoKTsNCg0KCQkkdGhpcy0+UmVnaXN0ZXJNb2R1bGVQbHVnaW4oKTsNCg0KCX0NCg0KCWZ1bmN0aW9uIEluc3RhbGxQb3N0TWVzc2FnZSgpDQoNCgl7DQoNCgkJcmV0dXJuICR0aGlzLT5MYW5nKCdwb3N0aW5zdGFsbCcpOw0KDQoJfQ0KDQoJZnVuY3Rpb24gVW5pbnN0YWxsKCkNCg0KCXsNCgkJJGRiID0gJHRoaXMtPkdldERiKCk7DQoJCSRxdWVyeSA9ICdERUxFVEUgRlJPTSAnLmNtc19kYl9wcmVmaXgoKS4nbW9kdWxlX3NtYXJ0eV9wbHVnaW5zIFdIRVJFIHNpZz0/JzsNCgkgICAgJGRiciA9ICRkYi0+RXhlY3V0ZSgkcXVlcnksIGFycmF5KG1kNSgiY21zZm91bmRhdGlvbiIpKSk7DQoJCSR0aGlzLT5SZW1vdmVQZXJtaXNzaW9uKCdDTVNGb3VuZGF0aW9uIEFkbWluJyk7DQoJCSR0aGlzLT5SZW1vdmVQZXJtaXNzaW9uKCdDTVNGb3VuZGF0aW9uIFZpZXcnKTsNCg0KCX0NCg0KCWZ1bmN0aW9uIFVuaW5zdGFsbFByZU1lc3NhZ2UoKQ0KDQoJew0KDQoJCXJldHVybiAkdGhpcy0+TGFuZygndW5pbnN0YWxsX2NvbmZpcm0nKTsNCg0KCX0NCg0KCWZ1bmN0aW9uIFVuaW5zdGFsbFBvc3RNZXNzYWdlKCkNCg0KCXsNCg0KCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ3Bvc3R1bmluc3RhbGwnKTsNCg0KCX0NCg0KfQ0KDQo/Pg==]]></data>
	</file>
</module>
