@utoo/web 1.4.5 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ export default "data:application/javascript;base64,LyohIEZvciBsaWNlbnNlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgbG9hZGVyV29ya2VySW5saW5lLmpzLkxJQ0VOU0UudHh0ICovCiFmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LGZhY3Rvcnkpe2lmKCJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUpbW9kdWxlLmV4cG9ydHM9ZmFjdG9yeSgpO2Vsc2UgaWYoImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW10sZmFjdG9yeSk7ZWxzZXt2YXIgYT1mYWN0b3J5KCk7Zm9yKHZhciBpIGluIGEpKCJvYmplY3QiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzOnJvb3QpW2ldPWFbaV19fShzZWxmLCgpPT4oKCk9Pnt2YXIgX193ZWJwYWNrX21vZHVsZXNfXz17Ii4uLy4uL25vZGVfbW9kdWxlcy9hc24xLmpzL2xpYi9hc24xLmpzIihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pe3ZhciBhc24xPWV4cG9ydHM7YXNuMS5iaWdudW09X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2JuLmpzL2xpYi9ibi5qcyIpLGFzbjEuZGVmaW5lPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9hc24xLmpzL2xpYi9hc24xL2FwaS5qcyIpLmRlZmluZSxhc24xLmJhc2U9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2FzbjEuanMvbGliL2FzbjEvYmFzZS9pbmRleC5qcyIpLGFzbjEuY29uc3RhbnRzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9hc24xLmpzL2xpYi9hc24xL2NvbnN0YW50cy9pbmRleC5qcyIpLGFzbjEuZGVjb2RlcnM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2FzbjEuanMvbGliL2FzbjEvZGVjb2RlcnMvaW5kZXguanMiKSxhc24xLmVuY29kZXJzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9hc24xLmpzL2xpYi9hc24xL2VuY29kZXJzL2luZGV4LmpzIil9LCIuLi8uLi9ub2RlX21vZHVsZXMvYXNuMS5qcy9saWIvYXNuMS9hcGkuanMiKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7dmFyIGFzbjE9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2FzbjEuanMvbGliL2FzbjEuanMiKSxpbmhlcml0cz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIpO2Z1bmN0aW9uIEVudGl0eShuYW1lLGJvZHkpe3RoaXMubmFtZT1uYW1lLHRoaXMuYm9keT1ib2R5LHRoaXMuZGVjb2RlcnM9e30sdGhpcy5lbmNvZGVycz17fX1leHBvcnRzLmRlZmluZT1mdW5jdGlvbiBkZWZpbmUobmFtZSxib2R5KXtyZXR1cm4gbmV3IEVudGl0eShuYW1lLGJvZHkpfSxFbnRpdHkucHJvdG90eXBlLl9jcmVhdGVOYW1lZD1mdW5jdGlvbiBjcmVhdGVOYW1lZChiYXNlKXt2YXIgbmFtZWQ7dHJ5e25hbWVkPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy92bS1icm93c2VyaWZ5L2luZGV4LmpzIikucnVuSW5UaGlzQ29udGV4dCgiKGZ1bmN0aW9uICIrdGhpcy5uYW1lKyIoZW50aXR5KSB7XG4gIHRoaXMuX2luaXROYW1lZChlbnRpdHkpO1xufSkiKX1jYXRjaChlKXtuYW1lZD1mdW5jdGlvbihlbnRpdHkpe3RoaXMuX2luaXROYW1lZChlbnRpdHkpfX1yZXR1cm4gaW5oZXJpdHMobmFtZWQsYmFzZSksbmFtZWQucHJvdG90eXBlLl9pbml0TmFtZWQ9ZnVuY3Rpb24gaW5pdG5hbWVkKGVudGl0eSl7YmFzZS5jYWxsKHRoaXMsZW50aXR5KX0sbmV3IG5hbWVkKHRoaXMpfSxFbnRpdHkucHJvdG90eXBlLl9nZXREZWNvZGVyPWZ1bmN0aW9uIF9nZXREZWNvZGVyKGVuYyl7cmV0dXJuIGVuYz1lbmN8fCJkZXIiLHRoaXMuZGVjb2RlcnMuaGFzT3duUHJvcGVydHkoZW5jKXx8KHRoaXMuZGVjb2RlcnNbZW5jXT10aGlzLl9jcmVhdGVOYW1lZChhc24xLmRlY29kZXJzW2VuY10pKSx0aGlzLmRlY29kZXJzW2VuY119LEVudGl0eS5wcm90b3R5cGUuZGVjb2RlPWZ1bmN0aW9uIGRlY29kZShkYXRhLGVuYyxvcHRpb25zKXtyZXR1cm4gdGhpcy5fZ2V0RGVjb2RlcihlbmMpLmRlY29kZShkYXRhLG9wdGlvbnMpfSxFbnRpdHkucHJvdG90eXBlLl9nZXRFbmNvZGVyPWZ1bmN0aW9uIF9nZXRFbmNvZGVyKGVuYyl7cmV0dXJuIGVuYz1lbmN8fCJkZXIiLHRoaXMuZW5jb2RlcnMuaGFzT3duUHJvcGVydHkoZW5jKXx8KHRoaXMuZW5jb2RlcnNbZW5jXT10aGlzLl9jcmVhdGVOYW1lZChhc24xLmVuY29kZXJzW2VuY10pKSx0aGlzLmVuY29kZXJzW2VuY119LEVudGl0eS5wcm90b3R5cGUuZW5jb2RlPWZ1bmN0aW9uIGVuY29kZShkYXRhLGVuYyxyZXBvcnRlcil7cmV0dXJuIHRoaXMuX2dldEVuY29kZXIoZW5jKS5lbmNvZGUoZGF0YSxyZXBvcnRlcil9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2FzbjEuanMvbGliL2FzbjEvYmFzZS9idWZmZXIuanMiKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7dmFyIGluaGVyaXRzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiksUmVwb3J0ZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2FzbjEuanMvbGliL2FzbjEvYmFzZS9pbmRleC5qcyIpLlJlcG9ydGVyLEJ1ZmZlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzIikuQnVmZmVyO2Z1bmN0aW9uIERlY29kZXJCdWZmZXIoYmFzZSxvcHRpb25zKXtSZXBvcnRlci5jYWxsKHRoaXMsb3B0aW9ucyksQnVmZmVyLmlzQnVmZmVyKGJhc2UpPyh0aGlzLmJhc2U9YmFzZSx0aGlzLm9mZnNldD0wLHRoaXMubGVuZ3RoPWJhc2UubGVuZ3RoKTp0aGlzLmVycm9yKCJJbnB1dCBub3QgQnVmZmVyIil9ZnVuY3Rpb24gRW5jb2RlckJ1ZmZlcih2YWx1ZSxyZXBvcnRlcil7aWYoQXJyYXkuaXNBcnJheSh2YWx1ZSkpdGhpcy5sZW5ndGg9MCx0aGlzLnZhbHVlPXZhbHVlLm1hcChmdW5jdGlvbihpdGVtKXtyZXR1cm4gaXRlbSBpbnN0YW5jZW9mIEVuY29kZXJCdWZmZXJ8fChpdGVtPW5ldyBFbmNvZGVyQnVmZmVyKGl0ZW0scmVwb3J0ZXIpKSx0aGlzLmxlbmd0aCs9aXRlbS5sZW5ndGgsaXRlbX0sdGhpcyk7ZWxzZSBpZigibnVtYmVyIj09dHlwZW9mIHZhbHVlKXtpZighKDA8PXZhbHVlJiZ2YWx1ZTw9MjU1KSlyZXR1cm4gcmVwb3J0ZXIuZXJyb3IoIm5vbi1ieXRlIEVuY29kZXJCdWZmZXIgdmFsdWUiKTt0aGlzLnZhbHVlPXZhbHVlLHRoaXMubGVuZ3RoPTF9ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIHZhbHVlKXRoaXMudmFsdWU9dmFsdWUsdGhpcy5sZW5ndGg9QnVmZmVyLmJ5dGVMZW5ndGgodmFsdWUpO2Vsc2V7aWYoIUJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkpcmV0dXJuIHJlcG9ydGVyLmVycm9yKCJVbnN1cHBvcnRlZCB0eXBlOiAiK3R5cGVvZiB2YWx1ZSk7dGhpcy52YWx1ZT12YWx1ZSx0aGlzLmxlbmd0aD12YWx1ZS5sZW5ndGh9fWluaGVyaXRzKERlY29kZXJCdWZmZXIsUmVwb3J0ZXIpLGV4cG9ydHMudD1EZWNvZGVyQnVmZmVyLERlY29kZXJCdWZmZXIucHJvdG90eXBlLnNhdmU9ZnVuY3Rpb24gc2F2ZSgpe3JldHVybntvZmZzZXQ6dGhpcy5vZmZzZXQscmVwb3J0ZXI6UmVwb3J0ZXIucHJvdG90eXBlLnNhdmUuY2FsbCh0aGlzKX19LERlY29kZXJCdWZmZXIucHJvdG90eXBlLnJlc3RvcmU9ZnVuY3Rpb24gcmVzdG9yZShzYXZlKXt2YXIgcmVzPW5ldyBEZWNvZGVyQnVmZmVyKHRoaXMuYmFzZSk7cmV0dXJuIHJlcy5vZmZzZXQ9c2F2ZS5vZmZzZXQscmVzLmxlbmd0aD10aGlzLm9mZnNldCx0aGlzLm9mZnNldD1zYXZlLm9mZnNldCxSZXBvcnRlci5wcm90b3R5cGUucmVzdG9yZS5jYWxsKHRoaXMsc2F2ZS5yZXBvcnRlcikscmVzfSxEZWNvZGVyQnVmZmVyLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uIGlzRW1wdHkoKXtyZXR1cm4gdGhpcy5vZmZzZXQ9PT10aGlzLmxlbmd0aH0sRGVjb2RlckJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4PWZ1bmN0aW9uIHJlYWRVSW50OChmYWlsKXtyZXR1cm4gdGhpcy5vZmZzZXQrMTw9dGhpcy5sZW5ndGg/dGhpcy5iYXNlLnJlYWRVSW50OCh0aGlzLm9mZnNldCsrLCEwKTp0aGlzLmVycm9yKGZhaWx8fCJEZWNvZGVyQnVmZmVyIG92ZXJydW4iKX0sRGVjb2RlckJ1ZmZlci5wcm90b3R5cGUuc2tpcD1mdW5jdGlvbiBza2lwKGJ5dGVzLGZhaWwpe2lmKCEodGhpcy5vZmZzZXQrYnl0ZXM8PXRoaXMubGVuZ3RoKSlyZXR1cm4gdGhpcy5lcnJvcihmYWlsfHwiRGVjb2RlckJ1ZmZlciBvdmVycnVuIik7dmFyIHJlcz1uZXcgRGVjb2RlckJ1ZmZlcih0aGlzLmJhc2UpO3JldHVybiByZXMuX3JlcG9ydGVyU3RhdGU9dGhpcy5fcmVwb3J0ZXJTdGF0ZSxyZXMub2Zmc2V0PXRoaXMub2Zmc2V0LHJlcy5sZW5ndGg9dGhpcy5vZmZzZXQrYnl0ZXMsdGhpcy5vZmZzZXQrPWJ5dGVzLHJlc30sRGVjb2RlckJ1ZmZlci5wcm90b3R5cGUucmF3PWZ1bmN0aW9uIHJhdyhzYXZlKXtyZXR1cm4gdGhpcy5iYXNlLnNsaWNlKHNhdmU/c2F2ZS5vZmZzZXQ6dGhpcy5vZmZzZXQsdGhpcy5sZW5ndGgpfSxleHBvcnRzLmQ9RW5jb2RlckJ1ZmZlcixFbmNvZGVyQnVmZmVyLnByb3RvdHlwZS5qb2luPWZ1bmN0aW9uIGpvaW4ob3V0LG9mZnNldCl7cmV0dXJuIG91dHx8KG91dD1uZXcgQnVmZmVyKHRoaXMubGVuZ3RoKSksb2Zmc2V0fHwob2Zmc2V0PTApLDA9PT10aGlzLmxlbmd0aHx8KEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSk/dGhpcy52YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pe2l0ZW0uam9pbihvdXQsb2Zmc2V0KSxvZmZzZXQrPWl0ZW0ubGVuZ3RofSk6KCJudW1iZXIiPT10eXBlb2YgdGhpcy52YWx1ZT9vdXRbb2Zmc2V0XT10aGlzLnZhbHVlOiJzdHJpbmciPT10eXBlb2YgdGhpcy52YWx1ZT9vdXQud3JpdGUodGhpcy52YWx1ZSxvZmZzZXQpOkJ1ZmZlci5pc0J1ZmZlcih0aGlzLnZhbHVlKSYmdGhpcy52YWx1ZS5jb3B5KG91dCxvZmZzZXQpLG9mZnNldCs9dGhpcy5sZW5ndGgpKSxvdXR9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2FzbjEuanMvbGliL2FzbjEvYmFzZS9pbmRleC5qcyIoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXt2YXIgYmFzZT1leHBvcnRzO2Jhc2UuUmVwb3J0ZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2FzbjEuanMvbGliL2FzbjEvYmFzZS9yZXBvcnRlci5qcyIpLmEsYmFzZS5EZWNvZGVyQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9hc24xLmpzL2xpYi9hc24xL2Jhc2UvYnVmZmVyLmpzIikudCxiYXNlLkVuY29kZXJCdWZmZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2FzbjEuanMvbGliL2FzbjEvYmFzZS9idWZmZXIuanMiKS5kLGJhc2UuTm9kZT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYXNuMS5qcy9saWIvYXNuMS9iYXNlL25vZGUuanMiKX0sIi4uLy4uL25vZGVfbW9kdWxlcy9hc24xLmpzL2xpYi9hc24xL2Jhc2Uvbm9kZS5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXt2YXIgUmVwb3J0ZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2FzbjEuanMvbGliL2FzbjEvYmFzZS9pbmRleC5qcyIpLlJlcG9ydGVyLEVuY29kZXJCdWZmZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2FzbjEuanMvbGliL2FzbjEvYmFzZS9pbmRleC5qcyIpLkVuY29kZXJCdWZmZXIsRGVjb2RlckJ1ZmZlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYXNuMS5qcy9saWIvYXNuMS9iYXNlL2luZGV4LmpzIikuRGVjb2RlckJ1ZmZlcixhc3NlcnQ9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL21pbmltYWxpc3RpYy1hc3NlcnQvaW5kZXguanMiKSx0YWdzPVsic2VxIiwic2Vxb2YiLCJzZXQiLCJzZXRvZiIsIm9iamlkIiwiYm9vbCIsImdlbnRpbWUiLCJ1dGN0aW1lIiwibnVsbF8iLCJlbnVtIiwiaW50Iiwib2JqRGVzYyIsImJpdHN0ciIsImJtcHN0ciIsImNoYXJzdHIiLCJnZW5zdHIiLCJncmFwaHN0ciIsImlhNXN0ciIsImlzbzY0NnN0ciIsIm51bXN0ciIsIm9jdHN0ciIsInByaW50c3RyIiwidDYxc3RyIiwidW5pc3RyIiwidXRmOHN0ciIsInZpZGVvc3RyIl0sbWV0aG9kcz1bImtleSIsIm9iaiIsInVzZSIsIm9wdGlvbmFsIiwiZXhwbGljaXQiLCJpbXBsaWNpdCIsImRlZiIsImNob2ljZSIsImFueSIsImNvbnRhaW5zIl0uY29uY2F0KHRhZ3MpO2Z1bmN0aW9uIE5vZGUoZW5jLHBhcmVudCl7dmFyIHN0YXRlPXt9O3RoaXMuX2Jhc2VTdGF0ZT1zdGF0ZSxzdGF0ZS5lbmM9ZW5jLHN0YXRlLnBhcmVudD1wYXJlbnR8fG51bGwsc3RhdGUuY2hpbGRyZW49bnVsbCxzdGF0ZS50YWc9bnVsbCxzdGF0ZS5hcmdzPW51bGwsc3RhdGUucmV2ZXJzZUFyZ3M9bnVsbCxzdGF0ZS5jaG9pY2U9bnVsbCxzdGF0ZS5vcHRpb25hbD0hMSxzdGF0ZS5hbnk9ITEsc3RhdGUub2JqPSExLHN0YXRlLnVzZT1udWxsLHN0YXRlLnVzZURlY29kZXI9bnVsbCxzdGF0ZS5rZXk9bnVsbCxzdGF0ZS5kZWZhdWx0PW51bGwsc3RhdGUuZXhwbGljaXQ9bnVsbCxzdGF0ZS5pbXBsaWNpdD1udWxsLHN0YXRlLmNvbnRhaW5zPW51bGwsc3RhdGUucGFyZW50fHwoc3RhdGUuY2hpbGRyZW49W10sdGhpcy5fd3JhcCgpKX1tb2R1bGUuZXhwb3J0cz1Ob2RlO3ZhciBzdGF0ZVByb3BzPVsiZW5jIiwicGFyZW50IiwiY2hpbGRyZW4iLCJ0YWciLCJhcmdzIiwicmV2ZXJzZUFyZ3MiLCJjaG9pY2UiLCJvcHRpb25hbCIsImFueSIsIm9iaiIsInVzZSIsImFsdGVyZWRVc2UiLCJrZXkiLCJkZWZhdWx0IiwiZXhwbGljaXQiLCJpbXBsaWNpdCIsImNvbnRhaW5zIl07Tm9kZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24gY2xvbmUoKXt2YXIgc3RhdGU9dGhpcy5fYmFzZVN0YXRlLGNzdGF0ZT17fTtzdGF0ZVByb3BzLmZvckVhY2goZnVuY3Rpb24ocHJvcCl7Y3N0YXRlW3Byb3BdPXN0YXRlW3Byb3BdfSk7dmFyIHJlcz1uZXcgdGhpcy5jb25zdHJ1Y3Rvcihjc3RhdGUucGFyZW50KTtyZXR1cm4gcmVzLl9iYXNlU3RhdGU9Y3N0YXRlLHJlc30sTm9kZS5wcm90b3R5cGUuX3dyYXA9ZnVuY3Rpb24gd3JhcCgpe3ZhciBzdGF0ZT10aGlzLl9iYXNlU3RhdGU7bWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCl7dGhpc1ttZXRob2RdPWZ1bmN0aW9uIF93cmFwcGVkTWV0aG9kKCl7dmFyIGNsb25lPW5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMpO3JldHVybiBzdGF0ZS5jaGlsZHJlbi5wdXNoKGNsb25lKSxjbG9uZVttZXRob2RdLmFwcGx5KGNsb25lLGFyZ3VtZW50cyl9fSx0aGlzKX0sTm9kZS5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24gaW5pdChib2R5KXt2YXIgc3RhdGU9dGhpcy5fYmFzZVN0YXRlO2Fzc2VydChudWxsPT09c3RhdGUucGFyZW50KSxib2R5LmNhbGwodGhpcyksc3RhdGUuY2hpbGRyZW49c3RhdGUuY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uKGNoaWxkKXtyZXR1cm4gY2hpbGQuX2Jhc2VTdGF0ZS5wYXJlbnQ9PT10aGlzfSx0aGlzKSxhc3NlcnQuZXF1YWwoc3RhdGUuY2hpbGRyZW4ubGVuZ3RoLDEsIlJvb3Qgbm9kZSBjYW4gaGF2ZSBvbmx5IG9uZSBjaGlsZCIpfSxOb2RlLnByb3RvdHlwZS5fdXNlQXJncz1mdW5jdGlvbiB1c2VBcmdzKGFyZ3Mpe3ZhciBzdGF0ZT10aGlzLl9iYXNlU3RhdGUsY2hpbGRyZW49YXJncy5maWx0ZXIoZnVuY3Rpb24oYXJnKXtyZXR1cm4gYXJnIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcn0sdGhpcyk7YXJncz1hcmdzLmZpbHRlcihmdW5jdGlvbihhcmcpe3JldHVybiEoYXJnIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcil9LHRoaXMpLDAhPT1jaGlsZHJlbi5sZW5ndGgmJihhc3NlcnQobnVsbD09PXN0YXRlLmNoaWxkcmVuKSxzdGF0ZS5jaGlsZHJlbj1jaGlsZHJlbixjaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGNoaWxkKXtjaGlsZC5fYmFzZVN0YXRlLnBhcmVudD10aGlzfSx0aGlzKSksMCE9PWFyZ3MubGVuZ3RoJiYoYXNzZXJ0KG51bGw9PT1zdGF0ZS5hcmdzKSxzdGF0ZS5hcmdzPWFyZ3Msc3RhdGUucmV2ZXJzZUFyZ3M9YXJncy5tYXAoZnVuY3Rpb24oYXJnKXtpZigib2JqZWN0IiE9dHlwZW9mIGFyZ3x8YXJnLmNvbnN0cnVjdG9yIT09T2JqZWN0KXJldHVybiBhcmc7dmFyIHJlcz17fTtyZXR1cm4gT2JqZWN0LmtleXMoYXJnKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSl7a2V5PT0oMHxrZXkpJiYoa2V5fD0wKTt2YXIgdmFsdWU9YXJnW2tleV07cmVzW3ZhbHVlXT1rZXl9KSxyZXN9KSl9LFsiX3BlZWtUYWciLCJfZGVjb2RlVGFnIiwiX3VzZSIsIl9kZWNvZGVTdHIiLCJfZGVjb2RlT2JqaWQiLCJfZGVjb2RlVGltZSIsIl9kZWNvZGVOdWxsIiwiX2RlY29kZUludCIsIl9kZWNvZGVCb29sIiwiX2RlY29kZUxpc3QiLCJfZW5jb2RlQ29tcG9zaXRlIiwiX2VuY29kZVN0ciIsIl9lbmNvZGVPYmppZCIsIl9lbmNvZGVUaW1lIiwiX2VuY29kZU51bGwiLCJfZW5jb2RlSW50IiwiX2VuY29kZUJvb2wiXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCl7Tm9kZS5wcm90b3R5cGVbbWV0aG9kXT1mdW5jdGlvbiBfb3ZlcnJpZGVkKCl7dmFyIHN0YXRlPXRoaXMuX2Jhc2VTdGF0ZTt0aHJvdyBuZXcgRXJyb3IobWV0aG9kKyIgbm90IGltcGxlbWVudGVkIGZvciBlbmNvZGluZzogIitzdGF0ZS5lbmMpfX0pLHRhZ3MuZm9yRWFjaChmdW5jdGlvbih0YWcpe05vZGUucHJvdG90eXBlW3RhZ109ZnVuY3Rpb24gX3RhZ01ldGhvZCgpe3ZhciBzdGF0ZT10aGlzLl9iYXNlU3RhdGUsYXJncz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3JldHVybiBhc3NlcnQobnVsbD09PXN0YXRlLnRhZyksc3RhdGUudGFnPXRhZyx0aGlzLl91c2VBcmdzKGFyZ3MpLHRoaXN9fSksTm9kZS5wcm90b3R5cGUudXNlPWZ1bmN0aW9uIHVzZShpdGVtKXthc3NlcnQoaXRlbSk7dmFyIHN0YXRlPXRoaXMuX2Jhc2VTdGF0ZTtyZXR1cm4gYXNzZXJ0KG51bGw9PT1zdGF0ZS51c2UpLHN0YXRlLnVzZT1pdGVtLHRoaXN9LE5vZGUucHJvdG90eXBlLm9wdGlvbmFsPWZ1bmN0aW9uIG9wdGlvbmFsKCl7cmV0dXJuIHRoaXMuX2Jhc2VTdGF0ZS5vcHRpb25hbD0hMCx0aGlzfSxOb2RlLnByb3RvdHlwZS5kZWY9ZnVuY3Rpb24gZGVmKHZhbCl7dmFyIHN0YXRlPXRoaXMuX2Jhc2VTdGF0ZTtyZXR1cm4gYXNzZXJ0KG51bGw9PT1zdGF0ZS5kZWZhdWx0KSxzdGF0ZS5kZWZhdWx0PXZhbCxzdGF0ZS5vcHRpb25hbD0hMCx0aGlzfSxOb2RlLnByb3RvdHlwZS5leHBsaWNpdD1mdW5jdGlvbiBleHBsaWNpdChudW0pe3ZhciBzdGF0ZT10aGlzLl9iYXNlU3RhdGU7cmV0dXJuIGFzc2VydChudWxsPT09c3RhdGUuZXhwbGljaXQmJm51bGw9PT1zdGF0ZS5pbXBsaWNpdCksc3RhdGUuZXhwbGljaXQ9bnVtLHRoaXN9LE5vZGUucHJvdG90eXBlLmltcGxpY2l0PWZ1bmN0aW9uIGltcGxpY2l0KG51bSl7dmFyIHN0YXRlPXRoaXMuX2Jhc2VTdGF0ZTtyZXR1cm4gYXNzZXJ0KG51bGw9PT1zdGF0ZS5leHBsaWNpdCYmbnVsbD09PXN0YXRlLmltcGxpY2l0KSxzdGF0ZS5pbXBsaWNpdD1udW0sdGhpc30sTm9kZS5wcm90b3R5cGUub2JqPWZ1bmN0aW9uIG9iaigpe3ZhciBzdGF0ZT10aGlzLl9iYXNlU3RhdGUsYXJncz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3JldHVybiBzdGF0ZS5vYmo9ITAsMCE9PWFyZ3MubGVuZ3RoJiZ0aGlzLl91c2VBcmdzKGFyZ3MpLHRoaXN9LE5vZGUucHJvdG90eXBlLmtleT1mdW5jdGlvbiBrZXkobmV3S2V5KXt2YXIgc3RhdGU9dGhpcy5fYmFzZVN0YXRlO3JldHVybiBhc3NlcnQobnVsbD09PXN0YXRlLmtleSksc3RhdGUua2V5PW5ld0tleSx0aGlzfSxOb2RlLnByb3RvdHlwZS5hbnk9ZnVuY3Rpb24gYW55KCl7cmV0dXJuIHRoaXMuX2Jhc2VTdGF0ZS5hbnk9ITAsdGhpc30sTm9kZS5wcm90b3R5cGUuY2hvaWNlPWZ1bmN0aW9uIGNob2ljZShvYmope3ZhciBzdGF0ZT10aGlzLl9iYXNlU3RhdGU7cmV0dXJuIGFzc2VydChudWxsPT09c3RhdGUuY2hvaWNlKSxzdGF0ZS5jaG9pY2U9b2JqLHRoaXMuX3VzZUFyZ3MoT2JqZWN0LmtleXMob2JqKS5tYXAoZnVuY3Rpb24oa2V5KXtyZXR1cm4gb2JqW2tleV19KSksdGhpc30sTm9kZS5wcm90b3R5cGUuY29udGFpbnM9ZnVuY3Rpb24gY29udGFpbnMoaXRlbSl7dmFyIHN0YXRlPXRoaXMuX2Jhc2VTdGF0ZTtyZXR1cm4gYXNzZXJ0KG51bGw9PT1zdGF0ZS51c2UpLHN0YXRlLmNvbnRhaW5zPWl0ZW0sdGhpc30sTm9kZS5wcm90b3R5cGUuX2RlY29kZT1mdW5jdGlvbiBkZWNvZGUoaW5wdXQsb3B0aW9ucyl7dmFyIHN0YXRlPXRoaXMuX2Jhc2VTdGF0ZTtpZihudWxsPT09c3RhdGUucGFyZW50KXJldHVybiBpbnB1dC53cmFwUmVzdWx0KHN0YXRlLmNoaWxkcmVuWzBdLl9kZWNvZGUoaW5wdXQsb3B0aW9ucykpO3ZhciBwcmV2T2JqLHJlc3VsdD1zdGF0ZS5kZWZhdWx0LHByZXNlbnQ9ITAscHJldktleT1udWxsO2lmKG51bGwhPT1zdGF0ZS5rZXkmJihwcmV2S2V5PWlucHV0LmVudGVyS2V5KHN0YXRlLmtleSkpLHN0YXRlLm9wdGlvbmFsKXt2YXIgdGFnPW51bGw7aWYobnVsbCE9PXN0YXRlLmV4cGxpY2l0P3RhZz1zdGF0ZS5leHBsaWNpdDpudWxsIT09c3RhdGUuaW1wbGljaXQ/dGFnPXN0YXRlLmltcGxpY2l0Om51bGwhPT1zdGF0ZS50YWcmJih0YWc9c3RhdGUudGFnKSxudWxsIT09dGFnfHxzdGF0ZS5hbnkpe2lmKHByZXNlbnQ9dGhpcy5fcGVla1RhZyhpbnB1dCx0YWcsc3RhdGUuYW55KSxpbnB1dC5pc0Vycm9yKHByZXNlbnQpKXJldHVybiBwcmVzZW50fWVsc2V7dmFyIHNhdmU9aW5wdXQuc2F2ZSgpO3RyeXtudWxsPT09c3RhdGUuY2hvaWNlP3RoaXMuX2RlY29kZUdlbmVyaWMoc3RhdGUudGFnLGlucHV0LG9wdGlvbnMpOnRoaXMuX2RlY29kZUNob2ljZShpbnB1dCxvcHRpb25zKSxwcmVzZW50PSEwfWNhdGNoKGUpe3ByZXNlbnQ9ITF9aW5wdXQucmVzdG9yZShzYXZlKX19aWYoc3RhdGUub2JqJiZwcmVzZW50JiYocHJldk9iaj1pbnB1dC5lbnRlck9iamVjdCgpKSxwcmVzZW50KXtpZihudWxsIT09c3RhdGUuZXhwbGljaXQpe3ZhciBleHBsaWNpdD10aGlzLl9kZWNvZGVUYWcoaW5wdXQsc3RhdGUuZXhwbGljaXQpO2lmKGlucHV0LmlzRXJyb3IoZXhwbGljaXQpKXJldHVybiBleHBsaWNpdDtpbnB1dD1leHBsaWNpdH12YXIgc3RhcnQ9aW5wdXQub2Zmc2V0O2lmKG51bGw9PT1zdGF0ZS51c2UmJm51bGw9PT1zdGF0ZS5jaG9pY2Upe2lmKHN0YXRlLmFueSlzYXZlPWlucHV0LnNhdmUoKTt2YXIgYm9keT10aGlzLl9kZWNvZGVUYWcoaW5wdXQsbnVsbCE9PXN0YXRlLmltcGxpY2l0P3N0YXRlLmltcGxpY2l0OnN0YXRlLnRhZyxzdGF0ZS5hbnkpO2lmKGlucHV0LmlzRXJyb3IoYm9keSkpcmV0dXJuIGJvZHk7c3RhdGUuYW55P3Jlc3VsdD1pbnB1dC5yYXcoc2F2ZSk6aW5wdXQ9Ym9keX1pZihvcHRpb25zJiZvcHRpb25zLnRyYWNrJiZudWxsIT09c3RhdGUudGFnJiZvcHRpb25zLnRyYWNrKGlucHV0LnBhdGgoKSxzdGFydCxpbnB1dC5sZW5ndGgsInRhZ2dlZCIpLG9wdGlvbnMmJm9wdGlvbnMudHJhY2smJm51bGwhPT1zdGF0ZS50YWcmJm9wdGlvbnMudHJhY2soaW5wdXQucGF0aCgpLGlucHV0Lm9mZnNldCxpbnB1dC5sZW5ndGgsImNvbnRlbnQiKSxzdGF0ZS5hbnl8fChyZXN1bHQ9bnVsbD09PXN0YXRlLmNob2ljZT90aGlzLl9kZWNvZGVHZW5lcmljKHN0YXRlLnRhZyxpbnB1dCxvcHRpb25zKTp0aGlzLl9kZWNvZGVDaG9pY2UoaW5wdXQsb3B0aW9ucykpLGlucHV0LmlzRXJyb3IocmVzdWx0KSlyZXR1cm4gcmVzdWx0O2lmKHN0YXRlLmFueXx8bnVsbCE9PXN0YXRlLmNob2ljZXx8bnVsbD09PXN0YXRlLmNoaWxkcmVufHxzdGF0ZS5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIGRlY29kZUNoaWxkcmVuKGNoaWxkKXtjaGlsZC5fZGVjb2RlKGlucHV0LG9wdGlvbnMpfSksc3RhdGUuY29udGFpbnMmJigib2N0c3RyIj09PXN0YXRlLnRhZ3x8ImJpdHN0ciI9PT1zdGF0ZS50YWcpKXt2YXIgZGF0YT1uZXcgRGVjb2RlckJ1ZmZlcihyZXN1bHQpO3Jlc3VsdD10aGlzLl9nZXRVc2Uoc3RhdGUuY29udGFpbnMsaW5wdXQuX3JlcG9ydGVyU3RhdGUub2JqKS5fZGVjb2RlKGRhdGEsb3B0aW9ucyl9fXJldHVybiBzdGF0ZS5vYmomJnByZXNlbnQmJihyZXN1bHQ9aW5wdXQubGVhdmVPYmplY3QocHJldk9iaikpLG51bGw9PT1zdGF0ZS5rZXl8fG51bGw9PT1yZXN1bHQmJiEwIT09cHJlc2VudD9udWxsIT09cHJldktleSYmaW5wdXQuZXhpdEtleShwcmV2S2V5KTppbnB1dC5sZWF2ZUtleShwcmV2S2V5LHN0YXRlLmtleSxyZXN1bHQpLHJlc3VsdH0sTm9kZS5wcm90b3R5cGUuX2RlY29kZUdlbmVyaWM9ZnVuY3Rpb24gZGVjb2RlR2VuZXJpYyh0YWcsaW5wdXQsb3B0aW9ucyl7dmFyIHN0YXRlPXRoaXMuX2Jhc2VTdGF0ZTtyZXR1cm4ic2VxIj09PXRhZ3x8InNldCI9PT10YWc/bnVsbDoic2Vxb2YiPT09dGFnfHwic2V0b2YiPT09dGFnP3RoaXMuX2RlY29kZUxpc3QoaW5wdXQsdGFnLHN0YXRlLmFyZ3NbMF0sb3B0aW9ucyk6L3N0ciQvLnRlc3QodGFnKT90aGlzLl9kZWNvZGVTdHIoaW5wdXQsdGFnLG9wdGlvbnMpOiJvYmppZCI9PT10YWcmJnN0YXRlLmFyZ3M/dGhpcy5fZGVjb2RlT2JqaWQoaW5wdXQsc3RhdGUuYXJnc1swXSxzdGF0ZS5hcmdzWzFdLG9wdGlvbnMpOiJvYmppZCI9PT10YWc/dGhpcy5fZGVjb2RlT2JqaWQoaW5wdXQsbnVsbCxudWxsLG9wdGlvbnMpOiJnZW50aW1lIj09PXRhZ3x8InV0Y3RpbWUiPT09dGFnP3RoaXMuX2RlY29kZVRpbWUoaW5wdXQsdGFnLG9wdGlvbnMpOiJudWxsXyI9PT10YWc/dGhpcy5fZGVjb2RlTnVsbChpbnB1dCxvcHRpb25zKToiYm9vbCI9PT10YWc/dGhpcy5fZGVjb2RlQm9vbChpbnB1dCxvcHRpb25zKToib2JqRGVzYyI9PT10YWc/dGhpcy5fZGVjb2RlU3RyKGlucHV0LHRhZyxvcHRpb25zKToiaW50Ij09PXRhZ3x8ImVudW0iPT09dGFnP3RoaXMuX2RlY29kZUludChpbnB1dCxzdGF0ZS5hcmdzJiZzdGF0ZS5hcmdzWzBdLG9wdGlvbnMpOm51bGwhPT1zdGF0ZS51c2U/dGhpcy5fZ2V0VXNlKHN0YXRlLnVzZSxpbnB1dC5fcmVwb3J0ZXJTdGF0ZS5vYmopLl9kZWNvZGUoaW5wdXQsb3B0aW9ucyk6aW5wdXQuZXJyb3IoInVua25vd24gdGFnOiAiK3RhZyl9LE5vZGUucHJvdG90eXBlLl9nZXRVc2U9ZnVuY3Rpb24gX2dldFVzZShlbnRpdHksb2JqKXt2YXIgc3RhdGU9dGhpcy5fYmFzZVN0YXRlO3JldHVybiBzdGF0ZS51c2VEZWNvZGVyPXRoaXMuX3VzZShlbnRpdHksb2JqKSxhc3NlcnQobnVsbD09PXN0YXRlLnVzZURlY29kZXIuX2Jhc2VTdGF0ZS5wYXJlbnQpLHN0YXRlLnVzZURlY29kZXI9c3RhdGUudXNlRGVjb2Rlci5fYmFzZVN0YXRlLmNoaWxkcmVuWzBdLHN0YXRlLmltcGxpY2l0IT09c3RhdGUudXNlRGVjb2Rlci5fYmFzZVN0YXRlLmltcGxpY2l0JiYoc3RhdGUudXNlRGVjb2Rlcj1zdGF0ZS51c2VEZWNvZGVyLmNsb25lKCksc3RhdGUudXNlRGVjb2Rlci5fYmFzZVN0YXRlLmltcGxpY2l0PXN0YXRlLmltcGxpY2l0KSxzdGF0ZS51c2VEZWNvZGVyfSxOb2RlLnByb3RvdHlwZS5fZGVjb2RlQ2hvaWNlPWZ1bmN0aW9uIGRlY29kZUNob2ljZShpbnB1dCxvcHRpb25zKXt2YXIgc3RhdGU9dGhpcy5fYmFzZVN0YXRlLHJlc3VsdD1udWxsLG1hdGNoPSExO3JldHVybiBPYmplY3Qua2V5cyhzdGF0ZS5jaG9pY2UpLnNvbWUoZnVuY3Rpb24oa2V5KXt2YXIgc2F2ZT1pbnB1dC5zYXZlKCksbm9kZT1zdGF0ZS5jaG9pY2Vba2V5XTt0cnl7dmFyIHZhbHVlPW5vZGUuX2RlY29kZShpbnB1dCxvcHRpb25zKTtpZihpbnB1dC5pc0Vycm9yKHZhbHVlKSlyZXR1cm4hMTtyZXN1bHQ9e3R5cGU6a2V5LHZhbHVlfSxtYXRjaD0hMH1jYXRjaChlKXtyZXR1cm4gaW5wdXQucmVzdG9yZShzYXZlKSwhMX1yZXR1cm4hMH0sdGhpcyksbWF0Y2g/cmVzdWx0OmlucHV0LmVycm9yKCJDaG9pY2Ugbm90IG1hdGNoZWQiKX0sTm9kZS5wcm90b3R5cGUuX2NyZWF0ZUVuY29kZXJCdWZmZXI9ZnVuY3Rpb24gY3JlYXRlRW5jb2RlckJ1ZmZlcihkYXRhKXtyZXR1cm4gbmV3IEVuY29kZXJCdWZmZXIoZGF0YSx0aGlzLnJlcG9ydGVyKX0sTm9kZS5wcm90b3R5cGUuX2VuY29kZT1mdW5jdGlvbiBlbmNvZGUoZGF0YSxyZXBvcnRlcixwYXJlbnQpe3ZhciBzdGF0ZT10aGlzLl9iYXNlU3RhdGU7aWYobnVsbD09PXN0YXRlLmRlZmF1bHR8fHN0YXRlLmRlZmF1bHQhPT1kYXRhKXt2YXIgcmVzdWx0PXRoaXMuX2VuY29kZVZhbHVlKGRhdGEscmVwb3J0ZXIscGFyZW50KTtpZih2b2lkIDAhPT1yZXN1bHQmJiF0aGlzLl9za2lwRGVmYXVsdChyZXN1bHQscmVwb3J0ZXIscGFyZW50KSlyZXR1cm4gcmVzdWx0fX0sTm9kZS5wcm90b3R5cGUuX2VuY29kZVZhbHVlPWZ1bmN0aW9uIGVuY29kZShkYXRhLHJlcG9ydGVyLHBhcmVudCl7dmFyIHN0YXRlPXRoaXMuX2Jhc2VTdGF0ZTtpZihudWxsPT09c3RhdGUucGFyZW50KXJldHVybiBzdGF0ZS5jaGlsZHJlblswXS5fZW5jb2RlKGRhdGEscmVwb3J0ZXJ8fG5ldyBSZXBvcnRlcik7dmFyIHJlc3VsdD1udWxsO2lmKHRoaXMucmVwb3J0ZXI9cmVwb3J0ZXIsc3RhdGUub3B0aW9uYWwmJnZvaWQgMD09PWRhdGEpe2lmKG51bGw9PT1zdGF0ZS5kZWZhdWx0KXJldHVybjtkYXRhPXN0YXRlLmRlZmF1bHR9dmFyIGNvbnRlbnQ9bnVsbCxwcmltaXRpdmU9ITE7aWYoc3RhdGUuYW55KXJlc3VsdD10aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKGRhdGEpO2Vsc2UgaWYoc3RhdGUuY2hvaWNlKXJlc3VsdD10aGlzLl9lbmNvZGVDaG9pY2UoZGF0YSxyZXBvcnRlcik7ZWxzZSBpZihzdGF0ZS5jb250YWlucyljb250ZW50PXRoaXMuX2dldFVzZShzdGF0ZS5jb250YWlucyxwYXJlbnQpLl9lbmNvZGUoZGF0YSxyZXBvcnRlcikscHJpbWl0aXZlPSEwO2Vsc2UgaWYoc3RhdGUuY2hpbGRyZW4pY29udGVudD1zdGF0ZS5jaGlsZHJlbi5tYXAoZnVuY3Rpb24oY2hpbGQpe2lmKCJudWxsXyI9PT1jaGlsZC5fYmFzZVN0YXRlLnRhZylyZXR1cm4gY2hpbGQuX2VuY29kZShudWxsLHJlcG9ydGVyLGRhdGEpO2lmKG51bGw9PT1jaGlsZC5fYmFzZVN0YXRlLmtleSlyZXR1cm4gcmVwb3J0ZXIuZXJyb3IoIkNoaWxkIHNob3VsZCBoYXZlIGEga2V5Iik7dmFyIHByZXZLZXk9cmVwb3J0ZXIuZW50ZXJLZXkoY2hpbGQuX2Jhc2VTdGF0ZS5rZXkpO2lmKCJvYmplY3QiIT10eXBlb2YgZGF0YSlyZXR1cm4gcmVwb3J0ZXIuZXJyb3IoIkNoaWxkIGV4cGVjdGVkLCBidXQgaW5wdXQgaXMgbm90IG9iamVjdCIpO3ZhciByZXM9Y2hpbGQuX2VuY29kZShkYXRhW2NoaWxkLl9iYXNlU3RhdGUua2V5XSxyZXBvcnRlcixkYXRhKTtyZXR1cm4gcmVwb3J0ZXIubGVhdmVLZXkocHJldktleSkscmVzfSx0aGlzKS5maWx0ZXIoZnVuY3Rpb24oY2hpbGQpe3JldHVybiBjaGlsZH0pLGNvbnRlbnQ9dGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihjb250ZW50KTtlbHNlIGlmKCJzZXFvZiI9PT1zdGF0ZS50YWd8fCJzZXRvZiI9PT1zdGF0ZS50YWcpe2lmKCFzdGF0ZS5hcmdzfHwxIT09c3RhdGUuYXJncy5sZW5ndGgpcmV0dXJuIHJlcG9ydGVyLmVycm9yKCJUb28gbWFueSBhcmdzIGZvciA6ICIrc3RhdGUudGFnKTtpZighQXJyYXkuaXNBcnJheShkYXRhKSlyZXR1cm4gcmVwb3J0ZXIuZXJyb3IoInNlcW9mL3NldG9mLCBidXQgZGF0YSBpcyBub3QgQXJyYXkiKTt2YXIgY2hpbGQ9dGhpcy5jbG9uZSgpO2NoaWxkLl9iYXNlU3RhdGUuaW1wbGljaXQ9bnVsbCxjb250ZW50PXRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoZGF0YS5tYXAoZnVuY3Rpb24oaXRlbSl7dmFyIHN0YXRlPXRoaXMuX2Jhc2VTdGF0ZTtyZXR1cm4gdGhpcy5fZ2V0VXNlKHN0YXRlLmFyZ3NbMF0sZGF0YSkuX2VuY29kZShpdGVtLHJlcG9ydGVyKX0sY2hpbGQpKX1lbHNlIG51bGwhPT1zdGF0ZS51c2U/cmVzdWx0PXRoaXMuX2dldFVzZShzdGF0ZS51c2UscGFyZW50KS5fZW5jb2RlKGRhdGEscmVwb3J0ZXIpOihjb250ZW50PXRoaXMuX2VuY29kZVByaW1pdGl2ZShzdGF0ZS50YWcsZGF0YSkscHJpbWl0aXZlPSEwKTtpZighc3RhdGUuYW55JiZudWxsPT09c3RhdGUuY2hvaWNlKXt2YXIgdGFnPW51bGwhPT1zdGF0ZS5pbXBsaWNpdD9zdGF0ZS5pbXBsaWNpdDpzdGF0ZS50YWcsY2xzPW51bGw9PT1zdGF0ZS5pbXBsaWNpdD8idW5pdmVyc2FsIjoiY29udGV4dCI7bnVsbD09PXRhZz9udWxsPT09c3RhdGUudXNlJiZyZXBvcnRlci5lcnJvcigiVGFnIGNvdWxkIGJlIG9taXR0ZWQgb25seSBmb3IgLnVzZSgpIik6bnVsbD09PXN0YXRlLnVzZSYmKHJlc3VsdD10aGlzLl9lbmNvZGVDb21wb3NpdGUodGFnLHByaW1pdGl2ZSxjbHMsY29udGVudCkpfXJldHVybiBudWxsIT09c3RhdGUuZXhwbGljaXQmJihyZXN1bHQ9dGhpcy5fZW5jb2RlQ29tcG9zaXRlKHN0YXRlLmV4cGxpY2l0LCExLCJjb250ZXh0IixyZXN1bHQpKSxyZXN1bHR9LE5vZGUucHJvdG90eXBlLl9lbmNvZGVDaG9pY2U9ZnVuY3Rpb24gZW5jb2RlQ2hvaWNlKGRhdGEscmVwb3J0ZXIpe3ZhciBzdGF0ZT10aGlzLl9iYXNlU3RhdGUsbm9kZT1zdGF0ZS5jaG9pY2VbZGF0YS50eXBlXTtyZXR1cm4gbm9kZXx8YXNzZXJ0KCExLGRhdGEudHlwZSsiIG5vdCBmb3VuZCBpbiAiK0pTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKHN0YXRlLmNob2ljZSkpKSxub2RlLl9lbmNvZGUoZGF0YS52YWx1ZSxyZXBvcnRlcil9LE5vZGUucHJvdG90eXBlLl9lbmNvZGVQcmltaXRpdmU9ZnVuY3Rpb24gZW5jb2RlUHJpbWl0aXZlKHRhZyxkYXRhKXt2YXIgc3RhdGU9dGhpcy5fYmFzZVN0YXRlO2lmKC9zdHIkLy50ZXN0KHRhZykpcmV0dXJuIHRoaXMuX2VuY29kZVN0cihkYXRhLHRhZyk7aWYoIm9iamlkIj09PXRhZyYmc3RhdGUuYXJncylyZXR1cm4gdGhpcy5fZW5jb2RlT2JqaWQoZGF0YSxzdGF0ZS5yZXZlcnNlQXJnc1swXSxzdGF0ZS5hcmdzWzFdKTtpZigib2JqaWQiPT09dGFnKXJldHVybiB0aGlzLl9lbmNvZGVPYmppZChkYXRhLG51bGwsbnVsbCk7aWYoImdlbnRpbWUiPT09dGFnfHwidXRjdGltZSI9PT10YWcpcmV0dXJuIHRoaXMuX2VuY29kZVRpbWUoZGF0YSx0YWcpO2lmKCJudWxsXyI9PT10YWcpcmV0dXJuIHRoaXMuX2VuY29kZU51bGwoKTtpZigiaW50Ij09PXRhZ3x8ImVudW0iPT09dGFnKXJldHVybiB0aGlzLl9lbmNvZGVJbnQoZGF0YSxzdGF0ZS5hcmdzJiZzdGF0ZS5yZXZlcnNlQXJnc1swXSk7aWYoImJvb2wiPT09dGFnKXJldHVybiB0aGlzLl9lbmNvZGVCb29sKGRhdGEpO2lmKCJvYmpEZXNjIj09PXRhZylyZXR1cm4gdGhpcy5fZW5jb2RlU3RyKGRhdGEsdGFnKTt0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIHRhZzogIit0YWcpfSxOb2RlLnByb3RvdHlwZS5faXNOdW1zdHI9ZnVuY3Rpb24gaXNOdW1zdHIoc3RyKXtyZXR1cm4vXlswLTkgXSokLy50ZXN0KHN0cil9LE5vZGUucHJvdG90eXBlLl9pc1ByaW50c3RyPWZ1bmN0aW9uIGlzUHJpbnRzdHIoc3RyKXtyZXR1cm4vXltBLVphLXowLTkgJ1woXClcKyxcLVwuXC86PVw/XSokLy50ZXN0KHN0cil9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2FzbjEuanMvbGliL2FzbjEvYmFzZS9yZXBvcnRlci5qcyIoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXt2YXIgaW5oZXJpdHM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiKTtmdW5jdGlvbiBSZXBvcnRlcihvcHRpb25zKXt0aGlzLl9yZXBvcnRlclN0YXRlPXtvYmo6bnVsbCxwYXRoOltdLG9wdGlvbnM6b3B0aW9uc3x8e30sZXJyb3JzOltdfX1mdW5jdGlvbiBSZXBvcnRlckVycm9yKHBhdGgsbXNnKXt0aGlzLnBhdGg9cGF0aCx0aGlzLnJldGhyb3cobXNnKX1leHBvcnRzLmE9UmVwb3J0ZXIsUmVwb3J0ZXIucHJvdG90eXBlLmlzRXJyb3I9ZnVuY3Rpb24gaXNFcnJvcihvYmope3JldHVybiBvYmogaW5zdGFuY2VvZiBSZXBvcnRlckVycm9yfSxSZXBvcnRlci5wcm90b3R5cGUuc2F2ZT1mdW5jdGlvbiBzYXZlKCl7dmFyIHN0YXRlPXRoaXMuX3JlcG9ydGVyU3RhdGU7cmV0dXJue29iajpzdGF0ZS5vYmoscGF0aExlbjpzdGF0ZS5wYXRoLmxlbmd0aH19LFJlcG9ydGVyLnByb3RvdHlwZS5yZXN0b3JlPWZ1bmN0aW9uIHJlc3RvcmUoZGF0YSl7dmFyIHN0YXRlPXRoaXMuX3JlcG9ydGVyU3RhdGU7c3RhdGUub2JqPWRhdGEub2JqLHN0YXRlLnBhdGg9c3RhdGUucGF0aC5zbGljZSgwLGRhdGEucGF0aExlbil9LFJlcG9ydGVyLnByb3RvdHlwZS5lbnRlcktleT1mdW5jdGlvbiBlbnRlcktleShrZXkpe3JldHVybiB0aGlzLl9yZXBvcnRlclN0YXRlLnBhdGgucHVzaChrZXkpfSxSZXBvcnRlci5wcm90b3R5cGUuZXhpdEtleT1mdW5jdGlvbiBleGl0S2V5KGluZGV4KXt2YXIgc3RhdGU9dGhpcy5fcmVwb3J0ZXJTdGF0ZTtzdGF0ZS5wYXRoPXN0YXRlLnBhdGguc2xpY2UoMCxpbmRleC0xKX0sUmVwb3J0ZXIucHJvdG90eXBlLmxlYXZlS2V5PWZ1bmN0aW9uIGxlYXZlS2V5KGluZGV4LGtleSx2YWx1ZSl7dmFyIHN0YXRlPXRoaXMuX3JlcG9ydGVyU3RhdGU7dGhpcy5leGl0S2V5KGluZGV4KSxudWxsIT09c3RhdGUub2JqJiYoc3RhdGUub2JqW2tleV09dmFsdWUpfSxSZXBvcnRlci5wcm90b3R5cGUucGF0aD1mdW5jdGlvbiBwYXRoKCl7cmV0dXJuIHRoaXMuX3JlcG9ydGVyU3RhdGUucGF0aC5qb2luKCIvIil9LFJlcG9ydGVyLnByb3RvdHlwZS5lbnRlck9iamVjdD1mdW5jdGlvbiBlbnRlck9iamVjdCgpe3ZhciBzdGF0ZT10aGlzLl9yZXBvcnRlclN0YXRlLHByZXY9c3RhdGUub2JqO3JldHVybiBzdGF0ZS5vYmo9e30scHJldn0sUmVwb3J0ZXIucHJvdG90eXBlLmxlYXZlT2JqZWN0PWZ1bmN0aW9uIGxlYXZlT2JqZWN0KHByZXYpe3ZhciBzdGF0ZT10aGlzLl9yZXBvcnRlclN0YXRlLG5vdz1zdGF0ZS5vYmo7cmV0dXJuIHN0YXRlLm9iaj1wcmV2LG5vd30sUmVwb3J0ZXIucHJvdG90eXBlLmVycm9yPWZ1bmN0aW9uIGVycm9yKG1zZyl7dmFyIGVycixzdGF0ZT10aGlzLl9yZXBvcnRlclN0YXRlLGluaGVyaXRlZD1tc2cgaW5zdGFuY2VvZiBSZXBvcnRlckVycm9yO2lmKGVycj1pbmhlcml0ZWQ/bXNnOm5ldyBSZXBvcnRlckVycm9yKHN0YXRlLnBhdGgubWFwKGZ1bmN0aW9uKGVsZW0pe3JldHVybiJbIitKU09OLnN0cmluZ2lmeShlbGVtKSsiXSJ9KS5qb2luKCIiKSxtc2cubWVzc2FnZXx8bXNnLG1zZy5zdGFjayksIXN0YXRlLm9wdGlvbnMucGFydGlhbCl0aHJvdyBlcnI7cmV0dXJuIGluaGVyaXRlZHx8c3RhdGUuZXJyb3JzLnB1c2goZXJyKSxlcnJ9LFJlcG9ydGVyLnByb3RvdHlwZS53cmFwUmVzdWx0PWZ1bmN0aW9uIHdyYXBSZXN1bHQocmVzdWx0KXt2YXIgc3RhdGU9dGhpcy5fcmVwb3J0ZXJTdGF0ZTtyZXR1cm4gc3RhdGUub3B0aW9ucy5wYXJ0aWFsP3tyZXN1bHQ6dGhpcy5pc0Vycm9yKHJlc3VsdCk/bnVsbDpyZXN1bHQsZXJyb3JzOnN0YXRlLmVycm9yc306cmVzdWx0fSxpbmhlcml0cyhSZXBvcnRlckVycm9yLEVycm9yKSxSZXBvcnRlckVycm9yLnByb3RvdHlwZS5yZXRocm93PWZ1bmN0aW9uIHJldGhyb3cobXNnKXtpZih0aGlzLm1lc3NhZ2U9bXNnKyIgYXQ6ICIrKHRoaXMucGF0aHx8IihzaGFsbG93KSIpLEVycm9yLmNhcHR1cmVTdGFja1RyYWNlJiZFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLFJlcG9ydGVyRXJyb3IpLCF0aGlzLnN0YWNrKXRyeXt0aHJvdyBuZXcgRXJyb3IodGhpcy5tZXNzYWdlKX1jYXRjaChlKXt0aGlzLnN0YWNrPWUuc3RhY2t9cmV0dXJuIHRoaXN9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2FzbjEuanMvbGliL2FzbjEvY29uc3RhbnRzL2Rlci5qcyIoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXt2YXIgY29uc3RhbnRzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9hc24xLmpzL2xpYi9hc24xL2NvbnN0YW50cy9pbmRleC5qcyIpO2V4cG9ydHMudGFnQ2xhc3M9ezA6InVuaXZlcnNhbCIsMToiYXBwbGljYXRpb24iLDI6ImNvbnRleHQiLDM6InByaXZhdGUifSxleHBvcnRzLnRhZ0NsYXNzQnlOYW1lPWNvbnN0YW50cy5fcmV2ZXJzZShleHBvcnRzLnRhZ0NsYXNzKSxleHBvcnRzLnRhZz17MDoiZW5kIiwxOiJib29sIiwyOiJpbnQiLDM6ImJpdHN0ciIsNDoib2N0c3RyIiw1OiJudWxsXyIsNjoib2JqaWQiLDc6Im9iakRlc2MiLDg6ImV4dGVybmFsIiw5OiJyZWFsIiwxMDoiZW51bSIsMTE6ImVtYmVkIiwxMjoidXRmOHN0ciIsMTM6InJlbGF0aXZlT2lkIiwxNjoic2VxIiwxNzoic2V0IiwxODoibnVtc3RyIiwxOToicHJpbnRzdHIiLDIwOiJ0NjFzdHIiLDIxOiJ2aWRlb3N0ciIsMjI6ImlhNXN0ciIsMjM6InV0Y3RpbWUiLDI0OiJnZW50aW1lIiwyNToiZ3JhcGhzdHIiLDI2OiJpc282NDZzdHIiLDI3OiJnZW5zdHIiLDI4OiJ1bmlzdHIiLDI5OiJjaGFyc3RyIiwzMDoiYm1wc3RyIn0sZXhwb3J0cy50YWdCeU5hbWU9Y29uc3RhbnRzLl9yZXZlcnNlKGV4cG9ydHMudGFnKX0sIi4uLy4uL25vZGVfbW9kdWxlcy9hc24xLmpzL2xpYi9hc24xL2NvbnN0YW50cy9pbmRleC5qcyIoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXt2YXIgY29uc3RhbnRzPWV4cG9ydHM7Y29uc3RhbnRzLl9yZXZlcnNlPWZ1bmN0aW9uIHJldmVyc2UobWFwKXt2YXIgcmVzPXt9O3JldHVybiBPYmplY3Qua2V5cyhtYXApLmZvckVhY2goZnVuY3Rpb24oa2V5KXsoMHxrZXkpPT1rZXkmJihrZXl8PTApO3ZhciB2YWx1ZT1tYXBba2V5XTtyZXNbdmFsdWVdPWtleX0pLHJlc30sY29uc3RhbnRzLmRlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYXNuMS5qcy9saWIvYXNuMS9jb25zdGFudHMvZGVyLmpzIil9LCIuLi8uLi9ub2RlX21vZHVsZXMvYXNuMS5qcy9saWIvYXNuMS9kZWNvZGVycy9kZXIuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7dmFyIGluaGVyaXRzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiksYXNuMT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYXNuMS5qcy9saWIvYXNuMS5qcyIpLGJhc2U9YXNuMS5iYXNlLGJpZ251bT1hc24xLmJpZ251bSxkZXI9YXNuMS5jb25zdGFudHMuZGVyO2Z1bmN0aW9uIERFUkRlY29kZXIoZW50aXR5KXt0aGlzLmVuYz0iZGVyIix0aGlzLm5hbWU9ZW50aXR5Lm5hbWUsdGhpcy5lbnRpdHk9ZW50aXR5LHRoaXMudHJlZT1uZXcgREVSTm9kZSx0aGlzLnRyZWUuX2luaXQoZW50aXR5LmJvZHkpfWZ1bmN0aW9uIERFUk5vZGUocGFyZW50KXtiYXNlLk5vZGUuY2FsbCh0aGlzLCJkZXIiLHBhcmVudCl9ZnVuY3Rpb24gZGVyRGVjb2RlVGFnKGJ1ZixmYWlsKXt2YXIgdGFnPWJ1Zi5yZWFkVUludDgoZmFpbCk7aWYoYnVmLmlzRXJyb3IodGFnKSlyZXR1cm4gdGFnO3ZhciBjbHM9ZGVyLnRhZ0NsYXNzW3RhZz4+Nl0scHJpbWl0aXZlPSEoMzImdGFnKTtpZigzMSZ+dGFnKXRhZyY9MzE7ZWxzZXt2YXIgb2N0PXRhZztmb3IodGFnPTA7ISgxMjgmfm9jdCk7KXtpZihvY3Q9YnVmLnJlYWRVSW50OChmYWlsKSxidWYuaXNFcnJvcihvY3QpKXJldHVybiBvY3Q7dGFnPDw9Nyx0YWd8PTEyNyZvY3R9fXJldHVybntjbHMscHJpbWl0aXZlLHRhZyx0YWdTdHI6ZGVyLnRhZ1t0YWddfX1mdW5jdGlvbiBkZXJEZWNvZGVMZW4oYnVmLHByaW1pdGl2ZSxmYWlsKXt2YXIgbGVuPWJ1Zi5yZWFkVUludDgoZmFpbCk7aWYoYnVmLmlzRXJyb3IobGVuKSlyZXR1cm4gbGVuO2lmKCFwcmltaXRpdmUmJjEyOD09PWxlbilyZXR1cm4gbnVsbDtpZighKDEyOCZsZW4pKXJldHVybiBsZW47dmFyIG51bT0xMjcmbGVuO2lmKG51bT40KXJldHVybiBidWYuZXJyb3IoImxlbmd0aCBvY3RlY3QgaXMgdG9vIGxvbmciKTtsZW49MDtmb3IodmFyIGk9MDtpPG51bTtpKyspe2xlbjw8PTg7dmFyIGo9YnVmLnJlYWRVSW50OChmYWlsKTtpZihidWYuaXNFcnJvcihqKSlyZXR1cm4gajtsZW58PWp9cmV0dXJuIGxlbn1tb2R1bGUuZXhwb3J0cz1ERVJEZWNvZGVyLERFUkRlY29kZXIucHJvdG90eXBlLmRlY29kZT1mdW5jdGlvbiBkZWNvZGUoZGF0YSxvcHRpb25zKXtyZXR1cm4gZGF0YSBpbnN0YW5jZW9mIGJhc2UuRGVjb2RlckJ1ZmZlcnx8KGRhdGE9bmV3IGJhc2UuRGVjb2RlckJ1ZmZlcihkYXRhLG9wdGlvbnMpKSx0aGlzLnRyZWUuX2RlY29kZShkYXRhLG9wdGlvbnMpfSxpbmhlcml0cyhERVJOb2RlLGJhc2UuTm9kZSksREVSTm9kZS5wcm90b3R5cGUuX3BlZWtUYWc9ZnVuY3Rpb24gcGVla1RhZyhidWZmZXIsdGFnLGFueSl7aWYoYnVmZmVyLmlzRW1wdHkoKSlyZXR1cm4hMTt2YXIgc3RhdGU9YnVmZmVyLnNhdmUoKSxkZWNvZGVkVGFnPWRlckRlY29kZVRhZyhidWZmZXIsJ0ZhaWxlZCB0byBwZWVrIHRhZzogIicrdGFnKyciJyk7cmV0dXJuIGJ1ZmZlci5pc0Vycm9yKGRlY29kZWRUYWcpP2RlY29kZWRUYWc6KGJ1ZmZlci5yZXN0b3JlKHN0YXRlKSxkZWNvZGVkVGFnLnRhZz09PXRhZ3x8ZGVjb2RlZFRhZy50YWdTdHI9PT10YWd8fGRlY29kZWRUYWcudGFnU3RyKyJvZiI9PT10YWd8fGFueSl9LERFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVUYWc9ZnVuY3Rpb24gZGVjb2RlVGFnKGJ1ZmZlcix0YWcsYW55KXt2YXIgZGVjb2RlZFRhZz1kZXJEZWNvZGVUYWcoYnVmZmVyLCdGYWlsZWQgdG8gZGVjb2RlIHRhZyBvZiAiJyt0YWcrJyInKTtpZihidWZmZXIuaXNFcnJvcihkZWNvZGVkVGFnKSlyZXR1cm4gZGVjb2RlZFRhZzt2YXIgbGVuPWRlckRlY29kZUxlbihidWZmZXIsZGVjb2RlZFRhZy5wcmltaXRpdmUsJ0ZhaWxlZCB0byBnZXQgbGVuZ3RoIG9mICInK3RhZysnIicpO2lmKGJ1ZmZlci5pc0Vycm9yKGxlbikpcmV0dXJuIGxlbjtpZighYW55JiZkZWNvZGVkVGFnLnRhZyE9PXRhZyYmZGVjb2RlZFRhZy50YWdTdHIhPT10YWcmJmRlY29kZWRUYWcudGFnU3RyKyJvZiIhPT10YWcpcmV0dXJuIGJ1ZmZlci5lcnJvcignRmFpbGVkIHRvIG1hdGNoIHRhZzogIicrdGFnKyciJyk7aWYoZGVjb2RlZFRhZy5wcmltaXRpdmV8fG51bGwhPT1sZW4pcmV0dXJuIGJ1ZmZlci5za2lwKGxlbiwnRmFpbGVkIHRvIG1hdGNoIGJvZHkgb2Y6ICInK3RhZysnIicpO3ZhciBzdGF0ZT1idWZmZXIuc2F2ZSgpLHJlcz10aGlzLl9za2lwVW50aWxFbmQoYnVmZmVyLCdGYWlsZWQgdG8gc2tpcCBpbmRlZmluaXRlIGxlbmd0aCBib2R5OiAiJyt0aGlzLnRhZysnIicpO3JldHVybiBidWZmZXIuaXNFcnJvcihyZXMpP3JlczoobGVuPWJ1ZmZlci5vZmZzZXQtc3RhdGUub2Zmc2V0LGJ1ZmZlci5yZXN0b3JlKHN0YXRlKSxidWZmZXIuc2tpcChsZW4sJ0ZhaWxlZCB0byBtYXRjaCBib2R5IG9mOiAiJyt0YWcrJyInKSl9LERFUk5vZGUucHJvdG90eXBlLl9za2lwVW50aWxFbmQ9ZnVuY3Rpb24gc2tpcFVudGlsRW5kKGJ1ZmZlcixmYWlsKXtmb3IoOzspe3ZhciB0YWc9ZGVyRGVjb2RlVGFnKGJ1ZmZlcixmYWlsKTtpZihidWZmZXIuaXNFcnJvcih0YWcpKXJldHVybiB0YWc7dmFyIHJlcyxsZW49ZGVyRGVjb2RlTGVuKGJ1ZmZlcix0YWcucHJpbWl0aXZlLGZhaWwpO2lmKGJ1ZmZlci5pc0Vycm9yKGxlbikpcmV0dXJuIGxlbjtpZihyZXM9dGFnLnByaW1pdGl2ZXx8bnVsbCE9PWxlbj9idWZmZXIuc2tpcChsZW4pOnRoaXMuX3NraXBVbnRpbEVuZChidWZmZXIsZmFpbCksYnVmZmVyLmlzRXJyb3IocmVzKSlyZXR1cm4gcmVzO2lmKCJlbmQiPT09dGFnLnRhZ1N0cilicmVha319LERFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVMaXN0PWZ1bmN0aW9uIGRlY29kZUxpc3QoYnVmZmVyLHRhZyxkZWNvZGVyLG9wdGlvbnMpe2Zvcih2YXIgcmVzdWx0PVtdOyFidWZmZXIuaXNFbXB0eSgpOyl7dmFyIHBvc3NpYmxlRW5kPXRoaXMuX3BlZWtUYWcoYnVmZmVyLCJlbmQiKTtpZihidWZmZXIuaXNFcnJvcihwb3NzaWJsZUVuZCkpcmV0dXJuIHBvc3NpYmxlRW5kO3ZhciByZXM9ZGVjb2Rlci5kZWNvZGUoYnVmZmVyLCJkZXIiLG9wdGlvbnMpO2lmKGJ1ZmZlci5pc0Vycm9yKHJlcykmJnBvc3NpYmxlRW5kKWJyZWFrO3Jlc3VsdC5wdXNoKHJlcyl9cmV0dXJuIHJlc3VsdH0sREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZVN0cj1mdW5jdGlvbiBkZWNvZGVTdHIoYnVmZmVyLHRhZyl7aWYoImJpdHN0ciI9PT10YWcpe3ZhciB1bnVzZWQ9YnVmZmVyLnJlYWRVSW50OCgpO3JldHVybiBidWZmZXIuaXNFcnJvcih1bnVzZWQpP3VudXNlZDp7dW51c2VkLGRhdGE6YnVmZmVyLnJhdygpfX1pZigiYm1wc3RyIj09PXRhZyl7dmFyIHJhdz1idWZmZXIucmF3KCk7aWYocmF3Lmxlbmd0aCUyPT0xKXJldHVybiBidWZmZXIuZXJyb3IoIkRlY29kaW5nIG9mIHN0cmluZyB0eXBlOiBibXBzdHIgbGVuZ3RoIG1pc21hdGNoIik7Zm9yKHZhciBzdHI9IiIsaT0wO2k8cmF3Lmxlbmd0aC8yO2krKylzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUocmF3LnJlYWRVSW50MTZCRSgyKmkpKTtyZXR1cm4gc3RyfWlmKCJudW1zdHIiPT09dGFnKXt2YXIgbnVtc3RyPWJ1ZmZlci5yYXcoKS50b1N0cmluZygiYXNjaWkiKTtyZXR1cm4gdGhpcy5faXNOdW1zdHIobnVtc3RyKT9udW1zdHI6YnVmZmVyLmVycm9yKCJEZWNvZGluZyBvZiBzdHJpbmcgdHlwZTogbnVtc3RyIHVuc3VwcG9ydGVkIGNoYXJhY3RlcnMiKX1pZigib2N0c3RyIj09PXRhZylyZXR1cm4gYnVmZmVyLnJhdygpO2lmKCJvYmpEZXNjIj09PXRhZylyZXR1cm4gYnVmZmVyLnJhdygpO2lmKCJwcmludHN0ciI9PT10YWcpe3ZhciBwcmludHN0cj1idWZmZXIucmF3KCkudG9TdHJpbmcoImFzY2lpIik7cmV0dXJuIHRoaXMuX2lzUHJpbnRzdHIocHJpbnRzdHIpP3ByaW50c3RyOmJ1ZmZlci5lcnJvcigiRGVjb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6IHByaW50c3RyIHVuc3VwcG9ydGVkIGNoYXJhY3RlcnMiKX1yZXR1cm4vc3RyJC8udGVzdCh0YWcpP2J1ZmZlci5yYXcoKS50b1N0cmluZygpOmJ1ZmZlci5lcnJvcigiRGVjb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6ICIrdGFnKyIgdW5zdXBwb3J0ZWQiKX0sREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZU9iamlkPWZ1bmN0aW9uIGRlY29kZU9iamlkKGJ1ZmZlcix2YWx1ZXMscmVsYXRpdmUpe2Zvcih2YXIgcmVzdWx0LGlkZW50aWZpZXJzPVtdLGlkZW50PTA7IWJ1ZmZlci5pc0VtcHR5KCk7KXt2YXIgc3ViaWRlbnQ9YnVmZmVyLnJlYWRVSW50OCgpO2lkZW50PDw9NyxpZGVudHw9MTI3JnN1YmlkZW50LDEyOCZzdWJpZGVudHx8KGlkZW50aWZpZXJzLnB1c2goaWRlbnQpLGlkZW50PTApfTEyOCZzdWJpZGVudCYmaWRlbnRpZmllcnMucHVzaChpZGVudCk7dmFyIGZpcnN0PWlkZW50aWZpZXJzWzBdLzQwfDAsc2Vjb25kPWlkZW50aWZpZXJzWzBdJTQwO2lmKHJlc3VsdD1yZWxhdGl2ZT9pZGVudGlmaWVyczpbZmlyc3Qsc2Vjb25kXS5jb25jYXQoaWRlbnRpZmllcnMuc2xpY2UoMSkpLHZhbHVlcyl7dmFyIHRtcD12YWx1ZXNbcmVzdWx0LmpvaW4oIiAiKV07dm9pZCAwPT09dG1wJiYodG1wPXZhbHVlc1tyZXN1bHQuam9pbigiLiIpXSksdm9pZCAwIT09dG1wJiYocmVzdWx0PXRtcCl9cmV0dXJuIHJlc3VsdH0sREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZVRpbWU9ZnVuY3Rpb24gZGVjb2RlVGltZShidWZmZXIsdGFnKXt2YXIgc3RyPWJ1ZmZlci5yYXcoKS50b1N0cmluZygpO2lmKCJnZW50aW1lIj09PXRhZyl2YXIgeWVhcj0wfHN0ci5zbGljZSgwLDQpLG1vbj0wfHN0ci5zbGljZSg0LDYpLGRheT0wfHN0ci5zbGljZSg2LDgpLGhvdXI9MHxzdHIuc2xpY2UoOCwxMCksbWluPTB8c3RyLnNsaWNlKDEwLDEyKSxzZWM9MHxzdHIuc2xpY2UoMTIsMTQpO2Vsc2V7aWYoInV0Y3RpbWUiIT09dGFnKXJldHVybiBidWZmZXIuZXJyb3IoIkRlY29kaW5nICIrdGFnKyIgdGltZSBpcyBub3Qgc3VwcG9ydGVkIHlldCIpO3llYXI9MHxzdHIuc2xpY2UoMCwyKSxtb249MHxzdHIuc2xpY2UoMiw0KSxkYXk9MHxzdHIuc2xpY2UoNCw2KSxob3VyPTB8c3RyLnNsaWNlKDYsOCksbWluPTB8c3RyLnNsaWNlKDgsMTApLHNlYz0wfHN0ci5zbGljZSgxMCwxMik7eWVhcj15ZWFyPDcwPzJlMyt5ZWFyOjE5MDAreWVhcn1yZXR1cm4gRGF0ZS5VVEMoeWVhcixtb24tMSxkYXksaG91cixtaW4sc2VjLDApfSxERVJOb2RlLnByb3RvdHlwZS5fZGVjb2RlTnVsbD1mdW5jdGlvbiBkZWNvZGVOdWxsKGJ1ZmZlcil7cmV0dXJuIG51bGx9LERFUk5vZGUucHJvdG90eXBlLl9kZWNvZGVCb29sPWZ1bmN0aW9uIGRlY29kZUJvb2woYnVmZmVyKXt2YXIgcmVzPWJ1ZmZlci5yZWFkVUludDgoKTtyZXR1cm4gYnVmZmVyLmlzRXJyb3IocmVzKT9yZXM6MCE9PXJlc30sREVSTm9kZS5wcm90b3R5cGUuX2RlY29kZUludD1mdW5jdGlvbiBkZWNvZGVJbnQoYnVmZmVyLHZhbHVlcyl7dmFyIHJhdz1idWZmZXIucmF3KCkscmVzPW5ldyBiaWdudW0ocmF3KTtyZXR1cm4gdmFsdWVzJiYocmVzPXZhbHVlc1tyZXMudG9TdHJpbmcoMTApXXx8cmVzKSxyZXN9LERFUk5vZGUucHJvdG90eXBlLl91c2U9ZnVuY3Rpb24gdXNlKGVudGl0eSxvYmope3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlbnRpdHkmJihlbnRpdHk9ZW50aXR5KG9iaikpLGVudGl0eS5fZ2V0RGVjb2RlcigiZGVyIikudHJlZX19LCIuLi8uLi9ub2RlX21vZHVsZXMvYXNuMS5qcy9saWIvYXNuMS9kZWNvZGVycy9pbmRleC5qcyIoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXt2YXIgZGVjb2RlcnM9ZXhwb3J0cztkZWNvZGVycy5kZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2FzbjEuanMvbGliL2FzbjEvZGVjb2RlcnMvZGVyLmpzIiksZGVjb2RlcnMucGVtPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9hc24xLmpzL2xpYi9hc24xL2RlY29kZXJzL3BlbS5qcyIpfSwiLi4vLi4vbm9kZV9tb2R1bGVzL2FzbjEuanMvbGliL2FzbjEvZGVjb2RlcnMvcGVtLmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pe3ZhciBpbmhlcml0cz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIpLEJ1ZmZlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzIikuQnVmZmVyLERFUkRlY29kZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2FzbjEuanMvbGliL2FzbjEvZGVjb2RlcnMvZGVyLmpzIik7ZnVuY3Rpb24gUEVNRGVjb2RlcihlbnRpdHkpe0RFUkRlY29kZXIuY2FsbCh0aGlzLGVudGl0eSksdGhpcy5lbmM9InBlbSJ9aW5oZXJpdHMoUEVNRGVjb2RlcixERVJEZWNvZGVyKSxtb2R1bGUuZXhwb3J0cz1QRU1EZWNvZGVyLFBFTURlY29kZXIucHJvdG90eXBlLmRlY29kZT1mdW5jdGlvbiBkZWNvZGUoZGF0YSxvcHRpb25zKXtmb3IodmFyIGxpbmVzPWRhdGEudG9TdHJpbmcoKS5zcGxpdCgvW1xyXG5dKy9nKSxsYWJlbD1vcHRpb25zLmxhYmVsLnRvVXBwZXJDYXNlKCkscmU9L14tLS0tLShCRUdJTnxFTkQpIChbXi1dKyktLS0tLSQvLHN0YXJ0PS0xLGVuZD0tMSxpPTA7aTxsaW5lcy5sZW5ndGg7aSsrKXt2YXIgbWF0Y2g9bGluZXNbaV0ubWF0Y2gocmUpO2lmKG51bGwhPT1tYXRjaCYmbWF0Y2hbMl09PT1sYWJlbCl7aWYoLTEhPT1zdGFydCl7aWYoIkVORCIhPT1tYXRjaFsxXSlicmVhaztlbmQ9aTticmVha31pZigiQkVHSU4iIT09bWF0Y2hbMV0pYnJlYWs7c3RhcnQ9aX19aWYoLTE9PT1zdGFydHx8LTE9PT1lbmQpdGhyb3cgbmV3IEVycm9yKCJQRU0gc2VjdGlvbiBub3QgZm91bmQgZm9yOiAiK2xhYmVsKTt2YXIgYmFzZTY0PWxpbmVzLnNsaWNlKHN0YXJ0KzEsZW5kKS5qb2luKCIiKTtiYXNlNjQucmVwbGFjZSgvW15hLXowLTlcK1wvPV0rL2dpLCIiKTt2YXIgaW5wdXQ9bmV3IEJ1ZmZlcihiYXNlNjQsImJhc2U2NCIpO3JldHVybiBERVJEZWNvZGVyLnByb3RvdHlwZS5kZWNvZGUuY2FsbCh0aGlzLGlucHV0LG9wdGlvbnMpfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9hc24xLmpzL2xpYi9hc24xL2VuY29kZXJzL2Rlci5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXt2YXIgaW5oZXJpdHM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiKSxCdWZmZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyIpLkJ1ZmZlcixhc24xPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9hc24xLmpzL2xpYi9hc24xLmpzIiksYmFzZT1hc24xLmJhc2UsZGVyPWFzbjEuY29uc3RhbnRzLmRlcjtmdW5jdGlvbiBERVJFbmNvZGVyKGVudGl0eSl7dGhpcy5lbmM9ImRlciIsdGhpcy5uYW1lPWVudGl0eS5uYW1lLHRoaXMuZW50aXR5PWVudGl0eSx0aGlzLnRyZWU9bmV3IERFUk5vZGUsdGhpcy50cmVlLl9pbml0KGVudGl0eS5ib2R5KX1mdW5jdGlvbiBERVJOb2RlKHBhcmVudCl7YmFzZS5Ob2RlLmNhbGwodGhpcywiZGVyIixwYXJlbnQpfWZ1bmN0aW9uIHR3byhudW0pe3JldHVybiBudW08MTA/IjAiK251bTpudW19bW9kdWxlLmV4cG9ydHM9REVSRW5jb2RlcixERVJFbmNvZGVyLnByb3RvdHlwZS5lbmNvZGU9ZnVuY3Rpb24gZW5jb2RlKGRhdGEscmVwb3J0ZXIpe3JldHVybiB0aGlzLnRyZWUuX2VuY29kZShkYXRhLHJlcG9ydGVyKS5qb2luKCl9LGluaGVyaXRzKERFUk5vZGUsYmFzZS5Ob2RlKSxERVJOb2RlLnByb3RvdHlwZS5fZW5jb2RlQ29tcG9zaXRlPWZ1bmN0aW9uIGVuY29kZUNvbXBvc2l0ZSh0YWcscHJpbWl0aXZlLGNscyxjb250ZW50KXt2YXIgaGVhZGVyLGVuY29kZWRUYWc9ZnVuY3Rpb24gZW5jb2RlVGFnKHRhZyxwcmltaXRpdmUsY2xzLHJlcG9ydGVyKXt2YXIgcmVzOyJzZXFvZiI9PT10YWc/dGFnPSJzZXEiOiJzZXRvZiI9PT10YWcmJih0YWc9InNldCIpO2lmKGRlci50YWdCeU5hbWUuaGFzT3duUHJvcGVydHkodGFnKSlyZXM9ZGVyLnRhZ0J5TmFtZVt0YWddO2Vsc2V7aWYoIm51bWJlciIhPXR5cGVvZiB0YWd8fCgwfHRhZykhPT10YWcpcmV0dXJuIHJlcG9ydGVyLmVycm9yKCJVbmtub3duIHRhZzogIit0YWcpO3Jlcz10YWd9aWYocmVzPj0zMSlyZXR1cm4gcmVwb3J0ZXIuZXJyb3IoIk11bHRpLW9jdGV0IHRhZyBlbmNvZGluZyB1bnN1cHBvcnRlZCIpO3ByaW1pdGl2ZXx8KHJlc3w9MzIpO3JldHVybiByZXN8PWRlci50YWdDbGFzc0J5TmFtZVtjbHN8fCJ1bml2ZXJzYWwiXTw8NixyZXN9KHRhZyxwcmltaXRpdmUsY2xzLHRoaXMucmVwb3J0ZXIpO2lmKGNvbnRlbnQubGVuZ3RoPDEyOClyZXR1cm4oaGVhZGVyPW5ldyBCdWZmZXIoMikpWzBdPWVuY29kZWRUYWcsaGVhZGVyWzFdPWNvbnRlbnQubGVuZ3RoLHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoW2hlYWRlcixjb250ZW50XSk7Zm9yKHZhciBsZW5PY3RldHM9MSxpPWNvbnRlbnQubGVuZ3RoO2k+PTI1NjtpPj49OClsZW5PY3RldHMrKzsoaGVhZGVyPW5ldyBCdWZmZXIoMitsZW5PY3RldHMpKVswXT1lbmNvZGVkVGFnLGhlYWRlclsxXT0xMjh8bGVuT2N0ZXRzO2k9MStsZW5PY3RldHM7Zm9yKHZhciBqPWNvbnRlbnQubGVuZ3RoO2o+MDtpLS0saj4+PTgpaGVhZGVyW2ldPTI1NSZqO3JldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKFtoZWFkZXIsY29udGVudF0pfSxERVJOb2RlLnByb3RvdHlwZS5fZW5jb2RlU3RyPWZ1bmN0aW9uIGVuY29kZVN0cihzdHIsdGFnKXtpZigiYml0c3RyIj09PXRhZylyZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihbMHxzdHIudW51c2VkLHN0ci5kYXRhXSk7aWYoImJtcHN0ciI9PT10YWcpe2Zvcih2YXIgYnVmPW5ldyBCdWZmZXIoMipzdHIubGVuZ3RoKSxpPTA7aTxzdHIubGVuZ3RoO2krKylidWYud3JpdGVVSW50MTZCRShzdHIuY2hhckNvZGVBdChpKSwyKmkpO3JldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKGJ1Zil9cmV0dXJuIm51bXN0ciI9PT10YWc/dGhpcy5faXNOdW1zdHIoc3RyKT90aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHN0cik6dGhpcy5yZXBvcnRlci5lcnJvcigiRW5jb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6IG51bXN0ciBzdXBwb3J0cyBvbmx5IGRpZ2l0cyBhbmQgc3BhY2UiKToicHJpbnRzdHIiPT09dGFnP3RoaXMuX2lzUHJpbnRzdHIoc3RyKT90aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKHN0cik6dGhpcy5yZXBvcnRlci5lcnJvcigiRW5jb2Rpbmcgb2Ygc3RyaW5nIHR5cGU6IHByaW50c3RyIHN1cHBvcnRzIG9ubHkgbGF0aW4gdXBwZXIgYW5kIGxvd2VyIGNhc2UgbGV0dGVycywgZGlnaXRzLCBzcGFjZSwgYXBvc3Ryb3BoZSwgbGVmdCBhbmQgcmlndGggcGFyZW50aGVzaXMsIHBsdXMgc2lnbiwgY29tbWEsIGh5cGhlbiwgZG90LCBzbGFzaCwgY29sb24sIGVxdWFsIHNpZ24sIHF1ZXN0aW9uIG1hcmsiKTovc3RyJC8udGVzdCh0YWcpfHwib2JqRGVzYyI9PT10YWc/dGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihzdHIpOnRoaXMucmVwb3J0ZXIuZXJyb3IoIkVuY29kaW5nIG9mIHN0cmluZyB0eXBlOiAiK3RhZysiIHVuc3VwcG9ydGVkIil9LERFUk5vZGUucHJvdG90eXBlLl9lbmNvZGVPYmppZD1mdW5jdGlvbiBlbmNvZGVPYmppZChpZCx2YWx1ZXMscmVsYXRpdmUpe2lmKCJzdHJpbmciPT10eXBlb2YgaWQpe2lmKCF2YWx1ZXMpcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoInN0cmluZyBvYmppZCBnaXZlbiwgYnV0IG5vIHZhbHVlcyBtYXAgZm91bmQiKTtpZighdmFsdWVzLmhhc093blByb3BlcnR5KGlkKSlyZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcigib2JqaWQgbm90IGZvdW5kIGluIHZhbHVlcyBtYXAiKTtpZD12YWx1ZXNbaWRdLnNwbGl0KC9bXHNcLl0rL2cpO2Zvcih2YXIgaT0wO2k8aWQubGVuZ3RoO2krKylpZFtpXXw9MH1lbHNlIGlmKEFycmF5LmlzQXJyYXkoaWQpKXtpZD1pZC5zbGljZSgpO2ZvcihpPTA7aTxpZC5sZW5ndGg7aSsrKWlkW2ldfD0wfWlmKCFBcnJheS5pc0FycmF5KGlkKSlyZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcigib2JqaWQoKSBzaG91bGQgYmUgZWl0aGVyIGFycmF5IG9yIHN0cmluZywgZ290OiAiK0pTT04uc3RyaW5naWZ5KGlkKSk7aWYoIXJlbGF0aXZlKXtpZihpZFsxXT49NDApcmV0dXJuIHRoaXMucmVwb3J0ZXIuZXJyb3IoIlNlY29uZCBvYmppZCBpZGVudGlmaWVyIE9PQiIpO2lkLnNwbGljZSgwLDIsNDAqaWRbMF0raWRbMV0pfXZhciBzaXplPTA7Zm9yKGk9MDtpPGlkLmxlbmd0aDtpKyspe3ZhciBpZGVudD1pZFtpXTtmb3Ioc2l6ZSsrO2lkZW50Pj0xMjg7aWRlbnQ+Pj03KXNpemUrK312YXIgb2JqaWQ9bmV3IEJ1ZmZlcihzaXplKSxvZmZzZXQ9b2JqaWQubGVuZ3RoLTE7Zm9yKGk9aWQubGVuZ3RoLTE7aT49MDtpLS0pe2lkZW50PWlkW2ldO2ZvcihvYmppZFtvZmZzZXQtLV09MTI3JmlkZW50OyhpZGVudD4+PTcpPjA7KW9iamlkW29mZnNldC0tXT0xMjh8MTI3JmlkZW50fXJldHVybiB0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKG9iamlkKX0sREVSTm9kZS5wcm90b3R5cGUuX2VuY29kZVRpbWU9ZnVuY3Rpb24gZW5jb2RlVGltZSh0aW1lLHRhZyl7dmFyIHN0cixkYXRlPW5ldyBEYXRlKHRpbWUpO3JldHVybiJnZW50aW1lIj09PXRhZz9zdHI9W3R3byhkYXRlLmdldEZ1bGxZZWFyKCkpLHR3byhkYXRlLmdldFVUQ01vbnRoKCkrMSksdHdvKGRhdGUuZ2V0VVRDRGF0ZSgpKSx0d28oZGF0ZS5nZXRVVENIb3VycygpKSx0d28oZGF0ZS5nZXRVVENNaW51dGVzKCkpLHR3byhkYXRlLmdldFVUQ1NlY29uZHMoKSksIloiXS5qb2luKCIiKToidXRjdGltZSI9PT10YWc/c3RyPVt0d28oZGF0ZS5nZXRGdWxsWWVhcigpJTEwMCksdHdvKGRhdGUuZ2V0VVRDTW9udGgoKSsxKSx0d28oZGF0ZS5nZXRVVENEYXRlKCkpLHR3byhkYXRlLmdldFVUQ0hvdXJzKCkpLHR3byhkYXRlLmdldFVUQ01pbnV0ZXMoKSksdHdvKGRhdGUuZ2V0VVRDU2Vjb25kcygpKSwiWiJdLmpvaW4oIiIpOnRoaXMucmVwb3J0ZXIuZXJyb3IoIkVuY29kaW5nICIrdGFnKyIgdGltZSBpcyBub3Qgc3VwcG9ydGVkIHlldCIpLHRoaXMuX2VuY29kZVN0cihzdHIsIm9jdHN0ciIpfSxERVJOb2RlLnByb3RvdHlwZS5fZW5jb2RlTnVsbD1mdW5jdGlvbiBlbmNvZGVOdWxsKCl7cmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoIiIpfSxERVJOb2RlLnByb3RvdHlwZS5fZW5jb2RlSW50PWZ1bmN0aW9uIGVuY29kZUludChudW0sdmFsdWVzKXtpZigic3RyaW5nIj09dHlwZW9mIG51bSl7aWYoIXZhbHVlcylyZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcigiU3RyaW5nIGludCBvciBlbnVtIGdpdmVuLCBidXQgbm8gdmFsdWVzIG1hcCIpO2lmKCF2YWx1ZXMuaGFzT3duUHJvcGVydHkobnVtKSlyZXR1cm4gdGhpcy5yZXBvcnRlci5lcnJvcigiVmFsdWVzIG1hcCBkb2Vzbid0IGNvbnRhaW46ICIrSlNPTi5zdHJpbmdpZnkobnVtKSk7bnVtPXZhbHVlc1tudW1dfWlmKCJudW1iZXIiIT10eXBlb2YgbnVtJiYhQnVmZmVyLmlzQnVmZmVyKG51bSkpe3ZhciBudW1BcnJheT1udW0udG9BcnJheSgpOyFudW0uc2lnbiYmMTI4Jm51bUFycmF5WzBdJiZudW1BcnJheS51bnNoaWZ0KDApLG51bT1uZXcgQnVmZmVyKG51bUFycmF5KX1pZihCdWZmZXIuaXNCdWZmZXIobnVtKSl7dmFyIHNpemU9bnVtLmxlbmd0aDswPT09bnVtLmxlbmd0aCYmc2l6ZSsrO3ZhciBvdXQ9bmV3IEJ1ZmZlcihzaXplKTtyZXR1cm4gbnVtLmNvcHkob3V0KSwwPT09bnVtLmxlbmd0aCYmKG91dFswXT0wKSx0aGlzLl9jcmVhdGVFbmNvZGVyQnVmZmVyKG91dCl9aWYobnVtPDEyOClyZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihudW0pO2lmKG51bTwyNTYpcmV0dXJuIHRoaXMuX2NyZWF0ZUVuY29kZXJCdWZmZXIoWzAsbnVtXSk7c2l6ZT0xO2Zvcih2YXIgaT1udW07aT49MjU2O2k+Pj04KXNpemUrKztmb3IoaT0ob3V0PW5ldyBBcnJheShzaXplKSkubGVuZ3RoLTE7aT49MDtpLS0pb3V0W2ldPTI1NSZudW0sbnVtPj49ODtyZXR1cm4gMTI4Jm91dFswXSYmb3V0LnVuc2hpZnQoMCksdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcihuZXcgQnVmZmVyKG91dCkpfSxERVJOb2RlLnByb3RvdHlwZS5fZW5jb2RlQm9vbD1mdW5jdGlvbiBlbmNvZGVCb29sKHZhbHVlKXtyZXR1cm4gdGhpcy5fY3JlYXRlRW5jb2RlckJ1ZmZlcih2YWx1ZT8yNTU6MCl9LERFUk5vZGUucHJvdG90eXBlLl91c2U9ZnVuY3Rpb24gdXNlKGVudGl0eSxvYmope3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlbnRpdHkmJihlbnRpdHk9ZW50aXR5KG9iaikpLGVudGl0eS5fZ2V0RW5jb2RlcigiZGVyIikudHJlZX0sREVSTm9kZS5wcm90b3R5cGUuX3NraXBEZWZhdWx0PWZ1bmN0aW9uIHNraXBEZWZhdWx0KGRhdGFCdWZmZXIscmVwb3J0ZXIscGFyZW50KXt2YXIgaSxzdGF0ZT10aGlzLl9iYXNlU3RhdGU7aWYobnVsbD09PXN0YXRlLmRlZmF1bHQpcmV0dXJuITE7dmFyIGRhdGE9ZGF0YUJ1ZmZlci5qb2luKCk7aWYodm9pZCAwPT09c3RhdGUuZGVmYXVsdEJ1ZmZlciYmKHN0YXRlLmRlZmF1bHRCdWZmZXI9dGhpcy5fZW5jb2RlVmFsdWUoc3RhdGUuZGVmYXVsdCxyZXBvcnRlcixwYXJlbnQpLmpvaW4oKSksZGF0YS5sZW5ndGghPT1zdGF0ZS5kZWZhdWx0QnVmZmVyLmxlbmd0aClyZXR1cm4hMTtmb3IoaT0wO2k8ZGF0YS5sZW5ndGg7aSsrKWlmKGRhdGFbaV0hPT1zdGF0ZS5kZWZhdWx0QnVmZmVyW2ldKXJldHVybiExO3JldHVybiEwfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9hc24xLmpzL2xpYi9hc24xL2VuY29kZXJzL2luZGV4LmpzIihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pe3ZhciBlbmNvZGVycz1leHBvcnRzO2VuY29kZXJzLmRlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYXNuMS5qcy9saWIvYXNuMS9lbmNvZGVycy9kZXIuanMiKSxlbmNvZGVycy5wZW09X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2FzbjEuanMvbGliL2FzbjEvZW5jb2RlcnMvcGVtLmpzIil9LCIuLi8uLi9ub2RlX21vZHVsZXMvYXNuMS5qcy9saWIvYXNuMS9lbmNvZGVycy9wZW0uanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7dmFyIGluaGVyaXRzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiksREVSRW5jb2Rlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYXNuMS5qcy9saWIvYXNuMS9lbmNvZGVycy9kZXIuanMiKTtmdW5jdGlvbiBQRU1FbmNvZGVyKGVudGl0eSl7REVSRW5jb2Rlci5jYWxsKHRoaXMsZW50aXR5KSx0aGlzLmVuYz0icGVtIn1pbmhlcml0cyhQRU1FbmNvZGVyLERFUkVuY29kZXIpLG1vZHVsZS5leHBvcnRzPVBFTUVuY29kZXIsUEVNRW5jb2Rlci5wcm90b3R5cGUuZW5jb2RlPWZ1bmN0aW9uIGVuY29kZShkYXRhLG9wdGlvbnMpe2Zvcih2YXIgcD1ERVJFbmNvZGVyLnByb3RvdHlwZS5lbmNvZGUuY2FsbCh0aGlzLGRhdGEpLnRvU3RyaW5nKCJiYXNlNjQiKSxvdXQ9WyItLS0tLUJFR0lOICIrb3B0aW9ucy5sYWJlbCsiLS0tLS0iXSxpPTA7aTxwLmxlbmd0aDtpKz02NClvdXQucHVzaChwLnNsaWNlKGksaSs2NCkpO3JldHVybiBvdXQucHVzaCgiLS0tLS1FTkQgIitvcHRpb25zLmxhYmVsKyItLS0tLSIpLG91dC5qb2luKCJcbiIpfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9hc3NlcnQvYnVpbGQvYXNzZXJ0LmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgcHJvY2Vzcz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbm9kZS1zdGRsaWItYnJvd3Nlci9janMvcHJveHkvcHJvY2Vzcy5qcyIpO2Z1bmN0aW9uIF90eXBlb2Yobyl7cmV0dXJuIF90eXBlb2Y9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24obyl7cmV0dXJuIHR5cGVvZiBvfTpmdW5jdGlvbihvKXtyZXR1cm4gbyYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmby5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmbyE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIG99LF90eXBlb2Yobyl9ZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fCExLGRlc2NyaXB0b3IuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBkZXNjcmlwdG9yJiYoZGVzY3JpcHRvci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxfdG9Qcm9wZXJ0eUtleShkZXNjcmlwdG9yLmtleSksZGVzY3JpcHRvcil9fWZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtyZXR1cm4gcHJvdG9Qcm9wcyYmX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpLHN0YXRpY1Byb3BzJiZfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3RvcixzdGF0aWNQcm9wcyksT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCJwcm90b3R5cGUiLHt3cml0YWJsZTohMX0pLENvbnN0cnVjdG9yfWZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KGFyZyl7dmFyIGtleT1mdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsaGludCl7aWYoIm9iamVjdCIhPT1fdHlwZW9mKGlucHV0KXx8bnVsbD09PWlucHV0KXJldHVybiBpbnB1dDt2YXIgcHJpbT1pbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdO2lmKHZvaWQgMCE9PXByaW0pe3ZhciByZXM9cHJpbS5jYWxsKGlucHV0LGhpbnR8fCJkZWZhdWx0Iik7aWYoIm9iamVjdCIhPT1fdHlwZW9mKHJlcykpcmV0dXJuIHJlczt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybigic3RyaW5nIj09PWhpbnQ/U3RyaW5nOk51bWJlcikoaW5wdXQpfShhcmcsInN0cmluZyIpO3JldHVybiJzeW1ib2wiPT09X3R5cGVvZihrZXkpP2tleTpTdHJpbmcoa2V5KX12YXIgaXNEZWVwRXF1YWwsaXNEZWVwU3RyaWN0RXF1YWwsX3JlcXVpcmUkY29kZXM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2Fzc2VydC9idWlsZC9pbnRlcm5hbC9lcnJvcnMuanMiKS5jb2RlcyxFUlJfQU1CSUdVT1VTX0FSR1VNRU5UPV9yZXF1aXJlJGNvZGVzLkVSUl9BTUJJR1VPVVNfQVJHVU1FTlQsRVJSX0lOVkFMSURfQVJHX1RZUEU9X3JlcXVpcmUkY29kZXMuRVJSX0lOVkFMSURfQVJHX1RZUEUsRVJSX0lOVkFMSURfQVJHX1ZBTFVFPV9yZXF1aXJlJGNvZGVzLkVSUl9JTlZBTElEX0FSR19WQUxVRSxFUlJfSU5WQUxJRF9SRVRVUk5fVkFMVUU9X3JlcXVpcmUkY29kZXMuRVJSX0lOVkFMSURfUkVUVVJOX1ZBTFVFLEVSUl9NSVNTSU5HX0FSR1M9X3JlcXVpcmUkY29kZXMuRVJSX01JU1NJTkdfQVJHUyxBc3NlcnRpb25FcnJvcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYXNzZXJ0L2J1aWxkL2ludGVybmFsL2Fzc2VydC9hc3NlcnRpb25fZXJyb3IuanMiKSxpbnNwZWN0PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy91dGlsL3V0aWwuanMiKS5pbnNwZWN0LF9yZXF1aXJlJHR5cGVzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy91dGlsL3V0aWwuanMiKS50eXBlcyxpc1Byb21pc2U9X3JlcXVpcmUkdHlwZXMuaXNQcm9taXNlLGlzUmVnRXhwPV9yZXF1aXJlJHR5cGVzLmlzUmVnRXhwLG9iamVjdEFzc2lnbj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvb2JqZWN0LmFzc2lnbi9wb2x5ZmlsbC5qcyIpKCksb2JqZWN0SXM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL29iamVjdC1pcy9wb2x5ZmlsbC5qcyIpKCksUmVnRXhwUHJvdG90eXBlVGVzdD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kL2NhbGxCb3VuZC5qcyIpKCJSZWdFeHAucHJvdG90eXBlLnRlc3QiKTtuZXcgTWFwO2Z1bmN0aW9uIGxhenlMb2FkQ29tcGFyaXNvbigpe3ZhciBjb21wYXJpc29uPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9hc3NlcnQvYnVpbGQvaW50ZXJuYWwvdXRpbC9jb21wYXJpc29ucy5qcyIpO2lzRGVlcEVxdWFsPWNvbXBhcmlzb24uaXNEZWVwRXF1YWwsaXNEZWVwU3RyaWN0RXF1YWw9Y29tcGFyaXNvbi5pc0RlZXBTdHJpY3RFcXVhbH12YXIgd2FybmVkPSExLGFzc2VydD1tb2R1bGUuZXhwb3J0cz1vayxOT19FWENFUFRJT05fU0VOVElORUw9e307ZnVuY3Rpb24gaW5uZXJGYWlsKG9iail7aWYob2JqLm1lc3NhZ2UgaW5zdGFuY2VvZiBFcnJvcil0aHJvdyBvYmoubWVzc2FnZTt0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3Iob2JqKX1mdW5jdGlvbiBpbm5lck9rKGZuLGFyZ0xlbix2YWx1ZSxtZXNzYWdlKXtpZighdmFsdWUpe3ZhciBnZW5lcmF0ZWRNZXNzYWdlPSExO2lmKDA9PT1hcmdMZW4pZ2VuZXJhdGVkTWVzc2FnZT0hMCxtZXNzYWdlPSJObyB2YWx1ZSBhcmd1bWVudCBwYXNzZWQgdG8gYGFzc2VydC5vaygpYCI7ZWxzZSBpZihtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3IpdGhyb3cgbWVzc2FnZTt2YXIgZXJyPW5ldyBBc3NlcnRpb25FcnJvcih7YWN0dWFsOnZhbHVlLGV4cGVjdGVkOiEwLG1lc3NhZ2Usb3BlcmF0b3I6Ij09IixzdGFja1N0YXJ0Rm46Zm59KTt0aHJvdyBlcnIuZ2VuZXJhdGVkTWVzc2FnZT1nZW5lcmF0ZWRNZXNzYWdlLGVycn19ZnVuY3Rpb24gb2soKXtmb3IodmFyIF9sZW49YXJndW1lbnRzLmxlbmd0aCxhcmdzPW5ldyBBcnJheShfbGVuKSxfa2V5PTA7X2tleTxfbGVuO19rZXkrKylhcmdzW19rZXldPWFyZ3VtZW50c1tfa2V5XTtpbm5lck9rLmFwcGx5KHZvaWQgMCxbb2ssYXJncy5sZW5ndGhdLmNvbmNhdChhcmdzKSl9YXNzZXJ0LmZhaWw9ZnVuY3Rpb24gZmFpbChhY3R1YWwsZXhwZWN0ZWQsbWVzc2FnZSxvcGVyYXRvcixzdGFja1N0YXJ0Rm4pe3ZhciBpbnRlcm5hbE1lc3NhZ2UsYXJnc0xlbj1hcmd1bWVudHMubGVuZ3RoO2lmKDA9PT1hcmdzTGVuKWludGVybmFsTWVzc2FnZT0iRmFpbGVkIjtlbHNlIGlmKDE9PT1hcmdzTGVuKW1lc3NhZ2U9YWN0dWFsLGFjdHVhbD12b2lkIDA7ZWxzZXtpZighMT09PXdhcm5lZCl3YXJuZWQ9ITAsKHByb2Nlc3MuZW1pdFdhcm5pbmc/cHJvY2Vzcy5lbWl0V2FybmluZzpjb25zb2xlLndhcm4uYmluZChjb25zb2xlKSkoImFzc2VydC5mYWlsKCkgd2l0aCBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgYXNzZXJ0LnN0cmljdEVxdWFsKCkgaW5zdGVhZCBvciBvbmx5IHBhc3MgYSBtZXNzYWdlLiIsIkRlcHJlY2F0aW9uV2FybmluZyIsIkRFUDAwOTQiKTsyPT09YXJnc0xlbiYmKG9wZXJhdG9yPSIhPSIpfWlmKG1lc3NhZ2UgaW5zdGFuY2VvZiBFcnJvcil0aHJvdyBtZXNzYWdlO3ZhciBlcnJBcmdzPXthY3R1YWwsZXhwZWN0ZWQsb3BlcmF0b3I6dm9pZCAwPT09b3BlcmF0b3I/ImZhaWwiOm9wZXJhdG9yLHN0YWNrU3RhcnRGbjpzdGFja1N0YXJ0Rm58fGZhaWx9O3ZvaWQgMCE9PW1lc3NhZ2UmJihlcnJBcmdzLm1lc3NhZ2U9bWVzc2FnZSk7dmFyIGVycj1uZXcgQXNzZXJ0aW9uRXJyb3IoZXJyQXJncyk7dGhyb3cgaW50ZXJuYWxNZXNzYWdlJiYoZXJyLm1lc3NhZ2U9aW50ZXJuYWxNZXNzYWdlLGVyci5nZW5lcmF0ZWRNZXNzYWdlPSEwKSxlcnJ9LGFzc2VydC5Bc3NlcnRpb25FcnJvcj1Bc3NlcnRpb25FcnJvcixhc3NlcnQub2s9b2ssYXNzZXJ0LmVxdWFsPWZ1bmN0aW9uIGVxdWFsKGFjdHVhbCxleHBlY3RlZCxtZXNzYWdlKXtpZihhcmd1bWVudHMubGVuZ3RoPDIpdGhyb3cgbmV3IEVSUl9NSVNTSU5HX0FSR1MoImFjdHVhbCIsImV4cGVjdGVkIik7YWN0dWFsIT1leHBlY3RlZCYmaW5uZXJGYWlsKHthY3R1YWwsZXhwZWN0ZWQsbWVzc2FnZSxvcGVyYXRvcjoiPT0iLHN0YWNrU3RhcnRGbjplcXVhbH0pfSxhc3NlcnQubm90RXF1YWw9ZnVuY3Rpb24gbm90RXF1YWwoYWN0dWFsLGV4cGVjdGVkLG1lc3NhZ2Upe2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil0aHJvdyBuZXcgRVJSX01JU1NJTkdfQVJHUygiYWN0dWFsIiwiZXhwZWN0ZWQiKTthY3R1YWw9PWV4cGVjdGVkJiZpbm5lckZhaWwoe2FjdHVhbCxleHBlY3RlZCxtZXNzYWdlLG9wZXJhdG9yOiIhPSIsc3RhY2tTdGFydEZuOm5vdEVxdWFsfSl9LGFzc2VydC5kZWVwRXF1YWw9ZnVuY3Rpb24gZGVlcEVxdWFsKGFjdHVhbCxleHBlY3RlZCxtZXNzYWdlKXtpZihhcmd1bWVudHMubGVuZ3RoPDIpdGhyb3cgbmV3IEVSUl9NSVNTSU5HX0FSR1MoImFjdHVhbCIsImV4cGVjdGVkIik7dm9pZCAwPT09aXNEZWVwRXF1YWwmJmxhenlMb2FkQ29tcGFyaXNvbigpLGlzRGVlcEVxdWFsKGFjdHVhbCxleHBlY3RlZCl8fGlubmVyRmFpbCh7YWN0dWFsLGV4cGVjdGVkLG1lc3NhZ2Usb3BlcmF0b3I6ImRlZXBFcXVhbCIsc3RhY2tTdGFydEZuOmRlZXBFcXVhbH0pfSxhc3NlcnQubm90RGVlcEVxdWFsPWZ1bmN0aW9uIG5vdERlZXBFcXVhbChhY3R1YWwsZXhwZWN0ZWQsbWVzc2FnZSl7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXRocm93IG5ldyBFUlJfTUlTU0lOR19BUkdTKCJhY3R1YWwiLCJleHBlY3RlZCIpO3ZvaWQgMD09PWlzRGVlcEVxdWFsJiZsYXp5TG9hZENvbXBhcmlzb24oKSxpc0RlZXBFcXVhbChhY3R1YWwsZXhwZWN0ZWQpJiZpbm5lckZhaWwoe2FjdHVhbCxleHBlY3RlZCxtZXNzYWdlLG9wZXJhdG9yOiJub3REZWVwRXF1YWwiLHN0YWNrU3RhcnRGbjpub3REZWVwRXF1YWx9KX0sYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbD1mdW5jdGlvbiBkZWVwU3RyaWN0RXF1YWwoYWN0dWFsLGV4cGVjdGVkLG1lc3NhZ2Upe2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil0aHJvdyBuZXcgRVJSX01JU1NJTkdfQVJHUygiYWN0dWFsIiwiZXhwZWN0ZWQiKTt2b2lkIDA9PT1pc0RlZXBFcXVhbCYmbGF6eUxvYWRDb21wYXJpc29uKCksaXNEZWVwU3RyaWN0RXF1YWwoYWN0dWFsLGV4cGVjdGVkKXx8aW5uZXJGYWlsKHthY3R1YWwsZXhwZWN0ZWQsbWVzc2FnZSxvcGVyYXRvcjoiZGVlcFN0cmljdEVxdWFsIixzdGFja1N0YXJ0Rm46ZGVlcFN0cmljdEVxdWFsfSl9LGFzc2VydC5ub3REZWVwU3RyaWN0RXF1YWw9ZnVuY3Rpb24gbm90RGVlcFN0cmljdEVxdWFsKGFjdHVhbCxleHBlY3RlZCxtZXNzYWdlKXtpZihhcmd1bWVudHMubGVuZ3RoPDIpdGhyb3cgbmV3IEVSUl9NSVNTSU5HX0FSR1MoImFjdHVhbCIsImV4cGVjdGVkIik7dm9pZCAwPT09aXNEZWVwRXF1YWwmJmxhenlMb2FkQ29tcGFyaXNvbigpO2lzRGVlcFN0cmljdEVxdWFsKGFjdHVhbCxleHBlY3RlZCkmJmlubmVyRmFpbCh7YWN0dWFsLGV4cGVjdGVkLG1lc3NhZ2Usb3BlcmF0b3I6Im5vdERlZXBTdHJpY3RFcXVhbCIsc3RhY2tTdGFydEZuOm5vdERlZXBTdHJpY3RFcXVhbH0pfSxhc3NlcnQuc3RyaWN0RXF1YWw9ZnVuY3Rpb24gc3RyaWN0RXF1YWwoYWN0dWFsLGV4cGVjdGVkLG1lc3NhZ2Upe2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil0aHJvdyBuZXcgRVJSX01JU1NJTkdfQVJHUygiYWN0dWFsIiwiZXhwZWN0ZWQiKTtvYmplY3RJcyhhY3R1YWwsZXhwZWN0ZWQpfHxpbm5lckZhaWwoe2FjdHVhbCxleHBlY3RlZCxtZXNzYWdlLG9wZXJhdG9yOiJzdHJpY3RFcXVhbCIsc3RhY2tTdGFydEZuOnN0cmljdEVxdWFsfSl9LGFzc2VydC5ub3RTdHJpY3RFcXVhbD1mdW5jdGlvbiBub3RTdHJpY3RFcXVhbChhY3R1YWwsZXhwZWN0ZWQsbWVzc2FnZSl7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXRocm93IG5ldyBFUlJfTUlTU0lOR19BUkdTKCJhY3R1YWwiLCJleHBlY3RlZCIpO29iamVjdElzKGFjdHVhbCxleHBlY3RlZCkmJmlubmVyRmFpbCh7YWN0dWFsLGV4cGVjdGVkLG1lc3NhZ2Usb3BlcmF0b3I6Im5vdFN0cmljdEVxdWFsIixzdGFja1N0YXJ0Rm46bm90U3RyaWN0RXF1YWx9KX07dmFyIENvbXBhcmlzb249X2NyZWF0ZUNsYXNzKGZ1bmN0aW9uIENvbXBhcmlzb24ob2JqLGtleXMsYWN0dWFsKXt2YXIgX3RoaXM9dGhpczshZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLENvbnN0cnVjdG9yKXtpZighKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfSh0aGlzLENvbXBhcmlzb24pLGtleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpe2tleSBpbiBvYmomJih2b2lkIDAhPT1hY3R1YWwmJiJzdHJpbmciPT10eXBlb2YgYWN0dWFsW2tleV0mJmlzUmVnRXhwKG9ialtrZXldKSYmUmVnRXhwUHJvdG90eXBlVGVzdChvYmpba2V5XSxhY3R1YWxba2V5XSk/X3RoaXNba2V5XT1hY3R1YWxba2V5XTpfdGhpc1trZXldPW9ialtrZXldKX0pfSk7ZnVuY3Rpb24gZXhwZWN0ZWRFeGNlcHRpb24oYWN0dWFsLGV4cGVjdGVkLG1zZyxmbil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGV4cGVjdGVkKXtpZihpc1JlZ0V4cChleHBlY3RlZCkpcmV0dXJuIFJlZ0V4cFByb3RvdHlwZVRlc3QoZXhwZWN0ZWQsYWN0dWFsKTtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoImV4cGVjdGVkIixbIkZ1bmN0aW9uIiwiUmVnRXhwIl0sZXhwZWN0ZWQpO2lmKCJvYmplY3QiIT09X3R5cGVvZihhY3R1YWwpfHxudWxsPT09YWN0dWFsKXt2YXIgZXJyPW5ldyBBc3NlcnRpb25FcnJvcih7YWN0dWFsLGV4cGVjdGVkLG1lc3NhZ2U6bXNnLG9wZXJhdG9yOiJkZWVwU3RyaWN0RXF1YWwiLHN0YWNrU3RhcnRGbjpmbn0pO3Rocm93IGVyci5vcGVyYXRvcj1mbi5uYW1lLGVycn12YXIga2V5cz1PYmplY3Qua2V5cyhleHBlY3RlZCk7aWYoZXhwZWN0ZWQgaW5zdGFuY2VvZiBFcnJvcilrZXlzLnB1c2goIm5hbWUiLCJtZXNzYWdlIik7ZWxzZSBpZigwPT09a2V5cy5sZW5ndGgpdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19WQUxVRSgiZXJyb3IiLGV4cGVjdGVkLCJtYXkgbm90IGJlIGFuIGVtcHR5IG9iamVjdCIpO3JldHVybiB2b2lkIDA9PT1pc0RlZXBFcXVhbCYmbGF6eUxvYWRDb21wYXJpc29uKCksa2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSl7InN0cmluZyI9PXR5cGVvZiBhY3R1YWxba2V5XSYmaXNSZWdFeHAoZXhwZWN0ZWRba2V5XSkmJlJlZ0V4cFByb3RvdHlwZVRlc3QoZXhwZWN0ZWRba2V5XSxhY3R1YWxba2V5XSl8fGZ1bmN0aW9uIGNvbXBhcmVFeGNlcHRpb25LZXkoYWN0dWFsLGV4cGVjdGVkLGtleSxtZXNzYWdlLGtleXMsZm4pe2lmKCEoa2V5IGluIGFjdHVhbCl8fCFpc0RlZXBTdHJpY3RFcXVhbChhY3R1YWxba2V5XSxleHBlY3RlZFtrZXldKSl7aWYoIW1lc3NhZ2Upe3ZhciBhPW5ldyBDb21wYXJpc29uKGFjdHVhbCxrZXlzKSxiPW5ldyBDb21wYXJpc29uKGV4cGVjdGVkLGtleXMsYWN0dWFsKSxlcnI9bmV3IEFzc2VydGlvbkVycm9yKHthY3R1YWw6YSxleHBlY3RlZDpiLG9wZXJhdG9yOiJkZWVwU3RyaWN0RXF1YWwiLHN0YWNrU3RhcnRGbjpmbn0pO3Rocm93IGVyci5hY3R1YWw9YWN0dWFsLGVyci5leHBlY3RlZD1leHBlY3RlZCxlcnIub3BlcmF0b3I9Zm4ubmFtZSxlcnJ9aW5uZXJGYWlsKHthY3R1YWwsZXhwZWN0ZWQsbWVzc2FnZSxvcGVyYXRvcjpmbi5uYW1lLHN0YWNrU3RhcnRGbjpmbn0pfX0oYWN0dWFsLGV4cGVjdGVkLGtleSxtc2csa2V5cyxmbil9KSwhMH1yZXR1cm4gdm9pZCAwIT09ZXhwZWN0ZWQucHJvdG90eXBlJiZhY3R1YWwgaW5zdGFuY2VvZiBleHBlY3RlZHx8IUVycm9yLmlzUHJvdG90eXBlT2YoZXhwZWN0ZWQpJiYhMD09PWV4cGVjdGVkLmNhbGwoe30sYWN0dWFsKX1mdW5jdGlvbiBnZXRBY3R1YWwoZm4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBmbil0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoImZuIiwiRnVuY3Rpb24iLGZuKTt0cnl7Zm4oKX1jYXRjaChlKXtyZXR1cm4gZX1yZXR1cm4gTk9fRVhDRVBUSU9OX1NFTlRJTkVMfWZ1bmN0aW9uIGNoZWNrSXNQcm9taXNlKG9iail7cmV0dXJuIGlzUHJvbWlzZShvYmopfHxudWxsIT09b2JqJiYib2JqZWN0Ij09PV90eXBlb2Yob2JqKSYmImZ1bmN0aW9uIj09dHlwZW9mIG9iai50aGVuJiYiZnVuY3Rpb24iPT10eXBlb2Ygb2JqLmNhdGNofWZ1bmN0aW9uIHdhaXRGb3JBY3R1YWwocHJvbWlzZUZuKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe3ZhciByZXN1bHRQcm9taXNlO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBwcm9taXNlRm4pe2lmKCFjaGVja0lzUHJvbWlzZShyZXN1bHRQcm9taXNlPXByb21pc2VGbigpKSl0aHJvdyBuZXcgRVJSX0lOVkFMSURfUkVUVVJOX1ZBTFVFKCJpbnN0YW5jZSBvZiBQcm9taXNlIiwicHJvbWlzZUZuIixyZXN1bHRQcm9taXNlKX1lbHNle2lmKCFjaGVja0lzUHJvbWlzZShwcm9taXNlRm4pKXRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgicHJvbWlzZUZuIixbIkZ1bmN0aW9uIiwiUHJvbWlzZSJdLHByb21pc2VGbik7cmVzdWx0UHJvbWlzZT1wcm9taXNlRm59cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gcmVzdWx0UHJvbWlzZX0pLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gTk9fRVhDRVBUSU9OX1NFTlRJTkVMfSkuY2F0Y2goZnVuY3Rpb24oZSl7cmV0dXJuIGV9KX0pfWZ1bmN0aW9uIGV4cGVjdHNFcnJvcihzdGFja1N0YXJ0Rm4sYWN0dWFsLGVycm9yLG1lc3NhZ2Upe2lmKCJzdHJpbmciPT10eXBlb2YgZXJyb3Ipe2lmKDQ9PT1hcmd1bWVudHMubGVuZ3RoKXRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgiZXJyb3IiLFsiT2JqZWN0IiwiRXJyb3IiLCJGdW5jdGlvbiIsIlJlZ0V4cCJdLGVycm9yKTtpZigib2JqZWN0Ij09PV90eXBlb2YoYWN0dWFsKSYmbnVsbCE9PWFjdHVhbCl7aWYoYWN0dWFsLm1lc3NhZ2U9PT1lcnJvcil0aHJvdyBuZXcgRVJSX0FNQklHVU9VU19BUkdVTUVOVCgiZXJyb3IvbWVzc2FnZSIsJ1RoZSBlcnJvciBtZXNzYWdlICInLmNvbmNhdChhY3R1YWwubWVzc2FnZSwnIiBpcyBpZGVudGljYWwgdG8gdGhlIG1lc3NhZ2UuJykpfWVsc2UgaWYoYWN0dWFsPT09ZXJyb3IpdGhyb3cgbmV3IEVSUl9BTUJJR1VPVVNfQVJHVU1FTlQoImVycm9yL21lc3NhZ2UiLCdUaGUgZXJyb3IgIicuY29uY2F0KGFjdHVhbCwnIiBpcyBpZGVudGljYWwgdG8gdGhlIG1lc3NhZ2UuJykpO21lc3NhZ2U9ZXJyb3IsZXJyb3I9dm9pZCAwfWVsc2UgaWYobnVsbCE9ZXJyb3ImJiJvYmplY3QiIT09X3R5cGVvZihlcnJvcikmJiJmdW5jdGlvbiIhPXR5cGVvZiBlcnJvcil0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoImVycm9yIixbIk9iamVjdCIsIkVycm9yIiwiRnVuY3Rpb24iLCJSZWdFeHAiXSxlcnJvcik7aWYoYWN0dWFsPT09Tk9fRVhDRVBUSU9OX1NFTlRJTkVMKXt2YXIgZGV0YWlscz0iIjtlcnJvciYmZXJyb3IubmFtZSYmKGRldGFpbHMrPSIgKCIuY29uY2F0KGVycm9yLm5hbWUsIikiKSksZGV0YWlscys9bWVzc2FnZT8iOiAiLmNvbmNhdChtZXNzYWdlKToiLiI7dmFyIGZuVHlwZT0icmVqZWN0cyI9PT1zdGFja1N0YXJ0Rm4ubmFtZT8icmVqZWN0aW9uIjoiZXhjZXB0aW9uIjtpbm5lckZhaWwoe2FjdHVhbDp2b2lkIDAsZXhwZWN0ZWQ6ZXJyb3Isb3BlcmF0b3I6c3RhY2tTdGFydEZuLm5hbWUsbWVzc2FnZToiTWlzc2luZyBleHBlY3RlZCAiLmNvbmNhdChmblR5cGUpLmNvbmNhdChkZXRhaWxzKSxzdGFja1N0YXJ0Rm59KX1pZihlcnJvciYmIWV4cGVjdGVkRXhjZXB0aW9uKGFjdHVhbCxlcnJvcixtZXNzYWdlLHN0YWNrU3RhcnRGbikpdGhyb3cgYWN0dWFsfWZ1bmN0aW9uIGV4cGVjdHNOb0Vycm9yKHN0YWNrU3RhcnRGbixhY3R1YWwsZXJyb3IsbWVzc2FnZSl7aWYoYWN0dWFsIT09Tk9fRVhDRVBUSU9OX1NFTlRJTkVMKXtpZigic3RyaW5nIj09dHlwZW9mIGVycm9yJiYobWVzc2FnZT1lcnJvcixlcnJvcj12b2lkIDApLCFlcnJvcnx8ZXhwZWN0ZWRFeGNlcHRpb24oYWN0dWFsLGVycm9yKSl7dmFyIGRldGFpbHM9bWVzc2FnZT8iOiAiLmNvbmNhdChtZXNzYWdlKToiLiIsZm5UeXBlPSJkb2VzTm90UmVqZWN0Ij09PXN0YWNrU3RhcnRGbi5uYW1lPyJyZWplY3Rpb24iOiJleGNlcHRpb24iO2lubmVyRmFpbCh7YWN0dWFsLGV4cGVjdGVkOmVycm9yLG9wZXJhdG9yOnN0YWNrU3RhcnRGbi5uYW1lLG1lc3NhZ2U6IkdvdCB1bndhbnRlZCAiLmNvbmNhdChmblR5cGUpLmNvbmNhdChkZXRhaWxzLCJcbiIpKydBY3R1YWwgbWVzc2FnZTogIicuY29uY2F0KGFjdHVhbCYmYWN0dWFsLm1lc3NhZ2UsJyInKSxzdGFja1N0YXJ0Rm59KX10aHJvdyBhY3R1YWx9fWZ1bmN0aW9uIGludGVybmFsTWF0Y2goc3RyaW5nLHJlZ2V4cCxtZXNzYWdlLGZuLGZuTmFtZSl7aWYoIWlzUmVnRXhwKHJlZ2V4cCkpdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKCJyZWdleHAiLCJSZWdFeHAiLHJlZ2V4cCk7dmFyIG1hdGNoPSJtYXRjaCI9PT1mbk5hbWU7aWYoInN0cmluZyIhPXR5cGVvZiBzdHJpbmd8fFJlZ0V4cFByb3RvdHlwZVRlc3QocmVnZXhwLHN0cmluZykhPT1tYXRjaCl7aWYobWVzc2FnZSBpbnN0YW5jZW9mIEVycm9yKXRocm93IG1lc3NhZ2U7dmFyIGdlbmVyYXRlZE1lc3NhZ2U9IW1lc3NhZ2U7bWVzc2FnZT1tZXNzYWdlfHwoInN0cmluZyIhPXR5cGVvZiBzdHJpbmc/J1RoZSAic3RyaW5nIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLiBSZWNlaXZlZCB0eXBlICcrIiIuY29uY2F0KF90eXBlb2Yoc3RyaW5nKSwiICgiKS5jb25jYXQoaW5zcGVjdChzdHJpbmcpLCIpIik6KG1hdGNoPyJUaGUgaW5wdXQgZGlkIG5vdCBtYXRjaCB0aGUgcmVndWxhciBleHByZXNzaW9uICI6IlRoZSBpbnB1dCB3YXMgZXhwZWN0ZWQgdG8gbm90IG1hdGNoIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gIikrIiIuY29uY2F0KGluc3BlY3QocmVnZXhwKSwiLiBJbnB1dDpcblxuIikuY29uY2F0KGluc3BlY3Qoc3RyaW5nKSwiXG4iKSk7dmFyIGVycj1uZXcgQXNzZXJ0aW9uRXJyb3Ioe2FjdHVhbDpzdHJpbmcsZXhwZWN0ZWQ6cmVnZXhwLG1lc3NhZ2Usb3BlcmF0b3I6Zm5OYW1lLHN0YWNrU3RhcnRGbjpmbn0pO3Rocm93IGVyci5nZW5lcmF0ZWRNZXNzYWdlPWdlbmVyYXRlZE1lc3NhZ2UsZXJyfX1mdW5jdGlvbiBzdHJpY3QoKXtmb3IodmFyIF9sZW42PWFyZ3VtZW50cy5sZW5ndGgsYXJncz1uZXcgQXJyYXkoX2xlbjYpLF9rZXk2PTA7X2tleTY8X2xlbjY7X2tleTYrKylhcmdzW19rZXk2XT1hcmd1bWVudHNbX2tleTZdO2lubmVyT2suYXBwbHkodm9pZCAwLFtzdHJpY3QsYXJncy5sZW5ndGhdLmNvbmNhdChhcmdzKSl9YXNzZXJ0LnRocm93cz1mdW5jdGlvbiB0aHJvd3MocHJvbWlzZUZuKXtmb3IodmFyIF9sZW4yPWFyZ3VtZW50cy5sZW5ndGgsYXJncz1uZXcgQXJyYXkoX2xlbjI+MT9fbGVuMi0xOjApLF9rZXkyPTE7X2tleTI8X2xlbjI7X2tleTIrKylhcmdzW19rZXkyLTFdPWFyZ3VtZW50c1tfa2V5Ml07ZXhwZWN0c0Vycm9yLmFwcGx5KHZvaWQgMCxbdGhyb3dzLGdldEFjdHVhbChwcm9taXNlRm4pXS5jb25jYXQoYXJncykpfSxhc3NlcnQucmVqZWN0cz1mdW5jdGlvbiByZWplY3RzKHByb21pc2VGbil7Zm9yKHZhciBfbGVuMz1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9bmV3IEFycmF5KF9sZW4zPjE/X2xlbjMtMTowKSxfa2V5Mz0xO19rZXkzPF9sZW4zO19rZXkzKyspYXJnc1tfa2V5My0xXT1hcmd1bWVudHNbX2tleTNdO3JldHVybiB3YWl0Rm9yQWN0dWFsKHByb21pc2VGbikudGhlbihmdW5jdGlvbihyZXN1bHQpe3JldHVybiBleHBlY3RzRXJyb3IuYXBwbHkodm9pZCAwLFtyZWplY3RzLHJlc3VsdF0uY29uY2F0KGFyZ3MpKX0pfSxhc3NlcnQuZG9lc05vdFRocm93PWZ1bmN0aW9uIGRvZXNOb3RUaHJvdyhmbil7Zm9yKHZhciBfbGVuND1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9bmV3IEFycmF5KF9sZW40PjE/X2xlbjQtMTowKSxfa2V5ND0xO19rZXk0PF9sZW40O19rZXk0KyspYXJnc1tfa2V5NC0xXT1hcmd1bWVudHNbX2tleTRdO2V4cGVjdHNOb0Vycm9yLmFwcGx5KHZvaWQgMCxbZG9lc05vdFRocm93LGdldEFjdHVhbChmbildLmNvbmNhdChhcmdzKSl9LGFzc2VydC5kb2VzTm90UmVqZWN0PWZ1bmN0aW9uIGRvZXNOb3RSZWplY3QoZm4pe2Zvcih2YXIgX2xlbjU9YXJndW1lbnRzLmxlbmd0aCxhcmdzPW5ldyBBcnJheShfbGVuNT4xP19sZW41LTE6MCksX2tleTU9MTtfa2V5NTxfbGVuNTtfa2V5NSsrKWFyZ3NbX2tleTUtMV09YXJndW1lbnRzW19rZXk1XTtyZXR1cm4gd2FpdEZvckFjdHVhbChmbikudGhlbihmdW5jdGlvbihyZXN1bHQpe3JldHVybiBleHBlY3RzTm9FcnJvci5hcHBseSh2b2lkIDAsW2RvZXNOb3RSZWplY3QscmVzdWx0XS5jb25jYXQoYXJncykpfSl9LGFzc2VydC5pZkVycm9yPWZ1bmN0aW9uIGlmRXJyb3IoZXJyKXtpZihudWxsIT1lcnIpe3ZhciBtZXNzYWdlPSJpZkVycm9yIGdvdCB1bndhbnRlZCBleGNlcHRpb246ICI7Im9iamVjdCI9PT1fdHlwZW9mKGVycikmJiJzdHJpbmciPT10eXBlb2YgZXJyLm1lc3NhZ2U/MD09PWVyci5tZXNzYWdlLmxlbmd0aCYmZXJyLmNvbnN0cnVjdG9yP21lc3NhZ2UrPWVyci5jb25zdHJ1Y3Rvci5uYW1lOm1lc3NhZ2UrPWVyci5tZXNzYWdlOm1lc3NhZ2UrPWluc3BlY3QoZXJyKTt2YXIgbmV3RXJyPW5ldyBBc3NlcnRpb25FcnJvcih7YWN0dWFsOmVycixleHBlY3RlZDpudWxsLG9wZXJhdG9yOiJpZkVycm9yIixtZXNzYWdlLHN0YWNrU3RhcnRGbjppZkVycm9yfSksb3JpZ1N0YWNrPWVyci5zdGFjaztpZigic3RyaW5nIj09dHlwZW9mIG9yaWdTdGFjayl7dmFyIHRtcDI9b3JpZ1N0YWNrLnNwbGl0KCJcbiIpO3RtcDIuc2hpZnQoKTtmb3IodmFyIHRtcDE9bmV3RXJyLnN0YWNrLnNwbGl0KCJcbiIpLGk9MDtpPHRtcDIubGVuZ3RoO2krKyl7dmFyIHBvcz10bXAxLmluZGV4T2YodG1wMltpXSk7aWYoLTEhPT1wb3Mpe3RtcDE9dG1wMS5zbGljZSgwLHBvcyk7YnJlYWt9fW5ld0Vyci5zdGFjaz0iIi5jb25jYXQodG1wMS5qb2luKCJcbiIpLCJcbiIpLmNvbmNhdCh0bXAyLmpvaW4oIlxuIikpfXRocm93IG5ld0Vycn19LGFzc2VydC5tYXRjaD1mdW5jdGlvbiBtYXRjaChzdHJpbmcscmVnZXhwLG1lc3NhZ2Upe2ludGVybmFsTWF0Y2goc3RyaW5nLHJlZ2V4cCxtZXNzYWdlLG1hdGNoLCJtYXRjaCIpfSxhc3NlcnQuZG9lc05vdE1hdGNoPWZ1bmN0aW9uIGRvZXNOb3RNYXRjaChzdHJpbmcscmVnZXhwLG1lc3NhZ2Upe2ludGVybmFsTWF0Y2goc3RyaW5nLHJlZ2V4cCxtZXNzYWdlLGRvZXNOb3RNYXRjaCwiZG9lc05vdE1hdGNoIil9LGFzc2VydC5zdHJpY3Q9b2JqZWN0QXNzaWduKHN0cmljdCxhc3NlcnQse2VxdWFsOmFzc2VydC5zdHJpY3RFcXVhbCxkZWVwRXF1YWw6YXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCxub3RFcXVhbDphc3NlcnQubm90U3RyaWN0RXF1YWwsbm90RGVlcEVxdWFsOmFzc2VydC5ub3REZWVwU3RyaWN0RXF1YWx9KSxhc3NlcnQuc3RyaWN0LnN0cmljdD1hc3NlcnQuc3RyaWN0fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2Fzc2VydC9idWlsZC9pbnRlcm5hbC9hc3NlcnQvYXNzZXJ0aW9uX2Vycm9yLmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgcHJvY2Vzcz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbm9kZS1zdGRsaWItYnJvd3Nlci9janMvcHJveHkvcHJvY2Vzcy5qcyIpO2Z1bmN0aW9uIG93bktleXMoZSxyKXt2YXIgdD1PYmplY3Qua2V5cyhlKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgbz1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO3ImJihvPW8uZmlsdGVyKGZ1bmN0aW9uKHIpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUscikuZW51bWVyYWJsZX0pKSx0LnB1c2guYXBwbHkodCxvKX1yZXR1cm4gdH1mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKGUpe2Zvcih2YXIgcj0xO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspe3ZhciB0PW51bGwhPWFyZ3VtZW50c1tyXT9hcmd1bWVudHNbcl06e307ciUyP293bktleXMoT2JqZWN0KHQpLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe19kZWZpbmVQcm9wZXJ0eShlLHIsdFtyXSl9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKTpvd25LZXlzKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbihyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxyKSl9KX1yZXR1cm4gZX1mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLGtleSx2YWx1ZSl7cmV0dXJuKGtleT1fdG9Qcm9wZXJ0eUtleShrZXkpKWluIG9iaj9PYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLGtleSx7dmFsdWUsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTpvYmpba2V5XT12YWx1ZSxvYmp9ZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fCExLGRlc2NyaXB0b3IuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBkZXNjcmlwdG9yJiYoZGVzY3JpcHRvci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxfdG9Qcm9wZXJ0eUtleShkZXNjcmlwdG9yLmtleSksZGVzY3JpcHRvcil9fWZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KGFyZyl7dmFyIGtleT1mdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsaGludCl7aWYoIm9iamVjdCIhPT1fdHlwZW9mKGlucHV0KXx8bnVsbD09PWlucHV0KXJldHVybiBpbnB1dDt2YXIgcHJpbT1pbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdO2lmKHZvaWQgMCE9PXByaW0pe3ZhciByZXM9cHJpbS5jYWxsKGlucHV0LGhpbnR8fCJkZWZhdWx0Iik7aWYoIm9iamVjdCIhPT1fdHlwZW9mKHJlcykpcmV0dXJuIHJlczt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybigic3RyaW5nIj09PWhpbnQ/U3RyaW5nOk51bWJlcikoaW5wdXQpfShhcmcsInN0cmluZyIpO3JldHVybiJzeW1ib2wiPT09X3R5cGVvZihrZXkpP2tleTpTdHJpbmcoa2V5KX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKGNhbGwmJigib2JqZWN0Ij09PV90eXBlb2YoY2FsbCl8fCJmdW5jdGlvbiI9PXR5cGVvZiBjYWxsKSlyZXR1cm4gY2FsbDtpZih2b2lkIDAhPT1jYWxsKXRocm93IG5ldyBUeXBlRXJyb3IoIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkIik7cmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZil9ZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKXtpZih2b2lkIDA9PT1zZWxmKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIHNlbGZ9ZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcihDbGFzcyl7dmFyIF9jYWNoZT0iZnVuY3Rpb24iPT10eXBlb2YgTWFwP25ldyBNYXA6dm9pZCAwO3JldHVybiBfd3JhcE5hdGl2ZVN1cGVyPWZ1bmN0aW9uIF93cmFwTmF0aXZlU3VwZXIoQ2xhc3Mpe2lmKG51bGw9PT1DbGFzc3x8IWZ1bmN0aW9uIF9pc05hdGl2ZUZ1bmN0aW9uKGZuKXtyZXR1cm4tMSE9PUZ1bmN0aW9uLnRvU3RyaW5nLmNhbGwoZm4pLmluZGV4T2YoIltuYXRpdmUgY29kZV0iKX0oQ2xhc3MpKXJldHVybiBDbGFzcztpZigiZnVuY3Rpb24iIT10eXBlb2YgQ2xhc3MpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTtpZih2b2lkIDAhPT1fY2FjaGUpe2lmKF9jYWNoZS5oYXMoQ2xhc3MpKXJldHVybiBfY2FjaGUuZ2V0KENsYXNzKTtfY2FjaGUuc2V0KENsYXNzLFdyYXBwZXIpfWZ1bmN0aW9uIFdyYXBwZXIoKXtyZXR1cm4gX2NvbnN0cnVjdChDbGFzcyxhcmd1bWVudHMsX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yKX1yZXR1cm4gV3JhcHBlci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShDbGFzcy5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpXcmFwcGVyLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLF9zZXRQcm90b3R5cGVPZihXcmFwcGVyLENsYXNzKX0sX3dyYXBOYXRpdmVTdXBlcihDbGFzcyl9ZnVuY3Rpb24gX2NvbnN0cnVjdChQYXJlbnQsYXJncyxDbGFzcyl7cmV0dXJuIF9jb25zdHJ1Y3Q9X2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpP1JlZmxlY3QuY29uc3RydWN0LmJpbmQoKTpmdW5jdGlvbiBfY29uc3RydWN0KFBhcmVudCxhcmdzLENsYXNzKXt2YXIgYT1bbnVsbF07YS5wdXNoLmFwcGx5KGEsYXJncyk7dmFyIGluc3RhbmNlPW5ldyhGdW5jdGlvbi5iaW5kLmFwcGx5KFBhcmVudCxhKSk7cmV0dXJuIENsYXNzJiZfc2V0UHJvdG90eXBlT2YoaW5zdGFuY2UsQ2xhc3MucHJvdG90eXBlKSxpbnN0YW5jZX0sX2NvbnN0cnVjdC5hcHBseShudWxsLGFyZ3VtZW50cyl9ZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0KXJldHVybiExO2lmKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2goZSl7cmV0dXJuITF9fWZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLHApe3JldHVybiBfc2V0UHJvdG90eXBlT2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZi5iaW5kKCk6ZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8scCl7cmV0dXJuIG8uX19wcm90b19fPXAsb30sX3NldFByb3RvdHlwZU9mKG8scCl9ZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pe3JldHVybiBfZ2V0UHJvdG90eXBlT2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZi5iaW5kKCk6ZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pe3JldHVybiBvLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKG8pfSxfZ2V0UHJvdG90eXBlT2Yobyl9ZnVuY3Rpb24gX3R5cGVvZihvKXtyZXR1cm4gX3R5cGVvZj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihvKXtyZXR1cm4gdHlwZW9mIG99OmZ1bmN0aW9uKG8pe3JldHVybiBvJiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZvLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZvIT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2Ygb30sX3R5cGVvZihvKX12YXIgaW5zcGVjdD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvdXRpbC91dGlsLmpzIikuaW5zcGVjdCxFUlJfSU5WQUxJRF9BUkdfVFlQRT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYXNzZXJ0L2J1aWxkL2ludGVybmFsL2Vycm9ycy5qcyIpLmNvZGVzLkVSUl9JTlZBTElEX0FSR19UWVBFO2Z1bmN0aW9uIGVuZHNXaXRoKHN0cixzZWFyY2gsdGhpc19sZW4pe3JldHVybih2b2lkIDA9PT10aGlzX2xlbnx8dGhpc19sZW4+c3RyLmxlbmd0aCkmJih0aGlzX2xlbj1zdHIubGVuZ3RoKSxzdHIuc3Vic3RyaW5nKHRoaXNfbGVuLXNlYXJjaC5sZW5ndGgsdGhpc19sZW4pPT09c2VhcmNofXZhciBibHVlPSIiLGdyZWVuPSIiLHJlZD0iIix3aGl0ZT0iIixrUmVhZGFibGVPcGVyYXRvcj17ZGVlcFN0cmljdEVxdWFsOiJFeHBlY3RlZCB2YWx1ZXMgdG8gYmUgc3RyaWN0bHkgZGVlcC1lcXVhbDoiLHN0cmljdEVxdWFsOiJFeHBlY3RlZCB2YWx1ZXMgdG8gYmUgc3RyaWN0bHkgZXF1YWw6IixzdHJpY3RFcXVhbE9iamVjdDonRXhwZWN0ZWQgImFjdHVhbCIgdG8gYmUgcmVmZXJlbmNlLWVxdWFsIHRvICJleHBlY3RlZCI6JyxkZWVwRXF1YWw6IkV4cGVjdGVkIHZhbHVlcyB0byBiZSBsb29zZWx5IGRlZXAtZXF1YWw6IixlcXVhbDoiRXhwZWN0ZWQgdmFsdWVzIHRvIGJlIGxvb3NlbHkgZXF1YWw6Iixub3REZWVwU3RyaWN0RXF1YWw6J0V4cGVjdGVkICJhY3R1YWwiIG5vdCB0byBiZSBzdHJpY3RseSBkZWVwLWVxdWFsIHRvOicsbm90U3RyaWN0RXF1YWw6J0V4cGVjdGVkICJhY3R1YWwiIHRvIGJlIHN0cmljdGx5IHVuZXF1YWwgdG86Jyxub3RTdHJpY3RFcXVhbE9iamVjdDonRXhwZWN0ZWQgImFjdHVhbCIgbm90IHRvIGJlIHJlZmVyZW5jZS1lcXVhbCB0byAiZXhwZWN0ZWQiOicsbm90RGVlcEVxdWFsOidFeHBlY3RlZCAiYWN0dWFsIiBub3QgdG8gYmUgbG9vc2VseSBkZWVwLWVxdWFsIHRvOicsbm90RXF1YWw6J0V4cGVjdGVkICJhY3R1YWwiIHRvIGJlIGxvb3NlbHkgdW5lcXVhbCB0bzonLG5vdElkZW50aWNhbDoiVmFsdWVzIGlkZW50aWNhbCBidXQgbm90IHJlZmVyZW5jZS1lcXVhbDoifTtmdW5jdGlvbiBjb3B5RXJyb3Ioc291cmNlKXt2YXIga2V5cz1PYmplY3Qua2V5cyhzb3VyY2UpLHRhcmdldD1PYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihzb3VyY2UpKTtyZXR1cm4ga2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSl7dGFyZ2V0W2tleV09c291cmNlW2tleV19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCJtZXNzYWdlIix7dmFsdWU6c291cmNlLm1lc3NhZ2V9KSx0YXJnZXR9ZnVuY3Rpb24gaW5zcGVjdFZhbHVlKHZhbCl7cmV0dXJuIGluc3BlY3QodmFsLHtjb21wYWN0OiExLGN1c3RvbUluc3BlY3Q6ITEsZGVwdGg6MWUzLG1heEFycmF5TGVuZ3RoOjEvMCxzaG93SGlkZGVuOiExLGJyZWFrTGVuZ3RoOjEvMCxzaG93UHJveHk6ITEsc29ydGVkOiEwLGdldHRlcnM6ITB9KX1mdW5jdGlvbiBjcmVhdGVFcnJEaWZmKGFjdHVhbCxleHBlY3RlZCxvcGVyYXRvcil7dmFyIG90aGVyPSIiLHJlcz0iIixsYXN0UG9zPTAsZW5kPSIiLHNraXBwZWQ9ITEsYWN0dWFsSW5zcGVjdGVkPWluc3BlY3RWYWx1ZShhY3R1YWwpLGFjdHVhbExpbmVzPWFjdHVhbEluc3BlY3RlZC5zcGxpdCgiXG4iKSxleHBlY3RlZExpbmVzPWluc3BlY3RWYWx1ZShleHBlY3RlZCkuc3BsaXQoIlxuIiksaT0wLGluZGljYXRvcj0iIjtpZigic3RyaWN0RXF1YWwiPT09b3BlcmF0b3ImJiJvYmplY3QiPT09X3R5cGVvZihhY3R1YWwpJiYib2JqZWN0Ij09PV90eXBlb2YoZXhwZWN0ZWQpJiZudWxsIT09YWN0dWFsJiZudWxsIT09ZXhwZWN0ZWQmJihvcGVyYXRvcj0ic3RyaWN0RXF1YWxPYmplY3QiKSwxPT09YWN0dWFsTGluZXMubGVuZ3RoJiYxPT09ZXhwZWN0ZWRMaW5lcy5sZW5ndGgmJmFjdHVhbExpbmVzWzBdIT09ZXhwZWN0ZWRMaW5lc1swXSl7dmFyIGlucHV0TGVuZ3RoPWFjdHVhbExpbmVzWzBdLmxlbmd0aCtleHBlY3RlZExpbmVzWzBdLmxlbmd0aDtpZihpbnB1dExlbmd0aDw9MTApe2lmKCEoIm9iamVjdCI9PT1fdHlwZW9mKGFjdHVhbCkmJm51bGwhPT1hY3R1YWx8fCJvYmplY3QiPT09X3R5cGVvZihleHBlY3RlZCkmJm51bGwhPT1leHBlY3RlZHx8MD09PWFjdHVhbCYmMD09PWV4cGVjdGVkKSlyZXR1cm4iIi5jb25jYXQoa1JlYWRhYmxlT3BlcmF0b3Jbb3BlcmF0b3JdLCJcblxuIikrIiIuY29uY2F0KGFjdHVhbExpbmVzWzBdLCIgIT09ICIpLmNvbmNhdChleHBlY3RlZExpbmVzWzBdLCJcbiIpfWVsc2UgaWYoInN0cmljdEVxdWFsT2JqZWN0IiE9PW9wZXJhdG9yKXtpZihpbnB1dExlbmd0aDwocHJvY2Vzcy5zdGRlcnImJnByb2Nlc3Muc3RkZXJyLmlzVFRZP3Byb2Nlc3Muc3RkZXJyLmNvbHVtbnM6ODApKXtmb3IoO2FjdHVhbExpbmVzWzBdW2ldPT09ZXhwZWN0ZWRMaW5lc1swXVtpXTspaSsrO2k+MiYmKGluZGljYXRvcj0iXG4gICIuY29uY2F0KGZ1bmN0aW9uIHJlcGVhdChzdHIsY291bnQpe2lmKGNvdW50PU1hdGguZmxvb3IoY291bnQpLDA9PXN0ci5sZW5ndGh8fDA9PWNvdW50KXJldHVybiIiO3ZhciBtYXhDb3VudD1zdHIubGVuZ3RoKmNvdW50O2Zvcihjb3VudD1NYXRoLmZsb29yKE1hdGgubG9nKGNvdW50KS9NYXRoLmxvZygyKSk7Y291bnQ7KXN0cis9c3RyLGNvdW50LS07cmV0dXJuIHN0citzdHIuc3Vic3RyaW5nKDAsbWF4Q291bnQtc3RyLmxlbmd0aCl9KCIgIixpKSwiXiIpLGk9MCl9fX1mb3IodmFyIGE9YWN0dWFsTGluZXNbYWN0dWFsTGluZXMubGVuZ3RoLTFdLGI9ZXhwZWN0ZWRMaW5lc1tleHBlY3RlZExpbmVzLmxlbmd0aC0xXTthPT09YiYmKGkrKzwyP2VuZD0iXG4gICIuY29uY2F0KGEpLmNvbmNhdChlbmQpOm90aGVyPWEsYWN0dWFsTGluZXMucG9wKCksZXhwZWN0ZWRMaW5lcy5wb3AoKSwwIT09YWN0dWFsTGluZXMubGVuZ3RoJiYwIT09ZXhwZWN0ZWRMaW5lcy5sZW5ndGgpOylhPWFjdHVhbExpbmVzW2FjdHVhbExpbmVzLmxlbmd0aC0xXSxiPWV4cGVjdGVkTGluZXNbZXhwZWN0ZWRMaW5lcy5sZW5ndGgtMV07dmFyIG1heExpbmVzPU1hdGgubWF4KGFjdHVhbExpbmVzLmxlbmd0aCxleHBlY3RlZExpbmVzLmxlbmd0aCk7aWYoMD09PW1heExpbmVzKXt2YXIgX2FjdHVhbExpbmVzPWFjdHVhbEluc3BlY3RlZC5zcGxpdCgiXG4iKTtpZihfYWN0dWFsTGluZXMubGVuZ3RoPjMwKWZvcihfYWN0dWFsTGluZXNbMjZdPSIiLmNvbmNhdChibHVlLCIuLi4iKS5jb25jYXQod2hpdGUpO19hY3R1YWxMaW5lcy5sZW5ndGg+Mjc7KV9hY3R1YWxMaW5lcy5wb3AoKTtyZXR1cm4iIi5jb25jYXQoa1JlYWRhYmxlT3BlcmF0b3Iubm90SWRlbnRpY2FsLCJcblxuIikuY29uY2F0KF9hY3R1YWxMaW5lcy5qb2luKCJcbiIpLCJcbiIpfWk+MyYmKGVuZD0iXG4iLmNvbmNhdChibHVlLCIuLi4iKS5jb25jYXQod2hpdGUpLmNvbmNhdChlbmQpLHNraXBwZWQ9ITApLCIiIT09b3RoZXImJihlbmQ9IlxuICAiLmNvbmNhdChvdGhlcikuY29uY2F0KGVuZCksb3RoZXI9IiIpO3ZhciBwcmludGVkTGluZXM9MCxtc2c9a1JlYWRhYmxlT3BlcmF0b3Jbb3BlcmF0b3JdKyJcbiIuY29uY2F0KGdyZWVuLCIrIGFjdHVhbCIpLmNvbmNhdCh3aGl0ZSwiICIpLmNvbmNhdChyZWQsIi0gZXhwZWN0ZWQiKS5jb25jYXQod2hpdGUpLHNraXBwZWRNc2c9IiAiLmNvbmNhdChibHVlLCIuLi4iKS5jb25jYXQod2hpdGUsIiBMaW5lcyBza2lwcGVkIik7Zm9yKGk9MDtpPG1heExpbmVzO2krKyl7dmFyIGN1cj1pLWxhc3RQb3M7aWYoYWN0dWFsTGluZXMubGVuZ3RoPGkrMSljdXI+MSYmaT4yJiYoY3VyPjQ/KHJlcys9IlxuIi5jb25jYXQoYmx1ZSwiLi4uIikuY29uY2F0KHdoaXRlKSxza2lwcGVkPSEwKTpjdXI+MyYmKHJlcys9IlxuICAiLmNvbmNhdChleHBlY3RlZExpbmVzW2ktMl0pLHByaW50ZWRMaW5lcysrKSxyZXMrPSJcbiAgIi5jb25jYXQoZXhwZWN0ZWRMaW5lc1tpLTFdKSxwcmludGVkTGluZXMrKyksbGFzdFBvcz1pLG90aGVyKz0iXG4iLmNvbmNhdChyZWQsIi0iKS5jb25jYXQod2hpdGUsIiAiKS5jb25jYXQoZXhwZWN0ZWRMaW5lc1tpXSkscHJpbnRlZExpbmVzKys7ZWxzZSBpZihleHBlY3RlZExpbmVzLmxlbmd0aDxpKzEpY3VyPjEmJmk+MiYmKGN1cj40PyhyZXMrPSJcbiIuY29uY2F0KGJsdWUsIi4uLiIpLmNvbmNhdCh3aGl0ZSksc2tpcHBlZD0hMCk6Y3VyPjMmJihyZXMrPSJcbiAgIi5jb25jYXQoYWN0dWFsTGluZXNbaS0yXSkscHJpbnRlZExpbmVzKyspLHJlcys9IlxuICAiLmNvbmNhdChhY3R1YWxMaW5lc1tpLTFdKSxwcmludGVkTGluZXMrKyksbGFzdFBvcz1pLHJlcys9IlxuIi5jb25jYXQoZ3JlZW4sIisiKS5jb25jYXQod2hpdGUsIiAiKS5jb25jYXQoYWN0dWFsTGluZXNbaV0pLHByaW50ZWRMaW5lcysrO2Vsc2V7dmFyIGV4cGVjdGVkTGluZT1leHBlY3RlZExpbmVzW2ldLGFjdHVhbExpbmU9YWN0dWFsTGluZXNbaV0sZGl2ZXJnaW5nTGluZXM9YWN0dWFsTGluZSE9PWV4cGVjdGVkTGluZSYmKCFlbmRzV2l0aChhY3R1YWxMaW5lLCIsIil8fGFjdHVhbExpbmUuc2xpY2UoMCwtMSkhPT1leHBlY3RlZExpbmUpO2RpdmVyZ2luZ0xpbmVzJiZlbmRzV2l0aChleHBlY3RlZExpbmUsIiwiKSYmZXhwZWN0ZWRMaW5lLnNsaWNlKDAsLTEpPT09YWN0dWFsTGluZSYmKGRpdmVyZ2luZ0xpbmVzPSExLGFjdHVhbExpbmUrPSIsIiksZGl2ZXJnaW5nTGluZXM/KGN1cj4xJiZpPjImJihjdXI+ND8ocmVzKz0iXG4iLmNvbmNhdChibHVlLCIuLi4iKS5jb25jYXQod2hpdGUpLHNraXBwZWQ9ITApOmN1cj4zJiYocmVzKz0iXG4gICIuY29uY2F0KGFjdHVhbExpbmVzW2ktMl0pLHByaW50ZWRMaW5lcysrKSxyZXMrPSJcbiAgIi5jb25jYXQoYWN0dWFsTGluZXNbaS0xXSkscHJpbnRlZExpbmVzKyspLGxhc3RQb3M9aSxyZXMrPSJcbiIuY29uY2F0KGdyZWVuLCIrIikuY29uY2F0KHdoaXRlLCIgIikuY29uY2F0KGFjdHVhbExpbmUpLG90aGVyKz0iXG4iLmNvbmNhdChyZWQsIi0iKS5jb25jYXQod2hpdGUsIiAiKS5jb25jYXQoZXhwZWN0ZWRMaW5lKSxwcmludGVkTGluZXMrPTIpOihyZXMrPW90aGVyLG90aGVyPSIiLDEhPT1jdXImJjAhPT1pfHwocmVzKz0iXG4gICIuY29uY2F0KGFjdHVhbExpbmUpLHByaW50ZWRMaW5lcysrKSl9aWYocHJpbnRlZExpbmVzPjIwJiZpPG1heExpbmVzLTIpcmV0dXJuIiIuY29uY2F0KG1zZykuY29uY2F0KHNraXBwZWRNc2csIlxuIikuY29uY2F0KHJlcywiXG4iKS5jb25jYXQoYmx1ZSwiLi4uIikuY29uY2F0KHdoaXRlKS5jb25jYXQob3RoZXIsIlxuIikrIiIuY29uY2F0KGJsdWUsIi4uLiIpLmNvbmNhdCh3aGl0ZSl9cmV0dXJuIiIuY29uY2F0KG1zZykuY29uY2F0KHNraXBwZWQ/c2tpcHBlZE1zZzoiIiwiXG4iKS5jb25jYXQocmVzKS5jb25jYXQob3RoZXIpLmNvbmNhdChlbmQpLmNvbmNhdChpbmRpY2F0b3IpfXZhciBBc3NlcnRpb25FcnJvcj1mdW5jdGlvbihfRXJyb3IsX2luc3BlY3QkY3VzdG9tKXshZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLHN1cGVyQ2xhc3Mpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBzdXBlckNsYXNzJiZudWxsIT09c3VwZXJDbGFzcyl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO3N1YkNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MmJnN1cGVyQ2xhc3MucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6c3ViQ2xhc3Msd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzdWJDbGFzcywicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSxzdXBlckNsYXNzJiZfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3Msc3VwZXJDbGFzcyl9KEFzc2VydGlvbkVycm9yLF9FcnJvcik7dmFyIF9zdXBlcj1mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCl7dmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3Q9X2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpO3JldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpe3ZhciByZXN1bHQsU3VwZXI9X2dldFByb3RvdHlwZU9mKERlcml2ZWQpO2lmKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3Qpe3ZhciBOZXdUYXJnZXQ9X2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yO3Jlc3VsdD1SZWZsZWN0LmNvbnN0cnVjdChTdXBlcixhcmd1bWVudHMsTmV3VGFyZ2V0KX1lbHNlIHJlc3VsdD1TdXBlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMscmVzdWx0KX19KEFzc2VydGlvbkVycm9yKTtmdW5jdGlvbiBBc3NlcnRpb25FcnJvcihvcHRpb25zKXt2YXIgX3RoaXM7aWYoZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLENvbnN0cnVjdG9yKXtpZighKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfSh0aGlzLEFzc2VydGlvbkVycm9yKSwib2JqZWN0IiE9PV90eXBlb2Yob3B0aW9ucyl8fG51bGw9PT1vcHRpb25zKXRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgib3B0aW9ucyIsIk9iamVjdCIsb3B0aW9ucyk7dmFyIG1lc3NhZ2U9b3B0aW9ucy5tZXNzYWdlLG9wZXJhdG9yPW9wdGlvbnMub3BlcmF0b3Isc3RhY2tTdGFydEZuPW9wdGlvbnMuc3RhY2tTdGFydEZuLGFjdHVhbD1vcHRpb25zLmFjdHVhbCxleHBlY3RlZD1vcHRpb25zLmV4cGVjdGVkLGxpbWl0PUVycm9yLnN0YWNrVHJhY2VMaW1pdDtpZihFcnJvci5zdGFja1RyYWNlTGltaXQ9MCxudWxsIT1tZXNzYWdlKV90aGlzPV9zdXBlci5jYWxsKHRoaXMsU3RyaW5nKG1lc3NhZ2UpKTtlbHNlIGlmKHByb2Nlc3Muc3RkZXJyJiZwcm9jZXNzLnN0ZGVyci5pc1RUWSYmKHByb2Nlc3Muc3RkZXJyJiZwcm9jZXNzLnN0ZGVyci5nZXRDb2xvckRlcHRoJiYxIT09cHJvY2Vzcy5zdGRlcnIuZ2V0Q29sb3JEZXB0aCgpPyhibHVlPSIbWzM0bSIsZ3JlZW49IhtbMzJtIix3aGl0ZT0iG1szOW0iLHJlZD0iG1szMW0iKTooYmx1ZT0iIixncmVlbj0iIix3aGl0ZT0iIixyZWQ9IiIpKSwib2JqZWN0Ij09PV90eXBlb2YoYWN0dWFsKSYmbnVsbCE9PWFjdHVhbCYmIm9iamVjdCI9PT1fdHlwZW9mKGV4cGVjdGVkKSYmbnVsbCE9PWV4cGVjdGVkJiYic3RhY2siaW4gYWN0dWFsJiZhY3R1YWwgaW5zdGFuY2VvZiBFcnJvciYmInN0YWNrImluIGV4cGVjdGVkJiZleHBlY3RlZCBpbnN0YW5jZW9mIEVycm9yJiYoYWN0dWFsPWNvcHlFcnJvcihhY3R1YWwpLGV4cGVjdGVkPWNvcHlFcnJvcihleHBlY3RlZCkpLCJkZWVwU3RyaWN0RXF1YWwiPT09b3BlcmF0b3J8fCJzdHJpY3RFcXVhbCI9PT1vcGVyYXRvcilfdGhpcz1fc3VwZXIuY2FsbCh0aGlzLGNyZWF0ZUVyckRpZmYoYWN0dWFsLGV4cGVjdGVkLG9wZXJhdG9yKSk7ZWxzZSBpZigibm90RGVlcFN0cmljdEVxdWFsIj09PW9wZXJhdG9yfHwibm90U3RyaWN0RXF1YWwiPT09b3BlcmF0b3Ipe3ZhciBiYXNlPWtSZWFkYWJsZU9wZXJhdG9yW29wZXJhdG9yXSxyZXM9aW5zcGVjdFZhbHVlKGFjdHVhbCkuc3BsaXQoIlxuIik7aWYoIm5vdFN0cmljdEVxdWFsIj09PW9wZXJhdG9yJiYib2JqZWN0Ij09PV90eXBlb2YoYWN0dWFsKSYmbnVsbCE9PWFjdHVhbCYmKGJhc2U9a1JlYWRhYmxlT3BlcmF0b3Iubm90U3RyaWN0RXF1YWxPYmplY3QpLHJlcy5sZW5ndGg+MzApZm9yKHJlc1syNl09IiIuY29uY2F0KGJsdWUsIi4uLiIpLmNvbmNhdCh3aGl0ZSk7cmVzLmxlbmd0aD4yNzspcmVzLnBvcCgpO190aGlzPTE9PT1yZXMubGVuZ3RoP19zdXBlci5jYWxsKHRoaXMsIiIuY29uY2F0KGJhc2UsIiAiKS5jb25jYXQocmVzWzBdKSk6X3N1cGVyLmNhbGwodGhpcywiIi5jb25jYXQoYmFzZSwiXG5cbiIpLmNvbmNhdChyZXMuam9pbigiXG4iKSwiXG4iKSl9ZWxzZXt2YXIgX3Jlcz1pbnNwZWN0VmFsdWUoYWN0dWFsKSxvdGhlcj0iIixrbm93bk9wZXJhdG9ycz1rUmVhZGFibGVPcGVyYXRvcltvcGVyYXRvcl07Im5vdERlZXBFcXVhbCI9PT1vcGVyYXRvcnx8Im5vdEVxdWFsIj09PW9wZXJhdG9yPyhfcmVzPSIiLmNvbmNhdChrUmVhZGFibGVPcGVyYXRvcltvcGVyYXRvcl0sIlxuXG4iKS5jb25jYXQoX3JlcykpLmxlbmd0aD4xMDI0JiYoX3Jlcz0iIi5jb25jYXQoX3Jlcy5zbGljZSgwLDEwMjEpLCIuLi4iKSk6KG90aGVyPSIiLmNvbmNhdChpbnNwZWN0VmFsdWUoZXhwZWN0ZWQpKSxfcmVzLmxlbmd0aD41MTImJihfcmVzPSIiLmNvbmNhdChfcmVzLnNsaWNlKDAsNTA5KSwiLi4uIikpLG90aGVyLmxlbmd0aD41MTImJihvdGhlcj0iIi5jb25jYXQob3RoZXIuc2xpY2UoMCw1MDkpLCIuLi4iKSksImRlZXBFcXVhbCI9PT1vcGVyYXRvcnx8ImVxdWFsIj09PW9wZXJhdG9yP19yZXM9IiIuY29uY2F0KGtub3duT3BlcmF0b3JzLCJcblxuIikuY29uY2F0KF9yZXMsIlxuXG5zaG91bGQgZXF1YWxcblxuIik6b3RoZXI9IiAiLmNvbmNhdChvcGVyYXRvciwiICIpLmNvbmNhdChvdGhlcikpLF90aGlzPV9zdXBlci5jYWxsKHRoaXMsIiIuY29uY2F0KF9yZXMpLmNvbmNhdChvdGhlcikpfXJldHVybiBFcnJvci5zdGFja1RyYWNlTGltaXQ9bGltaXQsX3RoaXMuZ2VuZXJhdGVkTWVzc2FnZT0hbWVzc2FnZSxPYmplY3QuZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIm5hbWUiLHt2YWx1ZToiQXNzZXJ0aW9uRXJyb3IgW0VSUl9BU1NFUlRJT05dIixlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLF90aGlzLmNvZGU9IkVSUl9BU1NFUlRJT04iLF90aGlzLmFjdHVhbD1hY3R1YWwsX3RoaXMuZXhwZWN0ZWQ9ZXhwZWN0ZWQsX3RoaXMub3BlcmF0b3I9b3BlcmF0b3IsRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UmJkVycm9yLmNhcHR1cmVTdGFja1RyYWNlKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLHN0YWNrU3RhcnRGbiksX3RoaXMuc3RhY2ssX3RoaXMubmFtZT0iQXNzZXJ0aW9uRXJyb3IiLF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzKX1yZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLHByb3RvUHJvcHMsc3RhdGljUHJvcHMpe3JldHVybiBwcm90b1Byb3BzJiZfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUscHJvdG9Qcm9wcyksc3RhdGljUHJvcHMmJl9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLHN0YXRpY1Byb3BzKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksQ29uc3RydWN0b3J9KEFzc2VydGlvbkVycm9yLFt7a2V5OiJ0b1N0cmluZyIsdmFsdWU6ZnVuY3Rpb24gdG9TdHJpbmcoKXtyZXR1cm4iIi5jb25jYXQodGhpcy5uYW1lLCIgWyIpLmNvbmNhdCh0aGlzLmNvZGUsIl06ICIpLmNvbmNhdCh0aGlzLm1lc3NhZ2UpfX0se2tleTpfaW5zcGVjdCRjdXN0b20sdmFsdWU6ZnVuY3Rpb24gdmFsdWUocmVjdXJzZVRpbWVzLGN0eCl7cmV0dXJuIGluc3BlY3QodGhpcyxfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sY3R4KSx7fSx7Y3VzdG9tSW5zcGVjdDohMSxkZXB0aDowfSkpfX1dKSxBc3NlcnRpb25FcnJvcn0oX3dyYXBOYXRpdmVTdXBlcihFcnJvciksaW5zcGVjdC5jdXN0b20pO21vZHVsZS5leHBvcnRzPUFzc2VydGlvbkVycm9yfSwiLi4vLi4vbm9kZV9tb2R1bGVzL2Fzc2VydC9idWlsZC9pbnRlcm5hbC9lcnJvcnMuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIF90eXBlb2Yobyl7cmV0dXJuIF90eXBlb2Y9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24obyl7cmV0dXJuIHR5cGVvZiBvfTpmdW5jdGlvbihvKXtyZXR1cm4gbyYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmby5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmbyE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIG99LF90eXBlb2Yobyl9ZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fCExLGRlc2NyaXB0b3IuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBkZXNjcmlwdG9yJiYoZGVzY3JpcHRvci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxfdG9Qcm9wZXJ0eUtleShkZXNjcmlwdG9yLmtleSksZGVzY3JpcHRvcil9fWZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KGFyZyl7dmFyIGtleT1mdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsaGludCl7aWYoIm9iamVjdCIhPT1fdHlwZW9mKGlucHV0KXx8bnVsbD09PWlucHV0KXJldHVybiBpbnB1dDt2YXIgcHJpbT1pbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdO2lmKHZvaWQgMCE9PXByaW0pe3ZhciByZXM9cHJpbS5jYWxsKGlucHV0LGhpbnR8fCJkZWZhdWx0Iik7aWYoIm9iamVjdCIhPT1fdHlwZW9mKHJlcykpcmV0dXJuIHJlczt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybigic3RyaW5nIj09PWhpbnQ/U3RyaW5nOk51bWJlcikoaW5wdXQpfShhcmcsInN0cmluZyIpO3JldHVybiJzeW1ib2wiPT09X3R5cGVvZihrZXkpP2tleTpTdHJpbmcoa2V5KX1mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobyxwKXtyZXR1cm4gX3NldFByb3RvdHlwZU9mPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpOmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLHApe3JldHVybiBvLl9fcHJvdG9fXz1wLG99LF9zZXRQcm90b3R5cGVPZihvLHApfWZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKXt2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdD1mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuITE7aWYoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSlyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgUHJveHkpcmV0dXJuITA7dHJ5e3JldHVybiBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbixbXSxmdW5jdGlvbigpe30pKSwhMH1jYXRjaChlKXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCl7dmFyIHJlc3VsdCxTdXBlcj1fZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCk7aWYoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCl7dmFyIE5ld1RhcmdldD1fZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7cmVzdWx0PVJlZmxlY3QuY29uc3RydWN0KFN1cGVyLGFyZ3VtZW50cyxOZXdUYXJnZXQpfWVsc2UgcmVzdWx0PVN1cGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZixjYWxsKXtpZihjYWxsJiYoIm9iamVjdCI9PT1fdHlwZW9mKGNhbGwpfHwiZnVuY3Rpb24iPT10eXBlb2YgY2FsbCkpcmV0dXJuIGNhbGw7aWYodm9pZCAwIT09Y2FsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZCIpO3JldHVybiBmdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpe2lmKHZvaWQgMD09PXNlbGYpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gc2VsZn0oc2VsZil9KHRoaXMscmVzdWx0KX19ZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pe3JldHVybiBfZ2V0UHJvdG90eXBlT2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZi5iaW5kKCk6ZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pe3JldHVybiBvLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKG8pfSxfZ2V0UHJvdG90eXBlT2Yobyl9dmFyIGFzc2VydCx1dGlsLGNvZGVzPXt9O2Z1bmN0aW9uIGNyZWF0ZUVycm9yVHlwZShjb2RlLG1lc3NhZ2UsQmFzZSl7QmFzZXx8KEJhc2U9RXJyb3IpO3ZhciBOb2RlRXJyb3I9ZnVuY3Rpb24oX0Jhc2UpeyFmdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHN1cGVyQ2xhc3MmJm51bGwhPT1zdXBlckNsYXNzKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7c3ViQ2xhc3MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyYmc3VwZXJDbGFzcy5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpzdWJDbGFzcyx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHN1YkNsYXNzLCJwcm90b3R5cGUiLHt3cml0YWJsZTohMX0pLHN1cGVyQ2xhc3MmJl9zZXRQcm90b3R5cGVPZihzdWJDbGFzcyxzdXBlckNsYXNzKX0oTm9kZUVycm9yLF9CYXNlKTt2YXIgX3N1cGVyPV9jcmVhdGVTdXBlcihOb2RlRXJyb3IpO2Z1bmN0aW9uIE5vZGVFcnJvcihhcmcxLGFyZzIsYXJnMyl7dmFyIF90aGlzO3JldHVybiBmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsTm9kZUVycm9yKSxfdGhpcz1fc3VwZXIuY2FsbCh0aGlzLGZ1bmN0aW9uIGdldE1lc3NhZ2UoYXJnMSxhcmcyLGFyZzMpe3JldHVybiJzdHJpbmciPT10eXBlb2YgbWVzc2FnZT9tZXNzYWdlOm1lc3NhZ2UoYXJnMSxhcmcyLGFyZzMpfShhcmcxLGFyZzIsYXJnMykpLF90aGlzLmNvZGU9Y29kZSxfdGhpc31yZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLHByb3RvUHJvcHMsc3RhdGljUHJvcHMpe3JldHVybiBwcm90b1Byb3BzJiZfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUscHJvdG9Qcm9wcyksc3RhdGljUHJvcHMmJl9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLHN0YXRpY1Byb3BzKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksQ29uc3RydWN0b3J9KE5vZGVFcnJvcil9KEJhc2UpO2NvZGVzW2NvZGVdPU5vZGVFcnJvcn1mdW5jdGlvbiBvbmVPZihleHBlY3RlZCx0aGluZyl7aWYoQXJyYXkuaXNBcnJheShleHBlY3RlZCkpe3ZhciBsZW49ZXhwZWN0ZWQubGVuZ3RoO3JldHVybiBleHBlY3RlZD1leHBlY3RlZC5tYXAoZnVuY3Rpb24oaSl7cmV0dXJuIFN0cmluZyhpKX0pLGxlbj4yPyJvbmUgb2YgIi5jb25jYXQodGhpbmcsIiAiKS5jb25jYXQoZXhwZWN0ZWQuc2xpY2UoMCxsZW4tMSkuam9pbigiLCAiKSwiLCBvciAiKStleHBlY3RlZFtsZW4tMV06Mj09PWxlbj8ib25lIG9mICIuY29uY2F0KHRoaW5nLCIgIikuY29uY2F0KGV4cGVjdGVkWzBdLCIgb3IgIikuY29uY2F0KGV4cGVjdGVkWzFdKToib2YgIi5jb25jYXQodGhpbmcsIiAiKS5jb25jYXQoZXhwZWN0ZWRbMF0pfXJldHVybiJvZiAiLmNvbmNhdCh0aGluZywiICIpLmNvbmNhdChTdHJpbmcoZXhwZWN0ZWQpKX1jcmVhdGVFcnJvclR5cGUoIkVSUl9BTUJJR1VPVVNfQVJHVU1FTlQiLCdUaGUgIiVzIiBhcmd1bWVudCBpcyBhbWJpZ3VvdXMuICVzJyxUeXBlRXJyb3IpLGNyZWF0ZUVycm9yVHlwZSgiRVJSX0lOVkFMSURfQVJHX1RZUEUiLGZ1bmN0aW9uKG5hbWUsZXhwZWN0ZWQsYWN0dWFsKXt2YXIgZGV0ZXJtaW5lcixtc2c7aWYodm9pZCAwPT09YXNzZXJ0JiYoYXNzZXJ0PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9hc3NlcnQvYnVpbGQvYXNzZXJ0LmpzIikpLGFzc2VydCgic3RyaW5nIj09dHlwZW9mIG5hbWUsIiduYW1lJyBtdXN0IGJlIGEgc3RyaW5nIiksInN0cmluZyI9PXR5cGVvZiBleHBlY3RlZCYmZnVuY3Rpb24gc3RhcnRzV2l0aChzdHIsc2VhcmNoLHBvcyl7cmV0dXJuIHN0ci5zdWJzdHIoIXBvc3x8cG9zPDA/MDorcG9zLHNlYXJjaC5sZW5ndGgpPT09c2VhcmNofShleHBlY3RlZCwibm90ICIpPyhkZXRlcm1pbmVyPSJtdXN0IG5vdCBiZSIsZXhwZWN0ZWQ9ZXhwZWN0ZWQucmVwbGFjZSgvXm5vdCAvLCIiKSk6ZGV0ZXJtaW5lcj0ibXVzdCBiZSIsZnVuY3Rpb24gZW5kc1dpdGgoc3RyLHNlYXJjaCx0aGlzX2xlbil7cmV0dXJuKHZvaWQgMD09PXRoaXNfbGVufHx0aGlzX2xlbj5zdHIubGVuZ3RoKSYmKHRoaXNfbGVuPXN0ci5sZW5ndGgpLHN0ci5zdWJzdHJpbmcodGhpc19sZW4tc2VhcmNoLmxlbmd0aCx0aGlzX2xlbik9PT1zZWFyY2h9KG5hbWUsIiBhcmd1bWVudCIpKW1zZz0iVGhlICIuY29uY2F0KG5hbWUsIiAiKS5jb25jYXQoZGV0ZXJtaW5lciwiICIpLmNvbmNhdChvbmVPZihleHBlY3RlZCwidHlwZSIpKTtlbHNle3ZhciB0eXBlPWZ1bmN0aW9uIGluY2x1ZGVzKHN0cixzZWFyY2gsc3RhcnQpe3JldHVybiJudW1iZXIiIT10eXBlb2Ygc3RhcnQmJihzdGFydD0wKSwhKHN0YXJ0K3NlYXJjaC5sZW5ndGg+c3RyLmxlbmd0aCkmJi0xIT09c3RyLmluZGV4T2Yoc2VhcmNoLHN0YXJ0KX0obmFtZSwiLiIpPyJwcm9wZXJ0eSI6ImFyZ3VtZW50Ijttc2c9J1RoZSAiJy5jb25jYXQobmFtZSwnIiAnKS5jb25jYXQodHlwZSwiICIpLmNvbmNhdChkZXRlcm1pbmVyLCIgIikuY29uY2F0KG9uZU9mKGV4cGVjdGVkLCJ0eXBlIikpfXJldHVybiBtc2crPSIuIFJlY2VpdmVkIHR5cGUgIi5jb25jYXQoX3R5cGVvZihhY3R1YWwpKX0sVHlwZUVycm9yKSxjcmVhdGVFcnJvclR5cGUoIkVSUl9JTlZBTElEX0FSR19WQUxVRSIsZnVuY3Rpb24obmFtZSx2YWx1ZSl7dmFyIHJlYXNvbj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06ImlzIGludmFsaWQiO3ZvaWQgMD09PXV0aWwmJih1dGlsPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy91dGlsL3V0aWwuanMiKSk7dmFyIGluc3BlY3RlZD11dGlsLmluc3BlY3QodmFsdWUpO3JldHVybiBpbnNwZWN0ZWQubGVuZ3RoPjEyOCYmKGluc3BlY3RlZD0iIi5jb25jYXQoaW5zcGVjdGVkLnNsaWNlKDAsMTI4KSwiLi4uIikpLCJUaGUgYXJndW1lbnQgJyIuY29uY2F0KG5hbWUsIicgIikuY29uY2F0KHJlYXNvbiwiLiBSZWNlaXZlZCAiKS5jb25jYXQoaW5zcGVjdGVkKX0sVHlwZUVycm9yLFJhbmdlRXJyb3IpLGNyZWF0ZUVycm9yVHlwZSgiRVJSX0lOVkFMSURfUkVUVVJOX1ZBTFVFIixmdW5jdGlvbihpbnB1dCxuYW1lLHZhbHVlKXt2YXIgdHlwZTtyZXR1cm4gdHlwZT12YWx1ZSYmdmFsdWUuY29uc3RydWN0b3ImJnZhbHVlLmNvbnN0cnVjdG9yLm5hbWU/Imluc3RhbmNlIG9mICIuY29uY2F0KHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUpOiJ0eXBlICIuY29uY2F0KF90eXBlb2YodmFsdWUpKSwiRXhwZWN0ZWQgIi5jb25jYXQoaW5wdXQsJyB0byBiZSByZXR1cm5lZCBmcm9tIHRoZSAiJykuY29uY2F0KG5hbWUsJyInKSsiIGZ1bmN0aW9uIGJ1dCBnb3QgIi5jb25jYXQodHlwZSwiLiIpfSxUeXBlRXJyb3IpLGNyZWF0ZUVycm9yVHlwZSgiRVJSX01JU1NJTkdfQVJHUyIsZnVuY3Rpb24oKXtmb3IodmFyIF9sZW49YXJndW1lbnRzLmxlbmd0aCxhcmdzPW5ldyBBcnJheShfbGVuKSxfa2V5PTA7X2tleTxfbGVuO19rZXkrKylhcmdzW19rZXldPWFyZ3VtZW50c1tfa2V5XTt2b2lkIDA9PT1hc3NlcnQmJihhc3NlcnQ9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2Fzc2VydC9idWlsZC9hc3NlcnQuanMiKSksYXNzZXJ0KGFyZ3MubGVuZ3RoPjAsIkF0IGxlYXN0IG9uZSBhcmcgbmVlZHMgdG8gYmUgc3BlY2lmaWVkIik7dmFyIG1zZz0iVGhlICIsbGVuPWFyZ3MubGVuZ3RoO3N3aXRjaChhcmdzPWFyZ3MubWFwKGZ1bmN0aW9uKGEpe3JldHVybiciJy5jb25jYXQoYSwnIicpfSksbGVuKXtjYXNlIDE6bXNnKz0iIi5jb25jYXQoYXJnc1swXSwiIGFyZ3VtZW50Iik7YnJlYWs7Y2FzZSAyOm1zZys9IiIuY29uY2F0KGFyZ3NbMF0sIiBhbmQgIikuY29uY2F0KGFyZ3NbMV0sIiBhcmd1bWVudHMiKTticmVhaztkZWZhdWx0Om1zZys9YXJncy5zbGljZSgwLGxlbi0xKS5qb2luKCIsICIpLG1zZys9IiwgYW5kICIuY29uY2F0KGFyZ3NbbGVuLTFdLCIgYXJndW1lbnRzIil9cmV0dXJuIiIuY29uY2F0KG1zZywiIG11c3QgYmUgc3BlY2lmaWVkIil9LFR5cGVFcnJvciksbW9kdWxlLmV4cG9ydHMuY29kZXM9Y29kZXN9LCIuLi8uLi9ub2RlX21vZHVsZXMvYXNzZXJ0L2J1aWxkL2ludGVybmFsL3V0aWwvY29tcGFyaXNvbnMuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFycixpKXtyZXR1cm4gZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycil7aWYoQXJyYXkuaXNBcnJheShhcnIpKXJldHVybiBhcnJ9KGFycil8fGZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChyLGwpe3ZhciB0PW51bGw9PXI/bnVsbDoidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmcltTeW1ib2wuaXRlcmF0b3JdfHxyWyJAQGl0ZXJhdG9yIl07aWYobnVsbCE9dCl7dmFyIGUsbixpLHUsYT1bXSxmPSEwLG89ITE7dHJ5e2lmKGk9KHQ9dC5jYWxsKHIpKS5uZXh0LDA9PT1sKXtpZihPYmplY3QodCkhPT10KXJldHVybjtmPSExfWVsc2UgZm9yKDshKGY9KGU9aS5jYWxsKHQpKS5kb25lKSYmKGEucHVzaChlLnZhbHVlKSxhLmxlbmd0aCE9PWwpO2Y9ITApO31jYXRjaChyKXtvPSEwLG49cn1maW5hbGx5e3RyeXtpZighZiYmbnVsbCE9dC5yZXR1cm4mJih1PXQucmV0dXJuKCksT2JqZWN0KHUpIT09dSkpcmV0dXJufWZpbmFsbHl7aWYobyl0aHJvdyBufX1yZXR1cm4gYX19KGFycixpKXx8ZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sbWluTGVuKXtpZighbylyZXR1cm47aWYoInN0cmluZyI9PXR5cGVvZiBvKXJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLG1pbkxlbik7dmFyIG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsLTEpOyJPYmplY3QiPT09biYmby5jb25zdHJ1Y3RvciYmKG49by5jb25zdHJ1Y3Rvci5uYW1lKTtpZigiTWFwIj09PW58fCJTZXQiPT09bilyZXR1cm4gQXJyYXkuZnJvbShvKTtpZigiQXJndW1lbnRzIj09PW58fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKXJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLG1pbkxlbil9KGFycixpKXx8ZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9KCl9ZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLGxlbil7KG51bGw9PWxlbnx8bGVuPmFyci5sZW5ndGgpJiYobGVuPWFyci5sZW5ndGgpO2Zvcih2YXIgaT0wLGFycjI9bmV3IEFycmF5KGxlbik7aTxsZW47aSsrKWFycjJbaV09YXJyW2ldO3JldHVybiBhcnIyfWZ1bmN0aW9uIF90eXBlb2Yobyl7cmV0dXJuIF90eXBlb2Y9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24obyl7cmV0dXJuIHR5cGVvZiBvfTpmdW5jdGlvbihvKXtyZXR1cm4gbyYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmby5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmbyE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIG99LF90eXBlb2Yobyl9dmFyIHJlZ2V4RmxhZ3NTdXBwb3J0ZWQ9dm9pZCAwIT09L2EvZy5mbGFncyxhcnJheUZyb21TZXQ9ZnVuY3Rpb24gYXJyYXlGcm9tU2V0KHNldCl7dmFyIGFycmF5PVtdO3JldHVybiBzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSl7cmV0dXJuIGFycmF5LnB1c2godmFsdWUpfSksYXJyYXl9LGFycmF5RnJvbU1hcD1mdW5jdGlvbiBhcnJheUZyb21NYXAobWFwKXt2YXIgYXJyYXk9W107cmV0dXJuIG1hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLGtleSl7cmV0dXJuIGFycmF5LnB1c2goW2tleSx2YWx1ZV0pfSksYXJyYXl9LG9iamVjdElzPU9iamVjdC5pcz9PYmplY3QuaXM6X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL29iamVjdC1pcy9pbmRleC5qcyIpLG9iamVjdEdldE93blByb3BlcnR5U3ltYm9scz1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzP09iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ZnVuY3Rpb24oKXtyZXR1cm5bXX0sbnVtYmVySXNOYU49TnVtYmVyLmlzTmFOP051bWJlci5pc05hTjpfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaXMtbmFuL2luZGV4LmpzIik7ZnVuY3Rpb24gdW5jdXJyeVRoaXMoZil7cmV0dXJuIGYuY2FsbC5iaW5kKGYpfXZhciBoYXNPd25Qcm9wZXJ0eT11bmN1cnJ5VGhpcyhPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KSxwcm9wZXJ0eUlzRW51bWVyYWJsZT11bmN1cnJ5VGhpcyhPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlKSxvYmplY3RUb1N0cmluZz11bmN1cnJ5VGhpcyhPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKSxfcmVxdWlyZSR0eXBlcz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvdXRpbC91dGlsLmpzIikudHlwZXMsaXNBbnlBcnJheUJ1ZmZlcj1fcmVxdWlyZSR0eXBlcy5pc0FueUFycmF5QnVmZmVyLGlzQXJyYXlCdWZmZXJWaWV3PV9yZXF1aXJlJHR5cGVzLmlzQXJyYXlCdWZmZXJWaWV3LGlzRGF0ZT1fcmVxdWlyZSR0eXBlcy5pc0RhdGUsaXNNYXA9X3JlcXVpcmUkdHlwZXMuaXNNYXAsaXNSZWdFeHA9X3JlcXVpcmUkdHlwZXMuaXNSZWdFeHAsaXNTZXQ9X3JlcXVpcmUkdHlwZXMuaXNTZXQsaXNOYXRpdmVFcnJvcj1fcmVxdWlyZSR0eXBlcy5pc05hdGl2ZUVycm9yLGlzQm94ZWRQcmltaXRpdmU9X3JlcXVpcmUkdHlwZXMuaXNCb3hlZFByaW1pdGl2ZSxpc051bWJlck9iamVjdD1fcmVxdWlyZSR0eXBlcy5pc051bWJlck9iamVjdCxpc1N0cmluZ09iamVjdD1fcmVxdWlyZSR0eXBlcy5pc1N0cmluZ09iamVjdCxpc0Jvb2xlYW5PYmplY3Q9X3JlcXVpcmUkdHlwZXMuaXNCb29sZWFuT2JqZWN0LGlzQmlnSW50T2JqZWN0PV9yZXF1aXJlJHR5cGVzLmlzQmlnSW50T2JqZWN0LGlzU3ltYm9sT2JqZWN0PV9yZXF1aXJlJHR5cGVzLmlzU3ltYm9sT2JqZWN0LGlzRmxvYXQzMkFycmF5PV9yZXF1aXJlJHR5cGVzLmlzRmxvYXQzMkFycmF5LGlzRmxvYXQ2NEFycmF5PV9yZXF1aXJlJHR5cGVzLmlzRmxvYXQ2NEFycmF5O2Z1bmN0aW9uIGlzTm9uSW5kZXgoa2V5KXtpZigwPT09a2V5Lmxlbmd0aHx8a2V5Lmxlbmd0aD4xMClyZXR1cm4hMDtmb3IodmFyIGk9MDtpPGtleS5sZW5ndGg7aSsrKXt2YXIgY29kZT1rZXkuY2hhckNvZGVBdChpKTtpZihjb2RlPDQ4fHxjb2RlPjU3KXJldHVybiEwfXJldHVybiAxMD09PWtleS5sZW5ndGgmJmtleT49TWF0aC5wb3coMiwzMil9ZnVuY3Rpb24gZ2V0T3duTm9uSW5kZXhQcm9wZXJ0aWVzKHZhbHVlKXtyZXR1cm4gT2JqZWN0LmtleXModmFsdWUpLmZpbHRlcihpc05vbkluZGV4KS5jb25jYXQob2JqZWN0R2V0T3duUHJvcGVydHlTeW1ib2xzKHZhbHVlKS5maWx0ZXIoT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5iaW5kKHZhbHVlKSkpfWZ1bmN0aW9uIGNvbXBhcmUoYSxiKXtpZihhPT09YilyZXR1cm4gMDtmb3IodmFyIHg9YS5sZW5ndGgseT1iLmxlbmd0aCxpPTAsbGVuPU1hdGgubWluKHgseSk7aTxsZW47KytpKWlmKGFbaV0hPT1iW2ldKXt4PWFbaV0seT1iW2ldO2JyZWFrfXJldHVybiB4PHk/LTE6eTx4PzE6MH1mdW5jdGlvbiBpbm5lckRlZXBFcXVhbCh2YWwxLHZhbDIsc3RyaWN0LG1lbW9zKXtpZih2YWwxPT09dmFsMilyZXR1cm4gMCE9PXZhbDF8fCghc3RyaWN0fHxvYmplY3RJcyh2YWwxLHZhbDIpKTtpZihzdHJpY3Qpe2lmKCJvYmplY3QiIT09X3R5cGVvZih2YWwxKSlyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHZhbDEmJm51bWJlcklzTmFOKHZhbDEpJiZudW1iZXJJc05hTih2YWwyKTtpZigib2JqZWN0IiE9PV90eXBlb2YodmFsMil8fG51bGw9PT12YWwxfHxudWxsPT09dmFsMilyZXR1cm4hMTtpZihPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsMSkhPT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsMikpcmV0dXJuITF9ZWxzZXtpZihudWxsPT09dmFsMXx8Im9iamVjdCIhPT1fdHlwZW9mKHZhbDEpKXJldHVybihudWxsPT09dmFsMnx8Im9iamVjdCIhPT1fdHlwZW9mKHZhbDIpKSYmdmFsMT09dmFsMjtpZihudWxsPT09dmFsMnx8Im9iamVjdCIhPT1fdHlwZW9mKHZhbDIpKXJldHVybiExfXZhciB2YWwxVGFnPW9iamVjdFRvU3RyaW5nKHZhbDEpO2lmKHZhbDFUYWchPT1vYmplY3RUb1N0cmluZyh2YWwyKSlyZXR1cm4hMTtpZihBcnJheS5pc0FycmF5KHZhbDEpKXtpZih2YWwxLmxlbmd0aCE9PXZhbDIubGVuZ3RoKXJldHVybiExO3ZhciBrZXlzMT1nZXRPd25Ob25JbmRleFByb3BlcnRpZXModmFsMSksa2V5czI9Z2V0T3duTm9uSW5kZXhQcm9wZXJ0aWVzKHZhbDIpO3JldHVybiBrZXlzMS5sZW5ndGg9PT1rZXlzMi5sZW5ndGgmJmtleUNoZWNrKHZhbDEsdmFsMixzdHJpY3QsbWVtb3MsMSxrZXlzMSl9aWYoIltvYmplY3QgT2JqZWN0XSI9PT12YWwxVGFnJiYoIWlzTWFwKHZhbDEpJiZpc01hcCh2YWwyKXx8IWlzU2V0KHZhbDEpJiZpc1NldCh2YWwyKSkpcmV0dXJuITE7aWYoaXNEYXRlKHZhbDEpKXtpZighaXNEYXRlKHZhbDIpfHxEYXRlLnByb3RvdHlwZS5nZXRUaW1lLmNhbGwodmFsMSkhPT1EYXRlLnByb3RvdHlwZS5nZXRUaW1lLmNhbGwodmFsMikpcmV0dXJuITF9ZWxzZSBpZihpc1JlZ0V4cCh2YWwxKSl7aWYoIWlzUmVnRXhwKHZhbDIpfHwhZnVuY3Rpb24gYXJlU2ltaWxhclJlZ0V4cHMoYSxiKXtyZXR1cm4gcmVnZXhGbGFnc1N1cHBvcnRlZD9hLnNvdXJjZT09PWIuc291cmNlJiZhLmZsYWdzPT09Yi5mbGFnczpSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk9PT1SZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYil9KHZhbDEsdmFsMikpcmV0dXJuITF9ZWxzZSBpZihpc05hdGl2ZUVycm9yKHZhbDEpfHx2YWwxIGluc3RhbmNlb2YgRXJyb3Ipe2lmKHZhbDEubWVzc2FnZSE9PXZhbDIubWVzc2FnZXx8dmFsMS5uYW1lIT09dmFsMi5uYW1lKXJldHVybiExfWVsc2V7aWYoaXNBcnJheUJ1ZmZlclZpZXcodmFsMSkpe2lmKHN0cmljdHx8IWlzRmxvYXQzMkFycmF5KHZhbDEpJiYhaXNGbG9hdDY0QXJyYXkodmFsMSkpe2lmKCFmdW5jdGlvbiBhcmVTaW1pbGFyVHlwZWRBcnJheXMoYSxiKXtyZXR1cm4gYS5ieXRlTGVuZ3RoPT09Yi5ieXRlTGVuZ3RoJiYwPT09Y29tcGFyZShuZXcgVWludDhBcnJheShhLmJ1ZmZlcixhLmJ5dGVPZmZzZXQsYS5ieXRlTGVuZ3RoKSxuZXcgVWludDhBcnJheShiLmJ1ZmZlcixiLmJ5dGVPZmZzZXQsYi5ieXRlTGVuZ3RoKSl9KHZhbDEsdmFsMikpcmV0dXJuITF9ZWxzZSBpZighZnVuY3Rpb24gYXJlU2ltaWxhckZsb2F0QXJyYXlzKGEsYil7aWYoYS5ieXRlTGVuZ3RoIT09Yi5ieXRlTGVuZ3RoKXJldHVybiExO2Zvcih2YXIgb2Zmc2V0PTA7b2Zmc2V0PGEuYnl0ZUxlbmd0aDtvZmZzZXQrKylpZihhW29mZnNldF0hPT1iW29mZnNldF0pcmV0dXJuITE7cmV0dXJuITB9KHZhbDEsdmFsMikpcmV0dXJuITE7dmFyIF9rZXlzPWdldE93bk5vbkluZGV4UHJvcGVydGllcyh2YWwxKSxfa2V5czI9Z2V0T3duTm9uSW5kZXhQcm9wZXJ0aWVzKHZhbDIpO3JldHVybiBfa2V5cy5sZW5ndGg9PT1fa2V5czIubGVuZ3RoJiZrZXlDaGVjayh2YWwxLHZhbDIsc3RyaWN0LG1lbW9zLDAsX2tleXMpfWlmKGlzU2V0KHZhbDEpKXJldHVybiEoIWlzU2V0KHZhbDIpfHx2YWwxLnNpemUhPT12YWwyLnNpemUpJiZrZXlDaGVjayh2YWwxLHZhbDIsc3RyaWN0LG1lbW9zLDIpO2lmKGlzTWFwKHZhbDEpKXJldHVybiEoIWlzTWFwKHZhbDIpfHx2YWwxLnNpemUhPT12YWwyLnNpemUpJiZrZXlDaGVjayh2YWwxLHZhbDIsc3RyaWN0LG1lbW9zLDMpO2lmKGlzQW55QXJyYXlCdWZmZXIodmFsMSkpe2lmKCFmdW5jdGlvbiBhcmVFcXVhbEFycmF5QnVmZmVycyhidWYxLGJ1ZjIpe3JldHVybiBidWYxLmJ5dGVMZW5ndGg9PT1idWYyLmJ5dGVMZW5ndGgmJjA9PT1jb21wYXJlKG5ldyBVaW50OEFycmF5KGJ1ZjEpLG5ldyBVaW50OEFycmF5KGJ1ZjIpKX0odmFsMSx2YWwyKSlyZXR1cm4hMX1lbHNlIGlmKGlzQm94ZWRQcmltaXRpdmUodmFsMSkmJiFmdW5jdGlvbiBpc0VxdWFsQm94ZWRQcmltaXRpdmUodmFsMSx2YWwyKXtyZXR1cm4gaXNOdW1iZXJPYmplY3QodmFsMSk/aXNOdW1iZXJPYmplY3QodmFsMikmJm9iamVjdElzKE51bWJlci5wcm90b3R5cGUudmFsdWVPZi5jYWxsKHZhbDEpLE51bWJlci5wcm90b3R5cGUudmFsdWVPZi5jYWxsKHZhbDIpKTppc1N0cmluZ09iamVjdCh2YWwxKT9pc1N0cmluZ09iamVjdCh2YWwyKSYmU3RyaW5nLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwodmFsMSk9PT1TdHJpbmcucHJvdG90eXBlLnZhbHVlT2YuY2FsbCh2YWwyKTppc0Jvb2xlYW5PYmplY3QodmFsMSk/aXNCb29sZWFuT2JqZWN0KHZhbDIpJiZCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwodmFsMSk9PT1Cb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwodmFsMik6aXNCaWdJbnRPYmplY3QodmFsMSk/aXNCaWdJbnRPYmplY3QodmFsMikmJkJpZ0ludC5wcm90b3R5cGUudmFsdWVPZi5jYWxsKHZhbDEpPT09QmlnSW50LnByb3RvdHlwZS52YWx1ZU9mLmNhbGwodmFsMik6aXNTeW1ib2xPYmplY3QodmFsMikmJlN5bWJvbC5wcm90b3R5cGUudmFsdWVPZi5jYWxsKHZhbDEpPT09U3ltYm9sLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwodmFsMil9KHZhbDEsdmFsMikpcmV0dXJuITF9cmV0dXJuIGtleUNoZWNrKHZhbDEsdmFsMixzdHJpY3QsbWVtb3MsMCl9ZnVuY3Rpb24gZ2V0RW51bWVyYWJsZXModmFsLGtleXMpe3JldHVybiBrZXlzLmZpbHRlcihmdW5jdGlvbihrKXtyZXR1cm4gcHJvcGVydHlJc0VudW1lcmFibGUodmFsLGspfSl9ZnVuY3Rpb24ga2V5Q2hlY2sodmFsMSx2YWwyLHN0cmljdCxtZW1vcyxpdGVyYXRpb25UeXBlLGFLZXlzKXtpZig1PT09YXJndW1lbnRzLmxlbmd0aCl7YUtleXM9T2JqZWN0LmtleXModmFsMSk7dmFyIGJLZXlzPU9iamVjdC5rZXlzKHZhbDIpO2lmKGFLZXlzLmxlbmd0aCE9PWJLZXlzLmxlbmd0aClyZXR1cm4hMX1mb3IodmFyIGk9MDtpPGFLZXlzLmxlbmd0aDtpKyspaWYoIWhhc093blByb3BlcnR5KHZhbDIsYUtleXNbaV0pKXJldHVybiExO2lmKHN0cmljdCYmNT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBzeW1ib2xLZXlzQT1vYmplY3RHZXRPd25Qcm9wZXJ0eVN5bWJvbHModmFsMSk7aWYoMCE9PXN5bWJvbEtleXNBLmxlbmd0aCl7dmFyIGNvdW50PTA7Zm9yKGk9MDtpPHN5bWJvbEtleXNBLmxlbmd0aDtpKyspe3ZhciBrZXk9c3ltYm9sS2V5c0FbaV07aWYocHJvcGVydHlJc0VudW1lcmFibGUodmFsMSxrZXkpKXtpZighcHJvcGVydHlJc0VudW1lcmFibGUodmFsMixrZXkpKXJldHVybiExO2FLZXlzLnB1c2goa2V5KSxjb3VudCsrfWVsc2UgaWYocHJvcGVydHlJc0VudW1lcmFibGUodmFsMixrZXkpKXJldHVybiExfXZhciBzeW1ib2xLZXlzQj1vYmplY3RHZXRPd25Qcm9wZXJ0eVN5bWJvbHModmFsMik7aWYoc3ltYm9sS2V5c0EubGVuZ3RoIT09c3ltYm9sS2V5c0IubGVuZ3RoJiZnZXRFbnVtZXJhYmxlcyh2YWwyLHN5bWJvbEtleXNCKS5sZW5ndGghPT1jb3VudClyZXR1cm4hMX1lbHNle3ZhciBfc3ltYm9sS2V5c0I9b2JqZWN0R2V0T3duUHJvcGVydHlTeW1ib2xzKHZhbDIpO2lmKDAhPT1fc3ltYm9sS2V5c0IubGVuZ3RoJiYwIT09Z2V0RW51bWVyYWJsZXModmFsMixfc3ltYm9sS2V5c0IpLmxlbmd0aClyZXR1cm4hMX19aWYoMD09PWFLZXlzLmxlbmd0aCYmKDA9PT1pdGVyYXRpb25UeXBlfHwxPT09aXRlcmF0aW9uVHlwZSYmMD09PXZhbDEubGVuZ3RofHwwPT09dmFsMS5zaXplKSlyZXR1cm4hMDtpZih2b2lkIDA9PT1tZW1vcyltZW1vcz17dmFsMTpuZXcgTWFwLHZhbDI6bmV3IE1hcCxwb3NpdGlvbjowfTtlbHNle3ZhciB2YWwyTWVtb0E9bWVtb3MudmFsMS5nZXQodmFsMSk7aWYodm9pZCAwIT09dmFsMk1lbW9BKXt2YXIgdmFsMk1lbW9CPW1lbW9zLnZhbDIuZ2V0KHZhbDIpO2lmKHZvaWQgMCE9PXZhbDJNZW1vQilyZXR1cm4gdmFsMk1lbW9BPT09dmFsMk1lbW9CfW1lbW9zLnBvc2l0aW9uKyt9bWVtb3MudmFsMS5zZXQodmFsMSxtZW1vcy5wb3NpdGlvbiksbWVtb3MudmFsMi5zZXQodmFsMixtZW1vcy5wb3NpdGlvbik7dmFyIGFyZUVxPWZ1bmN0aW9uIG9iakVxdWl2KGEsYixzdHJpY3Qsa2V5cyxtZW1vcyxpdGVyYXRpb25UeXBlKXt2YXIgaT0wO2lmKDI9PT1pdGVyYXRpb25UeXBlKXtpZighZnVuY3Rpb24gc2V0RXF1aXYoYSxiLHN0cmljdCxtZW1vKXtmb3IodmFyIHNldD1udWxsLGFWYWx1ZXM9YXJyYXlGcm9tU2V0KGEpLGk9MDtpPGFWYWx1ZXMubGVuZ3RoO2krKyl7dmFyIHZhbD1hVmFsdWVzW2ldO2lmKCJvYmplY3QiPT09X3R5cGVvZih2YWwpJiZudWxsIT09dmFsKW51bGw9PT1zZXQmJihzZXQ9bmV3IFNldCksc2V0LmFkZCh2YWwpO2Vsc2UgaWYoIWIuaGFzKHZhbCkpe2lmKHN0cmljdClyZXR1cm4hMTtpZighc2V0TWlnaHRIYXZlTG9vc2VQcmltKGEsYix2YWwpKXJldHVybiExO251bGw9PT1zZXQmJihzZXQ9bmV3IFNldCksc2V0LmFkZCh2YWwpfX1pZihudWxsIT09c2V0KXtmb3IodmFyIGJWYWx1ZXM9YXJyYXlGcm9tU2V0KGIpLF9pPTA7X2k8YlZhbHVlcy5sZW5ndGg7X2krKyl7dmFyIF92YWw9YlZhbHVlc1tfaV07aWYoIm9iamVjdCI9PT1fdHlwZW9mKF92YWwpJiZudWxsIT09X3ZhbCl7aWYoIXNldEhhc0VxdWFsRWxlbWVudChzZXQsX3ZhbCxzdHJpY3QsbWVtbykpcmV0dXJuITF9ZWxzZSBpZighc3RyaWN0JiYhYS5oYXMoX3ZhbCkmJiFzZXRIYXNFcXVhbEVsZW1lbnQoc2V0LF92YWwsc3RyaWN0LG1lbW8pKXJldHVybiExfXJldHVybiAwPT09c2V0LnNpemV9cmV0dXJuITB9KGEsYixzdHJpY3QsbWVtb3MpKXJldHVybiExfWVsc2UgaWYoMz09PWl0ZXJhdGlvblR5cGUpe2lmKCFmdW5jdGlvbiBtYXBFcXVpdihhLGIsc3RyaWN0LG1lbW8pe2Zvcih2YXIgc2V0PW51bGwsYUVudHJpZXM9YXJyYXlGcm9tTWFwKGEpLGk9MDtpPGFFbnRyaWVzLmxlbmd0aDtpKyspe3ZhciBfYUVudHJpZXMkaT1fc2xpY2VkVG9BcnJheShhRW50cmllc1tpXSwyKSxrZXk9X2FFbnRyaWVzJGlbMF0saXRlbTE9X2FFbnRyaWVzJGlbMV07aWYoIm9iamVjdCI9PT1fdHlwZW9mKGtleSkmJm51bGwhPT1rZXkpbnVsbD09PXNldCYmKHNldD1uZXcgU2V0KSxzZXQuYWRkKGtleSk7ZWxzZXt2YXIgaXRlbTI9Yi5nZXQoa2V5KTtpZih2b2lkIDA9PT1pdGVtMiYmIWIuaGFzKGtleSl8fCFpbm5lckRlZXBFcXVhbChpdGVtMSxpdGVtMixzdHJpY3QsbWVtbykpe2lmKHN0cmljdClyZXR1cm4hMTtpZighbWFwTWlnaHRIYXZlTG9vc2VQcmltKGEsYixrZXksaXRlbTEsbWVtbykpcmV0dXJuITE7bnVsbD09PXNldCYmKHNldD1uZXcgU2V0KSxzZXQuYWRkKGtleSl9fX1pZihudWxsIT09c2V0KXtmb3IodmFyIGJFbnRyaWVzPWFycmF5RnJvbU1hcChiKSxfaTI9MDtfaTI8YkVudHJpZXMubGVuZ3RoO19pMisrKXt2YXIgX2JFbnRyaWVzJF9pPV9zbGljZWRUb0FycmF5KGJFbnRyaWVzW19pMl0sMiksX2tleT1fYkVudHJpZXMkX2lbMF0saXRlbT1fYkVudHJpZXMkX2lbMV07aWYoIm9iamVjdCI9PT1fdHlwZW9mKF9rZXkpJiZudWxsIT09X2tleSl7aWYoIW1hcEhhc0VxdWFsRW50cnkoc2V0LGEsX2tleSxpdGVtLHN0cmljdCxtZW1vKSlyZXR1cm4hMX1lbHNlIGlmKCEoc3RyaWN0fHxhLmhhcyhfa2V5KSYmaW5uZXJEZWVwRXF1YWwoYS5nZXQoX2tleSksaXRlbSwhMSxtZW1vKXx8bWFwSGFzRXF1YWxFbnRyeShzZXQsYSxfa2V5LGl0ZW0sITEsbWVtbykpKXJldHVybiExfXJldHVybiAwPT09c2V0LnNpemV9cmV0dXJuITB9KGEsYixzdHJpY3QsbWVtb3MpKXJldHVybiExfWVsc2UgaWYoMT09PWl0ZXJhdGlvblR5cGUpZm9yKDtpPGEubGVuZ3RoO2krKyl7aWYoIWhhc093blByb3BlcnR5KGEsaSkpe2lmKGhhc093blByb3BlcnR5KGIsaSkpcmV0dXJuITE7Zm9yKHZhciBrZXlzQT1PYmplY3Qua2V5cyhhKTtpPGtleXNBLmxlbmd0aDtpKyspe3ZhciBrZXk9a2V5c0FbaV07aWYoIWhhc093blByb3BlcnR5KGIsa2V5KXx8IWlubmVyRGVlcEVxdWFsKGFba2V5XSxiW2tleV0sc3RyaWN0LG1lbW9zKSlyZXR1cm4hMX1yZXR1cm4ga2V5c0EubGVuZ3RoPT09T2JqZWN0LmtleXMoYikubGVuZ3RofWlmKCFoYXNPd25Qcm9wZXJ0eShiLGkpfHwhaW5uZXJEZWVwRXF1YWwoYVtpXSxiW2ldLHN0cmljdCxtZW1vcykpcmV0dXJuITF9Zm9yKGk9MDtpPGtleXMubGVuZ3RoO2krKyl7dmFyIF9rZXkyPWtleXNbaV07aWYoIWlubmVyRGVlcEVxdWFsKGFbX2tleTJdLGJbX2tleTJdLHN0cmljdCxtZW1vcykpcmV0dXJuITF9cmV0dXJuITB9KHZhbDEsdmFsMixzdHJpY3QsYUtleXMsbWVtb3MsaXRlcmF0aW9uVHlwZSk7cmV0dXJuIG1lbW9zLnZhbDEuZGVsZXRlKHZhbDEpLG1lbW9zLnZhbDIuZGVsZXRlKHZhbDIpLGFyZUVxfWZ1bmN0aW9uIHNldEhhc0VxdWFsRWxlbWVudChzZXQsdmFsMSxzdHJpY3QsbWVtbyl7Zm9yKHZhciBzZXRWYWx1ZXM9YXJyYXlGcm9tU2V0KHNldCksaT0wO2k8c2V0VmFsdWVzLmxlbmd0aDtpKyspe3ZhciB2YWwyPXNldFZhbHVlc1tpXTtpZihpbm5lckRlZXBFcXVhbCh2YWwxLHZhbDIsc3RyaWN0LG1lbW8pKXJldHVybiBzZXQuZGVsZXRlKHZhbDIpLCEwfXJldHVybiExfWZ1bmN0aW9uIGZpbmRMb29zZU1hdGNoaW5nUHJpbWl0aXZlcyhwcmltKXtzd2l0Y2goX3R5cGVvZihwcmltKSl7Y2FzZSJ1bmRlZmluZWQiOnJldHVybiBudWxsO2Nhc2Uib2JqZWN0IjpyZXR1cm47Y2FzZSJzeW1ib2wiOnJldHVybiExO2Nhc2Uic3RyaW5nIjpwcmltPStwcmltO2Nhc2UibnVtYmVyIjppZihudW1iZXJJc05hTihwcmltKSlyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBzZXRNaWdodEhhdmVMb29zZVByaW0oYSxiLHByaW0pe3ZhciBhbHRWYWx1ZT1maW5kTG9vc2VNYXRjaGluZ1ByaW1pdGl2ZXMocHJpbSk7cmV0dXJuIG51bGwhPWFsdFZhbHVlP2FsdFZhbHVlOmIuaGFzKGFsdFZhbHVlKSYmIWEuaGFzKGFsdFZhbHVlKX1mdW5jdGlvbiBtYXBNaWdodEhhdmVMb29zZVByaW0oYSxiLHByaW0saXRlbSxtZW1vKXt2YXIgYWx0VmFsdWU9ZmluZExvb3NlTWF0Y2hpbmdQcmltaXRpdmVzKHByaW0pO2lmKG51bGwhPWFsdFZhbHVlKXJldHVybiBhbHRWYWx1ZTt2YXIgY3VyQj1iLmdldChhbHRWYWx1ZSk7cmV0dXJuISh2b2lkIDA9PT1jdXJCJiYhYi5oYXMoYWx0VmFsdWUpfHwhaW5uZXJEZWVwRXF1YWwoaXRlbSxjdXJCLCExLG1lbW8pKSYmKCFhLmhhcyhhbHRWYWx1ZSkmJmlubmVyRGVlcEVxdWFsKGl0ZW0sY3VyQiwhMSxtZW1vKSl9ZnVuY3Rpb24gbWFwSGFzRXF1YWxFbnRyeShzZXQsbWFwLGtleTEsaXRlbTEsc3RyaWN0LG1lbW8pe2Zvcih2YXIgc2V0VmFsdWVzPWFycmF5RnJvbVNldChzZXQpLGk9MDtpPHNldFZhbHVlcy5sZW5ndGg7aSsrKXt2YXIga2V5Mj1zZXRWYWx1ZXNbaV07aWYoaW5uZXJEZWVwRXF1YWwoa2V5MSxrZXkyLHN0cmljdCxtZW1vKSYmaW5uZXJEZWVwRXF1YWwoaXRlbTEsbWFwLmdldChrZXkyKSxzdHJpY3QsbWVtbykpcmV0dXJuIHNldC5kZWxldGUoa2V5MiksITB9cmV0dXJuITF9bW9kdWxlLmV4cG9ydHM9e2lzRGVlcEVxdWFsOmZ1bmN0aW9uIGlzRGVlcEVxdWFsKHZhbDEsdmFsMil7cmV0dXJuIGlubmVyRGVlcEVxdWFsKHZhbDEsdmFsMixmYWxzZSl9LGlzRGVlcFN0cmljdEVxdWFsOmZ1bmN0aW9uIGlzRGVlcFN0cmljdEVxdWFsKHZhbDEsdmFsMil7cmV0dXJuIGlubmVyRGVlcEVxdWFsKHZhbDEsdmFsMix0cnVlKX19fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2Jhc2U2NC1qcy9pbmRleC5qcyIoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO2V4cG9ydHMuYnl0ZUxlbmd0aD1mdW5jdGlvbiBieXRlTGVuZ3RoKGI2NCl7dmFyIGxlbnM9Z2V0TGVucyhiNjQpLHZhbGlkTGVuPWxlbnNbMF0scGxhY2VIb2xkZXJzTGVuPWxlbnNbMV07cmV0dXJuIDMqKHZhbGlkTGVuK3BsYWNlSG9sZGVyc0xlbikvNC1wbGFjZUhvbGRlcnNMZW59LGV4cG9ydHMudG9CeXRlQXJyYXk9ZnVuY3Rpb24gdG9CeXRlQXJyYXkoYjY0KXt2YXIgdG1wLGksbGVucz1nZXRMZW5zKGI2NCksdmFsaWRMZW49bGVuc1swXSxwbGFjZUhvbGRlcnNMZW49bGVuc1sxXSxhcnI9bmV3IEFycihmdW5jdGlvbiBfYnl0ZUxlbmd0aChiNjQsdmFsaWRMZW4scGxhY2VIb2xkZXJzTGVuKXtyZXR1cm4gMyoodmFsaWRMZW4rcGxhY2VIb2xkZXJzTGVuKS80LXBsYWNlSG9sZGVyc0xlbn0oMCx2YWxpZExlbixwbGFjZUhvbGRlcnNMZW4pKSxjdXJCeXRlPTAsbGVuPXBsYWNlSG9sZGVyc0xlbj4wP3ZhbGlkTGVuLTQ6dmFsaWRMZW47Zm9yKGk9MDtpPGxlbjtpKz00KXRtcD1yZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldPDwxOHxyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSsxKV08PDEyfHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKzIpXTw8NnxyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSszKV0sYXJyW2N1ckJ5dGUrK109dG1wPj4xNiYyNTUsYXJyW2N1ckJ5dGUrK109dG1wPj44JjI1NSxhcnJbY3VyQnl0ZSsrXT0yNTUmdG1wOzI9PT1wbGFjZUhvbGRlcnNMZW4mJih0bXA9cmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXTw8MnxyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSsxKV0+PjQsYXJyW2N1ckJ5dGUrK109MjU1JnRtcCk7MT09PXBsYWNlSG9sZGVyc0xlbiYmKHRtcD1yZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldPDwxMHxyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSsxKV08PDR8cmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkrMildPj4yLGFycltjdXJCeXRlKytdPXRtcD4+OCYyNTUsYXJyW2N1ckJ5dGUrK109MjU1JnRtcCk7cmV0dXJuIGFycn0sZXhwb3J0cy5mcm9tQnl0ZUFycmF5PWZ1bmN0aW9uIGZyb21CeXRlQXJyYXkodWludDgpe2Zvcih2YXIgdG1wLGxlbj11aW50OC5sZW5ndGgsZXh0cmFCeXRlcz1sZW4lMyxwYXJ0cz1bXSxpPTAsbGVuMj1sZW4tZXh0cmFCeXRlcztpPGxlbjI7aSs9MTYzODMpcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCxpLGkrMTYzODM+bGVuMj9sZW4yOmkrMTYzODMpKTsxPT09ZXh0cmFCeXRlcz8odG1wPXVpbnQ4W2xlbi0xXSxwYXJ0cy5wdXNoKGxvb2t1cFt0bXA+PjJdK2xvb2t1cFt0bXA8PDQmNjNdKyI9PSIpKToyPT09ZXh0cmFCeXRlcyYmKHRtcD0odWludDhbbGVuLTJdPDw4KSt1aW50OFtsZW4tMV0scGFydHMucHVzaChsb29rdXBbdG1wPj4xMF0rbG9va3VwW3RtcD4+NCY2M10rbG9va3VwW3RtcDw8MiY2M10rIj0iKSk7cmV0dXJuIHBhcnRzLmpvaW4oIiIpfTtmb3IodmFyIGxvb2t1cD1bXSxyZXZMb29rdXA9W10sQXJyPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9VaW50OEFycmF5OkFycmF5LGNvZGU9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGk9MDtpPDY0OysraSlsb29rdXBbaV09Y29kZVtpXSxyZXZMb29rdXBbY29kZS5jaGFyQ29kZUF0KGkpXT1pO2Z1bmN0aW9uIGdldExlbnMoYjY0KXt2YXIgbGVuPWI2NC5sZW5ndGg7aWYobGVuJTQ+MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKTt2YXIgdmFsaWRMZW49YjY0LmluZGV4T2YoIj0iKTtyZXR1cm4tMT09PXZhbGlkTGVuJiYodmFsaWRMZW49bGVuKSxbdmFsaWRMZW4sdmFsaWRMZW49PT1sZW4/MDo0LXZhbGlkTGVuJTRdfWZ1bmN0aW9uIHRyaXBsZXRUb0Jhc2U2NChudW0pe3JldHVybiBsb29rdXBbbnVtPj4xOCY2M10rbG9va3VwW251bT4+MTImNjNdK2xvb2t1cFtudW0+PjYmNjNdK2xvb2t1cFs2MyZudW1dfWZ1bmN0aW9uIGVuY29kZUNodW5rKHVpbnQ4LHN0YXJ0LGVuZCl7Zm9yKHZhciB0bXAsb3V0cHV0PVtdLGk9c3RhcnQ7aTxlbmQ7aSs9Myl0bXA9KHVpbnQ4W2ldPDwxNiYxNjcxMTY4MCkrKHVpbnQ4W2krMV08PDgmNjUyODApKygyNTUmdWludDhbaSsyXSksb3V0cHV0LnB1c2godHJpcGxldFRvQmFzZTY0KHRtcCkpO3JldHVybiBvdXRwdXQuam9pbigiIil9cmV2TG9va3VwWyItIi5jaGFyQ29kZUF0KDApXT02MixyZXZMb29rdXBbIl8iLmNoYXJDb2RlQXQoMCldPTYzfSwiLi4vLi4vbm9kZV9tb2R1bGVzL2JuLmpzL2xpYi9ibi5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXshZnVuY3Rpb24obW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBhc3NlcnQodmFsLG1zZyl7aWYoIXZhbCl0aHJvdyBuZXcgRXJyb3IobXNnfHwiQXNzZXJ0aW9uIGZhaWxlZCIpfWZ1bmN0aW9uIGluaGVyaXRzKGN0b3Isc3VwZXJDdG9yKXtjdG9yLnN1cGVyXz1zdXBlckN0b3I7dmFyIFRlbXBDdG9yPWZ1bmN0aW9uKCl7fTtUZW1wQ3Rvci5wcm90b3R5cGU9c3VwZXJDdG9yLnByb3RvdHlwZSxjdG9yLnByb3RvdHlwZT1uZXcgVGVtcEN0b3IsY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3I9Y3Rvcn1mdW5jdGlvbiBCTihudW1iZXIsYmFzZSxlbmRpYW4pe2lmKEJOLmlzQk4obnVtYmVyKSlyZXR1cm4gbnVtYmVyO3RoaXMubmVnYXRpdmU9MCx0aGlzLndvcmRzPW51bGwsdGhpcy5sZW5ndGg9MCx0aGlzLnJlZD1udWxsLG51bGwhPT1udW1iZXImJigibGUiIT09YmFzZSYmImJlIiE9PWJhc2V8fChlbmRpYW49YmFzZSxiYXNlPTEwKSx0aGlzLl9pbml0KG51bWJlcnx8MCxiYXNlfHwxMCxlbmRpYW58fCJiZSIpKX12YXIgQnVmZmVyOyJvYmplY3QiPT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPUJOOmV4cG9ydHMuQk49Qk4sQk4uQk49Qk4sQk4ud29yZFNpemU9MjY7dHJ5e0J1ZmZlcj0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmdm9pZCAwIT09d2luZG93LkJ1ZmZlcj93aW5kb3cuQnVmZmVyOl9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiKS5CdWZmZXJ9Y2F0Y2goZSl7fWZ1bmN0aW9uIHBhcnNlSGV4NEJpdHMoc3RyaW5nLGluZGV4KXt2YXIgYz1zdHJpbmcuY2hhckNvZGVBdChpbmRleCk7cmV0dXJuIGM+PTY1JiZjPD03MD9jLTU1OmM+PTk3JiZjPD0xMDI/Yy04NzpjLTQ4JjE1fWZ1bmN0aW9uIHBhcnNlSGV4Qnl0ZShzdHJpbmcsbG93ZXJCb3VuZCxpbmRleCl7dmFyIHI9cGFyc2VIZXg0Qml0cyhzdHJpbmcsaW5kZXgpO3JldHVybiBpbmRleC0xPj1sb3dlckJvdW5kJiYocnw9cGFyc2VIZXg0Qml0cyhzdHJpbmcsaW5kZXgtMSk8PDQpLHJ9ZnVuY3Rpb24gcGFyc2VCYXNlKHN0cixzdGFydCxlbmQsbXVsKXtmb3IodmFyIHI9MCxsZW49TWF0aC5taW4oc3RyLmxlbmd0aCxlbmQpLGk9c3RhcnQ7aTxsZW47aSsrKXt2YXIgYz1zdHIuY2hhckNvZGVBdChpKS00ODtyKj1tdWwscis9Yz49NDk/Yy00OSsxMDpjPj0xNz9jLTE3KzEwOmN9cmV0dXJuIHJ9Qk4uaXNCTj1mdW5jdGlvbiBpc0JOKG51bSl7cmV0dXJuIG51bSBpbnN0YW5jZW9mIEJOfHxudWxsIT09bnVtJiYib2JqZWN0Ij09dHlwZW9mIG51bSYmbnVtLmNvbnN0cnVjdG9yLndvcmRTaXplPT09Qk4ud29yZFNpemUmJkFycmF5LmlzQXJyYXkobnVtLndvcmRzKX0sQk4ubWF4PWZ1bmN0aW9uIG1heChsZWZ0LHJpZ2h0KXtyZXR1cm4gbGVmdC5jbXAocmlnaHQpPjA/bGVmdDpyaWdodH0sQk4ubWluPWZ1bmN0aW9uIG1pbihsZWZ0LHJpZ2h0KXtyZXR1cm4gbGVmdC5jbXAocmlnaHQpPDA/bGVmdDpyaWdodH0sQk4ucHJvdG90eXBlLl9pbml0PWZ1bmN0aW9uIGluaXQobnVtYmVyLGJhc2UsZW5kaWFuKXtpZigibnVtYmVyIj09dHlwZW9mIG51bWJlcilyZXR1cm4gdGhpcy5faW5pdE51bWJlcihudW1iZXIsYmFzZSxlbmRpYW4pO2lmKCJvYmplY3QiPT10eXBlb2YgbnVtYmVyKXJldHVybiB0aGlzLl9pbml0QXJyYXkobnVtYmVyLGJhc2UsZW5kaWFuKTsiaGV4Ij09PWJhc2UmJihiYXNlPTE2KSxhc3NlcnQoYmFzZT09PSgwfGJhc2UpJiZiYXNlPj0yJiZiYXNlPD0zNik7dmFyIHN0YXJ0PTA7Ii0iPT09KG51bWJlcj1udW1iZXIudG9TdHJpbmcoKS5yZXBsYWNlKC9ccysvZywiIikpWzBdJiYoc3RhcnQrKyx0aGlzLm5lZ2F0aXZlPTEpLHN0YXJ0PG51bWJlci5sZW5ndGgmJigxNj09PWJhc2U/dGhpcy5fcGFyc2VIZXgobnVtYmVyLHN0YXJ0LGVuZGlhbik6KHRoaXMuX3BhcnNlQmFzZShudW1iZXIsYmFzZSxzdGFydCksImxlIj09PWVuZGlhbiYmdGhpcy5faW5pdEFycmF5KHRoaXMudG9BcnJheSgpLGJhc2UsZW5kaWFuKSkpfSxCTi5wcm90b3R5cGUuX2luaXROdW1iZXI9ZnVuY3Rpb24gX2luaXROdW1iZXIobnVtYmVyLGJhc2UsZW5kaWFuKXtudW1iZXI8MCYmKHRoaXMubmVnYXRpdmU9MSxudW1iZXI9LW51bWJlciksbnVtYmVyPDY3MTA4ODY0Pyh0aGlzLndvcmRzPVs2NzEwODg2MyZudW1iZXJdLHRoaXMubGVuZ3RoPTEpOm51bWJlcjw0NTAzNTk5NjI3MzcwNDk2Pyh0aGlzLndvcmRzPVs2NzEwODg2MyZudW1iZXIsbnVtYmVyLzY3MTA4ODY0JjY3MTA4ODYzXSx0aGlzLmxlbmd0aD0yKTooYXNzZXJ0KG51bWJlcjw5MDA3MTk5MjU0NzQwOTkyKSx0aGlzLndvcmRzPVs2NzEwODg2MyZudW1iZXIsbnVtYmVyLzY3MTA4ODY0JjY3MTA4ODYzLDFdLHRoaXMubGVuZ3RoPTMpLCJsZSI9PT1lbmRpYW4mJnRoaXMuX2luaXRBcnJheSh0aGlzLnRvQXJyYXkoKSxiYXNlLGVuZGlhbil9LEJOLnByb3RvdHlwZS5faW5pdEFycmF5PWZ1bmN0aW9uIF9pbml0QXJyYXkobnVtYmVyLGJhc2UsZW5kaWFuKXtpZihhc3NlcnQoIm51bWJlciI9PXR5cGVvZiBudW1iZXIubGVuZ3RoKSxudW1iZXIubGVuZ3RoPD0wKXJldHVybiB0aGlzLndvcmRzPVswXSx0aGlzLmxlbmd0aD0xLHRoaXM7dGhpcy5sZW5ndGg9TWF0aC5jZWlsKG51bWJlci5sZW5ndGgvMyksdGhpcy53b3Jkcz1uZXcgQXJyYXkodGhpcy5sZW5ndGgpO2Zvcih2YXIgaT0wO2k8dGhpcy5sZW5ndGg7aSsrKXRoaXMud29yZHNbaV09MDt2YXIgaix3LG9mZj0wO2lmKCJiZSI9PT1lbmRpYW4pZm9yKGk9bnVtYmVyLmxlbmd0aC0xLGo9MDtpPj0wO2ktPTMpdz1udW1iZXJbaV18bnVtYmVyW2ktMV08PDh8bnVtYmVyW2ktMl08PDE2LHRoaXMud29yZHNbal18PXc8PG9mZiY2NzEwODg2Myx0aGlzLndvcmRzW2orMV09dz4+PjI2LW9mZiY2NzEwODg2Mywob2ZmKz0yNCk+PTI2JiYob2ZmLT0yNixqKyspO2Vsc2UgaWYoImxlIj09PWVuZGlhbilmb3IoaT0wLGo9MDtpPG51bWJlci5sZW5ndGg7aSs9Myl3PW51bWJlcltpXXxudW1iZXJbaSsxXTw8OHxudW1iZXJbaSsyXTw8MTYsdGhpcy53b3Jkc1tqXXw9dzw8b2ZmJjY3MTA4ODYzLHRoaXMud29yZHNbaisxXT13Pj4+MjYtb2ZmJjY3MTA4ODYzLChvZmYrPTI0KT49MjYmJihvZmYtPTI2LGorKyk7cmV0dXJuIHRoaXMuc3RyaXAoKX0sQk4ucHJvdG90eXBlLl9wYXJzZUhleD1mdW5jdGlvbiBfcGFyc2VIZXgobnVtYmVyLHN0YXJ0LGVuZGlhbil7dGhpcy5sZW5ndGg9TWF0aC5jZWlsKChudW1iZXIubGVuZ3RoLXN0YXJ0KS82KSx0aGlzLndvcmRzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCk7Zm9yKHZhciBpPTA7aTx0aGlzLmxlbmd0aDtpKyspdGhpcy53b3Jkc1tpXT0wO3ZhciB3LG9mZj0wLGo9MDtpZigiYmUiPT09ZW5kaWFuKWZvcihpPW51bWJlci5sZW5ndGgtMTtpPj1zdGFydDtpLT0yKXc9cGFyc2VIZXhCeXRlKG51bWJlcixzdGFydCxpKTw8b2ZmLHRoaXMud29yZHNbal18PTY3MTA4ODYzJncsb2ZmPj0xOD8ob2ZmLT0xOCxqKz0xLHRoaXMud29yZHNbal18PXc+Pj4yNik6b2ZmKz04O2Vsc2UgZm9yKGk9KG51bWJlci5sZW5ndGgtc3RhcnQpJTI9PTA/c3RhcnQrMTpzdGFydDtpPG51bWJlci5sZW5ndGg7aSs9Mil3PXBhcnNlSGV4Qnl0ZShudW1iZXIsc3RhcnQsaSk8PG9mZix0aGlzLndvcmRzW2pdfD02NzEwODg2MyZ3LG9mZj49MTg/KG9mZi09MTgsais9MSx0aGlzLndvcmRzW2pdfD13Pj4+MjYpOm9mZis9ODt0aGlzLnN0cmlwKCl9LEJOLnByb3RvdHlwZS5fcGFyc2VCYXNlPWZ1bmN0aW9uIF9wYXJzZUJhc2UobnVtYmVyLGJhc2Usc3RhcnQpe3RoaXMud29yZHM9WzBdLHRoaXMubGVuZ3RoPTE7Zm9yKHZhciBsaW1iTGVuPTAsbGltYlBvdz0xO2xpbWJQb3c8PTY3MTA4ODYzO2xpbWJQb3cqPWJhc2UpbGltYkxlbisrO2xpbWJMZW4tLSxsaW1iUG93PWxpbWJQb3cvYmFzZXwwO2Zvcih2YXIgdG90YWw9bnVtYmVyLmxlbmd0aC1zdGFydCxtb2Q9dG90YWwlbGltYkxlbixlbmQ9TWF0aC5taW4odG90YWwsdG90YWwtbW9kKStzdGFydCx3b3JkPTAsaT1zdGFydDtpPGVuZDtpKz1saW1iTGVuKXdvcmQ9cGFyc2VCYXNlKG51bWJlcixpLGkrbGltYkxlbixiYXNlKSx0aGlzLmltdWxuKGxpbWJQb3cpLHRoaXMud29yZHNbMF0rd29yZDw2NzEwODg2ND90aGlzLndvcmRzWzBdKz13b3JkOnRoaXMuX2lhZGRuKHdvcmQpO2lmKDAhPT1tb2Qpe3ZhciBwb3c9MTtmb3Iod29yZD1wYXJzZUJhc2UobnVtYmVyLGksbnVtYmVyLmxlbmd0aCxiYXNlKSxpPTA7aTxtb2Q7aSsrKXBvdyo9YmFzZTt0aGlzLmltdWxuKHBvdyksdGhpcy53b3Jkc1swXSt3b3JkPDY3MTA4ODY0P3RoaXMud29yZHNbMF0rPXdvcmQ6dGhpcy5faWFkZG4od29yZCl9dGhpcy5zdHJpcCgpfSxCTi5wcm90b3R5cGUuY29weT1mdW5jdGlvbiBjb3B5KGRlc3Qpe2Rlc3Qud29yZHM9bmV3IEFycmF5KHRoaXMubGVuZ3RoKTtmb3IodmFyIGk9MDtpPHRoaXMubGVuZ3RoO2krKylkZXN0LndvcmRzW2ldPXRoaXMud29yZHNbaV07ZGVzdC5sZW5ndGg9dGhpcy5sZW5ndGgsZGVzdC5uZWdhdGl2ZT10aGlzLm5lZ2F0aXZlLGRlc3QucmVkPXRoaXMucmVkfSxCTi5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24gY2xvbmUoKXt2YXIgcj1uZXcgQk4obnVsbCk7cmV0dXJuIHRoaXMuY29weShyKSxyfSxCTi5wcm90b3R5cGUuX2V4cGFuZD1mdW5jdGlvbiBfZXhwYW5kKHNpemUpe2Zvcig7dGhpcy5sZW5ndGg8c2l6ZTspdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCsrXT0wO3JldHVybiB0aGlzfSxCTi5wcm90b3R5cGUuc3RyaXA9ZnVuY3Rpb24gc3RyaXAoKXtmb3IoO3RoaXMubGVuZ3RoPjEmJjA9PT10aGlzLndvcmRzW3RoaXMubGVuZ3RoLTFdOyl0aGlzLmxlbmd0aC0tO3JldHVybiB0aGlzLl9ub3JtU2lnbigpfSxCTi5wcm90b3R5cGUuX25vcm1TaWduPWZ1bmN0aW9uIF9ub3JtU2lnbigpe3JldHVybiAxPT09dGhpcy5sZW5ndGgmJjA9PT10aGlzLndvcmRzWzBdJiYodGhpcy5uZWdhdGl2ZT0wKSx0aGlzfSxCTi5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbiBpbnNwZWN0KCl7cmV0dXJuKHRoaXMucmVkPyI8Qk4tUjogIjoiPEJOOiAiKSt0aGlzLnRvU3RyaW5nKDE2KSsiPiJ9O3ZhciB6ZXJvcz1bIiIsIjAiLCIwMCIsIjAwMCIsIjAwMDAiLCIwMDAwMCIsIjAwMDAwMCIsIjAwMDAwMDAiLCIwMDAwMDAwMCIsIjAwMDAwMDAwMCIsIjAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiXSxncm91cFNpemVzPVswLDAsMjUsMTYsMTIsMTEsMTAsOSw4LDgsNyw3LDcsNyw2LDYsNiw2LDYsNiw2LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDVdLGdyb3VwQmFzZXM9WzAsMCwzMzU1NDQzMiw0MzA0NjcyMSwxNjc3NzIxNiw0ODgyODEyNSw2MDQ2NjE3Niw0MDM1MzYwNywxNjc3NzIxNiw0MzA0NjcyMSwxZTcsMTk0ODcxNzEsMzU4MzE4MDgsNjI3NDg1MTcsNzUyOTUzNiwxMTM5MDYyNSwxNjc3NzIxNiwyNDEzNzU2OSwzNDAxMjIyNCw0NzA0NTg4MSw2NGU2LDQwODQxMDEsNTE1MzYzMiw2NDM2MzQzLDc5NjI2MjQsOTc2NTYyNSwxMTg4MTM3NiwxNDM0ODkwNywxNzIxMDM2OCwyMDUxMTE0OSwyNDNlNSwyODYyOTE1MSwzMzU1NDQzMiwzOTEzNTM5Myw0NTQzNTQyNCw1MjUyMTg3NSw2MDQ2NjE3Nl07ZnVuY3Rpb24gc21hbGxNdWxUbyhzZWxmLG51bSxvdXQpe291dC5uZWdhdGl2ZT1udW0ubmVnYXRpdmVec2VsZi5uZWdhdGl2ZTt2YXIgbGVuPXNlbGYubGVuZ3RoK251bS5sZW5ndGh8MDtvdXQubGVuZ3RoPWxlbixsZW49bGVuLTF8MDt2YXIgYT0wfHNlbGYud29yZHNbMF0sYj0wfG51bS53b3Jkc1swXSxyPWEqYixsbz02NzEwODg2MyZyLGNhcnJ5PXIvNjcxMDg4NjR8MDtvdXQud29yZHNbMF09bG87Zm9yKHZhciBrPTE7azxsZW47aysrKXtmb3IodmFyIG5jYXJyeT1jYXJyeT4+PjI2LHJ3b3JkPTY3MTA4ODYzJmNhcnJ5LG1heEo9TWF0aC5taW4oayxudW0ubGVuZ3RoLTEpLGo9TWF0aC5tYXgoMCxrLXNlbGYubGVuZ3RoKzEpO2o8PW1heEo7aisrKXt2YXIgaT1rLWp8MDtuY2FycnkrPShyPShhPTB8c2VsZi53b3Jkc1tpXSkqKGI9MHxudW0ud29yZHNbal0pK3J3b3JkKS82NzEwODg2NHwwLHJ3b3JkPTY3MTA4ODYzJnJ9b3V0LndvcmRzW2tdPTB8cndvcmQsY2Fycnk9MHxuY2Fycnl9cmV0dXJuIDAhPT1jYXJyeT9vdXQud29yZHNba109MHxjYXJyeTpvdXQubGVuZ3RoLS0sb3V0LnN0cmlwKCl9Qk4ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uIHRvU3RyaW5nKGJhc2UscGFkZGluZyl7dmFyIG91dDtpZihwYWRkaW5nPTB8cGFkZGluZ3x8MSwxNj09PShiYXNlPWJhc2V8fDEwKXx8ImhleCI9PT1iYXNlKXtvdXQ9IiI7Zm9yKHZhciBvZmY9MCxjYXJyeT0wLGk9MDtpPHRoaXMubGVuZ3RoO2krKyl7dmFyIHc9dGhpcy53b3Jkc1tpXSx3b3JkPSgxNjc3NzIxNSYodzw8b2ZmfGNhcnJ5KSkudG9TdHJpbmcoMTYpO2NhcnJ5PXc+Pj4yNC1vZmYmMTY3NzcyMTUsKG9mZis9Mik+PTI2JiYob2ZmLT0yNixpLS0pLG91dD0wIT09Y2Fycnl8fGkhPT10aGlzLmxlbmd0aC0xP3plcm9zWzYtd29yZC5sZW5ndGhdK3dvcmQrb3V0OndvcmQrb3V0fWZvcigwIT09Y2FycnkmJihvdXQ9Y2FycnkudG9TdHJpbmcoMTYpK291dCk7b3V0Lmxlbmd0aCVwYWRkaW5nIT09MDspb3V0PSIwIitvdXQ7cmV0dXJuIDAhPT10aGlzLm5lZ2F0aXZlJiYob3V0PSItIitvdXQpLG91dH1pZihiYXNlPT09KDB8YmFzZSkmJmJhc2U+PTImJmJhc2U8PTM2KXt2YXIgZ3JvdXBTaXplPWdyb3VwU2l6ZXNbYmFzZV0sZ3JvdXBCYXNlPWdyb3VwQmFzZXNbYmFzZV07b3V0PSIiO3ZhciBjPXRoaXMuY2xvbmUoKTtmb3IoYy5uZWdhdGl2ZT0wOyFjLmlzWmVybygpOyl7dmFyIHI9Yy5tb2RuKGdyb3VwQmFzZSkudG9TdHJpbmcoYmFzZSk7b3V0PShjPWMuaWRpdm4oZ3JvdXBCYXNlKSkuaXNaZXJvKCk/citvdXQ6emVyb3NbZ3JvdXBTaXplLXIubGVuZ3RoXStyK291dH1mb3IodGhpcy5pc1plcm8oKSYmKG91dD0iMCIrb3V0KTtvdXQubGVuZ3RoJXBhZGRpbmchPT0wOylvdXQ9IjAiK291dDtyZXR1cm4gMCE9PXRoaXMubmVnYXRpdmUmJihvdXQ9Ii0iK291dCksb3V0fWFzc2VydCghMSwiQmFzZSBzaG91bGQgYmUgYmV0d2VlbiAyIGFuZCAzNiIpfSxCTi5wcm90b3R5cGUudG9OdW1iZXI9ZnVuY3Rpb24gdG9OdW1iZXIoKXt2YXIgcmV0PXRoaXMud29yZHNbMF07cmV0dXJuIDI9PT10aGlzLmxlbmd0aD9yZXQrPTY3MTA4ODY0KnRoaXMud29yZHNbMV06Mz09PXRoaXMubGVuZ3RoJiYxPT09dGhpcy53b3Jkc1syXT9yZXQrPTQ1MDM1OTk2MjczNzA0OTYrNjcxMDg4NjQqdGhpcy53b3Jkc1sxXTp0aGlzLmxlbmd0aD4yJiZhc3NlcnQoITEsIk51bWJlciBjYW4gb25seSBzYWZlbHkgc3RvcmUgdXAgdG8gNTMgYml0cyIpLDAhPT10aGlzLm5lZ2F0aXZlPy1yZXQ6cmV0fSxCTi5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uIHRvSlNPTigpe3JldHVybiB0aGlzLnRvU3RyaW5nKDE2KX0sQk4ucHJvdG90eXBlLnRvQnVmZmVyPWZ1bmN0aW9uIHRvQnVmZmVyKGVuZGlhbixsZW5ndGgpe3JldHVybiBhc3NlcnQodm9pZCAwIT09QnVmZmVyKSx0aGlzLnRvQXJyYXlMaWtlKEJ1ZmZlcixlbmRpYW4sbGVuZ3RoKX0sQk4ucHJvdG90eXBlLnRvQXJyYXk9ZnVuY3Rpb24gdG9BcnJheShlbmRpYW4sbGVuZ3RoKXtyZXR1cm4gdGhpcy50b0FycmF5TGlrZShBcnJheSxlbmRpYW4sbGVuZ3RoKX0sQk4ucHJvdG90eXBlLnRvQXJyYXlMaWtlPWZ1bmN0aW9uIHRvQXJyYXlMaWtlKEFycmF5VHlwZSxlbmRpYW4sbGVuZ3RoKXt2YXIgYnl0ZUxlbmd0aD10aGlzLmJ5dGVMZW5ndGgoKSxyZXFMZW5ndGg9bGVuZ3RofHxNYXRoLm1heCgxLGJ5dGVMZW5ndGgpO2Fzc2VydChieXRlTGVuZ3RoPD1yZXFMZW5ndGgsImJ5dGUgYXJyYXkgbG9uZ2VyIHRoYW4gZGVzaXJlZCBsZW5ndGgiKSxhc3NlcnQocmVxTGVuZ3RoPjAsIlJlcXVlc3RlZCBhcnJheSBsZW5ndGggPD0gMCIpLHRoaXMuc3RyaXAoKTt2YXIgYixpLGxpdHRsZUVuZGlhbj0ibGUiPT09ZW5kaWFuLHJlcz1uZXcgQXJyYXlUeXBlKHJlcUxlbmd0aCkscT10aGlzLmNsb25lKCk7aWYobGl0dGxlRW5kaWFuKXtmb3IoaT0wOyFxLmlzWmVybygpO2krKyliPXEuYW5kbG4oMjU1KSxxLml1c2hybig4KSxyZXNbaV09Yjtmb3IoO2k8cmVxTGVuZ3RoO2krKylyZXNbaV09MH1lbHNle2ZvcihpPTA7aTxyZXFMZW5ndGgtYnl0ZUxlbmd0aDtpKyspcmVzW2ldPTA7Zm9yKGk9MDshcS5pc1plcm8oKTtpKyspYj1xLmFuZGxuKDI1NSkscS5pdXNocm4oOCkscmVzW3JlcUxlbmd0aC1pLTFdPWJ9cmV0dXJuIHJlc30sTWF0aC5jbHozMj9CTi5wcm90b3R5cGUuX2NvdW50Qml0cz1mdW5jdGlvbiBfY291bnRCaXRzKHcpe3JldHVybiAzMi1NYXRoLmNsejMyKHcpfTpCTi5wcm90b3R5cGUuX2NvdW50Qml0cz1mdW5jdGlvbiBfY291bnRCaXRzKHcpe3ZhciB0PXcscj0wO3JldHVybiB0Pj00MDk2JiYocis9MTMsdD4+Pj0xMyksdD49NjQmJihyKz03LHQ+Pj49NyksdD49OCYmKHIrPTQsdD4+Pj00KSx0Pj0yJiYocis9Mix0Pj4+PTIpLHIrdH0sQk4ucHJvdG90eXBlLl96ZXJvQml0cz1mdW5jdGlvbiBfemVyb0JpdHModyl7aWYoMD09PXcpcmV0dXJuIDI2O3ZhciB0PXcscj0wO3JldHVybiA4MTkxJnR8fChyKz0xMyx0Pj4+PTEzKSwxMjcmdHx8KHIrPTcsdD4+Pj03KSwxNSZ0fHwocis9NCx0Pj4+PTQpLDMmdHx8KHIrPTIsdD4+Pj0yKSwxJnR8fHIrKyxyfSxCTi5wcm90b3R5cGUuYml0TGVuZ3RoPWZ1bmN0aW9uIGJpdExlbmd0aCgpe3ZhciB3PXRoaXMud29yZHNbdGhpcy5sZW5ndGgtMV0saGk9dGhpcy5fY291bnRCaXRzKHcpO3JldHVybiAyNioodGhpcy5sZW5ndGgtMSkraGl9LEJOLnByb3RvdHlwZS56ZXJvQml0cz1mdW5jdGlvbiB6ZXJvQml0cygpe2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIDA7Zm9yKHZhciByPTAsaT0wO2k8dGhpcy5sZW5ndGg7aSsrKXt2YXIgYj10aGlzLl96ZXJvQml0cyh0aGlzLndvcmRzW2ldKTtpZihyKz1iLDI2IT09YilicmVha31yZXR1cm4gcn0sQk4ucHJvdG90eXBlLmJ5dGVMZW5ndGg9ZnVuY3Rpb24gYnl0ZUxlbmd0aCgpe3JldHVybiBNYXRoLmNlaWwodGhpcy5iaXRMZW5ndGgoKS84KX0sQk4ucHJvdG90eXBlLnRvVHdvcz1mdW5jdGlvbiB0b1R3b3Mod2lkdGgpe3JldHVybiAwIT09dGhpcy5uZWdhdGl2ZT90aGlzLmFicygpLmlub3RuKHdpZHRoKS5pYWRkbigxKTp0aGlzLmNsb25lKCl9LEJOLnByb3RvdHlwZS5mcm9tVHdvcz1mdW5jdGlvbiBmcm9tVHdvcyh3aWR0aCl7cmV0dXJuIHRoaXMudGVzdG4od2lkdGgtMSk/dGhpcy5ub3RuKHdpZHRoKS5pYWRkbigxKS5pbmVnKCk6dGhpcy5jbG9uZSgpfSxCTi5wcm90b3R5cGUuaXNOZWc9ZnVuY3Rpb24gaXNOZWcoKXtyZXR1cm4gMCE9PXRoaXMubmVnYXRpdmV9LEJOLnByb3RvdHlwZS5uZWc9ZnVuY3Rpb24gbmVnKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pbmVnKCl9LEJOLnByb3RvdHlwZS5pbmVnPWZ1bmN0aW9uIGluZWcoKXtyZXR1cm4gdGhpcy5pc1plcm8oKXx8KHRoaXMubmVnYXRpdmVePTEpLHRoaXN9LEJOLnByb3RvdHlwZS5pdW9yPWZ1bmN0aW9uIGl1b3IobnVtKXtmb3IoO3RoaXMubGVuZ3RoPG51bS5sZW5ndGg7KXRoaXMud29yZHNbdGhpcy5sZW5ndGgrK109MDtmb3IodmFyIGk9MDtpPG51bS5sZW5ndGg7aSsrKXRoaXMud29yZHNbaV09dGhpcy53b3Jkc1tpXXxudW0ud29yZHNbaV07cmV0dXJuIHRoaXMuc3RyaXAoKX0sQk4ucHJvdG90eXBlLmlvcj1mdW5jdGlvbiBpb3IobnVtKXtyZXR1cm4gYXNzZXJ0KDA9PT0odGhpcy5uZWdhdGl2ZXxudW0ubmVnYXRpdmUpKSx0aGlzLml1b3IobnVtKX0sQk4ucHJvdG90eXBlLm9yPWZ1bmN0aW9uIG9yKG51bSl7cmV0dXJuIHRoaXMubGVuZ3RoPm51bS5sZW5ndGg/dGhpcy5jbG9uZSgpLmlvcihudW0pOm51bS5jbG9uZSgpLmlvcih0aGlzKX0sQk4ucHJvdG90eXBlLnVvcj1mdW5jdGlvbiB1b3IobnVtKXtyZXR1cm4gdGhpcy5sZW5ndGg+bnVtLmxlbmd0aD90aGlzLmNsb25lKCkuaXVvcihudW0pOm51bS5jbG9uZSgpLml1b3IodGhpcyl9LEJOLnByb3RvdHlwZS5pdWFuZD1mdW5jdGlvbiBpdWFuZChudW0pe3ZhciBiO2I9dGhpcy5sZW5ndGg+bnVtLmxlbmd0aD9udW06dGhpcztmb3IodmFyIGk9MDtpPGIubGVuZ3RoO2krKyl0aGlzLndvcmRzW2ldPXRoaXMud29yZHNbaV0mbnVtLndvcmRzW2ldO3JldHVybiB0aGlzLmxlbmd0aD1iLmxlbmd0aCx0aGlzLnN0cmlwKCl9LEJOLnByb3RvdHlwZS5pYW5kPWZ1bmN0aW9uIGlhbmQobnVtKXtyZXR1cm4gYXNzZXJ0KDA9PT0odGhpcy5uZWdhdGl2ZXxudW0ubmVnYXRpdmUpKSx0aGlzLml1YW5kKG51bSl9LEJOLnByb3RvdHlwZS5hbmQ9ZnVuY3Rpb24gYW5kKG51bSl7cmV0dXJuIHRoaXMubGVuZ3RoPm51bS5sZW5ndGg/dGhpcy5jbG9uZSgpLmlhbmQobnVtKTpudW0uY2xvbmUoKS5pYW5kKHRoaXMpfSxCTi5wcm90b3R5cGUudWFuZD1mdW5jdGlvbiB1YW5kKG51bSl7cmV0dXJuIHRoaXMubGVuZ3RoPm51bS5sZW5ndGg/dGhpcy5jbG9uZSgpLml1YW5kKG51bSk6bnVtLmNsb25lKCkuaXVhbmQodGhpcyl9LEJOLnByb3RvdHlwZS5pdXhvcj1mdW5jdGlvbiBpdXhvcihudW0pe3ZhciBhLGI7dGhpcy5sZW5ndGg+bnVtLmxlbmd0aD8oYT10aGlzLGI9bnVtKTooYT1udW0sYj10aGlzKTtmb3IodmFyIGk9MDtpPGIubGVuZ3RoO2krKyl0aGlzLndvcmRzW2ldPWEud29yZHNbaV1eYi53b3Jkc1tpXTtpZih0aGlzIT09YSlmb3IoO2k8YS5sZW5ndGg7aSsrKXRoaXMud29yZHNbaV09YS53b3Jkc1tpXTtyZXR1cm4gdGhpcy5sZW5ndGg9YS5sZW5ndGgsdGhpcy5zdHJpcCgpfSxCTi5wcm90b3R5cGUuaXhvcj1mdW5jdGlvbiBpeG9yKG51bSl7cmV0dXJuIGFzc2VydCgwPT09KHRoaXMubmVnYXRpdmV8bnVtLm5lZ2F0aXZlKSksdGhpcy5pdXhvcihudW0pfSxCTi5wcm90b3R5cGUueG9yPWZ1bmN0aW9uIHhvcihudW0pe3JldHVybiB0aGlzLmxlbmd0aD5udW0ubGVuZ3RoP3RoaXMuY2xvbmUoKS5peG9yKG51bSk6bnVtLmNsb25lKCkuaXhvcih0aGlzKX0sQk4ucHJvdG90eXBlLnV4b3I9ZnVuY3Rpb24gdXhvcihudW0pe3JldHVybiB0aGlzLmxlbmd0aD5udW0ubGVuZ3RoP3RoaXMuY2xvbmUoKS5pdXhvcihudW0pOm51bS5jbG9uZSgpLml1eG9yKHRoaXMpfSxCTi5wcm90b3R5cGUuaW5vdG49ZnVuY3Rpb24gaW5vdG4od2lkdGgpe2Fzc2VydCgibnVtYmVyIj09dHlwZW9mIHdpZHRoJiZ3aWR0aD49MCk7dmFyIGJ5dGVzTmVlZGVkPTB8TWF0aC5jZWlsKHdpZHRoLzI2KSxiaXRzTGVmdD13aWR0aCUyNjt0aGlzLl9leHBhbmQoYnl0ZXNOZWVkZWQpLGJpdHNMZWZ0PjAmJmJ5dGVzTmVlZGVkLS07Zm9yKHZhciBpPTA7aTxieXRlc05lZWRlZDtpKyspdGhpcy53b3Jkc1tpXT02NzEwODg2MyZ+dGhpcy53b3Jkc1tpXTtyZXR1cm4gYml0c0xlZnQ+MCYmKHRoaXMud29yZHNbaV09fnRoaXMud29yZHNbaV0mNjcxMDg4NjM+PjI2LWJpdHNMZWZ0KSx0aGlzLnN0cmlwKCl9LEJOLnByb3RvdHlwZS5ub3RuPWZ1bmN0aW9uIG5vdG4od2lkdGgpe3JldHVybiB0aGlzLmNsb25lKCkuaW5vdG4od2lkdGgpfSxCTi5wcm90b3R5cGUuc2V0bj1mdW5jdGlvbiBzZXRuKGJpdCx2YWwpe2Fzc2VydCgibnVtYmVyIj09dHlwZW9mIGJpdCYmYml0Pj0wKTt2YXIgb2ZmPWJpdC8yNnwwLHdiaXQ9Yml0JTI2O3JldHVybiB0aGlzLl9leHBhbmQob2ZmKzEpLHRoaXMud29yZHNbb2ZmXT12YWw/dGhpcy53b3Jkc1tvZmZdfDE8PHdiaXQ6dGhpcy53b3Jkc1tvZmZdJn4oMTw8d2JpdCksdGhpcy5zdHJpcCgpfSxCTi5wcm90b3R5cGUuaWFkZD1mdW5jdGlvbiBpYWRkKG51bSl7dmFyIHIsYSxiO2lmKDAhPT10aGlzLm5lZ2F0aXZlJiYwPT09bnVtLm5lZ2F0aXZlKXJldHVybiB0aGlzLm5lZ2F0aXZlPTAscj10aGlzLmlzdWIobnVtKSx0aGlzLm5lZ2F0aXZlXj0xLHRoaXMuX25vcm1TaWduKCk7aWYoMD09PXRoaXMubmVnYXRpdmUmJjAhPT1udW0ubmVnYXRpdmUpcmV0dXJuIG51bS5uZWdhdGl2ZT0wLHI9dGhpcy5pc3ViKG51bSksbnVtLm5lZ2F0aXZlPTEsci5fbm9ybVNpZ24oKTt0aGlzLmxlbmd0aD5udW0ubGVuZ3RoPyhhPXRoaXMsYj1udW0pOihhPW51bSxiPXRoaXMpO2Zvcih2YXIgY2Fycnk9MCxpPTA7aTxiLmxlbmd0aDtpKyspcj0oMHxhLndvcmRzW2ldKSsoMHxiLndvcmRzW2ldKStjYXJyeSx0aGlzLndvcmRzW2ldPTY3MTA4ODYzJnIsY2Fycnk9cj4+PjI2O2Zvcig7MCE9PWNhcnJ5JiZpPGEubGVuZ3RoO2krKylyPSgwfGEud29yZHNbaV0pK2NhcnJ5LHRoaXMud29yZHNbaV09NjcxMDg4NjMmcixjYXJyeT1yPj4+MjY7aWYodGhpcy5sZW5ndGg9YS5sZW5ndGgsMCE9PWNhcnJ5KXRoaXMud29yZHNbdGhpcy5sZW5ndGhdPWNhcnJ5LHRoaXMubGVuZ3RoKys7ZWxzZSBpZihhIT09dGhpcylmb3IoO2k8YS5sZW5ndGg7aSsrKXRoaXMud29yZHNbaV09YS53b3Jkc1tpXTtyZXR1cm4gdGhpc30sQk4ucHJvdG90eXBlLmFkZD1mdW5jdGlvbiBhZGQobnVtKXt2YXIgcmVzO3JldHVybiAwIT09bnVtLm5lZ2F0aXZlJiYwPT09dGhpcy5uZWdhdGl2ZT8obnVtLm5lZ2F0aXZlPTAscmVzPXRoaXMuc3ViKG51bSksbnVtLm5lZ2F0aXZlXj0xLHJlcyk6MD09PW51bS5uZWdhdGl2ZSYmMCE9PXRoaXMubmVnYXRpdmU/KHRoaXMubmVnYXRpdmU9MCxyZXM9bnVtLnN1Yih0aGlzKSx0aGlzLm5lZ2F0aXZlPTEscmVzKTp0aGlzLmxlbmd0aD5udW0ubGVuZ3RoP3RoaXMuY2xvbmUoKS5pYWRkKG51bSk6bnVtLmNsb25lKCkuaWFkZCh0aGlzKX0sQk4ucHJvdG90eXBlLmlzdWI9ZnVuY3Rpb24gaXN1YihudW0pe2lmKDAhPT1udW0ubmVnYXRpdmUpe251bS5uZWdhdGl2ZT0wO3ZhciByPXRoaXMuaWFkZChudW0pO3JldHVybiBudW0ubmVnYXRpdmU9MSxyLl9ub3JtU2lnbigpfWlmKDAhPT10aGlzLm5lZ2F0aXZlKXJldHVybiB0aGlzLm5lZ2F0aXZlPTAsdGhpcy5pYWRkKG51bSksdGhpcy5uZWdhdGl2ZT0xLHRoaXMuX25vcm1TaWduKCk7dmFyIGEsYixjbXA9dGhpcy5jbXAobnVtKTtpZigwPT09Y21wKXJldHVybiB0aGlzLm5lZ2F0aXZlPTAsdGhpcy5sZW5ndGg9MSx0aGlzLndvcmRzWzBdPTAsdGhpcztjbXA+MD8oYT10aGlzLGI9bnVtKTooYT1udW0sYj10aGlzKTtmb3IodmFyIGNhcnJ5PTAsaT0wO2k8Yi5sZW5ndGg7aSsrKWNhcnJ5PShyPSgwfGEud29yZHNbaV0pLSgwfGIud29yZHNbaV0pK2NhcnJ5KT4+MjYsdGhpcy53b3Jkc1tpXT02NzEwODg2MyZyO2Zvcig7MCE9PWNhcnJ5JiZpPGEubGVuZ3RoO2krKyljYXJyeT0ocj0oMHxhLndvcmRzW2ldKStjYXJyeSk+PjI2LHRoaXMud29yZHNbaV09NjcxMDg4NjMmcjtpZigwPT09Y2FycnkmJmk8YS5sZW5ndGgmJmEhPT10aGlzKWZvcig7aTxhLmxlbmd0aDtpKyspdGhpcy53b3Jkc1tpXT1hLndvcmRzW2ldO3JldHVybiB0aGlzLmxlbmd0aD1NYXRoLm1heCh0aGlzLmxlbmd0aCxpKSxhIT09dGhpcyYmKHRoaXMubmVnYXRpdmU9MSksdGhpcy5zdHJpcCgpfSxCTi5wcm90b3R5cGUuc3ViPWZ1bmN0aW9uIHN1YihudW0pe3JldHVybiB0aGlzLmNsb25lKCkuaXN1YihudW0pfTt2YXIgY29tYjEwTXVsVG89ZnVuY3Rpb24gY29tYjEwTXVsVG8oc2VsZixudW0sb3V0KXt2YXIgbG8sbWlkLGhpLGE9c2VsZi53b3JkcyxiPW51bS53b3JkcyxvPW91dC53b3JkcyxjPTAsYTA9MHxhWzBdLGFsMD04MTkxJmEwLGFoMD1hMD4+PjEzLGExPTB8YVsxXSxhbDE9ODE5MSZhMSxhaDE9YTE+Pj4xMyxhMj0wfGFbMl0sYWwyPTgxOTEmYTIsYWgyPWEyPj4+MTMsYTM9MHxhWzNdLGFsMz04MTkxJmEzLGFoMz1hMz4+PjEzLGE0PTB8YVs0XSxhbDQ9ODE5MSZhNCxhaDQ9YTQ+Pj4xMyxhNT0wfGFbNV0sYWw1PTgxOTEmYTUsYWg1PWE1Pj4+MTMsYTY9MHxhWzZdLGFsNj04MTkxJmE2LGFoNj1hNj4+PjEzLGE3PTB8YVs3XSxhbDc9ODE5MSZhNyxhaDc9YTc+Pj4xMyxhOD0wfGFbOF0sYWw4PTgxOTEmYTgsYWg4PWE4Pj4+MTMsYTk9MHxhWzldLGFsOT04MTkxJmE5LGFoOT1hOT4+PjEzLGIwPTB8YlswXSxibDA9ODE5MSZiMCxiaDA9YjA+Pj4xMyxiMT0wfGJbMV0sYmwxPTgxOTEmYjEsYmgxPWIxPj4+MTMsYjI9MHxiWzJdLGJsMj04MTkxJmIyLGJoMj1iMj4+PjEzLGIzPTB8YlszXSxibDM9ODE5MSZiMyxiaDM9YjM+Pj4xMyxiND0wfGJbNF0sYmw0PTgxOTEmYjQsYmg0PWI0Pj4+MTMsYjU9MHxiWzVdLGJsNT04MTkxJmI1LGJoNT1iNT4+PjEzLGI2PTB8Yls2XSxibDY9ODE5MSZiNixiaDY9YjY+Pj4xMyxiNz0wfGJbN10sYmw3PTgxOTEmYjcsYmg3PWI3Pj4+MTMsYjg9MHxiWzhdLGJsOD04MTkxJmI4LGJoOD1iOD4+PjEzLGI5PTB8Yls5XSxibDk9ODE5MSZiOSxiaDk9Yjk+Pj4xMztvdXQubmVnYXRpdmU9c2VsZi5uZWdhdGl2ZV5udW0ubmVnYXRpdmUsb3V0Lmxlbmd0aD0xOTt2YXIgdzA9KGMrKGxvPU1hdGguaW11bChhbDAsYmwwKSl8MCkrKCg4MTkxJihtaWQ9KG1pZD1NYXRoLmltdWwoYWwwLGJoMCkpK01hdGguaW11bChhaDAsYmwwKXwwKSk8PDEzKXwwO2M9KChoaT1NYXRoLmltdWwoYWgwLGJoMCkpKyhtaWQ+Pj4xMyl8MCkrKHcwPj4+MjYpfDAsdzAmPTY3MTA4ODYzLGxvPU1hdGguaW11bChhbDEsYmwwKSxtaWQ9KG1pZD1NYXRoLmltdWwoYWwxLGJoMCkpK01hdGguaW11bChhaDEsYmwwKXwwLGhpPU1hdGguaW11bChhaDEsYmgwKTt2YXIgdzE9KGMrKGxvPWxvK01hdGguaW11bChhbDAsYmwxKXwwKXwwKSsoKDgxOTEmKG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwwLGJoMSl8MCkrTWF0aC5pbXVsKGFoMCxibDEpfDApKTw8MTMpfDA7Yz0oKGhpPWhpK01hdGguaW11bChhaDAsYmgxKXwwKSsobWlkPj4+MTMpfDApKyh3MT4+PjI2KXwwLHcxJj02NzEwODg2Myxsbz1NYXRoLmltdWwoYWwyLGJsMCksbWlkPShtaWQ9TWF0aC5pbXVsKGFsMixiaDApKStNYXRoLmltdWwoYWgyLGJsMCl8MCxoaT1NYXRoLmltdWwoYWgyLGJoMCksbG89bG8rTWF0aC5pbXVsKGFsMSxibDEpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDEsYmgxKXwwKStNYXRoLmltdWwoYWgxLGJsMSl8MCxoaT1oaStNYXRoLmltdWwoYWgxLGJoMSl8MDt2YXIgdzI9KGMrKGxvPWxvK01hdGguaW11bChhbDAsYmwyKXwwKXwwKSsoKDgxOTEmKG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwwLGJoMil8MCkrTWF0aC5pbXVsKGFoMCxibDIpfDApKTw8MTMpfDA7Yz0oKGhpPWhpK01hdGguaW11bChhaDAsYmgyKXwwKSsobWlkPj4+MTMpfDApKyh3Mj4+PjI2KXwwLHcyJj02NzEwODg2Myxsbz1NYXRoLmltdWwoYWwzLGJsMCksbWlkPShtaWQ9TWF0aC5pbXVsKGFsMyxiaDApKStNYXRoLmltdWwoYWgzLGJsMCl8MCxoaT1NYXRoLmltdWwoYWgzLGJoMCksbG89bG8rTWF0aC5pbXVsKGFsMixibDEpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDIsYmgxKXwwKStNYXRoLmltdWwoYWgyLGJsMSl8MCxoaT1oaStNYXRoLmltdWwoYWgyLGJoMSl8MCxsbz1sbytNYXRoLmltdWwoYWwxLGJsMil8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMSxiaDIpfDApK01hdGguaW11bChhaDEsYmwyKXwwLGhpPWhpK01hdGguaW11bChhaDEsYmgyKXwwO3ZhciB3Mz0oYysobG89bG8rTWF0aC5pbXVsKGFsMCxibDMpfDApfDApKygoODE5MSYobWlkPShtaWQ9bWlkK01hdGguaW11bChhbDAsYmgzKXwwKStNYXRoLmltdWwoYWgwLGJsMyl8MCkpPDwxMyl8MDtjPSgoaGk9aGkrTWF0aC5pbXVsKGFoMCxiaDMpfDApKyhtaWQ+Pj4xMyl8MCkrKHczPj4+MjYpfDAsdzMmPTY3MTA4ODYzLGxvPU1hdGguaW11bChhbDQsYmwwKSxtaWQ9KG1pZD1NYXRoLmltdWwoYWw0LGJoMCkpK01hdGguaW11bChhaDQsYmwwKXwwLGhpPU1hdGguaW11bChhaDQsYmgwKSxsbz1sbytNYXRoLmltdWwoYWwzLGJsMSl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMyxiaDEpfDApK01hdGguaW11bChhaDMsYmwxKXwwLGhpPWhpK01hdGguaW11bChhaDMsYmgxKXwwLGxvPWxvK01hdGguaW11bChhbDIsYmwyKXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwyLGJoMil8MCkrTWF0aC5pbXVsKGFoMixibDIpfDAsaGk9aGkrTWF0aC5pbXVsKGFoMixiaDIpfDAsbG89bG8rTWF0aC5pbXVsKGFsMSxibDMpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDEsYmgzKXwwKStNYXRoLmltdWwoYWgxLGJsMyl8MCxoaT1oaStNYXRoLmltdWwoYWgxLGJoMyl8MDt2YXIgdzQ9KGMrKGxvPWxvK01hdGguaW11bChhbDAsYmw0KXwwKXwwKSsoKDgxOTEmKG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwwLGJoNCl8MCkrTWF0aC5pbXVsKGFoMCxibDQpfDApKTw8MTMpfDA7Yz0oKGhpPWhpK01hdGguaW11bChhaDAsYmg0KXwwKSsobWlkPj4+MTMpfDApKyh3ND4+PjI2KXwwLHc0Jj02NzEwODg2Myxsbz1NYXRoLmltdWwoYWw1LGJsMCksbWlkPShtaWQ9TWF0aC5pbXVsKGFsNSxiaDApKStNYXRoLmltdWwoYWg1LGJsMCl8MCxoaT1NYXRoLmltdWwoYWg1LGJoMCksbG89bG8rTWF0aC5pbXVsKGFsNCxibDEpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDQsYmgxKXwwKStNYXRoLmltdWwoYWg0LGJsMSl8MCxoaT1oaStNYXRoLmltdWwoYWg0LGJoMSl8MCxsbz1sbytNYXRoLmltdWwoYWwzLGJsMil8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMyxiaDIpfDApK01hdGguaW11bChhaDMsYmwyKXwwLGhpPWhpK01hdGguaW11bChhaDMsYmgyKXwwLGxvPWxvK01hdGguaW11bChhbDIsYmwzKXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwyLGJoMyl8MCkrTWF0aC5pbXVsKGFoMixibDMpfDAsaGk9aGkrTWF0aC5pbXVsKGFoMixiaDMpfDAsbG89bG8rTWF0aC5pbXVsKGFsMSxibDQpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDEsYmg0KXwwKStNYXRoLmltdWwoYWgxLGJsNCl8MCxoaT1oaStNYXRoLmltdWwoYWgxLGJoNCl8MDt2YXIgdzU9KGMrKGxvPWxvK01hdGguaW11bChhbDAsYmw1KXwwKXwwKSsoKDgxOTEmKG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwwLGJoNSl8MCkrTWF0aC5pbXVsKGFoMCxibDUpfDApKTw8MTMpfDA7Yz0oKGhpPWhpK01hdGguaW11bChhaDAsYmg1KXwwKSsobWlkPj4+MTMpfDApKyh3NT4+PjI2KXwwLHc1Jj02NzEwODg2Myxsbz1NYXRoLmltdWwoYWw2LGJsMCksbWlkPShtaWQ9TWF0aC5pbXVsKGFsNixiaDApKStNYXRoLmltdWwoYWg2LGJsMCl8MCxoaT1NYXRoLmltdWwoYWg2LGJoMCksbG89bG8rTWF0aC5pbXVsKGFsNSxibDEpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDUsYmgxKXwwKStNYXRoLmltdWwoYWg1LGJsMSl8MCxoaT1oaStNYXRoLmltdWwoYWg1LGJoMSl8MCxsbz1sbytNYXRoLmltdWwoYWw0LGJsMil8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNCxiaDIpfDApK01hdGguaW11bChhaDQsYmwyKXwwLGhpPWhpK01hdGguaW11bChhaDQsYmgyKXwwLGxvPWxvK01hdGguaW11bChhbDMsYmwzKXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwzLGJoMyl8MCkrTWF0aC5pbXVsKGFoMyxibDMpfDAsaGk9aGkrTWF0aC5pbXVsKGFoMyxiaDMpfDAsbG89bG8rTWF0aC5pbXVsKGFsMixibDQpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDIsYmg0KXwwKStNYXRoLmltdWwoYWgyLGJsNCl8MCxoaT1oaStNYXRoLmltdWwoYWgyLGJoNCl8MCxsbz1sbytNYXRoLmltdWwoYWwxLGJsNSl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMSxiaDUpfDApK01hdGguaW11bChhaDEsYmw1KXwwLGhpPWhpK01hdGguaW11bChhaDEsYmg1KXwwO3ZhciB3Nj0oYysobG89bG8rTWF0aC5pbXVsKGFsMCxibDYpfDApfDApKygoODE5MSYobWlkPShtaWQ9bWlkK01hdGguaW11bChhbDAsYmg2KXwwKStNYXRoLmltdWwoYWgwLGJsNil8MCkpPDwxMyl8MDtjPSgoaGk9aGkrTWF0aC5pbXVsKGFoMCxiaDYpfDApKyhtaWQ+Pj4xMyl8MCkrKHc2Pj4+MjYpfDAsdzYmPTY3MTA4ODYzLGxvPU1hdGguaW11bChhbDcsYmwwKSxtaWQ9KG1pZD1NYXRoLmltdWwoYWw3LGJoMCkpK01hdGguaW11bChhaDcsYmwwKXwwLGhpPU1hdGguaW11bChhaDcsYmgwKSxsbz1sbytNYXRoLmltdWwoYWw2LGJsMSl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNixiaDEpfDApK01hdGguaW11bChhaDYsYmwxKXwwLGhpPWhpK01hdGguaW11bChhaDYsYmgxKXwwLGxvPWxvK01hdGguaW11bChhbDUsYmwyKXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw1LGJoMil8MCkrTWF0aC5pbXVsKGFoNSxibDIpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNSxiaDIpfDAsbG89bG8rTWF0aC5pbXVsKGFsNCxibDMpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDQsYmgzKXwwKStNYXRoLmltdWwoYWg0LGJsMyl8MCxoaT1oaStNYXRoLmltdWwoYWg0LGJoMyl8MCxsbz1sbytNYXRoLmltdWwoYWwzLGJsNCl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMyxiaDQpfDApK01hdGguaW11bChhaDMsYmw0KXwwLGhpPWhpK01hdGguaW11bChhaDMsYmg0KXwwLGxvPWxvK01hdGguaW11bChhbDIsYmw1KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwyLGJoNSl8MCkrTWF0aC5pbXVsKGFoMixibDUpfDAsaGk9aGkrTWF0aC5pbXVsKGFoMixiaDUpfDAsbG89bG8rTWF0aC5pbXVsKGFsMSxibDYpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDEsYmg2KXwwKStNYXRoLmltdWwoYWgxLGJsNil8MCxoaT1oaStNYXRoLmltdWwoYWgxLGJoNil8MDt2YXIgdzc9KGMrKGxvPWxvK01hdGguaW11bChhbDAsYmw3KXwwKXwwKSsoKDgxOTEmKG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwwLGJoNyl8MCkrTWF0aC5pbXVsKGFoMCxibDcpfDApKTw8MTMpfDA7Yz0oKGhpPWhpK01hdGguaW11bChhaDAsYmg3KXwwKSsobWlkPj4+MTMpfDApKyh3Nz4+PjI2KXwwLHc3Jj02NzEwODg2Myxsbz1NYXRoLmltdWwoYWw4LGJsMCksbWlkPShtaWQ9TWF0aC5pbXVsKGFsOCxiaDApKStNYXRoLmltdWwoYWg4LGJsMCl8MCxoaT1NYXRoLmltdWwoYWg4LGJoMCksbG89bG8rTWF0aC5pbXVsKGFsNyxibDEpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDcsYmgxKXwwKStNYXRoLmltdWwoYWg3LGJsMSl8MCxoaT1oaStNYXRoLmltdWwoYWg3LGJoMSl8MCxsbz1sbytNYXRoLmltdWwoYWw2LGJsMil8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNixiaDIpfDApK01hdGguaW11bChhaDYsYmwyKXwwLGhpPWhpK01hdGguaW11bChhaDYsYmgyKXwwLGxvPWxvK01hdGguaW11bChhbDUsYmwzKXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw1LGJoMyl8MCkrTWF0aC5pbXVsKGFoNSxibDMpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNSxiaDMpfDAsbG89bG8rTWF0aC5pbXVsKGFsNCxibDQpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDQsYmg0KXwwKStNYXRoLmltdWwoYWg0LGJsNCl8MCxoaT1oaStNYXRoLmltdWwoYWg0LGJoNCl8MCxsbz1sbytNYXRoLmltdWwoYWwzLGJsNSl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMyxiaDUpfDApK01hdGguaW11bChhaDMsYmw1KXwwLGhpPWhpK01hdGguaW11bChhaDMsYmg1KXwwLGxvPWxvK01hdGguaW11bChhbDIsYmw2KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwyLGJoNil8MCkrTWF0aC5pbXVsKGFoMixibDYpfDAsaGk9aGkrTWF0aC5pbXVsKGFoMixiaDYpfDAsbG89bG8rTWF0aC5pbXVsKGFsMSxibDcpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDEsYmg3KXwwKStNYXRoLmltdWwoYWgxLGJsNyl8MCxoaT1oaStNYXRoLmltdWwoYWgxLGJoNyl8MDt2YXIgdzg9KGMrKGxvPWxvK01hdGguaW11bChhbDAsYmw4KXwwKXwwKSsoKDgxOTEmKG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwwLGJoOCl8MCkrTWF0aC5pbXVsKGFoMCxibDgpfDApKTw8MTMpfDA7Yz0oKGhpPWhpK01hdGguaW11bChhaDAsYmg4KXwwKSsobWlkPj4+MTMpfDApKyh3OD4+PjI2KXwwLHc4Jj02NzEwODg2Myxsbz1NYXRoLmltdWwoYWw5LGJsMCksbWlkPShtaWQ9TWF0aC5pbXVsKGFsOSxiaDApKStNYXRoLmltdWwoYWg5LGJsMCl8MCxoaT1NYXRoLmltdWwoYWg5LGJoMCksbG89bG8rTWF0aC5pbXVsKGFsOCxibDEpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDgsYmgxKXwwKStNYXRoLmltdWwoYWg4LGJsMSl8MCxoaT1oaStNYXRoLmltdWwoYWg4LGJoMSl8MCxsbz1sbytNYXRoLmltdWwoYWw3LGJsMil8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNyxiaDIpfDApK01hdGguaW11bChhaDcsYmwyKXwwLGhpPWhpK01hdGguaW11bChhaDcsYmgyKXwwLGxvPWxvK01hdGguaW11bChhbDYsYmwzKXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw2LGJoMyl8MCkrTWF0aC5pbXVsKGFoNixibDMpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNixiaDMpfDAsbG89bG8rTWF0aC5pbXVsKGFsNSxibDQpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDUsYmg0KXwwKStNYXRoLmltdWwoYWg1LGJsNCl8MCxoaT1oaStNYXRoLmltdWwoYWg1LGJoNCl8MCxsbz1sbytNYXRoLmltdWwoYWw0LGJsNSl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNCxiaDUpfDApK01hdGguaW11bChhaDQsYmw1KXwwLGhpPWhpK01hdGguaW11bChhaDQsYmg1KXwwLGxvPWxvK01hdGguaW11bChhbDMsYmw2KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwzLGJoNil8MCkrTWF0aC5pbXVsKGFoMyxibDYpfDAsaGk9aGkrTWF0aC5pbXVsKGFoMyxiaDYpfDAsbG89bG8rTWF0aC5pbXVsKGFsMixibDcpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDIsYmg3KXwwKStNYXRoLmltdWwoYWgyLGJsNyl8MCxoaT1oaStNYXRoLmltdWwoYWgyLGJoNyl8MCxsbz1sbytNYXRoLmltdWwoYWwxLGJsOCl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMSxiaDgpfDApK01hdGguaW11bChhaDEsYmw4KXwwLGhpPWhpK01hdGguaW11bChhaDEsYmg4KXwwO3ZhciB3OT0oYysobG89bG8rTWF0aC5pbXVsKGFsMCxibDkpfDApfDApKygoODE5MSYobWlkPShtaWQ9bWlkK01hdGguaW11bChhbDAsYmg5KXwwKStNYXRoLmltdWwoYWgwLGJsOSl8MCkpPDwxMyl8MDtjPSgoaGk9aGkrTWF0aC5pbXVsKGFoMCxiaDkpfDApKyhtaWQ+Pj4xMyl8MCkrKHc5Pj4+MjYpfDAsdzkmPTY3MTA4ODYzLGxvPU1hdGguaW11bChhbDksYmwxKSxtaWQ9KG1pZD1NYXRoLmltdWwoYWw5LGJoMSkpK01hdGguaW11bChhaDksYmwxKXwwLGhpPU1hdGguaW11bChhaDksYmgxKSxsbz1sbytNYXRoLmltdWwoYWw4LGJsMil8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsOCxiaDIpfDApK01hdGguaW11bChhaDgsYmwyKXwwLGhpPWhpK01hdGguaW11bChhaDgsYmgyKXwwLGxvPWxvK01hdGguaW11bChhbDcsYmwzKXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw3LGJoMyl8MCkrTWF0aC5pbXVsKGFoNyxibDMpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNyxiaDMpfDAsbG89bG8rTWF0aC5pbXVsKGFsNixibDQpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDYsYmg0KXwwKStNYXRoLmltdWwoYWg2LGJsNCl8MCxoaT1oaStNYXRoLmltdWwoYWg2LGJoNCl8MCxsbz1sbytNYXRoLmltdWwoYWw1LGJsNSl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNSxiaDUpfDApK01hdGguaW11bChhaDUsYmw1KXwwLGhpPWhpK01hdGguaW11bChhaDUsYmg1KXwwLGxvPWxvK01hdGguaW11bChhbDQsYmw2KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw0LGJoNil8MCkrTWF0aC5pbXVsKGFoNCxibDYpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNCxiaDYpfDAsbG89bG8rTWF0aC5pbXVsKGFsMyxibDcpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDMsYmg3KXwwKStNYXRoLmltdWwoYWgzLGJsNyl8MCxoaT1oaStNYXRoLmltdWwoYWgzLGJoNyl8MCxsbz1sbytNYXRoLmltdWwoYWwyLGJsOCl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMixiaDgpfDApK01hdGguaW11bChhaDIsYmw4KXwwLGhpPWhpK01hdGguaW11bChhaDIsYmg4KXwwO3ZhciB3MTA9KGMrKGxvPWxvK01hdGguaW11bChhbDEsYmw5KXwwKXwwKSsoKDgxOTEmKG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwxLGJoOSl8MCkrTWF0aC5pbXVsKGFoMSxibDkpfDApKTw8MTMpfDA7Yz0oKGhpPWhpK01hdGguaW11bChhaDEsYmg5KXwwKSsobWlkPj4+MTMpfDApKyh3MTA+Pj4yNil8MCx3MTAmPTY3MTA4ODYzLGxvPU1hdGguaW11bChhbDksYmwyKSxtaWQ9KG1pZD1NYXRoLmltdWwoYWw5LGJoMikpK01hdGguaW11bChhaDksYmwyKXwwLGhpPU1hdGguaW11bChhaDksYmgyKSxsbz1sbytNYXRoLmltdWwoYWw4LGJsMyl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsOCxiaDMpfDApK01hdGguaW11bChhaDgsYmwzKXwwLGhpPWhpK01hdGguaW11bChhaDgsYmgzKXwwLGxvPWxvK01hdGguaW11bChhbDcsYmw0KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw3LGJoNCl8MCkrTWF0aC5pbXVsKGFoNyxibDQpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNyxiaDQpfDAsbG89bG8rTWF0aC5pbXVsKGFsNixibDUpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDYsYmg1KXwwKStNYXRoLmltdWwoYWg2LGJsNSl8MCxoaT1oaStNYXRoLmltdWwoYWg2LGJoNSl8MCxsbz1sbytNYXRoLmltdWwoYWw1LGJsNil8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNSxiaDYpfDApK01hdGguaW11bChhaDUsYmw2KXwwLGhpPWhpK01hdGguaW11bChhaDUsYmg2KXwwLGxvPWxvK01hdGguaW11bChhbDQsYmw3KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw0LGJoNyl8MCkrTWF0aC5pbXVsKGFoNCxibDcpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNCxiaDcpfDAsbG89bG8rTWF0aC5pbXVsKGFsMyxibDgpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDMsYmg4KXwwKStNYXRoLmltdWwoYWgzLGJsOCl8MCxoaT1oaStNYXRoLmltdWwoYWgzLGJoOCl8MDt2YXIgdzExPShjKyhsbz1sbytNYXRoLmltdWwoYWwyLGJsOSl8MCl8MCkrKCg4MTkxJihtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMixiaDkpfDApK01hdGguaW11bChhaDIsYmw5KXwwKSk8PDEzKXwwO2M9KChoaT1oaStNYXRoLmltdWwoYWgyLGJoOSl8MCkrKG1pZD4+PjEzKXwwKSsodzExPj4+MjYpfDAsdzExJj02NzEwODg2Myxsbz1NYXRoLmltdWwoYWw5LGJsMyksbWlkPShtaWQ9TWF0aC5pbXVsKGFsOSxiaDMpKStNYXRoLmltdWwoYWg5LGJsMyl8MCxoaT1NYXRoLmltdWwoYWg5LGJoMyksbG89bG8rTWF0aC5pbXVsKGFsOCxibDQpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDgsYmg0KXwwKStNYXRoLmltdWwoYWg4LGJsNCl8MCxoaT1oaStNYXRoLmltdWwoYWg4LGJoNCl8MCxsbz1sbytNYXRoLmltdWwoYWw3LGJsNSl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNyxiaDUpfDApK01hdGguaW11bChhaDcsYmw1KXwwLGhpPWhpK01hdGguaW11bChhaDcsYmg1KXwwLGxvPWxvK01hdGguaW11bChhbDYsYmw2KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw2LGJoNil8MCkrTWF0aC5pbXVsKGFoNixibDYpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNixiaDYpfDAsbG89bG8rTWF0aC5pbXVsKGFsNSxibDcpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDUsYmg3KXwwKStNYXRoLmltdWwoYWg1LGJsNyl8MCxoaT1oaStNYXRoLmltdWwoYWg1LGJoNyl8MCxsbz1sbytNYXRoLmltdWwoYWw0LGJsOCl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNCxiaDgpfDApK01hdGguaW11bChhaDQsYmw4KXwwLGhpPWhpK01hdGguaW11bChhaDQsYmg4KXwwO3ZhciB3MTI9KGMrKGxvPWxvK01hdGguaW11bChhbDMsYmw5KXwwKXwwKSsoKDgxOTEmKG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwzLGJoOSl8MCkrTWF0aC5pbXVsKGFoMyxibDkpfDApKTw8MTMpfDA7Yz0oKGhpPWhpK01hdGguaW11bChhaDMsYmg5KXwwKSsobWlkPj4+MTMpfDApKyh3MTI+Pj4yNil8MCx3MTImPTY3MTA4ODYzLGxvPU1hdGguaW11bChhbDksYmw0KSxtaWQ9KG1pZD1NYXRoLmltdWwoYWw5LGJoNCkpK01hdGguaW11bChhaDksYmw0KXwwLGhpPU1hdGguaW11bChhaDksYmg0KSxsbz1sbytNYXRoLmltdWwoYWw4LGJsNSl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsOCxiaDUpfDApK01hdGguaW11bChhaDgsYmw1KXwwLGhpPWhpK01hdGguaW11bChhaDgsYmg1KXwwLGxvPWxvK01hdGguaW11bChhbDcsYmw2KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw3LGJoNil8MCkrTWF0aC5pbXVsKGFoNyxibDYpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNyxiaDYpfDAsbG89bG8rTWF0aC5pbXVsKGFsNixibDcpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDYsYmg3KXwwKStNYXRoLmltdWwoYWg2LGJsNyl8MCxoaT1oaStNYXRoLmltdWwoYWg2LGJoNyl8MCxsbz1sbytNYXRoLmltdWwoYWw1LGJsOCl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNSxiaDgpfDApK01hdGguaW11bChhaDUsYmw4KXwwLGhpPWhpK01hdGguaW11bChhaDUsYmg4KXwwO3ZhciB3MTM9KGMrKGxvPWxvK01hdGguaW11bChhbDQsYmw5KXwwKXwwKSsoKDgxOTEmKG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw0LGJoOSl8MCkrTWF0aC5pbXVsKGFoNCxibDkpfDApKTw8MTMpfDA7Yz0oKGhpPWhpK01hdGguaW11bChhaDQsYmg5KXwwKSsobWlkPj4+MTMpfDApKyh3MTM+Pj4yNil8MCx3MTMmPTY3MTA4ODYzLGxvPU1hdGguaW11bChhbDksYmw1KSxtaWQ9KG1pZD1NYXRoLmltdWwoYWw5LGJoNSkpK01hdGguaW11bChhaDksYmw1KXwwLGhpPU1hdGguaW11bChhaDksYmg1KSxsbz1sbytNYXRoLmltdWwoYWw4LGJsNil8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsOCxiaDYpfDApK01hdGguaW11bChhaDgsYmw2KXwwLGhpPWhpK01hdGguaW11bChhaDgsYmg2KXwwLGxvPWxvK01hdGguaW11bChhbDcsYmw3KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw3LGJoNyl8MCkrTWF0aC5pbXVsKGFoNyxibDcpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNyxiaDcpfDAsbG89bG8rTWF0aC5pbXVsKGFsNixibDgpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDYsYmg4KXwwKStNYXRoLmltdWwoYWg2LGJsOCl8MCxoaT1oaStNYXRoLmltdWwoYWg2LGJoOCl8MDt2YXIgdzE0PShjKyhsbz1sbytNYXRoLmltdWwoYWw1LGJsOSl8MCl8MCkrKCg4MTkxJihtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNSxiaDkpfDApK01hdGguaW11bChhaDUsYmw5KXwwKSk8PDEzKXwwO2M9KChoaT1oaStNYXRoLmltdWwoYWg1LGJoOSl8MCkrKG1pZD4+PjEzKXwwKSsodzE0Pj4+MjYpfDAsdzE0Jj02NzEwODg2Myxsbz1NYXRoLmltdWwoYWw5LGJsNiksbWlkPShtaWQ9TWF0aC5pbXVsKGFsOSxiaDYpKStNYXRoLmltdWwoYWg5LGJsNil8MCxoaT1NYXRoLmltdWwoYWg5LGJoNiksbG89bG8rTWF0aC5pbXVsKGFsOCxibDcpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDgsYmg3KXwwKStNYXRoLmltdWwoYWg4LGJsNyl8MCxoaT1oaStNYXRoLmltdWwoYWg4LGJoNyl8MCxsbz1sbytNYXRoLmltdWwoYWw3LGJsOCl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNyxiaDgpfDApK01hdGguaW11bChhaDcsYmw4KXwwLGhpPWhpK01hdGguaW11bChhaDcsYmg4KXwwO3ZhciB3MTU9KGMrKGxvPWxvK01hdGguaW11bChhbDYsYmw5KXwwKXwwKSsoKDgxOTEmKG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw2LGJoOSl8MCkrTWF0aC5pbXVsKGFoNixibDkpfDApKTw8MTMpfDA7Yz0oKGhpPWhpK01hdGguaW11bChhaDYsYmg5KXwwKSsobWlkPj4+MTMpfDApKyh3MTU+Pj4yNil8MCx3MTUmPTY3MTA4ODYzLGxvPU1hdGguaW11bChhbDksYmw3KSxtaWQ9KG1pZD1NYXRoLmltdWwoYWw5LGJoNykpK01hdGguaW11bChhaDksYmw3KXwwLGhpPU1hdGguaW11bChhaDksYmg3KSxsbz1sbytNYXRoLmltdWwoYWw4LGJsOCl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsOCxiaDgpfDApK01hdGguaW11bChhaDgsYmw4KXwwLGhpPWhpK01hdGguaW11bChhaDgsYmg4KXwwO3ZhciB3MTY9KGMrKGxvPWxvK01hdGguaW11bChhbDcsYmw5KXwwKXwwKSsoKDgxOTEmKG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw3LGJoOSl8MCkrTWF0aC5pbXVsKGFoNyxibDkpfDApKTw8MTMpfDA7Yz0oKGhpPWhpK01hdGguaW11bChhaDcsYmg5KXwwKSsobWlkPj4+MTMpfDApKyh3MTY+Pj4yNil8MCx3MTYmPTY3MTA4ODYzLGxvPU1hdGguaW11bChhbDksYmw4KSxtaWQ9KG1pZD1NYXRoLmltdWwoYWw5LGJoOCkpK01hdGguaW11bChhaDksYmw4KXwwLGhpPU1hdGguaW11bChhaDksYmg4KTt2YXIgdzE3PShjKyhsbz1sbytNYXRoLmltdWwoYWw4LGJsOSl8MCl8MCkrKCg4MTkxJihtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsOCxiaDkpfDApK01hdGguaW11bChhaDgsYmw5KXwwKSk8PDEzKXwwO2M9KChoaT1oaStNYXRoLmltdWwoYWg4LGJoOSl8MCkrKG1pZD4+PjEzKXwwKSsodzE3Pj4+MjYpfDAsdzE3Jj02NzEwODg2Mzt2YXIgdzE4PShjKyhsbz1NYXRoLmltdWwoYWw5LGJsOSkpfDApKygoODE5MSYobWlkPShtaWQ9TWF0aC5pbXVsKGFsOSxiaDkpKStNYXRoLmltdWwoYWg5LGJsOSl8MCkpPDwxMyl8MDtyZXR1cm4gYz0oKGhpPU1hdGguaW11bChhaDksYmg5KSkrKG1pZD4+PjEzKXwwKSsodzE4Pj4+MjYpfDAsdzE4Jj02NzEwODg2MyxvWzBdPXcwLG9bMV09dzEsb1syXT13MixvWzNdPXczLG9bNF09dzQsb1s1XT13NSxvWzZdPXc2LG9bN109dzcsb1s4XT13OCxvWzldPXc5LG9bMTBdPXcxMCxvWzExXT13MTEsb1sxMl09dzEyLG9bMTNdPXcxMyxvWzE0XT13MTQsb1sxNV09dzE1LG9bMTZdPXcxNixvWzE3XT13MTcsb1sxOF09dzE4LDAhPT1jJiYob1sxOV09YyxvdXQubGVuZ3RoKyspLG91dH07ZnVuY3Rpb24ganVtYm9NdWxUbyhzZWxmLG51bSxvdXQpe3JldHVybihuZXcgRkZUTSkubXVscChzZWxmLG51bSxvdXQpfWZ1bmN0aW9uIEZGVE0oeCx5KXt0aGlzLng9eCx0aGlzLnk9eX1NYXRoLmltdWx8fChjb21iMTBNdWxUbz1zbWFsbE11bFRvKSxCTi5wcm90b3R5cGUubXVsVG89ZnVuY3Rpb24gbXVsVG8obnVtLG91dCl7dmFyIHJlcyxsZW49dGhpcy5sZW5ndGgrbnVtLmxlbmd0aDtyZXR1cm4gcmVzPTEwPT09dGhpcy5sZW5ndGgmJjEwPT09bnVtLmxlbmd0aD9jb21iMTBNdWxUbyh0aGlzLG51bSxvdXQpOmxlbjw2Mz9zbWFsbE11bFRvKHRoaXMsbnVtLG91dCk6bGVuPDEwMjQ/ZnVuY3Rpb24gYmlnTXVsVG8oc2VsZixudW0sb3V0KXtvdXQubmVnYXRpdmU9bnVtLm5lZ2F0aXZlXnNlbGYubmVnYXRpdmUsb3V0Lmxlbmd0aD1zZWxmLmxlbmd0aCtudW0ubGVuZ3RoO2Zvcih2YXIgY2Fycnk9MCxobmNhcnJ5PTAsaz0wO2s8b3V0Lmxlbmd0aC0xO2srKyl7dmFyIG5jYXJyeT1obmNhcnJ5O2huY2Fycnk9MDtmb3IodmFyIHJ3b3JkPTY3MTA4ODYzJmNhcnJ5LG1heEo9TWF0aC5taW4oayxudW0ubGVuZ3RoLTEpLGo9TWF0aC5tYXgoMCxrLXNlbGYubGVuZ3RoKzEpO2o8PW1heEo7aisrKXt2YXIgaT1rLWoscj0oMHxzZWxmLndvcmRzW2ldKSooMHxudW0ud29yZHNbal0pLGxvPTY3MTA4ODYzJnI7cndvcmQ9NjcxMDg4NjMmKGxvPWxvK3J3b3JkfDApLGhuY2FycnkrPShuY2Fycnk9KG5jYXJyeT1uY2FycnkrKHIvNjcxMDg4NjR8MCl8MCkrKGxvPj4+MjYpfDApPj4+MjYsbmNhcnJ5Jj02NzEwODg2M31vdXQud29yZHNba109cndvcmQsY2Fycnk9bmNhcnJ5LG5jYXJyeT1obmNhcnJ5fXJldHVybiAwIT09Y2Fycnk/b3V0LndvcmRzW2tdPWNhcnJ5Om91dC5sZW5ndGgtLSxvdXQuc3RyaXAoKX0odGhpcyxudW0sb3V0KTpqdW1ib011bFRvKHRoaXMsbnVtLG91dCkscmVzfSxGRlRNLnByb3RvdHlwZS5tYWtlUkJUPWZ1bmN0aW9uIG1ha2VSQlQoTil7Zm9yKHZhciB0PW5ldyBBcnJheShOKSxsPUJOLnByb3RvdHlwZS5fY291bnRCaXRzKE4pLTEsaT0wO2k8TjtpKyspdFtpXT10aGlzLnJldkJpbihpLGwsTik7cmV0dXJuIHR9LEZGVE0ucHJvdG90eXBlLnJldkJpbj1mdW5jdGlvbiByZXZCaW4oeCxsLE4pe2lmKDA9PT14fHx4PT09Ti0xKXJldHVybiB4O2Zvcih2YXIgcmI9MCxpPTA7aTxsO2krKylyYnw9KDEmeCk8PGwtaS0xLHg+Pj0xO3JldHVybiByYn0sRkZUTS5wcm90b3R5cGUucGVybXV0ZT1mdW5jdGlvbiBwZXJtdXRlKHJidCxyd3MsaXdzLHJ0d3MsaXR3cyxOKXtmb3IodmFyIGk9MDtpPE47aSsrKXJ0d3NbaV09cndzW3JidFtpXV0saXR3c1tpXT1pd3NbcmJ0W2ldXX0sRkZUTS5wcm90b3R5cGUudHJhbnNmb3JtPWZ1bmN0aW9uIHRyYW5zZm9ybShyd3MsaXdzLHJ0d3MsaXR3cyxOLHJidCl7dGhpcy5wZXJtdXRlKHJidCxyd3MsaXdzLHJ0d3MsaXR3cyxOKTtmb3IodmFyIHM9MTtzPE47czw8PTEpZm9yKHZhciBsPXM8PDEscnR3ZGY9TWF0aC5jb3MoMipNYXRoLlBJL2wpLGl0d2RmPU1hdGguc2luKDIqTWF0aC5QSS9sKSxwPTA7cDxOO3ArPWwpZm9yKHZhciBydHdkZl89cnR3ZGYsaXR3ZGZfPWl0d2RmLGo9MDtqPHM7aisrKXt2YXIgcmU9cnR3c1twK2pdLGllPWl0d3NbcCtqXSxybz1ydHdzW3AraitzXSxpbz1pdHdzW3AraitzXSxyeD1ydHdkZl8qcm8taXR3ZGZfKmlvO2lvPXJ0d2RmXyppbytpdHdkZl8qcm8scm89cngscnR3c1twK2pdPXJlK3JvLGl0d3NbcCtqXT1pZStpbyxydHdzW3AraitzXT1yZS1ybyxpdHdzW3AraitzXT1pZS1pbyxqIT09bCYmKHJ4PXJ0d2RmKnJ0d2RmXy1pdHdkZippdHdkZl8saXR3ZGZfPXJ0d2RmKml0d2RmXytpdHdkZipydHdkZl8scnR3ZGZfPXJ4KX19LEZGVE0ucHJvdG90eXBlLmd1ZXNzTGVuMTNiPWZ1bmN0aW9uIGd1ZXNzTGVuMTNiKG4sbSl7dmFyIE49MXxNYXRoLm1heChtLG4pLG9kZD0xJk4saT0wO2ZvcihOPU4vMnwwO047Tj4+Pj0xKWkrKztyZXR1cm4gMTw8aSsxK29kZH0sRkZUTS5wcm90b3R5cGUuY29uanVnYXRlPWZ1bmN0aW9uIGNvbmp1Z2F0ZShyd3MsaXdzLE4pe2lmKCEoTjw9MSkpZm9yKHZhciBpPTA7aTxOLzI7aSsrKXt2YXIgdD1yd3NbaV07cndzW2ldPXJ3c1tOLWktMV0scndzW04taS0xXT10LHQ9aXdzW2ldLGl3c1tpXT0taXdzW04taS0xXSxpd3NbTi1pLTFdPS10fX0sRkZUTS5wcm90b3R5cGUubm9ybWFsaXplMTNiPWZ1bmN0aW9uIG5vcm1hbGl6ZTEzYih3cyxOKXtmb3IodmFyIGNhcnJ5PTAsaT0wO2k8Ti8yO2krKyl7dmFyIHc9ODE5MipNYXRoLnJvdW5kKHdzWzIqaSsxXS9OKStNYXRoLnJvdW5kKHdzWzIqaV0vTikrY2Fycnk7d3NbaV09NjcxMDg4NjMmdyxjYXJyeT13PDY3MTA4ODY0PzA6dy82NzEwODg2NHwwfXJldHVybiB3c30sRkZUTS5wcm90b3R5cGUuY29udmVydDEzYj1mdW5jdGlvbiBjb252ZXJ0MTNiKHdzLGxlbixyd3MsTil7Zm9yKHZhciBjYXJyeT0wLGk9MDtpPGxlbjtpKyspY2FycnkrPTB8d3NbaV0scndzWzIqaV09ODE5MSZjYXJyeSxjYXJyeT4+Pj0xMyxyd3NbMippKzFdPTgxOTEmY2FycnksY2Fycnk+Pj49MTM7Zm9yKGk9MipsZW47aTxOOysraSlyd3NbaV09MDthc3NlcnQoMD09PWNhcnJ5KSxhc3NlcnQoISgtODE5MiZjYXJyeSkpfSxGRlRNLnByb3RvdHlwZS5zdHViPWZ1bmN0aW9uIHN0dWIoTil7Zm9yKHZhciBwaD1uZXcgQXJyYXkoTiksaT0wO2k8TjtpKyspcGhbaV09MDtyZXR1cm4gcGh9LEZGVE0ucHJvdG90eXBlLm11bHA9ZnVuY3Rpb24gbXVscCh4LHksb3V0KXt2YXIgTj0yKnRoaXMuZ3Vlc3NMZW4xM2IoeC5sZW5ndGgseS5sZW5ndGgpLHJidD10aGlzLm1ha2VSQlQoTiksXz10aGlzLnN0dWIoTikscndzPW5ldyBBcnJheShOKSxyd3N0PW5ldyBBcnJheShOKSxpd3N0PW5ldyBBcnJheShOKSxucndzPW5ldyBBcnJheShOKSxucndzdD1uZXcgQXJyYXkoTiksbml3c3Q9bmV3IEFycmF5KE4pLHJtd3M9b3V0LndvcmRzO3Jtd3MubGVuZ3RoPU4sdGhpcy5jb252ZXJ0MTNiKHgud29yZHMseC5sZW5ndGgscndzLE4pLHRoaXMuY29udmVydDEzYih5LndvcmRzLHkubGVuZ3RoLG5yd3MsTiksdGhpcy50cmFuc2Zvcm0ocndzLF8scndzdCxpd3N0LE4scmJ0KSx0aGlzLnRyYW5zZm9ybShucndzLF8sbnJ3c3Qsbml3c3QsTixyYnQpO2Zvcih2YXIgaT0wO2k8TjtpKyspe3ZhciByeD1yd3N0W2ldKm5yd3N0W2ldLWl3c3RbaV0qbml3c3RbaV07aXdzdFtpXT1yd3N0W2ldKm5pd3N0W2ldK2l3c3RbaV0qbnJ3c3RbaV0scndzdFtpXT1yeH1yZXR1cm4gdGhpcy5jb25qdWdhdGUocndzdCxpd3N0LE4pLHRoaXMudHJhbnNmb3JtKHJ3c3QsaXdzdCxybXdzLF8sTixyYnQpLHRoaXMuY29uanVnYXRlKHJtd3MsXyxOKSx0aGlzLm5vcm1hbGl6ZTEzYihybXdzLE4pLG91dC5uZWdhdGl2ZT14Lm5lZ2F0aXZlXnkubmVnYXRpdmUsb3V0Lmxlbmd0aD14Lmxlbmd0aCt5Lmxlbmd0aCxvdXQuc3RyaXAoKX0sQk4ucHJvdG90eXBlLm11bD1mdW5jdGlvbiBtdWwobnVtKXt2YXIgb3V0PW5ldyBCTihudWxsKTtyZXR1cm4gb3V0LndvcmRzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCtudW0ubGVuZ3RoKSx0aGlzLm11bFRvKG51bSxvdXQpfSxCTi5wcm90b3R5cGUubXVsZj1mdW5jdGlvbiBtdWxmKG51bSl7dmFyIG91dD1uZXcgQk4obnVsbCk7cmV0dXJuIG91dC53b3Jkcz1uZXcgQXJyYXkodGhpcy5sZW5ndGgrbnVtLmxlbmd0aCksanVtYm9NdWxUbyh0aGlzLG51bSxvdXQpfSxCTi5wcm90b3R5cGUuaW11bD1mdW5jdGlvbiBpbXVsKG51bSl7cmV0dXJuIHRoaXMuY2xvbmUoKS5tdWxUbyhudW0sdGhpcyl9LEJOLnByb3RvdHlwZS5pbXVsbj1mdW5jdGlvbiBpbXVsbihudW0pe2Fzc2VydCgibnVtYmVyIj09dHlwZW9mIG51bSksYXNzZXJ0KG51bTw2NzEwODg2NCk7Zm9yKHZhciBjYXJyeT0wLGk9MDtpPHRoaXMubGVuZ3RoO2krKyl7dmFyIHc9KDB8dGhpcy53b3Jkc1tpXSkqbnVtLGxvPSg2NzEwODg2MyZ3KSsoNjcxMDg4NjMmY2FycnkpO2NhcnJ5Pj49MjYsY2FycnkrPXcvNjcxMDg4NjR8MCxjYXJyeSs9bG8+Pj4yNix0aGlzLndvcmRzW2ldPTY3MTA4ODYzJmxvfXJldHVybiAwIT09Y2FycnkmJih0aGlzLndvcmRzW2ldPWNhcnJ5LHRoaXMubGVuZ3RoKyspLHRoaXMubGVuZ3RoPTA9PT1udW0/MTp0aGlzLmxlbmd0aCx0aGlzfSxCTi5wcm90b3R5cGUubXVsbj1mdW5jdGlvbiBtdWxuKG51bSl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pbXVsbihudW0pfSxCTi5wcm90b3R5cGUuc3FyPWZ1bmN0aW9uIHNxcigpe3JldHVybiB0aGlzLm11bCh0aGlzKX0sQk4ucHJvdG90eXBlLmlzcXI9ZnVuY3Rpb24gaXNxcigpe3JldHVybiB0aGlzLmltdWwodGhpcy5jbG9uZSgpKX0sQk4ucHJvdG90eXBlLnBvdz1mdW5jdGlvbiBwb3cobnVtKXt2YXIgdz1mdW5jdGlvbiB0b0JpdEFycmF5KG51bSl7Zm9yKHZhciB3PW5ldyBBcnJheShudW0uYml0TGVuZ3RoKCkpLGJpdD0wO2JpdDx3Lmxlbmd0aDtiaXQrKyl7dmFyIG9mZj1iaXQvMjZ8MCx3Yml0PWJpdCUyNjt3W2JpdF09KG51bS53b3Jkc1tvZmZdJjE8PHdiaXQpPj4+d2JpdH1yZXR1cm4gd30obnVtKTtpZigwPT09dy5sZW5ndGgpcmV0dXJuIG5ldyBCTigxKTtmb3IodmFyIHJlcz10aGlzLGk9MDtpPHcubGVuZ3RoJiYwPT09d1tpXTtpKysscmVzPXJlcy5zcXIoKSk7aWYoKytpPHcubGVuZ3RoKWZvcih2YXIgcT1yZXMuc3FyKCk7aTx3Lmxlbmd0aDtpKysscT1xLnNxcigpKTAhPT13W2ldJiYocmVzPXJlcy5tdWwocSkpO3JldHVybiByZXN9LEJOLnByb3RvdHlwZS5pdXNobG49ZnVuY3Rpb24gaXVzaGxuKGJpdHMpe2Fzc2VydCgibnVtYmVyIj09dHlwZW9mIGJpdHMmJmJpdHM+PTApO3ZhciBpLHI9Yml0cyUyNixzPShiaXRzLXIpLzI2LGNhcnJ5TWFzaz02NzEwODg2Mz4+PjI2LXI8PDI2LXI7aWYoMCE9PXIpe3ZhciBjYXJyeT0wO2ZvcihpPTA7aTx0aGlzLmxlbmd0aDtpKyspe3ZhciBuZXdDYXJyeT10aGlzLndvcmRzW2ldJmNhcnJ5TWFzayxjPSgwfHRoaXMud29yZHNbaV0pLW5ld0NhcnJ5PDxyO3RoaXMud29yZHNbaV09Y3xjYXJyeSxjYXJyeT1uZXdDYXJyeT4+PjI2LXJ9Y2FycnkmJih0aGlzLndvcmRzW2ldPWNhcnJ5LHRoaXMubGVuZ3RoKyspfWlmKDAhPT1zKXtmb3IoaT10aGlzLmxlbmd0aC0xO2k+PTA7aS0tKXRoaXMud29yZHNbaStzXT10aGlzLndvcmRzW2ldO2ZvcihpPTA7aTxzO2krKyl0aGlzLndvcmRzW2ldPTA7dGhpcy5sZW5ndGgrPXN9cmV0dXJuIHRoaXMuc3RyaXAoKX0sQk4ucHJvdG90eXBlLmlzaGxuPWZ1bmN0aW9uIGlzaGxuKGJpdHMpe3JldHVybiBhc3NlcnQoMD09PXRoaXMubmVnYXRpdmUpLHRoaXMuaXVzaGxuKGJpdHMpfSxCTi5wcm90b3R5cGUuaXVzaHJuPWZ1bmN0aW9uIGl1c2hybihiaXRzLGhpbnQsZXh0ZW5kZWQpe3ZhciBoO2Fzc2VydCgibnVtYmVyIj09dHlwZW9mIGJpdHMmJmJpdHM+PTApLGg9aGludD8oaGludC1oaW50JTI2KS8yNjowO3ZhciByPWJpdHMlMjYscz1NYXRoLm1pbigoYml0cy1yKS8yNix0aGlzLmxlbmd0aCksbWFzaz02NzEwODg2M142NzEwODg2Mz4+PnI8PHIsbWFza2VkV29yZHM9ZXh0ZW5kZWQ7aWYoaC09cyxoPU1hdGgubWF4KDAsaCksbWFza2VkV29yZHMpe2Zvcih2YXIgaT0wO2k8cztpKyspbWFza2VkV29yZHMud29yZHNbaV09dGhpcy53b3Jkc1tpXTttYXNrZWRXb3Jkcy5sZW5ndGg9c31pZigwPT09cyk7ZWxzZSBpZih0aGlzLmxlbmd0aD5zKWZvcih0aGlzLmxlbmd0aC09cyxpPTA7aTx0aGlzLmxlbmd0aDtpKyspdGhpcy53b3Jkc1tpXT10aGlzLndvcmRzW2krc107ZWxzZSB0aGlzLndvcmRzWzBdPTAsdGhpcy5sZW5ndGg9MTt2YXIgY2Fycnk9MDtmb3IoaT10aGlzLmxlbmd0aC0xO2k+PTAmJigwIT09Y2Fycnl8fGk+PWgpO2ktLSl7dmFyIHdvcmQ9MHx0aGlzLndvcmRzW2ldO3RoaXMud29yZHNbaV09Y2Fycnk8PDI2LXJ8d29yZD4+PnIsY2Fycnk9d29yZCZtYXNrfXJldHVybiBtYXNrZWRXb3JkcyYmMCE9PWNhcnJ5JiYobWFza2VkV29yZHMud29yZHNbbWFza2VkV29yZHMubGVuZ3RoKytdPWNhcnJ5KSwwPT09dGhpcy5sZW5ndGgmJih0aGlzLndvcmRzWzBdPTAsdGhpcy5sZW5ndGg9MSksdGhpcy5zdHJpcCgpfSxCTi5wcm90b3R5cGUuaXNocm49ZnVuY3Rpb24gaXNocm4oYml0cyxoaW50LGV4dGVuZGVkKXtyZXR1cm4gYXNzZXJ0KDA9PT10aGlzLm5lZ2F0aXZlKSx0aGlzLml1c2hybihiaXRzLGhpbnQsZXh0ZW5kZWQpfSxCTi5wcm90b3R5cGUuc2hsbj1mdW5jdGlvbiBzaGxuKGJpdHMpe3JldHVybiB0aGlzLmNsb25lKCkuaXNobG4oYml0cyl9LEJOLnByb3RvdHlwZS51c2hsbj1mdW5jdGlvbiB1c2hsbihiaXRzKXtyZXR1cm4gdGhpcy5jbG9uZSgpLml1c2hsbihiaXRzKX0sQk4ucHJvdG90eXBlLnNocm49ZnVuY3Rpb24gc2hybihiaXRzKXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlzaHJuKGJpdHMpfSxCTi5wcm90b3R5cGUudXNocm49ZnVuY3Rpb24gdXNocm4oYml0cyl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pdXNocm4oYml0cyl9LEJOLnByb3RvdHlwZS50ZXN0bj1mdW5jdGlvbiB0ZXN0bihiaXQpe2Fzc2VydCgibnVtYmVyIj09dHlwZW9mIGJpdCYmYml0Pj0wKTt2YXIgcj1iaXQlMjYscz0oYml0LXIpLzI2LHE9MTw8cjtyZXR1cm4hKHRoaXMubGVuZ3RoPD1zKSYmISEodGhpcy53b3Jkc1tzXSZxKX0sQk4ucHJvdG90eXBlLmltYXNrbj1mdW5jdGlvbiBpbWFza24oYml0cyl7YXNzZXJ0KCJudW1iZXIiPT10eXBlb2YgYml0cyYmYml0cz49MCk7dmFyIHI9Yml0cyUyNixzPShiaXRzLXIpLzI2O2lmKGFzc2VydCgwPT09dGhpcy5uZWdhdGl2ZSwiaW1hc2tuIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZSBudW1iZXJzIiksdGhpcy5sZW5ndGg8PXMpcmV0dXJuIHRoaXM7aWYoMCE9PXImJnMrKyx0aGlzLmxlbmd0aD1NYXRoLm1pbihzLHRoaXMubGVuZ3RoKSwwIT09cil7dmFyIG1hc2s9NjcxMDg4NjNeNjcxMDg4NjM+Pj5yPDxyO3RoaXMud29yZHNbdGhpcy5sZW5ndGgtMV0mPW1hc2t9cmV0dXJuIDA9PT10aGlzLmxlbmd0aCYmKHRoaXMud29yZHNbMF09MCx0aGlzLmxlbmd0aD0xKSx0aGlzLnN0cmlwKCl9LEJOLnByb3RvdHlwZS5tYXNrbj1mdW5jdGlvbiBtYXNrbihiaXRzKXtyZXR1cm4gdGhpcy5jbG9uZSgpLmltYXNrbihiaXRzKX0sQk4ucHJvdG90eXBlLmlhZGRuPWZ1bmN0aW9uIGlhZGRuKG51bSl7cmV0dXJuIGFzc2VydCgibnVtYmVyIj09dHlwZW9mIG51bSksYXNzZXJ0KG51bTw2NzEwODg2NCksbnVtPDA/dGhpcy5pc3VibigtbnVtKTowIT09dGhpcy5uZWdhdGl2ZT8xPT09dGhpcy5sZW5ndGgmJigwfHRoaXMud29yZHNbMF0pPG51bT8odGhpcy53b3Jkc1swXT1udW0tKDB8dGhpcy53b3Jkc1swXSksdGhpcy5uZWdhdGl2ZT0wLHRoaXMpOih0aGlzLm5lZ2F0aXZlPTAsdGhpcy5pc3VibihudW0pLHRoaXMubmVnYXRpdmU9MSx0aGlzKTp0aGlzLl9pYWRkbihudW0pfSxCTi5wcm90b3R5cGUuX2lhZGRuPWZ1bmN0aW9uIF9pYWRkbihudW0pe3RoaXMud29yZHNbMF0rPW51bTtmb3IodmFyIGk9MDtpPHRoaXMubGVuZ3RoJiZ0aGlzLndvcmRzW2ldPj02NzEwODg2NDtpKyspdGhpcy53b3Jkc1tpXS09NjcxMDg4NjQsaT09PXRoaXMubGVuZ3RoLTE/dGhpcy53b3Jkc1tpKzFdPTE6dGhpcy53b3Jkc1tpKzFdKys7cmV0dXJuIHRoaXMubGVuZ3RoPU1hdGgubWF4KHRoaXMubGVuZ3RoLGkrMSksdGhpc30sQk4ucHJvdG90eXBlLmlzdWJuPWZ1bmN0aW9uIGlzdWJuKG51bSl7aWYoYXNzZXJ0KCJudW1iZXIiPT10eXBlb2YgbnVtKSxhc3NlcnQobnVtPDY3MTA4ODY0KSxudW08MClyZXR1cm4gdGhpcy5pYWRkbigtbnVtKTtpZigwIT09dGhpcy5uZWdhdGl2ZSlyZXR1cm4gdGhpcy5uZWdhdGl2ZT0wLHRoaXMuaWFkZG4obnVtKSx0aGlzLm5lZ2F0aXZlPTEsdGhpcztpZih0aGlzLndvcmRzWzBdLT1udW0sMT09PXRoaXMubGVuZ3RoJiZ0aGlzLndvcmRzWzBdPDApdGhpcy53b3Jkc1swXT0tdGhpcy53b3Jkc1swXSx0aGlzLm5lZ2F0aXZlPTE7ZWxzZSBmb3IodmFyIGk9MDtpPHRoaXMubGVuZ3RoJiZ0aGlzLndvcmRzW2ldPDA7aSsrKXRoaXMud29yZHNbaV0rPTY3MTA4ODY0LHRoaXMud29yZHNbaSsxXS09MTtyZXR1cm4gdGhpcy5zdHJpcCgpfSxCTi5wcm90b3R5cGUuYWRkbj1mdW5jdGlvbiBhZGRuKG51bSl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pYWRkbihudW0pfSxCTi5wcm90b3R5cGUuc3Vibj1mdW5jdGlvbiBzdWJuKG51bSl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pc3VibihudW0pfSxCTi5wcm90b3R5cGUuaWFicz1mdW5jdGlvbiBpYWJzKCl7cmV0dXJuIHRoaXMubmVnYXRpdmU9MCx0aGlzfSxCTi5wcm90b3R5cGUuYWJzPWZ1bmN0aW9uIGFicygpe3JldHVybiB0aGlzLmNsb25lKCkuaWFicygpfSxCTi5wcm90b3R5cGUuX2lzaGxuc3VibXVsPWZ1bmN0aW9uIF9pc2hsbnN1Ym11bChudW0sbXVsLHNoaWZ0KXt2YXIgaSx3LGxlbj1udW0ubGVuZ3RoK3NoaWZ0O3RoaXMuX2V4cGFuZChsZW4pO3ZhciBjYXJyeT0wO2ZvcihpPTA7aTxudW0ubGVuZ3RoO2krKyl7dz0oMHx0aGlzLndvcmRzW2krc2hpZnRdKStjYXJyeTt2YXIgcmlnaHQ9KDB8bnVtLndvcmRzW2ldKSptdWw7Y2Fycnk9KCh3LT02NzEwODg2MyZyaWdodCk+PjI2KS0ocmlnaHQvNjcxMDg4NjR8MCksdGhpcy53b3Jkc1tpK3NoaWZ0XT02NzEwODg2MyZ3fWZvcig7aTx0aGlzLmxlbmd0aC1zaGlmdDtpKyspY2Fycnk9KHc9KDB8dGhpcy53b3Jkc1tpK3NoaWZ0XSkrY2FycnkpPj4yNix0aGlzLndvcmRzW2krc2hpZnRdPTY3MTA4ODYzJnc7aWYoMD09PWNhcnJ5KXJldHVybiB0aGlzLnN0cmlwKCk7Zm9yKGFzc2VydCgtMT09PWNhcnJ5KSxjYXJyeT0wLGk9MDtpPHRoaXMubGVuZ3RoO2krKyljYXJyeT0odz0tKDB8dGhpcy53b3Jkc1tpXSkrY2FycnkpPj4yNix0aGlzLndvcmRzW2ldPTY3MTA4ODYzJnc7cmV0dXJuIHRoaXMubmVnYXRpdmU9MSx0aGlzLnN0cmlwKCl9LEJOLnByb3RvdHlwZS5fd29yZERpdj1mdW5jdGlvbiBfd29yZERpdihudW0sbW9kZSl7dmFyIHNoaWZ0PSh0aGlzLmxlbmd0aCxudW0ubGVuZ3RoKSxhPXRoaXMuY2xvbmUoKSxiPW51bSxiaGk9MHxiLndvcmRzW2IubGVuZ3RoLTFdOzAhPT0oc2hpZnQ9MjYtdGhpcy5fY291bnRCaXRzKGJoaSkpJiYoYj1iLnVzaGxuKHNoaWZ0KSxhLml1c2hsbihzaGlmdCksYmhpPTB8Yi53b3Jkc1tiLmxlbmd0aC0xXSk7dmFyIHEsbT1hLmxlbmd0aC1iLmxlbmd0aDtpZigibW9kIiE9PW1vZGUpeyhxPW5ldyBCTihudWxsKSkubGVuZ3RoPW0rMSxxLndvcmRzPW5ldyBBcnJheShxLmxlbmd0aCk7Zm9yKHZhciBpPTA7aTxxLmxlbmd0aDtpKyspcS53b3Jkc1tpXT0wfXZhciBkaWZmPWEuY2xvbmUoKS5faXNobG5zdWJtdWwoYiwxLG0pOzA9PT1kaWZmLm5lZ2F0aXZlJiYoYT1kaWZmLHEmJihxLndvcmRzW21dPTEpKTtmb3IodmFyIGo9bS0xO2o+PTA7ai0tKXt2YXIgcWo9NjcxMDg4NjQqKDB8YS53b3Jkc1tiLmxlbmd0aCtqXSkrKDB8YS53b3Jkc1tiLmxlbmd0aCtqLTFdKTtmb3IocWo9TWF0aC5taW4ocWovYmhpfDAsNjcxMDg4NjMpLGEuX2lzaGxuc3VibXVsKGIscWosaik7MCE9PWEubmVnYXRpdmU7KXFqLS0sYS5uZWdhdGl2ZT0wLGEuX2lzaGxuc3VibXVsKGIsMSxqKSxhLmlzWmVybygpfHwoYS5uZWdhdGl2ZV49MSk7cSYmKHEud29yZHNbal09cWopfXJldHVybiBxJiZxLnN0cmlwKCksYS5zdHJpcCgpLCJkaXYiIT09bW9kZSYmMCE9PXNoaWZ0JiZhLml1c2hybihzaGlmdCkse2RpdjpxfHxudWxsLG1vZDphfX0sQk4ucHJvdG90eXBlLmRpdm1vZD1mdW5jdGlvbiBkaXZtb2QobnVtLG1vZGUscG9zaXRpdmUpe3JldHVybiBhc3NlcnQoIW51bS5pc1plcm8oKSksdGhpcy5pc1plcm8oKT97ZGl2Om5ldyBCTigwKSxtb2Q6bmV3IEJOKDApfTowIT09dGhpcy5uZWdhdGl2ZSYmMD09PW51bS5uZWdhdGl2ZT8ocmVzPXRoaXMubmVnKCkuZGl2bW9kKG51bSxtb2RlKSwibW9kIiE9PW1vZGUmJihkaXY9cmVzLmRpdi5uZWcoKSksImRpdiIhPT1tb2RlJiYobW9kPXJlcy5tb2QubmVnKCkscG9zaXRpdmUmJjAhPT1tb2QubmVnYXRpdmUmJm1vZC5pYWRkKG51bSkpLHtkaXYsbW9kfSk6MD09PXRoaXMubmVnYXRpdmUmJjAhPT1udW0ubmVnYXRpdmU/KHJlcz10aGlzLmRpdm1vZChudW0ubmVnKCksbW9kZSksIm1vZCIhPT1tb2RlJiYoZGl2PXJlcy5kaXYubmVnKCkpLHtkaXYsbW9kOnJlcy5tb2R9KTowIT09KHRoaXMubmVnYXRpdmUmbnVtLm5lZ2F0aXZlKT8ocmVzPXRoaXMubmVnKCkuZGl2bW9kKG51bS5uZWcoKSxtb2RlKSwiZGl2IiE9PW1vZGUmJihtb2Q9cmVzLm1vZC5uZWcoKSxwb3NpdGl2ZSYmMCE9PW1vZC5uZWdhdGl2ZSYmbW9kLmlzdWIobnVtKSkse2RpdjpyZXMuZGl2LG1vZH0pOm51bS5sZW5ndGg+dGhpcy5sZW5ndGh8fHRoaXMuY21wKG51bSk8MD97ZGl2Om5ldyBCTigwKSxtb2Q6dGhpc306MT09PW51bS5sZW5ndGg/ImRpdiI9PT1tb2RlP3tkaXY6dGhpcy5kaXZuKG51bS53b3Jkc1swXSksbW9kOm51bGx9OiJtb2QiPT09bW9kZT97ZGl2Om51bGwsbW9kOm5ldyBCTih0aGlzLm1vZG4obnVtLndvcmRzWzBdKSl9OntkaXY6dGhpcy5kaXZuKG51bS53b3Jkc1swXSksbW9kOm5ldyBCTih0aGlzLm1vZG4obnVtLndvcmRzWzBdKSl9OnRoaXMuX3dvcmREaXYobnVtLG1vZGUpO3ZhciBkaXYsbW9kLHJlc30sQk4ucHJvdG90eXBlLmRpdj1mdW5jdGlvbiBkaXYobnVtKXtyZXR1cm4gdGhpcy5kaXZtb2QobnVtLCJkaXYiLCExKS5kaXZ9LEJOLnByb3RvdHlwZS5tb2Q9ZnVuY3Rpb24gbW9kKG51bSl7cmV0dXJuIHRoaXMuZGl2bW9kKG51bSwibW9kIiwhMSkubW9kfSxCTi5wcm90b3R5cGUudW1vZD1mdW5jdGlvbiB1bW9kKG51bSl7cmV0dXJuIHRoaXMuZGl2bW9kKG51bSwibW9kIiwhMCkubW9kfSxCTi5wcm90b3R5cGUuZGl2Um91bmQ9ZnVuY3Rpb24gZGl2Um91bmQobnVtKXt2YXIgZG09dGhpcy5kaXZtb2QobnVtKTtpZihkbS5tb2QuaXNaZXJvKCkpcmV0dXJuIGRtLmRpdjt2YXIgbW9kPTAhPT1kbS5kaXYubmVnYXRpdmU/ZG0ubW9kLmlzdWIobnVtKTpkbS5tb2QsaGFsZj1udW0udXNocm4oMSkscjI9bnVtLmFuZGxuKDEpLGNtcD1tb2QuY21wKGhhbGYpO3JldHVybiBjbXA8MHx8MT09PXIyJiYwPT09Y21wP2RtLmRpdjowIT09ZG0uZGl2Lm5lZ2F0aXZlP2RtLmRpdi5pc3VibigxKTpkbS5kaXYuaWFkZG4oMSl9LEJOLnByb3RvdHlwZS5tb2RuPWZ1bmN0aW9uIG1vZG4obnVtKXthc3NlcnQobnVtPD02NzEwODg2Myk7Zm9yKHZhciBwPSgxPDwyNiklbnVtLGFjYz0wLGk9dGhpcy5sZW5ndGgtMTtpPj0wO2ktLSlhY2M9KHAqYWNjKygwfHRoaXMud29yZHNbaV0pKSVudW07cmV0dXJuIGFjY30sQk4ucHJvdG90eXBlLmlkaXZuPWZ1bmN0aW9uIGlkaXZuKG51bSl7YXNzZXJ0KG51bTw9NjcxMDg4NjMpO2Zvcih2YXIgY2Fycnk9MCxpPXRoaXMubGVuZ3RoLTE7aT49MDtpLS0pe3ZhciB3PSgwfHRoaXMud29yZHNbaV0pKzY3MTA4ODY0KmNhcnJ5O3RoaXMud29yZHNbaV09dy9udW18MCxjYXJyeT13JW51bX1yZXR1cm4gdGhpcy5zdHJpcCgpfSxCTi5wcm90b3R5cGUuZGl2bj1mdW5jdGlvbiBkaXZuKG51bSl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pZGl2bihudW0pfSxCTi5wcm90b3R5cGUuZWdjZD1mdW5jdGlvbiBlZ2NkKHApe2Fzc2VydCgwPT09cC5uZWdhdGl2ZSksYXNzZXJ0KCFwLmlzWmVybygpKTt2YXIgeD10aGlzLHk9cC5jbG9uZSgpO3g9MCE9PXgubmVnYXRpdmU/eC51bW9kKHApOnguY2xvbmUoKTtmb3IodmFyIEE9bmV3IEJOKDEpLEI9bmV3IEJOKDApLEM9bmV3IEJOKDApLEQ9bmV3IEJOKDEpLGc9MDt4LmlzRXZlbigpJiZ5LmlzRXZlbigpOyl4Lml1c2hybigxKSx5Lml1c2hybigxKSwrK2c7Zm9yKHZhciB5cD15LmNsb25lKCkseHA9eC5jbG9uZSgpOyF4LmlzWmVybygpOyl7Zm9yKHZhciBpPTAsaW09MTswPT09KHgud29yZHNbMF0maW0pJiZpPDI2OysraSxpbTw8PTEpO2lmKGk+MClmb3IoeC5pdXNocm4oaSk7aS0tID4wOykoQS5pc09kZCgpfHxCLmlzT2RkKCkpJiYoQS5pYWRkKHlwKSxCLmlzdWIoeHApKSxBLml1c2hybigxKSxCLml1c2hybigxKTtmb3IodmFyIGo9MCxqbT0xOzA9PT0oeS53b3Jkc1swXSZqbSkmJmo8MjY7KytqLGptPDw9MSk7aWYoaj4wKWZvcih5Lml1c2hybihqKTtqLS0gPjA7KShDLmlzT2RkKCl8fEQuaXNPZGQoKSkmJihDLmlhZGQoeXApLEQuaXN1Yih4cCkpLEMuaXVzaHJuKDEpLEQuaXVzaHJuKDEpO3guY21wKHkpPj0wPyh4LmlzdWIoeSksQS5pc3ViKEMpLEIuaXN1YihEKSk6KHkuaXN1Yih4KSxDLmlzdWIoQSksRC5pc3ViKEIpKX1yZXR1cm57YTpDLGI6RCxnY2Q6eS5pdXNobG4oZyl9fSxCTi5wcm90b3R5cGUuX2ludm1wPWZ1bmN0aW9uIF9pbnZtcChwKXthc3NlcnQoMD09PXAubmVnYXRpdmUpLGFzc2VydCghcC5pc1plcm8oKSk7dmFyIGE9dGhpcyxiPXAuY2xvbmUoKTthPTAhPT1hLm5lZ2F0aXZlP2EudW1vZChwKTphLmNsb25lKCk7Zm9yKHZhciByZXMseDE9bmV3IEJOKDEpLHgyPW5ldyBCTigwKSxkZWx0YT1iLmNsb25lKCk7YS5jbXBuKDEpPjAmJmIuY21wbigxKT4wOyl7Zm9yKHZhciBpPTAsaW09MTswPT09KGEud29yZHNbMF0maW0pJiZpPDI2OysraSxpbTw8PTEpO2lmKGk+MClmb3IoYS5pdXNocm4oaSk7aS0tID4wOyl4MS5pc09kZCgpJiZ4MS5pYWRkKGRlbHRhKSx4MS5pdXNocm4oMSk7Zm9yKHZhciBqPTAsam09MTswPT09KGIud29yZHNbMF0mam0pJiZqPDI2OysraixqbTw8PTEpO2lmKGo+MClmb3IoYi5pdXNocm4oaik7ai0tID4wOyl4Mi5pc09kZCgpJiZ4Mi5pYWRkKGRlbHRhKSx4Mi5pdXNocm4oMSk7YS5jbXAoYik+PTA/KGEuaXN1YihiKSx4MS5pc3ViKHgyKSk6KGIuaXN1YihhKSx4Mi5pc3ViKHgxKSl9cmV0dXJuKHJlcz0wPT09YS5jbXBuKDEpP3gxOngyKS5jbXBuKDApPDAmJnJlcy5pYWRkKHApLHJlc30sQk4ucHJvdG90eXBlLmdjZD1mdW5jdGlvbiBnY2QobnVtKXtpZih0aGlzLmlzWmVybygpKXJldHVybiBudW0uYWJzKCk7aWYobnVtLmlzWmVybygpKXJldHVybiB0aGlzLmFicygpO3ZhciBhPXRoaXMuY2xvbmUoKSxiPW51bS5jbG9uZSgpO2EubmVnYXRpdmU9MCxiLm5lZ2F0aXZlPTA7Zm9yKHZhciBzaGlmdD0wO2EuaXNFdmVuKCkmJmIuaXNFdmVuKCk7c2hpZnQrKylhLml1c2hybigxKSxiLml1c2hybigxKTtmb3IoOzspe2Zvcig7YS5pc0V2ZW4oKTspYS5pdXNocm4oMSk7Zm9yKDtiLmlzRXZlbigpOyliLml1c2hybigxKTt2YXIgcj1hLmNtcChiKTtpZihyPDApe3ZhciB0PWE7YT1iLGI9dH1lbHNlIGlmKDA9PT1yfHwwPT09Yi5jbXBuKDEpKWJyZWFrO2EuaXN1YihiKX1yZXR1cm4gYi5pdXNobG4oc2hpZnQpfSxCTi5wcm90b3R5cGUuaW52bT1mdW5jdGlvbiBpbnZtKG51bSl7cmV0dXJuIHRoaXMuZWdjZChudW0pLmEudW1vZChudW0pfSxCTi5wcm90b3R5cGUuaXNFdmVuPWZ1bmN0aW9uIGlzRXZlbigpe3JldHVybiEoMSZ0aGlzLndvcmRzWzBdKX0sQk4ucHJvdG90eXBlLmlzT2RkPWZ1bmN0aW9uIGlzT2RkKCl7cmV0dXJuISgxJn50aGlzLndvcmRzWzBdKX0sQk4ucHJvdG90eXBlLmFuZGxuPWZ1bmN0aW9uIGFuZGxuKG51bSl7cmV0dXJuIHRoaXMud29yZHNbMF0mbnVtfSxCTi5wcm90b3R5cGUuYmluY249ZnVuY3Rpb24gYmluY24oYml0KXthc3NlcnQoIm51bWJlciI9PXR5cGVvZiBiaXQpO3ZhciByPWJpdCUyNixzPShiaXQtcikvMjYscT0xPDxyO2lmKHRoaXMubGVuZ3RoPD1zKXJldHVybiB0aGlzLl9leHBhbmQocysxKSx0aGlzLndvcmRzW3NdfD1xLHRoaXM7Zm9yKHZhciBjYXJyeT1xLGk9czswIT09Y2FycnkmJmk8dGhpcy5sZW5ndGg7aSsrKXt2YXIgdz0wfHRoaXMud29yZHNbaV07Y2Fycnk9KHcrPWNhcnJ5KT4+PjI2LHcmPTY3MTA4ODYzLHRoaXMud29yZHNbaV09d31yZXR1cm4gMCE9PWNhcnJ5JiYodGhpcy53b3Jkc1tpXT1jYXJyeSx0aGlzLmxlbmd0aCsrKSx0aGlzfSxCTi5wcm90b3R5cGUuaXNaZXJvPWZ1bmN0aW9uIGlzWmVybygpe3JldHVybiAxPT09dGhpcy5sZW5ndGgmJjA9PT10aGlzLndvcmRzWzBdfSxCTi5wcm90b3R5cGUuY21wbj1mdW5jdGlvbiBjbXBuKG51bSl7dmFyIHJlcyxuZWdhdGl2ZT1udW08MDtpZigwIT09dGhpcy5uZWdhdGl2ZSYmIW5lZ2F0aXZlKXJldHVybi0xO2lmKDA9PT10aGlzLm5lZ2F0aXZlJiZuZWdhdGl2ZSlyZXR1cm4gMTtpZih0aGlzLnN0cmlwKCksdGhpcy5sZW5ndGg+MSlyZXM9MTtlbHNle25lZ2F0aXZlJiYobnVtPS1udW0pLGFzc2VydChudW08PTY3MTA4ODYzLCJOdW1iZXIgaXMgdG9vIGJpZyIpO3ZhciB3PTB8dGhpcy53b3Jkc1swXTtyZXM9dz09PW51bT8wOnc8bnVtPy0xOjF9cmV0dXJuIDAhPT10aGlzLm5lZ2F0aXZlPzB8LXJlczpyZXN9LEJOLnByb3RvdHlwZS5jbXA9ZnVuY3Rpb24gY21wKG51bSl7aWYoMCE9PXRoaXMubmVnYXRpdmUmJjA9PT1udW0ubmVnYXRpdmUpcmV0dXJuLTE7aWYoMD09PXRoaXMubmVnYXRpdmUmJjAhPT1udW0ubmVnYXRpdmUpcmV0dXJuIDE7dmFyIHJlcz10aGlzLnVjbXAobnVtKTtyZXR1cm4gMCE9PXRoaXMubmVnYXRpdmU/MHwtcmVzOnJlc30sQk4ucHJvdG90eXBlLnVjbXA9ZnVuY3Rpb24gdWNtcChudW0pe2lmKHRoaXMubGVuZ3RoPm51bS5sZW5ndGgpcmV0dXJuIDE7aWYodGhpcy5sZW5ndGg8bnVtLmxlbmd0aClyZXR1cm4tMTtmb3IodmFyIHJlcz0wLGk9dGhpcy5sZW5ndGgtMTtpPj0wO2ktLSl7dmFyIGE9MHx0aGlzLndvcmRzW2ldLGI9MHxudW0ud29yZHNbaV07aWYoYSE9PWIpe2E8Yj9yZXM9LTE6YT5iJiYocmVzPTEpO2JyZWFrfX1yZXR1cm4gcmVzfSxCTi5wcm90b3R5cGUuZ3RuPWZ1bmN0aW9uIGd0bihudW0pe3JldHVybiAxPT09dGhpcy5jbXBuKG51bSl9LEJOLnByb3RvdHlwZS5ndD1mdW5jdGlvbiBndChudW0pe3JldHVybiAxPT09dGhpcy5jbXAobnVtKX0sQk4ucHJvdG90eXBlLmd0ZW49ZnVuY3Rpb24gZ3RlbihudW0pe3JldHVybiB0aGlzLmNtcG4obnVtKT49MH0sQk4ucHJvdG90eXBlLmd0ZT1mdW5jdGlvbiBndGUobnVtKXtyZXR1cm4gdGhpcy5jbXAobnVtKT49MH0sQk4ucHJvdG90eXBlLmx0bj1mdW5jdGlvbiBsdG4obnVtKXtyZXR1cm4tMT09PXRoaXMuY21wbihudW0pfSxCTi5wcm90b3R5cGUubHQ9ZnVuY3Rpb24gbHQobnVtKXtyZXR1cm4tMT09PXRoaXMuY21wKG51bSl9LEJOLnByb3RvdHlwZS5sdGVuPWZ1bmN0aW9uIGx0ZW4obnVtKXtyZXR1cm4gdGhpcy5jbXBuKG51bSk8PTB9LEJOLnByb3RvdHlwZS5sdGU9ZnVuY3Rpb24gbHRlKG51bSl7cmV0dXJuIHRoaXMuY21wKG51bSk8PTB9LEJOLnByb3RvdHlwZS5lcW49ZnVuY3Rpb24gZXFuKG51bSl7cmV0dXJuIDA9PT10aGlzLmNtcG4obnVtKX0sQk4ucHJvdG90eXBlLmVxPWZ1bmN0aW9uIGVxKG51bSl7cmV0dXJuIDA9PT10aGlzLmNtcChudW0pfSxCTi5yZWQ9ZnVuY3Rpb24gcmVkKG51bSl7cmV0dXJuIG5ldyBSZWQobnVtKX0sQk4ucHJvdG90eXBlLnRvUmVkPWZ1bmN0aW9uIHRvUmVkKGN0eCl7cmV0dXJuIGFzc2VydCghdGhpcy5yZWQsIkFscmVhZHkgYSBudW1iZXIgaW4gcmVkdWN0aW9uIGNvbnRleHQiKSxhc3NlcnQoMD09PXRoaXMubmVnYXRpdmUsInJlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzIiksY3R4LmNvbnZlcnRUbyh0aGlzKS5fZm9yY2VSZWQoY3R4KX0sQk4ucHJvdG90eXBlLmZyb21SZWQ9ZnVuY3Rpb24gZnJvbVJlZCgpe3JldHVybiBhc3NlcnQodGhpcy5yZWQsImZyb21SZWQgd29ya3Mgb25seSB3aXRoIG51bWJlcnMgaW4gcmVkdWN0aW9uIGNvbnRleHQiKSx0aGlzLnJlZC5jb252ZXJ0RnJvbSh0aGlzKX0sQk4ucHJvdG90eXBlLl9mb3JjZVJlZD1mdW5jdGlvbiBfZm9yY2VSZWQoY3R4KXtyZXR1cm4gdGhpcy5yZWQ9Y3R4LHRoaXN9LEJOLnByb3RvdHlwZS5mb3JjZVJlZD1mdW5jdGlvbiBmb3JjZVJlZChjdHgpe3JldHVybiBhc3NlcnQoIXRoaXMucmVkLCJBbHJlYWR5IGEgbnVtYmVyIGluIHJlZHVjdGlvbiBjb250ZXh0IiksdGhpcy5fZm9yY2VSZWQoY3R4KX0sQk4ucHJvdG90eXBlLnJlZEFkZD1mdW5jdGlvbiByZWRBZGQobnVtKXtyZXR1cm4gYXNzZXJ0KHRoaXMucmVkLCJyZWRBZGQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuYWRkKHRoaXMsbnVtKX0sQk4ucHJvdG90eXBlLnJlZElBZGQ9ZnVuY3Rpb24gcmVkSUFkZChudW0pe3JldHVybiBhc3NlcnQodGhpcy5yZWQsInJlZElBZGQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuaWFkZCh0aGlzLG51bSl9LEJOLnByb3RvdHlwZS5yZWRTdWI9ZnVuY3Rpb24gcmVkU3ViKG51bSl7cmV0dXJuIGFzc2VydCh0aGlzLnJlZCwicmVkU3ViIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLnN1Yih0aGlzLG51bSl9LEJOLnByb3RvdHlwZS5yZWRJU3ViPWZ1bmN0aW9uIHJlZElTdWIobnVtKXtyZXR1cm4gYXNzZXJ0KHRoaXMucmVkLCJyZWRJU3ViIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLmlzdWIodGhpcyxudW0pfSxCTi5wcm90b3R5cGUucmVkU2hsPWZ1bmN0aW9uIHJlZFNobChudW0pe3JldHVybiBhc3NlcnQodGhpcy5yZWQsInJlZFNobCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5zaGwodGhpcyxudW0pfSxCTi5wcm90b3R5cGUucmVkTXVsPWZ1bmN0aW9uIHJlZE11bChudW0pe3JldHVybiBhc3NlcnQodGhpcy5yZWQsInJlZE11bCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5fdmVyaWZ5Mih0aGlzLG51bSksdGhpcy5yZWQubXVsKHRoaXMsbnVtKX0sQk4ucHJvdG90eXBlLnJlZElNdWw9ZnVuY3Rpb24gcmVkSU11bChudW0pe3JldHVybiBhc3NlcnQodGhpcy5yZWQsInJlZE11bCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5fdmVyaWZ5Mih0aGlzLG51bSksdGhpcy5yZWQuaW11bCh0aGlzLG51bSl9LEJOLnByb3RvdHlwZS5yZWRTcXI9ZnVuY3Rpb24gcmVkU3FyKCl7cmV0dXJuIGFzc2VydCh0aGlzLnJlZCwicmVkU3FyIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLHRoaXMucmVkLnNxcih0aGlzKX0sQk4ucHJvdG90eXBlLnJlZElTcXI9ZnVuY3Rpb24gcmVkSVNxcigpe3JldHVybiBhc3NlcnQodGhpcy5yZWQsInJlZElTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQuaXNxcih0aGlzKX0sQk4ucHJvdG90eXBlLnJlZFNxcnQ9ZnVuY3Rpb24gcmVkU3FydCgpe3JldHVybiBhc3NlcnQodGhpcy5yZWQsInJlZFNxcnQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQuc3FydCh0aGlzKX0sQk4ucHJvdG90eXBlLnJlZEludm09ZnVuY3Rpb24gcmVkSW52bSgpe3JldHVybiBhc3NlcnQodGhpcy5yZWQsInJlZEludm0gd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQuaW52bSh0aGlzKX0sQk4ucHJvdG90eXBlLnJlZE5lZz1mdW5jdGlvbiByZWROZWcoKXtyZXR1cm4gYXNzZXJ0KHRoaXMucmVkLCJyZWROZWcgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQubmVnKHRoaXMpfSxCTi5wcm90b3R5cGUucmVkUG93PWZ1bmN0aW9uIHJlZFBvdyhudW0pe3JldHVybiBhc3NlcnQodGhpcy5yZWQmJiFudW0ucmVkLCJyZWRQb3cobm9ybWFsTnVtKSIpLHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLHRoaXMucmVkLnBvdyh0aGlzLG51bSl9O3ZhciBwcmltZXM9e2syNTY6bnVsbCxwMjI0Om51bGwscDE5MjpudWxsLHAyNTUxOTpudWxsfTtmdW5jdGlvbiBNUHJpbWUobmFtZSxwKXt0aGlzLm5hbWU9bmFtZSx0aGlzLnA9bmV3IEJOKHAsMTYpLHRoaXMubj10aGlzLnAuYml0TGVuZ3RoKCksdGhpcy5rPW5ldyBCTigxKS5pdXNobG4odGhpcy5uKS5pc3ViKHRoaXMucCksdGhpcy50bXA9dGhpcy5fdG1wKCl9ZnVuY3Rpb24gSzI1Nigpe01QcmltZS5jYWxsKHRoaXMsImsyNTYiLCJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmMyZiIpfWZ1bmN0aW9uIFAyMjQoKXtNUHJpbWUuY2FsbCh0aGlzLCJwMjI0IiwiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEiKX1mdW5jdGlvbiBQMTkyKCl7TVByaW1lLmNhbGwodGhpcywicDE5MiIsImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmIil9ZnVuY3Rpb24gUDI1NTE5KCl7TVByaW1lLmNhbGwodGhpcywiMjU1MTkiLCI3ZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmVkIil9ZnVuY3Rpb24gUmVkKG0pe2lmKCJzdHJpbmciPT10eXBlb2YgbSl7dmFyIHByaW1lPUJOLl9wcmltZShtKTt0aGlzLm09cHJpbWUucCx0aGlzLnByaW1lPXByaW1lfWVsc2UgYXNzZXJ0KG0uZ3RuKDEpLCJtb2R1bHVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIDEiKSx0aGlzLm09bSx0aGlzLnByaW1lPW51bGx9ZnVuY3Rpb24gTW9udChtKXtSZWQuY2FsbCh0aGlzLG0pLHRoaXMuc2hpZnQ9dGhpcy5tLmJpdExlbmd0aCgpLHRoaXMuc2hpZnQlMjYhPTAmJih0aGlzLnNoaWZ0Kz0yNi10aGlzLnNoaWZ0JTI2KSx0aGlzLnI9bmV3IEJOKDEpLml1c2hsbih0aGlzLnNoaWZ0KSx0aGlzLnIyPXRoaXMuaW1vZCh0aGlzLnIuc3FyKCkpLHRoaXMucmludj10aGlzLnIuX2ludm1wKHRoaXMubSksdGhpcy5taW52PXRoaXMucmludi5tdWwodGhpcy5yKS5pc3VibigxKS5kaXYodGhpcy5tKSx0aGlzLm1pbnY9dGhpcy5taW52LnVtb2QodGhpcy5yKSx0aGlzLm1pbnY9dGhpcy5yLnN1Yih0aGlzLm1pbnYpfU1QcmltZS5wcm90b3R5cGUuX3RtcD1mdW5jdGlvbiBfdG1wKCl7dmFyIHRtcD1uZXcgQk4obnVsbCk7cmV0dXJuIHRtcC53b3Jkcz1uZXcgQXJyYXkoTWF0aC5jZWlsKHRoaXMubi8xMykpLHRtcH0sTVByaW1lLnByb3RvdHlwZS5pcmVkdWNlPWZ1bmN0aW9uIGlyZWR1Y2UobnVtKXt2YXIgcmxlbixyPW51bTtkb3t0aGlzLnNwbGl0KHIsdGhpcy50bXApLHJsZW49KHI9KHI9dGhpcy5pbXVsSyhyKSkuaWFkZCh0aGlzLnRtcCkpLmJpdExlbmd0aCgpfXdoaWxlKHJsZW4+dGhpcy5uKTt2YXIgY21wPXJsZW48dGhpcy5uPy0xOnIudWNtcCh0aGlzLnApO3JldHVybiAwPT09Y21wPyhyLndvcmRzWzBdPTAsci5sZW5ndGg9MSk6Y21wPjA/ci5pc3ViKHRoaXMucCk6dm9pZCAwIT09ci5zdHJpcD9yLnN0cmlwKCk6ci5fc3RyaXAoKSxyfSxNUHJpbWUucHJvdG90eXBlLnNwbGl0PWZ1bmN0aW9uIHNwbGl0KGlucHV0LG91dCl7aW5wdXQuaXVzaHJuKHRoaXMubiwwLG91dCl9LE1QcmltZS5wcm90b3R5cGUuaW11bEs9ZnVuY3Rpb24gaW11bEsobnVtKXtyZXR1cm4gbnVtLmltdWwodGhpcy5rKX0saW5oZXJpdHMoSzI1NixNUHJpbWUpLEsyNTYucHJvdG90eXBlLnNwbGl0PWZ1bmN0aW9uIHNwbGl0KGlucHV0LG91dHB1dCl7Zm9yKHZhciBvdXRMZW49TWF0aC5taW4oaW5wdXQubGVuZ3RoLDkpLGk9MDtpPG91dExlbjtpKyspb3V0cHV0LndvcmRzW2ldPWlucHV0LndvcmRzW2ldO2lmKG91dHB1dC5sZW5ndGg9b3V0TGVuLGlucHV0Lmxlbmd0aDw9OSlyZXR1cm4gaW5wdXQud29yZHNbMF09MCx2b2lkKGlucHV0Lmxlbmd0aD0xKTt2YXIgcHJldj1pbnB1dC53b3Jkc1s5XTtmb3Iob3V0cHV0LndvcmRzW291dHB1dC5sZW5ndGgrK109NDE5NDMwMyZwcmV2LGk9MTA7aTxpbnB1dC5sZW5ndGg7aSsrKXt2YXIgbmV4dD0wfGlucHV0LndvcmRzW2ldO2lucHV0LndvcmRzW2ktMTBdPSg0MTk0MzAzJm5leHQpPDw0fHByZXY+Pj4yMixwcmV2PW5leHR9cHJldj4+Pj0yMixpbnB1dC53b3Jkc1tpLTEwXT1wcmV2LDA9PT1wcmV2JiZpbnB1dC5sZW5ndGg+MTA/aW5wdXQubGVuZ3RoLT0xMDppbnB1dC5sZW5ndGgtPTl9LEsyNTYucHJvdG90eXBlLmltdWxLPWZ1bmN0aW9uIGltdWxLKG51bSl7bnVtLndvcmRzW251bS5sZW5ndGhdPTAsbnVtLndvcmRzW251bS5sZW5ndGgrMV09MCxudW0ubGVuZ3RoKz0yO2Zvcih2YXIgbG89MCxpPTA7aTxudW0ubGVuZ3RoO2krKyl7dmFyIHc9MHxudW0ud29yZHNbaV07bG8rPTk3Nyp3LG51bS53b3Jkc1tpXT02NzEwODg2MyZsbyxsbz02NCp3Kyhsby82NzEwODg2NHwwKX1yZXR1cm4gMD09PW51bS53b3Jkc1tudW0ubGVuZ3RoLTFdJiYobnVtLmxlbmd0aC0tLDA9PT1udW0ud29yZHNbbnVtLmxlbmd0aC0xXSYmbnVtLmxlbmd0aC0tKSxudW19LGluaGVyaXRzKFAyMjQsTVByaW1lKSxpbmhlcml0cyhQMTkyLE1QcmltZSksaW5oZXJpdHMoUDI1NTE5LE1QcmltZSksUDI1NTE5LnByb3RvdHlwZS5pbXVsSz1mdW5jdGlvbiBpbXVsSyhudW0pe2Zvcih2YXIgY2Fycnk9MCxpPTA7aTxudW0ubGVuZ3RoO2krKyl7dmFyIGhpPTE5KigwfG51bS53b3Jkc1tpXSkrY2FycnksbG89NjcxMDg4NjMmaGk7aGk+Pj49MjYsbnVtLndvcmRzW2ldPWxvLGNhcnJ5PWhpfXJldHVybiAwIT09Y2FycnkmJihudW0ud29yZHNbbnVtLmxlbmd0aCsrXT1jYXJyeSksbnVtfSxCTi5fcHJpbWU9ZnVuY3Rpb24gcHJpbWUobmFtZSl7aWYocHJpbWVzW25hbWVdKXJldHVybiBwcmltZXNbbmFtZV07dmFyIHByaW1lO2lmKCJrMjU2Ij09PW5hbWUpcHJpbWU9bmV3IEsyNTY7ZWxzZSBpZigicDIyNCI9PT1uYW1lKXByaW1lPW5ldyBQMjI0O2Vsc2UgaWYoInAxOTIiPT09bmFtZSlwcmltZT1uZXcgUDE5MjtlbHNle2lmKCJwMjU1MTkiIT09bmFtZSl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gcHJpbWUgIituYW1lKTtwcmltZT1uZXcgUDI1NTE5fXJldHVybiBwcmltZXNbbmFtZV09cHJpbWUscHJpbWV9LFJlZC5wcm90b3R5cGUuX3ZlcmlmeTE9ZnVuY3Rpb24gX3ZlcmlmeTEoYSl7YXNzZXJ0KDA9PT1hLm5lZ2F0aXZlLCJyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcyIpLGFzc2VydChhLnJlZCwicmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpfSxSZWQucHJvdG90eXBlLl92ZXJpZnkyPWZ1bmN0aW9uIF92ZXJpZnkyKGEsYil7YXNzZXJ0KDA9PT0oYS5uZWdhdGl2ZXxiLm5lZ2F0aXZlKSwicmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMiKSxhc3NlcnQoYS5yZWQmJmEucmVkPT09Yi5yZWQsInJlZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKX0sUmVkLnByb3RvdHlwZS5pbW9kPWZ1bmN0aW9uIGltb2QoYSl7cmV0dXJuIHRoaXMucHJpbWU/dGhpcy5wcmltZS5pcmVkdWNlKGEpLl9mb3JjZVJlZCh0aGlzKTphLnVtb2QodGhpcy5tKS5fZm9yY2VSZWQodGhpcyl9LFJlZC5wcm90b3R5cGUubmVnPWZ1bmN0aW9uIG5lZyhhKXtyZXR1cm4gYS5pc1plcm8oKT9hLmNsb25lKCk6dGhpcy5tLnN1YihhKS5fZm9yY2VSZWQodGhpcyl9LFJlZC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uIGFkZChhLGIpe3RoaXMuX3ZlcmlmeTIoYSxiKTt2YXIgcmVzPWEuYWRkKGIpO3JldHVybiByZXMuY21wKHRoaXMubSk+PTAmJnJlcy5pc3ViKHRoaXMubSkscmVzLl9mb3JjZVJlZCh0aGlzKX0sUmVkLnByb3RvdHlwZS5pYWRkPWZ1bmN0aW9uIGlhZGQoYSxiKXt0aGlzLl92ZXJpZnkyKGEsYik7dmFyIHJlcz1hLmlhZGQoYik7cmV0dXJuIHJlcy5jbXAodGhpcy5tKT49MCYmcmVzLmlzdWIodGhpcy5tKSxyZXN9LFJlZC5wcm90b3R5cGUuc3ViPWZ1bmN0aW9uIHN1YihhLGIpe3RoaXMuX3ZlcmlmeTIoYSxiKTt2YXIgcmVzPWEuc3ViKGIpO3JldHVybiByZXMuY21wbigwKTwwJiZyZXMuaWFkZCh0aGlzLm0pLHJlcy5fZm9yY2VSZWQodGhpcyl9LFJlZC5wcm90b3R5cGUuaXN1Yj1mdW5jdGlvbiBpc3ViKGEsYil7dGhpcy5fdmVyaWZ5MihhLGIpO3ZhciByZXM9YS5pc3ViKGIpO3JldHVybiByZXMuY21wbigwKTwwJiZyZXMuaWFkZCh0aGlzLm0pLHJlc30sUmVkLnByb3RvdHlwZS5zaGw9ZnVuY3Rpb24gc2hsKGEsbnVtKXtyZXR1cm4gdGhpcy5fdmVyaWZ5MShhKSx0aGlzLmltb2QoYS51c2hsbihudW0pKX0sUmVkLnByb3RvdHlwZS5pbXVsPWZ1bmN0aW9uIGltdWwoYSxiKXtyZXR1cm4gdGhpcy5fdmVyaWZ5MihhLGIpLHRoaXMuaW1vZChhLmltdWwoYikpfSxSZWQucHJvdG90eXBlLm11bD1mdW5jdGlvbiBtdWwoYSxiKXtyZXR1cm4gdGhpcy5fdmVyaWZ5MihhLGIpLHRoaXMuaW1vZChhLm11bChiKSl9LFJlZC5wcm90b3R5cGUuaXNxcj1mdW5jdGlvbiBpc3FyKGEpe3JldHVybiB0aGlzLmltdWwoYSxhLmNsb25lKCkpfSxSZWQucHJvdG90eXBlLnNxcj1mdW5jdGlvbiBzcXIoYSl7cmV0dXJuIHRoaXMubXVsKGEsYSl9LFJlZC5wcm90b3R5cGUuc3FydD1mdW5jdGlvbiBzcXJ0KGEpe2lmKGEuaXNaZXJvKCkpcmV0dXJuIGEuY2xvbmUoKTt2YXIgbW9kMz10aGlzLm0uYW5kbG4oMyk7aWYoYXNzZXJ0KG1vZDMlMj09MSksMz09PW1vZDMpe3ZhciBwb3c9dGhpcy5tLmFkZChuZXcgQk4oMSkpLml1c2hybigyKTtyZXR1cm4gdGhpcy5wb3coYSxwb3cpfWZvcih2YXIgcT10aGlzLm0uc3VibigxKSxzPTA7IXEuaXNaZXJvKCkmJjA9PT1xLmFuZGxuKDEpOylzKysscS5pdXNocm4oMSk7YXNzZXJ0KCFxLmlzWmVybygpKTt2YXIgb25lPW5ldyBCTigxKS50b1JlZCh0aGlzKSxuT25lPW9uZS5yZWROZWcoKSxscG93PXRoaXMubS5zdWJuKDEpLml1c2hybigxKSx6PXRoaXMubS5iaXRMZW5ndGgoKTtmb3Ioej1uZXcgQk4oMip6KnopLnRvUmVkKHRoaXMpOzAhPT10aGlzLnBvdyh6LGxwb3cpLmNtcChuT25lKTspei5yZWRJQWRkKG5PbmUpO2Zvcih2YXIgYz10aGlzLnBvdyh6LHEpLHI9dGhpcy5wb3coYSxxLmFkZG4oMSkuaXVzaHJuKDEpKSx0PXRoaXMucG93KGEscSksbT1zOzAhPT10LmNtcChvbmUpOyl7Zm9yKHZhciB0bXA9dCxpPTA7MCE9PXRtcC5jbXAob25lKTtpKyspdG1wPXRtcC5yZWRTcXIoKTthc3NlcnQoaTxtKTt2YXIgYj10aGlzLnBvdyhjLG5ldyBCTigxKS5pdXNobG4obS1pLTEpKTtyPXIucmVkTXVsKGIpLGM9Yi5yZWRTcXIoKSx0PXQucmVkTXVsKGMpLG09aX1yZXR1cm4gcn0sUmVkLnByb3RvdHlwZS5pbnZtPWZ1bmN0aW9uIGludm0oYSl7dmFyIGludj1hLl9pbnZtcCh0aGlzLm0pO3JldHVybiAwIT09aW52Lm5lZ2F0aXZlPyhpbnYubmVnYXRpdmU9MCx0aGlzLmltb2QoaW52KS5yZWROZWcoKSk6dGhpcy5pbW9kKGludil9LFJlZC5wcm90b3R5cGUucG93PWZ1bmN0aW9uIHBvdyhhLG51bSl7aWYobnVtLmlzWmVybygpKXJldHVybiBuZXcgQk4oMSkudG9SZWQodGhpcyk7aWYoMD09PW51bS5jbXBuKDEpKXJldHVybiBhLmNsb25lKCk7dmFyIHduZD1uZXcgQXJyYXkoMTYpO3duZFswXT1uZXcgQk4oMSkudG9SZWQodGhpcyksd25kWzFdPWE7Zm9yKHZhciBpPTI7aTx3bmQubGVuZ3RoO2krKyl3bmRbaV09dGhpcy5tdWwod25kW2ktMV0sYSk7dmFyIHJlcz13bmRbMF0sY3VycmVudD0wLGN1cnJlbnRMZW49MCxzdGFydD1udW0uYml0TGVuZ3RoKCklMjY7Zm9yKDA9PT1zdGFydCYmKHN0YXJ0PTI2KSxpPW51bS5sZW5ndGgtMTtpPj0wO2ktLSl7Zm9yKHZhciB3b3JkPW51bS53b3Jkc1tpXSxqPXN0YXJ0LTE7aj49MDtqLS0pe3ZhciBiaXQ9d29yZD4+aiYxO3JlcyE9PXduZFswXSYmKHJlcz10aGlzLnNxcihyZXMpKSwwIT09Yml0fHwwIT09Y3VycmVudD8oY3VycmVudDw8PTEsY3VycmVudHw9Yml0LCg0PT09KytjdXJyZW50TGVufHwwPT09aSYmMD09PWopJiYocmVzPXRoaXMubXVsKHJlcyx3bmRbY3VycmVudF0pLGN1cnJlbnRMZW49MCxjdXJyZW50PTApKTpjdXJyZW50TGVuPTB9c3RhcnQ9MjZ9cmV0dXJuIHJlc30sUmVkLnByb3RvdHlwZS5jb252ZXJ0VG89ZnVuY3Rpb24gY29udmVydFRvKG51bSl7dmFyIHI9bnVtLnVtb2QodGhpcy5tKTtyZXR1cm4gcj09PW51bT9yLmNsb25lKCk6cn0sUmVkLnByb3RvdHlwZS5jb252ZXJ0RnJvbT1mdW5jdGlvbiBjb252ZXJ0RnJvbShudW0pe3ZhciByZXM9bnVtLmNsb25lKCk7cmV0dXJuIHJlcy5yZWQ9bnVsbCxyZXN9LEJOLm1vbnQ9ZnVuY3Rpb24gbW9udChudW0pe3JldHVybiBuZXcgTW9udChudW0pfSxpbmhlcml0cyhNb250LFJlZCksTW9udC5wcm90b3R5cGUuY29udmVydFRvPWZ1bmN0aW9uIGNvbnZlcnRUbyhudW0pe3JldHVybiB0aGlzLmltb2QobnVtLnVzaGxuKHRoaXMuc2hpZnQpKX0sTW9udC5wcm90b3R5cGUuY29udmVydEZyb209ZnVuY3Rpb24gY29udmVydEZyb20obnVtKXt2YXIgcj10aGlzLmltb2QobnVtLm11bCh0aGlzLnJpbnYpKTtyZXR1cm4gci5yZWQ9bnVsbCxyfSxNb250LnByb3RvdHlwZS5pbXVsPWZ1bmN0aW9uIGltdWwoYSxiKXtpZihhLmlzWmVybygpfHxiLmlzWmVybygpKXJldHVybiBhLndvcmRzWzBdPTAsYS5sZW5ndGg9MSxhO3ZhciB0PWEuaW11bChiKSxjPXQubWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubWludikuaW1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm0pLHU9dC5pc3ViKGMpLml1c2hybih0aGlzLnNoaWZ0KSxyZXM9dTtyZXR1cm4gdS5jbXAodGhpcy5tKT49MD9yZXM9dS5pc3ViKHRoaXMubSk6dS5jbXBuKDApPDAmJihyZXM9dS5pYWRkKHRoaXMubSkpLHJlcy5fZm9yY2VSZWQodGhpcyl9LE1vbnQucHJvdG90eXBlLm11bD1mdW5jdGlvbiBtdWwoYSxiKXtpZihhLmlzWmVybygpfHxiLmlzWmVybygpKXJldHVybiBuZXcgQk4oMCkuX2ZvcmNlUmVkKHRoaXMpO3ZhciB0PWEubXVsKGIpLGM9dC5tYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5taW52KS5pbWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubSksdT10LmlzdWIoYykuaXVzaHJuKHRoaXMuc2hpZnQpLHJlcz11O3JldHVybiB1LmNtcCh0aGlzLm0pPj0wP3Jlcz11LmlzdWIodGhpcy5tKTp1LmNtcG4oMCk8MCYmKHJlcz11LmlhZGQodGhpcy5tKSkscmVzLl9mb3JjZVJlZCh0aGlzKX0sTW9udC5wcm90b3R5cGUuaW52bT1mdW5jdGlvbiBpbnZtKGEpe3JldHVybiB0aGlzLmltb2QoYS5faW52bXAodGhpcy5tKS5tdWwodGhpcy5yMikpLl9mb3JjZVJlZCh0aGlzKX19KG1vZHVsZT1fX3dlYnBhY2tfcmVxdWlyZV9fLm5tZChtb2R1bGUpLHRoaXMpfSwiLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3JhbmQvaW5kZXguanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7dmFyIHI7ZnVuY3Rpb24gUmFuZChyYW5kKXt0aGlzLnJhbmQ9cmFuZH1pZihtb2R1bGUuZXhwb3J0cz1mdW5jdGlvbiByYW5kKGxlbil7cmV0dXJuIHJ8fChyPW5ldyBSYW5kKG51bGwpKSxyLmdlbmVyYXRlKGxlbil9LG1vZHVsZS5leHBvcnRzLlJhbmQ9UmFuZCxSYW5kLnByb3RvdHlwZS5nZW5lcmF0ZT1mdW5jdGlvbiBnZW5lcmF0ZShsZW4pe3JldHVybiB0aGlzLl9yYW5kKGxlbil9LFJhbmQucHJvdG90eXBlLl9yYW5kPWZ1bmN0aW9uIF9yYW5kKG4pe2lmKHRoaXMucmFuZC5nZXRCeXRlcylyZXR1cm4gdGhpcy5yYW5kLmdldEJ5dGVzKG4pO2Zvcih2YXIgcmVzPW5ldyBVaW50OEFycmF5KG4pLGk9MDtpPHJlcy5sZW5ndGg7aSsrKXJlc1tpXT10aGlzLnJhbmQuZ2V0Qnl0ZSgpO3JldHVybiByZXN9LCJvYmplY3QiPT10eXBlb2Ygc2VsZilzZWxmLmNyeXB0byYmc2VsZi5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzP1JhbmQucHJvdG90eXBlLl9yYW5kPWZ1bmN0aW9uIF9yYW5kKG4pe3ZhciBhcnI9bmV3IFVpbnQ4QXJyYXkobik7cmV0dXJuIHNlbGYuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnIpLGFycn06c2VsZi5tc0NyeXB0byYmc2VsZi5tc0NyeXB0by5nZXRSYW5kb21WYWx1ZXM/UmFuZC5wcm90b3R5cGUuX3JhbmQ9ZnVuY3Rpb24gX3JhbmQobil7dmFyIGFycj1uZXcgVWludDhBcnJheShuKTtyZXR1cm4gc2VsZi5tc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyKSxhcnJ9OiJvYmplY3QiPT10eXBlb2Ygd2luZG93JiYoUmFuZC5wcm90b3R5cGUuX3JhbmQ9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKX0pO2Vsc2UgdHJ5e3ZhciBjcnlwdG89X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2NyeXB0by1icm93c2VyaWZ5L2luZGV4LmpzIik7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGNyeXB0by5yYW5kb21CeXRlcyl0aHJvdyBuZXcgRXJyb3IoIk5vdCBzdXBwb3J0ZWQiKTtSYW5kLnByb3RvdHlwZS5fcmFuZD1mdW5jdGlvbiBfcmFuZChuKXtyZXR1cm4gY3J5cHRvLnJhbmRvbUJ5dGVzKG4pfX1jYXRjaChlKXt9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL2Flcy5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXt2YXIgQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcyIpLkJ1ZmZlcjtmdW5jdGlvbiBhc1VJbnQzMkFycmF5KGJ1Zil7QnVmZmVyLmlzQnVmZmVyKGJ1Zil8fChidWY9QnVmZmVyLmZyb20oYnVmKSk7Zm9yKHZhciBsZW49YnVmLmxlbmd0aC80fDAsb3V0PW5ldyBBcnJheShsZW4pLGk9MDtpPGxlbjtpKyspb3V0W2ldPWJ1Zi5yZWFkVUludDMyQkUoNCppKTtyZXR1cm4gb3V0fWZ1bmN0aW9uIHNjcnViVmVjKHYpe2Zvcig7MDx2Lmxlbmd0aDt2KyspdlswXT0wfWZ1bmN0aW9uIGNyeXB0QmxvY2soTSxrZXlTY2hlZHVsZSxTVUJfTUlYLFNCT1gsblJvdW5kcyl7Zm9yKHZhciB0MCx0MSx0Mix0MyxTVUJfTUlYMD1TVUJfTUlYWzBdLFNVQl9NSVgxPVNVQl9NSVhbMV0sU1VCX01JWDI9U1VCX01JWFsyXSxTVUJfTUlYMz1TVUJfTUlYWzNdLHMwPU1bMF1ea2V5U2NoZWR1bGVbMF0sczE9TVsxXV5rZXlTY2hlZHVsZVsxXSxzMj1NWzJdXmtleVNjaGVkdWxlWzJdLHMzPU1bM11ea2V5U2NoZWR1bGVbM10sa3NSb3c9NCxyb3VuZD0xO3JvdW5kPG5Sb3VuZHM7cm91bmQrKyl0MD1TVUJfTUlYMFtzMD4+PjI0XV5TVUJfTUlYMVtzMT4+PjE2JjI1NV1eU1VCX01JWDJbczI+Pj44JjI1NV1eU1VCX01JWDNbMjU1JnMzXV5rZXlTY2hlZHVsZVtrc1JvdysrXSx0MT1TVUJfTUlYMFtzMT4+PjI0XV5TVUJfTUlYMVtzMj4+PjE2JjI1NV1eU1VCX01JWDJbczM+Pj44JjI1NV1eU1VCX01JWDNbMjU1JnMwXV5rZXlTY2hlZHVsZVtrc1JvdysrXSx0Mj1TVUJfTUlYMFtzMj4+PjI0XV5TVUJfTUlYMVtzMz4+PjE2JjI1NV1eU1VCX01JWDJbczA+Pj44JjI1NV1eU1VCX01JWDNbMjU1JnMxXV5rZXlTY2hlZHVsZVtrc1JvdysrXSx0Mz1TVUJfTUlYMFtzMz4+PjI0XV5TVUJfTUlYMVtzMD4+PjE2JjI1NV1eU1VCX01JWDJbczE+Pj44JjI1NV1eU1VCX01JWDNbMjU1JnMyXV5rZXlTY2hlZHVsZVtrc1JvdysrXSxzMD10MCxzMT10MSxzMj10MixzMz10MztyZXR1cm4gdDA9KFNCT1hbczA+Pj4yNF08PDI0fFNCT1hbczE+Pj4xNiYyNTVdPDwxNnxTQk9YW3MyPj4+OCYyNTVdPDw4fFNCT1hbMjU1JnMzXSlea2V5U2NoZWR1bGVba3NSb3crK10sdDE9KFNCT1hbczE+Pj4yNF08PDI0fFNCT1hbczI+Pj4xNiYyNTVdPDwxNnxTQk9YW3MzPj4+OCYyNTVdPDw4fFNCT1hbMjU1JnMwXSlea2V5U2NoZWR1bGVba3NSb3crK10sdDI9KFNCT1hbczI+Pj4yNF08PDI0fFNCT1hbczM+Pj4xNiYyNTVdPDwxNnxTQk9YW3MwPj4+OCYyNTVdPDw4fFNCT1hbMjU1JnMxXSlea2V5U2NoZWR1bGVba3NSb3crK10sdDM9KFNCT1hbczM+Pj4yNF08PDI0fFNCT1hbczA+Pj4xNiYyNTVdPDwxNnxTQk9YW3MxPj4+OCYyNTVdPDw4fFNCT1hbMjU1JnMyXSlea2V5U2NoZWR1bGVba3NSb3crK10sW3QwPj4+PTAsdDE+Pj49MCx0Mj4+Pj0wLHQzPj4+PTBdfXZhciBSQ09OPVswLDEsMiw0LDgsMTYsMzIsNjQsMTI4LDI3LDU0XSxHPWZ1bmN0aW9uKCl7Zm9yKHZhciBkPW5ldyBBcnJheSgyNTYpLGo9MDtqPDI1NjtqKyspZFtqXT1qPDEyOD9qPDwxOmo8PDFeMjgzO2Zvcih2YXIgU0JPWD1bXSxJTlZfU0JPWD1bXSxTVUJfTUlYPVtbXSxbXSxbXSxbXV0sSU5WX1NVQl9NSVg9W1tdLFtdLFtdLFtdXSx4PTAseGk9MCxpPTA7aTwyNTY7KytpKXt2YXIgc3g9eGleeGk8PDFeeGk8PDJeeGk8PDNeeGk8PDQ7c3g9c3g+Pj44XjI1NSZzeF45OSxTQk9YW3hdPXN4LElOVl9TQk9YW3N4XT14O3ZhciB4Mj1kW3hdLHg0PWRbeDJdLHg4PWRbeDRdLHQ9MjU3KmRbc3hdXjE2ODQzMDA4KnN4O1NVQl9NSVhbMF1beF09dDw8MjR8dD4+PjgsU1VCX01JWFsxXVt4XT10PDwxNnx0Pj4+MTYsU1VCX01JWFsyXVt4XT10PDw4fHQ+Pj4yNCxTVUJfTUlYWzNdW3hdPXQsdD0xNjg0MzAwOSp4OF42NTUzNyp4NF4yNTcqeDJeMTY4NDMwMDgqeCxJTlZfU1VCX01JWFswXVtzeF09dDw8MjR8dD4+PjgsSU5WX1NVQl9NSVhbMV1bc3hdPXQ8PDE2fHQ+Pj4xNixJTlZfU1VCX01JWFsyXVtzeF09dDw8OHx0Pj4+MjQsSU5WX1NVQl9NSVhbM11bc3hdPXQsMD09PXg/eD14aT0xOih4PXgyXmRbZFtkW3g4XngyXV1dLHhpXj1kW2RbeGldXSl9cmV0dXJue1NCT1gsSU5WX1NCT1gsU1VCX01JWCxJTlZfU1VCX01JWH19KCk7ZnVuY3Rpb24gQUVTKGtleSl7dGhpcy5fa2V5PWFzVUludDMyQXJyYXkoa2V5KSx0aGlzLl9yZXNldCgpfUFFUy5ibG9ja1NpemU9MTYsQUVTLmtleVNpemU9MzIsQUVTLnByb3RvdHlwZS5ibG9ja1NpemU9QUVTLmJsb2NrU2l6ZSxBRVMucHJvdG90eXBlLmtleVNpemU9QUVTLmtleVNpemUsQUVTLnByb3RvdHlwZS5fcmVzZXQ9ZnVuY3Rpb24oKXtmb3IodmFyIGtleVdvcmRzPXRoaXMuX2tleSxrZXlTaXplPWtleVdvcmRzLmxlbmd0aCxuUm91bmRzPWtleVNpemUrNixrc1Jvd3M9NCooblJvdW5kcysxKSxrZXlTY2hlZHVsZT1bXSxrPTA7azxrZXlTaXplO2srKylrZXlTY2hlZHVsZVtrXT1rZXlXb3Jkc1trXTtmb3Ioaz1rZXlTaXplO2s8a3NSb3dzO2srKyl7dmFyIHQ9a2V5U2NoZWR1bGVbay0xXTtrJWtleVNpemU9PT0wPyh0PXQ8PDh8dD4+PjI0LHQ9Ry5TQk9YW3Q+Pj4yNF08PDI0fEcuU0JPWFt0Pj4+MTYmMjU1XTw8MTZ8Ry5TQk9YW3Q+Pj44JjI1NV08PDh8Ry5TQk9YWzI1NSZ0XSx0Xj1SQ09OW2sva2V5U2l6ZXwwXTw8MjQpOmtleVNpemU+NiYmayVrZXlTaXplPT09NCYmKHQ9Ry5TQk9YW3Q+Pj4yNF08PDI0fEcuU0JPWFt0Pj4+MTYmMjU1XTw8MTZ8Ry5TQk9YW3Q+Pj44JjI1NV08PDh8Ry5TQk9YWzI1NSZ0XSksa2V5U2NoZWR1bGVba109a2V5U2NoZWR1bGVbay1rZXlTaXplXV50fWZvcih2YXIgaW52S2V5U2NoZWR1bGU9W10saWs9MDtpazxrc1Jvd3M7aWsrKyl7dmFyIGtzUj1rc1Jvd3MtaWssdHQ9a2V5U2NoZWR1bGVba3NSLShpayU0PzA6NCldO2ludktleVNjaGVkdWxlW2lrXT1pazw0fHxrc1I8PTQ/dHQ6Ry5JTlZfU1VCX01JWFswXVtHLlNCT1hbdHQ+Pj4yNF1dXkcuSU5WX1NVQl9NSVhbMV1bRy5TQk9YW3R0Pj4+MTYmMjU1XV1eRy5JTlZfU1VCX01JWFsyXVtHLlNCT1hbdHQ+Pj44JjI1NV1dXkcuSU5WX1NVQl9NSVhbM11bRy5TQk9YWzI1NSZ0dF1dfXRoaXMuX25Sb3VuZHM9blJvdW5kcyx0aGlzLl9rZXlTY2hlZHVsZT1rZXlTY2hlZHVsZSx0aGlzLl9pbnZLZXlTY2hlZHVsZT1pbnZLZXlTY2hlZHVsZX0sQUVTLnByb3RvdHlwZS5lbmNyeXB0QmxvY2tSYXc9ZnVuY3Rpb24oTSl7cmV0dXJuIGNyeXB0QmxvY2soTT1hc1VJbnQzMkFycmF5KE0pLHRoaXMuX2tleVNjaGVkdWxlLEcuU1VCX01JWCxHLlNCT1gsdGhpcy5fblJvdW5kcyl9LEFFUy5wcm90b3R5cGUuZW5jcnlwdEJsb2NrPWZ1bmN0aW9uKE0pe3ZhciBvdXQ9dGhpcy5lbmNyeXB0QmxvY2tSYXcoTSksYnVmPUJ1ZmZlci5hbGxvY1Vuc2FmZSgxNik7cmV0dXJuIGJ1Zi53cml0ZVVJbnQzMkJFKG91dFswXSwwKSxidWYud3JpdGVVSW50MzJCRShvdXRbMV0sNCksYnVmLndyaXRlVUludDMyQkUob3V0WzJdLDgpLGJ1Zi53cml0ZVVJbnQzMkJFKG91dFszXSwxMiksYnVmfSxBRVMucHJvdG90eXBlLmRlY3J5cHRCbG9jaz1mdW5jdGlvbihNKXt2YXIgbTE9KE09YXNVSW50MzJBcnJheShNKSlbMV07TVsxXT1NWzNdLE1bM109bTE7dmFyIG91dD1jcnlwdEJsb2NrKE0sdGhpcy5faW52S2V5U2NoZWR1bGUsRy5JTlZfU1VCX01JWCxHLklOVl9TQk9YLHRoaXMuX25Sb3VuZHMpLGJ1Zj1CdWZmZXIuYWxsb2NVbnNhZmUoMTYpO3JldHVybiBidWYud3JpdGVVSW50MzJCRShvdXRbMF0sMCksYnVmLndyaXRlVUludDMyQkUob3V0WzNdLDQpLGJ1Zi53cml0ZVVJbnQzMkJFKG91dFsyXSw4KSxidWYud3JpdGVVSW50MzJCRShvdXRbMV0sMTIpLGJ1Zn0sQUVTLnByb3RvdHlwZS5zY3J1Yj1mdW5jdGlvbigpe3NjcnViVmVjKHRoaXMuX2tleVNjaGVkdWxlKSxzY3J1YlZlYyh0aGlzLl9pbnZLZXlTY2hlZHVsZSksc2NydWJWZWModGhpcy5fa2V5KX0sbW9kdWxlLmV4cG9ydHMuQUVTPUFFU30sIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9hdXRoQ2lwaGVyLmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pe3ZhciBhZXM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL2Flcy5qcyIpLEJ1ZmZlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc2FmZS1idWZmZXIvaW5kZXguanMiKS5CdWZmZXIsVHJhbnNmb3JtPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9jaXBoZXItYmFzZS9pbmRleC5qcyIpLGluaGVyaXRzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiksR0hBU0g9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL2doYXNoLmpzIikseG9yPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9idWZmZXIteG9yL2luZGV4LmpzIiksaW5jcjMyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9pbmNyMzIuanMiKTtmdW5jdGlvbiBTdHJlYW1DaXBoZXIobW9kZSxrZXksaXYsZGVjcnlwdCl7VHJhbnNmb3JtLmNhbGwodGhpcyk7dmFyIGg9QnVmZmVyLmFsbG9jKDQsMCk7dGhpcy5fY2lwaGVyPW5ldyBhZXMuQUVTKGtleSk7dmFyIGNrPXRoaXMuX2NpcGhlci5lbmNyeXB0QmxvY2soaCk7dGhpcy5fZ2hhc2g9bmV3IEdIQVNIKGNrKSxpdj1mdW5jdGlvbiBjYWxjSXYoc2VsZixpdixjayl7aWYoMTI9PT1pdi5sZW5ndGgpcmV0dXJuIHNlbGYuX2ZpbklEPUJ1ZmZlci5jb25jYXQoW2l2LEJ1ZmZlci5mcm9tKFswLDAsMCwxXSldKSxCdWZmZXIuY29uY2F0KFtpdixCdWZmZXIuZnJvbShbMCwwLDAsMl0pXSk7dmFyIGdoYXNoPW5ldyBHSEFTSChjayksbGVuPWl2Lmxlbmd0aCx0b1BhZD1sZW4lMTY7Z2hhc2gudXBkYXRlKGl2KSx0b1BhZCYmKHRvUGFkPTE2LXRvUGFkLGdoYXNoLnVwZGF0ZShCdWZmZXIuYWxsb2ModG9QYWQsMCkpKSxnaGFzaC51cGRhdGUoQnVmZmVyLmFsbG9jKDgsMCkpO3ZhciBpdkJpdHM9OCpsZW4sdGFpbD1CdWZmZXIuYWxsb2MoOCk7dGFpbC53cml0ZVVJbnRCRShpdkJpdHMsMCw4KSxnaGFzaC51cGRhdGUodGFpbCksc2VsZi5fZmluSUQ9Z2hhc2guc3RhdGU7dmFyIG91dD1CdWZmZXIuZnJvbShzZWxmLl9maW5JRCk7cmV0dXJuIGluY3IzMihvdXQpLG91dH0odGhpcyxpdixjayksdGhpcy5fcHJldj1CdWZmZXIuZnJvbShpdiksdGhpcy5fY2FjaGU9QnVmZmVyLmFsbG9jVW5zYWZlKDApLHRoaXMuX3NlY0NhY2hlPUJ1ZmZlci5hbGxvY1Vuc2FmZSgwKSx0aGlzLl9kZWNyeXB0PWRlY3J5cHQsdGhpcy5fYWxlbj0wLHRoaXMuX2xlbj0wLHRoaXMuX21vZGU9bW9kZSx0aGlzLl9hdXRoVGFnPW51bGwsdGhpcy5fY2FsbGVkPSExfWluaGVyaXRzKFN0cmVhbUNpcGhlcixUcmFuc2Zvcm0pLFN0cmVhbUNpcGhlci5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbihjaHVuayl7aWYoIXRoaXMuX2NhbGxlZCYmdGhpcy5fYWxlbil7dmFyIHJ1bXA9MTYtdGhpcy5fYWxlbiUxNjtydW1wPDE2JiYocnVtcD1CdWZmZXIuYWxsb2MocnVtcCwwKSx0aGlzLl9naGFzaC51cGRhdGUocnVtcCkpfXRoaXMuX2NhbGxlZD0hMDt2YXIgb3V0PXRoaXMuX21vZGUuZW5jcnlwdCh0aGlzLGNodW5rKTtyZXR1cm4gdGhpcy5fZGVjcnlwdD90aGlzLl9naGFzaC51cGRhdGUoY2h1bmspOnRoaXMuX2doYXNoLnVwZGF0ZShvdXQpLHRoaXMuX2xlbis9Y2h1bmsubGVuZ3RoLG91dH0sU3RyZWFtQ2lwaGVyLnByb3RvdHlwZS5fZmluYWw9ZnVuY3Rpb24oKXtpZih0aGlzLl9kZWNyeXB0JiYhdGhpcy5fYXV0aFRhZyl0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIHN0YXRlIG9yIHVuYWJsZSB0byBhdXRoZW50aWNhdGUgZGF0YSIpO3ZhciB0YWc9eG9yKHRoaXMuX2doYXNoLmZpbmFsKDgqdGhpcy5fYWxlbiw4KnRoaXMuX2xlbiksdGhpcy5fY2lwaGVyLmVuY3J5cHRCbG9jayh0aGlzLl9maW5JRCkpO2lmKHRoaXMuX2RlY3J5cHQmJmZ1bmN0aW9uIHhvclRlc3QoYSxiKXt2YXIgb3V0PTA7YS5sZW5ndGghPT1iLmxlbmd0aCYmb3V0Kys7Zm9yKHZhciBsZW49TWF0aC5taW4oYS5sZW5ndGgsYi5sZW5ndGgpLGk9MDtpPGxlbjsrK2kpb3V0Kz1hW2ldXmJbaV07cmV0dXJuIG91dH0odGFnLHRoaXMuX2F1dGhUYWcpKXRocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgc3RhdGUgb3IgdW5hYmxlIHRvIGF1dGhlbnRpY2F0ZSBkYXRhIik7dGhpcy5fYXV0aFRhZz10YWcsdGhpcy5fY2lwaGVyLnNjcnViKCl9LFN0cmVhbUNpcGhlci5wcm90b3R5cGUuZ2V0QXV0aFRhZz1mdW5jdGlvbiBnZXRBdXRoVGFnKCl7aWYodGhpcy5fZGVjcnlwdHx8IUJ1ZmZlci5pc0J1ZmZlcih0aGlzLl9hdXRoVGFnKSl0aHJvdyBuZXcgRXJyb3IoIkF0dGVtcHRpbmcgdG8gZ2V0IGF1dGggdGFnIGluIHVuc3VwcG9ydGVkIHN0YXRlIik7cmV0dXJuIHRoaXMuX2F1dGhUYWd9LFN0cmVhbUNpcGhlci5wcm90b3R5cGUuc2V0QXV0aFRhZz1mdW5jdGlvbiBzZXRBdXRoVGFnKHRhZyl7aWYoIXRoaXMuX2RlY3J5cHQpdGhyb3cgbmV3IEVycm9yKCJBdHRlbXB0aW5nIHRvIHNldCBhdXRoIHRhZyBpbiB1bnN1cHBvcnRlZCBzdGF0ZSIpO3RoaXMuX2F1dGhUYWc9dGFnfSxTdHJlYW1DaXBoZXIucHJvdG90eXBlLnNldEFBRD1mdW5jdGlvbiBzZXRBQUQoYnVmKXtpZih0aGlzLl9jYWxsZWQpdGhyb3cgbmV3IEVycm9yKCJBdHRlbXB0aW5nIHRvIHNldCBBQUQgaW4gdW5zdXBwb3J0ZWQgc3RhdGUiKTt0aGlzLl9naGFzaC51cGRhdGUoYnVmKSx0aGlzLl9hbGVuKz1idWYubGVuZ3RofSxtb2R1bGUuZXhwb3J0cz1TdHJlYW1DaXBoZXJ9LCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvYnJvd3Nlci5qcyIoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXt2YXIgY2lwaGVycz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvZW5jcnlwdGVyLmpzIiksZGVjaXBoZXJzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9kZWNyeXB0ZXIuanMiKSxtb2Rlcz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvbW9kZXMvbGlzdC5qc29uIik7ZXhwb3J0cy5jcmVhdGVDaXBoZXI9ZXhwb3J0cy5DaXBoZXI9Y2lwaGVycy5jcmVhdGVDaXBoZXIsZXhwb3J0cy5jcmVhdGVDaXBoZXJpdj1leHBvcnRzLkNpcGhlcml2PWNpcGhlcnMuY3JlYXRlQ2lwaGVyaXYsZXhwb3J0cy5jcmVhdGVEZWNpcGhlcj1leHBvcnRzLkRlY2lwaGVyPWRlY2lwaGVycy5jcmVhdGVEZWNpcGhlcixleHBvcnRzLmNyZWF0ZURlY2lwaGVyaXY9ZXhwb3J0cy5EZWNpcGhlcml2PWRlY2lwaGVycy5jcmVhdGVEZWNpcGhlcml2LGV4cG9ydHMubGlzdENpcGhlcnM9ZXhwb3J0cy5nZXRDaXBoZXJzPWZ1bmN0aW9uIGdldENpcGhlcnMoKXtyZXR1cm4gT2JqZWN0LmtleXMobW9kZXMpfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9kZWNyeXB0ZXIuanMiKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7dmFyIEF1dGhDaXBoZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL2F1dGhDaXBoZXIuanMiKSxCdWZmZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3NhZmUtYnVmZmVyL2luZGV4LmpzIikuQnVmZmVyLE1PREVTPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9tb2Rlcy9pbmRleC5qcyIpLFN0cmVhbUNpcGhlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvc3RyZWFtQ2lwaGVyLmpzIiksVHJhbnNmb3JtPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9jaXBoZXItYmFzZS9pbmRleC5qcyIpLGFlcz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvYWVzLmpzIiksZWJ0az1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZXZwX2J5dGVzdG9rZXkvaW5kZXguanMiKTtmdW5jdGlvbiBEZWNpcGhlcihtb2RlLGtleSxpdil7VHJhbnNmb3JtLmNhbGwodGhpcyksdGhpcy5fY2FjaGU9bmV3IFNwbGl0dGVyLHRoaXMuX2xhc3Q9dm9pZCAwLHRoaXMuX2NpcGhlcj1uZXcgYWVzLkFFUyhrZXkpLHRoaXMuX3ByZXY9QnVmZmVyLmZyb20oaXYpLHRoaXMuX21vZGU9bW9kZSx0aGlzLl9hdXRvcGFkZGluZz0hMH1mdW5jdGlvbiBTcGxpdHRlcigpe3RoaXMuY2FjaGU9QnVmZmVyLmFsbG9jVW5zYWZlKDApfWZ1bmN0aW9uIGNyZWF0ZURlY2lwaGVyaXYoc3VpdGUscGFzc3dvcmQsaXYpe3ZhciBjb25maWc9TU9ERVNbc3VpdGUudG9Mb3dlckNhc2UoKV07aWYoIWNvbmZpZyl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnZhbGlkIHN1aXRlIHR5cGUiKTtpZigic3RyaW5nIj09dHlwZW9mIGl2JiYoaXY9QnVmZmVyLmZyb20oaXYpKSwiR0NNIiE9PWNvbmZpZy5tb2RlJiZpdi5sZW5ndGghPT1jb25maWcuaXYpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBpdiBsZW5ndGggIitpdi5sZW5ndGgpO2lmKCJzdHJpbmciPT10eXBlb2YgcGFzc3dvcmQmJihwYXNzd29yZD1CdWZmZXIuZnJvbShwYXNzd29yZCkpLHBhc3N3b3JkLmxlbmd0aCE9PWNvbmZpZy5rZXkvOCl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnZhbGlkIGtleSBsZW5ndGggIitwYXNzd29yZC5sZW5ndGgpO3JldHVybiJzdHJlYW0iPT09Y29uZmlnLnR5cGU/bmV3IFN0cmVhbUNpcGhlcihjb25maWcubW9kdWxlLHBhc3N3b3JkLGl2LCEwKToiYXV0aCI9PT1jb25maWcudHlwZT9uZXcgQXV0aENpcGhlcihjb25maWcubW9kdWxlLHBhc3N3b3JkLGl2LCEwKTpuZXcgRGVjaXBoZXIoY29uZmlnLm1vZHVsZSxwYXNzd29yZCxpdil9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiKShEZWNpcGhlcixUcmFuc2Zvcm0pLERlY2lwaGVyLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKGRhdGEpe3ZhciBjaHVuayx0aGluZzt0aGlzLl9jYWNoZS5hZGQoZGF0YSk7Zm9yKHZhciBvdXQ9W107Y2h1bms9dGhpcy5fY2FjaGUuZ2V0KHRoaXMuX2F1dG9wYWRkaW5nKTspdGhpbmc9dGhpcy5fbW9kZS5kZWNyeXB0KHRoaXMsY2h1bmspLG91dC5wdXNoKHRoaW5nKTtyZXR1cm4gQnVmZmVyLmNvbmNhdChvdXQpfSxEZWNpcGhlci5wcm90b3R5cGUuX2ZpbmFsPWZ1bmN0aW9uKCl7dmFyIGNodW5rPXRoaXMuX2NhY2hlLmZsdXNoKCk7aWYodGhpcy5fYXV0b3BhZGRpbmcpcmV0dXJuIGZ1bmN0aW9uIHVucGFkKGxhc3Qpe3ZhciBwYWRkZWQ9bGFzdFsxNV07aWYocGFkZGVkPDF8fHBhZGRlZD4xNil0aHJvdyBuZXcgRXJyb3IoInVuYWJsZSB0byBkZWNyeXB0IGRhdGEiKTt2YXIgaT0tMTtmb3IoOysraTxwYWRkZWQ7KWlmKGxhc3RbaSsoMTYtcGFkZGVkKV0hPT1wYWRkZWQpdGhyb3cgbmV3IEVycm9yKCJ1bmFibGUgdG8gZGVjcnlwdCBkYXRhIik7aWYoMTY9PT1wYWRkZWQpcmV0dXJuO3JldHVybiBsYXN0LnNsaWNlKDAsMTYtcGFkZGVkKX0odGhpcy5fbW9kZS5kZWNyeXB0KHRoaXMsY2h1bmspKTtpZihjaHVuayl0aHJvdyBuZXcgRXJyb3IoImRhdGEgbm90IG11bHRpcGxlIG9mIGJsb2NrIGxlbmd0aCIpfSxEZWNpcGhlci5wcm90b3R5cGUuc2V0QXV0b1BhZGRpbmc9ZnVuY3Rpb24oc2V0VG8pe3JldHVybiB0aGlzLl9hdXRvcGFkZGluZz0hIXNldFRvLHRoaXN9LFNwbGl0dGVyLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oZGF0YSl7dGhpcy5jYWNoZT1CdWZmZXIuY29uY2F0KFt0aGlzLmNhY2hlLGRhdGFdKX0sU3BsaXR0ZXIucHJvdG90eXBlLmdldD1mdW5jdGlvbihhdXRvUGFkZGluZyl7dmFyIG91dDtpZihhdXRvUGFkZGluZyl7aWYodGhpcy5jYWNoZS5sZW5ndGg+MTYpcmV0dXJuIG91dD10aGlzLmNhY2hlLnNsaWNlKDAsMTYpLHRoaXMuY2FjaGU9dGhpcy5jYWNoZS5zbGljZSgxNiksb3V0fWVsc2UgaWYodGhpcy5jYWNoZS5sZW5ndGg+PTE2KXJldHVybiBvdXQ9dGhpcy5jYWNoZS5zbGljZSgwLDE2KSx0aGlzLmNhY2hlPXRoaXMuY2FjaGUuc2xpY2UoMTYpLG91dDtyZXR1cm4gbnVsbH0sU3BsaXR0ZXIucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7aWYodGhpcy5jYWNoZS5sZW5ndGgpcmV0dXJuIHRoaXMuY2FjaGV9LGV4cG9ydHMuY3JlYXRlRGVjaXBoZXI9ZnVuY3Rpb24gY3JlYXRlRGVjaXBoZXIoc3VpdGUscGFzc3dvcmQpe3ZhciBjb25maWc9TU9ERVNbc3VpdGUudG9Mb3dlckNhc2UoKV07aWYoIWNvbmZpZyl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnZhbGlkIHN1aXRlIHR5cGUiKTt2YXIga2V5cz1lYnRrKHBhc3N3b3JkLCExLGNvbmZpZy5rZXksY29uZmlnLml2KTtyZXR1cm4gY3JlYXRlRGVjaXBoZXJpdihzdWl0ZSxrZXlzLmtleSxrZXlzLml2KX0sZXhwb3J0cy5jcmVhdGVEZWNpcGhlcml2PWNyZWF0ZURlY2lwaGVyaXZ9LCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvZW5jcnlwdGVyLmpzIihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pe3ZhciBNT0RFUz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvbW9kZXMvaW5kZXguanMiKSxBdXRoQ2lwaGVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9hdXRoQ2lwaGVyLmpzIiksQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcyIpLkJ1ZmZlcixTdHJlYW1DaXBoZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL3N0cmVhbUNpcGhlci5qcyIpLFRyYW5zZm9ybT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvY2lwaGVyLWJhc2UvaW5kZXguanMiKSxhZXM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL2Flcy5qcyIpLGVidGs9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2V2cF9ieXRlc3Rva2V5L2luZGV4LmpzIik7ZnVuY3Rpb24gQ2lwaGVyKG1vZGUsa2V5LGl2KXtUcmFuc2Zvcm0uY2FsbCh0aGlzKSx0aGlzLl9jYWNoZT1uZXcgU3BsaXR0ZXIsdGhpcy5fY2lwaGVyPW5ldyBhZXMuQUVTKGtleSksdGhpcy5fcHJldj1CdWZmZXIuZnJvbShpdiksdGhpcy5fbW9kZT1tb2RlLHRoaXMuX2F1dG9wYWRkaW5nPSEwfV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIikoQ2lwaGVyLFRyYW5zZm9ybSksQ2lwaGVyLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKGRhdGEpe3ZhciBjaHVuayx0aGluZzt0aGlzLl9jYWNoZS5hZGQoZGF0YSk7Zm9yKHZhciBvdXQ9W107Y2h1bms9dGhpcy5fY2FjaGUuZ2V0KCk7KXRoaW5nPXRoaXMuX21vZGUuZW5jcnlwdCh0aGlzLGNodW5rKSxvdXQucHVzaCh0aGluZyk7cmV0dXJuIEJ1ZmZlci5jb25jYXQob3V0KX07dmFyIFBBRERJTkc9QnVmZmVyLmFsbG9jKDE2LDE2KTtmdW5jdGlvbiBTcGxpdHRlcigpe3RoaXMuY2FjaGU9QnVmZmVyLmFsbG9jVW5zYWZlKDApfWZ1bmN0aW9uIGNyZWF0ZUNpcGhlcml2KHN1aXRlLHBhc3N3b3JkLGl2KXt2YXIgY29uZmlnPU1PREVTW3N1aXRlLnRvTG93ZXJDYXNlKCldO2lmKCFjb25maWcpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBzdWl0ZSB0eXBlIik7aWYoInN0cmluZyI9PXR5cGVvZiBwYXNzd29yZCYmKHBhc3N3b3JkPUJ1ZmZlci5mcm9tKHBhc3N3b3JkKSkscGFzc3dvcmQubGVuZ3RoIT09Y29uZmlnLmtleS84KXRocm93IG5ldyBUeXBlRXJyb3IoImludmFsaWQga2V5IGxlbmd0aCAiK3Bhc3N3b3JkLmxlbmd0aCk7aWYoInN0cmluZyI9PXR5cGVvZiBpdiYmKGl2PUJ1ZmZlci5mcm9tKGl2KSksIkdDTSIhPT1jb25maWcubW9kZSYmaXYubGVuZ3RoIT09Y29uZmlnLml2KXRocm93IG5ldyBUeXBlRXJyb3IoImludmFsaWQgaXYgbGVuZ3RoICIraXYubGVuZ3RoKTtyZXR1cm4ic3RyZWFtIj09PWNvbmZpZy50eXBlP25ldyBTdHJlYW1DaXBoZXIoY29uZmlnLm1vZHVsZSxwYXNzd29yZCxpdik6ImF1dGgiPT09Y29uZmlnLnR5cGU/bmV3IEF1dGhDaXBoZXIoY29uZmlnLm1vZHVsZSxwYXNzd29yZCxpdik6bmV3IENpcGhlcihjb25maWcubW9kdWxlLHBhc3N3b3JkLGl2KX1DaXBoZXIucHJvdG90eXBlLl9maW5hbD1mdW5jdGlvbigpe3ZhciBjaHVuaz10aGlzLl9jYWNoZS5mbHVzaCgpO2lmKHRoaXMuX2F1dG9wYWRkaW5nKXJldHVybiBjaHVuaz10aGlzLl9tb2RlLmVuY3J5cHQodGhpcyxjaHVuayksdGhpcy5fY2lwaGVyLnNjcnViKCksY2h1bms7aWYoIWNodW5rLmVxdWFscyhQQURESU5HKSl0aHJvdyB0aGlzLl9jaXBoZXIuc2NydWIoKSxuZXcgRXJyb3IoImRhdGEgbm90IG11bHRpcGxlIG9mIGJsb2NrIGxlbmd0aCIpfSxDaXBoZXIucHJvdG90eXBlLnNldEF1dG9QYWRkaW5nPWZ1bmN0aW9uKHNldFRvKXtyZXR1cm4gdGhpcy5fYXV0b3BhZGRpbmc9ISFzZXRUbyx0aGlzfSxTcGxpdHRlci5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGRhdGEpe3RoaXMuY2FjaGU9QnVmZmVyLmNvbmNhdChbdGhpcy5jYWNoZSxkYXRhXSl9LFNwbGl0dGVyLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oKXtpZih0aGlzLmNhY2hlLmxlbmd0aD4xNSl7dmFyIG91dD10aGlzLmNhY2hlLnNsaWNlKDAsMTYpO3JldHVybiB0aGlzLmNhY2hlPXRoaXMuY2FjaGUuc2xpY2UoMTYpLG91dH1yZXR1cm4gbnVsbH0sU3BsaXR0ZXIucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7Zm9yKHZhciBsZW49MTYtdGhpcy5jYWNoZS5sZW5ndGgscGFkQnVmZj1CdWZmZXIuYWxsb2NVbnNhZmUobGVuKSxpPS0xOysraTxsZW47KXBhZEJ1ZmYud3JpdGVVSW50OChsZW4saSk7cmV0dXJuIEJ1ZmZlci5jb25jYXQoW3RoaXMuY2FjaGUscGFkQnVmZl0pfSxleHBvcnRzLmNyZWF0ZUNpcGhlcml2PWNyZWF0ZUNpcGhlcml2LGV4cG9ydHMuY3JlYXRlQ2lwaGVyPWZ1bmN0aW9uIGNyZWF0ZUNpcGhlcihzdWl0ZSxwYXNzd29yZCl7dmFyIGNvbmZpZz1NT0RFU1tzdWl0ZS50b0xvd2VyQ2FzZSgpXTtpZighY29uZmlnKXRocm93IG5ldyBUeXBlRXJyb3IoImludmFsaWQgc3VpdGUgdHlwZSIpO3ZhciBrZXlzPWVidGsocGFzc3dvcmQsITEsY29uZmlnLmtleSxjb25maWcuaXYpO3JldHVybiBjcmVhdGVDaXBoZXJpdihzdWl0ZSxrZXlzLmtleSxrZXlzLml2KX19LCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvZ2hhc2guanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7dmFyIEJ1ZmZlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc2FmZS1idWZmZXIvaW5kZXguanMiKS5CdWZmZXIsWkVST0VTPUJ1ZmZlci5hbGxvYygxNiwwKTtmdW5jdGlvbiBmcm9tQXJyYXkob3V0KXt2YXIgYnVmPUJ1ZmZlci5hbGxvY1Vuc2FmZSgxNik7cmV0dXJuIGJ1Zi53cml0ZVVJbnQzMkJFKG91dFswXT4+PjAsMCksYnVmLndyaXRlVUludDMyQkUob3V0WzFdPj4+MCw0KSxidWYud3JpdGVVSW50MzJCRShvdXRbMl0+Pj4wLDgpLGJ1Zi53cml0ZVVJbnQzMkJFKG91dFszXT4+PjAsMTIpLGJ1Zn1mdW5jdGlvbiBHSEFTSChrZXkpe3RoaXMuaD1rZXksdGhpcy5zdGF0ZT1CdWZmZXIuYWxsb2MoMTYsMCksdGhpcy5jYWNoZT1CdWZmZXIuYWxsb2NVbnNhZmUoMCl9R0hBU0gucHJvdG90eXBlLmdoYXNoPWZ1bmN0aW9uKGJsb2NrKXtmb3IodmFyIGk9LTE7KytpPGJsb2NrLmxlbmd0aDspdGhpcy5zdGF0ZVtpXV49YmxvY2tbaV07dGhpcy5fbXVsdGlwbHkoKX0sR0hBU0gucHJvdG90eXBlLl9tdWx0aXBseT1mdW5jdGlvbigpe2Zvcih2YXIgaixsc2JWaSxWaT1mdW5jdGlvbiB0b0FycmF5KGJ1Zil7cmV0dXJuW2J1Zi5yZWFkVUludDMyQkUoMCksYnVmLnJlYWRVSW50MzJCRSg0KSxidWYucmVhZFVJbnQzMkJFKDgpLGJ1Zi5yZWFkVUludDMyQkUoMTIpXX0odGhpcy5oKSxaaT1bMCwwLDAsMF0saT0tMTsrK2k8MTI4Oyl7Zm9yKCEhKHRoaXMuc3RhdGVbfn4oaS84KV0mMTw8Ny1pJTgpJiYoWmlbMF1ePVZpWzBdLFppWzFdXj1WaVsxXSxaaVsyXV49VmlbMl0sWmlbM11ePVZpWzNdKSxsc2JWaT0hISgxJlZpWzNdKSxqPTM7aj4wO2otLSlWaVtqXT1WaVtqXT4+PjF8KDEmVmlbai0xXSk8PDMxO1ZpWzBdPVZpWzBdPj4+MSxsc2JWaSYmKFZpWzBdPVZpWzBdXjIyNTw8MjQpfXRoaXMuc3RhdGU9ZnJvbUFycmF5KFppKX0sR0hBU0gucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihidWYpe3ZhciBjaHVuaztmb3IodGhpcy5jYWNoZT1CdWZmZXIuY29uY2F0KFt0aGlzLmNhY2hlLGJ1Zl0pO3RoaXMuY2FjaGUubGVuZ3RoPj0xNjspY2h1bms9dGhpcy5jYWNoZS5zbGljZSgwLDE2KSx0aGlzLmNhY2hlPXRoaXMuY2FjaGUuc2xpY2UoMTYpLHRoaXMuZ2hhc2goY2h1bmspfSxHSEFTSC5wcm90b3R5cGUuZmluYWw9ZnVuY3Rpb24oYWJsLGJsKXtyZXR1cm4gdGhpcy5jYWNoZS5sZW5ndGgmJnRoaXMuZ2hhc2goQnVmZmVyLmNvbmNhdChbdGhpcy5jYWNoZSxaRVJPRVNdLDE2KSksdGhpcy5naGFzaChmcm9tQXJyYXkoWzAsYWJsLDAsYmxdKSksdGhpcy5zdGF0ZX0sbW9kdWxlLmV4cG9ydHM9R0hBU0h9LCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvaW5jcjMyLmpzIihtb2R1bGUpe21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uIGluY3IzMihpdil7Zm9yKHZhciBpdGVtLGxlbj1pdi5sZW5ndGg7bGVuLS07KXtpZigyNTUhPT0oaXRlbT1pdi5yZWFkVUludDgobGVuKSkpe2l0ZW0rKyxpdi53cml0ZVVJbnQ4KGl0ZW0sbGVuKTticmVha31pdi53cml0ZVVJbnQ4KDAsbGVuKX19fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL21vZGVzL2NiYy5qcyIoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXt2YXIgeG9yPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9idWZmZXIteG9yL2luZGV4LmpzIik7ZXhwb3J0cy5lbmNyeXB0PWZ1bmN0aW9uKHNlbGYsYmxvY2spe3ZhciBkYXRhPXhvcihibG9jayxzZWxmLl9wcmV2KTtyZXR1cm4gc2VsZi5fcHJldj1zZWxmLl9jaXBoZXIuZW5jcnlwdEJsb2NrKGRhdGEpLHNlbGYuX3ByZXZ9LGV4cG9ydHMuZGVjcnlwdD1mdW5jdGlvbihzZWxmLGJsb2NrKXt2YXIgcGFkPXNlbGYuX3ByZXY7c2VsZi5fcHJldj1ibG9jazt2YXIgb3V0PXNlbGYuX2NpcGhlci5kZWNyeXB0QmxvY2soYmxvY2spO3JldHVybiB4b3Iob3V0LHBhZCl9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL21vZGVzL2NmYi5qcyIoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXt2YXIgQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcyIpLkJ1ZmZlcix4b3I9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2J1ZmZlci14b3IvaW5kZXguanMiKTtmdW5jdGlvbiBlbmNyeXB0U3RhcnQoc2VsZixkYXRhLGRlY3J5cHQpe3ZhciBsZW49ZGF0YS5sZW5ndGgsb3V0PXhvcihkYXRhLHNlbGYuX2NhY2hlKTtyZXR1cm4gc2VsZi5fY2FjaGU9c2VsZi5fY2FjaGUuc2xpY2UobGVuKSxzZWxmLl9wcmV2PUJ1ZmZlci5jb25jYXQoW3NlbGYuX3ByZXYsZGVjcnlwdD9kYXRhOm91dF0pLG91dH1leHBvcnRzLmVuY3J5cHQ9ZnVuY3Rpb24oc2VsZixkYXRhLGRlY3J5cHQpe2Zvcih2YXIgbGVuLG91dD1CdWZmZXIuYWxsb2NVbnNhZmUoMCk7ZGF0YS5sZW5ndGg7KXtpZigwPT09c2VsZi5fY2FjaGUubGVuZ3RoJiYoc2VsZi5fY2FjaGU9c2VsZi5fY2lwaGVyLmVuY3J5cHRCbG9jayhzZWxmLl9wcmV2KSxzZWxmLl9wcmV2PUJ1ZmZlci5hbGxvY1Vuc2FmZSgwKSksIShzZWxmLl9jYWNoZS5sZW5ndGg8PWRhdGEubGVuZ3RoKSl7b3V0PUJ1ZmZlci5jb25jYXQoW291dCxlbmNyeXB0U3RhcnQoc2VsZixkYXRhLGRlY3J5cHQpXSk7YnJlYWt9bGVuPXNlbGYuX2NhY2hlLmxlbmd0aCxvdXQ9QnVmZmVyLmNvbmNhdChbb3V0LGVuY3J5cHRTdGFydChzZWxmLGRhdGEuc2xpY2UoMCxsZW4pLGRlY3J5cHQpXSksZGF0YT1kYXRhLnNsaWNlKGxlbil9cmV0dXJuIG91dH19LCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvbW9kZXMvY2ZiMS5qcyIoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXt2YXIgQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcyIpLkJ1ZmZlcjtmdW5jdGlvbiBlbmNyeXB0Qnl0ZShzZWxmLGJ5dGVQYXJhbSxkZWNyeXB0KXtmb3IodmFyIGJpdCx2YWx1ZSxpPS0xLG91dD0wOysraTw4OyliaXQ9Ynl0ZVBhcmFtJjE8PDctaT8xMjg6MCxvdXQrPSgxMjgmKHZhbHVlPXNlbGYuX2NpcGhlci5lbmNyeXB0QmxvY2soc2VsZi5fcHJldilbMF1eYml0KSk+PmklOCxzZWxmLl9wcmV2PXNoaWZ0SW4oc2VsZi5fcHJldixkZWNyeXB0P2JpdDp2YWx1ZSk7cmV0dXJuIG91dH1mdW5jdGlvbiBzaGlmdEluKGJ1ZmZlcix2YWx1ZSl7dmFyIGxlbj1idWZmZXIubGVuZ3RoLGk9LTEsb3V0PUJ1ZmZlci5hbGxvY1Vuc2FmZShidWZmZXIubGVuZ3RoKTtmb3IoYnVmZmVyPUJ1ZmZlci5jb25jYXQoW2J1ZmZlcixCdWZmZXIuZnJvbShbdmFsdWVdKV0pOysraTxsZW47KW91dFtpXT1idWZmZXJbaV08PDF8YnVmZmVyW2krMV0+Pjc7cmV0dXJuIG91dH1leHBvcnRzLmVuY3J5cHQ9ZnVuY3Rpb24oc2VsZixjaHVuayxkZWNyeXB0KXtmb3IodmFyIGxlbj1jaHVuay5sZW5ndGgsb3V0PUJ1ZmZlci5hbGxvY1Vuc2FmZShsZW4pLGk9LTE7KytpPGxlbjspb3V0W2ldPWVuY3J5cHRCeXRlKHNlbGYsY2h1bmtbaV0sZGVjcnlwdCk7cmV0dXJuIG91dH19LCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvbW9kZXMvY2ZiOC5qcyIoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXt2YXIgQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcyIpLkJ1ZmZlcjtmdW5jdGlvbiBlbmNyeXB0Qnl0ZShzZWxmLGJ5dGVQYXJhbSxkZWNyeXB0KXt2YXIgb3V0PXNlbGYuX2NpcGhlci5lbmNyeXB0QmxvY2soc2VsZi5fcHJldilbMF1eYnl0ZVBhcmFtO3JldHVybiBzZWxmLl9wcmV2PUJ1ZmZlci5jb25jYXQoW3NlbGYuX3ByZXYuc2xpY2UoMSksQnVmZmVyLmZyb20oW2RlY3J5cHQ/Ynl0ZVBhcmFtOm91dF0pXSksb3V0fWV4cG9ydHMuZW5jcnlwdD1mdW5jdGlvbihzZWxmLGNodW5rLGRlY3J5cHQpe2Zvcih2YXIgbGVuPWNodW5rLmxlbmd0aCxvdXQ9QnVmZmVyLmFsbG9jVW5zYWZlKGxlbiksaT0tMTsrK2k8bGVuOylvdXRbaV09ZW5jcnlwdEJ5dGUoc2VsZixjaHVua1tpXSxkZWNyeXB0KTtyZXR1cm4gb3V0fX0sIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9tb2Rlcy9jdHIuanMiKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7dmFyIHhvcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnVmZmVyLXhvci9pbmRleC5qcyIpLEJ1ZmZlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc2FmZS1idWZmZXIvaW5kZXguanMiKS5CdWZmZXIsaW5jcjMyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9pbmNyMzIuanMiKTtmdW5jdGlvbiBnZXRCbG9jayhzZWxmKXt2YXIgb3V0PXNlbGYuX2NpcGhlci5lbmNyeXB0QmxvY2tSYXcoc2VsZi5fcHJldik7cmV0dXJuIGluY3IzMihzZWxmLl9wcmV2KSxvdXR9ZXhwb3J0cy5lbmNyeXB0PWZ1bmN0aW9uKHNlbGYsY2h1bmspe3ZhciBjaHVua051bT1NYXRoLmNlaWwoY2h1bmsubGVuZ3RoLzE2KSxzdGFydD1zZWxmLl9jYWNoZS5sZW5ndGg7c2VsZi5fY2FjaGU9QnVmZmVyLmNvbmNhdChbc2VsZi5fY2FjaGUsQnVmZmVyLmFsbG9jVW5zYWZlKDE2KmNodW5rTnVtKV0pO2Zvcih2YXIgaT0wO2k8Y2h1bmtOdW07aSsrKXt2YXIgb3V0PWdldEJsb2NrKHNlbGYpLG9mZnNldD1zdGFydCsxNippO3NlbGYuX2NhY2hlLndyaXRlVUludDMyQkUob3V0WzBdLG9mZnNldCswKSxzZWxmLl9jYWNoZS53cml0ZVVJbnQzMkJFKG91dFsxXSxvZmZzZXQrNCksc2VsZi5fY2FjaGUud3JpdGVVSW50MzJCRShvdXRbMl0sb2Zmc2V0KzgpLHNlbGYuX2NhY2hlLndyaXRlVUludDMyQkUob3V0WzNdLG9mZnNldCsxMil9dmFyIHBhZD1zZWxmLl9jYWNoZS5zbGljZSgwLGNodW5rLmxlbmd0aCk7cmV0dXJuIHNlbGYuX2NhY2hlPXNlbGYuX2NhY2hlLnNsaWNlKGNodW5rLmxlbmd0aCkseG9yKGNodW5rLHBhZCl9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL21vZGVzL2VjYi5qcyIoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyl7ZXhwb3J0cy5lbmNyeXB0PWZ1bmN0aW9uKHNlbGYsYmxvY2spe3JldHVybiBzZWxmLl9jaXBoZXIuZW5jcnlwdEJsb2NrKGJsb2NrKX0sZXhwb3J0cy5kZWNyeXB0PWZ1bmN0aW9uKHNlbGYsYmxvY2spe3JldHVybiBzZWxmLl9jaXBoZXIuZGVjcnlwdEJsb2NrKGJsb2NrKX19LCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvbW9kZXMvaW5kZXguanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7dmFyIG1vZGVNb2R1bGVzPXtFQ0I6X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL21vZGVzL2VjYi5qcyIpLENCQzpfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvbW9kZXMvY2JjLmpzIiksQ0ZCOl9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9tb2Rlcy9jZmIuanMiKSxDRkI4Ol9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9tb2Rlcy9jZmI4LmpzIiksQ0ZCMTpfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvbW9kZXMvY2ZiMS5qcyIpLE9GQjpfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvbW9kZXMvb2ZiLmpzIiksQ1RSOl9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9tb2Rlcy9jdHIuanMiKSxHQ006X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL21vZGVzL2N0ci5qcyIpfSxtb2Rlcz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvbW9kZXMvbGlzdC5qc29uIik7Zm9yKHZhciBrZXkgaW4gbW9kZXMpbW9kZXNba2V5XS5tb2R1bGU9bW9kZU1vZHVsZXNbbW9kZXNba2V5XS5tb2RlXTttb2R1bGUuZXhwb3J0cz1tb2Rlc30sIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9tb2Rlcy9vZmIuanMiKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7dmFyIEJ1ZmZlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzIikseG9yPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9idWZmZXIteG9yL2luZGV4LmpzIik7ZnVuY3Rpb24gZ2V0QmxvY2soc2VsZil7cmV0dXJuIHNlbGYuX3ByZXY9c2VsZi5fY2lwaGVyLmVuY3J5cHRCbG9jayhzZWxmLl9wcmV2KSxzZWxmLl9wcmV2fWV4cG9ydHMuZW5jcnlwdD1mdW5jdGlvbihzZWxmLGNodW5rKXtmb3IoO3NlbGYuX2NhY2hlLmxlbmd0aDxjaHVuay5sZW5ndGg7KXNlbGYuX2NhY2hlPUJ1ZmZlci5jb25jYXQoW3NlbGYuX2NhY2hlLGdldEJsb2NrKHNlbGYpXSk7dmFyIHBhZD1zZWxmLl9jYWNoZS5zbGljZSgwLGNodW5rLmxlbmd0aCk7cmV0dXJuIHNlbGYuX2NhY2hlPXNlbGYuX2NhY2hlLnNsaWNlKGNodW5rLmxlbmd0aCkseG9yKGNodW5rLHBhZCl9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL3N0cmVhbUNpcGhlci5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXt2YXIgYWVzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9hZXMuanMiKSxCdWZmZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3NhZmUtYnVmZmVyL2luZGV4LmpzIikuQnVmZmVyLFRyYW5zZm9ybT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvY2lwaGVyLWJhc2UvaW5kZXguanMiKTtmdW5jdGlvbiBTdHJlYW1DaXBoZXIobW9kZSxrZXksaXYsZGVjcnlwdCl7VHJhbnNmb3JtLmNhbGwodGhpcyksdGhpcy5fY2lwaGVyPW5ldyBhZXMuQUVTKGtleSksdGhpcy5fcHJldj1CdWZmZXIuZnJvbShpdiksdGhpcy5fY2FjaGU9QnVmZmVyLmFsbG9jVW5zYWZlKDApLHRoaXMuX3NlY0NhY2hlPUJ1ZmZlci5hbGxvY1Vuc2FmZSgwKSx0aGlzLl9kZWNyeXB0PWRlY3J5cHQsdGhpcy5fbW9kZT1tb2RlfV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIikoU3RyZWFtQ2lwaGVyLFRyYW5zZm9ybSksU3RyZWFtQ2lwaGVyLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKGNodW5rKXtyZXR1cm4gdGhpcy5fbW9kZS5lbmNyeXB0KHRoaXMsY2h1bmssdGhpcy5fZGVjcnlwdCl9LFN0cmVhbUNpcGhlci5wcm90b3R5cGUuX2ZpbmFsPWZ1bmN0aW9uKCl7dGhpcy5fY2lwaGVyLnNjcnViKCl9LG1vZHVsZS5leHBvcnRzPVN0cmVhbUNpcGhlcn0sIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWNpcGhlci9icm93c2VyLmpzIihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pe3ZhciBERVM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktZGVzL2luZGV4LmpzIiksYWVzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9icm93c2VyLmpzIiksYWVzTW9kZXM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL21vZGVzL2luZGV4LmpzIiksZGVzTW9kZXM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktZGVzL21vZGVzLmpzIiksZWJ0az1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZXZwX2J5dGVzdG9rZXkvaW5kZXguanMiKTtmdW5jdGlvbiBjcmVhdGVDaXBoZXJpdihzdWl0ZSxrZXksaXYpe2lmKHN1aXRlPXN1aXRlLnRvTG93ZXJDYXNlKCksYWVzTW9kZXNbc3VpdGVdKXJldHVybiBhZXMuY3JlYXRlQ2lwaGVyaXYoc3VpdGUsa2V5LGl2KTtpZihkZXNNb2Rlc1tzdWl0ZV0pcmV0dXJuIG5ldyBERVMoe2tleSxpdixtb2RlOnN1aXRlfSk7dGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBzdWl0ZSB0eXBlIil9ZnVuY3Rpb24gY3JlYXRlRGVjaXBoZXJpdihzdWl0ZSxrZXksaXYpe2lmKHN1aXRlPXN1aXRlLnRvTG93ZXJDYXNlKCksYWVzTW9kZXNbc3VpdGVdKXJldHVybiBhZXMuY3JlYXRlRGVjaXBoZXJpdihzdWl0ZSxrZXksaXYpO2lmKGRlc01vZGVzW3N1aXRlXSlyZXR1cm4gbmV3IERFUyh7a2V5LGl2LG1vZGU6c3VpdGUsZGVjcnlwdDohMH0pO3Rocm93IG5ldyBUeXBlRXJyb3IoImludmFsaWQgc3VpdGUgdHlwZSIpfWV4cG9ydHMuY3JlYXRlQ2lwaGVyPWV4cG9ydHMuQ2lwaGVyPWZ1bmN0aW9uIGNyZWF0ZUNpcGhlcihzdWl0ZSxwYXNzd29yZCl7dmFyIGtleUxlbixpdkxlbjtpZihzdWl0ZT1zdWl0ZS50b0xvd2VyQ2FzZSgpLGFlc01vZGVzW3N1aXRlXSlrZXlMZW49YWVzTW9kZXNbc3VpdGVdLmtleSxpdkxlbj1hZXNNb2Rlc1tzdWl0ZV0uaXY7ZWxzZXtpZighZGVzTW9kZXNbc3VpdGVdKXRocm93IG5ldyBUeXBlRXJyb3IoImludmFsaWQgc3VpdGUgdHlwZSIpO2tleUxlbj04KmRlc01vZGVzW3N1aXRlXS5rZXksaXZMZW49ZGVzTW9kZXNbc3VpdGVdLml2fXZhciBrZXlzPWVidGsocGFzc3dvcmQsITEsa2V5TGVuLGl2TGVuKTtyZXR1cm4gY3JlYXRlQ2lwaGVyaXYoc3VpdGUsa2V5cy5rZXksa2V5cy5pdil9LGV4cG9ydHMuY3JlYXRlQ2lwaGVyaXY9ZXhwb3J0cy5DaXBoZXJpdj1jcmVhdGVDaXBoZXJpdixleHBvcnRzLmNyZWF0ZURlY2lwaGVyPWV4cG9ydHMuRGVjaXBoZXI9ZnVuY3Rpb24gY3JlYXRlRGVjaXBoZXIoc3VpdGUscGFzc3dvcmQpe3ZhciBrZXlMZW4saXZMZW47aWYoc3VpdGU9c3VpdGUudG9Mb3dlckNhc2UoKSxhZXNNb2Rlc1tzdWl0ZV0pa2V5TGVuPWFlc01vZGVzW3N1aXRlXS5rZXksaXZMZW49YWVzTW9kZXNbc3VpdGVdLml2O2Vsc2V7aWYoIWRlc01vZGVzW3N1aXRlXSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnZhbGlkIHN1aXRlIHR5cGUiKTtrZXlMZW49OCpkZXNNb2Rlc1tzdWl0ZV0ua2V5LGl2TGVuPWRlc01vZGVzW3N1aXRlXS5pdn12YXIga2V5cz1lYnRrKHBhc3N3b3JkLCExLGtleUxlbixpdkxlbik7cmV0dXJuIGNyZWF0ZURlY2lwaGVyaXYoc3VpdGUsa2V5cy5rZXksa2V5cy5pdil9LGV4cG9ydHMuY3JlYXRlRGVjaXBoZXJpdj1leHBvcnRzLkRlY2lwaGVyaXY9Y3JlYXRlRGVjaXBoZXJpdixleHBvcnRzLmxpc3RDaXBoZXJzPWV4cG9ydHMuZ2V0Q2lwaGVycz1mdW5jdGlvbiBnZXRDaXBoZXJzKCl7cmV0dXJuIE9iamVjdC5rZXlzKGRlc01vZGVzKS5jb25jYXQoYWVzLmdldENpcGhlcnMoKSl9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktZGVzL2luZGV4LmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pe3ZhciBDaXBoZXJCYXNlPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9jaXBoZXItYmFzZS9pbmRleC5qcyIpLGRlcz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZGVzLmpzL2xpYi9kZXMuanMiKSxpbmhlcml0cz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIpLEJ1ZmZlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc2FmZS1idWZmZXIvaW5kZXguanMiKS5CdWZmZXIsbW9kZXM9eyJkZXMtZWRlMy1jYmMiOmRlcy5DQkMuaW5zdGFudGlhdGUoZGVzLkVERSksImRlcy1lZGUzIjpkZXMuRURFLCJkZXMtZWRlLWNiYyI6ZGVzLkNCQy5pbnN0YW50aWF0ZShkZXMuRURFKSwiZGVzLWVkZSI6ZGVzLkVERSwiZGVzLWNiYyI6ZGVzLkNCQy5pbnN0YW50aWF0ZShkZXMuREVTKSwiZGVzLWVjYiI6ZGVzLkRFU307ZnVuY3Rpb24gREVTKG9wdHMpe0NpcGhlckJhc2UuY2FsbCh0aGlzKTt2YXIgdHlwZSxtb2RlTmFtZT1vcHRzLm1vZGUudG9Mb3dlckNhc2UoKSxtb2RlPW1vZGVzW21vZGVOYW1lXTt0eXBlPW9wdHMuZGVjcnlwdD8iZGVjcnlwdCI6ImVuY3J5cHQiO3ZhciBrZXk9b3B0cy5rZXk7QnVmZmVyLmlzQnVmZmVyKGtleSl8fChrZXk9QnVmZmVyLmZyb20oa2V5KSksImRlcy1lZGUiIT09bW9kZU5hbWUmJiJkZXMtZWRlLWNiYyIhPT1tb2RlTmFtZXx8KGtleT1CdWZmZXIuY29uY2F0KFtrZXksa2V5LnNsaWNlKDAsOCldKSk7dmFyIGl2PW9wdHMuaXY7QnVmZmVyLmlzQnVmZmVyKGl2KXx8KGl2PUJ1ZmZlci5mcm9tKGl2KSksdGhpcy5fZGVzPW1vZGUuY3JlYXRlKHtrZXksaXYsdHlwZX0pfW1vZGVzLmRlcz1tb2Rlc1siZGVzLWNiYyJdLG1vZGVzLmRlczM9bW9kZXNbImRlcy1lZGUzLWNiYyJdLG1vZHVsZS5leHBvcnRzPURFUyxpbmhlcml0cyhERVMsQ2lwaGVyQmFzZSksREVTLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKGRhdGEpe3JldHVybiBCdWZmZXIuZnJvbSh0aGlzLl9kZXMudXBkYXRlKGRhdGEpKX0sREVTLnByb3RvdHlwZS5fZmluYWw9ZnVuY3Rpb24oKXtyZXR1cm4gQnVmZmVyLmZyb20odGhpcy5fZGVzLmZpbmFsKCkpfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWRlcy9tb2Rlcy5qcyIoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyl7ZXhwb3J0c1siZGVzLWVjYiJdPXtrZXk6OCxpdjowfSxleHBvcnRzWyJkZXMtY2JjIl09ZXhwb3J0cy5kZXM9e2tleTo4LGl2Ojh9LGV4cG9ydHNbImRlcy1lZGUzLWNiYyJdPWV4cG9ydHMuZGVzMz17a2V5OjI0LGl2Ojh9LGV4cG9ydHNbImRlcy1lZGUzIl09e2tleToyNCxpdjowfSxleHBvcnRzWyJkZXMtZWRlLWNiYyJdPXtrZXk6MTYsaXY6OH0sZXhwb3J0c1siZGVzLWVkZSJdPXtrZXk6MTYsaXY6MH19LCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1yc2EvaW5kZXguanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBCTj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1yc2Evbm9kZV9tb2R1bGVzL2JuLmpzL2xpYi9ibi5qcyIpLHJhbmRvbUJ5dGVzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9yYW5kb21ieXRlcy9icm93c2VyLmpzIiksQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcyIpLkJ1ZmZlcjtmdW5jdGlvbiBnZXRyKHByaXYpe3ZhciByLGxlbj1wcml2Lm1vZHVsdXMuYnl0ZUxlbmd0aCgpO2Rve3I9bmV3IEJOKHJhbmRvbUJ5dGVzKGxlbikpfXdoaWxlKHIuY21wKHByaXYubW9kdWx1cyk+PTB8fCFyLnVtb2QocHJpdi5wcmltZTEpfHwhci51bW9kKHByaXYucHJpbWUyKSk7cmV0dXJuIHJ9ZnVuY3Rpb24gY3J0KG1zZyxwcml2KXt2YXIgYmxpbmRzPWZ1bmN0aW9uIGJsaW5kKHByaXYpe3ZhciByPWdldHIocHJpdik7cmV0dXJue2JsaW5kZXI6ci50b1JlZChCTi5tb250KHByaXYubW9kdWx1cykpLnJlZFBvdyhuZXcgQk4ocHJpdi5wdWJsaWNFeHBvbmVudCkpLmZyb21SZWQoKSx1bmJsaW5kZXI6ci5pbnZtKHByaXYubW9kdWx1cyl9fShwcml2KSxsZW49cHJpdi5tb2R1bHVzLmJ5dGVMZW5ndGgoKSxibGluZGVkPW5ldyBCTihtc2cpLm11bChibGluZHMuYmxpbmRlcikudW1vZChwcml2Lm1vZHVsdXMpLGMxPWJsaW5kZWQudG9SZWQoQk4ubW9udChwcml2LnByaW1lMSkpLGMyPWJsaW5kZWQudG9SZWQoQk4ubW9udChwcml2LnByaW1lMikpLHFpbnY9cHJpdi5jb2VmZmljaWVudCxwPXByaXYucHJpbWUxLHE9cHJpdi5wcmltZTIsbTE9YzEucmVkUG93KHByaXYuZXhwb25lbnQxKS5mcm9tUmVkKCksbTI9YzIucmVkUG93KHByaXYuZXhwb25lbnQyKS5mcm9tUmVkKCksaD1tMS5pc3ViKG0yKS5pbXVsKHFpbnYpLnVtb2QocCkuaW11bChxKTtyZXR1cm4gbTIuaWFkZChoKS5pbXVsKGJsaW5kcy51bmJsaW5kZXIpLnVtb2QocHJpdi5tb2R1bHVzKS50b0FycmF5TGlrZShCdWZmZXIsImJlIixsZW4pfWNydC5nZXRyPWdldHIsbW9kdWxlLmV4cG9ydHM9Y3J0fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktcnNhL25vZGVfbW9kdWxlcy9ibi5qcy9saWIvYm4uanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7IWZ1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYXNzZXJ0KHZhbCxtc2cpe2lmKCF2YWwpdGhyb3cgbmV3IEVycm9yKG1zZ3x8IkFzc2VydGlvbiBmYWlsZWQiKX1mdW5jdGlvbiBpbmhlcml0cyhjdG9yLHN1cGVyQ3Rvcil7Y3Rvci5zdXBlcl89c3VwZXJDdG9yO3ZhciBUZW1wQ3Rvcj1mdW5jdGlvbigpe307VGVtcEN0b3IucHJvdG90eXBlPXN1cGVyQ3Rvci5wcm90b3R5cGUsY3Rvci5wcm90b3R5cGU9bmV3IFRlbXBDdG9yLGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yPWN0b3J9ZnVuY3Rpb24gQk4obnVtYmVyLGJhc2UsZW5kaWFuKXtpZihCTi5pc0JOKG51bWJlcikpcmV0dXJuIG51bWJlcjt0aGlzLm5lZ2F0aXZlPTAsdGhpcy53b3Jkcz1udWxsLHRoaXMubGVuZ3RoPTAsdGhpcy5yZWQ9bnVsbCxudWxsIT09bnVtYmVyJiYoImxlIiE9PWJhc2UmJiJiZSIhPT1iYXNlfHwoZW5kaWFuPWJhc2UsYmFzZT0xMCksdGhpcy5faW5pdChudW1iZXJ8fDAsYmFzZXx8MTAsZW5kaWFufHwiYmUiKSl9dmFyIEJ1ZmZlcjsib2JqZWN0Ij09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1CTjpleHBvcnRzLkJOPUJOLEJOLkJOPUJOLEJOLndvcmRTaXplPTI2O3RyeXtCdWZmZXI9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJnZvaWQgMCE9PXdpbmRvdy5CdWZmZXI/d2luZG93LkJ1ZmZlcjpfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzIikuQnVmZmVyfWNhdGNoKGUpe31mdW5jdGlvbiBwYXJzZUhleDRCaXRzKHN0cmluZyxpbmRleCl7dmFyIGM9c3RyaW5nLmNoYXJDb2RlQXQoaW5kZXgpO3JldHVybiBjPj00OCYmYzw9NTc/Yy00ODpjPj02NSYmYzw9NzA/Yy01NTpjPj05NyYmYzw9MTAyP2MtODc6dm9pZCBhc3NlcnQoITEsIkludmFsaWQgY2hhcmFjdGVyIGluICIrc3RyaW5nKX1mdW5jdGlvbiBwYXJzZUhleEJ5dGUoc3RyaW5nLGxvd2VyQm91bmQsaW5kZXgpe3ZhciByPXBhcnNlSGV4NEJpdHMoc3RyaW5nLGluZGV4KTtyZXR1cm4gaW5kZXgtMT49bG93ZXJCb3VuZCYmKHJ8PXBhcnNlSGV4NEJpdHMoc3RyaW5nLGluZGV4LTEpPDw0KSxyfWZ1bmN0aW9uIHBhcnNlQmFzZShzdHIsc3RhcnQsZW5kLG11bCl7Zm9yKHZhciByPTAsYj0wLGxlbj1NYXRoLm1pbihzdHIubGVuZ3RoLGVuZCksaT1zdGFydDtpPGxlbjtpKyspe3ZhciBjPXN0ci5jaGFyQ29kZUF0KGkpLTQ4O3IqPW11bCxiPWM+PTQ5P2MtNDkrMTA6Yz49MTc/Yy0xNysxMDpjLGFzc2VydChjPj0wJiZiPG11bCwiSW52YWxpZCBjaGFyYWN0ZXIiKSxyKz1ifXJldHVybiByfWZ1bmN0aW9uIG1vdmUoZGVzdCxzcmMpe2Rlc3Qud29yZHM9c3JjLndvcmRzLGRlc3QubGVuZ3RoPXNyYy5sZW5ndGgsZGVzdC5uZWdhdGl2ZT1zcmMubmVnYXRpdmUsZGVzdC5yZWQ9c3JjLnJlZH1pZihCTi5pc0JOPWZ1bmN0aW9uIGlzQk4obnVtKXtyZXR1cm4gbnVtIGluc3RhbmNlb2YgQk58fG51bGwhPT1udW0mJiJvYmplY3QiPT10eXBlb2YgbnVtJiZudW0uY29uc3RydWN0b3Iud29yZFNpemU9PT1CTi53b3JkU2l6ZSYmQXJyYXkuaXNBcnJheShudW0ud29yZHMpfSxCTi5tYXg9ZnVuY3Rpb24gbWF4KGxlZnQscmlnaHQpe3JldHVybiBsZWZ0LmNtcChyaWdodCk+MD9sZWZ0OnJpZ2h0fSxCTi5taW49ZnVuY3Rpb24gbWluKGxlZnQscmlnaHQpe3JldHVybiBsZWZ0LmNtcChyaWdodCk8MD9sZWZ0OnJpZ2h0fSxCTi5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24gaW5pdChudW1iZXIsYmFzZSxlbmRpYW4pe2lmKCJudW1iZXIiPT10eXBlb2YgbnVtYmVyKXJldHVybiB0aGlzLl9pbml0TnVtYmVyKG51bWJlcixiYXNlLGVuZGlhbik7aWYoIm9iamVjdCI9PXR5cGVvZiBudW1iZXIpcmV0dXJuIHRoaXMuX2luaXRBcnJheShudW1iZXIsYmFzZSxlbmRpYW4pOyJoZXgiPT09YmFzZSYmKGJhc2U9MTYpLGFzc2VydChiYXNlPT09KDB8YmFzZSkmJmJhc2U+PTImJmJhc2U8PTM2KTt2YXIgc3RhcnQ9MDsiLSI9PT0obnVtYmVyPW51bWJlci50b1N0cmluZygpLnJlcGxhY2UoL1xzKy9nLCIiKSlbMF0mJihzdGFydCsrLHRoaXMubmVnYXRpdmU9MSksc3RhcnQ8bnVtYmVyLmxlbmd0aCYmKDE2PT09YmFzZT90aGlzLl9wYXJzZUhleChudW1iZXIsc3RhcnQsZW5kaWFuKToodGhpcy5fcGFyc2VCYXNlKG51bWJlcixiYXNlLHN0YXJ0KSwibGUiPT09ZW5kaWFuJiZ0aGlzLl9pbml0QXJyYXkodGhpcy50b0FycmF5KCksYmFzZSxlbmRpYW4pKSl9LEJOLnByb3RvdHlwZS5faW5pdE51bWJlcj1mdW5jdGlvbiBfaW5pdE51bWJlcihudW1iZXIsYmFzZSxlbmRpYW4pe251bWJlcjwwJiYodGhpcy5uZWdhdGl2ZT0xLG51bWJlcj0tbnVtYmVyKSxudW1iZXI8NjcxMDg4NjQ/KHRoaXMud29yZHM9WzY3MTA4ODYzJm51bWJlcl0sdGhpcy5sZW5ndGg9MSk6bnVtYmVyPDQ1MDM1OTk2MjczNzA0OTY/KHRoaXMud29yZHM9WzY3MTA4ODYzJm51bWJlcixudW1iZXIvNjcxMDg4NjQmNjcxMDg4NjNdLHRoaXMubGVuZ3RoPTIpOihhc3NlcnQobnVtYmVyPDkwMDcxOTkyNTQ3NDA5OTIpLHRoaXMud29yZHM9WzY3MTA4ODYzJm51bWJlcixudW1iZXIvNjcxMDg4NjQmNjcxMDg4NjMsMV0sdGhpcy5sZW5ndGg9MyksImxlIj09PWVuZGlhbiYmdGhpcy5faW5pdEFycmF5KHRoaXMudG9BcnJheSgpLGJhc2UsZW5kaWFuKX0sQk4ucHJvdG90eXBlLl9pbml0QXJyYXk9ZnVuY3Rpb24gX2luaXRBcnJheShudW1iZXIsYmFzZSxlbmRpYW4pe2lmKGFzc2VydCgibnVtYmVyIj09dHlwZW9mIG51bWJlci5sZW5ndGgpLG51bWJlci5sZW5ndGg8PTApcmV0dXJuIHRoaXMud29yZHM9WzBdLHRoaXMubGVuZ3RoPTEsdGhpczt0aGlzLmxlbmd0aD1NYXRoLmNlaWwobnVtYmVyLmxlbmd0aC8zKSx0aGlzLndvcmRzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCk7Zm9yKHZhciBpPTA7aTx0aGlzLmxlbmd0aDtpKyspdGhpcy53b3Jkc1tpXT0wO3ZhciBqLHcsb2ZmPTA7aWYoImJlIj09PWVuZGlhbilmb3IoaT1udW1iZXIubGVuZ3RoLTEsaj0wO2k+PTA7aS09Myl3PW51bWJlcltpXXxudW1iZXJbaS0xXTw8OHxudW1iZXJbaS0yXTw8MTYsdGhpcy53b3Jkc1tqXXw9dzw8b2ZmJjY3MTA4ODYzLHRoaXMud29yZHNbaisxXT13Pj4+MjYtb2ZmJjY3MTA4ODYzLChvZmYrPTI0KT49MjYmJihvZmYtPTI2LGorKyk7ZWxzZSBpZigibGUiPT09ZW5kaWFuKWZvcihpPTAsaj0wO2k8bnVtYmVyLmxlbmd0aDtpKz0zKXc9bnVtYmVyW2ldfG51bWJlcltpKzFdPDw4fG51bWJlcltpKzJdPDwxNix0aGlzLndvcmRzW2pdfD13PDxvZmYmNjcxMDg4NjMsdGhpcy53b3Jkc1tqKzFdPXc+Pj4yNi1vZmYmNjcxMDg4NjMsKG9mZis9MjQpPj0yNiYmKG9mZi09MjYsaisrKTtyZXR1cm4gdGhpcy5fc3RyaXAoKX0sQk4ucHJvdG90eXBlLl9wYXJzZUhleD1mdW5jdGlvbiBfcGFyc2VIZXgobnVtYmVyLHN0YXJ0LGVuZGlhbil7dGhpcy5sZW5ndGg9TWF0aC5jZWlsKChudW1iZXIubGVuZ3RoLXN0YXJ0KS82KSx0aGlzLndvcmRzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCk7Zm9yKHZhciBpPTA7aTx0aGlzLmxlbmd0aDtpKyspdGhpcy53b3Jkc1tpXT0wO3ZhciB3LG9mZj0wLGo9MDtpZigiYmUiPT09ZW5kaWFuKWZvcihpPW51bWJlci5sZW5ndGgtMTtpPj1zdGFydDtpLT0yKXc9cGFyc2VIZXhCeXRlKG51bWJlcixzdGFydCxpKTw8b2ZmLHRoaXMud29yZHNbal18PTY3MTA4ODYzJncsb2ZmPj0xOD8ob2ZmLT0xOCxqKz0xLHRoaXMud29yZHNbal18PXc+Pj4yNik6b2ZmKz04O2Vsc2UgZm9yKGk9KG51bWJlci5sZW5ndGgtc3RhcnQpJTI9PTA/c3RhcnQrMTpzdGFydDtpPG51bWJlci5sZW5ndGg7aSs9Mil3PXBhcnNlSGV4Qnl0ZShudW1iZXIsc3RhcnQsaSk8PG9mZix0aGlzLndvcmRzW2pdfD02NzEwODg2MyZ3LG9mZj49MTg/KG9mZi09MTgsais9MSx0aGlzLndvcmRzW2pdfD13Pj4+MjYpOm9mZis9ODt0aGlzLl9zdHJpcCgpfSxCTi5wcm90b3R5cGUuX3BhcnNlQmFzZT1mdW5jdGlvbiBfcGFyc2VCYXNlKG51bWJlcixiYXNlLHN0YXJ0KXt0aGlzLndvcmRzPVswXSx0aGlzLmxlbmd0aD0xO2Zvcih2YXIgbGltYkxlbj0wLGxpbWJQb3c9MTtsaW1iUG93PD02NzEwODg2MztsaW1iUG93Kj1iYXNlKWxpbWJMZW4rKztsaW1iTGVuLS0sbGltYlBvdz1saW1iUG93L2Jhc2V8MDtmb3IodmFyIHRvdGFsPW51bWJlci5sZW5ndGgtc3RhcnQsbW9kPXRvdGFsJWxpbWJMZW4sZW5kPU1hdGgubWluKHRvdGFsLHRvdGFsLW1vZCkrc3RhcnQsd29yZD0wLGk9c3RhcnQ7aTxlbmQ7aSs9bGltYkxlbil3b3JkPXBhcnNlQmFzZShudW1iZXIsaSxpK2xpbWJMZW4sYmFzZSksdGhpcy5pbXVsbihsaW1iUG93KSx0aGlzLndvcmRzWzBdK3dvcmQ8NjcxMDg4NjQ/dGhpcy53b3Jkc1swXSs9d29yZDp0aGlzLl9pYWRkbih3b3JkKTtpZigwIT09bW9kKXt2YXIgcG93PTE7Zm9yKHdvcmQ9cGFyc2VCYXNlKG51bWJlcixpLG51bWJlci5sZW5ndGgsYmFzZSksaT0wO2k8bW9kO2krKylwb3cqPWJhc2U7dGhpcy5pbXVsbihwb3cpLHRoaXMud29yZHNbMF0rd29yZDw2NzEwODg2ND90aGlzLndvcmRzWzBdKz13b3JkOnRoaXMuX2lhZGRuKHdvcmQpfXRoaXMuX3N0cmlwKCl9LEJOLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uIGNvcHkoZGVzdCl7ZGVzdC53b3Jkcz1uZXcgQXJyYXkodGhpcy5sZW5ndGgpO2Zvcih2YXIgaT0wO2k8dGhpcy5sZW5ndGg7aSsrKWRlc3Qud29yZHNbaV09dGhpcy53b3Jkc1tpXTtkZXN0Lmxlbmd0aD10aGlzLmxlbmd0aCxkZXN0Lm5lZ2F0aXZlPXRoaXMubmVnYXRpdmUsZGVzdC5yZWQ9dGhpcy5yZWR9LEJOLnByb3RvdHlwZS5fbW92ZT1mdW5jdGlvbiBfbW92ZShkZXN0KXttb3ZlKGRlc3QsdGhpcyl9LEJOLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbiBjbG9uZSgpe3ZhciByPW5ldyBCTihudWxsKTtyZXR1cm4gdGhpcy5jb3B5KHIpLHJ9LEJOLnByb3RvdHlwZS5fZXhwYW5kPWZ1bmN0aW9uIF9leHBhbmQoc2l6ZSl7Zm9yKDt0aGlzLmxlbmd0aDxzaXplOyl0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdPTA7cmV0dXJuIHRoaXN9LEJOLnByb3RvdHlwZS5fc3RyaXA9ZnVuY3Rpb24gc3RyaXAoKXtmb3IoO3RoaXMubGVuZ3RoPjEmJjA9PT10aGlzLndvcmRzW3RoaXMubGVuZ3RoLTFdOyl0aGlzLmxlbmd0aC0tO3JldHVybiB0aGlzLl9ub3JtU2lnbigpfSxCTi5wcm90b3R5cGUuX25vcm1TaWduPWZ1bmN0aW9uIF9ub3JtU2lnbigpe3JldHVybiAxPT09dGhpcy5sZW5ndGgmJjA9PT10aGlzLndvcmRzWzBdJiYodGhpcy5uZWdhdGl2ZT0wKSx0aGlzfSwidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbC5mb3IpdHJ5e0JOLnByb3RvdHlwZVtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXT1pbnNwZWN0fWNhdGNoKGUpe0JOLnByb3RvdHlwZS5pbnNwZWN0PWluc3BlY3R9ZWxzZSBCTi5wcm90b3R5cGUuaW5zcGVjdD1pbnNwZWN0O2Z1bmN0aW9uIGluc3BlY3QoKXtyZXR1cm4odGhpcy5yZWQ/IjxCTi1SOiAiOiI8Qk46ICIpK3RoaXMudG9TdHJpbmcoMTYpKyI+In12YXIgemVyb3M9WyIiLCIwIiwiMDAiLCIwMDAiLCIwMDAwIiwiMDAwMDAiLCIwMDAwMDAiLCIwMDAwMDAwIiwiMDAwMDAwMDAiLCIwMDAwMDAwMDAiLCIwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIl0sZ3JvdXBTaXplcz1bMCwwLDI1LDE2LDEyLDExLDEwLDksOCw4LDcsNyw3LDcsNiw2LDYsNiw2LDYsNiw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1XSxncm91cEJhc2VzPVswLDAsMzM1NTQ0MzIsNDMwNDY3MjEsMTY3NzcyMTYsNDg4MjgxMjUsNjA0NjYxNzYsNDAzNTM2MDcsMTY3NzcyMTYsNDMwNDY3MjEsMWU3LDE5NDg3MTcxLDM1ODMxODA4LDYyNzQ4NTE3LDc1Mjk1MzYsMTEzOTA2MjUsMTY3NzcyMTYsMjQxMzc1NjksMzQwMTIyMjQsNDcwNDU4ODEsNjRlNiw0MDg0MTAxLDUxNTM2MzIsNjQzNjM0Myw3OTYyNjI0LDk3NjU2MjUsMTE4ODEzNzYsMTQzNDg5MDcsMTcyMTAzNjgsMjA1MTExNDksMjQzZTUsMjg2MjkxNTEsMzM1NTQ0MzIsMzkxMzUzOTMsNDU0MzU0MjQsNTI1MjE4NzUsNjA0NjYxNzZdO0JOLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbiB0b1N0cmluZyhiYXNlLHBhZGRpbmcpe3ZhciBvdXQ7aWYocGFkZGluZz0wfHBhZGRpbmd8fDEsMTY9PT0oYmFzZT1iYXNlfHwxMCl8fCJoZXgiPT09YmFzZSl7b3V0PSIiO2Zvcih2YXIgb2ZmPTAsY2Fycnk9MCxpPTA7aTx0aGlzLmxlbmd0aDtpKyspe3ZhciB3PXRoaXMud29yZHNbaV0sd29yZD0oMTY3NzcyMTUmKHc8PG9mZnxjYXJyeSkpLnRvU3RyaW5nKDE2KTtjYXJyeT13Pj4+MjQtb2ZmJjE2Nzc3MjE1LChvZmYrPTIpPj0yNiYmKG9mZi09MjYsaS0tKSxvdXQ9MCE9PWNhcnJ5fHxpIT09dGhpcy5sZW5ndGgtMT96ZXJvc1s2LXdvcmQubGVuZ3RoXSt3b3JkK291dDp3b3JkK291dH1mb3IoMCE9PWNhcnJ5JiYob3V0PWNhcnJ5LnRvU3RyaW5nKDE2KStvdXQpO291dC5sZW5ndGglcGFkZGluZyE9PTA7KW91dD0iMCIrb3V0O3JldHVybiAwIT09dGhpcy5uZWdhdGl2ZSYmKG91dD0iLSIrb3V0KSxvdXR9aWYoYmFzZT09PSgwfGJhc2UpJiZiYXNlPj0yJiZiYXNlPD0zNil7dmFyIGdyb3VwU2l6ZT1ncm91cFNpemVzW2Jhc2VdLGdyb3VwQmFzZT1ncm91cEJhc2VzW2Jhc2VdO291dD0iIjt2YXIgYz10aGlzLmNsb25lKCk7Zm9yKGMubmVnYXRpdmU9MDshYy5pc1plcm8oKTspe3ZhciByPWMubW9kcm4oZ3JvdXBCYXNlKS50b1N0cmluZyhiYXNlKTtvdXQ9KGM9Yy5pZGl2bihncm91cEJhc2UpKS5pc1plcm8oKT9yK291dDp6ZXJvc1tncm91cFNpemUtci5sZW5ndGhdK3Irb3V0fWZvcih0aGlzLmlzWmVybygpJiYob3V0PSIwIitvdXQpO291dC5sZW5ndGglcGFkZGluZyE9PTA7KW91dD0iMCIrb3V0O3JldHVybiAwIT09dGhpcy5uZWdhdGl2ZSYmKG91dD0iLSIrb3V0KSxvdXR9YXNzZXJ0KCExLCJCYXNlIHNob3VsZCBiZSBiZXR3ZWVuIDIgYW5kIDM2Iil9LEJOLnByb3RvdHlwZS50b051bWJlcj1mdW5jdGlvbiB0b051bWJlcigpe3ZhciByZXQ9dGhpcy53b3Jkc1swXTtyZXR1cm4gMj09PXRoaXMubGVuZ3RoP3JldCs9NjcxMDg4NjQqdGhpcy53b3Jkc1sxXTozPT09dGhpcy5sZW5ndGgmJjE9PT10aGlzLndvcmRzWzJdP3JldCs9NDUwMzU5OTYyNzM3MDQ5Nis2NzEwODg2NCp0aGlzLndvcmRzWzFdOnRoaXMubGVuZ3RoPjImJmFzc2VydCghMSwiTnVtYmVyIGNhbiBvbmx5IHNhZmVseSBzdG9yZSB1cCB0byA1MyBiaXRzIiksMCE9PXRoaXMubmVnYXRpdmU/LXJldDpyZXR9LEJOLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24gdG9KU09OKCl7cmV0dXJuIHRoaXMudG9TdHJpbmcoMTYsMil9LEJ1ZmZlciYmKEJOLnByb3RvdHlwZS50b0J1ZmZlcj1mdW5jdGlvbiB0b0J1ZmZlcihlbmRpYW4sbGVuZ3RoKXtyZXR1cm4gdGhpcy50b0FycmF5TGlrZShCdWZmZXIsZW5kaWFuLGxlbmd0aCl9KSxCTi5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbiB0b0FycmF5KGVuZGlhbixsZW5ndGgpe3JldHVybiB0aGlzLnRvQXJyYXlMaWtlKEFycmF5LGVuZGlhbixsZW5ndGgpfTtmdW5jdGlvbiBzbWFsbE11bFRvKHNlbGYsbnVtLG91dCl7b3V0Lm5lZ2F0aXZlPW51bS5uZWdhdGl2ZV5zZWxmLm5lZ2F0aXZlO3ZhciBsZW49c2VsZi5sZW5ndGgrbnVtLmxlbmd0aHwwO291dC5sZW5ndGg9bGVuLGxlbj1sZW4tMXwwO3ZhciBhPTB8c2VsZi53b3Jkc1swXSxiPTB8bnVtLndvcmRzWzBdLHI9YSpiLGxvPTY3MTA4ODYzJnIsY2Fycnk9ci82NzEwODg2NHwwO291dC53b3Jkc1swXT1sbztmb3IodmFyIGs9MTtrPGxlbjtrKyspe2Zvcih2YXIgbmNhcnJ5PWNhcnJ5Pj4+MjYscndvcmQ9NjcxMDg4NjMmY2FycnksbWF4Sj1NYXRoLm1pbihrLG51bS5sZW5ndGgtMSksaj1NYXRoLm1heCgwLGstc2VsZi5sZW5ndGgrMSk7ajw9bWF4SjtqKyspe3ZhciBpPWstanwwO25jYXJyeSs9KHI9KGE9MHxzZWxmLndvcmRzW2ldKSooYj0wfG51bS53b3Jkc1tqXSkrcndvcmQpLzY3MTA4ODY0fDAscndvcmQ9NjcxMDg4NjMmcn1vdXQud29yZHNba109MHxyd29yZCxjYXJyeT0wfG5jYXJyeX1yZXR1cm4gMCE9PWNhcnJ5P291dC53b3Jkc1trXT0wfGNhcnJ5Om91dC5sZW5ndGgtLSxvdXQuX3N0cmlwKCl9Qk4ucHJvdG90eXBlLnRvQXJyYXlMaWtlPWZ1bmN0aW9uIHRvQXJyYXlMaWtlKEFycmF5VHlwZSxlbmRpYW4sbGVuZ3RoKXt0aGlzLl9zdHJpcCgpO3ZhciBieXRlTGVuZ3RoPXRoaXMuYnl0ZUxlbmd0aCgpLHJlcUxlbmd0aD1sZW5ndGh8fE1hdGgubWF4KDEsYnl0ZUxlbmd0aCk7YXNzZXJ0KGJ5dGVMZW5ndGg8PXJlcUxlbmd0aCwiYnl0ZSBhcnJheSBsb25nZXIgdGhhbiBkZXNpcmVkIGxlbmd0aCIpLGFzc2VydChyZXFMZW5ndGg+MCwiUmVxdWVzdGVkIGFycmF5IGxlbmd0aCA8PSAwIik7dmFyIHJlcz1mdW5jdGlvbiBhbGxvY2F0ZShBcnJheVR5cGUsc2l6ZSl7cmV0dXJuIEFycmF5VHlwZS5hbGxvY1Vuc2FmZT9BcnJheVR5cGUuYWxsb2NVbnNhZmUoc2l6ZSk6bmV3IEFycmF5VHlwZShzaXplKX0oQXJyYXlUeXBlLHJlcUxlbmd0aCk7cmV0dXJuIHRoaXNbIl90b0FycmF5TGlrZSIrKCJsZSI9PT1lbmRpYW4/IkxFIjoiQkUiKV0ocmVzLGJ5dGVMZW5ndGgpLHJlc30sQk4ucHJvdG90eXBlLl90b0FycmF5TGlrZUxFPWZ1bmN0aW9uIF90b0FycmF5TGlrZUxFKHJlcyxieXRlTGVuZ3RoKXtmb3IodmFyIHBvc2l0aW9uPTAsY2Fycnk9MCxpPTAsc2hpZnQ9MDtpPHRoaXMubGVuZ3RoO2krKyl7dmFyIHdvcmQ9dGhpcy53b3Jkc1tpXTw8c2hpZnR8Y2Fycnk7cmVzW3Bvc2l0aW9uKytdPTI1NSZ3b3JkLHBvc2l0aW9uPHJlcy5sZW5ndGgmJihyZXNbcG9zaXRpb24rK109d29yZD4+OCYyNTUpLHBvc2l0aW9uPHJlcy5sZW5ndGgmJihyZXNbcG9zaXRpb24rK109d29yZD4+MTYmMjU1KSw2PT09c2hpZnQ/KHBvc2l0aW9uPHJlcy5sZW5ndGgmJihyZXNbcG9zaXRpb24rK109d29yZD4+MjQmMjU1KSxjYXJyeT0wLHNoaWZ0PTApOihjYXJyeT13b3JkPj4+MjQsc2hpZnQrPTIpfWlmKHBvc2l0aW9uPHJlcy5sZW5ndGgpZm9yKHJlc1twb3NpdGlvbisrXT1jYXJyeTtwb3NpdGlvbjxyZXMubGVuZ3RoOylyZXNbcG9zaXRpb24rK109MH0sQk4ucHJvdG90eXBlLl90b0FycmF5TGlrZUJFPWZ1bmN0aW9uIF90b0FycmF5TGlrZUJFKHJlcyxieXRlTGVuZ3RoKXtmb3IodmFyIHBvc2l0aW9uPXJlcy5sZW5ndGgtMSxjYXJyeT0wLGk9MCxzaGlmdD0wO2k8dGhpcy5sZW5ndGg7aSsrKXt2YXIgd29yZD10aGlzLndvcmRzW2ldPDxzaGlmdHxjYXJyeTtyZXNbcG9zaXRpb24tLV09MjU1JndvcmQscG9zaXRpb24+PTAmJihyZXNbcG9zaXRpb24tLV09d29yZD4+OCYyNTUpLHBvc2l0aW9uPj0wJiYocmVzW3Bvc2l0aW9uLS1dPXdvcmQ+PjE2JjI1NSksNj09PXNoaWZ0Pyhwb3NpdGlvbj49MCYmKHJlc1twb3NpdGlvbi0tXT13b3JkPj4yNCYyNTUpLGNhcnJ5PTAsc2hpZnQ9MCk6KGNhcnJ5PXdvcmQ+Pj4yNCxzaGlmdCs9Mil9aWYocG9zaXRpb24+PTApZm9yKHJlc1twb3NpdGlvbi0tXT1jYXJyeTtwb3NpdGlvbj49MDspcmVzW3Bvc2l0aW9uLS1dPTB9LE1hdGguY2x6MzI/Qk4ucHJvdG90eXBlLl9jb3VudEJpdHM9ZnVuY3Rpb24gX2NvdW50Qml0cyh3KXtyZXR1cm4gMzItTWF0aC5jbHozMih3KX06Qk4ucHJvdG90eXBlLl9jb3VudEJpdHM9ZnVuY3Rpb24gX2NvdW50Qml0cyh3KXt2YXIgdD13LHI9MDtyZXR1cm4gdD49NDA5NiYmKHIrPTEzLHQ+Pj49MTMpLHQ+PTY0JiYocis9Nyx0Pj4+PTcpLHQ+PTgmJihyKz00LHQ+Pj49NCksdD49MiYmKHIrPTIsdD4+Pj0yKSxyK3R9LEJOLnByb3RvdHlwZS5femVyb0JpdHM9ZnVuY3Rpb24gX3plcm9CaXRzKHcpe2lmKDA9PT13KXJldHVybiAyNjt2YXIgdD13LHI9MDtyZXR1cm4gODE5MSZ0fHwocis9MTMsdD4+Pj0xMyksMTI3JnR8fChyKz03LHQ+Pj49NyksMTUmdHx8KHIrPTQsdD4+Pj00KSwzJnR8fChyKz0yLHQ+Pj49MiksMSZ0fHxyKysscn0sQk4ucHJvdG90eXBlLmJpdExlbmd0aD1mdW5jdGlvbiBiaXRMZW5ndGgoKXt2YXIgdz10aGlzLndvcmRzW3RoaXMubGVuZ3RoLTFdLGhpPXRoaXMuX2NvdW50Qml0cyh3KTtyZXR1cm4gMjYqKHRoaXMubGVuZ3RoLTEpK2hpfSxCTi5wcm90b3R5cGUuemVyb0JpdHM9ZnVuY3Rpb24gemVyb0JpdHMoKXtpZih0aGlzLmlzWmVybygpKXJldHVybiAwO2Zvcih2YXIgcj0wLGk9MDtpPHRoaXMubGVuZ3RoO2krKyl7dmFyIGI9dGhpcy5femVyb0JpdHModGhpcy53b3Jkc1tpXSk7aWYocis9YiwyNiE9PWIpYnJlYWt9cmV0dXJuIHJ9LEJOLnByb3RvdHlwZS5ieXRlTGVuZ3RoPWZ1bmN0aW9uIGJ5dGVMZW5ndGgoKXtyZXR1cm4gTWF0aC5jZWlsKHRoaXMuYml0TGVuZ3RoKCkvOCl9LEJOLnByb3RvdHlwZS50b1R3b3M9ZnVuY3Rpb24gdG9Ud29zKHdpZHRoKXtyZXR1cm4gMCE9PXRoaXMubmVnYXRpdmU/dGhpcy5hYnMoKS5pbm90bih3aWR0aCkuaWFkZG4oMSk6dGhpcy5jbG9uZSgpfSxCTi5wcm90b3R5cGUuZnJvbVR3b3M9ZnVuY3Rpb24gZnJvbVR3b3Mod2lkdGgpe3JldHVybiB0aGlzLnRlc3RuKHdpZHRoLTEpP3RoaXMubm90bih3aWR0aCkuaWFkZG4oMSkuaW5lZygpOnRoaXMuY2xvbmUoKX0sQk4ucHJvdG90eXBlLmlzTmVnPWZ1bmN0aW9uIGlzTmVnKCl7cmV0dXJuIDAhPT10aGlzLm5lZ2F0aXZlfSxCTi5wcm90b3R5cGUubmVnPWZ1bmN0aW9uIG5lZygpe3JldHVybiB0aGlzLmNsb25lKCkuaW5lZygpfSxCTi5wcm90b3R5cGUuaW5lZz1mdW5jdGlvbiBpbmVnKCl7cmV0dXJuIHRoaXMuaXNaZXJvKCl8fCh0aGlzLm5lZ2F0aXZlXj0xKSx0aGlzfSxCTi5wcm90b3R5cGUuaXVvcj1mdW5jdGlvbiBpdW9yKG51bSl7Zm9yKDt0aGlzLmxlbmd0aDxudW0ubGVuZ3RoOyl0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdPTA7Zm9yKHZhciBpPTA7aTxudW0ubGVuZ3RoO2krKyl0aGlzLndvcmRzW2ldPXRoaXMud29yZHNbaV18bnVtLndvcmRzW2ldO3JldHVybiB0aGlzLl9zdHJpcCgpfSxCTi5wcm90b3R5cGUuaW9yPWZ1bmN0aW9uIGlvcihudW0pe3JldHVybiBhc3NlcnQoMD09PSh0aGlzLm5lZ2F0aXZlfG51bS5uZWdhdGl2ZSkpLHRoaXMuaXVvcihudW0pfSxCTi5wcm90b3R5cGUub3I9ZnVuY3Rpb24gb3IobnVtKXtyZXR1cm4gdGhpcy5sZW5ndGg+bnVtLmxlbmd0aD90aGlzLmNsb25lKCkuaW9yKG51bSk6bnVtLmNsb25lKCkuaW9yKHRoaXMpfSxCTi5wcm90b3R5cGUudW9yPWZ1bmN0aW9uIHVvcihudW0pe3JldHVybiB0aGlzLmxlbmd0aD5udW0ubGVuZ3RoP3RoaXMuY2xvbmUoKS5pdW9yKG51bSk6bnVtLmNsb25lKCkuaXVvcih0aGlzKX0sQk4ucHJvdG90eXBlLml1YW5kPWZ1bmN0aW9uIGl1YW5kKG51bSl7dmFyIGI7Yj10aGlzLmxlbmd0aD5udW0ubGVuZ3RoP251bTp0aGlzO2Zvcih2YXIgaT0wO2k8Yi5sZW5ndGg7aSsrKXRoaXMud29yZHNbaV09dGhpcy53b3Jkc1tpXSZudW0ud29yZHNbaV07cmV0dXJuIHRoaXMubGVuZ3RoPWIubGVuZ3RoLHRoaXMuX3N0cmlwKCl9LEJOLnByb3RvdHlwZS5pYW5kPWZ1bmN0aW9uIGlhbmQobnVtKXtyZXR1cm4gYXNzZXJ0KDA9PT0odGhpcy5uZWdhdGl2ZXxudW0ubmVnYXRpdmUpKSx0aGlzLml1YW5kKG51bSl9LEJOLnByb3RvdHlwZS5hbmQ9ZnVuY3Rpb24gYW5kKG51bSl7cmV0dXJuIHRoaXMubGVuZ3RoPm51bS5sZW5ndGg/dGhpcy5jbG9uZSgpLmlhbmQobnVtKTpudW0uY2xvbmUoKS5pYW5kKHRoaXMpfSxCTi5wcm90b3R5cGUudWFuZD1mdW5jdGlvbiB1YW5kKG51bSl7cmV0dXJuIHRoaXMubGVuZ3RoPm51bS5sZW5ndGg/dGhpcy5jbG9uZSgpLml1YW5kKG51bSk6bnVtLmNsb25lKCkuaXVhbmQodGhpcyl9LEJOLnByb3RvdHlwZS5pdXhvcj1mdW5jdGlvbiBpdXhvcihudW0pe3ZhciBhLGI7dGhpcy5sZW5ndGg+bnVtLmxlbmd0aD8oYT10aGlzLGI9bnVtKTooYT1udW0sYj10aGlzKTtmb3IodmFyIGk9MDtpPGIubGVuZ3RoO2krKyl0aGlzLndvcmRzW2ldPWEud29yZHNbaV1eYi53b3Jkc1tpXTtpZih0aGlzIT09YSlmb3IoO2k8YS5sZW5ndGg7aSsrKXRoaXMud29yZHNbaV09YS53b3Jkc1tpXTtyZXR1cm4gdGhpcy5sZW5ndGg9YS5sZW5ndGgsdGhpcy5fc3RyaXAoKX0sQk4ucHJvdG90eXBlLml4b3I9ZnVuY3Rpb24gaXhvcihudW0pe3JldHVybiBhc3NlcnQoMD09PSh0aGlzLm5lZ2F0aXZlfG51bS5uZWdhdGl2ZSkpLHRoaXMuaXV4b3IobnVtKX0sQk4ucHJvdG90eXBlLnhvcj1mdW5jdGlvbiB4b3IobnVtKXtyZXR1cm4gdGhpcy5sZW5ndGg+bnVtLmxlbmd0aD90aGlzLmNsb25lKCkuaXhvcihudW0pOm51bS5jbG9uZSgpLml4b3IodGhpcyl9LEJOLnByb3RvdHlwZS51eG9yPWZ1bmN0aW9uIHV4b3IobnVtKXtyZXR1cm4gdGhpcy5sZW5ndGg+bnVtLmxlbmd0aD90aGlzLmNsb25lKCkuaXV4b3IobnVtKTpudW0uY2xvbmUoKS5pdXhvcih0aGlzKX0sQk4ucHJvdG90eXBlLmlub3RuPWZ1bmN0aW9uIGlub3RuKHdpZHRoKXthc3NlcnQoIm51bWJlciI9PXR5cGVvZiB3aWR0aCYmd2lkdGg+PTApO3ZhciBieXRlc05lZWRlZD0wfE1hdGguY2VpbCh3aWR0aC8yNiksYml0c0xlZnQ9d2lkdGglMjY7dGhpcy5fZXhwYW5kKGJ5dGVzTmVlZGVkKSxiaXRzTGVmdD4wJiZieXRlc05lZWRlZC0tO2Zvcih2YXIgaT0wO2k8Ynl0ZXNOZWVkZWQ7aSsrKXRoaXMud29yZHNbaV09NjcxMDg4NjMmfnRoaXMud29yZHNbaV07cmV0dXJuIGJpdHNMZWZ0PjAmJih0aGlzLndvcmRzW2ldPX50aGlzLndvcmRzW2ldJjY3MTA4ODYzPj4yNi1iaXRzTGVmdCksdGhpcy5fc3RyaXAoKX0sQk4ucHJvdG90eXBlLm5vdG49ZnVuY3Rpb24gbm90bih3aWR0aCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pbm90bih3aWR0aCl9LEJOLnByb3RvdHlwZS5zZXRuPWZ1bmN0aW9uIHNldG4oYml0LHZhbCl7YXNzZXJ0KCJudW1iZXIiPT10eXBlb2YgYml0JiZiaXQ+PTApO3ZhciBvZmY9Yml0LzI2fDAsd2JpdD1iaXQlMjY7cmV0dXJuIHRoaXMuX2V4cGFuZChvZmYrMSksdGhpcy53b3Jkc1tvZmZdPXZhbD90aGlzLndvcmRzW29mZl18MTw8d2JpdDp0aGlzLndvcmRzW29mZl0mfigxPDx3Yml0KSx0aGlzLl9zdHJpcCgpfSxCTi5wcm90b3R5cGUuaWFkZD1mdW5jdGlvbiBpYWRkKG51bSl7dmFyIHIsYSxiO2lmKDAhPT10aGlzLm5lZ2F0aXZlJiYwPT09bnVtLm5lZ2F0aXZlKXJldHVybiB0aGlzLm5lZ2F0aXZlPTAscj10aGlzLmlzdWIobnVtKSx0aGlzLm5lZ2F0aXZlXj0xLHRoaXMuX25vcm1TaWduKCk7aWYoMD09PXRoaXMubmVnYXRpdmUmJjAhPT1udW0ubmVnYXRpdmUpcmV0dXJuIG51bS5uZWdhdGl2ZT0wLHI9dGhpcy5pc3ViKG51bSksbnVtLm5lZ2F0aXZlPTEsci5fbm9ybVNpZ24oKTt0aGlzLmxlbmd0aD5udW0ubGVuZ3RoPyhhPXRoaXMsYj1udW0pOihhPW51bSxiPXRoaXMpO2Zvcih2YXIgY2Fycnk9MCxpPTA7aTxiLmxlbmd0aDtpKyspcj0oMHxhLndvcmRzW2ldKSsoMHxiLndvcmRzW2ldKStjYXJyeSx0aGlzLndvcmRzW2ldPTY3MTA4ODYzJnIsY2Fycnk9cj4+PjI2O2Zvcig7MCE9PWNhcnJ5JiZpPGEubGVuZ3RoO2krKylyPSgwfGEud29yZHNbaV0pK2NhcnJ5LHRoaXMud29yZHNbaV09NjcxMDg4NjMmcixjYXJyeT1yPj4+MjY7aWYodGhpcy5sZW5ndGg9YS5sZW5ndGgsMCE9PWNhcnJ5KXRoaXMud29yZHNbdGhpcy5sZW5ndGhdPWNhcnJ5LHRoaXMubGVuZ3RoKys7ZWxzZSBpZihhIT09dGhpcylmb3IoO2k8YS5sZW5ndGg7aSsrKXRoaXMud29yZHNbaV09YS53b3Jkc1tpXTtyZXR1cm4gdGhpc30sQk4ucHJvdG90eXBlLmFkZD1mdW5jdGlvbiBhZGQobnVtKXt2YXIgcmVzO3JldHVybiAwIT09bnVtLm5lZ2F0aXZlJiYwPT09dGhpcy5uZWdhdGl2ZT8obnVtLm5lZ2F0aXZlPTAscmVzPXRoaXMuc3ViKG51bSksbnVtLm5lZ2F0aXZlXj0xLHJlcyk6MD09PW51bS5uZWdhdGl2ZSYmMCE9PXRoaXMubmVnYXRpdmU/KHRoaXMubmVnYXRpdmU9MCxyZXM9bnVtLnN1Yih0aGlzKSx0aGlzLm5lZ2F0aXZlPTEscmVzKTp0aGlzLmxlbmd0aD5udW0ubGVuZ3RoP3RoaXMuY2xvbmUoKS5pYWRkKG51bSk6bnVtLmNsb25lKCkuaWFkZCh0aGlzKX0sQk4ucHJvdG90eXBlLmlzdWI9ZnVuY3Rpb24gaXN1YihudW0pe2lmKDAhPT1udW0ubmVnYXRpdmUpe251bS5uZWdhdGl2ZT0wO3ZhciByPXRoaXMuaWFkZChudW0pO3JldHVybiBudW0ubmVnYXRpdmU9MSxyLl9ub3JtU2lnbigpfWlmKDAhPT10aGlzLm5lZ2F0aXZlKXJldHVybiB0aGlzLm5lZ2F0aXZlPTAsdGhpcy5pYWRkKG51bSksdGhpcy5uZWdhdGl2ZT0xLHRoaXMuX25vcm1TaWduKCk7dmFyIGEsYixjbXA9dGhpcy5jbXAobnVtKTtpZigwPT09Y21wKXJldHVybiB0aGlzLm5lZ2F0aXZlPTAsdGhpcy5sZW5ndGg9MSx0aGlzLndvcmRzWzBdPTAsdGhpcztjbXA+MD8oYT10aGlzLGI9bnVtKTooYT1udW0sYj10aGlzKTtmb3IodmFyIGNhcnJ5PTAsaT0wO2k8Yi5sZW5ndGg7aSsrKWNhcnJ5PShyPSgwfGEud29yZHNbaV0pLSgwfGIud29yZHNbaV0pK2NhcnJ5KT4+MjYsdGhpcy53b3Jkc1tpXT02NzEwODg2MyZyO2Zvcig7MCE9PWNhcnJ5JiZpPGEubGVuZ3RoO2krKyljYXJyeT0ocj0oMHxhLndvcmRzW2ldKStjYXJyeSk+PjI2LHRoaXMud29yZHNbaV09NjcxMDg4NjMmcjtpZigwPT09Y2FycnkmJmk8YS5sZW5ndGgmJmEhPT10aGlzKWZvcig7aTxhLmxlbmd0aDtpKyspdGhpcy53b3Jkc1tpXT1hLndvcmRzW2ldO3JldHVybiB0aGlzLmxlbmd0aD1NYXRoLm1heCh0aGlzLmxlbmd0aCxpKSxhIT09dGhpcyYmKHRoaXMubmVnYXRpdmU9MSksdGhpcy5fc3RyaXAoKX0sQk4ucHJvdG90eXBlLnN1Yj1mdW5jdGlvbiBzdWIobnVtKXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlzdWIobnVtKX07dmFyIGNvbWIxME11bFRvPWZ1bmN0aW9uIGNvbWIxME11bFRvKHNlbGYsbnVtLG91dCl7dmFyIGxvLG1pZCxoaSxhPXNlbGYud29yZHMsYj1udW0ud29yZHMsbz1vdXQud29yZHMsYz0wLGEwPTB8YVswXSxhbDA9ODE5MSZhMCxhaDA9YTA+Pj4xMyxhMT0wfGFbMV0sYWwxPTgxOTEmYTEsYWgxPWExPj4+MTMsYTI9MHxhWzJdLGFsMj04MTkxJmEyLGFoMj1hMj4+PjEzLGEzPTB8YVszXSxhbDM9ODE5MSZhMyxhaDM9YTM+Pj4xMyxhND0wfGFbNF0sYWw0PTgxOTEmYTQsYWg0PWE0Pj4+MTMsYTU9MHxhWzVdLGFsNT04MTkxJmE1LGFoNT1hNT4+PjEzLGE2PTB8YVs2XSxhbDY9ODE5MSZhNixhaDY9YTY+Pj4xMyxhNz0wfGFbN10sYWw3PTgxOTEmYTcsYWg3PWE3Pj4+MTMsYTg9MHxhWzhdLGFsOD04MTkxJmE4LGFoOD1hOD4+PjEzLGE5PTB8YVs5XSxhbDk9ODE5MSZhOSxhaDk9YTk+Pj4xMyxiMD0wfGJbMF0sYmwwPTgxOTEmYjAsYmgwPWIwPj4+MTMsYjE9MHxiWzFdLGJsMT04MTkxJmIxLGJoMT1iMT4+PjEzLGIyPTB8YlsyXSxibDI9ODE5MSZiMixiaDI9YjI+Pj4xMyxiMz0wfGJbM10sYmwzPTgxOTEmYjMsYmgzPWIzPj4+MTMsYjQ9MHxiWzRdLGJsND04MTkxJmI0LGJoND1iND4+PjEzLGI1PTB8Yls1XSxibDU9ODE5MSZiNSxiaDU9YjU+Pj4xMyxiNj0wfGJbNl0sYmw2PTgxOTEmYjYsYmg2PWI2Pj4+MTMsYjc9MHxiWzddLGJsNz04MTkxJmI3LGJoNz1iNz4+PjEzLGI4PTB8Yls4XSxibDg9ODE5MSZiOCxiaDg9Yjg+Pj4xMyxiOT0wfGJbOV0sYmw5PTgxOTEmYjksYmg5PWI5Pj4+MTM7b3V0Lm5lZ2F0aXZlPXNlbGYubmVnYXRpdmVebnVtLm5lZ2F0aXZlLG91dC5sZW5ndGg9MTk7dmFyIHcwPShjKyhsbz1NYXRoLmltdWwoYWwwLGJsMCkpfDApKygoODE5MSYobWlkPShtaWQ9TWF0aC5pbXVsKGFsMCxiaDApKStNYXRoLmltdWwoYWgwLGJsMCl8MCkpPDwxMyl8MDtjPSgoaGk9TWF0aC5pbXVsKGFoMCxiaDApKSsobWlkPj4+MTMpfDApKyh3MD4+PjI2KXwwLHcwJj02NzEwODg2Myxsbz1NYXRoLmltdWwoYWwxLGJsMCksbWlkPShtaWQ9TWF0aC5pbXVsKGFsMSxiaDApKStNYXRoLmltdWwoYWgxLGJsMCl8MCxoaT1NYXRoLmltdWwoYWgxLGJoMCk7dmFyIHcxPShjKyhsbz1sbytNYXRoLmltdWwoYWwwLGJsMSl8MCl8MCkrKCg4MTkxJihtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMCxiaDEpfDApK01hdGguaW11bChhaDAsYmwxKXwwKSk8PDEzKXwwO2M9KChoaT1oaStNYXRoLmltdWwoYWgwLGJoMSl8MCkrKG1pZD4+PjEzKXwwKSsodzE+Pj4yNil8MCx3MSY9NjcxMDg4NjMsbG89TWF0aC5pbXVsKGFsMixibDApLG1pZD0obWlkPU1hdGguaW11bChhbDIsYmgwKSkrTWF0aC5pbXVsKGFoMixibDApfDAsaGk9TWF0aC5pbXVsKGFoMixiaDApLGxvPWxvK01hdGguaW11bChhbDEsYmwxKXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwxLGJoMSl8MCkrTWF0aC5pbXVsKGFoMSxibDEpfDAsaGk9aGkrTWF0aC5pbXVsKGFoMSxiaDEpfDA7dmFyIHcyPShjKyhsbz1sbytNYXRoLmltdWwoYWwwLGJsMil8MCl8MCkrKCg4MTkxJihtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMCxiaDIpfDApK01hdGguaW11bChhaDAsYmwyKXwwKSk8PDEzKXwwO2M9KChoaT1oaStNYXRoLmltdWwoYWgwLGJoMil8MCkrKG1pZD4+PjEzKXwwKSsodzI+Pj4yNil8MCx3MiY9NjcxMDg4NjMsbG89TWF0aC5pbXVsKGFsMyxibDApLG1pZD0obWlkPU1hdGguaW11bChhbDMsYmgwKSkrTWF0aC5pbXVsKGFoMyxibDApfDAsaGk9TWF0aC5pbXVsKGFoMyxiaDApLGxvPWxvK01hdGguaW11bChhbDIsYmwxKXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwyLGJoMSl8MCkrTWF0aC5pbXVsKGFoMixibDEpfDAsaGk9aGkrTWF0aC5pbXVsKGFoMixiaDEpfDAsbG89bG8rTWF0aC5pbXVsKGFsMSxibDIpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDEsYmgyKXwwKStNYXRoLmltdWwoYWgxLGJsMil8MCxoaT1oaStNYXRoLmltdWwoYWgxLGJoMil8MDt2YXIgdzM9KGMrKGxvPWxvK01hdGguaW11bChhbDAsYmwzKXwwKXwwKSsoKDgxOTEmKG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwwLGJoMyl8MCkrTWF0aC5pbXVsKGFoMCxibDMpfDApKTw8MTMpfDA7Yz0oKGhpPWhpK01hdGguaW11bChhaDAsYmgzKXwwKSsobWlkPj4+MTMpfDApKyh3Mz4+PjI2KXwwLHczJj02NzEwODg2Myxsbz1NYXRoLmltdWwoYWw0LGJsMCksbWlkPShtaWQ9TWF0aC5pbXVsKGFsNCxiaDApKStNYXRoLmltdWwoYWg0LGJsMCl8MCxoaT1NYXRoLmltdWwoYWg0LGJoMCksbG89bG8rTWF0aC5pbXVsKGFsMyxibDEpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDMsYmgxKXwwKStNYXRoLmltdWwoYWgzLGJsMSl8MCxoaT1oaStNYXRoLmltdWwoYWgzLGJoMSl8MCxsbz1sbytNYXRoLmltdWwoYWwyLGJsMil8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMixiaDIpfDApK01hdGguaW11bChhaDIsYmwyKXwwLGhpPWhpK01hdGguaW11bChhaDIsYmgyKXwwLGxvPWxvK01hdGguaW11bChhbDEsYmwzKXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwxLGJoMyl8MCkrTWF0aC5pbXVsKGFoMSxibDMpfDAsaGk9aGkrTWF0aC5pbXVsKGFoMSxiaDMpfDA7dmFyIHc0PShjKyhsbz1sbytNYXRoLmltdWwoYWwwLGJsNCl8MCl8MCkrKCg4MTkxJihtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMCxiaDQpfDApK01hdGguaW11bChhaDAsYmw0KXwwKSk8PDEzKXwwO2M9KChoaT1oaStNYXRoLmltdWwoYWgwLGJoNCl8MCkrKG1pZD4+PjEzKXwwKSsodzQ+Pj4yNil8MCx3NCY9NjcxMDg4NjMsbG89TWF0aC5pbXVsKGFsNSxibDApLG1pZD0obWlkPU1hdGguaW11bChhbDUsYmgwKSkrTWF0aC5pbXVsKGFoNSxibDApfDAsaGk9TWF0aC5pbXVsKGFoNSxiaDApLGxvPWxvK01hdGguaW11bChhbDQsYmwxKXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw0LGJoMSl8MCkrTWF0aC5pbXVsKGFoNCxibDEpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNCxiaDEpfDAsbG89bG8rTWF0aC5pbXVsKGFsMyxibDIpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDMsYmgyKXwwKStNYXRoLmltdWwoYWgzLGJsMil8MCxoaT1oaStNYXRoLmltdWwoYWgzLGJoMil8MCxsbz1sbytNYXRoLmltdWwoYWwyLGJsMyl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMixiaDMpfDApK01hdGguaW11bChhaDIsYmwzKXwwLGhpPWhpK01hdGguaW11bChhaDIsYmgzKXwwLGxvPWxvK01hdGguaW11bChhbDEsYmw0KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwxLGJoNCl8MCkrTWF0aC5pbXVsKGFoMSxibDQpfDAsaGk9aGkrTWF0aC5pbXVsKGFoMSxiaDQpfDA7dmFyIHc1PShjKyhsbz1sbytNYXRoLmltdWwoYWwwLGJsNSl8MCl8MCkrKCg4MTkxJihtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMCxiaDUpfDApK01hdGguaW11bChhaDAsYmw1KXwwKSk8PDEzKXwwO2M9KChoaT1oaStNYXRoLmltdWwoYWgwLGJoNSl8MCkrKG1pZD4+PjEzKXwwKSsodzU+Pj4yNil8MCx3NSY9NjcxMDg4NjMsbG89TWF0aC5pbXVsKGFsNixibDApLG1pZD0obWlkPU1hdGguaW11bChhbDYsYmgwKSkrTWF0aC5pbXVsKGFoNixibDApfDAsaGk9TWF0aC5pbXVsKGFoNixiaDApLGxvPWxvK01hdGguaW11bChhbDUsYmwxKXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw1LGJoMSl8MCkrTWF0aC5pbXVsKGFoNSxibDEpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNSxiaDEpfDAsbG89bG8rTWF0aC5pbXVsKGFsNCxibDIpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDQsYmgyKXwwKStNYXRoLmltdWwoYWg0LGJsMil8MCxoaT1oaStNYXRoLmltdWwoYWg0LGJoMil8MCxsbz1sbytNYXRoLmltdWwoYWwzLGJsMyl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMyxiaDMpfDApK01hdGguaW11bChhaDMsYmwzKXwwLGhpPWhpK01hdGguaW11bChhaDMsYmgzKXwwLGxvPWxvK01hdGguaW11bChhbDIsYmw0KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwyLGJoNCl8MCkrTWF0aC5pbXVsKGFoMixibDQpfDAsaGk9aGkrTWF0aC5pbXVsKGFoMixiaDQpfDAsbG89bG8rTWF0aC5pbXVsKGFsMSxibDUpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDEsYmg1KXwwKStNYXRoLmltdWwoYWgxLGJsNSl8MCxoaT1oaStNYXRoLmltdWwoYWgxLGJoNSl8MDt2YXIgdzY9KGMrKGxvPWxvK01hdGguaW11bChhbDAsYmw2KXwwKXwwKSsoKDgxOTEmKG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwwLGJoNil8MCkrTWF0aC5pbXVsKGFoMCxibDYpfDApKTw8MTMpfDA7Yz0oKGhpPWhpK01hdGguaW11bChhaDAsYmg2KXwwKSsobWlkPj4+MTMpfDApKyh3Nj4+PjI2KXwwLHc2Jj02NzEwODg2Myxsbz1NYXRoLmltdWwoYWw3LGJsMCksbWlkPShtaWQ9TWF0aC5pbXVsKGFsNyxiaDApKStNYXRoLmltdWwoYWg3LGJsMCl8MCxoaT1NYXRoLmltdWwoYWg3LGJoMCksbG89bG8rTWF0aC5pbXVsKGFsNixibDEpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDYsYmgxKXwwKStNYXRoLmltdWwoYWg2LGJsMSl8MCxoaT1oaStNYXRoLmltdWwoYWg2LGJoMSl8MCxsbz1sbytNYXRoLmltdWwoYWw1LGJsMil8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNSxiaDIpfDApK01hdGguaW11bChhaDUsYmwyKXwwLGhpPWhpK01hdGguaW11bChhaDUsYmgyKXwwLGxvPWxvK01hdGguaW11bChhbDQsYmwzKXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw0LGJoMyl8MCkrTWF0aC5pbXVsKGFoNCxibDMpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNCxiaDMpfDAsbG89bG8rTWF0aC5pbXVsKGFsMyxibDQpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDMsYmg0KXwwKStNYXRoLmltdWwoYWgzLGJsNCl8MCxoaT1oaStNYXRoLmltdWwoYWgzLGJoNCl8MCxsbz1sbytNYXRoLmltdWwoYWwyLGJsNSl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMixiaDUpfDApK01hdGguaW11bChhaDIsYmw1KXwwLGhpPWhpK01hdGguaW11bChhaDIsYmg1KXwwLGxvPWxvK01hdGguaW11bChhbDEsYmw2KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwxLGJoNil8MCkrTWF0aC5pbXVsKGFoMSxibDYpfDAsaGk9aGkrTWF0aC5pbXVsKGFoMSxiaDYpfDA7dmFyIHc3PShjKyhsbz1sbytNYXRoLmltdWwoYWwwLGJsNyl8MCl8MCkrKCg4MTkxJihtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMCxiaDcpfDApK01hdGguaW11bChhaDAsYmw3KXwwKSk8PDEzKXwwO2M9KChoaT1oaStNYXRoLmltdWwoYWgwLGJoNyl8MCkrKG1pZD4+PjEzKXwwKSsodzc+Pj4yNil8MCx3NyY9NjcxMDg4NjMsbG89TWF0aC5pbXVsKGFsOCxibDApLG1pZD0obWlkPU1hdGguaW11bChhbDgsYmgwKSkrTWF0aC5pbXVsKGFoOCxibDApfDAsaGk9TWF0aC5pbXVsKGFoOCxiaDApLGxvPWxvK01hdGguaW11bChhbDcsYmwxKXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw3LGJoMSl8MCkrTWF0aC5pbXVsKGFoNyxibDEpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNyxiaDEpfDAsbG89bG8rTWF0aC5pbXVsKGFsNixibDIpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDYsYmgyKXwwKStNYXRoLmltdWwoYWg2LGJsMil8MCxoaT1oaStNYXRoLmltdWwoYWg2LGJoMil8MCxsbz1sbytNYXRoLmltdWwoYWw1LGJsMyl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNSxiaDMpfDApK01hdGguaW11bChhaDUsYmwzKXwwLGhpPWhpK01hdGguaW11bChhaDUsYmgzKXwwLGxvPWxvK01hdGguaW11bChhbDQsYmw0KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw0LGJoNCl8MCkrTWF0aC5pbXVsKGFoNCxibDQpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNCxiaDQpfDAsbG89bG8rTWF0aC5pbXVsKGFsMyxibDUpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDMsYmg1KXwwKStNYXRoLmltdWwoYWgzLGJsNSl8MCxoaT1oaStNYXRoLmltdWwoYWgzLGJoNSl8MCxsbz1sbytNYXRoLmltdWwoYWwyLGJsNil8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMixiaDYpfDApK01hdGguaW11bChhaDIsYmw2KXwwLGhpPWhpK01hdGguaW11bChhaDIsYmg2KXwwLGxvPWxvK01hdGguaW11bChhbDEsYmw3KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwxLGJoNyl8MCkrTWF0aC5pbXVsKGFoMSxibDcpfDAsaGk9aGkrTWF0aC5pbXVsKGFoMSxiaDcpfDA7dmFyIHc4PShjKyhsbz1sbytNYXRoLmltdWwoYWwwLGJsOCl8MCl8MCkrKCg4MTkxJihtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMCxiaDgpfDApK01hdGguaW11bChhaDAsYmw4KXwwKSk8PDEzKXwwO2M9KChoaT1oaStNYXRoLmltdWwoYWgwLGJoOCl8MCkrKG1pZD4+PjEzKXwwKSsodzg+Pj4yNil8MCx3OCY9NjcxMDg4NjMsbG89TWF0aC5pbXVsKGFsOSxibDApLG1pZD0obWlkPU1hdGguaW11bChhbDksYmgwKSkrTWF0aC5pbXVsKGFoOSxibDApfDAsaGk9TWF0aC5pbXVsKGFoOSxiaDApLGxvPWxvK01hdGguaW11bChhbDgsYmwxKXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw4LGJoMSl8MCkrTWF0aC5pbXVsKGFoOCxibDEpfDAsaGk9aGkrTWF0aC5pbXVsKGFoOCxiaDEpfDAsbG89bG8rTWF0aC5pbXVsKGFsNyxibDIpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDcsYmgyKXwwKStNYXRoLmltdWwoYWg3LGJsMil8MCxoaT1oaStNYXRoLmltdWwoYWg3LGJoMil8MCxsbz1sbytNYXRoLmltdWwoYWw2LGJsMyl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNixiaDMpfDApK01hdGguaW11bChhaDYsYmwzKXwwLGhpPWhpK01hdGguaW11bChhaDYsYmgzKXwwLGxvPWxvK01hdGguaW11bChhbDUsYmw0KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw1LGJoNCl8MCkrTWF0aC5pbXVsKGFoNSxibDQpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNSxiaDQpfDAsbG89bG8rTWF0aC5pbXVsKGFsNCxibDUpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDQsYmg1KXwwKStNYXRoLmltdWwoYWg0LGJsNSl8MCxoaT1oaStNYXRoLmltdWwoYWg0LGJoNSl8MCxsbz1sbytNYXRoLmltdWwoYWwzLGJsNil8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMyxiaDYpfDApK01hdGguaW11bChhaDMsYmw2KXwwLGhpPWhpK01hdGguaW11bChhaDMsYmg2KXwwLGxvPWxvK01hdGguaW11bChhbDIsYmw3KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwyLGJoNyl8MCkrTWF0aC5pbXVsKGFoMixibDcpfDAsaGk9aGkrTWF0aC5pbXVsKGFoMixiaDcpfDAsbG89bG8rTWF0aC5pbXVsKGFsMSxibDgpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDEsYmg4KXwwKStNYXRoLmltdWwoYWgxLGJsOCl8MCxoaT1oaStNYXRoLmltdWwoYWgxLGJoOCl8MDt2YXIgdzk9KGMrKGxvPWxvK01hdGguaW11bChhbDAsYmw5KXwwKXwwKSsoKDgxOTEmKG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwwLGJoOSl8MCkrTWF0aC5pbXVsKGFoMCxibDkpfDApKTw8MTMpfDA7Yz0oKGhpPWhpK01hdGguaW11bChhaDAsYmg5KXwwKSsobWlkPj4+MTMpfDApKyh3OT4+PjI2KXwwLHc5Jj02NzEwODg2Myxsbz1NYXRoLmltdWwoYWw5LGJsMSksbWlkPShtaWQ9TWF0aC5pbXVsKGFsOSxiaDEpKStNYXRoLmltdWwoYWg5LGJsMSl8MCxoaT1NYXRoLmltdWwoYWg5LGJoMSksbG89bG8rTWF0aC5pbXVsKGFsOCxibDIpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDgsYmgyKXwwKStNYXRoLmltdWwoYWg4LGJsMil8MCxoaT1oaStNYXRoLmltdWwoYWg4LGJoMil8MCxsbz1sbytNYXRoLmltdWwoYWw3LGJsMyl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNyxiaDMpfDApK01hdGguaW11bChhaDcsYmwzKXwwLGhpPWhpK01hdGguaW11bChhaDcsYmgzKXwwLGxvPWxvK01hdGguaW11bChhbDYsYmw0KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw2LGJoNCl8MCkrTWF0aC5pbXVsKGFoNixibDQpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNixiaDQpfDAsbG89bG8rTWF0aC5pbXVsKGFsNSxibDUpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDUsYmg1KXwwKStNYXRoLmltdWwoYWg1LGJsNSl8MCxoaT1oaStNYXRoLmltdWwoYWg1LGJoNSl8MCxsbz1sbytNYXRoLmltdWwoYWw0LGJsNil8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNCxiaDYpfDApK01hdGguaW11bChhaDQsYmw2KXwwLGhpPWhpK01hdGguaW11bChhaDQsYmg2KXwwLGxvPWxvK01hdGguaW11bChhbDMsYmw3KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwzLGJoNyl8MCkrTWF0aC5pbXVsKGFoMyxibDcpfDAsaGk9aGkrTWF0aC5pbXVsKGFoMyxiaDcpfDAsbG89bG8rTWF0aC5pbXVsKGFsMixibDgpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDIsYmg4KXwwKStNYXRoLmltdWwoYWgyLGJsOCl8MCxoaT1oaStNYXRoLmltdWwoYWgyLGJoOCl8MDt2YXIgdzEwPShjKyhsbz1sbytNYXRoLmltdWwoYWwxLGJsOSl8MCl8MCkrKCg4MTkxJihtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMSxiaDkpfDApK01hdGguaW11bChhaDEsYmw5KXwwKSk8PDEzKXwwO2M9KChoaT1oaStNYXRoLmltdWwoYWgxLGJoOSl8MCkrKG1pZD4+PjEzKXwwKSsodzEwPj4+MjYpfDAsdzEwJj02NzEwODg2Myxsbz1NYXRoLmltdWwoYWw5LGJsMiksbWlkPShtaWQ9TWF0aC5pbXVsKGFsOSxiaDIpKStNYXRoLmltdWwoYWg5LGJsMil8MCxoaT1NYXRoLmltdWwoYWg5LGJoMiksbG89bG8rTWF0aC5pbXVsKGFsOCxibDMpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDgsYmgzKXwwKStNYXRoLmltdWwoYWg4LGJsMyl8MCxoaT1oaStNYXRoLmltdWwoYWg4LGJoMyl8MCxsbz1sbytNYXRoLmltdWwoYWw3LGJsNCl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNyxiaDQpfDApK01hdGguaW11bChhaDcsYmw0KXwwLGhpPWhpK01hdGguaW11bChhaDcsYmg0KXwwLGxvPWxvK01hdGguaW11bChhbDYsYmw1KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw2LGJoNSl8MCkrTWF0aC5pbXVsKGFoNixibDUpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNixiaDUpfDAsbG89bG8rTWF0aC5pbXVsKGFsNSxibDYpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDUsYmg2KXwwKStNYXRoLmltdWwoYWg1LGJsNil8MCxoaT1oaStNYXRoLmltdWwoYWg1LGJoNil8MCxsbz1sbytNYXRoLmltdWwoYWw0LGJsNyl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNCxiaDcpfDApK01hdGguaW11bChhaDQsYmw3KXwwLGhpPWhpK01hdGguaW11bChhaDQsYmg3KXwwLGxvPWxvK01hdGguaW11bChhbDMsYmw4KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwzLGJoOCl8MCkrTWF0aC5pbXVsKGFoMyxibDgpfDAsaGk9aGkrTWF0aC5pbXVsKGFoMyxiaDgpfDA7dmFyIHcxMT0oYysobG89bG8rTWF0aC5pbXVsKGFsMixibDkpfDApfDApKygoODE5MSYobWlkPShtaWQ9bWlkK01hdGguaW11bChhbDIsYmg5KXwwKStNYXRoLmltdWwoYWgyLGJsOSl8MCkpPDwxMyl8MDtjPSgoaGk9aGkrTWF0aC5pbXVsKGFoMixiaDkpfDApKyhtaWQ+Pj4xMyl8MCkrKHcxMT4+PjI2KXwwLHcxMSY9NjcxMDg4NjMsbG89TWF0aC5pbXVsKGFsOSxibDMpLG1pZD0obWlkPU1hdGguaW11bChhbDksYmgzKSkrTWF0aC5pbXVsKGFoOSxibDMpfDAsaGk9TWF0aC5pbXVsKGFoOSxiaDMpLGxvPWxvK01hdGguaW11bChhbDgsYmw0KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw4LGJoNCl8MCkrTWF0aC5pbXVsKGFoOCxibDQpfDAsaGk9aGkrTWF0aC5pbXVsKGFoOCxiaDQpfDAsbG89bG8rTWF0aC5pbXVsKGFsNyxibDUpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDcsYmg1KXwwKStNYXRoLmltdWwoYWg3LGJsNSl8MCxoaT1oaStNYXRoLmltdWwoYWg3LGJoNSl8MCxsbz1sbytNYXRoLmltdWwoYWw2LGJsNil8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNixiaDYpfDApK01hdGguaW11bChhaDYsYmw2KXwwLGhpPWhpK01hdGguaW11bChhaDYsYmg2KXwwLGxvPWxvK01hdGguaW11bChhbDUsYmw3KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw1LGJoNyl8MCkrTWF0aC5pbXVsKGFoNSxibDcpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNSxiaDcpfDAsbG89bG8rTWF0aC5pbXVsKGFsNCxibDgpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDQsYmg4KXwwKStNYXRoLmltdWwoYWg0LGJsOCl8MCxoaT1oaStNYXRoLmltdWwoYWg0LGJoOCl8MDt2YXIgdzEyPShjKyhsbz1sbytNYXRoLmltdWwoYWwzLGJsOSl8MCl8MCkrKCg4MTkxJihtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMyxiaDkpfDApK01hdGguaW11bChhaDMsYmw5KXwwKSk8PDEzKXwwO2M9KChoaT1oaStNYXRoLmltdWwoYWgzLGJoOSl8MCkrKG1pZD4+PjEzKXwwKSsodzEyPj4+MjYpfDAsdzEyJj02NzEwODg2Myxsbz1NYXRoLmltdWwoYWw5LGJsNCksbWlkPShtaWQ9TWF0aC5pbXVsKGFsOSxiaDQpKStNYXRoLmltdWwoYWg5LGJsNCl8MCxoaT1NYXRoLmltdWwoYWg5LGJoNCksbG89bG8rTWF0aC5pbXVsKGFsOCxibDUpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDgsYmg1KXwwKStNYXRoLmltdWwoYWg4LGJsNSl8MCxoaT1oaStNYXRoLmltdWwoYWg4LGJoNSl8MCxsbz1sbytNYXRoLmltdWwoYWw3LGJsNil8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNyxiaDYpfDApK01hdGguaW11bChhaDcsYmw2KXwwLGhpPWhpK01hdGguaW11bChhaDcsYmg2KXwwLGxvPWxvK01hdGguaW11bChhbDYsYmw3KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw2LGJoNyl8MCkrTWF0aC5pbXVsKGFoNixibDcpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNixiaDcpfDAsbG89bG8rTWF0aC5pbXVsKGFsNSxibDgpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDUsYmg4KXwwKStNYXRoLmltdWwoYWg1LGJsOCl8MCxoaT1oaStNYXRoLmltdWwoYWg1LGJoOCl8MDt2YXIgdzEzPShjKyhsbz1sbytNYXRoLmltdWwoYWw0LGJsOSl8MCl8MCkrKCg4MTkxJihtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNCxiaDkpfDApK01hdGguaW11bChhaDQsYmw5KXwwKSk8PDEzKXwwO2M9KChoaT1oaStNYXRoLmltdWwoYWg0LGJoOSl8MCkrKG1pZD4+PjEzKXwwKSsodzEzPj4+MjYpfDAsdzEzJj02NzEwODg2Myxsbz1NYXRoLmltdWwoYWw5LGJsNSksbWlkPShtaWQ9TWF0aC5pbXVsKGFsOSxiaDUpKStNYXRoLmltdWwoYWg5LGJsNSl8MCxoaT1NYXRoLmltdWwoYWg5LGJoNSksbG89bG8rTWF0aC5pbXVsKGFsOCxibDYpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDgsYmg2KXwwKStNYXRoLmltdWwoYWg4LGJsNil8MCxoaT1oaStNYXRoLmltdWwoYWg4LGJoNil8MCxsbz1sbytNYXRoLmltdWwoYWw3LGJsNyl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNyxiaDcpfDApK01hdGguaW11bChhaDcsYmw3KXwwLGhpPWhpK01hdGguaW11bChhaDcsYmg3KXwwLGxvPWxvK01hdGguaW11bChhbDYsYmw4KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw2LGJoOCl8MCkrTWF0aC5pbXVsKGFoNixibDgpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNixiaDgpfDA7dmFyIHcxND0oYysobG89bG8rTWF0aC5pbXVsKGFsNSxibDkpfDApfDApKygoODE5MSYobWlkPShtaWQ9bWlkK01hdGguaW11bChhbDUsYmg5KXwwKStNYXRoLmltdWwoYWg1LGJsOSl8MCkpPDwxMyl8MDtjPSgoaGk9aGkrTWF0aC5pbXVsKGFoNSxiaDkpfDApKyhtaWQ+Pj4xMyl8MCkrKHcxND4+PjI2KXwwLHcxNCY9NjcxMDg4NjMsbG89TWF0aC5pbXVsKGFsOSxibDYpLG1pZD0obWlkPU1hdGguaW11bChhbDksYmg2KSkrTWF0aC5pbXVsKGFoOSxibDYpfDAsaGk9TWF0aC5pbXVsKGFoOSxiaDYpLGxvPWxvK01hdGguaW11bChhbDgsYmw3KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw4LGJoNyl8MCkrTWF0aC5pbXVsKGFoOCxibDcpfDAsaGk9aGkrTWF0aC5pbXVsKGFoOCxiaDcpfDAsbG89bG8rTWF0aC5pbXVsKGFsNyxibDgpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDcsYmg4KXwwKStNYXRoLmltdWwoYWg3LGJsOCl8MCxoaT1oaStNYXRoLmltdWwoYWg3LGJoOCl8MDt2YXIgdzE1PShjKyhsbz1sbytNYXRoLmltdWwoYWw2LGJsOSl8MCl8MCkrKCg4MTkxJihtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNixiaDkpfDApK01hdGguaW11bChhaDYsYmw5KXwwKSk8PDEzKXwwO2M9KChoaT1oaStNYXRoLmltdWwoYWg2LGJoOSl8MCkrKG1pZD4+PjEzKXwwKSsodzE1Pj4+MjYpfDAsdzE1Jj02NzEwODg2Myxsbz1NYXRoLmltdWwoYWw5LGJsNyksbWlkPShtaWQ9TWF0aC5pbXVsKGFsOSxiaDcpKStNYXRoLmltdWwoYWg5LGJsNyl8MCxoaT1NYXRoLmltdWwoYWg5LGJoNyksbG89bG8rTWF0aC5pbXVsKGFsOCxibDgpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDgsYmg4KXwwKStNYXRoLmltdWwoYWg4LGJsOCl8MCxoaT1oaStNYXRoLmltdWwoYWg4LGJoOCl8MDt2YXIgdzE2PShjKyhsbz1sbytNYXRoLmltdWwoYWw3LGJsOSl8MCl8MCkrKCg4MTkxJihtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNyxiaDkpfDApK01hdGguaW11bChhaDcsYmw5KXwwKSk8PDEzKXwwO2M9KChoaT1oaStNYXRoLmltdWwoYWg3LGJoOSl8MCkrKG1pZD4+PjEzKXwwKSsodzE2Pj4+MjYpfDAsdzE2Jj02NzEwODg2Myxsbz1NYXRoLmltdWwoYWw5LGJsOCksbWlkPShtaWQ9TWF0aC5pbXVsKGFsOSxiaDgpKStNYXRoLmltdWwoYWg5LGJsOCl8MCxoaT1NYXRoLmltdWwoYWg5LGJoOCk7dmFyIHcxNz0oYysobG89bG8rTWF0aC5pbXVsKGFsOCxibDkpfDApfDApKygoODE5MSYobWlkPShtaWQ9bWlkK01hdGguaW11bChhbDgsYmg5KXwwKStNYXRoLmltdWwoYWg4LGJsOSl8MCkpPDwxMyl8MDtjPSgoaGk9aGkrTWF0aC5pbXVsKGFoOCxiaDkpfDApKyhtaWQ+Pj4xMyl8MCkrKHcxNz4+PjI2KXwwLHcxNyY9NjcxMDg4NjM7dmFyIHcxOD0oYysobG89TWF0aC5pbXVsKGFsOSxibDkpKXwwKSsoKDgxOTEmKG1pZD0obWlkPU1hdGguaW11bChhbDksYmg5KSkrTWF0aC5pbXVsKGFoOSxibDkpfDApKTw8MTMpfDA7cmV0dXJuIGM9KChoaT1NYXRoLmltdWwoYWg5LGJoOSkpKyhtaWQ+Pj4xMyl8MCkrKHcxOD4+PjI2KXwwLHcxOCY9NjcxMDg4NjMsb1swXT13MCxvWzFdPXcxLG9bMl09dzIsb1szXT13MyxvWzRdPXc0LG9bNV09dzUsb1s2XT13NixvWzddPXc3LG9bOF09dzgsb1s5XT13OSxvWzEwXT13MTAsb1sxMV09dzExLG9bMTJdPXcxMixvWzEzXT13MTMsb1sxNF09dzE0LG9bMTVdPXcxNSxvWzE2XT13MTYsb1sxN109dzE3LG9bMThdPXcxOCwwIT09YyYmKG9bMTldPWMsb3V0Lmxlbmd0aCsrKSxvdXR9O2Z1bmN0aW9uIGJpZ011bFRvKHNlbGYsbnVtLG91dCl7b3V0Lm5lZ2F0aXZlPW51bS5uZWdhdGl2ZV5zZWxmLm5lZ2F0aXZlLG91dC5sZW5ndGg9c2VsZi5sZW5ndGgrbnVtLmxlbmd0aDtmb3IodmFyIGNhcnJ5PTAsaG5jYXJyeT0wLGs9MDtrPG91dC5sZW5ndGgtMTtrKyspe3ZhciBuY2Fycnk9aG5jYXJyeTtobmNhcnJ5PTA7Zm9yKHZhciByd29yZD02NzEwODg2MyZjYXJyeSxtYXhKPU1hdGgubWluKGssbnVtLmxlbmd0aC0xKSxqPU1hdGgubWF4KDAsay1zZWxmLmxlbmd0aCsxKTtqPD1tYXhKO2orKyl7dmFyIGk9ay1qLHI9KDB8c2VsZi53b3Jkc1tpXSkqKDB8bnVtLndvcmRzW2pdKSxsbz02NzEwODg2MyZyO3J3b3JkPTY3MTA4ODYzJihsbz1sbytyd29yZHwwKSxobmNhcnJ5Kz0obmNhcnJ5PShuY2Fycnk9bmNhcnJ5KyhyLzY3MTA4ODY0fDApfDApKyhsbz4+PjI2KXwwKT4+PjI2LG5jYXJyeSY9NjcxMDg4NjN9b3V0LndvcmRzW2tdPXJ3b3JkLGNhcnJ5PW5jYXJyeSxuY2Fycnk9aG5jYXJyeX1yZXR1cm4gMCE9PWNhcnJ5P291dC53b3Jkc1trXT1jYXJyeTpvdXQubGVuZ3RoLS0sb3V0Ll9zdHJpcCgpfWZ1bmN0aW9uIGp1bWJvTXVsVG8oc2VsZixudW0sb3V0KXtyZXR1cm4gYmlnTXVsVG8oc2VsZixudW0sb3V0KX1mdW5jdGlvbiBGRlRNKHgseSl7dGhpcy54PXgsdGhpcy55PXl9TWF0aC5pbXVsfHwoY29tYjEwTXVsVG89c21hbGxNdWxUbyksQk4ucHJvdG90eXBlLm11bFRvPWZ1bmN0aW9uIG11bFRvKG51bSxvdXQpe3ZhciBsZW49dGhpcy5sZW5ndGgrbnVtLmxlbmd0aDtyZXR1cm4gMTA9PT10aGlzLmxlbmd0aCYmMTA9PT1udW0ubGVuZ3RoP2NvbWIxME11bFRvKHRoaXMsbnVtLG91dCk6bGVuPDYzP3NtYWxsTXVsVG8odGhpcyxudW0sb3V0KTpsZW48MTAyND9iaWdNdWxUbyh0aGlzLG51bSxvdXQpOmp1bWJvTXVsVG8odGhpcyxudW0sb3V0KX0sRkZUTS5wcm90b3R5cGUubWFrZVJCVD1mdW5jdGlvbiBtYWtlUkJUKE4pe2Zvcih2YXIgdD1uZXcgQXJyYXkoTiksbD1CTi5wcm90b3R5cGUuX2NvdW50Qml0cyhOKS0xLGk9MDtpPE47aSsrKXRbaV09dGhpcy5yZXZCaW4oaSxsLE4pO3JldHVybiB0fSxGRlRNLnByb3RvdHlwZS5yZXZCaW49ZnVuY3Rpb24gcmV2QmluKHgsbCxOKXtpZigwPT09eHx8eD09PU4tMSlyZXR1cm4geDtmb3IodmFyIHJiPTAsaT0wO2k8bDtpKyspcmJ8PSgxJngpPDxsLWktMSx4Pj49MTtyZXR1cm4gcmJ9LEZGVE0ucHJvdG90eXBlLnBlcm11dGU9ZnVuY3Rpb24gcGVybXV0ZShyYnQscndzLGl3cyxydHdzLGl0d3MsTil7Zm9yKHZhciBpPTA7aTxOO2krKylydHdzW2ldPXJ3c1tyYnRbaV1dLGl0d3NbaV09aXdzW3JidFtpXV19LEZGVE0ucHJvdG90eXBlLnRyYW5zZm9ybT1mdW5jdGlvbiB0cmFuc2Zvcm0ocndzLGl3cyxydHdzLGl0d3MsTixyYnQpe3RoaXMucGVybXV0ZShyYnQscndzLGl3cyxydHdzLGl0d3MsTik7Zm9yKHZhciBzPTE7czxOO3M8PD0xKWZvcih2YXIgbD1zPDwxLHJ0d2RmPU1hdGguY29zKDIqTWF0aC5QSS9sKSxpdHdkZj1NYXRoLnNpbigyKk1hdGguUEkvbCkscD0wO3A8TjtwKz1sKWZvcih2YXIgcnR3ZGZfPXJ0d2RmLGl0d2RmXz1pdHdkZixqPTA7ajxzO2orKyl7dmFyIHJlPXJ0d3NbcCtqXSxpZT1pdHdzW3Aral0scm89cnR3c1twK2orc10saW89aXR3c1twK2orc10scng9cnR3ZGZfKnJvLWl0d2RmXyppbztpbz1ydHdkZl8qaW8raXR3ZGZfKnJvLHJvPXJ4LHJ0d3NbcCtqXT1yZStybyxpdHdzW3Aral09aWUraW8scnR3c1twK2orc109cmUtcm8saXR3c1twK2orc109aWUtaW8saiE9PWwmJihyeD1ydHdkZipydHdkZl8taXR3ZGYqaXR3ZGZfLGl0d2RmXz1ydHdkZippdHdkZl8raXR3ZGYqcnR3ZGZfLHJ0d2RmXz1yeCl9fSxGRlRNLnByb3RvdHlwZS5ndWVzc0xlbjEzYj1mdW5jdGlvbiBndWVzc0xlbjEzYihuLG0pe3ZhciBOPTF8TWF0aC5tYXgobSxuKSxvZGQ9MSZOLGk9MDtmb3IoTj1OLzJ8MDtOO04+Pj49MSlpKys7cmV0dXJuIDE8PGkrMStvZGR9LEZGVE0ucHJvdG90eXBlLmNvbmp1Z2F0ZT1mdW5jdGlvbiBjb25qdWdhdGUocndzLGl3cyxOKXtpZighKE48PTEpKWZvcih2YXIgaT0wO2k8Ti8yO2krKyl7dmFyIHQ9cndzW2ldO3J3c1tpXT1yd3NbTi1pLTFdLHJ3c1tOLWktMV09dCx0PWl3c1tpXSxpd3NbaV09LWl3c1tOLWktMV0saXdzW04taS0xXT0tdH19LEZGVE0ucHJvdG90eXBlLm5vcm1hbGl6ZTEzYj1mdW5jdGlvbiBub3JtYWxpemUxM2Iod3MsTil7Zm9yKHZhciBjYXJyeT0wLGk9MDtpPE4vMjtpKyspe3ZhciB3PTgxOTIqTWF0aC5yb3VuZCh3c1syKmkrMV0vTikrTWF0aC5yb3VuZCh3c1syKmldL04pK2NhcnJ5O3dzW2ldPTY3MTA4ODYzJncsY2Fycnk9dzw2NzEwODg2ND8wOncvNjcxMDg4NjR8MH1yZXR1cm4gd3N9LEZGVE0ucHJvdG90eXBlLmNvbnZlcnQxM2I9ZnVuY3Rpb24gY29udmVydDEzYih3cyxsZW4scndzLE4pe2Zvcih2YXIgY2Fycnk9MCxpPTA7aTxsZW47aSsrKWNhcnJ5Kz0wfHdzW2ldLHJ3c1syKmldPTgxOTEmY2FycnksY2Fycnk+Pj49MTMscndzWzIqaSsxXT04MTkxJmNhcnJ5LGNhcnJ5Pj4+PTEzO2ZvcihpPTIqbGVuO2k8TjsrK2kpcndzW2ldPTA7YXNzZXJ0KDA9PT1jYXJyeSksYXNzZXJ0KCEoLTgxOTImY2FycnkpKX0sRkZUTS5wcm90b3R5cGUuc3R1Yj1mdW5jdGlvbiBzdHViKE4pe2Zvcih2YXIgcGg9bmV3IEFycmF5KE4pLGk9MDtpPE47aSsrKXBoW2ldPTA7cmV0dXJuIHBofSxGRlRNLnByb3RvdHlwZS5tdWxwPWZ1bmN0aW9uIG11bHAoeCx5LG91dCl7dmFyIE49Mip0aGlzLmd1ZXNzTGVuMTNiKHgubGVuZ3RoLHkubGVuZ3RoKSxyYnQ9dGhpcy5tYWtlUkJUKE4pLF89dGhpcy5zdHViKE4pLHJ3cz1uZXcgQXJyYXkoTikscndzdD1uZXcgQXJyYXkoTiksaXdzdD1uZXcgQXJyYXkoTiksbnJ3cz1uZXcgQXJyYXkoTiksbnJ3c3Q9bmV3IEFycmF5KE4pLG5pd3N0PW5ldyBBcnJheShOKSxybXdzPW91dC53b3JkcztybXdzLmxlbmd0aD1OLHRoaXMuY29udmVydDEzYih4LndvcmRzLHgubGVuZ3RoLHJ3cyxOKSx0aGlzLmNvbnZlcnQxM2IoeS53b3Jkcyx5Lmxlbmd0aCxucndzLE4pLHRoaXMudHJhbnNmb3JtKHJ3cyxfLHJ3c3QsaXdzdCxOLHJidCksdGhpcy50cmFuc2Zvcm0obnJ3cyxfLG5yd3N0LG5pd3N0LE4scmJ0KTtmb3IodmFyIGk9MDtpPE47aSsrKXt2YXIgcng9cndzdFtpXSpucndzdFtpXS1pd3N0W2ldKm5pd3N0W2ldO2l3c3RbaV09cndzdFtpXSpuaXdzdFtpXStpd3N0W2ldKm5yd3N0W2ldLHJ3c3RbaV09cnh9cmV0dXJuIHRoaXMuY29uanVnYXRlKHJ3c3QsaXdzdCxOKSx0aGlzLnRyYW5zZm9ybShyd3N0LGl3c3Qscm13cyxfLE4scmJ0KSx0aGlzLmNvbmp1Z2F0ZShybXdzLF8sTiksdGhpcy5ub3JtYWxpemUxM2Iocm13cyxOKSxvdXQubmVnYXRpdmU9eC5uZWdhdGl2ZV55Lm5lZ2F0aXZlLG91dC5sZW5ndGg9eC5sZW5ndGgreS5sZW5ndGgsb3V0Ll9zdHJpcCgpfSxCTi5wcm90b3R5cGUubXVsPWZ1bmN0aW9uIG11bChudW0pe3ZhciBvdXQ9bmV3IEJOKG51bGwpO3JldHVybiBvdXQud29yZHM9bmV3IEFycmF5KHRoaXMubGVuZ3RoK251bS5sZW5ndGgpLHRoaXMubXVsVG8obnVtLG91dCl9LEJOLnByb3RvdHlwZS5tdWxmPWZ1bmN0aW9uIG11bGYobnVtKXt2YXIgb3V0PW5ldyBCTihudWxsKTtyZXR1cm4gb3V0LndvcmRzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCtudW0ubGVuZ3RoKSxqdW1ib011bFRvKHRoaXMsbnVtLG91dCl9LEJOLnByb3RvdHlwZS5pbXVsPWZ1bmN0aW9uIGltdWwobnVtKXtyZXR1cm4gdGhpcy5jbG9uZSgpLm11bFRvKG51bSx0aGlzKX0sQk4ucHJvdG90eXBlLmltdWxuPWZ1bmN0aW9uIGltdWxuKG51bSl7dmFyIGlzTmVnTnVtPW51bTwwO2lzTmVnTnVtJiYobnVtPS1udW0pLGFzc2VydCgibnVtYmVyIj09dHlwZW9mIG51bSksYXNzZXJ0KG51bTw2NzEwODg2NCk7Zm9yKHZhciBjYXJyeT0wLGk9MDtpPHRoaXMubGVuZ3RoO2krKyl7dmFyIHc9KDB8dGhpcy53b3Jkc1tpXSkqbnVtLGxvPSg2NzEwODg2MyZ3KSsoNjcxMDg4NjMmY2FycnkpO2NhcnJ5Pj49MjYsY2FycnkrPXcvNjcxMDg4NjR8MCxjYXJyeSs9bG8+Pj4yNix0aGlzLndvcmRzW2ldPTY3MTA4ODYzJmxvfXJldHVybiAwIT09Y2FycnkmJih0aGlzLndvcmRzW2ldPWNhcnJ5LHRoaXMubGVuZ3RoKyspLHRoaXMubGVuZ3RoPTA9PT1udW0/MTp0aGlzLmxlbmd0aCxpc05lZ051bT90aGlzLmluZWcoKTp0aGlzfSxCTi5wcm90b3R5cGUubXVsbj1mdW5jdGlvbiBtdWxuKG51bSl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pbXVsbihudW0pfSxCTi5wcm90b3R5cGUuc3FyPWZ1bmN0aW9uIHNxcigpe3JldHVybiB0aGlzLm11bCh0aGlzKX0sQk4ucHJvdG90eXBlLmlzcXI9ZnVuY3Rpb24gaXNxcigpe3JldHVybiB0aGlzLmltdWwodGhpcy5jbG9uZSgpKX0sQk4ucHJvdG90eXBlLnBvdz1mdW5jdGlvbiBwb3cobnVtKXt2YXIgdz1mdW5jdGlvbiB0b0JpdEFycmF5KG51bSl7Zm9yKHZhciB3PW5ldyBBcnJheShudW0uYml0TGVuZ3RoKCkpLGJpdD0wO2JpdDx3Lmxlbmd0aDtiaXQrKyl7dmFyIG9mZj1iaXQvMjZ8MCx3Yml0PWJpdCUyNjt3W2JpdF09bnVtLndvcmRzW29mZl0+Pj53Yml0JjF9cmV0dXJuIHd9KG51bSk7aWYoMD09PXcubGVuZ3RoKXJldHVybiBuZXcgQk4oMSk7Zm9yKHZhciByZXM9dGhpcyxpPTA7aTx3Lmxlbmd0aCYmMD09PXdbaV07aSsrLHJlcz1yZXMuc3FyKCkpO2lmKCsraTx3Lmxlbmd0aClmb3IodmFyIHE9cmVzLnNxcigpO2k8dy5sZW5ndGg7aSsrLHE9cS5zcXIoKSkwIT09d1tpXSYmKHJlcz1yZXMubXVsKHEpKTtyZXR1cm4gcmVzfSxCTi5wcm90b3R5cGUuaXVzaGxuPWZ1bmN0aW9uIGl1c2hsbihiaXRzKXthc3NlcnQoIm51bWJlciI9PXR5cGVvZiBiaXRzJiZiaXRzPj0wKTt2YXIgaSxyPWJpdHMlMjYscz0oYml0cy1yKS8yNixjYXJyeU1hc2s9NjcxMDg4NjM+Pj4yNi1yPDwyNi1yO2lmKDAhPT1yKXt2YXIgY2Fycnk9MDtmb3IoaT0wO2k8dGhpcy5sZW5ndGg7aSsrKXt2YXIgbmV3Q2Fycnk9dGhpcy53b3Jkc1tpXSZjYXJyeU1hc2ssYz0oMHx0aGlzLndvcmRzW2ldKS1uZXdDYXJyeTw8cjt0aGlzLndvcmRzW2ldPWN8Y2FycnksY2Fycnk9bmV3Q2Fycnk+Pj4yNi1yfWNhcnJ5JiYodGhpcy53b3Jkc1tpXT1jYXJyeSx0aGlzLmxlbmd0aCsrKX1pZigwIT09cyl7Zm9yKGk9dGhpcy5sZW5ndGgtMTtpPj0wO2ktLSl0aGlzLndvcmRzW2krc109dGhpcy53b3Jkc1tpXTtmb3IoaT0wO2k8cztpKyspdGhpcy53b3Jkc1tpXT0wO3RoaXMubGVuZ3RoKz1zfXJldHVybiB0aGlzLl9zdHJpcCgpfSxCTi5wcm90b3R5cGUuaXNobG49ZnVuY3Rpb24gaXNobG4oYml0cyl7cmV0dXJuIGFzc2VydCgwPT09dGhpcy5uZWdhdGl2ZSksdGhpcy5pdXNobG4oYml0cyl9LEJOLnByb3RvdHlwZS5pdXNocm49ZnVuY3Rpb24gaXVzaHJuKGJpdHMsaGludCxleHRlbmRlZCl7dmFyIGg7YXNzZXJ0KCJudW1iZXIiPT10eXBlb2YgYml0cyYmYml0cz49MCksaD1oaW50PyhoaW50LWhpbnQlMjYpLzI2OjA7dmFyIHI9Yml0cyUyNixzPU1hdGgubWluKChiaXRzLXIpLzI2LHRoaXMubGVuZ3RoKSxtYXNrPTY3MTA4ODYzXjY3MTA4ODYzPj4+cjw8cixtYXNrZWRXb3Jkcz1leHRlbmRlZDtpZihoLT1zLGg9TWF0aC5tYXgoMCxoKSxtYXNrZWRXb3Jkcyl7Zm9yKHZhciBpPTA7aTxzO2krKyltYXNrZWRXb3Jkcy53b3Jkc1tpXT10aGlzLndvcmRzW2ldO21hc2tlZFdvcmRzLmxlbmd0aD1zfWlmKDA9PT1zKTtlbHNlIGlmKHRoaXMubGVuZ3RoPnMpZm9yKHRoaXMubGVuZ3RoLT1zLGk9MDtpPHRoaXMubGVuZ3RoO2krKyl0aGlzLndvcmRzW2ldPXRoaXMud29yZHNbaStzXTtlbHNlIHRoaXMud29yZHNbMF09MCx0aGlzLmxlbmd0aD0xO3ZhciBjYXJyeT0wO2ZvcihpPXRoaXMubGVuZ3RoLTE7aT49MCYmKDAhPT1jYXJyeXx8aT49aCk7aS0tKXt2YXIgd29yZD0wfHRoaXMud29yZHNbaV07dGhpcy53b3Jkc1tpXT1jYXJyeTw8MjYtcnx3b3JkPj4+cixjYXJyeT13b3JkJm1hc2t9cmV0dXJuIG1hc2tlZFdvcmRzJiYwIT09Y2FycnkmJihtYXNrZWRXb3Jkcy53b3Jkc1ttYXNrZWRXb3Jkcy5sZW5ndGgrK109Y2FycnkpLDA9PT10aGlzLmxlbmd0aCYmKHRoaXMud29yZHNbMF09MCx0aGlzLmxlbmd0aD0xKSx0aGlzLl9zdHJpcCgpfSxCTi5wcm90b3R5cGUuaXNocm49ZnVuY3Rpb24gaXNocm4oYml0cyxoaW50LGV4dGVuZGVkKXtyZXR1cm4gYXNzZXJ0KDA9PT10aGlzLm5lZ2F0aXZlKSx0aGlzLml1c2hybihiaXRzLGhpbnQsZXh0ZW5kZWQpfSxCTi5wcm90b3R5cGUuc2hsbj1mdW5jdGlvbiBzaGxuKGJpdHMpe3JldHVybiB0aGlzLmNsb25lKCkuaXNobG4oYml0cyl9LEJOLnByb3RvdHlwZS51c2hsbj1mdW5jdGlvbiB1c2hsbihiaXRzKXtyZXR1cm4gdGhpcy5jbG9uZSgpLml1c2hsbihiaXRzKX0sQk4ucHJvdG90eXBlLnNocm49ZnVuY3Rpb24gc2hybihiaXRzKXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlzaHJuKGJpdHMpfSxCTi5wcm90b3R5cGUudXNocm49ZnVuY3Rpb24gdXNocm4oYml0cyl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pdXNocm4oYml0cyl9LEJOLnByb3RvdHlwZS50ZXN0bj1mdW5jdGlvbiB0ZXN0bihiaXQpe2Fzc2VydCgibnVtYmVyIj09dHlwZW9mIGJpdCYmYml0Pj0wKTt2YXIgcj1iaXQlMjYscz0oYml0LXIpLzI2LHE9MTw8cjtyZXR1cm4hKHRoaXMubGVuZ3RoPD1zKSYmISEodGhpcy53b3Jkc1tzXSZxKX0sQk4ucHJvdG90eXBlLmltYXNrbj1mdW5jdGlvbiBpbWFza24oYml0cyl7YXNzZXJ0KCJudW1iZXIiPT10eXBlb2YgYml0cyYmYml0cz49MCk7dmFyIHI9Yml0cyUyNixzPShiaXRzLXIpLzI2O2lmKGFzc2VydCgwPT09dGhpcy5uZWdhdGl2ZSwiaW1hc2tuIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZSBudW1iZXJzIiksdGhpcy5sZW5ndGg8PXMpcmV0dXJuIHRoaXM7aWYoMCE9PXImJnMrKyx0aGlzLmxlbmd0aD1NYXRoLm1pbihzLHRoaXMubGVuZ3RoKSwwIT09cil7dmFyIG1hc2s9NjcxMDg4NjNeNjcxMDg4NjM+Pj5yPDxyO3RoaXMud29yZHNbdGhpcy5sZW5ndGgtMV0mPW1hc2t9cmV0dXJuIDA9PT10aGlzLmxlbmd0aCYmKHRoaXMud29yZHNbMF09MCx0aGlzLmxlbmd0aD0xKSx0aGlzLl9zdHJpcCgpfSxCTi5wcm90b3R5cGUubWFza249ZnVuY3Rpb24gbWFza24oYml0cyl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pbWFza24oYml0cyl9LEJOLnByb3RvdHlwZS5pYWRkbj1mdW5jdGlvbiBpYWRkbihudW0pe3JldHVybiBhc3NlcnQoIm51bWJlciI9PXR5cGVvZiBudW0pLGFzc2VydChudW08NjcxMDg4NjQpLG51bTwwP3RoaXMuaXN1Ym4oLW51bSk6MCE9PXRoaXMubmVnYXRpdmU/MT09PXRoaXMubGVuZ3RoJiYoMHx0aGlzLndvcmRzWzBdKTw9bnVtPyh0aGlzLndvcmRzWzBdPW51bS0oMHx0aGlzLndvcmRzWzBdKSx0aGlzLm5lZ2F0aXZlPTAsdGhpcyk6KHRoaXMubmVnYXRpdmU9MCx0aGlzLmlzdWJuKG51bSksdGhpcy5uZWdhdGl2ZT0xLHRoaXMpOnRoaXMuX2lhZGRuKG51bSl9LEJOLnByb3RvdHlwZS5faWFkZG49ZnVuY3Rpb24gX2lhZGRuKG51bSl7dGhpcy53b3Jkc1swXSs9bnVtO2Zvcih2YXIgaT0wO2k8dGhpcy5sZW5ndGgmJnRoaXMud29yZHNbaV0+PTY3MTA4ODY0O2krKyl0aGlzLndvcmRzW2ldLT02NzEwODg2NCxpPT09dGhpcy5sZW5ndGgtMT90aGlzLndvcmRzW2krMV09MTp0aGlzLndvcmRzW2krMV0rKztyZXR1cm4gdGhpcy5sZW5ndGg9TWF0aC5tYXgodGhpcy5sZW5ndGgsaSsxKSx0aGlzfSxCTi5wcm90b3R5cGUuaXN1Ym49ZnVuY3Rpb24gaXN1Ym4obnVtKXtpZihhc3NlcnQoIm51bWJlciI9PXR5cGVvZiBudW0pLGFzc2VydChudW08NjcxMDg4NjQpLG51bTwwKXJldHVybiB0aGlzLmlhZGRuKC1udW0pO2lmKDAhPT10aGlzLm5lZ2F0aXZlKXJldHVybiB0aGlzLm5lZ2F0aXZlPTAsdGhpcy5pYWRkbihudW0pLHRoaXMubmVnYXRpdmU9MSx0aGlzO2lmKHRoaXMud29yZHNbMF0tPW51bSwxPT09dGhpcy5sZW5ndGgmJnRoaXMud29yZHNbMF08MCl0aGlzLndvcmRzWzBdPS10aGlzLndvcmRzWzBdLHRoaXMubmVnYXRpdmU9MTtlbHNlIGZvcih2YXIgaT0wO2k8dGhpcy5sZW5ndGgmJnRoaXMud29yZHNbaV08MDtpKyspdGhpcy53b3Jkc1tpXSs9NjcxMDg4NjQsdGhpcy53b3Jkc1tpKzFdLT0xO3JldHVybiB0aGlzLl9zdHJpcCgpfSxCTi5wcm90b3R5cGUuYWRkbj1mdW5jdGlvbiBhZGRuKG51bSl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pYWRkbihudW0pfSxCTi5wcm90b3R5cGUuc3Vibj1mdW5jdGlvbiBzdWJuKG51bSl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pc3VibihudW0pfSxCTi5wcm90b3R5cGUuaWFicz1mdW5jdGlvbiBpYWJzKCl7cmV0dXJuIHRoaXMubmVnYXRpdmU9MCx0aGlzfSxCTi5wcm90b3R5cGUuYWJzPWZ1bmN0aW9uIGFicygpe3JldHVybiB0aGlzLmNsb25lKCkuaWFicygpfSxCTi5wcm90b3R5cGUuX2lzaGxuc3VibXVsPWZ1bmN0aW9uIF9pc2hsbnN1Ym11bChudW0sbXVsLHNoaWZ0KXt2YXIgaSx3LGxlbj1udW0ubGVuZ3RoK3NoaWZ0O3RoaXMuX2V4cGFuZChsZW4pO3ZhciBjYXJyeT0wO2ZvcihpPTA7aTxudW0ubGVuZ3RoO2krKyl7dz0oMHx0aGlzLndvcmRzW2krc2hpZnRdKStjYXJyeTt2YXIgcmlnaHQ9KDB8bnVtLndvcmRzW2ldKSptdWw7Y2Fycnk9KCh3LT02NzEwODg2MyZyaWdodCk+PjI2KS0ocmlnaHQvNjcxMDg4NjR8MCksdGhpcy53b3Jkc1tpK3NoaWZ0XT02NzEwODg2MyZ3fWZvcig7aTx0aGlzLmxlbmd0aC1zaGlmdDtpKyspY2Fycnk9KHc9KDB8dGhpcy53b3Jkc1tpK3NoaWZ0XSkrY2FycnkpPj4yNix0aGlzLndvcmRzW2krc2hpZnRdPTY3MTA4ODYzJnc7aWYoMD09PWNhcnJ5KXJldHVybiB0aGlzLl9zdHJpcCgpO2Zvcihhc3NlcnQoLTE9PT1jYXJyeSksY2Fycnk9MCxpPTA7aTx0aGlzLmxlbmd0aDtpKyspY2Fycnk9KHc9LSgwfHRoaXMud29yZHNbaV0pK2NhcnJ5KT4+MjYsdGhpcy53b3Jkc1tpXT02NzEwODg2MyZ3O3JldHVybiB0aGlzLm5lZ2F0aXZlPTEsdGhpcy5fc3RyaXAoKX0sQk4ucHJvdG90eXBlLl93b3JkRGl2PWZ1bmN0aW9uIF93b3JkRGl2KG51bSxtb2RlKXt2YXIgc2hpZnQ9KHRoaXMubGVuZ3RoLG51bS5sZW5ndGgpLGE9dGhpcy5jbG9uZSgpLGI9bnVtLGJoaT0wfGIud29yZHNbYi5sZW5ndGgtMV07MCE9PShzaGlmdD0yNi10aGlzLl9jb3VudEJpdHMoYmhpKSkmJihiPWIudXNobG4oc2hpZnQpLGEuaXVzaGxuKHNoaWZ0KSxiaGk9MHxiLndvcmRzW2IubGVuZ3RoLTFdKTt2YXIgcSxtPWEubGVuZ3RoLWIubGVuZ3RoO2lmKCJtb2QiIT09bW9kZSl7KHE9bmV3IEJOKG51bGwpKS5sZW5ndGg9bSsxLHEud29yZHM9bmV3IEFycmF5KHEubGVuZ3RoKTtmb3IodmFyIGk9MDtpPHEubGVuZ3RoO2krKylxLndvcmRzW2ldPTB9dmFyIGRpZmY9YS5jbG9uZSgpLl9pc2hsbnN1Ym11bChiLDEsbSk7MD09PWRpZmYubmVnYXRpdmUmJihhPWRpZmYscSYmKHEud29yZHNbbV09MSkpO2Zvcih2YXIgaj1tLTE7aj49MDtqLS0pe3ZhciBxaj02NzEwODg2NCooMHxhLndvcmRzW2IubGVuZ3RoK2pdKSsoMHxhLndvcmRzW2IubGVuZ3RoK2otMV0pO2Zvcihxaj1NYXRoLm1pbihxai9iaGl8MCw2NzEwODg2MyksYS5faXNobG5zdWJtdWwoYixxaixqKTswIT09YS5uZWdhdGl2ZTspcWotLSxhLm5lZ2F0aXZlPTAsYS5faXNobG5zdWJtdWwoYiwxLGopLGEuaXNaZXJvKCl8fChhLm5lZ2F0aXZlXj0xKTtxJiYocS53b3Jkc1tqXT1xail9cmV0dXJuIHEmJnEuX3N0cmlwKCksYS5fc3RyaXAoKSwiZGl2IiE9PW1vZGUmJjAhPT1zaGlmdCYmYS5pdXNocm4oc2hpZnQpLHtkaXY6cXx8bnVsbCxtb2Q6YX19LEJOLnByb3RvdHlwZS5kaXZtb2Q9ZnVuY3Rpb24gZGl2bW9kKG51bSxtb2RlLHBvc2l0aXZlKXtyZXR1cm4gYXNzZXJ0KCFudW0uaXNaZXJvKCkpLHRoaXMuaXNaZXJvKCk/e2RpdjpuZXcgQk4oMCksbW9kOm5ldyBCTigwKX06MCE9PXRoaXMubmVnYXRpdmUmJjA9PT1udW0ubmVnYXRpdmU/KHJlcz10aGlzLm5lZygpLmRpdm1vZChudW0sbW9kZSksIm1vZCIhPT1tb2RlJiYoZGl2PXJlcy5kaXYubmVnKCkpLCJkaXYiIT09bW9kZSYmKG1vZD1yZXMubW9kLm5lZygpLHBvc2l0aXZlJiYwIT09bW9kLm5lZ2F0aXZlJiZtb2QuaWFkZChudW0pKSx7ZGl2LG1vZH0pOjA9PT10aGlzLm5lZ2F0aXZlJiYwIT09bnVtLm5lZ2F0aXZlPyhyZXM9dGhpcy5kaXZtb2QobnVtLm5lZygpLG1vZGUpLCJtb2QiIT09bW9kZSYmKGRpdj1yZXMuZGl2Lm5lZygpKSx7ZGl2LG1vZDpyZXMubW9kfSk6MCE9PSh0aGlzLm5lZ2F0aXZlJm51bS5uZWdhdGl2ZSk/KHJlcz10aGlzLm5lZygpLmRpdm1vZChudW0ubmVnKCksbW9kZSksImRpdiIhPT1tb2RlJiYobW9kPXJlcy5tb2QubmVnKCkscG9zaXRpdmUmJjAhPT1tb2QubmVnYXRpdmUmJm1vZC5pc3ViKG51bSkpLHtkaXY6cmVzLmRpdixtb2R9KTpudW0ubGVuZ3RoPnRoaXMubGVuZ3RofHx0aGlzLmNtcChudW0pPDA/e2RpdjpuZXcgQk4oMCksbW9kOnRoaXN9OjE9PT1udW0ubGVuZ3RoPyJkaXYiPT09bW9kZT97ZGl2OnRoaXMuZGl2bihudW0ud29yZHNbMF0pLG1vZDpudWxsfToibW9kIj09PW1vZGU/e2RpdjpudWxsLG1vZDpuZXcgQk4odGhpcy5tb2RybihudW0ud29yZHNbMF0pKX06e2Rpdjp0aGlzLmRpdm4obnVtLndvcmRzWzBdKSxtb2Q6bmV3IEJOKHRoaXMubW9kcm4obnVtLndvcmRzWzBdKSl9OnRoaXMuX3dvcmREaXYobnVtLG1vZGUpO3ZhciBkaXYsbW9kLHJlc30sQk4ucHJvdG90eXBlLmRpdj1mdW5jdGlvbiBkaXYobnVtKXtyZXR1cm4gdGhpcy5kaXZtb2QobnVtLCJkaXYiLCExKS5kaXZ9LEJOLnByb3RvdHlwZS5tb2Q9ZnVuY3Rpb24gbW9kKG51bSl7cmV0dXJuIHRoaXMuZGl2bW9kKG51bSwibW9kIiwhMSkubW9kfSxCTi5wcm90b3R5cGUudW1vZD1mdW5jdGlvbiB1bW9kKG51bSl7cmV0dXJuIHRoaXMuZGl2bW9kKG51bSwibW9kIiwhMCkubW9kfSxCTi5wcm90b3R5cGUuZGl2Um91bmQ9ZnVuY3Rpb24gZGl2Um91bmQobnVtKXt2YXIgZG09dGhpcy5kaXZtb2QobnVtKTtpZihkbS5tb2QuaXNaZXJvKCkpcmV0dXJuIGRtLmRpdjt2YXIgbW9kPTAhPT1kbS5kaXYubmVnYXRpdmU/ZG0ubW9kLmlzdWIobnVtKTpkbS5tb2QsaGFsZj1udW0udXNocm4oMSkscjI9bnVtLmFuZGxuKDEpLGNtcD1tb2QuY21wKGhhbGYpO3JldHVybiBjbXA8MHx8MT09PXIyJiYwPT09Y21wP2RtLmRpdjowIT09ZG0uZGl2Lm5lZ2F0aXZlP2RtLmRpdi5pc3VibigxKTpkbS5kaXYuaWFkZG4oMSl9LEJOLnByb3RvdHlwZS5tb2Rybj1mdW5jdGlvbiBtb2RybihudW0pe3ZhciBpc05lZ051bT1udW08MDtpc05lZ051bSYmKG51bT0tbnVtKSxhc3NlcnQobnVtPD02NzEwODg2Myk7Zm9yKHZhciBwPSgxPDwyNiklbnVtLGFjYz0wLGk9dGhpcy5sZW5ndGgtMTtpPj0wO2ktLSlhY2M9KHAqYWNjKygwfHRoaXMud29yZHNbaV0pKSVudW07cmV0dXJuIGlzTmVnTnVtPy1hY2M6YWNjfSxCTi5wcm90b3R5cGUubW9kbj1mdW5jdGlvbiBtb2RuKG51bSl7cmV0dXJuIHRoaXMubW9kcm4obnVtKX0sQk4ucHJvdG90eXBlLmlkaXZuPWZ1bmN0aW9uIGlkaXZuKG51bSl7dmFyIGlzTmVnTnVtPW51bTwwO2lzTmVnTnVtJiYobnVtPS1udW0pLGFzc2VydChudW08PTY3MTA4ODYzKTtmb3IodmFyIGNhcnJ5PTAsaT10aGlzLmxlbmd0aC0xO2k+PTA7aS0tKXt2YXIgdz0oMHx0aGlzLndvcmRzW2ldKSs2NzEwODg2NCpjYXJyeTt0aGlzLndvcmRzW2ldPXcvbnVtfDAsY2Fycnk9dyVudW19cmV0dXJuIHRoaXMuX3N0cmlwKCksaXNOZWdOdW0/dGhpcy5pbmVnKCk6dGhpc30sQk4ucHJvdG90eXBlLmRpdm49ZnVuY3Rpb24gZGl2bihudW0pe3JldHVybiB0aGlzLmNsb25lKCkuaWRpdm4obnVtKX0sQk4ucHJvdG90eXBlLmVnY2Q9ZnVuY3Rpb24gZWdjZChwKXthc3NlcnQoMD09PXAubmVnYXRpdmUpLGFzc2VydCghcC5pc1plcm8oKSk7dmFyIHg9dGhpcyx5PXAuY2xvbmUoKTt4PTAhPT14Lm5lZ2F0aXZlP3gudW1vZChwKTp4LmNsb25lKCk7Zm9yKHZhciBBPW5ldyBCTigxKSxCPW5ldyBCTigwKSxDPW5ldyBCTigwKSxEPW5ldyBCTigxKSxnPTA7eC5pc0V2ZW4oKSYmeS5pc0V2ZW4oKTspeC5pdXNocm4oMSkseS5pdXNocm4oMSksKytnO2Zvcih2YXIgeXA9eS5jbG9uZSgpLHhwPXguY2xvbmUoKTsheC5pc1plcm8oKTspe2Zvcih2YXIgaT0wLGltPTE7MD09PSh4LndvcmRzWzBdJmltKSYmaTwyNjsrK2ksaW08PD0xKTtpZihpPjApZm9yKHguaXVzaHJuKGkpO2ktLSA+MDspKEEuaXNPZGQoKXx8Qi5pc09kZCgpKSYmKEEuaWFkZCh5cCksQi5pc3ViKHhwKSksQS5pdXNocm4oMSksQi5pdXNocm4oMSk7Zm9yKHZhciBqPTAsam09MTswPT09KHkud29yZHNbMF0mam0pJiZqPDI2OysraixqbTw8PTEpO2lmKGo+MClmb3IoeS5pdXNocm4oaik7ai0tID4wOykoQy5pc09kZCgpfHxELmlzT2RkKCkpJiYoQy5pYWRkKHlwKSxELmlzdWIoeHApKSxDLml1c2hybigxKSxELml1c2hybigxKTt4LmNtcCh5KT49MD8oeC5pc3ViKHkpLEEuaXN1YihDKSxCLmlzdWIoRCkpOih5LmlzdWIoeCksQy5pc3ViKEEpLEQuaXN1YihCKSl9cmV0dXJue2E6QyxiOkQsZ2NkOnkuaXVzaGxuKGcpfX0sQk4ucHJvdG90eXBlLl9pbnZtcD1mdW5jdGlvbiBfaW52bXAocCl7YXNzZXJ0KDA9PT1wLm5lZ2F0aXZlKSxhc3NlcnQoIXAuaXNaZXJvKCkpO3ZhciBhPXRoaXMsYj1wLmNsb25lKCk7YT0wIT09YS5uZWdhdGl2ZT9hLnVtb2QocCk6YS5jbG9uZSgpO2Zvcih2YXIgcmVzLHgxPW5ldyBCTigxKSx4Mj1uZXcgQk4oMCksZGVsdGE9Yi5jbG9uZSgpO2EuY21wbigxKT4wJiZiLmNtcG4oMSk+MDspe2Zvcih2YXIgaT0wLGltPTE7MD09PShhLndvcmRzWzBdJmltKSYmaTwyNjsrK2ksaW08PD0xKTtpZihpPjApZm9yKGEuaXVzaHJuKGkpO2ktLSA+MDspeDEuaXNPZGQoKSYmeDEuaWFkZChkZWx0YSkseDEuaXVzaHJuKDEpO2Zvcih2YXIgaj0wLGptPTE7MD09PShiLndvcmRzWzBdJmptKSYmajwyNjsrK2osam08PD0xKTtpZihqPjApZm9yKGIuaXVzaHJuKGopO2otLSA+MDspeDIuaXNPZGQoKSYmeDIuaWFkZChkZWx0YSkseDIuaXVzaHJuKDEpO2EuY21wKGIpPj0wPyhhLmlzdWIoYikseDEuaXN1Yih4MikpOihiLmlzdWIoYSkseDIuaXN1Yih4MSkpfXJldHVybihyZXM9MD09PWEuY21wbigxKT94MTp4MikuY21wbigwKTwwJiZyZXMuaWFkZChwKSxyZXN9LEJOLnByb3RvdHlwZS5nY2Q9ZnVuY3Rpb24gZ2NkKG51bSl7aWYodGhpcy5pc1plcm8oKSlyZXR1cm4gbnVtLmFicygpO2lmKG51bS5pc1plcm8oKSlyZXR1cm4gdGhpcy5hYnMoKTt2YXIgYT10aGlzLmNsb25lKCksYj1udW0uY2xvbmUoKTthLm5lZ2F0aXZlPTAsYi5uZWdhdGl2ZT0wO2Zvcih2YXIgc2hpZnQ9MDthLmlzRXZlbigpJiZiLmlzRXZlbigpO3NoaWZ0KyspYS5pdXNocm4oMSksYi5pdXNocm4oMSk7Zm9yKDs7KXtmb3IoO2EuaXNFdmVuKCk7KWEuaXVzaHJuKDEpO2Zvcig7Yi5pc0V2ZW4oKTspYi5pdXNocm4oMSk7dmFyIHI9YS5jbXAoYik7aWYocjwwKXt2YXIgdD1hO2E9YixiPXR9ZWxzZSBpZigwPT09cnx8MD09PWIuY21wbigxKSlicmVhazthLmlzdWIoYil9cmV0dXJuIGIuaXVzaGxuKHNoaWZ0KX0sQk4ucHJvdG90eXBlLmludm09ZnVuY3Rpb24gaW52bShudW0pe3JldHVybiB0aGlzLmVnY2QobnVtKS5hLnVtb2QobnVtKX0sQk4ucHJvdG90eXBlLmlzRXZlbj1mdW5jdGlvbiBpc0V2ZW4oKXtyZXR1cm4hKDEmdGhpcy53b3Jkc1swXSl9LEJOLnByb3RvdHlwZS5pc09kZD1mdW5jdGlvbiBpc09kZCgpe3JldHVybiEoMSZ+dGhpcy53b3Jkc1swXSl9LEJOLnByb3RvdHlwZS5hbmRsbj1mdW5jdGlvbiBhbmRsbihudW0pe3JldHVybiB0aGlzLndvcmRzWzBdJm51bX0sQk4ucHJvdG90eXBlLmJpbmNuPWZ1bmN0aW9uIGJpbmNuKGJpdCl7YXNzZXJ0KCJudW1iZXIiPT10eXBlb2YgYml0KTt2YXIgcj1iaXQlMjYscz0oYml0LXIpLzI2LHE9MTw8cjtpZih0aGlzLmxlbmd0aDw9cylyZXR1cm4gdGhpcy5fZXhwYW5kKHMrMSksdGhpcy53b3Jkc1tzXXw9cSx0aGlzO2Zvcih2YXIgY2Fycnk9cSxpPXM7MCE9PWNhcnJ5JiZpPHRoaXMubGVuZ3RoO2krKyl7dmFyIHc9MHx0aGlzLndvcmRzW2ldO2NhcnJ5PSh3Kz1jYXJyeSk+Pj4yNix3Jj02NzEwODg2Myx0aGlzLndvcmRzW2ldPXd9cmV0dXJuIDAhPT1jYXJyeSYmKHRoaXMud29yZHNbaV09Y2FycnksdGhpcy5sZW5ndGgrKyksdGhpc30sQk4ucHJvdG90eXBlLmlzWmVybz1mdW5jdGlvbiBpc1plcm8oKXtyZXR1cm4gMT09PXRoaXMubGVuZ3RoJiYwPT09dGhpcy53b3Jkc1swXX0sQk4ucHJvdG90eXBlLmNtcG49ZnVuY3Rpb24gY21wbihudW0pe3ZhciByZXMsbmVnYXRpdmU9bnVtPDA7aWYoMCE9PXRoaXMubmVnYXRpdmUmJiFuZWdhdGl2ZSlyZXR1cm4tMTtpZigwPT09dGhpcy5uZWdhdGl2ZSYmbmVnYXRpdmUpcmV0dXJuIDE7aWYodGhpcy5fc3RyaXAoKSx0aGlzLmxlbmd0aD4xKXJlcz0xO2Vsc2V7bmVnYXRpdmUmJihudW09LW51bSksYXNzZXJ0KG51bTw9NjcxMDg4NjMsIk51bWJlciBpcyB0b28gYmlnIik7dmFyIHc9MHx0aGlzLndvcmRzWzBdO3Jlcz13PT09bnVtPzA6dzxudW0/LTE6MX1yZXR1cm4gMCE9PXRoaXMubmVnYXRpdmU/MHwtcmVzOnJlc30sQk4ucHJvdG90eXBlLmNtcD1mdW5jdGlvbiBjbXAobnVtKXtpZigwIT09dGhpcy5uZWdhdGl2ZSYmMD09PW51bS5uZWdhdGl2ZSlyZXR1cm4tMTtpZigwPT09dGhpcy5uZWdhdGl2ZSYmMCE9PW51bS5uZWdhdGl2ZSlyZXR1cm4gMTt2YXIgcmVzPXRoaXMudWNtcChudW0pO3JldHVybiAwIT09dGhpcy5uZWdhdGl2ZT8wfC1yZXM6cmVzfSxCTi5wcm90b3R5cGUudWNtcD1mdW5jdGlvbiB1Y21wKG51bSl7aWYodGhpcy5sZW5ndGg+bnVtLmxlbmd0aClyZXR1cm4gMTtpZih0aGlzLmxlbmd0aDxudW0ubGVuZ3RoKXJldHVybi0xO2Zvcih2YXIgcmVzPTAsaT10aGlzLmxlbmd0aC0xO2k+PTA7aS0tKXt2YXIgYT0wfHRoaXMud29yZHNbaV0sYj0wfG51bS53b3Jkc1tpXTtpZihhIT09Yil7YTxiP3Jlcz0tMTphPmImJihyZXM9MSk7YnJlYWt9fXJldHVybiByZXN9LEJOLnByb3RvdHlwZS5ndG49ZnVuY3Rpb24gZ3RuKG51bSl7cmV0dXJuIDE9PT10aGlzLmNtcG4obnVtKX0sQk4ucHJvdG90eXBlLmd0PWZ1bmN0aW9uIGd0KG51bSl7cmV0dXJuIDE9PT10aGlzLmNtcChudW0pfSxCTi5wcm90b3R5cGUuZ3Rlbj1mdW5jdGlvbiBndGVuKG51bSl7cmV0dXJuIHRoaXMuY21wbihudW0pPj0wfSxCTi5wcm90b3R5cGUuZ3RlPWZ1bmN0aW9uIGd0ZShudW0pe3JldHVybiB0aGlzLmNtcChudW0pPj0wfSxCTi5wcm90b3R5cGUubHRuPWZ1bmN0aW9uIGx0bihudW0pe3JldHVybi0xPT09dGhpcy5jbXBuKG51bSl9LEJOLnByb3RvdHlwZS5sdD1mdW5jdGlvbiBsdChudW0pe3JldHVybi0xPT09dGhpcy5jbXAobnVtKX0sQk4ucHJvdG90eXBlLmx0ZW49ZnVuY3Rpb24gbHRlbihudW0pe3JldHVybiB0aGlzLmNtcG4obnVtKTw9MH0sQk4ucHJvdG90eXBlLmx0ZT1mdW5jdGlvbiBsdGUobnVtKXtyZXR1cm4gdGhpcy5jbXAobnVtKTw9MH0sQk4ucHJvdG90eXBlLmVxbj1mdW5jdGlvbiBlcW4obnVtKXtyZXR1cm4gMD09PXRoaXMuY21wbihudW0pfSxCTi5wcm90b3R5cGUuZXE9ZnVuY3Rpb24gZXEobnVtKXtyZXR1cm4gMD09PXRoaXMuY21wKG51bSl9LEJOLnJlZD1mdW5jdGlvbiByZWQobnVtKXtyZXR1cm4gbmV3IFJlZChudW0pfSxCTi5wcm90b3R5cGUudG9SZWQ9ZnVuY3Rpb24gdG9SZWQoY3R4KXtyZXR1cm4gYXNzZXJ0KCF0aGlzLnJlZCwiQWxyZWFkeSBhIG51bWJlciBpbiByZWR1Y3Rpb24gY29udGV4dCIpLGFzc2VydCgwPT09dGhpcy5uZWdhdGl2ZSwicmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMiKSxjdHguY29udmVydFRvKHRoaXMpLl9mb3JjZVJlZChjdHgpfSxCTi5wcm90b3R5cGUuZnJvbVJlZD1mdW5jdGlvbiBmcm9tUmVkKCl7cmV0dXJuIGFzc2VydCh0aGlzLnJlZCwiZnJvbVJlZCB3b3JrcyBvbmx5IHdpdGggbnVtYmVycyBpbiByZWR1Y3Rpb24gY29udGV4dCIpLHRoaXMucmVkLmNvbnZlcnRGcm9tKHRoaXMpfSxCTi5wcm90b3R5cGUuX2ZvcmNlUmVkPWZ1bmN0aW9uIF9mb3JjZVJlZChjdHgpe3JldHVybiB0aGlzLnJlZD1jdHgsdGhpc30sQk4ucHJvdG90eXBlLmZvcmNlUmVkPWZ1bmN0aW9uIGZvcmNlUmVkKGN0eCl7cmV0dXJuIGFzc2VydCghdGhpcy5yZWQsIkFscmVhZHkgYSBudW1iZXIgaW4gcmVkdWN0aW9uIGNvbnRleHQiKSx0aGlzLl9mb3JjZVJlZChjdHgpfSxCTi5wcm90b3R5cGUucmVkQWRkPWZ1bmN0aW9uIHJlZEFkZChudW0pe3JldHVybiBhc3NlcnQodGhpcy5yZWQsInJlZEFkZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5hZGQodGhpcyxudW0pfSxCTi5wcm90b3R5cGUucmVkSUFkZD1mdW5jdGlvbiByZWRJQWRkKG51bSl7cmV0dXJuIGFzc2VydCh0aGlzLnJlZCwicmVkSUFkZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5pYWRkKHRoaXMsbnVtKX0sQk4ucHJvdG90eXBlLnJlZFN1Yj1mdW5jdGlvbiByZWRTdWIobnVtKXtyZXR1cm4gYXNzZXJ0KHRoaXMucmVkLCJyZWRTdWIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuc3ViKHRoaXMsbnVtKX0sQk4ucHJvdG90eXBlLnJlZElTdWI9ZnVuY3Rpb24gcmVkSVN1YihudW0pe3JldHVybiBhc3NlcnQodGhpcy5yZWQsInJlZElTdWIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuaXN1Yih0aGlzLG51bSl9LEJOLnByb3RvdHlwZS5yZWRTaGw9ZnVuY3Rpb24gcmVkU2hsKG51bSl7cmV0dXJuIGFzc2VydCh0aGlzLnJlZCwicmVkU2hsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLnNobCh0aGlzLG51bSl9LEJOLnByb3RvdHlwZS5yZWRNdWw9ZnVuY3Rpb24gcmVkTXVsKG51bSl7cmV0dXJuIGFzc2VydCh0aGlzLnJlZCwicmVkTXVsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLl92ZXJpZnkyKHRoaXMsbnVtKSx0aGlzLnJlZC5tdWwodGhpcyxudW0pfSxCTi5wcm90b3R5cGUucmVkSU11bD1mdW5jdGlvbiByZWRJTXVsKG51bSl7cmV0dXJuIGFzc2VydCh0aGlzLnJlZCwicmVkTXVsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLl92ZXJpZnkyKHRoaXMsbnVtKSx0aGlzLnJlZC5pbXVsKHRoaXMsbnVtKX0sQk4ucHJvdG90eXBlLnJlZFNxcj1mdW5jdGlvbiByZWRTcXIoKXtyZXR1cm4gYXNzZXJ0KHRoaXMucmVkLCJyZWRTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQuc3FyKHRoaXMpfSxCTi5wcm90b3R5cGUucmVkSVNxcj1mdW5jdGlvbiByZWRJU3FyKCl7cmV0dXJuIGFzc2VydCh0aGlzLnJlZCwicmVkSVNxciB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSx0aGlzLnJlZC5pc3FyKHRoaXMpfSxCTi5wcm90b3R5cGUucmVkU3FydD1mdW5jdGlvbiByZWRTcXJ0KCl7cmV0dXJuIGFzc2VydCh0aGlzLnJlZCwicmVkU3FydCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSx0aGlzLnJlZC5zcXJ0KHRoaXMpfSxCTi5wcm90b3R5cGUucmVkSW52bT1mdW5jdGlvbiByZWRJbnZtKCl7cmV0dXJuIGFzc2VydCh0aGlzLnJlZCwicmVkSW52bSB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSx0aGlzLnJlZC5pbnZtKHRoaXMpfSxCTi5wcm90b3R5cGUucmVkTmVnPWZ1bmN0aW9uIHJlZE5lZygpe3JldHVybiBhc3NlcnQodGhpcy5yZWQsInJlZE5lZyB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSx0aGlzLnJlZC5uZWcodGhpcyl9LEJOLnByb3RvdHlwZS5yZWRQb3c9ZnVuY3Rpb24gcmVkUG93KG51bSl7cmV0dXJuIGFzc2VydCh0aGlzLnJlZCYmIW51bS5yZWQsInJlZFBvdyhub3JtYWxOdW0pIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQucG93KHRoaXMsbnVtKX07dmFyIHByaW1lcz17azI1NjpudWxsLHAyMjQ6bnVsbCxwMTkyOm51bGwscDI1NTE5Om51bGx9O2Z1bmN0aW9uIE1QcmltZShuYW1lLHApe3RoaXMubmFtZT1uYW1lLHRoaXMucD1uZXcgQk4ocCwxNiksdGhpcy5uPXRoaXMucC5iaXRMZW5ndGgoKSx0aGlzLms9bmV3IEJOKDEpLml1c2hsbih0aGlzLm4pLmlzdWIodGhpcy5wKSx0aGlzLnRtcD10aGlzLl90bXAoKX1mdW5jdGlvbiBLMjU2KCl7TVByaW1lLmNhbGwodGhpcywiazI1NiIsImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmYzJmIil9ZnVuY3Rpb24gUDIyNCgpe01QcmltZS5jYWxsKHRoaXMsInAyMjQiLCJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMSIpfWZ1bmN0aW9uIFAxOTIoKXtNUHJpbWUuY2FsbCh0aGlzLCJwMTkyIiwiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZmZmYgZmZmZmZmZmYiKX1mdW5jdGlvbiBQMjU1MTkoKXtNUHJpbWUuY2FsbCh0aGlzLCIyNTUxOSIsIjdmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZWQiKX1mdW5jdGlvbiBSZWQobSl7aWYoInN0cmluZyI9PXR5cGVvZiBtKXt2YXIgcHJpbWU9Qk4uX3ByaW1lKG0pO3RoaXMubT1wcmltZS5wLHRoaXMucHJpbWU9cHJpbWV9ZWxzZSBhc3NlcnQobS5ndG4oMSksIm1vZHVsdXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMSIpLHRoaXMubT1tLHRoaXMucHJpbWU9bnVsbH1mdW5jdGlvbiBNb250KG0pe1JlZC5jYWxsKHRoaXMsbSksdGhpcy5zaGlmdD10aGlzLm0uYml0TGVuZ3RoKCksdGhpcy5zaGlmdCUyNiE9MCYmKHRoaXMuc2hpZnQrPTI2LXRoaXMuc2hpZnQlMjYpLHRoaXMucj1uZXcgQk4oMSkuaXVzaGxuKHRoaXMuc2hpZnQpLHRoaXMucjI9dGhpcy5pbW9kKHRoaXMuci5zcXIoKSksdGhpcy5yaW52PXRoaXMuci5faW52bXAodGhpcy5tKSx0aGlzLm1pbnY9dGhpcy5yaW52Lm11bCh0aGlzLnIpLmlzdWJuKDEpLmRpdih0aGlzLm0pLHRoaXMubWludj10aGlzLm1pbnYudW1vZCh0aGlzLnIpLHRoaXMubWludj10aGlzLnIuc3ViKHRoaXMubWludil9TVByaW1lLnByb3RvdHlwZS5fdG1wPWZ1bmN0aW9uIF90bXAoKXt2YXIgdG1wPW5ldyBCTihudWxsKTtyZXR1cm4gdG1wLndvcmRzPW5ldyBBcnJheShNYXRoLmNlaWwodGhpcy5uLzEzKSksdG1wfSxNUHJpbWUucHJvdG90eXBlLmlyZWR1Y2U9ZnVuY3Rpb24gaXJlZHVjZShudW0pe3ZhciBybGVuLHI9bnVtO2Rve3RoaXMuc3BsaXQocix0aGlzLnRtcCkscmxlbj0ocj0ocj10aGlzLmltdWxLKHIpKS5pYWRkKHRoaXMudG1wKSkuYml0TGVuZ3RoKCl9d2hpbGUocmxlbj50aGlzLm4pO3ZhciBjbXA9cmxlbjx0aGlzLm4/LTE6ci51Y21wKHRoaXMucCk7cmV0dXJuIDA9PT1jbXA/KHIud29yZHNbMF09MCxyLmxlbmd0aD0xKTpjbXA+MD9yLmlzdWIodGhpcy5wKTp2b2lkIDAhPT1yLnN0cmlwP3Iuc3RyaXAoKTpyLl9zdHJpcCgpLHJ9LE1QcmltZS5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24gc3BsaXQoaW5wdXQsb3V0KXtpbnB1dC5pdXNocm4odGhpcy5uLDAsb3V0KX0sTVByaW1lLnByb3RvdHlwZS5pbXVsSz1mdW5jdGlvbiBpbXVsSyhudW0pe3JldHVybiBudW0uaW11bCh0aGlzLmspfSxpbmhlcml0cyhLMjU2LE1QcmltZSksSzI1Ni5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24gc3BsaXQoaW5wdXQsb3V0cHV0KXtmb3IodmFyIG91dExlbj1NYXRoLm1pbihpbnB1dC5sZW5ndGgsOSksaT0wO2k8b3V0TGVuO2krKylvdXRwdXQud29yZHNbaV09aW5wdXQud29yZHNbaV07aWYob3V0cHV0Lmxlbmd0aD1vdXRMZW4saW5wdXQubGVuZ3RoPD05KXJldHVybiBpbnB1dC53b3Jkc1swXT0wLHZvaWQoaW5wdXQubGVuZ3RoPTEpO3ZhciBwcmV2PWlucHV0LndvcmRzWzldO2ZvcihvdXRwdXQud29yZHNbb3V0cHV0Lmxlbmd0aCsrXT00MTk0MzAzJnByZXYsaT0xMDtpPGlucHV0Lmxlbmd0aDtpKyspe3ZhciBuZXh0PTB8aW5wdXQud29yZHNbaV07aW5wdXQud29yZHNbaS0xMF09KDQxOTQzMDMmbmV4dCk8PDR8cHJldj4+PjIyLHByZXY9bmV4dH1wcmV2Pj4+PTIyLGlucHV0LndvcmRzW2ktMTBdPXByZXYsMD09PXByZXYmJmlucHV0Lmxlbmd0aD4xMD9pbnB1dC5sZW5ndGgtPTEwOmlucHV0Lmxlbmd0aC09OX0sSzI1Ni5wcm90b3R5cGUuaW11bEs9ZnVuY3Rpb24gaW11bEsobnVtKXtudW0ud29yZHNbbnVtLmxlbmd0aF09MCxudW0ud29yZHNbbnVtLmxlbmd0aCsxXT0wLG51bS5sZW5ndGgrPTI7Zm9yKHZhciBsbz0wLGk9MDtpPG51bS5sZW5ndGg7aSsrKXt2YXIgdz0wfG51bS53b3Jkc1tpXTtsbys9OTc3KncsbnVtLndvcmRzW2ldPTY3MTA4ODYzJmxvLGxvPTY0KncrKGxvLzY3MTA4ODY0fDApfXJldHVybiAwPT09bnVtLndvcmRzW251bS5sZW5ndGgtMV0mJihudW0ubGVuZ3RoLS0sMD09PW51bS53b3Jkc1tudW0ubGVuZ3RoLTFdJiZudW0ubGVuZ3RoLS0pLG51bX0saW5oZXJpdHMoUDIyNCxNUHJpbWUpLGluaGVyaXRzKFAxOTIsTVByaW1lKSxpbmhlcml0cyhQMjU1MTksTVByaW1lKSxQMjU1MTkucHJvdG90eXBlLmltdWxLPWZ1bmN0aW9uIGltdWxLKG51bSl7Zm9yKHZhciBjYXJyeT0wLGk9MDtpPG51bS5sZW5ndGg7aSsrKXt2YXIgaGk9MTkqKDB8bnVtLndvcmRzW2ldKStjYXJyeSxsbz02NzEwODg2MyZoaTtoaT4+Pj0yNixudW0ud29yZHNbaV09bG8sY2Fycnk9aGl9cmV0dXJuIDAhPT1jYXJyeSYmKG51bS53b3Jkc1tudW0ubGVuZ3RoKytdPWNhcnJ5KSxudW19LEJOLl9wcmltZT1mdW5jdGlvbiBwcmltZShuYW1lKXtpZihwcmltZXNbbmFtZV0pcmV0dXJuIHByaW1lc1tuYW1lXTt2YXIgcHJpbWU7aWYoImsyNTYiPT09bmFtZSlwcmltZT1uZXcgSzI1NjtlbHNlIGlmKCJwMjI0Ij09PW5hbWUpcHJpbWU9bmV3IFAyMjQ7ZWxzZSBpZigicDE5MiI9PT1uYW1lKXByaW1lPW5ldyBQMTkyO2Vsc2V7aWYoInAyNTUxOSIhPT1uYW1lKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBwcmltZSAiK25hbWUpO3ByaW1lPW5ldyBQMjU1MTl9cmV0dXJuIHByaW1lc1tuYW1lXT1wcmltZSxwcmltZX0sUmVkLnByb3RvdHlwZS5fdmVyaWZ5MT1mdW5jdGlvbiBfdmVyaWZ5MShhKXthc3NlcnQoMD09PWEubmVnYXRpdmUsInJlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzIiksYXNzZXJ0KGEucmVkLCJyZWQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIil9LFJlZC5wcm90b3R5cGUuX3ZlcmlmeTI9ZnVuY3Rpb24gX3ZlcmlmeTIoYSxiKXthc3NlcnQoMD09PShhLm5lZ2F0aXZlfGIubmVnYXRpdmUpLCJyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcyIpLGFzc2VydChhLnJlZCYmYS5yZWQ9PT1iLnJlZCwicmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpfSxSZWQucHJvdG90eXBlLmltb2Q9ZnVuY3Rpb24gaW1vZChhKXtyZXR1cm4gdGhpcy5wcmltZT90aGlzLnByaW1lLmlyZWR1Y2UoYSkuX2ZvcmNlUmVkKHRoaXMpOihtb3ZlKGEsYS51bW9kKHRoaXMubSkuX2ZvcmNlUmVkKHRoaXMpKSxhKX0sUmVkLnByb3RvdHlwZS5uZWc9ZnVuY3Rpb24gbmVnKGEpe3JldHVybiBhLmlzWmVybygpP2EuY2xvbmUoKTp0aGlzLm0uc3ViKGEpLl9mb3JjZVJlZCh0aGlzKX0sUmVkLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24gYWRkKGEsYil7dGhpcy5fdmVyaWZ5MihhLGIpO3ZhciByZXM9YS5hZGQoYik7cmV0dXJuIHJlcy5jbXAodGhpcy5tKT49MCYmcmVzLmlzdWIodGhpcy5tKSxyZXMuX2ZvcmNlUmVkKHRoaXMpfSxSZWQucHJvdG90eXBlLmlhZGQ9ZnVuY3Rpb24gaWFkZChhLGIpe3RoaXMuX3ZlcmlmeTIoYSxiKTt2YXIgcmVzPWEuaWFkZChiKTtyZXR1cm4gcmVzLmNtcCh0aGlzLm0pPj0wJiZyZXMuaXN1Yih0aGlzLm0pLHJlc30sUmVkLnByb3RvdHlwZS5zdWI9ZnVuY3Rpb24gc3ViKGEsYil7dGhpcy5fdmVyaWZ5MihhLGIpO3ZhciByZXM9YS5zdWIoYik7cmV0dXJuIHJlcy5jbXBuKDApPDAmJnJlcy5pYWRkKHRoaXMubSkscmVzLl9mb3JjZVJlZCh0aGlzKX0sUmVkLnByb3RvdHlwZS5pc3ViPWZ1bmN0aW9uIGlzdWIoYSxiKXt0aGlzLl92ZXJpZnkyKGEsYik7dmFyIHJlcz1hLmlzdWIoYik7cmV0dXJuIHJlcy5jbXBuKDApPDAmJnJlcy5pYWRkKHRoaXMubSkscmVzfSxSZWQucHJvdG90eXBlLnNobD1mdW5jdGlvbiBzaGwoYSxudW0pe3JldHVybiB0aGlzLl92ZXJpZnkxKGEpLHRoaXMuaW1vZChhLnVzaGxuKG51bSkpfSxSZWQucHJvdG90eXBlLmltdWw9ZnVuY3Rpb24gaW11bChhLGIpe3JldHVybiB0aGlzLl92ZXJpZnkyKGEsYiksdGhpcy5pbW9kKGEuaW11bChiKSl9LFJlZC5wcm90b3R5cGUubXVsPWZ1bmN0aW9uIG11bChhLGIpe3JldHVybiB0aGlzLl92ZXJpZnkyKGEsYiksdGhpcy5pbW9kKGEubXVsKGIpKX0sUmVkLnByb3RvdHlwZS5pc3FyPWZ1bmN0aW9uIGlzcXIoYSl7cmV0dXJuIHRoaXMuaW11bChhLGEuY2xvbmUoKSl9LFJlZC5wcm90b3R5cGUuc3FyPWZ1bmN0aW9uIHNxcihhKXtyZXR1cm4gdGhpcy5tdWwoYSxhKX0sUmVkLnByb3RvdHlwZS5zcXJ0PWZ1bmN0aW9uIHNxcnQoYSl7aWYoYS5pc1plcm8oKSlyZXR1cm4gYS5jbG9uZSgpO3ZhciBtb2QzPXRoaXMubS5hbmRsbigzKTtpZihhc3NlcnQobW9kMyUyPT0xKSwzPT09bW9kMyl7dmFyIHBvdz10aGlzLm0uYWRkKG5ldyBCTigxKSkuaXVzaHJuKDIpO3JldHVybiB0aGlzLnBvdyhhLHBvdyl9Zm9yKHZhciBxPXRoaXMubS5zdWJuKDEpLHM9MDshcS5pc1plcm8oKSYmMD09PXEuYW5kbG4oMSk7KXMrKyxxLml1c2hybigxKTthc3NlcnQoIXEuaXNaZXJvKCkpO3ZhciBvbmU9bmV3IEJOKDEpLnRvUmVkKHRoaXMpLG5PbmU9b25lLnJlZE5lZygpLGxwb3c9dGhpcy5tLnN1Ym4oMSkuaXVzaHJuKDEpLHo9dGhpcy5tLmJpdExlbmd0aCgpO2Zvcih6PW5ldyBCTigyKnoqeikudG9SZWQodGhpcyk7MCE9PXRoaXMucG93KHosbHBvdykuY21wKG5PbmUpOyl6LnJlZElBZGQobk9uZSk7Zm9yKHZhciBjPXRoaXMucG93KHoscSkscj10aGlzLnBvdyhhLHEuYWRkbigxKS5pdXNocm4oMSkpLHQ9dGhpcy5wb3coYSxxKSxtPXM7MCE9PXQuY21wKG9uZSk7KXtmb3IodmFyIHRtcD10LGk9MDswIT09dG1wLmNtcChvbmUpO2krKyl0bXA9dG1wLnJlZFNxcigpO2Fzc2VydChpPG0pO3ZhciBiPXRoaXMucG93KGMsbmV3IEJOKDEpLml1c2hsbihtLWktMSkpO3I9ci5yZWRNdWwoYiksYz1iLnJlZFNxcigpLHQ9dC5yZWRNdWwoYyksbT1pfXJldHVybiByfSxSZWQucHJvdG90eXBlLmludm09ZnVuY3Rpb24gaW52bShhKXt2YXIgaW52PWEuX2ludm1wKHRoaXMubSk7cmV0dXJuIDAhPT1pbnYubmVnYXRpdmU/KGludi5uZWdhdGl2ZT0wLHRoaXMuaW1vZChpbnYpLnJlZE5lZygpKTp0aGlzLmltb2QoaW52KX0sUmVkLnByb3RvdHlwZS5wb3c9ZnVuY3Rpb24gcG93KGEsbnVtKXtpZihudW0uaXNaZXJvKCkpcmV0dXJuIG5ldyBCTigxKS50b1JlZCh0aGlzKTtpZigwPT09bnVtLmNtcG4oMSkpcmV0dXJuIGEuY2xvbmUoKTt2YXIgd25kPW5ldyBBcnJheSgxNik7d25kWzBdPW5ldyBCTigxKS50b1JlZCh0aGlzKSx3bmRbMV09YTtmb3IodmFyIGk9MjtpPHduZC5sZW5ndGg7aSsrKXduZFtpXT10aGlzLm11bCh3bmRbaS0xXSxhKTt2YXIgcmVzPXduZFswXSxjdXJyZW50PTAsY3VycmVudExlbj0wLHN0YXJ0PW51bS5iaXRMZW5ndGgoKSUyNjtmb3IoMD09PXN0YXJ0JiYoc3RhcnQ9MjYpLGk9bnVtLmxlbmd0aC0xO2k+PTA7aS0tKXtmb3IodmFyIHdvcmQ9bnVtLndvcmRzW2ldLGo9c3RhcnQtMTtqPj0wO2otLSl7dmFyIGJpdD13b3JkPj5qJjE7cmVzIT09d25kWzBdJiYocmVzPXRoaXMuc3FyKHJlcykpLDAhPT1iaXR8fDAhPT1jdXJyZW50PyhjdXJyZW50PDw9MSxjdXJyZW50fD1iaXQsKDQ9PT0rK2N1cnJlbnRMZW58fDA9PT1pJiYwPT09aikmJihyZXM9dGhpcy5tdWwocmVzLHduZFtjdXJyZW50XSksY3VycmVudExlbj0wLGN1cnJlbnQ9MCkpOmN1cnJlbnRMZW49MH1zdGFydD0yNn1yZXR1cm4gcmVzfSxSZWQucHJvdG90eXBlLmNvbnZlcnRUbz1mdW5jdGlvbiBjb252ZXJ0VG8obnVtKXt2YXIgcj1udW0udW1vZCh0aGlzLm0pO3JldHVybiByPT09bnVtP3IuY2xvbmUoKTpyfSxSZWQucHJvdG90eXBlLmNvbnZlcnRGcm9tPWZ1bmN0aW9uIGNvbnZlcnRGcm9tKG51bSl7dmFyIHJlcz1udW0uY2xvbmUoKTtyZXR1cm4gcmVzLnJlZD1udWxsLHJlc30sQk4ubW9udD1mdW5jdGlvbiBtb250KG51bSl7cmV0dXJuIG5ldyBNb250KG51bSl9LGluaGVyaXRzKE1vbnQsUmVkKSxNb250LnByb3RvdHlwZS5jb252ZXJ0VG89ZnVuY3Rpb24gY29udmVydFRvKG51bSl7cmV0dXJuIHRoaXMuaW1vZChudW0udXNobG4odGhpcy5zaGlmdCkpfSxNb250LnByb3RvdHlwZS5jb252ZXJ0RnJvbT1mdW5jdGlvbiBjb252ZXJ0RnJvbShudW0pe3ZhciByPXRoaXMuaW1vZChudW0ubXVsKHRoaXMucmludikpO3JldHVybiByLnJlZD1udWxsLHJ9LE1vbnQucHJvdG90eXBlLmltdWw9ZnVuY3Rpb24gaW11bChhLGIpe2lmKGEuaXNaZXJvKCl8fGIuaXNaZXJvKCkpcmV0dXJuIGEud29yZHNbMF09MCxhLmxlbmd0aD0xLGE7dmFyIHQ9YS5pbXVsKGIpLGM9dC5tYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5taW52KS5pbWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubSksdT10LmlzdWIoYykuaXVzaHJuKHRoaXMuc2hpZnQpLHJlcz11O3JldHVybiB1LmNtcCh0aGlzLm0pPj0wP3Jlcz11LmlzdWIodGhpcy5tKTp1LmNtcG4oMCk8MCYmKHJlcz11LmlhZGQodGhpcy5tKSkscmVzLl9mb3JjZVJlZCh0aGlzKX0sTW9udC5wcm90b3R5cGUubXVsPWZ1bmN0aW9uIG11bChhLGIpe2lmKGEuaXNaZXJvKCl8fGIuaXNaZXJvKCkpcmV0dXJuIG5ldyBCTigwKS5fZm9yY2VSZWQodGhpcyk7dmFyIHQ9YS5tdWwoYiksYz10Lm1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm1pbnYpLmltYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5tKSx1PXQuaXN1YihjKS5pdXNocm4odGhpcy5zaGlmdCkscmVzPXU7cmV0dXJuIHUuY21wKHRoaXMubSk+PTA/cmVzPXUuaXN1Yih0aGlzLm0pOnUuY21wbigwKTwwJiYocmVzPXUuaWFkZCh0aGlzLm0pKSxyZXMuX2ZvcmNlUmVkKHRoaXMpfSxNb250LnByb3RvdHlwZS5pbnZtPWZ1bmN0aW9uIGludm0oYSl7cmV0dXJuIHRoaXMuaW1vZChhLl9pbnZtcCh0aGlzLm0pLm11bCh0aGlzLnIyKSkuX2ZvcmNlUmVkKHRoaXMpfX0obW9kdWxlPV9fd2VicGFja19yZXF1aXJlX18ubm1kKG1vZHVsZSksdGhpcyl9LCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1zaWduL2FsZ29zLmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijttb2R1bGUuZXhwb3J0cz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1zaWduL2Jyb3dzZXIvYWxnb3JpdGhtcy5qc29uIil9LCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1zaWduL2Jyb3dzZXIvaW5kZXguanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBCdWZmZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3NhZmUtYnVmZmVyL2luZGV4LmpzIikuQnVmZmVyLGNyZWF0ZUhhc2g9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2NyZWF0ZS1oYXNoL2Jyb3dzZXIuanMiKSxzdHJlYW09X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9yZWFkYWJsZS1icm93c2VyLmpzIiksaW5oZXJpdHM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiKSxzaWduPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LXNpZ24vYnJvd3Nlci9zaWduLmpzIiksdmVyaWZ5PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LXNpZ24vYnJvd3Nlci92ZXJpZnkuanMiKSxhbGdvcml0aG1zPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LXNpZ24vYnJvd3Nlci9hbGdvcml0aG1zLmpzb24iKTtmdW5jdGlvbiBTaWduKGFsZ29yaXRobSl7c3RyZWFtLldyaXRhYmxlLmNhbGwodGhpcyk7dmFyIGRhdGE9YWxnb3JpdGhtc1thbGdvcml0aG1dO2lmKCFkYXRhKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBtZXNzYWdlIGRpZ2VzdCIpO3RoaXMuX2hhc2hUeXBlPWRhdGEuaGFzaCx0aGlzLl9oYXNoPWNyZWF0ZUhhc2goZGF0YS5oYXNoKSx0aGlzLl90YWc9ZGF0YS5pZCx0aGlzLl9zaWduVHlwZT1kYXRhLnNpZ259ZnVuY3Rpb24gVmVyaWZ5KGFsZ29yaXRobSl7c3RyZWFtLldyaXRhYmxlLmNhbGwodGhpcyk7dmFyIGRhdGE9YWxnb3JpdGhtc1thbGdvcml0aG1dO2lmKCFkYXRhKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBtZXNzYWdlIGRpZ2VzdCIpO3RoaXMuX2hhc2g9Y3JlYXRlSGFzaChkYXRhLmhhc2gpLHRoaXMuX3RhZz1kYXRhLmlkLHRoaXMuX3NpZ25UeXBlPWRhdGEuc2lnbn1mdW5jdGlvbiBjcmVhdGVTaWduKGFsZ29yaXRobSl7cmV0dXJuIG5ldyBTaWduKGFsZ29yaXRobSl9ZnVuY3Rpb24gY3JlYXRlVmVyaWZ5KGFsZ29yaXRobSl7cmV0dXJuIG5ldyBWZXJpZnkoYWxnb3JpdGhtKX1PYmplY3Qua2V5cyhhbGdvcml0aG1zKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSl7YWxnb3JpdGhtc1trZXldLmlkPUJ1ZmZlci5mcm9tKGFsZ29yaXRobXNba2V5XS5pZCwiaGV4IiksYWxnb3JpdGhtc1trZXkudG9Mb3dlckNhc2UoKV09YWxnb3JpdGhtc1trZXldfSksaW5oZXJpdHMoU2lnbixzdHJlYW0uV3JpdGFibGUpLFNpZ24ucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbiBfd3JpdGUoZGF0YSxfLGRvbmUpe3RoaXMuX2hhc2gudXBkYXRlKGRhdGEpLGRvbmUoKX0sU2lnbi5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uIHVwZGF0ZShkYXRhLGVuYyl7cmV0dXJuIHRoaXMuX2hhc2gudXBkYXRlKCJzdHJpbmciPT10eXBlb2YgZGF0YT9CdWZmZXIuZnJvbShkYXRhLGVuYyk6ZGF0YSksdGhpc30sU2lnbi5wcm90b3R5cGUuc2lnbj1mdW5jdGlvbiBzaWduTWV0aG9kKGtleSxlbmMpe3RoaXMuZW5kKCk7dmFyIGhhc2g9dGhpcy5faGFzaC5kaWdlc3QoKSxzaWc9c2lnbihoYXNoLGtleSx0aGlzLl9oYXNoVHlwZSx0aGlzLl9zaWduVHlwZSx0aGlzLl90YWcpO3JldHVybiBlbmM/c2lnLnRvU3RyaW5nKGVuYyk6c2lnfSxpbmhlcml0cyhWZXJpZnksc3RyZWFtLldyaXRhYmxlKSxWZXJpZnkucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbiBfd3JpdGUoZGF0YSxfLGRvbmUpe3RoaXMuX2hhc2gudXBkYXRlKGRhdGEpLGRvbmUoKX0sVmVyaWZ5LnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24gdXBkYXRlKGRhdGEsZW5jKXtyZXR1cm4gdGhpcy5faGFzaC51cGRhdGUoInN0cmluZyI9PXR5cGVvZiBkYXRhP0J1ZmZlci5mcm9tKGRhdGEsZW5jKTpkYXRhKSx0aGlzfSxWZXJpZnkucHJvdG90eXBlLnZlcmlmeT1mdW5jdGlvbiB2ZXJpZnlNZXRob2Qoa2V5LHNpZyxlbmMpe3ZhciBzaWdCdWZmZXI9InN0cmluZyI9PXR5cGVvZiBzaWc/QnVmZmVyLmZyb20oc2lnLGVuYyk6c2lnO3RoaXMuZW5kKCk7dmFyIGhhc2g9dGhpcy5faGFzaC5kaWdlc3QoKTtyZXR1cm4gdmVyaWZ5KHNpZ0J1ZmZlcixoYXNoLGtleSx0aGlzLl9zaWduVHlwZSx0aGlzLl90YWcpfSxtb2R1bGUuZXhwb3J0cz17U2lnbjpjcmVhdGVTaWduLFZlcmlmeTpjcmVhdGVWZXJpZnksY3JlYXRlU2lnbixjcmVhdGVWZXJpZnl9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktc2lnbi9icm93c2VyL3NpZ24uanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBCdWZmZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3NhZmUtYnVmZmVyL2luZGV4LmpzIikuQnVmZmVyLGNyZWF0ZUhtYWM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2NyZWF0ZS1obWFjL2Jyb3dzZXIuanMiKSxjcnQ9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktcnNhL2luZGV4LmpzIiksRUM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy5qcyIpLmVjLEJOPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LXNpZ24vbm9kZV9tb2R1bGVzL2JuLmpzL2xpYi9ibi5qcyIpLHBhcnNlS2V5cz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvcGFyc2UtYXNuMS9pbmRleC5qcyIpLGN1cnZlcz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1zaWduL2Jyb3dzZXIvY3VydmVzLmpzb24iKTtmdW5jdGlvbiBnZXRLZXkoeCxxLGhhc2gsYWxnbyl7aWYoKHg9QnVmZmVyLmZyb20oeC50b0FycmF5KCkpKS5sZW5ndGg8cS5ieXRlTGVuZ3RoKCkpe3ZhciB6ZXJvcz1CdWZmZXIuYWxsb2MocS5ieXRlTGVuZ3RoKCkteC5sZW5ndGgpO3g9QnVmZmVyLmNvbmNhdChbemVyb3MseF0pfXZhciBobGVuPWhhc2gubGVuZ3RoLGhiaXRzPWZ1bmN0aW9uIGJpdHMyb2N0ZXRzKGJpdHMscSl7Yml0cz1iaXRzMmludChiaXRzLHEpLGJpdHM9Yml0cy5tb2QocSk7dmFyIG91dD1CdWZmZXIuZnJvbShiaXRzLnRvQXJyYXkoKSk7aWYob3V0Lmxlbmd0aDxxLmJ5dGVMZW5ndGgoKSl7dmFyIHplcm9zPUJ1ZmZlci5hbGxvYyhxLmJ5dGVMZW5ndGgoKS1vdXQubGVuZ3RoKTtvdXQ9QnVmZmVyLmNvbmNhdChbemVyb3Msb3V0XSl9cmV0dXJuIG91dH0oaGFzaCxxKSx2PUJ1ZmZlci5hbGxvYyhobGVuKTt2LmZpbGwoMSk7dmFyIGs9QnVmZmVyLmFsbG9jKGhsZW4pO3JldHVybiBrPWNyZWF0ZUhtYWMoYWxnbyxrKS51cGRhdGUodikudXBkYXRlKEJ1ZmZlci5mcm9tKFswXSkpLnVwZGF0ZSh4KS51cGRhdGUoaGJpdHMpLmRpZ2VzdCgpLHY9Y3JlYXRlSG1hYyhhbGdvLGspLnVwZGF0ZSh2KS5kaWdlc3QoKSx7azprPWNyZWF0ZUhtYWMoYWxnbyxrKS51cGRhdGUodikudXBkYXRlKEJ1ZmZlci5mcm9tKFsxXSkpLnVwZGF0ZSh4KS51cGRhdGUoaGJpdHMpLmRpZ2VzdCgpLHY6dj1jcmVhdGVIbWFjKGFsZ28saykudXBkYXRlKHYpLmRpZ2VzdCgpfX1mdW5jdGlvbiBiaXRzMmludChvYml0cyxxKXt2YXIgYml0cz1uZXcgQk4ob2JpdHMpLHNoaWZ0PShvYml0cy5sZW5ndGg8PDMpLXEuYml0TGVuZ3RoKCk7cmV0dXJuIHNoaWZ0PjAmJmJpdHMuaXNocm4oc2hpZnQpLGJpdHN9ZnVuY3Rpb24gbWFrZUtleShxLGt2LGFsZ28pe3ZhciB0LGs7ZG97Zm9yKHQ9QnVmZmVyLmFsbG9jKDApOzgqdC5sZW5ndGg8cS5iaXRMZW5ndGgoKTspa3Yudj1jcmVhdGVIbWFjKGFsZ28sa3YuaykudXBkYXRlKGt2LnYpLmRpZ2VzdCgpLHQ9QnVmZmVyLmNvbmNhdChbdCxrdi52XSk7az1iaXRzMmludCh0LHEpLGt2Lms9Y3JlYXRlSG1hYyhhbGdvLGt2LmspLnVwZGF0ZShrdi52KS51cGRhdGUoQnVmZmVyLmZyb20oWzBdKSkuZGlnZXN0KCksa3Yudj1jcmVhdGVIbWFjKGFsZ28sa3YuaykudXBkYXRlKGt2LnYpLmRpZ2VzdCgpfXdoaWxlKC0xIT09ay5jbXAocSkpO3JldHVybiBrfWZ1bmN0aW9uIG1ha2VSKGcsayxwLHEpe3JldHVybiBnLnRvUmVkKEJOLm1vbnQocCkpLnJlZFBvdyhrKS5mcm9tUmVkKCkubW9kKHEpfW1vZHVsZS5leHBvcnRzPWZ1bmN0aW9uIHNpZ24oaGFzaCxrZXksaGFzaFR5cGUsc2lnblR5cGUsdGFnKXt2YXIgcHJpdj1wYXJzZUtleXMoa2V5KTtpZihwcml2LmN1cnZlKXtpZigiZWNkc2EiIT09c2lnblR5cGUmJiJlY2RzYS9yc2EiIT09c2lnblR5cGUpdGhyb3cgbmV3IEVycm9yKCJ3cm9uZyBwcml2YXRlIGtleSB0eXBlIik7cmV0dXJuIGZ1bmN0aW9uIGVjU2lnbihoYXNoLHByaXYpe3ZhciBjdXJ2ZUlkPWN1cnZlc1twcml2LmN1cnZlLmpvaW4oIi4iKV07aWYoIWN1cnZlSWQpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIGN1cnZlICIrcHJpdi5jdXJ2ZS5qb2luKCIuIikpO3ZhciBrZXk9bmV3IEVDKGN1cnZlSWQpLmtleUZyb21Qcml2YXRlKHByaXYucHJpdmF0ZUtleSksb3V0PWtleS5zaWduKGhhc2gpO3JldHVybiBCdWZmZXIuZnJvbShvdXQudG9ERVIoKSl9KGhhc2gscHJpdil9aWYoImRzYSI9PT1wcml2LnR5cGUpe2lmKCJkc2EiIT09c2lnblR5cGUpdGhyb3cgbmV3IEVycm9yKCJ3cm9uZyBwcml2YXRlIGtleSB0eXBlIik7cmV0dXJuIGZ1bmN0aW9uIGRzYVNpZ24oaGFzaCxwcml2LGFsZ28pe3ZhciBrLHg9cHJpdi5wYXJhbXMucHJpdl9rZXkscD1wcml2LnBhcmFtcy5wLHE9cHJpdi5wYXJhbXMucSxnPXByaXYucGFyYW1zLmcscj1uZXcgQk4oMCksSD1iaXRzMmludChoYXNoLHEpLm1vZChxKSxzPSExLGt2PWdldEtleSh4LHEsaGFzaCxhbGdvKTtmb3IoOyExPT09czspcj1tYWtlUihnLGs9bWFrZUtleShxLGt2LGFsZ28pLHAscSksMD09PShzPWsuaW52bShxKS5pbXVsKEguYWRkKHgubXVsKHIpKSkubW9kKHEpKS5jbXBuKDApJiYocz0hMSxyPW5ldyBCTigwKSk7cmV0dXJuIGZ1bmN0aW9uIHRvREVSKHIscyl7cj1yLnRvQXJyYXkoKSxzPXMudG9BcnJheSgpLDEyOCZyWzBdJiYocj1bMF0uY29uY2F0KHIpKTsxMjgmc1swXSYmKHM9WzBdLmNvbmNhdChzKSk7dmFyIHRvdGFsPXIubGVuZ3RoK3MubGVuZ3RoKzQscmVzPVs0OCx0b3RhbCwyLHIubGVuZ3RoXTtyZXR1cm4gcmVzPXJlcy5jb25jYXQocixbMixzLmxlbmd0aF0scyksQnVmZmVyLmZyb20ocmVzKX0ocixzKX0oaGFzaCxwcml2LGhhc2hUeXBlKX1pZigicnNhIiE9PXNpZ25UeXBlJiYiZWNkc2EvcnNhIiE9PXNpZ25UeXBlKXRocm93IG5ldyBFcnJvcigid3JvbmcgcHJpdmF0ZSBrZXkgdHlwZSIpO2lmKHZvaWQgMCE9PWtleS5wYWRkaW5nJiYxIT09a2V5LnBhZGRpbmcpdGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIG9yIHVuc3VwcG9ydGVkIHBhZGRpbmcgbW9kZSIpO2hhc2g9QnVmZmVyLmNvbmNhdChbdGFnLGhhc2hdKTtmb3IodmFyIGxlbj1wcml2Lm1vZHVsdXMuYnl0ZUxlbmd0aCgpLHBhZD1bMCwxXTtoYXNoLmxlbmd0aCtwYWQubGVuZ3RoKzE8bGVuOylwYWQucHVzaCgyNTUpO3BhZC5wdXNoKDApO2Zvcih2YXIgaT0tMTsrK2k8aGFzaC5sZW5ndGg7KXBhZC5wdXNoKGhhc2hbaV0pO3JldHVybiBjcnQocGFkLHByaXYpfSxtb2R1bGUuZXhwb3J0cy5nZXRLZXk9Z2V0S2V5LG1vZHVsZS5leHBvcnRzLm1ha2VLZXk9bWFrZUtleX0sIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LXNpZ24vYnJvd3Nlci92ZXJpZnkuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBCdWZmZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3NhZmUtYnVmZmVyL2luZGV4LmpzIikuQnVmZmVyLEJOPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LXNpZ24vbm9kZV9tb2R1bGVzL2JuLmpzL2xpYi9ibi5qcyIpLEVDPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMuanMiKS5lYyxwYXJzZUtleXM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3BhcnNlLWFzbjEvaW5kZXguanMiKSxjdXJ2ZXM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktc2lnbi9icm93c2VyL2N1cnZlcy5qc29uIik7ZnVuY3Rpb24gY2hlY2tWYWx1ZShiLHEpe2lmKGIuY21wbigwKTw9MCl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgc2lnIik7aWYoYi5jbXAocSk+PTApdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNpZyIpfW1vZHVsZS5leHBvcnRzPWZ1bmN0aW9uIHZlcmlmeShzaWcsaGFzaCxrZXksc2lnblR5cGUsdGFnKXt2YXIgcHViPXBhcnNlS2V5cyhrZXkpO2lmKCJlYyI9PT1wdWIudHlwZSl7aWYoImVjZHNhIiE9PXNpZ25UeXBlJiYiZWNkc2EvcnNhIiE9PXNpZ25UeXBlKXRocm93IG5ldyBFcnJvcigid3JvbmcgcHVibGljIGtleSB0eXBlIik7cmV0dXJuIGZ1bmN0aW9uIGVjVmVyaWZ5KHNpZyxoYXNoLHB1Yil7dmFyIGN1cnZlSWQ9Y3VydmVzW3B1Yi5kYXRhLmFsZ29yaXRobS5jdXJ2ZS5qb2luKCIuIildO2lmKCFjdXJ2ZUlkKXRocm93IG5ldyBFcnJvcigidW5rbm93biBjdXJ2ZSAiK3B1Yi5kYXRhLmFsZ29yaXRobS5jdXJ2ZS5qb2luKCIuIikpO3ZhciBjdXJ2ZT1uZXcgRUMoY3VydmVJZCkscHVia2V5PXB1Yi5kYXRhLnN1YmplY3RQcml2YXRlS2V5LmRhdGE7cmV0dXJuIGN1cnZlLnZlcmlmeShoYXNoLHNpZyxwdWJrZXkpfShzaWcsaGFzaCxwdWIpfWlmKCJkc2EiPT09cHViLnR5cGUpe2lmKCJkc2EiIT09c2lnblR5cGUpdGhyb3cgbmV3IEVycm9yKCJ3cm9uZyBwdWJsaWMga2V5IHR5cGUiKTtyZXR1cm4gZnVuY3Rpb24gZHNhVmVyaWZ5KHNpZyxoYXNoLHB1Yil7dmFyIHA9cHViLmRhdGEucCxxPXB1Yi5kYXRhLnEsZz1wdWIuZGF0YS5nLHk9cHViLmRhdGEucHViX2tleSx1bnBhY2tlZD1wYXJzZUtleXMuc2lnbmF0dXJlLmRlY29kZShzaWcsImRlciIpLHM9dW5wYWNrZWQucyxyPXVucGFja2VkLnI7Y2hlY2tWYWx1ZShzLHEpLGNoZWNrVmFsdWUocixxKTt2YXIgbW9udHA9Qk4ubW9udChwKSx3PXMuaW52bShxKSx2PWcudG9SZWQobW9udHApLnJlZFBvdyhuZXcgQk4oaGFzaCkubXVsKHcpLm1vZChxKSkuZnJvbVJlZCgpLm11bCh5LnRvUmVkKG1vbnRwKS5yZWRQb3coci5tdWwodykubW9kKHEpKS5mcm9tUmVkKCkpLm1vZChwKS5tb2QocSk7cmV0dXJuIDA9PT12LmNtcChyKX0oc2lnLGhhc2gscHViKX1pZigicnNhIiE9PXNpZ25UeXBlJiYiZWNkc2EvcnNhIiE9PXNpZ25UeXBlKXRocm93IG5ldyBFcnJvcigid3JvbmcgcHVibGljIGtleSB0eXBlIik7aGFzaD1CdWZmZXIuY29uY2F0KFt0YWcsaGFzaF0pO2Zvcih2YXIgbGVuPXB1Yi5tb2R1bHVzLmJ5dGVMZW5ndGgoKSxwYWQ9WzFdLHBhZE51bT0wO2hhc2gubGVuZ3RoK3BhZC5sZW5ndGgrMjxsZW47KXBhZC5wdXNoKDI1NSkscGFkTnVtKz0xO3BhZC5wdXNoKDApO2Zvcih2YXIgaT0tMTsrK2k8aGFzaC5sZW5ndGg7KXBhZC5wdXNoKGhhc2hbaV0pO3BhZD1CdWZmZXIuZnJvbShwYWQpO3ZhciByZWQ9Qk4ubW9udChwdWIubW9kdWx1cyk7c2lnPShzaWc9bmV3IEJOKHNpZykudG9SZWQocmVkKSkucmVkUG93KG5ldyBCTihwdWIucHVibGljRXhwb25lbnQpKSxzaWc9QnVmZmVyLmZyb20oc2lnLmZyb21SZWQoKS50b0FycmF5KCkpO3ZhciBvdXQ9cGFkTnVtPDg/MTowO2ZvcihsZW49TWF0aC5taW4oc2lnLmxlbmd0aCxwYWQubGVuZ3RoKSxzaWcubGVuZ3RoIT09cGFkLmxlbmd0aCYmKG91dD0xKSxpPS0xOysraTxsZW47KW91dHw9c2lnW2ldXnBhZFtpXTtyZXR1cm4gMD09PW91dH19LCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1zaWduL25vZGVfbW9kdWxlcy9ibi5qcy9saWIvYm4uanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7IWZ1bmN0aW9uKG1vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYXNzZXJ0KHZhbCxtc2cpe2lmKCF2YWwpdGhyb3cgbmV3IEVycm9yKG1zZ3x8IkFzc2VydGlvbiBmYWlsZWQiKX1mdW5jdGlvbiBpbmhlcml0cyhjdG9yLHN1cGVyQ3Rvcil7Y3Rvci5zdXBlcl89c3VwZXJDdG9yO3ZhciBUZW1wQ3Rvcj1mdW5jdGlvbigpe307VGVtcEN0b3IucHJvdG90eXBlPXN1cGVyQ3Rvci5wcm90b3R5cGUsY3Rvci5wcm90b3R5cGU9bmV3IFRlbXBDdG9yLGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yPWN0b3J9ZnVuY3Rpb24gQk4obnVtYmVyLGJhc2UsZW5kaWFuKXtpZihCTi5pc0JOKG51bWJlcikpcmV0dXJuIG51bWJlcjt0aGlzLm5lZ2F0aXZlPTAsdGhpcy53b3Jkcz1udWxsLHRoaXMubGVuZ3RoPTAsdGhpcy5yZWQ9bnVsbCxudWxsIT09bnVtYmVyJiYoImxlIiE9PWJhc2UmJiJiZSIhPT1iYXNlfHwoZW5kaWFuPWJhc2UsYmFzZT0xMCksdGhpcy5faW5pdChudW1iZXJ8fDAsYmFzZXx8MTAsZW5kaWFufHwiYmUiKSl9dmFyIEJ1ZmZlcjsib2JqZWN0Ij09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1CTjpleHBvcnRzLkJOPUJOLEJOLkJOPUJOLEJOLndvcmRTaXplPTI2O3RyeXtCdWZmZXI9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJnZvaWQgMCE9PXdpbmRvdy5CdWZmZXI/d2luZG93LkJ1ZmZlcjpfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzIikuQnVmZmVyfWNhdGNoKGUpe31mdW5jdGlvbiBwYXJzZUhleDRCaXRzKHN0cmluZyxpbmRleCl7dmFyIGM9c3RyaW5nLmNoYXJDb2RlQXQoaW5kZXgpO3JldHVybiBjPj00OCYmYzw9NTc/Yy00ODpjPj02NSYmYzw9NzA/Yy01NTpjPj05NyYmYzw9MTAyP2MtODc6dm9pZCBhc3NlcnQoITEsIkludmFsaWQgY2hhcmFjdGVyIGluICIrc3RyaW5nKX1mdW5jdGlvbiBwYXJzZUhleEJ5dGUoc3RyaW5nLGxvd2VyQm91bmQsaW5kZXgpe3ZhciByPXBhcnNlSGV4NEJpdHMoc3RyaW5nLGluZGV4KTtyZXR1cm4gaW5kZXgtMT49bG93ZXJCb3VuZCYmKHJ8PXBhcnNlSGV4NEJpdHMoc3RyaW5nLGluZGV4LTEpPDw0KSxyfWZ1bmN0aW9uIHBhcnNlQmFzZShzdHIsc3RhcnQsZW5kLG11bCl7Zm9yKHZhciByPTAsYj0wLGxlbj1NYXRoLm1pbihzdHIubGVuZ3RoLGVuZCksaT1zdGFydDtpPGxlbjtpKyspe3ZhciBjPXN0ci5jaGFyQ29kZUF0KGkpLTQ4O3IqPW11bCxiPWM+PTQ5P2MtNDkrMTA6Yz49MTc/Yy0xNysxMDpjLGFzc2VydChjPj0wJiZiPG11bCwiSW52YWxpZCBjaGFyYWN0ZXIiKSxyKz1ifXJldHVybiByfWZ1bmN0aW9uIG1vdmUoZGVzdCxzcmMpe2Rlc3Qud29yZHM9c3JjLndvcmRzLGRlc3QubGVuZ3RoPXNyYy5sZW5ndGgsZGVzdC5uZWdhdGl2ZT1zcmMubmVnYXRpdmUsZGVzdC5yZWQ9c3JjLnJlZH1pZihCTi5pc0JOPWZ1bmN0aW9uIGlzQk4obnVtKXtyZXR1cm4gbnVtIGluc3RhbmNlb2YgQk58fG51bGwhPT1udW0mJiJvYmplY3QiPT10eXBlb2YgbnVtJiZudW0uY29uc3RydWN0b3Iud29yZFNpemU9PT1CTi53b3JkU2l6ZSYmQXJyYXkuaXNBcnJheShudW0ud29yZHMpfSxCTi5tYXg9ZnVuY3Rpb24gbWF4KGxlZnQscmlnaHQpe3JldHVybiBsZWZ0LmNtcChyaWdodCk+MD9sZWZ0OnJpZ2h0fSxCTi5taW49ZnVuY3Rpb24gbWluKGxlZnQscmlnaHQpe3JldHVybiBsZWZ0LmNtcChyaWdodCk8MD9sZWZ0OnJpZ2h0fSxCTi5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24gaW5pdChudW1iZXIsYmFzZSxlbmRpYW4pe2lmKCJudW1iZXIiPT10eXBlb2YgbnVtYmVyKXJldHVybiB0aGlzLl9pbml0TnVtYmVyKG51bWJlcixiYXNlLGVuZGlhbik7aWYoIm9iamVjdCI9PXR5cGVvZiBudW1iZXIpcmV0dXJuIHRoaXMuX2luaXRBcnJheShudW1iZXIsYmFzZSxlbmRpYW4pOyJoZXgiPT09YmFzZSYmKGJhc2U9MTYpLGFzc2VydChiYXNlPT09KDB8YmFzZSkmJmJhc2U+PTImJmJhc2U8PTM2KTt2YXIgc3RhcnQ9MDsiLSI9PT0obnVtYmVyPW51bWJlci50b1N0cmluZygpLnJlcGxhY2UoL1xzKy9nLCIiKSlbMF0mJihzdGFydCsrLHRoaXMubmVnYXRpdmU9MSksc3RhcnQ8bnVtYmVyLmxlbmd0aCYmKDE2PT09YmFzZT90aGlzLl9wYXJzZUhleChudW1iZXIsc3RhcnQsZW5kaWFuKToodGhpcy5fcGFyc2VCYXNlKG51bWJlcixiYXNlLHN0YXJ0KSwibGUiPT09ZW5kaWFuJiZ0aGlzLl9pbml0QXJyYXkodGhpcy50b0FycmF5KCksYmFzZSxlbmRpYW4pKSl9LEJOLnByb3RvdHlwZS5faW5pdE51bWJlcj1mdW5jdGlvbiBfaW5pdE51bWJlcihudW1iZXIsYmFzZSxlbmRpYW4pe251bWJlcjwwJiYodGhpcy5uZWdhdGl2ZT0xLG51bWJlcj0tbnVtYmVyKSxudW1iZXI8NjcxMDg4NjQ/KHRoaXMud29yZHM9WzY3MTA4ODYzJm51bWJlcl0sdGhpcy5sZW5ndGg9MSk6bnVtYmVyPDQ1MDM1OTk2MjczNzA0OTY/KHRoaXMud29yZHM9WzY3MTA4ODYzJm51bWJlcixudW1iZXIvNjcxMDg4NjQmNjcxMDg4NjNdLHRoaXMubGVuZ3RoPTIpOihhc3NlcnQobnVtYmVyPDkwMDcxOTkyNTQ3NDA5OTIpLHRoaXMud29yZHM9WzY3MTA4ODYzJm51bWJlcixudW1iZXIvNjcxMDg4NjQmNjcxMDg4NjMsMV0sdGhpcy5sZW5ndGg9MyksImxlIj09PWVuZGlhbiYmdGhpcy5faW5pdEFycmF5KHRoaXMudG9BcnJheSgpLGJhc2UsZW5kaWFuKX0sQk4ucHJvdG90eXBlLl9pbml0QXJyYXk9ZnVuY3Rpb24gX2luaXRBcnJheShudW1iZXIsYmFzZSxlbmRpYW4pe2lmKGFzc2VydCgibnVtYmVyIj09dHlwZW9mIG51bWJlci5sZW5ndGgpLG51bWJlci5sZW5ndGg8PTApcmV0dXJuIHRoaXMud29yZHM9WzBdLHRoaXMubGVuZ3RoPTEsdGhpczt0aGlzLmxlbmd0aD1NYXRoLmNlaWwobnVtYmVyLmxlbmd0aC8zKSx0aGlzLndvcmRzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCk7Zm9yKHZhciBpPTA7aTx0aGlzLmxlbmd0aDtpKyspdGhpcy53b3Jkc1tpXT0wO3ZhciBqLHcsb2ZmPTA7aWYoImJlIj09PWVuZGlhbilmb3IoaT1udW1iZXIubGVuZ3RoLTEsaj0wO2k+PTA7aS09Myl3PW51bWJlcltpXXxudW1iZXJbaS0xXTw8OHxudW1iZXJbaS0yXTw8MTYsdGhpcy53b3Jkc1tqXXw9dzw8b2ZmJjY3MTA4ODYzLHRoaXMud29yZHNbaisxXT13Pj4+MjYtb2ZmJjY3MTA4ODYzLChvZmYrPTI0KT49MjYmJihvZmYtPTI2LGorKyk7ZWxzZSBpZigibGUiPT09ZW5kaWFuKWZvcihpPTAsaj0wO2k8bnVtYmVyLmxlbmd0aDtpKz0zKXc9bnVtYmVyW2ldfG51bWJlcltpKzFdPDw4fG51bWJlcltpKzJdPDwxNix0aGlzLndvcmRzW2pdfD13PDxvZmYmNjcxMDg4NjMsdGhpcy53b3Jkc1tqKzFdPXc+Pj4yNi1vZmYmNjcxMDg4NjMsKG9mZis9MjQpPj0yNiYmKG9mZi09MjYsaisrKTtyZXR1cm4gdGhpcy5fc3RyaXAoKX0sQk4ucHJvdG90eXBlLl9wYXJzZUhleD1mdW5jdGlvbiBfcGFyc2VIZXgobnVtYmVyLHN0YXJ0LGVuZGlhbil7dGhpcy5sZW5ndGg9TWF0aC5jZWlsKChudW1iZXIubGVuZ3RoLXN0YXJ0KS82KSx0aGlzLndvcmRzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCk7Zm9yKHZhciBpPTA7aTx0aGlzLmxlbmd0aDtpKyspdGhpcy53b3Jkc1tpXT0wO3ZhciB3LG9mZj0wLGo9MDtpZigiYmUiPT09ZW5kaWFuKWZvcihpPW51bWJlci5sZW5ndGgtMTtpPj1zdGFydDtpLT0yKXc9cGFyc2VIZXhCeXRlKG51bWJlcixzdGFydCxpKTw8b2ZmLHRoaXMud29yZHNbal18PTY3MTA4ODYzJncsb2ZmPj0xOD8ob2ZmLT0xOCxqKz0xLHRoaXMud29yZHNbal18PXc+Pj4yNik6b2ZmKz04O2Vsc2UgZm9yKGk9KG51bWJlci5sZW5ndGgtc3RhcnQpJTI9PTA/c3RhcnQrMTpzdGFydDtpPG51bWJlci5sZW5ndGg7aSs9Mil3PXBhcnNlSGV4Qnl0ZShudW1iZXIsc3RhcnQsaSk8PG9mZix0aGlzLndvcmRzW2pdfD02NzEwODg2MyZ3LG9mZj49MTg/KG9mZi09MTgsais9MSx0aGlzLndvcmRzW2pdfD13Pj4+MjYpOm9mZis9ODt0aGlzLl9zdHJpcCgpfSxCTi5wcm90b3R5cGUuX3BhcnNlQmFzZT1mdW5jdGlvbiBfcGFyc2VCYXNlKG51bWJlcixiYXNlLHN0YXJ0KXt0aGlzLndvcmRzPVswXSx0aGlzLmxlbmd0aD0xO2Zvcih2YXIgbGltYkxlbj0wLGxpbWJQb3c9MTtsaW1iUG93PD02NzEwODg2MztsaW1iUG93Kj1iYXNlKWxpbWJMZW4rKztsaW1iTGVuLS0sbGltYlBvdz1saW1iUG93L2Jhc2V8MDtmb3IodmFyIHRvdGFsPW51bWJlci5sZW5ndGgtc3RhcnQsbW9kPXRvdGFsJWxpbWJMZW4sZW5kPU1hdGgubWluKHRvdGFsLHRvdGFsLW1vZCkrc3RhcnQsd29yZD0wLGk9c3RhcnQ7aTxlbmQ7aSs9bGltYkxlbil3b3JkPXBhcnNlQmFzZShudW1iZXIsaSxpK2xpbWJMZW4sYmFzZSksdGhpcy5pbXVsbihsaW1iUG93KSx0aGlzLndvcmRzWzBdK3dvcmQ8NjcxMDg4NjQ/dGhpcy53b3Jkc1swXSs9d29yZDp0aGlzLl9pYWRkbih3b3JkKTtpZigwIT09bW9kKXt2YXIgcG93PTE7Zm9yKHdvcmQ9cGFyc2VCYXNlKG51bWJlcixpLG51bWJlci5sZW5ndGgsYmFzZSksaT0wO2k8bW9kO2krKylwb3cqPWJhc2U7dGhpcy5pbXVsbihwb3cpLHRoaXMud29yZHNbMF0rd29yZDw2NzEwODg2ND90aGlzLndvcmRzWzBdKz13b3JkOnRoaXMuX2lhZGRuKHdvcmQpfXRoaXMuX3N0cmlwKCl9LEJOLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uIGNvcHkoZGVzdCl7ZGVzdC53b3Jkcz1uZXcgQXJyYXkodGhpcy5sZW5ndGgpO2Zvcih2YXIgaT0wO2k8dGhpcy5sZW5ndGg7aSsrKWRlc3Qud29yZHNbaV09dGhpcy53b3Jkc1tpXTtkZXN0Lmxlbmd0aD10aGlzLmxlbmd0aCxkZXN0Lm5lZ2F0aXZlPXRoaXMubmVnYXRpdmUsZGVzdC5yZWQ9dGhpcy5yZWR9LEJOLnByb3RvdHlwZS5fbW92ZT1mdW5jdGlvbiBfbW92ZShkZXN0KXttb3ZlKGRlc3QsdGhpcyl9LEJOLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbiBjbG9uZSgpe3ZhciByPW5ldyBCTihudWxsKTtyZXR1cm4gdGhpcy5jb3B5KHIpLHJ9LEJOLnByb3RvdHlwZS5fZXhwYW5kPWZ1bmN0aW9uIF9leHBhbmQoc2l6ZSl7Zm9yKDt0aGlzLmxlbmd0aDxzaXplOyl0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdPTA7cmV0dXJuIHRoaXN9LEJOLnByb3RvdHlwZS5fc3RyaXA9ZnVuY3Rpb24gc3RyaXAoKXtmb3IoO3RoaXMubGVuZ3RoPjEmJjA9PT10aGlzLndvcmRzW3RoaXMubGVuZ3RoLTFdOyl0aGlzLmxlbmd0aC0tO3JldHVybiB0aGlzLl9ub3JtU2lnbigpfSxCTi5wcm90b3R5cGUuX25vcm1TaWduPWZ1bmN0aW9uIF9ub3JtU2lnbigpe3JldHVybiAxPT09dGhpcy5sZW5ndGgmJjA9PT10aGlzLndvcmRzWzBdJiYodGhpcy5uZWdhdGl2ZT0wKSx0aGlzfSwidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbC5mb3IpdHJ5e0JOLnByb3RvdHlwZVtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXT1pbnNwZWN0fWNhdGNoKGUpe0JOLnByb3RvdHlwZS5pbnNwZWN0PWluc3BlY3R9ZWxzZSBCTi5wcm90b3R5cGUuaW5zcGVjdD1pbnNwZWN0O2Z1bmN0aW9uIGluc3BlY3QoKXtyZXR1cm4odGhpcy5yZWQ/IjxCTi1SOiAiOiI8Qk46ICIpK3RoaXMudG9TdHJpbmcoMTYpKyI+In12YXIgemVyb3M9WyIiLCIwIiwiMDAiLCIwMDAiLCIwMDAwIiwiMDAwMDAiLCIwMDAwMDAiLCIwMDAwMDAwIiwiMDAwMDAwMDAiLCIwMDAwMDAwMDAiLCIwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIl0sZ3JvdXBTaXplcz1bMCwwLDI1LDE2LDEyLDExLDEwLDksOCw4LDcsNyw3LDcsNiw2LDYsNiw2LDYsNiw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1XSxncm91cEJhc2VzPVswLDAsMzM1NTQ0MzIsNDMwNDY3MjEsMTY3NzcyMTYsNDg4MjgxMjUsNjA0NjYxNzYsNDAzNTM2MDcsMTY3NzcyMTYsNDMwNDY3MjEsMWU3LDE5NDg3MTcxLDM1ODMxODA4LDYyNzQ4NTE3LDc1Mjk1MzYsMTEzOTA2MjUsMTY3NzcyMTYsMjQxMzc1NjksMzQwMTIyMjQsNDcwNDU4ODEsNjRlNiw0MDg0MTAxLDUxNTM2MzIsNjQzNjM0Myw3OTYyNjI0LDk3NjU2MjUsMTE4ODEzNzYsMTQzNDg5MDcsMTcyMTAzNjgsMjA1MTExNDksMjQzZTUsMjg2MjkxNTEsMzM1NTQ0MzIsMzkxMzUzOTMsNDU0MzU0MjQsNTI1MjE4NzUsNjA0NjYxNzZdO0JOLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbiB0b1N0cmluZyhiYXNlLHBhZGRpbmcpe3ZhciBvdXQ7aWYocGFkZGluZz0wfHBhZGRpbmd8fDEsMTY9PT0oYmFzZT1iYXNlfHwxMCl8fCJoZXgiPT09YmFzZSl7b3V0PSIiO2Zvcih2YXIgb2ZmPTAsY2Fycnk9MCxpPTA7aTx0aGlzLmxlbmd0aDtpKyspe3ZhciB3PXRoaXMud29yZHNbaV0sd29yZD0oMTY3NzcyMTUmKHc8PG9mZnxjYXJyeSkpLnRvU3RyaW5nKDE2KTtjYXJyeT13Pj4+MjQtb2ZmJjE2Nzc3MjE1LChvZmYrPTIpPj0yNiYmKG9mZi09MjYsaS0tKSxvdXQ9MCE9PWNhcnJ5fHxpIT09dGhpcy5sZW5ndGgtMT96ZXJvc1s2LXdvcmQubGVuZ3RoXSt3b3JkK291dDp3b3JkK291dH1mb3IoMCE9PWNhcnJ5JiYob3V0PWNhcnJ5LnRvU3RyaW5nKDE2KStvdXQpO291dC5sZW5ndGglcGFkZGluZyE9PTA7KW91dD0iMCIrb3V0O3JldHVybiAwIT09dGhpcy5uZWdhdGl2ZSYmKG91dD0iLSIrb3V0KSxvdXR9aWYoYmFzZT09PSgwfGJhc2UpJiZiYXNlPj0yJiZiYXNlPD0zNil7dmFyIGdyb3VwU2l6ZT1ncm91cFNpemVzW2Jhc2VdLGdyb3VwQmFzZT1ncm91cEJhc2VzW2Jhc2VdO291dD0iIjt2YXIgYz10aGlzLmNsb25lKCk7Zm9yKGMubmVnYXRpdmU9MDshYy5pc1plcm8oKTspe3ZhciByPWMubW9kcm4oZ3JvdXBCYXNlKS50b1N0cmluZyhiYXNlKTtvdXQ9KGM9Yy5pZGl2bihncm91cEJhc2UpKS5pc1plcm8oKT9yK291dDp6ZXJvc1tncm91cFNpemUtci5sZW5ndGhdK3Irb3V0fWZvcih0aGlzLmlzWmVybygpJiYob3V0PSIwIitvdXQpO291dC5sZW5ndGglcGFkZGluZyE9PTA7KW91dD0iMCIrb3V0O3JldHVybiAwIT09dGhpcy5uZWdhdGl2ZSYmKG91dD0iLSIrb3V0KSxvdXR9YXNzZXJ0KCExLCJCYXNlIHNob3VsZCBiZSBiZXR3ZWVuIDIgYW5kIDM2Iil9LEJOLnByb3RvdHlwZS50b051bWJlcj1mdW5jdGlvbiB0b051bWJlcigpe3ZhciByZXQ9dGhpcy53b3Jkc1swXTtyZXR1cm4gMj09PXRoaXMubGVuZ3RoP3JldCs9NjcxMDg4NjQqdGhpcy53b3Jkc1sxXTozPT09dGhpcy5sZW5ndGgmJjE9PT10aGlzLndvcmRzWzJdP3JldCs9NDUwMzU5OTYyNzM3MDQ5Nis2NzEwODg2NCp0aGlzLndvcmRzWzFdOnRoaXMubGVuZ3RoPjImJmFzc2VydCghMSwiTnVtYmVyIGNhbiBvbmx5IHNhZmVseSBzdG9yZSB1cCB0byA1MyBiaXRzIiksMCE9PXRoaXMubmVnYXRpdmU/LXJldDpyZXR9LEJOLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24gdG9KU09OKCl7cmV0dXJuIHRoaXMudG9TdHJpbmcoMTYsMil9LEJ1ZmZlciYmKEJOLnByb3RvdHlwZS50b0J1ZmZlcj1mdW5jdGlvbiB0b0J1ZmZlcihlbmRpYW4sbGVuZ3RoKXtyZXR1cm4gdGhpcy50b0FycmF5TGlrZShCdWZmZXIsZW5kaWFuLGxlbmd0aCl9KSxCTi5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbiB0b0FycmF5KGVuZGlhbixsZW5ndGgpe3JldHVybiB0aGlzLnRvQXJyYXlMaWtlKEFycmF5LGVuZGlhbixsZW5ndGgpfTtmdW5jdGlvbiBzbWFsbE11bFRvKHNlbGYsbnVtLG91dCl7b3V0Lm5lZ2F0aXZlPW51bS5uZWdhdGl2ZV5zZWxmLm5lZ2F0aXZlO3ZhciBsZW49c2VsZi5sZW5ndGgrbnVtLmxlbmd0aHwwO291dC5sZW5ndGg9bGVuLGxlbj1sZW4tMXwwO3ZhciBhPTB8c2VsZi53b3Jkc1swXSxiPTB8bnVtLndvcmRzWzBdLHI9YSpiLGxvPTY3MTA4ODYzJnIsY2Fycnk9ci82NzEwODg2NHwwO291dC53b3Jkc1swXT1sbztmb3IodmFyIGs9MTtrPGxlbjtrKyspe2Zvcih2YXIgbmNhcnJ5PWNhcnJ5Pj4+MjYscndvcmQ9NjcxMDg4NjMmY2FycnksbWF4Sj1NYXRoLm1pbihrLG51bS5sZW5ndGgtMSksaj1NYXRoLm1heCgwLGstc2VsZi5sZW5ndGgrMSk7ajw9bWF4SjtqKyspe3ZhciBpPWstanwwO25jYXJyeSs9KHI9KGE9MHxzZWxmLndvcmRzW2ldKSooYj0wfG51bS53b3Jkc1tqXSkrcndvcmQpLzY3MTA4ODY0fDAscndvcmQ9NjcxMDg4NjMmcn1vdXQud29yZHNba109MHxyd29yZCxjYXJyeT0wfG5jYXJyeX1yZXR1cm4gMCE9PWNhcnJ5P291dC53b3Jkc1trXT0wfGNhcnJ5Om91dC5sZW5ndGgtLSxvdXQuX3N0cmlwKCl9Qk4ucHJvdG90eXBlLnRvQXJyYXlMaWtlPWZ1bmN0aW9uIHRvQXJyYXlMaWtlKEFycmF5VHlwZSxlbmRpYW4sbGVuZ3RoKXt0aGlzLl9zdHJpcCgpO3ZhciBieXRlTGVuZ3RoPXRoaXMuYnl0ZUxlbmd0aCgpLHJlcUxlbmd0aD1sZW5ndGh8fE1hdGgubWF4KDEsYnl0ZUxlbmd0aCk7YXNzZXJ0KGJ5dGVMZW5ndGg8PXJlcUxlbmd0aCwiYnl0ZSBhcnJheSBsb25nZXIgdGhhbiBkZXNpcmVkIGxlbmd0aCIpLGFzc2VydChyZXFMZW5ndGg+MCwiUmVxdWVzdGVkIGFycmF5IGxlbmd0aCA8PSAwIik7dmFyIHJlcz1mdW5jdGlvbiBhbGxvY2F0ZShBcnJheVR5cGUsc2l6ZSl7cmV0dXJuIEFycmF5VHlwZS5hbGxvY1Vuc2FmZT9BcnJheVR5cGUuYWxsb2NVbnNhZmUoc2l6ZSk6bmV3IEFycmF5VHlwZShzaXplKX0oQXJyYXlUeXBlLHJlcUxlbmd0aCk7cmV0dXJuIHRoaXNbIl90b0FycmF5TGlrZSIrKCJsZSI9PT1lbmRpYW4/IkxFIjoiQkUiKV0ocmVzLGJ5dGVMZW5ndGgpLHJlc30sQk4ucHJvdG90eXBlLl90b0FycmF5TGlrZUxFPWZ1bmN0aW9uIF90b0FycmF5TGlrZUxFKHJlcyxieXRlTGVuZ3RoKXtmb3IodmFyIHBvc2l0aW9uPTAsY2Fycnk9MCxpPTAsc2hpZnQ9MDtpPHRoaXMubGVuZ3RoO2krKyl7dmFyIHdvcmQ9dGhpcy53b3Jkc1tpXTw8c2hpZnR8Y2Fycnk7cmVzW3Bvc2l0aW9uKytdPTI1NSZ3b3JkLHBvc2l0aW9uPHJlcy5sZW5ndGgmJihyZXNbcG9zaXRpb24rK109d29yZD4+OCYyNTUpLHBvc2l0aW9uPHJlcy5sZW5ndGgmJihyZXNbcG9zaXRpb24rK109d29yZD4+MTYmMjU1KSw2PT09c2hpZnQ/KHBvc2l0aW9uPHJlcy5sZW5ndGgmJihyZXNbcG9zaXRpb24rK109d29yZD4+MjQmMjU1KSxjYXJyeT0wLHNoaWZ0PTApOihjYXJyeT13b3JkPj4+MjQsc2hpZnQrPTIpfWlmKHBvc2l0aW9uPHJlcy5sZW5ndGgpZm9yKHJlc1twb3NpdGlvbisrXT1jYXJyeTtwb3NpdGlvbjxyZXMubGVuZ3RoOylyZXNbcG9zaXRpb24rK109MH0sQk4ucHJvdG90eXBlLl90b0FycmF5TGlrZUJFPWZ1bmN0aW9uIF90b0FycmF5TGlrZUJFKHJlcyxieXRlTGVuZ3RoKXtmb3IodmFyIHBvc2l0aW9uPXJlcy5sZW5ndGgtMSxjYXJyeT0wLGk9MCxzaGlmdD0wO2k8dGhpcy5sZW5ndGg7aSsrKXt2YXIgd29yZD10aGlzLndvcmRzW2ldPDxzaGlmdHxjYXJyeTtyZXNbcG9zaXRpb24tLV09MjU1JndvcmQscG9zaXRpb24+PTAmJihyZXNbcG9zaXRpb24tLV09d29yZD4+OCYyNTUpLHBvc2l0aW9uPj0wJiYocmVzW3Bvc2l0aW9uLS1dPXdvcmQ+PjE2JjI1NSksNj09PXNoaWZ0Pyhwb3NpdGlvbj49MCYmKHJlc1twb3NpdGlvbi0tXT13b3JkPj4yNCYyNTUpLGNhcnJ5PTAsc2hpZnQ9MCk6KGNhcnJ5PXdvcmQ+Pj4yNCxzaGlmdCs9Mil9aWYocG9zaXRpb24+PTApZm9yKHJlc1twb3NpdGlvbi0tXT1jYXJyeTtwb3NpdGlvbj49MDspcmVzW3Bvc2l0aW9uLS1dPTB9LE1hdGguY2x6MzI/Qk4ucHJvdG90eXBlLl9jb3VudEJpdHM9ZnVuY3Rpb24gX2NvdW50Qml0cyh3KXtyZXR1cm4gMzItTWF0aC5jbHozMih3KX06Qk4ucHJvdG90eXBlLl9jb3VudEJpdHM9ZnVuY3Rpb24gX2NvdW50Qml0cyh3KXt2YXIgdD13LHI9MDtyZXR1cm4gdD49NDA5NiYmKHIrPTEzLHQ+Pj49MTMpLHQ+PTY0JiYocis9Nyx0Pj4+PTcpLHQ+PTgmJihyKz00LHQ+Pj49NCksdD49MiYmKHIrPTIsdD4+Pj0yKSxyK3R9LEJOLnByb3RvdHlwZS5femVyb0JpdHM9ZnVuY3Rpb24gX3plcm9CaXRzKHcpe2lmKDA9PT13KXJldHVybiAyNjt2YXIgdD13LHI9MDtyZXR1cm4gODE5MSZ0fHwocis9MTMsdD4+Pj0xMyksMTI3JnR8fChyKz03LHQ+Pj49NyksMTUmdHx8KHIrPTQsdD4+Pj00KSwzJnR8fChyKz0yLHQ+Pj49MiksMSZ0fHxyKysscn0sQk4ucHJvdG90eXBlLmJpdExlbmd0aD1mdW5jdGlvbiBiaXRMZW5ndGgoKXt2YXIgdz10aGlzLndvcmRzW3RoaXMubGVuZ3RoLTFdLGhpPXRoaXMuX2NvdW50Qml0cyh3KTtyZXR1cm4gMjYqKHRoaXMubGVuZ3RoLTEpK2hpfSxCTi5wcm90b3R5cGUuemVyb0JpdHM9ZnVuY3Rpb24gemVyb0JpdHMoKXtpZih0aGlzLmlzWmVybygpKXJldHVybiAwO2Zvcih2YXIgcj0wLGk9MDtpPHRoaXMubGVuZ3RoO2krKyl7dmFyIGI9dGhpcy5femVyb0JpdHModGhpcy53b3Jkc1tpXSk7aWYocis9YiwyNiE9PWIpYnJlYWt9cmV0dXJuIHJ9LEJOLnByb3RvdHlwZS5ieXRlTGVuZ3RoPWZ1bmN0aW9uIGJ5dGVMZW5ndGgoKXtyZXR1cm4gTWF0aC5jZWlsKHRoaXMuYml0TGVuZ3RoKCkvOCl9LEJOLnByb3RvdHlwZS50b1R3b3M9ZnVuY3Rpb24gdG9Ud29zKHdpZHRoKXtyZXR1cm4gMCE9PXRoaXMubmVnYXRpdmU/dGhpcy5hYnMoKS5pbm90bih3aWR0aCkuaWFkZG4oMSk6dGhpcy5jbG9uZSgpfSxCTi5wcm90b3R5cGUuZnJvbVR3b3M9ZnVuY3Rpb24gZnJvbVR3b3Mod2lkdGgpe3JldHVybiB0aGlzLnRlc3RuKHdpZHRoLTEpP3RoaXMubm90bih3aWR0aCkuaWFkZG4oMSkuaW5lZygpOnRoaXMuY2xvbmUoKX0sQk4ucHJvdG90eXBlLmlzTmVnPWZ1bmN0aW9uIGlzTmVnKCl7cmV0dXJuIDAhPT10aGlzLm5lZ2F0aXZlfSxCTi5wcm90b3R5cGUubmVnPWZ1bmN0aW9uIG5lZygpe3JldHVybiB0aGlzLmNsb25lKCkuaW5lZygpfSxCTi5wcm90b3R5cGUuaW5lZz1mdW5jdGlvbiBpbmVnKCl7cmV0dXJuIHRoaXMuaXNaZXJvKCl8fCh0aGlzLm5lZ2F0aXZlXj0xKSx0aGlzfSxCTi5wcm90b3R5cGUuaXVvcj1mdW5jdGlvbiBpdW9yKG51bSl7Zm9yKDt0aGlzLmxlbmd0aDxudW0ubGVuZ3RoOyl0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdPTA7Zm9yKHZhciBpPTA7aTxudW0ubGVuZ3RoO2krKyl0aGlzLndvcmRzW2ldPXRoaXMud29yZHNbaV18bnVtLndvcmRzW2ldO3JldHVybiB0aGlzLl9zdHJpcCgpfSxCTi5wcm90b3R5cGUuaW9yPWZ1bmN0aW9uIGlvcihudW0pe3JldHVybiBhc3NlcnQoMD09PSh0aGlzLm5lZ2F0aXZlfG51bS5uZWdhdGl2ZSkpLHRoaXMuaXVvcihudW0pfSxCTi5wcm90b3R5cGUub3I9ZnVuY3Rpb24gb3IobnVtKXtyZXR1cm4gdGhpcy5sZW5ndGg+bnVtLmxlbmd0aD90aGlzLmNsb25lKCkuaW9yKG51bSk6bnVtLmNsb25lKCkuaW9yKHRoaXMpfSxCTi5wcm90b3R5cGUudW9yPWZ1bmN0aW9uIHVvcihudW0pe3JldHVybiB0aGlzLmxlbmd0aD5udW0ubGVuZ3RoP3RoaXMuY2xvbmUoKS5pdW9yKG51bSk6bnVtLmNsb25lKCkuaXVvcih0aGlzKX0sQk4ucHJvdG90eXBlLml1YW5kPWZ1bmN0aW9uIGl1YW5kKG51bSl7dmFyIGI7Yj10aGlzLmxlbmd0aD5udW0ubGVuZ3RoP251bTp0aGlzO2Zvcih2YXIgaT0wO2k8Yi5sZW5ndGg7aSsrKXRoaXMud29yZHNbaV09dGhpcy53b3Jkc1tpXSZudW0ud29yZHNbaV07cmV0dXJuIHRoaXMubGVuZ3RoPWIubGVuZ3RoLHRoaXMuX3N0cmlwKCl9LEJOLnByb3RvdHlwZS5pYW5kPWZ1bmN0aW9uIGlhbmQobnVtKXtyZXR1cm4gYXNzZXJ0KDA9PT0odGhpcy5uZWdhdGl2ZXxudW0ubmVnYXRpdmUpKSx0aGlzLml1YW5kKG51bSl9LEJOLnByb3RvdHlwZS5hbmQ9ZnVuY3Rpb24gYW5kKG51bSl7cmV0dXJuIHRoaXMubGVuZ3RoPm51bS5sZW5ndGg/dGhpcy5jbG9uZSgpLmlhbmQobnVtKTpudW0uY2xvbmUoKS5pYW5kKHRoaXMpfSxCTi5wcm90b3R5cGUudWFuZD1mdW5jdGlvbiB1YW5kKG51bSl7cmV0dXJuIHRoaXMubGVuZ3RoPm51bS5sZW5ndGg/dGhpcy5jbG9uZSgpLml1YW5kKG51bSk6bnVtLmNsb25lKCkuaXVhbmQodGhpcyl9LEJOLnByb3RvdHlwZS5pdXhvcj1mdW5jdGlvbiBpdXhvcihudW0pe3ZhciBhLGI7dGhpcy5sZW5ndGg+bnVtLmxlbmd0aD8oYT10aGlzLGI9bnVtKTooYT1udW0sYj10aGlzKTtmb3IodmFyIGk9MDtpPGIubGVuZ3RoO2krKyl0aGlzLndvcmRzW2ldPWEud29yZHNbaV1eYi53b3Jkc1tpXTtpZih0aGlzIT09YSlmb3IoO2k8YS5sZW5ndGg7aSsrKXRoaXMud29yZHNbaV09YS53b3Jkc1tpXTtyZXR1cm4gdGhpcy5sZW5ndGg9YS5sZW5ndGgsdGhpcy5fc3RyaXAoKX0sQk4ucHJvdG90eXBlLml4b3I9ZnVuY3Rpb24gaXhvcihudW0pe3JldHVybiBhc3NlcnQoMD09PSh0aGlzLm5lZ2F0aXZlfG51bS5uZWdhdGl2ZSkpLHRoaXMuaXV4b3IobnVtKX0sQk4ucHJvdG90eXBlLnhvcj1mdW5jdGlvbiB4b3IobnVtKXtyZXR1cm4gdGhpcy5sZW5ndGg+bnVtLmxlbmd0aD90aGlzLmNsb25lKCkuaXhvcihudW0pOm51bS5jbG9uZSgpLml4b3IodGhpcyl9LEJOLnByb3RvdHlwZS51eG9yPWZ1bmN0aW9uIHV4b3IobnVtKXtyZXR1cm4gdGhpcy5sZW5ndGg+bnVtLmxlbmd0aD90aGlzLmNsb25lKCkuaXV4b3IobnVtKTpudW0uY2xvbmUoKS5pdXhvcih0aGlzKX0sQk4ucHJvdG90eXBlLmlub3RuPWZ1bmN0aW9uIGlub3RuKHdpZHRoKXthc3NlcnQoIm51bWJlciI9PXR5cGVvZiB3aWR0aCYmd2lkdGg+PTApO3ZhciBieXRlc05lZWRlZD0wfE1hdGguY2VpbCh3aWR0aC8yNiksYml0c0xlZnQ9d2lkdGglMjY7dGhpcy5fZXhwYW5kKGJ5dGVzTmVlZGVkKSxiaXRzTGVmdD4wJiZieXRlc05lZWRlZC0tO2Zvcih2YXIgaT0wO2k8Ynl0ZXNOZWVkZWQ7aSsrKXRoaXMud29yZHNbaV09NjcxMDg4NjMmfnRoaXMud29yZHNbaV07cmV0dXJuIGJpdHNMZWZ0PjAmJih0aGlzLndvcmRzW2ldPX50aGlzLndvcmRzW2ldJjY3MTA4ODYzPj4yNi1iaXRzTGVmdCksdGhpcy5fc3RyaXAoKX0sQk4ucHJvdG90eXBlLm5vdG49ZnVuY3Rpb24gbm90bih3aWR0aCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pbm90bih3aWR0aCl9LEJOLnByb3RvdHlwZS5zZXRuPWZ1bmN0aW9uIHNldG4oYml0LHZhbCl7YXNzZXJ0KCJudW1iZXIiPT10eXBlb2YgYml0JiZiaXQ+PTApO3ZhciBvZmY9Yml0LzI2fDAsd2JpdD1iaXQlMjY7cmV0dXJuIHRoaXMuX2V4cGFuZChvZmYrMSksdGhpcy53b3Jkc1tvZmZdPXZhbD90aGlzLndvcmRzW29mZl18MTw8d2JpdDp0aGlzLndvcmRzW29mZl0mfigxPDx3Yml0KSx0aGlzLl9zdHJpcCgpfSxCTi5wcm90b3R5cGUuaWFkZD1mdW5jdGlvbiBpYWRkKG51bSl7dmFyIHIsYSxiO2lmKDAhPT10aGlzLm5lZ2F0aXZlJiYwPT09bnVtLm5lZ2F0aXZlKXJldHVybiB0aGlzLm5lZ2F0aXZlPTAscj10aGlzLmlzdWIobnVtKSx0aGlzLm5lZ2F0aXZlXj0xLHRoaXMuX25vcm1TaWduKCk7aWYoMD09PXRoaXMubmVnYXRpdmUmJjAhPT1udW0ubmVnYXRpdmUpcmV0dXJuIG51bS5uZWdhdGl2ZT0wLHI9dGhpcy5pc3ViKG51bSksbnVtLm5lZ2F0aXZlPTEsci5fbm9ybVNpZ24oKTt0aGlzLmxlbmd0aD5udW0ubGVuZ3RoPyhhPXRoaXMsYj1udW0pOihhPW51bSxiPXRoaXMpO2Zvcih2YXIgY2Fycnk9MCxpPTA7aTxiLmxlbmd0aDtpKyspcj0oMHxhLndvcmRzW2ldKSsoMHxiLndvcmRzW2ldKStjYXJyeSx0aGlzLndvcmRzW2ldPTY3MTA4ODYzJnIsY2Fycnk9cj4+PjI2O2Zvcig7MCE9PWNhcnJ5JiZpPGEubGVuZ3RoO2krKylyPSgwfGEud29yZHNbaV0pK2NhcnJ5LHRoaXMud29yZHNbaV09NjcxMDg4NjMmcixjYXJyeT1yPj4+MjY7aWYodGhpcy5sZW5ndGg9YS5sZW5ndGgsMCE9PWNhcnJ5KXRoaXMud29yZHNbdGhpcy5sZW5ndGhdPWNhcnJ5LHRoaXMubGVuZ3RoKys7ZWxzZSBpZihhIT09dGhpcylmb3IoO2k8YS5sZW5ndGg7aSsrKXRoaXMud29yZHNbaV09YS53b3Jkc1tpXTtyZXR1cm4gdGhpc30sQk4ucHJvdG90eXBlLmFkZD1mdW5jdGlvbiBhZGQobnVtKXt2YXIgcmVzO3JldHVybiAwIT09bnVtLm5lZ2F0aXZlJiYwPT09dGhpcy5uZWdhdGl2ZT8obnVtLm5lZ2F0aXZlPTAscmVzPXRoaXMuc3ViKG51bSksbnVtLm5lZ2F0aXZlXj0xLHJlcyk6MD09PW51bS5uZWdhdGl2ZSYmMCE9PXRoaXMubmVnYXRpdmU/KHRoaXMubmVnYXRpdmU9MCxyZXM9bnVtLnN1Yih0aGlzKSx0aGlzLm5lZ2F0aXZlPTEscmVzKTp0aGlzLmxlbmd0aD5udW0ubGVuZ3RoP3RoaXMuY2xvbmUoKS5pYWRkKG51bSk6bnVtLmNsb25lKCkuaWFkZCh0aGlzKX0sQk4ucHJvdG90eXBlLmlzdWI9ZnVuY3Rpb24gaXN1YihudW0pe2lmKDAhPT1udW0ubmVnYXRpdmUpe251bS5uZWdhdGl2ZT0wO3ZhciByPXRoaXMuaWFkZChudW0pO3JldHVybiBudW0ubmVnYXRpdmU9MSxyLl9ub3JtU2lnbigpfWlmKDAhPT10aGlzLm5lZ2F0aXZlKXJldHVybiB0aGlzLm5lZ2F0aXZlPTAsdGhpcy5pYWRkKG51bSksdGhpcy5uZWdhdGl2ZT0xLHRoaXMuX25vcm1TaWduKCk7dmFyIGEsYixjbXA9dGhpcy5jbXAobnVtKTtpZigwPT09Y21wKXJldHVybiB0aGlzLm5lZ2F0aXZlPTAsdGhpcy5sZW5ndGg9MSx0aGlzLndvcmRzWzBdPTAsdGhpcztjbXA+MD8oYT10aGlzLGI9bnVtKTooYT1udW0sYj10aGlzKTtmb3IodmFyIGNhcnJ5PTAsaT0wO2k8Yi5sZW5ndGg7aSsrKWNhcnJ5PShyPSgwfGEud29yZHNbaV0pLSgwfGIud29yZHNbaV0pK2NhcnJ5KT4+MjYsdGhpcy53b3Jkc1tpXT02NzEwODg2MyZyO2Zvcig7MCE9PWNhcnJ5JiZpPGEubGVuZ3RoO2krKyljYXJyeT0ocj0oMHxhLndvcmRzW2ldKStjYXJyeSk+PjI2LHRoaXMud29yZHNbaV09NjcxMDg4NjMmcjtpZigwPT09Y2FycnkmJmk8YS5sZW5ndGgmJmEhPT10aGlzKWZvcig7aTxhLmxlbmd0aDtpKyspdGhpcy53b3Jkc1tpXT1hLndvcmRzW2ldO3JldHVybiB0aGlzLmxlbmd0aD1NYXRoLm1heCh0aGlzLmxlbmd0aCxpKSxhIT09dGhpcyYmKHRoaXMubmVnYXRpdmU9MSksdGhpcy5fc3RyaXAoKX0sQk4ucHJvdG90eXBlLnN1Yj1mdW5jdGlvbiBzdWIobnVtKXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlzdWIobnVtKX07dmFyIGNvbWIxME11bFRvPWZ1bmN0aW9uIGNvbWIxME11bFRvKHNlbGYsbnVtLG91dCl7dmFyIGxvLG1pZCxoaSxhPXNlbGYud29yZHMsYj1udW0ud29yZHMsbz1vdXQud29yZHMsYz0wLGEwPTB8YVswXSxhbDA9ODE5MSZhMCxhaDA9YTA+Pj4xMyxhMT0wfGFbMV0sYWwxPTgxOTEmYTEsYWgxPWExPj4+MTMsYTI9MHxhWzJdLGFsMj04MTkxJmEyLGFoMj1hMj4+PjEzLGEzPTB8YVszXSxhbDM9ODE5MSZhMyxhaDM9YTM+Pj4xMyxhND0wfGFbNF0sYWw0PTgxOTEmYTQsYWg0PWE0Pj4+MTMsYTU9MHxhWzVdLGFsNT04MTkxJmE1LGFoNT1hNT4+PjEzLGE2PTB8YVs2XSxhbDY9ODE5MSZhNixhaDY9YTY+Pj4xMyxhNz0wfGFbN10sYWw3PTgxOTEmYTcsYWg3PWE3Pj4+MTMsYTg9MHxhWzhdLGFsOD04MTkxJmE4LGFoOD1hOD4+PjEzLGE5PTB8YVs5XSxhbDk9ODE5MSZhOSxhaDk9YTk+Pj4xMyxiMD0wfGJbMF0sYmwwPTgxOTEmYjAsYmgwPWIwPj4+MTMsYjE9MHxiWzFdLGJsMT04MTkxJmIxLGJoMT1iMT4+PjEzLGIyPTB8YlsyXSxibDI9ODE5MSZiMixiaDI9YjI+Pj4xMyxiMz0wfGJbM10sYmwzPTgxOTEmYjMsYmgzPWIzPj4+MTMsYjQ9MHxiWzRdLGJsND04MTkxJmI0LGJoND1iND4+PjEzLGI1PTB8Yls1XSxibDU9ODE5MSZiNSxiaDU9YjU+Pj4xMyxiNj0wfGJbNl0sYmw2PTgxOTEmYjYsYmg2PWI2Pj4+MTMsYjc9MHxiWzddLGJsNz04MTkxJmI3LGJoNz1iNz4+PjEzLGI4PTB8Yls4XSxibDg9ODE5MSZiOCxiaDg9Yjg+Pj4xMyxiOT0wfGJbOV0sYmw5PTgxOTEmYjksYmg5PWI5Pj4+MTM7b3V0Lm5lZ2F0aXZlPXNlbGYubmVnYXRpdmVebnVtLm5lZ2F0aXZlLG91dC5sZW5ndGg9MTk7dmFyIHcwPShjKyhsbz1NYXRoLmltdWwoYWwwLGJsMCkpfDApKygoODE5MSYobWlkPShtaWQ9TWF0aC5pbXVsKGFsMCxiaDApKStNYXRoLmltdWwoYWgwLGJsMCl8MCkpPDwxMyl8MDtjPSgoaGk9TWF0aC5pbXVsKGFoMCxiaDApKSsobWlkPj4+MTMpfDApKyh3MD4+PjI2KXwwLHcwJj02NzEwODg2Myxsbz1NYXRoLmltdWwoYWwxLGJsMCksbWlkPShtaWQ9TWF0aC5pbXVsKGFsMSxiaDApKStNYXRoLmltdWwoYWgxLGJsMCl8MCxoaT1NYXRoLmltdWwoYWgxLGJoMCk7dmFyIHcxPShjKyhsbz1sbytNYXRoLmltdWwoYWwwLGJsMSl8MCl8MCkrKCg4MTkxJihtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMCxiaDEpfDApK01hdGguaW11bChhaDAsYmwxKXwwKSk8PDEzKXwwO2M9KChoaT1oaStNYXRoLmltdWwoYWgwLGJoMSl8MCkrKG1pZD4+PjEzKXwwKSsodzE+Pj4yNil8MCx3MSY9NjcxMDg4NjMsbG89TWF0aC5pbXVsKGFsMixibDApLG1pZD0obWlkPU1hdGguaW11bChhbDIsYmgwKSkrTWF0aC5pbXVsKGFoMixibDApfDAsaGk9TWF0aC5pbXVsKGFoMixiaDApLGxvPWxvK01hdGguaW11bChhbDEsYmwxKXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwxLGJoMSl8MCkrTWF0aC5pbXVsKGFoMSxibDEpfDAsaGk9aGkrTWF0aC5pbXVsKGFoMSxiaDEpfDA7dmFyIHcyPShjKyhsbz1sbytNYXRoLmltdWwoYWwwLGJsMil8MCl8MCkrKCg4MTkxJihtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMCxiaDIpfDApK01hdGguaW11bChhaDAsYmwyKXwwKSk8PDEzKXwwO2M9KChoaT1oaStNYXRoLmltdWwoYWgwLGJoMil8MCkrKG1pZD4+PjEzKXwwKSsodzI+Pj4yNil8MCx3MiY9NjcxMDg4NjMsbG89TWF0aC5pbXVsKGFsMyxibDApLG1pZD0obWlkPU1hdGguaW11bChhbDMsYmgwKSkrTWF0aC5pbXVsKGFoMyxibDApfDAsaGk9TWF0aC5pbXVsKGFoMyxiaDApLGxvPWxvK01hdGguaW11bChhbDIsYmwxKXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwyLGJoMSl8MCkrTWF0aC5pbXVsKGFoMixibDEpfDAsaGk9aGkrTWF0aC5pbXVsKGFoMixiaDEpfDAsbG89bG8rTWF0aC5pbXVsKGFsMSxibDIpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDEsYmgyKXwwKStNYXRoLmltdWwoYWgxLGJsMil8MCxoaT1oaStNYXRoLmltdWwoYWgxLGJoMil8MDt2YXIgdzM9KGMrKGxvPWxvK01hdGguaW11bChhbDAsYmwzKXwwKXwwKSsoKDgxOTEmKG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwwLGJoMyl8MCkrTWF0aC5pbXVsKGFoMCxibDMpfDApKTw8MTMpfDA7Yz0oKGhpPWhpK01hdGguaW11bChhaDAsYmgzKXwwKSsobWlkPj4+MTMpfDApKyh3Mz4+PjI2KXwwLHczJj02NzEwODg2Myxsbz1NYXRoLmltdWwoYWw0LGJsMCksbWlkPShtaWQ9TWF0aC5pbXVsKGFsNCxiaDApKStNYXRoLmltdWwoYWg0LGJsMCl8MCxoaT1NYXRoLmltdWwoYWg0LGJoMCksbG89bG8rTWF0aC5pbXVsKGFsMyxibDEpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDMsYmgxKXwwKStNYXRoLmltdWwoYWgzLGJsMSl8MCxoaT1oaStNYXRoLmltdWwoYWgzLGJoMSl8MCxsbz1sbytNYXRoLmltdWwoYWwyLGJsMil8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMixiaDIpfDApK01hdGguaW11bChhaDIsYmwyKXwwLGhpPWhpK01hdGguaW11bChhaDIsYmgyKXwwLGxvPWxvK01hdGguaW11bChhbDEsYmwzKXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwxLGJoMyl8MCkrTWF0aC5pbXVsKGFoMSxibDMpfDAsaGk9aGkrTWF0aC5pbXVsKGFoMSxiaDMpfDA7dmFyIHc0PShjKyhsbz1sbytNYXRoLmltdWwoYWwwLGJsNCl8MCl8MCkrKCg4MTkxJihtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMCxiaDQpfDApK01hdGguaW11bChhaDAsYmw0KXwwKSk8PDEzKXwwO2M9KChoaT1oaStNYXRoLmltdWwoYWgwLGJoNCl8MCkrKG1pZD4+PjEzKXwwKSsodzQ+Pj4yNil8MCx3NCY9NjcxMDg4NjMsbG89TWF0aC5pbXVsKGFsNSxibDApLG1pZD0obWlkPU1hdGguaW11bChhbDUsYmgwKSkrTWF0aC5pbXVsKGFoNSxibDApfDAsaGk9TWF0aC5pbXVsKGFoNSxiaDApLGxvPWxvK01hdGguaW11bChhbDQsYmwxKXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw0LGJoMSl8MCkrTWF0aC5pbXVsKGFoNCxibDEpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNCxiaDEpfDAsbG89bG8rTWF0aC5pbXVsKGFsMyxibDIpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDMsYmgyKXwwKStNYXRoLmltdWwoYWgzLGJsMil8MCxoaT1oaStNYXRoLmltdWwoYWgzLGJoMil8MCxsbz1sbytNYXRoLmltdWwoYWwyLGJsMyl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMixiaDMpfDApK01hdGguaW11bChhaDIsYmwzKXwwLGhpPWhpK01hdGguaW11bChhaDIsYmgzKXwwLGxvPWxvK01hdGguaW11bChhbDEsYmw0KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwxLGJoNCl8MCkrTWF0aC5pbXVsKGFoMSxibDQpfDAsaGk9aGkrTWF0aC5pbXVsKGFoMSxiaDQpfDA7dmFyIHc1PShjKyhsbz1sbytNYXRoLmltdWwoYWwwLGJsNSl8MCl8MCkrKCg4MTkxJihtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMCxiaDUpfDApK01hdGguaW11bChhaDAsYmw1KXwwKSk8PDEzKXwwO2M9KChoaT1oaStNYXRoLmltdWwoYWgwLGJoNSl8MCkrKG1pZD4+PjEzKXwwKSsodzU+Pj4yNil8MCx3NSY9NjcxMDg4NjMsbG89TWF0aC5pbXVsKGFsNixibDApLG1pZD0obWlkPU1hdGguaW11bChhbDYsYmgwKSkrTWF0aC5pbXVsKGFoNixibDApfDAsaGk9TWF0aC5pbXVsKGFoNixiaDApLGxvPWxvK01hdGguaW11bChhbDUsYmwxKXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw1LGJoMSl8MCkrTWF0aC5pbXVsKGFoNSxibDEpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNSxiaDEpfDAsbG89bG8rTWF0aC5pbXVsKGFsNCxibDIpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDQsYmgyKXwwKStNYXRoLmltdWwoYWg0LGJsMil8MCxoaT1oaStNYXRoLmltdWwoYWg0LGJoMil8MCxsbz1sbytNYXRoLmltdWwoYWwzLGJsMyl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMyxiaDMpfDApK01hdGguaW11bChhaDMsYmwzKXwwLGhpPWhpK01hdGguaW11bChhaDMsYmgzKXwwLGxvPWxvK01hdGguaW11bChhbDIsYmw0KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwyLGJoNCl8MCkrTWF0aC5pbXVsKGFoMixibDQpfDAsaGk9aGkrTWF0aC5pbXVsKGFoMixiaDQpfDAsbG89bG8rTWF0aC5pbXVsKGFsMSxibDUpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDEsYmg1KXwwKStNYXRoLmltdWwoYWgxLGJsNSl8MCxoaT1oaStNYXRoLmltdWwoYWgxLGJoNSl8MDt2YXIgdzY9KGMrKGxvPWxvK01hdGguaW11bChhbDAsYmw2KXwwKXwwKSsoKDgxOTEmKG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwwLGJoNil8MCkrTWF0aC5pbXVsKGFoMCxibDYpfDApKTw8MTMpfDA7Yz0oKGhpPWhpK01hdGguaW11bChhaDAsYmg2KXwwKSsobWlkPj4+MTMpfDApKyh3Nj4+PjI2KXwwLHc2Jj02NzEwODg2Myxsbz1NYXRoLmltdWwoYWw3LGJsMCksbWlkPShtaWQ9TWF0aC5pbXVsKGFsNyxiaDApKStNYXRoLmltdWwoYWg3LGJsMCl8MCxoaT1NYXRoLmltdWwoYWg3LGJoMCksbG89bG8rTWF0aC5pbXVsKGFsNixibDEpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDYsYmgxKXwwKStNYXRoLmltdWwoYWg2LGJsMSl8MCxoaT1oaStNYXRoLmltdWwoYWg2LGJoMSl8MCxsbz1sbytNYXRoLmltdWwoYWw1LGJsMil8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNSxiaDIpfDApK01hdGguaW11bChhaDUsYmwyKXwwLGhpPWhpK01hdGguaW11bChhaDUsYmgyKXwwLGxvPWxvK01hdGguaW11bChhbDQsYmwzKXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw0LGJoMyl8MCkrTWF0aC5pbXVsKGFoNCxibDMpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNCxiaDMpfDAsbG89bG8rTWF0aC5pbXVsKGFsMyxibDQpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDMsYmg0KXwwKStNYXRoLmltdWwoYWgzLGJsNCl8MCxoaT1oaStNYXRoLmltdWwoYWgzLGJoNCl8MCxsbz1sbytNYXRoLmltdWwoYWwyLGJsNSl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMixiaDUpfDApK01hdGguaW11bChhaDIsYmw1KXwwLGhpPWhpK01hdGguaW11bChhaDIsYmg1KXwwLGxvPWxvK01hdGguaW11bChhbDEsYmw2KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwxLGJoNil8MCkrTWF0aC5pbXVsKGFoMSxibDYpfDAsaGk9aGkrTWF0aC5pbXVsKGFoMSxiaDYpfDA7dmFyIHc3PShjKyhsbz1sbytNYXRoLmltdWwoYWwwLGJsNyl8MCl8MCkrKCg4MTkxJihtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMCxiaDcpfDApK01hdGguaW11bChhaDAsYmw3KXwwKSk8PDEzKXwwO2M9KChoaT1oaStNYXRoLmltdWwoYWgwLGJoNyl8MCkrKG1pZD4+PjEzKXwwKSsodzc+Pj4yNil8MCx3NyY9NjcxMDg4NjMsbG89TWF0aC5pbXVsKGFsOCxibDApLG1pZD0obWlkPU1hdGguaW11bChhbDgsYmgwKSkrTWF0aC5pbXVsKGFoOCxibDApfDAsaGk9TWF0aC5pbXVsKGFoOCxiaDApLGxvPWxvK01hdGguaW11bChhbDcsYmwxKXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw3LGJoMSl8MCkrTWF0aC5pbXVsKGFoNyxibDEpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNyxiaDEpfDAsbG89bG8rTWF0aC5pbXVsKGFsNixibDIpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDYsYmgyKXwwKStNYXRoLmltdWwoYWg2LGJsMil8MCxoaT1oaStNYXRoLmltdWwoYWg2LGJoMil8MCxsbz1sbytNYXRoLmltdWwoYWw1LGJsMyl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNSxiaDMpfDApK01hdGguaW11bChhaDUsYmwzKXwwLGhpPWhpK01hdGguaW11bChhaDUsYmgzKXwwLGxvPWxvK01hdGguaW11bChhbDQsYmw0KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw0LGJoNCl8MCkrTWF0aC5pbXVsKGFoNCxibDQpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNCxiaDQpfDAsbG89bG8rTWF0aC5pbXVsKGFsMyxibDUpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDMsYmg1KXwwKStNYXRoLmltdWwoYWgzLGJsNSl8MCxoaT1oaStNYXRoLmltdWwoYWgzLGJoNSl8MCxsbz1sbytNYXRoLmltdWwoYWwyLGJsNil8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMixiaDYpfDApK01hdGguaW11bChhaDIsYmw2KXwwLGhpPWhpK01hdGguaW11bChhaDIsYmg2KXwwLGxvPWxvK01hdGguaW11bChhbDEsYmw3KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwxLGJoNyl8MCkrTWF0aC5pbXVsKGFoMSxibDcpfDAsaGk9aGkrTWF0aC5pbXVsKGFoMSxiaDcpfDA7dmFyIHc4PShjKyhsbz1sbytNYXRoLmltdWwoYWwwLGJsOCl8MCl8MCkrKCg4MTkxJihtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMCxiaDgpfDApK01hdGguaW11bChhaDAsYmw4KXwwKSk8PDEzKXwwO2M9KChoaT1oaStNYXRoLmltdWwoYWgwLGJoOCl8MCkrKG1pZD4+PjEzKXwwKSsodzg+Pj4yNil8MCx3OCY9NjcxMDg4NjMsbG89TWF0aC5pbXVsKGFsOSxibDApLG1pZD0obWlkPU1hdGguaW11bChhbDksYmgwKSkrTWF0aC5pbXVsKGFoOSxibDApfDAsaGk9TWF0aC5pbXVsKGFoOSxiaDApLGxvPWxvK01hdGguaW11bChhbDgsYmwxKXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw4LGJoMSl8MCkrTWF0aC5pbXVsKGFoOCxibDEpfDAsaGk9aGkrTWF0aC5pbXVsKGFoOCxiaDEpfDAsbG89bG8rTWF0aC5pbXVsKGFsNyxibDIpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDcsYmgyKXwwKStNYXRoLmltdWwoYWg3LGJsMil8MCxoaT1oaStNYXRoLmltdWwoYWg3LGJoMil8MCxsbz1sbytNYXRoLmltdWwoYWw2LGJsMyl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNixiaDMpfDApK01hdGguaW11bChhaDYsYmwzKXwwLGhpPWhpK01hdGguaW11bChhaDYsYmgzKXwwLGxvPWxvK01hdGguaW11bChhbDUsYmw0KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw1LGJoNCl8MCkrTWF0aC5pbXVsKGFoNSxibDQpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNSxiaDQpfDAsbG89bG8rTWF0aC5pbXVsKGFsNCxibDUpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDQsYmg1KXwwKStNYXRoLmltdWwoYWg0LGJsNSl8MCxoaT1oaStNYXRoLmltdWwoYWg0LGJoNSl8MCxsbz1sbytNYXRoLmltdWwoYWwzLGJsNil8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMyxiaDYpfDApK01hdGguaW11bChhaDMsYmw2KXwwLGhpPWhpK01hdGguaW11bChhaDMsYmg2KXwwLGxvPWxvK01hdGguaW11bChhbDIsYmw3KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwyLGJoNyl8MCkrTWF0aC5pbXVsKGFoMixibDcpfDAsaGk9aGkrTWF0aC5pbXVsKGFoMixiaDcpfDAsbG89bG8rTWF0aC5pbXVsKGFsMSxibDgpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDEsYmg4KXwwKStNYXRoLmltdWwoYWgxLGJsOCl8MCxoaT1oaStNYXRoLmltdWwoYWgxLGJoOCl8MDt2YXIgdzk9KGMrKGxvPWxvK01hdGguaW11bChhbDAsYmw5KXwwKXwwKSsoKDgxOTEmKG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwwLGJoOSl8MCkrTWF0aC5pbXVsKGFoMCxibDkpfDApKTw8MTMpfDA7Yz0oKGhpPWhpK01hdGguaW11bChhaDAsYmg5KXwwKSsobWlkPj4+MTMpfDApKyh3OT4+PjI2KXwwLHc5Jj02NzEwODg2Myxsbz1NYXRoLmltdWwoYWw5LGJsMSksbWlkPShtaWQ9TWF0aC5pbXVsKGFsOSxiaDEpKStNYXRoLmltdWwoYWg5LGJsMSl8MCxoaT1NYXRoLmltdWwoYWg5LGJoMSksbG89bG8rTWF0aC5pbXVsKGFsOCxibDIpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDgsYmgyKXwwKStNYXRoLmltdWwoYWg4LGJsMil8MCxoaT1oaStNYXRoLmltdWwoYWg4LGJoMil8MCxsbz1sbytNYXRoLmltdWwoYWw3LGJsMyl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNyxiaDMpfDApK01hdGguaW11bChhaDcsYmwzKXwwLGhpPWhpK01hdGguaW11bChhaDcsYmgzKXwwLGxvPWxvK01hdGguaW11bChhbDYsYmw0KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw2LGJoNCl8MCkrTWF0aC5pbXVsKGFoNixibDQpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNixiaDQpfDAsbG89bG8rTWF0aC5pbXVsKGFsNSxibDUpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDUsYmg1KXwwKStNYXRoLmltdWwoYWg1LGJsNSl8MCxoaT1oaStNYXRoLmltdWwoYWg1LGJoNSl8MCxsbz1sbytNYXRoLmltdWwoYWw0LGJsNil8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNCxiaDYpfDApK01hdGguaW11bChhaDQsYmw2KXwwLGhpPWhpK01hdGguaW11bChhaDQsYmg2KXwwLGxvPWxvK01hdGguaW11bChhbDMsYmw3KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwzLGJoNyl8MCkrTWF0aC5pbXVsKGFoMyxibDcpfDAsaGk9aGkrTWF0aC5pbXVsKGFoMyxiaDcpfDAsbG89bG8rTWF0aC5pbXVsKGFsMixibDgpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDIsYmg4KXwwKStNYXRoLmltdWwoYWgyLGJsOCl8MCxoaT1oaStNYXRoLmltdWwoYWgyLGJoOCl8MDt2YXIgdzEwPShjKyhsbz1sbytNYXRoLmltdWwoYWwxLGJsOSl8MCl8MCkrKCg4MTkxJihtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMSxiaDkpfDApK01hdGguaW11bChhaDEsYmw5KXwwKSk8PDEzKXwwO2M9KChoaT1oaStNYXRoLmltdWwoYWgxLGJoOSl8MCkrKG1pZD4+PjEzKXwwKSsodzEwPj4+MjYpfDAsdzEwJj02NzEwODg2Myxsbz1NYXRoLmltdWwoYWw5LGJsMiksbWlkPShtaWQ9TWF0aC5pbXVsKGFsOSxiaDIpKStNYXRoLmltdWwoYWg5LGJsMil8MCxoaT1NYXRoLmltdWwoYWg5LGJoMiksbG89bG8rTWF0aC5pbXVsKGFsOCxibDMpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDgsYmgzKXwwKStNYXRoLmltdWwoYWg4LGJsMyl8MCxoaT1oaStNYXRoLmltdWwoYWg4LGJoMyl8MCxsbz1sbytNYXRoLmltdWwoYWw3LGJsNCl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNyxiaDQpfDApK01hdGguaW11bChhaDcsYmw0KXwwLGhpPWhpK01hdGguaW11bChhaDcsYmg0KXwwLGxvPWxvK01hdGguaW11bChhbDYsYmw1KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw2LGJoNSl8MCkrTWF0aC5pbXVsKGFoNixibDUpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNixiaDUpfDAsbG89bG8rTWF0aC5pbXVsKGFsNSxibDYpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDUsYmg2KXwwKStNYXRoLmltdWwoYWg1LGJsNil8MCxoaT1oaStNYXRoLmltdWwoYWg1LGJoNil8MCxsbz1sbytNYXRoLmltdWwoYWw0LGJsNyl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNCxiaDcpfDApK01hdGguaW11bChhaDQsYmw3KXwwLGhpPWhpK01hdGguaW11bChhaDQsYmg3KXwwLGxvPWxvK01hdGguaW11bChhbDMsYmw4KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWwzLGJoOCl8MCkrTWF0aC5pbXVsKGFoMyxibDgpfDAsaGk9aGkrTWF0aC5pbXVsKGFoMyxiaDgpfDA7dmFyIHcxMT0oYysobG89bG8rTWF0aC5pbXVsKGFsMixibDkpfDApfDApKygoODE5MSYobWlkPShtaWQ9bWlkK01hdGguaW11bChhbDIsYmg5KXwwKStNYXRoLmltdWwoYWgyLGJsOSl8MCkpPDwxMyl8MDtjPSgoaGk9aGkrTWF0aC5pbXVsKGFoMixiaDkpfDApKyhtaWQ+Pj4xMyl8MCkrKHcxMT4+PjI2KXwwLHcxMSY9NjcxMDg4NjMsbG89TWF0aC5pbXVsKGFsOSxibDMpLG1pZD0obWlkPU1hdGguaW11bChhbDksYmgzKSkrTWF0aC5pbXVsKGFoOSxibDMpfDAsaGk9TWF0aC5pbXVsKGFoOSxiaDMpLGxvPWxvK01hdGguaW11bChhbDgsYmw0KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw4LGJoNCl8MCkrTWF0aC5pbXVsKGFoOCxibDQpfDAsaGk9aGkrTWF0aC5pbXVsKGFoOCxiaDQpfDAsbG89bG8rTWF0aC5pbXVsKGFsNyxibDUpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDcsYmg1KXwwKStNYXRoLmltdWwoYWg3LGJsNSl8MCxoaT1oaStNYXRoLmltdWwoYWg3LGJoNSl8MCxsbz1sbytNYXRoLmltdWwoYWw2LGJsNil8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNixiaDYpfDApK01hdGguaW11bChhaDYsYmw2KXwwLGhpPWhpK01hdGguaW11bChhaDYsYmg2KXwwLGxvPWxvK01hdGguaW11bChhbDUsYmw3KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw1LGJoNyl8MCkrTWF0aC5pbXVsKGFoNSxibDcpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNSxiaDcpfDAsbG89bG8rTWF0aC5pbXVsKGFsNCxibDgpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDQsYmg4KXwwKStNYXRoLmltdWwoYWg0LGJsOCl8MCxoaT1oaStNYXRoLmltdWwoYWg0LGJoOCl8MDt2YXIgdzEyPShjKyhsbz1sbytNYXRoLmltdWwoYWwzLGJsOSl8MCl8MCkrKCg4MTkxJihtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsMyxiaDkpfDApK01hdGguaW11bChhaDMsYmw5KXwwKSk8PDEzKXwwO2M9KChoaT1oaStNYXRoLmltdWwoYWgzLGJoOSl8MCkrKG1pZD4+PjEzKXwwKSsodzEyPj4+MjYpfDAsdzEyJj02NzEwODg2Myxsbz1NYXRoLmltdWwoYWw5LGJsNCksbWlkPShtaWQ9TWF0aC5pbXVsKGFsOSxiaDQpKStNYXRoLmltdWwoYWg5LGJsNCl8MCxoaT1NYXRoLmltdWwoYWg5LGJoNCksbG89bG8rTWF0aC5pbXVsKGFsOCxibDUpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDgsYmg1KXwwKStNYXRoLmltdWwoYWg4LGJsNSl8MCxoaT1oaStNYXRoLmltdWwoYWg4LGJoNSl8MCxsbz1sbytNYXRoLmltdWwoYWw3LGJsNil8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNyxiaDYpfDApK01hdGguaW11bChhaDcsYmw2KXwwLGhpPWhpK01hdGguaW11bChhaDcsYmg2KXwwLGxvPWxvK01hdGguaW11bChhbDYsYmw3KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw2LGJoNyl8MCkrTWF0aC5pbXVsKGFoNixibDcpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNixiaDcpfDAsbG89bG8rTWF0aC5pbXVsKGFsNSxibDgpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDUsYmg4KXwwKStNYXRoLmltdWwoYWg1LGJsOCl8MCxoaT1oaStNYXRoLmltdWwoYWg1LGJoOCl8MDt2YXIgdzEzPShjKyhsbz1sbytNYXRoLmltdWwoYWw0LGJsOSl8MCl8MCkrKCg4MTkxJihtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNCxiaDkpfDApK01hdGguaW11bChhaDQsYmw5KXwwKSk8PDEzKXwwO2M9KChoaT1oaStNYXRoLmltdWwoYWg0LGJoOSl8MCkrKG1pZD4+PjEzKXwwKSsodzEzPj4+MjYpfDAsdzEzJj02NzEwODg2Myxsbz1NYXRoLmltdWwoYWw5LGJsNSksbWlkPShtaWQ9TWF0aC5pbXVsKGFsOSxiaDUpKStNYXRoLmltdWwoYWg5LGJsNSl8MCxoaT1NYXRoLmltdWwoYWg5LGJoNSksbG89bG8rTWF0aC5pbXVsKGFsOCxibDYpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDgsYmg2KXwwKStNYXRoLmltdWwoYWg4LGJsNil8MCxoaT1oaStNYXRoLmltdWwoYWg4LGJoNil8MCxsbz1sbytNYXRoLmltdWwoYWw3LGJsNyl8MCxtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNyxiaDcpfDApK01hdGguaW11bChhaDcsYmw3KXwwLGhpPWhpK01hdGguaW11bChhaDcsYmg3KXwwLGxvPWxvK01hdGguaW11bChhbDYsYmw4KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw2LGJoOCl8MCkrTWF0aC5pbXVsKGFoNixibDgpfDAsaGk9aGkrTWF0aC5pbXVsKGFoNixiaDgpfDA7dmFyIHcxND0oYysobG89bG8rTWF0aC5pbXVsKGFsNSxibDkpfDApfDApKygoODE5MSYobWlkPShtaWQ9bWlkK01hdGguaW11bChhbDUsYmg5KXwwKStNYXRoLmltdWwoYWg1LGJsOSl8MCkpPDwxMyl8MDtjPSgoaGk9aGkrTWF0aC5pbXVsKGFoNSxiaDkpfDApKyhtaWQ+Pj4xMyl8MCkrKHcxND4+PjI2KXwwLHcxNCY9NjcxMDg4NjMsbG89TWF0aC5pbXVsKGFsOSxibDYpLG1pZD0obWlkPU1hdGguaW11bChhbDksYmg2KSkrTWF0aC5pbXVsKGFoOSxibDYpfDAsaGk9TWF0aC5pbXVsKGFoOSxiaDYpLGxvPWxvK01hdGguaW11bChhbDgsYmw3KXwwLG1pZD0obWlkPW1pZCtNYXRoLmltdWwoYWw4LGJoNyl8MCkrTWF0aC5pbXVsKGFoOCxibDcpfDAsaGk9aGkrTWF0aC5pbXVsKGFoOCxiaDcpfDAsbG89bG8rTWF0aC5pbXVsKGFsNyxibDgpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDcsYmg4KXwwKStNYXRoLmltdWwoYWg3LGJsOCl8MCxoaT1oaStNYXRoLmltdWwoYWg3LGJoOCl8MDt2YXIgdzE1PShjKyhsbz1sbytNYXRoLmltdWwoYWw2LGJsOSl8MCl8MCkrKCg4MTkxJihtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNixiaDkpfDApK01hdGguaW11bChhaDYsYmw5KXwwKSk8PDEzKXwwO2M9KChoaT1oaStNYXRoLmltdWwoYWg2LGJoOSl8MCkrKG1pZD4+PjEzKXwwKSsodzE1Pj4+MjYpfDAsdzE1Jj02NzEwODg2Myxsbz1NYXRoLmltdWwoYWw5LGJsNyksbWlkPShtaWQ9TWF0aC5pbXVsKGFsOSxiaDcpKStNYXRoLmltdWwoYWg5LGJsNyl8MCxoaT1NYXRoLmltdWwoYWg5LGJoNyksbG89bG8rTWF0aC5pbXVsKGFsOCxibDgpfDAsbWlkPShtaWQ9bWlkK01hdGguaW11bChhbDgsYmg4KXwwKStNYXRoLmltdWwoYWg4LGJsOCl8MCxoaT1oaStNYXRoLmltdWwoYWg4LGJoOCl8MDt2YXIgdzE2PShjKyhsbz1sbytNYXRoLmltdWwoYWw3LGJsOSl8MCl8MCkrKCg4MTkxJihtaWQ9KG1pZD1taWQrTWF0aC5pbXVsKGFsNyxiaDkpfDApK01hdGguaW11bChhaDcsYmw5KXwwKSk8PDEzKXwwO2M9KChoaT1oaStNYXRoLmltdWwoYWg3LGJoOSl8MCkrKG1pZD4+PjEzKXwwKSsodzE2Pj4+MjYpfDAsdzE2Jj02NzEwODg2Myxsbz1NYXRoLmltdWwoYWw5LGJsOCksbWlkPShtaWQ9TWF0aC5pbXVsKGFsOSxiaDgpKStNYXRoLmltdWwoYWg5LGJsOCl8MCxoaT1NYXRoLmltdWwoYWg5LGJoOCk7dmFyIHcxNz0oYysobG89bG8rTWF0aC5pbXVsKGFsOCxibDkpfDApfDApKygoODE5MSYobWlkPShtaWQ9bWlkK01hdGguaW11bChhbDgsYmg5KXwwKStNYXRoLmltdWwoYWg4LGJsOSl8MCkpPDwxMyl8MDtjPSgoaGk9aGkrTWF0aC5pbXVsKGFoOCxiaDkpfDApKyhtaWQ+Pj4xMyl8MCkrKHcxNz4+PjI2KXwwLHcxNyY9NjcxMDg4NjM7dmFyIHcxOD0oYysobG89TWF0aC5pbXVsKGFsOSxibDkpKXwwKSsoKDgxOTEmKG1pZD0obWlkPU1hdGguaW11bChhbDksYmg5KSkrTWF0aC5pbXVsKGFoOSxibDkpfDApKTw8MTMpfDA7cmV0dXJuIGM9KChoaT1NYXRoLmltdWwoYWg5LGJoOSkpKyhtaWQ+Pj4xMyl8MCkrKHcxOD4+PjI2KXwwLHcxOCY9NjcxMDg4NjMsb1swXT13MCxvWzFdPXcxLG9bMl09dzIsb1szXT13MyxvWzRdPXc0LG9bNV09dzUsb1s2XT13NixvWzddPXc3LG9bOF09dzgsb1s5XT13OSxvWzEwXT13MTAsb1sxMV09dzExLG9bMTJdPXcxMixvWzEzXT13MTMsb1sxNF09dzE0LG9bMTVdPXcxNSxvWzE2XT13MTYsb1sxN109dzE3LG9bMThdPXcxOCwwIT09YyYmKG9bMTldPWMsb3V0Lmxlbmd0aCsrKSxvdXR9O2Z1bmN0aW9uIGJpZ011bFRvKHNlbGYsbnVtLG91dCl7b3V0Lm5lZ2F0aXZlPW51bS5uZWdhdGl2ZV5zZWxmLm5lZ2F0aXZlLG91dC5sZW5ndGg9c2VsZi5sZW5ndGgrbnVtLmxlbmd0aDtmb3IodmFyIGNhcnJ5PTAsaG5jYXJyeT0wLGs9MDtrPG91dC5sZW5ndGgtMTtrKyspe3ZhciBuY2Fycnk9aG5jYXJyeTtobmNhcnJ5PTA7Zm9yKHZhciByd29yZD02NzEwODg2MyZjYXJyeSxtYXhKPU1hdGgubWluKGssbnVtLmxlbmd0aC0xKSxqPU1hdGgubWF4KDAsay1zZWxmLmxlbmd0aCsxKTtqPD1tYXhKO2orKyl7dmFyIGk9ay1qLHI9KDB8c2VsZi53b3Jkc1tpXSkqKDB8bnVtLndvcmRzW2pdKSxsbz02NzEwODg2MyZyO3J3b3JkPTY3MTA4ODYzJihsbz1sbytyd29yZHwwKSxobmNhcnJ5Kz0obmNhcnJ5PShuY2Fycnk9bmNhcnJ5KyhyLzY3MTA4ODY0fDApfDApKyhsbz4+PjI2KXwwKT4+PjI2LG5jYXJyeSY9NjcxMDg4NjN9b3V0LndvcmRzW2tdPXJ3b3JkLGNhcnJ5PW5jYXJyeSxuY2Fycnk9aG5jYXJyeX1yZXR1cm4gMCE9PWNhcnJ5P291dC53b3Jkc1trXT1jYXJyeTpvdXQubGVuZ3RoLS0sb3V0Ll9zdHJpcCgpfWZ1bmN0aW9uIGp1bWJvTXVsVG8oc2VsZixudW0sb3V0KXtyZXR1cm4gYmlnTXVsVG8oc2VsZixudW0sb3V0KX1mdW5jdGlvbiBGRlRNKHgseSl7dGhpcy54PXgsdGhpcy55PXl9TWF0aC5pbXVsfHwoY29tYjEwTXVsVG89c21hbGxNdWxUbyksQk4ucHJvdG90eXBlLm11bFRvPWZ1bmN0aW9uIG11bFRvKG51bSxvdXQpe3ZhciBsZW49dGhpcy5sZW5ndGgrbnVtLmxlbmd0aDtyZXR1cm4gMTA9PT10aGlzLmxlbmd0aCYmMTA9PT1udW0ubGVuZ3RoP2NvbWIxME11bFRvKHRoaXMsbnVtLG91dCk6bGVuPDYzP3NtYWxsTXVsVG8odGhpcyxudW0sb3V0KTpsZW48MTAyND9iaWdNdWxUbyh0aGlzLG51bSxvdXQpOmp1bWJvTXVsVG8odGhpcyxudW0sb3V0KX0sRkZUTS5wcm90b3R5cGUubWFrZVJCVD1mdW5jdGlvbiBtYWtlUkJUKE4pe2Zvcih2YXIgdD1uZXcgQXJyYXkoTiksbD1CTi5wcm90b3R5cGUuX2NvdW50Qml0cyhOKS0xLGk9MDtpPE47aSsrKXRbaV09dGhpcy5yZXZCaW4oaSxsLE4pO3JldHVybiB0fSxGRlRNLnByb3RvdHlwZS5yZXZCaW49ZnVuY3Rpb24gcmV2QmluKHgsbCxOKXtpZigwPT09eHx8eD09PU4tMSlyZXR1cm4geDtmb3IodmFyIHJiPTAsaT0wO2k8bDtpKyspcmJ8PSgxJngpPDxsLWktMSx4Pj49MTtyZXR1cm4gcmJ9LEZGVE0ucHJvdG90eXBlLnBlcm11dGU9ZnVuY3Rpb24gcGVybXV0ZShyYnQscndzLGl3cyxydHdzLGl0d3MsTil7Zm9yKHZhciBpPTA7aTxOO2krKylydHdzW2ldPXJ3c1tyYnRbaV1dLGl0d3NbaV09aXdzW3JidFtpXV19LEZGVE0ucHJvdG90eXBlLnRyYW5zZm9ybT1mdW5jdGlvbiB0cmFuc2Zvcm0ocndzLGl3cyxydHdzLGl0d3MsTixyYnQpe3RoaXMucGVybXV0ZShyYnQscndzLGl3cyxydHdzLGl0d3MsTik7Zm9yKHZhciBzPTE7czxOO3M8PD0xKWZvcih2YXIgbD1zPDwxLHJ0d2RmPU1hdGguY29zKDIqTWF0aC5QSS9sKSxpdHdkZj1NYXRoLnNpbigyKk1hdGguUEkvbCkscD0wO3A8TjtwKz1sKWZvcih2YXIgcnR3ZGZfPXJ0d2RmLGl0d2RmXz1pdHdkZixqPTA7ajxzO2orKyl7dmFyIHJlPXJ0d3NbcCtqXSxpZT1pdHdzW3Aral0scm89cnR3c1twK2orc10saW89aXR3c1twK2orc10scng9cnR3ZGZfKnJvLWl0d2RmXyppbztpbz1ydHdkZl8qaW8raXR3ZGZfKnJvLHJvPXJ4LHJ0d3NbcCtqXT1yZStybyxpdHdzW3Aral09aWUraW8scnR3c1twK2orc109cmUtcm8saXR3c1twK2orc109aWUtaW8saiE9PWwmJihyeD1ydHdkZipydHdkZl8taXR3ZGYqaXR3ZGZfLGl0d2RmXz1ydHdkZippdHdkZl8raXR3ZGYqcnR3ZGZfLHJ0d2RmXz1yeCl9fSxGRlRNLnByb3RvdHlwZS5ndWVzc0xlbjEzYj1mdW5jdGlvbiBndWVzc0xlbjEzYihuLG0pe3ZhciBOPTF8TWF0aC5tYXgobSxuKSxvZGQ9MSZOLGk9MDtmb3IoTj1OLzJ8MDtOO04+Pj49MSlpKys7cmV0dXJuIDE8PGkrMStvZGR9LEZGVE0ucHJvdG90eXBlLmNvbmp1Z2F0ZT1mdW5jdGlvbiBjb25qdWdhdGUocndzLGl3cyxOKXtpZighKE48PTEpKWZvcih2YXIgaT0wO2k8Ti8yO2krKyl7dmFyIHQ9cndzW2ldO3J3c1tpXT1yd3NbTi1pLTFdLHJ3c1tOLWktMV09dCx0PWl3c1tpXSxpd3NbaV09LWl3c1tOLWktMV0saXdzW04taS0xXT0tdH19LEZGVE0ucHJvdG90eXBlLm5vcm1hbGl6ZTEzYj1mdW5jdGlvbiBub3JtYWxpemUxM2Iod3MsTil7Zm9yKHZhciBjYXJyeT0wLGk9MDtpPE4vMjtpKyspe3ZhciB3PTgxOTIqTWF0aC5yb3VuZCh3c1syKmkrMV0vTikrTWF0aC5yb3VuZCh3c1syKmldL04pK2NhcnJ5O3dzW2ldPTY3MTA4ODYzJncsY2Fycnk9dzw2NzEwODg2ND8wOncvNjcxMDg4NjR8MH1yZXR1cm4gd3N9LEZGVE0ucHJvdG90eXBlLmNvbnZlcnQxM2I9ZnVuY3Rpb24gY29udmVydDEzYih3cyxsZW4scndzLE4pe2Zvcih2YXIgY2Fycnk9MCxpPTA7aTxsZW47aSsrKWNhcnJ5Kz0wfHdzW2ldLHJ3c1syKmldPTgxOTEmY2FycnksY2Fycnk+Pj49MTMscndzWzIqaSsxXT04MTkxJmNhcnJ5LGNhcnJ5Pj4+PTEzO2ZvcihpPTIqbGVuO2k8TjsrK2kpcndzW2ldPTA7YXNzZXJ0KDA9PT1jYXJyeSksYXNzZXJ0KCEoLTgxOTImY2FycnkpKX0sRkZUTS5wcm90b3R5cGUuc3R1Yj1mdW5jdGlvbiBzdHViKE4pe2Zvcih2YXIgcGg9bmV3IEFycmF5KE4pLGk9MDtpPE47aSsrKXBoW2ldPTA7cmV0dXJuIHBofSxGRlRNLnByb3RvdHlwZS5tdWxwPWZ1bmN0aW9uIG11bHAoeCx5LG91dCl7dmFyIE49Mip0aGlzLmd1ZXNzTGVuMTNiKHgubGVuZ3RoLHkubGVuZ3RoKSxyYnQ9dGhpcy5tYWtlUkJUKE4pLF89dGhpcy5zdHViKE4pLHJ3cz1uZXcgQXJyYXkoTikscndzdD1uZXcgQXJyYXkoTiksaXdzdD1uZXcgQXJyYXkoTiksbnJ3cz1uZXcgQXJyYXkoTiksbnJ3c3Q9bmV3IEFycmF5KE4pLG5pd3N0PW5ldyBBcnJheShOKSxybXdzPW91dC53b3JkcztybXdzLmxlbmd0aD1OLHRoaXMuY29udmVydDEzYih4LndvcmRzLHgubGVuZ3RoLHJ3cyxOKSx0aGlzLmNvbnZlcnQxM2IoeS53b3Jkcyx5Lmxlbmd0aCxucndzLE4pLHRoaXMudHJhbnNmb3JtKHJ3cyxfLHJ3c3QsaXdzdCxOLHJidCksdGhpcy50cmFuc2Zvcm0obnJ3cyxfLG5yd3N0LG5pd3N0LE4scmJ0KTtmb3IodmFyIGk9MDtpPE47aSsrKXt2YXIgcng9cndzdFtpXSpucndzdFtpXS1pd3N0W2ldKm5pd3N0W2ldO2l3c3RbaV09cndzdFtpXSpuaXdzdFtpXStpd3N0W2ldKm5yd3N0W2ldLHJ3c3RbaV09cnh9cmV0dXJuIHRoaXMuY29uanVnYXRlKHJ3c3QsaXdzdCxOKSx0aGlzLnRyYW5zZm9ybShyd3N0LGl3c3Qscm13cyxfLE4scmJ0KSx0aGlzLmNvbmp1Z2F0ZShybXdzLF8sTiksdGhpcy5ub3JtYWxpemUxM2Iocm13cyxOKSxvdXQubmVnYXRpdmU9eC5uZWdhdGl2ZV55Lm5lZ2F0aXZlLG91dC5sZW5ndGg9eC5sZW5ndGgreS5sZW5ndGgsb3V0Ll9zdHJpcCgpfSxCTi5wcm90b3R5cGUubXVsPWZ1bmN0aW9uIG11bChudW0pe3ZhciBvdXQ9bmV3IEJOKG51bGwpO3JldHVybiBvdXQud29yZHM9bmV3IEFycmF5KHRoaXMubGVuZ3RoK251bS5sZW5ndGgpLHRoaXMubXVsVG8obnVtLG91dCl9LEJOLnByb3RvdHlwZS5tdWxmPWZ1bmN0aW9uIG11bGYobnVtKXt2YXIgb3V0PW5ldyBCTihudWxsKTtyZXR1cm4gb3V0LndvcmRzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCtudW0ubGVuZ3RoKSxqdW1ib011bFRvKHRoaXMsbnVtLG91dCl9LEJOLnByb3RvdHlwZS5pbXVsPWZ1bmN0aW9uIGltdWwobnVtKXtyZXR1cm4gdGhpcy5jbG9uZSgpLm11bFRvKG51bSx0aGlzKX0sQk4ucHJvdG90eXBlLmltdWxuPWZ1bmN0aW9uIGltdWxuKG51bSl7dmFyIGlzTmVnTnVtPW51bTwwO2lzTmVnTnVtJiYobnVtPS1udW0pLGFzc2VydCgibnVtYmVyIj09dHlwZW9mIG51bSksYXNzZXJ0KG51bTw2NzEwODg2NCk7Zm9yKHZhciBjYXJyeT0wLGk9MDtpPHRoaXMubGVuZ3RoO2krKyl7dmFyIHc9KDB8dGhpcy53b3Jkc1tpXSkqbnVtLGxvPSg2NzEwODg2MyZ3KSsoNjcxMDg4NjMmY2FycnkpO2NhcnJ5Pj49MjYsY2FycnkrPXcvNjcxMDg4NjR8MCxjYXJyeSs9bG8+Pj4yNix0aGlzLndvcmRzW2ldPTY3MTA4ODYzJmxvfXJldHVybiAwIT09Y2FycnkmJih0aGlzLndvcmRzW2ldPWNhcnJ5LHRoaXMubGVuZ3RoKyspLHRoaXMubGVuZ3RoPTA9PT1udW0/MTp0aGlzLmxlbmd0aCxpc05lZ051bT90aGlzLmluZWcoKTp0aGlzfSxCTi5wcm90b3R5cGUubXVsbj1mdW5jdGlvbiBtdWxuKG51bSl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pbXVsbihudW0pfSxCTi5wcm90b3R5cGUuc3FyPWZ1bmN0aW9uIHNxcigpe3JldHVybiB0aGlzLm11bCh0aGlzKX0sQk4ucHJvdG90eXBlLmlzcXI9ZnVuY3Rpb24gaXNxcigpe3JldHVybiB0aGlzLmltdWwodGhpcy5jbG9uZSgpKX0sQk4ucHJvdG90eXBlLnBvdz1mdW5jdGlvbiBwb3cobnVtKXt2YXIgdz1mdW5jdGlvbiB0b0JpdEFycmF5KG51bSl7Zm9yKHZhciB3PW5ldyBBcnJheShudW0uYml0TGVuZ3RoKCkpLGJpdD0wO2JpdDx3Lmxlbmd0aDtiaXQrKyl7dmFyIG9mZj1iaXQvMjZ8MCx3Yml0PWJpdCUyNjt3W2JpdF09bnVtLndvcmRzW29mZl0+Pj53Yml0JjF9cmV0dXJuIHd9KG51bSk7aWYoMD09PXcubGVuZ3RoKXJldHVybiBuZXcgQk4oMSk7Zm9yKHZhciByZXM9dGhpcyxpPTA7aTx3Lmxlbmd0aCYmMD09PXdbaV07aSsrLHJlcz1yZXMuc3FyKCkpO2lmKCsraTx3Lmxlbmd0aClmb3IodmFyIHE9cmVzLnNxcigpO2k8dy5sZW5ndGg7aSsrLHE9cS5zcXIoKSkwIT09d1tpXSYmKHJlcz1yZXMubXVsKHEpKTtyZXR1cm4gcmVzfSxCTi5wcm90b3R5cGUuaXVzaGxuPWZ1bmN0aW9uIGl1c2hsbihiaXRzKXthc3NlcnQoIm51bWJlciI9PXR5cGVvZiBiaXRzJiZiaXRzPj0wKTt2YXIgaSxyPWJpdHMlMjYscz0oYml0cy1yKS8yNixjYXJyeU1hc2s9NjcxMDg4NjM+Pj4yNi1yPDwyNi1yO2lmKDAhPT1yKXt2YXIgY2Fycnk9MDtmb3IoaT0wO2k8dGhpcy5sZW5ndGg7aSsrKXt2YXIgbmV3Q2Fycnk9dGhpcy53b3Jkc1tpXSZjYXJyeU1hc2ssYz0oMHx0aGlzLndvcmRzW2ldKS1uZXdDYXJyeTw8cjt0aGlzLndvcmRzW2ldPWN8Y2FycnksY2Fycnk9bmV3Q2Fycnk+Pj4yNi1yfWNhcnJ5JiYodGhpcy53b3Jkc1tpXT1jYXJyeSx0aGlzLmxlbmd0aCsrKX1pZigwIT09cyl7Zm9yKGk9dGhpcy5sZW5ndGgtMTtpPj0wO2ktLSl0aGlzLndvcmRzW2krc109dGhpcy53b3Jkc1tpXTtmb3IoaT0wO2k8cztpKyspdGhpcy53b3Jkc1tpXT0wO3RoaXMubGVuZ3RoKz1zfXJldHVybiB0aGlzLl9zdHJpcCgpfSxCTi5wcm90b3R5cGUuaXNobG49ZnVuY3Rpb24gaXNobG4oYml0cyl7cmV0dXJuIGFzc2VydCgwPT09dGhpcy5uZWdhdGl2ZSksdGhpcy5pdXNobG4oYml0cyl9LEJOLnByb3RvdHlwZS5pdXNocm49ZnVuY3Rpb24gaXVzaHJuKGJpdHMsaGludCxleHRlbmRlZCl7dmFyIGg7YXNzZXJ0KCJudW1iZXIiPT10eXBlb2YgYml0cyYmYml0cz49MCksaD1oaW50PyhoaW50LWhpbnQlMjYpLzI2OjA7dmFyIHI9Yml0cyUyNixzPU1hdGgubWluKChiaXRzLXIpLzI2LHRoaXMubGVuZ3RoKSxtYXNrPTY3MTA4ODYzXjY3MTA4ODYzPj4+cjw8cixtYXNrZWRXb3Jkcz1leHRlbmRlZDtpZihoLT1zLGg9TWF0aC5tYXgoMCxoKSxtYXNrZWRXb3Jkcyl7Zm9yKHZhciBpPTA7aTxzO2krKyltYXNrZWRXb3Jkcy53b3Jkc1tpXT10aGlzLndvcmRzW2ldO21hc2tlZFdvcmRzLmxlbmd0aD1zfWlmKDA9PT1zKTtlbHNlIGlmKHRoaXMubGVuZ3RoPnMpZm9yKHRoaXMubGVuZ3RoLT1zLGk9MDtpPHRoaXMubGVuZ3RoO2krKyl0aGlzLndvcmRzW2ldPXRoaXMud29yZHNbaStzXTtlbHNlIHRoaXMud29yZHNbMF09MCx0aGlzLmxlbmd0aD0xO3ZhciBjYXJyeT0wO2ZvcihpPXRoaXMubGVuZ3RoLTE7aT49MCYmKDAhPT1jYXJyeXx8aT49aCk7aS0tKXt2YXIgd29yZD0wfHRoaXMud29yZHNbaV07dGhpcy53b3Jkc1tpXT1jYXJyeTw8MjYtcnx3b3JkPj4+cixjYXJyeT13b3JkJm1hc2t9cmV0dXJuIG1hc2tlZFdvcmRzJiYwIT09Y2FycnkmJihtYXNrZWRXb3Jkcy53b3Jkc1ttYXNrZWRXb3Jkcy5sZW5ndGgrK109Y2FycnkpLDA9PT10aGlzLmxlbmd0aCYmKHRoaXMud29yZHNbMF09MCx0aGlzLmxlbmd0aD0xKSx0aGlzLl9zdHJpcCgpfSxCTi5wcm90b3R5cGUuaXNocm49ZnVuY3Rpb24gaXNocm4oYml0cyxoaW50LGV4dGVuZGVkKXtyZXR1cm4gYXNzZXJ0KDA9PT10aGlzLm5lZ2F0aXZlKSx0aGlzLml1c2hybihiaXRzLGhpbnQsZXh0ZW5kZWQpfSxCTi5wcm90b3R5cGUuc2hsbj1mdW5jdGlvbiBzaGxuKGJpdHMpe3JldHVybiB0aGlzLmNsb25lKCkuaXNobG4oYml0cyl9LEJOLnByb3RvdHlwZS51c2hsbj1mdW5jdGlvbiB1c2hsbihiaXRzKXtyZXR1cm4gdGhpcy5jbG9uZSgpLml1c2hsbihiaXRzKX0sQk4ucHJvdG90eXBlLnNocm49ZnVuY3Rpb24gc2hybihiaXRzKXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlzaHJuKGJpdHMpfSxCTi5wcm90b3R5cGUudXNocm49ZnVuY3Rpb24gdXNocm4oYml0cyl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pdXNocm4oYml0cyl9LEJOLnByb3RvdHlwZS50ZXN0bj1mdW5jdGlvbiB0ZXN0bihiaXQpe2Fzc2VydCgibnVtYmVyIj09dHlwZW9mIGJpdCYmYml0Pj0wKTt2YXIgcj1iaXQlMjYscz0oYml0LXIpLzI2LHE9MTw8cjtyZXR1cm4hKHRoaXMubGVuZ3RoPD1zKSYmISEodGhpcy53b3Jkc1tzXSZxKX0sQk4ucHJvdG90eXBlLmltYXNrbj1mdW5jdGlvbiBpbWFza24oYml0cyl7YXNzZXJ0KCJudW1iZXIiPT10eXBlb2YgYml0cyYmYml0cz49MCk7dmFyIHI9Yml0cyUyNixzPShiaXRzLXIpLzI2O2lmKGFzc2VydCgwPT09dGhpcy5uZWdhdGl2ZSwiaW1hc2tuIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZSBudW1iZXJzIiksdGhpcy5sZW5ndGg8PXMpcmV0dXJuIHRoaXM7aWYoMCE9PXImJnMrKyx0aGlzLmxlbmd0aD1NYXRoLm1pbihzLHRoaXMubGVuZ3RoKSwwIT09cil7dmFyIG1hc2s9NjcxMDg4NjNeNjcxMDg4NjM+Pj5yPDxyO3RoaXMud29yZHNbdGhpcy5sZW5ndGgtMV0mPW1hc2t9cmV0dXJuIDA9PT10aGlzLmxlbmd0aCYmKHRoaXMud29yZHNbMF09MCx0aGlzLmxlbmd0aD0xKSx0aGlzLl9zdHJpcCgpfSxCTi5wcm90b3R5cGUubWFza249ZnVuY3Rpb24gbWFza24oYml0cyl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pbWFza24oYml0cyl9LEJOLnByb3RvdHlwZS5pYWRkbj1mdW5jdGlvbiBpYWRkbihudW0pe3JldHVybiBhc3NlcnQoIm51bWJlciI9PXR5cGVvZiBudW0pLGFzc2VydChudW08NjcxMDg4NjQpLG51bTwwP3RoaXMuaXN1Ym4oLW51bSk6MCE9PXRoaXMubmVnYXRpdmU/MT09PXRoaXMubGVuZ3RoJiYoMHx0aGlzLndvcmRzWzBdKTw9bnVtPyh0aGlzLndvcmRzWzBdPW51bS0oMHx0aGlzLndvcmRzWzBdKSx0aGlzLm5lZ2F0aXZlPTAsdGhpcyk6KHRoaXMubmVnYXRpdmU9MCx0aGlzLmlzdWJuKG51bSksdGhpcy5uZWdhdGl2ZT0xLHRoaXMpOnRoaXMuX2lhZGRuKG51bSl9LEJOLnByb3RvdHlwZS5faWFkZG49ZnVuY3Rpb24gX2lhZGRuKG51bSl7dGhpcy53b3Jkc1swXSs9bnVtO2Zvcih2YXIgaT0wO2k8dGhpcy5sZW5ndGgmJnRoaXMud29yZHNbaV0+PTY3MTA4ODY0O2krKyl0aGlzLndvcmRzW2ldLT02NzEwODg2NCxpPT09dGhpcy5sZW5ndGgtMT90aGlzLndvcmRzW2krMV09MTp0aGlzLndvcmRzW2krMV0rKztyZXR1cm4gdGhpcy5sZW5ndGg9TWF0aC5tYXgodGhpcy5sZW5ndGgsaSsxKSx0aGlzfSxCTi5wcm90b3R5cGUuaXN1Ym49ZnVuY3Rpb24gaXN1Ym4obnVtKXtpZihhc3NlcnQoIm51bWJlciI9PXR5cGVvZiBudW0pLGFzc2VydChudW08NjcxMDg4NjQpLG51bTwwKXJldHVybiB0aGlzLmlhZGRuKC1udW0pO2lmKDAhPT10aGlzLm5lZ2F0aXZlKXJldHVybiB0aGlzLm5lZ2F0aXZlPTAsdGhpcy5pYWRkbihudW0pLHRoaXMubmVnYXRpdmU9MSx0aGlzO2lmKHRoaXMud29yZHNbMF0tPW51bSwxPT09dGhpcy5sZW5ndGgmJnRoaXMud29yZHNbMF08MCl0aGlzLndvcmRzWzBdPS10aGlzLndvcmRzWzBdLHRoaXMubmVnYXRpdmU9MTtlbHNlIGZvcih2YXIgaT0wO2k8dGhpcy5sZW5ndGgmJnRoaXMud29yZHNbaV08MDtpKyspdGhpcy53b3Jkc1tpXSs9NjcxMDg4NjQsdGhpcy53b3Jkc1tpKzFdLT0xO3JldHVybiB0aGlzLl9zdHJpcCgpfSxCTi5wcm90b3R5cGUuYWRkbj1mdW5jdGlvbiBhZGRuKG51bSl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pYWRkbihudW0pfSxCTi5wcm90b3R5cGUuc3Vibj1mdW5jdGlvbiBzdWJuKG51bSl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pc3VibihudW0pfSxCTi5wcm90b3R5cGUuaWFicz1mdW5jdGlvbiBpYWJzKCl7cmV0dXJuIHRoaXMubmVnYXRpdmU9MCx0aGlzfSxCTi5wcm90b3R5cGUuYWJzPWZ1bmN0aW9uIGFicygpe3JldHVybiB0aGlzLmNsb25lKCkuaWFicygpfSxCTi5wcm90b3R5cGUuX2lzaGxuc3VibXVsPWZ1bmN0aW9uIF9pc2hsbnN1Ym11bChudW0sbXVsLHNoaWZ0KXt2YXIgaSx3LGxlbj1udW0ubGVuZ3RoK3NoaWZ0O3RoaXMuX2V4cGFuZChsZW4pO3ZhciBjYXJyeT0wO2ZvcihpPTA7aTxudW0ubGVuZ3RoO2krKyl7dz0oMHx0aGlzLndvcmRzW2krc2hpZnRdKStjYXJyeTt2YXIgcmlnaHQ9KDB8bnVtLndvcmRzW2ldKSptdWw7Y2Fycnk9KCh3LT02NzEwODg2MyZyaWdodCk+PjI2KS0ocmlnaHQvNjcxMDg4NjR8MCksdGhpcy53b3Jkc1tpK3NoaWZ0XT02NzEwODg2MyZ3fWZvcig7aTx0aGlzLmxlbmd0aC1zaGlmdDtpKyspY2Fycnk9KHc9KDB8dGhpcy53b3Jkc1tpK3NoaWZ0XSkrY2FycnkpPj4yNix0aGlzLndvcmRzW2krc2hpZnRdPTY3MTA4ODYzJnc7aWYoMD09PWNhcnJ5KXJldHVybiB0aGlzLl9zdHJpcCgpO2Zvcihhc3NlcnQoLTE9PT1jYXJyeSksY2Fycnk9MCxpPTA7aTx0aGlzLmxlbmd0aDtpKyspY2Fycnk9KHc9LSgwfHRoaXMud29yZHNbaV0pK2NhcnJ5KT4+MjYsdGhpcy53b3Jkc1tpXT02NzEwODg2MyZ3O3JldHVybiB0aGlzLm5lZ2F0aXZlPTEsdGhpcy5fc3RyaXAoKX0sQk4ucHJvdG90eXBlLl93b3JkRGl2PWZ1bmN0aW9uIF93b3JkRGl2KG51bSxtb2RlKXt2YXIgc2hpZnQ9KHRoaXMubGVuZ3RoLG51bS5sZW5ndGgpLGE9dGhpcy5jbG9uZSgpLGI9bnVtLGJoaT0wfGIud29yZHNbYi5sZW5ndGgtMV07MCE9PShzaGlmdD0yNi10aGlzLl9jb3VudEJpdHMoYmhpKSkmJihiPWIudXNobG4oc2hpZnQpLGEuaXVzaGxuKHNoaWZ0KSxiaGk9MHxiLndvcmRzW2IubGVuZ3RoLTFdKTt2YXIgcSxtPWEubGVuZ3RoLWIubGVuZ3RoO2lmKCJtb2QiIT09bW9kZSl7KHE9bmV3IEJOKG51bGwpKS5sZW5ndGg9bSsxLHEud29yZHM9bmV3IEFycmF5KHEubGVuZ3RoKTtmb3IodmFyIGk9MDtpPHEubGVuZ3RoO2krKylxLndvcmRzW2ldPTB9dmFyIGRpZmY9YS5jbG9uZSgpLl9pc2hsbnN1Ym11bChiLDEsbSk7MD09PWRpZmYubmVnYXRpdmUmJihhPWRpZmYscSYmKHEud29yZHNbbV09MSkpO2Zvcih2YXIgaj1tLTE7aj49MDtqLS0pe3ZhciBxaj02NzEwODg2NCooMHxhLndvcmRzW2IubGVuZ3RoK2pdKSsoMHxhLndvcmRzW2IubGVuZ3RoK2otMV0pO2Zvcihxaj1NYXRoLm1pbihxai9iaGl8MCw2NzEwODg2MyksYS5faXNobG5zdWJtdWwoYixxaixqKTswIT09YS5uZWdhdGl2ZTspcWotLSxhLm5lZ2F0aXZlPTAsYS5faXNobG5zdWJtdWwoYiwxLGopLGEuaXNaZXJvKCl8fChhLm5lZ2F0aXZlXj0xKTtxJiYocS53b3Jkc1tqXT1xail9cmV0dXJuIHEmJnEuX3N0cmlwKCksYS5fc3RyaXAoKSwiZGl2IiE9PW1vZGUmJjAhPT1zaGlmdCYmYS5pdXNocm4oc2hpZnQpLHtkaXY6cXx8bnVsbCxtb2Q6YX19LEJOLnByb3RvdHlwZS5kaXZtb2Q9ZnVuY3Rpb24gZGl2bW9kKG51bSxtb2RlLHBvc2l0aXZlKXtyZXR1cm4gYXNzZXJ0KCFudW0uaXNaZXJvKCkpLHRoaXMuaXNaZXJvKCk/e2RpdjpuZXcgQk4oMCksbW9kOm5ldyBCTigwKX06MCE9PXRoaXMubmVnYXRpdmUmJjA9PT1udW0ubmVnYXRpdmU/KHJlcz10aGlzLm5lZygpLmRpdm1vZChudW0sbW9kZSksIm1vZCIhPT1tb2RlJiYoZGl2PXJlcy5kaXYubmVnKCkpLCJkaXYiIT09bW9kZSYmKG1vZD1yZXMubW9kLm5lZygpLHBvc2l0aXZlJiYwIT09bW9kLm5lZ2F0aXZlJiZtb2QuaWFkZChudW0pKSx7ZGl2LG1vZH0pOjA9PT10aGlzLm5lZ2F0aXZlJiYwIT09bnVtLm5lZ2F0aXZlPyhyZXM9dGhpcy5kaXZtb2QobnVtLm5lZygpLG1vZGUpLCJtb2QiIT09bW9kZSYmKGRpdj1yZXMuZGl2Lm5lZygpKSx7ZGl2LG1vZDpyZXMubW9kfSk6MCE9PSh0aGlzLm5lZ2F0aXZlJm51bS5uZWdhdGl2ZSk/KHJlcz10aGlzLm5lZygpLmRpdm1vZChudW0ubmVnKCksbW9kZSksImRpdiIhPT1tb2RlJiYobW9kPXJlcy5tb2QubmVnKCkscG9zaXRpdmUmJjAhPT1tb2QubmVnYXRpdmUmJm1vZC5pc3ViKG51bSkpLHtkaXY6cmVzLmRpdixtb2R9KTpudW0ubGVuZ3RoPnRoaXMubGVuZ3RofHx0aGlzLmNtcChudW0pPDA/e2RpdjpuZXcgQk4oMCksbW9kOnRoaXN9OjE9PT1udW0ubGVuZ3RoPyJkaXYiPT09bW9kZT97ZGl2OnRoaXMuZGl2bihudW0ud29yZHNbMF0pLG1vZDpudWxsfToibW9kIj09PW1vZGU/e2RpdjpudWxsLG1vZDpuZXcgQk4odGhpcy5tb2RybihudW0ud29yZHNbMF0pKX06e2Rpdjp0aGlzLmRpdm4obnVtLndvcmRzWzBdKSxtb2Q6bmV3IEJOKHRoaXMubW9kcm4obnVtLndvcmRzWzBdKSl9OnRoaXMuX3dvcmREaXYobnVtLG1vZGUpO3ZhciBkaXYsbW9kLHJlc30sQk4ucHJvdG90eXBlLmRpdj1mdW5jdGlvbiBkaXYobnVtKXtyZXR1cm4gdGhpcy5kaXZtb2QobnVtLCJkaXYiLCExKS5kaXZ9LEJOLnByb3RvdHlwZS5tb2Q9ZnVuY3Rpb24gbW9kKG51bSl7cmV0dXJuIHRoaXMuZGl2bW9kKG51bSwibW9kIiwhMSkubW9kfSxCTi5wcm90b3R5cGUudW1vZD1mdW5jdGlvbiB1bW9kKG51bSl7cmV0dXJuIHRoaXMuZGl2bW9kKG51bSwibW9kIiwhMCkubW9kfSxCTi5wcm90b3R5cGUuZGl2Um91bmQ9ZnVuY3Rpb24gZGl2Um91bmQobnVtKXt2YXIgZG09dGhpcy5kaXZtb2QobnVtKTtpZihkbS5tb2QuaXNaZXJvKCkpcmV0dXJuIGRtLmRpdjt2YXIgbW9kPTAhPT1kbS5kaXYubmVnYXRpdmU/ZG0ubW9kLmlzdWIobnVtKTpkbS5tb2QsaGFsZj1udW0udXNocm4oMSkscjI9bnVtLmFuZGxuKDEpLGNtcD1tb2QuY21wKGhhbGYpO3JldHVybiBjbXA8MHx8MT09PXIyJiYwPT09Y21wP2RtLmRpdjowIT09ZG0uZGl2Lm5lZ2F0aXZlP2RtLmRpdi5pc3VibigxKTpkbS5kaXYuaWFkZG4oMSl9LEJOLnByb3RvdHlwZS5tb2Rybj1mdW5jdGlvbiBtb2RybihudW0pe3ZhciBpc05lZ051bT1udW08MDtpc05lZ051bSYmKG51bT0tbnVtKSxhc3NlcnQobnVtPD02NzEwODg2Myk7Zm9yKHZhciBwPSgxPDwyNiklbnVtLGFjYz0wLGk9dGhpcy5sZW5ndGgtMTtpPj0wO2ktLSlhY2M9KHAqYWNjKygwfHRoaXMud29yZHNbaV0pKSVudW07cmV0dXJuIGlzTmVnTnVtPy1hY2M6YWNjfSxCTi5wcm90b3R5cGUubW9kbj1mdW5jdGlvbiBtb2RuKG51bSl7cmV0dXJuIHRoaXMubW9kcm4obnVtKX0sQk4ucHJvdG90eXBlLmlkaXZuPWZ1bmN0aW9uIGlkaXZuKG51bSl7dmFyIGlzTmVnTnVtPW51bTwwO2lzTmVnTnVtJiYobnVtPS1udW0pLGFzc2VydChudW08PTY3MTA4ODYzKTtmb3IodmFyIGNhcnJ5PTAsaT10aGlzLmxlbmd0aC0xO2k+PTA7aS0tKXt2YXIgdz0oMHx0aGlzLndvcmRzW2ldKSs2NzEwODg2NCpjYXJyeTt0aGlzLndvcmRzW2ldPXcvbnVtfDAsY2Fycnk9dyVudW19cmV0dXJuIHRoaXMuX3N0cmlwKCksaXNOZWdOdW0/dGhpcy5pbmVnKCk6dGhpc30sQk4ucHJvdG90eXBlLmRpdm49ZnVuY3Rpb24gZGl2bihudW0pe3JldHVybiB0aGlzLmNsb25lKCkuaWRpdm4obnVtKX0sQk4ucHJvdG90eXBlLmVnY2Q9ZnVuY3Rpb24gZWdjZChwKXthc3NlcnQoMD09PXAubmVnYXRpdmUpLGFzc2VydCghcC5pc1plcm8oKSk7dmFyIHg9dGhpcyx5PXAuY2xvbmUoKTt4PTAhPT14Lm5lZ2F0aXZlP3gudW1vZChwKTp4LmNsb25lKCk7Zm9yKHZhciBBPW5ldyBCTigxKSxCPW5ldyBCTigwKSxDPW5ldyBCTigwKSxEPW5ldyBCTigxKSxnPTA7eC5pc0V2ZW4oKSYmeS5pc0V2ZW4oKTspeC5pdXNocm4oMSkseS5pdXNocm4oMSksKytnO2Zvcih2YXIgeXA9eS5jbG9uZSgpLHhwPXguY2xvbmUoKTsheC5pc1plcm8oKTspe2Zvcih2YXIgaT0wLGltPTE7MD09PSh4LndvcmRzWzBdJmltKSYmaTwyNjsrK2ksaW08PD0xKTtpZihpPjApZm9yKHguaXVzaHJuKGkpO2ktLSA+MDspKEEuaXNPZGQoKXx8Qi5pc09kZCgpKSYmKEEuaWFkZCh5cCksQi5pc3ViKHhwKSksQS5pdXNocm4oMSksQi5pdXNocm4oMSk7Zm9yKHZhciBqPTAsam09MTswPT09KHkud29yZHNbMF0mam0pJiZqPDI2OysraixqbTw8PTEpO2lmKGo+MClmb3IoeS5pdXNocm4oaik7ai0tID4wOykoQy5pc09kZCgpfHxELmlzT2RkKCkpJiYoQy5pYWRkKHlwKSxELmlzdWIoeHApKSxDLml1c2hybigxKSxELml1c2hybigxKTt4LmNtcCh5KT49MD8oeC5pc3ViKHkpLEEuaXN1YihDKSxCLmlzdWIoRCkpOih5LmlzdWIoeCksQy5pc3ViKEEpLEQuaXN1YihCKSl9cmV0dXJue2E6QyxiOkQsZ2NkOnkuaXVzaGxuKGcpfX0sQk4ucHJvdG90eXBlLl9pbnZtcD1mdW5jdGlvbiBfaW52bXAocCl7YXNzZXJ0KDA9PT1wLm5lZ2F0aXZlKSxhc3NlcnQoIXAuaXNaZXJvKCkpO3ZhciBhPXRoaXMsYj1wLmNsb25lKCk7YT0wIT09YS5uZWdhdGl2ZT9hLnVtb2QocCk6YS5jbG9uZSgpO2Zvcih2YXIgcmVzLHgxPW5ldyBCTigxKSx4Mj1uZXcgQk4oMCksZGVsdGE9Yi5jbG9uZSgpO2EuY21wbigxKT4wJiZiLmNtcG4oMSk+MDspe2Zvcih2YXIgaT0wLGltPTE7MD09PShhLndvcmRzWzBdJmltKSYmaTwyNjsrK2ksaW08PD0xKTtpZihpPjApZm9yKGEuaXVzaHJuKGkpO2ktLSA+MDspeDEuaXNPZGQoKSYmeDEuaWFkZChkZWx0YSkseDEuaXVzaHJuKDEpO2Zvcih2YXIgaj0wLGptPTE7MD09PShiLndvcmRzWzBdJmptKSYmajwyNjsrK2osam08PD0xKTtpZihqPjApZm9yKGIuaXVzaHJuKGopO2otLSA+MDspeDIuaXNPZGQoKSYmeDIuaWFkZChkZWx0YSkseDIuaXVzaHJuKDEpO2EuY21wKGIpPj0wPyhhLmlzdWIoYikseDEuaXN1Yih4MikpOihiLmlzdWIoYSkseDIuaXN1Yih4MSkpfXJldHVybihyZXM9MD09PWEuY21wbigxKT94MTp4MikuY21wbigwKTwwJiZyZXMuaWFkZChwKSxyZXN9LEJOLnByb3RvdHlwZS5nY2Q9ZnVuY3Rpb24gZ2NkKG51bSl7aWYodGhpcy5pc1plcm8oKSlyZXR1cm4gbnVtLmFicygpO2lmKG51bS5pc1plcm8oKSlyZXR1cm4gdGhpcy5hYnMoKTt2YXIgYT10aGlzLmNsb25lKCksYj1udW0uY2xvbmUoKTthLm5lZ2F0aXZlPTAsYi5uZWdhdGl2ZT0wO2Zvcih2YXIgc2hpZnQ9MDthLmlzRXZlbigpJiZiLmlzRXZlbigpO3NoaWZ0KyspYS5pdXNocm4oMSksYi5pdXNocm4oMSk7Zm9yKDs7KXtmb3IoO2EuaXNFdmVuKCk7KWEuaXVzaHJuKDEpO2Zvcig7Yi5pc0V2ZW4oKTspYi5pdXNocm4oMSk7dmFyIHI9YS5jbXAoYik7aWYocjwwKXt2YXIgdD1hO2E9YixiPXR9ZWxzZSBpZigwPT09cnx8MD09PWIuY21wbigxKSlicmVhazthLmlzdWIoYil9cmV0dXJuIGIuaXVzaGxuKHNoaWZ0KX0sQk4ucHJvdG90eXBlLmludm09ZnVuY3Rpb24gaW52bShudW0pe3JldHVybiB0aGlzLmVnY2QobnVtKS5hLnVtb2QobnVtKX0sQk4ucHJvdG90eXBlLmlzRXZlbj1mdW5jdGlvbiBpc0V2ZW4oKXtyZXR1cm4hKDEmdGhpcy53b3Jkc1swXSl9LEJOLnByb3RvdHlwZS5pc09kZD1mdW5jdGlvbiBpc09kZCgpe3JldHVybiEoMSZ+dGhpcy53b3Jkc1swXSl9LEJOLnByb3RvdHlwZS5hbmRsbj1mdW5jdGlvbiBhbmRsbihudW0pe3JldHVybiB0aGlzLndvcmRzWzBdJm51bX0sQk4ucHJvdG90eXBlLmJpbmNuPWZ1bmN0aW9uIGJpbmNuKGJpdCl7YXNzZXJ0KCJudW1iZXIiPT10eXBlb2YgYml0KTt2YXIgcj1iaXQlMjYscz0oYml0LXIpLzI2LHE9MTw8cjtpZih0aGlzLmxlbmd0aDw9cylyZXR1cm4gdGhpcy5fZXhwYW5kKHMrMSksdGhpcy53b3Jkc1tzXXw9cSx0aGlzO2Zvcih2YXIgY2Fycnk9cSxpPXM7MCE9PWNhcnJ5JiZpPHRoaXMubGVuZ3RoO2krKyl7dmFyIHc9MHx0aGlzLndvcmRzW2ldO2NhcnJ5PSh3Kz1jYXJyeSk+Pj4yNix3Jj02NzEwODg2Myx0aGlzLndvcmRzW2ldPXd9cmV0dXJuIDAhPT1jYXJyeSYmKHRoaXMud29yZHNbaV09Y2FycnksdGhpcy5sZW5ndGgrKyksdGhpc30sQk4ucHJvdG90eXBlLmlzWmVybz1mdW5jdGlvbiBpc1plcm8oKXtyZXR1cm4gMT09PXRoaXMubGVuZ3RoJiYwPT09dGhpcy53b3Jkc1swXX0sQk4ucHJvdG90eXBlLmNtcG49ZnVuY3Rpb24gY21wbihudW0pe3ZhciByZXMsbmVnYXRpdmU9bnVtPDA7aWYoMCE9PXRoaXMubmVnYXRpdmUmJiFuZWdhdGl2ZSlyZXR1cm4tMTtpZigwPT09dGhpcy5uZWdhdGl2ZSYmbmVnYXRpdmUpcmV0dXJuIDE7aWYodGhpcy5fc3RyaXAoKSx0aGlzLmxlbmd0aD4xKXJlcz0xO2Vsc2V7bmVnYXRpdmUmJihudW09LW51bSksYXNzZXJ0KG51bTw9NjcxMDg4NjMsIk51bWJlciBpcyB0b28gYmlnIik7dmFyIHc9MHx0aGlzLndvcmRzWzBdO3Jlcz13PT09bnVtPzA6dzxudW0/LTE6MX1yZXR1cm4gMCE9PXRoaXMubmVnYXRpdmU/MHwtcmVzOnJlc30sQk4ucHJvdG90eXBlLmNtcD1mdW5jdGlvbiBjbXAobnVtKXtpZigwIT09dGhpcy5uZWdhdGl2ZSYmMD09PW51bS5uZWdhdGl2ZSlyZXR1cm4tMTtpZigwPT09dGhpcy5uZWdhdGl2ZSYmMCE9PW51bS5uZWdhdGl2ZSlyZXR1cm4gMTt2YXIgcmVzPXRoaXMudWNtcChudW0pO3JldHVybiAwIT09dGhpcy5uZWdhdGl2ZT8wfC1yZXM6cmVzfSxCTi5wcm90b3R5cGUudWNtcD1mdW5jdGlvbiB1Y21wKG51bSl7aWYodGhpcy5sZW5ndGg+bnVtLmxlbmd0aClyZXR1cm4gMTtpZih0aGlzLmxlbmd0aDxudW0ubGVuZ3RoKXJldHVybi0xO2Zvcih2YXIgcmVzPTAsaT10aGlzLmxlbmd0aC0xO2k+PTA7aS0tKXt2YXIgYT0wfHRoaXMud29yZHNbaV0sYj0wfG51bS53b3Jkc1tpXTtpZihhIT09Yil7YTxiP3Jlcz0tMTphPmImJihyZXM9MSk7YnJlYWt9fXJldHVybiByZXN9LEJOLnByb3RvdHlwZS5ndG49ZnVuY3Rpb24gZ3RuKG51bSl7cmV0dXJuIDE9PT10aGlzLmNtcG4obnVtKX0sQk4ucHJvdG90eXBlLmd0PWZ1bmN0aW9uIGd0KG51bSl7cmV0dXJuIDE9PT10aGlzLmNtcChudW0pfSxCTi5wcm90b3R5cGUuZ3Rlbj1mdW5jdGlvbiBndGVuKG51bSl7cmV0dXJuIHRoaXMuY21wbihudW0pPj0wfSxCTi5wcm90b3R5cGUuZ3RlPWZ1bmN0aW9uIGd0ZShudW0pe3JldHVybiB0aGlzLmNtcChudW0pPj0wfSxCTi5wcm90b3R5cGUubHRuPWZ1bmN0aW9uIGx0bihudW0pe3JldHVybi0xPT09dGhpcy5jbXBuKG51bSl9LEJOLnByb3RvdHlwZS5sdD1mdW5jdGlvbiBsdChudW0pe3JldHVybi0xPT09dGhpcy5jbXAobnVtKX0sQk4ucHJvdG90eXBlLmx0ZW49ZnVuY3Rpb24gbHRlbihudW0pe3JldHVybiB0aGlzLmNtcG4obnVtKTw9MH0sQk4ucHJvdG90eXBlLmx0ZT1mdW5jdGlvbiBsdGUobnVtKXtyZXR1cm4gdGhpcy5jbXAobnVtKTw9MH0sQk4ucHJvdG90eXBlLmVxbj1mdW5jdGlvbiBlcW4obnVtKXtyZXR1cm4gMD09PXRoaXMuY21wbihudW0pfSxCTi5wcm90b3R5cGUuZXE9ZnVuY3Rpb24gZXEobnVtKXtyZXR1cm4gMD09PXRoaXMuY21wKG51bSl9LEJOLnJlZD1mdW5jdGlvbiByZWQobnVtKXtyZXR1cm4gbmV3IFJlZChudW0pfSxCTi5wcm90b3R5cGUudG9SZWQ9ZnVuY3Rpb24gdG9SZWQoY3R4KXtyZXR1cm4gYXNzZXJ0KCF0aGlzLnJlZCwiQWxyZWFkeSBhIG51bWJlciBpbiByZWR1Y3Rpb24gY29udGV4dCIpLGFzc2VydCgwPT09dGhpcy5uZWdhdGl2ZSwicmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMiKSxjdHguY29udmVydFRvKHRoaXMpLl9mb3JjZVJlZChjdHgpfSxCTi5wcm90b3R5cGUuZnJvbVJlZD1mdW5jdGlvbiBmcm9tUmVkKCl7cmV0dXJuIGFzc2VydCh0aGlzLnJlZCwiZnJvbVJlZCB3b3JrcyBvbmx5IHdpdGggbnVtYmVycyBpbiByZWR1Y3Rpb24gY29udGV4dCIpLHRoaXMucmVkLmNvbnZlcnRGcm9tKHRoaXMpfSxCTi5wcm90b3R5cGUuX2ZvcmNlUmVkPWZ1bmN0aW9uIF9mb3JjZVJlZChjdHgpe3JldHVybiB0aGlzLnJlZD1jdHgsdGhpc30sQk4ucHJvdG90eXBlLmZvcmNlUmVkPWZ1bmN0aW9uIGZvcmNlUmVkKGN0eCl7cmV0dXJuIGFzc2VydCghdGhpcy5yZWQsIkFscmVhZHkgYSBudW1iZXIgaW4gcmVkdWN0aW9uIGNvbnRleHQiKSx0aGlzLl9mb3JjZVJlZChjdHgpfSxCTi5wcm90b3R5cGUucmVkQWRkPWZ1bmN0aW9uIHJlZEFkZChudW0pe3JldHVybiBhc3NlcnQodGhpcy5yZWQsInJlZEFkZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5hZGQodGhpcyxudW0pfSxCTi5wcm90b3R5cGUucmVkSUFkZD1mdW5jdGlvbiByZWRJQWRkKG51bSl7cmV0dXJuIGFzc2VydCh0aGlzLnJlZCwicmVkSUFkZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5pYWRkKHRoaXMsbnVtKX0sQk4ucHJvdG90eXBlLnJlZFN1Yj1mdW5jdGlvbiByZWRTdWIobnVtKXtyZXR1cm4gYXNzZXJ0KHRoaXMucmVkLCJyZWRTdWIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuc3ViKHRoaXMsbnVtKX0sQk4ucHJvdG90eXBlLnJlZElTdWI9ZnVuY3Rpb24gcmVkSVN1YihudW0pe3JldHVybiBhc3NlcnQodGhpcy5yZWQsInJlZElTdWIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuaXN1Yih0aGlzLG51bSl9LEJOLnByb3RvdHlwZS5yZWRTaGw9ZnVuY3Rpb24gcmVkU2hsKG51bSl7cmV0dXJuIGFzc2VydCh0aGlzLnJlZCwicmVkU2hsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLnNobCh0aGlzLG51bSl9LEJOLnByb3RvdHlwZS5yZWRNdWw9ZnVuY3Rpb24gcmVkTXVsKG51bSl7cmV0dXJuIGFzc2VydCh0aGlzLnJlZCwicmVkTXVsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLl92ZXJpZnkyKHRoaXMsbnVtKSx0aGlzLnJlZC5tdWwodGhpcyxudW0pfSxCTi5wcm90b3R5cGUucmVkSU11bD1mdW5jdGlvbiByZWRJTXVsKG51bSl7cmV0dXJuIGFzc2VydCh0aGlzLnJlZCwicmVkTXVsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLl92ZXJpZnkyKHRoaXMsbnVtKSx0aGlzLnJlZC5pbXVsKHRoaXMsbnVtKX0sQk4ucHJvdG90eXBlLnJlZFNxcj1mdW5jdGlvbiByZWRTcXIoKXtyZXR1cm4gYXNzZXJ0KHRoaXMucmVkLCJyZWRTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQuc3FyKHRoaXMpfSxCTi5wcm90b3R5cGUucmVkSVNxcj1mdW5jdGlvbiByZWRJU3FyKCl7cmV0dXJuIGFzc2VydCh0aGlzLnJlZCwicmVkSVNxciB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSx0aGlzLnJlZC5pc3FyKHRoaXMpfSxCTi5wcm90b3R5cGUucmVkU3FydD1mdW5jdGlvbiByZWRTcXJ0KCl7cmV0dXJuIGFzc2VydCh0aGlzLnJlZCwicmVkU3FydCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSx0aGlzLnJlZC5zcXJ0KHRoaXMpfSxCTi5wcm90b3R5cGUucmVkSW52bT1mdW5jdGlvbiByZWRJbnZtKCl7cmV0dXJuIGFzc2VydCh0aGlzLnJlZCwicmVkSW52bSB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSx0aGlzLnJlZC5pbnZtKHRoaXMpfSxCTi5wcm90b3R5cGUucmVkTmVnPWZ1bmN0aW9uIHJlZE5lZygpe3JldHVybiBhc3NlcnQodGhpcy5yZWQsInJlZE5lZyB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSx0aGlzLnJlZC5uZWcodGhpcyl9LEJOLnByb3RvdHlwZS5yZWRQb3c9ZnVuY3Rpb24gcmVkUG93KG51bSl7cmV0dXJuIGFzc2VydCh0aGlzLnJlZCYmIW51bS5yZWQsInJlZFBvdyhub3JtYWxOdW0pIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQucG93KHRoaXMsbnVtKX07dmFyIHByaW1lcz17azI1NjpudWxsLHAyMjQ6bnVsbCxwMTkyOm51bGwscDI1NTE5Om51bGx9O2Z1bmN0aW9uIE1QcmltZShuYW1lLHApe3RoaXMubmFtZT1uYW1lLHRoaXMucD1uZXcgQk4ocCwxNiksdGhpcy5uPXRoaXMucC5iaXRMZW5ndGgoKSx0aGlzLms9bmV3IEJOKDEpLml1c2hsbih0aGlzLm4pLmlzdWIodGhpcy5wKSx0aGlzLnRtcD10aGlzLl90bXAoKX1mdW5jdGlvbiBLMjU2KCl7TVByaW1lLmNhbGwodGhpcywiazI1NiIsImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmYzJmIil9ZnVuY3Rpb24gUDIyNCgpe01QcmltZS5jYWxsKHRoaXMsInAyMjQiLCJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMSIpfWZ1bmN0aW9uIFAxOTIoKXtNUHJpbWUuY2FsbCh0aGlzLCJwMTkyIiwiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZmZmYgZmZmZmZmZmYiKX1mdW5jdGlvbiBQMjU1MTkoKXtNUHJpbWUuY2FsbCh0aGlzLCIyNTUxOSIsIjdmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZWQiKX1mdW5jdGlvbiBSZWQobSl7aWYoInN0cmluZyI9PXR5cGVvZiBtKXt2YXIgcHJpbWU9Qk4uX3ByaW1lKG0pO3RoaXMubT1wcmltZS5wLHRoaXMucHJpbWU9cHJpbWV9ZWxzZSBhc3NlcnQobS5ndG4oMSksIm1vZHVsdXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMSIpLHRoaXMubT1tLHRoaXMucHJpbWU9bnVsbH1mdW5jdGlvbiBNb250KG0pe1JlZC5jYWxsKHRoaXMsbSksdGhpcy5zaGlmdD10aGlzLm0uYml0TGVuZ3RoKCksdGhpcy5zaGlmdCUyNiE9MCYmKHRoaXMuc2hpZnQrPTI2LXRoaXMuc2hpZnQlMjYpLHRoaXMucj1uZXcgQk4oMSkuaXVzaGxuKHRoaXMuc2hpZnQpLHRoaXMucjI9dGhpcy5pbW9kKHRoaXMuci5zcXIoKSksdGhpcy5yaW52PXRoaXMuci5faW52bXAodGhpcy5tKSx0aGlzLm1pbnY9dGhpcy5yaW52Lm11bCh0aGlzLnIpLmlzdWJuKDEpLmRpdih0aGlzLm0pLHRoaXMubWludj10aGlzLm1pbnYudW1vZCh0aGlzLnIpLHRoaXMubWludj10aGlzLnIuc3ViKHRoaXMubWludil9TVByaW1lLnByb3RvdHlwZS5fdG1wPWZ1bmN0aW9uIF90bXAoKXt2YXIgdG1wPW5ldyBCTihudWxsKTtyZXR1cm4gdG1wLndvcmRzPW5ldyBBcnJheShNYXRoLmNlaWwodGhpcy5uLzEzKSksdG1wfSxNUHJpbWUucHJvdG90eXBlLmlyZWR1Y2U9ZnVuY3Rpb24gaXJlZHVjZShudW0pe3ZhciBybGVuLHI9bnVtO2Rve3RoaXMuc3BsaXQocix0aGlzLnRtcCkscmxlbj0ocj0ocj10aGlzLmltdWxLKHIpKS5pYWRkKHRoaXMudG1wKSkuYml0TGVuZ3RoKCl9d2hpbGUocmxlbj50aGlzLm4pO3ZhciBjbXA9cmxlbjx0aGlzLm4/LTE6ci51Y21wKHRoaXMucCk7cmV0dXJuIDA9PT1jbXA/KHIud29yZHNbMF09MCxyLmxlbmd0aD0xKTpjbXA+MD9yLmlzdWIodGhpcy5wKTp2b2lkIDAhPT1yLnN0cmlwP3Iuc3RyaXAoKTpyLl9zdHJpcCgpLHJ9LE1QcmltZS5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24gc3BsaXQoaW5wdXQsb3V0KXtpbnB1dC5pdXNocm4odGhpcy5uLDAsb3V0KX0sTVByaW1lLnByb3RvdHlwZS5pbXVsSz1mdW5jdGlvbiBpbXVsSyhudW0pe3JldHVybiBudW0uaW11bCh0aGlzLmspfSxpbmhlcml0cyhLMjU2LE1QcmltZSksSzI1Ni5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24gc3BsaXQoaW5wdXQsb3V0cHV0KXtmb3IodmFyIG91dExlbj1NYXRoLm1pbihpbnB1dC5sZW5ndGgsOSksaT0wO2k8b3V0TGVuO2krKylvdXRwdXQud29yZHNbaV09aW5wdXQud29yZHNbaV07aWYob3V0cHV0Lmxlbmd0aD1vdXRMZW4saW5wdXQubGVuZ3RoPD05KXJldHVybiBpbnB1dC53b3Jkc1swXT0wLHZvaWQoaW5wdXQubGVuZ3RoPTEpO3ZhciBwcmV2PWlucHV0LndvcmRzWzldO2ZvcihvdXRwdXQud29yZHNbb3V0cHV0Lmxlbmd0aCsrXT00MTk0MzAzJnByZXYsaT0xMDtpPGlucHV0Lmxlbmd0aDtpKyspe3ZhciBuZXh0PTB8aW5wdXQud29yZHNbaV07aW5wdXQud29yZHNbaS0xMF09KDQxOTQzMDMmbmV4dCk8PDR8cHJldj4+PjIyLHByZXY9bmV4dH1wcmV2Pj4+PTIyLGlucHV0LndvcmRzW2ktMTBdPXByZXYsMD09PXByZXYmJmlucHV0Lmxlbmd0aD4xMD9pbnB1dC5sZW5ndGgtPTEwOmlucHV0Lmxlbmd0aC09OX0sSzI1Ni5wcm90b3R5cGUuaW11bEs9ZnVuY3Rpb24gaW11bEsobnVtKXtudW0ud29yZHNbbnVtLmxlbmd0aF09MCxudW0ud29yZHNbbnVtLmxlbmd0aCsxXT0wLG51bS5sZW5ndGgrPTI7Zm9yKHZhciBsbz0wLGk9MDtpPG51bS5sZW5ndGg7aSsrKXt2YXIgdz0wfG51bS53b3Jkc1tpXTtsbys9OTc3KncsbnVtLndvcmRzW2ldPTY3MTA4ODYzJmxvLGxvPTY0KncrKGxvLzY3MTA4ODY0fDApfXJldHVybiAwPT09bnVtLndvcmRzW251bS5sZW5ndGgtMV0mJihudW0ubGVuZ3RoLS0sMD09PW51bS53b3Jkc1tudW0ubGVuZ3RoLTFdJiZudW0ubGVuZ3RoLS0pLG51bX0saW5oZXJpdHMoUDIyNCxNUHJpbWUpLGluaGVyaXRzKFAxOTIsTVByaW1lKSxpbmhlcml0cyhQMjU1MTksTVByaW1lKSxQMjU1MTkucHJvdG90eXBlLmltdWxLPWZ1bmN0aW9uIGltdWxLKG51bSl7Zm9yKHZhciBjYXJyeT0wLGk9MDtpPG51bS5sZW5ndGg7aSsrKXt2YXIgaGk9MTkqKDB8bnVtLndvcmRzW2ldKStjYXJyeSxsbz02NzEwODg2MyZoaTtoaT4+Pj0yNixudW0ud29yZHNbaV09bG8sY2Fycnk9aGl9cmV0dXJuIDAhPT1jYXJyeSYmKG51bS53b3Jkc1tudW0ubGVuZ3RoKytdPWNhcnJ5KSxudW19LEJOLl9wcmltZT1mdW5jdGlvbiBwcmltZShuYW1lKXtpZihwcmltZXNbbmFtZV0pcmV0dXJuIHByaW1lc1tuYW1lXTt2YXIgcHJpbWU7aWYoImsyNTYiPT09bmFtZSlwcmltZT1uZXcgSzI1NjtlbHNlIGlmKCJwMjI0Ij09PW5hbWUpcHJpbWU9bmV3IFAyMjQ7ZWxzZSBpZigicDE5MiI9PT1uYW1lKXByaW1lPW5ldyBQMTkyO2Vsc2V7aWYoInAyNTUxOSIhPT1uYW1lKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBwcmltZSAiK25hbWUpO3ByaW1lPW5ldyBQMjU1MTl9cmV0dXJuIHByaW1lc1tuYW1lXT1wcmltZSxwcmltZX0sUmVkLnByb3RvdHlwZS5fdmVyaWZ5MT1mdW5jdGlvbiBfdmVyaWZ5MShhKXthc3NlcnQoMD09PWEubmVnYXRpdmUsInJlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzIiksYXNzZXJ0KGEucmVkLCJyZWQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIil9LFJlZC5wcm90b3R5cGUuX3ZlcmlmeTI9ZnVuY3Rpb24gX3ZlcmlmeTIoYSxiKXthc3NlcnQoMD09PShhLm5lZ2F0aXZlfGIubmVnYXRpdmUpLCJyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcyIpLGFzc2VydChhLnJlZCYmYS5yZWQ9PT1iLnJlZCwicmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpfSxSZWQucHJvdG90eXBlLmltb2Q9ZnVuY3Rpb24gaW1vZChhKXtyZXR1cm4gdGhpcy5wcmltZT90aGlzLnByaW1lLmlyZWR1Y2UoYSkuX2ZvcmNlUmVkKHRoaXMpOihtb3ZlKGEsYS51bW9kKHRoaXMubSkuX2ZvcmNlUmVkKHRoaXMpKSxhKX0sUmVkLnByb3RvdHlwZS5uZWc9ZnVuY3Rpb24gbmVnKGEpe3JldHVybiBhLmlzWmVybygpP2EuY2xvbmUoKTp0aGlzLm0uc3ViKGEpLl9mb3JjZVJlZCh0aGlzKX0sUmVkLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24gYWRkKGEsYil7dGhpcy5fdmVyaWZ5MihhLGIpO3ZhciByZXM9YS5hZGQoYik7cmV0dXJuIHJlcy5jbXAodGhpcy5tKT49MCYmcmVzLmlzdWIodGhpcy5tKSxyZXMuX2ZvcmNlUmVkKHRoaXMpfSxSZWQucHJvdG90eXBlLmlhZGQ9ZnVuY3Rpb24gaWFkZChhLGIpe3RoaXMuX3ZlcmlmeTIoYSxiKTt2YXIgcmVzPWEuaWFkZChiKTtyZXR1cm4gcmVzLmNtcCh0aGlzLm0pPj0wJiZyZXMuaXN1Yih0aGlzLm0pLHJlc30sUmVkLnByb3RvdHlwZS5zdWI9ZnVuY3Rpb24gc3ViKGEsYil7dGhpcy5fdmVyaWZ5MihhLGIpO3ZhciByZXM9YS5zdWIoYik7cmV0dXJuIHJlcy5jbXBuKDApPDAmJnJlcy5pYWRkKHRoaXMubSkscmVzLl9mb3JjZVJlZCh0aGlzKX0sUmVkLnByb3RvdHlwZS5pc3ViPWZ1bmN0aW9uIGlzdWIoYSxiKXt0aGlzLl92ZXJpZnkyKGEsYik7dmFyIHJlcz1hLmlzdWIoYik7cmV0dXJuIHJlcy5jbXBuKDApPDAmJnJlcy5pYWRkKHRoaXMubSkscmVzfSxSZWQucHJvdG90eXBlLnNobD1mdW5jdGlvbiBzaGwoYSxudW0pe3JldHVybiB0aGlzLl92ZXJpZnkxKGEpLHRoaXMuaW1vZChhLnVzaGxuKG51bSkpfSxSZWQucHJvdG90eXBlLmltdWw9ZnVuY3Rpb24gaW11bChhLGIpe3JldHVybiB0aGlzLl92ZXJpZnkyKGEsYiksdGhpcy5pbW9kKGEuaW11bChiKSl9LFJlZC5wcm90b3R5cGUubXVsPWZ1bmN0aW9uIG11bChhLGIpe3JldHVybiB0aGlzLl92ZXJpZnkyKGEsYiksdGhpcy5pbW9kKGEubXVsKGIpKX0sUmVkLnByb3RvdHlwZS5pc3FyPWZ1bmN0aW9uIGlzcXIoYSl7cmV0dXJuIHRoaXMuaW11bChhLGEuY2xvbmUoKSl9LFJlZC5wcm90b3R5cGUuc3FyPWZ1bmN0aW9uIHNxcihhKXtyZXR1cm4gdGhpcy5tdWwoYSxhKX0sUmVkLnByb3RvdHlwZS5zcXJ0PWZ1bmN0aW9uIHNxcnQoYSl7aWYoYS5pc1plcm8oKSlyZXR1cm4gYS5jbG9uZSgpO3ZhciBtb2QzPXRoaXMubS5hbmRsbigzKTtpZihhc3NlcnQobW9kMyUyPT0xKSwzPT09bW9kMyl7dmFyIHBvdz10aGlzLm0uYWRkKG5ldyBCTigxKSkuaXVzaHJuKDIpO3JldHVybiB0aGlzLnBvdyhhLHBvdyl9Zm9yKHZhciBxPXRoaXMubS5zdWJuKDEpLHM9MDshcS5pc1plcm8oKSYmMD09PXEuYW5kbG4oMSk7KXMrKyxxLml1c2hybigxKTthc3NlcnQoIXEuaXNaZXJvKCkpO3ZhciBvbmU9bmV3IEJOKDEpLnRvUmVkKHRoaXMpLG5PbmU9b25lLnJlZE5lZygpLGxwb3c9dGhpcy5tLnN1Ym4oMSkuaXVzaHJuKDEpLHo9dGhpcy5tLmJpdExlbmd0aCgpO2Zvcih6PW5ldyBCTigyKnoqeikudG9SZWQodGhpcyk7MCE9PXRoaXMucG93KHosbHBvdykuY21wKG5PbmUpOyl6LnJlZElBZGQobk9uZSk7Zm9yKHZhciBjPXRoaXMucG93KHoscSkscj10aGlzLnBvdyhhLHEuYWRkbigxKS5pdXNocm4oMSkpLHQ9dGhpcy5wb3coYSxxKSxtPXM7MCE9PXQuY21wKG9uZSk7KXtmb3IodmFyIHRtcD10LGk9MDswIT09dG1wLmNtcChvbmUpO2krKyl0bXA9dG1wLnJlZFNxcigpO2Fzc2VydChpPG0pO3ZhciBiPXRoaXMucG93KGMsbmV3IEJOKDEpLml1c2hsbihtLWktMSkpO3I9ci5yZWRNdWwoYiksYz1iLnJlZFNxcigpLHQ9dC5yZWRNdWwoYyksbT1pfXJldHVybiByfSxSZWQucHJvdG90eXBlLmludm09ZnVuY3Rpb24gaW52bShhKXt2YXIgaW52PWEuX2ludm1wKHRoaXMubSk7cmV0dXJuIDAhPT1pbnYubmVnYXRpdmU/KGludi5uZWdhdGl2ZT0wLHRoaXMuaW1vZChpbnYpLnJlZE5lZygpKTp0aGlzLmltb2QoaW52KX0sUmVkLnByb3RvdHlwZS5wb3c9ZnVuY3Rpb24gcG93KGEsbnVtKXtpZihudW0uaXNaZXJvKCkpcmV0dXJuIG5ldyBCTigxKS50b1JlZCh0aGlzKTtpZigwPT09bnVtLmNtcG4oMSkpcmV0dXJuIGEuY2xvbmUoKTt2YXIgd25kPW5ldyBBcnJheSgxNik7d25kWzBdPW5ldyBCTigxKS50b1JlZCh0aGlzKSx3bmRbMV09YTtmb3IodmFyIGk9MjtpPHduZC5sZW5ndGg7aSsrKXduZFtpXT10aGlzLm11bCh3bmRbaS0xXSxhKTt2YXIgcmVzPXduZFswXSxjdXJyZW50PTAsY3VycmVudExlbj0wLHN0YXJ0PW51bS5iaXRMZW5ndGgoKSUyNjtmb3IoMD09PXN0YXJ0JiYoc3RhcnQ9MjYpLGk9bnVtLmxlbmd0aC0xO2k+PTA7aS0tKXtmb3IodmFyIHdvcmQ9bnVtLndvcmRzW2ldLGo9c3RhcnQtMTtqPj0wO2otLSl7dmFyIGJpdD13b3JkPj5qJjE7cmVzIT09d25kWzBdJiYocmVzPXRoaXMuc3FyKHJlcykpLDAhPT1iaXR8fDAhPT1jdXJyZW50PyhjdXJyZW50PDw9MSxjdXJyZW50fD1iaXQsKDQ9PT0rK2N1cnJlbnRMZW58fDA9PT1pJiYwPT09aikmJihyZXM9dGhpcy5tdWwocmVzLHduZFtjdXJyZW50XSksY3VycmVudExlbj0wLGN1cnJlbnQ9MCkpOmN1cnJlbnRMZW49MH1zdGFydD0yNn1yZXR1cm4gcmVzfSxSZWQucHJvdG90eXBlLmNvbnZlcnRUbz1mdW5jdGlvbiBjb252ZXJ0VG8obnVtKXt2YXIgcj1udW0udW1vZCh0aGlzLm0pO3JldHVybiByPT09bnVtP3IuY2xvbmUoKTpyfSxSZWQucHJvdG90eXBlLmNvbnZlcnRGcm9tPWZ1bmN0aW9uIGNvbnZlcnRGcm9tKG51bSl7dmFyIHJlcz1udW0uY2xvbmUoKTtyZXR1cm4gcmVzLnJlZD1udWxsLHJlc30sQk4ubW9udD1mdW5jdGlvbiBtb250KG51bSl7cmV0dXJuIG5ldyBNb250KG51bSl9LGluaGVyaXRzKE1vbnQsUmVkKSxNb250LnByb3RvdHlwZS5jb252ZXJ0VG89ZnVuY3Rpb24gY29udmVydFRvKG51bSl7cmV0dXJuIHRoaXMuaW1vZChudW0udXNobG4odGhpcy5zaGlmdCkpfSxNb250LnByb3RvdHlwZS5jb252ZXJ0RnJvbT1mdW5jdGlvbiBjb252ZXJ0RnJvbShudW0pe3ZhciByPXRoaXMuaW1vZChudW0ubXVsKHRoaXMucmludikpO3JldHVybiByLnJlZD1udWxsLHJ9LE1vbnQucHJvdG90eXBlLmltdWw9ZnVuY3Rpb24gaW11bChhLGIpe2lmKGEuaXNaZXJvKCl8fGIuaXNaZXJvKCkpcmV0dXJuIGEud29yZHNbMF09MCxhLmxlbmd0aD0xLGE7dmFyIHQ9YS5pbXVsKGIpLGM9dC5tYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5taW52KS5pbWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubSksdT10LmlzdWIoYykuaXVzaHJuKHRoaXMuc2hpZnQpLHJlcz11O3JldHVybiB1LmNtcCh0aGlzLm0pPj0wP3Jlcz11LmlzdWIodGhpcy5tKTp1LmNtcG4oMCk8MCYmKHJlcz11LmlhZGQodGhpcy5tKSkscmVzLl9mb3JjZVJlZCh0aGlzKX0sTW9udC5wcm90b3R5cGUubXVsPWZ1bmN0aW9uIG11bChhLGIpe2lmKGEuaXNaZXJvKCl8fGIuaXNaZXJvKCkpcmV0dXJuIG5ldyBCTigwKS5fZm9yY2VSZWQodGhpcyk7dmFyIHQ9YS5tdWwoYiksYz10Lm1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm1pbnYpLmltYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5tKSx1PXQuaXN1YihjKS5pdXNocm4odGhpcy5zaGlmdCkscmVzPXU7cmV0dXJuIHUuY21wKHRoaXMubSk+PTA/cmVzPXUuaXN1Yih0aGlzLm0pOnUuY21wbigwKTwwJiYocmVzPXUuaWFkZCh0aGlzLm0pKSxyZXMuX2ZvcmNlUmVkKHRoaXMpfSxNb250LnByb3RvdHlwZS5pbnZtPWZ1bmN0aW9uIGludm0oYSl7cmV0dXJuIHRoaXMuaW1vZChhLl9pbnZtcCh0aGlzLm0pLm11bCh0aGlzLnIyKSkuX2ZvcmNlUmVkKHRoaXMpfX0obW9kdWxlPV9fd2VicGFja19yZXF1aXJlX18ubm1kKG1vZHVsZSksdGhpcyl9LCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS16bGliL2xpYi9iaW5kaW5nLmpzIihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiKSxwcm9jZXNzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9ub2RlLXN0ZGxpYi1icm93c2VyL2Nqcy9wcm94eS9wcm9jZXNzLmpzIiksYXNzZXJ0PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9hc3NlcnQvYnVpbGQvYXNzZXJ0LmpzIiksWnN0cmVhbT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi96c3RyZWFtLmpzIiksemxpYl9kZWZsYXRlPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2RlZmxhdGUuanMiKSx6bGliX2luZmxhdGU9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mbGF0ZS5qcyIpLGNvbnN0YW50cz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9jb25zdGFudHMuanMiKTtmb3IodmFyIGtleSBpbiBjb25zdGFudHMpZXhwb3J0c1trZXldPWNvbnN0YW50c1trZXldO2V4cG9ydHMuTk9ORT0wLGV4cG9ydHMuREVGTEFURT0xLGV4cG9ydHMuSU5GTEFURT0yLGV4cG9ydHMuR1pJUD0zLGV4cG9ydHMuR1VOWklQPTQsZXhwb3J0cy5ERUZMQVRFUkFXPTUsZXhwb3J0cy5JTkZMQVRFUkFXPTYsZXhwb3J0cy5VTlpJUD03O2Z1bmN0aW9uIFpsaWIobW9kZSl7aWYoIm51bWJlciIhPXR5cGVvZiBtb2RlfHxtb2RlPGV4cG9ydHMuREVGTEFURXx8bW9kZT5leHBvcnRzLlVOWklQKXRocm93IG5ldyBUeXBlRXJyb3IoIkJhZCBhcmd1bWVudCIpO3RoaXMuZGljdGlvbmFyeT1udWxsLHRoaXMuZXJyPTAsdGhpcy5mbHVzaD0wLHRoaXMuaW5pdF9kb25lPSExLHRoaXMubGV2ZWw9MCx0aGlzLm1lbUxldmVsPTAsdGhpcy5tb2RlPW1vZGUsdGhpcy5zdHJhdGVneT0wLHRoaXMud2luZG93Qml0cz0wLHRoaXMud3JpdGVfaW5fcHJvZ3Jlc3M9ITEsdGhpcy5wZW5kaW5nX2Nsb3NlPSExLHRoaXMuZ3ppcF9pZF9ieXRlc19yZWFkPTB9WmxpYi5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXt0aGlzLndyaXRlX2luX3Byb2dyZXNzP3RoaXMucGVuZGluZ19jbG9zZT0hMDoodGhpcy5wZW5kaW5nX2Nsb3NlPSExLGFzc2VydCh0aGlzLmluaXRfZG9uZSwiY2xvc2UgYmVmb3JlIGluaXQiKSxhc3NlcnQodGhpcy5tb2RlPD1leHBvcnRzLlVOWklQKSx0aGlzLm1vZGU9PT1leHBvcnRzLkRFRkxBVEV8fHRoaXMubW9kZT09PWV4cG9ydHMuR1pJUHx8dGhpcy5tb2RlPT09ZXhwb3J0cy5ERUZMQVRFUkFXP3psaWJfZGVmbGF0ZS5kZWZsYXRlRW5kKHRoaXMuc3RybSk6dGhpcy5tb2RlIT09ZXhwb3J0cy5JTkZMQVRFJiZ0aGlzLm1vZGUhPT1leHBvcnRzLkdVTlpJUCYmdGhpcy5tb2RlIT09ZXhwb3J0cy5JTkZMQVRFUkFXJiZ0aGlzLm1vZGUhPT1leHBvcnRzLlVOWklQfHx6bGliX2luZmxhdGUuaW5mbGF0ZUVuZCh0aGlzLnN0cm0pLHRoaXMubW9kZT1leHBvcnRzLk5PTkUsdGhpcy5kaWN0aW9uYXJ5PW51bGwpfSxabGliLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihmbHVzaCxpbnB1dCxpbl9vZmYsaW5fbGVuLG91dCxvdXRfb2ZmLG91dF9sZW4pe3JldHVybiB0aGlzLl93cml0ZSghMCxmbHVzaCxpbnB1dCxpbl9vZmYsaW5fbGVuLG91dCxvdXRfb2ZmLG91dF9sZW4pfSxabGliLnByb3RvdHlwZS53cml0ZVN5bmM9ZnVuY3Rpb24oZmx1c2gsaW5wdXQsaW5fb2ZmLGluX2xlbixvdXQsb3V0X29mZixvdXRfbGVuKXtyZXR1cm4gdGhpcy5fd3JpdGUoITEsZmx1c2gsaW5wdXQsaW5fb2ZmLGluX2xlbixvdXQsb3V0X29mZixvdXRfbGVuKX0sWmxpYi5wcm90b3R5cGUuX3dyaXRlPWZ1bmN0aW9uKGFzeW5jLGZsdXNoLGlucHV0LGluX29mZixpbl9sZW4sb3V0LG91dF9vZmYsb3V0X2xlbil7aWYoYXNzZXJ0LmVxdWFsKGFyZ3VtZW50cy5sZW5ndGgsOCksYXNzZXJ0KHRoaXMuaW5pdF9kb25lLCJ3cml0ZSBiZWZvcmUgaW5pdCIpLGFzc2VydCh0aGlzLm1vZGUhPT1leHBvcnRzLk5PTkUsImFscmVhZHkgZmluYWxpemVkIiksYXNzZXJ0LmVxdWFsKCExLHRoaXMud3JpdGVfaW5fcHJvZ3Jlc3MsIndyaXRlIGFscmVhZHkgaW4gcHJvZ3Jlc3MiKSxhc3NlcnQuZXF1YWwoITEsdGhpcy5wZW5kaW5nX2Nsb3NlLCJjbG9zZSBpcyBwZW5kaW5nIiksdGhpcy53cml0ZV9pbl9wcm9ncmVzcz0hMCxhc3NlcnQuZXF1YWwoITEsdm9pZCAwPT09Zmx1c2gsIm11c3QgcHJvdmlkZSBmbHVzaCB2YWx1ZSIpLHRoaXMud3JpdGVfaW5fcHJvZ3Jlc3M9ITAsZmx1c2ghPT1leHBvcnRzLlpfTk9fRkxVU0gmJmZsdXNoIT09ZXhwb3J0cy5aX1BBUlRJQUxfRkxVU0gmJmZsdXNoIT09ZXhwb3J0cy5aX1NZTkNfRkxVU0gmJmZsdXNoIT09ZXhwb3J0cy5aX0ZVTExfRkxVU0gmJmZsdXNoIT09ZXhwb3J0cy5aX0ZJTklTSCYmZmx1c2ghPT1leHBvcnRzLlpfQkxPQ0spdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGZsdXNoIHZhbHVlIik7aWYobnVsbD09aW5wdXQmJihpbnB1dD1CdWZmZXIuYWxsb2MoMCksaW5fbGVuPTAsaW5fb2ZmPTApLHRoaXMuc3RybS5hdmFpbF9pbj1pbl9sZW4sdGhpcy5zdHJtLmlucHV0PWlucHV0LHRoaXMuc3RybS5uZXh0X2luPWluX29mZix0aGlzLnN0cm0uYXZhaWxfb3V0PW91dF9sZW4sdGhpcy5zdHJtLm91dHB1dD1vdXQsdGhpcy5zdHJtLm5leHRfb3V0PW91dF9vZmYsdGhpcy5mbHVzaD1mbHVzaCwhYXN5bmMpcmV0dXJuIHRoaXMuX3Byb2Nlc3MoKSx0aGlzLl9jaGVja0Vycm9yKCk/dGhpcy5fYWZ0ZXJTeW5jKCk6dm9pZCAwO3ZhciBzZWxmPXRoaXM7cmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKXtzZWxmLl9wcm9jZXNzKCksc2VsZi5fYWZ0ZXIoKX0pLHRoaXN9LFpsaWIucHJvdG90eXBlLl9hZnRlclN5bmM9ZnVuY3Rpb24oKXt2YXIgYXZhaWxfb3V0PXRoaXMuc3RybS5hdmFpbF9vdXQsYXZhaWxfaW49dGhpcy5zdHJtLmF2YWlsX2luO3JldHVybiB0aGlzLndyaXRlX2luX3Byb2dyZXNzPSExLFthdmFpbF9pbixhdmFpbF9vdXRdfSxabGliLnByb3RvdHlwZS5fcHJvY2Vzcz1mdW5jdGlvbigpe3ZhciBuZXh0X2V4cGVjdGVkX2hlYWRlcl9ieXRlPW51bGw7c3dpdGNoKHRoaXMubW9kZSl7Y2FzZSBleHBvcnRzLkRFRkxBVEU6Y2FzZSBleHBvcnRzLkdaSVA6Y2FzZSBleHBvcnRzLkRFRkxBVEVSQVc6dGhpcy5lcnI9emxpYl9kZWZsYXRlLmRlZmxhdGUodGhpcy5zdHJtLHRoaXMuZmx1c2gpO2JyZWFrO2Nhc2UgZXhwb3J0cy5VTlpJUDpzd2l0Y2godGhpcy5zdHJtLmF2YWlsX2luPjAmJihuZXh0X2V4cGVjdGVkX2hlYWRlcl9ieXRlPXRoaXMuc3RybS5uZXh0X2luKSx0aGlzLmd6aXBfaWRfYnl0ZXNfcmVhZCl7Y2FzZSAwOmlmKG51bGw9PT1uZXh0X2V4cGVjdGVkX2hlYWRlcl9ieXRlKWJyZWFrO2lmKDMxIT09dGhpcy5zdHJtLmlucHV0W25leHRfZXhwZWN0ZWRfaGVhZGVyX2J5dGVdKXt0aGlzLm1vZGU9ZXhwb3J0cy5JTkZMQVRFO2JyZWFrfWlmKHRoaXMuZ3ppcF9pZF9ieXRlc19yZWFkPTEsbmV4dF9leHBlY3RlZF9oZWFkZXJfYnl0ZSsrLDE9PT10aGlzLnN0cm0uYXZhaWxfaW4pYnJlYWs7Y2FzZSAxOmlmKG51bGw9PT1uZXh0X2V4cGVjdGVkX2hlYWRlcl9ieXRlKWJyZWFrOzEzOT09PXRoaXMuc3RybS5pbnB1dFtuZXh0X2V4cGVjdGVkX2hlYWRlcl9ieXRlXT8odGhpcy5nemlwX2lkX2J5dGVzX3JlYWQ9Mix0aGlzLm1vZGU9ZXhwb3J0cy5HVU5aSVApOnRoaXMubW9kZT1leHBvcnRzLklORkxBVEU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgbnVtYmVyIG9mIGd6aXAgbWFnaWMgbnVtYmVyIGJ5dGVzIHJlYWQiKX1jYXNlIGV4cG9ydHMuSU5GTEFURTpjYXNlIGV4cG9ydHMuR1VOWklQOmNhc2UgZXhwb3J0cy5JTkZMQVRFUkFXOmZvcih0aGlzLmVycj16bGliX2luZmxhdGUuaW5mbGF0ZSh0aGlzLnN0cm0sdGhpcy5mbHVzaCksdGhpcy5lcnI9PT1leHBvcnRzLlpfTkVFRF9ESUNUJiZ0aGlzLmRpY3Rpb25hcnkmJih0aGlzLmVycj16bGliX2luZmxhdGUuaW5mbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLHRoaXMuZGljdGlvbmFyeSksdGhpcy5lcnI9PT1leHBvcnRzLlpfT0s/dGhpcy5lcnI9emxpYl9pbmZsYXRlLmluZmxhdGUodGhpcy5zdHJtLHRoaXMuZmx1c2gpOnRoaXMuZXJyPT09ZXhwb3J0cy5aX0RBVEFfRVJST1ImJih0aGlzLmVycj1leHBvcnRzLlpfTkVFRF9ESUNUKSk7dGhpcy5zdHJtLmF2YWlsX2luPjAmJnRoaXMubW9kZT09PWV4cG9ydHMuR1VOWklQJiZ0aGlzLmVycj09PWV4cG9ydHMuWl9TVFJFQU1fRU5EJiYwIT09dGhpcy5zdHJtLm5leHRfaW5bMF07KXRoaXMucmVzZXQoKSx0aGlzLmVycj16bGliX2luZmxhdGUuaW5mbGF0ZSh0aGlzLnN0cm0sdGhpcy5mbHVzaCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gbW9kZSAiK3RoaXMubW9kZSl9fSxabGliLnByb3RvdHlwZS5fY2hlY2tFcnJvcj1mdW5jdGlvbigpe3N3aXRjaCh0aGlzLmVycil7Y2FzZSBleHBvcnRzLlpfT0s6Y2FzZSBleHBvcnRzLlpfQlVGX0VSUk9SOmlmKDAhPT10aGlzLnN0cm0uYXZhaWxfb3V0JiZ0aGlzLmZsdXNoPT09ZXhwb3J0cy5aX0ZJTklTSClyZXR1cm4gdGhpcy5fZXJyb3IoInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKSwhMTticmVhaztjYXNlIGV4cG9ydHMuWl9TVFJFQU1fRU5EOmJyZWFrO2Nhc2UgZXhwb3J0cy5aX05FRURfRElDVDpyZXR1cm4gbnVsbD09dGhpcy5kaWN0aW9uYXJ5P3RoaXMuX2Vycm9yKCJNaXNzaW5nIGRpY3Rpb25hcnkiKTp0aGlzLl9lcnJvcigiQmFkIGRpY3Rpb25hcnkiKSwhMTtkZWZhdWx0OnJldHVybiB0aGlzLl9lcnJvcigiWmxpYiBlcnJvciIpLCExfXJldHVybiEwfSxabGliLnByb3RvdHlwZS5fYWZ0ZXI9ZnVuY3Rpb24oKXtpZih0aGlzLl9jaGVja0Vycm9yKCkpe3ZhciBhdmFpbF9vdXQ9dGhpcy5zdHJtLmF2YWlsX291dCxhdmFpbF9pbj10aGlzLnN0cm0uYXZhaWxfaW47dGhpcy53cml0ZV9pbl9wcm9ncmVzcz0hMSx0aGlzLmNhbGxiYWNrKGF2YWlsX2luLGF2YWlsX291dCksdGhpcy5wZW5kaW5nX2Nsb3NlJiZ0aGlzLmNsb3NlKCl9fSxabGliLnByb3RvdHlwZS5fZXJyb3I9ZnVuY3Rpb24obWVzc2FnZSl7dGhpcy5zdHJtLm1zZyYmKG1lc3NhZ2U9dGhpcy5zdHJtLm1zZyksdGhpcy5vbmVycm9yKG1lc3NhZ2UsdGhpcy5lcnIpLHRoaXMud3JpdGVfaW5fcHJvZ3Jlc3M9ITEsdGhpcy5wZW5kaW5nX2Nsb3NlJiZ0aGlzLmNsb3NlKCl9LFpsaWIucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24od2luZG93Qml0cyxsZXZlbCxtZW1MZXZlbCxzdHJhdGVneSxkaWN0aW9uYXJ5KXthc3NlcnQoND09PWFyZ3VtZW50cy5sZW5ndGh8fDU9PT1hcmd1bWVudHMubGVuZ3RoLCJpbml0KHdpbmRvd0JpdHMsIGxldmVsLCBtZW1MZXZlbCwgc3RyYXRlZ3ksIFtkaWN0aW9uYXJ5XSkiKSxhc3NlcnQod2luZG93Qml0cz49OCYmd2luZG93Qml0czw9MTUsImludmFsaWQgd2luZG93Qml0cyIpLGFzc2VydChsZXZlbD49LTEmJmxldmVsPD05LCJpbnZhbGlkIGNvbXByZXNzaW9uIGxldmVsIiksYXNzZXJ0KG1lbUxldmVsPj0xJiZtZW1MZXZlbDw9OSwiaW52YWxpZCBtZW1sZXZlbCIpLGFzc2VydChzdHJhdGVneT09PWV4cG9ydHMuWl9GSUxURVJFRHx8c3RyYXRlZ3k9PT1leHBvcnRzLlpfSFVGRk1BTl9PTkxZfHxzdHJhdGVneT09PWV4cG9ydHMuWl9STEV8fHN0cmF0ZWd5PT09ZXhwb3J0cy5aX0ZJWEVEfHxzdHJhdGVneT09PWV4cG9ydHMuWl9ERUZBVUxUX1NUUkFURUdZLCJpbnZhbGlkIHN0cmF0ZWd5IiksdGhpcy5faW5pdChsZXZlbCx3aW5kb3dCaXRzLG1lbUxldmVsLHN0cmF0ZWd5LGRpY3Rpb25hcnkpLHRoaXMuX3NldERpY3Rpb25hcnkoKX0sWmxpYi5wcm90b3R5cGUucGFyYW1zPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJkZWZsYXRlUGFyYW1zIE5vdCBzdXBwb3J0ZWQiKX0sWmxpYi5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLl9yZXNldCgpLHRoaXMuX3NldERpY3Rpb25hcnkoKX0sWmxpYi5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24obGV2ZWwsd2luZG93Qml0cyxtZW1MZXZlbCxzdHJhdGVneSxkaWN0aW9uYXJ5KXtzd2l0Y2godGhpcy5sZXZlbD1sZXZlbCx0aGlzLndpbmRvd0JpdHM9d2luZG93Qml0cyx0aGlzLm1lbUxldmVsPW1lbUxldmVsLHRoaXMuc3RyYXRlZ3k9c3RyYXRlZ3ksdGhpcy5mbHVzaD1leHBvcnRzLlpfTk9fRkxVU0gsdGhpcy5lcnI9ZXhwb3J0cy5aX09LLHRoaXMubW9kZSE9PWV4cG9ydHMuR1pJUCYmdGhpcy5tb2RlIT09ZXhwb3J0cy5HVU5aSVB8fCh0aGlzLndpbmRvd0JpdHMrPTE2KSx0aGlzLm1vZGU9PT1leHBvcnRzLlVOWklQJiYodGhpcy53aW5kb3dCaXRzKz0zMiksdGhpcy5tb2RlIT09ZXhwb3J0cy5ERUZMQVRFUkFXJiZ0aGlzLm1vZGUhPT1leHBvcnRzLklORkxBVEVSQVd8fCh0aGlzLndpbmRvd0JpdHM9LTEqdGhpcy53aW5kb3dCaXRzKSx0aGlzLnN0cm09bmV3IFpzdHJlYW0sdGhpcy5tb2RlKXtjYXNlIGV4cG9ydHMuREVGTEFURTpjYXNlIGV4cG9ydHMuR1pJUDpjYXNlIGV4cG9ydHMuREVGTEFURVJBVzp0aGlzLmVycj16bGliX2RlZmxhdGUuZGVmbGF0ZUluaXQyKHRoaXMuc3RybSx0aGlzLmxldmVsLGV4cG9ydHMuWl9ERUZMQVRFRCx0aGlzLndpbmRvd0JpdHMsdGhpcy5tZW1MZXZlbCx0aGlzLnN0cmF0ZWd5KTticmVhaztjYXNlIGV4cG9ydHMuSU5GTEFURTpjYXNlIGV4cG9ydHMuR1VOWklQOmNhc2UgZXhwb3J0cy5JTkZMQVRFUkFXOmNhc2UgZXhwb3J0cy5VTlpJUDp0aGlzLmVycj16bGliX2luZmxhdGUuaW5mbGF0ZUluaXQyKHRoaXMuc3RybSx0aGlzLndpbmRvd0JpdHMpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIG1vZGUgIit0aGlzLm1vZGUpfXRoaXMuZXJyIT09ZXhwb3J0cy5aX09LJiZ0aGlzLl9lcnJvcigiSW5pdCBlcnJvciIpLHRoaXMuZGljdGlvbmFyeT1kaWN0aW9uYXJ5LHRoaXMud3JpdGVfaW5fcHJvZ3Jlc3M9ITEsdGhpcy5pbml0X2RvbmU9ITB9LFpsaWIucHJvdG90eXBlLl9zZXREaWN0aW9uYXJ5PWZ1bmN0aW9uKCl7aWYobnVsbCE9dGhpcy5kaWN0aW9uYXJ5KXtzd2l0Y2godGhpcy5lcnI9ZXhwb3J0cy5aX09LLHRoaXMubW9kZSl7Y2FzZSBleHBvcnRzLkRFRkxBVEU6Y2FzZSBleHBvcnRzLkRFRkxBVEVSQVc6dGhpcy5lcnI9emxpYl9kZWZsYXRlLmRlZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSx0aGlzLmRpY3Rpb25hcnkpfXRoaXMuZXJyIT09ZXhwb3J0cy5aX09LJiZ0aGlzLl9lcnJvcigiRmFpbGVkIHRvIHNldCBkaWN0aW9uYXJ5Iil9fSxabGliLnByb3RvdHlwZS5fcmVzZXQ9ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5lcnI9ZXhwb3J0cy5aX09LLHRoaXMubW9kZSl7Y2FzZSBleHBvcnRzLkRFRkxBVEU6Y2FzZSBleHBvcnRzLkRFRkxBVEVSQVc6Y2FzZSBleHBvcnRzLkdaSVA6dGhpcy5lcnI9emxpYl9kZWZsYXRlLmRlZmxhdGVSZXNldCh0aGlzLnN0cm0pO2JyZWFrO2Nhc2UgZXhwb3J0cy5JTkZMQVRFOmNhc2UgZXhwb3J0cy5JTkZMQVRFUkFXOmNhc2UgZXhwb3J0cy5HVU5aSVA6dGhpcy5lcnI9emxpYl9pbmZsYXRlLmluZmxhdGVSZXNldCh0aGlzLnN0cm0pfXRoaXMuZXJyIT09ZXhwb3J0cy5aX09LJiZ0aGlzLl9lcnJvcigiRmFpbGVkIHRvIHJlc2V0IHN0cmVhbSIpfSxleHBvcnRzLlpsaWI9WmxpYn0sIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LXpsaWIvbGliL2luZGV4LmpzIihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgcHJvY2Vzcz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbm9kZS1zdGRsaWItYnJvd3Nlci9janMvcHJveHkvcHJvY2Vzcy5qcyIpLEJ1ZmZlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzIikuQnVmZmVyLFRyYW5zZm9ybT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvaW5kZXguanMiKS5UcmFuc2Zvcm0sYmluZGluZz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS16bGliL2xpYi9iaW5kaW5nLmpzIiksdXRpbD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvdXRpbC91dGlsLmpzIiksYXNzZXJ0PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9hc3NlcnQvYnVpbGQvYXNzZXJ0LmpzIikub2ssa01heExlbmd0aD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzIikua01heExlbmd0aCxrUmFuZ2VFcnJvck1lc3NhZ2U9IkNhbm5vdCBjcmVhdGUgZmluYWwgQnVmZmVyLiBJdCB3b3VsZCBiZSBsYXJnZXIgdGhhbiAweCIra01heExlbmd0aC50b1N0cmluZygxNikrIiBieXRlcyI7YmluZGluZy5aX01JTl9XSU5ET1dCSVRTPTgsYmluZGluZy5aX01BWF9XSU5ET1dCSVRTPTE1LGJpbmRpbmcuWl9ERUZBVUxUX1dJTkRPV0JJVFM9MTUsYmluZGluZy5aX01JTl9DSFVOSz02NCxiaW5kaW5nLlpfTUFYX0NIVU5LPTEvMCxiaW5kaW5nLlpfREVGQVVMVF9DSFVOSz0xNjM4NCxiaW5kaW5nLlpfTUlOX01FTUxFVkVMPTEsYmluZGluZy5aX01BWF9NRU1MRVZFTD05LGJpbmRpbmcuWl9ERUZBVUxUX01FTUxFVkVMPTgsYmluZGluZy5aX01JTl9MRVZFTD0tMSxiaW5kaW5nLlpfTUFYX0xFVkVMPTksYmluZGluZy5aX0RFRkFVTFRfTEVWRUw9YmluZGluZy5aX0RFRkFVTFRfQ09NUFJFU1NJT047Zm9yKHZhciBia2V5cz1PYmplY3Qua2V5cyhiaW5kaW5nKSxiaz0wO2JrPGJrZXlzLmxlbmd0aDtiaysrKXt2YXIgYmtleT1ia2V5c1tia107YmtleS5tYXRjaCgvXlovKSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsYmtleSx7ZW51bWVyYWJsZTohMCx2YWx1ZTpiaW5kaW5nW2JrZXldLHdyaXRhYmxlOiExfSl9Zm9yKHZhciBjb2Rlcz17Wl9PSzpiaW5kaW5nLlpfT0ssWl9TVFJFQU1fRU5EOmJpbmRpbmcuWl9TVFJFQU1fRU5ELFpfTkVFRF9ESUNUOmJpbmRpbmcuWl9ORUVEX0RJQ1QsWl9FUlJOTzpiaW5kaW5nLlpfRVJSTk8sWl9TVFJFQU1fRVJST1I6YmluZGluZy5aX1NUUkVBTV9FUlJPUixaX0RBVEFfRVJST1I6YmluZGluZy5aX0RBVEFfRVJST1IsWl9NRU1fRVJST1I6YmluZGluZy5aX01FTV9FUlJPUixaX0JVRl9FUlJPUjpiaW5kaW5nLlpfQlVGX0VSUk9SLFpfVkVSU0lPTl9FUlJPUjpiaW5kaW5nLlpfVkVSU0lPTl9FUlJPUn0sY2tleXM9T2JqZWN0LmtleXMoY29kZXMpLGNrPTA7Y2s8Y2tleXMubGVuZ3RoO2NrKyspe3ZhciBja2V5PWNrZXlzW2NrXTtjb2Rlc1tjb2Rlc1tja2V5XV09Y2tleX1mdW5jdGlvbiB6bGliQnVmZmVyKGVuZ2luZSxidWZmZXIsY2FsbGJhY2spe3ZhciBidWZmZXJzPVtdLG5yZWFkPTA7ZnVuY3Rpb24gZmxvdygpe2Zvcih2YXIgY2h1bms7bnVsbCE9PShjaHVuaz1lbmdpbmUucmVhZCgpKTspYnVmZmVycy5wdXNoKGNodW5rKSxucmVhZCs9Y2h1bmsubGVuZ3RoO2VuZ2luZS5vbmNlKCJyZWFkYWJsZSIsZmxvdyl9ZnVuY3Rpb24gb25FbmQoKXt2YXIgYnVmLGVycj1udWxsO25yZWFkPj1rTWF4TGVuZ3RoP2Vycj1uZXcgUmFuZ2VFcnJvcihrUmFuZ2VFcnJvck1lc3NhZ2UpOmJ1Zj1CdWZmZXIuY29uY2F0KGJ1ZmZlcnMsbnJlYWQpLGJ1ZmZlcnM9W10sZW5naW5lLmNsb3NlKCksY2FsbGJhY2soZXJyLGJ1Zil9ZW5naW5lLm9uKCJlcnJvciIsZnVuY3Rpb24gb25FcnJvcihlcnIpe2VuZ2luZS5yZW1vdmVMaXN0ZW5lcigiZW5kIixvbkVuZCksZW5naW5lLnJlbW92ZUxpc3RlbmVyKCJyZWFkYWJsZSIsZmxvdyksY2FsbGJhY2soZXJyKX0pLGVuZ2luZS5vbigiZW5kIixvbkVuZCksZW5naW5lLmVuZChidWZmZXIpLGZsb3coKX1mdW5jdGlvbiB6bGliQnVmZmVyU3luYyhlbmdpbmUsYnVmZmVyKXtpZigic3RyaW5nIj09dHlwZW9mIGJ1ZmZlciYmKGJ1ZmZlcj1CdWZmZXIuZnJvbShidWZmZXIpKSwhQnVmZmVyLmlzQnVmZmVyKGJ1ZmZlcikpdGhyb3cgbmV3IFR5cGVFcnJvcigiTm90IGEgc3RyaW5nIG9yIGJ1ZmZlciIpO3ZhciBmbHVzaEZsYWc9ZW5naW5lLl9maW5pc2hGbHVzaEZsYWc7cmV0dXJuIGVuZ2luZS5fcHJvY2Vzc0NodW5rKGJ1ZmZlcixmbHVzaEZsYWcpfWZ1bmN0aW9uIERlZmxhdGUob3B0cyl7aWYoISh0aGlzIGluc3RhbmNlb2YgRGVmbGF0ZSkpcmV0dXJuIG5ldyBEZWZsYXRlKG9wdHMpO1psaWIuY2FsbCh0aGlzLG9wdHMsYmluZGluZy5ERUZMQVRFKX1mdW5jdGlvbiBJbmZsYXRlKG9wdHMpe2lmKCEodGhpcyBpbnN0YW5jZW9mIEluZmxhdGUpKXJldHVybiBuZXcgSW5mbGF0ZShvcHRzKTtabGliLmNhbGwodGhpcyxvcHRzLGJpbmRpbmcuSU5GTEFURSl9ZnVuY3Rpb24gR3ppcChvcHRzKXtpZighKHRoaXMgaW5zdGFuY2VvZiBHemlwKSlyZXR1cm4gbmV3IEd6aXAob3B0cyk7WmxpYi5jYWxsKHRoaXMsb3B0cyxiaW5kaW5nLkdaSVApfWZ1bmN0aW9uIEd1bnppcChvcHRzKXtpZighKHRoaXMgaW5zdGFuY2VvZiBHdW56aXApKXJldHVybiBuZXcgR3VuemlwKG9wdHMpO1psaWIuY2FsbCh0aGlzLG9wdHMsYmluZGluZy5HVU5aSVApfWZ1bmN0aW9uIERlZmxhdGVSYXcob3B0cyl7aWYoISh0aGlzIGluc3RhbmNlb2YgRGVmbGF0ZVJhdykpcmV0dXJuIG5ldyBEZWZsYXRlUmF3KG9wdHMpO1psaWIuY2FsbCh0aGlzLG9wdHMsYmluZGluZy5ERUZMQVRFUkFXKX1mdW5jdGlvbiBJbmZsYXRlUmF3KG9wdHMpe2lmKCEodGhpcyBpbnN0YW5jZW9mIEluZmxhdGVSYXcpKXJldHVybiBuZXcgSW5mbGF0ZVJhdyhvcHRzKTtabGliLmNhbGwodGhpcyxvcHRzLGJpbmRpbmcuSU5GTEFURVJBVyl9ZnVuY3Rpb24gVW56aXAob3B0cyl7aWYoISh0aGlzIGluc3RhbmNlb2YgVW56aXApKXJldHVybiBuZXcgVW56aXAob3B0cyk7WmxpYi5jYWxsKHRoaXMsb3B0cyxiaW5kaW5nLlVOWklQKX1mdW5jdGlvbiBpc1ZhbGlkRmx1c2hGbGFnKGZsYWcpe3JldHVybiBmbGFnPT09YmluZGluZy5aX05PX0ZMVVNIfHxmbGFnPT09YmluZGluZy5aX1BBUlRJQUxfRkxVU0h8fGZsYWc9PT1iaW5kaW5nLlpfU1lOQ19GTFVTSHx8ZmxhZz09PWJpbmRpbmcuWl9GVUxMX0ZMVVNIfHxmbGFnPT09YmluZGluZy5aX0ZJTklTSHx8ZmxhZz09PWJpbmRpbmcuWl9CTE9DS31mdW5jdGlvbiBabGliKG9wdHMsbW9kZSl7dmFyIF90aGlzPXRoaXM7aWYodGhpcy5fb3B0cz1vcHRzPW9wdHN8fHt9LHRoaXMuX2NodW5rU2l6ZT1vcHRzLmNodW5rU2l6ZXx8ZXhwb3J0cy5aX0RFRkFVTFRfQ0hVTkssVHJhbnNmb3JtLmNhbGwodGhpcyxvcHRzKSxvcHRzLmZsdXNoJiYhaXNWYWxpZEZsdXNoRmxhZyhvcHRzLmZsdXNoKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgZmx1c2ggZmxhZzogIitvcHRzLmZsdXNoKTtpZihvcHRzLmZpbmlzaEZsdXNoJiYhaXNWYWxpZEZsdXNoRmxhZyhvcHRzLmZpbmlzaEZsdXNoKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgZmx1c2ggZmxhZzogIitvcHRzLmZpbmlzaEZsdXNoKTtpZih0aGlzLl9mbHVzaEZsYWc9b3B0cy5mbHVzaHx8YmluZGluZy5aX05PX0ZMVVNILHRoaXMuX2ZpbmlzaEZsdXNoRmxhZz12b2lkIDAhPT1vcHRzLmZpbmlzaEZsdXNoP29wdHMuZmluaXNoRmx1c2g6YmluZGluZy5aX0ZJTklTSCxvcHRzLmNodW5rU2l6ZSYmKG9wdHMuY2h1bmtTaXplPGV4cG9ydHMuWl9NSU5fQ0hVTkt8fG9wdHMuY2h1bmtTaXplPmV4cG9ydHMuWl9NQVhfQ0hVTkspKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjaHVuayBzaXplOiAiK29wdHMuY2h1bmtTaXplKTtpZihvcHRzLndpbmRvd0JpdHMmJihvcHRzLndpbmRvd0JpdHM8ZXhwb3J0cy5aX01JTl9XSU5ET1dCSVRTfHxvcHRzLndpbmRvd0JpdHM+ZXhwb3J0cy5aX01BWF9XSU5ET1dCSVRTKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgd2luZG93Qml0czogIitvcHRzLndpbmRvd0JpdHMpO2lmKG9wdHMubGV2ZWwmJihvcHRzLmxldmVsPGV4cG9ydHMuWl9NSU5fTEVWRUx8fG9wdHMubGV2ZWw+ZXhwb3J0cy5aX01BWF9MRVZFTCkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvbXByZXNzaW9uIGxldmVsOiAiK29wdHMubGV2ZWwpO2lmKG9wdHMubWVtTGV2ZWwmJihvcHRzLm1lbUxldmVsPGV4cG9ydHMuWl9NSU5fTUVNTEVWRUx8fG9wdHMubWVtTGV2ZWw+ZXhwb3J0cy5aX01BWF9NRU1MRVZFTCkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIG1lbUxldmVsOiAiK29wdHMubWVtTGV2ZWwpO2lmKG9wdHMuc3RyYXRlZ3kmJm9wdHMuc3RyYXRlZ3khPWV4cG9ydHMuWl9GSUxURVJFRCYmb3B0cy5zdHJhdGVneSE9ZXhwb3J0cy5aX0hVRkZNQU5fT05MWSYmb3B0cy5zdHJhdGVneSE9ZXhwb3J0cy5aX1JMRSYmb3B0cy5zdHJhdGVneSE9ZXhwb3J0cy5aX0ZJWEVEJiZvcHRzLnN0cmF0ZWd5IT1leHBvcnRzLlpfREVGQVVMVF9TVFJBVEVHWSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyYXRlZ3k6ICIrb3B0cy5zdHJhdGVneSk7aWYob3B0cy5kaWN0aW9uYXJ5JiYhQnVmZmVyLmlzQnVmZmVyKG9wdHMuZGljdGlvbmFyeSkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGRpY3Rpb25hcnk6IGl0IHNob3VsZCBiZSBhIEJ1ZmZlciBpbnN0YW5jZSIpO3RoaXMuX2hhbmRsZT1uZXcgYmluZGluZy5abGliKG1vZGUpO3ZhciBzZWxmPXRoaXM7dGhpcy5faGFkRXJyb3I9ITEsdGhpcy5faGFuZGxlLm9uZXJyb3I9ZnVuY3Rpb24obWVzc2FnZSxlcnJubyl7X2Nsb3NlKHNlbGYpLHNlbGYuX2hhZEVycm9yPSEwO3ZhciBlcnJvcj1uZXcgRXJyb3IobWVzc2FnZSk7ZXJyb3IuZXJybm89ZXJybm8sZXJyb3IuY29kZT1leHBvcnRzLmNvZGVzW2Vycm5vXSxzZWxmLmVtaXQoImVycm9yIixlcnJvcil9O3ZhciBsZXZlbD1leHBvcnRzLlpfREVGQVVMVF9DT01QUkVTU0lPTjsibnVtYmVyIj09dHlwZW9mIG9wdHMubGV2ZWwmJihsZXZlbD1vcHRzLmxldmVsKTt2YXIgc3RyYXRlZ3k9ZXhwb3J0cy5aX0RFRkFVTFRfU1RSQVRFR1k7Im51bWJlciI9PXR5cGVvZiBvcHRzLnN0cmF0ZWd5JiYoc3RyYXRlZ3k9b3B0cy5zdHJhdGVneSksdGhpcy5faGFuZGxlLmluaXQob3B0cy53aW5kb3dCaXRzfHxleHBvcnRzLlpfREVGQVVMVF9XSU5ET1dCSVRTLGxldmVsLG9wdHMubWVtTGV2ZWx8fGV4cG9ydHMuWl9ERUZBVUxUX01FTUxFVkVMLHN0cmF0ZWd5LG9wdHMuZGljdGlvbmFyeSksdGhpcy5fYnVmZmVyPUJ1ZmZlci5hbGxvY1Vuc2FmZSh0aGlzLl9jaHVua1NpemUpLHRoaXMuX29mZnNldD0wLHRoaXMuX2xldmVsPWxldmVsLHRoaXMuX3N0cmF0ZWd5PXN0cmF0ZWd5LHRoaXMub25jZSgiZW5kIix0aGlzLmNsb3NlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiX2Nsb3NlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiFfdGhpcy5faGFuZGxlfSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0pfWZ1bmN0aW9uIF9jbG9zZShlbmdpbmUsY2FsbGJhY2spe2NhbGxiYWNrJiZwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrKSxlbmdpbmUuX2hhbmRsZSYmKGVuZ2luZS5faGFuZGxlLmNsb3NlKCksZW5naW5lLl9oYW5kbGU9bnVsbCl9ZnVuY3Rpb24gZW1pdENsb3NlTlQoc2VsZil7c2VsZi5lbWl0KCJjbG9zZSIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCJjb2RlcyIse2VudW1lcmFibGU6ITAsdmFsdWU6T2JqZWN0LmZyZWV6ZShjb2Rlcyksd3JpdGFibGU6ITF9KSxleHBvcnRzLkRlZmxhdGU9RGVmbGF0ZSxleHBvcnRzLkluZmxhdGU9SW5mbGF0ZSxleHBvcnRzLkd6aXA9R3ppcCxleHBvcnRzLkd1bnppcD1HdW56aXAsZXhwb3J0cy5EZWZsYXRlUmF3PURlZmxhdGVSYXcsZXhwb3J0cy5JbmZsYXRlUmF3PUluZmxhdGVSYXcsZXhwb3J0cy5VbnppcD1VbnppcCxleHBvcnRzLmNyZWF0ZURlZmxhdGU9ZnVuY3Rpb24obyl7cmV0dXJuIG5ldyBEZWZsYXRlKG8pfSxleHBvcnRzLmNyZWF0ZUluZmxhdGU9ZnVuY3Rpb24obyl7cmV0dXJuIG5ldyBJbmZsYXRlKG8pfSxleHBvcnRzLmNyZWF0ZURlZmxhdGVSYXc9ZnVuY3Rpb24obyl7cmV0dXJuIG5ldyBEZWZsYXRlUmF3KG8pfSxleHBvcnRzLmNyZWF0ZUluZmxhdGVSYXc9ZnVuY3Rpb24obyl7cmV0dXJuIG5ldyBJbmZsYXRlUmF3KG8pfSxleHBvcnRzLmNyZWF0ZUd6aXA9ZnVuY3Rpb24obyl7cmV0dXJuIG5ldyBHemlwKG8pfSxleHBvcnRzLmNyZWF0ZUd1bnppcD1mdW5jdGlvbihvKXtyZXR1cm4gbmV3IEd1bnppcChvKX0sZXhwb3J0cy5jcmVhdGVVbnppcD1mdW5jdGlvbihvKXtyZXR1cm4gbmV3IFVuemlwKG8pfSxleHBvcnRzLmRlZmxhdGU9ZnVuY3Rpb24oYnVmZmVyLG9wdHMsY2FsbGJhY2spe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBvcHRzJiYoY2FsbGJhY2s9b3B0cyxvcHRzPXt9KSx6bGliQnVmZmVyKG5ldyBEZWZsYXRlKG9wdHMpLGJ1ZmZlcixjYWxsYmFjayl9LGV4cG9ydHMuZGVmbGF0ZVN5bmM9ZnVuY3Rpb24oYnVmZmVyLG9wdHMpe3JldHVybiB6bGliQnVmZmVyU3luYyhuZXcgRGVmbGF0ZShvcHRzKSxidWZmZXIpfSxleHBvcnRzLmd6aXA9ZnVuY3Rpb24oYnVmZmVyLG9wdHMsY2FsbGJhY2spe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBvcHRzJiYoY2FsbGJhY2s9b3B0cyxvcHRzPXt9KSx6bGliQnVmZmVyKG5ldyBHemlwKG9wdHMpLGJ1ZmZlcixjYWxsYmFjayl9LGV4cG9ydHMuZ3ppcFN5bmM9ZnVuY3Rpb24oYnVmZmVyLG9wdHMpe3JldHVybiB6bGliQnVmZmVyU3luYyhuZXcgR3ppcChvcHRzKSxidWZmZXIpfSxleHBvcnRzLmRlZmxhdGVSYXc9ZnVuY3Rpb24oYnVmZmVyLG9wdHMsY2FsbGJhY2spe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBvcHRzJiYoY2FsbGJhY2s9b3B0cyxvcHRzPXt9KSx6bGliQnVmZmVyKG5ldyBEZWZsYXRlUmF3KG9wdHMpLGJ1ZmZlcixjYWxsYmFjayl9LGV4cG9ydHMuZGVmbGF0ZVJhd1N5bmM9ZnVuY3Rpb24oYnVmZmVyLG9wdHMpe3JldHVybiB6bGliQnVmZmVyU3luYyhuZXcgRGVmbGF0ZVJhdyhvcHRzKSxidWZmZXIpfSxleHBvcnRzLnVuemlwPWZ1bmN0aW9uKGJ1ZmZlcixvcHRzLGNhbGxiYWNrKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygb3B0cyYmKGNhbGxiYWNrPW9wdHMsb3B0cz17fSksemxpYkJ1ZmZlcihuZXcgVW56aXAob3B0cyksYnVmZmVyLGNhbGxiYWNrKX0sZXhwb3J0cy51bnppcFN5bmM9ZnVuY3Rpb24oYnVmZmVyLG9wdHMpe3JldHVybiB6bGliQnVmZmVyU3luYyhuZXcgVW56aXAob3B0cyksYnVmZmVyKX0sZXhwb3J0cy5pbmZsYXRlPWZ1bmN0aW9uKGJ1ZmZlcixvcHRzLGNhbGxiYWNrKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygb3B0cyYmKGNhbGxiYWNrPW9wdHMsb3B0cz17fSksemxpYkJ1ZmZlcihuZXcgSW5mbGF0ZShvcHRzKSxidWZmZXIsY2FsbGJhY2spfSxleHBvcnRzLmluZmxhdGVTeW5jPWZ1bmN0aW9uKGJ1ZmZlcixvcHRzKXtyZXR1cm4gemxpYkJ1ZmZlclN5bmMobmV3IEluZmxhdGUob3B0cyksYnVmZmVyKX0sZXhwb3J0cy5ndW56aXA9ZnVuY3Rpb24oYnVmZmVyLG9wdHMsY2FsbGJhY2spe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBvcHRzJiYoY2FsbGJhY2s9b3B0cyxvcHRzPXt9KSx6bGliQnVmZmVyKG5ldyBHdW56aXAob3B0cyksYnVmZmVyLGNhbGxiYWNrKX0sZXhwb3J0cy5ndW56aXBTeW5jPWZ1bmN0aW9uKGJ1ZmZlcixvcHRzKXtyZXR1cm4gemxpYkJ1ZmZlclN5bmMobmV3IEd1bnppcChvcHRzKSxidWZmZXIpfSxleHBvcnRzLmluZmxhdGVSYXc9ZnVuY3Rpb24oYnVmZmVyLG9wdHMsY2FsbGJhY2spe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBvcHRzJiYoY2FsbGJhY2s9b3B0cyxvcHRzPXt9KSx6bGliQnVmZmVyKG5ldyBJbmZsYXRlUmF3KG9wdHMpLGJ1ZmZlcixjYWxsYmFjayl9LGV4cG9ydHMuaW5mbGF0ZVJhd1N5bmM9ZnVuY3Rpb24oYnVmZmVyLG9wdHMpe3JldHVybiB6bGliQnVmZmVyU3luYyhuZXcgSW5mbGF0ZVJhdyhvcHRzKSxidWZmZXIpfSx1dGlsLmluaGVyaXRzKFpsaWIsVHJhbnNmb3JtKSxabGliLnByb3RvdHlwZS5wYXJhbXM9ZnVuY3Rpb24obGV2ZWwsc3RyYXRlZ3ksY2FsbGJhY2spe2lmKGxldmVsPGV4cG9ydHMuWl9NSU5fTEVWRUx8fGxldmVsPmV4cG9ydHMuWl9NQVhfTEVWRUwpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgY29tcHJlc3Npb24gbGV2ZWw6ICIrbGV2ZWwpO2lmKHN0cmF0ZWd5IT1leHBvcnRzLlpfRklMVEVSRUQmJnN0cmF0ZWd5IT1leHBvcnRzLlpfSFVGRk1BTl9PTkxZJiZzdHJhdGVneSE9ZXhwb3J0cy5aX1JMRSYmc3RyYXRlZ3khPWV4cG9ydHMuWl9GSVhFRCYmc3RyYXRlZ3khPWV4cG9ydHMuWl9ERUZBVUxUX1NUUkFURUdZKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgc3RyYXRlZ3k6ICIrc3RyYXRlZ3kpO2lmKHRoaXMuX2xldmVsIT09bGV2ZWx8fHRoaXMuX3N0cmF0ZWd5IT09c3RyYXRlZ3kpe3ZhciBzZWxmPXRoaXM7dGhpcy5mbHVzaChiaW5kaW5nLlpfU1lOQ19GTFVTSCxmdW5jdGlvbigpe2Fzc2VydChzZWxmLl9oYW5kbGUsInpsaWIgYmluZGluZyBjbG9zZWQiKSxzZWxmLl9oYW5kbGUucGFyYW1zKGxldmVsLHN0cmF0ZWd5KSxzZWxmLl9oYWRFcnJvcnx8KHNlbGYuX2xldmVsPWxldmVsLHNlbGYuX3N0cmF0ZWd5PXN0cmF0ZWd5LGNhbGxiYWNrJiZjYWxsYmFjaygpKX0pfWVsc2UgcHJvY2Vzcy5uZXh0VGljayhjYWxsYmFjayl9LFpsaWIucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGFzc2VydCh0aGlzLl9oYW5kbGUsInpsaWIgYmluZGluZyBjbG9zZWQiKSx0aGlzLl9oYW5kbGUucmVzZXQoKX0sWmxpYi5wcm90b3R5cGUuX2ZsdXNoPWZ1bmN0aW9uKGNhbGxiYWNrKXt0aGlzLl90cmFuc2Zvcm0oQnVmZmVyLmFsbG9jKDApLCIiLGNhbGxiYWNrKX0sWmxpYi5wcm90b3R5cGUuZmx1c2g9ZnVuY3Rpb24oa2luZCxjYWxsYmFjayl7dmFyIF90aGlzMj10aGlzLHdzPXRoaXMuX3dyaXRhYmxlU3RhdGU7KCJmdW5jdGlvbiI9PXR5cGVvZiBraW5kfHx2b2lkIDA9PT1raW5kJiYhY2FsbGJhY2spJiYoY2FsbGJhY2s9a2luZCxraW5kPWJpbmRpbmcuWl9GVUxMX0ZMVVNIKSx3cy5lbmRlZD9jYWxsYmFjayYmcHJvY2Vzcy5uZXh0VGljayhjYWxsYmFjayk6d3MuZW5kaW5nP2NhbGxiYWNrJiZ0aGlzLm9uY2UoImVuZCIsY2FsbGJhY2spOndzLm5lZWREcmFpbj9jYWxsYmFjayYmdGhpcy5vbmNlKCJkcmFpbiIsZnVuY3Rpb24oKXtyZXR1cm4gX3RoaXMyLmZsdXNoKGtpbmQsY2FsbGJhY2spfSk6KHRoaXMuX2ZsdXNoRmxhZz1raW5kLHRoaXMud3JpdGUoQnVmZmVyLmFsbG9jKDApLCIiLGNhbGxiYWNrKSl9LFpsaWIucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKGNhbGxiYWNrKXtfY2xvc2UodGhpcyxjYWxsYmFjaykscHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2VOVCx0aGlzKX0sWmxpYi5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbihjaHVuayxlbmNvZGluZyxjYil7dmFyIGZsdXNoRmxhZyx3cz10aGlzLl93cml0YWJsZVN0YXRlLGxhc3Q9KHdzLmVuZGluZ3x8d3MuZW5kZWQpJiYoIWNodW5rfHx3cy5sZW5ndGg9PT1jaHVuay5sZW5ndGgpO3JldHVybiBudWxsPT09Y2h1bmt8fEJ1ZmZlci5pc0J1ZmZlcihjaHVuayk/dGhpcy5faGFuZGxlPyhsYXN0P2ZsdXNoRmxhZz10aGlzLl9maW5pc2hGbHVzaEZsYWc6KGZsdXNoRmxhZz10aGlzLl9mbHVzaEZsYWcsY2h1bmsubGVuZ3RoPj13cy5sZW5ndGgmJih0aGlzLl9mbHVzaEZsYWc9dGhpcy5fb3B0cy5mbHVzaHx8YmluZGluZy5aX05PX0ZMVVNIKSksdm9pZCB0aGlzLl9wcm9jZXNzQ2h1bmsoY2h1bmssZmx1c2hGbGFnLGNiKSk6Y2IobmV3IEVycm9yKCJ6bGliIGJpbmRpbmcgY2xvc2VkIikpOmNiKG5ldyBFcnJvcigiaW52YWxpZCBpbnB1dCIpKX0sWmxpYi5wcm90b3R5cGUuX3Byb2Nlc3NDaHVuaz1mdW5jdGlvbihjaHVuayxmbHVzaEZsYWcsY2Ipe3ZhciBhdmFpbEluQmVmb3JlPWNodW5rJiZjaHVuay5sZW5ndGgsYXZhaWxPdXRCZWZvcmU9dGhpcy5fY2h1bmtTaXplLXRoaXMuX29mZnNldCxpbk9mZj0wLHNlbGY9dGhpcyxhc3luYz0iZnVuY3Rpb24iPT10eXBlb2YgY2I7aWYoIWFzeW5jKXt2YXIgZXJyb3IsYnVmZmVycz1bXSxucmVhZD0wO3RoaXMub24oImVycm9yIixmdW5jdGlvbihlcil7ZXJyb3I9ZXJ9KSxhc3NlcnQodGhpcy5faGFuZGxlLCJ6bGliIGJpbmRpbmcgY2xvc2VkIik7ZG97dmFyIHJlcz10aGlzLl9oYW5kbGUud3JpdGVTeW5jKGZsdXNoRmxhZyxjaHVuayxpbk9mZixhdmFpbEluQmVmb3JlLHRoaXMuX2J1ZmZlcix0aGlzLl9vZmZzZXQsYXZhaWxPdXRCZWZvcmUpfXdoaWxlKCF0aGlzLl9oYWRFcnJvciYmY2FsbGJhY2socmVzWzBdLHJlc1sxXSkpO2lmKHRoaXMuX2hhZEVycm9yKXRocm93IGVycm9yO2lmKG5yZWFkPj1rTWF4TGVuZ3RoKXRocm93IF9jbG9zZSh0aGlzKSxuZXcgUmFuZ2VFcnJvcihrUmFuZ2VFcnJvck1lc3NhZ2UpO3ZhciBidWY9QnVmZmVyLmNvbmNhdChidWZmZXJzLG5yZWFkKTtyZXR1cm4gX2Nsb3NlKHRoaXMpLGJ1Zn1hc3NlcnQodGhpcy5faGFuZGxlLCJ6bGliIGJpbmRpbmcgY2xvc2VkIik7dmFyIHJlcT10aGlzLl9oYW5kbGUud3JpdGUoZmx1c2hGbGFnLGNodW5rLGluT2ZmLGF2YWlsSW5CZWZvcmUsdGhpcy5fYnVmZmVyLHRoaXMuX29mZnNldCxhdmFpbE91dEJlZm9yZSk7ZnVuY3Rpb24gY2FsbGJhY2soYXZhaWxJbkFmdGVyLGF2YWlsT3V0QWZ0ZXIpe2lmKHRoaXMmJih0aGlzLmJ1ZmZlcj1udWxsLHRoaXMuY2FsbGJhY2s9bnVsbCksIXNlbGYuX2hhZEVycm9yKXt2YXIgaGF2ZT1hdmFpbE91dEJlZm9yZS1hdmFpbE91dEFmdGVyO2lmKGFzc2VydChoYXZlPj0wLCJoYXZlIHNob3VsZCBub3QgZ28gZG93biIpLGhhdmU+MCl7dmFyIG91dD1zZWxmLl9idWZmZXIuc2xpY2Uoc2VsZi5fb2Zmc2V0LHNlbGYuX29mZnNldCtoYXZlKTtzZWxmLl9vZmZzZXQrPWhhdmUsYXN5bmM/c2VsZi5wdXNoKG91dCk6KGJ1ZmZlcnMucHVzaChvdXQpLG5yZWFkKz1vdXQubGVuZ3RoKX1pZigoMD09PWF2YWlsT3V0QWZ0ZXJ8fHNlbGYuX29mZnNldD49c2VsZi5fY2h1bmtTaXplKSYmKGF2YWlsT3V0QmVmb3JlPXNlbGYuX2NodW5rU2l6ZSxzZWxmLl9vZmZzZXQ9MCxzZWxmLl9idWZmZXI9QnVmZmVyLmFsbG9jVW5zYWZlKHNlbGYuX2NodW5rU2l6ZSkpLDA9PT1hdmFpbE91dEFmdGVyKXtpZihpbk9mZis9YXZhaWxJbkJlZm9yZS1hdmFpbEluQWZ0ZXIsYXZhaWxJbkJlZm9yZT1hdmFpbEluQWZ0ZXIsIWFzeW5jKXJldHVybiEwO3ZhciBuZXdSZXE9c2VsZi5faGFuZGxlLndyaXRlKGZsdXNoRmxhZyxjaHVuayxpbk9mZixhdmFpbEluQmVmb3JlLHNlbGYuX2J1ZmZlcixzZWxmLl9vZmZzZXQsc2VsZi5fY2h1bmtTaXplKTtyZXR1cm4gbmV3UmVxLmNhbGxiYWNrPWNhbGxiYWNrLHZvaWQobmV3UmVxLmJ1ZmZlcj1jaHVuayl9aWYoIWFzeW5jKXJldHVybiExO2NiKCl9fXJlcS5idWZmZXI9Y2h1bmsscmVxLmNhbGxiYWNrPWNhbGxiYWNrfSx1dGlsLmluaGVyaXRzKERlZmxhdGUsWmxpYiksdXRpbC5pbmhlcml0cyhJbmZsYXRlLFpsaWIpLHV0aWwuaW5oZXJpdHMoR3ppcCxabGliKSx1dGlsLmluaGVyaXRzKEd1bnppcCxabGliKSx1dGlsLmluaGVyaXRzKERlZmxhdGVSYXcsWmxpYiksdXRpbC5pbmhlcml0cyhJbmZsYXRlUmF3LFpsaWIpLHV0aWwuaW5oZXJpdHMoVW56aXAsWmxpYil9LCIuLi8uLi9ub2RlX21vZHVsZXMvYnVmZmVyLXhvci9pbmRleC5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXt2YXIgQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiKTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbiB4b3IoYSxiKXtmb3IodmFyIGxlbmd0aD1NYXRoLm1pbihhLmxlbmd0aCxiLmxlbmd0aCksYnVmZmVyPW5ldyBCdWZmZXIobGVuZ3RoKSxpPTA7aTxsZW5ndGg7KytpKWJ1ZmZlcltpXT1hW2ldXmJbaV07cmV0dXJuIGJ1ZmZlcn19LCIuLi8uLi9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzIihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgYmFzZTY0PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9iYXNlNjQtanMvaW5kZXguanMiKSxpZWVlNzU0PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9pZWVlNzU0L2luZGV4LmpzIiksY3VzdG9tSW5zcGVjdFN5bWJvbD0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sLmZvcj9TeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpOm51bGw7ZXhwb3J0cy5CdWZmZXI9QnVmZmVyLGV4cG9ydHMuU2xvd0J1ZmZlcj1mdW5jdGlvbiBTbG93QnVmZmVyKGxlbmd0aCl7K2xlbmd0aCE9bGVuZ3RoJiYobGVuZ3RoPTApO3JldHVybiBCdWZmZXIuYWxsb2MoK2xlbmd0aCl9LGV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVM9NTA7ZnVuY3Rpb24gY3JlYXRlQnVmZmVyKGxlbmd0aCl7aWYobGVuZ3RoPjIxNDc0ODM2NDcpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSAiJytsZW5ndGgrJyIgaXMgaW52YWxpZCBmb3Igb3B0aW9uICJzaXplIicpO3ZhciBidWY9bmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKGJ1ZixCdWZmZXIucHJvdG90eXBlKSxidWZ9ZnVuY3Rpb24gQnVmZmVyKGFyZyxlbmNvZGluZ09yT2Zmc2V0LGxlbmd0aCl7aWYoIm51bWJlciI9PXR5cGVvZiBhcmcpe2lmKCJzdHJpbmciPT10eXBlb2YgZW5jb2RpbmdPck9mZnNldCl0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgInN0cmluZyIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4gUmVjZWl2ZWQgdHlwZSBudW1iZXInKTtyZXR1cm4gYWxsb2NVbnNhZmUoYXJnKX1yZXR1cm4gZnJvbShhcmcsZW5jb2RpbmdPck9mZnNldCxsZW5ndGgpfWZ1bmN0aW9uIGZyb20odmFsdWUsZW5jb2RpbmdPck9mZnNldCxsZW5ndGgpe2lmKCJzdHJpbmciPT10eXBlb2YgdmFsdWUpcmV0dXJuIGZ1bmN0aW9uIGZyb21TdHJpbmcoc3RyaW5nLGVuY29kaW5nKXsic3RyaW5nIj09dHlwZW9mIGVuY29kaW5nJiYiIiE9PWVuY29kaW5nfHwoZW5jb2Rpbmc9InV0ZjgiKTtpZighQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrZW5jb2RpbmcpO3ZhciBsZW5ndGg9MHxieXRlTGVuZ3RoKHN0cmluZyxlbmNvZGluZyksYnVmPWNyZWF0ZUJ1ZmZlcihsZW5ndGgpLGFjdHVhbD1idWYud3JpdGUoc3RyaW5nLGVuY29kaW5nKTthY3R1YWwhPT1sZW5ndGgmJihidWY9YnVmLnNsaWNlKDAsYWN0dWFsKSk7cmV0dXJuIGJ1Zn0odmFsdWUsZW5jb2RpbmdPck9mZnNldCk7aWYoQXJyYXlCdWZmZXIuaXNWaWV3KHZhbHVlKSlyZXR1cm4gZnVuY3Rpb24gZnJvbUFycmF5VmlldyhhcnJheVZpZXcpe2lmKGlzSW5zdGFuY2UoYXJyYXlWaWV3LFVpbnQ4QXJyYXkpKXt2YXIgY29weT1uZXcgVWludDhBcnJheShhcnJheVZpZXcpO3JldHVybiBmcm9tQXJyYXlCdWZmZXIoY29weS5idWZmZXIsY29weS5ieXRlT2Zmc2V0LGNvcHkuYnl0ZUxlbmd0aCl9cmV0dXJuIGZyb21BcnJheUxpa2UoYXJyYXlWaWV3KX0odmFsdWUpO2lmKG51bGw9PXZhbHVlKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICIrdHlwZW9mIHZhbHVlKTtpZihpc0luc3RhbmNlKHZhbHVlLEFycmF5QnVmZmVyKXx8dmFsdWUmJmlzSW5zdGFuY2UodmFsdWUuYnVmZmVyLEFycmF5QnVmZmVyKSlyZXR1cm4gZnJvbUFycmF5QnVmZmVyKHZhbHVlLGVuY29kaW5nT3JPZmZzZXQsbGVuZ3RoKTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyJiYoaXNJbnN0YW5jZSh2YWx1ZSxTaGFyZWRBcnJheUJ1ZmZlcil8fHZhbHVlJiZpc0luc3RhbmNlKHZhbHVlLmJ1ZmZlcixTaGFyZWRBcnJheUJ1ZmZlcikpKXJldHVybiBmcm9tQXJyYXlCdWZmZXIodmFsdWUsZW5jb2RpbmdPck9mZnNldCxsZW5ndGgpO2lmKCJudW1iZXIiPT10eXBlb2YgdmFsdWUpdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJ2YWx1ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJyk7dmFyIHZhbHVlT2Y9dmFsdWUudmFsdWVPZiYmdmFsdWUudmFsdWVPZigpO2lmKG51bGwhPXZhbHVlT2YmJnZhbHVlT2YhPT12YWx1ZSlyZXR1cm4gQnVmZmVyLmZyb20odmFsdWVPZixlbmNvZGluZ09yT2Zmc2V0LGxlbmd0aCk7dmFyIGI9ZnVuY3Rpb24gZnJvbU9iamVjdChvYmope2lmKEJ1ZmZlci5pc0J1ZmZlcihvYmopKXt2YXIgbGVuPTB8Y2hlY2tlZChvYmoubGVuZ3RoKSxidWY9Y3JlYXRlQnVmZmVyKGxlbik7cmV0dXJuIDA9PT1idWYubGVuZ3RofHxvYmouY29weShidWYsMCwwLGxlbiksYnVmfWlmKHZvaWQgMCE9PW9iai5sZW5ndGgpcmV0dXJuIm51bWJlciIhPXR5cGVvZiBvYmoubGVuZ3RofHxudW1iZXJJc05hTihvYmoubGVuZ3RoKT9jcmVhdGVCdWZmZXIoMCk6ZnJvbUFycmF5TGlrZShvYmopO2lmKCJCdWZmZXIiPT09b2JqLnR5cGUmJkFycmF5LmlzQXJyYXkob2JqLmRhdGEpKXJldHVybiBmcm9tQXJyYXlMaWtlKG9iai5kYXRhKX0odmFsdWUpO2lmKGIpcmV0dXJuIGI7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJm51bGwhPVN5bWJvbC50b1ByaW1pdGl2ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHZhbHVlW1N5bWJvbC50b1ByaW1pdGl2ZV0pcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlW1N5bWJvbC50b1ByaW1pdGl2ZV0oInN0cmluZyIpLGVuY29kaW5nT3JPZmZzZXQsbGVuZ3RoKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBBcnJheS1saWtlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSAiK3R5cGVvZiB2YWx1ZSl9ZnVuY3Rpb24gYXNzZXJ0U2l6ZShzaXplKXtpZigibnVtYmVyIiE9dHlwZW9mIHNpemUpdGhyb3cgbmV3IFR5cGVFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXInKTtpZihzaXplPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSAiJytzaXplKyciIGlzIGludmFsaWQgZm9yIG9wdGlvbiAic2l6ZSInKX1mdW5jdGlvbiBhbGxvY1Vuc2FmZShzaXplKXtyZXR1cm4gYXNzZXJ0U2l6ZShzaXplKSxjcmVhdGVCdWZmZXIoc2l6ZTwwPzA6MHxjaGVja2VkKHNpemUpKX1mdW5jdGlvbiBmcm9tQXJyYXlMaWtlKGFycmF5KXtmb3IodmFyIGxlbmd0aD1hcnJheS5sZW5ndGg8MD8wOjB8Y2hlY2tlZChhcnJheS5sZW5ndGgpLGJ1Zj1jcmVhdGVCdWZmZXIobGVuZ3RoKSxpPTA7aTxsZW5ndGg7aSs9MSlidWZbaV09MjU1JmFycmF5W2ldO3JldHVybiBidWZ9ZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyKGFycmF5LGJ5dGVPZmZzZXQsbGVuZ3RoKXtpZihieXRlT2Zmc2V0PDB8fGFycmF5LmJ5dGVMZW5ndGg8Ynl0ZU9mZnNldCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignIm9mZnNldCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJyk7aWYoYXJyYXkuYnl0ZUxlbmd0aDxieXRlT2Zmc2V0KyhsZW5ndGh8fDApKXRocm93IG5ldyBSYW5nZUVycm9yKCcibGVuZ3RoIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKTt2YXIgYnVmO3JldHVybiBidWY9dm9pZCAwPT09Ynl0ZU9mZnNldCYmdm9pZCAwPT09bGVuZ3RoP25ldyBVaW50OEFycmF5KGFycmF5KTp2b2lkIDA9PT1sZW5ndGg/bmV3IFVpbnQ4QXJyYXkoYXJyYXksYnl0ZU9mZnNldCk6bmV3IFVpbnQ4QXJyYXkoYXJyYXksYnl0ZU9mZnNldCxsZW5ndGgpLE9iamVjdC5zZXRQcm90b3R5cGVPZihidWYsQnVmZmVyLnByb3RvdHlwZSksYnVmfWZ1bmN0aW9uIGNoZWNrZWQobGVuZ3RoKXtpZihsZW5ndGg+PTIxNDc0ODM2NDcpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHgiKzIxNDc0ODM2NDcuLnRvU3RyaW5nKDE2KSsiIGJ5dGVzIik7cmV0dXJuIDB8bGVuZ3RofWZ1bmN0aW9uIGJ5dGVMZW5ndGgoc3RyaW5nLGVuY29kaW5nKXtpZihCdWZmZXIuaXNCdWZmZXIoc3RyaW5nKSlyZXR1cm4gc3RyaW5nLmxlbmd0aDtpZihBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKXx8aXNJbnN0YW5jZShzdHJpbmcsQXJyYXlCdWZmZXIpKXJldHVybiBzdHJpbmcuYnl0ZUxlbmd0aDtpZigic3RyaW5nIiE9dHlwZW9mIHN0cmluZyl0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgInN0cmluZyIgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgb3IgQXJyYXlCdWZmZXIuIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2Ygc3RyaW5nKTt2YXIgbGVuPXN0cmluZy5sZW5ndGgsbXVzdE1hdGNoPWFyZ3VtZW50cy5sZW5ndGg+MiYmITA9PT1hcmd1bWVudHNbMl07aWYoIW11c3RNYXRjaCYmMD09PWxlbilyZXR1cm4gMDtmb3IodmFyIGxvd2VyZWRDYXNlPSExOzspc3dpdGNoKGVuY29kaW5nKXtjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBsZW47Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGg7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiAyKmxlbjtjYXNlImhleCI6cmV0dXJuIGxlbj4+PjE7Y2FzZSJiYXNlNjQiOnJldHVybiBiYXNlNjRUb0J5dGVzKHN0cmluZykubGVuZ3RoO2RlZmF1bHQ6aWYobG93ZXJlZENhc2UpcmV0dXJuIG11c3RNYXRjaD8tMTp1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aDtlbmNvZGluZz0oIiIrZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCksbG93ZXJlZENhc2U9ITB9fWZ1bmN0aW9uIHNsb3dUb1N0cmluZyhlbmNvZGluZyxzdGFydCxlbmQpe3ZhciBsb3dlcmVkQ2FzZT0hMTtpZigodm9pZCAwPT09c3RhcnR8fHN0YXJ0PDApJiYoc3RhcnQ9MCksc3RhcnQ+dGhpcy5sZW5ndGgpcmV0dXJuIiI7aWYoKHZvaWQgMD09PWVuZHx8ZW5kPnRoaXMubGVuZ3RoKSYmKGVuZD10aGlzLmxlbmd0aCksZW5kPD0wKXJldHVybiIiO2lmKChlbmQ+Pj49MCk8PShzdGFydD4+Pj0wKSlyZXR1cm4iIjtmb3IoZW5jb2Rpbmd8fChlbmNvZGluZz0idXRmOCIpOzspc3dpdGNoKGVuY29kaW5nKXtjYXNlImhleCI6cmV0dXJuIGhleFNsaWNlKHRoaXMsc3RhcnQsZW5kKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiB1dGY4U2xpY2UodGhpcyxzdGFydCxlbmQpO2Nhc2UiYXNjaWkiOnJldHVybiBhc2NpaVNsaWNlKHRoaXMsc3RhcnQsZW5kKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBsYXRpbjFTbGljZSh0aGlzLHN0YXJ0LGVuZCk7Y2FzZSJiYXNlNjQiOnJldHVybiBiYXNlNjRTbGljZSh0aGlzLHN0YXJ0LGVuZCk7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiB1dGYxNmxlU2xpY2UodGhpcyxzdGFydCxlbmQpO2RlZmF1bHQ6aWYobG93ZXJlZENhc2UpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIitlbmNvZGluZyk7ZW5jb2Rpbmc9KGVuY29kaW5nKyIiKS50b0xvd2VyQ2FzZSgpLGxvd2VyZWRDYXNlPSEwfX1mdW5jdGlvbiBzd2FwKGIsbixtKXt2YXIgaT1iW25dO2Jbbl09YlttXSxiW21dPWl9ZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YoYnVmZmVyLHZhbCxieXRlT2Zmc2V0LGVuY29kaW5nLGRpcil7aWYoMD09PWJ1ZmZlci5sZW5ndGgpcmV0dXJuLTE7aWYoInN0cmluZyI9PXR5cGVvZiBieXRlT2Zmc2V0PyhlbmNvZGluZz1ieXRlT2Zmc2V0LGJ5dGVPZmZzZXQ9MCk6Ynl0ZU9mZnNldD4yMTQ3NDgzNjQ3P2J5dGVPZmZzZXQ9MjE0NzQ4MzY0NzpieXRlT2Zmc2V0PC0yMTQ3NDgzNjQ4JiYoYnl0ZU9mZnNldD0tMjE0NzQ4MzY0OCksbnVtYmVySXNOYU4oYnl0ZU9mZnNldD0rYnl0ZU9mZnNldCkmJihieXRlT2Zmc2V0PWRpcj8wOmJ1ZmZlci5sZW5ndGgtMSksYnl0ZU9mZnNldDwwJiYoYnl0ZU9mZnNldD1idWZmZXIubGVuZ3RoK2J5dGVPZmZzZXQpLGJ5dGVPZmZzZXQ+PWJ1ZmZlci5sZW5ndGgpe2lmKGRpcilyZXR1cm4tMTtieXRlT2Zmc2V0PWJ1ZmZlci5sZW5ndGgtMX1lbHNlIGlmKGJ5dGVPZmZzZXQ8MCl7aWYoIWRpcilyZXR1cm4tMTtieXRlT2Zmc2V0PTB9aWYoInN0cmluZyI9PXR5cGVvZiB2YWwmJih2YWw9QnVmZmVyLmZyb20odmFsLGVuY29kaW5nKSksQnVmZmVyLmlzQnVmZmVyKHZhbCkpcmV0dXJuIDA9PT12YWwubGVuZ3RoPy0xOmFycmF5SW5kZXhPZihidWZmZXIsdmFsLGJ5dGVPZmZzZXQsZW5jb2RpbmcsZGlyKTtpZigibnVtYmVyIj09dHlwZW9mIHZhbClyZXR1cm4gdmFsJj0yNTUsImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y/ZGlyP1VpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsdmFsLGJ5dGVPZmZzZXQpOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoYnVmZmVyLHZhbCxieXRlT2Zmc2V0KTphcnJheUluZGV4T2YoYnVmZmVyLFt2YWxdLGJ5dGVPZmZzZXQsZW5jb2RpbmcsZGlyKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJ2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXIiKX1mdW5jdGlvbiBhcnJheUluZGV4T2YoYXJyLHZhbCxieXRlT2Zmc2V0LGVuY29kaW5nLGRpcil7dmFyIGksaW5kZXhTaXplPTEsYXJyTGVuZ3RoPWFyci5sZW5ndGgsdmFsTGVuZ3RoPXZhbC5sZW5ndGg7aWYodm9pZCAwIT09ZW5jb2RpbmcmJigidWNzMiI9PT0oZW5jb2Rpbmc9U3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKXx8InVjcy0yIj09PWVuY29kaW5nfHwidXRmMTZsZSI9PT1lbmNvZGluZ3x8InV0Zi0xNmxlIj09PWVuY29kaW5nKSl7aWYoYXJyLmxlbmd0aDwyfHx2YWwubGVuZ3RoPDIpcmV0dXJuLTE7aW5kZXhTaXplPTIsYXJyTGVuZ3RoLz0yLHZhbExlbmd0aC89MixieXRlT2Zmc2V0Lz0yfWZ1bmN0aW9uIHJlYWQoYnVmLGkpe3JldHVybiAxPT09aW5kZXhTaXplP2J1ZltpXTpidWYucmVhZFVJbnQxNkJFKGkqaW5kZXhTaXplKX1pZihkaXIpe3ZhciBmb3VuZEluZGV4PS0xO2ZvcihpPWJ5dGVPZmZzZXQ7aTxhcnJMZW5ndGg7aSsrKWlmKHJlYWQoYXJyLGkpPT09cmVhZCh2YWwsLTE9PT1mb3VuZEluZGV4PzA6aS1mb3VuZEluZGV4KSl7aWYoLTE9PT1mb3VuZEluZGV4JiYoZm91bmRJbmRleD1pKSxpLWZvdW5kSW5kZXgrMT09PXZhbExlbmd0aClyZXR1cm4gZm91bmRJbmRleCppbmRleFNpemV9ZWxzZS0xIT09Zm91bmRJbmRleCYmKGktPWktZm91bmRJbmRleCksZm91bmRJbmRleD0tMX1lbHNlIGZvcihieXRlT2Zmc2V0K3ZhbExlbmd0aD5hcnJMZW5ndGgmJihieXRlT2Zmc2V0PWFyckxlbmd0aC12YWxMZW5ndGgpLGk9Ynl0ZU9mZnNldDtpPj0wO2ktLSl7Zm9yKHZhciBmb3VuZD0hMCxqPTA7ajx2YWxMZW5ndGg7aisrKWlmKHJlYWQoYXJyLGkraikhPT1yZWFkKHZhbCxqKSl7Zm91bmQ9ITE7YnJlYWt9aWYoZm91bmQpcmV0dXJuIGl9cmV0dXJuLTF9ZnVuY3Rpb24gaGV4V3JpdGUoYnVmLHN0cmluZyxvZmZzZXQsbGVuZ3RoKXtvZmZzZXQ9TnVtYmVyKG9mZnNldCl8fDA7dmFyIHJlbWFpbmluZz1idWYubGVuZ3RoLW9mZnNldDtsZW5ndGg/KGxlbmd0aD1OdW1iZXIobGVuZ3RoKSk+cmVtYWluaW5nJiYobGVuZ3RoPXJlbWFpbmluZyk6bGVuZ3RoPXJlbWFpbmluZzt2YXIgc3RyTGVuPXN0cmluZy5sZW5ndGg7bGVuZ3RoPnN0ckxlbi8yJiYobGVuZ3RoPXN0ckxlbi8yKTtmb3IodmFyIGk9MDtpPGxlbmd0aDsrK2kpe3ZhciBwYXJzZWQ9cGFyc2VJbnQoc3RyaW5nLnN1YnN0cigyKmksMiksMTYpO2lmKG51bWJlcklzTmFOKHBhcnNlZCkpcmV0dXJuIGk7YnVmW29mZnNldCtpXT1wYXJzZWR9cmV0dXJuIGl9ZnVuY3Rpb24gdXRmOFdyaXRlKGJ1ZixzdHJpbmcsb2Zmc2V0LGxlbmd0aCl7cmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLGJ1Zi5sZW5ndGgtb2Zmc2V0KSxidWYsb2Zmc2V0LGxlbmd0aCl9ZnVuY3Rpb24gYXNjaWlXcml0ZShidWYsc3RyaW5nLG9mZnNldCxsZW5ndGgpe3JldHVybiBibGl0QnVmZmVyKGZ1bmN0aW9uIGFzY2lpVG9CeXRlcyhzdHIpe2Zvcih2YXIgYnl0ZUFycmF5PVtdLGk9MDtpPHN0ci5sZW5ndGg7KytpKWJ5dGVBcnJheS5wdXNoKDI1NSZzdHIuY2hhckNvZGVBdChpKSk7cmV0dXJuIGJ5dGVBcnJheX0oc3RyaW5nKSxidWYsb2Zmc2V0LGxlbmd0aCl9ZnVuY3Rpb24gYmFzZTY0V3JpdGUoYnVmLHN0cmluZyxvZmZzZXQsbGVuZ3RoKXtyZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksYnVmLG9mZnNldCxsZW5ndGgpfWZ1bmN0aW9uIHVjczJXcml0ZShidWYsc3RyaW5nLG9mZnNldCxsZW5ndGgpe3JldHVybiBibGl0QnVmZmVyKGZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzKHN0cix1bml0cyl7Zm9yKHZhciBjLGhpLGxvLGJ5dGVBcnJheT1bXSxpPTA7aTxzdHIubGVuZ3RoJiYhKCh1bml0cy09Mik8MCk7KytpKWhpPShjPXN0ci5jaGFyQ29kZUF0KGkpKT4+OCxsbz1jJTI1NixieXRlQXJyYXkucHVzaChsbyksYnl0ZUFycmF5LnB1c2goaGkpO3JldHVybiBieXRlQXJyYXl9KHN0cmluZyxidWYubGVuZ3RoLW9mZnNldCksYnVmLG9mZnNldCxsZW5ndGgpfWZ1bmN0aW9uIGJhc2U2NFNsaWNlKGJ1ZixzdGFydCxlbmQpe3JldHVybiAwPT09c3RhcnQmJmVuZD09PWJ1Zi5sZW5ndGg/YmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKTpiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsZW5kKSl9ZnVuY3Rpb24gdXRmOFNsaWNlKGJ1ZixzdGFydCxlbmQpe2VuZD1NYXRoLm1pbihidWYubGVuZ3RoLGVuZCk7Zm9yKHZhciByZXM9W10saT1zdGFydDtpPGVuZDspe3ZhciBzZWNvbmRCeXRlLHRoaXJkQnl0ZSxmb3VydGhCeXRlLHRlbXBDb2RlUG9pbnQsZmlyc3RCeXRlPWJ1ZltpXSxjb2RlUG9pbnQ9bnVsbCxieXRlc1BlclNlcXVlbmNlPWZpcnN0Qnl0ZT4yMzk/NDpmaXJzdEJ5dGU+MjIzPzM6Zmlyc3RCeXRlPjE5MT8yOjE7aWYoaStieXRlc1BlclNlcXVlbmNlPD1lbmQpc3dpdGNoKGJ5dGVzUGVyU2VxdWVuY2Upe2Nhc2UgMTpmaXJzdEJ5dGU8MTI4JiYoY29kZVBvaW50PWZpcnN0Qnl0ZSk7YnJlYWs7Y2FzZSAyOjEyOD09KDE5MiYoc2Vjb25kQnl0ZT1idWZbaSsxXSkpJiYodGVtcENvZGVQb2ludD0oMzEmZmlyc3RCeXRlKTw8Nnw2MyZzZWNvbmRCeXRlKT4xMjcmJihjb2RlUG9pbnQ9dGVtcENvZGVQb2ludCk7YnJlYWs7Y2FzZSAzOnNlY29uZEJ5dGU9YnVmW2krMV0sdGhpcmRCeXRlPWJ1ZltpKzJdLDEyOD09KDE5MiZzZWNvbmRCeXRlKSYmMTI4PT0oMTkyJnRoaXJkQnl0ZSkmJih0ZW1wQ29kZVBvaW50PSgxNSZmaXJzdEJ5dGUpPDwxMnwoNjMmc2Vjb25kQnl0ZSk8PDZ8NjMmdGhpcmRCeXRlKT4yMDQ3JiYodGVtcENvZGVQb2ludDw1NTI5Nnx8dGVtcENvZGVQb2ludD41NzM0MykmJihjb2RlUG9pbnQ9dGVtcENvZGVQb2ludCk7YnJlYWs7Y2FzZSA0OnNlY29uZEJ5dGU9YnVmW2krMV0sdGhpcmRCeXRlPWJ1ZltpKzJdLGZvdXJ0aEJ5dGU9YnVmW2krM10sMTI4PT0oMTkyJnNlY29uZEJ5dGUpJiYxMjg9PSgxOTImdGhpcmRCeXRlKSYmMTI4PT0oMTkyJmZvdXJ0aEJ5dGUpJiYodGVtcENvZGVQb2ludD0oMTUmZmlyc3RCeXRlKTw8MTh8KDYzJnNlY29uZEJ5dGUpPDwxMnwoNjMmdGhpcmRCeXRlKTw8Nnw2MyZmb3VydGhCeXRlKT42NTUzNSYmdGVtcENvZGVQb2ludDwxMTE0MTEyJiYoY29kZVBvaW50PXRlbXBDb2RlUG9pbnQpfW51bGw9PT1jb2RlUG9pbnQ/KGNvZGVQb2ludD02NTUzMyxieXRlc1BlclNlcXVlbmNlPTEpOmNvZGVQb2ludD42NTUzNSYmKGNvZGVQb2ludC09NjU1MzYscmVzLnB1c2goY29kZVBvaW50Pj4+MTAmMTAyM3w1NTI5NiksY29kZVBvaW50PTU2MzIwfDEwMjMmY29kZVBvaW50KSxyZXMucHVzaChjb2RlUG9pbnQpLGkrPWJ5dGVzUGVyU2VxdWVuY2V9cmV0dXJuIGZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheShjb2RlUG9pbnRzKXt2YXIgbGVuPWNvZGVQb2ludHMubGVuZ3RoO2lmKGxlbjw9NDA5NilyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsY29kZVBvaW50cyk7dmFyIHJlcz0iIixpPTA7Zm9yKDtpPGxlbjspcmVzKz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxjb2RlUG9pbnRzLnNsaWNlKGksaSs9NDA5NikpO3JldHVybiByZXN9KHJlcyl9ZXhwb3J0cy5rTWF4TGVuZ3RoPTIxNDc0ODM2NDcsQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQ9ZnVuY3Rpb24gdHlwZWRBcnJheVN1cHBvcnQoKXt0cnl7dmFyIGFycj1uZXcgVWludDhBcnJheSgxKSxwcm90bz17Zm9vOmZ1bmN0aW9uKCl7cmV0dXJuIDQyfX07cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZihwcm90byxVaW50OEFycmF5LnByb3RvdHlwZSksT2JqZWN0LnNldFByb3RvdHlwZU9mKGFycixwcm90byksNDI9PT1hcnIuZm9vKCl9Y2F0Y2goZSl7cmV0dXJuITF9fSgpLEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUfHwidW5kZWZpbmVkIj09dHlwZW9mIGNvbnNvbGV8fCJmdW5jdGlvbiIhPXR5cGVvZiBjb25zb2xlLmVycm9yfHxjb25zb2xlLmVycm9yKCJUaGlzIGJyb3dzZXIgbGFja3MgdHlwZWQgYXJyYXkgKFVpbnQ4QXJyYXkpIHN1cHBvcnQgd2hpY2ggaXMgcmVxdWlyZWQgYnkgYGJ1ZmZlcmAgdjUueC4gVXNlIGBidWZmZXJgIHY0LnggaWYgeW91IHJlcXVpcmUgb2xkIGJyb3dzZXIgc3VwcG9ydC4iKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLnByb3RvdHlwZSwicGFyZW50Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtpZihCdWZmZXIuaXNCdWZmZXIodGhpcykpcmV0dXJuIHRoaXMuYnVmZmVyfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIucHJvdG90eXBlLCJvZmZzZXQiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2lmKEJ1ZmZlci5pc0J1ZmZlcih0aGlzKSlyZXR1cm4gdGhpcy5ieXRlT2Zmc2V0fX0pLEJ1ZmZlci5wb29sU2l6ZT04MTkyLEJ1ZmZlci5mcm9tPWZ1bmN0aW9uKHZhbHVlLGVuY29kaW5nT3JPZmZzZXQsbGVuZ3RoKXtyZXR1cm4gZnJvbSh2YWx1ZSxlbmNvZGluZ09yT2Zmc2V0LGxlbmd0aCl9LE9iamVjdC5zZXRQcm90b3R5cGVPZihCdWZmZXIucHJvdG90eXBlLFVpbnQ4QXJyYXkucHJvdG90eXBlKSxPYmplY3Quc2V0UHJvdG90eXBlT2YoQnVmZmVyLFVpbnQ4QXJyYXkpLEJ1ZmZlci5hbGxvYz1mdW5jdGlvbihzaXplLGZpbGwsZW5jb2Rpbmcpe3JldHVybiBmdW5jdGlvbiBhbGxvYyhzaXplLGZpbGwsZW5jb2Rpbmcpe3JldHVybiBhc3NlcnRTaXplKHNpemUpLHNpemU8PTA/Y3JlYXRlQnVmZmVyKHNpemUpOnZvaWQgMCE9PWZpbGw/InN0cmluZyI9PXR5cGVvZiBlbmNvZGluZz9jcmVhdGVCdWZmZXIoc2l6ZSkuZmlsbChmaWxsLGVuY29kaW5nKTpjcmVhdGVCdWZmZXIoc2l6ZSkuZmlsbChmaWxsKTpjcmVhdGVCdWZmZXIoc2l6ZSl9KHNpemUsZmlsbCxlbmNvZGluZyl9LEJ1ZmZlci5hbGxvY1Vuc2FmZT1mdW5jdGlvbihzaXplKXtyZXR1cm4gYWxsb2NVbnNhZmUoc2l6ZSl9LEJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24oc2l6ZSl7cmV0dXJuIGFsbG9jVW5zYWZlKHNpemUpfSxCdWZmZXIuaXNCdWZmZXI9ZnVuY3Rpb24gaXNCdWZmZXIoYil7cmV0dXJuIG51bGwhPWImJiEwPT09Yi5faXNCdWZmZXImJmIhPT1CdWZmZXIucHJvdG90eXBlfSxCdWZmZXIuY29tcGFyZT1mdW5jdGlvbiBjb21wYXJlKGEsYil7aWYoaXNJbnN0YW5jZShhLFVpbnQ4QXJyYXkpJiYoYT1CdWZmZXIuZnJvbShhLGEub2Zmc2V0LGEuYnl0ZUxlbmd0aCkpLGlzSW5zdGFuY2UoYixVaW50OEFycmF5KSYmKGI9QnVmZmVyLmZyb20oYixiLm9mZnNldCxiLmJ5dGVMZW5ndGgpKSwhQnVmZmVyLmlzQnVmZmVyKGEpfHwhQnVmZmVyLmlzQnVmZmVyKGIpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSAiYnVmMSIsICJidWYyIiBhcmd1bWVudHMgbXVzdCBiZSBvbmUgb2YgdHlwZSBCdWZmZXIgb3IgVWludDhBcnJheScpO2lmKGE9PT1iKXJldHVybiAwO2Zvcih2YXIgeD1hLmxlbmd0aCx5PWIubGVuZ3RoLGk9MCxsZW49TWF0aC5taW4oeCx5KTtpPGxlbjsrK2kpaWYoYVtpXSE9PWJbaV0pe3g9YVtpXSx5PWJbaV07YnJlYWt9cmV0dXJuIHg8eT8tMTp5PHg/MTowfSxCdWZmZXIuaXNFbmNvZGluZz1mdW5jdGlvbiBpc0VuY29kaW5nKGVuY29kaW5nKXtzd2l0Y2goU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKXtjYXNlImhleCI6Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19LEJ1ZmZlci5jb25jYXQ9ZnVuY3Rpb24gY29uY2F0KGxpc3QsbGVuZ3RoKXtpZighQXJyYXkuaXNBcnJheShsaXN0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7aWYoMD09PWxpc3QubGVuZ3RoKXJldHVybiBCdWZmZXIuYWxsb2MoMCk7dmFyIGk7aWYodm9pZCAwPT09bGVuZ3RoKWZvcihsZW5ndGg9MCxpPTA7aTxsaXN0Lmxlbmd0aDsrK2kpbGVuZ3RoKz1saXN0W2ldLmxlbmd0aDt2YXIgYnVmZmVyPUJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpLHBvcz0wO2ZvcihpPTA7aTxsaXN0Lmxlbmd0aDsrK2kpe3ZhciBidWY9bGlzdFtpXTtpZihpc0luc3RhbmNlKGJ1ZixVaW50OEFycmF5KSlwb3MrYnVmLmxlbmd0aD5idWZmZXIubGVuZ3RoP0J1ZmZlci5mcm9tKGJ1ZikuY29weShidWZmZXIscG9zKTpVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChidWZmZXIsYnVmLHBvcyk7ZWxzZXtpZighQnVmZmVyLmlzQnVmZmVyKGJ1ZikpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2J1Zi5jb3B5KGJ1ZmZlcixwb3MpfXBvcys9YnVmLmxlbmd0aH1yZXR1cm4gYnVmZmVyfSxCdWZmZXIuYnl0ZUxlbmd0aD1ieXRlTGVuZ3RoLEJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyPSEwLEJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2PWZ1bmN0aW9uIHN3YXAxNigpe3ZhciBsZW49dGhpcy5sZW5ndGg7aWYobGVuJTIhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzIik7Zm9yKHZhciBpPTA7aTxsZW47aSs9Milzd2FwKHRoaXMsaSxpKzEpO3JldHVybiB0aGlzfSxCdWZmZXIucHJvdG90eXBlLnN3YXAzMj1mdW5jdGlvbiBzd2FwMzIoKXt2YXIgbGVuPXRoaXMubGVuZ3RoO2lmKGxlbiU0IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cyIpO2Zvcih2YXIgaT0wO2k8bGVuO2krPTQpc3dhcCh0aGlzLGksaSszKSxzd2FwKHRoaXMsaSsxLGkrMik7cmV0dXJuIHRoaXN9LEJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0PWZ1bmN0aW9uIHN3YXA2NCgpe3ZhciBsZW49dGhpcy5sZW5ndGg7aWYobGVuJTghPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzIik7Zm9yKHZhciBpPTA7aTxsZW47aSs9OClzd2FwKHRoaXMsaSxpKzcpLHN3YXAodGhpcyxpKzEsaSs2KSxzd2FwKHRoaXMsaSsyLGkrNSksc3dhcCh0aGlzLGkrMyxpKzQpO3JldHVybiB0aGlzfSxCdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uIHRvU3RyaW5nKCl7dmFyIGxlbmd0aD10aGlzLmxlbmd0aDtyZXR1cm4gMD09PWxlbmd0aD8iIjowPT09YXJndW1lbnRzLmxlbmd0aD91dGY4U2xpY2UodGhpcywwLGxlbmd0aCk6c2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sQnVmZmVyLnByb3RvdHlwZS50b0xvY2FsZVN0cmluZz1CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nLEJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uIGVxdWFscyhiKXtpZighQnVmZmVyLmlzQnVmZmVyKGIpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtyZXR1cm4gdGhpcz09PWJ8fDA9PT1CdWZmZXIuY29tcGFyZSh0aGlzLGIpfSxCdWZmZXIucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24gaW5zcGVjdCgpe3ZhciBzdHI9IiIsbWF4PWV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVM7cmV0dXJuIHN0cj10aGlzLnRvU3RyaW5nKCJoZXgiLDAsbWF4KS5yZXBsYWNlKC8oLnsyfSkvZywiJDEgIikudHJpbSgpLHRoaXMubGVuZ3RoPm1heCYmKHN0cis9IiAuLi4gIiksIjxCdWZmZXIgIitzdHIrIj4ifSxjdXN0b21JbnNwZWN0U3ltYm9sJiYoQnVmZmVyLnByb3RvdHlwZVtjdXN0b21JbnNwZWN0U3ltYm9sXT1CdWZmZXIucHJvdG90eXBlLmluc3BlY3QpLEJ1ZmZlci5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbiBjb21wYXJlKHRhcmdldCxzdGFydCxlbmQsdGhpc1N0YXJ0LHRoaXNFbmQpe2lmKGlzSW5zdGFuY2UodGFyZ2V0LFVpbnQ4QXJyYXkpJiYodGFyZ2V0PUJ1ZmZlci5mcm9tKHRhcmdldCx0YXJnZXQub2Zmc2V0LHRhcmdldC5ieXRlTGVuZ3RoKSksIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSAidGFyZ2V0IiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5LiBSZWNlaXZlZCB0eXBlICcrdHlwZW9mIHRhcmdldCk7aWYodm9pZCAwPT09c3RhcnQmJihzdGFydD0wKSx2b2lkIDA9PT1lbmQmJihlbmQ9dGFyZ2V0P3RhcmdldC5sZW5ndGg6MCksdm9pZCAwPT09dGhpc1N0YXJ0JiYodGhpc1N0YXJ0PTApLHZvaWQgMD09PXRoaXNFbmQmJih0aGlzRW5kPXRoaXMubGVuZ3RoKSxzdGFydDwwfHxlbmQ+dGFyZ2V0Lmxlbmd0aHx8dGhpc1N0YXJ0PDB8fHRoaXNFbmQ+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm91dCBvZiByYW5nZSBpbmRleCIpO2lmKHRoaXNTdGFydD49dGhpc0VuZCYmc3RhcnQ+PWVuZClyZXR1cm4gMDtpZih0aGlzU3RhcnQ+PXRoaXNFbmQpcmV0dXJuLTE7aWYoc3RhcnQ+PWVuZClyZXR1cm4gMTtpZih0aGlzPT09dGFyZ2V0KXJldHVybiAwO2Zvcih2YXIgeD0odGhpc0VuZD4+Pj0wKS0odGhpc1N0YXJ0Pj4+PTApLHk9KGVuZD4+Pj0wKS0oc3RhcnQ+Pj49MCksbGVuPU1hdGgubWluKHgseSksdGhpc0NvcHk9dGhpcy5zbGljZSh0aGlzU3RhcnQsdGhpc0VuZCksdGFyZ2V0Q29weT10YXJnZXQuc2xpY2Uoc3RhcnQsZW5kKSxpPTA7aTxsZW47KytpKWlmKHRoaXNDb3B5W2ldIT09dGFyZ2V0Q29weVtpXSl7eD10aGlzQ29weVtpXSx5PXRhcmdldENvcHlbaV07YnJlYWt9cmV0dXJuIHg8eT8tMTp5PHg/MTowfSxCdWZmZXIucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uIGluY2x1ZGVzKHZhbCxieXRlT2Zmc2V0LGVuY29kaW5nKXtyZXR1cm4tMSE9PXRoaXMuaW5kZXhPZih2YWwsYnl0ZU9mZnNldCxlbmNvZGluZyl9LEJ1ZmZlci5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbiBpbmRleE9mKHZhbCxieXRlT2Zmc2V0LGVuY29kaW5nKXtyZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcyx2YWwsYnl0ZU9mZnNldCxlbmNvZGluZywhMCl9LEJ1ZmZlci5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24gbGFzdEluZGV4T2YodmFsLGJ5dGVPZmZzZXQsZW5jb2Rpbmcpe3JldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLHZhbCxieXRlT2Zmc2V0LGVuY29kaW5nLCExKX0sQnVmZmVyLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbiB3cml0ZShzdHJpbmcsb2Zmc2V0LGxlbmd0aCxlbmNvZGluZyl7aWYodm9pZCAwPT09b2Zmc2V0KWVuY29kaW5nPSJ1dGY4IixsZW5ndGg9dGhpcy5sZW5ndGgsb2Zmc2V0PTA7ZWxzZSBpZih2b2lkIDA9PT1sZW5ndGgmJiJzdHJpbmciPT10eXBlb2Ygb2Zmc2V0KWVuY29kaW5nPW9mZnNldCxsZW5ndGg9dGhpcy5sZW5ndGgsb2Zmc2V0PTA7ZWxzZXtpZighaXNGaW5pdGUob2Zmc2V0KSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7b2Zmc2V0Pj4+PTAsaXNGaW5pdGUobGVuZ3RoKT8obGVuZ3RoPj4+PTAsdm9pZCAwPT09ZW5jb2RpbmcmJihlbmNvZGluZz0idXRmOCIpKTooZW5jb2Rpbmc9bGVuZ3RoLGxlbmd0aD12b2lkIDApfXZhciByZW1haW5pbmc9dGhpcy5sZW5ndGgtb2Zmc2V0O2lmKCh2b2lkIDA9PT1sZW5ndGh8fGxlbmd0aD5yZW1haW5pbmcpJiYobGVuZ3RoPXJlbWFpbmluZyksc3RyaW5nLmxlbmd0aD4wJiYobGVuZ3RoPDB8fG9mZnNldDwwKXx8b2Zmc2V0PnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO2VuY29kaW5nfHwoZW5jb2Rpbmc9InV0ZjgiKTtmb3IodmFyIGxvd2VyZWRDYXNlPSExOzspc3dpdGNoKGVuY29kaW5nKXtjYXNlImhleCI6cmV0dXJuIGhleFdyaXRlKHRoaXMsc3RyaW5nLG9mZnNldCxsZW5ndGgpO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIHV0ZjhXcml0ZSh0aGlzLHN0cmluZyxvZmZzZXQsbGVuZ3RoKTtjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBhc2NpaVdyaXRlKHRoaXMsc3RyaW5nLG9mZnNldCxsZW5ndGgpO2Nhc2UiYmFzZTY0IjpyZXR1cm4gYmFzZTY0V3JpdGUodGhpcyxzdHJpbmcsb2Zmc2V0LGxlbmd0aCk7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiB1Y3MyV3JpdGUodGhpcyxzdHJpbmcsb2Zmc2V0LGxlbmd0aCk7ZGVmYXVsdDppZihsb3dlcmVkQ2FzZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK2VuY29kaW5nKTtlbmNvZGluZz0oIiIrZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCksbG93ZXJlZENhc2U9ITB9fSxCdWZmZXIucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbiB0b0pTT04oKXtyZXR1cm57dHlwZToiQnVmZmVyIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19O2Z1bmN0aW9uIGFzY2lpU2xpY2UoYnVmLHN0YXJ0LGVuZCl7dmFyIHJldD0iIjtlbmQ9TWF0aC5taW4oYnVmLmxlbmd0aCxlbmQpO2Zvcih2YXIgaT1zdGFydDtpPGVuZDsrK2kpcmV0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyNyZidWZbaV0pO3JldHVybiByZXR9ZnVuY3Rpb24gbGF0aW4xU2xpY2UoYnVmLHN0YXJ0LGVuZCl7dmFyIHJldD0iIjtlbmQ9TWF0aC5taW4oYnVmLmxlbmd0aCxlbmQpO2Zvcih2YXIgaT1zdGFydDtpPGVuZDsrK2kpcmV0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSk7cmV0dXJuIHJldH1mdW5jdGlvbiBoZXhTbGljZShidWYsc3RhcnQsZW5kKXt2YXIgbGVuPWJ1Zi5sZW5ndGg7KCFzdGFydHx8c3RhcnQ8MCkmJihzdGFydD0wKSwoIWVuZHx8ZW5kPDB8fGVuZD5sZW4pJiYoZW5kPWxlbik7Zm9yKHZhciBvdXQ9IiIsaT1zdGFydDtpPGVuZDsrK2kpb3V0Kz1oZXhTbGljZUxvb2t1cFRhYmxlW2J1ZltpXV07cmV0dXJuIG91dH1mdW5jdGlvbiB1dGYxNmxlU2xpY2UoYnVmLHN0YXJ0LGVuZCl7Zm9yKHZhciBieXRlcz1idWYuc2xpY2Uoc3RhcnQsZW5kKSxyZXM9IiIsaT0wO2k8Ynl0ZXMubGVuZ3RoLTE7aSs9MilyZXMrPVN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0rMjU2KmJ5dGVzW2krMV0pO3JldHVybiByZXN9ZnVuY3Rpb24gY2hlY2tPZmZzZXQob2Zmc2V0LGV4dCxsZW5ndGgpe2lmKG9mZnNldCUxIT0wfHxvZmZzZXQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib2Zmc2V0IGlzIG5vdCB1aW50Iik7aWYob2Zmc2V0K2V4dD5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlRyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgiKX1mdW5jdGlvbiBjaGVja0ludChidWYsdmFsdWUsb2Zmc2V0LGV4dCxtYXgsbWluKXtpZighQnVmZmVyLmlzQnVmZmVyKGJ1ZikpdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKHZhbHVlPm1heHx8dmFsdWU8bWluKXRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZihvZmZzZXQrZXh0PmJ1Zi5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIGNoZWNrSUVFRTc1NChidWYsdmFsdWUsb2Zmc2V0LGV4dCxtYXgsbWluKXtpZihvZmZzZXQrZXh0PmJ1Zi5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpO2lmKG9mZnNldDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiB3cml0ZUZsb2F0KGJ1Zix2YWx1ZSxvZmZzZXQsbGl0dGxlRW5kaWFuLG5vQXNzZXJ0KXtyZXR1cm4gdmFsdWU9K3ZhbHVlLG9mZnNldD4+Pj0wLG5vQXNzZXJ0fHxjaGVja0lFRUU3NTQoYnVmLDAsb2Zmc2V0LDQpLGllZWU3NTQud3JpdGUoYnVmLHZhbHVlLG9mZnNldCxsaXR0bGVFbmRpYW4sMjMsNCksb2Zmc2V0KzR9ZnVuY3Rpb24gd3JpdGVEb3VibGUoYnVmLHZhbHVlLG9mZnNldCxsaXR0bGVFbmRpYW4sbm9Bc3NlcnQpe3JldHVybiB2YWx1ZT0rdmFsdWUsb2Zmc2V0Pj4+PTAsbm9Bc3NlcnR8fGNoZWNrSUVFRTc1NChidWYsMCxvZmZzZXQsOCksaWVlZTc1NC53cml0ZShidWYsdmFsdWUsb2Zmc2V0LGxpdHRsZUVuZGlhbiw1Miw4KSxvZmZzZXQrOH1CdWZmZXIucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uIHNsaWNlKHN0YXJ0LGVuZCl7dmFyIGxlbj10aGlzLmxlbmd0aDsoc3RhcnQ9fn5zdGFydCk8MD8oc3RhcnQrPWxlbik8MCYmKHN0YXJ0PTApOnN0YXJ0PmxlbiYmKHN0YXJ0PWxlbiksKGVuZD12b2lkIDA9PT1lbmQ/bGVuOn5+ZW5kKTwwPyhlbmQrPWxlbik8MCYmKGVuZD0wKTplbmQ+bGVuJiYoZW5kPWxlbiksZW5kPHN0YXJ0JiYoZW5kPXN0YXJ0KTt2YXIgbmV3QnVmPXRoaXMuc3ViYXJyYXkoc3RhcnQsZW5kKTtyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKG5ld0J1ZixCdWZmZXIucHJvdG90eXBlKSxuZXdCdWZ9LEJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnRMRT1CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEU9ZnVuY3Rpb24gcmVhZFVJbnRMRShvZmZzZXQsYnl0ZUxlbmd0aCxub0Fzc2VydCl7b2Zmc2V0Pj4+PTAsYnl0ZUxlbmd0aD4+Pj0wLG5vQXNzZXJ0fHxjaGVja09mZnNldChvZmZzZXQsYnl0ZUxlbmd0aCx0aGlzLmxlbmd0aCk7Zm9yKHZhciB2YWw9dGhpc1tvZmZzZXRdLG11bD0xLGk9MDsrK2k8Ynl0ZUxlbmd0aCYmKG11bCo9MjU2KTspdmFsKz10aGlzW29mZnNldCtpXSptdWw7cmV0dXJuIHZhbH0sQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludEJFPUJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRT1mdW5jdGlvbiByZWFkVUludEJFKG9mZnNldCxieXRlTGVuZ3RoLG5vQXNzZXJ0KXtvZmZzZXQ+Pj49MCxieXRlTGVuZ3RoPj4+PTAsbm9Bc3NlcnR8fGNoZWNrT2Zmc2V0KG9mZnNldCxieXRlTGVuZ3RoLHRoaXMubGVuZ3RoKTtmb3IodmFyIHZhbD10aGlzW29mZnNldCstLWJ5dGVMZW5ndGhdLG11bD0xO2J5dGVMZW5ndGg+MCYmKG11bCo9MjU2KTspdmFsKz10aGlzW29mZnNldCstLWJ5dGVMZW5ndGhdKm11bDtyZXR1cm4gdmFsfSxCdWZmZXIucHJvdG90eXBlLnJlYWRVaW50OD1CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbiByZWFkVUludDgob2Zmc2V0LG5vQXNzZXJ0KXtyZXR1cm4gb2Zmc2V0Pj4+PTAsbm9Bc3NlcnR8fGNoZWNrT2Zmc2V0KG9mZnNldCwxLHRoaXMubGVuZ3RoKSx0aGlzW29mZnNldF19LEJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQxNkxFPUJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uIHJlYWRVSW50MTZMRShvZmZzZXQsbm9Bc3NlcnQpe3JldHVybiBvZmZzZXQ+Pj49MCxub0Fzc2VydHx8Y2hlY2tPZmZzZXQob2Zmc2V0LDIsdGhpcy5sZW5ndGgpLHRoaXNbb2Zmc2V0XXx0aGlzW29mZnNldCsxXTw8OH0sQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludDE2QkU9QnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkU9ZnVuY3Rpb24gcmVhZFVJbnQxNkJFKG9mZnNldCxub0Fzc2VydCl7cmV0dXJuIG9mZnNldD4+Pj0wLG5vQXNzZXJ0fHxjaGVja09mZnNldChvZmZzZXQsMix0aGlzLmxlbmd0aCksdGhpc1tvZmZzZXRdPDw4fHRoaXNbb2Zmc2V0KzFdfSxCdWZmZXIucHJvdG90eXBlLnJlYWRVaW50MzJMRT1CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRT1mdW5jdGlvbiByZWFkVUludDMyTEUob2Zmc2V0LG5vQXNzZXJ0KXtyZXR1cm4gb2Zmc2V0Pj4+PTAsbm9Bc3NlcnR8fGNoZWNrT2Zmc2V0KG9mZnNldCw0LHRoaXMubGVuZ3RoKSwodGhpc1tvZmZzZXRdfHRoaXNbb2Zmc2V0KzFdPDw4fHRoaXNbb2Zmc2V0KzJdPDwxNikrMTY3NzcyMTYqdGhpc1tvZmZzZXQrM119LEJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQzMkJFPUJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFPWZ1bmN0aW9uIHJlYWRVSW50MzJCRShvZmZzZXQsbm9Bc3NlcnQpe3JldHVybiBvZmZzZXQ+Pj49MCxub0Fzc2VydHx8Y2hlY2tPZmZzZXQob2Zmc2V0LDQsdGhpcy5sZW5ndGgpLDE2Nzc3MjE2KnRoaXNbb2Zmc2V0XSsodGhpc1tvZmZzZXQrMV08PDE2fHRoaXNbb2Zmc2V0KzJdPDw4fHRoaXNbb2Zmc2V0KzNdKX0sQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEU9ZnVuY3Rpb24gcmVhZEludExFKG9mZnNldCxieXRlTGVuZ3RoLG5vQXNzZXJ0KXtvZmZzZXQ+Pj49MCxieXRlTGVuZ3RoPj4+PTAsbm9Bc3NlcnR8fGNoZWNrT2Zmc2V0KG9mZnNldCxieXRlTGVuZ3RoLHRoaXMubGVuZ3RoKTtmb3IodmFyIHZhbD10aGlzW29mZnNldF0sbXVsPTEsaT0wOysraTxieXRlTGVuZ3RoJiYobXVsKj0yNTYpOyl2YWwrPXRoaXNbb2Zmc2V0K2ldKm11bDtyZXR1cm4gdmFsPj0obXVsKj0xMjgpJiYodmFsLT1NYXRoLnBvdygyLDgqYnl0ZUxlbmd0aCkpLHZhbH0sQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24gcmVhZEludEJFKG9mZnNldCxieXRlTGVuZ3RoLG5vQXNzZXJ0KXtvZmZzZXQ+Pj49MCxieXRlTGVuZ3RoPj4+PTAsbm9Bc3NlcnR8fGNoZWNrT2Zmc2V0KG9mZnNldCxieXRlTGVuZ3RoLHRoaXMubGVuZ3RoKTtmb3IodmFyIGk9Ynl0ZUxlbmd0aCxtdWw9MSx2YWw9dGhpc1tvZmZzZXQrLS1pXTtpPjAmJihtdWwqPTI1Nik7KXZhbCs9dGhpc1tvZmZzZXQrLS1pXSptdWw7cmV0dXJuIHZhbD49KG11bCo9MTI4KSYmKHZhbC09TWF0aC5wb3coMiw4KmJ5dGVMZW5ndGgpKSx2YWx9LEJ1ZmZlci5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24gcmVhZEludDgob2Zmc2V0LG5vQXNzZXJ0KXtyZXR1cm4gb2Zmc2V0Pj4+PTAsbm9Bc3NlcnR8fGNoZWNrT2Zmc2V0KG9mZnNldCwxLHRoaXMubGVuZ3RoKSwxMjgmdGhpc1tvZmZzZXRdPy0xKigyNTUtdGhpc1tvZmZzZXRdKzEpOnRoaXNbb2Zmc2V0XX0sQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbiByZWFkSW50MTZMRShvZmZzZXQsbm9Bc3NlcnQpe29mZnNldD4+Pj0wLG5vQXNzZXJ0fHxjaGVja09mZnNldChvZmZzZXQsMix0aGlzLmxlbmd0aCk7dmFyIHZhbD10aGlzW29mZnNldF18dGhpc1tvZmZzZXQrMV08PDg7cmV0dXJuIDMyNzY4JnZhbD80Mjk0OTAxNzYwfHZhbDp2YWx9LEJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkU9ZnVuY3Rpb24gcmVhZEludDE2QkUob2Zmc2V0LG5vQXNzZXJ0KXtvZmZzZXQ+Pj49MCxub0Fzc2VydHx8Y2hlY2tPZmZzZXQob2Zmc2V0LDIsdGhpcy5sZW5ndGgpO3ZhciB2YWw9dGhpc1tvZmZzZXQrMV18dGhpc1tvZmZzZXRdPDw4O3JldHVybiAzMjc2OCZ2YWw/NDI5NDkwMTc2MHx2YWw6dmFsfSxCdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uIHJlYWRJbnQzMkxFKG9mZnNldCxub0Fzc2VydCl7cmV0dXJuIG9mZnNldD4+Pj0wLG5vQXNzZXJ0fHxjaGVja09mZnNldChvZmZzZXQsNCx0aGlzLmxlbmd0aCksdGhpc1tvZmZzZXRdfHRoaXNbb2Zmc2V0KzFdPDw4fHRoaXNbb2Zmc2V0KzJdPDwxNnx0aGlzW29mZnNldCszXTw8MjR9LEJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24gcmVhZEludDMyQkUob2Zmc2V0LG5vQXNzZXJ0KXtyZXR1cm4gb2Zmc2V0Pj4+PTAsbm9Bc3NlcnR8fGNoZWNrT2Zmc2V0KG9mZnNldCw0LHRoaXMubGVuZ3RoKSx0aGlzW29mZnNldF08PDI0fHRoaXNbb2Zmc2V0KzFdPDwxNnx0aGlzW29mZnNldCsyXTw8OHx0aGlzW29mZnNldCszXX0sQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbiByZWFkRmxvYXRMRShvZmZzZXQsbm9Bc3NlcnQpe3JldHVybiBvZmZzZXQ+Pj49MCxub0Fzc2VydHx8Y2hlY2tPZmZzZXQob2Zmc2V0LDQsdGhpcy5sZW5ndGgpLGllZWU3NTQucmVhZCh0aGlzLG9mZnNldCwhMCwyMyw0KX0sQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRT1mdW5jdGlvbiByZWFkRmxvYXRCRShvZmZzZXQsbm9Bc3NlcnQpe3JldHVybiBvZmZzZXQ+Pj49MCxub0Fzc2VydHx8Y2hlY2tPZmZzZXQob2Zmc2V0LDQsdGhpcy5sZW5ndGgpLGllZWU3NTQucmVhZCh0aGlzLG9mZnNldCwhMSwyMyw0KX0sQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEU9ZnVuY3Rpb24gcmVhZERvdWJsZUxFKG9mZnNldCxub0Fzc2VydCl7cmV0dXJuIG9mZnNldD4+Pj0wLG5vQXNzZXJ0fHxjaGVja09mZnNldChvZmZzZXQsOCx0aGlzLmxlbmd0aCksaWVlZTc1NC5yZWFkKHRoaXMsb2Zmc2V0LCEwLDUyLDgpfSxCdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRT1mdW5jdGlvbiByZWFkRG91YmxlQkUob2Zmc2V0LG5vQXNzZXJ0KXtyZXR1cm4gb2Zmc2V0Pj4+PTAsbm9Bc3NlcnR8fGNoZWNrT2Zmc2V0KG9mZnNldCw4LHRoaXMubGVuZ3RoKSxpZWVlNzU0LnJlYWQodGhpcyxvZmZzZXQsITEsNTIsOCl9LEJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50TEU9QnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRT1mdW5jdGlvbiB3cml0ZVVJbnRMRSh2YWx1ZSxvZmZzZXQsYnl0ZUxlbmd0aCxub0Fzc2VydCl7KHZhbHVlPSt2YWx1ZSxvZmZzZXQ+Pj49MCxieXRlTGVuZ3RoPj4+PTAsbm9Bc3NlcnQpfHxjaGVja0ludCh0aGlzLHZhbHVlLG9mZnNldCxieXRlTGVuZ3RoLE1hdGgucG93KDIsOCpieXRlTGVuZ3RoKS0xLDApO3ZhciBtdWw9MSxpPTA7Zm9yKHRoaXNbb2Zmc2V0XT0yNTUmdmFsdWU7KytpPGJ5dGVMZW5ndGgmJihtdWwqPTI1Nik7KXRoaXNbb2Zmc2V0K2ldPXZhbHVlL211bCYyNTU7cmV0dXJuIG9mZnNldCtieXRlTGVuZ3RofSxCdWZmZXIucHJvdG90eXBlLndyaXRlVWludEJFPUJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkU9ZnVuY3Rpb24gd3JpdGVVSW50QkUodmFsdWUsb2Zmc2V0LGJ5dGVMZW5ndGgsbm9Bc3NlcnQpeyh2YWx1ZT0rdmFsdWUsb2Zmc2V0Pj4+PTAsYnl0ZUxlbmd0aD4+Pj0wLG5vQXNzZXJ0KXx8Y2hlY2tJbnQodGhpcyx2YWx1ZSxvZmZzZXQsYnl0ZUxlbmd0aCxNYXRoLnBvdygyLDgqYnl0ZUxlbmd0aCktMSwwKTt2YXIgaT1ieXRlTGVuZ3RoLTEsbXVsPTE7Zm9yKHRoaXNbb2Zmc2V0K2ldPTI1NSZ2YWx1ZTstLWk+PTAmJihtdWwqPTI1Nik7KXRoaXNbb2Zmc2V0K2ldPXZhbHVlL211bCYyNTU7cmV0dXJuIG9mZnNldCtieXRlTGVuZ3RofSxCdWZmZXIucHJvdG90eXBlLndyaXRlVWludDg9QnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4PWZ1bmN0aW9uIHdyaXRlVUludDgodmFsdWUsb2Zmc2V0LG5vQXNzZXJ0KXtyZXR1cm4gdmFsdWU9K3ZhbHVlLG9mZnNldD4+Pj0wLG5vQXNzZXJ0fHxjaGVja0ludCh0aGlzLHZhbHVlLG9mZnNldCwxLDI1NSwwKSx0aGlzW29mZnNldF09MjU1JnZhbHVlLG9mZnNldCsxfSxCdWZmZXIucHJvdG90eXBlLndyaXRlVWludDE2TEU9QnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uIHdyaXRlVUludDE2TEUodmFsdWUsb2Zmc2V0LG5vQXNzZXJ0KXtyZXR1cm4gdmFsdWU9K3ZhbHVlLG9mZnNldD4+Pj0wLG5vQXNzZXJ0fHxjaGVja0ludCh0aGlzLHZhbHVlLG9mZnNldCwyLDY1NTM1LDApLHRoaXNbb2Zmc2V0XT0yNTUmdmFsdWUsdGhpc1tvZmZzZXQrMV09dmFsdWU+Pj44LG9mZnNldCsyfSxCdWZmZXIucHJvdG90eXBlLndyaXRlVWludDE2QkU9QnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uIHdyaXRlVUludDE2QkUodmFsdWUsb2Zmc2V0LG5vQXNzZXJ0KXtyZXR1cm4gdmFsdWU9K3ZhbHVlLG9mZnNldD4+Pj0wLG5vQXNzZXJ0fHxjaGVja0ludCh0aGlzLHZhbHVlLG9mZnNldCwyLDY1NTM1LDApLHRoaXNbb2Zmc2V0XT12YWx1ZT4+PjgsdGhpc1tvZmZzZXQrMV09MjU1JnZhbHVlLG9mZnNldCsyfSxCdWZmZXIucHJvdG90eXBlLndyaXRlVWludDMyTEU9QnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFPWZ1bmN0aW9uIHdyaXRlVUludDMyTEUodmFsdWUsb2Zmc2V0LG5vQXNzZXJ0KXtyZXR1cm4gdmFsdWU9K3ZhbHVlLG9mZnNldD4+Pj0wLG5vQXNzZXJ0fHxjaGVja0ludCh0aGlzLHZhbHVlLG9mZnNldCw0LDQyOTQ5NjcyOTUsMCksdGhpc1tvZmZzZXQrM109dmFsdWU+Pj4yNCx0aGlzW29mZnNldCsyXT12YWx1ZT4+PjE2LHRoaXNbb2Zmc2V0KzFdPXZhbHVlPj4+OCx0aGlzW29mZnNldF09MjU1JnZhbHVlLG9mZnNldCs0fSxCdWZmZXIucHJvdG90eXBlLndyaXRlVWludDMyQkU9QnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uIHdyaXRlVUludDMyQkUodmFsdWUsb2Zmc2V0LG5vQXNzZXJ0KXtyZXR1cm4gdmFsdWU9K3ZhbHVlLG9mZnNldD4+Pj0wLG5vQXNzZXJ0fHxjaGVja0ludCh0aGlzLHZhbHVlLG9mZnNldCw0LDQyOTQ5NjcyOTUsMCksdGhpc1tvZmZzZXRdPXZhbHVlPj4+MjQsdGhpc1tvZmZzZXQrMV09dmFsdWU+Pj4xNix0aGlzW29mZnNldCsyXT12YWx1ZT4+PjgsdGhpc1tvZmZzZXQrM109MjU1JnZhbHVlLG9mZnNldCs0fSxCdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEU9ZnVuY3Rpb24gd3JpdGVJbnRMRSh2YWx1ZSxvZmZzZXQsYnl0ZUxlbmd0aCxub0Fzc2VydCl7aWYodmFsdWU9K3ZhbHVlLG9mZnNldD4+Pj0wLCFub0Fzc2VydCl7dmFyIGxpbWl0PU1hdGgucG93KDIsOCpieXRlTGVuZ3RoLTEpO2NoZWNrSW50KHRoaXMsdmFsdWUsb2Zmc2V0LGJ5dGVMZW5ndGgsbGltaXQtMSwtbGltaXQpfXZhciBpPTAsbXVsPTEsc3ViPTA7Zm9yKHRoaXNbb2Zmc2V0XT0yNTUmdmFsdWU7KytpPGJ5dGVMZW5ndGgmJihtdWwqPTI1Nik7KXZhbHVlPDAmJjA9PT1zdWImJjAhPT10aGlzW29mZnNldCtpLTFdJiYoc3ViPTEpLHRoaXNbb2Zmc2V0K2ldPSh2YWx1ZS9tdWx8MCktc3ViJjI1NTtyZXR1cm4gb2Zmc2V0K2J5dGVMZW5ndGh9LEJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRT1mdW5jdGlvbiB3cml0ZUludEJFKHZhbHVlLG9mZnNldCxieXRlTGVuZ3RoLG5vQXNzZXJ0KXtpZih2YWx1ZT0rdmFsdWUsb2Zmc2V0Pj4+PTAsIW5vQXNzZXJ0KXt2YXIgbGltaXQ9TWF0aC5wb3coMiw4KmJ5dGVMZW5ndGgtMSk7Y2hlY2tJbnQodGhpcyx2YWx1ZSxvZmZzZXQsYnl0ZUxlbmd0aCxsaW1pdC0xLC1saW1pdCl9dmFyIGk9Ynl0ZUxlbmd0aC0xLG11bD0xLHN1Yj0wO2Zvcih0aGlzW29mZnNldCtpXT0yNTUmdmFsdWU7LS1pPj0wJiYobXVsKj0yNTYpOyl2YWx1ZTwwJiYwPT09c3ViJiYwIT09dGhpc1tvZmZzZXQraSsxXSYmKHN1Yj0xKSx0aGlzW29mZnNldCtpXT0odmFsdWUvbXVsfDApLXN1YiYyNTU7cmV0dXJuIG9mZnNldCtieXRlTGVuZ3RofSxCdWZmZXIucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbiB3cml0ZUludDgodmFsdWUsb2Zmc2V0LG5vQXNzZXJ0KXtyZXR1cm4gdmFsdWU9K3ZhbHVlLG9mZnNldD4+Pj0wLG5vQXNzZXJ0fHxjaGVja0ludCh0aGlzLHZhbHVlLG9mZnNldCwxLDEyNywtMTI4KSx2YWx1ZTwwJiYodmFsdWU9MjU1K3ZhbHVlKzEpLHRoaXNbb2Zmc2V0XT0yNTUmdmFsdWUsb2Zmc2V0KzF9LEJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uIHdyaXRlSW50MTZMRSh2YWx1ZSxvZmZzZXQsbm9Bc3NlcnQpe3JldHVybiB2YWx1ZT0rdmFsdWUsb2Zmc2V0Pj4+PTAsbm9Bc3NlcnR8fGNoZWNrSW50KHRoaXMsdmFsdWUsb2Zmc2V0LDIsMzI3NjcsLTMyNzY4KSx0aGlzW29mZnNldF09MjU1JnZhbHVlLHRoaXNbb2Zmc2V0KzFdPXZhbHVlPj4+OCxvZmZzZXQrMn0sQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkU9ZnVuY3Rpb24gd3JpdGVJbnQxNkJFKHZhbHVlLG9mZnNldCxub0Fzc2VydCl7cmV0dXJuIHZhbHVlPSt2YWx1ZSxvZmZzZXQ+Pj49MCxub0Fzc2VydHx8Y2hlY2tJbnQodGhpcyx2YWx1ZSxvZmZzZXQsMiwzMjc2NywtMzI3NjgpLHRoaXNbb2Zmc2V0XT12YWx1ZT4+PjgsdGhpc1tvZmZzZXQrMV09MjU1JnZhbHVlLG9mZnNldCsyfSxCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbiB3cml0ZUludDMyTEUodmFsdWUsb2Zmc2V0LG5vQXNzZXJ0KXtyZXR1cm4gdmFsdWU9K3ZhbHVlLG9mZnNldD4+Pj0wLG5vQXNzZXJ0fHxjaGVja0ludCh0aGlzLHZhbHVlLG9mZnNldCw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLHRoaXNbb2Zmc2V0XT0yNTUmdmFsdWUsdGhpc1tvZmZzZXQrMV09dmFsdWU+Pj44LHRoaXNbb2Zmc2V0KzJdPXZhbHVlPj4+MTYsdGhpc1tvZmZzZXQrM109dmFsdWU+Pj4yNCxvZmZzZXQrNH0sQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24gd3JpdGVJbnQzMkJFKHZhbHVlLG9mZnNldCxub0Fzc2VydCl7cmV0dXJuIHZhbHVlPSt2YWx1ZSxvZmZzZXQ+Pj49MCxub0Fzc2VydHx8Y2hlY2tJbnQodGhpcyx2YWx1ZSxvZmZzZXQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSx2YWx1ZTwwJiYodmFsdWU9NDI5NDk2NzI5NSt2YWx1ZSsxKSx0aGlzW29mZnNldF09dmFsdWU+Pj4yNCx0aGlzW29mZnNldCsxXT12YWx1ZT4+PjE2LHRoaXNbb2Zmc2V0KzJdPXZhbHVlPj4+OCx0aGlzW29mZnNldCszXT0yNTUmdmFsdWUsb2Zmc2V0KzR9LEJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFPWZ1bmN0aW9uIHdyaXRlRmxvYXRMRSh2YWx1ZSxvZmZzZXQsbm9Bc3NlcnQpe3JldHVybiB3cml0ZUZsb2F0KHRoaXMsdmFsdWUsb2Zmc2V0LCEwLG5vQXNzZXJ0KX0sQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkU9ZnVuY3Rpb24gd3JpdGVGbG9hdEJFKHZhbHVlLG9mZnNldCxub0Fzc2VydCl7cmV0dXJuIHdyaXRlRmxvYXQodGhpcyx2YWx1ZSxvZmZzZXQsITEsbm9Bc3NlcnQpfSxCdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEU9ZnVuY3Rpb24gd3JpdGVEb3VibGVMRSh2YWx1ZSxvZmZzZXQsbm9Bc3NlcnQpe3JldHVybiB3cml0ZURvdWJsZSh0aGlzLHZhbHVlLG9mZnNldCwhMCxub0Fzc2VydCl9LEJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbiB3cml0ZURvdWJsZUJFKHZhbHVlLG9mZnNldCxub0Fzc2VydCl7cmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsdmFsdWUsb2Zmc2V0LCExLG5vQXNzZXJ0KX0sQnVmZmVyLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uIGNvcHkodGFyZ2V0LHRhcmdldFN0YXJ0LHN0YXJ0LGVuZCl7aWYoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKXRocm93IG5ldyBUeXBlRXJyb3IoImFyZ3VtZW50IHNob3VsZCBiZSBhIEJ1ZmZlciIpO2lmKHN0YXJ0fHwoc3RhcnQ9MCksZW5kfHwwPT09ZW5kfHwoZW5kPXRoaXMubGVuZ3RoKSx0YXJnZXRTdGFydD49dGFyZ2V0Lmxlbmd0aCYmKHRhcmdldFN0YXJ0PXRhcmdldC5sZW5ndGgpLHRhcmdldFN0YXJ0fHwodGFyZ2V0U3RhcnQ9MCksZW5kPjAmJmVuZDxzdGFydCYmKGVuZD1zdGFydCksZW5kPT09c3RhcnQpcmV0dXJuIDA7aWYoMD09PXRhcmdldC5sZW5ndGh8fDA9PT10aGlzLmxlbmd0aClyZXR1cm4gMDtpZih0YXJnZXRTdGFydDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJ0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzIik7aWYoc3RhcnQ8MHx8c3RhcnQ+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTtpZihlbmQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlRW5kIG91dCBvZiBib3VuZHMiKTtlbmQ+dGhpcy5sZW5ndGgmJihlbmQ9dGhpcy5sZW5ndGgpLHRhcmdldC5sZW5ndGgtdGFyZ2V0U3RhcnQ8ZW5kLXN0YXJ0JiYoZW5kPXRhcmdldC5sZW5ndGgtdGFyZ2V0U3RhcnQrc3RhcnQpO3ZhciBsZW49ZW5kLXN0YXJ0O3JldHVybiB0aGlzPT09dGFyZ2V0JiYiZnVuY3Rpb24iPT10eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbj90aGlzLmNvcHlXaXRoaW4odGFyZ2V0U3RhcnQsc3RhcnQsZW5kKTpVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbCh0YXJnZXQsdGhpcy5zdWJhcnJheShzdGFydCxlbmQpLHRhcmdldFN0YXJ0KSxsZW59LEJ1ZmZlci5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbiBmaWxsKHZhbCxzdGFydCxlbmQsZW5jb2Rpbmcpe2lmKCJzdHJpbmciPT10eXBlb2YgdmFsKXtpZigic3RyaW5nIj09dHlwZW9mIHN0YXJ0PyhlbmNvZGluZz1zdGFydCxzdGFydD0wLGVuZD10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiBlbmQmJihlbmNvZGluZz1lbmQsZW5kPXRoaXMubGVuZ3RoKSx2b2lkIDAhPT1lbmNvZGluZyYmInN0cmluZyIhPXR5cGVvZiBlbmNvZGluZyl0aHJvdyBuZXcgVHlwZUVycm9yKCJlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nIik7aWYoInN0cmluZyI9PXR5cGVvZiBlbmNvZGluZyYmIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK2VuY29kaW5nKTtpZigxPT09dmFsLmxlbmd0aCl7dmFyIGNvZGU9dmFsLmNoYXJDb2RlQXQoMCk7KCJ1dGY4Ij09PWVuY29kaW5nJiZjb2RlPDEyOHx8ImxhdGluMSI9PT1lbmNvZGluZykmJih2YWw9Y29kZSl9fWVsc2UibnVtYmVyIj09dHlwZW9mIHZhbD92YWwmPTI1NToiYm9vbGVhbiI9PXR5cGVvZiB2YWwmJih2YWw9TnVtYmVyKHZhbCkpO2lmKHN0YXJ0PDB8fHRoaXMubGVuZ3RoPHN0YXJ0fHx0aGlzLmxlbmd0aDxlbmQpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk91dCBvZiByYW5nZSBpbmRleCIpO2lmKGVuZDw9c3RhcnQpcmV0dXJuIHRoaXM7dmFyIGk7aWYoc3RhcnQ+Pj49MCxlbmQ9dm9pZCAwPT09ZW5kP3RoaXMubGVuZ3RoOmVuZD4+PjAsdmFsfHwodmFsPTApLCJudW1iZXIiPT10eXBlb2YgdmFsKWZvcihpPXN0YXJ0O2k8ZW5kOysraSl0aGlzW2ldPXZhbDtlbHNle3ZhciBieXRlcz1CdWZmZXIuaXNCdWZmZXIodmFsKT92YWw6QnVmZmVyLmZyb20odmFsLGVuY29kaW5nKSxsZW49Ynl0ZXMubGVuZ3RoO2lmKDA9PT1sZW4pdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHZhbHVlICInK3ZhbCsnIiBpcyBpbnZhbGlkIGZvciBhcmd1bWVudCAidmFsdWUiJyk7Zm9yKGk9MDtpPGVuZC1zdGFydDsrK2kpdGhpc1tpK3N0YXJ0XT1ieXRlc1tpJWxlbl19cmV0dXJuIHRoaXN9O3ZhciBJTlZBTElEX0JBU0U2NF9SRT0vW14rLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIHV0ZjhUb0J5dGVzKHN0cmluZyx1bml0cyl7dmFyIGNvZGVQb2ludDt1bml0cz11bml0c3x8MS8wO2Zvcih2YXIgbGVuZ3RoPXN0cmluZy5sZW5ndGgsbGVhZFN1cnJvZ2F0ZT1udWxsLGJ5dGVzPVtdLGk9MDtpPGxlbmd0aDsrK2kpe2lmKChjb2RlUG9pbnQ9c3RyaW5nLmNoYXJDb2RlQXQoaSkpPjU1Mjk1JiZjb2RlUG9pbnQ8NTczNDQpe2lmKCFsZWFkU3Vycm9nYXRlKXtpZihjb2RlUG9pbnQ+NTYzMTkpeyh1bml0cy09Myk+LTEmJmJ5dGVzLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWlmKGkrMT09PWxlbmd0aCl7KHVuaXRzLT0zKT4tMSYmYnl0ZXMucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9bGVhZFN1cnJvZ2F0ZT1jb2RlUG9pbnQ7Y29udGludWV9aWYoY29kZVBvaW50PDU2MzIwKXsodW5pdHMtPTMpPi0xJiZieXRlcy5wdXNoKDIzOSwxOTEsMTg5KSxsZWFkU3Vycm9nYXRlPWNvZGVQb2ludDtjb250aW51ZX1jb2RlUG9pbnQ9NjU1MzYrKGxlYWRTdXJyb2dhdGUtNTUyOTY8PDEwfGNvZGVQb2ludC01NjMyMCl9ZWxzZSBsZWFkU3Vycm9nYXRlJiYodW5pdHMtPTMpPi0xJiZieXRlcy5wdXNoKDIzOSwxOTEsMTg5KTtpZihsZWFkU3Vycm9nYXRlPW51bGwsY29kZVBvaW50PDEyOCl7aWYoKHVuaXRzLT0xKTwwKWJyZWFrO2J5dGVzLnB1c2goY29kZVBvaW50KX1lbHNlIGlmKGNvZGVQb2ludDwyMDQ4KXtpZigodW5pdHMtPTIpPDApYnJlYWs7Ynl0ZXMucHVzaChjb2RlUG9pbnQ+PjZ8MTkyLDYzJmNvZGVQb2ludHwxMjgpfWVsc2UgaWYoY29kZVBvaW50PDY1NTM2KXtpZigodW5pdHMtPTMpPDApYnJlYWs7Ynl0ZXMucHVzaChjb2RlUG9pbnQ+PjEyfDIyNCxjb2RlUG9pbnQ+PjYmNjN8MTI4LDYzJmNvZGVQb2ludHwxMjgpfWVsc2V7aWYoIShjb2RlUG9pbnQ8MTExNDExMikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvZGUgcG9pbnQiKTtpZigodW5pdHMtPTQpPDApYnJlYWs7Ynl0ZXMucHVzaChjb2RlUG9pbnQ+PjE4fDI0MCxjb2RlUG9pbnQ+PjEyJjYzfDEyOCxjb2RlUG9pbnQ+PjYmNjN8MTI4LDYzJmNvZGVQb2ludHwxMjgpfX1yZXR1cm4gYnl0ZXN9ZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyhzdHIpe3JldHVybiBiYXNlNjQudG9CeXRlQXJyYXkoZnVuY3Rpb24gYmFzZTY0Y2xlYW4oc3RyKXtpZigoc3RyPShzdHI9c3RyLnNwbGl0KCI9IilbMF0pLnRyaW0oKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCIiKSkubGVuZ3RoPDIpcmV0dXJuIiI7Zm9yKDtzdHIubGVuZ3RoJTQhPTA7KXN0cis9Ij0iO3JldHVybiBzdHJ9KHN0cikpfWZ1bmN0aW9uIGJsaXRCdWZmZXIoc3JjLGRzdCxvZmZzZXQsbGVuZ3RoKXtmb3IodmFyIGk9MDtpPGxlbmd0aCYmIShpK29mZnNldD49ZHN0Lmxlbmd0aHx8aT49c3JjLmxlbmd0aCk7KytpKWRzdFtpK29mZnNldF09c3JjW2ldO3JldHVybiBpfWZ1bmN0aW9uIGlzSW5zdGFuY2Uob2JqLHR5cGUpe3JldHVybiBvYmogaW5zdGFuY2VvZiB0eXBlfHxudWxsIT1vYmomJm51bGwhPW9iai5jb25zdHJ1Y3RvciYmbnVsbCE9b2JqLmNvbnN0cnVjdG9yLm5hbWUmJm9iai5jb25zdHJ1Y3Rvci5uYW1lPT09dHlwZS5uYW1lfWZ1bmN0aW9uIG51bWJlcklzTmFOKG9iail7cmV0dXJuIG9iaiE9b2JqfXZhciBoZXhTbGljZUxvb2t1cFRhYmxlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0YWJsZT1uZXcgQXJyYXkoMjU2KSxpPTA7aTwxNjsrK2kpZm9yKHZhciBpMTY9MTYqaSxqPTA7ajwxNjsrK2opdGFibGVbaTE2K2pdPSIwMTIzNDU2Nzg5YWJjZGVmIltpXSsiMDEyMzQ1Njc4OWFiY2RlZiJbal07cmV0dXJuIHRhYmxlfSgpfSwiLi4vLi4vbm9kZV9tb2R1bGVzL2J1aWx0aW4tc3RhdHVzLWNvZGVzL2Jyb3dzZXIuanMiKG1vZHVsZSl7bW9kdWxlLmV4cG9ydHM9ezEwMDoiQ29udGludWUiLDEwMToiU3dpdGNoaW5nIFByb3RvY29scyIsMTAyOiJQcm9jZXNzaW5nIiwyMDA6Ik9LIiwyMDE6IkNyZWF0ZWQiLDIwMjoiQWNjZXB0ZWQiLDIwMzoiTm9uLUF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb24iLDIwNDoiTm8gQ29udGVudCIsMjA1OiJSZXNldCBDb250ZW50IiwyMDY6IlBhcnRpYWwgQ29udGVudCIsMjA3OiJNdWx0aS1TdGF0dXMiLDIwODoiQWxyZWFkeSBSZXBvcnRlZCIsMjI2OiJJTSBVc2VkIiwzMDA6Ik11bHRpcGxlIENob2ljZXMiLDMwMToiTW92ZWQgUGVybWFuZW50bHkiLDMwMjoiRm91bmQiLDMwMzoiU2VlIE90aGVyIiwzMDQ6Ik5vdCBNb2RpZmllZCIsMzA1OiJVc2UgUHJveHkiLDMwNzoiVGVtcG9yYXJ5IFJlZGlyZWN0IiwzMDg6IlBlcm1hbmVudCBSZWRpcmVjdCIsNDAwOiJCYWQgUmVxdWVzdCIsNDAxOiJVbmF1dGhvcml6ZWQiLDQwMjoiUGF5bWVudCBSZXF1aXJlZCIsNDAzOiJGb3JiaWRkZW4iLDQwNDoiTm90IEZvdW5kIiw0MDU6Ik1ldGhvZCBOb3QgQWxsb3dlZCIsNDA2OiJOb3QgQWNjZXB0YWJsZSIsNDA3OiJQcm94eSBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCIsNDA4OiJSZXF1ZXN0IFRpbWVvdXQiLDQwOToiQ29uZmxpY3QiLDQxMDoiR29uZSIsNDExOiJMZW5ndGggUmVxdWlyZWQiLDQxMjoiUHJlY29uZGl0aW9uIEZhaWxlZCIsNDEzOiJQYXlsb2FkIFRvbyBMYXJnZSIsNDE0OiJVUkkgVG9vIExvbmciLDQxNToiVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZSIsNDE2OiJSYW5nZSBOb3QgU2F0aXNmaWFibGUiLDQxNzoiRXhwZWN0YXRpb24gRmFpbGVkIiw0MTg6IkknbSBhIHRlYXBvdCIsNDIxOiJNaXNkaXJlY3RlZCBSZXF1ZXN0Iiw0MjI6IlVucHJvY2Vzc2FibGUgRW50aXR5Iiw0MjM6IkxvY2tlZCIsNDI0OiJGYWlsZWQgRGVwZW5kZW5jeSIsNDI1OiJVbm9yZGVyZWQgQ29sbGVjdGlvbiIsNDI2OiJVcGdyYWRlIFJlcXVpcmVkIiw0Mjg6IlByZWNvbmRpdGlvbiBSZXF1aXJlZCIsNDI5OiJUb28gTWFueSBSZXF1ZXN0cyIsNDMxOiJSZXF1ZXN0IEhlYWRlciBGaWVsZHMgVG9vIExhcmdlIiw0NTE6IlVuYXZhaWxhYmxlIEZvciBMZWdhbCBSZWFzb25zIiw1MDA6IkludGVybmFsIFNlcnZlciBFcnJvciIsNTAxOiJOb3QgSW1wbGVtZW50ZWQiLDUwMjoiQmFkIEdhdGV3YXkiLDUwMzoiU2VydmljZSBVbmF2YWlsYWJsZSIsNTA0OiJHYXRld2F5IFRpbWVvdXQiLDUwNToiSFRUUCBWZXJzaW9uIE5vdCBTdXBwb3J0ZWQiLDUwNjoiVmFyaWFudCBBbHNvIE5lZ290aWF0ZXMiLDUwNzoiSW5zdWZmaWNpZW50IFN0b3JhZ2UiLDUwODoiTG9vcCBEZXRlY3RlZCIsNTA5OiJCYW5kd2lkdGggTGltaXQgRXhjZWVkZWQiLDUxMDoiTm90IEV4dGVuZGVkIiw1MTE6Ik5ldHdvcmsgQXV0aGVudGljYXRpb24gUmVxdWlyZWQifX0sIi4uLy4uL25vZGVfbW9kdWxlcy9jYWxsLWJpbmQtYXBwbHktaGVscGVycy9hY3R1YWxBcHBseS5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIGJpbmQ9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2Z1bmN0aW9uLWJpbmQvaW5kZXguanMiKSwkYXBwbHk9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2NhbGwtYmluZC1hcHBseS1oZWxwZXJzL2Z1bmN0aW9uQXBwbHkuanMiKSwkY2FsbD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvZnVuY3Rpb25DYWxsLmpzIiksJHJlZmxlY3RBcHBseT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvcmVmbGVjdEFwcGx5LmpzIik7bW9kdWxlLmV4cG9ydHM9JHJlZmxlY3RBcHBseXx8YmluZC5jYWxsKCRjYWxsLCRhcHBseSl9LCIuLi8uLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvYXBwbHlCaW5kLmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgYmluZD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZnVuY3Rpb24tYmluZC9pbmRleC5qcyIpLCRhcHBseT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvZnVuY3Rpb25BcHBseS5qcyIpLGFjdHVhbEFwcGx5PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9jYWxsLWJpbmQtYXBwbHktaGVscGVycy9hY3R1YWxBcHBseS5qcyIpO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uIGFwcGx5QmluZCgpe3JldHVybiBhY3R1YWxBcHBseShiaW5kLCRhcHBseSxhcmd1bWVudHMpfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9jYWxsLWJpbmQtYXBwbHktaGVscGVycy9mdW5jdGlvbkFwcGx5LmpzIihtb2R1bGUpeyJ1c2Ugc3RyaWN0Ijttb2R1bGUuZXhwb3J0cz1GdW5jdGlvbi5wcm90b3R5cGUuYXBwbHl9LCIuLi8uLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvZnVuY3Rpb25DYWxsLmpzIihtb2R1bGUpeyJ1c2Ugc3RyaWN0Ijttb2R1bGUuZXhwb3J0cz1GdW5jdGlvbi5wcm90b3R5cGUuY2FsbH0sIi4uLy4uL25vZGVfbW9kdWxlcy9jYWxsLWJpbmQtYXBwbHktaGVscGVycy9pbmRleC5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIGJpbmQ9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2Z1bmN0aW9uLWJpbmQvaW5kZXguanMiKSwkVHlwZUVycm9yPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvdHlwZS5qcyIpLCRjYWxsPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9jYWxsLWJpbmQtYXBwbHktaGVscGVycy9mdW5jdGlvbkNhbGwuanMiKSwkYWN0dWFsQXBwbHk9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2NhbGwtYmluZC1hcHBseS1oZWxwZXJzL2FjdHVhbEFwcGx5LmpzIik7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24gY2FsbEJpbmRCYXNpYyhhcmdzKXtpZihhcmdzLmxlbmd0aDwxfHwiZnVuY3Rpb24iIT10eXBlb2YgYXJnc1swXSl0aHJvdyBuZXcgJFR5cGVFcnJvcigiYSBmdW5jdGlvbiBpcyByZXF1aXJlZCIpO3JldHVybiAkYWN0dWFsQXBwbHkoYmluZCwkY2FsbCxhcmdzKX19LCIuLi8uLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvcmVmbGVjdEFwcGx5LmpzIihtb2R1bGUpeyJ1c2Ugc3RyaWN0Ijttb2R1bGUuZXhwb3J0cz0idW5kZWZpbmVkIiE9dHlwZW9mIFJlZmxlY3QmJlJlZmxlY3QmJlJlZmxlY3QuYXBwbHl9LCIuLi8uLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kL2NhbGxCb3VuZC5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIEdldEludHJpbnNpYz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZ2V0LWludHJpbnNpYy9pbmRleC5qcyIpLGNhbGxCaW5kPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9jYWxsLWJpbmQvaW5kZXguanMiKSwkaW5kZXhPZj1jYWxsQmluZChHZXRJbnRyaW5zaWMoIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiIpKTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbiBjYWxsQm91bmRJbnRyaW5zaWMobmFtZSxhbGxvd01pc3Npbmcpe3ZhciBpbnRyaW5zaWM9R2V0SW50cmluc2ljKG5hbWUsISFhbGxvd01pc3NpbmcpO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBpbnRyaW5zaWMmJiRpbmRleE9mKG5hbWUsIi5wcm90b3R5cGUuIik+LTE/Y2FsbEJpbmQoaW50cmluc2ljKTppbnRyaW5zaWN9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2NhbGwtYmluZC9pbmRleC5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIHNldEZ1bmN0aW9uTGVuZ3RoPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zZXQtZnVuY3Rpb24tbGVuZ3RoL2luZGV4LmpzIiksJGRlZmluZVByb3BlcnR5PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9lcy1kZWZpbmUtcHJvcGVydHkvaW5kZXguanMiKSxjYWxsQmluZEJhc2ljPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9jYWxsLWJpbmQtYXBwbHktaGVscGVycy9pbmRleC5qcyIpLGFwcGx5QmluZD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvYXBwbHlCaW5kLmpzIik7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24gY2FsbEJpbmQob3JpZ2luYWxGdW5jdGlvbil7dmFyIGZ1bmM9Y2FsbEJpbmRCYXNpYyhhcmd1bWVudHMpLGFkanVzdGVkTGVuZ3RoPTErb3JpZ2luYWxGdW5jdGlvbi5sZW5ndGgtKGFyZ3VtZW50cy5sZW5ndGgtMSk7cmV0dXJuIHNldEZ1bmN0aW9uTGVuZ3RoKGZ1bmMsYWRqdXN0ZWRMZW5ndGg+MD9hZGp1c3RlZExlbmd0aDowLCEwKX0sJGRlZmluZVByb3BlcnR5PyRkZWZpbmVQcm9wZXJ0eShtb2R1bGUuZXhwb3J0cywiYXBwbHkiLHt2YWx1ZTphcHBseUJpbmR9KTptb2R1bGUuZXhwb3J0cy5hcHBseT1hcHBseUJpbmR9LCIuLi8uLi9ub2RlX21vZHVsZXMvY2FsbC1ib3VuZC9pbmRleC5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIEdldEludHJpbnNpYz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZ2V0LWludHJpbnNpYy9pbmRleC5qcyIpLGNhbGxCaW5kQmFzaWM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2NhbGwtYmluZC1hcHBseS1oZWxwZXJzL2luZGV4LmpzIiksJGluZGV4T2Y9Y2FsbEJpbmRCYXNpYyhbR2V0SW50cmluc2ljKCIlU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mJSIpXSk7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24gY2FsbEJvdW5kSW50cmluc2ljKG5hbWUsYWxsb3dNaXNzaW5nKXt2YXIgaW50cmluc2ljPUdldEludHJpbnNpYyhuYW1lLCEhYWxsb3dNaXNzaW5nKTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgaW50cmluc2ljJiYkaW5kZXhPZihuYW1lLCIucHJvdG90eXBlLiIpPi0xP2NhbGxCaW5kQmFzaWMoW2ludHJpbnNpY10pOmludHJpbnNpY319LCIuLi8uLi9ub2RlX21vZHVsZXMvY2lwaGVyLWJhc2UvaW5kZXguanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBCdWZmZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3NhZmUtYnVmZmVyL2luZGV4LmpzIikuQnVmZmVyLFRyYW5zZm9ybT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvaW5kZXguanMiKS5UcmFuc2Zvcm0sU3RyaW5nRGVjb2Rlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyaW5nX2RlY29kZXIvbGliL3N0cmluZ19kZWNvZGVyLmpzIikuU3RyaW5nRGVjb2Rlcixpbmhlcml0cz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIpLHRvQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy90by1idWZmZXIvaW5kZXguanMiKTtmdW5jdGlvbiBDaXBoZXJCYXNlKGhhc2hNb2RlKXtUcmFuc2Zvcm0uY2FsbCh0aGlzKSx0aGlzLmhhc2hNb2RlPSJzdHJpbmciPT10eXBlb2YgaGFzaE1vZGUsdGhpcy5oYXNoTW9kZT90aGlzW2hhc2hNb2RlXT10aGlzLl9maW5hbE9yRGlnZXN0OnRoaXMuZmluYWw9dGhpcy5fZmluYWxPckRpZ2VzdCx0aGlzLl9maW5hbCYmKHRoaXMuX19maW5hbD10aGlzLl9maW5hbCx0aGlzLl9maW5hbD1udWxsKSx0aGlzLl9kZWNvZGVyPW51bGwsdGhpcy5fZW5jb2Rpbmc9bnVsbH1pbmhlcml0cyhDaXBoZXJCYXNlLFRyYW5zZm9ybSksQ2lwaGVyQmFzZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGRhdGEsaW5wdXRFbmMsb3V0cHV0RW5jKXt2YXIgYnVmZmVyRGF0YT10b0J1ZmZlcihkYXRhLGlucHV0RW5jKSxvdXREYXRhPXRoaXMuX3VwZGF0ZShidWZmZXJEYXRhKTtyZXR1cm4gdGhpcy5oYXNoTW9kZT90aGlzOihvdXRwdXRFbmMmJihvdXREYXRhPXRoaXMuX3RvU3RyaW5nKG91dERhdGEsb3V0cHV0RW5jKSksb3V0RGF0YSl9LENpcGhlckJhc2UucHJvdG90eXBlLnNldEF1dG9QYWRkaW5nPWZ1bmN0aW9uKCl7fSxDaXBoZXJCYXNlLnByb3RvdHlwZS5nZXRBdXRoVGFnPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJ0cnlpbmcgdG8gZ2V0IGF1dGggdGFnIGluIHVuc3VwcG9ydGVkIHN0YXRlIil9LENpcGhlckJhc2UucHJvdG90eXBlLnNldEF1dGhUYWc9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoInRyeWluZyB0byBzZXQgYXV0aCB0YWcgaW4gdW5zdXBwb3J0ZWQgc3RhdGUiKX0sQ2lwaGVyQmFzZS5wcm90b3R5cGUuc2V0QUFEPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJ0cnlpbmcgdG8gc2V0IGFhZCBpbiB1bnN1cHBvcnRlZCBzdGF0ZSIpfSxDaXBoZXJCYXNlLnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKGRhdGEsXyxuZXh0KXt2YXIgZXJyO3RyeXt0aGlzLmhhc2hNb2RlP3RoaXMuX3VwZGF0ZShkYXRhKTp0aGlzLnB1c2godGhpcy5fdXBkYXRlKGRhdGEpKX1jYXRjaChlKXtlcnI9ZX1maW5hbGx5e25leHQoZXJyKX19LENpcGhlckJhc2UucHJvdG90eXBlLl9mbHVzaD1mdW5jdGlvbihkb25lKXt2YXIgZXJyO3RyeXt0aGlzLnB1c2godGhpcy5fX2ZpbmFsKCkpfWNhdGNoKGUpe2Vycj1lfWRvbmUoZXJyKX0sQ2lwaGVyQmFzZS5wcm90b3R5cGUuX2ZpbmFsT3JEaWdlc3Q9ZnVuY3Rpb24ob3V0cHV0RW5jKXt2YXIgb3V0RGF0YT10aGlzLl9fZmluYWwoKXx8QnVmZmVyLmFsbG9jKDApO3JldHVybiBvdXRwdXRFbmMmJihvdXREYXRhPXRoaXMuX3RvU3RyaW5nKG91dERhdGEsb3V0cHV0RW5jLCEwKSksb3V0RGF0YX0sQ2lwaGVyQmFzZS5wcm90b3R5cGUuX3RvU3RyaW5nPWZ1bmN0aW9uKHZhbHVlLGVuYyxmaW4pe2lmKHRoaXMuX2RlY29kZXJ8fCh0aGlzLl9kZWNvZGVyPW5ldyBTdHJpbmdEZWNvZGVyKGVuYyksdGhpcy5fZW5jb2Rpbmc9ZW5jKSx0aGlzLl9lbmNvZGluZyE9PWVuYyl0aHJvdyBuZXcgRXJyb3IoImNhbuKAmXQgc3dpdGNoIGVuY29kaW5ncyIpO3ZhciBvdXQ9dGhpcy5fZGVjb2Rlci53cml0ZSh2YWx1ZSk7cmV0dXJuIGZpbiYmKG91dCs9dGhpcy5fZGVjb2Rlci5lbmQoKSksb3V0fSxtb2R1bGUuZXhwb3J0cz1DaXBoZXJCYXNlfSwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvbnNvbGUtYnJvd3NlcmlmeS9pbmRleC5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXt2YXIgdXRpbD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvdXRpbC91dGlsLmpzIiksYXNzZXJ0PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9hc3NlcnQvYnVpbGQvYXNzZXJ0LmpzIik7ZnVuY3Rpb24gbm93KCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9dmFyIGNvbnNvbGUsc2xpY2U9QXJyYXkucHJvdG90eXBlLnNsaWNlLHRpbWVzPXt9O2NvbnNvbGU9dm9pZCAwIT09X193ZWJwYWNrX3JlcXVpcmVfXy5nJiZfX3dlYnBhY2tfcmVxdWlyZV9fLmcuY29uc29sZT9fX3dlYnBhY2tfcmVxdWlyZV9fLmcuY29uc29sZToidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93LmNvbnNvbGU/d2luZG93LmNvbnNvbGU6e307Zm9yKHZhciBmdW5jdGlvbnM9W1tmdW5jdGlvbiBsb2coKXt9LCJsb2ciXSxbZnVuY3Rpb24gaW5mbygpe2NvbnNvbGUubG9nLmFwcGx5KGNvbnNvbGUsYXJndW1lbnRzKX0sImluZm8iXSxbZnVuY3Rpb24gd2Fybigpe2NvbnNvbGUubG9nLmFwcGx5KGNvbnNvbGUsYXJndW1lbnRzKX0sIndhcm4iXSxbZnVuY3Rpb24gZXJyb3IoKXtjb25zb2xlLndhcm4uYXBwbHkoY29uc29sZSxhcmd1bWVudHMpfSwiZXJyb3IiXSxbZnVuY3Rpb24gdGltZShsYWJlbCl7dGltZXNbbGFiZWxdPW5vdygpfSwidGltZSJdLFtmdW5jdGlvbiB0aW1lRW5kKGxhYmVsKXt2YXIgdGltZT10aW1lc1tsYWJlbF07aWYoIXRpbWUpdGhyb3cgbmV3IEVycm9yKCJObyBzdWNoIGxhYmVsOiAiK2xhYmVsKTtkZWxldGUgdGltZXNbbGFiZWxdO3ZhciBkdXJhdGlvbj1ub3coKS10aW1lO2NvbnNvbGUubG9nKGxhYmVsKyI6ICIrZHVyYXRpb24rIm1zIil9LCJ0aW1lRW5kIl0sW2Z1bmN0aW9uIHRyYWNlKCl7dmFyIGVycj1uZXcgRXJyb3I7ZXJyLm5hbWU9IlRyYWNlIixlcnIubWVzc2FnZT11dGlsLmZvcm1hdC5hcHBseShudWxsLGFyZ3VtZW50cyksY29uc29sZS5lcnJvcihlcnIuc3RhY2spfSwidHJhY2UiXSxbZnVuY3Rpb24gZGlyKG9iamVjdCl7Y29uc29sZS5sb2codXRpbC5pbnNwZWN0KG9iamVjdCkrIlxuIil9LCJkaXIiXSxbZnVuY3Rpb24gY29uc29sZUFzc2VydChleHByZXNzaW9uKXtpZighZXhwcmVzc2lvbil7dmFyIGFycj1zbGljZS5jYWxsKGFyZ3VtZW50cywxKTthc3NlcnQub2soITEsdXRpbC5mb3JtYXQuYXBwbHkobnVsbCxhcnIpKX19LCJhc3NlcnQiXV0saT0wO2k8ZnVuY3Rpb25zLmxlbmd0aDtpKyspe3ZhciB0dXBsZT1mdW5jdGlvbnNbaV0sZj10dXBsZVswXSxuYW1lPXR1cGxlWzFdO2NvbnNvbGVbbmFtZV18fChjb25zb2xlW25hbWVdPWYpfW1vZHVsZS5leHBvcnRzPWNvbnNvbGV9LCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS11dGlsLWlzL2xpYi91dGlsLmpzIihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pe2Z1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyl9ZXhwb3J0cy5pc0FycmF5PWZ1bmN0aW9uIGlzQXJyYXkoYXJnKXtyZXR1cm4gQXJyYXkuaXNBcnJheT9BcnJheS5pc0FycmF5KGFyZyk6IltvYmplY3QgQXJyYXldIj09PW9iamVjdFRvU3RyaW5nKGFyZyl9LGV4cG9ydHMuaXNCb29sZWFuPWZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGFyZ30sZXhwb3J0cy5pc051bGw9ZnVuY3Rpb24gaXNOdWxsKGFyZyl7cmV0dXJuIG51bGw9PT1hcmd9LGV4cG9ydHMuaXNOdWxsT3JVbmRlZmluZWQ9ZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoYXJnKXtyZXR1cm4gbnVsbD09YXJnfSxleHBvcnRzLmlzTnVtYmVyPWZ1bmN0aW9uIGlzTnVtYmVyKGFyZyl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBhcmd9LGV4cG9ydHMuaXNTdHJpbmc9ZnVuY3Rpb24gaXNTdHJpbmcoYXJnKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGFyZ30sZXhwb3J0cy5pc1N5bWJvbD1mdW5jdGlvbiBpc1N5bWJvbChhcmcpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgYXJnfSxleHBvcnRzLmlzVW5kZWZpbmVkPWZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZyl7cmV0dXJuIHZvaWQgMD09PWFyZ30sZXhwb3J0cy5pc1JlZ0V4cD1mdW5jdGlvbiBpc1JlZ0V4cChyZSl7cmV0dXJuIltvYmplY3QgUmVnRXhwXSI9PT1vYmplY3RUb1N0cmluZyhyZSl9LGV4cG9ydHMuaXNPYmplY3Q9ZnVuY3Rpb24gaXNPYmplY3QoYXJnKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGFyZyYmbnVsbCE9PWFyZ30sZXhwb3J0cy5pc0RhdGU9ZnVuY3Rpb24gaXNEYXRlKGQpe3JldHVybiJbb2JqZWN0IERhdGVdIj09PW9iamVjdFRvU3RyaW5nKGQpfSxleHBvcnRzLmlzRXJyb3I9ZnVuY3Rpb24gaXNFcnJvcihlKXtyZXR1cm4iW29iamVjdCBFcnJvcl0iPT09b2JqZWN0VG9TdHJpbmcoZSl8fGUgaW5zdGFuY2VvZiBFcnJvcn0sZXhwb3J0cy5pc0Z1bmN0aW9uPWZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgYXJnfSxleHBvcnRzLmlzUHJpbWl0aXZlPWZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZyl7cmV0dXJuIG51bGw9PT1hcmd8fCJib29sZWFuIj09dHlwZW9mIGFyZ3x8Im51bWJlciI9PXR5cGVvZiBhcmd8fCJzdHJpbmciPT10eXBlb2YgYXJnfHwic3ltYm9sIj09dHlwZW9mIGFyZ3x8dm9pZCAwPT09YXJnfSxleHBvcnRzLmlzQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiKS5CdWZmZXIuaXNCdWZmZXJ9LCIuLi8uLi9ub2RlX21vZHVsZXMvY3JlYXRlLWVjZGgvYnJvd3Nlci5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXt2YXIgQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiKSxlbGxpcHRpYz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljLmpzIiksQk49X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2JuLmpzL2xpYi9ibi5qcyIpO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uIGNyZWF0ZUVDREgoY3VydmUpe3JldHVybiBuZXcgRUNESChjdXJ2ZSl9O3ZhciBhbGlhc2VzPXtzZWNwMjU2azE6e25hbWU6InNlY3AyNTZrMSIsYnl0ZUxlbmd0aDozMn0sc2VjcDIyNHIxOntuYW1lOiJwMjI0IixieXRlTGVuZ3RoOjI4fSxwcmltZTI1NnYxOntuYW1lOiJwMjU2IixieXRlTGVuZ3RoOjMyfSxwcmltZTE5MnYxOntuYW1lOiJwMTkyIixieXRlTGVuZ3RoOjI0fSxlZDI1NTE5OntuYW1lOiJlZDI1NTE5IixieXRlTGVuZ3RoOjMyfSxzZWNwMzg0cjE6e25hbWU6InAzODQiLGJ5dGVMZW5ndGg6NDh9LHNlY3A1MjFyMTp7bmFtZToicDUyMSIsYnl0ZUxlbmd0aDo2Nn19O2Z1bmN0aW9uIEVDREgoY3VydmUpe3RoaXMuY3VydmVUeXBlPWFsaWFzZXNbY3VydmVdLHRoaXMuY3VydmVUeXBlfHwodGhpcy5jdXJ2ZVR5cGU9e25hbWU6Y3VydmV9KSx0aGlzLmN1cnZlPW5ldyBlbGxpcHRpYy5lYyh0aGlzLmN1cnZlVHlwZS5uYW1lKSx0aGlzLmtleXM9dm9pZCAwfWZ1bmN0aW9uIGZvcm1hdFJldHVyblZhbHVlKGJuLGVuYyxsZW4pe0FycmF5LmlzQXJyYXkoYm4pfHwoYm49Ym4udG9BcnJheSgpKTt2YXIgYnVmPW5ldyBCdWZmZXIoYm4pO2lmKGxlbiYmYnVmLmxlbmd0aDxsZW4pe3ZhciB6ZXJvcz1uZXcgQnVmZmVyKGxlbi1idWYubGVuZ3RoKTt6ZXJvcy5maWxsKDApLGJ1Zj1CdWZmZXIuY29uY2F0KFt6ZXJvcyxidWZdKX1yZXR1cm4gZW5jP2J1Zi50b1N0cmluZyhlbmMpOmJ1Zn1hbGlhc2VzLnAyMjQ9YWxpYXNlcy5zZWNwMjI0cjEsYWxpYXNlcy5wMjU2PWFsaWFzZXMuc2VjcDI1NnIxPWFsaWFzZXMucHJpbWUyNTZ2MSxhbGlhc2VzLnAxOTI9YWxpYXNlcy5zZWNwMTkycjE9YWxpYXNlcy5wcmltZTE5MnYxLGFsaWFzZXMucDM4ND1hbGlhc2VzLnNlY3AzODRyMSxhbGlhc2VzLnA1MjE9YWxpYXNlcy5zZWNwNTIxcjEsRUNESC5wcm90b3R5cGUuZ2VuZXJhdGVLZXlzPWZ1bmN0aW9uKGVuYyxmb3JtYXQpe3JldHVybiB0aGlzLmtleXM9dGhpcy5jdXJ2ZS5nZW5LZXlQYWlyKCksdGhpcy5nZXRQdWJsaWNLZXkoZW5jLGZvcm1hdCl9LEVDREgucHJvdG90eXBlLmNvbXB1dGVTZWNyZXQ9ZnVuY3Rpb24ob3RoZXIsaW5lbmMsZW5jKXtyZXR1cm4gaW5lbmM9aW5lbmN8fCJ1dGY4IixCdWZmZXIuaXNCdWZmZXIob3RoZXIpfHwob3RoZXI9bmV3IEJ1ZmZlcihvdGhlcixpbmVuYykpLGZvcm1hdFJldHVyblZhbHVlKHRoaXMuY3VydmUua2V5RnJvbVB1YmxpYyhvdGhlcikuZ2V0UHVibGljKCkubXVsKHRoaXMua2V5cy5nZXRQcml2YXRlKCkpLmdldFgoKSxlbmMsdGhpcy5jdXJ2ZVR5cGUuYnl0ZUxlbmd0aCl9LEVDREgucHJvdG90eXBlLmdldFB1YmxpY0tleT1mdW5jdGlvbihlbmMsZm9ybWF0KXt2YXIga2V5PXRoaXMua2V5cy5nZXRQdWJsaWMoImNvbXByZXNzZWQiPT09Zm9ybWF0LCEwKTtyZXR1cm4iaHlicmlkIj09PWZvcm1hdCYmKGtleVtrZXkubGVuZ3RoLTFdJTI/a2V5WzBdPTc6a2V5WzBdPTYpLGZvcm1hdFJldHVyblZhbHVlKGtleSxlbmMpfSxFQ0RILnByb3RvdHlwZS5nZXRQcml2YXRlS2V5PWZ1bmN0aW9uKGVuYyl7cmV0dXJuIGZvcm1hdFJldHVyblZhbHVlKHRoaXMua2V5cy5nZXRQcml2YXRlKCksZW5jKX0sRUNESC5wcm90b3R5cGUuc2V0UHVibGljS2V5PWZ1bmN0aW9uKHB1YixlbmMpe3JldHVybiBlbmM9ZW5jfHwidXRmOCIsQnVmZmVyLmlzQnVmZmVyKHB1Yil8fChwdWI9bmV3IEJ1ZmZlcihwdWIsZW5jKSksdGhpcy5rZXlzLl9pbXBvcnRQdWJsaWMocHViKSx0aGlzfSxFQ0RILnByb3RvdHlwZS5zZXRQcml2YXRlS2V5PWZ1bmN0aW9uKHByaXYsZW5jKXtlbmM9ZW5jfHwidXRmOCIsQnVmZmVyLmlzQnVmZmVyKHByaXYpfHwocHJpdj1uZXcgQnVmZmVyKHByaXYsZW5jKSk7dmFyIF9wcml2PW5ldyBCTihwcml2KTtyZXR1cm4gX3ByaXY9X3ByaXYudG9TdHJpbmcoMTYpLHRoaXMua2V5cz10aGlzLmN1cnZlLmdlbktleVBhaXIoKSx0aGlzLmtleXMuX2ltcG9ydFByaXZhdGUoX3ByaXYpLHRoaXN9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2NyZWF0ZS1oYXNoL2Jyb3dzZXIuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBpbmhlcml0cz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIpLE1ENT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbWQ1LmpzL2luZGV4LmpzIiksUklQRU1EMTYwPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9yaXBlbWQxNjAvaW5kZXguanMiKSxzaGE9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3NoYS5qcy9pbmRleC5qcyIpLEJhc2U9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2NpcGhlci1iYXNlL2luZGV4LmpzIik7ZnVuY3Rpb24gSGFzaChoYXNoKXtCYXNlLmNhbGwodGhpcywiZGlnZXN0IiksdGhpcy5faGFzaD1oYXNofWluaGVyaXRzKEhhc2gsQmFzZSksSGFzaC5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbihkYXRhKXt0aGlzLl9oYXNoLnVwZGF0ZShkYXRhKX0sSGFzaC5wcm90b3R5cGUuX2ZpbmFsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hhc2guZGlnZXN0KCl9LG1vZHVsZS5leHBvcnRzPWZ1bmN0aW9uIGNyZWF0ZUhhc2goYWxnKXtyZXR1cm4ibWQ1Ij09PShhbGc9YWxnLnRvTG93ZXJDYXNlKCkpP25ldyBNRDU6InJtZDE2MCI9PT1hbGd8fCJyaXBlbWQxNjAiPT09YWxnP25ldyBSSVBFTUQxNjA6bmV3IEhhc2goc2hhKGFsZykpfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9jcmVhdGUtaGFzaC9tZDUuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7dmFyIE1ENT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbWQ1LmpzL2luZGV4LmpzIik7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24oYnVmZmVyKXtyZXR1cm4obmV3IE1ENSkudXBkYXRlKGJ1ZmZlcikuZGlnZXN0KCl9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2NyZWF0ZS1obWFjL2Jyb3dzZXIuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBpbmhlcml0cz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIpLExlZ2FjeT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvY3JlYXRlLWhtYWMvbGVnYWN5LmpzIiksQmFzZT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvY2lwaGVyLWJhc2UvaW5kZXguanMiKSxCdWZmZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3NhZmUtYnVmZmVyL2luZGV4LmpzIikuQnVmZmVyLG1kNT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvY3JlYXRlLWhhc2gvbWQ1LmpzIiksUklQRU1EMTYwPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9yaXBlbWQxNjAvaW5kZXguanMiKSxzaGE9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3NoYS5qcy9pbmRleC5qcyIpLFpFUk9TPUJ1ZmZlci5hbGxvYygxMjgpO2Z1bmN0aW9uIEhtYWMoYWxnLGtleSl7QmFzZS5jYWxsKHRoaXMsImRpZ2VzdCIpLCJzdHJpbmciPT10eXBlb2Yga2V5JiYoa2V5PUJ1ZmZlci5mcm9tKGtleSkpO3ZhciBibG9ja3NpemU9InNoYTUxMiI9PT1hbGd8fCJzaGEzODQiPT09YWxnPzEyODo2NDsodGhpcy5fYWxnPWFsZyx0aGlzLl9rZXk9a2V5LGtleS5sZW5ndGg+YmxvY2tzaXplKT9rZXk9KCJybWQxNjAiPT09YWxnP25ldyBSSVBFTUQxNjA6c2hhKGFsZykpLnVwZGF0ZShrZXkpLmRpZ2VzdCgpOmtleS5sZW5ndGg8YmxvY2tzaXplJiYoa2V5PUJ1ZmZlci5jb25jYXQoW2tleSxaRVJPU10sYmxvY2tzaXplKSk7Zm9yKHZhciBpcGFkPXRoaXMuX2lwYWQ9QnVmZmVyLmFsbG9jVW5zYWZlKGJsb2Nrc2l6ZSksb3BhZD10aGlzLl9vcGFkPUJ1ZmZlci5hbGxvY1Vuc2FmZShibG9ja3NpemUpLGk9MDtpPGJsb2Nrc2l6ZTtpKyspaXBhZFtpXT01NF5rZXlbaV0sb3BhZFtpXT05Ml5rZXlbaV07dGhpcy5faGFzaD0icm1kMTYwIj09PWFsZz9uZXcgUklQRU1EMTYwOnNoYShhbGcpLHRoaXMuX2hhc2gudXBkYXRlKGlwYWQpfWluaGVyaXRzKEhtYWMsQmFzZSksSG1hYy5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbihkYXRhKXt0aGlzLl9oYXNoLnVwZGF0ZShkYXRhKX0sSG1hYy5wcm90b3R5cGUuX2ZpbmFsPWZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5faGFzaC5kaWdlc3QoKTtyZXR1cm4oInJtZDE2MCI9PT10aGlzLl9hbGc/bmV3IFJJUEVNRDE2MDpzaGEodGhpcy5fYWxnKSkudXBkYXRlKHRoaXMuX29wYWQpLnVwZGF0ZShoKS5kaWdlc3QoKX0sbW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24gY3JlYXRlSG1hYyhhbGcsa2V5KXtyZXR1cm4icm1kMTYwIj09PShhbGc9YWxnLnRvTG93ZXJDYXNlKCkpfHwicmlwZW1kMTYwIj09PWFsZz9uZXcgSG1hYygicm1kMTYwIixrZXkpOiJtZDUiPT09YWxnP25ldyBMZWdhY3kobWQ1LGtleSk6bmV3IEhtYWMoYWxnLGtleSl9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2NyZWF0ZS1obWFjL2xlZ2FjeS5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIGluaGVyaXRzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiksQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcyIpLkJ1ZmZlcixCYXNlPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9jaXBoZXItYmFzZS9pbmRleC5qcyIpLFpFUk9TPUJ1ZmZlci5hbGxvYygxMjgpO2Z1bmN0aW9uIEhtYWMoYWxnLGtleSl7QmFzZS5jYWxsKHRoaXMsImRpZ2VzdCIpLCJzdHJpbmciPT10eXBlb2Yga2V5JiYoa2V5PUJ1ZmZlci5mcm9tKGtleSkpLHRoaXMuX2FsZz1hbGcsdGhpcy5fa2V5PWtleSxrZXkubGVuZ3RoPjY0P2tleT1hbGcoa2V5KTprZXkubGVuZ3RoPDY0JiYoa2V5PUJ1ZmZlci5jb25jYXQoW2tleSxaRVJPU10sNjQpKTtmb3IodmFyIGlwYWQ9dGhpcy5faXBhZD1CdWZmZXIuYWxsb2NVbnNhZmUoNjQpLG9wYWQ9dGhpcy5fb3BhZD1CdWZmZXIuYWxsb2NVbnNhZmUoNjQpLGk9MDtpPDY0O2krKylpcGFkW2ldPTU0XmtleVtpXSxvcGFkW2ldPTkyXmtleVtpXTt0aGlzLl9oYXNoPVtpcGFkXX1pbmhlcml0cyhIbWFjLEJhc2UpLEhtYWMucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24oZGF0YSl7dGhpcy5faGFzaC5wdXNoKGRhdGEpfSxIbWFjLnByb3RvdHlwZS5fZmluYWw9ZnVuY3Rpb24oKXt2YXIgaD10aGlzLl9hbGcoQnVmZmVyLmNvbmNhdCh0aGlzLl9oYXNoKSk7cmV0dXJuIHRoaXMuX2FsZyhCdWZmZXIuY29uY2F0KFt0aGlzLl9vcGFkLGhdKSl9LG1vZHVsZS5leHBvcnRzPUhtYWN9LCIuLi8uLi9ub2RlX21vZHVsZXMvY3J5cHRvLWJyb3dzZXJpZnkvaW5kZXguanMiKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO2V4cG9ydHMucmFuZG9tQnl0ZXM9ZXhwb3J0cy5ybmc9ZXhwb3J0cy5wc2V1ZG9SYW5kb21CeXRlcz1leHBvcnRzLnBybmc9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3JhbmRvbWJ5dGVzL2Jyb3dzZXIuanMiKSxleHBvcnRzLmNyZWF0ZUhhc2g9ZXhwb3J0cy5IYXNoPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9jcmVhdGUtaGFzaC9icm93c2VyLmpzIiksZXhwb3J0cy5jcmVhdGVIbWFjPWV4cG9ydHMuSG1hYz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvY3JlYXRlLWhtYWMvYnJvd3Nlci5qcyIpO3ZhciBhbGdvcz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1zaWduL2FsZ29zLmpzIiksYWxnb0tleXM9T2JqZWN0LmtleXMoYWxnb3MpLGhhc2hlcz1bInNoYTEiLCJzaGEyMjQiLCJzaGEyNTYiLCJzaGEzODQiLCJzaGE1MTIiLCJtZDUiLCJybWQxNjAiXS5jb25jYXQoYWxnb0tleXMpO2V4cG9ydHMuZ2V0SGFzaGVzPWZ1bmN0aW9uKCl7cmV0dXJuIGhhc2hlc307dmFyIHA9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3Bia2RmMi9icm93c2VyLmpzIik7ZXhwb3J0cy5wYmtkZjI9cC5wYmtkZjIsZXhwb3J0cy5wYmtkZjJTeW5jPXAucGJrZGYyU3luYzt2YXIgYWVzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWNpcGhlci9icm93c2VyLmpzIik7ZXhwb3J0cy5DaXBoZXI9YWVzLkNpcGhlcixleHBvcnRzLmNyZWF0ZUNpcGhlcj1hZXMuY3JlYXRlQ2lwaGVyLGV4cG9ydHMuQ2lwaGVyaXY9YWVzLkNpcGhlcml2LGV4cG9ydHMuY3JlYXRlQ2lwaGVyaXY9YWVzLmNyZWF0ZUNpcGhlcml2LGV4cG9ydHMuRGVjaXBoZXI9YWVzLkRlY2lwaGVyLGV4cG9ydHMuY3JlYXRlRGVjaXBoZXI9YWVzLmNyZWF0ZURlY2lwaGVyLGV4cG9ydHMuRGVjaXBoZXJpdj1hZXMuRGVjaXBoZXJpdixleHBvcnRzLmNyZWF0ZURlY2lwaGVyaXY9YWVzLmNyZWF0ZURlY2lwaGVyaXYsZXhwb3J0cy5nZXRDaXBoZXJzPWFlcy5nZXRDaXBoZXJzLGV4cG9ydHMubGlzdENpcGhlcnM9YWVzLmxpc3RDaXBoZXJzO3ZhciBkaD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZGlmZmllLWhlbGxtYW4vYnJvd3Nlci5qcyIpO2V4cG9ydHMuRGlmZmllSGVsbG1hbkdyb3VwPWRoLkRpZmZpZUhlbGxtYW5Hcm91cCxleHBvcnRzLmNyZWF0ZURpZmZpZUhlbGxtYW5Hcm91cD1kaC5jcmVhdGVEaWZmaWVIZWxsbWFuR3JvdXAsZXhwb3J0cy5nZXREaWZmaWVIZWxsbWFuPWRoLmdldERpZmZpZUhlbGxtYW4sZXhwb3J0cy5jcmVhdGVEaWZmaWVIZWxsbWFuPWRoLmNyZWF0ZURpZmZpZUhlbGxtYW4sZXhwb3J0cy5EaWZmaWVIZWxsbWFuPWRoLkRpZmZpZUhlbGxtYW47dmFyIHNpZ249X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktc2lnbi9icm93c2VyL2luZGV4LmpzIik7ZXhwb3J0cy5jcmVhdGVTaWduPXNpZ24uY3JlYXRlU2lnbixleHBvcnRzLlNpZ249c2lnbi5TaWduLGV4cG9ydHMuY3JlYXRlVmVyaWZ5PXNpZ24uY3JlYXRlVmVyaWZ5LGV4cG9ydHMuVmVyaWZ5PXNpZ24uVmVyaWZ5LGV4cG9ydHMuY3JlYXRlRUNESD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvY3JlYXRlLWVjZGgvYnJvd3Nlci5qcyIpO3ZhciBwdWJsaWNFbmNyeXB0PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9wdWJsaWMtZW5jcnlwdC9icm93c2VyLmpzIik7ZXhwb3J0cy5wdWJsaWNFbmNyeXB0PXB1YmxpY0VuY3J5cHQucHVibGljRW5jcnlwdCxleHBvcnRzLnByaXZhdGVFbmNyeXB0PXB1YmxpY0VuY3J5cHQucHJpdmF0ZUVuY3J5cHQsZXhwb3J0cy5wdWJsaWNEZWNyeXB0PXB1YmxpY0VuY3J5cHQucHVibGljRGVjcnlwdCxleHBvcnRzLnByaXZhdGVEZWNyeXB0PXB1YmxpY0VuY3J5cHQucHJpdmF0ZURlY3J5cHQ7dmFyIHJmPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9yYW5kb21maWxsL2Jyb3dzZXIuanMiKTtleHBvcnRzLnJhbmRvbUZpbGw9cmYucmFuZG9tRmlsbCxleHBvcnRzLnJhbmRvbUZpbGxTeW5jPXJmLnJhbmRvbUZpbGxTeW5jLGV4cG9ydHMuY3JlYXRlQ3JlZGVudGlhbHM9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoInNvcnJ5LCBjcmVhdGVDcmVkZW50aWFscyBpcyBub3QgaW1wbGVtZW50ZWQgeWV0XG53ZSBhY2NlcHQgcHVsbCByZXF1ZXN0c1xuaHR0cHM6Ly9naXRodWIuY29tL2Jyb3dzZXJpZnkvY3J5cHRvLWJyb3dzZXJpZnkiKX0sZXhwb3J0cy5jb25zdGFudHM9e0RIX0NIRUNLX1BfTk9UX1NBRkVfUFJJTUU6MixESF9DSEVDS19QX05PVF9QUklNRToxLERIX1VOQUJMRV9UT19DSEVDS19HRU5FUkFUT1I6NCxESF9OT1RfU1VJVEFCTEVfR0VORVJBVE9SOjgsTlBOX0VOQUJMRUQ6MSxBTFBOX0VOQUJMRUQ6MSxSU0FfUEtDUzFfUEFERElORzoxLFJTQV9TU0xWMjNfUEFERElORzoyLFJTQV9OT19QQURESU5HOjMsUlNBX1BLQ1MxX09BRVBfUEFERElORzo0LFJTQV9YOTMxX1BBRERJTkc6NSxSU0FfUEtDUzFfUFNTX1BBRERJTkc6NixQT0lOVF9DT05WRVJTSU9OX0NPTVBSRVNTRUQ6MixQT0lOVF9DT05WRVJTSU9OX1VOQ09NUFJFU1NFRDo0LFBPSU5UX0NPTlZFUlNJT05fSFlCUklEOjZ9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2RlZmluZS1kYXRhLXByb3BlcnR5L2luZGV4LmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgJGRlZmluZVByb3BlcnR5PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9lcy1kZWZpbmUtcHJvcGVydHkvaW5kZXguanMiKSwkU3ludGF4RXJyb3I9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy9zeW50YXguanMiKSwkVHlwZUVycm9yPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvdHlwZS5qcyIpLGdvcGQ9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2dvcGQvaW5kZXguanMiKTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbiBkZWZpbmVEYXRhUHJvcGVydHkob2JqLHByb3BlcnR5LHZhbHVlKXtpZighb2JqfHwib2JqZWN0IiE9dHlwZW9mIG9iaiYmImZ1bmN0aW9uIiE9dHlwZW9mIG9iail0aHJvdyBuZXcgJFR5cGVFcnJvcigiYG9iamAgbXVzdCBiZSBhbiBvYmplY3Qgb3IgYSBmdW5jdGlvbmAiKTtpZigic3RyaW5nIiE9dHlwZW9mIHByb3BlcnR5JiYic3ltYm9sIiE9dHlwZW9mIHByb3BlcnR5KXRocm93IG5ldyAkVHlwZUVycm9yKCJgcHJvcGVydHlgIG11c3QgYmUgYSBzdHJpbmcgb3IgYSBzeW1ib2xgIik7aWYoYXJndW1lbnRzLmxlbmd0aD4zJiYiYm9vbGVhbiIhPXR5cGVvZiBhcmd1bWVudHNbM10mJm51bGwhPT1hcmd1bWVudHNbM10pdGhyb3cgbmV3ICRUeXBlRXJyb3IoImBub25FbnVtZXJhYmxlYCwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYSBib29sZWFuIG9yIG51bGwiKTtpZihhcmd1bWVudHMubGVuZ3RoPjQmJiJib29sZWFuIiE9dHlwZW9mIGFyZ3VtZW50c1s0XSYmbnVsbCE9PWFyZ3VtZW50c1s0XSl0aHJvdyBuZXcgJFR5cGVFcnJvcigiYG5vbldyaXRhYmxlYCwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYSBib29sZWFuIG9yIG51bGwiKTtpZihhcmd1bWVudHMubGVuZ3RoPjUmJiJib29sZWFuIiE9dHlwZW9mIGFyZ3VtZW50c1s1XSYmbnVsbCE9PWFyZ3VtZW50c1s1XSl0aHJvdyBuZXcgJFR5cGVFcnJvcigiYG5vbkNvbmZpZ3VyYWJsZWAsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgYm9vbGVhbiBvciBudWxsIik7aWYoYXJndW1lbnRzLmxlbmd0aD42JiYiYm9vbGVhbiIhPXR5cGVvZiBhcmd1bWVudHNbNl0pdGhyb3cgbmV3ICRUeXBlRXJyb3IoImBsb29zZWAsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgYm9vbGVhbiIpO3ZhciBub25FbnVtZXJhYmxlPWFyZ3VtZW50cy5sZW5ndGg+Mz9hcmd1bWVudHNbM106bnVsbCxub25Xcml0YWJsZT1hcmd1bWVudHMubGVuZ3RoPjQ/YXJndW1lbnRzWzRdOm51bGwsbm9uQ29uZmlndXJhYmxlPWFyZ3VtZW50cy5sZW5ndGg+NT9hcmd1bWVudHNbNV06bnVsbCxsb29zZT1hcmd1bWVudHMubGVuZ3RoPjYmJmFyZ3VtZW50c1s2XSxkZXNjPSEhZ29wZCYmZ29wZChvYmoscHJvcGVydHkpO2lmKCRkZWZpbmVQcm9wZXJ0eSkkZGVmaW5lUHJvcGVydHkob2JqLHByb3BlcnR5LHtjb25maWd1cmFibGU6bnVsbD09PW5vbkNvbmZpZ3VyYWJsZSYmZGVzYz9kZXNjLmNvbmZpZ3VyYWJsZTohbm9uQ29uZmlndXJhYmxlLGVudW1lcmFibGU6bnVsbD09PW5vbkVudW1lcmFibGUmJmRlc2M/ZGVzYy5lbnVtZXJhYmxlOiFub25FbnVtZXJhYmxlLHZhbHVlLHdyaXRhYmxlOm51bGw9PT1ub25Xcml0YWJsZSYmZGVzYz9kZXNjLndyaXRhYmxlOiFub25Xcml0YWJsZX0pO2Vsc2V7aWYoIWxvb3NlJiYobm9uRW51bWVyYWJsZXx8bm9uV3JpdGFibGV8fG5vbkNvbmZpZ3VyYWJsZSkpdGhyb3cgbmV3ICRTeW50YXhFcnJvcigiVGhpcyBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IGRlZmluaW5nIGEgcHJvcGVydHkgYXMgbm9uLWNvbmZpZ3VyYWJsZSwgbm9uLXdyaXRhYmxlLCBvciBub24tZW51bWVyYWJsZS4iKTtvYmpbcHJvcGVydHldPXZhbHVlfX19LCIuLi8uLi9ub2RlX21vZHVsZXMvZGVmaW5lLXByb3BlcnRpZXMvaW5kZXguanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBrZXlzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9vYmplY3Qta2V5cy9pbmRleC5qcyIpLGhhc1N5bWJvbHM9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2woImZvbyIpLHRvU3RyPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsY29uY2F0PUFycmF5LnByb3RvdHlwZS5jb25jYXQsZGVmaW5lRGF0YVByb3BlcnR5PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9kZWZpbmUtZGF0YS1wcm9wZXJ0eS9pbmRleC5qcyIpLHN1cHBvcnRzRGVzY3JpcHRvcnM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2hhcy1wcm9wZXJ0eS1kZXNjcmlwdG9ycy9pbmRleC5qcyIpKCksZGVmaW5lUHJvcGVydHk9ZnVuY3Rpb24ob2JqZWN0LG5hbWUsdmFsdWUscHJlZGljYXRlKXtpZihuYW1lIGluIG9iamVjdClpZighMD09PXByZWRpY2F0ZSl7aWYob2JqZWN0W25hbWVdPT09dmFsdWUpcmV0dXJufWVsc2UgaWYoImZ1bmN0aW9uIiE9dHlwZW9mKGZuPXByZWRpY2F0ZSl8fCJbb2JqZWN0IEZ1bmN0aW9uXSIhPT10b1N0ci5jYWxsKGZuKXx8IXByZWRpY2F0ZSgpKXJldHVybjt2YXIgZm47c3VwcG9ydHNEZXNjcmlwdG9ycz9kZWZpbmVEYXRhUHJvcGVydHkob2JqZWN0LG5hbWUsdmFsdWUsITApOmRlZmluZURhdGFQcm9wZXJ0eShvYmplY3QsbmFtZSx2YWx1ZSl9LGRlZmluZVByb3BlcnRpZXM9ZnVuY3Rpb24ob2JqZWN0LG1hcCl7dmFyIHByZWRpY2F0ZXM9YXJndW1lbnRzLmxlbmd0aD4yP2FyZ3VtZW50c1syXTp7fSxwcm9wcz1rZXlzKG1hcCk7aGFzU3ltYm9scyYmKHByb3BzPWNvbmNhdC5jYWxsKHByb3BzLE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMobWFwKSkpO2Zvcih2YXIgaT0wO2k8cHJvcHMubGVuZ3RoO2krPTEpZGVmaW5lUHJvcGVydHkob2JqZWN0LHByb3BzW2ldLG1hcFtwcm9wc1tpXV0scHJlZGljYXRlc1twcm9wc1tpXV0pfTtkZWZpbmVQcm9wZXJ0aWVzLnN1cHBvcnRzRGVzY3JpcHRvcnM9ISFzdXBwb3J0c0Rlc2NyaXB0b3JzLG1vZHVsZS5leHBvcnRzPWRlZmluZVByb3BlcnRpZXN9LCIuLi8uLi9ub2RlX21vZHVsZXMvZGVzLmpzL2xpYi9kZXMuanMiKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO2V4cG9ydHMudXRpbHM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2Rlcy5qcy9saWIvZGVzL3V0aWxzLmpzIiksZXhwb3J0cy5DaXBoZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2Rlcy5qcy9saWIvZGVzL2NpcGhlci5qcyIpLGV4cG9ydHMuREVTPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9kZXMuanMvbGliL2Rlcy9kZXMuanMiKSxleHBvcnRzLkNCQz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZGVzLmpzL2xpYi9kZXMvY2JjLmpzIiksZXhwb3J0cy5FREU9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2Rlcy5qcy9saWIvZGVzL2VkZS5qcyIpfSwiLi4vLi4vbm9kZV9tb2R1bGVzL2Rlcy5qcy9saWIvZGVzL2NiYy5qcyIoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIGFzc2VydD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbWluaW1hbGlzdGljLWFzc2VydC9pbmRleC5qcyIpLGluaGVyaXRzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIikscHJvdG89e307ZnVuY3Rpb24gQ0JDU3RhdGUoaXYpe2Fzc2VydC5lcXVhbChpdi5sZW5ndGgsOCwiSW52YWxpZCBJViBsZW5ndGgiKSx0aGlzLml2PW5ldyBBcnJheSg4KTtmb3IodmFyIGk9MDtpPHRoaXMuaXYubGVuZ3RoO2krKyl0aGlzLml2W2ldPWl2W2ldfWV4cG9ydHMuaW5zdGFudGlhdGU9ZnVuY3Rpb24gaW5zdGFudGlhdGUoQmFzZSl7ZnVuY3Rpb24gQ0JDKG9wdGlvbnMpe0Jhc2UuY2FsbCh0aGlzLG9wdGlvbnMpLHRoaXMuX2NiY0luaXQoKX1pbmhlcml0cyhDQkMsQmFzZSk7Zm9yKHZhciBrZXlzPU9iamVjdC5rZXlzKHByb3RvKSxpPTA7aTxrZXlzLmxlbmd0aDtpKyspe3ZhciBrZXk9a2V5c1tpXTtDQkMucHJvdG90eXBlW2tleV09cHJvdG9ba2V5XX1yZXR1cm4gQ0JDLmNyZWF0ZT1mdW5jdGlvbiBjcmVhdGUob3B0aW9ucyl7cmV0dXJuIG5ldyBDQkMob3B0aW9ucyl9LENCQ30scHJvdG8uX2NiY0luaXQ9ZnVuY3Rpb24gX2NiY0luaXQoKXt2YXIgc3RhdGU9bmV3IENCQ1N0YXRlKHRoaXMub3B0aW9ucy5pdik7dGhpcy5fY2JjU3RhdGU9c3RhdGV9LHByb3RvLl91cGRhdGU9ZnVuY3Rpb24gX3VwZGF0ZShpbnAsaW5PZmYsb3V0LG91dE9mZil7dmFyIHN0YXRlPXRoaXMuX2NiY1N0YXRlLHN1cGVyUHJvdG89dGhpcy5jb25zdHJ1Y3Rvci5zdXBlcl8ucHJvdG90eXBlLGl2PXN0YXRlLml2O2lmKCJlbmNyeXB0Ij09PXRoaXMudHlwZSl7Zm9yKHZhciBpPTA7aTx0aGlzLmJsb2NrU2l6ZTtpKyspaXZbaV1ePWlucFtpbk9mZitpXTtzdXBlclByb3RvLl91cGRhdGUuY2FsbCh0aGlzLGl2LDAsb3V0LG91dE9mZik7Zm9yKGk9MDtpPHRoaXMuYmxvY2tTaXplO2krKylpdltpXT1vdXRbb3V0T2ZmK2ldfWVsc2V7c3VwZXJQcm90by5fdXBkYXRlLmNhbGwodGhpcyxpbnAsaW5PZmYsb3V0LG91dE9mZik7Zm9yKGk9MDtpPHRoaXMuYmxvY2tTaXplO2krKylvdXRbb3V0T2ZmK2ldXj1pdltpXTtmb3IoaT0wO2k8dGhpcy5ibG9ja1NpemU7aSsrKWl2W2ldPWlucFtpbk9mZitpXX19fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2Rlcy5qcy9saWIvZGVzL2NpcGhlci5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIGFzc2VydD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbWluaW1hbGlzdGljLWFzc2VydC9pbmRleC5qcyIpO2Z1bmN0aW9uIENpcGhlcihvcHRpb25zKXt0aGlzLm9wdGlvbnM9b3B0aW9ucyx0aGlzLnR5cGU9dGhpcy5vcHRpb25zLnR5cGUsdGhpcy5ibG9ja1NpemU9OCx0aGlzLl9pbml0KCksdGhpcy5idWZmZXI9bmV3IEFycmF5KHRoaXMuYmxvY2tTaXplKSx0aGlzLmJ1ZmZlck9mZj0wLHRoaXMucGFkZGluZz0hMSE9PW9wdGlvbnMucGFkZGluZ31tb2R1bGUuZXhwb3J0cz1DaXBoZXIsQ2lwaGVyLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbiBfaW5pdCgpe30sQ2lwaGVyLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24gdXBkYXRlKGRhdGEpe3JldHVybiAwPT09ZGF0YS5sZW5ndGg/W106ImRlY3J5cHQiPT09dGhpcy50eXBlP3RoaXMuX3VwZGF0ZURlY3J5cHQoZGF0YSk6dGhpcy5fdXBkYXRlRW5jcnlwdChkYXRhKX0sQ2lwaGVyLnByb3RvdHlwZS5fYnVmZmVyPWZ1bmN0aW9uIF9idWZmZXIoZGF0YSxvZmYpe2Zvcih2YXIgbWluPU1hdGgubWluKHRoaXMuYnVmZmVyLmxlbmd0aC10aGlzLmJ1ZmZlck9mZixkYXRhLmxlbmd0aC1vZmYpLGk9MDtpPG1pbjtpKyspdGhpcy5idWZmZXJbdGhpcy5idWZmZXJPZmYraV09ZGF0YVtvZmYraV07cmV0dXJuIHRoaXMuYnVmZmVyT2ZmKz1taW4sbWlufSxDaXBoZXIucHJvdG90eXBlLl9mbHVzaEJ1ZmZlcj1mdW5jdGlvbiBfZmx1c2hCdWZmZXIob3V0LG9mZil7cmV0dXJuIHRoaXMuX3VwZGF0ZSh0aGlzLmJ1ZmZlciwwLG91dCxvZmYpLHRoaXMuYnVmZmVyT2ZmPTAsdGhpcy5ibG9ja1NpemV9LENpcGhlci5wcm90b3R5cGUuX3VwZGF0ZUVuY3J5cHQ9ZnVuY3Rpb24gX3VwZGF0ZUVuY3J5cHQoZGF0YSl7dmFyIGlucHV0T2ZmPTAsb3V0cHV0T2ZmPTAsY291bnQ9KHRoaXMuYnVmZmVyT2ZmK2RhdGEubGVuZ3RoKS90aGlzLmJsb2NrU2l6ZXwwLG91dD1uZXcgQXJyYXkoY291bnQqdGhpcy5ibG9ja1NpemUpOzAhPT10aGlzLmJ1ZmZlck9mZiYmKGlucHV0T2ZmKz10aGlzLl9idWZmZXIoZGF0YSxpbnB1dE9mZiksdGhpcy5idWZmZXJPZmY9PT10aGlzLmJ1ZmZlci5sZW5ndGgmJihvdXRwdXRPZmYrPXRoaXMuX2ZsdXNoQnVmZmVyKG91dCxvdXRwdXRPZmYpKSk7Zm9yKHZhciBtYXg9ZGF0YS5sZW5ndGgtKGRhdGEubGVuZ3RoLWlucHV0T2ZmKSV0aGlzLmJsb2NrU2l6ZTtpbnB1dE9mZjxtYXg7aW5wdXRPZmYrPXRoaXMuYmxvY2tTaXplKXRoaXMuX3VwZGF0ZShkYXRhLGlucHV0T2ZmLG91dCxvdXRwdXRPZmYpLG91dHB1dE9mZis9dGhpcy5ibG9ja1NpemU7Zm9yKDtpbnB1dE9mZjxkYXRhLmxlbmd0aDtpbnB1dE9mZisrLHRoaXMuYnVmZmVyT2ZmKyspdGhpcy5idWZmZXJbdGhpcy5idWZmZXJPZmZdPWRhdGFbaW5wdXRPZmZdO3JldHVybiBvdXR9LENpcGhlci5wcm90b3R5cGUuX3VwZGF0ZURlY3J5cHQ9ZnVuY3Rpb24gX3VwZGF0ZURlY3J5cHQoZGF0YSl7Zm9yKHZhciBpbnB1dE9mZj0wLG91dHB1dE9mZj0wLGNvdW50PU1hdGguY2VpbCgodGhpcy5idWZmZXJPZmYrZGF0YS5sZW5ndGgpL3RoaXMuYmxvY2tTaXplKS0xLG91dD1uZXcgQXJyYXkoY291bnQqdGhpcy5ibG9ja1NpemUpO2NvdW50PjA7Y291bnQtLSlpbnB1dE9mZis9dGhpcy5fYnVmZmVyKGRhdGEsaW5wdXRPZmYpLG91dHB1dE9mZis9dGhpcy5fZmx1c2hCdWZmZXIob3V0LG91dHB1dE9mZik7cmV0dXJuIGlucHV0T2ZmKz10aGlzLl9idWZmZXIoZGF0YSxpbnB1dE9mZiksb3V0fSxDaXBoZXIucHJvdG90eXBlLmZpbmFsPWZ1bmN0aW9uIGZpbmFsKGJ1ZmZlcil7dmFyIGZpcnN0LGxhc3Q7cmV0dXJuIGJ1ZmZlciYmKGZpcnN0PXRoaXMudXBkYXRlKGJ1ZmZlcikpLGxhc3Q9ImVuY3J5cHQiPT09dGhpcy50eXBlP3RoaXMuX2ZpbmFsRW5jcnlwdCgpOnRoaXMuX2ZpbmFsRGVjcnlwdCgpLGZpcnN0P2ZpcnN0LmNvbmNhdChsYXN0KTpsYXN0fSxDaXBoZXIucHJvdG90eXBlLl9wYWQ9ZnVuY3Rpb24gX3BhZChidWZmZXIsb2ZmKXtpZigwPT09b2ZmKXJldHVybiExO2Zvcig7b2ZmPGJ1ZmZlci5sZW5ndGg7KWJ1ZmZlcltvZmYrK109MDtyZXR1cm4hMH0sQ2lwaGVyLnByb3RvdHlwZS5fZmluYWxFbmNyeXB0PWZ1bmN0aW9uIF9maW5hbEVuY3J5cHQoKXtpZighdGhpcy5fcGFkKHRoaXMuYnVmZmVyLHRoaXMuYnVmZmVyT2ZmKSlyZXR1cm5bXTt2YXIgb3V0PW5ldyBBcnJheSh0aGlzLmJsb2NrU2l6ZSk7cmV0dXJuIHRoaXMuX3VwZGF0ZSh0aGlzLmJ1ZmZlciwwLG91dCwwKSxvdXR9LENpcGhlci5wcm90b3R5cGUuX3VucGFkPWZ1bmN0aW9uIF91bnBhZChidWZmZXIpe3JldHVybiBidWZmZXJ9LENpcGhlci5wcm90b3R5cGUuX2ZpbmFsRGVjcnlwdD1mdW5jdGlvbiBfZmluYWxEZWNyeXB0KCl7YXNzZXJ0LmVxdWFsKHRoaXMuYnVmZmVyT2ZmLHRoaXMuYmxvY2tTaXplLCJOb3QgZW5vdWdoIGRhdGEgdG8gZGVjcnlwdCIpO3ZhciBvdXQ9bmV3IEFycmF5KHRoaXMuYmxvY2tTaXplKTtyZXR1cm4gdGhpcy5fZmx1c2hCdWZmZXIob3V0LDApLHRoaXMuX3VucGFkKG91dCl9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2Rlcy5qcy9saWIvZGVzL2Rlcy5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIGFzc2VydD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbWluaW1hbGlzdGljLWFzc2VydC9pbmRleC5qcyIpLGluaGVyaXRzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiksdXRpbHM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2Rlcy5qcy9saWIvZGVzL3V0aWxzLmpzIiksQ2lwaGVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9kZXMuanMvbGliL2Rlcy9jaXBoZXIuanMiKTtmdW5jdGlvbiBERVNTdGF0ZSgpe3RoaXMudG1wPW5ldyBBcnJheSgyKSx0aGlzLmtleXM9bnVsbH1mdW5jdGlvbiBERVMob3B0aW9ucyl7Q2lwaGVyLmNhbGwodGhpcyxvcHRpb25zKTt2YXIgc3RhdGU9bmV3IERFU1N0YXRlO3RoaXMuX2Rlc1N0YXRlPXN0YXRlLHRoaXMuZGVyaXZlS2V5cyhzdGF0ZSxvcHRpb25zLmtleSl9aW5oZXJpdHMoREVTLENpcGhlciksbW9kdWxlLmV4cG9ydHM9REVTLERFUy5jcmVhdGU9ZnVuY3Rpb24gY3JlYXRlKG9wdGlvbnMpe3JldHVybiBuZXcgREVTKG9wdGlvbnMpfTt2YXIgc2hpZnRUYWJsZT1bMSwxLDIsMiwyLDIsMiwyLDEsMiwyLDIsMiwyLDIsMV07REVTLnByb3RvdHlwZS5kZXJpdmVLZXlzPWZ1bmN0aW9uIGRlcml2ZUtleXMoc3RhdGUsa2V5KXtzdGF0ZS5rZXlzPW5ldyBBcnJheSgzMiksYXNzZXJ0LmVxdWFsKGtleS5sZW5ndGgsdGhpcy5ibG9ja1NpemUsIkludmFsaWQga2V5IGxlbmd0aCIpO3ZhciBrTD11dGlscy5yZWFkVUludDMyQkUoa2V5LDApLGtSPXV0aWxzLnJlYWRVSW50MzJCRShrZXksNCk7dXRpbHMucGMxKGtMLGtSLHN0YXRlLnRtcCwwKSxrTD1zdGF0ZS50bXBbMF0sa1I9c3RhdGUudG1wWzFdO2Zvcih2YXIgaT0wO2k8c3RhdGUua2V5cy5sZW5ndGg7aSs9Mil7dmFyIHNoaWZ0PXNoaWZ0VGFibGVbaT4+PjFdO2tMPXV0aWxzLnIyOHNobChrTCxzaGlmdCksa1I9dXRpbHMucjI4c2hsKGtSLHNoaWZ0KSx1dGlscy5wYzIoa0wsa1Isc3RhdGUua2V5cyxpKX19LERFUy5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbiBfdXBkYXRlKGlucCxpbk9mZixvdXQsb3V0T2ZmKXt2YXIgc3RhdGU9dGhpcy5fZGVzU3RhdGUsbD11dGlscy5yZWFkVUludDMyQkUoaW5wLGluT2ZmKSxyPXV0aWxzLnJlYWRVSW50MzJCRShpbnAsaW5PZmYrNCk7dXRpbHMuaXAobCxyLHN0YXRlLnRtcCwwKSxsPXN0YXRlLnRtcFswXSxyPXN0YXRlLnRtcFsxXSwiZW5jcnlwdCI9PT10aGlzLnR5cGU/dGhpcy5fZW5jcnlwdChzdGF0ZSxsLHIsc3RhdGUudG1wLDApOnRoaXMuX2RlY3J5cHQoc3RhdGUsbCxyLHN0YXRlLnRtcCwwKSxsPXN0YXRlLnRtcFswXSxyPXN0YXRlLnRtcFsxXSx1dGlscy53cml0ZVVJbnQzMkJFKG91dCxsLG91dE9mZiksdXRpbHMud3JpdGVVSW50MzJCRShvdXQscixvdXRPZmYrNCl9LERFUy5wcm90b3R5cGUuX3BhZD1mdW5jdGlvbiBfcGFkKGJ1ZmZlcixvZmYpe2lmKCExPT09dGhpcy5wYWRkaW5nKXJldHVybiExO2Zvcih2YXIgdmFsdWU9YnVmZmVyLmxlbmd0aC1vZmYsaT1vZmY7aTxidWZmZXIubGVuZ3RoO2krKylidWZmZXJbaV09dmFsdWU7cmV0dXJuITB9LERFUy5wcm90b3R5cGUuX3VucGFkPWZ1bmN0aW9uIF91bnBhZChidWZmZXIpe2lmKCExPT09dGhpcy5wYWRkaW5nKXJldHVybiBidWZmZXI7Zm9yKHZhciBwYWQ9YnVmZmVyW2J1ZmZlci5sZW5ndGgtMV0saT1idWZmZXIubGVuZ3RoLXBhZDtpPGJ1ZmZlci5sZW5ndGg7aSsrKWFzc2VydC5lcXVhbChidWZmZXJbaV0scGFkKTtyZXR1cm4gYnVmZmVyLnNsaWNlKDAsYnVmZmVyLmxlbmd0aC1wYWQpfSxERVMucHJvdG90eXBlLl9lbmNyeXB0PWZ1bmN0aW9uIF9lbmNyeXB0KHN0YXRlLGxTdGFydCxyU3RhcnQsb3V0LG9mZil7Zm9yKHZhciBsPWxTdGFydCxyPXJTdGFydCxpPTA7aTxzdGF0ZS5rZXlzLmxlbmd0aDtpKz0yKXt2YXIga2V5TD1zdGF0ZS5rZXlzW2ldLGtleVI9c3RhdGUua2V5c1tpKzFdO3V0aWxzLmV4cGFuZChyLHN0YXRlLnRtcCwwKSxrZXlMXj1zdGF0ZS50bXBbMF0sa2V5Ul49c3RhdGUudG1wWzFdO3ZhciBzPXV0aWxzLnN1YnN0aXR1dGUoa2V5TCxrZXlSKSx0PXI7cj0obF51dGlscy5wZXJtdXRlKHMpKT4+PjAsbD10fXV0aWxzLnJpcChyLGwsb3V0LG9mZil9LERFUy5wcm90b3R5cGUuX2RlY3J5cHQ9ZnVuY3Rpb24gX2RlY3J5cHQoc3RhdGUsbFN0YXJ0LHJTdGFydCxvdXQsb2ZmKXtmb3IodmFyIGw9clN0YXJ0LHI9bFN0YXJ0LGk9c3RhdGUua2V5cy5sZW5ndGgtMjtpPj0wO2ktPTIpe3ZhciBrZXlMPXN0YXRlLmtleXNbaV0sa2V5Uj1zdGF0ZS5rZXlzW2krMV07dXRpbHMuZXhwYW5kKGwsc3RhdGUudG1wLDApLGtleUxePXN0YXRlLnRtcFswXSxrZXlSXj1zdGF0ZS50bXBbMV07dmFyIHM9dXRpbHMuc3Vic3RpdHV0ZShrZXlMLGtleVIpLHQ9bDtsPShyXnV0aWxzLnBlcm11dGUocykpPj4+MCxyPXR9dXRpbHMucmlwKGwscixvdXQsb2ZmKX19LCIuLi8uLi9ub2RlX21vZHVsZXMvZGVzLmpzL2xpYi9kZXMvZWRlLmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgYXNzZXJ0PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9taW5pbWFsaXN0aWMtYXNzZXJ0L2luZGV4LmpzIiksaW5oZXJpdHM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiKSxDaXBoZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2Rlcy5qcy9saWIvZGVzL2NpcGhlci5qcyIpLERFUz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZGVzLmpzL2xpYi9kZXMvZGVzLmpzIik7ZnVuY3Rpb24gRURFU3RhdGUodHlwZSxrZXkpe2Fzc2VydC5lcXVhbChrZXkubGVuZ3RoLDI0LCJJbnZhbGlkIGtleSBsZW5ndGgiKTt2YXIgazE9a2V5LnNsaWNlKDAsOCksazI9a2V5LnNsaWNlKDgsMTYpLGszPWtleS5zbGljZSgxNiwyNCk7dGhpcy5jaXBoZXJzPSJlbmNyeXB0Ij09PXR5cGU/W0RFUy5jcmVhdGUoe3R5cGU6ImVuY3J5cHQiLGtleTprMX0pLERFUy5jcmVhdGUoe3R5cGU6ImRlY3J5cHQiLGtleTprMn0pLERFUy5jcmVhdGUoe3R5cGU6ImVuY3J5cHQiLGtleTprM30pXTpbREVTLmNyZWF0ZSh7dHlwZToiZGVjcnlwdCIsa2V5OmszfSksREVTLmNyZWF0ZSh7dHlwZToiZW5jcnlwdCIsa2V5OmsyfSksREVTLmNyZWF0ZSh7dHlwZToiZGVjcnlwdCIsa2V5OmsxfSldfWZ1bmN0aW9uIEVERShvcHRpb25zKXtDaXBoZXIuY2FsbCh0aGlzLG9wdGlvbnMpO3ZhciBzdGF0ZT1uZXcgRURFU3RhdGUodGhpcy50eXBlLHRoaXMub3B0aW9ucy5rZXkpO3RoaXMuX2VkZVN0YXRlPXN0YXRlfWluaGVyaXRzKEVERSxDaXBoZXIpLG1vZHVsZS5leHBvcnRzPUVERSxFREUuY3JlYXRlPWZ1bmN0aW9uIGNyZWF0ZShvcHRpb25zKXtyZXR1cm4gbmV3IEVERShvcHRpb25zKX0sRURFLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uIF91cGRhdGUoaW5wLGluT2ZmLG91dCxvdXRPZmYpe3ZhciBzdGF0ZT10aGlzLl9lZGVTdGF0ZTtzdGF0ZS5jaXBoZXJzWzBdLl91cGRhdGUoaW5wLGluT2ZmLG91dCxvdXRPZmYpLHN0YXRlLmNpcGhlcnNbMV0uX3VwZGF0ZShvdXQsb3V0T2ZmLG91dCxvdXRPZmYpLHN0YXRlLmNpcGhlcnNbMl0uX3VwZGF0ZShvdXQsb3V0T2ZmLG91dCxvdXRPZmYpfSxFREUucHJvdG90eXBlLl9wYWQ9REVTLnByb3RvdHlwZS5fcGFkLEVERS5wcm90b3R5cGUuX3VucGFkPURFUy5wcm90b3R5cGUuX3VucGFkfSwiLi4vLi4vbm9kZV9tb2R1bGVzL2Rlcy5qcy9saWIvZGVzL3V0aWxzLmpzIihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxleHBvcnRzKXsidXNlIHN0cmljdCI7ZXhwb3J0cy5yZWFkVUludDMyQkU9ZnVuY3Rpb24gcmVhZFVJbnQzMkJFKGJ5dGVzLG9mZil7cmV0dXJuKGJ5dGVzWzArb2ZmXTw8MjR8Ynl0ZXNbMStvZmZdPDwxNnxieXRlc1syK29mZl08PDh8Ynl0ZXNbMytvZmZdKT4+PjB9LGV4cG9ydHMud3JpdGVVSW50MzJCRT1mdW5jdGlvbiB3cml0ZVVJbnQzMkJFKGJ5dGVzLHZhbHVlLG9mZil7Ynl0ZXNbMCtvZmZdPXZhbHVlPj4+MjQsYnl0ZXNbMStvZmZdPXZhbHVlPj4+MTYmMjU1LGJ5dGVzWzIrb2ZmXT12YWx1ZT4+PjgmMjU1LGJ5dGVzWzMrb2ZmXT0yNTUmdmFsdWV9LGV4cG9ydHMuaXA9ZnVuY3Rpb24gaXAoaW5MLGluUixvdXQsb2ZmKXtmb3IodmFyIG91dEw9MCxvdXRSPTAsaT02O2k+PTA7aS09Mil7Zm9yKHZhciBqPTA7ajw9MjQ7ais9OClvdXRMPDw9MSxvdXRMfD1pblI+Pj5qK2kmMTtmb3Ioaj0wO2o8PTI0O2orPTgpb3V0TDw8PTEsb3V0THw9aW5MPj4+aitpJjF9Zm9yKGk9NjtpPj0wO2ktPTIpe2ZvcihqPTE7ajw9MjU7ais9OClvdXRSPDw9MSxvdXRSfD1pblI+Pj5qK2kmMTtmb3Ioaj0xO2o8PTI1O2orPTgpb3V0Ujw8PTEsb3V0Unw9aW5MPj4+aitpJjF9b3V0W29mZiswXT1vdXRMPj4+MCxvdXRbb2ZmKzFdPW91dFI+Pj4wfSxleHBvcnRzLnJpcD1mdW5jdGlvbiByaXAoaW5MLGluUixvdXQsb2ZmKXtmb3IodmFyIG91dEw9MCxvdXRSPTAsaT0wO2k8NDtpKyspZm9yKHZhciBqPTI0O2o+PTA7ai09OClvdXRMPDw9MSxvdXRMfD1pblI+Pj5qK2kmMSxvdXRMPDw9MSxvdXRMfD1pbkw+Pj5qK2kmMTtmb3IoaT00O2k8ODtpKyspZm9yKGo9MjQ7aj49MDtqLT04KW91dFI8PD0xLG91dFJ8PWluUj4+PmoraSYxLG91dFI8PD0xLG91dFJ8PWluTD4+PmoraSYxO291dFtvZmYrMF09b3V0TD4+PjAsb3V0W29mZisxXT1vdXRSPj4+MH0sZXhwb3J0cy5wYzE9ZnVuY3Rpb24gcGMxKGluTCxpblIsb3V0LG9mZil7Zm9yKHZhciBvdXRMPTAsb3V0Uj0wLGk9NztpPj01O2ktLSl7Zm9yKHZhciBqPTA7ajw9MjQ7ais9OClvdXRMPDw9MSxvdXRMfD1pblI+PmoraSYxO2ZvcihqPTA7ajw9MjQ7ais9OClvdXRMPDw9MSxvdXRMfD1pbkw+PmoraSYxfWZvcihqPTA7ajw9MjQ7ais9OClvdXRMPDw9MSxvdXRMfD1pblI+PmoraSYxO2ZvcihpPTE7aTw9MztpKyspe2ZvcihqPTA7ajw9MjQ7ais9OClvdXRSPDw9MSxvdXRSfD1pblI+PmoraSYxO2ZvcihqPTA7ajw9MjQ7ais9OClvdXRSPDw9MSxvdXRSfD1pbkw+PmoraSYxfWZvcihqPTA7ajw9MjQ7ais9OClvdXRSPDw9MSxvdXRSfD1pbkw+PmoraSYxO291dFtvZmYrMF09b3V0TD4+PjAsb3V0W29mZisxXT1vdXRSPj4+MH0sZXhwb3J0cy5yMjhzaGw9ZnVuY3Rpb24gcjI4c2hsKG51bSxzaGlmdCl7cmV0dXJuIG51bTw8c2hpZnQmMjY4NDM1NDU1fG51bT4+PjI4LXNoaWZ0fTt2YXIgcGMydGFibGU9WzE0LDExLDE3LDQsMjcsMjMsMjUsMCwxMywyMiw3LDE4LDUsOSwxNiwyNCwyLDIwLDEyLDIxLDEsOCwxNSwyNiwxNSw0LDI1LDE5LDksMSwyNiwxNiw1LDExLDIzLDgsMTIsNywxNywwLDIyLDMsMTAsMTQsNiwyMCwyNywyNF07ZXhwb3J0cy5wYzI9ZnVuY3Rpb24gcGMyKGluTCxpblIsb3V0LG9mZil7Zm9yKHZhciBvdXRMPTAsb3V0Uj0wLGxlbj1wYzJ0YWJsZS5sZW5ndGg+Pj4xLGk9MDtpPGxlbjtpKyspb3V0TDw8PTEsb3V0THw9aW5MPj4+cGMydGFibGVbaV0mMTtmb3IoaT1sZW47aTxwYzJ0YWJsZS5sZW5ndGg7aSsrKW91dFI8PD0xLG91dFJ8PWluUj4+PnBjMnRhYmxlW2ldJjE7b3V0W29mZiswXT1vdXRMPj4+MCxvdXRbb2ZmKzFdPW91dFI+Pj4wfSxleHBvcnRzLmV4cGFuZD1mdW5jdGlvbiBleHBhbmQocixvdXQsb2ZmKXt2YXIgb3V0TD0wLG91dFI9MDtvdXRMPSgxJnIpPDw1fHI+Pj4yNztmb3IodmFyIGk9MjM7aT49MTU7aS09NClvdXRMPDw9NixvdXRMfD1yPj4+aSY2Mztmb3IoaT0xMTtpPj0zO2ktPTQpb3V0Unw9cj4+PmkmNjMsb3V0Ujw8PTY7b3V0Unw9KDMxJnIpPDwxfHI+Pj4zMSxvdXRbb2ZmKzBdPW91dEw+Pj4wLG91dFtvZmYrMV09b3V0Uj4+PjB9O3ZhciBzVGFibGU9WzE0LDAsNCwxNSwxMyw3LDEsNCwyLDE0LDE1LDIsMTEsMTMsOCwxLDMsMTAsMTAsNiw2LDEyLDEyLDExLDUsOSw5LDUsMCwzLDcsOCw0LDE1LDEsMTIsMTQsOCw4LDIsMTMsNCw2LDksMiwxLDExLDcsMTUsNSwxMiwxMSw5LDMsNywxNCwzLDEwLDEwLDAsNSw2LDAsMTMsMTUsMywxLDEzLDgsNCwxNCw3LDYsMTUsMTEsMiwzLDgsNCwxNCw5LDEyLDcsMCwyLDEsMTMsMTAsMTIsNiwwLDksNSwxMSwxMCw1LDAsMTMsMTQsOCw3LDEwLDExLDEsMTAsMyw0LDE1LDEzLDQsMSwyLDUsMTEsOCw2LDEyLDcsNiwxMiw5LDAsMyw1LDIsMTQsMTUsOSwxMCwxMywwLDcsOSwwLDE0LDksNiwzLDMsNCwxNSw2LDUsMTAsMSwyLDEzLDgsMTIsNSw3LDE0LDExLDEyLDQsMTEsMiwxNSw4LDEsMTMsMSw2LDEwLDQsMTMsOSwwLDgsNiwxNSw5LDMsOCwwLDcsMTEsNCwxLDE1LDIsMTQsMTIsMyw1LDExLDEwLDUsMTQsMiw3LDEyLDcsMTMsMTMsOCwxNCwxMSwzLDUsMCw2LDYsMTUsOSwwLDEwLDMsMSw0LDIsNyw4LDIsNSwxMiwxMSwxLDEyLDEwLDQsMTQsMTUsOSwxMCwzLDYsMTUsOSwwLDAsNiwxMiwxMCwxMSwxLDcsMTMsMTMsOCwxNSw5LDEsNCwzLDUsMTQsMTEsNSwxMiwyLDcsOCwyLDQsMTQsMiwxNCwxMiwxMSw0LDIsMSwxMiw3LDQsMTAsNywxMSwxMyw2LDEsOCw1LDUsMCwzLDE1LDE1LDEwLDEzLDMsMCw5LDE0LDgsOSw2LDQsMTEsMiw4LDEsMTIsMTEsNywxMCwxLDEzLDE0LDcsMiw4LDEzLDE1LDYsOSwxNSwxMiwwLDUsOSw2LDEwLDMsNCwwLDUsMTQsMywxMiwxMCwxLDE1LDEwLDQsMTUsMiw5LDcsMiwxMiw2LDksOCw1LDAsNiwxMywxLDMsMTMsNCwxNCwxNCwwLDcsMTEsNSwzLDExLDgsOSw0LDE0LDMsMTUsMiw1LDEyLDIsOSw4LDUsMTIsMTUsMywxMCw3LDExLDAsMTQsNCwxLDEwLDcsMSw2LDEzLDAsMTEsOCw2LDEzLDQsMTMsMTEsMCwyLDExLDE0LDcsMTUsNCwwLDksOCwxLDEzLDEwLDMsMTQsMTIsMyw5LDUsNywxMiw1LDIsMTAsMTUsNiw4LDEsNiwxLDYsNCwxMSwxMSwxMywxMyw4LDEyLDEsMyw0LDcsMTAsMTQsNywxMCw5LDE1LDUsNiwwLDgsMTUsMCwxNCw1LDIsOSwzLDIsMTIsMTMsMSwyLDE1LDgsMTMsNCw4LDYsMTAsMTUsMywxMSw3LDEsNCwxMCwxMiw5LDUsMyw2LDE0LDExLDUsMCwwLDE0LDEyLDksNywyLDcsMiwxMSwxLDQsMTQsMSw3LDksNCwxMiwxMCwxNCw4LDIsMTMsMCwxNSw2LDEyLDEwLDksMTMsMCwxNSwzLDMsNSw1LDYsOCwxMV07ZXhwb3J0cy5zdWJzdGl0dXRlPWZ1bmN0aW9uIHN1YnN0aXR1dGUoaW5MLGluUil7Zm9yKHZhciBvdXQ9MCxpPTA7aTw0O2krKyl7b3V0PDw9NCxvdXR8PXNUYWJsZVs2NCppKyhpbkw+Pj4xOC02KmkmNjMpXX1mb3IoaT0wO2k8NDtpKyspe291dDw8PTQsb3V0fD1zVGFibGVbMjU2KzY0KmkrKGluUj4+PjE4LTYqaSY2MyldfXJldHVybiBvdXQ+Pj4wfTt2YXIgcGVybXV0ZVRhYmxlPVsxNiwyNSwxMiwxMSwzLDIwLDQsMTUsMzEsMTcsOSw2LDI3LDE0LDEsMjIsMzAsMjQsOCwxOCwwLDUsMjksMjMsMTMsMTksMiwyNiwxMCwyMSwyOCw3XTtleHBvcnRzLnBlcm11dGU9ZnVuY3Rpb24gcGVybXV0ZShudW0pe2Zvcih2YXIgb3V0PTAsaT0wO2k8cGVybXV0ZVRhYmxlLmxlbmd0aDtpKyspb3V0PDw9MSxvdXR8PW51bT4+PnBlcm11dGVUYWJsZVtpXSYxO3JldHVybiBvdXQ+Pj4wfSxleHBvcnRzLnBhZFNwbGl0PWZ1bmN0aW9uIHBhZFNwbGl0KG51bSxzaXplLGdyb3VwKXtmb3IodmFyIHN0cj1udW0udG9TdHJpbmcoMik7c3RyLmxlbmd0aDxzaXplOylzdHI9IjAiK3N0cjtmb3IodmFyIG91dD1bXSxpPTA7aTxzaXplO2krPWdyb3VwKW91dC5wdXNoKHN0ci5zbGljZShpLGkrZ3JvdXApKTtyZXR1cm4gb3V0LmpvaW4oIiAiKX19LCIuLi8uLi9ub2RlX21vZHVsZXMvZGlmZmllLWhlbGxtYW4vYnJvd3Nlci5qcyIoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXt2YXIgQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiKSxnZW5lcmF0ZVByaW1lPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9kaWZmaWUtaGVsbG1hbi9saWIvZ2VuZXJhdGVQcmltZS5qcyIpLHByaW1lcz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZGlmZmllLWhlbGxtYW4vbGliL3ByaW1lcy5qc29uIiksREg9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2RpZmZpZS1oZWxsbWFuL2xpYi9kaC5qcyIpO3ZhciBFTkNPRElOR1M9e2JpbmFyeTohMCxoZXg6ITAsYmFzZTY0OiEwfTtleHBvcnRzLkRpZmZpZUhlbGxtYW5Hcm91cD1leHBvcnRzLmNyZWF0ZURpZmZpZUhlbGxtYW5Hcm91cD1leHBvcnRzLmdldERpZmZpZUhlbGxtYW49ZnVuY3Rpb24gZ2V0RGlmZmllSGVsbG1hbihtb2Qpe3ZhciBwcmltZT1uZXcgQnVmZmVyKHByaW1lc1ttb2RdLnByaW1lLCJoZXgiKSxnZW49bmV3IEJ1ZmZlcihwcmltZXNbbW9kXS5nZW4sImhleCIpO3JldHVybiBuZXcgREgocHJpbWUsZ2VuKX0sZXhwb3J0cy5jcmVhdGVEaWZmaWVIZWxsbWFuPWV4cG9ydHMuRGlmZmllSGVsbG1hbj1mdW5jdGlvbiBjcmVhdGVEaWZmaWVIZWxsbWFuKHByaW1lLGVuYyxnZW5lcmF0b3IsZ2VuYyl7cmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcihlbmMpfHx2b2lkIDA9PT1FTkNPRElOR1NbZW5jXT9jcmVhdGVEaWZmaWVIZWxsbWFuKHByaW1lLCJiaW5hcnkiLGVuYyxnZW5lcmF0b3IpOihlbmM9ZW5jfHwiYmluYXJ5IixnZW5jPWdlbmN8fCJiaW5hcnkiLGdlbmVyYXRvcj1nZW5lcmF0b3J8fG5ldyBCdWZmZXIoWzJdKSxCdWZmZXIuaXNCdWZmZXIoZ2VuZXJhdG9yKXx8KGdlbmVyYXRvcj1uZXcgQnVmZmVyKGdlbmVyYXRvcixnZW5jKSksIm51bWJlciI9PXR5cGVvZiBwcmltZT9uZXcgREgoZ2VuZXJhdGVQcmltZShwcmltZSxnZW5lcmF0b3IpLGdlbmVyYXRvciwhMCk6KEJ1ZmZlci5pc0J1ZmZlcihwcmltZSl8fChwcmltZT1uZXcgQnVmZmVyKHByaW1lLGVuYykpLG5ldyBESChwcmltZSxnZW5lcmF0b3IsITApKSl9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2RpZmZpZS1oZWxsbWFuL2xpYi9kaC5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXt2YXIgQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiKSxCTj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYm4uanMvbGliL2JuLmpzIiksbWlsbGVyUmFiaW49bmV3KF9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9taWxsZXItcmFiaW4vbGliL21yLmpzIikpLFRXRU5UWUZPVVI9bmV3IEJOKDI0KSxFTEVWRU49bmV3IEJOKDExKSxURU49bmV3IEJOKDEwKSxUSFJFRT1uZXcgQk4oMyksU0VWRU49bmV3IEJOKDcpLHByaW1lcz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZGlmZmllLWhlbGxtYW4vbGliL2dlbmVyYXRlUHJpbWUuanMiKSxyYW5kb21CeXRlcz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvcmFuZG9tYnl0ZXMvYnJvd3Nlci5qcyIpO2Z1bmN0aW9uIHNldFB1YmxpY0tleShwdWIsZW5jKXtyZXR1cm4gZW5jPWVuY3x8InV0ZjgiLEJ1ZmZlci5pc0J1ZmZlcihwdWIpfHwocHViPW5ldyBCdWZmZXIocHViLGVuYykpLHRoaXMuX3B1Yj1uZXcgQk4ocHViKSx0aGlzfWZ1bmN0aW9uIHNldFByaXZhdGVLZXkocHJpdixlbmMpe3JldHVybiBlbmM9ZW5jfHwidXRmOCIsQnVmZmVyLmlzQnVmZmVyKHByaXYpfHwocHJpdj1uZXcgQnVmZmVyKHByaXYsZW5jKSksdGhpcy5fcHJpdj1uZXcgQk4ocHJpdiksdGhpc31tb2R1bGUuZXhwb3J0cz1ESDt2YXIgcHJpbWVDYWNoZT17fTtmdW5jdGlvbiBESChwcmltZSxnZW5lcmF0b3IsbWFsbGVhYmxlKXt0aGlzLnNldEdlbmVyYXRvcihnZW5lcmF0b3IpLHRoaXMuX19wcmltZT1uZXcgQk4ocHJpbWUpLHRoaXMuX3ByaW1lPUJOLm1vbnQodGhpcy5fX3ByaW1lKSx0aGlzLl9wcmltZUxlbj1wcmltZS5sZW5ndGgsdGhpcy5fcHViPXZvaWQgMCx0aGlzLl9wcml2PXZvaWQgMCx0aGlzLl9wcmltZUNvZGU9dm9pZCAwLG1hbGxlYWJsZT8odGhpcy5zZXRQdWJsaWNLZXk9c2V0UHVibGljS2V5LHRoaXMuc2V0UHJpdmF0ZUtleT1zZXRQcml2YXRlS2V5KTp0aGlzLl9wcmltZUNvZGU9OH1mdW5jdGlvbiBmb3JtYXRSZXR1cm5WYWx1ZShibixlbmMpe3ZhciBidWY9bmV3IEJ1ZmZlcihibi50b0FycmF5KCkpO3JldHVybiBlbmM/YnVmLnRvU3RyaW5nKGVuYyk6YnVmfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShESC5wcm90b3R5cGUsInZlcmlmeUVycm9yIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIHRoaXMuX3ByaW1lQ29kZSYmKHRoaXMuX3ByaW1lQ29kZT1mdW5jdGlvbiBjaGVja1ByaW1lKHByaW1lLGdlbmVyYXRvcil7dmFyIGdlbj1nZW5lcmF0b3IudG9TdHJpbmcoImhleCIpLGhleD1bZ2VuLHByaW1lLnRvU3RyaW5nKDE2KV0uam9pbigiXyIpO2lmKGhleCBpbiBwcmltZUNhY2hlKXJldHVybiBwcmltZUNhY2hlW2hleF07dmFyIHJlbSxlcnJvcj0wO2lmKHByaW1lLmlzRXZlbigpfHwhcHJpbWVzLnNpbXBsZVNpZXZlfHwhcHJpbWVzLmZlcm1hdFRlc3QocHJpbWUpfHwhbWlsbGVyUmFiaW4udGVzdChwcmltZSkpcmV0dXJuIGVycm9yKz0xLGVycm9yKz0iMDIiPT09Z2VufHwiMDUiPT09Z2VuPzg6NCxwcmltZUNhY2hlW2hleF09ZXJyb3IsZXJyb3I7c3dpdGNoKG1pbGxlclJhYmluLnRlc3QocHJpbWUuc2hybigxKSl8fChlcnJvcis9MiksZ2VuKXtjYXNlIjAyIjpwcmltZS5tb2QoVFdFTlRZRk9VUikuY21wKEVMRVZFTikmJihlcnJvcis9OCk7YnJlYWs7Y2FzZSIwNSI6KHJlbT1wcmltZS5tb2QoVEVOKSkuY21wKFRIUkVFKSYmcmVtLmNtcChTRVZFTikmJihlcnJvcis9OCk7YnJlYWs7ZGVmYXVsdDplcnJvcis9NH1yZXR1cm4gcHJpbWVDYWNoZVtoZXhdPWVycm9yLGVycm9yfSh0aGlzLl9fcHJpbWUsdGhpcy5fX2dlbikpLHRoaXMuX3ByaW1lQ29kZX19KSxESC5wcm90b3R5cGUuZ2VuZXJhdGVLZXlzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ByaXZ8fCh0aGlzLl9wcml2PW5ldyBCTihyYW5kb21CeXRlcyh0aGlzLl9wcmltZUxlbikpKSx0aGlzLl9wdWI9dGhpcy5fZ2VuLnRvUmVkKHRoaXMuX3ByaW1lKS5yZWRQb3codGhpcy5fcHJpdikuZnJvbVJlZCgpLHRoaXMuZ2V0UHVibGljS2V5KCl9LERILnByb3RvdHlwZS5jb21wdXRlU2VjcmV0PWZ1bmN0aW9uKG90aGVyKXt2YXIgc2VjcmV0PShvdGhlcj0ob3RoZXI9bmV3IEJOKG90aGVyKSkudG9SZWQodGhpcy5fcHJpbWUpKS5yZWRQb3codGhpcy5fcHJpdikuZnJvbVJlZCgpLG91dD1uZXcgQnVmZmVyKHNlY3JldC50b0FycmF5KCkpLHByaW1lPXRoaXMuZ2V0UHJpbWUoKTtpZihvdXQubGVuZ3RoPHByaW1lLmxlbmd0aCl7dmFyIGZyb250PW5ldyBCdWZmZXIocHJpbWUubGVuZ3RoLW91dC5sZW5ndGgpO2Zyb250LmZpbGwoMCksb3V0PUJ1ZmZlci5jb25jYXQoW2Zyb250LG91dF0pfXJldHVybiBvdXR9LERILnByb3RvdHlwZS5nZXRQdWJsaWNLZXk9ZnVuY3Rpb24gZ2V0UHVibGljS2V5KGVuYyl7cmV0dXJuIGZvcm1hdFJldHVyblZhbHVlKHRoaXMuX3B1YixlbmMpfSxESC5wcm90b3R5cGUuZ2V0UHJpdmF0ZUtleT1mdW5jdGlvbiBnZXRQcml2YXRlS2V5KGVuYyl7cmV0dXJuIGZvcm1hdFJldHVyblZhbHVlKHRoaXMuX3ByaXYsZW5jKX0sREgucHJvdG90eXBlLmdldFByaW1lPWZ1bmN0aW9uKGVuYyl7cmV0dXJuIGZvcm1hdFJldHVyblZhbHVlKHRoaXMuX19wcmltZSxlbmMpfSxESC5wcm90b3R5cGUuZ2V0R2VuZXJhdG9yPWZ1bmN0aW9uKGVuYyl7cmV0dXJuIGZvcm1hdFJldHVyblZhbHVlKHRoaXMuX2dlbixlbmMpfSxESC5wcm90b3R5cGUuc2V0R2VuZXJhdG9yPWZ1bmN0aW9uKGdlbixlbmMpe3JldHVybiBlbmM9ZW5jfHwidXRmOCIsQnVmZmVyLmlzQnVmZmVyKGdlbil8fChnZW49bmV3IEJ1ZmZlcihnZW4sZW5jKSksdGhpcy5fX2dlbj1nZW4sdGhpcy5fZ2VuPW5ldyBCTihnZW4pLHRoaXN9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2RpZmZpZS1oZWxsbWFuL2xpYi9nZW5lcmF0ZVByaW1lLmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pe3ZhciByYW5kb21CeXRlcz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvcmFuZG9tYnl0ZXMvYnJvd3Nlci5qcyIpO21vZHVsZS5leHBvcnRzPWZpbmRQcmltZSxmaW5kUHJpbWUuc2ltcGxlU2lldmU9c2ltcGxlU2lldmUsZmluZFByaW1lLmZlcm1hdFRlc3Q9ZmVybWF0VGVzdDt2YXIgQk49X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2JuLmpzL2xpYi9ibi5qcyIpLFRXRU5UWUZPVVI9bmV3IEJOKDI0KSxtaWxsZXJSYWJpbj1uZXcoX193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL21pbGxlci1yYWJpbi9saWIvbXIuanMiKSksT05FPW5ldyBCTigxKSxUV089bmV3IEJOKDIpLEZJVkU9bmV3IEJOKDUpLFRFTj0obmV3IEJOKDE2KSxuZXcgQk4oOCksbmV3IEJOKDEwKSksVEhSRUU9bmV3IEJOKDMpLEVMRVZFTj0obmV3IEJOKDcpLG5ldyBCTigxMSkpLEZPVVI9bmV3IEJOKDQpLHByaW1lcz0obmV3IEJOKDEyKSxudWxsKTtmdW5jdGlvbiBfZ2V0UHJpbWVzKCl7aWYobnVsbCE9PXByaW1lcylyZXR1cm4gcHJpbWVzO3ZhciByZXM9W107cmVzWzBdPTI7Zm9yKHZhciBpPTEsaz0zO2s8MTA0ODU3NjtrKz0yKXtmb3IodmFyIHNxcnQ9TWF0aC5jZWlsKE1hdGguc3FydChrKSksaj0wO2o8aSYmcmVzW2pdPD1zcXJ0JiZrJXJlc1tqXSE9PTA7aisrKTtpIT09aiYmcmVzW2pdPD1zcXJ0fHwocmVzW2krK109ayl9cmV0dXJuIHByaW1lcz1yZXMscmVzfWZ1bmN0aW9uIHNpbXBsZVNpZXZlKHApe2Zvcih2YXIgcHJpbWVzPV9nZXRQcmltZXMoKSxpPTA7aTxwcmltZXMubGVuZ3RoO2krKylpZigwPT09cC5tb2RuKHByaW1lc1tpXSkpcmV0dXJuIDA9PT1wLmNtcG4ocHJpbWVzW2ldKTtyZXR1cm4hMH1mdW5jdGlvbiBmZXJtYXRUZXN0KHApe3ZhciByZWQ9Qk4ubW9udChwKTtyZXR1cm4gMD09PVRXTy50b1JlZChyZWQpLnJlZFBvdyhwLnN1Ym4oMSkpLmZyb21SZWQoKS5jbXBuKDEpfWZ1bmN0aW9uIGZpbmRQcmltZShiaXRzLGdlbil7aWYoYml0czwxNilyZXR1cm4gbmV3IEJOKDI9PT1nZW58fDU9PT1nZW4/WzE0MCwxMjNdOlsxNDAsMzldKTt2YXIgbnVtLG4yO2ZvcihnZW49bmV3IEJOKGdlbik7Oyl7Zm9yKG51bT1uZXcgQk4ocmFuZG9tQnl0ZXMoTWF0aC5jZWlsKGJpdHMvOCkpKTtudW0uYml0TGVuZ3RoKCk+Yml0czspbnVtLmlzaHJuKDEpO2lmKG51bS5pc0V2ZW4oKSYmbnVtLmlhZGQoT05FKSxudW0udGVzdG4oMSl8fG51bS5pYWRkKFRXTyksZ2VuLmNtcChUV08pKXtpZighZ2VuLmNtcChGSVZFKSlmb3IoO251bS5tb2QoVEVOKS5jbXAoVEhSRUUpOyludW0uaWFkZChGT1VSKX1lbHNlIGZvcig7bnVtLm1vZChUV0VOVFlGT1VSKS5jbXAoRUxFVkVOKTspbnVtLmlhZGQoRk9VUik7aWYoc2ltcGxlU2lldmUobjI9bnVtLnNocm4oMSkpJiZzaW1wbGVTaWV2ZShudW0pJiZmZXJtYXRUZXN0KG4yKSYmZmVybWF0VGVzdChudW0pJiZtaWxsZXJSYWJpbi50ZXN0KG4yKSYmbWlsbGVyUmFiaW4udGVzdChudW0pKXJldHVybiBudW19fX0sIi4uLy4uL25vZGVfbW9kdWxlcy9kdW5kZXItcHJvdG8vZ2V0LmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgaGFzUHJvdG9BY2Nlc3NvcixjYWxsQmluZD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvaW5kZXguanMiKSxnT1BEPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9nb3BkL2luZGV4LmpzIik7dHJ5e2hhc1Byb3RvQWNjZXNzb3I9W10uX19wcm90b19fPT09QXJyYXkucHJvdG90eXBlfWNhdGNoKGUpe2lmKCFlfHwib2JqZWN0IiE9dHlwZW9mIGV8fCEoImNvZGUiaW4gZSl8fCJFUlJfUFJPVE9fQUNDRVNTIiE9PWUuY29kZSl0aHJvdyBlfXZhciBkZXNjPSEhaGFzUHJvdG9BY2Nlc3NvciYmZ09QRCYmZ09QRChPYmplY3QucHJvdG90eXBlLCJfX3Byb3RvX18iKSwkT2JqZWN0PU9iamVjdCwkZ2V0UHJvdG90eXBlT2Y9JE9iamVjdC5nZXRQcm90b3R5cGVPZjttb2R1bGUuZXhwb3J0cz1kZXNjJiYiZnVuY3Rpb24iPT10eXBlb2YgZGVzYy5nZXQ/Y2FsbEJpbmQoW2Rlc2MuZ2V0XSk6ImZ1bmN0aW9uIj09dHlwZW9mICRnZXRQcm90b3R5cGVPZiYmZnVuY3Rpb24gZ2V0RHVuZGVyKHZhbHVlKXtyZXR1cm4gJGdldFByb3RvdHlwZU9mKG51bGw9PXZhbHVlP3ZhbHVlOiRPYmplY3QodmFsdWUpKX19LCIuLi8uLi9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljLmpzIihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgZWxsaXB0aWM9ZXhwb3J0cztlbGxpcHRpYy52ZXJzaW9uPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9lbGxpcHRpYy9wYWNrYWdlLmpzb24iKS5yRSxlbGxpcHRpYy51dGlscz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL3V0aWxzLmpzIiksZWxsaXB0aWMucmFuZD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvcmFuZC9pbmRleC5qcyIpLGVsbGlwdGljLmN1cnZlPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvY3VydmUvaW5kZXguanMiKSxlbGxpcHRpYy5jdXJ2ZXM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy9jdXJ2ZXMuanMiKSxlbGxpcHRpYy5lYz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL2VjL2luZGV4LmpzIiksZWxsaXB0aWMuZWRkc2E9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy9lZGRzYS9pbmRleC5qcyIpfSwiLi4vLi4vbm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy9jdXJ2ZS9iYXNlLmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgQk49X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2JuLmpzL2xpYi9ibi5qcyIpLHV0aWxzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvdXRpbHMuanMiKSxnZXROQUY9dXRpbHMuZ2V0TkFGLGdldEpTRj11dGlscy5nZXRKU0YsYXNzZXJ0PXV0aWxzLmFzc2VydDtmdW5jdGlvbiBCYXNlQ3VydmUodHlwZSxjb25mKXt0aGlzLnR5cGU9dHlwZSx0aGlzLnA9bmV3IEJOKGNvbmYucCwxNiksdGhpcy5yZWQ9Y29uZi5wcmltZT9CTi5yZWQoY29uZi5wcmltZSk6Qk4ubW9udCh0aGlzLnApLHRoaXMuemVybz1uZXcgQk4oMCkudG9SZWQodGhpcy5yZWQpLHRoaXMub25lPW5ldyBCTigxKS50b1JlZCh0aGlzLnJlZCksdGhpcy50d289bmV3IEJOKDIpLnRvUmVkKHRoaXMucmVkKSx0aGlzLm49Y29uZi5uJiZuZXcgQk4oY29uZi5uLDE2KSx0aGlzLmc9Y29uZi5nJiZ0aGlzLnBvaW50RnJvbUpTT04oY29uZi5nLGNvbmYuZ1JlZCksdGhpcy5fd25hZlQxPW5ldyBBcnJheSg0KSx0aGlzLl93bmFmVDI9bmV3IEFycmF5KDQpLHRoaXMuX3duYWZUMz1uZXcgQXJyYXkoNCksdGhpcy5fd25hZlQ0PW5ldyBBcnJheSg0KSx0aGlzLl9iaXRMZW5ndGg9dGhpcy5uP3RoaXMubi5iaXRMZW5ndGgoKTowO3ZhciBhZGp1c3RDb3VudD10aGlzLm4mJnRoaXMucC5kaXYodGhpcy5uKTshYWRqdXN0Q291bnR8fGFkanVzdENvdW50LmNtcG4oMTAwKT4wP3RoaXMucmVkTj1udWxsOih0aGlzLl9tYXh3ZWxsVHJpY2s9ITAsdGhpcy5yZWROPXRoaXMubi50b1JlZCh0aGlzLnJlZCkpfWZ1bmN0aW9uIEJhc2VQb2ludChjdXJ2ZSx0eXBlKXt0aGlzLmN1cnZlPWN1cnZlLHRoaXMudHlwZT10eXBlLHRoaXMucHJlY29tcHV0ZWQ9bnVsbH1tb2R1bGUuZXhwb3J0cz1CYXNlQ3VydmUsQmFzZUN1cnZlLnByb3RvdHlwZS5wb2ludD1mdW5jdGlvbiBwb2ludCgpe3Rocm93IG5ldyBFcnJvcigiTm90IGltcGxlbWVudGVkIil9LEJhc2VDdXJ2ZS5wcm90b3R5cGUudmFsaWRhdGU9ZnVuY3Rpb24gdmFsaWRhdGUoKXt0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCIpfSxCYXNlQ3VydmUucHJvdG90eXBlLl9maXhlZE5hZk11bD1mdW5jdGlvbiBfZml4ZWROYWZNdWwocCxrKXthc3NlcnQocC5wcmVjb21wdXRlZCk7dmFyIGRvdWJsZXM9cC5fZ2V0RG91YmxlcygpLG5hZj1nZXROQUYoaywxLHRoaXMuX2JpdExlbmd0aCksST0oMTw8ZG91Ymxlcy5zdGVwKzEpLShkb3VibGVzLnN0ZXAlMj09MD8yOjEpO0kvPTM7dmFyIGosbmFmVyxyZXByPVtdO2ZvcihqPTA7ajxuYWYubGVuZ3RoO2orPWRvdWJsZXMuc3RlcCl7bmFmVz0wO2Zvcih2YXIgbD1qK2RvdWJsZXMuc3RlcC0xO2w+PWo7bC0tKW5hZlc9KG5hZlc8PDEpK25hZltsXTtyZXByLnB1c2gobmFmVyl9Zm9yKHZhciBhPXRoaXMuanBvaW50KG51bGwsbnVsbCxudWxsKSxiPXRoaXMuanBvaW50KG51bGwsbnVsbCxudWxsKSxpPUk7aT4wO2ktLSl7Zm9yKGo9MDtqPHJlcHIubGVuZ3RoO2orKykobmFmVz1yZXByW2pdKT09PWk/Yj1iLm1peGVkQWRkKGRvdWJsZXMucG9pbnRzW2pdKTpuYWZXPT09LWkmJihiPWIubWl4ZWRBZGQoZG91Ymxlcy5wb2ludHNbal0ubmVnKCkpKTthPWEuYWRkKGIpfXJldHVybiBhLnRvUCgpfSxCYXNlQ3VydmUucHJvdG90eXBlLl93bmFmTXVsPWZ1bmN0aW9uIF93bmFmTXVsKHAsayl7dmFyIHc9NCxuYWZQb2ludHM9cC5fZ2V0TkFGUG9pbnRzKHcpO3c9bmFmUG9pbnRzLnduZDtmb3IodmFyIHduZD1uYWZQb2ludHMucG9pbnRzLG5hZj1nZXROQUYoayx3LHRoaXMuX2JpdExlbmd0aCksYWNjPXRoaXMuanBvaW50KG51bGwsbnVsbCxudWxsKSxpPW5hZi5sZW5ndGgtMTtpPj0wO2ktLSl7Zm9yKHZhciBsPTA7aT49MCYmMD09PW5hZltpXTtpLS0pbCsrO2lmKGk+PTAmJmwrKyxhY2M9YWNjLmRibHAobCksaTwwKWJyZWFrO3ZhciB6PW5hZltpXTthc3NlcnQoMCE9PXopLGFjYz0iYWZmaW5lIj09PXAudHlwZT96PjA/YWNjLm1peGVkQWRkKHduZFt6LTE+PjFdKTphY2MubWl4ZWRBZGQod25kWy16LTE+PjFdLm5lZygpKTp6PjA/YWNjLmFkZCh3bmRbei0xPj4xXSk6YWNjLmFkZCh3bmRbLXotMT4+MV0ubmVnKCkpfXJldHVybiJhZmZpbmUiPT09cC50eXBlP2FjYy50b1AoKTphY2N9LEJhc2VDdXJ2ZS5wcm90b3R5cGUuX3duYWZNdWxBZGQ9ZnVuY3Rpb24gX3duYWZNdWxBZGQoZGVmVyxwb2ludHMsY29lZmZzLGxlbixqYWNvYmlhblJlc3VsdCl7dmFyIGksaixwLHduZFdpZHRoPXRoaXMuX3duYWZUMSx3bmQ9dGhpcy5fd25hZlQyLG5hZj10aGlzLl93bmFmVDMsbWF4PTA7Zm9yKGk9MDtpPGxlbjtpKyspe3ZhciBuYWZQb2ludHM9KHA9cG9pbnRzW2ldKS5fZ2V0TkFGUG9pbnRzKGRlZlcpO3duZFdpZHRoW2ldPW5hZlBvaW50cy53bmQsd25kW2ldPW5hZlBvaW50cy5wb2ludHN9Zm9yKGk9bGVuLTE7aT49MTtpLT0yKXt2YXIgYT1pLTEsYj1pO2lmKDE9PT13bmRXaWR0aFthXSYmMT09PXduZFdpZHRoW2JdKXt2YXIgY29tYj1bcG9pbnRzW2FdLG51bGwsbnVsbCxwb2ludHNbYl1dOzA9PT1wb2ludHNbYV0ueS5jbXAocG9pbnRzW2JdLnkpPyhjb21iWzFdPXBvaW50c1thXS5hZGQocG9pbnRzW2JdKSxjb21iWzJdPXBvaW50c1thXS50b0ooKS5taXhlZEFkZChwb2ludHNbYl0ubmVnKCkpKTowPT09cG9pbnRzW2FdLnkuY21wKHBvaW50c1tiXS55LnJlZE5lZygpKT8oY29tYlsxXT1wb2ludHNbYV0udG9KKCkubWl4ZWRBZGQocG9pbnRzW2JdKSxjb21iWzJdPXBvaW50c1thXS5hZGQocG9pbnRzW2JdLm5lZygpKSk6KGNvbWJbMV09cG9pbnRzW2FdLnRvSigpLm1peGVkQWRkKHBvaW50c1tiXSksY29tYlsyXT1wb2ludHNbYV0udG9KKCkubWl4ZWRBZGQocG9pbnRzW2JdLm5lZygpKSk7dmFyIGluZGV4PVstMywtMSwtNSwtNywwLDcsNSwxLDNdLGpzZj1nZXRKU0YoY29lZmZzW2FdLGNvZWZmc1tiXSk7Zm9yKG1heD1NYXRoLm1heChqc2ZbMF0ubGVuZ3RoLG1heCksbmFmW2FdPW5ldyBBcnJheShtYXgpLG5hZltiXT1uZXcgQXJyYXkobWF4KSxqPTA7ajxtYXg7aisrKXt2YXIgamE9MHxqc2ZbMF1bal0samI9MHxqc2ZbMV1bal07bmFmW2FdW2pdPWluZGV4WzMqKGphKzEpKyhqYisxKV0sbmFmW2JdW2pdPTAsd25kW2FdPWNvbWJ9fWVsc2UgbmFmW2FdPWdldE5BRihjb2VmZnNbYV0sd25kV2lkdGhbYV0sdGhpcy5fYml0TGVuZ3RoKSxuYWZbYl09Z2V0TkFGKGNvZWZmc1tiXSx3bmRXaWR0aFtiXSx0aGlzLl9iaXRMZW5ndGgpLG1heD1NYXRoLm1heChuYWZbYV0ubGVuZ3RoLG1heCksbWF4PU1hdGgubWF4KG5hZltiXS5sZW5ndGgsbWF4KX12YXIgYWNjPXRoaXMuanBvaW50KG51bGwsbnVsbCxudWxsKSx0bXA9dGhpcy5fd25hZlQ0O2ZvcihpPW1heDtpPj0wO2ktLSl7Zm9yKHZhciBrPTA7aT49MDspe3ZhciB6ZXJvPSEwO2ZvcihqPTA7ajxsZW47aisrKXRtcFtqXT0wfG5hZltqXVtpXSwwIT09dG1wW2pdJiYoemVybz0hMSk7aWYoIXplcm8pYnJlYWs7aysrLGktLX1pZihpPj0wJiZrKyssYWNjPWFjYy5kYmxwKGspLGk8MClicmVhaztmb3Ioaj0wO2o8bGVuO2orKyl7dmFyIHo9dG1wW2pdOzAhPT16JiYoej4wP3A9d25kW2pdW3otMT4+MV06ejwwJiYocD13bmRbal1bLXotMT4+MV0ubmVnKCkpLGFjYz0iYWZmaW5lIj09PXAudHlwZT9hY2MubWl4ZWRBZGQocCk6YWNjLmFkZChwKSl9fWZvcihpPTA7aTxsZW47aSsrKXduZFtpXT1udWxsO3JldHVybiBqYWNvYmlhblJlc3VsdD9hY2M6YWNjLnRvUCgpfSxCYXNlQ3VydmUuQmFzZVBvaW50PUJhc2VQb2ludCxCYXNlUG9pbnQucHJvdG90eXBlLmVxPWZ1bmN0aW9uIGVxKCl7dGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQiKX0sQmFzZVBvaW50LnByb3RvdHlwZS52YWxpZGF0ZT1mdW5jdGlvbiB2YWxpZGF0ZSgpe3JldHVybiB0aGlzLmN1cnZlLnZhbGlkYXRlKHRoaXMpfSxCYXNlQ3VydmUucHJvdG90eXBlLmRlY29kZVBvaW50PWZ1bmN0aW9uIGRlY29kZVBvaW50KGJ5dGVzLGVuYyl7Ynl0ZXM9dXRpbHMudG9BcnJheShieXRlcyxlbmMpO3ZhciBsZW49dGhpcy5wLmJ5dGVMZW5ndGgoKTtpZigoND09PWJ5dGVzWzBdfHw2PT09Ynl0ZXNbMF18fDc9PT1ieXRlc1swXSkmJmJ5dGVzLmxlbmd0aC0xPT0yKmxlbilyZXR1cm4gNj09PWJ5dGVzWzBdP2Fzc2VydChieXRlc1tieXRlcy5sZW5ndGgtMV0lMj09MCk6Nz09PWJ5dGVzWzBdJiZhc3NlcnQoYnl0ZXNbYnl0ZXMubGVuZ3RoLTFdJTI9PTEpLHRoaXMucG9pbnQoYnl0ZXMuc2xpY2UoMSwxK2xlbiksYnl0ZXMuc2xpY2UoMStsZW4sMSsyKmxlbikpO2lmKCgyPT09Ynl0ZXNbMF18fDM9PT1ieXRlc1swXSkmJmJ5dGVzLmxlbmd0aC0xPT09bGVuKXJldHVybiB0aGlzLnBvaW50RnJvbVgoYnl0ZXMuc2xpY2UoMSwxK2xlbiksMz09PWJ5dGVzWzBdKTt0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gcG9pbnQgZm9ybWF0Iil9LEJhc2VQb2ludC5wcm90b3R5cGUuZW5jb2RlQ29tcHJlc3NlZD1mdW5jdGlvbiBlbmNvZGVDb21wcmVzc2VkKGVuYyl7cmV0dXJuIHRoaXMuZW5jb2RlKGVuYywhMCl9LEJhc2VQb2ludC5wcm90b3R5cGUuX2VuY29kZT1mdW5jdGlvbiBfZW5jb2RlKGNvbXBhY3Qpe3ZhciBsZW49dGhpcy5jdXJ2ZS5wLmJ5dGVMZW5ndGgoKSx4PXRoaXMuZ2V0WCgpLnRvQXJyYXkoImJlIixsZW4pO3JldHVybiBjb21wYWN0P1t0aGlzLmdldFkoKS5pc0V2ZW4oKT8yOjNdLmNvbmNhdCh4KTpbNF0uY29uY2F0KHgsdGhpcy5nZXRZKCkudG9BcnJheSgiYmUiLGxlbikpfSxCYXNlUG9pbnQucHJvdG90eXBlLmVuY29kZT1mdW5jdGlvbiBlbmNvZGUoZW5jLGNvbXBhY3Qpe3JldHVybiB1dGlscy5lbmNvZGUodGhpcy5fZW5jb2RlKGNvbXBhY3QpLGVuYyl9LEJhc2VQb2ludC5wcm90b3R5cGUucHJlY29tcHV0ZT1mdW5jdGlvbiBwcmVjb21wdXRlKHBvd2VyKXtpZih0aGlzLnByZWNvbXB1dGVkKXJldHVybiB0aGlzO3ZhciBwcmVjb21wdXRlZD17ZG91YmxlczpudWxsLG5hZjpudWxsLGJldGE6bnVsbH07cmV0dXJuIHByZWNvbXB1dGVkLm5hZj10aGlzLl9nZXROQUZQb2ludHMoOCkscHJlY29tcHV0ZWQuZG91Ymxlcz10aGlzLl9nZXREb3VibGVzKDQscG93ZXIpLHByZWNvbXB1dGVkLmJldGE9dGhpcy5fZ2V0QmV0YSgpLHRoaXMucHJlY29tcHV0ZWQ9cHJlY29tcHV0ZWQsdGhpc30sQmFzZVBvaW50LnByb3RvdHlwZS5faGFzRG91Ymxlcz1mdW5jdGlvbiBfaGFzRG91YmxlcyhrKXtpZighdGhpcy5wcmVjb21wdXRlZClyZXR1cm4hMTt2YXIgZG91Ymxlcz10aGlzLnByZWNvbXB1dGVkLmRvdWJsZXM7cmV0dXJuISFkb3VibGVzJiZkb3VibGVzLnBvaW50cy5sZW5ndGg+PU1hdGguY2VpbCgoay5iaXRMZW5ndGgoKSsxKS9kb3VibGVzLnN0ZXApfSxCYXNlUG9pbnQucHJvdG90eXBlLl9nZXREb3VibGVzPWZ1bmN0aW9uIF9nZXREb3VibGVzKHN0ZXAscG93ZXIpe2lmKHRoaXMucHJlY29tcHV0ZWQmJnRoaXMucHJlY29tcHV0ZWQuZG91YmxlcylyZXR1cm4gdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzO2Zvcih2YXIgZG91Ymxlcz1bdGhpc10sYWNjPXRoaXMsaT0wO2k8cG93ZXI7aSs9c3RlcCl7Zm9yKHZhciBqPTA7ajxzdGVwO2orKylhY2M9YWNjLmRibCgpO2RvdWJsZXMucHVzaChhY2MpfXJldHVybntzdGVwLHBvaW50czpkb3VibGVzfX0sQmFzZVBvaW50LnByb3RvdHlwZS5fZ2V0TkFGUG9pbnRzPWZ1bmN0aW9uIF9nZXROQUZQb2ludHMod25kKXtpZih0aGlzLnByZWNvbXB1dGVkJiZ0aGlzLnByZWNvbXB1dGVkLm5hZilyZXR1cm4gdGhpcy5wcmVjb21wdXRlZC5uYWY7Zm9yKHZhciByZXM9W3RoaXNdLG1heD0oMTw8d25kKS0xLGRibD0xPT09bWF4P251bGw6dGhpcy5kYmwoKSxpPTE7aTxtYXg7aSsrKXJlc1tpXT1yZXNbaS0xXS5hZGQoZGJsKTtyZXR1cm57d25kLHBvaW50czpyZXN9fSxCYXNlUG9pbnQucHJvdG90eXBlLl9nZXRCZXRhPWZ1bmN0aW9uIF9nZXRCZXRhKCl7cmV0dXJuIG51bGx9LEJhc2VQb2ludC5wcm90b3R5cGUuZGJscD1mdW5jdGlvbiBkYmxwKGspe2Zvcih2YXIgcj10aGlzLGk9MDtpPGs7aSsrKXI9ci5kYmwoKTtyZXR1cm4gcn19LCIuLi8uLi9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL2N1cnZlL2Vkd2FyZHMuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciB1dGlscz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL3V0aWxzLmpzIiksQk49X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2JuLmpzL2xpYi9ibi5qcyIpLGluaGVyaXRzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiksQmFzZT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL2N1cnZlL2Jhc2UuanMiKSxhc3NlcnQ9dXRpbHMuYXNzZXJ0O2Z1bmN0aW9uIEVkd2FyZHNDdXJ2ZShjb25mKXt0aGlzLnR3aXN0ZWQ9MSE9KDB8Y29uZi5hKSx0aGlzLm1PbmVBPXRoaXMudHdpc3RlZCYmLTE9PSgwfGNvbmYuYSksdGhpcy5leHRlbmRlZD10aGlzLm1PbmVBLEJhc2UuY2FsbCh0aGlzLCJlZHdhcmRzIixjb25mKSx0aGlzLmE9bmV3IEJOKGNvbmYuYSwxNikudW1vZCh0aGlzLnJlZC5tKSx0aGlzLmE9dGhpcy5hLnRvUmVkKHRoaXMucmVkKSx0aGlzLmM9bmV3IEJOKGNvbmYuYywxNikudG9SZWQodGhpcy5yZWQpLHRoaXMuYzI9dGhpcy5jLnJlZFNxcigpLHRoaXMuZD1uZXcgQk4oY29uZi5kLDE2KS50b1JlZCh0aGlzLnJlZCksdGhpcy5kZD10aGlzLmQucmVkQWRkKHRoaXMuZCksYXNzZXJ0KCF0aGlzLnR3aXN0ZWR8fDA9PT10aGlzLmMuZnJvbVJlZCgpLmNtcG4oMSkpLHRoaXMub25lQz0xPT0oMHxjb25mLmMpfWZ1bmN0aW9uIFBvaW50KGN1cnZlLHgseSx6LHQpe0Jhc2UuQmFzZVBvaW50LmNhbGwodGhpcyxjdXJ2ZSwicHJvamVjdGl2ZSIpLG51bGw9PT14JiZudWxsPT09eSYmbnVsbD09PXo/KHRoaXMueD10aGlzLmN1cnZlLnplcm8sdGhpcy55PXRoaXMuY3VydmUub25lLHRoaXMuej10aGlzLmN1cnZlLm9uZSx0aGlzLnQ9dGhpcy5jdXJ2ZS56ZXJvLHRoaXMuek9uZT0hMCk6KHRoaXMueD1uZXcgQk4oeCwxNiksdGhpcy55PW5ldyBCTih5LDE2KSx0aGlzLno9ej9uZXcgQk4oeiwxNik6dGhpcy5jdXJ2ZS5vbmUsdGhpcy50PXQmJm5ldyBCTih0LDE2KSx0aGlzLngucmVkfHwodGhpcy54PXRoaXMueC50b1JlZCh0aGlzLmN1cnZlLnJlZCkpLHRoaXMueS5yZWR8fCh0aGlzLnk9dGhpcy55LnRvUmVkKHRoaXMuY3VydmUucmVkKSksdGhpcy56LnJlZHx8KHRoaXMuej10aGlzLnoudG9SZWQodGhpcy5jdXJ2ZS5yZWQpKSx0aGlzLnQmJiF0aGlzLnQucmVkJiYodGhpcy50PXRoaXMudC50b1JlZCh0aGlzLmN1cnZlLnJlZCkpLHRoaXMuek9uZT10aGlzLno9PT10aGlzLmN1cnZlLm9uZSx0aGlzLmN1cnZlLmV4dGVuZGVkJiYhdGhpcy50JiYodGhpcy50PXRoaXMueC5yZWRNdWwodGhpcy55KSx0aGlzLnpPbmV8fCh0aGlzLnQ9dGhpcy50LnJlZE11bCh0aGlzLnoucmVkSW52bSgpKSkpKX1pbmhlcml0cyhFZHdhcmRzQ3VydmUsQmFzZSksbW9kdWxlLmV4cG9ydHM9RWR3YXJkc0N1cnZlLEVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUuX211bEE9ZnVuY3Rpb24gX211bEEobnVtKXtyZXR1cm4gdGhpcy5tT25lQT9udW0ucmVkTmVnKCk6dGhpcy5hLnJlZE11bChudW0pfSxFZHdhcmRzQ3VydmUucHJvdG90eXBlLl9tdWxDPWZ1bmN0aW9uIF9tdWxDKG51bSl7cmV0dXJuIHRoaXMub25lQz9udW06dGhpcy5jLnJlZE11bChudW0pfSxFZHdhcmRzQ3VydmUucHJvdG90eXBlLmpwb2ludD1mdW5jdGlvbiBqcG9pbnQoeCx5LHosdCl7cmV0dXJuIHRoaXMucG9pbnQoeCx5LHosdCl9LEVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tWD1mdW5jdGlvbiBwb2ludEZyb21YKHgsb2RkKXsoeD1uZXcgQk4oeCwxNikpLnJlZHx8KHg9eC50b1JlZCh0aGlzLnJlZCkpO3ZhciB4Mj14LnJlZFNxcigpLHJocz10aGlzLmMyLnJlZFN1Yih0aGlzLmEucmVkTXVsKHgyKSksbGhzPXRoaXMub25lLnJlZFN1Yih0aGlzLmMyLnJlZE11bCh0aGlzLmQpLnJlZE11bCh4MikpLHkyPXJocy5yZWRNdWwobGhzLnJlZEludm0oKSkseT15Mi5yZWRTcXJ0KCk7aWYoMCE9PXkucmVkU3FyKCkucmVkU3ViKHkyKS5jbXAodGhpcy56ZXJvKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgcG9pbnQiKTt2YXIgaXNPZGQ9eS5mcm9tUmVkKCkuaXNPZGQoKTtyZXR1cm4ob2RkJiYhaXNPZGR8fCFvZGQmJmlzT2RkKSYmKHk9eS5yZWROZWcoKSksdGhpcy5wb2ludCh4LHkpfSxFZHdhcmRzQ3VydmUucHJvdG90eXBlLnBvaW50RnJvbVk9ZnVuY3Rpb24gcG9pbnRGcm9tWSh5LG9kZCl7KHk9bmV3IEJOKHksMTYpKS5yZWR8fCh5PXkudG9SZWQodGhpcy5yZWQpKTt2YXIgeTI9eS5yZWRTcXIoKSxsaHM9eTIucmVkU3ViKHRoaXMuYzIpLHJocz15Mi5yZWRNdWwodGhpcy5kKS5yZWRNdWwodGhpcy5jMikucmVkU3ViKHRoaXMuYSkseDI9bGhzLnJlZE11bChyaHMucmVkSW52bSgpKTtpZigwPT09eDIuY21wKHRoaXMuemVybykpe2lmKG9kZCl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgcG9pbnQiKTtyZXR1cm4gdGhpcy5wb2ludCh0aGlzLnplcm8seSl9dmFyIHg9eDIucmVkU3FydCgpO2lmKDAhPT14LnJlZFNxcigpLnJlZFN1Yih4MikuY21wKHRoaXMuemVybykpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHBvaW50Iik7cmV0dXJuIHguZnJvbVJlZCgpLmlzT2RkKCkhPT1vZGQmJih4PXgucmVkTmVnKCkpLHRoaXMucG9pbnQoeCx5KX0sRWR3YXJkc0N1cnZlLnByb3RvdHlwZS52YWxpZGF0ZT1mdW5jdGlvbiB2YWxpZGF0ZShwb2ludCl7aWYocG9pbnQuaXNJbmZpbml0eSgpKXJldHVybiEwO3BvaW50Lm5vcm1hbGl6ZSgpO3ZhciB4Mj1wb2ludC54LnJlZFNxcigpLHkyPXBvaW50LnkucmVkU3FyKCksbGhzPXgyLnJlZE11bCh0aGlzLmEpLnJlZEFkZCh5MikscmhzPXRoaXMuYzIucmVkTXVsKHRoaXMub25lLnJlZEFkZCh0aGlzLmQucmVkTXVsKHgyKS5yZWRNdWwoeTIpKSk7cmV0dXJuIDA9PT1saHMuY21wKHJocyl9LGluaGVyaXRzKFBvaW50LEJhc2UuQmFzZVBvaW50KSxFZHdhcmRzQ3VydmUucHJvdG90eXBlLnBvaW50RnJvbUpTT049ZnVuY3Rpb24gcG9pbnRGcm9tSlNPTihvYmope3JldHVybiBQb2ludC5mcm9tSlNPTih0aGlzLG9iail9LEVkd2FyZHNDdXJ2ZS5wcm90b3R5cGUucG9pbnQ9ZnVuY3Rpb24gcG9pbnQoeCx5LHosdCl7cmV0dXJuIG5ldyBQb2ludCh0aGlzLHgseSx6LHQpfSxQb2ludC5mcm9tSlNPTj1mdW5jdGlvbiBmcm9tSlNPTihjdXJ2ZSxvYmope3JldHVybiBuZXcgUG9pbnQoY3VydmUsb2JqWzBdLG9ialsxXSxvYmpbMl0pfSxQb2ludC5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbiBpbnNwZWN0KCl7cmV0dXJuIHRoaXMuaXNJbmZpbml0eSgpPyI8RUMgUG9pbnQgSW5maW5pdHk+IjoiPEVDIFBvaW50IHg6ICIrdGhpcy54LmZyb21SZWQoKS50b1N0cmluZygxNiwyKSsiIHk6ICIrdGhpcy55LmZyb21SZWQoKS50b1N0cmluZygxNiwyKSsiIHo6ICIrdGhpcy56LmZyb21SZWQoKS50b1N0cmluZygxNiwyKSsiPiJ9LFBvaW50LnByb3RvdHlwZS5pc0luZmluaXR5PWZ1bmN0aW9uIGlzSW5maW5pdHkoKXtyZXR1cm4gMD09PXRoaXMueC5jbXBuKDApJiYoMD09PXRoaXMueS5jbXAodGhpcy56KXx8dGhpcy56T25lJiYwPT09dGhpcy55LmNtcCh0aGlzLmN1cnZlLmMpKX0sUG9pbnQucHJvdG90eXBlLl9leHREYmw9ZnVuY3Rpb24gX2V4dERibCgpe3ZhciBhPXRoaXMueC5yZWRTcXIoKSxiPXRoaXMueS5yZWRTcXIoKSxjPXRoaXMuei5yZWRTcXIoKTtjPWMucmVkSUFkZChjKTt2YXIgZD10aGlzLmN1cnZlLl9tdWxBKGEpLGU9dGhpcy54LnJlZEFkZCh0aGlzLnkpLnJlZFNxcigpLnJlZElTdWIoYSkucmVkSVN1YihiKSxnPWQucmVkQWRkKGIpLGY9Zy5yZWRTdWIoYyksaD1kLnJlZFN1YihiKSxueD1lLnJlZE11bChmKSxueT1nLnJlZE11bChoKSxudD1lLnJlZE11bChoKSxuej1mLnJlZE11bChnKTtyZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCxueSxueixudCl9LFBvaW50LnByb3RvdHlwZS5fcHJvakRibD1mdW5jdGlvbiBfcHJvakRibCgpe3ZhciBueCxueSxueixlLGgsaixiPXRoaXMueC5yZWRBZGQodGhpcy55KS5yZWRTcXIoKSxjPXRoaXMueC5yZWRTcXIoKSxkPXRoaXMueS5yZWRTcXIoKTtpZih0aGlzLmN1cnZlLnR3aXN0ZWQpe3ZhciBmPShlPXRoaXMuY3VydmUuX211bEEoYykpLnJlZEFkZChkKTt0aGlzLnpPbmU/KG54PWIucmVkU3ViKGMpLnJlZFN1YihkKS5yZWRNdWwoZi5yZWRTdWIodGhpcy5jdXJ2ZS50d28pKSxueT1mLnJlZE11bChlLnJlZFN1YihkKSksbno9Zi5yZWRTcXIoKS5yZWRTdWIoZikucmVkU3ViKGYpKTooaD10aGlzLnoucmVkU3FyKCksaj1mLnJlZFN1YihoKS5yZWRJU3ViKGgpLG54PWIucmVkU3ViKGMpLnJlZElTdWIoZCkucmVkTXVsKGopLG55PWYucmVkTXVsKGUucmVkU3ViKGQpKSxuej1mLnJlZE11bChqKSl9ZWxzZSBlPWMucmVkQWRkKGQpLGg9dGhpcy5jdXJ2ZS5fbXVsQyh0aGlzLnopLnJlZFNxcigpLGo9ZS5yZWRTdWIoaCkucmVkU3ViKGgpLG54PXRoaXMuY3VydmUuX211bEMoYi5yZWRJU3ViKGUpKS5yZWRNdWwoaiksbnk9dGhpcy5jdXJ2ZS5fbXVsQyhlKS5yZWRNdWwoYy5yZWRJU3ViKGQpKSxuej1lLnJlZE11bChqKTtyZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChueCxueSxueil9LFBvaW50LnByb3RvdHlwZS5kYmw9ZnVuY3Rpb24gZGJsKCl7cmV0dXJuIHRoaXMuaXNJbmZpbml0eSgpP3RoaXM6dGhpcy5jdXJ2ZS5leHRlbmRlZD90aGlzLl9leHREYmwoKTp0aGlzLl9wcm9qRGJsKCl9LFBvaW50LnByb3RvdHlwZS5fZXh0QWRkPWZ1bmN0aW9uIF9leHRBZGQocCl7dmFyIGE9dGhpcy55LnJlZFN1Yih0aGlzLngpLnJlZE11bChwLnkucmVkU3ViKHAueCkpLGI9dGhpcy55LnJlZEFkZCh0aGlzLngpLnJlZE11bChwLnkucmVkQWRkKHAueCkpLGM9dGhpcy50LnJlZE11bCh0aGlzLmN1cnZlLmRkKS5yZWRNdWwocC50KSxkPXRoaXMuei5yZWRNdWwocC56LnJlZEFkZChwLnopKSxlPWIucmVkU3ViKGEpLGY9ZC5yZWRTdWIoYyksZz1kLnJlZEFkZChjKSxoPWIucmVkQWRkKGEpLG54PWUucmVkTXVsKGYpLG55PWcucmVkTXVsKGgpLG50PWUucmVkTXVsKGgpLG56PWYucmVkTXVsKGcpO3JldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LG55LG56LG50KX0sUG9pbnQucHJvdG90eXBlLl9wcm9qQWRkPWZ1bmN0aW9uIF9wcm9qQWRkKHApe3ZhciBueSxueixhPXRoaXMuei5yZWRNdWwocC56KSxiPWEucmVkU3FyKCksYz10aGlzLngucmVkTXVsKHAueCksZD10aGlzLnkucmVkTXVsKHAueSksZT10aGlzLmN1cnZlLmQucmVkTXVsKGMpLnJlZE11bChkKSxmPWIucmVkU3ViKGUpLGc9Yi5yZWRBZGQoZSksdG1wPXRoaXMueC5yZWRBZGQodGhpcy55KS5yZWRNdWwocC54LnJlZEFkZChwLnkpKS5yZWRJU3ViKGMpLnJlZElTdWIoZCksbng9YS5yZWRNdWwoZikucmVkTXVsKHRtcCk7cmV0dXJuIHRoaXMuY3VydmUudHdpc3RlZD8obnk9YS5yZWRNdWwoZykucmVkTXVsKGQucmVkU3ViKHRoaXMuY3VydmUuX211bEEoYykpKSxuej1mLnJlZE11bChnKSk6KG55PWEucmVkTXVsKGcpLnJlZE11bChkLnJlZFN1YihjKSksbno9dGhpcy5jdXJ2ZS5fbXVsQyhmKS5yZWRNdWwoZykpLHRoaXMuY3VydmUucG9pbnQobngsbnksbnopfSxQb2ludC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uIGFkZChwKXtyZXR1cm4gdGhpcy5pc0luZmluaXR5KCk/cDpwLmlzSW5maW5pdHkoKT90aGlzOnRoaXMuY3VydmUuZXh0ZW5kZWQ/dGhpcy5fZXh0QWRkKHApOnRoaXMuX3Byb2pBZGQocCl9LFBvaW50LnByb3RvdHlwZS5tdWw9ZnVuY3Rpb24gbXVsKGspe3JldHVybiB0aGlzLl9oYXNEb3VibGVzKGspP3RoaXMuY3VydmUuX2ZpeGVkTmFmTXVsKHRoaXMsayk6dGhpcy5jdXJ2ZS5fd25hZk11bCh0aGlzLGspfSxQb2ludC5wcm90b3R5cGUubXVsQWRkPWZ1bmN0aW9uIG11bEFkZChrMSxwLGsyKXtyZXR1cm4gdGhpcy5jdXJ2ZS5fd25hZk11bEFkZCgxLFt0aGlzLHBdLFtrMSxrMl0sMiwhMSl9LFBvaW50LnByb3RvdHlwZS5qbXVsQWRkPWZ1bmN0aW9uIGptdWxBZGQoazEscCxrMil7cmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWxBZGQoMSxbdGhpcyxwXSxbazEsazJdLDIsITApfSxQb2ludC5wcm90b3R5cGUubm9ybWFsaXplPWZ1bmN0aW9uIG5vcm1hbGl6ZSgpe2lmKHRoaXMuek9uZSlyZXR1cm4gdGhpczt2YXIgemk9dGhpcy56LnJlZEludm0oKTtyZXR1cm4gdGhpcy54PXRoaXMueC5yZWRNdWwoemkpLHRoaXMueT10aGlzLnkucmVkTXVsKHppKSx0aGlzLnQmJih0aGlzLnQ9dGhpcy50LnJlZE11bCh6aSkpLHRoaXMuej10aGlzLmN1cnZlLm9uZSx0aGlzLnpPbmU9ITAsdGhpc30sUG9pbnQucHJvdG90eXBlLm5lZz1mdW5jdGlvbiBuZWcoKXtyZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludCh0aGlzLngucmVkTmVnKCksdGhpcy55LHRoaXMueix0aGlzLnQmJnRoaXMudC5yZWROZWcoKSl9LFBvaW50LnByb3RvdHlwZS5nZXRYPWZ1bmN0aW9uIGdldFgoKXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKSx0aGlzLnguZnJvbVJlZCgpfSxQb2ludC5wcm90b3R5cGUuZ2V0WT1mdW5jdGlvbiBnZXRZKCl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCksdGhpcy55LmZyb21SZWQoKX0sUG9pbnQucHJvdG90eXBlLmVxPWZ1bmN0aW9uIGVxKG90aGVyKXtyZXR1cm4gdGhpcz09PW90aGVyfHwwPT09dGhpcy5nZXRYKCkuY21wKG90aGVyLmdldFgoKSkmJjA9PT10aGlzLmdldFkoKS5jbXAob3RoZXIuZ2V0WSgpKX0sUG9pbnQucHJvdG90eXBlLmVxWFRvUD1mdW5jdGlvbiBlcVhUb1AoeCl7dmFyIHJ4PXgudG9SZWQodGhpcy5jdXJ2ZS5yZWQpLnJlZE11bCh0aGlzLnopO2lmKDA9PT10aGlzLnguY21wKHJ4KSlyZXR1cm4hMDtmb3IodmFyIHhjPXguY2xvbmUoKSx0PXRoaXMuY3VydmUucmVkTi5yZWRNdWwodGhpcy56KTs7KXtpZih4Yy5pYWRkKHRoaXMuY3VydmUubikseGMuY21wKHRoaXMuY3VydmUucCk+PTApcmV0dXJuITE7aWYocngucmVkSUFkZCh0KSwwPT09dGhpcy54LmNtcChyeCkpcmV0dXJuITB9fSxQb2ludC5wcm90b3R5cGUudG9QPVBvaW50LnByb3RvdHlwZS5ub3JtYWxpemUsUG9pbnQucHJvdG90eXBlLm1peGVkQWRkPVBvaW50LnByb3RvdHlwZS5hZGR9LCIuLi8uLi9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL2N1cnZlL2luZGV4LmpzIihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgY3VydmU9ZXhwb3J0cztjdXJ2ZS5iYXNlPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvY3VydmUvYmFzZS5qcyIpLGN1cnZlLnNob3J0PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvY3VydmUvc2hvcnQuanMiKSxjdXJ2ZS5tb250PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvY3VydmUvbW9udC5qcyIpLGN1cnZlLmVkd2FyZHM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy9jdXJ2ZS9lZHdhcmRzLmpzIil9LCIuLi8uLi9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL2N1cnZlL21vbnQuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBCTj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYm4uanMvbGliL2JuLmpzIiksaW5oZXJpdHM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiKSxCYXNlPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvY3VydmUvYmFzZS5qcyIpLHV0aWxzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvdXRpbHMuanMiKTtmdW5jdGlvbiBNb250Q3VydmUoY29uZil7QmFzZS5jYWxsKHRoaXMsIm1vbnQiLGNvbmYpLHRoaXMuYT1uZXcgQk4oY29uZi5hLDE2KS50b1JlZCh0aGlzLnJlZCksdGhpcy5iPW5ldyBCTihjb25mLmIsMTYpLnRvUmVkKHRoaXMucmVkKSx0aGlzLmk0PW5ldyBCTig0KS50b1JlZCh0aGlzLnJlZCkucmVkSW52bSgpLHRoaXMudHdvPW5ldyBCTigyKS50b1JlZCh0aGlzLnJlZCksdGhpcy5hMjQ9dGhpcy5pNC5yZWRNdWwodGhpcy5hLnJlZEFkZCh0aGlzLnR3bykpfWZ1bmN0aW9uIFBvaW50KGN1cnZlLHgseil7QmFzZS5CYXNlUG9pbnQuY2FsbCh0aGlzLGN1cnZlLCJwcm9qZWN0aXZlIiksbnVsbD09PXgmJm51bGw9PT16Pyh0aGlzLng9dGhpcy5jdXJ2ZS5vbmUsdGhpcy56PXRoaXMuY3VydmUuemVybyk6KHRoaXMueD1uZXcgQk4oeCwxNiksdGhpcy56PW5ldyBCTih6LDE2KSx0aGlzLngucmVkfHwodGhpcy54PXRoaXMueC50b1JlZCh0aGlzLmN1cnZlLnJlZCkpLHRoaXMuei5yZWR8fCh0aGlzLno9dGhpcy56LnRvUmVkKHRoaXMuY3VydmUucmVkKSkpfWluaGVyaXRzKE1vbnRDdXJ2ZSxCYXNlKSxtb2R1bGUuZXhwb3J0cz1Nb250Q3VydmUsTW9udEN1cnZlLnByb3RvdHlwZS52YWxpZGF0ZT1mdW5jdGlvbiB2YWxpZGF0ZShwb2ludCl7dmFyIHg9cG9pbnQubm9ybWFsaXplKCkueCx4Mj14LnJlZFNxcigpLHJocz14Mi5yZWRNdWwoeCkucmVkQWRkKHgyLnJlZE11bCh0aGlzLmEpKS5yZWRBZGQoeCk7cmV0dXJuIDA9PT1yaHMucmVkU3FydCgpLnJlZFNxcigpLmNtcChyaHMpfSxpbmhlcml0cyhQb2ludCxCYXNlLkJhc2VQb2ludCksTW9udEN1cnZlLnByb3RvdHlwZS5kZWNvZGVQb2ludD1mdW5jdGlvbiBkZWNvZGVQb2ludChieXRlcyxlbmMpe3JldHVybiB0aGlzLnBvaW50KHV0aWxzLnRvQXJyYXkoYnl0ZXMsZW5jKSwxKX0sTW9udEN1cnZlLnByb3RvdHlwZS5wb2ludD1mdW5jdGlvbiBwb2ludCh4LHope3JldHVybiBuZXcgUG9pbnQodGhpcyx4LHopfSxNb250Q3VydmUucHJvdG90eXBlLnBvaW50RnJvbUpTT049ZnVuY3Rpb24gcG9pbnRGcm9tSlNPTihvYmope3JldHVybiBQb2ludC5mcm9tSlNPTih0aGlzLG9iail9LFBvaW50LnByb3RvdHlwZS5wcmVjb21wdXRlPWZ1bmN0aW9uIHByZWNvbXB1dGUoKXt9LFBvaW50LnByb3RvdHlwZS5fZW5jb2RlPWZ1bmN0aW9uIF9lbmNvZGUoKXtyZXR1cm4gdGhpcy5nZXRYKCkudG9BcnJheSgiYmUiLHRoaXMuY3VydmUucC5ieXRlTGVuZ3RoKCkpfSxQb2ludC5mcm9tSlNPTj1mdW5jdGlvbiBmcm9tSlNPTihjdXJ2ZSxvYmope3JldHVybiBuZXcgUG9pbnQoY3VydmUsb2JqWzBdLG9ialsxXXx8Y3VydmUub25lKX0sUG9pbnQucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24gaW5zcGVjdCgpe3JldHVybiB0aGlzLmlzSW5maW5pdHkoKT8iPEVDIFBvaW50IEluZmluaXR5PiI6IjxFQyBQb2ludCB4OiAiK3RoaXMueC5mcm9tUmVkKCkudG9TdHJpbmcoMTYsMikrIiB6OiAiK3RoaXMuei5mcm9tUmVkKCkudG9TdHJpbmcoMTYsMikrIj4ifSxQb2ludC5wcm90b3R5cGUuaXNJbmZpbml0eT1mdW5jdGlvbiBpc0luZmluaXR5KCl7cmV0dXJuIDA9PT10aGlzLnouY21wbigwKX0sUG9pbnQucHJvdG90eXBlLmRibD1mdW5jdGlvbiBkYmwoKXt2YXIgYWE9dGhpcy54LnJlZEFkZCh0aGlzLnopLnJlZFNxcigpLGJiPXRoaXMueC5yZWRTdWIodGhpcy56KS5yZWRTcXIoKSxjPWFhLnJlZFN1YihiYiksbng9YWEucmVkTXVsKGJiKSxuej1jLnJlZE11bChiYi5yZWRBZGQodGhpcy5jdXJ2ZS5hMjQucmVkTXVsKGMpKSk7cmV0dXJuIHRoaXMuY3VydmUucG9pbnQobngsbnopfSxQb2ludC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uIGFkZCgpe3Rocm93IG5ldyBFcnJvcigiTm90IHN1cHBvcnRlZCBvbiBNb250Z29tZXJ5IGN1cnZlIil9LFBvaW50LnByb3RvdHlwZS5kaWZmQWRkPWZ1bmN0aW9uIGRpZmZBZGQocCxkaWZmKXt2YXIgYT10aGlzLngucmVkQWRkKHRoaXMueiksYj10aGlzLngucmVkU3ViKHRoaXMueiksYz1wLngucmVkQWRkKHAueiksZGE9cC54LnJlZFN1YihwLnopLnJlZE11bChhKSxjYj1jLnJlZE11bChiKSxueD1kaWZmLnoucmVkTXVsKGRhLnJlZEFkZChjYikucmVkU3FyKCkpLG56PWRpZmYueC5yZWRNdWwoZGEucmVkSVN1YihjYikucmVkU3FyKCkpO3JldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LG56KX0sUG9pbnQucHJvdG90eXBlLm11bD1mdW5jdGlvbiBtdWwoayl7Zm9yKHZhciB0PWsuY2xvbmUoKSxhPXRoaXMsYj10aGlzLmN1cnZlLnBvaW50KG51bGwsbnVsbCksYml0cz1bXTswIT09dC5jbXBuKDApO3QuaXVzaHJuKDEpKWJpdHMucHVzaCh0LmFuZGxuKDEpKTtmb3IodmFyIGk9Yml0cy5sZW5ndGgtMTtpPj0wO2ktLSkwPT09Yml0c1tpXT8oYT1hLmRpZmZBZGQoYix0aGlzKSxiPWIuZGJsKCkpOihiPWEuZGlmZkFkZChiLHRoaXMpLGE9YS5kYmwoKSk7cmV0dXJuIGJ9LFBvaW50LnByb3RvdHlwZS5tdWxBZGQ9ZnVuY3Rpb24gbXVsQWRkKCl7dGhyb3cgbmV3IEVycm9yKCJOb3Qgc3VwcG9ydGVkIG9uIE1vbnRnb21lcnkgY3VydmUiKX0sUG9pbnQucHJvdG90eXBlLmp1bWxBZGQ9ZnVuY3Rpb24ganVtbEFkZCgpe3Rocm93IG5ldyBFcnJvcigiTm90IHN1cHBvcnRlZCBvbiBNb250Z29tZXJ5IGN1cnZlIil9LFBvaW50LnByb3RvdHlwZS5lcT1mdW5jdGlvbiBlcShvdGhlcil7cmV0dXJuIDA9PT10aGlzLmdldFgoKS5jbXAob3RoZXIuZ2V0WCgpKX0sUG9pbnQucHJvdG90eXBlLm5vcm1hbGl6ZT1mdW5jdGlvbiBub3JtYWxpemUoKXtyZXR1cm4gdGhpcy54PXRoaXMueC5yZWRNdWwodGhpcy56LnJlZEludm0oKSksdGhpcy56PXRoaXMuY3VydmUub25lLHRoaXN9LFBvaW50LnByb3RvdHlwZS5nZXRYPWZ1bmN0aW9uIGdldFgoKXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKSx0aGlzLnguZnJvbVJlZCgpfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvY3VydmUvc2hvcnQuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciB1dGlscz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL3V0aWxzLmpzIiksQk49X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2JuLmpzL2xpYi9ibi5qcyIpLGluaGVyaXRzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiksQmFzZT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL2N1cnZlL2Jhc2UuanMiKSxhc3NlcnQ9dXRpbHMuYXNzZXJ0O2Z1bmN0aW9uIFNob3J0Q3VydmUoY29uZil7QmFzZS5jYWxsKHRoaXMsInNob3J0Iixjb25mKSx0aGlzLmE9bmV3IEJOKGNvbmYuYSwxNikudG9SZWQodGhpcy5yZWQpLHRoaXMuYj1uZXcgQk4oY29uZi5iLDE2KS50b1JlZCh0aGlzLnJlZCksdGhpcy50aW52PXRoaXMudHdvLnJlZEludm0oKSx0aGlzLnplcm9BPTA9PT10aGlzLmEuZnJvbVJlZCgpLmNtcG4oMCksdGhpcy50aHJlZUE9MD09PXRoaXMuYS5mcm9tUmVkKCkuc3ViKHRoaXMucCkuY21wbigtMyksdGhpcy5lbmRvPXRoaXMuX2dldEVuZG9tb3JwaGlzbShjb25mKSx0aGlzLl9lbmRvV25hZlQxPW5ldyBBcnJheSg0KSx0aGlzLl9lbmRvV25hZlQyPW5ldyBBcnJheSg0KX1mdW5jdGlvbiBQb2ludChjdXJ2ZSx4LHksaXNSZWQpe0Jhc2UuQmFzZVBvaW50LmNhbGwodGhpcyxjdXJ2ZSwiYWZmaW5lIiksbnVsbD09PXgmJm51bGw9PT15Pyh0aGlzLng9bnVsbCx0aGlzLnk9bnVsbCx0aGlzLmluZj0hMCk6KHRoaXMueD1uZXcgQk4oeCwxNiksdGhpcy55PW5ldyBCTih5LDE2KSxpc1JlZCYmKHRoaXMueC5mb3JjZVJlZCh0aGlzLmN1cnZlLnJlZCksdGhpcy55LmZvcmNlUmVkKHRoaXMuY3VydmUucmVkKSksdGhpcy54LnJlZHx8KHRoaXMueD10aGlzLngudG9SZWQodGhpcy5jdXJ2ZS5yZWQpKSx0aGlzLnkucmVkfHwodGhpcy55PXRoaXMueS50b1JlZCh0aGlzLmN1cnZlLnJlZCkpLHRoaXMuaW5mPSExKX1mdW5jdGlvbiBKUG9pbnQoY3VydmUseCx5LHope0Jhc2UuQmFzZVBvaW50LmNhbGwodGhpcyxjdXJ2ZSwiamFjb2JpYW4iKSxudWxsPT09eCYmbnVsbD09PXkmJm51bGw9PT16Pyh0aGlzLng9dGhpcy5jdXJ2ZS5vbmUsdGhpcy55PXRoaXMuY3VydmUub25lLHRoaXMuej1uZXcgQk4oMCkpOih0aGlzLng9bmV3IEJOKHgsMTYpLHRoaXMueT1uZXcgQk4oeSwxNiksdGhpcy56PW5ldyBCTih6LDE2KSksdGhpcy54LnJlZHx8KHRoaXMueD10aGlzLngudG9SZWQodGhpcy5jdXJ2ZS5yZWQpKSx0aGlzLnkucmVkfHwodGhpcy55PXRoaXMueS50b1JlZCh0aGlzLmN1cnZlLnJlZCkpLHRoaXMuei5yZWR8fCh0aGlzLno9dGhpcy56LnRvUmVkKHRoaXMuY3VydmUucmVkKSksdGhpcy56T25lPXRoaXMuej09PXRoaXMuY3VydmUub25lfWluaGVyaXRzKFNob3J0Q3VydmUsQmFzZSksbW9kdWxlLmV4cG9ydHM9U2hvcnRDdXJ2ZSxTaG9ydEN1cnZlLnByb3RvdHlwZS5fZ2V0RW5kb21vcnBoaXNtPWZ1bmN0aW9uIF9nZXRFbmRvbW9ycGhpc20oY29uZil7aWYodGhpcy56ZXJvQSYmdGhpcy5nJiZ0aGlzLm4mJjE9PT10aGlzLnAubW9kbigzKSl7dmFyIGJldGEsbGFtYmRhO2lmKGNvbmYuYmV0YSliZXRhPW5ldyBCTihjb25mLmJldGEsMTYpLnRvUmVkKHRoaXMucmVkKTtlbHNle3ZhciBiZXRhcz10aGlzLl9nZXRFbmRvUm9vdHModGhpcy5wKTtiZXRhPShiZXRhPWJldGFzWzBdLmNtcChiZXRhc1sxXSk8MD9iZXRhc1swXTpiZXRhc1sxXSkudG9SZWQodGhpcy5yZWQpfWlmKGNvbmYubGFtYmRhKWxhbWJkYT1uZXcgQk4oY29uZi5sYW1iZGEsMTYpO2Vsc2V7dmFyIGxhbWJkYXM9dGhpcy5fZ2V0RW5kb1Jvb3RzKHRoaXMubik7MD09PXRoaXMuZy5tdWwobGFtYmRhc1swXSkueC5jbXAodGhpcy5nLngucmVkTXVsKGJldGEpKT9sYW1iZGE9bGFtYmRhc1swXToobGFtYmRhPWxhbWJkYXNbMV0sYXNzZXJ0KDA9PT10aGlzLmcubXVsKGxhbWJkYSkueC5jbXAodGhpcy5nLngucmVkTXVsKGJldGEpKSkpfXJldHVybntiZXRhLGxhbWJkYSxiYXNpczpjb25mLmJhc2lzP2NvbmYuYmFzaXMubWFwKGZ1bmN0aW9uKHZlYyl7cmV0dXJue2E6bmV3IEJOKHZlYy5hLDE2KSxiOm5ldyBCTih2ZWMuYiwxNil9fSk6dGhpcy5fZ2V0RW5kb0Jhc2lzKGxhbWJkYSl9fX0sU2hvcnRDdXJ2ZS5wcm90b3R5cGUuX2dldEVuZG9Sb290cz1mdW5jdGlvbiBfZ2V0RW5kb1Jvb3RzKG51bSl7dmFyIHJlZD1udW09PT10aGlzLnA/dGhpcy5yZWQ6Qk4ubW9udChudW0pLHRpbnY9bmV3IEJOKDIpLnRvUmVkKHJlZCkucmVkSW52bSgpLG50aW52PXRpbnYucmVkTmVnKCkscz1uZXcgQk4oMykudG9SZWQocmVkKS5yZWROZWcoKS5yZWRTcXJ0KCkucmVkTXVsKHRpbnYpO3JldHVybltudGludi5yZWRBZGQocykuZnJvbVJlZCgpLG50aW52LnJlZFN1YihzKS5mcm9tUmVkKCldfSxTaG9ydEN1cnZlLnByb3RvdHlwZS5fZ2V0RW5kb0Jhc2lzPWZ1bmN0aW9uIF9nZXRFbmRvQmFzaXMobGFtYmRhKXtmb3IodmFyIGEwLGIwLGExLGIxLGEyLGIyLHByZXZSLHIseCxhcHJ4U3FydD10aGlzLm4udXNocm4oTWF0aC5mbG9vcih0aGlzLm4uYml0TGVuZ3RoKCkvMikpLHU9bGFtYmRhLHY9dGhpcy5uLmNsb25lKCkseDE9bmV3IEJOKDEpLHkxPW5ldyBCTigwKSx4Mj1uZXcgQk4oMCkseTI9bmV3IEJOKDEpLGk9MDswIT09dS5jbXBuKDApOyl7dmFyIHE9di5kaXYodSk7cj12LnN1YihxLm11bCh1KSkseD14Mi5zdWIocS5tdWwoeDEpKTt2YXIgeT15Mi5zdWIocS5tdWwoeTEpKTtpZighYTEmJnIuY21wKGFwcnhTcXJ0KTwwKWEwPXByZXZSLm5lZygpLGIwPXgxLGExPXIubmVnKCksYjE9eDtlbHNlIGlmKGExJiYyPT09KytpKWJyZWFrO3ByZXZSPXIsdj11LHU9cix4Mj14MSx4MT14LHkyPXkxLHkxPXl9YTI9ci5uZWcoKSxiMj14O3ZhciBsZW4xPWExLnNxcigpLmFkZChiMS5zcXIoKSk7cmV0dXJuIGEyLnNxcigpLmFkZChiMi5zcXIoKSkuY21wKGxlbjEpPj0wJiYoYTI9YTAsYjI9YjApLGExLm5lZ2F0aXZlJiYoYTE9YTEubmVnKCksYjE9YjEubmVnKCkpLGEyLm5lZ2F0aXZlJiYoYTI9YTIubmVnKCksYjI9YjIubmVnKCkpLFt7YTphMSxiOmIxfSx7YTphMixiOmIyfV19LFNob3J0Q3VydmUucHJvdG90eXBlLl9lbmRvU3BsaXQ9ZnVuY3Rpb24gX2VuZG9TcGxpdChrKXt2YXIgYmFzaXM9dGhpcy5lbmRvLmJhc2lzLHYxPWJhc2lzWzBdLHYyPWJhc2lzWzFdLGMxPXYyLmIubXVsKGspLmRpdlJvdW5kKHRoaXMubiksYzI9djEuYi5uZWcoKS5tdWwoaykuZGl2Um91bmQodGhpcy5uKSxwMT1jMS5tdWwodjEuYSkscDI9YzIubXVsKHYyLmEpLHExPWMxLm11bCh2MS5iKSxxMj1jMi5tdWwodjIuYik7cmV0dXJue2sxOmsuc3ViKHAxKS5zdWIocDIpLGsyOnExLmFkZChxMikubmVnKCl9fSxTaG9ydEN1cnZlLnByb3RvdHlwZS5wb2ludEZyb21YPWZ1bmN0aW9uIHBvaW50RnJvbVgoeCxvZGQpeyh4PW5ldyBCTih4LDE2KSkucmVkfHwoeD14LnRvUmVkKHRoaXMucmVkKSk7dmFyIHkyPXgucmVkU3FyKCkucmVkTXVsKHgpLnJlZElBZGQoeC5yZWRNdWwodGhpcy5hKSkucmVkSUFkZCh0aGlzLmIpLHk9eTIucmVkU3FydCgpO2lmKDAhPT15LnJlZFNxcigpLnJlZFN1Yih5MikuY21wKHRoaXMuemVybykpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHBvaW50Iik7dmFyIGlzT2RkPXkuZnJvbVJlZCgpLmlzT2RkKCk7cmV0dXJuKG9kZCYmIWlzT2RkfHwhb2RkJiZpc09kZCkmJih5PXkucmVkTmVnKCkpLHRoaXMucG9pbnQoeCx5KX0sU2hvcnRDdXJ2ZS5wcm90b3R5cGUudmFsaWRhdGU9ZnVuY3Rpb24gdmFsaWRhdGUocG9pbnQpe2lmKHBvaW50LmluZilyZXR1cm4hMDt2YXIgeD1wb2ludC54LHk9cG9pbnQueSxheD10aGlzLmEucmVkTXVsKHgpLHJocz14LnJlZFNxcigpLnJlZE11bCh4KS5yZWRJQWRkKGF4KS5yZWRJQWRkKHRoaXMuYik7cmV0dXJuIDA9PT15LnJlZFNxcigpLnJlZElTdWIocmhzKS5jbXBuKDApfSxTaG9ydEN1cnZlLnByb3RvdHlwZS5fZW5kb1duYWZNdWxBZGQ9ZnVuY3Rpb24gX2VuZG9XbmFmTXVsQWRkKHBvaW50cyxjb2VmZnMsamFjb2JpYW5SZXN1bHQpe2Zvcih2YXIgbnBvaW50cz10aGlzLl9lbmRvV25hZlQxLG5jb2VmZnM9dGhpcy5fZW5kb1duYWZUMixpPTA7aTxwb2ludHMubGVuZ3RoO2krKyl7dmFyIHNwbGl0PXRoaXMuX2VuZG9TcGxpdChjb2VmZnNbaV0pLHA9cG9pbnRzW2ldLGJldGE9cC5fZ2V0QmV0YSgpO3NwbGl0LmsxLm5lZ2F0aXZlJiYoc3BsaXQuazEuaW5lZygpLHA9cC5uZWcoITApKSxzcGxpdC5rMi5uZWdhdGl2ZSYmKHNwbGl0LmsyLmluZWcoKSxiZXRhPWJldGEubmVnKCEwKSksbnBvaW50c1syKmldPXAsbnBvaW50c1syKmkrMV09YmV0YSxuY29lZmZzWzIqaV09c3BsaXQuazEsbmNvZWZmc1syKmkrMV09c3BsaXQuazJ9Zm9yKHZhciByZXM9dGhpcy5fd25hZk11bEFkZCgxLG5wb2ludHMsbmNvZWZmcywyKmksamFjb2JpYW5SZXN1bHQpLGo9MDtqPDIqaTtqKyspbnBvaW50c1tqXT1udWxsLG5jb2VmZnNbal09bnVsbDtyZXR1cm4gcmVzfSxpbmhlcml0cyhQb2ludCxCYXNlLkJhc2VQb2ludCksU2hvcnRDdXJ2ZS5wcm90b3R5cGUucG9pbnQ9ZnVuY3Rpb24gcG9pbnQoeCx5LGlzUmVkKXtyZXR1cm4gbmV3IFBvaW50KHRoaXMseCx5LGlzUmVkKX0sU2hvcnRDdXJ2ZS5wcm90b3R5cGUucG9pbnRGcm9tSlNPTj1mdW5jdGlvbiBwb2ludEZyb21KU09OKG9iaixyZWQpe3JldHVybiBQb2ludC5mcm9tSlNPTih0aGlzLG9iaixyZWQpfSxQb2ludC5wcm90b3R5cGUuX2dldEJldGE9ZnVuY3Rpb24gX2dldEJldGEoKXtpZih0aGlzLmN1cnZlLmVuZG8pe3ZhciBwcmU9dGhpcy5wcmVjb21wdXRlZDtpZihwcmUmJnByZS5iZXRhKXJldHVybiBwcmUuYmV0YTt2YXIgYmV0YT10aGlzLmN1cnZlLnBvaW50KHRoaXMueC5yZWRNdWwodGhpcy5jdXJ2ZS5lbmRvLmJldGEpLHRoaXMueSk7aWYocHJlKXt2YXIgY3VydmU9dGhpcy5jdXJ2ZSxlbmRvTXVsPWZ1bmN0aW9uKHApe3JldHVybiBjdXJ2ZS5wb2ludChwLngucmVkTXVsKGN1cnZlLmVuZG8uYmV0YSkscC55KX07cHJlLmJldGE9YmV0YSxiZXRhLnByZWNvbXB1dGVkPXtiZXRhOm51bGwsbmFmOnByZS5uYWYmJnt3bmQ6cHJlLm5hZi53bmQscG9pbnRzOnByZS5uYWYucG9pbnRzLm1hcChlbmRvTXVsKX0sZG91YmxlczpwcmUuZG91YmxlcyYme3N0ZXA6cHJlLmRvdWJsZXMuc3RlcCxwb2ludHM6cHJlLmRvdWJsZXMucG9pbnRzLm1hcChlbmRvTXVsKX19fXJldHVybiBiZXRhfX0sUG9pbnQucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbiB0b0pTT04oKXtyZXR1cm4gdGhpcy5wcmVjb21wdXRlZD9bdGhpcy54LHRoaXMueSx0aGlzLnByZWNvbXB1dGVkJiZ7ZG91Ymxlczp0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXMmJntzdGVwOnRoaXMucHJlY29tcHV0ZWQuZG91Ymxlcy5zdGVwLHBvaW50czp0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXMucG9pbnRzLnNsaWNlKDEpfSxuYWY6dGhpcy5wcmVjb21wdXRlZC5uYWYmJnt3bmQ6dGhpcy5wcmVjb21wdXRlZC5uYWYud25kLHBvaW50czp0aGlzLnByZWNvbXB1dGVkLm5hZi5wb2ludHMuc2xpY2UoMSl9fV06W3RoaXMueCx0aGlzLnldfSxQb2ludC5mcm9tSlNPTj1mdW5jdGlvbiBmcm9tSlNPTihjdXJ2ZSxvYmoscmVkKXsic3RyaW5nIj09dHlwZW9mIG9iaiYmKG9iaj1KU09OLnBhcnNlKG9iaikpO3ZhciByZXM9Y3VydmUucG9pbnQob2JqWzBdLG9ialsxXSxyZWQpO2lmKCFvYmpbMl0pcmV0dXJuIHJlcztmdW5jdGlvbiBvYmoycG9pbnQob2JqKXtyZXR1cm4gY3VydmUucG9pbnQob2JqWzBdLG9ialsxXSxyZWQpfXZhciBwcmU9b2JqWzJdO3JldHVybiByZXMucHJlY29tcHV0ZWQ9e2JldGE6bnVsbCxkb3VibGVzOnByZS5kb3VibGVzJiZ7c3RlcDpwcmUuZG91Ymxlcy5zdGVwLHBvaW50czpbcmVzXS5jb25jYXQocHJlLmRvdWJsZXMucG9pbnRzLm1hcChvYmoycG9pbnQpKX0sbmFmOnByZS5uYWYmJnt3bmQ6cHJlLm5hZi53bmQscG9pbnRzOltyZXNdLmNvbmNhdChwcmUubmFmLnBvaW50cy5tYXAob2JqMnBvaW50KSl9fSxyZXN9LFBvaW50LnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uIGluc3BlY3QoKXtyZXR1cm4gdGhpcy5pc0luZmluaXR5KCk/IjxFQyBQb2ludCBJbmZpbml0eT4iOiI8RUMgUG9pbnQgeDogIit0aGlzLnguZnJvbVJlZCgpLnRvU3RyaW5nKDE2LDIpKyIgeTogIit0aGlzLnkuZnJvbVJlZCgpLnRvU3RyaW5nKDE2LDIpKyI+In0sUG9pbnQucHJvdG90eXBlLmlzSW5maW5pdHk9ZnVuY3Rpb24gaXNJbmZpbml0eSgpe3JldHVybiB0aGlzLmluZn0sUG9pbnQucHJvdG90eXBlLmFkZD1mdW5jdGlvbiBhZGQocCl7aWYodGhpcy5pbmYpcmV0dXJuIHA7aWYocC5pbmYpcmV0dXJuIHRoaXM7aWYodGhpcy5lcShwKSlyZXR1cm4gdGhpcy5kYmwoKTtpZih0aGlzLm5lZygpLmVxKHApKXJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsbnVsbCk7aWYoMD09PXRoaXMueC5jbXAocC54KSlyZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChudWxsLG51bGwpO3ZhciBjPXRoaXMueS5yZWRTdWIocC55KTswIT09Yy5jbXBuKDApJiYoYz1jLnJlZE11bCh0aGlzLngucmVkU3ViKHAueCkucmVkSW52bSgpKSk7dmFyIG54PWMucmVkU3FyKCkucmVkSVN1Yih0aGlzLngpLnJlZElTdWIocC54KSxueT1jLnJlZE11bCh0aGlzLngucmVkU3ViKG54KSkucmVkSVN1Yih0aGlzLnkpO3JldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LG55KX0sUG9pbnQucHJvdG90eXBlLmRibD1mdW5jdGlvbiBkYmwoKXtpZih0aGlzLmluZilyZXR1cm4gdGhpczt2YXIgeXMxPXRoaXMueS5yZWRBZGQodGhpcy55KTtpZigwPT09eXMxLmNtcG4oMCkpcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobnVsbCxudWxsKTt2YXIgYT10aGlzLmN1cnZlLmEseDI9dGhpcy54LnJlZFNxcigpLGR5aW52PXlzMS5yZWRJbnZtKCksYz14Mi5yZWRBZGQoeDIpLnJlZElBZGQoeDIpLnJlZElBZGQoYSkucmVkTXVsKGR5aW52KSxueD1jLnJlZFNxcigpLnJlZElTdWIodGhpcy54LnJlZEFkZCh0aGlzLngpKSxueT1jLnJlZE11bCh0aGlzLngucmVkU3ViKG54KSkucmVkSVN1Yih0aGlzLnkpO3JldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LG55KX0sUG9pbnQucHJvdG90eXBlLmdldFg9ZnVuY3Rpb24gZ2V0WCgpe3JldHVybiB0aGlzLnguZnJvbVJlZCgpfSxQb2ludC5wcm90b3R5cGUuZ2V0WT1mdW5jdGlvbiBnZXRZKCl7cmV0dXJuIHRoaXMueS5mcm9tUmVkKCl9LFBvaW50LnByb3RvdHlwZS5tdWw9ZnVuY3Rpb24gbXVsKGspe3JldHVybiBrPW5ldyBCTihrLDE2KSx0aGlzLmlzSW5maW5pdHkoKT90aGlzOnRoaXMuX2hhc0RvdWJsZXMoayk/dGhpcy5jdXJ2ZS5fZml4ZWROYWZNdWwodGhpcyxrKTp0aGlzLmN1cnZlLmVuZG8/dGhpcy5jdXJ2ZS5fZW5kb1duYWZNdWxBZGQoW3RoaXNdLFtrXSk6dGhpcy5jdXJ2ZS5fd25hZk11bCh0aGlzLGspfSxQb2ludC5wcm90b3R5cGUubXVsQWRkPWZ1bmN0aW9uIG11bEFkZChrMSxwMixrMil7dmFyIHBvaW50cz1bdGhpcyxwMl0sY29lZmZzPVtrMSxrMl07cmV0dXJuIHRoaXMuY3VydmUuZW5kbz90aGlzLmN1cnZlLl9lbmRvV25hZk11bEFkZChwb2ludHMsY29lZmZzKTp0aGlzLmN1cnZlLl93bmFmTXVsQWRkKDEscG9pbnRzLGNvZWZmcywyKX0sUG9pbnQucHJvdG90eXBlLmptdWxBZGQ9ZnVuY3Rpb24gam11bEFkZChrMSxwMixrMil7dmFyIHBvaW50cz1bdGhpcyxwMl0sY29lZmZzPVtrMSxrMl07cmV0dXJuIHRoaXMuY3VydmUuZW5kbz90aGlzLmN1cnZlLl9lbmRvV25hZk11bEFkZChwb2ludHMsY29lZmZzLCEwKTp0aGlzLmN1cnZlLl93bmFmTXVsQWRkKDEscG9pbnRzLGNvZWZmcywyLCEwKX0sUG9pbnQucHJvdG90eXBlLmVxPWZ1bmN0aW9uIGVxKHApe3JldHVybiB0aGlzPT09cHx8dGhpcy5pbmY9PT1wLmluZiYmKHRoaXMuaW5mfHwwPT09dGhpcy54LmNtcChwLngpJiYwPT09dGhpcy55LmNtcChwLnkpKX0sUG9pbnQucHJvdG90eXBlLm5lZz1mdW5jdGlvbiBuZWcoX3ByZWNvbXB1dGUpe2lmKHRoaXMuaW5mKXJldHVybiB0aGlzO3ZhciByZXM9dGhpcy5jdXJ2ZS5wb2ludCh0aGlzLngsdGhpcy55LnJlZE5lZygpKTtpZihfcHJlY29tcHV0ZSYmdGhpcy5wcmVjb21wdXRlZCl7dmFyIHByZT10aGlzLnByZWNvbXB1dGVkLG5lZ2F0ZT1mdW5jdGlvbihwKXtyZXR1cm4gcC5uZWcoKX07cmVzLnByZWNvbXB1dGVkPXtuYWY6cHJlLm5hZiYme3duZDpwcmUubmFmLnduZCxwb2ludHM6cHJlLm5hZi5wb2ludHMubWFwKG5lZ2F0ZSl9LGRvdWJsZXM6cHJlLmRvdWJsZXMmJntzdGVwOnByZS5kb3VibGVzLnN0ZXAscG9pbnRzOnByZS5kb3VibGVzLnBvaW50cy5tYXAobmVnYXRlKX19fXJldHVybiByZXN9LFBvaW50LnByb3RvdHlwZS50b0o9ZnVuY3Rpb24gdG9KKCl7cmV0dXJuIHRoaXMuaW5mP3RoaXMuY3VydmUuanBvaW50KG51bGwsbnVsbCxudWxsKTp0aGlzLmN1cnZlLmpwb2ludCh0aGlzLngsdGhpcy55LHRoaXMuY3VydmUub25lKX0saW5oZXJpdHMoSlBvaW50LEJhc2UuQmFzZVBvaW50KSxTaG9ydEN1cnZlLnByb3RvdHlwZS5qcG9pbnQ9ZnVuY3Rpb24ganBvaW50KHgseSx6KXtyZXR1cm4gbmV3IEpQb2ludCh0aGlzLHgseSx6KX0sSlBvaW50LnByb3RvdHlwZS50b1A9ZnVuY3Rpb24gdG9QKCl7aWYodGhpcy5pc0luZmluaXR5KCkpcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobnVsbCxudWxsKTt2YXIgemludj10aGlzLnoucmVkSW52bSgpLHppbnYyPXppbnYucmVkU3FyKCksYXg9dGhpcy54LnJlZE11bCh6aW52MiksYXk9dGhpcy55LnJlZE11bCh6aW52MikucmVkTXVsKHppbnYpO3JldHVybiB0aGlzLmN1cnZlLnBvaW50KGF4LGF5KX0sSlBvaW50LnByb3RvdHlwZS5uZWc9ZnVuY3Rpb24gbmVnKCl7cmV0dXJuIHRoaXMuY3VydmUuanBvaW50KHRoaXMueCx0aGlzLnkucmVkTmVnKCksdGhpcy56KX0sSlBvaW50LnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24gYWRkKHApe2lmKHRoaXMuaXNJbmZpbml0eSgpKXJldHVybiBwO2lmKHAuaXNJbmZpbml0eSgpKXJldHVybiB0aGlzO3ZhciBwejI9cC56LnJlZFNxcigpLHoyPXRoaXMuei5yZWRTcXIoKSx1MT10aGlzLngucmVkTXVsKHB6MiksdTI9cC54LnJlZE11bCh6MiksczE9dGhpcy55LnJlZE11bChwejIucmVkTXVsKHAueikpLHMyPXAueS5yZWRNdWwoejIucmVkTXVsKHRoaXMueikpLGg9dTEucmVkU3ViKHUyKSxyPXMxLnJlZFN1YihzMik7aWYoMD09PWguY21wbigwKSlyZXR1cm4gMCE9PXIuY21wbigwKT90aGlzLmN1cnZlLmpwb2ludChudWxsLG51bGwsbnVsbCk6dGhpcy5kYmwoKTt2YXIgaDI9aC5yZWRTcXIoKSxoMz1oMi5yZWRNdWwoaCksdj11MS5yZWRNdWwoaDIpLG54PXIucmVkU3FyKCkucmVkSUFkZChoMykucmVkSVN1Yih2KS5yZWRJU3ViKHYpLG55PXIucmVkTXVsKHYucmVkSVN1YihueCkpLnJlZElTdWIoczEucmVkTXVsKGgzKSksbno9dGhpcy56LnJlZE11bChwLnopLnJlZE11bChoKTtyZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobngsbnksbnopfSxKUG9pbnQucHJvdG90eXBlLm1peGVkQWRkPWZ1bmN0aW9uIG1peGVkQWRkKHApe2lmKHRoaXMuaXNJbmZpbml0eSgpKXJldHVybiBwLnRvSigpO2lmKHAuaXNJbmZpbml0eSgpKXJldHVybiB0aGlzO3ZhciB6Mj10aGlzLnoucmVkU3FyKCksdTE9dGhpcy54LHUyPXAueC5yZWRNdWwoejIpLHMxPXRoaXMueSxzMj1wLnkucmVkTXVsKHoyKS5yZWRNdWwodGhpcy56KSxoPXUxLnJlZFN1Yih1Mikscj1zMS5yZWRTdWIoczIpO2lmKDA9PT1oLmNtcG4oMCkpcmV0dXJuIDAhPT1yLmNtcG4oMCk/dGhpcy5jdXJ2ZS5qcG9pbnQobnVsbCxudWxsLG51bGwpOnRoaXMuZGJsKCk7dmFyIGgyPWgucmVkU3FyKCksaDM9aDIucmVkTXVsKGgpLHY9dTEucmVkTXVsKGgyKSxueD1yLnJlZFNxcigpLnJlZElBZGQoaDMpLnJlZElTdWIodikucmVkSVN1Yih2KSxueT1yLnJlZE11bCh2LnJlZElTdWIobngpKS5yZWRJU3ViKHMxLnJlZE11bChoMykpLG56PXRoaXMuei5yZWRNdWwoaCk7cmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG54LG55LG56KX0sSlBvaW50LnByb3RvdHlwZS5kYmxwPWZ1bmN0aW9uIGRibHAocG93KXtpZigwPT09cG93KXJldHVybiB0aGlzO2lmKHRoaXMuaXNJbmZpbml0eSgpKXJldHVybiB0aGlzO2lmKCFwb3cpcmV0dXJuIHRoaXMuZGJsKCk7dmFyIGk7aWYodGhpcy5jdXJ2ZS56ZXJvQXx8dGhpcy5jdXJ2ZS50aHJlZUEpe3ZhciByPXRoaXM7Zm9yKGk9MDtpPHBvdztpKyspcj1yLmRibCgpO3JldHVybiByfXZhciBhPXRoaXMuY3VydmUuYSx0aW52PXRoaXMuY3VydmUudGludixqeD10aGlzLngsank9dGhpcy55LGp6PXRoaXMueixqejQ9anoucmVkU3FyKCkucmVkU3FyKCksanlkPWp5LnJlZEFkZChqeSk7Zm9yKGk9MDtpPHBvdztpKyspe3ZhciBqeDI9angucmVkU3FyKCksanlkMj1qeWQucmVkU3FyKCksanlkND1qeWQyLnJlZFNxcigpLGM9angyLnJlZEFkZChqeDIpLnJlZElBZGQoangyKS5yZWRJQWRkKGEucmVkTXVsKGp6NCkpLHQxPWp4LnJlZE11bChqeWQyKSxueD1jLnJlZFNxcigpLnJlZElTdWIodDEucmVkQWRkKHQxKSksdDI9dDEucmVkSVN1YihueCksZG55PWMucmVkTXVsKHQyKTtkbnk9ZG55LnJlZElBZGQoZG55KS5yZWRJU3ViKGp5ZDQpO3ZhciBuej1qeWQucmVkTXVsKGp6KTtpKzE8cG93JiYoano0PWp6NC5yZWRNdWwoanlkNCkpLGp4PW54LGp6PW56LGp5ZD1kbnl9cmV0dXJuIHRoaXMuY3VydmUuanBvaW50KGp4LGp5ZC5yZWRNdWwodGludiksanopfSxKUG9pbnQucHJvdG90eXBlLmRibD1mdW5jdGlvbiBkYmwoKXtyZXR1cm4gdGhpcy5pc0luZmluaXR5KCk/dGhpczp0aGlzLmN1cnZlLnplcm9BP3RoaXMuX3plcm9EYmwoKTp0aGlzLmN1cnZlLnRocmVlQT90aGlzLl90aHJlZURibCgpOnRoaXMuX2RibCgpfSxKUG9pbnQucHJvdG90eXBlLl96ZXJvRGJsPWZ1bmN0aW9uIF96ZXJvRGJsKCl7dmFyIG54LG55LG56O2lmKHRoaXMuek9uZSl7dmFyIHh4PXRoaXMueC5yZWRTcXIoKSx5eT10aGlzLnkucmVkU3FyKCkseXl5eT15eS5yZWRTcXIoKSxzPXRoaXMueC5yZWRBZGQoeXkpLnJlZFNxcigpLnJlZElTdWIoeHgpLnJlZElTdWIoeXl5eSk7cz1zLnJlZElBZGQocyk7dmFyIG09eHgucmVkQWRkKHh4KS5yZWRJQWRkKHh4KSx0PW0ucmVkU3FyKCkucmVkSVN1YihzKS5yZWRJU3ViKHMpLHl5eXk4PXl5eXkucmVkSUFkZCh5eXl5KTt5eXl5OD0oeXl5eTg9eXl5eTgucmVkSUFkZCh5eXl5OCkpLnJlZElBZGQoeXl5eTgpLG54PXQsbnk9bS5yZWRNdWwocy5yZWRJU3ViKHQpKS5yZWRJU3ViKHl5eXk4KSxuej10aGlzLnkucmVkQWRkKHRoaXMueSl9ZWxzZXt2YXIgYT10aGlzLngucmVkU3FyKCksYj10aGlzLnkucmVkU3FyKCksYz1iLnJlZFNxcigpLGQ9dGhpcy54LnJlZEFkZChiKS5yZWRTcXIoKS5yZWRJU3ViKGEpLnJlZElTdWIoYyk7ZD1kLnJlZElBZGQoZCk7dmFyIGU9YS5yZWRBZGQoYSkucmVkSUFkZChhKSxmPWUucmVkU3FyKCksYzg9Yy5yZWRJQWRkKGMpO2M4PShjOD1jOC5yZWRJQWRkKGM4KSkucmVkSUFkZChjOCksbng9Zi5yZWRJU3ViKGQpLnJlZElTdWIoZCksbnk9ZS5yZWRNdWwoZC5yZWRJU3ViKG54KSkucmVkSVN1YihjOCksbno9KG56PXRoaXMueS5yZWRNdWwodGhpcy56KSkucmVkSUFkZChueil9cmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG54LG55LG56KX0sSlBvaW50LnByb3RvdHlwZS5fdGhyZWVEYmw9ZnVuY3Rpb24gX3RocmVlRGJsKCl7dmFyIG54LG55LG56O2lmKHRoaXMuek9uZSl7dmFyIHh4PXRoaXMueC5yZWRTcXIoKSx5eT10aGlzLnkucmVkU3FyKCkseXl5eT15eS5yZWRTcXIoKSxzPXRoaXMueC5yZWRBZGQoeXkpLnJlZFNxcigpLnJlZElTdWIoeHgpLnJlZElTdWIoeXl5eSk7cz1zLnJlZElBZGQocyk7dmFyIG09eHgucmVkQWRkKHh4KS5yZWRJQWRkKHh4KS5yZWRJQWRkKHRoaXMuY3VydmUuYSksdD1tLnJlZFNxcigpLnJlZElTdWIocykucmVkSVN1YihzKTtueD10O3ZhciB5eXl5OD15eXl5LnJlZElBZGQoeXl5eSk7eXl5eTg9KHl5eXk4PXl5eXk4LnJlZElBZGQoeXl5eTgpKS5yZWRJQWRkKHl5eXk4KSxueT1tLnJlZE11bChzLnJlZElTdWIodCkpLnJlZElTdWIoeXl5eTgpLG56PXRoaXMueS5yZWRBZGQodGhpcy55KX1lbHNle3ZhciBkZWx0YT10aGlzLnoucmVkU3FyKCksZ2FtbWE9dGhpcy55LnJlZFNxcigpLGJldGE9dGhpcy54LnJlZE11bChnYW1tYSksYWxwaGE9dGhpcy54LnJlZFN1YihkZWx0YSkucmVkTXVsKHRoaXMueC5yZWRBZGQoZGVsdGEpKTthbHBoYT1hbHBoYS5yZWRBZGQoYWxwaGEpLnJlZElBZGQoYWxwaGEpO3ZhciBiZXRhND1iZXRhLnJlZElBZGQoYmV0YSksYmV0YTg9KGJldGE0PWJldGE0LnJlZElBZGQoYmV0YTQpKS5yZWRBZGQoYmV0YTQpO254PWFscGhhLnJlZFNxcigpLnJlZElTdWIoYmV0YTgpLG56PXRoaXMueS5yZWRBZGQodGhpcy56KS5yZWRTcXIoKS5yZWRJU3ViKGdhbW1hKS5yZWRJU3ViKGRlbHRhKTt2YXIgZ2dhbW1hOD1nYW1tYS5yZWRTcXIoKTtnZ2FtbWE4PShnZ2FtbWE4PShnZ2FtbWE4PWdnYW1tYTgucmVkSUFkZChnZ2FtbWE4KSkucmVkSUFkZChnZ2FtbWE4KSkucmVkSUFkZChnZ2FtbWE4KSxueT1hbHBoYS5yZWRNdWwoYmV0YTQucmVkSVN1YihueCkpLnJlZElTdWIoZ2dhbW1hOCl9cmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG54LG55LG56KX0sSlBvaW50LnByb3RvdHlwZS5fZGJsPWZ1bmN0aW9uIF9kYmwoKXt2YXIgYT10aGlzLmN1cnZlLmEsang9dGhpcy54LGp5PXRoaXMueSxqej10aGlzLnosano0PWp6LnJlZFNxcigpLnJlZFNxcigpLGp4Mj1qeC5yZWRTcXIoKSxqeTI9ankucmVkU3FyKCksYz1qeDIucmVkQWRkKGp4MikucmVkSUFkZChqeDIpLnJlZElBZGQoYS5yZWRNdWwoano0KSksanhkND1qeC5yZWRBZGQoangpLHQxPShqeGQ0PWp4ZDQucmVkSUFkZChqeGQ0KSkucmVkTXVsKGp5Miksbng9Yy5yZWRTcXIoKS5yZWRJU3ViKHQxLnJlZEFkZCh0MSkpLHQyPXQxLnJlZElTdWIobngpLGp5ZDg9ankyLnJlZFNxcigpO2p5ZDg9KGp5ZDg9KGp5ZDg9anlkOC5yZWRJQWRkKGp5ZDgpKS5yZWRJQWRkKGp5ZDgpKS5yZWRJQWRkKGp5ZDgpO3ZhciBueT1jLnJlZE11bCh0MikucmVkSVN1YihqeWQ4KSxuej1qeS5yZWRBZGQoankpLnJlZE11bChqeik7cmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG54LG55LG56KX0sSlBvaW50LnByb3RvdHlwZS50cnBsPWZ1bmN0aW9uIHRycGwoKXtpZighdGhpcy5jdXJ2ZS56ZXJvQSlyZXR1cm4gdGhpcy5kYmwoKS5hZGQodGhpcyk7dmFyIHh4PXRoaXMueC5yZWRTcXIoKSx5eT10aGlzLnkucmVkU3FyKCkseno9dGhpcy56LnJlZFNxcigpLHl5eXk9eXkucmVkU3FyKCksbT14eC5yZWRBZGQoeHgpLnJlZElBZGQoeHgpLG1tPW0ucmVkU3FyKCksZT10aGlzLngucmVkQWRkKHl5KS5yZWRTcXIoKS5yZWRJU3ViKHh4KS5yZWRJU3ViKHl5eXkpLGVlPShlPShlPShlPWUucmVkSUFkZChlKSkucmVkQWRkKGUpLnJlZElBZGQoZSkpLnJlZElTdWIobW0pKS5yZWRTcXIoKSx0PXl5eXkucmVkSUFkZCh5eXl5KTt0PSh0PSh0PXQucmVkSUFkZCh0KSkucmVkSUFkZCh0KSkucmVkSUFkZCh0KTt2YXIgdT1tLnJlZElBZGQoZSkucmVkU3FyKCkucmVkSVN1YihtbSkucmVkSVN1YihlZSkucmVkSVN1Yih0KSx5eXU0PXl5LnJlZE11bCh1KTt5eXU0PSh5eXU0PXl5dTQucmVkSUFkZCh5eXU0KSkucmVkSUFkZCh5eXU0KTt2YXIgbng9dGhpcy54LnJlZE11bChlZSkucmVkSVN1Yih5eXU0KTtueD0obng9bngucmVkSUFkZChueCkpLnJlZElBZGQobngpO3ZhciBueT10aGlzLnkucmVkTXVsKHUucmVkTXVsKHQucmVkSVN1Yih1KSkucmVkSVN1YihlLnJlZE11bChlZSkpKTtueT0obnk9KG55PW55LnJlZElBZGQobnkpKS5yZWRJQWRkKG55KSkucmVkSUFkZChueSk7dmFyIG56PXRoaXMuei5yZWRBZGQoZSkucmVkU3FyKCkucmVkSVN1Yih6eikucmVkSVN1YihlZSk7cmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG54LG55LG56KX0sSlBvaW50LnByb3RvdHlwZS5tdWw9ZnVuY3Rpb24gbXVsKGssa2Jhc2Upe3JldHVybiBrPW5ldyBCTihrLGtiYXNlKSx0aGlzLmN1cnZlLl93bmFmTXVsKHRoaXMsayl9LEpQb2ludC5wcm90b3R5cGUuZXE9ZnVuY3Rpb24gZXEocCl7aWYoImFmZmluZSI9PT1wLnR5cGUpcmV0dXJuIHRoaXMuZXEocC50b0ooKSk7aWYodGhpcz09PXApcmV0dXJuITA7dmFyIHoyPXRoaXMuei5yZWRTcXIoKSxwejI9cC56LnJlZFNxcigpO2lmKDAhPT10aGlzLngucmVkTXVsKHB6MikucmVkSVN1YihwLngucmVkTXVsKHoyKSkuY21wbigwKSlyZXR1cm4hMTt2YXIgejM9ejIucmVkTXVsKHRoaXMueikscHozPXB6Mi5yZWRNdWwocC56KTtyZXR1cm4gMD09PXRoaXMueS5yZWRNdWwocHozKS5yZWRJU3ViKHAueS5yZWRNdWwoejMpKS5jbXBuKDApfSxKUG9pbnQucHJvdG90eXBlLmVxWFRvUD1mdW5jdGlvbiBlcVhUb1AoeCl7dmFyIHpzPXRoaXMuei5yZWRTcXIoKSxyeD14LnRvUmVkKHRoaXMuY3VydmUucmVkKS5yZWRNdWwoenMpO2lmKDA9PT10aGlzLnguY21wKHJ4KSlyZXR1cm4hMDtmb3IodmFyIHhjPXguY2xvbmUoKSx0PXRoaXMuY3VydmUucmVkTi5yZWRNdWwoenMpOzspe2lmKHhjLmlhZGQodGhpcy5jdXJ2ZS5uKSx4Yy5jbXAodGhpcy5jdXJ2ZS5wKT49MClyZXR1cm4hMTtpZihyeC5yZWRJQWRkKHQpLDA9PT10aGlzLnguY21wKHJ4KSlyZXR1cm4hMH19LEpQb2ludC5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbiBpbnNwZWN0KCl7cmV0dXJuIHRoaXMuaXNJbmZpbml0eSgpPyI8RUMgSlBvaW50IEluZmluaXR5PiI6IjxFQyBKUG9pbnQgeDogIit0aGlzLngudG9TdHJpbmcoMTYsMikrIiB5OiAiK3RoaXMueS50b1N0cmluZygxNiwyKSsiIHo6ICIrdGhpcy56LnRvU3RyaW5nKDE2LDIpKyI+In0sSlBvaW50LnByb3RvdHlwZS5pc0luZmluaXR5PWZ1bmN0aW9uIGlzSW5maW5pdHkoKXtyZXR1cm4gMD09PXRoaXMuei5jbXBuKDApfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvY3VydmVzLmpzIihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgcHJlLGN1cnZlcz1leHBvcnRzLGhhc2g9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2hhc2guanMvbGliL2hhc2guanMiKSxjdXJ2ZT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL2N1cnZlL2luZGV4LmpzIiksYXNzZXJ0PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvdXRpbHMuanMiKS5hc3NlcnQ7ZnVuY3Rpb24gUHJlc2V0Q3VydmUob3B0aW9ucyl7InNob3J0Ij09PW9wdGlvbnMudHlwZT90aGlzLmN1cnZlPW5ldyBjdXJ2ZS5zaG9ydChvcHRpb25zKToiZWR3YXJkcyI9PT1vcHRpb25zLnR5cGU/dGhpcy5jdXJ2ZT1uZXcgY3VydmUuZWR3YXJkcyhvcHRpb25zKTp0aGlzLmN1cnZlPW5ldyBjdXJ2ZS5tb250KG9wdGlvbnMpLHRoaXMuZz10aGlzLmN1cnZlLmcsdGhpcy5uPXRoaXMuY3VydmUubix0aGlzLmhhc2g9b3B0aW9ucy5oYXNoLGFzc2VydCh0aGlzLmcudmFsaWRhdGUoKSwiSW52YWxpZCBjdXJ2ZSIpLGFzc2VydCh0aGlzLmcubXVsKHRoaXMubikuaXNJbmZpbml0eSgpLCJJbnZhbGlkIGN1cnZlLCBHKk4gIT0gTyIpfWZ1bmN0aW9uIGRlZmluZUN1cnZlKG5hbWUsb3B0aW9ucyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGN1cnZlcyxuYW1lLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXt2YXIgY3VydmU9bmV3IFByZXNldEN1cnZlKG9wdGlvbnMpO3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3VydmVzLG5hbWUse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmN1cnZlfSksY3VydmV9fSl9Y3VydmVzLlByZXNldEN1cnZlPVByZXNldEN1cnZlLGRlZmluZUN1cnZlKCJwMTkyIix7dHlwZToic2hvcnQiLHByaW1lOiJwMTkyIixwOiJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiBmZmZmZmZmZiIsYToiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZmZmYgZmZmZmZmZmMiLGI6IjY0MjEwNTE5IGU1OWM4MGU3IDBmYTdlOWFiIDcyMjQzMDQ5IGZlYjhkZWVjIGMxNDZiOWIxIixuOiJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiA5OWRlZjgzNiAxNDZiYzliMSBiNGQyMjgzMSIsaGFzaDpoYXNoLnNoYTI1NixnUmVkOiExLGc6WyIxODhkYTgwZSBiMDMwOTBmNiA3Y2JmMjBlYiA0M2ExODgwMCBmNGZmMGFmZCA4MmZmMTAxMiIsIjA3MTkyYjk1IGZmYzhkYTc4IDYzMTAxMWVkIDZiMjRjZGQ1IDczZjk3N2ExIDFlNzk0ODExIl19KSxkZWZpbmVDdXJ2ZSgicDIyNCIse3R5cGU6InNob3J0IixwcmltZToicDIyNCIscDoiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEiLGE6ImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIixiOiJiNDA1MGE4NSAwYzA0YjNhYiBmNTQxMzI1NiA1MDQ0YjBiNyBkN2JmZDhiYSAyNzBiMzk0MyAyMzU1ZmZiNCIsbjoiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZjE2YTIgZTBiOGYwM2UgMTNkZDI5NDUgNWM1YzJhM2QiLGhhc2g6aGFzaC5zaGEyNTYsZ1JlZDohMSxnOlsiYjcwZTBjYmQgNmJiNGJmN2YgMzIxMzkwYjkgNGEwM2MxZDMgNTZjMjExMjIgMzQzMjgwZDYgMTE1YzFkMjEiLCJiZDM3NjM4OCBiNWY3MjNmYiA0YzIyZGZlNiBjZDQzNzVhMCA1YTA3NDc2NCA0NGQ1ODE5OSA4NTAwN2UzNCJdfSksZGVmaW5lQ3VydmUoInAyNTYiLHt0eXBlOiJzaG9ydCIscHJpbWU6bnVsbCxwOiJmZmZmZmZmZiAwMDAwMDAwMSAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiIsYToiZmZmZmZmZmYgMDAwMDAwMDEgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmMiLGI6IjVhYzYzNWQ4IGFhM2E5M2U3IGIzZWJiZDU1IDc2OTg4NmJjIDY1MWQwNmIwIGNjNTNiMGY2IDNiY2UzYzNlIDI3ZDI2MDRiIixuOiJmZmZmZmZmZiAwMDAwMDAwMCBmZmZmZmZmZiBmZmZmZmZmZiBiY2U2ZmFhZCBhNzE3OWU4NCBmM2I5Y2FjMiBmYzYzMjU1MSIsaGFzaDpoYXNoLnNoYTI1NixnUmVkOiExLGc6WyI2YjE3ZDFmMiBlMTJjNDI0NyBmOGJjZTZlNSA2M2E0NDBmMiA3NzAzN2Q4MSAyZGViMzNhMCBmNGExMzk0NSBkODk4YzI5NiIsIjRmZTM0MmUyIGZlMWE3ZjliIDhlZTdlYjRhIDdjMGY5ZTE2IDJiY2UzMzU3IDZiMzE1ZWNlIGNiYjY0MDY4IDM3YmY1MWY1Il19KSxkZWZpbmVDdXJ2ZSgicDM4NCIse3R5cGU6InNob3J0IixwcmltZTpudWxsLHA6ImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIGZmZmZmZmZmIixhOiJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmYyIsYjoiYjMzMTJmYTcgZTIzZWU3ZTQgOTg4ZTA1NmIgZTNmODJkMTkgMTgxZDljNmUgZmU4MTQxMTIgMDMxNDA4OGYgNTAxMzg3NWEgYzY1NjM5OGQgOGEyZWQxOWQgMmE4NWM4ZWQgZDNlYzJhZWYiLG46ImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGM3NjM0ZDgxIGY0MzcyZGRmIDU4MWEwZGIyIDQ4YjBhNzdhIGVjZWMxOTZhIGNjYzUyOTczIixoYXNoOmhhc2guc2hhMzg0LGdSZWQ6ITEsZzpbImFhODdjYTIyIGJlOGIwNTM3IDhlYjFjNzFlIGYzMjBhZDc0IDZlMWQzYjYyIDhiYTc5Yjk4IDU5Zjc0MWUwIDgyNTQyYTM4IDU1MDJmMjVkIGJmNTUyOTZjIDNhNTQ1ZTM4IDcyNzYwYWI3IiwiMzYxN2RlNGEgOTYyNjJjNmYgNWQ5ZTk4YmYgOTI5MmRjMjkgZjhmNDFkYmQgMjg5YTE0N2MgZTlkYTMxMTMgYjVmMGI4YzAgMGE2MGIxY2UgMWQ3ZTgxOWQgN2E0MzFkN2MgOTBlYTBlNWYiXX0pLGRlZmluZUN1cnZlKCJwNTIxIix7dHlwZToic2hvcnQiLHByaW1lOm51bGwscDoiMDAwMDAxZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYiLGE6IjAwMDAwMWZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZjIixiOiIwMDAwMDA1MSA5NTNlYjk2MSA4ZTFjOWExZiA5MjlhMjFhMCBiNjg1NDBlZSBhMmRhNzI1YiA5OWIzMTVmMyBiOGI0ODk5MSA4ZWYxMDllMSA1NjE5Mzk1MSBlYzdlOTM3YiAxNjUyYzBiZCAzYmIxYmYwNyAzNTczZGY4OCAzZDJjMzRmMSBlZjQ1MWZkNCA2YjUwM2YwMCIsbjoiMDAwMDAxZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmEgNTE4Njg3ODMgYmYyZjk2NmIgN2ZjYzAxNDggZjcwOWE1ZDAgM2JiNWM5YjggODk5YzQ3YWUgYmI2ZmI3MWUgOTEzODY0MDkiLGhhc2g6aGFzaC5zaGE1MTIsZ1JlZDohMSxnOlsiMDAwMDAwYzYgODU4ZTA2YjcgMDQwNGU5Y2QgOWUzZWNiNjYgMjM5NWI0NDIgOWM2NDgxMzkgMDUzZmI1MjEgZjgyOGFmNjAgNmI0ZDNkYmEgYTE0YjVlNzcgZWZlNzU5MjggZmUxZGMxMjcgYTJmZmE4ZGUgMzM0OGIzYzEgODU2YTQyOWIgZjk3ZTdlMzEgYzJlNWJkNjYiLCIwMDAwMDExOCAzOTI5NmE3OCA5YTNiYzAwNCA1YzhhNWZiNCAyYzdkMWJkOSA5OGY1NDQ0OSA1NzliNDQ2OCAxN2FmYmQxNyAyNzNlNjYyYyA5N2VlNzI5OSA1ZWY0MjY0MCBjNTUwYjkwMSAzZmFkMDc2MSAzNTNjNzA4NiBhMjcyYzI0MCA4OGJlOTQ3NiA5ZmQxNjY1MCJdfSksZGVmaW5lQ3VydmUoImN1cnZlMjU1MTkiLHt0eXBlOiJtb250IixwcmltZToicDI1NTE5IixwOiI3ZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmVkIixhOiI3NmQwNiIsYjoiMSIsbjoiMTAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIDE0ZGVmOWRlYTJmNzljZDYgNTgxMjYzMWE1Y2Y1ZDNlZCIsaGFzaDpoYXNoLnNoYTI1NixnUmVkOiExLGc6WyI5Il19KSxkZWZpbmVDdXJ2ZSgiZWQyNTUxOSIse3R5cGU6ImVkd2FyZHMiLHByaW1lOiJwMjU1MTkiLHA6IjdmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZWQiLGE6Ii0xIixjOiIxIixkOiI1MjAzNmNlZTJiNmZmZTczIDhjYzc0MDc5Nzc3OWU4OTggMDA3MDBhNGQ0MTQxZDhhYiA3NWViNGRjYTEzNTk3OGEzIixuOiIxMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgMTRkZWY5ZGVhMmY3OWNkNiA1ODEyNjMxYTVjZjVkM2VkIixoYXNoOmhhc2guc2hhMjU2LGdSZWQ6ITEsZzpbIjIxNjkzNmQzY2Q2ZTUzZmVjMGE0ZTIzMWZkZDZkYzVjNjkyY2M3NjA5NTI1YTdiMmM5NTYyZDYwOGYyNWQ1MWEiLCI2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjU4Il19KTt0cnl7cHJlPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvcHJlY29tcHV0ZWQvc2VjcDI1NmsxLmpzIil9Y2F0Y2goZSl7cHJlPXZvaWQgMH1kZWZpbmVDdXJ2ZSgic2VjcDI1NmsxIix7dHlwZToic2hvcnQiLHByaW1lOiJrMjU2IixwOiJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmMyZiIsYToiMCIsYjoiNyIsbjoiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgYmFhZWRjZTYgYWY0OGEwM2IgYmZkMjVlOGMgZDAzNjQxNDEiLGg6IjEiLGhhc2g6aGFzaC5zaGEyNTYsYmV0YToiN2FlOTZhMmI2NTdjMDcxMDZlNjQ0NzllYWMzNDM0ZTk5Y2YwNDk3NTEyZjU4OTk1YzEzOTZjMjg3MTk1MDFlZSIsbGFtYmRhOiI1MzYzYWQ0Y2MwNWMzMGUwYTUyNjFjMDI4ODEyNjQ1YTEyMmUyMmVhMjA4MTY2NzhkZjAyOTY3YzFiMjNiZDcyIixiYXNpczpbe2E6IjMwODZkMjIxYTdkNDZiY2RlODZjOTBlNDkyODRlYjE1IixiOiItZTQ0MzdlZDYwMTBlODgyODZmNTQ3ZmE5MGFiZmU0YzMifSx7YToiMTE0Y2E1MGY3YThlMmYzZjY1N2MxMTA4ZDlkNDRjZmQ4IixiOiIzMDg2ZDIyMWE3ZDQ2YmNkZTg2YzkwZTQ5Mjg0ZWIxNSJ9XSxnUmVkOiExLGc6WyI3OWJlNjY3ZWY5ZGNiYmFjNTVhMDYyOTVjZTg3MGIwNzAyOWJmY2RiMmRjZTI4ZDk1OWYyODE1YjE2ZjgxNzk4IiwiNDgzYWRhNzcyNmEzYzQ2NTVkYTRmYmZjMGUxMTA4YThmZDE3YjQ0OGE2ODU1NDE5OWM0N2QwOGZmYjEwZDRiOCIscHJlXX0pfSwiLi4vLi4vbm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy9lYy9pbmRleC5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIEJOPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9ibi5qcy9saWIvYm4uanMiKSxIbWFjRFJCRz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaG1hYy1kcmJnL2xpYi9obWFjLWRyYmcuanMiKSx1dGlscz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL3V0aWxzLmpzIiksY3VydmVzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvY3VydmVzLmpzIikscmFuZD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvcmFuZC9pbmRleC5qcyIpLGFzc2VydD11dGlscy5hc3NlcnQsS2V5UGFpcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL2VjL2tleS5qcyIpLFNpZ25hdHVyZT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL2VjL3NpZ25hdHVyZS5qcyIpO2Z1bmN0aW9uIEVDKG9wdGlvbnMpe2lmKCEodGhpcyBpbnN0YW5jZW9mIEVDKSlyZXR1cm4gbmV3IEVDKG9wdGlvbnMpOyJzdHJpbmciPT10eXBlb2Ygb3B0aW9ucyYmKGFzc2VydChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3VydmVzLG9wdGlvbnMpLCJVbmtub3duIGN1cnZlICIrb3B0aW9ucyksb3B0aW9ucz1jdXJ2ZXNbb3B0aW9uc10pLG9wdGlvbnMgaW5zdGFuY2VvZiBjdXJ2ZXMuUHJlc2V0Q3VydmUmJihvcHRpb25zPXtjdXJ2ZTpvcHRpb25zfSksdGhpcy5jdXJ2ZT1vcHRpb25zLmN1cnZlLmN1cnZlLHRoaXMubj10aGlzLmN1cnZlLm4sdGhpcy5uaD10aGlzLm4udXNocm4oMSksdGhpcy5nPXRoaXMuY3VydmUuZyx0aGlzLmc9b3B0aW9ucy5jdXJ2ZS5nLHRoaXMuZy5wcmVjb21wdXRlKG9wdGlvbnMuY3VydmUubi5iaXRMZW5ndGgoKSsxKSx0aGlzLmhhc2g9b3B0aW9ucy5oYXNofHxvcHRpb25zLmN1cnZlLmhhc2h9bW9kdWxlLmV4cG9ydHM9RUMsRUMucHJvdG90eXBlLmtleVBhaXI9ZnVuY3Rpb24ga2V5UGFpcihvcHRpb25zKXtyZXR1cm4gbmV3IEtleVBhaXIodGhpcyxvcHRpb25zKX0sRUMucHJvdG90eXBlLmtleUZyb21Qcml2YXRlPWZ1bmN0aW9uIGtleUZyb21Qcml2YXRlKHByaXYsZW5jKXtyZXR1cm4gS2V5UGFpci5mcm9tUHJpdmF0ZSh0aGlzLHByaXYsZW5jKX0sRUMucHJvdG90eXBlLmtleUZyb21QdWJsaWM9ZnVuY3Rpb24ga2V5RnJvbVB1YmxpYyhwdWIsZW5jKXtyZXR1cm4gS2V5UGFpci5mcm9tUHVibGljKHRoaXMscHViLGVuYyl9LEVDLnByb3RvdHlwZS5nZW5LZXlQYWlyPWZ1bmN0aW9uIGdlbktleVBhaXIob3B0aW9ucyl7b3B0aW9uc3x8KG9wdGlvbnM9e30pO2Zvcih2YXIgZHJiZz1uZXcgSG1hY0RSQkcoe2hhc2g6dGhpcy5oYXNoLHBlcnM6b3B0aW9ucy5wZXJzLHBlcnNFbmM6b3B0aW9ucy5wZXJzRW5jfHwidXRmOCIsZW50cm9weTpvcHRpb25zLmVudHJvcHl8fHJhbmQodGhpcy5oYXNoLmhtYWNTdHJlbmd0aCksZW50cm9weUVuYzpvcHRpb25zLmVudHJvcHkmJm9wdGlvbnMuZW50cm9weUVuY3x8InV0ZjgiLG5vbmNlOnRoaXMubi50b0FycmF5KCl9KSxieXRlcz10aGlzLm4uYnl0ZUxlbmd0aCgpLG5zMj10aGlzLm4uc3ViKG5ldyBCTigyKSk7Oyl7dmFyIHByaXY9bmV3IEJOKGRyYmcuZ2VuZXJhdGUoYnl0ZXMpKTtpZighKHByaXYuY21wKG5zMik+MCkpcmV0dXJuIHByaXYuaWFkZG4oMSksdGhpcy5rZXlGcm9tUHJpdmF0ZShwcml2KX19LEVDLnByb3RvdHlwZS5fdHJ1bmNhdGVUb049ZnVuY3Rpb24gX3RydW5jYXRlVG9OKG1zZyx0cnVuY09ubHksYml0TGVuZ3RoKXt2YXIgYnl0ZUxlbmd0aDtpZihCTi5pc0JOKG1zZyl8fCJudW1iZXIiPT10eXBlb2YgbXNnKWJ5dGVMZW5ndGg9KG1zZz1uZXcgQk4obXNnLDE2KSkuYnl0ZUxlbmd0aCgpO2Vsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiBtc2cpYnl0ZUxlbmd0aD1tc2cubGVuZ3RoLG1zZz1uZXcgQk4obXNnLDE2KTtlbHNle3ZhciBzdHI9bXNnLnRvU3RyaW5nKCk7Ynl0ZUxlbmd0aD1zdHIubGVuZ3RoKzE+Pj4xLG1zZz1uZXcgQk4oc3RyLDE2KX0ibnVtYmVyIiE9dHlwZW9mIGJpdExlbmd0aCYmKGJpdExlbmd0aD04KmJ5dGVMZW5ndGgpO3ZhciBkZWx0YT1iaXRMZW5ndGgtdGhpcy5uLmJpdExlbmd0aCgpO3JldHVybiBkZWx0YT4wJiYobXNnPW1zZy51c2hybihkZWx0YSkpLCF0cnVuY09ubHkmJm1zZy5jbXAodGhpcy5uKT49MD9tc2cuc3ViKHRoaXMubik6bXNnfSxFQy5wcm90b3R5cGUuc2lnbj1mdW5jdGlvbiBzaWduKG1zZyxrZXksZW5jLG9wdGlvbnMpe2lmKCJvYmplY3QiPT10eXBlb2YgZW5jJiYob3B0aW9ucz1lbmMsZW5jPW51bGwpLG9wdGlvbnN8fChvcHRpb25zPXt9KSwic3RyaW5nIiE9dHlwZW9mIG1zZyYmIm51bWJlciIhPXR5cGVvZiBtc2cmJiFCTi5pc0JOKG1zZykpe2Fzc2VydCgib2JqZWN0Ij09dHlwZW9mIG1zZyYmbXNnJiYibnVtYmVyIj09dHlwZW9mIG1zZy5sZW5ndGgsIkV4cGVjdGVkIG1lc3NhZ2UgdG8gYmUgYW4gYXJyYXktbGlrZSwgYSBoZXggc3RyaW5nLCBvciBhIEJOIGluc3RhbmNlIiksYXNzZXJ0KG1zZy5sZW5ndGg+Pj4wPT09bXNnLmxlbmd0aCk7Zm9yKHZhciBpPTA7aTxtc2cubGVuZ3RoO2krKylhc3NlcnQoKDI1NSZtc2dbaV0pPT09bXNnW2ldKX1rZXk9dGhpcy5rZXlGcm9tUHJpdmF0ZShrZXksZW5jKSxtc2c9dGhpcy5fdHJ1bmNhdGVUb04obXNnLCExLG9wdGlvbnMubXNnQml0TGVuZ3RoKSxhc3NlcnQoIW1zZy5pc05lZygpLCJDYW4gbm90IHNpZ24gYSBuZWdhdGl2ZSBtZXNzYWdlIik7dmFyIGJ5dGVzPXRoaXMubi5ieXRlTGVuZ3RoKCksYmtleT1rZXkuZ2V0UHJpdmF0ZSgpLnRvQXJyYXkoImJlIixieXRlcyksbm9uY2U9bXNnLnRvQXJyYXkoImJlIixieXRlcyk7YXNzZXJ0KG5ldyBCTihub25jZSkuZXEobXNnKSwiQ2FuIG5vdCBzaWduIG1lc3NhZ2UiKTtmb3IodmFyIGRyYmc9bmV3IEhtYWNEUkJHKHtoYXNoOnRoaXMuaGFzaCxlbnRyb3B5OmJrZXksbm9uY2UscGVyczpvcHRpb25zLnBlcnMscGVyc0VuYzpvcHRpb25zLnBlcnNFbmN8fCJ1dGY4In0pLG5zMT10aGlzLm4uc3ViKG5ldyBCTigxKSksaXRlcj0wOztpdGVyKyspe3ZhciBrPW9wdGlvbnMuaz9vcHRpb25zLmsoaXRlcik6bmV3IEJOKGRyYmcuZ2VuZXJhdGUodGhpcy5uLmJ5dGVMZW5ndGgoKSkpO2lmKCEoKGs9dGhpcy5fdHJ1bmNhdGVUb04oaywhMCkpLmNtcG4oMSk8PTB8fGsuY21wKG5zMSk+PTApKXt2YXIga3A9dGhpcy5nLm11bChrKTtpZigha3AuaXNJbmZpbml0eSgpKXt2YXIga3BYPWtwLmdldFgoKSxyPWtwWC51bW9kKHRoaXMubik7aWYoMCE9PXIuY21wbigwKSl7dmFyIHM9ay5pbnZtKHRoaXMubikubXVsKHIubXVsKGtleS5nZXRQcml2YXRlKCkpLmlhZGQobXNnKSk7aWYoMCE9PShzPXMudW1vZCh0aGlzLm4pKS5jbXBuKDApKXt2YXIgcmVjb3ZlcnlQYXJhbT0oa3AuZ2V0WSgpLmlzT2RkKCk/MTowKXwoMCE9PWtwWC5jbXAocik/MjowKTtyZXR1cm4gb3B0aW9ucy5jYW5vbmljYWwmJnMuY21wKHRoaXMubmgpPjAmJihzPXRoaXMubi5zdWIocykscmVjb3ZlcnlQYXJhbV49MSksbmV3IFNpZ25hdHVyZSh7cixzLHJlY292ZXJ5UGFyYW19KX19fX19fSxFQy5wcm90b3R5cGUudmVyaWZ5PWZ1bmN0aW9uIHZlcmlmeShtc2csc2lnbmF0dXJlLGtleSxlbmMsb3B0aW9ucyl7b3B0aW9uc3x8KG9wdGlvbnM9e30pLG1zZz10aGlzLl90cnVuY2F0ZVRvTihtc2csITEsb3B0aW9ucy5tc2dCaXRMZW5ndGgpLGtleT10aGlzLmtleUZyb21QdWJsaWMoa2V5LGVuYyk7dmFyIHI9KHNpZ25hdHVyZT1uZXcgU2lnbmF0dXJlKHNpZ25hdHVyZSwiaGV4IikpLnIscz1zaWduYXR1cmUucztpZihyLmNtcG4oMSk8MHx8ci5jbXAodGhpcy5uKT49MClyZXR1cm4hMTtpZihzLmNtcG4oMSk8MHx8cy5jbXAodGhpcy5uKT49MClyZXR1cm4hMTt2YXIgcCxzaW52PXMuaW52bSh0aGlzLm4pLHUxPXNpbnYubXVsKG1zZykudW1vZCh0aGlzLm4pLHUyPXNpbnYubXVsKHIpLnVtb2QodGhpcy5uKTtyZXR1cm4gdGhpcy5jdXJ2ZS5fbWF4d2VsbFRyaWNrPyEocD10aGlzLmcuam11bEFkZCh1MSxrZXkuZ2V0UHVibGljKCksdTIpKS5pc0luZmluaXR5KCkmJnAuZXFYVG9QKHIpOiEocD10aGlzLmcubXVsQWRkKHUxLGtleS5nZXRQdWJsaWMoKSx1MikpLmlzSW5maW5pdHkoKSYmMD09PXAuZ2V0WCgpLnVtb2QodGhpcy5uKS5jbXAocil9LEVDLnByb3RvdHlwZS5yZWNvdmVyUHViS2V5PWZ1bmN0aW9uKG1zZyxzaWduYXR1cmUsaixlbmMpe2Fzc2VydCgoMyZqKT09PWosIlRoZSByZWNvdmVyeSBwYXJhbSBpcyBtb3JlIHRoYW4gdHdvIGJpdHMiKSxzaWduYXR1cmU9bmV3IFNpZ25hdHVyZShzaWduYXR1cmUsZW5jKTt2YXIgbj10aGlzLm4sZT1uZXcgQk4obXNnKSxyPXNpZ25hdHVyZS5yLHM9c2lnbmF0dXJlLnMsaXNZT2RkPTEmaixpc1NlY29uZEtleT1qPj4xO2lmKHIuY21wKHRoaXMuY3VydmUucC51bW9kKHRoaXMuY3VydmUubikpPj0wJiZpc1NlY29uZEtleSl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBmaW5kIHNlbmNvbmQga2V5IGNhbmRpbmF0ZSIpO3I9aXNTZWNvbmRLZXk/dGhpcy5jdXJ2ZS5wb2ludEZyb21YKHIuYWRkKHRoaXMuY3VydmUubiksaXNZT2RkKTp0aGlzLmN1cnZlLnBvaW50RnJvbVgocixpc1lPZGQpO3ZhciBySW52PXNpZ25hdHVyZS5yLmludm0obiksczE9bi5zdWIoZSkubXVsKHJJbnYpLnVtb2QobiksczI9cy5tdWwockludikudW1vZChuKTtyZXR1cm4gdGhpcy5nLm11bEFkZChzMSxyLHMyKX0sRUMucHJvdG90eXBlLmdldEtleVJlY292ZXJ5UGFyYW09ZnVuY3Rpb24oZSxzaWduYXR1cmUsUSxlbmMpe2lmKG51bGwhPT0oc2lnbmF0dXJlPW5ldyBTaWduYXR1cmUoc2lnbmF0dXJlLGVuYykpLnJlY292ZXJ5UGFyYW0pcmV0dXJuIHNpZ25hdHVyZS5yZWNvdmVyeVBhcmFtO2Zvcih2YXIgaT0wO2k8NDtpKyspe3ZhciBRcHJpbWU7dHJ5e1FwcmltZT10aGlzLnJlY292ZXJQdWJLZXkoZSxzaWduYXR1cmUsaSl9Y2F0Y2goZSl7Y29udGludWV9aWYoUXByaW1lLmVxKFEpKXJldHVybiBpfXRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGZpbmQgdmFsaWQgcmVjb3ZlcnkgZmFjdG9yIil9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy9lYy9rZXkuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBCTj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYm4uanMvbGliL2JuLmpzIiksYXNzZXJ0PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9lbGxpcHRpYy9saWIvZWxsaXB0aWMvdXRpbHMuanMiKS5hc3NlcnQ7ZnVuY3Rpb24gS2V5UGFpcihlYyxvcHRpb25zKXt0aGlzLmVjPWVjLHRoaXMucHJpdj1udWxsLHRoaXMucHViPW51bGwsb3B0aW9ucy5wcml2JiZ0aGlzLl9pbXBvcnRQcml2YXRlKG9wdGlvbnMucHJpdixvcHRpb25zLnByaXZFbmMpLG9wdGlvbnMucHViJiZ0aGlzLl9pbXBvcnRQdWJsaWMob3B0aW9ucy5wdWIsb3B0aW9ucy5wdWJFbmMpfW1vZHVsZS5leHBvcnRzPUtleVBhaXIsS2V5UGFpci5mcm9tUHVibGljPWZ1bmN0aW9uIGZyb21QdWJsaWMoZWMscHViLGVuYyl7cmV0dXJuIHB1YiBpbnN0YW5jZW9mIEtleVBhaXI/cHViOm5ldyBLZXlQYWlyKGVjLHtwdWIscHViRW5jOmVuY30pfSxLZXlQYWlyLmZyb21Qcml2YXRlPWZ1bmN0aW9uIGZyb21Qcml2YXRlKGVjLHByaXYsZW5jKXtyZXR1cm4gcHJpdiBpbnN0YW5jZW9mIEtleVBhaXI/cHJpdjpuZXcgS2V5UGFpcihlYyx7cHJpdixwcml2RW5jOmVuY30pfSxLZXlQYWlyLnByb3RvdHlwZS52YWxpZGF0ZT1mdW5jdGlvbiB2YWxpZGF0ZSgpe3ZhciBwdWI9dGhpcy5nZXRQdWJsaWMoKTtyZXR1cm4gcHViLmlzSW5maW5pdHkoKT97cmVzdWx0OiExLHJlYXNvbjoiSW52YWxpZCBwdWJsaWMga2V5In06cHViLnZhbGlkYXRlKCk/cHViLm11bCh0aGlzLmVjLmN1cnZlLm4pLmlzSW5maW5pdHkoKT97cmVzdWx0OiEwLHJlYXNvbjpudWxsfTp7cmVzdWx0OiExLHJlYXNvbjoiUHVibGljIGtleSAqIE4gIT0gTyJ9OntyZXN1bHQ6ITEscmVhc29uOiJQdWJsaWMga2V5IGlzIG5vdCBhIHBvaW50In19LEtleVBhaXIucHJvdG90eXBlLmdldFB1YmxpYz1mdW5jdGlvbiBnZXRQdWJsaWMoY29tcGFjdCxlbmMpe3JldHVybiJzdHJpbmciPT10eXBlb2YgY29tcGFjdCYmKGVuYz1jb21wYWN0LGNvbXBhY3Q9bnVsbCksdGhpcy5wdWJ8fCh0aGlzLnB1Yj10aGlzLmVjLmcubXVsKHRoaXMucHJpdikpLGVuYz90aGlzLnB1Yi5lbmNvZGUoZW5jLGNvbXBhY3QpOnRoaXMucHVifSxLZXlQYWlyLnByb3RvdHlwZS5nZXRQcml2YXRlPWZ1bmN0aW9uIGdldFByaXZhdGUoZW5jKXtyZXR1cm4iaGV4Ij09PWVuYz90aGlzLnByaXYudG9TdHJpbmcoMTYsMik6dGhpcy5wcml2fSxLZXlQYWlyLnByb3RvdHlwZS5faW1wb3J0UHJpdmF0ZT1mdW5jdGlvbiBfaW1wb3J0UHJpdmF0ZShrZXksZW5jKXt0aGlzLnByaXY9bmV3IEJOKGtleSxlbmN8fDE2KSx0aGlzLnByaXY9dGhpcy5wcml2LnVtb2QodGhpcy5lYy5jdXJ2ZS5uKX0sS2V5UGFpci5wcm90b3R5cGUuX2ltcG9ydFB1YmxpYz1mdW5jdGlvbiBfaW1wb3J0UHVibGljKGtleSxlbmMpe2lmKGtleS54fHxrZXkueSlyZXR1cm4ibW9udCI9PT10aGlzLmVjLmN1cnZlLnR5cGU/YXNzZXJ0KGtleS54LCJOZWVkIHggY29vcmRpbmF0ZSIpOiJzaG9ydCIhPT10aGlzLmVjLmN1cnZlLnR5cGUmJiJlZHdhcmRzIiE9PXRoaXMuZWMuY3VydmUudHlwZXx8YXNzZXJ0KGtleS54JiZrZXkueSwiTmVlZCBib3RoIHggYW5kIHkgY29vcmRpbmF0ZSIpLHZvaWQodGhpcy5wdWI9dGhpcy5lYy5jdXJ2ZS5wb2ludChrZXkueCxrZXkueSkpO3RoaXMucHViPXRoaXMuZWMuY3VydmUuZGVjb2RlUG9pbnQoa2V5LGVuYyl9LEtleVBhaXIucHJvdG90eXBlLmRlcml2ZT1mdW5jdGlvbiBkZXJpdmUocHViKXtyZXR1cm4gcHViLnZhbGlkYXRlKCl8fGFzc2VydChwdWIudmFsaWRhdGUoKSwicHVibGljIHBvaW50IG5vdCB2YWxpZGF0ZWQiKSxwdWIubXVsKHRoaXMucHJpdikuZ2V0WCgpfSxLZXlQYWlyLnByb3RvdHlwZS5zaWduPWZ1bmN0aW9uIHNpZ24obXNnLGVuYyxvcHRpb25zKXtyZXR1cm4gdGhpcy5lYy5zaWduKG1zZyx0aGlzLGVuYyxvcHRpb25zKX0sS2V5UGFpci5wcm90b3R5cGUudmVyaWZ5PWZ1bmN0aW9uIHZlcmlmeShtc2csc2lnbmF0dXJlLG9wdGlvbnMpe3JldHVybiB0aGlzLmVjLnZlcmlmeShtc2csc2lnbmF0dXJlLHRoaXMsdm9pZCAwLG9wdGlvbnMpfSxLZXlQYWlyLnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uIGluc3BlY3QoKXtyZXR1cm4iPEtleSBwcml2OiAiKyh0aGlzLnByaXYmJnRoaXMucHJpdi50b1N0cmluZygxNiwyKSkrIiBwdWI6ICIrKHRoaXMucHViJiZ0aGlzLnB1Yi5pbnNwZWN0KCkpKyIgPiJ9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy9lYy9zaWduYXR1cmUuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBCTj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYm4uanMvbGliL2JuLmpzIiksdXRpbHM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy91dGlscy5qcyIpLGFzc2VydD11dGlscy5hc3NlcnQ7ZnVuY3Rpb24gU2lnbmF0dXJlKG9wdGlvbnMsZW5jKXtpZihvcHRpb25zIGluc3RhbmNlb2YgU2lnbmF0dXJlKXJldHVybiBvcHRpb25zO3RoaXMuX2ltcG9ydERFUihvcHRpb25zLGVuYyl8fChhc3NlcnQob3B0aW9ucy5yJiZvcHRpb25zLnMsIlNpZ25hdHVyZSB3aXRob3V0IHIgb3IgcyIpLHRoaXMucj1uZXcgQk4ob3B0aW9ucy5yLDE2KSx0aGlzLnM9bmV3IEJOKG9wdGlvbnMucywxNiksdm9pZCAwPT09b3B0aW9ucy5yZWNvdmVyeVBhcmFtP3RoaXMucmVjb3ZlcnlQYXJhbT1udWxsOnRoaXMucmVjb3ZlcnlQYXJhbT1vcHRpb25zLnJlY292ZXJ5UGFyYW0pfWZ1bmN0aW9uIFBvc2l0aW9uKCl7dGhpcy5wbGFjZT0wfWZ1bmN0aW9uIGdldExlbmd0aChidWYscCl7dmFyIGluaXRpYWw9YnVmW3AucGxhY2UrK107aWYoISgxMjgmaW5pdGlhbCkpcmV0dXJuIGluaXRpYWw7dmFyIG9jdGV0TGVuPTE1JmluaXRpYWw7aWYoMD09PW9jdGV0TGVufHxvY3RldExlbj40KXJldHVybiExO2lmKDA9PT1idWZbcC5wbGFjZV0pcmV0dXJuITE7Zm9yKHZhciB2YWw9MCxpPTAsb2ZmPXAucGxhY2U7aTxvY3RldExlbjtpKyssb2ZmKyspdmFsPDw9OCx2YWx8PWJ1ZltvZmZdLHZhbD4+Pj0wO3JldHVybiEodmFsPD0xMjcpJiYocC5wbGFjZT1vZmYsdmFsKX1mdW5jdGlvbiBybVBhZGRpbmcoYnVmKXtmb3IodmFyIGk9MCxsZW49YnVmLmxlbmd0aC0xOyFidWZbaV0mJiEoMTI4JmJ1ZltpKzFdKSYmaTxsZW47KWkrKztyZXR1cm4gMD09PWk/YnVmOmJ1Zi5zbGljZShpKX1mdW5jdGlvbiBjb25zdHJ1Y3RMZW5ndGgoYXJyLGxlbil7aWYobGVuPDEyOClhcnIucHVzaChsZW4pO2Vsc2V7dmFyIG9jdGV0cz0xKyhNYXRoLmxvZyhsZW4pL01hdGguTE4yPj4+Myk7Zm9yKGFyci5wdXNoKDEyOHxvY3RldHMpOy0tb2N0ZXRzOylhcnIucHVzaChsZW4+Pj4ob2N0ZXRzPDwzKSYyNTUpO2Fyci5wdXNoKGxlbil9fW1vZHVsZS5leHBvcnRzPVNpZ25hdHVyZSxTaWduYXR1cmUucHJvdG90eXBlLl9pbXBvcnRERVI9ZnVuY3Rpb24gX2ltcG9ydERFUihkYXRhLGVuYyl7ZGF0YT11dGlscy50b0FycmF5KGRhdGEsZW5jKTt2YXIgcD1uZXcgUG9zaXRpb247aWYoNDghPT1kYXRhW3AucGxhY2UrK10pcmV0dXJuITE7dmFyIGxlbj1nZXRMZW5ndGgoZGF0YSxwKTtpZighMT09PWxlbilyZXR1cm4hMTtpZihsZW4rcC5wbGFjZSE9PWRhdGEubGVuZ3RoKXJldHVybiExO2lmKDIhPT1kYXRhW3AucGxhY2UrK10pcmV0dXJuITE7dmFyIHJsZW49Z2V0TGVuZ3RoKGRhdGEscCk7aWYoITE9PT1ybGVuKXJldHVybiExO2lmKDEyOCZkYXRhW3AucGxhY2VdKXJldHVybiExO3ZhciByPWRhdGEuc2xpY2UocC5wbGFjZSxybGVuK3AucGxhY2UpO2lmKHAucGxhY2UrPXJsZW4sMiE9PWRhdGFbcC5wbGFjZSsrXSlyZXR1cm4hMTt2YXIgc2xlbj1nZXRMZW5ndGgoZGF0YSxwKTtpZighMT09PXNsZW4pcmV0dXJuITE7aWYoZGF0YS5sZW5ndGghPT1zbGVuK3AucGxhY2UpcmV0dXJuITE7aWYoMTI4JmRhdGFbcC5wbGFjZV0pcmV0dXJuITE7dmFyIHM9ZGF0YS5zbGljZShwLnBsYWNlLHNsZW4rcC5wbGFjZSk7aWYoMD09PXJbMF0pe2lmKCEoMTI4JnJbMV0pKXJldHVybiExO3I9ci5zbGljZSgxKX1pZigwPT09c1swXSl7aWYoISgxMjgmc1sxXSkpcmV0dXJuITE7cz1zLnNsaWNlKDEpfXJldHVybiB0aGlzLnI9bmV3IEJOKHIpLHRoaXMucz1uZXcgQk4ocyksdGhpcy5yZWNvdmVyeVBhcmFtPW51bGwsITB9LFNpZ25hdHVyZS5wcm90b3R5cGUudG9ERVI9ZnVuY3Rpb24gdG9ERVIoZW5jKXt2YXIgcj10aGlzLnIudG9BcnJheSgpLHM9dGhpcy5zLnRvQXJyYXkoKTtmb3IoMTI4JnJbMF0mJihyPVswXS5jb25jYXQocikpLDEyOCZzWzBdJiYocz1bMF0uY29uY2F0KHMpKSxyPXJtUGFkZGluZyhyKSxzPXJtUGFkZGluZyhzKTshKHNbMF18fDEyOCZzWzFdKTspcz1zLnNsaWNlKDEpO3ZhciBhcnI9WzJdO2NvbnN0cnVjdExlbmd0aChhcnIsci5sZW5ndGgpLChhcnI9YXJyLmNvbmNhdChyKSkucHVzaCgyKSxjb25zdHJ1Y3RMZW5ndGgoYXJyLHMubGVuZ3RoKTt2YXIgYmFja0hhbGY9YXJyLmNvbmNhdChzKSxyZXM9WzQ4XTtyZXR1cm4gY29uc3RydWN0TGVuZ3RoKHJlcyxiYWNrSGFsZi5sZW5ndGgpLHJlcz1yZXMuY29uY2F0KGJhY2tIYWxmKSx1dGlscy5lbmNvZGUocmVzLGVuYyl9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy9lZGRzYS9pbmRleC5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIGhhc2g9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2hhc2guanMvbGliL2hhc2guanMiKSxjdXJ2ZXM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy9jdXJ2ZXMuanMiKSx1dGlscz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL3V0aWxzLmpzIiksYXNzZXJ0PXV0aWxzLmFzc2VydCxwYXJzZUJ5dGVzPXV0aWxzLnBhcnNlQnl0ZXMsS2V5UGFpcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL2VkZHNhL2tleS5qcyIpLFNpZ25hdHVyZT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL2VkZHNhL3NpZ25hdHVyZS5qcyIpO2Z1bmN0aW9uIEVERFNBKGN1cnZlKXtpZihhc3NlcnQoImVkMjU1MTkiPT09Y3VydmUsIm9ubHkgdGVzdGVkIHdpdGggZWQyNTUxOSBzbyBmYXIiKSwhKHRoaXMgaW5zdGFuY2VvZiBFRERTQSkpcmV0dXJuIG5ldyBFRERTQShjdXJ2ZSk7Y3VydmU9Y3VydmVzW2N1cnZlXS5jdXJ2ZSx0aGlzLmN1cnZlPWN1cnZlLHRoaXMuZz1jdXJ2ZS5nLHRoaXMuZy5wcmVjb21wdXRlKGN1cnZlLm4uYml0TGVuZ3RoKCkrMSksdGhpcy5wb2ludENsYXNzPWN1cnZlLnBvaW50KCkuY29uc3RydWN0b3IsdGhpcy5lbmNvZGluZ0xlbmd0aD1NYXRoLmNlaWwoY3VydmUubi5iaXRMZW5ndGgoKS84KSx0aGlzLmhhc2g9aGFzaC5zaGE1MTJ9bW9kdWxlLmV4cG9ydHM9RUREU0EsRUREU0EucHJvdG90eXBlLnNpZ249ZnVuY3Rpb24gc2lnbihtZXNzYWdlLHNlY3JldCl7bWVzc2FnZT1wYXJzZUJ5dGVzKG1lc3NhZ2UpO3ZhciBrZXk9dGhpcy5rZXlGcm9tU2VjcmV0KHNlY3JldCkscj10aGlzLmhhc2hJbnQoa2V5Lm1lc3NhZ2VQcmVmaXgoKSxtZXNzYWdlKSxSPXRoaXMuZy5tdWwociksUmVuY29kZWQ9dGhpcy5lbmNvZGVQb2ludChSKSxzXz10aGlzLmhhc2hJbnQoUmVuY29kZWQsa2V5LnB1YkJ5dGVzKCksbWVzc2FnZSkubXVsKGtleS5wcml2KCkpLFM9ci5hZGQoc18pLnVtb2QodGhpcy5jdXJ2ZS5uKTtyZXR1cm4gdGhpcy5tYWtlU2lnbmF0dXJlKHtSLFMsUmVuY29kZWR9KX0sRUREU0EucHJvdG90eXBlLnZlcmlmeT1mdW5jdGlvbiB2ZXJpZnkobWVzc2FnZSxzaWcscHViKXtpZihtZXNzYWdlPXBhcnNlQnl0ZXMobWVzc2FnZSksKHNpZz10aGlzLm1ha2VTaWduYXR1cmUoc2lnKSkuUygpLmd0ZShzaWcuZWRkc2EuY3VydmUubil8fHNpZy5TKCkuaXNOZWcoKSlyZXR1cm4hMTt2YXIga2V5PXRoaXMua2V5RnJvbVB1YmxpYyhwdWIpLGg9dGhpcy5oYXNoSW50KHNpZy5SZW5jb2RlZCgpLGtleS5wdWJCeXRlcygpLG1lc3NhZ2UpLFNHPXRoaXMuZy5tdWwoc2lnLlMoKSk7cmV0dXJuIHNpZy5SKCkuYWRkKGtleS5wdWIoKS5tdWwoaCkpLmVxKFNHKX0sRUREU0EucHJvdG90eXBlLmhhc2hJbnQ9ZnVuY3Rpb24gaGFzaEludCgpe2Zvcih2YXIgaGFzaD10aGlzLmhhc2goKSxpPTA7aTxhcmd1bWVudHMubGVuZ3RoO2krKyloYXNoLnVwZGF0ZShhcmd1bWVudHNbaV0pO3JldHVybiB1dGlscy5pbnRGcm9tTEUoaGFzaC5kaWdlc3QoKSkudW1vZCh0aGlzLmN1cnZlLm4pfSxFRERTQS5wcm90b3R5cGUua2V5RnJvbVB1YmxpYz1mdW5jdGlvbiBrZXlGcm9tUHVibGljKHB1Yil7cmV0dXJuIEtleVBhaXIuZnJvbVB1YmxpYyh0aGlzLHB1Yil9LEVERFNBLnByb3RvdHlwZS5rZXlGcm9tU2VjcmV0PWZ1bmN0aW9uIGtleUZyb21TZWNyZXQoc2VjcmV0KXtyZXR1cm4gS2V5UGFpci5mcm9tU2VjcmV0KHRoaXMsc2VjcmV0KX0sRUREU0EucHJvdG90eXBlLm1ha2VTaWduYXR1cmU9ZnVuY3Rpb24gbWFrZVNpZ25hdHVyZShzaWcpe3JldHVybiBzaWcgaW5zdGFuY2VvZiBTaWduYXR1cmU/c2lnOm5ldyBTaWduYXR1cmUodGhpcyxzaWcpfSxFRERTQS5wcm90b3R5cGUuZW5jb2RlUG9pbnQ9ZnVuY3Rpb24gZW5jb2RlUG9pbnQocG9pbnQpe3ZhciBlbmM9cG9pbnQuZ2V0WSgpLnRvQXJyYXkoImxlIix0aGlzLmVuY29kaW5nTGVuZ3RoKTtyZXR1cm4gZW5jW3RoaXMuZW5jb2RpbmdMZW5ndGgtMV18PXBvaW50LmdldFgoKS5pc09kZCgpPzEyODowLGVuY30sRUREU0EucHJvdG90eXBlLmRlY29kZVBvaW50PWZ1bmN0aW9uIGRlY29kZVBvaW50KGJ5dGVzKXt2YXIgbGFzdEl4PShieXRlcz11dGlscy5wYXJzZUJ5dGVzKGJ5dGVzKSkubGVuZ3RoLTEsbm9ybWVkPWJ5dGVzLnNsaWNlKDAsbGFzdEl4KS5jb25jYXQoLTEyOSZieXRlc1tsYXN0SXhdKSx4SXNPZGQ9ISEoMTI4JmJ5dGVzW2xhc3RJeF0pLHk9dXRpbHMuaW50RnJvbUxFKG5vcm1lZCk7cmV0dXJuIHRoaXMuY3VydmUucG9pbnRGcm9tWSh5LHhJc09kZCl9LEVERFNBLnByb3RvdHlwZS5lbmNvZGVJbnQ9ZnVuY3Rpb24gZW5jb2RlSW50KG51bSl7cmV0dXJuIG51bS50b0FycmF5KCJsZSIsdGhpcy5lbmNvZGluZ0xlbmd0aCl9LEVERFNBLnByb3RvdHlwZS5kZWNvZGVJbnQ9ZnVuY3Rpb24gZGVjb2RlSW50KGJ5dGVzKXtyZXR1cm4gdXRpbHMuaW50RnJvbUxFKGJ5dGVzKX0sRUREU0EucHJvdG90eXBlLmlzUG9pbnQ9ZnVuY3Rpb24gaXNQb2ludCh2YWwpe3JldHVybiB2YWwgaW5zdGFuY2VvZiB0aGlzLnBvaW50Q2xhc3N9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy9lZGRzYS9rZXkuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciB1dGlscz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL3V0aWxzLmpzIiksYXNzZXJ0PXV0aWxzLmFzc2VydCxwYXJzZUJ5dGVzPXV0aWxzLnBhcnNlQnl0ZXMsY2FjaGVkUHJvcGVydHk9dXRpbHMuY2FjaGVkUHJvcGVydHk7ZnVuY3Rpb24gS2V5UGFpcihlZGRzYSxwYXJhbXMpe3RoaXMuZWRkc2E9ZWRkc2EsdGhpcy5fc2VjcmV0PXBhcnNlQnl0ZXMocGFyYW1zLnNlY3JldCksZWRkc2EuaXNQb2ludChwYXJhbXMucHViKT90aGlzLl9wdWI9cGFyYW1zLnB1Yjp0aGlzLl9wdWJCeXRlcz1wYXJzZUJ5dGVzKHBhcmFtcy5wdWIpfUtleVBhaXIuZnJvbVB1YmxpYz1mdW5jdGlvbiBmcm9tUHVibGljKGVkZHNhLHB1Yil7cmV0dXJuIHB1YiBpbnN0YW5jZW9mIEtleVBhaXI/cHViOm5ldyBLZXlQYWlyKGVkZHNhLHtwdWJ9KX0sS2V5UGFpci5mcm9tU2VjcmV0PWZ1bmN0aW9uIGZyb21TZWNyZXQoZWRkc2Esc2VjcmV0KXtyZXR1cm4gc2VjcmV0IGluc3RhbmNlb2YgS2V5UGFpcj9zZWNyZXQ6bmV3IEtleVBhaXIoZWRkc2Ese3NlY3JldH0pfSxLZXlQYWlyLnByb3RvdHlwZS5zZWNyZXQ9ZnVuY3Rpb24gc2VjcmV0KCl7cmV0dXJuIHRoaXMuX3NlY3JldH0sY2FjaGVkUHJvcGVydHkoS2V5UGFpciwicHViQnl0ZXMiLGZ1bmN0aW9uIHB1YkJ5dGVzKCl7cmV0dXJuIHRoaXMuZWRkc2EuZW5jb2RlUG9pbnQodGhpcy5wdWIoKSl9KSxjYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCJwdWIiLGZ1bmN0aW9uIHB1Yigpe3JldHVybiB0aGlzLl9wdWJCeXRlcz90aGlzLmVkZHNhLmRlY29kZVBvaW50KHRoaXMuX3B1YkJ5dGVzKTp0aGlzLmVkZHNhLmcubXVsKHRoaXMucHJpdigpKX0pLGNhY2hlZFByb3BlcnR5KEtleVBhaXIsInByaXZCeXRlcyIsZnVuY3Rpb24gcHJpdkJ5dGVzKCl7dmFyIGVkZHNhPXRoaXMuZWRkc2EsaGFzaD10aGlzLmhhc2goKSxsYXN0SXg9ZWRkc2EuZW5jb2RpbmdMZW5ndGgtMSxhPWhhc2guc2xpY2UoMCxlZGRzYS5lbmNvZGluZ0xlbmd0aCk7cmV0dXJuIGFbMF0mPTI0OCxhW2xhc3RJeF0mPTEyNyxhW2xhc3RJeF18PTY0LGF9KSxjYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCJwcml2IixmdW5jdGlvbiBwcml2KCl7cmV0dXJuIHRoaXMuZWRkc2EuZGVjb2RlSW50KHRoaXMucHJpdkJ5dGVzKCkpfSksY2FjaGVkUHJvcGVydHkoS2V5UGFpciwiaGFzaCIsZnVuY3Rpb24gaGFzaCgpe3JldHVybiB0aGlzLmVkZHNhLmhhc2goKS51cGRhdGUodGhpcy5zZWNyZXQoKSkuZGlnZXN0KCl9KSxjYWNoZWRQcm9wZXJ0eShLZXlQYWlyLCJtZXNzYWdlUHJlZml4IixmdW5jdGlvbiBtZXNzYWdlUHJlZml4KCl7cmV0dXJuIHRoaXMuaGFzaCgpLnNsaWNlKHRoaXMuZWRkc2EuZW5jb2RpbmdMZW5ndGgpfSksS2V5UGFpci5wcm90b3R5cGUuc2lnbj1mdW5jdGlvbiBzaWduKG1lc3NhZ2Upe3JldHVybiBhc3NlcnQodGhpcy5fc2VjcmV0LCJLZXlQYWlyIGNhbiBvbmx5IHZlcmlmeSIpLHRoaXMuZWRkc2Euc2lnbihtZXNzYWdlLHRoaXMpfSxLZXlQYWlyLnByb3RvdHlwZS52ZXJpZnk9ZnVuY3Rpb24gdmVyaWZ5KG1lc3NhZ2Usc2lnKXtyZXR1cm4gdGhpcy5lZGRzYS52ZXJpZnkobWVzc2FnZSxzaWcsdGhpcyl9LEtleVBhaXIucHJvdG90eXBlLmdldFNlY3JldD1mdW5jdGlvbiBnZXRTZWNyZXQoZW5jKXtyZXR1cm4gYXNzZXJ0KHRoaXMuX3NlY3JldCwiS2V5UGFpciBpcyBwdWJsaWMgb25seSIpLHV0aWxzLmVuY29kZSh0aGlzLnNlY3JldCgpLGVuYyl9LEtleVBhaXIucHJvdG90eXBlLmdldFB1YmxpYz1mdW5jdGlvbiBnZXRQdWJsaWMoZW5jKXtyZXR1cm4gdXRpbHMuZW5jb2RlKHRoaXMucHViQnl0ZXMoKSxlbmMpfSxtb2R1bGUuZXhwb3J0cz1LZXlQYWlyfSwiLi4vLi4vbm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy9lZGRzYS9zaWduYXR1cmUuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBCTj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYm4uanMvbGliL2JuLmpzIiksdXRpbHM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy91dGlscy5qcyIpLGFzc2VydD11dGlscy5hc3NlcnQsY2FjaGVkUHJvcGVydHk9dXRpbHMuY2FjaGVkUHJvcGVydHkscGFyc2VCeXRlcz11dGlscy5wYXJzZUJ5dGVzO2Z1bmN0aW9uIFNpZ25hdHVyZShlZGRzYSxzaWcpe3RoaXMuZWRkc2E9ZWRkc2EsIm9iamVjdCIhPXR5cGVvZiBzaWcmJihzaWc9cGFyc2VCeXRlcyhzaWcpKSxBcnJheS5pc0FycmF5KHNpZykmJihhc3NlcnQoc2lnLmxlbmd0aD09PTIqZWRkc2EuZW5jb2RpbmdMZW5ndGgsIlNpZ25hdHVyZSBoYXMgaW52YWxpZCBzaXplIiksc2lnPXtSOnNpZy5zbGljZSgwLGVkZHNhLmVuY29kaW5nTGVuZ3RoKSxTOnNpZy5zbGljZShlZGRzYS5lbmNvZGluZ0xlbmd0aCl9KSxhc3NlcnQoc2lnLlImJnNpZy5TLCJTaWduYXR1cmUgd2l0aG91dCBSIG9yIFMiKSxlZGRzYS5pc1BvaW50KHNpZy5SKSYmKHRoaXMuX1I9c2lnLlIpLHNpZy5TIGluc3RhbmNlb2YgQk4mJih0aGlzLl9TPXNpZy5TKSx0aGlzLl9SZW5jb2RlZD1BcnJheS5pc0FycmF5KHNpZy5SKT9zaWcuUjpzaWcuUmVuY29kZWQsdGhpcy5fU2VuY29kZWQ9QXJyYXkuaXNBcnJheShzaWcuUyk/c2lnLlM6c2lnLlNlbmNvZGVkfWNhY2hlZFByb3BlcnR5KFNpZ25hdHVyZSwiUyIsZnVuY3Rpb24gUygpe3JldHVybiB0aGlzLmVkZHNhLmRlY29kZUludCh0aGlzLlNlbmNvZGVkKCkpfSksY2FjaGVkUHJvcGVydHkoU2lnbmF0dXJlLCJSIixmdW5jdGlvbiBSKCl7cmV0dXJuIHRoaXMuZWRkc2EuZGVjb2RlUG9pbnQodGhpcy5SZW5jb2RlZCgpKX0pLGNhY2hlZFByb3BlcnR5KFNpZ25hdHVyZSwiUmVuY29kZWQiLGZ1bmN0aW9uIFJlbmNvZGVkKCl7cmV0dXJuIHRoaXMuZWRkc2EuZW5jb2RlUG9pbnQodGhpcy5SKCkpfSksY2FjaGVkUHJvcGVydHkoU2lnbmF0dXJlLCJTZW5jb2RlZCIsZnVuY3Rpb24gU2VuY29kZWQoKXtyZXR1cm4gdGhpcy5lZGRzYS5lbmNvZGVJbnQodGhpcy5TKCkpfSksU2lnbmF0dXJlLnByb3RvdHlwZS50b0J5dGVzPWZ1bmN0aW9uIHRvQnl0ZXMoKXtyZXR1cm4gdGhpcy5SZW5jb2RlZCgpLmNvbmNhdCh0aGlzLlNlbmNvZGVkKCkpfSxTaWduYXR1cmUucHJvdG90eXBlLnRvSGV4PWZ1bmN0aW9uIHRvSGV4KCl7cmV0dXJuIHV0aWxzLmVuY29kZSh0aGlzLnRvQnl0ZXMoKSwiaGV4IikudG9VcHBlckNhc2UoKX0sbW9kdWxlLmV4cG9ydHM9U2lnbmF0dXJlfSwiLi4vLi4vbm9kZV9tb2R1bGVzL2VsbGlwdGljL2xpYi9lbGxpcHRpYy9wcmVjb21wdXRlZC9zZWNwMjU2azEuanMiKG1vZHVsZSl7bW9kdWxlLmV4cG9ydHM9e2RvdWJsZXM6e3N0ZXA6NCxwb2ludHM6W1siZTYwZmNlOTNiNTllOWVjNTMwMTFhYWJjMjFjMjNlOTdiMmEzMTM2OWI4N2E1YWU5YzQ0ZWU4OWUyYTZkZWMwYSIsImY3ZTM1MDczOTllNTk1OTI5ZGI5OWYzNGY1NzkzNzEwMTI5Njg5MWU0NGQyM2YwYmUxZjMyY2NlNjk2MTY4MjEiXSxbIjgyODIyNjMyMTJjNjA5ZDllYTJhNmUzZTE3MmRlMjM4ZDhjMzljYWJkNWFjMWNhMTA2NDZlMjNmZDVmNTE1MDgiLCIxMWY4YTgwOTg1NTdkZmU0NWU4MjU2ZTgzMGI2MGFjZTYyZDYxM2FjMmY3YjE3YmVkMzFiNmVhZmY2ZTI2Y2FmIl0sWyIxNzVlMTU5ZjcyOGI4NjVhNzJmOTljYzZjNmZjODQ2ZGUwYjkzODMzZmQyMjIyZWQ3M2ZjZTViNTUxZTViNzM5IiwiZDM1MDZlMGQ5ZTNjNzllYmE0ZWY5N2E1MWZmNzFmNWVhY2I1OTU1YWRkMjQzNDVjNmVmYTZmZmVlOWZlZDY5NSJdLFsiMzYzZDkwZDQ0N2IwMGM5Yzk5Y2VhYzA1YjYyNjJlZTA1MzQ0MWM3ZTU1NTUyZmZlNTI2YmFkOGY4M2ZmNDY0MCIsIjRlMjczYWRmYzczMjIyMTk1M2I0NDUzOTdmMzM2MzE0NWI5YTg5MDA4MTk5ZWNiNjIwMDNjN2YzYmVlOWRlOSJdLFsiOGI0YjVmMTY1ZGYzYzJiZThjNjI0NGI1Yjc0NTYzODg0M2U0YTc4MWExNWJjZDFiNjlmNzlhNTVkZmZkZjgwYyIsIjRhYWQwYTZmNjhkMzA4YjRiM2ZiZDc4MTNhYjBkYTA0ZjllMzM2NTQ2MTYyZWU1NmIzZWZmMGM2NWZkNGZkMzYiXSxbIjcyM2NiYWE2ZTVkYjk5NmQ2YmY3NzFjMDBiZDU0OGM3YjcwMGRiZmZhNmMwZTc3YmNiNjExNTkyNTIzMmZjZGEiLCI5NmU4NjdiNTU5NWNjNDk4YTkyMTEzNzQ4ODgyNGQ2ZTI2NjBhMDY1Mzc3OTQ5NDgwMWRjMDY5ZDllYjM5ZjVmIl0sWyJlZWJmYTRkNDkzYmViZjk4YmE1ZmVlYzgxMmMyZDNiNTA5NDc5NjEyMzdhOTE5ODM5YTUzM2VjYTBlN2RkN2ZhIiwiNWQ5YThjYTM5NzBlZjBmMjY5ZWU3ZWRhZjE3ODA4OWQ5YWU0Y2RjM2E3MTFmNzEyZGRmZDRmZGFlMWRlODk5OSJdLFsiMTAwZjQ0ZGE2OTZlNzE2NzI3OTFkMGEwOWI3YmRlNDU5ZjEyMTVhMjliM2MwM2JmZWZkNzgzNWIzOWE0OGRiMCIsImNkZDllMTMxOTJhMDBiNzcyZWM4ZjMzMDBjMDkwNjY2YjdmZjRhMThmZjUxOTVhYzBmYmQ1Y2Q2MmJjNjVhMDkiXSxbImUxMDMxYmUyNjJjN2VkMWIxZGM5MjI3YTRhMDRjMDE3YTc3ZjhkNDQ2NGYzYjM4NTJjOGFjZGU2ZTUzNGZkMmQiLCI5ZDcwNjE5Mjg5NDA0MDVlNmJiNmE0MTc2NTk3NTM1YWYyOTJkZDQxOWUxY2VkNzlhNDRmMThmMjk0NTZhMDBkIl0sWyJmZWVhNmNhZTQ2ZDU1YjUzMGFjMjgzOWYxNDNiZDdlYzVjZjhiMjY2YTQxZDZhZjUyZDVlNjg4ZDkwOTQ2OTZkIiwiZTU3YzZiNmM5N2RjZTFiYWIwNmU0ZTEyYmYzZWNkNWM5ODFjODk1N2NjNDE0NDJkMzE1NWRlYmYxODA5MDA4OCJdLFsiZGE2N2E5MWQ5MTA0OWNkY2IzNjdiZTRiZTZmZmNhM2NmZWVkNjU3ZDgwODU4M2RlMzNmYTk3OGJjMWVjNmNiMSIsIjliYWNhYTM1NDgxNjQyYmM0MWY0NjNmN2VjOTc4MGU1ZGVjN2FkYzUwOGY3NDBhMTdlOWVhOGUyN2E2OGJlMWQiXSxbIjUzOTA0ZmFhMGIzMzRjZGRhNmUwMDA5MzVlZjIyMTUxZWMwOGQwZjdiYjExMDY5ZjU3NTQ1Y2NjMWEzN2I3YzAiLCI1YmMwODdkMGJjODAxMDZkODhjOWVjY2FjMjBkM2MxYzEzOTk5OTgxZTE0NDM0Njk5ZGNiMDk2YjAyMjc3MWM4Il0sWyI4ZTdiY2QwYmQzNTk4M2E3NzE5Y2NhNzc2NGNhOTA2Nzc5YjUzYTA0M2E5YjhiY2FlZmY5NTlmNDNhZDg2MDQ3IiwiMTBiNzc3MGIyYTNkYTRiMzk0MDMxMDQyMGNhOTUxNDU3OWU4OGUyZTQ3ZmQ2OGIzZWExMDA0N2U4NDYwMzcyYSJdLFsiMzg1ZWVkMzRjMWNkZmYyMWU2ZDA4MTg2ODliODFiZGU3MWE3ZjRmMTgzOTdlNjY5MGE4NDFlMTU5OWM0Mzg2MiIsIjI4M2JlYmMzZThlYTIzZjU2NzAxZGUxOWU5ZWJmNDU3NmIzMDRlZWMyMDg2ZGM4Y2MwNDU4ZmU1NTQyZTU0NTMiXSxbIjZmOWQ5YjgwM2VjZjE5MTYzN2M3M2E0NDEzZGZhMTgwZmRkZjg0YTU5NDdmYmM5YzYwNmVkODZjM2ZhYzNhNyIsIjdjODBjNjhlNjAzMDU5YmE2OWI4ZTJhMzBlNDVjNGQ0N2VhNGRkMmY1YzI4MTAwMmQ4Njg5MDYwM2E4NDIxNjAiXSxbIjMzMjJkNDAxMjQzYzRlMjU4MmEyMTQ3YzEwNGQ2ZWNiZjc3NGQxNjNkYjBmNWU1MzEzYjdlMGU3NDJkMGU2YmQiLCI1NmU3MDc5N2U5NjY0ZWY1YmZiMDE5YmM0ZGRhZjliNzI4MDVmNjNlYTI4NzNhZjYyNGYzYTJlOTZjMjhiMmEwIl0sWyI4NTY3MmM3ZDJkZTBiN2RhMmJkMTc3MGQ4OTY2NTg2ODc0MWIzZjlhZjc2NDMzOTc3MjFkNzRkMjgxMzRhYjgzIiwiN2M0ODFiOWI1YjQzYjJlYjYzNzQwNDliZmE2MmMyZTVlNzdmMTdmY2M1Mjk4ZjQ0YzhlMzA5NGY3OTAzMTNhNiJdLFsiOTQ4YmY4MDliMTk4OGE0NmIwNmM5ZjE5MTk0MTNiMTBmOTIyNmM2MGY2Njg4MzJmZmQ5NTlhZjYwYzgyYTBhIiwiNTNhNTYyODU2ZGNiNjY0NmRjNmI3NGM1ZDFjMzQxOGM2ZDRkZmYwOGM5N2NkMmJlZDRjYjdmODhkOGM4ZTU4OSJdLFsiNjI2MGNlN2Y0NjE4MDFjMzRmMDY3Y2UwZjAyODczYThmMWIwZTQ0ZGZjNjk3NTJhY2NlY2Q4MTlmMzhmZDhlOCIsImJjMmRhODJiNmZhNWI1NzFhN2YwOTA0OTc3NmExZWY3ZWNkMjkyMjM4MDUxYzE5OGMxYTg0ZTk1YjJiNGFlMTciXSxbImU1MDM3ZGUwYWZjMWQ4ZDQzZDgzNDg0MTRiYmY0MTAzMDQzZWM4ZjU3NWJmZGM0MzI5NTNjYzhkMjAzN2ZhMmQiLCI0NTcxNTM0YmFhOTRkM2I1ZjlmOThkMDlmYjk5MGJkZGJkNWY1YjAzZWM0ODFmMTBlMGU1ZGM4NDFkNzU1YmRhIl0sWyJlMDYzNzJiMGY0YTIwN2FkZjVlYTkwNWU4ZjE3NzFiNGU3ZThkYmQxYzZhNmM1YjcyNTg2NmEwYWU0ZmNlNzI1IiwiN2E5MDg5NzRiY2UxOGNmZTEyYTI3YmIyYWQ1YTQ4OGNkNzQ4NGE3Nzg3MTA0ODcwYjI3MDM0Zjk0ZWVlMzFkZCJdLFsiMjEzYzdhNzE1Y2Q1ZDQ1MzU4ZDBiYmY5ZGMwY2UwMjIwNGIxMGJkZGUyYTNmNTg1NDBhZDY5MDhkMDU1OTc1NCIsIjRiNmRhZDBiNWFlNDYyNTA3MDEzYWQwNjI0NWJhMTkwYmI0ODUwZjVmMzZhN2VlZGRmZjJjMjc1MzRiNDU4ZjIiXSxbIjRlN2MyNzJhN2FmNGIzNGU4ZGJiOTM1MmE1NDE5YTg3ZTI4MzhjNzBhZGM2MmNkZGYwY2MzYTNiMDhmYmQ1M2MiLCIxNzc0OWM3NjZjOWQwYjE4ZTE2ZmQwOWY2ZGVmNjgxYjUzMGI5NjE0YmZmN2RkMzNlMGIzOTQxODE3ZGNhYWU2Il0sWyJmZWE3NGUzZGJlNzc4YjFiMTBmMjM4YWQ2MTY4NmFhNWM3NmUzZGIyYmU0MzA1NzYzMjQyN2UyODQwZmIyN2I2IiwiNmUwNTY4ZGI5YjBiMTMyOTdjZjY3NGRlY2NiNmFmOTMxMjZiNTk2Yjk3M2Y3Yjc3NzAxZDNkYjdmMjNjYjk2ZiJdLFsiNzZlNjQxMTNmNjc3Y2YwZTEwYTI1NzBkNTk5OTY4ZDMxNTQ0ZTE3OWI3NjA0MzI5NTJjMDJhNDQxN2JkZGUzOSIsImM5MGRkZjhkZWU0ZTk1Y2Y1NzcwNjZkNzA2ODFmMGQzNWUyYTMzZDJiNTZkMjAzMmI0YjE3NTJkMTkwMWFjMDEiXSxbImM3MzhjNTZiMDNiMmFiZTFlODI4MWJhYTc0M2Y4ZjlhOGY3Y2M2NDNkZjI2Y2JlZTNhYjE1MDI0MmJjYmI4OTEiLCI4OTNmYjU3ODk1MWFkMjUzN2Y3MThmMmVhY2JmYmJiYjgyMzE0ZWVmNzg4MGNmZTkxN2U3MzVkOTY5OWE4NGMzIl0sWyJkODk1NjI2NTQ4YjY1YjgxZTI2NGM3NjM3Yzk3Mjg3N2QxZDcyZTVmM2E5MjUwMTQzNzJlOWY2NTg4ZjZjMTRiIiwiZmViZmFhMzhmMmJjN2VhZTcyOGVjNjA4MThjMzQwZWIwMzQyOGQ2MzJiYjA2N2UxNzkzNjNlZDc1ZDdkOTkxZiJdLFsiYjhkYTk0MDMyYTk1NzUxOGViMGY2NDMzNTcxZTg3NjFjZWZmYzczNjkzZTg0ZWRkNDkxNTBhNTY0ZjY3NmUwMyIsIjI4MDRkZmE0NDgwNWExZTRkN2M5OWNjOTc2MjgwOGIwOTJjYzU4NGQ5NWZmM2I1MTE0ODhlNGU3NGVmZGY2ZTciXSxbImU4MGZlYTE0NDQxZmIzM2E3ZDhhZGFiOTQ3NWQ3ZmFiMjAxOWVmZmI1MTU2YTc5MmYxYTExNzc4ZTNjMGRmNWQiLCJlZWQxZGU3ZjYzOGUwMDc3MWU4OTc2OGNhM2NhOTQ0NzJkMTU1ZTgwYWYzMjJlYTlmY2I0MjkxYjZhYzllYzc4Il0sWyJhMzAxNjk3YmRmY2Q3MDQzMTNiYTQ4ZTUxZDU2NzU0M2YyYTE4MjAzMWVmZDY5MTVkZGMwN2JiY2M0ZTE2MDcwIiwiNzM3MGY5MWNmYjY3ZTRmNTA4MTgwOWZhMjVkNDBmOWIxNzM1ZGJmN2MwYTExYTEzMGMwZDFhMDQxZTE3N2VhMSJdLFsiOTBhZDg1YjM4OWQ2YjkzNjQ2M2Y5ZDA1MTI2NzhkZTIwOGNjMzMwYjExMzA3ZmZmYWI3YWM2M2UzZmIwNGVkNCIsImU1MDdhMzYyMGEzODI2MWFmZmRjYmQ5NDI3MjIyYjgzOWFlZmFiZTE1ODI4OTRkOTkxZDRkNDhjYjZlZjE1MCJdLFsiOGY2OGI5ZDJmNjNiNWYzMzkyMzljMWFkOTgxZjE2MmVlODhjNTY3ODcyM2VhMzM1MWI3YjQ0NGM5ZWM0YzBkYSIsIjY2MmE5ZjJkYmEwNjM5ODZkZTFkOTBjMmI2YmUyMTVkYmJlYTJjZmU5NTUxMGJmZGYyM2NiZjc5NTAxZmZmODIiXSxbImU0ZjNmYjAxNzZhZjg1ZDY1ZmY5OWZmOTE5OGMzNjA5MWY0OGU4NjUwMzY4MWUzZTY2ODZmZDUwNTMyMzFlMTEiLCIxZTYzNjMzYWQwZWY0ZjFjMTY2MWE2ZDBlYTAyYjcyODZjYzdlNzRlYzk1MWQxYzk4MjJjMzg1NzZmZWI3M2JjIl0sWyI4YzAwZmE5YjE4ZWJmMzMxZWI5NjE1MzdhNDVhNDI2NmM3MDM0ZjJmMGQ0ZTFkMDcxNmZiNmVhZTIwZWFlMjllIiwiZWZhNDcyNjdmZWE1MjFhMWE5ZGMzNDNhMzczNmM5NzRjMmZhZGFmYTgxZTM2YzU0ZTdkMmE0YzY2NzAyNDE0YiJdLFsiZTdhMjZjZTY5ZGQ0ODI5ZjNlMTBjZWMwYTllOThlZDMxNDNkMDg0ZjMwOGI5MmMwOTk3ZmRkZmM2MGNiM2U0MSIsIjJhNzU4ZTMwMGZhNzk4NGI0NzFiMDA2YTFhYWZiYjE4ZDBhNmIyYzA0MjBlODNlMjBlOGE5NDIxY2YyY2ZkNTEiXSxbImI2NDU5ZTBlZTM2NjJlYzhkMjM1NDBjMjIzYmNiZGM1NzFjYmNiOTY3ZDc5NDI0ZjNjZjI5ZWIzZGU2YjgwZWYiLCI2N2M4NzZkMDZmM2UwNmRlMWRhZGYxNmU1NjYxZGIzYzRiM2FlNmQ0OGUzNWIyZmYzMGJmMGI2MWE3MWJhNDUiXSxbImQ2OGE4MGM4MjgwYmI4NDA3OTMyMzRhYTExOGYwNjIzMWQ2ZjFmYzY3ZTczYzVhNWRlZGEwZjViNDk2OTQzZTgiLCJkYjhiYTlmZmY0YjU4NmQwMGM0YjFmOTE3N2IwZTI4YjViMGU3YjhmNzg0NTI5NWEyOTRjODQyNjZiMTMzMTIwIl0sWyIzMjRhZWQ3ZGY2NWM4MDQyNTJkYzAyNzA5MDdhMzBiMDk2MTJhZWI5NzM0NDljZWE0MDk1OTgwZmMyOGQzZDVkIiwiNjQ4YTM2NTc3NGI2MWYyZmYxMzBjMGMzNWFlYzFmNGYxOTIxM2IwYzdlMzMyODQzOTY3MjI0YWY5NmFiN2M4NCJdLFsiNGRmOWMxNDkxOWNkZTYxZjZkNTFkZmRiZTVmZWU1ZGNlZWM0MTQzYmE4ZDFjYTg4OGU4YmQzNzNmZDA1NGM5NiIsIjM1ZWM1MTA5MmQ4NzI4MDUwOTc0YzIzYTFkODVkNGI1ZDUwNmNkYzI4ODQ5MDE5MmViYWMwNmNhZDEwZDVkIl0sWyI5YzM5MTlhODRhNDc0ODcwZmFlZDhhOWMxY2M2NjAyMTUyMzQ4OTA1NGQ3ZjAzMDhjYmZjOTljOGFjMWY5OGNkIiwiZGRiODRmMGY0YTRkZGQ1NzU4NGYwNDRiZjI2MGU2NDE5MDUzMjZmNzZjNjRjOGU2YmU3ZTVlMDNkNGZjNTk5ZCJdLFsiNjA1NzE3MGIxZGQxMmZkZjhkZTA1ZjI4MWQ4ZTA2YmI5MWUxNDkzYThiOTFkNGNjNWEyMTM4MjEyMGE5NTllNSIsIjlhMWFmMGIyNmE2YTQ4MDdhZGQ5YTJkYWY3MWRmMjYyNDY1MTUyYmMzZWUyNGM2NWU4OTliZTkzMjM4NWEyYTgiXSxbImE1NzZkZjhlMjNhMDg0MTE0MjE0MzlhNDUxOGRhMzE4ODBjZWYwZmJhN2Q0ZGYxMmIxYTY5NzNlZWNiOTQyNjYiLCI0MGE2YmYyMGU3NjY0MGIyYzkyYjk3YWZlNThjZDgyYzQzMmUxMGE3ZjUxNGQ5ZjNlZThiZTExYWUxYjI4ZWM4Il0sWyI3Nzc4YTc4YzI4ZGVjM2UzMGEwNWZlOTYyOWRlOGMzOGJiMzBkMWY1Y2Y5YTNhMjA4Zjc2Mzg4OWJlNThhZDcxIiwiMzQ2MjZkOWFiNWE1YjIyZmY3MDk4ZTEyZjJmZjU4MDA4N2IzODQxMWZmMjRhYzU2M2I1MTNmYzFmZDlmNDNhYyJdLFsiOTI4OTU1ZWU2MzdhODQ0NjM3MjlmZDMwZTdhZmQyZWQ1Zjk2Mjc0ZTVhZDdlNWNiMDllZGE5YzA2ZDkwM2FjIiwiYzI1NjIxMDAzZDNmNDJhODI3Yjc4YTEzMDkzYTk1ZWVhYzNkMjZlZmE4YThkODNmYzUxODBlOTM1YmNkMDkxZiJdLFsiODVkMGZlZjNlYzZkYjEwOTM5OTA2NGYzYTBlM2IyODU1NjQ1YjRhOTA3YWQzNTQ1MjdhYWU3NTE2M2Q4Mjc1MSIsIjFmMDM2NDg0MTNhMzhjMGJlMjlkNDk2ZTU4MmNmNTY2M2U4NzUxZTk2ODc3MzMxNTgyYzIzN2EyNGViMWY5NjIiXSxbImZmMmIwZGNlOTdlZWNlOTdjMWM5YjYwNDE3OThiODVkZmRmYjZkODg4MmRhMjAzMDhmNTQwNDgyNDUyNjA4N2UiLCI0OTNkMTNmZWY1MjRiYTE4OGFmNGM0ZGM1NGQwNzkzNmM3YjdlZDZmYjkwZTJjZWIyYzk1MWUwMWYwYzI5OTA3Il0sWyI4MjdmYmJlNGIxZTg4MGVhOWVkMmIyZTYzMDFiMjEyYjU3ZjFlZTE0OGNkNmRkMjg3ODBlNWUyY2Y4NTZlMjQxIiwiYzYwZjljOTIzYzcyN2IwYjcxYmVmMmM2N2QxZDEyNjg3ZmY3YTYzMTg2OTAzMTY2ZDYwNWI2OGJhZWMyOTNlYyJdLFsiZWFhNjQ5ZjIxZjUxYmRiYWU3YmU0YWUzNGNlNmU1MjE3YTU4ZmRjZTdmNDdmOWFhN2YzYjU4ZmEyMTIwZTJiMyIsImJlMzI3OWVkNWJiYmIwM2FjNjlhODBmODk4NzlhYTVhMDFhNmI5NjVmMTNmN2U1OWQ0N2E1MzA1YmE1YWQ5M2QiXSxbImU0YTQyZDQzYzVjZjE2OWQ5MzkxZGY2ZGVjZjQyZWU1NDFiNmQ4ZjBjOWExMzc0MDFlMjM2MzJkZGEzNGQyNGYiLCI0ZDlmOTJlNzE2ZDFjNzM1MjZmYzk5Y2NmYjhhZDM0Y2U4ODZlZWRmYThkOGU0ZjEzYTdmNzEzMWRlYmE5NDE0Il0sWyIxZWM4MGZlZjM2MGNiZGQ5NTQxNjBmYWRhYjM1MmI2YjkyYjUzNTc2YTg4ZmVhNDk0NzE3M2I5ZDQzMDBiZjE5IiwiYWVlZmU5Mzc1NmI1MzQwZDJmM2E0OTU4YTdhYmJmNWUwMTQ2ZTc3ZjYyOTVhMDdiNjcxY2RjMWNjMTA3Y2VmZCJdLFsiMTQ2YTc3OGMwNDY3MGMyZjkxYjAwYWY0NjgwZGZhOGJjZTM0OTA3MTdkNThiYTg4OWRkYjU5MjgzNjY2NDJiZSIsImIzMThlMGVjMzM1NDAyOGFkZDY2OTgyN2Y5ZDRiMjg3MGFhYTk3MWQyZjdlNWVkMWQwYjI5NzQ4M2Q4M2VmZDAiXSxbImZhNTBjMGY2MWQyMmU1ZjA3ZTNhY2ViYjFhYTA3YjEyOGQwMDEyMjA5YTI4Yjk3NzZkNzZhODc5MzE4MGVlZjkiLCI2Yjg0YzY5MjIzOTdlYmE5YjcyY2QyODcyMjgxYTY4YTVlNjgzMjkzYTU3YTIxM2IzOGNkOGQ3ZDNmNGYyODExIl0sWyJkYTFkNjFkMGNhNzIxYTExYjFhNWJmNmI3ZDg4ZTg0MjFhMjg4YWI1ZDViYmE1MjIwZTUzZDMyYjVmMDY3ZWMyIiwiODE1N2Y1NWE3Yzk5MzA2Yzc5YzA3NjYxNjFjOTFlMjk2NmE3Mzg5OWQyNzliNDhhNjU1ZmJhMGYxYWQ4MzZmMSJdLFsiYThlMjgyZmYwYzk3MDY5MDcyMTVmZjk4ZThmZDQxNjYxNTMxMWRlMDQ0NmYxZTA2MmE3M2IwNjEwZDA2NGUxMyIsIjdmOTczNTViOGRiODFjMDlhYmZiN2YzYzViMjUxNTg4OGI2NzlhM2U1MGRkNmJkNmNlZjdjNzMxMTFmNGNjMGMiXSxbIjE3NGE1M2I5YzlhMjg1ODcyZDM5ZTU2ZTY5MTNjYWIxNWQ1OWIxZmE1MTI1MDhjMDIyZjM4MmRlODMxOTQ5N2MiLCJjY2M5ZGMzN2FiZmM5YzE2NTdiNDE1NWYyYzQ3ZjllNjY0NmIzYTFkOGNiOTg1NDM4M2RhMTNhYzA3OWFmYTczIl0sWyI5NTkzOTY5ODE5NDM3ODVjM2QzZTU3ZWRmNTAxOGNkYmUwMzllNzMwZTQ5MThiM2Q4ODRmZGZmMDk0NzViN2JhIiwiMmU3ZTU1Mjg4OGMzMzFkZDhiYTAzODZhNGI5Y2Q2ODQ5YzY1M2Y2NGM4NzA5Mzg1ZTliOGFiZjg3NTI0ZjJmZCJdLFsiZDJhNjNhNTBhZTQwMWU1NmQ2NDVhMTE1M2IxMDlhOGZjY2EwYTQzZDU2MWZiYTJkYmI1MTM0MGM5ZDgyYjE1MSIsImU4MmQ4NmZiNjQ0M2ZjYjc1NjVhZWU1OGIyOTQ4MjIwYTcwZjc1MGFmNDg0Y2E1MmQ0MTQyMTc0ZGNmODk0MDUiXSxbIjY0NTg3ZTIzMzU0NzFlYjg5MGVlNzg5NmQ3Y2ZkYzg2NmJhY2JkYmQzODM5MzE3YjM0MzZmOWI0NTYxN2UwNzMiLCJkOTlmY2RkNWJmNjkwMmUyYWU5NmRkNjQ0N2MyOTlhMTg1YjkwYTM5MTMzYWVhYjM1ODI5OWU1ZTlmYWY2NTg5Il0sWyI4NDgxYmRlMGU0ZTRkODg1YjNhNTQ2ZDNlNTQ5ZGUwNDJmMGFhNmNlYTI1MGU3ZmQzNThkNmM4NmRkNDVlNDU4IiwiMzhlZTdiOGNiYTU0MDRkZDg0YTI1YmYzOWNlY2IyY2E5MDBhNzljNDJiMjYyZTU1NmQ2NGIxYjU5Nzc5MDU3ZSJdLFsiMTM0NjRhNTdhNzgxMDJhYTYyYjY5NzlhZTgxN2Y0NjM3ZmZjZmVkM2M0YjFjZTMwYmNkNjMwM2Y2Y2FmNjY2YiIsIjY5YmUxNTkwMDQ2MTQ1ODBlZjdlNDMzNDUzY2NiMGNhNDhmMzAwYTgxZDA5NDJlMTNmNDk1YTkwN2Y2ZWNjMjciXSxbImJjNGE5ZGY1YjcxM2ZlMmU5YWVmNDMwYmNjMWRjOTdhMGNkOWNjZWRlMmYyODU4OGNhZGEzYTBkMmQ4M2YzNjYiLCJkM2E4MWNhNmU3ODVjMDYzODM5MzdhZGY0Yjc5OGNhYTZlOGE5ZmJmYTU0N2IxNmQ3NThkNjY2NTgxZjMzYzEiXSxbIjhjMjhhOTdiZjgyOThiYzBkMjNkOGM3NDk0NTJhMzJlNjk0YjY1ZTMwYTk0NzJhMzk1NGFiMzBmZTUzMjRjYWEiLCI0MGEzMDQ2M2EzMzA1MTkzMzc4ZmVkZjMxZjdjYzBlYjdhZTc4NGYwNDUxY2I5NDU5ZTcxZGM3M2NiZWY5NDgyIl0sWyI4ZWE5NjY2MTM5NTI3YThjMWRkOTRjZTRmMDcxZmQyM2M4YjM1MGM1YTRiYjMzNzQ4YzRiYTExMWZhY2NhZTAiLCI2MjBlZmFiYmM4ZWUyNzgyZTI0ZTdjMGNmYjk1YzVkNzM1Yjc4M2JlOWNmMGY4ZTk1NWFmMzRhMzBlNjJiOTQ1Il0sWyJkZDM2MjVmYWVmNWJhMDYwNzQ2Njk3MTZiYmQzNzg4ZDg5YmRkZTgxNTk1OTk2ODA5MmY3NmNjNGViOWE5Nzg3IiwiN2ExODhmYTM1MjBlMzBkNDYxZGEyNTAxMDQ1NzMxY2E5NDE0NjE5ODI4ODMzOTU5MzdmNjhkMDBjNjQ0YTU3MyJdLFsiZjcxMGQ3OWQ5ZWI5NjIyOTdlNGY2MjMyYjQwZThmN2ZlYjJiYzYzODE0NjE0ZDY5MmMxMmRlNzUyNDA4MjIxZSIsImVhOThlNjcyMzJkM2IzMjk1ZDNiNTM1NTMyMTE1Y2NhYzg2MTJjNzIxODUxNjE3NTI2YWU0N2E5Yzc3YmZjODIiXV19LG5hZjp7d25kOjcscG9pbnRzOltbImY5MzA4YTAxOTI1OGMzMTA0OTM0NGY4NWY4OWQ1MjI5YjUzMWM4NDU4MzZmOTliMDg2MDFmMTEzYmNlMDM2ZjkiLCIzODhmN2IwZjYzMmRlODE0MGZlMzM3ZTYyYTM3ZjM1NjY1MDBhOTk5MzRjMjIzMWI2Y2I5ZmQ3NTg0YjhlNjcyIl0sWyIyZjhiZGU0ZDFhMDcyMDkzNTViNGE3MjUwYTVjNTEyOGU4OGI4NGJkZGM2MTlhYjdjYmE4ZDU2OWIyNDBlZmU0IiwiZDhhYzIyMjYzNmU1ZTNkNmQ0ZGJhOWRkYTZjOWM0MjZmNzg4MjcxYmFiMGQ2ODQwZGNhODdkM2FhNmFjNjJkNiJdLFsiNWNiZGYwNjQ2ZTVkYjRlYWEzOThmMzY1ZjJlYTdhMGUzZDQxOWI3ZTAzMzBlMzljZTkyYmRkZWRjYWM0ZjliYyIsIjZhZWJjYTQwYmEyNTU5NjBhMzE3OGQ2ZDg2MWE1NGRiYTgxM2QwYjgxM2ZkZTdiNWE1MDgyNjI4MDg3MjY0ZGEiXSxbImFjZDQ4NGUyZjBjN2Y2NTMwOWFkMTc4YTlmNTU5YWJkZTA5Nzk2OTc0YzU3ZTcxNGMzNWYxMTBkZmMyN2NjYmUiLCJjYzMzODkyMWIwYTdkOWZkNjQzODA5NzE3NjNiNjFlOWFkZDg4OGE0Mzc1ZjhlMGYwNWNjMjYyYWM2NGY5YzM3Il0sWyI3NzRhZTdmODU4YTk0MTFlNWVmNDI0NmI3MGM2NWFhYzU2NDk5ODBiZTVjMTc4OTFiYmVjMTc4OTVkYTAwOGNiIiwiZDk4NGEwMzJlYjZiNWUxOTAyNDNkZDU2ZDdiN2IzNjUzNzJkYjFlMmRmZjlkNmE4MzAxZDc0YzljOTUzYzYxYiJdLFsiZjI4NzczYzJkOTc1Mjg4YmM3ZDFkMjA1YzM3NDg2NTFiMDc1ZmJjNjYxMGU1OGNkZGVlZGRmOGYxOTQwNWFhOCIsImFiMDkwMmU4ZDg4MGE4OTc1ODIxMmViNjVjZGFmNDczYTFhMDZkYTUyMWZhOTFmMjliNWNiNTJkYjAzZWQ4MSJdLFsiZDc5MjRkNGY3ZDQzZWE5NjVhNDY1YWUzMDk1ZmY0MTEzMWU1OTQ2ZjNjODVmNzllNDRhZGJjZjhlMjdlMDgwZSIsIjU4MWUyODcyYTg2YzcyYTY4Mzg0MmVjMjI4Y2M2ZGVmZWE0MGFmMmJkODk2ZDNhNWM1MDRkYzlmZjZhMjZiNTgiXSxbImRlZmRlYTRjZGI2Nzc3NTBhNDIwZmVlODA3ZWFjZjIxZWI5ODk4YWU3OWI5NzY4NzY2ZTRmYWEwNGEyZDRhMzQiLCI0MjExYWIwNjk0NjM1MTY4ZTk5N2IwZWFkMmE5M2RhZWNlZDFmNGEwNGE5NWMwZjZjZmIxOTlmNjllNTZlYjc3Il0sWyIyYjRlYTBhNzk3YTQ0M2QyOTNlZjVjZmY0NDRmNDk3OWYwNmFjZmViZDdlODZkMjc3NDc1NjU2MTM4Mzg1YjZjIiwiODVlODliYzAzNzk0NWQ5M2IzNDMwODNiNWExYzg2MTMxYTAxZjYwYzUwMjY5NzYzYjU3MGM4NTRlNWMwOWI3YSJdLFsiMzUyYmJmNGE0Y2RkMTI1NjRmOTNmYTMzMmNlMzMzMzAxZDlhZDQwMjcxZjgxMDcxODEzNDBhZWYyNWJlNTlkNSIsIjMyMWViNDA3NTM0OGY1MzRkNTljMTgyNTlkZGEzZTFmNGExYjNiMmU3MWIxMDM5YzY3YmQzZDhiY2Y4MTk5OGMiXSxbIjJmYTIxMDRkNmIzOGQxMWIwMjMwMDEwNTU5ODc5MTI0ZTQyYWI4ZGZlZmY1ZmYyOWRjOWNkYWRkNGVjYWNjM2YiLCIyZGUxMDY4Mjk1ZGQ4NjViNjQ1NjkzMzViZDVkZDgwMTgxZDcwZWNmYzg4MjY0ODQyM2JhNzZiNTMyYjdkNjciXSxbIjkyNDgyNzliMDliNGQ2OGRhYjIxYTliMDY2ZWRkYTgzMjYzYzNkODRlMDk1NzJlMjY5Y2EwY2Q3ZjU0NTM3MTQiLCI3MzAxNmY3YmYyMzRhYWRlNWQxYWE3MWJkZWEyYjFmZjNmYzBkZTJhODg3OTEyZmZlNTRhMzJjZTk3Y2IzNDAyIl0sWyJkYWVkNGYyYmUzYThiZjI3OGU3MDEzMmZiMGJlYjc1MjJmNTcwZTE0NGJmNjE1YzA3ZTk5NmQ0NDNkZWU4NzI5IiwiYTY5ZGNlNGE3ZDZjOThlOGQ0YTFhY2E4N2VmOGQ3MDAzZjgzYzIzMGYzYWZhNzI2YWI0MGU1MjI5MGJlMWM1NSJdLFsiYzQ0ZDEyYzcwNjVkODEyZThhY2YyOGQ3Y2JiMTlmOTAxMWVjZDllOWZkZjI4MWIwZTZhM2I1ZTg3ZDIyZTdkYiIsIjIxMTlhNDYwY2UzMjZjZGM3NmM0NTkyNmM5ODJmZGFjMGUxMDZlODYxZWRmNjFjNWEwMzkwNjNmMGUwZTY0ODIiXSxbIjZhMjQ1YmY2ZGM2OTg1MDRjODlhMjBjZmRlZDYwODUzMTUyYjY5NTMzNmMyODA2M2I2MWM2NWNiZDI2OWU2YjQiLCJlMDIyY2Y0MmMyYmQ0YTcwOGIzZjUxMjZmMTZhMjRhZDhiMzNiYTQ4ZDA0MjNiNmVmZDVlNjM0ODEwMGQ4YTgyIl0sWyIxNjk3ZmZhNmZkOWRlNjI3YzA3N2UzZDJmZTU0MTA4NGNlMTMzMDBiMGJlYzExNDZmOTVhZTU3ZjBkMGJkNmE1IiwiYjljMzk4ZjE4NjgwNmY1ZDI3NTYxNTA2ZTQ1NTc0MzNhMmNmMTUwMDllNDk4YWU3YWRlZTlkNjNkMDFiMjM5NiJdLFsiNjA1YmRiMDE5OTgxNzE4Yjk4NmQwZjA3ZTgzNGNiMGQ5ZGViODM2MGZmYjdmNjFkZjk4MjM0NWVmMjdhNzQ3OSIsIjI5NzJkMmRlNGY4ZDIwNjgxYTc4ZDkzZWM5NmZlMjNjMjZiZmFlODRmYjE0ZGI0M2IwMWUxZTkwNTZiOGM0OSJdLFsiNjJkMTRkYWI0MTUwYmY0OTc0MDJmZGM0NWEyMTVlMTBkY2IwMWMzNTQ5NTliMTBjZmUzMWM3ZTlkODdmZjMzZCIsIjgwZmMwNmJkOGNjNWIwMTA5ODA4OGExOTUwZWVkMGRiMDFhYTEzMjk2N2FiNDcyMjM1ZjU2NDI0ODNiMjVlYWYiXSxbIjgwYzYwYWQwMDQwZjI3ZGFkZTViNGIwNmM0MDhlNTZiMmM1MGU5ZjU2YjliOGI0MjVlNTU1YzJmODYzMDhiNmYiLCIxYzM4MzAzZjFjYzVjMzBmMjZlNjZiYWQ3ZmU3MmY3MGE2NWVlZDRjYmU3MDI0ZWIxYWEwMWY1NjQzMGJkNTdhIl0sWyI3YTkzNzVhZDYxNjdhZDU0YWE3NGM2MzQ4Y2M1NGQzNDRjYzVkYzk0ODdkODQ3MDQ5ZDVlYWJiMGZhMDNjOGZiIiwiZDBlM2ZhOWVjYTg3MjY5MDk1NTllMGQ3OTI2OTA0NmJkYzU5ZWExMGM3MGNlMmIwMmQ0OTllYzIyNGRjN2Y3Il0sWyJkNTI4ZWNkOWI2OTZiNTRjOTA3YTllZDA0NTQ0N2E3OWJiNDA4ZWMzOWI2OGRmNTA0YmI1MWY0NTliYzNmZmM5IiwiZWVjZjQxMjUzMTM2ZTVmOTk5NjZmMjE4ODFmZDY1NmViYzQzNDU0MDVjNTIwZGJjMDYzNDY1YjUyMTQwOTkzMyJdLFsiNDkzNzBhNGI1ZjQzNDEyZWEyNWY1MTRlOGVjZGFkMDUyNjYxMTVlNGE3ZWNiMTM4NzIzMTgwOGY4YjQ1OTYzIiwiNzU4ZjNmNDFhZmQ2ZWQ0MjhiMzA4MWIwNTEyZmQ2MmE1NGMzZjNhZmJiNWI2NzY0YjY1MzA1MmExMjk0OWM5YSJdLFsiNzdmMjMwOTM2ZWU4OGNiYmQ3M2RmOTMwZDY0NzAyZWY4ODFkODExZTBlMTQ5OGUyZjFjMTNlYjFmYzM0NWQ3NCIsIjk1OGVmNDJhNzg4NmI2NDAwYTA4MjY2ZTliYTFiMzc4OTZjOTUzMzBkOTcwNzdjYmJlOGViM2M3NjcxYzYwZDYiXSxbImYyZGFjOTkxY2M0Y2U0YjllYTQ0ODg3ZTVjN2MwYmNlNThjODAwNzRhYjlkNGRiYWViMjg1MzFiNzczOWY1MzAiLCJlMGRlZGM5YjNiMmY4ZGFkNGRhMWYzMmRlYzI1MzFkZjllYjVmYmViMDU5OGU0ZmQxYTExN2RiYTcwM2EzYzM3Il0sWyI0NjNiM2Q5ZjY2MjYyMWZiMWI0YmU4ZmJiZTI1MjAxMjVhMjE2Y2RmYzlkYWUzZGViY2JhNDg1MGM2OTBkNDViIiwiNWVkNDMwZDc4YzI5NmMzNTQzMTE0MzA2ZGQ4NjIyZDdjNjIyZTI3Yzk3MGExZGUzMWNiMzc3YjAxYWY3MzA3ZSJdLFsiZjE2ZjgwNDI0NGU0NmUyYTA5MjMyZDRhZmYzYjU5OTc2Yjk4ZmFjMTQzMjhhMmQxYTMyNDk2YjQ5OTk4ZjI0NyIsImNlZGFiZDliODIyMDNmN2UxM2QyMDZmY2RmNGUzM2Q5MmE2YzUzYzI2ZTVjY2UyNmQ2NTc5OTYyYzRlMzFkZjYiXSxbImNhZjc1NDI3MmRjODQ1NjNiMDM1MmI3YTE0MzExYWY1NWQyNDUzMTVhY2UyN2M2NTM2OWUxNWY3MTUxZDQxZDEiLCJjYjQ3NDY2MGVmMzVmNWYyYTQxYjY0M2ZhNWU0NjA1NzVmNGZhOWI3OTYyMjMyYTVjMzJmOTA4MzE4YTA0NDc2Il0sWyIyNjAwY2E0YjI4MmNiOTg2Zjg1ZDBmMTcwOTk3OWQ4YjQ0YTA5YzA3Y2I4NmQ3YzEyNDQ5N2JjODZmMDgyMTIwIiwiNDExOWI4ODc1M2MxNWJkNmE2OTNiMDNmY2RkYmI0NWQ1YWM2YmU3NGFiNWYwZWY0NGIwYmU5NDc1YTdlNGI0MCJdLFsiNzYzNWNhNzJkN2U4NDMyYzMzOGVjNTNjZDEyMjIwYmMwMWM0ODY4NWUyNGY3ZGM4YzYwMmE3NzQ2OTk4ZTQzNSIsIjkxYjY0OTYwOTQ4OWQ2MTNkMWQ1ZTU5MGY3OGU2ZDc0ZWNmYzA2MWQ1NzA0OGJhZDllNzZmMzAyYzViOWM2MSJdLFsiNzU0ZTMyMzlmMzI1NTcwY2RiYmY0YTg3ZGVlZThhNjZiN2YyYjMzNDc5ZDQ2OGZiYzFhNTA3NDNiZjU2Y2MxOCIsIjY3M2ZiODZlNWJkYTMwZmIzY2QwZWQzMDRlYTQ5YTAyM2VlMzNkMDE5N2E2OTVkMGM1ZDk4MDkzYzUzNjY4MyJdLFsiZTNlNmJkMTA3MWExZTk2YWZmNTc4NTljODJkNTcwZjAzMzA4MDA2NjFkMWM5NTJmOWZlMjY5NDY5MWQ5YjllOCIsIjU5YzllMGJiYTM5NGU3NmY0MGMwYWE1ODM3OWEzY2I2YTVhMjI4Mzk5M2U5MGM0MTY3MDAyYWY0OTIwZTM3ZjUiXSxbIjE4NmI0ODNkMDU2YTAzMzgyNmFlNzNkODhmNzMyOTg1YzRjY2IxZjMyYmEzNWY0YjRjYzQ3ZmRjZjA0YWE2ZWIiLCIzYjk1MmQzMmM2N2NmNzdlMmUxNzQ0NmUyMDQxODBhYjIxZmI4MDkwODk1MTM4YjRhNGE3OTdmODZlODA4ODhiIl0sWyJkZjlkNzBhNmI5ODc2Y2U1NDRjOTg1NjFmNGJlNGY3MjU0NDJlNmQyYjczN2Q5YzkxYTgzMjE3MjRjZTA5NjNmIiwiNTVlYjJkYWZkODRkNmNjZDVmODYyYjc4NWRjMzlkNGFiMTU3MjIyNzIwZWY5ZGEyMTdiOGM0NWNmMmJhMjQxNyJdLFsiNWVkZDVjYzIzYzUxZTg3YTQ5N2NhODE1ZDVkY2UwZjhhYjUyNTU0Zjg0OWVkODk5NWRlNjRjNWYzNGNlNzE0MyIsImVmYWU5YzhkYmMxNDEzMDY2MWU4Y2VjMDMwYzg5YWQwYzEzYzY2YzBkMTdhMjkwNWNkYzcwNmFiNzM5OWE4NjgiXSxbIjI5MDc5OGMyYjY0NzY4MzBkYTEyZmUwMjI4N2U5ZTc3N2FhM2ZiYTFjMzU1YjE3YTcyMmQzNjJmODQ2MTRmYmEiLCJlMzhkYTc2ZGNkNDQwNjIxOTg4ZDAwYmNmNzlhZjI1ZDViMjljMDk0ZGIyYTIzMTQ2ZDAwM2FmZDQxOTQzZTdhIl0sWyJhZjNjNDIzYTk1ZDlmNWIzMDU0NzU0ZWZhMTUwYWMzOWNkMjk1NTJmZTM2MDI1NzM2MmRmZGVjZWY0MDUzYjQ1IiwiZjk4YTNmZDgzMWViMmI3NDlhOTNiMGU2ZjM1Y2ZiNDBjOGNkNWFhNjY3YTE1NTgxYmMyZmVkZWQ0OThmZDljNiJdLFsiNzY2ZGJiMjRkMTM0ZTc0NWNjY2FhMjhjOTliZjI3NDkwNmJiNjZiMjZkY2Y5OGRmOGQyZmVkNTBkODg0MjQ5YSIsIjc0NGIxMTUyZWFjYmU1ZTM4ZGNjODg3OTgwZGEzOGI4OTc1ODRhNjVmYTA2Y2VkZDJjOTI0Zjk3Y2JhYzU5OTYiXSxbIjU5ZGJmNDZmOGM5NDc1OWJhMjEyNzdjMzM3ODRmNDE2NDVmN2I0NGY2YzU5NmE1OGNlOTJlNjY2MTkxYWJlM2UiLCJjNTM0YWQ0NDE3NWZiYzMwMGY0ZWE2Y2U2NDgzMDlhMDQyY2U3MzlhNzkxOTc5OGNkODVlMjE2YzRhMzA3ZjZlIl0sWyJmMTNhZGE5NTEwM2M0NTM3MzA1ZTY5MWU3NGU5YTRhOGRkNjQ3ZTcxMWE5NWU3M2NiNjJkYzYwMThjZmQ4N2I4IiwiZTEzODE3YjQ0ZWUxNGRlNjYzYmY0YmM4MDgzNDFmMzI2OTQ5ZTIxYTZhNzVjMjU3MDc3ODQxOWJkYWY1NzMzZCJdLFsiNzc1NGI0ZmEwZThhY2VkMDZkNDE2N2EyYzU5Y2NhNGNkYTE4NjljMDZlYmFkZmI2NDg4NTUwMDE1YTg4NTIyYyIsIjMwZTkzZTg2NGU2NjlkODIyMjRiOTY3YzMwMjBiOGZhOGQxZTRlMzUwYjZjYmNjNTM3YTQ4YjU3ODQxMTYzYTIiXSxbIjk0OGRjYWRmNTk5MGUwNDhhYTM4NzRkNDZhYmVmOWQ3MDE4NThmOTVkZTgwNDFkMmE2ODI4Yzk5ZTIyNjI1MTkiLCJlNDkxYTQyNTM3ZjZlNTk3ZDVkMjhhMzIyNGIxYmMyNWRmOTE1NGVmYmQyZWYxZDJjYmJhMmNhZTUzNDdkNTdlIl0sWyI3OTYyNDE0NDUwYzc2YzE2ODljN2I0OGY4MjAyZWMzN2ZiMjI0Y2Y1YWMwYmZhMTU3MDMyOGE4YTNkN2M3N2FiIiwiMTAwYjYxMGVjNGZmYjQ3NjBkNWMxZmMxMzNlZjZmNmIxMjUwN2EwNTFmMDRhYzU3NjBhZmE1YjI5ZGI4MzQzNyJdLFsiMzUxNDA4NzgzNDk2NGI1NGIxNWIxNjA2NDRkOTE1NDg1YTE2OTc3MjI1Yjg4NDdiYjBkZDA4NTEzN2VjNDdjYSIsImVmMGFmYmIyMDU2MjA1NDQ4ZTE2NTJjNDhlODEyN2ZjNjAzOWU3N2MxNWMyMzc4YjdlN2QxNWEwZGUyOTMzMTEiXSxbImQzY2MzMGFkNmI0ODNlNGJjNzljZTJjOWRkOGJjNTQ5OTNlOTQ3ZWI4ZGY3ODdiNDQyOTQzZDNmN2I1MjdlYWYiLCI4YjM3OGEyMmQ4MjcyNzhkODljNWU5YmU4Zjk1MDhhZTNjMmFkNDYyOTAzNTg2MzBhZmIzNGRiMDRlZWRlMGE0Il0sWyIxNjI0ZDg0NzgwNzMyODYwY2UxYzc4ZmNiZmVmZTA4YjJiMjk4MjNkYjkxM2Y2NDkzOTc1YmEwZmY0ODQ3NjEwIiwiNjg2NTFjZjliNmRhOTAzZTA5MTQ0NDhjNmNkOWQ0Y2E4OTY4NzhmNTI4MmJlNGM4Y2MwNmUyYTQwNDA3ODU3NSJdLFsiNzMzY2U4MGRhOTU1YThhMjY5MDJjOTU2MzNlNjJhOTg1MTkyNDc0YjVhZjIwN2RhNmRmN2I0ZmQ1ZmM2MWNkNCIsImY1NDM1YTJiZDJiYWRmN2Q0ODVhNGQ4YjhkYjlmY2NlM2UxZWY4ZTAyMDFlNDU3OGM1NDY3M2JjMWRjNWVhMWQiXSxbIjE1ZDk0NDEyNTQ5NDUwNjRjZjFhMWMzM2JiZDNiNDlmODk2NmM1MDkyMTcxZTY5OWVmMjU4ZGZhYjgxYzA0NWMiLCJkNTZlYjMwYjY5NDYzZTcyMzRmNTEzN2I3M2I4NDE3NzQzNDgwMGJhY2ViZmM2ODVmYzM3YmJlOWVmZTQwNzBkIl0sWyJhMWQwZmNmMmVjOWRlNjc1YjYxMjEzNmU1Y2U3MGQyNzFjMjE0MTdjOWQyYjhhYWFhYzEzODU5OWQwNzE3OTQwIiwiZWRkNzdmNTBiY2I1YTNjYWIyZTkwNzM3MzA5NjY3ZjI2NDE0NjJhNTQwNzBmM2Q1MTkyMTJkMzljMTk3YTYyOSJdLFsiZTIyZmJlMTVjMGFmOGNjYzU3ODBjMDczNWY4NGRiZTlhNzkwYmFkZWU4MjQ1YzA2YzdjYTM3MzMxY2IzNjk4MCIsImE4NTViYWJhZDVjZDYwYzg4YjQzMGE2OWY1M2ExYTdhMzgyODkxNTQ5NjQ3OTliZTQzZDA2ZDc3ZDMxZGEwNiJdLFsiMzExMDkxZGQ5ODYwZThlMjBlZTEzNDczYzExNTVmNWY2OTYzNWUzOTQ3MDRlYWE3NDAwOTQ1MjI0NmNmYTliMyIsIjY2ZGI2NTZmODdkMWYwNGZmZmQxZjA0Nzg4YzA2ODMwODcxZWM1YTY0ZmVlZTY4NWJkODBmMGIxMjg2ZDgzNzQiXSxbIjM0YzFmZDA0ZDMwMWJlODliMzFjMDQ0MmQzZTZhYzI0ODgzOTI4YjQ1YTkzNDA3ODE4NjdkNDIzMmVjMmRiZGYiLCI5NDE0Njg1ZTk3YjFiNTk1NGJkNDZmNzMwMTc0MTM2ZDU3ZjFjZWViNDg3NDQzZGM1MzIxODU3YmE3M2FiZWUiXSxbImYyMTllYTVkNmI1NDcwMWMxYzE0ZGU1YjU1N2ViNDJhOGQxM2YzYWJiY2QwOGFmZmNjMmE1ZTZiMDQ5YjhkNjMiLCI0Y2I5NTk1N2U4M2Q0MGIwZjczYWY0NTQ0Y2NjZjZiMWY0YjA4ZDNjMDdiMjdmYjhkOGMyOTYyYTQwMDc2NmQxIl0sWyJkN2I4NzQwZjc0YThmYmFhYjFmNjgzZGI4ZjQ1ZGUyNjU0M2E1NDkwYmNhNjI3MDg3MjM2OTEyNDY5YTBiNDQ4IiwiZmE3Nzk2ODEyOGQ5YzkyZWUxMDEwZjMzN2FkNDcxN2VmZjE1ZGI1ZWQzYzA0OWIzNDExZTAzMTVlYWE0NTkzYiJdLFsiMzJkMzFjMjIyZjhmNmYwZWY4NmY3Yzk4ZDNhMzMzNWVhZDViY2QzMmFiZGQ5NDI4OWZlNGQzMDkxYWE4MjRiZiIsIjVmMzAzMmY1ODkyMTU2ZTM5Y2NkM2Q3OTE1YjllMWRhMmU2ZGFjOWU2ZjI2ZTk2MTExOGQxNGI4NDYyZTE2NjEiXSxbIjc0NjFmMzcxOTE0YWIzMjY3MTA0NWExNTVkOTgzMWVhODc5M2Q3N2NkNTk1OTJjNDM0MGY4NmNiYzE4MzQ3YjUiLCI4ZWMwYmEyMzhiOTZiZWMwY2JkZGRjYWUwYWE0NDI1NDJlZWUxZmY1MGM5ODZlYTZiMzk4NDdiM2NjMDkyZmY2Il0sWyJlZTA3OWFkYjFkZjE4NjAwNzQzNTZhMjVhYTM4MjA2YTZkNzE2YjJjM2U2NzQ1M2QyODc2OThiYWQ3YjJiMmQ2IiwiOGRjMjQxMmFhZmUzYmU1YzRjNWYzN2UwZWNjNWY5ZjZhNDQ2OTg5YWYwNGM0ZTI1ZWJhYWM0NzllYzFjOGMxZSJdLFsiMTZlYzkzZTQ0N2VjODNmMDQ2N2IxODMwMmVlNjIwZjdlNjVkZTMzMTg3NGM5ZGM3MmJmZDg2MTZiYTlkYTZiNSIsIjVlNDYzMTE1MGU2MmZiNDBkMGU4YzJhN2NhNTgwNGEzOWQ1ODE4NmE1MGU0OTcxMzk2MjY3NzhlMjViMDY3NGQiXSxbImVhYTVmOTgwYzI0NWY2ZjAzODk3ODI5MGFmYTcwYjZiZDg4NTU4OTdmOThiNmFhNDg1Yjk2MDY1ZDUzN2JkOTkiLCJmNjVmNWQzZTI5MmMyZTA4MTlhNTI4MzkxYzk5NDYyNGQ3ODQ4NjlkN2U2ZWE2N2ZiMTgwNDEwMjRlZGMwN2RjIl0sWyI3OGM5NDA3NTQ0YWMxMzI2OTJlZTE5MTBhMDI0Mzk5NThhZTA0ODc3MTUxMzQyZWE5NmM0YjZiMzVhNDlmNTEiLCJmM2UwMzE5MTY5ZWI5Yjg1ZDU0MDQ3OTU1MzlhNWU2OGZhMWZiZDU4M2MwNjRkMjQ2MmI2NzVmMTk0YTNkZGI0Il0sWyI0OTRmNGJlMjE5YTFhNzcwMTZkY2Q4Mzg0MzFhZWEwMDAxY2RjOGFlN2E2ZmM2ODg3MjY1NzhkOTcwMjg1N2E1IiwiNDIyNDJhOTY5MjgzYTVmMzM5YmE3ZjA3NWUzNmJhMmFmOTI1Y2UzMGQ3NjdlZDZlNTVmNGIwMzE4ODBkNTYyYyJdLFsiYTU5OGE4MDMwZGE2ZDg2YzZiYzdmMmY1MTQ0ZWE1NDlkMjgyMTFlYTU4ZmFhNzBlYmY0YzFlNjY1YzFmZTliNSIsIjIwNGI1ZDZmODQ4MjJjMzA3ZTRiNGE3MTQwNzM3YWVjMjNmYzYzYjY1YjM1Zjg2YTEwMDI2ZGJkMmQ4NjRlNmIiXSxbImM0MTkxNjM2NWFiYjJiNWQwOTE5MmY1ZjJkYmVhZmVjMjA4ZjAyMGYxMjU3MGExODRkYmFkYzNlNTg1OTU5OTciLCI0ZjE0MzUxZDAwODdlZmE0OWQyNDViMzI4OTg0OTg5ZDVjYWY5NDUwZjM0YmZjMGVkMTZlOTZiNThmYTk5MTMiXSxbIjg0MWQ2MDYzYTU4NmZhNDc1YTcyNDYwNGRhMDNiYzViOTJhMmUwZDJlMGEzNmFjZmU0YzczYTU1MTQ3NDI4ODEiLCI3Mzg2N2Y1OWMwNjU5ZTgxOTA0ZjlhMWM3NTQzNjk4ZTYyNTYyZDY3NDRjMTY5Y2U3YTM2ZGUwMWE4ZDYxNTQiXSxbIjVlOTViYjM5OWE2OTcxZDM3NjAyNjk0N2Y4OWJkZTJmMjgyYjMzODEwOTI4YmU0ZGVkMTEyYWM0ZDcwZTIwZDUiLCIzOWYyM2YzNjY4MDkwODViZWViZmM3MTE4MTMxMzc3NWE5OWM5YWVkN2Q4YmEzOGIxNjEzODRjNzQ2MDEyODY1Il0sWyIzNmU0NjQxYTUzOTQ4ZmQ0NzZjMzlmOGE5OWZkOTc0ZTVlYzA3NTY0YjUzMTVkOGJmOTk0NzFiY2EwZWYyZjY2IiwiZDI0MjRiMWIxYWJlNGViODE2NDIyN2IwODVjOWFhOTQ1NmVhMTM0OTNmZDU2M2UwNmZkNTFjZjU2OTRjNzhmYyJdLFsiMzM2NTgxZWE3YmZiYmIyOTBjMTkxYTJmNTA3YTQxY2Y1NjQzODQyMTcwZTkxNGZhZWFiMjdjMmM1NzlmNzI2IiwiZWFkMTIxNjg1OTVmZTFiZTk5MjUyMTI5YjZlNTZiMzM5MWY3YWIxNDEwY2QxZTBlZjNkY2RjYWJkMmZkYTIyNCJdLFsiOGFiODk4MTZkYWRmZDZiNmExZjI2MzRmY2YwMGVjODQwMzc4MTAyNWVkNjg5MGM0ODQ5NzQyNzA2YmQ0M2VkZSIsIjZmZGNlZjA5ZjJmNmQwYTA0NGU2NTRhZWY2MjQxMzZmNTAzZDQ1OWMzZTg5ODQ1ODU4YTQ3YTkxMjljZGQyNGUiXSxbIjFlMzNmMWE3NDZjOWM1Nzc4MTMzMzQ0ZDkyOTlmY2FhMjBiMDkzOGU4YWNmZjI1NDRiYjQwMjg0YjhjNWZiOTQiLCI2MDY2MDI1N2RkMTFiM2FhOWM4ZWQ2MThkMjRlZGZmMjMwNmQzMjBmMWQwMzAxMGUzM2E3ZDIwNTdmM2IzYjYiXSxbIjg1YjdjMWRjYjNjZWMxYjdlZTdmMzBkZWQ3OWRkMjBhMGVkMWY0Y2MxOGNiY2ZjZmE0MTAzNjFmZDhmMDhmMzEiLCIzZDk4YTljZGQwMjZkZDQzZjM5MDQ4ZjI1YTg4NDdmNGZjYWZhZDE4OTVkN2E2MzNjNmZlZDNjMzVlOTk5NTExIl0sWyIyOWRmOWZiZDhkOWU0NjUwOTI3NWY0YjEyNWQ2ZDQ1ZDdmYmU5YTNiODc4YTdhZjg3MmEyODAwNjYxYWM1ZjUxIiwiYjRjNGZlOTljNzc1YTYwNmUyZDg4NjIxNzkxMzlmZmRhNjFkYzg2MWMwMTllNTVjZDI4NzZlYjJhMjdkODRiIl0sWyJhMGIxY2FlMDZiMGE4NDdhM2ZlYTZlNjcxYWFmOGFkZmRmZTU4Y2EyZjc2ODEwNWM4MDgyYjJlNDQ5ZmNlMjUyIiwiYWU0MzQxMDJlZGRlMDk1OGVjNGIxOWQ5MTdhNmEyOGU2YjcyZGExODM0YWZmMGU2NTBmMDQ5NTAzYTI5NmNmMiJdLFsiNGU4Y2VhZmI5YjNlOWExMzZkYzdmZjY3ZTg0MDI5NWI0OTlkZmIzYjIxMzNlNGJhMTEzZjJlNGMwZTEyMWU1IiwiY2YyMTc0MTE4YzhiNmQ3YTRiNDhmNmQ1MzRjZTVjNzk0MjJjMDg2YTYzNDYwNTAyYjgyN2NlNjJhMzI2NjgzYyJdLFsiZDI0YTQ0ZTA0N2UxOWI2ZjVhZmI4MWM3Y2EyZjY5MDgwYTUwNzY2ODlhMDEwOTE5ZjQyNzI1YzJiNzg5YTMzYiIsIjZmYjhkNTU5MWI0NjZmOGZjNjNkYjUwZjFjMGYxYzY5MDEzZjk5Njg4N2I4MjQ0ZDJjZGVjNDE3YWZlYThmYTMiXSxbImVhMDE2MDZhN2E2YzljZGQyNDlmZGZjZmFjYjk5NTg0MDAxZWRkMjhhYmJhYjc3YjUxMDRlOThlOGUzYjM1ZDQiLCIzMjJhZjQ5MDhjNzMxMmIwY2ZiZmUzNjlmN2E3YjNjZGI3ZDQ0OTRiYzI4MjM3MDBjZmQ2NTIxODhhM2VhOThkIl0sWyJhZjhhZGRiZjJiNjYxYzhhNmM2MzI4NjU1ZWI5NjY1MTI1MjAwN2Q4YzVlYTMxYmU0YWQxOTZkZThjZTIxMzFmIiwiNjc0OWU2N2MwMjliODVmNTJhMDM0ZWFmZDA5NjgzNmIyNTIwODE4NjgwZTI2YWM4ZjNkZmJjZGI3MTc0OTcwMCJdLFsiZTNhZTE5NzQ1NjZjYTA2Y2M1MTZkNDdlMGZiMTY1YTY3NGEzZGFiY2ZjYTE1ZTcyMmYwZTM0NTBmNDU4ODkiLCIyYWVhYmU3ZTQ1MzE1MTAxMTYyMTdmMDdiZjRkMDczMDBkZTk3ZTQ4NzRmODFmNTMzNDIwYTcyZWViMGJkNmE0Il0sWyI1OTFlZTM1NTMxM2Q5OTcyMWNmNjk5M2ZmZWQxZTNlMzAxOTkzZmYzZWQyNTg4MDIwNzVlYThjZWQzOTdlMjQ2IiwiYjBlYTU1OGExMTNjMzBiZWE2MGZjNDc3NTQ2MGM3OTAxZmYwYjA1M2QyNWNhMmJkZWVlOThmMWE0YmU1ZDE5NiJdLFsiMTEzOTZkNTVmZGE1NGM0OWYxOWFhOTczMThkOGRhNjFmYTg1ODRlNDdiMDg0OTQ1MDc3Y2YwMzI1NWI1Mjk4NCIsIjk5OGM3NGE4Y2Q0NWFjMDEyODlkNTgzM2E3YmViNDc0NGZmNTM2YjAxYjI1N2JlNGM1NzY3YmVhOTNlYTU3YTQiXSxbIjNjNWQyYTFiYTM5YzVhMTc5MDAwMDczOGM5ZTBjNDBiOGRjZGZkNTQ2ODc1NGI2NDA1NTQwMTU3ZTAxN2FhN2EiLCJiMjI4NDI3OTk5NWEzNGUyZjlkNGRlNzM5NmZjMThiODBmOWI4YjlmZGQyNzBmNjY2MWY3OWNhNGM4MWJkMjU3Il0sWyJjYzg3MDRiOGE2MGEwZGVmYTNhOTlhNzI5OWYyZTljM2ZiYzM5NWFmYjA0YWMwNzg0MjVlZjhhMTc5M2NjMDMwIiwiYmRkNDYwMzlmZWVkMTc4ODFkMWUwODYyZGIzNDdmOGNmMzk1Yjc0ZmM0YmNkYzRlOTQwYjc0ZTNhYzFmMWIxMyJdLFsiYzUzM2U0ZjdlYTg1NTVhYWNkOTc3N2FjNWNhZDI5Yjk3ZGQ0ZGVmY2NjNTNlZTdlYTIwNDExOWIyODg5YjE5NyIsIjZmMGEyNTZiYzVlZmRmNDI5YTJmYjYyNDJmMWE0M2EyZDliOTI1YmI0YTRiM2EyNmJiOGUwZjQ1ZWI1OTYwOTYiXSxbImMxNGY4ZjJjY2IyN2Q2ZjEwOWY2ZDA4ZDAzY2M5NmE2OWJhOGMzNGVlYzA3YmJjZjU2NmQ0OGUzM2RhNjU5MyIsImMzNTlkNjkyM2JiMzk4ZjdmZDQ0NzNlMTZmZTFjMjg0NzViNzQwZGQwOTgwNzVlNmMwZTg2NDkxMTNkYzNhMzgiXSxbImE2Y2JjMzA0NmJjNmE0NTBiYWMyNDc4OWZhMTcxMTVhNGM5NzM5ZWQ3NWY4ZjIxY2U0NDFmNzJlMGI5MGU2ZWYiLCIyMWFlN2Y0NjgwZTg4OWJiMTMwNjE5ZTJjMGY5NWEzNjBjZWI1NzNjNzA2MDMxMzk4NjJhZmQ2MTdmYTliOWYiXSxbIjM0N2Q2ZDlhMDJjNDg5MjdlYmZiODZjMTM1OWIxY2FmMTMwYTNjMDI2N2QxMWNlNjM0NGIzOWY5OWQ0M2NjMzgiLCI2MGVhN2Y2MWEzNTM1MjRkMWM5ODdmNmVjZWM5MmYwODZkNTY1YWI2ODc4NzBjYjEyNjg5ZmYxZTMxYzc0NDQ4Il0sWyJkYTY1NDVkMjE4MWRiOGQ5ODNmN2RjYjM3NWVmNTg2NmQ0N2M2N2IxYmYzMWM4Y2Y4NTVlZjc0MzdiNzI2NTZhIiwiNDliOTY3MTVhYjY4NzhhNzllNzhmMDdjZTU2ODBjNWQ2NjczMDUxYjQ5MzViZDg5N2ZlYTgyNGI3N2RjMjA4YSJdLFsiYzQwNzQ3Y2M5ZDAxMmNiMWExM2I4MTQ4MzA5YzZkZTdlYzI1ZDY5NDVkNjU3MTQ2YjlkNTk5NGI4ZmViMTExMSIsIjVjYTU2MDc1M2JlMmExMmZjNmRlNmNhZjJjYjQ4OTU2NWRiOTM2MTU2Yjk1MTRlMWJiNWU4MzAzN2UwZmEyZDQiXSxbIjRlNDJjOGVjODJjOTk3OThjY2YzYTYxMGJlODcwZTc4MzM4YzdmNzEzMzQ4YmQzNGM4MjAzZWY0MDM3ZjM1MDIiLCI3NTcxZDc0ZWU1ZTBmYjkyYTdhOGIzM2EwNzc4MzM0MWE1NDkyMTQ0Y2M1NGJjYzQwYTk0NDczNjkzNjA2NDM3Il0sWyIzNzc1YWI3MDg5YmM2YWY4MjNhYmEyZTFhZjcwYjIzNmQyNTFjYWRiMGM4Njc0MzI4NzUyMmExYjNiMGRlZGVhIiwiYmU1MmQxMDdiY2ZhMDlkOGJjYjk3MzZhODI4Y2ZhN2ZhYzhkYjE3YmY3YTc2YTJjNDJhZDk2MTQwOTAxOGNmNyJdLFsiY2VlMzFjYmY3ZTM0ZWMzNzlkOTRmYjgxNGQzZDc3NWFkOTU0NTk1ZDEzMTRiYTg4NDY5NTllM2U4MmY3NGUyNiIsIjhmZDY0YTE0YzA2YjU4OWMyNmI5NDdhZTJiY2Y2YmZhMDE0OWVmMGJlMTRlZDRkODBmNDQ4YTAxYzQzYjFjNmQiXSxbImI0ZjllYWVhMDliNjkxNzYxOWY2ZWE2YTRlYjU0NjRlZmRkYjU4ZmQ0NWIxZWJlZmNkYzFhMDFkMDhiNDc5ODYiLCIzOWU1Yzk5MjViNWE1NGIwNzQzM2E0ZjE4YzYxNzI2ZjhiYjEzMWMwMTJjYTU0MmViMjRhOGFjMDcyMDA2ODJhIl0sWyJkNDI2M2RmYzNkMmRmOTIzYTAxNzlhNDg5NjZkMzBjZTg0ZTI1MTVhZmMzZGNjYzFiNzc5MDc3OTJlYmNjNjBlIiwiNjJkZmFmMDdhMGY3OGZlYjMwZTMwZDYyOTU4NTNjZTE4OWUxMjc3NjBhZDZjZjdmYWUxNjRlMTIyYTIwOGQ1NCJdLFsiNDg0NTc1MjQ4MjBmYTY1YTRmOGQzNWViNjkzMDg1N2MwMDMyYWNjMGE0YTJkZTQyMjIzM2VlZGE4OTc2MTJjNCIsIjI1YTc0OGFiMzY3OTc5ZDk4NzMzYzM4YTFmYTFjMmU3ZGM2Y2MwN2RiMmQ2MGE5YWU3YTc2YWFhNDliZDBmNzciXSxbImRmZWVlZjE4ODExMDFmMmNiMTE2NDRmM2EyYWZkZmMyMDQ1ZTE5OTE5MTUyOTIzZjM2N2ExNzY3YzExY2NlZGEiLCJlY2ZiNzA1NmNmMWRlMDQyZjk0MjBiYWIzOTY3OTNjMGMzOTBiZGU3NGI0YmJkZmYxNmE4M2FlMDlhOWE3NTE3Il0sWyI2ZDdlZjZiMTc1NDNmODM3M2M1NzNmNDRlMWYzODk4MzVkODliY2JjNjA2MmNlZDM2YzgyZGY4M2I4ZmFlODU5IiwiY2Q0NTBlYzMzNTQzODk4NmRmZWZhMTBjNTdmZWE5YmNjNTIxYTA5NTliMmQ4MGJiZjc0YjE5MGRjYTcxMmQxMCJdLFsiZTc1NjA1ZDU5MTAyYTVhMjY4NDUwMGQzYjk5MWYyZTNmM2M4OGI5MzIyNTU0NzAzNWFmMjVhZjY2ZTA0NTQxZiIsImY1YzU0NzU0YThmNzFlZTU0MGI5YjQ4NzI4NDczZTMxNGY3MjlhYzUzMDhiMDY5MzgzNjA5OTBlMmJmYWQxMjUiXSxbImViOTg2NjBmNGM0ZGZhYTA2YTJiZTQ1M2Q1MDIwYmM5OWEwYzJlNjBhYmUzODg0NTdkZDQzZmVmYjFlZDYyMGMiLCI2Y2I5YTg4NzZkOWNiODUyMDYwOWFmM2FkZDI2Y2QyMGEwYTdjZDhhOTQxMTEzMWNlODVmNDQxMDAwOTkyMjNlIl0sWyIxM2U4N2IwMjdkODUxNGQzNTkzOWYyZTY4OTJiMTk5MjIxNTQ1OTY5NDE4ODgzMzZkYzM1NjNlM2I4ZGJhOTQyIiwiZmVmNWEzYzY4MDU5YTZkZWM1ZDYyNDExNGJmMWU5MWFhYzJiOWRhNTY4ZDZhYmViMjU3MGQ1NTY0NmI4YWRmMSJdLFsiZWUxNjMwMjZlOWZkNmZlMDE3YzM4ZjA2YTViZTZmYzEyNTQyNGIzNzFjZTI3MDhlN2JmNDQ5MTY5MWU1NzY0YSIsIjFhY2IyNTBmMjU1ZGQ2MWM0M2Q5NGNjYzY3MGQwZjU4ZjQ5YWUzZmExNWI5NjYyM2U1NDMwZGEwYWQ2YzYyYjIiXSxbImIyNjhmNWVmOWFkNTFlNGQ3OGRlM2E3NTBjMmRjODliMWU2MjZkNDM1MDU4Njc5OTk5MzJlNWRiMzNhZjNkODAiLCI1ZjMxMGQ0YjNjOTliOWViYjE5Zjc3ZDQxYzFkZWUwMThjZjBkMzRmZDQxOTE2MTQwMDNlOTQ1YTEyMTZlNDIzIl0sWyJmZjA3ZjMxMThhOWRmMDM1ZTlmYWQ4NWViNmM3YmZlNDJiMDJmMDFjYTk5Y2VlYTNiZjdmZmRiYTkzYzQ3NTBkIiwiNDM4MTM2ZDYwM2U4NThhM2E1YzQ0MGMzOGVjY2JhZGRjMWQyOTQyMTE0ZTJlZGRkNDc0MGQwOThjZWQxZjBkOCJdLFsiOGQ4Yjk4NTVjN2MwNTJhMzQxNDZmZDIwZmZiNjU4YmVhNGI5ZjY5ZTBkODI1ZWJlYzE2ZThjM2NlMmI1MjZhMSIsImNkYjU1OWVlZGMyZDc5ZjkyNmJhZjQ0ZmI4NGVhNGQ0NGJjZjUwZmVlNTFkN2NlYjMwZTJlN2Y0NjMwMzY3NTgiXSxbIjUyZGIwYjUzODRkZmJmMDViZmE5ZDQ3MmQ3YWUyNmRmZTRiODUxY2VjYTkxYjFlYmE1NDI2MzE4MGRhMzJiNjMiLCJjM2I5OTdkMDUwZWU1ZDQyM2ViYWY2NmE2ZGI5ZjU3YjMxODBjOTAyODc1Njc5ZGU5MjRiNjlkODRhN2IzNzUiXSxbImU2MmY5NDkwZDNkNTFkYTYzOTVlZmQyNGU4MDkxOWNjN2QwZjI5YzNmM2ZhNDhjNmZmZjU0M2JlY2JkNDMzNTIiLCI2ZDg5YWQ3YmE0ODc2YjBiMjJjMmNhMjgwYzY4Mjg2MmYzNDJjODU5MWYxZGFmNTE3MGUwN2JmZDljY2FmYTdkIl0sWyI3ZjMwZWEyNDc2YjM5OWI0OTU3NTA5Yzg4Zjc3ZDAxOTFhZmEyZmY1Y2I3YjE0ZmQ2ZDhlN2Q2NWFhYWIxMTkzIiwiY2E1ZWY3ZDRiMjMxYzk0YzNiMTUzODlhNWY2MzExZTlkYWZmN2JiNjdiMTAzZTk4ODBlZjRiZmY2MzdhY2FlYyJdLFsiNTA5OGZmMWUxZDlmMTRmYjQ2YTIxMGZhZGE2YzkwM2ZlZjBmYjdiNGExZGQxZDlhYzYwYTAzNjE4MDBiN2EwMCIsIjk3MzExNDFkODFmYzhmODA4NGQzN2M2ZTc1NDIwMDZiM2VlMWI0MGQ2MGRmZTUzNjJhNWIxMzJmZDE3ZGRjMCJdLFsiMzJiNzhjN2RlOWVlNTEyYTcyODk1YmU2YjljYmVmYTZlMmYzYzRjY2NlNDQ1Yzk2YjlmMmM4MWUyNzc4YWQ1OCIsImVlMTg0OWY1MTNkZjcxZTMyZWZjMzg5NmVlMjgyNjBjNzNiYjgwNTQ3YWUyMjc1YmE0OTcyMzc3OTRjODc1M2MiXSxbImUyY2I3NGZkZGM4ZTlmYmNkMDc2ZWVmMmE3YzcyYjBjZTM3ZDUwZjA4MjY5ZGZjMDc0YjU4MTU1MDU0N2E0ZjciLCJkM2FhMmVkNzFjOWRkMjI0N2E2MmRmMDYyNzM2ZWIwYmFkZGVhOWUzNjEyMmQyYmU4NjQxYWJjYjAwNWNjNGE0Il0sWyI4NDM4NDQ3NTY2ZDRkN2JlZGFkYzI5OTQ5NmFiMzU3NDI2MDA5YTM1ZjIzNWNiMTQxYmUwZDk5Y2QxMGFlM2E4IiwiYzRlMTAyMDkxNjk4MGE0ZGE1ZDAxYWM1ZTZhZDMzMDczNGVmMGQ3OTA2NjMxYzRmMjM5MDQyNmIyZWRkNzkxZiJdLFsiNDE2MmQ0ODhiODk0MDIwMzliNTg0YzZmYzZjMzA4ODcwNTg3ZDljNDZmNjYwYjg3OGFiNjVjODJjNzExZDY3ZSIsIjY3MTYzZTkwMzIzNjI4OWY3NzZmMjJjMjVmYjhhM2FmYzE3MzJmMmI4NGI0ZTk1ZGJkYTQ3YWU1YTA4NTI2NDkiXSxbIjNmYWQzZmE4NGNhZjBmMzRmMGY4OWJmZDJkY2Y1NGZjMTc1ZDc2N2FlYzNlNTA2ODRmM2JhNGE0YmY1ZjY4M2QiLCJjZDFiYzdjYjZjYzQwN2JiMmYwY2E2NDdjNzE4YTczMGNmNzE4NzJlN2QwZDJhNTNmYTIwZWZjZGZlNjE4MjYiXSxbIjY3NGYyNjAwYTMwMDdhMDA1NjhjMWE3Y2UwNWQwODE2YzFmYjg0YmYxMzcwNzk4ZjFjNjk1MzJmYWViMWE4NmIiLCIyOTlkMjFmOTQxM2YzM2IzZWRmNDNiMjU3MDA0NTgwYjcwZGI1N2RhMGIxODIyNTllMDllZWNjNjllMGQzOGE1Il0sWyJkMzJmNGRhNTRhZGU3NGFiYjgxYjgxNWFkMWZiM2IyNjNkODJkNmM2OTI3MTRiY2ZmODdkMjliZDVlZTlmMDhmIiwiZjk0MjllNzM4YjhlNTNiOTY4ZTk5MDE2YzA1OTcwNzc4MmUxNGY0NTM1MzU5ZDU4MmZjNDE2OTEwYjNlZWE4NyJdLFsiMzBlNGU2NzA0MzUzODU1NTZlNTkzNjU3MTM1ODQ1ZDM2ZmJiNjkzMWY3MmIwOGNiMWVkOTU0ZjFlM2NlM2ZmNiIsIjQ2MmY5YmNlNjE5ODk4NjM4NDk5MzUwMTEzYmJjOWIxMGE4NzhkMzVkYTcwNzQwZGM2OTVhNTU5ZWI4OGRiN2IiXSxbImJlMjA2MjAwM2M1MWNjMzAwNDY4MjkwNDMzMGU0ZGVlN2YzZGNkMTBiMDFlNTgwYmYxOTcxYjA0ZDRjYWQyOTciLCI2MjE4OGJjNDlkNjFlNTQyODU3M2Q0OGE3NGUxYzY1NWIxYzYxMDkwOTA1NjgyYTBkNTU1OGVkNzJkY2NiOWJjIl0sWyI5MzE0NDQyM2FjZTM0NTFlZDI5ZTBmYjlhYzJhZjIxMWNiNmU4NGE2MDFkZjU5OTNjNDE5ODU5ZmZmNWRmMDRhIiwiN2MxMGRmYjE2NGMzNDI1ZjVjNzFhM2Y5ZDc5OTIwMzhmMTA2NTIyNGY3MmJiOWQxZDkwMmE2ZDEzMDM3YjQ3YyJdLFsiYjAxNWY4MDQ0ZjVmY2JkY2YyMWNhMjZkNmMzNGZiODE5NzgyOTIwNWM3YjdkMmE3Y2I2NjQxOGMxNTdiMTEyYyIsImFiOGMxZTA4NmQwNGU4MTM3NDRhNjU1YjJkZjhkNWY4M2IzY2RjNmZhYTMwODhjMWQzYWVhMTQ1NGUzYTFkNWYiXSxbImQ1ZTllMWRhNjQ5ZDk3ZDg5ZTQ4NjgxMTdhNDY1YTNhNGY4YTE4ZGU1N2ExNDBkMzZiM2YyYWYzNDFhMjFiNTIiLCI0Y2IwNDQzN2YzOTFlZDczMTExYTEzY2MxZDRkZDBkYjE2OTM0NjVjMjI0MDQ4MGQ4OTU1ZTg1OTJmMjc0NDdhIl0sWyJkM2FlNDEwNDdkZDdjYTA2NWRiZjhlZDc3Yjk5MjQzOTk4MzAwNWNkNzJlMTZkNmY5OTZhNTMxNmQzNjk2NmJiIiwiYmQxYWViMjFhZDIyZWJiMjJhMTBmMDMwMzQxN2M2ZDk2NGY4Y2RkN2RmMGFjYTYxNGIxMGRjMTRkMTI1YWM0NiJdLFsiNDYzZTI3NjNkODg1Zjk1OGZjNjZjZGQyMjgwMGYwYTQ4NzE5N2QwYTgyZTM3N2I0OWY4MGFmODdjODk3YjA2NSIsImJmZWZhY2RiMGU1ZDBmZDdkZjNhMzExYTk0ZGUwNjJiMjZiODBjNjFmYmM5NzUwOGI3OTk5MjY3MWVmN2NhN2YiXSxbIjc5ODVmZGZkMTI3YzA1NjdjNmY1M2VjMWJiNjNlYzMxNThlNTk3YzQwYmZlNzQ3YzgzY2RkZmM5MTA2NDE5MTciLCI2MDNjMTJkYWYzZDk4NjJlZjJiMjVmZTFkZTI4OWFlZDI0ZWQyOTFlMGVjNjcwODcwM2E1YmQ1NjdmMzJlZDAzIl0sWyI3NGExYWQ2YjVmNzZlMzlkYjJkZDI0OTQxMGVhYzdmOTllNzRjNTljYjgzZDJkMGVkNWZmMTU0M2RhNzcwM2U5IiwiY2M2MTU3ZWYxOGM5YzYzY2Q2MTkzZDgzNjMxYmJlYTAwOTNlMDk2ODk0MmU4YzMzZDU3MzdmZDc5MGUwZGIwOCJdLFsiMzA2ODJhNTA3MDMzNzVmNjAyZDQxNjY2NGJhMTliN2ZjOWJhYjQyYzcyNzQ3NDYzYTcxZDA4OTZiMjJmNmRhMyIsIjU1M2UwNGY2YjAxOGI0ZmE2YzhmMzllN2YzMTFkMzE3NjI5MGQwZTBmMTljYTczZjE3NzE0ZDk5NzdhMjJmZjgiXSxbIjllMjE1OGYwZDdjMGQ1ZjI2YzM3OTFlZmVmYTc5NTk3NjU0ZTdhMmIyNDY0ZjUyYjFlZTZjMTM0Nzc2OWVmNTciLCI3MTJmY2RkMWI5MDUzZjA5MDAzYTM0ODFmYTc3NjJlOWZmZDdjOGVmMzVhMzg1MDllMmZiZjI2MjkwMDgzNzMiXSxbIjE3NmUyNjk4OWE0M2M5Y2ZlYmE0MDI5YzIwMjUzOGMyODE3MmU1NjZlM2M0ZmNlNzMyMjg1N2YzYmUzMjdkNjYiLCJlZDhjYzlkMDRiMjllYjg3N2QyNzBiNDg3OGRjNDNjMTlhZWZkMzFmNGVlZTA5ZWU3YjQ3ODM0YzFmYTRiMWMzIl0sWyI3NWQ0NmVmZWEzNzcxZTZlNjhhYmI4OWExM2FkNzQ3ZWNmMTg5MjM5M2RmYzRmMWI3MDA0Nzg4YzUwMzc0ZGE4IiwiOTg1MjM5MGE5OTUwNzY3OWZkMGI4NmZkMmIzOWE4NjhkN2VmYzIyMTUxMzQ2ZTFhM2NhNDcyNjU4NmE2YmVkOCJdLFsiODA5YTIwYzY3ZDY0OTAwZmZiNjk4YzRjODI1ZjZkNWYyMzEwZmIwNDUxYzg2OTM0NWI3MzE5ZjY0NTYwNTcyMSIsIjllOTk0OTgwZDk5MTdlMjJiNzZiMDYxOTI3ZmEwNDE0M2QwOTZjY2M1NDk2M2U2YTVlYmZhNWYzZjhlMjg2YzEiXSxbIjFiMzg5MDNhNDNmN2YxMTRlZDQ1MDBiNGVhYzcwODNmZGVmZWNlMWNmMjljNjM1MjhkNTYzNDQ2Zjk3MmMxODAiLCI0MDM2ZWRjOTMxYTYwYWU4ODkzNTNmNzdmZDUzZGU0YTI3MDhiMjZiNmY1ZGE3MmFkMzM5NDExOWRhZjQwOGY5Il1dfX19LCIuLi8uLi9ub2RlX21vZHVsZXMvZWxsaXB0aWMvbGliL2VsbGlwdGljL3V0aWxzLmpzIihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgdXRpbHM9ZXhwb3J0cyxCTj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYm4uanMvbGliL2JuLmpzIiksbWluQXNzZXJ0PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9taW5pbWFsaXN0aWMtYXNzZXJ0L2luZGV4LmpzIiksbWluVXRpbHM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL21pbmltYWxpc3RpYy1jcnlwdG8tdXRpbHMvbGliL3V0aWxzLmpzIik7dXRpbHMuYXNzZXJ0PW1pbkFzc2VydCx1dGlscy50b0FycmF5PW1pblV0aWxzLnRvQXJyYXksdXRpbHMuemVybzI9bWluVXRpbHMuemVybzIsdXRpbHMudG9IZXg9bWluVXRpbHMudG9IZXgsdXRpbHMuZW5jb2RlPW1pblV0aWxzLmVuY29kZSx1dGlscy5nZXROQUY9ZnVuY3Rpb24gZ2V0TkFGKG51bSx3LGJpdHMpe3ZhciBpLG5hZj1uZXcgQXJyYXkoTWF0aC5tYXgobnVtLmJpdExlbmd0aCgpLGJpdHMpKzEpO2ZvcihpPTA7aTxuYWYubGVuZ3RoO2krPTEpbmFmW2ldPTA7dmFyIHdzPTE8PHcrMSxrPW51bS5jbG9uZSgpO2ZvcihpPTA7aTxuYWYubGVuZ3RoO2krKyl7dmFyIHosbW9kPWsuYW5kbG4od3MtMSk7ay5pc09kZCgpPyh6PW1vZD4od3M+PjEpLTE/KHdzPj4xKS1tb2Q6bW9kLGsuaXN1Ym4oeikpOno9MCxuYWZbaV09eixrLml1c2hybigxKX1yZXR1cm4gbmFmfSx1dGlscy5nZXRKU0Y9ZnVuY3Rpb24gZ2V0SlNGKGsxLGsyKXt2YXIganNmPVtbXSxbXV07azE9azEuY2xvbmUoKSxrMj1rMi5jbG9uZSgpO2Zvcih2YXIgbTgsZDE9MCxkMj0wO2sxLmNtcG4oLWQxKT4wfHxrMi5jbXBuKC1kMik+MDspe3ZhciB1MSx1MixtMTQ9azEuYW5kbG4oMykrZDEmMyxtMjQ9azIuYW5kbG4oMykrZDImMzszPT09bTE0JiYobTE0PS0xKSwzPT09bTI0JiYobTI0PS0xKSx1MT0xJm0xND8zIT09KG04PWsxLmFuZGxuKDcpK2QxJjcpJiY1IT09bTh8fDIhPT1tMjQ/bTE0Oi1tMTQ6MCxqc2ZbMF0ucHVzaCh1MSksdTI9MSZtMjQ/MyE9PShtOD1rMi5hbmRsbig3KStkMiY3KSYmNSE9PW04fHwyIT09bTE0P20yNDotbTI0OjAsanNmWzFdLnB1c2godTIpLDIqZDE9PT11MSsxJiYoZDE9MS1kMSksMipkMj09PXUyKzEmJihkMj0xLWQyKSxrMS5pdXNocm4oMSksazIuaXVzaHJuKDEpfXJldHVybiBqc2Z9LHV0aWxzLmNhY2hlZFByb3BlcnR5PWZ1bmN0aW9uIGNhY2hlZFByb3BlcnR5KG9iaixuYW1lLGNvbXB1dGVyKXt2YXIga2V5PSJfIituYW1lO29iai5wcm90b3R5cGVbbmFtZV09ZnVuY3Rpb24gY2FjaGVkUHJvcGVydHkoKXtyZXR1cm4gdm9pZCAwIT09dGhpc1trZXldP3RoaXNba2V5XTp0aGlzW2tleV09Y29tcHV0ZXIuY2FsbCh0aGlzKX19LHV0aWxzLnBhcnNlQnl0ZXM9ZnVuY3Rpb24gcGFyc2VCeXRlcyhieXRlcyl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBieXRlcz91dGlscy50b0FycmF5KGJ5dGVzLCJoZXgiKTpieXRlc30sdXRpbHMuaW50RnJvbUxFPWZ1bmN0aW9uIGludEZyb21MRShieXRlcyl7cmV0dXJuIG5ldyBCTihieXRlcywiaGV4IiwibGUiKX19LCIuLi8uLi9ub2RlX21vZHVsZXMvZXMtZGVmaW5lLXByb3BlcnR5L2luZGV4LmpzIihtb2R1bGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgJGRlZmluZVByb3BlcnR5PU9iamVjdC5kZWZpbmVQcm9wZXJ0eXx8ITE7aWYoJGRlZmluZVByb3BlcnR5KXRyeXskZGVmaW5lUHJvcGVydHkoe30sImEiLHt2YWx1ZToxfSl9Y2F0Y2goZSl7JGRlZmluZVByb3BlcnR5PSExfW1vZHVsZS5leHBvcnRzPSRkZWZpbmVQcm9wZXJ0eX0sIi4uLy4uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvZXZhbC5qcyIobW9kdWxlKXsidXNlIHN0cmljdCI7bW9kdWxlLmV4cG9ydHM9RXZhbEVycm9yfSwiLi4vLi4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy9pbmRleC5qcyIobW9kdWxlKXsidXNlIHN0cmljdCI7bW9kdWxlLmV4cG9ydHM9RXJyb3J9LCIuLi8uLi9ub2RlX21vZHVsZXMvZXMtZXJyb3JzL3JhbmdlLmpzIihtb2R1bGUpeyJ1c2Ugc3RyaWN0Ijttb2R1bGUuZXhwb3J0cz1SYW5nZUVycm9yfSwiLi4vLi4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy9yZWYuanMiKG1vZHVsZSl7InVzZSBzdHJpY3QiO21vZHVsZS5leHBvcnRzPVJlZmVyZW5jZUVycm9yfSwiLi4vLi4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy9zeW50YXguanMiKG1vZHVsZSl7InVzZSBzdHJpY3QiO21vZHVsZS5leHBvcnRzPVN5bnRheEVycm9yfSwiLi4vLi4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy90eXBlLmpzIihtb2R1bGUpeyJ1c2Ugc3RyaWN0Ijttb2R1bGUuZXhwb3J0cz1UeXBlRXJyb3J9LCIuLi8uLi9ub2RlX21vZHVsZXMvZXMtZXJyb3JzL3VyaS5qcyIobW9kdWxlKXsidXNlIHN0cmljdCI7bW9kdWxlLmV4cG9ydHM9VVJJRXJyb3J9LCIuLi8uLi9ub2RlX21vZHVsZXMvZXMtb2JqZWN0LWF0b21zL2luZGV4LmpzIihtb2R1bGUpeyJ1c2Ugc3RyaWN0Ijttb2R1bGUuZXhwb3J0cz1PYmplY3R9LCIuLi8uLi9ub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIobW9kdWxlKXsidXNlIHN0cmljdCI7dmFyIFJlZmxlY3RPd25LZXlzLFI9Im9iamVjdCI9PXR5cGVvZiBSZWZsZWN0P1JlZmxlY3Q6bnVsbCxSZWZsZWN0QXBwbHk9UiYmImZ1bmN0aW9uIj09dHlwZW9mIFIuYXBwbHk/Ui5hcHBseTpmdW5jdGlvbiBSZWZsZWN0QXBwbHkodGFyZ2V0LHJlY2VpdmVyLGFyZ3Mpe3JldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbCh0YXJnZXQscmVjZWl2ZXIsYXJncyl9O1JlZmxlY3RPd25LZXlzPVImJiJmdW5jdGlvbiI9PXR5cGVvZiBSLm93bktleXM/Ui5vd25LZXlzOk9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM/ZnVuY3Rpb24gUmVmbGVjdE93bktleXModGFyZ2V0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KS5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0YXJnZXQpKX06ZnVuY3Rpb24gUmVmbGVjdE93bktleXModGFyZ2V0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KX07dmFyIE51bWJlcklzTmFOPU51bWJlci5pc05hTnx8ZnVuY3Rpb24gTnVtYmVySXNOYU4odmFsdWUpe3JldHVybiB2YWx1ZSE9dmFsdWV9O2Z1bmN0aW9uIEV2ZW50RW1pdHRlcigpe0V2ZW50RW1pdHRlci5pbml0LmNhbGwodGhpcyl9bW9kdWxlLmV4cG9ydHM9RXZlbnRFbWl0dGVyLG1vZHVsZS5leHBvcnRzLm9uY2U9ZnVuY3Rpb24gb25jZShlbWl0dGVyLG5hbWUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLHJlamVjdCl7ZnVuY3Rpb24gZXJyb3JMaXN0ZW5lcihlcnIpe2VtaXR0ZXIucmVtb3ZlTGlzdGVuZXIobmFtZSxyZXNvbHZlcikscmVqZWN0KGVycil9ZnVuY3Rpb24gcmVzb2x2ZXIoKXsiZnVuY3Rpb24iPT10eXBlb2YgZW1pdHRlci5yZW1vdmVMaXN0ZW5lciYmZW1pdHRlci5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLGVycm9yTGlzdGVuZXIpLHJlc29sdmUoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKX1ldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlcixuYW1lLHJlc29sdmVyLHtvbmNlOiEwfSksImVycm9yIiE9PW5hbWUmJmZ1bmN0aW9uIGFkZEVycm9ySGFuZGxlcklmRXZlbnRFbWl0dGVyKGVtaXR0ZXIsaGFuZGxlcixmbGFncyl7ImZ1bmN0aW9uIj09dHlwZW9mIGVtaXR0ZXIub24mJmV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCJlcnJvciIsaGFuZGxlcixmbGFncyl9KGVtaXR0ZXIsZXJyb3JMaXN0ZW5lcix7b25jZTohMH0pfSl9LEV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXI9RXZlbnRFbWl0dGVyLEV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cz12b2lkIDAsRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzQ291bnQ9MCxFdmVudEVtaXR0ZXIucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwO3ZhciBkZWZhdWx0TWF4TGlzdGVuZXJzPTEwO2Z1bmN0aW9uIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBsaXN0ZW5lcil0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2YgbGlzdGVuZXIpfWZ1bmN0aW9uIF9nZXRNYXhMaXN0ZW5lcnModGhhdCl7cmV0dXJuIHZvaWQgMD09PXRoYXQuX21heExpc3RlbmVycz9FdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVyczp0aGF0Ll9tYXhMaXN0ZW5lcnN9ZnVuY3Rpb24gX2FkZExpc3RlbmVyKHRhcmdldCx0eXBlLGxpc3RlbmVyLHByZXBlbmQpe3ZhciBtLGV2ZW50cyxleGlzdGluZztpZihjaGVja0xpc3RlbmVyKGxpc3RlbmVyKSx2b2lkIDA9PT0oZXZlbnRzPXRhcmdldC5fZXZlbnRzKT8oZXZlbnRzPXRhcmdldC5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksdGFyZ2V0Ll9ldmVudHNDb3VudD0wKToodm9pZCAwIT09ZXZlbnRzLm5ld0xpc3RlbmVyJiYodGFyZ2V0LmVtaXQoIm5ld0xpc3RlbmVyIix0eXBlLGxpc3RlbmVyLmxpc3RlbmVyP2xpc3RlbmVyLmxpc3RlbmVyOmxpc3RlbmVyKSxldmVudHM9dGFyZ2V0Ll9ldmVudHMpLGV4aXN0aW5nPWV2ZW50c1t0eXBlXSksdm9pZCAwPT09ZXhpc3RpbmcpZXhpc3Rpbmc9ZXZlbnRzW3R5cGVdPWxpc3RlbmVyLCsrdGFyZ2V0Ll9ldmVudHNDb3VudDtlbHNlIGlmKCJmdW5jdGlvbiI9PXR5cGVvZiBleGlzdGluZz9leGlzdGluZz1ldmVudHNbdHlwZV09cHJlcGVuZD9bbGlzdGVuZXIsZXhpc3RpbmddOltleGlzdGluZyxsaXN0ZW5lcl06cHJlcGVuZD9leGlzdGluZy51bnNoaWZ0KGxpc3RlbmVyKTpleGlzdGluZy5wdXNoKGxpc3RlbmVyKSwobT1fZ2V0TWF4TGlzdGVuZXJzKHRhcmdldCkpPjAmJmV4aXN0aW5nLmxlbmd0aD5tJiYhZXhpc3Rpbmcud2FybmVkKXtleGlzdGluZy53YXJuZWQ9ITA7dmFyIHc9bmV3IEVycm9yKCJQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICIrZXhpc3RpbmcubGVuZ3RoKyIgIitTdHJpbmcodHlwZSkrIiBsaXN0ZW5lcnMgYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvIGluY3JlYXNlIGxpbWl0Iik7dy5uYW1lPSJNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmciLHcuZW1pdHRlcj10YXJnZXQsdy50eXBlPXR5cGUsdy5jb3VudD1leGlzdGluZy5sZW5ndGgsZnVuY3Rpb24gUHJvY2Vzc0VtaXRXYXJuaW5nKHdhcm5pbmcpe2NvbnNvbGUmJmNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKHdhcm5pbmcpfSh3KX1yZXR1cm4gdGFyZ2V0fWZ1bmN0aW9uIG9uY2VXcmFwcGVyKCl7aWYoIXRoaXMuZmlyZWQpcmV0dXJuIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSx0aGlzLndyYXBGbiksdGhpcy5maXJlZD0hMCwwPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLmxpc3RlbmVyLmNhbGwodGhpcy50YXJnZXQpOnRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsYXJndW1lbnRzKX1mdW5jdGlvbiBfb25jZVdyYXAodGFyZ2V0LHR5cGUsbGlzdGVuZXIpe3ZhciBzdGF0ZT17ZmlyZWQ6ITEsd3JhcEZuOnZvaWQgMCx0YXJnZXQsdHlwZSxsaXN0ZW5lcn0sd3JhcHBlZD1vbmNlV3JhcHBlci5iaW5kKHN0YXRlKTtyZXR1cm4gd3JhcHBlZC5saXN0ZW5lcj1saXN0ZW5lcixzdGF0ZS53cmFwRm49d3JhcHBlZCx3cmFwcGVkfWZ1bmN0aW9uIF9saXN0ZW5lcnModGFyZ2V0LHR5cGUsdW53cmFwKXt2YXIgZXZlbnRzPXRhcmdldC5fZXZlbnRzO2lmKHZvaWQgMD09PWV2ZW50cylyZXR1cm5bXTt2YXIgZXZsaXN0ZW5lcj1ldmVudHNbdHlwZV07cmV0dXJuIHZvaWQgMD09PWV2bGlzdGVuZXI/W106ImZ1bmN0aW9uIj09dHlwZW9mIGV2bGlzdGVuZXI/dW53cmFwP1tldmxpc3RlbmVyLmxpc3RlbmVyfHxldmxpc3RlbmVyXTpbZXZsaXN0ZW5lcl06dW53cmFwP2Z1bmN0aW9uIHVud3JhcExpc3RlbmVycyhhcnIpe2Zvcih2YXIgcmV0PW5ldyBBcnJheShhcnIubGVuZ3RoKSxpPTA7aTxyZXQubGVuZ3RoOysraSlyZXRbaV09YXJyW2ldLmxpc3RlbmVyfHxhcnJbaV07cmV0dXJuIHJldH0oZXZsaXN0ZW5lcik6YXJyYXlDbG9uZShldmxpc3RlbmVyLGV2bGlzdGVuZXIubGVuZ3RoKX1mdW5jdGlvbiBsaXN0ZW5lckNvdW50KHR5cGUpe3ZhciBldmVudHM9dGhpcy5fZXZlbnRzO2lmKHZvaWQgMCE9PWV2ZW50cyl7dmFyIGV2bGlzdGVuZXI9ZXZlbnRzW3R5cGVdO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBldmxpc3RlbmVyKXJldHVybiAxO2lmKHZvaWQgMCE9PWV2bGlzdGVuZXIpcmV0dXJuIGV2bGlzdGVuZXIubGVuZ3RofXJldHVybiAwfWZ1bmN0aW9uIGFycmF5Q2xvbmUoYXJyLG4pe2Zvcih2YXIgY29weT1uZXcgQXJyYXkobiksaT0wO2k8bjsrK2kpY29weVtpXT1hcnJbaV07cmV0dXJuIGNvcHl9ZnVuY3Rpb24gZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsbmFtZSxsaXN0ZW5lcixmbGFncyl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGVtaXR0ZXIub24pZmxhZ3Mub25jZT9lbWl0dGVyLm9uY2UobmFtZSxsaXN0ZW5lcik6ZW1pdHRlci5vbihuYW1lLGxpc3RlbmVyKTtlbHNle2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIpdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJlbWl0dGVyIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRXZlbnRFbWl0dGVyLiBSZWNlaXZlZCB0eXBlICcrdHlwZW9mIGVtaXR0ZXIpO2VtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLGZ1bmN0aW9uIHdyYXBMaXN0ZW5lcihhcmcpe2ZsYWdzLm9uY2UmJmVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLHdyYXBMaXN0ZW5lciksbGlzdGVuZXIoYXJnKX0pfX1PYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRFbWl0dGVyLCJkZWZhdWx0TWF4TGlzdGVuZXJzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZGVmYXVsdE1heExpc3RlbmVyc30sc2V0OmZ1bmN0aW9uKGFyZyl7aWYoIm51bWJlciIhPXR5cGVvZiBhcmd8fGFyZzwwfHxOdW1iZXJJc05hTihhcmcpKXRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgImRlZmF1bHRNYXhMaXN0ZW5lcnMiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcrYXJnKyIuIik7ZGVmYXVsdE1heExpc3RlbmVycz1hcmd9fSksRXZlbnRFbWl0dGVyLmluaXQ9ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLl9ldmVudHMmJnRoaXMuX2V2ZW50cyE9PU9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzfHwodGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fZXZlbnRzQ291bnQ9MCksdGhpcy5fbWF4TGlzdGVuZXJzPXRoaXMuX21heExpc3RlbmVyc3x8dm9pZCAwfSxFdmVudEVtaXR0ZXIucHJvdG90eXBlLnNldE1heExpc3RlbmVycz1mdW5jdGlvbiBzZXRNYXhMaXN0ZW5lcnMobil7aWYoIm51bWJlciIhPXR5cGVvZiBufHxuPDB8fE51bWJlcklzTmFOKG4pKXRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgIm4iIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcrbisiLiIpO3JldHVybiB0aGlzLl9tYXhMaXN0ZW5lcnM9bix0aGlzfSxFdmVudEVtaXR0ZXIucHJvdG90eXBlLmdldE1heExpc3RlbmVycz1mdW5jdGlvbiBnZXRNYXhMaXN0ZW5lcnMoKXtyZXR1cm4gX2dldE1heExpc3RlbmVycyh0aGlzKX0sRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uIGVtaXQodHlwZSl7Zm9yKHZhciBhcmdzPVtdLGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKWFyZ3MucHVzaChhcmd1bWVudHNbaV0pO3ZhciBkb0Vycm9yPSJlcnJvciI9PT10eXBlLGV2ZW50cz10aGlzLl9ldmVudHM7aWYodm9pZCAwIT09ZXZlbnRzKWRvRXJyb3I9ZG9FcnJvciYmdm9pZCAwPT09ZXZlbnRzLmVycm9yO2Vsc2UgaWYoIWRvRXJyb3IpcmV0dXJuITE7aWYoZG9FcnJvcil7dmFyIGVyO2lmKGFyZ3MubGVuZ3RoPjAmJihlcj1hcmdzWzBdKSxlciBpbnN0YW5jZW9mIEVycm9yKXRocm93IGVyO3ZhciBlcnI9bmV3IEVycm9yKCJVbmhhbmRsZWQgZXJyb3IuIisoZXI/IiAoIitlci5tZXNzYWdlKyIpIjoiIikpO3Rocm93IGVyci5jb250ZXh0PWVyLGVycn12YXIgaGFuZGxlcj1ldmVudHNbdHlwZV07aWYodm9pZCAwPT09aGFuZGxlcilyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgaGFuZGxlcilSZWZsZWN0QXBwbHkoaGFuZGxlcix0aGlzLGFyZ3MpO2Vsc2V7dmFyIGxlbj1oYW5kbGVyLmxlbmd0aCxsaXN0ZW5lcnM9YXJyYXlDbG9uZShoYW5kbGVyLGxlbik7Zm9yKGk9MDtpPGxlbjsrK2kpUmVmbGVjdEFwcGx5KGxpc3RlbmVyc1tpXSx0aGlzLGFyZ3MpfXJldHVybiEwfSxFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyPWZ1bmN0aW9uIGFkZExpc3RlbmVyKHR5cGUsbGlzdGVuZXIpe3JldHVybiBfYWRkTGlzdGVuZXIodGhpcyx0eXBlLGxpc3RlbmVyLCExKX0sRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbj1FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyLEV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyPWZ1bmN0aW9uIHByZXBlbmRMaXN0ZW5lcih0eXBlLGxpc3RlbmVyKXtyZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsdHlwZSxsaXN0ZW5lciwhMCl9LEV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZT1mdW5jdGlvbiBvbmNlKHR5cGUsbGlzdGVuZXIpe3JldHVybiBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKSx0aGlzLm9uKHR5cGUsX29uY2VXcmFwKHRoaXMsdHlwZSxsaXN0ZW5lcikpLHRoaXN9LEV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lcj1mdW5jdGlvbiBwcmVwZW5kT25jZUxpc3RlbmVyKHR5cGUsbGlzdGVuZXIpe3JldHVybiBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKSx0aGlzLnByZXBlbmRMaXN0ZW5lcih0eXBlLF9vbmNlV3JhcCh0aGlzLHR5cGUsbGlzdGVuZXIpKSx0aGlzfSxFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKHR5cGUsbGlzdGVuZXIpe3ZhciBsaXN0LGV2ZW50cyxwb3NpdGlvbixpLG9yaWdpbmFsTGlzdGVuZXI7aWYoY2hlY2tMaXN0ZW5lcihsaXN0ZW5lciksdm9pZCAwPT09KGV2ZW50cz10aGlzLl9ldmVudHMpKXJldHVybiB0aGlzO2lmKHZvaWQgMD09PShsaXN0PWV2ZW50c1t0eXBlXSkpcmV0dXJuIHRoaXM7aWYobGlzdD09PWxpc3RlbmVyfHxsaXN0Lmxpc3RlbmVyPT09bGlzdGVuZXIpMD09PS0tdGhpcy5fZXZlbnRzQ291bnQ/dGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCk6KGRlbGV0ZSBldmVudHNbdHlwZV0sZXZlbnRzLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIix0eXBlLGxpc3QubGlzdGVuZXJ8fGxpc3RlbmVyKSk7ZWxzZSBpZigiZnVuY3Rpb24iIT10eXBlb2YgbGlzdCl7Zm9yKHBvc2l0aW9uPS0xLGk9bGlzdC5sZW5ndGgtMTtpPj0wO2ktLSlpZihsaXN0W2ldPT09bGlzdGVuZXJ8fGxpc3RbaV0ubGlzdGVuZXI9PT1saXN0ZW5lcil7b3JpZ2luYWxMaXN0ZW5lcj1saXN0W2ldLmxpc3RlbmVyLHBvc2l0aW9uPWk7YnJlYWt9aWYocG9zaXRpb248MClyZXR1cm4gdGhpczswPT09cG9zaXRpb24/bGlzdC5zaGlmdCgpOmZ1bmN0aW9uIHNwbGljZU9uZShsaXN0LGluZGV4KXtmb3IoO2luZGV4KzE8bGlzdC5sZW5ndGg7aW5kZXgrKylsaXN0W2luZGV4XT1saXN0W2luZGV4KzFdO2xpc3QucG9wKCl9KGxpc3QscG9zaXRpb24pLDE9PT1saXN0Lmxlbmd0aCYmKGV2ZW50c1t0eXBlXT1saXN0WzBdKSx2b2lkIDAhPT1ldmVudHMucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLHR5cGUsb3JpZ2luYWxMaXN0ZW5lcnx8bGlzdGVuZXIpfXJldHVybiB0aGlzfSxFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZj1FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyLEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycyh0eXBlKXt2YXIgbGlzdGVuZXJzLGV2ZW50cyxpO2lmKHZvaWQgMD09PShldmVudHM9dGhpcy5fZXZlbnRzKSlyZXR1cm4gdGhpcztpZih2b2lkIDA9PT1ldmVudHMucmVtb3ZlTGlzdGVuZXIpcmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RoPyh0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wKTp2b2lkIDAhPT1ldmVudHNbdHlwZV0mJigwPT09LS10aGlzLl9ldmVudHNDb3VudD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTpkZWxldGUgZXZlbnRzW3R5cGVdKSx0aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXt2YXIga2V5LGtleXM9T2JqZWN0LmtleXMoZXZlbnRzKTtmb3IoaT0wO2k8a2V5cy5sZW5ndGg7KytpKSJyZW1vdmVMaXN0ZW5lciIhPT0oa2V5PWtleXNbaV0pJiZ0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhrZXkpO3JldHVybiB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygicmVtb3ZlTGlzdGVuZXIiKSx0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wLHRoaXN9aWYoImZ1bmN0aW9uIj09dHlwZW9mKGxpc3RlbmVycz1ldmVudHNbdHlwZV0pKXRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSxsaXN0ZW5lcnMpO2Vsc2UgaWYodm9pZCAwIT09bGlzdGVuZXJzKWZvcihpPWxpc3RlbmVycy5sZW5ndGgtMTtpPj0wO2ktLSl0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsbGlzdGVuZXJzW2ldKTtyZXR1cm4gdGhpc30sRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnM9ZnVuY3Rpb24gbGlzdGVuZXJzKHR5cGUpe3JldHVybiBfbGlzdGVuZXJzKHRoaXMsdHlwZSwhMCl9LEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmF3TGlzdGVuZXJzPWZ1bmN0aW9uIHJhd0xpc3RlbmVycyh0eXBlKXtyZXR1cm4gX2xpc3RlbmVycyh0aGlzLHR5cGUsITEpfSxFdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudD1mdW5jdGlvbihlbWl0dGVyLHR5cGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlbWl0dGVyLmxpc3RlbmVyQ291bnQ/ZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpOmxpc3RlbmVyQ291bnQuY2FsbChlbWl0dGVyLHR5cGUpfSxFdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQ9bGlzdGVuZXJDb3VudCxFdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXM9ZnVuY3Rpb24gZXZlbnROYW1lcygpe3JldHVybiB0aGlzLl9ldmVudHNDb3VudD4wP1JlZmxlY3RPd25LZXlzKHRoaXMuX2V2ZW50cyk6W119fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2V2cF9ieXRlc3Rva2V5L2luZGV4LmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pe3ZhciBCdWZmZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3NhZmUtYnVmZmVyL2luZGV4LmpzIikuQnVmZmVyLE1ENT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbWQ1LmpzL2luZGV4LmpzIik7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24gRVZQX0J5dGVzVG9LZXkocGFzc3dvcmQsc2FsdCxrZXlCaXRzLGl2TGVuKXtpZihCdWZmZXIuaXNCdWZmZXIocGFzc3dvcmQpfHwocGFzc3dvcmQ9QnVmZmVyLmZyb20ocGFzc3dvcmQsImJpbmFyeSIpKSxzYWx0JiYoQnVmZmVyLmlzQnVmZmVyKHNhbHQpfHwoc2FsdD1CdWZmZXIuZnJvbShzYWx0LCJiaW5hcnkiKSksOCE9PXNhbHQubGVuZ3RoKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic2FsdCBzaG91bGQgYmUgQnVmZmVyIHdpdGggOCBieXRlIGxlbmd0aCIpO2Zvcih2YXIga2V5TGVuPWtleUJpdHMvOCxrZXk9QnVmZmVyLmFsbG9jKGtleUxlbiksaXY9QnVmZmVyLmFsbG9jKGl2TGVufHwwKSx0bXA9QnVmZmVyLmFsbG9jKDApO2tleUxlbj4wfHxpdkxlbj4wOyl7dmFyIGhhc2g9bmV3IE1ENTtoYXNoLnVwZGF0ZSh0bXApLGhhc2gudXBkYXRlKHBhc3N3b3JkKSxzYWx0JiZoYXNoLnVwZGF0ZShzYWx0KSx0bXA9aGFzaC5kaWdlc3QoKTt2YXIgdXNlZD0wO2lmKGtleUxlbj4wKXt2YXIga2V5U3RhcnQ9a2V5Lmxlbmd0aC1rZXlMZW47dXNlZD1NYXRoLm1pbihrZXlMZW4sdG1wLmxlbmd0aCksdG1wLmNvcHkoa2V5LGtleVN0YXJ0LDAsdXNlZCksa2V5TGVuLT11c2VkfWlmKHVzZWQ8dG1wLmxlbmd0aCYmaXZMZW4+MCl7dmFyIGl2U3RhcnQ9aXYubGVuZ3RoLWl2TGVuLGxlbmd0aD1NYXRoLm1pbihpdkxlbix0bXAubGVuZ3RoLXVzZWQpO3RtcC5jb3B5KGl2LGl2U3RhcnQsdXNlZCx1c2VkK2xlbmd0aCksaXZMZW4tPWxlbmd0aH19cmV0dXJuIHRtcC5maWxsKDApLHtrZXksaXZ9fX0sIi4uLy4uL25vZGVfbW9kdWxlcy9mb3ItZWFjaC9pbmRleC5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIGlzQ2FsbGFibGU9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2lzLWNhbGxhYmxlL2luZGV4LmpzIiksdG9TdHI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxoYXNPd25Qcm9wZXJ0eT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uIGZvckVhY2gobGlzdCxpdGVyYXRvcix0aGlzQXJnKXtpZighaXNDYWxsYWJsZShpdGVyYXRvcikpdGhyb3cgbmV3IFR5cGVFcnJvcigiaXRlcmF0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uIik7dmFyIHJlY2VpdmVyO2FyZ3VtZW50cy5sZW5ndGg+PTMmJihyZWNlaXZlcj10aGlzQXJnKSxmdW5jdGlvbiBpc0FycmF5KHgpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT10b1N0ci5jYWxsKHgpfShsaXN0KT9mdW5jdGlvbiBmb3JFYWNoQXJyYXkoYXJyYXksaXRlcmF0b3IscmVjZWl2ZXIpe2Zvcih2YXIgaT0wLGxlbj1hcnJheS5sZW5ndGg7aTxsZW47aSsrKWhhc093blByb3BlcnR5LmNhbGwoYXJyYXksaSkmJihudWxsPT1yZWNlaXZlcj9pdGVyYXRvcihhcnJheVtpXSxpLGFycmF5KTppdGVyYXRvci5jYWxsKHJlY2VpdmVyLGFycmF5W2ldLGksYXJyYXkpKX0obGlzdCxpdGVyYXRvcixyZWNlaXZlcik6InN0cmluZyI9PXR5cGVvZiBsaXN0P2Z1bmN0aW9uIGZvckVhY2hTdHJpbmcoc3RyaW5nLGl0ZXJhdG9yLHJlY2VpdmVyKXtmb3IodmFyIGk9MCxsZW49c3RyaW5nLmxlbmd0aDtpPGxlbjtpKyspbnVsbD09cmVjZWl2ZXI/aXRlcmF0b3Ioc3RyaW5nLmNoYXJBdChpKSxpLHN0cmluZyk6aXRlcmF0b3IuY2FsbChyZWNlaXZlcixzdHJpbmcuY2hhckF0KGkpLGksc3RyaW5nKX0obGlzdCxpdGVyYXRvcixyZWNlaXZlcik6ZnVuY3Rpb24gZm9yRWFjaE9iamVjdChvYmplY3QsaXRlcmF0b3IscmVjZWl2ZXIpe2Zvcih2YXIgayBpbiBvYmplY3QpaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsaykmJihudWxsPT1yZWNlaXZlcj9pdGVyYXRvcihvYmplY3Rba10sayxvYmplY3QpOml0ZXJhdG9yLmNhbGwocmVjZWl2ZXIsb2JqZWN0W2tdLGssb2JqZWN0KSl9KGxpc3QsaXRlcmF0b3IscmVjZWl2ZXIpfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9mdW5jdGlvbi1iaW5kL2ltcGxlbWVudGF0aW9uLmpzIihtb2R1bGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgdG9TdHI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxtYXg9TWF0aC5tYXgsY29uY2F0dHk9ZnVuY3Rpb24gY29uY2F0dHkoYSxiKXtmb3IodmFyIGFycj1bXSxpPTA7aTxhLmxlbmd0aDtpKz0xKWFycltpXT1hW2ldO2Zvcih2YXIgaj0wO2o8Yi5sZW5ndGg7ais9MSlhcnJbaithLmxlbmd0aF09YltqXTtyZXR1cm4gYXJyfTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbiBiaW5kKHRoYXQpe3ZhciB0YXJnZXQ9dGhpcztpZigiZnVuY3Rpb24iIT10eXBlb2YgdGFyZ2V0fHwiW29iamVjdCBGdW5jdGlvbl0iIT09dG9TdHIuYXBwbHkodGFyZ2V0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbi5wcm90b3R5cGUuYmluZCBjYWxsZWQgb24gaW5jb21wYXRpYmxlICIrdGFyZ2V0KTtmb3IodmFyIGJvdW5kLGFyZ3M9ZnVuY3Rpb24gc2xpY3koYXJyTGlrZSxvZmZzZXQpe2Zvcih2YXIgYXJyPVtdLGk9b2Zmc2V0fHwwLGo9MDtpPGFyckxpa2UubGVuZ3RoO2krPTEsais9MSlhcnJbal09YXJyTGlrZVtpXTtyZXR1cm4gYXJyfShhcmd1bWVudHMsMSksYm91bmRMZW5ndGg9bWF4KDAsdGFyZ2V0Lmxlbmd0aC1hcmdzLmxlbmd0aCksYm91bmRBcmdzPVtdLGk9MDtpPGJvdW5kTGVuZ3RoO2krKylib3VuZEFyZ3NbaV09IiQiK2k7aWYoYm91bmQ9RnVuY3Rpb24oImJpbmRlciIsInJldHVybiBmdW5jdGlvbiAoIitmdW5jdGlvbihhcnIsam9pbmVyKXtmb3IodmFyIHN0cj0iIixpPTA7aTxhcnIubGVuZ3RoO2krPTEpc3RyKz1hcnJbaV0saSsxPGFyci5sZW5ndGgmJihzdHIrPWpvaW5lcik7cmV0dXJuIHN0cn0oYm91bmRBcmdzLCIsIikrIil7IHJldHVybiBiaW5kZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpOyB9IikoZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2YgYm91bmQpe3ZhciByZXN1bHQ9dGFyZ2V0LmFwcGx5KHRoaXMsY29uY2F0dHkoYXJncyxhcmd1bWVudHMpKTtyZXR1cm4gT2JqZWN0KHJlc3VsdCk9PT1yZXN1bHQ/cmVzdWx0OnRoaXN9cmV0dXJuIHRhcmdldC5hcHBseSh0aGF0LGNvbmNhdHR5KGFyZ3MsYXJndW1lbnRzKSl9KSx0YXJnZXQucHJvdG90eXBlKXt2YXIgRW1wdHk9ZnVuY3Rpb24gRW1wdHkoKXt9O0VtcHR5LnByb3RvdHlwZT10YXJnZXQucHJvdG90eXBlLGJvdW5kLnByb3RvdHlwZT1uZXcgRW1wdHksRW1wdHkucHJvdG90eXBlPW51bGx9cmV0dXJuIGJvdW5kfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9mdW5jdGlvbi1iaW5kL2luZGV4LmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgaW1wbGVtZW50YXRpb249X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2Z1bmN0aW9uLWJpbmQvaW1wbGVtZW50YXRpb24uanMiKTttb2R1bGUuZXhwb3J0cz1GdW5jdGlvbi5wcm90b3R5cGUuYmluZHx8aW1wbGVtZW50YXRpb259LCIuLi8uLi9ub2RlX21vZHVsZXMvZ2VuZXJhdG9yLWZ1bmN0aW9uL2luZGV4LmpzIihtb2R1bGUpeyJ1c2Ugc3RyaWN0Ijtjb25zdCBjYWNoZWQ9ZnVuY3Rpb24qKCl7fS5jb25zdHJ1Y3Rvcjttb2R1bGUuZXhwb3J0cz0oKT0+Y2FjaGVkfSwiLi4vLi4vbm9kZV9tb2R1bGVzL2dldC1pbnRyaW5zaWMvaW5kZXguanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciAkT2JqZWN0PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9lcy1vYmplY3QtYXRvbXMvaW5kZXguanMiKSwkRXJyb3I9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy9pbmRleC5qcyIpLCRFdmFsRXJyb3I9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy9ldmFsLmpzIiksJFJhbmdlRXJyb3I9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy9yYW5nZS5qcyIpLCRSZWZlcmVuY2VFcnJvcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZXMtZXJyb3JzL3JlZi5qcyIpLCRTeW50YXhFcnJvcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZXMtZXJyb3JzL3N5bnRheC5qcyIpLCRUeXBlRXJyb3I9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy90eXBlLmpzIiksJFVSSUVycm9yPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvdXJpLmpzIiksYWJzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9tYXRoLWludHJpbnNpY3MvYWJzLmpzIiksZmxvb3I9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL21hdGgtaW50cmluc2ljcy9mbG9vci5qcyIpLG1heD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbWF0aC1pbnRyaW5zaWNzL21heC5qcyIpLG1pbj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbWF0aC1pbnRyaW5zaWNzL21pbi5qcyIpLHBvdz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbWF0aC1pbnRyaW5zaWNzL3Bvdy5qcyIpLHJvdW5kPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9tYXRoLWludHJpbnNpY3Mvcm91bmQuanMiKSxzaWduPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9tYXRoLWludHJpbnNpY3Mvc2lnbi5qcyIpLCRGdW5jdGlvbj1GdW5jdGlvbixnZXRFdmFsbGVkQ29uc3RydWN0b3I9ZnVuY3Rpb24oZXhwcmVzc2lvblN5bnRheCl7dHJ5e3JldHVybiAkRnVuY3Rpb24oJyJ1c2Ugc3RyaWN0IjsgcmV0dXJuICgnK2V4cHJlc3Npb25TeW50YXgrIikuY29uc3RydWN0b3I7IikoKX1jYXRjaChlKXt9fSwkZ09QRD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZ29wZC9pbmRleC5qcyIpLCRkZWZpbmVQcm9wZXJ0eT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZXMtZGVmaW5lLXByb3BlcnR5L2luZGV4LmpzIiksdGhyb3dUeXBlRXJyb3I9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgJFR5cGVFcnJvcn0sVGhyb3dUeXBlRXJyb3I9JGdPUEQ/ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIHRocm93VHlwZUVycm9yfWNhdGNoKGNhbGxlZVRocm93cyl7dHJ5e3JldHVybiAkZ09QRChhcmd1bWVudHMsImNhbGxlZSIpLmdldH1jYXRjaChnT1BEdGhyb3dzKXtyZXR1cm4gdGhyb3dUeXBlRXJyb3J9fX0oKTp0aHJvd1R5cGVFcnJvcixoYXNTeW1ib2xzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9pbmRleC5qcyIpKCksZ2V0UHJvdG89X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2dldC1wcm90by9pbmRleC5qcyIpLCRPYmplY3RHUE89X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2dldC1wcm90by9PYmplY3QuZ2V0UHJvdG90eXBlT2YuanMiKSwkUmVmbGVjdEdQTz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZ2V0LXByb3RvL1JlZmxlY3QuZ2V0UHJvdG90eXBlT2YuanMiKSwkYXBwbHk9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2NhbGwtYmluZC1hcHBseS1oZWxwZXJzL2Z1bmN0aW9uQXBwbHkuanMiKSwkY2FsbD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kLWFwcGx5LWhlbHBlcnMvZnVuY3Rpb25DYWxsLmpzIiksbmVlZHNFdmFsPXt9LFR5cGVkQXJyYXk9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5JiZnZXRQcm90bz9nZXRQcm90byhVaW50OEFycmF5KTp2b2lkIDAsSU5UUklOU0lDUz17X19wcm90b19fOm51bGwsIiVBZ2dyZWdhdGVFcnJvciUiOiJ1bmRlZmluZWQiPT10eXBlb2YgQWdncmVnYXRlRXJyb3I/dm9pZCAwOkFnZ3JlZ2F0ZUVycm9yLCIlQXJyYXklIjpBcnJheSwiJUFycmF5QnVmZmVyJSI6InVuZGVmaW5lZCI9PXR5cGVvZiBBcnJheUJ1ZmZlcj92b2lkIDA6QXJyYXlCdWZmZXIsIiVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJSI6aGFzU3ltYm9scyYmZ2V0UHJvdG8/Z2V0UHJvdG8oW11bU3ltYm9sLml0ZXJhdG9yXSgpKTp2b2lkIDAsIiVBc3luY0Zyb21TeW5jSXRlcmF0b3JQcm90b3R5cGUlIjp2b2lkIDAsIiVBc3luY0Z1bmN0aW9uJSI6bmVlZHNFdmFsLCIlQXN5bmNHZW5lcmF0b3IlIjpuZWVkc0V2YWwsIiVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJSI6bmVlZHNFdmFsLCIlQXN5bmNJdGVyYXRvclByb3RvdHlwZSUiOm5lZWRzRXZhbCwiJUF0b21pY3MlIjoidW5kZWZpbmVkIj09dHlwZW9mIEF0b21pY3M/dm9pZCAwOkF0b21pY3MsIiVCaWdJbnQlIjoidW5kZWZpbmVkIj09dHlwZW9mIEJpZ0ludD92b2lkIDA6QmlnSW50LCIlQmlnSW50NjRBcnJheSUiOiJ1bmRlZmluZWQiPT10eXBlb2YgQmlnSW50NjRBcnJheT92b2lkIDA6QmlnSW50NjRBcnJheSwiJUJpZ1VpbnQ2NEFycmF5JSI6InVuZGVmaW5lZCI9PXR5cGVvZiBCaWdVaW50NjRBcnJheT92b2lkIDA6QmlnVWludDY0QXJyYXksIiVCb29sZWFuJSI6Qm9vbGVhbiwiJURhdGFWaWV3JSI6InVuZGVmaW5lZCI9PXR5cGVvZiBEYXRhVmlldz92b2lkIDA6RGF0YVZpZXcsIiVEYXRlJSI6RGF0ZSwiJWRlY29kZVVSSSUiOmRlY29kZVVSSSwiJWRlY29kZVVSSUNvbXBvbmVudCUiOmRlY29kZVVSSUNvbXBvbmVudCwiJWVuY29kZVVSSSUiOmVuY29kZVVSSSwiJWVuY29kZVVSSUNvbXBvbmVudCUiOmVuY29kZVVSSUNvbXBvbmVudCwiJUVycm9yJSI6JEVycm9yLCIlZXZhbCUiOmV2YWwsIiVFdmFsRXJyb3IlIjokRXZhbEVycm9yLCIlRmxvYXQxNkFycmF5JSI6InVuZGVmaW5lZCI9PXR5cGVvZiBGbG9hdDE2QXJyYXk/dm9pZCAwOkZsb2F0MTZBcnJheSwiJUZsb2F0MzJBcnJheSUiOiJ1bmRlZmluZWQiPT10eXBlb2YgRmxvYXQzMkFycmF5P3ZvaWQgMDpGbG9hdDMyQXJyYXksIiVGbG9hdDY0QXJyYXklIjoidW5kZWZpbmVkIj09dHlwZW9mIEZsb2F0NjRBcnJheT92b2lkIDA6RmxvYXQ2NEFycmF5LCIlRmluYWxpemF0aW9uUmVnaXN0cnklIjoidW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3ZvaWQgMDpGaW5hbGl6YXRpb25SZWdpc3RyeSwiJUZ1bmN0aW9uJSI6JEZ1bmN0aW9uLCIlR2VuZXJhdG9yRnVuY3Rpb24lIjpuZWVkc0V2YWwsIiVJbnQ4QXJyYXklIjoidW5kZWZpbmVkIj09dHlwZW9mIEludDhBcnJheT92b2lkIDA6SW50OEFycmF5LCIlSW50MTZBcnJheSUiOiJ1bmRlZmluZWQiPT10eXBlb2YgSW50MTZBcnJheT92b2lkIDA6SW50MTZBcnJheSwiJUludDMyQXJyYXklIjoidW5kZWZpbmVkIj09dHlwZW9mIEludDMyQXJyYXk/dm9pZCAwOkludDMyQXJyYXksIiVpc0Zpbml0ZSUiOmlzRmluaXRlLCIlaXNOYU4lIjppc05hTiwiJUl0ZXJhdG9yUHJvdG90eXBlJSI6aGFzU3ltYm9scyYmZ2V0UHJvdG8/Z2V0UHJvdG8oZ2V0UHJvdG8oW11bU3ltYm9sLml0ZXJhdG9yXSgpKSk6dm9pZCAwLCIlSlNPTiUiOiJvYmplY3QiPT10eXBlb2YgSlNPTj9KU09OOnZvaWQgMCwiJU1hcCUiOiJ1bmRlZmluZWQiPT10eXBlb2YgTWFwP3ZvaWQgMDpNYXAsIiVNYXBJdGVyYXRvclByb3RvdHlwZSUiOiJ1bmRlZmluZWQiIT10eXBlb2YgTWFwJiZoYXNTeW1ib2xzJiZnZXRQcm90bz9nZXRQcm90bygobmV3IE1hcClbU3ltYm9sLml0ZXJhdG9yXSgpKTp2b2lkIDAsIiVNYXRoJSI6TWF0aCwiJU51bWJlciUiOk51bWJlciwiJU9iamVjdCUiOiRPYmplY3QsIiVPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJSI6JGdPUEQsIiVwYXJzZUZsb2F0JSI6cGFyc2VGbG9hdCwiJXBhcnNlSW50JSI6cGFyc2VJbnQsIiVQcm9taXNlJSI6InVuZGVmaW5lZCI9PXR5cGVvZiBQcm9taXNlP3ZvaWQgMDpQcm9taXNlLCIlUHJveHklIjoidW5kZWZpbmVkIj09dHlwZW9mIFByb3h5P3ZvaWQgMDpQcm94eSwiJVJhbmdlRXJyb3IlIjokUmFuZ2VFcnJvciwiJVJlZmVyZW5jZUVycm9yJSI6JFJlZmVyZW5jZUVycm9yLCIlUmVmbGVjdCUiOiJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdD92b2lkIDA6UmVmbGVjdCwiJVJlZ0V4cCUiOlJlZ0V4cCwiJVNldCUiOiJ1bmRlZmluZWQiPT10eXBlb2YgU2V0P3ZvaWQgMDpTZXQsIiVTZXRJdGVyYXRvclByb3RvdHlwZSUiOiJ1bmRlZmluZWQiIT10eXBlb2YgU2V0JiZoYXNTeW1ib2xzJiZnZXRQcm90bz9nZXRQcm90bygobmV3IFNldClbU3ltYm9sLml0ZXJhdG9yXSgpKTp2b2lkIDAsIiVTaGFyZWRBcnJheUJ1ZmZlciUiOiJ1bmRlZmluZWQiPT10eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXI/dm9pZCAwOlNoYXJlZEFycmF5QnVmZmVyLCIlU3RyaW5nJSI6U3RyaW5nLCIlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlIjpoYXNTeW1ib2xzJiZnZXRQcm90bz9nZXRQcm90bygiIltTeW1ib2wuaXRlcmF0b3JdKCkpOnZvaWQgMCwiJVN5bWJvbCUiOmhhc1N5bWJvbHM/U3ltYm9sOnZvaWQgMCwiJVN5bnRheEVycm9yJSI6JFN5bnRheEVycm9yLCIlVGhyb3dUeXBlRXJyb3IlIjpUaHJvd1R5cGVFcnJvciwiJVR5cGVkQXJyYXklIjpUeXBlZEFycmF5LCIlVHlwZUVycm9yJSI6JFR5cGVFcnJvciwiJVVpbnQ4QXJyYXklIjoidW5kZWZpbmVkIj09dHlwZW9mIFVpbnQ4QXJyYXk/dm9pZCAwOlVpbnQ4QXJyYXksIiVVaW50OENsYW1wZWRBcnJheSUiOiJ1bmRlZmluZWQiPT10eXBlb2YgVWludDhDbGFtcGVkQXJyYXk/dm9pZCAwOlVpbnQ4Q2xhbXBlZEFycmF5LCIlVWludDE2QXJyYXklIjoidW5kZWZpbmVkIj09dHlwZW9mIFVpbnQxNkFycmF5P3ZvaWQgMDpVaW50MTZBcnJheSwiJVVpbnQzMkFycmF5JSI6InVuZGVmaW5lZCI9PXR5cGVvZiBVaW50MzJBcnJheT92b2lkIDA6VWludDMyQXJyYXksIiVVUklFcnJvciUiOiRVUklFcnJvciwiJVdlYWtNYXAlIjoidW5kZWZpbmVkIj09dHlwZW9mIFdlYWtNYXA/dm9pZCAwOldlYWtNYXAsIiVXZWFrUmVmJSI6InVuZGVmaW5lZCI9PXR5cGVvZiBXZWFrUmVmP3ZvaWQgMDpXZWFrUmVmLCIlV2Vha1NldCUiOiJ1bmRlZmluZWQiPT10eXBlb2YgV2Vha1NldD92b2lkIDA6V2Vha1NldCwiJUZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsJSI6JGNhbGwsIiVGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHklIjokYXBwbHksIiVPYmplY3QuZGVmaW5lUHJvcGVydHklIjokZGVmaW5lUHJvcGVydHksIiVPYmplY3QuZ2V0UHJvdG90eXBlT2YlIjokT2JqZWN0R1BPLCIlTWF0aC5hYnMlIjphYnMsIiVNYXRoLmZsb29yJSI6Zmxvb3IsIiVNYXRoLm1heCUiOm1heCwiJU1hdGgubWluJSI6bWluLCIlTWF0aC5wb3clIjpwb3csIiVNYXRoLnJvdW5kJSI6cm91bmQsIiVNYXRoLnNpZ24lIjpzaWduLCIlUmVmbGVjdC5nZXRQcm90b3R5cGVPZiUiOiRSZWZsZWN0R1BPfTtpZihnZXRQcm90byl0cnl7bnVsbC5lcnJvcn1jYXRjaChlKXt2YXIgZXJyb3JQcm90bz1nZXRQcm90byhnZXRQcm90byhlKSk7SU5UUklOU0lDU1siJUVycm9yLnByb3RvdHlwZSUiXT1lcnJvclByb3RvfXZhciBkb0V2YWw9ZnVuY3Rpb24gZG9FdmFsKG5hbWUpe3ZhciB2YWx1ZTtpZigiJUFzeW5jRnVuY3Rpb24lIj09PW5hbWUpdmFsdWU9Z2V0RXZhbGxlZENvbnN0cnVjdG9yKCJhc3luYyBmdW5jdGlvbiAoKSB7fSIpO2Vsc2UgaWYoIiVHZW5lcmF0b3JGdW5jdGlvbiUiPT09bmFtZSl2YWx1ZT1nZXRFdmFsbGVkQ29uc3RydWN0b3IoImZ1bmN0aW9uKiAoKSB7fSIpO2Vsc2UgaWYoIiVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJSI9PT1uYW1lKXZhbHVlPWdldEV2YWxsZWRDb25zdHJ1Y3RvcigiYXN5bmMgZnVuY3Rpb24qICgpIHt9Iik7ZWxzZSBpZigiJUFzeW5jR2VuZXJhdG9yJSI9PT1uYW1lKXt2YXIgZm49ZG9FdmFsKCIlQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUiKTtmbiYmKHZhbHVlPWZuLnByb3RvdHlwZSl9ZWxzZSBpZigiJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlIj09PW5hbWUpe3ZhciBnZW49ZG9FdmFsKCIlQXN5bmNHZW5lcmF0b3IlIik7Z2VuJiZnZXRQcm90byYmKHZhbHVlPWdldFByb3RvKGdlbi5wcm90b3R5cGUpKX1yZXR1cm4gSU5UUklOU0lDU1tuYW1lXT12YWx1ZSx2YWx1ZX0sTEVHQUNZX0FMSUFTRVM9e19fcHJvdG9fXzpudWxsLCIlQXJyYXlCdWZmZXJQcm90b3R5cGUlIjpbIkFycmF5QnVmZmVyIiwicHJvdG90eXBlIl0sIiVBcnJheVByb3RvdHlwZSUiOlsiQXJyYXkiLCJwcm90b3R5cGUiXSwiJUFycmF5UHJvdG9fZW50cmllcyUiOlsiQXJyYXkiLCJwcm90b3R5cGUiLCJlbnRyaWVzIl0sIiVBcnJheVByb3RvX2ZvckVhY2glIjpbIkFycmF5IiwicHJvdG90eXBlIiwiZm9yRWFjaCJdLCIlQXJyYXlQcm90b19rZXlzJSI6WyJBcnJheSIsInByb3RvdHlwZSIsImtleXMiXSwiJUFycmF5UHJvdG9fdmFsdWVzJSI6WyJBcnJheSIsInByb3RvdHlwZSIsInZhbHVlcyJdLCIlQXN5bmNGdW5jdGlvblByb3RvdHlwZSUiOlsiQXN5bmNGdW5jdGlvbiIsInByb3RvdHlwZSJdLCIlQXN5bmNHZW5lcmF0b3IlIjpbIkFzeW5jR2VuZXJhdG9yRnVuY3Rpb24iLCJwcm90b3R5cGUiXSwiJUFzeW5jR2VuZXJhdG9yUHJvdG90eXBlJSI6WyJBc3luY0dlbmVyYXRvckZ1bmN0aW9uIiwicHJvdG90eXBlIiwicHJvdG90eXBlIl0sIiVCb29sZWFuUHJvdG90eXBlJSI6WyJCb29sZWFuIiwicHJvdG90eXBlIl0sIiVEYXRhVmlld1Byb3RvdHlwZSUiOlsiRGF0YVZpZXciLCJwcm90b3R5cGUiXSwiJURhdGVQcm90b3R5cGUlIjpbIkRhdGUiLCJwcm90b3R5cGUiXSwiJUVycm9yUHJvdG90eXBlJSI6WyJFcnJvciIsInByb3RvdHlwZSJdLCIlRXZhbEVycm9yUHJvdG90eXBlJSI6WyJFdmFsRXJyb3IiLCJwcm90b3R5cGUiXSwiJUZsb2F0MzJBcnJheVByb3RvdHlwZSUiOlsiRmxvYXQzMkFycmF5IiwicHJvdG90eXBlIl0sIiVGbG9hdDY0QXJyYXlQcm90b3R5cGUlIjpbIkZsb2F0NjRBcnJheSIsInByb3RvdHlwZSJdLCIlRnVuY3Rpb25Qcm90b3R5cGUlIjpbIkZ1bmN0aW9uIiwicHJvdG90eXBlIl0sIiVHZW5lcmF0b3IlIjpbIkdlbmVyYXRvckZ1bmN0aW9uIiwicHJvdG90eXBlIl0sIiVHZW5lcmF0b3JQcm90b3R5cGUlIjpbIkdlbmVyYXRvckZ1bmN0aW9uIiwicHJvdG90eXBlIiwicHJvdG90eXBlIl0sIiVJbnQ4QXJyYXlQcm90b3R5cGUlIjpbIkludDhBcnJheSIsInByb3RvdHlwZSJdLCIlSW50MTZBcnJheVByb3RvdHlwZSUiOlsiSW50MTZBcnJheSIsInByb3RvdHlwZSJdLCIlSW50MzJBcnJheVByb3RvdHlwZSUiOlsiSW50MzJBcnJheSIsInByb3RvdHlwZSJdLCIlSlNPTlBhcnNlJSI6WyJKU09OIiwicGFyc2UiXSwiJUpTT05TdHJpbmdpZnklIjpbIkpTT04iLCJzdHJpbmdpZnkiXSwiJU1hcFByb3RvdHlwZSUiOlsiTWFwIiwicHJvdG90eXBlIl0sIiVOdW1iZXJQcm90b3R5cGUlIjpbIk51bWJlciIsInByb3RvdHlwZSJdLCIlT2JqZWN0UHJvdG90eXBlJSI6WyJPYmplY3QiLCJwcm90b3R5cGUiXSwiJU9ialByb3RvX3RvU3RyaW5nJSI6WyJPYmplY3QiLCJwcm90b3R5cGUiLCJ0b1N0cmluZyJdLCIlT2JqUHJvdG9fdmFsdWVPZiUiOlsiT2JqZWN0IiwicHJvdG90eXBlIiwidmFsdWVPZiJdLCIlUHJvbWlzZVByb3RvdHlwZSUiOlsiUHJvbWlzZSIsInByb3RvdHlwZSJdLCIlUHJvbWlzZVByb3RvX3RoZW4lIjpbIlByb21pc2UiLCJwcm90b3R5cGUiLCJ0aGVuIl0sIiVQcm9taXNlX2FsbCUiOlsiUHJvbWlzZSIsImFsbCJdLCIlUHJvbWlzZV9yZWplY3QlIjpbIlByb21pc2UiLCJyZWplY3QiXSwiJVByb21pc2VfcmVzb2x2ZSUiOlsiUHJvbWlzZSIsInJlc29sdmUiXSwiJVJhbmdlRXJyb3JQcm90b3R5cGUlIjpbIlJhbmdlRXJyb3IiLCJwcm90b3R5cGUiXSwiJVJlZmVyZW5jZUVycm9yUHJvdG90eXBlJSI6WyJSZWZlcmVuY2VFcnJvciIsInByb3RvdHlwZSJdLCIlUmVnRXhwUHJvdG90eXBlJSI6WyJSZWdFeHAiLCJwcm90b3R5cGUiXSwiJVNldFByb3RvdHlwZSUiOlsiU2V0IiwicHJvdG90eXBlIl0sIiVTaGFyZWRBcnJheUJ1ZmZlclByb3RvdHlwZSUiOlsiU2hhcmVkQXJyYXlCdWZmZXIiLCJwcm90b3R5cGUiXSwiJVN0cmluZ1Byb3RvdHlwZSUiOlsiU3RyaW5nIiwicHJvdG90eXBlIl0sIiVTeW1ib2xQcm90b3R5cGUlIjpbIlN5bWJvbCIsInByb3RvdHlwZSJdLCIlU3ludGF4RXJyb3JQcm90b3R5cGUlIjpbIlN5bnRheEVycm9yIiwicHJvdG90eXBlIl0sIiVUeXBlZEFycmF5UHJvdG90eXBlJSI6WyJUeXBlZEFycmF5IiwicHJvdG90eXBlIl0sIiVUeXBlRXJyb3JQcm90b3R5cGUlIjpbIlR5cGVFcnJvciIsInByb3RvdHlwZSJdLCIlVWludDhBcnJheVByb3RvdHlwZSUiOlsiVWludDhBcnJheSIsInByb3RvdHlwZSJdLCIlVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUlIjpbIlVpbnQ4Q2xhbXBlZEFycmF5IiwicHJvdG90eXBlIl0sIiVVaW50MTZBcnJheVByb3RvdHlwZSUiOlsiVWludDE2QXJyYXkiLCJwcm90b3R5cGUiXSwiJVVpbnQzMkFycmF5UHJvdG90eXBlJSI6WyJVaW50MzJBcnJheSIsInByb3RvdHlwZSJdLCIlVVJJRXJyb3JQcm90b3R5cGUlIjpbIlVSSUVycm9yIiwicHJvdG90eXBlIl0sIiVXZWFrTWFwUHJvdG90eXBlJSI6WyJXZWFrTWFwIiwicHJvdG90eXBlIl0sIiVXZWFrU2V0UHJvdG90eXBlJSI6WyJXZWFrU2V0IiwicHJvdG90eXBlIl19LGJpbmQ9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2Z1bmN0aW9uLWJpbmQvaW5kZXguanMiKSxoYXNPd249X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2hhc293bi9pbmRleC5qcyIpLCRjb25jYXQ9YmluZC5jYWxsKCRjYWxsLEFycmF5LnByb3RvdHlwZS5jb25jYXQpLCRzcGxpY2VBcHBseT1iaW5kLmNhbGwoJGFwcGx5LEFycmF5LnByb3RvdHlwZS5zcGxpY2UpLCRyZXBsYWNlPWJpbmQuY2FsbCgkY2FsbCxTdHJpbmcucHJvdG90eXBlLnJlcGxhY2UpLCRzdHJTbGljZT1iaW5kLmNhbGwoJGNhbGwsU3RyaW5nLnByb3RvdHlwZS5zbGljZSksJGV4ZWM9YmluZC5jYWxsKCRjYWxsLFJlZ0V4cC5wcm90b3R5cGUuZXhlYykscmVQcm9wTmFtZT0vW14lLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JSQpKS9nLHJlRXNjYXBlQ2hhcj0vXFwoXFwpPy9nLGdldEJhc2VJbnRyaW5zaWM9ZnVuY3Rpb24gZ2V0QmFzZUludHJpbnNpYyhuYW1lLGFsbG93TWlzc2luZyl7dmFyIGFsaWFzLGludHJpbnNpY05hbWU9bmFtZTtpZihoYXNPd24oTEVHQUNZX0FMSUFTRVMsaW50cmluc2ljTmFtZSkmJihpbnRyaW5zaWNOYW1lPSIlIisoYWxpYXM9TEVHQUNZX0FMSUFTRVNbaW50cmluc2ljTmFtZV0pWzBdKyIlIiksaGFzT3duKElOVFJJTlNJQ1MsaW50cmluc2ljTmFtZSkpe3ZhciB2YWx1ZT1JTlRSSU5TSUNTW2ludHJpbnNpY05hbWVdO2lmKHZhbHVlPT09bmVlZHNFdmFsJiYodmFsdWU9ZG9FdmFsKGludHJpbnNpY05hbWUpKSx2b2lkIDA9PT12YWx1ZSYmIWFsbG93TWlzc2luZyl0aHJvdyBuZXcgJFR5cGVFcnJvcigiaW50cmluc2ljICIrbmFtZSsiIGV4aXN0cywgYnV0IGlzIG5vdCBhdmFpbGFibGUuIFBsZWFzZSBmaWxlIGFuIGlzc3VlISIpO3JldHVybnthbGlhcyxuYW1lOmludHJpbnNpY05hbWUsdmFsdWV9fXRocm93IG5ldyAkU3ludGF4RXJyb3IoImludHJpbnNpYyAiK25hbWUrIiBkb2VzIG5vdCBleGlzdCEiKX07bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24gR2V0SW50cmluc2ljKG5hbWUsYWxsb3dNaXNzaW5nKXtpZigic3RyaW5nIiE9dHlwZW9mIG5hbWV8fDA9PT1uYW1lLmxlbmd0aCl0aHJvdyBuZXcgJFR5cGVFcnJvcigiaW50cmluc2ljIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmciKTtpZihhcmd1bWVudHMubGVuZ3RoPjEmJiJib29sZWFuIiE9dHlwZW9mIGFsbG93TWlzc2luZyl0aHJvdyBuZXcgJFR5cGVFcnJvcignImFsbG93TWlzc2luZyIgYXJndW1lbnQgbXVzdCBiZSBhIGJvb2xlYW4nKTtpZihudWxsPT09JGV4ZWMoL14lP1teJV0qJT8kLyxuYW1lKSl0aHJvdyBuZXcgJFN5bnRheEVycm9yKCJgJWAgbWF5IG5vdCBiZSBwcmVzZW50IGFueXdoZXJlIGJ1dCBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIGludHJpbnNpYyBuYW1lIik7dmFyIHBhcnRzPWZ1bmN0aW9uIHN0cmluZ1RvUGF0aChzdHJpbmcpe3ZhciBmaXJzdD0kc3RyU2xpY2Uoc3RyaW5nLDAsMSksbGFzdD0kc3RyU2xpY2Uoc3RyaW5nLC0xKTtpZigiJSI9PT1maXJzdCYmIiUiIT09bGFzdCl0aHJvdyBuZXcgJFN5bnRheEVycm9yKCJpbnZhbGlkIGludHJpbnNpYyBzeW50YXgsIGV4cGVjdGVkIGNsb3NpbmcgYCVgIik7aWYoIiUiPT09bGFzdCYmIiUiIT09Zmlyc3QpdGhyb3cgbmV3ICRTeW50YXhFcnJvcigiaW52YWxpZCBpbnRyaW5zaWMgc3ludGF4LCBleHBlY3RlZCBvcGVuaW5nIGAlYCIpO3ZhciByZXN1bHQ9W107cmV0dXJuICRyZXBsYWNlKHN0cmluZyxyZVByb3BOYW1lLGZ1bmN0aW9uKG1hdGNoLG51bWJlcixxdW90ZSxzdWJTdHJpbmcpe3Jlc3VsdFtyZXN1bHQubGVuZ3RoXT1xdW90ZT8kcmVwbGFjZShzdWJTdHJpbmcscmVFc2NhcGVDaGFyLCIkMSIpOm51bWJlcnx8bWF0Y2h9KSxyZXN1bHR9KG5hbWUpLGludHJpbnNpY0Jhc2VOYW1lPXBhcnRzLmxlbmd0aD4wP3BhcnRzWzBdOiIiLGludHJpbnNpYz1nZXRCYXNlSW50cmluc2ljKCIlIitpbnRyaW5zaWNCYXNlTmFtZSsiJSIsYWxsb3dNaXNzaW5nKSxpbnRyaW5zaWNSZWFsTmFtZT1pbnRyaW5zaWMubmFtZSx2YWx1ZT1pbnRyaW5zaWMudmFsdWUsc2tpcEZ1cnRoZXJDYWNoaW5nPSExLGFsaWFzPWludHJpbnNpYy5hbGlhczthbGlhcyYmKGludHJpbnNpY0Jhc2VOYW1lPWFsaWFzWzBdLCRzcGxpY2VBcHBseShwYXJ0cywkY29uY2F0KFswLDFdLGFsaWFzKSkpO2Zvcih2YXIgaT0xLGlzT3duPSEwO2k8cGFydHMubGVuZ3RoO2krPTEpe3ZhciBwYXJ0PXBhcnRzW2ldLGZpcnN0PSRzdHJTbGljZShwYXJ0LDAsMSksbGFzdD0kc3RyU2xpY2UocGFydCwtMSk7aWYoKCciJz09PWZpcnN0fHwiJyI9PT1maXJzdHx8ImAiPT09Zmlyc3R8fCciJz09PWxhc3R8fCInIj09PWxhc3R8fCJgIj09PWxhc3QpJiZmaXJzdCE9PWxhc3QpdGhyb3cgbmV3ICRTeW50YXhFcnJvcigicHJvcGVydHkgbmFtZXMgd2l0aCBxdW90ZXMgbXVzdCBoYXZlIG1hdGNoaW5nIHF1b3RlcyIpO2lmKCJjb25zdHJ1Y3RvciIhPT1wYXJ0JiZpc093bnx8KHNraXBGdXJ0aGVyQ2FjaGluZz0hMCksaGFzT3duKElOVFJJTlNJQ1MsaW50cmluc2ljUmVhbE5hbWU9IiUiKyhpbnRyaW5zaWNCYXNlTmFtZSs9Ii4iK3BhcnQpKyIlIikpdmFsdWU9SU5UUklOU0lDU1tpbnRyaW5zaWNSZWFsTmFtZV07ZWxzZSBpZihudWxsIT12YWx1ZSl7aWYoIShwYXJ0IGluIHZhbHVlKSl7aWYoIWFsbG93TWlzc2luZyl0aHJvdyBuZXcgJFR5cGVFcnJvcigiYmFzZSBpbnRyaW5zaWMgZm9yICIrbmFtZSsiIGV4aXN0cywgYnV0IHRoZSBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLiIpO3JldHVybn1pZigkZ09QRCYmaSsxPj1wYXJ0cy5sZW5ndGgpe3ZhciBkZXNjPSRnT1BEKHZhbHVlLHBhcnQpO3ZhbHVlPShpc093bj0hIWRlc2MpJiYiZ2V0ImluIGRlc2MmJiEoIm9yaWdpbmFsVmFsdWUiaW4gZGVzYy5nZXQpP2Rlc2MuZ2V0OnZhbHVlW3BhcnRdfWVsc2UgaXNPd249aGFzT3duKHZhbHVlLHBhcnQpLHZhbHVlPXZhbHVlW3BhcnRdO2lzT3duJiYhc2tpcEZ1cnRoZXJDYWNoaW5nJiYoSU5UUklOU0lDU1tpbnRyaW5zaWNSZWFsTmFtZV09dmFsdWUpfX1yZXR1cm4gdmFsdWV9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2dldC1wcm90by9PYmplY3QuZ2V0UHJvdG90eXBlT2YuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciAkT2JqZWN0PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9lcy1vYmplY3QtYXRvbXMvaW5kZXguanMiKTttb2R1bGUuZXhwb3J0cz0kT2JqZWN0LmdldFByb3RvdHlwZU9mfHxudWxsfSwiLi4vLi4vbm9kZV9tb2R1bGVzL2dldC1wcm90by9SZWZsZWN0LmdldFByb3RvdHlwZU9mLmpzIihtb2R1bGUpeyJ1c2Ugc3RyaWN0Ijttb2R1bGUuZXhwb3J0cz0idW5kZWZpbmVkIiE9dHlwZW9mIFJlZmxlY3QmJlJlZmxlY3QuZ2V0UHJvdG90eXBlT2Z8fG51bGx9LCIuLi8uLi9ub2RlX21vZHVsZXMvZ2V0LXByb3RvL2luZGV4LmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgcmVmbGVjdEdldFByb3RvPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9nZXQtcHJvdG8vUmVmbGVjdC5nZXRQcm90b3R5cGVPZi5qcyIpLG9yaWdpbmFsR2V0UHJvdG89X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2dldC1wcm90by9PYmplY3QuZ2V0UHJvdG90eXBlT2YuanMiKSxnZXREdW5kZXJQcm90bz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZHVuZGVyLXByb3RvL2dldC5qcyIpO21vZHVsZS5leHBvcnRzPXJlZmxlY3RHZXRQcm90bz9mdW5jdGlvbiBnZXRQcm90byhPKXtyZXR1cm4gcmVmbGVjdEdldFByb3RvKE8pfTpvcmlnaW5hbEdldFByb3RvP2Z1bmN0aW9uIGdldFByb3RvKE8pe2lmKCFPfHwib2JqZWN0IiE9dHlwZW9mIE8mJiJmdW5jdGlvbiIhPXR5cGVvZiBPKXRocm93IG5ldyBUeXBlRXJyb3IoImdldFByb3RvOiBub3QgYW4gb2JqZWN0Iik7cmV0dXJuIG9yaWdpbmFsR2V0UHJvdG8oTyl9OmdldER1bmRlclByb3RvP2Z1bmN0aW9uIGdldFByb3RvKE8pe3JldHVybiBnZXREdW5kZXJQcm90byhPKX06bnVsbH0sIi4uLy4uL25vZGVfbW9kdWxlcy9nb3BkL2dPUEQuanMiKG1vZHVsZSl7InVzZSBzdHJpY3QiO21vZHVsZS5leHBvcnRzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3J9LCIuLi8uLi9ub2RlX21vZHVsZXMvZ29wZC9pbmRleC5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyICRnT1BEPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9nb3BkL2dPUEQuanMiKTtpZigkZ09QRCl0cnl7JGdPUEQoW10sImxlbmd0aCIpfWNhdGNoKGUpeyRnT1BEPW51bGx9bW9kdWxlLmV4cG9ydHM9JGdPUER9LCIuLi8uLi9ub2RlX21vZHVsZXMvaGFzLXByb3BlcnR5LWRlc2NyaXB0b3JzL2luZGV4LmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgJGRlZmluZVByb3BlcnR5PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9lcy1kZWZpbmUtcHJvcGVydHkvaW5kZXguanMiKSxoYXNQcm9wZXJ0eURlc2NyaXB0b3JzPWZ1bmN0aW9uIGhhc1Byb3BlcnR5RGVzY3JpcHRvcnMoKXtyZXR1cm4hISRkZWZpbmVQcm9wZXJ0eX07aGFzUHJvcGVydHlEZXNjcmlwdG9ycy5oYXNBcnJheUxlbmd0aERlZmluZUJ1Zz1mdW5jdGlvbiBoYXNBcnJheUxlbmd0aERlZmluZUJ1Zygpe2lmKCEkZGVmaW5lUHJvcGVydHkpcmV0dXJuIG51bGw7dHJ5e3JldHVybiAxIT09JGRlZmluZVByb3BlcnR5KFtdLCJsZW5ndGgiLHt2YWx1ZToxfSkubGVuZ3RofWNhdGNoKGUpe3JldHVybiEwfX0sbW9kdWxlLmV4cG9ydHM9aGFzUHJvcGVydHlEZXNjcmlwdG9yc30sIi4uLy4uL25vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9pbmRleC5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIG9yaWdTeW1ib2w9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbCxoYXNTeW1ib2xTaGFtPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9zaGFtcy5qcyIpO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uIGhhc05hdGl2ZVN5bWJvbHMoKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygb3JpZ1N5bWJvbCYmKCJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJigic3ltYm9sIj09dHlwZW9mIG9yaWdTeW1ib2woImZvbyIpJiYoInN5bWJvbCI9PXR5cGVvZiBTeW1ib2woImJhciIpJiZoYXNTeW1ib2xTaGFtKCkpKSl9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2hhcy1zeW1ib2xzL3NoYW1zLmpzIihtb2R1bGUpeyJ1c2Ugc3RyaWN0Ijttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbiBoYXNTeW1ib2xzKCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIFN5bWJvbHx8ImZ1bmN0aW9uIiE9dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpcmV0dXJuITE7aWYoInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3IpcmV0dXJuITA7dmFyIG9iaj17fSxzeW09U3ltYm9sKCJ0ZXN0Iiksc3ltT2JqPU9iamVjdChzeW0pO2lmKCJzdHJpbmciPT10eXBlb2Ygc3ltKXJldHVybiExO2lmKCJbb2JqZWN0IFN5bWJvbF0iIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN5bSkpcmV0dXJuITE7aWYoIltvYmplY3QgU3ltYm9sXSIhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltT2JqKSlyZXR1cm4hMTtmb3IodmFyIF8gaW4gb2JqW3N5bV09NDIsb2JqKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3Qua2V5cyYmMCE9PU9iamVjdC5rZXlzKG9iaikubGVuZ3RoKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyYmMCE9PU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubGVuZ3RoKXJldHVybiExO3ZhciBzeW1zPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqKTtpZigxIT09c3ltcy5sZW5ndGh8fHN5bXNbMF0hPT1zeW0pcmV0dXJuITE7aWYoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmosc3ltKSlyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcil7dmFyIGRlc2NyaXB0b3I9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosc3ltKTtpZig0MiE9PWRlc2NyaXB0b3IudmFsdWV8fCEwIT09ZGVzY3JpcHRvci5lbnVtZXJhYmxlKXJldHVybiExfXJldHVybiEwfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9oYXMtdG9zdHJpbmd0YWcvc2hhbXMuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBoYXNTeW1ib2xzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9zaGFtcy5qcyIpO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uIGhhc1RvU3RyaW5nVGFnU2hhbXMoKXtyZXR1cm4gaGFzU3ltYm9scygpJiYhIVN5bWJvbC50b1N0cmluZ1RhZ319LCIuLi8uLi9ub2RlX21vZHVsZXMvaGFzaC1iYXNlL2luZGV4LmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcyIpLkJ1ZmZlcixUcmFuc2Zvcm09X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1icm93c2VyaWZ5L2luZGV4LmpzIikuVHJhbnNmb3JtO2Z1bmN0aW9uIEhhc2hCYXNlKGJsb2NrU2l6ZSl7VHJhbnNmb3JtLmNhbGwodGhpcyksdGhpcy5fYmxvY2s9QnVmZmVyLmFsbG9jVW5zYWZlKGJsb2NrU2l6ZSksdGhpcy5fYmxvY2tTaXplPWJsb2NrU2l6ZSx0aGlzLl9ibG9ja09mZnNldD0wLHRoaXMuX2xlbmd0aD1bMCwwLDAsMF0sdGhpcy5fZmluYWxpemVkPSExfV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIikoSGFzaEJhc2UsVHJhbnNmb3JtKSxIYXNoQmFzZS5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbihjaHVuayxlbmNvZGluZyxjYWxsYmFjayl7dmFyIGVycm9yPW51bGw7dHJ5e3RoaXMudXBkYXRlKGNodW5rLGVuY29kaW5nKX1jYXRjaChlcnIpe2Vycm9yPWVycn1jYWxsYmFjayhlcnJvcil9LEhhc2hCYXNlLnByb3RvdHlwZS5fZmx1c2g9ZnVuY3Rpb24oY2FsbGJhY2spe3ZhciBlcnJvcj1udWxsO3RyeXt0aGlzLnB1c2godGhpcy5kaWdlc3QoKSl9Y2F0Y2goZXJyKXtlcnJvcj1lcnJ9Y2FsbGJhY2soZXJyb3IpfTt2YXIgdXNlVWludDhBcnJheT0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXksdXNlQXJyYXlCdWZmZXI9InVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmInVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5JiZBcnJheUJ1ZmZlci5pc1ZpZXcmJihCdWZmZXIucHJvdG90eXBlIGluc3RhbmNlb2YgVWludDhBcnJheXx8QnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpO0hhc2hCYXNlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZGF0YSxlbmNvZGluZyl7aWYodGhpcy5fZmluYWxpemVkKXRocm93IG5ldyBFcnJvcigiRGlnZXN0IGFscmVhZHkgY2FsbGVkIik7ZGF0YT1mdW5jdGlvbiB0b0J1ZmZlcihkYXRhLGVuY29kaW5nKXtpZihkYXRhIGluc3RhbmNlb2YgQnVmZmVyKXJldHVybiBkYXRhO2lmKCJzdHJpbmciPT10eXBlb2YgZGF0YSlyZXR1cm4gQnVmZmVyLmZyb20oZGF0YSxlbmNvZGluZyk7aWYodXNlQXJyYXlCdWZmZXImJkFycmF5QnVmZmVyLmlzVmlldyhkYXRhKSl7aWYoMD09PWRhdGEuYnl0ZUxlbmd0aClyZXR1cm4gQnVmZmVyLmFsbG9jKDApO3ZhciByZXM9QnVmZmVyLmZyb20oZGF0YS5idWZmZXIsZGF0YS5ieXRlT2Zmc2V0LGRhdGEuYnl0ZUxlbmd0aCk7aWYocmVzLmJ5dGVMZW5ndGg9PT1kYXRhLmJ5dGVMZW5ndGgpcmV0dXJuIHJlc31pZih1c2VVaW50OEFycmF5JiZkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSlyZXR1cm4gQnVmZmVyLmZyb20oZGF0YSk7aWYoQnVmZmVyLmlzQnVmZmVyKGRhdGEpJiZkYXRhLmNvbnN0cnVjdG9yJiYiZnVuY3Rpb24iPT10eXBlb2YgZGF0YS5jb25zdHJ1Y3Rvci5pc0J1ZmZlciYmZGF0YS5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihkYXRhKSlyZXR1cm4gQnVmZmVyLmZyb20oZGF0YSk7dGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJkYXRhIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nIG9yIGFuIGluc3RhbmNlIG9mIEJ1ZmZlciwgVHlwZWRBcnJheSwgb3IgRGF0YVZpZXcuJyl9KGRhdGEsZW5jb2RpbmcpO2Zvcih2YXIgYmxvY2s9dGhpcy5fYmxvY2ssb2Zmc2V0PTA7dGhpcy5fYmxvY2tPZmZzZXQrZGF0YS5sZW5ndGgtb2Zmc2V0Pj10aGlzLl9ibG9ja1NpemU7KXtmb3IodmFyIGk9dGhpcy5fYmxvY2tPZmZzZXQ7aTx0aGlzLl9ibG9ja1NpemU7KWJsb2NrW2krK109ZGF0YVtvZmZzZXQrK107dGhpcy5fdXBkYXRlKCksdGhpcy5fYmxvY2tPZmZzZXQ9MH1mb3IoO29mZnNldDxkYXRhLmxlbmd0aDspYmxvY2tbdGhpcy5fYmxvY2tPZmZzZXQrK109ZGF0YVtvZmZzZXQrK107Zm9yKHZhciBqPTAsY2Fycnk9OCpkYXRhLmxlbmd0aDtjYXJyeT4wOysrail0aGlzLl9sZW5ndGhbal0rPWNhcnJ5LChjYXJyeT10aGlzLl9sZW5ndGhbal0vNDI5NDk2NzI5NnwwKT4wJiYodGhpcy5fbGVuZ3RoW2pdLT00Mjk0OTY3Mjk2KmNhcnJ5KTtyZXR1cm4gdGhpc30sSGFzaEJhc2UucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIl91cGRhdGUgaXMgbm90IGltcGxlbWVudGVkIil9LEhhc2hCYXNlLnByb3RvdHlwZS5kaWdlc3Q9ZnVuY3Rpb24oZW5jb2Rpbmcpe2lmKHRoaXMuX2ZpbmFsaXplZCl0aHJvdyBuZXcgRXJyb3IoIkRpZ2VzdCBhbHJlYWR5IGNhbGxlZCIpO3RoaXMuX2ZpbmFsaXplZD0hMDt2YXIgZGlnZXN0PXRoaXMuX2RpZ2VzdCgpO3ZvaWQgMCE9PWVuY29kaW5nJiYoZGlnZXN0PWRpZ2VzdC50b1N0cmluZyhlbmNvZGluZykpLHRoaXMuX2Jsb2NrLmZpbGwoMCksdGhpcy5fYmxvY2tPZmZzZXQ9MDtmb3IodmFyIGk9MDtpPDQ7KytpKXRoaXMuX2xlbmd0aFtpXT0wO3JldHVybiBkaWdlc3R9LEhhc2hCYXNlLnByb3RvdHlwZS5fZGlnZXN0PWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJfZGlnZXN0IGlzIG5vdCBpbXBsZW1lbnRlZCIpfSxtb2R1bGUuZXhwb3J0cz1IYXNoQmFzZX0sIi4uLy4uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoLmpzIihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pe3ZhciBoYXNoPWV4cG9ydHM7aGFzaC51dGlscz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaGFzaC5qcy9saWIvaGFzaC91dGlscy5qcyIpLGhhc2guY29tbW9uPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL2NvbW1vbi5qcyIpLGhhc2guc2hhPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3NoYS5qcyIpLGhhc2gucmlwZW1kPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3JpcGVtZC5qcyIpLGhhc2guaG1hYz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaGFzaC5qcy9saWIvaGFzaC9obWFjLmpzIiksaGFzaC5zaGExPWhhc2guc2hhLnNoYTEsaGFzaC5zaGEyNTY9aGFzaC5zaGEuc2hhMjU2LGhhc2guc2hhMjI0PWhhc2guc2hhLnNoYTIyNCxoYXNoLnNoYTM4ND1oYXNoLnNoYS5zaGEzODQsaGFzaC5zaGE1MTI9aGFzaC5zaGEuc2hhNTEyLGhhc2gucmlwZW1kMTYwPWhhc2gucmlwZW1kLnJpcGVtZDE2MH0sIi4uLy4uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL2NvbW1vbi5qcyIoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIHV0aWxzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3V0aWxzLmpzIiksYXNzZXJ0PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9taW5pbWFsaXN0aWMtYXNzZXJ0L2luZGV4LmpzIik7ZnVuY3Rpb24gQmxvY2tIYXNoKCl7dGhpcy5wZW5kaW5nPW51bGwsdGhpcy5wZW5kaW5nVG90YWw9MCx0aGlzLmJsb2NrU2l6ZT10aGlzLmNvbnN0cnVjdG9yLmJsb2NrU2l6ZSx0aGlzLm91dFNpemU9dGhpcy5jb25zdHJ1Y3Rvci5vdXRTaXplLHRoaXMuaG1hY1N0cmVuZ3RoPXRoaXMuY29uc3RydWN0b3IuaG1hY1N0cmVuZ3RoLHRoaXMucGFkTGVuZ3RoPXRoaXMuY29uc3RydWN0b3IucGFkTGVuZ3RoLzgsdGhpcy5lbmRpYW49ImJpZyIsdGhpcy5fZGVsdGE4PXRoaXMuYmxvY2tTaXplLzgsdGhpcy5fZGVsdGEzMj10aGlzLmJsb2NrU2l6ZS8zMn1leHBvcnRzLkJsb2NrSGFzaD1CbG9ja0hhc2gsQmxvY2tIYXNoLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24gdXBkYXRlKG1zZyxlbmMpe2lmKG1zZz11dGlscy50b0FycmF5KG1zZyxlbmMpLHRoaXMucGVuZGluZz90aGlzLnBlbmRpbmc9dGhpcy5wZW5kaW5nLmNvbmNhdChtc2cpOnRoaXMucGVuZGluZz1tc2csdGhpcy5wZW5kaW5nVG90YWwrPW1zZy5sZW5ndGgsdGhpcy5wZW5kaW5nLmxlbmd0aD49dGhpcy5fZGVsdGE4KXt2YXIgcj0obXNnPXRoaXMucGVuZGluZykubGVuZ3RoJXRoaXMuX2RlbHRhODt0aGlzLnBlbmRpbmc9bXNnLnNsaWNlKG1zZy5sZW5ndGgtcixtc2cubGVuZ3RoKSwwPT09dGhpcy5wZW5kaW5nLmxlbmd0aCYmKHRoaXMucGVuZGluZz1udWxsKSxtc2c9dXRpbHMuam9pbjMyKG1zZywwLG1zZy5sZW5ndGgtcix0aGlzLmVuZGlhbik7Zm9yKHZhciBpPTA7aTxtc2cubGVuZ3RoO2krPXRoaXMuX2RlbHRhMzIpdGhpcy5fdXBkYXRlKG1zZyxpLGkrdGhpcy5fZGVsdGEzMil9cmV0dXJuIHRoaXN9LEJsb2NrSGFzaC5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uIGRpZ2VzdChlbmMpe3JldHVybiB0aGlzLnVwZGF0ZSh0aGlzLl9wYWQoKSksYXNzZXJ0KG51bGw9PT10aGlzLnBlbmRpbmcpLHRoaXMuX2RpZ2VzdChlbmMpfSxCbG9ja0hhc2gucHJvdG90eXBlLl9wYWQ9ZnVuY3Rpb24gcGFkKCl7dmFyIGxlbj10aGlzLnBlbmRpbmdUb3RhbCxieXRlcz10aGlzLl9kZWx0YTgsaz1ieXRlcy0obGVuK3RoaXMucGFkTGVuZ3RoKSVieXRlcyxyZXM9bmV3IEFycmF5KGsrdGhpcy5wYWRMZW5ndGgpO3Jlc1swXT0xMjg7Zm9yKHZhciBpPTE7aTxrO2krKylyZXNbaV09MDtpZihsZW48PD0zLCJiaWciPT09dGhpcy5lbmRpYW4pe2Zvcih2YXIgdD04O3Q8dGhpcy5wYWRMZW5ndGg7dCsrKXJlc1tpKytdPTA7cmVzW2krK109MCxyZXNbaSsrXT0wLHJlc1tpKytdPTAscmVzW2krK109MCxyZXNbaSsrXT1sZW4+Pj4yNCYyNTUscmVzW2krK109bGVuPj4+MTYmMjU1LHJlc1tpKytdPWxlbj4+PjgmMjU1LHJlc1tpKytdPTI1NSZsZW59ZWxzZSBmb3IocmVzW2krK109MjU1JmxlbixyZXNbaSsrXT1sZW4+Pj44JjI1NSxyZXNbaSsrXT1sZW4+Pj4xNiYyNTUscmVzW2krK109bGVuPj4+MjQmMjU1LHJlc1tpKytdPTAscmVzW2krK109MCxyZXNbaSsrXT0wLHJlc1tpKytdPTAsdD04O3Q8dGhpcy5wYWRMZW5ndGg7dCsrKXJlc1tpKytdPTA7cmV0dXJuIHJlc319LCIuLi8uLi9ub2RlX21vZHVsZXMvaGFzaC5qcy9saWIvaGFzaC9obWFjLmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgdXRpbHM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2hhc2guanMvbGliL2hhc2gvdXRpbHMuanMiKSxhc3NlcnQ9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL21pbmltYWxpc3RpYy1hc3NlcnQvaW5kZXguanMiKTtmdW5jdGlvbiBIbWFjKGhhc2gsa2V5LGVuYyl7aWYoISh0aGlzIGluc3RhbmNlb2YgSG1hYykpcmV0dXJuIG5ldyBIbWFjKGhhc2gsa2V5LGVuYyk7dGhpcy5IYXNoPWhhc2gsdGhpcy5ibG9ja1NpemU9aGFzaC5ibG9ja1NpemUvOCx0aGlzLm91dFNpemU9aGFzaC5vdXRTaXplLzgsdGhpcy5pbm5lcj1udWxsLHRoaXMub3V0ZXI9bnVsbCx0aGlzLl9pbml0KHV0aWxzLnRvQXJyYXkoa2V5LGVuYykpfW1vZHVsZS5leHBvcnRzPUhtYWMsSG1hYy5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24gaW5pdChrZXkpe2tleS5sZW5ndGg+dGhpcy5ibG9ja1NpemUmJihrZXk9KG5ldyB0aGlzLkhhc2gpLnVwZGF0ZShrZXkpLmRpZ2VzdCgpKSxhc3NlcnQoa2V5Lmxlbmd0aDw9dGhpcy5ibG9ja1NpemUpO2Zvcih2YXIgaT1rZXkubGVuZ3RoO2k8dGhpcy5ibG9ja1NpemU7aSsrKWtleS5wdXNoKDApO2ZvcihpPTA7aTxrZXkubGVuZ3RoO2krKylrZXlbaV1ePTU0O2Zvcih0aGlzLmlubmVyPShuZXcgdGhpcy5IYXNoKS51cGRhdGUoa2V5KSxpPTA7aTxrZXkubGVuZ3RoO2krKylrZXlbaV1ePTEwNjt0aGlzLm91dGVyPShuZXcgdGhpcy5IYXNoKS51cGRhdGUoa2V5KX0sSG1hYy5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uIHVwZGF0ZShtc2csZW5jKXtyZXR1cm4gdGhpcy5pbm5lci51cGRhdGUobXNnLGVuYyksdGhpc30sSG1hYy5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uIGRpZ2VzdChlbmMpe3JldHVybiB0aGlzLm91dGVyLnVwZGF0ZSh0aGlzLmlubmVyLmRpZ2VzdCgpKSx0aGlzLm91dGVyLmRpZ2VzdChlbmMpfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3JpcGVtZC5qcyIoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIHV0aWxzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3V0aWxzLmpzIiksY29tbW9uPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL2NvbW1vbi5qcyIpLHJvdGwzMj11dGlscy5yb3RsMzIsc3VtMzI9dXRpbHMuc3VtMzIsc3VtMzJfMz11dGlscy5zdW0zMl8zLHN1bTMyXzQ9dXRpbHMuc3VtMzJfNCxCbG9ja0hhc2g9Y29tbW9uLkJsb2NrSGFzaDtmdW5jdGlvbiBSSVBFTUQxNjAoKXtpZighKHRoaXMgaW5zdGFuY2VvZiBSSVBFTUQxNjApKXJldHVybiBuZXcgUklQRU1EMTYwO0Jsb2NrSGFzaC5jYWxsKHRoaXMpLHRoaXMuaD1bMTczMjU4NDE5Myw0MDIzMjMzNDE3LDI1NjIzODMxMDIsMjcxNzMzODc4LDMyODUzNzc1MjBdLHRoaXMuZW5kaWFuPSJsaXR0bGUifWZ1bmN0aW9uIGYoaix4LHkseil7cmV0dXJuIGo8PTE1P3heeV56Omo8PTMxP3gmeXx+eCZ6Omo8PTQ3Pyh4fH55KV56Omo8PTYzP3gmenx5Jn56OnheKHl8fnopfWZ1bmN0aW9uIEsoail7cmV0dXJuIGo8PTE1PzA6ajw9MzE/MTUxODUwMDI0OTpqPD00Nz8xODU5Nzc1MzkzOmo8PTYzPzI0MDA5NTk3MDg6Mjg0MDg1MzgzOH1mdW5jdGlvbiBLaChqKXtyZXR1cm4gajw9MTU/MTM1MjgyOTkyNjpqPD0zMT8xNTQ4NjAzNjg0Omo8PTQ3PzE4MzYwNzI2OTE6ajw9NjM/MjA1Mzk5NDIxNzowfXV0aWxzLmluaGVyaXRzKFJJUEVNRDE2MCxCbG9ja0hhc2gpLGV4cG9ydHMucmlwZW1kMTYwPVJJUEVNRDE2MCxSSVBFTUQxNjAuYmxvY2tTaXplPTUxMixSSVBFTUQxNjAub3V0U2l6ZT0xNjAsUklQRU1EMTYwLmhtYWNTdHJlbmd0aD0xOTIsUklQRU1EMTYwLnBhZExlbmd0aD02NCxSSVBFTUQxNjAucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24gdXBkYXRlKG1zZyxzdGFydCl7Zm9yKHZhciBBPXRoaXMuaFswXSxCPXRoaXMuaFsxXSxDPXRoaXMuaFsyXSxEPXRoaXMuaFszXSxFPXRoaXMuaFs0XSxBaD1BLEJoPUIsQ2g9QyxEaD1ELEVoPUUsaj0wO2o8ODA7aisrKXt2YXIgVD1zdW0zMihyb3RsMzIoc3VtMzJfNChBLGYoaixCLEMsRCksbXNnW3Jbal0rc3RhcnRdLEsoaikpLHNbal0pLEUpO0E9RSxFPUQsRD1yb3RsMzIoQywxMCksQz1CLEI9VCxUPXN1bTMyKHJvdGwzMihzdW0zMl80KEFoLGYoNzktaixCaCxDaCxEaCksbXNnW3JoW2pdK3N0YXJ0XSxLaChqKSksc2hbal0pLEVoKSxBaD1FaCxFaD1EaCxEaD1yb3RsMzIoQ2gsMTApLENoPUJoLEJoPVR9VD1zdW0zMl8zKHRoaXMuaFsxXSxDLERoKSx0aGlzLmhbMV09c3VtMzJfMyh0aGlzLmhbMl0sRCxFaCksdGhpcy5oWzJdPXN1bTMyXzModGhpcy5oWzNdLEUsQWgpLHRoaXMuaFszXT1zdW0zMl8zKHRoaXMuaFs0XSxBLEJoKSx0aGlzLmhbNF09c3VtMzJfMyh0aGlzLmhbMF0sQixDaCksdGhpcy5oWzBdPVR9LFJJUEVNRDE2MC5wcm90b3R5cGUuX2RpZ2VzdD1mdW5jdGlvbiBkaWdlc3QoZW5jKXtyZXR1cm4iaGV4Ij09PWVuYz91dGlscy50b0hleDMyKHRoaXMuaCwibGl0dGxlIik6dXRpbHMuc3BsaXQzMih0aGlzLmgsImxpdHRsZSIpfTt2YXIgcj1bMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSw3LDQsMTMsMSwxMCw2LDE1LDMsMTIsMCw5LDUsMiwxNCwxMSw4LDMsMTAsMTQsNCw5LDE1LDgsMSwyLDcsMCw2LDEzLDExLDUsMTIsMSw5LDExLDEwLDAsOCwxMiw0LDEzLDMsNywxNSwxNCw1LDYsMiw0LDAsNSw5LDcsMTIsMiwxMCwxNCwxLDMsOCwxMSw2LDE1LDEzXSxyaD1bNSwxNCw3LDAsOSwyLDExLDQsMTMsNiwxNSw4LDEsMTAsMywxMiw2LDExLDMsNywwLDEzLDUsMTAsMTQsMTUsOCwxMiw0LDksMSwyLDE1LDUsMSwzLDcsMTQsNiw5LDExLDgsMTIsMiwxMCwwLDQsMTMsOCw2LDQsMSwzLDExLDE1LDAsNSwxMiwyLDEzLDksNywxMCwxNCwxMiwxNSwxMCw0LDEsNSw4LDcsNiwyLDEzLDE0LDAsMyw5LDExXSxzPVsxMSwxNCwxNSwxMiw1LDgsNyw5LDExLDEzLDE0LDE1LDYsNyw5LDgsNyw2LDgsMTMsMTEsOSw3LDE1LDcsMTIsMTUsOSwxMSw3LDEzLDEyLDExLDEzLDYsNywxNCw5LDEzLDE1LDE0LDgsMTMsNiw1LDEyLDcsNSwxMSwxMiwxNCwxNSwxNCwxNSw5LDgsOSwxNCw1LDYsOCw2LDUsMTIsOSwxNSw1LDExLDYsOCwxMywxMiw1LDEyLDEzLDE0LDExLDgsNSw2XSxzaD1bOCw5LDksMTEsMTMsMTUsMTUsNSw3LDcsOCwxMSwxNCwxNCwxMiw2LDksMTMsMTUsNywxMiw4LDksMTEsNyw3LDEyLDcsNiwxNSwxMywxMSw5LDcsMTUsMTEsOCw2LDYsMTQsMTIsMTMsNSwxNCwxMywxMyw3LDUsMTUsNSw4LDExLDE0LDE0LDYsMTQsNiw5LDEyLDksMTIsNSwxNSw4LDgsNSwxMiw5LDEyLDUsMTQsNiw4LDEzLDYsNSwxNSwxMywxMSwxMV19LCIuLi8uLi9ub2RlX21vZHVsZXMvaGFzaC5qcy9saWIvaGFzaC9zaGEuanMiKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO2V4cG9ydHMuc2hhMT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaGFzaC5qcy9saWIvaGFzaC9zaGEvMS5qcyIpLGV4cG9ydHMuc2hhMjI0PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3NoYS8yMjQuanMiKSxleHBvcnRzLnNoYTI1Nj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaGFzaC5qcy9saWIvaGFzaC9zaGEvMjU2LmpzIiksZXhwb3J0cy5zaGEzODQ9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2hhc2guanMvbGliL2hhc2gvc2hhLzM4NC5qcyIpLGV4cG9ydHMuc2hhNTEyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3NoYS81MTIuanMiKX0sIi4uLy4uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3NoYS8xLmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgdXRpbHM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2hhc2guanMvbGliL2hhc2gvdXRpbHMuanMiKSxjb21tb249X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2hhc2guanMvbGliL2hhc2gvY29tbW9uLmpzIiksc2hhQ29tbW9uPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3NoYS9jb21tb24uanMiKSxyb3RsMzI9dXRpbHMucm90bDMyLHN1bTMyPXV0aWxzLnN1bTMyLHN1bTMyXzU9dXRpbHMuc3VtMzJfNSxmdF8xPXNoYUNvbW1vbi5mdF8xLEJsb2NrSGFzaD1jb21tb24uQmxvY2tIYXNoLHNoYTFfSz1bMTUxODUwMDI0OSwxODU5Nzc1MzkzLDI0MDA5NTk3MDgsMzM5NTQ2OTc4Ml07ZnVuY3Rpb24gU0hBMSgpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFNIQTEpKXJldHVybiBuZXcgU0hBMTtCbG9ja0hhc2guY2FsbCh0aGlzKSx0aGlzLmg9WzE3MzI1ODQxOTMsNDAyMzIzMzQxNywyNTYyMzgzMTAyLDI3MTczMzg3OCwzMjg1Mzc3NTIwXSx0aGlzLlc9bmV3IEFycmF5KDgwKX11dGlscy5pbmhlcml0cyhTSEExLEJsb2NrSGFzaCksbW9kdWxlLmV4cG9ydHM9U0hBMSxTSEExLmJsb2NrU2l6ZT01MTIsU0hBMS5vdXRTaXplPTE2MCxTSEExLmhtYWNTdHJlbmd0aD04MCxTSEExLnBhZExlbmd0aD02NCxTSEExLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uIF91cGRhdGUobXNnLHN0YXJ0KXtmb3IodmFyIFc9dGhpcy5XLGk9MDtpPDE2O2krKylXW2ldPW1zZ1tzdGFydCtpXTtmb3IoO2k8Vy5sZW5ndGg7aSsrKVdbaV09cm90bDMyKFdbaS0zXV5XW2ktOF1eV1tpLTE0XV5XW2ktMTZdLDEpO3ZhciBhPXRoaXMuaFswXSxiPXRoaXMuaFsxXSxjPXRoaXMuaFsyXSxkPXRoaXMuaFszXSxlPXRoaXMuaFs0XTtmb3IoaT0wO2k8Vy5sZW5ndGg7aSsrKXt2YXIgcz1+fihpLzIwKSx0PXN1bTMyXzUocm90bDMyKGEsNSksZnRfMShzLGIsYyxkKSxlLFdbaV0sc2hhMV9LW3NdKTtlPWQsZD1jLGM9cm90bDMyKGIsMzApLGI9YSxhPXR9dGhpcy5oWzBdPXN1bTMyKHRoaXMuaFswXSxhKSx0aGlzLmhbMV09c3VtMzIodGhpcy5oWzFdLGIpLHRoaXMuaFsyXT1zdW0zMih0aGlzLmhbMl0sYyksdGhpcy5oWzNdPXN1bTMyKHRoaXMuaFszXSxkKSx0aGlzLmhbNF09c3VtMzIodGhpcy5oWzRdLGUpfSxTSEExLnByb3RvdHlwZS5fZGlnZXN0PWZ1bmN0aW9uIGRpZ2VzdChlbmMpe3JldHVybiJoZXgiPT09ZW5jP3V0aWxzLnRvSGV4MzIodGhpcy5oLCJiaWciKTp1dGlscy5zcGxpdDMyKHRoaXMuaCwiYmlnIil9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2hhc2guanMvbGliL2hhc2gvc2hhLzIyNC5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIHV0aWxzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3V0aWxzLmpzIiksU0hBMjU2PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3NoYS8yNTYuanMiKTtmdW5jdGlvbiBTSEEyMjQoKXtpZighKHRoaXMgaW5zdGFuY2VvZiBTSEEyMjQpKXJldHVybiBuZXcgU0hBMjI0O1NIQTI1Ni5jYWxsKHRoaXMpLHRoaXMuaD1bMzIzODM3MTAzMiw5MTQxNTA2NjMsODEyNzAyOTk5LDQxNDQ5MTI2OTcsNDI5MDc3NTg1NywxNzUwNjAzMDI1LDE2OTQwNzY4MzksMzIwNDA3NTQyOF19dXRpbHMuaW5oZXJpdHMoU0hBMjI0LFNIQTI1NiksbW9kdWxlLmV4cG9ydHM9U0hBMjI0LFNIQTIyNC5ibG9ja1NpemU9NTEyLFNIQTIyNC5vdXRTaXplPTIyNCxTSEEyMjQuaG1hY1N0cmVuZ3RoPTE5MixTSEEyMjQucGFkTGVuZ3RoPTY0LFNIQTIyNC5wcm90b3R5cGUuX2RpZ2VzdD1mdW5jdGlvbiBkaWdlc3QoZW5jKXtyZXR1cm4iaGV4Ij09PWVuYz91dGlscy50b0hleDMyKHRoaXMuaC5zbGljZSgwLDcpLCJiaWciKTp1dGlscy5zcGxpdDMyKHRoaXMuaC5zbGljZSgwLDcpLCJiaWciKX19LCIuLi8uLi9ub2RlX21vZHVsZXMvaGFzaC5qcy9saWIvaGFzaC9zaGEvMjU2LmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgdXRpbHM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2hhc2guanMvbGliL2hhc2gvdXRpbHMuanMiKSxjb21tb249X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2hhc2guanMvbGliL2hhc2gvY29tbW9uLmpzIiksc2hhQ29tbW9uPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3NoYS9jb21tb24uanMiKSxhc3NlcnQ9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL21pbmltYWxpc3RpYy1hc3NlcnQvaW5kZXguanMiKSxzdW0zMj11dGlscy5zdW0zMixzdW0zMl80PXV0aWxzLnN1bTMyXzQsc3VtMzJfNT11dGlscy5zdW0zMl81LGNoMzI9c2hhQ29tbW9uLmNoMzIsbWFqMzI9c2hhQ29tbW9uLm1hajMyLHMwXzI1Nj1zaGFDb21tb24uczBfMjU2LHMxXzI1Nj1zaGFDb21tb24uczFfMjU2LGcwXzI1Nj1zaGFDb21tb24uZzBfMjU2LGcxXzI1Nj1zaGFDb21tb24uZzFfMjU2LEJsb2NrSGFzaD1jb21tb24uQmxvY2tIYXNoLHNoYTI1Nl9LPVsxMTE2MzUyNDA4LDE4OTk0NDc0NDEsMzA0OTMyMzQ3MSwzOTIxMDA5NTczLDk2MTk4NzE2MywxNTA4OTcwOTkzLDI0NTM2MzU3NDgsMjg3MDc2MzIyMSwzNjI0MzgxMDgwLDMxMDU5ODQwMSw2MDcyMjUyNzgsMTQyNjg4MTk4NywxOTI1MDc4Mzg4LDIxNjIwNzgyMDYsMjYxNDg4ODEwMywzMjQ4MjIyNTgwLDM4MzUzOTA0MDEsNDAyMjIyNDc3NCwyNjQzNDcwNzgsNjA0ODA3NjI4LDc3MDI1NTk4MywxMjQ5MTUwMTIyLDE1NTUwODE2OTIsMTk5NjA2NDk4NiwyNTU0MjIwODgyLDI4MjE4MzQzNDksMjk1Mjk5NjgwOCwzMjEwMzEzNjcxLDMzMzY1NzE4OTEsMzU4NDUyODcxMSwxMTM5MjY5OTMsMzM4MjQxODk1LDY2NjMwNzIwNSw3NzM1Mjk5MTIsMTI5NDc1NzM3MiwxMzk2MTgyMjkxLDE2OTUxODM3MDAsMTk4NjY2MTA1MSwyMTc3MDI2MzUwLDI0NTY5NTYwMzcsMjczMDQ4NTkyMSwyODIwMzAyNDExLDMyNTk3MzA4MDAsMzM0NTc2NDc3MSwzNTE2MDY1ODE3LDM2MDAzNTI4MDQsNDA5NDU3MTkwOSwyNzU0MjMzNDQsNDMwMjI3NzM0LDUwNjk0ODYxNiw2NTkwNjA1NTYsODgzOTk3ODc3LDk1ODEzOTU3MSwxMzIyODIyMjE4LDE1MzcwMDIwNjMsMTc0Nzg3Mzc3OSwxOTU1NTYyMjIyLDIwMjQxMDQ4MTUsMjIyNzczMDQ1MiwyMzYxODUyNDI0LDI0Mjg0MzY0NzQsMjc1NjczNDE4NywzMjA0MDMxNDc5LDMzMjkzMjUyOThdO2Z1bmN0aW9uIFNIQTI1Nigpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFNIQTI1NikpcmV0dXJuIG5ldyBTSEEyNTY7QmxvY2tIYXNoLmNhbGwodGhpcyksdGhpcy5oPVsxNzc5MDMzNzAzLDMxNDQxMzQyNzcsMTAxMzkwNDI0MiwyNzczNDgwNzYyLDEzNTk4OTMxMTksMjYwMDgyMjkyNCw1Mjg3MzQ2MzUsMTU0MTQ1OTIyNV0sdGhpcy5rPXNoYTI1Nl9LLHRoaXMuVz1uZXcgQXJyYXkoNjQpfXV0aWxzLmluaGVyaXRzKFNIQTI1NixCbG9ja0hhc2gpLG1vZHVsZS5leHBvcnRzPVNIQTI1NixTSEEyNTYuYmxvY2tTaXplPTUxMixTSEEyNTYub3V0U2l6ZT0yNTYsU0hBMjU2LmhtYWNTdHJlbmd0aD0xOTIsU0hBMjU2LnBhZExlbmd0aD02NCxTSEEyNTYucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24gX3VwZGF0ZShtc2csc3RhcnQpe2Zvcih2YXIgVz10aGlzLlcsaT0wO2k8MTY7aSsrKVdbaV09bXNnW3N0YXJ0K2ldO2Zvcig7aTxXLmxlbmd0aDtpKyspV1tpXT1zdW0zMl80KGcxXzI1NihXW2ktMl0pLFdbaS03XSxnMF8yNTYoV1tpLTE1XSksV1tpLTE2XSk7dmFyIGE9dGhpcy5oWzBdLGI9dGhpcy5oWzFdLGM9dGhpcy5oWzJdLGQ9dGhpcy5oWzNdLGU9dGhpcy5oWzRdLGY9dGhpcy5oWzVdLGc9dGhpcy5oWzZdLGg9dGhpcy5oWzddO2Zvcihhc3NlcnQodGhpcy5rLmxlbmd0aD09PVcubGVuZ3RoKSxpPTA7aTxXLmxlbmd0aDtpKyspe3ZhciBUMT1zdW0zMl81KGgsczFfMjU2KGUpLGNoMzIoZSxmLGcpLHRoaXMua1tpXSxXW2ldKSxUMj1zdW0zMihzMF8yNTYoYSksbWFqMzIoYSxiLGMpKTtoPWcsZz1mLGY9ZSxlPXN1bTMyKGQsVDEpLGQ9YyxjPWIsYj1hLGE9c3VtMzIoVDEsVDIpfXRoaXMuaFswXT1zdW0zMih0aGlzLmhbMF0sYSksdGhpcy5oWzFdPXN1bTMyKHRoaXMuaFsxXSxiKSx0aGlzLmhbMl09c3VtMzIodGhpcy5oWzJdLGMpLHRoaXMuaFszXT1zdW0zMih0aGlzLmhbM10sZCksdGhpcy5oWzRdPXN1bTMyKHRoaXMuaFs0XSxlKSx0aGlzLmhbNV09c3VtMzIodGhpcy5oWzVdLGYpLHRoaXMuaFs2XT1zdW0zMih0aGlzLmhbNl0sZyksdGhpcy5oWzddPXN1bTMyKHRoaXMuaFs3XSxoKX0sU0hBMjU2LnByb3RvdHlwZS5fZGlnZXN0PWZ1bmN0aW9uIGRpZ2VzdChlbmMpe3JldHVybiJoZXgiPT09ZW5jP3V0aWxzLnRvSGV4MzIodGhpcy5oLCJiaWciKTp1dGlscy5zcGxpdDMyKHRoaXMuaCwiYmlnIil9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2hhc2guanMvbGliL2hhc2gvc2hhLzM4NC5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIHV0aWxzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3V0aWxzLmpzIiksU0hBNTEyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3NoYS81MTIuanMiKTtmdW5jdGlvbiBTSEEzODQoKXtpZighKHRoaXMgaW5zdGFuY2VvZiBTSEEzODQpKXJldHVybiBuZXcgU0hBMzg0O1NIQTUxMi5jYWxsKHRoaXMpLHRoaXMuaD1bMzQxODA3MDM2NSwzMjM4MzcxMDMyLDE2NTQyNzAyNTAsOTE0MTUwNjYzLDI0Mzg1MjkzNzAsODEyNzAyOTk5LDM1NTQ2MjM2MCw0MTQ0OTEyNjk3LDE3MzE0MDU0MTUsNDI5MDc3NTg1NywyMzk0MTgwMjMxLDE3NTA2MDMwMjUsMzY3NTAwODUyNSwxNjk0MDc2ODM5LDEyMDMwNjI4MTMsMzIwNDA3NTQyOF19dXRpbHMuaW5oZXJpdHMoU0hBMzg0LFNIQTUxMiksbW9kdWxlLmV4cG9ydHM9U0hBMzg0LFNIQTM4NC5ibG9ja1NpemU9MTAyNCxTSEEzODQub3V0U2l6ZT0zODQsU0hBMzg0LmhtYWNTdHJlbmd0aD0xOTIsU0hBMzg0LnBhZExlbmd0aD0xMjgsU0hBMzg0LnByb3RvdHlwZS5fZGlnZXN0PWZ1bmN0aW9uIGRpZ2VzdChlbmMpe3JldHVybiJoZXgiPT09ZW5jP3V0aWxzLnRvSGV4MzIodGhpcy5oLnNsaWNlKDAsMTIpLCJiaWciKTp1dGlscy5zcGxpdDMyKHRoaXMuaC5zbGljZSgwLDEyKSwiYmlnIil9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2hhc2guanMvbGliL2hhc2gvc2hhLzUxMi5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIHV0aWxzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3V0aWxzLmpzIiksY29tbW9uPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL2NvbW1vbi5qcyIpLGFzc2VydD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbWluaW1hbGlzdGljLWFzc2VydC9pbmRleC5qcyIpLHJvdHI2NF9oaT11dGlscy5yb3RyNjRfaGkscm90cjY0X2xvPXV0aWxzLnJvdHI2NF9sbyxzaHI2NF9oaT11dGlscy5zaHI2NF9oaSxzaHI2NF9sbz11dGlscy5zaHI2NF9sbyxzdW02ND11dGlscy5zdW02NCxzdW02NF9oaT11dGlscy5zdW02NF9oaSxzdW02NF9sbz11dGlscy5zdW02NF9sbyxzdW02NF80X2hpPXV0aWxzLnN1bTY0XzRfaGksc3VtNjRfNF9sbz11dGlscy5zdW02NF80X2xvLHN1bTY0XzVfaGk9dXRpbHMuc3VtNjRfNV9oaSxzdW02NF81X2xvPXV0aWxzLnN1bTY0XzVfbG8sQmxvY2tIYXNoPWNvbW1vbi5CbG9ja0hhc2gsc2hhNTEyX0s9WzExMTYzNTI0MDgsMzYwOTc2NzQ1OCwxODk5NDQ3NDQxLDYwMjg5MTcyNSwzMDQ5MzIzNDcxLDM5NjQ0ODQzOTksMzkyMTAwOTU3MywyMTczMjk1NTQ4LDk2MTk4NzE2Myw0MDgxNjI4NDcyLDE1MDg5NzA5OTMsMzA1MzgzNDI2NSwyNDUzNjM1NzQ4LDI5Mzc2NzE1NzksMjg3MDc2MzIyMSwzNjY0NjA5NTYwLDM2MjQzODEwODAsMjczNDg4MzM5NCwzMTA1OTg0MDEsMTE2NDk5NjU0Miw2MDcyMjUyNzgsMTMyMzYxMDc2NCwxNDI2ODgxOTg3LDM1OTAzMDQ5OTQsMTkyNTA3ODM4OCw0MDY4MTgyMzgzLDIxNjIwNzgyMDYsOTkxMzM2MTEzLDI2MTQ4ODgxMDMsNjMzODAzMzE3LDMyNDgyMjI1ODAsMzQ3OTc3NDg2OCwzODM1MzkwNDAxLDI2NjY2MTM0NTgsNDAyMjIyNDc3NCw5NDQ3MTExMzksMjY0MzQ3MDc4LDIzNDEyNjI3NzMsNjA0ODA3NjI4LDIwMDc4MDA5MzMsNzcwMjU1OTgzLDE0OTU5OTA5MDEsMTI0OTE1MDEyMiwxODU2NDMxMjM1LDE1NTUwODE2OTIsMzE3NTIxODEzMiwxOTk2MDY0OTg2LDIxOTg5NTA4MzcsMjU1NDIyMDg4MiwzOTk5NzE5MzM5LDI4MjE4MzQzNDksNzY2Nzg0MDE2LDI5NTI5OTY4MDgsMjU2NjU5NDg3OSwzMjEwMzEzNjcxLDMyMDMzMzc5NTYsMzMzNjU3MTg5MSwxMDM0NDU3MDI2LDM1ODQ1Mjg3MTEsMjQ2Njk0ODkwMSwxMTM5MjY5OTMsMzc1ODMyNjM4MywzMzgyNDE4OTUsMTY4NzE3OTM2LDY2NjMwNzIwNSwxMTg4MTc5OTY0LDc3MzUyOTkxMiwxNTQ2MDQ1NzM0LDEyOTQ3NTczNzIsMTUyMjgwNTQ4NSwxMzk2MTgyMjkxLDI2NDM4MzM4MjMsMTY5NTE4MzcwMCwyMzQzNTI3MzkwLDE5ODY2NjEwNTEsMTAxNDQ3NzQ4MCwyMTc3MDI2MzUwLDEyMDY3NTkxNDIsMjQ1Njk1NjAzNywzNDQwNzc2MjcsMjczMDQ4NTkyMSwxMjkwODYzNDYwLDI4MjAzMDI0MTEsMzE1ODQ1NDI3MywzMjU5NzMwODAwLDM1MDU5NTI2NTcsMzM0NTc2NDc3MSwxMDYyMTcwMDgsMzUxNjA2NTgxNywzNjA2MDA4MzQ0LDM2MDAzNTI4MDQsMTQzMjcyNTc3Niw0MDk0NTcxOTA5LDE0NjcwMzE1OTQsMjc1NDIzMzQ0LDg1MTE2OTcyMCw0MzAyMjc3MzQsMzEwMDgyMzc1Miw1MDY5NDg2MTYsMTM2MzI1ODE5NSw2NTkwNjA1NTYsMzc1MDY4NTU5Myw4ODM5OTc4NzcsMzc4NTA1MDI4MCw5NTgxMzk1NzEsMzMxODMwNzQyNywxMzIyODIyMjE4LDM4MTI3MjM0MDMsMTUzNzAwMjA2MywyMDAzMDM0OTk1LDE3NDc4NzM3NzksMzYwMjAzNjg5OSwxOTU1NTYyMjIyLDE1NzU5OTAwMTIsMjAyNDEwNDgxNSwxMTI1NTkyOTI4LDIyMjc3MzA0NTIsMjcxNjkwNDMwNiwyMzYxODUyNDI0LDQ0Mjc3NjA0NCwyNDI4NDM2NDc0LDU5MzY5ODM0NCwyNzU2NzM0MTg3LDM3MzMxMTAyNDksMzIwNDAzMTQ3OSwyOTk5MzUxNTczLDMzMjkzMjUyOTgsMzgxNTkyMDQyNywzMzkxNTY5NjE0LDM5MjgzODM5MDAsMzUxNTI2NzI3MSw1NjYyODA3MTEsMzk0MDE4NzYwNiwzNDU0MDY5NTM0LDQxMTg2MzAyNzEsNDAwMDIzOTk5MiwxMTY0MTg0NzQsMTkxNDEzODU1NCwxNzQyOTI0MjEsMjczMTA1NTI3MCwyODkzODAzNTYsMzIwMzk5MzAwNiw0NjAzOTMyNjksMzIwNjIwMzE1LDY4NTQ3MTczMyw1ODc0OTY4MzYsODUyMTQyOTcxLDEwODY3OTI4NTEsMTAxNzAzNjI5OCwzNjU1NDMxMDAsMTEyNjAwMDU4MCwyNjE4Mjk3Njc2LDEyODgwMzM0NzAsMzQwOTg1NTE1OCwxNTAxNTA1OTQ4LDQyMzQ1MDk4NjYsMTYwNzE2NzkxNSw5ODcxNjc0NjgsMTgxNjQwMjMxNiwxMjQ2MTg5NTkxXTtmdW5jdGlvbiBTSEE1MTIoKXtpZighKHRoaXMgaW5zdGFuY2VvZiBTSEE1MTIpKXJldHVybiBuZXcgU0hBNTEyO0Jsb2NrSGFzaC5jYWxsKHRoaXMpLHRoaXMuaD1bMTc3OTAzMzcwMyw0MDg5MjM1NzIwLDMxNDQxMzQyNzcsMjIyNzg3MzU5NSwxMDEzOTA0MjQyLDQyNzExNzU3MjMsMjc3MzQ4MDc2MiwxNTk1NzUwMTI5LDEzNTk4OTMxMTksMjkxNzU2NTEzNywyNjAwODIyOTI0LDcyNTUxMTE5OSw1Mjg3MzQ2MzUsNDIxNTM4OTU0NywxNTQxNDU5MjI1LDMyNzAzMzIwOV0sdGhpcy5rPXNoYTUxMl9LLHRoaXMuVz1uZXcgQXJyYXkoMTYwKX1mdW5jdGlvbiBjaDY0X2hpKHhoLHhsLHloLHlsLHpoKXt2YXIgcj14aCZ5aF5+eGgmemg7cmV0dXJuIHI8MCYmKHIrPTQyOTQ5NjcyOTYpLHJ9ZnVuY3Rpb24gY2g2NF9sbyh4aCx4bCx5aCx5bCx6aCx6bCl7dmFyIHI9eGwmeWxefnhsJnpsO3JldHVybiByPDAmJihyKz00Mjk0OTY3Mjk2KSxyfWZ1bmN0aW9uIG1hajY0X2hpKHhoLHhsLHloLHlsLHpoKXt2YXIgcj14aCZ5aF54aCZ6aF55aCZ6aDtyZXR1cm4gcjwwJiYocis9NDI5NDk2NzI5Nikscn1mdW5jdGlvbiBtYWo2NF9sbyh4aCx4bCx5aCx5bCx6aCx6bCl7dmFyIHI9eGwmeWxeeGwmemxeeWwmemw7cmV0dXJuIHI8MCYmKHIrPTQyOTQ5NjcyOTYpLHJ9ZnVuY3Rpb24gczBfNTEyX2hpKHhoLHhsKXt2YXIgcj1yb3RyNjRfaGkoeGgseGwsMjgpXnJvdHI2NF9oaSh4bCx4aCwyKV5yb3RyNjRfaGkoeGwseGgsNyk7cmV0dXJuIHI8MCYmKHIrPTQyOTQ5NjcyOTYpLHJ9ZnVuY3Rpb24gczBfNTEyX2xvKHhoLHhsKXt2YXIgcj1yb3RyNjRfbG8oeGgseGwsMjgpXnJvdHI2NF9sbyh4bCx4aCwyKV5yb3RyNjRfbG8oeGwseGgsNyk7cmV0dXJuIHI8MCYmKHIrPTQyOTQ5NjcyOTYpLHJ9ZnVuY3Rpb24gczFfNTEyX2hpKHhoLHhsKXt2YXIgcj1yb3RyNjRfaGkoeGgseGwsMTQpXnJvdHI2NF9oaSh4aCx4bCwxOClecm90cjY0X2hpKHhsLHhoLDkpO3JldHVybiByPDAmJihyKz00Mjk0OTY3Mjk2KSxyfWZ1bmN0aW9uIHMxXzUxMl9sbyh4aCx4bCl7dmFyIHI9cm90cjY0X2xvKHhoLHhsLDE0KV5yb3RyNjRfbG8oeGgseGwsMTgpXnJvdHI2NF9sbyh4bCx4aCw5KTtyZXR1cm4gcjwwJiYocis9NDI5NDk2NzI5Nikscn1mdW5jdGlvbiBnMF81MTJfaGkoeGgseGwpe3ZhciByPXJvdHI2NF9oaSh4aCx4bCwxKV5yb3RyNjRfaGkoeGgseGwsOClec2hyNjRfaGkoeGgseGwsNyk7cmV0dXJuIHI8MCYmKHIrPTQyOTQ5NjcyOTYpLHJ9ZnVuY3Rpb24gZzBfNTEyX2xvKHhoLHhsKXt2YXIgcj1yb3RyNjRfbG8oeGgseGwsMSlecm90cjY0X2xvKHhoLHhsLDgpXnNocjY0X2xvKHhoLHhsLDcpO3JldHVybiByPDAmJihyKz00Mjk0OTY3Mjk2KSxyfWZ1bmN0aW9uIGcxXzUxMl9oaSh4aCx4bCl7dmFyIHI9cm90cjY0X2hpKHhoLHhsLDE5KV5yb3RyNjRfaGkoeGwseGgsMjkpXnNocjY0X2hpKHhoLHhsLDYpO3JldHVybiByPDAmJihyKz00Mjk0OTY3Mjk2KSxyfWZ1bmN0aW9uIGcxXzUxMl9sbyh4aCx4bCl7dmFyIHI9cm90cjY0X2xvKHhoLHhsLDE5KV5yb3RyNjRfbG8oeGwseGgsMjkpXnNocjY0X2xvKHhoLHhsLDYpO3JldHVybiByPDAmJihyKz00Mjk0OTY3Mjk2KSxyfXV0aWxzLmluaGVyaXRzKFNIQTUxMixCbG9ja0hhc2gpLG1vZHVsZS5leHBvcnRzPVNIQTUxMixTSEE1MTIuYmxvY2tTaXplPTEwMjQsU0hBNTEyLm91dFNpemU9NTEyLFNIQTUxMi5obWFjU3RyZW5ndGg9MTkyLFNIQTUxMi5wYWRMZW5ndGg9MTI4LFNIQTUxMi5wcm90b3R5cGUuX3ByZXBhcmVCbG9jaz1mdW5jdGlvbiBfcHJlcGFyZUJsb2NrKG1zZyxzdGFydCl7Zm9yKHZhciBXPXRoaXMuVyxpPTA7aTwzMjtpKyspV1tpXT1tc2dbc3RhcnQraV07Zm9yKDtpPFcubGVuZ3RoO2krPTIpe3ZhciBjMF9oaT1nMV81MTJfaGkoV1tpLTRdLFdbaS0zXSksYzBfbG89ZzFfNTEyX2xvKFdbaS00XSxXW2ktM10pLGMxX2hpPVdbaS0xNF0sYzFfbG89V1tpLTEzXSxjMl9oaT1nMF81MTJfaGkoV1tpLTMwXSxXW2ktMjldKSxjMl9sbz1nMF81MTJfbG8oV1tpLTMwXSxXW2ktMjldKSxjM19oaT1XW2ktMzJdLGMzX2xvPVdbaS0zMV07V1tpXT1zdW02NF80X2hpKGMwX2hpLGMwX2xvLGMxX2hpLGMxX2xvLGMyX2hpLGMyX2xvLGMzX2hpLGMzX2xvKSxXW2krMV09c3VtNjRfNF9sbyhjMF9oaSxjMF9sbyxjMV9oaSxjMV9sbyxjMl9oaSxjMl9sbyxjM19oaSxjM19sbyl9fSxTSEE1MTIucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24gX3VwZGF0ZShtc2csc3RhcnQpe3RoaXMuX3ByZXBhcmVCbG9jayhtc2csc3RhcnQpO3ZhciBXPXRoaXMuVyxhaD10aGlzLmhbMF0sYWw9dGhpcy5oWzFdLGJoPXRoaXMuaFsyXSxibD10aGlzLmhbM10sY2g9dGhpcy5oWzRdLGNsPXRoaXMuaFs1XSxkaD10aGlzLmhbNl0sZGw9dGhpcy5oWzddLGVoPXRoaXMuaFs4XSxlbD10aGlzLmhbOV0sZmg9dGhpcy5oWzEwXSxmbD10aGlzLmhbMTFdLGdoPXRoaXMuaFsxMl0sZ2w9dGhpcy5oWzEzXSxoaD10aGlzLmhbMTRdLGhsPXRoaXMuaFsxNV07YXNzZXJ0KHRoaXMuay5sZW5ndGg9PT1XLmxlbmd0aCk7Zm9yKHZhciBpPTA7aTxXLmxlbmd0aDtpKz0yKXt2YXIgYzBfaGk9aGgsYzBfbG89aGwsYzFfaGk9czFfNTEyX2hpKGVoLGVsKSxjMV9sbz1zMV81MTJfbG8oZWgsZWwpLGMyX2hpPWNoNjRfaGkoZWgsZWwsZmgsZmwsZ2gpLGMyX2xvPWNoNjRfbG8oZWgsZWwsZmgsZmwsZ2gsZ2wpLGMzX2hpPXRoaXMua1tpXSxjM19sbz10aGlzLmtbaSsxXSxjNF9oaT1XW2ldLGM0X2xvPVdbaSsxXSxUMV9oaT1zdW02NF81X2hpKGMwX2hpLGMwX2xvLGMxX2hpLGMxX2xvLGMyX2hpLGMyX2xvLGMzX2hpLGMzX2xvLGM0X2hpLGM0X2xvKSxUMV9sbz1zdW02NF81X2xvKGMwX2hpLGMwX2xvLGMxX2hpLGMxX2xvLGMyX2hpLGMyX2xvLGMzX2hpLGMzX2xvLGM0X2hpLGM0X2xvKTtjMF9oaT1zMF81MTJfaGkoYWgsYWwpLGMwX2xvPXMwXzUxMl9sbyhhaCxhbCksYzFfaGk9bWFqNjRfaGkoYWgsYWwsYmgsYmwsY2gpLGMxX2xvPW1hajY0X2xvKGFoLGFsLGJoLGJsLGNoLGNsKTt2YXIgVDJfaGk9c3VtNjRfaGkoYzBfaGksYzBfbG8sYzFfaGksYzFfbG8pLFQyX2xvPXN1bTY0X2xvKGMwX2hpLGMwX2xvLGMxX2hpLGMxX2xvKTtoaD1naCxobD1nbCxnaD1maCxnbD1mbCxmaD1laCxmbD1lbCxlaD1zdW02NF9oaShkaCxkbCxUMV9oaSxUMV9sbyksZWw9c3VtNjRfbG8oZGwsZGwsVDFfaGksVDFfbG8pLGRoPWNoLGRsPWNsLGNoPWJoLGNsPWJsLGJoPWFoLGJsPWFsLGFoPXN1bTY0X2hpKFQxX2hpLFQxX2xvLFQyX2hpLFQyX2xvKSxhbD1zdW02NF9sbyhUMV9oaSxUMV9sbyxUMl9oaSxUMl9sbyl9c3VtNjQodGhpcy5oLDAsYWgsYWwpLHN1bTY0KHRoaXMuaCwyLGJoLGJsKSxzdW02NCh0aGlzLmgsNCxjaCxjbCksc3VtNjQodGhpcy5oLDYsZGgsZGwpLHN1bTY0KHRoaXMuaCw4LGVoLGVsKSxzdW02NCh0aGlzLmgsMTAsZmgsZmwpLHN1bTY0KHRoaXMuaCwxMixnaCxnbCksc3VtNjQodGhpcy5oLDE0LGhoLGhsKX0sU0hBNTEyLnByb3RvdHlwZS5fZGlnZXN0PWZ1bmN0aW9uIGRpZ2VzdChlbmMpe3JldHVybiJoZXgiPT09ZW5jP3V0aWxzLnRvSGV4MzIodGhpcy5oLCJiaWciKTp1dGlscy5zcGxpdDMyKHRoaXMuaCwiYmlnIil9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2hhc2guanMvbGliL2hhc2gvc2hhL2NvbW1vbi5qcyIoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIHJvdHIzMj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaGFzaC5qcy9saWIvaGFzaC91dGlscy5qcyIpLnJvdHIzMjtmdW5jdGlvbiBjaDMyKHgseSx6KXtyZXR1cm4geCZ5Xn54Jnp9ZnVuY3Rpb24gbWFqMzIoeCx5LHope3JldHVybiB4JnleeCZ6Xnkmen1mdW5jdGlvbiBwMzIoeCx5LHope3JldHVybiB4Xnleen1leHBvcnRzLmZ0XzE9ZnVuY3Rpb24gZnRfMShzLHgseSx6KXtyZXR1cm4gMD09PXM/Y2gzMih4LHkseik6MT09PXN8fDM9PT1zP3AzMih4LHkseik6Mj09PXM/bWFqMzIoeCx5LHopOnZvaWQgMH0sZXhwb3J0cy5jaDMyPWNoMzIsZXhwb3J0cy5tYWozMj1tYWozMixleHBvcnRzLnAzMj1wMzIsZXhwb3J0cy5zMF8yNTY9ZnVuY3Rpb24gczBfMjU2KHgpe3JldHVybiByb3RyMzIoeCwyKV5yb3RyMzIoeCwxMylecm90cjMyKHgsMjIpfSxleHBvcnRzLnMxXzI1Nj1mdW5jdGlvbiBzMV8yNTYoeCl7cmV0dXJuIHJvdHIzMih4LDYpXnJvdHIzMih4LDExKV5yb3RyMzIoeCwyNSl9LGV4cG9ydHMuZzBfMjU2PWZ1bmN0aW9uIGcwXzI1Nih4KXtyZXR1cm4gcm90cjMyKHgsNylecm90cjMyKHgsMTgpXng+Pj4zfSxleHBvcnRzLmcxXzI1Nj1mdW5jdGlvbiBnMV8yNTYoeCl7cmV0dXJuIHJvdHIzMih4LDE3KV5yb3RyMzIoeCwxOSleeD4+PjEwfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3V0aWxzLmpzIihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgYXNzZXJ0PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9taW5pbWFsaXN0aWMtYXNzZXJ0L2luZGV4LmpzIiksaW5oZXJpdHM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiKTtmdW5jdGlvbiBpc1N1cnJvZ2F0ZVBhaXIobXNnLGkpe3JldHVybiA1NTI5Nj09KDY0NTEyJm1zZy5jaGFyQ29kZUF0KGkpKSYmKCEoaTwwfHxpKzE+PW1zZy5sZW5ndGgpJiY1NjMyMD09KDY0NTEyJm1zZy5jaGFyQ29kZUF0KGkrMSkpKX1mdW5jdGlvbiBodG9ubCh3KXtyZXR1cm4odz4+PjI0fHc+Pj44JjY1MjgwfHc8PDgmMTY3MTE2ODB8KDI1NSZ3KTw8MjQpPj4+MH1mdW5jdGlvbiB6ZXJvMih3b3JkKXtyZXR1cm4gMT09PXdvcmQubGVuZ3RoPyIwIit3b3JkOndvcmR9ZnVuY3Rpb24gemVybzgod29yZCl7cmV0dXJuIDc9PT13b3JkLmxlbmd0aD8iMCIrd29yZDo2PT09d29yZC5sZW5ndGg/IjAwIit3b3JkOjU9PT13b3JkLmxlbmd0aD8iMDAwIit3b3JkOjQ9PT13b3JkLmxlbmd0aD8iMDAwMCIrd29yZDozPT09d29yZC5sZW5ndGg/IjAwMDAwIit3b3JkOjI9PT13b3JkLmxlbmd0aD8iMDAwMDAwIit3b3JkOjE9PT13b3JkLmxlbmd0aD8iMDAwMDAwMCIrd29yZDp3b3JkfWV4cG9ydHMuaW5oZXJpdHM9aW5oZXJpdHMsZXhwb3J0cy50b0FycmF5PWZ1bmN0aW9uIHRvQXJyYXkobXNnLGVuYyl7aWYoQXJyYXkuaXNBcnJheShtc2cpKXJldHVybiBtc2cuc2xpY2UoKTtpZighbXNnKXJldHVybltdO3ZhciByZXM9W107aWYoInN0cmluZyI9PXR5cGVvZiBtc2cpaWYoZW5jKXtpZigiaGV4Ij09PWVuYylmb3IoKG1zZz1tc2cucmVwbGFjZSgvW15hLXowLTldKy9naSwiIikpLmxlbmd0aCUyIT0wJiYobXNnPSIwIittc2cpLGk9MDtpPG1zZy5sZW5ndGg7aSs9MilyZXMucHVzaChwYXJzZUludChtc2dbaV0rbXNnW2krMV0sMTYpKX1lbHNlIGZvcih2YXIgcD0wLGk9MDtpPG1zZy5sZW5ndGg7aSsrKXt2YXIgYz1tc2cuY2hhckNvZGVBdChpKTtjPDEyOD9yZXNbcCsrXT1jOmM8MjA0OD8ocmVzW3ArK109Yz4+NnwxOTIscmVzW3ArK109NjMmY3wxMjgpOmlzU3Vycm9nYXRlUGFpcihtc2csaSk/KGM9NjU1MzYrKCgxMDIzJmMpPDwxMCkrKDEwMjMmbXNnLmNoYXJDb2RlQXQoKytpKSkscmVzW3ArK109Yz4+MTh8MjQwLHJlc1twKytdPWM+PjEyJjYzfDEyOCxyZXNbcCsrXT1jPj42JjYzfDEyOCxyZXNbcCsrXT02MyZjfDEyOCk6KHJlc1twKytdPWM+PjEyfDIyNCxyZXNbcCsrXT1jPj42JjYzfDEyOCxyZXNbcCsrXT02MyZjfDEyOCl9ZWxzZSBmb3IoaT0wO2k8bXNnLmxlbmd0aDtpKyspcmVzW2ldPTB8bXNnW2ldO3JldHVybiByZXN9LGV4cG9ydHMudG9IZXg9ZnVuY3Rpb24gdG9IZXgobXNnKXtmb3IodmFyIHJlcz0iIixpPTA7aTxtc2cubGVuZ3RoO2krKylyZXMrPXplcm8yKG1zZ1tpXS50b1N0cmluZygxNikpO3JldHVybiByZXN9LGV4cG9ydHMuaHRvbmw9aHRvbmwsZXhwb3J0cy50b0hleDMyPWZ1bmN0aW9uIHRvSGV4MzIobXNnLGVuZGlhbil7Zm9yKHZhciByZXM9IiIsaT0wO2k8bXNnLmxlbmd0aDtpKyspe3ZhciB3PW1zZ1tpXTsibGl0dGxlIj09PWVuZGlhbiYmKHc9aHRvbmwodykpLHJlcys9emVybzgody50b1N0cmluZygxNikpfXJldHVybiByZXN9LGV4cG9ydHMuemVybzI9emVybzIsZXhwb3J0cy56ZXJvOD16ZXJvOCxleHBvcnRzLmpvaW4zMj1mdW5jdGlvbiBqb2luMzIobXNnLHN0YXJ0LGVuZCxlbmRpYW4pe3ZhciBsZW49ZW5kLXN0YXJ0O2Fzc2VydChsZW4lND09MCk7Zm9yKHZhciByZXM9bmV3IEFycmF5KGxlbi80KSxpPTAsaz1zdGFydDtpPHJlcy5sZW5ndGg7aSsrLGsrPTQpe3ZhciB3O3c9ImJpZyI9PT1lbmRpYW4/bXNnW2tdPDwyNHxtc2dbaysxXTw8MTZ8bXNnW2srMl08PDh8bXNnW2srM106bXNnW2srM108PDI0fG1zZ1trKzJdPDwxNnxtc2dbaysxXTw8OHxtc2dba10scmVzW2ldPXc+Pj4wfXJldHVybiByZXN9LGV4cG9ydHMuc3BsaXQzMj1mdW5jdGlvbiBzcGxpdDMyKG1zZyxlbmRpYW4pe2Zvcih2YXIgcmVzPW5ldyBBcnJheSg0Km1zZy5sZW5ndGgpLGk9MCxrPTA7aTxtc2cubGVuZ3RoO2krKyxrKz00KXt2YXIgbT1tc2dbaV07ImJpZyI9PT1lbmRpYW4/KHJlc1trXT1tPj4+MjQscmVzW2srMV09bT4+PjE2JjI1NSxyZXNbaysyXT1tPj4+OCYyNTUscmVzW2srM109MjU1Jm0pOihyZXNbayszXT1tPj4+MjQscmVzW2srMl09bT4+PjE2JjI1NSxyZXNbaysxXT1tPj4+OCYyNTUscmVzW2tdPTI1NSZtKX1yZXR1cm4gcmVzfSxleHBvcnRzLnJvdHIzMj1mdW5jdGlvbiByb3RyMzIodyxiKXtyZXR1cm4gdz4+PmJ8dzw8MzItYn0sZXhwb3J0cy5yb3RsMzI9ZnVuY3Rpb24gcm90bDMyKHcsYil7cmV0dXJuIHc8PGJ8dz4+PjMyLWJ9LGV4cG9ydHMuc3VtMzI9ZnVuY3Rpb24gc3VtMzIoYSxiKXtyZXR1cm4gYStiPj4+MH0sZXhwb3J0cy5zdW0zMl8zPWZ1bmN0aW9uIHN1bTMyXzMoYSxiLGMpe3JldHVybiBhK2IrYz4+PjB9LGV4cG9ydHMuc3VtMzJfND1mdW5jdGlvbiBzdW0zMl80KGEsYixjLGQpe3JldHVybiBhK2IrYytkPj4+MH0sZXhwb3J0cy5zdW0zMl81PWZ1bmN0aW9uIHN1bTMyXzUoYSxiLGMsZCxlKXtyZXR1cm4gYStiK2MrZCtlPj4+MH0sZXhwb3J0cy5zdW02ND1mdW5jdGlvbiBzdW02NChidWYscG9zLGFoLGFsKXt2YXIgYmg9YnVmW3Bvc10sbG89YWwrYnVmW3BvcysxXT4+PjAsaGk9KGxvPGFsPzE6MCkrYWgrYmg7YnVmW3Bvc109aGk+Pj4wLGJ1Zltwb3MrMV09bG99LGV4cG9ydHMuc3VtNjRfaGk9ZnVuY3Rpb24gc3VtNjRfaGkoYWgsYWwsYmgsYmwpe3JldHVybihhbCtibD4+PjA8YWw/MTowKSthaCtiaD4+PjB9LGV4cG9ydHMuc3VtNjRfbG89ZnVuY3Rpb24gc3VtNjRfbG8oYWgsYWwsYmgsYmwpe3JldHVybiBhbCtibD4+PjB9LGV4cG9ydHMuc3VtNjRfNF9oaT1mdW5jdGlvbiBzdW02NF80X2hpKGFoLGFsLGJoLGJsLGNoLGNsLGRoLGRsKXt2YXIgY2Fycnk9MCxsbz1hbDtyZXR1cm4gY2FycnkrPShsbz1sbytibD4+PjApPGFsPzE6MCxjYXJyeSs9KGxvPWxvK2NsPj4+MCk8Y2w/MTowLGFoK2JoK2NoK2RoKyhjYXJyeSs9KGxvPWxvK2RsPj4+MCk8ZGw/MTowKT4+PjB9LGV4cG9ydHMuc3VtNjRfNF9sbz1mdW5jdGlvbiBzdW02NF80X2xvKGFoLGFsLGJoLGJsLGNoLGNsLGRoLGRsKXtyZXR1cm4gYWwrYmwrY2wrZGw+Pj4wfSxleHBvcnRzLnN1bTY0XzVfaGk9ZnVuY3Rpb24gc3VtNjRfNV9oaShhaCxhbCxiaCxibCxjaCxjbCxkaCxkbCxlaCxlbCl7dmFyIGNhcnJ5PTAsbG89YWw7cmV0dXJuIGNhcnJ5Kz0obG89bG8rYmw+Pj4wKTxhbD8xOjAsY2FycnkrPShsbz1sbytjbD4+PjApPGNsPzE6MCxjYXJyeSs9KGxvPWxvK2RsPj4+MCk8ZGw/MTowLGFoK2JoK2NoK2RoK2VoKyhjYXJyeSs9KGxvPWxvK2VsPj4+MCk8ZWw/MTowKT4+PjB9LGV4cG9ydHMuc3VtNjRfNV9sbz1mdW5jdGlvbiBzdW02NF81X2xvKGFoLGFsLGJoLGJsLGNoLGNsLGRoLGRsLGVoLGVsKXtyZXR1cm4gYWwrYmwrY2wrZGwrZWw+Pj4wfSxleHBvcnRzLnJvdHI2NF9oaT1mdW5jdGlvbiByb3RyNjRfaGkoYWgsYWwsbnVtKXtyZXR1cm4oYWw8PDMyLW51bXxhaD4+Pm51bSk+Pj4wfSxleHBvcnRzLnJvdHI2NF9sbz1mdW5jdGlvbiByb3RyNjRfbG8oYWgsYWwsbnVtKXtyZXR1cm4oYWg8PDMyLW51bXxhbD4+Pm51bSk+Pj4wfSxleHBvcnRzLnNocjY0X2hpPWZ1bmN0aW9uIHNocjY0X2hpKGFoLGFsLG51bSl7cmV0dXJuIGFoPj4+bnVtfSxleHBvcnRzLnNocjY0X2xvPWZ1bmN0aW9uIHNocjY0X2xvKGFoLGFsLG51bSl7cmV0dXJuKGFoPDwzMi1udW18YWw+Pj5udW0pPj4+MH19LCIuLi8uLi9ub2RlX21vZHVsZXMvaGFzb3duL2luZGV4LmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgY2FsbD1GdW5jdGlvbi5wcm90b3R5cGUuY2FsbCwkaGFzT3duPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksYmluZD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZnVuY3Rpb24tYmluZC9pbmRleC5qcyIpO21vZHVsZS5leHBvcnRzPWJpbmQuY2FsbChjYWxsLCRoYXNPd24pfSwiLi4vLi4vbm9kZV9tb2R1bGVzL2htYWMtZHJiZy9saWIvaG1hYy1kcmJnLmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgaGFzaD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaGFzaC5qcy9saWIvaGFzaC5qcyIpLHV0aWxzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9taW5pbWFsaXN0aWMtY3J5cHRvLXV0aWxzL2xpYi91dGlscy5qcyIpLGFzc2VydD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbWluaW1hbGlzdGljLWFzc2VydC9pbmRleC5qcyIpO2Z1bmN0aW9uIEhtYWNEUkJHKG9wdGlvbnMpe2lmKCEodGhpcyBpbnN0YW5jZW9mIEhtYWNEUkJHKSlyZXR1cm4gbmV3IEhtYWNEUkJHKG9wdGlvbnMpO3RoaXMuaGFzaD1vcHRpb25zLmhhc2gsdGhpcy5wcmVkUmVzaXN0PSEhb3B0aW9ucy5wcmVkUmVzaXN0LHRoaXMub3V0TGVuPXRoaXMuaGFzaC5vdXRTaXplLHRoaXMubWluRW50cm9weT1vcHRpb25zLm1pbkVudHJvcHl8fHRoaXMuaGFzaC5obWFjU3RyZW5ndGgsdGhpcy5fcmVzZWVkPW51bGwsdGhpcy5yZXNlZWRJbnRlcnZhbD1udWxsLHRoaXMuSz1udWxsLHRoaXMuVj1udWxsO3ZhciBlbnRyb3B5PXV0aWxzLnRvQXJyYXkob3B0aW9ucy5lbnRyb3B5LG9wdGlvbnMuZW50cm9weUVuY3x8ImhleCIpLG5vbmNlPXV0aWxzLnRvQXJyYXkob3B0aW9ucy5ub25jZSxvcHRpb25zLm5vbmNlRW5jfHwiaGV4IikscGVycz11dGlscy50b0FycmF5KG9wdGlvbnMucGVycyxvcHRpb25zLnBlcnNFbmN8fCJoZXgiKTthc3NlcnQoZW50cm9weS5sZW5ndGg+PXRoaXMubWluRW50cm9weS84LCJOb3QgZW5vdWdoIGVudHJvcHkuIE1pbmltdW0gaXM6ICIrdGhpcy5taW5FbnRyb3B5KyIgYml0cyIpLHRoaXMuX2luaXQoZW50cm9weSxub25jZSxwZXJzKX1tb2R1bGUuZXhwb3J0cz1IbWFjRFJCRyxIbWFjRFJCRy5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24gaW5pdChlbnRyb3B5LG5vbmNlLHBlcnMpe3ZhciBzZWVkPWVudHJvcHkuY29uY2F0KG5vbmNlKS5jb25jYXQocGVycyk7dGhpcy5LPW5ldyBBcnJheSh0aGlzLm91dExlbi84KSx0aGlzLlY9bmV3IEFycmF5KHRoaXMub3V0TGVuLzgpO2Zvcih2YXIgaT0wO2k8dGhpcy5WLmxlbmd0aDtpKyspdGhpcy5LW2ldPTAsdGhpcy5WW2ldPTE7dGhpcy5fdXBkYXRlKHNlZWQpLHRoaXMuX3Jlc2VlZD0xLHRoaXMucmVzZWVkSW50ZXJ2YWw9MjgxNDc0OTc2NzEwNjU2fSxIbWFjRFJCRy5wcm90b3R5cGUuX2htYWM9ZnVuY3Rpb24gaG1hYygpe3JldHVybiBuZXcgaGFzaC5obWFjKHRoaXMuaGFzaCx0aGlzLkspfSxIbWFjRFJCRy5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbiB1cGRhdGUoc2VlZCl7dmFyIGttYWM9dGhpcy5faG1hYygpLnVwZGF0ZSh0aGlzLlYpLnVwZGF0ZShbMF0pO3NlZWQmJihrbWFjPWttYWMudXBkYXRlKHNlZWQpKSx0aGlzLks9a21hYy5kaWdlc3QoKSx0aGlzLlY9dGhpcy5faG1hYygpLnVwZGF0ZSh0aGlzLlYpLmRpZ2VzdCgpLHNlZWQmJih0aGlzLks9dGhpcy5faG1hYygpLnVwZGF0ZSh0aGlzLlYpLnVwZGF0ZShbMV0pLnVwZGF0ZShzZWVkKS5kaWdlc3QoKSx0aGlzLlY9dGhpcy5faG1hYygpLnVwZGF0ZSh0aGlzLlYpLmRpZ2VzdCgpKX0sSG1hY0RSQkcucHJvdG90eXBlLnJlc2VlZD1mdW5jdGlvbiByZXNlZWQoZW50cm9weSxlbnRyb3B5RW5jLGFkZCxhZGRFbmMpeyJzdHJpbmciIT10eXBlb2YgZW50cm9weUVuYyYmKGFkZEVuYz1hZGQsYWRkPWVudHJvcHlFbmMsZW50cm9weUVuYz1udWxsKSxlbnRyb3B5PXV0aWxzLnRvQXJyYXkoZW50cm9weSxlbnRyb3B5RW5jKSxhZGQ9dXRpbHMudG9BcnJheShhZGQsYWRkRW5jKSxhc3NlcnQoZW50cm9weS5sZW5ndGg+PXRoaXMubWluRW50cm9weS84LCJOb3QgZW5vdWdoIGVudHJvcHkuIE1pbmltdW0gaXM6ICIrdGhpcy5taW5FbnRyb3B5KyIgYml0cyIpLHRoaXMuX3VwZGF0ZShlbnRyb3B5LmNvbmNhdChhZGR8fFtdKSksdGhpcy5fcmVzZWVkPTF9LEhtYWNEUkJHLnByb3RvdHlwZS5nZW5lcmF0ZT1mdW5jdGlvbiBnZW5lcmF0ZShsZW4sZW5jLGFkZCxhZGRFbmMpe2lmKHRoaXMuX3Jlc2VlZD50aGlzLnJlc2VlZEludGVydmFsKXRocm93IG5ldyBFcnJvcigiUmVzZWVkIGlzIHJlcXVpcmVkIik7InN0cmluZyIhPXR5cGVvZiBlbmMmJihhZGRFbmM9YWRkLGFkZD1lbmMsZW5jPW51bGwpLGFkZCYmKGFkZD11dGlscy50b0FycmF5KGFkZCxhZGRFbmN8fCJoZXgiKSx0aGlzLl91cGRhdGUoYWRkKSk7Zm9yKHZhciB0ZW1wPVtdO3RlbXAubGVuZ3RoPGxlbjspdGhpcy5WPXRoaXMuX2htYWMoKS51cGRhdGUodGhpcy5WKS5kaWdlc3QoKSx0ZW1wPXRlbXAuY29uY2F0KHRoaXMuVik7dmFyIHJlcz10ZW1wLnNsaWNlKDAsbGVuKTtyZXR1cm4gdGhpcy5fdXBkYXRlKGFkZCksdGhpcy5fcmVzZWVkKyssdXRpbHMuZW5jb2RlKHJlcyxlbmMpfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9odHRwcy1icm93c2VyaWZ5L2luZGV4LmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pe3ZhciBodHRwPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9pbmRleC5qcyIpLHVybD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbm9kZS1zdGRsaWItYnJvd3Nlci9janMvcHJveHkvdXJsLmpzIiksaHR0cHM9bW9kdWxlLmV4cG9ydHM7Zm9yKHZhciBrZXkgaW4gaHR0cClodHRwLmhhc093blByb3BlcnR5KGtleSkmJihodHRwc1trZXldPWh0dHBba2V5XSk7ZnVuY3Rpb24gdmFsaWRhdGVQYXJhbXMocGFyYW1zKXtpZigic3RyaW5nIj09dHlwZW9mIHBhcmFtcyYmKHBhcmFtcz11cmwucGFyc2UocGFyYW1zKSkscGFyYW1zLnByb3RvY29sfHwocGFyYW1zLnByb3RvY29sPSJodHRwczoiKSwiaHR0cHM6IiE9PXBhcmFtcy5wcm90b2NvbCl0aHJvdyBuZXcgRXJyb3IoJ1Byb3RvY29sICInK3BhcmFtcy5wcm90b2NvbCsnIiBub3Qgc3VwcG9ydGVkLiBFeHBlY3RlZCAiaHR0cHM6IicpO3JldHVybiBwYXJhbXN9aHR0cHMucmVxdWVzdD1mdW5jdGlvbihwYXJhbXMsY2Ipe3JldHVybiBwYXJhbXM9dmFsaWRhdGVQYXJhbXMocGFyYW1zKSxodHRwLnJlcXVlc3QuY2FsbCh0aGlzLHBhcmFtcyxjYil9LGh0dHBzLmdldD1mdW5jdGlvbihwYXJhbXMsY2Ipe3JldHVybiBwYXJhbXM9dmFsaWRhdGVQYXJhbXMocGFyYW1zKSxodHRwLmdldC5jYWxsKHRoaXMscGFyYW1zLGNiKX19LCIuLi8uLi9ub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyl7ZXhwb3J0cy5yZWFkPWZ1bmN0aW9uKGJ1ZmZlcixvZmZzZXQsaXNMRSxtTGVuLG5CeXRlcyl7dmFyIGUsbSxlTGVuPTgqbkJ5dGVzLW1MZW4tMSxlTWF4PSgxPDxlTGVuKS0xLGVCaWFzPWVNYXg+PjEsbkJpdHM9LTcsaT1pc0xFP25CeXRlcy0xOjAsZD1pc0xFPy0xOjEscz1idWZmZXJbb2Zmc2V0K2ldO2ZvcihpKz1kLGU9cyYoMTw8LW5CaXRzKS0xLHM+Pj0tbkJpdHMsbkJpdHMrPWVMZW47bkJpdHM+MDtlPTI1NiplK2J1ZmZlcltvZmZzZXQraV0saSs9ZCxuQml0cy09OCk7Zm9yKG09ZSYoMTw8LW5CaXRzKS0xLGU+Pj0tbkJpdHMsbkJpdHMrPW1MZW47bkJpdHM+MDttPTI1NiptK2J1ZmZlcltvZmZzZXQraV0saSs9ZCxuQml0cy09OCk7aWYoMD09PWUpZT0xLWVCaWFzO2Vsc2V7aWYoZT09PWVNYXgpcmV0dXJuIG0/TmFOOjEvMCoocz8tMToxKTttKz1NYXRoLnBvdygyLG1MZW4pLGUtPWVCaWFzfXJldHVybihzPy0xOjEpKm0qTWF0aC5wb3coMixlLW1MZW4pfSxleHBvcnRzLndyaXRlPWZ1bmN0aW9uKGJ1ZmZlcix2YWx1ZSxvZmZzZXQsaXNMRSxtTGVuLG5CeXRlcyl7dmFyIGUsbSxjLGVMZW49OCpuQnl0ZXMtbUxlbi0xLGVNYXg9KDE8PGVMZW4pLTEsZUJpYXM9ZU1heD4+MSxydD0yMz09PW1MZW4/TWF0aC5wb3coMiwtMjQpLU1hdGgucG93KDIsLTc3KTowLGk9aXNMRT8wOm5CeXRlcy0xLGQ9aXNMRT8xOi0xLHM9dmFsdWU8MHx8MD09PXZhbHVlJiYxL3ZhbHVlPDA/MTowO2Zvcih2YWx1ZT1NYXRoLmFicyh2YWx1ZSksaXNOYU4odmFsdWUpfHx2YWx1ZT09PTEvMD8obT1pc05hTih2YWx1ZSk/MTowLGU9ZU1heCk6KGU9TWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkvTWF0aC5MTjIpLHZhbHVlKihjPU1hdGgucG93KDIsLWUpKTwxJiYoZS0tLGMqPTIpLCh2YWx1ZSs9ZStlQmlhcz49MT9ydC9jOnJ0Kk1hdGgucG93KDIsMS1lQmlhcykpKmM+PTImJihlKyssYy89MiksZStlQmlhcz49ZU1heD8obT0wLGU9ZU1heCk6ZStlQmlhcz49MT8obT0odmFsdWUqYy0xKSpNYXRoLnBvdygyLG1MZW4pLGUrPWVCaWFzKToobT12YWx1ZSpNYXRoLnBvdygyLGVCaWFzLTEpKk1hdGgucG93KDIsbUxlbiksZT0wKSk7bUxlbj49ODtidWZmZXJbb2Zmc2V0K2ldPTI1NSZtLGkrPWQsbS89MjU2LG1MZW4tPTgpO2ZvcihlPWU8PG1MZW58bSxlTGVuKz1tTGVuO2VMZW4+MDtidWZmZXJbb2Zmc2V0K2ldPTI1NSZlLGkrPWQsZS89MjU2LGVMZW4tPTgpO2J1ZmZlcltvZmZzZXQraS1kXXw9MTI4KnN9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiKG1vZHVsZSl7ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5jcmVhdGU/bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24gaW5oZXJpdHMoY3RvcixzdXBlckN0b3Ipe3N1cGVyQ3RvciYmKGN0b3Iuc3VwZXJfPXN1cGVyQ3RvcixjdG9yLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpjdG9yLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pKX06bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24gaW5oZXJpdHMoY3RvcixzdXBlckN0b3Ipe2lmKHN1cGVyQ3Rvcil7Y3Rvci5zdXBlcl89c3VwZXJDdG9yO3ZhciBUZW1wQ3Rvcj1mdW5jdGlvbigpe307VGVtcEN0b3IucHJvdG90eXBlPXN1cGVyQ3Rvci5wcm90b3R5cGUsY3Rvci5wcm90b3R5cGU9bmV3IFRlbXBDdG9yLGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yPWN0b3J9fX0sIi4uLy4uL25vZGVfbW9kdWxlcy9pcy1hcmd1bWVudHMvaW5kZXguanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBoYXNUb1N0cmluZ1RhZz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaGFzLXRvc3RyaW5ndGFnL3NoYW1zLmpzIikoKSwkdG9TdHJpbmc9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2NhbGwtYm91bmQvaW5kZXguanMiKSgiT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyIpLGlzU3RhbmRhcmRBcmd1bWVudHM9ZnVuY3Rpb24gaXNBcmd1bWVudHModmFsdWUpe3JldHVybiEoaGFzVG9TdHJpbmdUYWcmJnZhbHVlJiYib2JqZWN0Ij09dHlwZW9mIHZhbHVlJiZTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWUpJiYiW29iamVjdCBBcmd1bWVudHNdIj09PSR0b1N0cmluZyh2YWx1ZSl9LGlzTGVnYWN5QXJndW1lbnRzPWZ1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVlKXtyZXR1cm4hIWlzU3RhbmRhcmRBcmd1bWVudHModmFsdWUpfHxudWxsIT09dmFsdWUmJiJvYmplY3QiPT10eXBlb2YgdmFsdWUmJiJsZW5ndGgiaW4gdmFsdWUmJiJudW1iZXIiPT10eXBlb2YgdmFsdWUubGVuZ3RoJiZ2YWx1ZS5sZW5ndGg+PTAmJiJbb2JqZWN0IEFycmF5XSIhPT0kdG9TdHJpbmcodmFsdWUpJiYiY2FsbGVlImluIHZhbHVlJiYiW29iamVjdCBGdW5jdGlvbl0iPT09JHRvU3RyaW5nKHZhbHVlLmNhbGxlZSl9LHN1cHBvcnRzU3RhbmRhcmRBcmd1bWVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gaXNTdGFuZGFyZEFyZ3VtZW50cyhhcmd1bWVudHMpfSgpO2lzU3RhbmRhcmRBcmd1bWVudHMuaXNMZWdhY3lBcmd1bWVudHM9aXNMZWdhY3lBcmd1bWVudHMsbW9kdWxlLmV4cG9ydHM9c3VwcG9ydHNTdGFuZGFyZEFyZ3VtZW50cz9pc1N0YW5kYXJkQXJndW1lbnRzOmlzTGVnYWN5QXJndW1lbnRzfSwiLi4vLi4vbm9kZV9tb2R1bGVzL2lzLWNhbGxhYmxlL2luZGV4LmpzIihtb2R1bGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgYmFkQXJyYXlMaWtlLGlzQ2FsbGFibGVNYXJrZXIsZm5Ub1N0cj1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcscmVmbGVjdEFwcGx5PSJvYmplY3QiPT10eXBlb2YgUmVmbGVjdCYmbnVsbCE9PVJlZmxlY3QmJlJlZmxlY3QuYXBwbHk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHJlZmxlY3RBcHBseSYmImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSl0cnl7YmFkQXJyYXlMaWtlPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwibGVuZ3RoIix7Z2V0OmZ1bmN0aW9uKCl7dGhyb3cgaXNDYWxsYWJsZU1hcmtlcn19KSxpc0NhbGxhYmxlTWFya2VyPXt9LHJlZmxlY3RBcHBseShmdW5jdGlvbigpe3Rocm93IDQyfSxudWxsLGJhZEFycmF5TGlrZSl9Y2F0Y2goXyl7XyE9PWlzQ2FsbGFibGVNYXJrZXImJihyZWZsZWN0QXBwbHk9bnVsbCl9ZWxzZSByZWZsZWN0QXBwbHk9bnVsbDt2YXIgY29uc3RydWN0b3JSZWdleD0vXlxzKmNsYXNzXGIvLGlzRVM2Q2xhc3NGbj1mdW5jdGlvbiBpc0VTNkNsYXNzRnVuY3Rpb24odmFsdWUpe3RyeXt2YXIgZm5TdHI9Zm5Ub1N0ci5jYWxsKHZhbHVlKTtyZXR1cm4gY29uc3RydWN0b3JSZWdleC50ZXN0KGZuU3RyKX1jYXRjaChlKXtyZXR1cm4hMX19LHRyeUZ1bmN0aW9uT2JqZWN0PWZ1bmN0aW9uIHRyeUZ1bmN0aW9uVG9TdHIodmFsdWUpe3RyeXtyZXR1cm4haXNFUzZDbGFzc0ZuKHZhbHVlKSYmKGZuVG9TdHIuY2FsbCh2YWx1ZSksITApfWNhdGNoKGUpe3JldHVybiExfX0sdG9TdHI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxoYXNUb1N0cmluZ1RhZz0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYhIVN5bWJvbC50b1N0cmluZ1RhZyxpc0lFNjg9ISgwIGluWyxdKSxpc0REQT1mdW5jdGlvbiBpc0RvY3VtZW50RG90QWxsKCl7cmV0dXJuITF9O2lmKCJvYmplY3QiPT10eXBlb2YgZG9jdW1lbnQpe3ZhciBhbGw9ZG9jdW1lbnQuYWxsO3RvU3RyLmNhbGwoYWxsKT09PXRvU3RyLmNhbGwoZG9jdW1lbnQuYWxsKSYmKGlzRERBPWZ1bmN0aW9uIGlzRG9jdW1lbnREb3RBbGwodmFsdWUpe2lmKChpc0lFNjh8fCF2YWx1ZSkmJih2b2lkIDA9PT12YWx1ZXx8Im9iamVjdCI9PXR5cGVvZiB2YWx1ZSkpdHJ5e3ZhciBzdHI9dG9TdHIuY2FsbCh2YWx1ZSk7cmV0dXJuKCJbb2JqZWN0IEhUTUxBbGxDb2xsZWN0aW9uXSI9PT1zdHJ8fCJbb2JqZWN0IEhUTUwgZG9jdW1lbnQuYWxsIGNsYXNzXSI9PT1zdHJ8fCJbb2JqZWN0IEhUTUxDb2xsZWN0aW9uXSI9PT1zdHJ8fCJbb2JqZWN0IE9iamVjdF0iPT09c3RyKSYmbnVsbD09dmFsdWUoIiIpfWNhdGNoKGUpe31yZXR1cm4hMX0pfW1vZHVsZS5leHBvcnRzPXJlZmxlY3RBcHBseT9mdW5jdGlvbiBpc0NhbGxhYmxlKHZhbHVlKXtpZihpc0REQSh2YWx1ZSkpcmV0dXJuITA7aWYoIXZhbHVlKXJldHVybiExO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB2YWx1ZSYmIm9iamVjdCIhPXR5cGVvZiB2YWx1ZSlyZXR1cm4hMTt0cnl7cmVmbGVjdEFwcGx5KHZhbHVlLG51bGwsYmFkQXJyYXlMaWtlKX1jYXRjaChlKXtpZihlIT09aXNDYWxsYWJsZU1hcmtlcilyZXR1cm4hMX1yZXR1cm4haXNFUzZDbGFzc0ZuKHZhbHVlKSYmdHJ5RnVuY3Rpb25PYmplY3QodmFsdWUpfTpmdW5jdGlvbiBpc0NhbGxhYmxlKHZhbHVlKXtpZihpc0REQSh2YWx1ZSkpcmV0dXJuITA7aWYoIXZhbHVlKXJldHVybiExO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB2YWx1ZSYmIm9iamVjdCIhPXR5cGVvZiB2YWx1ZSlyZXR1cm4hMTtpZihoYXNUb1N0cmluZ1RhZylyZXR1cm4gdHJ5RnVuY3Rpb25PYmplY3QodmFsdWUpO2lmKGlzRVM2Q2xhc3NGbih2YWx1ZSkpcmV0dXJuITE7dmFyIHN0ckNsYXNzPXRvU3RyLmNhbGwodmFsdWUpO3JldHVybiEoIltvYmplY3QgRnVuY3Rpb25dIiE9PXN0ckNsYXNzJiYiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iIT09c3RyQ2xhc3MmJiEvXlxbb2JqZWN0IEhUTUwvLnRlc3Qoc3RyQ2xhc3MpKSYmdHJ5RnVuY3Rpb25PYmplY3QodmFsdWUpfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9pcy1nZW5lcmF0b3ItZnVuY3Rpb24vaW5kZXguanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBjYWxsQm91bmQ9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2NhbGwtYm91bmQvaW5kZXguanMiKSxpc0ZuUmVnZXg9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3NhZmUtcmVnZXgtdGVzdC9pbmRleC5qcyIpKC9eXHMqKD86ZnVuY3Rpb24pP1wqLyksaGFzVG9TdHJpbmdUYWc9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2hhcy10b3N0cmluZ3RhZy9zaGFtcy5qcyIpKCksZ2V0UHJvdG89X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2dldC1wcm90by9pbmRleC5qcyIpLHRvU3RyPWNhbGxCb3VuZCgiT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyIpLGZuVG9TdHI9Y2FsbEJvdW5kKCJGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmciKSxnZXRHZW5lcmF0b3JGdW5jdGlvbj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZ2VuZXJhdG9yLWZ1bmN0aW9uL2luZGV4LmpzIik7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24gaXNHZW5lcmF0b3JGdW5jdGlvbihmbil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGZuKXJldHVybiExO2lmKGlzRm5SZWdleChmblRvU3RyKGZuKSkpcmV0dXJuITA7aWYoIWhhc1RvU3RyaW5nVGFnKXJldHVybiJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSI9PT10b1N0cihmbik7aWYoIWdldFByb3RvKXJldHVybiExO3ZhciBHZW5lcmF0b3JGdW5jdGlvbj1nZXRHZW5lcmF0b3JGdW5jdGlvbigpO3JldHVybiBHZW5lcmF0b3JGdW5jdGlvbiYmZ2V0UHJvdG8oZm4pPT09R2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9pcy1uYW4vaW1wbGVtZW50YXRpb24uanMiKG1vZHVsZSl7InVzZSBzdHJpY3QiO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uIGlzTmFOKHZhbHVlKXtyZXR1cm4gdmFsdWUhPXZhbHVlfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9pcy1uYW4vaW5kZXguanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBjYWxsQmluZD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvY2FsbC1iaW5kL2luZGV4LmpzIiksZGVmaW5lPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9kZWZpbmUtcHJvcGVydGllcy9pbmRleC5qcyIpLGltcGxlbWVudGF0aW9uPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9pcy1uYW4vaW1wbGVtZW50YXRpb24uanMiKSxnZXRQb2x5ZmlsbD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaXMtbmFuL3BvbHlmaWxsLmpzIiksc2hpbT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaXMtbmFuL3NoaW0uanMiKSxwb2x5ZmlsbD1jYWxsQmluZChnZXRQb2x5ZmlsbCgpLE51bWJlcik7ZGVmaW5lKHBvbHlmaWxsLHtnZXRQb2x5ZmlsbCxpbXBsZW1lbnRhdGlvbixzaGltfSksbW9kdWxlLmV4cG9ydHM9cG9seWZpbGx9LCIuLi8uLi9ub2RlX21vZHVsZXMvaXMtbmFuL3BvbHlmaWxsLmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgaW1wbGVtZW50YXRpb249X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2lzLW5hbi9pbXBsZW1lbnRhdGlvbi5qcyIpO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uIGdldFBvbHlmaWxsKCl7cmV0dXJuIE51bWJlci5pc05hTiYmTnVtYmVyLmlzTmFOKE5hTikmJiFOdW1iZXIuaXNOYU4oImEiKT9OdW1iZXIuaXNOYU46aW1wbGVtZW50YXRpb259fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2lzLW5hbi9zaGltLmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgZGVmaW5lPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9kZWZpbmUtcHJvcGVydGllcy9pbmRleC5qcyIpLGdldFBvbHlmaWxsPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9pcy1uYW4vcG9seWZpbGwuanMiKTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbiBzaGltTnVtYmVySXNOYU4oKXt2YXIgcG9seWZpbGw9Z2V0UG9seWZpbGwoKTtyZXR1cm4gZGVmaW5lKE51bWJlcix7aXNOYU46cG9seWZpbGx9LHtpc05hTjpmdW5jdGlvbiB0ZXN0SXNOYU4oKXtyZXR1cm4gTnVtYmVyLmlzTmFOIT09cG9seWZpbGx9fSkscG9seWZpbGx9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2lzLXJlZ2V4L2luZGV4LmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgZm4sY2FsbEJvdW5kPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9jYWxsLWJvdW5kL2luZGV4LmpzIiksaGFzVG9TdHJpbmdUYWc9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2hhcy10b3N0cmluZ3RhZy9zaGFtcy5qcyIpKCksaGFzT3duPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9oYXNvd24vaW5kZXguanMiKSxnT1BEPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9nb3BkL2luZGV4LmpzIik7aWYoaGFzVG9TdHJpbmdUYWcpe3ZhciAkZXhlYz1jYWxsQm91bmQoIlJlZ0V4cC5wcm90b3R5cGUuZXhlYyIpLGlzUmVnZXhNYXJrZXI9e30sdGhyb3dSZWdleE1hcmtlcj1mdW5jdGlvbigpe3Rocm93IGlzUmVnZXhNYXJrZXJ9LGJhZFN0cmluZ2lmaWVyPXt0b1N0cmluZzp0aHJvd1JlZ2V4TWFya2VyLHZhbHVlT2Y6dGhyb3dSZWdleE1hcmtlcn07InN5bWJvbCI9PXR5cGVvZiBTeW1ib2wudG9QcmltaXRpdmUmJihiYWRTdHJpbmdpZmllcltTeW1ib2wudG9QcmltaXRpdmVdPXRocm93UmVnZXhNYXJrZXIpLGZuPWZ1bmN0aW9uIGlzUmVnZXgodmFsdWUpe2lmKCF2YWx1ZXx8Im9iamVjdCIhPXR5cGVvZiB2YWx1ZSlyZXR1cm4hMTt2YXIgZGVzY3JpcHRvcj1nT1BEKHZhbHVlLCJsYXN0SW5kZXgiKTtpZighKGRlc2NyaXB0b3ImJmhhc093bihkZXNjcmlwdG9yLCJ2YWx1ZSIpKSlyZXR1cm4hMTt0cnl7JGV4ZWModmFsdWUsYmFkU3RyaW5naWZpZXIpfWNhdGNoKGUpe3JldHVybiBlPT09aXNSZWdleE1hcmtlcn19fWVsc2V7dmFyICR0b1N0cmluZz1jYWxsQm91bmQoIk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmciKTtmbj1mdW5jdGlvbiBpc1JlZ2V4KHZhbHVlKXtyZXR1cm4hKCF2YWx1ZXx8Im9iamVjdCIhPXR5cGVvZiB2YWx1ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIHZhbHVlKSYmIltvYmplY3QgUmVnRXhwXSI9PT0kdG9TdHJpbmcodmFsdWUpfX1tb2R1bGUuZXhwb3J0cz1mbn0sIi4uLy4uL25vZGVfbW9kdWxlcy9pcy10eXBlZC1hcnJheS9pbmRleC5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIHdoaWNoVHlwZWRBcnJheT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvd2hpY2gtdHlwZWQtYXJyYXkvaW5kZXguanMiKTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbiBpc1R5cGVkQXJyYXkodmFsdWUpe3JldHVybiEhd2hpY2hUeXBlZEFycmF5KHZhbHVlKX19LCIuLi8uLi9ub2RlX21vZHVsZXMvaXNhcnJheS9pbmRleC5qcyIobW9kdWxlKXt2YXIgdG9TdHJpbmc9e30udG9TdHJpbmc7bW9kdWxlLmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYXJyKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT10b1N0cmluZy5jYWxsKGFycil9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL21hdGgtaW50cmluc2ljcy9hYnMuanMiKG1vZHVsZSl7InVzZSBzdHJpY3QiO21vZHVsZS5leHBvcnRzPU1hdGguYWJzfSwiLi4vLi4vbm9kZV9tb2R1bGVzL21hdGgtaW50cmluc2ljcy9mbG9vci5qcyIobW9kdWxlKXsidXNlIHN0cmljdCI7bW9kdWxlLmV4cG9ydHM9TWF0aC5mbG9vcn0sIi4uLy4uL25vZGVfbW9kdWxlcy9tYXRoLWludHJpbnNpY3MvaXNOYU4uanMiKG1vZHVsZSl7InVzZSBzdHJpY3QiO21vZHVsZS5leHBvcnRzPU51bWJlci5pc05hTnx8ZnVuY3Rpb24gaXNOYU4oYSl7cmV0dXJuIGEhPWF9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL21hdGgtaW50cmluc2ljcy9tYXguanMiKG1vZHVsZSl7InVzZSBzdHJpY3QiO21vZHVsZS5leHBvcnRzPU1hdGgubWF4fSwiLi4vLi4vbm9kZV9tb2R1bGVzL21hdGgtaW50cmluc2ljcy9taW4uanMiKG1vZHVsZSl7InVzZSBzdHJpY3QiO21vZHVsZS5leHBvcnRzPU1hdGgubWlufSwiLi4vLi4vbm9kZV9tb2R1bGVzL21hdGgtaW50cmluc2ljcy9wb3cuanMiKG1vZHVsZSl7InVzZSBzdHJpY3QiO21vZHVsZS5leHBvcnRzPU1hdGgucG93fSwiLi4vLi4vbm9kZV9tb2R1bGVzL21hdGgtaW50cmluc2ljcy9yb3VuZC5qcyIobW9kdWxlKXsidXNlIHN0cmljdCI7bW9kdWxlLmV4cG9ydHM9TWF0aC5yb3VuZH0sIi4uLy4uL25vZGVfbW9kdWxlcy9tYXRoLWludHJpbnNpY3Mvc2lnbi5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyICRpc05hTj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbWF0aC1pbnRyaW5zaWNzL2lzTmFOLmpzIik7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24gc2lnbihudW1iZXIpe3JldHVybiAkaXNOYU4obnVtYmVyKXx8MD09PW51bWJlcj9udW1iZXI6bnVtYmVyPDA/LTE6MX19LCIuLi8uLi9ub2RlX21vZHVsZXMvbWQ1LmpzL2luZGV4LmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgaW5oZXJpdHM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiKSxIYXNoQmFzZT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaGFzaC1iYXNlL2luZGV4LmpzIiksQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcyIpLkJ1ZmZlcixBUlJBWTE2PW5ldyBBcnJheSgxNik7ZnVuY3Rpb24gTUQ1KCl7SGFzaEJhc2UuY2FsbCh0aGlzLDY0KSx0aGlzLl9hPTE3MzI1ODQxOTMsdGhpcy5fYj00MDIzMjMzNDE3LHRoaXMuX2M9MjU2MjM4MzEwMix0aGlzLl9kPTI3MTczMzg3OH1mdW5jdGlvbiByb3RsKHgsbil7cmV0dXJuIHg8PG58eD4+PjMyLW59ZnVuY3Rpb24gZm5GKGEsYixjLGQsbSxrLHMpe3JldHVybiByb3RsKGErKGImY3x+YiZkKSttK2t8MCxzKStifDB9ZnVuY3Rpb24gZm5HKGEsYixjLGQsbSxrLHMpe3JldHVybiByb3RsKGErKGImZHxjJn5kKSttK2t8MCxzKStifDB9ZnVuY3Rpb24gZm5IKGEsYixjLGQsbSxrLHMpe3JldHVybiByb3RsKGErKGJeY15kKSttK2t8MCxzKStifDB9ZnVuY3Rpb24gZm5JKGEsYixjLGQsbSxrLHMpe3JldHVybiByb3RsKGErKGNeKGJ8fmQpKSttK2t8MCxzKStifDB9aW5oZXJpdHMoTUQ1LEhhc2hCYXNlKSxNRDUucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24oKXtmb3IodmFyIE09QVJSQVkxNixpPTA7aTwxNjsrK2kpTVtpXT10aGlzLl9ibG9jay5yZWFkSW50MzJMRSg0KmkpO3ZhciBhPXRoaXMuX2EsYj10aGlzLl9iLGM9dGhpcy5fYyxkPXRoaXMuX2Q7YT1mbkYoYSxiLGMsZCxNWzBdLDM2MTQwOTAzNjAsNyksZD1mbkYoZCxhLGIsYyxNWzFdLDM5MDU0MDI3MTAsMTIpLGM9Zm5GKGMsZCxhLGIsTVsyXSw2MDYxMDU4MTksMTcpLGI9Zm5GKGIsYyxkLGEsTVszXSwzMjUwNDQxOTY2LDIyKSxhPWZuRihhLGIsYyxkLE1bNF0sNDExODU0ODM5OSw3KSxkPWZuRihkLGEsYixjLE1bNV0sMTIwMDA4MDQyNiwxMiksYz1mbkYoYyxkLGEsYixNWzZdLDI4MjE3MzU5NTUsMTcpLGI9Zm5GKGIsYyxkLGEsTVs3XSw0MjQ5MjYxMzEzLDIyKSxhPWZuRihhLGIsYyxkLE1bOF0sMTc3MDAzNTQxNiw3KSxkPWZuRihkLGEsYixjLE1bOV0sMjMzNjU1Mjg3OSwxMiksYz1mbkYoYyxkLGEsYixNWzEwXSw0Mjk0OTI1MjMzLDE3KSxiPWZuRihiLGMsZCxhLE1bMTFdLDIzMDQ1NjMxMzQsMjIpLGE9Zm5GKGEsYixjLGQsTVsxMl0sMTgwNDYwMzY4Miw3KSxkPWZuRihkLGEsYixjLE1bMTNdLDQyNTQ2MjYxOTUsMTIpLGM9Zm5GKGMsZCxhLGIsTVsxNF0sMjc5Mjk2NTAwNiwxNyksYT1mbkcoYSxiPWZuRihiLGMsZCxhLE1bMTVdLDEyMzY1MzUzMjksMjIpLGMsZCxNWzFdLDQxMjkxNzA3ODYsNSksZD1mbkcoZCxhLGIsYyxNWzZdLDMyMjU0NjU2NjQsOSksYz1mbkcoYyxkLGEsYixNWzExXSw2NDM3MTc3MTMsMTQpLGI9Zm5HKGIsYyxkLGEsTVswXSwzOTIxMDY5OTk0LDIwKSxhPWZuRyhhLGIsYyxkLE1bNV0sMzU5MzQwODYwNSw1KSxkPWZuRyhkLGEsYixjLE1bMTBdLDM4MDE2MDgzLDkpLGM9Zm5HKGMsZCxhLGIsTVsxNV0sMzYzNDQ4ODk2MSwxNCksYj1mbkcoYixjLGQsYSxNWzRdLDM4ODk0Mjk0NDgsMjApLGE9Zm5HKGEsYixjLGQsTVs5XSw1Njg0NDY0MzgsNSksZD1mbkcoZCxhLGIsYyxNWzE0XSwzMjc1MTYzNjA2LDkpLGM9Zm5HKGMsZCxhLGIsTVszXSw0MTA3NjAzMzM1LDE0KSxiPWZuRyhiLGMsZCxhLE1bOF0sMTE2MzUzMTUwMSwyMCksYT1mbkcoYSxiLGMsZCxNWzEzXSwyODUwMjg1ODI5LDUpLGQ9Zm5HKGQsYSxiLGMsTVsyXSw0MjQzNTYzNTEyLDkpLGM9Zm5HKGMsZCxhLGIsTVs3XSwxNzM1MzI4NDczLDE0KSxhPWZuSChhLGI9Zm5HKGIsYyxkLGEsTVsxMl0sMjM2ODM1OTU2MiwyMCksYyxkLE1bNV0sNDI5NDU4ODczOCw0KSxkPWZuSChkLGEsYixjLE1bOF0sMjI3MjM5MjgzMywxMSksYz1mbkgoYyxkLGEsYixNWzExXSwxODM5MDMwNTYyLDE2KSxiPWZuSChiLGMsZCxhLE1bMTRdLDQyNTk2NTc3NDAsMjMpLGE9Zm5IKGEsYixjLGQsTVsxXSwyNzYzOTc1MjM2LDQpLGQ9Zm5IKGQsYSxiLGMsTVs0XSwxMjcyODkzMzUzLDExKSxjPWZuSChjLGQsYSxiLE1bN10sNDEzOTQ2OTY2NCwxNiksYj1mbkgoYixjLGQsYSxNWzEwXSwzMjAwMjM2NjU2LDIzKSxhPWZuSChhLGIsYyxkLE1bMTNdLDY4MTI3OTE3NCw0KSxkPWZuSChkLGEsYixjLE1bMF0sMzkzNjQzMDA3NCwxMSksYz1mbkgoYyxkLGEsYixNWzNdLDM1NzI0NDUzMTcsMTYpLGI9Zm5IKGIsYyxkLGEsTVs2XSw3NjAyOTE4OSwyMyksYT1mbkgoYSxiLGMsZCxNWzldLDM2NTQ2MDI4MDksNCksZD1mbkgoZCxhLGIsYyxNWzEyXSwzODczMTUxNDYxLDExKSxjPWZuSChjLGQsYSxiLE1bMTVdLDUzMDc0MjUyMCwxNiksYT1mbkkoYSxiPWZuSChiLGMsZCxhLE1bMl0sMzI5OTYyODY0NSwyMyksYyxkLE1bMF0sNDA5NjMzNjQ1Miw2KSxkPWZuSShkLGEsYixjLE1bN10sMTEyNjg5MTQxNSwxMCksYz1mbkkoYyxkLGEsYixNWzE0XSwyODc4NjEyMzkxLDE1KSxiPWZuSShiLGMsZCxhLE1bNV0sNDIzNzUzMzI0MSwyMSksYT1mbkkoYSxiLGMsZCxNWzEyXSwxNzAwNDg1NTcxLDYpLGQ9Zm5JKGQsYSxiLGMsTVszXSwyMzk5OTgwNjkwLDEwKSxjPWZuSShjLGQsYSxiLE1bMTBdLDQyOTM5MTU3NzMsMTUpLGI9Zm5JKGIsYyxkLGEsTVsxXSwyMjQwMDQ0NDk3LDIxKSxhPWZuSShhLGIsYyxkLE1bOF0sMTg3MzMxMzM1OSw2KSxkPWZuSShkLGEsYixjLE1bMTVdLDQyNjQzNTU1NTIsMTApLGM9Zm5JKGMsZCxhLGIsTVs2XSwyNzM0NzY4OTE2LDE1KSxiPWZuSShiLGMsZCxhLE1bMTNdLDEzMDkxNTE2NDksMjEpLGE9Zm5JKGEsYixjLGQsTVs0XSw0MTQ5NDQ0MjI2LDYpLGQ9Zm5JKGQsYSxiLGMsTVsxMV0sMzE3NDc1NjkxNywxMCksYz1mbkkoYyxkLGEsYixNWzJdLDcxODc4NzI1OSwxNSksYj1mbkkoYixjLGQsYSxNWzldLDM5NTE0ODE3NDUsMjEpLHRoaXMuX2E9dGhpcy5fYSthfDAsdGhpcy5fYj10aGlzLl9iK2J8MCx0aGlzLl9jPXRoaXMuX2MrY3wwLHRoaXMuX2Q9dGhpcy5fZCtkfDB9LE1ENS5wcm90b3R5cGUuX2RpZ2VzdD1mdW5jdGlvbigpe3RoaXMuX2Jsb2NrW3RoaXMuX2Jsb2NrT2Zmc2V0KytdPTEyOCx0aGlzLl9ibG9ja09mZnNldD41NiYmKHRoaXMuX2Jsb2NrLmZpbGwoMCx0aGlzLl9ibG9ja09mZnNldCw2NCksdGhpcy5fdXBkYXRlKCksdGhpcy5fYmxvY2tPZmZzZXQ9MCksdGhpcy5fYmxvY2suZmlsbCgwLHRoaXMuX2Jsb2NrT2Zmc2V0LDU2KSx0aGlzLl9ibG9jay53cml0ZVVJbnQzMkxFKHRoaXMuX2xlbmd0aFswXSw1NiksdGhpcy5fYmxvY2sud3JpdGVVSW50MzJMRSh0aGlzLl9sZW5ndGhbMV0sNjApLHRoaXMuX3VwZGF0ZSgpO3ZhciBidWZmZXI9QnVmZmVyLmFsbG9jVW5zYWZlKDE2KTtyZXR1cm4gYnVmZmVyLndyaXRlSW50MzJMRSh0aGlzLl9hLDApLGJ1ZmZlci53cml0ZUludDMyTEUodGhpcy5fYiw0KSxidWZmZXIud3JpdGVJbnQzMkxFKHRoaXMuX2MsOCksYnVmZmVyLndyaXRlSW50MzJMRSh0aGlzLl9kLDEyKSxidWZmZXJ9LG1vZHVsZS5leHBvcnRzPU1ENX0sIi4uLy4uL25vZGVfbW9kdWxlcy9taWxsZXItcmFiaW4vbGliL21yLmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pe3ZhciBibj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYm4uanMvbGliL2JuLmpzIiksYnJvcmFuZD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvcmFuZC9pbmRleC5qcyIpO2Z1bmN0aW9uIE1pbGxlclJhYmluKHJhbmQpe3RoaXMucmFuZD1yYW5kfHxuZXcgYnJvcmFuZC5SYW5kfW1vZHVsZS5leHBvcnRzPU1pbGxlclJhYmluLE1pbGxlclJhYmluLmNyZWF0ZT1mdW5jdGlvbiBjcmVhdGUocmFuZCl7cmV0dXJuIG5ldyBNaWxsZXJSYWJpbihyYW5kKX0sTWlsbGVyUmFiaW4ucHJvdG90eXBlLl9yYW5kYmVsb3c9ZnVuY3Rpb24gX3JhbmRiZWxvdyhuKXt2YXIgbGVuPW4uYml0TGVuZ3RoKCksbWluX2J5dGVzPU1hdGguY2VpbChsZW4vOCk7ZG97dmFyIGE9bmV3IGJuKHRoaXMucmFuZC5nZW5lcmF0ZShtaW5fYnl0ZXMpKX13aGlsZShhLmNtcChuKT49MCk7cmV0dXJuIGF9LE1pbGxlclJhYmluLnByb3RvdHlwZS5fcmFuZHJhbmdlPWZ1bmN0aW9uIF9yYW5kcmFuZ2Uoc3RhcnQsc3RvcCl7dmFyIHNpemU9c3RvcC5zdWIoc3RhcnQpO3JldHVybiBzdGFydC5hZGQodGhpcy5fcmFuZGJlbG93KHNpemUpKX0sTWlsbGVyUmFiaW4ucHJvdG90eXBlLnRlc3Q9ZnVuY3Rpb24gdGVzdChuLGssY2Ipe3ZhciBsZW49bi5iaXRMZW5ndGgoKSxyZWQ9Ym4ubW9udChuKSxyb25lPW5ldyBibigxKS50b1JlZChyZWQpO2t8fChrPU1hdGgubWF4KDEsbGVuLzQ4fDApKTtmb3IodmFyIG4xPW4uc3VibigxKSxzPTA7IW4xLnRlc3RuKHMpO3MrKyk7Zm9yKHZhciBkPW4uc2hybihzKSxybjE9bjEudG9SZWQocmVkKTtrPjA7ay0tKXt2YXIgYT10aGlzLl9yYW5kcmFuZ2UobmV3IGJuKDIpLG4xKTtjYiYmY2IoYSk7dmFyIHg9YS50b1JlZChyZWQpLnJlZFBvdyhkKTtpZigwIT09eC5jbXAocm9uZSkmJjAhPT14LmNtcChybjEpKXtmb3IodmFyIGk9MTtpPHM7aSsrKXtpZigwPT09KHg9eC5yZWRTcXIoKSkuY21wKHJvbmUpKXJldHVybiExO2lmKDA9PT14LmNtcChybjEpKWJyZWFrfWlmKGk9PT1zKXJldHVybiExfX1yZXR1cm4hMH0sTWlsbGVyUmFiaW4ucHJvdG90eXBlLmdldERpdmlzb3I9ZnVuY3Rpb24gZ2V0RGl2aXNvcihuLGspe3ZhciBsZW49bi5iaXRMZW5ndGgoKSxyZWQ9Ym4ubW9udChuKSxyb25lPW5ldyBibigxKS50b1JlZChyZWQpO2t8fChrPU1hdGgubWF4KDEsbGVuLzQ4fDApKTtmb3IodmFyIG4xPW4uc3VibigxKSxzPTA7IW4xLnRlc3RuKHMpO3MrKyk7Zm9yKHZhciBkPW4uc2hybihzKSxybjE9bjEudG9SZWQocmVkKTtrPjA7ay0tKXt2YXIgYT10aGlzLl9yYW5kcmFuZ2UobmV3IGJuKDIpLG4xKSxnPW4uZ2NkKGEpO2lmKDAhPT1nLmNtcG4oMSkpcmV0dXJuIGc7dmFyIHg9YS50b1JlZChyZWQpLnJlZFBvdyhkKTtpZigwIT09eC5jbXAocm9uZSkmJjAhPT14LmNtcChybjEpKXtmb3IodmFyIGk9MTtpPHM7aSsrKXtpZigwPT09KHg9eC5yZWRTcXIoKSkuY21wKHJvbmUpKXJldHVybiB4LmZyb21SZWQoKS5zdWJuKDEpLmdjZChuKTtpZigwPT09eC5jbXAocm4xKSlicmVha31pZihpPT09cylyZXR1cm4oeD14LnJlZFNxcigpKS5mcm9tUmVkKCkuc3VibigxKS5nY2Qobil9fXJldHVybiExfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9taW5pbWFsaXN0aWMtYXNzZXJ0L2luZGV4LmpzIihtb2R1bGUpe2Z1bmN0aW9uIGFzc2VydCh2YWwsbXNnKXtpZighdmFsKXRocm93IG5ldyBFcnJvcihtc2d8fCJBc3NlcnRpb24gZmFpbGVkIil9bW9kdWxlLmV4cG9ydHM9YXNzZXJ0LGFzc2VydC5lcXVhbD1mdW5jdGlvbiBhc3NlcnRFcXVhbChsLHIsbXNnKXtpZihsIT1yKXRocm93IG5ldyBFcnJvcihtc2d8fCJBc3NlcnRpb24gZmFpbGVkOiAiK2wrIiAhPSAiK3IpfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9taW5pbWFsaXN0aWMtY3J5cHRvLXV0aWxzL2xpYi91dGlscy5qcyIoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyl7InVzZSBzdHJpY3QiO3ZhciB1dGlscz1leHBvcnRzO2Z1bmN0aW9uIHplcm8yKHdvcmQpe3JldHVybiAxPT09d29yZC5sZW5ndGg/IjAiK3dvcmQ6d29yZH1mdW5jdGlvbiB0b0hleChtc2cpe2Zvcih2YXIgcmVzPSIiLGk9MDtpPG1zZy5sZW5ndGg7aSsrKXJlcys9emVybzIobXNnW2ldLnRvU3RyaW5nKDE2KSk7cmV0dXJuIHJlc311dGlscy50b0FycmF5PWZ1bmN0aW9uIHRvQXJyYXkobXNnLGVuYyl7aWYoQXJyYXkuaXNBcnJheShtc2cpKXJldHVybiBtc2cuc2xpY2UoKTtpZighbXNnKXJldHVybltdO3ZhciByZXM9W107aWYoInN0cmluZyIhPXR5cGVvZiBtc2cpe2Zvcih2YXIgaT0wO2k8bXNnLmxlbmd0aDtpKyspcmVzW2ldPTB8bXNnW2ldO3JldHVybiByZXN9aWYoImhleCI9PT1lbmMpeyhtc2c9bXNnLnJlcGxhY2UoL1teYS16MC05XSsvZ2ksIiIpKS5sZW5ndGglMiE9MCYmKG1zZz0iMCIrbXNnKTtmb3IoaT0wO2k8bXNnLmxlbmd0aDtpKz0yKXJlcy5wdXNoKHBhcnNlSW50KG1zZ1tpXSttc2dbaSsxXSwxNikpfWVsc2UgZm9yKGk9MDtpPG1zZy5sZW5ndGg7aSsrKXt2YXIgYz1tc2cuY2hhckNvZGVBdChpKSxoaT1jPj44LGxvPTI1NSZjO2hpP3Jlcy5wdXNoKGhpLGxvKTpyZXMucHVzaChsbyl9cmV0dXJuIHJlc30sdXRpbHMuemVybzI9emVybzIsdXRpbHMudG9IZXg9dG9IZXgsdXRpbHMuZW5jb2RlPWZ1bmN0aW9uIGVuY29kZShhcnIsZW5jKXtyZXR1cm4iaGV4Ij09PWVuYz90b0hleChhcnIpOmFycn19LCIuLi8uLi9ub2RlX21vZHVsZXMvb2JqZWN0LWluc3BlY3QvaW5kZXguanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7dmFyIGhhc01hcD0iZnVuY3Rpb24iPT10eXBlb2YgTWFwJiZNYXAucHJvdG90eXBlLG1hcFNpemVEZXNjcmlwdG9yPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3ImJmhhc01hcD9PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE1hcC5wcm90b3R5cGUsInNpemUiKTpudWxsLG1hcFNpemU9aGFzTWFwJiZtYXBTaXplRGVzY3JpcHRvciYmImZ1bmN0aW9uIj09dHlwZW9mIG1hcFNpemVEZXNjcmlwdG9yLmdldD9tYXBTaXplRGVzY3JpcHRvci5nZXQ6bnVsbCxtYXBGb3JFYWNoPWhhc01hcCYmTWFwLnByb3RvdHlwZS5mb3JFYWNoLGhhc1NldD0iZnVuY3Rpb24iPT10eXBlb2YgU2V0JiZTZXQucHJvdG90eXBlLHNldFNpemVEZXNjcmlwdG9yPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3ImJmhhc1NldD9PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFNldC5wcm90b3R5cGUsInNpemUiKTpudWxsLHNldFNpemU9aGFzU2V0JiZzZXRTaXplRGVzY3JpcHRvciYmImZ1bmN0aW9uIj09dHlwZW9mIHNldFNpemVEZXNjcmlwdG9yLmdldD9zZXRTaXplRGVzY3JpcHRvci5nZXQ6bnVsbCxzZXRGb3JFYWNoPWhhc1NldCYmU2V0LnByb3RvdHlwZS5mb3JFYWNoLHdlYWtNYXBIYXM9ImZ1bmN0aW9uIj09dHlwZW9mIFdlYWtNYXAmJldlYWtNYXAucHJvdG90eXBlP1dlYWtNYXAucHJvdG90eXBlLmhhczpudWxsLHdlYWtTZXRIYXM9ImZ1bmN0aW9uIj09dHlwZW9mIFdlYWtTZXQmJldlYWtTZXQucHJvdG90eXBlP1dlYWtTZXQucHJvdG90eXBlLmhhczpudWxsLHdlYWtSZWZEZXJlZj0iZnVuY3Rpb24iPT10eXBlb2YgV2Vha1JlZiYmV2Vha1JlZi5wcm90b3R5cGU/V2Vha1JlZi5wcm90b3R5cGUuZGVyZWY6bnVsbCxib29sZWFuVmFsdWVPZj1Cb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLG9iamVjdFRvU3RyaW5nPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsZnVuY3Rpb25Ub1N0cmluZz1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcsJG1hdGNoPVN0cmluZy5wcm90b3R5cGUubWF0Y2gsJHNsaWNlPVN0cmluZy5wcm90b3R5cGUuc2xpY2UsJHJlcGxhY2U9U3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlLCR0b1VwcGVyQ2FzZT1TdHJpbmcucHJvdG90eXBlLnRvVXBwZXJDYXNlLCR0b0xvd2VyQ2FzZT1TdHJpbmcucHJvdG90eXBlLnRvTG93ZXJDYXNlLCR0ZXN0PVJlZ0V4cC5wcm90b3R5cGUudGVzdCwkY29uY2F0PUFycmF5LnByb3RvdHlwZS5jb25jYXQsJGpvaW49QXJyYXkucHJvdG90eXBlLmpvaW4sJGFyclNsaWNlPUFycmF5LnByb3RvdHlwZS5zbGljZSwkZmxvb3I9TWF0aC5mbG9vcixiaWdJbnRWYWx1ZU9mPSJmdW5jdGlvbiI9PXR5cGVvZiBCaWdJbnQ/QmlnSW50LnByb3RvdHlwZS52YWx1ZU9mOm51bGwsZ09QUz1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLHN5bVRvU3RyaW5nPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP1N5bWJvbC5wcm90b3R5cGUudG9TdHJpbmc6bnVsbCxoYXNTaGFtbWVkU3ltYm9scz0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYib2JqZWN0Ij09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcix0b1N0cmluZ1RhZz0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJih0eXBlb2YgU3ltYm9sLnRvU3RyaW5nVGFnPT09aGFzU2hhbW1lZFN5bWJvbHN8fCJzeW1ib2wiKT9TeW1ib2wudG9TdHJpbmdUYWc6bnVsbCxpc0VudW1lcmFibGU9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxnUE89KCJmdW5jdGlvbiI9PXR5cGVvZiBSZWZsZWN0P1JlZmxlY3QuZ2V0UHJvdG90eXBlT2Y6T2JqZWN0LmdldFByb3RvdHlwZU9mKXx8KFtdLl9fcHJvdG9fXz09PUFycmF5LnByb3RvdHlwZT9mdW5jdGlvbihPKXtyZXR1cm4gTy5fX3Byb3RvX199Om51bGwpO2Z1bmN0aW9uIGFkZE51bWVyaWNTZXBhcmF0b3IobnVtLHN0cil7aWYobnVtPT09MS8wfHxudW09PT0tMS8wfHxudW0hPW51bXx8bnVtJiZudW0+LTFlMyYmbnVtPDFlM3x8JHRlc3QuY2FsbCgvZS8sc3RyKSlyZXR1cm4gc3RyO3ZhciBzZXBSZWdleD0vWzAtOV0oPz0oPzpbMC05XXszfSkrKD8hWzAtOV0pKS9nO2lmKCJudW1iZXIiPT10eXBlb2YgbnVtKXt2YXIgaW50PW51bTwwPy0kZmxvb3IoLW51bSk6JGZsb29yKG51bSk7aWYoaW50IT09bnVtKXt2YXIgaW50U3RyPVN0cmluZyhpbnQpLGRlYz0kc2xpY2UuY2FsbChzdHIsaW50U3RyLmxlbmd0aCsxKTtyZXR1cm4gJHJlcGxhY2UuY2FsbChpbnRTdHIsc2VwUmVnZXgsIiQmXyIpKyIuIiskcmVwbGFjZS5jYWxsKCRyZXBsYWNlLmNhbGwoZGVjLC8oWzAtOV17M30pL2csIiQmXyIpLC9fJC8sIiIpfX1yZXR1cm4gJHJlcGxhY2UuY2FsbChzdHIsc2VwUmVnZXgsIiQmXyIpfXZhciB1dGlsSW5zcGVjdD1fX3dlYnBhY2tfcmVxdWlyZV9fKCI/Yzk1YSIpLGluc3BlY3RDdXN0b209dXRpbEluc3BlY3QuY3VzdG9tLGluc3BlY3RTeW1ib2w9aXNTeW1ib2woaW5zcGVjdEN1c3RvbSk/aW5zcGVjdEN1c3RvbTpudWxsLHF1b3Rlcz17X19wcm90b19fOm51bGwsZG91YmxlOiciJyxzaW5nbGU6IicifSxxdW90ZVJFcz17X19wcm90b19fOm51bGwsZG91YmxlOi8oWyJcXF0pL2csc2luZ2xlOi8oWydcXF0pL2d9O2Z1bmN0aW9uIHdyYXBRdW90ZXMocyxkZWZhdWx0U3R5bGUsb3B0cyl7dmFyIHN0eWxlPW9wdHMucXVvdGVTdHlsZXx8ZGVmYXVsdFN0eWxlLHF1b3RlQ2hhcj1xdW90ZXNbc3R5bGVdO3JldHVybiBxdW90ZUNoYXIrcytxdW90ZUNoYXJ9ZnVuY3Rpb24gcXVvdGUocyl7cmV0dXJuICRyZXBsYWNlLmNhbGwoU3RyaW5nKHMpLC8iL2csIiZxdW90OyIpfWZ1bmN0aW9uIGNhblRydXN0VG9TdHJpbmcob2JqKXtyZXR1cm4hdG9TdHJpbmdUYWd8fCEoIm9iamVjdCI9PXR5cGVvZiBvYmomJih0b1N0cmluZ1RhZyBpbiBvYmp8fHZvaWQgMCE9PW9ialt0b1N0cmluZ1RhZ10pKX1mdW5jdGlvbiBpc0FycmF5KG9iail7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PXRvU3RyKG9iaikmJmNhblRydXN0VG9TdHJpbmcob2JqKX1mdW5jdGlvbiBpc1JlZ0V4cChvYmope3JldHVybiJbb2JqZWN0IFJlZ0V4cF0iPT09dG9TdHIob2JqKSYmY2FuVHJ1c3RUb1N0cmluZyhvYmopfWZ1bmN0aW9uIGlzU3ltYm9sKG9iail7aWYoaGFzU2hhbW1lZFN5bWJvbHMpcmV0dXJuIG9iaiYmIm9iamVjdCI9PXR5cGVvZiBvYmomJm9iaiBpbnN0YW5jZW9mIFN5bWJvbDtpZigic3ltYm9sIj09dHlwZW9mIG9iailyZXR1cm4hMDtpZighb2JqfHwib2JqZWN0IiE9dHlwZW9mIG9ianx8IXN5bVRvU3RyaW5nKXJldHVybiExO3RyeXtyZXR1cm4gc3ltVG9TdHJpbmcuY2FsbChvYmopLCEwfWNhdGNoKGUpe31yZXR1cm4hMX1tb2R1bGUuZXhwb3J0cz1mdW5jdGlvbiBpbnNwZWN0XyhvYmosb3B0aW9ucyxkZXB0aCxzZWVuKXt2YXIgb3B0cz1vcHRpb25zfHx7fTtpZihoYXMob3B0cywicXVvdGVTdHlsZSIpJiYhaGFzKHF1b3RlcyxvcHRzLnF1b3RlU3R5bGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiAicXVvdGVTdHlsZSIgbXVzdCBiZSAic2luZ2xlIiBvciAiZG91YmxlIicpO2lmKGhhcyhvcHRzLCJtYXhTdHJpbmdMZW5ndGgiKSYmKCJudW1iZXIiPT10eXBlb2Ygb3B0cy5tYXhTdHJpbmdMZW5ndGg/b3B0cy5tYXhTdHJpbmdMZW5ndGg8MCYmb3B0cy5tYXhTdHJpbmdMZW5ndGghPT0xLzA6bnVsbCE9PW9wdHMubWF4U3RyaW5nTGVuZ3RoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gIm1heFN0cmluZ0xlbmd0aCIsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgSW5maW5pdHksIG9yIGBudWxsYCcpO3ZhciBjdXN0b21JbnNwZWN0PSFoYXMob3B0cywiY3VzdG9tSW5zcGVjdCIpfHxvcHRzLmN1c3RvbUluc3BlY3Q7aWYoImJvb2xlYW4iIT10eXBlb2YgY3VzdG9tSW5zcGVjdCYmInN5bWJvbCIhPT1jdXN0b21JbnNwZWN0KXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbiBcImN1c3RvbUluc3BlY3RcIiwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYHRydWVgLCBgZmFsc2VgLCBvciBgJ3N5bWJvbCdgIik7aWYoaGFzKG9wdHMsImluZGVudCIpJiZudWxsIT09b3B0cy5pbmRlbnQmJiJcdCIhPT1vcHRzLmluZGVudCYmIShwYXJzZUludChvcHRzLmluZGVudCwxMCk9PT1vcHRzLmluZGVudCYmb3B0cy5pbmRlbnQ+MCkpdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uICJpbmRlbnQiIG11c3QgYmUgIlxcdCIsIGFuIGludGVnZXIgPiAwLCBvciBgbnVsbGAnKTtpZihoYXMob3B0cywibnVtZXJpY1NlcGFyYXRvciIpJiYiYm9vbGVhbiIhPXR5cGVvZiBvcHRzLm51bWVyaWNTZXBhcmF0b3IpdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uICJudW1lcmljU2VwYXJhdG9yIiwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYHRydWVgIG9yIGBmYWxzZWAnKTt2YXIgbnVtZXJpY1NlcGFyYXRvcj1vcHRzLm51bWVyaWNTZXBhcmF0b3I7aWYodm9pZCAwPT09b2JqKXJldHVybiJ1bmRlZmluZWQiO2lmKG51bGw9PT1vYmopcmV0dXJuIm51bGwiO2lmKCJib29sZWFuIj09dHlwZW9mIG9iailyZXR1cm4gb2JqPyJ0cnVlIjoiZmFsc2UiO2lmKCJzdHJpbmciPT10eXBlb2Ygb2JqKXJldHVybiBpbnNwZWN0U3RyaW5nKG9iaixvcHRzKTtpZigibnVtYmVyIj09dHlwZW9mIG9iail7aWYoMD09PW9iailyZXR1cm4gMS8wL29iaj4wPyIwIjoiLTAiO3ZhciBzdHI9U3RyaW5nKG9iaik7cmV0dXJuIG51bWVyaWNTZXBhcmF0b3I/YWRkTnVtZXJpY1NlcGFyYXRvcihvYmosc3RyKTpzdHJ9aWYoImJpZ2ludCI9PXR5cGVvZiBvYmope3ZhciBiaWdJbnRTdHI9U3RyaW5nKG9iaikrIm4iO3JldHVybiBudW1lcmljU2VwYXJhdG9yP2FkZE51bWVyaWNTZXBhcmF0b3Iob2JqLGJpZ0ludFN0cik6YmlnSW50U3RyfXZhciBtYXhEZXB0aD12b2lkIDA9PT1vcHRzLmRlcHRoPzU6b3B0cy5kZXB0aDtpZih2b2lkIDA9PT1kZXB0aCYmKGRlcHRoPTApLGRlcHRoPj1tYXhEZXB0aCYmbWF4RGVwdGg+MCYmIm9iamVjdCI9PXR5cGVvZiBvYmopcmV0dXJuIGlzQXJyYXkob2JqKT8iW0FycmF5XSI6IltPYmplY3RdIjt2YXIgaW5kZW50PWZ1bmN0aW9uIGdldEluZGVudChvcHRzLGRlcHRoKXt2YXIgYmFzZUluZGVudDtpZigiXHQiPT09b3B0cy5pbmRlbnQpYmFzZUluZGVudD0iXHQiO2Vsc2V7aWYoISgibnVtYmVyIj09dHlwZW9mIG9wdHMuaW5kZW50JiZvcHRzLmluZGVudD4wKSlyZXR1cm4gbnVsbDtiYXNlSW5kZW50PSRqb2luLmNhbGwoQXJyYXkob3B0cy5pbmRlbnQrMSksIiAiKX1yZXR1cm57YmFzZTpiYXNlSW5kZW50LHByZXY6JGpvaW4uY2FsbChBcnJheShkZXB0aCsxKSxiYXNlSW5kZW50KX19KG9wdHMsZGVwdGgpO2lmKHZvaWQgMD09PXNlZW4pc2Vlbj1bXTtlbHNlIGlmKGluZGV4T2Yoc2VlbixvYmopPj0wKXJldHVybiJbQ2lyY3VsYXJdIjtmdW5jdGlvbiBpbnNwZWN0KHZhbHVlLGZyb20sbm9JbmRlbnQpe2lmKGZyb20mJihzZWVuPSRhcnJTbGljZS5jYWxsKHNlZW4pKS5wdXNoKGZyb20pLG5vSW5kZW50KXt2YXIgbmV3T3B0cz17ZGVwdGg6b3B0cy5kZXB0aH07cmV0dXJuIGhhcyhvcHRzLCJxdW90ZVN0eWxlIikmJihuZXdPcHRzLnF1b3RlU3R5bGU9b3B0cy5xdW90ZVN0eWxlKSxpbnNwZWN0Xyh2YWx1ZSxuZXdPcHRzLGRlcHRoKzEsc2Vlbil9cmV0dXJuIGluc3BlY3RfKHZhbHVlLG9wdHMsZGVwdGgrMSxzZWVuKX1pZigiZnVuY3Rpb24iPT10eXBlb2Ygb2JqJiYhaXNSZWdFeHAob2JqKSl7dmFyIG5hbWU9ZnVuY3Rpb24gbmFtZU9mKGYpe2lmKGYubmFtZSlyZXR1cm4gZi5uYW1lO3ZhciBtPSRtYXRjaC5jYWxsKGZ1bmN0aW9uVG9TdHJpbmcuY2FsbChmKSwvXmZ1bmN0aW9uXHMqKFtcdyRdKykvKTtpZihtKXJldHVybiBtWzFdO3JldHVybiBudWxsfShvYmopLGtleXM9YXJyT2JqS2V5cyhvYmosaW5zcGVjdCk7cmV0dXJuIltGdW5jdGlvbiIrKG5hbWU/IjogIituYW1lOiIgKGFub255bW91cykiKSsiXSIrKGtleXMubGVuZ3RoPjA/IiB7ICIrJGpvaW4uY2FsbChrZXlzLCIsICIpKyIgfSI6IiIpfWlmKGlzU3ltYm9sKG9iaikpe3ZhciBzeW1TdHJpbmc9aGFzU2hhbW1lZFN5bWJvbHM/JHJlcGxhY2UuY2FsbChTdHJpbmcob2JqKSwvXihTeW1ib2xcKC4qXCkpX1teKV0qJC8sIiQxIik6c3ltVG9TdHJpbmcuY2FsbChvYmopO3JldHVybiJvYmplY3QiIT10eXBlb2Ygb2JqfHxoYXNTaGFtbWVkU3ltYm9scz9zeW1TdHJpbmc6bWFya0JveGVkKHN5bVN0cmluZyl9aWYoZnVuY3Rpb24gaXNFbGVtZW50KHgpe2lmKCF4fHwib2JqZWN0IiE9dHlwZW9mIHgpcmV0dXJuITE7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBIVE1MRWxlbWVudCYmeCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KXJldHVybiEwO3JldHVybiJzdHJpbmciPT10eXBlb2YgeC5ub2RlTmFtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHguZ2V0QXR0cmlidXRlfShvYmopKXtmb3IodmFyIHM9IjwiKyR0b0xvd2VyQ2FzZS5jYWxsKFN0cmluZyhvYmoubm9kZU5hbWUpKSxhdHRycz1vYmouYXR0cmlidXRlc3x8W10saT0wO2k8YXR0cnMubGVuZ3RoO2krKylzKz0iICIrYXR0cnNbaV0ubmFtZSsiPSIrd3JhcFF1b3RlcyhxdW90ZShhdHRyc1tpXS52YWx1ZSksImRvdWJsZSIsb3B0cyk7cmV0dXJuIHMrPSI+IixvYmouY2hpbGROb2RlcyYmb2JqLmNoaWxkTm9kZXMubGVuZ3RoJiYocys9Ii4uLiIpLHMrPSI8LyIrJHRvTG93ZXJDYXNlLmNhbGwoU3RyaW5nKG9iai5ub2RlTmFtZSkpKyI+In1pZihpc0FycmF5KG9iaikpe2lmKDA9PT1vYmoubGVuZ3RoKXJldHVybiJbXSI7dmFyIHhzPWFyck9iaktleXMob2JqLGluc3BlY3QpO3JldHVybiBpbmRlbnQmJiFmdW5jdGlvbiBzaW5nbGVMaW5lVmFsdWVzKHhzKXtmb3IodmFyIGk9MDtpPHhzLmxlbmd0aDtpKyspaWYoaW5kZXhPZih4c1tpXSwiXG4iKT49MClyZXR1cm4hMTtyZXR1cm4hMH0oeHMpPyJbIitpbmRlbnRlZEpvaW4oeHMsaW5kZW50KSsiXSI6IlsgIiskam9pbi5jYWxsKHhzLCIsICIpKyIgXSJ9aWYoZnVuY3Rpb24gaXNFcnJvcihvYmope3JldHVybiJbb2JqZWN0IEVycm9yXSI9PT10b1N0cihvYmopJiZjYW5UcnVzdFRvU3RyaW5nKG9iail9KG9iaikpe3ZhciBwYXJ0cz1hcnJPYmpLZXlzKG9iaixpbnNwZWN0KTtyZXR1cm4iY2F1c2UiaW4gRXJyb3IucHJvdG90eXBlfHwhKCJjYXVzZSJpbiBvYmopfHxpc0VudW1lcmFibGUuY2FsbChvYmosImNhdXNlIik/MD09PXBhcnRzLmxlbmd0aD8iWyIrU3RyaW5nKG9iaikrIl0iOiJ7IFsiK1N0cmluZyhvYmopKyJdICIrJGpvaW4uY2FsbChwYXJ0cywiLCAiKSsiIH0iOiJ7IFsiK1N0cmluZyhvYmopKyJdICIrJGpvaW4uY2FsbCgkY29uY2F0LmNhbGwoIltjYXVzZV06ICIraW5zcGVjdChvYmouY2F1c2UpLHBhcnRzKSwiLCAiKSsiIH0ifWlmKCJvYmplY3QiPT10eXBlb2Ygb2JqJiZjdXN0b21JbnNwZWN0KXtpZihpbnNwZWN0U3ltYm9sJiYiZnVuY3Rpb24iPT10eXBlb2Ygb2JqW2luc3BlY3RTeW1ib2xdJiZ1dGlsSW5zcGVjdClyZXR1cm4gdXRpbEluc3BlY3Qob2JqLHtkZXB0aDptYXhEZXB0aC1kZXB0aH0pO2lmKCJzeW1ib2wiIT09Y3VzdG9tSW5zcGVjdCYmImZ1bmN0aW9uIj09dHlwZW9mIG9iai5pbnNwZWN0KXJldHVybiBvYmouaW5zcGVjdCgpfWlmKGZ1bmN0aW9uIGlzTWFwKHgpe2lmKCFtYXBTaXplfHwheHx8Im9iamVjdCIhPXR5cGVvZiB4KXJldHVybiExO3RyeXttYXBTaXplLmNhbGwoeCk7dHJ5e3NldFNpemUuY2FsbCh4KX1jYXRjaChzKXtyZXR1cm4hMH1yZXR1cm4geCBpbnN0YW5jZW9mIE1hcH1jYXRjaChlKXt9cmV0dXJuITF9KG9iaikpe3ZhciBtYXBQYXJ0cz1bXTtyZXR1cm4gbWFwRm9yRWFjaCYmbWFwRm9yRWFjaC5jYWxsKG9iaixmdW5jdGlvbih2YWx1ZSxrZXkpe21hcFBhcnRzLnB1c2goaW5zcGVjdChrZXksb2JqLCEwKSsiID0+ICIraW5zcGVjdCh2YWx1ZSxvYmopKX0pLGNvbGxlY3Rpb25PZigiTWFwIixtYXBTaXplLmNhbGwob2JqKSxtYXBQYXJ0cyxpbmRlbnQpfWlmKGZ1bmN0aW9uIGlzU2V0KHgpe2lmKCFzZXRTaXplfHwheHx8Im9iamVjdCIhPXR5cGVvZiB4KXJldHVybiExO3RyeXtzZXRTaXplLmNhbGwoeCk7dHJ5e21hcFNpemUuY2FsbCh4KX1jYXRjaChtKXtyZXR1cm4hMH1yZXR1cm4geCBpbnN0YW5jZW9mIFNldH1jYXRjaChlKXt9cmV0dXJuITF9KG9iaikpe3ZhciBzZXRQYXJ0cz1bXTtyZXR1cm4gc2V0Rm9yRWFjaCYmc2V0Rm9yRWFjaC5jYWxsKG9iaixmdW5jdGlvbih2YWx1ZSl7c2V0UGFydHMucHVzaChpbnNwZWN0KHZhbHVlLG9iaikpfSksY29sbGVjdGlvbk9mKCJTZXQiLHNldFNpemUuY2FsbChvYmopLHNldFBhcnRzLGluZGVudCl9aWYoZnVuY3Rpb24gaXNXZWFrTWFwKHgpe2lmKCF3ZWFrTWFwSGFzfHwheHx8Im9iamVjdCIhPXR5cGVvZiB4KXJldHVybiExO3RyeXt3ZWFrTWFwSGFzLmNhbGwoeCx3ZWFrTWFwSGFzKTt0cnl7d2Vha1NldEhhcy5jYWxsKHgsd2Vha1NldEhhcyl9Y2F0Y2gocyl7cmV0dXJuITB9cmV0dXJuIHggaW5zdGFuY2VvZiBXZWFrTWFwfWNhdGNoKGUpe31yZXR1cm4hMX0ob2JqKSlyZXR1cm4gd2Vha0NvbGxlY3Rpb25PZigiV2Vha01hcCIpO2lmKGZ1bmN0aW9uIGlzV2Vha1NldCh4KXtpZighd2Vha1NldEhhc3x8IXh8fCJvYmplY3QiIT10eXBlb2YgeClyZXR1cm4hMTt0cnl7d2Vha1NldEhhcy5jYWxsKHgsd2Vha1NldEhhcyk7dHJ5e3dlYWtNYXBIYXMuY2FsbCh4LHdlYWtNYXBIYXMpfWNhdGNoKHMpe3JldHVybiEwfXJldHVybiB4IGluc3RhbmNlb2YgV2Vha1NldH1jYXRjaChlKXt9cmV0dXJuITF9KG9iaikpcmV0dXJuIHdlYWtDb2xsZWN0aW9uT2YoIldlYWtTZXQiKTtpZihmdW5jdGlvbiBpc1dlYWtSZWYoeCl7aWYoIXdlYWtSZWZEZXJlZnx8IXh8fCJvYmplY3QiIT10eXBlb2YgeClyZXR1cm4hMTt0cnl7cmV0dXJuIHdlYWtSZWZEZXJlZi5jYWxsKHgpLCEwfWNhdGNoKGUpe31yZXR1cm4hMX0ob2JqKSlyZXR1cm4gd2Vha0NvbGxlY3Rpb25PZigiV2Vha1JlZiIpO2lmKGZ1bmN0aW9uIGlzTnVtYmVyKG9iail7cmV0dXJuIltvYmplY3QgTnVtYmVyXSI9PT10b1N0cihvYmopJiZjYW5UcnVzdFRvU3RyaW5nKG9iail9KG9iaikpcmV0dXJuIG1hcmtCb3hlZChpbnNwZWN0KE51bWJlcihvYmopKSk7aWYoZnVuY3Rpb24gaXNCaWdJbnQob2JqKXtpZighb2JqfHwib2JqZWN0IiE9dHlwZW9mIG9ianx8IWJpZ0ludFZhbHVlT2YpcmV0dXJuITE7dHJ5e3JldHVybiBiaWdJbnRWYWx1ZU9mLmNhbGwob2JqKSwhMH1jYXRjaChlKXt9cmV0dXJuITF9KG9iaikpcmV0dXJuIG1hcmtCb3hlZChpbnNwZWN0KGJpZ0ludFZhbHVlT2YuY2FsbChvYmopKSk7aWYoZnVuY3Rpb24gaXNCb29sZWFuKG9iail7cmV0dXJuIltvYmplY3QgQm9vbGVhbl0iPT09dG9TdHIob2JqKSYmY2FuVHJ1c3RUb1N0cmluZyhvYmopfShvYmopKXJldHVybiBtYXJrQm94ZWQoYm9vbGVhblZhbHVlT2YuY2FsbChvYmopKTtpZihmdW5jdGlvbiBpc1N0cmluZyhvYmope3JldHVybiJbb2JqZWN0IFN0cmluZ10iPT09dG9TdHIob2JqKSYmY2FuVHJ1c3RUb1N0cmluZyhvYmopfShvYmopKXJldHVybiBtYXJrQm94ZWQoaW5zcGVjdChTdHJpbmcob2JqKSkpO2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZvYmo9PT13aW5kb3cpcmV0dXJuInsgW29iamVjdCBXaW5kb3ddIH0iO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcyYmb2JqPT09Z2xvYmFsVGhpc3x8dm9pZCAwIT09X193ZWJwYWNrX3JlcXVpcmVfXy5nJiZvYmo9PT1fX3dlYnBhY2tfcmVxdWlyZV9fLmcpcmV0dXJuInsgW29iamVjdCBnbG9iYWxUaGlzXSB9IjtpZighZnVuY3Rpb24gaXNEYXRlKG9iail7cmV0dXJuIltvYmplY3QgRGF0ZV0iPT09dG9TdHIob2JqKSYmY2FuVHJ1c3RUb1N0cmluZyhvYmopfShvYmopJiYhaXNSZWdFeHAob2JqKSl7dmFyIHlzPWFyck9iaktleXMob2JqLGluc3BlY3QpLGlzUGxhaW5PYmplY3Q9Z1BPP2dQTyhvYmopPT09T2JqZWN0LnByb3RvdHlwZTpvYmogaW5zdGFuY2VvZiBPYmplY3R8fG9iai5jb25zdHJ1Y3Rvcj09PU9iamVjdCxwcm90b1RhZz1vYmogaW5zdGFuY2VvZiBPYmplY3Q/IiI6Im51bGwgcHJvdG90eXBlIixzdHJpbmdUYWc9IWlzUGxhaW5PYmplY3QmJnRvU3RyaW5nVGFnJiZPYmplY3Qob2JqKT09PW9iaiYmdG9TdHJpbmdUYWcgaW4gb2JqPyRzbGljZS5jYWxsKHRvU3RyKG9iaiksOCwtMSk6cHJvdG9UYWc/Ik9iamVjdCI6IiIsdGFnPShpc1BsYWluT2JqZWN0fHwiZnVuY3Rpb24iIT10eXBlb2Ygb2JqLmNvbnN0cnVjdG9yPyIiOm9iai5jb25zdHJ1Y3Rvci5uYW1lP29iai5jb25zdHJ1Y3Rvci5uYW1lKyIgIjoiIikrKHN0cmluZ1RhZ3x8cHJvdG9UYWc/IlsiKyRqb2luLmNhbGwoJGNvbmNhdC5jYWxsKFtdLHN0cmluZ1RhZ3x8W10scHJvdG9UYWd8fFtdKSwiOiAiKSsiXSAiOiIiKTtyZXR1cm4gMD09PXlzLmxlbmd0aD90YWcrInt9IjppbmRlbnQ/dGFnKyJ7IitpbmRlbnRlZEpvaW4oeXMsaW5kZW50KSsifSI6dGFnKyJ7ICIrJGpvaW4uY2FsbCh5cywiLCAiKSsiIH0ifXJldHVybiBTdHJpbmcob2JqKX07dmFyIGhhc093bj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5fHxmdW5jdGlvbihrZXkpe3JldHVybiBrZXkgaW4gdGhpc307ZnVuY3Rpb24gaGFzKG9iaixrZXkpe3JldHVybiBoYXNPd24uY2FsbChvYmosa2V5KX1mdW5jdGlvbiB0b1N0cihvYmope3JldHVybiBvYmplY3RUb1N0cmluZy5jYWxsKG9iail9ZnVuY3Rpb24gaW5kZXhPZih4cyx4KXtpZih4cy5pbmRleE9mKXJldHVybiB4cy5pbmRleE9mKHgpO2Zvcih2YXIgaT0wLGw9eHMubGVuZ3RoO2k8bDtpKyspaWYoeHNbaV09PT14KXJldHVybiBpO3JldHVybi0xfWZ1bmN0aW9uIGluc3BlY3RTdHJpbmcoc3RyLG9wdHMpe2lmKHN0ci5sZW5ndGg+b3B0cy5tYXhTdHJpbmdMZW5ndGgpe3ZhciByZW1haW5pbmc9c3RyLmxlbmd0aC1vcHRzLm1heFN0cmluZ0xlbmd0aCx0cmFpbGVyPSIuLi4gIityZW1haW5pbmcrIiBtb3JlIGNoYXJhY3RlciIrKHJlbWFpbmluZz4xPyJzIjoiIik7cmV0dXJuIGluc3BlY3RTdHJpbmcoJHNsaWNlLmNhbGwoc3RyLDAsb3B0cy5tYXhTdHJpbmdMZW5ndGgpLG9wdHMpK3RyYWlsZXJ9dmFyIHF1b3RlUkU9cXVvdGVSRXNbb3B0cy5xdW90ZVN0eWxlfHwic2luZ2xlIl07cmV0dXJuIHF1b3RlUkUubGFzdEluZGV4PTAsd3JhcFF1b3RlcygkcmVwbGFjZS5jYWxsKCRyZXBsYWNlLmNhbGwoc3RyLHF1b3RlUkUsIlxcJDEiKSwvW1x4MDAtXHgxZl0vZyxsb3dieXRlKSwic2luZ2xlIixvcHRzKX1mdW5jdGlvbiBsb3dieXRlKGMpe3ZhciBuPWMuY2hhckNvZGVBdCgwKSx4PXs4OiJiIiw5OiJ0IiwxMDoibiIsMTI6ImYiLDEzOiJyIn1bbl07cmV0dXJuIHg/IlxcIit4OiJcXHgiKyhuPDE2PyIwIjoiIikrJHRvVXBwZXJDYXNlLmNhbGwobi50b1N0cmluZygxNikpfWZ1bmN0aW9uIG1hcmtCb3hlZChzdHIpe3JldHVybiJPYmplY3QoIitzdHIrIikifWZ1bmN0aW9uIHdlYWtDb2xsZWN0aW9uT2YodHlwZSl7cmV0dXJuIHR5cGUrIiB7ID8gfSJ9ZnVuY3Rpb24gY29sbGVjdGlvbk9mKHR5cGUsc2l6ZSxlbnRyaWVzLGluZGVudCl7cmV0dXJuIHR5cGUrIiAoIitzaXplKyIpIHsiKyhpbmRlbnQ/aW5kZW50ZWRKb2luKGVudHJpZXMsaW5kZW50KTokam9pbi5jYWxsKGVudHJpZXMsIiwgIikpKyJ9In1mdW5jdGlvbiBpbmRlbnRlZEpvaW4oeHMsaW5kZW50KXtpZigwPT09eHMubGVuZ3RoKXJldHVybiIiO3ZhciBsaW5lSm9pbmVyPSJcbiIraW5kZW50LnByZXYraW5kZW50LmJhc2U7cmV0dXJuIGxpbmVKb2luZXIrJGpvaW4uY2FsbCh4cywiLCIrbGluZUpvaW5lcikrIlxuIitpbmRlbnQucHJldn1mdW5jdGlvbiBhcnJPYmpLZXlzKG9iaixpbnNwZWN0KXt2YXIgaXNBcnI9aXNBcnJheShvYmopLHhzPVtdO2lmKGlzQXJyKXt4cy5sZW5ndGg9b2JqLmxlbmd0aDtmb3IodmFyIGk9MDtpPG9iai5sZW5ndGg7aSsrKXhzW2ldPWhhcyhvYmosaSk/aW5zcGVjdChvYmpbaV0sb2JqKToiIn12YXIgc3ltTWFwLHN5bXM9ImZ1bmN0aW9uIj09dHlwZW9mIGdPUFM/Z09QUyhvYmopOltdO2lmKGhhc1NoYW1tZWRTeW1ib2xzKXtzeW1NYXA9e307Zm9yKHZhciBrPTA7azxzeW1zLmxlbmd0aDtrKyspc3ltTWFwWyIkIitzeW1zW2tdXT1zeW1zW2tdfWZvcih2YXIga2V5IGluIG9iailoYXMob2JqLGtleSkmJihpc0FyciYmU3RyaW5nKE51bWJlcihrZXkpKT09PWtleSYma2V5PG9iai5sZW5ndGh8fGhhc1NoYW1tZWRTeW1ib2xzJiZzeW1NYXBbIiQiK2tleV1pbnN0YW5jZW9mIFN5bWJvbHx8KCR0ZXN0LmNhbGwoL1teXHckXS8sa2V5KT94cy5wdXNoKGluc3BlY3Qoa2V5LG9iaikrIjogIitpbnNwZWN0KG9ialtrZXldLG9iaikpOnhzLnB1c2goa2V5KyI6ICIraW5zcGVjdChvYmpba2V5XSxvYmopKSkpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBnT1BTKWZvcih2YXIgaj0wO2o8c3ltcy5sZW5ndGg7aisrKWlzRW51bWVyYWJsZS5jYWxsKG9iaixzeW1zW2pdKSYmeHMucHVzaCgiWyIraW5zcGVjdChzeW1zW2pdKSsiXTogIitpbnNwZWN0KG9ialtzeW1zW2pdXSxvYmopKTtyZXR1cm4geHN9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL29iamVjdC1pcy9pbXBsZW1lbnRhdGlvbi5qcyIobW9kdWxlKXsidXNlIHN0cmljdCI7dmFyIG51bWJlcklzTmFOPWZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gdmFsdWUhPXZhbHVlfTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbiBpcyhhLGIpe3JldHVybiAwPT09YSYmMD09PWI/MS9hPT0xL2I6YT09PWJ8fCEoIW51bWJlcklzTmFOKGEpfHwhbnVtYmVySXNOYU4oYikpfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9vYmplY3QtaXMvaW5kZXguanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBkZWZpbmU9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2RlZmluZS1wcm9wZXJ0aWVzL2luZGV4LmpzIiksY2FsbEJpbmQ9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2NhbGwtYmluZC9pbmRleC5qcyIpLGltcGxlbWVudGF0aW9uPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9vYmplY3QtaXMvaW1wbGVtZW50YXRpb24uanMiKSxnZXRQb2x5ZmlsbD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvb2JqZWN0LWlzL3BvbHlmaWxsLmpzIiksc2hpbT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvb2JqZWN0LWlzL3NoaW0uanMiKSxwb2x5ZmlsbD1jYWxsQmluZChnZXRQb2x5ZmlsbCgpLE9iamVjdCk7ZGVmaW5lKHBvbHlmaWxsLHtnZXRQb2x5ZmlsbCxpbXBsZW1lbnRhdGlvbixzaGltfSksbW9kdWxlLmV4cG9ydHM9cG9seWZpbGx9LCIuLi8uLi9ub2RlX21vZHVsZXMvb2JqZWN0LWlzL3BvbHlmaWxsLmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgaW1wbGVtZW50YXRpb249X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL29iamVjdC1pcy9pbXBsZW1lbnRhdGlvbi5qcyIpO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uIGdldFBvbHlmaWxsKCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5pcz9PYmplY3QuaXM6aW1wbGVtZW50YXRpb259fSwiLi4vLi4vbm9kZV9tb2R1bGVzL29iamVjdC1pcy9zaGltLmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgZ2V0UG9seWZpbGw9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL29iamVjdC1pcy9wb2x5ZmlsbC5qcyIpLGRlZmluZT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZGVmaW5lLXByb3BlcnRpZXMvaW5kZXguanMiKTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbiBzaGltT2JqZWN0SXMoKXt2YXIgcG9seWZpbGw9Z2V0UG9seWZpbGwoKTtyZXR1cm4gZGVmaW5lKE9iamVjdCx7aXM6cG9seWZpbGx9LHtpczpmdW5jdGlvbiB0ZXN0T2JqZWN0SXMoKXtyZXR1cm4gT2JqZWN0LmlzIT09cG9seWZpbGx9fSkscG9seWZpbGx9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL29iamVjdC1rZXlzL2ltcGxlbWVudGF0aW9uLmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIga2V5c1NoaW07aWYoIU9iamVjdC5rZXlzKXt2YXIgaGFzPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksdG9TdHI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxpc0FyZ3M9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL29iamVjdC1rZXlzL2lzQXJndW1lbnRzLmpzIiksaXNFbnVtZXJhYmxlPU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUsaGFzRG9udEVudW1CdWc9IWlzRW51bWVyYWJsZS5jYWxsKHt0b1N0cmluZzpudWxsfSwidG9TdHJpbmciKSxoYXNQcm90b0VudW1CdWc9aXNFbnVtZXJhYmxlLmNhbGwoZnVuY3Rpb24oKXt9LCJwcm90b3R5cGUiKSxkb250RW51bXM9WyJ0b1N0cmluZyIsInRvTG9jYWxlU3RyaW5nIiwidmFsdWVPZiIsImhhc093blByb3BlcnR5IiwiaXNQcm90b3R5cGVPZiIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwiY29uc3RydWN0b3IiXSxlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZT1mdW5jdGlvbihvKXt2YXIgY3Rvcj1vLmNvbnN0cnVjdG9yO3JldHVybiBjdG9yJiZjdG9yLnByb3RvdHlwZT09PW99LGV4Y2x1ZGVkS2V5cz17JGFwcGxpY2F0aW9uQ2FjaGU6ITAsJGNvbnNvbGU6ITAsJGV4dGVybmFsOiEwLCRmcmFtZTohMCwkZnJhbWVFbGVtZW50OiEwLCRmcmFtZXM6ITAsJGlubmVySGVpZ2h0OiEwLCRpbm5lcldpZHRoOiEwLCRvbm1vemZ1bGxzY3JlZW5jaGFuZ2U6ITAsJG9ubW96ZnVsbHNjcmVlbmVycm9yOiEwLCRvdXRlckhlaWdodDohMCwkb3V0ZXJXaWR0aDohMCwkcGFnZVhPZmZzZXQ6ITAsJHBhZ2VZT2Zmc2V0OiEwLCRwYXJlbnQ6ITAsJHNjcm9sbExlZnQ6ITAsJHNjcm9sbFRvcDohMCwkc2Nyb2xsWDohMCwkc2Nyb2xsWTohMCwkc2VsZjohMCwkd2Via2l0SW5kZXhlZERCOiEwLCR3ZWJraXRTdG9yYWdlSW5mbzohMCwkd2luZG93OiEwfSxoYXNBdXRvbWF0aW9uRXF1YWxpdHlCdWc9ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvdylyZXR1cm4hMTtmb3IodmFyIGsgaW4gd2luZG93KXRyeXtpZighZXhjbHVkZWRLZXlzWyIkIitrXSYmaGFzLmNhbGwod2luZG93LGspJiZudWxsIT09d2luZG93W2tdJiYib2JqZWN0Ij09dHlwZW9mIHdpbmRvd1trXSl0cnl7ZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUod2luZG93W2tdKX1jYXRjaChlKXtyZXR1cm4hMH19Y2F0Y2goZSl7cmV0dXJuITB9cmV0dXJuITF9KCk7a2V5c1NoaW09ZnVuY3Rpb24ga2V5cyhvYmplY3Qpe3ZhciBpc09iamVjdD1udWxsIT09b2JqZWN0JiYib2JqZWN0Ij09dHlwZW9mIG9iamVjdCxpc0Z1bmN0aW9uPSJbb2JqZWN0IEZ1bmN0aW9uXSI9PT10b1N0ci5jYWxsKG9iamVjdCksaXNBcmd1bWVudHM9aXNBcmdzKG9iamVjdCksaXNTdHJpbmc9aXNPYmplY3QmJiJbb2JqZWN0IFN0cmluZ10iPT09dG9TdHIuY2FsbChvYmplY3QpLHRoZUtleXM9W107aWYoIWlzT2JqZWN0JiYhaXNGdW5jdGlvbiYmIWlzQXJndW1lbnRzKXRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdC5rZXlzIGNhbGxlZCBvbiBhIG5vbi1vYmplY3QiKTt2YXIgc2tpcFByb3RvPWhhc1Byb3RvRW51bUJ1ZyYmaXNGdW5jdGlvbjtpZihpc1N0cmluZyYmb2JqZWN0Lmxlbmd0aD4wJiYhaGFzLmNhbGwob2JqZWN0LDApKWZvcih2YXIgaT0wO2k8b2JqZWN0Lmxlbmd0aDsrK2kpdGhlS2V5cy5wdXNoKFN0cmluZyhpKSk7aWYoaXNBcmd1bWVudHMmJm9iamVjdC5sZW5ndGg+MClmb3IodmFyIGo9MDtqPG9iamVjdC5sZW5ndGg7KytqKXRoZUtleXMucHVzaChTdHJpbmcoaikpO2Vsc2UgZm9yKHZhciBuYW1lIGluIG9iamVjdClza2lwUHJvdG8mJiJwcm90b3R5cGUiPT09bmFtZXx8IWhhcy5jYWxsKG9iamVjdCxuYW1lKXx8dGhlS2V5cy5wdXNoKFN0cmluZyhuYW1lKSk7aWYoaGFzRG9udEVudW1CdWcpZm9yKHZhciBza2lwQ29uc3RydWN0b3I9ZnVuY3Rpb24obyl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3d8fCFoYXNBdXRvbWF0aW9uRXF1YWxpdHlCdWcpcmV0dXJuIGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlKG8pO3RyeXtyZXR1cm4gZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUobyl9Y2F0Y2goZSl7cmV0dXJuITF9fShvYmplY3QpLGs9MDtrPGRvbnRFbnVtcy5sZW5ndGg7KytrKXNraXBDb25zdHJ1Y3RvciYmImNvbnN0cnVjdG9yIj09PWRvbnRFbnVtc1trXXx8IWhhcy5jYWxsKG9iamVjdCxkb250RW51bXNba10pfHx0aGVLZXlzLnB1c2goZG9udEVudW1zW2tdKTtyZXR1cm4gdGhlS2V5c319bW9kdWxlLmV4cG9ydHM9a2V5c1NoaW19LCIuLi8uLi9ub2RlX21vZHVsZXMvb2JqZWN0LWtleXMvaW5kZXguanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBzbGljZT1BcnJheS5wcm90b3R5cGUuc2xpY2UsaXNBcmdzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9vYmplY3Qta2V5cy9pc0FyZ3VtZW50cy5qcyIpLG9yaWdLZXlzPU9iamVjdC5rZXlzLGtleXNTaGltPW9yaWdLZXlzP2Z1bmN0aW9uIGtleXMobyl7cmV0dXJuIG9yaWdLZXlzKG8pfTpfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvb2JqZWN0LWtleXMvaW1wbGVtZW50YXRpb24uanMiKSxvcmlnaW5hbEtleXM9T2JqZWN0LmtleXM7a2V5c1NoaW0uc2hpbT1mdW5jdGlvbiBzaGltT2JqZWN0S2V5cygpe2lmKE9iamVjdC5rZXlzKXt2YXIga2V5c1dvcmtzV2l0aEFyZ3VtZW50cz1mdW5jdGlvbigpe3ZhciBhcmdzPU9iamVjdC5rZXlzKGFyZ3VtZW50cyk7cmV0dXJuIGFyZ3MmJmFyZ3MubGVuZ3RoPT09YXJndW1lbnRzLmxlbmd0aH0oMSwyKTtrZXlzV29ya3NXaXRoQXJndW1lbnRzfHwoT2JqZWN0LmtleXM9ZnVuY3Rpb24ga2V5cyhvYmplY3Qpe3JldHVybiBpc0FyZ3Mob2JqZWN0KT9vcmlnaW5hbEtleXMoc2xpY2UuY2FsbChvYmplY3QpKTpvcmlnaW5hbEtleXMob2JqZWN0KX0pfWVsc2UgT2JqZWN0LmtleXM9a2V5c1NoaW07cmV0dXJuIE9iamVjdC5rZXlzfHxrZXlzU2hpbX0sbW9kdWxlLmV4cG9ydHM9a2V5c1NoaW19LCIuLi8uLi9ub2RlX21vZHVsZXMvb2JqZWN0LWtleXMvaXNBcmd1bWVudHMuanMiKG1vZHVsZSl7InVzZSBzdHJpY3QiO3ZhciB0b1N0cj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVlKXt2YXIgc3RyPXRvU3RyLmNhbGwodmFsdWUpLGlzQXJncz0iW29iamVjdCBBcmd1bWVudHNdIj09PXN0cjtyZXR1cm4gaXNBcmdzfHwoaXNBcmdzPSJbb2JqZWN0IEFycmF5XSIhPT1zdHImJm51bGwhPT12YWx1ZSYmIm9iamVjdCI9PXR5cGVvZiB2YWx1ZSYmIm51bWJlciI9PXR5cGVvZiB2YWx1ZS5sZW5ndGgmJnZhbHVlLmxlbmd0aD49MCYmIltvYmplY3QgRnVuY3Rpb25dIj09PXRvU3RyLmNhbGwodmFsdWUuY2FsbGVlKSksaXNBcmdzfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9vYmplY3QuYXNzaWduL2ltcGxlbWVudGF0aW9uLmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgb2JqZWN0S2V5cz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvb2JqZWN0LWtleXMvaW5kZXguanMiKSxoYXNTeW1ib2xzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9oYXMtc3ltYm9scy9zaGFtcy5qcyIpKCksY2FsbEJvdW5kPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9jYWxsLWJvdW5kL2luZGV4LmpzIiksJE9iamVjdD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZXMtb2JqZWN0LWF0b21zL2luZGV4LmpzIiksJHB1c2g9Y2FsbEJvdW5kKCJBcnJheS5wcm90b3R5cGUucHVzaCIpLCRwcm9wSXNFbnVtZXJhYmxlPWNhbGxCb3VuZCgiT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSIpLG9yaWdpbmFsR2V0U3ltYm9scz1oYXNTeW1ib2xzPyRPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzOm51bGw7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24gYXNzaWduKHRhcmdldCxzb3VyY2UxKXtpZihudWxsPT10YXJnZXQpdGhyb3cgbmV3IFR5cGVFcnJvcigidGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0Iik7dmFyIHRvPSRPYmplY3QodGFyZ2V0KTtpZigxPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdG87Zm9yKHZhciBzPTE7czxhcmd1bWVudHMubGVuZ3RoOysrcyl7dmFyIGZyb209JE9iamVjdChhcmd1bWVudHNbc10pLGtleXM9b2JqZWN0S2V5cyhmcm9tKSxnZXRTeW1ib2xzPWhhc1N5bWJvbHMmJigkT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sc3x8b3JpZ2luYWxHZXRTeW1ib2xzKTtpZihnZXRTeW1ib2xzKWZvcih2YXIgc3ltcz1nZXRTeW1ib2xzKGZyb20pLGo9MDtqPHN5bXMubGVuZ3RoOysrail7dmFyIGtleT1zeW1zW2pdOyRwcm9wSXNFbnVtZXJhYmxlKGZyb20sa2V5KSYmJHB1c2goa2V5cyxrZXkpfWZvcih2YXIgaT0wO2k8a2V5cy5sZW5ndGg7KytpKXt2YXIgbmV4dEtleT1rZXlzW2ldO2lmKCRwcm9wSXNFbnVtZXJhYmxlKGZyb20sbmV4dEtleSkpe3ZhciBwcm9wVmFsdWU9ZnJvbVtuZXh0S2V5XTt0b1tuZXh0S2V5XT1wcm9wVmFsdWV9fX1yZXR1cm4gdG99fSwiLi4vLi4vbm9kZV9tb2R1bGVzL29iamVjdC5hc3NpZ24vcG9seWZpbGwuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBpbXBsZW1lbnRhdGlvbj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvb2JqZWN0LmFzc2lnbi9pbXBsZW1lbnRhdGlvbi5qcyIpO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uIGdldFBvbHlmaWxsKCl7cmV0dXJuIE9iamVjdC5hc3NpZ24/ZnVuY3Rpb24oKXtpZighT2JqZWN0LmFzc2lnbilyZXR1cm4hMTtmb3IodmFyIHN0cj0iYWJjZGVmZ2hpamtsbW5vcHFyc3QiLGxldHRlcnM9c3RyLnNwbGl0KCIiKSxtYXA9e30saT0wO2k8bGV0dGVycy5sZW5ndGg7KytpKW1hcFtsZXR0ZXJzW2ldXT1sZXR0ZXJzW2ldO3ZhciBvYmo9T2JqZWN0LmFzc2lnbih7fSxtYXApLGFjdHVhbD0iIjtmb3IodmFyIGsgaW4gb2JqKWFjdHVhbCs9aztyZXR1cm4gc3RyIT09YWN0dWFsfSgpfHxmdW5jdGlvbigpe2lmKCFPYmplY3QuYXNzaWdufHwhT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKXJldHVybiExO3ZhciB0aHJvd2VyPU9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7MToyfSk7dHJ5e09iamVjdC5hc3NpZ24odGhyb3dlciwieHkiKX1jYXRjaChlKXtyZXR1cm4ieSI9PT10aHJvd2VyWzFdfXJldHVybiExfSgpP2ltcGxlbWVudGF0aW9uOk9iamVjdC5hc3NpZ246aW1wbGVtZW50YXRpb259fSwiLi4vLi4vbm9kZV9tb2R1bGVzL29zLWJyb3dzZXJpZnkvYnJvd3Nlci5qcyIoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyl7ZXhwb3J0cy5lbmRpYW5uZXNzPWZ1bmN0aW9uKCl7cmV0dXJuIkxFIn0sZXhwb3J0cy5ob3N0bmFtZT1mdW5jdGlvbigpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgbG9jYXRpb24/bG9jYXRpb24uaG9zdG5hbWU6IiJ9LGV4cG9ydHMubG9hZGF2Zz1mdW5jdGlvbigpe3JldHVybltdfSxleHBvcnRzLnVwdGltZT1mdW5jdGlvbigpe3JldHVybiAwfSxleHBvcnRzLmZyZWVtZW09ZnVuY3Rpb24oKXtyZXR1cm4gTnVtYmVyLk1BWF9WQUxVRX0sZXhwb3J0cy50b3RhbG1lbT1mdW5jdGlvbigpe3JldHVybiBOdW1iZXIuTUFYX1ZBTFVFfSxleHBvcnRzLmNwdXM9ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZXhwb3J0cy50eXBlPWZ1bmN0aW9uKCl7cmV0dXJuIkJyb3dzZXIifSxleHBvcnRzLnJlbGVhc2U9ZnVuY3Rpb24oKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIG5hdmlnYXRvcj9uYXZpZ2F0b3IuYXBwVmVyc2lvbjoiIn0sZXhwb3J0cy5uZXR3b3JrSW50ZXJmYWNlcz1leHBvcnRzLmdldE5ldHdvcmtJbnRlcmZhY2VzPWZ1bmN0aW9uKCl7cmV0dXJue319LGV4cG9ydHMuYXJjaD1mdW5jdGlvbigpe3JldHVybiJqYXZhc2NyaXB0In0sZXhwb3J0cy5wbGF0Zm9ybT1mdW5jdGlvbigpe3JldHVybiJicm93c2VyIn0sZXhwb3J0cy50bXBkaXI9ZXhwb3J0cy50bXBEaXI9ZnVuY3Rpb24oKXtyZXR1cm4iL3RtcCJ9LGV4cG9ydHMuRU9MPSJcbiIsZXhwb3J0cy5ob21lZGlyPWZ1bmN0aW9uKCl7cmV0dXJuIi8ifX0sIi4uLy4uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi91dGlscy9jb21tb24uanMiKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgVFlQRURfT0s9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5JiYidW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQxNkFycmF5JiYidW5kZWZpbmVkIiE9dHlwZW9mIEludDMyQXJyYXk7ZnVuY3Rpb24gX2hhcyhvYmosa2V5KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaixrZXkpfWV4cG9ydHMuYXNzaWduPWZ1bmN0aW9uKG9iail7Zm9yKHZhciBzb3VyY2VzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtzb3VyY2VzLmxlbmd0aDspe3ZhciBzb3VyY2U9c291cmNlcy5zaGlmdCgpO2lmKHNvdXJjZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBzb3VyY2UpdGhyb3cgbmV3IFR5cGVFcnJvcihzb3VyY2UrIm11c3QgYmUgbm9uLW9iamVjdCIpO2Zvcih2YXIgcCBpbiBzb3VyY2UpX2hhcyhzb3VyY2UscCkmJihvYmpbcF09c291cmNlW3BdKX19cmV0dXJuIG9ian0sZXhwb3J0cy5zaHJpbmtCdWY9ZnVuY3Rpb24oYnVmLHNpemUpe3JldHVybiBidWYubGVuZ3RoPT09c2l6ZT9idWY6YnVmLnN1YmFycmF5P2J1Zi5zdWJhcnJheSgwLHNpemUpOihidWYubGVuZ3RoPXNpemUsYnVmKX07dmFyIGZuVHlwZWQ9e2FycmF5U2V0OmZ1bmN0aW9uKGRlc3Qsc3JjLHNyY19vZmZzLGxlbixkZXN0X29mZnMpe2lmKHNyYy5zdWJhcnJheSYmZGVzdC5zdWJhcnJheSlkZXN0LnNldChzcmMuc3ViYXJyYXkoc3JjX29mZnMsc3JjX29mZnMrbGVuKSxkZXN0X29mZnMpO2Vsc2UgZm9yKHZhciBpPTA7aTxsZW47aSsrKWRlc3RbZGVzdF9vZmZzK2ldPXNyY1tzcmNfb2ZmcytpXX0sZmxhdHRlbkNodW5rczpmdW5jdGlvbihjaHVua3Mpe3ZhciBpLGwsbGVuLHBvcyxjaHVuayxyZXN1bHQ7Zm9yKGxlbj0wLGk9MCxsPWNodW5rcy5sZW5ndGg7aTxsO2krKylsZW4rPWNodW5rc1tpXS5sZW5ndGg7Zm9yKHJlc3VsdD1uZXcgVWludDhBcnJheShsZW4pLHBvcz0wLGk9MCxsPWNodW5rcy5sZW5ndGg7aTxsO2krKyljaHVuaz1jaHVua3NbaV0scmVzdWx0LnNldChjaHVuayxwb3MpLHBvcys9Y2h1bmsubGVuZ3RoO3JldHVybiByZXN1bHR9fSxmblVudHlwZWQ9e2FycmF5U2V0OmZ1bmN0aW9uKGRlc3Qsc3JjLHNyY19vZmZzLGxlbixkZXN0X29mZnMpe2Zvcih2YXIgaT0wO2k8bGVuO2krKylkZXN0W2Rlc3Rfb2ZmcytpXT1zcmNbc3JjX29mZnMraV19LGZsYXR0ZW5DaHVua3M6ZnVuY3Rpb24oY2h1bmtzKXtyZXR1cm5bXS5jb25jYXQuYXBwbHkoW10sY2h1bmtzKX19O2V4cG9ydHMuc2V0VHlwZWQ9ZnVuY3Rpb24ob24pe29uPyhleHBvcnRzLkJ1Zjg9VWludDhBcnJheSxleHBvcnRzLkJ1ZjE2PVVpbnQxNkFycmF5LGV4cG9ydHMuQnVmMzI9SW50MzJBcnJheSxleHBvcnRzLmFzc2lnbihleHBvcnRzLGZuVHlwZWQpKTooZXhwb3J0cy5CdWY4PUFycmF5LGV4cG9ydHMuQnVmMTY9QXJyYXksZXhwb3J0cy5CdWYzMj1BcnJheSxleHBvcnRzLmFzc2lnbihleHBvcnRzLGZuVW50eXBlZCkpfSxleHBvcnRzLnNldFR5cGVkKFRZUEVEX09LKX0sIi4uLy4uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2FkbGVyMzIuanMiKG1vZHVsZSl7InVzZSBzdHJpY3QiO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uIGFkbGVyMzIoYWRsZXIsYnVmLGxlbixwb3Mpe2Zvcih2YXIgczE9NjU1MzUmYWRsZXIsczI9YWRsZXI+Pj4xNiY2NTUzNSxuPTA7MCE9PWxlbjspe2xlbi09bj1sZW4+MmUzPzJlMzpsZW47ZG97czI9czIrKHMxPXMxK2J1Zltwb3MrK118MCl8MH13aGlsZSgtLW4pO3MxJT02NTUyMSxzMiU9NjU1MjF9cmV0dXJuIHMxfHMyPDwxNn19LCIuLi8uLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9jb25zdGFudHMuanMiKG1vZHVsZSl7InVzZSBzdHJpY3QiO21vZHVsZS5leHBvcnRzPXtaX05PX0ZMVVNIOjAsWl9QQVJUSUFMX0ZMVVNIOjEsWl9TWU5DX0ZMVVNIOjIsWl9GVUxMX0ZMVVNIOjMsWl9GSU5JU0g6NCxaX0JMT0NLOjUsWl9UUkVFUzo2LFpfT0s6MCxaX1NUUkVBTV9FTkQ6MSxaX05FRURfRElDVDoyLFpfRVJSTk86LTEsWl9TVFJFQU1fRVJST1I6LTIsWl9EQVRBX0VSUk9SOi0zLFpfQlVGX0VSUk9SOi01LFpfTk9fQ09NUFJFU1NJT046MCxaX0JFU1RfU1BFRUQ6MSxaX0JFU1RfQ09NUFJFU1NJT046OSxaX0RFRkFVTFRfQ09NUFJFU1NJT046LTEsWl9GSUxURVJFRDoxLFpfSFVGRk1BTl9PTkxZOjIsWl9STEU6MyxaX0ZJWEVEOjQsWl9ERUZBVUxUX1NUUkFURUdZOjAsWl9CSU5BUlk6MCxaX1RFWFQ6MSxaX1VOS05PV046MixaX0RFRkxBVEVEOjh9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY3JjMzIuanMiKG1vZHVsZSl7InVzZSBzdHJpY3QiO3ZhciBjcmNUYWJsZT1mdW5jdGlvbiBtYWtlVGFibGUoKXtmb3IodmFyIGMsdGFibGU9W10sbj0wO248MjU2O24rKyl7Yz1uO2Zvcih2YXIgaz0wO2s8ODtrKyspYz0xJmM/Mzk4ODI5MjM4NF5jPj4+MTpjPj4+MTt0YWJsZVtuXT1jfXJldHVybiB0YWJsZX0oKTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbiBjcmMzMihjcmMsYnVmLGxlbixwb3Mpe3ZhciB0PWNyY1RhYmxlLGVuZD1wb3MrbGVuO2NyY149LTE7Zm9yKHZhciBpPXBvcztpPGVuZDtpKyspY3JjPWNyYz4+PjhedFsyNTUmKGNyY15idWZbaV0pXTtyZXR1cm4tMV5jcmN9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvZGVmbGF0ZS5qcyIoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIGNvbmZpZ3VyYXRpb25fdGFibGUsdXRpbHM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3V0aWxzL2NvbW1vbi5qcyIpLHRyZWVzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL3RyZWVzLmpzIiksYWRsZXIzMj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9hZGxlcjMyLmpzIiksY3JjMzI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY3JjMzIuanMiKSxtc2c9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvbWVzc2FnZXMuanMiKTtmdW5jdGlvbiBlcnIoc3RybSxlcnJvckNvZGUpe3JldHVybiBzdHJtLm1zZz1tc2dbZXJyb3JDb2RlXSxlcnJvckNvZGV9ZnVuY3Rpb24gcmFuayhmKXtyZXR1cm4oZjw8MSktKGY+ND85OjApfWZ1bmN0aW9uIHplcm8oYnVmKXtmb3IodmFyIGxlbj1idWYubGVuZ3RoOy0tbGVuPj0wOylidWZbbGVuXT0wfWZ1bmN0aW9uIGZsdXNoX3BlbmRpbmcoc3RybSl7dmFyIHM9c3RybS5zdGF0ZSxsZW49cy5wZW5kaW5nO2xlbj5zdHJtLmF2YWlsX291dCYmKGxlbj1zdHJtLmF2YWlsX291dCksMCE9PWxlbiYmKHV0aWxzLmFycmF5U2V0KHN0cm0ub3V0cHV0LHMucGVuZGluZ19idWYscy5wZW5kaW5nX291dCxsZW4sc3RybS5uZXh0X291dCksc3RybS5uZXh0X291dCs9bGVuLHMucGVuZGluZ19vdXQrPWxlbixzdHJtLnRvdGFsX291dCs9bGVuLHN0cm0uYXZhaWxfb3V0LT1sZW4scy5wZW5kaW5nLT1sZW4sMD09PXMucGVuZGluZyYmKHMucGVuZGluZ19vdXQ9MCkpfWZ1bmN0aW9uIGZsdXNoX2Jsb2NrX29ubHkocyxsYXN0KXt0cmVlcy5fdHJfZmx1c2hfYmxvY2socyxzLmJsb2NrX3N0YXJ0Pj0wP3MuYmxvY2tfc3RhcnQ6LTEscy5zdHJzdGFydC1zLmJsb2NrX3N0YXJ0LGxhc3QpLHMuYmxvY2tfc3RhcnQ9cy5zdHJzdGFydCxmbHVzaF9wZW5kaW5nKHMuc3RybSl9ZnVuY3Rpb24gcHV0X2J5dGUocyxiKXtzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXT1ifWZ1bmN0aW9uIHB1dFNob3J0TVNCKHMsYil7cy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK109Yj4+PjgmMjU1LHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdPTI1NSZifWZ1bmN0aW9uIHJlYWRfYnVmKHN0cm0sYnVmLHN0YXJ0LHNpemUpe3ZhciBsZW49c3RybS5hdmFpbF9pbjtyZXR1cm4gbGVuPnNpemUmJihsZW49c2l6ZSksMD09PWxlbj8wOihzdHJtLmF2YWlsX2luLT1sZW4sdXRpbHMuYXJyYXlTZXQoYnVmLHN0cm0uaW5wdXQsc3RybS5uZXh0X2luLGxlbixzdGFydCksMT09PXN0cm0uc3RhdGUud3JhcD9zdHJtLmFkbGVyPWFkbGVyMzIoc3RybS5hZGxlcixidWYsbGVuLHN0YXJ0KToyPT09c3RybS5zdGF0ZS53cmFwJiYoc3RybS5hZGxlcj1jcmMzMihzdHJtLmFkbGVyLGJ1ZixsZW4sc3RhcnQpKSxzdHJtLm5leHRfaW4rPWxlbixzdHJtLnRvdGFsX2luKz1sZW4sbGVuKX1mdW5jdGlvbiBsb25nZXN0X21hdGNoKHMsY3VyX21hdGNoKXt2YXIgbWF0Y2gsbGVuLGNoYWluX2xlbmd0aD1zLm1heF9jaGFpbl9sZW5ndGgsc2Nhbj1zLnN0cnN0YXJ0LGJlc3RfbGVuPXMucHJldl9sZW5ndGgsbmljZV9tYXRjaD1zLm5pY2VfbWF0Y2gsbGltaXQ9cy5zdHJzdGFydD5zLndfc2l6ZS0yNjI/cy5zdHJzdGFydC0ocy53X3NpemUtMjYyKTowLF93aW49cy53aW5kb3csd21hc2s9cy53X21hc2sscHJldj1zLnByZXYsc3RyZW5kPXMuc3Ryc3RhcnQrMjU4LHNjYW5fZW5kMT1fd2luW3NjYW4rYmVzdF9sZW4tMV0sc2Nhbl9lbmQ9X3dpbltzY2FuK2Jlc3RfbGVuXTtzLnByZXZfbGVuZ3RoPj1zLmdvb2RfbWF0Y2gmJihjaGFpbl9sZW5ndGg+Pj0yKSxuaWNlX21hdGNoPnMubG9va2FoZWFkJiYobmljZV9tYXRjaD1zLmxvb2thaGVhZCk7ZG97aWYoX3dpblsobWF0Y2g9Y3VyX21hdGNoKStiZXN0X2xlbl09PT1zY2FuX2VuZCYmX3dpblttYXRjaCtiZXN0X2xlbi0xXT09PXNjYW5fZW5kMSYmX3dpblttYXRjaF09PT1fd2luW3NjYW5dJiZfd2luWysrbWF0Y2hdPT09X3dpbltzY2FuKzFdKXtzY2FuKz0yLG1hdGNoKys7ZG97fXdoaWxlKF93aW5bKytzY2FuXT09PV93aW5bKyttYXRjaF0mJl93aW5bKytzY2FuXT09PV93aW5bKyttYXRjaF0mJl93aW5bKytzY2FuXT09PV93aW5bKyttYXRjaF0mJl93aW5bKytzY2FuXT09PV93aW5bKyttYXRjaF0mJl93aW5bKytzY2FuXT09PV93aW5bKyttYXRjaF0mJl93aW5bKytzY2FuXT09PV93aW5bKyttYXRjaF0mJl93aW5bKytzY2FuXT09PV93aW5bKyttYXRjaF0mJl93aW5bKytzY2FuXT09PV93aW5bKyttYXRjaF0mJnNjYW48c3RyZW5kKTtpZihsZW49MjU4LShzdHJlbmQtc2Nhbiksc2Nhbj1zdHJlbmQtMjU4LGxlbj5iZXN0X2xlbil7aWYocy5tYXRjaF9zdGFydD1jdXJfbWF0Y2gsYmVzdF9sZW49bGVuLGxlbj49bmljZV9tYXRjaClicmVhaztzY2FuX2VuZDE9X3dpbltzY2FuK2Jlc3RfbGVuLTFdLHNjYW5fZW5kPV93aW5bc2NhbitiZXN0X2xlbl19fX13aGlsZSgoY3VyX21hdGNoPXByZXZbY3VyX21hdGNoJndtYXNrXSk+bGltaXQmJjAhPT0tLWNoYWluX2xlbmd0aCk7cmV0dXJuIGJlc3RfbGVuPD1zLmxvb2thaGVhZD9iZXN0X2xlbjpzLmxvb2thaGVhZH1mdW5jdGlvbiBmaWxsX3dpbmRvdyhzKXt2YXIgcCxuLG0sbW9yZSxzdHIsX3dfc2l6ZT1zLndfc2l6ZTtkb3tpZihtb3JlPXMud2luZG93X3NpemUtcy5sb29rYWhlYWQtcy5zdHJzdGFydCxzLnN0cnN0YXJ0Pj1fd19zaXplKyhfd19zaXplLTI2Mikpe3V0aWxzLmFycmF5U2V0KHMud2luZG93LHMud2luZG93LF93X3NpemUsX3dfc2l6ZSwwKSxzLm1hdGNoX3N0YXJ0LT1fd19zaXplLHMuc3Ryc3RhcnQtPV93X3NpemUscy5ibG9ja19zdGFydC09X3dfc2l6ZSxwPW49cy5oYXNoX3NpemU7ZG97bT1zLmhlYWRbLS1wXSxzLmhlYWRbcF09bT49X3dfc2l6ZT9tLV93X3NpemU6MH13aGlsZSgtLW4pO3A9bj1fd19zaXplO2Rve209cy5wcmV2Wy0tcF0scy5wcmV2W3BdPW0+PV93X3NpemU/bS1fd19zaXplOjB9d2hpbGUoLS1uKTttb3JlKz1fd19zaXplfWlmKDA9PT1zLnN0cm0uYXZhaWxfaW4pYnJlYWs7aWYobj1yZWFkX2J1ZihzLnN0cm0scy53aW5kb3cscy5zdHJzdGFydCtzLmxvb2thaGVhZCxtb3JlKSxzLmxvb2thaGVhZCs9bixzLmxvb2thaGVhZCtzLmluc2VydD49Mylmb3Ioc3RyPXMuc3Ryc3RhcnQtcy5pbnNlcnQscy5pbnNfaD1zLndpbmRvd1tzdHJdLHMuaW5zX2g9KHMuaW5zX2g8PHMuaGFzaF9zaGlmdF5zLndpbmRvd1tzdHIrMV0pJnMuaGFzaF9tYXNrO3MuaW5zZXJ0JiYocy5pbnNfaD0ocy5pbnNfaDw8cy5oYXNoX3NoaWZ0XnMud2luZG93W3N0ciszLTFdKSZzLmhhc2hfbWFzayxzLnByZXZbc3RyJnMud19tYXNrXT1zLmhlYWRbcy5pbnNfaF0scy5oZWFkW3MuaW5zX2hdPXN0cixzdHIrKyxzLmluc2VydC0tLCEocy5sb29rYWhlYWQrcy5pbnNlcnQ8MykpOyk7fXdoaWxlKHMubG9va2FoZWFkPDI2MiYmMCE9PXMuc3RybS5hdmFpbF9pbil9ZnVuY3Rpb24gZGVmbGF0ZV9mYXN0KHMsZmx1c2gpe2Zvcih2YXIgaGFzaF9oZWFkLGJmbHVzaDs7KXtpZihzLmxvb2thaGVhZDwyNjIpe2lmKGZpbGxfd2luZG93KHMpLHMubG9va2FoZWFkPDI2MiYmMD09PWZsdXNoKXJldHVybiAxO2lmKDA9PT1zLmxvb2thaGVhZClicmVha31pZihoYXNoX2hlYWQ9MCxzLmxvb2thaGVhZD49MyYmKHMuaW5zX2g9KHMuaW5zX2g8PHMuaGFzaF9zaGlmdF5zLndpbmRvd1tzLnN0cnN0YXJ0KzMtMV0pJnMuaGFzaF9tYXNrLGhhc2hfaGVhZD1zLnByZXZbcy5zdHJzdGFydCZzLndfbWFza109cy5oZWFkW3MuaW5zX2hdLHMuaGVhZFtzLmluc19oXT1zLnN0cnN0YXJ0KSwwIT09aGFzaF9oZWFkJiZzLnN0cnN0YXJ0LWhhc2hfaGVhZDw9cy53X3NpemUtMjYyJiYocy5tYXRjaF9sZW5ndGg9bG9uZ2VzdF9tYXRjaChzLGhhc2hfaGVhZCkpLHMubWF0Y2hfbGVuZ3RoPj0zKWlmKGJmbHVzaD10cmVlcy5fdHJfdGFsbHkocyxzLnN0cnN0YXJ0LXMubWF0Y2hfc3RhcnQscy5tYXRjaF9sZW5ndGgtMykscy5sb29rYWhlYWQtPXMubWF0Y2hfbGVuZ3RoLHMubWF0Y2hfbGVuZ3RoPD1zLm1heF9sYXp5X21hdGNoJiZzLmxvb2thaGVhZD49Myl7cy5tYXRjaF9sZW5ndGgtLTtkb3tzLnN0cnN0YXJ0Kysscy5pbnNfaD0ocy5pbnNfaDw8cy5oYXNoX3NoaWZ0XnMud2luZG93W3Muc3Ryc3RhcnQrMy0xXSkmcy5oYXNoX21hc2ssaGFzaF9oZWFkPXMucHJldltzLnN0cnN0YXJ0JnMud19tYXNrXT1zLmhlYWRbcy5pbnNfaF0scy5oZWFkW3MuaW5zX2hdPXMuc3Ryc3RhcnR9d2hpbGUoMCE9PS0tcy5tYXRjaF9sZW5ndGgpO3Muc3Ryc3RhcnQrK31lbHNlIHMuc3Ryc3RhcnQrPXMubWF0Y2hfbGVuZ3RoLHMubWF0Y2hfbGVuZ3RoPTAscy5pbnNfaD1zLndpbmRvd1tzLnN0cnN0YXJ0XSxzLmluc19oPShzLmluc19oPDxzLmhhc2hfc2hpZnRecy53aW5kb3dbcy5zdHJzdGFydCsxXSkmcy5oYXNoX21hc2s7ZWxzZSBiZmx1c2g9dHJlZXMuX3RyX3RhbGx5KHMsMCxzLndpbmRvd1tzLnN0cnN0YXJ0XSkscy5sb29rYWhlYWQtLSxzLnN0cnN0YXJ0Kys7aWYoYmZsdXNoJiYoZmx1c2hfYmxvY2tfb25seShzLCExKSwwPT09cy5zdHJtLmF2YWlsX291dCkpcmV0dXJuIDF9cmV0dXJuIHMuaW5zZXJ0PXMuc3Ryc3RhcnQ8Mj9zLnN0cnN0YXJ0OjIsND09PWZsdXNoPyhmbHVzaF9ibG9ja19vbmx5KHMsITApLDA9PT1zLnN0cm0uYXZhaWxfb3V0PzM6NCk6cy5sYXN0X2xpdCYmKGZsdXNoX2Jsb2NrX29ubHkocywhMSksMD09PXMuc3RybS5hdmFpbF9vdXQpPzE6Mn1mdW5jdGlvbiBkZWZsYXRlX3Nsb3cocyxmbHVzaCl7Zm9yKHZhciBoYXNoX2hlYWQsYmZsdXNoLG1heF9pbnNlcnQ7Oyl7aWYocy5sb29rYWhlYWQ8MjYyKXtpZihmaWxsX3dpbmRvdyhzKSxzLmxvb2thaGVhZDwyNjImJjA9PT1mbHVzaClyZXR1cm4gMTtpZigwPT09cy5sb29rYWhlYWQpYnJlYWt9aWYoaGFzaF9oZWFkPTAscy5sb29rYWhlYWQ+PTMmJihzLmluc19oPShzLmluc19oPDxzLmhhc2hfc2hpZnRecy53aW5kb3dbcy5zdHJzdGFydCszLTFdKSZzLmhhc2hfbWFzayxoYXNoX2hlYWQ9cy5wcmV2W3Muc3Ryc3RhcnQmcy53X21hc2tdPXMuaGVhZFtzLmluc19oXSxzLmhlYWRbcy5pbnNfaF09cy5zdHJzdGFydCkscy5wcmV2X2xlbmd0aD1zLm1hdGNoX2xlbmd0aCxzLnByZXZfbWF0Y2g9cy5tYXRjaF9zdGFydCxzLm1hdGNoX2xlbmd0aD0yLDAhPT1oYXNoX2hlYWQmJnMucHJldl9sZW5ndGg8cy5tYXhfbGF6eV9tYXRjaCYmcy5zdHJzdGFydC1oYXNoX2hlYWQ8PXMud19zaXplLTI2MiYmKHMubWF0Y2hfbGVuZ3RoPWxvbmdlc3RfbWF0Y2gocyxoYXNoX2hlYWQpLHMubWF0Y2hfbGVuZ3RoPD01JiYoMT09PXMuc3RyYXRlZ3l8fDM9PT1zLm1hdGNoX2xlbmd0aCYmcy5zdHJzdGFydC1zLm1hdGNoX3N0YXJ0PjQwOTYpJiYocy5tYXRjaF9sZW5ndGg9MikpLHMucHJldl9sZW5ndGg+PTMmJnMubWF0Y2hfbGVuZ3RoPD1zLnByZXZfbGVuZ3RoKXttYXhfaW5zZXJ0PXMuc3Ryc3RhcnQrcy5sb29rYWhlYWQtMyxiZmx1c2g9dHJlZXMuX3RyX3RhbGx5KHMscy5zdHJzdGFydC0xLXMucHJldl9tYXRjaCxzLnByZXZfbGVuZ3RoLTMpLHMubG9va2FoZWFkLT1zLnByZXZfbGVuZ3RoLTEscy5wcmV2X2xlbmd0aC09Mjtkb3srK3Muc3Ryc3RhcnQ8PW1heF9pbnNlcnQmJihzLmluc19oPShzLmluc19oPDxzLmhhc2hfc2hpZnRecy53aW5kb3dbcy5zdHJzdGFydCszLTFdKSZzLmhhc2hfbWFzayxoYXNoX2hlYWQ9cy5wcmV2W3Muc3Ryc3RhcnQmcy53X21hc2tdPXMuaGVhZFtzLmluc19oXSxzLmhlYWRbcy5pbnNfaF09cy5zdHJzdGFydCl9d2hpbGUoMCE9PS0tcy5wcmV2X2xlbmd0aCk7aWYocy5tYXRjaF9hdmFpbGFibGU9MCxzLm1hdGNoX2xlbmd0aD0yLHMuc3Ryc3RhcnQrKyxiZmx1c2gmJihmbHVzaF9ibG9ja19vbmx5KHMsITEpLDA9PT1zLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gMX1lbHNlIGlmKHMubWF0Y2hfYXZhaWxhYmxlKXtpZigoYmZsdXNoPXRyZWVzLl90cl90YWxseShzLDAscy53aW5kb3dbcy5zdHJzdGFydC0xXSkpJiZmbHVzaF9ibG9ja19vbmx5KHMsITEpLHMuc3Ryc3RhcnQrKyxzLmxvb2thaGVhZC0tLDA9PT1zLnN0cm0uYXZhaWxfb3V0KXJldHVybiAxfWVsc2Ugcy5tYXRjaF9hdmFpbGFibGU9MSxzLnN0cnN0YXJ0Kysscy5sb29rYWhlYWQtLX1yZXR1cm4gcy5tYXRjaF9hdmFpbGFibGUmJihiZmx1c2g9dHJlZXMuX3RyX3RhbGx5KHMsMCxzLndpbmRvd1tzLnN0cnN0YXJ0LTFdKSxzLm1hdGNoX2F2YWlsYWJsZT0wKSxzLmluc2VydD1zLnN0cnN0YXJ0PDI/cy5zdHJzdGFydDoyLDQ9PT1mbHVzaD8oZmx1c2hfYmxvY2tfb25seShzLCEwKSwwPT09cy5zdHJtLmF2YWlsX291dD8zOjQpOnMubGFzdF9saXQmJihmbHVzaF9ibG9ja19vbmx5KHMsITEpLDA9PT1zLnN0cm0uYXZhaWxfb3V0KT8xOjJ9ZnVuY3Rpb24gQ29uZmlnKGdvb2RfbGVuZ3RoLG1heF9sYXp5LG5pY2VfbGVuZ3RoLG1heF9jaGFpbixmdW5jKXt0aGlzLmdvb2RfbGVuZ3RoPWdvb2RfbGVuZ3RoLHRoaXMubWF4X2xhenk9bWF4X2xhenksdGhpcy5uaWNlX2xlbmd0aD1uaWNlX2xlbmd0aCx0aGlzLm1heF9jaGFpbj1tYXhfY2hhaW4sdGhpcy5mdW5jPWZ1bmN9ZnVuY3Rpb24gRGVmbGF0ZVN0YXRlKCl7dGhpcy5zdHJtPW51bGwsdGhpcy5zdGF0dXM9MCx0aGlzLnBlbmRpbmdfYnVmPW51bGwsdGhpcy5wZW5kaW5nX2J1Zl9zaXplPTAsdGhpcy5wZW5kaW5nX291dD0wLHRoaXMucGVuZGluZz0wLHRoaXMud3JhcD0wLHRoaXMuZ3poZWFkPW51bGwsdGhpcy5nemluZGV4PTAsdGhpcy5tZXRob2Q9OCx0aGlzLmxhc3RfZmx1c2g9LTEsdGhpcy53X3NpemU9MCx0aGlzLndfYml0cz0wLHRoaXMud19tYXNrPTAsdGhpcy53aW5kb3c9bnVsbCx0aGlzLndpbmRvd19zaXplPTAsdGhpcy5wcmV2PW51bGwsdGhpcy5oZWFkPW51bGwsdGhpcy5pbnNfaD0wLHRoaXMuaGFzaF9zaXplPTAsdGhpcy5oYXNoX2JpdHM9MCx0aGlzLmhhc2hfbWFzaz0wLHRoaXMuaGFzaF9zaGlmdD0wLHRoaXMuYmxvY2tfc3RhcnQ9MCx0aGlzLm1hdGNoX2xlbmd0aD0wLHRoaXMucHJldl9tYXRjaD0wLHRoaXMubWF0Y2hfYXZhaWxhYmxlPTAsdGhpcy5zdHJzdGFydD0wLHRoaXMubWF0Y2hfc3RhcnQ9MCx0aGlzLmxvb2thaGVhZD0wLHRoaXMucHJldl9sZW5ndGg9MCx0aGlzLm1heF9jaGFpbl9sZW5ndGg9MCx0aGlzLm1heF9sYXp5X21hdGNoPTAsdGhpcy5sZXZlbD0wLHRoaXMuc3RyYXRlZ3k9MCx0aGlzLmdvb2RfbWF0Y2g9MCx0aGlzLm5pY2VfbWF0Y2g9MCx0aGlzLmR5bl9sdHJlZT1uZXcgdXRpbHMuQnVmMTYoMTE0NiksdGhpcy5keW5fZHRyZWU9bmV3IHV0aWxzLkJ1ZjE2KDEyMiksdGhpcy5ibF90cmVlPW5ldyB1dGlscy5CdWYxNig3OCksemVybyh0aGlzLmR5bl9sdHJlZSksemVybyh0aGlzLmR5bl9kdHJlZSksemVybyh0aGlzLmJsX3RyZWUpLHRoaXMubF9kZXNjPW51bGwsdGhpcy5kX2Rlc2M9bnVsbCx0aGlzLmJsX2Rlc2M9bnVsbCx0aGlzLmJsX2NvdW50PW5ldyB1dGlscy5CdWYxNigxNiksdGhpcy5oZWFwPW5ldyB1dGlscy5CdWYxNig1NzMpLHplcm8odGhpcy5oZWFwKSx0aGlzLmhlYXBfbGVuPTAsdGhpcy5oZWFwX21heD0wLHRoaXMuZGVwdGg9bmV3IHV0aWxzLkJ1ZjE2KDU3MyksemVybyh0aGlzLmRlcHRoKSx0aGlzLmxfYnVmPTAsdGhpcy5saXRfYnVmc2l6ZT0wLHRoaXMubGFzdF9saXQ9MCx0aGlzLmRfYnVmPTAsdGhpcy5vcHRfbGVuPTAsdGhpcy5zdGF0aWNfbGVuPTAsdGhpcy5tYXRjaGVzPTAsdGhpcy5pbnNlcnQ9MCx0aGlzLmJpX2J1Zj0wLHRoaXMuYmlfdmFsaWQ9MH1mdW5jdGlvbiBkZWZsYXRlUmVzZXRLZWVwKHN0cm0pe3ZhciBzO3JldHVybiBzdHJtJiZzdHJtLnN0YXRlPyhzdHJtLnRvdGFsX2luPXN0cm0udG90YWxfb3V0PTAsc3RybS5kYXRhX3R5cGU9Miwocz1zdHJtLnN0YXRlKS5wZW5kaW5nPTAscy5wZW5kaW5nX291dD0wLHMud3JhcDwwJiYocy53cmFwPS1zLndyYXApLHMuc3RhdHVzPXMud3JhcD80MjoxMTMsc3RybS5hZGxlcj0yPT09cy53cmFwPzA6MSxzLmxhc3RfZmx1c2g9MCx0cmVlcy5fdHJfaW5pdChzKSwwKTplcnIoc3RybSwtMil9ZnVuY3Rpb24gZGVmbGF0ZVJlc2V0KHN0cm0pe3ZhciByZXQ9ZGVmbGF0ZVJlc2V0S2VlcChzdHJtKTtyZXR1cm4gMD09PXJldCYmZnVuY3Rpb24gbG1faW5pdChzKXtzLndpbmRvd19zaXplPTIqcy53X3NpemUsemVybyhzLmhlYWQpLHMubWF4X2xhenlfbWF0Y2g9Y29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfbGF6eSxzLmdvb2RfbWF0Y2g9Y29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5nb29kX2xlbmd0aCxzLm5pY2VfbWF0Y2g9Y29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5uaWNlX2xlbmd0aCxzLm1heF9jaGFpbl9sZW5ndGg9Y29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfY2hhaW4scy5zdHJzdGFydD0wLHMuYmxvY2tfc3RhcnQ9MCxzLmxvb2thaGVhZD0wLHMuaW5zZXJ0PTAscy5tYXRjaF9sZW5ndGg9cy5wcmV2X2xlbmd0aD0yLHMubWF0Y2hfYXZhaWxhYmxlPTAscy5pbnNfaD0wfShzdHJtLnN0YXRlKSxyZXR9ZnVuY3Rpb24gZGVmbGF0ZUluaXQyKHN0cm0sbGV2ZWwsbWV0aG9kLHdpbmRvd0JpdHMsbWVtTGV2ZWwsc3RyYXRlZ3kpe2lmKCFzdHJtKXJldHVybi0yO3ZhciB3cmFwPTE7aWYoLTE9PT1sZXZlbCYmKGxldmVsPTYpLHdpbmRvd0JpdHM8MD8od3JhcD0wLHdpbmRvd0JpdHM9LXdpbmRvd0JpdHMpOndpbmRvd0JpdHM+MTUmJih3cmFwPTIsd2luZG93Qml0cy09MTYpLG1lbUxldmVsPDF8fG1lbUxldmVsPjl8fDghPT1tZXRob2R8fHdpbmRvd0JpdHM8OHx8d2luZG93Qml0cz4xNXx8bGV2ZWw8MHx8bGV2ZWw+OXx8c3RyYXRlZ3k8MHx8c3RyYXRlZ3k+NClyZXR1cm4gZXJyKHN0cm0sLTIpOzg9PT13aW5kb3dCaXRzJiYod2luZG93Qml0cz05KTt2YXIgcz1uZXcgRGVmbGF0ZVN0YXRlO3JldHVybiBzdHJtLnN0YXRlPXMscy5zdHJtPXN0cm0scy53cmFwPXdyYXAscy5nemhlYWQ9bnVsbCxzLndfYml0cz13aW5kb3dCaXRzLHMud19zaXplPTE8PHMud19iaXRzLHMud19tYXNrPXMud19zaXplLTEscy5oYXNoX2JpdHM9bWVtTGV2ZWwrNyxzLmhhc2hfc2l6ZT0xPDxzLmhhc2hfYml0cyxzLmhhc2hfbWFzaz1zLmhhc2hfc2l6ZS0xLHMuaGFzaF9zaGlmdD1+figocy5oYXNoX2JpdHMrMy0xKS8zKSxzLndpbmRvdz1uZXcgdXRpbHMuQnVmOCgyKnMud19zaXplKSxzLmhlYWQ9bmV3IHV0aWxzLkJ1ZjE2KHMuaGFzaF9zaXplKSxzLnByZXY9bmV3IHV0aWxzLkJ1ZjE2KHMud19zaXplKSxzLmxpdF9idWZzaXplPTE8PG1lbUxldmVsKzYscy5wZW5kaW5nX2J1Zl9zaXplPTQqcy5saXRfYnVmc2l6ZSxzLnBlbmRpbmdfYnVmPW5ldyB1dGlscy5CdWY4KHMucGVuZGluZ19idWZfc2l6ZSkscy5kX2J1Zj0xKnMubGl0X2J1ZnNpemUscy5sX2J1Zj0zKnMubGl0X2J1ZnNpemUscy5sZXZlbD1sZXZlbCxzLnN0cmF0ZWd5PXN0cmF0ZWd5LHMubWV0aG9kPW1ldGhvZCxkZWZsYXRlUmVzZXQoc3RybSl9Y29uZmlndXJhdGlvbl90YWJsZT1bbmV3IENvbmZpZygwLDAsMCwwLGZ1bmN0aW9uIGRlZmxhdGVfc3RvcmVkKHMsZmx1c2gpe3ZhciBtYXhfYmxvY2tfc2l6ZT02NTUzNTtmb3IobWF4X2Jsb2NrX3NpemU+cy5wZW5kaW5nX2J1Zl9zaXplLTUmJihtYXhfYmxvY2tfc2l6ZT1zLnBlbmRpbmdfYnVmX3NpemUtNSk7Oyl7aWYocy5sb29rYWhlYWQ8PTEpe2lmKGZpbGxfd2luZG93KHMpLDA9PT1zLmxvb2thaGVhZCYmMD09PWZsdXNoKXJldHVybiAxO2lmKDA9PT1zLmxvb2thaGVhZClicmVha31zLnN0cnN0YXJ0Kz1zLmxvb2thaGVhZCxzLmxvb2thaGVhZD0wO3ZhciBtYXhfc3RhcnQ9cy5ibG9ja19zdGFydCttYXhfYmxvY2tfc2l6ZTtpZigoMD09PXMuc3Ryc3RhcnR8fHMuc3Ryc3RhcnQ+PW1heF9zdGFydCkmJihzLmxvb2thaGVhZD1zLnN0cnN0YXJ0LW1heF9zdGFydCxzLnN0cnN0YXJ0PW1heF9zdGFydCxmbHVzaF9ibG9ja19vbmx5KHMsITEpLDA9PT1zLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gMTtpZihzLnN0cnN0YXJ0LXMuYmxvY2tfc3RhcnQ+PXMud19zaXplLTI2MiYmKGZsdXNoX2Jsb2NrX29ubHkocywhMSksMD09PXMuc3RybS5hdmFpbF9vdXQpKXJldHVybiAxfXJldHVybiBzLmluc2VydD0wLDQ9PT1mbHVzaD8oZmx1c2hfYmxvY2tfb25seShzLCEwKSwwPT09cy5zdHJtLmF2YWlsX291dD8zOjQpOihzLnN0cnN0YXJ0PnMuYmxvY2tfc3RhcnQmJihmbHVzaF9ibG9ja19vbmx5KHMsITEpLHMuc3RybS5hdmFpbF9vdXQpLDEpfSksbmV3IENvbmZpZyg0LDQsOCw0LGRlZmxhdGVfZmFzdCksbmV3IENvbmZpZyg0LDUsMTYsOCxkZWZsYXRlX2Zhc3QpLG5ldyBDb25maWcoNCw2LDMyLDMyLGRlZmxhdGVfZmFzdCksbmV3IENvbmZpZyg0LDQsMTYsMTYsZGVmbGF0ZV9zbG93KSxuZXcgQ29uZmlnKDgsMTYsMzIsMzIsZGVmbGF0ZV9zbG93KSxuZXcgQ29uZmlnKDgsMTYsMTI4LDEyOCxkZWZsYXRlX3Nsb3cpLG5ldyBDb25maWcoOCwzMiwxMjgsMjU2LGRlZmxhdGVfc2xvdyksbmV3IENvbmZpZygzMiwxMjgsMjU4LDEwMjQsZGVmbGF0ZV9zbG93KSxuZXcgQ29uZmlnKDMyLDI1OCwyNTgsNDA5NixkZWZsYXRlX3Nsb3cpXSxleHBvcnRzLmRlZmxhdGVJbml0PWZ1bmN0aW9uIGRlZmxhdGVJbml0KHN0cm0sbGV2ZWwpe3JldHVybiBkZWZsYXRlSW5pdDIoc3RybSxsZXZlbCw4LDE1LDgsMCl9LGV4cG9ydHMuZGVmbGF0ZUluaXQyPWRlZmxhdGVJbml0MixleHBvcnRzLmRlZmxhdGVSZXNldD1kZWZsYXRlUmVzZXQsZXhwb3J0cy5kZWZsYXRlUmVzZXRLZWVwPWRlZmxhdGVSZXNldEtlZXAsZXhwb3J0cy5kZWZsYXRlU2V0SGVhZGVyPWZ1bmN0aW9uIGRlZmxhdGVTZXRIZWFkZXIoc3RybSxoZWFkKXtyZXR1cm4gc3RybSYmc3RybS5zdGF0ZT8yIT09c3RybS5zdGF0ZS53cmFwPy0yOihzdHJtLnN0YXRlLmd6aGVhZD1oZWFkLDApOi0yfSxleHBvcnRzLmRlZmxhdGU9ZnVuY3Rpb24gZGVmbGF0ZShzdHJtLGZsdXNoKXt2YXIgb2xkX2ZsdXNoLHMsYmVnLHZhbDtpZighc3RybXx8IXN0cm0uc3RhdGV8fGZsdXNoPjV8fGZsdXNoPDApcmV0dXJuIHN0cm0/ZXJyKHN0cm0sLTIpOi0yO2lmKHM9c3RybS5zdGF0ZSwhc3RybS5vdXRwdXR8fCFzdHJtLmlucHV0JiYwIT09c3RybS5hdmFpbF9pbnx8NjY2PT09cy5zdGF0dXMmJjQhPT1mbHVzaClyZXR1cm4gZXJyKHN0cm0sMD09PXN0cm0uYXZhaWxfb3V0Py01Oi0yKTtpZihzLnN0cm09c3RybSxvbGRfZmx1c2g9cy5sYXN0X2ZsdXNoLHMubGFzdF9mbHVzaD1mbHVzaCw0Mj09PXMuc3RhdHVzKWlmKDI9PT1zLndyYXApc3RybS5hZGxlcj0wLHB1dF9ieXRlKHMsMzEpLHB1dF9ieXRlKHMsMTM5KSxwdXRfYnl0ZShzLDgpLHMuZ3poZWFkPyhwdXRfYnl0ZShzLChzLmd6aGVhZC50ZXh0PzE6MCkrKHMuZ3poZWFkLmhjcmM/MjowKSsocy5nemhlYWQuZXh0cmE/NDowKSsocy5nemhlYWQubmFtZT84OjApKyhzLmd6aGVhZC5jb21tZW50PzE2OjApKSxwdXRfYnl0ZShzLDI1NSZzLmd6aGVhZC50aW1lKSxwdXRfYnl0ZShzLHMuZ3poZWFkLnRpbWU+PjgmMjU1KSxwdXRfYnl0ZShzLHMuZ3poZWFkLnRpbWU+PjE2JjI1NSkscHV0X2J5dGUocyxzLmd6aGVhZC50aW1lPj4yNCYyNTUpLHB1dF9ieXRlKHMsOT09PXMubGV2ZWw/MjpzLnN0cmF0ZWd5Pj0yfHxzLmxldmVsPDI/NDowKSxwdXRfYnl0ZShzLDI1NSZzLmd6aGVhZC5vcykscy5nemhlYWQuZXh0cmEmJnMuZ3poZWFkLmV4dHJhLmxlbmd0aCYmKHB1dF9ieXRlKHMsMjU1JnMuZ3poZWFkLmV4dHJhLmxlbmd0aCkscHV0X2J5dGUocyxzLmd6aGVhZC5leHRyYS5sZW5ndGg+PjgmMjU1KSkscy5nemhlYWQuaGNyYyYmKHN0cm0uYWRsZXI9Y3JjMzIoc3RybS5hZGxlcixzLnBlbmRpbmdfYnVmLHMucGVuZGluZywwKSkscy5nemluZGV4PTAscy5zdGF0dXM9NjkpOihwdXRfYnl0ZShzLDApLHB1dF9ieXRlKHMsMCkscHV0X2J5dGUocywwKSxwdXRfYnl0ZShzLDApLHB1dF9ieXRlKHMsMCkscHV0X2J5dGUocyw5PT09cy5sZXZlbD8yOnMuc3RyYXRlZ3k+PTJ8fHMubGV2ZWw8Mj80OjApLHB1dF9ieXRlKHMsMykscy5zdGF0dXM9MTEzKTtlbHNle3ZhciBoZWFkZXI9OCsocy53X2JpdHMtODw8NCk8PDg7aGVhZGVyfD0ocy5zdHJhdGVneT49Mnx8cy5sZXZlbDwyPzA6cy5sZXZlbDw2PzE6Nj09PXMubGV2ZWw/MjozKTw8NiwwIT09cy5zdHJzdGFydCYmKGhlYWRlcnw9MzIpLGhlYWRlcis9MzEtaGVhZGVyJTMxLHMuc3RhdHVzPTExMyxwdXRTaG9ydE1TQihzLGhlYWRlciksMCE9PXMuc3Ryc3RhcnQmJihwdXRTaG9ydE1TQihzLHN0cm0uYWRsZXI+Pj4xNikscHV0U2hvcnRNU0Iocyw2NTUzNSZzdHJtLmFkbGVyKSksc3RybS5hZGxlcj0xfWlmKDY5PT09cy5zdGF0dXMpaWYocy5nemhlYWQuZXh0cmEpe2ZvcihiZWc9cy5wZW5kaW5nO3MuZ3ppbmRleDwoNjU1MzUmcy5nemhlYWQuZXh0cmEubGVuZ3RoKSYmKHMucGVuZGluZyE9PXMucGVuZGluZ19idWZfc2l6ZXx8KHMuZ3poZWFkLmhjcmMmJnMucGVuZGluZz5iZWcmJihzdHJtLmFkbGVyPWNyYzMyKHN0cm0uYWRsZXIscy5wZW5kaW5nX2J1ZixzLnBlbmRpbmctYmVnLGJlZykpLGZsdXNoX3BlbmRpbmcoc3RybSksYmVnPXMucGVuZGluZyxzLnBlbmRpbmchPT1zLnBlbmRpbmdfYnVmX3NpemUpKTspcHV0X2J5dGUocywyNTUmcy5nemhlYWQuZXh0cmFbcy5nemluZGV4XSkscy5nemluZGV4Kys7cy5nemhlYWQuaGNyYyYmcy5wZW5kaW5nPmJlZyYmKHN0cm0uYWRsZXI9Y3JjMzIoc3RybS5hZGxlcixzLnBlbmRpbmdfYnVmLHMucGVuZGluZy1iZWcsYmVnKSkscy5nemluZGV4PT09cy5nemhlYWQuZXh0cmEubGVuZ3RoJiYocy5nemluZGV4PTAscy5zdGF0dXM9NzMpfWVsc2Ugcy5zdGF0dXM9NzM7aWYoNzM9PT1zLnN0YXR1cylpZihzLmd6aGVhZC5uYW1lKXtiZWc9cy5wZW5kaW5nO2Rve2lmKHMucGVuZGluZz09PXMucGVuZGluZ19idWZfc2l6ZSYmKHMuZ3poZWFkLmhjcmMmJnMucGVuZGluZz5iZWcmJihzdHJtLmFkbGVyPWNyYzMyKHN0cm0uYWRsZXIscy5wZW5kaW5nX2J1ZixzLnBlbmRpbmctYmVnLGJlZykpLGZsdXNoX3BlbmRpbmcoc3RybSksYmVnPXMucGVuZGluZyxzLnBlbmRpbmc9PT1zLnBlbmRpbmdfYnVmX3NpemUpKXt2YWw9MTticmVha312YWw9cy5nemluZGV4PHMuZ3poZWFkLm5hbWUubGVuZ3RoPzI1NSZzLmd6aGVhZC5uYW1lLmNoYXJDb2RlQXQocy5nemluZGV4KyspOjAscHV0X2J5dGUocyx2YWwpfXdoaWxlKDAhPT12YWwpO3MuZ3poZWFkLmhjcmMmJnMucGVuZGluZz5iZWcmJihzdHJtLmFkbGVyPWNyYzMyKHN0cm0uYWRsZXIscy5wZW5kaW5nX2J1ZixzLnBlbmRpbmctYmVnLGJlZykpLDA9PT12YWwmJihzLmd6aW5kZXg9MCxzLnN0YXR1cz05MSl9ZWxzZSBzLnN0YXR1cz05MTtpZig5MT09PXMuc3RhdHVzKWlmKHMuZ3poZWFkLmNvbW1lbnQpe2JlZz1zLnBlbmRpbmc7ZG97aWYocy5wZW5kaW5nPT09cy5wZW5kaW5nX2J1Zl9zaXplJiYocy5nemhlYWQuaGNyYyYmcy5wZW5kaW5nPmJlZyYmKHN0cm0uYWRsZXI9Y3JjMzIoc3RybS5hZGxlcixzLnBlbmRpbmdfYnVmLHMucGVuZGluZy1iZWcsYmVnKSksZmx1c2hfcGVuZGluZyhzdHJtKSxiZWc9cy5wZW5kaW5nLHMucGVuZGluZz09PXMucGVuZGluZ19idWZfc2l6ZSkpe3ZhbD0xO2JyZWFrfXZhbD1zLmd6aW5kZXg8cy5nemhlYWQuY29tbWVudC5sZW5ndGg/MjU1JnMuZ3poZWFkLmNvbW1lbnQuY2hhckNvZGVBdChzLmd6aW5kZXgrKyk6MCxwdXRfYnl0ZShzLHZhbCl9d2hpbGUoMCE9PXZhbCk7cy5nemhlYWQuaGNyYyYmcy5wZW5kaW5nPmJlZyYmKHN0cm0uYWRsZXI9Y3JjMzIoc3RybS5hZGxlcixzLnBlbmRpbmdfYnVmLHMucGVuZGluZy1iZWcsYmVnKSksMD09PXZhbCYmKHMuc3RhdHVzPTEwMyl9ZWxzZSBzLnN0YXR1cz0xMDM7aWYoMTAzPT09cy5zdGF0dXMmJihzLmd6aGVhZC5oY3JjPyhzLnBlbmRpbmcrMj5zLnBlbmRpbmdfYnVmX3NpemUmJmZsdXNoX3BlbmRpbmcoc3RybSkscy5wZW5kaW5nKzI8PXMucGVuZGluZ19idWZfc2l6ZSYmKHB1dF9ieXRlKHMsMjU1JnN0cm0uYWRsZXIpLHB1dF9ieXRlKHMsc3RybS5hZGxlcj4+OCYyNTUpLHN0cm0uYWRsZXI9MCxzLnN0YXR1cz0xMTMpKTpzLnN0YXR1cz0xMTMpLDAhPT1zLnBlbmRpbmcpe2lmKGZsdXNoX3BlbmRpbmcoc3RybSksMD09PXN0cm0uYXZhaWxfb3V0KXJldHVybiBzLmxhc3RfZmx1c2g9LTEsMH1lbHNlIGlmKDA9PT1zdHJtLmF2YWlsX2luJiZyYW5rKGZsdXNoKTw9cmFuayhvbGRfZmx1c2gpJiY0IT09Zmx1c2gpcmV0dXJuIGVycihzdHJtLC01KTtpZig2NjY9PT1zLnN0YXR1cyYmMCE9PXN0cm0uYXZhaWxfaW4pcmV0dXJuIGVycihzdHJtLC01KTtpZigwIT09c3RybS5hdmFpbF9pbnx8MCE9PXMubG9va2FoZWFkfHwwIT09Zmx1c2gmJjY2NiE9PXMuc3RhdHVzKXt2YXIgYnN0YXRlPTI9PT1zLnN0cmF0ZWd5P2Z1bmN0aW9uIGRlZmxhdGVfaHVmZihzLGZsdXNoKXtmb3IodmFyIGJmbHVzaDs7KXtpZigwPT09cy5sb29rYWhlYWQmJihmaWxsX3dpbmRvdyhzKSwwPT09cy5sb29rYWhlYWQpKXtpZigwPT09Zmx1c2gpcmV0dXJuIDE7YnJlYWt9aWYocy5tYXRjaF9sZW5ndGg9MCxiZmx1c2g9dHJlZXMuX3RyX3RhbGx5KHMsMCxzLndpbmRvd1tzLnN0cnN0YXJ0XSkscy5sb29rYWhlYWQtLSxzLnN0cnN0YXJ0KyssYmZsdXNoJiYoZmx1c2hfYmxvY2tfb25seShzLCExKSwwPT09cy5zdHJtLmF2YWlsX291dCkpcmV0dXJuIDF9cmV0dXJuIHMuaW5zZXJ0PTAsND09PWZsdXNoPyhmbHVzaF9ibG9ja19vbmx5KHMsITApLDA9PT1zLnN0cm0uYXZhaWxfb3V0PzM6NCk6cy5sYXN0X2xpdCYmKGZsdXNoX2Jsb2NrX29ubHkocywhMSksMD09PXMuc3RybS5hdmFpbF9vdXQpPzE6Mn0ocyxmbHVzaCk6Mz09PXMuc3RyYXRlZ3k/ZnVuY3Rpb24gZGVmbGF0ZV9ybGUocyxmbHVzaCl7Zm9yKHZhciBiZmx1c2gscHJldixzY2FuLHN0cmVuZCxfd2luPXMud2luZG93Ozspe2lmKHMubG9va2FoZWFkPD0yNTgpe2lmKGZpbGxfd2luZG93KHMpLHMubG9va2FoZWFkPD0yNTgmJjA9PT1mbHVzaClyZXR1cm4gMTtpZigwPT09cy5sb29rYWhlYWQpYnJlYWt9aWYocy5tYXRjaF9sZW5ndGg9MCxzLmxvb2thaGVhZD49MyYmcy5zdHJzdGFydD4wJiYocHJldj1fd2luW3NjYW49cy5zdHJzdGFydC0xXSk9PT1fd2luWysrc2Nhbl0mJnByZXY9PT1fd2luWysrc2Nhbl0mJnByZXY9PT1fd2luWysrc2Nhbl0pe3N0cmVuZD1zLnN0cnN0YXJ0KzI1ODtkb3t9d2hpbGUocHJldj09PV93aW5bKytzY2FuXSYmcHJldj09PV93aW5bKytzY2FuXSYmcHJldj09PV93aW5bKytzY2FuXSYmcHJldj09PV93aW5bKytzY2FuXSYmcHJldj09PV93aW5bKytzY2FuXSYmcHJldj09PV93aW5bKytzY2FuXSYmcHJldj09PV93aW5bKytzY2FuXSYmcHJldj09PV93aW5bKytzY2FuXSYmc2NhbjxzdHJlbmQpO3MubWF0Y2hfbGVuZ3RoPTI1OC0oc3RyZW5kLXNjYW4pLHMubWF0Y2hfbGVuZ3RoPnMubG9va2FoZWFkJiYocy5tYXRjaF9sZW5ndGg9cy5sb29rYWhlYWQpfWlmKHMubWF0Y2hfbGVuZ3RoPj0zPyhiZmx1c2g9dHJlZXMuX3RyX3RhbGx5KHMsMSxzLm1hdGNoX2xlbmd0aC0zKSxzLmxvb2thaGVhZC09cy5tYXRjaF9sZW5ndGgscy5zdHJzdGFydCs9cy5tYXRjaF9sZW5ndGgscy5tYXRjaF9sZW5ndGg9MCk6KGJmbHVzaD10cmVlcy5fdHJfdGFsbHkocywwLHMud2luZG93W3Muc3Ryc3RhcnRdKSxzLmxvb2thaGVhZC0tLHMuc3Ryc3RhcnQrKyksYmZsdXNoJiYoZmx1c2hfYmxvY2tfb25seShzLCExKSwwPT09cy5zdHJtLmF2YWlsX291dCkpcmV0dXJuIDF9cmV0dXJuIHMuaW5zZXJ0PTAsND09PWZsdXNoPyhmbHVzaF9ibG9ja19vbmx5KHMsITApLDA9PT1zLnN0cm0uYXZhaWxfb3V0PzM6NCk6cy5sYXN0X2xpdCYmKGZsdXNoX2Jsb2NrX29ubHkocywhMSksMD09PXMuc3RybS5hdmFpbF9vdXQpPzE6Mn0ocyxmbHVzaCk6Y29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5mdW5jKHMsZmx1c2gpO2lmKDMhPT1ic3RhdGUmJjQhPT1ic3RhdGV8fChzLnN0YXR1cz02NjYpLDE9PT1ic3RhdGV8fDM9PT1ic3RhdGUpcmV0dXJuIDA9PT1zdHJtLmF2YWlsX291dCYmKHMubGFzdF9mbHVzaD0tMSksMDtpZigyPT09YnN0YXRlJiYoMT09PWZsdXNoP3RyZWVzLl90cl9hbGlnbihzKTo1IT09Zmx1c2gmJih0cmVlcy5fdHJfc3RvcmVkX2Jsb2NrKHMsMCwwLCExKSwzPT09Zmx1c2gmJih6ZXJvKHMuaGVhZCksMD09PXMubG9va2FoZWFkJiYocy5zdHJzdGFydD0wLHMuYmxvY2tfc3RhcnQ9MCxzLmluc2VydD0wKSkpLGZsdXNoX3BlbmRpbmcoc3RybSksMD09PXN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gcy5sYXN0X2ZsdXNoPS0xLDB9cmV0dXJuIDQhPT1mbHVzaD8wOnMud3JhcDw9MD8xOigyPT09cy53cmFwPyhwdXRfYnl0ZShzLDI1NSZzdHJtLmFkbGVyKSxwdXRfYnl0ZShzLHN0cm0uYWRsZXI+PjgmMjU1KSxwdXRfYnl0ZShzLHN0cm0uYWRsZXI+PjE2JjI1NSkscHV0X2J5dGUocyxzdHJtLmFkbGVyPj4yNCYyNTUpLHB1dF9ieXRlKHMsMjU1JnN0cm0udG90YWxfaW4pLHB1dF9ieXRlKHMsc3RybS50b3RhbF9pbj4+OCYyNTUpLHB1dF9ieXRlKHMsc3RybS50b3RhbF9pbj4+MTYmMjU1KSxwdXRfYnl0ZShzLHN0cm0udG90YWxfaW4+PjI0JjI1NSkpOihwdXRTaG9ydE1TQihzLHN0cm0uYWRsZXI+Pj4xNikscHV0U2hvcnRNU0Iocyw2NTUzNSZzdHJtLmFkbGVyKSksZmx1c2hfcGVuZGluZyhzdHJtKSxzLndyYXA+MCYmKHMud3JhcD0tcy53cmFwKSwwIT09cy5wZW5kaW5nPzA6MSl9LGV4cG9ydHMuZGVmbGF0ZUVuZD1mdW5jdGlvbiBkZWZsYXRlRW5kKHN0cm0pe3ZhciBzdGF0dXM7cmV0dXJuIHN0cm0mJnN0cm0uc3RhdGU/NDIhPT0oc3RhdHVzPXN0cm0uc3RhdGUuc3RhdHVzKSYmNjkhPT1zdGF0dXMmJjczIT09c3RhdHVzJiY5MSE9PXN0YXR1cyYmMTAzIT09c3RhdHVzJiYxMTMhPT1zdGF0dXMmJjY2NiE9PXN0YXR1cz9lcnIoc3RybSwtMik6KHN0cm0uc3RhdGU9bnVsbCwxMTM9PT1zdGF0dXM/ZXJyKHN0cm0sLTMpOjApOi0yfSxleHBvcnRzLmRlZmxhdGVTZXREaWN0aW9uYXJ5PWZ1bmN0aW9uIGRlZmxhdGVTZXREaWN0aW9uYXJ5KHN0cm0sZGljdGlvbmFyeSl7dmFyIHMsc3RyLG4sd3JhcCxhdmFpbCxuZXh0LGlucHV0LHRtcERpY3QsZGljdExlbmd0aD1kaWN0aW9uYXJ5Lmxlbmd0aDtpZighc3RybXx8IXN0cm0uc3RhdGUpcmV0dXJuLTI7aWYoMj09PSh3cmFwPShzPXN0cm0uc3RhdGUpLndyYXApfHwxPT09d3JhcCYmNDIhPT1zLnN0YXR1c3x8cy5sb29rYWhlYWQpcmV0dXJuLTI7Zm9yKDE9PT13cmFwJiYoc3RybS5hZGxlcj1hZGxlcjMyKHN0cm0uYWRsZXIsZGljdGlvbmFyeSxkaWN0TGVuZ3RoLDApKSxzLndyYXA9MCxkaWN0TGVuZ3RoPj1zLndfc2l6ZSYmKDA9PT13cmFwJiYoemVybyhzLmhlYWQpLHMuc3Ryc3RhcnQ9MCxzLmJsb2NrX3N0YXJ0PTAscy5pbnNlcnQ9MCksdG1wRGljdD1uZXcgdXRpbHMuQnVmOChzLndfc2l6ZSksdXRpbHMuYXJyYXlTZXQodG1wRGljdCxkaWN0aW9uYXJ5LGRpY3RMZW5ndGgtcy53X3NpemUscy53X3NpemUsMCksZGljdGlvbmFyeT10bXBEaWN0LGRpY3RMZW5ndGg9cy53X3NpemUpLGF2YWlsPXN0cm0uYXZhaWxfaW4sbmV4dD1zdHJtLm5leHRfaW4saW5wdXQ9c3RybS5pbnB1dCxzdHJtLmF2YWlsX2luPWRpY3RMZW5ndGgsc3RybS5uZXh0X2luPTAsc3RybS5pbnB1dD1kaWN0aW9uYXJ5LGZpbGxfd2luZG93KHMpO3MubG9va2FoZWFkPj0zOyl7c3RyPXMuc3Ryc3RhcnQsbj1zLmxvb2thaGVhZC0yO2Rve3MuaW5zX2g9KHMuaW5zX2g8PHMuaGFzaF9zaGlmdF5zLndpbmRvd1tzdHIrMy0xXSkmcy5oYXNoX21hc2sscy5wcmV2W3N0ciZzLndfbWFza109cy5oZWFkW3MuaW5zX2hdLHMuaGVhZFtzLmluc19oXT1zdHIsc3RyKyt9d2hpbGUoLS1uKTtzLnN0cnN0YXJ0PXN0cixzLmxvb2thaGVhZD0yLGZpbGxfd2luZG93KHMpfXJldHVybiBzLnN0cnN0YXJ0Kz1zLmxvb2thaGVhZCxzLmJsb2NrX3N0YXJ0PXMuc3Ryc3RhcnQscy5pbnNlcnQ9cy5sb29rYWhlYWQscy5sb29rYWhlYWQ9MCxzLm1hdGNoX2xlbmd0aD1zLnByZXZfbGVuZ3RoPTIscy5tYXRjaF9hdmFpbGFibGU9MCxzdHJtLm5leHRfaW49bmV4dCxzdHJtLmlucHV0PWlucHV0LHN0cm0uYXZhaWxfaW49YXZhaWwscy53cmFwPXdyYXAsMH0sZXhwb3J0cy5kZWZsYXRlSW5mbz0icGFrbyBkZWZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSJ9LCIuLi8uLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZmYXN0LmpzIihtb2R1bGUpeyJ1c2Ugc3RyaWN0Ijttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbiBpbmZsYXRlX2Zhc3Qoc3RybSxzdGFydCl7dmFyIHN0YXRlLF9pbixsYXN0LF9vdXQsYmVnLGVuZCxkbWF4LHdzaXplLHdoYXZlLHduZXh0LHNfd2luZG93LGhvbGQsYml0cyxsY29kZSxkY29kZSxsbWFzayxkbWFzayxoZXJlLG9wLGxlbixkaXN0LGZyb20sZnJvbV9zb3VyY2UsaW5wdXQsb3V0cHV0O3N0YXRlPXN0cm0uc3RhdGUsX2luPXN0cm0ubmV4dF9pbixpbnB1dD1zdHJtLmlucHV0LGxhc3Q9X2luKyhzdHJtLmF2YWlsX2luLTUpLF9vdXQ9c3RybS5uZXh0X291dCxvdXRwdXQ9c3RybS5vdXRwdXQsYmVnPV9vdXQtKHN0YXJ0LXN0cm0uYXZhaWxfb3V0KSxlbmQ9X291dCsoc3RybS5hdmFpbF9vdXQtMjU3KSxkbWF4PXN0YXRlLmRtYXgsd3NpemU9c3RhdGUud3NpemUsd2hhdmU9c3RhdGUud2hhdmUsd25leHQ9c3RhdGUud25leHQsc193aW5kb3c9c3RhdGUud2luZG93LGhvbGQ9c3RhdGUuaG9sZCxiaXRzPXN0YXRlLmJpdHMsbGNvZGU9c3RhdGUubGVuY29kZSxkY29kZT1zdGF0ZS5kaXN0Y29kZSxsbWFzaz0oMTw8c3RhdGUubGVuYml0cyktMSxkbWFzaz0oMTw8c3RhdGUuZGlzdGJpdHMpLTE7dG9wOmRve2JpdHM8MTUmJihob2xkKz1pbnB1dFtfaW4rK108PGJpdHMsYml0cys9OCxob2xkKz1pbnB1dFtfaW4rK108PGJpdHMsYml0cys9OCksaGVyZT1sY29kZVtob2xkJmxtYXNrXTtkb2xlbjpmb3IoOzspe2lmKGhvbGQ+Pj49b3A9aGVyZT4+PjI0LGJpdHMtPW9wLDA9PT0ob3A9aGVyZT4+PjE2JjI1NSkpb3V0cHV0W19vdXQrK109NjU1MzUmaGVyZTtlbHNle2lmKCEoMTYmb3ApKXtpZig2NCZvcCl7aWYoMzImb3Ape3N0YXRlLm1vZGU9MTI7YnJlYWsgdG9wfXN0cm0ubXNnPSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiLHN0YXRlLm1vZGU9MzA7YnJlYWsgdG9wfWhlcmU9bGNvZGVbKDY1NTM1JmhlcmUpKyhob2xkJigxPDxvcCktMSldO2NvbnRpbnVlIGRvbGVufWZvcihsZW49NjU1MzUmaGVyZSwob3AmPTE1KSYmKGJpdHM8b3AmJihob2xkKz1pbnB1dFtfaW4rK108PGJpdHMsYml0cys9OCksbGVuKz1ob2xkJigxPDxvcCktMSxob2xkPj4+PW9wLGJpdHMtPW9wKSxiaXRzPDE1JiYoaG9sZCs9aW5wdXRbX2luKytdPDxiaXRzLGJpdHMrPTgsaG9sZCs9aW5wdXRbX2luKytdPDxiaXRzLGJpdHMrPTgpLGhlcmU9ZGNvZGVbaG9sZCZkbWFza107Oyl7aWYoaG9sZD4+Pj1vcD1oZXJlPj4+MjQsYml0cy09b3AsMTYmKG9wPWhlcmU+Pj4xNiYyNTUpKXtpZihkaXN0PTY1NTM1JmhlcmUsYml0czwob3AmPTE1KSYmKGhvbGQrPWlucHV0W19pbisrXTw8Yml0cywoYml0cys9OCk8b3AmJihob2xkKz1pbnB1dFtfaW4rK108PGJpdHMsYml0cys9OCkpLChkaXN0Kz1ob2xkJigxPDxvcCktMSk+ZG1heCl7c3RybS5tc2c9ImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIixzdGF0ZS5tb2RlPTMwO2JyZWFrIHRvcH1pZihob2xkPj4+PW9wLGJpdHMtPW9wLGRpc3Q+KG9wPV9vdXQtYmVnKSl7aWYoKG9wPWRpc3Qtb3ApPndoYXZlJiZzdGF0ZS5zYW5lKXtzdHJtLm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLHN0YXRlLm1vZGU9MzA7YnJlYWsgdG9wfWlmKGZyb209MCxmcm9tX3NvdXJjZT1zX3dpbmRvdywwPT09d25leHQpe2lmKGZyb20rPXdzaXplLW9wLG9wPGxlbil7bGVuLT1vcDtkb3tvdXRwdXRbX291dCsrXT1zX3dpbmRvd1tmcm9tKytdfXdoaWxlKC0tb3ApO2Zyb209X291dC1kaXN0LGZyb21fc291cmNlPW91dHB1dH19ZWxzZSBpZih3bmV4dDxvcCl7aWYoZnJvbSs9d3NpemUrd25leHQtb3AsKG9wLT13bmV4dCk8bGVuKXtsZW4tPW9wO2Rve291dHB1dFtfb3V0KytdPXNfd2luZG93W2Zyb20rK119d2hpbGUoLS1vcCk7aWYoZnJvbT0wLHduZXh0PGxlbil7bGVuLT1vcD13bmV4dDtkb3tvdXRwdXRbX291dCsrXT1zX3dpbmRvd1tmcm9tKytdfXdoaWxlKC0tb3ApO2Zyb209X291dC1kaXN0LGZyb21fc291cmNlPW91dHB1dH19fWVsc2UgaWYoZnJvbSs9d25leHQtb3Asb3A8bGVuKXtsZW4tPW9wO2Rve291dHB1dFtfb3V0KytdPXNfd2luZG93W2Zyb20rK119d2hpbGUoLS1vcCk7ZnJvbT1fb3V0LWRpc3QsZnJvbV9zb3VyY2U9b3V0cHV0fWZvcig7bGVuPjI7KW91dHB1dFtfb3V0KytdPWZyb21fc291cmNlW2Zyb20rK10sb3V0cHV0W19vdXQrK109ZnJvbV9zb3VyY2VbZnJvbSsrXSxvdXRwdXRbX291dCsrXT1mcm9tX3NvdXJjZVtmcm9tKytdLGxlbi09MztsZW4mJihvdXRwdXRbX291dCsrXT1mcm9tX3NvdXJjZVtmcm9tKytdLGxlbj4xJiYob3V0cHV0W19vdXQrK109ZnJvbV9zb3VyY2VbZnJvbSsrXSkpfWVsc2V7ZnJvbT1fb3V0LWRpc3Q7ZG97b3V0cHV0W19vdXQrK109b3V0cHV0W2Zyb20rK10sb3V0cHV0W19vdXQrK109b3V0cHV0W2Zyb20rK10sb3V0cHV0W19vdXQrK109b3V0cHV0W2Zyb20rK10sbGVuLT0zfXdoaWxlKGxlbj4yKTtsZW4mJihvdXRwdXRbX291dCsrXT1vdXRwdXRbZnJvbSsrXSxsZW4+MSYmKG91dHB1dFtfb3V0KytdPW91dHB1dFtmcm9tKytdKSl9YnJlYWt9aWYoNjQmb3Ape3N0cm0ubXNnPSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiLHN0YXRlLm1vZGU9MzA7YnJlYWsgdG9wfWhlcmU9ZGNvZGVbKDY1NTM1JmhlcmUpKyhob2xkJigxPDxvcCktMSldfX1icmVha319d2hpbGUoX2luPGxhc3QmJl9vdXQ8ZW5kKTtfaW4tPWxlbj1iaXRzPj4zLGhvbGQmPSgxPDwoYml0cy09bGVuPDwzKSktMSxzdHJtLm5leHRfaW49X2luLHN0cm0ubmV4dF9vdXQ9X291dCxzdHJtLmF2YWlsX2luPV9pbjxsYXN0P2xhc3QtX2luKzU6NS0oX2luLWxhc3QpLHN0cm0uYXZhaWxfb3V0PV9vdXQ8ZW5kP2VuZC1fb3V0KzI1NzoyNTctKF9vdXQtZW5kKSxzdGF0ZS5ob2xkPWhvbGQsc3RhdGUuYml0cz1iaXRzfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2luZmxhdGUuanMiKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciB1dGlscz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvcGFrby9saWIvdXRpbHMvY29tbW9uLmpzIiksYWRsZXIzMj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9hZGxlcjMyLmpzIiksY3JjMzI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY3JjMzIuanMiKSxpbmZsYXRlX2Zhc3Q9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mZmFzdC5qcyIpLGluZmxhdGVfdGFibGU9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mdHJlZXMuanMiKTtmdW5jdGlvbiB6c3dhcDMyKHEpe3JldHVybihxPj4+MjQmMjU1KSsocT4+PjgmNjUyODApKygoNjUyODAmcSk8PDgpKygoMjU1JnEpPDwyNCl9ZnVuY3Rpb24gSW5mbGF0ZVN0YXRlKCl7dGhpcy5tb2RlPTAsdGhpcy5sYXN0PSExLHRoaXMud3JhcD0wLHRoaXMuaGF2ZWRpY3Q9ITEsdGhpcy5mbGFncz0wLHRoaXMuZG1heD0wLHRoaXMuY2hlY2s9MCx0aGlzLnRvdGFsPTAsdGhpcy5oZWFkPW51bGwsdGhpcy53Yml0cz0wLHRoaXMud3NpemU9MCx0aGlzLndoYXZlPTAsdGhpcy53bmV4dD0wLHRoaXMud2luZG93PW51bGwsdGhpcy5ob2xkPTAsdGhpcy5iaXRzPTAsdGhpcy5sZW5ndGg9MCx0aGlzLm9mZnNldD0wLHRoaXMuZXh0cmE9MCx0aGlzLmxlbmNvZGU9bnVsbCx0aGlzLmRpc3Rjb2RlPW51bGwsdGhpcy5sZW5iaXRzPTAsdGhpcy5kaXN0Yml0cz0wLHRoaXMubmNvZGU9MCx0aGlzLm5sZW49MCx0aGlzLm5kaXN0PTAsdGhpcy5oYXZlPTAsdGhpcy5uZXh0PW51bGwsdGhpcy5sZW5zPW5ldyB1dGlscy5CdWYxNigzMjApLHRoaXMud29yaz1uZXcgdXRpbHMuQnVmMTYoMjg4KSx0aGlzLmxlbmR5bj1udWxsLHRoaXMuZGlzdGR5bj1udWxsLHRoaXMuc2FuZT0wLHRoaXMuYmFjaz0wLHRoaXMud2FzPTB9ZnVuY3Rpb24gaW5mbGF0ZVJlc2V0S2VlcChzdHJtKXt2YXIgc3RhdGU7cmV0dXJuIHN0cm0mJnN0cm0uc3RhdGU/KHN0YXRlPXN0cm0uc3RhdGUsc3RybS50b3RhbF9pbj1zdHJtLnRvdGFsX291dD1zdGF0ZS50b3RhbD0wLHN0cm0ubXNnPSIiLHN0YXRlLndyYXAmJihzdHJtLmFkbGVyPTEmc3RhdGUud3JhcCksc3RhdGUubW9kZT0xLHN0YXRlLmxhc3Q9MCxzdGF0ZS5oYXZlZGljdD0wLHN0YXRlLmRtYXg9MzI3Njgsc3RhdGUuaGVhZD1udWxsLHN0YXRlLmhvbGQ9MCxzdGF0ZS5iaXRzPTAsc3RhdGUubGVuY29kZT1zdGF0ZS5sZW5keW49bmV3IHV0aWxzLkJ1ZjMyKDg1Miksc3RhdGUuZGlzdGNvZGU9c3RhdGUuZGlzdGR5bj1uZXcgdXRpbHMuQnVmMzIoNTkyKSxzdGF0ZS5zYW5lPTEsc3RhdGUuYmFjaz0tMSwwKTotMn1mdW5jdGlvbiBpbmZsYXRlUmVzZXQoc3RybSl7dmFyIHN0YXRlO3JldHVybiBzdHJtJiZzdHJtLnN0YXRlPygoc3RhdGU9c3RybS5zdGF0ZSkud3NpemU9MCxzdGF0ZS53aGF2ZT0wLHN0YXRlLnduZXh0PTAsaW5mbGF0ZVJlc2V0S2VlcChzdHJtKSk6LTJ9ZnVuY3Rpb24gaW5mbGF0ZVJlc2V0MihzdHJtLHdpbmRvd0JpdHMpe3ZhciB3cmFwLHN0YXRlO3JldHVybiBzdHJtJiZzdHJtLnN0YXRlPyhzdGF0ZT1zdHJtLnN0YXRlLHdpbmRvd0JpdHM8MD8od3JhcD0wLHdpbmRvd0JpdHM9LXdpbmRvd0JpdHMpOih3cmFwPTErKHdpbmRvd0JpdHM+PjQpLHdpbmRvd0JpdHM8NDgmJih3aW5kb3dCaXRzJj0xNSkpLHdpbmRvd0JpdHMmJih3aW5kb3dCaXRzPDh8fHdpbmRvd0JpdHM+MTUpPy0yOihudWxsIT09c3RhdGUud2luZG93JiZzdGF0ZS53Yml0cyE9PXdpbmRvd0JpdHMmJihzdGF0ZS53aW5kb3c9bnVsbCksc3RhdGUud3JhcD13cmFwLHN0YXRlLndiaXRzPXdpbmRvd0JpdHMsaW5mbGF0ZVJlc2V0KHN0cm0pKSk6LTJ9ZnVuY3Rpb24gaW5mbGF0ZUluaXQyKHN0cm0sd2luZG93Qml0cyl7dmFyIHJldCxzdGF0ZTtyZXR1cm4gc3RybT8oc3RhdGU9bmV3IEluZmxhdGVTdGF0ZSxzdHJtLnN0YXRlPXN0YXRlLHN0YXRlLndpbmRvdz1udWxsLDAhPT0ocmV0PWluZmxhdGVSZXNldDIoc3RybSx3aW5kb3dCaXRzKSkmJihzdHJtLnN0YXRlPW51bGwpLHJldCk6LTJ9dmFyIGxlbmZpeCxkaXN0Zml4LHZpcmdpbj0hMDtmdW5jdGlvbiBmaXhlZHRhYmxlcyhzdGF0ZSl7aWYodmlyZ2luKXt2YXIgc3ltO2ZvcihsZW5maXg9bmV3IHV0aWxzLkJ1ZjMyKDUxMiksZGlzdGZpeD1uZXcgdXRpbHMuQnVmMzIoMzIpLHN5bT0wO3N5bTwxNDQ7KXN0YXRlLmxlbnNbc3ltKytdPTg7Zm9yKDtzeW08MjU2OylzdGF0ZS5sZW5zW3N5bSsrXT05O2Zvcig7c3ltPDI4MDspc3RhdGUubGVuc1tzeW0rK109Nztmb3IoO3N5bTwyODg7KXN0YXRlLmxlbnNbc3ltKytdPTg7Zm9yKGluZmxhdGVfdGFibGUoMSxzdGF0ZS5sZW5zLDAsMjg4LGxlbmZpeCwwLHN0YXRlLndvcmsse2JpdHM6OX0pLHN5bT0wO3N5bTwzMjspc3RhdGUubGVuc1tzeW0rK109NTtpbmZsYXRlX3RhYmxlKDIsc3RhdGUubGVucywwLDMyLGRpc3RmaXgsMCxzdGF0ZS53b3JrLHtiaXRzOjV9KSx2aXJnaW49ITF9c3RhdGUubGVuY29kZT1sZW5maXgsc3RhdGUubGVuYml0cz05LHN0YXRlLmRpc3Rjb2RlPWRpc3RmaXgsc3RhdGUuZGlzdGJpdHM9NX1mdW5jdGlvbiB1cGRhdGV3aW5kb3coc3RybSxzcmMsZW5kLGNvcHkpe3ZhciBkaXN0LHN0YXRlPXN0cm0uc3RhdGU7cmV0dXJuIG51bGw9PT1zdGF0ZS53aW5kb3cmJihzdGF0ZS53c2l6ZT0xPDxzdGF0ZS53Yml0cyxzdGF0ZS53bmV4dD0wLHN0YXRlLndoYXZlPTAsc3RhdGUud2luZG93PW5ldyB1dGlscy5CdWY4KHN0YXRlLndzaXplKSksY29weT49c3RhdGUud3NpemU/KHV0aWxzLmFycmF5U2V0KHN0YXRlLndpbmRvdyxzcmMsZW5kLXN0YXRlLndzaXplLHN0YXRlLndzaXplLDApLHN0YXRlLnduZXh0PTAsc3RhdGUud2hhdmU9c3RhdGUud3NpemUpOigoZGlzdD1zdGF0ZS53c2l6ZS1zdGF0ZS53bmV4dCk+Y29weSYmKGRpc3Q9Y29weSksdXRpbHMuYXJyYXlTZXQoc3RhdGUud2luZG93LHNyYyxlbmQtY29weSxkaXN0LHN0YXRlLnduZXh0KSwoY29weS09ZGlzdCk/KHV0aWxzLmFycmF5U2V0KHN0YXRlLndpbmRvdyxzcmMsZW5kLWNvcHksY29weSwwKSxzdGF0ZS53bmV4dD1jb3B5LHN0YXRlLndoYXZlPXN0YXRlLndzaXplKTooc3RhdGUud25leHQrPWRpc3Qsc3RhdGUud25leHQ9PT1zdGF0ZS53c2l6ZSYmKHN0YXRlLnduZXh0PTApLHN0YXRlLndoYXZlPHN0YXRlLndzaXplJiYoc3RhdGUud2hhdmUrPWRpc3QpKSksMH1leHBvcnRzLmluZmxhdGVSZXNldD1pbmZsYXRlUmVzZXQsZXhwb3J0cy5pbmZsYXRlUmVzZXQyPWluZmxhdGVSZXNldDIsZXhwb3J0cy5pbmZsYXRlUmVzZXRLZWVwPWluZmxhdGVSZXNldEtlZXAsZXhwb3J0cy5pbmZsYXRlSW5pdD1mdW5jdGlvbiBpbmZsYXRlSW5pdChzdHJtKXtyZXR1cm4gaW5mbGF0ZUluaXQyKHN0cm0sMTUpfSxleHBvcnRzLmluZmxhdGVJbml0Mj1pbmZsYXRlSW5pdDIsZXhwb3J0cy5pbmZsYXRlPWZ1bmN0aW9uIGluZmxhdGUoc3RybSxmbHVzaCl7dmFyIHN0YXRlLGlucHV0LG91dHB1dCxuZXh0LHB1dCxoYXZlLGxlZnQsaG9sZCxiaXRzLF9pbixfb3V0LGNvcHksZnJvbSxmcm9tX3NvdXJjZSxoZXJlX2JpdHMsaGVyZV9vcCxoZXJlX3ZhbCxsYXN0X2JpdHMsbGFzdF9vcCxsYXN0X3ZhbCxsZW4scmV0LG9wdHMsbixoZXJlPTAsaGJ1Zj1uZXcgdXRpbHMuQnVmOCg0KSxvcmRlcj1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV07aWYoIXN0cm18fCFzdHJtLnN0YXRlfHwhc3RybS5vdXRwdXR8fCFzdHJtLmlucHV0JiYwIT09c3RybS5hdmFpbF9pbilyZXR1cm4tMjsxMj09PShzdGF0ZT1zdHJtLnN0YXRlKS5tb2RlJiYoc3RhdGUubW9kZT0xMykscHV0PXN0cm0ubmV4dF9vdXQsb3V0cHV0PXN0cm0ub3V0cHV0LGxlZnQ9c3RybS5hdmFpbF9vdXQsbmV4dD1zdHJtLm5leHRfaW4saW5wdXQ9c3RybS5pbnB1dCxoYXZlPXN0cm0uYXZhaWxfaW4saG9sZD1zdGF0ZS5ob2xkLGJpdHM9c3RhdGUuYml0cyxfaW49aGF2ZSxfb3V0PWxlZnQscmV0PTA7aW5mX2xlYXZlOmZvcig7Oylzd2l0Y2goc3RhdGUubW9kZSl7Y2FzZSAxOmlmKDA9PT1zdGF0ZS53cmFwKXtzdGF0ZS5tb2RlPTEzO2JyZWFrfWZvcig7Yml0czwxNjspe2lmKDA9PT1oYXZlKWJyZWFrIGluZl9sZWF2ZTtoYXZlLS0saG9sZCs9aW5wdXRbbmV4dCsrXTw8Yml0cyxiaXRzKz04fWlmKDImc3RhdGUud3JhcCYmMzU2MTU9PT1ob2xkKXtzdGF0ZS5jaGVjaz0wLGhidWZbMF09MjU1JmhvbGQsaGJ1ZlsxXT1ob2xkPj4+OCYyNTUsc3RhdGUuY2hlY2s9Y3JjMzIoc3RhdGUuY2hlY2ssaGJ1ZiwyLDApLGhvbGQ9MCxiaXRzPTAsc3RhdGUubW9kZT0yO2JyZWFrfWlmKHN0YXRlLmZsYWdzPTAsc3RhdGUuaGVhZCYmKHN0YXRlLmhlYWQuZG9uZT0hMSksISgxJnN0YXRlLndyYXApfHwoKCgyNTUmaG9sZCk8PDgpKyhob2xkPj44KSklMzEpe3N0cm0ubXNnPSJpbmNvcnJlY3QgaGVhZGVyIGNoZWNrIixzdGF0ZS5tb2RlPTMwO2JyZWFrfWlmKDghPSgxNSZob2xkKSl7c3RybS5tc2c9InVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIixzdGF0ZS5tb2RlPTMwO2JyZWFrfWlmKGJpdHMtPTQsbGVuPTgrKDE1Jihob2xkPj4+PTQpKSwwPT09c3RhdGUud2JpdHMpc3RhdGUud2JpdHM9bGVuO2Vsc2UgaWYobGVuPnN0YXRlLndiaXRzKXtzdHJtLm1zZz0iaW52YWxpZCB3aW5kb3cgc2l6ZSIsc3RhdGUubW9kZT0zMDticmVha31zdGF0ZS5kbWF4PTE8PGxlbixzdHJtLmFkbGVyPXN0YXRlLmNoZWNrPTEsc3RhdGUubW9kZT01MTImaG9sZD8xMDoxMixob2xkPTAsYml0cz0wO2JyZWFrO2Nhc2UgMjpmb3IoO2JpdHM8MTY7KXtpZigwPT09aGF2ZSlicmVhayBpbmZfbGVhdmU7aGF2ZS0tLGhvbGQrPWlucHV0W25leHQrK108PGJpdHMsYml0cys9OH1pZihzdGF0ZS5mbGFncz1ob2xkLDghPSgyNTUmc3RhdGUuZmxhZ3MpKXtzdHJtLm1zZz0idW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QiLHN0YXRlLm1vZGU9MzA7YnJlYWt9aWYoNTczNDQmc3RhdGUuZmxhZ3Mpe3N0cm0ubXNnPSJ1bmtub3duIGhlYWRlciBmbGFncyBzZXQiLHN0YXRlLm1vZGU9MzA7YnJlYWt9c3RhdGUuaGVhZCYmKHN0YXRlLmhlYWQudGV4dD1ob2xkPj44JjEpLDUxMiZzdGF0ZS5mbGFncyYmKGhidWZbMF09MjU1JmhvbGQsaGJ1ZlsxXT1ob2xkPj4+OCYyNTUsc3RhdGUuY2hlY2s9Y3JjMzIoc3RhdGUuY2hlY2ssaGJ1ZiwyLDApKSxob2xkPTAsYml0cz0wLHN0YXRlLm1vZGU9MztjYXNlIDM6Zm9yKDtiaXRzPDMyOyl7aWYoMD09PWhhdmUpYnJlYWsgaW5mX2xlYXZlO2hhdmUtLSxob2xkKz1pbnB1dFtuZXh0KytdPDxiaXRzLGJpdHMrPTh9c3RhdGUuaGVhZCYmKHN0YXRlLmhlYWQudGltZT1ob2xkKSw1MTImc3RhdGUuZmxhZ3MmJihoYnVmWzBdPTI1NSZob2xkLGhidWZbMV09aG9sZD4+PjgmMjU1LGhidWZbMl09aG9sZD4+PjE2JjI1NSxoYnVmWzNdPWhvbGQ+Pj4yNCYyNTUsc3RhdGUuY2hlY2s9Y3JjMzIoc3RhdGUuY2hlY2ssaGJ1Ziw0LDApKSxob2xkPTAsYml0cz0wLHN0YXRlLm1vZGU9NDtjYXNlIDQ6Zm9yKDtiaXRzPDE2Oyl7aWYoMD09PWhhdmUpYnJlYWsgaW5mX2xlYXZlO2hhdmUtLSxob2xkKz1pbnB1dFtuZXh0KytdPDxiaXRzLGJpdHMrPTh9c3RhdGUuaGVhZCYmKHN0YXRlLmhlYWQueGZsYWdzPTI1NSZob2xkLHN0YXRlLmhlYWQub3M9aG9sZD4+OCksNTEyJnN0YXRlLmZsYWdzJiYoaGJ1ZlswXT0yNTUmaG9sZCxoYnVmWzFdPWhvbGQ+Pj44JjI1NSxzdGF0ZS5jaGVjaz1jcmMzMihzdGF0ZS5jaGVjayxoYnVmLDIsMCkpLGhvbGQ9MCxiaXRzPTAsc3RhdGUubW9kZT01O2Nhc2UgNTppZigxMDI0JnN0YXRlLmZsYWdzKXtmb3IoO2JpdHM8MTY7KXtpZigwPT09aGF2ZSlicmVhayBpbmZfbGVhdmU7aGF2ZS0tLGhvbGQrPWlucHV0W25leHQrK108PGJpdHMsYml0cys9OH1zdGF0ZS5sZW5ndGg9aG9sZCxzdGF0ZS5oZWFkJiYoc3RhdGUuaGVhZC5leHRyYV9sZW49aG9sZCksNTEyJnN0YXRlLmZsYWdzJiYoaGJ1ZlswXT0yNTUmaG9sZCxoYnVmWzFdPWhvbGQ+Pj44JjI1NSxzdGF0ZS5jaGVjaz1jcmMzMihzdGF0ZS5jaGVjayxoYnVmLDIsMCkpLGhvbGQ9MCxiaXRzPTB9ZWxzZSBzdGF0ZS5oZWFkJiYoc3RhdGUuaGVhZC5leHRyYT1udWxsKTtzdGF0ZS5tb2RlPTY7Y2FzZSA2OmlmKDEwMjQmc3RhdGUuZmxhZ3MmJigoY29weT1zdGF0ZS5sZW5ndGgpPmhhdmUmJihjb3B5PWhhdmUpLGNvcHkmJihzdGF0ZS5oZWFkJiYobGVuPXN0YXRlLmhlYWQuZXh0cmFfbGVuLXN0YXRlLmxlbmd0aCxzdGF0ZS5oZWFkLmV4dHJhfHwoc3RhdGUuaGVhZC5leHRyYT1uZXcgQXJyYXkoc3RhdGUuaGVhZC5leHRyYV9sZW4pKSx1dGlscy5hcnJheVNldChzdGF0ZS5oZWFkLmV4dHJhLGlucHV0LG5leHQsY29weSxsZW4pKSw1MTImc3RhdGUuZmxhZ3MmJihzdGF0ZS5jaGVjaz1jcmMzMihzdGF0ZS5jaGVjayxpbnB1dCxjb3B5LG5leHQpKSxoYXZlLT1jb3B5LG5leHQrPWNvcHksc3RhdGUubGVuZ3RoLT1jb3B5KSxzdGF0ZS5sZW5ndGgpKWJyZWFrIGluZl9sZWF2ZTtzdGF0ZS5sZW5ndGg9MCxzdGF0ZS5tb2RlPTc7Y2FzZSA3OmlmKDIwNDgmc3RhdGUuZmxhZ3Mpe2lmKDA9PT1oYXZlKWJyZWFrIGluZl9sZWF2ZTtjb3B5PTA7ZG97bGVuPWlucHV0W25leHQrY29weSsrXSxzdGF0ZS5oZWFkJiZsZW4mJnN0YXRlLmxlbmd0aDw2NTUzNiYmKHN0YXRlLmhlYWQubmFtZSs9U3RyaW5nLmZyb21DaGFyQ29kZShsZW4pKX13aGlsZShsZW4mJmNvcHk8aGF2ZSk7aWYoNTEyJnN0YXRlLmZsYWdzJiYoc3RhdGUuY2hlY2s9Y3JjMzIoc3RhdGUuY2hlY2ssaW5wdXQsY29weSxuZXh0KSksaGF2ZS09Y29weSxuZXh0Kz1jb3B5LGxlbilicmVhayBpbmZfbGVhdmV9ZWxzZSBzdGF0ZS5oZWFkJiYoc3RhdGUuaGVhZC5uYW1lPW51bGwpO3N0YXRlLmxlbmd0aD0wLHN0YXRlLm1vZGU9ODtjYXNlIDg6aWYoNDA5NiZzdGF0ZS5mbGFncyl7aWYoMD09PWhhdmUpYnJlYWsgaW5mX2xlYXZlO2NvcHk9MDtkb3tsZW49aW5wdXRbbmV4dCtjb3B5KytdLHN0YXRlLmhlYWQmJmxlbiYmc3RhdGUubGVuZ3RoPDY1NTM2JiYoc3RhdGUuaGVhZC5jb21tZW50Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKGxlbikpfXdoaWxlKGxlbiYmY29weTxoYXZlKTtpZig1MTImc3RhdGUuZmxhZ3MmJihzdGF0ZS5jaGVjaz1jcmMzMihzdGF0ZS5jaGVjayxpbnB1dCxjb3B5LG5leHQpKSxoYXZlLT1jb3B5LG5leHQrPWNvcHksbGVuKWJyZWFrIGluZl9sZWF2ZX1lbHNlIHN0YXRlLmhlYWQmJihzdGF0ZS5oZWFkLmNvbW1lbnQ9bnVsbCk7c3RhdGUubW9kZT05O2Nhc2UgOTppZig1MTImc3RhdGUuZmxhZ3Mpe2Zvcig7Yml0czwxNjspe2lmKDA9PT1oYXZlKWJyZWFrIGluZl9sZWF2ZTtoYXZlLS0saG9sZCs9aW5wdXRbbmV4dCsrXTw8Yml0cyxiaXRzKz04fWlmKGhvbGQhPT0oNjU1MzUmc3RhdGUuY2hlY2spKXtzdHJtLm1zZz0iaGVhZGVyIGNyYyBtaXNtYXRjaCIsc3RhdGUubW9kZT0zMDticmVha31ob2xkPTAsYml0cz0wfXN0YXRlLmhlYWQmJihzdGF0ZS5oZWFkLmhjcmM9c3RhdGUuZmxhZ3M+PjkmMSxzdGF0ZS5oZWFkLmRvbmU9ITApLHN0cm0uYWRsZXI9c3RhdGUuY2hlY2s9MCxzdGF0ZS5tb2RlPTEyO2JyZWFrO2Nhc2UgMTA6Zm9yKDtiaXRzPDMyOyl7aWYoMD09PWhhdmUpYnJlYWsgaW5mX2xlYXZlO2hhdmUtLSxob2xkKz1pbnB1dFtuZXh0KytdPDxiaXRzLGJpdHMrPTh9c3RybS5hZGxlcj1zdGF0ZS5jaGVjaz16c3dhcDMyKGhvbGQpLGhvbGQ9MCxiaXRzPTAsc3RhdGUubW9kZT0xMTtjYXNlIDExOmlmKDA9PT1zdGF0ZS5oYXZlZGljdClyZXR1cm4gc3RybS5uZXh0X291dD1wdXQsc3RybS5hdmFpbF9vdXQ9bGVmdCxzdHJtLm5leHRfaW49bmV4dCxzdHJtLmF2YWlsX2luPWhhdmUsc3RhdGUuaG9sZD1ob2xkLHN0YXRlLmJpdHM9Yml0cywyO3N0cm0uYWRsZXI9c3RhdGUuY2hlY2s9MSxzdGF0ZS5tb2RlPTEyO2Nhc2UgMTI6aWYoNT09PWZsdXNofHw2PT09Zmx1c2gpYnJlYWsgaW5mX2xlYXZlO2Nhc2UgMTM6aWYoc3RhdGUubGFzdCl7aG9sZD4+Pj03JmJpdHMsYml0cy09NyZiaXRzLHN0YXRlLm1vZGU9Mjc7YnJlYWt9Zm9yKDtiaXRzPDM7KXtpZigwPT09aGF2ZSlicmVhayBpbmZfbGVhdmU7aGF2ZS0tLGhvbGQrPWlucHV0W25leHQrK108PGJpdHMsYml0cys9OH1zd2l0Y2goc3RhdGUubGFzdD0xJmhvbGQsYml0cy09MSwzJihob2xkPj4+PTEpKXtjYXNlIDA6c3RhdGUubW9kZT0xNDticmVhaztjYXNlIDE6aWYoZml4ZWR0YWJsZXMoc3RhdGUpLHN0YXRlLm1vZGU9MjAsNj09PWZsdXNoKXtob2xkPj4+PTIsYml0cy09MjticmVhayBpbmZfbGVhdmV9YnJlYWs7Y2FzZSAyOnN0YXRlLm1vZGU9MTc7YnJlYWs7Y2FzZSAzOnN0cm0ubXNnPSJpbnZhbGlkIGJsb2NrIHR5cGUiLHN0YXRlLm1vZGU9MzB9aG9sZD4+Pj0yLGJpdHMtPTI7YnJlYWs7Y2FzZSAxNDpmb3IoaG9sZD4+Pj03JmJpdHMsYml0cy09NyZiaXRzO2JpdHM8MzI7KXtpZigwPT09aGF2ZSlicmVhayBpbmZfbGVhdmU7aGF2ZS0tLGhvbGQrPWlucHV0W25leHQrK108PGJpdHMsYml0cys9OH1pZigoNjU1MzUmaG9sZCkhPShob2xkPj4+MTZeNjU1MzUpKXtzdHJtLm1zZz0iaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocyIsc3RhdGUubW9kZT0zMDticmVha31pZihzdGF0ZS5sZW5ndGg9NjU1MzUmaG9sZCxob2xkPTAsYml0cz0wLHN0YXRlLm1vZGU9MTUsNj09PWZsdXNoKWJyZWFrIGluZl9sZWF2ZTtjYXNlIDE1OnN0YXRlLm1vZGU9MTY7Y2FzZSAxNjppZihjb3B5PXN0YXRlLmxlbmd0aCl7aWYoY29weT5oYXZlJiYoY29weT1oYXZlKSxjb3B5PmxlZnQmJihjb3B5PWxlZnQpLDA9PT1jb3B5KWJyZWFrIGluZl9sZWF2ZTt1dGlscy5hcnJheVNldChvdXRwdXQsaW5wdXQsbmV4dCxjb3B5LHB1dCksaGF2ZS09Y29weSxuZXh0Kz1jb3B5LGxlZnQtPWNvcHkscHV0Kz1jb3B5LHN0YXRlLmxlbmd0aC09Y29weTticmVha31zdGF0ZS5tb2RlPTEyO2JyZWFrO2Nhc2UgMTc6Zm9yKDtiaXRzPDE0Oyl7aWYoMD09PWhhdmUpYnJlYWsgaW5mX2xlYXZlO2hhdmUtLSxob2xkKz1pbnB1dFtuZXh0KytdPDxiaXRzLGJpdHMrPTh9aWYoc3RhdGUubmxlbj0yNTcrKDMxJmhvbGQpLGhvbGQ+Pj49NSxiaXRzLT01LHN0YXRlLm5kaXN0PTErKDMxJmhvbGQpLGhvbGQ+Pj49NSxiaXRzLT01LHN0YXRlLm5jb2RlPTQrKDE1JmhvbGQpLGhvbGQ+Pj49NCxiaXRzLT00LHN0YXRlLm5sZW4+Mjg2fHxzdGF0ZS5uZGlzdD4zMCl7c3RybS5tc2c9InRvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzIixzdGF0ZS5tb2RlPTMwO2JyZWFrfXN0YXRlLmhhdmU9MCxzdGF0ZS5tb2RlPTE4O2Nhc2UgMTg6Zm9yKDtzdGF0ZS5oYXZlPHN0YXRlLm5jb2RlOyl7Zm9yKDtiaXRzPDM7KXtpZigwPT09aGF2ZSlicmVhayBpbmZfbGVhdmU7aGF2ZS0tLGhvbGQrPWlucHV0W25leHQrK108PGJpdHMsYml0cys9OH1zdGF0ZS5sZW5zW29yZGVyW3N0YXRlLmhhdmUrK11dPTcmaG9sZCxob2xkPj4+PTMsYml0cy09M31mb3IoO3N0YXRlLmhhdmU8MTk7KXN0YXRlLmxlbnNbb3JkZXJbc3RhdGUuaGF2ZSsrXV09MDtpZihzdGF0ZS5sZW5jb2RlPXN0YXRlLmxlbmR5bixzdGF0ZS5sZW5iaXRzPTcsb3B0cz17Yml0czpzdGF0ZS5sZW5iaXRzfSxyZXQ9aW5mbGF0ZV90YWJsZSgwLHN0YXRlLmxlbnMsMCwxOSxzdGF0ZS5sZW5jb2RlLDAsc3RhdGUud29yayxvcHRzKSxzdGF0ZS5sZW5iaXRzPW9wdHMuYml0cyxyZXQpe3N0cm0ubXNnPSJpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQiLHN0YXRlLm1vZGU9MzA7YnJlYWt9c3RhdGUuaGF2ZT0wLHN0YXRlLm1vZGU9MTk7Y2FzZSAxOTpmb3IoO3N0YXRlLmhhdmU8c3RhdGUubmxlbitzdGF0ZS5uZGlzdDspe2Zvcig7aGVyZV9vcD0oaGVyZT1zdGF0ZS5sZW5jb2RlW2hvbGQmKDE8PHN0YXRlLmxlbmJpdHMpLTFdKT4+PjE2JjI1NSxoZXJlX3ZhbD02NTUzNSZoZXJlLCEoKGhlcmVfYml0cz1oZXJlPj4+MjQpPD1iaXRzKTspe2lmKDA9PT1oYXZlKWJyZWFrIGluZl9sZWF2ZTtoYXZlLS0saG9sZCs9aW5wdXRbbmV4dCsrXTw8Yml0cyxiaXRzKz04fWlmKGhlcmVfdmFsPDE2KWhvbGQ+Pj49aGVyZV9iaXRzLGJpdHMtPWhlcmVfYml0cyxzdGF0ZS5sZW5zW3N0YXRlLmhhdmUrK109aGVyZV92YWw7ZWxzZXtpZigxNj09PWhlcmVfdmFsKXtmb3Iobj1oZXJlX2JpdHMrMjtiaXRzPG47KXtpZigwPT09aGF2ZSlicmVhayBpbmZfbGVhdmU7aGF2ZS0tLGhvbGQrPWlucHV0W25leHQrK108PGJpdHMsYml0cys9OH1pZihob2xkPj4+PWhlcmVfYml0cyxiaXRzLT1oZXJlX2JpdHMsMD09PXN0YXRlLmhhdmUpe3N0cm0ubXNnPSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IixzdGF0ZS5tb2RlPTMwO2JyZWFrfWxlbj1zdGF0ZS5sZW5zW3N0YXRlLmhhdmUtMV0sY29weT0zKygzJmhvbGQpLGhvbGQ+Pj49MixiaXRzLT0yfWVsc2UgaWYoMTc9PT1oZXJlX3ZhbCl7Zm9yKG49aGVyZV9iaXRzKzM7Yml0czxuOyl7aWYoMD09PWhhdmUpYnJlYWsgaW5mX2xlYXZlO2hhdmUtLSxob2xkKz1pbnB1dFtuZXh0KytdPDxiaXRzLGJpdHMrPTh9Yml0cy09aGVyZV9iaXRzLGxlbj0wLGNvcHk9MysoNyYoaG9sZD4+Pj1oZXJlX2JpdHMpKSxob2xkPj4+PTMsYml0cy09M31lbHNle2ZvcihuPWhlcmVfYml0cys3O2JpdHM8bjspe2lmKDA9PT1oYXZlKWJyZWFrIGluZl9sZWF2ZTtoYXZlLS0saG9sZCs9aW5wdXRbbmV4dCsrXTw8Yml0cyxiaXRzKz04fWJpdHMtPWhlcmVfYml0cyxsZW49MCxjb3B5PTExKygxMjcmKGhvbGQ+Pj49aGVyZV9iaXRzKSksaG9sZD4+Pj03LGJpdHMtPTd9aWYoc3RhdGUuaGF2ZStjb3B5PnN0YXRlLm5sZW4rc3RhdGUubmRpc3Qpe3N0cm0ubXNnPSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IixzdGF0ZS5tb2RlPTMwO2JyZWFrfWZvcig7Y29weS0tOylzdGF0ZS5sZW5zW3N0YXRlLmhhdmUrK109bGVufX1pZigzMD09PXN0YXRlLm1vZGUpYnJlYWs7aWYoMD09PXN0YXRlLmxlbnNbMjU2XSl7c3RybS5tc2c9ImludmFsaWQgY29kZSAtLSBtaXNzaW5nIGVuZC1vZi1ibG9jayIsc3RhdGUubW9kZT0zMDticmVha31pZihzdGF0ZS5sZW5iaXRzPTksb3B0cz17Yml0czpzdGF0ZS5sZW5iaXRzfSxyZXQ9aW5mbGF0ZV90YWJsZSgxLHN0YXRlLmxlbnMsMCxzdGF0ZS5ubGVuLHN0YXRlLmxlbmNvZGUsMCxzdGF0ZS53b3JrLG9wdHMpLHN0YXRlLmxlbmJpdHM9b3B0cy5iaXRzLHJldCl7c3RybS5tc2c9ImludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldCIsc3RhdGUubW9kZT0zMDticmVha31pZihzdGF0ZS5kaXN0Yml0cz02LHN0YXRlLmRpc3Rjb2RlPXN0YXRlLmRpc3RkeW4sb3B0cz17Yml0czpzdGF0ZS5kaXN0Yml0c30scmV0PWluZmxhdGVfdGFibGUoMixzdGF0ZS5sZW5zLHN0YXRlLm5sZW4sc3RhdGUubmRpc3Qsc3RhdGUuZGlzdGNvZGUsMCxzdGF0ZS53b3JrLG9wdHMpLHN0YXRlLmRpc3RiaXRzPW9wdHMuYml0cyxyZXQpe3N0cm0ubXNnPSJpbnZhbGlkIGRpc3RhbmNlcyBzZXQiLHN0YXRlLm1vZGU9MzA7YnJlYWt9aWYoc3RhdGUubW9kZT0yMCw2PT09Zmx1c2gpYnJlYWsgaW5mX2xlYXZlO2Nhc2UgMjA6c3RhdGUubW9kZT0yMTtjYXNlIDIxOmlmKGhhdmU+PTYmJmxlZnQ+PTI1OCl7c3RybS5uZXh0X291dD1wdXQsc3RybS5hdmFpbF9vdXQ9bGVmdCxzdHJtLm5leHRfaW49bmV4dCxzdHJtLmF2YWlsX2luPWhhdmUsc3RhdGUuaG9sZD1ob2xkLHN0YXRlLmJpdHM9Yml0cyxpbmZsYXRlX2Zhc3Qoc3RybSxfb3V0KSxwdXQ9c3RybS5uZXh0X291dCxvdXRwdXQ9c3RybS5vdXRwdXQsbGVmdD1zdHJtLmF2YWlsX291dCxuZXh0PXN0cm0ubmV4dF9pbixpbnB1dD1zdHJtLmlucHV0LGhhdmU9c3RybS5hdmFpbF9pbixob2xkPXN0YXRlLmhvbGQsYml0cz1zdGF0ZS5iaXRzLDEyPT09c3RhdGUubW9kZSYmKHN0YXRlLmJhY2s9LTEpO2JyZWFrfWZvcihzdGF0ZS5iYWNrPTA7aGVyZV9vcD0oaGVyZT1zdGF0ZS5sZW5jb2RlW2hvbGQmKDE8PHN0YXRlLmxlbmJpdHMpLTFdKT4+PjE2JjI1NSxoZXJlX3ZhbD02NTUzNSZoZXJlLCEoKGhlcmVfYml0cz1oZXJlPj4+MjQpPD1iaXRzKTspe2lmKDA9PT1oYXZlKWJyZWFrIGluZl9sZWF2ZTtoYXZlLS0saG9sZCs9aW5wdXRbbmV4dCsrXTw8Yml0cyxiaXRzKz04fWlmKGhlcmVfb3AmJiEoMjQwJmhlcmVfb3ApKXtmb3IobGFzdF9iaXRzPWhlcmVfYml0cyxsYXN0X29wPWhlcmVfb3AsbGFzdF92YWw9aGVyZV92YWw7aGVyZV9vcD0oaGVyZT1zdGF0ZS5sZW5jb2RlW2xhc3RfdmFsKygoaG9sZCYoMTw8bGFzdF9iaXRzK2xhc3Rfb3ApLTEpPj5sYXN0X2JpdHMpXSk+Pj4xNiYyNTUsaGVyZV92YWw9NjU1MzUmaGVyZSwhKGxhc3RfYml0cysoaGVyZV9iaXRzPWhlcmU+Pj4yNCk8PWJpdHMpOyl7aWYoMD09PWhhdmUpYnJlYWsgaW5mX2xlYXZlO2hhdmUtLSxob2xkKz1pbnB1dFtuZXh0KytdPDxiaXRzLGJpdHMrPTh9aG9sZD4+Pj1sYXN0X2JpdHMsYml0cy09bGFzdF9iaXRzLHN0YXRlLmJhY2srPWxhc3RfYml0c31pZihob2xkPj4+PWhlcmVfYml0cyxiaXRzLT1oZXJlX2JpdHMsc3RhdGUuYmFjays9aGVyZV9iaXRzLHN0YXRlLmxlbmd0aD1oZXJlX3ZhbCwwPT09aGVyZV9vcCl7c3RhdGUubW9kZT0yNjticmVha31pZigzMiZoZXJlX29wKXtzdGF0ZS5iYWNrPS0xLHN0YXRlLm1vZGU9MTI7YnJlYWt9aWYoNjQmaGVyZV9vcCl7c3RybS5tc2c9ImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSIsc3RhdGUubW9kZT0zMDticmVha31zdGF0ZS5leHRyYT0xNSZoZXJlX29wLHN0YXRlLm1vZGU9MjI7Y2FzZSAyMjppZihzdGF0ZS5leHRyYSl7Zm9yKG49c3RhdGUuZXh0cmE7Yml0czxuOyl7aWYoMD09PWhhdmUpYnJlYWsgaW5mX2xlYXZlO2hhdmUtLSxob2xkKz1pbnB1dFtuZXh0KytdPDxiaXRzLGJpdHMrPTh9c3RhdGUubGVuZ3RoKz1ob2xkJigxPDxzdGF0ZS5leHRyYSktMSxob2xkPj4+PXN0YXRlLmV4dHJhLGJpdHMtPXN0YXRlLmV4dHJhLHN0YXRlLmJhY2srPXN0YXRlLmV4dHJhfXN0YXRlLndhcz1zdGF0ZS5sZW5ndGgsc3RhdGUubW9kZT0yMztjYXNlIDIzOmZvcig7aGVyZV9vcD0oaGVyZT1zdGF0ZS5kaXN0Y29kZVtob2xkJigxPDxzdGF0ZS5kaXN0Yml0cyktMV0pPj4+MTYmMjU1LGhlcmVfdmFsPTY1NTM1JmhlcmUsISgoaGVyZV9iaXRzPWhlcmU+Pj4yNCk8PWJpdHMpOyl7aWYoMD09PWhhdmUpYnJlYWsgaW5mX2xlYXZlO2hhdmUtLSxob2xkKz1pbnB1dFtuZXh0KytdPDxiaXRzLGJpdHMrPTh9aWYoISgyNDAmaGVyZV9vcCkpe2ZvcihsYXN0X2JpdHM9aGVyZV9iaXRzLGxhc3Rfb3A9aGVyZV9vcCxsYXN0X3ZhbD1oZXJlX3ZhbDtoZXJlX29wPShoZXJlPXN0YXRlLmRpc3Rjb2RlW2xhc3RfdmFsKygoaG9sZCYoMTw8bGFzdF9iaXRzK2xhc3Rfb3ApLTEpPj5sYXN0X2JpdHMpXSk+Pj4xNiYyNTUsaGVyZV92YWw9NjU1MzUmaGVyZSwhKGxhc3RfYml0cysoaGVyZV9iaXRzPWhlcmU+Pj4yNCk8PWJpdHMpOyl7aWYoMD09PWhhdmUpYnJlYWsgaW5mX2xlYXZlO2hhdmUtLSxob2xkKz1pbnB1dFtuZXh0KytdPDxiaXRzLGJpdHMrPTh9aG9sZD4+Pj1sYXN0X2JpdHMsYml0cy09bGFzdF9iaXRzLHN0YXRlLmJhY2srPWxhc3RfYml0c31pZihob2xkPj4+PWhlcmVfYml0cyxiaXRzLT1oZXJlX2JpdHMsc3RhdGUuYmFjays9aGVyZV9iaXRzLDY0JmhlcmVfb3Ape3N0cm0ubXNnPSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiLHN0YXRlLm1vZGU9MzA7YnJlYWt9c3RhdGUub2Zmc2V0PWhlcmVfdmFsLHN0YXRlLmV4dHJhPTE1JmhlcmVfb3Asc3RhdGUubW9kZT0yNDtjYXNlIDI0OmlmKHN0YXRlLmV4dHJhKXtmb3Iobj1zdGF0ZS5leHRyYTtiaXRzPG47KXtpZigwPT09aGF2ZSlicmVhayBpbmZfbGVhdmU7aGF2ZS0tLGhvbGQrPWlucHV0W25leHQrK108PGJpdHMsYml0cys9OH1zdGF0ZS5vZmZzZXQrPWhvbGQmKDE8PHN0YXRlLmV4dHJhKS0xLGhvbGQ+Pj49c3RhdGUuZXh0cmEsYml0cy09c3RhdGUuZXh0cmEsc3RhdGUuYmFjays9c3RhdGUuZXh0cmF9aWYoc3RhdGUub2Zmc2V0PnN0YXRlLmRtYXgpe3N0cm0ubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsc3RhdGUubW9kZT0zMDticmVha31zdGF0ZS5tb2RlPTI1O2Nhc2UgMjU6aWYoMD09PWxlZnQpYnJlYWsgaW5mX2xlYXZlO2lmKGNvcHk9X291dC1sZWZ0LHN0YXRlLm9mZnNldD5jb3B5KXtpZigoY29weT1zdGF0ZS5vZmZzZXQtY29weSk+c3RhdGUud2hhdmUmJnN0YXRlLnNhbmUpe3N0cm0ubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsc3RhdGUubW9kZT0zMDticmVha31jb3B5PnN0YXRlLnduZXh0Pyhjb3B5LT1zdGF0ZS53bmV4dCxmcm9tPXN0YXRlLndzaXplLWNvcHkpOmZyb209c3RhdGUud25leHQtY29weSxjb3B5PnN0YXRlLmxlbmd0aCYmKGNvcHk9c3RhdGUubGVuZ3RoKSxmcm9tX3NvdXJjZT1zdGF0ZS53aW5kb3d9ZWxzZSBmcm9tX3NvdXJjZT1vdXRwdXQsZnJvbT1wdXQtc3RhdGUub2Zmc2V0LGNvcHk9c3RhdGUubGVuZ3RoO2NvcHk+bGVmdCYmKGNvcHk9bGVmdCksbGVmdC09Y29weSxzdGF0ZS5sZW5ndGgtPWNvcHk7ZG97b3V0cHV0W3B1dCsrXT1mcm9tX3NvdXJjZVtmcm9tKytdfXdoaWxlKC0tY29weSk7MD09PXN0YXRlLmxlbmd0aCYmKHN0YXRlLm1vZGU9MjEpO2JyZWFrO2Nhc2UgMjY6aWYoMD09PWxlZnQpYnJlYWsgaW5mX2xlYXZlO291dHB1dFtwdXQrK109c3RhdGUubGVuZ3RoLGxlZnQtLSxzdGF0ZS5tb2RlPTIxO2JyZWFrO2Nhc2UgMjc6aWYoc3RhdGUud3JhcCl7Zm9yKDtiaXRzPDMyOyl7aWYoMD09PWhhdmUpYnJlYWsgaW5mX2xlYXZlO2hhdmUtLSxob2xkfD1pbnB1dFtuZXh0KytdPDxiaXRzLGJpdHMrPTh9aWYoX291dC09bGVmdCxzdHJtLnRvdGFsX291dCs9X291dCxzdGF0ZS50b3RhbCs9X291dCxfb3V0JiYoc3RybS5hZGxlcj1zdGF0ZS5jaGVjaz1zdGF0ZS5mbGFncz9jcmMzMihzdGF0ZS5jaGVjayxvdXRwdXQsX291dCxwdXQtX291dCk6YWRsZXIzMihzdGF0ZS5jaGVjayxvdXRwdXQsX291dCxwdXQtX291dCkpLF9vdXQ9bGVmdCwoc3RhdGUuZmxhZ3M/aG9sZDp6c3dhcDMyKGhvbGQpKSE9PXN0YXRlLmNoZWNrKXtzdHJtLm1zZz0iaW5jb3JyZWN0IGRhdGEgY2hlY2siLHN0YXRlLm1vZGU9MzA7YnJlYWt9aG9sZD0wLGJpdHM9MH1zdGF0ZS5tb2RlPTI4O2Nhc2UgMjg6aWYoc3RhdGUud3JhcCYmc3RhdGUuZmxhZ3Mpe2Zvcig7Yml0czwzMjspe2lmKDA9PT1oYXZlKWJyZWFrIGluZl9sZWF2ZTtoYXZlLS0saG9sZCs9aW5wdXRbbmV4dCsrXTw8Yml0cyxiaXRzKz04fWlmKGhvbGQhPT0oNDI5NDk2NzI5NSZzdGF0ZS50b3RhbCkpe3N0cm0ubXNnPSJpbmNvcnJlY3QgbGVuZ3RoIGNoZWNrIixzdGF0ZS5tb2RlPTMwO2JyZWFrfWhvbGQ9MCxiaXRzPTB9c3RhdGUubW9kZT0yOTtjYXNlIDI5OnJldD0xO2JyZWFrIGluZl9sZWF2ZTtjYXNlIDMwOnJldD0tMzticmVhayBpbmZfbGVhdmU7Y2FzZSAzMTpyZXR1cm4tNDtkZWZhdWx0OnJldHVybi0yfXJldHVybiBzdHJtLm5leHRfb3V0PXB1dCxzdHJtLmF2YWlsX291dD1sZWZ0LHN0cm0ubmV4dF9pbj1uZXh0LHN0cm0uYXZhaWxfaW49aGF2ZSxzdGF0ZS5ob2xkPWhvbGQsc3RhdGUuYml0cz1iaXRzLChzdGF0ZS53c2l6ZXx8X291dCE9PXN0cm0uYXZhaWxfb3V0JiZzdGF0ZS5tb2RlPDMwJiYoc3RhdGUubW9kZTwyN3x8NCE9PWZsdXNoKSkmJnVwZGF0ZXdpbmRvdyhzdHJtLHN0cm0ub3V0cHV0LHN0cm0ubmV4dF9vdXQsX291dC1zdHJtLmF2YWlsX291dCk/KHN0YXRlLm1vZGU9MzEsLTQpOihfaW4tPXN0cm0uYXZhaWxfaW4sX291dC09c3RybS5hdmFpbF9vdXQsc3RybS50b3RhbF9pbis9X2luLHN0cm0udG90YWxfb3V0Kz1fb3V0LHN0YXRlLnRvdGFsKz1fb3V0LHN0YXRlLndyYXAmJl9vdXQmJihzdHJtLmFkbGVyPXN0YXRlLmNoZWNrPXN0YXRlLmZsYWdzP2NyYzMyKHN0YXRlLmNoZWNrLG91dHB1dCxfb3V0LHN0cm0ubmV4dF9vdXQtX291dCk6YWRsZXIzMihzdGF0ZS5jaGVjayxvdXRwdXQsX291dCxzdHJtLm5leHRfb3V0LV9vdXQpKSxzdHJtLmRhdGFfdHlwZT1zdGF0ZS5iaXRzKyhzdGF0ZS5sYXN0PzY0OjApKygxMj09PXN0YXRlLm1vZGU/MTI4OjApKygyMD09PXN0YXRlLm1vZGV8fDE1PT09c3RhdGUubW9kZT8yNTY6MCksKDA9PT1faW4mJjA9PT1fb3V0fHw0PT09Zmx1c2gpJiYwPT09cmV0JiYocmV0PS01KSxyZXQpfSxleHBvcnRzLmluZmxhdGVFbmQ9ZnVuY3Rpb24gaW5mbGF0ZUVuZChzdHJtKXtpZighc3RybXx8IXN0cm0uc3RhdGUpcmV0dXJuLTI7dmFyIHN0YXRlPXN0cm0uc3RhdGU7cmV0dXJuIHN0YXRlLndpbmRvdyYmKHN0YXRlLndpbmRvdz1udWxsKSxzdHJtLnN0YXRlPW51bGwsMH0sZXhwb3J0cy5pbmZsYXRlR2V0SGVhZGVyPWZ1bmN0aW9uIGluZmxhdGVHZXRIZWFkZXIoc3RybSxoZWFkKXt2YXIgc3RhdGU7cmV0dXJuIHN0cm0mJnN0cm0uc3RhdGUmJjImKHN0YXRlPXN0cm0uc3RhdGUpLndyYXA/KHN0YXRlLmhlYWQ9aGVhZCxoZWFkLmRvbmU9ITEsMCk6LTJ9LGV4cG9ydHMuaW5mbGF0ZVNldERpY3Rpb25hcnk9ZnVuY3Rpb24gaW5mbGF0ZVNldERpY3Rpb25hcnkoc3RybSxkaWN0aW9uYXJ5KXt2YXIgc3RhdGUsZGljdExlbmd0aD1kaWN0aW9uYXJ5Lmxlbmd0aDtyZXR1cm4gc3RybSYmc3RybS5zdGF0ZT8wIT09KHN0YXRlPXN0cm0uc3RhdGUpLndyYXAmJjExIT09c3RhdGUubW9kZT8tMjoxMT09PXN0YXRlLm1vZGUmJmFkbGVyMzIoMSxkaWN0aW9uYXJ5LGRpY3RMZW5ndGgsMCkhPT1zdGF0ZS5jaGVjaz8tMzp1cGRhdGV3aW5kb3coc3RybSxkaWN0aW9uYXJ5LGRpY3RMZW5ndGgsZGljdExlbmd0aCk/KHN0YXRlLm1vZGU9MzEsLTQpOihzdGF0ZS5oYXZlZGljdD0xLDApOi0yfSxleHBvcnRzLmluZmxhdGVJbmZvPSJwYWtvIGluZmxhdGUgKGZyb20gTm9kZWNhIHByb2plY3QpIn0sIi4uLy4uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2luZnRyZWVzLmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgdXRpbHM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3V0aWxzL2NvbW1vbi5qcyIpLGxiYXNlPVszLDQsNSw2LDcsOCw5LDEwLDExLDEzLDE1LDE3LDE5LDIzLDI3LDMxLDM1LDQzLDUxLDU5LDY3LDgzLDk5LDExNSwxMzEsMTYzLDE5NSwyMjcsMjU4LDAsMF0sbGV4dD1bMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTcsMTcsMTcsMTcsMTgsMTgsMTgsMTgsMTksMTksMTksMTksMjAsMjAsMjAsMjAsMjEsMjEsMjEsMjEsMTYsNzIsNzhdLGRiYXNlPVsxLDIsMyw0LDUsNyw5LDEzLDE3LDI1LDMzLDQ5LDY1LDk3LDEyOSwxOTMsMjU3LDM4NSw1MTMsNzY5LDEwMjUsMTUzNywyMDQ5LDMwNzMsNDA5Nyw2MTQ1LDgxOTMsMTIyODksMTYzODUsMjQ1NzcsMCwwXSxkZXh0PVsxNiwxNiwxNiwxNiwxNywxNywxOCwxOCwxOSwxOSwyMCwyMCwyMSwyMSwyMiwyMiwyMywyMywyNCwyNCwyNSwyNSwyNiwyNiwyNywyNywyOCwyOCwyOSwyOSw2NCw2NF07bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24gaW5mbGF0ZV90YWJsZSh0eXBlLGxlbnMsbGVuc19pbmRleCxjb2Rlcyx0YWJsZSx0YWJsZV9pbmRleCx3b3JrLG9wdHMpe3ZhciBpbmNyLGZpbGwsbG93LG1hc2ssbmV4dCxlbmQsaGVyZV9iaXRzLGhlcmVfb3AsaGVyZV92YWwsYml0cz1vcHRzLmJpdHMsbGVuPTAsc3ltPTAsbWluPTAsbWF4PTAscm9vdD0wLGN1cnI9MCxkcm9wPTAsbGVmdD0wLHVzZWQ9MCxodWZmPTAsYmFzZT1udWxsLGJhc2VfaW5kZXg9MCxjb3VudD1uZXcgdXRpbHMuQnVmMTYoMTYpLG9mZnM9bmV3IHV0aWxzLkJ1ZjE2KDE2KSxleHRyYT1udWxsLGV4dHJhX2luZGV4PTA7Zm9yKGxlbj0wO2xlbjw9MTU7bGVuKyspY291bnRbbGVuXT0wO2ZvcihzeW09MDtzeW08Y29kZXM7c3ltKyspY291bnRbbGVuc1tsZW5zX2luZGV4K3N5bV1dKys7Zm9yKHJvb3Q9Yml0cyxtYXg9MTU7bWF4Pj0xJiYwPT09Y291bnRbbWF4XTttYXgtLSk7aWYocm9vdD5tYXgmJihyb290PW1heCksMD09PW1heClyZXR1cm4gdGFibGVbdGFibGVfaW5kZXgrK109MjA5NzE1MjAsdGFibGVbdGFibGVfaW5kZXgrK109MjA5NzE1MjAsb3B0cy5iaXRzPTEsMDtmb3IobWluPTE7bWluPG1heCYmMD09PWNvdW50W21pbl07bWluKyspO2Zvcihyb290PG1pbiYmKHJvb3Q9bWluKSxsZWZ0PTEsbGVuPTE7bGVuPD0xNTtsZW4rKylpZihsZWZ0PDw9MSwobGVmdC09Y291bnRbbGVuXSk8MClyZXR1cm4tMTtpZihsZWZ0PjAmJigwPT09dHlwZXx8MSE9PW1heCkpcmV0dXJuLTE7Zm9yKG9mZnNbMV09MCxsZW49MTtsZW48MTU7bGVuKyspb2Zmc1tsZW4rMV09b2Zmc1tsZW5dK2NvdW50W2xlbl07Zm9yKHN5bT0wO3N5bTxjb2RlcztzeW0rKykwIT09bGVuc1tsZW5zX2luZGV4K3N5bV0mJih3b3JrW29mZnNbbGVuc1tsZW5zX2luZGV4K3N5bV1dKytdPXN5bSk7aWYoMD09PXR5cGU/KGJhc2U9ZXh0cmE9d29yayxlbmQ9MTkpOjE9PT10eXBlPyhiYXNlPWxiYXNlLGJhc2VfaW5kZXgtPTI1NyxleHRyYT1sZXh0LGV4dHJhX2luZGV4LT0yNTcsZW5kPTI1Nik6KGJhc2U9ZGJhc2UsZXh0cmE9ZGV4dCxlbmQ9LTEpLGh1ZmY9MCxzeW09MCxsZW49bWluLG5leHQ9dGFibGVfaW5kZXgsY3Vycj1yb290LGRyb3A9MCxsb3c9LTEsbWFzaz0odXNlZD0xPDxyb290KS0xLDE9PT10eXBlJiZ1c2VkPjg1Mnx8Mj09PXR5cGUmJnVzZWQ+NTkyKXJldHVybiAxO2Zvcig7Oyl7aGVyZV9iaXRzPWxlbi1kcm9wLHdvcmtbc3ltXTxlbmQ/KGhlcmVfb3A9MCxoZXJlX3ZhbD13b3JrW3N5bV0pOndvcmtbc3ltXT5lbmQ/KGhlcmVfb3A9ZXh0cmFbZXh0cmFfaW5kZXgrd29ya1tzeW1dXSxoZXJlX3ZhbD1iYXNlW2Jhc2VfaW5kZXgrd29ya1tzeW1dXSk6KGhlcmVfb3A9OTYsaGVyZV92YWw9MCksaW5jcj0xPDxsZW4tZHJvcCxtaW49ZmlsbD0xPDxjdXJyO2Rve3RhYmxlW25leHQrKGh1ZmY+PmRyb3ApKyhmaWxsLT1pbmNyKV09aGVyZV9iaXRzPDwyNHxoZXJlX29wPDwxNnxoZXJlX3ZhbH13aGlsZSgwIT09ZmlsbCk7Zm9yKGluY3I9MTw8bGVuLTE7aHVmZiZpbmNyOylpbmNyPj49MTtpZigwIT09aW5jcj8oaHVmZiY9aW5jci0xLGh1ZmYrPWluY3IpOmh1ZmY9MCxzeW0rKywwPT09LS1jb3VudFtsZW5dKXtpZihsZW49PT1tYXgpYnJlYWs7bGVuPWxlbnNbbGVuc19pbmRleCt3b3JrW3N5bV1dfWlmKGxlbj5yb290JiYoaHVmZiZtYXNrKSE9PWxvdyl7Zm9yKDA9PT1kcm9wJiYoZHJvcD1yb290KSxuZXh0Kz1taW4sbGVmdD0xPDwoY3Vycj1sZW4tZHJvcCk7Y3Vycitkcm9wPG1heCYmISgobGVmdC09Y291bnRbY3Vycitkcm9wXSk8PTApOyljdXJyKyssbGVmdDw8PTE7aWYodXNlZCs9MTw8Y3VyciwxPT09dHlwZSYmdXNlZD44NTJ8fDI9PT10eXBlJiZ1c2VkPjU5MilyZXR1cm4gMTt0YWJsZVtsb3c9aHVmZiZtYXNrXT1yb290PDwyNHxjdXJyPDwxNnxuZXh0LXRhYmxlX2luZGV4fX1yZXR1cm4gMCE9PWh1ZmYmJih0YWJsZVtuZXh0K2h1ZmZdPWxlbi1kcm9wPDwyNHw2NDw8MTYpLG9wdHMuYml0cz1yb290LDB9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvbWVzc2FnZXMuanMiKG1vZHVsZSl7InVzZSBzdHJpY3QiO21vZHVsZS5leHBvcnRzPXsyOiJuZWVkIGRpY3Rpb25hcnkiLDE6InN0cmVhbSBlbmQiLDA6IiIsIi0xIjoiZmlsZSBlcnJvciIsIi0yIjoic3RyZWFtIGVycm9yIiwiLTMiOiJkYXRhIGVycm9yIiwiLTQiOiJpbnN1ZmZpY2llbnQgbWVtb3J5IiwiLTUiOiJidWZmZXIgZXJyb3IiLCItNiI6ImluY29tcGF0aWJsZSB2ZXJzaW9uIn19LCIuLi8uLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi90cmVlcy5qcyIoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIHV0aWxzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9wYWtvL2xpYi91dGlscy9jb21tb24uanMiKTtmdW5jdGlvbiB6ZXJvKGJ1Zil7Zm9yKHZhciBsZW49YnVmLmxlbmd0aDstLWxlbj49MDspYnVmW2xlbl09MH12YXIgZXh0cmFfbGJpdHM9WzAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDIsMiwyLDIsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsMF0sZXh0cmFfZGJpdHM9WzAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTNdLGV4dHJhX2JsYml0cz1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDMsN10sYmxfb3JkZXI9WzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdLHN0YXRpY19sdHJlZT1uZXcgQXJyYXkoNTc2KTt6ZXJvKHN0YXRpY19sdHJlZSk7dmFyIHN0YXRpY19kdHJlZT1uZXcgQXJyYXkoNjApO3plcm8oc3RhdGljX2R0cmVlKTt2YXIgX2Rpc3RfY29kZT1uZXcgQXJyYXkoNTEyKTt6ZXJvKF9kaXN0X2NvZGUpO3ZhciBfbGVuZ3RoX2NvZGU9bmV3IEFycmF5KDI1Nik7emVybyhfbGVuZ3RoX2NvZGUpO3ZhciBiYXNlX2xlbmd0aD1uZXcgQXJyYXkoMjkpO3plcm8oYmFzZV9sZW5ndGgpO3ZhciBzdGF0aWNfbF9kZXNjLHN0YXRpY19kX2Rlc2Msc3RhdGljX2JsX2Rlc2MsYmFzZV9kaXN0PW5ldyBBcnJheSgzMCk7ZnVuY3Rpb24gU3RhdGljVHJlZURlc2Moc3RhdGljX3RyZWUsZXh0cmFfYml0cyxleHRyYV9iYXNlLGVsZW1zLG1heF9sZW5ndGgpe3RoaXMuc3RhdGljX3RyZWU9c3RhdGljX3RyZWUsdGhpcy5leHRyYV9iaXRzPWV4dHJhX2JpdHMsdGhpcy5leHRyYV9iYXNlPWV4dHJhX2Jhc2UsdGhpcy5lbGVtcz1lbGVtcyx0aGlzLm1heF9sZW5ndGg9bWF4X2xlbmd0aCx0aGlzLmhhc19zdHJlZT1zdGF0aWNfdHJlZSYmc3RhdGljX3RyZWUubGVuZ3RofWZ1bmN0aW9uIFRyZWVEZXNjKGR5bl90cmVlLHN0YXRfZGVzYyl7dGhpcy5keW5fdHJlZT1keW5fdHJlZSx0aGlzLm1heF9jb2RlPTAsdGhpcy5zdGF0X2Rlc2M9c3RhdF9kZXNjfWZ1bmN0aW9uIGRfY29kZShkaXN0KXtyZXR1cm4gZGlzdDwyNTY/X2Rpc3RfY29kZVtkaXN0XTpfZGlzdF9jb2RlWzI1NisoZGlzdD4+PjcpXX1mdW5jdGlvbiBwdXRfc2hvcnQocyx3KXtzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXT0yNTUmdyxzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXT13Pj4+OCYyNTV9ZnVuY3Rpb24gc2VuZF9iaXRzKHMsdmFsdWUsbGVuZ3RoKXtzLmJpX3ZhbGlkPjE2LWxlbmd0aD8ocy5iaV9idWZ8PXZhbHVlPDxzLmJpX3ZhbGlkJjY1NTM1LHB1dF9zaG9ydChzLHMuYmlfYnVmKSxzLmJpX2J1Zj12YWx1ZT4+MTYtcy5iaV92YWxpZCxzLmJpX3ZhbGlkKz1sZW5ndGgtMTYpOihzLmJpX2J1Znw9dmFsdWU8PHMuYmlfdmFsaWQmNjU1MzUscy5iaV92YWxpZCs9bGVuZ3RoKX1mdW5jdGlvbiBzZW5kX2NvZGUocyxjLHRyZWUpe3NlbmRfYml0cyhzLHRyZWVbMipjXSx0cmVlWzIqYysxXSl9ZnVuY3Rpb24gYmlfcmV2ZXJzZShjb2RlLGxlbil7dmFyIHJlcz0wO2Rve3Jlc3w9MSZjb2RlLGNvZGU+Pj49MSxyZXM8PD0xfXdoaWxlKC0tbGVuPjApO3JldHVybiByZXM+Pj4xfWZ1bmN0aW9uIGdlbl9jb2Rlcyh0cmVlLG1heF9jb2RlLGJsX2NvdW50KXt2YXIgYml0cyxuLG5leHRfY29kZT1uZXcgQXJyYXkoMTYpLGNvZGU9MDtmb3IoYml0cz0xO2JpdHM8PTE1O2JpdHMrKyluZXh0X2NvZGVbYml0c109Y29kZT1jb2RlK2JsX2NvdW50W2JpdHMtMV08PDE7Zm9yKG49MDtuPD1tYXhfY29kZTtuKyspe3ZhciBsZW49dHJlZVsyKm4rMV07MCE9PWxlbiYmKHRyZWVbMipuXT1iaV9yZXZlcnNlKG5leHRfY29kZVtsZW5dKyssbGVuKSl9fWZ1bmN0aW9uIGluaXRfYmxvY2socyl7dmFyIG47Zm9yKG49MDtuPDI4NjtuKyspcy5keW5fbHRyZWVbMipuXT0wO2ZvcihuPTA7bjwzMDtuKyspcy5keW5fZHRyZWVbMipuXT0wO2ZvcihuPTA7bjwxOTtuKyspcy5ibF90cmVlWzIqbl09MDtzLmR5bl9sdHJlZVs1MTJdPTEscy5vcHRfbGVuPXMuc3RhdGljX2xlbj0wLHMubGFzdF9saXQ9cy5tYXRjaGVzPTB9ZnVuY3Rpb24gYmlfd2luZHVwKHMpe3MuYmlfdmFsaWQ+OD9wdXRfc2hvcnQocyxzLmJpX2J1Zik6cy5iaV92YWxpZD4wJiYocy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK109cy5iaV9idWYpLHMuYmlfYnVmPTAscy5iaV92YWxpZD0wfWZ1bmN0aW9uIHNtYWxsZXIodHJlZSxuLG0sZGVwdGgpe3ZhciBfbjI9MipuLF9tMj0yKm07cmV0dXJuIHRyZWVbX24yXTx0cmVlW19tMl18fHRyZWVbX24yXT09PXRyZWVbX20yXSYmZGVwdGhbbl08PWRlcHRoW21dfWZ1bmN0aW9uIHBxZG93bmhlYXAocyx0cmVlLGspe2Zvcih2YXIgdj1zLmhlYXBba10saj1rPDwxO2o8PXMuaGVhcF9sZW4mJihqPHMuaGVhcF9sZW4mJnNtYWxsZXIodHJlZSxzLmhlYXBbaisxXSxzLmhlYXBbal0scy5kZXB0aCkmJmorKywhc21hbGxlcih0cmVlLHYscy5oZWFwW2pdLHMuZGVwdGgpKTspcy5oZWFwW2tdPXMuaGVhcFtqXSxrPWosajw8PTE7cy5oZWFwW2tdPXZ9ZnVuY3Rpb24gY29tcHJlc3NfYmxvY2socyxsdHJlZSxkdHJlZSl7dmFyIGRpc3QsbGMsY29kZSxleHRyYSxseD0wO2lmKDAhPT1zLmxhc3RfbGl0KWRve2Rpc3Q9cy5wZW5kaW5nX2J1ZltzLmRfYnVmKzIqbHhdPDw4fHMucGVuZGluZ19idWZbcy5kX2J1ZisyKmx4KzFdLGxjPXMucGVuZGluZ19idWZbcy5sX2J1ZitseF0sbHgrKywwPT09ZGlzdD9zZW5kX2NvZGUocyxsYyxsdHJlZSk6KHNlbmRfY29kZShzLChjb2RlPV9sZW5ndGhfY29kZVtsY10pKzI1NisxLGx0cmVlKSwwIT09KGV4dHJhPWV4dHJhX2xiaXRzW2NvZGVdKSYmc2VuZF9iaXRzKHMsbGMtPWJhc2VfbGVuZ3RoW2NvZGVdLGV4dHJhKSxzZW5kX2NvZGUocyxjb2RlPWRfY29kZSgtLWRpc3QpLGR0cmVlKSwwIT09KGV4dHJhPWV4dHJhX2RiaXRzW2NvZGVdKSYmc2VuZF9iaXRzKHMsZGlzdC09YmFzZV9kaXN0W2NvZGVdLGV4dHJhKSl9d2hpbGUobHg8cy5sYXN0X2xpdCk7c2VuZF9jb2RlKHMsMjU2LGx0cmVlKX1mdW5jdGlvbiBidWlsZF90cmVlKHMsZGVzYyl7dmFyIG4sbSxub2RlLHRyZWU9ZGVzYy5keW5fdHJlZSxzdHJlZT1kZXNjLnN0YXRfZGVzYy5zdGF0aWNfdHJlZSxoYXNfc3RyZWU9ZGVzYy5zdGF0X2Rlc2MuaGFzX3N0cmVlLGVsZW1zPWRlc2Muc3RhdF9kZXNjLmVsZW1zLG1heF9jb2RlPS0xO2ZvcihzLmhlYXBfbGVuPTAscy5oZWFwX21heD01NzMsbj0wO248ZWxlbXM7bisrKTAhPT10cmVlWzIqbl0/KHMuaGVhcFsrK3MuaGVhcF9sZW5dPW1heF9jb2RlPW4scy5kZXB0aFtuXT0wKTp0cmVlWzIqbisxXT0wO2Zvcig7cy5oZWFwX2xlbjwyOyl0cmVlWzIqKG5vZGU9cy5oZWFwWysrcy5oZWFwX2xlbl09bWF4X2NvZGU8Mj8rK21heF9jb2RlOjApXT0xLHMuZGVwdGhbbm9kZV09MCxzLm9wdF9sZW4tLSxoYXNfc3RyZWUmJihzLnN0YXRpY19sZW4tPXN0cmVlWzIqbm9kZSsxXSk7Zm9yKGRlc2MubWF4X2NvZGU9bWF4X2NvZGUsbj1zLmhlYXBfbGVuPj4xO24+PTE7bi0tKXBxZG93bmhlYXAocyx0cmVlLG4pO25vZGU9ZWxlbXM7ZG97bj1zLmhlYXBbMV0scy5oZWFwWzFdPXMuaGVhcFtzLmhlYXBfbGVuLS1dLHBxZG93bmhlYXAocyx0cmVlLDEpLG09cy5oZWFwWzFdLHMuaGVhcFstLXMuaGVhcF9tYXhdPW4scy5oZWFwWy0tcy5oZWFwX21heF09bSx0cmVlWzIqbm9kZV09dHJlZVsyKm5dK3RyZWVbMiptXSxzLmRlcHRoW25vZGVdPShzLmRlcHRoW25dPj1zLmRlcHRoW21dP3MuZGVwdGhbbl06cy5kZXB0aFttXSkrMSx0cmVlWzIqbisxXT10cmVlWzIqbSsxXT1ub2RlLHMuaGVhcFsxXT1ub2RlKysscHFkb3duaGVhcChzLHRyZWUsMSl9d2hpbGUocy5oZWFwX2xlbj49Mik7cy5oZWFwWy0tcy5oZWFwX21heF09cy5oZWFwWzFdLGZ1bmN0aW9uIGdlbl9iaXRsZW4ocyxkZXNjKXt2YXIgaCxuLG0sYml0cyx4Yml0cyxmLHRyZWU9ZGVzYy5keW5fdHJlZSxtYXhfY29kZT1kZXNjLm1heF9jb2RlLHN0cmVlPWRlc2Muc3RhdF9kZXNjLnN0YXRpY190cmVlLGhhc19zdHJlZT1kZXNjLnN0YXRfZGVzYy5oYXNfc3RyZWUsZXh0cmE9ZGVzYy5zdGF0X2Rlc2MuZXh0cmFfYml0cyxiYXNlPWRlc2Muc3RhdF9kZXNjLmV4dHJhX2Jhc2UsbWF4X2xlbmd0aD1kZXNjLnN0YXRfZGVzYy5tYXhfbGVuZ3RoLG92ZXJmbG93PTA7Zm9yKGJpdHM9MDtiaXRzPD0xNTtiaXRzKyspcy5ibF9jb3VudFtiaXRzXT0wO2Zvcih0cmVlWzIqcy5oZWFwW3MuaGVhcF9tYXhdKzFdPTAsaD1zLmhlYXBfbWF4KzE7aDw1NzM7aCsrKShiaXRzPXRyZWVbMip0cmVlWzIqKG49cy5oZWFwW2hdKSsxXSsxXSsxKT5tYXhfbGVuZ3RoJiYoYml0cz1tYXhfbGVuZ3RoLG92ZXJmbG93KyspLHRyZWVbMipuKzFdPWJpdHMsbj5tYXhfY29kZXx8KHMuYmxfY291bnRbYml0c10rKyx4Yml0cz0wLG4+PWJhc2UmJih4Yml0cz1leHRyYVtuLWJhc2VdKSxmPXRyZWVbMipuXSxzLm9wdF9sZW4rPWYqKGJpdHMreGJpdHMpLGhhc19zdHJlZSYmKHMuc3RhdGljX2xlbis9Ziooc3RyZWVbMipuKzFdK3hiaXRzKSkpO2lmKDAhPT1vdmVyZmxvdyl7ZG97Zm9yKGJpdHM9bWF4X2xlbmd0aC0xOzA9PT1zLmJsX2NvdW50W2JpdHNdOyliaXRzLS07cy5ibF9jb3VudFtiaXRzXS0tLHMuYmxfY291bnRbYml0cysxXSs9MixzLmJsX2NvdW50W21heF9sZW5ndGhdLS0sb3ZlcmZsb3ctPTJ9d2hpbGUob3ZlcmZsb3c+MCk7Zm9yKGJpdHM9bWF4X2xlbmd0aDswIT09Yml0cztiaXRzLS0pZm9yKG49cy5ibF9jb3VudFtiaXRzXTswIT09bjspKG09cy5oZWFwWy0taF0pPm1heF9jb2RlfHwodHJlZVsyKm0rMV0hPT1iaXRzJiYocy5vcHRfbGVuKz0oYml0cy10cmVlWzIqbSsxXSkqdHJlZVsyKm1dLHRyZWVbMiptKzFdPWJpdHMpLG4tLSl9fShzLGRlc2MpLGdlbl9jb2Rlcyh0cmVlLG1heF9jb2RlLHMuYmxfY291bnQpfWZ1bmN0aW9uIHNjYW5fdHJlZShzLHRyZWUsbWF4X2NvZGUpe3ZhciBuLGN1cmxlbixwcmV2bGVuPS0xLG5leHRsZW49dHJlZVsxXSxjb3VudD0wLG1heF9jb3VudD03LG1pbl9jb3VudD00O2ZvcigwPT09bmV4dGxlbiYmKG1heF9jb3VudD0xMzgsbWluX2NvdW50PTMpLHRyZWVbMioobWF4X2NvZGUrMSkrMV09NjU1MzUsbj0wO248PW1heF9jb2RlO24rKyljdXJsZW49bmV4dGxlbixuZXh0bGVuPXRyZWVbMioobisxKSsxXSwrK2NvdW50PG1heF9jb3VudCYmY3VybGVuPT09bmV4dGxlbnx8KGNvdW50PG1pbl9jb3VudD9zLmJsX3RyZWVbMipjdXJsZW5dKz1jb3VudDowIT09Y3VybGVuPyhjdXJsZW4hPT1wcmV2bGVuJiZzLmJsX3RyZWVbMipjdXJsZW5dKysscy5ibF90cmVlWzMyXSsrKTpjb3VudDw9MTA/cy5ibF90cmVlWzM0XSsrOnMuYmxfdHJlZVszNl0rKyxjb3VudD0wLHByZXZsZW49Y3VybGVuLDA9PT1uZXh0bGVuPyhtYXhfY291bnQ9MTM4LG1pbl9jb3VudD0zKTpjdXJsZW49PT1uZXh0bGVuPyhtYXhfY291bnQ9NixtaW5fY291bnQ9Myk6KG1heF9jb3VudD03LG1pbl9jb3VudD00KSl9ZnVuY3Rpb24gc2VuZF90cmVlKHMsdHJlZSxtYXhfY29kZSl7dmFyIG4sY3VybGVuLHByZXZsZW49LTEsbmV4dGxlbj10cmVlWzFdLGNvdW50PTAsbWF4X2NvdW50PTcsbWluX2NvdW50PTQ7Zm9yKDA9PT1uZXh0bGVuJiYobWF4X2NvdW50PTEzOCxtaW5fY291bnQ9Myksbj0wO248PW1heF9jb2RlO24rKylpZihjdXJsZW49bmV4dGxlbixuZXh0bGVuPXRyZWVbMioobisxKSsxXSwhKCsrY291bnQ8bWF4X2NvdW50JiZjdXJsZW49PT1uZXh0bGVuKSl7aWYoY291bnQ8bWluX2NvdW50KWRve3NlbmRfY29kZShzLGN1cmxlbixzLmJsX3RyZWUpfXdoaWxlKDAhPT0tLWNvdW50KTtlbHNlIDAhPT1jdXJsZW4/KGN1cmxlbiE9PXByZXZsZW4mJihzZW5kX2NvZGUocyxjdXJsZW4scy5ibF90cmVlKSxjb3VudC0tKSxzZW5kX2NvZGUocywxNixzLmJsX3RyZWUpLHNlbmRfYml0cyhzLGNvdW50LTMsMikpOmNvdW50PD0xMD8oc2VuZF9jb2RlKHMsMTcscy5ibF90cmVlKSxzZW5kX2JpdHMocyxjb3VudC0zLDMpKTooc2VuZF9jb2RlKHMsMTgscy5ibF90cmVlKSxzZW5kX2JpdHMocyxjb3VudC0xMSw3KSk7Y291bnQ9MCxwcmV2bGVuPWN1cmxlbiwwPT09bmV4dGxlbj8obWF4X2NvdW50PTEzOCxtaW5fY291bnQ9Myk6Y3VybGVuPT09bmV4dGxlbj8obWF4X2NvdW50PTYsbWluX2NvdW50PTMpOihtYXhfY291bnQ9NyxtaW5fY291bnQ9NCl9fXplcm8oYmFzZV9kaXN0KTt2YXIgc3RhdGljX2luaXRfZG9uZT0hMTtmdW5jdGlvbiBfdHJfc3RvcmVkX2Jsb2NrKHMsYnVmLHN0b3JlZF9sZW4sbGFzdCl7c2VuZF9iaXRzKHMsMCsobGFzdD8xOjApLDMpLGZ1bmN0aW9uIGNvcHlfYmxvY2socyxidWYsbGVuLGhlYWRlcil7Ymlfd2luZHVwKHMpLGhlYWRlciYmKHB1dF9zaG9ydChzLGxlbikscHV0X3Nob3J0KHMsfmxlbikpLHV0aWxzLmFycmF5U2V0KHMucGVuZGluZ19idWYscy53aW5kb3csYnVmLGxlbixzLnBlbmRpbmcpLHMucGVuZGluZys9bGVufShzLGJ1ZixzdG9yZWRfbGVuLCEwKX1leHBvcnRzLl90cl9pbml0PWZ1bmN0aW9uIF90cl9pbml0KHMpe3N0YXRpY19pbml0X2RvbmV8fCghZnVuY3Rpb24gdHJfc3RhdGljX2luaXQoKXt2YXIgbixiaXRzLGxlbmd0aCxjb2RlLGRpc3QsYmxfY291bnQ9bmV3IEFycmF5KDE2KTtmb3IobGVuZ3RoPTAsY29kZT0wO2NvZGU8Mjg7Y29kZSsrKWZvcihiYXNlX2xlbmd0aFtjb2RlXT1sZW5ndGgsbj0wO248MTw8ZXh0cmFfbGJpdHNbY29kZV07bisrKV9sZW5ndGhfY29kZVtsZW5ndGgrK109Y29kZTtmb3IoX2xlbmd0aF9jb2RlW2xlbmd0aC0xXT1jb2RlLGRpc3Q9MCxjb2RlPTA7Y29kZTwxNjtjb2RlKyspZm9yKGJhc2VfZGlzdFtjb2RlXT1kaXN0LG49MDtuPDE8PGV4dHJhX2RiaXRzW2NvZGVdO24rKylfZGlzdF9jb2RlW2Rpc3QrK109Y29kZTtmb3IoZGlzdD4+PTc7Y29kZTwzMDtjb2RlKyspZm9yKGJhc2VfZGlzdFtjb2RlXT1kaXN0PDw3LG49MDtuPDE8PGV4dHJhX2RiaXRzW2NvZGVdLTc7bisrKV9kaXN0X2NvZGVbMjU2K2Rpc3QrK109Y29kZTtmb3IoYml0cz0wO2JpdHM8PTE1O2JpdHMrKylibF9jb3VudFtiaXRzXT0wO2ZvcihuPTA7bjw9MTQzOylzdGF0aWNfbHRyZWVbMipuKzFdPTgsbisrLGJsX2NvdW50WzhdKys7Zm9yKDtuPD0yNTU7KXN0YXRpY19sdHJlZVsyKm4rMV09OSxuKyssYmxfY291bnRbOV0rKztmb3IoO248PTI3OTspc3RhdGljX2x0cmVlWzIqbisxXT03LG4rKyxibF9jb3VudFs3XSsrO2Zvcig7bjw9Mjg3OylzdGF0aWNfbHRyZWVbMipuKzFdPTgsbisrLGJsX2NvdW50WzhdKys7Zm9yKGdlbl9jb2RlcyhzdGF0aWNfbHRyZWUsMjg3LGJsX2NvdW50KSxuPTA7bjwzMDtuKyspc3RhdGljX2R0cmVlWzIqbisxXT01LHN0YXRpY19kdHJlZVsyKm5dPWJpX3JldmVyc2Uobiw1KTtzdGF0aWNfbF9kZXNjPW5ldyBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfbHRyZWUsZXh0cmFfbGJpdHMsMjU3LDI4NiwxNSksc3RhdGljX2RfZGVzYz1uZXcgU3RhdGljVHJlZURlc2Moc3RhdGljX2R0cmVlLGV4dHJhX2RiaXRzLDAsMzAsMTUpLHN0YXRpY19ibF9kZXNjPW5ldyBTdGF0aWNUcmVlRGVzYyhuZXcgQXJyYXkoMCksZXh0cmFfYmxiaXRzLDAsMTksNyl9KCksc3RhdGljX2luaXRfZG9uZT0hMCkscy5sX2Rlc2M9bmV3IFRyZWVEZXNjKHMuZHluX2x0cmVlLHN0YXRpY19sX2Rlc2MpLHMuZF9kZXNjPW5ldyBUcmVlRGVzYyhzLmR5bl9kdHJlZSxzdGF0aWNfZF9kZXNjKSxzLmJsX2Rlc2M9bmV3IFRyZWVEZXNjKHMuYmxfdHJlZSxzdGF0aWNfYmxfZGVzYykscy5iaV9idWY9MCxzLmJpX3ZhbGlkPTAsaW5pdF9ibG9jayhzKX0sZXhwb3J0cy5fdHJfc3RvcmVkX2Jsb2NrPV90cl9zdG9yZWRfYmxvY2ssZXhwb3J0cy5fdHJfZmx1c2hfYmxvY2s9ZnVuY3Rpb24gX3RyX2ZsdXNoX2Jsb2NrKHMsYnVmLHN0b3JlZF9sZW4sbGFzdCl7dmFyIG9wdF9sZW5iLHN0YXRpY19sZW5iLG1heF9ibGluZGV4PTA7cy5sZXZlbD4wPygyPT09cy5zdHJtLmRhdGFfdHlwZSYmKHMuc3RybS5kYXRhX3R5cGU9ZnVuY3Rpb24gZGV0ZWN0X2RhdGFfdHlwZShzKXt2YXIgbixibGFja19tYXNrPTQwOTM2MjQ0NDc7Zm9yKG49MDtuPD0zMTtuKyssYmxhY2tfbWFzaz4+Pj0xKWlmKDEmYmxhY2tfbWFzayYmMCE9PXMuZHluX2x0cmVlWzIqbl0pcmV0dXJuIDA7aWYoMCE9PXMuZHluX2x0cmVlWzE4XXx8MCE9PXMuZHluX2x0cmVlWzIwXXx8MCE9PXMuZHluX2x0cmVlWzI2XSlyZXR1cm4gMTtmb3Iobj0zMjtuPDI1NjtuKyspaWYoMCE9PXMuZHluX2x0cmVlWzIqbl0pcmV0dXJuIDE7cmV0dXJuIDB9KHMpKSxidWlsZF90cmVlKHMscy5sX2Rlc2MpLGJ1aWxkX3RyZWUocyxzLmRfZGVzYyksbWF4X2JsaW5kZXg9ZnVuY3Rpb24gYnVpbGRfYmxfdHJlZShzKXt2YXIgbWF4X2JsaW5kZXg7Zm9yKHNjYW5fdHJlZShzLHMuZHluX2x0cmVlLHMubF9kZXNjLm1heF9jb2RlKSxzY2FuX3RyZWUocyxzLmR5bl9kdHJlZSxzLmRfZGVzYy5tYXhfY29kZSksYnVpbGRfdHJlZShzLHMuYmxfZGVzYyksbWF4X2JsaW5kZXg9MTg7bWF4X2JsaW5kZXg+PTMmJjA9PT1zLmJsX3RyZWVbMipibF9vcmRlclttYXhfYmxpbmRleF0rMV07bWF4X2JsaW5kZXgtLSk7cmV0dXJuIHMub3B0X2xlbis9MyoobWF4X2JsaW5kZXgrMSkrNSs1KzQsbWF4X2JsaW5kZXh9KHMpLG9wdF9sZW5iPXMub3B0X2xlbiszKzc+Pj4zLChzdGF0aWNfbGVuYj1zLnN0YXRpY19sZW4rMys3Pj4+Myk8PW9wdF9sZW5iJiYob3B0X2xlbmI9c3RhdGljX2xlbmIpKTpvcHRfbGVuYj1zdGF0aWNfbGVuYj1zdG9yZWRfbGVuKzUsc3RvcmVkX2xlbis0PD1vcHRfbGVuYiYmLTEhPT1idWY/X3RyX3N0b3JlZF9ibG9jayhzLGJ1ZixzdG9yZWRfbGVuLGxhc3QpOjQ9PT1zLnN0cmF0ZWd5fHxzdGF0aWNfbGVuYj09PW9wdF9sZW5iPyhzZW5kX2JpdHMocywyKyhsYXN0PzE6MCksMyksY29tcHJlc3NfYmxvY2socyxzdGF0aWNfbHRyZWUsc3RhdGljX2R0cmVlKSk6KHNlbmRfYml0cyhzLDQrKGxhc3Q/MTowKSwzKSxmdW5jdGlvbiBzZW5kX2FsbF90cmVlcyhzLGxjb2RlcyxkY29kZXMsYmxjb2Rlcyl7dmFyIHJhbms7Zm9yKHNlbmRfYml0cyhzLGxjb2Rlcy0yNTcsNSksc2VuZF9iaXRzKHMsZGNvZGVzLTEsNSksc2VuZF9iaXRzKHMsYmxjb2Rlcy00LDQpLHJhbms9MDtyYW5rPGJsY29kZXM7cmFuaysrKXNlbmRfYml0cyhzLHMuYmxfdHJlZVsyKmJsX29yZGVyW3JhbmtdKzFdLDMpO3NlbmRfdHJlZShzLHMuZHluX2x0cmVlLGxjb2Rlcy0xKSxzZW5kX3RyZWUocyxzLmR5bl9kdHJlZSxkY29kZXMtMSl9KHMscy5sX2Rlc2MubWF4X2NvZGUrMSxzLmRfZGVzYy5tYXhfY29kZSsxLG1heF9ibGluZGV4KzEpLGNvbXByZXNzX2Jsb2NrKHMscy5keW5fbHRyZWUscy5keW5fZHRyZWUpKSxpbml0X2Jsb2NrKHMpLGxhc3QmJmJpX3dpbmR1cChzKX0sZXhwb3J0cy5fdHJfdGFsbHk9ZnVuY3Rpb24gX3RyX3RhbGx5KHMsZGlzdCxsYyl7cmV0dXJuIHMucGVuZGluZ19idWZbcy5kX2J1ZisyKnMubGFzdF9saXRdPWRpc3Q+Pj44JjI1NSxzLnBlbmRpbmdfYnVmW3MuZF9idWYrMipzLmxhc3RfbGl0KzFdPTI1NSZkaXN0LHMucGVuZGluZ19idWZbcy5sX2J1ZitzLmxhc3RfbGl0XT0yNTUmbGMscy5sYXN0X2xpdCsrLDA9PT1kaXN0P3MuZHluX2x0cmVlWzIqbGNdKys6KHMubWF0Y2hlcysrLGRpc3QtLSxzLmR5bl9sdHJlZVsyKihfbGVuZ3RoX2NvZGVbbGNdKzI1NisxKV0rKyxzLmR5bl9kdHJlZVsyKmRfY29kZShkaXN0KV0rKykscy5sYXN0X2xpdD09PXMubGl0X2J1ZnNpemUtMX0sZXhwb3J0cy5fdHJfYWxpZ249ZnVuY3Rpb24gX3RyX2FsaWduKHMpe3NlbmRfYml0cyhzLDIsMyksc2VuZF9jb2RlKHMsMjU2LHN0YXRpY19sdHJlZSksZnVuY3Rpb24gYmlfZmx1c2gocyl7MTY9PT1zLmJpX3ZhbGlkPyhwdXRfc2hvcnQocyxzLmJpX2J1Zikscy5iaV9idWY9MCxzLmJpX3ZhbGlkPTApOnMuYmlfdmFsaWQ+PTgmJihzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXT0yNTUmcy5iaV9idWYscy5iaV9idWY+Pj04LHMuYmlfdmFsaWQtPTgpfShzKX19LCIuLi8uLi9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi96c3RyZWFtLmpzIihtb2R1bGUpeyJ1c2Ugc3RyaWN0Ijttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbiBaU3RyZWFtKCl7dGhpcy5pbnB1dD1udWxsLHRoaXMubmV4dF9pbj0wLHRoaXMuYXZhaWxfaW49MCx0aGlzLnRvdGFsX2luPTAsdGhpcy5vdXRwdXQ9bnVsbCx0aGlzLm5leHRfb3V0PTAsdGhpcy5hdmFpbF9vdXQ9MCx0aGlzLnRvdGFsX291dD0wLHRoaXMubXNnPSIiLHRoaXMuc3RhdGU9bnVsbCx0aGlzLmRhdGFfdHlwZT0yLHRoaXMuYWRsZXI9MH19LCIuLi8uLi9ub2RlX21vZHVsZXMvcGFyc2UtYXNuMS9hc24xLmpzIihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgYXNuMT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYXNuMS5qcy9saWIvYXNuMS5qcyIpO2V4cG9ydHMuY2VydGlmaWNhdGU9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3BhcnNlLWFzbjEvY2VydGlmaWNhdGUuanMiKTt2YXIgUlNBUHJpdmF0ZUtleT1hc24xLmRlZmluZSgiUlNBUHJpdmF0ZUtleSIsZnVuY3Rpb24oKXt0aGlzLnNlcSgpLm9iaih0aGlzLmtleSgidmVyc2lvbiIpLmludCgpLHRoaXMua2V5KCJtb2R1bHVzIikuaW50KCksdGhpcy5rZXkoInB1YmxpY0V4cG9uZW50IikuaW50KCksdGhpcy5rZXkoInByaXZhdGVFeHBvbmVudCIpLmludCgpLHRoaXMua2V5KCJwcmltZTEiKS5pbnQoKSx0aGlzLmtleSgicHJpbWUyIikuaW50KCksdGhpcy5rZXkoImV4cG9uZW50MSIpLmludCgpLHRoaXMua2V5KCJleHBvbmVudDIiKS5pbnQoKSx0aGlzLmtleSgiY29lZmZpY2llbnQiKS5pbnQoKSl9KTtleHBvcnRzLlJTQVByaXZhdGVLZXk9UlNBUHJpdmF0ZUtleTt2YXIgUlNBUHVibGljS2V5PWFzbjEuZGVmaW5lKCJSU0FQdWJsaWNLZXkiLGZ1bmN0aW9uKCl7dGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoIm1vZHVsdXMiKS5pbnQoKSx0aGlzLmtleSgicHVibGljRXhwb25lbnQiKS5pbnQoKSl9KTtleHBvcnRzLlJTQVB1YmxpY0tleT1SU0FQdWJsaWNLZXk7dmFyIEFsZ29yaXRobUlkZW50aWZpZXI9YXNuMS5kZWZpbmUoIkFsZ29yaXRobUlkZW50aWZpZXIiLGZ1bmN0aW9uKCl7dGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoImFsZ29yaXRobSIpLm9iamlkKCksdGhpcy5rZXkoIm5vbmUiKS5udWxsXygpLm9wdGlvbmFsKCksdGhpcy5rZXkoImN1cnZlIikub2JqaWQoKS5vcHRpb25hbCgpLHRoaXMua2V5KCJwYXJhbXMiKS5zZXEoKS5vYmoodGhpcy5rZXkoInAiKS5pbnQoKSx0aGlzLmtleSgicSIpLmludCgpLHRoaXMua2V5KCJnIikuaW50KCkpLm9wdGlvbmFsKCkpfSksUHVibGljS2V5PWFzbjEuZGVmaW5lKCJTdWJqZWN0UHVibGljS2V5SW5mbyIsZnVuY3Rpb24oKXt0aGlzLnNlcSgpLm9iaih0aGlzLmtleSgiYWxnb3JpdGhtIikudXNlKEFsZ29yaXRobUlkZW50aWZpZXIpLHRoaXMua2V5KCJzdWJqZWN0UHVibGljS2V5IikuYml0c3RyKCkpfSk7ZXhwb3J0cy5QdWJsaWNLZXk9UHVibGljS2V5O3ZhciBQcml2YXRlS2V5SW5mbz1hc24xLmRlZmluZSgiUHJpdmF0ZUtleUluZm8iLGZ1bmN0aW9uKCl7dGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoInZlcnNpb24iKS5pbnQoKSx0aGlzLmtleSgiYWxnb3JpdGhtIikudXNlKEFsZ29yaXRobUlkZW50aWZpZXIpLHRoaXMua2V5KCJzdWJqZWN0UHJpdmF0ZUtleSIpLm9jdHN0cigpKX0pO2V4cG9ydHMuUHJpdmF0ZUtleT1Qcml2YXRlS2V5SW5mbzt2YXIgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm89YXNuMS5kZWZpbmUoIkVuY3J5cHRlZFByaXZhdGVLZXlJbmZvIixmdW5jdGlvbigpe3RoaXMuc2VxKCkub2JqKHRoaXMua2V5KCJhbGdvcml0aG0iKS5zZXEoKS5vYmoodGhpcy5rZXkoImlkIikub2JqaWQoKSx0aGlzLmtleSgiZGVjcnlwdCIpLnNlcSgpLm9iaih0aGlzLmtleSgia2RlIikuc2VxKCkub2JqKHRoaXMua2V5KCJpZCIpLm9iamlkKCksdGhpcy5rZXkoImtkZXBhcmFtcyIpLnNlcSgpLm9iaih0aGlzLmtleSgic2FsdCIpLm9jdHN0cigpLHRoaXMua2V5KCJpdGVycyIpLmludCgpKSksdGhpcy5rZXkoImNpcGhlciIpLnNlcSgpLm9iaih0aGlzLmtleSgiYWxnbyIpLm9iamlkKCksdGhpcy5rZXkoIml2Iikub2N0c3RyKCkpKSksdGhpcy5rZXkoInN1YmplY3RQcml2YXRlS2V5Iikub2N0c3RyKCkpfSk7ZXhwb3J0cy5FbmNyeXB0ZWRQcml2YXRlS2V5PUVuY3J5cHRlZFByaXZhdGVLZXlJbmZvO3ZhciBEU0FQcml2YXRlS2V5PWFzbjEuZGVmaW5lKCJEU0FQcml2YXRlS2V5IixmdW5jdGlvbigpe3RoaXMuc2VxKCkub2JqKHRoaXMua2V5KCJ2ZXJzaW9uIikuaW50KCksdGhpcy5rZXkoInAiKS5pbnQoKSx0aGlzLmtleSgicSIpLmludCgpLHRoaXMua2V5KCJnIikuaW50KCksdGhpcy5rZXkoInB1Yl9rZXkiKS5pbnQoKSx0aGlzLmtleSgicHJpdl9rZXkiKS5pbnQoKSl9KTtleHBvcnRzLkRTQVByaXZhdGVLZXk9RFNBUHJpdmF0ZUtleSxleHBvcnRzLkRTQXBhcmFtPWFzbjEuZGVmaW5lKCJEU0FwYXJhbSIsZnVuY3Rpb24oKXt0aGlzLmludCgpfSk7dmFyIEVDUGFyYW1ldGVycz1hc24xLmRlZmluZSgiRUNQYXJhbWV0ZXJzIixmdW5jdGlvbigpe3RoaXMuY2hvaWNlKHtuYW1lZEN1cnZlOnRoaXMub2JqaWQoKX0pfSksRUNQcml2YXRlS2V5PWFzbjEuZGVmaW5lKCJFQ1ByaXZhdGVLZXkiLGZ1bmN0aW9uKCl7dGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoInZlcnNpb24iKS5pbnQoKSx0aGlzLmtleSgicHJpdmF0ZUtleSIpLm9jdHN0cigpLHRoaXMua2V5KCJwYXJhbWV0ZXJzIikub3B0aW9uYWwoKS5leHBsaWNpdCgwKS51c2UoRUNQYXJhbWV0ZXJzKSx0aGlzLmtleSgicHVibGljS2V5Iikub3B0aW9uYWwoKS5leHBsaWNpdCgxKS5iaXRzdHIoKSl9KTtleHBvcnRzLkVDUHJpdmF0ZUtleT1FQ1ByaXZhdGVLZXksZXhwb3J0cy5zaWduYXR1cmU9YXNuMS5kZWZpbmUoInNpZ25hdHVyZSIsZnVuY3Rpb24oKXt0aGlzLnNlcSgpLm9iaih0aGlzLmtleSgiciIpLmludCgpLHRoaXMua2V5KCJzIikuaW50KCkpfSl9LCIuLi8uLi9ub2RlX21vZHVsZXMvcGFyc2UtYXNuMS9jZXJ0aWZpY2F0ZS5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIGFzbj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYXNuMS5qcy9saWIvYXNuMS5qcyIpLFRpbWU9YXNuLmRlZmluZSgiVGltZSIsZnVuY3Rpb24oKXt0aGlzLmNob2ljZSh7dXRjVGltZTp0aGlzLnV0Y3RpbWUoKSxnZW5lcmFsVGltZTp0aGlzLmdlbnRpbWUoKX0pfSksQXR0cmlidXRlVHlwZVZhbHVlPWFzbi5kZWZpbmUoIkF0dHJpYnV0ZVR5cGVWYWx1ZSIsZnVuY3Rpb24oKXt0aGlzLnNlcSgpLm9iaih0aGlzLmtleSgidHlwZSIpLm9iamlkKCksdGhpcy5rZXkoInZhbHVlIikuYW55KCkpfSksQWxnb3JpdGhtSWRlbnRpZmllcj1hc24uZGVmaW5lKCJBbGdvcml0aG1JZGVudGlmaWVyIixmdW5jdGlvbigpe3RoaXMuc2VxKCkub2JqKHRoaXMua2V5KCJhbGdvcml0aG0iKS5vYmppZCgpLHRoaXMua2V5KCJwYXJhbWV0ZXJzIikub3B0aW9uYWwoKSx0aGlzLmtleSgiY3VydmUiKS5vYmppZCgpLm9wdGlvbmFsKCkpfSksU3ViamVjdFB1YmxpY0tleUluZm89YXNuLmRlZmluZSgiU3ViamVjdFB1YmxpY0tleUluZm8iLGZ1bmN0aW9uKCl7dGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoImFsZ29yaXRobSIpLnVzZShBbGdvcml0aG1JZGVudGlmaWVyKSx0aGlzLmtleSgic3ViamVjdFB1YmxpY0tleSIpLmJpdHN0cigpKX0pLFJlbGF0aXZlRGlzdGluZ3Vpc2hlZE5hbWU9YXNuLmRlZmluZSgiUmVsYXRpdmVEaXN0aW5ndWlzaGVkTmFtZSIsZnVuY3Rpb24oKXt0aGlzLnNldG9mKEF0dHJpYnV0ZVR5cGVWYWx1ZSl9KSxSRE5TZXF1ZW5jZT1hc24uZGVmaW5lKCJSRE5TZXF1ZW5jZSIsZnVuY3Rpb24oKXt0aGlzLnNlcW9mKFJlbGF0aXZlRGlzdGluZ3Vpc2hlZE5hbWUpfSksTmFtZT1hc24uZGVmaW5lKCJOYW1lIixmdW5jdGlvbigpe3RoaXMuY2hvaWNlKHtyZG5TZXF1ZW5jZTp0aGlzLnVzZShSRE5TZXF1ZW5jZSl9KX0pLFZhbGlkaXR5PWFzbi5kZWZpbmUoIlZhbGlkaXR5IixmdW5jdGlvbigpe3RoaXMuc2VxKCkub2JqKHRoaXMua2V5KCJub3RCZWZvcmUiKS51c2UoVGltZSksdGhpcy5rZXkoIm5vdEFmdGVyIikudXNlKFRpbWUpKX0pLEV4dGVuc2lvbj1hc24uZGVmaW5lKCJFeHRlbnNpb24iLGZ1bmN0aW9uKCl7dGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoImV4dG5JRCIpLm9iamlkKCksdGhpcy5rZXkoImNyaXRpY2FsIikuYm9vbCgpLmRlZighMSksdGhpcy5rZXkoImV4dG5WYWx1ZSIpLm9jdHN0cigpKX0pLFRCU0NlcnRpZmljYXRlPWFzbi5kZWZpbmUoIlRCU0NlcnRpZmljYXRlIixmdW5jdGlvbigpe3RoaXMuc2VxKCkub2JqKHRoaXMua2V5KCJ2ZXJzaW9uIikuZXhwbGljaXQoMCkuaW50KCkub3B0aW9uYWwoKSx0aGlzLmtleSgic2VyaWFsTnVtYmVyIikuaW50KCksdGhpcy5rZXkoInNpZ25hdHVyZSIpLnVzZShBbGdvcml0aG1JZGVudGlmaWVyKSx0aGlzLmtleSgiaXNzdWVyIikudXNlKE5hbWUpLHRoaXMua2V5KCJ2YWxpZGl0eSIpLnVzZShWYWxpZGl0eSksdGhpcy5rZXkoInN1YmplY3QiKS51c2UoTmFtZSksdGhpcy5rZXkoInN1YmplY3RQdWJsaWNLZXlJbmZvIikudXNlKFN1YmplY3RQdWJsaWNLZXlJbmZvKSx0aGlzLmtleSgiaXNzdWVyVW5pcXVlSUQiKS5pbXBsaWNpdCgxKS5iaXRzdHIoKS5vcHRpb25hbCgpLHRoaXMua2V5KCJzdWJqZWN0VW5pcXVlSUQiKS5pbXBsaWNpdCgyKS5iaXRzdHIoKS5vcHRpb25hbCgpLHRoaXMua2V5KCJleHRlbnNpb25zIikuZXhwbGljaXQoMykuc2Vxb2YoRXh0ZW5zaW9uKS5vcHRpb25hbCgpKX0pLFg1MDlDZXJ0aWZpY2F0ZT1hc24uZGVmaW5lKCJYNTA5Q2VydGlmaWNhdGUiLGZ1bmN0aW9uKCl7dGhpcy5zZXEoKS5vYmoodGhpcy5rZXkoInRic0NlcnRpZmljYXRlIikudXNlKFRCU0NlcnRpZmljYXRlKSx0aGlzLmtleSgic2lnbmF0dXJlQWxnb3JpdGhtIikudXNlKEFsZ29yaXRobUlkZW50aWZpZXIpLHRoaXMua2V5KCJzaWduYXR1cmVWYWx1ZSIpLmJpdHN0cigpKX0pO21vZHVsZS5leHBvcnRzPVg1MDlDZXJ0aWZpY2F0ZX0sIi4uLy4uL25vZGVfbW9kdWxlcy9wYXJzZS1hc24xL2ZpeFByb2MuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBmaW5kUHJvYz0vUHJvYy1UeXBlOiA0LEVOQ1JZUFRFRFtcblxyXStERUstSW5mbzogQUVTLSgoPzoxMjgpfCg/OjE5Mil8KD86MjU2KSktQ0JDLChbMC05QS1IXSspW1xuXHJdKyhbMC05QS16XG5ccisvPV0rKVtcblxyXSsvbSxzdGFydFJlZ2V4PS9eLS0tLS1CRUdJTiAoKD86Lio/IEtFWSl8Q0VSVElGSUNBVEUpLS0tLS0vbSxmdWxsUmVnZXg9L14tLS0tLUJFR0lOICgoPzouKj8gS0VZKXxDRVJUSUZJQ0FURSktLS0tLShbMC05QS16XG5ccisvPV0rKS0tLS0tRU5EIFwxLS0tLS0kL20sZXZwPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9ldnBfYnl0ZXN0b2tleS9pbmRleC5qcyIpLGNpcGhlcnM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktYWVzL2Jyb3dzZXIuanMiKSxCdWZmZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3NhZmUtYnVmZmVyL2luZGV4LmpzIikuQnVmZmVyO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKG9rZXkscGFzc3dvcmQpe3ZhciBkZWNyeXB0ZWQsa2V5PW9rZXkudG9TdHJpbmcoKSxtYXRjaD1rZXkubWF0Y2goZmluZFByb2MpO2lmKG1hdGNoKXt2YXIgc3VpdGU9ImFlcyIrbWF0Y2hbMV0saXY9QnVmZmVyLmZyb20obWF0Y2hbMl0sImhleCIpLGNpcGhlclRleHQ9QnVmZmVyLmZyb20obWF0Y2hbM10ucmVwbGFjZSgvW1xyXG5dL2csIiIpLCJiYXNlNjQiKSxjaXBoZXJLZXk9ZXZwKHBhc3N3b3JkLGl2LnNsaWNlKDAsOCkscGFyc2VJbnQobWF0Y2hbMV0sMTApKS5rZXksb3V0PVtdLGNpcGhlcj1jaXBoZXJzLmNyZWF0ZURlY2lwaGVyaXYoc3VpdGUsY2lwaGVyS2V5LGl2KTtvdXQucHVzaChjaXBoZXIudXBkYXRlKGNpcGhlclRleHQpKSxvdXQucHVzaChjaXBoZXIuZmluYWwoKSksZGVjcnlwdGVkPUJ1ZmZlci5jb25jYXQob3V0KX1lbHNle3ZhciBtYXRjaDI9a2V5Lm1hdGNoKGZ1bGxSZWdleCk7ZGVjcnlwdGVkPUJ1ZmZlci5mcm9tKG1hdGNoMlsyXS5yZXBsYWNlKC9bXHJcbl0vZywiIiksImJhc2U2NCIpfXJldHVybnt0YWc6a2V5Lm1hdGNoKHN0YXJ0UmVnZXgpWzFdLGRhdGE6ZGVjcnlwdGVkfX19LCIuLi8uLi9ub2RlX21vZHVsZXMvcGFyc2UtYXNuMS9pbmRleC5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIGFzbjE9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3BhcnNlLWFzbjEvYXNuMS5qcyIpLGFlc2lkPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9wYXJzZS1hc24xL2Flc2lkLmpzb24iKSxmaXhQcm9jPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9wYXJzZS1hc24xL2ZpeFByb2MuanMiKSxjaXBoZXJzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LWFlcy9icm93c2VyLmpzIikscGJrZGYyU3luYz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvcGJrZGYyL2Jyb3dzZXIuanMiKS5wYmtkZjJTeW5jLEJ1ZmZlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc2FmZS1idWZmZXIvaW5kZXguanMiKS5CdWZmZXI7ZnVuY3Rpb24gcGFyc2VLZXlzKGJ1ZmZlcil7dmFyIHBhc3N3b3JkOyJvYmplY3QiIT10eXBlb2YgYnVmZmVyfHxCdWZmZXIuaXNCdWZmZXIoYnVmZmVyKXx8KHBhc3N3b3JkPWJ1ZmZlci5wYXNzcGhyYXNlLGJ1ZmZlcj1idWZmZXIua2V5KSwic3RyaW5nIj09dHlwZW9mIGJ1ZmZlciYmKGJ1ZmZlcj1CdWZmZXIuZnJvbShidWZmZXIpKTt2YXIgc3VidHlwZSxuZGF0YSxzdHJpcHBlZD1maXhQcm9jKGJ1ZmZlcixwYXNzd29yZCksdHlwZT1zdHJpcHBlZC50YWcsZGF0YT1zdHJpcHBlZC5kYXRhO3N3aXRjaCh0eXBlKXtjYXNlIkNFUlRJRklDQVRFIjpuZGF0YT1hc24xLmNlcnRpZmljYXRlLmRlY29kZShkYXRhLCJkZXIiKS50YnNDZXJ0aWZpY2F0ZS5zdWJqZWN0UHVibGljS2V5SW5mbztjYXNlIlBVQkxJQyBLRVkiOnN3aXRjaChuZGF0YXx8KG5kYXRhPWFzbjEuUHVibGljS2V5LmRlY29kZShkYXRhLCJkZXIiKSksc3VidHlwZT1uZGF0YS5hbGdvcml0aG0uYWxnb3JpdGhtLmpvaW4oIi4iKSl7Y2FzZSIxLjIuODQwLjExMzU0OS4xLjEuMSI6cmV0dXJuIGFzbjEuUlNBUHVibGljS2V5LmRlY29kZShuZGF0YS5zdWJqZWN0UHVibGljS2V5LmRhdGEsImRlciIpO2Nhc2UiMS4yLjg0MC4xMDA0NS4yLjEiOnJldHVybiBuZGF0YS5zdWJqZWN0UHJpdmF0ZUtleT1uZGF0YS5zdWJqZWN0UHVibGljS2V5LHt0eXBlOiJlYyIsZGF0YTpuZGF0YX07Y2FzZSIxLjIuODQwLjEwMDQwLjQuMSI6cmV0dXJuIG5kYXRhLmFsZ29yaXRobS5wYXJhbXMucHViX2tleT1hc24xLkRTQXBhcmFtLmRlY29kZShuZGF0YS5zdWJqZWN0UHVibGljS2V5LmRhdGEsImRlciIpLHt0eXBlOiJkc2EiLGRhdGE6bmRhdGEuYWxnb3JpdGhtLnBhcmFtc307ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoInVua25vd24ga2V5IGlkICIrc3VidHlwZSl9Y2FzZSJFTkNSWVBURUQgUFJJVkFURSBLRVkiOmRhdGE9ZnVuY3Rpb24gZGVjcnlwdChkYXRhLHBhc3N3b3JkKXt2YXIgc2FsdD1kYXRhLmFsZ29yaXRobS5kZWNyeXB0LmtkZS5rZGVwYXJhbXMuc2FsdCxpdGVycz1wYXJzZUludChkYXRhLmFsZ29yaXRobS5kZWNyeXB0LmtkZS5rZGVwYXJhbXMuaXRlcnMudG9TdHJpbmcoKSwxMCksYWxnbz1hZXNpZFtkYXRhLmFsZ29yaXRobS5kZWNyeXB0LmNpcGhlci5hbGdvLmpvaW4oIi4iKV0saXY9ZGF0YS5hbGdvcml0aG0uZGVjcnlwdC5jaXBoZXIuaXYsY2lwaGVyVGV4dD1kYXRhLnN1YmplY3RQcml2YXRlS2V5LGtleWxlbj1wYXJzZUludChhbGdvLnNwbGl0KCItIilbMV0sMTApLzgsa2V5PXBia2RmMlN5bmMocGFzc3dvcmQsc2FsdCxpdGVycyxrZXlsZW4sInNoYTEiKSxjaXBoZXI9Y2lwaGVycy5jcmVhdGVEZWNpcGhlcml2KGFsZ28sa2V5LGl2KSxvdXQ9W107cmV0dXJuIG91dC5wdXNoKGNpcGhlci51cGRhdGUoY2lwaGVyVGV4dCkpLG91dC5wdXNoKGNpcGhlci5maW5hbCgpKSxCdWZmZXIuY29uY2F0KG91dCl9KGRhdGE9YXNuMS5FbmNyeXB0ZWRQcml2YXRlS2V5LmRlY29kZShkYXRhLCJkZXIiKSxwYXNzd29yZCk7Y2FzZSJQUklWQVRFIEtFWSI6c3dpdGNoKHN1YnR5cGU9KG5kYXRhPWFzbjEuUHJpdmF0ZUtleS5kZWNvZGUoZGF0YSwiZGVyIikpLmFsZ29yaXRobS5hbGdvcml0aG0uam9pbigiLiIpKXtjYXNlIjEuMi44NDAuMTEzNTQ5LjEuMS4xIjpyZXR1cm4gYXNuMS5SU0FQcml2YXRlS2V5LmRlY29kZShuZGF0YS5zdWJqZWN0UHJpdmF0ZUtleSwiZGVyIik7Y2FzZSIxLjIuODQwLjEwMDQ1LjIuMSI6cmV0dXJue2N1cnZlOm5kYXRhLmFsZ29yaXRobS5jdXJ2ZSxwcml2YXRlS2V5OmFzbjEuRUNQcml2YXRlS2V5LmRlY29kZShuZGF0YS5zdWJqZWN0UHJpdmF0ZUtleSwiZGVyIikucHJpdmF0ZUtleX07Y2FzZSIxLjIuODQwLjEwMDQwLjQuMSI6cmV0dXJuIG5kYXRhLmFsZ29yaXRobS5wYXJhbXMucHJpdl9rZXk9YXNuMS5EU0FwYXJhbS5kZWNvZGUobmRhdGEuc3ViamVjdFByaXZhdGVLZXksImRlciIpLHt0eXBlOiJkc2EiLHBhcmFtczpuZGF0YS5hbGdvcml0aG0ucGFyYW1zfTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigidW5rbm93biBrZXkgaWQgIitzdWJ0eXBlKX1jYXNlIlJTQSBQVUJMSUMgS0VZIjpyZXR1cm4gYXNuMS5SU0FQdWJsaWNLZXkuZGVjb2RlKGRhdGEsImRlciIpO2Nhc2UiUlNBIFBSSVZBVEUgS0VZIjpyZXR1cm4gYXNuMS5SU0FQcml2YXRlS2V5LmRlY29kZShkYXRhLCJkZXIiKTtjYXNlIkRTQSBQUklWQVRFIEtFWSI6cmV0dXJue3R5cGU6ImRzYSIscGFyYW1zOmFzbjEuRFNBUHJpdmF0ZUtleS5kZWNvZGUoZGF0YSwiZGVyIil9O2Nhc2UiRUMgUFJJVkFURSBLRVkiOnJldHVybntjdXJ2ZTooZGF0YT1hc24xLkVDUHJpdmF0ZUtleS5kZWNvZGUoZGF0YSwiZGVyIikpLnBhcmFtZXRlcnMudmFsdWUscHJpdmF0ZUtleTpkYXRhLnByaXZhdGVLZXl9O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIGtleSB0eXBlICIrdHlwZSl9fXBhcnNlS2V5cy5zaWduYXR1cmU9YXNuMS5zaWduYXR1cmUsbW9kdWxlLmV4cG9ydHM9cGFyc2VLZXlzfSwiLi4vLi4vbm9kZV9tb2R1bGVzL3BhdGgtYnJvd3NlcmlmeS9pbmRleC5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIHByb2Nlc3M9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL25vZGUtc3RkbGliLWJyb3dzZXIvY2pzL3Byb3h5L3Byb2Nlc3MuanMiKTtmdW5jdGlvbiBhc3NlcnRQYXRoKHBhdGgpe2lmKCJzdHJpbmciIT10eXBlb2YgcGF0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJQYXRoIG11c3QgYmUgYSBzdHJpbmcuIFJlY2VpdmVkICIrSlNPTi5zdHJpbmdpZnkocGF0aCkpfWZ1bmN0aW9uIG5vcm1hbGl6ZVN0cmluZ1Bvc2l4KHBhdGgsYWxsb3dBYm92ZVJvb3Qpe2Zvcih2YXIgY29kZSxyZXM9IiIsbGFzdFNlZ21lbnRMZW5ndGg9MCxsYXN0U2xhc2g9LTEsZG90cz0wLGk9MDtpPD1wYXRoLmxlbmd0aDsrK2kpe2lmKGk8cGF0aC5sZW5ndGgpY29kZT1wYXRoLmNoYXJDb2RlQXQoaSk7ZWxzZXtpZig0Nz09PWNvZGUpYnJlYWs7Y29kZT00N31pZig0Nz09PWNvZGUpe2lmKGxhc3RTbGFzaD09PWktMXx8MT09PWRvdHMpO2Vsc2UgaWYobGFzdFNsYXNoIT09aS0xJiYyPT09ZG90cyl7aWYocmVzLmxlbmd0aDwyfHwyIT09bGFzdFNlZ21lbnRMZW5ndGh8fDQ2IT09cmVzLmNoYXJDb2RlQXQocmVzLmxlbmd0aC0xKXx8NDYhPT1yZXMuY2hhckNvZGVBdChyZXMubGVuZ3RoLTIpKWlmKHJlcy5sZW5ndGg+Mil7dmFyIGxhc3RTbGFzaEluZGV4PXJlcy5sYXN0SW5kZXhPZigiLyIpO2lmKGxhc3RTbGFzaEluZGV4IT09cmVzLmxlbmd0aC0xKXstMT09PWxhc3RTbGFzaEluZGV4PyhyZXM9IiIsbGFzdFNlZ21lbnRMZW5ndGg9MCk6bGFzdFNlZ21lbnRMZW5ndGg9KHJlcz1yZXMuc2xpY2UoMCxsYXN0U2xhc2hJbmRleCkpLmxlbmd0aC0xLXJlcy5sYXN0SW5kZXhPZigiLyIpLGxhc3RTbGFzaD1pLGRvdHM9MDtjb250aW51ZX19ZWxzZSBpZigyPT09cmVzLmxlbmd0aHx8MT09PXJlcy5sZW5ndGgpe3Jlcz0iIixsYXN0U2VnbWVudExlbmd0aD0wLGxhc3RTbGFzaD1pLGRvdHM9MDtjb250aW51ZX1hbGxvd0Fib3ZlUm9vdCYmKHJlcy5sZW5ndGg+MD9yZXMrPSIvLi4iOnJlcz0iLi4iLGxhc3RTZWdtZW50TGVuZ3RoPTIpfWVsc2UgcmVzLmxlbmd0aD4wP3Jlcys9Ii8iK3BhdGguc2xpY2UobGFzdFNsYXNoKzEsaSk6cmVzPXBhdGguc2xpY2UobGFzdFNsYXNoKzEsaSksbGFzdFNlZ21lbnRMZW5ndGg9aS1sYXN0U2xhc2gtMTtsYXN0U2xhc2g9aSxkb3RzPTB9ZWxzZSA0Nj09PWNvZGUmJi0xIT09ZG90cz8rK2RvdHM6ZG90cz0tMX1yZXR1cm4gcmVzfXZhciBwb3NpeD17cmVzb2x2ZTpmdW5jdGlvbiByZXNvbHZlKCl7Zm9yKHZhciBjd2QscmVzb2x2ZWRQYXRoPSIiLHJlc29sdmVkQWJzb2x1dGU9ITEsaT1hcmd1bWVudHMubGVuZ3RoLTE7aT49LTEmJiFyZXNvbHZlZEFic29sdXRlO2ktLSl7dmFyIHBhdGg7aT49MD9wYXRoPWFyZ3VtZW50c1tpXToodm9pZCAwPT09Y3dkJiYoY3dkPXByb2Nlc3MuY3dkKCkpLHBhdGg9Y3dkKSxhc3NlcnRQYXRoKHBhdGgpLDAhPT1wYXRoLmxlbmd0aCYmKHJlc29sdmVkUGF0aD1wYXRoKyIvIityZXNvbHZlZFBhdGgscmVzb2x2ZWRBYnNvbHV0ZT00Nz09PXBhdGguY2hhckNvZGVBdCgwKSl9cmV0dXJuIHJlc29sdmVkUGF0aD1ub3JtYWxpemVTdHJpbmdQb3NpeChyZXNvbHZlZFBhdGgsIXJlc29sdmVkQWJzb2x1dGUpLHJlc29sdmVkQWJzb2x1dGU/cmVzb2x2ZWRQYXRoLmxlbmd0aD4wPyIvIityZXNvbHZlZFBhdGg6Ii8iOnJlc29sdmVkUGF0aC5sZW5ndGg+MD9yZXNvbHZlZFBhdGg6Ii4ifSxub3JtYWxpemU6ZnVuY3Rpb24gbm9ybWFsaXplKHBhdGgpe2lmKGFzc2VydFBhdGgocGF0aCksMD09PXBhdGgubGVuZ3RoKXJldHVybiIuIjt2YXIgaXNBYnNvbHV0ZT00Nz09PXBhdGguY2hhckNvZGVBdCgwKSx0cmFpbGluZ1NlcGFyYXRvcj00Nz09PXBhdGguY2hhckNvZGVBdChwYXRoLmxlbmd0aC0xKTtyZXR1cm4gMCE9PShwYXRoPW5vcm1hbGl6ZVN0cmluZ1Bvc2l4KHBhdGgsIWlzQWJzb2x1dGUpKS5sZW5ndGh8fGlzQWJzb2x1dGV8fChwYXRoPSIuIikscGF0aC5sZW5ndGg+MCYmdHJhaWxpbmdTZXBhcmF0b3ImJihwYXRoKz0iLyIpLGlzQWJzb2x1dGU/Ii8iK3BhdGg6cGF0aH0saXNBYnNvbHV0ZTpmdW5jdGlvbiBpc0Fic29sdXRlKHBhdGgpe3JldHVybiBhc3NlcnRQYXRoKHBhdGgpLHBhdGgubGVuZ3RoPjAmJjQ3PT09cGF0aC5jaGFyQ29kZUF0KDApfSxqb2luOmZ1bmN0aW9uIGpvaW4oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4iLiI7Zm9yKHZhciBqb2luZWQsaT0wO2k8YXJndW1lbnRzLmxlbmd0aDsrK2kpe3ZhciBhcmc9YXJndW1lbnRzW2ldO2Fzc2VydFBhdGgoYXJnKSxhcmcubGVuZ3RoPjAmJih2b2lkIDA9PT1qb2luZWQ/am9pbmVkPWFyZzpqb2luZWQrPSIvIithcmcpfXJldHVybiB2b2lkIDA9PT1qb2luZWQ/Ii4iOnBvc2l4Lm5vcm1hbGl6ZShqb2luZWQpfSxyZWxhdGl2ZTpmdW5jdGlvbiByZWxhdGl2ZShmcm9tLHRvKXtpZihhc3NlcnRQYXRoKGZyb20pLGFzc2VydFBhdGgodG8pLGZyb209PT10bylyZXR1cm4iIjtpZigoZnJvbT1wb3NpeC5yZXNvbHZlKGZyb20pKT09PSh0bz1wb3NpeC5yZXNvbHZlKHRvKSkpcmV0dXJuIiI7Zm9yKHZhciBmcm9tU3RhcnQ9MTtmcm9tU3RhcnQ8ZnJvbS5sZW5ndGgmJjQ3PT09ZnJvbS5jaGFyQ29kZUF0KGZyb21TdGFydCk7Kytmcm9tU3RhcnQpO2Zvcih2YXIgZnJvbUVuZD1mcm9tLmxlbmd0aCxmcm9tTGVuPWZyb21FbmQtZnJvbVN0YXJ0LHRvU3RhcnQ9MTt0b1N0YXJ0PHRvLmxlbmd0aCYmNDc9PT10by5jaGFyQ29kZUF0KHRvU3RhcnQpOysrdG9TdGFydCk7Zm9yKHZhciB0b0xlbj10by5sZW5ndGgtdG9TdGFydCxsZW5ndGg9ZnJvbUxlbjx0b0xlbj9mcm9tTGVuOnRvTGVuLGxhc3RDb21tb25TZXA9LTEsaT0wO2k8PWxlbmd0aDsrK2kpe2lmKGk9PT1sZW5ndGgpe2lmKHRvTGVuPmxlbmd0aCl7aWYoNDc9PT10by5jaGFyQ29kZUF0KHRvU3RhcnQraSkpcmV0dXJuIHRvLnNsaWNlKHRvU3RhcnQraSsxKTtpZigwPT09aSlyZXR1cm4gdG8uc2xpY2UodG9TdGFydCtpKX1lbHNlIGZyb21MZW4+bGVuZ3RoJiYoNDc9PT1mcm9tLmNoYXJDb2RlQXQoZnJvbVN0YXJ0K2kpP2xhc3RDb21tb25TZXA9aTowPT09aSYmKGxhc3RDb21tb25TZXA9MCkpO2JyZWFrfXZhciBmcm9tQ29kZT1mcm9tLmNoYXJDb2RlQXQoZnJvbVN0YXJ0K2kpO2lmKGZyb21Db2RlIT09dG8uY2hhckNvZGVBdCh0b1N0YXJ0K2kpKWJyZWFrOzQ3PT09ZnJvbUNvZGUmJihsYXN0Q29tbW9uU2VwPWkpfXZhciBvdXQ9IiI7Zm9yKGk9ZnJvbVN0YXJ0K2xhc3RDb21tb25TZXArMTtpPD1mcm9tRW5kOysraSlpIT09ZnJvbUVuZCYmNDchPT1mcm9tLmNoYXJDb2RlQXQoaSl8fCgwPT09b3V0Lmxlbmd0aD9vdXQrPSIuLiI6b3V0Kz0iLy4uIik7cmV0dXJuIG91dC5sZW5ndGg+MD9vdXQrdG8uc2xpY2UodG9TdGFydCtsYXN0Q29tbW9uU2VwKToodG9TdGFydCs9bGFzdENvbW1vblNlcCw0Nz09PXRvLmNoYXJDb2RlQXQodG9TdGFydCkmJisrdG9TdGFydCx0by5zbGljZSh0b1N0YXJ0KSl9LF9tYWtlTG9uZzpmdW5jdGlvbiBfbWFrZUxvbmcocGF0aCl7cmV0dXJuIHBhdGh9LGRpcm5hbWU6ZnVuY3Rpb24gZGlybmFtZShwYXRoKXtpZihhc3NlcnRQYXRoKHBhdGgpLDA9PT1wYXRoLmxlbmd0aClyZXR1cm4iLiI7Zm9yKHZhciBjb2RlPXBhdGguY2hhckNvZGVBdCgwKSxoYXNSb290PTQ3PT09Y29kZSxlbmQ9LTEsbWF0Y2hlZFNsYXNoPSEwLGk9cGF0aC5sZW5ndGgtMTtpPj0xOy0taSlpZig0Nz09PShjb2RlPXBhdGguY2hhckNvZGVBdChpKSkpe2lmKCFtYXRjaGVkU2xhc2gpe2VuZD1pO2JyZWFrfX1lbHNlIG1hdGNoZWRTbGFzaD0hMTtyZXR1cm4tMT09PWVuZD9oYXNSb290PyIvIjoiLiI6aGFzUm9vdCYmMT09PWVuZD8iLy8iOnBhdGguc2xpY2UoMCxlbmQpfSxiYXNlbmFtZTpmdW5jdGlvbiBiYXNlbmFtZShwYXRoLGV4dCl7aWYodm9pZCAwIT09ZXh0JiYic3RyaW5nIiE9dHlwZW9mIGV4dCl0aHJvdyBuZXcgVHlwZUVycm9yKCciZXh0IiBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nJyk7YXNzZXJ0UGF0aChwYXRoKTt2YXIgaSxzdGFydD0wLGVuZD0tMSxtYXRjaGVkU2xhc2g9ITA7aWYodm9pZCAwIT09ZXh0JiZleHQubGVuZ3RoPjAmJmV4dC5sZW5ndGg8PXBhdGgubGVuZ3RoKXtpZihleHQubGVuZ3RoPT09cGF0aC5sZW5ndGgmJmV4dD09PXBhdGgpcmV0dXJuIiI7dmFyIGV4dElkeD1leHQubGVuZ3RoLTEsZmlyc3ROb25TbGFzaEVuZD0tMTtmb3IoaT1wYXRoLmxlbmd0aC0xO2k+PTA7LS1pKXt2YXIgY29kZT1wYXRoLmNoYXJDb2RlQXQoaSk7aWYoNDc9PT1jb2RlKXtpZighbWF0Y2hlZFNsYXNoKXtzdGFydD1pKzE7YnJlYWt9fWVsc2UtMT09PWZpcnN0Tm9uU2xhc2hFbmQmJihtYXRjaGVkU2xhc2g9ITEsZmlyc3ROb25TbGFzaEVuZD1pKzEpLGV4dElkeD49MCYmKGNvZGU9PT1leHQuY2hhckNvZGVBdChleHRJZHgpPy0xPT09LS1leHRJZHgmJihlbmQ9aSk6KGV4dElkeD0tMSxlbmQ9Zmlyc3ROb25TbGFzaEVuZCkpfXJldHVybiBzdGFydD09PWVuZD9lbmQ9Zmlyc3ROb25TbGFzaEVuZDotMT09PWVuZCYmKGVuZD1wYXRoLmxlbmd0aCkscGF0aC5zbGljZShzdGFydCxlbmQpfWZvcihpPXBhdGgubGVuZ3RoLTE7aT49MDstLWkpaWYoNDc9PT1wYXRoLmNoYXJDb2RlQXQoaSkpe2lmKCFtYXRjaGVkU2xhc2gpe3N0YXJ0PWkrMTticmVha319ZWxzZS0xPT09ZW5kJiYobWF0Y2hlZFNsYXNoPSExLGVuZD1pKzEpO3JldHVybi0xPT09ZW5kPyIiOnBhdGguc2xpY2Uoc3RhcnQsZW5kKX0sZXh0bmFtZTpmdW5jdGlvbiBleHRuYW1lKHBhdGgpe2Fzc2VydFBhdGgocGF0aCk7Zm9yKHZhciBzdGFydERvdD0tMSxzdGFydFBhcnQ9MCxlbmQ9LTEsbWF0Y2hlZFNsYXNoPSEwLHByZURvdFN0YXRlPTAsaT1wYXRoLmxlbmd0aC0xO2k+PTA7LS1pKXt2YXIgY29kZT1wYXRoLmNoYXJDb2RlQXQoaSk7aWYoNDchPT1jb2RlKS0xPT09ZW5kJiYobWF0Y2hlZFNsYXNoPSExLGVuZD1pKzEpLDQ2PT09Y29kZT8tMT09PXN0YXJ0RG90P3N0YXJ0RG90PWk6MSE9PXByZURvdFN0YXRlJiYocHJlRG90U3RhdGU9MSk6LTEhPT1zdGFydERvdCYmKHByZURvdFN0YXRlPS0xKTtlbHNlIGlmKCFtYXRjaGVkU2xhc2gpe3N0YXJ0UGFydD1pKzE7YnJlYWt9fXJldHVybi0xPT09c3RhcnREb3R8fC0xPT09ZW5kfHwwPT09cHJlRG90U3RhdGV8fDE9PT1wcmVEb3RTdGF0ZSYmc3RhcnREb3Q9PT1lbmQtMSYmc3RhcnREb3Q9PT1zdGFydFBhcnQrMT8iIjpwYXRoLnNsaWNlKHN0YXJ0RG90LGVuZCl9LGZvcm1hdDpmdW5jdGlvbiBmb3JtYXQocGF0aE9iamVjdCl7aWYobnVsbD09PXBhdGhPYmplY3R8fCJvYmplY3QiIT10eXBlb2YgcGF0aE9iamVjdCl0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgInBhdGhPYmplY3QiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2YgcGF0aE9iamVjdCk7cmV0dXJuIGZ1bmN0aW9uIF9mb3JtYXQoc2VwLHBhdGhPYmplY3Qpe3ZhciBkaXI9cGF0aE9iamVjdC5kaXJ8fHBhdGhPYmplY3Qucm9vdCxiYXNlPXBhdGhPYmplY3QuYmFzZXx8KHBhdGhPYmplY3QubmFtZXx8IiIpKyhwYXRoT2JqZWN0LmV4dHx8IiIpO3JldHVybiBkaXI/ZGlyPT09cGF0aE9iamVjdC5yb290P2RpcitiYXNlOmRpcitzZXArYmFzZTpiYXNlfSgiLyIscGF0aE9iamVjdCl9LHBhcnNlOmZ1bmN0aW9uIHBhcnNlKHBhdGgpe2Fzc2VydFBhdGgocGF0aCk7dmFyIHJldD17cm9vdDoiIixkaXI6IiIsYmFzZToiIixleHQ6IiIsbmFtZToiIn07aWYoMD09PXBhdGgubGVuZ3RoKXJldHVybiByZXQ7dmFyIHN0YXJ0LGNvZGU9cGF0aC5jaGFyQ29kZUF0KDApLGlzQWJzb2x1dGU9NDc9PT1jb2RlO2lzQWJzb2x1dGU/KHJldC5yb290PSIvIixzdGFydD0xKTpzdGFydD0wO2Zvcih2YXIgc3RhcnREb3Q9LTEsc3RhcnRQYXJ0PTAsZW5kPS0xLG1hdGNoZWRTbGFzaD0hMCxpPXBhdGgubGVuZ3RoLTEscHJlRG90U3RhdGU9MDtpPj1zdGFydDstLWkpaWYoNDchPT0oY29kZT1wYXRoLmNoYXJDb2RlQXQoaSkpKS0xPT09ZW5kJiYobWF0Y2hlZFNsYXNoPSExLGVuZD1pKzEpLDQ2PT09Y29kZT8tMT09PXN0YXJ0RG90P3N0YXJ0RG90PWk6MSE9PXByZURvdFN0YXRlJiYocHJlRG90U3RhdGU9MSk6LTEhPT1zdGFydERvdCYmKHByZURvdFN0YXRlPS0xKTtlbHNlIGlmKCFtYXRjaGVkU2xhc2gpe3N0YXJ0UGFydD1pKzE7YnJlYWt9cmV0dXJuLTE9PT1zdGFydERvdHx8LTE9PT1lbmR8fDA9PT1wcmVEb3RTdGF0ZXx8MT09PXByZURvdFN0YXRlJiZzdGFydERvdD09PWVuZC0xJiZzdGFydERvdD09PXN0YXJ0UGFydCsxPy0xIT09ZW5kJiYocmV0LmJhc2U9cmV0Lm5hbWU9MD09PXN0YXJ0UGFydCYmaXNBYnNvbHV0ZT9wYXRoLnNsaWNlKDEsZW5kKTpwYXRoLnNsaWNlKHN0YXJ0UGFydCxlbmQpKTooMD09PXN0YXJ0UGFydCYmaXNBYnNvbHV0ZT8ocmV0Lm5hbWU9cGF0aC5zbGljZSgxLHN0YXJ0RG90KSxyZXQuYmFzZT1wYXRoLnNsaWNlKDEsZW5kKSk6KHJldC5uYW1lPXBhdGguc2xpY2Uoc3RhcnRQYXJ0LHN0YXJ0RG90KSxyZXQuYmFzZT1wYXRoLnNsaWNlKHN0YXJ0UGFydCxlbmQpKSxyZXQuZXh0PXBhdGguc2xpY2Uoc3RhcnREb3QsZW5kKSksc3RhcnRQYXJ0PjA/cmV0LmRpcj1wYXRoLnNsaWNlKDAsc3RhcnRQYXJ0LTEpOmlzQWJzb2x1dGUmJihyZXQuZGlyPSIvIikscmV0fSxzZXA6Ii8iLGRlbGltaXRlcjoiOiIsd2luMzI6bnVsbCxwb3NpeDpudWxsfTtwb3NpeC5wb3NpeD1wb3NpeCxtb2R1bGUuZXhwb3J0cz1wb3NpeH0sIi4uLy4uL25vZGVfbW9kdWxlcy9wYmtkZjIvYnJvd3Nlci5qcyIoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7ZXhwb3J0cy5wYmtkZjI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3Bia2RmMi9saWIvYXN5bmMuanMiKSxleHBvcnRzLnBia2RmMlN5bmM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3Bia2RmMi9saWIvc3luYy1icm93c2VyLmpzIil9LCIuLi8uLi9ub2RlX21vZHVsZXMvcGJrZGYyL2xpYi9hc3luYy5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIFpFUk9fQlVGLG5leHRUaWNrLEJ1ZmZlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc2FmZS1idWZmZXIvaW5kZXguanMiKS5CdWZmZXIsY2hlY2tQYXJhbWV0ZXJzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9wYmtkZjIvbGliL3ByZWNvbmRpdGlvbi5qcyIpLGRlZmF1bHRFbmNvZGluZz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvcGJrZGYyL2xpYi9kZWZhdWx0LWVuY29kaW5nLmpzIiksc3luYz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvcGJrZGYyL2xpYi9zeW5jLWJyb3dzZXIuanMiKSx0b0J1ZmZlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvcGJrZGYyL2xpYi90by1idWZmZXIuanMiKSxzdWJ0bGU9X193ZWJwYWNrX3JlcXVpcmVfXy5nLmNyeXB0byYmX193ZWJwYWNrX3JlcXVpcmVfXy5nLmNyeXB0by5zdWJ0bGUsdG9Ccm93c2VyPXtzaGE6IlNIQS0xIiwic2hhLTEiOiJTSEEtMSIsc2hhMToiU0hBLTEiLHNoYTI1NjoiU0hBLTI1NiIsInNoYS0yNTYiOiJTSEEtMjU2IixzaGEzODQ6IlNIQS0zODQiLCJzaGEtMzg0IjoiU0hBLTM4NCIsInNoYS01MTIiOiJTSEEtNTEyIixzaGE1MTI6IlNIQS01MTIifSxjaGVja3M9W107ZnVuY3Rpb24gZ2V0TmV4dFRpY2soKXtyZXR1cm4gbmV4dFRpY2t8fChuZXh0VGljaz1fX3dlYnBhY2tfcmVxdWlyZV9fLmcucHJvY2VzcyYmX193ZWJwYWNrX3JlcXVpcmVfXy5nLnByb2Nlc3MubmV4dFRpY2s/X193ZWJwYWNrX3JlcXVpcmVfXy5nLnByb2Nlc3MubmV4dFRpY2s6X193ZWJwYWNrX3JlcXVpcmVfXy5nLnF1ZXVlTWljcm90YXNrP19fd2VicGFja19yZXF1aXJlX18uZy5xdWV1ZU1pY3JvdGFzazpfX3dlYnBhY2tfcmVxdWlyZV9fLmcuc2V0SW1tZWRpYXRlP19fd2VicGFja19yZXF1aXJlX18uZy5zZXRJbW1lZGlhdGU6X193ZWJwYWNrX3JlcXVpcmVfXy5nLnNldFRpbWVvdXQpfWZ1bmN0aW9uIGJyb3dzZXJQYmtkZjIocGFzc3dvcmQsc2FsdCxpdGVyYXRpb25zLGxlbmd0aCxhbGdvKXtyZXR1cm4gc3VidGxlLmltcG9ydEtleSgicmF3IixwYXNzd29yZCx7bmFtZToiUEJLREYyIn0sITEsWyJkZXJpdmVCaXRzIl0pLnRoZW4oZnVuY3Rpb24oa2V5KXtyZXR1cm4gc3VidGxlLmRlcml2ZUJpdHMoe25hbWU6IlBCS0RGMiIsc2FsdCxpdGVyYXRpb25zLGhhc2g6e25hbWU6YWxnb319LGtleSxsZW5ndGg8PDMpfSkudGhlbihmdW5jdGlvbihyZXMpe3JldHVybiBCdWZmZXIuZnJvbShyZXMpfSl9bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24ocGFzc3dvcmQsc2FsdCxpdGVyYXRpb25zLGtleWxlbixkaWdlc3QsY2FsbGJhY2spe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBkaWdlc3QmJihjYWxsYmFjaz1kaWdlc3QsZGlnZXN0PXZvaWQgMCksY2hlY2tQYXJhbWV0ZXJzKGl0ZXJhdGlvbnMsa2V5bGVuKSxwYXNzd29yZD10b0J1ZmZlcihwYXNzd29yZCxkZWZhdWx0RW5jb2RpbmcsIlBhc3N3b3JkIiksc2FsdD10b0J1ZmZlcihzYWx0LGRlZmF1bHRFbmNvZGluZywiU2FsdCIpLCJmdW5jdGlvbiIhPXR5cGVvZiBjYWxsYmFjayl0aHJvdyBuZXcgRXJyb3IoIk5vIGNhbGxiYWNrIHByb3ZpZGVkIHRvIHBia2RmMiIpO3ZhciBhbGdvPXRvQnJvd3NlclsoZGlnZXN0PWRpZ2VzdHx8InNoYTEiKS50b0xvd2VyQ2FzZSgpXTthbGdvJiYiZnVuY3Rpb24iPT10eXBlb2YgX193ZWJwYWNrX3JlcXVpcmVfXy5nLlByb21pc2U/ZnVuY3Rpb24gcmVzb2x2ZVByb21pc2UocHJvbWlzZSxjYWxsYmFjayl7cHJvbWlzZS50aGVuKGZ1bmN0aW9uKG91dCl7Z2V0TmV4dFRpY2soKShmdW5jdGlvbigpe2NhbGxiYWNrKG51bGwsb3V0KX0pfSxmdW5jdGlvbihlKXtnZXROZXh0VGljaygpKGZ1bmN0aW9uKCl7Y2FsbGJhY2soZSl9KX0pfShmdW5jdGlvbiBjaGVja05hdGl2ZShhbGdvKXtpZihfX3dlYnBhY2tfcmVxdWlyZV9fLmcucHJvY2VzcyYmIV9fd2VicGFja19yZXF1aXJlX18uZy5wcm9jZXNzLmJyb3dzZXIpcmV0dXJuIFByb21pc2UucmVzb2x2ZSghMSk7aWYoIXN1YnRsZXx8IXN1YnRsZS5pbXBvcnRLZXl8fCFzdWJ0bGUuZGVyaXZlQml0cylyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCExKTtpZih2b2lkIDAhPT1jaGVja3NbYWxnb10pcmV0dXJuIGNoZWNrc1thbGdvXTt2YXIgcHJvbT1icm93c2VyUGJrZGYyKFpFUk9fQlVGPVpFUk9fQlVGfHxCdWZmZXIuYWxsb2MoOCksWkVST19CVUYsMTAsMTI4LGFsZ28pLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4hMH0sZnVuY3Rpb24oKXtyZXR1cm4hMX0pO3JldHVybiBjaGVja3NbYWxnb109cHJvbSxwcm9tfShhbGdvKS50aGVuKGZ1bmN0aW9uKHJlc3Ape3JldHVybiByZXNwP2Jyb3dzZXJQYmtkZjIocGFzc3dvcmQsc2FsdCxpdGVyYXRpb25zLGtleWxlbixhbGdvKTpzeW5jKHBhc3N3b3JkLHNhbHQsaXRlcmF0aW9ucyxrZXlsZW4sZGlnZXN0KX0pLGNhbGxiYWNrKTpnZXROZXh0VGljaygpKGZ1bmN0aW9uKCl7dmFyIG91dDt0cnl7b3V0PXN5bmMocGFzc3dvcmQsc2FsdCxpdGVyYXRpb25zLGtleWxlbixkaWdlc3QpfWNhdGNoKGUpe3JldHVybiB2b2lkIGNhbGxiYWNrKGUpfWNhbGxiYWNrKG51bGwsb3V0KX0pfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9wYmtkZjIvbGliL2RlZmF1bHQtZW5jb2RpbmcuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBkZWZhdWx0RW5jb2RpbmcscHJvY2Vzcz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbm9kZS1zdGRsaWItYnJvd3Nlci9janMvcHJveHkvcHJvY2Vzcy5qcyIpO2lmKF9fd2VicGFja19yZXF1aXJlX18uZy5wcm9jZXNzJiZfX3dlYnBhY2tfcmVxdWlyZV9fLmcucHJvY2Vzcy5icm93c2VyKWRlZmF1bHRFbmNvZGluZz0idXRmLTgiO2Vsc2UgaWYoX193ZWJwYWNrX3JlcXVpcmVfXy5nLnByb2Nlc3MmJl9fd2VicGFja19yZXF1aXJlX18uZy5wcm9jZXNzLnZlcnNpb24pe2RlZmF1bHRFbmNvZGluZz1wYXJzZUludChwcm9jZXNzLnZlcnNpb24uc3BsaXQoIi4iKVswXS5zbGljZSgxKSwxMCk+PTY/InV0Zi04IjoiYmluYXJ5In1lbHNlIGRlZmF1bHRFbmNvZGluZz0idXRmLTgiO21vZHVsZS5leHBvcnRzPWRlZmF1bHRFbmNvZGluZ30sIi4uLy4uL25vZGVfbW9kdWxlcy9wYmtkZjIvbGliL3ByZWNvbmRpdGlvbi5qcyIobW9kdWxlKXsidXNlIHN0cmljdCI7dmFyICRpc0Zpbml0ZT1pc0Zpbml0ZSxNQVhfQUxMT0M9TWF0aC5wb3coMiwzMCktMTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihpdGVyYXRpb25zLGtleWxlbil7aWYoIm51bWJlciIhPXR5cGVvZiBpdGVyYXRpb25zKXRocm93IG5ldyBUeXBlRXJyb3IoIkl0ZXJhdGlvbnMgbm90IGEgbnVtYmVyIik7aWYoaXRlcmF0aW9uczwwfHwhJGlzRmluaXRlKGl0ZXJhdGlvbnMpKXRocm93IG5ldyBUeXBlRXJyb3IoIkJhZCBpdGVyYXRpb25zIik7aWYoIm51bWJlciIhPXR5cGVvZiBrZXlsZW4pdGhyb3cgbmV3IFR5cGVFcnJvcigiS2V5IGxlbmd0aCBub3QgYSBudW1iZXIiKTtpZihrZXlsZW48MHx8a2V5bGVuPk1BWF9BTExPQ3x8a2V5bGVuIT1rZXlsZW4pdGhyb3cgbmV3IFR5cGVFcnJvcigiQmFkIGtleSBsZW5ndGgiKX19LCIuLi8uLi9ub2RlX21vZHVsZXMvcGJrZGYyL2xpYi9zeW5jLWJyb3dzZXIuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBtZDU9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2NyZWF0ZS1oYXNoL21kNS5qcyIpLFJJUEVNRDE2MD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvcmlwZW1kMTYwL2luZGV4LmpzIiksc2hhPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zaGEuanMvaW5kZXguanMiKSxCdWZmZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3NhZmUtYnVmZmVyL2luZGV4LmpzIikuQnVmZmVyLGNoZWNrUGFyYW1ldGVycz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvcGJrZGYyL2xpYi9wcmVjb25kaXRpb24uanMiKSxkZWZhdWx0RW5jb2Rpbmc9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3Bia2RmMi9saWIvZGVmYXVsdC1lbmNvZGluZy5qcyIpLHRvQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9wYmtkZjIvbGliL3RvLWJ1ZmZlci5qcyIpLFpFUk9TPUJ1ZmZlci5hbGxvYygxMjgpLHNpemVzPXtfX3Byb3RvX186bnVsbCxtZDU6MTYsc2hhMToyMCxzaGEyMjQ6Mjgsc2hhMjU2OjMyLHNoYTM4NDo0OCxzaGE1MTI6NjQsInNoYTUxMi0yNTYiOjMyLHJpcGVtZDE2MDoyMCxybWQxNjA6MjB9LG1hcHBpbmc9e19fcHJvdG9fXzpudWxsLCJzaGEtMSI6InNoYTEiLCJzaGEtMjI0Ijoic2hhMjI0Iiwic2hhLTI1NiI6InNoYTI1NiIsInNoYS0zODQiOiJzaGEzODQiLCJzaGEtNTEyIjoic2hhNTEyIiwicmlwZW1kLTE2MCI6InJpcGVtZDE2MCJ9O2Z1bmN0aW9uIHJtZDE2MEZ1bmMoZGF0YSl7cmV0dXJuKG5ldyBSSVBFTUQxNjApLnVwZGF0ZShkYXRhKS5kaWdlc3QoKX1mdW5jdGlvbiBIbWFjKGFsZyxrZXksc2FsdExlbil7dmFyIGhhc2g9ZnVuY3Rpb24gZ2V0RGlnZXN0KGFsZyl7cmV0dXJuInJtZDE2MCI9PT1hbGd8fCJyaXBlbWQxNjAiPT09YWxnP3JtZDE2MEZ1bmM6Im1kNSI9PT1hbGc/bWQ1OmZ1bmN0aW9uIHNoYUZ1bmMoZGF0YSl7cmV0dXJuIHNoYShhbGcpLnVwZGF0ZShkYXRhKS5kaWdlc3QoKX19KGFsZyksYmxvY2tzaXplPSJzaGE1MTIiPT09YWxnfHwic2hhMzg0Ij09PWFsZz8xMjg6NjQ7a2V5Lmxlbmd0aD5ibG9ja3NpemU/a2V5PWhhc2goa2V5KTprZXkubGVuZ3RoPGJsb2Nrc2l6ZSYmKGtleT1CdWZmZXIuY29uY2F0KFtrZXksWkVST1NdLGJsb2Nrc2l6ZSkpO2Zvcih2YXIgaXBhZD1CdWZmZXIuYWxsb2NVbnNhZmUoYmxvY2tzaXplK3NpemVzW2FsZ10pLG9wYWQ9QnVmZmVyLmFsbG9jVW5zYWZlKGJsb2Nrc2l6ZStzaXplc1thbGddKSxpPTA7aTxibG9ja3NpemU7aSsrKWlwYWRbaV09NTRea2V5W2ldLG9wYWRbaV09OTJea2V5W2ldO3ZhciBpcGFkMT1CdWZmZXIuYWxsb2NVbnNhZmUoYmxvY2tzaXplK3NhbHRMZW4rNCk7aXBhZC5jb3B5KGlwYWQxLDAsMCxibG9ja3NpemUpLHRoaXMuaXBhZDE9aXBhZDEsdGhpcy5pcGFkMj1pcGFkLHRoaXMub3BhZD1vcGFkLHRoaXMuYWxnPWFsZyx0aGlzLmJsb2Nrc2l6ZT1ibG9ja3NpemUsdGhpcy5oYXNoPWhhc2gsdGhpcy5zaXplPXNpemVzW2FsZ119SG1hYy5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKGRhdGEsaXBhZCl7cmV0dXJuIGRhdGEuY29weShpcGFkLHRoaXMuYmxvY2tzaXplKSx0aGlzLmhhc2goaXBhZCkuY29weSh0aGlzLm9wYWQsdGhpcy5ibG9ja3NpemUpLHRoaXMuaGFzaCh0aGlzLm9wYWQpfSxtb2R1bGUuZXhwb3J0cz1mdW5jdGlvbiBwYmtkZjIocGFzc3dvcmQsc2FsdCxpdGVyYXRpb25zLGtleWxlbixkaWdlc3Qpe2NoZWNrUGFyYW1ldGVycyhpdGVyYXRpb25zLGtleWxlbikscGFzc3dvcmQ9dG9CdWZmZXIocGFzc3dvcmQsZGVmYXVsdEVuY29kaW5nLCJQYXNzd29yZCIpLHNhbHQ9dG9CdWZmZXIoc2FsdCxkZWZhdWx0RW5jb2RpbmcsIlNhbHQiKTt2YXIgbG93ZXJEaWdlc3Q9KGRpZ2VzdHx8InNoYTEiKS50b0xvd2VyQ2FzZSgpLG1hcHBlZERpZ2VzdD1tYXBwaW5nW2xvd2VyRGlnZXN0XXx8bG93ZXJEaWdlc3Qsc2l6ZT1zaXplc1ttYXBwZWREaWdlc3RdO2lmKCJudW1iZXIiIT10eXBlb2Ygc2l6ZXx8IXNpemUpdGhyb3cgbmV3IFR5cGVFcnJvcigiRGlnZXN0IGFsZ29yaXRobSBub3Qgc3VwcG9ydGVkOiAiK2RpZ2VzdCk7dmFyIGhtYWM9bmV3IEhtYWMobWFwcGVkRGlnZXN0LHBhc3N3b3JkLHNhbHQubGVuZ3RoKSxESz1CdWZmZXIuYWxsb2NVbnNhZmUoa2V5bGVuKSxibG9jazE9QnVmZmVyLmFsbG9jVW5zYWZlKHNhbHQubGVuZ3RoKzQpO3NhbHQuY29weShibG9jazEsMCwwLHNhbHQubGVuZ3RoKTtmb3IodmFyIGRlc3RQb3M9MCxoTGVuPXNpemUsbD1NYXRoLmNlaWwoa2V5bGVuL2hMZW4pLGk9MTtpPD1sO2krKyl7YmxvY2sxLndyaXRlVUludDMyQkUoaSxzYWx0Lmxlbmd0aCk7Zm9yKHZhciBUPWhtYWMucnVuKGJsb2NrMSxobWFjLmlwYWQxKSxVPVQsaj0xO2o8aXRlcmF0aW9ucztqKyspe1U9aG1hYy5ydW4oVSxobWFjLmlwYWQyKTtmb3IodmFyIGs9MDtrPGhMZW47aysrKVRba11ePVVba119VC5jb3B5KERLLGRlc3RQb3MpLGRlc3RQb3MrPWhMZW59cmV0dXJuIERLfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9wYmtkZjIvbGliL3RvLWJ1ZmZlci5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIEJ1ZmZlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc2FmZS1idWZmZXIvaW5kZXguanMiKS5CdWZmZXIsdG9CdWZmZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3RvLWJ1ZmZlci9pbmRleC5qcyIpLHVzZVVpbnQ4QXJyYXk9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5LGlzVmlldz11c2VVaW50OEFycmF5JiYidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZBcnJheUJ1ZmZlci5pc1ZpZXc7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24odGhpbmcsZW5jb2RpbmcsbmFtZSl7aWYoInN0cmluZyI9PXR5cGVvZiB0aGluZ3x8QnVmZmVyLmlzQnVmZmVyKHRoaW5nKXx8dXNlVWludDhBcnJheSYmdGhpbmcgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxpc1ZpZXcmJmlzVmlldyh0aGluZykpcmV0dXJuIHRvQnVmZmVyKHRoaW5nLGVuY29kaW5nKTt0aHJvdyBuZXcgVHlwZUVycm9yKG5hbWUrIiBtdXN0IGJlIGEgc3RyaW5nLCBhIEJ1ZmZlciwgYSBVaW50OEFycmF5LCBvciBhIERhdGFWaWV3Iil9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3Bvc3NpYmxlLXR5cGVkLWFycmF5LW5hbWVzL2luZGV4LmpzIihtb2R1bGUpeyJ1c2Ugc3RyaWN0Ijttb2R1bGUuZXhwb3J0cz1bIkZsb2F0MTZBcnJheSIsIkZsb2F0MzJBcnJheSIsIkZsb2F0NjRBcnJheSIsIkludDhBcnJheSIsIkludDE2QXJyYXkiLCJJbnQzMkFycmF5IiwiVWludDhBcnJheSIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiVWludDE2QXJyYXkiLCJVaW50MzJBcnJheSIsIkJpZ0ludDY0QXJyYXkiLCJCaWdVaW50NjRBcnJheSJdfSwiLi4vLi4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MtbmV4dGljay1hcmdzL2luZGV4LmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgcHJvY2Vzcz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbm9kZS1zdGRsaWItYnJvd3Nlci9janMvcHJveHkvcHJvY2Vzcy5qcyIpO3ZvaWQgMD09PXByb2Nlc3N8fCFwcm9jZXNzLnZlcnNpb258fDA9PT1wcm9jZXNzLnZlcnNpb24uaW5kZXhPZigidjAuIil8fDA9PT1wcm9jZXNzLnZlcnNpb24uaW5kZXhPZigidjEuIikmJjAhPT1wcm9jZXNzLnZlcnNpb24uaW5kZXhPZigidjEuOC4iKT9tb2R1bGUuZXhwb3J0cz17bmV4dFRpY2s6ZnVuY3Rpb24gbmV4dFRpY2soZm4sYXJnMSxhcmcyLGFyZzMpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBmbil0aHJvdyBuZXcgVHlwZUVycm9yKCciY2FsbGJhY2siIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO3ZhciBhcmdzLGksbGVuPWFyZ3VtZW50cy5sZW5ndGg7c3dpdGNoKGxlbil7Y2FzZSAwOmNhc2UgMTpyZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmbik7Y2FzZSAyOnJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGlja09uZSgpe2ZuLmNhbGwobnVsbCxhcmcxKX0pO2Nhc2UgMzpyZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tUd28oKXtmbi5jYWxsKG51bGwsYXJnMSxhcmcyKX0pO2Nhc2UgNDpyZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tUaHJlZSgpe2ZuLmNhbGwobnVsbCxhcmcxLGFyZzIsYXJnMyl9KTtkZWZhdWx0OmZvcihhcmdzPW5ldyBBcnJheShsZW4tMSksaT0wO2k8YXJncy5sZW5ndGg7KWFyZ3NbaSsrXT1hcmd1bWVudHNbaV07cmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrKCl7Zm4uYXBwbHkobnVsbCxhcmdzKX0pfX19Om1vZHVsZS5leHBvcnRzPXByb2Nlc3N9LCIuLi8uLi9ub2RlX21vZHVsZXMvcHVibGljLWVuY3J5cHQvYnJvd3Nlci5qcyIoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXtleHBvcnRzLnB1YmxpY0VuY3J5cHQ9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3B1YmxpYy1lbmNyeXB0L3B1YmxpY0VuY3J5cHQuanMiKSxleHBvcnRzLnByaXZhdGVEZWNyeXB0PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9wdWJsaWMtZW5jcnlwdC9wcml2YXRlRGVjcnlwdC5qcyIpLGV4cG9ydHMucHJpdmF0ZUVuY3J5cHQ9ZnVuY3Rpb24gcHJpdmF0ZUVuY3J5cHQoa2V5LGJ1Zil7cmV0dXJuIGV4cG9ydHMucHVibGljRW5jcnlwdChrZXksYnVmLCEwKX0sZXhwb3J0cy5wdWJsaWNEZWNyeXB0PWZ1bmN0aW9uIHB1YmxpY0RlY3J5cHQoa2V5LGJ1Zil7cmV0dXJuIGV4cG9ydHMucHJpdmF0ZURlY3J5cHQoa2V5LGJ1ZiwhMCl9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3B1YmxpYy1lbmNyeXB0L21nZi5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXt2YXIgY3JlYXRlSGFzaD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvY3JlYXRlLWhhc2gvYnJvd3Nlci5qcyIpLEJ1ZmZlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc2FmZS1idWZmZXIvaW5kZXguanMiKS5CdWZmZXI7ZnVuY3Rpb24gaTJvcHMoYyl7dmFyIG91dD1CdWZmZXIuYWxsb2NVbnNhZmUoNCk7cmV0dXJuIG91dC53cml0ZVVJbnQzMkJFKGMsMCksb3V0fW1vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKHNlZWQsbGVuKXtmb3IodmFyIGMsdD1CdWZmZXIuYWxsb2MoMCksaT0wO3QubGVuZ3RoPGxlbjspYz1pMm9wcyhpKyspLHQ9QnVmZmVyLmNvbmNhdChbdCxjcmVhdGVIYXNoKCJzaGExIikudXBkYXRlKHNlZWQpLnVwZGF0ZShjKS5kaWdlc3QoKV0pO3JldHVybiB0LnNsaWNlKDAsbGVuKX19LCIuLi8uLi9ub2RlX21vZHVsZXMvcHVibGljLWVuY3J5cHQvcHJpdmF0ZURlY3J5cHQuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7dmFyIHBhcnNlS2V5cz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvcGFyc2UtYXNuMS9pbmRleC5qcyIpLG1nZj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvcHVibGljLWVuY3J5cHQvbWdmLmpzIikseG9yPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9wdWJsaWMtZW5jcnlwdC94b3IuanMiKSxCTj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYm4uanMvbGliL2JuLmpzIiksY3J0PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyaWZ5LXJzYS9pbmRleC5qcyIpLGNyZWF0ZUhhc2g9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2NyZWF0ZS1oYXNoL2Jyb3dzZXIuanMiKSx3aXRoUHVibGljPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9wdWJsaWMtZW5jcnlwdC93aXRoUHVibGljLmpzIiksQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcyIpLkJ1ZmZlcjttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbiBwcml2YXRlRGVjcnlwdChwcml2YXRlS2V5LGVuYyxyZXZlcnNlKXt2YXIgcGFkZGluZztwYWRkaW5nPXByaXZhdGVLZXkucGFkZGluZz9wcml2YXRlS2V5LnBhZGRpbmc6cmV2ZXJzZT8xOjQ7dmFyIG1zZyxrZXk9cGFyc2VLZXlzKHByaXZhdGVLZXkpLGs9a2V5Lm1vZHVsdXMuYnl0ZUxlbmd0aCgpO2lmKGVuYy5sZW5ndGg+a3x8bmV3IEJOKGVuYykuY21wKGtleS5tb2R1bHVzKT49MCl0aHJvdyBuZXcgRXJyb3IoImRlY3J5cHRpb24gZXJyb3IiKTttc2c9cmV2ZXJzZT93aXRoUHVibGljKG5ldyBCTihlbmMpLGtleSk6Y3J0KGVuYyxrZXkpO3ZhciB6QnVmZmVyPUJ1ZmZlci5hbGxvYyhrLW1zZy5sZW5ndGgpO2lmKG1zZz1CdWZmZXIuY29uY2F0KFt6QnVmZmVyLG1zZ10sayksND09PXBhZGRpbmcpcmV0dXJuIGZ1bmN0aW9uIG9hZXAoa2V5LG1zZyl7dmFyIGs9a2V5Lm1vZHVsdXMuYnl0ZUxlbmd0aCgpLGlIYXNoPWNyZWF0ZUhhc2goInNoYTEiKS51cGRhdGUoQnVmZmVyLmFsbG9jKDApKS5kaWdlc3QoKSxoTGVuPWlIYXNoLmxlbmd0aDtpZigwIT09bXNnWzBdKXRocm93IG5ldyBFcnJvcigiZGVjcnlwdGlvbiBlcnJvciIpO3ZhciBtYXNrZWRTZWVkPW1zZy5zbGljZSgxLGhMZW4rMSksbWFza2VkRGI9bXNnLnNsaWNlKGhMZW4rMSksc2VlZD14b3IobWFza2VkU2VlZCxtZ2YobWFza2VkRGIsaExlbikpLGRiPXhvcihtYXNrZWREYixtZ2Yoc2VlZCxrLWhMZW4tMSkpO2lmKGZ1bmN0aW9uIGNvbXBhcmUoYSxiKXthPUJ1ZmZlci5mcm9tKGEpLGI9QnVmZmVyLmZyb20oYik7dmFyIGRpZj0wLGxlbj1hLmxlbmd0aDthLmxlbmd0aCE9PWIubGVuZ3RoJiYoZGlmKyssbGVuPU1hdGgubWluKGEubGVuZ3RoLGIubGVuZ3RoKSk7dmFyIGk9LTE7Zm9yKDsrK2k8bGVuOylkaWYrPWFbaV1eYltpXTtyZXR1cm4gZGlmfShpSGFzaCxkYi5zbGljZSgwLGhMZW4pKSl0aHJvdyBuZXcgRXJyb3IoImRlY3J5cHRpb24gZXJyb3IiKTt2YXIgaT1oTGVuO2Zvcig7MD09PWRiW2ldOylpKys7aWYoMSE9PWRiW2krK10pdGhyb3cgbmV3IEVycm9yKCJkZWNyeXB0aW9uIGVycm9yIik7cmV0dXJuIGRiLnNsaWNlKGkpfShrZXksbXNnKTtpZigxPT09cGFkZGluZylyZXR1cm4gZnVuY3Rpb24gcGtjczEoa2V5LG1zZyxyZXZlcnNlKXt2YXIgcDE9bXNnLnNsaWNlKDAsMiksaT0yLHN0YXR1cz0wO2Zvcig7MCE9PW1zZ1tpKytdOylpZihpPj1tc2cubGVuZ3RoKXtzdGF0dXMrKzticmVha312YXIgcHM9bXNnLnNsaWNlKDIsaS0xKTsoIjAwMDIiIT09cDEudG9TdHJpbmcoImhleCIpJiYhcmV2ZXJzZXx8IjAwMDEiIT09cDEudG9TdHJpbmcoImhleCIpJiZyZXZlcnNlKSYmc3RhdHVzKys7cHMubGVuZ3RoPDgmJnN0YXR1cysrO2lmKHN0YXR1cyl0aHJvdyBuZXcgRXJyb3IoImRlY3J5cHRpb24gZXJyb3IiKTtyZXR1cm4gbXNnLnNsaWNlKGkpfSgwLG1zZyxyZXZlcnNlKTtpZigzPT09cGFkZGluZylyZXR1cm4gbXNnO3Rocm93IG5ldyBFcnJvcigidW5rbm93biBwYWRkaW5nIil9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3B1YmxpYy1lbmNyeXB0L3B1YmxpY0VuY3J5cHQuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7dmFyIHBhcnNlS2V5cz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvcGFyc2UtYXNuMS9pbmRleC5qcyIpLHJhbmRvbUJ5dGVzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9yYW5kb21ieXRlcy9icm93c2VyLmpzIiksY3JlYXRlSGFzaD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvY3JlYXRlLWhhc2gvYnJvd3Nlci5qcyIpLG1nZj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvcHVibGljLWVuY3J5cHQvbWdmLmpzIikseG9yPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9wdWJsaWMtZW5jcnlwdC94b3IuanMiKSxCTj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYm4uanMvbGliL2JuLmpzIiksd2l0aFB1YmxpYz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvcHVibGljLWVuY3J5cHQvd2l0aFB1YmxpYy5qcyIpLGNydD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1yc2EvaW5kZXguanMiKSxCdWZmZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3NhZmUtYnVmZmVyL2luZGV4LmpzIikuQnVmZmVyO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uIHB1YmxpY0VuY3J5cHQocHVibGljS2V5LG1zZyxyZXZlcnNlKXt2YXIgcGFkZGluZztwYWRkaW5nPXB1YmxpY0tleS5wYWRkaW5nP3B1YmxpY0tleS5wYWRkaW5nOnJldmVyc2U/MTo0O3ZhciBwYWRkZWRNc2csa2V5PXBhcnNlS2V5cyhwdWJsaWNLZXkpO2lmKDQ9PT1wYWRkaW5nKXBhZGRlZE1zZz1mdW5jdGlvbiBvYWVwKGtleSxtc2cpe3ZhciBrPWtleS5tb2R1bHVzLmJ5dGVMZW5ndGgoKSxtTGVuPW1zZy5sZW5ndGgsaUhhc2g9Y3JlYXRlSGFzaCgic2hhMSIpLnVwZGF0ZShCdWZmZXIuYWxsb2MoMCkpLmRpZ2VzdCgpLGhMZW49aUhhc2gubGVuZ3RoLGhMZW4yPTIqaExlbjtpZihtTGVuPmstaExlbjItMil0aHJvdyBuZXcgRXJyb3IoIm1lc3NhZ2UgdG9vIGxvbmciKTt2YXIgcHM9QnVmZmVyLmFsbG9jKGstbUxlbi1oTGVuMi0yKSxkYmxlbj1rLWhMZW4tMSxzZWVkPXJhbmRvbUJ5dGVzKGhMZW4pLG1hc2tlZERiPXhvcihCdWZmZXIuY29uY2F0KFtpSGFzaCxwcyxCdWZmZXIuYWxsb2MoMSwxKSxtc2ddLGRibGVuKSxtZ2Yoc2VlZCxkYmxlbikpLG1hc2tlZFNlZWQ9eG9yKHNlZWQsbWdmKG1hc2tlZERiLGhMZW4pKTtyZXR1cm4gbmV3IEJOKEJ1ZmZlci5jb25jYXQoW0J1ZmZlci5hbGxvYygxKSxtYXNrZWRTZWVkLG1hc2tlZERiXSxrKSl9KGtleSxtc2cpO2Vsc2UgaWYoMT09PXBhZGRpbmcpcGFkZGVkTXNnPWZ1bmN0aW9uIHBrY3MxKGtleSxtc2cscmV2ZXJzZSl7dmFyIHBzLG1MZW49bXNnLmxlbmd0aCxrPWtleS5tb2R1bHVzLmJ5dGVMZW5ndGgoKTtpZihtTGVuPmstMTEpdGhyb3cgbmV3IEVycm9yKCJtZXNzYWdlIHRvbyBsb25nIik7cHM9cmV2ZXJzZT9CdWZmZXIuYWxsb2Moay1tTGVuLTMsMjU1KTpmdW5jdGlvbiBub25aZXJvKGxlbil7dmFyIG51bSxvdXQ9QnVmZmVyLmFsbG9jVW5zYWZlKGxlbiksaT0wLGNhY2hlPXJhbmRvbUJ5dGVzKDIqbGVuKSxjdXI9MDtmb3IoO2k8bGVuOyljdXI9PT1jYWNoZS5sZW5ndGgmJihjYWNoZT1yYW5kb21CeXRlcygyKmxlbiksY3VyPTApLChudW09Y2FjaGVbY3VyKytdKSYmKG91dFtpKytdPW51bSk7cmV0dXJuIG91dH0oay1tTGVuLTMpO3JldHVybiBuZXcgQk4oQnVmZmVyLmNvbmNhdChbQnVmZmVyLmZyb20oWzAscmV2ZXJzZT8xOjJdKSxwcyxCdWZmZXIuYWxsb2MoMSksbXNnXSxrKSl9KGtleSxtc2cscmV2ZXJzZSk7ZWxzZXtpZigzIT09cGFkZGluZyl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gcGFkZGluZyIpO2lmKChwYWRkZWRNc2c9bmV3IEJOKG1zZykpLmNtcChrZXkubW9kdWx1cyk+PTApdGhyb3cgbmV3IEVycm9yKCJkYXRhIHRvbyBsb25nIGZvciBtb2R1bHVzIil9cmV0dXJuIHJldmVyc2U/Y3J0KHBhZGRlZE1zZyxrZXkpOndpdGhQdWJsaWMocGFkZGVkTXNnLGtleSl9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3B1YmxpYy1lbmNyeXB0L3dpdGhQdWJsaWMuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7dmFyIEJOPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9ibi5qcy9saWIvYm4uanMiKSxCdWZmZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3NhZmUtYnVmZmVyL2luZGV4LmpzIikuQnVmZmVyO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uIHdpdGhQdWJsaWMocGFkZGVkTXNnLGtleSl7cmV0dXJuIEJ1ZmZlci5mcm9tKHBhZGRlZE1zZy50b1JlZChCTi5tb250KGtleS5tb2R1bHVzKSkucmVkUG93KG5ldyBCTihrZXkucHVibGljRXhwb25lbnQpKS5mcm9tUmVkKCkudG9BcnJheSgpKX19LCIuLi8uLi9ub2RlX21vZHVsZXMvcHVibGljLWVuY3J5cHQveG9yLmpzIihtb2R1bGUpe21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uIHhvcihhLGIpe2Zvcih2YXIgbGVuPWEubGVuZ3RoLGk9LTE7KytpPGxlbjspYVtpXV49YltpXTtyZXR1cm4gYX19LCIuLi8uLi9ub2RlX21vZHVsZXMvcHVueWNvZGUvcHVueWNvZGUuanMiKG1vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pe3ZhciBfX1dFQlBBQ0tfQU1EX0RFRklORV9SRVNVTFRfXzttb2R1bGU9X193ZWJwYWNrX3JlcXVpcmVfXy5ubWQobW9kdWxlKSxmdW5jdGlvbigpe2V4cG9ydHMmJmV4cG9ydHMubm9kZVR5cGUsbW9kdWxlJiZtb2R1bGUubm9kZVR5cGU7dmFyIGZyZWVHbG9iYWw9Im9iamVjdCI9PXR5cGVvZiBfX3dlYnBhY2tfcmVxdWlyZV9fLmcmJl9fd2VicGFja19yZXF1aXJlX18uZztmcmVlR2xvYmFsLmdsb2JhbCE9PWZyZWVHbG9iYWwmJmZyZWVHbG9iYWwud2luZG93IT09ZnJlZUdsb2JhbCYmZnJlZUdsb2JhbC5zZWxmO3ZhciBwdW55Y29kZSxtYXhJbnQ9MjE0NzQ4MzY0NyxyZWdleFB1bnljb2RlPS9eeG4tLS8scmVnZXhOb25BU0NJST0vW15ceDIwLVx4N0VdLyxyZWdleFNlcGFyYXRvcnM9L1tceDJFXHUzMDAyXHVGRjBFXHVGRjYxXS9nLGVycm9ycz17b3ZlcmZsb3c6Ik92ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzIiwibm90LWJhc2ljIjoiSWxsZWdhbCBpbnB1dCA+PSAweDgwIChub3QgYSBiYXNpYyBjb2RlIHBvaW50KSIsImludmFsaWQtaW5wdXQiOiJJbnZhbGlkIGlucHV0In0sZmxvb3I9TWF0aC5mbG9vcixzdHJpbmdGcm9tQ2hhckNvZGU9U3RyaW5nLmZyb21DaGFyQ29kZTtmdW5jdGlvbiBlcnJvcih0eXBlKXt0aHJvdyBuZXcgUmFuZ2VFcnJvcihlcnJvcnNbdHlwZV0pfWZ1bmN0aW9uIG1hcChhcnJheSxmbil7Zm9yKHZhciBsZW5ndGg9YXJyYXkubGVuZ3RoLHJlc3VsdD1bXTtsZW5ndGgtLTspcmVzdWx0W2xlbmd0aF09Zm4oYXJyYXlbbGVuZ3RoXSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBtYXBEb21haW4oc3RyaW5nLGZuKXt2YXIgcGFydHM9c3RyaW5nLnNwbGl0KCJAIikscmVzdWx0PSIiO3JldHVybiBwYXJ0cy5sZW5ndGg+MSYmKHJlc3VsdD1wYXJ0c1swXSsiQCIsc3RyaW5nPXBhcnRzWzFdKSxyZXN1bHQrbWFwKChzdHJpbmc9c3RyaW5nLnJlcGxhY2UocmVnZXhTZXBhcmF0b3JzLCIuIikpLnNwbGl0KCIuIiksZm4pLmpvaW4oIi4iKX1mdW5jdGlvbiB1Y3MyZGVjb2RlKHN0cmluZyl7Zm9yKHZhciB2YWx1ZSxleHRyYSxvdXRwdXQ9W10sY291bnRlcj0wLGxlbmd0aD1zdHJpbmcubGVuZ3RoO2NvdW50ZXI8bGVuZ3RoOykodmFsdWU9c3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKSk+PTU1Mjk2JiZ2YWx1ZTw9NTYzMTkmJmNvdW50ZXI8bGVuZ3RoPzU2MzIwPT0oNjQ1MTImKGV4dHJhPXN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKykpKT9vdXRwdXQucHVzaCgoKDEwMjMmdmFsdWUpPDwxMCkrKDEwMjMmZXh0cmEpKzY1NTM2KToob3V0cHV0LnB1c2godmFsdWUpLGNvdW50ZXItLSk6b3V0cHV0LnB1c2godmFsdWUpO3JldHVybiBvdXRwdXR9ZnVuY3Rpb24gdWNzMmVuY29kZShhcnJheSl7cmV0dXJuIG1hcChhcnJheSxmdW5jdGlvbih2YWx1ZSl7dmFyIG91dHB1dD0iIjtyZXR1cm4gdmFsdWU+NjU1MzUmJihvdXRwdXQrPXN0cmluZ0Zyb21DaGFyQ29kZSgodmFsdWUtPTY1NTM2KT4+PjEwJjEwMjN8NTUyOTYpLHZhbHVlPTU2MzIwfDEwMjMmdmFsdWUpLG91dHB1dCs9c3RyaW5nRnJvbUNoYXJDb2RlKHZhbHVlKX0pLmpvaW4oIiIpfWZ1bmN0aW9uIGJhc2ljVG9EaWdpdChjb2RlUG9pbnQpe3JldHVybiBjb2RlUG9pbnQtNDg8MTA/Y29kZVBvaW50LTIyOmNvZGVQb2ludC02NTwyNj9jb2RlUG9pbnQtNjU6Y29kZVBvaW50LTk3PDI2P2NvZGVQb2ludC05NzozNn1mdW5jdGlvbiBkaWdpdFRvQmFzaWMoZGlnaXQsZmxhZyl7cmV0dXJuIGRpZ2l0KzIyKzc1KihkaWdpdDwyNiktKCgwIT1mbGFnKTw8NSl9ZnVuY3Rpb24gYWRhcHQoZGVsdGEsbnVtUG9pbnRzLGZpcnN0VGltZSl7dmFyIGs9MDtmb3IoZGVsdGE9Zmlyc3RUaW1lP2Zsb29yKGRlbHRhLzcwMCk6ZGVsdGE+PjEsZGVsdGErPWZsb29yKGRlbHRhL251bVBvaW50cyk7ZGVsdGE+NDU1O2srPTM2KWRlbHRhPWZsb29yKGRlbHRhLzM1KTtyZXR1cm4gZmxvb3IoayszNipkZWx0YS8oZGVsdGErMzgpKX1mdW5jdGlvbiBkZWNvZGUoaW5wdXQpe3ZhciBvdXQsYmFzaWMsaixpbmRleCxvbGRpLHcsayxkaWdpdCx0LGJhc2VNaW51c1Qsb3V0cHV0PVtdLGlucHV0TGVuZ3RoPWlucHV0Lmxlbmd0aCxpPTAsbj0xMjgsYmlhcz03Mjtmb3IoKGJhc2ljPWlucHV0Lmxhc3RJbmRleE9mKCItIikpPDAmJihiYXNpYz0wKSxqPTA7ajxiYXNpYzsrK2opaW5wdXQuY2hhckNvZGVBdChqKT49MTI4JiZlcnJvcigibm90LWJhc2ljIiksb3V0cHV0LnB1c2goaW5wdXQuY2hhckNvZGVBdChqKSk7Zm9yKGluZGV4PWJhc2ljPjA/YmFzaWMrMTowO2luZGV4PGlucHV0TGVuZ3RoOyl7Zm9yKG9sZGk9aSx3PTEsaz0zNjtpbmRleD49aW5wdXRMZW5ndGgmJmVycm9yKCJpbnZhbGlkLWlucHV0IiksKChkaWdpdD1iYXNpY1RvRGlnaXQoaW5wdXQuY2hhckNvZGVBdChpbmRleCsrKSkpPj0zNnx8ZGlnaXQ+Zmxvb3IoKG1heEludC1pKS93KSkmJmVycm9yKCJvdmVyZmxvdyIpLGkrPWRpZ2l0KncsIShkaWdpdDwodD1rPD1iaWFzPzE6az49YmlhcysyNj8yNjprLWJpYXMpKTtrKz0zNil3PmZsb29yKG1heEludC8oYmFzZU1pbnVzVD0zNi10KSkmJmVycm9yKCJvdmVyZmxvdyIpLHcqPWJhc2VNaW51c1Q7Ymlhcz1hZGFwdChpLW9sZGksb3V0PW91dHB1dC5sZW5ndGgrMSwwPT1vbGRpKSxmbG9vcihpL291dCk+bWF4SW50LW4mJmVycm9yKCJvdmVyZmxvdyIpLG4rPWZsb29yKGkvb3V0KSxpJT1vdXQsb3V0cHV0LnNwbGljZShpKyssMCxuKX1yZXR1cm4gdWNzMmVuY29kZShvdXRwdXQpfWZ1bmN0aW9uIGVuY29kZShpbnB1dCl7dmFyIG4sZGVsdGEsaGFuZGxlZENQQ291bnQsYmFzaWNMZW5ndGgsYmlhcyxqLG0scSxrLHQsY3VycmVudFZhbHVlLGlucHV0TGVuZ3RoLGhhbmRsZWRDUENvdW50UGx1c09uZSxiYXNlTWludXNULHFNaW51c1Qsb3V0cHV0PVtdO2ZvcihpbnB1dExlbmd0aD0oaW5wdXQ9dWNzMmRlY29kZShpbnB1dCkpLmxlbmd0aCxuPTEyOCxkZWx0YT0wLGJpYXM9NzIsaj0wO2o8aW5wdXRMZW5ndGg7KytqKShjdXJyZW50VmFsdWU9aW5wdXRbal0pPDEyOCYmb3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGN1cnJlbnRWYWx1ZSkpO2ZvcihoYW5kbGVkQ1BDb3VudD1iYXNpY0xlbmd0aD1vdXRwdXQubGVuZ3RoLGJhc2ljTGVuZ3RoJiZvdXRwdXQucHVzaCgiLSIpO2hhbmRsZWRDUENvdW50PGlucHV0TGVuZ3RoOyl7Zm9yKG09bWF4SW50LGo9MDtqPGlucHV0TGVuZ3RoOysraikoY3VycmVudFZhbHVlPWlucHV0W2pdKT49biYmY3VycmVudFZhbHVlPG0mJihtPWN1cnJlbnRWYWx1ZSk7Zm9yKG0tbj5mbG9vcigobWF4SW50LWRlbHRhKS8oaGFuZGxlZENQQ291bnRQbHVzT25lPWhhbmRsZWRDUENvdW50KzEpKSYmZXJyb3IoIm92ZXJmbG93IiksZGVsdGErPShtLW4pKmhhbmRsZWRDUENvdW50UGx1c09uZSxuPW0saj0wO2o8aW5wdXRMZW5ndGg7KytqKWlmKChjdXJyZW50VmFsdWU9aW5wdXRbal0pPG4mJisrZGVsdGE+bWF4SW50JiZlcnJvcigib3ZlcmZsb3ciKSxjdXJyZW50VmFsdWU9PW4pe2ZvcihxPWRlbHRhLGs9MzY7IShxPCh0PWs8PWJpYXM/MTprPj1iaWFzKzI2PzI2OmstYmlhcykpO2srPTM2KXFNaW51c1Q9cS10LGJhc2VNaW51c1Q9MzYtdCxvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHQrcU1pbnVzVCViYXNlTWludXNULDApKSkscT1mbG9vcihxTWludXNUL2Jhc2VNaW51c1QpO291dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWMocSwwKSkpLGJpYXM9YWRhcHQoZGVsdGEsaGFuZGxlZENQQ291bnRQbHVzT25lLGhhbmRsZWRDUENvdW50PT1iYXNpY0xlbmd0aCksZGVsdGE9MCwrK2hhbmRsZWRDUENvdW50fSsrZGVsdGEsKytufXJldHVybiBvdXRwdXQuam9pbigiIil9cHVueWNvZGU9e3ZlcnNpb246IjEuNC4xIix1Y3MyOntkZWNvZGU6dWNzMmRlY29kZSxlbmNvZGU6dWNzMmVuY29kZX0sZGVjb2RlLGVuY29kZSx0b0FTQ0lJOmZ1bmN0aW9uIHRvQVNDSUkoaW5wdXQpe3JldHVybiBtYXBEb21haW4oaW5wdXQsZnVuY3Rpb24oc3RyaW5nKXtyZXR1cm4gcmVnZXhOb25BU0NJSS50ZXN0KHN0cmluZyk/InhuLS0iK2VuY29kZShzdHJpbmcpOnN0cmluZ30pfSx0b1VuaWNvZGU6ZnVuY3Rpb24gdG9Vbmljb2RlKGlucHV0KXtyZXR1cm4gbWFwRG9tYWluKGlucHV0LGZ1bmN0aW9uKHN0cmluZyl7cmV0dXJuIHJlZ2V4UHVueWNvZGUudGVzdChzdHJpbmcpP2RlY29kZShzdHJpbmcuc2xpY2UoNCkudG9Mb3dlckNhc2UoKSk6c3RyaW5nfSl9fSx2b2lkIDA9PT0oX19XRUJQQUNLX0FNRF9ERUZJTkVfUkVTVUxUX189ZnVuY3Rpb24oKXtyZXR1cm4gcHVueWNvZGV9LmNhbGwoZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fLGV4cG9ydHMsbW9kdWxlKSl8fChtb2R1bGUuZXhwb3J0cz1fX1dFQlBBQ0tfQU1EX0RFRklORV9SRVNVTFRfXyl9KCl9LCIuLi8uLi9ub2RlX21vZHVsZXMvcXMvbGliL2Zvcm1hdHMuanMiKG1vZHVsZSl7InVzZSBzdHJpY3QiO3ZhciByZXBsYWNlPVN0cmluZy5wcm90b3R5cGUucmVwbGFjZSxwZXJjZW50VHdlbnRpZXM9LyUyMC9nLEZvcm1hdF9SRkMxNzM4PSJSRkMxNzM4IixGb3JtYXRfUkZDMzk4Nj0iUkZDMzk4NiI7bW9kdWxlLmV4cG9ydHM9e2RlZmF1bHQ6Rm9ybWF0X1JGQzM5ODYsZm9ybWF0dGVyczp7UkZDMTczODpmdW5jdGlvbih2YWx1ZSl7cmV0dXJuIHJlcGxhY2UuY2FsbCh2YWx1ZSxwZXJjZW50VHdlbnRpZXMsIisiKX0sUkZDMzk4NjpmdW5jdGlvbih2YWx1ZSl7cmV0dXJuIFN0cmluZyh2YWx1ZSl9fSxSRkMxNzM4OkZvcm1hdF9SRkMxNzM4LFJGQzM5ODY6Rm9ybWF0X1JGQzM5ODZ9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3FzL2xpYi9pbmRleC5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIHN0cmluZ2lmeT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvcXMvbGliL3N0cmluZ2lmeS5qcyIpLHBhcnNlPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9xcy9saWIvcGFyc2UuanMiKSxmb3JtYXRzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9xcy9saWIvZm9ybWF0cy5qcyIpO21vZHVsZS5leHBvcnRzPXtmb3JtYXRzLHBhcnNlLHN0cmluZ2lmeX19LCIuLi8uLi9ub2RlX21vZHVsZXMvcXMvbGliL3BhcnNlLmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgdXRpbHM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3FzL2xpYi91dGlscy5qcyIpLGhhcz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGlzQXJyYXk9QXJyYXkuaXNBcnJheSxkZWZhdWx0cz17YWxsb3dEb3RzOiExLGFsbG93RW1wdHlBcnJheXM6ITEsYWxsb3dQcm90b3R5cGVzOiExLGFsbG93U3BhcnNlOiExLGFycmF5TGltaXQ6MjAsY2hhcnNldDoidXRmLTgiLGNoYXJzZXRTZW50aW5lbDohMSxjb21tYTohMSxkZWNvZGVEb3RJbktleXM6ITEsZGVjb2Rlcjp1dGlscy5kZWNvZGUsZGVsaW1pdGVyOiImIixkZXB0aDo1LGR1cGxpY2F0ZXM6ImNvbWJpbmUiLGlnbm9yZVF1ZXJ5UHJlZml4OiExLGludGVycHJldE51bWVyaWNFbnRpdGllczohMSxwYXJhbWV0ZXJMaW1pdDoxZTMscGFyc2VBcnJheXM6ITAscGxhaW5PYmplY3RzOiExLHN0cmljdERlcHRoOiExLHN0cmljdE51bGxIYW5kbGluZzohMSx0aHJvd09uTGltaXRFeGNlZWRlZDohMX0saW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzPWZ1bmN0aW9uKHN0cil7cmV0dXJuIHN0ci5yZXBsYWNlKC8mIyhcZCspOy9nLGZ1bmN0aW9uKCQwLG51bWJlclN0cil7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQobnVtYmVyU3RyLDEwKSl9KX0scGFyc2VBcnJheVZhbHVlPWZ1bmN0aW9uKHZhbCxvcHRpb25zLGN1cnJlbnRBcnJheUxlbmd0aCl7aWYodmFsJiYic3RyaW5nIj09dHlwZW9mIHZhbCYmb3B0aW9ucy5jb21tYSYmdmFsLmluZGV4T2YoIiwiKT4tMSlyZXR1cm4gdmFsLnNwbGl0KCIsIik7aWYob3B0aW9ucy50aHJvd09uTGltaXRFeGNlZWRlZCYmY3VycmVudEFycmF5TGVuZ3RoPj1vcHRpb25zLmFycmF5TGltaXQpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkFycmF5IGxpbWl0IGV4Y2VlZGVkLiBPbmx5ICIrb3B0aW9ucy5hcnJheUxpbWl0KyIgZWxlbWVudCIrKDE9PT1vcHRpb25zLmFycmF5TGltaXQ/IiI6InMiKSsiIGFsbG93ZWQgaW4gYW4gYXJyYXkuIik7cmV0dXJuIHZhbH0scGFyc2VLZXlzPWZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmdLZXlzKGdpdmVuS2V5LHZhbCxvcHRpb25zLHZhbHVlc1BhcnNlZCl7aWYoZ2l2ZW5LZXkpe3ZhciBrZXlzPWZ1bmN0aW9uIHNwbGl0S2V5SW50b1NlZ21lbnRzKGdpdmVuS2V5LG9wdGlvbnMpe3ZhciBrZXk9b3B0aW9ucy5hbGxvd0RvdHM/Z2l2ZW5LZXkucmVwbGFjZSgvXC4oW14uW10rKS9nLCJbJDFdIik6Z2l2ZW5LZXk7aWYob3B0aW9ucy5kZXB0aDw9MCl7aWYoIW9wdGlvbnMucGxhaW5PYmplY3RzJiZoYXMuY2FsbChPYmplY3QucHJvdG90eXBlLGtleSkmJiFvcHRpb25zLmFsbG93UHJvdG90eXBlcylyZXR1cm47cmV0dXJuW2tleV19dmFyIGNoaWxkPS8oXFtbXltcXV0qXSkvZyxzZWdtZW50PS8oXFtbXltcXV0qXSkvLmV4ZWMoa2V5KSxwYXJlbnQ9c2VnbWVudD9rZXkuc2xpY2UoMCxzZWdtZW50LmluZGV4KTprZXksa2V5cz1bXTtpZihwYXJlbnQpe2lmKCFvcHRpb25zLnBsYWluT2JqZWN0cyYmaGFzLmNhbGwoT2JqZWN0LnByb3RvdHlwZSxwYXJlbnQpJiYhb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMpcmV0dXJuO2tleXNba2V5cy5sZW5ndGhdPXBhcmVudH1mb3IodmFyIGk9MDtudWxsIT09KHNlZ21lbnQ9Y2hpbGQuZXhlYyhrZXkpKSYmaTxvcHRpb25zLmRlcHRoOyl7aSs9MTt2YXIgc2VnbWVudENvbnRlbnQ9c2VnbWVudFsxXS5zbGljZSgxLC0xKTtpZighb3B0aW9ucy5wbGFpbk9iamVjdHMmJmhhcy5jYWxsKE9iamVjdC5wcm90b3R5cGUsc2VnbWVudENvbnRlbnQpJiYhb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMpcmV0dXJuO2tleXNba2V5cy5sZW5ndGhdPXNlZ21lbnRbMV19aWYoc2VnbWVudCl7aWYoITA9PT1vcHRpb25zLnN0cmljdERlcHRoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnB1dCBkZXB0aCBleGNlZWRlZCBkZXB0aCBvcHRpb24gb2YgIitvcHRpb25zLmRlcHRoKyIgYW5kIHN0cmljdERlcHRoIGlzIHRydWUiKTtrZXlzW2tleXMubGVuZ3RoXT0iWyIra2V5LnNsaWNlKHNlZ21lbnQuaW5kZXgpKyJdIn1yZXR1cm4ga2V5c30oZ2l2ZW5LZXksb3B0aW9ucyk7aWYoa2V5cylyZXR1cm4gZnVuY3Rpb24oY2hhaW4sdmFsLG9wdGlvbnMsdmFsdWVzUGFyc2VkKXt2YXIgY3VycmVudEFycmF5TGVuZ3RoPTA7aWYoY2hhaW4ubGVuZ3RoPjAmJiJbXSI9PT1jaGFpbltjaGFpbi5sZW5ndGgtMV0pe3ZhciBwYXJlbnRLZXk9Y2hhaW4uc2xpY2UoMCwtMSkuam9pbigiIik7Y3VycmVudEFycmF5TGVuZ3RoPUFycmF5LmlzQXJyYXkodmFsKSYmdmFsW3BhcmVudEtleV0/dmFsW3BhcmVudEtleV0ubGVuZ3RoOjB9Zm9yKHZhciBsZWFmPXZhbHVlc1BhcnNlZD92YWw6cGFyc2VBcnJheVZhbHVlKHZhbCxvcHRpb25zLGN1cnJlbnRBcnJheUxlbmd0aCksaT1jaGFpbi5sZW5ndGgtMTtpPj0wOy0taSl7dmFyIG9iaixyb290PWNoYWluW2ldO2lmKCJbXSI9PT1yb290JiZvcHRpb25zLnBhcnNlQXJyYXlzKW9iaj11dGlscy5pc092ZXJmbG93KGxlYWYpP2xlYWY6b3B0aW9ucy5hbGxvd0VtcHR5QXJyYXlzJiYoIiI9PT1sZWFmfHxvcHRpb25zLnN0cmljdE51bGxIYW5kbGluZyYmbnVsbD09PWxlYWYpP1tdOnV0aWxzLmNvbWJpbmUoW10sbGVhZixvcHRpb25zLmFycmF5TGltaXQsb3B0aW9ucy5wbGFpbk9iamVjdHMpO2Vsc2V7b2JqPW9wdGlvbnMucGxhaW5PYmplY3RzP3tfX3Byb3RvX186bnVsbH06e307dmFyIGNsZWFuUm9vdD0iWyI9PT1yb290LmNoYXJBdCgwKSYmIl0iPT09cm9vdC5jaGFyQXQocm9vdC5sZW5ndGgtMSk/cm9vdC5zbGljZSgxLC0xKTpyb290LGRlY29kZWRSb290PW9wdGlvbnMuZGVjb2RlRG90SW5LZXlzP2NsZWFuUm9vdC5yZXBsYWNlKC8lMkUvZywiLiIpOmNsZWFuUm9vdCxpbmRleD1wYXJzZUludChkZWNvZGVkUm9vdCwxMCksaXNWYWxpZEFycmF5SW5kZXg9IWlzTmFOKGluZGV4KSYmcm9vdCE9PWRlY29kZWRSb290JiZTdHJpbmcoaW5kZXgpPT09ZGVjb2RlZFJvb3QmJmluZGV4Pj0wJiZvcHRpb25zLnBhcnNlQXJyYXlzO2lmKG9wdGlvbnMucGFyc2VBcnJheXN8fCIiIT09ZGVjb2RlZFJvb3QpaWYoaXNWYWxpZEFycmF5SW5kZXgmJmluZGV4PG9wdGlvbnMuYXJyYXlMaW1pdCkob2JqPVtdKVtpbmRleF09bGVhZjtlbHNle2lmKGlzVmFsaWRBcnJheUluZGV4JiZvcHRpb25zLnRocm93T25MaW1pdEV4Y2VlZGVkKXRocm93IG5ldyBSYW5nZUVycm9yKCJBcnJheSBsaW1pdCBleGNlZWRlZC4gT25seSAiK29wdGlvbnMuYXJyYXlMaW1pdCsiIGVsZW1lbnQiKygxPT09b3B0aW9ucy5hcnJheUxpbWl0PyIiOiJzIikrIiBhbGxvd2VkIGluIGFuIGFycmF5LiIpO2lzVmFsaWRBcnJheUluZGV4PyhvYmpbaW5kZXhdPWxlYWYsdXRpbHMubWFya092ZXJmbG93KG9iaixpbmRleCkpOiJfX3Byb3RvX18iIT09ZGVjb2RlZFJvb3QmJihvYmpbZGVjb2RlZFJvb3RdPWxlYWYpfWVsc2Ugb2JqPXswOmxlYWZ9fWxlYWY9b2JqfXJldHVybiBsZWFmfShrZXlzLHZhbCxvcHRpb25zLHZhbHVlc1BhcnNlZCl9fTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihzdHIsb3B0cyl7dmFyIG9wdGlvbnM9ZnVuY3Rpb24gbm9ybWFsaXplUGFyc2VPcHRpb25zKG9wdHMpe2lmKCFvcHRzKXJldHVybiBkZWZhdWx0cztpZih2b2lkIDAhPT1vcHRzLmFsbG93RW1wdHlBcnJheXMmJiJib29sZWFuIiE9dHlwZW9mIG9wdHMuYWxsb3dFbXB0eUFycmF5cyl0aHJvdyBuZXcgVHlwZUVycm9yKCJgYWxsb3dFbXB0eUFycmF5c2Agb3B0aW9uIGNhbiBvbmx5IGJlIGB0cnVlYCBvciBgZmFsc2VgLCB3aGVuIHByb3ZpZGVkIik7aWYodm9pZCAwIT09b3B0cy5kZWNvZGVEb3RJbktleXMmJiJib29sZWFuIiE9dHlwZW9mIG9wdHMuZGVjb2RlRG90SW5LZXlzKXRocm93IG5ldyBUeXBlRXJyb3IoImBkZWNvZGVEb3RJbktleXNgIG9wdGlvbiBjYW4gb25seSBiZSBgdHJ1ZWAgb3IgYGZhbHNlYCwgd2hlbiBwcm92aWRlZCIpO2lmKG51bGwhPT1vcHRzLmRlY29kZXImJnZvaWQgMCE9PW9wdHMuZGVjb2RlciYmImZ1bmN0aW9uIiE9dHlwZW9mIG9wdHMuZGVjb2Rlcil0aHJvdyBuZXcgVHlwZUVycm9yKCJEZWNvZGVyIGhhcyB0byBiZSBhIGZ1bmN0aW9uLiIpO2lmKHZvaWQgMCE9PW9wdHMuY2hhcnNldCYmInV0Zi04IiE9PW9wdHMuY2hhcnNldCYmImlzby04ODU5LTEiIT09b3B0cy5jaGFyc2V0KXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBjaGFyc2V0IG9wdGlvbiBtdXN0IGJlIGVpdGhlciB1dGYtOCwgaXNvLTg4NTktMSwgb3IgdW5kZWZpbmVkIik7aWYodm9pZCAwIT09b3B0cy50aHJvd09uTGltaXRFeGNlZWRlZCYmImJvb2xlYW4iIT10eXBlb2Ygb3B0cy50aHJvd09uTGltaXRFeGNlZWRlZCl0aHJvdyBuZXcgVHlwZUVycm9yKCJgdGhyb3dPbkxpbWl0RXhjZWVkZWRgIG9wdGlvbiBtdXN0IGJlIGEgYm9vbGVhbiIpO3ZhciBjaGFyc2V0PXZvaWQgMD09PW9wdHMuY2hhcnNldD9kZWZhdWx0cy5jaGFyc2V0Om9wdHMuY2hhcnNldCxkdXBsaWNhdGVzPXZvaWQgMD09PW9wdHMuZHVwbGljYXRlcz9kZWZhdWx0cy5kdXBsaWNhdGVzOm9wdHMuZHVwbGljYXRlcztpZigiY29tYmluZSIhPT1kdXBsaWNhdGVzJiYiZmlyc3QiIT09ZHVwbGljYXRlcyYmImxhc3QiIT09ZHVwbGljYXRlcyl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgZHVwbGljYXRlcyBvcHRpb24gbXVzdCBiZSBlaXRoZXIgY29tYmluZSwgZmlyc3QsIG9yIGxhc3QiKTtyZXR1cm57YWxsb3dEb3RzOnZvaWQgMD09PW9wdHMuYWxsb3dEb3RzPyEwPT09b3B0cy5kZWNvZGVEb3RJbktleXN8fGRlZmF1bHRzLmFsbG93RG90czohIW9wdHMuYWxsb3dEb3RzLGFsbG93RW1wdHlBcnJheXM6ImJvb2xlYW4iPT10eXBlb2Ygb3B0cy5hbGxvd0VtcHR5QXJyYXlzPyEhb3B0cy5hbGxvd0VtcHR5QXJyYXlzOmRlZmF1bHRzLmFsbG93RW1wdHlBcnJheXMsYWxsb3dQcm90b3R5cGVzOiJib29sZWFuIj09dHlwZW9mIG9wdHMuYWxsb3dQcm90b3R5cGVzP29wdHMuYWxsb3dQcm90b3R5cGVzOmRlZmF1bHRzLmFsbG93UHJvdG90eXBlcyxhbGxvd1NwYXJzZToiYm9vbGVhbiI9PXR5cGVvZiBvcHRzLmFsbG93U3BhcnNlP29wdHMuYWxsb3dTcGFyc2U6ZGVmYXVsdHMuYWxsb3dTcGFyc2UsYXJyYXlMaW1pdDoibnVtYmVyIj09dHlwZW9mIG9wdHMuYXJyYXlMaW1pdD9vcHRzLmFycmF5TGltaXQ6ZGVmYXVsdHMuYXJyYXlMaW1pdCxjaGFyc2V0LGNoYXJzZXRTZW50aW5lbDoiYm9vbGVhbiI9PXR5cGVvZiBvcHRzLmNoYXJzZXRTZW50aW5lbD9vcHRzLmNoYXJzZXRTZW50aW5lbDpkZWZhdWx0cy5jaGFyc2V0U2VudGluZWwsY29tbWE6ImJvb2xlYW4iPT10eXBlb2Ygb3B0cy5jb21tYT9vcHRzLmNvbW1hOmRlZmF1bHRzLmNvbW1hLGRlY29kZURvdEluS2V5czoiYm9vbGVhbiI9PXR5cGVvZiBvcHRzLmRlY29kZURvdEluS2V5cz9vcHRzLmRlY29kZURvdEluS2V5czpkZWZhdWx0cy5kZWNvZGVEb3RJbktleXMsZGVjb2RlcjoiZnVuY3Rpb24iPT10eXBlb2Ygb3B0cy5kZWNvZGVyP29wdHMuZGVjb2RlcjpkZWZhdWx0cy5kZWNvZGVyLGRlbGltaXRlcjoic3RyaW5nIj09dHlwZW9mIG9wdHMuZGVsaW1pdGVyfHx1dGlscy5pc1JlZ0V4cChvcHRzLmRlbGltaXRlcik/b3B0cy5kZWxpbWl0ZXI6ZGVmYXVsdHMuZGVsaW1pdGVyLGRlcHRoOiJudW1iZXIiPT10eXBlb2Ygb3B0cy5kZXB0aHx8ITE9PT1vcHRzLmRlcHRoPytvcHRzLmRlcHRoOmRlZmF1bHRzLmRlcHRoLGR1cGxpY2F0ZXMsaWdub3JlUXVlcnlQcmVmaXg6ITA9PT1vcHRzLmlnbm9yZVF1ZXJ5UHJlZml4LGludGVycHJldE51bWVyaWNFbnRpdGllczoiYm9vbGVhbiI9PXR5cGVvZiBvcHRzLmludGVycHJldE51bWVyaWNFbnRpdGllcz9vcHRzLmludGVycHJldE51bWVyaWNFbnRpdGllczpkZWZhdWx0cy5pbnRlcnByZXROdW1lcmljRW50aXRpZXMscGFyYW1ldGVyTGltaXQ6Im51bWJlciI9PXR5cGVvZiBvcHRzLnBhcmFtZXRlckxpbWl0P29wdHMucGFyYW1ldGVyTGltaXQ6ZGVmYXVsdHMucGFyYW1ldGVyTGltaXQscGFyc2VBcnJheXM6ITEhPT1vcHRzLnBhcnNlQXJyYXlzLHBsYWluT2JqZWN0czoiYm9vbGVhbiI9PXR5cGVvZiBvcHRzLnBsYWluT2JqZWN0cz9vcHRzLnBsYWluT2JqZWN0czpkZWZhdWx0cy5wbGFpbk9iamVjdHMsc3RyaWN0RGVwdGg6ImJvb2xlYW4iPT10eXBlb2Ygb3B0cy5zdHJpY3REZXB0aD8hIW9wdHMuc3RyaWN0RGVwdGg6ZGVmYXVsdHMuc3RyaWN0RGVwdGgsc3RyaWN0TnVsbEhhbmRsaW5nOiJib29sZWFuIj09dHlwZW9mIG9wdHMuc3RyaWN0TnVsbEhhbmRsaW5nP29wdHMuc3RyaWN0TnVsbEhhbmRsaW5nOmRlZmF1bHRzLnN0cmljdE51bGxIYW5kbGluZyx0aHJvd09uTGltaXRFeGNlZWRlZDoiYm9vbGVhbiI9PXR5cGVvZiBvcHRzLnRocm93T25MaW1pdEV4Y2VlZGVkJiZvcHRzLnRocm93T25MaW1pdEV4Y2VlZGVkfX0ob3B0cyk7aWYoIiI9PT1zdHJ8fG51bGw9PXN0cilyZXR1cm4gb3B0aW9ucy5wbGFpbk9iamVjdHM/e19fcHJvdG9fXzpudWxsfTp7fTtmb3IodmFyIHRlbXBPYmo9InN0cmluZyI9PXR5cGVvZiBzdHI/ZnVuY3Rpb24gcGFyc2VRdWVyeVN0cmluZ1ZhbHVlcyhzdHIsb3B0aW9ucyl7dmFyIG9iaj17X19wcm90b19fOm51bGx9LGNsZWFuU3RyPW9wdGlvbnMuaWdub3JlUXVlcnlQcmVmaXg/c3RyLnJlcGxhY2UoL15cPy8sIiIpOnN0cjtjbGVhblN0cj1jbGVhblN0ci5yZXBsYWNlKC8lNUIvZ2ksIlsiKS5yZXBsYWNlKC8lNUQvZ2ksIl0iKTt2YXIgbGltaXQ9b3B0aW9ucy5wYXJhbWV0ZXJMaW1pdD09PTEvMD92b2lkIDA6b3B0aW9ucy5wYXJhbWV0ZXJMaW1pdCxwYXJ0cz1jbGVhblN0ci5zcGxpdChvcHRpb25zLmRlbGltaXRlcixvcHRpb25zLnRocm93T25MaW1pdEV4Y2VlZGVkP2xpbWl0KzE6bGltaXQpO2lmKG9wdGlvbnMudGhyb3dPbkxpbWl0RXhjZWVkZWQmJnBhcnRzLmxlbmd0aD5saW1pdCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiUGFyYW1ldGVyIGxpbWl0IGV4Y2VlZGVkLiBPbmx5ICIrbGltaXQrIiBwYXJhbWV0ZXIiKygxPT09bGltaXQ/IiI6InMiKSsiIGFsbG93ZWQuIik7dmFyIGksc2tpcEluZGV4PS0xLGNoYXJzZXQ9b3B0aW9ucy5jaGFyc2V0O2lmKG9wdGlvbnMuY2hhcnNldFNlbnRpbmVsKWZvcihpPTA7aTxwYXJ0cy5sZW5ndGg7KytpKTA9PT1wYXJ0c1tpXS5pbmRleE9mKCJ1dGY4PSIpJiYoInV0Zjg9JUUyJTlDJTkzIj09PXBhcnRzW2ldP2NoYXJzZXQ9InV0Zi04IjoidXRmOD0lMjYlMjMxMDAwMyUzQiI9PT1wYXJ0c1tpXSYmKGNoYXJzZXQ9Imlzby04ODU5LTEiKSxza2lwSW5kZXg9aSxpPXBhcnRzLmxlbmd0aCk7Zm9yKGk9MDtpPHBhcnRzLmxlbmd0aDsrK2kpaWYoaSE9PXNraXBJbmRleCl7dmFyIGtleSx2YWwscGFydD1wYXJ0c1tpXSxicmFja2V0RXF1YWxzUG9zPXBhcnQuaW5kZXhPZigiXT0iKSxwb3M9LTE9PT1icmFja2V0RXF1YWxzUG9zP3BhcnQuaW5kZXhPZigiPSIpOmJyYWNrZXRFcXVhbHNQb3MrMTtpZigtMT09PXBvcz8oa2V5PW9wdGlvbnMuZGVjb2RlcihwYXJ0LGRlZmF1bHRzLmRlY29kZXIsY2hhcnNldCwia2V5IiksdmFsPW9wdGlvbnMuc3RyaWN0TnVsbEhhbmRsaW5nP251bGw6IiIpOm51bGwhPT0oa2V5PW9wdGlvbnMuZGVjb2RlcihwYXJ0LnNsaWNlKDAscG9zKSxkZWZhdWx0cy5kZWNvZGVyLGNoYXJzZXQsImtleSIpKSYmKHZhbD11dGlscy5tYXliZU1hcChwYXJzZUFycmF5VmFsdWUocGFydC5zbGljZShwb3MrMSksb3B0aW9ucyxpc0FycmF5KG9ialtrZXldKT9vYmpba2V5XS5sZW5ndGg6MCksZnVuY3Rpb24oZW5jb2RlZFZhbCl7cmV0dXJuIG9wdGlvbnMuZGVjb2RlcihlbmNvZGVkVmFsLGRlZmF1bHRzLmRlY29kZXIsY2hhcnNldCwidmFsdWUiKX0pKSx2YWwmJm9wdGlvbnMuaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzJiYiaXNvLTg4NTktMSI9PT1jaGFyc2V0JiYodmFsPWludGVycHJldE51bWVyaWNFbnRpdGllcyhTdHJpbmcodmFsKSkpLHBhcnQuaW5kZXhPZigiW109Iik+LTEmJih2YWw9aXNBcnJheSh2YWwpP1t2YWxdOnZhbCksb3B0aW9ucy5jb21tYSYmaXNBcnJheSh2YWwpJiZ2YWwubGVuZ3RoPm9wdGlvbnMuYXJyYXlMaW1pdCl7aWYob3B0aW9ucy50aHJvd09uTGltaXRFeGNlZWRlZCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXJyYXkgbGltaXQgZXhjZWVkZWQuIE9ubHkgIitvcHRpb25zLmFycmF5TGltaXQrIiBlbGVtZW50IisoMT09PW9wdGlvbnMuYXJyYXlMaW1pdD8iIjoicyIpKyIgYWxsb3dlZCBpbiBhbiBhcnJheS4iKTt2YWw9dXRpbHMuY29tYmluZShbXSx2YWwsb3B0aW9ucy5hcnJheUxpbWl0LG9wdGlvbnMucGxhaW5PYmplY3RzKX1pZihudWxsIT09a2V5KXt2YXIgZXhpc3Rpbmc9aGFzLmNhbGwob2JqLGtleSk7ZXhpc3RpbmcmJiJjb21iaW5lIj09PW9wdGlvbnMuZHVwbGljYXRlcz9vYmpba2V5XT11dGlscy5jb21iaW5lKG9ialtrZXldLHZhbCxvcHRpb25zLmFycmF5TGltaXQsb3B0aW9ucy5wbGFpbk9iamVjdHMpOmV4aXN0aW5nJiYibGFzdCIhPT1vcHRpb25zLmR1cGxpY2F0ZXN8fChvYmpba2V5XT12YWwpfX1yZXR1cm4gb2JqfShzdHIsb3B0aW9ucyk6c3RyLG9iaj1vcHRpb25zLnBsYWluT2JqZWN0cz97X19wcm90b19fOm51bGx9Ont9LGtleXM9T2JqZWN0LmtleXModGVtcE9iaiksaT0wO2k8a2V5cy5sZW5ndGg7KytpKXt2YXIga2V5PWtleXNbaV0sbmV3T2JqPXBhcnNlS2V5cyhrZXksdGVtcE9ialtrZXldLG9wdGlvbnMsInN0cmluZyI9PXR5cGVvZiBzdHIpO29iaj11dGlscy5tZXJnZShvYmosbmV3T2JqLG9wdGlvbnMpfXJldHVybiEwPT09b3B0aW9ucy5hbGxvd1NwYXJzZT9vYmo6dXRpbHMuY29tcGFjdChvYmopfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9xcy9saWIvc3RyaW5naWZ5LmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgZ2V0U2lkZUNoYW5uZWw9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3NpZGUtY2hhbm5lbC9pbmRleC5qcyIpLHV0aWxzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9xcy9saWIvdXRpbHMuanMiKSxmb3JtYXRzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9xcy9saWIvZm9ybWF0cy5qcyIpLGhhcz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGFycmF5UHJlZml4R2VuZXJhdG9ycz17YnJhY2tldHM6ZnVuY3Rpb24gYnJhY2tldHMocHJlZml4KXtyZXR1cm4gcHJlZml4KyJbXSJ9LGNvbW1hOiJjb21tYSIsaW5kaWNlczpmdW5jdGlvbiBpbmRpY2VzKHByZWZpeCxrZXkpe3JldHVybiBwcmVmaXgrIlsiK2tleSsiXSJ9LHJlcGVhdDpmdW5jdGlvbiByZXBlYXQocHJlZml4KXtyZXR1cm4gcHJlZml4fX0saXNBcnJheT1BcnJheS5pc0FycmF5LHB1c2g9QXJyYXkucHJvdG90eXBlLnB1c2gscHVzaFRvQXJyYXk9ZnVuY3Rpb24oYXJyLHZhbHVlT3JBcnJheSl7cHVzaC5hcHBseShhcnIsaXNBcnJheSh2YWx1ZU9yQXJyYXkpP3ZhbHVlT3JBcnJheTpbdmFsdWVPckFycmF5XSl9LHRvSVNPPURhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nLGRlZmF1bHRGb3JtYXQ9Zm9ybWF0cy5kZWZhdWx0LGRlZmF1bHRzPXthZGRRdWVyeVByZWZpeDohMSxhbGxvd0RvdHM6ITEsYWxsb3dFbXB0eUFycmF5czohMSxhcnJheUZvcm1hdDoiaW5kaWNlcyIsY2hhcnNldDoidXRmLTgiLGNoYXJzZXRTZW50aW5lbDohMSxjb21tYVJvdW5kVHJpcDohMSxkZWxpbWl0ZXI6IiYiLGVuY29kZTohMCxlbmNvZGVEb3RJbktleXM6ITEsZW5jb2Rlcjp1dGlscy5lbmNvZGUsZW5jb2RlVmFsdWVzT25seTohMSxmaWx0ZXI6dm9pZCAwLGZvcm1hdDpkZWZhdWx0Rm9ybWF0LGZvcm1hdHRlcjpmb3JtYXRzLmZvcm1hdHRlcnNbZGVmYXVsdEZvcm1hdF0saW5kaWNlczohMSxzZXJpYWxpemVEYXRlOmZ1bmN0aW9uIHNlcmlhbGl6ZURhdGUoZGF0ZSl7cmV0dXJuIHRvSVNPLmNhbGwoZGF0ZSl9LHNraXBOdWxsczohMSxzdHJpY3ROdWxsSGFuZGxpbmc6ITF9LHNlbnRpbmVsPXt9LHN0cmluZ2lmeT1mdW5jdGlvbiBzdHJpbmdpZnkob2JqZWN0LHByZWZpeCxnZW5lcmF0ZUFycmF5UHJlZml4LGNvbW1hUm91bmRUcmlwLGFsbG93RW1wdHlBcnJheXMsc3RyaWN0TnVsbEhhbmRsaW5nLHNraXBOdWxscyxlbmNvZGVEb3RJbktleXMsZW5jb2RlcixmaWx0ZXIsc29ydCxhbGxvd0RvdHMsc2VyaWFsaXplRGF0ZSxmb3JtYXQsZm9ybWF0dGVyLGVuY29kZVZhbHVlc09ubHksY2hhcnNldCxzaWRlQ2hhbm5lbCl7Zm9yKHZhciBvYmo9b2JqZWN0LHRtcFNjPXNpZGVDaGFubmVsLHN0ZXA9MCxmaW5kRmxhZz0hMTt2b2lkIDAhPT0odG1wU2M9dG1wU2MuZ2V0KHNlbnRpbmVsKSkmJiFmaW5kRmxhZzspe3ZhciBwb3M9dG1wU2MuZ2V0KG9iamVjdCk7aWYoc3RlcCs9MSx2b2lkIDAhPT1wb3Mpe2lmKHBvcz09PXN0ZXApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkN5Y2xpYyBvYmplY3QgdmFsdWUiKTtmaW5kRmxhZz0hMH12b2lkIDA9PT10bXBTYy5nZXQoc2VudGluZWwpJiYoc3RlcD0wKX1pZigiZnVuY3Rpb24iPT10eXBlb2YgZmlsdGVyP29iaj1maWx0ZXIocHJlZml4LG9iaik6b2JqIGluc3RhbmNlb2YgRGF0ZT9vYmo9c2VyaWFsaXplRGF0ZShvYmopOiJjb21tYSI9PT1nZW5lcmF0ZUFycmF5UHJlZml4JiZpc0FycmF5KG9iaikmJihvYmo9dXRpbHMubWF5YmVNYXAob2JqLGZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlP3NlcmlhbGl6ZURhdGUodmFsdWUpOnZhbHVlfSkpLG51bGw9PT1vYmope2lmKHN0cmljdE51bGxIYW5kbGluZylyZXR1cm4gZW5jb2RlciYmIWVuY29kZVZhbHVlc09ubHk/ZW5jb2RlcihwcmVmaXgsZGVmYXVsdHMuZW5jb2RlcixjaGFyc2V0LCJrZXkiLGZvcm1hdCk6cHJlZml4O29iaj0iIn1pZihmdW5jdGlvbiBpc05vbk51bGxpc2hQcmltaXRpdmUodil7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB2fHwibnVtYmVyIj09dHlwZW9mIHZ8fCJib29sZWFuIj09dHlwZW9mIHZ8fCJzeW1ib2wiPT10eXBlb2Ygdnx8ImJpZ2ludCI9PXR5cGVvZiB2fShvYmopfHx1dGlscy5pc0J1ZmZlcihvYmopKXJldHVybiBlbmNvZGVyP1tmb3JtYXR0ZXIoZW5jb2RlVmFsdWVzT25seT9wcmVmaXg6ZW5jb2RlcihwcmVmaXgsZGVmYXVsdHMuZW5jb2RlcixjaGFyc2V0LCJrZXkiLGZvcm1hdCkpKyI9Iitmb3JtYXR0ZXIoZW5jb2RlcihvYmosZGVmYXVsdHMuZW5jb2RlcixjaGFyc2V0LCJ2YWx1ZSIsZm9ybWF0KSldOltmb3JtYXR0ZXIocHJlZml4KSsiPSIrZm9ybWF0dGVyKFN0cmluZyhvYmopKV07dmFyIG9iaktleXMsdmFsdWVzPVtdO2lmKHZvaWQgMD09PW9iailyZXR1cm4gdmFsdWVzO2lmKCJjb21tYSI9PT1nZW5lcmF0ZUFycmF5UHJlZml4JiZpc0FycmF5KG9iaikpZW5jb2RlVmFsdWVzT25seSYmZW5jb2RlciYmKG9iaj11dGlscy5tYXliZU1hcChvYmosZW5jb2RlcikpLG9iaktleXM9W3t2YWx1ZTpvYmoubGVuZ3RoPjA/b2JqLmpvaW4oIiwiKXx8bnVsbDp2b2lkIDB9XTtlbHNlIGlmKGlzQXJyYXkoZmlsdGVyKSlvYmpLZXlzPWZpbHRlcjtlbHNle3ZhciBrZXlzPU9iamVjdC5rZXlzKG9iaik7b2JqS2V5cz1zb3J0P2tleXMuc29ydChzb3J0KTprZXlzfXZhciBlbmNvZGVkUHJlZml4PWVuY29kZURvdEluS2V5cz9TdHJpbmcocHJlZml4KS5yZXBsYWNlKC9cLi9nLCIlMkUiKTpTdHJpbmcocHJlZml4KSxhZGp1c3RlZFByZWZpeD1jb21tYVJvdW5kVHJpcCYmaXNBcnJheShvYmopJiYxPT09b2JqLmxlbmd0aD9lbmNvZGVkUHJlZml4KyJbXSI6ZW5jb2RlZFByZWZpeDtpZihhbGxvd0VtcHR5QXJyYXlzJiZpc0FycmF5KG9iaikmJjA9PT1vYmoubGVuZ3RoKXJldHVybiBhZGp1c3RlZFByZWZpeCsiW10iO2Zvcih2YXIgaj0wO2o8b2JqS2V5cy5sZW5ndGg7KytqKXt2YXIga2V5PW9iaktleXNbal0sdmFsdWU9Im9iamVjdCI9PXR5cGVvZiBrZXkmJmtleSYmdm9pZCAwIT09a2V5LnZhbHVlP2tleS52YWx1ZTpvYmpba2V5XTtpZighc2tpcE51bGxzfHxudWxsIT09dmFsdWUpe3ZhciBlbmNvZGVkS2V5PWFsbG93RG90cyYmZW5jb2RlRG90SW5LZXlzP1N0cmluZyhrZXkpLnJlcGxhY2UoL1wuL2csIiUyRSIpOlN0cmluZyhrZXkpLGtleVByZWZpeD1pc0FycmF5KG9iaik/ImZ1bmN0aW9uIj09dHlwZW9mIGdlbmVyYXRlQXJyYXlQcmVmaXg/Z2VuZXJhdGVBcnJheVByZWZpeChhZGp1c3RlZFByZWZpeCxlbmNvZGVkS2V5KTphZGp1c3RlZFByZWZpeDphZGp1c3RlZFByZWZpeCsoYWxsb3dEb3RzPyIuIitlbmNvZGVkS2V5OiJbIitlbmNvZGVkS2V5KyJdIik7c2lkZUNoYW5uZWwuc2V0KG9iamVjdCxzdGVwKTt2YXIgdmFsdWVTaWRlQ2hhbm5lbD1nZXRTaWRlQ2hhbm5lbCgpO3ZhbHVlU2lkZUNoYW5uZWwuc2V0KHNlbnRpbmVsLHNpZGVDaGFubmVsKSxwdXNoVG9BcnJheSh2YWx1ZXMsc3RyaW5naWZ5KHZhbHVlLGtleVByZWZpeCxnZW5lcmF0ZUFycmF5UHJlZml4LGNvbW1hUm91bmRUcmlwLGFsbG93RW1wdHlBcnJheXMsc3RyaWN0TnVsbEhhbmRsaW5nLHNraXBOdWxscyxlbmNvZGVEb3RJbktleXMsImNvbW1hIj09PWdlbmVyYXRlQXJyYXlQcmVmaXgmJmVuY29kZVZhbHVlc09ubHkmJmlzQXJyYXkob2JqKT9udWxsOmVuY29kZXIsZmlsdGVyLHNvcnQsYWxsb3dEb3RzLHNlcmlhbGl6ZURhdGUsZm9ybWF0LGZvcm1hdHRlcixlbmNvZGVWYWx1ZXNPbmx5LGNoYXJzZXQsdmFsdWVTaWRlQ2hhbm5lbCkpfX1yZXR1cm4gdmFsdWVzfTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihvYmplY3Qsb3B0cyl7dmFyIG9iaktleXMsb2JqPW9iamVjdCxvcHRpb25zPWZ1bmN0aW9uIG5vcm1hbGl6ZVN0cmluZ2lmeU9wdGlvbnMob3B0cyl7aWYoIW9wdHMpcmV0dXJuIGRlZmF1bHRzO2lmKHZvaWQgMCE9PW9wdHMuYWxsb3dFbXB0eUFycmF5cyYmImJvb2xlYW4iIT10eXBlb2Ygb3B0cy5hbGxvd0VtcHR5QXJyYXlzKXRocm93IG5ldyBUeXBlRXJyb3IoImBhbGxvd0VtcHR5QXJyYXlzYCBvcHRpb24gY2FuIG9ubHkgYmUgYHRydWVgIG9yIGBmYWxzZWAsIHdoZW4gcHJvdmlkZWQiKTtpZih2b2lkIDAhPT1vcHRzLmVuY29kZURvdEluS2V5cyYmImJvb2xlYW4iIT10eXBlb2Ygb3B0cy5lbmNvZGVEb3RJbktleXMpdGhyb3cgbmV3IFR5cGVFcnJvcigiYGVuY29kZURvdEluS2V5c2Agb3B0aW9uIGNhbiBvbmx5IGJlIGB0cnVlYCBvciBgZmFsc2VgLCB3aGVuIHByb3ZpZGVkIik7aWYobnVsbCE9PW9wdHMuZW5jb2RlciYmdm9pZCAwIT09b3B0cy5lbmNvZGVyJiYiZnVuY3Rpb24iIT10eXBlb2Ygb3B0cy5lbmNvZGVyKXRocm93IG5ldyBUeXBlRXJyb3IoIkVuY29kZXIgaGFzIHRvIGJlIGEgZnVuY3Rpb24uIik7dmFyIGNoYXJzZXQ9b3B0cy5jaGFyc2V0fHxkZWZhdWx0cy5jaGFyc2V0O2lmKHZvaWQgMCE9PW9wdHMuY2hhcnNldCYmInV0Zi04IiE9PW9wdHMuY2hhcnNldCYmImlzby04ODU5LTEiIT09b3B0cy5jaGFyc2V0KXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBjaGFyc2V0IG9wdGlvbiBtdXN0IGJlIGVpdGhlciB1dGYtOCwgaXNvLTg4NTktMSwgb3IgdW5kZWZpbmVkIik7dmFyIGZvcm1hdD1mb3JtYXRzLmRlZmF1bHQ7aWYodm9pZCAwIT09b3B0cy5mb3JtYXQpe2lmKCFoYXMuY2FsbChmb3JtYXRzLmZvcm1hdHRlcnMsb3B0cy5mb3JtYXQpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZm9ybWF0IG9wdGlvbiBwcm92aWRlZC4iKTtmb3JtYXQ9b3B0cy5mb3JtYXR9dmFyIGFycmF5Rm9ybWF0LGZvcm1hdHRlcj1mb3JtYXRzLmZvcm1hdHRlcnNbZm9ybWF0XSxmaWx0ZXI9ZGVmYXVsdHMuZmlsdGVyO2lmKCgiZnVuY3Rpb24iPT10eXBlb2Ygb3B0cy5maWx0ZXJ8fGlzQXJyYXkob3B0cy5maWx0ZXIpKSYmKGZpbHRlcj1vcHRzLmZpbHRlciksYXJyYXlGb3JtYXQ9b3B0cy5hcnJheUZvcm1hdCBpbiBhcnJheVByZWZpeEdlbmVyYXRvcnM/b3B0cy5hcnJheUZvcm1hdDoiaW5kaWNlcyJpbiBvcHRzP29wdHMuaW5kaWNlcz8iaW5kaWNlcyI6InJlcGVhdCI6ZGVmYXVsdHMuYXJyYXlGb3JtYXQsImNvbW1hUm91bmRUcmlwImluIG9wdHMmJiJib29sZWFuIiE9dHlwZW9mIG9wdHMuY29tbWFSb3VuZFRyaXApdGhyb3cgbmV3IFR5cGVFcnJvcigiYGNvbW1hUm91bmRUcmlwYCBtdXN0IGJlIGEgYm9vbGVhbiwgb3IgYWJzZW50Iik7dmFyIGFsbG93RG90cz12b2lkIDA9PT1vcHRzLmFsbG93RG90cz8hMD09PW9wdHMuZW5jb2RlRG90SW5LZXlzfHxkZWZhdWx0cy5hbGxvd0RvdHM6ISFvcHRzLmFsbG93RG90cztyZXR1cm57YWRkUXVlcnlQcmVmaXg6ImJvb2xlYW4iPT10eXBlb2Ygb3B0cy5hZGRRdWVyeVByZWZpeD9vcHRzLmFkZFF1ZXJ5UHJlZml4OmRlZmF1bHRzLmFkZFF1ZXJ5UHJlZml4LGFsbG93RG90cyxhbGxvd0VtcHR5QXJyYXlzOiJib29sZWFuIj09dHlwZW9mIG9wdHMuYWxsb3dFbXB0eUFycmF5cz8hIW9wdHMuYWxsb3dFbXB0eUFycmF5czpkZWZhdWx0cy5hbGxvd0VtcHR5QXJyYXlzLGFycmF5Rm9ybWF0LGNoYXJzZXQsY2hhcnNldFNlbnRpbmVsOiJib29sZWFuIj09dHlwZW9mIG9wdHMuY2hhcnNldFNlbnRpbmVsP29wdHMuY2hhcnNldFNlbnRpbmVsOmRlZmF1bHRzLmNoYXJzZXRTZW50aW5lbCxjb21tYVJvdW5kVHJpcDohIW9wdHMuY29tbWFSb3VuZFRyaXAsZGVsaW1pdGVyOnZvaWQgMD09PW9wdHMuZGVsaW1pdGVyP2RlZmF1bHRzLmRlbGltaXRlcjpvcHRzLmRlbGltaXRlcixlbmNvZGU6ImJvb2xlYW4iPT10eXBlb2Ygb3B0cy5lbmNvZGU/b3B0cy5lbmNvZGU6ZGVmYXVsdHMuZW5jb2RlLGVuY29kZURvdEluS2V5czoiYm9vbGVhbiI9PXR5cGVvZiBvcHRzLmVuY29kZURvdEluS2V5cz9vcHRzLmVuY29kZURvdEluS2V5czpkZWZhdWx0cy5lbmNvZGVEb3RJbktleXMsZW5jb2RlcjoiZnVuY3Rpb24iPT10eXBlb2Ygb3B0cy5lbmNvZGVyP29wdHMuZW5jb2RlcjpkZWZhdWx0cy5lbmNvZGVyLGVuY29kZVZhbHVlc09ubHk6ImJvb2xlYW4iPT10eXBlb2Ygb3B0cy5lbmNvZGVWYWx1ZXNPbmx5P29wdHMuZW5jb2RlVmFsdWVzT25seTpkZWZhdWx0cy5lbmNvZGVWYWx1ZXNPbmx5LGZpbHRlcixmb3JtYXQsZm9ybWF0dGVyLHNlcmlhbGl6ZURhdGU6ImZ1bmN0aW9uIj09dHlwZW9mIG9wdHMuc2VyaWFsaXplRGF0ZT9vcHRzLnNlcmlhbGl6ZURhdGU6ZGVmYXVsdHMuc2VyaWFsaXplRGF0ZSxza2lwTnVsbHM6ImJvb2xlYW4iPT10eXBlb2Ygb3B0cy5za2lwTnVsbHM/b3B0cy5za2lwTnVsbHM6ZGVmYXVsdHMuc2tpcE51bGxzLHNvcnQ6ImZ1bmN0aW9uIj09dHlwZW9mIG9wdHMuc29ydD9vcHRzLnNvcnQ6bnVsbCxzdHJpY3ROdWxsSGFuZGxpbmc6ImJvb2xlYW4iPT10eXBlb2Ygb3B0cy5zdHJpY3ROdWxsSGFuZGxpbmc/b3B0cy5zdHJpY3ROdWxsSGFuZGxpbmc6ZGVmYXVsdHMuc3RyaWN0TnVsbEhhbmRsaW5nfX0ob3B0cyk7ImZ1bmN0aW9uIj09dHlwZW9mIG9wdGlvbnMuZmlsdGVyP29iaj0oMCxvcHRpb25zLmZpbHRlcikoIiIsb2JqKTppc0FycmF5KG9wdGlvbnMuZmlsdGVyKSYmKG9iaktleXM9b3B0aW9ucy5maWx0ZXIpO3ZhciBrZXlzPVtdO2lmKCJvYmplY3QiIT10eXBlb2Ygb2JqfHxudWxsPT09b2JqKXJldHVybiIiO3ZhciBnZW5lcmF0ZUFycmF5UHJlZml4PWFycmF5UHJlZml4R2VuZXJhdG9yc1tvcHRpb25zLmFycmF5Rm9ybWF0XSxjb21tYVJvdW5kVHJpcD0iY29tbWEiPT09Z2VuZXJhdGVBcnJheVByZWZpeCYmb3B0aW9ucy5jb21tYVJvdW5kVHJpcDtvYmpLZXlzfHwob2JqS2V5cz1PYmplY3Qua2V5cyhvYmopKSxvcHRpb25zLnNvcnQmJm9iaktleXMuc29ydChvcHRpb25zLnNvcnQpO2Zvcih2YXIgc2lkZUNoYW5uZWw9Z2V0U2lkZUNoYW5uZWwoKSxpPTA7aTxvYmpLZXlzLmxlbmd0aDsrK2kpe3ZhciBrZXk9b2JqS2V5c1tpXSx2YWx1ZT1vYmpba2V5XTtvcHRpb25zLnNraXBOdWxscyYmbnVsbD09PXZhbHVlfHxwdXNoVG9BcnJheShrZXlzLHN0cmluZ2lmeSh2YWx1ZSxrZXksZ2VuZXJhdGVBcnJheVByZWZpeCxjb21tYVJvdW5kVHJpcCxvcHRpb25zLmFsbG93RW1wdHlBcnJheXMsb3B0aW9ucy5zdHJpY3ROdWxsSGFuZGxpbmcsb3B0aW9ucy5za2lwTnVsbHMsb3B0aW9ucy5lbmNvZGVEb3RJbktleXMsb3B0aW9ucy5lbmNvZGU/b3B0aW9ucy5lbmNvZGVyOm51bGwsb3B0aW9ucy5maWx0ZXIsb3B0aW9ucy5zb3J0LG9wdGlvbnMuYWxsb3dEb3RzLG9wdGlvbnMuc2VyaWFsaXplRGF0ZSxvcHRpb25zLmZvcm1hdCxvcHRpb25zLmZvcm1hdHRlcixvcHRpb25zLmVuY29kZVZhbHVlc09ubHksb3B0aW9ucy5jaGFyc2V0LHNpZGVDaGFubmVsKSl9dmFyIGpvaW5lZD1rZXlzLmpvaW4ob3B0aW9ucy5kZWxpbWl0ZXIpLHByZWZpeD0hMD09PW9wdGlvbnMuYWRkUXVlcnlQcmVmaXg/Ij8iOiIiO3JldHVybiBvcHRpb25zLmNoYXJzZXRTZW50aW5lbCYmKCJpc28tODg1OS0xIj09PW9wdGlvbnMuY2hhcnNldD9wcmVmaXgrPSJ1dGY4PSUyNiUyMzEwMDAzJTNCJiI6cHJlZml4Kz0idXRmOD0lRTIlOUMlOTMmIiksam9pbmVkLmxlbmd0aD4wP3ByZWZpeCtqb2luZWQ6IiJ9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3FzL2xpYi91dGlscy5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIGZvcm1hdHM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3FzL2xpYi9mb3JtYXRzLmpzIiksZ2V0U2lkZUNoYW5uZWw9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3NpZGUtY2hhbm5lbC9pbmRleC5qcyIpLGhhcz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGlzQXJyYXk9QXJyYXkuaXNBcnJheSxvdmVyZmxvd0NoYW5uZWw9Z2V0U2lkZUNoYW5uZWwoKSxtYXJrT3ZlcmZsb3c9ZnVuY3Rpb24gbWFya092ZXJmbG93KG9iaixtYXhJbmRleCl7cmV0dXJuIG92ZXJmbG93Q2hhbm5lbC5zZXQob2JqLG1heEluZGV4KSxvYmp9LGlzT3ZlcmZsb3c9ZnVuY3Rpb24gaXNPdmVyZmxvdyhvYmope3JldHVybiBvdmVyZmxvd0NoYW5uZWwuaGFzKG9iail9LGdldE1heEluZGV4PWZ1bmN0aW9uIGdldE1heEluZGV4KG9iail7cmV0dXJuIG92ZXJmbG93Q2hhbm5lbC5nZXQob2JqKX0sc2V0TWF4SW5kZXg9ZnVuY3Rpb24gc2V0TWF4SW5kZXgob2JqLG1heEluZGV4KXtvdmVyZmxvd0NoYW5uZWwuc2V0KG9iaixtYXhJbmRleCl9LGhleFRhYmxlPWZ1bmN0aW9uKCl7Zm9yKHZhciBhcnJheT1bXSxpPTA7aTwyNTY7KytpKWFycmF5W2FycmF5Lmxlbmd0aF09IiUiKygoaTwxNj8iMCI6IiIpK2kudG9TdHJpbmcoMTYpKS50b1VwcGVyQ2FzZSgpO3JldHVybiBhcnJheX0oKSxhcnJheVRvT2JqZWN0PWZ1bmN0aW9uIGFycmF5VG9PYmplY3Qoc291cmNlLG9wdGlvbnMpe2Zvcih2YXIgb2JqPW9wdGlvbnMmJm9wdGlvbnMucGxhaW5PYmplY3RzP3tfX3Byb3RvX186bnVsbH06e30saT0wO2k8c291cmNlLmxlbmd0aDsrK2kpdm9pZCAwIT09c291cmNlW2ldJiYob2JqW2ldPXNvdXJjZVtpXSk7cmV0dXJuIG9ian07bW9kdWxlLmV4cG9ydHM9e2FycmF5VG9PYmplY3QsYXNzaWduOmZ1bmN0aW9uIGFzc2lnblNpbmdsZVNvdXJjZSh0YXJnZXQsc291cmNlKXtyZXR1cm4gT2JqZWN0LmtleXMoc291cmNlKS5yZWR1Y2UoZnVuY3Rpb24oYWNjLGtleSl7cmV0dXJuIGFjY1trZXldPXNvdXJjZVtrZXldLGFjY30sdGFyZ2V0KX0sY29tYmluZTpmdW5jdGlvbiBjb21iaW5lKGEsYixhcnJheUxpbWl0LHBsYWluT2JqZWN0cyl7aWYoaXNPdmVyZmxvdyhhKSl7dmFyIG5ld0luZGV4PWdldE1heEluZGV4KGEpKzE7cmV0dXJuIGFbbmV3SW5kZXhdPWIsc2V0TWF4SW5kZXgoYSxuZXdJbmRleCksYX12YXIgcmVzdWx0PVtdLmNvbmNhdChhLGIpO3JldHVybiByZXN1bHQubGVuZ3RoPmFycmF5TGltaXQ/bWFya092ZXJmbG93KGFycmF5VG9PYmplY3QocmVzdWx0LHtwbGFpbk9iamVjdHN9KSxyZXN1bHQubGVuZ3RoLTEpOnJlc3VsdH0sY29tcGFjdDpmdW5jdGlvbiBjb21wYWN0KHZhbHVlKXtmb3IodmFyIHF1ZXVlPVt7b2JqOntvOnZhbHVlfSxwcm9wOiJvIn1dLHJlZnM9W10saT0wO2k8cXVldWUubGVuZ3RoOysraSlmb3IodmFyIGl0ZW09cXVldWVbaV0sb2JqPWl0ZW0ub2JqW2l0ZW0ucHJvcF0sa2V5cz1PYmplY3Qua2V5cyhvYmopLGo9MDtqPGtleXMubGVuZ3RoOysrail7dmFyIGtleT1rZXlzW2pdLHZhbD1vYmpba2V5XTsib2JqZWN0Ij09dHlwZW9mIHZhbCYmbnVsbCE9PXZhbCYmLTE9PT1yZWZzLmluZGV4T2YodmFsKSYmKHF1ZXVlW3F1ZXVlLmxlbmd0aF09e29iaixwcm9wOmtleX0scmVmc1tyZWZzLmxlbmd0aF09dmFsKX1yZXR1cm4gZnVuY3Rpb24gY29tcGFjdFF1ZXVlKHF1ZXVlKXtmb3IoO3F1ZXVlLmxlbmd0aD4xOyl7dmFyIGl0ZW09cXVldWUucG9wKCksb2JqPWl0ZW0ub2JqW2l0ZW0ucHJvcF07aWYoaXNBcnJheShvYmopKXtmb3IodmFyIGNvbXBhY3RlZD1bXSxqPTA7ajxvYmoubGVuZ3RoOysrail2b2lkIDAhPT1vYmpbal0mJihjb21wYWN0ZWRbY29tcGFjdGVkLmxlbmd0aF09b2JqW2pdKTtpdGVtLm9ialtpdGVtLnByb3BdPWNvbXBhY3RlZH19fShxdWV1ZSksdmFsdWV9LGRlY29kZTpmdW5jdGlvbihzdHIsZGVmYXVsdERlY29kZXIsY2hhcnNldCl7dmFyIHN0cldpdGhvdXRQbHVzPXN0ci5yZXBsYWNlKC9cKy9nLCIgIik7aWYoImlzby04ODU5LTEiPT09Y2hhcnNldClyZXR1cm4gc3RyV2l0aG91dFBsdXMucmVwbGFjZSgvJVswLTlhLWZdezJ9L2dpLHVuZXNjYXBlKTt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChzdHJXaXRob3V0UGx1cyl9Y2F0Y2goZSl7cmV0dXJuIHN0cldpdGhvdXRQbHVzfX0sZW5jb2RlOmZ1bmN0aW9uIGVuY29kZShzdHIsZGVmYXVsdEVuY29kZXIsY2hhcnNldCxraW5kLGZvcm1hdCl7aWYoMD09PXN0ci5sZW5ndGgpcmV0dXJuIHN0cjt2YXIgc3RyaW5nPXN0cjtpZigic3ltYm9sIj09dHlwZW9mIHN0cj9zdHJpbmc9U3ltYm9sLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN0cik6InN0cmluZyIhPXR5cGVvZiBzdHImJihzdHJpbmc9U3RyaW5nKHN0cikpLCJpc28tODg1OS0xIj09PWNoYXJzZXQpcmV0dXJuIGVzY2FwZShzdHJpbmcpLnJlcGxhY2UoLyV1WzAtOWEtZl17NH0vZ2ksZnVuY3Rpb24oJDApe3JldHVybiIlMjYlMjMiK3BhcnNlSW50KCQwLnNsaWNlKDIpLDE2KSsiJTNCIn0pO2Zvcih2YXIgb3V0PSIiLGo9MDtqPHN0cmluZy5sZW5ndGg7ais9MTAyNCl7Zm9yKHZhciBzZWdtZW50PXN0cmluZy5sZW5ndGg+PTEwMjQ/c3RyaW5nLnNsaWNlKGosaisxMDI0KTpzdHJpbmcsYXJyPVtdLGk9MDtpPHNlZ21lbnQubGVuZ3RoOysraSl7dmFyIGM9c2VnbWVudC5jaGFyQ29kZUF0KGkpOzQ1PT09Y3x8NDY9PT1jfHw5NT09PWN8fDEyNj09PWN8fGM+PTQ4JiZjPD01N3x8Yz49NjUmJmM8PTkwfHxjPj05NyYmYzw9MTIyfHxmb3JtYXQ9PT1mb3JtYXRzLlJGQzE3MzgmJig0MD09PWN8fDQxPT09Yyk/YXJyW2Fyci5sZW5ndGhdPXNlZ21lbnQuY2hhckF0KGkpOmM8MTI4P2FyclthcnIubGVuZ3RoXT1oZXhUYWJsZVtjXTpjPDIwNDg/YXJyW2Fyci5sZW5ndGhdPWhleFRhYmxlWzE5MnxjPj42XStoZXhUYWJsZVsxMjh8NjMmY106Yzw1NTI5Nnx8Yz49NTczNDQ/YXJyW2Fyci5sZW5ndGhdPWhleFRhYmxlWzIyNHxjPj4xMl0raGV4VGFibGVbMTI4fGM+PjYmNjNdK2hleFRhYmxlWzEyOHw2MyZjXTooaSs9MSxjPTY1NTM2KygoMTAyMyZjKTw8MTB8MTAyMyZzZWdtZW50LmNoYXJDb2RlQXQoaSkpLGFyclthcnIubGVuZ3RoXT1oZXhUYWJsZVsyNDB8Yz4+MThdK2hleFRhYmxlWzEyOHxjPj4xMiY2M10raGV4VGFibGVbMTI4fGM+PjYmNjNdK2hleFRhYmxlWzEyOHw2MyZjXSl9b3V0Kz1hcnIuam9pbigiIil9cmV0dXJuIG91dH0saXNCdWZmZXI6ZnVuY3Rpb24gaXNCdWZmZXIob2JqKXtyZXR1cm4hKCFvYmp8fCJvYmplY3QiIT10eXBlb2Ygb2JqKSYmISEob2JqLmNvbnN0cnVjdG9yJiZvYmouY29uc3RydWN0b3IuaXNCdWZmZXImJm9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihvYmopKX0saXNPdmVyZmxvdyxpc1JlZ0V4cDpmdW5jdGlvbiBpc1JlZ0V4cChvYmope3JldHVybiJbb2JqZWN0IFJlZ0V4cF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iail9LG1hcmtPdmVyZmxvdyxtYXliZU1hcDpmdW5jdGlvbiBtYXliZU1hcCh2YWwsZm4pe2lmKGlzQXJyYXkodmFsKSl7Zm9yKHZhciBtYXBwZWQ9W10saT0wO2k8dmFsLmxlbmd0aDtpKz0xKW1hcHBlZFttYXBwZWQubGVuZ3RoXT1mbih2YWxbaV0pO3JldHVybiBtYXBwZWR9cmV0dXJuIGZuKHZhbCl9LG1lcmdlOmZ1bmN0aW9uIG1lcmdlKHRhcmdldCxzb3VyY2Usb3B0aW9ucyl7aWYoIXNvdXJjZSlyZXR1cm4gdGFyZ2V0O2lmKCJvYmplY3QiIT10eXBlb2Ygc291cmNlJiYiZnVuY3Rpb24iIT10eXBlb2Ygc291cmNlKXtpZihpc0FycmF5KHRhcmdldCkpe3ZhciBuZXh0SW5kZXg9dGFyZ2V0Lmxlbmd0aDtpZihvcHRpb25zJiYibnVtYmVyIj09dHlwZW9mIG9wdGlvbnMuYXJyYXlMaW1pdCYmbmV4dEluZGV4Pm9wdGlvbnMuYXJyYXlMaW1pdClyZXR1cm4gbWFya092ZXJmbG93KGFycmF5VG9PYmplY3QodGFyZ2V0LmNvbmNhdChzb3VyY2UpLG9wdGlvbnMpLG5leHRJbmRleCk7dGFyZ2V0W25leHRJbmRleF09c291cmNlfWVsc2V7aWYoIXRhcmdldHx8Im9iamVjdCIhPXR5cGVvZiB0YXJnZXQpcmV0dXJuW3RhcmdldCxzb3VyY2VdO2lmKGlzT3ZlcmZsb3codGFyZ2V0KSl7dmFyIG5ld0luZGV4PWdldE1heEluZGV4KHRhcmdldCkrMTt0YXJnZXRbbmV3SW5kZXhdPXNvdXJjZSxzZXRNYXhJbmRleCh0YXJnZXQsbmV3SW5kZXgpfWVsc2Uob3B0aW9ucyYmKG9wdGlvbnMucGxhaW5PYmplY3RzfHxvcHRpb25zLmFsbG93UHJvdG90eXBlcyl8fCFoYXMuY2FsbChPYmplY3QucHJvdG90eXBlLHNvdXJjZSkpJiYodGFyZ2V0W3NvdXJjZV09ITApfXJldHVybiB0YXJnZXR9aWYoIXRhcmdldHx8Im9iamVjdCIhPXR5cGVvZiB0YXJnZXQpe2lmKGlzT3ZlcmZsb3coc291cmNlKSl7Zm9yKHZhciBzb3VyY2VLZXlzPU9iamVjdC5rZXlzKHNvdXJjZSkscmVzdWx0PW9wdGlvbnMmJm9wdGlvbnMucGxhaW5PYmplY3RzP3tfX3Byb3RvX186bnVsbCwwOnRhcmdldH06ezA6dGFyZ2V0fSxtPTA7bTxzb3VyY2VLZXlzLmxlbmd0aDttKyspe3Jlc3VsdFtwYXJzZUludChzb3VyY2VLZXlzW21dLDEwKSsxXT1zb3VyY2Vbc291cmNlS2V5c1ttXV19cmV0dXJuIG1hcmtPdmVyZmxvdyhyZXN1bHQsZ2V0TWF4SW5kZXgoc291cmNlKSsxKX12YXIgY29tYmluZWQ9W3RhcmdldF0uY29uY2F0KHNvdXJjZSk7cmV0dXJuIG9wdGlvbnMmJiJudW1iZXIiPT10eXBlb2Ygb3B0aW9ucy5hcnJheUxpbWl0JiZjb21iaW5lZC5sZW5ndGg+b3B0aW9ucy5hcnJheUxpbWl0P21hcmtPdmVyZmxvdyhhcnJheVRvT2JqZWN0KGNvbWJpbmVkLG9wdGlvbnMpLGNvbWJpbmVkLmxlbmd0aC0xKTpjb21iaW5lZH12YXIgbWVyZ2VUYXJnZXQ9dGFyZ2V0O3JldHVybiBpc0FycmF5KHRhcmdldCkmJiFpc0FycmF5KHNvdXJjZSkmJihtZXJnZVRhcmdldD1hcnJheVRvT2JqZWN0KHRhcmdldCxvcHRpb25zKSksaXNBcnJheSh0YXJnZXQpJiZpc0FycmF5KHNvdXJjZSk/KHNvdXJjZS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0saSl7aWYoaGFzLmNhbGwodGFyZ2V0LGkpKXt2YXIgdGFyZ2V0SXRlbT10YXJnZXRbaV07dGFyZ2V0SXRlbSYmIm9iamVjdCI9PXR5cGVvZiB0YXJnZXRJdGVtJiZpdGVtJiYib2JqZWN0Ij09dHlwZW9mIGl0ZW0/dGFyZ2V0W2ldPW1lcmdlKHRhcmdldEl0ZW0saXRlbSxvcHRpb25zKTp0YXJnZXRbdGFyZ2V0Lmxlbmd0aF09aXRlbX1lbHNlIHRhcmdldFtpXT1pdGVtfSksdGFyZ2V0KTpPYmplY3Qua2V5cyhzb3VyY2UpLnJlZHVjZShmdW5jdGlvbihhY2Msa2V5KXt2YXIgdmFsdWU9c291cmNlW2tleV07aWYoaGFzLmNhbGwoYWNjLGtleSk/YWNjW2tleV09bWVyZ2UoYWNjW2tleV0sdmFsdWUsb3B0aW9ucyk6YWNjW2tleV09dmFsdWUsaXNPdmVyZmxvdyhzb3VyY2UpJiYhaXNPdmVyZmxvdyhhY2MpJiZtYXJrT3ZlcmZsb3coYWNjLGdldE1heEluZGV4KHNvdXJjZSkpLGlzT3ZlcmZsb3coYWNjKSl7dmFyIGtleU51bT1wYXJzZUludChrZXksMTApO1N0cmluZyhrZXlOdW0pPT09a2V5JiZrZXlOdW0+PTAmJmtleU51bT5nZXRNYXhJbmRleChhY2MpJiZzZXRNYXhJbmRleChhY2Msa2V5TnVtKX1yZXR1cm4gYWNjfSxtZXJnZVRhcmdldCl9fX0sIi4uLy4uL25vZGVfbW9kdWxlcy9xdWVyeXN0cmluZy1lczMvZGVjb2RlLmpzIihtb2R1bGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShvYmoscHJvcCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmoscHJvcCl9bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24ocXMsc2VwLGVxLG9wdGlvbnMpe3NlcD1zZXB8fCImIixlcT1lcXx8Ij0iO3ZhciBvYmo9e307aWYoInN0cmluZyIhPXR5cGVvZiBxc3x8MD09PXFzLmxlbmd0aClyZXR1cm4gb2JqO3ZhciByZWdleHA9L1wrL2c7cXM9cXMuc3BsaXQoc2VwKTt2YXIgbWF4S2V5cz0xZTM7b3B0aW9ucyYmIm51bWJlciI9PXR5cGVvZiBvcHRpb25zLm1heEtleXMmJihtYXhLZXlzPW9wdGlvbnMubWF4S2V5cyk7dmFyIGxlbj1xcy5sZW5ndGg7bWF4S2V5cz4wJiZsZW4+bWF4S2V5cyYmKGxlbj1tYXhLZXlzKTtmb3IodmFyIGk9MDtpPGxlbjsrK2kpe3ZhciBrc3RyLHZzdHIsayx2LHg9cXNbaV0ucmVwbGFjZShyZWdleHAsIiUyMCIpLGlkeD14LmluZGV4T2YoZXEpO2lkeD49MD8oa3N0cj14LnN1YnN0cigwLGlkeCksdnN0cj14LnN1YnN0cihpZHgrMSkpOihrc3RyPXgsdnN0cj0iIiksaz1kZWNvZGVVUklDb21wb25lbnQoa3N0ciksdj1kZWNvZGVVUklDb21wb25lbnQodnN0ciksaGFzT3duUHJvcGVydHkob2JqLGspP2lzQXJyYXkob2JqW2tdKT9vYmpba10ucHVzaCh2KTpvYmpba109W29ialtrXSx2XTpvYmpba109dn1yZXR1cm4gb2JqfTt2YXIgaXNBcnJheT1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih4cyl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4cyl9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9lbmNvZGUuanMiKG1vZHVsZSl7InVzZSBzdHJpY3QiO3ZhciBzdHJpbmdpZnlQcmltaXRpdmU9ZnVuY3Rpb24odil7c3dpdGNoKHR5cGVvZiB2KXtjYXNlInN0cmluZyI6cmV0dXJuIHY7Y2FzZSJib29sZWFuIjpyZXR1cm4gdj8idHJ1ZSI6ImZhbHNlIjtjYXNlIm51bWJlciI6cmV0dXJuIGlzRmluaXRlKHYpP3Y6IiI7ZGVmYXVsdDpyZXR1cm4iIn19O21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKG9iaixzZXAsZXEsbmFtZSl7cmV0dXJuIHNlcD1zZXB8fCImIixlcT1lcXx8Ij0iLG51bGw9PT1vYmomJihvYmo9dm9pZCAwKSwib2JqZWN0Ij09dHlwZW9mIG9iaj9tYXAob2JqZWN0S2V5cyhvYmopLGZ1bmN0aW9uKGspe3ZhciBrcz1lbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKGspKStlcTtyZXR1cm4gaXNBcnJheShvYmpba10pP21hcChvYmpba10sZnVuY3Rpb24odil7cmV0dXJuIGtzK2VuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUodikpfSkuam9pbihzZXApOmtzK2VuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUob2JqW2tdKSl9KS5qb2luKHNlcCk6bmFtZT9lbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKG5hbWUpKStlcStlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKG9iaikpOiIifTt2YXIgaXNBcnJheT1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih4cyl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4cyl9O2Z1bmN0aW9uIG1hcCh4cyxmKXtpZih4cy5tYXApcmV0dXJuIHhzLm1hcChmKTtmb3IodmFyIHJlcz1bXSxpPTA7aTx4cy5sZW5ndGg7aSsrKXJlcy5wdXNoKGYoeHNbaV0saSkpO3JldHVybiByZXN9dmFyIG9iamVjdEtleXM9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKG9iail7dmFyIHJlcz1bXTtmb3IodmFyIGtleSBpbiBvYmopT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaixrZXkpJiZyZXMucHVzaChrZXkpO3JldHVybiByZXN9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9pbmRleC5qcyIoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7ZXhwb3J0cy5kZWNvZGU9ZXhwb3J0cy5wYXJzZT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvcXVlcnlzdHJpbmctZXMzL2RlY29kZS5qcyIpLGV4cG9ydHMuZW5jb2RlPWV4cG9ydHMuc3RyaW5naWZ5PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9xdWVyeXN0cmluZy1lczMvZW5jb2RlLmpzIil9LCIuLi8uLi9ub2RlX21vZHVsZXMvcmFuZG9tYnl0ZXMvYnJvd3Nlci5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIHByb2Nlc3M9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL25vZGUtc3RkbGliLWJyb3dzZXIvY2pzL3Byb3h5L3Byb2Nlc3MuanMiKTt2YXIgQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcyIpLkJ1ZmZlcixjcnlwdG89X193ZWJwYWNrX3JlcXVpcmVfXy5nLmNyeXB0b3x8X193ZWJwYWNrX3JlcXVpcmVfXy5nLm1zQ3J5cHRvO2NyeXB0byYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcz9tb2R1bGUuZXhwb3J0cz1mdW5jdGlvbiByYW5kb21CeXRlcyhzaXplLGNiKXtpZihzaXplPjQyOTQ5NjcyOTUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInJlcXVlc3RlZCB0b28gbWFueSByYW5kb20gYnl0ZXMiKTt2YXIgYnl0ZXM9QnVmZmVyLmFsbG9jVW5zYWZlKHNpemUpO2lmKHNpemU+MClpZihzaXplPjY1NTM2KWZvcih2YXIgZ2VuZXJhdGVkPTA7Z2VuZXJhdGVkPHNpemU7Z2VuZXJhdGVkKz02NTUzNiljcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGJ5dGVzLnNsaWNlKGdlbmVyYXRlZCxnZW5lcmF0ZWQrNjU1MzYpKTtlbHNlIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYnl0ZXMpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBjYilyZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpe2NiKG51bGwsYnl0ZXMpfSk7cmV0dXJuIGJ5dGVzfTptb2R1bGUuZXhwb3J0cz1mdW5jdGlvbiBvbGRCcm93c2VyKCl7dGhyb3cgbmV3IEVycm9yKCJTZWN1cmUgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBicm93c2VyLlxuVXNlIENocm9tZSwgRmlyZWZveCBvciBJbnRlcm5ldCBFeHBsb3JlciAxMSIpfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9yYW5kb21maWxsL2Jyb3dzZXIuanMiKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBwcm9jZXNzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9ub2RlLXN0ZGxpYi1icm93c2VyL2Nqcy9wcm94eS9wcm9jZXNzLmpzIik7ZnVuY3Rpb24gb2xkQnJvd3Nlcigpe3Rocm93IG5ldyBFcnJvcigic2VjdXJlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbiBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYnJvd3NlclxudXNlIGNocm9tZSwgRmlyZUZveCBvciBJbnRlcm5ldCBFeHBsb3JlciAxMSIpfXZhciBzYWZlQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcyIpLHJhbmRvbWJ5dGVzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9yYW5kb21ieXRlcy9icm93c2VyLmpzIiksQnVmZmVyPXNhZmVCdWZmZXIuQnVmZmVyLGtCdWZmZXJNYXhMZW5ndGg9c2FmZUJ1ZmZlci5rTWF4TGVuZ3RoLGNyeXB0bz1fX3dlYnBhY2tfcmVxdWlyZV9fLmcuY3J5cHRvfHxfX3dlYnBhY2tfcmVxdWlyZV9fLmcubXNDcnlwdG8sa01heFVpbnQzMj1NYXRoLnBvdygyLDMyKS0xO2Z1bmN0aW9uIGFzc2VydE9mZnNldChvZmZzZXQsbGVuZ3RoKXtpZigibnVtYmVyIiE9dHlwZW9mIG9mZnNldHx8b2Zmc2V0IT1vZmZzZXQpdGhyb3cgbmV3IFR5cGVFcnJvcigib2Zmc2V0IG11c3QgYmUgYSBudW1iZXIiKTtpZihvZmZzZXQ+a01heFVpbnQzMnx8b2Zmc2V0PDApdGhyb3cgbmV3IFR5cGVFcnJvcigib2Zmc2V0IG11c3QgYmUgYSB1aW50MzIiKTtpZihvZmZzZXQ+a0J1ZmZlck1heExlbmd0aHx8b2Zmc2V0Pmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib2Zmc2V0IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIGFzc2VydFNpemUoc2l6ZSxvZmZzZXQsbGVuZ3RoKXtpZigibnVtYmVyIiE9dHlwZW9mIHNpemV8fHNpemUhPXNpemUpdGhyb3cgbmV3IFR5cGVFcnJvcigic2l6ZSBtdXN0IGJlIGEgbnVtYmVyIik7aWYoc2l6ZT5rTWF4VWludDMyfHxzaXplPDApdGhyb3cgbmV3IFR5cGVFcnJvcigic2l6ZSBtdXN0IGJlIGEgdWludDMyIik7aWYoc2l6ZStvZmZzZXQ+bGVuZ3RofHxzaXplPmtCdWZmZXJNYXhMZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImJ1ZmZlciB0b28gc21hbGwiKX1mdW5jdGlvbiBhY3R1YWxGaWxsKGJ1ZixvZmZzZXQsc2l6ZSxjYil7aWYocHJvY2Vzcy5icm93c2VyKXt2YXIgb3VyQnVmPWJ1Zi5idWZmZXIsdWludD1uZXcgVWludDhBcnJheShvdXJCdWYsb2Zmc2V0LHNpemUpO3JldHVybiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHVpbnQpLGNiP3ZvaWQgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpe2NiKG51bGwsYnVmKX0pOmJ1Zn1pZighY2IpcmV0dXJuIHJhbmRvbWJ5dGVzKHNpemUpLmNvcHkoYnVmLG9mZnNldCksYnVmO3JhbmRvbWJ5dGVzKHNpemUsZnVuY3Rpb24oZXJyLGJ5dGVzKXtpZihlcnIpcmV0dXJuIGNiKGVycik7Ynl0ZXMuY29weShidWYsb2Zmc2V0KSxjYihudWxsLGJ1Zil9KX1jcnlwdG8mJmNyeXB0by5nZXRSYW5kb21WYWx1ZXN8fCFwcm9jZXNzLmJyb3dzZXI/KGV4cG9ydHMucmFuZG9tRmlsbD1mdW5jdGlvbiByYW5kb21GaWxsKGJ1ZixvZmZzZXQsc2l6ZSxjYil7aWYoIShCdWZmZXIuaXNCdWZmZXIoYnVmKXx8YnVmIGluc3RhbmNlb2YgX193ZWJwYWNrX3JlcXVpcmVfXy5nLlVpbnQ4QXJyYXkpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJidWYiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgb3IgVWludDhBcnJheScpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBvZmZzZXQpY2I9b2Zmc2V0LG9mZnNldD0wLHNpemU9YnVmLmxlbmd0aDtlbHNlIGlmKCJmdW5jdGlvbiI9PXR5cGVvZiBzaXplKWNiPXNpemUsc2l6ZT1idWYubGVuZ3RoLW9mZnNldDtlbHNlIGlmKCJmdW5jdGlvbiIhPXR5cGVvZiBjYil0aHJvdyBuZXcgVHlwZUVycm9yKCciY2IiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO3JldHVybiBhc3NlcnRPZmZzZXQob2Zmc2V0LGJ1Zi5sZW5ndGgpLGFzc2VydFNpemUoc2l6ZSxvZmZzZXQsYnVmLmxlbmd0aCksYWN0dWFsRmlsbChidWYsb2Zmc2V0LHNpemUsY2IpfSxleHBvcnRzLnJhbmRvbUZpbGxTeW5jPWZ1bmN0aW9uIHJhbmRvbUZpbGxTeW5jKGJ1ZixvZmZzZXQsc2l6ZSl7dm9pZCAwPT09b2Zmc2V0JiYob2Zmc2V0PTApO2lmKCEoQnVmZmVyLmlzQnVmZmVyKGJ1Zil8fGJ1ZiBpbnN0YW5jZW9mIF9fd2VicGFja19yZXF1aXJlX18uZy5VaW50OEFycmF5KSl0aHJvdyBuZXcgVHlwZUVycm9yKCciYnVmIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIG9yIFVpbnQ4QXJyYXknKTthc3NlcnRPZmZzZXQob2Zmc2V0LGJ1Zi5sZW5ndGgpLHZvaWQgMD09PXNpemUmJihzaXplPWJ1Zi5sZW5ndGgtb2Zmc2V0KTtyZXR1cm4gYXNzZXJ0U2l6ZShzaXplLG9mZnNldCxidWYubGVuZ3RoKSxhY3R1YWxGaWxsKGJ1ZixvZmZzZXQsc2l6ZSl9KTooZXhwb3J0cy5yYW5kb21GaWxsPW9sZEJyb3dzZXIsZXhwb3J0cy5yYW5kb21GaWxsU3luYz1vbGRCcm93c2VyKX0sIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fZHVwbGV4LmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgcG5hPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9wcm9jZXNzLW5leHRpY2stYXJncy9pbmRleC5qcyIpLG9iamVjdEtleXM9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKG9iail7dmFyIGtleXM9W107Zm9yKHZhciBrZXkgaW4gb2JqKWtleXMucHVzaChrZXkpO3JldHVybiBrZXlzfTttb2R1bGUuZXhwb3J0cz1EdXBsZXg7dmFyIHV0aWw9T2JqZWN0LmNyZWF0ZShfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS11dGlsLWlzL2xpYi91dGlsLmpzIikpO3V0aWwuaW5oZXJpdHM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiKTt2YXIgUmVhZGFibGU9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcyIpLFdyaXRhYmxlPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fd3JpdGFibGUuanMiKTt1dGlsLmluaGVyaXRzKER1cGxleCxSZWFkYWJsZSk7Zm9yKHZhciBrZXlzPW9iamVjdEtleXMoV3JpdGFibGUucHJvdG90eXBlKSx2PTA7djxrZXlzLmxlbmd0aDt2Kyspe3ZhciBtZXRob2Q9a2V5c1t2XTtEdXBsZXgucHJvdG90eXBlW21ldGhvZF18fChEdXBsZXgucHJvdG90eXBlW21ldGhvZF09V3JpdGFibGUucHJvdG90eXBlW21ldGhvZF0pfWZ1bmN0aW9uIER1cGxleChvcHRpb25zKXtpZighKHRoaXMgaW5zdGFuY2VvZiBEdXBsZXgpKXJldHVybiBuZXcgRHVwbGV4KG9wdGlvbnMpO1JlYWRhYmxlLmNhbGwodGhpcyxvcHRpb25zKSxXcml0YWJsZS5jYWxsKHRoaXMsb3B0aW9ucyksb3B0aW9ucyYmITE9PT1vcHRpb25zLnJlYWRhYmxlJiYodGhpcy5yZWFkYWJsZT0hMSksb3B0aW9ucyYmITE9PT1vcHRpb25zLndyaXRhYmxlJiYodGhpcy53cml0YWJsZT0hMSksdGhpcy5hbGxvd0hhbGZPcGVuPSEwLG9wdGlvbnMmJiExPT09b3B0aW9ucy5hbGxvd0hhbGZPcGVuJiYodGhpcy5hbGxvd0hhbGZPcGVuPSExKSx0aGlzLm9uY2UoImVuZCIsb25lbmQpfWZ1bmN0aW9uIG9uZW5kKCl7dGhpcy5hbGxvd0hhbGZPcGVufHx0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkfHxwbmEubmV4dFRpY2sob25FbmROVCx0aGlzKX1mdW5jdGlvbiBvbkVuZE5UKHNlbGYpe3NlbGYuZW5kKCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsIndyaXRhYmxlSGlnaFdhdGVyTWFyayIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRHVwbGV4LnByb3RvdHlwZSwiZGVzdHJveWVkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuX3JlYWRhYmxlU3RhdGUmJnZvaWQgMCE9PXRoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCYmdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQpfSxzZXQ6ZnVuY3Rpb24odmFsdWUpe3ZvaWQgMCE9PXRoaXMuX3JlYWRhYmxlU3RhdGUmJnZvaWQgMCE9PXRoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD12YWx1ZSx0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD12YWx1ZSl9fSksRHVwbGV4LnByb3RvdHlwZS5fZGVzdHJveT1mdW5jdGlvbihlcnIsY2Ipe3RoaXMucHVzaChudWxsKSx0aGlzLmVuZCgpLHBuYS5uZXh0VGljayhjYixlcnIpfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO21vZHVsZS5leHBvcnRzPVBhc3NUaHJvdWdoO3ZhciBUcmFuc2Zvcm09X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMiKSx1dGlsPU9iamVjdC5jcmVhdGUoX193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtdXRpbC1pcy9saWIvdXRpbC5qcyIpKTtmdW5jdGlvbiBQYXNzVGhyb3VnaChvcHRpb25zKXtpZighKHRoaXMgaW5zdGFuY2VvZiBQYXNzVGhyb3VnaCkpcmV0dXJuIG5ldyBQYXNzVGhyb3VnaChvcHRpb25zKTtUcmFuc2Zvcm0uY2FsbCh0aGlzLG9wdGlvbnMpfXV0aWwuaW5oZXJpdHM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiKSx1dGlsLmluaGVyaXRzKFBhc3NUaHJvdWdoLFRyYW5zZm9ybSksUGFzc1Rocm91Z2gucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24oY2h1bmssZW5jb2RpbmcsY2Ipe2NiKG51bGwsY2h1bmspfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcmVhZGFibGUuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBwcm9jZXNzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9ub2RlLXN0ZGxpYi1icm93c2VyL2Nqcy9wcm94eS9wcm9jZXNzLmpzIikscG5hPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9wcm9jZXNzLW5leHRpY2stYXJncy9pbmRleC5qcyIpO21vZHVsZS5leHBvcnRzPVJlYWRhYmxlO3ZhciBEdXBsZXgsaXNBcnJheT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaXNhcnJheS9pbmRleC5qcyIpO1JlYWRhYmxlLlJlYWRhYmxlU3RhdGU9UmVhZGFibGVTdGF0ZTtfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIpLkV2ZW50RW1pdHRlcjt2YXIgRUVsaXN0ZW5lckNvdW50PWZ1bmN0aW9uKGVtaXR0ZXIsdHlwZSl7cmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJzKHR5cGUpLmxlbmd0aH0sU3RyZWFtPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtLWJyb3dzZXIuanMiKSxCdWZmZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9ub2RlX21vZHVsZXMvc2FmZS1idWZmZXIvaW5kZXguanMiKS5CdWZmZXIsT3VyVWludDhBcnJheT0odm9pZCAwIT09X193ZWJwYWNrX3JlcXVpcmVfXy5nP19fd2VicGFja19yZXF1aXJlX18uZzoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e30pLlVpbnQ4QXJyYXl8fGZ1bmN0aW9uKCl7fTt2YXIgdXRpbD1PYmplY3QuY3JlYXRlKF9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLXV0aWwtaXMvbGliL3V0aWwuanMiKSk7dXRpbC5pbmhlcml0cz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIpO3ZhciBkZWJ1Z1V0aWw9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3V0aWwvdXRpbC5qcyIpLGRlYnVnPXZvaWQgMDtkZWJ1Zz1kZWJ1Z1V0aWwmJmRlYnVnVXRpbC5kZWJ1Z2xvZz9kZWJ1Z1V0aWwuZGVidWdsb2coInN0cmVhbSIpOmZ1bmN0aW9uKCl7fTt2YXIgU3RyaW5nRGVjb2RlcixCdWZmZXJMaXN0PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvQnVmZmVyTGlzdC5qcyIpLGRlc3Ryb3lJbXBsPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZGVzdHJveS5qcyIpO3V0aWwuaW5oZXJpdHMoUmVhZGFibGUsU3RyZWFtKTt2YXIga1Byb3h5RXZlbnRzPVsiZXJyb3IiLCJjbG9zZSIsImRlc3Ryb3kiLCJwYXVzZSIsInJlc3VtZSJdO2Z1bmN0aW9uIFJlYWRhYmxlU3RhdGUob3B0aW9ucyxzdHJlYW0pe29wdGlvbnM9b3B0aW9uc3x8e307dmFyIGlzRHVwbGV4PXN0cmVhbSBpbnN0YW5jZW9mKER1cGxleD1EdXBsZXh8fF9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fZHVwbGV4LmpzIikpO3RoaXMub2JqZWN0TW9kZT0hIW9wdGlvbnMub2JqZWN0TW9kZSxpc0R1cGxleCYmKHRoaXMub2JqZWN0TW9kZT10aGlzLm9iamVjdE1vZGV8fCEhb3B0aW9ucy5yZWFkYWJsZU9iamVjdE1vZGUpO3ZhciBod209b3B0aW9ucy5oaWdoV2F0ZXJNYXJrLHJlYWRhYmxlSHdtPW9wdGlvbnMucmVhZGFibGVIaWdoV2F0ZXJNYXJrLGRlZmF1bHRId209dGhpcy5vYmplY3RNb2RlPzE2OjE2Mzg0O3RoaXMuaGlnaFdhdGVyTWFyaz1od218fDA9PT1od20/aHdtOmlzRHVwbGV4JiYocmVhZGFibGVId218fDA9PT1yZWFkYWJsZUh3bSk/cmVhZGFibGVId206ZGVmYXVsdEh3bSx0aGlzLmhpZ2hXYXRlck1hcms9TWF0aC5mbG9vcih0aGlzLmhpZ2hXYXRlck1hcmspLHRoaXMuYnVmZmVyPW5ldyBCdWZmZXJMaXN0LHRoaXMubGVuZ3RoPTAsdGhpcy5waXBlcz1udWxsLHRoaXMucGlwZXNDb3VudD0wLHRoaXMuZmxvd2luZz1udWxsLHRoaXMuZW5kZWQ9ITEsdGhpcy5lbmRFbWl0dGVkPSExLHRoaXMucmVhZGluZz0hMSx0aGlzLnN5bmM9ITAsdGhpcy5uZWVkUmVhZGFibGU9ITEsdGhpcy5lbWl0dGVkUmVhZGFibGU9ITEsdGhpcy5yZWFkYWJsZUxpc3RlbmluZz0hMSx0aGlzLnJlc3VtZVNjaGVkdWxlZD0hMSx0aGlzLmRlc3Ryb3llZD0hMSx0aGlzLmRlZmF1bHRFbmNvZGluZz1vcHRpb25zLmRlZmF1bHRFbmNvZGluZ3x8InV0ZjgiLHRoaXMuYXdhaXREcmFpbj0wLHRoaXMucmVhZGluZ01vcmU9ITEsdGhpcy5kZWNvZGVyPW51bGwsdGhpcy5lbmNvZGluZz1udWxsLG9wdGlvbnMuZW5jb2RpbmcmJihTdHJpbmdEZWNvZGVyfHwoU3RyaW5nRGVjb2Rlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyaW5nX2RlY29kZXIvbGliL3N0cmluZ19kZWNvZGVyLmpzIikuU3RyaW5nRGVjb2RlciksdGhpcy5kZWNvZGVyPW5ldyBTdHJpbmdEZWNvZGVyKG9wdGlvbnMuZW5jb2RpbmcpLHRoaXMuZW5jb2Rpbmc9b3B0aW9ucy5lbmNvZGluZyl9ZnVuY3Rpb24gUmVhZGFibGUob3B0aW9ucyl7aWYoRHVwbGV4PUR1cGxleHx8X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9kdXBsZXguanMiKSwhKHRoaXMgaW5zdGFuY2VvZiBSZWFkYWJsZSkpcmV0dXJuIG5ldyBSZWFkYWJsZShvcHRpb25zKTt0aGlzLl9yZWFkYWJsZVN0YXRlPW5ldyBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsdGhpcyksdGhpcy5yZWFkYWJsZT0hMCxvcHRpb25zJiYoImZ1bmN0aW9uIj09dHlwZW9mIG9wdGlvbnMucmVhZCYmKHRoaXMuX3JlYWQ9b3B0aW9ucy5yZWFkKSwiZnVuY3Rpb24iPT10eXBlb2Ygb3B0aW9ucy5kZXN0cm95JiYodGhpcy5fZGVzdHJveT1vcHRpb25zLmRlc3Ryb3kpKSxTdHJlYW0uY2FsbCh0aGlzKX1mdW5jdGlvbiByZWFkYWJsZUFkZENodW5rKHN0cmVhbSxjaHVuayxlbmNvZGluZyxhZGRUb0Zyb250LHNraXBDaHVua0NoZWNrKXt2YXIgZXIsc3RhdGU9c3RyZWFtLl9yZWFkYWJsZVN0YXRlO251bGw9PT1jaHVuaz8oc3RhdGUucmVhZGluZz0hMSxmdW5jdGlvbiBvbkVvZkNodW5rKHN0cmVhbSxzdGF0ZSl7aWYoc3RhdGUuZW5kZWQpcmV0dXJuO2lmKHN0YXRlLmRlY29kZXIpe3ZhciBjaHVuaz1zdGF0ZS5kZWNvZGVyLmVuZCgpO2NodW5rJiZjaHVuay5sZW5ndGgmJihzdGF0ZS5idWZmZXIucHVzaChjaHVuayksc3RhdGUubGVuZ3RoKz1zdGF0ZS5vYmplY3RNb2RlPzE6Y2h1bmsubGVuZ3RoKX1zdGF0ZS5lbmRlZD0hMCxlbWl0UmVhZGFibGUoc3RyZWFtKX0oc3RyZWFtLHN0YXRlKSk6KHNraXBDaHVua0NoZWNrfHwoZXI9ZnVuY3Rpb24gY2h1bmtJbnZhbGlkKHN0YXRlLGNodW5rKXt2YXIgZXI7KGZ1bmN0aW9uIF9pc1VpbnQ4QXJyYXkob2JqKXtyZXR1cm4gQnVmZmVyLmlzQnVmZmVyKG9iail8fG9iaiBpbnN0YW5jZW9mIE91clVpbnQ4QXJyYXl9KShjaHVuayl8fCJzdHJpbmciPT10eXBlb2YgY2h1bmt8fHZvaWQgMD09PWNodW5rfHxzdGF0ZS5vYmplY3RNb2RlfHwoZXI9bmV3IFR5cGVFcnJvcigiSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuayIpKTtyZXR1cm4gZXJ9KHN0YXRlLGNodW5rKSksZXI/c3RyZWFtLmVtaXQoImVycm9yIixlcik6c3RhdGUub2JqZWN0TW9kZXx8Y2h1bmsmJmNodW5rLmxlbmd0aD4wPygic3RyaW5nIj09dHlwZW9mIGNodW5rfHxzdGF0ZS5vYmplY3RNb2RlfHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoY2h1bmspPT09QnVmZmVyLnByb3RvdHlwZXx8KGNodW5rPWZ1bmN0aW9uIF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspe3JldHVybiBCdWZmZXIuZnJvbShjaHVuayl9KGNodW5rKSksYWRkVG9Gcm9udD9zdGF0ZS5lbmRFbWl0dGVkP3N0cmVhbS5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudCIpKTphZGRDaHVuayhzdHJlYW0sc3RhdGUsY2h1bmssITApOnN0YXRlLmVuZGVkP3N0cmVhbS5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJzdHJlYW0ucHVzaCgpIGFmdGVyIEVPRiIpKTooc3RhdGUucmVhZGluZz0hMSxzdGF0ZS5kZWNvZGVyJiYhZW5jb2Rpbmc/KGNodW5rPXN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspLHN0YXRlLm9iamVjdE1vZGV8fDAhPT1jaHVuay5sZW5ndGg/YWRkQ2h1bmsoc3RyZWFtLHN0YXRlLGNodW5rLCExKTptYXliZVJlYWRNb3JlKHN0cmVhbSxzdGF0ZSkpOmFkZENodW5rKHN0cmVhbSxzdGF0ZSxjaHVuaywhMSkpKTphZGRUb0Zyb250fHwoc3RhdGUucmVhZGluZz0hMSkpO3JldHVybiBmdW5jdGlvbiBuZWVkTW9yZURhdGEoc3RhdGUpe3JldHVybiFzdGF0ZS5lbmRlZCYmKHN0YXRlLm5lZWRSZWFkYWJsZXx8c3RhdGUubGVuZ3RoPHN0YXRlLmhpZ2hXYXRlck1hcmt8fDA9PT1zdGF0ZS5sZW5ndGgpfShzdGF0ZSl9ZnVuY3Rpb24gYWRkQ2h1bmsoc3RyZWFtLHN0YXRlLGNodW5rLGFkZFRvRnJvbnQpe3N0YXRlLmZsb3dpbmcmJjA9PT1zdGF0ZS5sZW5ndGgmJiFzdGF0ZS5zeW5jPyhzdHJlYW0uZW1pdCgiZGF0YSIsY2h1bmspLHN0cmVhbS5yZWFkKDApKTooc3RhdGUubGVuZ3RoKz1zdGF0ZS5vYmplY3RNb2RlPzE6Y2h1bmsubGVuZ3RoLGFkZFRvRnJvbnQ/c3RhdGUuYnVmZmVyLnVuc2hpZnQoY2h1bmspOnN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKSxzdGF0ZS5uZWVkUmVhZGFibGUmJmVtaXRSZWFkYWJsZShzdHJlYW0pKSxtYXliZVJlYWRNb3JlKHN0cmVhbSxzdGF0ZSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlLnByb3RvdHlwZSwiZGVzdHJveWVkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuX3JlYWRhYmxlU3RhdGUmJnRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkfSxzZXQ6ZnVuY3Rpb24odmFsdWUpe3RoaXMuX3JlYWRhYmxlU3RhdGUmJih0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD12YWx1ZSl9fSksUmVhZGFibGUucHJvdG90eXBlLmRlc3Ryb3k9ZGVzdHJveUltcGwuZGVzdHJveSxSZWFkYWJsZS5wcm90b3R5cGUuX3VuZGVzdHJveT1kZXN0cm95SW1wbC51bmRlc3Ryb3ksUmVhZGFibGUucHJvdG90eXBlLl9kZXN0cm95PWZ1bmN0aW9uKGVycixjYil7dGhpcy5wdXNoKG51bGwpLGNiKGVycil9LFJlYWRhYmxlLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGNodW5rLGVuY29kaW5nKXt2YXIgc2tpcENodW5rQ2hlY2ssc3RhdGU9dGhpcy5fcmVhZGFibGVTdGF0ZTtyZXR1cm4gc3RhdGUub2JqZWN0TW9kZT9za2lwQ2h1bmtDaGVjaz0hMDoic3RyaW5nIj09dHlwZW9mIGNodW5rJiYoKGVuY29kaW5nPWVuY29kaW5nfHxzdGF0ZS5kZWZhdWx0RW5jb2RpbmcpIT09c3RhdGUuZW5jb2RpbmcmJihjaHVuaz1CdWZmZXIuZnJvbShjaHVuayxlbmNvZGluZyksZW5jb2Rpbmc9IiIpLHNraXBDaHVua0NoZWNrPSEwKSxyZWFkYWJsZUFkZENodW5rKHRoaXMsY2h1bmssZW5jb2RpbmcsITEsc2tpcENodW5rQ2hlY2spfSxSZWFkYWJsZS5wcm90b3R5cGUudW5zaGlmdD1mdW5jdGlvbihjaHVuayl7cmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcyxjaHVuayxudWxsLCEwLCExKX0sUmVhZGFibGUucHJvdG90eXBlLmlzUGF1c2VkPWZ1bmN0aW9uKCl7cmV0dXJuITE9PT10aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmd9LFJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZz1mdW5jdGlvbihlbmMpe3JldHVybiBTdHJpbmdEZWNvZGVyfHwoU3RyaW5nRGVjb2Rlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyaW5nX2RlY29kZXIvbGliL3N0cmluZ19kZWNvZGVyLmpzIikuU3RyaW5nRGVjb2RlciksdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyPW5ldyBTdHJpbmdEZWNvZGVyKGVuYyksdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZz1lbmMsdGhpc307ZnVuY3Rpb24gaG93TXVjaFRvUmVhZChuLHN0YXRlKXtyZXR1cm4gbjw9MHx8MD09PXN0YXRlLmxlbmd0aCYmc3RhdGUuZW5kZWQ/MDpzdGF0ZS5vYmplY3RNb2RlPzE6biE9bj9zdGF0ZS5mbG93aW5nJiZzdGF0ZS5sZW5ndGg/c3RhdGUuYnVmZmVyLmhlYWQuZGF0YS5sZW5ndGg6c3RhdGUubGVuZ3RoOihuPnN0YXRlLmhpZ2hXYXRlck1hcmsmJihzdGF0ZS5oaWdoV2F0ZXJNYXJrPWZ1bmN0aW9uIGNvbXB1dGVOZXdIaWdoV2F0ZXJNYXJrKG4pe3JldHVybiBuPj04Mzg4NjA4P249ODM4ODYwODoobi0tLG58PW4+Pj4xLG58PW4+Pj4yLG58PW4+Pj40LG58PW4+Pj44LG58PW4+Pj4xNixuKyspLG59KG4pKSxuPD1zdGF0ZS5sZW5ndGg/bjpzdGF0ZS5lbmRlZD9zdGF0ZS5sZW5ndGg6KHN0YXRlLm5lZWRSZWFkYWJsZT0hMCwwKSl9ZnVuY3Rpb24gZW1pdFJlYWRhYmxlKHN0cmVhbSl7dmFyIHN0YXRlPXN0cmVhbS5fcmVhZGFibGVTdGF0ZTtzdGF0ZS5uZWVkUmVhZGFibGU9ITEsc3RhdGUuZW1pdHRlZFJlYWRhYmxlfHwoZGVidWcoImVtaXRSZWFkYWJsZSIsc3RhdGUuZmxvd2luZyksc3RhdGUuZW1pdHRlZFJlYWRhYmxlPSEwLHN0YXRlLnN5bmM/cG5hLm5leHRUaWNrKGVtaXRSZWFkYWJsZV8sc3RyZWFtKTplbWl0UmVhZGFibGVfKHN0cmVhbSkpfWZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKXtkZWJ1ZygiZW1pdCByZWFkYWJsZSIpLHN0cmVhbS5lbWl0KCJyZWFkYWJsZSIpLGZsb3coc3RyZWFtKX1mdW5jdGlvbiBtYXliZVJlYWRNb3JlKHN0cmVhbSxzdGF0ZSl7c3RhdGUucmVhZGluZ01vcmV8fChzdGF0ZS5yZWFkaW5nTW9yZT0hMCxwbmEubmV4dFRpY2sobWF5YmVSZWFkTW9yZV8sc3RyZWFtLHN0YXRlKSl9ZnVuY3Rpb24gbWF5YmVSZWFkTW9yZV8oc3RyZWFtLHN0YXRlKXtmb3IodmFyIGxlbj1zdGF0ZS5sZW5ndGg7IXN0YXRlLnJlYWRpbmcmJiFzdGF0ZS5mbG93aW5nJiYhc3RhdGUuZW5kZWQmJnN0YXRlLmxlbmd0aDxzdGF0ZS5oaWdoV2F0ZXJNYXJrJiYoZGVidWcoIm1heWJlUmVhZE1vcmUgcmVhZCAwIiksc3RyZWFtLnJlYWQoMCksbGVuIT09c3RhdGUubGVuZ3RoKTspbGVuPXN0YXRlLmxlbmd0aDtzdGF0ZS5yZWFkaW5nTW9yZT0hMX1mdW5jdGlvbiBuUmVhZGluZ05leHRUaWNrKHNlbGYpe2RlYnVnKCJyZWFkYWJsZSBuZXh0dGljayByZWFkIDAiKSxzZWxmLnJlYWQoMCl9ZnVuY3Rpb24gcmVzdW1lXyhzdHJlYW0sc3RhdGUpe3N0YXRlLnJlYWRpbmd8fChkZWJ1ZygicmVzdW1lIHJlYWQgMCIpLHN0cmVhbS5yZWFkKDApKSxzdGF0ZS5yZXN1bWVTY2hlZHVsZWQ9ITEsc3RhdGUuYXdhaXREcmFpbj0wLHN0cmVhbS5lbWl0KCJyZXN1bWUiKSxmbG93KHN0cmVhbSksc3RhdGUuZmxvd2luZyYmIXN0YXRlLnJlYWRpbmcmJnN0cmVhbS5yZWFkKDApfWZ1bmN0aW9uIGZsb3coc3RyZWFtKXt2YXIgc3RhdGU9c3RyZWFtLl9yZWFkYWJsZVN0YXRlO2ZvcihkZWJ1ZygiZmxvdyIsc3RhdGUuZmxvd2luZyk7c3RhdGUuZmxvd2luZyYmbnVsbCE9PXN0cmVhbS5yZWFkKCk7KTt9ZnVuY3Rpb24gZnJvbUxpc3QobixzdGF0ZSl7cmV0dXJuIDA9PT1zdGF0ZS5sZW5ndGg/bnVsbDooc3RhdGUub2JqZWN0TW9kZT9yZXQ9c3RhdGUuYnVmZmVyLnNoaWZ0KCk6IW58fG4+PXN0YXRlLmxlbmd0aD8ocmV0PXN0YXRlLmRlY29kZXI/c3RhdGUuYnVmZmVyLmpvaW4oIiIpOjE9PT1zdGF0ZS5idWZmZXIubGVuZ3RoP3N0YXRlLmJ1ZmZlci5oZWFkLmRhdGE6c3RhdGUuYnVmZmVyLmNvbmNhdChzdGF0ZS5sZW5ndGgpLHN0YXRlLmJ1ZmZlci5jbGVhcigpKTpyZXQ9ZnVuY3Rpb24gZnJvbUxpc3RQYXJ0aWFsKG4sbGlzdCxoYXNTdHJpbmdzKXt2YXIgcmV0O248bGlzdC5oZWFkLmRhdGEubGVuZ3RoPyhyZXQ9bGlzdC5oZWFkLmRhdGEuc2xpY2UoMCxuKSxsaXN0LmhlYWQuZGF0YT1saXN0LmhlYWQuZGF0YS5zbGljZShuKSk6cmV0PW49PT1saXN0LmhlYWQuZGF0YS5sZW5ndGg/bGlzdC5zaGlmdCgpOmhhc1N0cmluZ3M/ZnVuY3Rpb24gY29weUZyb21CdWZmZXJTdHJpbmcobixsaXN0KXt2YXIgcD1saXN0LmhlYWQsYz0xLHJldD1wLmRhdGE7bi09cmV0Lmxlbmd0aDtmb3IoO3A9cC5uZXh0Oyl7dmFyIHN0cj1wLmRhdGEsbmI9bj5zdHIubGVuZ3RoP3N0ci5sZW5ndGg6bjtpZihuYj09PXN0ci5sZW5ndGg/cmV0Kz1zdHI6cmV0Kz1zdHIuc2xpY2UoMCxuKSwwPT09KG4tPW5iKSl7bmI9PT1zdHIubGVuZ3RoPygrK2MscC5uZXh0P2xpc3QuaGVhZD1wLm5leHQ6bGlzdC5oZWFkPWxpc3QudGFpbD1udWxsKToobGlzdC5oZWFkPXAscC5kYXRhPXN0ci5zbGljZShuYikpO2JyZWFrfSsrY31yZXR1cm4gbGlzdC5sZW5ndGgtPWMscmV0fShuLGxpc3QpOmZ1bmN0aW9uIGNvcHlGcm9tQnVmZmVyKG4sbGlzdCl7dmFyIHJldD1CdWZmZXIuYWxsb2NVbnNhZmUobikscD1saXN0LmhlYWQsYz0xO3AuZGF0YS5jb3B5KHJldCksbi09cC5kYXRhLmxlbmd0aDtmb3IoO3A9cC5uZXh0Oyl7dmFyIGJ1Zj1wLmRhdGEsbmI9bj5idWYubGVuZ3RoP2J1Zi5sZW5ndGg6bjtpZihidWYuY29weShyZXQscmV0Lmxlbmd0aC1uLDAsbmIpLDA9PT0obi09bmIpKXtuYj09PWJ1Zi5sZW5ndGg/KCsrYyxwLm5leHQ/bGlzdC5oZWFkPXAubmV4dDpsaXN0LmhlYWQ9bGlzdC50YWlsPW51bGwpOihsaXN0LmhlYWQ9cCxwLmRhdGE9YnVmLnNsaWNlKG5iKSk7YnJlYWt9KytjfXJldHVybiBsaXN0Lmxlbmd0aC09YyxyZXR9KG4sbGlzdCk7cmV0dXJuIHJldH0obixzdGF0ZS5idWZmZXIsc3RhdGUuZGVjb2RlcikscmV0KTt2YXIgcmV0fWZ1bmN0aW9uIGVuZFJlYWRhYmxlKHN0cmVhbSl7dmFyIHN0YXRlPXN0cmVhbS5fcmVhZGFibGVTdGF0ZTtpZihzdGF0ZS5sZW5ndGg+MCl0aHJvdyBuZXcgRXJyb3IoJyJlbmRSZWFkYWJsZSgpIiBjYWxsZWQgb24gbm9uLWVtcHR5IHN0cmVhbScpO3N0YXRlLmVuZEVtaXR0ZWR8fChzdGF0ZS5lbmRlZD0hMCxwbmEubmV4dFRpY2soZW5kUmVhZGFibGVOVCxzdGF0ZSxzdHJlYW0pKX1mdW5jdGlvbiBlbmRSZWFkYWJsZU5UKHN0YXRlLHN0cmVhbSl7c3RhdGUuZW5kRW1pdHRlZHx8MCE9PXN0YXRlLmxlbmd0aHx8KHN0YXRlLmVuZEVtaXR0ZWQ9ITAsc3RyZWFtLnJlYWRhYmxlPSExLHN0cmVhbS5lbWl0KCJlbmQiKSl9ZnVuY3Rpb24gaW5kZXhPZih4cyx4KXtmb3IodmFyIGk9MCxsPXhzLmxlbmd0aDtpPGw7aSsrKWlmKHhzW2ldPT09eClyZXR1cm4gaTtyZXR1cm4tMX1SZWFkYWJsZS5wcm90b3R5cGUucmVhZD1mdW5jdGlvbihuKXtkZWJ1ZygicmVhZCIsbiksbj1wYXJzZUludChuLDEwKTt2YXIgc3RhdGU9dGhpcy5fcmVhZGFibGVTdGF0ZSxuT3JpZz1uO2lmKDAhPT1uJiYoc3RhdGUuZW1pdHRlZFJlYWRhYmxlPSExKSwwPT09biYmc3RhdGUubmVlZFJlYWRhYmxlJiYoc3RhdGUubGVuZ3RoPj1zdGF0ZS5oaWdoV2F0ZXJNYXJrfHxzdGF0ZS5lbmRlZCkpcmV0dXJuIGRlYnVnKCJyZWFkOiBlbWl0UmVhZGFibGUiLHN0YXRlLmxlbmd0aCxzdGF0ZS5lbmRlZCksMD09PXN0YXRlLmxlbmd0aCYmc3RhdGUuZW5kZWQ/ZW5kUmVhZGFibGUodGhpcyk6ZW1pdFJlYWRhYmxlKHRoaXMpLG51bGw7aWYoMD09PShuPWhvd011Y2hUb1JlYWQobixzdGF0ZSkpJiZzdGF0ZS5lbmRlZClyZXR1cm4gMD09PXN0YXRlLmxlbmd0aCYmZW5kUmVhZGFibGUodGhpcyksbnVsbDt2YXIgcmV0LGRvUmVhZD1zdGF0ZS5uZWVkUmVhZGFibGU7cmV0dXJuIGRlYnVnKCJuZWVkIHJlYWRhYmxlIixkb1JlYWQpLCgwPT09c3RhdGUubGVuZ3RofHxzdGF0ZS5sZW5ndGgtbjxzdGF0ZS5oaWdoV2F0ZXJNYXJrKSYmZGVidWcoImxlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrIixkb1JlYWQ9ITApLHN0YXRlLmVuZGVkfHxzdGF0ZS5yZWFkaW5nP2RlYnVnKCJyZWFkaW5nIG9yIGVuZGVkIixkb1JlYWQ9ITEpOmRvUmVhZCYmKGRlYnVnKCJkbyByZWFkIiksc3RhdGUucmVhZGluZz0hMCxzdGF0ZS5zeW5jPSEwLDA9PT1zdGF0ZS5sZW5ndGgmJihzdGF0ZS5uZWVkUmVhZGFibGU9ITApLHRoaXMuX3JlYWQoc3RhdGUuaGlnaFdhdGVyTWFyayksc3RhdGUuc3luYz0hMSxzdGF0ZS5yZWFkaW5nfHwobj1ob3dNdWNoVG9SZWFkKG5PcmlnLHN0YXRlKSkpLG51bGw9PT0ocmV0PW4+MD9mcm9tTGlzdChuLHN0YXRlKTpudWxsKT8oc3RhdGUubmVlZFJlYWRhYmxlPSEwLG49MCk6c3RhdGUubGVuZ3RoLT1uLDA9PT1zdGF0ZS5sZW5ndGgmJihzdGF0ZS5lbmRlZHx8KHN0YXRlLm5lZWRSZWFkYWJsZT0hMCksbk9yaWchPT1uJiZzdGF0ZS5lbmRlZCYmZW5kUmVhZGFibGUodGhpcykpLG51bGwhPT1yZXQmJnRoaXMuZW1pdCgiZGF0YSIscmV0KSxyZXR9LFJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbihuKXt0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIl9yZWFkKCkgaXMgbm90IGltcGxlbWVudGVkIikpfSxSZWFkYWJsZS5wcm90b3R5cGUucGlwZT1mdW5jdGlvbihkZXN0LHBpcGVPcHRzKXt2YXIgc3JjPXRoaXMsc3RhdGU9dGhpcy5fcmVhZGFibGVTdGF0ZTtzd2l0Y2goc3RhdGUucGlwZXNDb3VudCl7Y2FzZSAwOnN0YXRlLnBpcGVzPWRlc3Q7YnJlYWs7Y2FzZSAxOnN0YXRlLnBpcGVzPVtzdGF0ZS5waXBlcyxkZXN0XTticmVhaztkZWZhdWx0OnN0YXRlLnBpcGVzLnB1c2goZGVzdCl9c3RhdGUucGlwZXNDb3VudCs9MSxkZWJ1ZygicGlwZSBjb3VudD0lZCBvcHRzPSVqIixzdGF0ZS5waXBlc0NvdW50LHBpcGVPcHRzKTt2YXIgZW5kRm49KCFwaXBlT3B0c3x8ITEhPT1waXBlT3B0cy5lbmQpJiZkZXN0IT09cHJvY2Vzcy5zdGRvdXQmJmRlc3QhPT1wcm9jZXNzLnN0ZGVycj9vbmVuZDp1bnBpcGU7ZnVuY3Rpb24gb251bnBpcGUocmVhZGFibGUsdW5waXBlSW5mbyl7ZGVidWcoIm9udW5waXBlIikscmVhZGFibGU9PT1zcmMmJnVucGlwZUluZm8mJiExPT09dW5waXBlSW5mby5oYXNVbnBpcGVkJiYodW5waXBlSW5mby5oYXNVbnBpcGVkPSEwLGZ1bmN0aW9uIGNsZWFudXAoKXtkZWJ1ZygiY2xlYW51cCIpLGRlc3QucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixvbmNsb3NlKSxkZXN0LnJlbW92ZUxpc3RlbmVyKCJmaW5pc2giLG9uZmluaXNoKSxkZXN0LnJlbW92ZUxpc3RlbmVyKCJkcmFpbiIsb25kcmFpbiksZGVzdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLG9uZXJyb3IpLGRlc3QucmVtb3ZlTGlzdGVuZXIoInVucGlwZSIsb251bnBpcGUpLHNyYy5yZW1vdmVMaXN0ZW5lcigiZW5kIixvbmVuZCksc3JjLnJlbW92ZUxpc3RlbmVyKCJlbmQiLHVucGlwZSksc3JjLnJlbW92ZUxpc3RlbmVyKCJkYXRhIixvbmRhdGEpLGNsZWFuZWRVcD0hMCwhc3RhdGUuYXdhaXREcmFpbnx8ZGVzdC5fd3JpdGFibGVTdGF0ZSYmIWRlc3QuX3dyaXRhYmxlU3RhdGUubmVlZERyYWlufHxvbmRyYWluKCl9KCkpfWZ1bmN0aW9uIG9uZW5kKCl7ZGVidWcoIm9uZW5kIiksZGVzdC5lbmQoKX1zdGF0ZS5lbmRFbWl0dGVkP3BuYS5uZXh0VGljayhlbmRGbik6c3JjLm9uY2UoImVuZCIsZW5kRm4pLGRlc3Qub24oInVucGlwZSIsb251bnBpcGUpO3ZhciBvbmRyYWluPWZ1bmN0aW9uIHBpcGVPbkRyYWluKHNyYyl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHN0YXRlPXNyYy5fcmVhZGFibGVTdGF0ZTtkZWJ1ZygicGlwZU9uRHJhaW4iLHN0YXRlLmF3YWl0RHJhaW4pLHN0YXRlLmF3YWl0RHJhaW4mJnN0YXRlLmF3YWl0RHJhaW4tLSwwPT09c3RhdGUuYXdhaXREcmFpbiYmRUVsaXN0ZW5lckNvdW50KHNyYywiZGF0YSIpJiYoc3RhdGUuZmxvd2luZz0hMCxmbG93KHNyYykpfX0oc3JjKTtkZXN0Lm9uKCJkcmFpbiIsb25kcmFpbik7dmFyIGNsZWFuZWRVcD0hMTt2YXIgaW5jcmVhc2VkQXdhaXREcmFpbj0hMTtmdW5jdGlvbiBvbmRhdGEoY2h1bmspe2RlYnVnKCJvbmRhdGEiKSxpbmNyZWFzZWRBd2FpdERyYWluPSExLCExIT09ZGVzdC53cml0ZShjaHVuayl8fGluY3JlYXNlZEF3YWl0RHJhaW58fCgoMT09PXN0YXRlLnBpcGVzQ291bnQmJnN0YXRlLnBpcGVzPT09ZGVzdHx8c3RhdGUucGlwZXNDb3VudD4xJiYtMSE9PWluZGV4T2Yoc3RhdGUucGlwZXMsZGVzdCkpJiYhY2xlYW5lZFVwJiYoZGVidWcoImZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZSIsc3RhdGUuYXdhaXREcmFpbiksc3RhdGUuYXdhaXREcmFpbisrLGluY3JlYXNlZEF3YWl0RHJhaW49ITApLHNyYy5wYXVzZSgpKX1mdW5jdGlvbiBvbmVycm9yKGVyKXtkZWJ1Zygib25lcnJvciIsZXIpLHVucGlwZSgpLGRlc3QucmVtb3ZlTGlzdGVuZXIoImVycm9yIixvbmVycm9yKSwwPT09RUVsaXN0ZW5lckNvdW50KGRlc3QsImVycm9yIikmJmRlc3QuZW1pdCgiZXJyb3IiLGVyKX1mdW5jdGlvbiBvbmNsb3NlKCl7ZGVzdC5yZW1vdmVMaXN0ZW5lcigiZmluaXNoIixvbmZpbmlzaCksdW5waXBlKCl9ZnVuY3Rpb24gb25maW5pc2goKXtkZWJ1Zygib25maW5pc2giKSxkZXN0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsb25jbG9zZSksdW5waXBlKCl9ZnVuY3Rpb24gdW5waXBlKCl7ZGVidWcoInVucGlwZSIpLHNyYy51bnBpcGUoZGVzdCl9cmV0dXJuIHNyYy5vbigiZGF0YSIsb25kYXRhKSxmdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIoZW1pdHRlcixldmVudCxmbil7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyKXJldHVybiBlbWl0dGVyLnByZXBlbmRMaXN0ZW5lcihldmVudCxmbik7ZW1pdHRlci5fZXZlbnRzJiZlbWl0dGVyLl9ldmVudHNbZXZlbnRdP2lzQXJyYXkoZW1pdHRlci5fZXZlbnRzW2V2ZW50XSk/ZW1pdHRlci5fZXZlbnRzW2V2ZW50XS51bnNoaWZ0KGZuKTplbWl0dGVyLl9ldmVudHNbZXZlbnRdPVtmbixlbWl0dGVyLl9ldmVudHNbZXZlbnRdXTplbWl0dGVyLm9uKGV2ZW50LGZuKX0oZGVzdCwiZXJyb3IiLG9uZXJyb3IpLGRlc3Qub25jZSgiY2xvc2UiLG9uY2xvc2UpLGRlc3Qub25jZSgiZmluaXNoIixvbmZpbmlzaCksZGVzdC5lbWl0KCJwaXBlIixzcmMpLHN0YXRlLmZsb3dpbmd8fChkZWJ1ZygicGlwZSByZXN1bWUiKSxzcmMucmVzdW1lKCkpLGRlc3R9LFJlYWRhYmxlLnByb3RvdHlwZS51bnBpcGU9ZnVuY3Rpb24oZGVzdCl7dmFyIHN0YXRlPXRoaXMuX3JlYWRhYmxlU3RhdGUsdW5waXBlSW5mbz17aGFzVW5waXBlZDohMX07aWYoMD09PXN0YXRlLnBpcGVzQ291bnQpcmV0dXJuIHRoaXM7aWYoMT09PXN0YXRlLnBpcGVzQ291bnQpcmV0dXJuIGRlc3QmJmRlc3QhPT1zdGF0ZS5waXBlc3x8KGRlc3R8fChkZXN0PXN0YXRlLnBpcGVzKSxzdGF0ZS5waXBlcz1udWxsLHN0YXRlLnBpcGVzQ291bnQ9MCxzdGF0ZS5mbG93aW5nPSExLGRlc3QmJmRlc3QuZW1pdCgidW5waXBlIix0aGlzLHVucGlwZUluZm8pKSx0aGlzO2lmKCFkZXN0KXt2YXIgZGVzdHM9c3RhdGUucGlwZXMsbGVuPXN0YXRlLnBpcGVzQ291bnQ7c3RhdGUucGlwZXM9bnVsbCxzdGF0ZS5waXBlc0NvdW50PTAsc3RhdGUuZmxvd2luZz0hMTtmb3IodmFyIGk9MDtpPGxlbjtpKyspZGVzdHNbaV0uZW1pdCgidW5waXBlIix0aGlzLHtoYXNVbnBpcGVkOiExfSk7cmV0dXJuIHRoaXN9dmFyIGluZGV4PWluZGV4T2Yoc3RhdGUucGlwZXMsZGVzdCk7cmV0dXJuLTE9PT1pbmRleHx8KHN0YXRlLnBpcGVzLnNwbGljZShpbmRleCwxKSxzdGF0ZS5waXBlc0NvdW50LT0xLDE9PT1zdGF0ZS5waXBlc0NvdW50JiYoc3RhdGUucGlwZXM9c3RhdGUucGlwZXNbMF0pLGRlc3QuZW1pdCgidW5waXBlIix0aGlzLHVucGlwZUluZm8pKSx0aGlzfSxSZWFkYWJsZS5wcm90b3R5cGUub249ZnVuY3Rpb24oZXYsZm4pe3ZhciByZXM9U3RyZWFtLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsZXYsZm4pO2lmKCJkYXRhIj09PWV2KSExIT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nJiZ0aGlzLnJlc3VtZSgpO2Vsc2UgaWYoInJlYWRhYmxlIj09PWV2KXt2YXIgc3RhdGU9dGhpcy5fcmVhZGFibGVTdGF0ZTtzdGF0ZS5lbmRFbWl0dGVkfHxzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZ3x8KHN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nPXN0YXRlLm5lZWRSZWFkYWJsZT0hMCxzdGF0ZS5lbWl0dGVkUmVhZGFibGU9ITEsc3RhdGUucmVhZGluZz9zdGF0ZS5sZW5ndGgmJmVtaXRSZWFkYWJsZSh0aGlzKTpwbmEubmV4dFRpY2soblJlYWRpbmdOZXh0VGljayx0aGlzKSl9cmV0dXJuIHJlc30sUmVhZGFibGUucHJvdG90eXBlLmFkZExpc3RlbmVyPVJlYWRhYmxlLnByb3RvdHlwZS5vbixSZWFkYWJsZS5wcm90b3R5cGUucmVzdW1lPWZ1bmN0aW9uKCl7dmFyIHN0YXRlPXRoaXMuX3JlYWRhYmxlU3RhdGU7cmV0dXJuIHN0YXRlLmZsb3dpbmd8fChkZWJ1ZygicmVzdW1lIiksc3RhdGUuZmxvd2luZz0hMCxmdW5jdGlvbiByZXN1bWUoc3RyZWFtLHN0YXRlKXtzdGF0ZS5yZXN1bWVTY2hlZHVsZWR8fChzdGF0ZS5yZXN1bWVTY2hlZHVsZWQ9ITAscG5hLm5leHRUaWNrKHJlc3VtZV8sc3RyZWFtLHN0YXRlKSl9KHRoaXMsc3RhdGUpKSx0aGlzfSxSZWFkYWJsZS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXtyZXR1cm4gZGVidWcoImNhbGwgcGF1c2UgZmxvd2luZz0laiIsdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSwhMSE9PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyYmKGRlYnVnKCJwYXVzZSIpLHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZz0hMSx0aGlzLmVtaXQoInBhdXNlIikpLHRoaXN9LFJlYWRhYmxlLnByb3RvdHlwZS53cmFwPWZ1bmN0aW9uKHN0cmVhbSl7dmFyIF90aGlzPXRoaXMsc3RhdGU9dGhpcy5fcmVhZGFibGVTdGF0ZSxwYXVzZWQ9ITE7Zm9yKHZhciBpIGluIHN0cmVhbS5vbigiZW5kIixmdW5jdGlvbigpe2lmKGRlYnVnKCJ3cmFwcGVkIGVuZCIpLHN0YXRlLmRlY29kZXImJiFzdGF0ZS5lbmRlZCl7dmFyIGNodW5rPXN0YXRlLmRlY29kZXIuZW5kKCk7Y2h1bmsmJmNodW5rLmxlbmd0aCYmX3RoaXMucHVzaChjaHVuayl9X3RoaXMucHVzaChudWxsKX0pLHN0cmVhbS5vbigiZGF0YSIsZnVuY3Rpb24oY2h1bmspeyhkZWJ1Zygid3JhcHBlZCBkYXRhIiksc3RhdGUuZGVjb2RlciYmKGNodW5rPXN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspKSxzdGF0ZS5vYmplY3RNb2RlJiZudWxsPT1jaHVuayl8fChzdGF0ZS5vYmplY3RNb2RlfHxjaHVuayYmY2h1bmsubGVuZ3RoKSYmKF90aGlzLnB1c2goY2h1bmspfHwocGF1c2VkPSEwLHN0cmVhbS5wYXVzZSgpKSl9KSxzdHJlYW0pdm9pZCAwPT09dGhpc1tpXSYmImZ1bmN0aW9uIj09dHlwZW9mIHN0cmVhbVtpXSYmKHRoaXNbaV09ZnVuY3Rpb24obWV0aG9kKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gc3RyZWFtW21ldGhvZF0uYXBwbHkoc3RyZWFtLGFyZ3VtZW50cyl9fShpKSk7Zm9yKHZhciBuPTA7bjxrUHJveHlFdmVudHMubGVuZ3RoO24rKylzdHJlYW0ub24oa1Byb3h5RXZlbnRzW25dLHRoaXMuZW1pdC5iaW5kKHRoaXMsa1Byb3h5RXZlbnRzW25dKSk7cmV0dXJuIHRoaXMuX3JlYWQ9ZnVuY3Rpb24obil7ZGVidWcoIndyYXBwZWQgX3JlYWQiLG4pLHBhdXNlZCYmKHBhdXNlZD0hMSxzdHJlYW0ucmVzdW1lKCkpfSx0aGlzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGUucHJvdG90eXBlLCJyZWFkYWJsZUhpZ2hXYXRlck1hcmsiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcmt9fSksUmVhZGFibGUuX2Zyb21MaXN0PWZyb21MaXN0fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO21vZHVsZS5leHBvcnRzPVRyYW5zZm9ybTt2YXIgRHVwbGV4PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fZHVwbGV4LmpzIiksdXRpbD1PYmplY3QuY3JlYXRlKF9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLXV0aWwtaXMvbGliL3V0aWwuanMiKSk7ZnVuY3Rpb24gYWZ0ZXJUcmFuc2Zvcm0oZXIsZGF0YSl7dmFyIHRzPXRoaXMuX3RyYW5zZm9ybVN0YXRlO3RzLnRyYW5zZm9ybWluZz0hMTt2YXIgY2I9dHMud3JpdGVjYjtpZighY2IpcmV0dXJuIHRoaXMuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigid3JpdGUgY2FsbGJhY2sgY2FsbGVkIG11bHRpcGxlIHRpbWVzIikpO3RzLndyaXRlY2h1bms9bnVsbCx0cy53cml0ZWNiPW51bGwsbnVsbCE9ZGF0YSYmdGhpcy5wdXNoKGRhdGEpLGNiKGVyKTt2YXIgcnM9dGhpcy5fcmVhZGFibGVTdGF0ZTtycy5yZWFkaW5nPSExLChycy5uZWVkUmVhZGFibGV8fHJzLmxlbmd0aDxycy5oaWdoV2F0ZXJNYXJrKSYmdGhpcy5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKX1mdW5jdGlvbiBUcmFuc2Zvcm0ob3B0aW9ucyl7aWYoISh0aGlzIGluc3RhbmNlb2YgVHJhbnNmb3JtKSlyZXR1cm4gbmV3IFRyYW5zZm9ybShvcHRpb25zKTtEdXBsZXguY2FsbCh0aGlzLG9wdGlvbnMpLHRoaXMuX3RyYW5zZm9ybVN0YXRlPXthZnRlclRyYW5zZm9ybTphZnRlclRyYW5zZm9ybS5iaW5kKHRoaXMpLG5lZWRUcmFuc2Zvcm06ITEsdHJhbnNmb3JtaW5nOiExLHdyaXRlY2I6bnVsbCx3cml0ZWNodW5rOm51bGwsd3JpdGVlbmNvZGluZzpudWxsfSx0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZT0hMCx0aGlzLl9yZWFkYWJsZVN0YXRlLnN5bmM9ITEsb3B0aW9ucyYmKCJmdW5jdGlvbiI9PXR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybSYmKHRoaXMuX3RyYW5zZm9ybT1vcHRpb25zLnRyYW5zZm9ybSksImZ1bmN0aW9uIj09dHlwZW9mIG9wdGlvbnMuZmx1c2gmJih0aGlzLl9mbHVzaD1vcHRpb25zLmZsdXNoKSksdGhpcy5vbigicHJlZmluaXNoIixwcmVmaW5pc2gpfWZ1bmN0aW9uIHByZWZpbmlzaCgpe3ZhciBfdGhpcz10aGlzOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLl9mbHVzaD90aGlzLl9mbHVzaChmdW5jdGlvbihlcixkYXRhKXtkb25lKF90aGlzLGVyLGRhdGEpfSk6ZG9uZSh0aGlzLG51bGwsbnVsbCl9ZnVuY3Rpb24gZG9uZShzdHJlYW0sZXIsZGF0YSl7aWYoZXIpcmV0dXJuIHN0cmVhbS5lbWl0KCJlcnJvciIsZXIpO2lmKG51bGwhPWRhdGEmJnN0cmVhbS5wdXNoKGRhdGEpLHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAiKTtpZihzdHJlYW0uX3RyYW5zZm9ybVN0YXRlLnRyYW5zZm9ybWluZyl0aHJvdyBuZXcgRXJyb3IoIkNhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiBzdGlsbCB0cmFuc2Zvcm1pbmciKTtyZXR1cm4gc3RyZWFtLnB1c2gobnVsbCl9dXRpbC5pbmhlcml0cz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIpLHV0aWwuaW5oZXJpdHMoVHJhbnNmb3JtLER1cGxleCksVHJhbnNmb3JtLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGNodW5rLGVuY29kaW5nKXtyZXR1cm4gdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybT0hMSxEdXBsZXgucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLGNodW5rLGVuY29kaW5nKX0sVHJhbnNmb3JtLnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKGNodW5rLGVuY29kaW5nLGNiKXt0aHJvdyBuZXcgRXJyb3IoIl90cmFuc2Zvcm0oKSBpcyBub3QgaW1wbGVtZW50ZWQiKX0sVHJhbnNmb3JtLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24oY2h1bmssZW5jb2RpbmcsY2Ipe3ZhciB0cz10aGlzLl90cmFuc2Zvcm1TdGF0ZTtpZih0cy53cml0ZWNiPWNiLHRzLndyaXRlY2h1bms9Y2h1bmssdHMud3JpdGVlbmNvZGluZz1lbmNvZGluZywhdHMudHJhbnNmb3JtaW5nKXt2YXIgcnM9dGhpcy5fcmVhZGFibGVTdGF0ZTsodHMubmVlZFRyYW5zZm9ybXx8cnMubmVlZFJlYWRhYmxlfHxycy5sZW5ndGg8cnMuaGlnaFdhdGVyTWFyaykmJnRoaXMuX3JlYWQocnMuaGlnaFdhdGVyTWFyayl9fSxUcmFuc2Zvcm0ucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKG4pe3ZhciB0cz10aGlzLl90cmFuc2Zvcm1TdGF0ZTtudWxsIT09dHMud3JpdGVjaHVuayYmdHMud3JpdGVjYiYmIXRzLnRyYW5zZm9ybWluZz8odHMudHJhbnNmb3JtaW5nPSEwLHRoaXMuX3RyYW5zZm9ybSh0cy53cml0ZWNodW5rLHRzLndyaXRlZW5jb2RpbmcsdHMuYWZ0ZXJUcmFuc2Zvcm0pKTp0cy5uZWVkVHJhbnNmb3JtPSEwfSxUcmFuc2Zvcm0ucHJvdG90eXBlLl9kZXN0cm95PWZ1bmN0aW9uKGVycixjYil7dmFyIF90aGlzMj10aGlzO0R1cGxleC5wcm90b3R5cGUuX2Rlc3Ryb3kuY2FsbCh0aGlzLGVycixmdW5jdGlvbihlcnIyKXtjYihlcnIyKSxfdGhpczIuZW1pdCgiY2xvc2UiKX0pfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fd3JpdGFibGUuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBwcm9jZXNzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9ub2RlLXN0ZGxpYi1icm93c2VyL2Nqcy9wcm94eS9wcm9jZXNzLmpzIikscG5hPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9wcm9jZXNzLW5leHRpY2stYXJncy9pbmRleC5qcyIpO2Z1bmN0aW9uIENvcmtlZFJlcXVlc3Qoc3RhdGUpe3ZhciBfdGhpcz10aGlzO3RoaXMubmV4dD1udWxsLHRoaXMuZW50cnk9bnVsbCx0aGlzLmZpbmlzaD1mdW5jdGlvbigpeyFmdW5jdGlvbiBvbkNvcmtlZEZpbmlzaChjb3JrUmVxLHN0YXRlLGVycil7dmFyIGVudHJ5PWNvcmtSZXEuZW50cnk7Y29ya1JlcS5lbnRyeT1udWxsO2Zvcig7ZW50cnk7KXt2YXIgY2I9ZW50cnkuY2FsbGJhY2s7c3RhdGUucGVuZGluZ2NiLS0sY2IoZXJyKSxlbnRyeT1lbnRyeS5uZXh0fXN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZS5uZXh0PWNvcmtSZXF9KF90aGlzLHN0YXRlKX19bW9kdWxlLmV4cG9ydHM9V3JpdGFibGU7dmFyIER1cGxleCxhc3luY1dyaXRlPSFwcm9jZXNzLmJyb3dzZXImJlsidjAuMTAiLCJ2MC45LiJdLmluZGV4T2YocHJvY2Vzcy52ZXJzaW9uLnNsaWNlKDAsNSkpPi0xP3NldEltbWVkaWF0ZTpwbmEubmV4dFRpY2s7V3JpdGFibGUuV3JpdGFibGVTdGF0ZT1Xcml0YWJsZVN0YXRlO3ZhciB1dGlsPU9iamVjdC5jcmVhdGUoX193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtdXRpbC1pcy9saWIvdXRpbC5qcyIpKTt1dGlsLmluaGVyaXRzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIik7dmFyIGludGVybmFsVXRpbD17ZGVwcmVjYXRlOl9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy91dGlsLWRlcHJlY2F0ZS9icm93c2VyLmpzIil9LFN0cmVhbT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3N0cmVhbS1icm93c2VyLmpzIiksQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbm9kZV9tb2R1bGVzL3NhZmUtYnVmZmVyL2luZGV4LmpzIikuQnVmZmVyLE91clVpbnQ4QXJyYXk9KHZvaWQgMCE9PV9fd2VicGFja19yZXF1aXJlX18uZz9fX3dlYnBhY2tfcmVxdWlyZV9fLmc6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnt9KS5VaW50OEFycmF5fHxmdW5jdGlvbigpe307dmFyIHJlYWxIYXNJbnN0YW5jZSxkZXN0cm95SW1wbD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3kuanMiKTtmdW5jdGlvbiBub3AoKXt9ZnVuY3Rpb24gV3JpdGFibGVTdGF0ZShvcHRpb25zLHN0cmVhbSl7RHVwbGV4PUR1cGxleHx8X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9kdXBsZXguanMiKSxvcHRpb25zPW9wdGlvbnN8fHt9O3ZhciBpc0R1cGxleD1zdHJlYW0gaW5zdGFuY2VvZiBEdXBsZXg7dGhpcy5vYmplY3RNb2RlPSEhb3B0aW9ucy5vYmplY3RNb2RlLGlzRHVwbGV4JiYodGhpcy5vYmplY3RNb2RlPXRoaXMub2JqZWN0TW9kZXx8ISFvcHRpb25zLndyaXRhYmxlT2JqZWN0TW9kZSk7dmFyIGh3bT1vcHRpb25zLmhpZ2hXYXRlck1hcmssd3JpdGFibGVId209b3B0aW9ucy53cml0YWJsZUhpZ2hXYXRlck1hcmssZGVmYXVsdEh3bT10aGlzLm9iamVjdE1vZGU/MTY6MTYzODQ7dGhpcy5oaWdoV2F0ZXJNYXJrPWh3bXx8MD09PWh3bT9od206aXNEdXBsZXgmJih3cml0YWJsZUh3bXx8MD09PXdyaXRhYmxlSHdtKT93cml0YWJsZUh3bTpkZWZhdWx0SHdtLHRoaXMuaGlnaFdhdGVyTWFyaz1NYXRoLmZsb29yKHRoaXMuaGlnaFdhdGVyTWFyayksdGhpcy5maW5hbENhbGxlZD0hMSx0aGlzLm5lZWREcmFpbj0hMSx0aGlzLmVuZGluZz0hMSx0aGlzLmVuZGVkPSExLHRoaXMuZmluaXNoZWQ9ITEsdGhpcy5kZXN0cm95ZWQ9ITE7dmFyIG5vRGVjb2RlPSExPT09b3B0aW9ucy5kZWNvZGVTdHJpbmdzO3RoaXMuZGVjb2RlU3RyaW5ncz0hbm9EZWNvZGUsdGhpcy5kZWZhdWx0RW5jb2Rpbmc9b3B0aW9ucy5kZWZhdWx0RW5jb2Rpbmd8fCJ1dGY4Iix0aGlzLmxlbmd0aD0wLHRoaXMud3JpdGluZz0hMSx0aGlzLmNvcmtlZD0wLHRoaXMuc3luYz0hMCx0aGlzLmJ1ZmZlclByb2Nlc3Npbmc9ITEsdGhpcy5vbndyaXRlPWZ1bmN0aW9uKGVyKXshZnVuY3Rpb24gb253cml0ZShzdHJlYW0sZXIpe3ZhciBzdGF0ZT1zdHJlYW0uX3dyaXRhYmxlU3RhdGUsc3luYz1zdGF0ZS5zeW5jLGNiPXN0YXRlLndyaXRlY2I7aWYoZnVuY3Rpb24gb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKXtzdGF0ZS53cml0aW5nPSExLHN0YXRlLndyaXRlY2I9bnVsbCxzdGF0ZS5sZW5ndGgtPXN0YXRlLndyaXRlbGVuLHN0YXRlLndyaXRlbGVuPTB9KHN0YXRlKSxlcikhZnVuY3Rpb24gb253cml0ZUVycm9yKHN0cmVhbSxzdGF0ZSxzeW5jLGVyLGNiKXstLXN0YXRlLnBlbmRpbmdjYixzeW5jPyhwbmEubmV4dFRpY2soY2IsZXIpLHBuYS5uZXh0VGljayhmaW5pc2hNYXliZSxzdHJlYW0sc3RhdGUpLHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITAsc3RyZWFtLmVtaXQoImVycm9yIixlcikpOihjYihlciksc3RyZWFtLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMCxzdHJlYW0uZW1pdCgiZXJyb3IiLGVyKSxmaW5pc2hNYXliZShzdHJlYW0sc3RhdGUpKX0oc3RyZWFtLHN0YXRlLHN5bmMsZXIsY2IpO2Vsc2V7dmFyIGZpbmlzaGVkPW5lZWRGaW5pc2goc3RhdGUpO2ZpbmlzaGVkfHxzdGF0ZS5jb3JrZWR8fHN0YXRlLmJ1ZmZlclByb2Nlc3Npbmd8fCFzdGF0ZS5idWZmZXJlZFJlcXVlc3R8fGNsZWFyQnVmZmVyKHN0cmVhbSxzdGF0ZSksc3luYz9hc3luY1dyaXRlKGFmdGVyV3JpdGUsc3RyZWFtLHN0YXRlLGZpbmlzaGVkLGNiKTphZnRlcldyaXRlKHN0cmVhbSxzdGF0ZSxmaW5pc2hlZCxjYil9fShzdHJlYW0sZXIpfSx0aGlzLndyaXRlY2I9bnVsbCx0aGlzLndyaXRlbGVuPTAsdGhpcy5idWZmZXJlZFJlcXVlc3Q9bnVsbCx0aGlzLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCx0aGlzLnBlbmRpbmdjYj0wLHRoaXMucHJlZmluaXNoZWQ9ITEsdGhpcy5lcnJvckVtaXR0ZWQ9ITEsdGhpcy5idWZmZXJlZFJlcXVlc3RDb3VudD0wLHRoaXMuY29ya2VkUmVxdWVzdHNGcmVlPW5ldyBDb3JrZWRSZXF1ZXN0KHRoaXMpfWZ1bmN0aW9uIFdyaXRhYmxlKG9wdGlvbnMpe2lmKER1cGxleD1EdXBsZXh8fF9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fZHVwbGV4LmpzIiksIShyZWFsSGFzSW5zdGFuY2UuY2FsbChXcml0YWJsZSx0aGlzKXx8dGhpcyBpbnN0YW5jZW9mIER1cGxleCkpcmV0dXJuIG5ldyBXcml0YWJsZShvcHRpb25zKTt0aGlzLl93cml0YWJsZVN0YXRlPW5ldyBXcml0YWJsZVN0YXRlKG9wdGlvbnMsdGhpcyksdGhpcy53cml0YWJsZT0hMCxvcHRpb25zJiYoImZ1bmN0aW9uIj09dHlwZW9mIG9wdGlvbnMud3JpdGUmJih0aGlzLl93cml0ZT1vcHRpb25zLndyaXRlKSwiZnVuY3Rpb24iPT10eXBlb2Ygb3B0aW9ucy53cml0ZXYmJih0aGlzLl93cml0ZXY9b3B0aW9ucy53cml0ZXYpLCJmdW5jdGlvbiI9PXR5cGVvZiBvcHRpb25zLmRlc3Ryb3kmJih0aGlzLl9kZXN0cm95PW9wdGlvbnMuZGVzdHJveSksImZ1bmN0aW9uIj09dHlwZW9mIG9wdGlvbnMuZmluYWwmJih0aGlzLl9maW5hbD1vcHRpb25zLmZpbmFsKSksU3RyZWFtLmNhbGwodGhpcyl9ZnVuY3Rpb24gZG9Xcml0ZShzdHJlYW0sc3RhdGUsd3JpdGV2LGxlbixjaHVuayxlbmNvZGluZyxjYil7c3RhdGUud3JpdGVsZW49bGVuLHN0YXRlLndyaXRlY2I9Y2Isc3RhdGUud3JpdGluZz0hMCxzdGF0ZS5zeW5jPSEwLHdyaXRldj9zdHJlYW0uX3dyaXRldihjaHVuayxzdGF0ZS5vbndyaXRlKTpzdHJlYW0uX3dyaXRlKGNodW5rLGVuY29kaW5nLHN0YXRlLm9ud3JpdGUpLHN0YXRlLnN5bmM9ITF9ZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sc3RhdGUsZmluaXNoZWQsY2Ipe2ZpbmlzaGVkfHxmdW5jdGlvbiBvbndyaXRlRHJhaW4oc3RyZWFtLHN0YXRlKXswPT09c3RhdGUubGVuZ3RoJiZzdGF0ZS5uZWVkRHJhaW4mJihzdGF0ZS5uZWVkRHJhaW49ITEsc3RyZWFtLmVtaXQoImRyYWluIikpfShzdHJlYW0sc3RhdGUpLHN0YXRlLnBlbmRpbmdjYi0tLGNiKCksZmluaXNoTWF5YmUoc3RyZWFtLHN0YXRlKX1mdW5jdGlvbiBjbGVhckJ1ZmZlcihzdHJlYW0sc3RhdGUpe3N0YXRlLmJ1ZmZlclByb2Nlc3Npbmc9ITA7dmFyIGVudHJ5PXN0YXRlLmJ1ZmZlcmVkUmVxdWVzdDtpZihzdHJlYW0uX3dyaXRldiYmZW50cnkmJmVudHJ5Lm5leHQpe3ZhciBsPXN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50LGJ1ZmZlcj1uZXcgQXJyYXkobCksaG9sZGVyPXN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZTtob2xkZXIuZW50cnk9ZW50cnk7Zm9yKHZhciBjb3VudD0wLGFsbEJ1ZmZlcnM9ITA7ZW50cnk7KWJ1ZmZlcltjb3VudF09ZW50cnksZW50cnkuaXNCdWZ8fChhbGxCdWZmZXJzPSExKSxlbnRyeT1lbnRyeS5uZXh0LGNvdW50Kz0xO2J1ZmZlci5hbGxCdWZmZXJzPWFsbEJ1ZmZlcnMsZG9Xcml0ZShzdHJlYW0sc3RhdGUsITAsc3RhdGUubGVuZ3RoLGJ1ZmZlciwiIixob2xkZXIuZmluaXNoKSxzdGF0ZS5wZW5kaW5nY2IrKyxzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwsaG9sZGVyLm5leHQ/KHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZT1ob2xkZXIubmV4dCxob2xkZXIubmV4dD1udWxsKTpzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IENvcmtlZFJlcXVlc3Qoc3RhdGUpLHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50PTB9ZWxzZXtmb3IoO2VudHJ5Oyl7dmFyIGNodW5rPWVudHJ5LmNodW5rLGVuY29kaW5nPWVudHJ5LmVuY29kaW5nLGNiPWVudHJ5LmNhbGxiYWNrO2lmKGRvV3JpdGUoc3RyZWFtLHN0YXRlLCExLHN0YXRlLm9iamVjdE1vZGU/MTpjaHVuay5sZW5ndGgsY2h1bmssZW5jb2RpbmcsY2IpLGVudHJ5PWVudHJ5Lm5leHQsc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQtLSxzdGF0ZS53cml0aW5nKWJyZWFrfW51bGw9PT1lbnRyeSYmKHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCl9c3RhdGUuYnVmZmVyZWRSZXF1ZXN0PWVudHJ5LHN0YXRlLmJ1ZmZlclByb2Nlc3Npbmc9ITF9ZnVuY3Rpb24gbmVlZEZpbmlzaChzdGF0ZSl7cmV0dXJuIHN0YXRlLmVuZGluZyYmMD09PXN0YXRlLmxlbmd0aCYmbnVsbD09PXN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCYmIXN0YXRlLmZpbmlzaGVkJiYhc3RhdGUud3JpdGluZ31mdW5jdGlvbiBjYWxsRmluYWwoc3RyZWFtLHN0YXRlKXtzdHJlYW0uX2ZpbmFsKGZ1bmN0aW9uKGVycil7c3RhdGUucGVuZGluZ2NiLS0sZXJyJiZzdHJlYW0uZW1pdCgiZXJyb3IiLGVyciksc3RhdGUucHJlZmluaXNoZWQ9ITAsc3RyZWFtLmVtaXQoInByZWZpbmlzaCIpLGZpbmlzaE1heWJlKHN0cmVhbSxzdGF0ZSl9KX1mdW5jdGlvbiBmaW5pc2hNYXliZShzdHJlYW0sc3RhdGUpe3ZhciBuZWVkPW5lZWRGaW5pc2goc3RhdGUpO3JldHVybiBuZWVkJiYoIWZ1bmN0aW9uIHByZWZpbmlzaChzdHJlYW0sc3RhdGUpe3N0YXRlLnByZWZpbmlzaGVkfHxzdGF0ZS5maW5hbENhbGxlZHx8KCJmdW5jdGlvbiI9PXR5cGVvZiBzdHJlYW0uX2ZpbmFsPyhzdGF0ZS5wZW5kaW5nY2IrKyxzdGF0ZS5maW5hbENhbGxlZD0hMCxwbmEubmV4dFRpY2soY2FsbEZpbmFsLHN0cmVhbSxzdGF0ZSkpOihzdGF0ZS5wcmVmaW5pc2hlZD0hMCxzdHJlYW0uZW1pdCgicHJlZmluaXNoIikpKX0oc3RyZWFtLHN0YXRlKSwwPT09c3RhdGUucGVuZGluZ2NiJiYoc3RhdGUuZmluaXNoZWQ9ITAsc3RyZWFtLmVtaXQoImZpbmlzaCIpKSksbmVlZH11dGlsLmluaGVyaXRzKFdyaXRhYmxlLFN0cmVhbSksV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUuZ2V0QnVmZmVyPWZ1bmN0aW9uIGdldEJ1ZmZlcigpe2Zvcih2YXIgY3VycmVudD10aGlzLmJ1ZmZlcmVkUmVxdWVzdCxvdXQ9W107Y3VycmVudDspb3V0LnB1c2goY3VycmVudCksY3VycmVudD1jdXJyZW50Lm5leHQ7cmV0dXJuIG91dH0sZnVuY3Rpb24oKXt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlU3RhdGUucHJvdG90eXBlLCJidWZmZXIiLHtnZXQ6aW50ZXJuYWxVdGlsLmRlcHJlY2F0ZShmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEJ1ZmZlcigpfSwiX3dyaXRhYmxlU3RhdGUuYnVmZmVyIGlzIGRlcHJlY2F0ZWQuIFVzZSBfd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIgaW5zdGVhZC4iLCJERVAwMDAzIil9KX1jYXRjaChfKXt9fSgpLCJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5oYXNJbnN0YW5jZSYmImZ1bmN0aW9uIj09dHlwZW9mIEZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdPyhyZWFsSGFzSW5zdGFuY2U9RnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0sT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLFN5bWJvbC5oYXNJbnN0YW5jZSx7dmFsdWU6ZnVuY3Rpb24ob2JqZWN0KXtyZXR1cm4hIXJlYWxIYXNJbnN0YW5jZS5jYWxsKHRoaXMsb2JqZWN0KXx8dGhpcz09PVdyaXRhYmxlJiYob2JqZWN0JiZvYmplY3QuX3dyaXRhYmxlU3RhdGUgaW5zdGFuY2VvZiBXcml0YWJsZVN0YXRlKX19KSk6cmVhbEhhc0luc3RhbmNlPWZ1bmN0aW9uKG9iamVjdCl7cmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIHRoaXN9LFdyaXRhYmxlLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKCl7dGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJDYW5ub3QgcGlwZSwgbm90IHJlYWRhYmxlIikpfSxXcml0YWJsZS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24oY2h1bmssZW5jb2RpbmcsY2Ipe3ZhciBzdGF0ZT10aGlzLl93cml0YWJsZVN0YXRlLHJldD0hMSxpc0J1Zj0hc3RhdGUub2JqZWN0TW9kZSYmZnVuY3Rpb24gX2lzVWludDhBcnJheShvYmope3JldHVybiBCdWZmZXIuaXNCdWZmZXIob2JqKXx8b2JqIGluc3RhbmNlb2YgT3VyVWludDhBcnJheX0oY2h1bmspO3JldHVybiBpc0J1ZiYmIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykmJihjaHVuaz1mdW5jdGlvbiBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKXtyZXR1cm4gQnVmZmVyLmZyb20oY2h1bmspfShjaHVuaykpLCJmdW5jdGlvbiI9PXR5cGVvZiBlbmNvZGluZyYmKGNiPWVuY29kaW5nLGVuY29kaW5nPW51bGwpLGlzQnVmP2VuY29kaW5nPSJidWZmZXIiOmVuY29kaW5nfHwoZW5jb2Rpbmc9c3RhdGUuZGVmYXVsdEVuY29kaW5nKSwiZnVuY3Rpb24iIT10eXBlb2YgY2ImJihjYj1ub3ApLHN0YXRlLmVuZGVkP2Z1bmN0aW9uIHdyaXRlQWZ0ZXJFbmQoc3RyZWFtLGNiKXt2YXIgZXI9bmV3IEVycm9yKCJ3cml0ZSBhZnRlciBlbmQiKTtzdHJlYW0uZW1pdCgiZXJyb3IiLGVyKSxwbmEubmV4dFRpY2soY2IsZXIpfSh0aGlzLGNiKTooaXNCdWZ8fGZ1bmN0aW9uIHZhbGlkQ2h1bmsoc3RyZWFtLHN0YXRlLGNodW5rLGNiKXt2YXIgdmFsaWQ9ITAsZXI9ITE7cmV0dXJuIG51bGw9PT1jaHVuaz9lcj1uZXcgVHlwZUVycm9yKCJNYXkgbm90IHdyaXRlIG51bGwgdmFsdWVzIHRvIHN0cmVhbSIpOiJzdHJpbmciPT10eXBlb2YgY2h1bmt8fHZvaWQgMD09PWNodW5rfHxzdGF0ZS5vYmplY3RNb2RlfHwoZXI9bmV3IFR5cGVFcnJvcigiSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuayIpKSxlciYmKHN0cmVhbS5lbWl0KCJlcnJvciIsZXIpLHBuYS5uZXh0VGljayhjYixlciksdmFsaWQ9ITEpLHZhbGlkfSh0aGlzLHN0YXRlLGNodW5rLGNiKSkmJihzdGF0ZS5wZW5kaW5nY2IrKyxyZXQ9ZnVuY3Rpb24gd3JpdGVPckJ1ZmZlcihzdHJlYW0sc3RhdGUsaXNCdWYsY2h1bmssZW5jb2RpbmcsY2Ipe2lmKCFpc0J1Zil7dmFyIG5ld0NodW5rPWZ1bmN0aW9uIGRlY29kZUNodW5rKHN0YXRlLGNodW5rLGVuY29kaW5nKXtzdGF0ZS5vYmplY3RNb2RlfHwhMT09PXN0YXRlLmRlY29kZVN0cmluZ3N8fCJzdHJpbmciIT10eXBlb2YgY2h1bmt8fChjaHVuaz1CdWZmZXIuZnJvbShjaHVuayxlbmNvZGluZykpO3JldHVybiBjaHVua30oc3RhdGUsY2h1bmssZW5jb2RpbmcpO2NodW5rIT09bmV3Q2h1bmsmJihpc0J1Zj0hMCxlbmNvZGluZz0iYnVmZmVyIixjaHVuaz1uZXdDaHVuayl9dmFyIGxlbj1zdGF0ZS5vYmplY3RNb2RlPzE6Y2h1bmsubGVuZ3RoO3N0YXRlLmxlbmd0aCs9bGVuO3ZhciByZXQ9c3RhdGUubGVuZ3RoPHN0YXRlLmhpZ2hXYXRlck1hcms7cmV0fHwoc3RhdGUubmVlZERyYWluPSEwKTtpZihzdGF0ZS53cml0aW5nfHxzdGF0ZS5jb3JrZWQpe3ZhciBsYXN0PXN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7c3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdD17Y2h1bmssZW5jb2RpbmcsaXNCdWYsY2FsbGJhY2s6Y2IsbmV4dDpudWxsfSxsYXN0P2xhc3QubmV4dD1zdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0OnN0YXRlLmJ1ZmZlcmVkUmVxdWVzdD1zdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0LHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50Kz0xfWVsc2UgZG9Xcml0ZShzdHJlYW0sc3RhdGUsITEsbGVuLGNodW5rLGVuY29kaW5nLGNiKTtyZXR1cm4gcmV0fSh0aGlzLHN0YXRlLGlzQnVmLGNodW5rLGVuY29kaW5nLGNiKSkscmV0fSxXcml0YWJsZS5wcm90b3R5cGUuY29yaz1mdW5jdGlvbigpe3RoaXMuX3dyaXRhYmxlU3RhdGUuY29ya2VkKyt9LFdyaXRhYmxlLnByb3RvdHlwZS51bmNvcms9ZnVuY3Rpb24oKXt2YXIgc3RhdGU9dGhpcy5fd3JpdGFibGVTdGF0ZTtzdGF0ZS5jb3JrZWQmJihzdGF0ZS5jb3JrZWQtLSxzdGF0ZS53cml0aW5nfHxzdGF0ZS5jb3JrZWR8fHN0YXRlLmJ1ZmZlclByb2Nlc3Npbmd8fCFzdGF0ZS5idWZmZXJlZFJlcXVlc3R8fGNsZWFyQnVmZmVyKHRoaXMsc3RhdGUpKX0sV3JpdGFibGUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZz1mdW5jdGlvbiBzZXREZWZhdWx0RW5jb2RpbmcoZW5jb2Rpbmcpe2lmKCJzdHJpbmciPT10eXBlb2YgZW5jb2RpbmcmJihlbmNvZGluZz1lbmNvZGluZy50b0xvd2VyQ2FzZSgpKSwhKFsiaGV4IiwidXRmOCIsInV0Zi04IiwiYXNjaWkiLCJiaW5hcnkiLCJiYXNlNjQiLCJ1Y3MyIiwidWNzLTIiLCJ1dGYxNmxlIiwidXRmLTE2bGUiLCJyYXciXS5pbmRleE9mKChlbmNvZGluZysiIikudG9Mb3dlckNhc2UoKSk+LTEpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrZW5jb2RpbmcpO3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmRlZmF1bHRFbmNvZGluZz1lbmNvZGluZyx0aGlzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUucHJvdG90eXBlLCJ3cml0YWJsZUhpZ2hXYXRlck1hcmsiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcmt9fSksV3JpdGFibGUucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbihjaHVuayxlbmNvZGluZyxjYil7Y2IobmV3IEVycm9yKCJfd3JpdGUoKSBpcyBub3QgaW1wbGVtZW50ZWQiKSl9LFdyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGV2PW51bGwsV3JpdGFibGUucHJvdG90eXBlLmVuZD1mdW5jdGlvbihjaHVuayxlbmNvZGluZyxjYil7dmFyIHN0YXRlPXRoaXMuX3dyaXRhYmxlU3RhdGU7ImZ1bmN0aW9uIj09dHlwZW9mIGNodW5rPyhjYj1jaHVuayxjaHVuaz1udWxsLGVuY29kaW5nPW51bGwpOiJmdW5jdGlvbiI9PXR5cGVvZiBlbmNvZGluZyYmKGNiPWVuY29kaW5nLGVuY29kaW5nPW51bGwpLG51bGwhPWNodW5rJiZ0aGlzLndyaXRlKGNodW5rLGVuY29kaW5nKSxzdGF0ZS5jb3JrZWQmJihzdGF0ZS5jb3JrZWQ9MSx0aGlzLnVuY29yaygpKSxzdGF0ZS5lbmRpbmd8fGZ1bmN0aW9uIGVuZFdyaXRhYmxlKHN0cmVhbSxzdGF0ZSxjYil7c3RhdGUuZW5kaW5nPSEwLGZpbmlzaE1heWJlKHN0cmVhbSxzdGF0ZSksY2ImJihzdGF0ZS5maW5pc2hlZD9wbmEubmV4dFRpY2soY2IpOnN0cmVhbS5vbmNlKCJmaW5pc2giLGNiKSk7c3RhdGUuZW5kZWQ9ITAsc3RyZWFtLndyaXRhYmxlPSExfSh0aGlzLHN0YXRlLGNiKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLnByb3RvdHlwZSwiZGVzdHJveWVkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuX3dyaXRhYmxlU3RhdGUmJnRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkfSxzZXQ6ZnVuY3Rpb24odmFsdWUpe3RoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD12YWx1ZSl9fSksV3JpdGFibGUucHJvdG90eXBlLmRlc3Ryb3k9ZGVzdHJveUltcGwuZGVzdHJveSxXcml0YWJsZS5wcm90b3R5cGUuX3VuZGVzdHJveT1kZXN0cm95SW1wbC51bmRlc3Ryb3ksV3JpdGFibGUucHJvdG90eXBlLl9kZXN0cm95PWZ1bmN0aW9uKGVycixjYil7dGhpcy5lbmQoKSxjYihlcnIpfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvQnVmZmVyTGlzdC5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIEJ1ZmZlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcyIpLkJ1ZmZlcix1dGlsPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy91dGlsL3V0aWwuanMiKTtmdW5jdGlvbiBjb3B5QnVmZmVyKHNyYyx0YXJnZXQsb2Zmc2V0KXtzcmMuY29weSh0YXJnZXQsb2Zmc2V0KX1tb2R1bGUuZXhwb3J0cz1mdW5jdGlvbigpe2Z1bmN0aW9uIEJ1ZmZlckxpc3QoKXshZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLENvbnN0cnVjdG9yKXtpZighKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfSh0aGlzLEJ1ZmZlckxpc3QpLHRoaXMuaGVhZD1udWxsLHRoaXMudGFpbD1udWxsLHRoaXMubGVuZ3RoPTB9cmV0dXJuIEJ1ZmZlckxpc3QucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24gcHVzaCh2KXt2YXIgZW50cnk9e2RhdGE6dixuZXh0Om51bGx9O3RoaXMubGVuZ3RoPjA/dGhpcy50YWlsLm5leHQ9ZW50cnk6dGhpcy5oZWFkPWVudHJ5LHRoaXMudGFpbD1lbnRyeSwrK3RoaXMubGVuZ3RofSxCdWZmZXJMaXN0LnByb3RvdHlwZS51bnNoaWZ0PWZ1bmN0aW9uIHVuc2hpZnQodil7dmFyIGVudHJ5PXtkYXRhOnYsbmV4dDp0aGlzLmhlYWR9OzA9PT10aGlzLmxlbmd0aCYmKHRoaXMudGFpbD1lbnRyeSksdGhpcy5oZWFkPWVudHJ5LCsrdGhpcy5sZW5ndGh9LEJ1ZmZlckxpc3QucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uIHNoaWZ0KCl7aWYoMCE9PXRoaXMubGVuZ3RoKXt2YXIgcmV0PXRoaXMuaGVhZC5kYXRhO3JldHVybiAxPT09dGhpcy5sZW5ndGg/dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsOnRoaXMuaGVhZD10aGlzLmhlYWQubmV4dCwtLXRoaXMubGVuZ3RoLHJldH19LEJ1ZmZlckxpc3QucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uIGNsZWFyKCl7dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsLHRoaXMubGVuZ3RoPTB9LEJ1ZmZlckxpc3QucHJvdG90eXBlLmpvaW49ZnVuY3Rpb24gam9pbihzKXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIiI7Zm9yKHZhciBwPXRoaXMuaGVhZCxyZXQ9IiIrcC5kYXRhO3A9cC5uZXh0OylyZXQrPXMrcC5kYXRhO3JldHVybiByZXR9LEJ1ZmZlckxpc3QucHJvdG90eXBlLmNvbmNhdD1mdW5jdGlvbiBjb25jYXQobil7aWYoMD09PXRoaXMubGVuZ3RoKXJldHVybiBCdWZmZXIuYWxsb2MoMCk7Zm9yKHZhciByZXQ9QnVmZmVyLmFsbG9jVW5zYWZlKG4+Pj4wKSxwPXRoaXMuaGVhZCxpPTA7cDspY29weUJ1ZmZlcihwLmRhdGEscmV0LGkpLGkrPXAuZGF0YS5sZW5ndGgscD1wLm5leHQ7cmV0dXJuIHJldH0sQnVmZmVyTGlzdH0oKSx1dGlsJiZ1dGlsLmluc3BlY3QmJnV0aWwuaW5zcGVjdC5jdXN0b20mJihtb2R1bGUuZXhwb3J0cy5wcm90b3R5cGVbdXRpbC5pbnNwZWN0LmN1c3RvbV09ZnVuY3Rpb24oKXt2YXIgb2JqPXV0aWwuaW5zcGVjdCh7bGVuZ3RoOnRoaXMubGVuZ3RofSk7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IubmFtZSsiICIrb2JqfSl9LCIuLi8uLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3kuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBwbmE9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MtbmV4dGljay1hcmdzL2luZGV4LmpzIik7ZnVuY3Rpb24gZW1pdEVycm9yTlQoc2VsZixlcnIpe3NlbGYuZW1pdCgiZXJyb3IiLGVycil9bW9kdWxlLmV4cG9ydHM9e2Rlc3Ryb3k6ZnVuY3Rpb24gZGVzdHJveShlcnIsY2Ipe3ZhciBfdGhpcz10aGlzLHJlYWRhYmxlRGVzdHJveWVkPXRoaXMuX3JlYWRhYmxlU3RhdGUmJnRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkLHdyaXRhYmxlRGVzdHJveWVkPXRoaXMuX3dyaXRhYmxlU3RhdGUmJnRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkO3JldHVybiByZWFkYWJsZURlc3Ryb3llZHx8d3JpdGFibGVEZXN0cm95ZWQ/KGNiP2NiKGVycik6ZXJyJiYodGhpcy5fd3JpdGFibGVTdGF0ZT90aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZHx8KHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSEwLHBuYS5uZXh0VGljayhlbWl0RXJyb3JOVCx0aGlzLGVycikpOnBuYS5uZXh0VGljayhlbWl0RXJyb3JOVCx0aGlzLGVycikpLHRoaXMpOih0aGlzLl9yZWFkYWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ9ITApLHRoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD0hMCksdGhpcy5fZGVzdHJveShlcnJ8fG51bGwsZnVuY3Rpb24oZXJyKXshY2ImJmVycj9fdGhpcy5fd3JpdGFibGVTdGF0ZT9fdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWR8fChfdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITAscG5hLm5leHRUaWNrKGVtaXRFcnJvck5ULF90aGlzLGVycikpOnBuYS5uZXh0VGljayhlbWl0RXJyb3JOVCxfdGhpcyxlcnIpOmNiJiZjYihlcnIpfSksdGhpcyl9LHVuZGVzdHJveTpmdW5jdGlvbiB1bmRlc3Ryb3koKXt0aGlzLl9yZWFkYWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ9ITEsdGhpcy5fcmVhZGFibGVTdGF0ZS5yZWFkaW5nPSExLHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kZWQ9ITEsdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkPSExKSx0aGlzLl93cml0YWJsZVN0YXRlJiYodGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZD0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmVuZGluZz0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmZpbmFsQ2FsbGVkPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUucHJlZmluaXNoZWQ9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZD0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMSl9fX0sIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtLWJyb3dzZXIuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7bW9kdWxlLmV4cG9ydHM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanMiKS5FdmVudEVtaXR0ZXJ9LCIuLi8uLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcyIobW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7dmFyIGJ1ZmZlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzIiksQnVmZmVyPWJ1ZmZlci5CdWZmZXI7ZnVuY3Rpb24gY29weVByb3BzKHNyYyxkc3Qpe2Zvcih2YXIga2V5IGluIHNyYylkc3Rba2V5XT1zcmNba2V5XX1mdW5jdGlvbiBTYWZlQnVmZmVyKGFyZyxlbmNvZGluZ09yT2Zmc2V0LGxlbmd0aCl7cmV0dXJuIEJ1ZmZlcihhcmcsZW5jb2RpbmdPck9mZnNldCxsZW5ndGgpfUJ1ZmZlci5mcm9tJiZCdWZmZXIuYWxsb2MmJkJ1ZmZlci5hbGxvY1Vuc2FmZSYmQnVmZmVyLmFsbG9jVW5zYWZlU2xvdz9tb2R1bGUuZXhwb3J0cz1idWZmZXI6KGNvcHlQcm9wcyhidWZmZXIsZXhwb3J0cyksZXhwb3J0cy5CdWZmZXI9U2FmZUJ1ZmZlciksY29weVByb3BzKEJ1ZmZlcixTYWZlQnVmZmVyKSxTYWZlQnVmZmVyLmZyb209ZnVuY3Rpb24oYXJnLGVuY29kaW5nT3JPZmZzZXQsbGVuZ3RoKXtpZigibnVtYmVyIj09dHlwZW9mIGFyZyl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlciIpO3JldHVybiBCdWZmZXIoYXJnLGVuY29kaW5nT3JPZmZzZXQsbGVuZ3RoKX0sU2FmZUJ1ZmZlci5hbGxvYz1mdW5jdGlvbihzaXplLGZpbGwsZW5jb2Rpbmcpe2lmKCJudW1iZXIiIT10eXBlb2Ygc2l6ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7dmFyIGJ1Zj1CdWZmZXIoc2l6ZSk7cmV0dXJuIHZvaWQgMCE9PWZpbGw/InN0cmluZyI9PXR5cGVvZiBlbmNvZGluZz9idWYuZmlsbChmaWxsLGVuY29kaW5nKTpidWYuZmlsbChmaWxsKTpidWYuZmlsbCgwKSxidWZ9LFNhZmVCdWZmZXIuYWxsb2NVbnNhZmU9ZnVuY3Rpb24oc2l6ZSl7aWYoIm51bWJlciIhPXR5cGVvZiBzaXplKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gQnVmZmVyKHNpemUpfSxTYWZlQnVmZmVyLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbihzaXplKXtpZigibnVtYmVyIiE9dHlwZW9mIHNpemUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBidWZmZXIuU2xvd0J1ZmZlcihzaXplKX19LCIuLi8uLi9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL3JlYWRhYmxlLWJyb3dzZXIuanMiKG1vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyhleHBvcnRzPW1vZHVsZS5leHBvcnRzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcmVhZGFibGUuanMiKSkuU3RyZWFtPWV4cG9ydHMsZXhwb3J0cy5SZWFkYWJsZT1leHBvcnRzLGV4cG9ydHMuV3JpdGFibGU9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV93cml0YWJsZS5qcyIpLGV4cG9ydHMuRHVwbGV4PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fZHVwbGV4LmpzIiksZXhwb3J0cy5UcmFuc2Zvcm09X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMiKSxleHBvcnRzLlBhc3NUaHJvdWdoPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMiKX0sIi4uLy4uL25vZGVfbW9kdWxlcy9yaXBlbWQxNjAvaW5kZXguanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBCdWZmZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyIpLkJ1ZmZlcixpbmhlcml0cz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIpLEhhc2hCYXNlPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9yaXBlbWQxNjAvbm9kZV9tb2R1bGVzL2hhc2gtYmFzZS9pbmRleC5qcyIpLEFSUkFZMTY9bmV3IEFycmF5KDE2KSx6bD1bMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSw3LDQsMTMsMSwxMCw2LDE1LDMsMTIsMCw5LDUsMiwxNCwxMSw4LDMsMTAsMTQsNCw5LDE1LDgsMSwyLDcsMCw2LDEzLDExLDUsMTIsMSw5LDExLDEwLDAsOCwxMiw0LDEzLDMsNywxNSwxNCw1LDYsMiw0LDAsNSw5LDcsMTIsMiwxMCwxNCwxLDMsOCwxMSw2LDE1LDEzXSx6cj1bNSwxNCw3LDAsOSwyLDExLDQsMTMsNiwxNSw4LDEsMTAsMywxMiw2LDExLDMsNywwLDEzLDUsMTAsMTQsMTUsOCwxMiw0LDksMSwyLDE1LDUsMSwzLDcsMTQsNiw5LDExLDgsMTIsMiwxMCwwLDQsMTMsOCw2LDQsMSwzLDExLDE1LDAsNSwxMiwyLDEzLDksNywxMCwxNCwxMiwxNSwxMCw0LDEsNSw4LDcsNiwyLDEzLDE0LDAsMyw5LDExXSxzbD1bMTEsMTQsMTUsMTIsNSw4LDcsOSwxMSwxMywxNCwxNSw2LDcsOSw4LDcsNiw4LDEzLDExLDksNywxNSw3LDEyLDE1LDksMTEsNywxMywxMiwxMSwxMyw2LDcsMTQsOSwxMywxNSwxNCw4LDEzLDYsNSwxMiw3LDUsMTEsMTIsMTQsMTUsMTQsMTUsOSw4LDksMTQsNSw2LDgsNiw1LDEyLDksMTUsNSwxMSw2LDgsMTMsMTIsNSwxMiwxMywxNCwxMSw4LDUsNl0sc3I9WzgsOSw5LDExLDEzLDE1LDE1LDUsNyw3LDgsMTEsMTQsMTQsMTIsNiw5LDEzLDE1LDcsMTIsOCw5LDExLDcsNywxMiw3LDYsMTUsMTMsMTEsOSw3LDE1LDExLDgsNiw2LDE0LDEyLDEzLDUsMTQsMTMsMTMsNyw1LDE1LDUsOCwxMSwxNCwxNCw2LDE0LDYsOSwxMiw5LDEyLDUsMTUsOCw4LDUsMTIsOSwxMiw1LDE0LDYsOCwxMyw2LDUsMTUsMTMsMTEsMTFdLGhsPVswLDE1MTg1MDAyNDksMTg1OTc3NTM5MywyNDAwOTU5NzA4LDI4NDA4NTM4MzhdLGhyPVsxMzUyODI5OTI2LDE1NDg2MDM2ODQsMTgzNjA3MjY5MSwyMDUzOTk0MjE3LDBdO2Z1bmN0aW9uIHJvdGwoeCxuKXtyZXR1cm4geDw8bnx4Pj4+MzItbn1mdW5jdGlvbiBmbjEoYSxiLGMsZCxlLG0sayxzKXtyZXR1cm4gcm90bChhKyhiXmNeZCkrbStrfDAscykrZXwwfWZ1bmN0aW9uIGZuMihhLGIsYyxkLGUsbSxrLHMpe3JldHVybiByb3RsKGErKGImY3x+YiZkKSttK2t8MCxzKStlfDB9ZnVuY3Rpb24gZm4zKGEsYixjLGQsZSxtLGsscyl7cmV0dXJuIHJvdGwoYSsoKGJ8fmMpXmQpK20ra3wwLHMpK2V8MH1mdW5jdGlvbiBmbjQoYSxiLGMsZCxlLG0sayxzKXtyZXR1cm4gcm90bChhKyhiJmR8YyZ+ZCkrbStrfDAscykrZXwwfWZ1bmN0aW9uIGZuNShhLGIsYyxkLGUsbSxrLHMpe3JldHVybiByb3RsKGErKGJeKGN8fmQpKSttK2t8MCxzKStlfDB9ZnVuY3Rpb24gUklQRU1EMTYwKCl7SGFzaEJhc2UuY2FsbCh0aGlzLDY0KSx0aGlzLl9hPTE3MzI1ODQxOTMsdGhpcy5fYj00MDIzMjMzNDE3LHRoaXMuX2M9MjU2MjM4MzEwMix0aGlzLl9kPTI3MTczMzg3OCx0aGlzLl9lPTMyODUzNzc1MjB9aW5oZXJpdHMoUklQRU1EMTYwLEhhc2hCYXNlKSxSSVBFTUQxNjAucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24oKXtmb3IodmFyIHdvcmRzPUFSUkFZMTYsaj0wO2o8MTY7KytqKXdvcmRzW2pdPXRoaXMuX2Jsb2NrLnJlYWRJbnQzMkxFKDQqaik7Zm9yKHZhciBhbD0wfHRoaXMuX2EsYmw9MHx0aGlzLl9iLGNsPTB8dGhpcy5fYyxkbD0wfHRoaXMuX2QsZWw9MHx0aGlzLl9lLGFyPTB8dGhpcy5fYSxicj0wfHRoaXMuX2IsY3I9MHx0aGlzLl9jLGRyPTB8dGhpcy5fZCxlcj0wfHRoaXMuX2UsaT0wO2k8ODA7aSs9MSl7dmFyIHRsLHRyO2k8MTY/KHRsPWZuMShhbCxibCxjbCxkbCxlbCx3b3Jkc1t6bFtpXV0saGxbMF0sc2xbaV0pLHRyPWZuNShhcixicixjcixkcixlcix3b3Jkc1t6cltpXV0saHJbMF0sc3JbaV0pKTppPDMyPyh0bD1mbjIoYWwsYmwsY2wsZGwsZWwsd29yZHNbemxbaV1dLGhsWzFdLHNsW2ldKSx0cj1mbjQoYXIsYnIsY3IsZHIsZXIsd29yZHNbenJbaV1dLGhyWzFdLHNyW2ldKSk6aTw0OD8odGw9Zm4zKGFsLGJsLGNsLGRsLGVsLHdvcmRzW3psW2ldXSxobFsyXSxzbFtpXSksdHI9Zm4zKGFyLGJyLGNyLGRyLGVyLHdvcmRzW3pyW2ldXSxoclsyXSxzcltpXSkpOmk8NjQ/KHRsPWZuNChhbCxibCxjbCxkbCxlbCx3b3Jkc1t6bFtpXV0saGxbM10sc2xbaV0pLHRyPWZuMihhcixicixjcixkcixlcix3b3Jkc1t6cltpXV0saHJbM10sc3JbaV0pKToodGw9Zm41KGFsLGJsLGNsLGRsLGVsLHdvcmRzW3psW2ldXSxobFs0XSxzbFtpXSksdHI9Zm4xKGFyLGJyLGNyLGRyLGVyLHdvcmRzW3pyW2ldXSxocls0XSxzcltpXSkpLGFsPWVsLGVsPWRsLGRsPXJvdGwoY2wsMTApLGNsPWJsLGJsPXRsLGFyPWVyLGVyPWRyLGRyPXJvdGwoY3IsMTApLGNyPWJyLGJyPXRyfXZhciB0PXRoaXMuX2IrY2wrZHJ8MDt0aGlzLl9iPXRoaXMuX2MrZGwrZXJ8MCx0aGlzLl9jPXRoaXMuX2QrZWwrYXJ8MCx0aGlzLl9kPXRoaXMuX2UrYWwrYnJ8MCx0aGlzLl9lPXRoaXMuX2ErYmwrY3J8MCx0aGlzLl9hPXR9LFJJUEVNRDE2MC5wcm90b3R5cGUuX2RpZ2VzdD1mdW5jdGlvbigpe3RoaXMuX2Jsb2NrW3RoaXMuX2Jsb2NrT2Zmc2V0XT0xMjgsdGhpcy5fYmxvY2tPZmZzZXQrPTEsdGhpcy5fYmxvY2tPZmZzZXQ+NTYmJih0aGlzLl9ibG9jay5maWxsKDAsdGhpcy5fYmxvY2tPZmZzZXQsNjQpLHRoaXMuX3VwZGF0ZSgpLHRoaXMuX2Jsb2NrT2Zmc2V0PTApLHRoaXMuX2Jsb2NrLmZpbGwoMCx0aGlzLl9ibG9ja09mZnNldCw1NiksdGhpcy5fYmxvY2sud3JpdGVVSW50MzJMRSh0aGlzLl9sZW5ndGhbMF0sNTYpLHRoaXMuX2Jsb2NrLndyaXRlVUludDMyTEUodGhpcy5fbGVuZ3RoWzFdLDYwKSx0aGlzLl91cGRhdGUoKTt2YXIgYnVmZmVyPUJ1ZmZlci5hbGxvYz9CdWZmZXIuYWxsb2MoMjApOm5ldyBCdWZmZXIoMjApO3JldHVybiBidWZmZXIud3JpdGVJbnQzMkxFKHRoaXMuX2EsMCksYnVmZmVyLndyaXRlSW50MzJMRSh0aGlzLl9iLDQpLGJ1ZmZlci53cml0ZUludDMyTEUodGhpcy5fYyw4KSxidWZmZXIud3JpdGVJbnQzMkxFKHRoaXMuX2QsMTIpLGJ1ZmZlci53cml0ZUludDMyTEUodGhpcy5fZSwxNiksYnVmZmVyfSxtb2R1bGUuZXhwb3J0cz1SSVBFTUQxNjB9LCIuLi8uLi9ub2RlX21vZHVsZXMvcmlwZW1kMTYwL25vZGVfbW9kdWxlcy9oYXNoLWJhc2UvaW5kZXguanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBCdWZmZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3NhZmUtYnVmZmVyL2luZGV4LmpzIikuQnVmZmVyLHRvQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9yaXBlbWQxNjAvbm9kZV9tb2R1bGVzL2hhc2gtYmFzZS90by1idWZmZXIuanMiKSxUcmFuc2Zvcm09X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9yZWFkYWJsZS1icm93c2VyLmpzIikuVHJhbnNmb3JtO2Z1bmN0aW9uIEhhc2hCYXNlKGJsb2NrU2l6ZSl7VHJhbnNmb3JtLmNhbGwodGhpcyksdGhpcy5fYmxvY2s9QnVmZmVyLmFsbG9jVW5zYWZlKGJsb2NrU2l6ZSksdGhpcy5fYmxvY2tTaXplPWJsb2NrU2l6ZSx0aGlzLl9ibG9ja09mZnNldD0wLHRoaXMuX2xlbmd0aD1bMCwwLDAsMF0sdGhpcy5fZmluYWxpemVkPSExfV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIikoSGFzaEJhc2UsVHJhbnNmb3JtKSxIYXNoQmFzZS5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbihjaHVuayxlbmNvZGluZyxjYWxsYmFjayl7dmFyIGVycm9yPW51bGw7dHJ5e3RoaXMudXBkYXRlKGNodW5rLGVuY29kaW5nKX1jYXRjaChlcnIpe2Vycm9yPWVycn1jYWxsYmFjayhlcnJvcil9LEhhc2hCYXNlLnByb3RvdHlwZS5fZmx1c2g9ZnVuY3Rpb24oY2FsbGJhY2spe3ZhciBlcnJvcj1udWxsO3RyeXt0aGlzLnB1c2godGhpcy5kaWdlc3QoKSl9Y2F0Y2goZXJyKXtlcnJvcj1lcnJ9Y2FsbGJhY2soZXJyb3IpfSxIYXNoQmFzZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGRhdGEsZW5jb2Rpbmcpe2lmKHRoaXMuX2ZpbmFsaXplZCl0aHJvdyBuZXcgRXJyb3IoIkRpZ2VzdCBhbHJlYWR5IGNhbGxlZCIpO2Zvcih2YXIgZGF0YUJ1ZmZlcj10b0J1ZmZlcihkYXRhLGVuY29kaW5nKSxibG9jaz10aGlzLl9ibG9jayxvZmZzZXQ9MDt0aGlzLl9ibG9ja09mZnNldCtkYXRhQnVmZmVyLmxlbmd0aC1vZmZzZXQ+PXRoaXMuX2Jsb2NrU2l6ZTspe2Zvcih2YXIgaT10aGlzLl9ibG9ja09mZnNldDtpPHRoaXMuX2Jsb2NrU2l6ZTspYmxvY2tbaV09ZGF0YUJ1ZmZlcltvZmZzZXRdLGkrPTEsb2Zmc2V0Kz0xO3RoaXMuX3VwZGF0ZSgpLHRoaXMuX2Jsb2NrT2Zmc2V0PTB9Zm9yKDtvZmZzZXQ8ZGF0YUJ1ZmZlci5sZW5ndGg7KWJsb2NrW3RoaXMuX2Jsb2NrT2Zmc2V0XT1kYXRhQnVmZmVyW29mZnNldF0sdGhpcy5fYmxvY2tPZmZzZXQrPTEsb2Zmc2V0Kz0xO2Zvcih2YXIgaj0wLGNhcnJ5PTgqZGF0YUJ1ZmZlci5sZW5ndGg7Y2Fycnk+MDsrK2opdGhpcy5fbGVuZ3RoW2pdKz1jYXJyeSwoY2Fycnk9dGhpcy5fbGVuZ3RoW2pdLzQyOTQ5NjcyOTZ8MCk+MCYmKHRoaXMuX2xlbmd0aFtqXS09NDI5NDk2NzI5NipjYXJyeSk7cmV0dXJuIHRoaXN9LEhhc2hCYXNlLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJfdXBkYXRlIGlzIG5vdCBpbXBsZW1lbnRlZCIpfSxIYXNoQmFzZS5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKGVuY29kaW5nKXtpZih0aGlzLl9maW5hbGl6ZWQpdGhyb3cgbmV3IEVycm9yKCJEaWdlc3QgYWxyZWFkeSBjYWxsZWQiKTt0aGlzLl9maW5hbGl6ZWQ9ITA7dmFyIGRpZ2VzdD10aGlzLl9kaWdlc3QoKTt2b2lkIDAhPT1lbmNvZGluZyYmKGRpZ2VzdD1kaWdlc3QudG9TdHJpbmcoZW5jb2RpbmcpKSx0aGlzLl9ibG9jay5maWxsKDApLHRoaXMuX2Jsb2NrT2Zmc2V0PTA7Zm9yKHZhciBpPTA7aTw0OysraSl0aGlzLl9sZW5ndGhbaV09MDtyZXR1cm4gZGlnZXN0fSxIYXNoQmFzZS5wcm90b3R5cGUuX2RpZ2VzdD1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiX2RpZ2VzdCBpcyBub3QgaW1wbGVtZW50ZWQiKX0sbW9kdWxlLmV4cG9ydHM9SGFzaEJhc2V9LCIuLi8uLi9ub2RlX21vZHVsZXMvcmlwZW1kMTYwL25vZGVfbW9kdWxlcy9oYXNoLWJhc2UvdG8tYnVmZmVyLmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcyIpLkJ1ZmZlcix0b0J1ZmZlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvdG8tYnVmZmVyL2luZGV4LmpzIiksdXNlVWludDhBcnJheT0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXksaXNWaWV3PXVzZVVpbnQ4QXJyYXkmJiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJkFycmF5QnVmZmVyLmlzVmlldzttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbih0aGluZyxlbmNvZGluZyl7aWYoInN0cmluZyI9PXR5cGVvZiB0aGluZ3x8QnVmZmVyLmlzQnVmZmVyKHRoaW5nKXx8dXNlVWludDhBcnJheSYmdGhpbmcgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxpc1ZpZXcmJmlzVmlldyh0aGluZykpcmV0dXJuIHRvQnVmZmVyKHRoaW5nLGVuY29kaW5nKTt0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImRhdGEiIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIGEgQnVmZmVyLCBhIFVpbnQ4QXJyYXksIG9yIGEgRGF0YVZpZXcnKX19LCIuLi8uLi9ub2RlX21vZHVsZXMvc2FmZS1idWZmZXIvaW5kZXguanMiKG1vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pe3ZhciBidWZmZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyIpLEJ1ZmZlcj1idWZmZXIuQnVmZmVyO2Z1bmN0aW9uIGNvcHlQcm9wcyhzcmMsZHN0KXtmb3IodmFyIGtleSBpbiBzcmMpZHN0W2tleV09c3JjW2tleV19ZnVuY3Rpb24gU2FmZUJ1ZmZlcihhcmcsZW5jb2RpbmdPck9mZnNldCxsZW5ndGgpe3JldHVybiBCdWZmZXIoYXJnLGVuY29kaW5nT3JPZmZzZXQsbGVuZ3RoKX1CdWZmZXIuZnJvbSYmQnVmZmVyLmFsbG9jJiZCdWZmZXIuYWxsb2NVbnNhZmUmJkJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3c/bW9kdWxlLmV4cG9ydHM9YnVmZmVyOihjb3B5UHJvcHMoYnVmZmVyLGV4cG9ydHMpLGV4cG9ydHMuQnVmZmVyPVNhZmVCdWZmZXIpLFNhZmVCdWZmZXIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoQnVmZmVyLnByb3RvdHlwZSksY29weVByb3BzKEJ1ZmZlcixTYWZlQnVmZmVyKSxTYWZlQnVmZmVyLmZyb209ZnVuY3Rpb24oYXJnLGVuY29kaW5nT3JPZmZzZXQsbGVuZ3RoKXtpZigibnVtYmVyIj09dHlwZW9mIGFyZyl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlciIpO3JldHVybiBCdWZmZXIoYXJnLGVuY29kaW5nT3JPZmZzZXQsbGVuZ3RoKX0sU2FmZUJ1ZmZlci5hbGxvYz1mdW5jdGlvbihzaXplLGZpbGwsZW5jb2Rpbmcpe2lmKCJudW1iZXIiIT10eXBlb2Ygc2l6ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7dmFyIGJ1Zj1CdWZmZXIoc2l6ZSk7cmV0dXJuIHZvaWQgMCE9PWZpbGw/InN0cmluZyI9PXR5cGVvZiBlbmNvZGluZz9idWYuZmlsbChmaWxsLGVuY29kaW5nKTpidWYuZmlsbChmaWxsKTpidWYuZmlsbCgwKSxidWZ9LFNhZmVCdWZmZXIuYWxsb2NVbnNhZmU9ZnVuY3Rpb24oc2l6ZSl7aWYoIm51bWJlciIhPXR5cGVvZiBzaXplKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gQnVmZmVyKHNpemUpfSxTYWZlQnVmZmVyLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbihzaXplKXtpZigibnVtYmVyIiE9dHlwZW9mIHNpemUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBidWZmZXIuU2xvd0J1ZmZlcihzaXplKX19LCIuLi8uLi9ub2RlX21vZHVsZXMvc2FmZS1yZWdleC10ZXN0L2luZGV4LmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgY2FsbEJvdW5kPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9jYWxsLWJvdW5kL2luZGV4LmpzIiksaXNSZWdleD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaXMtcmVnZXgvaW5kZXguanMiKSwkZXhlYz1jYWxsQm91bmQoIlJlZ0V4cC5wcm90b3R5cGUuZXhlYyIpLCRUeXBlRXJyb3I9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy90eXBlLmpzIik7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24gcmVnZXhUZXN0ZXIocmVnZXgpe2lmKCFpc1JlZ2V4KHJlZ2V4KSl0aHJvdyBuZXcgJFR5cGVFcnJvcigiYHJlZ2V4YCBtdXN0IGJlIGEgUmVnRXhwIik7cmV0dXJuIGZ1bmN0aW9uIHRlc3Qocyl7cmV0dXJuIG51bGwhPT0kZXhlYyhyZWdleCxzKX19fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3NldC1mdW5jdGlvbi1sZW5ndGgvaW5kZXguanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBHZXRJbnRyaW5zaWM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2dldC1pbnRyaW5zaWMvaW5kZXguanMiKSxkZWZpbmU9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2RlZmluZS1kYXRhLXByb3BlcnR5L2luZGV4LmpzIiksaGFzRGVzY3JpcHRvcnM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2hhcy1wcm9wZXJ0eS1kZXNjcmlwdG9ycy9pbmRleC5qcyIpKCksZ09QRD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZ29wZC9pbmRleC5qcyIpLCRUeXBlRXJyb3I9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy90eXBlLmpzIiksJGZsb29yPUdldEludHJpbnNpYygiJU1hdGguZmxvb3IlIik7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24gc2V0RnVuY3Rpb25MZW5ndGgoZm4sbGVuZ3RoKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZm4pdGhyb3cgbmV3ICRUeXBlRXJyb3IoImBmbmAgaXMgbm90IGEgZnVuY3Rpb24iKTtpZigibnVtYmVyIiE9dHlwZW9mIGxlbmd0aHx8bGVuZ3RoPDB8fGxlbmd0aD40Mjk0OTY3Mjk1fHwkZmxvb3IobGVuZ3RoKSE9PWxlbmd0aCl0aHJvdyBuZXcgJFR5cGVFcnJvcigiYGxlbmd0aGAgbXVzdCBiZSBhIHBvc2l0aXZlIDMyLWJpdCBpbnRlZ2VyIik7dmFyIGxvb3NlPWFyZ3VtZW50cy5sZW5ndGg+MiYmISFhcmd1bWVudHNbMl0sZnVuY3Rpb25MZW5ndGhJc0NvbmZpZ3VyYWJsZT0hMCxmdW5jdGlvbkxlbmd0aElzV3JpdGFibGU9ITA7aWYoImxlbmd0aCJpbiBmbiYmZ09QRCl7dmFyIGRlc2M9Z09QRChmbiwibGVuZ3RoIik7ZGVzYyYmIWRlc2MuY29uZmlndXJhYmxlJiYoZnVuY3Rpb25MZW5ndGhJc0NvbmZpZ3VyYWJsZT0hMSksZGVzYyYmIWRlc2Mud3JpdGFibGUmJihmdW5jdGlvbkxlbmd0aElzV3JpdGFibGU9ITEpfXJldHVybihmdW5jdGlvbkxlbmd0aElzQ29uZmlndXJhYmxlfHxmdW5jdGlvbkxlbmd0aElzV3JpdGFibGV8fCFsb29zZSkmJihoYXNEZXNjcmlwdG9ycz9kZWZpbmUoZm4sImxlbmd0aCIsbGVuZ3RoLCEwLCEwKTpkZWZpbmUoZm4sImxlbmd0aCIsbGVuZ3RoKSksZm59fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3NldGltbWVkaWF0ZS9zZXRJbW1lZGlhdGUuanMiKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXt2YXIgcHJvY2Vzcz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbm9kZS1zdGRsaWItYnJvd3Nlci9janMvcHJveHkvcHJvY2Vzcy5qcyIpOyFmdW5jdGlvbihnbG9iYWwpeyJ1c2Ugc3RyaWN0IjtpZighZ2xvYmFsLnNldEltbWVkaWF0ZSl7dmFyIHJlZ2lzdGVySW1tZWRpYXRlLG5leHRIYW5kbGU9MSx0YXNrc0J5SGFuZGxlPXt9LGN1cnJlbnRseVJ1bm5pbmdBVGFzaz0hMSxkb2M9Z2xvYmFsLmRvY3VtZW50LGF0dGFjaFRvPU9iamVjdC5nZXRQcm90b3R5cGVPZiYmT2JqZWN0LmdldFByb3RvdHlwZU9mKGdsb2JhbCk7YXR0YWNoVG89YXR0YWNoVG8mJmF0dGFjaFRvLnNldFRpbWVvdXQ/YXR0YWNoVG86Z2xvYmFsLCJbb2JqZWN0IHByb2Nlc3NdIj09PXt9LnRvU3RyaW5nLmNhbGwoZ2xvYmFsLnByb2Nlc3MpP2Z1bmN0aW9uIGluc3RhbGxOZXh0VGlja0ltcGxlbWVudGF0aW9uKCl7cmVnaXN0ZXJJbW1lZGlhdGU9ZnVuY3Rpb24oaGFuZGxlKXtwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCl7cnVuSWZQcmVzZW50KGhhbmRsZSl9KX19KCk6IWZ1bmN0aW9uIGNhblVzZVBvc3RNZXNzYWdlKCl7aWYoZ2xvYmFsLnBvc3RNZXNzYWdlJiYhZ2xvYmFsLmltcG9ydFNjcmlwdHMpe3ZhciBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzPSEwLG9sZE9uTWVzc2FnZT1nbG9iYWwub25tZXNzYWdlO3JldHVybiBnbG9iYWwub25tZXNzYWdlPWZ1bmN0aW9uKCl7cG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cz0hMX0sZ2xvYmFsLnBvc3RNZXNzYWdlKCIiLCIqIiksZ2xvYmFsLm9ubWVzc2FnZT1vbGRPbk1lc3NhZ2UscG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91c319KCk/Z2xvYmFsLk1lc3NhZ2VDaGFubmVsP2Z1bmN0aW9uIGluc3RhbGxNZXNzYWdlQ2hhbm5lbEltcGxlbWVudGF0aW9uKCl7dmFyIGNoYW5uZWw9bmV3IE1lc3NhZ2VDaGFubmVsO2NoYW5uZWwucG9ydDEub25tZXNzYWdlPWZ1bmN0aW9uKGV2ZW50KXtydW5JZlByZXNlbnQoZXZlbnQuZGF0YSl9LHJlZ2lzdGVySW1tZWRpYXRlPWZ1bmN0aW9uKGhhbmRsZSl7Y2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZShoYW5kbGUpfX0oKTpkb2MmJiJvbnJlYWR5c3RhdGVjaGFuZ2UiaW4gZG9jLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpP2Z1bmN0aW9uIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKXt2YXIgaHRtbD1kb2MuZG9jdW1lbnRFbGVtZW50O3JlZ2lzdGVySW1tZWRpYXRlPWZ1bmN0aW9uKGhhbmRsZSl7dmFyIHNjcmlwdD1kb2MuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7c2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe3J1bklmUHJlc2VudChoYW5kbGUpLHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxodG1sLnJlbW92ZUNoaWxkKHNjcmlwdCksc2NyaXB0PW51bGx9LGh0bWwuYXBwZW5kQ2hpbGQoc2NyaXB0KX19KCk6ZnVuY3Rpb24gaW5zdGFsbFNldFRpbWVvdXRJbXBsZW1lbnRhdGlvbigpe3JlZ2lzdGVySW1tZWRpYXRlPWZ1bmN0aW9uKGhhbmRsZSl7c2V0VGltZW91dChydW5JZlByZXNlbnQsMCxoYW5kbGUpfX0oKTpmdW5jdGlvbiBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpe3ZhciBtZXNzYWdlUHJlZml4PSJzZXRJbW1lZGlhdGUkIitNYXRoLnJhbmRvbSgpKyIkIixvbkdsb2JhbE1lc3NhZ2U9ZnVuY3Rpb24oZXZlbnQpe2V2ZW50LnNvdXJjZT09PWdsb2JhbCYmInN0cmluZyI9PXR5cGVvZiBldmVudC5kYXRhJiYwPT09ZXZlbnQuZGF0YS5pbmRleE9mKG1lc3NhZ2VQcmVmaXgpJiZydW5JZlByZXNlbnQoK2V2ZW50LmRhdGEuc2xpY2UobWVzc2FnZVByZWZpeC5sZW5ndGgpKX07Z2xvYmFsLmFkZEV2ZW50TGlzdGVuZXI/Z2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG9uR2xvYmFsTWVzc2FnZSwhMSk6Z2xvYmFsLmF0dGFjaEV2ZW50KCJvbm1lc3NhZ2UiLG9uR2xvYmFsTWVzc2FnZSkscmVnaXN0ZXJJbW1lZGlhdGU9ZnVuY3Rpb24oaGFuZGxlKXtnbG9iYWwucG9zdE1lc3NhZ2UobWVzc2FnZVByZWZpeCtoYW5kbGUsIioiKX19KCksYXR0YWNoVG8uc2V0SW1tZWRpYXRlPWZ1bmN0aW9uIHNldEltbWVkaWF0ZShjYWxsYmFjayl7ImZ1bmN0aW9uIiE9dHlwZW9mIGNhbGxiYWNrJiYoY2FsbGJhY2s9bmV3IEZ1bmN0aW9uKCIiK2NhbGxiYWNrKSk7Zm9yKHZhciBhcmdzPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpLGk9MDtpPGFyZ3MubGVuZ3RoO2krKylhcmdzW2ldPWFyZ3VtZW50c1tpKzFdO3ZhciB0YXNrPXtjYWxsYmFjayxhcmdzfTtyZXR1cm4gdGFza3NCeUhhbmRsZVtuZXh0SGFuZGxlXT10YXNrLHJlZ2lzdGVySW1tZWRpYXRlKG5leHRIYW5kbGUpLG5leHRIYW5kbGUrK30sYXR0YWNoVG8uY2xlYXJJbW1lZGlhdGU9Y2xlYXJJbW1lZGlhdGV9ZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaGFuZGxlKXtkZWxldGUgdGFza3NCeUhhbmRsZVtoYW5kbGVdfWZ1bmN0aW9uIHJ1bklmUHJlc2VudChoYW5kbGUpe2lmKGN1cnJlbnRseVJ1bm5pbmdBVGFzaylzZXRUaW1lb3V0KHJ1bklmUHJlc2VudCwwLGhhbmRsZSk7ZWxzZXt2YXIgdGFzaz10YXNrc0J5SGFuZGxlW2hhbmRsZV07aWYodGFzayl7Y3VycmVudGx5UnVubmluZ0FUYXNrPSEwO3RyeXshZnVuY3Rpb24gcnVuKHRhc2spe3ZhciBjYWxsYmFjaz10YXNrLmNhbGxiYWNrLGFyZ3M9dGFzay5hcmdzO3N3aXRjaChhcmdzLmxlbmd0aCl7Y2FzZSAwOmNhbGxiYWNrKCk7YnJlYWs7Y2FzZSAxOmNhbGxiYWNrKGFyZ3NbMF0pO2JyZWFrO2Nhc2UgMjpjYWxsYmFjayhhcmdzWzBdLGFyZ3NbMV0pO2JyZWFrO2Nhc2UgMzpjYWxsYmFjayhhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSk7YnJlYWs7ZGVmYXVsdDpjYWxsYmFjay5hcHBseSh2b2lkIDAsYXJncyl9fSh0YXNrKX1maW5hbGx5e2NsZWFySW1tZWRpYXRlKGhhbmRsZSksY3VycmVudGx5UnVubmluZ0FUYXNrPSExfX19fX0oInVuZGVmaW5lZCI9PXR5cGVvZiBzZWxmP3ZvaWQgMD09PV9fd2VicGFja19yZXF1aXJlX18uZz90aGlzOl9fd2VicGFja19yZXF1aXJlX18uZzpzZWxmKX0sIi4uLy4uL25vZGVfbW9kdWxlcy9zaGEuanMvaGFzaC5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIEJ1ZmZlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc2FmZS1idWZmZXIvaW5kZXguanMiKS5CdWZmZXIsdG9CdWZmZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3RvLWJ1ZmZlci9pbmRleC5qcyIpO2Z1bmN0aW9uIEhhc2goYmxvY2tTaXplLGZpbmFsU2l6ZSl7dGhpcy5fYmxvY2s9QnVmZmVyLmFsbG9jKGJsb2NrU2l6ZSksdGhpcy5fZmluYWxTaXplPWZpbmFsU2l6ZSx0aGlzLl9ibG9ja1NpemU9YmxvY2tTaXplLHRoaXMuX2xlbj0wfUhhc2gucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihkYXRhLGVuYyl7ZGF0YT10b0J1ZmZlcihkYXRhLGVuY3x8InV0ZjgiKTtmb3IodmFyIGJsb2NrPXRoaXMuX2Jsb2NrLGJsb2NrU2l6ZT10aGlzLl9ibG9ja1NpemUsbGVuZ3RoPWRhdGEubGVuZ3RoLGFjY3VtPXRoaXMuX2xlbixvZmZzZXQ9MDtvZmZzZXQ8bGVuZ3RoOyl7Zm9yKHZhciBhc3NpZ25lZD1hY2N1bSVibG9ja1NpemUscmVtYWluZGVyPU1hdGgubWluKGxlbmd0aC1vZmZzZXQsYmxvY2tTaXplLWFzc2lnbmVkKSxpPTA7aTxyZW1haW5kZXI7aSsrKWJsb2NrW2Fzc2lnbmVkK2ldPWRhdGFbb2Zmc2V0K2ldO29mZnNldCs9cmVtYWluZGVyLChhY2N1bSs9cmVtYWluZGVyKSVibG9ja1NpemU9PT0wJiZ0aGlzLl91cGRhdGUoYmxvY2spfXJldHVybiB0aGlzLl9sZW4rPWxlbmd0aCx0aGlzfSxIYXNoLnByb3RvdHlwZS5kaWdlc3Q9ZnVuY3Rpb24oZW5jKXt2YXIgcmVtPXRoaXMuX2xlbiV0aGlzLl9ibG9ja1NpemU7dGhpcy5fYmxvY2tbcmVtXT0xMjgsdGhpcy5fYmxvY2suZmlsbCgwLHJlbSsxKSxyZW0+PXRoaXMuX2ZpbmFsU2l6ZSYmKHRoaXMuX3VwZGF0ZSh0aGlzLl9ibG9jayksdGhpcy5fYmxvY2suZmlsbCgwKSk7dmFyIGJpdHM9OCp0aGlzLl9sZW47aWYoYml0czw9NDI5NDk2NzI5NSl0aGlzLl9ibG9jay53cml0ZVVJbnQzMkJFKGJpdHMsdGhpcy5fYmxvY2tTaXplLTQpO2Vsc2V7dmFyIGxvd0JpdHM9KDQyOTQ5NjcyOTUmYml0cyk+Pj4wLGhpZ2hCaXRzPShiaXRzLWxvd0JpdHMpLzQyOTQ5NjcyOTY7dGhpcy5fYmxvY2sud3JpdGVVSW50MzJCRShoaWdoQml0cyx0aGlzLl9ibG9ja1NpemUtOCksdGhpcy5fYmxvY2sud3JpdGVVSW50MzJCRShsb3dCaXRzLHRoaXMuX2Jsb2NrU2l6ZS00KX10aGlzLl91cGRhdGUodGhpcy5fYmxvY2spO3ZhciBoYXNoPXRoaXMuX2hhc2goKTtyZXR1cm4gZW5jP2hhc2gudG9TdHJpbmcoZW5jKTpoYXNofSxIYXNoLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJfdXBkYXRlIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3MiKX0sbW9kdWxlLmV4cG9ydHM9SGFzaH0sIi4uLy4uL25vZGVfbW9kdWxlcy9zaGEuanMvaW5kZXguanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uIFNIQShhbGdvcml0aG0pe3ZhciBhbGc9YWxnb3JpdGhtLnRvTG93ZXJDYXNlKCksQWxnb3JpdGhtPW1vZHVsZS5leHBvcnRzW2FsZ107aWYoIUFsZ29yaXRobSl0aHJvdyBuZXcgRXJyb3IoYWxnKyIgaXMgbm90IHN1cHBvcnRlZCAod2UgYWNjZXB0IHB1bGwgcmVxdWVzdHMpIik7cmV0dXJuIG5ldyBBbGdvcml0aG19LG1vZHVsZS5leHBvcnRzLnNoYT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc2hhLmpzL3NoYS5qcyIpLG1vZHVsZS5leHBvcnRzLnNoYTE9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3NoYS5qcy9zaGExLmpzIiksbW9kdWxlLmV4cG9ydHMuc2hhMjI0PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zaGEuanMvc2hhMjI0LmpzIiksbW9kdWxlLmV4cG9ydHMuc2hhMjU2PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zaGEuanMvc2hhMjU2LmpzIiksbW9kdWxlLmV4cG9ydHMuc2hhMzg0PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zaGEuanMvc2hhMzg0LmpzIiksbW9kdWxlLmV4cG9ydHMuc2hhNTEyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zaGEuanMvc2hhNTEyLmpzIil9LCIuLi8uLi9ub2RlX21vZHVsZXMvc2hhLmpzL3NoYS5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIGluaGVyaXRzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiksSGFzaD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc2hhLmpzL2hhc2guanMiKSxCdWZmZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3NhZmUtYnVmZmVyL2luZGV4LmpzIikuQnVmZmVyLEs9WzE1MTg1MDAyNDksMTg1OTc3NTM5MywtMTg5NDAwNzU4OCwtODk5NDk3NTE0XSxXPW5ldyBBcnJheSg4MCk7ZnVuY3Rpb24gU2hhKCl7dGhpcy5pbml0KCksdGhpcy5fdz1XLEhhc2guY2FsbCh0aGlzLDY0LDU2KX1mdW5jdGlvbiByb3RsNShudW0pe3JldHVybiBudW08PDV8bnVtPj4+Mjd9ZnVuY3Rpb24gcm90bDMwKG51bSl7cmV0dXJuIG51bTw8MzB8bnVtPj4+Mn1mdW5jdGlvbiBmdChzLGIsYyxkKXtyZXR1cm4gMD09PXM/YiZjfH5iJmQ6Mj09PXM/YiZjfGImZHxjJmQ6Yl5jXmR9aW5oZXJpdHMoU2hhLEhhc2gpLFNoYS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hPTE3MzI1ODQxOTMsdGhpcy5fYj00MDIzMjMzNDE3LHRoaXMuX2M9MjU2MjM4MzEwMix0aGlzLl9kPTI3MTczMzg3OCx0aGlzLl9lPTMyODUzNzc1MjAsdGhpc30sU2hhLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKE0pe2Zvcih2YXIgdz10aGlzLl93LGE9MHx0aGlzLl9hLGI9MHx0aGlzLl9iLGM9MHx0aGlzLl9jLGQ9MHx0aGlzLl9kLGU9MHx0aGlzLl9lLGk9MDtpPDE2OysraSl3W2ldPU0ucmVhZEludDMyQkUoNCppKTtmb3IoO2k8ODA7KytpKXdbaV09d1tpLTNdXndbaS04XV53W2ktMTRdXndbaS0xNl07Zm9yKHZhciBqPTA7ajw4MDsrK2ope3ZhciBzPX5+KGovMjApLHQ9cm90bDUoYSkrZnQocyxiLGMsZCkrZSt3W2pdK0tbc118MDtlPWQsZD1jLGM9cm90bDMwKGIpLGI9YSxhPXR9dGhpcy5fYT1hK3RoaXMuX2F8MCx0aGlzLl9iPWIrdGhpcy5fYnwwLHRoaXMuX2M9Yyt0aGlzLl9jfDAsdGhpcy5fZD1kK3RoaXMuX2R8MCx0aGlzLl9lPWUrdGhpcy5fZXwwfSxTaGEucHJvdG90eXBlLl9oYXNoPWZ1bmN0aW9uKCl7dmFyIEg9QnVmZmVyLmFsbG9jVW5zYWZlKDIwKTtyZXR1cm4gSC53cml0ZUludDMyQkUoMHx0aGlzLl9hLDApLEgud3JpdGVJbnQzMkJFKDB8dGhpcy5fYiw0KSxILndyaXRlSW50MzJCRSgwfHRoaXMuX2MsOCksSC53cml0ZUludDMyQkUoMHx0aGlzLl9kLDEyKSxILndyaXRlSW50MzJCRSgwfHRoaXMuX2UsMTYpLEh9LG1vZHVsZS5leHBvcnRzPVNoYX0sIi4uLy4uL25vZGVfbW9kdWxlcy9zaGEuanMvc2hhMS5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIGluaGVyaXRzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiksSGFzaD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc2hhLmpzL2hhc2guanMiKSxCdWZmZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3NhZmUtYnVmZmVyL2luZGV4LmpzIikuQnVmZmVyLEs9WzE1MTg1MDAyNDksMTg1OTc3NTM5MywtMTg5NDAwNzU4OCwtODk5NDk3NTE0XSxXPW5ldyBBcnJheSg4MCk7ZnVuY3Rpb24gU2hhMSgpe3RoaXMuaW5pdCgpLHRoaXMuX3c9VyxIYXNoLmNhbGwodGhpcyw2NCw1Nil9ZnVuY3Rpb24gcm90bDEobnVtKXtyZXR1cm4gbnVtPDwxfG51bT4+PjMxfWZ1bmN0aW9uIHJvdGw1KG51bSl7cmV0dXJuIG51bTw8NXxudW0+Pj4yN31mdW5jdGlvbiByb3RsMzAobnVtKXtyZXR1cm4gbnVtPDwzMHxudW0+Pj4yfWZ1bmN0aW9uIGZ0KHMsYixjLGQpe3JldHVybiAwPT09cz9iJmN8fmImZDoyPT09cz9iJmN8YiZkfGMmZDpiXmNeZH1pbmhlcml0cyhTaGExLEhhc2gpLFNoYTEucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYT0xNzMyNTg0MTkzLHRoaXMuX2I9NDAyMzIzMzQxNyx0aGlzLl9jPTI1NjIzODMxMDIsdGhpcy5fZD0yNzE3MzM4NzgsdGhpcy5fZT0zMjg1Mzc3NTIwLHRoaXN9LFNoYTEucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24oTSl7Zm9yKHZhciB3PXRoaXMuX3csYT0wfHRoaXMuX2EsYj0wfHRoaXMuX2IsYz0wfHRoaXMuX2MsZD0wfHRoaXMuX2QsZT0wfHRoaXMuX2UsaT0wO2k8MTY7KytpKXdbaV09TS5yZWFkSW50MzJCRSg0KmkpO2Zvcig7aTw4MDsrK2kpd1tpXT1yb3RsMSh3W2ktM11ed1tpLThdXndbaS0xNF1ed1tpLTE2XSk7Zm9yKHZhciBqPTA7ajw4MDsrK2ope3ZhciBzPX5+KGovMjApLHQ9cm90bDUoYSkrZnQocyxiLGMsZCkrZSt3W2pdK0tbc118MDtlPWQsZD1jLGM9cm90bDMwKGIpLGI9YSxhPXR9dGhpcy5fYT1hK3RoaXMuX2F8MCx0aGlzLl9iPWIrdGhpcy5fYnwwLHRoaXMuX2M9Yyt0aGlzLl9jfDAsdGhpcy5fZD1kK3RoaXMuX2R8MCx0aGlzLl9lPWUrdGhpcy5fZXwwfSxTaGExLnByb3RvdHlwZS5faGFzaD1mdW5jdGlvbigpe3ZhciBIPUJ1ZmZlci5hbGxvY1Vuc2FmZSgyMCk7cmV0dXJuIEgud3JpdGVJbnQzMkJFKDB8dGhpcy5fYSwwKSxILndyaXRlSW50MzJCRSgwfHRoaXMuX2IsNCksSC53cml0ZUludDMyQkUoMHx0aGlzLl9jLDgpLEgud3JpdGVJbnQzMkJFKDB8dGhpcy5fZCwxMiksSC53cml0ZUludDMyQkUoMHx0aGlzLl9lLDE2KSxIfSxtb2R1bGUuZXhwb3J0cz1TaGExfSwiLi4vLi4vbm9kZV9tb2R1bGVzL3NoYS5qcy9zaGEyMjQuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBpbmhlcml0cz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIpLFNoYTI1Nj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc2hhLmpzL3NoYTI1Ni5qcyIpLEhhc2g9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3NoYS5qcy9oYXNoLmpzIiksQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcyIpLkJ1ZmZlcixXPW5ldyBBcnJheSg2NCk7ZnVuY3Rpb24gU2hhMjI0KCl7dGhpcy5pbml0KCksdGhpcy5fdz1XLEhhc2guY2FsbCh0aGlzLDY0LDU2KX1pbmhlcml0cyhTaGEyMjQsU2hhMjU2KSxTaGEyMjQucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYT0zMjM4MzcxMDMyLHRoaXMuX2I9OTE0MTUwNjYzLHRoaXMuX2M9ODEyNzAyOTk5LHRoaXMuX2Q9NDE0NDkxMjY5Nyx0aGlzLl9lPTQyOTA3NzU4NTcsdGhpcy5fZj0xNzUwNjAzMDI1LHRoaXMuX2c9MTY5NDA3NjgzOSx0aGlzLl9oPTMyMDQwNzU0MjgsdGhpc30sU2hhMjI0LnByb3RvdHlwZS5faGFzaD1mdW5jdGlvbigpe3ZhciBIPUJ1ZmZlci5hbGxvY1Vuc2FmZSgyOCk7cmV0dXJuIEgud3JpdGVJbnQzMkJFKHRoaXMuX2EsMCksSC53cml0ZUludDMyQkUodGhpcy5fYiw0KSxILndyaXRlSW50MzJCRSh0aGlzLl9jLDgpLEgud3JpdGVJbnQzMkJFKHRoaXMuX2QsMTIpLEgud3JpdGVJbnQzMkJFKHRoaXMuX2UsMTYpLEgud3JpdGVJbnQzMkJFKHRoaXMuX2YsMjApLEgud3JpdGVJbnQzMkJFKHRoaXMuX2csMjQpLEh9LG1vZHVsZS5leHBvcnRzPVNoYTIyNH0sIi4uLy4uL25vZGVfbW9kdWxlcy9zaGEuanMvc2hhMjU2LmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgaW5oZXJpdHM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiKSxIYXNoPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zaGEuanMvaGFzaC5qcyIpLEJ1ZmZlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc2FmZS1idWZmZXIvaW5kZXguanMiKS5CdWZmZXIsSz1bMTExNjM1MjQwOCwxODk5NDQ3NDQxLDMwNDkzMjM0NzEsMzkyMTAwOTU3Myw5NjE5ODcxNjMsMTUwODk3MDk5MywyNDUzNjM1NzQ4LDI4NzA3NjMyMjEsMzYyNDM4MTA4MCwzMTA1OTg0MDEsNjA3MjI1Mjc4LDE0MjY4ODE5ODcsMTkyNTA3ODM4OCwyMTYyMDc4MjA2LDI2MTQ4ODgxMDMsMzI0ODIyMjU4MCwzODM1MzkwNDAxLDQwMjIyMjQ3NzQsMjY0MzQ3MDc4LDYwNDgwNzYyOCw3NzAyNTU5ODMsMTI0OTE1MDEyMiwxNTU1MDgxNjkyLDE5OTYwNjQ5ODYsMjU1NDIyMDg4MiwyODIxODM0MzQ5LDI5NTI5OTY4MDgsMzIxMDMxMzY3MSwzMzM2NTcxODkxLDM1ODQ1Mjg3MTEsMTEzOTI2OTkzLDMzODI0MTg5NSw2NjYzMDcyMDUsNzczNTI5OTEyLDEyOTQ3NTczNzIsMTM5NjE4MjI5MSwxNjk1MTgzNzAwLDE5ODY2NjEwNTEsMjE3NzAyNjM1MCwyNDU2OTU2MDM3LDI3MzA0ODU5MjEsMjgyMDMwMjQxMSwzMjU5NzMwODAwLDMzNDU3NjQ3NzEsMzUxNjA2NTgxNywzNjAwMzUyODA0LDQwOTQ1NzE5MDksMjc1NDIzMzQ0LDQzMDIyNzczNCw1MDY5NDg2MTYsNjU5MDYwNTU2LDg4Mzk5Nzg3Nyw5NTgxMzk1NzEsMTMyMjgyMjIxOCwxNTM3MDAyMDYzLDE3NDc4NzM3NzksMTk1NTU2MjIyMiwyMDI0MTA0ODE1LDIyMjc3MzA0NTIsMjM2MTg1MjQyNCwyNDI4NDM2NDc0LDI3NTY3MzQxODcsMzIwNDAzMTQ3OSwzMzI5MzI1Mjk4XSxXPW5ldyBBcnJheSg2NCk7ZnVuY3Rpb24gU2hhMjU2KCl7dGhpcy5pbml0KCksdGhpcy5fdz1XLEhhc2guY2FsbCh0aGlzLDY0LDU2KX1mdW5jdGlvbiBjaCh4LHkseil7cmV0dXJuIHpeeCYoeV56KX1mdW5jdGlvbiBtYWooeCx5LHope3JldHVybiB4Jnl8eiYoeHx5KX1mdW5jdGlvbiBzaWdtYTAoeCl7cmV0dXJuKHg+Pj4yfHg8PDMwKV4oeD4+PjEzfHg8PDE5KV4oeD4+PjIyfHg8PDEwKX1mdW5jdGlvbiBzaWdtYTEoeCl7cmV0dXJuKHg+Pj42fHg8PDI2KV4oeD4+PjExfHg8PDIxKV4oeD4+PjI1fHg8PDcpfWZ1bmN0aW9uIGdhbW1hMCh4KXtyZXR1cm4oeD4+Pjd8eDw8MjUpXih4Pj4+MTh8eDw8MTQpXng+Pj4zfWZ1bmN0aW9uIGdhbW1hMSh4KXtyZXR1cm4oeD4+PjE3fHg8PDE1KV4oeD4+PjE5fHg8PDEzKV54Pj4+MTB9aW5oZXJpdHMoU2hhMjU2LEhhc2gpLFNoYTI1Ni5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hPTE3NzkwMzM3MDMsdGhpcy5fYj0zMTQ0MTM0Mjc3LHRoaXMuX2M9MTAxMzkwNDI0Mix0aGlzLl9kPTI3NzM0ODA3NjIsdGhpcy5fZT0xMzU5ODkzMTE5LHRoaXMuX2Y9MjYwMDgyMjkyNCx0aGlzLl9nPTUyODczNDYzNSx0aGlzLl9oPTE1NDE0NTkyMjUsdGhpc30sU2hhMjU2LnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKE0pe2Zvcih2YXIgdz10aGlzLl93LGE9MHx0aGlzLl9hLGI9MHx0aGlzLl9iLGM9MHx0aGlzLl9jLGQ9MHx0aGlzLl9kLGU9MHx0aGlzLl9lLGY9MHx0aGlzLl9mLGc9MHx0aGlzLl9nLGg9MHx0aGlzLl9oLGk9MDtpPDE2OysraSl3W2ldPU0ucmVhZEludDMyQkUoNCppKTtmb3IoO2k8NjQ7KytpKXdbaV09Z2FtbWExKHdbaS0yXSkrd1tpLTddK2dhbW1hMCh3W2ktMTVdKSt3W2ktMTZdfDA7Zm9yKHZhciBqPTA7ajw2NDsrK2ope3ZhciBUMT1oK3NpZ21hMShlKStjaChlLGYsZykrS1tqXSt3W2pdfDAsVDI9c2lnbWEwKGEpK21haihhLGIsYyl8MDtoPWcsZz1mLGY9ZSxlPWQrVDF8MCxkPWMsYz1iLGI9YSxhPVQxK1QyfDB9dGhpcy5fYT1hK3RoaXMuX2F8MCx0aGlzLl9iPWIrdGhpcy5fYnwwLHRoaXMuX2M9Yyt0aGlzLl9jfDAsdGhpcy5fZD1kK3RoaXMuX2R8MCx0aGlzLl9lPWUrdGhpcy5fZXwwLHRoaXMuX2Y9Zit0aGlzLl9mfDAsdGhpcy5fZz1nK3RoaXMuX2d8MCx0aGlzLl9oPWgrdGhpcy5faHwwfSxTaGEyNTYucHJvdG90eXBlLl9oYXNoPWZ1bmN0aW9uKCl7dmFyIEg9QnVmZmVyLmFsbG9jVW5zYWZlKDMyKTtyZXR1cm4gSC53cml0ZUludDMyQkUodGhpcy5fYSwwKSxILndyaXRlSW50MzJCRSh0aGlzLl9iLDQpLEgud3JpdGVJbnQzMkJFKHRoaXMuX2MsOCksSC53cml0ZUludDMyQkUodGhpcy5fZCwxMiksSC53cml0ZUludDMyQkUodGhpcy5fZSwxNiksSC53cml0ZUludDMyQkUodGhpcy5fZiwyMCksSC53cml0ZUludDMyQkUodGhpcy5fZywyNCksSC53cml0ZUludDMyQkUodGhpcy5faCwyOCksSH0sbW9kdWxlLmV4cG9ydHM9U2hhMjU2fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3NoYS5qcy9zaGEzODQuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBpbmhlcml0cz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIpLFNIQTUxMj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc2hhLmpzL3NoYTUxMi5qcyIpLEhhc2g9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3NoYS5qcy9oYXNoLmpzIiksQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcyIpLkJ1ZmZlcixXPW5ldyBBcnJheSgxNjApO2Z1bmN0aW9uIFNoYTM4NCgpe3RoaXMuaW5pdCgpLHRoaXMuX3c9VyxIYXNoLmNhbGwodGhpcywxMjgsMTEyKX1pbmhlcml0cyhTaGEzODQsU0hBNTEyKSxTaGEzODQucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYWg9MzQxODA3MDM2NSx0aGlzLl9iaD0xNjU0MjcwMjUwLHRoaXMuX2NoPTI0Mzg1MjkzNzAsdGhpcy5fZGg9MzU1NDYyMzYwLHRoaXMuX2VoPTE3MzE0MDU0MTUsdGhpcy5fZmg9MjM5NDE4MDIzMSx0aGlzLl9naD0zNjc1MDA4NTI1LHRoaXMuX2hoPTEyMDMwNjI4MTMsdGhpcy5fYWw9MzIzODM3MTAzMix0aGlzLl9ibD05MTQxNTA2NjMsdGhpcy5fY2w9ODEyNzAyOTk5LHRoaXMuX2RsPTQxNDQ5MTI2OTcsdGhpcy5fZWw9NDI5MDc3NTg1Nyx0aGlzLl9mbD0xNzUwNjAzMDI1LHRoaXMuX2dsPTE2OTQwNzY4MzksdGhpcy5faGw9MzIwNDA3NTQyOCx0aGlzfSxTaGEzODQucHJvdG90eXBlLl9oYXNoPWZ1bmN0aW9uKCl7dmFyIEg9QnVmZmVyLmFsbG9jVW5zYWZlKDQ4KTtmdW5jdGlvbiB3cml0ZUludDY0QkUoaCxsLG9mZnNldCl7SC53cml0ZUludDMyQkUoaCxvZmZzZXQpLEgud3JpdGVJbnQzMkJFKGwsb2Zmc2V0KzQpfXJldHVybiB3cml0ZUludDY0QkUodGhpcy5fYWgsdGhpcy5fYWwsMCksd3JpdGVJbnQ2NEJFKHRoaXMuX2JoLHRoaXMuX2JsLDgpLHdyaXRlSW50NjRCRSh0aGlzLl9jaCx0aGlzLl9jbCwxNiksd3JpdGVJbnQ2NEJFKHRoaXMuX2RoLHRoaXMuX2RsLDI0KSx3cml0ZUludDY0QkUodGhpcy5fZWgsdGhpcy5fZWwsMzIpLHdyaXRlSW50NjRCRSh0aGlzLl9maCx0aGlzLl9mbCw0MCksSH0sbW9kdWxlLmV4cG9ydHM9U2hhMzg0fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3NoYS5qcy9zaGE1MTIuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBpbmhlcml0cz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIpLEhhc2g9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3NoYS5qcy9oYXNoLmpzIiksQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcyIpLkJ1ZmZlcixLPVsxMTE2MzUyNDA4LDM2MDk3Njc0NTgsMTg5OTQ0NzQ0MSw2MDI4OTE3MjUsMzA0OTMyMzQ3MSwzOTY0NDg0Mzk5LDM5MjEwMDk1NzMsMjE3MzI5NTU0OCw5NjE5ODcxNjMsNDA4MTYyODQ3MiwxNTA4OTcwOTkzLDMwNTM4MzQyNjUsMjQ1MzYzNTc0OCwyOTM3NjcxNTc5LDI4NzA3NjMyMjEsMzY2NDYwOTU2MCwzNjI0MzgxMDgwLDI3MzQ4ODMzOTQsMzEwNTk4NDAxLDExNjQ5OTY1NDIsNjA3MjI1Mjc4LDEzMjM2MTA3NjQsMTQyNjg4MTk4NywzNTkwMzA0OTk0LDE5MjUwNzgzODgsNDA2ODE4MjM4MywyMTYyMDc4MjA2LDk5MTMzNjExMywyNjE0ODg4MTAzLDYzMzgwMzMxNywzMjQ4MjIyNTgwLDM0Nzk3NzQ4NjgsMzgzNTM5MDQwMSwyNjY2NjEzNDU4LDQwMjIyMjQ3NzQsOTQ0NzExMTM5LDI2NDM0NzA3OCwyMzQxMjYyNzczLDYwNDgwNzYyOCwyMDA3ODAwOTMzLDc3MDI1NTk4MywxNDk1OTkwOTAxLDEyNDkxNTAxMjIsMTg1NjQzMTIzNSwxNTU1MDgxNjkyLDMxNzUyMTgxMzIsMTk5NjA2NDk4NiwyMTk4OTUwODM3LDI1NTQyMjA4ODIsMzk5OTcxOTMzOSwyODIxODM0MzQ5LDc2Njc4NDAxNiwyOTUyOTk2ODA4LDI1NjY1OTQ4NzksMzIxMDMxMzY3MSwzMjAzMzM3OTU2LDMzMzY1NzE4OTEsMTAzNDQ1NzAyNiwzNTg0NTI4NzExLDI0NjY5NDg5MDEsMTEzOTI2OTkzLDM3NTgzMjYzODMsMzM4MjQxODk1LDE2ODcxNzkzNiw2NjYzMDcyMDUsMTE4ODE3OTk2NCw3NzM1Mjk5MTIsMTU0NjA0NTczNCwxMjk0NzU3MzcyLDE1MjI4MDU0ODUsMTM5NjE4MjI5MSwyNjQzODMzODIzLDE2OTUxODM3MDAsMjM0MzUyNzM5MCwxOTg2NjYxMDUxLDEwMTQ0Nzc0ODAsMjE3NzAyNjM1MCwxMjA2NzU5MTQyLDI0NTY5NTYwMzcsMzQ0MDc3NjI3LDI3MzA0ODU5MjEsMTI5MDg2MzQ2MCwyODIwMzAyNDExLDMxNTg0NTQyNzMsMzI1OTczMDgwMCwzNTA1OTUyNjU3LDMzNDU3NjQ3NzEsMTA2MjE3MDA4LDM1MTYwNjU4MTcsMzYwNjAwODM0NCwzNjAwMzUyODA0LDE0MzI3MjU3NzYsNDA5NDU3MTkwOSwxNDY3MDMxNTk0LDI3NTQyMzM0NCw4NTExNjk3MjAsNDMwMjI3NzM0LDMxMDA4MjM3NTIsNTA2OTQ4NjE2LDEzNjMyNTgxOTUsNjU5MDYwNTU2LDM3NTA2ODU1OTMsODgzOTk3ODc3LDM3ODUwNTAyODAsOTU4MTM5NTcxLDMzMTgzMDc0MjcsMTMyMjgyMjIxOCwzODEyNzIzNDAzLDE1MzcwMDIwNjMsMjAwMzAzNDk5NSwxNzQ3ODczNzc5LDM2MDIwMzY4OTksMTk1NTU2MjIyMiwxNTc1OTkwMDEyLDIwMjQxMDQ4MTUsMTEyNTU5MjkyOCwyMjI3NzMwNDUyLDI3MTY5MDQzMDYsMjM2MTg1MjQyNCw0NDI3NzYwNDQsMjQyODQzNjQ3NCw1OTM2OTgzNDQsMjc1NjczNDE4NywzNzMzMTEwMjQ5LDMyMDQwMzE0NzksMjk5OTM1MTU3MywzMzI5MzI1Mjk4LDM4MTU5MjA0MjcsMzM5MTU2OTYxNCwzOTI4MzgzOTAwLDM1MTUyNjcyNzEsNTY2MjgwNzExLDM5NDAxODc2MDYsMzQ1NDA2OTUzNCw0MTE4NjMwMjcxLDQwMDAyMzk5OTIsMTE2NDE4NDc0LDE5MTQxMzg1NTQsMTc0MjkyNDIxLDI3MzEwNTUyNzAsMjg5MzgwMzU2LDMyMDM5OTMwMDYsNDYwMzkzMjY5LDMyMDYyMDMxNSw2ODU0NzE3MzMsNTg3NDk2ODM2LDg1MjE0Mjk3MSwxMDg2NzkyODUxLDEwMTcwMzYyOTgsMzY1NTQzMTAwLDExMjYwMDA1ODAsMjYxODI5NzY3NiwxMjg4MDMzNDcwLDM0MDk4NTUxNTgsMTUwMTUwNTk0OCw0MjM0NTA5ODY2LDE2MDcxNjc5MTUsOTg3MTY3NDY4LDE4MTY0MDIzMTYsMTI0NjE4OTU5MV0sVz1uZXcgQXJyYXkoMTYwKTtmdW5jdGlvbiBTaGE1MTIoKXt0aGlzLmluaXQoKSx0aGlzLl93PVcsSGFzaC5jYWxsKHRoaXMsMTI4LDExMil9ZnVuY3Rpb24gQ2goeCx5LHope3JldHVybiB6XngmKHleeil9ZnVuY3Rpb24gbWFqKHgseSx6KXtyZXR1cm4geCZ5fHomKHh8eSl9ZnVuY3Rpb24gc2lnbWEwKHgseGwpe3JldHVybih4Pj4+Mjh8eGw8PDQpXih4bD4+PjJ8eDw8MzApXih4bD4+Pjd8eDw8MjUpfWZ1bmN0aW9uIHNpZ21hMSh4LHhsKXtyZXR1cm4oeD4+PjE0fHhsPDwxOCleKHg+Pj4xOHx4bDw8MTQpXih4bD4+Pjl8eDw8MjMpfWZ1bmN0aW9uIEdhbW1hMCh4LHhsKXtyZXR1cm4oeD4+PjF8eGw8PDMxKV4oeD4+Pjh8eGw8PDI0KV54Pj4+N31mdW5jdGlvbiBHYW1tYTBsKHgseGwpe3JldHVybih4Pj4+MXx4bDw8MzEpXih4Pj4+OHx4bDw8MjQpXih4Pj4+N3x4bDw8MjUpfWZ1bmN0aW9uIEdhbW1hMSh4LHhsKXtyZXR1cm4oeD4+PjE5fHhsPDwxMyleKHhsPj4+Mjl8eDw8MyleeD4+PjZ9ZnVuY3Rpb24gR2FtbWExbCh4LHhsKXtyZXR1cm4oeD4+PjE5fHhsPDwxMyleKHhsPj4+Mjl8eDw8MyleKHg+Pj42fHhsPDwyNil9ZnVuY3Rpb24gZ2V0Q2FycnkoYSxiKXtyZXR1cm4gYT4+PjA8Yj4+PjA/MTowfWluaGVyaXRzKFNoYTUxMixIYXNoKSxTaGE1MTIucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYWg9MTc3OTAzMzcwMyx0aGlzLl9iaD0zMTQ0MTM0Mjc3LHRoaXMuX2NoPTEwMTM5MDQyNDIsdGhpcy5fZGg9Mjc3MzQ4MDc2Mix0aGlzLl9laD0xMzU5ODkzMTE5LHRoaXMuX2ZoPTI2MDA4MjI5MjQsdGhpcy5fZ2g9NTI4NzM0NjM1LHRoaXMuX2hoPTE1NDE0NTkyMjUsdGhpcy5fYWw9NDA4OTIzNTcyMCx0aGlzLl9ibD0yMjI3ODczNTk1LHRoaXMuX2NsPTQyNzExNzU3MjMsdGhpcy5fZGw9MTU5NTc1MDEyOSx0aGlzLl9lbD0yOTE3NTY1MTM3LHRoaXMuX2ZsPTcyNTUxMTE5OSx0aGlzLl9nbD00MjE1Mzg5NTQ3LHRoaXMuX2hsPTMyNzAzMzIwOSx0aGlzfSxTaGE1MTIucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24oTSl7Zm9yKHZhciB3PXRoaXMuX3csYWg9MHx0aGlzLl9haCxiaD0wfHRoaXMuX2JoLGNoPTB8dGhpcy5fY2gsZGg9MHx0aGlzLl9kaCxlaD0wfHRoaXMuX2VoLGZoPTB8dGhpcy5fZmgsZ2g9MHx0aGlzLl9naCxoaD0wfHRoaXMuX2hoLGFsPTB8dGhpcy5fYWwsYmw9MHx0aGlzLl9ibCxjbD0wfHRoaXMuX2NsLGRsPTB8dGhpcy5fZGwsZWw9MHx0aGlzLl9lbCxmbD0wfHRoaXMuX2ZsLGdsPTB8dGhpcy5fZ2wsaGw9MHx0aGlzLl9obCxpPTA7aTwzMjtpKz0yKXdbaV09TS5yZWFkSW50MzJCRSg0KmkpLHdbaSsxXT1NLnJlYWRJbnQzMkJFKDQqaSs0KTtmb3IoO2k8MTYwO2krPTIpe3ZhciB4aD13W2ktMzBdLHhsPXdbaS0zMCsxXSxnYW1tYTA9R2FtbWEwKHhoLHhsKSxnYW1tYTBsPUdhbW1hMGwoeGwseGgpLGdhbW1hMT1HYW1tYTEoeGg9d1tpLTRdLHhsPXdbaS00KzFdKSxnYW1tYTFsPUdhbW1hMWwoeGwseGgpLFdpN2g9d1tpLTE0XSxXaTdsPXdbaS0xNCsxXSxXaTE2aD13W2ktMzJdLFdpMTZsPXdbaS0zMisxXSxXaWw9Z2FtbWEwbCtXaTdsfDAsV2loPWdhbW1hMCtXaTdoK2dldENhcnJ5KFdpbCxnYW1tYTBsKXwwO1dpaD0oV2loPVdpaCtnYW1tYTErZ2V0Q2FycnkoV2lsPVdpbCtnYW1tYTFsfDAsZ2FtbWExbCl8MCkrV2kxNmgrZ2V0Q2FycnkoV2lsPVdpbCtXaTE2bHwwLFdpMTZsKXwwLHdbaV09V2loLHdbaSsxXT1XaWx9Zm9yKHZhciBqPTA7ajwxNjA7ais9Mil7V2loPXdbal0sV2lsPXdbaisxXTt2YXIgbWFqaD1tYWooYWgsYmgsY2gpLG1hamw9bWFqKGFsLGJsLGNsKSxzaWdtYTBoPXNpZ21hMChhaCxhbCksc2lnbWEwbD1zaWdtYTAoYWwsYWgpLHNpZ21hMWg9c2lnbWExKGVoLGVsKSxzaWdtYTFsPXNpZ21hMShlbCxlaCksS2loPUtbal0sS2lsPUtbaisxXSxjaGg9Q2goZWgsZmgsZ2gpLGNobD1DaChlbCxmbCxnbCksdDFsPWhsK3NpZ21hMWx8MCx0MWg9aGgrc2lnbWExaCtnZXRDYXJyeSh0MWwsaGwpfDA7dDFoPSh0MWg9KHQxaD10MWgrY2hoK2dldENhcnJ5KHQxbD10MWwrY2hsfDAsY2hsKXwwKStLaWgrZ2V0Q2FycnkodDFsPXQxbCtLaWx8MCxLaWwpfDApK1dpaCtnZXRDYXJyeSh0MWw9dDFsK1dpbHwwLFdpbCl8MDt2YXIgdDJsPXNpZ21hMGwrbWFqbHwwLHQyaD1zaWdtYTBoK21hamgrZ2V0Q2FycnkodDJsLHNpZ21hMGwpfDA7aGg9Z2gsaGw9Z2wsZ2g9ZmgsZ2w9ZmwsZmg9ZWgsZmw9ZWwsZWg9ZGgrdDFoK2dldENhcnJ5KGVsPWRsK3QxbHwwLGRsKXwwLGRoPWNoLGRsPWNsLGNoPWJoLGNsPWJsLGJoPWFoLGJsPWFsLGFoPXQxaCt0MmgrZ2V0Q2FycnkoYWw9dDFsK3QybHwwLHQxbCl8MH10aGlzLl9hbD10aGlzLl9hbCthbHwwLHRoaXMuX2JsPXRoaXMuX2JsK2JsfDAsdGhpcy5fY2w9dGhpcy5fY2wrY2x8MCx0aGlzLl9kbD10aGlzLl9kbCtkbHwwLHRoaXMuX2VsPXRoaXMuX2VsK2VsfDAsdGhpcy5fZmw9dGhpcy5fZmwrZmx8MCx0aGlzLl9nbD10aGlzLl9nbCtnbHwwLHRoaXMuX2hsPXRoaXMuX2hsK2hsfDAsdGhpcy5fYWg9dGhpcy5fYWgrYWgrZ2V0Q2FycnkodGhpcy5fYWwsYWwpfDAsdGhpcy5fYmg9dGhpcy5fYmgrYmgrZ2V0Q2FycnkodGhpcy5fYmwsYmwpfDAsdGhpcy5fY2g9dGhpcy5fY2grY2grZ2V0Q2FycnkodGhpcy5fY2wsY2wpfDAsdGhpcy5fZGg9dGhpcy5fZGgrZGgrZ2V0Q2FycnkodGhpcy5fZGwsZGwpfDAsdGhpcy5fZWg9dGhpcy5fZWgrZWgrZ2V0Q2FycnkodGhpcy5fZWwsZWwpfDAsdGhpcy5fZmg9dGhpcy5fZmgrZmgrZ2V0Q2FycnkodGhpcy5fZmwsZmwpfDAsdGhpcy5fZ2g9dGhpcy5fZ2grZ2grZ2V0Q2FycnkodGhpcy5fZ2wsZ2wpfDAsdGhpcy5faGg9dGhpcy5faGgraGgrZ2V0Q2FycnkodGhpcy5faGwsaGwpfDB9LFNoYTUxMi5wcm90b3R5cGUuX2hhc2g9ZnVuY3Rpb24oKXt2YXIgSD1CdWZmZXIuYWxsb2NVbnNhZmUoNjQpO2Z1bmN0aW9uIHdyaXRlSW50NjRCRShoLGwsb2Zmc2V0KXtILndyaXRlSW50MzJCRShoLG9mZnNldCksSC53cml0ZUludDMyQkUobCxvZmZzZXQrNCl9cmV0dXJuIHdyaXRlSW50NjRCRSh0aGlzLl9haCx0aGlzLl9hbCwwKSx3cml0ZUludDY0QkUodGhpcy5fYmgsdGhpcy5fYmwsOCksd3JpdGVJbnQ2NEJFKHRoaXMuX2NoLHRoaXMuX2NsLDE2KSx3cml0ZUludDY0QkUodGhpcy5fZGgsdGhpcy5fZGwsMjQpLHdyaXRlSW50NjRCRSh0aGlzLl9laCx0aGlzLl9lbCwzMiksd3JpdGVJbnQ2NEJFKHRoaXMuX2ZoLHRoaXMuX2ZsLDQwKSx3cml0ZUludDY0QkUodGhpcy5fZ2gsdGhpcy5fZ2wsNDgpLHdyaXRlSW50NjRCRSh0aGlzLl9oaCx0aGlzLl9obCw1NiksSH0sbW9kdWxlLmV4cG9ydHM9U2hhNTEyfSwiLi4vLi4vbm9kZV9tb2R1bGVzL3NpZGUtY2hhbm5lbC1saXN0L2luZGV4LmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgaW5zcGVjdD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvb2JqZWN0LWluc3BlY3QvaW5kZXguanMiKSwkVHlwZUVycm9yPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvdHlwZS5qcyIpLGxpc3RHZXROb2RlPWZ1bmN0aW9uKGxpc3Qsa2V5LGlzRGVsZXRlKXtmb3IodmFyIGN1cnIscHJldj1saXN0O251bGwhPShjdXJyPXByZXYubmV4dCk7cHJldj1jdXJyKWlmKGN1cnIua2V5PT09a2V5KXJldHVybiBwcmV2Lm5leHQ9Y3Vyci5uZXh0LGlzRGVsZXRlfHwoY3Vyci5uZXh0PWxpc3QubmV4dCxsaXN0Lm5leHQ9Y3VyciksY3Vycn07bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24gZ2V0U2lkZUNoYW5uZWxMaXN0KCl7dmFyICRvLGNoYW5uZWw9e2Fzc2VydDpmdW5jdGlvbihrZXkpe2lmKCFjaGFubmVsLmhhcyhrZXkpKXRocm93IG5ldyAkVHlwZUVycm9yKCJTaWRlIGNoYW5uZWwgZG9lcyBub3QgY29udGFpbiAiK2luc3BlY3Qoa2V5KSl9LGRlbGV0ZTpmdW5jdGlvbihrZXkpe3ZhciBkZWxldGVkTm9kZT1mdW5jdGlvbihvYmplY3RzLGtleSl7aWYob2JqZWN0cylyZXR1cm4gbGlzdEdldE5vZGUob2JqZWN0cyxrZXksITApfSgkbyxrZXkpO3JldHVybiBkZWxldGVkTm9kZSYmJG8mJiEkby5uZXh0JiYoJG89dm9pZCAwKSwhIWRlbGV0ZWROb2RlfSxnZXQ6ZnVuY3Rpb24oa2V5KXtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0cyxrZXkpe2lmKG9iamVjdHMpe3ZhciBub2RlPWxpc3RHZXROb2RlKG9iamVjdHMsa2V5KTtyZXR1cm4gbm9kZSYmbm9kZS52YWx1ZX19KCRvLGtleSl9LGhhczpmdW5jdGlvbihrZXkpe3JldHVybiBmdW5jdGlvbihvYmplY3RzLGtleSl7cmV0dXJuISFvYmplY3RzJiYhIWxpc3RHZXROb2RlKG9iamVjdHMsa2V5KX0oJG8sa2V5KX0sc2V0OmZ1bmN0aW9uKGtleSx2YWx1ZSl7JG98fCgkbz17bmV4dDp2b2lkIDB9KSxmdW5jdGlvbihvYmplY3RzLGtleSx2YWx1ZSl7dmFyIG5vZGU9bGlzdEdldE5vZGUob2JqZWN0cyxrZXkpO25vZGU/bm9kZS52YWx1ZT12YWx1ZTpvYmplY3RzLm5leHQ9e2tleSxuZXh0Om9iamVjdHMubmV4dCx2YWx1ZX19KCRvLGtleSx2YWx1ZSl9fTtyZXR1cm4gY2hhbm5lbH19LCIuLi8uLi9ub2RlX21vZHVsZXMvc2lkZS1jaGFubmVsLW1hcC9pbmRleC5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIEdldEludHJpbnNpYz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZ2V0LWludHJpbnNpYy9pbmRleC5qcyIpLGNhbGxCb3VuZD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvY2FsbC1ib3VuZC9pbmRleC5qcyIpLGluc3BlY3Q9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL29iamVjdC1pbnNwZWN0L2luZGV4LmpzIiksJFR5cGVFcnJvcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZXMtZXJyb3JzL3R5cGUuanMiKSwkTWFwPUdldEludHJpbnNpYygiJU1hcCUiLCEwKSwkbWFwR2V0PWNhbGxCb3VuZCgiTWFwLnByb3RvdHlwZS5nZXQiLCEwKSwkbWFwU2V0PWNhbGxCb3VuZCgiTWFwLnByb3RvdHlwZS5zZXQiLCEwKSwkbWFwSGFzPWNhbGxCb3VuZCgiTWFwLnByb3RvdHlwZS5oYXMiLCEwKSwkbWFwRGVsZXRlPWNhbGxCb3VuZCgiTWFwLnByb3RvdHlwZS5kZWxldGUiLCEwKSwkbWFwU2l6ZT1jYWxsQm91bmQoIk1hcC5wcm90b3R5cGUuc2l6ZSIsITApO21vZHVsZS5leHBvcnRzPSEhJE1hcCYmZnVuY3Rpb24gZ2V0U2lkZUNoYW5uZWxNYXAoKXt2YXIgJG0sY2hhbm5lbD17YXNzZXJ0OmZ1bmN0aW9uKGtleSl7aWYoIWNoYW5uZWwuaGFzKGtleSkpdGhyb3cgbmV3ICRUeXBlRXJyb3IoIlNpZGUgY2hhbm5lbCBkb2VzIG5vdCBjb250YWluICIraW5zcGVjdChrZXkpKX0sZGVsZXRlOmZ1bmN0aW9uKGtleSl7aWYoJG0pe3ZhciByZXN1bHQ9JG1hcERlbGV0ZSgkbSxrZXkpO3JldHVybiAwPT09JG1hcFNpemUoJG0pJiYoJG09dm9pZCAwKSxyZXN1bHR9cmV0dXJuITF9LGdldDpmdW5jdGlvbihrZXkpe2lmKCRtKXJldHVybiAkbWFwR2V0KCRtLGtleSl9LGhhczpmdW5jdGlvbihrZXkpe3JldHVybiEhJG0mJiRtYXBIYXMoJG0sa2V5KX0sc2V0OmZ1bmN0aW9uKGtleSx2YWx1ZSl7JG18fCgkbT1uZXcgJE1hcCksJG1hcFNldCgkbSxrZXksdmFsdWUpfX07cmV0dXJuIGNoYW5uZWx9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3NpZGUtY2hhbm5lbC13ZWFrbWFwL2luZGV4LmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgR2V0SW50cmluc2ljPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9nZXQtaW50cmluc2ljL2luZGV4LmpzIiksY2FsbEJvdW5kPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9jYWxsLWJvdW5kL2luZGV4LmpzIiksaW5zcGVjdD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvb2JqZWN0LWluc3BlY3QvaW5kZXguanMiKSxnZXRTaWRlQ2hhbm5lbE1hcD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc2lkZS1jaGFubmVsLW1hcC9pbmRleC5qcyIpLCRUeXBlRXJyb3I9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2VzLWVycm9ycy90eXBlLmpzIiksJFdlYWtNYXA9R2V0SW50cmluc2ljKCIlV2Vha01hcCUiLCEwKSwkd2Vha01hcEdldD1jYWxsQm91bmQoIldlYWtNYXAucHJvdG90eXBlLmdldCIsITApLCR3ZWFrTWFwU2V0PWNhbGxCb3VuZCgiV2Vha01hcC5wcm90b3R5cGUuc2V0IiwhMCksJHdlYWtNYXBIYXM9Y2FsbEJvdW5kKCJXZWFrTWFwLnByb3RvdHlwZS5oYXMiLCEwKSwkd2Vha01hcERlbGV0ZT1jYWxsQm91bmQoIldlYWtNYXAucHJvdG90eXBlLmRlbGV0ZSIsITApO21vZHVsZS5leHBvcnRzPSRXZWFrTWFwP2Z1bmN0aW9uIGdldFNpZGVDaGFubmVsV2Vha01hcCgpe3ZhciAkd20sJG0sY2hhbm5lbD17YXNzZXJ0OmZ1bmN0aW9uKGtleSl7aWYoIWNoYW5uZWwuaGFzKGtleSkpdGhyb3cgbmV3ICRUeXBlRXJyb3IoIlNpZGUgY2hhbm5lbCBkb2VzIG5vdCBjb250YWluICIraW5zcGVjdChrZXkpKX0sZGVsZXRlOmZ1bmN0aW9uKGtleSl7aWYoJFdlYWtNYXAmJmtleSYmKCJvYmplY3QiPT10eXBlb2Yga2V5fHwiZnVuY3Rpb24iPT10eXBlb2Yga2V5KSl7aWYoJHdtKXJldHVybiAkd2Vha01hcERlbGV0ZSgkd20sa2V5KX1lbHNlIGlmKGdldFNpZGVDaGFubmVsTWFwJiYkbSlyZXR1cm4gJG0uZGVsZXRlKGtleSk7cmV0dXJuITF9LGdldDpmdW5jdGlvbihrZXkpe3JldHVybiAkV2Vha01hcCYma2V5JiYoIm9iamVjdCI9PXR5cGVvZiBrZXl8fCJmdW5jdGlvbiI9PXR5cGVvZiBrZXkpJiYkd20/JHdlYWtNYXBHZXQoJHdtLGtleSk6JG0mJiRtLmdldChrZXkpfSxoYXM6ZnVuY3Rpb24oa2V5KXtyZXR1cm4gJFdlYWtNYXAmJmtleSYmKCJvYmplY3QiPT10eXBlb2Yga2V5fHwiZnVuY3Rpb24iPT10eXBlb2Yga2V5KSYmJHdtPyR3ZWFrTWFwSGFzKCR3bSxrZXkpOiEhJG0mJiRtLmhhcyhrZXkpfSxzZXQ6ZnVuY3Rpb24oa2V5LHZhbHVlKXskV2Vha01hcCYma2V5JiYoIm9iamVjdCI9PXR5cGVvZiBrZXl8fCJmdW5jdGlvbiI9PXR5cGVvZiBrZXkpPygkd218fCgkd209bmV3ICRXZWFrTWFwKSwkd2Vha01hcFNldCgkd20sa2V5LHZhbHVlKSk6Z2V0U2lkZUNoYW5uZWxNYXAmJigkbXx8KCRtPWdldFNpZGVDaGFubmVsTWFwKCkpLCRtLnNldChrZXksdmFsdWUpKX19O3JldHVybiBjaGFubmVsfTpnZXRTaWRlQ2hhbm5lbE1hcH0sIi4uLy4uL25vZGVfbW9kdWxlcy9zaWRlLWNoYW5uZWwvaW5kZXguanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciAkVHlwZUVycm9yPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9lcy1lcnJvcnMvdHlwZS5qcyIpLGluc3BlY3Q9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL29iamVjdC1pbnNwZWN0L2luZGV4LmpzIiksZ2V0U2lkZUNoYW5uZWxMaXN0PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zaWRlLWNoYW5uZWwtbGlzdC9pbmRleC5qcyIpLGdldFNpZGVDaGFubmVsTWFwPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zaWRlLWNoYW5uZWwtbWFwL2luZGV4LmpzIiksbWFrZUNoYW5uZWw9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3NpZGUtY2hhbm5lbC13ZWFrbWFwL2luZGV4LmpzIil8fGdldFNpZGVDaGFubmVsTWFwfHxnZXRTaWRlQ2hhbm5lbExpc3Q7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24gZ2V0U2lkZUNoYW5uZWwoKXt2YXIgJGNoYW5uZWxEYXRhLGNoYW5uZWw9e2Fzc2VydDpmdW5jdGlvbihrZXkpe2lmKCFjaGFubmVsLmhhcyhrZXkpKXRocm93IG5ldyAkVHlwZUVycm9yKCJTaWRlIGNoYW5uZWwgZG9lcyBub3QgY29udGFpbiAiK2luc3BlY3Qoa2V5KSl9LGRlbGV0ZTpmdW5jdGlvbihrZXkpe3JldHVybiEhJGNoYW5uZWxEYXRhJiYkY2hhbm5lbERhdGEuZGVsZXRlKGtleSl9LGdldDpmdW5jdGlvbihrZXkpe3JldHVybiAkY2hhbm5lbERhdGEmJiRjaGFubmVsRGF0YS5nZXQoa2V5KX0saGFzOmZ1bmN0aW9uKGtleSl7cmV0dXJuISEkY2hhbm5lbERhdGEmJiRjaGFubmVsRGF0YS5oYXMoa2V5KX0sc2V0OmZ1bmN0aW9uKGtleSx2YWx1ZSl7JGNoYW5uZWxEYXRhfHwoJGNoYW5uZWxEYXRhPW1ha2VDaGFubmVsKCkpLCRjaGFubmVsRGF0YS5zZXQoa2V5LHZhbHVlKX19O3JldHVybiBjaGFubmVsfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9pbmRleC5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXttb2R1bGUuZXhwb3J0cz1TdHJlYW07dmFyIEVFPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9ldmVudHMvZXZlbnRzLmpzIikuRXZlbnRFbWl0dGVyO2Z1bmN0aW9uIFN0cmVhbSgpe0VFLmNhbGwodGhpcyl9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiKShTdHJlYW0sRUUpLFN0cmVhbS5SZWFkYWJsZT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcyIpLFN0cmVhbS5Xcml0YWJsZT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV93cml0YWJsZS5qcyIpLFN0cmVhbS5EdXBsZXg9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fZHVwbGV4LmpzIiksU3RyZWFtLlRyYW5zZm9ybT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMiKSxTdHJlYW0uUGFzc1Rocm91Z2g9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMiKSxTdHJlYW0uZmluaXNoZWQ9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZW5kLW9mLXN0cmVhbS5qcyIpLFN0cmVhbS5waXBlbGluZT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9waXBlbGluZS5qcyIpLFN0cmVhbS5TdHJlYW09U3RyZWFtLFN0cmVhbS5wcm90b3R5cGUucGlwZT1mdW5jdGlvbihkZXN0LG9wdGlvbnMpe3ZhciBzb3VyY2U9dGhpcztmdW5jdGlvbiBvbmRhdGEoY2h1bmspe2Rlc3Qud3JpdGFibGUmJiExPT09ZGVzdC53cml0ZShjaHVuaykmJnNvdXJjZS5wYXVzZSYmc291cmNlLnBhdXNlKCl9ZnVuY3Rpb24gb25kcmFpbigpe3NvdXJjZS5yZWFkYWJsZSYmc291cmNlLnJlc3VtZSYmc291cmNlLnJlc3VtZSgpfXNvdXJjZS5vbigiZGF0YSIsb25kYXRhKSxkZXN0Lm9uKCJkcmFpbiIsb25kcmFpbiksZGVzdC5faXNTdGRpb3x8b3B0aW9ucyYmITE9PT1vcHRpb25zLmVuZHx8KHNvdXJjZS5vbigiZW5kIixvbmVuZCksc291cmNlLm9uKCJjbG9zZSIsb25jbG9zZSkpO3ZhciBkaWRPbkVuZD0hMTtmdW5jdGlvbiBvbmVuZCgpe2RpZE9uRW5kfHwoZGlkT25FbmQ9ITAsZGVzdC5lbmQoKSl9ZnVuY3Rpb24gb25jbG9zZSgpe2RpZE9uRW5kfHwoZGlkT25FbmQ9ITAsImZ1bmN0aW9uIj09dHlwZW9mIGRlc3QuZGVzdHJveSYmZGVzdC5kZXN0cm95KCkpfWZ1bmN0aW9uIG9uZXJyb3IoZXIpe2lmKGNsZWFudXAoKSwwPT09RUUubGlzdGVuZXJDb3VudCh0aGlzLCJlcnJvciIpKXRocm93IGVyfWZ1bmN0aW9uIGNsZWFudXAoKXtzb3VyY2UucmVtb3ZlTGlzdGVuZXIoImRhdGEiLG9uZGF0YSksZGVzdC5yZW1vdmVMaXN0ZW5lcigiZHJhaW4iLG9uZHJhaW4pLHNvdXJjZS5yZW1vdmVMaXN0ZW5lcigiZW5kIixvbmVuZCksc291cmNlLnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsb25jbG9zZSksc291cmNlLnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsb25lcnJvciksZGVzdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLG9uZXJyb3IpLHNvdXJjZS5yZW1vdmVMaXN0ZW5lcigiZW5kIixjbGVhbnVwKSxzb3VyY2UucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixjbGVhbnVwKSxkZXN0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsY2xlYW51cCl9cmV0dXJuIHNvdXJjZS5vbigiZXJyb3IiLG9uZXJyb3IpLGRlc3Qub24oImVycm9yIixvbmVycm9yKSxzb3VyY2Uub24oImVuZCIsY2xlYW51cCksc291cmNlLm9uKCJjbG9zZSIsY2xlYW51cCksZGVzdC5vbigiY2xvc2UiLGNsZWFudXApLGRlc3QuZW1pdCgicGlwZSIsc291cmNlKSxkZXN0fX0sIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2Vycm9ycy1icm93c2VyLmpzIihtb2R1bGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgY29kZXM9e307ZnVuY3Rpb24gY3JlYXRlRXJyb3JUeXBlKGNvZGUsbWVzc2FnZSxCYXNlKXtCYXNlfHwoQmFzZT1FcnJvcik7dmFyIE5vZGVFcnJvcj1mdW5jdGlvbihfQmFzZSl7ZnVuY3Rpb24gTm9kZUVycm9yKGFyZzEsYXJnMixhcmczKXtyZXR1cm4gX0Jhc2UuY2FsbCh0aGlzLGZ1bmN0aW9uIGdldE1lc3NhZ2UoYXJnMSxhcmcyLGFyZzMpe3JldHVybiJzdHJpbmciPT10eXBlb2YgbWVzc2FnZT9tZXNzYWdlOm1lc3NhZ2UoYXJnMSxhcmcyLGFyZzMpfShhcmcxLGFyZzIsYXJnMykpfHx0aGlzfXJldHVybiBmdW5jdGlvbiBfaW5oZXJpdHNMb29zZShzdWJDbGFzcyxzdXBlckNsYXNzKXtzdWJDbGFzcy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSksc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yPXN1YkNsYXNzLHN1YkNsYXNzLl9fcHJvdG9fXz1zdXBlckNsYXNzfShOb2RlRXJyb3IsX0Jhc2UpLE5vZGVFcnJvcn0oQmFzZSk7Tm9kZUVycm9yLnByb3RvdHlwZS5uYW1lPUJhc2UubmFtZSxOb2RlRXJyb3IucHJvdG90eXBlLmNvZGU9Y29kZSxjb2Rlc1tjb2RlXT1Ob2RlRXJyb3J9ZnVuY3Rpb24gb25lT2YoZXhwZWN0ZWQsdGhpbmcpe2lmKEFycmF5LmlzQXJyYXkoZXhwZWN0ZWQpKXt2YXIgbGVuPWV4cGVjdGVkLmxlbmd0aDtyZXR1cm4gZXhwZWN0ZWQ9ZXhwZWN0ZWQubWFwKGZ1bmN0aW9uKGkpe3JldHVybiBTdHJpbmcoaSl9KSxsZW4+Mj8ib25lIG9mICIuY29uY2F0KHRoaW5nLCIgIikuY29uY2F0KGV4cGVjdGVkLnNsaWNlKDAsbGVuLTEpLmpvaW4oIiwgIiksIiwgb3IgIikrZXhwZWN0ZWRbbGVuLTFdOjI9PT1sZW4/Im9uZSBvZiAiLmNvbmNhdCh0aGluZywiICIpLmNvbmNhdChleHBlY3RlZFswXSwiIG9yICIpLmNvbmNhdChleHBlY3RlZFsxXSk6Im9mICIuY29uY2F0KHRoaW5nLCIgIikuY29uY2F0KGV4cGVjdGVkWzBdKX1yZXR1cm4ib2YgIi5jb25jYXQodGhpbmcsIiAiKS5jb25jYXQoU3RyaW5nKGV4cGVjdGVkKSl9Y3JlYXRlRXJyb3JUeXBlKCJFUlJfSU5WQUxJRF9PUFRfVkFMVUUiLGZ1bmN0aW9uKG5hbWUsdmFsdWUpe3JldHVybidUaGUgdmFsdWUgIicrdmFsdWUrJyIgaXMgaW52YWxpZCBmb3Igb3B0aW9uICInK25hbWUrJyInfSxUeXBlRXJyb3IpLGNyZWF0ZUVycm9yVHlwZSgiRVJSX0lOVkFMSURfQVJHX1RZUEUiLGZ1bmN0aW9uKG5hbWUsZXhwZWN0ZWQsYWN0dWFsKXt2YXIgZGV0ZXJtaW5lcixtc2c7aWYoInN0cmluZyI9PXR5cGVvZiBleHBlY3RlZCYmZnVuY3Rpb24gc3RhcnRzV2l0aChzdHIsc2VhcmNoLHBvcyl7cmV0dXJuIHN0ci5zdWJzdHIoIXBvc3x8cG9zPDA/MDorcG9zLHNlYXJjaC5sZW5ndGgpPT09c2VhcmNofShleHBlY3RlZCwibm90ICIpPyhkZXRlcm1pbmVyPSJtdXN0IG5vdCBiZSIsZXhwZWN0ZWQ9ZXhwZWN0ZWQucmVwbGFjZSgvXm5vdCAvLCIiKSk6ZGV0ZXJtaW5lcj0ibXVzdCBiZSIsZnVuY3Rpb24gZW5kc1dpdGgoc3RyLHNlYXJjaCx0aGlzX2xlbil7cmV0dXJuKHZvaWQgMD09PXRoaXNfbGVufHx0aGlzX2xlbj5zdHIubGVuZ3RoKSYmKHRoaXNfbGVuPXN0ci5sZW5ndGgpLHN0ci5zdWJzdHJpbmcodGhpc19sZW4tc2VhcmNoLmxlbmd0aCx0aGlzX2xlbik9PT1zZWFyY2h9KG5hbWUsIiBhcmd1bWVudCIpKW1zZz0iVGhlICIuY29uY2F0KG5hbWUsIiAiKS5jb25jYXQoZGV0ZXJtaW5lciwiICIpLmNvbmNhdChvbmVPZihleHBlY3RlZCwidHlwZSIpKTtlbHNle3ZhciB0eXBlPWZ1bmN0aW9uIGluY2x1ZGVzKHN0cixzZWFyY2gsc3RhcnQpe3JldHVybiJudW1iZXIiIT10eXBlb2Ygc3RhcnQmJihzdGFydD0wKSwhKHN0YXJ0K3NlYXJjaC5sZW5ndGg+c3RyLmxlbmd0aCkmJi0xIT09c3RyLmluZGV4T2Yoc2VhcmNoLHN0YXJ0KX0obmFtZSwiLiIpPyJwcm9wZXJ0eSI6ImFyZ3VtZW50Ijttc2c9J1RoZSAiJy5jb25jYXQobmFtZSwnIiAnKS5jb25jYXQodHlwZSwiICIpLmNvbmNhdChkZXRlcm1pbmVyLCIgIikuY29uY2F0KG9uZU9mKGV4cGVjdGVkLCJ0eXBlIikpfXJldHVybiBtc2crPSIuIFJlY2VpdmVkIHR5cGUgIi5jb25jYXQodHlwZW9mIGFjdHVhbCl9LFR5cGVFcnJvciksY3JlYXRlRXJyb3JUeXBlKCJFUlJfU1RSRUFNX1BVU0hfQUZURVJfRU9GIiwic3RyZWFtLnB1c2goKSBhZnRlciBFT0YiKSxjcmVhdGVFcnJvclR5cGUoIkVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEIixmdW5jdGlvbihuYW1lKXtyZXR1cm4iVGhlICIrbmFtZSsiIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQifSksY3JlYXRlRXJyb3JUeXBlKCJFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRSIsIlByZW1hdHVyZSBjbG9zZSIpLGNyZWF0ZUVycm9yVHlwZSgiRVJSX1NUUkVBTV9ERVNUUk9ZRUQiLGZ1bmN0aW9uKG5hbWUpe3JldHVybiJDYW5ub3QgY2FsbCAiK25hbWUrIiBhZnRlciBhIHN0cmVhbSB3YXMgZGVzdHJveWVkIn0pLGNyZWF0ZUVycm9yVHlwZSgiRVJSX01VTFRJUExFX0NBTExCQUNLIiwiQ2FsbGJhY2sgY2FsbGVkIG11bHRpcGxlIHRpbWVzIiksY3JlYXRlRXJyb3JUeXBlKCJFUlJfU1RSRUFNX0NBTk5PVF9QSVBFIiwiQ2Fubm90IHBpcGUsIG5vdCByZWFkYWJsZSIpLGNyZWF0ZUVycm9yVHlwZSgiRVJSX1NUUkVBTV9XUklURV9BRlRFUl9FTkQiLCJ3cml0ZSBhZnRlciBlbmQiKSxjcmVhdGVFcnJvclR5cGUoIkVSUl9TVFJFQU1fTlVMTF9WQUxVRVMiLCJNYXkgbm90IHdyaXRlIG51bGwgdmFsdWVzIHRvIHN0cmVhbSIsVHlwZUVycm9yKSxjcmVhdGVFcnJvclR5cGUoIkVSUl9VTktOT1dOX0VOQ09ESU5HIixmdW5jdGlvbihhcmcpe3JldHVybiJVbmtub3duIGVuY29kaW5nOiAiK2FyZ30sVHlwZUVycm9yKSxjcmVhdGVFcnJvclR5cGUoIkVSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlQiLCJzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudCIpLG1vZHVsZS5leHBvcnRzLkY9Y29kZXN9LCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9kdXBsZXguanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBwcm9jZXNzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9ub2RlLXN0ZGxpYi1icm93c2VyL2Nqcy9wcm94eS9wcm9jZXNzLmpzIiksb2JqZWN0S2V5cz1PYmplY3Qua2V5c3x8ZnVuY3Rpb24ob2JqKXt2YXIga2V5cz1bXTtmb3IodmFyIGtleSBpbiBvYmopa2V5cy5wdXNoKGtleSk7cmV0dXJuIGtleXN9O21vZHVsZS5leHBvcnRzPUR1cGxleDt2YXIgUmVhZGFibGU9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcmVhZGFibGUuanMiKSxXcml0YWJsZT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV93cml0YWJsZS5qcyIpO19fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIikoRHVwbGV4LFJlYWRhYmxlKTtmb3IodmFyIGtleXM9b2JqZWN0S2V5cyhXcml0YWJsZS5wcm90b3R5cGUpLHY9MDt2PGtleXMubGVuZ3RoO3YrKyl7dmFyIG1ldGhvZD1rZXlzW3ZdO0R1cGxleC5wcm90b3R5cGVbbWV0aG9kXXx8KER1cGxleC5wcm90b3R5cGVbbWV0aG9kXT1Xcml0YWJsZS5wcm90b3R5cGVbbWV0aG9kXSl9ZnVuY3Rpb24gRHVwbGV4KG9wdGlvbnMpe2lmKCEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpcmV0dXJuIG5ldyBEdXBsZXgob3B0aW9ucyk7UmVhZGFibGUuY2FsbCh0aGlzLG9wdGlvbnMpLFdyaXRhYmxlLmNhbGwodGhpcyxvcHRpb25zKSx0aGlzLmFsbG93SGFsZk9wZW49ITAsb3B0aW9ucyYmKCExPT09b3B0aW9ucy5yZWFkYWJsZSYmKHRoaXMucmVhZGFibGU9ITEpLCExPT09b3B0aW9ucy53cml0YWJsZSYmKHRoaXMud3JpdGFibGU9ITEpLCExPT09b3B0aW9ucy5hbGxvd0hhbGZPcGVuJiYodGhpcy5hbGxvd0hhbGZPcGVuPSExLHRoaXMub25jZSgiZW5kIixvbmVuZCkpKX1mdW5jdGlvbiBvbmVuZCgpe3RoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWR8fHByb2Nlc3MubmV4dFRpY2sob25FbmROVCx0aGlzKX1mdW5jdGlvbiBvbkVuZE5UKHNlbGYpe3NlbGYuZW5kKCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsIndyaXRhYmxlSGlnaFdhdGVyTWFyayIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcmt9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsIndyaXRhYmxlQnVmZmVyIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUmJnRoaXMuX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyKCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsIndyaXRhYmxlTGVuZ3RoIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUubGVuZ3RofX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdXBsZXgucHJvdG90eXBlLCJkZXN0cm95ZWQiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fcmVhZGFibGVTdGF0ZSYmdm9pZCAwIT09dGhpcy5fd3JpdGFibGVTdGF0ZSYmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkJiZ0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCl9LHNldDpmdW5jdGlvbiBzZXQodmFsdWUpe3ZvaWQgMCE9PXRoaXMuX3JlYWRhYmxlU3RhdGUmJnZvaWQgMCE9PXRoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD12YWx1ZSx0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD12YWx1ZSl9fSl9LCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9wYXNzdGhyb3VnaC5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7bW9kdWxlLmV4cG9ydHM9UGFzc1Rocm91Z2g7dmFyIFRyYW5zZm9ybT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMiKTtmdW5jdGlvbiBQYXNzVGhyb3VnaChvcHRpb25zKXtpZighKHRoaXMgaW5zdGFuY2VvZiBQYXNzVGhyb3VnaCkpcmV0dXJuIG5ldyBQYXNzVGhyb3VnaChvcHRpb25zKTtUcmFuc2Zvcm0uY2FsbCh0aGlzLG9wdGlvbnMpfV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIikoUGFzc1Rocm91Z2gsVHJhbnNmb3JtKSxQYXNzVGhyb3VnaC5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbihjaHVuayxlbmNvZGluZyxjYil7Y2IobnVsbCxjaHVuayl9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcmVhZGFibGUuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBEdXBsZXgscHJvY2Vzcz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbm9kZS1zdGRsaWItYnJvd3Nlci9janMvcHJveHkvcHJvY2Vzcy5qcyIpO21vZHVsZS5leHBvcnRzPVJlYWRhYmxlLFJlYWRhYmxlLlJlYWRhYmxlU3RhdGU9UmVhZGFibGVTdGF0ZTtfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIpLkV2ZW50RW1pdHRlcjt2YXIgRUVsaXN0ZW5lckNvdW50PWZ1bmN0aW9uIEVFbGlzdGVuZXJDb3VudChlbWl0dGVyLHR5cGUpe3JldHVybiBlbWl0dGVyLmxpc3RlbmVycyh0eXBlKS5sZW5ndGh9LFN0cmVhbT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9zdHJlYW0tYnJvd3Nlci5qcyIpLEJ1ZmZlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzIikuQnVmZmVyLE91clVpbnQ4QXJyYXk9KHZvaWQgMCE9PV9fd2VicGFja19yZXF1aXJlX18uZz9fX3dlYnBhY2tfcmVxdWlyZV9fLmc6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnt9KS5VaW50OEFycmF5fHxmdW5jdGlvbigpe307dmFyIGRlYnVnLGRlYnVnVXRpbD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvdXRpbC91dGlsLmpzIik7ZGVidWc9ZGVidWdVdGlsJiZkZWJ1Z1V0aWwuZGVidWdsb2c/ZGVidWdVdGlsLmRlYnVnbG9nKCJzdHJlYW0iKTpmdW5jdGlvbiBkZWJ1Zygpe307dmFyIFN0cmluZ0RlY29kZXIsY3JlYXRlUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yLGZyb20sQnVmZmVyTGlzdD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9idWZmZXJfbGlzdC5qcyIpLGRlc3Ryb3lJbXBsPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3kuanMiKSxnZXRIaWdoV2F0ZXJNYXJrPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3N0YXRlLmpzIikuZ2V0SGlnaFdhdGVyTWFyayxfcmVxdWlyZSRjb2Rlcz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9lcnJvcnMtYnJvd3Nlci5qcyIpLkYsRVJSX0lOVkFMSURfQVJHX1RZUEU9X3JlcXVpcmUkY29kZXMuRVJSX0lOVkFMSURfQVJHX1RZUEUsRVJSX1NUUkVBTV9QVVNIX0FGVEVSX0VPRj1fcmVxdWlyZSRjb2Rlcy5FUlJfU1RSRUFNX1BVU0hfQUZURVJfRU9GLEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEPV9yZXF1aXJlJGNvZGVzLkVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVELEVSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlQ9X3JlcXVpcmUkY29kZXMuRVJSX1NUUkVBTV9VTlNISUZUX0FGVEVSX0VORF9FVkVOVDtfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIpKFJlYWRhYmxlLFN0cmVhbSk7dmFyIGVycm9yT3JEZXN0cm95PWRlc3Ryb3lJbXBsLmVycm9yT3JEZXN0cm95LGtQcm94eUV2ZW50cz1bImVycm9yIiwiY2xvc2UiLCJkZXN0cm95IiwicGF1c2UiLCJyZXN1bWUiXTtmdW5jdGlvbiBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsc3RyZWFtLGlzRHVwbGV4KXtEdXBsZXg9RHVwbGV4fHxfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9kdXBsZXguanMiKSxvcHRpb25zPW9wdGlvbnN8fHt9LCJib29sZWFuIiE9dHlwZW9mIGlzRHVwbGV4JiYoaXNEdXBsZXg9c3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4KSx0aGlzLm9iamVjdE1vZGU9ISFvcHRpb25zLm9iamVjdE1vZGUsaXNEdXBsZXgmJih0aGlzLm9iamVjdE1vZGU9dGhpcy5vYmplY3RNb2RlfHwhIW9wdGlvbnMucmVhZGFibGVPYmplY3RNb2RlKSx0aGlzLmhpZ2hXYXRlck1hcms9Z2V0SGlnaFdhdGVyTWFyayh0aGlzLG9wdGlvbnMsInJlYWRhYmxlSGlnaFdhdGVyTWFyayIsaXNEdXBsZXgpLHRoaXMuYnVmZmVyPW5ldyBCdWZmZXJMaXN0LHRoaXMubGVuZ3RoPTAsdGhpcy5waXBlcz1udWxsLHRoaXMucGlwZXNDb3VudD0wLHRoaXMuZmxvd2luZz1udWxsLHRoaXMuZW5kZWQ9ITEsdGhpcy5lbmRFbWl0dGVkPSExLHRoaXMucmVhZGluZz0hMSx0aGlzLnN5bmM9ITAsdGhpcy5uZWVkUmVhZGFibGU9ITEsdGhpcy5lbWl0dGVkUmVhZGFibGU9ITEsdGhpcy5yZWFkYWJsZUxpc3RlbmluZz0hMSx0aGlzLnJlc3VtZVNjaGVkdWxlZD0hMSx0aGlzLnBhdXNlZD0hMCx0aGlzLmVtaXRDbG9zZT0hMSE9PW9wdGlvbnMuZW1pdENsb3NlLHRoaXMuYXV0b0Rlc3Ryb3k9ISFvcHRpb25zLmF1dG9EZXN0cm95LHRoaXMuZGVzdHJveWVkPSExLHRoaXMuZGVmYXVsdEVuY29kaW5nPW9wdGlvbnMuZGVmYXVsdEVuY29kaW5nfHwidXRmOCIsdGhpcy5hd2FpdERyYWluPTAsdGhpcy5yZWFkaW5nTW9yZT0hMSx0aGlzLmRlY29kZXI9bnVsbCx0aGlzLmVuY29kaW5nPW51bGwsb3B0aW9ucy5lbmNvZGluZyYmKFN0cmluZ0RlY29kZXJ8fChTdHJpbmdEZWNvZGVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJpbmdfZGVjb2Rlci9saWIvc3RyaW5nX2RlY29kZXIuanMiKS5TdHJpbmdEZWNvZGVyKSx0aGlzLmRlY29kZXI9bmV3IFN0cmluZ0RlY29kZXIob3B0aW9ucy5lbmNvZGluZyksdGhpcy5lbmNvZGluZz1vcHRpb25zLmVuY29kaW5nKX1mdW5jdGlvbiBSZWFkYWJsZShvcHRpb25zKXtpZihEdXBsZXg9RHVwbGV4fHxfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9kdXBsZXguanMiKSwhKHRoaXMgaW5zdGFuY2VvZiBSZWFkYWJsZSkpcmV0dXJuIG5ldyBSZWFkYWJsZShvcHRpb25zKTt2YXIgaXNEdXBsZXg9dGhpcyBpbnN0YW5jZW9mIER1cGxleDt0aGlzLl9yZWFkYWJsZVN0YXRlPW5ldyBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsdGhpcyxpc0R1cGxleCksdGhpcy5yZWFkYWJsZT0hMCxvcHRpb25zJiYoImZ1bmN0aW9uIj09dHlwZW9mIG9wdGlvbnMucmVhZCYmKHRoaXMuX3JlYWQ9b3B0aW9ucy5yZWFkKSwiZnVuY3Rpb24iPT10eXBlb2Ygb3B0aW9ucy5kZXN0cm95JiYodGhpcy5fZGVzdHJveT1vcHRpb25zLmRlc3Ryb3kpKSxTdHJlYW0uY2FsbCh0aGlzKX1mdW5jdGlvbiByZWFkYWJsZUFkZENodW5rKHN0cmVhbSxjaHVuayxlbmNvZGluZyxhZGRUb0Zyb250LHNraXBDaHVua0NoZWNrKXtkZWJ1ZygicmVhZGFibGVBZGRDaHVuayIsY2h1bmspO3ZhciBlcixzdGF0ZT1zdHJlYW0uX3JlYWRhYmxlU3RhdGU7aWYobnVsbD09PWNodW5rKXN0YXRlLnJlYWRpbmc9ITEsZnVuY3Rpb24gb25Fb2ZDaHVuayhzdHJlYW0sc3RhdGUpe2lmKGRlYnVnKCJvbkVvZkNodW5rIiksc3RhdGUuZW5kZWQpcmV0dXJuO2lmKHN0YXRlLmRlY29kZXIpe3ZhciBjaHVuaz1zdGF0ZS5kZWNvZGVyLmVuZCgpO2NodW5rJiZjaHVuay5sZW5ndGgmJihzdGF0ZS5idWZmZXIucHVzaChjaHVuayksc3RhdGUubGVuZ3RoKz1zdGF0ZS5vYmplY3RNb2RlPzE6Y2h1bmsubGVuZ3RoKX1zdGF0ZS5lbmRlZD0hMCxzdGF0ZS5zeW5jP2VtaXRSZWFkYWJsZShzdHJlYW0pOihzdGF0ZS5uZWVkUmVhZGFibGU9ITEsc3RhdGUuZW1pdHRlZFJlYWRhYmxlfHwoc3RhdGUuZW1pdHRlZFJlYWRhYmxlPSEwLGVtaXRSZWFkYWJsZV8oc3RyZWFtKSkpfShzdHJlYW0sc3RhdGUpO2Vsc2UgaWYoc2tpcENodW5rQ2hlY2t8fChlcj1mdW5jdGlvbiBjaHVua0ludmFsaWQoc3RhdGUsY2h1bmspe3ZhciBlcjsoZnVuY3Rpb24gX2lzVWludDhBcnJheShvYmope3JldHVybiBCdWZmZXIuaXNCdWZmZXIob2JqKXx8b2JqIGluc3RhbmNlb2YgT3VyVWludDhBcnJheX0pKGNodW5rKXx8InN0cmluZyI9PXR5cGVvZiBjaHVua3x8dm9pZCAwPT09Y2h1bmt8fHN0YXRlLm9iamVjdE1vZGV8fChlcj1uZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoImNodW5rIixbInN0cmluZyIsIkJ1ZmZlciIsIlVpbnQ4QXJyYXkiXSxjaHVuaykpO3JldHVybiBlcn0oc3RhdGUsY2h1bmspKSxlcillcnJvck9yRGVzdHJveShzdHJlYW0sZXIpO2Vsc2UgaWYoc3RhdGUub2JqZWN0TW9kZXx8Y2h1bmsmJmNodW5rLmxlbmd0aD4wKWlmKCJzdHJpbmciPT10eXBlb2YgY2h1bmt8fHN0YXRlLm9iamVjdE1vZGV8fE9iamVjdC5nZXRQcm90b3R5cGVPZihjaHVuayk9PT1CdWZmZXIucHJvdG90eXBlfHwoY2h1bms9ZnVuY3Rpb24gX3VpbnQ4QXJyYXlUb0J1ZmZlcihjaHVuayl7cmV0dXJuIEJ1ZmZlci5mcm9tKGNodW5rKX0oY2h1bmspKSxhZGRUb0Zyb250KXN0YXRlLmVuZEVtaXR0ZWQ/ZXJyb3JPckRlc3Ryb3koc3RyZWFtLG5ldyBFUlJfU1RSRUFNX1VOU0hJRlRfQUZURVJfRU5EX0VWRU5UKTphZGRDaHVuayhzdHJlYW0sc3RhdGUsY2h1bmssITApO2Vsc2UgaWYoc3RhdGUuZW5kZWQpZXJyb3JPckRlc3Ryb3koc3RyZWFtLG5ldyBFUlJfU1RSRUFNX1BVU0hfQUZURVJfRU9GKTtlbHNle2lmKHN0YXRlLmRlc3Ryb3llZClyZXR1cm4hMTtzdGF0ZS5yZWFkaW5nPSExLHN0YXRlLmRlY29kZXImJiFlbmNvZGluZz8oY2h1bms9c3RhdGUuZGVjb2Rlci53cml0ZShjaHVuayksc3RhdGUub2JqZWN0TW9kZXx8MCE9PWNodW5rLmxlbmd0aD9hZGRDaHVuayhzdHJlYW0sc3RhdGUsY2h1bmssITEpOm1heWJlUmVhZE1vcmUoc3RyZWFtLHN0YXRlKSk6YWRkQ2h1bmsoc3RyZWFtLHN0YXRlLGNodW5rLCExKX1lbHNlIGFkZFRvRnJvbnR8fChzdGF0ZS5yZWFkaW5nPSExLG1heWJlUmVhZE1vcmUoc3RyZWFtLHN0YXRlKSk7cmV0dXJuIXN0YXRlLmVuZGVkJiYoc3RhdGUubGVuZ3RoPHN0YXRlLmhpZ2hXYXRlck1hcmt8fDA9PT1zdGF0ZS5sZW5ndGgpfWZ1bmN0aW9uIGFkZENodW5rKHN0cmVhbSxzdGF0ZSxjaHVuayxhZGRUb0Zyb250KXtzdGF0ZS5mbG93aW5nJiYwPT09c3RhdGUubGVuZ3RoJiYhc3RhdGUuc3luYz8oc3RhdGUuYXdhaXREcmFpbj0wLHN0cmVhbS5lbWl0KCJkYXRhIixjaHVuaykpOihzdGF0ZS5sZW5ndGgrPXN0YXRlLm9iamVjdE1vZGU/MTpjaHVuay5sZW5ndGgsYWRkVG9Gcm9udD9zdGF0ZS5idWZmZXIudW5zaGlmdChjaHVuayk6c3RhdGUuYnVmZmVyLnB1c2goY2h1bmspLHN0YXRlLm5lZWRSZWFkYWJsZSYmZW1pdFJlYWRhYmxlKHN0cmVhbSkpLG1heWJlUmVhZE1vcmUoc3RyZWFtLHN0YXRlKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGUucHJvdG90eXBlLCJkZXN0cm95ZWQiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fcmVhZGFibGVTdGF0ZSYmdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWR9LHNldDpmdW5jdGlvbiBzZXQodmFsdWUpe3RoaXMuX3JlYWRhYmxlU3RhdGUmJih0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD12YWx1ZSl9fSksUmVhZGFibGUucHJvdG90eXBlLmRlc3Ryb3k9ZGVzdHJveUltcGwuZGVzdHJveSxSZWFkYWJsZS5wcm90b3R5cGUuX3VuZGVzdHJveT1kZXN0cm95SW1wbC51bmRlc3Ryb3ksUmVhZGFibGUucHJvdG90eXBlLl9kZXN0cm95PWZ1bmN0aW9uKGVycixjYil7Y2IoZXJyKX0sUmVhZGFibGUucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24oY2h1bmssZW5jb2Rpbmcpe3ZhciBza2lwQ2h1bmtDaGVjayxzdGF0ZT10aGlzLl9yZWFkYWJsZVN0YXRlO3JldHVybiBzdGF0ZS5vYmplY3RNb2RlP3NraXBDaHVua0NoZWNrPSEwOiJzdHJpbmciPT10eXBlb2YgY2h1bmsmJigoZW5jb2Rpbmc9ZW5jb2Rpbmd8fHN0YXRlLmRlZmF1bHRFbmNvZGluZykhPT1zdGF0ZS5lbmNvZGluZyYmKGNodW5rPUJ1ZmZlci5mcm9tKGNodW5rLGVuY29kaW5nKSxlbmNvZGluZz0iIiksc2tpcENodW5rQ2hlY2s9ITApLHJlYWRhYmxlQWRkQ2h1bmsodGhpcyxjaHVuayxlbmNvZGluZywhMSxza2lwQ2h1bmtDaGVjayl9LFJlYWRhYmxlLnByb3RvdHlwZS51bnNoaWZ0PWZ1bmN0aW9uKGNodW5rKXtyZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLGNodW5rLG51bGwsITAsITEpfSxSZWFkYWJsZS5wcm90b3R5cGUuaXNQYXVzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMT09PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZ30sUmVhZGFibGUucHJvdG90eXBlLnNldEVuY29kaW5nPWZ1bmN0aW9uKGVuYyl7U3RyaW5nRGVjb2Rlcnx8KFN0cmluZ0RlY29kZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmluZ19kZWNvZGVyL2xpYi9zdHJpbmdfZGVjb2Rlci5qcyIpLlN0cmluZ0RlY29kZXIpO3ZhciBkZWNvZGVyPW5ldyBTdHJpbmdEZWNvZGVyKGVuYyk7dGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyPWRlY29kZXIsdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZz10aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIuZW5jb2Rpbmc7Zm9yKHZhciBwPXRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyLmhlYWQsY29udGVudD0iIjtudWxsIT09cDspY29udGVudCs9ZGVjb2Rlci53cml0ZShwLmRhdGEpLHA9cC5uZXh0O3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmJ1ZmZlci5jbGVhcigpLCIiIT09Y29udGVudCYmdGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXIucHVzaChjb250ZW50KSx0aGlzLl9yZWFkYWJsZVN0YXRlLmxlbmd0aD1jb250ZW50Lmxlbmd0aCx0aGlzfTtmdW5jdGlvbiBob3dNdWNoVG9SZWFkKG4sc3RhdGUpe3JldHVybiBuPD0wfHwwPT09c3RhdGUubGVuZ3RoJiZzdGF0ZS5lbmRlZD8wOnN0YXRlLm9iamVjdE1vZGU/MTpuIT1uP3N0YXRlLmZsb3dpbmcmJnN0YXRlLmxlbmd0aD9zdGF0ZS5idWZmZXIuaGVhZC5kYXRhLmxlbmd0aDpzdGF0ZS5sZW5ndGg6KG4+c3RhdGUuaGlnaFdhdGVyTWFyayYmKHN0YXRlLmhpZ2hXYXRlck1hcms9ZnVuY3Rpb24gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobil7cmV0dXJuIG4+PTEwNzM3NDE4MjQ/bj0xMDczNzQxODI0OihuLS0sbnw9bj4+PjEsbnw9bj4+PjIsbnw9bj4+PjQsbnw9bj4+Pjgsbnw9bj4+PjE2LG4rKyksbn0obikpLG48PXN0YXRlLmxlbmd0aD9uOnN0YXRlLmVuZGVkP3N0YXRlLmxlbmd0aDooc3RhdGUubmVlZFJlYWRhYmxlPSEwLDApKX1mdW5jdGlvbiBlbWl0UmVhZGFibGUoc3RyZWFtKXt2YXIgc3RhdGU9c3RyZWFtLl9yZWFkYWJsZVN0YXRlO2RlYnVnKCJlbWl0UmVhZGFibGUiLHN0YXRlLm5lZWRSZWFkYWJsZSxzdGF0ZS5lbWl0dGVkUmVhZGFibGUpLHN0YXRlLm5lZWRSZWFkYWJsZT0hMSxzdGF0ZS5lbWl0dGVkUmVhZGFibGV8fChkZWJ1ZygiZW1pdFJlYWRhYmxlIixzdGF0ZS5mbG93aW5nKSxzdGF0ZS5lbWl0dGVkUmVhZGFibGU9ITAscHJvY2Vzcy5uZXh0VGljayhlbWl0UmVhZGFibGVfLHN0cmVhbSkpfWZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKXt2YXIgc3RhdGU9c3RyZWFtLl9yZWFkYWJsZVN0YXRlO2RlYnVnKCJlbWl0UmVhZGFibGVfIixzdGF0ZS5kZXN0cm95ZWQsc3RhdGUubGVuZ3RoLHN0YXRlLmVuZGVkKSxzdGF0ZS5kZXN0cm95ZWR8fCFzdGF0ZS5sZW5ndGgmJiFzdGF0ZS5lbmRlZHx8KHN0cmVhbS5lbWl0KCJyZWFkYWJsZSIpLHN0YXRlLmVtaXR0ZWRSZWFkYWJsZT0hMSksc3RhdGUubmVlZFJlYWRhYmxlPSFzdGF0ZS5mbG93aW5nJiYhc3RhdGUuZW5kZWQmJnN0YXRlLmxlbmd0aDw9c3RhdGUuaGlnaFdhdGVyTWFyayxmbG93KHN0cmVhbSl9ZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sc3RhdGUpe3N0YXRlLnJlYWRpbmdNb3JlfHwoc3RhdGUucmVhZGluZ01vcmU9ITAscHJvY2Vzcy5uZXh0VGljayhtYXliZVJlYWRNb3JlXyxzdHJlYW0sc3RhdGUpKX1mdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sc3RhdGUpe2Zvcig7IXN0YXRlLnJlYWRpbmcmJiFzdGF0ZS5lbmRlZCYmKHN0YXRlLmxlbmd0aDxzdGF0ZS5oaWdoV2F0ZXJNYXJrfHxzdGF0ZS5mbG93aW5nJiYwPT09c3RhdGUubGVuZ3RoKTspe3ZhciBsZW49c3RhdGUubGVuZ3RoO2lmKGRlYnVnKCJtYXliZVJlYWRNb3JlIHJlYWQgMCIpLHN0cmVhbS5yZWFkKDApLGxlbj09PXN0YXRlLmxlbmd0aClicmVha31zdGF0ZS5yZWFkaW5nTW9yZT0hMX1mdW5jdGlvbiB1cGRhdGVSZWFkYWJsZUxpc3RlbmluZyhzZWxmKXt2YXIgc3RhdGU9c2VsZi5fcmVhZGFibGVTdGF0ZTtzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZz1zZWxmLmxpc3RlbmVyQ291bnQoInJlYWRhYmxlIik+MCxzdGF0ZS5yZXN1bWVTY2hlZHVsZWQmJiFzdGF0ZS5wYXVzZWQ/c3RhdGUuZmxvd2luZz0hMDpzZWxmLmxpc3RlbmVyQ291bnQoImRhdGEiKT4wJiZzZWxmLnJlc3VtZSgpfWZ1bmN0aW9uIG5SZWFkaW5nTmV4dFRpY2soc2VsZil7ZGVidWcoInJlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCIpLHNlbGYucmVhZCgwKX1mdW5jdGlvbiByZXN1bWVfKHN0cmVhbSxzdGF0ZSl7ZGVidWcoInJlc3VtZSIsc3RhdGUucmVhZGluZyksc3RhdGUucmVhZGluZ3x8c3RyZWFtLnJlYWQoMCksc3RhdGUucmVzdW1lU2NoZWR1bGVkPSExLHN0cmVhbS5lbWl0KCJyZXN1bWUiKSxmbG93KHN0cmVhbSksc3RhdGUuZmxvd2luZyYmIXN0YXRlLnJlYWRpbmcmJnN0cmVhbS5yZWFkKDApfWZ1bmN0aW9uIGZsb3coc3RyZWFtKXt2YXIgc3RhdGU9c3RyZWFtLl9yZWFkYWJsZVN0YXRlO2ZvcihkZWJ1ZygiZmxvdyIsc3RhdGUuZmxvd2luZyk7c3RhdGUuZmxvd2luZyYmbnVsbCE9PXN0cmVhbS5yZWFkKCk7KTt9ZnVuY3Rpb24gZnJvbUxpc3QobixzdGF0ZSl7cmV0dXJuIDA9PT1zdGF0ZS5sZW5ndGg/bnVsbDooc3RhdGUub2JqZWN0TW9kZT9yZXQ9c3RhdGUuYnVmZmVyLnNoaWZ0KCk6IW58fG4+PXN0YXRlLmxlbmd0aD8ocmV0PXN0YXRlLmRlY29kZXI/c3RhdGUuYnVmZmVyLmpvaW4oIiIpOjE9PT1zdGF0ZS5idWZmZXIubGVuZ3RoP3N0YXRlLmJ1ZmZlci5maXJzdCgpOnN0YXRlLmJ1ZmZlci5jb25jYXQoc3RhdGUubGVuZ3RoKSxzdGF0ZS5idWZmZXIuY2xlYXIoKSk6cmV0PXN0YXRlLmJ1ZmZlci5jb25zdW1lKG4sc3RhdGUuZGVjb2RlcikscmV0KTt2YXIgcmV0fWZ1bmN0aW9uIGVuZFJlYWRhYmxlKHN0cmVhbSl7dmFyIHN0YXRlPXN0cmVhbS5fcmVhZGFibGVTdGF0ZTtkZWJ1ZygiZW5kUmVhZGFibGUiLHN0YXRlLmVuZEVtaXR0ZWQpLHN0YXRlLmVuZEVtaXR0ZWR8fChzdGF0ZS5lbmRlZD0hMCxwcm9jZXNzLm5leHRUaWNrKGVuZFJlYWRhYmxlTlQsc3RhdGUsc3RyZWFtKSl9ZnVuY3Rpb24gZW5kUmVhZGFibGVOVChzdGF0ZSxzdHJlYW0pe2lmKGRlYnVnKCJlbmRSZWFkYWJsZU5UIixzdGF0ZS5lbmRFbWl0dGVkLHN0YXRlLmxlbmd0aCksIXN0YXRlLmVuZEVtaXR0ZWQmJjA9PT1zdGF0ZS5sZW5ndGgmJihzdGF0ZS5lbmRFbWl0dGVkPSEwLHN0cmVhbS5yZWFkYWJsZT0hMSxzdHJlYW0uZW1pdCgiZW5kIiksc3RhdGUuYXV0b0Rlc3Ryb3kpKXt2YXIgd1N0YXRlPXN0cmVhbS5fd3JpdGFibGVTdGF0ZTsoIXdTdGF0ZXx8d1N0YXRlLmF1dG9EZXN0cm95JiZ3U3RhdGUuZmluaXNoZWQpJiZzdHJlYW0uZGVzdHJveSgpfX1mdW5jdGlvbiBpbmRleE9mKHhzLHgpe2Zvcih2YXIgaT0wLGw9eHMubGVuZ3RoO2k8bDtpKyspaWYoeHNbaV09PT14KXJldHVybiBpO3JldHVybi0xfVJlYWRhYmxlLnByb3RvdHlwZS5yZWFkPWZ1bmN0aW9uKG4pe2RlYnVnKCJyZWFkIixuKSxuPXBhcnNlSW50KG4sMTApO3ZhciBzdGF0ZT10aGlzLl9yZWFkYWJsZVN0YXRlLG5PcmlnPW47aWYoMCE9PW4mJihzdGF0ZS5lbWl0dGVkUmVhZGFibGU9ITEpLDA9PT1uJiZzdGF0ZS5uZWVkUmVhZGFibGUmJigoMCE9PXN0YXRlLmhpZ2hXYXRlck1hcms/c3RhdGUubGVuZ3RoPj1zdGF0ZS5oaWdoV2F0ZXJNYXJrOnN0YXRlLmxlbmd0aD4wKXx8c3RhdGUuZW5kZWQpKXJldHVybiBkZWJ1ZygicmVhZDogZW1pdFJlYWRhYmxlIixzdGF0ZS5sZW5ndGgsc3RhdGUuZW5kZWQpLDA9PT1zdGF0ZS5sZW5ndGgmJnN0YXRlLmVuZGVkP2VuZFJlYWRhYmxlKHRoaXMpOmVtaXRSZWFkYWJsZSh0aGlzKSxudWxsO2lmKDA9PT0obj1ob3dNdWNoVG9SZWFkKG4sc3RhdGUpKSYmc3RhdGUuZW5kZWQpcmV0dXJuIDA9PT1zdGF0ZS5sZW5ndGgmJmVuZFJlYWRhYmxlKHRoaXMpLG51bGw7dmFyIHJldCxkb1JlYWQ9c3RhdGUubmVlZFJlYWRhYmxlO3JldHVybiBkZWJ1ZygibmVlZCByZWFkYWJsZSIsZG9SZWFkKSwoMD09PXN0YXRlLmxlbmd0aHx8c3RhdGUubGVuZ3RoLW48c3RhdGUuaGlnaFdhdGVyTWFyaykmJmRlYnVnKCJsZW5ndGggbGVzcyB0aGFuIHdhdGVybWFyayIsZG9SZWFkPSEwKSxzdGF0ZS5lbmRlZHx8c3RhdGUucmVhZGluZz9kZWJ1ZygicmVhZGluZyBvciBlbmRlZCIsZG9SZWFkPSExKTpkb1JlYWQmJihkZWJ1ZygiZG8gcmVhZCIpLHN0YXRlLnJlYWRpbmc9ITAsc3RhdGUuc3luYz0hMCwwPT09c3RhdGUubGVuZ3RoJiYoc3RhdGUubmVlZFJlYWRhYmxlPSEwKSx0aGlzLl9yZWFkKHN0YXRlLmhpZ2hXYXRlck1hcmspLHN0YXRlLnN5bmM9ITEsc3RhdGUucmVhZGluZ3x8KG49aG93TXVjaFRvUmVhZChuT3JpZyxzdGF0ZSkpKSxudWxsPT09KHJldD1uPjA/ZnJvbUxpc3QobixzdGF0ZSk6bnVsbCk/KHN0YXRlLm5lZWRSZWFkYWJsZT1zdGF0ZS5sZW5ndGg8PXN0YXRlLmhpZ2hXYXRlck1hcmssbj0wKTooc3RhdGUubGVuZ3RoLT1uLHN0YXRlLmF3YWl0RHJhaW49MCksMD09PXN0YXRlLmxlbmd0aCYmKHN0YXRlLmVuZGVkfHwoc3RhdGUubmVlZFJlYWRhYmxlPSEwKSxuT3JpZyE9PW4mJnN0YXRlLmVuZGVkJiZlbmRSZWFkYWJsZSh0aGlzKSksbnVsbCE9PXJldCYmdGhpcy5lbWl0KCJkYXRhIixyZXQpLHJldH0sUmVhZGFibGUucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKG4pe2Vycm9yT3JEZXN0cm95KHRoaXMsbmV3IEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEKCJfcmVhZCgpIikpfSxSZWFkYWJsZS5wcm90b3R5cGUucGlwZT1mdW5jdGlvbihkZXN0LHBpcGVPcHRzKXt2YXIgc3JjPXRoaXMsc3RhdGU9dGhpcy5fcmVhZGFibGVTdGF0ZTtzd2l0Y2goc3RhdGUucGlwZXNDb3VudCl7Y2FzZSAwOnN0YXRlLnBpcGVzPWRlc3Q7YnJlYWs7Y2FzZSAxOnN0YXRlLnBpcGVzPVtzdGF0ZS5waXBlcyxkZXN0XTticmVhaztkZWZhdWx0OnN0YXRlLnBpcGVzLnB1c2goZGVzdCl9c3RhdGUucGlwZXNDb3VudCs9MSxkZWJ1ZygicGlwZSBjb3VudD0lZCBvcHRzPSVqIixzdGF0ZS5waXBlc0NvdW50LHBpcGVPcHRzKTt2YXIgZW5kRm49KCFwaXBlT3B0c3x8ITEhPT1waXBlT3B0cy5lbmQpJiZkZXN0IT09cHJvY2Vzcy5zdGRvdXQmJmRlc3QhPT1wcm9jZXNzLnN0ZGVycj9vbmVuZDp1bnBpcGU7ZnVuY3Rpb24gb251bnBpcGUocmVhZGFibGUsdW5waXBlSW5mbyl7ZGVidWcoIm9udW5waXBlIikscmVhZGFibGU9PT1zcmMmJnVucGlwZUluZm8mJiExPT09dW5waXBlSW5mby5oYXNVbnBpcGVkJiYodW5waXBlSW5mby5oYXNVbnBpcGVkPSEwLGZ1bmN0aW9uIGNsZWFudXAoKXtkZWJ1ZygiY2xlYW51cCIpLGRlc3QucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixvbmNsb3NlKSxkZXN0LnJlbW92ZUxpc3RlbmVyKCJmaW5pc2giLG9uZmluaXNoKSxkZXN0LnJlbW92ZUxpc3RlbmVyKCJkcmFpbiIsb25kcmFpbiksZGVzdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLG9uZXJyb3IpLGRlc3QucmVtb3ZlTGlzdGVuZXIoInVucGlwZSIsb251bnBpcGUpLHNyYy5yZW1vdmVMaXN0ZW5lcigiZW5kIixvbmVuZCksc3JjLnJlbW92ZUxpc3RlbmVyKCJlbmQiLHVucGlwZSksc3JjLnJlbW92ZUxpc3RlbmVyKCJkYXRhIixvbmRhdGEpLGNsZWFuZWRVcD0hMCwhc3RhdGUuYXdhaXREcmFpbnx8ZGVzdC5fd3JpdGFibGVTdGF0ZSYmIWRlc3QuX3dyaXRhYmxlU3RhdGUubmVlZERyYWlufHxvbmRyYWluKCl9KCkpfWZ1bmN0aW9uIG9uZW5kKCl7ZGVidWcoIm9uZW5kIiksZGVzdC5lbmQoKX1zdGF0ZS5lbmRFbWl0dGVkP3Byb2Nlc3MubmV4dFRpY2soZW5kRm4pOnNyYy5vbmNlKCJlbmQiLGVuZEZuKSxkZXN0Lm9uKCJ1bnBpcGUiLG9udW5waXBlKTt2YXIgb25kcmFpbj1mdW5jdGlvbiBwaXBlT25EcmFpbihzcmMpe3JldHVybiBmdW5jdGlvbiBwaXBlT25EcmFpbkZ1bmN0aW9uUmVzdWx0KCl7dmFyIHN0YXRlPXNyYy5fcmVhZGFibGVTdGF0ZTtkZWJ1ZygicGlwZU9uRHJhaW4iLHN0YXRlLmF3YWl0RHJhaW4pLHN0YXRlLmF3YWl0RHJhaW4mJnN0YXRlLmF3YWl0RHJhaW4tLSwwPT09c3RhdGUuYXdhaXREcmFpbiYmRUVsaXN0ZW5lckNvdW50KHNyYywiZGF0YSIpJiYoc3RhdGUuZmxvd2luZz0hMCxmbG93KHNyYykpfX0oc3JjKTtkZXN0Lm9uKCJkcmFpbiIsb25kcmFpbik7dmFyIGNsZWFuZWRVcD0hMTtmdW5jdGlvbiBvbmRhdGEoY2h1bmspe2RlYnVnKCJvbmRhdGEiKTt2YXIgcmV0PWRlc3Qud3JpdGUoY2h1bmspO2RlYnVnKCJkZXN0LndyaXRlIixyZXQpLCExPT09cmV0JiYoKDE9PT1zdGF0ZS5waXBlc0NvdW50JiZzdGF0ZS5waXBlcz09PWRlc3R8fHN0YXRlLnBpcGVzQ291bnQ+MSYmLTEhPT1pbmRleE9mKHN0YXRlLnBpcGVzLGRlc3QpKSYmIWNsZWFuZWRVcCYmKGRlYnVnKCJmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UiLHN0YXRlLmF3YWl0RHJhaW4pLHN0YXRlLmF3YWl0RHJhaW4rKyksc3JjLnBhdXNlKCkpfWZ1bmN0aW9uIG9uZXJyb3IoZXIpe2RlYnVnKCJvbmVycm9yIixlciksdW5waXBlKCksZGVzdC5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLG9uZXJyb3IpLDA9PT1FRWxpc3RlbmVyQ291bnQoZGVzdCwiZXJyb3IiKSYmZXJyb3JPckRlc3Ryb3koZGVzdCxlcil9ZnVuY3Rpb24gb25jbG9zZSgpe2Rlc3QucmVtb3ZlTGlzdGVuZXIoImZpbmlzaCIsb25maW5pc2gpLHVucGlwZSgpfWZ1bmN0aW9uIG9uZmluaXNoKCl7ZGVidWcoIm9uZmluaXNoIiksZGVzdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLG9uY2xvc2UpLHVucGlwZSgpfWZ1bmN0aW9uIHVucGlwZSgpe2RlYnVnKCJ1bnBpcGUiKSxzcmMudW5waXBlKGRlc3QpfXJldHVybiBzcmMub24oImRhdGEiLG9uZGF0YSksZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKGVtaXR0ZXIsZXZlbnQsZm4pe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBlbWl0dGVyLnByZXBlbmRMaXN0ZW5lcilyZXR1cm4gZW1pdHRlci5wcmVwZW5kTGlzdGVuZXIoZXZlbnQsZm4pO2VtaXR0ZXIuX2V2ZW50cyYmZW1pdHRlci5fZXZlbnRzW2V2ZW50XT9BcnJheS5pc0FycmF5KGVtaXR0ZXIuX2V2ZW50c1tldmVudF0pP2VtaXR0ZXIuX2V2ZW50c1tldmVudF0udW5zaGlmdChmbik6ZW1pdHRlci5fZXZlbnRzW2V2ZW50XT1bZm4sZW1pdHRlci5fZXZlbnRzW2V2ZW50XV06ZW1pdHRlci5vbihldmVudCxmbil9KGRlc3QsImVycm9yIixvbmVycm9yKSxkZXN0Lm9uY2UoImNsb3NlIixvbmNsb3NlKSxkZXN0Lm9uY2UoImZpbmlzaCIsb25maW5pc2gpLGRlc3QuZW1pdCgicGlwZSIsc3JjKSxzdGF0ZS5mbG93aW5nfHwoZGVidWcoInBpcGUgcmVzdW1lIiksc3JjLnJlc3VtZSgpKSxkZXN0fSxSZWFkYWJsZS5wcm90b3R5cGUudW5waXBlPWZ1bmN0aW9uKGRlc3Qpe3ZhciBzdGF0ZT10aGlzLl9yZWFkYWJsZVN0YXRlLHVucGlwZUluZm89e2hhc1VucGlwZWQ6ITF9O2lmKDA9PT1zdGF0ZS5waXBlc0NvdW50KXJldHVybiB0aGlzO2lmKDE9PT1zdGF0ZS5waXBlc0NvdW50KXJldHVybiBkZXN0JiZkZXN0IT09c3RhdGUucGlwZXN8fChkZXN0fHwoZGVzdD1zdGF0ZS5waXBlcyksc3RhdGUucGlwZXM9bnVsbCxzdGF0ZS5waXBlc0NvdW50PTAsc3RhdGUuZmxvd2luZz0hMSxkZXN0JiZkZXN0LmVtaXQoInVucGlwZSIsdGhpcyx1bnBpcGVJbmZvKSksdGhpcztpZighZGVzdCl7dmFyIGRlc3RzPXN0YXRlLnBpcGVzLGxlbj1zdGF0ZS5waXBlc0NvdW50O3N0YXRlLnBpcGVzPW51bGwsc3RhdGUucGlwZXNDb3VudD0wLHN0YXRlLmZsb3dpbmc9ITE7Zm9yKHZhciBpPTA7aTxsZW47aSsrKWRlc3RzW2ldLmVtaXQoInVucGlwZSIsdGhpcyx7aGFzVW5waXBlZDohMX0pO3JldHVybiB0aGlzfXZhciBpbmRleD1pbmRleE9mKHN0YXRlLnBpcGVzLGRlc3QpO3JldHVybi0xPT09aW5kZXh8fChzdGF0ZS5waXBlcy5zcGxpY2UoaW5kZXgsMSksc3RhdGUucGlwZXNDb3VudC09MSwxPT09c3RhdGUucGlwZXNDb3VudCYmKHN0YXRlLnBpcGVzPXN0YXRlLnBpcGVzWzBdKSxkZXN0LmVtaXQoInVucGlwZSIsdGhpcyx1bnBpcGVJbmZvKSksdGhpc30sUmVhZGFibGUucHJvdG90eXBlLm9uPWZ1bmN0aW9uKGV2LGZuKXt2YXIgcmVzPVN0cmVhbS5wcm90b3R5cGUub24uY2FsbCh0aGlzLGV2LGZuKSxzdGF0ZT10aGlzLl9yZWFkYWJsZVN0YXRlO3JldHVybiJkYXRhIj09PWV2PyhzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZz10aGlzLmxpc3RlbmVyQ291bnQoInJlYWRhYmxlIik+MCwhMSE9PXN0YXRlLmZsb3dpbmcmJnRoaXMucmVzdW1lKCkpOiJyZWFkYWJsZSI9PT1ldiYmKHN0YXRlLmVuZEVtaXR0ZWR8fHN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nfHwoc3RhdGUucmVhZGFibGVMaXN0ZW5pbmc9c3RhdGUubmVlZFJlYWRhYmxlPSEwLHN0YXRlLmZsb3dpbmc9ITEsc3RhdGUuZW1pdHRlZFJlYWRhYmxlPSExLGRlYnVnKCJvbiByZWFkYWJsZSIsc3RhdGUubGVuZ3RoLHN0YXRlLnJlYWRpbmcpLHN0YXRlLmxlbmd0aD9lbWl0UmVhZGFibGUodGhpcyk6c3RhdGUucmVhZGluZ3x8cHJvY2Vzcy5uZXh0VGljayhuUmVhZGluZ05leHRUaWNrLHRoaXMpKSkscmVzfSxSZWFkYWJsZS5wcm90b3R5cGUuYWRkTGlzdGVuZXI9UmVhZGFibGUucHJvdG90eXBlLm9uLFJlYWRhYmxlLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcj1mdW5jdGlvbihldixmbil7dmFyIHJlcz1TdHJlYW0ucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyLmNhbGwodGhpcyxldixmbik7cmV0dXJuInJlYWRhYmxlIj09PWV2JiZwcm9jZXNzLm5leHRUaWNrKHVwZGF0ZVJlYWRhYmxlTGlzdGVuaW5nLHRoaXMpLHJlc30sUmVhZGFibGUucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbihldil7dmFyIHJlcz1TdHJlYW0ucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuInJlYWRhYmxlIiE9PWV2JiZ2b2lkIDAhPT1ldnx8cHJvY2Vzcy5uZXh0VGljayh1cGRhdGVSZWFkYWJsZUxpc3RlbmluZyx0aGlzKSxyZXN9LFJlYWRhYmxlLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXt2YXIgc3RhdGU9dGhpcy5fcmVhZGFibGVTdGF0ZTtyZXR1cm4gc3RhdGUuZmxvd2luZ3x8KGRlYnVnKCJyZXN1bWUiKSxzdGF0ZS5mbG93aW5nPSFzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyxmdW5jdGlvbiByZXN1bWUoc3RyZWFtLHN0YXRlKXtzdGF0ZS5yZXN1bWVTY2hlZHVsZWR8fChzdGF0ZS5yZXN1bWVTY2hlZHVsZWQ9ITAscHJvY2Vzcy5uZXh0VGljayhyZXN1bWVfLHN0cmVhbSxzdGF0ZSkpfSh0aGlzLHN0YXRlKSksc3RhdGUucGF1c2VkPSExLHRoaXN9LFJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3JldHVybiBkZWJ1ZygiY2FsbCBwYXVzZSBmbG93aW5nPSVqIix0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpLCExIT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nJiYoZGVidWcoInBhdXNlIiksdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nPSExLHRoaXMuZW1pdCgicGF1c2UiKSksdGhpcy5fcmVhZGFibGVTdGF0ZS5wYXVzZWQ9ITAsdGhpc30sUmVhZGFibGUucHJvdG90eXBlLndyYXA9ZnVuY3Rpb24oc3RyZWFtKXt2YXIgX3RoaXM9dGhpcyxzdGF0ZT10aGlzLl9yZWFkYWJsZVN0YXRlLHBhdXNlZD0hMTtmb3IodmFyIGkgaW4gc3RyZWFtLm9uKCJlbmQiLGZ1bmN0aW9uKCl7aWYoZGVidWcoIndyYXBwZWQgZW5kIiksc3RhdGUuZGVjb2RlciYmIXN0YXRlLmVuZGVkKXt2YXIgY2h1bms9c3RhdGUuZGVjb2Rlci5lbmQoKTtjaHVuayYmY2h1bmsubGVuZ3RoJiZfdGhpcy5wdXNoKGNodW5rKX1fdGhpcy5wdXNoKG51bGwpfSksc3RyZWFtLm9uKCJkYXRhIixmdW5jdGlvbihjaHVuayl7KGRlYnVnKCJ3cmFwcGVkIGRhdGEiKSxzdGF0ZS5kZWNvZGVyJiYoY2h1bms9c3RhdGUuZGVjb2Rlci53cml0ZShjaHVuaykpLHN0YXRlLm9iamVjdE1vZGUmJm51bGw9PWNodW5rKXx8KHN0YXRlLm9iamVjdE1vZGV8fGNodW5rJiZjaHVuay5sZW5ndGgpJiYoX3RoaXMucHVzaChjaHVuayl8fChwYXVzZWQ9ITAsc3RyZWFtLnBhdXNlKCkpKX0pLHN0cmVhbSl2b2lkIDA9PT10aGlzW2ldJiYiZnVuY3Rpb24iPT10eXBlb2Ygc3RyZWFtW2ldJiYodGhpc1tpXT1mdW5jdGlvbiBtZXRob2RXcmFwKG1ldGhvZCl7cmV0dXJuIGZ1bmN0aW9uIG1ldGhvZFdyYXBSZXR1cm5GdW5jdGlvbigpe3JldHVybiBzdHJlYW1bbWV0aG9kXS5hcHBseShzdHJlYW0sYXJndW1lbnRzKX19KGkpKTtmb3IodmFyIG49MDtuPGtQcm94eUV2ZW50cy5sZW5ndGg7bisrKXN0cmVhbS5vbihrUHJveHlFdmVudHNbbl0sdGhpcy5lbWl0LmJpbmQodGhpcyxrUHJveHlFdmVudHNbbl0pKTtyZXR1cm4gdGhpcy5fcmVhZD1mdW5jdGlvbihuKXtkZWJ1Zygid3JhcHBlZCBfcmVhZCIsbikscGF1c2VkJiYocGF1c2VkPSExLHN0cmVhbS5yZXN1bWUoKSl9LHRoaXN9LCJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJihSZWFkYWJsZS5wcm90b3R5cGVbU3ltYm9sLmFzeW5jSXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PWNyZWF0ZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvciYmKGNyZWF0ZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9hc3luY19pdGVyYXRvci5qcyIpKSxjcmVhdGVSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IodGhpcyl9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGUucHJvdG90eXBlLCJyZWFkYWJsZUhpZ2hXYXRlck1hcmsiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsInJlYWRhYmxlQnVmZmVyIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUmJnRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsInJlYWRhYmxlRmxvd2luZyIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmd9LHNldDpmdW5jdGlvbiBzZXQoc3RhdGUpe3RoaXMuX3JlYWRhYmxlU3RhdGUmJih0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmc9c3RhdGUpfX0pLFJlYWRhYmxlLl9mcm9tTGlzdD1mcm9tTGlzdCxPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGUucHJvdG90eXBlLCJyZWFkYWJsZUxlbmd0aCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmxlbmd0aH19KSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYoUmVhZGFibGUuZnJvbT1mdW5jdGlvbihpdGVyYWJsZSxvcHRzKXtyZXR1cm4gdm9pZCAwPT09ZnJvbSYmKGZyb209X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZnJvbS1icm93c2VyLmpzIikpLGZyb20oUmVhZGFibGUsaXRlcmFibGUsb3B0cyl9KX0sIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7bW9kdWxlLmV4cG9ydHM9VHJhbnNmb3JtO3ZhciBfcmVxdWlyZSRjb2Rlcz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9lcnJvcnMtYnJvd3Nlci5qcyIpLkYsRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQ9X3JlcXVpcmUkY29kZXMuRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQsRVJSX01VTFRJUExFX0NBTExCQUNLPV9yZXF1aXJlJGNvZGVzLkVSUl9NVUxUSVBMRV9DQUxMQkFDSyxFUlJfVFJBTlNGT1JNX0FMUkVBRFlfVFJBTlNGT1JNSU5HPV9yZXF1aXJlJGNvZGVzLkVSUl9UUkFOU0ZPUk1fQUxSRUFEWV9UUkFOU0ZPUk1JTkcsRVJSX1RSQU5TRk9STV9XSVRIX0xFTkdUSF8wPV9yZXF1aXJlJGNvZGVzLkVSUl9UUkFOU0ZPUk1fV0lUSF9MRU5HVEhfMCxEdXBsZXg9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fZHVwbGV4LmpzIik7ZnVuY3Rpb24gYWZ0ZXJUcmFuc2Zvcm0oZXIsZGF0YSl7dmFyIHRzPXRoaXMuX3RyYW5zZm9ybVN0YXRlO3RzLnRyYW5zZm9ybWluZz0hMTt2YXIgY2I9dHMud3JpdGVjYjtpZihudWxsPT09Y2IpcmV0dXJuIHRoaXMuZW1pdCgiZXJyb3IiLG5ldyBFUlJfTVVMVElQTEVfQ0FMTEJBQ0spO3RzLndyaXRlY2h1bms9bnVsbCx0cy53cml0ZWNiPW51bGwsbnVsbCE9ZGF0YSYmdGhpcy5wdXNoKGRhdGEpLGNiKGVyKTt2YXIgcnM9dGhpcy5fcmVhZGFibGVTdGF0ZTtycy5yZWFkaW5nPSExLChycy5uZWVkUmVhZGFibGV8fHJzLmxlbmd0aDxycy5oaWdoV2F0ZXJNYXJrKSYmdGhpcy5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKX1mdW5jdGlvbiBUcmFuc2Zvcm0ob3B0aW9ucyl7aWYoISh0aGlzIGluc3RhbmNlb2YgVHJhbnNmb3JtKSlyZXR1cm4gbmV3IFRyYW5zZm9ybShvcHRpb25zKTtEdXBsZXguY2FsbCh0aGlzLG9wdGlvbnMpLHRoaXMuX3RyYW5zZm9ybVN0YXRlPXthZnRlclRyYW5zZm9ybTphZnRlclRyYW5zZm9ybS5iaW5kKHRoaXMpLG5lZWRUcmFuc2Zvcm06ITEsdHJhbnNmb3JtaW5nOiExLHdyaXRlY2I6bnVsbCx3cml0ZWNodW5rOm51bGwsd3JpdGVlbmNvZGluZzpudWxsfSx0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZT0hMCx0aGlzLl9yZWFkYWJsZVN0YXRlLnN5bmM9ITEsb3B0aW9ucyYmKCJmdW5jdGlvbiI9PXR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybSYmKHRoaXMuX3RyYW5zZm9ybT1vcHRpb25zLnRyYW5zZm9ybSksImZ1bmN0aW9uIj09dHlwZW9mIG9wdGlvbnMuZmx1c2gmJih0aGlzLl9mbHVzaD1vcHRpb25zLmZsdXNoKSksdGhpcy5vbigicHJlZmluaXNoIixwcmVmaW5pc2gpfWZ1bmN0aW9uIHByZWZpbmlzaCgpe3ZhciBfdGhpcz10aGlzOyJmdW5jdGlvbiIhPXR5cGVvZiB0aGlzLl9mbHVzaHx8dGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ/ZG9uZSh0aGlzLG51bGwsbnVsbCk6dGhpcy5fZmx1c2goZnVuY3Rpb24oZXIsZGF0YSl7ZG9uZShfdGhpcyxlcixkYXRhKX0pfWZ1bmN0aW9uIGRvbmUoc3RyZWFtLGVyLGRhdGEpe2lmKGVyKXJldHVybiBzdHJlYW0uZW1pdCgiZXJyb3IiLGVyKTtpZihudWxsIT1kYXRhJiZzdHJlYW0ucHVzaChkYXRhKSxzdHJlYW0uX3dyaXRhYmxlU3RhdGUubGVuZ3RoKXRocm93IG5ldyBFUlJfVFJBTlNGT1JNX1dJVEhfTEVOR1RIXzA7aWYoc3RyZWFtLl90cmFuc2Zvcm1TdGF0ZS50cmFuc2Zvcm1pbmcpdGhyb3cgbmV3IEVSUl9UUkFOU0ZPUk1fQUxSRUFEWV9UUkFOU0ZPUk1JTkc7cmV0dXJuIHN0cmVhbS5wdXNoKG51bGwpfV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIikoVHJhbnNmb3JtLER1cGxleCksVHJhbnNmb3JtLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGNodW5rLGVuY29kaW5nKXtyZXR1cm4gdGhpcy5fdHJhbnNmb3JtU3RhdGUubmVlZFRyYW5zZm9ybT0hMSxEdXBsZXgucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLGNodW5rLGVuY29kaW5nKX0sVHJhbnNmb3JtLnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKGNodW5rLGVuY29kaW5nLGNiKXtjYihuZXcgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQoIl90cmFuc2Zvcm0oKSIpKX0sVHJhbnNmb3JtLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24oY2h1bmssZW5jb2RpbmcsY2Ipe3ZhciB0cz10aGlzLl90cmFuc2Zvcm1TdGF0ZTtpZih0cy53cml0ZWNiPWNiLHRzLndyaXRlY2h1bms9Y2h1bmssdHMud3JpdGVlbmNvZGluZz1lbmNvZGluZywhdHMudHJhbnNmb3JtaW5nKXt2YXIgcnM9dGhpcy5fcmVhZGFibGVTdGF0ZTsodHMubmVlZFRyYW5zZm9ybXx8cnMubmVlZFJlYWRhYmxlfHxycy5sZW5ndGg8cnMuaGlnaFdhdGVyTWFyaykmJnRoaXMuX3JlYWQocnMuaGlnaFdhdGVyTWFyayl9fSxUcmFuc2Zvcm0ucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKG4pe3ZhciB0cz10aGlzLl90cmFuc2Zvcm1TdGF0ZTtudWxsPT09dHMud3JpdGVjaHVua3x8dHMudHJhbnNmb3JtaW5nP3RzLm5lZWRUcmFuc2Zvcm09ITA6KHRzLnRyYW5zZm9ybWluZz0hMCx0aGlzLl90cmFuc2Zvcm0odHMud3JpdGVjaHVuayx0cy53cml0ZWVuY29kaW5nLHRzLmFmdGVyVHJhbnNmb3JtKSl9LFRyYW5zZm9ybS5wcm90b3R5cGUuX2Rlc3Ryb3k9ZnVuY3Rpb24oZXJyLGNiKXtEdXBsZXgucHJvdG90eXBlLl9kZXN0cm95LmNhbGwodGhpcyxlcnIsZnVuY3Rpb24oZXJyMil7Y2IoZXJyMil9KX19LCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV93cml0YWJsZS5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIER1cGxleCxwcm9jZXNzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9ub2RlLXN0ZGxpYi1icm93c2VyL2Nqcy9wcm94eS9wcm9jZXNzLmpzIik7ZnVuY3Rpb24gQ29ya2VkUmVxdWVzdChzdGF0ZSl7dmFyIF90aGlzPXRoaXM7dGhpcy5uZXh0PW51bGwsdGhpcy5lbnRyeT1udWxsLHRoaXMuZmluaXNoPWZ1bmN0aW9uKCl7IWZ1bmN0aW9uIG9uQ29ya2VkRmluaXNoKGNvcmtSZXEsc3RhdGUsZXJyKXt2YXIgZW50cnk9Y29ya1JlcS5lbnRyeTtjb3JrUmVxLmVudHJ5PW51bGw7Zm9yKDtlbnRyeTspe3ZhciBjYj1lbnRyeS5jYWxsYmFjaztzdGF0ZS5wZW5kaW5nY2ItLSxjYihlcnIpLGVudHJ5PWVudHJ5Lm5leHR9c3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlLm5leHQ9Y29ya1JlcX0oX3RoaXMsc3RhdGUpfX1tb2R1bGUuZXhwb3J0cz1Xcml0YWJsZSxXcml0YWJsZS5Xcml0YWJsZVN0YXRlPVdyaXRhYmxlU3RhdGU7dmFyIGludGVybmFsVXRpbD17ZGVwcmVjYXRlOl9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy91dGlsLWRlcHJlY2F0ZS9icm93c2VyLmpzIil9LFN0cmVhbT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9zdHJlYW0tYnJvd3Nlci5qcyIpLEJ1ZmZlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzIikuQnVmZmVyLE91clVpbnQ4QXJyYXk9KHZvaWQgMCE9PV9fd2VicGFja19yZXF1aXJlX18uZz9fX3dlYnBhY2tfcmVxdWlyZV9fLmc6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnt9KS5VaW50OEFycmF5fHxmdW5jdGlvbigpe307dmFyIHJlYWxIYXNJbnN0YW5jZSxkZXN0cm95SW1wbD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9kZXN0cm95LmpzIiksZ2V0SGlnaFdhdGVyTWFyaz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9zdGF0ZS5qcyIpLmdldEhpZ2hXYXRlck1hcmssX3JlcXVpcmUkY29kZXM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vZXJyb3JzLWJyb3dzZXIuanMiKS5GLEVSUl9JTlZBTElEX0FSR19UWVBFPV9yZXF1aXJlJGNvZGVzLkVSUl9JTlZBTElEX0FSR19UWVBFLEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEPV9yZXF1aXJlJGNvZGVzLkVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVELEVSUl9NVUxUSVBMRV9DQUxMQkFDSz1fcmVxdWlyZSRjb2Rlcy5FUlJfTVVMVElQTEVfQ0FMTEJBQ0ssRVJSX1NUUkVBTV9DQU5OT1RfUElQRT1fcmVxdWlyZSRjb2Rlcy5FUlJfU1RSRUFNX0NBTk5PVF9QSVBFLEVSUl9TVFJFQU1fREVTVFJPWUVEPV9yZXF1aXJlJGNvZGVzLkVSUl9TVFJFQU1fREVTVFJPWUVELEVSUl9TVFJFQU1fTlVMTF9WQUxVRVM9X3JlcXVpcmUkY29kZXMuRVJSX1NUUkVBTV9OVUxMX1ZBTFVFUyxFUlJfU1RSRUFNX1dSSVRFX0FGVEVSX0VORD1fcmVxdWlyZSRjb2Rlcy5FUlJfU1RSRUFNX1dSSVRFX0FGVEVSX0VORCxFUlJfVU5LTk9XTl9FTkNPRElORz1fcmVxdWlyZSRjb2Rlcy5FUlJfVU5LTk9XTl9FTkNPRElORyxlcnJvck9yRGVzdHJveT1kZXN0cm95SW1wbC5lcnJvck9yRGVzdHJveTtmdW5jdGlvbiBub3AoKXt9ZnVuY3Rpb24gV3JpdGFibGVTdGF0ZShvcHRpb25zLHN0cmVhbSxpc0R1cGxleCl7RHVwbGV4PUR1cGxleHx8X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fZHVwbGV4LmpzIiksb3B0aW9ucz1vcHRpb25zfHx7fSwiYm9vbGVhbiIhPXR5cGVvZiBpc0R1cGxleCYmKGlzRHVwbGV4PXN0cmVhbSBpbnN0YW5jZW9mIER1cGxleCksdGhpcy5vYmplY3RNb2RlPSEhb3B0aW9ucy5vYmplY3RNb2RlLGlzRHVwbGV4JiYodGhpcy5vYmplY3RNb2RlPXRoaXMub2JqZWN0TW9kZXx8ISFvcHRpb25zLndyaXRhYmxlT2JqZWN0TW9kZSksdGhpcy5oaWdoV2F0ZXJNYXJrPWdldEhpZ2hXYXRlck1hcmsodGhpcyxvcHRpb25zLCJ3cml0YWJsZUhpZ2hXYXRlck1hcmsiLGlzRHVwbGV4KSx0aGlzLmZpbmFsQ2FsbGVkPSExLHRoaXMubmVlZERyYWluPSExLHRoaXMuZW5kaW5nPSExLHRoaXMuZW5kZWQ9ITEsdGhpcy5maW5pc2hlZD0hMSx0aGlzLmRlc3Ryb3llZD0hMTt2YXIgbm9EZWNvZGU9ITE9PT1vcHRpb25zLmRlY29kZVN0cmluZ3M7dGhpcy5kZWNvZGVTdHJpbmdzPSFub0RlY29kZSx0aGlzLmRlZmF1bHRFbmNvZGluZz1vcHRpb25zLmRlZmF1bHRFbmNvZGluZ3x8InV0ZjgiLHRoaXMubGVuZ3RoPTAsdGhpcy53cml0aW5nPSExLHRoaXMuY29ya2VkPTAsdGhpcy5zeW5jPSEwLHRoaXMuYnVmZmVyUHJvY2Vzc2luZz0hMSx0aGlzLm9ud3JpdGU9ZnVuY3Rpb24oZXIpeyFmdW5jdGlvbiBvbndyaXRlKHN0cmVhbSxlcil7dmFyIHN0YXRlPXN0cmVhbS5fd3JpdGFibGVTdGF0ZSxzeW5jPXN0YXRlLnN5bmMsY2I9c3RhdGUud3JpdGVjYjtpZigiZnVuY3Rpb24iIT10eXBlb2YgY2IpdGhyb3cgbmV3IEVSUl9NVUxUSVBMRV9DQUxMQkFDSztpZihmdW5jdGlvbiBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpe3N0YXRlLndyaXRpbmc9ITEsc3RhdGUud3JpdGVjYj1udWxsLHN0YXRlLmxlbmd0aC09c3RhdGUud3JpdGVsZW4sc3RhdGUud3JpdGVsZW49MH0oc3RhdGUpLGVyKSFmdW5jdGlvbiBvbndyaXRlRXJyb3Ioc3RyZWFtLHN0YXRlLHN5bmMsZXIsY2Ipey0tc3RhdGUucGVuZGluZ2NiLHN5bmM/KHByb2Nlc3MubmV4dFRpY2soY2IsZXIpLHByb2Nlc3MubmV4dFRpY2soZmluaXNoTWF5YmUsc3RyZWFtLHN0YXRlKSxzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSEwLGVycm9yT3JEZXN0cm95KHN0cmVhbSxlcikpOihjYihlciksc3RyZWFtLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMCxlcnJvck9yRGVzdHJveShzdHJlYW0sZXIpLGZpbmlzaE1heWJlKHN0cmVhbSxzdGF0ZSkpfShzdHJlYW0sc3RhdGUsc3luYyxlcixjYik7ZWxzZXt2YXIgZmluaXNoZWQ9bmVlZEZpbmlzaChzdGF0ZSl8fHN0cmVhbS5kZXN0cm95ZWQ7ZmluaXNoZWR8fHN0YXRlLmNvcmtlZHx8c3RhdGUuYnVmZmVyUHJvY2Vzc2luZ3x8IXN0YXRlLmJ1ZmZlcmVkUmVxdWVzdHx8Y2xlYXJCdWZmZXIoc3RyZWFtLHN0YXRlKSxzeW5jP3Byb2Nlc3MubmV4dFRpY2soYWZ0ZXJXcml0ZSxzdHJlYW0sc3RhdGUsZmluaXNoZWQsY2IpOmFmdGVyV3JpdGUoc3RyZWFtLHN0YXRlLGZpbmlzaGVkLGNiKX19KHN0cmVhbSxlcil9LHRoaXMud3JpdGVjYj1udWxsLHRoaXMud3JpdGVsZW49MCx0aGlzLmJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMucGVuZGluZ2NiPTAsdGhpcy5wcmVmaW5pc2hlZD0hMSx0aGlzLmVycm9yRW1pdHRlZD0hMSx0aGlzLmVtaXRDbG9zZT0hMSE9PW9wdGlvbnMuZW1pdENsb3NlLHRoaXMuYXV0b0Rlc3Ryb3k9ISFvcHRpb25zLmF1dG9EZXN0cm95LHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQ9MCx0aGlzLmNvcmtlZFJlcXVlc3RzRnJlZT1uZXcgQ29ya2VkUmVxdWVzdCh0aGlzKX1mdW5jdGlvbiBXcml0YWJsZShvcHRpb25zKXt2YXIgaXNEdXBsZXg9dGhpcyBpbnN0YW5jZW9mKER1cGxleD1EdXBsZXh8fF9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX2R1cGxleC5qcyIpKTtpZighaXNEdXBsZXgmJiFyZWFsSGFzSW5zdGFuY2UuY2FsbChXcml0YWJsZSx0aGlzKSlyZXR1cm4gbmV3IFdyaXRhYmxlKG9wdGlvbnMpO3RoaXMuX3dyaXRhYmxlU3RhdGU9bmV3IFdyaXRhYmxlU3RhdGUob3B0aW9ucyx0aGlzLGlzRHVwbGV4KSx0aGlzLndyaXRhYmxlPSEwLG9wdGlvbnMmJigiZnVuY3Rpb24iPT10eXBlb2Ygb3B0aW9ucy53cml0ZSYmKHRoaXMuX3dyaXRlPW9wdGlvbnMud3JpdGUpLCJmdW5jdGlvbiI9PXR5cGVvZiBvcHRpb25zLndyaXRldiYmKHRoaXMuX3dyaXRldj1vcHRpb25zLndyaXRldiksImZ1bmN0aW9uIj09dHlwZW9mIG9wdGlvbnMuZGVzdHJveSYmKHRoaXMuX2Rlc3Ryb3k9b3B0aW9ucy5kZXN0cm95KSwiZnVuY3Rpb24iPT10eXBlb2Ygb3B0aW9ucy5maW5hbCYmKHRoaXMuX2ZpbmFsPW9wdGlvbnMuZmluYWwpKSxTdHJlYW0uY2FsbCh0aGlzKX1mdW5jdGlvbiBkb1dyaXRlKHN0cmVhbSxzdGF0ZSx3cml0ZXYsbGVuLGNodW5rLGVuY29kaW5nLGNiKXtzdGF0ZS53cml0ZWxlbj1sZW4sc3RhdGUud3JpdGVjYj1jYixzdGF0ZS53cml0aW5nPSEwLHN0YXRlLnN5bmM9ITAsc3RhdGUuZGVzdHJveWVkP3N0YXRlLm9ud3JpdGUobmV3IEVSUl9TVFJFQU1fREVTVFJPWUVEKCJ3cml0ZSIpKTp3cml0ZXY/c3RyZWFtLl93cml0ZXYoY2h1bmssc3RhdGUub253cml0ZSk6c3RyZWFtLl93cml0ZShjaHVuayxlbmNvZGluZyxzdGF0ZS5vbndyaXRlKSxzdGF0ZS5zeW5jPSExfWZ1bmN0aW9uIGFmdGVyV3JpdGUoc3RyZWFtLHN0YXRlLGZpbmlzaGVkLGNiKXtmaW5pc2hlZHx8ZnVuY3Rpb24gb253cml0ZURyYWluKHN0cmVhbSxzdGF0ZSl7MD09PXN0YXRlLmxlbmd0aCYmc3RhdGUubmVlZERyYWluJiYoc3RhdGUubmVlZERyYWluPSExLHN0cmVhbS5lbWl0KCJkcmFpbiIpKX0oc3RyZWFtLHN0YXRlKSxzdGF0ZS5wZW5kaW5nY2ItLSxjYigpLGZpbmlzaE1heWJlKHN0cmVhbSxzdGF0ZSl9ZnVuY3Rpb24gY2xlYXJCdWZmZXIoc3RyZWFtLHN0YXRlKXtzdGF0ZS5idWZmZXJQcm9jZXNzaW5nPSEwO3ZhciBlbnRyeT1zdGF0ZS5idWZmZXJlZFJlcXVlc3Q7aWYoc3RyZWFtLl93cml0ZXYmJmVudHJ5JiZlbnRyeS5uZXh0KXt2YXIgbD1zdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudCxidWZmZXI9bmV3IEFycmF5KGwpLGhvbGRlcj1zdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU7aG9sZGVyLmVudHJ5PWVudHJ5O2Zvcih2YXIgY291bnQ9MCxhbGxCdWZmZXJzPSEwO2VudHJ5OylidWZmZXJbY291bnRdPWVudHJ5LGVudHJ5LmlzQnVmfHwoYWxsQnVmZmVycz0hMSksZW50cnk9ZW50cnkubmV4dCxjb3VudCs9MTtidWZmZXIuYWxsQnVmZmVycz1hbGxCdWZmZXJzLGRvV3JpdGUoc3RyZWFtLHN0YXRlLCEwLHN0YXRlLmxlbmd0aCxidWZmZXIsIiIsaG9sZGVyLmZpbmlzaCksc3RhdGUucGVuZGluZ2NiKyssc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsLGhvbGRlci5uZXh0PyhzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU9aG9sZGVyLm5leHQsaG9sZGVyLm5leHQ9bnVsbCk6c3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlPW5ldyBDb3JrZWRSZXF1ZXN0KHN0YXRlKSxzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudD0wfWVsc2V7Zm9yKDtlbnRyeTspe3ZhciBjaHVuaz1lbnRyeS5jaHVuayxlbmNvZGluZz1lbnRyeS5lbmNvZGluZyxjYj1lbnRyeS5jYWxsYmFjaztpZihkb1dyaXRlKHN0cmVhbSxzdGF0ZSwhMSxzdGF0ZS5vYmplY3RNb2RlPzE6Y2h1bmsubGVuZ3RoLGNodW5rLGVuY29kaW5nLGNiKSxlbnRyeT1lbnRyeS5uZXh0LHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50LS0sc3RhdGUud3JpdGluZylicmVha31udWxsPT09ZW50cnkmJihzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwpfXN0YXRlLmJ1ZmZlcmVkUmVxdWVzdD1lbnRyeSxzdGF0ZS5idWZmZXJQcm9jZXNzaW5nPSExfWZ1bmN0aW9uIG5lZWRGaW5pc2goc3RhdGUpe3JldHVybiBzdGF0ZS5lbmRpbmcmJjA9PT1zdGF0ZS5sZW5ndGgmJm51bGw9PT1zdGF0ZS5idWZmZXJlZFJlcXVlc3QmJiFzdGF0ZS5maW5pc2hlZCYmIXN0YXRlLndyaXRpbmd9ZnVuY3Rpb24gY2FsbEZpbmFsKHN0cmVhbSxzdGF0ZSl7c3RyZWFtLl9maW5hbChmdW5jdGlvbihlcnIpe3N0YXRlLnBlbmRpbmdjYi0tLGVyciYmZXJyb3JPckRlc3Ryb3koc3RyZWFtLGVyciksc3RhdGUucHJlZmluaXNoZWQ9ITAsc3RyZWFtLmVtaXQoInByZWZpbmlzaCIpLGZpbmlzaE1heWJlKHN0cmVhbSxzdGF0ZSl9KX1mdW5jdGlvbiBmaW5pc2hNYXliZShzdHJlYW0sc3RhdGUpe3ZhciBuZWVkPW5lZWRGaW5pc2goc3RhdGUpO2lmKG5lZWQmJihmdW5jdGlvbiBwcmVmaW5pc2goc3RyZWFtLHN0YXRlKXtzdGF0ZS5wcmVmaW5pc2hlZHx8c3RhdGUuZmluYWxDYWxsZWR8fCgiZnVuY3Rpb24iIT10eXBlb2Ygc3RyZWFtLl9maW5hbHx8c3RhdGUuZGVzdHJveWVkPyhzdGF0ZS5wcmVmaW5pc2hlZD0hMCxzdHJlYW0uZW1pdCgicHJlZmluaXNoIikpOihzdGF0ZS5wZW5kaW5nY2IrKyxzdGF0ZS5maW5hbENhbGxlZD0hMCxwcm9jZXNzLm5leHRUaWNrKGNhbGxGaW5hbCxzdHJlYW0sc3RhdGUpKSl9KHN0cmVhbSxzdGF0ZSksMD09PXN0YXRlLnBlbmRpbmdjYiYmKHN0YXRlLmZpbmlzaGVkPSEwLHN0cmVhbS5lbWl0KCJmaW5pc2giKSxzdGF0ZS5hdXRvRGVzdHJveSkpKXt2YXIgclN0YXRlPXN0cmVhbS5fcmVhZGFibGVTdGF0ZTsoIXJTdGF0ZXx8clN0YXRlLmF1dG9EZXN0cm95JiZyU3RhdGUuZW5kRW1pdHRlZCkmJnN0cmVhbS5kZXN0cm95KCl9cmV0dXJuIG5lZWR9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiKShXcml0YWJsZSxTdHJlYW0pLFdyaXRhYmxlU3RhdGUucHJvdG90eXBlLmdldEJ1ZmZlcj1mdW5jdGlvbiBnZXRCdWZmZXIoKXtmb3IodmFyIGN1cnJlbnQ9dGhpcy5idWZmZXJlZFJlcXVlc3Qsb3V0PVtdO2N1cnJlbnQ7KW91dC5wdXNoKGN1cnJlbnQpLGN1cnJlbnQ9Y3VycmVudC5uZXh0O3JldHVybiBvdXR9LGZ1bmN0aW9uKCl7dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0YXRlLnByb3RvdHlwZSwiYnVmZmVyIix7Z2V0OmludGVybmFsVXRpbC5kZXByZWNhdGUoZnVuY3Rpb24gd3JpdGFibGVTdGF0ZUJ1ZmZlckdldHRlcigpe3JldHVybiB0aGlzLmdldEJ1ZmZlcigpfSwiX3dyaXRhYmxlU3RhdGUuYnVmZmVyIGlzIGRlcHJlY2F0ZWQuIFVzZSBfd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIgaW5zdGVhZC4iLCJERVAwMDAzIil9KX1jYXRjaChfKXt9fSgpLCJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5oYXNJbnN0YW5jZSYmImZ1bmN0aW9uIj09dHlwZW9mIEZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdPyhyZWFsSGFzSW5zdGFuY2U9RnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0sT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLFN5bWJvbC5oYXNJbnN0YW5jZSx7dmFsdWU6ZnVuY3Rpb24gdmFsdWUob2JqZWN0KXtyZXR1cm4hIXJlYWxIYXNJbnN0YW5jZS5jYWxsKHRoaXMsb2JqZWN0KXx8dGhpcz09PVdyaXRhYmxlJiYob2JqZWN0JiZvYmplY3QuX3dyaXRhYmxlU3RhdGUgaW5zdGFuY2VvZiBXcml0YWJsZVN0YXRlKX19KSk6cmVhbEhhc0luc3RhbmNlPWZ1bmN0aW9uIHJlYWxIYXNJbnN0YW5jZShvYmplY3Qpe3JldHVybiBvYmplY3QgaW5zdGFuY2VvZiB0aGlzfSxXcml0YWJsZS5wcm90b3R5cGUucGlwZT1mdW5jdGlvbigpe2Vycm9yT3JEZXN0cm95KHRoaXMsbmV3IEVSUl9TVFJFQU1fQ0FOTk9UX1BJUEUpfSxXcml0YWJsZS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24oY2h1bmssZW5jb2RpbmcsY2Ipe3ZhciBzdGF0ZT10aGlzLl93cml0YWJsZVN0YXRlLHJldD0hMSxpc0J1Zj0hc3RhdGUub2JqZWN0TW9kZSYmZnVuY3Rpb24gX2lzVWludDhBcnJheShvYmope3JldHVybiBCdWZmZXIuaXNCdWZmZXIob2JqKXx8b2JqIGluc3RhbmNlb2YgT3VyVWludDhBcnJheX0oY2h1bmspO3JldHVybiBpc0J1ZiYmIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykmJihjaHVuaz1mdW5jdGlvbiBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKXtyZXR1cm4gQnVmZmVyLmZyb20oY2h1bmspfShjaHVuaykpLCJmdW5jdGlvbiI9PXR5cGVvZiBlbmNvZGluZyYmKGNiPWVuY29kaW5nLGVuY29kaW5nPW51bGwpLGlzQnVmP2VuY29kaW5nPSJidWZmZXIiOmVuY29kaW5nfHwoZW5jb2Rpbmc9c3RhdGUuZGVmYXVsdEVuY29kaW5nKSwiZnVuY3Rpb24iIT10eXBlb2YgY2ImJihjYj1ub3ApLHN0YXRlLmVuZGluZz9mdW5jdGlvbiB3cml0ZUFmdGVyRW5kKHN0cmVhbSxjYil7dmFyIGVyPW5ldyBFUlJfU1RSRUFNX1dSSVRFX0FGVEVSX0VORDtlcnJvck9yRGVzdHJveShzdHJlYW0sZXIpLHByb2Nlc3MubmV4dFRpY2soY2IsZXIpfSh0aGlzLGNiKTooaXNCdWZ8fGZ1bmN0aW9uIHZhbGlkQ2h1bmsoc3RyZWFtLHN0YXRlLGNodW5rLGNiKXt2YXIgZXI7cmV0dXJuIG51bGw9PT1jaHVuaz9lcj1uZXcgRVJSX1NUUkVBTV9OVUxMX1ZBTFVFUzoic3RyaW5nIj09dHlwZW9mIGNodW5rfHxzdGF0ZS5vYmplY3RNb2RlfHwoZXI9bmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKCJjaHVuayIsWyJzdHJpbmciLCJCdWZmZXIiXSxjaHVuaykpLCFlcnx8KGVycm9yT3JEZXN0cm95KHN0cmVhbSxlcikscHJvY2Vzcy5uZXh0VGljayhjYixlciksITEpfSh0aGlzLHN0YXRlLGNodW5rLGNiKSkmJihzdGF0ZS5wZW5kaW5nY2IrKyxyZXQ9ZnVuY3Rpb24gd3JpdGVPckJ1ZmZlcihzdHJlYW0sc3RhdGUsaXNCdWYsY2h1bmssZW5jb2RpbmcsY2Ipe2lmKCFpc0J1Zil7dmFyIG5ld0NodW5rPWZ1bmN0aW9uIGRlY29kZUNodW5rKHN0YXRlLGNodW5rLGVuY29kaW5nKXtzdGF0ZS5vYmplY3RNb2RlfHwhMT09PXN0YXRlLmRlY29kZVN0cmluZ3N8fCJzdHJpbmciIT10eXBlb2YgY2h1bmt8fChjaHVuaz1CdWZmZXIuZnJvbShjaHVuayxlbmNvZGluZykpO3JldHVybiBjaHVua30oc3RhdGUsY2h1bmssZW5jb2RpbmcpO2NodW5rIT09bmV3Q2h1bmsmJihpc0J1Zj0hMCxlbmNvZGluZz0iYnVmZmVyIixjaHVuaz1uZXdDaHVuayl9dmFyIGxlbj1zdGF0ZS5vYmplY3RNb2RlPzE6Y2h1bmsubGVuZ3RoO3N0YXRlLmxlbmd0aCs9bGVuO3ZhciByZXQ9c3RhdGUubGVuZ3RoPHN0YXRlLmhpZ2hXYXRlck1hcms7cmV0fHwoc3RhdGUubmVlZERyYWluPSEwKTtpZihzdGF0ZS53cml0aW5nfHxzdGF0ZS5jb3JrZWQpe3ZhciBsYXN0PXN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7c3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdD17Y2h1bmssZW5jb2RpbmcsaXNCdWYsY2FsbGJhY2s6Y2IsbmV4dDpudWxsfSxsYXN0P2xhc3QubmV4dD1zdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0OnN0YXRlLmJ1ZmZlcmVkUmVxdWVzdD1zdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0LHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50Kz0xfWVsc2UgZG9Xcml0ZShzdHJlYW0sc3RhdGUsITEsbGVuLGNodW5rLGVuY29kaW5nLGNiKTtyZXR1cm4gcmV0fSh0aGlzLHN0YXRlLGlzQnVmLGNodW5rLGVuY29kaW5nLGNiKSkscmV0fSxXcml0YWJsZS5wcm90b3R5cGUuY29yaz1mdW5jdGlvbigpe3RoaXMuX3dyaXRhYmxlU3RhdGUuY29ya2VkKyt9LFdyaXRhYmxlLnByb3RvdHlwZS51bmNvcms9ZnVuY3Rpb24oKXt2YXIgc3RhdGU9dGhpcy5fd3JpdGFibGVTdGF0ZTtzdGF0ZS5jb3JrZWQmJihzdGF0ZS5jb3JrZWQtLSxzdGF0ZS53cml0aW5nfHxzdGF0ZS5jb3JrZWR8fHN0YXRlLmJ1ZmZlclByb2Nlc3Npbmd8fCFzdGF0ZS5idWZmZXJlZFJlcXVlc3R8fGNsZWFyQnVmZmVyKHRoaXMsc3RhdGUpKX0sV3JpdGFibGUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZz1mdW5jdGlvbiBzZXREZWZhdWx0RW5jb2RpbmcoZW5jb2Rpbmcpe2lmKCJzdHJpbmciPT10eXBlb2YgZW5jb2RpbmcmJihlbmNvZGluZz1lbmNvZGluZy50b0xvd2VyQ2FzZSgpKSwhKFsiaGV4IiwidXRmOCIsInV0Zi04IiwiYXNjaWkiLCJiaW5hcnkiLCJiYXNlNjQiLCJ1Y3MyIiwidWNzLTIiLCJ1dGYxNmxlIiwidXRmLTE2bGUiLCJyYXciXS5pbmRleE9mKChlbmNvZGluZysiIikudG9Mb3dlckNhc2UoKSk+LTEpKXRocm93IG5ldyBFUlJfVU5LTk9XTl9FTkNPRElORyhlbmNvZGluZyk7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nPWVuY29kaW5nLHRoaXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZS5wcm90b3R5cGUsIndyaXRhYmxlQnVmZmVyIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUmJnRoaXMuX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyKCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLnByb3RvdHlwZSwid3JpdGFibGVIaWdoV2F0ZXJNYXJrIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya319KSxXcml0YWJsZS5wcm90b3R5cGUuX3dyaXRlPWZ1bmN0aW9uKGNodW5rLGVuY29kaW5nLGNiKXtjYihuZXcgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQoIl93cml0ZSgpIikpfSxXcml0YWJsZS5wcm90b3R5cGUuX3dyaXRldj1udWxsLFdyaXRhYmxlLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24oY2h1bmssZW5jb2RpbmcsY2Ipe3ZhciBzdGF0ZT10aGlzLl93cml0YWJsZVN0YXRlO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBjaHVuaz8oY2I9Y2h1bmssY2h1bms9bnVsbCxlbmNvZGluZz1udWxsKToiZnVuY3Rpb24iPT10eXBlb2YgZW5jb2RpbmcmJihjYj1lbmNvZGluZyxlbmNvZGluZz1udWxsKSxudWxsIT1jaHVuayYmdGhpcy53cml0ZShjaHVuayxlbmNvZGluZyksc3RhdGUuY29ya2VkJiYoc3RhdGUuY29ya2VkPTEsdGhpcy51bmNvcmsoKSksc3RhdGUuZW5kaW5nfHxmdW5jdGlvbiBlbmRXcml0YWJsZShzdHJlYW0sc3RhdGUsY2Ipe3N0YXRlLmVuZGluZz0hMCxmaW5pc2hNYXliZShzdHJlYW0sc3RhdGUpLGNiJiYoc3RhdGUuZmluaXNoZWQ/cHJvY2Vzcy5uZXh0VGljayhjYik6c3RyZWFtLm9uY2UoImZpbmlzaCIsY2IpKTtzdGF0ZS5lbmRlZD0hMCxzdHJlYW0ud3JpdGFibGU9ITF9KHRoaXMsc3RhdGUsY2IpLHRoaXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZS5wcm90b3R5cGUsIndyaXRhYmxlTGVuZ3RoIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUubGVuZ3RofX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZS5wcm90b3R5cGUsImRlc3Ryb3llZCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB2b2lkIDAhPT10aGlzLl93cml0YWJsZVN0YXRlJiZ0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZH0sc2V0OmZ1bmN0aW9uIHNldCh2YWx1ZSl7dGhpcy5fd3JpdGFibGVTdGF0ZSYmKHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkPXZhbHVlKX19KSxXcml0YWJsZS5wcm90b3R5cGUuZGVzdHJveT1kZXN0cm95SW1wbC5kZXN0cm95LFdyaXRhYmxlLnByb3RvdHlwZS5fdW5kZXN0cm95PWRlc3Ryb3lJbXBsLnVuZGVzdHJveSxXcml0YWJsZS5wcm90b3R5cGUuX2Rlc3Ryb3k9ZnVuY3Rpb24oZXJyLGNiKXtjYihlcnIpfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2FzeW5jX2l0ZXJhdG9yLmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgX09iamVjdCRzZXRQcm90b3R5cGVPLHByb2Nlc3M9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL25vZGUtc3RkbGliLWJyb3dzZXIvY2pzL3Byb3h5L3Byb2Nlc3MuanMiKTtmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLGtleSx2YWx1ZSl7cmV0dXJuKGtleT1mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleShhcmcpe3ZhciBrZXk9ZnVuY3Rpb24gX3RvUHJpbWl0aXZlKGlucHV0LGhpbnQpe2lmKCJvYmplY3QiIT10eXBlb2YgaW5wdXR8fG51bGw9PT1pbnB1dClyZXR1cm4gaW5wdXQ7dmFyIHByaW09aW5wdXRbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZih2b2lkIDAhPT1wcmltKXt2YXIgcmVzPXByaW0uY2FsbChpbnB1dCxoaW50fHwiZGVmYXVsdCIpO2lmKCJvYmplY3QiIT10eXBlb2YgcmVzKXJldHVybiByZXM7dGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKX1yZXR1cm4oInN0cmluZyI9PT1oaW50P1N0cmluZzpOdW1iZXIpKGlucHV0KX0oYXJnLCJzdHJpbmciKTtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIGtleT9rZXk6U3RyaW5nKGtleSl9KGtleSkpaW4gb2JqP09iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosa2V5LHt2YWx1ZSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOm9ialtrZXldPXZhbHVlLG9ian12YXIgZmluaXNoZWQ9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZW5kLW9mLXN0cmVhbS5qcyIpLGtMYXN0UmVzb2x2ZT1TeW1ib2woImxhc3RSZXNvbHZlIiksa0xhc3RSZWplY3Q9U3ltYm9sKCJsYXN0UmVqZWN0Iiksa0Vycm9yPVN5bWJvbCgiZXJyb3IiKSxrRW5kZWQ9U3ltYm9sKCJlbmRlZCIpLGtMYXN0UHJvbWlzZT1TeW1ib2woImxhc3RQcm9taXNlIiksa0hhbmRsZVByb21pc2U9U3ltYm9sKCJoYW5kbGVQcm9taXNlIiksa1N0cmVhbT1TeW1ib2woInN0cmVhbSIpO2Z1bmN0aW9uIGNyZWF0ZUl0ZXJSZXN1bHQodmFsdWUsZG9uZSl7cmV0dXJue3ZhbHVlLGRvbmV9fWZ1bmN0aW9uIHJlYWRBbmRSZXNvbHZlKGl0ZXIpe3ZhciByZXNvbHZlPWl0ZXJba0xhc3RSZXNvbHZlXTtpZihudWxsIT09cmVzb2x2ZSl7dmFyIGRhdGE9aXRlcltrU3RyZWFtXS5yZWFkKCk7bnVsbCE9PWRhdGEmJihpdGVyW2tMYXN0UHJvbWlzZV09bnVsbCxpdGVyW2tMYXN0UmVzb2x2ZV09bnVsbCxpdGVyW2tMYXN0UmVqZWN0XT1udWxsLHJlc29sdmUoY3JlYXRlSXRlclJlc3VsdChkYXRhLCExKSkpfX1mdW5jdGlvbiBvblJlYWRhYmxlKGl0ZXIpe3Byb2Nlc3MubmV4dFRpY2socmVhZEFuZFJlc29sdmUsaXRlcil9dmFyIEFzeW5jSXRlcmF0b3JQcm90b3R5cGU9T2JqZWN0LmdldFByb3RvdHlwZU9mKGZ1bmN0aW9uKCl7fSksUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yUHJvdG90eXBlPU9iamVjdC5zZXRQcm90b3R5cGVPZigoX2RlZmluZVByb3BlcnR5KF9PYmplY3Qkc2V0UHJvdG90eXBlTz17Z2V0IHN0cmVhbSgpe3JldHVybiB0aGlzW2tTdHJlYW1dfSxuZXh0OmZ1bmN0aW9uIG5leHQoKXt2YXIgX3RoaXM9dGhpcyxlcnJvcj10aGlzW2tFcnJvcl07aWYobnVsbCE9PWVycm9yKXJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7aWYodGhpc1trRW5kZWRdKXJldHVybiBQcm9taXNlLnJlc29sdmUoY3JlYXRlSXRlclJlc3VsdCh2b2lkIDAsITApKTtpZih0aGlzW2tTdHJlYW1dLmRlc3Ryb3llZClyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSxyZWplY3Qpe3Byb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKXtfdGhpc1trRXJyb3JdP3JlamVjdChfdGhpc1trRXJyb3JdKTpyZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQodm9pZCAwLCEwKSl9KX0pO3ZhciBwcm9taXNlLGxhc3RQcm9taXNlPXRoaXNba0xhc3RQcm9taXNlXTtpZihsYXN0UHJvbWlzZSlwcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uIHdyYXBGb3JOZXh0KGxhc3RQcm9taXNlLGl0ZXIpe3JldHVybiBmdW5jdGlvbihyZXNvbHZlLHJlamVjdCl7bGFzdFByb21pc2UudGhlbihmdW5jdGlvbigpe2l0ZXJba0VuZGVkXT9yZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQodm9pZCAwLCEwKSk6aXRlcltrSGFuZGxlUHJvbWlzZV0ocmVzb2x2ZSxyZWplY3QpfSxyZWplY3QpfX0obGFzdFByb21pc2UsdGhpcykpO2Vsc2V7dmFyIGRhdGE9dGhpc1trU3RyZWFtXS5yZWFkKCk7aWYobnVsbCE9PWRhdGEpcmV0dXJuIFByb21pc2UucmVzb2x2ZShjcmVhdGVJdGVyUmVzdWx0KGRhdGEsITEpKTtwcm9taXNlPW5ldyBQcm9taXNlKHRoaXNba0hhbmRsZVByb21pc2VdKX1yZXR1cm4gdGhpc1trTGFzdFByb21pc2VdPXByb21pc2UscHJvbWlzZX19LFN5bWJvbC5hc3luY0l0ZXJhdG9yLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxfZGVmaW5lUHJvcGVydHkoX09iamVjdCRzZXRQcm90b3R5cGVPLCJyZXR1cm4iLGZ1bmN0aW9uIF9yZXR1cm4oKXt2YXIgX3RoaXMyPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXtfdGhpczJba1N0cmVhbV0uZGVzdHJveShudWxsLGZ1bmN0aW9uKGVycil7ZXJyP3JlamVjdChlcnIpOnJlc29sdmUoY3JlYXRlSXRlclJlc3VsdCh2b2lkIDAsITApKX0pfSl9KSxfT2JqZWN0JHNldFByb3RvdHlwZU8pLEFzeW5jSXRlcmF0b3JQcm90b3R5cGUpO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uIGNyZWF0ZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcihzdHJlYW0pe3ZhciBfT2JqZWN0JGNyZWF0ZSxpdGVyYXRvcj1PYmplY3QuY3JlYXRlKFJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvclByb3RvdHlwZSwoX2RlZmluZVByb3BlcnR5KF9PYmplY3QkY3JlYXRlPXt9LGtTdHJlYW0se3ZhbHVlOnN0cmVhbSx3cml0YWJsZTohMH0pLF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JGNyZWF0ZSxrTGFzdFJlc29sdmUse3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KSxfZGVmaW5lUHJvcGVydHkoX09iamVjdCRjcmVhdGUsa0xhc3RSZWplY3Qse3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KSxfZGVmaW5lUHJvcGVydHkoX09iamVjdCRjcmVhdGUsa0Vycm9yLHt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSksX2RlZmluZVByb3BlcnR5KF9PYmplY3QkY3JlYXRlLGtFbmRlZCx7dmFsdWU6c3RyZWFtLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQsd3JpdGFibGU6ITB9KSxfZGVmaW5lUHJvcGVydHkoX09iamVjdCRjcmVhdGUsa0hhbmRsZVByb21pc2Use3ZhbHVlOmZ1bmN0aW9uIHZhbHVlKHJlc29sdmUscmVqZWN0KXt2YXIgZGF0YT1pdGVyYXRvcltrU3RyZWFtXS5yZWFkKCk7ZGF0YT8oaXRlcmF0b3Jba0xhc3RQcm9taXNlXT1udWxsLGl0ZXJhdG9yW2tMYXN0UmVzb2x2ZV09bnVsbCxpdGVyYXRvcltrTGFzdFJlamVjdF09bnVsbCxyZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQoZGF0YSwhMSkpKTooaXRlcmF0b3Jba0xhc3RSZXNvbHZlXT1yZXNvbHZlLGl0ZXJhdG9yW2tMYXN0UmVqZWN0XT1yZWplY3QpfSx3cml0YWJsZTohMH0pLF9PYmplY3QkY3JlYXRlKSk7cmV0dXJuIGl0ZXJhdG9yW2tMYXN0UHJvbWlzZV09bnVsbCxmaW5pc2hlZChzdHJlYW0sZnVuY3Rpb24oZXJyKXtpZihlcnImJiJFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRSIhPT1lcnIuY29kZSl7dmFyIHJlamVjdD1pdGVyYXRvcltrTGFzdFJlamVjdF07cmV0dXJuIG51bGwhPT1yZWplY3QmJihpdGVyYXRvcltrTGFzdFByb21pc2VdPW51bGwsaXRlcmF0b3Jba0xhc3RSZXNvbHZlXT1udWxsLGl0ZXJhdG9yW2tMYXN0UmVqZWN0XT1udWxsLHJlamVjdChlcnIpKSx2b2lkKGl0ZXJhdG9yW2tFcnJvcl09ZXJyKX12YXIgcmVzb2x2ZT1pdGVyYXRvcltrTGFzdFJlc29sdmVdO251bGwhPT1yZXNvbHZlJiYoaXRlcmF0b3Jba0xhc3RQcm9taXNlXT1udWxsLGl0ZXJhdG9yW2tMYXN0UmVzb2x2ZV09bnVsbCxpdGVyYXRvcltrTGFzdFJlamVjdF09bnVsbCxyZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQodm9pZCAwLCEwKSkpLGl0ZXJhdG9yW2tFbmRlZF09ITB9KSxzdHJlYW0ub24oInJlYWRhYmxlIixvblJlYWRhYmxlLmJpbmQobnVsbCxpdGVyYXRvcikpLGl0ZXJhdG9yfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2J1ZmZlcl9saXN0LmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvd25LZXlzKG9iamVjdCxlbnVtZXJhYmxlT25seSl7dmFyIGtleXM9T2JqZWN0LmtleXMob2JqZWN0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgc3ltYm9scz1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7ZW51bWVyYWJsZU9ubHkmJihzeW1ib2xzPXN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uKHN5bSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LHN5bSkuZW51bWVyYWJsZX0pKSxrZXlzLnB1c2guYXBwbHkoa2V5cyxzeW1ib2xzKX1yZXR1cm4ga2V5c31mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCl7Zm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIHNvdXJjZT1udWxsIT1hcmd1bWVudHNbaV0/YXJndW1lbnRzW2ldOnt9O2klMj9vd25LZXlzKE9iamVjdChzb3VyY2UpLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSl7X2RlZmluZVByb3BlcnR5KHRhcmdldCxrZXksc291cmNlW2tleV0pfSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOm93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24oa2V5KXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LGtleSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSxrZXkpKX0pfXJldHVybiB0YXJnZXR9ZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaixrZXksdmFsdWUpe3JldHVybihrZXk9X3RvUHJvcGVydHlLZXkoa2V5KSlpbiBvYmo/T2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaixrZXkse3ZhbHVlLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6b2JqW2tleV09dmFsdWUsb2JqfWZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCxwcm9wcyl7Zm9yKHZhciBpPTA7aTxwcm9wcy5sZW5ndGg7aSsrKXt2YXIgZGVzY3JpcHRvcj1wcm9wc1tpXTtkZXNjcmlwdG9yLmVudW1lcmFibGU9ZGVzY3JpcHRvci5lbnVtZXJhYmxlfHwhMSxkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gZGVzY3JpcHRvciYmKGRlc2NyaXB0b3Iud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsX3RvUHJvcGVydHlLZXkoZGVzY3JpcHRvci5rZXkpLGRlc2NyaXB0b3IpfX1mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleShhcmcpe3ZhciBrZXk9ZnVuY3Rpb24gX3RvUHJpbWl0aXZlKGlucHV0LGhpbnQpe2lmKCJvYmplY3QiIT10eXBlb2YgaW5wdXR8fG51bGw9PT1pbnB1dClyZXR1cm4gaW5wdXQ7dmFyIHByaW09aW5wdXRbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZih2b2lkIDAhPT1wcmltKXt2YXIgcmVzPXByaW0uY2FsbChpbnB1dCxoaW50fHwiZGVmYXVsdCIpO2lmKCJvYmplY3QiIT10eXBlb2YgcmVzKXJldHVybiByZXM7dGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKX1yZXR1cm4oInN0cmluZyI9PT1oaW50P1N0cmluZzpOdW1iZXIpKGlucHV0KX0oYXJnLCJzdHJpbmciKTtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIGtleT9rZXk6U3RyaW5nKGtleSl9dmFyIEJ1ZmZlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzIikuQnVmZmVyLGluc3BlY3Q9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3V0aWwvdXRpbC5qcyIpLmluc3BlY3QsY3VzdG9tPWluc3BlY3QmJmluc3BlY3QuY3VzdG9tfHwiaW5zcGVjdCI7ZnVuY3Rpb24gY29weUJ1ZmZlcihzcmMsdGFyZ2V0LG9mZnNldCl7QnVmZmVyLnByb3RvdHlwZS5jb3B5LmNhbGwoc3JjLHRhcmdldCxvZmZzZXQpfW1vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gQnVmZmVyTGlzdCgpeyFmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsQnVmZmVyTGlzdCksdGhpcy5oZWFkPW51bGwsdGhpcy50YWlsPW51bGwsdGhpcy5sZW5ndGg9MH1yZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLHByb3RvUHJvcHMsc3RhdGljUHJvcHMpe3JldHVybiBwcm90b1Byb3BzJiZfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUscHJvdG9Qcm9wcyksc3RhdGljUHJvcHMmJl9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLHN0YXRpY1Byb3BzKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29uc3RydWN0b3IsInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksQ29uc3RydWN0b3J9KEJ1ZmZlckxpc3QsW3trZXk6InB1c2giLHZhbHVlOmZ1bmN0aW9uIHB1c2godil7dmFyIGVudHJ5PXtkYXRhOnYsbmV4dDpudWxsfTt0aGlzLmxlbmd0aD4wP3RoaXMudGFpbC5uZXh0PWVudHJ5OnRoaXMuaGVhZD1lbnRyeSx0aGlzLnRhaWw9ZW50cnksKyt0aGlzLmxlbmd0aH19LHtrZXk6InVuc2hpZnQiLHZhbHVlOmZ1bmN0aW9uIHVuc2hpZnQodil7dmFyIGVudHJ5PXtkYXRhOnYsbmV4dDp0aGlzLmhlYWR9OzA9PT10aGlzLmxlbmd0aCYmKHRoaXMudGFpbD1lbnRyeSksdGhpcy5oZWFkPWVudHJ5LCsrdGhpcy5sZW5ndGh9fSx7a2V5OiJzaGlmdCIsdmFsdWU6ZnVuY3Rpb24gc2hpZnQoKXtpZigwIT09dGhpcy5sZW5ndGgpe3ZhciByZXQ9dGhpcy5oZWFkLmRhdGE7cmV0dXJuIDE9PT10aGlzLmxlbmd0aD90aGlzLmhlYWQ9dGhpcy50YWlsPW51bGw6dGhpcy5oZWFkPXRoaXMuaGVhZC5uZXh0LC0tdGhpcy5sZW5ndGgscmV0fX19LHtrZXk6ImNsZWFyIix2YWx1ZTpmdW5jdGlvbiBjbGVhcigpe3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbCx0aGlzLmxlbmd0aD0wfX0se2tleToiam9pbiIsdmFsdWU6ZnVuY3Rpb24gam9pbihzKXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIiI7Zm9yKHZhciBwPXRoaXMuaGVhZCxyZXQ9IiIrcC5kYXRhO3A9cC5uZXh0OylyZXQrPXMrcC5kYXRhO3JldHVybiByZXR9fSx7a2V5OiJjb25jYXQiLHZhbHVlOmZ1bmN0aW9uIGNvbmNhdChuKXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIEJ1ZmZlci5hbGxvYygwKTtmb3IodmFyIHJldD1CdWZmZXIuYWxsb2NVbnNhZmUobj4+PjApLHA9dGhpcy5oZWFkLGk9MDtwOyljb3B5QnVmZmVyKHAuZGF0YSxyZXQsaSksaSs9cC5kYXRhLmxlbmd0aCxwPXAubmV4dDtyZXR1cm4gcmV0fX0se2tleToiY29uc3VtZSIsdmFsdWU6ZnVuY3Rpb24gY29uc3VtZShuLGhhc1N0cmluZ3Mpe3ZhciByZXQ7cmV0dXJuIG48dGhpcy5oZWFkLmRhdGEubGVuZ3RoPyhyZXQ9dGhpcy5oZWFkLmRhdGEuc2xpY2UoMCxuKSx0aGlzLmhlYWQuZGF0YT10aGlzLmhlYWQuZGF0YS5zbGljZShuKSk6cmV0PW49PT10aGlzLmhlYWQuZGF0YS5sZW5ndGg/dGhpcy5zaGlmdCgpOmhhc1N0cmluZ3M/dGhpcy5fZ2V0U3RyaW5nKG4pOnRoaXMuX2dldEJ1ZmZlcihuKSxyZXR9fSx7a2V5OiJmaXJzdCIsdmFsdWU6ZnVuY3Rpb24gZmlyc3QoKXtyZXR1cm4gdGhpcy5oZWFkLmRhdGF9fSx7a2V5OiJfZ2V0U3RyaW5nIix2YWx1ZTpmdW5jdGlvbiBfZ2V0U3RyaW5nKG4pe3ZhciBwPXRoaXMuaGVhZCxjPTEscmV0PXAuZGF0YTtmb3Iobi09cmV0Lmxlbmd0aDtwPXAubmV4dDspe3ZhciBzdHI9cC5kYXRhLG5iPW4+c3RyLmxlbmd0aD9zdHIubGVuZ3RoOm47aWYobmI9PT1zdHIubGVuZ3RoP3JldCs9c3RyOnJldCs9c3RyLnNsaWNlKDAsbiksMD09PShuLT1uYikpe25iPT09c3RyLmxlbmd0aD8oKytjLHAubmV4dD90aGlzLmhlYWQ9cC5uZXh0OnRoaXMuaGVhZD10aGlzLnRhaWw9bnVsbCk6KHRoaXMuaGVhZD1wLHAuZGF0YT1zdHIuc2xpY2UobmIpKTticmVha30rK2N9cmV0dXJuIHRoaXMubGVuZ3RoLT1jLHJldH19LHtrZXk6Il9nZXRCdWZmZXIiLHZhbHVlOmZ1bmN0aW9uIF9nZXRCdWZmZXIobil7dmFyIHJldD1CdWZmZXIuYWxsb2NVbnNhZmUobikscD10aGlzLmhlYWQsYz0xO2ZvcihwLmRhdGEuY29weShyZXQpLG4tPXAuZGF0YS5sZW5ndGg7cD1wLm5leHQ7KXt2YXIgYnVmPXAuZGF0YSxuYj1uPmJ1Zi5sZW5ndGg/YnVmLmxlbmd0aDpuO2lmKGJ1Zi5jb3B5KHJldCxyZXQubGVuZ3RoLW4sMCxuYiksMD09PShuLT1uYikpe25iPT09YnVmLmxlbmd0aD8oKytjLHAubmV4dD90aGlzLmhlYWQ9cC5uZXh0OnRoaXMuaGVhZD10aGlzLnRhaWw9bnVsbCk6KHRoaXMuaGVhZD1wLHAuZGF0YT1idWYuc2xpY2UobmIpKTticmVha30rK2N9cmV0dXJuIHRoaXMubGVuZ3RoLT1jLHJldH19LHtrZXk6Y3VzdG9tLHZhbHVlOmZ1bmN0aW9uIHZhbHVlKF8sb3B0aW9ucyl7cmV0dXJuIGluc3BlY3QodGhpcyxfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sb3B0aW9ucykse30se2RlcHRoOjAsY3VzdG9tSW5zcGVjdDohMX0pKX19XSksQnVmZmVyTGlzdH0oKX0sIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3kuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBwcm9jZXNzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9ub2RlLXN0ZGxpYi1icm93c2VyL2Nqcy9wcm94eS9wcm9jZXNzLmpzIik7ZnVuY3Rpb24gZW1pdEVycm9yQW5kQ2xvc2VOVChzZWxmLGVycil7ZW1pdEVycm9yTlQoc2VsZixlcnIpLGVtaXRDbG9zZU5UKHNlbGYpfWZ1bmN0aW9uIGVtaXRDbG9zZU5UKHNlbGYpe3NlbGYuX3dyaXRhYmxlU3RhdGUmJiFzZWxmLl93cml0YWJsZVN0YXRlLmVtaXRDbG9zZXx8c2VsZi5fcmVhZGFibGVTdGF0ZSYmIXNlbGYuX3JlYWRhYmxlU3RhdGUuZW1pdENsb3NlfHxzZWxmLmVtaXQoImNsb3NlIil9ZnVuY3Rpb24gZW1pdEVycm9yTlQoc2VsZixlcnIpe3NlbGYuZW1pdCgiZXJyb3IiLGVycil9bW9kdWxlLmV4cG9ydHM9e2Rlc3Ryb3k6ZnVuY3Rpb24gZGVzdHJveShlcnIsY2Ipe3ZhciBfdGhpcz10aGlzLHJlYWRhYmxlRGVzdHJveWVkPXRoaXMuX3JlYWRhYmxlU3RhdGUmJnRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkLHdyaXRhYmxlRGVzdHJveWVkPXRoaXMuX3dyaXRhYmxlU3RhdGUmJnRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkO3JldHVybiByZWFkYWJsZURlc3Ryb3llZHx8d3JpdGFibGVEZXN0cm95ZWQ/KGNiP2NiKGVycik6ZXJyJiYodGhpcy5fd3JpdGFibGVTdGF0ZT90aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZHx8KHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSEwLHByb2Nlc3MubmV4dFRpY2soZW1pdEVycm9yTlQsdGhpcyxlcnIpKTpwcm9jZXNzLm5leHRUaWNrKGVtaXRFcnJvck5ULHRoaXMsZXJyKSksdGhpcyk6KHRoaXMuX3JlYWRhYmxlU3RhdGUmJih0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD0hMCksdGhpcy5fd3JpdGFibGVTdGF0ZSYmKHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkPSEwKSx0aGlzLl9kZXN0cm95KGVycnx8bnVsbCxmdW5jdGlvbihlcnIpeyFjYiYmZXJyP190aGlzLl93cml0YWJsZVN0YXRlP190aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD9wcm9jZXNzLm5leHRUaWNrKGVtaXRDbG9zZU5ULF90aGlzKTooX3RoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSEwLHByb2Nlc3MubmV4dFRpY2soZW1pdEVycm9yQW5kQ2xvc2VOVCxfdGhpcyxlcnIpKTpwcm9jZXNzLm5leHRUaWNrKGVtaXRFcnJvckFuZENsb3NlTlQsX3RoaXMsZXJyKTpjYj8ocHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2VOVCxfdGhpcyksY2IoZXJyKSk6cHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2VOVCxfdGhpcyl9KSx0aGlzKX0sdW5kZXN0cm95OmZ1bmN0aW9uIHVuZGVzdHJveSgpe3RoaXMuX3JlYWRhYmxlU3RhdGUmJih0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD0hMSx0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRpbmc9ITEsdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRlZD0hMSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQ9ITEpLHRoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kaW5nPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluYWxDYWxsZWQ9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5wcmVmaW5pc2hlZD0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSExKX0sZXJyb3JPckRlc3Ryb3k6ZnVuY3Rpb24gZXJyb3JPckRlc3Ryb3koc3RyZWFtLGVycil7dmFyIHJTdGF0ZT1zdHJlYW0uX3JlYWRhYmxlU3RhdGUsd1N0YXRlPXN0cmVhbS5fd3JpdGFibGVTdGF0ZTtyU3RhdGUmJnJTdGF0ZS5hdXRvRGVzdHJveXx8d1N0YXRlJiZ3U3RhdGUuYXV0b0Rlc3Ryb3k/c3RyZWFtLmRlc3Ryb3koZXJyKTpzdHJlYW0uZW1pdCgiZXJyb3IiLGVycil9fX0sIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2VuZC1vZi1zdHJlYW0uanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9lcnJvcnMtYnJvd3Nlci5qcyIpLkYuRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0U7ZnVuY3Rpb24gbm9vcCgpe31tb2R1bGUuZXhwb3J0cz1mdW5jdGlvbiBlb3Moc3RyZWFtLG9wdHMsY2FsbGJhY2spe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBvcHRzKXJldHVybiBlb3Moc3RyZWFtLG51bGwsb3B0cyk7b3B0c3x8KG9wdHM9e30pLGNhbGxiYWNrPWZ1bmN0aW9uIG9uY2UoY2FsbGJhY2spe3ZhciBjYWxsZWQ9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoIWNhbGxlZCl7Y2FsbGVkPSEwO2Zvcih2YXIgX2xlbj1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9bmV3IEFycmF5KF9sZW4pLF9rZXk9MDtfa2V5PF9sZW47X2tleSsrKWFyZ3NbX2tleV09YXJndW1lbnRzW19rZXldO2NhbGxiYWNrLmFwcGx5KHRoaXMsYXJncyl9fX0oY2FsbGJhY2t8fG5vb3ApO3ZhciByZWFkYWJsZT1vcHRzLnJlYWRhYmxlfHwhMSE9PW9wdHMucmVhZGFibGUmJnN0cmVhbS5yZWFkYWJsZSx3cml0YWJsZT1vcHRzLndyaXRhYmxlfHwhMSE9PW9wdHMud3JpdGFibGUmJnN0cmVhbS53cml0YWJsZSxvbmxlZ2FjeWZpbmlzaD1mdW5jdGlvbiBvbmxlZ2FjeWZpbmlzaCgpe3N0cmVhbS53cml0YWJsZXx8b25maW5pc2goKX0sd3JpdGFibGVFbmRlZD1zdHJlYW0uX3dyaXRhYmxlU3RhdGUmJnN0cmVhbS5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZCxvbmZpbmlzaD1mdW5jdGlvbiBvbmZpbmlzaCgpe3dyaXRhYmxlPSExLHdyaXRhYmxlRW5kZWQ9ITAscmVhZGFibGV8fGNhbGxiYWNrLmNhbGwoc3RyZWFtKX0scmVhZGFibGVFbmRlZD1zdHJlYW0uX3JlYWRhYmxlU3RhdGUmJnN0cmVhbS5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkLG9uZW5kPWZ1bmN0aW9uIG9uZW5kKCl7cmVhZGFibGU9ITEscmVhZGFibGVFbmRlZD0hMCx3cml0YWJsZXx8Y2FsbGJhY2suY2FsbChzdHJlYW0pfSxvbmVycm9yPWZ1bmN0aW9uIG9uZXJyb3IoZXJyKXtjYWxsYmFjay5jYWxsKHN0cmVhbSxlcnIpfSxvbmNsb3NlPWZ1bmN0aW9uIG9uY2xvc2UoKXt2YXIgZXJyO3JldHVybiByZWFkYWJsZSYmIXJlYWRhYmxlRW5kZWQ/KHN0cmVhbS5fcmVhZGFibGVTdGF0ZSYmc3RyZWFtLl9yZWFkYWJsZVN0YXRlLmVuZGVkfHwoZXJyPW5ldyBFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRSksY2FsbGJhY2suY2FsbChzdHJlYW0sZXJyKSk6d3JpdGFibGUmJiF3cml0YWJsZUVuZGVkPyhzdHJlYW0uX3dyaXRhYmxlU3RhdGUmJnN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lbmRlZHx8KGVycj1uZXcgRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UpLGNhbGxiYWNrLmNhbGwoc3RyZWFtLGVycikpOnZvaWQgMH0sb25yZXF1ZXN0PWZ1bmN0aW9uIG9ucmVxdWVzdCgpe3N0cmVhbS5yZXEub24oImZpbmlzaCIsb25maW5pc2gpfTtyZXR1cm4hZnVuY3Rpb24gaXNSZXF1ZXN0KHN0cmVhbSl7cmV0dXJuIHN0cmVhbS5zZXRIZWFkZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBzdHJlYW0uYWJvcnR9KHN0cmVhbSk/d3JpdGFibGUmJiFzdHJlYW0uX3dyaXRhYmxlU3RhdGUmJihzdHJlYW0ub24oImVuZCIsb25sZWdhY3lmaW5pc2gpLHN0cmVhbS5vbigiY2xvc2UiLG9ubGVnYWN5ZmluaXNoKSk6KHN0cmVhbS5vbigiY29tcGxldGUiLG9uZmluaXNoKSxzdHJlYW0ub24oImFib3J0IixvbmNsb3NlKSxzdHJlYW0ucmVxP29ucmVxdWVzdCgpOnN0cmVhbS5vbigicmVxdWVzdCIsb25yZXF1ZXN0KSksc3RyZWFtLm9uKCJlbmQiLG9uZW5kKSxzdHJlYW0ub24oImZpbmlzaCIsb25maW5pc2gpLCExIT09b3B0cy5lcnJvciYmc3RyZWFtLm9uKCJlcnJvciIsb25lcnJvciksc3RyZWFtLm9uKCJjbG9zZSIsb25jbG9zZSksZnVuY3Rpb24oKXtzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoImNvbXBsZXRlIixvbmZpbmlzaCksc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCJhYm9ydCIsb25jbG9zZSksc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCJyZXF1ZXN0IixvbnJlcXVlc3QpLHN0cmVhbS5yZXEmJnN0cmVhbS5yZXEucmVtb3ZlTGlzdGVuZXIoImZpbmlzaCIsb25maW5pc2gpLHN0cmVhbS5yZW1vdmVMaXN0ZW5lcigiZW5kIixvbmxlZ2FjeWZpbmlzaCksc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsb25sZWdhY3lmaW5pc2gpLHN0cmVhbS5yZW1vdmVMaXN0ZW5lcigiZmluaXNoIixvbmZpbmlzaCksc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCJlbmQiLG9uZW5kKSxzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoImVycm9yIixvbmVycm9yKSxzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixvbmNsb3NlKX19fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZnJvbS1icm93c2VyLmpzIihtb2R1bGUpe21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJSZWFkYWJsZS5mcm9tIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJyb3dzZXIiKX19LCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9waXBlbGluZS5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIGVvczt2YXIgX3JlcXVpcmUkY29kZXM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vZXJyb3JzLWJyb3dzZXIuanMiKS5GLEVSUl9NSVNTSU5HX0FSR1M9X3JlcXVpcmUkY29kZXMuRVJSX01JU1NJTkdfQVJHUyxFUlJfU1RSRUFNX0RFU1RST1lFRD1fcmVxdWlyZSRjb2Rlcy5FUlJfU1RSRUFNX0RFU1RST1lFRDtmdW5jdGlvbiBub29wKGVycil7aWYoZXJyKXRocm93IGVycn1mdW5jdGlvbiBjYWxsKGZuKXtmbigpfWZ1bmN0aW9uIHBpcGUoZnJvbSx0byl7cmV0dXJuIGZyb20ucGlwZSh0byl9bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24gcGlwZWxpbmUoKXtmb3IodmFyIF9sZW49YXJndW1lbnRzLmxlbmd0aCxzdHJlYW1zPW5ldyBBcnJheShfbGVuKSxfa2V5PTA7X2tleTxfbGVuO19rZXkrKylzdHJlYW1zW19rZXldPWFyZ3VtZW50c1tfa2V5XTt2YXIgZXJyb3IsY2FsbGJhY2s9ZnVuY3Rpb24gcG9wQ2FsbGJhY2soc3RyZWFtcyl7cmV0dXJuIHN0cmVhbXMubGVuZ3RoPyJmdW5jdGlvbiIhPXR5cGVvZiBzdHJlYW1zW3N0cmVhbXMubGVuZ3RoLTFdP25vb3A6c3RyZWFtcy5wb3AoKTpub29wfShzdHJlYW1zKTtpZihBcnJheS5pc0FycmF5KHN0cmVhbXNbMF0pJiYoc3RyZWFtcz1zdHJlYW1zWzBdKSxzdHJlYW1zLmxlbmd0aDwyKXRocm93IG5ldyBFUlJfTUlTU0lOR19BUkdTKCJzdHJlYW1zIik7dmFyIGRlc3Ryb3lzPXN0cmVhbXMubWFwKGZ1bmN0aW9uKHN0cmVhbSxpKXt2YXIgcmVhZGluZz1pPHN0cmVhbXMubGVuZ3RoLTE7cmV0dXJuIGZ1bmN0aW9uIGRlc3Ryb3llcihzdHJlYW0scmVhZGluZyx3cml0aW5nLGNhbGxiYWNrKXtjYWxsYmFjaz1mdW5jdGlvbiBvbmNlKGNhbGxiYWNrKXt2YXIgY2FsbGVkPSExO3JldHVybiBmdW5jdGlvbigpe2NhbGxlZHx8KGNhbGxlZD0hMCxjYWxsYmFjay5hcHBseSh2b2lkIDAsYXJndW1lbnRzKSl9fShjYWxsYmFjayk7dmFyIGNsb3NlZD0hMTtzdHJlYW0ub24oImNsb3NlIixmdW5jdGlvbigpe2Nsb3NlZD0hMH0pLHZvaWQgMD09PWVvcyYmKGVvcz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9lbmQtb2Ytc3RyZWFtLmpzIikpLGVvcyhzdHJlYW0se3JlYWRhYmxlOnJlYWRpbmcsd3JpdGFibGU6d3JpdGluZ30sZnVuY3Rpb24oZXJyKXtpZihlcnIpcmV0dXJuIGNhbGxiYWNrKGVycik7Y2xvc2VkPSEwLGNhbGxiYWNrKCl9KTt2YXIgZGVzdHJveWVkPSExO3JldHVybiBmdW5jdGlvbihlcnIpe2lmKCFjbG9zZWQmJiFkZXN0cm95ZWQpcmV0dXJuIGRlc3Ryb3llZD0hMCxmdW5jdGlvbiBpc1JlcXVlc3Qoc3RyZWFtKXtyZXR1cm4gc3RyZWFtLnNldEhlYWRlciYmImZ1bmN0aW9uIj09dHlwZW9mIHN0cmVhbS5hYm9ydH0oc3RyZWFtKT9zdHJlYW0uYWJvcnQoKToiZnVuY3Rpb24iPT10eXBlb2Ygc3RyZWFtLmRlc3Ryb3k/c3RyZWFtLmRlc3Ryb3koKTp2b2lkIGNhbGxiYWNrKGVycnx8bmV3IEVSUl9TVFJFQU1fREVTVFJPWUVEKCJwaXBlIikpfX0oc3RyZWFtLHJlYWRpbmcsaT4wLGZ1bmN0aW9uKGVycil7ZXJyb3J8fChlcnJvcj1lcnIpLGVyciYmZGVzdHJveXMuZm9yRWFjaChjYWxsKSxyZWFkaW5nfHwoZGVzdHJveXMuZm9yRWFjaChjYWxsKSxjYWxsYmFjayhlcnJvcikpfSl9KTtyZXR1cm4gc3RyZWFtcy5yZWR1Y2UocGlwZSl9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvc3RhdGUuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBFUlJfSU5WQUxJRF9PUFRfVkFMVUU9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vZXJyb3JzLWJyb3dzZXIuanMiKS5GLkVSUl9JTlZBTElEX09QVF9WQUxVRTttb2R1bGUuZXhwb3J0cz17Z2V0SGlnaFdhdGVyTWFyazpmdW5jdGlvbiBnZXRIaWdoV2F0ZXJNYXJrKHN0YXRlLG9wdGlvbnMsZHVwbGV4S2V5LGlzRHVwbGV4KXt2YXIgaHdtPWZ1bmN0aW9uIGhpZ2hXYXRlck1hcmtGcm9tKG9wdGlvbnMsaXNEdXBsZXgsZHVwbGV4S2V5KXtyZXR1cm4gbnVsbCE9b3B0aW9ucy5oaWdoV2F0ZXJNYXJrP29wdGlvbnMuaGlnaFdhdGVyTWFyazppc0R1cGxleD9vcHRpb25zW2R1cGxleEtleV06bnVsbH0ob3B0aW9ucyxpc0R1cGxleCxkdXBsZXhLZXkpO2lmKG51bGwhPWh3bSl7aWYoIWlzRmluaXRlKGh3bSl8fE1hdGguZmxvb3IoaHdtKSE9PWh3bXx8aHdtPDApdGhyb3cgbmV3IEVSUl9JTlZBTElEX09QVF9WQUxVRShpc0R1cGxleD9kdXBsZXhLZXk6ImhpZ2hXYXRlck1hcmsiLGh3bSk7cmV0dXJuIE1hdGguZmxvb3IoaHdtKX1yZXR1cm4gc3RhdGUub2JqZWN0TW9kZT8xNjoxNjM4NH19fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtLWJyb3dzZXIuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7bW9kdWxlLmV4cG9ydHM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanMiKS5FdmVudEVtaXR0ZXJ9LCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvaW5kZXguanMiKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7dmFyIENsaWVudFJlcXVlc3Q9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL2xpYi9yZXF1ZXN0LmpzIikscmVzcG9uc2U9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL2xpYi9yZXNwb25zZS5qcyIpLGV4dGVuZD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMveHRlbmQvaW1tdXRhYmxlLmpzIiksc3RhdHVzQ29kZXM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2J1aWx0aW4tc3RhdHVzLWNvZGVzL2Jyb3dzZXIuanMiKSx1cmw9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL25vZGUtc3RkbGliLWJyb3dzZXIvY2pzL3Byb3h5L3VybC5qcyIpLGh0dHA9ZXhwb3J0cztodHRwLnJlcXVlc3Q9ZnVuY3Rpb24ob3B0cyxjYil7b3B0cz0ic3RyaW5nIj09dHlwZW9mIG9wdHM/dXJsLnBhcnNlKG9wdHMpOmV4dGVuZChvcHRzKTt2YXIgZGVmYXVsdFByb3RvY29sPS0xPT09X193ZWJwYWNrX3JlcXVpcmVfXy5nLmxvY2F0aW9uLnByb3RvY29sLnNlYXJjaCgvXmh0dHBzPzokLyk/Imh0dHA6IjoiIixwcm90b2NvbD1vcHRzLnByb3RvY29sfHxkZWZhdWx0UHJvdG9jb2wsaG9zdD1vcHRzLmhvc3RuYW1lfHxvcHRzLmhvc3QscG9ydD1vcHRzLnBvcnQscGF0aD1vcHRzLnBhdGh8fCIvIjtob3N0JiYtMSE9PWhvc3QuaW5kZXhPZigiOiIpJiYoaG9zdD0iWyIraG9zdCsiXSIpLG9wdHMudXJsPShob3N0P3Byb3RvY29sKyIvLyIraG9zdDoiIikrKHBvcnQ/IjoiK3BvcnQ6IiIpK3BhdGgsb3B0cy5tZXRob2Q9KG9wdHMubWV0aG9kfHwiR0VUIikudG9VcHBlckNhc2UoKSxvcHRzLmhlYWRlcnM9b3B0cy5oZWFkZXJzfHx7fTt2YXIgcmVxPW5ldyBDbGllbnRSZXF1ZXN0KG9wdHMpO3JldHVybiBjYiYmcmVxLm9uKCJyZXNwb25zZSIsY2IpLHJlcX0saHR0cC5nZXQ9ZnVuY3Rpb24gZ2V0KG9wdHMsY2Ipe3ZhciByZXE9aHR0cC5yZXF1ZXN0KG9wdHMsY2IpO3JldHVybiByZXEuZW5kKCkscmVxfSxodHRwLkNsaWVudFJlcXVlc3Q9Q2xpZW50UmVxdWVzdCxodHRwLkluY29taW5nTWVzc2FnZT1yZXNwb25zZS5JbmNvbWluZ01lc3NhZ2UsaHR0cC5BZ2VudD1mdW5jdGlvbigpe30saHR0cC5BZ2VudC5kZWZhdWx0TWF4U29ja2V0cz00LGh0dHAuZ2xvYmFsQWdlbnQ9bmV3IGh0dHAuQWdlbnQsaHR0cC5TVEFUVVNfQ09ERVM9c3RhdHVzQ29kZXMsaHR0cC5NRVRIT0RTPVsiQ0hFQ0tPVVQiLCJDT05ORUNUIiwiQ09QWSIsIkRFTEVURSIsIkdFVCIsIkhFQUQiLCJMT0NLIiwiTS1TRUFSQ0giLCJNRVJHRSIsIk1LQUNUSVZJVFkiLCJNS0NPTCIsIk1PVkUiLCJOT1RJRlkiLCJPUFRJT05TIiwiUEFUQ0giLCJQT1NUIiwiUFJPUEZJTkQiLCJQUk9QUEFUQ0giLCJQVVJHRSIsIlBVVCIsIlJFUE9SVCIsIlNFQVJDSCIsIlNVQlNDUklCRSIsIlRSQUNFIiwiVU5MT0NLIiwiVU5TVUJTQ1JJQkUiXX0sIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9saWIvY2FwYWJpbGl0eS5qcyIoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXt2YXIgeGhyO2Z1bmN0aW9uIGdldFhIUigpe2lmKHZvaWQgMCE9PXhocilyZXR1cm4geGhyO2lmKF9fd2VicGFja19yZXF1aXJlX18uZy5YTUxIdHRwUmVxdWVzdCl7eGhyPW5ldyBfX3dlYnBhY2tfcmVxdWlyZV9fLmcuWE1MSHR0cFJlcXVlc3Q7dHJ5e3hoci5vcGVuKCJHRVQiLF9fd2VicGFja19yZXF1aXJlX18uZy5YRG9tYWluUmVxdWVzdD8iLyI6Imh0dHBzOi8vZXhhbXBsZS5jb20iKX1jYXRjaChlKXt4aHI9bnVsbH19ZWxzZSB4aHI9bnVsbDtyZXR1cm4geGhyfWZ1bmN0aW9uIGNoZWNrVHlwZVN1cHBvcnQodHlwZSl7dmFyIHhocj1nZXRYSFIoKTtpZigheGhyKXJldHVybiExO3RyeXtyZXR1cm4geGhyLnJlc3BvbnNlVHlwZT10eXBlLHhoci5yZXNwb25zZVR5cGU9PT10eXBlfWNhdGNoKGUpe31yZXR1cm4hMX1mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdmFsdWV9ZXhwb3J0cy5mZXRjaD1pc0Z1bmN0aW9uKF9fd2VicGFja19yZXF1aXJlX18uZy5mZXRjaCkmJmlzRnVuY3Rpb24oX193ZWJwYWNrX3JlcXVpcmVfXy5nLlJlYWRhYmxlU3RyZWFtKSxleHBvcnRzLndyaXRhYmxlU3RyZWFtPWlzRnVuY3Rpb24oX193ZWJwYWNrX3JlcXVpcmVfXy5nLldyaXRhYmxlU3RyZWFtKSxleHBvcnRzLmFib3J0Q29udHJvbGxlcj1pc0Z1bmN0aW9uKF9fd2VicGFja19yZXF1aXJlX18uZy5BYm9ydENvbnRyb2xsZXIpLGV4cG9ydHMuYXJyYXlidWZmZXI9ZXhwb3J0cy5mZXRjaHx8Y2hlY2tUeXBlU3VwcG9ydCgiYXJyYXlidWZmZXIiKSxleHBvcnRzLm1zc3RyZWFtPSFleHBvcnRzLmZldGNoJiZjaGVja1R5cGVTdXBwb3J0KCJtcy1zdHJlYW0iKSxleHBvcnRzLm1vemNodW5rZWRhcnJheWJ1ZmZlcj0hZXhwb3J0cy5mZXRjaCYmY2hlY2tUeXBlU3VwcG9ydCgibW96LWNodW5rZWQtYXJyYXlidWZmZXIiKSxleHBvcnRzLm92ZXJyaWRlTWltZVR5cGU9ZXhwb3J0cy5mZXRjaHx8ISFnZXRYSFIoKSYmaXNGdW5jdGlvbihnZXRYSFIoKS5vdmVycmlkZU1pbWVUeXBlKSx4aHI9bnVsbH0sIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9saWIvcmVxdWVzdC5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXt2YXIgQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiKSxwcm9jZXNzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9ub2RlLXN0ZGxpYi1icm93c2VyL2Nqcy9wcm94eS9wcm9jZXNzLmpzIiksY2FwYWJpbGl0eT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbGliL2NhcGFiaWxpdHkuanMiKSxpbmhlcml0cz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIpLHJlc3BvbnNlPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9saWIvcmVzcG9uc2UuanMiKSxzdHJlYW09X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vcmVhZGFibGUtYnJvd3Nlci5qcyIpLEluY29taW5nTWVzc2FnZT1yZXNwb25zZS5JbmNvbWluZ01lc3NhZ2UsclN0YXRlcz1yZXNwb25zZS5yZWFkeVN0YXRlczt2YXIgQ2xpZW50UmVxdWVzdD1tb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihvcHRzKXt2YXIgcHJlZmVyQmluYXJ5LHNlbGY9dGhpcztzdHJlYW0uV3JpdGFibGUuY2FsbChzZWxmKSxzZWxmLl9vcHRzPW9wdHMsc2VsZi5fYm9keT1bXSxzZWxmLl9oZWFkZXJzPXt9LG9wdHMuYXV0aCYmc2VsZi5zZXRIZWFkZXIoIkF1dGhvcml6YXRpb24iLCJCYXNpYyAiK0J1ZmZlci5mcm9tKG9wdHMuYXV0aCkudG9TdHJpbmcoImJhc2U2NCIpKSxPYmplY3Qua2V5cyhvcHRzLmhlYWRlcnMpLmZvckVhY2goZnVuY3Rpb24obmFtZSl7c2VsZi5zZXRIZWFkZXIobmFtZSxvcHRzLmhlYWRlcnNbbmFtZV0pfSk7dmFyIHVzZUZldGNoPSEwO2lmKCJkaXNhYmxlLWZldGNoIj09PW9wdHMubW9kZXx8InJlcXVlc3RUaW1lb3V0ImluIG9wdHMmJiFjYXBhYmlsaXR5LmFib3J0Q29udHJvbGxlcil1c2VGZXRjaD0hMSxwcmVmZXJCaW5hcnk9ITA7ZWxzZSBpZigicHJlZmVyLXN0cmVhbWluZyI9PT1vcHRzLm1vZGUpcHJlZmVyQmluYXJ5PSExO2Vsc2UgaWYoImFsbG93LXdyb25nLWNvbnRlbnQtdHlwZSI9PT1vcHRzLm1vZGUpcHJlZmVyQmluYXJ5PSFjYXBhYmlsaXR5Lm92ZXJyaWRlTWltZVR5cGU7ZWxzZXtpZihvcHRzLm1vZGUmJiJkZWZhdWx0IiE9PW9wdHMubW9kZSYmInByZWZlci1mYXN0IiE9PW9wdHMubW9kZSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgdmFsdWUgZm9yIG9wdHMubW9kZSIpO3ByZWZlckJpbmFyeT0hMH1zZWxmLl9tb2RlPWZ1bmN0aW9uIGRlY2lkZU1vZGUocHJlZmVyQmluYXJ5LHVzZUZldGNoKXtyZXR1cm4gY2FwYWJpbGl0eS5mZXRjaCYmdXNlRmV0Y2g/ImZldGNoIjpjYXBhYmlsaXR5Lm1vemNodW5rZWRhcnJheWJ1ZmZlcj8ibW96LWNodW5rZWQtYXJyYXlidWZmZXIiOmNhcGFiaWxpdHkubXNzdHJlYW0/Im1zLXN0cmVhbSI6Y2FwYWJpbGl0eS5hcnJheWJ1ZmZlciYmcHJlZmVyQmluYXJ5PyJhcnJheWJ1ZmZlciI6InRleHQifShwcmVmZXJCaW5hcnksdXNlRmV0Y2gpLHNlbGYuX2ZldGNoVGltZXI9bnVsbCxzZWxmLl9zb2NrZXRUaW1lb3V0PW51bGwsc2VsZi5fc29ja2V0VGltZXI9bnVsbCxzZWxmLm9uKCJmaW5pc2giLGZ1bmN0aW9uKCl7c2VsZi5fb25GaW5pc2goKX0pfTtpbmhlcml0cyhDbGllbnRSZXF1ZXN0LHN0cmVhbS5Xcml0YWJsZSksQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuc2V0SGVhZGVyPWZ1bmN0aW9uKG5hbWUsdmFsdWUpe3ZhciBsb3dlck5hbWU9bmFtZS50b0xvd2VyQ2FzZSgpOy0xPT09dW5zYWZlSGVhZGVycy5pbmRleE9mKGxvd2VyTmFtZSkmJih0aGlzLl9oZWFkZXJzW2xvd2VyTmFtZV09e25hbWUsdmFsdWV9KX0sQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuZ2V0SGVhZGVyPWZ1bmN0aW9uKG5hbWUpe3ZhciBoZWFkZXI9dGhpcy5faGVhZGVyc1tuYW1lLnRvTG93ZXJDYXNlKCldO3JldHVybiBoZWFkZXI/aGVhZGVyLnZhbHVlOm51bGx9LENsaWVudFJlcXVlc3QucHJvdG90eXBlLnJlbW92ZUhlYWRlcj1mdW5jdGlvbihuYW1lKXtkZWxldGUgdGhpcy5faGVhZGVyc1tuYW1lLnRvTG93ZXJDYXNlKCldfSxDbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5fb25GaW5pc2g9ZnVuY3Rpb24oKXt2YXIgc2VsZj10aGlzO2lmKCFzZWxmLl9kZXN0cm95ZWQpe3ZhciBvcHRzPXNlbGYuX29wdHM7InRpbWVvdXQiaW4gb3B0cyYmMCE9PW9wdHMudGltZW91dCYmc2VsZi5zZXRUaW1lb3V0KG9wdHMudGltZW91dCk7dmFyIGhlYWRlcnNPYmo9c2VsZi5faGVhZGVycyxib2R5PW51bGw7IkdFVCIhPT1vcHRzLm1ldGhvZCYmIkhFQUQiIT09b3B0cy5tZXRob2QmJihib2R5PW5ldyBCbG9iKHNlbGYuX2JvZHkse3R5cGU6KGhlYWRlcnNPYmpbImNvbnRlbnQtdHlwZSJdfHx7fSkudmFsdWV8fCIifSkpO3ZhciBoZWFkZXJzTGlzdD1bXTtpZihPYmplY3Qua2V5cyhoZWFkZXJzT2JqKS5mb3JFYWNoKGZ1bmN0aW9uKGtleU5hbWUpe3ZhciBuYW1lPWhlYWRlcnNPYmpba2V5TmFtZV0ubmFtZSx2YWx1ZT1oZWFkZXJzT2JqW2tleU5hbWVdLnZhbHVlO0FycmF5LmlzQXJyYXkodmFsdWUpP3ZhbHVlLmZvckVhY2goZnVuY3Rpb24odil7aGVhZGVyc0xpc3QucHVzaChbbmFtZSx2XSl9KTpoZWFkZXJzTGlzdC5wdXNoKFtuYW1lLHZhbHVlXSl9KSwiZmV0Y2giPT09c2VsZi5fbW9kZSl7dmFyIHNpZ25hbD1udWxsO2lmKGNhcGFiaWxpdHkuYWJvcnRDb250cm9sbGVyKXt2YXIgY29udHJvbGxlcj1uZXcgQWJvcnRDb250cm9sbGVyO3NpZ25hbD1jb250cm9sbGVyLnNpZ25hbCxzZWxmLl9mZXRjaEFib3J0Q29udHJvbGxlcj1jb250cm9sbGVyLCJyZXF1ZXN0VGltZW91dCJpbiBvcHRzJiYwIT09b3B0cy5yZXF1ZXN0VGltZW91dCYmKHNlbGYuX2ZldGNoVGltZXI9X193ZWJwYWNrX3JlcXVpcmVfXy5nLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtzZWxmLmVtaXQoInJlcXVlc3RUaW1lb3V0Iiksc2VsZi5fZmV0Y2hBYm9ydENvbnRyb2xsZXImJnNlbGYuX2ZldGNoQWJvcnRDb250cm9sbGVyLmFib3J0KCl9LG9wdHMucmVxdWVzdFRpbWVvdXQpKX1fX3dlYnBhY2tfcmVxdWlyZV9fLmcuZmV0Y2goc2VsZi5fb3B0cy51cmwse21ldGhvZDpzZWxmLl9vcHRzLm1ldGhvZCxoZWFkZXJzOmhlYWRlcnNMaXN0LGJvZHk6Ym9keXx8dm9pZCAwLG1vZGU6ImNvcnMiLGNyZWRlbnRpYWxzOm9wdHMud2l0aENyZWRlbnRpYWxzPyJpbmNsdWRlIjoic2FtZS1vcmlnaW4iLHNpZ25hbH0pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2Upe3NlbGYuX2ZldGNoUmVzcG9uc2U9cmVzcG9uc2Usc2VsZi5fcmVzZXRUaW1lcnMoITEpLHNlbGYuX2Nvbm5lY3QoKX0sZnVuY3Rpb24ocmVhc29uKXtzZWxmLl9yZXNldFRpbWVycyghMCksc2VsZi5fZGVzdHJveWVkfHxzZWxmLmVtaXQoImVycm9yIixyZWFzb24pfSl9ZWxzZXt2YXIgeGhyPXNlbGYuX3hocj1uZXcgX193ZWJwYWNrX3JlcXVpcmVfXy5nLlhNTEh0dHBSZXF1ZXN0O3RyeXt4aHIub3BlbihzZWxmLl9vcHRzLm1ldGhvZCxzZWxmLl9vcHRzLnVybCwhMCl9Y2F0Y2goZXJyKXtyZXR1cm4gdm9pZCBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCl7c2VsZi5lbWl0KCJlcnJvciIsZXJyKX0pfSJyZXNwb25zZVR5cGUiaW4geGhyJiYoeGhyLnJlc3BvbnNlVHlwZT1zZWxmLl9tb2RlKSwid2l0aENyZWRlbnRpYWxzImluIHhociYmKHhoci53aXRoQ3JlZGVudGlhbHM9ISFvcHRzLndpdGhDcmVkZW50aWFscyksInRleHQiPT09c2VsZi5fbW9kZSYmIm92ZXJyaWRlTWltZVR5cGUiaW4geGhyJiZ4aHIub3ZlcnJpZGVNaW1lVHlwZSgidGV4dC9wbGFpbjsgY2hhcnNldD14LXVzZXItZGVmaW5lZCIpLCJyZXF1ZXN0VGltZW91dCJpbiBvcHRzJiYoeGhyLnRpbWVvdXQ9b3B0cy5yZXF1ZXN0VGltZW91dCx4aHIub250aW1lb3V0PWZ1bmN0aW9uKCl7c2VsZi5lbWl0KCJyZXF1ZXN0VGltZW91dCIpfSksaGVhZGVyc0xpc3QuZm9yRWFjaChmdW5jdGlvbihoZWFkZXIpe3hoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlclswXSxoZWFkZXJbMV0pfSksc2VsZi5fcmVzcG9uc2U9bnVsbCx4aHIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7c3dpdGNoKHhoci5yZWFkeVN0YXRlKXtjYXNlIHJTdGF0ZXMuTE9BRElORzpjYXNlIHJTdGF0ZXMuRE9ORTpzZWxmLl9vblhIUlByb2dyZXNzKCl9fSwibW96LWNodW5rZWQtYXJyYXlidWZmZXIiPT09c2VsZi5fbW9kZSYmKHhoci5vbnByb2dyZXNzPWZ1bmN0aW9uKCl7c2VsZi5fb25YSFJQcm9ncmVzcygpfSkseGhyLm9uZXJyb3I9ZnVuY3Rpb24oKXtzZWxmLl9kZXN0cm95ZWR8fChzZWxmLl9yZXNldFRpbWVycyghMCksc2VsZi5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJYSFIgZXJyb3IiKSkpfTt0cnl7eGhyLnNlbmQoYm9keSl9Y2F0Y2goZXJyKXtyZXR1cm4gdm9pZCBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCl7c2VsZi5lbWl0KCJlcnJvciIsZXJyKX0pfX19fSxDbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5fb25YSFJQcm9ncmVzcz1mdW5jdGlvbigpe3RoaXMuX3Jlc2V0VGltZXJzKCExKSxmdW5jdGlvbiBzdGF0dXNWYWxpZCh4aHIpe3RyeXt2YXIgc3RhdHVzPXhoci5zdGF0dXM7cmV0dXJuIG51bGwhPT1zdGF0dXMmJjAhPT1zdGF0dXN9Y2F0Y2goZSl7cmV0dXJuITF9fSh0aGlzLl94aHIpJiYhdGhpcy5fZGVzdHJveWVkJiYodGhpcy5fcmVzcG9uc2V8fHRoaXMuX2Nvbm5lY3QoKSx0aGlzLl9yZXNwb25zZS5fb25YSFJQcm9ncmVzcyh0aGlzLl9yZXNldFRpbWVycy5iaW5kKHRoaXMpKSl9LENsaWVudFJlcXVlc3QucHJvdG90eXBlLl9jb25uZWN0PWZ1bmN0aW9uKCl7dmFyIHNlbGY9dGhpcztzZWxmLl9kZXN0cm95ZWR8fChzZWxmLl9yZXNwb25zZT1uZXcgSW5jb21pbmdNZXNzYWdlKHNlbGYuX3hocixzZWxmLl9mZXRjaFJlc3BvbnNlLHNlbGYuX21vZGUsc2VsZi5fcmVzZXRUaW1lcnMuYmluZChzZWxmKSksc2VsZi5fcmVzcG9uc2Uub24oImVycm9yIixmdW5jdGlvbihlcnIpe3NlbGYuZW1pdCgiZXJyb3IiLGVycil9KSxzZWxmLmVtaXQoInJlc3BvbnNlIixzZWxmLl9yZXNwb25zZSkpfSxDbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24oY2h1bmssZW5jb2RpbmcsY2Ipe3RoaXMuX2JvZHkucHVzaChjaHVuayksY2IoKX0sQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuX3Jlc2V0VGltZXJzPWZ1bmN0aW9uKGRvbmUpe3ZhciBzZWxmPXRoaXM7X193ZWJwYWNrX3JlcXVpcmVfXy5nLmNsZWFyVGltZW91dChzZWxmLl9zb2NrZXRUaW1lciksc2VsZi5fc29ja2V0VGltZXI9bnVsbCxkb25lPyhfX3dlYnBhY2tfcmVxdWlyZV9fLmcuY2xlYXJUaW1lb3V0KHNlbGYuX2ZldGNoVGltZXIpLHNlbGYuX2ZldGNoVGltZXI9bnVsbCk6c2VsZi5fc29ja2V0VGltZW91dCYmKHNlbGYuX3NvY2tldFRpbWVyPV9fd2VicGFja19yZXF1aXJlX18uZy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2VsZi5lbWl0KCJ0aW1lb3V0Iil9LHNlbGYuX3NvY2tldFRpbWVvdXQpKX0sQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuYWJvcnQ9Q2xpZW50UmVxdWVzdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbihlcnIpe3RoaXMuX2Rlc3Ryb3llZD0hMCx0aGlzLl9yZXNldFRpbWVycyghMCksdGhpcy5fcmVzcG9uc2UmJih0aGlzLl9yZXNwb25zZS5fZGVzdHJveWVkPSEwKSx0aGlzLl94aHI/dGhpcy5feGhyLmFib3J0KCk6dGhpcy5fZmV0Y2hBYm9ydENvbnRyb2xsZXImJnRoaXMuX2ZldGNoQWJvcnRDb250cm9sbGVyLmFib3J0KCksZXJyJiZ0aGlzLmVtaXQoImVycm9yIixlcnIpfSxDbGllbnRSZXF1ZXN0LnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24oZGF0YSxlbmNvZGluZyxjYil7ImZ1bmN0aW9uIj09dHlwZW9mIGRhdGEmJihjYj1kYXRhLGRhdGE9dm9pZCAwKSxzdHJlYW0uV3JpdGFibGUucHJvdG90eXBlLmVuZC5jYWxsKHRoaXMsZGF0YSxlbmNvZGluZyxjYil9LENsaWVudFJlcXVlc3QucHJvdG90eXBlLnNldFRpbWVvdXQ9ZnVuY3Rpb24odGltZW91dCxjYil7Y2ImJnRoaXMub25jZSgidGltZW91dCIsY2IpLHRoaXMuX3NvY2tldFRpbWVvdXQ9dGltZW91dCx0aGlzLl9yZXNldFRpbWVycyghMSl9LENsaWVudFJlcXVlc3QucHJvdG90eXBlLmZsdXNoSGVhZGVycz1mdW5jdGlvbigpe30sQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuc2V0Tm9EZWxheT1mdW5jdGlvbigpe30sQ2xpZW50UmVxdWVzdC5wcm90b3R5cGUuc2V0U29ja2V0S2VlcEFsaXZlPWZ1bmN0aW9uKCl7fTt2YXIgdW5zYWZlSGVhZGVycz1bImFjY2VwdC1jaGFyc2V0IiwiYWNjZXB0LWVuY29kaW5nIiwiYWNjZXNzLWNvbnRyb2wtcmVxdWVzdC1oZWFkZXJzIiwiYWNjZXNzLWNvbnRyb2wtcmVxdWVzdC1tZXRob2QiLCJjb25uZWN0aW9uIiwiY29udGVudC1sZW5ndGgiLCJjb29raWUiLCJjb29raWUyIiwiZGF0ZSIsImRudCIsImV4cGVjdCIsImhvc3QiLCJrZWVwLWFsaXZlIiwib3JpZ2luIiwicmVmZXJlciIsInRlIiwidHJhaWxlciIsInRyYW5zZmVyLWVuY29kaW5nIiwidXBncmFkZSIsInZpYSJdfSwiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL2xpYi9yZXNwb25zZS5qcyIoX191bnVzZWRfd2VicGFja19tb2R1bGUsZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXt2YXIgcHJvY2Vzcz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbm9kZS1zdGRsaWItYnJvd3Nlci9janMvcHJveHkvcHJvY2Vzcy5qcyIpLEJ1ZmZlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzIiksY2FwYWJpbGl0eT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbGliL2NhcGFiaWxpdHkuanMiKSxpbmhlcml0cz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIpLHN0cmVhbT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9yZWFkYWJsZS1icm93c2VyLmpzIiksclN0YXRlcz1leHBvcnRzLnJlYWR5U3RhdGVzPXtVTlNFTlQ6MCxPUEVORUQ6MSxIRUFERVJTX1JFQ0VJVkVEOjIsTE9BRElORzozLERPTkU6NH0sSW5jb21pbmdNZXNzYWdlPWV4cG9ydHMuSW5jb21pbmdNZXNzYWdlPWZ1bmN0aW9uKHhocixyZXNwb25zZSxtb2RlLHJlc2V0VGltZXJzKXt2YXIgc2VsZj10aGlzO2lmKHN0cmVhbS5SZWFkYWJsZS5jYWxsKHNlbGYpLHNlbGYuX21vZGU9bW9kZSxzZWxmLmhlYWRlcnM9e30sc2VsZi5yYXdIZWFkZXJzPVtdLHNlbGYudHJhaWxlcnM9e30sc2VsZi5yYXdUcmFpbGVycz1bXSxzZWxmLm9uKCJlbmQiLGZ1bmN0aW9uKCl7cHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpe3NlbGYuZW1pdCgiY2xvc2UiKX0pfSksImZldGNoIj09PW1vZGUpe2lmKHNlbGYuX2ZldGNoUmVzcG9uc2U9cmVzcG9uc2Usc2VsZi51cmw9cmVzcG9uc2UudXJsLHNlbGYuc3RhdHVzQ29kZT1yZXNwb25zZS5zdGF0dXMsc2VsZi5zdGF0dXNNZXNzYWdlPXJlc3BvbnNlLnN0YXR1c1RleHQscmVzcG9uc2UuaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKGhlYWRlcixrZXkpe3NlbGYuaGVhZGVyc1trZXkudG9Mb3dlckNhc2UoKV09aGVhZGVyLHNlbGYucmF3SGVhZGVycy5wdXNoKGtleSxoZWFkZXIpfSksY2FwYWJpbGl0eS53cml0YWJsZVN0cmVhbSl7dmFyIHdyaXRhYmxlPW5ldyBXcml0YWJsZVN0cmVhbSh7d3JpdGU6ZnVuY3Rpb24oY2h1bmspe3JldHVybiByZXNldFRpbWVycyghMSksbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSxyZWplY3Qpe3NlbGYuX2Rlc3Ryb3llZD9yZWplY3QoKTpzZWxmLnB1c2goQnVmZmVyLmZyb20oY2h1bmspKT9yZXNvbHZlKCk6c2VsZi5fcmVzdW1lRmV0Y2g9cmVzb2x2ZX0pfSxjbG9zZTpmdW5jdGlvbigpe3Jlc2V0VGltZXJzKCEwKSxzZWxmLl9kZXN0cm95ZWR8fHNlbGYucHVzaChudWxsKX0sYWJvcnQ6ZnVuY3Rpb24oZXJyKXtyZXNldFRpbWVycyghMCksc2VsZi5fZGVzdHJveWVkfHxzZWxmLmVtaXQoImVycm9yIixlcnIpfX0pO3RyeXtyZXR1cm4gdm9pZCByZXNwb25zZS5ib2R5LnBpcGVUbyh3cml0YWJsZSkuY2F0Y2goZnVuY3Rpb24oZXJyKXtyZXNldFRpbWVycyghMCksc2VsZi5fZGVzdHJveWVkfHxzZWxmLmVtaXQoImVycm9yIixlcnIpfSl9Y2F0Y2goZSl7fX12YXIgcmVhZGVyPXJlc3BvbnNlLmJvZHkuZ2V0UmVhZGVyKCk7IWZ1bmN0aW9uIHJlYWQoKXtyZWFkZXIucmVhZCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KXtzZWxmLl9kZXN0cm95ZWR8fChyZXNldFRpbWVycyhyZXN1bHQuZG9uZSkscmVzdWx0LmRvbmU/c2VsZi5wdXNoKG51bGwpOihzZWxmLnB1c2goQnVmZmVyLmZyb20ocmVzdWx0LnZhbHVlKSkscmVhZCgpKSl9KS5jYXRjaChmdW5jdGlvbihlcnIpe3Jlc2V0VGltZXJzKCEwKSxzZWxmLl9kZXN0cm95ZWR8fHNlbGYuZW1pdCgiZXJyb3IiLGVycil9KX0oKX1lbHNle2lmKHNlbGYuX3hocj14aHIsc2VsZi5fcG9zPTAsc2VsZi51cmw9eGhyLnJlc3BvbnNlVVJMLHNlbGYuc3RhdHVzQ29kZT14aHIuc3RhdHVzLHNlbGYuc3RhdHVzTWVzc2FnZT14aHIuc3RhdHVzVGV4dCx4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkuc3BsaXQoL1xyP1xuLykuZm9yRWFjaChmdW5jdGlvbihoZWFkZXIpe3ZhciBtYXRjaGVzPWhlYWRlci5tYXRjaCgvXihbXjpdKyk6XHMqKC4qKS8pO2lmKG1hdGNoZXMpe3ZhciBrZXk9bWF0Y2hlc1sxXS50b0xvd2VyQ2FzZSgpOyJzZXQtY29va2llIj09PWtleT8odm9pZCAwPT09c2VsZi5oZWFkZXJzW2tleV0mJihzZWxmLmhlYWRlcnNba2V5XT1bXSksc2VsZi5oZWFkZXJzW2tleV0ucHVzaChtYXRjaGVzWzJdKSk6dm9pZCAwIT09c2VsZi5oZWFkZXJzW2tleV0/c2VsZi5oZWFkZXJzW2tleV0rPSIsICIrbWF0Y2hlc1syXTpzZWxmLmhlYWRlcnNba2V5XT1tYXRjaGVzWzJdLHNlbGYucmF3SGVhZGVycy5wdXNoKG1hdGNoZXNbMV0sbWF0Y2hlc1syXSl9fSksc2VsZi5fY2hhcnNldD0ieC11c2VyLWRlZmluZWQiLCFjYXBhYmlsaXR5Lm92ZXJyaWRlTWltZVR5cGUpe3ZhciBtaW1lVHlwZT1zZWxmLnJhd0hlYWRlcnNbIm1pbWUtdHlwZSJdO2lmKG1pbWVUeXBlKXt2YXIgY2hhcnNldE1hdGNoPW1pbWVUeXBlLm1hdGNoKC87XHMqY2hhcnNldD0oW147XSkoO3wkKS8pO2NoYXJzZXRNYXRjaCYmKHNlbGYuX2NoYXJzZXQ9Y2hhcnNldE1hdGNoWzFdLnRvTG93ZXJDYXNlKCkpfXNlbGYuX2NoYXJzZXR8fChzZWxmLl9jaGFyc2V0PSJ1dGYtOCIpfX19O2luaGVyaXRzKEluY29taW5nTWVzc2FnZSxzdHJlYW0uUmVhZGFibGUpLEluY29taW5nTWVzc2FnZS5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24oKXt2YXIgcmVzb2x2ZT10aGlzLl9yZXN1bWVGZXRjaDtyZXNvbHZlJiYodGhpcy5fcmVzdW1lRmV0Y2g9bnVsbCxyZXNvbHZlKCkpfSxJbmNvbWluZ01lc3NhZ2UucHJvdG90eXBlLl9vblhIUlByb2dyZXNzPWZ1bmN0aW9uKHJlc2V0VGltZXJzKXt2YXIgc2VsZj10aGlzLHhocj1zZWxmLl94aHIscmVzcG9uc2U9bnVsbDtzd2l0Y2goc2VsZi5fbW9kZSl7Y2FzZSJ0ZXh0IjppZigocmVzcG9uc2U9eGhyLnJlc3BvbnNlVGV4dCkubGVuZ3RoPnNlbGYuX3Bvcyl7dmFyIG5ld0RhdGE9cmVzcG9uc2Uuc3Vic3RyKHNlbGYuX3Bvcyk7aWYoIngtdXNlci1kZWZpbmVkIj09PXNlbGYuX2NoYXJzZXQpe2Zvcih2YXIgYnVmZmVyPUJ1ZmZlci5hbGxvYyhuZXdEYXRhLmxlbmd0aCksaT0wO2k8bmV3RGF0YS5sZW5ndGg7aSsrKWJ1ZmZlcltpXT0yNTUmbmV3RGF0YS5jaGFyQ29kZUF0KGkpO3NlbGYucHVzaChidWZmZXIpfWVsc2Ugc2VsZi5wdXNoKG5ld0RhdGEsc2VsZi5fY2hhcnNldCk7c2VsZi5fcG9zPXJlc3BvbnNlLmxlbmd0aH1icmVhaztjYXNlImFycmF5YnVmZmVyIjppZih4aHIucmVhZHlTdGF0ZSE9PXJTdGF0ZXMuRE9ORXx8IXhoci5yZXNwb25zZSlicmVhaztyZXNwb25zZT14aHIucmVzcG9uc2Usc2VsZi5wdXNoKEJ1ZmZlci5mcm9tKG5ldyBVaW50OEFycmF5KHJlc3BvbnNlKSkpO2JyZWFrO2Nhc2UibW96LWNodW5rZWQtYXJyYXlidWZmZXIiOmlmKHJlc3BvbnNlPXhoci5yZXNwb25zZSx4aHIucmVhZHlTdGF0ZSE9PXJTdGF0ZXMuTE9BRElOR3x8IXJlc3BvbnNlKWJyZWFrO3NlbGYucHVzaChCdWZmZXIuZnJvbShuZXcgVWludDhBcnJheShyZXNwb25zZSkpKTticmVhaztjYXNlIm1zLXN0cmVhbSI6aWYocmVzcG9uc2U9eGhyLnJlc3BvbnNlLHhoci5yZWFkeVN0YXRlIT09clN0YXRlcy5MT0FESU5HKWJyZWFrO3ZhciByZWFkZXI9bmV3IF9fd2VicGFja19yZXF1aXJlX18uZy5NU1N0cmVhbVJlYWRlcjtyZWFkZXIub25wcm9ncmVzcz1mdW5jdGlvbigpe3JlYWRlci5yZXN1bHQuYnl0ZUxlbmd0aD5zZWxmLl9wb3MmJihzZWxmLnB1c2goQnVmZmVyLmZyb20obmV3IFVpbnQ4QXJyYXkocmVhZGVyLnJlc3VsdC5zbGljZShzZWxmLl9wb3MpKSkpLHNlbGYuX3Bvcz1yZWFkZXIucmVzdWx0LmJ5dGVMZW5ndGgpfSxyZWFkZXIub25sb2FkPWZ1bmN0aW9uKCl7cmVzZXRUaW1lcnMoITApLHNlbGYucHVzaChudWxsKX0scmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKHJlc3BvbnNlKX1zZWxmLl94aHIucmVhZHlTdGF0ZT09PXJTdGF0ZXMuRE9ORSYmIm1zLXN0cmVhbSIhPT1zZWxmLl9tb2RlJiYocmVzZXRUaW1lcnMoITApLHNlbGYucHVzaChudWxsKSl9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vZXJyb3JzLWJyb3dzZXIuanMiKG1vZHVsZSl7InVzZSBzdHJpY3QiO3ZhciBjb2Rlcz17fTtmdW5jdGlvbiBjcmVhdGVFcnJvclR5cGUoY29kZSxtZXNzYWdlLEJhc2Upe0Jhc2V8fChCYXNlPUVycm9yKTt2YXIgTm9kZUVycm9yPWZ1bmN0aW9uKF9CYXNlKXtmdW5jdGlvbiBOb2RlRXJyb3IoYXJnMSxhcmcyLGFyZzMpe3JldHVybiBfQmFzZS5jYWxsKHRoaXMsZnVuY3Rpb24gZ2V0TWVzc2FnZShhcmcxLGFyZzIsYXJnMyl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBtZXNzYWdlP21lc3NhZ2U6bWVzc2FnZShhcmcxLGFyZzIsYXJnMyl9KGFyZzEsYXJnMixhcmczKSl8fHRoaXN9cmV0dXJuIGZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlKHN1YkNsYXNzLHN1cGVyQ2xhc3Mpe3N1YkNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKSxzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3I9c3ViQ2xhc3Msc3ViQ2xhc3MuX19wcm90b19fPXN1cGVyQ2xhc3N9KE5vZGVFcnJvcixfQmFzZSksTm9kZUVycm9yfShCYXNlKTtOb2RlRXJyb3IucHJvdG90eXBlLm5hbWU9QmFzZS5uYW1lLE5vZGVFcnJvci5wcm90b3R5cGUuY29kZT1jb2RlLGNvZGVzW2NvZGVdPU5vZGVFcnJvcn1mdW5jdGlvbiBvbmVPZihleHBlY3RlZCx0aGluZyl7aWYoQXJyYXkuaXNBcnJheShleHBlY3RlZCkpe3ZhciBsZW49ZXhwZWN0ZWQubGVuZ3RoO3JldHVybiBleHBlY3RlZD1leHBlY3RlZC5tYXAoZnVuY3Rpb24oaSl7cmV0dXJuIFN0cmluZyhpKX0pLGxlbj4yPyJvbmUgb2YgIi5jb25jYXQodGhpbmcsIiAiKS5jb25jYXQoZXhwZWN0ZWQuc2xpY2UoMCxsZW4tMSkuam9pbigiLCAiKSwiLCBvciAiKStleHBlY3RlZFtsZW4tMV06Mj09PWxlbj8ib25lIG9mICIuY29uY2F0KHRoaW5nLCIgIikuY29uY2F0KGV4cGVjdGVkWzBdLCIgb3IgIikuY29uY2F0KGV4cGVjdGVkWzFdKToib2YgIi5jb25jYXQodGhpbmcsIiAiKS5jb25jYXQoZXhwZWN0ZWRbMF0pfXJldHVybiJvZiAiLmNvbmNhdCh0aGluZywiICIpLmNvbmNhdChTdHJpbmcoZXhwZWN0ZWQpKX1jcmVhdGVFcnJvclR5cGUoIkVSUl9JTlZBTElEX09QVF9WQUxVRSIsZnVuY3Rpb24obmFtZSx2YWx1ZSl7cmV0dXJuJ1RoZSB2YWx1ZSAiJyt2YWx1ZSsnIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gIicrbmFtZSsnIid9LFR5cGVFcnJvciksY3JlYXRlRXJyb3JUeXBlKCJFUlJfSU5WQUxJRF9BUkdfVFlQRSIsZnVuY3Rpb24obmFtZSxleHBlY3RlZCxhY3R1YWwpe3ZhciBkZXRlcm1pbmVyLG1zZztpZigic3RyaW5nIj09dHlwZW9mIGV4cGVjdGVkJiZmdW5jdGlvbiBzdGFydHNXaXRoKHN0cixzZWFyY2gscG9zKXtyZXR1cm4gc3RyLnN1YnN0cighcG9zfHxwb3M8MD8wOitwb3Msc2VhcmNoLmxlbmd0aCk9PT1zZWFyY2h9KGV4cGVjdGVkLCJub3QgIik/KGRldGVybWluZXI9Im11c3Qgbm90IGJlIixleHBlY3RlZD1leHBlY3RlZC5yZXBsYWNlKC9ebm90IC8sIiIpKTpkZXRlcm1pbmVyPSJtdXN0IGJlIixmdW5jdGlvbiBlbmRzV2l0aChzdHIsc2VhcmNoLHRoaXNfbGVuKXtyZXR1cm4odm9pZCAwPT09dGhpc19sZW58fHRoaXNfbGVuPnN0ci5sZW5ndGgpJiYodGhpc19sZW49c3RyLmxlbmd0aCksc3RyLnN1YnN0cmluZyh0aGlzX2xlbi1zZWFyY2gubGVuZ3RoLHRoaXNfbGVuKT09PXNlYXJjaH0obmFtZSwiIGFyZ3VtZW50IikpbXNnPSJUaGUgIi5jb25jYXQobmFtZSwiICIpLmNvbmNhdChkZXRlcm1pbmVyLCIgIikuY29uY2F0KG9uZU9mKGV4cGVjdGVkLCJ0eXBlIikpO2Vsc2V7dmFyIHR5cGU9ZnVuY3Rpb24gaW5jbHVkZXMoc3RyLHNlYXJjaCxzdGFydCl7cmV0dXJuIm51bWJlciIhPXR5cGVvZiBzdGFydCYmKHN0YXJ0PTApLCEoc3RhcnQrc2VhcmNoLmxlbmd0aD5zdHIubGVuZ3RoKSYmLTEhPT1zdHIuaW5kZXhPZihzZWFyY2gsc3RhcnQpfShuYW1lLCIuIik/InByb3BlcnR5IjoiYXJndW1lbnQiO21zZz0nVGhlICInLmNvbmNhdChuYW1lLCciICcpLmNvbmNhdCh0eXBlLCIgIikuY29uY2F0KGRldGVybWluZXIsIiAiKS5jb25jYXQob25lT2YoZXhwZWN0ZWQsInR5cGUiKSl9cmV0dXJuIG1zZys9Ii4gUmVjZWl2ZWQgdHlwZSAiLmNvbmNhdCh0eXBlb2YgYWN0dWFsKX0sVHlwZUVycm9yKSxjcmVhdGVFcnJvclR5cGUoIkVSUl9TVFJFQU1fUFVTSF9BRlRFUl9FT0YiLCJzdHJlYW0ucHVzaCgpIGFmdGVyIEVPRiIpLGNyZWF0ZUVycm9yVHlwZSgiRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQiLGZ1bmN0aW9uKG5hbWUpe3JldHVybiJUaGUgIituYW1lKyIgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZCJ9KSxjcmVhdGVFcnJvclR5cGUoIkVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFIiwiUHJlbWF0dXJlIGNsb3NlIiksY3JlYXRlRXJyb3JUeXBlKCJFUlJfU1RSRUFNX0RFU1RST1lFRCIsZnVuY3Rpb24obmFtZSl7cmV0dXJuIkNhbm5vdCBjYWxsICIrbmFtZSsiIGFmdGVyIGEgc3RyZWFtIHdhcyBkZXN0cm95ZWQifSksY3JlYXRlRXJyb3JUeXBlKCJFUlJfTVVMVElQTEVfQ0FMTEJBQ0siLCJDYWxsYmFjayBjYWxsZWQgbXVsdGlwbGUgdGltZXMiKSxjcmVhdGVFcnJvclR5cGUoIkVSUl9TVFJFQU1fQ0FOTk9UX1BJUEUiLCJDYW5ub3QgcGlwZSwgbm90IHJlYWRhYmxlIiksY3JlYXRlRXJyb3JUeXBlKCJFUlJfU1RSRUFNX1dSSVRFX0FGVEVSX0VORCIsIndyaXRlIGFmdGVyIGVuZCIpLGNyZWF0ZUVycm9yVHlwZSgiRVJSX1NUUkVBTV9OVUxMX1ZBTFVFUyIsIk1heSBub3Qgd3JpdGUgbnVsbCB2YWx1ZXMgdG8gc3RyZWFtIixUeXBlRXJyb3IpLGNyZWF0ZUVycm9yVHlwZSgiRVJSX1VOS05PV05fRU5DT0RJTkciLGZ1bmN0aW9uKGFyZyl7cmV0dXJuIlVua25vd24gZW5jb2Rpbmc6ICIrYXJnfSxUeXBlRXJyb3IpLGNyZWF0ZUVycm9yVHlwZSgiRVJSX1NUUkVBTV9VTlNISUZUX0FGVEVSX0VORF9FVkVOVCIsInN0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50IiksbW9kdWxlLmV4cG9ydHMuRj1jb2Rlc30sIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX2R1cGxleC5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIHByb2Nlc3M9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL25vZGUtc3RkbGliLWJyb3dzZXIvY2pzL3Byb3h5L3Byb2Nlc3MuanMiKSxvYmplY3RLZXlzPU9iamVjdC5rZXlzfHxmdW5jdGlvbihvYmope3ZhciBrZXlzPVtdO2Zvcih2YXIga2V5IGluIG9iailrZXlzLnB1c2goa2V5KTtyZXR1cm4ga2V5c307bW9kdWxlLmV4cG9ydHM9RHVwbGV4O3ZhciBSZWFkYWJsZT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcyIpLFdyaXRhYmxlPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzIik7X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiKShEdXBsZXgsUmVhZGFibGUpO2Zvcih2YXIga2V5cz1vYmplY3RLZXlzKFdyaXRhYmxlLnByb3RvdHlwZSksdj0wO3Y8a2V5cy5sZW5ndGg7disrKXt2YXIgbWV0aG9kPWtleXNbdl07RHVwbGV4LnByb3RvdHlwZVttZXRob2RdfHwoRHVwbGV4LnByb3RvdHlwZVttZXRob2RdPVdyaXRhYmxlLnByb3RvdHlwZVttZXRob2RdKX1mdW5jdGlvbiBEdXBsZXgob3B0aW9ucyl7aWYoISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSlyZXR1cm4gbmV3IER1cGxleChvcHRpb25zKTtSZWFkYWJsZS5jYWxsKHRoaXMsb3B0aW9ucyksV3JpdGFibGUuY2FsbCh0aGlzLG9wdGlvbnMpLHRoaXMuYWxsb3dIYWxmT3Blbj0hMCxvcHRpb25zJiYoITE9PT1vcHRpb25zLnJlYWRhYmxlJiYodGhpcy5yZWFkYWJsZT0hMSksITE9PT1vcHRpb25zLndyaXRhYmxlJiYodGhpcy53cml0YWJsZT0hMSksITE9PT1vcHRpb25zLmFsbG93SGFsZk9wZW4mJih0aGlzLmFsbG93SGFsZk9wZW49ITEsdGhpcy5vbmNlKCJlbmQiLG9uZW5kKSkpfWZ1bmN0aW9uIG9uZW5kKCl7dGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZHx8cHJvY2Vzcy5uZXh0VGljayhvbkVuZE5ULHRoaXMpfWZ1bmN0aW9uIG9uRW5kTlQoc2VsZil7c2VsZi5lbmQoKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoRHVwbGV4LnByb3RvdHlwZSwid3JpdGFibGVIaWdoV2F0ZXJNYXJrIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya319KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRHVwbGV4LnByb3RvdHlwZSwid3JpdGFibGVCdWZmZXIiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSYmdGhpcy5fd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIoKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRHVwbGV4LnByb3RvdHlwZSwid3JpdGFibGVMZW5ndGgiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5sZW5ndGh9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsImRlc3Ryb3llZCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB2b2lkIDAhPT10aGlzLl9yZWFkYWJsZVN0YXRlJiZ2b2lkIDAhPT10aGlzLl93cml0YWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQmJnRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkKX0sc2V0OmZ1bmN0aW9uIHNldCh2YWx1ZSl7dm9pZCAwIT09dGhpcy5fcmVhZGFibGVTdGF0ZSYmdm9pZCAwIT09dGhpcy5fd3JpdGFibGVTdGF0ZSYmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkPXZhbHVlLHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkPXZhbHVlKX19KX0sIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijttb2R1bGUuZXhwb3J0cz1QYXNzVGhyb3VnaDt2YXIgVHJhbnNmb3JtPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcyIpO2Z1bmN0aW9uIFBhc3NUaHJvdWdoKG9wdGlvbnMpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFBhc3NUaHJvdWdoKSlyZXR1cm4gbmV3IFBhc3NUaHJvdWdoKG9wdGlvbnMpO1RyYW5zZm9ybS5jYWxsKHRoaXMsb3B0aW9ucyl9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiKShQYXNzVGhyb3VnaCxUcmFuc2Zvcm0pLFBhc3NUaHJvdWdoLnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKGNodW5rLGVuY29kaW5nLGNiKXtjYihudWxsLGNodW5rKX19LCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIER1cGxleCxwcm9jZXNzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9ub2RlLXN0ZGxpYi1icm93c2VyL2Nqcy9wcm94eS9wcm9jZXNzLmpzIik7bW9kdWxlLmV4cG9ydHM9UmVhZGFibGUsUmVhZGFibGUuUmVhZGFibGVTdGF0ZT1SZWFkYWJsZVN0YXRlO19fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9ldmVudHMvZXZlbnRzLmpzIikuRXZlbnRFbWl0dGVyO3ZhciBFRWxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24gRUVsaXN0ZW5lckNvdW50KGVtaXR0ZXIsdHlwZSl7cmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJzKHR5cGUpLmxlbmd0aH0sU3RyZWFtPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3N0cmVhbS1icm93c2VyLmpzIiksQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiKS5CdWZmZXIsT3VyVWludDhBcnJheT0odm9pZCAwIT09X193ZWJwYWNrX3JlcXVpcmVfXy5nP19fd2VicGFja19yZXF1aXJlX18uZzoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e30pLlVpbnQ4QXJyYXl8fGZ1bmN0aW9uKCl7fTt2YXIgZGVidWcsZGVidWdVdGlsPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy91dGlsL3V0aWwuanMiKTtkZWJ1Zz1kZWJ1Z1V0aWwmJmRlYnVnVXRpbC5kZWJ1Z2xvZz9kZWJ1Z1V0aWwuZGVidWdsb2coInN0cmVhbSIpOmZ1bmN0aW9uIGRlYnVnKCl7fTt2YXIgU3RyaW5nRGVjb2RlcixjcmVhdGVSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3IsZnJvbSxCdWZmZXJMaXN0PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2J1ZmZlcl9saXN0LmpzIiksZGVzdHJveUltcGw9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZGVzdHJveS5qcyIpLGdldEhpZ2hXYXRlck1hcms9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvc3RhdGUuanMiKS5nZXRIaWdoV2F0ZXJNYXJrLF9yZXF1aXJlJGNvZGVzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2Vycm9ycy1icm93c2VyLmpzIikuRixFUlJfSU5WQUxJRF9BUkdfVFlQRT1fcmVxdWlyZSRjb2Rlcy5FUlJfSU5WQUxJRF9BUkdfVFlQRSxFUlJfU1RSRUFNX1BVU0hfQUZURVJfRU9GPV9yZXF1aXJlJGNvZGVzLkVSUl9TVFJFQU1fUFVTSF9BRlRFUl9FT0YsRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQ9X3JlcXVpcmUkY29kZXMuRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQsRVJSX1NUUkVBTV9VTlNISUZUX0FGVEVSX0VORF9FVkVOVD1fcmVxdWlyZSRjb2Rlcy5FUlJfU1RSRUFNX1VOU0hJRlRfQUZURVJfRU5EX0VWRU5UO19fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIikoUmVhZGFibGUsU3RyZWFtKTt2YXIgZXJyb3JPckRlc3Ryb3k9ZGVzdHJveUltcGwuZXJyb3JPckRlc3Ryb3ksa1Byb3h5RXZlbnRzPVsiZXJyb3IiLCJjbG9zZSIsImRlc3Ryb3kiLCJwYXVzZSIsInJlc3VtZSJdO2Z1bmN0aW9uIFJlYWRhYmxlU3RhdGUob3B0aW9ucyxzdHJlYW0saXNEdXBsZXgpe0R1cGxleD1EdXBsZXh8fF9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX2R1cGxleC5qcyIpLG9wdGlvbnM9b3B0aW9uc3x8e30sImJvb2xlYW4iIT10eXBlb2YgaXNEdXBsZXgmJihpc0R1cGxleD1zdHJlYW0gaW5zdGFuY2VvZiBEdXBsZXgpLHRoaXMub2JqZWN0TW9kZT0hIW9wdGlvbnMub2JqZWN0TW9kZSxpc0R1cGxleCYmKHRoaXMub2JqZWN0TW9kZT10aGlzLm9iamVjdE1vZGV8fCEhb3B0aW9ucy5yZWFkYWJsZU9iamVjdE1vZGUpLHRoaXMuaGlnaFdhdGVyTWFyaz1nZXRIaWdoV2F0ZXJNYXJrKHRoaXMsb3B0aW9ucywicmVhZGFibGVIaWdoV2F0ZXJNYXJrIixpc0R1cGxleCksdGhpcy5idWZmZXI9bmV3IEJ1ZmZlckxpc3QsdGhpcy5sZW5ndGg9MCx0aGlzLnBpcGVzPW51bGwsdGhpcy5waXBlc0NvdW50PTAsdGhpcy5mbG93aW5nPW51bGwsdGhpcy5lbmRlZD0hMSx0aGlzLmVuZEVtaXR0ZWQ9ITEsdGhpcy5yZWFkaW5nPSExLHRoaXMuc3luYz0hMCx0aGlzLm5lZWRSZWFkYWJsZT0hMSx0aGlzLmVtaXR0ZWRSZWFkYWJsZT0hMSx0aGlzLnJlYWRhYmxlTGlzdGVuaW5nPSExLHRoaXMucmVzdW1lU2NoZWR1bGVkPSExLHRoaXMucGF1c2VkPSEwLHRoaXMuZW1pdENsb3NlPSExIT09b3B0aW9ucy5lbWl0Q2xvc2UsdGhpcy5hdXRvRGVzdHJveT0hIW9wdGlvbnMuYXV0b0Rlc3Ryb3ksdGhpcy5kZXN0cm95ZWQ9ITEsdGhpcy5kZWZhdWx0RW5jb2Rpbmc9b3B0aW9ucy5kZWZhdWx0RW5jb2Rpbmd8fCJ1dGY4Iix0aGlzLmF3YWl0RHJhaW49MCx0aGlzLnJlYWRpbmdNb3JlPSExLHRoaXMuZGVjb2Rlcj1udWxsLHRoaXMuZW5jb2Rpbmc9bnVsbCxvcHRpb25zLmVuY29kaW5nJiYoU3RyaW5nRGVjb2Rlcnx8KFN0cmluZ0RlY29kZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmluZ19kZWNvZGVyL2xpYi9zdHJpbmdfZGVjb2Rlci5qcyIpLlN0cmluZ0RlY29kZXIpLHRoaXMuZGVjb2Rlcj1uZXcgU3RyaW5nRGVjb2RlcihvcHRpb25zLmVuY29kaW5nKSx0aGlzLmVuY29kaW5nPW9wdGlvbnMuZW5jb2RpbmcpfWZ1bmN0aW9uIFJlYWRhYmxlKG9wdGlvbnMpe2lmKER1cGxleD1EdXBsZXh8fF9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX2R1cGxleC5qcyIpLCEodGhpcyBpbnN0YW5jZW9mIFJlYWRhYmxlKSlyZXR1cm4gbmV3IFJlYWRhYmxlKG9wdGlvbnMpO3ZhciBpc0R1cGxleD10aGlzIGluc3RhbmNlb2YgRHVwbGV4O3RoaXMuX3JlYWRhYmxlU3RhdGU9bmV3IFJlYWRhYmxlU3RhdGUob3B0aW9ucyx0aGlzLGlzRHVwbGV4KSx0aGlzLnJlYWRhYmxlPSEwLG9wdGlvbnMmJigiZnVuY3Rpb24iPT10eXBlb2Ygb3B0aW9ucy5yZWFkJiYodGhpcy5fcmVhZD1vcHRpb25zLnJlYWQpLCJmdW5jdGlvbiI9PXR5cGVvZiBvcHRpb25zLmRlc3Ryb3kmJih0aGlzLl9kZXN0cm95PW9wdGlvbnMuZGVzdHJveSkpLFN0cmVhbS5jYWxsKHRoaXMpfWZ1bmN0aW9uIHJlYWRhYmxlQWRkQ2h1bmsoc3RyZWFtLGNodW5rLGVuY29kaW5nLGFkZFRvRnJvbnQsc2tpcENodW5rQ2hlY2spe2RlYnVnKCJyZWFkYWJsZUFkZENodW5rIixjaHVuayk7dmFyIGVyLHN0YXRlPXN0cmVhbS5fcmVhZGFibGVTdGF0ZTtpZihudWxsPT09Y2h1bmspc3RhdGUucmVhZGluZz0hMSxmdW5jdGlvbiBvbkVvZkNodW5rKHN0cmVhbSxzdGF0ZSl7aWYoZGVidWcoIm9uRW9mQ2h1bmsiKSxzdGF0ZS5lbmRlZClyZXR1cm47aWYoc3RhdGUuZGVjb2Rlcil7dmFyIGNodW5rPXN0YXRlLmRlY29kZXIuZW5kKCk7Y2h1bmsmJmNodW5rLmxlbmd0aCYmKHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKSxzdGF0ZS5sZW5ndGgrPXN0YXRlLm9iamVjdE1vZGU/MTpjaHVuay5sZW5ndGgpfXN0YXRlLmVuZGVkPSEwLHN0YXRlLnN5bmM/ZW1pdFJlYWRhYmxlKHN0cmVhbSk6KHN0YXRlLm5lZWRSZWFkYWJsZT0hMSxzdGF0ZS5lbWl0dGVkUmVhZGFibGV8fChzdGF0ZS5lbWl0dGVkUmVhZGFibGU9ITAsZW1pdFJlYWRhYmxlXyhzdHJlYW0pKSl9KHN0cmVhbSxzdGF0ZSk7ZWxzZSBpZihza2lwQ2h1bmtDaGVja3x8KGVyPWZ1bmN0aW9uIGNodW5rSW52YWxpZChzdGF0ZSxjaHVuayl7dmFyIGVyOyhmdW5jdGlvbiBfaXNVaW50OEFycmF5KG9iail7cmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcihvYmopfHxvYmogaW5zdGFuY2VvZiBPdXJVaW50OEFycmF5fSkoY2h1bmspfHwic3RyaW5nIj09dHlwZW9mIGNodW5rfHx2b2lkIDA9PT1jaHVua3x8c3RhdGUub2JqZWN0TW9kZXx8KGVyPW5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgiY2h1bmsiLFsic3RyaW5nIiwiQnVmZmVyIiwiVWludDhBcnJheSJdLGNodW5rKSk7cmV0dXJuIGVyfShzdGF0ZSxjaHVuaykpLGVyKWVycm9yT3JEZXN0cm95KHN0cmVhbSxlcik7ZWxzZSBpZihzdGF0ZS5vYmplY3RNb2RlfHxjaHVuayYmY2h1bmsubGVuZ3RoPjApaWYoInN0cmluZyI9PXR5cGVvZiBjaHVua3x8c3RhdGUub2JqZWN0TW9kZXx8T2JqZWN0LmdldFByb3RvdHlwZU9mKGNodW5rKT09PUJ1ZmZlci5wcm90b3R5cGV8fChjaHVuaz1mdW5jdGlvbiBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKXtyZXR1cm4gQnVmZmVyLmZyb20oY2h1bmspfShjaHVuaykpLGFkZFRvRnJvbnQpc3RhdGUuZW5kRW1pdHRlZD9lcnJvck9yRGVzdHJveShzdHJlYW0sbmV3IEVSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlQpOmFkZENodW5rKHN0cmVhbSxzdGF0ZSxjaHVuaywhMCk7ZWxzZSBpZihzdGF0ZS5lbmRlZCllcnJvck9yRGVzdHJveShzdHJlYW0sbmV3IEVSUl9TVFJFQU1fUFVTSF9BRlRFUl9FT0YpO2Vsc2V7aWYoc3RhdGUuZGVzdHJveWVkKXJldHVybiExO3N0YXRlLnJlYWRpbmc9ITEsc3RhdGUuZGVjb2RlciYmIWVuY29kaW5nPyhjaHVuaz1zdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKSxzdGF0ZS5vYmplY3RNb2RlfHwwIT09Y2h1bmsubGVuZ3RoP2FkZENodW5rKHN0cmVhbSxzdGF0ZSxjaHVuaywhMSk6bWF5YmVSZWFkTW9yZShzdHJlYW0sc3RhdGUpKTphZGRDaHVuayhzdHJlYW0sc3RhdGUsY2h1bmssITEpfWVsc2UgYWRkVG9Gcm9udHx8KHN0YXRlLnJlYWRpbmc9ITEsbWF5YmVSZWFkTW9yZShzdHJlYW0sc3RhdGUpKTtyZXR1cm4hc3RhdGUuZW5kZWQmJihzdGF0ZS5sZW5ndGg8c3RhdGUuaGlnaFdhdGVyTWFya3x8MD09PXN0YXRlLmxlbmd0aCl9ZnVuY3Rpb24gYWRkQ2h1bmsoc3RyZWFtLHN0YXRlLGNodW5rLGFkZFRvRnJvbnQpe3N0YXRlLmZsb3dpbmcmJjA9PT1zdGF0ZS5sZW5ndGgmJiFzdGF0ZS5zeW5jPyhzdGF0ZS5hd2FpdERyYWluPTAsc3RyZWFtLmVtaXQoImRhdGEiLGNodW5rKSk6KHN0YXRlLmxlbmd0aCs9c3RhdGUub2JqZWN0TW9kZT8xOmNodW5rLmxlbmd0aCxhZGRUb0Zyb250P3N0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTpzdGF0ZS5idWZmZXIucHVzaChjaHVuayksc3RhdGUubmVlZFJlYWRhYmxlJiZlbWl0UmVhZGFibGUoc3RyZWFtKSksbWF5YmVSZWFkTW9yZShzdHJlYW0sc3RhdGUpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsImRlc3Ryb3llZCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB2b2lkIDAhPT10aGlzLl9yZWFkYWJsZVN0YXRlJiZ0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZH0sc2V0OmZ1bmN0aW9uIHNldCh2YWx1ZSl7dGhpcy5fcmVhZGFibGVTdGF0ZSYmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkPXZhbHVlKX19KSxSZWFkYWJsZS5wcm90b3R5cGUuZGVzdHJveT1kZXN0cm95SW1wbC5kZXN0cm95LFJlYWRhYmxlLnByb3RvdHlwZS5fdW5kZXN0cm95PWRlc3Ryb3lJbXBsLnVuZGVzdHJveSxSZWFkYWJsZS5wcm90b3R5cGUuX2Rlc3Ryb3k9ZnVuY3Rpb24oZXJyLGNiKXtjYihlcnIpfSxSZWFkYWJsZS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihjaHVuayxlbmNvZGluZyl7dmFyIHNraXBDaHVua0NoZWNrLHN0YXRlPXRoaXMuX3JlYWRhYmxlU3RhdGU7cmV0dXJuIHN0YXRlLm9iamVjdE1vZGU/c2tpcENodW5rQ2hlY2s9ITA6InN0cmluZyI9PXR5cGVvZiBjaHVuayYmKChlbmNvZGluZz1lbmNvZGluZ3x8c3RhdGUuZGVmYXVsdEVuY29kaW5nKSE9PXN0YXRlLmVuY29kaW5nJiYoY2h1bms9QnVmZmVyLmZyb20oY2h1bmssZW5jb2RpbmcpLGVuY29kaW5nPSIiKSxza2lwQ2h1bmtDaGVjaz0hMCkscmVhZGFibGVBZGRDaHVuayh0aGlzLGNodW5rLGVuY29kaW5nLCExLHNraXBDaHVua0NoZWNrKX0sUmVhZGFibGUucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24oY2h1bmspe3JldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsY2h1bmssbnVsbCwhMCwhMSl9LFJlYWRhYmxlLnByb3RvdHlwZS5pc1BhdXNlZD1mdW5jdGlvbigpe3JldHVybiExPT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nfSxSZWFkYWJsZS5wcm90b3R5cGUuc2V0RW5jb2Rpbmc9ZnVuY3Rpb24oZW5jKXtTdHJpbmdEZWNvZGVyfHwoU3RyaW5nRGVjb2Rlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyaW5nX2RlY29kZXIvbGliL3N0cmluZ19kZWNvZGVyLmpzIikuU3RyaW5nRGVjb2Rlcik7dmFyIGRlY29kZXI9bmV3IFN0cmluZ0RlY29kZXIoZW5jKTt0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXI9ZGVjb2Rlcix0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nPXRoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2Rlci5lbmNvZGluZztmb3IodmFyIHA9dGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXIuaGVhZCxjb250ZW50PSIiO251bGwhPT1wOyljb250ZW50Kz1kZWNvZGVyLndyaXRlKHAuZGF0YSkscD1wLm5leHQ7cmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyLmNsZWFyKCksIiIhPT1jb250ZW50JiZ0aGlzLl9yZWFkYWJsZVN0YXRlLmJ1ZmZlci5wdXNoKGNvbnRlbnQpLHRoaXMuX3JlYWRhYmxlU3RhdGUubGVuZ3RoPWNvbnRlbnQubGVuZ3RoLHRoaXN9O2Z1bmN0aW9uIGhvd011Y2hUb1JlYWQobixzdGF0ZSl7cmV0dXJuIG48PTB8fDA9PT1zdGF0ZS5sZW5ndGgmJnN0YXRlLmVuZGVkPzA6c3RhdGUub2JqZWN0TW9kZT8xOm4hPW4/c3RhdGUuZmxvd2luZyYmc3RhdGUubGVuZ3RoP3N0YXRlLmJ1ZmZlci5oZWFkLmRhdGEubGVuZ3RoOnN0YXRlLmxlbmd0aDoobj5zdGF0ZS5oaWdoV2F0ZXJNYXJrJiYoc3RhdGUuaGlnaFdhdGVyTWFyaz1mdW5jdGlvbiBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKXtyZXR1cm4gbj49MTA3Mzc0MTgyND9uPTEwNzM3NDE4MjQ6KG4tLSxufD1uPj4+MSxufD1uPj4+MixufD1uPj4+NCxufD1uPj4+OCxufD1uPj4+MTYsbisrKSxufShuKSksbjw9c3RhdGUubGVuZ3RoP246c3RhdGUuZW5kZWQ/c3RhdGUubGVuZ3RoOihzdGF0ZS5uZWVkUmVhZGFibGU9ITAsMCkpfWZ1bmN0aW9uIGVtaXRSZWFkYWJsZShzdHJlYW0pe3ZhciBzdGF0ZT1zdHJlYW0uX3JlYWRhYmxlU3RhdGU7ZGVidWcoImVtaXRSZWFkYWJsZSIsc3RhdGUubmVlZFJlYWRhYmxlLHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSksc3RhdGUubmVlZFJlYWRhYmxlPSExLHN0YXRlLmVtaXR0ZWRSZWFkYWJsZXx8KGRlYnVnKCJlbWl0UmVhZGFibGUiLHN0YXRlLmZsb3dpbmcpLHN0YXRlLmVtaXR0ZWRSZWFkYWJsZT0hMCxwcm9jZXNzLm5leHRUaWNrKGVtaXRSZWFkYWJsZV8sc3RyZWFtKSl9ZnVuY3Rpb24gZW1pdFJlYWRhYmxlXyhzdHJlYW0pe3ZhciBzdGF0ZT1zdHJlYW0uX3JlYWRhYmxlU3RhdGU7ZGVidWcoImVtaXRSZWFkYWJsZV8iLHN0YXRlLmRlc3Ryb3llZCxzdGF0ZS5sZW5ndGgsc3RhdGUuZW5kZWQpLHN0YXRlLmRlc3Ryb3llZHx8IXN0YXRlLmxlbmd0aCYmIXN0YXRlLmVuZGVkfHwoc3RyZWFtLmVtaXQoInJlYWRhYmxlIiksc3RhdGUuZW1pdHRlZFJlYWRhYmxlPSExKSxzdGF0ZS5uZWVkUmVhZGFibGU9IXN0YXRlLmZsb3dpbmcmJiFzdGF0ZS5lbmRlZCYmc3RhdGUubGVuZ3RoPD1zdGF0ZS5oaWdoV2F0ZXJNYXJrLGZsb3coc3RyZWFtKX1mdW5jdGlvbiBtYXliZVJlYWRNb3JlKHN0cmVhbSxzdGF0ZSl7c3RhdGUucmVhZGluZ01vcmV8fChzdGF0ZS5yZWFkaW5nTW9yZT0hMCxwcm9jZXNzLm5leHRUaWNrKG1heWJlUmVhZE1vcmVfLHN0cmVhbSxzdGF0ZSkpfWZ1bmN0aW9uIG1heWJlUmVhZE1vcmVfKHN0cmVhbSxzdGF0ZSl7Zm9yKDshc3RhdGUucmVhZGluZyYmIXN0YXRlLmVuZGVkJiYoc3RhdGUubGVuZ3RoPHN0YXRlLmhpZ2hXYXRlck1hcmt8fHN0YXRlLmZsb3dpbmcmJjA9PT1zdGF0ZS5sZW5ndGgpOyl7dmFyIGxlbj1zdGF0ZS5sZW5ndGg7aWYoZGVidWcoIm1heWJlUmVhZE1vcmUgcmVhZCAwIiksc3RyZWFtLnJlYWQoMCksbGVuPT09c3RhdGUubGVuZ3RoKWJyZWFrfXN0YXRlLnJlYWRpbmdNb3JlPSExfWZ1bmN0aW9uIHVwZGF0ZVJlYWRhYmxlTGlzdGVuaW5nKHNlbGYpe3ZhciBzdGF0ZT1zZWxmLl9yZWFkYWJsZVN0YXRlO3N0YXRlLnJlYWRhYmxlTGlzdGVuaW5nPXNlbGYubGlzdGVuZXJDb3VudCgicmVhZGFibGUiKT4wLHN0YXRlLnJlc3VtZVNjaGVkdWxlZCYmIXN0YXRlLnBhdXNlZD9zdGF0ZS5mbG93aW5nPSEwOnNlbGYubGlzdGVuZXJDb3VudCgiZGF0YSIpPjAmJnNlbGYucmVzdW1lKCl9ZnVuY3Rpb24gblJlYWRpbmdOZXh0VGljayhzZWxmKXtkZWJ1ZygicmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwIiksc2VsZi5yZWFkKDApfWZ1bmN0aW9uIHJlc3VtZV8oc3RyZWFtLHN0YXRlKXtkZWJ1ZygicmVzdW1lIixzdGF0ZS5yZWFkaW5nKSxzdGF0ZS5yZWFkaW5nfHxzdHJlYW0ucmVhZCgwKSxzdGF0ZS5yZXN1bWVTY2hlZHVsZWQ9ITEsc3RyZWFtLmVtaXQoInJlc3VtZSIpLGZsb3coc3RyZWFtKSxzdGF0ZS5mbG93aW5nJiYhc3RhdGUucmVhZGluZyYmc3RyZWFtLnJlYWQoMCl9ZnVuY3Rpb24gZmxvdyhzdHJlYW0pe3ZhciBzdGF0ZT1zdHJlYW0uX3JlYWRhYmxlU3RhdGU7Zm9yKGRlYnVnKCJmbG93IixzdGF0ZS5mbG93aW5nKTtzdGF0ZS5mbG93aW5nJiZudWxsIT09c3RyZWFtLnJlYWQoKTspO31mdW5jdGlvbiBmcm9tTGlzdChuLHN0YXRlKXtyZXR1cm4gMD09PXN0YXRlLmxlbmd0aD9udWxsOihzdGF0ZS5vYmplY3RNb2RlP3JldD1zdGF0ZS5idWZmZXIuc2hpZnQoKTohbnx8bj49c3RhdGUubGVuZ3RoPyhyZXQ9c3RhdGUuZGVjb2Rlcj9zdGF0ZS5idWZmZXIuam9pbigiIik6MT09PXN0YXRlLmJ1ZmZlci5sZW5ndGg/c3RhdGUuYnVmZmVyLmZpcnN0KCk6c3RhdGUuYnVmZmVyLmNvbmNhdChzdGF0ZS5sZW5ndGgpLHN0YXRlLmJ1ZmZlci5jbGVhcigpKTpyZXQ9c3RhdGUuYnVmZmVyLmNvbnN1bWUobixzdGF0ZS5kZWNvZGVyKSxyZXQpO3ZhciByZXR9ZnVuY3Rpb24gZW5kUmVhZGFibGUoc3RyZWFtKXt2YXIgc3RhdGU9c3RyZWFtLl9yZWFkYWJsZVN0YXRlO2RlYnVnKCJlbmRSZWFkYWJsZSIsc3RhdGUuZW5kRW1pdHRlZCksc3RhdGUuZW5kRW1pdHRlZHx8KHN0YXRlLmVuZGVkPSEwLHByb2Nlc3MubmV4dFRpY2soZW5kUmVhZGFibGVOVCxzdGF0ZSxzdHJlYW0pKX1mdW5jdGlvbiBlbmRSZWFkYWJsZU5UKHN0YXRlLHN0cmVhbSl7aWYoZGVidWcoImVuZFJlYWRhYmxlTlQiLHN0YXRlLmVuZEVtaXR0ZWQsc3RhdGUubGVuZ3RoKSwhc3RhdGUuZW5kRW1pdHRlZCYmMD09PXN0YXRlLmxlbmd0aCYmKHN0YXRlLmVuZEVtaXR0ZWQ9ITAsc3RyZWFtLnJlYWRhYmxlPSExLHN0cmVhbS5lbWl0KCJlbmQiKSxzdGF0ZS5hdXRvRGVzdHJveSkpe3ZhciB3U3RhdGU9c3RyZWFtLl93cml0YWJsZVN0YXRlOyghd1N0YXRlfHx3U3RhdGUuYXV0b0Rlc3Ryb3kmJndTdGF0ZS5maW5pc2hlZCkmJnN0cmVhbS5kZXN0cm95KCl9fWZ1bmN0aW9uIGluZGV4T2YoeHMseCl7Zm9yKHZhciBpPTAsbD14cy5sZW5ndGg7aTxsO2krKylpZih4c1tpXT09PXgpcmV0dXJuIGk7cmV0dXJuLTF9UmVhZGFibGUucHJvdG90eXBlLnJlYWQ9ZnVuY3Rpb24obil7ZGVidWcoInJlYWQiLG4pLG49cGFyc2VJbnQobiwxMCk7dmFyIHN0YXRlPXRoaXMuX3JlYWRhYmxlU3RhdGUsbk9yaWc9bjtpZigwIT09biYmKHN0YXRlLmVtaXR0ZWRSZWFkYWJsZT0hMSksMD09PW4mJnN0YXRlLm5lZWRSZWFkYWJsZSYmKCgwIT09c3RhdGUuaGlnaFdhdGVyTWFyaz9zdGF0ZS5sZW5ndGg+PXN0YXRlLmhpZ2hXYXRlck1hcms6c3RhdGUubGVuZ3RoPjApfHxzdGF0ZS5lbmRlZCkpcmV0dXJuIGRlYnVnKCJyZWFkOiBlbWl0UmVhZGFibGUiLHN0YXRlLmxlbmd0aCxzdGF0ZS5lbmRlZCksMD09PXN0YXRlLmxlbmd0aCYmc3RhdGUuZW5kZWQ/ZW5kUmVhZGFibGUodGhpcyk6ZW1pdFJlYWRhYmxlKHRoaXMpLG51bGw7aWYoMD09PShuPWhvd011Y2hUb1JlYWQobixzdGF0ZSkpJiZzdGF0ZS5lbmRlZClyZXR1cm4gMD09PXN0YXRlLmxlbmd0aCYmZW5kUmVhZGFibGUodGhpcyksbnVsbDt2YXIgcmV0LGRvUmVhZD1zdGF0ZS5uZWVkUmVhZGFibGU7cmV0dXJuIGRlYnVnKCJuZWVkIHJlYWRhYmxlIixkb1JlYWQpLCgwPT09c3RhdGUubGVuZ3RofHxzdGF0ZS5sZW5ndGgtbjxzdGF0ZS5oaWdoV2F0ZXJNYXJrKSYmZGVidWcoImxlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrIixkb1JlYWQ9ITApLHN0YXRlLmVuZGVkfHxzdGF0ZS5yZWFkaW5nP2RlYnVnKCJyZWFkaW5nIG9yIGVuZGVkIixkb1JlYWQ9ITEpOmRvUmVhZCYmKGRlYnVnKCJkbyByZWFkIiksc3RhdGUucmVhZGluZz0hMCxzdGF0ZS5zeW5jPSEwLDA9PT1zdGF0ZS5sZW5ndGgmJihzdGF0ZS5uZWVkUmVhZGFibGU9ITApLHRoaXMuX3JlYWQoc3RhdGUuaGlnaFdhdGVyTWFyayksc3RhdGUuc3luYz0hMSxzdGF0ZS5yZWFkaW5nfHwobj1ob3dNdWNoVG9SZWFkKG5PcmlnLHN0YXRlKSkpLG51bGw9PT0ocmV0PW4+MD9mcm9tTGlzdChuLHN0YXRlKTpudWxsKT8oc3RhdGUubmVlZFJlYWRhYmxlPXN0YXRlLmxlbmd0aDw9c3RhdGUuaGlnaFdhdGVyTWFyayxuPTApOihzdGF0ZS5sZW5ndGgtPW4sc3RhdGUuYXdhaXREcmFpbj0wKSwwPT09c3RhdGUubGVuZ3RoJiYoc3RhdGUuZW5kZWR8fChzdGF0ZS5uZWVkUmVhZGFibGU9ITApLG5PcmlnIT09biYmc3RhdGUuZW5kZWQmJmVuZFJlYWRhYmxlKHRoaXMpKSxudWxsIT09cmV0JiZ0aGlzLmVtaXQoImRhdGEiLHJldCkscmV0fSxSZWFkYWJsZS5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24obil7ZXJyb3JPckRlc3Ryb3kodGhpcyxuZXcgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQoIl9yZWFkKCkiKSl9LFJlYWRhYmxlLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKGRlc3QscGlwZU9wdHMpe3ZhciBzcmM9dGhpcyxzdGF0ZT10aGlzLl9yZWFkYWJsZVN0YXRlO3N3aXRjaChzdGF0ZS5waXBlc0NvdW50KXtjYXNlIDA6c3RhdGUucGlwZXM9ZGVzdDticmVhaztjYXNlIDE6c3RhdGUucGlwZXM9W3N0YXRlLnBpcGVzLGRlc3RdO2JyZWFrO2RlZmF1bHQ6c3RhdGUucGlwZXMucHVzaChkZXN0KX1zdGF0ZS5waXBlc0NvdW50Kz0xLGRlYnVnKCJwaXBlIGNvdW50PSVkIG9wdHM9JWoiLHN0YXRlLnBpcGVzQ291bnQscGlwZU9wdHMpO3ZhciBlbmRGbj0oIXBpcGVPcHRzfHwhMSE9PXBpcGVPcHRzLmVuZCkmJmRlc3QhPT1wcm9jZXNzLnN0ZG91dCYmZGVzdCE9PXByb2Nlc3Muc3RkZXJyP29uZW5kOnVucGlwZTtmdW5jdGlvbiBvbnVucGlwZShyZWFkYWJsZSx1bnBpcGVJbmZvKXtkZWJ1Zygib251bnBpcGUiKSxyZWFkYWJsZT09PXNyYyYmdW5waXBlSW5mbyYmITE9PT11bnBpcGVJbmZvLmhhc1VucGlwZWQmJih1bnBpcGVJbmZvLmhhc1VucGlwZWQ9ITAsZnVuY3Rpb24gY2xlYW51cCgpe2RlYnVnKCJjbGVhbnVwIiksZGVzdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLG9uY2xvc2UpLGRlc3QucmVtb3ZlTGlzdGVuZXIoImZpbmlzaCIsb25maW5pc2gpLGRlc3QucmVtb3ZlTGlzdGVuZXIoImRyYWluIixvbmRyYWluKSxkZXN0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsb25lcnJvciksZGVzdC5yZW1vdmVMaXN0ZW5lcigidW5waXBlIixvbnVucGlwZSksc3JjLnJlbW92ZUxpc3RlbmVyKCJlbmQiLG9uZW5kKSxzcmMucmVtb3ZlTGlzdGVuZXIoImVuZCIsdW5waXBlKSxzcmMucmVtb3ZlTGlzdGVuZXIoImRhdGEiLG9uZGF0YSksY2xlYW5lZFVwPSEwLCFzdGF0ZS5hd2FpdERyYWlufHxkZXN0Ll93cml0YWJsZVN0YXRlJiYhZGVzdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW58fG9uZHJhaW4oKX0oKSl9ZnVuY3Rpb24gb25lbmQoKXtkZWJ1Zygib25lbmQiKSxkZXN0LmVuZCgpfXN0YXRlLmVuZEVtaXR0ZWQ/cHJvY2Vzcy5uZXh0VGljayhlbmRGbik6c3JjLm9uY2UoImVuZCIsZW5kRm4pLGRlc3Qub24oInVucGlwZSIsb251bnBpcGUpO3ZhciBvbmRyYWluPWZ1bmN0aW9uIHBpcGVPbkRyYWluKHNyYyl7cmV0dXJuIGZ1bmN0aW9uIHBpcGVPbkRyYWluRnVuY3Rpb25SZXN1bHQoKXt2YXIgc3RhdGU9c3JjLl9yZWFkYWJsZVN0YXRlO2RlYnVnKCJwaXBlT25EcmFpbiIsc3RhdGUuYXdhaXREcmFpbiksc3RhdGUuYXdhaXREcmFpbiYmc3RhdGUuYXdhaXREcmFpbi0tLDA9PT1zdGF0ZS5hd2FpdERyYWluJiZFRWxpc3RlbmVyQ291bnQoc3JjLCJkYXRhIikmJihzdGF0ZS5mbG93aW5nPSEwLGZsb3coc3JjKSl9fShzcmMpO2Rlc3Qub24oImRyYWluIixvbmRyYWluKTt2YXIgY2xlYW5lZFVwPSExO2Z1bmN0aW9uIG9uZGF0YShjaHVuayl7ZGVidWcoIm9uZGF0YSIpO3ZhciByZXQ9ZGVzdC53cml0ZShjaHVuayk7ZGVidWcoImRlc3Qud3JpdGUiLHJldCksITE9PT1yZXQmJigoMT09PXN0YXRlLnBpcGVzQ291bnQmJnN0YXRlLnBpcGVzPT09ZGVzdHx8c3RhdGUucGlwZXNDb3VudD4xJiYtMSE9PWluZGV4T2Yoc3RhdGUucGlwZXMsZGVzdCkpJiYhY2xlYW5lZFVwJiYoZGVidWcoImZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZSIsc3RhdGUuYXdhaXREcmFpbiksc3RhdGUuYXdhaXREcmFpbisrKSxzcmMucGF1c2UoKSl9ZnVuY3Rpb24gb25lcnJvcihlcil7ZGVidWcoIm9uZXJyb3IiLGVyKSx1bnBpcGUoKSxkZXN0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsb25lcnJvciksMD09PUVFbGlzdGVuZXJDb3VudChkZXN0LCJlcnJvciIpJiZlcnJvck9yRGVzdHJveShkZXN0LGVyKX1mdW5jdGlvbiBvbmNsb3NlKCl7ZGVzdC5yZW1vdmVMaXN0ZW5lcigiZmluaXNoIixvbmZpbmlzaCksdW5waXBlKCl9ZnVuY3Rpb24gb25maW5pc2goKXtkZWJ1Zygib25maW5pc2giKSxkZXN0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsb25jbG9zZSksdW5waXBlKCl9ZnVuY3Rpb24gdW5waXBlKCl7ZGVidWcoInVucGlwZSIpLHNyYy51bnBpcGUoZGVzdCl9cmV0dXJuIHNyYy5vbigiZGF0YSIsb25kYXRhKSxmdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIoZW1pdHRlcixldmVudCxmbil7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyKXJldHVybiBlbWl0dGVyLnByZXBlbmRMaXN0ZW5lcihldmVudCxmbik7ZW1pdHRlci5fZXZlbnRzJiZlbWl0dGVyLl9ldmVudHNbZXZlbnRdP0FycmF5LmlzQXJyYXkoZW1pdHRlci5fZXZlbnRzW2V2ZW50XSk/ZW1pdHRlci5fZXZlbnRzW2V2ZW50XS51bnNoaWZ0KGZuKTplbWl0dGVyLl9ldmVudHNbZXZlbnRdPVtmbixlbWl0dGVyLl9ldmVudHNbZXZlbnRdXTplbWl0dGVyLm9uKGV2ZW50LGZuKX0oZGVzdCwiZXJyb3IiLG9uZXJyb3IpLGRlc3Qub25jZSgiY2xvc2UiLG9uY2xvc2UpLGRlc3Qub25jZSgiZmluaXNoIixvbmZpbmlzaCksZGVzdC5lbWl0KCJwaXBlIixzcmMpLHN0YXRlLmZsb3dpbmd8fChkZWJ1ZygicGlwZSByZXN1bWUiKSxzcmMucmVzdW1lKCkpLGRlc3R9LFJlYWRhYmxlLnByb3RvdHlwZS51bnBpcGU9ZnVuY3Rpb24oZGVzdCl7dmFyIHN0YXRlPXRoaXMuX3JlYWRhYmxlU3RhdGUsdW5waXBlSW5mbz17aGFzVW5waXBlZDohMX07aWYoMD09PXN0YXRlLnBpcGVzQ291bnQpcmV0dXJuIHRoaXM7aWYoMT09PXN0YXRlLnBpcGVzQ291bnQpcmV0dXJuIGRlc3QmJmRlc3QhPT1zdGF0ZS5waXBlc3x8KGRlc3R8fChkZXN0PXN0YXRlLnBpcGVzKSxzdGF0ZS5waXBlcz1udWxsLHN0YXRlLnBpcGVzQ291bnQ9MCxzdGF0ZS5mbG93aW5nPSExLGRlc3QmJmRlc3QuZW1pdCgidW5waXBlIix0aGlzLHVucGlwZUluZm8pKSx0aGlzO2lmKCFkZXN0KXt2YXIgZGVzdHM9c3RhdGUucGlwZXMsbGVuPXN0YXRlLnBpcGVzQ291bnQ7c3RhdGUucGlwZXM9bnVsbCxzdGF0ZS5waXBlc0NvdW50PTAsc3RhdGUuZmxvd2luZz0hMTtmb3IodmFyIGk9MDtpPGxlbjtpKyspZGVzdHNbaV0uZW1pdCgidW5waXBlIix0aGlzLHtoYXNVbnBpcGVkOiExfSk7cmV0dXJuIHRoaXN9dmFyIGluZGV4PWluZGV4T2Yoc3RhdGUucGlwZXMsZGVzdCk7cmV0dXJuLTE9PT1pbmRleHx8KHN0YXRlLnBpcGVzLnNwbGljZShpbmRleCwxKSxzdGF0ZS5waXBlc0NvdW50LT0xLDE9PT1zdGF0ZS5waXBlc0NvdW50JiYoc3RhdGUucGlwZXM9c3RhdGUucGlwZXNbMF0pLGRlc3QuZW1pdCgidW5waXBlIix0aGlzLHVucGlwZUluZm8pKSx0aGlzfSxSZWFkYWJsZS5wcm90b3R5cGUub249ZnVuY3Rpb24oZXYsZm4pe3ZhciByZXM9U3RyZWFtLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsZXYsZm4pLHN0YXRlPXRoaXMuX3JlYWRhYmxlU3RhdGU7cmV0dXJuImRhdGEiPT09ZXY/KHN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nPXRoaXMubGlzdGVuZXJDb3VudCgicmVhZGFibGUiKT4wLCExIT09c3RhdGUuZmxvd2luZyYmdGhpcy5yZXN1bWUoKSk6InJlYWRhYmxlIj09PWV2JiYoc3RhdGUuZW5kRW1pdHRlZHx8c3RhdGUucmVhZGFibGVMaXN0ZW5pbmd8fChzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZz1zdGF0ZS5uZWVkUmVhZGFibGU9ITAsc3RhdGUuZmxvd2luZz0hMSxzdGF0ZS5lbWl0dGVkUmVhZGFibGU9ITEsZGVidWcoIm9uIHJlYWRhYmxlIixzdGF0ZS5sZW5ndGgsc3RhdGUucmVhZGluZyksc3RhdGUubGVuZ3RoP2VtaXRSZWFkYWJsZSh0aGlzKTpzdGF0ZS5yZWFkaW5nfHxwcm9jZXNzLm5leHRUaWNrKG5SZWFkaW5nTmV4dFRpY2ssdGhpcykpKSxyZXN9LFJlYWRhYmxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1SZWFkYWJsZS5wcm90b3R5cGUub24sUmVhZGFibGUucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKGV2LGZuKXt2YXIgcmVzPVN0cmVhbS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIuY2FsbCh0aGlzLGV2LGZuKTtyZXR1cm4icmVhZGFibGUiPT09ZXYmJnByb2Nlc3MubmV4dFRpY2sodXBkYXRlUmVhZGFibGVMaXN0ZW5pbmcsdGhpcykscmVzfSxSZWFkYWJsZS5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uKGV2KXt2YXIgcmVzPVN0cmVhbS5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4icmVhZGFibGUiIT09ZXYmJnZvaWQgMCE9PWV2fHxwcm9jZXNzLm5leHRUaWNrKHVwZGF0ZVJlYWRhYmxlTGlzdGVuaW5nLHRoaXMpLHJlc30sUmVhZGFibGUucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe3ZhciBzdGF0ZT10aGlzLl9yZWFkYWJsZVN0YXRlO3JldHVybiBzdGF0ZS5mbG93aW5nfHwoZGVidWcoInJlc3VtZSIpLHN0YXRlLmZsb3dpbmc9IXN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nLGZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sc3RhdGUpe3N0YXRlLnJlc3VtZVNjaGVkdWxlZHx8KHN0YXRlLnJlc3VtZVNjaGVkdWxlZD0hMCxwcm9jZXNzLm5leHRUaWNrKHJlc3VtZV8sc3RyZWFtLHN0YXRlKSl9KHRoaXMsc3RhdGUpKSxzdGF0ZS5wYXVzZWQ9ITEsdGhpc30sUmVhZGFibGUucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7cmV0dXJuIGRlYnVnKCJjYWxsIHBhdXNlIGZsb3dpbmc9JWoiLHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyksITEhPT10aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcmJihkZWJ1ZygicGF1c2UiKSx0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmc9ITEsdGhpcy5lbWl0KCJwYXVzZSIpKSx0aGlzLl9yZWFkYWJsZVN0YXRlLnBhdXNlZD0hMCx0aGlzfSxSZWFkYWJsZS5wcm90b3R5cGUud3JhcD1mdW5jdGlvbihzdHJlYW0pe3ZhciBfdGhpcz10aGlzLHN0YXRlPXRoaXMuX3JlYWRhYmxlU3RhdGUscGF1c2VkPSExO2Zvcih2YXIgaSBpbiBzdHJlYW0ub24oImVuZCIsZnVuY3Rpb24oKXtpZihkZWJ1Zygid3JhcHBlZCBlbmQiKSxzdGF0ZS5kZWNvZGVyJiYhc3RhdGUuZW5kZWQpe3ZhciBjaHVuaz1zdGF0ZS5kZWNvZGVyLmVuZCgpO2NodW5rJiZjaHVuay5sZW5ndGgmJl90aGlzLnB1c2goY2h1bmspfV90aGlzLnB1c2gobnVsbCl9KSxzdHJlYW0ub24oImRhdGEiLGZ1bmN0aW9uKGNodW5rKXsoZGVidWcoIndyYXBwZWQgZGF0YSIpLHN0YXRlLmRlY29kZXImJihjaHVuaz1zdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKSksc3RhdGUub2JqZWN0TW9kZSYmbnVsbD09Y2h1bmspfHwoc3RhdGUub2JqZWN0TW9kZXx8Y2h1bmsmJmNodW5rLmxlbmd0aCkmJihfdGhpcy5wdXNoKGNodW5rKXx8KHBhdXNlZD0hMCxzdHJlYW0ucGF1c2UoKSkpfSksc3RyZWFtKXZvaWQgMD09PXRoaXNbaV0mJiJmdW5jdGlvbiI9PXR5cGVvZiBzdHJlYW1baV0mJih0aGlzW2ldPWZ1bmN0aW9uIG1ldGhvZFdyYXAobWV0aG9kKXtyZXR1cm4gZnVuY3Rpb24gbWV0aG9kV3JhcFJldHVybkZ1bmN0aW9uKCl7cmV0dXJuIHN0cmVhbVttZXRob2RdLmFwcGx5KHN0cmVhbSxhcmd1bWVudHMpfX0oaSkpO2Zvcih2YXIgbj0wO248a1Byb3h5RXZlbnRzLmxlbmd0aDtuKyspc3RyZWFtLm9uKGtQcm94eUV2ZW50c1tuXSx0aGlzLmVtaXQuYmluZCh0aGlzLGtQcm94eUV2ZW50c1tuXSkpO3JldHVybiB0aGlzLl9yZWFkPWZ1bmN0aW9uKG4pe2RlYnVnKCJ3cmFwcGVkIF9yZWFkIixuKSxwYXVzZWQmJihwYXVzZWQ9ITEsc3RyZWFtLnJlc3VtZSgpKX0sdGhpc30sImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmKFJlYWRhYmxlLnByb3RvdHlwZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09Y3JlYXRlUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yJiYoY3JlYXRlUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2FzeW5jX2l0ZXJhdG9yLmpzIikpLGNyZWF0ZVJlYWRhYmxlU3RyZWFtQXN5bmNJdGVyYXRvcih0aGlzKX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsInJlYWRhYmxlSGlnaFdhdGVyTWFyayIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcmt9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlLnByb3RvdHlwZSwicmVhZGFibGVCdWZmZXIiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZSYmdGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXJ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlLnByb3RvdHlwZSwicmVhZGFibGVGbG93aW5nIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZ30sc2V0OmZ1bmN0aW9uIHNldChzdGF0ZSl7dGhpcy5fcmVhZGFibGVTdGF0ZSYmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZz1zdGF0ZSl9fSksUmVhZGFibGUuX2Zyb21MaXN0PWZyb21MaXN0LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsInJlYWRhYmxlTGVuZ3RoIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUubGVuZ3RofX0pLCJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJihSZWFkYWJsZS5mcm9tPWZ1bmN0aW9uKGl0ZXJhYmxlLG9wdHMpe3JldHVybiB2b2lkIDA9PT1mcm9tJiYoZnJvbT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9mcm9tLWJyb3dzZXIuanMiKSksZnJvbShSZWFkYWJsZSxpdGVyYWJsZSxvcHRzKX0pfSwiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fdHJhbnNmb3JtLmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijttb2R1bGUuZXhwb3J0cz1UcmFuc2Zvcm07dmFyIF9yZXF1aXJlJGNvZGVzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2Vycm9ycy1icm93c2VyLmpzIikuRixFUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRD1fcmVxdWlyZSRjb2Rlcy5FUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCxFUlJfTVVMVElQTEVfQ0FMTEJBQ0s9X3JlcXVpcmUkY29kZXMuRVJSX01VTFRJUExFX0NBTExCQUNLLEVSUl9UUkFOU0ZPUk1fQUxSRUFEWV9UUkFOU0ZPUk1JTkc9X3JlcXVpcmUkY29kZXMuRVJSX1RSQU5TRk9STV9BTFJFQURZX1RSQU5TRk9STUlORyxFUlJfVFJBTlNGT1JNX1dJVEhfTEVOR1RIXzA9X3JlcXVpcmUkY29kZXMuRVJSX1RSQU5TRk9STV9XSVRIX0xFTkdUSF8wLER1cGxleD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9kdXBsZXguanMiKTtmdW5jdGlvbiBhZnRlclRyYW5zZm9ybShlcixkYXRhKXt2YXIgdHM9dGhpcy5fdHJhbnNmb3JtU3RhdGU7dHMudHJhbnNmb3JtaW5nPSExO3ZhciBjYj10cy53cml0ZWNiO2lmKG51bGw9PT1jYilyZXR1cm4gdGhpcy5lbWl0KCJlcnJvciIsbmV3IEVSUl9NVUxUSVBMRV9DQUxMQkFDSyk7dHMud3JpdGVjaHVuaz1udWxsLHRzLndyaXRlY2I9bnVsbCxudWxsIT1kYXRhJiZ0aGlzLnB1c2goZGF0YSksY2IoZXIpO3ZhciBycz10aGlzLl9yZWFkYWJsZVN0YXRlO3JzLnJlYWRpbmc9ITEsKHJzLm5lZWRSZWFkYWJsZXx8cnMubGVuZ3RoPHJzLmhpZ2hXYXRlck1hcmspJiZ0aGlzLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspfWZ1bmN0aW9uIFRyYW5zZm9ybShvcHRpb25zKXtpZighKHRoaXMgaW5zdGFuY2VvZiBUcmFuc2Zvcm0pKXJldHVybiBuZXcgVHJhbnNmb3JtKG9wdGlvbnMpO0R1cGxleC5jYWxsKHRoaXMsb3B0aW9ucyksdGhpcy5fdHJhbnNmb3JtU3RhdGU9e2FmdGVyVHJhbnNmb3JtOmFmdGVyVHJhbnNmb3JtLmJpbmQodGhpcyksbmVlZFRyYW5zZm9ybTohMSx0cmFuc2Zvcm1pbmc6ITEsd3JpdGVjYjpudWxsLHdyaXRlY2h1bms6bnVsbCx3cml0ZWVuY29kaW5nOm51bGx9LHRoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlPSEwLHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYz0hMSxvcHRpb25zJiYoImZ1bmN0aW9uIj09dHlwZW9mIG9wdGlvbnMudHJhbnNmb3JtJiYodGhpcy5fdHJhbnNmb3JtPW9wdGlvbnMudHJhbnNmb3JtKSwiZnVuY3Rpb24iPT10eXBlb2Ygb3B0aW9ucy5mbHVzaCYmKHRoaXMuX2ZsdXNoPW9wdGlvbnMuZmx1c2gpKSx0aGlzLm9uKCJwcmVmaW5pc2giLHByZWZpbmlzaCl9ZnVuY3Rpb24gcHJlZmluaXNoKCl7dmFyIF90aGlzPXRoaXM7ImZ1bmN0aW9uIiE9dHlwZW9mIHRoaXMuX2ZsdXNofHx0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD9kb25lKHRoaXMsbnVsbCxudWxsKTp0aGlzLl9mbHVzaChmdW5jdGlvbihlcixkYXRhKXtkb25lKF90aGlzLGVyLGRhdGEpfSl9ZnVuY3Rpb24gZG9uZShzdHJlYW0sZXIsZGF0YSl7aWYoZXIpcmV0dXJuIHN0cmVhbS5lbWl0KCJlcnJvciIsZXIpO2lmKG51bGwhPWRhdGEmJnN0cmVhbS5wdXNoKGRhdGEpLHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5sZW5ndGgpdGhyb3cgbmV3IEVSUl9UUkFOU0ZPUk1fV0lUSF9MRU5HVEhfMDtpZihzdHJlYW0uX3RyYW5zZm9ybVN0YXRlLnRyYW5zZm9ybWluZyl0aHJvdyBuZXcgRVJSX1RSQU5TRk9STV9BTFJFQURZX1RSQU5TRk9STUlORztyZXR1cm4gc3RyZWFtLnB1c2gobnVsbCl9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiKShUcmFuc2Zvcm0sRHVwbGV4KSxUcmFuc2Zvcm0ucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24oY2h1bmssZW5jb2Rpbmcpe3JldHVybiB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtPSExLER1cGxleC5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsY2h1bmssZW5jb2RpbmcpfSxUcmFuc2Zvcm0ucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24oY2h1bmssZW5jb2RpbmcsY2Ipe2NiKG5ldyBFUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCgiX3RyYW5zZm9ybSgpIikpfSxUcmFuc2Zvcm0ucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbihjaHVuayxlbmNvZGluZyxjYil7dmFyIHRzPXRoaXMuX3RyYW5zZm9ybVN0YXRlO2lmKHRzLndyaXRlY2I9Y2IsdHMud3JpdGVjaHVuaz1jaHVuayx0cy53cml0ZWVuY29kaW5nPWVuY29kaW5nLCF0cy50cmFuc2Zvcm1pbmcpe3ZhciBycz10aGlzLl9yZWFkYWJsZVN0YXRlOyh0cy5uZWVkVHJhbnNmb3JtfHxycy5uZWVkUmVhZGFibGV8fHJzLmxlbmd0aDxycy5oaWdoV2F0ZXJNYXJrKSYmdGhpcy5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKX19LFRyYW5zZm9ybS5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24obil7dmFyIHRzPXRoaXMuX3RyYW5zZm9ybVN0YXRlO251bGw9PT10cy53cml0ZWNodW5rfHx0cy50cmFuc2Zvcm1pbmc/dHMubmVlZFRyYW5zZm9ybT0hMDoodHMudHJhbnNmb3JtaW5nPSEwLHRoaXMuX3RyYW5zZm9ybSh0cy53cml0ZWNodW5rLHRzLndyaXRlZW5jb2RpbmcsdHMuYWZ0ZXJUcmFuc2Zvcm0pKX0sVHJhbnNmb3JtLnByb3RvdHlwZS5fZGVzdHJveT1mdW5jdGlvbihlcnIsY2Ipe0R1cGxleC5wcm90b3R5cGUuX2Rlc3Ryb3kuY2FsbCh0aGlzLGVycixmdW5jdGlvbihlcnIyKXtjYihlcnIyKX0pfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgRHVwbGV4LHByb2Nlc3M9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL25vZGUtc3RkbGliLWJyb3dzZXIvY2pzL3Byb3h5L3Byb2Nlc3MuanMiKTtmdW5jdGlvbiBDb3JrZWRSZXF1ZXN0KHN0YXRlKXt2YXIgX3RoaXM9dGhpczt0aGlzLm5leHQ9bnVsbCx0aGlzLmVudHJ5PW51bGwsdGhpcy5maW5pc2g9ZnVuY3Rpb24oKXshZnVuY3Rpb24gb25Db3JrZWRGaW5pc2goY29ya1JlcSxzdGF0ZSxlcnIpe3ZhciBlbnRyeT1jb3JrUmVxLmVudHJ5O2NvcmtSZXEuZW50cnk9bnVsbDtmb3IoO2VudHJ5Oyl7dmFyIGNiPWVudHJ5LmNhbGxiYWNrO3N0YXRlLnBlbmRpbmdjYi0tLGNiKGVyciksZW50cnk9ZW50cnkubmV4dH1zdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dD1jb3JrUmVxfShfdGhpcyxzdGF0ZSl9fW1vZHVsZS5leHBvcnRzPVdyaXRhYmxlLFdyaXRhYmxlLldyaXRhYmxlU3RhdGU9V3JpdGFibGVTdGF0ZTt2YXIgaW50ZXJuYWxVdGlsPXtkZXByZWNhdGU6X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3V0aWwtZGVwcmVjYXRlL2Jyb3dzZXIuanMiKX0sU3RyZWFtPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3N0cmVhbS1icm93c2VyLmpzIiksQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiKS5CdWZmZXIsT3VyVWludDhBcnJheT0odm9pZCAwIT09X193ZWJwYWNrX3JlcXVpcmVfXy5nP19fd2VicGFja19yZXF1aXJlX18uZzoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e30pLlVpbnQ4QXJyYXl8fGZ1bmN0aW9uKCl7fTt2YXIgcmVhbEhhc0luc3RhbmNlLGRlc3Ryb3lJbXBsPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2Rlc3Ryb3kuanMiKSxnZXRIaWdoV2F0ZXJNYXJrPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3N0YXRlLmpzIikuZ2V0SGlnaFdhdGVyTWFyayxfcmVxdWlyZSRjb2Rlcz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9lcnJvcnMtYnJvd3Nlci5qcyIpLkYsRVJSX0lOVkFMSURfQVJHX1RZUEU9X3JlcXVpcmUkY29kZXMuRVJSX0lOVkFMSURfQVJHX1RZUEUsRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQ9X3JlcXVpcmUkY29kZXMuRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQsRVJSX01VTFRJUExFX0NBTExCQUNLPV9yZXF1aXJlJGNvZGVzLkVSUl9NVUxUSVBMRV9DQUxMQkFDSyxFUlJfU1RSRUFNX0NBTk5PVF9QSVBFPV9yZXF1aXJlJGNvZGVzLkVSUl9TVFJFQU1fQ0FOTk9UX1BJUEUsRVJSX1NUUkVBTV9ERVNUUk9ZRUQ9X3JlcXVpcmUkY29kZXMuRVJSX1NUUkVBTV9ERVNUUk9ZRUQsRVJSX1NUUkVBTV9OVUxMX1ZBTFVFUz1fcmVxdWlyZSRjb2Rlcy5FUlJfU1RSRUFNX05VTExfVkFMVUVTLEVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5EPV9yZXF1aXJlJGNvZGVzLkVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5ELEVSUl9VTktOT1dOX0VOQ09ESU5HPV9yZXF1aXJlJGNvZGVzLkVSUl9VTktOT1dOX0VOQ09ESU5HLGVycm9yT3JEZXN0cm95PWRlc3Ryb3lJbXBsLmVycm9yT3JEZXN0cm95O2Z1bmN0aW9uIG5vcCgpe31mdW5jdGlvbiBXcml0YWJsZVN0YXRlKG9wdGlvbnMsc3RyZWFtLGlzRHVwbGV4KXtEdXBsZXg9RHVwbGV4fHxfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9kdXBsZXguanMiKSxvcHRpb25zPW9wdGlvbnN8fHt9LCJib29sZWFuIiE9dHlwZW9mIGlzRHVwbGV4JiYoaXNEdXBsZXg9c3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4KSx0aGlzLm9iamVjdE1vZGU9ISFvcHRpb25zLm9iamVjdE1vZGUsaXNEdXBsZXgmJih0aGlzLm9iamVjdE1vZGU9dGhpcy5vYmplY3RNb2RlfHwhIW9wdGlvbnMud3JpdGFibGVPYmplY3RNb2RlKSx0aGlzLmhpZ2hXYXRlck1hcms9Z2V0SGlnaFdhdGVyTWFyayh0aGlzLG9wdGlvbnMsIndyaXRhYmxlSGlnaFdhdGVyTWFyayIsaXNEdXBsZXgpLHRoaXMuZmluYWxDYWxsZWQ9ITEsdGhpcy5uZWVkRHJhaW49ITEsdGhpcy5lbmRpbmc9ITEsdGhpcy5lbmRlZD0hMSx0aGlzLmZpbmlzaGVkPSExLHRoaXMuZGVzdHJveWVkPSExO3ZhciBub0RlY29kZT0hMT09PW9wdGlvbnMuZGVjb2RlU3RyaW5nczt0aGlzLmRlY29kZVN0cmluZ3M9IW5vRGVjb2RlLHRoaXMuZGVmYXVsdEVuY29kaW5nPW9wdGlvbnMuZGVmYXVsdEVuY29kaW5nfHwidXRmOCIsdGhpcy5sZW5ndGg9MCx0aGlzLndyaXRpbmc9ITEsdGhpcy5jb3JrZWQ9MCx0aGlzLnN5bmM9ITAsdGhpcy5idWZmZXJQcm9jZXNzaW5nPSExLHRoaXMub253cml0ZT1mdW5jdGlvbihlcil7IWZ1bmN0aW9uIG9ud3JpdGUoc3RyZWFtLGVyKXt2YXIgc3RhdGU9c3RyZWFtLl93cml0YWJsZVN0YXRlLHN5bmM9c3RhdGUuc3luYyxjYj1zdGF0ZS53cml0ZWNiO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBjYil0aHJvdyBuZXcgRVJSX01VTFRJUExFX0NBTExCQUNLO2lmKGZ1bmN0aW9uIG9ud3JpdGVTdGF0ZVVwZGF0ZShzdGF0ZSl7c3RhdGUud3JpdGluZz0hMSxzdGF0ZS53cml0ZWNiPW51bGwsc3RhdGUubGVuZ3RoLT1zdGF0ZS53cml0ZWxlbixzdGF0ZS53cml0ZWxlbj0wfShzdGF0ZSksZXIpIWZ1bmN0aW9uIG9ud3JpdGVFcnJvcihzdHJlYW0sc3RhdGUsc3luYyxlcixjYil7LS1zdGF0ZS5wZW5kaW5nY2Isc3luYz8ocHJvY2Vzcy5uZXh0VGljayhjYixlcikscHJvY2Vzcy5uZXh0VGljayhmaW5pc2hNYXliZSxzdHJlYW0sc3RhdGUpLHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITAsZXJyb3JPckRlc3Ryb3koc3RyZWFtLGVyKSk6KGNiKGVyKSxzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSEwLGVycm9yT3JEZXN0cm95KHN0cmVhbSxlciksZmluaXNoTWF5YmUoc3RyZWFtLHN0YXRlKSl9KHN0cmVhbSxzdGF0ZSxzeW5jLGVyLGNiKTtlbHNle3ZhciBmaW5pc2hlZD1uZWVkRmluaXNoKHN0YXRlKXx8c3RyZWFtLmRlc3Ryb3llZDtmaW5pc2hlZHx8c3RhdGUuY29ya2VkfHxzdGF0ZS5idWZmZXJQcm9jZXNzaW5nfHwhc3RhdGUuYnVmZmVyZWRSZXF1ZXN0fHxjbGVhckJ1ZmZlcihzdHJlYW0sc3RhdGUpLHN5bmM/cHJvY2Vzcy5uZXh0VGljayhhZnRlcldyaXRlLHN0cmVhbSxzdGF0ZSxmaW5pc2hlZCxjYik6YWZ0ZXJXcml0ZShzdHJlYW0sc3RhdGUsZmluaXNoZWQsY2IpfX0oc3RyZWFtLGVyKX0sdGhpcy53cml0ZWNiPW51bGwsdGhpcy53cml0ZWxlbj0wLHRoaXMuYnVmZmVyZWRSZXF1ZXN0PW51bGwsdGhpcy5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwsdGhpcy5wZW5kaW5nY2I9MCx0aGlzLnByZWZpbmlzaGVkPSExLHRoaXMuZXJyb3JFbWl0dGVkPSExLHRoaXMuZW1pdENsb3NlPSExIT09b3B0aW9ucy5lbWl0Q2xvc2UsdGhpcy5hdXRvRGVzdHJveT0hIW9wdGlvbnMuYXV0b0Rlc3Ryb3ksdGhpcy5idWZmZXJlZFJlcXVlc3RDb3VudD0wLHRoaXMuY29ya2VkUmVxdWVzdHNGcmVlPW5ldyBDb3JrZWRSZXF1ZXN0KHRoaXMpfWZ1bmN0aW9uIFdyaXRhYmxlKG9wdGlvbnMpe3ZhciBpc0R1cGxleD10aGlzIGluc3RhbmNlb2YoRHVwbGV4PUR1cGxleHx8X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fZHVwbGV4LmpzIikpO2lmKCFpc0R1cGxleCYmIXJlYWxIYXNJbnN0YW5jZS5jYWxsKFdyaXRhYmxlLHRoaXMpKXJldHVybiBuZXcgV3JpdGFibGUob3B0aW9ucyk7dGhpcy5fd3JpdGFibGVTdGF0ZT1uZXcgV3JpdGFibGVTdGF0ZShvcHRpb25zLHRoaXMsaXNEdXBsZXgpLHRoaXMud3JpdGFibGU9ITAsb3B0aW9ucyYmKCJmdW5jdGlvbiI9PXR5cGVvZiBvcHRpb25zLndyaXRlJiYodGhpcy5fd3JpdGU9b3B0aW9ucy53cml0ZSksImZ1bmN0aW9uIj09dHlwZW9mIG9wdGlvbnMud3JpdGV2JiYodGhpcy5fd3JpdGV2PW9wdGlvbnMud3JpdGV2KSwiZnVuY3Rpb24iPT10eXBlb2Ygb3B0aW9ucy5kZXN0cm95JiYodGhpcy5fZGVzdHJveT1vcHRpb25zLmRlc3Ryb3kpLCJmdW5jdGlvbiI9PXR5cGVvZiBvcHRpb25zLmZpbmFsJiYodGhpcy5fZmluYWw9b3B0aW9ucy5maW5hbCkpLFN0cmVhbS5jYWxsKHRoaXMpfWZ1bmN0aW9uIGRvV3JpdGUoc3RyZWFtLHN0YXRlLHdyaXRldixsZW4sY2h1bmssZW5jb2RpbmcsY2Ipe3N0YXRlLndyaXRlbGVuPWxlbixzdGF0ZS53cml0ZWNiPWNiLHN0YXRlLndyaXRpbmc9ITAsc3RhdGUuc3luYz0hMCxzdGF0ZS5kZXN0cm95ZWQ/c3RhdGUub253cml0ZShuZXcgRVJSX1NUUkVBTV9ERVNUUk9ZRUQoIndyaXRlIikpOndyaXRldj9zdHJlYW0uX3dyaXRldihjaHVuayxzdGF0ZS5vbndyaXRlKTpzdHJlYW0uX3dyaXRlKGNodW5rLGVuY29kaW5nLHN0YXRlLm9ud3JpdGUpLHN0YXRlLnN5bmM9ITF9ZnVuY3Rpb24gYWZ0ZXJXcml0ZShzdHJlYW0sc3RhdGUsZmluaXNoZWQsY2Ipe2ZpbmlzaGVkfHxmdW5jdGlvbiBvbndyaXRlRHJhaW4oc3RyZWFtLHN0YXRlKXswPT09c3RhdGUubGVuZ3RoJiZzdGF0ZS5uZWVkRHJhaW4mJihzdGF0ZS5uZWVkRHJhaW49ITEsc3RyZWFtLmVtaXQoImRyYWluIikpfShzdHJlYW0sc3RhdGUpLHN0YXRlLnBlbmRpbmdjYi0tLGNiKCksZmluaXNoTWF5YmUoc3RyZWFtLHN0YXRlKX1mdW5jdGlvbiBjbGVhckJ1ZmZlcihzdHJlYW0sc3RhdGUpe3N0YXRlLmJ1ZmZlclByb2Nlc3Npbmc9ITA7dmFyIGVudHJ5PXN0YXRlLmJ1ZmZlcmVkUmVxdWVzdDtpZihzdHJlYW0uX3dyaXRldiYmZW50cnkmJmVudHJ5Lm5leHQpe3ZhciBsPXN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50LGJ1ZmZlcj1uZXcgQXJyYXkobCksaG9sZGVyPXN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZTtob2xkZXIuZW50cnk9ZW50cnk7Zm9yKHZhciBjb3VudD0wLGFsbEJ1ZmZlcnM9ITA7ZW50cnk7KWJ1ZmZlcltjb3VudF09ZW50cnksZW50cnkuaXNCdWZ8fChhbGxCdWZmZXJzPSExKSxlbnRyeT1lbnRyeS5uZXh0LGNvdW50Kz0xO2J1ZmZlci5hbGxCdWZmZXJzPWFsbEJ1ZmZlcnMsZG9Xcml0ZShzdHJlYW0sc3RhdGUsITAsc3RhdGUubGVuZ3RoLGJ1ZmZlciwiIixob2xkZXIuZmluaXNoKSxzdGF0ZS5wZW5kaW5nY2IrKyxzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwsaG9sZGVyLm5leHQ/KHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZT1ob2xkZXIubmV4dCxob2xkZXIubmV4dD1udWxsKTpzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IENvcmtlZFJlcXVlc3Qoc3RhdGUpLHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50PTB9ZWxzZXtmb3IoO2VudHJ5Oyl7dmFyIGNodW5rPWVudHJ5LmNodW5rLGVuY29kaW5nPWVudHJ5LmVuY29kaW5nLGNiPWVudHJ5LmNhbGxiYWNrO2lmKGRvV3JpdGUoc3RyZWFtLHN0YXRlLCExLHN0YXRlLm9iamVjdE1vZGU/MTpjaHVuay5sZW5ndGgsY2h1bmssZW5jb2RpbmcsY2IpLGVudHJ5PWVudHJ5Lm5leHQsc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQtLSxzdGF0ZS53cml0aW5nKWJyZWFrfW51bGw9PT1lbnRyeSYmKHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCl9c3RhdGUuYnVmZmVyZWRSZXF1ZXN0PWVudHJ5LHN0YXRlLmJ1ZmZlclByb2Nlc3Npbmc9ITF9ZnVuY3Rpb24gbmVlZEZpbmlzaChzdGF0ZSl7cmV0dXJuIHN0YXRlLmVuZGluZyYmMD09PXN0YXRlLmxlbmd0aCYmbnVsbD09PXN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCYmIXN0YXRlLmZpbmlzaGVkJiYhc3RhdGUud3JpdGluZ31mdW5jdGlvbiBjYWxsRmluYWwoc3RyZWFtLHN0YXRlKXtzdHJlYW0uX2ZpbmFsKGZ1bmN0aW9uKGVycil7c3RhdGUucGVuZGluZ2NiLS0sZXJyJiZlcnJvck9yRGVzdHJveShzdHJlYW0sZXJyKSxzdGF0ZS5wcmVmaW5pc2hlZD0hMCxzdHJlYW0uZW1pdCgicHJlZmluaXNoIiksZmluaXNoTWF5YmUoc3RyZWFtLHN0YXRlKX0pfWZ1bmN0aW9uIGZpbmlzaE1heWJlKHN0cmVhbSxzdGF0ZSl7dmFyIG5lZWQ9bmVlZEZpbmlzaChzdGF0ZSk7aWYobmVlZCYmKGZ1bmN0aW9uIHByZWZpbmlzaChzdHJlYW0sc3RhdGUpe3N0YXRlLnByZWZpbmlzaGVkfHxzdGF0ZS5maW5hbENhbGxlZHx8KCJmdW5jdGlvbiIhPXR5cGVvZiBzdHJlYW0uX2ZpbmFsfHxzdGF0ZS5kZXN0cm95ZWQ/KHN0YXRlLnByZWZpbmlzaGVkPSEwLHN0cmVhbS5lbWl0KCJwcmVmaW5pc2giKSk6KHN0YXRlLnBlbmRpbmdjYisrLHN0YXRlLmZpbmFsQ2FsbGVkPSEwLHByb2Nlc3MubmV4dFRpY2soY2FsbEZpbmFsLHN0cmVhbSxzdGF0ZSkpKX0oc3RyZWFtLHN0YXRlKSwwPT09c3RhdGUucGVuZGluZ2NiJiYoc3RhdGUuZmluaXNoZWQ9ITAsc3RyZWFtLmVtaXQoImZpbmlzaCIpLHN0YXRlLmF1dG9EZXN0cm95KSkpe3ZhciByU3RhdGU9c3RyZWFtLl9yZWFkYWJsZVN0YXRlOyghclN0YXRlfHxyU3RhdGUuYXV0b0Rlc3Ryb3kmJnJTdGF0ZS5lbmRFbWl0dGVkKSYmc3RyZWFtLmRlc3Ryb3koKX1yZXR1cm4gbmVlZH1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIpKFdyaXRhYmxlLFN0cmVhbSksV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUuZ2V0QnVmZmVyPWZ1bmN0aW9uIGdldEJ1ZmZlcigpe2Zvcih2YXIgY3VycmVudD10aGlzLmJ1ZmZlcmVkUmVxdWVzdCxvdXQ9W107Y3VycmVudDspb3V0LnB1c2goY3VycmVudCksY3VycmVudD1jdXJyZW50Lm5leHQ7cmV0dXJuIG91dH0sZnVuY3Rpb24oKXt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlU3RhdGUucHJvdG90eXBlLCJidWZmZXIiLHtnZXQ6aW50ZXJuYWxVdGlsLmRlcHJlY2F0ZShmdW5jdGlvbiB3cml0YWJsZVN0YXRlQnVmZmVyR2V0dGVyKCl7cmV0dXJuIHRoaXMuZ2V0QnVmZmVyKCl9LCJfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciBpbnN0ZWFkLiIsIkRFUDAwMDMiKX0pfWNhdGNoKF8pe319KCksImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLmhhc0luc3RhbmNlJiYiZnVuY3Rpb24iPT10eXBlb2YgRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0/KHJlYWxIYXNJbnN0YW5jZT1GdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXSxPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUsU3ltYm9sLmhhc0luc3RhbmNlLHt2YWx1ZTpmdW5jdGlvbiB2YWx1ZShvYmplY3Qpe3JldHVybiEhcmVhbEhhc0luc3RhbmNlLmNhbGwodGhpcyxvYmplY3QpfHx0aGlzPT09V3JpdGFibGUmJihvYmplY3QmJm9iamVjdC5fd3JpdGFibGVTdGF0ZSBpbnN0YW5jZW9mIFdyaXRhYmxlU3RhdGUpfX0pKTpyZWFsSGFzSW5zdGFuY2U9ZnVuY3Rpb24gcmVhbEhhc0luc3RhbmNlKG9iamVjdCl7cmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIHRoaXN9LFdyaXRhYmxlLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKCl7ZXJyb3JPckRlc3Ryb3kodGhpcyxuZXcgRVJSX1NUUkVBTV9DQU5OT1RfUElQRSl9LFdyaXRhYmxlLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihjaHVuayxlbmNvZGluZyxjYil7dmFyIHN0YXRlPXRoaXMuX3dyaXRhYmxlU3RhdGUscmV0PSExLGlzQnVmPSFzdGF0ZS5vYmplY3RNb2RlJiZmdW5jdGlvbiBfaXNVaW50OEFycmF5KG9iail7cmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcihvYmopfHxvYmogaW5zdGFuY2VvZiBPdXJVaW50OEFycmF5fShjaHVuayk7cmV0dXJuIGlzQnVmJiYhQnVmZmVyLmlzQnVmZmVyKGNodW5rKSYmKGNodW5rPWZ1bmN0aW9uIF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspe3JldHVybiBCdWZmZXIuZnJvbShjaHVuayl9KGNodW5rKSksImZ1bmN0aW9uIj09dHlwZW9mIGVuY29kaW5nJiYoY2I9ZW5jb2RpbmcsZW5jb2Rpbmc9bnVsbCksaXNCdWY/ZW5jb2Rpbmc9ImJ1ZmZlciI6ZW5jb2Rpbmd8fChlbmNvZGluZz1zdGF0ZS5kZWZhdWx0RW5jb2RpbmcpLCJmdW5jdGlvbiIhPXR5cGVvZiBjYiYmKGNiPW5vcCksc3RhdGUuZW5kaW5nP2Z1bmN0aW9uIHdyaXRlQWZ0ZXJFbmQoc3RyZWFtLGNiKXt2YXIgZXI9bmV3IEVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5EO2Vycm9yT3JEZXN0cm95KHN0cmVhbSxlcikscHJvY2Vzcy5uZXh0VGljayhjYixlcil9KHRoaXMsY2IpOihpc0J1Znx8ZnVuY3Rpb24gdmFsaWRDaHVuayhzdHJlYW0sc3RhdGUsY2h1bmssY2Ipe3ZhciBlcjtyZXR1cm4gbnVsbD09PWNodW5rP2VyPW5ldyBFUlJfU1RSRUFNX05VTExfVkFMVUVTOiJzdHJpbmciPT10eXBlb2YgY2h1bmt8fHN0YXRlLm9iamVjdE1vZGV8fChlcj1uZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoImNodW5rIixbInN0cmluZyIsIkJ1ZmZlciJdLGNodW5rKSksIWVyfHwoZXJyb3JPckRlc3Ryb3koc3RyZWFtLGVyKSxwcm9jZXNzLm5leHRUaWNrKGNiLGVyKSwhMSl9KHRoaXMsc3RhdGUsY2h1bmssY2IpKSYmKHN0YXRlLnBlbmRpbmdjYisrLHJldD1mdW5jdGlvbiB3cml0ZU9yQnVmZmVyKHN0cmVhbSxzdGF0ZSxpc0J1ZixjaHVuayxlbmNvZGluZyxjYil7aWYoIWlzQnVmKXt2YXIgbmV3Q2h1bms9ZnVuY3Rpb24gZGVjb2RlQ2h1bmsoc3RhdGUsY2h1bmssZW5jb2Rpbmcpe3N0YXRlLm9iamVjdE1vZGV8fCExPT09c3RhdGUuZGVjb2RlU3RyaW5nc3x8InN0cmluZyIhPXR5cGVvZiBjaHVua3x8KGNodW5rPUJ1ZmZlci5mcm9tKGNodW5rLGVuY29kaW5nKSk7cmV0dXJuIGNodW5rfShzdGF0ZSxjaHVuayxlbmNvZGluZyk7Y2h1bmshPT1uZXdDaHVuayYmKGlzQnVmPSEwLGVuY29kaW5nPSJidWZmZXIiLGNodW5rPW5ld0NodW5rKX12YXIgbGVuPXN0YXRlLm9iamVjdE1vZGU/MTpjaHVuay5sZW5ndGg7c3RhdGUubGVuZ3RoKz1sZW47dmFyIHJldD1zdGF0ZS5sZW5ndGg8c3RhdGUuaGlnaFdhdGVyTWFyaztyZXR8fChzdGF0ZS5uZWVkRHJhaW49ITApO2lmKHN0YXRlLndyaXRpbmd8fHN0YXRlLmNvcmtlZCl7dmFyIGxhc3Q9c3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PXtjaHVuayxlbmNvZGluZyxpc0J1ZixjYWxsYmFjazpjYixuZXh0Om51bGx9LGxhc3Q/bGFzdC5uZXh0PXN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q6c3RhdGUuYnVmZmVyZWRSZXF1ZXN0PXN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Qsc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQrPTF9ZWxzZSBkb1dyaXRlKHN0cmVhbSxzdGF0ZSwhMSxsZW4sY2h1bmssZW5jb2RpbmcsY2IpO3JldHVybiByZXR9KHRoaXMsc3RhdGUsaXNCdWYsY2h1bmssZW5jb2RpbmcsY2IpKSxyZXR9LFdyaXRhYmxlLnByb3RvdHlwZS5jb3JrPWZ1bmN0aW9uKCl7dGhpcy5fd3JpdGFibGVTdGF0ZS5jb3JrZWQrK30sV3JpdGFibGUucHJvdG90eXBlLnVuY29yaz1mdW5jdGlvbigpe3ZhciBzdGF0ZT10aGlzLl93cml0YWJsZVN0YXRlO3N0YXRlLmNvcmtlZCYmKHN0YXRlLmNvcmtlZC0tLHN0YXRlLndyaXRpbmd8fHN0YXRlLmNvcmtlZHx8c3RhdGUuYnVmZmVyUHJvY2Vzc2luZ3x8IXN0YXRlLmJ1ZmZlcmVkUmVxdWVzdHx8Y2xlYXJCdWZmZXIodGhpcyxzdGF0ZSkpfSxXcml0YWJsZS5wcm90b3R5cGUuc2V0RGVmYXVsdEVuY29kaW5nPWZ1bmN0aW9uIHNldERlZmF1bHRFbmNvZGluZyhlbmNvZGluZyl7aWYoInN0cmluZyI9PXR5cGVvZiBlbmNvZGluZyYmKGVuY29kaW5nPWVuY29kaW5nLnRvTG93ZXJDYXNlKCkpLCEoWyJoZXgiLCJ1dGY4IiwidXRmLTgiLCJhc2NpaSIsImJpbmFyeSIsImJhc2U2NCIsInVjczIiLCJ1Y3MtMiIsInV0ZjE2bGUiLCJ1dGYtMTZsZSIsInJhdyJdLmluZGV4T2YoKGVuY29kaW5nKyIiKS50b0xvd2VyQ2FzZSgpKT4tMSkpdGhyb3cgbmV3IEVSUl9VTktOT1dOX0VOQ09ESU5HKGVuY29kaW5nKTtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2Rpbmc9ZW5jb2RpbmcsdGhpc30sT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLnByb3RvdHlwZSwid3JpdGFibGVCdWZmZXIiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSYmdGhpcy5fd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIoKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUucHJvdG90eXBlLCJ3cml0YWJsZUhpZ2hXYXRlck1hcmsiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfX0pLFdyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24oY2h1bmssZW5jb2RpbmcsY2Ipe2NiKG5ldyBFUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCgiX3dyaXRlKCkiKSl9LFdyaXRhYmxlLnByb3RvdHlwZS5fd3JpdGV2PW51bGwsV3JpdGFibGUucHJvdG90eXBlLmVuZD1mdW5jdGlvbihjaHVuayxlbmNvZGluZyxjYil7dmFyIHN0YXRlPXRoaXMuX3dyaXRhYmxlU3RhdGU7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGNodW5rPyhjYj1jaHVuayxjaHVuaz1udWxsLGVuY29kaW5nPW51bGwpOiJmdW5jdGlvbiI9PXR5cGVvZiBlbmNvZGluZyYmKGNiPWVuY29kaW5nLGVuY29kaW5nPW51bGwpLG51bGwhPWNodW5rJiZ0aGlzLndyaXRlKGNodW5rLGVuY29kaW5nKSxzdGF0ZS5jb3JrZWQmJihzdGF0ZS5jb3JrZWQ9MSx0aGlzLnVuY29yaygpKSxzdGF0ZS5lbmRpbmd8fGZ1bmN0aW9uIGVuZFdyaXRhYmxlKHN0cmVhbSxzdGF0ZSxjYil7c3RhdGUuZW5kaW5nPSEwLGZpbmlzaE1heWJlKHN0cmVhbSxzdGF0ZSksY2ImJihzdGF0ZS5maW5pc2hlZD9wcm9jZXNzLm5leHRUaWNrKGNiKTpzdHJlYW0ub25jZSgiZmluaXNoIixjYikpO3N0YXRlLmVuZGVkPSEwLHN0cmVhbS53cml0YWJsZT0hMX0odGhpcyxzdGF0ZSxjYiksdGhpc30sT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLnByb3RvdHlwZSwid3JpdGFibGVMZW5ndGgiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5sZW5ndGh9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLnByb3RvdHlwZSwiZGVzdHJveWVkIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuX3dyaXRhYmxlU3RhdGUmJnRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkfSxzZXQ6ZnVuY3Rpb24gc2V0KHZhbHVlKXt0aGlzLl93cml0YWJsZVN0YXRlJiYodGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ9dmFsdWUpfX0pLFdyaXRhYmxlLnByb3RvdHlwZS5kZXN0cm95PWRlc3Ryb3lJbXBsLmRlc3Ryb3ksV3JpdGFibGUucHJvdG90eXBlLl91bmRlc3Ryb3k9ZGVzdHJveUltcGwudW5kZXN0cm95LFdyaXRhYmxlLnByb3RvdHlwZS5fZGVzdHJveT1mdW5jdGlvbihlcnIsY2Ipe2NiKGVycil9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvYXN5bmNfaXRlcmF0b3IuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBfT2JqZWN0JHNldFByb3RvdHlwZU8scHJvY2Vzcz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbm9kZS1zdGRsaWItYnJvd3Nlci9janMvcHJveHkvcHJvY2Vzcy5qcyIpO2Z1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosa2V5LHZhbHVlKXtyZXR1cm4oa2V5PWZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KGFyZyl7dmFyIGtleT1mdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsaGludCl7aWYoIm9iamVjdCIhPXR5cGVvZiBpbnB1dHx8bnVsbD09PWlucHV0KXJldHVybiBpbnB1dDt2YXIgcHJpbT1pbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdO2lmKHZvaWQgMCE9PXByaW0pe3ZhciByZXM9cHJpbS5jYWxsKGlucHV0LGhpbnR8fCJkZWZhdWx0Iik7aWYoIm9iamVjdCIhPXR5cGVvZiByZXMpcmV0dXJuIHJlczt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybigic3RyaW5nIj09PWhpbnQ/U3RyaW5nOk51bWJlcikoaW5wdXQpfShhcmcsInN0cmluZyIpO3JldHVybiJzeW1ib2wiPT10eXBlb2Yga2V5P2tleTpTdHJpbmcoa2V5KX0oa2V5KSlpbiBvYmo/T2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaixrZXkse3ZhbHVlLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6b2JqW2tleV09dmFsdWUsb2JqfXZhciBmaW5pc2hlZD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9lbmQtb2Ytc3RyZWFtLmpzIiksa0xhc3RSZXNvbHZlPVN5bWJvbCgibGFzdFJlc29sdmUiKSxrTGFzdFJlamVjdD1TeW1ib2woImxhc3RSZWplY3QiKSxrRXJyb3I9U3ltYm9sKCJlcnJvciIpLGtFbmRlZD1TeW1ib2woImVuZGVkIiksa0xhc3RQcm9taXNlPVN5bWJvbCgibGFzdFByb21pc2UiKSxrSGFuZGxlUHJvbWlzZT1TeW1ib2woImhhbmRsZVByb21pc2UiKSxrU3RyZWFtPVN5bWJvbCgic3RyZWFtIik7ZnVuY3Rpb24gY3JlYXRlSXRlclJlc3VsdCh2YWx1ZSxkb25lKXtyZXR1cm57dmFsdWUsZG9uZX19ZnVuY3Rpb24gcmVhZEFuZFJlc29sdmUoaXRlcil7dmFyIHJlc29sdmU9aXRlcltrTGFzdFJlc29sdmVdO2lmKG51bGwhPT1yZXNvbHZlKXt2YXIgZGF0YT1pdGVyW2tTdHJlYW1dLnJlYWQoKTtudWxsIT09ZGF0YSYmKGl0ZXJba0xhc3RQcm9taXNlXT1udWxsLGl0ZXJba0xhc3RSZXNvbHZlXT1udWxsLGl0ZXJba0xhc3RSZWplY3RdPW51bGwscmVzb2x2ZShjcmVhdGVJdGVyUmVzdWx0KGRhdGEsITEpKSl9fWZ1bmN0aW9uIG9uUmVhZGFibGUoaXRlcil7cHJvY2Vzcy5uZXh0VGljayhyZWFkQW5kUmVzb2x2ZSxpdGVyKX12YXIgQXN5bmNJdGVyYXRvclByb3RvdHlwZT1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZnVuY3Rpb24oKXt9KSxSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3JQcm90b3R5cGU9T2JqZWN0LnNldFByb3RvdHlwZU9mKChfZGVmaW5lUHJvcGVydHkoX09iamVjdCRzZXRQcm90b3R5cGVPPXtnZXQgc3RyZWFtKCl7cmV0dXJuIHRoaXNba1N0cmVhbV19LG5leHQ6ZnVuY3Rpb24gbmV4dCgpe3ZhciBfdGhpcz10aGlzLGVycm9yPXRoaXNba0Vycm9yXTtpZihudWxsIT09ZXJyb3IpcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtpZih0aGlzW2tFbmRlZF0pcmV0dXJuIFByb21pc2UucmVzb2x2ZShjcmVhdGVJdGVyUmVzdWx0KHZvaWQgMCwhMCkpO2lmKHRoaXNba1N0cmVhbV0uZGVzdHJveWVkKXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLHJlamVjdCl7cHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpe190aGlzW2tFcnJvcl0/cmVqZWN0KF90aGlzW2tFcnJvcl0pOnJlc29sdmUoY3JlYXRlSXRlclJlc3VsdCh2b2lkIDAsITApKX0pfSk7dmFyIHByb21pc2UsbGFzdFByb21pc2U9dGhpc1trTGFzdFByb21pc2VdO2lmKGxhc3RQcm9taXNlKXByb21pc2U9bmV3IFByb21pc2UoZnVuY3Rpb24gd3JhcEZvck5leHQobGFzdFByb21pc2UsaXRlcil7cmV0dXJuIGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXtsYXN0UHJvbWlzZS50aGVuKGZ1bmN0aW9uKCl7aXRlcltrRW5kZWRdP3Jlc29sdmUoY3JlYXRlSXRlclJlc3VsdCh2b2lkIDAsITApKTppdGVyW2tIYW5kbGVQcm9taXNlXShyZXNvbHZlLHJlamVjdCl9LHJlamVjdCl9fShsYXN0UHJvbWlzZSx0aGlzKSk7ZWxzZXt2YXIgZGF0YT10aGlzW2tTdHJlYW1dLnJlYWQoKTtpZihudWxsIT09ZGF0YSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNyZWF0ZUl0ZXJSZXN1bHQoZGF0YSwhMSkpO3Byb21pc2U9bmV3IFByb21pc2UodGhpc1trSGFuZGxlUHJvbWlzZV0pfXJldHVybiB0aGlzW2tMYXN0UHJvbWlzZV09cHJvbWlzZSxwcm9taXNlfX0sU3ltYm9sLmFzeW5jSXRlcmF0b3IsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JHNldFByb3RvdHlwZU8sInJldHVybiIsZnVuY3Rpb24gX3JldHVybigpe3ZhciBfdGhpczI9dGhpcztyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSxyZWplY3Qpe190aGlzMltrU3RyZWFtXS5kZXN0cm95KG51bGwsZnVuY3Rpb24oZXJyKXtlcnI/cmVqZWN0KGVycik6cmVzb2x2ZShjcmVhdGVJdGVyUmVzdWx0KHZvaWQgMCwhMCkpfSl9KX0pLF9PYmplY3Qkc2V0UHJvdG90eXBlTyksQXN5bmNJdGVyYXRvclByb3RvdHlwZSk7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24gY3JlYXRlUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yKHN0cmVhbSl7dmFyIF9PYmplY3QkY3JlYXRlLGl0ZXJhdG9yPU9iamVjdC5jcmVhdGUoUmVhZGFibGVTdHJlYW1Bc3luY0l0ZXJhdG9yUHJvdG90eXBlLChfZGVmaW5lUHJvcGVydHkoX09iamVjdCRjcmVhdGU9e30sa1N0cmVhbSx7dmFsdWU6c3RyZWFtLHdyaXRhYmxlOiEwfSksX2RlZmluZVByb3BlcnR5KF9PYmplY3QkY3JlYXRlLGtMYXN0UmVzb2x2ZSx7dmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JGNyZWF0ZSxrTGFzdFJlamVjdCx7dmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JGNyZWF0ZSxrRXJyb3Ise3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KSxfZGVmaW5lUHJvcGVydHkoX09iamVjdCRjcmVhdGUsa0VuZGVkLHt2YWx1ZTpzdHJlYW0uX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCx3cml0YWJsZTohMH0pLF9kZWZpbmVQcm9wZXJ0eShfT2JqZWN0JGNyZWF0ZSxrSGFuZGxlUHJvbWlzZSx7dmFsdWU6ZnVuY3Rpb24gdmFsdWUocmVzb2x2ZSxyZWplY3Qpe3ZhciBkYXRhPWl0ZXJhdG9yW2tTdHJlYW1dLnJlYWQoKTtkYXRhPyhpdGVyYXRvcltrTGFzdFByb21pc2VdPW51bGwsaXRlcmF0b3Jba0xhc3RSZXNvbHZlXT1udWxsLGl0ZXJhdG9yW2tMYXN0UmVqZWN0XT1udWxsLHJlc29sdmUoY3JlYXRlSXRlclJlc3VsdChkYXRhLCExKSkpOihpdGVyYXRvcltrTGFzdFJlc29sdmVdPXJlc29sdmUsaXRlcmF0b3Jba0xhc3RSZWplY3RdPXJlamVjdCl9LHdyaXRhYmxlOiEwfSksX09iamVjdCRjcmVhdGUpKTtyZXR1cm4gaXRlcmF0b3Jba0xhc3RQcm9taXNlXT1udWxsLGZpbmlzaGVkKHN0cmVhbSxmdW5jdGlvbihlcnIpe2lmKGVyciYmIkVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFIiE9PWVyci5jb2RlKXt2YXIgcmVqZWN0PWl0ZXJhdG9yW2tMYXN0UmVqZWN0XTtyZXR1cm4gbnVsbCE9PXJlamVjdCYmKGl0ZXJhdG9yW2tMYXN0UHJvbWlzZV09bnVsbCxpdGVyYXRvcltrTGFzdFJlc29sdmVdPW51bGwsaXRlcmF0b3Jba0xhc3RSZWplY3RdPW51bGwscmVqZWN0KGVycikpLHZvaWQoaXRlcmF0b3Jba0Vycm9yXT1lcnIpfXZhciByZXNvbHZlPWl0ZXJhdG9yW2tMYXN0UmVzb2x2ZV07bnVsbCE9PXJlc29sdmUmJihpdGVyYXRvcltrTGFzdFByb21pc2VdPW51bGwsaXRlcmF0b3Jba0xhc3RSZXNvbHZlXT1udWxsLGl0ZXJhdG9yW2tMYXN0UmVqZWN0XT1udWxsLHJlc29sdmUoY3JlYXRlSXRlclJlc3VsdCh2b2lkIDAsITApKSksaXRlcmF0b3Jba0VuZGVkXT0hMH0pLHN0cmVhbS5vbigicmVhZGFibGUiLG9uUmVhZGFibGUuYmluZChudWxsLGl0ZXJhdG9yKSksaXRlcmF0b3J9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvYnVmZmVyX2xpc3QuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG93bktleXMob2JqZWN0LGVudW1lcmFibGVPbmx5KXt2YXIga2V5cz1PYmplY3Qua2V5cyhvYmplY3QpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBzeW1ib2xzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTtlbnVtZXJhYmxlT25seSYmKHN5bWJvbHM9c3ltYm9scy5maWx0ZXIoZnVuY3Rpb24oc3ltKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3Qsc3ltKS5lbnVtZXJhYmxlfSkpLGtleXMucHVzaC5hcHBseShrZXlzLHN5bWJvbHMpfXJldHVybiBrZXlzfWZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KXtmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXt2YXIgc291cmNlPW51bGwhPWFyZ3VtZW50c1tpXT9hcmd1bWVudHNbaV06e307aSUyP293bktleXMoT2JqZWN0KHNvdXJjZSksITApLmZvckVhY2goZnVuY3Rpb24oa2V5KXtfZGVmaW5lUHJvcGVydHkodGFyZ2V0LGtleSxzb3VyY2Vba2V5XSl9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk6b3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbihrZXkpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsa2V5LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLGtleSkpfSl9cmV0dXJuIHRhcmdldH1mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLGtleSx2YWx1ZSl7cmV0dXJuKGtleT1fdG9Qcm9wZXJ0eUtleShrZXkpKWluIG9iaj9PYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLGtleSx7dmFsdWUsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTpvYmpba2V5XT12YWx1ZSxvYmp9ZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fCExLGRlc2NyaXB0b3IuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBkZXNjcmlwdG9yJiYoZGVzY3JpcHRvci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxfdG9Qcm9wZXJ0eUtleShkZXNjcmlwdG9yLmtleSksZGVzY3JpcHRvcil9fWZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KGFyZyl7dmFyIGtleT1mdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsaGludCl7aWYoIm9iamVjdCIhPXR5cGVvZiBpbnB1dHx8bnVsbD09PWlucHV0KXJldHVybiBpbnB1dDt2YXIgcHJpbT1pbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdO2lmKHZvaWQgMCE9PXByaW0pe3ZhciByZXM9cHJpbS5jYWxsKGlucHV0LGhpbnR8fCJkZWZhdWx0Iik7aWYoIm9iamVjdCIhPXR5cGVvZiByZXMpcmV0dXJuIHJlczt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybigic3RyaW5nIj09PWhpbnQ/U3RyaW5nOk51bWJlcikoaW5wdXQpfShhcmcsInN0cmluZyIpO3JldHVybiJzeW1ib2wiPT10eXBlb2Yga2V5P2tleTpTdHJpbmcoa2V5KX12YXIgQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiKS5CdWZmZXIsaW5zcGVjdD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvdXRpbC91dGlsLmpzIikuaW5zcGVjdCxjdXN0b209aW5zcGVjdCYmaW5zcGVjdC5jdXN0b218fCJpbnNwZWN0IjtmdW5jdGlvbiBjb3B5QnVmZmVyKHNyYyx0YXJnZXQsb2Zmc2V0KXtCdWZmZXIucHJvdG90eXBlLmNvcHkuY2FsbChzcmMsdGFyZ2V0LG9mZnNldCl9bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBCdWZmZXJMaXN0KCl7IWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSxDb25zdHJ1Y3Rvcil7aWYoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyxCdWZmZXJMaXN0KSx0aGlzLmhlYWQ9bnVsbCx0aGlzLnRhaWw9bnVsbCx0aGlzLmxlbmd0aD0wfXJldHVybiBmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IscHJvdG9Qcm9wcyxzdGF0aWNQcm9wcyl7cmV0dXJuIHByb3RvUHJvcHMmJl9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSxwcm90b1Byb3BzKSxzdGF0aWNQcm9wcyYmX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSxDb25zdHJ1Y3Rvcn0oQnVmZmVyTGlzdCxbe2tleToicHVzaCIsdmFsdWU6ZnVuY3Rpb24gcHVzaCh2KXt2YXIgZW50cnk9e2RhdGE6dixuZXh0Om51bGx9O3RoaXMubGVuZ3RoPjA/dGhpcy50YWlsLm5leHQ9ZW50cnk6dGhpcy5oZWFkPWVudHJ5LHRoaXMudGFpbD1lbnRyeSwrK3RoaXMubGVuZ3RofX0se2tleToidW5zaGlmdCIsdmFsdWU6ZnVuY3Rpb24gdW5zaGlmdCh2KXt2YXIgZW50cnk9e2RhdGE6dixuZXh0OnRoaXMuaGVhZH07MD09PXRoaXMubGVuZ3RoJiYodGhpcy50YWlsPWVudHJ5KSx0aGlzLmhlYWQ9ZW50cnksKyt0aGlzLmxlbmd0aH19LHtrZXk6InNoaWZ0Iix2YWx1ZTpmdW5jdGlvbiBzaGlmdCgpe2lmKDAhPT10aGlzLmxlbmd0aCl7dmFyIHJldD10aGlzLmhlYWQuZGF0YTtyZXR1cm4gMT09PXRoaXMubGVuZ3RoP3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbDp0aGlzLmhlYWQ9dGhpcy5oZWFkLm5leHQsLS10aGlzLmxlbmd0aCxyZXR9fX0se2tleToiY2xlYXIiLHZhbHVlOmZ1bmN0aW9uIGNsZWFyKCl7dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsLHRoaXMubGVuZ3RoPTB9fSx7a2V5OiJqb2luIix2YWx1ZTpmdW5jdGlvbiBqb2luKHMpe2lmKDA9PT10aGlzLmxlbmd0aClyZXR1cm4iIjtmb3IodmFyIHA9dGhpcy5oZWFkLHJldD0iIitwLmRhdGE7cD1wLm5leHQ7KXJldCs9cytwLmRhdGE7cmV0dXJuIHJldH19LHtrZXk6ImNvbmNhdCIsdmFsdWU6ZnVuY3Rpb24gY29uY2F0KG4pe2lmKDA9PT10aGlzLmxlbmd0aClyZXR1cm4gQnVmZmVyLmFsbG9jKDApO2Zvcih2YXIgcmV0PUJ1ZmZlci5hbGxvY1Vuc2FmZShuPj4+MCkscD10aGlzLmhlYWQsaT0wO3A7KWNvcHlCdWZmZXIocC5kYXRhLHJldCxpKSxpKz1wLmRhdGEubGVuZ3RoLHA9cC5uZXh0O3JldHVybiByZXR9fSx7a2V5OiJjb25zdW1lIix2YWx1ZTpmdW5jdGlvbiBjb25zdW1lKG4saGFzU3RyaW5ncyl7dmFyIHJldDtyZXR1cm4gbjx0aGlzLmhlYWQuZGF0YS5sZW5ndGg/KHJldD10aGlzLmhlYWQuZGF0YS5zbGljZSgwLG4pLHRoaXMuaGVhZC5kYXRhPXRoaXMuaGVhZC5kYXRhLnNsaWNlKG4pKTpyZXQ9bj09PXRoaXMuaGVhZC5kYXRhLmxlbmd0aD90aGlzLnNoaWZ0KCk6aGFzU3RyaW5ncz90aGlzLl9nZXRTdHJpbmcobik6dGhpcy5fZ2V0QnVmZmVyKG4pLHJldH19LHtrZXk6ImZpcnN0Iix2YWx1ZTpmdW5jdGlvbiBmaXJzdCgpe3JldHVybiB0aGlzLmhlYWQuZGF0YX19LHtrZXk6Il9nZXRTdHJpbmciLHZhbHVlOmZ1bmN0aW9uIF9nZXRTdHJpbmcobil7dmFyIHA9dGhpcy5oZWFkLGM9MSxyZXQ9cC5kYXRhO2ZvcihuLT1yZXQubGVuZ3RoO3A9cC5uZXh0Oyl7dmFyIHN0cj1wLmRhdGEsbmI9bj5zdHIubGVuZ3RoP3N0ci5sZW5ndGg6bjtpZihuYj09PXN0ci5sZW5ndGg/cmV0Kz1zdHI6cmV0Kz1zdHIuc2xpY2UoMCxuKSwwPT09KG4tPW5iKSl7bmI9PT1zdHIubGVuZ3RoPygrK2MscC5uZXh0P3RoaXMuaGVhZD1wLm5leHQ6dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsKToodGhpcy5oZWFkPXAscC5kYXRhPXN0ci5zbGljZShuYikpO2JyZWFrfSsrY31yZXR1cm4gdGhpcy5sZW5ndGgtPWMscmV0fX0se2tleToiX2dldEJ1ZmZlciIsdmFsdWU6ZnVuY3Rpb24gX2dldEJ1ZmZlcihuKXt2YXIgcmV0PUJ1ZmZlci5hbGxvY1Vuc2FmZShuKSxwPXRoaXMuaGVhZCxjPTE7Zm9yKHAuZGF0YS5jb3B5KHJldCksbi09cC5kYXRhLmxlbmd0aDtwPXAubmV4dDspe3ZhciBidWY9cC5kYXRhLG5iPW4+YnVmLmxlbmd0aD9idWYubGVuZ3RoOm47aWYoYnVmLmNvcHkocmV0LHJldC5sZW5ndGgtbiwwLG5iKSwwPT09KG4tPW5iKSl7bmI9PT1idWYubGVuZ3RoPygrK2MscC5uZXh0P3RoaXMuaGVhZD1wLm5leHQ6dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsKToodGhpcy5oZWFkPXAscC5kYXRhPWJ1Zi5zbGljZShuYikpO2JyZWFrfSsrY31yZXR1cm4gdGhpcy5sZW5ndGgtPWMscmV0fX0se2tleTpjdXN0b20sdmFsdWU6ZnVuY3Rpb24gdmFsdWUoXyxvcHRpb25zKXtyZXR1cm4gaW5zcGVjdCh0aGlzLF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSxvcHRpb25zKSx7fSx7ZGVwdGg6MCxjdXN0b21JbnNwZWN0OiExfSkpfX1dKSxCdWZmZXJMaXN0fSgpfSwiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZGVzdHJveS5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIHByb2Nlc3M9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL25vZGUtc3RkbGliLWJyb3dzZXIvY2pzL3Byb3h5L3Byb2Nlc3MuanMiKTtmdW5jdGlvbiBlbWl0RXJyb3JBbmRDbG9zZU5UKHNlbGYsZXJyKXtlbWl0RXJyb3JOVChzZWxmLGVyciksZW1pdENsb3NlTlQoc2VsZil9ZnVuY3Rpb24gZW1pdENsb3NlTlQoc2VsZil7c2VsZi5fd3JpdGFibGVTdGF0ZSYmIXNlbGYuX3dyaXRhYmxlU3RhdGUuZW1pdENsb3NlfHxzZWxmLl9yZWFkYWJsZVN0YXRlJiYhc2VsZi5fcmVhZGFibGVTdGF0ZS5lbWl0Q2xvc2V8fHNlbGYuZW1pdCgiY2xvc2UiKX1mdW5jdGlvbiBlbWl0RXJyb3JOVChzZWxmLGVycil7c2VsZi5lbWl0KCJlcnJvciIsZXJyKX1tb2R1bGUuZXhwb3J0cz17ZGVzdHJveTpmdW5jdGlvbiBkZXN0cm95KGVycixjYil7dmFyIF90aGlzPXRoaXMscmVhZGFibGVEZXN0cm95ZWQ9dGhpcy5fcmVhZGFibGVTdGF0ZSYmdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQsd3JpdGFibGVEZXN0cm95ZWQ9dGhpcy5fd3JpdGFibGVTdGF0ZSYmdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ7cmV0dXJuIHJlYWRhYmxlRGVzdHJveWVkfHx3cml0YWJsZURlc3Ryb3llZD8oY2I/Y2IoZXJyKTplcnImJih0aGlzLl93cml0YWJsZVN0YXRlP3RoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkfHwodGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITAscHJvY2Vzcy5uZXh0VGljayhlbWl0RXJyb3JOVCx0aGlzLGVycikpOnByb2Nlc3MubmV4dFRpY2soZW1pdEVycm9yTlQsdGhpcyxlcnIpKSx0aGlzKToodGhpcy5fcmVhZGFibGVTdGF0ZSYmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkPSEwKSx0aGlzLl93cml0YWJsZVN0YXRlJiYodGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ9ITApLHRoaXMuX2Rlc3Ryb3koZXJyfHxudWxsLGZ1bmN0aW9uKGVycil7IWNiJiZlcnI/X3RoaXMuX3dyaXRhYmxlU3RhdGU/X3RoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkP3Byb2Nlc3MubmV4dFRpY2soZW1pdENsb3NlTlQsX3RoaXMpOihfdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITAscHJvY2Vzcy5uZXh0VGljayhlbWl0RXJyb3JBbmRDbG9zZU5ULF90aGlzLGVycikpOnByb2Nlc3MubmV4dFRpY2soZW1pdEVycm9yQW5kQ2xvc2VOVCxfdGhpcyxlcnIpOmNiPyhwcm9jZXNzLm5leHRUaWNrKGVtaXRDbG9zZU5ULF90aGlzKSxjYihlcnIpKTpwcm9jZXNzLm5leHRUaWNrKGVtaXRDbG9zZU5ULF90aGlzKX0pLHRoaXMpfSx1bmRlc3Ryb3k6ZnVuY3Rpb24gdW5kZXN0cm95KCl7dGhpcy5fcmVhZGFibGVTdGF0ZSYmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkPSExLHRoaXMuX3JlYWRhYmxlU3RhdGUucmVhZGluZz0hMSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZGVkPSExLHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZD0hMSksdGhpcy5fd3JpdGFibGVTdGF0ZSYmKHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQ9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRpbmc9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5hbENhbGxlZD0hMSx0aGlzLl93cml0YWJsZVN0YXRlLnByZWZpbmlzaGVkPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQ9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITEpfSxlcnJvck9yRGVzdHJveTpmdW5jdGlvbiBlcnJvck9yRGVzdHJveShzdHJlYW0sZXJyKXt2YXIgclN0YXRlPXN0cmVhbS5fcmVhZGFibGVTdGF0ZSx3U3RhdGU9c3RyZWFtLl93cml0YWJsZVN0YXRlO3JTdGF0ZSYmclN0YXRlLmF1dG9EZXN0cm95fHx3U3RhdGUmJndTdGF0ZS5hdXRvRGVzdHJveT9zdHJlYW0uZGVzdHJveShlcnIpOnN0cmVhbS5lbWl0KCJlcnJvciIsZXJyKX19fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZW5kLW9mLXN0cmVhbS5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIEVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2Vycm9ycy1icm93c2VyLmpzIikuRi5FUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRTtmdW5jdGlvbiBub29wKCl7fW1vZHVsZS5leHBvcnRzPWZ1bmN0aW9uIGVvcyhzdHJlYW0sb3B0cyxjYWxsYmFjayl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG9wdHMpcmV0dXJuIGVvcyhzdHJlYW0sbnVsbCxvcHRzKTtvcHRzfHwob3B0cz17fSksY2FsbGJhY2s9ZnVuY3Rpb24gb25jZShjYWxsYmFjayl7dmFyIGNhbGxlZD0hMTtyZXR1cm4gZnVuY3Rpb24oKXtpZighY2FsbGVkKXtjYWxsZWQ9ITA7Zm9yKHZhciBfbGVuPWFyZ3VtZW50cy5sZW5ndGgsYXJncz1uZXcgQXJyYXkoX2xlbiksX2tleT0wO19rZXk8X2xlbjtfa2V5KyspYXJnc1tfa2V5XT1hcmd1bWVudHNbX2tleV07Y2FsbGJhY2suYXBwbHkodGhpcyxhcmdzKX19fShjYWxsYmFja3x8bm9vcCk7dmFyIHJlYWRhYmxlPW9wdHMucmVhZGFibGV8fCExIT09b3B0cy5yZWFkYWJsZSYmc3RyZWFtLnJlYWRhYmxlLHdyaXRhYmxlPW9wdHMud3JpdGFibGV8fCExIT09b3B0cy53cml0YWJsZSYmc3RyZWFtLndyaXRhYmxlLG9ubGVnYWN5ZmluaXNoPWZ1bmN0aW9uIG9ubGVnYWN5ZmluaXNoKCl7c3RyZWFtLndyaXRhYmxlfHxvbmZpbmlzaCgpfSx3cml0YWJsZUVuZGVkPXN0cmVhbS5fd3JpdGFibGVTdGF0ZSYmc3RyZWFtLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkLG9uZmluaXNoPWZ1bmN0aW9uIG9uZmluaXNoKCl7d3JpdGFibGU9ITEsd3JpdGFibGVFbmRlZD0hMCxyZWFkYWJsZXx8Y2FsbGJhY2suY2FsbChzdHJlYW0pfSxyZWFkYWJsZUVuZGVkPXN0cmVhbS5fcmVhZGFibGVTdGF0ZSYmc3RyZWFtLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQsb25lbmQ9ZnVuY3Rpb24gb25lbmQoKXtyZWFkYWJsZT0hMSxyZWFkYWJsZUVuZGVkPSEwLHdyaXRhYmxlfHxjYWxsYmFjay5jYWxsKHN0cmVhbSl9LG9uZXJyb3I9ZnVuY3Rpb24gb25lcnJvcihlcnIpe2NhbGxiYWNrLmNhbGwoc3RyZWFtLGVycil9LG9uY2xvc2U9ZnVuY3Rpb24gb25jbG9zZSgpe3ZhciBlcnI7cmV0dXJuIHJlYWRhYmxlJiYhcmVhZGFibGVFbmRlZD8oc3RyZWFtLl9yZWFkYWJsZVN0YXRlJiZzdHJlYW0uX3JlYWRhYmxlU3RhdGUuZW5kZWR8fChlcnI9bmV3IEVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFKSxjYWxsYmFjay5jYWxsKHN0cmVhbSxlcnIpKTp3cml0YWJsZSYmIXdyaXRhYmxlRW5kZWQ/KHN0cmVhbS5fd3JpdGFibGVTdGF0ZSYmc3RyZWFtLl93cml0YWJsZVN0YXRlLmVuZGVkfHwoZXJyPW5ldyBFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRSksY2FsbGJhY2suY2FsbChzdHJlYW0sZXJyKSk6dm9pZCAwfSxvbnJlcXVlc3Q9ZnVuY3Rpb24gb25yZXF1ZXN0KCl7c3RyZWFtLnJlcS5vbigiZmluaXNoIixvbmZpbmlzaCl9O3JldHVybiFmdW5jdGlvbiBpc1JlcXVlc3Qoc3RyZWFtKXtyZXR1cm4gc3RyZWFtLnNldEhlYWRlciYmImZ1bmN0aW9uIj09dHlwZW9mIHN0cmVhbS5hYm9ydH0oc3RyZWFtKT93cml0YWJsZSYmIXN0cmVhbS5fd3JpdGFibGVTdGF0ZSYmKHN0cmVhbS5vbigiZW5kIixvbmxlZ2FjeWZpbmlzaCksc3RyZWFtLm9uKCJjbG9zZSIsb25sZWdhY3lmaW5pc2gpKTooc3RyZWFtLm9uKCJjb21wbGV0ZSIsb25maW5pc2gpLHN0cmVhbS5vbigiYWJvcnQiLG9uY2xvc2UpLHN0cmVhbS5yZXE/b25yZXF1ZXN0KCk6c3RyZWFtLm9uKCJyZXF1ZXN0IixvbnJlcXVlc3QpKSxzdHJlYW0ub24oImVuZCIsb25lbmQpLHN0cmVhbS5vbigiZmluaXNoIixvbmZpbmlzaCksITEhPT1vcHRzLmVycm9yJiZzdHJlYW0ub24oImVycm9yIixvbmVycm9yKSxzdHJlYW0ub24oImNsb3NlIixvbmNsb3NlKSxmdW5jdGlvbigpe3N0cmVhbS5yZW1vdmVMaXN0ZW5lcigiY29tcGxldGUiLG9uZmluaXNoKSxzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoImFib3J0IixvbmNsb3NlKSxzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoInJlcXVlc3QiLG9ucmVxdWVzdCksc3RyZWFtLnJlcSYmc3RyZWFtLnJlcS5yZW1vdmVMaXN0ZW5lcigiZmluaXNoIixvbmZpbmlzaCksc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCJlbmQiLG9ubGVnYWN5ZmluaXNoKSxzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixvbmxlZ2FjeWZpbmlzaCksc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCJmaW5pc2giLG9uZmluaXNoKSxzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoImVuZCIsb25lbmQpLHN0cmVhbS5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLG9uZXJyb3IpLHN0cmVhbS5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLG9uY2xvc2UpfX19LCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9mcm9tLWJyb3dzZXIuanMiKG1vZHVsZSl7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIlJlYWRhYmxlLmZyb20gaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgYnJvd3NlciIpfX0sIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3BpcGVsaW5lLmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgZW9zO3ZhciBfcmVxdWlyZSRjb2Rlcz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9lcnJvcnMtYnJvd3Nlci5qcyIpLkYsRVJSX01JU1NJTkdfQVJHUz1fcmVxdWlyZSRjb2Rlcy5FUlJfTUlTU0lOR19BUkdTLEVSUl9TVFJFQU1fREVTVFJPWUVEPV9yZXF1aXJlJGNvZGVzLkVSUl9TVFJFQU1fREVTVFJPWUVEO2Z1bmN0aW9uIG5vb3AoZXJyKXtpZihlcnIpdGhyb3cgZXJyfWZ1bmN0aW9uIGNhbGwoZm4pe2ZuKCl9ZnVuY3Rpb24gcGlwZShmcm9tLHRvKXtyZXR1cm4gZnJvbS5waXBlKHRvKX1tb2R1bGUuZXhwb3J0cz1mdW5jdGlvbiBwaXBlbGluZSgpe2Zvcih2YXIgX2xlbj1hcmd1bWVudHMubGVuZ3RoLHN0cmVhbXM9bmV3IEFycmF5KF9sZW4pLF9rZXk9MDtfa2V5PF9sZW47X2tleSsrKXN0cmVhbXNbX2tleV09YXJndW1lbnRzW19rZXldO3ZhciBlcnJvcixjYWxsYmFjaz1mdW5jdGlvbiBwb3BDYWxsYmFjayhzdHJlYW1zKXtyZXR1cm4gc3RyZWFtcy5sZW5ndGg/ImZ1bmN0aW9uIiE9dHlwZW9mIHN0cmVhbXNbc3RyZWFtcy5sZW5ndGgtMV0/bm9vcDpzdHJlYW1zLnBvcCgpOm5vb3B9KHN0cmVhbXMpO2lmKEFycmF5LmlzQXJyYXkoc3RyZWFtc1swXSkmJihzdHJlYW1zPXN0cmVhbXNbMF0pLHN0cmVhbXMubGVuZ3RoPDIpdGhyb3cgbmV3IEVSUl9NSVNTSU5HX0FSR1MoInN0cmVhbXMiKTt2YXIgZGVzdHJveXM9c3RyZWFtcy5tYXAoZnVuY3Rpb24oc3RyZWFtLGkpe3ZhciByZWFkaW5nPWk8c3RyZWFtcy5sZW5ndGgtMTtyZXR1cm4gZnVuY3Rpb24gZGVzdHJveWVyKHN0cmVhbSxyZWFkaW5nLHdyaXRpbmcsY2FsbGJhY2spe2NhbGxiYWNrPWZ1bmN0aW9uIG9uY2UoY2FsbGJhY2spe3ZhciBjYWxsZWQ9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7Y2FsbGVkfHwoY2FsbGVkPSEwLGNhbGxiYWNrLmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpKX19KGNhbGxiYWNrKTt2YXIgY2xvc2VkPSExO3N0cmVhbS5vbigiY2xvc2UiLGZ1bmN0aW9uKCl7Y2xvc2VkPSEwfSksdm9pZCAwPT09ZW9zJiYoZW9zPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2VuZC1vZi1zdHJlYW0uanMiKSksZW9zKHN0cmVhbSx7cmVhZGFibGU6cmVhZGluZyx3cml0YWJsZTp3cml0aW5nfSxmdW5jdGlvbihlcnIpe2lmKGVycilyZXR1cm4gY2FsbGJhY2soZXJyKTtjbG9zZWQ9ITAsY2FsbGJhY2soKX0pO3ZhciBkZXN0cm95ZWQ9ITE7cmV0dXJuIGZ1bmN0aW9uKGVycil7aWYoIWNsb3NlZCYmIWRlc3Ryb3llZClyZXR1cm4gZGVzdHJveWVkPSEwLGZ1bmN0aW9uIGlzUmVxdWVzdChzdHJlYW0pe3JldHVybiBzdHJlYW0uc2V0SGVhZGVyJiYiZnVuY3Rpb24iPT10eXBlb2Ygc3RyZWFtLmFib3J0fShzdHJlYW0pP3N0cmVhbS5hYm9ydCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBzdHJlYW0uZGVzdHJveT9zdHJlYW0uZGVzdHJveSgpOnZvaWQgY2FsbGJhY2soZXJyfHxuZXcgRVJSX1NUUkVBTV9ERVNUUk9ZRUQoInBpcGUiKSl9fShzdHJlYW0scmVhZGluZyxpPjAsZnVuY3Rpb24oZXJyKXtlcnJvcnx8KGVycm9yPWVyciksZXJyJiZkZXN0cm95cy5mb3JFYWNoKGNhbGwpLHJlYWRpbmd8fChkZXN0cm95cy5mb3JFYWNoKGNhbGwpLGNhbGxiYWNrKGVycm9yKSl9KX0pO3JldHVybiBzdHJlYW1zLnJlZHVjZShwaXBlKX19LCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9zdGF0ZS5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIEVSUl9JTlZBTElEX09QVF9WQUxVRT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9lcnJvcnMtYnJvd3Nlci5qcyIpLkYuRVJSX0lOVkFMSURfT1BUX1ZBTFVFO21vZHVsZS5leHBvcnRzPXtnZXRIaWdoV2F0ZXJNYXJrOmZ1bmN0aW9uIGdldEhpZ2hXYXRlck1hcmsoc3RhdGUsb3B0aW9ucyxkdXBsZXhLZXksaXNEdXBsZXgpe3ZhciBod209ZnVuY3Rpb24gaGlnaFdhdGVyTWFya0Zyb20ob3B0aW9ucyxpc0R1cGxleCxkdXBsZXhLZXkpe3JldHVybiBudWxsIT1vcHRpb25zLmhpZ2hXYXRlck1hcms/b3B0aW9ucy5oaWdoV2F0ZXJNYXJrOmlzRHVwbGV4P29wdGlvbnNbZHVwbGV4S2V5XTpudWxsfShvcHRpb25zLGlzRHVwbGV4LGR1cGxleEtleSk7aWYobnVsbCE9aHdtKXtpZighaXNGaW5pdGUoaHdtKXx8TWF0aC5mbG9vcihod20pIT09aHdtfHxod208MCl0aHJvdyBuZXcgRVJSX0lOVkFMSURfT1BUX1ZBTFVFKGlzRHVwbGV4P2R1cGxleEtleToiaGlnaFdhdGVyTWFyayIsaHdtKTtyZXR1cm4gTWF0aC5mbG9vcihod20pfXJldHVybiBzdGF0ZS5vYmplY3RNb2RlPzE2OjE2Mzg0fX19LCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9zdHJlYW0tYnJvd3Nlci5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXttb2R1bGUuZXhwb3J0cz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIpLkV2ZW50RW1pdHRlcn0sIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL3JlYWRhYmxlLWJyb3dzZXIuanMiKG1vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyhleHBvcnRzPW1vZHVsZS5leHBvcnRzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzIikpLlN0cmVhbT1leHBvcnRzLGV4cG9ydHMuUmVhZGFibGU9ZXhwb3J0cyxleHBvcnRzLldyaXRhYmxlPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzIiksZXhwb3J0cy5EdXBsZXg9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fZHVwbGV4LmpzIiksZXhwb3J0cy5UcmFuc2Zvcm09X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fdHJhbnNmb3JtLmpzIiksZXhwb3J0cy5QYXNzVGhyb3VnaD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9wYXNzdGhyb3VnaC5qcyIpLGV4cG9ydHMuZmluaXNoZWQ9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZW5kLW9mLXN0cmVhbS5qcyIpLGV4cG9ydHMucGlwZWxpbmU9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1odHRwL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvcGlwZWxpbmUuanMiKX0sIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJpbmdfZGVjb2Rlci9saWIvc3RyaW5nX2RlY29kZXIuanMiKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBCdWZmZXI9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3NhZmUtYnVmZmVyL2luZGV4LmpzIikuQnVmZmVyLGlzRW5jb2Rpbmc9QnVmZmVyLmlzRW5jb2Rpbmd8fGZ1bmN0aW9uKGVuY29kaW5nKXtzd2l0Y2goKGVuY29kaW5nPSIiK2VuY29kaW5nKSYmZW5jb2RpbmcudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6Y2FzZSJyYXciOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fTtmdW5jdGlvbiBTdHJpbmdEZWNvZGVyKGVuY29kaW5nKXt2YXIgbmI7c3dpdGNoKHRoaXMuZW5jb2Rpbmc9ZnVuY3Rpb24gbm9ybWFsaXplRW5jb2RpbmcoZW5jKXt2YXIgbmVuYz1mdW5jdGlvbiBfbm9ybWFsaXplRW5jb2RpbmcoZW5jKXtpZighZW5jKXJldHVybiJ1dGY4Ijtmb3IodmFyIHJldHJpZWQ7Oylzd2l0Y2goZW5jKXtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiJ1dGY4IjtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuInV0ZjE2bGUiO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuImxhdGluMSI7Y2FzZSJiYXNlNjQiOmNhc2UiYXNjaWkiOmNhc2UiaGV4IjpyZXR1cm4gZW5jO2RlZmF1bHQ6aWYocmV0cmllZClyZXR1cm47ZW5jPSgiIitlbmMpLnRvTG93ZXJDYXNlKCkscmV0cmllZD0hMH19KGVuYyk7aWYoInN0cmluZyIhPXR5cGVvZiBuZW5jJiYoQnVmZmVyLmlzRW5jb2Rpbmc9PT1pc0VuY29kaW5nfHwhaXNFbmNvZGluZyhlbmMpKSl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrZW5jKTtyZXR1cm4gbmVuY3x8ZW5jfShlbmNvZGluZyksdGhpcy5lbmNvZGluZyl7Y2FzZSJ1dGYxNmxlIjp0aGlzLnRleHQ9dXRmMTZUZXh0LHRoaXMuZW5kPXV0ZjE2RW5kLG5iPTQ7YnJlYWs7Y2FzZSJ1dGY4Ijp0aGlzLmZpbGxMYXN0PXV0ZjhGaWxsTGFzdCxuYj00O2JyZWFrO2Nhc2UiYmFzZTY0Ijp0aGlzLnRleHQ9YmFzZTY0VGV4dCx0aGlzLmVuZD1iYXNlNjRFbmQsbmI9MzticmVhaztkZWZhdWx0OnJldHVybiB0aGlzLndyaXRlPXNpbXBsZVdyaXRlLHZvaWQodGhpcy5lbmQ9c2ltcGxlRW5kKX10aGlzLmxhc3ROZWVkPTAsdGhpcy5sYXN0VG90YWw9MCx0aGlzLmxhc3RDaGFyPUJ1ZmZlci5hbGxvY1Vuc2FmZShuYil9ZnVuY3Rpb24gdXRmOENoZWNrQnl0ZShieXRlKXtyZXR1cm4gYnl0ZTw9MTI3PzA6Ynl0ZT4+NT09Nj8yOmJ5dGU+PjQ9PTE0PzM6Ynl0ZT4+Mz09MzA/NDpieXRlPj42PT0yPy0xOi0yfWZ1bmN0aW9uIHV0ZjhGaWxsTGFzdChidWYpe3ZhciBwPXRoaXMubGFzdFRvdGFsLXRoaXMubGFzdE5lZWQscj1mdW5jdGlvbiB1dGY4Q2hlY2tFeHRyYUJ5dGVzKHNlbGYsYnVmLHApe2lmKDEyOCE9KDE5MiZidWZbMF0pKXJldHVybiBzZWxmLmxhc3ROZWVkPTAsIu+/vSI7aWYoc2VsZi5sYXN0TmVlZD4xJiZidWYubGVuZ3RoPjEpe2lmKDEyOCE9KDE5MiZidWZbMV0pKXJldHVybiBzZWxmLmxhc3ROZWVkPTEsIu+/vSI7aWYoc2VsZi5sYXN0TmVlZD4yJiZidWYubGVuZ3RoPjImJjEyOCE9KDE5MiZidWZbMl0pKXJldHVybiBzZWxmLmxhc3ROZWVkPTIsIu+/vSJ9fSh0aGlzLGJ1Zik7cmV0dXJuIHZvaWQgMCE9PXI/cjp0aGlzLmxhc3ROZWVkPD1idWYubGVuZ3RoPyhidWYuY29weSh0aGlzLmxhc3RDaGFyLHAsMCx0aGlzLmxhc3ROZWVkKSx0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsMCx0aGlzLmxhc3RUb3RhbCkpOihidWYuY29weSh0aGlzLmxhc3RDaGFyLHAsMCxidWYubGVuZ3RoKSx2b2lkKHRoaXMubGFzdE5lZWQtPWJ1Zi5sZW5ndGgpKX1mdW5jdGlvbiB1dGYxNlRleHQoYnVmLGkpe2lmKChidWYubGVuZ3RoLWkpJTI9PTApe3ZhciByPWJ1Zi50b1N0cmluZygidXRmMTZsZSIsaSk7aWYocil7dmFyIGM9ci5jaGFyQ29kZUF0KHIubGVuZ3RoLTEpO2lmKGM+PTU1Mjk2JiZjPD01NjMxOSlyZXR1cm4gdGhpcy5sYXN0TmVlZD0yLHRoaXMubGFzdFRvdGFsPTQsdGhpcy5sYXN0Q2hhclswXT1idWZbYnVmLmxlbmd0aC0yXSx0aGlzLmxhc3RDaGFyWzFdPWJ1ZltidWYubGVuZ3RoLTFdLHIuc2xpY2UoMCwtMSl9cmV0dXJuIHJ9cmV0dXJuIHRoaXMubGFzdE5lZWQ9MSx0aGlzLmxhc3RUb3RhbD0yLHRoaXMubGFzdENoYXJbMF09YnVmW2J1Zi5sZW5ndGgtMV0sYnVmLnRvU3RyaW5nKCJ1dGYxNmxlIixpLGJ1Zi5sZW5ndGgtMSl9ZnVuY3Rpb24gdXRmMTZFbmQoYnVmKXt2YXIgcj1idWYmJmJ1Zi5sZW5ndGg/dGhpcy53cml0ZShidWYpOiIiO2lmKHRoaXMubGFzdE5lZWQpe3ZhciBlbmQ9dGhpcy5sYXN0VG90YWwtdGhpcy5sYXN0TmVlZDtyZXR1cm4gcit0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKCJ1dGYxNmxlIiwwLGVuZCl9cmV0dXJuIHJ9ZnVuY3Rpb24gYmFzZTY0VGV4dChidWYsaSl7dmFyIG49KGJ1Zi5sZW5ndGgtaSklMztyZXR1cm4gMD09PW4/YnVmLnRvU3RyaW5nKCJiYXNlNjQiLGkpOih0aGlzLmxhc3ROZWVkPTMtbix0aGlzLmxhc3RUb3RhbD0zLDE9PT1uP3RoaXMubGFzdENoYXJbMF09YnVmW2J1Zi5sZW5ndGgtMV06KHRoaXMubGFzdENoYXJbMF09YnVmW2J1Zi5sZW5ndGgtMl0sdGhpcy5sYXN0Q2hhclsxXT1idWZbYnVmLmxlbmd0aC0xXSksYnVmLnRvU3RyaW5nKCJiYXNlNjQiLGksYnVmLmxlbmd0aC1uKSl9ZnVuY3Rpb24gYmFzZTY0RW5kKGJ1Zil7dmFyIHI9YnVmJiZidWYubGVuZ3RoP3RoaXMud3JpdGUoYnVmKToiIjtyZXR1cm4gdGhpcy5sYXN0TmVlZD9yK3RoaXMubGFzdENoYXIudG9TdHJpbmcoImJhc2U2NCIsMCwzLXRoaXMubGFzdE5lZWQpOnJ9ZnVuY3Rpb24gc2ltcGxlV3JpdGUoYnVmKXtyZXR1cm4gYnVmLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpfWZ1bmN0aW9uIHNpbXBsZUVuZChidWYpe3JldHVybiBidWYmJmJ1Zi5sZW5ndGg/dGhpcy53cml0ZShidWYpOiIifWV4cG9ydHMuU3RyaW5nRGVjb2Rlcj1TdHJpbmdEZWNvZGVyLFN0cmluZ0RlY29kZXIucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKGJ1Zil7aWYoMD09PWJ1Zi5sZW5ndGgpcmV0dXJuIiI7dmFyIHIsaTtpZih0aGlzLmxhc3ROZWVkKXtpZih2b2lkIDA9PT0ocj10aGlzLmZpbGxMYXN0KGJ1ZikpKXJldHVybiIiO2k9dGhpcy5sYXN0TmVlZCx0aGlzLmxhc3ROZWVkPTB9ZWxzZSBpPTA7cmV0dXJuIGk8YnVmLmxlbmd0aD9yP3IrdGhpcy50ZXh0KGJ1ZixpKTp0aGlzLnRleHQoYnVmLGkpOnJ8fCIifSxTdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24gdXRmOEVuZChidWYpe3ZhciByPWJ1ZiYmYnVmLmxlbmd0aD90aGlzLndyaXRlKGJ1Zik6IiI7cmV0dXJuIHRoaXMubGFzdE5lZWQ/cisi77+9IjpyfSxTdHJpbmdEZWNvZGVyLnByb3RvdHlwZS50ZXh0PWZ1bmN0aW9uIHV0ZjhUZXh0KGJ1ZixpKXt2YXIgdG90YWw9ZnVuY3Rpb24gdXRmOENoZWNrSW5jb21wbGV0ZShzZWxmLGJ1ZixpKXt2YXIgaj1idWYubGVuZ3RoLTE7aWYoajxpKXJldHVybiAwO3ZhciBuYj11dGY4Q2hlY2tCeXRlKGJ1ZltqXSk7aWYobmI+PTApcmV0dXJuIG5iPjAmJihzZWxmLmxhc3ROZWVkPW5iLTEpLG5iO2lmKC0tajxpfHwtMj09PW5iKXJldHVybiAwO2lmKG5iPXV0ZjhDaGVja0J5dGUoYnVmW2pdKSxuYj49MClyZXR1cm4gbmI+MCYmKHNlbGYubGFzdE5lZWQ9bmItMiksbmI7aWYoLS1qPGl8fC0yPT09bmIpcmV0dXJuIDA7aWYobmI9dXRmOENoZWNrQnl0ZShidWZbal0pLG5iPj0wKXJldHVybiBuYj4wJiYoMj09PW5iP25iPTA6c2VsZi5sYXN0TmVlZD1uYi0zKSxuYjtyZXR1cm4gMH0odGhpcyxidWYsaSk7aWYoIXRoaXMubGFzdE5lZWQpcmV0dXJuIGJ1Zi50b1N0cmluZygidXRmOCIsaSk7dGhpcy5sYXN0VG90YWw9dG90YWw7dmFyIGVuZD1idWYubGVuZ3RoLSh0b3RhbC10aGlzLmxhc3ROZWVkKTtyZXR1cm4gYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwwLGVuZCksYnVmLnRvU3RyaW5nKCJ1dGY4IixpLGVuZCl9LFN0cmluZ0RlY29kZXIucHJvdG90eXBlLmZpbGxMYXN0PWZ1bmN0aW9uKGJ1Zil7aWYodGhpcy5sYXN0TmVlZDw9YnVmLmxlbmd0aClyZXR1cm4gYnVmLmNvcHkodGhpcy5sYXN0Q2hhcix0aGlzLmxhc3RUb3RhbC10aGlzLmxhc3ROZWVkLDAsdGhpcy5sYXN0TmVlZCksdGhpcy5sYXN0Q2hhci50b1N0cmluZyh0aGlzLmVuY29kaW5nLDAsdGhpcy5sYXN0VG90YWwpO2J1Zi5jb3B5KHRoaXMubGFzdENoYXIsdGhpcy5sYXN0VG90YWwtdGhpcy5sYXN0TmVlZCwwLGJ1Zi5sZW5ndGgpLHRoaXMubGFzdE5lZWQtPWJ1Zi5sZW5ndGh9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3N5c3RlbWpzL2Rpc3Qvc3lzdGVtLmpzIihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZXJyTXNnKGVyckNvZGUsbXNnKXtyZXR1cm4obXNnfHwiIikrIiAoU3lzdGVtSlMgRXJyb3IjIitlcnJDb2RlKyIgaHR0cHM6Ly9naXRodWIuY29tL3N5c3RlbWpzL3N5c3RlbWpzL2Jsb2IvbWFpbi9kb2NzL2Vycm9ycy5tZCMiK2VyckNvZGUrIikifXZhciBiYXNlVXJsLGhhc1N5bWJvbD0idW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCxoYXNTZWxmPSJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZixoYXNEb2N1bWVudD0idW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50LGVudkdsb2JhbD1oYXNTZWxmP3NlbGY6X193ZWJwYWNrX3JlcXVpcmVfXy5nO2lmKGhhc0RvY3VtZW50KXt2YXIgYmFzZUVsPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImJhc2VbaHJlZl0iKTtiYXNlRWwmJihiYXNlVXJsPWJhc2VFbC5ocmVmKX1pZighYmFzZVVybCYmInVuZGVmaW5lZCIhPXR5cGVvZiBsb2NhdGlvbil7dmFyIGxhc3RTZXBJbmRleD0oYmFzZVVybD1sb2NhdGlvbi5ocmVmLnNwbGl0KCIjIilbMF0uc3BsaXQoIj8iKVswXSkubGFzdEluZGV4T2YoIi8iKTstMSE9PWxhc3RTZXBJbmRleCYmKGJhc2VVcmw9YmFzZVVybC5zbGljZSgwLGxhc3RTZXBJbmRleCsxKSl9dmFyIGJhY2tzbGFzaFJlZ0V4PS9cXC9nO2Z1bmN0aW9uIHJlc29sdmVJZk5vdFBsYWluT3JVcmwocmVsVXJsLHBhcmVudFVybCl7aWYoLTEhPT1yZWxVcmwuaW5kZXhPZigiXFwiKSYmKHJlbFVybD1yZWxVcmwucmVwbGFjZShiYWNrc2xhc2hSZWdFeCwiLyIpKSwiLyI9PT1yZWxVcmxbMF0mJiIvIj09PXJlbFVybFsxXSlyZXR1cm4gcGFyZW50VXJsLnNsaWNlKDAscGFyZW50VXJsLmluZGV4T2YoIjoiKSsxKStyZWxVcmw7aWYoIi4iPT09cmVsVXJsWzBdJiYoIi8iPT09cmVsVXJsWzFdfHwiLiI9PT1yZWxVcmxbMV0mJigiLyI9PT1yZWxVcmxbMl18fDI9PT1yZWxVcmwubGVuZ3RoJiYocmVsVXJsKz0iLyIpKXx8MT09PXJlbFVybC5sZW5ndGgmJihyZWxVcmwrPSIvIikpfHwiLyI9PT1yZWxVcmxbMF0pe3ZhciBwYXRobmFtZSxwYXJlbnRQcm90b2NvbD1wYXJlbnRVcmwuc2xpY2UoMCxwYXJlbnRVcmwuaW5kZXhPZigiOiIpKzEpO2lmKHBhdGhuYW1lPSIvIj09PXBhcmVudFVybFtwYXJlbnRQcm90b2NvbC5sZW5ndGgrMV0/ImZpbGU6IiE9PXBhcmVudFByb3RvY29sPyhwYXRobmFtZT1wYXJlbnRVcmwuc2xpY2UocGFyZW50UHJvdG9jb2wubGVuZ3RoKzIpKS5zbGljZShwYXRobmFtZS5pbmRleE9mKCIvIikrMSk6cGFyZW50VXJsLnNsaWNlKDgpOnBhcmVudFVybC5zbGljZShwYXJlbnRQcm90b2NvbC5sZW5ndGgrKCIvIj09PXBhcmVudFVybFtwYXJlbnRQcm90b2NvbC5sZW5ndGhdKSksIi8iPT09cmVsVXJsWzBdKXJldHVybiBwYXJlbnRVcmwuc2xpY2UoMCxwYXJlbnRVcmwubGVuZ3RoLXBhdGhuYW1lLmxlbmd0aC0xKStyZWxVcmw7Zm9yKHZhciBzZWdtZW50ZWQ9cGF0aG5hbWUuc2xpY2UoMCxwYXRobmFtZS5sYXN0SW5kZXhPZigiLyIpKzEpK3JlbFVybCxvdXRwdXQ9W10sc2VnbWVudEluZGV4PS0xLGk9MDtpPHNlZ21lbnRlZC5sZW5ndGg7aSsrKS0xIT09c2VnbWVudEluZGV4PyIvIj09PXNlZ21lbnRlZFtpXSYmKG91dHB1dC5wdXNoKHNlZ21lbnRlZC5zbGljZShzZWdtZW50SW5kZXgsaSsxKSksc2VnbWVudEluZGV4PS0xKToiLiI9PT1zZWdtZW50ZWRbaV0/Ii4iIT09c2VnbWVudGVkW2krMV18fCIvIiE9PXNlZ21lbnRlZFtpKzJdJiZpKzIhPT1zZWdtZW50ZWQubGVuZ3RoPyIvIj09PXNlZ21lbnRlZFtpKzFdfHxpKzE9PT1zZWdtZW50ZWQubGVuZ3RoP2krPTE6c2VnbWVudEluZGV4PWk6KG91dHB1dC5wb3AoKSxpKz0yKTpzZWdtZW50SW5kZXg9aTtyZXR1cm4tMSE9PXNlZ21lbnRJbmRleCYmb3V0cHV0LnB1c2goc2VnbWVudGVkLnNsaWNlKHNlZ21lbnRJbmRleCkpLHBhcmVudFVybC5zbGljZSgwLHBhcmVudFVybC5sZW5ndGgtcGF0aG5hbWUubGVuZ3RoKStvdXRwdXQuam9pbigiIil9fWZ1bmN0aW9uIHJlc29sdmVVcmwocmVsVXJsLHBhcmVudFVybCl7cmV0dXJuIHJlc29sdmVJZk5vdFBsYWluT3JVcmwocmVsVXJsLHBhcmVudFVybCl8fCgtMSE9PXJlbFVybC5pbmRleE9mKCI6Iik/cmVsVXJsOnJlc29sdmVJZk5vdFBsYWluT3JVcmwoIi4vIityZWxVcmwscGFyZW50VXJsKSl9ZnVuY3Rpb24gcmVzb2x2ZUFuZENvbXBvc2VQYWNrYWdlcyhwYWNrYWdlcyxvdXRQYWNrYWdlcyxiYXNlVXJsLHBhcmVudE1hcCxwYXJlbnRVcmwpe2Zvcih2YXIgcCBpbiBwYWNrYWdlcyl7dmFyIHJlc29sdmVkTGhzPXJlc29sdmVJZk5vdFBsYWluT3JVcmwocCxiYXNlVXJsKXx8cCxyaHM9cGFja2FnZXNbcF07aWYoInN0cmluZyI9PXR5cGVvZiByaHMpe3ZhciBtYXBwZWQ9cmVzb2x2ZUltcG9ydE1hcChwYXJlbnRNYXAscmVzb2x2ZUlmTm90UGxhaW5PclVybChyaHMsYmFzZVVybCl8fHJocyxwYXJlbnRVcmwpO21hcHBlZD9vdXRQYWNrYWdlc1tyZXNvbHZlZExoc109bWFwcGVkOnRhcmdldFdhcm5pbmcoIlcxIixwLHJocywiYmFyZSBzcGVjaWZpZXIgZGlkIG5vdCByZXNvbHZlIil9fX1mdW5jdGlvbiByZXNvbHZlQW5kQ29tcG9zZUltcG9ydE1hcChqc29uLGJhc2VVcmwsb3V0TWFwKXt2YXIgdTtmb3IodSBpbiBqc29uLmltcG9ydHMmJnJlc29sdmVBbmRDb21wb3NlUGFja2FnZXMoanNvbi5pbXBvcnRzLG91dE1hcC5pbXBvcnRzLGJhc2VVcmwsb3V0TWFwLG51bGwpLGpzb24uc2NvcGVzfHx7fSl7dmFyIHJlc29sdmVkU2NvcGU9cmVzb2x2ZVVybCh1LGJhc2VVcmwpO3Jlc29sdmVBbmRDb21wb3NlUGFja2FnZXMoanNvbi5zY29wZXNbdV0sb3V0TWFwLnNjb3Blc1tyZXNvbHZlZFNjb3BlXXx8KG91dE1hcC5zY29wZXNbcmVzb2x2ZWRTY29wZV09e30pLGJhc2VVcmwsb3V0TWFwLHJlc29sdmVkU2NvcGUpfWZvcih1IGluIGpzb24uZGVwY2FjaGV8fHt9KW91dE1hcC5kZXBjYWNoZVtyZXNvbHZlVXJsKHUsYmFzZVVybCldPWpzb24uZGVwY2FjaGVbdV07Zm9yKHUgaW4ganNvbi5pbnRlZ3JpdHl8fHt9KW91dE1hcC5pbnRlZ3JpdHlbcmVzb2x2ZVVybCh1LGJhc2VVcmwpXT1qc29uLmludGVncml0eVt1XX1mdW5jdGlvbiBnZXRNYXRjaChwYXRoLG1hdGNoT2JqKXtpZihtYXRjaE9ialtwYXRoXSlyZXR1cm4gcGF0aDt2YXIgc2VwSW5kZXg9cGF0aC5sZW5ndGg7ZG97dmFyIHNlZ21lbnQ9cGF0aC5zbGljZSgwLHNlcEluZGV4KzEpO2lmKHNlZ21lbnQgaW4gbWF0Y2hPYmopcmV0dXJuIHNlZ21lbnR9d2hpbGUoLTEhPT0oc2VwSW5kZXg9cGF0aC5sYXN0SW5kZXhPZigiLyIsc2VwSW5kZXgtMSkpKX1mdW5jdGlvbiBhcHBseVBhY2thZ2VzKGlkLHBhY2thZ2VzKXt2YXIgcGtnTmFtZT1nZXRNYXRjaChpZCxwYWNrYWdlcyk7aWYocGtnTmFtZSl7dmFyIHBrZz1wYWNrYWdlc1twa2dOYW1lXTtpZihudWxsPT09cGtnKXJldHVybjtpZighKGlkLmxlbmd0aD5wa2dOYW1lLmxlbmd0aCYmIi8iIT09cGtnW3BrZy5sZW5ndGgtMV0pKXJldHVybiBwa2craWQuc2xpY2UocGtnTmFtZS5sZW5ndGgpO3RhcmdldFdhcm5pbmcoIlcyIixwa2dOYW1lLHBrZywic2hvdWxkIGhhdmUgYSB0cmFpbGluZyAnLyciKX19ZnVuY3Rpb24gdGFyZ2V0V2FybmluZyhjb2RlLG1hdGNoLHRhcmdldCxtc2cpe2NvbnNvbGUud2FybihlcnJNc2coY29kZSwiUGFja2FnZSB0YXJnZXQgIittc2crIiwgcmVzb2x2aW5nIHRhcmdldCAnIit0YXJnZXQrIicgZm9yICIrbWF0Y2gpKX1mdW5jdGlvbiByZXNvbHZlSW1wb3J0TWFwKGltcG9ydE1hcCxyZXNvbHZlZE9yUGxhaW4scGFyZW50VXJsKXtmb3IodmFyIHNjb3Blcz1pbXBvcnRNYXAuc2NvcGVzLHNjb3BlVXJsPXBhcmVudFVybCYmZ2V0TWF0Y2gocGFyZW50VXJsLHNjb3Blcyk7c2NvcGVVcmw7KXt2YXIgcGFja2FnZVJlc29sdXRpb249YXBwbHlQYWNrYWdlcyhyZXNvbHZlZE9yUGxhaW4sc2NvcGVzW3Njb3BlVXJsXSk7aWYocGFja2FnZVJlc29sdXRpb24pcmV0dXJuIHBhY2thZ2VSZXNvbHV0aW9uO3Njb3BlVXJsPWdldE1hdGNoKHNjb3BlVXJsLnNsaWNlKDAsc2NvcGVVcmwubGFzdEluZGV4T2YoIi8iKSksc2NvcGVzKX1yZXR1cm4gYXBwbHlQYWNrYWdlcyhyZXNvbHZlZE9yUGxhaW4saW1wb3J0TWFwLmltcG9ydHMpfHwtMSE9PXJlc29sdmVkT3JQbGFpbi5pbmRleE9mKCI6IikmJnJlc29sdmVkT3JQbGFpbn12YXIgdG9TdHJpbmdUYWckMT1oYXNTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyxSRUdJU1RSWT1oYXNTeW1ib2w/U3ltYm9sKCk6IkAiO2Z1bmN0aW9uIFN5c3RlbUpTKCl7dGhpc1tSRUdJU1RSWV09e319dmFyIGxhc3RSZWdpc3RlcixzeXN0ZW1KU1Byb3RvdHlwZT1TeXN0ZW1KUy5wcm90b3R5cGU7ZnVuY3Rpb24gbG9hZFRvSWQobG9hZCl7cmV0dXJuIGxvYWQuaWR9ZnVuY3Rpb24gdHJpZ2dlck9ubG9hZChsb2FkZXIsbG9hZCxlcnIsaXNFcnJTb3VyY2Upe2lmKGxvYWRlci5vbmxvYWQoZXJyLGxvYWQuaWQsbG9hZC5kJiZsb2FkLmQubWFwKGxvYWRUb0lkKSwhIWlzRXJyU291cmNlKSxlcnIpdGhyb3cgZXJyfWZ1bmN0aW9uIGdldE9yQ3JlYXRlTG9hZChsb2FkZXIsaWQsZmlyc3RQYXJlbnRVcmwsbWV0YSl7dmFyIGxvYWQ9bG9hZGVyW1JFR0lTVFJZXVtpZF07aWYobG9hZClyZXR1cm4gbG9hZDt2YXIgaW1wb3J0ZXJTZXR0ZXJzPVtdLG5zPU9iamVjdC5jcmVhdGUobnVsbCk7dG9TdHJpbmdUYWckMSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLHRvU3RyaW5nVGFnJDEse3ZhbHVlOiJNb2R1bGUifSk7dmFyIGluc3RhbnRpYXRlUHJvbWlzZT1Qcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGxvYWRlci5pbnN0YW50aWF0ZShpZCxmaXJzdFBhcmVudFVybCxtZXRhKX0pLnRoZW4oZnVuY3Rpb24ocmVnaXN0cmF0aW9uKXtpZighcmVnaXN0cmF0aW9uKXRocm93IEVycm9yKGVyck1zZygyLCJNb2R1bGUgIitpZCsiIGRpZCBub3QgaW5zdGFudGlhdGUiKSk7dmFyIGRlY2xhcmVkPXJlZ2lzdHJhdGlvblsxXShmdW5jdGlvbiBfZXhwb3J0KG5hbWUsdmFsdWUpe2xvYWQuaD0hMDt2YXIgY2hhbmdlZD0hMTtpZigic3RyaW5nIj09dHlwZW9mIG5hbWUpbmFtZSBpbiBucyYmbnNbbmFtZV09PT12YWx1ZXx8KG5zW25hbWVdPXZhbHVlLGNoYW5nZWQ9ITApO2Vsc2V7Zm9yKHZhciBwIGluIG5hbWUpe3ZhbHVlPW5hbWVbcF07cCBpbiBucyYmbnNbcF09PT12YWx1ZXx8KG5zW3BdPXZhbHVlLGNoYW5nZWQ9ITApfW5hbWUmJm5hbWUuX19lc01vZHVsZSYmKG5zLl9fZXNNb2R1bGU9bmFtZS5fX2VzTW9kdWxlKX1pZihjaGFuZ2VkKWZvcih2YXIgaT0wO2k8aW1wb3J0ZXJTZXR0ZXJzLmxlbmd0aDtpKyspe3ZhciBzZXR0ZXI9aW1wb3J0ZXJTZXR0ZXJzW2ldO3NldHRlciYmc2V0dGVyKG5zKX1yZXR1cm4gdmFsdWV9LDI9PT1yZWdpc3RyYXRpb25bMV0ubGVuZ3RoP3tpbXBvcnQ6ZnVuY3Rpb24oaW1wb3J0SWQsbWV0YSl7cmV0dXJuIGxvYWRlci5pbXBvcnQoaW1wb3J0SWQsaWQsbWV0YSl9LG1ldGE6bG9hZGVyLmNyZWF0ZUNvbnRleHQoaWQpfTp2b2lkIDApO3JldHVybiBsb2FkLmU9ZGVjbGFyZWQuZXhlY3V0ZXx8ZnVuY3Rpb24oKXt9LFtyZWdpc3RyYXRpb25bMF0sZGVjbGFyZWQuc2V0dGVyc3x8W10scmVnaXN0cmF0aW9uWzJdfHxbXV19LGZ1bmN0aW9uKGVycil7dGhyb3cgbG9hZC5lPW51bGwsbG9hZC5lcj1lcnIsdHJpZ2dlck9ubG9hZChsb2FkZXIsbG9hZCxlcnIsITApLGVycn0pLGxpbmtQcm9taXNlPWluc3RhbnRpYXRlUHJvbWlzZS50aGVuKGZ1bmN0aW9uKGluc3RhbnRpYXRpb24pe3JldHVybiBQcm9taXNlLmFsbChpbnN0YW50aWF0aW9uWzBdLm1hcChmdW5jdGlvbihkZXAsaSl7dmFyIHNldHRlcj1pbnN0YW50aWF0aW9uWzFdW2ldLG1ldGE9aW5zdGFudGlhdGlvblsyXVtpXTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGxvYWRlci5yZXNvbHZlKGRlcCxpZCkpLnRoZW4oZnVuY3Rpb24oZGVwSWQpe3ZhciBkZXBMb2FkPWdldE9yQ3JlYXRlTG9hZChsb2FkZXIsZGVwSWQsaWQsbWV0YSk7cmV0dXJuIFByb21pc2UucmVzb2x2ZShkZXBMb2FkLkkpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gc2V0dGVyJiYoZGVwTG9hZC5pLnB1c2goc2V0dGVyKSwhZGVwTG9hZC5oJiZkZXBMb2FkLkl8fHNldHRlcihkZXBMb2FkLm4pKSxkZXBMb2FkfSl9KX0pKS50aGVuKGZ1bmN0aW9uKGRlcExvYWRzKXtsb2FkLmQ9ZGVwTG9hZHN9KX0pO3JldHVybiBsb2FkPWxvYWRlcltSRUdJU1RSWV1baWRdPXtpZCxpOmltcG9ydGVyU2V0dGVycyxuOm5zLG06bWV0YSxJOmluc3RhbnRpYXRlUHJvbWlzZSxMOmxpbmtQcm9taXNlLGg6ITEsZDp2b2lkIDAsZTp2b2lkIDAsZXI6dm9pZCAwLEU6dm9pZCAwLEM6dm9pZCAwLHA6dm9pZCAwfX1mdW5jdGlvbiBpbnN0YW50aWF0ZUFsbChsb2FkZXIsbG9hZCxwYXJlbnQsbG9hZGVkKXtpZighbG9hZGVkW2xvYWQuaWRdKXJldHVybiBsb2FkZWRbbG9hZC5pZF09ITAsUHJvbWlzZS5yZXNvbHZlKGxvYWQuTCkudGhlbihmdW5jdGlvbigpe3JldHVybiBsb2FkLnAmJm51bGwhPT1sb2FkLnAuZXx8KGxvYWQucD1wYXJlbnQpLFByb21pc2UuYWxsKGxvYWQuZC5tYXAoZnVuY3Rpb24oZGVwKXtyZXR1cm4gaW5zdGFudGlhdGVBbGwobG9hZGVyLGRlcCxwYXJlbnQsbG9hZGVkKX0pKX0pLmNhdGNoKGZ1bmN0aW9uKGVycil7aWYobG9hZC5lcil0aHJvdyBlcnI7dGhyb3cgbG9hZC5lPW51bGwsdHJpZ2dlck9ubG9hZChsb2FkZXIsbG9hZCxlcnIsITEpLGVycn0pfXN5c3RlbUpTUHJvdG90eXBlLmltcG9ydD1mdW5jdGlvbihpZCxwYXJlbnRVcmwsbWV0YSl7dmFyIGxvYWRlcj10aGlzO3JldHVybiBwYXJlbnRVcmwmJiJvYmplY3QiPT10eXBlb2YgcGFyZW50VXJsJiYobWV0YT1wYXJlbnRVcmwscGFyZW50VXJsPXZvaWQgMCksUHJvbWlzZS5yZXNvbHZlKGxvYWRlci5wcmVwYXJlSW1wb3J0KCkpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gbG9hZGVyLnJlc29sdmUoaWQscGFyZW50VXJsLG1ldGEpfSkudGhlbihmdW5jdGlvbihpZCl7dmFyIGxvYWQ9Z2V0T3JDcmVhdGVMb2FkKGxvYWRlcixpZCx2b2lkIDAsbWV0YSk7cmV0dXJuIGxvYWQuQ3x8ZnVuY3Rpb24gdG9wTGV2ZWxMb2FkKGxvYWRlcixsb2FkKXtyZXR1cm4gbG9hZC5DPWluc3RhbnRpYXRlQWxsKGxvYWRlcixsb2FkLGxvYWQse30pLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gcG9zdE9yZGVyRXhlYyhsb2FkZXIsbG9hZCx7fSl9KS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGxvYWQubn0pfShsb2FkZXIsbG9hZCl9KX0sc3lzdGVtSlNQcm90b3R5cGUuY3JlYXRlQ29udGV4dD1mdW5jdGlvbihwYXJlbnRJZCl7dmFyIGxvYWRlcj10aGlzO3JldHVybnt1cmw6cGFyZW50SWQscmVzb2x2ZTpmdW5jdGlvbihpZCxwYXJlbnRVcmwpe3JldHVybiBQcm9taXNlLnJlc29sdmUobG9hZGVyLnJlc29sdmUoaWQscGFyZW50VXJsfHxwYXJlbnRJZCkpfX19LHN5c3RlbUpTUHJvdG90eXBlLm9ubG9hZD1mdW5jdGlvbigpe30sc3lzdGVtSlNQcm90b3R5cGUucmVnaXN0ZXI9ZnVuY3Rpb24oZGVwcyxkZWNsYXJlLG1ldGFzKXtsYXN0UmVnaXN0ZXI9W2RlcHMsZGVjbGFyZSxtZXRhc119LHN5c3RlbUpTUHJvdG90eXBlLmdldFJlZ2lzdGVyPWZ1bmN0aW9uKCl7dmFyIF9sYXN0UmVnaXN0ZXI9bGFzdFJlZ2lzdGVyO3JldHVybiBsYXN0UmVnaXN0ZXI9dm9pZCAwLF9sYXN0UmVnaXN0ZXJ9O3ZhciBudWxsQ29udGV4dD1PYmplY3QuZnJlZXplKE9iamVjdC5jcmVhdGUobnVsbCkpO2Z1bmN0aW9uIHBvc3RPcmRlckV4ZWMobG9hZGVyLGxvYWQsc2Vlbil7aWYoIXNlZW5bbG9hZC5pZF0pe2lmKHNlZW5bbG9hZC5pZF09ITAsIWxvYWQuZSl7aWYobG9hZC5lcil0aHJvdyBsb2FkLmVyO3JldHVybiBsb2FkLkU/bG9hZC5FOnZvaWQgMH12YXIgZGVwTG9hZFByb21pc2VzLGV4ZWM9bG9hZC5lO3JldHVybiBsb2FkLmU9bnVsbCxsb2FkLmQuZm9yRWFjaChmdW5jdGlvbihkZXBMb2FkKXt0cnl7dmFyIGRlcExvYWRQcm9taXNlPXBvc3RPcmRlckV4ZWMobG9hZGVyLGRlcExvYWQsc2Vlbik7ZGVwTG9hZFByb21pc2UmJihkZXBMb2FkUHJvbWlzZXM9ZGVwTG9hZFByb21pc2VzfHxbXSkucHVzaChkZXBMb2FkUHJvbWlzZSl9Y2F0Y2goZXJyKXt0aHJvdyBsb2FkLmVyPWVycix0cmlnZ2VyT25sb2FkKGxvYWRlcixsb2FkLGVyciwhMSksZXJyfX0pLGRlcExvYWRQcm9taXNlcz9Qcm9taXNlLmFsbChkZXBMb2FkUHJvbWlzZXMpLnRoZW4oZG9FeGVjKTpkb0V4ZWMoKX1mdW5jdGlvbiBkb0V4ZWMoKXt0cnl7dmFyIGV4ZWNQcm9taXNlPWV4ZWMuY2FsbChudWxsQ29udGV4dCk7aWYoZXhlY1Byb21pc2UpcmV0dXJuIGV4ZWNQcm9taXNlPWV4ZWNQcm9taXNlLnRoZW4oZnVuY3Rpb24oKXtsb2FkLkM9bG9hZC5uLGxvYWQuRT1udWxsLHRyaWdnZXJPbmxvYWQobG9hZGVyLGxvYWQsbnVsbCwhMCl9LGZ1bmN0aW9uKGVycil7dGhyb3cgbG9hZC5lcj1lcnIsbG9hZC5FPW51bGwsdHJpZ2dlck9ubG9hZChsb2FkZXIsbG9hZCxlcnIsITApLGVycn0pLGxvYWQuRT1leGVjUHJvbWlzZTtsb2FkLkM9bG9hZC5uLGxvYWQuTD1sb2FkLkk9dm9pZCAwfWNhdGNoKGVycil7dGhyb3cgbG9hZC5lcj1lcnIsZXJyfWZpbmFsbHl7dHJpZ2dlck9ubG9hZChsb2FkZXIsbG9hZCxsb2FkLmVyLCEwKX19fWVudkdsb2JhbC5TeXN0ZW09bmV3IFN5c3RlbUpTO3ZhciBsYXN0QXV0b0ltcG9ydERlcHMsbGFzdEF1dG9JbXBvcnRUaW1lb3V0LGltcG9ydE1hcFByb21pc2U9UHJvbWlzZS5yZXNvbHZlKCksaW1wb3J0TWFwPXtpbXBvcnRzOnt9LHNjb3Blczp7fSxkZXBjYWNoZTp7fSxpbnRlZ3JpdHk6e319LHByb2Nlc3NGaXJzdD1oYXNEb2N1bWVudDtmdW5jdGlvbiBwcm9jZXNzU2NyaXB0cygpe1tdLmZvckVhY2guY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJzY3JpcHQiKSxmdW5jdGlvbihzY3JpcHQpe2lmKCFzY3JpcHQuc3ApaWYoInN5c3RlbWpzLW1vZHVsZSI9PT1zY3JpcHQudHlwZSl7aWYoc2NyaXB0LnNwPSEwLCFzY3JpcHQuc3JjKXJldHVybjtTeXN0ZW0uaW1wb3J0KCJpbXBvcnQ6Ij09PXNjcmlwdC5zcmMuc2xpY2UoMCw3KT9zY3JpcHQuc3JjLnNsaWNlKDcpOnJlc29sdmVVcmwoc2NyaXB0LnNyYyxiYXNlVXJsKSkuY2F0Y2goZnVuY3Rpb24oZSl7aWYoZS5tZXNzYWdlLmluZGV4T2YoImh0dHBzOi8vZ2l0aHViLmNvbS9zeXN0ZW1qcy9zeXN0ZW1qcy9ibG9iL21haW4vZG9jcy9lcnJvcnMubWQjMyIpPi0xKXt2YXIgZXZlbnQ9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50Iik7ZXZlbnQuaW5pdEV2ZW50KCJlcnJvciIsITEsITEpLHNjcmlwdC5kaXNwYXRjaEV2ZW50KGV2ZW50KX1yZXR1cm4gUHJvbWlzZS5yZWplY3QoZSl9KX1lbHNlIGlmKCJzeXN0ZW1qcy1pbXBvcnRtYXAiPT09c2NyaXB0LnR5cGUpe3NjcmlwdC5zcD0hMDt2YXIgZmV0Y2hQcm9taXNlPXNjcmlwdC5zcmM/KFN5c3RlbS5mZXRjaHx8ZmV0Y2gpKHNjcmlwdC5zcmMse2ludGVncml0eTpzY3JpcHQuaW50ZWdyaXR5LHByaW9yaXR5OnNjcmlwdC5mZXRjaFByaW9yaXR5LHBhc3NUaHJvdWdoOiEwfSkudGhlbihmdW5jdGlvbihyZXMpe2lmKCFyZXMub2spdGhyb3cgRXJyb3IoIkludmFsaWQgc3RhdHVzIGNvZGU6ICIrcmVzLnN0YXR1cyk7cmV0dXJuIHJlcy50ZXh0KCl9KS5jYXRjaChmdW5jdGlvbihlcnIpe3JldHVybiBlcnIubWVzc2FnZT1lcnJNc2coIlc0IiwiRXJyb3IgZmV0Y2hpbmcgc3lzdGVtanMtaW1wb3J0IG1hcCAiK3NjcmlwdC5zcmMpKyJcbiIrZXJyLm1lc3NhZ2UsY29uc29sZS53YXJuKGVyciksImZ1bmN0aW9uIj09dHlwZW9mIHNjcmlwdC5vbmVycm9yJiZzY3JpcHQub25lcnJvcigpLCJ7fSJ9KTpzY3JpcHQuaW5uZXJIVE1MO2ltcG9ydE1hcFByb21pc2U9aW1wb3J0TWFwUHJvbWlzZS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGZldGNoUHJvbWlzZX0pLnRoZW4oZnVuY3Rpb24odGV4dCl7IWZ1bmN0aW9uIGV4dGVuZEltcG9ydE1hcChpbXBvcnRNYXAsbmV3TWFwVGV4dCxuZXdNYXBVcmwpe3ZhciBuZXdNYXA9e307dHJ5e25ld01hcD1KU09OLnBhcnNlKG5ld01hcFRleHQpfWNhdGNoKGVycil7Y29uc29sZS53YXJuKEVycm9yKGVyck1zZygiVzUiLCJzeXN0ZW1qcy1pbXBvcnRtYXAgY29udGFpbnMgaW52YWxpZCBKU09OIikrIlxuXG4iK25ld01hcFRleHQrIlxuIikpfXJlc29sdmVBbmRDb21wb3NlSW1wb3J0TWFwKG5ld01hcCxuZXdNYXBVcmwsaW1wb3J0TWFwKX0oaW1wb3J0TWFwLHRleHQsc2NyaXB0LnNyY3x8YmFzZVVybCl9KX19KX1pZihzeXN0ZW1KU1Byb3RvdHlwZS5wcmVwYXJlSW1wb3J0PWZ1bmN0aW9uKGRvUHJvY2Vzc1NjcmlwdHMpe3JldHVybihwcm9jZXNzRmlyc3R8fGRvUHJvY2Vzc1NjcmlwdHMpJiYocHJvY2Vzc1NjcmlwdHMoKSxwcm9jZXNzRmlyc3Q9ITEpLGltcG9ydE1hcFByb21pc2V9LHN5c3RlbUpTUHJvdG90eXBlLmdldEltcG9ydE1hcD1mdW5jdGlvbigpe3JldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGltcG9ydE1hcCkpfSxoYXNEb2N1bWVudCYmKHByb2Nlc3NTY3JpcHRzKCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLHByb2Nlc3NTY3JpcHRzKSksc3lzdGVtSlNQcm90b3R5cGUuYWRkSW1wb3J0TWFwPWZ1bmN0aW9uKG5ld01hcCxtYXBCYXNlKXtyZXNvbHZlQW5kQ29tcG9zZUltcG9ydE1hcChuZXdNYXAsbWFwQmFzZXx8YmFzZVVybCxpbXBvcnRNYXApfSxoYXNEb2N1bWVudCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihldnQpe2xhc3RXaW5kb3dFcnJvclVybD1ldnQuZmlsZW5hbWUsbGFzdFdpbmRvd0Vycm9yPWV2dC5lcnJvcn0pO3ZhciBiYXNlT3JpZ2luPWxvY2F0aW9uLm9yaWdpbn1zeXN0ZW1KU1Byb3RvdHlwZS5jcmVhdGVTY3JpcHQ9ZnVuY3Rpb24odXJsKXt2YXIgc2NyaXB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO3NjcmlwdC5hc3luYz0hMCx1cmwuaW5kZXhPZihiYXNlT3JpZ2luKyIvIikmJihzY3JpcHQuY3Jvc3NPcmlnaW49ImFub255bW91cyIpO3ZhciBpbnRlZ3JpdHk9aW1wb3J0TWFwLmludGVncml0eVt1cmxdO3JldHVybiBpbnRlZ3JpdHkmJihzY3JpcHQuaW50ZWdyaXR5PWludGVncml0eSksc2NyaXB0LnNyYz11cmwsc2NyaXB0fTt2YXIgbGFzdFdpbmRvd0Vycm9yVXJsLGxhc3RXaW5kb3dFcnJvcixhdXRvSW1wb3J0Q2FuZGlkYXRlcz17fSxzeXN0ZW1SZWdpc3Rlcj1zeXN0ZW1KU1Byb3RvdHlwZS5yZWdpc3RlcjtzeXN0ZW1KU1Byb3RvdHlwZS5yZWdpc3Rlcj1mdW5jdGlvbihkZXBzLGRlY2xhcmUpe2lmKGhhc0RvY3VtZW50JiYibG9hZGluZyI9PT1kb2N1bWVudC5yZWFkeVN0YXRlJiYic3RyaW5nIiE9dHlwZW9mIGRlcHMpe3ZhciBzY3JpcHRzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoInNjcmlwdFtzcmNdIiksbGFzdFNjcmlwdD1zY3JpcHRzW3NjcmlwdHMubGVuZ3RoLTFdO2lmKGxhc3RTY3JpcHQpe2xhc3RTY3JpcHQuc3JjLGxhc3RBdXRvSW1wb3J0RGVwcz1kZXBzO3ZhciBsb2FkZXI9dGhpcztsYXN0QXV0b0ltcG9ydFRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe2F1dG9JbXBvcnRDYW5kaWRhdGVzW2xhc3RTY3JpcHQuc3JjXT1bZGVwcyxkZWNsYXJlXSxsb2FkZXIuaW1wb3J0KGxhc3RTY3JpcHQuc3JjKX0pfX1lbHNlIGxhc3RBdXRvSW1wb3J0RGVwcz12b2lkIDA7cmV0dXJuIHN5c3RlbVJlZ2lzdGVyLmNhbGwodGhpcyxkZXBzLGRlY2xhcmUpfSxzeXN0ZW1KU1Byb3RvdHlwZS5pbnN0YW50aWF0ZT1mdW5jdGlvbih1cmwsZmlyc3RQYXJlbnRVcmwpe3ZhciBhdXRvSW1wb3J0UmVnaXN0cmF0aW9uPWF1dG9JbXBvcnRDYW5kaWRhdGVzW3VybF07aWYoYXV0b0ltcG9ydFJlZ2lzdHJhdGlvbilyZXR1cm4gZGVsZXRlIGF1dG9JbXBvcnRDYW5kaWRhdGVzW3VybF0sYXV0b0ltcG9ydFJlZ2lzdHJhdGlvbjt2YXIgbG9hZGVyPXRoaXM7cmV0dXJuIFByb21pc2UucmVzb2x2ZShzeXN0ZW1KU1Byb3RvdHlwZS5jcmVhdGVTY3JpcHQodXJsKSkudGhlbihmdW5jdGlvbihzY3JpcHQpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLHJlamVjdCl7c2NyaXB0LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe3JlamVjdChFcnJvcihlcnJNc2coMywiRXJyb3IgbG9hZGluZyAiK3VybCsoZmlyc3RQYXJlbnRVcmw/IiBmcm9tICIrZmlyc3RQYXJlbnRVcmw6IiIpKSkpfSksc2NyaXB0LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGZ1bmN0aW9uKCl7aWYoZG9jdW1lbnQuaGVhZC5yZW1vdmVDaGlsZChzY3JpcHQpLGxhc3RXaW5kb3dFcnJvclVybD09PXVybClyZWplY3QobGFzdFdpbmRvd0Vycm9yKTtlbHNle3ZhciByZWdpc3Rlcj1sb2FkZXIuZ2V0UmVnaXN0ZXIodXJsKTtyZWdpc3RlciYmcmVnaXN0ZXJbMF09PT1sYXN0QXV0b0ltcG9ydERlcHMmJmNsZWFyVGltZW91dChsYXN0QXV0b0ltcG9ydFRpbWVvdXQpLHJlc29sdmUocmVnaXN0ZXIpfX0pLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KX0pfSl9LHN5c3RlbUpTUHJvdG90eXBlLnNob3VsZEZldGNoPWZ1bmN0aW9uKCl7cmV0dXJuITF9LCJ1bmRlZmluZWQiIT10eXBlb2YgZmV0Y2gmJihzeXN0ZW1KU1Byb3RvdHlwZS5mZXRjaD1mZXRjaCk7dmFyIGluc3RhbnRpYXRlPXN5c3RlbUpTUHJvdG90eXBlLmluc3RhbnRpYXRlLGpzQ29udGVudFR5cGVSZWdFeD0vXih0ZXh0fGFwcGxpY2F0aW9uKVwvKHgtKT9qYXZhc2NyaXB0KDt8JCkvO3N5c3RlbUpTUHJvdG90eXBlLmluc3RhbnRpYXRlPWZ1bmN0aW9uKHVybCxwYXJlbnQsbWV0YSl7dmFyIGxvYWRlcj10aGlzO3JldHVybiB0aGlzLnNob3VsZEZldGNoKHVybCxwYXJlbnQsbWV0YSk/dGhpcy5mZXRjaCh1cmwse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiIsaW50ZWdyaXR5OmltcG9ydE1hcC5pbnRlZ3JpdHlbdXJsXSxtZXRhfSkudGhlbihmdW5jdGlvbihyZXMpe2lmKCFyZXMub2spdGhyb3cgRXJyb3IoZXJyTXNnKDcscmVzLnN0YXR1cysiICIrcmVzLnN0YXR1c1RleHQrIiwgbG9hZGluZyAiK3VybCsocGFyZW50PyIgZnJvbSAiK3BhcmVudDoiIikpKTt2YXIgY29udGVudFR5cGU9cmVzLmhlYWRlcnMuZ2V0KCJjb250ZW50LXR5cGUiKTtpZighY29udGVudFR5cGV8fCFqc0NvbnRlbnRUeXBlUmVnRXgudGVzdChjb250ZW50VHlwZSkpdGhyb3cgRXJyb3IoZXJyTXNnKDQsJ1Vua25vd24gQ29udGVudC1UeXBlICInK2NvbnRlbnRUeXBlKyciLCBsb2FkaW5nICcrdXJsKyhwYXJlbnQ/IiBmcm9tICIrcGFyZW50OiIiKSkpO3JldHVybiByZXMudGV4dCgpLnRoZW4oZnVuY3Rpb24oc291cmNlKXtyZXR1cm4gc291cmNlLmluZGV4T2YoIi8vIyBzb3VyY2VVUkw9Iik8MCYmKHNvdXJjZSs9IlxuLy8jIHNvdXJjZVVSTD0iK3VybCksKDAsZXZhbCkoc291cmNlKSxsb2FkZXIuZ2V0UmVnaXN0ZXIodXJsKX0pfSk6aW5zdGFudGlhdGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxzeXN0ZW1KU1Byb3RvdHlwZS5yZXNvbHZlPWZ1bmN0aW9uKGlkLHBhcmVudFVybCl7cmV0dXJuIHJlc29sdmVJbXBvcnRNYXAoaW1wb3J0TWFwLHJlc29sdmVJZk5vdFBsYWluT3JVcmwoaWQscGFyZW50VXJsPXBhcmVudFVybHx8YmFzZVVybCl8fGlkLHBhcmVudFVybCl8fGZ1bmN0aW9uIHRocm93VW5yZXNvbHZlZChpZCxwYXJlbnRVcmwpe3Rocm93IEVycm9yKGVyck1zZyg4LCJVbmFibGUgdG8gcmVzb2x2ZSBiYXJlIHNwZWNpZmllciAnIitpZCsocGFyZW50VXJsPyInIGZyb20gIitwYXJlbnRVcmw6IiciKSkpfShpZCxwYXJlbnRVcmwpfTt2YXIgc3lzdGVtSW5zdGFudGlhdGU9c3lzdGVtSlNQcm90b3R5cGUuaW5zdGFudGlhdGU7c3lzdGVtSlNQcm90b3R5cGUuaW5zdGFudGlhdGU9ZnVuY3Rpb24odXJsLGZpcnN0UGFyZW50VXJsLG1ldGEpe3ZhciBwcmVsb2Fkcz1pbXBvcnRNYXAuZGVwY2FjaGVbdXJsXTtpZihwcmVsb2Fkcylmb3IodmFyIGk9MDtpPHByZWxvYWRzLmxlbmd0aDtpKyspZ2V0T3JDcmVhdGVMb2FkKHRoaXMsdGhpcy5yZXNvbHZlKHByZWxvYWRzW2ldLHVybCksdXJsKTtyZXR1cm4gc3lzdGVtSW5zdGFudGlhdGUuY2FsbCh0aGlzLHVybCxmaXJzdFBhcmVudFVybCxtZXRhKX0saGFzU2VsZiYmImZ1bmN0aW9uIj09dHlwZW9mIGltcG9ydFNjcmlwdHMmJihzeXN0ZW1KU1Byb3RvdHlwZS5pbnN0YW50aWF0ZT1mdW5jdGlvbih1cmwpe3ZhciBsb2FkZXI9dGhpcztyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe3JldHVybiBpbXBvcnRTY3JpcHRzKHVybCksbG9hZGVyLmdldFJlZ2lzdGVyKHVybCl9KX0pLGZ1bmN0aW9uKGdsb2JhbCl7dmFyIGZpcnN0R2xvYmFsUHJvcCxzZWNvbmRHbG9iYWxQcm9wLGxhc3RHbG9iYWxQcm9wLHN5c3RlbUpTUHJvdG90eXBlPWdsb2JhbC5TeXN0ZW0uY29uc3RydWN0b3IucHJvdG90eXBlO3ZhciBpbXB0PXN5c3RlbUpTUHJvdG90eXBlLmltcG9ydDtzeXN0ZW1KU1Byb3RvdHlwZS5pbXBvcnQ9ZnVuY3Rpb24oaWQscGFyZW50VXJsLG1ldGEpe3JldHVybiBmdW5jdGlvbiBub3RlR2xvYmFsUHJvcHMoKXtmb3IodmFyIHAgaW4gZmlyc3RHbG9iYWxQcm9wPXNlY29uZEdsb2JhbFByb3A9dm9pZCAwLGdsb2JhbClzaG91bGRTa2lwUHJvcGVydHkocCl8fChmaXJzdEdsb2JhbFByb3A/c2Vjb25kR2xvYmFsUHJvcHx8KHNlY29uZEdsb2JhbFByb3A9cCk6Zmlyc3RHbG9iYWxQcm9wPXAsbGFzdEdsb2JhbFByb3A9cCk7cmV0dXJuIGxhc3RHbG9iYWxQcm9wfSgpLGltcHQuY2FsbCh0aGlzLGlkLHBhcmVudFVybCxtZXRhKX07dmFyIGVtcHR5SW5zdGFudGlhdGlvbj1bW10sZnVuY3Rpb24oKXtyZXR1cm57fX1dLGdldFJlZ2lzdGVyPXN5c3RlbUpTUHJvdG90eXBlLmdldFJlZ2lzdGVyO3N5c3RlbUpTUHJvdG90eXBlLmdldFJlZ2lzdGVyPWZ1bmN0aW9uKCl7dmFyIGxhc3RSZWdpc3Rlcj1nZXRSZWdpc3Rlci5jYWxsKHRoaXMpO2lmKGxhc3RSZWdpc3RlcilyZXR1cm4gbGFzdFJlZ2lzdGVyO3ZhciBnbG9iYWxFeHBvcnQsZ2xvYmFsUHJvcD1mdW5jdGlvbiBnZXRHbG9iYWxQcm9wKHVzZUZpcnN0R2xvYmFsUHJvcCl7dmFyIGZvdW5kTGFzdFByb3AscmVzdWx0LGNudD0wO2Zvcih2YXIgcCBpbiBnbG9iYWwpaWYoIXNob3VsZFNraXBQcm9wZXJ0eShwKSl7aWYoMD09PWNudCYmcCE9PWZpcnN0R2xvYmFsUHJvcHx8MT09PWNudCYmcCE9PXNlY29uZEdsb2JhbFByb3ApcmV0dXJuIHA7Zm91bmRMYXN0UHJvcD8obGFzdEdsb2JhbFByb3A9cCxyZXN1bHQ9dXNlRmlyc3RHbG9iYWxQcm9wJiZyZXN1bHR8fHApOmZvdW5kTGFzdFByb3A9cD09PWxhc3RHbG9iYWxQcm9wLGNudCsrfXJldHVybiByZXN1bHR9KHRoaXMuZmlyc3RHbG9iYWxQcm9wKTtpZighZ2xvYmFsUHJvcClyZXR1cm4gZW1wdHlJbnN0YW50aWF0aW9uO3RyeXtnbG9iYWxFeHBvcnQ9Z2xvYmFsW2dsb2JhbFByb3BdfWNhdGNoKGUpe3JldHVybiBlbXB0eUluc3RhbnRpYXRpb259cmV0dXJuW1tdLGZ1bmN0aW9uKF9leHBvcnQpe3JldHVybntleGVjdXRlOmZ1bmN0aW9uKCl7X2V4cG9ydChnbG9iYWxFeHBvcnQpLF9leHBvcnQoe2RlZmF1bHQ6Z2xvYmFsRXhwb3J0LF9fdXNlRGVmYXVsdDohMH0pfX19XX07dmFyIGlzSUUxMT0idW5kZWZpbmVkIiE9dHlwZW9mIG5hdmlnYXRvciYmLTEhPT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlRyaWRlbnQiKTtmdW5jdGlvbiBzaG91bGRTa2lwUHJvcGVydHkocCl7cmV0dXJuIWdsb2JhbC5oYXNPd25Qcm9wZXJ0eShwKXx8IWlzTmFOKHApJiZwPGdsb2JhbC5sZW5ndGh8fGlzSUUxMSYmZ2xvYmFsW3BdJiYidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmZ2xvYmFsW3BdLnBhcmVudD09PXdpbmRvd319KCJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOl9fd2VicGFja19yZXF1aXJlX18uZyksZnVuY3Rpb24oZ2xvYmFsKXt2YXIgc3lzdGVtSlNQcm90b3R5cGU9Z2xvYmFsLlN5c3RlbS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsbW9kdWxlVHlwZXNSZWdFeD0vXlteIz9dK1wuKGNzc3xodG1sfGpzb258d2FzbSkoWz8jXS4qKT8kLyxfc2hvdWxkRmV0Y2g9c3lzdGVtSlNQcm90b3R5cGUuc2hvdWxkRmV0Y2guYmluZChzeXN0ZW1KU1Byb3RvdHlwZSk7c3lzdGVtSlNQcm90b3R5cGUuc2hvdWxkRmV0Y2g9ZnVuY3Rpb24odXJsKXtyZXR1cm4gX3Nob3VsZEZldGNoKHVybCl8fG1vZHVsZVR5cGVzUmVnRXgudGVzdCh1cmwpfTt2YXIganNvbkNvbnRlbnRUeXBlPS9eYXBwbGljYXRpb25cL2pzb24oO3wkKS8sY3NzQ29udGVudFR5cGU9L150ZXh0XC9jc3MoO3wkKS8sd2FzbUNvbnRlbnRUeXBlPS9eYXBwbGljYXRpb25cL3dhc20oO3wkKS8sZmV0Y2g9c3lzdGVtSlNQcm90b3R5cGUuZmV0Y2g7c3lzdGVtSlNQcm90b3R5cGUuZmV0Y2g9ZnVuY3Rpb24odXJsLG9wdGlvbnMpe3JldHVybiBmZXRjaCh1cmwsb3B0aW9ucykudGhlbihmdW5jdGlvbihyZXMpe2lmKG9wdGlvbnMucGFzc1Rocm91Z2gpcmV0dXJuIHJlcztpZighcmVzLm9rKXJldHVybiByZXM7dmFyIGNvbnRlbnRUeXBlPXJlcy5oZWFkZXJzLmdldCgiY29udGVudC10eXBlIik7cmV0dXJuIGpzb25Db250ZW50VHlwZS50ZXN0KGNvbnRlbnRUeXBlKT9yZXMuanNvbigpLnRoZW4oZnVuY3Rpb24oanNvbil7cmV0dXJuIG5ldyBSZXNwb25zZShuZXcgQmxvYihbJ1N5c3RlbS5yZWdpc3RlcihbXSxmdW5jdGlvbihlKXtyZXR1cm57ZXhlY3V0ZTpmdW5jdGlvbigpe2UoImRlZmF1bHQiLCcrSlNPTi5zdHJpbmdpZnkoanNvbikrIil9fX0pIl0se3R5cGU6ImFwcGxpY2F0aW9uL2phdmFzY3JpcHQifSkpfSk6Y3NzQ29udGVudFR5cGUudGVzdChjb250ZW50VHlwZSk/cmVzLnRleHQoKS50aGVuKGZ1bmN0aW9uKHNvdXJjZSl7cmV0dXJuIHNvdXJjZT1zb3VyY2UucmVwbGFjZSgvdXJsXChccyooPzooWyInXSkoKD86XFwufFteXG5cXCInXSkrKVwxfCgoPzpcXC58W15ccywiJygpXFxdKSspKVxzKlwpL2csZnVuY3Rpb24obWF0Y2gscXVvdGVzLHJlbFVybDEscmVsVXJsMil7cmV0dXJuWyJ1cmwoIixxdW90ZXMscmVzb2x2ZVVybChyZWxVcmwxfHxyZWxVcmwyLHVybCkscXVvdGVzLCIpIl0uam9pbigiIil9KSxuZXcgUmVzcG9uc2UobmV3IEJsb2IoWyJTeXN0ZW0ucmVnaXN0ZXIoW10sZnVuY3Rpb24oZSl7cmV0dXJue2V4ZWN1dGU6ZnVuY3Rpb24oKXt2YXIgcz1uZXcgQ1NTU3R5bGVTaGVldCgpO3MucmVwbGFjZVN5bmMoIitKU09OLnN0cmluZ2lmeShzb3VyY2UpKycpO2UoImRlZmF1bHQiLHMpfX19KSddLHt0eXBlOiJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0In0pKX0pOndhc21Db250ZW50VHlwZS50ZXN0KGNvbnRlbnRUeXBlKT8oV2ViQXNzZW1ibHkuY29tcGlsZVN0cmVhbWluZz9XZWJBc3NlbWJseS5jb21waWxlU3RyZWFtaW5nKHJlcyk6cmVzLmFycmF5QnVmZmVyKCkudGhlbihXZWJBc3NlbWJseS5jb21waWxlKSkudGhlbihmdW5jdGlvbihtb2R1bGUpe2dsb2JhbC5TeXN0ZW0ud2FzbU1vZHVsZXN8fChnbG9iYWwuU3lzdGVtLndhc21Nb2R1bGVzPU9iamVjdC5jcmVhdGUobnVsbCkpLGdsb2JhbC5TeXN0ZW0ud2FzbU1vZHVsZXNbdXJsXT1tb2R1bGU7dmFyIGRlcHM9W10sc2V0dGVyU291cmNlcz1bXTtyZXR1cm4gV2ViQXNzZW1ibHkuTW9kdWxlLmltcG9ydHMmJldlYkFzc2VtYmx5Lk1vZHVsZS5pbXBvcnRzKG1vZHVsZSkuZm9yRWFjaChmdW5jdGlvbihpbXB0KXt2YXIga2V5PUpTT04uc3RyaW5naWZ5KGltcHQubW9kdWxlKTstMT09PWRlcHMuaW5kZXhPZihrZXkpJiYoZGVwcy5wdXNoKGtleSksc2V0dGVyU291cmNlcy5wdXNoKCJmdW5jdGlvbihtKXtpWyIra2V5KyJdPW19IikpfSksbmV3IFJlc3BvbnNlKG5ldyBCbG9iKFsiU3lzdGVtLnJlZ2lzdGVyKFsiK2RlcHMuam9pbigiLCIpKyJdLGZ1bmN0aW9uKGUpe3ZhciBpPXt9O3JldHVybntzZXR0ZXJzOlsiK3NldHRlclNvdXJjZXMuam9pbigiLCIpKyJdLGV4ZWN1dGU6ZnVuY3Rpb24oKXtyZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoU3lzdGVtLndhc21Nb2R1bGVzWyIrSlNPTi5zdHJpbmdpZnkodXJsKSsiXSxpKS50aGVuKGZ1bmN0aW9uKG0pe2UobS5leHBvcnRzKX0pfX19KSJdLHt0eXBlOiJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0In0pKX0pOnJlc30pfX0oInVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6X193ZWJwYWNrX3JlcXVpcmVfXy5nKTt2YXIgdG9TdHJpbmdUYWc9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZztzeXN0ZW1KU1Byb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oaWQpe3ZhciBsb2FkPXRoaXNbUkVHSVNUUlldW2lkXTtpZihsb2FkJiZudWxsPT09bG9hZC5lJiYhbG9hZC5FKXJldHVybiBsb2FkLmVyP251bGw6bG9hZC5ufSxzeXN0ZW1KU1Byb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oaWQsbW9kdWxlKXt0cnl7bmV3IFVSTChpZCl9Y2F0Y2goZXJyKXtjb25zb2xlLndhcm4oRXJyb3IoZXJyTXNnKCJXMyIsJyInK2lkKyciIGlzIG5vdCBhIHZhbGlkIFVSTCB0byBzZXQgaW4gdGhlIG1vZHVsZSByZWdpc3RyeScpKSl9dmFyIG5zO3RvU3RyaW5nVGFnJiYiTW9kdWxlIj09PW1vZHVsZVt0b1N0cmluZ1RhZ10/bnM9bW9kdWxlOihucz1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksbW9kdWxlKSx0b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLHRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pKTt2YXIgZG9uZT1Qcm9taXNlLnJlc29sdmUobnMpLGxvYWQ9dGhpc1tSRUdJU1RSWV1baWRdfHwodGhpc1tSRUdJU1RSWV1baWRdPXtpZCxpOltdLGg6ITEsZDpbXSxlOm51bGwsZXI6dm9pZCAwLEU6dm9pZCAwfSk7cmV0dXJuIWxvYWQuZSYmIWxvYWQuRSYmKE9iamVjdC5hc3NpZ24obG9hZCx7bjpucyxJOnZvaWQgMCxMOnZvaWQgMCxDOmRvbmV9KSxucyl9LHN5c3RlbUpTUHJvdG90eXBlLmhhcz1mdW5jdGlvbihpZCl7cmV0dXJuISF0aGlzW1JFR0lTVFJZXVtpZF19LHN5c3RlbUpTUHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbihpZCl7dmFyIHJlZ2lzdHJ5PXRoaXNbUkVHSVNUUlldLGxvYWQ9cmVnaXN0cnlbaWRdO2lmKCFsb2FkfHxsb2FkLnAmJm51bGwhPT1sb2FkLnAuZXx8bG9hZC5FKXJldHVybiExO3ZhciBpbXBvcnRlclNldHRlcnM9bG9hZC5pO3JldHVybiBsb2FkLmQmJmxvYWQuZC5mb3JFYWNoKGZ1bmN0aW9uKGRlcExvYWQpe3ZhciBpbXBvcnRlckluZGV4PWRlcExvYWQuaS5pbmRleE9mKGxvYWQpOy0xIT09aW1wb3J0ZXJJbmRleCYmZGVwTG9hZC5pLnNwbGljZShpbXBvcnRlckluZGV4LDEpfSksZGVsZXRlIHJlZ2lzdHJ5W2lkXSxmdW5jdGlvbigpe3ZhciBsb2FkPXJlZ2lzdHJ5W2lkXTtpZighbG9hZHx8IWltcG9ydGVyU2V0dGVyc3x8bnVsbCE9PWxvYWQuZXx8bG9hZC5FKXJldHVybiExO2ltcG9ydGVyU2V0dGVycy5mb3JFYWNoKGZ1bmN0aW9uKHNldHRlcil7bG9hZC5pLnB1c2goc2V0dGVyKSxzZXR0ZXIobG9hZC5uKX0pLGltcG9ydGVyU2V0dGVycz1udWxsfX07dmFyIGl0ZXJhdG9yPSJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3I7c3lzdGVtSlNQcm90b3R5cGUuZW50cmllcz1mdW5jdGlvbigpe3ZhciBucyxrZXksbG9hZGVyPXRoaXMsa2V5cz1PYmplY3Qua2V5cyhsb2FkZXJbUkVHSVNUUlldKSxpbmRleD0wLHJlc3VsdD17bmV4dDpmdW5jdGlvbigpe2Zvcig7dm9pZCAwIT09KGtleT1rZXlzW2luZGV4KytdKSYmdm9pZCAwPT09KG5zPWxvYWRlci5nZXQoa2V5KSk7KTtyZXR1cm57ZG9uZTp2b2lkIDA9PT1rZXksdmFsdWU6dm9pZCAwIT09a2V5JiZba2V5LG5zXX19fTtyZXR1cm4gcmVzdWx0W2l0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxyZXN1bHR9fSgpfSwiLi4vLi4vbm9kZV9tb2R1bGVzL3RpbWVycy1icm93c2VyaWZ5L21haW4uanMiKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7dmFyIHNjb3BlPXZvaWQgMCE9PV9fd2VicGFja19yZXF1aXJlX18uZyYmX193ZWJwYWNrX3JlcXVpcmVfXy5nfHwidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGYmJnNlbGZ8fHdpbmRvdyxhcHBseT1GdW5jdGlvbi5wcm90b3R5cGUuYXBwbHk7ZnVuY3Rpb24gVGltZW91dChpZCxjbGVhckZuKXt0aGlzLl9pZD1pZCx0aGlzLl9jbGVhckZuPWNsZWFyRm59ZXhwb3J0cy5zZXRUaW1lb3V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBUaW1lb3V0KGFwcGx5LmNhbGwoc2V0VGltZW91dCxzY29wZSxhcmd1bWVudHMpLGNsZWFyVGltZW91dCl9LGV4cG9ydHMuc2V0SW50ZXJ2YWw9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFRpbWVvdXQoYXBwbHkuY2FsbChzZXRJbnRlcnZhbCxzY29wZSxhcmd1bWVudHMpLGNsZWFySW50ZXJ2YWwpfSxleHBvcnRzLmNsZWFyVGltZW91dD1leHBvcnRzLmNsZWFySW50ZXJ2YWw9ZnVuY3Rpb24odGltZW91dCl7dGltZW91dCYmdGltZW91dC5jbG9zZSgpfSxUaW1lb3V0LnByb3RvdHlwZS51bnJlZj1UaW1lb3V0LnByb3RvdHlwZS5yZWY9ZnVuY3Rpb24oKXt9LFRpbWVvdXQucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dGhpcy5fY2xlYXJGbi5jYWxsKHNjb3BlLHRoaXMuX2lkKX0sZXhwb3J0cy5lbnJvbGw9ZnVuY3Rpb24oaXRlbSxtc2Vjcyl7Y2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpLGl0ZW0uX2lkbGVUaW1lb3V0PW1zZWNzfSxleHBvcnRzLnVuZW5yb2xsPWZ1bmN0aW9uKGl0ZW0pe2NsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKSxpdGVtLl9pZGxlVGltZW91dD0tMX0sZXhwb3J0cy5fdW5yZWZBY3RpdmU9ZXhwb3J0cy5hY3RpdmU9ZnVuY3Rpb24oaXRlbSl7Y2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO3ZhciBtc2Vjcz1pdGVtLl9pZGxlVGltZW91dDttc2Vjcz49MCYmKGl0ZW0uX2lkbGVUaW1lb3V0SWQ9c2V0VGltZW91dChmdW5jdGlvbiBvblRpbWVvdXQoKXtpdGVtLl9vblRpbWVvdXQmJml0ZW0uX29uVGltZW91dCgpfSxtc2VjcykpfSxfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc2V0aW1tZWRpYXRlL3NldEltbWVkaWF0ZS5qcyIpLGV4cG9ydHMuc2V0SW1tZWRpYXRlPSJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZiYmc2VsZi5zZXRJbW1lZGlhdGV8fHZvaWQgMCE9PV9fd2VicGFja19yZXF1aXJlX18uZyYmX193ZWJwYWNrX3JlcXVpcmVfXy5nLnNldEltbWVkaWF0ZXx8dGhpcyYmdGhpcy5zZXRJbW1lZGlhdGUsZXhwb3J0cy5jbGVhckltbWVkaWF0ZT0idW5kZWZpbmVkIiE9dHlwZW9mIHNlbGYmJnNlbGYuY2xlYXJJbW1lZGlhdGV8fHZvaWQgMCE9PV9fd2VicGFja19yZXF1aXJlX18uZyYmX193ZWJwYWNrX3JlcXVpcmVfXy5nLmNsZWFySW1tZWRpYXRlfHx0aGlzJiZ0aGlzLmNsZWFySW1tZWRpYXRlfSwiLi4vLi4vbm9kZV9tb2R1bGVzL3RvLWJ1ZmZlci9pbmRleC5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7dmFyIEJ1ZmZlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc2FmZS1idWZmZXIvaW5kZXguanMiKS5CdWZmZXIsaXNBcnJheT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvdG8tYnVmZmVyL25vZGVfbW9kdWxlcy9pc2FycmF5L2luZGV4LmpzIiksdHlwZWRBcnJheUJ1ZmZlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvdHlwZWQtYXJyYXktYnVmZmVyL2luZGV4LmpzIiksaXNWaWV3PUFycmF5QnVmZmVyLmlzVmlld3x8ZnVuY3Rpb24gaXNWaWV3KG9iail7dHJ5e3JldHVybiB0eXBlZEFycmF5QnVmZmVyKG9iaiksITB9Y2F0Y2goZSl7cmV0dXJuITF9fSx1c2VVaW50OEFycmF5PSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheSx1c2VBcnJheUJ1ZmZlcj0idW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiYidW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXksdXNlRnJvbUFycmF5QnVmZmVyPXVzZUFycmF5QnVmZmVyJiYoQnVmZmVyLnByb3RvdHlwZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbiB0b0J1ZmZlcihkYXRhLGVuY29kaW5nKXtpZihCdWZmZXIuaXNCdWZmZXIoZGF0YSkpcmV0dXJuIGRhdGEuY29uc3RydWN0b3ImJiEoImlzQnVmZmVyImluIGRhdGEpP0J1ZmZlci5mcm9tKGRhdGEpOmRhdGE7aWYoInN0cmluZyI9PXR5cGVvZiBkYXRhKXJldHVybiBCdWZmZXIuZnJvbShkYXRhLGVuY29kaW5nKTtpZih1c2VBcnJheUJ1ZmZlciYmaXNWaWV3KGRhdGEpKXtpZigwPT09ZGF0YS5ieXRlTGVuZ3RoKXJldHVybiBCdWZmZXIuYWxsb2MoMCk7aWYodXNlRnJvbUFycmF5QnVmZmVyKXt2YXIgcmVzPUJ1ZmZlci5mcm9tKGRhdGEuYnVmZmVyLGRhdGEuYnl0ZU9mZnNldCxkYXRhLmJ5dGVMZW5ndGgpO2lmKHJlcy5ieXRlTGVuZ3RoPT09ZGF0YS5ieXRlTGVuZ3RoKXJldHVybiByZXN9dmFyIHVpbnQ4PWRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5P2RhdGE6bmV3IFVpbnQ4QXJyYXkoZGF0YS5idWZmZXIsZGF0YS5ieXRlT2Zmc2V0LGRhdGEuYnl0ZUxlbmd0aCkscmVzdWx0PUJ1ZmZlci5mcm9tKHVpbnQ4KTtpZihyZXN1bHQubGVuZ3RoPT09ZGF0YS5ieXRlTGVuZ3RoKXJldHVybiByZXN1bHR9aWYodXNlVWludDhBcnJheSYmZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpcmV0dXJuIEJ1ZmZlci5mcm9tKGRhdGEpO3ZhciBpc0Fycj1pc0FycmF5KGRhdGEpO2lmKGlzQXJyKWZvcih2YXIgaT0wO2k8ZGF0YS5sZW5ndGg7aSs9MSl7dmFyIHg9ZGF0YVtpXTtpZigibnVtYmVyIiE9dHlwZW9mIHh8fHg8MHx8eD4yNTV8fH5+eCE9PXgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkFycmF5IGl0ZW1zIG11c3QgYmUgbnVtYmVycyBpbiB0aGUgcmFuZ2UgMC0yNTUuIil9aWYoaXNBcnJ8fEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSYmZGF0YS5jb25zdHJ1Y3RvciYmImZ1bmN0aW9uIj09dHlwZW9mIGRhdGEuY29uc3RydWN0b3IuaXNCdWZmZXImJmRhdGEuY29uc3RydWN0b3IuaXNCdWZmZXIoZGF0YSkpcmV0dXJuIEJ1ZmZlci5mcm9tKGRhdGEpO3Rocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSAiZGF0YSIgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgYW4gQXJyYXksIGEgQnVmZmVyLCBhIFVpbnQ4QXJyYXksIG9yIGEgRGF0YVZpZXcuJyl9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3RvLWJ1ZmZlci9ub2RlX21vZHVsZXMvaXNhcnJheS9pbmRleC5qcyIobW9kdWxlKXt2YXIgdG9TdHJpbmc9e30udG9TdHJpbmc7bW9kdWxlLmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYXJyKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT10b1N0cmluZy5jYWxsKGFycil9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3R0eS1icm93c2VyaWZ5L2luZGV4LmpzIihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxleHBvcnRzKXtleHBvcnRzLmlzYXR0eT1mdW5jdGlvbigpe3JldHVybiExfSxleHBvcnRzLlJlYWRTdHJlYW09ZnVuY3Rpb24gUmVhZFN0cmVhbSgpe3Rocm93IG5ldyBFcnJvcigidHR5LlJlYWRTdHJlYW0gaXMgbm90IGltcGxlbWVudGVkIil9LGV4cG9ydHMuV3JpdGVTdHJlYW09ZnVuY3Rpb24gV3JpdGVTdHJlYW0oKXt0aHJvdyBuZXcgRXJyb3IoInR0eS5Xcml0ZVN0cmVhbSBpcyBub3QgaW1wbGVtZW50ZWQiKX19LCIuLi8uLi9ub2RlX21vZHVsZXMvdHlwZWQtYXJyYXktYnVmZmVyL2luZGV4LmpzIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijt2YXIgJFR5cGVFcnJvcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZXMtZXJyb3JzL3R5cGUuanMiKSwkdHlwZWRBcnJheUJ1ZmZlcj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvY2FsbC1ib3VuZC9pbmRleC5qcyIpKCJUeXBlZEFycmF5LnByb3RvdHlwZS5idWZmZXIiLCEwKSxpc1R5cGVkQXJyYXk9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2lzLXR5cGVkLWFycmF5L2luZGV4LmpzIik7bW9kdWxlLmV4cG9ydHM9JHR5cGVkQXJyYXlCdWZmZXJ8fGZ1bmN0aW9uIHR5cGVkQXJyYXlCdWZmZXIoeCl7aWYoIWlzVHlwZWRBcnJheSh4KSl0aHJvdyBuZXcgJFR5cGVFcnJvcigiTm90IGEgVHlwZWQgQXJyYXkiKTtyZXR1cm4geC5idWZmZXJ9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3V0aWwtZGVwcmVjYXRlL2Jyb3dzZXIuanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7ZnVuY3Rpb24gY29uZmlnKG5hbWUpe3RyeXtpZighX193ZWJwYWNrX3JlcXVpcmVfXy5nLmxvY2FsU3RvcmFnZSlyZXR1cm4hMX1jYXRjaChfKXtyZXR1cm4hMX12YXIgdmFsPV9fd2VicGFja19yZXF1aXJlX18uZy5sb2NhbFN0b3JhZ2VbbmFtZV07cmV0dXJuIG51bGwhPXZhbCYmInRydWUiPT09U3RyaW5nKHZhbCkudG9Mb3dlckNhc2UoKX1tb2R1bGUuZXhwb3J0cz1mdW5jdGlvbiBkZXByZWNhdGUoZm4sbXNnKXtpZihjb25maWcoIm5vRGVwcmVjYXRpb24iKSlyZXR1cm4gZm47dmFyIHdhcm5lZD0hMTtyZXR1cm4gZnVuY3Rpb24gZGVwcmVjYXRlZCgpe2lmKCF3YXJuZWQpe2lmKGNvbmZpZygidGhyb3dEZXByZWNhdGlvbiIpKXRocm93IG5ldyBFcnJvcihtc2cpO2NvbmZpZygidHJhY2VEZXByZWNhdGlvbiIpP2NvbnNvbGUudHJhY2UobXNnKTpjb25zb2xlLndhcm4obXNnKSx3YXJuZWQ9ITB9cmV0dXJuIGZuLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3V0aWwvc3VwcG9ydC9pc0J1ZmZlckJyb3dzZXIuanMiKG1vZHVsZSl7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24gaXNCdWZmZXIoYXJnKXtyZXR1cm4gYXJnJiYib2JqZWN0Ij09dHlwZW9mIGFyZyYmImZ1bmN0aW9uIj09dHlwZW9mIGFyZy5jb3B5JiYiZnVuY3Rpb24iPT10eXBlb2YgYXJnLmZpbGwmJiJmdW5jdGlvbiI9PXR5cGVvZiBhcmcucmVhZFVJbnQ4fX0sIi4uLy4uL25vZGVfbW9kdWxlcy91dGlsL3N1cHBvcnQvdHlwZXMuanMiKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBpc0FyZ3VtZW50c09iamVjdD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaXMtYXJndW1lbnRzL2luZGV4LmpzIiksaXNHZW5lcmF0b3JGdW5jdGlvbj1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaXMtZ2VuZXJhdG9yLWZ1bmN0aW9uL2luZGV4LmpzIiksd2hpY2hUeXBlZEFycmF5PV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy93aGljaC10eXBlZC1hcnJheS9pbmRleC5qcyIpLGlzVHlwZWRBcnJheT1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvaXMtdHlwZWQtYXJyYXkvaW5kZXguanMiKTtmdW5jdGlvbiB1bmN1cnJ5VGhpcyhmKXtyZXR1cm4gZi5jYWxsLmJpbmQoZil9dmFyIEJpZ0ludFN1cHBvcnRlZD0idW5kZWZpbmVkIiE9dHlwZW9mIEJpZ0ludCxTeW1ib2xTdXBwb3J0ZWQ9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wsT2JqZWN0VG9TdHJpbmc9dW5jdXJyeVRoaXMoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyksbnVtYmVyVmFsdWU9dW5jdXJyeVRoaXMoTnVtYmVyLnByb3RvdHlwZS52YWx1ZU9mKSxzdHJpbmdWYWx1ZT11bmN1cnJ5VGhpcyhTdHJpbmcucHJvdG90eXBlLnZhbHVlT2YpLGJvb2xlYW5WYWx1ZT11bmN1cnJ5VGhpcyhCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mKTtpZihCaWdJbnRTdXBwb3J0ZWQpdmFyIGJpZ0ludFZhbHVlPXVuY3VycnlUaGlzKEJpZ0ludC5wcm90b3R5cGUudmFsdWVPZik7aWYoU3ltYm9sU3VwcG9ydGVkKXZhciBzeW1ib2xWYWx1ZT11bmN1cnJ5VGhpcyhTeW1ib2wucHJvdG90eXBlLnZhbHVlT2YpO2Z1bmN0aW9uIGNoZWNrQm94ZWRQcmltaXRpdmUodmFsdWUscHJvdG90eXBlVmFsdWVPZil7aWYoIm9iamVjdCIhPXR5cGVvZiB2YWx1ZSlyZXR1cm4hMTt0cnl7cmV0dXJuIHByb3RvdHlwZVZhbHVlT2YodmFsdWUpLCEwfWNhdGNoKGUpe3JldHVybiExfX1mdW5jdGlvbiBpc01hcFRvU3RyaW5nKHZhbHVlKXtyZXR1cm4iW29iamVjdCBNYXBdIj09PU9iamVjdFRvU3RyaW5nKHZhbHVlKX1mdW5jdGlvbiBpc1NldFRvU3RyaW5nKHZhbHVlKXtyZXR1cm4iW29iamVjdCBTZXRdIj09PU9iamVjdFRvU3RyaW5nKHZhbHVlKX1mdW5jdGlvbiBpc1dlYWtNYXBUb1N0cmluZyh2YWx1ZSl7cmV0dXJuIltvYmplY3QgV2Vha01hcF0iPT09T2JqZWN0VG9TdHJpbmcodmFsdWUpfWZ1bmN0aW9uIGlzV2Vha1NldFRvU3RyaW5nKHZhbHVlKXtyZXR1cm4iW29iamVjdCBXZWFrU2V0XSI9PT1PYmplY3RUb1N0cmluZyh2YWx1ZSl9ZnVuY3Rpb24gaXNBcnJheUJ1ZmZlclRvU3RyaW5nKHZhbHVlKXtyZXR1cm4iW29iamVjdCBBcnJheUJ1ZmZlcl0iPT09T2JqZWN0VG9TdHJpbmcodmFsdWUpfWZ1bmN0aW9uIGlzQXJyYXlCdWZmZXIodmFsdWUpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJihpc0FycmF5QnVmZmVyVG9TdHJpbmcud29ya2luZz9pc0FycmF5QnVmZmVyVG9TdHJpbmcodmFsdWUpOnZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpfWZ1bmN0aW9uIGlzRGF0YVZpZXdUb1N0cmluZyh2YWx1ZSl7cmV0dXJuIltvYmplY3QgRGF0YVZpZXddIj09PU9iamVjdFRvU3RyaW5nKHZhbHVlKX1mdW5jdGlvbiBpc0RhdGFWaWV3KHZhbHVlKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIERhdGFWaWV3JiYoaXNEYXRhVmlld1RvU3RyaW5nLndvcmtpbmc/aXNEYXRhVmlld1RvU3RyaW5nKHZhbHVlKTp2YWx1ZSBpbnN0YW5jZW9mIERhdGFWaWV3KX1leHBvcnRzLmlzQXJndW1lbnRzT2JqZWN0PWlzQXJndW1lbnRzT2JqZWN0LGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbj1pc0dlbmVyYXRvckZ1bmN0aW9uLGV4cG9ydHMuaXNUeXBlZEFycmF5PWlzVHlwZWRBcnJheSxleHBvcnRzLmlzUHJvbWlzZT1mdW5jdGlvbiBpc1Byb21pc2UoaW5wdXQpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgUHJvbWlzZSYmaW5wdXQgaW5zdGFuY2VvZiBQcm9taXNlfHxudWxsIT09aW5wdXQmJiJvYmplY3QiPT10eXBlb2YgaW5wdXQmJiJmdW5jdGlvbiI9PXR5cGVvZiBpbnB1dC50aGVuJiYiZnVuY3Rpb24iPT10eXBlb2YgaW5wdXQuY2F0Y2h9LGV4cG9ydHMuaXNBcnJheUJ1ZmZlclZpZXc9ZnVuY3Rpb24gaXNBcnJheUJ1ZmZlclZpZXcodmFsdWUpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJkFycmF5QnVmZmVyLmlzVmlldz9BcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpOmlzVHlwZWRBcnJheSh2YWx1ZSl8fGlzRGF0YVZpZXcodmFsdWUpfSxleHBvcnRzLmlzVWludDhBcnJheT1mdW5jdGlvbiBpc1VpbnQ4QXJyYXkodmFsdWUpe3JldHVybiJVaW50OEFycmF5Ij09PXdoaWNoVHlwZWRBcnJheSh2YWx1ZSl9LGV4cG9ydHMuaXNVaW50OENsYW1wZWRBcnJheT1mdW5jdGlvbiBpc1VpbnQ4Q2xhbXBlZEFycmF5KHZhbHVlKXtyZXR1cm4iVWludDhDbGFtcGVkQXJyYXkiPT09d2hpY2hUeXBlZEFycmF5KHZhbHVlKX0sZXhwb3J0cy5pc1VpbnQxNkFycmF5PWZ1bmN0aW9uIGlzVWludDE2QXJyYXkodmFsdWUpe3JldHVybiJVaW50MTZBcnJheSI9PT13aGljaFR5cGVkQXJyYXkodmFsdWUpfSxleHBvcnRzLmlzVWludDMyQXJyYXk9ZnVuY3Rpb24gaXNVaW50MzJBcnJheSh2YWx1ZSl7cmV0dXJuIlVpbnQzMkFycmF5Ij09PXdoaWNoVHlwZWRBcnJheSh2YWx1ZSl9LGV4cG9ydHMuaXNJbnQ4QXJyYXk9ZnVuY3Rpb24gaXNJbnQ4QXJyYXkodmFsdWUpe3JldHVybiJJbnQ4QXJyYXkiPT09d2hpY2hUeXBlZEFycmF5KHZhbHVlKX0sZXhwb3J0cy5pc0ludDE2QXJyYXk9ZnVuY3Rpb24gaXNJbnQxNkFycmF5KHZhbHVlKXtyZXR1cm4iSW50MTZBcnJheSI9PT13aGljaFR5cGVkQXJyYXkodmFsdWUpfSxleHBvcnRzLmlzSW50MzJBcnJheT1mdW5jdGlvbiBpc0ludDMyQXJyYXkodmFsdWUpe3JldHVybiJJbnQzMkFycmF5Ij09PXdoaWNoVHlwZWRBcnJheSh2YWx1ZSl9LGV4cG9ydHMuaXNGbG9hdDMyQXJyYXk9ZnVuY3Rpb24gaXNGbG9hdDMyQXJyYXkodmFsdWUpe3JldHVybiJGbG9hdDMyQXJyYXkiPT09d2hpY2hUeXBlZEFycmF5KHZhbHVlKX0sZXhwb3J0cy5pc0Zsb2F0NjRBcnJheT1mdW5jdGlvbiBpc0Zsb2F0NjRBcnJheSh2YWx1ZSl7cmV0dXJuIkZsb2F0NjRBcnJheSI9PT13aGljaFR5cGVkQXJyYXkodmFsdWUpfSxleHBvcnRzLmlzQmlnSW50NjRBcnJheT1mdW5jdGlvbiBpc0JpZ0ludDY0QXJyYXkodmFsdWUpe3JldHVybiJCaWdJbnQ2NEFycmF5Ij09PXdoaWNoVHlwZWRBcnJheSh2YWx1ZSl9LGV4cG9ydHMuaXNCaWdVaW50NjRBcnJheT1mdW5jdGlvbiBpc0JpZ1VpbnQ2NEFycmF5KHZhbHVlKXtyZXR1cm4iQmlnVWludDY0QXJyYXkiPT09d2hpY2hUeXBlZEFycmF5KHZhbHVlKX0saXNNYXBUb1N0cmluZy53b3JraW5nPSJ1bmRlZmluZWQiIT10eXBlb2YgTWFwJiZpc01hcFRvU3RyaW5nKG5ldyBNYXApLGV4cG9ydHMuaXNNYXA9ZnVuY3Rpb24gaXNNYXAodmFsdWUpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgTWFwJiYoaXNNYXBUb1N0cmluZy53b3JraW5nP2lzTWFwVG9TdHJpbmcodmFsdWUpOnZhbHVlIGluc3RhbmNlb2YgTWFwKX0saXNTZXRUb1N0cmluZy53b3JraW5nPSJ1bmRlZmluZWQiIT10eXBlb2YgU2V0JiZpc1NldFRvU3RyaW5nKG5ldyBTZXQpLGV4cG9ydHMuaXNTZXQ9ZnVuY3Rpb24gaXNTZXQodmFsdWUpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgU2V0JiYoaXNTZXRUb1N0cmluZy53b3JraW5nP2lzU2V0VG9TdHJpbmcodmFsdWUpOnZhbHVlIGluc3RhbmNlb2YgU2V0KX0saXNXZWFrTWFwVG9TdHJpbmcud29ya2luZz0idW5kZWZpbmVkIiE9dHlwZW9mIFdlYWtNYXAmJmlzV2Vha01hcFRvU3RyaW5nKG5ldyBXZWFrTWFwKSxleHBvcnRzLmlzV2Vha01hcD1mdW5jdGlvbiBpc1dlYWtNYXAodmFsdWUpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgV2Vha01hcCYmKGlzV2Vha01hcFRvU3RyaW5nLndvcmtpbmc/aXNXZWFrTWFwVG9TdHJpbmcodmFsdWUpOnZhbHVlIGluc3RhbmNlb2YgV2Vha01hcCl9LGlzV2Vha1NldFRvU3RyaW5nLndvcmtpbmc9InVuZGVmaW5lZCIhPXR5cGVvZiBXZWFrU2V0JiZpc1dlYWtTZXRUb1N0cmluZyhuZXcgV2Vha1NldCksZXhwb3J0cy5pc1dlYWtTZXQ9ZnVuY3Rpb24gaXNXZWFrU2V0KHZhbHVlKXtyZXR1cm4gaXNXZWFrU2V0VG9TdHJpbmcodmFsdWUpfSxpc0FycmF5QnVmZmVyVG9TdHJpbmcud29ya2luZz0idW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZpc0FycmF5QnVmZmVyVG9TdHJpbmcobmV3IEFycmF5QnVmZmVyKSxleHBvcnRzLmlzQXJyYXlCdWZmZXI9aXNBcnJheUJ1ZmZlcixpc0RhdGFWaWV3VG9TdHJpbmcud29ya2luZz0idW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiYidW5kZWZpbmVkIiE9dHlwZW9mIERhdGFWaWV3JiZpc0RhdGFWaWV3VG9TdHJpbmcobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxKSwwLDEpKSxleHBvcnRzLmlzRGF0YVZpZXc9aXNEYXRhVmlldzt2YXIgU2hhcmVkQXJyYXlCdWZmZXJDb3B5PSJ1bmRlZmluZWQiIT10eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXI/U2hhcmVkQXJyYXlCdWZmZXI6dm9pZCAwO2Z1bmN0aW9uIGlzU2hhcmVkQXJyYXlCdWZmZXJUb1N0cmluZyh2YWx1ZSl7cmV0dXJuIltvYmplY3QgU2hhcmVkQXJyYXlCdWZmZXJdIj09PU9iamVjdFRvU3RyaW5nKHZhbHVlKX1mdW5jdGlvbiBpc1NoYXJlZEFycmF5QnVmZmVyKHZhbHVlKXtyZXR1cm4gdm9pZCAwIT09U2hhcmVkQXJyYXlCdWZmZXJDb3B5JiYodm9pZCAwPT09aXNTaGFyZWRBcnJheUJ1ZmZlclRvU3RyaW5nLndvcmtpbmcmJihpc1NoYXJlZEFycmF5QnVmZmVyVG9TdHJpbmcud29ya2luZz1pc1NoYXJlZEFycmF5QnVmZmVyVG9TdHJpbmcobmV3IFNoYXJlZEFycmF5QnVmZmVyQ29weSkpLGlzU2hhcmVkQXJyYXlCdWZmZXJUb1N0cmluZy53b3JraW5nP2lzU2hhcmVkQXJyYXlCdWZmZXJUb1N0cmluZyh2YWx1ZSk6dmFsdWUgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlckNvcHkpfWZ1bmN0aW9uIGlzTnVtYmVyT2JqZWN0KHZhbHVlKXtyZXR1cm4gY2hlY2tCb3hlZFByaW1pdGl2ZSh2YWx1ZSxudW1iZXJWYWx1ZSl9ZnVuY3Rpb24gaXNTdHJpbmdPYmplY3QodmFsdWUpe3JldHVybiBjaGVja0JveGVkUHJpbWl0aXZlKHZhbHVlLHN0cmluZ1ZhbHVlKX1mdW5jdGlvbiBpc0Jvb2xlYW5PYmplY3QodmFsdWUpe3JldHVybiBjaGVja0JveGVkUHJpbWl0aXZlKHZhbHVlLGJvb2xlYW5WYWx1ZSl9ZnVuY3Rpb24gaXNCaWdJbnRPYmplY3QodmFsdWUpe3JldHVybiBCaWdJbnRTdXBwb3J0ZWQmJmNoZWNrQm94ZWRQcmltaXRpdmUodmFsdWUsYmlnSW50VmFsdWUpfWZ1bmN0aW9uIGlzU3ltYm9sT2JqZWN0KHZhbHVlKXtyZXR1cm4gU3ltYm9sU3VwcG9ydGVkJiZjaGVja0JveGVkUHJpbWl0aXZlKHZhbHVlLHN5bWJvbFZhbHVlKX1leHBvcnRzLmlzU2hhcmVkQXJyYXlCdWZmZXI9aXNTaGFyZWRBcnJheUJ1ZmZlcixleHBvcnRzLmlzQXN5bmNGdW5jdGlvbj1mdW5jdGlvbiBpc0FzeW5jRnVuY3Rpb24odmFsdWUpe3JldHVybiJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIj09PU9iamVjdFRvU3RyaW5nKHZhbHVlKX0sZXhwb3J0cy5pc01hcEl0ZXJhdG9yPWZ1bmN0aW9uIGlzTWFwSXRlcmF0b3IodmFsdWUpe3JldHVybiJbb2JqZWN0IE1hcCBJdGVyYXRvcl0iPT09T2JqZWN0VG9TdHJpbmcodmFsdWUpfSxleHBvcnRzLmlzU2V0SXRlcmF0b3I9ZnVuY3Rpb24gaXNTZXRJdGVyYXRvcih2YWx1ZSl7cmV0dXJuIltvYmplY3QgU2V0IEl0ZXJhdG9yXSI9PT1PYmplY3RUb1N0cmluZyh2YWx1ZSl9LGV4cG9ydHMuaXNHZW5lcmF0b3JPYmplY3Q9ZnVuY3Rpb24gaXNHZW5lcmF0b3JPYmplY3QodmFsdWUpe3JldHVybiJbb2JqZWN0IEdlbmVyYXRvcl0iPT09T2JqZWN0VG9TdHJpbmcodmFsdWUpfSxleHBvcnRzLmlzV2ViQXNzZW1ibHlDb21waWxlZE1vZHVsZT1mdW5jdGlvbiBpc1dlYkFzc2VtYmx5Q29tcGlsZWRNb2R1bGUodmFsdWUpe3JldHVybiJbb2JqZWN0IFdlYkFzc2VtYmx5Lk1vZHVsZV0iPT09T2JqZWN0VG9TdHJpbmcodmFsdWUpfSxleHBvcnRzLmlzTnVtYmVyT2JqZWN0PWlzTnVtYmVyT2JqZWN0LGV4cG9ydHMuaXNTdHJpbmdPYmplY3Q9aXNTdHJpbmdPYmplY3QsZXhwb3J0cy5pc0Jvb2xlYW5PYmplY3Q9aXNCb29sZWFuT2JqZWN0LGV4cG9ydHMuaXNCaWdJbnRPYmplY3Q9aXNCaWdJbnRPYmplY3QsZXhwb3J0cy5pc1N5bWJvbE9iamVjdD1pc1N5bWJvbE9iamVjdCxleHBvcnRzLmlzQm94ZWRQcmltaXRpdmU9ZnVuY3Rpb24gaXNCb3hlZFByaW1pdGl2ZSh2YWx1ZSl7cmV0dXJuIGlzTnVtYmVyT2JqZWN0KHZhbHVlKXx8aXNTdHJpbmdPYmplY3QodmFsdWUpfHxpc0Jvb2xlYW5PYmplY3QodmFsdWUpfHxpc0JpZ0ludE9iamVjdCh2YWx1ZSl8fGlzU3ltYm9sT2JqZWN0KHZhbHVlKX0sZXhwb3J0cy5pc0FueUFycmF5QnVmZmVyPWZ1bmN0aW9uIGlzQW55QXJyYXlCdWZmZXIodmFsdWUpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheSYmKGlzQXJyYXlCdWZmZXIodmFsdWUpfHxpc1NoYXJlZEFycmF5QnVmZmVyKHZhbHVlKSl9LFsiaXNQcm94eSIsImlzRXh0ZXJuYWwiLCJpc01vZHVsZU5hbWVzcGFjZU9iamVjdCJdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cyxtZXRob2Qse2VudW1lcmFibGU6ITEsdmFsdWU6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IobWV0aG9kKyIgaXMgbm90IHN1cHBvcnRlZCBpbiB1c2VybGFuZCIpfX0pfSl9LCIuLi8uLi9ub2RlX21vZHVsZXMvdXRpbC91dGlsLmpzIihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxleHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pe3ZhciBwcm9jZXNzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9ub2RlLXN0ZGxpYi1icm93c2VyL2Nqcy9wcm94eS9wcm9jZXNzLmpzIiksZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc3x8ZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvYmope2Zvcih2YXIga2V5cz1PYmplY3Qua2V5cyhvYmopLGRlc2NyaXB0b3JzPXt9LGk9MDtpPGtleXMubGVuZ3RoO2krKylkZXNjcmlwdG9yc1trZXlzW2ldXT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaixrZXlzW2ldKTtyZXR1cm4gZGVzY3JpcHRvcnN9LGZvcm1hdFJlZ0V4cD0vJVtzZGolXS9nO2V4cG9ydHMuZm9ybWF0PWZ1bmN0aW9uKGYpe2lmKCFpc1N0cmluZyhmKSl7Zm9yKHZhciBvYmplY3RzPVtdLGk9MDtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKW9iamVjdHMucHVzaChpbnNwZWN0KGFyZ3VtZW50c1tpXSkpO3JldHVybiBvYmplY3RzLmpvaW4oIiAiKX1pPTE7Zm9yKHZhciBhcmdzPWFyZ3VtZW50cyxsZW49YXJncy5sZW5ndGgsc3RyPVN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCxmdW5jdGlvbih4KXtpZigiJSUiPT09eClyZXR1cm4iJSI7aWYoaT49bGVuKXJldHVybiB4O3N3aXRjaCh4KXtjYXNlIiVzIjpyZXR1cm4gU3RyaW5nKGFyZ3NbaSsrXSk7Y2FzZSIlZCI6cmV0dXJuIE51bWJlcihhcmdzW2krK10pO2Nhc2UiJWoiOnRyeXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKX1jYXRjaChfKXtyZXR1cm4iW0NpcmN1bGFyXSJ9ZGVmYXVsdDpyZXR1cm4geH19KSx4PWFyZ3NbaV07aTxsZW47eD1hcmdzWysraV0paXNOdWxsKHgpfHwhaXNPYmplY3QoeCk/c3RyKz0iICIreDpzdHIrPSIgIitpbnNwZWN0KHgpO3JldHVybiBzdHJ9LGV4cG9ydHMuZGVwcmVjYXRlPWZ1bmN0aW9uKGZuLG1zZyl7aWYodm9pZCAwIT09cHJvY2VzcyYmITA9PT1wcm9jZXNzLm5vRGVwcmVjYXRpb24pcmV0dXJuIGZuO2lmKHZvaWQgMD09PXByb2Nlc3MpcmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGV4cG9ydHMuZGVwcmVjYXRlKGZuLG1zZykuYXBwbHkodGhpcyxhcmd1bWVudHMpfTt2YXIgd2FybmVkPSExO3JldHVybiBmdW5jdGlvbiBkZXByZWNhdGVkKCl7aWYoIXdhcm5lZCl7aWYocHJvY2Vzcy50aHJvd0RlcHJlY2F0aW9uKXRocm93IG5ldyBFcnJvcihtc2cpO3Byb2Nlc3MudHJhY2VEZXByZWNhdGlvbj9jb25zb2xlLnRyYWNlKG1zZyk6Y29uc29sZS5lcnJvcihtc2cpLHdhcm5lZD0hMH1yZXR1cm4gZm4uYXBwbHkodGhpcyxhcmd1bWVudHMpfX07dmFyIGRlYnVncz17fSxkZWJ1Z0VudlJlZ2V4PS9eJC87aWYocHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyl7dmFyIGRlYnVnRW52PXByb2Nlc3MuZW52Lk5PREVfREVCVUc7ZGVidWdFbnY9ZGVidWdFbnYucmVwbGFjZSgvW3xcXHt9KClbXF1eJCs/Ll0vZywiXFwkJiIpLnJlcGxhY2UoL1wqL2csIi4qIikucmVwbGFjZSgvLC9nLCIkfF4iKS50b1VwcGVyQ2FzZSgpLGRlYnVnRW52UmVnZXg9bmV3IFJlZ0V4cCgiXiIrZGVidWdFbnYrIiQiLCJpIil9ZnVuY3Rpb24gaW5zcGVjdChvYmosb3B0cyl7dmFyIGN0eD17c2VlbjpbXSxzdHlsaXplOnN0eWxpemVOb0NvbG9yfTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD49MyYmKGN0eC5kZXB0aD1hcmd1bWVudHNbMl0pLGFyZ3VtZW50cy5sZW5ndGg+PTQmJihjdHguY29sb3JzPWFyZ3VtZW50c1szXSksaXNCb29sZWFuKG9wdHMpP2N0eC5zaG93SGlkZGVuPW9wdHM6b3B0cyYmZXhwb3J0cy5fZXh0ZW5kKGN0eCxvcHRzKSxpc1VuZGVmaW5lZChjdHguc2hvd0hpZGRlbikmJihjdHguc2hvd0hpZGRlbj0hMSksaXNVbmRlZmluZWQoY3R4LmRlcHRoKSYmKGN0eC5kZXB0aD0yKSxpc1VuZGVmaW5lZChjdHguY29sb3JzKSYmKGN0eC5jb2xvcnM9ITEpLGlzVW5kZWZpbmVkKGN0eC5jdXN0b21JbnNwZWN0KSYmKGN0eC5jdXN0b21JbnNwZWN0PSEwKSxjdHguY29sb3JzJiYoY3R4LnN0eWxpemU9c3R5bGl6ZVdpdGhDb2xvciksZm9ybWF0VmFsdWUoY3R4LG9iaixjdHguZGVwdGgpfWZ1bmN0aW9uIHN0eWxpemVXaXRoQ29sb3Ioc3RyLHN0eWxlVHlwZSl7dmFyIHN0eWxlPWluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07cmV0dXJuIHN0eWxlPyIbWyIraW5zcGVjdC5jb2xvcnNbc3R5bGVdWzBdKyJtIitzdHIrIhtbIitpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMV0rIm0iOnN0cn1mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsc3R5bGVUeXBlKXtyZXR1cm4gc3RyfWZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCx2YWx1ZSxyZWN1cnNlVGltZXMpe2lmKGN0eC5jdXN0b21JbnNwZWN0JiZ2YWx1ZSYmaXNGdW5jdGlvbih2YWx1ZS5pbnNwZWN0KSYmdmFsdWUuaW5zcGVjdCE9PWV4cG9ydHMuaW5zcGVjdCYmKCF2YWx1ZS5jb25zdHJ1Y3Rvcnx8dmFsdWUuY29uc3RydWN0b3IucHJvdG90eXBlIT09dmFsdWUpKXt2YXIgcmV0PXZhbHVlLmluc3BlY3QocmVjdXJzZVRpbWVzLGN0eCk7cmV0dXJuIGlzU3RyaW5nKHJldCl8fChyZXQ9Zm9ybWF0VmFsdWUoY3R4LHJldCxyZWN1cnNlVGltZXMpKSxyZXR9dmFyIHByaW1pdGl2ZT1mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LHZhbHVlKXtpZihpc1VuZGVmaW5lZCh2YWx1ZSkpcmV0dXJuIGN0eC5zdHlsaXplKCJ1bmRlZmluZWQiLCJ1bmRlZmluZWQiKTtpZihpc1N0cmluZyh2YWx1ZSkpe3ZhciBzaW1wbGU9IiciK0pTT04uc3RyaW5naWZ5KHZhbHVlKS5yZXBsYWNlKC9eInwiJC9nLCIiKS5yZXBsYWNlKC8nL2csIlxcJyIpLnJlcGxhY2UoL1xcIi9nLCciJykrIiciO3JldHVybiBjdHguc3R5bGl6ZShzaW1wbGUsInN0cmluZyIpfWlmKGlzTnVtYmVyKHZhbHVlKSlyZXR1cm4gY3R4LnN0eWxpemUoIiIrdmFsdWUsIm51bWJlciIpO2lmKGlzQm9vbGVhbih2YWx1ZSkpcmV0dXJuIGN0eC5zdHlsaXplKCIiK3ZhbHVlLCJib29sZWFuIik7aWYoaXNOdWxsKHZhbHVlKSlyZXR1cm4gY3R4LnN0eWxpemUoIm51bGwiLCJudWxsIil9KGN0eCx2YWx1ZSk7aWYocHJpbWl0aXZlKXJldHVybiBwcmltaXRpdmU7dmFyIGtleXM9T2JqZWN0LmtleXModmFsdWUpLHZpc2libGVLZXlzPWZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KXt2YXIgaGFzaD17fTtyZXR1cm4gYXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsaWR4KXtoYXNoW3ZhbF09ITB9KSxoYXNofShrZXlzKTtpZihjdHguc2hvd0hpZGRlbiYmKGtleXM9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpKSxpc0Vycm9yKHZhbHVlKSYmKGtleXMuaW5kZXhPZigibWVzc2FnZSIpPj0wfHxrZXlzLmluZGV4T2YoImRlc2NyaXB0aW9uIik+PTApKXJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7aWYoMD09PWtleXMubGVuZ3RoKXtpZihpc0Z1bmN0aW9uKHZhbHVlKSl7dmFyIG5hbWU9dmFsdWUubmFtZT8iOiAiK3ZhbHVlLm5hbWU6IiI7cmV0dXJuIGN0eC5zdHlsaXplKCJbRnVuY3Rpb24iK25hbWUrIl0iLCJzcGVjaWFsIil9aWYoaXNSZWdFeHAodmFsdWUpKXJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCJyZWdleHAiKTtpZihpc0RhdGUodmFsdWUpKXJldHVybiBjdHguc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwiZGF0ZSIpO2lmKGlzRXJyb3IodmFsdWUpKXJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSl9dmFyIG91dHB1dCxiYXNlPSIiLGFycmF5PSExLGJyYWNlcz1bInsiLCJ9Il07KGlzQXJyYXkodmFsdWUpJiYoYXJyYXk9ITAsYnJhY2VzPVsiWyIsIl0iXSksaXNGdW5jdGlvbih2YWx1ZSkpJiYoYmFzZT0iIFtGdW5jdGlvbiIrKHZhbHVlLm5hbWU/IjogIit2YWx1ZS5uYW1lOiIiKSsiXSIpO3JldHVybiBpc1JlZ0V4cCh2YWx1ZSkmJihiYXNlPSIgIitSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpKSxpc0RhdGUodmFsdWUpJiYoYmFzZT0iICIrRGF0ZS5wcm90b3R5cGUudG9VVENTdHJpbmcuY2FsbCh2YWx1ZSkpLGlzRXJyb3IodmFsdWUpJiYoYmFzZT0iICIrZm9ybWF0RXJyb3IodmFsdWUpKSwwIT09a2V5cy5sZW5ndGh8fGFycmF5JiYwIT12YWx1ZS5sZW5ndGg/cmVjdXJzZVRpbWVzPDA/aXNSZWdFeHAodmFsdWUpP2N0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksInJlZ2V4cCIpOmN0eC5zdHlsaXplKCJbT2JqZWN0XSIsInNwZWNpYWwiKTooY3R4LnNlZW4ucHVzaCh2YWx1ZSksb3V0cHV0PWFycmF5P2Z1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCx2YWx1ZSxyZWN1cnNlVGltZXMsdmlzaWJsZUtleXMsa2V5cyl7Zm9yKHZhciBvdXRwdXQ9W10saT0wLGw9dmFsdWUubGVuZ3RoO2k8bDsrK2kpaGFzT3duUHJvcGVydHkodmFsdWUsU3RyaW5nKGkpKT9vdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsdmFsdWUscmVjdXJzZVRpbWVzLHZpc2libGVLZXlzLFN0cmluZyhpKSwhMCkpOm91dHB1dC5wdXNoKCIiKTtyZXR1cm4ga2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSl7a2V5Lm1hdGNoKC9eXGQrJC8pfHxvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsdmFsdWUscmVjdXJzZVRpbWVzLHZpc2libGVLZXlzLGtleSwhMCkpfSksb3V0cHV0fShjdHgsdmFsdWUscmVjdXJzZVRpbWVzLHZpc2libGVLZXlzLGtleXMpOmtleXMubWFwKGZ1bmN0aW9uKGtleSl7cmV0dXJuIGZvcm1hdFByb3BlcnR5KGN0eCx2YWx1ZSxyZWN1cnNlVGltZXMsdmlzaWJsZUtleXMsa2V5LGFycmF5KX0pLGN0eC5zZWVuLnBvcCgpLGZ1bmN0aW9uIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCxiYXNlLGJyYWNlcyl7dmFyIGxlbmd0aD1vdXRwdXQucmVkdWNlKGZ1bmN0aW9uKHByZXYsY3VyKXtyZXR1cm4gY3VyLmluZGV4T2YoIlxuIik+PTAmJjAscHJlditjdXIucmVwbGFjZSgvXHUwMDFiXFtcZFxkP20vZywiIikubGVuZ3RoKzF9LDApO2lmKGxlbmd0aD42MClyZXR1cm4gYnJhY2VzWzBdKygiIj09PWJhc2U/IiI6YmFzZSsiXG4gIikrIiAiK291dHB1dC5qb2luKCIsXG4gICIpKyIgIiticmFjZXNbMV07cmV0dXJuIGJyYWNlc1swXStiYXNlKyIgIitvdXRwdXQuam9pbigiLCAiKSsiICIrYnJhY2VzWzFdfShvdXRwdXQsYmFzZSxicmFjZXMpKTpicmFjZXNbMF0rYmFzZSticmFjZXNbMV19ZnVuY3Rpb24gZm9ybWF0RXJyb3IodmFsdWUpe3JldHVybiJbIitFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkrIl0ifWZ1bmN0aW9uIGZvcm1hdFByb3BlcnR5KGN0eCx2YWx1ZSxyZWN1cnNlVGltZXMsdmlzaWJsZUtleXMsa2V5LGFycmF5KXt2YXIgbmFtZSxzdHIsZGVzYztpZigoZGVzYz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLGtleSl8fHt2YWx1ZTp2YWx1ZVtrZXldfSkuZ2V0P3N0cj1kZXNjLnNldD9jdHguc3R5bGl6ZSgiW0dldHRlci9TZXR0ZXJdIiwic3BlY2lhbCIpOmN0eC5zdHlsaXplKCJbR2V0dGVyXSIsInNwZWNpYWwiKTpkZXNjLnNldCYmKHN0cj1jdHguc3R5bGl6ZSgiW1NldHRlcl0iLCJzcGVjaWFsIikpLGhhc093blByb3BlcnR5KHZpc2libGVLZXlzLGtleSl8fChuYW1lPSJbIitrZXkrIl0iKSxzdHJ8fChjdHguc2Vlbi5pbmRleE9mKGRlc2MudmFsdWUpPDA/KHN0cj1pc051bGwocmVjdXJzZVRpbWVzKT9mb3JtYXRWYWx1ZShjdHgsZGVzYy52YWx1ZSxudWxsKTpmb3JtYXRWYWx1ZShjdHgsZGVzYy52YWx1ZSxyZWN1cnNlVGltZXMtMSkpLmluZGV4T2YoIlxuIik+LTEmJihzdHI9YXJyYXk/c3RyLnNwbGl0KCJcbiIpLm1hcChmdW5jdGlvbihsaW5lKXtyZXR1cm4iICAiK2xpbmV9KS5qb2luKCJcbiIpLnNsaWNlKDIpOiJcbiIrc3RyLnNwbGl0KCJcbiIpLm1hcChmdW5jdGlvbihsaW5lKXtyZXR1cm4iICAgIitsaW5lfSkuam9pbigiXG4iKSk6c3RyPWN0eC5zdHlsaXplKCJbQ2lyY3VsYXJdIiwic3BlY2lhbCIpKSxpc1VuZGVmaW5lZChuYW1lKSl7aWYoYXJyYXkmJmtleS5tYXRjaCgvXlxkKyQvKSlyZXR1cm4gc3RyOyhuYW1lPUpTT04uc3RyaW5naWZ5KCIiK2tleSkpLm1hdGNoKC9eIihbYS16QS1aX11bYS16QS1aXzAtOV0qKSIkLyk/KG5hbWU9bmFtZS5zbGljZSgxLC0xKSxuYW1lPWN0eC5zdHlsaXplKG5hbWUsIm5hbWUiKSk6KG5hbWU9bmFtZS5yZXBsYWNlKC8nL2csIlxcJyIpLnJlcGxhY2UoL1xcIi9nLCciJykucmVwbGFjZSgvKF4ifCIkKS9nLCInIiksbmFtZT1jdHguc3R5bGl6ZShuYW1lLCJzdHJpbmciKSl9cmV0dXJuIG5hbWUrIjogIitzdHJ9ZnVuY3Rpb24gaXNBcnJheShhcil7cmV0dXJuIEFycmF5LmlzQXJyYXkoYXIpfWZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGFyZ31mdW5jdGlvbiBpc051bGwoYXJnKXtyZXR1cm4gbnVsbD09PWFyZ31mdW5jdGlvbiBpc051bWJlcihhcmcpe3JldHVybiJudW1iZXIiPT10eXBlb2YgYXJnfWZ1bmN0aW9uIGlzU3RyaW5nKGFyZyl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBhcmd9ZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKXtyZXR1cm4gdm9pZCAwPT09YXJnfWZ1bmN0aW9uIGlzUmVnRXhwKHJlKXtyZXR1cm4gaXNPYmplY3QocmUpJiYiW29iamVjdCBSZWdFeHBdIj09PW9iamVjdFRvU3RyaW5nKHJlKX1mdW5jdGlvbiBpc09iamVjdChhcmcpe3JldHVybiJvYmplY3QiPT10eXBlb2YgYXJnJiZudWxsIT09YXJnfWZ1bmN0aW9uIGlzRGF0ZShkKXtyZXR1cm4gaXNPYmplY3QoZCkmJiJbb2JqZWN0IERhdGVdIj09PW9iamVjdFRvU3RyaW5nKGQpfWZ1bmN0aW9uIGlzRXJyb3IoZSl7cmV0dXJuIGlzT2JqZWN0KGUpJiYoIltvYmplY3QgRXJyb3JdIj09PW9iamVjdFRvU3RyaW5nKGUpfHxlIGluc3RhbmNlb2YgRXJyb3IpfWZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgYXJnfWZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyl9ZnVuY3Rpb24gcGFkKG4pe3JldHVybiBuPDEwPyIwIituLnRvU3RyaW5nKDEwKTpuLnRvU3RyaW5nKDEwKX1leHBvcnRzLmRlYnVnbG9nPWZ1bmN0aW9uKHNldCl7aWYoc2V0PXNldC50b1VwcGVyQ2FzZSgpLCFkZWJ1Z3Nbc2V0XSlpZihkZWJ1Z0VudlJlZ2V4LnRlc3Qoc2V0KSl7dmFyIHBpZD1wcm9jZXNzLnBpZDtkZWJ1Z3Nbc2V0XT1mdW5jdGlvbigpe3ZhciBtc2c9ZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cyxhcmd1bWVudHMpO2NvbnNvbGUuZXJyb3IoIiVzICVkOiAlcyIsc2V0LHBpZCxtc2cpfX1lbHNlIGRlYnVnc1tzZXRdPWZ1bmN0aW9uKCl7fTtyZXR1cm4gZGVidWdzW3NldF19LGV4cG9ydHMuaW5zcGVjdD1pbnNwZWN0LGluc3BlY3QuY29sb3JzPXtib2xkOlsxLDIyXSxpdGFsaWM6WzMsMjNdLHVuZGVybGluZTpbNCwyNF0saW52ZXJzZTpbNywyN10sd2hpdGU6WzM3LDM5XSxncmV5Ols5MCwzOV0sYmxhY2s6WzMwLDM5XSxibHVlOlszNCwzOV0sY3lhbjpbMzYsMzldLGdyZWVuOlszMiwzOV0sbWFnZW50YTpbMzUsMzldLHJlZDpbMzEsMzldLHllbGxvdzpbMzMsMzldfSxpbnNwZWN0LnN0eWxlcz17c3BlY2lhbDoiY3lhbiIsbnVtYmVyOiJ5ZWxsb3ciLGJvb2xlYW46InllbGxvdyIsdW5kZWZpbmVkOiJncmV5IixudWxsOiJib2xkIixzdHJpbmc6ImdyZWVuIixkYXRlOiJtYWdlbnRhIixyZWdleHA6InJlZCJ9LGV4cG9ydHMudHlwZXM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3V0aWwvc3VwcG9ydC90eXBlcy5qcyIpLGV4cG9ydHMuaXNBcnJheT1pc0FycmF5LGV4cG9ydHMuaXNCb29sZWFuPWlzQm9vbGVhbixleHBvcnRzLmlzTnVsbD1pc051bGwsZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZD1mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpe3JldHVybiBudWxsPT1hcmd9LGV4cG9ydHMuaXNOdW1iZXI9aXNOdW1iZXIsZXhwb3J0cy5pc1N0cmluZz1pc1N0cmluZyxleHBvcnRzLmlzU3ltYm9sPWZ1bmN0aW9uIGlzU3ltYm9sKGFyZyl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiBhcmd9LGV4cG9ydHMuaXNVbmRlZmluZWQ9aXNVbmRlZmluZWQsZXhwb3J0cy5pc1JlZ0V4cD1pc1JlZ0V4cCxleHBvcnRzLnR5cGVzLmlzUmVnRXhwPWlzUmVnRXhwLGV4cG9ydHMuaXNPYmplY3Q9aXNPYmplY3QsZXhwb3J0cy5pc0RhdGU9aXNEYXRlLGV4cG9ydHMudHlwZXMuaXNEYXRlPWlzRGF0ZSxleHBvcnRzLmlzRXJyb3I9aXNFcnJvcixleHBvcnRzLnR5cGVzLmlzTmF0aXZlRXJyb3I9aXNFcnJvcixleHBvcnRzLmlzRnVuY3Rpb249aXNGdW5jdGlvbixleHBvcnRzLmlzUHJpbWl0aXZlPWZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZyl7cmV0dXJuIG51bGw9PT1hcmd8fCJib29sZWFuIj09dHlwZW9mIGFyZ3x8Im51bWJlciI9PXR5cGVvZiBhcmd8fCJzdHJpbmciPT10eXBlb2YgYXJnfHwic3ltYm9sIj09dHlwZW9mIGFyZ3x8dm9pZCAwPT09YXJnfSxleHBvcnRzLmlzQnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy91dGlsL3N1cHBvcnQvaXNCdWZmZXJCcm93c2VyLmpzIik7dmFyIG1vbnRocz1bIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdO2Z1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaixwcm9wKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaixwcm9wKX1leHBvcnRzLmxvZz1mdW5jdGlvbigpe2NvbnNvbGUubG9nKCIlcyAtICVzIixmdW5jdGlvbiB0aW1lc3RhbXAoKXt2YXIgZD1uZXcgRGF0ZSx0aW1lPVtwYWQoZC5nZXRIb3VycygpKSxwYWQoZC5nZXRNaW51dGVzKCkpLHBhZChkLmdldFNlY29uZHMoKSldLmpvaW4oIjoiKTtyZXR1cm5bZC5nZXREYXRlKCksbW9udGhzW2QuZ2V0TW9udGgoKV0sdGltZV0uam9pbigiICIpfSgpLGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKSl9LGV4cG9ydHMuaW5oZXJpdHM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiKSxleHBvcnRzLl9leHRlbmQ9ZnVuY3Rpb24ob3JpZ2luLGFkZCl7aWYoIWFkZHx8IWlzT2JqZWN0KGFkZCkpcmV0dXJuIG9yaWdpbjtmb3IodmFyIGtleXM9T2JqZWN0LmtleXMoYWRkKSxpPWtleXMubGVuZ3RoO2ktLTspb3JpZ2luW2tleXNbaV1dPWFkZFtrZXlzW2ldXTtyZXR1cm4gb3JpZ2lufTt2YXIga0N1c3RvbVByb21pc2lmaWVkU3ltYm9sPSJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sP1N5bWJvbCgidXRpbC5wcm9taXNpZnkuY3VzdG9tIik6dm9pZCAwO2Z1bmN0aW9uIGNhbGxiYWNraWZ5T25SZWplY3RlZChyZWFzb24sY2Ipe2lmKCFyZWFzb24pe3ZhciBuZXdSZWFzb249bmV3IEVycm9yKCJQcm9taXNlIHdhcyByZWplY3RlZCB3aXRoIGEgZmFsc3kgdmFsdWUiKTtuZXdSZWFzb24ucmVhc29uPXJlYXNvbixyZWFzb249bmV3UmVhc29ufXJldHVybiBjYihyZWFzb24pfWV4cG9ydHMucHJvbWlzaWZ5PWZ1bmN0aW9uIHByb21pc2lmeShvcmlnaW5hbCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG9yaWdpbmFsKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSAib3JpZ2luYWwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbicpO2lmKGtDdXN0b21Qcm9taXNpZmllZFN5bWJvbCYmb3JpZ2luYWxba0N1c3RvbVByb21pc2lmaWVkU3ltYm9sXSl7dmFyIGZuO2lmKCJmdW5jdGlvbiIhPXR5cGVvZihmbj1vcmlnaW5hbFtrQ3VzdG9tUHJvbWlzaWZpZWRTeW1ib2xdKSl0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgInV0aWwucHJvbWlzaWZ5LmN1c3RvbSIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uJyk7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbixrQ3VzdG9tUHJvbWlzaWZpZWRTeW1ib2wse3ZhbHVlOmZuLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksZm59ZnVuY3Rpb24gZm4oKXtmb3IodmFyIHByb21pc2VSZXNvbHZlLHByb21pc2VSZWplY3QscHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLHJlamVjdCl7cHJvbWlzZVJlc29sdmU9cmVzb2x2ZSxwcm9taXNlUmVqZWN0PXJlamVjdH0pLGFyZ3M9W10saT0wO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7YXJncy5wdXNoKGZ1bmN0aW9uKGVycix2YWx1ZSl7ZXJyP3Byb21pc2VSZWplY3QoZXJyKTpwcm9taXNlUmVzb2x2ZSh2YWx1ZSl9KTt0cnl7b3JpZ2luYWwuYXBwbHkodGhpcyxhcmdzKX1jYXRjaChlcnIpe3Byb21pc2VSZWplY3QoZXJyKX1yZXR1cm4gcHJvbWlzZX1yZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKGZuLE9iamVjdC5nZXRQcm90b3R5cGVPZihvcmlnaW5hbCkpLGtDdXN0b21Qcm9taXNpZmllZFN5bWJvbCYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLGtDdXN0b21Qcm9taXNpZmllZFN5bWJvbCx7dmFsdWU6Zm4sZW51bWVyYWJsZTohMSx3cml0YWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhmbixnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG9yaWdpbmFsKSl9LGV4cG9ydHMucHJvbWlzaWZ5LmN1c3RvbT1rQ3VzdG9tUHJvbWlzaWZpZWRTeW1ib2wsZXhwb3J0cy5jYWxsYmFja2lmeT1mdW5jdGlvbiBjYWxsYmFja2lmeShvcmlnaW5hbCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG9yaWdpbmFsKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSAib3JpZ2luYWwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbicpO2Z1bmN0aW9uIGNhbGxiYWNraWZpZWQoKXtmb3IodmFyIGFyZ3M9W10saT0wO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspYXJncy5wdXNoKGFyZ3VtZW50c1tpXSk7dmFyIG1heWJlQ2I9YXJncy5wb3AoKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgbWF5YmVDYil0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgbGFzdCBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24iKTt2YXIgc2VsZj10aGlzLGNiPWZ1bmN0aW9uKCl7cmV0dXJuIG1heWJlQ2IuYXBwbHkoc2VsZixhcmd1bWVudHMpfTtvcmlnaW5hbC5hcHBseSh0aGlzLGFyZ3MpLnRoZW4oZnVuY3Rpb24ocmV0KXtwcm9jZXNzLm5leHRUaWNrKGNiLmJpbmQobnVsbCxudWxsLHJldCkpfSxmdW5jdGlvbihyZWope3Byb2Nlc3MubmV4dFRpY2soY2FsbGJhY2tpZnlPblJlamVjdGVkLmJpbmQobnVsbCxyZWosY2IpKX0pfXJldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YoY2FsbGJhY2tpZmllZCxPYmplY3QuZ2V0UHJvdG90eXBlT2Yob3JpZ2luYWwpKSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjYWxsYmFja2lmaWVkLGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob3JpZ2luYWwpKSxjYWxsYmFja2lmaWVkfX0sIi4uLy4uL25vZGVfbW9kdWxlcy92bS1icm93c2VyaWZ5L2luZGV4LmpzIihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxleHBvcnRzKXt2YXIgaW5kZXhPZj1mdW5jdGlvbih4cyxpdGVtKXtpZih4cy5pbmRleE9mKXJldHVybiB4cy5pbmRleE9mKGl0ZW0pO2Zvcih2YXIgaT0wO2k8eHMubGVuZ3RoO2krKylpZih4c1tpXT09PWl0ZW0pcmV0dXJuIGk7cmV0dXJuLTF9LE9iamVjdF9rZXlzPWZ1bmN0aW9uKG9iail7aWYoT2JqZWN0LmtleXMpcmV0dXJuIE9iamVjdC5rZXlzKG9iaik7dmFyIHJlcz1bXTtmb3IodmFyIGtleSBpbiBvYmopcmVzLnB1c2goa2V5KTtyZXR1cm4gcmVzfSxmb3JFYWNoPWZ1bmN0aW9uKHhzLGZuKXtpZih4cy5mb3JFYWNoKXJldHVybiB4cy5mb3JFYWNoKGZuKTtmb3IodmFyIGk9MDtpPHhzLmxlbmd0aDtpKyspZm4oeHNbaV0saSx4cyl9LGRlZmluZVByb3A9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwiXyIse30pLGZ1bmN0aW9uKG9iaixuYW1lLHZhbHVlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLG5hbWUse3dyaXRhYmxlOiEwLGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwLHZhbHVlfSl9fWNhdGNoKGUpe3JldHVybiBmdW5jdGlvbihvYmosbmFtZSx2YWx1ZSl7b2JqW25hbWVdPXZhbHVlfX19KCksZ2xvYmFscz1bIkFycmF5IiwiQm9vbGVhbiIsIkRhdGUiLCJFcnJvciIsIkV2YWxFcnJvciIsIkZ1bmN0aW9uIiwiSW5maW5pdHkiLCJKU09OIiwiTWF0aCIsIk5hTiIsIk51bWJlciIsIk9iamVjdCIsIlJhbmdlRXJyb3IiLCJSZWZlcmVuY2VFcnJvciIsIlJlZ0V4cCIsIlN0cmluZyIsIlN5bnRheEVycm9yIiwiVHlwZUVycm9yIiwiVVJJRXJyb3IiLCJkZWNvZGVVUkkiLCJkZWNvZGVVUklDb21wb25lbnQiLCJlbmNvZGVVUkkiLCJlbmNvZGVVUklDb21wb25lbnQiLCJlc2NhcGUiLCJldmFsIiwiaXNGaW5pdGUiLCJpc05hTiIsInBhcnNlRmxvYXQiLCJwYXJzZUludCIsInVuZGVmaW5lZCIsInVuZXNjYXBlIl07ZnVuY3Rpb24gQ29udGV4dCgpe31Db250ZXh0LnByb3RvdHlwZT17fTt2YXIgU2NyaXB0PWV4cG9ydHMuU2NyaXB0PWZ1bmN0aW9uIE5vZGVTY3JpcHQoY29kZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgU2NyaXB0KSlyZXR1cm4gbmV3IFNjcmlwdChjb2RlKTt0aGlzLmNvZGU9Y29kZX07U2NyaXB0LnByb3RvdHlwZS5ydW5JbkNvbnRleHQ9ZnVuY3Rpb24oY29udGV4dCl7aWYoIShjb250ZXh0IGluc3RhbmNlb2YgQ29udGV4dCkpdGhyb3cgbmV3IFR5cGVFcnJvcigibmVlZHMgYSAnY29udGV4dCcgYXJndW1lbnQuIik7dmFyIGlmcmFtZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtpZnJhbWUuc3R5bGV8fChpZnJhbWUuc3R5bGU9e30pLGlmcmFtZS5zdHlsZS5kaXNwbGF5PSJub25lIixkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGlmcmFtZSk7dmFyIHdpbj1pZnJhbWUuY29udGVudFdpbmRvdyx3RXZhbD13aW4uZXZhbCx3RXhlY1NjcmlwdD13aW4uZXhlY1NjcmlwdDshd0V2YWwmJndFeGVjU2NyaXB0JiYod0V4ZWNTY3JpcHQuY2FsbCh3aW4sIm51bGwiKSx3RXZhbD13aW4uZXZhbCksZm9yRWFjaChPYmplY3Rfa2V5cyhjb250ZXh0KSxmdW5jdGlvbihrZXkpe3dpbltrZXldPWNvbnRleHRba2V5XX0pLGZvckVhY2goZ2xvYmFscyxmdW5jdGlvbihrZXkpe2NvbnRleHRba2V5XSYmKHdpbltrZXldPWNvbnRleHRba2V5XSl9KTt2YXIgd2luS2V5cz1PYmplY3Rfa2V5cyh3aW4pLHJlcz13RXZhbC5jYWxsKHdpbix0aGlzLmNvZGUpO3JldHVybiBmb3JFYWNoKE9iamVjdF9rZXlzKHdpbiksZnVuY3Rpb24oa2V5KXsoa2V5IGluIGNvbnRleHR8fC0xPT09aW5kZXhPZih3aW5LZXlzLGtleSkpJiYoY29udGV4dFtrZXldPXdpbltrZXldKX0pLGZvckVhY2goZ2xvYmFscyxmdW5jdGlvbihrZXkpe2tleSBpbiBjb250ZXh0fHxkZWZpbmVQcm9wKGNvbnRleHQsa2V5LHdpbltrZXldKX0pLGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaWZyYW1lKSxyZXN9LFNjcmlwdC5wcm90b3R5cGUucnVuSW5UaGlzQ29udGV4dD1mdW5jdGlvbigpe3JldHVybiBldmFsKHRoaXMuY29kZSl9LFNjcmlwdC5wcm90b3R5cGUucnVuSW5OZXdDb250ZXh0PWZ1bmN0aW9uKGNvbnRleHQpe3ZhciBjdHg9U2NyaXB0LmNyZWF0ZUNvbnRleHQoY29udGV4dCkscmVzPXRoaXMucnVuSW5Db250ZXh0KGN0eCk7cmV0dXJuIGNvbnRleHQmJmZvckVhY2goT2JqZWN0X2tleXMoY3R4KSxmdW5jdGlvbihrZXkpe2NvbnRleHRba2V5XT1jdHhba2V5XX0pLHJlc30sZm9yRWFjaChPYmplY3Rfa2V5cyhTY3JpcHQucHJvdG90eXBlKSxmdW5jdGlvbihuYW1lKXtleHBvcnRzW25hbWVdPVNjcmlwdFtuYW1lXT1mdW5jdGlvbihjb2RlKXt2YXIgcz1TY3JpcHQoY29kZSk7cmV0dXJuIHNbbmFtZV0uYXBwbHkocyxbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSl9fSksZXhwb3J0cy5pc0NvbnRleHQ9ZnVuY3Rpb24oY29udGV4dCl7cmV0dXJuIGNvbnRleHQgaW5zdGFuY2VvZiBDb250ZXh0fSxleHBvcnRzLmNyZWF0ZVNjcmlwdD1mdW5jdGlvbihjb2RlKXtyZXR1cm4gZXhwb3J0cy5TY3JpcHQoY29kZSl9LGV4cG9ydHMuY3JlYXRlQ29udGV4dD1TY3JpcHQuY3JlYXRlQ29udGV4dD1mdW5jdGlvbihjb250ZXh0KXt2YXIgY29weT1uZXcgQ29udGV4dDtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGNvbnRleHQmJmZvckVhY2goT2JqZWN0X2tleXMoY29udGV4dCksZnVuY3Rpb24oa2V5KXtjb3B5W2tleV09Y29udGV4dFtrZXldfSksY29weX19LCIuLi8uLi9ub2RlX21vZHVsZXMvd2hpY2gtdHlwZWQtYXJyYXkvaW5kZXguanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBmb3JFYWNoPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9mb3ItZWFjaC9pbmRleC5qcyIpLGF2YWlsYWJsZVR5cGVkQXJyYXlzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9hdmFpbGFibGUtdHlwZWQtYXJyYXlzL2luZGV4LmpzIiksY2FsbEJpbmQ9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2NhbGwtYmluZC9pbmRleC5qcyIpLGNhbGxCb3VuZD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvY2FsbC1ib3VuZC9pbmRleC5qcyIpLGdPUEQ9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2dvcGQvaW5kZXguanMiKSxnZXRQcm90bz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZ2V0LXByb3RvL2luZGV4LmpzIiksJHRvU3RyaW5nPWNhbGxCb3VuZCgiT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyIpLGhhc1RvU3RyaW5nVGFnPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9oYXMtdG9zdHJpbmd0YWcvc2hhbXMuanMiKSgpLGc9InVuZGVmaW5lZCI9PXR5cGVvZiBnbG9iYWxUaGlzP19fd2VicGFja19yZXF1aXJlX18uZzpnbG9iYWxUaGlzLHR5cGVkQXJyYXlzPWF2YWlsYWJsZVR5cGVkQXJyYXlzKCksJHNsaWNlPWNhbGxCb3VuZCgiU3RyaW5nLnByb3RvdHlwZS5zbGljZSIpLCRpbmRleE9mPWNhbGxCb3VuZCgiQXJyYXkucHJvdG90eXBlLmluZGV4T2YiLCEwKXx8ZnVuY3Rpb24gaW5kZXhPZihhcnJheSx2YWx1ZSl7Zm9yKHZhciBpPTA7aTxhcnJheS5sZW5ndGg7aSs9MSlpZihhcnJheVtpXT09PXZhbHVlKXJldHVybiBpO3JldHVybi0xfSxjYWNoZT17X19wcm90b19fOm51bGx9O2ZvckVhY2godHlwZWRBcnJheXMsaGFzVG9TdHJpbmdUYWcmJmdPUEQmJmdldFByb3RvP2Z1bmN0aW9uKHR5cGVkQXJyYXkpe3ZhciBhcnI9bmV3IGdbdHlwZWRBcnJheV07aWYoU3ltYm9sLnRvU3RyaW5nVGFnIGluIGFyciYmZ2V0UHJvdG8pe3ZhciBwcm90bz1nZXRQcm90byhhcnIpLGRlc2NyaXB0b3I9Z09QRChwcm90byxTeW1ib2wudG9TdHJpbmdUYWcpO2lmKCFkZXNjcmlwdG9yJiZwcm90byl7dmFyIHN1cGVyUHJvdG89Z2V0UHJvdG8ocHJvdG8pO2Rlc2NyaXB0b3I9Z09QRChzdXBlclByb3RvLFN5bWJvbC50b1N0cmluZ1RhZyl9aWYoZGVzY3JpcHRvciYmZGVzY3JpcHRvci5nZXQpe3ZhciBib3VuZD1jYWxsQmluZChkZXNjcmlwdG9yLmdldCk7Y2FjaGVbIiQiK3R5cGVkQXJyYXldPWJvdW5kfX19OmZ1bmN0aW9uKHR5cGVkQXJyYXkpe3ZhciBhcnI9bmV3IGdbdHlwZWRBcnJheV0sZm49YXJyLnNsaWNlfHxhcnIuc2V0O2lmKGZuKXt2YXIgYm91bmQ9Y2FsbEJpbmQoZm4pO2NhY2hlWyIkIit0eXBlZEFycmF5XT1ib3VuZH19KTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbiB3aGljaFR5cGVkQXJyYXkodmFsdWUpe2lmKCF2YWx1ZXx8Im9iamVjdCIhPXR5cGVvZiB2YWx1ZSlyZXR1cm4hMTtpZighaGFzVG9TdHJpbmdUYWcpe3ZhciB0YWc9JHNsaWNlKCR0b1N0cmluZyh2YWx1ZSksOCwtMSk7cmV0dXJuICRpbmRleE9mKHR5cGVkQXJyYXlzLHRhZyk+LTE/dGFnOiJPYmplY3QiPT09dGFnJiZmdW5jdGlvbiB0cnlBbGxTbGljZXModmFsdWUpe3ZhciBmb3VuZD0hMTtyZXR1cm4gZm9yRWFjaChjYWNoZSxmdW5jdGlvbihnZXR0ZXIsbmFtZSl7aWYoIWZvdW5kKXRyeXtnZXR0ZXIodmFsdWUpLGZvdW5kPSRzbGljZShuYW1lLDEpfWNhdGNoKGUpe319KSxmb3VuZH0odmFsdWUpfXJldHVybiBnT1BEP2Z1bmN0aW9uIHRyeUFsbFR5cGVkQXJyYXlzKHZhbHVlKXt2YXIgZm91bmQ9ITE7cmV0dXJuIGZvckVhY2goY2FjaGUsZnVuY3Rpb24oZ2V0dGVyLHR5cGVkQXJyYXkpe2lmKCFmb3VuZCl0cnl7IiQiK2dldHRlcih2YWx1ZSk9PT10eXBlZEFycmF5JiYoZm91bmQ9JHNsaWNlKHR5cGVkQXJyYXksMSkpfWNhdGNoKGUpe319KSxmb3VuZH0odmFsdWUpOm51bGx9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3h0ZW5kL2ltbXV0YWJsZS5qcyIobW9kdWxlKXttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbiBleHRlbmQoKXtmb3IodmFyIHRhcmdldD17fSxpPTA7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIHNvdXJjZT1hcmd1bWVudHNbaV07Zm9yKHZhciBrZXkgaW4gc291cmNlKWhhc093blByb3BlcnR5LmNhbGwoc291cmNlLGtleSkmJih0YXJnZXRba2V5XT1zb3VyY2Vba2V5XSl9cmV0dXJuIHRhcmdldH07dmFyIGhhc093blByb3BlcnR5PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHl9LCIuL3NyYy91dG9vL2luZGV4LmpzIihfX3VudXNlZF93ZWJwYWNrX21vZHVsZSxfX3dlYnBhY2tfZXhwb3J0c19fLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0IjtfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXyx7RFI6KCk9PkVSUl9OT1RfQUxMT1dFRCxGczooKT0+RnMsSEo6KCk9PndvcmtlckNyZWF0ZWQsS0w6KCk9PkVSUl9UWVBFX01JU01BVENILFFSOigpPT5pbml0U3luYyxSNjooKT0+RVJSX1FVT1RBX0VYQ0VFREVELFU3OigpPT5FUlJfTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRUQsV3Y6KCk9PkVSUl9JTlZBTElEX1NUQVRFLGFOOigpPT5yZWN2VGFza01lc3NhZ2VJbldvcmtlcixoODooKT0+RVJSX0FCT1JULGwyOigpPT5zZW5kVGFza01lc3NhZ2UscnY6KCk9PkVSUl9OT1RfRk9VTkR9KTtjbGFzcyBCdWlsZE9wdGlvbnN7X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgcHRyPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLEJ1aWxkT3B0aW9uc0ZpbmFsaXphdGlvbi51bnJlZ2lzdGVyKHRoaXMpLHB0cn1mcmVlKCl7Y29uc3QgcHRyPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7d2FzbS5fX3diZ19idWlsZG9wdGlvbnNfZnJlZShwdHIsMCl9Z2V0IGNvbmZpZygpe3JldHVybiB0YWtlT2JqZWN0KHdhc20uYnVpbGRvcHRpb25zX2NvbmZpZyh0aGlzLl9fd2JnX3B0cikpfWNvbnN0cnVjdG9yKCl7Y29uc3QgcmV0PXdhc20uYnVpbGRvcHRpb25zX25ldygpO3JldHVybiB0aGlzLl9fd2JnX3B0cj1yZXQ+Pj4wLEJ1aWxkT3B0aW9uc0ZpbmFsaXphdGlvbi5yZWdpc3Rlcih0aGlzLHRoaXMuX193YmdfcHRyLHRoaXMpLHRoaXN9c2V0IGNvbmZpZyh2YWwpe3dhc20uYnVpbGRvcHRpb25zX3NldF9jb25maWcodGhpcy5fX3diZ19wdHIsYWRkSGVhcE9iamVjdCh2YWwpKX1nZXQgY2xlYW51cCgpe3JldHVybiAwIT09d2FzbS5fX3diZ19nZXRfYnVpbGRvcHRpb25zX2NsZWFudXAodGhpcy5fX3diZ19wdHIpfXNldCBjbGVhbnVwKGFyZzApe3dhc20uX193Ymdfc2V0X2J1aWxkb3B0aW9uc19jbGVhbnVwKHRoaXMuX193YmdfcHRyLGFyZzApfX1TeW1ib2wuZGlzcG9zZSYmKEJ1aWxkT3B0aW9ucy5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPUJ1aWxkT3B0aW9ucy5wcm90b3R5cGUuZnJlZSk7Y2xhc3MgQ3JlYXRlU3luY0FjY2Vzc0hhbmRsZU9wdGlvbnN7X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgcHRyPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLENyZWF0ZVN5bmNBY2Nlc3NIYW5kbGVPcHRpb25zRmluYWxpemF0aW9uLnVucmVnaXN0ZXIodGhpcykscHRyfWZyZWUoKXtjb25zdCBwdHI9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX2NyZWF0ZXN5bmNhY2Nlc3NoYW5kbGVvcHRpb25zX2ZyZWUocHRyLDApfX1TeW1ib2wuZGlzcG9zZSYmKENyZWF0ZVN5bmNBY2Nlc3NIYW5kbGVPcHRpb25zLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09Q3JlYXRlU3luY0FjY2Vzc0hhbmRsZU9wdGlvbnMucHJvdG90eXBlLmZyZWUpO2NsYXNzIERpckVudHJ5e3N0YXRpYyBfX3dyYXAocHRyKXtwdHI+Pj49MDtjb25zdCBvYmo9T2JqZWN0LmNyZWF0ZShEaXJFbnRyeS5wcm90b3R5cGUpO3JldHVybiBvYmouX193YmdfcHRyPXB0cixEaXJFbnRyeUZpbmFsaXphdGlvbi5yZWdpc3RlcihvYmosb2JqLl9fd2JnX3B0cixvYmopLG9ian10b0pTT04oKXtyZXR1cm57bmFtZTp0aGlzLm5hbWUsdHlwZTp0aGlzLnR5cGV9fXRvU3RyaW5nKCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMpfV9fZGVzdHJveV9pbnRvX3Jhdygpe2NvbnN0IHB0cj10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxEaXJFbnRyeUZpbmFsaXphdGlvbi51bnJlZ2lzdGVyKHRoaXMpLHB0cn1mcmVlKCl7Y29uc3QgcHRyPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7d2FzbS5fX3diZ19kaXJlbnRyeV9mcmVlKHB0ciwwKX1nZXQgbmFtZSgpe2xldCBkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMTt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpO3dhc20uX193YmdfZ2V0X2RpcmVudHJ5X25hbWUocmV0cHRyLHRoaXMuX193YmdfcHRyKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtyZXR1cm4gZGVmZXJyZWQxXzA9cjAsZGVmZXJyZWQxXzE9cjEsZ2V0U3RyaW5nRnJvbVdhc20wKHIwLHIxKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNiksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzEsMSl9fWdldCB0eXBlKCl7Y29uc3QgcmV0PXdhc20uX193YmdfZ2V0X2RpcmVudHJ5X3R5cGUodGhpcy5fX3diZ19wdHIpO3JldHVybiBfX3diaW5kZ2VuX2VudW1fRGlyRW50cnlUeXBlW3JldF19c2V0IG5hbWUoYXJnMCl7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMChhcmcwLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3dhc20uX193Ymdfc2V0X2RpcmVudHJ5X25hbWUodGhpcy5fX3diZ19wdHIscHRyMCxsZW4wKX1zZXQgdHlwZShhcmcwKXt3YXNtLl9fd2JnX3NldF9kaXJlbnRyeV90eXBlKHRoaXMuX193YmdfcHRyLChfX3diaW5kZ2VuX2VudW1fRGlyRW50cnlUeXBlLmluZGV4T2YoYXJnMCkrMXx8MyktMSl9fWZ1bmN0aW9uIEVSUl9BQk9SVCgpe2xldCBkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMTt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpO3dhc20uRVJSX0FCT1JUKHJldHB0cik7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKSxyMT1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCk7cmV0dXJuIGRlZmVycmVkMV8wPXIwLGRlZmVycmVkMV8xPXIxLGdldFN0cmluZ0Zyb21XYXNtMChyMCxyMSl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpLHdhc20uX193YmluZGdlbl9leHBvcnQ0KGRlZmVycmVkMV8wLGRlZmVycmVkMV8xLDEpfX1mdW5jdGlvbiBFUlJfSU5WQUxJRF9TVEFURSgpe2xldCBkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMTt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpO3dhc20uRVJSX0lOVkFMSURfU1RBVEUocmV0cHRyKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtyZXR1cm4gZGVmZXJyZWQxXzA9cjAsZGVmZXJyZWQxXzE9cjEsZ2V0U3RyaW5nRnJvbVdhc20wKHIwLHIxKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNiksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzEsMSl9fWZ1bmN0aW9uIEVSUl9LRVlfQUxSRUFEWV9FWElTVFMoKXtsZXQgZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzE7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KTt3YXNtLkVSUl9LRVlfQUxSRUFEWV9FWElTVFMocmV0cHRyKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtyZXR1cm4gZGVmZXJyZWQxXzA9cjAsZGVmZXJyZWQxXzE9cjEsZ2V0U3RyaW5nRnJvbVdhc20wKHIwLHIxKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNiksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzEsMSl9fWZ1bmN0aW9uIEVSUl9OT1RfQUxMT1dFRCgpe2xldCBkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMTt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpO3dhc20uRVJSX05PVF9BTExPV0VEKHJldHB0cik7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKSxyMT1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCk7cmV0dXJuIGRlZmVycmVkMV8wPXIwLGRlZmVycmVkMV8xPXIxLGdldFN0cmluZ0Zyb21XYXNtMChyMCxyMSl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpLHdhc20uX193YmluZGdlbl9leHBvcnQ0KGRlZmVycmVkMV8wLGRlZmVycmVkMV8xLDEpfX1mdW5jdGlvbiBFUlJfTk9UX0ZPVU5EKCl7bGV0IGRlZmVycmVkMV8wLGRlZmVycmVkMV8xO3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNik7d2FzbS5FUlJfTk9UX0ZPVU5EKHJldHB0cik7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKSxyMT1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCk7cmV0dXJuIGRlZmVycmVkMV8wPXIwLGRlZmVycmVkMV8xPXIxLGdldFN0cmluZ0Zyb21XYXNtMChyMCxyMSl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpLHdhc20uX193YmluZGdlbl9leHBvcnQ0KGRlZmVycmVkMV8wLGRlZmVycmVkMV8xLDEpfX1mdW5jdGlvbiBFUlJfTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRUQoKXtsZXQgZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzE7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KTt3YXNtLkVSUl9LRVlfQUxSRUFEWV9FWElTVFMocmV0cHRyKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtyZXR1cm4gZGVmZXJyZWQxXzA9cjAsZGVmZXJyZWQxXzE9cjEsZ2V0U3RyaW5nRnJvbVdhc20wKHIwLHIxKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNiksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzEsMSl9fWZ1bmN0aW9uIEVSUl9RVU9UQV9FWENFRURFRCgpe2xldCBkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMTt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpO3dhc20uRVJSX1FVT1RBX0VYQ0VFREVEKHJldHB0cik7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKSxyMT1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCk7cmV0dXJuIGRlZmVycmVkMV8wPXIwLGRlZmVycmVkMV8xPXIxLGdldFN0cmluZ0Zyb21XYXNtMChyMCxyMSl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpLHdhc20uX193YmluZGdlbl9leHBvcnQ0KGRlZmVycmVkMV8wLGRlZmVycmVkMV8xLDEpfX1mdW5jdGlvbiBFUlJfVFlQRV9NSVNNQVRDSCgpe2xldCBkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMTt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpO3dhc20uRVJSX1RZUEVfTUlTTUFUQ0gocmV0cHRyKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtyZXR1cm4gZGVmZXJyZWQxXzA9cjAsZGVmZXJyZWQxXzE9cjEsZ2V0U3RyaW5nRnJvbVdhc20wKHIwLHIxKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNiksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDQoZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzEsMSl9fVN5bWJvbC5kaXNwb3NlJiYoRGlyRW50cnkucHJvdG90eXBlW1N5bWJvbC5kaXNwb3NlXT1EaXJFbnRyeS5wcm90b3R5cGUuZnJlZSk7Y2xhc3MgRnN7X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgcHRyPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLEZzRmluYWxpemF0aW9uLnVucmVnaXN0ZXIodGhpcykscHRyfWZyZWUoKXtjb25zdCBwdHI9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX2ZzX2ZyZWUocHRyLDApfXN0YXRpYyBjb3B5RmlsZShzcmMsZHN0KXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHNyYyx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTixwdHIxPXBhc3NTdHJpbmdUb1dhc20wKGRzdCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLmZzX2NvcHlGaWxlKHB0cjAsbGVuMCxwdHIxLGxlbjEpKX1zdGF0aWMgY29weUZpbGVTeW5jKHNyYyxkc3Qpe3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNikscHRyMD1wYXNzU3RyaW5nVG9XYXNtMChzcmMsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU4scHRyMT1wYXNzU3RyaW5nVG9XYXNtMChkc3Qsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMT1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5mc19jb3B5RmlsZVN5bmMocmV0cHRyLHB0cjAsbGVuMCxwdHIxLGxlbjEpO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCk7aWYoZ2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApKXRocm93IHRha2VPYmplY3QocjApfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KX19c3RhdGljIGNyZWF0ZURpcihwYXRoKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5mc19jcmVhdGVEaXIocHRyMCxsZW4wKSl9c3RhdGljIGNyZWF0ZURpckFsbChwYXRoKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5mc19jcmVhdGVEaXJBbGwocHRyMCxsZW4wKSl9c3RhdGljIGNyZWF0ZURpckFsbFN5bmMocGF0aCl7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KSxwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5mc19jcmVhdGVEaXJBbGxTeW5jKHJldHB0cixwdHIwLGxlbjApO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCk7aWYoZ2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApKXRocm93IHRha2VPYmplY3QocjApfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KX19c3RhdGljIGNyZWF0ZURpclN5bmMocGF0aCl7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KSxwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5mc19jcmVhdGVEaXJTeW5jKHJldHB0cixwdHIwLGxlbjApO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCk7aWYoZ2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApKXRocm93IHRha2VPYmplY3QocjApfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KX19c3RhdGljIG1ldGFkYXRhKHBhdGgpe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLmZzX21ldGFkYXRhKHB0cjAsbGVuMCkpfXN0YXRpYyBtZXRhZGF0YVN5bmMocGF0aCl7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KSxwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5mc19tZXRhZGF0YVN5bmMocmV0cHRyLHB0cjAsbGVuMCk7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKSxyMT1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCk7aWYoZ2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzgsITApKXRocm93IHRha2VPYmplY3QocjEpO3JldHVybiBNZXRhZGF0YS5fX3dyYXAocjApfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KX19c3RhdGljIHJlYWQocGF0aCl7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMChwYXRoLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3JldHVybiB0YWtlT2JqZWN0KHdhc20uZnNfcmVhZChwdHIwLGxlbjApKX1zdGF0aWMgcmVhZERpcihwYXRoKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5mc19yZWFkRGlyKHB0cjAsbGVuMCkpfXN0YXRpYyByZWFkRGlyU3luYyhwYXRoKXt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpLHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjt3YXNtLmZzX3JlYWREaXJTeW5jKHJldHB0cixwdHIwLGxlbjApO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCkscjE9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApLHIyPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis4LCEwKTtpZihnZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMTIsITApKXRocm93IHRha2VPYmplY3QocjIpO3ZhciB2Mj1nZXRBcnJheUpzVmFsdWVGcm9tV2FzbTAocjAscjEpLnNsaWNlKCk7cmV0dXJuIHdhc20uX193YmluZGdlbl9leHBvcnQ0KHIwLDQqcjEsNCksdjJ9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpfX1zdGF0aWMgcmVhZFN5bmMocGF0aCl7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KSxwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5mc19yZWFkU3luYyhyZXRwdHIscHRyMCxsZW4wKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApLHIxPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKTtpZihnZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrOCwhMCkpdGhyb3cgdGFrZU9iamVjdChyMSk7cmV0dXJuIHRha2VPYmplY3QocjApfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KX19c3RhdGljIHJlYWRUb1N0cmluZyhwYXRoKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5mc19yZWFkVG9TdHJpbmcocHRyMCxsZW4wKSl9c3RhdGljIHJlbW92ZURpcihwYXRoLHJlY3Vyc2l2ZSl7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMChwYXRoLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3JldHVybiB0YWtlT2JqZWN0KHdhc20uZnNfcmVtb3ZlRGlyKHB0cjAsbGVuMCxyZWN1cnNpdmUpKX1zdGF0aWMgcmVtb3ZlRGlyU3luYyhwYXRoLHJlY3Vyc2l2ZSl7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KSxwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5mc19yZW1vdmVEaXJTeW5jKHJldHB0cixwdHIwLGxlbjAscmVjdXJzaXZlKTt2YXIgcjA9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzAsITApO2lmKGdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0cis0LCEwKSl0aHJvdyB0YWtlT2JqZWN0KHIwKX1maW5hbGx5e3dhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigxNil9fXN0YXRpYyByZW1vdmVGaWxlKHBhdGgpe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLmZzX3JlbW92ZUZpbGUocHRyMCxsZW4wKSl9c3RhdGljIHJlbW92ZUZpbGVTeW5jKHBhdGgpe3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNikscHRyMD1wYXNzU3RyaW5nVG9XYXNtMChwYXRoLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3dhc20uZnNfcmVtb3ZlRmlsZVN5bmMocmV0cHRyLHB0cjAsbGVuMCk7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKTtpZihnZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCkpdGhyb3cgdGFrZU9iamVjdChyMCl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpfX1zdGF0aWMgd3JpdGUocGF0aCxjb250ZW50KXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKHBhdGgsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5mc193cml0ZShwdHIwLGxlbjAsYWRkSGVhcE9iamVjdChjb250ZW50KSkpfXN0YXRpYyB3cml0ZVN0cmluZyhwYXRoLGNvbnRlbnQpe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTixwdHIxPXBhc3NTdHJpbmdUb1dhc20wKGNvbnRlbnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMT1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5mc193cml0ZVN0cmluZyhwdHIwLGxlbjAscHRyMSxsZW4xKSl9c3RhdGljIHdyaXRlU3luYyhwYXRoLGNvbnRlbnQpe3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNikscHRyMD1wYXNzU3RyaW5nVG9XYXNtMChwYXRoLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3dhc20uZnNfd3JpdGVTeW5jKHJldHB0cixwdHIwLGxlbjAsYWRkSGVhcE9iamVjdChjb250ZW50KSk7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKTtpZihnZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCkpdGhyb3cgdGFrZU9iamVjdChyMCl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpfX19U3ltYm9sLmRpc3Bvc2UmJihGcy5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPUZzLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBNZXRhZGF0YXtzdGF0aWMgX193cmFwKHB0cil7cHRyPj4+PTA7Y29uc3Qgb2JqPU9iamVjdC5jcmVhdGUoTWV0YWRhdGEucHJvdG90eXBlKTtyZXR1cm4gb2JqLl9fd2JnX3B0cj1wdHIsTWV0YWRhdGFGaW5hbGl6YXRpb24ucmVnaXN0ZXIob2JqLG9iai5fX3diZ19wdHIsb2JqKSxvYmp9dG9KU09OKCl7cmV0dXJue2ZpbGVfc2l6ZTp0aGlzLmZpbGVfc2l6ZSx0eXBlOnRoaXMudHlwZX19dG9TdHJpbmcoKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyl9X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgcHRyPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLE1ldGFkYXRhRmluYWxpemF0aW9uLnVucmVnaXN0ZXIodGhpcykscHRyfWZyZWUoKXtjb25zdCBwdHI9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX21ldGFkYXRhX2ZyZWUocHRyLDApfWdldCBmaWxlX3NpemUoKXtjb25zdCByZXQ9d2FzbS5fX3diZ19nZXRfbWV0YWRhdGFfZmlsZV9zaXplKHRoaXMuX193YmdfcHRyKTtyZXR1cm4gQmlnSW50LmFzVWludE4oNjQscmV0KX1nZXQgdHlwZSgpe2NvbnN0IHJldD13YXNtLl9fd2JnX2dldF9tZXRhZGF0YV90eXBlKHRoaXMuX193YmdfcHRyKTtyZXR1cm4gX193YmluZGdlbl9lbnVtX0RpckVudHJ5VHlwZVtyZXRdfXNldCBmaWxlX3NpemUoYXJnMCl7d2FzbS5fX3diZ19zZXRfbWV0YWRhdGFfZmlsZV9zaXplKHRoaXMuX193YmdfcHRyLGFyZzApfXNldCB0eXBlKGFyZzApe3dhc20uX193Ymdfc2V0X21ldGFkYXRhX3R5cGUodGhpcy5fX3diZ19wdHIsKF9fd2JpbmRnZW5fZW51bV9EaXJFbnRyeVR5cGUuaW5kZXhPZihhcmcwKSsxfHwzKS0xKX19U3ltYm9sLmRpc3Bvc2UmJihNZXRhZGF0YS5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPU1ldGFkYXRhLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBQcm9qZWN0e19fZGVzdHJveV9pbnRvX3Jhdygpe2NvbnN0IHB0cj10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxQcm9qZWN0RmluYWxpemF0aW9uLnVucmVnaXN0ZXIodGhpcykscHRyfWZyZWUoKXtjb25zdCBwdHI9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX3Byb2plY3RfZnJlZShwdHIsMCl9c3RhdGljIGJ1aWxkKG9wdGlvbnMpe19hc3NlcnRDbGFzcyhvcHRpb25zLEJ1aWxkT3B0aW9ucyk7dmFyIHB0cjA9b3B0aW9ucy5fX2Rlc3Ryb3lfaW50b19yYXcoKTtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLnByb2plY3RfYnVpbGQocHRyMCkpfXN0YXRpYyBnZXQgY3dkKCl7bGV0IGRlZmVycmVkMV8wLGRlZmVycmVkMV8xO3RyeXtjb25zdCByZXRwdHI9d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNik7d2FzbS5wcm9qZWN0X2N3ZChyZXRwdHIpO3ZhciByMD1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrMCwhMCkscjE9Z2V0RGF0YVZpZXdNZW1vcnkwKCkuZ2V0SW50MzIocmV0cHRyKzQsITApO3JldHVybiBkZWZlcnJlZDFfMD1yMCxkZWZlcnJlZDFfMT1yMSxnZXRTdHJpbmdGcm9tV2FzbTAocjAscjEpfWZpbmFsbHl7d2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0NChkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMSwxKX19c3RhdGljIGRlcHMocmVnaXN0cnksY29uY3VycmVuY3kpe3ZhciBwdHIwPWlzTGlrZU5vbmUocmVnaXN0cnkpPzA6cGFzc1N0cmluZ1RvV2FzbTAocmVnaXN0cnksd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5wcm9qZWN0X2RlcHMocHRyMCxsZW4wLGlzTGlrZU5vbmUoY29uY3VycmVuY3kpPzQyOTQ5NjcyOTc6Y29uY3VycmVuY3k+Pj4wKSl9c3RhdGljIGVudHJ5cG9pbnRzU3Vic2NyaWJlKGNvbmZpZyxjYWxsYmFjayl7cmV0dXJuIHRha2VPYmplY3Qod2FzbS5wcm9qZWN0X2VudHJ5cG9pbnRzU3Vic2NyaWJlKGFkZEhlYXBPYmplY3QoY29uZmlnKSxhZGRIZWFwT2JqZWN0KGNhbGxiYWNrKSkpfXN0YXRpYyBnemlwKGZpbGVzKXtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLnByb2plY3RfZ3ppcChhZGRIZWFwT2JqZWN0KGZpbGVzKSkpfXN0YXRpYyBobXJFdmVudHMoaWRlbnRpZmllcixjYWxsYmFjayl7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMChpZGVudGlmaWVyLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3JldHVybiB0YWtlT2JqZWN0KHdhc20ucHJvamVjdF9obXJFdmVudHMocHRyMCxsZW4wLGFkZEhlYXBPYmplY3QoY2FsbGJhY2spKSl9c3RhdGljIGluaXQodGhyZWFkX3VybCl7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMCh0aHJlYWRfdXJsLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjA9V0FTTV9WRUNUT1JfTEVOO3dhc20ucHJvamVjdF9pbml0KHB0cjAsbGVuMCl9c3RhdGljIGluc3RhbGwocGFja2FnZV9sb2NrLG1heF9jb25jdXJyZW50X2Rvd25sb2Fkcyl7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMChwYWNrYWdlX2xvY2ssd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47cmV0dXJuIHRha2VPYmplY3Qod2FzbS5wcm9qZWN0X2luc3RhbGwocHRyMCxsZW4wLGlzTGlrZU5vbmUobWF4X2NvbmN1cnJlbnRfZG93bmxvYWRzKT80Mjk0OTY3Mjk3Om1heF9jb25jdXJyZW50X2Rvd25sb2Fkcz4+PjApKX1zdGF0aWMgc2V0Q3dkKHBhdGgpe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAocGF0aCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjt3YXNtLnByb2plY3Rfc2V0Q3dkKHB0cjAsbGVuMCl9c3RhdGljIHNpZ01kNShjb250ZW50KXtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLnByb2plY3Rfc2lnTWQ1KGFkZEhlYXBPYmplY3QoY29udGVudCkpKX1zdGF0aWMgdXBkYXRlSW5mb1N1YnNjcmliZShhZ2dyZWdhdGlvbl9tcyxjYWxsYmFjayl7d2FzbS5wcm9qZWN0X3VwZGF0ZUluZm9TdWJzY3JpYmUoYWdncmVnYXRpb25fbXMsYWRkSGVhcE9iamVjdChjYWxsYmFjaykpfXN0YXRpYyB3cml0ZUFsbFRvRGlzayhjYWxsYmFjayl7d2FzbS5wcm9qZWN0X3dyaXRlQWxsVG9EaXNrKGFkZEhlYXBPYmplY3QoY2FsbGJhY2spKX19U3ltYm9sLmRpc3Bvc2UmJihQcm9qZWN0LnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09UHJvamVjdC5wcm90b3R5cGUuZnJlZSk7Y2xhc3MgUm9vdFRhc2t7c3RhdGljIF9fd3JhcChwdHIpe3B0cj4+Pj0wO2NvbnN0IG9iaj1PYmplY3QuY3JlYXRlKFJvb3RUYXNrLnByb3RvdHlwZSk7cmV0dXJuIG9iai5fX3diZ19wdHI9cHRyLFJvb3RUYXNrRmluYWxpemF0aW9uLnJlZ2lzdGVyKG9iaixvYmouX193YmdfcHRyLG9iaiksb2JqfV9fZGVzdHJveV9pbnRvX3Jhdygpe2NvbnN0IHB0cj10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxSb290VGFza0ZpbmFsaXphdGlvbi51bnJlZ2lzdGVyKHRoaXMpLHB0cn1mcmVlKCl7Y29uc3QgcHRyPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7d2FzbS5fX3diZ19yb290dGFza19mcmVlKHB0ciwwKX19U3ltYm9sLmRpc3Bvc2UmJihSb290VGFzay5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPVJvb3RUYXNrLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBXYXNtVGFza01lc3NhZ2V7c3RhdGljIF9fd3JhcChwdHIpe3B0cj4+Pj0wO2NvbnN0IG9iaj1PYmplY3QuY3JlYXRlKFdhc21UYXNrTWVzc2FnZS5wcm90b3R5cGUpO3JldHVybiBvYmouX193YmdfcHRyPXB0cixXYXNtVGFza01lc3NhZ2VGaW5hbGl6YXRpb24ucmVnaXN0ZXIob2JqLG9iai5fX3diZ19wdHIsb2JqKSxvYmp9X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgcHRyPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLFdhc21UYXNrTWVzc2FnZUZpbmFsaXphdGlvbi51bnJlZ2lzdGVyKHRoaXMpLHB0cn1mcmVlKCl7Y29uc3QgcHRyPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7d2FzbS5fX3diZ193YXNtdGFza21lc3NhZ2VfZnJlZShwdHIsMCl9Z2V0IHRhc2tJZCgpe3JldHVybiB3YXNtLl9fd2JnX2dldF93YXNtdGFza21lc3NhZ2VfdGFza0lkKHRoaXMuX193YmdfcHRyKT4+PjB9c2V0IHRhc2tJZChhcmcwKXt3YXNtLl9fd2JnX3NldF93YXNtdGFza21lc3NhZ2VfdGFza0lkKHRoaXMuX193YmdfcHRyLGFyZzApfWdldCBkYXRhKCl7cmV0dXJuIHRha2VPYmplY3Qod2FzbS53YXNtdGFza21lc3NhZ2VfZGF0YSh0aGlzLl9fd2JnX3B0cikpfX1TeW1ib2wuZGlzcG9zZSYmKFdhc21UYXNrTWVzc2FnZS5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPVdhc21UYXNrTWVzc2FnZS5wcm90b3R5cGUuZnJlZSk7Y2xhc3MgV2ViV29ya2VyQ3JlYXRpb257c3RhdGljIF9fd3JhcChwdHIpe3B0cj4+Pj0wO2NvbnN0IG9iaj1PYmplY3QuY3JlYXRlKFdlYldvcmtlckNyZWF0aW9uLnByb3RvdHlwZSk7cmV0dXJuIG9iai5fX3diZ19wdHI9cHRyLFdlYldvcmtlckNyZWF0aW9uRmluYWxpemF0aW9uLnJlZ2lzdGVyKG9iaixvYmouX193YmdfcHRyLG9iaiksb2JqfV9fZGVzdHJveV9pbnRvX3Jhdygpe2NvbnN0IHB0cj10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxXZWJXb3JrZXJDcmVhdGlvbkZpbmFsaXphdGlvbi51bnJlZ2lzdGVyKHRoaXMpLHB0cn1mcmVlKCl7Y29uc3QgcHRyPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7d2FzbS5fX3diZ193ZWJ3b3JrZXJjcmVhdGlvbl9mcmVlKHB0ciwwKX1nZXQgb3B0aW9ucygpe2NvbnN0IHJldD13YXNtLl9fd2JnX2dldF93ZWJ3b3JrZXJjcmVhdGlvbl9vcHRpb25zKHRoaXMuX193YmdfcHRyKTtyZXR1cm4gV2ViV29ya2VyT3B0aW9ucy5fX3dyYXAocmV0KX1zZXQgb3B0aW9ucyhhcmcwKXtfYXNzZXJ0Q2xhc3MoYXJnMCxXZWJXb3JrZXJPcHRpb25zKTt2YXIgcHRyMD1hcmcwLl9fZGVzdHJveV9pbnRvX3JhdygpO3dhc20uX193Ymdfc2V0X3dlYndvcmtlcmNyZWF0aW9uX29wdGlvbnModGhpcy5fX3diZ19wdHIscHRyMCl9fVN5bWJvbC5kaXNwb3NlJiYoV2ViV29ya2VyQ3JlYXRpb24ucHJvdG90eXBlW1N5bWJvbC5kaXNwb3NlXT1XZWJXb3JrZXJDcmVhdGlvbi5wcm90b3R5cGUuZnJlZSk7Y2xhc3MgV2ViV29ya2VyT3B0aW9uc3tzdGF0aWMgX193cmFwKHB0cil7cHRyPj4+PTA7Y29uc3Qgb2JqPU9iamVjdC5jcmVhdGUoV2ViV29ya2VyT3B0aW9ucy5wcm90b3R5cGUpO3JldHVybiBvYmouX193YmdfcHRyPXB0cixXZWJXb3JrZXJPcHRpb25zRmluYWxpemF0aW9uLnJlZ2lzdGVyKG9iaixvYmouX193YmdfcHRyLG9iaiksb2JqfV9fZGVzdHJveV9pbnRvX3Jhdygpe2NvbnN0IHB0cj10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxXZWJXb3JrZXJPcHRpb25zRmluYWxpemF0aW9uLnVucmVnaXN0ZXIodGhpcykscHRyfWZyZWUoKXtjb25zdCBwdHI9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX3dlYndvcmtlcm9wdGlvbnNfZnJlZShwdHIsMCl9Z2V0IGN3ZCgpe2xldCBkZWZlcnJlZDFfMCxkZWZlcnJlZDFfMTt0cnl7Y29uc3QgcmV0cHRyPXdhc20uX193YmluZGdlbl9hZGRfdG9fc3RhY2tfcG9pbnRlcigtMTYpO3dhc20uX193YmdfZ2V0X3dlYndvcmtlcm9wdGlvbnNfY3dkKHJldHB0cix0aGlzLl9fd2JnX3B0cik7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKSxyMT1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCk7cmV0dXJuIGRlZmVycmVkMV8wPXIwLGRlZmVycmVkMV8xPXIxLGdldFN0cmluZ0Zyb21XYXNtMChyMCxyMSl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpLHdhc20uX193YmluZGdlbl9leHBvcnQ0KGRlZmVycmVkMV8wLGRlZmVycmVkMV8xLDEpfX1nZXQgZmlsZW5hbWUoKXtsZXQgZGVmZXJyZWQxXzAsZGVmZXJyZWQxXzE7dHJ5e2NvbnN0IHJldHB0cj13YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoLTE2KTt3YXNtLl9fd2JnX2dldF93ZWJ3b3JrZXJvcHRpb25zX2ZpbGVuYW1lKHJldHB0cix0aGlzLl9fd2JnX3B0cik7dmFyIHIwPWdldERhdGFWaWV3TWVtb3J5MCgpLmdldEludDMyKHJldHB0ciswLCEwKSxyMT1nZXREYXRhVmlld01lbW9yeTAoKS5nZXRJbnQzMihyZXRwdHIrNCwhMCk7cmV0dXJuIGRlZmVycmVkMV8wPXIwLGRlZmVycmVkMV8xPXIxLGdldFN0cmluZ0Zyb21XYXNtMChyMCxyMSl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIoMTYpLHdhc20uX193YmluZGdlbl9leHBvcnQ0KGRlZmVycmVkMV8wLGRlZmVycmVkMV8xLDEpfX1zZXQgY3dkKGFyZzApe2NvbnN0IHB0cjA9cGFzc1N0cmluZ1RvV2FzbTAoYXJnMCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4wPVdBU01fVkVDVE9SX0xFTjt3YXNtLl9fd2JnX3NldF93ZWJ3b3JrZXJvcHRpb25zX2N3ZCh0aGlzLl9fd2JnX3B0cixwdHIwLGxlbjApfXNldCBmaWxlbmFtZShhcmcwKXtjb25zdCBwdHIwPXBhc3NTdHJpbmdUb1dhc20wKGFyZzAsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5fX3diZ19zZXRfd2Vid29ya2Vyb3B0aW9uc19maWxlbmFtZSh0aGlzLl9fd2JnX3B0cixwdHIwLGxlbjApfX1TeW1ib2wuZGlzcG9zZSYmKFdlYldvcmtlck9wdGlvbnMucHJvdG90eXBlW1N5bWJvbC5kaXNwb3NlXT1XZWJXb3JrZXJPcHRpb25zLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBXZWJXb3JrZXJUZXJtaW5hdGlvbntzdGF0aWMgX193cmFwKHB0cil7cHRyPj4+PTA7Y29uc3Qgb2JqPU9iamVjdC5jcmVhdGUoV2ViV29ya2VyVGVybWluYXRpb24ucHJvdG90eXBlKTtyZXR1cm4gb2JqLl9fd2JnX3B0cj1wdHIsV2ViV29ya2VyVGVybWluYXRpb25GaW5hbGl6YXRpb24ucmVnaXN0ZXIob2JqLG9iai5fX3diZ19wdHIsb2JqKSxvYmp9X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgcHRyPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLFdlYldvcmtlclRlcm1pbmF0aW9uRmluYWxpemF0aW9uLnVucmVnaXN0ZXIodGhpcykscHRyfWZyZWUoKXtjb25zdCBwdHI9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt3YXNtLl9fd2JnX3dlYndvcmtlcnRlcm1pbmF0aW9uX2ZyZWUocHRyLDApfWdldCBvcHRpb25zKCl7Y29uc3QgcmV0PXdhc20uX193YmdfZ2V0X3dlYndvcmtlcnRlcm1pbmF0aW9uX29wdGlvbnModGhpcy5fX3diZ19wdHIpO3JldHVybiBXZWJXb3JrZXJPcHRpb25zLl9fd3JhcChyZXQpfWdldCB3b3JrZXJJZCgpe3JldHVybiB3YXNtLl9fd2JnX2dldF93ZWJ3b3JrZXJ0ZXJtaW5hdGlvbl93b3JrZXJJZCh0aGlzLl9fd2JnX3B0cik+Pj4wfXNldCBvcHRpb25zKGFyZzApe19hc3NlcnRDbGFzcyhhcmcwLFdlYldvcmtlck9wdGlvbnMpO3ZhciBwdHIwPWFyZzAuX19kZXN0cm95X2ludG9fcmF3KCk7d2FzbS5fX3diZ19zZXRfd2Vid29ya2VydGVybWluYXRpb25fb3B0aW9ucyh0aGlzLl9fd2JnX3B0cixwdHIwKX1zZXQgd29ya2VySWQoYXJnMCl7d2FzbS5fX3diZ19zZXRfd2Vid29ya2VydGVybWluYXRpb25fd29ya2VySWQodGhpcy5fX3diZ19wdHIsYXJnMCl9fWZ1bmN0aW9uIGdldFdhc21NZW1vcnkoKXtyZXR1cm4gdGFrZU9iamVjdCh3YXNtLmdldFdhc21NZW1vcnkoKSl9ZnVuY3Rpb24gZ2V0V2FzbU1vZHVsZSgpe3JldHVybiB0YWtlT2JqZWN0KHdhc20uZ2V0V2FzbU1vZHVsZSgpKX1mdW5jdGlvbiBpbml0TG9nRmlsdGVyKGZpbHRlcil7Y29uc3QgcHRyMD1wYXNzU3RyaW5nVG9XYXNtMChmaWx0ZXIsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MiksbGVuMD1XQVNNX1ZFQ1RPUl9MRU47d2FzbS5pbml0TG9nRmlsdGVyKHB0cjAsbGVuMCl9ZnVuY3Rpb24gaW5pdF9wYWNrKCl7d2FzbS5pbml0X3BhY2soKX1mdW5jdGlvbiByZWN2VGFza01lc3NhZ2VJbldvcmtlcih3b3JrZXJfaWQpe3JldHVybiB0YWtlT2JqZWN0KHdhc20ucmVjdlRhc2tNZXNzYWdlSW5Xb3JrZXIod29ya2VyX2lkKSl9ZnVuY3Rpb24gcmVnaXN0ZXJXb3JrZXJTY2hlZHVsZXIoY3JlYXRvcix0ZXJtaW5hdG9yKXt3YXNtLnJlZ2lzdGVyV29ya2VyU2NoZWR1bGVyKGFkZEhlYXBPYmplY3QoY3JlYXRvciksYWRkSGVhcE9iamVjdCh0ZXJtaW5hdG9yKSl9ZnVuY3Rpb24gc2VuZFRhc2tNZXNzYWdlKG1lc3NhZ2Upe3JldHVybiB0YWtlT2JqZWN0KHdhc20uc2VuZFRhc2tNZXNzYWdlKGFkZEhlYXBPYmplY3QobWVzc2FnZSkpKX1mdW5jdGlvbiB3YXNtX3RocmVhZF9lbnRyeV9wb2ludChwdHIpe3dhc20ud2FzbV90aHJlYWRfZW50cnlfcG9pbnQocHRyKX1mdW5jdGlvbiB3b3JrZXJDcmVhdGVkKHdvcmtlcl9pZCl7d2FzbS53b3JrZXJDcmVhdGVkKHdvcmtlcl9pZCl9ZnVuY3Rpb24gX193YmdfZ2V0X2ltcG9ydHMobWVtb3J5KXtjb25zdCBpbXBvcnQwPXtfX3Byb3RvX186bnVsbCxfX3diZ19FcnJvcl84YzRlNDNmZTc0NTU5ZDczOmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QoRXJyb3IoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsYXJnMSkpKX0sX193YmdfX193YmluZGdlbl9kZWJ1Z19zdHJpbmdfMGJjODQ4MmM2ZTM1MDhhZTpmdW5jdGlvbihhcmcwLGFyZzEpe2NvbnN0IHB0cjE9cGFzc1N0cmluZ1RvV2FzbTAoZGVidWdTdHJpbmcoZ2V0T2JqZWN0KGFyZzEpKSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxfX3diZ19fX3diaW5kZ2VuX2lzX2Z1bmN0aW9uXzAwOTVhNzNiOGIxNTZmNzY6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGdldE9iamVjdChhcmcwKX0sX193YmdfX193YmluZGdlbl9pc19udWxsX2FjMzRmNTAwMzk5MTc1OWE6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIG51bGw9PT1nZXRPYmplY3QoYXJnMCl9LF9fd2JnX19fd2JpbmRnZW5faXNfb2JqZWN0XzVhZThlNTg4MGYyYzFmYmQ6ZnVuY3Rpb24oYXJnMCl7Y29uc3QgdmFsPWdldE9iamVjdChhcmcwKTtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHZhbCYmbnVsbCE9PXZhbH0sX193YmdfX193YmluZGdlbl9pc191bmRlZmluZWRfOWU0ZDkyNTM0YzQyZDc3ODpmdW5jdGlvbihhcmcwKXtyZXR1cm4gdm9pZCAwPT09Z2V0T2JqZWN0KGFyZzApfSxfX3diZ19fX3diaW5kZ2VuX21lbW9yeV9iZDFmYmNmMjFmYmVmM2M4OmZ1bmN0aW9uKCl7cmV0dXJuIGFkZEhlYXBPYmplY3Qod2FzbS5tZW1vcnkpfSxfX3diZ19fX3diaW5kZ2VuX21vZHVsZV9mNmI4MDUyZDc5YzFjYzE2OmZ1bmN0aW9uKCl7cmV0dXJuIGFkZEhlYXBPYmplY3Qod2FzbU1vZHVsZSl9LF9fd2JnX19fd2JpbmRnZW5fbnVtYmVyX2dldF84ZmY0MjU1NTE2Y2NhZDNlOmZ1bmN0aW9uKGFyZzAsYXJnMSl7Y29uc3Qgb2JqPWdldE9iamVjdChhcmcxKSxyZXQ9Im51bWJlciI9PXR5cGVvZiBvYmo/b2JqOnZvaWQgMDtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRGbG9hdDY0KGFyZzArOCxpc0xpa2VOb25lKHJldCk/MDpyZXQsITApLGdldERhdGFWaWV3TWVtb3J5MCgpLnNldEludDMyKGFyZzArMCwhaXNMaWtlTm9uZShyZXQpLCEwKX0sX193YmdfX193YmluZGdlbl9yZXRocm93XzA1NTI1YzU2N2YxNTQ0NzI6ZnVuY3Rpb24oYXJnMCl7dGhyb3cgdGFrZU9iamVjdChhcmcwKX0sX193YmdfX193YmluZGdlbl9zdHJpbmdfZ2V0XzcyZmI2OTYyMDJjNTY3Mjk6ZnVuY3Rpb24oYXJnMCxhcmcxKXtjb25zdCBvYmo9Z2V0T2JqZWN0KGFyZzEpLHJldD0ic3RyaW5nIj09dHlwZW9mIG9iaj9vYmo6dm9pZCAwO3ZhciBwdHIxPWlzTGlrZU5vbmUocmV0KT8wOnBhc3NTdHJpbmdUb1dhc20wKHJldCx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxfX3diZ19fX3diaW5kZ2VuX3Rocm93X2JlMjg5ZDUwMzRlZDI3MWI6ZnVuY3Rpb24oYXJnMCxhcmcxKXt0aHJvdyBuZXcgRXJyb3IoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsYXJnMSkpfSxfX3diZ19fd2JnX2NiX3VucmVmX2Q5Yjg3ZmY3OTgyZTNiMjE6ZnVuY3Rpb24oYXJnMCl7Z2V0T2JqZWN0KGFyZzApLl93YmdfY2JfdW5yZWYoKX0sX193YmdfYWJvcnRfMmYwNTg0ZTAzZThlMzk1MDpmdW5jdGlvbihhcmcwKXtnZXRPYmplY3QoYXJnMCkuYWJvcnQoKX0sX193YmdfYWJvcnRfZDU0OWI5MmQzYzY2NWRlMTpmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS5hYm9ydChnZXRPYmplY3QoYXJnMSkpfSxfX3diZ19hcHBlbmRfYTk5MmNjYzM3YWE2MmRjNDpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEsYXJnMixhcmczLGFyZzQpe2dldE9iamVjdChhcmcwKS5hcHBlbmQoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzEsYXJnMiksZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzMsYXJnNCkpfSxhcmd1bWVudHMpfSxfX3diZ19hcnJheUJ1ZmZlcl8wNWNlMWFmMjNlOTA2NGU4OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5hcnJheUJ1ZmZlcigpKX0sX193YmdfYXJyYXlCdWZmZXJfYmI1NDA3NjE2NjAwNmMzOTpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuYXJyYXlCdWZmZXIoKSl9LGFyZ3VtZW50cyl9LF9fd2JnX2FzeW5jXzc5ZjJhNjFmOWQwYjMxY2Y6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGdldE9iamVjdChhcmcwKS5hc3luY30sX193YmdfYnVmZmVyXzdiNWY1M2U0NjU1N2Q4ZjE6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLmJ1ZmZlcil9LF9fd2JnX2NhbGxfMzg5ZWZlMjg0MzVhOTM4ODpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5jYWxsKGdldE9iamVjdChhcmcxKSkpfSxhcmd1bWVudHMpfSxfX3diZ19jYWxsXzQ3MDhlMGMxM2JkYzhlOTU6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIpe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5jYWxsKGdldE9iamVjdChhcmcxKSxnZXRPYmplY3QoYXJnMikpKX0sYXJndW1lbnRzKX0sX193YmdfY2hhbmdlZEhhbmRsZV8xMjM2OTZlYWVhZmYzMmQ3OmZ1bmN0aW9uKGFyZzApe2NvbnN0IHJldD1nZXRPYmplY3QoYXJnMCkuY2hhbmdlZEhhbmRsZTtyZXR1cm4gaXNMaWtlTm9uZShyZXQpPzA6YWRkSGVhcE9iamVjdChyZXQpfSxfX3diZ19jbGVhclRpbWVvdXRfN2E0MmI0OTc4NGFlYTY0MTpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChjbGVhclRpbWVvdXQodGFrZU9iamVjdChhcmcwKSkpfSxfX3diZ19jbG9zZV80YmEzMTIyNTNjNDI0MzQyOmZ1bmN0aW9uKGFyZzApe2dldE9iamVjdChhcmcwKS5jbG9zZSgpfSxfX3diZ19jbG9zZV84M2ZiODA5YWNhM2RlN2Y5OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5jbG9zZSgpKX0sX193YmdfY3JlYXRlT2JqZWN0VVJMXzkxODE4NWRiNmExMGEwYzg6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxKXtjb25zdCBwdHIxPXBhc3NTdHJpbmdUb1dhc20wKFVSTC5jcmVhdGVPYmplY3RVUkwoZ2V0T2JqZWN0KGFyZzEpKSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxhcmd1bWVudHMpfSxfX3diZ19jcmVhdGVXcml0YWJsZV84MGJjNWRlMzc0NDQ4YjQyOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5jcmVhdGVXcml0YWJsZSgpKX0sX193YmdfZGF0YV81MzMwZGE1MDMxMmQwYmMxOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5kYXRhKX0sX193YmdfZGVidWdfNDZhOTM5OTVmYzZmODgyMDpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMixhcmczKXtjb25zb2xlLmRlYnVnKGdldE9iamVjdChhcmcwKSxnZXRPYmplY3QoYXJnMSksZ2V0T2JqZWN0KGFyZzIpLGdldE9iamVjdChhcmczKSl9LF9fd2JnX2RlYnVnX2E0MDk5ZmExMmRiNmNkNjE6ZnVuY3Rpb24oYXJnMCl7Y29uc29sZS5kZWJ1ZyhnZXRPYmplY3QoYXJnMCkpfSxfX3diZ19kaXJlbnRyeV9uZXc6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoRGlyRW50cnkuX193cmFwKGFyZzApKX0sX193YmdfZG9uZV81N2IzOWVjZDlhZGRmZTgxOmZ1bmN0aW9uKGFyZzApe3JldHVybiBnZXRPYmplY3QoYXJnMCkuZG9uZX0sX193YmdfZW50cmllc18wNGE0Yjk4MjM1MWE3MTdmOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5lbnRyaWVzKCkpfSxfX3diZ19lcnJvcl83NTM0YjhlOWEzNmYxYWI0OmZ1bmN0aW9uKGFyZzAsYXJnMSl7bGV0IGRlZmVycmVkMF8wLGRlZmVycmVkMF8xO3RyeXtkZWZlcnJlZDBfMD1hcmcwLGRlZmVycmVkMF8xPWFyZzEsY29uc29sZS5lcnJvcihnZXRTdHJpbmdGcm9tV2FzbTAoYXJnMCxhcmcxKSl9ZmluYWxseXt3YXNtLl9fd2JpbmRnZW5fZXhwb3J0NChkZWZlcnJlZDBfMCxkZWZlcnJlZDBfMSwxKX19LF9fd2JnX2Vycm9yXzc5NGQwZmZjOWQwMGQ1YzM6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIsYXJnMyl7Y29uc29sZS5lcnJvcihnZXRPYmplY3QoYXJnMCksZ2V0T2JqZWN0KGFyZzEpLGdldE9iamVjdChhcmcyKSxnZXRPYmplY3QoYXJnMykpfSxfX3diZ19lcnJvcl85YTdmZTNmOTMyMDM0Y2RlOmZ1bmN0aW9uKGFyZzApe2NvbnNvbGUuZXJyb3IoZ2V0T2JqZWN0KGFyZzApKX0sX193YmdfZXZhbF8zZjBiOWYwY2JhZjQ1YTM0OmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzAsYXJnMSl7Y29uc3QgcmV0PWV2YWwoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsYXJnMSkpO3JldHVybiBhZGRIZWFwT2JqZWN0KHJldCl9LGFyZ3VtZW50cyl9LF9fd2JnX2ZldGNoXzc0YTNlODRlYmQyYzlhMGU6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZmV0Y2goZ2V0T2JqZWN0KGFyZzApKSl9LF9fd2JnX2ZldGNoX2FmYjZhNGI2Y2FjZjg3NmQ6ZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuZmV0Y2goZ2V0T2JqZWN0KGFyZzEpKSl9LF9fd2JnX2ZsdXNoXzIyYjc4NTA2MDU5MmNhNWY6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCl7Z2V0T2JqZWN0KGFyZzApLmZsdXNoKCl9LGFyZ3VtZW50cyl9LF9fd2JnX2Zyb21fYmRkZDY0ZTdkNWZmNjk0MTpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChBcnJheS5mcm9tKGdldE9iamVjdChhcmcwKSkpfSxfX3diZ19nZXREaXJlY3RvcnlIYW5kbGVfODdjZThjYTUzY2Y0ZDhkYzpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMixhcmczKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuZ2V0RGlyZWN0b3J5SGFuZGxlKGdldFN0cmluZ0Zyb21XYXNtMChhcmcxLGFyZzIpLGdldE9iamVjdChhcmczKSkpfSxfX3diZ19nZXREaXJlY3RvcnlfYjY2YWUzZTc5ZjkwMjk4MjpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuZ2V0RGlyZWN0b3J5KCkpfSxfX3diZ19nZXRGaWxlSGFuZGxlX2ZmNGFiOTE3YjQ1YWZmYjM6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIsYXJnMyl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLmdldEZpbGVIYW5kbGUoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzEsYXJnMiksZ2V0T2JqZWN0KGFyZzMpKSl9LF9fd2JnX2dldEZpbGVfMTE1MzU0ZmM5NTBlZGM4ODpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuZ2V0RmlsZSgpKX0sX193YmdfZ2V0UmFuZG9tVmFsdWVzXzgwNTc4YjJmZjJhMDkzYmE6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCl7Z2xvYmFsVGhpcy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGdldE9iamVjdChhcmcwKSl9LGFyZ3VtZW50cyl9LF9fd2JnX2dldF85Yjk0ZDczZTYyMjFmNzVjOmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApW2FyZzE+Pj4wXSl9LF9fd2JnX2dldF9iM2VkM2FkNGJlMmJjOGFjOmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QoUmVmbGVjdC5nZXQoZ2V0T2JqZWN0KGFyZzApLGdldE9iamVjdChhcmcxKSkpfSxhcmd1bWVudHMpfSxfX3diZ19oYXNfZDRlNTMyMzg5NjZjMTJiNjpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBSZWZsZWN0LmhhcyhnZXRPYmplY3QoYXJnMCksZ2V0T2JqZWN0KGFyZzEpKX0sYXJndW1lbnRzKX0sX193YmdfaGVhZGVyc181OWEyOTM4ZGI5ZjgwOTg1OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5oZWFkZXJzKX0sX193YmdfaW5mb18xNDhkMDQzODQwNTgyMDEyOmZ1bmN0aW9uKGFyZzApe2NvbnNvbGUuaW5mbyhnZXRPYmplY3QoYXJnMCkpfSxfX3diZ19pbmZvXzllNjAyY2YxMGM1YzY5MGI6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIsYXJnMyl7Y29uc29sZS5pbmZvKGdldE9iamVjdChhcmcwKSxnZXRPYmplY3QoYXJnMSksZ2V0T2JqZWN0KGFyZzIpLGdldE9iamVjdChhcmczKSl9LF9fd2JnX2luc3RhbmNlb2ZfRGVkaWNhdGVkV29ya2VyR2xvYmFsU2NvcGVfMTUwNmIzZDAxNzc5OWQ0ODpmdW5jdGlvbihhcmcwKXtsZXQgcmVzdWx0O3RyeXtyZXN1bHQ9Z2V0T2JqZWN0KGFyZzApaW5zdGFuY2VvZiBEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZX1jYXRjaChfKXtyZXN1bHQ9ITF9cmV0dXJuIHJlc3VsdH0sX193YmdfaW5zdGFuY2VvZl9Eb21FeGNlcHRpb25fOTljMTc3MTkzZTU1NGI3NTpmdW5jdGlvbihhcmcwKXtsZXQgcmVzdWx0O3RyeXtyZXN1bHQ9Z2V0T2JqZWN0KGFyZzApaW5zdGFuY2VvZiBET01FeGNlcHRpb259Y2F0Y2goXyl7cmVzdWx0PSExfXJldHVybiByZXN1bHR9LF9fd2JnX2luc3RhbmNlb2ZfRmlsZVN5c3RlbURpcmVjdG9yeUhhbmRsZV81NmExNjcwMzlkNjE0NTQ4OmZ1bmN0aW9uKGFyZzApe2xldCByZXN1bHQ7dHJ5e3Jlc3VsdD1nZXRPYmplY3QoYXJnMClpbnN0YW5jZW9mIEZpbGVTeXN0ZW1EaXJlY3RvcnlIYW5kbGV9Y2F0Y2goXyl7cmVzdWx0PSExfXJldHVybiByZXN1bHR9LF9fd2JnX2luc3RhbmNlb2ZfUmVzcG9uc2VfZWUxZDU0ZDc5YWU0MTk3NzpmdW5jdGlvbihhcmcwKXtsZXQgcmVzdWx0O3RyeXtyZXN1bHQ9Z2V0T2JqZWN0KGFyZzApaW5zdGFuY2VvZiBSZXNwb25zZX1jYXRjaChfKXtyZXN1bHQ9ITF9cmV0dXJuIHJlc3VsdH0sX193YmdfaW5zdGFuY2VvZl9VaW50OEFycmF5XzliOTA3NTkzNWM3NDcwN2M6ZnVuY3Rpb24oYXJnMCl7bGV0IHJlc3VsdDt0cnl7cmVzdWx0PWdldE9iamVjdChhcmcwKWluc3RhbmNlb2YgVWludDhBcnJheX1jYXRjaChfKXtyZXN1bHQ9ITF9cmV0dXJuIHJlc3VsdH0sX193YmdfaXNBcnJheV9kMzE0YmI5OGZjZjA4MzMxOmZ1bmN0aW9uKGFyZzApe3JldHVybiBBcnJheS5pc0FycmF5KGdldE9iamVjdChhcmcwKSl9LF9fd2JnX2l0ZXJhdG9yXzZmZjY1NjBjYTE1NjhlNTU6ZnVuY3Rpb24oKXtyZXR1cm4gYWRkSGVhcE9iamVjdChTeW1ib2wuaXRlcmF0b3IpfSxfX3diZ19raW5kXzkwNzY5ZDZjMTZmYWVhZmQ6ZnVuY3Rpb24oYXJnMCl7Y29uc3QgcmV0PWdldE9iamVjdChhcmcwKS5raW5kO3JldHVybihfX3diaW5kZ2VuX2VudW1fRmlsZVN5c3RlbUhhbmRsZUtpbmQuaW5kZXhPZihyZXQpKzF8fDMpLTF9LF9fd2JnX2xlbmd0aF8zMmVkOWEyNzlhY2QwNTRjOmZ1bmN0aW9uKGFyZzApe3JldHVybiBnZXRPYmplY3QoYXJnMCkubGVuZ3RofSxfX3diZ19sZW5ndGhfMzVhN2JhY2U0MGYzNmVhYzpmdW5jdGlvbihhcmcwKXtyZXR1cm4gZ2V0T2JqZWN0KGFyZzApLmxlbmd0aH0sX193YmdfbWVzc2FnZV8wYjJiMDI5OGEyMzFiMGQ0OmZ1bmN0aW9uKGFyZzAsYXJnMSl7Y29uc3QgcHRyMT1wYXNzU3RyaW5nVG9XYXNtMChnZXRPYmplY3QoYXJnMSkubWVzc2FnZSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxfX3diZ19tZXRhZGF0YV9uZXc6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoTWV0YWRhdGEuX193cmFwKGFyZzApKX0sX193YmdfbmFtZV8yNDI3NTNlNTExMGNkNzU2OmZ1bmN0aW9uKGFyZzAsYXJnMSl7Y29uc3QgcHRyMT1wYXNzU3RyaW5nVG9XYXNtMChnZXRPYmplY3QoYXJnMSkubmFtZSx3YXNtLl9fd2JpbmRnZW5fZXhwb3J0LHdhc20uX193YmluZGdlbl9leHBvcnQyKSxsZW4xPVdBU01fVkVDVE9SX0xFTjtnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzQsbGVuMSwhMCksZ2V0RGF0YVZpZXdNZW1vcnkwKCkuc2V0SW50MzIoYXJnMCswLHB0cjEsITApfSxfX3diZ19uYXZpZ2F0b3JfNDQ3ODkzMWYzMmViY2E1NzpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkubmF2aWdhdG9yKX0sX193YmdfbmV3XzM2MTMwOGIyMzU2Y2VjZDA6ZnVuY3Rpb24oKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgT2JqZWN0KX0sX193YmdfbmV3XzNlYjM2YWUyNDFmZTZmNDQ6ZnVuY3Rpb24oKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgQXJyYXkpfSxfX3diZ19uZXdfNGY4ZjNjMTIzZTQ3NDM1ODpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBXb3JrZXIoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsYXJnMSkpKX0sYXJndW1lbnRzKX0sX193YmdfbmV3XzY0Mjg0YmQ0ODdmOWQyMzk6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgSGVhZGVycyl9LGFyZ3VtZW50cyl9LF9fd2JnX25ld183MmM2MjdiYTgwZGUxYzIxOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBJbnQzMkFycmF5KGdldE9iamVjdChhcmcwKSkpfSxfX3diZ19uZXdfOGE2ZjIzOGE2ZWNlODZlYTpmdW5jdGlvbigpe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBFcnJvcil9LF9fd2JnX25ld184ZWM1ODAxYjM5ZDZmODYyOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBGaWxlU3lzdGVtT2JzZXJ2ZXIoZ2V0T2JqZWN0KGFyZzApKSl9LF9fd2JnX25ld19iNWQ5ZTJmYjM4OWZlZjkxOmZ1bmN0aW9uKGFyZzAsYXJnMSl7dHJ5e3ZhciBzdGF0ZTA9e2E6YXJnMCxiOmFyZzF9O2NvbnN0IHJldD1uZXcgUHJvbWlzZSgoYXJnMCxhcmcxKT0+e2NvbnN0IGE9c3RhdGUwLmE7c3RhdGUwLmE9MDt0cnl7cmV0dXJuIF9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV8zMzQ0KGEsc3RhdGUwLmIsYXJnMCxhcmcxKX1maW5hbGx5e3N0YXRlMC5hPWF9fSk7cmV0dXJuIGFkZEhlYXBPYmplY3QocmV0KX1maW5hbGx5e3N0YXRlMC5hPXN0YXRlMC5iPTB9fSxfX3diZ19uZXdfYjk0OWU3ZjU2MTUwYTVkMTpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbigpe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBBYm9ydENvbnRyb2xsZXIpfSxhcmd1bWVudHMpfSxfX3diZ19uZXdfZGQyYjY4MGM4YmY2YWUyOTpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgVWludDhBcnJheShnZXRPYmplY3QoYXJnMCkpKX0sX193YmdfbmV3X2Zyb21fc2xpY2VfYTNkMjYyOWRjMTgyNjc4NDpmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBVaW50OEFycmF5KGdldEFycmF5VThGcm9tV2FzbTAoYXJnMCxhcmcxKSkpfSxfX3diZ19uZXdfbm9fYXJnc18xYzdjODQyZjA4ZDAwZWJiOmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QobmV3IEZ1bmN0aW9uKGdldFN0cmluZ0Zyb21XYXNtMChhcmcwLGFyZzEpKSl9LF9fd2JnX25ld193aXRoX2xlbmd0aF9hMmMzOWNiZTg4ZmQ4ZmYxOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBVaW50OEFycmF5KGFyZzA+Pj4wKSl9LF9fd2JnX25ld193aXRoX29wdGlvbnNfMTQ1YWZiYTkyMmFkMzcwMzpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEsYXJnMil7cmV0dXJuIGFkZEhlYXBPYmplY3QobmV3IFdvcmtlcihnZXRTdHJpbmdGcm9tV2FzbTAoYXJnMCxhcmcxKSxnZXRPYmplY3QoYXJnMikpKX0sYXJndW1lbnRzKX0sX193YmdfbmV3X3dpdGhfc3RyX2FuZF9pbml0X2E2MWNiYzZiZGVmMjE2MTQ6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIpe3JldHVybiBhZGRIZWFwT2JqZWN0KG5ldyBSZXF1ZXN0KGdldFN0cmluZ0Zyb21XYXNtMChhcmcwLGFyZzEpLGdldE9iamVjdChhcmcyKSkpfSxhcmd1bWVudHMpfSxfX3diZ19uZXdfd2l0aF9zdHJfc2VxdWVuY2VfY2VhMmMwNTcxZDZkYzZhYjpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChuZXcgQmxvYihnZXRPYmplY3QoYXJnMCkpKX0sYXJndW1lbnRzKX0sX193YmdfbmV4dF8wYTVlMGY4YWY5ODE0NmFhOmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5uZXh0KCkpfSxhcmd1bWVudHMpfSxfX3diZ19uZXh0XzM0ODJmNTRjNDllOGFmMTk6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLm5leHQoKSl9LGFyZ3VtZW50cyl9LF9fd2JnX25leHRfNDE4ZjgwZDhmNTMwMzIzMzpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkubmV4dCl9LF9fd2JnX25vd18wZGM0OTIwYTQ3Y2Y3MjgwOmZ1bmN0aW9uKGFyZzApe3JldHVybiBnZXRPYmplY3QoYXJnMCkubm93KCl9LF9fd2JnX25vd19hM2FmOWEyZjRiYmFhNGQxOmZ1bmN0aW9uKCl7cmV0dXJuIERhdGUubm93KCl9LF9fd2JnX29ic2VydmVfMzIyMzViNWU2MTk1ZDRhYjpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMil7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLm9ic2VydmUoZ2V0T2JqZWN0KGFyZzEpLGdldE9iamVjdChhcmcyKSkpfSxfX3diZ19vZl9kZGMwOTQyYjBkY2UxNmExOmZ1bmN0aW9uKGFyZzAsYXJnMSxhcmcyKXtyZXR1cm4gYWRkSGVhcE9iamVjdChBcnJheS5vZihnZXRPYmplY3QoYXJnMCksZ2V0T2JqZWN0KGFyZzEpLGdldE9iamVjdChhcmcyKSkpfSxfX3diZ19wYXJzZV83MDg0NjFhMWZlZGRmYjM4OmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QoSlNPTi5wYXJzZShnZXRTdHJpbmdGcm9tV2FzbTAoYXJnMCxhcmcxKSkpfSxhcmd1bWVudHMpfSxfX3diZ19wZXJmb3JtYW5jZV82YWRjM2I4OTllNDQ4YTIzOmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5wZXJmb3JtYW5jZSl9LF9fd2JnX3Bvc3RNZXNzYWdlXzIwNDFmNGU5MGFmNjEzMTg6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkucG9zdE1lc3NhZ2UoZ2V0T2JqZWN0KGFyZzEpKX0sYXJndW1lbnRzKX0sX193YmdfcG9zdE1lc3NhZ2VfNzcxZWYzMjkzYTI4YmJhYzpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS5wb3N0TWVzc2FnZShnZXRPYmplY3QoYXJnMSkpfSxhcmd1bWVudHMpfSxfX3diZ19wcm90b3R5cGVzZXRjYWxsX2JkY2RjYzU4NDJlNGQ3N2Q6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIpe1VpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKGdldEFycmF5VThGcm9tV2FzbTAoYXJnMCxhcmcxKSxnZXRPYmplY3QoYXJnMikpfSxfX3diZ19wdXNoXzhmZmRjYjIwNjMzNDBiYTU6ZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gZ2V0T2JqZWN0KGFyZzApLnB1c2goZ2V0T2JqZWN0KGFyZzEpKX0sX193YmdfcXVldWVNaWNyb3Rhc2tfMGFhMGE5MjdmNzhmNWQ5ODpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkucXVldWVNaWNyb3Rhc2spfSxfX3diZ19xdWV1ZU1pY3JvdGFza181YmI1MzY5ODJmNzhhNTZmOmZ1bmN0aW9uKGFyZzApe3F1ZXVlTWljcm90YXNrKGdldE9iamVjdChhcmcwKSl9LF9fd2JnX3JhbmRvbV85MTIyODRkYmY2MzZmMjY5OmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucmFuZG9tKCl9LF9fd2JnX3JlbGF0aXZlUGF0aENvbXBvbmVudHNfYmM0ODI0MDNjYjZkN2VhOTpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkucmVsYXRpdmVQYXRoQ29tcG9uZW50cyl9LF9fd2JnX3JlbW92ZUVudHJ5X2M0ZWZmZmRkMzE4YjUxYTE6ZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIsYXJnMyl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnJlbW92ZUVudHJ5KGdldFN0cmluZ0Zyb21XYXNtMChhcmcxLGFyZzIpLGdldE9iamVjdChhcmczKSkpfSxfX3diZ19yZXNvbHZlXzAwMmM0YjdkOWQ4ZjZiNjQ6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoUHJvbWlzZS5yZXNvbHZlKGdldE9iamVjdChhcmcwKSkpfSxfX3diZ19yb290dGFza19uZXc6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoUm9vdFRhc2suX193cmFwKGFyZzApKX0sX193Ymdfc2V0VGltZW91dF82MzAwODYxMzY0NGIwN2FmOmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZUVycm9yKGZ1bmN0aW9uKGFyZzAsYXJnMSxhcmcyKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuc2V0VGltZW91dChnZXRPYmplY3QoYXJnMSksYXJnMikpfSxhcmd1bWVudHMpfSxfX3diZ19zZXRUaW1lb3V0XzdiYjM0Mjk2NjJhYjFlNzA6ZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gYWRkSGVhcE9iamVjdChzZXRUaW1lb3V0KGdldE9iamVjdChhcmcwKSxhcmcxKSl9LF9fd2JnX3NldF9hdF9lNDUzY2YzZjRiZTllMmQ5OmZ1bmN0aW9uKGFyZzAsYXJnMSl7Z2V0T2JqZWN0KGFyZzApLmF0PWFyZzF9LF9fd2JnX3NldF9ib2R5XzlhN2UwMGFmZTNjZmUyNDQ6ZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkuYm9keT1nZXRPYmplY3QoYXJnMSl9LF9fd2JnX3NldF9jYWNoZV8zMTVhM2VkNzczYTQxNTQzOmZ1bmN0aW9uKGFyZzAsYXJnMSl7Z2V0T2JqZWN0KGFyZzApLmNhY2hlPV9fd2JpbmRnZW5fZW51bV9SZXF1ZXN0Q2FjaGVbYXJnMV19LF9fd2JnX3NldF9jcmVhdGVfMWY5MDJjNTkzNmFkZGU3ZDpmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS5jcmVhdGU9MCE9PWFyZzF9LF9fd2JnX3NldF9jcmVhdGVfYzk1ZGRjYTAxOGZhYzljZTpmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS5jcmVhdGU9MCE9PWFyZzF9LF9fd2JnX3NldF9jcmVkZW50aWFsc19jNGE1OGQyZTA1ZWYyNGZiOmZ1bmN0aW9uKGFyZzAsYXJnMSl7Z2V0T2JqZWN0KGFyZzApLmNyZWRlbnRpYWxzPV9fd2JpbmRnZW5fZW51bV9SZXF1ZXN0Q3JlZGVudGlhbHNbYXJnMV19LF9fd2JnX3NldF9mNDNlNTc3YWVhOTQ0NjViOmZ1bmN0aW9uKGFyZzAsYXJnMSxhcmcyKXtnZXRPYmplY3QoYXJnMClbYXJnMT4+PjBdPXRha2VPYmplY3QoYXJnMil9LF9fd2JnX3NldF9oZWFkZXJzX2NmYzVmNGIyYzFmMjA1NDk6ZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkuaGVhZGVycz1nZXRPYmplY3QoYXJnMSl9LF9fd2JnX3NldF9tZXRob2RfYzNlMjAzNzVmNWFlN2ZhYzpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMil7Z2V0T2JqZWN0KGFyZzApLm1ldGhvZD1nZXRTdHJpbmdGcm9tV2FzbTAoYXJnMSxhcmcyKX0sX193Ymdfc2V0X21vZGVfYjEzNjQyYzMxMjY0ODIwMjpmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS5tb2RlPV9fd2JpbmRnZW5fZW51bV9SZXF1ZXN0TW9kZVthcmcxXX0sX193Ymdfc2V0X25hbWVfNDliOWVjYmE3ZjU4ZjJlNTpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMil7Z2V0T2JqZWN0KGFyZzApLm5hbWU9Z2V0U3RyaW5nRnJvbVdhc20wKGFyZzEsYXJnMil9LF9fd2JnX3NldF9vbm1lc3NhZ2VfNmVkNDEwNTBlNGE1Y2VlMjpmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS5vbm1lc3NhZ2U9Z2V0T2JqZWN0KGFyZzEpfSxfX3diZ19zZXRfcmVjdXJzaXZlXzY1ZWQwN2RmODkyYjQ4ODU6ZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkucmVjdXJzaXZlPTAhPT1hcmcxfSxfX3diZ19zZXRfcmVjdXJzaXZlX2Y1ZDM0MTYwOTgzMjgxMTA6ZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkucmVjdXJzaXZlPTAhPT1hcmcxfSxfX3diZ19zZXRfc2lnbmFsX2YyZDNmODU5OTI0ODg5NmQ6ZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkuc2lnbmFsPWdldE9iamVjdChhcmcxKX0sX193Ymdfc2V0X3R5cGVfZTEyN2YyNmI3OGQ3OGJmYzpmdW5jdGlvbihhcmcwLGFyZzEpe2dldE9iamVjdChhcmcwKS50eXBlPV9fd2JpbmRnZW5fZW51bV9Xb3JrZXJUeXBlW2FyZzFdfSxfX3diZ19zaWduYWxfZDEyODVlY2FiNGViYzVhZDpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkuc2lnbmFsKX0sX193Ymdfc2l6ZV9lMDVkMzFjYzYwNDk4MTVmOmZ1bmN0aW9uKGFyZzApe3JldHVybiBnZXRPYmplY3QoYXJnMCkuc2l6ZX0sX193Ymdfc2xpY2VfNTY2YTE1ZjMyMTRmYTUyZTpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEsYXJnMixhcmczLGFyZzQpe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS5zbGljZShhcmcxLGFyZzIsZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzMsYXJnNCkpKX0sYXJndW1lbnRzKX0sX193Ymdfc3RhY2tfMGVkNzVkNjg1NzViMGYzYzpmdW5jdGlvbihhcmcwLGFyZzEpe2NvbnN0IHB0cjE9cGFzc1N0cmluZ1RvV2FzbTAoZ2V0T2JqZWN0KGFyZzEpLnN0YWNrLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjE9V0FTTV9WRUNUT1JfTEVOO2dldERhdGFWaWV3TWVtb3J5MCgpLnNldEludDMyKGFyZzArNCxsZW4xLCEwKSxnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzAscHRyMSwhMCl9LF9fd2JnX3N0YXRpY19hY2Nlc3Nvcl9HTE9CQUxfMTI4MzcxNjdhZDkzNTExNjpmdW5jdGlvbigpe2NvbnN0IHJldD12b2lkIDA9PT1fX3dlYnBhY2tfcmVxdWlyZV9fLmc/bnVsbDpfX3dlYnBhY2tfcmVxdWlyZV9fLmc7cmV0dXJuIGlzTGlrZU5vbmUocmV0KT8wOmFkZEhlYXBPYmplY3QocmV0KX0sX193Ymdfc3RhdGljX2FjY2Vzc29yX0dMT0JBTF9USElTX2U2MjhlODlhYjNiMWM5NWY6ZnVuY3Rpb24oKXtjb25zdCByZXQ9InVuZGVmaW5lZCI9PXR5cGVvZiBnbG9iYWxUaGlzP251bGw6Z2xvYmFsVGhpcztyZXR1cm4gaXNMaWtlTm9uZShyZXQpPzA6YWRkSGVhcE9iamVjdChyZXQpfSxfX3diZ19zdGF0aWNfYWNjZXNzb3JfU0VMRl9hNjIxZDNkZmJiNjBkMGNlOmZ1bmN0aW9uKCl7Y29uc3QgcmV0PSJ1bmRlZmluZWQiPT10eXBlb2Ygc2VsZj9udWxsOnNlbGY7cmV0dXJuIGlzTGlrZU5vbmUocmV0KT8wOmFkZEhlYXBPYmplY3QocmV0KX0sX193Ymdfc3RhdGljX2FjY2Vzc29yX1dJTkRPV19mODcyN2YwY2Y4ODhlMGJkOmZ1bmN0aW9uKCl7Y29uc3QgcmV0PSJ1bmRlZmluZWQiPT10eXBlb2Ygd2luZG93P251bGw6d2luZG93O3JldHVybiBpc0xpa2VOb25lKHJldCk/MDphZGRIZWFwT2JqZWN0KHJldCl9LF9fd2JnX3N0YXR1c184OWQ3ZTgwM2RiOTExZWU3OmZ1bmN0aW9uKGFyZzApe3JldHVybiBnZXRPYmplY3QoYXJnMCkuc3RhdHVzfSxfX3diZ19zdG9yYWdlX2MwMDJiNTNiYzQ4ODMyOTk6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnN0b3JhZ2UpfSxfX3diZ19zdHJpbmdpZnlfOGQxY2M2ZmYzODNlOGJhZTpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChKU09OLnN0cmluZ2lmeShnZXRPYmplY3QoYXJnMCkpKX0sYXJndW1lbnRzKX0sX193Ymdfc3ViYXJyYXlfYTk2ZTFmZWYxN2VkMjNjYjpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMil7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnN1YmFycmF5KGFyZzE+Pj4wLGFyZzI+Pj4wKSl9LF9fd2JnX3RoZW5fMGQ5ZmUyYzdiMTg1N2QzMjpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMil7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnRoZW4oZ2V0T2JqZWN0KGFyZzEpLGdldE9iamVjdChhcmcyKSkpfSxfX3diZ190aGVuX2I5ZTdiM2I1ZjFhOWUxYjU6ZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkudGhlbihnZXRPYmplY3QoYXJnMSkpKX0sX193YmdfdG9TdHJpbmdfOTY0ZmY3ZmU2ZWNhODM2MjpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkudG9TdHJpbmcoKSl9LF9fd2JnX3RydW5jYXRlX2RjNjYxZmRjYjAwNjJmYTc6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxKXtnZXRPYmplY3QoYXJnMCkudHJ1bmNhdGUoYXJnMT4+PjApfSxhcmd1bWVudHMpfSxfX3diZ190eXBlXzAzZGZlNDYyMTczNWU1Mjg6ZnVuY3Rpb24oYXJnMCl7Y29uc3QgcmV0PWdldE9iamVjdChhcmcwKS50eXBlO3JldHVybihfX3diaW5kZ2VuX2VudW1fRmlsZVN5c3RlbUNoYW5nZVJlY29yZFR5cGUuaW5kZXhPZihyZXQpKzF8fDcpLTF9LF9fd2JnX3VybF9jNDg0YzI2YjFmYmY1MTI2OmZ1bmN0aW9uKGFyZzAsYXJnMSl7Y29uc3QgcHRyMT1wYXNzU3RyaW5nVG9XYXNtMChnZXRPYmplY3QoYXJnMSkudXJsLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjE9V0FTTV9WRUNUT1JfTEVOO2dldERhdGFWaWV3TWVtb3J5MCgpLnNldEludDMyKGFyZzArNCxsZW4xLCEwKSxnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzAscHRyMSwhMCl9LF9fd2JnX3ZhbHVlXzA1NDYyNTViNDE1ZTk2YzE6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0T2JqZWN0KGFyZzApLnZhbHVlKX0sX193YmdfdmFsdWVfZmU2ZWUzNGFmNWRjM2RjZTpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkudmFsdWUpfSxfX3diZ193YWl0QXN5bmNfYTU4YjIxMzRiZmYzOWMzZTpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMil7cmV0dXJuIGFkZEhlYXBPYmplY3QoQXRvbWljcy53YWl0QXN5bmMoZ2V0T2JqZWN0KGFyZzApLGFyZzE+Pj4wLGFyZzIpKX0sX193Ymdfd2FpdEFzeW5jX2MwYTM5YTdkMzMxOGQ5MWU6ZnVuY3Rpb24oKXtyZXR1cm4gYWRkSGVhcE9iamVjdChBdG9taWNzLndhaXRBc3luYyl9LF9fd2JnX3dhcm5fYTQwYjk3MTQ2N2IyMTljNzpmdW5jdGlvbihhcmcwLGFyZzEsYXJnMixhcmczKXtjb25zb2xlLndhcm4oZ2V0T2JqZWN0KGFyZzApLGdldE9iamVjdChhcmcxKSxnZXRPYmplY3QoYXJnMiksZ2V0T2JqZWN0KGFyZzMpKX0sX193Ymdfd2Fybl9mN2FlMWIyZTY2Y2NiOTMwOmZ1bmN0aW9uKGFyZzApe2NvbnNvbGUud2FybihnZXRPYmplY3QoYXJnMCkpfSxfX3diZ193YXNtdGFza21lc3NhZ2VfbmV3OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KFdhc21UYXNrTWVzc2FnZS5fX3dyYXAoYXJnMCkpfSxfX3diZ193ZWJ3b3JrZXJjcmVhdGlvbl9uZXc6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoV2ViV29ya2VyQ3JlYXRpb24uX193cmFwKGFyZzApKX0sX193Ymdfd2Vid29ya2VydGVybWluYXRpb25fbmV3OmZ1bmN0aW9uKGFyZzApe3JldHVybiBhZGRIZWFwT2JqZWN0KFdlYldvcmtlclRlcm1pbmF0aW9uLl9fd3JhcChhcmcwKSl9LF9fd2JnX3dyaXRlXzJkNTkzMzdjYzQ5NjkxOWQ6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlRXJyb3IoZnVuY3Rpb24oYXJnMCxhcmcxLGFyZzIsYXJnMyl7cmV0dXJuIGdldE9iamVjdChhcmcwKS53cml0ZShnZXRBcnJheVU4RnJvbVdhc20wKGFyZzEsYXJnMiksZ2V0T2JqZWN0KGFyZzMpKX0sYXJndW1lbnRzKX0sX193Ymdfd3JpdGVfMzdmNWE2MmEyNGRhNjYyZjpmdW5jdGlvbigpe3JldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBhZGRIZWFwT2JqZWN0KGdldE9iamVjdChhcmcwKS53cml0ZShnZXRPYmplY3QoYXJnMSkpKX0sYXJndW1lbnRzKX0sX193YmluZGdlbl9jYXN0XzAwMDAwMDAwMDAwMDAwMDE6ZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gYWRkSGVhcE9iamVjdChtYWtlTXV0Q2xvc3VyZShhcmcwLGFyZzEsd2FzbS5fX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMTk5ODUsX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzc5NjQzKSl9LF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDAyOmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QobWFrZU11dENsb3N1cmUoYXJnMCxhcmcxLHdhc20uX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzE5OTg1LF9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV83OTY0MykpfSxfX3diaW5kZ2VuX2Nhc3RfMDAwMDAwMDAwMDAwMDAwMzpmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBhZGRIZWFwT2JqZWN0KG1ha2VNdXRDbG9zdXJlKGFyZzAsYXJnMSx3YXNtLl9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV8xOTk4NSxfX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fNzk2NzkpKX0sX193YmluZGdlbl9jYXN0XzAwMDAwMDAwMDAwMDAwMDQ6ZnVuY3Rpb24oYXJnMCxhcmcxKXtyZXR1cm4gYWRkSGVhcE9iamVjdChtYWtlTXV0Q2xvc3VyZShhcmcwLGFyZzEsd2FzbS5fX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMTk5ODUsX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzE5OTcxKSl9LF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDA1OmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QobWFrZUNsb3N1cmUoYXJnMCxhcmcxLHdhc20uX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzc5MDA1LF9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV83OTAwNikpfSxfX3diaW5kZ2VuX2Nhc3RfMDAwMDAwMDAwMDAwMDAwNjpmdW5jdGlvbihhcmcwLGFyZzEpe3JldHVybiBhZGRIZWFwT2JqZWN0KG1ha2VNdXRDbG9zdXJlKGFyZzAsYXJnMSx3YXNtLl9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV83OTcxMCxfX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMTk5NzEpKX0sX193YmluZGdlbl9jYXN0XzAwMDAwMDAwMDAwMDAwMDc6ZnVuY3Rpb24oYXJnMCl7cmV0dXJuIGFkZEhlYXBPYmplY3QoYXJnMCl9LF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDA4OmZ1bmN0aW9uKGFyZzAsYXJnMSl7cmV0dXJuIGFkZEhlYXBPYmplY3QoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsYXJnMSkpfSxfX3diaW5kZ2VuX2Nhc3RfMDAwMDAwMDAwMDAwMDAwOTpmdW5jdGlvbihhcmcwLGFyZzEpe3ZhciB2MD1nZXRBcnJheUpzVmFsdWVGcm9tV2FzbTAoYXJnMCxhcmcxKS5zbGljZSgpO3dhc20uX193YmluZGdlbl9leHBvcnQ0KGFyZzAsNCphcmcxLDQpO3JldHVybiBhZGRIZWFwT2JqZWN0KHYwKX0sX193YmluZGdlbl9saW5rXzBiMWY3NmQyMzVmZDJiODY6ZnVuY3Rpb24oYXJnMCl7Y29uc3QgdmFsPSJvbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgICAgICBsZXQgW2lhLCBpbmRleCwgdmFsdWVdID0gZXYuZGF0YTtcbiAgICAgICAgICAgICAgICBpYSA9IG5ldyBJbnQzMkFycmF5KGlhLmJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IEF0b21pY3Mud2FpdChpYSwgaW5kZXgsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZShyZXN1bHQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICIscHRyMT1wYXNzU3RyaW5nVG9XYXNtMCh2b2lkIDA9PT1VUkwuY3JlYXRlT2JqZWN0VVJMPyJkYXRhOmFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIitlbmNvZGVVUklDb21wb25lbnQodmFsKTpVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFt2YWxdLHt0eXBlOiJ0ZXh0L2phdmFzY3JpcHQifSkpLHdhc20uX193YmluZGdlbl9leHBvcnQsd2FzbS5fX3diaW5kZ2VuX2V4cG9ydDIpLGxlbjE9V0FTTV9WRUNUT1JfTEVOO2dldERhdGFWaWV3TWVtb3J5MCgpLnNldEludDMyKGFyZzArNCxsZW4xLCEwKSxnZXREYXRhVmlld01lbW9yeTAoKS5zZXRJbnQzMihhcmcwKzAscHRyMSwhMCl9LF9fd2JpbmRnZW5fb2JqZWN0X2Nsb25lX3JlZjpmdW5jdGlvbihhcmcwKXtyZXR1cm4gYWRkSGVhcE9iamVjdChnZXRPYmplY3QoYXJnMCkpfSxfX3diaW5kZ2VuX29iamVjdF9kcm9wX3JlZjpmdW5jdGlvbihhcmcwKXt0YWtlT2JqZWN0KGFyZzApfSxtZW1vcnk6bWVtb3J5fHxuZXcgV2ViQXNzZW1ibHkuTWVtb3J5KHtpbml0aWFsOjEwMjUsbWF4aW11bTo2NTUzNixzaGFyZWQ6ITB9KX07cmV0dXJue19fcHJvdG9fXzpudWxsLCIuL2luZGV4X2JnLmpzIjppbXBvcnQwfX1mdW5jdGlvbiBfX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMTk5NzEoYXJnMCxhcmcxKXt3YXNtLl9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV8xOTk3MShhcmcwLGFyZzEpfWZ1bmN0aW9uIF9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV83OTY0MyhhcmcwLGFyZzEsYXJnMil7d2FzbS5fX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fNzk2NDMoYXJnMCxhcmcxLGFkZEhlYXBPYmplY3QoYXJnMikpfWZ1bmN0aW9uIF9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV83OTY3OShhcmcwLGFyZzEsYXJnMil7dHJ5e3dhc20uX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzc5Njc5KGFyZzAsYXJnMSxhZGRCb3Jyb3dlZE9iamVjdChhcmcyKSl9ZmluYWxseXtoZWFwW3N0YWNrX3BvaW50ZXIrK109dm9pZCAwfX1mdW5jdGlvbiBfX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fNzkwMDYoYXJnMCxhcmcxLGFyZzIpe3dhc20uX193YXNtX2JpbmRnZW5fZnVuY19lbGVtXzc5MDA2KGFyZzAsYXJnMSxhZGRIZWFwT2JqZWN0KGFyZzIpKX1mdW5jdGlvbiBfX3dhc21fYmluZGdlbl9mdW5jX2VsZW1fMzM0NChhcmcwLGFyZzEsYXJnMixhcmczKXt3YXNtLl9fd2FzbV9iaW5kZ2VuX2Z1bmNfZWxlbV8zMzQ0KGFyZzAsYXJnMSxhZGRIZWFwT2JqZWN0KGFyZzIpLGFkZEhlYXBPYmplY3QoYXJnMykpfVN5bWJvbC5kaXNwb3NlJiYoV2ViV29ya2VyVGVybWluYXRpb24ucHJvdG90eXBlW1N5bWJvbC5kaXNwb3NlXT1XZWJXb3JrZXJUZXJtaW5hdGlvbi5wcm90b3R5cGUuZnJlZSk7Y29uc3QgX193YmluZGdlbl9lbnVtX0RpckVudHJ5VHlwZT1bImZpbGUiLCJkaXJlY3RvcnkiXSxfX3diaW5kZ2VuX2VudW1fRmlsZVN5c3RlbUNoYW5nZVJlY29yZFR5cGU9WyJhcHBlYXJlZCIsImRpc2FwcGVhcmVkIiwiZXJyb3JlZCIsIm1vZGlmaWVkIiwibW92ZWQiLCJ1bmtub3duIl0sX193YmluZGdlbl9lbnVtX0ZpbGVTeXN0ZW1IYW5kbGVLaW5kPVsiZmlsZSIsImRpcmVjdG9yeSJdLF9fd2JpbmRnZW5fZW51bV9SZXF1ZXN0Q2FjaGU9WyJkZWZhdWx0Iiwibm8tc3RvcmUiLCJyZWxvYWQiLCJuby1jYWNoZSIsImZvcmNlLWNhY2hlIiwib25seS1pZi1jYWNoZWQiXSxfX3diaW5kZ2VuX2VudW1fUmVxdWVzdENyZWRlbnRpYWxzPVsib21pdCIsInNhbWUtb3JpZ2luIiwiaW5jbHVkZSJdLF9fd2JpbmRnZW5fZW51bV9SZXF1ZXN0TW9kZT1bInNhbWUtb3JpZ2luIiwibm8tY29ycyIsImNvcnMiLCJuYXZpZ2F0ZSJdLF9fd2JpbmRnZW5fZW51bV9Xb3JrZXJUeXBlPVsiY2xhc3NpYyIsIm1vZHVsZSJdLEJ1aWxkT3B0aW9uc0ZpbmFsaXphdGlvbj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShwdHI9Pndhc20uX193YmdfYnVpbGRvcHRpb25zX2ZyZWUocHRyPj4+MCwxKSksQ3JlYXRlU3luY0FjY2Vzc0hhbmRsZU9wdGlvbnNGaW5hbGl6YXRpb249InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkocHRyPT53YXNtLl9fd2JnX2NyZWF0ZXN5bmNhY2Nlc3NoYW5kbGVvcHRpb25zX2ZyZWUocHRyPj4+MCwxKSksRGlyRW50cnlGaW5hbGl6YXRpb249InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkocHRyPT53YXNtLl9fd2JnX2RpcmVudHJ5X2ZyZWUocHRyPj4+MCwxKSksRnNGaW5hbGl6YXRpb249InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkocHRyPT53YXNtLl9fd2JnX2ZzX2ZyZWUocHRyPj4+MCwxKSksTWV0YWRhdGFGaW5hbGl6YXRpb249InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkocHRyPT53YXNtLl9fd2JnX21ldGFkYXRhX2ZyZWUocHRyPj4+MCwxKSksUHJvamVjdEZpbmFsaXphdGlvbj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShwdHI9Pndhc20uX193YmdfcHJvamVjdF9mcmVlKHB0cj4+PjAsMSkpLFJvb3RUYXNrRmluYWxpemF0aW9uPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KHB0cj0+d2FzbS5fX3diZ19yb290dGFza19mcmVlKHB0cj4+PjAsMSkpLFdhc21UYXNrTWVzc2FnZUZpbmFsaXphdGlvbj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShwdHI9Pndhc20uX193Ymdfd2FzbXRhc2ttZXNzYWdlX2ZyZWUocHRyPj4+MCwxKSksV2ViV29ya2VyQ3JlYXRpb25GaW5hbGl6YXRpb249InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkocHRyPT53YXNtLl9fd2JnX3dlYndvcmtlcmNyZWF0aW9uX2ZyZWUocHRyPj4+MCwxKSksV2ViV29ya2VyT3B0aW9uc0ZpbmFsaXphdGlvbj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShwdHI9Pndhc20uX193Ymdfd2Vid29ya2Vyb3B0aW9uc19mcmVlKHB0cj4+PjAsMSkpLFdlYldvcmtlclRlcm1pbmF0aW9uRmluYWxpemF0aW9uPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KHB0cj0+d2FzbS5fX3diZ193ZWJ3b3JrZXJ0ZXJtaW5hdGlvbl9mcmVlKHB0cj4+PjAsMSkpO2Z1bmN0aW9uIGFkZEhlYXBPYmplY3Qob2JqKXtoZWFwX25leHQ9PT1oZWFwLmxlbmd0aCYmaGVhcC5wdXNoKGhlYXAubGVuZ3RoKzEpO2NvbnN0IGlkeD1oZWFwX25leHQ7cmV0dXJuIGhlYXBfbmV4dD1oZWFwW2lkeF0saGVhcFtpZHhdPW9iaixpZHh9ZnVuY3Rpb24gX2Fzc2VydENsYXNzKGluc3RhbmNlLGtsYXNzKXtpZighKGluc3RhbmNlIGluc3RhbmNlb2Yga2xhc3MpKXRocm93IG5ldyBFcnJvcihgZXhwZWN0ZWQgaW5zdGFuY2Ugb2YgJHtrbGFzcy5uYW1lfWApfWZ1bmN0aW9uIGFkZEJvcnJvd2VkT2JqZWN0KG9iail7aWYoMT09c3RhY2tfcG9pbnRlcil0aHJvdyBuZXcgRXJyb3IoIm91dCBvZiBqcyBzdGFjayIpO3JldHVybiBoZWFwWy0tc3RhY2tfcG9pbnRlcl09b2JqLHN0YWNrX3BvaW50ZXJ9Y29uc3QgQ0xPU1VSRV9EVE9SUz0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShzdGF0ZT0+c3RhdGUuZHRvcihzdGF0ZS5hLHN0YXRlLmIpKTtmdW5jdGlvbiBkZWJ1Z1N0cmluZyh2YWwpe2NvbnN0IHR5cGU9dHlwZW9mIHZhbDtpZigibnVtYmVyIj09dHlwZXx8ImJvb2xlYW4iPT10eXBlfHxudWxsPT12YWwpcmV0dXJuYCR7dmFsfWA7aWYoInN0cmluZyI9PXR5cGUpcmV0dXJuYCIke3ZhbH0iYDtpZigic3ltYm9sIj09dHlwZSl7Y29uc3QgZGVzY3JpcHRpb249dmFsLmRlc2NyaXB0aW9uO3JldHVybiBudWxsPT1kZXNjcmlwdGlvbj8iU3ltYm9sIjpgU3ltYm9sKCR7ZGVzY3JpcHRpb259KWB9aWYoImZ1bmN0aW9uIj09dHlwZSl7Y29uc3QgbmFtZT12YWwubmFtZTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIG5hbWUmJm5hbWUubGVuZ3RoPjA/YEZ1bmN0aW9uKCR7bmFtZX0pYDoiRnVuY3Rpb24ifWlmKEFycmF5LmlzQXJyYXkodmFsKSl7Y29uc3QgbGVuZ3RoPXZhbC5sZW5ndGg7bGV0IGRlYnVnPSJbIjtsZW5ndGg+MCYmKGRlYnVnKz1kZWJ1Z1N0cmluZyh2YWxbMF0pKTtmb3IobGV0IGk9MTtpPGxlbmd0aDtpKyspZGVidWcrPSIsICIrZGVidWdTdHJpbmcodmFsW2ldKTtyZXR1cm4gZGVidWcrPSJdIixkZWJ1Z31jb25zdCBidWlsdEluTWF0Y2hlcz0vXFtvYmplY3QgKFteXF1dKylcXS8uZXhlYyh0b1N0cmluZy5jYWxsKHZhbCkpO2xldCBjbGFzc05hbWU7aWYoIShidWlsdEluTWF0Y2hlcyYmYnVpbHRJbk1hdGNoZXMubGVuZ3RoPjEpKXJldHVybiB0b1N0cmluZy5jYWxsKHZhbCk7aWYoY2xhc3NOYW1lPWJ1aWx0SW5NYXRjaGVzWzFdLCJPYmplY3QiPT1jbGFzc05hbWUpdHJ5e3JldHVybiJPYmplY3QoIitKU09OLnN0cmluZ2lmeSh2YWwpKyIpIn1jYXRjaChfKXtyZXR1cm4iT2JqZWN0In1yZXR1cm4gdmFsIGluc3RhbmNlb2YgRXJyb3I/YCR7dmFsLm5hbWV9OiAke3ZhbC5tZXNzYWdlfVxuJHt2YWwuc3RhY2t9YDpjbGFzc05hbWV9ZnVuY3Rpb24gZHJvcE9iamVjdChpZHgpe2lkeDwxMzJ8fChoZWFwW2lkeF09aGVhcF9uZXh0LGhlYXBfbmV4dD1pZHgpfWZ1bmN0aW9uIGdldEFycmF5SnNWYWx1ZUZyb21XYXNtMChwdHIsbGVuKXtwdHI+Pj49MDtjb25zdCBtZW09Z2V0RGF0YVZpZXdNZW1vcnkwKCkscmVzdWx0PVtdO2ZvcihsZXQgaT1wdHI7aTxwdHIrNCpsZW47aSs9NClyZXN1bHQucHVzaCh0YWtlT2JqZWN0KG1lbS5nZXRVaW50MzIoaSwhMCkpKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGdldEFycmF5VThGcm9tV2FzbTAocHRyLGxlbil7cmV0dXJuIHB0cj4+Pj0wLGdldFVpbnQ4QXJyYXlNZW1vcnkwKCkuc3ViYXJyYXkocHRyLzEscHRyLzErbGVuKX1sZXQgY2FjaGVkRGF0YVZpZXdNZW1vcnkwPW51bGw7ZnVuY3Rpb24gZ2V0RGF0YVZpZXdNZW1vcnkwKCl7cmV0dXJuIG51bGwhPT1jYWNoZWREYXRhVmlld01lbW9yeTAmJmNhY2hlZERhdGFWaWV3TWVtb3J5MC5idWZmZXI9PT13YXNtLm1lbW9yeS5idWZmZXJ8fChjYWNoZWREYXRhVmlld01lbW9yeTA9bmV3IERhdGFWaWV3KHdhc20ubWVtb3J5LmJ1ZmZlcikpLGNhY2hlZERhdGFWaWV3TWVtb3J5MH1mdW5jdGlvbiBnZXRTdHJpbmdGcm9tV2FzbTAocHRyLGxlbil7cmV0dXJuIGRlY29kZVRleHQocHRyPj4+PTAsbGVuKX1sZXQgY2FjaGVkVWludDhBcnJheU1lbW9yeTA9bnVsbDtmdW5jdGlvbiBnZXRVaW50OEFycmF5TWVtb3J5MCgpe3JldHVybiBudWxsIT09Y2FjaGVkVWludDhBcnJheU1lbW9yeTAmJmNhY2hlZFVpbnQ4QXJyYXlNZW1vcnkwLmJ1ZmZlcj09PXdhc20ubWVtb3J5LmJ1ZmZlcnx8KGNhY2hlZFVpbnQ4QXJyYXlNZW1vcnkwPW5ldyBVaW50OEFycmF5KHdhc20ubWVtb3J5LmJ1ZmZlcikpLGNhY2hlZFVpbnQ4QXJyYXlNZW1vcnkwfWZ1bmN0aW9uIGdldE9iamVjdChpZHgpe3JldHVybiBoZWFwW2lkeF19ZnVuY3Rpb24gaGFuZGxlRXJyb3IoZixhcmdzKXt0cnl7cmV0dXJuIGYuYXBwbHkodGhpcyxhcmdzKX1jYXRjaChlKXt3YXNtLl9fd2JpbmRnZW5fZXhwb3J0MyhhZGRIZWFwT2JqZWN0KGUpKX19bGV0IGhlYXA9bmV3IEFycmF5KDEyOCkuZmlsbCh2b2lkIDApO2hlYXAucHVzaCh2b2lkIDAsbnVsbCwhMCwhMSk7bGV0IGhlYXBfbmV4dD1oZWFwLmxlbmd0aDtmdW5jdGlvbiBpc0xpa2VOb25lKHgpe3JldHVybiBudWxsPT14fWZ1bmN0aW9uIG1ha2VDbG9zdXJlKGFyZzAsYXJnMSxkdG9yLGYpe2NvbnN0IHN0YXRlPXthOmFyZzAsYjphcmcxLGNudDoxLGR0b3J9LHJlYWw9KC4uLmFyZ3MpPT57c3RhdGUuY250Kys7dHJ5e3JldHVybiBmKHN0YXRlLmEsc3RhdGUuYiwuLi5hcmdzKX1maW5hbGx5e3JlYWwuX3diZ19jYl91bnJlZigpfX07cmV0dXJuIHJlYWwuX3diZ19jYl91bnJlZj0oKT0+ezA9PT0tLXN0YXRlLmNudCYmKHN0YXRlLmR0b3Ioc3RhdGUuYSxzdGF0ZS5iKSxzdGF0ZS5hPTAsQ0xPU1VSRV9EVE9SUy51bnJlZ2lzdGVyKHN0YXRlKSl9LENMT1NVUkVfRFRPUlMucmVnaXN0ZXIocmVhbCxzdGF0ZSxzdGF0ZSkscmVhbH1mdW5jdGlvbiBtYWtlTXV0Q2xvc3VyZShhcmcwLGFyZzEsZHRvcixmKXtjb25zdCBzdGF0ZT17YTphcmcwLGI6YXJnMSxjbnQ6MSxkdG9yfSxyZWFsPSguLi5hcmdzKT0+e3N0YXRlLmNudCsrO2NvbnN0IGE9c3RhdGUuYTtzdGF0ZS5hPTA7dHJ5e3JldHVybiBmKGEsc3RhdGUuYiwuLi5hcmdzKX1maW5hbGx5e3N0YXRlLmE9YSxyZWFsLl93YmdfY2JfdW5yZWYoKX19O3JldHVybiByZWFsLl93YmdfY2JfdW5yZWY9KCk9PnswPT09LS1zdGF0ZS5jbnQmJihzdGF0ZS5kdG9yKHN0YXRlLmEsc3RhdGUuYiksc3RhdGUuYT0wLENMT1NVUkVfRFRPUlMudW5yZWdpc3RlcihzdGF0ZSkpfSxDTE9TVVJFX0RUT1JTLnJlZ2lzdGVyKHJlYWwsc3RhdGUsc3RhdGUpLHJlYWx9ZnVuY3Rpb24gcGFzc1N0cmluZ1RvV2FzbTAoYXJnLG1hbGxvYyxyZWFsbG9jKXtpZih2b2lkIDA9PT1yZWFsbG9jKXtjb25zdCBidWY9Y2FjaGVkVGV4dEVuY29kZXIuZW5jb2RlKGFyZykscHRyPW1hbGxvYyhidWYubGVuZ3RoLDEpPj4+MDtyZXR1cm4gZ2V0VWludDhBcnJheU1lbW9yeTAoKS5zdWJhcnJheShwdHIscHRyK2J1Zi5sZW5ndGgpLnNldChidWYpLFdBU01fVkVDVE9SX0xFTj1idWYubGVuZ3RoLHB0cn1sZXQgbGVuPWFyZy5sZW5ndGgscHRyPW1hbGxvYyhsZW4sMSk+Pj4wO2NvbnN0IG1lbT1nZXRVaW50OEFycmF5TWVtb3J5MCgpO2xldCBvZmZzZXQ9MDtmb3IoO29mZnNldDxsZW47b2Zmc2V0Kyspe2NvbnN0IGNvZGU9YXJnLmNoYXJDb2RlQXQob2Zmc2V0KTtpZihjb2RlPjEyNylicmVhazttZW1bcHRyK29mZnNldF09Y29kZX1pZihvZmZzZXQhPT1sZW4pezAhPT1vZmZzZXQmJihhcmc9YXJnLnNsaWNlKG9mZnNldCkpLHB0cj1yZWFsbG9jKHB0cixsZW4sbGVuPW9mZnNldCszKmFyZy5sZW5ndGgsMSk+Pj4wO2NvbnN0IHZpZXc9Z2V0VWludDhBcnJheU1lbW9yeTAoKS5zdWJhcnJheShwdHIrb2Zmc2V0LHB0citsZW4pO29mZnNldCs9Y2FjaGVkVGV4dEVuY29kZXIuZW5jb2RlSW50byhhcmcsdmlldykud3JpdHRlbixwdHI9cmVhbGxvYyhwdHIsbGVuLG9mZnNldCwxKT4+PjB9cmV0dXJuIFdBU01fVkVDVE9SX0xFTj1vZmZzZXQscHRyfWxldCBzdGFja19wb2ludGVyPTEyODtmdW5jdGlvbiB0YWtlT2JqZWN0KGlkeCl7Y29uc3QgcmV0PWdldE9iamVjdChpZHgpO3JldHVybiBkcm9wT2JqZWN0KGlkeCkscmV0fWxldCBjYWNoZWRUZXh0RGVjb2Rlcj0idW5kZWZpbmVkIiE9dHlwZW9mIFRleHREZWNvZGVyP25ldyBUZXh0RGVjb2RlcigidXRmLTgiLHtpZ25vcmVCT006ITAsZmF0YWw6ITB9KTp2b2lkIDA7Y2FjaGVkVGV4dERlY29kZXImJmNhY2hlZFRleHREZWNvZGVyLmRlY29kZSgpO2NvbnN0IE1BWF9TQUZBUklfREVDT0RFX0JZVEVTPTIxNDY0MzUwNzI7bGV0IG51bUJ5dGVzRGVjb2RlZD0wO2Z1bmN0aW9uIGRlY29kZVRleHQocHRyLGxlbil7cmV0dXJuIG51bUJ5dGVzRGVjb2RlZCs9bGVuLG51bUJ5dGVzRGVjb2RlZD49TUFYX1NBRkFSSV9ERUNPREVfQllURVMmJihjYWNoZWRUZXh0RGVjb2Rlcj1uZXcgVGV4dERlY29kZXIoInV0Zi04Iix7aWdub3JlQk9NOiEwLGZhdGFsOiEwfSksY2FjaGVkVGV4dERlY29kZXIuZGVjb2RlKCksbnVtQnl0ZXNEZWNvZGVkPWxlbiksY2FjaGVkVGV4dERlY29kZXIuZGVjb2RlKGdldFVpbnQ4QXJyYXlNZW1vcnkwKCkuc2xpY2UocHRyLHB0citsZW4pKX1jb25zdCBjYWNoZWRUZXh0RW5jb2Rlcj0idW5kZWZpbmVkIiE9dHlwZW9mIFRleHRFbmNvZGVyP25ldyBUZXh0RW5jb2Rlcjp2b2lkIDA7Y2FjaGVkVGV4dEVuY29kZXImJihjYWNoZWRUZXh0RW5jb2Rlci5lbmNvZGVJbnRvPWZ1bmN0aW9uKGFyZyx2aWV3KXtjb25zdCBidWY9Y2FjaGVkVGV4dEVuY29kZXIuZW5jb2RlKGFyZyk7cmV0dXJuIHZpZXcuc2V0KGJ1Zikse3JlYWQ6YXJnLmxlbmd0aCx3cml0dGVuOmJ1Zi5sZW5ndGh9fSk7bGV0IFdBU01fVkVDVE9SX0xFTj0wLHdhc21Nb2R1bGUsd2FzbTtmdW5jdGlvbiBfX3diZ19maW5hbGl6ZV9pbml0KGluc3RhbmNlLG1vZHVsZSx0aHJlYWRfc3RhY2tfc2l6ZSl7aWYod2FzbT1pbnN0YW5jZS5leHBvcnRzLHdhc21Nb2R1bGU9bW9kdWxlLGNhY2hlZERhdGFWaWV3TWVtb3J5MD1udWxsLGNhY2hlZFVpbnQ4QXJyYXlNZW1vcnkwPW51bGwsdm9pZCAwIT09dGhyZWFkX3N0YWNrX3NpemUmJigibnVtYmVyIiE9dHlwZW9mIHRocmVhZF9zdGFja19zaXplfHwwPT09dGhyZWFkX3N0YWNrX3NpemV8fHRocmVhZF9zdGFja19zaXplJTY1NTM2IT0wKSl0aHJvdyJpbnZhbGlkIHN0YWNrIHNpemUiO3JldHVybiB3YXNtLl9fd2JpbmRnZW5fc3RhcnQodGhyZWFkX3N0YWNrX3NpemUpLHdhc219YXN5bmMgZnVuY3Rpb24gX193YmdfbG9hZChtb2R1bGUsaW1wb3J0cyl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFJlc3BvbnNlJiZtb2R1bGUgaW5zdGFuY2VvZiBSZXNwb25zZSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKXRyeXtyZXR1cm4gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcobW9kdWxlLGltcG9ydHMpfWNhdGNoKGUpe2lmKCEobW9kdWxlLm9rJiZmdW5jdGlvbiBleHBlY3RlZFJlc3BvbnNlVHlwZSh0eXBlKXtzd2l0Y2godHlwZSl7Y2FzZSJiYXNpYyI6Y2FzZSJjb3JzIjpjYXNlImRlZmF1bHQiOnJldHVybiEwfXJldHVybiExfShtb2R1bGUudHlwZSkpfHwiYXBwbGljYXRpb24vd2FzbSI9PT1tb2R1bGUuaGVhZGVycy5nZXQoIkNvbnRlbnQtVHlwZSIpKXRocm93IGU7Y29uc29sZS53YXJuKCJgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmdgIGZhaWxlZCBiZWNhdXNlIHlvdXIgc2VydmVyIGRvZXMgbm90IHNlcnZlIFdhc20gd2l0aCBgYXBwbGljYXRpb24vd2FzbWAgTUlNRSB0eXBlLiBGYWxsaW5nIGJhY2sgdG8gYFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlYCB3aGljaCBpcyBzbG93ZXIuIE9yaWdpbmFsIGVycm9yOlxuIixlKX1jb25zdCBieXRlcz1hd2FpdCBtb2R1bGUuYXJyYXlCdWZmZXIoKTtyZXR1cm4gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoYnl0ZXMsaW1wb3J0cyl9e2NvbnN0IGluc3RhbmNlPWF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKG1vZHVsZSxpbXBvcnRzKTtyZXR1cm4gaW5zdGFuY2UgaW5zdGFuY2VvZiBXZWJBc3NlbWJseS5JbnN0YW5jZT97aW5zdGFuY2UsbW9kdWxlfTppbnN0YW5jZX19ZnVuY3Rpb24gaW5pdFN5bmMobW9kdWxlLG1lbW9yeSl7aWYodm9pZCAwIT09d2FzbSlyZXR1cm4gd2FzbTtsZXQgdGhyZWFkX3N0YWNrX3NpemU7dm9pZCAwIT09bW9kdWxlJiYoT2JqZWN0LmdldFByb3RvdHlwZU9mKG1vZHVsZSk9PT1PYmplY3QucHJvdG90eXBlPyh7bW9kdWxlLG1lbW9yeSx0aHJlYWRfc3RhY2tfc2l6ZX09bW9kdWxlKTpjb25zb2xlLndhcm4oInVzaW5nIGRlcHJlY2F0ZWQgcGFyYW1ldGVycyBmb3IgYGluaXRTeW5jKClgOyBwYXNzIGEgc2luZ2xlIG9iamVjdCBpbnN0ZWFkIikpO2NvbnN0IGltcG9ydHM9X193YmdfZ2V0X2ltcG9ydHMobWVtb3J5KTttb2R1bGUgaW5zdGFuY2VvZiBXZWJBc3NlbWJseS5Nb2R1bGV8fChtb2R1bGU9bmV3IFdlYkFzc2VtYmx5Lk1vZHVsZShtb2R1bGUpKTtyZXR1cm4gX193YmdfZmluYWxpemVfaW5pdChuZXcgV2ViQXNzZW1ibHkuSW5zdGFuY2UobW9kdWxlLGltcG9ydHMpLG1vZHVsZSx0aHJlYWRfc3RhY2tfc2l6ZSl9YXN5bmMgZnVuY3Rpb24gX193YmdfaW5pdChtb2R1bGVfb3JfcGF0aCxtZW1vcnkpe2lmKHZvaWQgMCE9PXdhc20pcmV0dXJuIHdhc207bGV0IHRocmVhZF9zdGFja19zaXplO3ZvaWQgMCE9PW1vZHVsZV9vcl9wYXRoJiYoT2JqZWN0LmdldFByb3RvdHlwZU9mKG1vZHVsZV9vcl9wYXRoKT09PU9iamVjdC5wcm90b3R5cGU/KHttb2R1bGVfb3JfcGF0aCxtZW1vcnksdGhyZWFkX3N0YWNrX3NpemV9PW1vZHVsZV9vcl9wYXRoKTpjb25zb2xlLndhcm4oInVzaW5nIGRlcHJlY2F0ZWQgcGFyYW1ldGVycyBmb3IgdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uOyBwYXNzIGEgc2luZ2xlIG9iamVjdCBpbnN0ZWFkIikpLHZvaWQgMD09PW1vZHVsZV9vcl9wYXRoJiYobW9kdWxlX29yX3BhdGg9bmV3IFVSTChfX3dlYnBhY2tfcmVxdWlyZV9fKCIuL3NyYy91dG9vL2luZGV4X2JnLndhc20iKSxfX3dlYnBhY2tfcmVxdWlyZV9fLmIpKTtjb25zdCBpbXBvcnRzPV9fd2JnX2dldF9pbXBvcnRzKG1lbW9yeSk7KCJzdHJpbmciPT10eXBlb2YgbW9kdWxlX29yX3BhdGh8fCJmdW5jdGlvbiI9PXR5cGVvZiBSZXF1ZXN0JiZtb2R1bGVfb3JfcGF0aCBpbnN0YW5jZW9mIFJlcXVlc3R8fCJmdW5jdGlvbiI9PXR5cGVvZiBVUkwmJm1vZHVsZV9vcl9wYXRoIGluc3RhbmNlb2YgVVJMKSYmKG1vZHVsZV9vcl9wYXRoPWZldGNoKG1vZHVsZV9vcl9wYXRoKSk7Y29uc3R7aW5zdGFuY2UsbW9kdWxlfT1hd2FpdCBfX3diZ19sb2FkKGF3YWl0IG1vZHVsZV9vcl9wYXRoLGltcG9ydHMpO3JldHVybiBfX3diZ19maW5hbGl6ZV9pbml0KGluc3RhbmNlLG1vZHVsZSx0aHJlYWRfc3RhY2tfc2l6ZSl9fSwiLi9zcmMvdXRvby9pbmRleF9iZy53YXNtIihtb2R1bGUsX191bnVzZWRfd2VicGFja19leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18peyJ1c2Ugc3RyaWN0Ijttb2R1bGUuZXhwb3J0cz1fX3dlYnBhY2tfcmVxdWlyZV9fLnArImM4MzBiMDBjMDIxMDZiMzcyMjQ0Lndhc20ifSwiP2M5NWEiKCl7fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2F2YWlsYWJsZS10eXBlZC1hcnJheXMvaW5kZXguanMiKG1vZHVsZSxfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO3ZhciBwb3NzaWJsZU5hbWVzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9wb3NzaWJsZS10eXBlZC1hcnJheS1uYW1lcy9pbmRleC5qcyIpLGc9InVuZGVmaW5lZCI9PXR5cGVvZiBnbG9iYWxUaGlzP19fd2VicGFja19yZXF1aXJlX18uZzpnbG9iYWxUaGlzO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uIGF2YWlsYWJsZVR5cGVkQXJyYXlzKCl7Zm9yKHZhciBvdXQ9W10saT0wO2k8cG9zc2libGVOYW1lcy5sZW5ndGg7aSsrKSJmdW5jdGlvbiI9PXR5cGVvZiBnW3Bvc3NpYmxlTmFtZXNbaV1dJiYob3V0W291dC5sZW5ndGhdPXBvc3NpYmxlTmFtZXNbaV0pO3JldHVybiBvdXR9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL2RvbWFpbi1icm93c2VyL3NvdXJjZS9pbmRleC5qcyIobW9kdWxlLF9fdW51c2VkX3dlYnBhY2tfZXhwb3J0cyxfX3dlYnBhY2tfcmVxdWlyZV9fKXsidXNlIHN0cmljdCI7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24oKXt2YXIgZXZlbnRzPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9ldmVudHMvZXZlbnRzLmpzIiksZG9tYWluPXt9O3JldHVybiBkb21haW4uY3JlYXRlRG9tYWluPWRvbWFpbi5jcmVhdGU9ZnVuY3Rpb24oKXt2YXIgZD1uZXcgZXZlbnRzLkV2ZW50RW1pdHRlcjtmdW5jdGlvbiBlbWl0RXJyb3IoZSl7ZC5lbWl0KCJlcnJvciIsZSl9cmV0dXJuIGQuYWRkPWZ1bmN0aW9uKGVtaXR0ZXIpe2VtaXR0ZXIub24oImVycm9yIixlbWl0RXJyb3IpfSxkLnJlbW92ZT1mdW5jdGlvbihlbWl0dGVyKXtlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsZW1pdEVycm9yKX0sZC5iaW5kPWZ1bmN0aW9uKGZuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYXJncz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RyeXtmbi5hcHBseShudWxsLGFyZ3MpfWNhdGNoKGVycil7ZW1pdEVycm9yKGVycil9fX0sZC5pbnRlcmNlcHQ9ZnVuY3Rpb24oZm4pe3JldHVybiBmdW5jdGlvbihlcnIpe2lmKGVycillbWl0RXJyb3IoZXJyKTtlbHNle3ZhciBhcmdzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTt0cnl7Zm4uYXBwbHkobnVsbCxhcmdzKX1jYXRjaChlcnIpe2VtaXRFcnJvcihlcnIpfX19fSxkLnJ1bj1mdW5jdGlvbihmbil7dHJ5e2ZuKCl9Y2F0Y2goZXJyKXtlbWl0RXJyb3IoZXJyKX1yZXR1cm4gdGhpc30sZC5kaXNwb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCksdGhpc30sZC5lbnRlcj1kLmV4aXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZH0sZG9tYWlufS5jYWxsKHRoaXMpfSwiLi4vLi4vbm9kZV9tb2R1bGVzL25vZGUtc3RkbGliLWJyb3dzZXIvY2pzL21vY2svZW1wdHkuanMiKG1vZHVsZSl7InVzZSBzdHJpY3QiO21vZHVsZS5leHBvcnRzPW51bGx9LCIuLi8uLi9ub2RlX21vZHVsZXMvbm9kZS1zdGRsaWItYnJvd3Nlci9janMvcHJveHkvcHJvY2Vzcy5qcyIobW9kdWxlLGV4cG9ydHMpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGNhY2hlZFNldFRpbWVvdXQsY2FjaGVkQ2xlYXJUaW1lb3V0LGJyb3dzZXIkMT17ZXhwb3J0czp7fX0scHJvY2Vzcz1icm93c2VyJDEuZXhwb3J0cz17fTtmdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCl7dGhyb3cgbmV3IEVycm9yKCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9ZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCgpe3Rocm93IG5ldyBFcnJvcigiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9ZnVuY3Rpb24gcnVuVGltZW91dChmdW4pe2lmKGNhY2hlZFNldFRpbWVvdXQ9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KGZ1biwwKTtpZigoY2FjaGVkU2V0VGltZW91dD09PWRlZmF1bHRTZXRUaW1vdXR8fCFjYWNoZWRTZXRUaW1lb3V0KSYmc2V0VGltZW91dClyZXR1cm4gY2FjaGVkU2V0VGltZW91dD1zZXRUaW1lb3V0LHNldFRpbWVvdXQoZnVuLDApO3RyeXtyZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sMCl9Y2F0Y2goZSl7dHJ5e3JldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCxmdW4sMCl9Y2F0Y2goZSl7cmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLGZ1biwwKX19fSFmdW5jdGlvbigpe3RyeXtjYWNoZWRTZXRUaW1lb3V0PSJmdW5jdGlvbiI9PXR5cGVvZiBzZXRUaW1lb3V0P3NldFRpbWVvdXQ6ZGVmYXVsdFNldFRpbW91dH1jYXRjaChlKXtjYWNoZWRTZXRUaW1lb3V0PWRlZmF1bHRTZXRUaW1vdXR9dHJ5e2NhY2hlZENsZWFyVGltZW91dD0iZnVuY3Rpb24iPT10eXBlb2YgY2xlYXJUaW1lb3V0P2NsZWFyVGltZW91dDpkZWZhdWx0Q2xlYXJUaW1lb3V0fWNhdGNoKGUpe2NhY2hlZENsZWFyVGltZW91dD1kZWZhdWx0Q2xlYXJUaW1lb3V0fX0oKTt2YXIgY3VycmVudFF1ZXVlLHF1ZXVlPVtdLGRyYWluaW5nPSExLHF1ZXVlSW5kZXg9LTE7ZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCl7ZHJhaW5pbmcmJmN1cnJlbnRRdWV1ZSYmKGRyYWluaW5nPSExLGN1cnJlbnRRdWV1ZS5sZW5ndGg/cXVldWU9Y3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk6cXVldWVJbmRleD0tMSxxdWV1ZS5sZW5ndGgmJmRyYWluUXVldWUoKSl9ZnVuY3Rpb24gZHJhaW5RdWV1ZSgpe2lmKCFkcmFpbmluZyl7dmFyIHRpbWVvdXQ9cnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO2RyYWluaW5nPSEwO2Zvcih2YXIgbGVuPXF1ZXVlLmxlbmd0aDtsZW47KXtmb3IoY3VycmVudFF1ZXVlPXF1ZXVlLHF1ZXVlPVtdOysrcXVldWVJbmRleDxsZW47KWN1cnJlbnRRdWV1ZSYmY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO3F1ZXVlSW5kZXg9LTEsbGVuPXF1ZXVlLmxlbmd0aH1jdXJyZW50UXVldWU9bnVsbCxkcmFpbmluZz0hMSxmdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKXtpZihjYWNoZWRDbGVhclRpbWVvdXQ9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO2lmKChjYWNoZWRDbGVhclRpbWVvdXQ9PT1kZWZhdWx0Q2xlYXJUaW1lb3V0fHwhY2FjaGVkQ2xlYXJUaW1lb3V0KSYmY2xlYXJUaW1lb3V0KXJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQ9Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dChtYXJrZXIpO3RyeXtyZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcil9Y2F0Y2goZSl7dHJ5e3JldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLG1hcmtlcil9Y2F0Y2goZSl7cmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsbWFya2VyKX19fSh0aW1lb3V0KX19ZnVuY3Rpb24gSXRlbShmdW4sYXJyYXkpe3RoaXMuZnVuPWZ1bix0aGlzLmFycmF5PWFycmF5fWZ1bmN0aW9uIG5vb3AkMSgpe31mdW5jdGlvbiBub29wKCl7fXByb2Nlc3MubmV4dFRpY2s9ZnVuY3Rpb24oZnVuKXt2YXIgYXJncz1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKylhcmdzW2ktMV09YXJndW1lbnRzW2ldO3F1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLGFyZ3MpKSwxIT09cXVldWUubGVuZ3RofHxkcmFpbmluZ3x8cnVuVGltZW91dChkcmFpblF1ZXVlKX0sSXRlbS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX0scHJvY2Vzcy50aXRsZT0iYnJvd3NlciIscHJvY2Vzcy5icm93c2VyPSEwLHByb2Nlc3MuZW52PXt9LHByb2Nlc3MuYXJndj1bXSxwcm9jZXNzLnZlcnNpb249IiIscHJvY2Vzcy52ZXJzaW9ucz17fSxwcm9jZXNzLm9uPW5vb3AkMSxwcm9jZXNzLmFkZExpc3RlbmVyPW5vb3AkMSxwcm9jZXNzLm9uY2U9bm9vcCQxLHByb2Nlc3Mub2ZmPW5vb3AkMSxwcm9jZXNzLnJlbW92ZUxpc3RlbmVyPW5vb3AkMSxwcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycz1ub29wJDEscHJvY2Vzcy5lbWl0PW5vb3AkMSxwcm9jZXNzLnByZXBlbmRMaXN0ZW5lcj1ub29wJDEscHJvY2Vzcy5wcmVwZW5kT25jZUxpc3RlbmVyPW5vb3AkMSxwcm9jZXNzLmxpc3RlbmVycz1mdW5jdGlvbihuYW1lKXtyZXR1cm5bXX0scHJvY2Vzcy5iaW5kaW5nPWZ1bmN0aW9uKG5hbWUpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKX0scHJvY2Vzcy5jd2Q9ZnVuY3Rpb24oKXtyZXR1cm4iLyJ9LHByb2Nlc3MuY2hkaXI9ZnVuY3Rpb24oZGlyKXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCIpfSxwcm9jZXNzLnVtYXNrPWZ1bmN0aW9uKCl7cmV0dXJuIDB9O3ZhciBicm93c2VyPWJyb3dzZXIkMS5leHBvcnRzLmJyb3dzZXIsZW1pdFdhcm5pbmc9bm9vcCxiaW5kaW5nPWJyb3dzZXIkMS5leHBvcnRzLmJpbmRpbmcsZXhpdD1ub29wLGZlYXR1cmVzPXt9LGtpbGw9bm9vcCxkbG9wZW49bm9vcCx1cHRpbWU9bm9vcCxtZW1vcnlVc2FnZT1ub29wLHV2Q291bnRlcnM9bm9vcCxleGVjQXJndj1bXSxhcGk9e25leHRUaWNrOmJyb3dzZXIkMS5leHBvcnRzLm5leHRUaWNrLHRpdGxlOmJyb3dzZXIkMS5leHBvcnRzLnRpdGxlLGJyb3dzZXIsZW52OmJyb3dzZXIkMS5leHBvcnRzLmVudixhcmd2OmJyb3dzZXIkMS5leHBvcnRzLmFyZ3YsdmVyc2lvbjpicm93c2VyJDEuZXhwb3J0cy52ZXJzaW9uLHZlcnNpb25zOmJyb3dzZXIkMS5leHBvcnRzLnZlcnNpb25zLG9uOmJyb3dzZXIkMS5leHBvcnRzLm9uLGFkZExpc3RlbmVyOmJyb3dzZXIkMS5leHBvcnRzLmFkZExpc3RlbmVyLG9uY2U6YnJvd3NlciQxLmV4cG9ydHMub25jZSxvZmY6YnJvd3NlciQxLmV4cG9ydHMub2ZmLHJlbW92ZUxpc3RlbmVyOmJyb3dzZXIkMS5leHBvcnRzLnJlbW92ZUxpc3RlbmVyLHJlbW92ZUFsbExpc3RlbmVyczpicm93c2VyJDEuZXhwb3J0cy5yZW1vdmVBbGxMaXN0ZW5lcnMsZW1pdDpicm93c2VyJDEuZXhwb3J0cy5lbWl0LGVtaXRXYXJuaW5nLHByZXBlbmRMaXN0ZW5lcjpicm93c2VyJDEuZXhwb3J0cy5wcmVwZW5kTGlzdGVuZXIscHJlcGVuZE9uY2VMaXN0ZW5lcjpicm93c2VyJDEuZXhwb3J0cy5wcmVwZW5kT25jZUxpc3RlbmVyLGxpc3RlbmVyczpicm93c2VyJDEuZXhwb3J0cy5saXN0ZW5lcnMsYmluZGluZyxjd2Q6YnJvd3NlciQxLmV4cG9ydHMuY3dkLGNoZGlyOmJyb3dzZXIkMS5leHBvcnRzLmNoZGlyLHVtYXNrOmJyb3dzZXIkMS5leHBvcnRzLnVtYXNrLGV4aXQscGlkOjEsZmVhdHVyZXMsa2lsbCxkbG9wZW4sdXB0aW1lLG1lbW9yeVVzYWdlLHV2Q291bnRlcnMscGxhdGZvcm06ImJyb3dzZXIiLGFyY2g6ImJyb3dzZXIiLGV4ZWNQYXRoOiJicm93c2VyIixleGVjQXJndn07ZXhwb3J0cy5hZGRMaXN0ZW5lcj1icm93c2VyJDEuZXhwb3J0cy5hZGRMaXN0ZW5lcixleHBvcnRzLmFyY2g9ImJyb3dzZXIiLGV4cG9ydHMuYXJndj1icm93c2VyJDEuZXhwb3J0cy5hcmd2LGV4cG9ydHMuYmluZGluZz1iaW5kaW5nLGV4cG9ydHMuYnJvd3Nlcj1icm93c2VyLGV4cG9ydHMuY2hkaXI9YnJvd3NlciQxLmV4cG9ydHMuY2hkaXIsZXhwb3J0cy5jd2Q9YnJvd3NlciQxLmV4cG9ydHMuY3dkLGV4cG9ydHMuZGVmYXVsdD1hcGksZXhwb3J0cy5kbG9wZW49ZGxvcGVuLGV4cG9ydHMuZW1pdD1icm93c2VyJDEuZXhwb3J0cy5lbWl0LGV4cG9ydHMuZW1pdFdhcm5pbmc9ZW1pdFdhcm5pbmcsZXhwb3J0cy5lbnY9YnJvd3NlciQxLmV4cG9ydHMuZW52LGV4cG9ydHMuZXhlY0FyZ3Y9ZXhlY0FyZ3YsZXhwb3J0cy5leGVjUGF0aD0iYnJvd3NlciIsZXhwb3J0cy5leGl0PWV4aXQsZXhwb3J0cy5mZWF0dXJlcz1mZWF0dXJlcyxleHBvcnRzLmtpbGw9a2lsbCxleHBvcnRzLmxpc3RlbmVycz1icm93c2VyJDEuZXhwb3J0cy5saXN0ZW5lcnMsZXhwb3J0cy5tZW1vcnlVc2FnZT1tZW1vcnlVc2FnZSxleHBvcnRzLm5leHRUaWNrPWJyb3dzZXIkMS5leHBvcnRzLm5leHRUaWNrLGV4cG9ydHMub2ZmPWJyb3dzZXIkMS5leHBvcnRzLm9mZixleHBvcnRzLm9uPWJyb3dzZXIkMS5leHBvcnRzLm9uLGV4cG9ydHMub25jZT1icm93c2VyJDEuZXhwb3J0cy5vbmNlLGV4cG9ydHMucGlkPTEsZXhwb3J0cy5wbGF0Zm9ybT0iYnJvd3NlciIsZXhwb3J0cy5wcmVwZW5kTGlzdGVuZXI9YnJvd3NlciQxLmV4cG9ydHMucHJlcGVuZExpc3RlbmVyLGV4cG9ydHMucHJlcGVuZE9uY2VMaXN0ZW5lcj1icm93c2VyJDEuZXhwb3J0cy5wcmVwZW5kT25jZUxpc3RlbmVyLGV4cG9ydHMucmVtb3ZlQWxsTGlzdGVuZXJzPWJyb3dzZXIkMS5leHBvcnRzLnJlbW92ZUFsbExpc3RlbmVycyxleHBvcnRzLnJlbW92ZUxpc3RlbmVyPWJyb3dzZXIkMS5leHBvcnRzLnJlbW92ZUxpc3RlbmVyLGV4cG9ydHMudGl0bGU9YnJvd3NlciQxLmV4cG9ydHMudGl0bGUsZXhwb3J0cy51bWFzaz1icm93c2VyJDEuZXhwb3J0cy51bWFzayxleHBvcnRzLnVwdGltZT11cHRpbWUsZXhwb3J0cy51dkNvdW50ZXJzPXV2Q291bnRlcnMsZXhwb3J0cy52ZXJzaW9uPWJyb3dzZXIkMS5leHBvcnRzLnZlcnNpb24sZXhwb3J0cy52ZXJzaW9ucz1icm93c2VyJDEuZXhwb3J0cy52ZXJzaW9ucyxleHBvcnRzPW1vZHVsZS5leHBvcnRzPWFwaX0sIi4uLy4uL25vZGVfbW9kdWxlcy9ub2RlLXN0ZGxpYi1icm93c2VyL2Nqcy9wcm94eS9xdWVyeXN0cmluZy5qcyIobW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcXVlcnlzdHJpbmdFczM9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9pbmRleC5qcyIpO2Z1bmN0aW9uIHFzRXNjYXBlKHN0cmluZyl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmcpfWZ1bmN0aW9uIHFzVW5lc2NhcGUoc3RyaW5nKXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHN0cmluZyl9dmFyIGFwaT17ZGVjb2RlOnF1ZXJ5c3RyaW5nRXMzLmRlY29kZSxlbmNvZGU6cXVlcnlzdHJpbmdFczMuZW5jb2RlLHBhcnNlOnF1ZXJ5c3RyaW5nRXMzLnBhcnNlLHN0cmluZ2lmeTpxdWVyeXN0cmluZ0VzMy5zdHJpbmdpZnksZXNjYXBlOnFzRXNjYXBlLHVuZXNjYXBlOnFzVW5lc2NhcGV9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCJkZWNvZGUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBxdWVyeXN0cmluZ0VzMy5kZWNvZGV9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsImVuY29kZSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHF1ZXJ5c3RyaW5nRXMzLmVuY29kZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywicGFyc2UiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBxdWVyeXN0cmluZ0VzMy5wYXJzZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywic3RyaW5naWZ5Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcXVlcnlzdHJpbmdFczMuc3RyaW5naWZ5fX0pLGV4cG9ydHMuZGVmYXVsdD1hcGksZXhwb3J0cy5lc2NhcGU9cXNFc2NhcGUsZXhwb3J0cy51bmVzY2FwZT1xc1VuZXNjYXBlLGV4cG9ydHM9bW9kdWxlLmV4cG9ydHM9YXBpfSwiLi4vLi4vbm9kZV9tb2R1bGVzL25vZGUtc3RkbGliLWJyb3dzZXIvY2pzL3Byb3h5L3VybC5qcyIobW9kdWxlLGV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcmVxdWlyZSQkMD1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvcHVueWNvZGUvcHVueWNvZGUuanMiKSxyZXF1aXJlJCQxPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9xcy9saWIvaW5kZXguanMiKTtmdW5jdGlvbiBfaW50ZXJvcERlZmF1bHRMZWdhY3koZSl7cmV0dXJuIGUmJiJvYmplY3QiPT10eXBlb2YgZSYmImRlZmF1bHQiaW4gZT9lOntkZWZhdWx0OmV9fXZhciByZXF1aXJlJCQwX19kZWZhdWx0PV9pbnRlcm9wRGVmYXVsdExlZ2FjeShyZXF1aXJlJCQwKSxyZXF1aXJlJCQxX19kZWZhdWx0PV9pbnRlcm9wRGVmYXVsdExlZ2FjeShyZXF1aXJlJCQxKSxwdW55Y29kZT1yZXF1aXJlJCQwX19kZWZhdWx0LmRlZmF1bHQ7ZnVuY3Rpb24gVXJsKCl7dGhpcy5wcm90b2NvbD1udWxsLHRoaXMuc2xhc2hlcz1udWxsLHRoaXMuYXV0aD1udWxsLHRoaXMuaG9zdD1udWxsLHRoaXMucG9ydD1udWxsLHRoaXMuaG9zdG5hbWU9bnVsbCx0aGlzLmhhc2g9bnVsbCx0aGlzLnNlYXJjaD1udWxsLHRoaXMucXVlcnk9bnVsbCx0aGlzLnBhdGhuYW1lPW51bGwsdGhpcy5wYXRoPW51bGwsdGhpcy5ocmVmPW51bGx9dmFyIHByb3RvY29sUGF0dGVybj0vXihbYS16MC05ListXSs6KS9pLHBvcnRQYXR0ZXJuPS86WzAtOV0qJC8sc2ltcGxlUGF0aFBhdHRlcm49L14oXC9cLz8oPyFcLylbXj9cc10qKShcP1teXHNdKik/JC8sdW53aXNlPVsieyIsIn0iLCJ8IiwiXFwiLCJeIiwiYCJdLmNvbmNhdChbIjwiLCI+IiwnIicsImAiLCIgIiwiXHIiLCJcbiIsIlx0Il0pLGF1dG9Fc2NhcGU9WyInIl0uY29uY2F0KHVud2lzZSksbm9uSG9zdENoYXJzPVsiJSIsIi8iLCI/IiwiOyIsIiMiXS5jb25jYXQoYXV0b0VzY2FwZSksaG9zdEVuZGluZ0NoYXJzPVsiLyIsIj8iLCIjIl0saG9zdG5hbWVQYXJ0UGF0dGVybj0vXlsrYS16MC05QS1aXy1dezAsNjN9JC8saG9zdG5hbWVQYXJ0U3RhcnQ9L14oWythLXowLTlBLVpfLV17MCw2M30pKC4qKSQvLHVuc2FmZVByb3RvY29sPXtqYXZhc2NyaXB0OiEwLCJqYXZhc2NyaXB0OiI6ITB9LGhvc3RsZXNzUHJvdG9jb2w9e2phdmFzY3JpcHQ6ITAsImphdmFzY3JpcHQ6IjohMH0sc2xhc2hlZFByb3RvY29sPXtodHRwOiEwLGh0dHBzOiEwLGZ0cDohMCxnb3BoZXI6ITAsZmlsZTohMCwiaHR0cDoiOiEwLCJodHRwczoiOiEwLCJmdHA6IjohMCwiZ29waGVyOiI6ITAsImZpbGU6IjohMH0scXVlcnlzdHJpbmc9cmVxdWlyZSQkMV9fZGVmYXVsdC5kZWZhdWx0O2Z1bmN0aW9uIHVybFBhcnNlKHVybCxwYXJzZVF1ZXJ5U3RyaW5nLHNsYXNoZXNEZW5vdGVIb3N0KXtpZih1cmwmJiJvYmplY3QiPT10eXBlb2YgdXJsJiZ1cmwgaW5zdGFuY2VvZiBVcmwpcmV0dXJuIHVybDt2YXIgdT1uZXcgVXJsO3JldHVybiB1LnBhcnNlKHVybCxwYXJzZVF1ZXJ5U3RyaW5nLHNsYXNoZXNEZW5vdGVIb3N0KSx1fVVybC5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24odXJsLHBhcnNlUXVlcnlTdHJpbmcsc2xhc2hlc0Rlbm90ZUhvc3Qpe2lmKCJzdHJpbmciIT10eXBlb2YgdXJsKXRocm93IG5ldyBUeXBlRXJyb3IoIlBhcmFtZXRlciAndXJsJyBtdXN0IGJlIGEgc3RyaW5nLCBub3QgIit0eXBlb2YgdXJsKTt2YXIgcXVlcnlJbmRleD11cmwuaW5kZXhPZigiPyIpLHNwbGl0dGVyPS0xIT09cXVlcnlJbmRleCYmcXVlcnlJbmRleDx1cmwuaW5kZXhPZigiIyIpPyI/IjoiIyIsdVNwbGl0PXVybC5zcGxpdChzcGxpdHRlcik7dVNwbGl0WzBdPXVTcGxpdFswXS5yZXBsYWNlKC9cXC9nLCIvIik7dmFyIHJlc3Q9dXJsPXVTcGxpdC5qb2luKHNwbGl0dGVyKTtpZihyZXN0PXJlc3QudHJpbSgpLCFzbGFzaGVzRGVub3RlSG9zdCYmMT09PXVybC5zcGxpdCgiIyIpLmxlbmd0aCl7dmFyIHNpbXBsZVBhdGg9c2ltcGxlUGF0aFBhdHRlcm4uZXhlYyhyZXN0KTtpZihzaW1wbGVQYXRoKXJldHVybiB0aGlzLnBhdGg9cmVzdCx0aGlzLmhyZWY9cmVzdCx0aGlzLnBhdGhuYW1lPXNpbXBsZVBhdGhbMV0sc2ltcGxlUGF0aFsyXT8odGhpcy5zZWFyY2g9c2ltcGxlUGF0aFsyXSx0aGlzLnF1ZXJ5PXBhcnNlUXVlcnlTdHJpbmc/cXVlcnlzdHJpbmcucGFyc2UodGhpcy5zZWFyY2guc3Vic3RyKDEpKTp0aGlzLnNlYXJjaC5zdWJzdHIoMSkpOnBhcnNlUXVlcnlTdHJpbmcmJih0aGlzLnNlYXJjaD0iIix0aGlzLnF1ZXJ5PXt9KSx0aGlzfXZhciBwcm90bz1wcm90b2NvbFBhdHRlcm4uZXhlYyhyZXN0KTtpZihwcm90byl7dmFyIGxvd2VyUHJvdG89KHByb3RvPXByb3RvWzBdKS50b0xvd2VyQ2FzZSgpO3RoaXMucHJvdG9jb2w9bG93ZXJQcm90byxyZXN0PXJlc3Quc3Vic3RyKHByb3RvLmxlbmd0aCl9aWYoc2xhc2hlc0Rlbm90ZUhvc3R8fHByb3RvfHxyZXN0Lm1hdGNoKC9eXC9cL1teQC9dK0BbXkAvXSsvKSl7dmFyIHNsYXNoZXM9Ii8vIj09PXJlc3Quc3Vic3RyKDAsMik7IXNsYXNoZXN8fHByb3RvJiZob3N0bGVzc1Byb3RvY29sW3Byb3RvXXx8KHJlc3Q9cmVzdC5zdWJzdHIoMiksdGhpcy5zbGFzaGVzPSEwKX1pZighaG9zdGxlc3NQcm90b2NvbFtwcm90b10mJihzbGFzaGVzfHxwcm90byYmIXNsYXNoZWRQcm90b2NvbFtwcm90b10pKXtmb3IodmFyIGF1dGgsYXRTaWduLGhvc3RFbmQ9LTEsaT0wO2k8aG9zdEVuZGluZ0NoYXJzLmxlbmd0aDtpKyspey0xIT09KGhlYz1yZXN0LmluZGV4T2YoaG9zdEVuZGluZ0NoYXJzW2ldKSkmJigtMT09PWhvc3RFbmR8fGhlYzxob3N0RW5kKSYmKGhvc3RFbmQ9aGVjKX0tMSE9PShhdFNpZ249LTE9PT1ob3N0RW5kP3Jlc3QubGFzdEluZGV4T2YoIkAiKTpyZXN0Lmxhc3RJbmRleE9mKCJAIixob3N0RW5kKSkmJihhdXRoPXJlc3Quc2xpY2UoMCxhdFNpZ24pLHJlc3Q9cmVzdC5zbGljZShhdFNpZ24rMSksdGhpcy5hdXRoPWRlY29kZVVSSUNvbXBvbmVudChhdXRoKSksaG9zdEVuZD0tMTtmb3IoaT0wO2k8bm9uSG9zdENoYXJzLmxlbmd0aDtpKyspe3ZhciBoZWM7LTEhPT0oaGVjPXJlc3QuaW5kZXhPZihub25Ib3N0Q2hhcnNbaV0pKSYmKC0xPT09aG9zdEVuZHx8aGVjPGhvc3RFbmQpJiYoaG9zdEVuZD1oZWMpfS0xPT09aG9zdEVuZCYmKGhvc3RFbmQ9cmVzdC5sZW5ndGgpLHRoaXMuaG9zdD1yZXN0LnNsaWNlKDAsaG9zdEVuZCkscmVzdD1yZXN0LnNsaWNlKGhvc3RFbmQpLHRoaXMucGFyc2VIb3N0KCksdGhpcy5ob3N0bmFtZT10aGlzLmhvc3RuYW1lfHwiIjt2YXIgaXB2Nkhvc3RuYW1lPSJbIj09PXRoaXMuaG9zdG5hbWVbMF0mJiJdIj09PXRoaXMuaG9zdG5hbWVbdGhpcy5ob3N0bmFtZS5sZW5ndGgtMV07aWYoIWlwdjZIb3N0bmFtZSlmb3IodmFyIGhvc3RwYXJ0cz10aGlzLmhvc3RuYW1lLnNwbGl0KC9cLi8pLGw9KGk9MCxob3N0cGFydHMubGVuZ3RoKTtpPGw7aSsrKXt2YXIgcGFydD1ob3N0cGFydHNbaV07aWYocGFydCYmIXBhcnQubWF0Y2goaG9zdG5hbWVQYXJ0UGF0dGVybikpe2Zvcih2YXIgbmV3cGFydD0iIixqPTAsaz1wYXJ0Lmxlbmd0aDtqPGs7aisrKXBhcnQuY2hhckNvZGVBdChqKT4xMjc/bmV3cGFydCs9IngiOm5ld3BhcnQrPXBhcnRbal07aWYoIW5ld3BhcnQubWF0Y2goaG9zdG5hbWVQYXJ0UGF0dGVybikpe3ZhciB2YWxpZFBhcnRzPWhvc3RwYXJ0cy5zbGljZSgwLGkpLG5vdEhvc3Q9aG9zdHBhcnRzLnNsaWNlKGkrMSksYml0PXBhcnQubWF0Y2goaG9zdG5hbWVQYXJ0U3RhcnQpO2JpdCYmKHZhbGlkUGFydHMucHVzaChiaXRbMV0pLG5vdEhvc3QudW5zaGlmdChiaXRbMl0pKSxub3RIb3N0Lmxlbmd0aCYmKHJlc3Q9Ii8iK25vdEhvc3Quam9pbigiLiIpK3Jlc3QpLHRoaXMuaG9zdG5hbWU9dmFsaWRQYXJ0cy5qb2luKCIuIik7YnJlYWt9fX10aGlzLmhvc3RuYW1lLmxlbmd0aD4yNTU/dGhpcy5ob3N0bmFtZT0iIjp0aGlzLmhvc3RuYW1lPXRoaXMuaG9zdG5hbWUudG9Mb3dlckNhc2UoKSxpcHY2SG9zdG5hbWV8fCh0aGlzLmhvc3RuYW1lPXB1bnljb2RlLnRvQVNDSUkodGhpcy5ob3N0bmFtZSkpO3ZhciBwPXRoaXMucG9ydD8iOiIrdGhpcy5wb3J0OiIiLGg9dGhpcy5ob3N0bmFtZXx8IiI7dGhpcy5ob3N0PWgrcCx0aGlzLmhyZWYrPXRoaXMuaG9zdCxpcHY2SG9zdG5hbWUmJih0aGlzLmhvc3RuYW1lPXRoaXMuaG9zdG5hbWUuc3Vic3RyKDEsdGhpcy5ob3N0bmFtZS5sZW5ndGgtMiksIi8iIT09cmVzdFswXSYmKHJlc3Q9Ii8iK3Jlc3QpKX1pZighdW5zYWZlUHJvdG9jb2xbbG93ZXJQcm90b10pZm9yKGk9MCxsPWF1dG9Fc2NhcGUubGVuZ3RoO2k8bDtpKyspe3ZhciBhZT1hdXRvRXNjYXBlW2ldO2lmKC0xIT09cmVzdC5pbmRleE9mKGFlKSl7dmFyIGVzYz1lbmNvZGVVUklDb21wb25lbnQoYWUpO2VzYz09PWFlJiYoZXNjPWVzY2FwZShhZSkpLHJlc3Q9cmVzdC5zcGxpdChhZSkuam9pbihlc2MpfX12YXIgaGFzaD1yZXN0LmluZGV4T2YoIiMiKTstMSE9PWhhc2gmJih0aGlzLmhhc2g9cmVzdC5zdWJzdHIoaGFzaCkscmVzdD1yZXN0LnNsaWNlKDAsaGFzaCkpO3ZhciBxbT1yZXN0LmluZGV4T2YoIj8iKTtpZigtMSE9PXFtPyh0aGlzLnNlYXJjaD1yZXN0LnN1YnN0cihxbSksdGhpcy5xdWVyeT1yZXN0LnN1YnN0cihxbSsxKSxwYXJzZVF1ZXJ5U3RyaW5nJiYodGhpcy5xdWVyeT1xdWVyeXN0cmluZy5wYXJzZSh0aGlzLnF1ZXJ5KSkscmVzdD1yZXN0LnNsaWNlKDAscW0pKTpwYXJzZVF1ZXJ5U3RyaW5nJiYodGhpcy5zZWFyY2g9IiIsdGhpcy5xdWVyeT17fSkscmVzdCYmKHRoaXMucGF0aG5hbWU9cmVzdCksc2xhc2hlZFByb3RvY29sW2xvd2VyUHJvdG9dJiZ0aGlzLmhvc3RuYW1lJiYhdGhpcy5wYXRobmFtZSYmKHRoaXMucGF0aG5hbWU9Ii8iKSx0aGlzLnBhdGhuYW1lfHx0aGlzLnNlYXJjaCl7cD10aGlzLnBhdGhuYW1lfHwiIjt2YXIgcz10aGlzLnNlYXJjaHx8IiI7dGhpcy5wYXRoPXArc31yZXR1cm4gdGhpcy5ocmVmPXRoaXMuZm9ybWF0KCksdGhpc30sVXJsLnByb3RvdHlwZS5mb3JtYXQ9ZnVuY3Rpb24oKXt2YXIgYXV0aD10aGlzLmF1dGh8fCIiO2F1dGgmJihhdXRoPShhdXRoPWVuY29kZVVSSUNvbXBvbmVudChhdXRoKSkucmVwbGFjZSgvJTNBL2ksIjoiKSxhdXRoKz0iQCIpO3ZhciBwcm90b2NvbD10aGlzLnByb3RvY29sfHwiIixwYXRobmFtZT10aGlzLnBhdGhuYW1lfHwiIixoYXNoPXRoaXMuaGFzaHx8IiIsaG9zdD0hMSxxdWVyeT0iIjt0aGlzLmhvc3Q/aG9zdD1hdXRoK3RoaXMuaG9zdDp0aGlzLmhvc3RuYW1lJiYoaG9zdD1hdXRoKygtMT09PXRoaXMuaG9zdG5hbWUuaW5kZXhPZigiOiIpP3RoaXMuaG9zdG5hbWU6IlsiK3RoaXMuaG9zdG5hbWUrIl0iKSx0aGlzLnBvcnQmJihob3N0Kz0iOiIrdGhpcy5wb3J0KSksdGhpcy5xdWVyeSYmIm9iamVjdCI9PXR5cGVvZiB0aGlzLnF1ZXJ5JiZPYmplY3Qua2V5cyh0aGlzLnF1ZXJ5KS5sZW5ndGgmJihxdWVyeT1xdWVyeXN0cmluZy5zdHJpbmdpZnkodGhpcy5xdWVyeSx7YXJyYXlGb3JtYXQ6InJlcGVhdCIsYWRkUXVlcnlQcmVmaXg6ITF9KSk7dmFyIHNlYXJjaD10aGlzLnNlYXJjaHx8cXVlcnkmJiI/IitxdWVyeXx8IiI7cmV0dXJuIHByb3RvY29sJiYiOiIhPT1wcm90b2NvbC5zdWJzdHIoLTEpJiYocHJvdG9jb2wrPSI6IiksdGhpcy5zbGFzaGVzfHwoIXByb3RvY29sfHxzbGFzaGVkUHJvdG9jb2xbcHJvdG9jb2xdKSYmITEhPT1ob3N0Pyhob3N0PSIvLyIrKGhvc3R8fCIiKSxwYXRobmFtZSYmIi8iIT09cGF0aG5hbWUuY2hhckF0KDApJiYocGF0aG5hbWU9Ii8iK3BhdGhuYW1lKSk6aG9zdHx8KGhvc3Q9IiIpLGhhc2gmJiIjIiE9PWhhc2guY2hhckF0KDApJiYoaGFzaD0iIyIraGFzaCksc2VhcmNoJiYiPyIhPT1zZWFyY2guY2hhckF0KDApJiYoc2VhcmNoPSI/IitzZWFyY2gpLHByb3RvY29sK2hvc3QrKHBhdGhuYW1lPXBhdGhuYW1lLnJlcGxhY2UoL1s/I10vZyxmdW5jdGlvbihtYXRjaCl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChtYXRjaCl9KSkrKHNlYXJjaD1zZWFyY2gucmVwbGFjZSgiIyIsIiUyMyIpKStoYXNofSxVcmwucHJvdG90eXBlLnJlc29sdmU9ZnVuY3Rpb24ocmVsYXRpdmUpe3JldHVybiB0aGlzLnJlc29sdmVPYmplY3QodXJsUGFyc2UocmVsYXRpdmUsITEsITApKS5mb3JtYXQoKX0sVXJsLnByb3RvdHlwZS5yZXNvbHZlT2JqZWN0PWZ1bmN0aW9uKHJlbGF0aXZlKXtpZigic3RyaW5nIj09dHlwZW9mIHJlbGF0aXZlKXt2YXIgcmVsPW5ldyBVcmw7cmVsLnBhcnNlKHJlbGF0aXZlLCExLCEwKSxyZWxhdGl2ZT1yZWx9Zm9yKHZhciByZXN1bHQ9bmV3IFVybCx0a2V5cz1PYmplY3Qua2V5cyh0aGlzKSx0az0wO3RrPHRrZXlzLmxlbmd0aDt0aysrKXt2YXIgdGtleT10a2V5c1t0a107cmVzdWx0W3RrZXldPXRoaXNbdGtleV19aWYocmVzdWx0Lmhhc2g9cmVsYXRpdmUuaGFzaCwiIj09PXJlbGF0aXZlLmhyZWYpcmV0dXJuIHJlc3VsdC5ocmVmPXJlc3VsdC5mb3JtYXQoKSxyZXN1bHQ7aWYocmVsYXRpdmUuc2xhc2hlcyYmIXJlbGF0aXZlLnByb3RvY29sKXtmb3IodmFyIHJrZXlzPU9iamVjdC5rZXlzKHJlbGF0aXZlKSxyaz0wO3JrPHJrZXlzLmxlbmd0aDtyaysrKXt2YXIgcmtleT1ya2V5c1tya107InByb3RvY29sIiE9PXJrZXkmJihyZXN1bHRbcmtleV09cmVsYXRpdmVbcmtleV0pfXJldHVybiBzbGFzaGVkUHJvdG9jb2xbcmVzdWx0LnByb3RvY29sXSYmcmVzdWx0Lmhvc3RuYW1lJiYhcmVzdWx0LnBhdGhuYW1lJiYocmVzdWx0LnBhdGhuYW1lPSIvIixyZXN1bHQucGF0aD1yZXN1bHQucGF0aG5hbWUpLHJlc3VsdC5ocmVmPXJlc3VsdC5mb3JtYXQoKSxyZXN1bHR9aWYocmVsYXRpdmUucHJvdG9jb2wmJnJlbGF0aXZlLnByb3RvY29sIT09cmVzdWx0LnByb3RvY29sKXtpZighc2xhc2hlZFByb3RvY29sW3JlbGF0aXZlLnByb3RvY29sXSl7Zm9yKHZhciBrZXlzPU9iamVjdC5rZXlzKHJlbGF0aXZlKSx2PTA7djxrZXlzLmxlbmd0aDt2Kyspe3ZhciBrPWtleXNbdl07cmVzdWx0W2tdPXJlbGF0aXZlW2tdfXJldHVybiByZXN1bHQuaHJlZj1yZXN1bHQuZm9ybWF0KCkscmVzdWx0fWlmKHJlc3VsdC5wcm90b2NvbD1yZWxhdGl2ZS5wcm90b2NvbCxyZWxhdGl2ZS5ob3N0fHxob3N0bGVzc1Byb3RvY29sW3JlbGF0aXZlLnByb3RvY29sXSlyZXN1bHQucGF0aG5hbWU9cmVsYXRpdmUucGF0aG5hbWU7ZWxzZXtmb3IodmFyIHJlbFBhdGg9KHJlbGF0aXZlLnBhdGhuYW1lfHwiIikuc3BsaXQoIi8iKTtyZWxQYXRoLmxlbmd0aCYmIShyZWxhdGl2ZS5ob3N0PXJlbFBhdGguc2hpZnQoKSk7KTtyZWxhdGl2ZS5ob3N0fHwocmVsYXRpdmUuaG9zdD0iIikscmVsYXRpdmUuaG9zdG5hbWV8fChyZWxhdGl2ZS5ob3N0bmFtZT0iIiksIiIhPT1yZWxQYXRoWzBdJiZyZWxQYXRoLnVuc2hpZnQoIiIpLHJlbFBhdGgubGVuZ3RoPDImJnJlbFBhdGgudW5zaGlmdCgiIikscmVzdWx0LnBhdGhuYW1lPXJlbFBhdGguam9pbigiLyIpfWlmKHJlc3VsdC5zZWFyY2g9cmVsYXRpdmUuc2VhcmNoLHJlc3VsdC5xdWVyeT1yZWxhdGl2ZS5xdWVyeSxyZXN1bHQuaG9zdD1yZWxhdGl2ZS5ob3N0fHwiIixyZXN1bHQuYXV0aD1yZWxhdGl2ZS5hdXRoLHJlc3VsdC5ob3N0bmFtZT1yZWxhdGl2ZS5ob3N0bmFtZXx8cmVsYXRpdmUuaG9zdCxyZXN1bHQucG9ydD1yZWxhdGl2ZS5wb3J0LHJlc3VsdC5wYXRobmFtZXx8cmVzdWx0LnNlYXJjaCl7dmFyIHA9cmVzdWx0LnBhdGhuYW1lfHwiIixzPXJlc3VsdC5zZWFyY2h8fCIiO3Jlc3VsdC5wYXRoPXArc31yZXR1cm4gcmVzdWx0LnNsYXNoZXM9cmVzdWx0LnNsYXNoZXN8fHJlbGF0aXZlLnNsYXNoZXMscmVzdWx0LmhyZWY9cmVzdWx0LmZvcm1hdCgpLHJlc3VsdH12YXIgaXNTb3VyY2VBYnM9cmVzdWx0LnBhdGhuYW1lJiYiLyI9PT1yZXN1bHQucGF0aG5hbWUuY2hhckF0KDApLGlzUmVsQWJzPXJlbGF0aXZlLmhvc3R8fHJlbGF0aXZlLnBhdGhuYW1lJiYiLyI9PT1yZWxhdGl2ZS5wYXRobmFtZS5jaGFyQXQoMCksbXVzdEVuZEFicz1pc1JlbEFic3x8aXNTb3VyY2VBYnN8fHJlc3VsdC5ob3N0JiZyZWxhdGl2ZS5wYXRobmFtZSxyZW1vdmVBbGxEb3RzPW11c3RFbmRBYnMsc3JjUGF0aD1yZXN1bHQucGF0aG5hbWUmJnJlc3VsdC5wYXRobmFtZS5zcGxpdCgiLyIpfHxbXSxwc3ljaG90aWM9KHJlbFBhdGg9cmVsYXRpdmUucGF0aG5hbWUmJnJlbGF0aXZlLnBhdGhuYW1lLnNwbGl0KCIvIil8fFtdLHJlc3VsdC5wcm90b2NvbCYmIXNsYXNoZWRQcm90b2NvbFtyZXN1bHQucHJvdG9jb2xdKTtpZihwc3ljaG90aWMmJihyZXN1bHQuaG9zdG5hbWU9IiIscmVzdWx0LnBvcnQ9bnVsbCxyZXN1bHQuaG9zdCYmKCIiPT09c3JjUGF0aFswXT9zcmNQYXRoWzBdPXJlc3VsdC5ob3N0OnNyY1BhdGgudW5zaGlmdChyZXN1bHQuaG9zdCkpLHJlc3VsdC5ob3N0PSIiLHJlbGF0aXZlLnByb3RvY29sJiYocmVsYXRpdmUuaG9zdG5hbWU9bnVsbCxyZWxhdGl2ZS5wb3J0PW51bGwscmVsYXRpdmUuaG9zdCYmKCIiPT09cmVsUGF0aFswXT9yZWxQYXRoWzBdPXJlbGF0aXZlLmhvc3Q6cmVsUGF0aC51bnNoaWZ0KHJlbGF0aXZlLmhvc3QpKSxyZWxhdGl2ZS5ob3N0PW51bGwpLG11c3RFbmRBYnM9bXVzdEVuZEFicyYmKCIiPT09cmVsUGF0aFswXXx8IiI9PT1zcmNQYXRoWzBdKSksaXNSZWxBYnMpcmVzdWx0Lmhvc3Q9cmVsYXRpdmUuaG9zdHx8IiI9PT1yZWxhdGl2ZS5ob3N0P3JlbGF0aXZlLmhvc3Q6cmVzdWx0Lmhvc3QscmVzdWx0Lmhvc3RuYW1lPXJlbGF0aXZlLmhvc3RuYW1lfHwiIj09PXJlbGF0aXZlLmhvc3RuYW1lP3JlbGF0aXZlLmhvc3RuYW1lOnJlc3VsdC5ob3N0bmFtZSxyZXN1bHQuc2VhcmNoPXJlbGF0aXZlLnNlYXJjaCxyZXN1bHQucXVlcnk9cmVsYXRpdmUucXVlcnksc3JjUGF0aD1yZWxQYXRoO2Vsc2UgaWYocmVsUGF0aC5sZW5ndGgpc3JjUGF0aHx8KHNyY1BhdGg9W10pLHNyY1BhdGgucG9wKCksc3JjUGF0aD1zcmNQYXRoLmNvbmNhdChyZWxQYXRoKSxyZXN1bHQuc2VhcmNoPXJlbGF0aXZlLnNlYXJjaCxyZXN1bHQucXVlcnk9cmVsYXRpdmUucXVlcnk7ZWxzZSBpZihudWxsIT1yZWxhdGl2ZS5zZWFyY2gpe2lmKHBzeWNob3RpYylyZXN1bHQuaG9zdD1zcmNQYXRoLnNoaWZ0KCkscmVzdWx0Lmhvc3RuYW1lPXJlc3VsdC5ob3N0LChhdXRoSW5Ib3N0PSEhKHJlc3VsdC5ob3N0JiZyZXN1bHQuaG9zdC5pbmRleE9mKCJAIik+MCkmJnJlc3VsdC5ob3N0LnNwbGl0KCJAIikpJiYocmVzdWx0LmF1dGg9YXV0aEluSG9zdC5zaGlmdCgpLHJlc3VsdC5ob3N0bmFtZT1hdXRoSW5Ib3N0LnNoaWZ0KCkscmVzdWx0Lmhvc3Q9cmVzdWx0Lmhvc3RuYW1lKTtyZXR1cm4gcmVzdWx0LnNlYXJjaD1yZWxhdGl2ZS5zZWFyY2gscmVzdWx0LnF1ZXJ5PXJlbGF0aXZlLnF1ZXJ5LG51bGw9PT1yZXN1bHQucGF0aG5hbWUmJm51bGw9PT1yZXN1bHQuc2VhcmNofHwocmVzdWx0LnBhdGg9KHJlc3VsdC5wYXRobmFtZT9yZXN1bHQucGF0aG5hbWU6IiIpKyhyZXN1bHQuc2VhcmNoP3Jlc3VsdC5zZWFyY2g6IiIpKSxyZXN1bHQuaHJlZj1yZXN1bHQuZm9ybWF0KCkscmVzdWx0fWlmKCFzcmNQYXRoLmxlbmd0aClyZXR1cm4gcmVzdWx0LnBhdGhuYW1lPW51bGwscmVzdWx0LnNlYXJjaD9yZXN1bHQucGF0aD0iLyIrcmVzdWx0LnNlYXJjaDpyZXN1bHQucGF0aD1udWxsLHJlc3VsdC5ocmVmPXJlc3VsdC5mb3JtYXQoKSxyZXN1bHQ7Zm9yKHZhciBsYXN0PXNyY1BhdGguc2xpY2UoLTEpWzBdLGhhc1RyYWlsaW5nU2xhc2g9KHJlc3VsdC5ob3N0fHxyZWxhdGl2ZS5ob3N0fHxzcmNQYXRoLmxlbmd0aD4xKSYmKCIuIj09PWxhc3R8fCIuLiI9PT1sYXN0KXx8IiI9PT1sYXN0LHVwPTAsaT1zcmNQYXRoLmxlbmd0aDtpPj0wO2ktLSkiLiI9PT0obGFzdD1zcmNQYXRoW2ldKT9zcmNQYXRoLnNwbGljZShpLDEpOiIuLiI9PT1sYXN0PyhzcmNQYXRoLnNwbGljZShpLDEpLHVwKyspOnVwJiYoc3JjUGF0aC5zcGxpY2UoaSwxKSx1cC0tKTtpZighbXVzdEVuZEFicyYmIXJlbW92ZUFsbERvdHMpZm9yKDt1cC0tO3VwKXNyY1BhdGgudW5zaGlmdCgiLi4iKTshbXVzdEVuZEFic3x8IiI9PT1zcmNQYXRoWzBdfHxzcmNQYXRoWzBdJiYiLyI9PT1zcmNQYXRoWzBdLmNoYXJBdCgwKXx8c3JjUGF0aC51bnNoaWZ0KCIiKSxoYXNUcmFpbGluZ1NsYXNoJiYiLyIhPT1zcmNQYXRoLmpvaW4oIi8iKS5zdWJzdHIoLTEpJiZzcmNQYXRoLnB1c2goIiIpO3ZhciBhdXRoSW5Ib3N0LGlzQWJzb2x1dGU9IiI9PT1zcmNQYXRoWzBdfHxzcmNQYXRoWzBdJiYiLyI9PT1zcmNQYXRoWzBdLmNoYXJBdCgwKTtwc3ljaG90aWMmJihyZXN1bHQuaG9zdG5hbWU9aXNBYnNvbHV0ZT8iIjpzcmNQYXRoLmxlbmd0aD9zcmNQYXRoLnNoaWZ0KCk6IiIscmVzdWx0Lmhvc3Q9cmVzdWx0Lmhvc3RuYW1lLChhdXRoSW5Ib3N0PSEhKHJlc3VsdC5ob3N0JiZyZXN1bHQuaG9zdC5pbmRleE9mKCJAIik+MCkmJnJlc3VsdC5ob3N0LnNwbGl0KCJAIikpJiYocmVzdWx0LmF1dGg9YXV0aEluSG9zdC5zaGlmdCgpLHJlc3VsdC5ob3N0bmFtZT1hdXRoSW5Ib3N0LnNoaWZ0KCkscmVzdWx0Lmhvc3Q9cmVzdWx0Lmhvc3RuYW1lKSk7cmV0dXJuKG11c3RFbmRBYnM9bXVzdEVuZEFic3x8cmVzdWx0Lmhvc3QmJnNyY1BhdGgubGVuZ3RoKSYmIWlzQWJzb2x1dGUmJnNyY1BhdGgudW5zaGlmdCgiIiksc3JjUGF0aC5sZW5ndGg+MD9yZXN1bHQucGF0aG5hbWU9c3JjUGF0aC5qb2luKCIvIik6KHJlc3VsdC5wYXRobmFtZT1udWxsLHJlc3VsdC5wYXRoPW51bGwpLG51bGw9PT1yZXN1bHQucGF0aG5hbWUmJm51bGw9PT1yZXN1bHQuc2VhcmNofHwocmVzdWx0LnBhdGg9KHJlc3VsdC5wYXRobmFtZT9yZXN1bHQucGF0aG5hbWU6IiIpKyhyZXN1bHQuc2VhcmNoP3Jlc3VsdC5zZWFyY2g6IiIpKSxyZXN1bHQuYXV0aD1yZWxhdGl2ZS5hdXRofHxyZXN1bHQuYXV0aCxyZXN1bHQuc2xhc2hlcz1yZXN1bHQuc2xhc2hlc3x8cmVsYXRpdmUuc2xhc2hlcyxyZXN1bHQuaHJlZj1yZXN1bHQuZm9ybWF0KCkscmVzdWx0fSxVcmwucHJvdG90eXBlLnBhcnNlSG9zdD1mdW5jdGlvbigpe3ZhciBob3N0PXRoaXMuaG9zdCxwb3J0PXBvcnRQYXR0ZXJuLmV4ZWMoaG9zdCk7cG9ydCYmKCI6IiE9PShwb3J0PXBvcnRbMF0pJiYodGhpcy5wb3J0PXBvcnQuc3Vic3RyKDEpKSxob3N0PWhvc3Quc3Vic3RyKDAsaG9zdC5sZW5ndGgtcG9ydC5sZW5ndGgpKSxob3N0JiYodGhpcy5ob3N0bmFtZT1ob3N0KX07dmFyIHBhcnNlPXVybFBhcnNlLHJlc29sdmUkMT1mdW5jdGlvbiB1cmxSZXNvbHZlKHNvdXJjZSxyZWxhdGl2ZSl7cmV0dXJuIHVybFBhcnNlKHNvdXJjZSwhMSwhMCkucmVzb2x2ZShyZWxhdGl2ZSl9LHJlc29sdmVPYmplY3Q9ZnVuY3Rpb24gdXJsUmVzb2x2ZU9iamVjdChzb3VyY2UscmVsYXRpdmUpe3JldHVybiBzb3VyY2U/dXJsUGFyc2Uoc291cmNlLCExLCEwKS5yZXNvbHZlT2JqZWN0KHJlbGF0aXZlKTpyZWxhdGl2ZX0sZm9ybWF0PWZ1bmN0aW9uIHVybEZvcm1hdChvYmope3JldHVybiJzdHJpbmciPT10eXBlb2Ygb2JqJiYob2JqPXVybFBhcnNlKG9iaikpLG9iaiBpbnN0YW5jZW9mIFVybD9vYmouZm9ybWF0KCk6VXJsLnByb3RvdHlwZS5mb3JtYXQuY2FsbChvYmopfSxVcmxfMT1Vcmw7dmFyIF9nbG9iYWxUaGlzPWZ1bmN0aW9uKE9iamVjdCl7ZnVuY3Rpb24gZ2V0KCl7dmFyIF9nbG9iYWw9dGhpc3x8c2VsZjtyZXR1cm4gZGVsZXRlIE9iamVjdC5wcm90b3R5cGUuX19tYWdpY19fLF9nbG9iYWx9cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6dGhpcz9nZXQoKTooT2JqZWN0LmRlZmluZVByb3BlcnR5KE9iamVjdC5wcm90b3R5cGUsIl9fbWFnaWNfXyIse2NvbmZpZ3VyYWJsZTohMCxnZXR9KSxfX21hZ2ljX18pfShPYmplY3QpLGZvcm1hdEltcG9ydD1mb3JtYXQscGFyc2VJbXBvcnQ9cGFyc2UscmVzb2x2ZUltcG9ydD1yZXNvbHZlJDEsVXJsSW1wb3J0PVVybF8xLFVSTD1fZ2xvYmFsVGhpcy5VUkwsVVJMU2VhcmNoUGFyYW1zPV9nbG9iYWxUaGlzLlVSTFNlYXJjaFBhcmFtcyxwZXJjZW50UmVnRXg9LyUvZyxiYWNrc2xhc2hSZWdFeD0vXFwvZyxuZXdsaW5lUmVnRXg9L1xuL2csY2FycmlhZ2VSZXR1cm5SZWdFeD0vXHIvZyx0YWJSZWdFeD0vXHQvZzt2YXIgZG9tYWluVG9BU0NJST1mdW5jdGlvbiBkb21haW5Ub0FTQ0lJKGRvbWFpbil7aWYodm9pZCAwPT09ZG9tYWluKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSAiZG9tYWluIiBhcmd1bWVudCBtdXN0IGJlIHNwZWNpZmllZCcpO3JldHVybiBuZXcgVVJMKCJodHRwOi8vIitkb21haW4pLmhvc3RuYW1lfSxkb21haW5Ub1VuaWNvZGU9ZnVuY3Rpb24gZG9tYWluVG9Vbmljb2RlKGRvbWFpbil7aWYodm9pZCAwPT09ZG9tYWluKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSAiZG9tYWluIiBhcmd1bWVudCBtdXN0IGJlIHNwZWNpZmllZCcpO3JldHVybiBuZXcgVVJMKCJodHRwOi8vIitkb21haW4pLmhvc3RuYW1lfSxwYXRoVG9GaWxlVVJMPWZ1bmN0aW9uIHBhdGhUb0ZpbGVVUkwoZmlsZXBhdGgpe3ZhciBvdXRVUkw9bmV3IFVSTCgiZmlsZTovLyIpLHJlc29sdmVkPWZ1bmN0aW9uIHJlc29sdmUoKXtmb3IodmFyIHJlc29sdmVkUGF0aD0iIixyZXNvbHZlZEFic29sdXRlPSExLGk9YXJndW1lbnRzLmxlbmd0aC0xO2k+PS0xJiYhcmVzb2x2ZWRBYnNvbHV0ZTtpLS0pe3ZhciBwYXRoPWk+PTA/YXJndW1lbnRzW2ldOiIvIjtpZigic3RyaW5nIiE9dHlwZW9mIHBhdGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIHRvIHBhdGgucmVzb2x2ZSBtdXN0IGJlIHN0cmluZ3MiKTtwYXRoJiYocmVzb2x2ZWRQYXRoPXBhdGgrIi8iK3Jlc29sdmVkUGF0aCxyZXNvbHZlZEFic29sdXRlPSIvIj09PXBhdGguY2hhckF0KDApKX1yZXR1cm4gcmVzb2x2ZWRQYXRoPWZ1bmN0aW9uIG5vcm1hbGl6ZUFycmF5KHBhcnRzLGFsbG93QWJvdmVSb290KXtmb3IodmFyIHVwPTAsaT1wYXJ0cy5sZW5ndGgtMTtpPj0wO2ktLSl7dmFyIGxhc3Q9cGFydHNbaV07Ii4iPT09bGFzdD9wYXJ0cy5zcGxpY2UoaSwxKToiLi4iPT09bGFzdD8ocGFydHMuc3BsaWNlKGksMSksdXArKyk6dXAmJihwYXJ0cy5zcGxpY2UoaSwxKSx1cC0tKX1pZihhbGxvd0Fib3ZlUm9vdClmb3IoO3VwLS07dXApcGFydHMudW5zaGlmdCgiLi4iKTtyZXR1cm4gcGFydHN9KGZ1bmN0aW9uIGZpbHRlcih4cyxmKXtpZih4cy5maWx0ZXIpcmV0dXJuIHhzLmZpbHRlcihmKTtmb3IodmFyIHJlcz1bXSxpPTA7aTx4cy5sZW5ndGg7aSsrKWYoeHNbaV0saSx4cykmJnJlcy5wdXNoKHhzW2ldKTtyZXR1cm4gcmVzfShyZXNvbHZlZFBhdGguc3BsaXQoIi8iKSxmdW5jdGlvbihwKXtyZXR1cm4hIXB9KSwhcmVzb2x2ZWRBYnNvbHV0ZSkuam9pbigiLyIpLChyZXNvbHZlZEFic29sdXRlPyIvIjoiIikrcmVzb2x2ZWRQYXRofHwiLiJ9KGZpbGVwYXRoKTtyZXR1cm4gNDc9PT1maWxlcGF0aC5jaGFyQ29kZUF0KGZpbGVwYXRoLmxlbmd0aC0xKSYmIi8iIT09cmVzb2x2ZWRbcmVzb2x2ZWQubGVuZ3RoLTFdJiYocmVzb2x2ZWQrPSIvIiksb3V0VVJMLnBhdGhuYW1lPWZ1bmN0aW9uIGVuY29kZVBhdGhDaGFycyhmaWxlcGF0aCl7cmV0dXJuIGZpbGVwYXRoLmluY2x1ZGVzKCIlIikmJihmaWxlcGF0aD1maWxlcGF0aC5yZXBsYWNlKHBlcmNlbnRSZWdFeCwiJTI1IikpLGZpbGVwYXRoLmluY2x1ZGVzKCJcXCIpJiYoZmlsZXBhdGg9ZmlsZXBhdGgucmVwbGFjZShiYWNrc2xhc2hSZWdFeCwiJTVDIikpLGZpbGVwYXRoLmluY2x1ZGVzKCJcbiIpJiYoZmlsZXBhdGg9ZmlsZXBhdGgucmVwbGFjZShuZXdsaW5lUmVnRXgsIiUwQSIpKSxmaWxlcGF0aC5pbmNsdWRlcygiXHIiKSYmKGZpbGVwYXRoPWZpbGVwYXRoLnJlcGxhY2UoY2FycmlhZ2VSZXR1cm5SZWdFeCwiJTBEIikpLGZpbGVwYXRoLmluY2x1ZGVzKCJcdCIpJiYoZmlsZXBhdGg9ZmlsZXBhdGgucmVwbGFjZSh0YWJSZWdFeCwiJTA5IikpLGZpbGVwYXRofShyZXNvbHZlZCksb3V0VVJMfSxmaWxlVVJMVG9QYXRoPWZ1bmN0aW9uIGZpbGVVUkxUb1BhdGgocGF0aCl7aWYoIWZ1bmN0aW9uIGlzVVJMSW5zdGFuY2UoaW5zdGFuY2Upe3ZhciByZXNvbHZlZD1udWxsIT1pbnN0YW5jZT9pbnN0YW5jZTpudWxsO3JldHVybiBCb29sZWFuKG51bGwhPT1yZXNvbHZlZCYmKG51bGw9PXJlc29sdmVkP3ZvaWQgMDpyZXNvbHZlZC5ocmVmKSYmKG51bGw9PXJlc29sdmVkP3ZvaWQgMDpyZXNvbHZlZC5vcmlnaW4pKX0ocGF0aCkmJiJzdHJpbmciIT10eXBlb2YgcGF0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgInBhdGgiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcgb3IgYW4gaW5zdGFuY2Ugb2YgVVJMLiBSZWNlaXZlZCB0eXBlICcrdHlwZW9mIHBhdGgrIiAoIitwYXRoKyIpIik7dmFyIHJlc29sdmVkPW5ldyBVUkwocGF0aCk7aWYoImZpbGU6IiE9PXJlc29sdmVkLnByb3RvY29sKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBVUkwgbXVzdCBiZSBvZiBzY2hlbWUgZmlsZSIpO3JldHVybiBmdW5jdGlvbiBnZXRQYXRoRnJvbVVSTFBvc2l4KHVybCl7aWYoIiIhPT11cmwuaG9zdG5hbWUpdGhyb3cgbmV3IFR5cGVFcnJvcignRmlsZSBVUkwgaG9zdCBtdXN0IGJlICJsb2NhbGhvc3QiIG9yIGVtcHR5IG9uIGJyb3dzZXInKTtmb3IodmFyIHBhdGhuYW1lPXVybC5wYXRobmFtZSxuPTA7bjxwYXRobmFtZS5sZW5ndGg7bisrKWlmKCIlIj09PXBhdGhuYW1lW25dKXt2YXIgdGhpcmQ9MzJ8cGF0aG5hbWUuY29kZVBvaW50QXQobisyKTtpZigiMiI9PT1wYXRobmFtZVtuKzFdJiYxMDI9PT10aGlyZCl0aHJvdyBuZXcgVHlwZUVycm9yKCJGaWxlIFVSTCBwYXRoIG11c3Qgbm90IGluY2x1ZGUgZW5jb2RlZCAvIGNoYXJhY3RlcnMiKX1yZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHBhdGhuYW1lKX0ocmVzb2x2ZWQpfSxmb3JtYXRJbXBvcnRXaXRoT3ZlcmxvYWRzPWZ1bmN0aW9uIGZvcm1hdEltcG9ydFdpdGhPdmVybG9hZHModXJsT2JqZWN0LG9wdGlvbnMpe3ZhciBfb3B0aW9ucyRhdXRoLF9vcHRpb25zJGZyYWdtZW50LF9vcHRpb25zJHNlYXJjaDtpZih2b2lkIDA9PT1vcHRpb25zJiYob3B0aW9ucz17fSksISh1cmxPYmplY3QgaW5zdGFuY2VvZiBVUkwpKXJldHVybiBmb3JtYXRJbXBvcnQodXJsT2JqZWN0KTtpZigib2JqZWN0IiE9dHlwZW9mIG9wdGlvbnN8fG51bGw9PT1vcHRpb25zKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSAib3B0aW9ucyIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIG9iamVjdC4nKTt2YXIgYXV0aD1udWxsPT0oX29wdGlvbnMkYXV0aD1vcHRpb25zLmF1dGgpfHxfb3B0aW9ucyRhdXRoLGZyYWdtZW50PW51bGw9PShfb3B0aW9ucyRmcmFnbWVudD1vcHRpb25zLmZyYWdtZW50KXx8X29wdGlvbnMkZnJhZ21lbnQsc2VhcmNoPW51bGw9PShfb3B0aW9ucyRzZWFyY2g9b3B0aW9ucy5zZWFyY2gpfHxfb3B0aW9ucyRzZWFyY2g7b3B0aW9ucy51bmljb2RlO3ZhciBwYXJzZWQ9bmV3IFVSTCh1cmxPYmplY3QudG9TdHJpbmcoKSk7cmV0dXJuIGF1dGh8fChwYXJzZWQudXNlcm5hbWU9IiIscGFyc2VkLnBhc3N3b3JkPSIiKSxmcmFnbWVudHx8KHBhcnNlZC5oYXNoPSIiKSxzZWFyY2h8fChwYXJzZWQuc2VhcmNoPSIiKSxwYXJzZWQudG9TdHJpbmcoKX0sYXBpPXtmb3JtYXQ6Zm9ybWF0SW1wb3J0V2l0aE92ZXJsb2FkcyxwYXJzZTpwYXJzZUltcG9ydCxyZXNvbHZlOnJlc29sdmVJbXBvcnQscmVzb2x2ZU9iamVjdCxVcmw6VXJsSW1wb3J0LFVSTCxVUkxTZWFyY2hQYXJhbXMsZG9tYWluVG9BU0NJSSxkb21haW5Ub1VuaWNvZGUscGF0aFRvRmlsZVVSTCxmaWxlVVJMVG9QYXRofTtleHBvcnRzLlVSTD1VUkwsZXhwb3J0cy5VUkxTZWFyY2hQYXJhbXM9VVJMU2VhcmNoUGFyYW1zLGV4cG9ydHMuVXJsPVVybEltcG9ydCxleHBvcnRzLmRlZmF1bHQ9YXBpLGV4cG9ydHMuZG9tYWluVG9BU0NJST1kb21haW5Ub0FTQ0lJLGV4cG9ydHMuZG9tYWluVG9Vbmljb2RlPWRvbWFpblRvVW5pY29kZSxleHBvcnRzLmZpbGVVUkxUb1BhdGg9ZmlsZVVSTFRvUGF0aCxleHBvcnRzLmZvcm1hdD1mb3JtYXRJbXBvcnRXaXRoT3ZlcmxvYWRzLGV4cG9ydHMucGFyc2U9cGFyc2VJbXBvcnQsZXhwb3J0cy5wYXRoVG9GaWxlVVJMPXBhdGhUb0ZpbGVVUkwsZXhwb3J0cy5yZXNvbHZlPXJlc29sdmVJbXBvcnQsZXhwb3J0cy5yZXNvbHZlT2JqZWN0PXJlc29sdmVPYmplY3QsZXhwb3J0cz1tb2R1bGUuZXhwb3J0cz1hcGl9LCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1hZXMvbW9kZXMvbGlzdC5qc29uIihtb2R1bGUpeyJ1c2Ugc3RyaWN0Ijttb2R1bGUuZXhwb3J0cz1KU09OLnBhcnNlKCd7ImFlcy0xMjgtZWNiIjp7ImNpcGhlciI6IkFFUyIsImtleSI6MTI4LCJpdiI6MCwibW9kZSI6IkVDQiIsInR5cGUiOiJibG9jayJ9LCJhZXMtMTkyLWVjYiI6eyJjaXBoZXIiOiJBRVMiLCJrZXkiOjE5MiwiaXYiOjAsIm1vZGUiOiJFQ0IiLCJ0eXBlIjoiYmxvY2sifSwiYWVzLTI1Ni1lY2IiOnsiY2lwaGVyIjoiQUVTIiwia2V5IjoyNTYsIml2IjowLCJtb2RlIjoiRUNCIiwidHlwZSI6ImJsb2NrIn0sImFlcy0xMjgtY2JjIjp7ImNpcGhlciI6IkFFUyIsImtleSI6MTI4LCJpdiI6MTYsIm1vZGUiOiJDQkMiLCJ0eXBlIjoiYmxvY2sifSwiYWVzLTE5Mi1jYmMiOnsiY2lwaGVyIjoiQUVTIiwia2V5IjoxOTIsIml2IjoxNiwibW9kZSI6IkNCQyIsInR5cGUiOiJibG9jayJ9LCJhZXMtMjU2LWNiYyI6eyJjaXBoZXIiOiJBRVMiLCJrZXkiOjI1NiwiaXYiOjE2LCJtb2RlIjoiQ0JDIiwidHlwZSI6ImJsb2NrIn0sImFlczEyOCI6eyJjaXBoZXIiOiJBRVMiLCJrZXkiOjEyOCwiaXYiOjE2LCJtb2RlIjoiQ0JDIiwidHlwZSI6ImJsb2NrIn0sImFlczE5MiI6eyJjaXBoZXIiOiJBRVMiLCJrZXkiOjE5MiwiaXYiOjE2LCJtb2RlIjoiQ0JDIiwidHlwZSI6ImJsb2NrIn0sImFlczI1NiI6eyJjaXBoZXIiOiJBRVMiLCJrZXkiOjI1NiwiaXYiOjE2LCJtb2RlIjoiQ0JDIiwidHlwZSI6ImJsb2NrIn0sImFlcy0xMjgtY2ZiIjp7ImNpcGhlciI6IkFFUyIsImtleSI6MTI4LCJpdiI6MTYsIm1vZGUiOiJDRkIiLCJ0eXBlIjoic3RyZWFtIn0sImFlcy0xOTItY2ZiIjp7ImNpcGhlciI6IkFFUyIsImtleSI6MTkyLCJpdiI6MTYsIm1vZGUiOiJDRkIiLCJ0eXBlIjoic3RyZWFtIn0sImFlcy0yNTYtY2ZiIjp7ImNpcGhlciI6IkFFUyIsImtleSI6MjU2LCJpdiI6MTYsIm1vZGUiOiJDRkIiLCJ0eXBlIjoic3RyZWFtIn0sImFlcy0xMjgtY2ZiOCI6eyJjaXBoZXIiOiJBRVMiLCJrZXkiOjEyOCwiaXYiOjE2LCJtb2RlIjoiQ0ZCOCIsInR5cGUiOiJzdHJlYW0ifSwiYWVzLTE5Mi1jZmI4Ijp7ImNpcGhlciI6IkFFUyIsImtleSI6MTkyLCJpdiI6MTYsIm1vZGUiOiJDRkI4IiwidHlwZSI6InN0cmVhbSJ9LCJhZXMtMjU2LWNmYjgiOnsiY2lwaGVyIjoiQUVTIiwia2V5IjoyNTYsIml2IjoxNiwibW9kZSI6IkNGQjgiLCJ0eXBlIjoic3RyZWFtIn0sImFlcy0xMjgtY2ZiMSI6eyJjaXBoZXIiOiJBRVMiLCJrZXkiOjEyOCwiaXYiOjE2LCJtb2RlIjoiQ0ZCMSIsInR5cGUiOiJzdHJlYW0ifSwiYWVzLTE5Mi1jZmIxIjp7ImNpcGhlciI6IkFFUyIsImtleSI6MTkyLCJpdiI6MTYsIm1vZGUiOiJDRkIxIiwidHlwZSI6InN0cmVhbSJ9LCJhZXMtMjU2LWNmYjEiOnsiY2lwaGVyIjoiQUVTIiwia2V5IjoyNTYsIml2IjoxNiwibW9kZSI6IkNGQjEiLCJ0eXBlIjoic3RyZWFtIn0sImFlcy0xMjgtb2ZiIjp7ImNpcGhlciI6IkFFUyIsImtleSI6MTI4LCJpdiI6MTYsIm1vZGUiOiJPRkIiLCJ0eXBlIjoic3RyZWFtIn0sImFlcy0xOTItb2ZiIjp7ImNpcGhlciI6IkFFUyIsImtleSI6MTkyLCJpdiI6MTYsIm1vZGUiOiJPRkIiLCJ0eXBlIjoic3RyZWFtIn0sImFlcy0yNTYtb2ZiIjp7ImNpcGhlciI6IkFFUyIsImtleSI6MjU2LCJpdiI6MTYsIm1vZGUiOiJPRkIiLCJ0eXBlIjoic3RyZWFtIn0sImFlcy0xMjgtY3RyIjp7ImNpcGhlciI6IkFFUyIsImtleSI6MTI4LCJpdiI6MTYsIm1vZGUiOiJDVFIiLCJ0eXBlIjoic3RyZWFtIn0sImFlcy0xOTItY3RyIjp7ImNpcGhlciI6IkFFUyIsImtleSI6MTkyLCJpdiI6MTYsIm1vZGUiOiJDVFIiLCJ0eXBlIjoic3RyZWFtIn0sImFlcy0yNTYtY3RyIjp7ImNpcGhlciI6IkFFUyIsImtleSI6MjU2LCJpdiI6MTYsIm1vZGUiOiJDVFIiLCJ0eXBlIjoic3RyZWFtIn0sImFlcy0xMjgtZ2NtIjp7ImNpcGhlciI6IkFFUyIsImtleSI6MTI4LCJpdiI6MTIsIm1vZGUiOiJHQ00iLCJ0eXBlIjoiYXV0aCJ9LCJhZXMtMTkyLWdjbSI6eyJjaXBoZXIiOiJBRVMiLCJrZXkiOjE5MiwiaXYiOjEyLCJtb2RlIjoiR0NNIiwidHlwZSI6ImF1dGgifSwiYWVzLTI1Ni1nY20iOnsiY2lwaGVyIjoiQUVTIiwia2V5IjoyNTYsIml2IjoxMiwibW9kZSI6IkdDTSIsInR5cGUiOiJhdXRoIn19Jyl9LCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS1zaWduL2Jyb3dzZXIvYWxnb3JpdGhtcy5qc29uIihtb2R1bGUpeyJ1c2Ugc3RyaWN0Ijttb2R1bGUuZXhwb3J0cz1KU09OLnBhcnNlKCd7InNoYTIyNFdpdGhSU0FFbmNyeXB0aW9uIjp7InNpZ24iOiJyc2EiLCJoYXNoIjoic2hhMjI0IiwiaWQiOiIzMDJkMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDQwNTAwMDQxYyJ9LCJSU0EtU0hBMjI0Ijp7InNpZ24iOiJlY2RzYS9yc2EiLCJoYXNoIjoic2hhMjI0IiwiaWQiOiIzMDJkMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDQwNTAwMDQxYyJ9LCJzaGEyNTZXaXRoUlNBRW5jcnlwdGlvbiI6eyJzaWduIjoicnNhIiwiaGFzaCI6InNoYTI1NiIsImlkIjoiMzAzMTMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjAxMDUwMDA0MjAifSwiUlNBLVNIQTI1NiI6eyJzaWduIjoiZWNkc2EvcnNhIiwiaGFzaCI6InNoYTI1NiIsImlkIjoiMzAzMTMwMGQwNjA5NjA4NjQ4MDE2NTAzMDQwMjAxMDUwMDA0MjAifSwic2hhMzg0V2l0aFJTQUVuY3J5cHRpb24iOnsic2lnbiI6InJzYSIsImhhc2giOiJzaGEzODQiLCJpZCI6IjMwNDEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMjA1MDAwNDMwIn0sIlJTQS1TSEEzODQiOnsic2lnbiI6ImVjZHNhL3JzYSIsImhhc2giOiJzaGEzODQiLCJpZCI6IjMwNDEzMDBkMDYwOTYwODY0ODAxNjUwMzA0MDIwMjA1MDAwNDMwIn0sInNoYTUxMldpdGhSU0FFbmNyeXB0aW9uIjp7InNpZ24iOiJyc2EiLCJoYXNoIjoic2hhNTEyIiwiaWQiOiIzMDUxMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDMwNTAwMDQ0MCJ9LCJSU0EtU0hBNTEyIjp7InNpZ24iOiJlY2RzYS9yc2EiLCJoYXNoIjoic2hhNTEyIiwiaWQiOiIzMDUxMzAwZDA2MDk2MDg2NDgwMTY1MDMwNDAyMDMwNTAwMDQ0MCJ9LCJSU0EtU0hBMSI6eyJzaWduIjoicnNhIiwiaGFzaCI6InNoYTEiLCJpZCI6IjMwMjEzMDA5MDYwNTJiMGUwMzAyMWEwNTAwMDQxNCJ9LCJlY2RzYS13aXRoLVNIQTEiOnsic2lnbiI6ImVjZHNhIiwiaGFzaCI6InNoYTEiLCJpZCI6IiJ9LCJzaGEyNTYiOnsic2lnbiI6ImVjZHNhIiwiaGFzaCI6InNoYTI1NiIsImlkIjoiIn0sInNoYTIyNCI6eyJzaWduIjoiZWNkc2EiLCJoYXNoIjoic2hhMjI0IiwiaWQiOiIifSwic2hhMzg0Ijp7InNpZ24iOiJlY2RzYSIsImhhc2giOiJzaGEzODQiLCJpZCI6IiJ9LCJzaGE1MTIiOnsic2lnbiI6ImVjZHNhIiwiaGFzaCI6InNoYTUxMiIsImlkIjoiIn0sIkRTQS1TSEEiOnsic2lnbiI6ImRzYSIsImhhc2giOiJzaGExIiwiaWQiOiIifSwiRFNBLVNIQTEiOnsic2lnbiI6ImRzYSIsImhhc2giOiJzaGExIiwiaWQiOiIifSwiRFNBIjp7InNpZ24iOiJkc2EiLCJoYXNoIjoic2hhMSIsImlkIjoiIn0sIkRTQS1XSVRILVNIQTIyNCI6eyJzaWduIjoiZHNhIiwiaGFzaCI6InNoYTIyNCIsImlkIjoiIn0sIkRTQS1TSEEyMjQiOnsic2lnbiI6ImRzYSIsImhhc2giOiJzaGEyMjQiLCJpZCI6IiJ9LCJEU0EtV0lUSC1TSEEyNTYiOnsic2lnbiI6ImRzYSIsImhhc2giOiJzaGEyNTYiLCJpZCI6IiJ9LCJEU0EtU0hBMjU2Ijp7InNpZ24iOiJkc2EiLCJoYXNoIjoic2hhMjU2IiwiaWQiOiIifSwiRFNBLVdJVEgtU0hBMzg0Ijp7InNpZ24iOiJkc2EiLCJoYXNoIjoic2hhMzg0IiwiaWQiOiIifSwiRFNBLVNIQTM4NCI6eyJzaWduIjoiZHNhIiwiaGFzaCI6InNoYTM4NCIsImlkIjoiIn0sIkRTQS1XSVRILVNIQTUxMiI6eyJzaWduIjoiZHNhIiwiaGFzaCI6InNoYTUxMiIsImlkIjoiIn0sIkRTQS1TSEE1MTIiOnsic2lnbiI6ImRzYSIsImhhc2giOiJzaGE1MTIiLCJpZCI6IiJ9LCJEU0EtUklQRU1EMTYwIjp7InNpZ24iOiJkc2EiLCJoYXNoIjoicm1kMTYwIiwiaWQiOiIifSwicmlwZW1kMTYwV2l0aFJTQSI6eyJzaWduIjoicnNhIiwiaGFzaCI6InJtZDE2MCIsImlkIjoiMzAyMTMwMDkwNjA1MmIyNDAzMDIwMTA1MDAwNDE0In0sIlJTQS1SSVBFTUQxNjAiOnsic2lnbiI6InJzYSIsImhhc2giOiJybWQxNjAiLCJpZCI6IjMwMjEzMDA5MDYwNTJiMjQwMzAyMDEwNTAwMDQxNCJ9LCJtZDVXaXRoUlNBRW5jcnlwdGlvbiI6eyJzaWduIjoicnNhIiwiaGFzaCI6Im1kNSIsImlkIjoiMzAyMDMwMGMwNjA4MmE4NjQ4ODZmNzBkMDIwNTA1MDAwNDEwIn0sIlJTQS1NRDUiOnsic2lnbiI6InJzYSIsImhhc2giOiJtZDUiLCJpZCI6IjMwMjAzMDBjMDYwODJhODY0ODg2ZjcwZDAyMDUwNTAwMDQxMCJ9fScpfSwiLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnktc2lnbi9icm93c2VyL2N1cnZlcy5qc29uIihtb2R1bGUpeyJ1c2Ugc3RyaWN0Ijttb2R1bGUuZXhwb3J0cz1KU09OLnBhcnNlKCd7IjEuMy4xMzIuMC4xMCI6InNlY3AyNTZrMSIsIjEuMy4xMzIuMC4zMyI6InAyMjQiLCIxLjIuODQwLjEwMDQ1LjMuMS4xIjoicDE5MiIsIjEuMi44NDAuMTAwNDUuMy4xLjciOiJwMjU2IiwiMS4zLjEzMi4wLjM0IjoicDM4NCIsIjEuMy4xMzIuMC4zNSI6InA1MjEifScpfSwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvbnN0YW50cy1icm93c2VyaWZ5L2NvbnN0YW50cy5qc29uIihtb2R1bGUpeyJ1c2Ugc3RyaWN0Ijttb2R1bGUuZXhwb3J0cz1KU09OLnBhcnNlKCd7Ik9fUkRPTkxZIjowLCJPX1dST05MWSI6MSwiT19SRFdSIjoyLCJTX0lGTVQiOjYxNDQwLCJTX0lGUkVHIjozMjc2OCwiU19JRkRJUiI6MTYzODQsIlNfSUZDSFIiOjgxOTIsIlNfSUZCTEsiOjI0NTc2LCJTX0lGSUZPIjo0MDk2LCJTX0lGTE5LIjo0MDk2MCwiU19JRlNPQ0siOjQ5MTUyLCJPX0NSRUFUIjo1MTIsIk9fRVhDTCI6MjA0OCwiT19OT0NUVFkiOjEzMTA3MiwiT19UUlVOQyI6MTAyNCwiT19BUFBFTkQiOjgsIk9fRElSRUNUT1JZIjoxMDQ4NTc2LCJPX05PRk9MTE9XIjoyNTYsIk9fU1lOQyI6MTI4LCJPX1NZTUxJTksiOjIwOTcxNTIsIk9fTk9OQkxPQ0siOjQsIlNfSVJXWFUiOjQ0OCwiU19JUlVTUiI6MjU2LCJTX0lXVVNSIjoxMjgsIlNfSVhVU1IiOjY0LCJTX0lSV1hHIjo1NiwiU19JUkdSUCI6MzIsIlNfSVdHUlAiOjE2LCJTX0lYR1JQIjo4LCJTX0lSV1hPIjo3LCJTX0lST1RIIjo0LCJTX0lXT1RIIjoyLCJTX0lYT1RIIjoxLCJFMkJJRyI6NywiRUFDQ0VTIjoxMywiRUFERFJJTlVTRSI6NDgsIkVBRERSTk9UQVZBSUwiOjQ5LCJFQUZOT1NVUFBPUlQiOjQ3LCJFQUdBSU4iOjM1LCJFQUxSRUFEWSI6MzcsIkVCQURGIjo5LCJFQkFETVNHIjo5NCwiRUJVU1kiOjE2LCJFQ0FOQ0VMRUQiOjg5LCJFQ0hJTEQiOjEwLCJFQ09OTkFCT1JURUQiOjUzLCJFQ09OTlJFRlVTRUQiOjYxLCJFQ09OTlJFU0VUIjo1NCwiRURFQURMSyI6MTEsIkVERVNUQUREUlJFUSI6MzksIkVET00iOjMzLCJFRFFVT1QiOjY5LCJFRVhJU1QiOjE3LCJFRkFVTFQiOjE0LCJFRkJJRyI6MjcsIkVIT1NUVU5SRUFDSCI6NjUsIkVJRFJNIjo5MCwiRUlMU0VRIjo5MiwiRUlOUFJPR1JFU1MiOjM2LCJFSU5UUiI6NCwiRUlOVkFMIjoyMiwiRUlPIjo1LCJFSVNDT05OIjo1NiwiRUlTRElSIjoyMSwiRUxPT1AiOjYyLCJFTUZJTEUiOjI0LCJFTUxJTksiOjMxLCJFTVNHU0laRSI6NDAsIkVNVUxUSUhPUCI6OTUsIkVOQU1FVE9PTE9ORyI6NjMsIkVORVRET1dOIjo1MCwiRU5FVFJFU0VUIjo1MiwiRU5FVFVOUkVBQ0giOjUxLCJFTkZJTEUiOjIzLCJFTk9CVUZTIjo1NSwiRU5PREFUQSI6OTYsIkVOT0RFViI6MTksIkVOT0VOVCI6MiwiRU5PRVhFQyI6OCwiRU5PTENLIjo3NywiRU5PTElOSyI6OTcsIkVOT01FTSI6MTIsIkVOT01TRyI6OTEsIkVOT1BST1RPT1BUIjo0MiwiRU5PU1BDIjoyOCwiRU5PU1IiOjk4LCJFTk9TVFIiOjk5LCJFTk9TWVMiOjc4LCJFTk9UQ09OTiI6NTcsIkVOT1RESVIiOjIwLCJFTk9URU1QVFkiOjY2LCJFTk9UU09DSyI6MzgsIkVOT1RTVVAiOjQ1LCJFTk9UVFkiOjI1LCJFTlhJTyI6NiwiRU9QTk9UU1VQUCI6MTAyLCJFT1ZFUkZMT1ciOjg0LCJFUEVSTSI6MSwiRVBJUEUiOjMyLCJFUFJPVE8iOjEwMCwiRVBST1RPTk9TVVBQT1JUIjo0MywiRVBST1RPVFlQRSI6NDEsIkVSQU5HRSI6MzQsIkVST0ZTIjozMCwiRVNQSVBFIjoyOSwiRVNSQ0giOjMsIkVTVEFMRSI6NzAsIkVUSU1FIjoxMDEsIkVUSU1FRE9VVCI6NjAsIkVUWFRCU1kiOjI2LCJFV09VTERCTE9DSyI6MzUsIkVYREVWIjoxOCwiU0lHSFVQIjoxLCJTSUdJTlQiOjIsIlNJR1FVSVQiOjMsIlNJR0lMTCI6NCwiU0lHVFJBUCI6NSwiU0lHQUJSVCI6NiwiU0lHSU9UIjo2LCJTSUdCVVMiOjEwLCJTSUdGUEUiOjgsIlNJR0tJTEwiOjksIlNJR1VTUjEiOjMwLCJTSUdTRUdWIjoxMSwiU0lHVVNSMiI6MzEsIlNJR1BJUEUiOjEzLCJTSUdBTFJNIjoxNCwiU0lHVEVSTSI6MTUsIlNJR0NITEQiOjIwLCJTSUdDT05UIjoxOSwiU0lHU1RPUCI6MTcsIlNJR1RTVFAiOjE4LCJTSUdUVElOIjoyMSwiU0lHVFRPVSI6MjIsIlNJR1VSRyI6MTYsIlNJR1hDUFUiOjI0LCJTSUdYRlNaIjoyNSwiU0lHVlRBTFJNIjoyNiwiU0lHUFJPRiI6MjcsIlNJR1dJTkNIIjoyOCwiU0lHSU8iOjIzLCJTSUdTWVMiOjEyLCJTU0xfT1BfQUxMIjoyMTQ3NDg2NzE5LCJTU0xfT1BfQUxMT1dfVU5TQUZFX0xFR0FDWV9SRU5FR09USUFUSU9OIjoyNjIxNDQsIlNTTF9PUF9DSVBIRVJfU0VSVkVSX1BSRUZFUkVOQ0UiOjQxOTQzMDQsIlNTTF9PUF9DSVNDT19BTllDT05ORUNUIjozMjc2OCwiU1NMX09QX0NPT0tJRV9FWENIQU5HRSI6ODE5MiwiU1NMX09QX0NSWVBUT1BST19UTFNFWFRfQlVHIjoyMTQ3NDgzNjQ4LCJTU0xfT1BfRE9OVF9JTlNFUlRfRU1QVFlfRlJBR01FTlRTIjoyMDQ4LCJTU0xfT1BfRVBIRU1FUkFMX1JTQSI6MCwiU1NMX09QX0xFR0FDWV9TRVJWRVJfQ09OTkVDVCI6NCwiU1NMX09QX01JQ1JPU09GVF9CSUdfU1NMVjNfQlVGRkVSIjozMiwiU1NMX09QX01JQ1JPU09GVF9TRVNTX0lEX0JVRyI6MSwiU1NMX09QX01TSUVfU1NMVjJfUlNBX1BBRERJTkciOjAsIlNTTF9PUF9ORVRTQ0FQRV9DQV9ETl9CVUciOjUzNjg3MDkxMiwiU1NMX09QX05FVFNDQVBFX0NIQUxMRU5HRV9CVUciOjIsIlNTTF9PUF9ORVRTQ0FQRV9ERU1PX0NJUEhFUl9DSEFOR0VfQlVHIjoxMDczNzQxODI0LCJTU0xfT1BfTkVUU0NBUEVfUkVVU0VfQ0lQSEVSX0NIQU5HRV9CVUciOjgsIlNTTF9PUF9OT19DT01QUkVTU0lPTiI6MTMxMDcyLCJTU0xfT1BfTk9fUVVFUllfTVRVIjo0MDk2LCJTU0xfT1BfTk9fU0VTU0lPTl9SRVNVTVBUSU9OX09OX1JFTkVHT1RJQVRJT04iOjY1NTM2LCJTU0xfT1BfTk9fU1NMdjIiOjE2Nzc3MjE2LCJTU0xfT1BfTk9fU1NMdjMiOjMzNTU0NDMyLCJTU0xfT1BfTk9fVElDS0VUIjoxNjM4NCwiU1NMX09QX05PX1RMU3YxIjo2NzEwODg2NCwiU1NMX09QX05PX1RMU3YxXzEiOjI2ODQzNTQ1NiwiU1NMX09QX05PX1RMU3YxXzIiOjEzNDIxNzcyOCwiU1NMX09QX1BLQ1MxX0NIRUNLXzEiOjAsIlNTTF9PUF9QS0NTMV9DSEVDS18yIjowLCJTU0xfT1BfU0lOR0xFX0RIX1VTRSI6MTA0ODU3NiwiU1NMX09QX1NJTkdMRV9FQ0RIX1VTRSI6NTI0Mjg4LCJTU0xfT1BfU1NMRUFZXzA4MF9DTElFTlRfREhfQlVHIjoxMjgsIlNTTF9PUF9TU0xSRUYyX1JFVVNFX0NFUlRfVFlQRV9CVUciOjAsIlNTTF9PUF9UTFNfQkxPQ0tfUEFERElOR19CVUciOjUxMiwiU1NMX09QX1RMU19ENV9CVUciOjI1NiwiU1NMX09QX1RMU19ST0xMQkFDS19CVUciOjgzODg2MDgsIkVOR0lORV9NRVRIT0RfRFNBIjoyLCJFTkdJTkVfTUVUSE9EX0RIIjo0LCJFTkdJTkVfTUVUSE9EX1JBTkQiOjgsIkVOR0lORV9NRVRIT0RfRUNESCI6MTYsIkVOR0lORV9NRVRIT0RfRUNEU0EiOjMyLCJFTkdJTkVfTUVUSE9EX0NJUEhFUlMiOjY0LCJFTkdJTkVfTUVUSE9EX0RJR0VTVFMiOjEyOCwiRU5HSU5FX01FVEhPRF9TVE9SRSI6MjU2LCJFTkdJTkVfTUVUSE9EX1BLRVlfTUVUSFMiOjUxMiwiRU5HSU5FX01FVEhPRF9QS0VZX0FTTjFfTUVUSFMiOjEwMjQsIkVOR0lORV9NRVRIT0RfQUxMIjo2NTUzNSwiRU5HSU5FX01FVEhPRF9OT05FIjowLCJESF9DSEVDS19QX05PVF9TQUZFX1BSSU1FIjoyLCJESF9DSEVDS19QX05PVF9QUklNRSI6MSwiREhfVU5BQkxFX1RPX0NIRUNLX0dFTkVSQVRPUiI6NCwiREhfTk9UX1NVSVRBQkxFX0dFTkVSQVRPUiI6OCwiTlBOX0VOQUJMRUQiOjEsIlJTQV9QS0NTMV9QQURESU5HIjoxLCJSU0FfU1NMVjIzX1BBRERJTkciOjIsIlJTQV9OT19QQURESU5HIjozLCJSU0FfUEtDUzFfT0FFUF9QQURESU5HIjo0LCJSU0FfWDkzMV9QQURESU5HIjo1LCJSU0FfUEtDUzFfUFNTX1BBRERJTkciOjYsIlBPSU5UX0NPTlZFUlNJT05fQ09NUFJFU1NFRCI6MiwiUE9JTlRfQ09OVkVSU0lPTl9VTkNPTVBSRVNTRUQiOjQsIlBPSU5UX0NPTlZFUlNJT05fSFlCUklEIjo2LCJGX09LIjowLCJSX09LIjo0LCJXX09LIjoyLCJYX09LIjoxLCJVVl9VRFBfUkVVU0VBRERSIjo0fScpfSwiLi4vLi4vbm9kZV9tb2R1bGVzL2RpZmZpZS1oZWxsbWFuL2xpYi9wcmltZXMuanNvbiIobW9kdWxlKXsidXNlIHN0cmljdCI7bW9kdWxlLmV4cG9ydHM9SlNPTi5wYXJzZSgneyJtb2RwMSI6eyJnZW4iOiIwMiIsInByaW1lIjoiZmZmZmZmZmZmZmZmZmZmZmM5MGZkYWEyMjE2OGMyMzRjNGM2NjI4YjgwZGMxY2QxMjkwMjRlMDg4YTY3Y2M3NDAyMGJiZWE2M2IxMzliMjI1MTRhMDg3OThlMzQwNGRkZWY5NTE5YjNjZDNhNDMxYjMwMmIwYTZkZjI1ZjE0Mzc0ZmUxMzU2ZDZkNTFjMjQ1ZTQ4NWI1NzY2MjVlN2VjNmY0NGM0MmU5YTYzYTM2MjBmZmZmZmZmZmZmZmZmZmZmIn0sIm1vZHAyIjp7ImdlbiI6IjAyIiwicHJpbWUiOiJmZmZmZmZmZmZmZmZmZmZmYzkwZmRhYTIyMTY4YzIzNGM0YzY2MjhiODBkYzFjZDEyOTAyNGUwODhhNjdjYzc0MDIwYmJlYTYzYjEzOWIyMjUxNGEwODc5OGUzNDA0ZGRlZjk1MTliM2NkM2E0MzFiMzAyYjBhNmRmMjVmMTQzNzRmZTEzNTZkNmQ1MWMyNDVlNDg1YjU3NjYyNWU3ZWM2ZjQ0YzQyZTlhNjM3ZWQ2YjBiZmY1Y2I2ZjQwNmI3ZWRlZTM4NmJmYjVhODk5ZmE1YWU5ZjI0MTE3YzRiMWZlNjQ5Mjg2NjUxZWNlNjUzODFmZmZmZmZmZmZmZmZmZmZmIn0sIm1vZHA1Ijp7ImdlbiI6IjAyIiwicHJpbWUiOiJmZmZmZmZmZmZmZmZmZmZmYzkwZmRhYTIyMTY4YzIzNGM0YzY2MjhiODBkYzFjZDEyOTAyNGUwODhhNjdjYzc0MDIwYmJlYTYzYjEzOWIyMjUxNGEwODc5OGUzNDA0ZGRlZjk1MTliM2NkM2E0MzFiMzAyYjBhNmRmMjVmMTQzNzRmZTEzNTZkNmQ1MWMyNDVlNDg1YjU3NjYyNWU3ZWM2ZjQ0YzQyZTlhNjM3ZWQ2YjBiZmY1Y2I2ZjQwNmI3ZWRlZTM4NmJmYjVhODk5ZmE1YWU5ZjI0MTE3YzRiMWZlNjQ5Mjg2NjUxZWNlNDViM2RjMjAwN2NiOGExNjNiZjA1OThkYTQ4MzYxYzU1ZDM5YTY5MTYzZmE4ZmQyNGNmNWY4MzY1NWQyM2RjYTNhZDk2MWM2MmYzNTYyMDg1NTJiYjllZDUyOTA3NzA5Njk2NmQ2NzBjMzU0ZTRhYmM5ODA0ZjE3NDZjMDhjYTIzNzMyN2ZmZmZmZmZmZmZmZmZmZmYifSwibW9kcDE0Ijp7ImdlbiI6IjAyIiwicHJpbWUiOiJmZmZmZmZmZmZmZmZmZmZmYzkwZmRhYTIyMTY4YzIzNGM0YzY2MjhiODBkYzFjZDEyOTAyNGUwODhhNjdjYzc0MDIwYmJlYTYzYjEzOWIyMjUxNGEwODc5OGUzNDA0ZGRlZjk1MTliM2NkM2E0MzFiMzAyYjBhNmRmMjVmMTQzNzRmZTEzNTZkNmQ1MWMyNDVlNDg1YjU3NjYyNWU3ZWM2ZjQ0YzQyZTlhNjM3ZWQ2YjBiZmY1Y2I2ZjQwNmI3ZWRlZTM4NmJmYjVhODk5ZmE1YWU5ZjI0MTE3YzRiMWZlNjQ5Mjg2NjUxZWNlNDViM2RjMjAwN2NiOGExNjNiZjA1OThkYTQ4MzYxYzU1ZDM5YTY5MTYzZmE4ZmQyNGNmNWY4MzY1NWQyM2RjYTNhZDk2MWM2MmYzNTYyMDg1NTJiYjllZDUyOTA3NzA5Njk2NmQ2NzBjMzU0ZTRhYmM5ODA0ZjE3NDZjMDhjYTE4MjE3YzMyOTA1ZTQ2MmUzNmNlM2JlMzllNzcyYzE4MGU4NjAzOWIyNzgzYTJlYzA3YTI4ZmI1YzU1ZGYwNmY0YzUyYzlkZTJiY2JmNjk1NTgxNzE4Mzk5NTQ5N2NlYTk1NmFlNTE1ZDIyNjE4OThmYTA1MTAxNTcyOGU1YThhYWNhYTY4ZmZmZmZmZmZmZmZmZmZmZiJ9LCJtb2RwMTUiOnsiZ2VuIjoiMDIiLCJwcmltZSI6ImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2MzdlZDZiMGJmZjVjYjZmNDA2YjdlZGVlMzg2YmZiNWE4OTlmYTVhZTlmMjQxMTdjNGIxZmU2NDkyODY2NTFlY2U0NWIzZGMyMDA3Y2I4YTE2M2JmMDU5OGRhNDgzNjFjNTVkMzlhNjkxNjNmYThmZDI0Y2Y1ZjgzNjU1ZDIzZGNhM2FkOTYxYzYyZjM1NjIwODU1MmJiOWVkNTI5MDc3MDk2OTY2ZDY3MGMzNTRlNGFiYzk4MDRmMTc0NmMwOGNhMTgyMTdjMzI5MDVlNDYyZTM2Y2UzYmUzOWU3NzJjMTgwZTg2MDM5YjI3ODNhMmVjMDdhMjhmYjVjNTVkZjA2ZjRjNTJjOWRlMmJjYmY2OTU1ODE3MTgzOTk1NDk3Y2VhOTU2YWU1MTVkMjI2MTg5OGZhMDUxMDE1NzI4ZTVhOGFhYWM0MmRhZDMzMTcwZDA0NTA3YTMzYTg1NTIxYWJkZjFjYmE2NGVjZmI4NTA0NThkYmVmMGE4YWVhNzE1NzVkMDYwYzdkYjM5NzBmODVhNmUxZTRjN2FiZjVhZThjZGIwOTMzZDcxZThjOTRlMDRhMjU2MTlkY2VlM2QyMjYxYWQyZWU2YmYxMmZmYTA2ZDk4YTA4NjRkODc2MDI3MzNlYzg2YTY0NTIxZjJiMTgxNzdiMjAwY2JiZTExNzU3N2E2MTVkNmM3NzA5ODhjMGJhZDk0NmUyMDhlMjRmYTA3NGU1YWIzMTQzZGI1YmZjZTBmZDEwOGU0YjgyZDEyMGE5M2FkMmNhZmZmZmZmZmZmZmZmZmZmZiJ9LCJtb2RwMTYiOnsiZ2VuIjoiMDIiLCJwcmltZSI6ImZmZmZmZmZmZmZmZmZmZmZjOTBmZGFhMjIxNjhjMjM0YzRjNjYyOGI4MGRjMWNkMTI5MDI0ZTA4OGE2N2NjNzQwMjBiYmVhNjNiMTM5YjIyNTE0YTA4Nzk4ZTM0MDRkZGVmOTUxOWIzY2QzYTQzMWIzMDJiMGE2ZGYyNWYxNDM3NGZlMTM1NmQ2ZDUxYzI0NWU0ODViNTc2NjI1ZTdlYzZmNDRjNDJlOWE2MzdlZDZiMGJmZjVjYjZmNDA2YjdlZGVlMzg2YmZiNWE4OTlmYTVhZTlmMjQxMTdjNGIxZmU2NDkyODY2NTFlY2U0NWIzZGMyMDA3Y2I4YTE2M2JmMDU5OGRhNDgzNjFjNTVkMzlhNjkxNjNmYThmZDI0Y2Y1ZjgzNjU1ZDIzZGNhM2FkOTYxYzYyZjM1NjIwODU1MmJiOWVkNTI5MDc3MDk2OTY2ZDY3MGMzNTRlNGFiYzk4MDRmMTc0NmMwOGNhMTgyMTdjMzI5MDVlNDYyZTM2Y2UzYmUzOWU3NzJjMTgwZTg2MDM5YjI3ODNhMmVjMDdhMjhmYjVjNTVkZjA2ZjRjNTJjOWRlMmJjYmY2OTU1ODE3MTgzOTk1NDk3Y2VhOTU2YWU1MTVkMjI2MTg5OGZhMDUxMDE1NzI4ZTVhOGFhYWM0MmRhZDMzMTcwZDA0NTA3YTMzYTg1NTIxYWJkZjFjYmE2NGVjZmI4NTA0NThkYmVmMGE4YWVhNzE1NzVkMDYwYzdkYjM5NzBmODVhNmUxZTRjN2FiZjVhZThjZGIwOTMzZDcxZThjOTRlMDRhMjU2MTlkY2VlM2QyMjYxYWQyZWU2YmYxMmZmYTA2ZDk4YTA4NjRkODc2MDI3MzNlYzg2YTY0NTIxZjJiMTgxNzdiMjAwY2JiZTExNzU3N2E2MTVkNmM3NzA5ODhjMGJhZDk0NmUyMDhlMjRmYTA3NGU1YWIzMTQzZGI1YmZjZTBmZDEwOGU0YjgyZDEyMGE5MjEwODAxMWE3MjNjMTJhNzg3ZTZkNzg4NzE5YTEwYmRiYTViMjY5OWMzMjcxODZhZjRlMjNjMWE5NDY4MzRiNjE1MGJkYTI1ODNlOWNhMmFkNDRjZThkYmJiYzJkYjA0ZGU4ZWY5MmU4ZWZjMTQxZmJlY2FhNjI4N2M1OTQ3NGU2YmMwNWQ5OWIyOTY0ZmEwOTBjM2EyMjMzYmExODY1MTViZTdlZDFmNjEyOTcwY2VlMmQ3YWZiODFiZGQ3NjIxNzA0ODFjZDAwNjkxMjdkNWIwNWFhOTkzYjRlYTk4OGQ4ZmRkYzE4NmZmYjdkYzkwYTZjMDhmNGRmNDM1YzkzNDA2MzE5OWZmZmZmZmZmZmZmZmZmZmYifSwibW9kcDE3Ijp7ImdlbiI6IjAyIiwicHJpbWUiOiJmZmZmZmZmZmZmZmZmZmZmYzkwZmRhYTIyMTY4YzIzNGM0YzY2MjhiODBkYzFjZDEyOTAyNGUwODhhNjdjYzc0MDIwYmJlYTYzYjEzOWIyMjUxNGEwODc5OGUzNDA0ZGRlZjk1MTliM2NkM2E0MzFiMzAyYjBhNmRmMjVmMTQzNzRmZTEzNTZkNmQ1MWMyNDVlNDg1YjU3NjYyNWU3ZWM2ZjQ0YzQyZTlhNjM3ZWQ2YjBiZmY1Y2I2ZjQwNmI3ZWRlZTM4NmJmYjVhODk5ZmE1YWU5ZjI0MTE3YzRiMWZlNjQ5Mjg2NjUxZWNlNDViM2RjMjAwN2NiOGExNjNiZjA1OThkYTQ4MzYxYzU1ZDM5YTY5MTYzZmE4ZmQyNGNmNWY4MzY1NWQyM2RjYTNhZDk2MWM2MmYzNTYyMDg1NTJiYjllZDUyOTA3NzA5Njk2NmQ2NzBjMzU0ZTRhYmM5ODA0ZjE3NDZjMDhjYTE4MjE3YzMyOTA1ZTQ2MmUzNmNlM2JlMzllNzcyYzE4MGU4NjAzOWIyNzgzYTJlYzA3YTI4ZmI1YzU1ZGYwNmY0YzUyYzlkZTJiY2JmNjk1NTgxNzE4Mzk5NTQ5N2NlYTk1NmFlNTE1ZDIyNjE4OThmYTA1MTAxNTcyOGU1YThhYWFjNDJkYWQzMzE3MGQwNDUwN2EzM2E4NTUyMWFiZGYxY2JhNjRlY2ZiODUwNDU4ZGJlZjBhOGFlYTcxNTc1ZDA2MGM3ZGIzOTcwZjg1YTZlMWU0YzdhYmY1YWU4Y2RiMDkzM2Q3MWU4Yzk0ZTA0YTI1NjE5ZGNlZTNkMjI2MWFkMmVlNmJmMTJmZmEwNmQ5OGEwODY0ZDg3NjAyNzMzZWM4NmE2NDUyMWYyYjE4MTc3YjIwMGNiYmUxMTc1NzdhNjE1ZDZjNzcwOTg4YzBiYWQ5NDZlMjA4ZTI0ZmEwNzRlNWFiMzE0M2RiNWJmY2UwZmQxMDhlNGI4MmQxMjBhOTIxMDgwMTFhNzIzYzEyYTc4N2U2ZDc4ODcxOWExMGJkYmE1YjI2OTljMzI3MTg2YWY0ZTIzYzFhOTQ2ODM0YjYxNTBiZGEyNTgzZTljYTJhZDQ0Y2U4ZGJiYmMyZGIwNGRlOGVmOTJlOGVmYzE0MWZiZWNhYTYyODdjNTk0NzRlNmJjMDVkOTliMjk2NGZhMDkwYzNhMjIzM2JhMTg2NTE1YmU3ZWQxZjYxMjk3MGNlZTJkN2FmYjgxYmRkNzYyMTcwNDgxY2QwMDY5MTI3ZDViMDVhYTk5M2I0ZWE5ODhkOGZkZGMxODZmZmI3ZGM5MGE2YzA4ZjRkZjQzNWM5MzQwMjg0OTIzNmMzZmFiNGQyN2M3MDI2YzFkNGRjYjI2MDI2NDZkZWM5NzUxZTc2M2RiYTM3YmRmOGZmOTQwNmFkOWU1MzBlZTVkYjM4MmY0MTMwMDFhZWIwNmE1M2VkOTAyN2Q4MzExNzk3MjdiMDg2NWE4OTE4ZGEzZWRiZWJjZjliMTRlZDQ0Y2U2Y2JhY2VkNGJiMWJkYjdmMTQ0N2U2Y2MyNTRiMzMyMDUxNTEyYmQ3YWY0MjZmYjhmNDAxMzc4Y2QyYmY1OTgzY2EwMWM2NGI5MmVjZjAzMmVhMTVkMTcyMWQwM2Y0ODJkN2NlNmU3NGZlZjZkNTVlNzAyZjQ2OTgwYzgyYjVhODQwMzE5MDBiMWM5ZTU5ZTdjOTdmYmVjN2U4ZjMyM2E5N2E3ZTM2Y2M4OGJlMGYxZDQ1YjdmZjU4NWFjNTRiZDQwN2IyMmI0MTU0YWFjYzhmNmQ3ZWJmNDhlMWQ4MTRjYzVlZDIwZjgwMzdlMGE3OTcxNWVlZjI5YmUzMjgwNmExZDU4YmI3YzVkYTc2ZjU1MGFhM2Q4YTFmYmZmMGViMTljY2IxYTMxM2Q1NWNkYTU2YzllYzJlZjI5NjMyMzg3ZmU4ZDc2ZTNjMDQ2ODA0M2U4ZjY2M2Y0ODYwZWUxMmJmMmQ1YjBiNzQ3NGQ2ZTY5NGY5MWU2ZGNjNDAyNGZmZmZmZmZmZmZmZmZmZmYifSwibW9kcDE4Ijp7ImdlbiI6IjAyIiwicHJpbWUiOiJmZmZmZmZmZmZmZmZmZmZmYzkwZmRhYTIyMTY4YzIzNGM0YzY2MjhiODBkYzFjZDEyOTAyNGUwODhhNjdjYzc0MDIwYmJlYTYzYjEzOWIyMjUxNGEwODc5OGUzNDA0ZGRlZjk1MTliM2NkM2E0MzFiMzAyYjBhNmRmMjVmMTQzNzRmZTEzNTZkNmQ1MWMyNDVlNDg1YjU3NjYyNWU3ZWM2ZjQ0YzQyZTlhNjM3ZWQ2YjBiZmY1Y2I2ZjQwNmI3ZWRlZTM4NmJmYjVhODk5ZmE1YWU5ZjI0MTE3YzRiMWZlNjQ5Mjg2NjUxZWNlNDViM2RjMjAwN2NiOGExNjNiZjA1OThkYTQ4MzYxYzU1ZDM5YTY5MTYzZmE4ZmQyNGNmNWY4MzY1NWQyM2RjYTNhZDk2MWM2MmYzNTYyMDg1NTJiYjllZDUyOTA3NzA5Njk2NmQ2NzBjMzU0ZTRhYmM5ODA0ZjE3NDZjMDhjYTE4MjE3YzMyOTA1ZTQ2MmUzNmNlM2JlMzllNzcyYzE4MGU4NjAzOWIyNzgzYTJlYzA3YTI4ZmI1YzU1ZGYwNmY0YzUyYzlkZTJiY2JmNjk1NTgxNzE4Mzk5NTQ5N2NlYTk1NmFlNTE1ZDIyNjE4OThmYTA1MTAxNTcyOGU1YThhYWFjNDJkYWQzMzE3MGQwNDUwN2EzM2E4NTUyMWFiZGYxY2JhNjRlY2ZiODUwNDU4ZGJlZjBhOGFlYTcxNTc1ZDA2MGM3ZGIzOTcwZjg1YTZlMWU0YzdhYmY1YWU4Y2RiMDkzM2Q3MWU4Yzk0ZTA0YTI1NjE5ZGNlZTNkMjI2MWFkMmVlNmJmMTJmZmEwNmQ5OGEwODY0ZDg3NjAyNzMzZWM4NmE2NDUyMWYyYjE4MTc3YjIwMGNiYmUxMTc1NzdhNjE1ZDZjNzcwOTg4YzBiYWQ5NDZlMjA4ZTI0ZmEwNzRlNWFiMzE0M2RiNWJmY2UwZmQxMDhlNGI4MmQxMjBhOTIxMDgwMTFhNzIzYzEyYTc4N2U2ZDc4ODcxOWExMGJkYmE1YjI2OTljMzI3MTg2YWY0ZTIzYzFhOTQ2ODM0YjYxNTBiZGEyNTgzZTljYTJhZDQ0Y2U4ZGJiYmMyZGIwNGRlOGVmOTJlOGVmYzE0MWZiZWNhYTYyODdjNTk0NzRlNmJjMDVkOTliMjk2NGZhMDkwYzNhMjIzM2JhMTg2NTE1YmU3ZWQxZjYxMjk3MGNlZTJkN2FmYjgxYmRkNzYyMTcwNDgxY2QwMDY5MTI3ZDViMDVhYTk5M2I0ZWE5ODhkOGZkZGMxODZmZmI3ZGM5MGE2YzA4ZjRkZjQzNWM5MzQwMjg0OTIzNmMzZmFiNGQyN2M3MDI2YzFkNGRjYjI2MDI2NDZkZWM5NzUxZTc2M2RiYTM3YmRmOGZmOTQwNmFkOWU1MzBlZTVkYjM4MmY0MTMwMDFhZWIwNmE1M2VkOTAyN2Q4MzExNzk3MjdiMDg2NWE4OTE4ZGEzZWRiZWJjZjliMTRlZDQ0Y2U2Y2JhY2VkNGJiMWJkYjdmMTQ0N2U2Y2MyNTRiMzMyMDUxNTEyYmQ3YWY0MjZmYjhmNDAxMzc4Y2QyYmY1OTgzY2EwMWM2NGI5MmVjZjAzMmVhMTVkMTcyMWQwM2Y0ODJkN2NlNmU3NGZlZjZkNTVlNzAyZjQ2OTgwYzgyYjVhODQwMzE5MDBiMWM5ZTU5ZTdjOTdmYmVjN2U4ZjMyM2E5N2E3ZTM2Y2M4OGJlMGYxZDQ1YjdmZjU4NWFjNTRiZDQwN2IyMmI0MTU0YWFjYzhmNmQ3ZWJmNDhlMWQ4MTRjYzVlZDIwZjgwMzdlMGE3OTcxNWVlZjI5YmUzMjgwNmExZDU4YmI3YzVkYTc2ZjU1MGFhM2Q4YTFmYmZmMGViMTljY2IxYTMxM2Q1NWNkYTU2YzllYzJlZjI5NjMyMzg3ZmU4ZDc2ZTNjMDQ2ODA0M2U4ZjY2M2Y0ODYwZWUxMmJmMmQ1YjBiNzQ3NGQ2ZTY5NGY5MWU2ZGJlMTE1OTc0YTM5MjZmMTJmZWU1ZTQzODc3N2NiNmE5MzJkZjhjZDhiZWM0ZDA3M2I5MzFiYTNiYzgzMmI2OGQ5ZGQzMDA3NDFmYTdiZjhhZmM0N2VkMjU3NmY2OTM2YmE0MjQ2NjNhYWI2MzljNWFlNGY1NjgzNDIzYjQ3NDJiZjFjOTc4MjM4ZjE2Y2JlMzlkNjUyZGUzZmRiOGJlZmM4NDhhZDkyMjIyMmUwNGE0MDM3YzA3MTNlYjU3YTgxYTIzZjBjNzM0NzNmYzY0NmNlYTMwNmI0YmNiYzg4NjJmODM4NWRkZmE5ZDRiN2ZhMmMwODdlODc5NjgzMzAzZWQ1YmRkM2EwNjJiM2NmNWIzYTI3OGE2NmQyYTEzZjgzZjQ0ZjgyZGRmMzEwZWUwNzRhYjZhMzY0NTk3ZTg5OWEwMjU1ZGMxNjRmMzFjYzUwODQ2ODUxZGY5YWI0ODE5NWRlZDdlYTFiMWQ1MTBiZDdlZTc0ZDczZmFmMzZiYzMxZWNmYTI2ODM1OTA0NmY0ZWI4NzlmOTI0MDA5NDM4YjQ4MWM2Y2Q3ODg5YTAwMmVkNWVlMzgyYmM5MTkwZGE2ZmMwMjZlNDc5NTU4ZTQ0NzU2NzdlOWFhOWUzMDUwZTI3NjU2OTRkZmM4MWY1NmU4ODBiOTZlNzE2MGM5ODBkZDk4ZWRkM2RmZmZmZmZmZmZmZmZmZmZmZiJ9fScpfSwiLi4vLi4vbm9kZV9tb2R1bGVzL2VsbGlwdGljL3BhY2thZ2UuanNvbiIobW9kdWxlKXsidXNlIHN0cmljdCI7bW9kdWxlLmV4cG9ydHM9e3JFOiI2LjYuMSJ9fSwiLi4vLi4vbm9kZV9tb2R1bGVzL3BhcnNlLWFzbjEvYWVzaWQuanNvbiIobW9kdWxlKXsidXNlIHN0cmljdCI7bW9kdWxlLmV4cG9ydHM9SlNPTi5wYXJzZSgneyIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4xIjoiYWVzLTEyOC1lY2IiLCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4yIjoiYWVzLTEyOC1jYmMiLCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4zIjoiYWVzLTEyOC1vZmIiLCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS40IjoiYWVzLTEyOC1jZmIiLCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4yMSI6ImFlcy0xOTItZWNiIiwiMi4xNi44NDAuMS4xMDEuMy40LjEuMjIiOiJhZXMtMTkyLWNiYyIsIjIuMTYuODQwLjEuMTAxLjMuNC4xLjIzIjoiYWVzLTE5Mi1vZmIiLCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS4yNCI6ImFlcy0xOTItY2ZiIiwiMi4xNi44NDAuMS4xMDEuMy40LjEuNDEiOiJhZXMtMjU2LWVjYiIsIjIuMTYuODQwLjEuMTAxLjMuNC4xLjQyIjoiYWVzLTI1Ni1jYmMiLCIyLjE2Ljg0MC4xLjEwMS4zLjQuMS40MyI6ImFlcy0yNTYtb2ZiIiwiMi4xNi44NDAuMS4xMDEuMy40LjEuNDQiOiJhZXMtMjU2LWNmYiJ9Jyl9fSxfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX189e307ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCl7dmFyIGNhY2hlZE1vZHVsZT1fX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO2lmKHZvaWQgMCE9PWNhY2hlZE1vZHVsZSlyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7dmFyIG1vZHVsZT1fX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdPXtpZDptb2R1bGVJZCxsb2FkZWQ6ITEsZXhwb3J0czp7fX07cmV0dXJuIF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsbW9kdWxlLG1vZHVsZS5leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pLG1vZHVsZS5sb2FkZWQ9ITAsbW9kdWxlLmV4cG9ydHN9X193ZWJwYWNrX3JlcXVpcmVfXy5tPV9fd2VicGFja19tb2R1bGVzX18sX193ZWJwYWNrX3JlcXVpcmVfXy5uPW1vZHVsZT0+e3ZhciBnZXR0ZXI9bW9kdWxlJiZtb2R1bGUuX19lc01vZHVsZT8oKT0+bW9kdWxlLmRlZmF1bHQ6KCk9Pm1vZHVsZTtyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlcix7YTpnZXR0ZXJ9KSxnZXR0ZXJ9LF9fd2VicGFja19yZXF1aXJlX18uZD0oZXhwb3J0cyxkZWZpbml0aW9uKT0+e2Zvcih2YXIga2V5IGluIGRlZmluaXRpb24pX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sa2V5KSYmIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLGtleSkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLGtleSx7ZW51bWVyYWJsZTohMCxnZXQ6ZGVmaW5pdGlvbltrZXldfSl9LF9fd2VicGFja19yZXF1aXJlX18uZz1mdW5jdGlvbigpe2lmKCJvYmplY3QiPT10eXBlb2YgZ2xvYmFsVGhpcylyZXR1cm4gZ2xvYmFsVGhpczt0cnl7cmV0dXJuIHRoaXN8fG5ldyBGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpfWNhdGNoKGUpe2lmKCJvYmplY3QiPT10eXBlb2Ygd2luZG93KXJldHVybiB3aW5kb3d9fSgpLF9fd2VicGFja19yZXF1aXJlX18ubz0ob2JqLHByb3ApPT5PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLHByb3ApLF9fd2VicGFja19yZXF1aXJlX18ucj1leHBvcnRzPT57InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0sX193ZWJwYWNrX3JlcXVpcmVfXy5ubWQ9bW9kdWxlPT4obW9kdWxlLnBhdGhzPVtdLG1vZHVsZS5jaGlsZHJlbnx8KG1vZHVsZS5jaGlsZHJlbj1bXSksbW9kdWxlKSwoKCk9Pnt2YXIgc2NyaXB0VXJsO19fd2VicGFja19yZXF1aXJlX18uZy5pbXBvcnRTY3JpcHRzJiYoc2NyaXB0VXJsPV9fd2VicGFja19yZXF1aXJlX18uZy5sb2NhdGlvbisiIik7dmFyIGRvY3VtZW50PV9fd2VicGFja19yZXF1aXJlX18uZy5kb2N1bWVudDtpZighc2NyaXB0VXJsJiZkb2N1bWVudCYmKGRvY3VtZW50LmN1cnJlbnRTY3JpcHQmJiJTQ1JJUFQiPT09ZG9jdW1lbnQuY3VycmVudFNjcmlwdC50YWdOYW1lLnRvVXBwZXJDYXNlKCkmJihzY3JpcHRVcmw9ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpLCFzY3JpcHRVcmwpKXt2YXIgc2NyaXB0cz1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0Iik7aWYoc2NyaXB0cy5sZW5ndGgpZm9yKHZhciBpPXNjcmlwdHMubGVuZ3RoLTE7aT4tMSYmKCFzY3JpcHRVcmx8fCEvXmh0dHAocz8pOi8udGVzdChzY3JpcHRVcmwpKTspc2NyaXB0VXJsPXNjcmlwdHNbaS0tXS5zcmN9aWYoIXNjcmlwdFVybCl0aHJvdyBuZXcgRXJyb3IoIkF1dG9tYXRpYyBwdWJsaWNQYXRoIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyIik7c2NyaXB0VXJsPXNjcmlwdFVybC5yZXBsYWNlKC9eYmxvYjovLCIiKS5yZXBsYWNlKC8jLiokLywiIikucmVwbGFjZSgvXD8uKiQvLCIiKS5yZXBsYWNlKC9cL1teXC9dKyQvLCIvIiksX193ZWJwYWNrX3JlcXVpcmVfXy5wPXNjcmlwdFVybH0pKCksX193ZWJwYWNrX3JlcXVpcmVfXy5iPXNlbGYubG9jYXRpb24rIiI7dmFyIF9fd2VicGFja19leHBvcnRzX189e307cmV0dXJuKCgpPT57InVzZSBzdHJpY3QiO19fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLHtkZWZhdWx0OigpPT53b3JrZXJ9KTt2YXIgd29ya2VyVGhyZWFkc1BvbHlmaWxsX25hbWVzcGFjZU9iamVjdD17fTtfX3dlYnBhY2tfcmVxdWlyZV9fLnIod29ya2VyVGhyZWFkc1BvbHlmaWxsX25hbWVzcGFjZU9iamVjdCksX193ZWJwYWNrX3JlcXVpcmVfXy5kKHdvcmtlclRocmVhZHNQb2x5ZmlsbF9uYW1lc3BhY2VPYmplY3Qse2lzTWFpblRocmVhZDooKT0+aXNNYWluVGhyZWFkLHBhcmVudFBvcnQ6KCk9PnBhcmVudFBvcnQsd29ya2VyRGF0YTooKT0+d29ya2VyRGF0YX0pO3ZhciBmc1BvbHlmaWxsX25hbWVzcGFjZU9iamVjdD17fTtfX3dlYnBhY2tfcmVxdWlyZV9fLnIoZnNQb2x5ZmlsbF9uYW1lc3BhY2VPYmplY3QpLF9fd2VicGFja19yZXF1aXJlX18uZChmc1BvbHlmaWxsX25hbWVzcGFjZU9iamVjdCx7YWNjZXNzOigpPT5mc1BvbHlmaWxsX2FjY2VzcyxhY2Nlc3NTeW5jOigpPT5hY2Nlc3NTeW5jLGNvbnN0YW50czooKT0+Y29uc3RhbnRzLGNvcHlGaWxlOigpPT5mc1BvbHlmaWxsX2NvcHlGaWxlLGNvcHlGaWxlU3luYzooKT0+Y29weUZpbGVTeW5jLGRlZmF1bHQ6KCk9PmZzUG9seWZpbGwsZXhpc3RzU3luYzooKT0+ZXhpc3RzU3luYyxsc3RhdDooKT0+ZnNQb2x5ZmlsbF9sc3RhdCxsc3RhdFN5bmM6KCk9PmxzdGF0U3luYyxta2RpcjooKT0+ZnNQb2x5ZmlsbF9ta2Rpcixta2RpclN5bmM6KCk9Pm1rZGlyU3luYyxwcm9taXNlczooKT0+cHJvbWlzZXMscmVhZEZpbGU6KCk9PmZzUG9seWZpbGxfcmVhZEZpbGUscmVhZEZpbGVTeW5jOigpPT5yZWFkRmlsZVN5bmMscmVhZGRpcjooKT0+ZnNQb2x5ZmlsbF9yZWFkZGlyLHJlYWRkaXJTeW5jOigpPT5yZWFkZGlyU3luYyxyZWFscGF0aDooKT0+ZnNQb2x5ZmlsbF9yZWFscGF0aCxyZWFscGF0aFN5bmM6KCk9PnJlYWxwYXRoU3luYyxybTooKT0+ZnNQb2x5ZmlsbF9ybSxybVN5bmM6KCk9PnJtU3luYyxybWRpcjooKT0+ZnNQb2x5ZmlsbF9ybWRpcixybWRpclN5bmM6KCk9PnJtZGlyU3luYyxzdGF0OigpPT5mc1BvbHlmaWxsX3N0YXQsc3RhdFN5bmM6KCk9PnN0YXRTeW5jLHdyaXRlRmlsZTooKT0+ZnNQb2x5ZmlsbF93cml0ZUZpbGUsd3JpdGVGaWxlU3luYzooKT0+d3JpdGVGaWxlU3luY30pO3ZhciB1dG9vPV9fd2VicGFja19yZXF1aXJlX18oIi4vc3JjL3V0b28vaW5kZXguanMiKSxidWZmZXI9KF9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zeXN0ZW1qcy9kaXN0L3N5c3RlbS5qcyIpLF9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiKSk7Y2xhc3MgU3RhdHN7Y29uc3RydWN0b3IocmF3KXt0aGlzLnJhdz1yYXcsdGhpcy5kZXY9MCx0aGlzLmlubz0wLHRoaXMubmxpbms9MSx0aGlzLnVpZD0wLHRoaXMuZ2lkPTAsdGhpcy5yZGV2PTAsdGhpcy5ibGtzaXplPTQwOTYsdGhpcy5ibG9ja3M9MCx0aGlzLnNpemU9cmF3LnNpemUsdGhpcy5tb2RlPSJkaXJlY3RvcnkiPT09cmF3LnR5cGU/MTY4Nzc6MzMxODgsdGhpcy5hdGltZU1zPXJhdy5hdGltZU1zfHwwLHRoaXMubXRpbWVNcz1yYXcubXRpbWVNc3x8MCx0aGlzLmN0aW1lTXM9cmF3LmN0aW1lTXN8fDAsdGhpcy5iaXJ0aHRpbWVNcz1yYXcuYmlydGh0aW1lTXN8fDAsdGhpcy5hdGltZT1uZXcgRGF0ZSh0aGlzLmF0aW1lTXMpLHRoaXMubXRpbWU9bmV3IERhdGUodGhpcy5tdGltZU1zKSx0aGlzLmN0aW1lPW5ldyBEYXRlKHRoaXMuY3RpbWVNcyksdGhpcy5iaXJ0aHRpbWU9bmV3IERhdGUodGhpcy5iaXJ0aHRpbWVNcyl9aXNEaXJlY3RvcnkoKXtyZXR1cm4iZGlyZWN0b3J5Ij09PXRoaXMucmF3LnR5cGV9aXNGaWxlKCl7cmV0dXJuImZpbGUiPT09dGhpcy5yYXcudHlwZX1pc1N5bWJvbGljTGluaygpe3JldHVybiExfWlzQmxvY2tEZXZpY2UoKXtyZXR1cm4hMX1pc0NoYXJhY3RlckRldmljZSgpe3JldHVybiExfWlzRklGTygpe3JldHVybiExfWlzU29ja2V0KCl7cmV0dXJuITF9fXZhciBwYXRoX2Jyb3dzZXJpZnk9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3BhdGgtYnJvd3NlcmlmeS9pbmRleC5qcyIpLHBhdGhfYnJvd3NlcmlmeV9kZWZhdWx0PV9fd2VicGFja19yZXF1aXJlX18ubihwYXRoX2Jyb3dzZXJpZnkpO2NvbnN0IGdsb2JhbFNlbGY9c2VsZix3b3JrZXJEYXRhPW5ldyBQcm94eSh7fSx7Z2V0KF90YXJnZXQscHJvcCl7dmFyIF9hO3JldHVybiBudWxsPT09KF9hPWdsb2JhbFNlbGYud29ya2VyRGF0YSl8fHZvaWQgMD09PV9hP3ZvaWQgMDpfYVtwcm9wXX0saGFzOihfdGFyZ2V0LHByb3ApPT5nbG9iYWxTZWxmLndvcmtlckRhdGEmJnByb3AgaW4gZ2xvYmFsU2VsZi53b3JrZXJEYXRhLG93bktleXM6X3RhcmdldD0+Z2xvYmFsU2VsZi53b3JrZXJEYXRhP1JlZmxlY3Qub3duS2V5cyhnbG9iYWxTZWxmLndvcmtlckRhdGEpOltdLGdldE93blByb3BlcnR5RGVzY3JpcHRvcjooX3RhcmdldCxwcm9wKT0+Z2xvYmFsU2VsZi53b3JrZXJEYXRhP09iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZ2xvYmFsU2VsZi53b3JrZXJEYXRhLHByb3ApOnZvaWQgMH0pLGlzTWFpblRocmVhZD0hMSxwYXJlbnRQb3J0PXtwb3N0TWVzc2FnZTptZXNzYWdlPT5zZWxmLnBvc3RNZXNzYWdlKG1lc3NhZ2UpLG9uOihldmVudCxsaXN0ZW5lcik9PnsibWVzc2FnZSI9PT1ldmVudCYmKHNlbGYub25tZXNzYWdlPWU9Pmxpc3RlbmVyKGUuZGF0YSkpfSxvZmY6KGV2ZW50LGxpc3RlbmVyKT0+eyJtZXNzYWdlIj09PWV2ZW50JiYoc2VsZi5vbm1lc3NhZ2U9bnVsbCl9fTtmdW5jdGlvbiByZXNvbHZlUGF0aChwKXt2YXIgX2EsX2I7Y29uc3QgY3dkPShudWxsPT09KF9iPW51bGw9PT0oX2E9c2VsZi5wcm9jZXNzKXx8dm9pZCAwPT09X2E/dm9pZCAwOl9hLmN3ZCl8fHZvaWQgMD09PV9iP3ZvaWQgMDpfYi5jYWxsKF9hKSl8fChudWxsPT13b3JrZXJEYXRhP3ZvaWQgMDp3b3JrZXJEYXRhLmN3ZCl8fCIvIjtyZXR1cm4gcGF0aF9icm93c2VyaWZ5X2RlZmF1bHQoKS5yZXNvbHZlKGN3ZCxwKX1mdW5jdGlvbiBnZXRGcygpe2NvbnN0IGZzPXdvcmtlckRhdGEuZnM7aWYoIWZzKXRocm93IG5ldyBFcnJvcigiRlMgbm90IGluaXRpYWxpemVkIik7cmV0dXJuIGZzfWZ1bmN0aW9uIHRyYW5zbGF0ZUVycm9yKGVycm9yLHBhdGgsc3lzY2FsbCl7Y29uc3QgbWVzc2FnZT1lcnJvci5tZXNzYWdlfHxTdHJpbmcoZXJyb3IpO2lmKG1lc3NhZ2UuaW5jbHVkZXMoKDAsdXRvby5ydikoKSkpe2NvbnN0IGU9bmV3IEVycm9yKGBFTk9FTlQ6IG5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnksICR7c3lzY2FsbH0gJyR7cGF0aH0nYCk7cmV0dXJuIGUuZXJybm89LTIsZS5jb2RlPSJFTk9FTlQiLGUuc3lzY2FsbD1zeXNjYWxsLGUucGF0aD1wYXRoLGV9aWYobWVzc2FnZS5pbmNsdWRlcygoMCx1dG9vLktMKSgpKSl7Y29uc3QgZT1uZXcgRXJyb3IoYEVJU0RJUjogaWxsZWdhbCBvcGVyYXRpb24gb24gYSBkaXJlY3RvcnksICR7c3lzY2FsbH0gJyR7cGF0aH0nYCk7cmV0dXJuIGUuZXJybm89LTIxLGUuY29kZT0iRUlTRElSIixlLnN5c2NhbGw9c3lzY2FsbCxlLnBhdGg9cGF0aCxlfWlmKG1lc3NhZ2UuaW5jbHVkZXMoKDAsdXRvby5VNykoKSkpe2NvbnN0IGU9bmV3IEVycm9yKGBFQUdBSU46IHJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlLCAke3N5c2NhbGx9ICcke3BhdGh9J2ApO3JldHVybiBlLmVycm5vPS0xMSxlLmNvZGU9IkVBR0FJTiIsZS5zeXNjYWxsPXN5c2NhbGwsZS5wYXRoPXBhdGgsZX1pZihtZXNzYWdlLmluY2x1ZGVzKCgwLHV0b28uRFIpKCkpKXtjb25zdCBlPW5ldyBFcnJvcihgRUFDQ0VTOiBwZXJtaXNzaW9uIGRlbmllZCwgJHtzeXNjYWxsfSAnJHtwYXRofSdgKTtyZXR1cm4gZS5lcnJubz0tMTMsZS5jb2RlPSJFQUNDRVMiLGUuc3lzY2FsbD1zeXNjYWxsLGUucGF0aD1wYXRoLGV9aWYobWVzc2FnZS5pbmNsdWRlcygoMCx1dG9vLlI2KSgpKSl7Y29uc3QgZT1uZXcgRXJyb3IoYEVOT1NQQzogbm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UsICR7c3lzY2FsbH0gJyR7cGF0aH0nYCk7cmV0dXJuIGUuZXJybm89LTI4LGUuY29kZT0iRU5PU1BDIixlLnN5c2NhbGw9c3lzY2FsbCxlLnBhdGg9cGF0aCxlfWlmKG1lc3NhZ2UuaW5jbHVkZXMoKDAsdXRvby5XdikoKSkpe2NvbnN0IGU9bmV3IEVycm9yKGBFSU5WQUw6IGludmFsaWQgYXJndW1lbnQsICR7c3lzY2FsbH0gJyR7cGF0aH0nYCk7cmV0dXJuIGUuZXJybm89LTIyLGUuY29kZT0iRUlOVkFMIixlLnN5c2NhbGw9c3lzY2FsbCxlLnBhdGg9cGF0aCxlfWlmKG1lc3NhZ2UuaW5jbHVkZXMoKDAsdXRvby5oOCkoKSkpe2NvbnN0IGU9bmV3IEVycm9yKGBFSU5UUjogaW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwsICR7c3lzY2FsbH0gJyR7cGF0aH0nYCk7cmV0dXJuIGUuZXJybm89LTQsZS5jb2RlPSJFSU5UUiIsZS5zeXNjYWxsPXN5c2NhbGwsZS5wYXRoPXBhdGgsZX1yZXR1cm4gZXJyb3J9Y29uc3QgcHJvbWlzZXM9e3JlYWRGaWxlOmFzeW5jKHAsb3B0aW9ucyk9Pntjb25zdCBlbmNvZGluZz0idXRmOCI9PT1vcHRpb25zfHwidXRmLTgiPT09b3B0aW9uc3x8InV0ZjgiPT09KG51bGw9PW9wdGlvbnM/dm9pZCAwOm9wdGlvbnMuZW5jb2RpbmcpfHwidXRmLTgiPT09KG51bGw9PW9wdGlvbnM/dm9pZCAwOm9wdGlvbnMuZW5jb2RpbmcpPyJ1dGY4Ijp2b2lkIDAsZnM9Z2V0RnMoKSxyZXNvbHZlZFBhdGg9cmVzb2x2ZVBhdGgocCk7dHJ5e2NvbnN0IGRhdGE9YXdhaXQoZW5jb2Rpbmc/ZnMucmVhZFRvU3RyaW5nKHJlc29sdmVkUGF0aCk6ZnMucmVhZChyZXNvbHZlZFBhdGgpKTtyZXR1cm4gZW5jb2Rpbmc/ZGF0YTpidWZmZXIuQnVmZmVyLmZyb20oZGF0YSl9Y2F0Y2goZSl7dGhyb3cgdHJhbnNsYXRlRXJyb3IoZSxwLCJvcGVuIil9fSx3cml0ZUZpbGU6YXN5bmMocCxkYXRhLG9wdGlvbnMpPT57Y29uc3QgZnM9Z2V0RnMoKSxyZXNvbHZlZFBhdGg9cmVzb2x2ZVBhdGgocCk7dHJ5eyJzdHJpbmciPT10eXBlb2YgZGF0YT9hd2FpdCBmcy53cml0ZVN0cmluZyhyZXNvbHZlZFBhdGgsZGF0YSk6YXdhaXQgZnMud3JpdGUocmVzb2x2ZWRQYXRoLGRhdGEpfWNhdGNoKGUpe3Rocm93IHRyYW5zbGF0ZUVycm9yKGUscCwib3BlbiIpfX0scmVhZGRpcjphc3luYyhwLG9wdGlvbnMpPT57Y29uc3QgcmVzb2x2ZWRQYXRoPXJlc29sdmVQYXRoKHApO3RyeXtyZXR1cm4oYXdhaXQgZ2V0RnMoKS5yZWFkRGlyKHJlc29sdmVkUGF0aCkpLm1hcChlPT57Y29uc3QganNvbj1lLnRvSlNPTigpO3JldHVybihudWxsPT1vcHRpb25zP3ZvaWQgMDpvcHRpb25zLndpdGhGaWxlVHlwZXMpP3tuYW1lOmpzb24ubmFtZSxpc0ZpbGU6KCk9PiJmaWxlIj09PWpzb24udHlwZSxpc0RpcmVjdG9yeTooKT0+ImRpcmVjdG9yeSI9PT1qc29uLnR5cGUsaXNTeW1ib2xpY0xpbms6KCk9PiExfTpqc29uLm5hbWV9KX1jYXRjaChlKXt0aHJvdyB0cmFuc2xhdGVFcnJvcihlLHAsInNjYW5kaXIiKX19LG1rZGlyOmFzeW5jKHAsb3B0aW9ucyk9Pntjb25zdCBmcz1nZXRGcygpLHJlc29sdmVkUGF0aD1yZXNvbHZlUGF0aChwKTt0cnl7KG51bGw9PW9wdGlvbnM/dm9pZCAwOm9wdGlvbnMucmVjdXJzaXZlKT9hd2FpdCBmcy5jcmVhdGVEaXJBbGwocmVzb2x2ZWRQYXRoKTphd2FpdCBmcy5jcmVhdGVEaXIocmVzb2x2ZWRQYXRoKX1jYXRjaChlKXt0aHJvdyB0cmFuc2xhdGVFcnJvcihlLHAsIm1rZGlyIil9fSxybTphc3luYyhwLG9wdGlvbnMpPT57Y29uc3QgZnM9Z2V0RnMoKSxyZXNvbHZlZFBhdGg9cmVzb2x2ZVBhdGgocCk7dHJ5e2NvbnN0IG1ldGFkYXRhPWF3YWl0IGZzLm1ldGFkYXRhKHJlc29sdmVkUGF0aCk7ImZpbGUiPT09bWV0YWRhdGEudG9KU09OKCkudHlwZT9hd2FpdCBmcy5yZW1vdmVGaWxlKHJlc29sdmVkUGF0aCk6YXdhaXQgZnMucmVtb3ZlRGlyKHJlc29sdmVkUGF0aCwhIShudWxsPT1vcHRpb25zP3ZvaWQgMDpvcHRpb25zLnJlY3Vyc2l2ZSkpfWNhdGNoKGUpe3Rocm93IHRyYW5zbGF0ZUVycm9yKGUscCwicm0iKX19LHJtZGlyOmFzeW5jKHAsb3B0aW9ucyk9Pntjb25zdCByZXNvbHZlZFBhdGg9cmVzb2x2ZVBhdGgocCk7dHJ5e3JldHVybiBhd2FpdCBnZXRGcygpLnJlbW92ZURpcihyZXNvbHZlZFBhdGgsISEobnVsbD09b3B0aW9ucz92b2lkIDA6b3B0aW9ucy5yZWN1cnNpdmUpKX1jYXRjaChlKXt0aHJvdyB0cmFuc2xhdGVFcnJvcihlLHAsInJtZGlyIil9fSxjb3B5RmlsZTphc3luYyhzcmMsZHN0KT0+e3RyeXtyZXR1cm4gYXdhaXQgZ2V0RnMoKS5jb3B5RmlsZShyZXNvbHZlUGF0aChzcmMpLHJlc29sdmVQYXRoKGRzdCkpfWNhdGNoKGUpe3Rocm93IHRyYW5zbGF0ZUVycm9yKGUsc3JjLCJjb3B5ZmlsZSIpfX0sc3RhdDphc3luYyBwPT57Y29uc3QgcmVzb2x2ZWRQYXRoPXJlc29sdmVQYXRoKHApO3RyeXtjb25zdCBqc29uPShhd2FpdCBnZXRGcygpLm1ldGFkYXRhKHJlc29sdmVkUGF0aCkpLnRvSlNPTigpO3JldHVybiBuZXcgU3RhdHMoe3R5cGU6anNvbi50eXBlLHNpemU6TnVtYmVyKGpzb24uZmlsZV9zaXplfHwwKX0pfWNhdGNoKGUpe3Rocm93IHRyYW5zbGF0ZUVycm9yKGUscCwic3RhdCIpfX0sbHN0YXQ6YXN5bmMgcD0+e2NvbnN0IHJlc29sdmVkUGF0aD1yZXNvbHZlUGF0aChwKTt0cnl7Y29uc3QganNvbj0oYXdhaXQgZ2V0RnMoKS5tZXRhZGF0YShyZXNvbHZlZFBhdGgpKS50b0pTT04oKTtyZXR1cm4gbmV3IFN0YXRzKHt0eXBlOmpzb24udHlwZSxzaXplOk51bWJlcihqc29uLmZpbGVfc2l6ZXx8MCl9KX1jYXRjaChlKXt0aHJvdyB0cmFuc2xhdGVFcnJvcihlLHAsImxzdGF0Iil9fSxyZWFscGF0aDphc3luYyBwPT5wLGFjY2Vzczphc3luYyhwLG1vZGUpPT57Y29uc3QgcmVzb2x2ZWRQYXRoPXJlc29sdmVQYXRoKHApO3RyeXthd2FpdCBnZXRGcygpLm1ldGFkYXRhKHJlc29sdmVkUGF0aCl9Y2F0Y2goZSl7dGhyb3cgdHJhbnNsYXRlRXJyb3IoZSxwLCJhY2Nlc3MiKX19fSx0ZXh0RGVjb2Rlcj0ocHJvbWlzZXMucmVhZEZpbGUscHJvbWlzZXMud3JpdGVGaWxlLHByb21pc2VzLnJlYWRkaXIscHJvbWlzZXMubWtkaXIscHJvbWlzZXMucm0scHJvbWlzZXMucm1kaXIscHJvbWlzZXMuY29weUZpbGUscHJvbWlzZXMuc3RhdCxwcm9taXNlcy5sc3RhdCxwcm9taXNlcy5yZWFscGF0aCxwcm9taXNlcy5hY2Nlc3MsbmV3IFRleHREZWNvZGVyKTtmdW5jdGlvbiByZWFkRmlsZVN5bmMocGF0aCxvcHRpb25zKXtjb25zdCBmcz1nZXRGcygpLHJlc29sdmVkUGF0aD1yZXNvbHZlUGF0aChwYXRoKTt0cnl7Y29uc3QgcmVzdWx0PWZzLnJlYWRTeW5jKHJlc29sdmVkUGF0aCk7cmV0dXJuInV0ZjgiPT09b3B0aW9uc3x8InV0Zi04Ij09PW9wdGlvbnN8fG9wdGlvbnMmJigidXRmOCI9PT1vcHRpb25zLmVuY29kaW5nfHwidXRmLTgiPT09b3B0aW9ucy5lbmNvZGluZyk/dGV4dERlY29kZXIuZGVjb2RlKHJlc3VsdCk6YnVmZmVyLkJ1ZmZlci5mcm9tKHJlc3VsdCl9Y2F0Y2goZSl7dGhyb3cgdHJhbnNsYXRlRXJyb3IoZSxwYXRoLCJvcGVuIil9fWZ1bmN0aW9uIHJlYWRkaXJTeW5jKHBhdGgsb3B0aW9ucyl7Y29uc3QgZnM9Z2V0RnMoKSxyZXNvbHZlZFBhdGg9cmVzb2x2ZVBhdGgocGF0aCk7dHJ5e2NvbnN0IGVudHJpZXM9ZnMucmVhZERpclN5bmMocmVzb2x2ZWRQYXRoKTtyZXR1cm4obnVsbD09b3B0aW9ucz92b2lkIDA6b3B0aW9ucy53aXRoRmlsZVR5cGVzKT9lbnRyaWVzLm1hcChlPT4oe25hbWU6ZS5uYW1lLGlzRmlsZTooKT0+ImZpbGUiPT09ZS50eXBlLGlzRGlyZWN0b3J5OigpPT4iZGlyZWN0b3J5Ij09PWUudHlwZSxpc1N5bWJvbGljTGluazooKT0+ITF9KSk6ZW50cmllcy5tYXAoZT0+ZS5uYW1lKX1jYXRjaChlKXt0aHJvdyB0cmFuc2xhdGVFcnJvcihlLHBhdGgsInNjYW5kaXIiKX19ZnVuY3Rpb24gd3JpdGVGaWxlU3luYyhwYXRoLGRhdGEsb3B0aW9ucyl7Y29uc3QgZnM9Z2V0RnMoKSxyZXNvbHZlZFBhdGg9cmVzb2x2ZVBhdGgocGF0aCk7dHJ5e2xldCBjb250ZW50O2NvbnRlbnQ9InN0cmluZyI9PXR5cGVvZiBkYXRhPyhuZXcgVGV4dEVuY29kZXIpLmVuY29kZShkYXRhKTpkYXRhLGZzLndyaXRlU3luYyhyZXNvbHZlZFBhdGgsY29udGVudCl9Y2F0Y2goZSl7dGhyb3cgdHJhbnNsYXRlRXJyb3IoZSxwYXRoLCJvcGVuIil9fWZ1bmN0aW9uIG1rZGlyU3luYyhwYXRoLG9wdGlvbnMpe2NvbnN0IGZzPWdldEZzKCkscmVzb2x2ZWRQYXRoPXJlc29sdmVQYXRoKHBhdGgpO3RyeXsobnVsbD09b3B0aW9ucz92b2lkIDA6b3B0aW9ucy5yZWN1cnNpdmUpfHwhMT9mcy5jcmVhdGVEaXJBbGxTeW5jKHJlc29sdmVkUGF0aCk6ZnMuY3JlYXRlRGlyU3luYyhyZXNvbHZlZFBhdGgpfWNhdGNoKGUpe3Rocm93IHRyYW5zbGF0ZUVycm9yKGUscGF0aCwibWtkaXIiKX19ZnVuY3Rpb24gcm1TeW5jKHBhdGgsb3B0aW9ucyl7Y29uc3QgZnM9Z2V0RnMoKSxyZXNvbHZlZFBhdGg9cmVzb2x2ZVBhdGgocGF0aCk7dHJ5eyhudWxsPT1vcHRpb25zP3ZvaWQgMDpvcHRpb25zLnJlY3Vyc2l2ZSl8fCExP2ZzLnJlbW92ZURpclN5bmMocmVzb2x2ZWRQYXRoLCEwKTpmcy5yZW1vdmVGaWxlU3luYyhyZXNvbHZlZFBhdGgpfWNhdGNoKGUpe3Rocm93IHRyYW5zbGF0ZUVycm9yKGUscGF0aCwicm0iKX19ZnVuY3Rpb24gcm1kaXJTeW5jKHBhdGgsb3B0aW9ucyl7Y29uc3QgZnM9Z2V0RnMoKSxyZXNvbHZlZFBhdGg9cmVzb2x2ZVBhdGgocGF0aCk7dHJ5e2NvbnN0IHJlY3Vyc2l2ZT0obnVsbD09b3B0aW9ucz92b2lkIDA6b3B0aW9ucy5yZWN1cnNpdmUpfHwhMTtmcy5yZW1vdmVEaXJTeW5jKHJlc29sdmVkUGF0aCxyZWN1cnNpdmUpfWNhdGNoKGUpe3Rocm93IHRyYW5zbGF0ZUVycm9yKGUscGF0aCwicm1kaXIiKX19ZnVuY3Rpb24gY29weUZpbGVTeW5jKHNyYyxkc3Qpe2NvbnN0IGZzPWdldEZzKCk7dHJ5e2ZzLmNvcHlGaWxlU3luYyhyZXNvbHZlUGF0aChzcmMpLHJlc29sdmVQYXRoKGRzdCkpfWNhdGNoKGUpe3Rocm93IHRyYW5zbGF0ZUVycm9yKGUsc3JjLCJjb3B5ZmlsZSIpfX1mdW5jdGlvbiBzdGF0U3luYyhwKXtjb25zdCBmcz1nZXRGcygpLHJlc29sdmVkUGF0aD1yZXNvbHZlUGF0aChwKTt0cnl7Y29uc3QgbWV0YWRhdGE9ZnMubWV0YWRhdGFTeW5jKHJlc29sdmVkUGF0aCk7bGV0IHR5cGUsc2l6ZTtpZigiZnVuY3Rpb24iPT10eXBlb2YgbWV0YWRhdGEudG9KU09OKXtjb25zdCBqc29uPW1ldGFkYXRhLnRvSlNPTigpO3R5cGU9anNvbi50eXBlLHNpemU9anNvbi5maWxlX3NpemV9ZWxzZSB0eXBlPW1ldGFkYXRhLnR5cGUsc2l6ZT1tZXRhZGF0YS5maWxlX3NpemU7cmV0dXJuIG5ldyBTdGF0cyh7dHlwZToiZGlyZWN0b3J5Ij09PXR5cGU/ImRpcmVjdG9yeSI6ImZpbGUiLHNpemU6TnVtYmVyKHNpemV8fDApLGF0aW1lTXM6RGF0ZS5ub3coKSxtdGltZU1zOkRhdGUubm93KCksY3RpbWVNczpEYXRlLm5vdygpLGJpcnRodGltZU1zOkRhdGUubm93KCl9KX1jYXRjaChlKXt0aHJvdyB0cmFuc2xhdGVFcnJvcihlLHAsInN0YXQiKX19ZnVuY3Rpb24gbHN0YXRTeW5jKHApe2NvbnN0IGZzPWdldEZzKCkscmVzb2x2ZWRQYXRoPXJlc29sdmVQYXRoKHApO3RyeXtjb25zdCBtZXRhZGF0YT1mcy5tZXRhZGF0YVN5bmMocmVzb2x2ZWRQYXRoKTtsZXQgdHlwZSxzaXplO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBtZXRhZGF0YS50b0pTT04pe2NvbnN0IGpzb249bWV0YWRhdGEudG9KU09OKCk7dHlwZT1qc29uLnR5cGUsc2l6ZT1qc29uLmZpbGVfc2l6ZX1lbHNlIHR5cGU9bWV0YWRhdGEudHlwZSxzaXplPW1ldGFkYXRhLmZpbGVfc2l6ZTtyZXR1cm4gbmV3IFN0YXRzKHt0eXBlOiJkaXJlY3RvcnkiPT09dHlwZT8iZGlyZWN0b3J5IjoiZmlsZSIsc2l6ZTpOdW1iZXIoc2l6ZXx8MCksYXRpbWVNczpEYXRlLm5vdygpLG10aW1lTXM6RGF0ZS5ub3coKSxjdGltZU1zOkRhdGUubm93KCksYmlydGh0aW1lTXM6RGF0ZS5ub3coKX0pfWNhdGNoKGUpe3Rocm93IHRyYW5zbGF0ZUVycm9yKGUscCwibHN0YXQiKX19ZnVuY3Rpb24gcmVhbHBhdGhTeW5jKHApe3JldHVybiBwfWZ1bmN0aW9uIGFjY2Vzc1N5bmMocCxtb2RlKXtjb25zdCBmcz1nZXRGcygpLHJlc29sdmVkUGF0aD1yZXNvbHZlUGF0aChwKTt0cnl7ZnMubWV0YWRhdGFTeW5jKHJlc29sdmVkUGF0aCl9Y2F0Y2goZSl7dGhyb3cgdHJhbnNsYXRlRXJyb3IoZSxwLCJhY2Nlc3MiKX19ZnVuY3Rpb24gZXhpc3RzU3luYyhwYXRoKXt0cnl7cmV0dXJuIHN0YXRTeW5jKHBhdGgpLCEwfWNhdGNoKGUpe3JldHVybiExfX1mdW5jdGlvbiBmc1BvbHlmaWxsX3JlYWRGaWxlKHBhdGgsb3B0aW9ucyxjYil7ImZ1bmN0aW9uIj09dHlwZW9mIG9wdGlvbnMmJihjYj1vcHRpb25zLG9wdGlvbnM9e30pO2NvbnN0IGVuY29kaW5nPSJ1dGY4Ij09PW9wdGlvbnN8fCJ1dGYtOCI9PT1vcHRpb25zfHwidXRmOCI9PT0obnVsbD09b3B0aW9ucz92b2lkIDA6b3B0aW9ucy5lbmNvZGluZyl8fCJ1dGYtOCI9PT0obnVsbD09b3B0aW9ucz92b2lkIDA6b3B0aW9ucy5lbmNvZGluZyk/InV0ZjgiOnZvaWQgMCxyZXNvbHZlZFBhdGg9cmVzb2x2ZVBhdGgocGF0aCksZnM9Z2V0RnMoKTsoZW5jb2Rpbmc/ZnMucmVhZFRvU3RyaW5nKHJlc29sdmVkUGF0aCk6ZnMucmVhZChyZXNvbHZlZFBhdGgpKS50aGVuKGRhdGE9PmNiKG51bGwsZW5jb2Rpbmc/ZGF0YTpidWZmZXIuQnVmZmVyLmZyb20oZGF0YSkpLGU9PmNiKHRyYW5zbGF0ZUVycm9yKGUscGF0aCwib3BlbiIpKSl9ZnVuY3Rpb24gZnNQb2x5ZmlsbF9yZWFkZGlyKHBhdGgsb3B0aW9ucyxjYil7ImZ1bmN0aW9uIj09dHlwZW9mIG9wdGlvbnMmJihjYj1vcHRpb25zLG9wdGlvbnM9e30pLGdldEZzKCkucmVhZERpcihyZXNvbHZlUGF0aChwYXRoKSkudGhlbihlbnRyaWVzPT57Y29uc3QgcmVzdWx0PWVudHJpZXMubWFwKGU9Pntjb25zdCBqc29uPWUudG9KU09OKCk7cmV0dXJuKG51bGw9PW9wdGlvbnM/dm9pZCAwOm9wdGlvbnMud2l0aEZpbGVUeXBlcyk/e25hbWU6anNvbi5uYW1lLGlzRmlsZTooKT0+ImZpbGUiPT09anNvbi50eXBlLGlzRGlyZWN0b3J5OigpPT4iZGlyZWN0b3J5Ij09PWpzb24udHlwZSxpc1N5bWJvbGljTGluazooKT0+ITF9Ompzb24ubmFtZX0pO2NiKG51bGwscmVzdWx0KX0sZT0+Y2IodHJhbnNsYXRlRXJyb3IoZSxwYXRoLCJzY2FuZGlyIikpKX1mdW5jdGlvbiBmc1BvbHlmaWxsX3dyaXRlRmlsZShwYXRoLGRhdGEsb3B0aW9ucyxjYil7ImZ1bmN0aW9uIj09dHlwZW9mIG9wdGlvbnMmJihjYj1vcHRpb25zLG9wdGlvbnM9e30pO2NvbnN0IHJlc29sdmVkUGF0aD1yZXNvbHZlUGF0aChwYXRoKSxmcz1nZXRGcygpOygic3RyaW5nIj09dHlwZW9mIGRhdGE/ZnMud3JpdGVTdHJpbmcocmVzb2x2ZWRQYXRoLGRhdGEpOmZzLndyaXRlKHJlc29sdmVkUGF0aCxkYXRhKSkudGhlbigoKT0+Y2IobnVsbCksZT0+Y2IodHJhbnNsYXRlRXJyb3IoZSxwYXRoLCJvcGVuIikpKX1mdW5jdGlvbiBmc1BvbHlmaWxsX21rZGlyKHBhdGgsb3B0aW9ucyxjYil7ImZ1bmN0aW9uIj09dHlwZW9mIG9wdGlvbnMmJihjYj1vcHRpb25zLG9wdGlvbnM9e30pO2NvbnN0IHJlc29sdmVkUGF0aD1yZXNvbHZlUGF0aChwYXRoKSxmcz1nZXRGcygpOygobnVsbD09b3B0aW9ucz92b2lkIDA6b3B0aW9ucy5yZWN1cnNpdmUpP2ZzLmNyZWF0ZURpckFsbChyZXNvbHZlZFBhdGgpOmZzLmNyZWF0ZURpcihyZXNvbHZlZFBhdGgpKS50aGVuKCgpPT5jYihudWxsKSxlPT5jYih0cmFuc2xhdGVFcnJvcihlLHBhdGgsIm1rZGlyIikpKX1mdW5jdGlvbiBmc1BvbHlmaWxsX3JtKHBhdGgsb3B0aW9ucyxjYil7ImZ1bmN0aW9uIj09dHlwZW9mIG9wdGlvbnMmJihjYj1vcHRpb25zLG9wdGlvbnM9e30pO2NvbnN0IHJlc29sdmVkUGF0aD1yZXNvbHZlUGF0aChwYXRoKSxmcz1nZXRGcygpO2ZzLm1ldGFkYXRhKHJlc29sdmVkUGF0aCkudGhlbihtZXRhZGF0YT0+ImZpbGUiPT09bWV0YWRhdGEudG9KU09OKCkudHlwZT9mcy5yZW1vdmVGaWxlKHJlc29sdmVkUGF0aCk6ZnMucmVtb3ZlRGlyKHJlc29sdmVkUGF0aCwhIShudWxsPT1vcHRpb25zP3ZvaWQgMDpvcHRpb25zLnJlY3Vyc2l2ZSkpKS50aGVuKCgpPT5jYihudWxsKSxlPT5jYih0cmFuc2xhdGVFcnJvcihlLHBhdGgsInJtIikpKX1mdW5jdGlvbiBmc1BvbHlmaWxsX3JtZGlyKHBhdGgsb3B0aW9ucyxjYil7ImZ1bmN0aW9uIj09dHlwZW9mIG9wdGlvbnMmJihjYj1vcHRpb25zLG9wdGlvbnM9e30pLGdldEZzKCkucmVtb3ZlRGlyKHJlc29sdmVQYXRoKHBhdGgpLCEhKG51bGw9PW9wdGlvbnM/dm9pZCAwOm9wdGlvbnMucmVjdXJzaXZlKSkudGhlbigoKT0+Y2IobnVsbCksZT0+Y2IodHJhbnNsYXRlRXJyb3IoZSxwYXRoLCJybWRpciIpKSl9ZnVuY3Rpb24gZnNQb2x5ZmlsbF9jb3B5RmlsZShzcmMsZHN0LGNiKXtnZXRGcygpLmNvcHlGaWxlKHJlc29sdmVQYXRoKHNyYykscmVzb2x2ZVBhdGgoZHN0KSkudGhlbigoKT0+Y2IobnVsbCksZT0+Y2IodHJhbnNsYXRlRXJyb3IoZSxzcmMsImNvcHlmaWxlIikpKX1mdW5jdGlvbiBmc1BvbHlmaWxsX3N0YXQocCxjYil7Z2V0RnMoKS5tZXRhZGF0YShyZXNvbHZlUGF0aChwKSkudGhlbihtZXRhZGF0YT0+e2NvbnN0IGpzb249bWV0YWRhdGEudG9KU09OKCk7Y2IobnVsbCxuZXcgU3RhdHMoe3R5cGU6anNvbi50eXBlLHNpemU6TnVtYmVyKGpzb24uZmlsZV9zaXplfHwwKX0pKX0sZT0+Y2IodHJhbnNsYXRlRXJyb3IoZSxwLCJzdGF0IikpKX1mdW5jdGlvbiBmc1BvbHlmaWxsX2xzdGF0KHAsY2Ipe2dldEZzKCkubWV0YWRhdGEocmVzb2x2ZVBhdGgocCkpLnRoZW4obWV0YWRhdGE9Pntjb25zdCBqc29uPW1ldGFkYXRhLnRvSlNPTigpO2NiKG51bGwsbmV3IFN0YXRzKHt0eXBlOmpzb24udHlwZSxzaXplOk51bWJlcihqc29uLmZpbGVfc2l6ZXx8MCl9KSl9LGU9PmNiKHRyYW5zbGF0ZUVycm9yKGUscCwibHN0YXQiKSkpfWZ1bmN0aW9uIGZzUG9seWZpbGxfcmVhbHBhdGgocCxjYil7Y2IobnVsbCxwKX1mdW5jdGlvbiBmc1BvbHlmaWxsX2FjY2VzcyhwLG1vZGUsY2IpeyJmdW5jdGlvbiI9PXR5cGVvZiBtb2RlJiYoY2I9bW9kZSxtb2RlPTApLGdldEZzKCkubWV0YWRhdGEocmVzb2x2ZVBhdGgocCkpLnRoZW4oKCk9PntjYiYmY2IobnVsbCl9LGU9PntjYiYmY2IodHJhbnNsYXRlRXJyb3IoZSxwLCJhY2Nlc3MiKSl9KX1jb25zdCBjb25zdGFudHM9e0ZfT0s6MCxSX09LOjQsV19PSzoyLFhfT0s6MX0sZnNQb2x5ZmlsbD17cmVhZEZpbGU6ZnNQb2x5ZmlsbF9yZWFkRmlsZSxyZWFkRmlsZVN5bmMscmVhZGRpcjpmc1BvbHlmaWxsX3JlYWRkaXIscmVhZGRpclN5bmMsd3JpdGVGaWxlOmZzUG9seWZpbGxfd3JpdGVGaWxlLHdyaXRlRmlsZVN5bmMsbWtkaXI6ZnNQb2x5ZmlsbF9ta2Rpcixta2RpclN5bmMscm06ZnNQb2x5ZmlsbF9ybSxybVN5bmMscm1kaXI6ZnNQb2x5ZmlsbF9ybWRpcixybWRpclN5bmMsY29weUZpbGU6ZnNQb2x5ZmlsbF9jb3B5RmlsZSxjb3B5RmlsZVN5bmMsc3RhdDpmc1BvbHlmaWxsX3N0YXQsc3RhdFN5bmMsbHN0YXQ6ZnNQb2x5ZmlsbF9sc3RhdCxsc3RhdFN5bmMscmVhbHBhdGg6ZnNQb2x5ZmlsbF9yZWFscGF0aCxyZWFscGF0aFN5bmMsYWNjZXNzOmZzUG9seWZpbGxfYWNjZXNzLGFjY2Vzc1N5bmMsZXhpc3RzU3luYyxwcm9taXNlcyxjb25zdGFudHN9LG5vZGVQb2x5RmlsbHNfYnVmZmVyPV9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiKTtzZWxmLkJ1ZmZlcj1ub2RlUG9seUZpbGxzX2J1ZmZlci5CdWZmZXI7Y29uc3QgcHJvY2Vzcz1fX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbm9kZS1zdGRsaWItYnJvd3Nlci9janMvcHJveHkvcHJvY2Vzcy5qcyIpLG9yaWdpbmFsQ3dkPXByb2Nlc3MuY3dkO3Byb2Nlc3MuY3dkPSgpPT57dmFyIF9hO3JldHVybihudWxsPT09KF9hPXdvcmtlckRhdGEpfHx2b2lkIDA9PT1fYT92b2lkIDA6X2EuY3dkKXx8KG51bGw9PW9yaWdpbmFsQ3dkP3ZvaWQgMDpvcmlnaW5hbEN3ZCgpKXx8Ii8ifSxwcm9jZXNzLnZlcnNpb25zfHwocHJvY2Vzcy52ZXJzaW9ucz17fSkscHJvY2Vzcy52ZXJzaW9ucy5ub2RlfHwocHJvY2Vzcy52ZXJzaW9ucy5ub2RlPSIyNC4wLjAiKSxzZWxmLnByb2Nlc3M9cHJvY2VzcyxzZWxmLmdsb2JhbD1zZWxmO2NvbnN0IHBhdGg9X193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3BhdGgtYnJvd3NlcmlmeS9pbmRleC5qcyIpLG9yaWdpbmFsUmVzb2x2ZT1wYXRoLnJlc29sdmU7cGF0aC5yZXNvbHZlPSguLi5hcmdzKT0+e3ZhciBfYTtjb25zdCBjd2Q9KG51bGw9PT0oX2E9d29ya2VyRGF0YSl8fHZvaWQgMD09PV9hP3ZvaWQgMDpfYS5jd2QpfHwiLyI7cmV0dXJuIG9yaWdpbmFsUmVzb2x2ZShjd2QsLi4uYXJncyl9O2NvbnN0IHdvcmtlclRocmVhZHNXaXRoV29ya2VyRGF0YT17Li4ud29ya2VyVGhyZWFkc1BvbHlmaWxsX25hbWVzcGFjZU9iamVjdCxnZXQgd29ya2VyRGF0YSgpe3JldHVybiB3b3JrZXJEYXRhfSxnZXQgdGhyZWFkSWQoKXt2YXIgX2E7cmV0dXJuKG51bGw9PT0oX2E9d29ya2VyRGF0YSl8fHZvaWQgMD09PV9hP3ZvaWQgMDpfYS50aHJlYWRJZCl8fDB9fSxub2RlUG9seUZpbGxzPXtnZXQgYXNzZXJ0KCl7cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9hc3NlcnQvYnVpbGQvYXNzZXJ0LmpzIil9LGdldCJub2RlOmFzc2VydCIoKXtyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2Fzc2VydC9idWlsZC9hc3NlcnQuanMiKX0sYnVmZmVyOm5vZGVQb2x5RmlsbHNfYnVmZmVyLCJub2RlOmJ1ZmZlciI6bm9kZVBvbHlGaWxsc19idWZmZXIsZ2V0IGNoaWxkX3Byb2Nlc3MoKXtyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL25vZGUtc3RkbGliLWJyb3dzZXIvY2pzL21vY2svZW1wdHkuanMiKX0sZ2V0Im5vZGU6Y2hpbGRfcHJvY2VzcyIoKXtyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL25vZGUtc3RkbGliLWJyb3dzZXIvY2pzL21vY2svZW1wdHkuanMiKX0sZ2V0IGNsdXN0ZXIoKXtyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL25vZGUtc3RkbGliLWJyb3dzZXIvY2pzL21vY2svZW1wdHkuanMiKX0sZ2V0Im5vZGU6Y2x1c3RlciIoKXtyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL25vZGUtc3RkbGliLWJyb3dzZXIvY2pzL21vY2svZW1wdHkuanMiKX0sZ2V0IGNvbnNvbGUoKXtyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2NvbnNvbGUtYnJvd3NlcmlmeS9pbmRleC5qcyIpfSxnZXQibm9kZTpjb25zb2xlIigpe3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvY29uc29sZS1icm93c2VyaWZ5L2luZGV4LmpzIil9LGdldCBjb25zdGFudHMoKXtyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2NvbnN0YW50cy1icm93c2VyaWZ5L2NvbnN0YW50cy5qc29uIil9LGdldCJub2RlOmNvbnN0YW50cyIoKXtyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2NvbnN0YW50cy1icm93c2VyaWZ5L2NvbnN0YW50cy5qc29uIil9LGdldCBjcnlwdG8oKXtyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2NyeXB0by1icm93c2VyaWZ5L2luZGV4LmpzIil9LGdldCJub2RlOmNyeXB0byIoKXtyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2NyeXB0by1icm93c2VyaWZ5L2luZGV4LmpzIil9LGdldCBkZ3JhbSgpe3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbm9kZS1zdGRsaWItYnJvd3Nlci9janMvbW9jay9lbXB0eS5qcyIpfSxnZXQibm9kZTpkZ3JhbSIoKXtyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL25vZGUtc3RkbGliLWJyb3dzZXIvY2pzL21vY2svZW1wdHkuanMiKX0sZ2V0IGRucygpe3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbm9kZS1zdGRsaWItYnJvd3Nlci9janMvbW9jay9lbXB0eS5qcyIpfSxnZXQibm9kZTpkbnMiKCl7cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9ub2RlLXN0ZGxpYi1icm93c2VyL2Nqcy9tb2NrL2VtcHR5LmpzIil9LGdldCBkb21haW4oKXtyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2RvbWFpbi1icm93c2VyL3NvdXJjZS9pbmRleC5qcyIpfSxnZXQibm9kZTpkb21haW4iKCl7cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9kb21haW4tYnJvd3Nlci9zb3VyY2UvaW5kZXguanMiKX0sZ2V0IGV2ZW50cygpe3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIpfSxnZXQibm9kZTpldmVudHMiKCl7cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9ldmVudHMvZXZlbnRzLmpzIil9LGdldCBodHRwKCl7cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0taHR0cC9pbmRleC5qcyIpfSxnZXQibm9kZTpodHRwIigpe3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvc3RyZWFtLWh0dHAvaW5kZXguanMiKX0sZ2V0IGh0dHAyKCl7cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9ub2RlLXN0ZGxpYi1icm93c2VyL2Nqcy9tb2NrL2VtcHR5LmpzIil9LGdldCJub2RlOmh0dHAyIigpe3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbm9kZS1zdGRsaWItYnJvd3Nlci9janMvbW9jay9lbXB0eS5qcyIpfSxnZXQgaHR0cHMoKXtyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL2h0dHBzLWJyb3dzZXJpZnkvaW5kZXguanMiKX0sZ2V0Im5vZGU6aHR0cHMiKCl7cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9odHRwcy1icm93c2VyaWZ5L2luZGV4LmpzIil9LGdldCBtb2R1bGUoKXtyZXR1cm57Y3JlYXRlUmVxdWlyZTpzZWxmLmNyZWF0ZVJlcXVpcmV9fSxnZXQibm9kZTptb2R1bGUiKCl7cmV0dXJue2NyZWF0ZVJlcXVpcmU6c2VsZi5jcmVhdGVSZXF1aXJlfX0sZ2V0IG5ldCgpe3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbm9kZS1zdGRsaWItYnJvd3Nlci9janMvbW9jay9lbXB0eS5qcyIpfSxnZXQibm9kZTpuZXQiKCl7cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9ub2RlLXN0ZGxpYi1icm93c2VyL2Nqcy9tb2NrL2VtcHR5LmpzIil9LGdldCBvcygpe3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvb3MtYnJvd3NlcmlmeS9icm93c2VyLmpzIil9LGdldCJub2RlOm9zIigpe3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvb3MtYnJvd3NlcmlmeS9icm93c2VyLmpzIil9LGdldCBwdW55Y29kZSgpe3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvcHVueWNvZGUvcHVueWNvZGUuanMiKX0sZ2V0Im5vZGU6cHVueWNvZGUiKCl7cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9wdW55Y29kZS9wdW55Y29kZS5qcyIpfSxnZXQgcXVlcnlzdHJpbmcoKXtyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL25vZGUtc3RkbGliLWJyb3dzZXIvY2pzL3Byb3h5L3F1ZXJ5c3RyaW5nLmpzIil9LGdldCJub2RlOnF1ZXJ5c3RyaW5nIigpe3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbm9kZS1zdGRsaWItYnJvd3Nlci9janMvcHJveHkvcXVlcnlzdHJpbmcuanMiKX0sZ2V0IHJlYWRsaW5lKCl7cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9ub2RlLXN0ZGxpYi1icm93c2VyL2Nqcy9tb2NrL2VtcHR5LmpzIil9LGdldCJub2RlOnJlYWRsaW5lIigpe3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbm9kZS1zdGRsaWItYnJvd3Nlci9janMvbW9jay9lbXB0eS5qcyIpfSxnZXQgcmVwbCgpe3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbm9kZS1zdGRsaWItYnJvd3Nlci9janMvbW9jay9lbXB0eS5qcyIpfSxnZXQibm9kZTpyZXBsIigpe3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbm9kZS1zdGRsaWItYnJvd3Nlci9janMvbW9jay9lbXB0eS5qcyIpfSxnZXQgc3RyZWFtKCl7cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9pbmRleC5qcyIpfSxnZXQibm9kZTpzdHJlYW0iKCl7cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0tYnJvd3NlcmlmeS9pbmRleC5qcyIpfSxnZXQgc3RyaW5nX2RlY29kZXIoKXtyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmluZ19kZWNvZGVyL2xpYi9zdHJpbmdfZGVjb2Rlci5qcyIpfSxnZXQibm9kZTpzdHJpbmdfZGVjb2RlciIoKXtyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmluZ19kZWNvZGVyL2xpYi9zdHJpbmdfZGVjb2Rlci5qcyIpfSxnZXQgc3lzKCl7cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy91dGlsL3V0aWwuanMiKX0sZ2V0Im5vZGU6c3lzIigpe3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvdXRpbC91dGlsLmpzIil9LGdldCB0aW1lcnMoKXtyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3RpbWVycy1icm93c2VyaWZ5L21haW4uanMiKX0sZ2V0Im5vZGU6dGltZXJzIigpe3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvdGltZXJzLWJyb3dzZXJpZnkvbWFpbi5qcyIpfSxnZXQgdGxzKCl7cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9ub2RlLXN0ZGxpYi1icm93c2VyL2Nqcy9tb2NrL2VtcHR5LmpzIil9LGdldCJub2RlOnRscyIoKXtyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL25vZGUtc3RkbGliLWJyb3dzZXIvY2pzL21vY2svZW1wdHkuanMiKX0sZ2V0IHR0eSgpe3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvdHR5LWJyb3dzZXJpZnkvaW5kZXguanMiKX0sZ2V0Im5vZGU6dHR5Iigpe3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvdHR5LWJyb3dzZXJpZnkvaW5kZXguanMiKX0sZ2V0IHZtKCl7cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy92bS1icm93c2VyaWZ5L2luZGV4LmpzIil9LGdldCJub2RlOnZtIigpe3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvdm0tYnJvd3NlcmlmeS9pbmRleC5qcyIpfSxnZXQgemxpYigpe3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS16bGliL2xpYi9pbmRleC5qcyIpfSxnZXQibm9kZTp6bGliIigpe3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS16bGliL2xpYi9pbmRleC5qcyIpfSxmczpmc1BvbHlmaWxsX25hbWVzcGFjZU9iamVjdCwibm9kZTpmcyI6ZnNQb2x5ZmlsbF9uYW1lc3BhY2VPYmplY3QscGF0aCwibm9kZTpwYXRoIjpwYXRoLHByb2Nlc3MsIm5vZGU6cHJvY2VzcyI6cHJvY2VzcyxnZXQgdXJsKCl7cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy9ub2RlLXN0ZGxpYi1icm93c2VyL2Nqcy9wcm94eS91cmwuanMiKX0sZ2V0Im5vZGU6dXJsIigpe3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKCIuLi8uLi9ub2RlX21vZHVsZXMvbm9kZS1zdGRsaWItYnJvd3Nlci9janMvcHJveHkvdXJsLmpzIil9LGdldCB1dGlsKCl7cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oIi4uLy4uL25vZGVfbW9kdWxlcy91dGlsL3V0aWwuanMiKX0sZ2V0Im5vZGU6dXRpbCIoKXtyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygiLi4vLi4vbm9kZV9tb2R1bGVzL3V0aWwvdXRpbC5qcyIpfSx3b3JrZXJfdGhyZWFkczp3b3JrZXJUaHJlYWRzV2l0aFdvcmtlckRhdGEsIm5vZGU6d29ya2VyX3RocmVhZHMiOndvcmtlclRocmVhZHNXaXRoV29ya2VyRGF0YX0sZnM9bm9kZVBvbHlGaWxscy5mcyxjanNfcGF0aD1ub2RlUG9seUZpbGxzLnBhdGgsaW5zdGFsbGVkTW9kdWxlcz17fSxwa2dKc29uQ2FjaGU9e30scmVzb2x1dGlvbkNhY2hlPXt9LHNlYXJjaFBhdGhzQ2FjaGU9e30sUkVTT0xVVElPTl9FWFRFTlNJT05TPVsiIiwiLmpzIiwiLmNqcyIsIi5qc29uIiwiL2luZGV4LmpzIiwiL2luZGV4LmNqcyIsIi9pbmRleC5qc29uIl0sdHJ5UmVhZEZpbGU9cD0+e3RyeXtyZXR1cm4gZnMucmVhZEZpbGVTeW5jKHAsInV0ZjgiKX1jYXRjaChfYSl7cmV0dXJuIG51bGx9fSxyZXNvbHZlV2l0aEV4dGVuc2lvbnM9KHAsc2tpcEluZGV4SnNJZkpzPSExKT0+e2Zvcihjb25zdCBleHQgb2YgUkVTT0xVVElPTl9FWFRFTlNJT05TKXtpZihza2lwSW5kZXhKc0lmSnMmJiIvaW5kZXguanMiPT09ZXh0JiZwLmVuZHNXaXRoKCIuanMiKSljb250aW51ZTtjb25zdCBjYW5kaWRhdGU9cCtleHQsY29kZT10cnlSZWFkRmlsZShjYW5kaWRhdGUpO2lmKG51bGwhPT1jb2RlKXJldHVybntjb2RlLGlkOmNhbmRpZGF0ZX19cmV0dXJuIG51bGx9LGxvYWRNb2R1bGU9KGlkLGNvbnRleHQsaW1wb3J0TWFwcyxlbnRyeXBvaW50KT0+e3ZhciBfYTtjb25zdCBjYWNoZUtleT1gJHtjb250ZXh0fToke2lkfWA7aWYocmVzb2x1dGlvbkNhY2hlW2NhY2hlS2V5XSl7Y29uc3QgY2FjaGVkSWQ9cmVzb2x1dGlvbkNhY2hlW2NhY2hlS2V5XTtpZihpbnN0YWxsZWRNb2R1bGVzW2NhY2hlZElkXSlyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1tjYWNoZWRJZF0uZXhwb3J0c31sZXQgcmVzb2x2ZWRJZD1pZC5zdGFydHNXaXRoKCIuIik/Y2pzX3BhdGguam9pbihjb250ZXh0LGlkKTppZDtjb25zdCBzeXNEZWY9U3lzdGVtLmdldChyZXNvbHZlZElkKXx8aWQhPT1yZXNvbHZlZElkJiZTeXN0ZW0uZ2V0KGlkKTtpZihzeXNEZWYpcmV0dXJuIHN5c0RlZi5kZWZhdWx0O2lmKGlkIGluIG5vZGVQb2x5RmlsbHMpcmV0dXJuIG5vZGVQb2x5RmlsbHNbaWRdO2lmKHJlc29sdmVkSWQgaW4gbm9kZVBvbHlGaWxscylyZXR1cm4gbm9kZVBvbHlGaWxsc1tyZXNvbHZlZElkXTtsZXQgbW9kdWxlQ29kZT1pbXBvcnRNYXBzW2lkXSxtb2R1bGVJZD1tb2R1bGVDb2RlP2lkOnJlc29sdmVkSWQ7aWYoIW1vZHVsZUNvZGUmJiFpZC5zdGFydHNXaXRoKCIuIikmJiFpZC5zdGFydHNXaXRoKCIvIikpe2xldCBzZWFyY2hQYXRocz1zZWFyY2hQYXRoc0NhY2hlW2NvbnRleHRdO2lmKCFzZWFyY2hQYXRocyl7c2VhcmNoUGF0aHM9W107bGV0IGN1cnJlbnREaXI9Y29udGV4dDtmb3IoOzspe2lmKCJub2RlX21vZHVsZXMiIT09Y2pzX3BhdGguYmFzZW5hbWUoY3VycmVudERpcikpe2NvbnN0IG5tUGF0aD1janNfcGF0aC5qb2luKGN1cnJlbnREaXIsIm5vZGVfbW9kdWxlcyIpO3NlYXJjaFBhdGhzLmluY2x1ZGVzKG5tUGF0aCl8fHNlYXJjaFBhdGhzLnB1c2gobm1QYXRoKX1jb25zdCBwYXJlbnQ9Y2pzX3BhdGguZGlybmFtZShjdXJyZW50RGlyKTtpZihwYXJlbnQ9PT1jdXJyZW50RGlyKWJyZWFrO2N1cnJlbnREaXI9cGFyZW50fWNvbnN0IGN3ZE5tPWNqc19wYXRoLmpvaW4obm9kZVBvbHlGaWxscy5wcm9jZXNzLmN3ZCgpLCJub2RlX21vZHVsZXMiKTtzZWFyY2hQYXRocy5pbmNsdWRlcyhjd2RObSl8fHNlYXJjaFBhdGhzLnB1c2goY3dkTm0pLHNlYXJjaFBhdGhzQ2FjaGVbY29udGV4dF09c2VhcmNoUGF0aHN9Zm9yKGNvbnN0IG5vZGVNb2R1bGVzRGlyIG9mIHNlYXJjaFBhdGhzKXtjb25zdCBub2RlTW9kdWxlc1BhdGg9Y2pzX3BhdGguam9pbihub2RlTW9kdWxlc0RpcixpZCkscGtnUGF0aD1janNfcGF0aC5qb2luKG5vZGVNb2R1bGVzUGF0aCwicGFja2FnZS5qc29uIik7bGV0IHBrZ01haW47aWYoIXBrZ0pzb25DYWNoZVtwa2dQYXRoXSl7Y29uc3QganNvbj10cnlSZWFkRmlsZShwa2dQYXRoKTtpZihqc29uKXRyeXtwa2dKc29uQ2FjaGVbcGtnUGF0aF09SlNPTi5wYXJzZShqc29uKX1jYXRjaChfYil7fX1pZihudWxsPT09KF9hPXBrZ0pzb25DYWNoZVtwa2dQYXRoXSl8fHZvaWQgMD09PV9hP3ZvaWQgMDpfYS5tYWluKXtwa2dNYWluPWNqc19wYXRoLnJlc29sdmUobm9kZU1vZHVsZXNQYXRoLHBrZ0pzb25DYWNoZVtwa2dQYXRoXS5tYWluKTtjb25zdCByZXM9cmVzb2x2ZVdpdGhFeHRlbnNpb25zKHBrZ01haW4pO2lmKHJlcyl7bW9kdWxlQ29kZT1yZXMuY29kZSxtb2R1bGVJZD1yZXMuaWQ7YnJlYWt9fWNvbnN0IHJlcz1yZXNvbHZlV2l0aEV4dGVuc2lvbnMobm9kZU1vZHVsZXNQYXRoKTtpZihyZXMpe21vZHVsZUNvZGU9cmVzLmNvZGUsbW9kdWxlSWQ9cmVzLmlkO2JyZWFrfX19aWYoIW1vZHVsZUNvZGUmJihpZC5zdGFydHNXaXRoKCIvIil8fGlkLnN0YXJ0c1dpdGgoIi4iKSkpe2NvbnN0IHJlcz1yZXNvbHZlV2l0aEV4dGVuc2lvbnMocmVzb2x2ZWRJZCxpZC5lbmRzV2l0aCgiLmpzIikpO3JlcyYmKG1vZHVsZUNvZGU9cmVzLmNvZGUsbW9kdWxlSWQ9cmVzLmlkKX1pZihtb2R1bGVDb2RlKXJldHVybiByZXNvbHV0aW9uQ2FjaGVbYCR7Y29udGV4dH06JHtpZH1gXT1tb2R1bGVJZCwoKG1vZHVsZUlkLG1vZHVsZUNvZGUsaW1wb3J0TWFwcyxlbnRyeXBvaW50KT0+e2lmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKXJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO2NvbnN0IGNvbnRleHQ9Y2pzX3BhdGguZGlybmFtZShtb2R1bGVJZCk7bGV0IGZpbmFsRXhwb3J0cz17fTtjb25zdCBtb2R1bGVSZXF1aXJlPWNoaWxkSWQ9PmxvYWRNb2R1bGUoY2hpbGRJZCxjb250ZXh0LGltcG9ydE1hcHMsZW50cnlwb2ludCk7bW9kdWxlUmVxdWlyZS5yZXNvbHZlPXJlcXVlc3Q9PnJlcXVlc3Q7Y29uc3QgbW9kdWxlPXtleHBvcnRzOmZpbmFsRXhwb3J0cyxyZXF1aXJlOm1vZHVsZVJlcXVpcmV9Oyhtb2R1bGVJZC5pbmNsdWRlcygibm9kZV9tb2R1bGVzIil8fG1vZHVsZUlkIGluIGltcG9ydE1hcHMpJiYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF09bW9kdWxlKSxtb2R1bGVJZD09PWVudHJ5cG9pbnQmJihtb2R1bGVDb2RlPSJzZWxmLkJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjsiK21vZHVsZUNvZGUpLG1vZHVsZUlkLmVuZHNXaXRoKCIuanNvbiIpfHwobW9kdWxlQ29kZT1gLy8gW0RlYnVnXSBSZXNvbHZlZDogJHttb2R1bGVJZH1cbmArbW9kdWxlQ29kZSk7dHJ5e21vZHVsZUlkLmVuZHNXaXRoKCIuanNvbiIpPyhmaW5hbEV4cG9ydHM9SlNPTi5wYXJzZShtb2R1bGVDb2RlKSxtb2R1bGUuZXhwb3J0cz1maW5hbEV4cG9ydHMpOihuZXcgRnVuY3Rpb24oInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiX19maWxlbmFtZSIsIl9fZGlybmFtZSIsInByb2Nlc3MiLG1vZHVsZUNvZGUpKG1vZHVsZVJlcXVpcmUsbW9kdWxlLmV4cG9ydHMsbW9kdWxlLG1vZHVsZUlkLGNvbnRleHQsbm9kZVBvbHlGaWxscy5wcm9jZXNzKSxmaW5hbEV4cG9ydHM9bW9kdWxlLmV4cG9ydHMpfWNhdGNoKGUpe3Rocm93IGNvbnNvbGUuZXJyb3IoYFdvcmtlcjogRXJyb3IgZXhlY3V0aW5nIG1vZHVsZSAke21vZHVsZUlkfTpgLGUpLG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgZGVwZW5kZW5jeSAke21vZHVsZUlkfTogJHtlLm1lc3NhZ2V9YCl9dHJ5e1N5c3RlbS5zZXQobW9kdWxlSWQse2RlZmF1bHQ6ZmluYWxFeHBvcnRzfSl9Y2F0Y2goX2Epe31yZXR1cm4gZmluYWxFeHBvcnRzfSkobW9kdWxlSWQsbW9kdWxlQ29kZSxpbXBvcnRNYXBzLGVudHJ5cG9pbnQpO2NvbnN0IGVycm9yPW5ldyBFcnJvcihgV29ya2VyOiBEZXBlbmRlbmN5ICR7aWR9IChyZXNvbHZlZDogJHttb2R1bGVJZH0pIG5vdCBmb3VuZC4gQ29udGV4dDogJHtjb250ZXh0fS4gSW1wb3J0TWFwcyBjb3VudDogJHtPYmplY3Qua2V5cyhpbXBvcnRNYXBzKS5sZW5ndGh9LiBDV0Q6ICR7bm9kZVBvbHlGaWxscy5wcm9jZXNzLmN3ZCgpfS4gU2FtcGxlIEltcG9ydE1hcHMga2V5czogJHtPYmplY3Qua2V5cyhpbXBvcnRNYXBzKS5zbGljZSgwLDUpLmpvaW4oIiwgIil9YCk7dGhyb3cgY29uc29sZS5lcnJvcihlcnJvciksZXJyb3J9O2NvbnN0IGJpbmRpbmc9e3JlY3ZUYXNrTWVzc2FnZUluV29ya2VyOnV0b28uYU4sc2VuZFRhc2tNZXNzYWdlOnV0b28ubDIsd29ya2VyQ3JlYXRlZDp1dG9vLkhKfTtmdW5jdGlvbiBzdGFydExvYWRlcldvcmtlcigpe3NlbGYub25tZXNzYWdlPWV2ZW50PT57bGV0W21vZHVsZSxtZW1vcnksbWV0YV09ZXZlbnQuZGF0YTt0cnl7KDAsdXRvby5RUikoe21vZHVsZSxtZW1vcnl9KX1jYXRjaChlcnIpe3Rocm93IGNvbnNvbGUuZXJyb3IoZXJyKSxlcnJ9c2VsZi53b3JrZXJEYXRhPXt0aHJlYWRJZDptZXRhLndvcmtlckRhdGEudGhyZWFkSWQsY3dkOm1ldGEud29ya2VyRGF0YS5jd2QscHJvamVjdFJvb3Q6bWV0YS53b3JrZXJEYXRhLnByb2plY3RSb290LGJpbmRpbmcsZnM6dXRvby5Gc30sc2VsZi5wcm9jZXNzPXtlbnY6e30sY3dkOigpPT5zZWxmLndvcmtlckRhdGEuY3dkfSxhc3luYyBmdW5jdGlvbiBjanMoZW50cnlwb2ludCxpbXBvcnRNYXBzKXtbcGtnSnNvbkNhY2hlLHJlc29sdXRpb25DYWNoZSxzZWFyY2hQYXRoc0NhY2hlXS5mb3JFYWNoKGM9Pntmb3IoY29uc3Qga2V5IGluIGMpZGVsZXRlIGNba2V5XX0pLGF3YWl0IFByb21pc2UuYWxsKE9iamVjdC5lbnRyaWVzKGltcG9ydE1hcHMpLm1hcChhc3luYyhbayx2XSk9PntpZih2LnN0YXJ0c1dpdGgoImh0dHBzOi8vIikpdHJ5e2NvbnN0IHJlc3BvbnNlPWF3YWl0IGZldGNoKHYpO3Jlc3BvbnNlLm9rP2ltcG9ydE1hcHNba109YXdhaXQgcmVzcG9uc2UudGV4dCgpOihjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggbG9hZGVyICcke2t9JzogJHtyZXNwb25zZS5zdGF0dXN9YCksZGVsZXRlIGltcG9ydE1hcHNba10pfWNhdGNoKGVycm9yKXtjb25zb2xlLmVycm9yKGBFcnJvciBmZXRjaGluZyBsb2FkZXIgJyR7a30nOmAsZXJyb3IpLGRlbGV0ZSBpbXBvcnRNYXBzW2tdfX0pKTtjb25zdCBvcmlnaW5hbFdhcm49Y29uc29sZS53YXJuO2NvbnNvbGUud2Fybj0oLi4uYXJncyk9Pnt2YXIgX2E7KChudWxsPT09KF9hPWFyZ3NbMF0pfHx2b2lkIDA9PT1fYT92b2lkIDA6X2EudG9TdHJpbmcoKSl8fCIiKS5pbmNsdWRlcygiKFN5c3RlbUpTIEVycm9yI1czIil8fG9yaWdpbmFsV2Fybi5hcHBseShjb25zb2xlLGFyZ3MpfSxzZWxmLl9fc3lzdGVtanNfcmVxdWlyZV9fPWlkPT5sb2FkTW9kdWxlKGlkLGNqc19wYXRoLmRpcm5hbWUoZW50cnlwb2ludCksaW1wb3J0TWFwcyxlbnRyeXBvaW50KSxzZWxmLl9fc3lzdGVtanNfcmVxdWlyZV9fLnJlc29sdmU9cmVxdWVzdD0+cmVxdWVzdCxzZWxmLmNyZWF0ZVJlcXVpcmU9ZmlsZW5hbWU9Pntjb25zdCBjb250ZXh0PWNqc19wYXRoLmRpcm5hbWUoZmlsZW5hbWUpLHJlcT1pZD0+bG9hZE1vZHVsZShpZCxjb250ZXh0LGltcG9ydE1hcHMsZW50cnlwb2ludCk7cmV0dXJuIHJlcS5yZXNvbHZlPXJlcXVlc3Q9PnJlcXVlc3QscmVxfSxsb2FkTW9kdWxlKGVudHJ5cG9pbnQsY2pzX3BhdGguZGlybmFtZShlbnRyeXBvaW50KSxpbXBvcnRNYXBzLGVudHJ5cG9pbnQpfShtZXRhLmxvYWRlckFzc2V0cy5lbnRyeXBvaW50LG1ldGEubG9hZGVyQXNzZXRzLmltcG9ydE1hcHMpfX1zZWxmLnN0YXJ0TG9hZGVyV29ya2VyPXN0YXJ0TG9hZGVyV29ya2VyLHN0YXJ0TG9hZGVyV29ya2VyKCk7Y29uc3Qgd29ya2VyPXN0YXJ0TG9hZGVyV29ya2VyfSkoKSxfX3dlYnBhY2tfZXhwb3J0c19fPV9fd2VicGFja19leHBvcnRzX18uZGVmYXVsdCxfX3dlYnBhY2tfZXhwb3J0c19ffSkoKSk7";