uni-jsframework-dev.js 706 KB

12
  1. //{"version":"3.6.4","encode":"base64"}
  2. dmFyIF9fVW5pU2VydmljZVN0YXJ0VGltZV9fPURhdGUubm93KCksZ2xvYmFsPXRoaXMscHJvY2Vzcz17ZW52Ont9fSxzZXRUaW1lb3V0PWdsb2JhbC5zZXRUaW1lb3V0OyFmdW5jdGlvbihlLHQpeyJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGU/dCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKHQpOnQoKX0oMCxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgc3VidmVyc2lvbj17ZnJhbWV3b3JrOiIwLjI5LjYiLHRyYW5zZm9ybWVyOiI+PTAuMS41IDwwLjUifTtmdW5jdGlvbiBnZXRIb29rS2V5KGUsdCxuKXtyZXR1cm4gdCsiQCIrbisiIyIrZX12YXIgQ2FsbGJhY2tNYW5hZ2VyPWZ1bmN0aW9uKGUpe3RoaXMuaW5zdGFuY2VJZD1TdHJpbmcoZSksdGhpcy5sYXN0Q2FsbGJhY2tJZD0wLHRoaXMuY2FsbGJhY2tzPXt9LHRoaXMuaG9va3M9e319O0NhbGxiYWNrTWFuYWdlci5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmxhc3RDYWxsYmFja0lkKyssdGhpcy5jYWxsYmFja3NbdGhpcy5sYXN0Q2FsbGJhY2tJZF09ZSx0aGlzLmxhc3RDYWxsYmFja0lkfSxDYWxsYmFja01hbmFnZXIucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmNhbGxiYWNrc1tlXTtyZXR1cm4gZGVsZXRlIHRoaXMuY2FsbGJhY2tzW2VdLHR9LENhbGxiYWNrTWFuYWdlci5wcm90b3R5cGUucmVnaXN0ZXJIb29rPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPWdldEhvb2tLZXkoZSx0LG4pO3RoaXMuaG9va3NbaV0mJmNvbnNvbGUud2FybignW0pTIEZyYW1ld29ya10gT3ZlcnJpZGUgYW4gZXhpc3RpbmcgY29tcG9uZW50IGhvb2sgIicraSsnIi4nKSx0aGlzLmhvb2tzW2ldPXJ9LENhbGxiYWNrTWFuYWdlci5wcm90b3R5cGUudHJpZ2dlckhvb2s9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9Z2V0SG9va0tleShlLHQsbiksbz10aGlzLmhvb2tzW2ldO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBvKXJldHVybiBjb25zb2xlLmVycm9yKCJbSlMgRnJhbWV3b3JrXSBJbnZhbGlkIGhvb2sgZnVuY3Rpb24gdHlwZSAoIit0eXBlb2YgbysnKSBvbiAiJytpKyciLicpLG51bGw7dmFyIGE9bnVsbDt0cnl7YT1vLmFwcGx5KG51bGwscnx8W10pfWNhdGNoKGUpe3Rocm93IGNvbnNvbGUuZXJyb3IoJ1tKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBleGVjdXRlIHRoZSBob29rIGZ1bmN0aW9uIG9uICInK2krJyIuJyksZX1yZXR1cm4gYX0sQ2FsbGJhY2tNYW5hZ2VyLnByb3RvdHlwZS5jb25zdW1lPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLmNhbGxiYWNrc1tlXTtpZih2b2lkIDAhPT1uJiYhMSE9PW58fGRlbGV0ZSB0aGlzLmNhbGxiYWNrc1tlXSwiZnVuY3Rpb24iPT10eXBlb2Ygcil0cnl7cmV0dXJuIHIuY2FsbChudWxsLHQsbil9Y2F0Y2goZSl7dGhyb3cgY29uc29sZS5lcnJvcigiW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGV4ZWN1dGUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uOlxuICIrZS50b1N0cmluZygpKSxlfXJldHVybiBuZXcgRXJyb3IoJ2ludmFsaWQgY2FsbGJhY2sgaWQgIicrZSsnIicpfSxDYWxsYmFja01hbmFnZXIucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dGhpcy5jYWxsYmFja3M9e30sdGhpcy5ob29rcz17fX07dmFyIG5leHROb2RlUmVmPTE7ZnVuY3Rpb24gdW5pcXVlSWQoKXtyZXR1cm4obmV4dE5vZGVSZWYrKykudG9TdHJpbmcoKX1mdW5jdGlvbiB0eXBvZihlKXt2YXIgdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk7cmV0dXJuIHQuc3Vic3RyaW5nKDgsdC5sZW5ndGgtMSl9ZnVuY3Rpb24gaXNQbGFpbk9iamVjdChlKXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX1mdW5jdGlvbiBoYXNPd24oZSx0KXtyZXR1cm4gaXNQbGFpbk9iamVjdChlKSYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCl9ZnVuY3Rpb24gYnVmZmVyVG9CYXNlNjQoZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGJ0b2EpcmV0dXJuIiI7dmFyIHQ9QXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKG5ldyBVaW50OEFycmF5KGUpLGZ1bmN0aW9uKGUpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGUpfSkuam9pbigiIik7cmV0dXJuIGJ0b2EodCl9ZnVuY3Rpb24gaXNFbXB0eShlKXtpZighZXx8Im9iamVjdCIhPXR5cGVvZiBlKXJldHVybiEwO2Zvcih2YXIgdCBpbiBlKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpKXJldHVybiExO3JldHVybiEwfXZhciBMRVZFTFM9WyJvZmYiLCJlcnJvciIsIndhcm4iLCJpbmZvIiwibG9nIiwiZGVidWciXSxsZXZlbE1hcD17fTtmdW5jdGlvbiBnZW5lcmF0ZUxldmVsTWFwKCl7TEVWRUxTLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49TEVWRUxTLmluZGV4T2YodCk7bGV2ZWxNYXBbdF09e30sTEVWRUxTLmZvckVhY2goZnVuY3Rpb24oZSl7TEVWRUxTLmluZGV4T2YoZSk8PW4mJihsZXZlbE1hcFt0XVtlXT0hMCl9KX0pfWZ1bmN0aW9uIGNoZWNrTGV2ZWwoZSl7dmFyIHQ9Z2xvYmFsLldYRW52aXJvbm1lbnQmJmdsb2JhbC5XWEVudmlyb25tZW50LmxvZ0xldmVsfHwibG9nIjtyZXR1cm4gbGV2ZWxNYXBbdF0mJmxldmVsTWFwW3RdW2VdfWZ1bmN0aW9uIGRlYnVnTG9nKGUpe2dsb2JhbC5uYXRpdmVMb2coInd4SW50ZXJhY3Rpb25BbmFseXplcjogW2pzZm1dIitlLCJfX0RFQlVHIil9dmFyIGRvY01hcD17fTtmdW5jdGlvbiBhZGREb2MoZSx0KXtlJiYoZG9jTWFwW2VdPXQpfWZ1bmN0aW9uIGdldERvYyhlKXtyZXR1cm4gZG9jTWFwW2VdfWZ1bmN0aW9uIHJlbW92ZURvYyhlKXtkZWxldGUgZG9jTWFwW2VdfWZ1bmN0aW9uIGdldFRhc2tDZW50ZXIoZSl7dmFyIHQ9ZG9jTWFwW2VdO3JldHVybiB0JiZ0LnRhc2tDZW50ZXI/dC50YXNrQ2VudGVyOm51bGx9ZnVuY3Rpb24gYXBwZW5kQm9keShlLHQsbil7dmFyIHI9ZS5kb2N1bWVudEVsZW1lbnQ7aWYoISgwPHIucHVyZUNoaWxkcmVuLmxlbmd0aHx8dC5wYXJlbnROb2RlKSl7dmFyIGk9ci5jaGlsZHJlbixvPWkuaW5kZXhPZihuKTtvPDA/aS5wdXNoKHQpOmkuc3BsaWNlKG8sMCx0KSwxPT09dC5ub2RlVHlwZT8oImJvZHkiPT09dC5yb2xlPyh0LmRvY0lkPWUuaWQsdC5vd25lckRvY3VtZW50PWUsdC5wYXJlbnROb2RlPXIsbGlua1BhcmVudCh0LHIpKToodC5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UucGFyZW50Tm9kZT10fSksc2V0Qm9keShlLHQpLHQuZG9jSWQ9ZS5pZCx0Lm93bmVyRG9jdW1lbnQ9ZSxsaW5rUGFyZW50KHQsciksZGVsZXRlIGUubm9kZU1hcFt0Lm5vZGVJZF0pLHIucHVyZUNoaWxkcmVuLnB1c2godCksc2VuZEJvZHkoZSx0KSk6KHQucGFyZW50Tm9kZT1yLGUubm9kZU1hcFt0LnJlZl09dCksdC5yZWFkeT0hMCx0LmNvbXB1dGVDbGFzc0xpc3QmJnQuY29tcHV0ZUNsYXNzTGlzdCgpfX1mdW5jdGlvbiBzZW5kQm9keShlLHQpe3ZhciBuPXQudG9KU09OKCk7ZSYmZS50YXNrQ2VudGVyJiYiZnVuY3Rpb24iPT10eXBlb2YgZS50YXNrQ2VudGVyLnNlbmQmJmUudGFza0NlbnRlci5zZW5kKCJkb20iLHthY3Rpb246ImNyZWF0ZUJvZHkifSxbbl0pfWZ1bmN0aW9uIHNldEJvZHkoZSx0KXt0LnJvbGU9ImJvZHkiLHQuZGVwdGg9MSxkZWxldGUgZS5ub2RlTWFwW3Qubm9kZUlkXSx0LnJlZj0iX3Jvb3QiLGUubm9kZU1hcC5fcm9vdD10LGUuYm9keT10fWZ1bmN0aW9uIGxpbmtQYXJlbnQodCxlKXsodC5wYXJlbnROb2RlPWUpLmRvY0lkJiYodC5kb2NJZD1lLmRvY0lkLHQub3duZXJEb2N1bWVudD1lLm93bmVyRG9jdW1lbnQsKHQub3duZXJEb2N1bWVudC5ub2RlTWFwW3Qubm9kZUlkXT10KS5kZXB0aD1lLmRlcHRoKzEpLHQuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlKXtsaW5rUGFyZW50KGUsdCl9KX1mdW5jdGlvbiBuZXh0RWxlbWVudChlKXtmb3IoO2U7KXtpZigxPT09ZS5ub2RlVHlwZSlyZXR1cm4gZTtlPWUubmV4dFNpYmxpbmd9fWZ1bmN0aW9uIHByZXZpb3VzRWxlbWVudChlKXtmb3IoO2U7KXtpZigxPT09ZS5ub2RlVHlwZSlyZXR1cm4gZTtlPWUucHJldmlvdXNTaWJsaW5nfX1mdW5jdGlvbiBpbnNlcnRJbmRleChlLHQsbixyKXtuPDAmJihuPTApO3ZhciBpPXRbbi0xXSxvPXRbbl07cmV0dXJuIHQuc3BsaWNlKG4sMCxlKSxyJiYoaSYmKGkubmV4dFNpYmxpbmc9ZSksZS5wcmV2aW91c1NpYmxpbmc9aSwoZS5uZXh0U2libGluZz1vKSYmKG8ucHJldmlvdXNTaWJsaW5nPWUpKSxufWZ1bmN0aW9uIG1vdmVJbmRleChlLHQsbixyKXt2YXIgaT10LmluZGV4T2YoZSk7aWYoaTwwKXJldHVybi0xO2lmKHIpe3ZhciBvPXRbaS0xXSxhPXRbaSsxXTtvJiYoby5uZXh0U2libGluZz1hKSxhJiYoYS5wcmV2aW91c1NpYmxpbmc9byl9dC5zcGxpY2UoaSwxKTt2YXIgcz1uO2k8PW4mJihzPW4tMSk7dmFyIGM9dFtzLTFdLHU9dFtzXTtyZXR1cm4gdC5zcGxpY2UocywwLGUpLHImJihjJiYoYy5uZXh0U2libGluZz1lKSxlLnByZXZpb3VzU2libGluZz1jLChlLm5leHRTaWJsaW5nPXUpJiYodS5wcmV2aW91c1NpYmxpbmc9ZSkpLGk9PT1zPy0xOm59ZnVuY3Rpb24gcmVtb3ZlSW5kZXgoZSx0LG4pe3ZhciByPXQuaW5kZXhPZihlKTtpZighKHI8MCkpe2lmKG4pe3ZhciBpPXRbci0xXSxvPXRbcisxXTtpJiYoaS5uZXh0U2libGluZz1vKSxvJiYoby5wcmV2aW91c1NpYmxpbmc9aSl9dC5zcGxpY2UociwxKX19dmFyIE5vZGU9ZnVuY3Rpb24oKXt0aGlzLm5vZGVJZD11bmlxdWVJZCgpLHRoaXMucmVmPXRoaXMubm9kZUlkLHRoaXMuY2hpbGRyZW49W10sdGhpcy5wdXJlQ2hpbGRyZW49W10sdGhpcy5wYXJlbnROb2RlPW51bGwsdGhpcy5uZXh0U2libGluZz1udWxsLHRoaXMucHJldmlvdXNTaWJsaW5nPW51bGx9LEVsZW1lbnQkMjtmdW5jdGlvbiBzZXRFbGVtZW50KGUpe0VsZW1lbnQkMj1lfU5vZGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgZT1nZXREb2ModGhpcy5kb2NJZCk7ZSYmKGRlbGV0ZSB0aGlzLmRvY0lkLGRlbGV0ZSBlLm5vZGVNYXBbdGhpcy5ub2RlSWRdKSx0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5kZXN0cm95KCl9KX07dmFyIHJlZ2lzdGVyZWRFbGVtZW50cz17fTtmdW5jdGlvbiByZWdpc3RlckVsZW1lbnQoaSxlKXtpZihBcnJheS5pc0FycmF5KGUpJiZlLmxlbmd0aCl7dmFyIHQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBlJiYodC5fX3Byb3RvX189ZSksKHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj10fShFbGVtZW50JDIpO2UuZm9yRWFjaChmdW5jdGlvbihyKXt0LnByb3RvdHlwZVtyXT1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTt2YXIgbj1nZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpO2lmKG4pcmV0dXJuIG4uc2VuZCgiY29tcG9uZW50Iix7cmVmOnRoaXMucmVmLGNvbXBvbmVudDppLG1ldGhvZDpyfSxlKX19KSxyZWdpc3RlcmVkRWxlbWVudHNbaV09dH19ZnVuY3Rpb24gZ2V0V2VleEVsZW1lbnQoZSl7cmV0dXJuIHJlZ2lzdGVyZWRFbGVtZW50c1tlXX1mdW5jdGlvbiBjYWNoZWQodCl7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV18fChuW2VdPXQoZSkpfX12YXIgcGFyc2VTdHlsZVRleHQ9Y2FjaGVkKGZ1bmN0aW9uKGUpe3ZhciBuPXt9LHI9LzooLispLztyZXR1cm4gZS5zcGxpdCgvOyg/IVteKF0qXCkpL2cpLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9ZS5zcGxpdChyKTsxPHQubGVuZ3RoJiYoblt0WzBdLnRyaW0oKV09dFsxXS50cmltKCkpfX0pLG59KSxmaXJzdExldHRlclRvTG93ZXJDYXNlPWNhY2hlZChmdW5jdGlvbihlKXtyZXR1cm4gZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKStlLnNsaWNlKDEpfSk7ZnVuY3Rpb24gaXNEZWYoZSl7cmV0dXJuIHZvaWQgMCE9PWV9ZnVuY3Rpb24gaXNGbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZX12YXIgcHJvY2Vzc29ycz17c2xpZGVyOntjaGFuZ2U6ZnVuY3Rpb24oZSl7cmV0dXJue2luZGV4OmUuaW5kZXgsc291cmNlOmUuc291cmNlfX0sc2Nyb2xsOmZ1bmN0aW9uKGUpe3JldHVybntvZmZzZXRYUmF0aW86ZS5vZmZzZXRYUmF0aW8sb2Zmc2V0WVJhdGlvOmUub2Zmc2V0WVJhdGlvLGRyYWc6ZS5kcmFnfX19LCJzY3JvbGwtdmlldyI6e3Njcm9sbGVuZDpmdW5jdGlvbihlKXtyZXR1cm57Y29udGVudE9mZnNldDplLmNvbnRlbnRPZmZzZXR9fX19O2Z1bmN0aW9uIHByb2Nlc3NUYXJnZXQoZSl7dmFyIHQ9ZS5hdHRyLG49ZS5vZmZzZXRMZWZ0LHI9ZS5vZmZzZXRUb3AsaT17fTtyZXR1cm4gT2JqZWN0LmtleXModHx8e30pLmZvckVhY2goZnVuY3Rpb24oZSl7MD09PWUuaW5kZXhPZigiZGF0YSIpJiYoaVtmaXJzdExldHRlclRvTG93ZXJDYXNlKGUucmVwbGFjZSgiZGF0YSIsIiIpKV09dFtlXSl9KSx7aWQ6dCYmdC5pZHx8IiIsZGF0YXNldDppLG9mZnNldExlZnQ6bnx8MCxvZmZzZXRUb3A6cnx8MH19ZnVuY3Rpb24gcHJvY2Vzc0N1c3RvbUV2ZW50KGUsdCxuKXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9e30pLHZvaWQgMD09PW4mJihuPXt9KSxuPXByb2Nlc3NUYXJnZXQobikse3R5cGU6ZSx0aW1lU3RhbXA6RGF0ZS5ub3coKSx0YXJnZXQ6bixjdXJyZW50VGFyZ2V0Om4sZGV0YWlsOnR9fXZhciBXRUVYX1RBR1M9WyJhIiwiZGl2IiwibGlzdCIsImNlbGwiLCJsb2FkaW5nIiwicmVmcmVzaCIsInJlY3ljbGUtbGlzdCIsInNjcm9sbGVyIiwiaW5kaWNhdG9yIiwid2F0ZXJmYWxsIiwid2ViIiwicmljaHRleHQiXSxJR05PUkVfRVZFTlRTPVsidmlld2FwcGVhciIsInZpZXdkaXNhcHBlYXIiLCJpdGVtY2xpY2siXSxFVkVOVF9FWFRSQVM9e21hcmtlcnRhcDpbIm1hcmtlcklkIl0sY29udHJvbHRhcDpbImNvbnRyb2xJZCJdLHJlZ2lvbmNoYW5nZTpbImNhdXNlZEJ5Il0sZW5kOlsiY2F1c2VkQnkiXSxhcHBlYXI6WyJkaXJlY3Rpb24iXSxkaXNhcHBlYXI6WyJkaXJlY3Rpb24iXX07ZnVuY3Rpb24gcHJvY2Vzc0V2ZW50KHQsZSl7dmFyIG49dC50eXBlO2lmKC0xIT09SUdOT1JFX0VWRU5UUy5pbmRleE9mKG4pKXJldHVybiB0O3ZhciByPXQuY3VycmVudFRhcmdldCxpPXIudHlwZS5yZXBsYWNlKCJ1LSIsIiIpO2lmKC0xIT09V0VFWF9UQUdTLmluZGV4T2YoaSkpcmV0dXJuIHQ7dmFyIG89dC50aW1lc3RhbXAsYT10LnRhcmdldDtpZighaXNEZWYoZSkpe3ZhciBzPXByb2Nlc3NvcnNbaV07ZT1zJiZpc0ZuKHNbbl0pP3Nbbl0odCk6dC5kZXRhaWx8fHt9fXZhciBjPXt0eXBlOm4sdGltZVN0YW1wOm8sdGFyZ2V0OnByb2Nlc3NUYXJnZXQoYSksY3VycmVudFRhcmdldDpwcm9jZXNzVGFyZ2V0KHIpLGRldGFpbDplLHRvdWNoZXM6InRvdWNoZW5kIj09PW58fCJwYW5lbmQiPT09bj9bXTp0LmNoYW5nZWRUb3VjaGVzLGNoYW5nZWRUb3VjaGVzOnQuY2hhbmdlZFRvdWNoZXN9O3QuY29tcG9uZW50SWQmJihjLmNvbXBvbmVudElkPXQuY29tcG9uZW50SWQpO3ZhciB1PUVWRU5UX0VYVFJBU1tuXTtyZXR1cm4gdSYmdS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuaGFzT3duUHJvcGVydHkoZSkmJihjW2VdPXRbZV0pfSksY312YXIgQkFTRV9ERVZJQ0VfV0lEVEg9NzUwLGRldmljZURQUj0xLGRldmljZVdpZHRoPTA7ZnVuY3Rpb24gdXB4MnB4KGUsdCl7aWYoMD09PWRldmljZVdpZHRoJiYoZGV2aWNlRFBSPWdsb2JhbC5XWEVudmlyb25tZW50LnNjYWxlLGRldmljZVdpZHRoPU1hdGguY2VpbChnbG9iYWwuV1hFbnZpcm9ubWVudC5kZXZpY2VXaWR0aC9kZXZpY2VEUFIpKSwwPT09KGU9TnVtYmVyKGUpKSlyZXR1cm4gMDt2YXIgbj1lL0JBU0VfREVWSUNFX1dJRFRIKih0fHxkZXZpY2VXaWR0aCkscj1uLnRvU3RyaW5nKCkuc3BsaXQoIi4iKTtyZXR1cm4gMj09PXIubGVuZ3RoPyhyWzFdPXJbMV0uc3Vic3RyaW5nKDAsMiksTnVtYmVyKHIuam9pbigiLiIpKSk6bn12YXIgVU5JVF9SRT0vKFsrLV0/XGQrKFwuXGQrKT8pW3J8dV1weC9nO2Z1bmN0aW9uIG5vcm1hbGl6ZVVuaXQobil7cmV0dXJuIGdsb2JhbC5XWEVudmlyb25tZW50LmR5bmFtaWNScHh8fCJPYmplY3QiIT09dHlwb2Yobil8fE9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9bltlXTsic3RyaW5nIj09dHlwZW9mIHQmJihuW2VdPXQucmVwbGFjZShVTklUX1JFLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHVweDJweCh0KX0pKX0pLG59ZnVuY3Rpb24gZGVlcENsb25lKGUsaSl7cmV0dXJuIGUubWFwKGZ1bmN0aW9uIGUodCl7dmFyIG49dC5jaGlsZHJlbiYmdC5jaGlsZHJlbi5tYXAoZSkscj1pKHQudGFnLHQuZGF0YSxuKTtyZXR1cm4gci50ZXh0PXQudGV4dCxyLmlzQ29tbWVudD10LmlzQ29tbWVudCxyLmNvbXBvbmVudE9wdGlvbnM9dC5jb21wb25lbnRPcHRpb25zLHIuZWxtPXQuZWxtLHIuY29udGV4dD10LmNvbnRleHQsci5ucz10Lm5zLHIuaXNTdGF0aWM9dC5pc1N0YXRpYyxyLmtleT10LmtleSxyfSl9ZnVuY3Rpb24gZ2VuZXJhdGVEZWNsYXJhdGlvbihlLHQsbil7cmV0dXJue3R5cGU6ImRlY2xhcmF0aW9uIixwcm9wZXJ0eTplLHZhbHVlOnR9fWZ1bmN0aW9uIGNsZWFySW1wb3J0YW50KGUpe3ZhciB0PVN0cmluZyhlKS5yZXBsYWNlKC9ccyohaW1wb3J0YW50L2csIiIpO3JldHVybnt2YWx1ZTp0LGltcG9ydGFudDplIT09dH19ZnVuY3Rpb24gbWFyZ2luKGUpe3ZhciB0PWNsZWFySW1wb3J0YW50KGUudmFsdWUpLG49dC52YWx1ZSxyPXQuaW1wb3J0YW50LGk9ZS5wb3NpdGlvbixvPW4uc3BsaXQoL1xzKy8pLGE9W107c3dpdGNoKG8ubGVuZ3RoKXtjYXNlIDE6by5wdXNoKG9bMF0sb1swXSxvWzBdKTticmVhaztjYXNlIDI6by5wdXNoKG9bMF0sb1sxXSk7YnJlYWs7Y2FzZSAzOm8ucHVzaChvWzFdKX1yZXR1cm4gYS5wdXNoKGdlbmVyYXRlRGVjbGFyYXRpb24oIm1hcmdpblRvcCIsb1swXSxyLGkpLGdlbmVyYXRlRGVjbGFyYXRpb24oIm1hcmdpblJpZ2h0IixvWzFdLHIsaSksZ2VuZXJhdGVEZWNsYXJhdGlvbigibWFyZ2luQm90dG9tIixvWzJdLHIsaSksZ2VuZXJhdGVEZWNsYXJhdGlvbigibWFyZ2luTGVmdCIsb1szXSxyLGkpKSxhfWZ1bmN0aW9uIGJvcmRlcihlKXt2YXIgdD1jbGVhckltcG9ydGFudChlLnZhbHVlKSxuPXQudmFsdWUscj10LmltcG9ydGFudCxpPWUucHJvcGVydHksbz1uLnJlcGxhY2UoL1xzKixccyovZywiLCIpLnNwbGl0KC9ccysvKSxhPVsvXltcZC5dK1xTKiQvLC9eKHNvbGlkfGRhc2hlZHxkb3R0ZWQpJC8sL1xTKy9dLm1hcChmdW5jdGlvbih0KXt2YXIgZT1vLmZpbmRJbmRleChmdW5jdGlvbihlKXtyZXR1cm4gdC50ZXN0KGUpfSk7cmV0dXJuIGU8MD9udWxsOm8uc3BsaWNlKGUsMSlbMF19KTtyZXR1cm4gby5sZW5ndGg/ZTpbZ2VuZXJhdGVEZWNsYXJhdGlvbihpKyJXaWR0aCIsKGFbMF18fCIwIikudHJpbSgpLHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oaSsiU3R5bGUiLChhWzFdfHwic29saWQiKS50cmltKCksciksZ2VuZXJhdGVEZWNsYXJhdGlvbihpKyJDb2xvciIsKGFbMl18fCIjMDAwMDAwIikudHJpbSgpLHIpXX1mdW5jdGlvbiBib3JkZXJQcm9wZXJ0eShlKXt2YXIgdD1jbGVhckltcG9ydGFudChlLnZhbHVlKSxuPXQudmFsdWUscj10LmltcG9ydGFudCxpPWUucHJvcGVydHkuc3Vic3RyaW5nKDYpLG89bi5yZXBsYWNlKC9ccyosXHMqL2csIiwiKS5zcGxpdCgvXHMrLyksYT1bXTtzd2l0Y2goby5sZW5ndGgpe2Nhc2UgMTpyZXR1cm4gZTtjYXNlIDI6by5wdXNoKG9bMF0sb1sxXSk7YnJlYWs7Y2FzZSAzOm8ucHVzaChvWzFdKX1yZXR1cm4gYS5wdXNoKGdlbmVyYXRlRGVjbGFyYXRpb24oImJvcmRlclRvcCIraSxvWzBdLHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oImJvcmRlclJpZ2h0IitpLG9bMV0sciksZ2VuZXJhdGVEZWNsYXJhdGlvbigiYm9yZGVyQm90dG9tIitpLG9bMl0sciksZ2VuZXJhdGVEZWNsYXJhdGlvbigiYm9yZGVyTGVmdCIraSxvWzNdLHIpKSxhfWZ1bmN0aW9uIGJvcmRlclJhZGl1cyhlKXt2YXIgdD1jbGVhckltcG9ydGFudChlLnZhbHVlKSxuPXQudmFsdWUscj10LmltcG9ydGFudCxpPW4uc3BsaXQoL1xzKy8pLG89W107aWYobi5pbmNsdWRlcygiLyIpKXJldHVybiBlO3N3aXRjaChpLmxlbmd0aCl7Y2FzZSAxOnJldHVybiBlO2Nhc2UgMjppLnB1c2goaVswXSxpWzFdKTticmVhaztjYXNlIDM6aS5wdXNoKGlbMV0pfXJldHVybiBvLnB1c2goZ2VuZXJhdGVEZWNsYXJhdGlvbigiYm9yZGVyVG9wTGVmdFJhZGl1cyIsaVswXSxyKSxnZW5lcmF0ZURlY2xhcmF0aW9uKCJib3JkZXJUb3BMaWdodFJhZGl1cyIsaVsxXSxyKSxnZW5lcmF0ZURlY2xhcmF0aW9uKCJib3JkZXJCb3R0b21SaWdodFJhZGl1cyIsaVsyXSxyKSxnZW5lcmF0ZURlY2xhcmF0aW9uKCJib3JkZXJCb3R0b21MZWZ0UmFkaXVzIixpWzNdLHIpKSxvfWZ1bmN0aW9uIGZsZXhGbG93KGUpe3ZhciB0PWNsZWFySW1wb3J0YW50KGUudmFsdWUpLG49dC52YWx1ZSxyPXQuaW1wb3J0YW50LGk9bi5zcGxpdCgvXHMrLyksbz1bL14oY29sdW1ufGNvbHVtbi1yZXZlcnNlfHJvd3xyb3ctcmV2ZXJzZSkkLywvXihub3dyYXB8d3JhcHx3cmFwLXJldmVyc2UpJC9dLm1hcChmdW5jdGlvbih0KXt2YXIgZT1pLmZpbmRJbmRleChmdW5jdGlvbihlKXtyZXR1cm4gdC50ZXN0KGUpfSk7cmV0dXJuIGU8MD9udWxsOmkuc3BsaWNlKGUsMSlbMF19KTtyZXR1cm4gaS5sZW5ndGg/ZTpbZ2VuZXJhdGVEZWNsYXJhdGlvbigiZmxleERpcmVjdGlvbiIsb1swXXx8ImNvbHVtbiIsciksZ2VuZXJhdGVEZWNsYXJhdGlvbigiZmxleFdyYXAiLG9bMV18fCJub3dyYXAiLHIpXX1mdW5jdGlvbiBmb250KGUpe3ZhciB0PWNsZWFySW1wb3J0YW50KGUudmFsdWUpLG49dC52YWx1ZSxyPXQuaW1wb3J0YW50LGk9bi5yZXBsYWNlKC8sXHMqL2csIiwiKS5yZXBsYWNlKC9ccypcL1xzKi8sIi8iKS5yZXBsYWNlKC9bJyJdLis/WyciXS9nLGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoL1xzKy9nLCIjIil9KS5zcGxpdCgvXHMrLyksbz1bXSxhPVsibm9ybWFsIiwiaXRhbGljIiwib2JsaXF1ZSJdO28ucHVzaChnZW5lcmF0ZURlY2xhcmF0aW9uKCJmb250U3R5bGUiLGFbTWF0aC5tYXgoMCxhLmluZGV4T2YoaVswXSkpXSxyKSk7dmFyIHM9aS5zbGljZSgwLC0yKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybi9ub3JtYWx8Ym9sZHxsaWdodGVyfGJvbGRlcnxcZCsvLnRlc3QoZSl9KTtpZihzJiZvLnB1c2goZ2VuZXJhdGVEZWNsYXJhdGlvbigiZm9udFdlaWdodCIscyxyKSksaT1pLnNsaWNlKC0yKSwvW1xkLl0rXFMqKFwvW1xkLl0rXFMqKT8vLnRlc3QoaVswXSkpe3ZhciBjPWlbMF0uc3BsaXQoIi8iKSx1PWNbMF0sbD1jWzFdO3JldHVybiBvLnB1c2goZ2VuZXJhdGVEZWNsYXJhdGlvbigiZm9udFNpemUiLHUsciksZ2VuZXJhdGVEZWNsYXJhdGlvbigibGluZUhlaWdodCIsbHx8Im5vcm1hbCIsciksZ2VuZXJhdGVEZWNsYXJhdGlvbigiZm9udEZhbWlseSIsaVsxXS5yZXBsYWNlKC8jL2csIiAiKSxyKSksb31yZXR1cm5bXX1mdW5jdGlvbiBiYWNrZ3JvdW5kKGUpe3ZhciB0PWNsZWFySW1wb3J0YW50KGUudmFsdWUpLG49dC52YWx1ZSxyPXQuaW1wb3J0YW50O3JldHVybi9eIz9cUyskLy50ZXN0KG4pfHwvXnJnYmE/KC4rKSQvLnRlc3Qobik/Z2VuZXJhdGVEZWNsYXJhdGlvbigiYmFja2dyb3VuZENvbG9yIixuLHIpOi9ebGluZWFyLWdyYWRpZW50KC4rKSQvLnRlc3Qobik/Z2VuZXJhdGVEZWNsYXJhdGlvbigiYmFja2dyb3VuZEltYWdlIixuLHIpOmV9dmFyIHBhcnNlckNvbGxlY3Rpb249e21hcmdpbjptYXJnaW4sYm9yZGVyOmJvcmRlcixib3JkZXJUb3A6Ym9yZGVyLGJvcmRlclJpZ2h0OmJvcmRlcixib3JkZXJCb3R0b206Ym9yZGVyLGJvcmRlckxlZnQ6Ym9yZGVyLGJvcmRlclN0eWxlOmJvcmRlclByb3BlcnR5LGJvcmRlcldpZHRoOmJvcmRlclByb3BlcnR5LGJvcmRlckNvbG9yOmJvcmRlclByb3BlcnR5LGJvcmRlclJhZGl1czpib3JkZXJSYWRpdXMsZmxleEZsb3c6ZmxleEZsb3csZm9udDpmb250LGJhY2tncm91bmQ6YmFja2dyb3VuZH07ZnVuY3Rpb24gZXhwYW5kU2hvcnRoYW5kUHJvcGVydHkoZSl7dmFyIHQ9cGFyc2VyQ29sbGVjdGlvbltlLnByb3BlcnR5XTtyZXR1cm4gdCYmKGU9dChlKSksW10uY29uY2F0KGUpfXZhciBERUZBVUxUX1RBR19OQU1FPSJkaXYiLEJVQkJMRV9FVkVOVFM9WyJjbGljayIsImxvbmdwcmVzcyIsInRvdWNoc3RhcnQiLCJ0b3VjaG1vdmUiLCJ0b3VjaGVuZCIsInBhbnN0YXJ0IiwicGFubW92ZSIsInBhbmVuZCIsImhvcml6b250YWxwYW4iLCJ2ZXJ0aWNhbHBhbiIsInN3aXBlIl07ZnVuY3Rpb24gcmVnaXN0ZXJOb2RlKGUsdCl7Z2V0RG9jKGUpLm5vZGVNYXBbdC5ub2RlSWRdPXR9dmFyIEVsZW1lbnQ9ZnVuY3Rpb24oaSl7ZnVuY3Rpb24gZShlLHQsbil7dm9pZCAwPT09ZSYmKGU9REVGQVVMVF9UQUdfTkFNRSksaS5jYWxsKHRoaXMpO3ZhciByPWdldFdlZXhFbGVtZW50KGUpO2lmKHImJiFuKXJldHVybiBuZXcgcihlLHQsITApO3Q9dHx8e30sdGhpcy5ub2RlVHlwZT0xLHRoaXMubm9kZUlkPXVuaXF1ZUlkKCksdGhpcy5yZWY9dGhpcy5ub2RlSWQsdGhpcy50eXBlPWUsdGhpcy5hdHRyPXQuYXR0cnx8e30sdGhpcy5zdHlsZT10LnN0eWxlfHx7fSx0aGlzLmNsYXNzU3R5bGU9dC5jbGFzc1N0eWxlfHx7fSx0aGlzLmV2ZW50PXt9LHRoaXMuY2hpbGRyZW49W10sdGhpcy5wdXJlQ2hpbGRyZW49W10sdGhpcy5jbGFzc0xpc3Q9dC5jbGFzc0xpc3R8fFtdLHRoaXMuc3R5bGVzaGVldD10LnN0eWxlc2hlZXR8fFtdLHRoaXMucmVhZHk9ITF9cmV0dXJuIGkmJihlLl9fcHJvdG9fXz1pKSwoKGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoaSYmaS5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1lKS5wcm90b3R5cGUuYXBwZW5kQ2hpbGQ9ZnVuY3Rpb24oZSl7aWYoIWUucGFyZW50Tm9kZXx8ZS5wYXJlbnROb2RlPT09dGhpcylpZihlLnBhcmVudE5vZGUpe2lmKGNoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbYXBwZW5kQ2hpbGRdKCIrdGhpcy5kb2NJZCsiLCIrZS50eXBlKyIsIitlLnJlZisiKSBNb3ZlIDwiK2UudHlwZSsiPiB0byAiK3RoaXMuY2hpbGRyZW4ubGVuZ3RoKyIgb2YgPCIrdGhpcy50eXBlKyI+ICgiK3RoaXMucmVmKyIpLiIpLG1vdmVJbmRleChlLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5sZW5ndGgsITApLDE9PT1lLm5vZGVUeXBlKXt2YXIgdD1tb3ZlSW5kZXgoZSx0aGlzLnB1cmVDaGlsZHJlbix0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgpLG49Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTtuJiYwPD10JiYodGhpcy5jb21wdXRlQ2hpbGRyZW5DbGFzc0xpc3QoZSksbi5zZW5kKCJkb20iLHthY3Rpb246Im1vdmVFbGVtZW50In0sW2UucmVmLHRoaXMucmVmLHRdKSl9fWVsc2UgaWYoY2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coIlthcHBlbmRDaGlsZF0oIit0aGlzLmRvY0lkKyIsIitlLnR5cGUrIiwiK2UucmVmKyIpIEFwcGVuZCA8IitlLnR5cGUrIj4gdG8gPCIrdGhpcy50eXBlKyI+ICgiK3RoaXMucmVmKyIpLiIpLGxpbmtQYXJlbnQoZSx0aGlzKSxpbnNlcnRJbmRleChlLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5sZW5ndGgsITApLHRoaXMuZG9jSWQmJnJlZ2lzdGVyTm9kZSh0aGlzLmRvY0lkLGUpLDE9PT1lLm5vZGVUeXBlKXtpbnNlcnRJbmRleChlLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCk7dmFyIHI9Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTtyJiYodGhpcy5jb21wdXRlQ2hpbGRyZW5DbGFzc0xpc3QoZSksci5zZW5kKCJkb20iLHthY3Rpb246ImFkZEVsZW1lbnQifSxbdGhpcy5yZWYsZS50b0pTT04oKSwtMV0pKSxlLnJlYWR5PSEwfX0sZS5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlPWZ1bmN0aW9uKGUsdCl7aWYoIShlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZSE9PXRoaXN8fGU9PT10fHxlLm5leHRTaWJsaW5nJiZlLm5leHRTaWJsaW5nPT09dCkpaWYoZS5wYXJlbnROb2RlKXtpZihtb3ZlSW5kZXgoZSx0aGlzLmNoaWxkcmVuLHRoaXMuY2hpbGRyZW4uaW5kZXhPZih0KSwhMCksMT09PWUubm9kZVR5cGUpe3ZhciBuPW5leHRFbGVtZW50KHQpLHI9bW92ZUluZGV4KGUsdGhpcy5wdXJlQ2hpbGRyZW4sbj90aGlzLnB1cmVDaGlsZHJlbi5pbmRleE9mKG4pOnRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCksaT1nZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpO2kmJjA8PXImJih0aGlzLmNvbXB1dGVDaGlsZHJlbkNsYXNzTGlzdChlKSxpLnNlbmQoImRvbSIse2FjdGlvbjoibW92ZUVsZW1lbnQifSxbZS5yZWYsdGhpcy5yZWYscl0pKX19ZWxzZSBpZihjaGVja0xldmVsKCJkZWJ1ZyIpJiZkZWJ1Z0xvZygiW2luc2VydEJlZm9yZV0oIit0aGlzLmRvY0lkKyIsIitlLnR5cGUrIiwiK2UucmVmKyIpIEluc2VydCA8IitlLnR5cGUrIj4gdG8gPCIrdGhpcy50eXBlKyI+ICgiK3RoaXMucmVmKyIpLCBiZWZvcmUgKCIrdC5yZWYrIikuIiksbGlua1BhcmVudChlLHRoaXMpLGluc2VydEluZGV4KGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmluZGV4T2YodCksITApLHRoaXMuZG9jSWQmJnJlZ2lzdGVyTm9kZSh0aGlzLmRvY0lkLGUpLDE9PT1lLm5vZGVUeXBlKXt2YXIgbz1uZXh0RWxlbWVudCh0KSxhPWluc2VydEluZGV4KGUsdGhpcy5wdXJlQ2hpbGRyZW4sbz90aGlzLnB1cmVDaGlsZHJlbi5pbmRleE9mKG8pOnRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCkscz1nZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpO3MmJih0aGlzLmNvbXB1dGVDaGlsZHJlbkNsYXNzTGlzdChlKSxzLnNlbmQoImRvbSIse2FjdGlvbjoiYWRkRWxlbWVudCJ9LFt0aGlzLnJlZixlLnRvSlNPTigpLGFdKSksZS5yZWFkeT0hMH19LGUucHJvdG90eXBlLmluc2VydEFmdGVyPWZ1bmN0aW9uKGUsdCl7aWYoIShlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZSE9PXRoaXN8fGU9PT10fHxlLnByZXZpb3VzU2libGluZyYmZS5wcmV2aW91c1NpYmxpbmc9PT10KSlpZihlLnBhcmVudE5vZGUpe2lmKG1vdmVJbmRleChlLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKHQpKzEsITApLDE9PT1lLm5vZGVUeXBlKXt2YXIgbj1tb3ZlSW5kZXgoZSx0aGlzLnB1cmVDaGlsZHJlbix0aGlzLnB1cmVDaGlsZHJlbi5pbmRleE9mKHByZXZpb3VzRWxlbWVudCh0KSkrMSkscj1nZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpO3ImJjA8PW4mJih0aGlzLmNvbXB1dGVDaGlsZHJlbkNsYXNzTGlzdChlKSxyLnNlbmQoImRvbSIse2FjdGlvbjoibW92ZUVsZW1lbnQifSxbZS5yZWYsdGhpcy5yZWYsbl0pKX19ZWxzZSBpZihjaGVja0xldmVsKCJkZWJ1ZyIpJiZkZWJ1Z0xvZygiW2luc2VydEFmdGVyXSgiK3RoaXMuZG9jSWQrIiwiK2UudHlwZSsiLCIrZS5yZWYrIikgSW5zZXJ0IDwiK2UudHlwZSsiPiB0byA8Iit0aGlzLnR5cGUrIj4gKCIrdGhpcy5yZWYrIiksIGFmdGVyICgiK3QucmVmKyIpLiIpLGxpbmtQYXJlbnQoZSx0aGlzKSxpbnNlcnRJbmRleChlLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKHQpKzEsITApLHRoaXMuZG9jSWQmJnJlZ2lzdGVyTm9kZSh0aGlzLmRvY0lkLGUpLDE9PT1lLm5vZGVUeXBlKXt2YXIgaT1pbnNlcnRJbmRleChlLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YocHJldmlvdXNFbGVtZW50KHQpKSsxKSxvPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7byYmKHRoaXMuY29tcHV0ZUNoaWxkcmVuQ2xhc3NMaXN0KGUpLG8uc2VuZCgiZG9tIix7YWN0aW9uOiJhZGRFbGVtZW50In0sW3RoaXMucmVmLGUudG9KU09OKCksaV0pKSxlLnJlYWR5PSEwfX0sZS5wcm90b3R5cGUucmVtb3ZlQ2hpbGQ9ZnVuY3Rpb24oZSx0KXtpZihlLnBhcmVudE5vZGUpe2lmKHJlbW92ZUluZGV4KGUsdGhpcy5jaGlsZHJlbiwhMCksMT09PWUubm9kZVR5cGUpe2NoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbcmVtb3ZlQ2hpbGRdKCIrdGhpcy5kb2NJZCsiLCIrZS50eXBlKyIsIitlLnJlZisiKSBSZW1vdmUgPCIrZS50eXBlKyI+IGZyb20gPCIrdGhpcy50eXBlKyI+ICgiK3RoaXMucmVmKyIpLiIpLHJlbW92ZUluZGV4KGUsdGhpcy5wdXJlQ2hpbGRyZW4pO3ZhciBuPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7biYmbi5zZW5kKCJkb20iLHthY3Rpb246InJlbW92ZUVsZW1lbnQifSxbZS5yZWZdKSxlLnJlYWR5PSExfXRoaXMuY29tcHV0ZUNoaWxkcmVuQ2xhc3NMaXN0KGUsZS5uZXh0U2libGluZ3x8e30pfXR8fGUuZGVzdHJveSgpfSxlLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3ZhciB0PWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7dGhpcy5wdXJlQ2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlKXt0JiZ0LnNlbmQoImRvbSIse2FjdGlvbjoicmVtb3ZlRWxlbWVudCJ9LFtlLnJlZl0pLGUucmVhZHk9ITF9KSx0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5kZXN0cm95KCl9KSx0aGlzLmNoaWxkcmVuLmxlbmd0aD0wLHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aD0wfSxlLnByb3RvdHlwZS5zZXRBdHRyPWZ1bmN0aW9uKGUsdCxuKXtpZih0aGlzLmF0dHJbZV0hPT10fHwhMT09PW4pe3RoaXMuYXR0cltlXT10O3ZhciByPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7aWYoIW4mJnIpe3ZhciBpPXt9O2lbZV09dCxyLnNlbmQoImRvbSIse2FjdGlvbjoidXBkYXRlQXR0cnMifSxbdGhpcy5yZWYsaV0pfX19LGUucHJvdG90eXBlLnNldEF0dHJzPWZ1bmN0aW9uKGUsdCl7aWYoIWlzRW1wdHkoZSkpe3ZhciBuPXt9O2Zvcih2YXIgciBpbiBlKXRoaXMuYXR0cltyXSE9PWVbcl0mJih0aGlzLmF0dHJbcl09ZVtyXSxuW3JdPWVbcl0pO2lmKCFpc0VtcHR5KG4pKXt2YXIgaT1nZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpOyF0JiZpJiZpLnNlbmQoImRvbSIse2FjdGlvbjoidXBkYXRlQXR0cnMifSxbdGhpcy5yZWYsbl0pfX19LGUucHJvdG90eXBlLnNldFN0eWxlPWZ1bmN0aW9uKGUsdCxvKXt2YXIgYT10aGlzO2V4cGFuZFNob3J0aGFuZFByb3BlcnR5KHtwcm9wZXJ0eTplLHZhbHVlOnR9KS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUucHJvcGVydHksbj1lLnZhbHVlO2lmKGEuc3R5bGVbdF0hPT1ufHwhMT09PW8pe2Euc3R5bGVbdF09bjt2YXIgcj1nZXRUYXNrQ2VudGVyKGEuZG9jSWQpO2lmKCFvJiZyKXt2YXIgaT17fTtpW3RdPW4sci5zZW5kKCJkb20iLHthY3Rpb246InVwZGF0ZVN0eWxlIn0sW2EucmVmLGldKX19fSl9LGUucHJvdG90eXBlLnNldFN0eWxlcz1mdW5jdGlvbihlLHQpe3ZhciByPXRoaXM7aWYoIWlzRW1wdHkoZSkpe3ZhciBpPXt9O2Zvcih2YXIgbiBpbiBlKXtleHBhbmRTaG9ydGhhbmRQcm9wZXJ0eSh7cHJvcGVydHk6bix2YWx1ZTplW25dfSkuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnByb3BlcnR5LG49ZS52YWx1ZTtyLnN0eWxlW3RdIT09biYmKHIuc3R5bGVbdF09bixpW3RdPW4pfSl9aWYoIWlzRW1wdHkoaSkpe3ZhciBvPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7IXQmJm8mJm8uc2VuZCgiZG9tIix7YWN0aW9uOiJ1cGRhdGVTdHlsZSJ9LFt0aGlzLnJlZixpXSl9fX0sZS5wcm90b3R5cGUuc2V0Q2xhc3NTdHlsZT1mdW5jdGlvbihlKXt2YXIgdD0hMTtmb3IodmFyIG4gaW4gdGhpcy5jbGFzc1N0eWxlKW4gaW4gZXx8KHQ9ITAsdGhpcy5jbGFzc1N0eWxlW25dPSIiKTtmb3IodmFyIHIgaW4gZSllW3JdIT09dGhpcy5jbGFzc1N0eWxlW3JdJiYodD0hMCx0aGlzLmNsYXNzU3R5bGVbcl09ZVtyXSk7aWYodCl7dmFyIGk9Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTtpJiZ0aGlzLnJlYWR5JiZpLnNlbmQoImRvbSIse2FjdGlvbjoidXBkYXRlU3R5bGUifSxbdGhpcy5yZWYsdGhpcy50b1N0eWxlKCldKX19LGUucHJvdG90eXBlLmFkZEV2ZW50PWZ1bmN0aW9uKGUsdCxuKXtpZih0aGlzLmV2ZW50fHwodGhpcy5ldmVudD17fSksIXRoaXMuZXZlbnRbZV0pe2NoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbYWRkRXZlbnRdKCIrdGhpcy5kb2NJZCsiLCIrdGhpcy50eXBlKyIsIit0aGlzLnJlZisnKSBBZGQgIicrZSsnIiBldmVudCBvbiA8Jyt0aGlzLnR5cGUrIj4gKCIrdGhpcy5yZWYrIikuIiksdGhpcy5ldmVudFtlXT17aGFuZGxlcjp0LHBhcmFtczpufTt2YXIgcj1nZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpO3ImJnIuc2VuZCgiZG9tIix7YWN0aW9uOiJhZGRFdmVudCJ9LFt0aGlzLnJlZixlXSl9fSxlLnByb3RvdHlwZS5yZW1vdmVFdmVudD1mdW5jdGlvbihlKXtpZih0aGlzLmV2ZW50JiZ0aGlzLmV2ZW50W2VdKXtjaGVja0xldmVsKCJkZWJ1ZyIpJiZkZWJ1Z0xvZygiW3JlbW92ZUV2ZW50XSgiK3RoaXMuZG9jSWQrIiwiK3RoaXMudHlwZSsiLCIrdGhpcy5yZWYrJykgUmVtb3ZlICInK2UrJyIgZXZlbnQgb24gPCcrdGhpcy50eXBlKyI+ICgiK3RoaXMucmVmKyIpLiIpLGRlbGV0ZSB0aGlzLmV2ZW50W2VdO3ZhciB0PWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7dCYmdC5zZW5kKCJkb20iLHthY3Rpb246InJlbW92ZUV2ZW50In0sW3RoaXMucmVmLGVdKX19LGUucHJvdG90eXBlLmZpcmVFdmVudD1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT1udWxsLG89ITEsYT10aGlzLmV2ZW50W3RdO2lmKGEmJmUpe2NoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbZmlyZUV2ZW50XSgiK3RoaXMuZG9jSWQrIiwiK3RoaXMudHlwZSsiLCIrdGhpcy5yZWYrJykgRmlyZSAiJyt0KyciIGV2ZW50IG9uIDwnK3RoaXMudHlwZSsiPiAoIit0aGlzLnJlZisiKS4iKTt2YXIgcz1hLmhhbmRsZXI7ZS5zdG9wUHJvcGFnYXRpb249ZnVuY3Rpb24oKXtvPSEwfTt0cnl7aT1yJiZyLnBhcmFtcz9zLmNhbGwuYXBwbHkocyxbdGhpc10uY29uY2F0KHIucGFyYW1zLFtlXSkpOnMuY2FsbCh0aGlzLGUpfWNhdGNoKGUpe3Rocm93IGNvbnNvbGUuZXJyb3IoJ1tKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBpbnZva2UgdGhlIGV2ZW50IGhhbmRsZXIgb2YgIicrdCsnIiBvbiAnK3RoaXMudHlwZSsiICgiK3RoaXMucmVmKyIpOlxuICIrZS50b1N0cmluZygpKSxlfX1yZXR1cm4hbyYmbiYmLTEhPT1CVUJCTEVfRVZFTlRTLmluZGV4T2YodCkmJnRoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmZpcmVFdmVudCYmKGUuY3VycmVudFRhcmdldD10aGlzLnBhcmVudE5vZGUsdGhpcy5wYXJlbnROb2RlLmZpcmVFdmVudCh0LGUsbikpLGl9LGUucHJvdG90eXBlLnRvU3R5bGU9ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSx0aGlzLmNsYXNzU3R5bGUsdGhpcy5zdHlsZSl9LGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT0hMSk7dmFyIHQ9e3JlZjp0aGlzLnJlZi50b1N0cmluZygpLHR5cGU6dGhpcy50eXBlLGF0dHI6dGhpcy5hdHRyLHN0eWxlOm5vcm1hbGl6ZVVuaXQodGhpcy50b1N0eWxlKCkpfTt0aGlzLmNsYXNzTGlzdCYmdGhpcy5jbGFzc0xpc3QubGVuZ3RoJiYodC5jbGFzcz10aGlzLmNsYXNzTGlzdC5qb2luKCIgIikpO3ZhciBuPVtdO2Zvcih2YXIgciBpbiB0aGlzLmV2ZW50KXt2YXIgaT10aGlzLmV2ZW50W3JdLnBhcmFtcztpP24ucHVzaCh7dHlwZTpyLHBhcmFtczppfSk6bi5wdXNoKHIpfXJldHVybiBuLmxlbmd0aCYmKHQuZXZlbnQ9biksIWUmJnRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCYmKHQuY2hpbGRyZW49dGhpcy5wdXJlQ2hpbGRyZW4ubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRvSlNPTigpfSkpLHR9LGUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIjwiK3RoaXMudHlwZSsiIGF0dHI9IitKU09OLnN0cmluZ2lmeSh0aGlzLmF0dHIpKyIgc3R5bGU9IitKU09OLnN0cmluZ2lmeSh0aGlzLnRvU3R5bGUoKSkrIj4iK3RoaXMucHVyZUNoaWxkcmVuLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS50b1N0cmluZygpfSkuam9pbigiIikrIjwvIit0aGlzLnR5cGUrIj4ifSxlLnByb3RvdHlwZS5zZXRDbGFzc0xpc3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztlLmxlbmd0aD09PXRoaXMuY2xhc3NMaXN0Lmxlbmd0aCYmMD09PWUuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiF0LmNsYXNzTGlzdC5pbmNsdWRlcyhlKX0pLmxlbmd0aHx8KHRoaXMuY2xhc3NMaXN0PWUsdGhpcy5wYXJlbnROb2RlJiZ0aGlzLmNvbXB1dGVDbGFzc0xpc3QoKSl9LGUucHJvdG90eXBlLnNldFN0eWxlc2hlZXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztlLmxlbmd0aD09PXRoaXMuc3R5bGVzaGVldC5sZW5ndGgmJjA9PT1lLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hdC5zdHlsZXNoZWV0LmluY2x1ZGVzKGUpfSkubGVuZ3RofHwodGhpcy5zdHlsZXNoZWV0PWUsdGhpcy5jbGFzc0xpc3QubGVuZ3RoJiZ0aGlzLnBhcmVudE5vZGUmJnRoaXMuY29tcHV0ZUNsYXNzTGlzdCgpKX0sZS5wcm90b3R5cGUuY29tcHV0ZUNoaWxkcmVuQ2xhc3NMaXN0PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jaGlsZHJlbixyPXR8fGUsaT1yP24uaW5kZXhPZihyKTowLG89bi5sZW5ndGgtMTtmb3IoIWV8fGUuY2xhc3NMaXN0JiZlLmNsYXNzTGlzdC5sZW5ndGh8fChvPXQ/aS0xOmkpOzA8PWkmJmk8PW87aSsrKXt2YXIgYT1uW2ldO2EuY29tcHV0ZUNsYXNzTGlzdCYmYS5jb21wdXRlQ2xhc3NMaXN0KCl9fSxlLnByb3RvdHlwZS5jb21wdXRlQ2xhc3NMaXN0PWZ1bmN0aW9uKCl7dmFyIHU9dGhpcyxlPXRoaXMuY2xhc3NMaXN0LHQ9dGhpcy5zdHlsZXNoZWV0LHA9e30saD17fTtmdW5jdGlvbiBsKGUsdCl7dmFyIG49dCYmdC5jbGFzc0xpc3Q7cmV0dXJuIG4mJm4uaW5jbHVkZXMoZSl9dC5mb3JFYWNoKGZ1bmN0aW9uKG4sZil7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKChuWyJAVkVSU0lPTiJdfHwxKTwyKXt2YXIgdD1uW2VdO3QmJk9iamVjdC5hc3NpZ24ocCx0KX1lbHNle3ZhciBjPW5bIi4iK2VdO2MmJk9iamVjdC5rZXlzKGMpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9dTtpZihlKWZvcih2YXIgbj1lLnNwbGl0KCIuIikscj1uLmxlbmd0aC0xOzA8cjtyLS0pe3ZhciBpPW5bcl0sbz1pW2kubGVuZ3RoLTFdLGE9aS5yZXBsYWNlKC9bK34+IF0kLywiIik7aWYoIn4iPT09b3x8IiAiPT09byl7Zm9yKHZhciBzPSJ+Ij09PW8/InByZXZpb3VzU2libGluZyI6InBhcmVudE5vZGUiO3QmJiFsKGEsdD10W3NdKTspO2lmKCF0KXJldHVybn1lbHNlIGlmKCI+Ij09PW8/dD10JiZ0LnBhcmVudE5vZGU6IisiPT09byYmKHQ9dCYmdC5wcmV2aW91c1NpYmxpbmcpLCFsKGEsdCkpcmV0dXJufXZhciBkPWNbZV07T2JqZWN0LmtleXMoZCkuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1kW2VdLG49dFswXSxyPXRbMV0saT10WzJdLG89dFszXSxhPVtyLGksZixvXSxzPWhbZV0sYz0hMDtpZihzKWZvcih2YXIgdT0wO3U8cy5sZW5ndGg7dSsrKXt2YXIgbD1hW3VdLXNbdV07aWYoMCE9PWwpe2M9MDxsO2JyZWFrfX1jJiYocFtlXT1uLGhbZV09YSl9KX0pfX0pfSksdGhpcy5zZXRDbGFzc1N0eWxlKHApLHRoaXMuY29tcHV0ZUNoaWxkcmVuQ2xhc3NMaXN0KCl9LGV9KE5vZGUpO2Z1bmN0aW9uIG5vcm1hbGl6ZVByaW1pdGl2ZShlKXt2YXIgdD10eXBvZihlKTtzd2l0Y2godCl7Y2FzZSJVbmRlZmluZWQiOmNhc2UiTnVsbCI6cmV0dXJuIiI7Y2FzZSJSZWdFeHAiOnJldHVybiBlLnRvU3RyaW5nKCk7Y2FzZSJEYXRlIjpyZXR1cm4gZS50b0lTT1N0cmluZygpO2Nhc2UiTnVtYmVyIjpjYXNlIlN0cmluZyI6Y2FzZSJCb29sZWFuIjpjYXNlIkFycmF5IjpjYXNlIk9iamVjdCI6cmV0dXJuIGU7Y2FzZSJBcnJheUJ1ZmZlciI6cmV0dXJueyJAdHlwZSI6ImJpbmFyeSIsZGF0YVR5cGU6dCxiYXNlNjQ6YnVmZmVyVG9CYXNlNjQoZSl9O2Nhc2UiSW50OEFycmF5IjpjYXNlIlVpbnQ4QXJyYXkiOmNhc2UiVWludDhDbGFtcGVkQXJyYXkiOmNhc2UiSW50MTZBcnJheSI6Y2FzZSJVaW50MTZBcnJheSI6Y2FzZSJJbnQzMkFycmF5IjpjYXNlIlVpbnQzMkFycmF5IjpjYXNlIkZsb2F0MzJBcnJheSI6Y2FzZSJGbG9hdDY0QXJyYXkiOnJldHVybnsiQHR5cGUiOiJiaW5hcnkiLGRhdGFUeXBlOnQsYmFzZTY0OmJ1ZmZlclRvQmFzZTY0KGUuYnVmZmVyKX07ZGVmYXVsdDpyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSl9fXNldEVsZW1lbnQoRWxlbWVudCk7dmFyIGZhbGxiYWNrPWZ1bmN0aW9uKCl7fSxUYXNrQ2VudGVyPWZ1bmN0aW9uKGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImluc3RhbmNlSWQiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOlN0cmluZyhlKX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJjYWxsYmFja01hbmFnZXIiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOm5ldyBDYWxsYmFja01hbmFnZXIoZSl9KSxmYWxsYmFjaz10fHxmdW5jdGlvbigpe319O2Z1bmN0aW9uIGluaXQkMSgpe3ZhciBlPXtjcmVhdGVGaW5pc2g6Z2xvYmFsLmNhbGxDcmVhdGVGaW5pc2gsdXBkYXRlRmluaXNoOmdsb2JhbC5jYWxsVXBkYXRlRmluaXNoLHJlZnJlc2hGaW5pc2g6Z2xvYmFsLmNhbGxSZWZyZXNoRmluaXNoLGNyZWF0ZUJvZHk6Z2xvYmFsLmNhbGxDcmVhdGVCb2R5LGFkZEVsZW1lbnQ6Z2xvYmFsLmNhbGxBZGRFbGVtZW50LHJlbW92ZUVsZW1lbnQ6Z2xvYmFsLmNhbGxSZW1vdmVFbGVtZW50LG1vdmVFbGVtZW50Omdsb2JhbC5jYWxsTW92ZUVsZW1lbnQsdXBkYXRlQXR0cnM6Z2xvYmFsLmNhbGxVcGRhdGVBdHRycyx1cGRhdGVTdHlsZTpnbG9iYWwuY2FsbFVwZGF0ZVN0eWxlLGFkZEV2ZW50Omdsb2JhbC5jYWxsQWRkRXZlbnQscmVtb3ZlRXZlbnQ6Z2xvYmFsLmNhbGxSZW1vdmVFdmVudCxfX3VwZGF0ZUNvbXBvbmVudERhdGE6Z2xvYmFsLl9fdXBkYXRlQ29tcG9uZW50RGF0YX0sdD1UYXNrQ2VudGVyLnByb3RvdHlwZSxuPWZ1bmN0aW9uKG4pe3ZhciByPWVbbl07dFtuXT1yP2Z1bmN0aW9uKGUsdCl7cmV0dXJuIHIuYXBwbHkodm9pZCAwLFtlXS5jb25jYXQodCkpfTpmdW5jdGlvbihlLHQpe3JldHVybiBmYWxsYmFjayhlLFt7bW9kdWxlOiJkb20iLG1ldGhvZDpuLGFyZ3M6dH1dLCItMSIpfX07Zm9yKHZhciByIGluIGUpbihyKTt0LmNvbXBvbmVudEhhbmRsZXI9Z2xvYmFsLmNhbGxOYXRpdmVDb21wb25lbnR8fGZ1bmN0aW9uKGUsdCxuLHIsaSl7cmV0dXJuIGZhbGxiYWNrKGUsW3tjb21wb25lbnQ6aS5jb21wb25lbnQscmVmOnQsbWV0aG9kOm4sYXJnczpyfV0pfSx0Lm1vZHVsZUhhbmRsZXI9Z2xvYmFsLmNhbGxOYXRpdmVNb2R1bGV8fGZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBmYWxsYmFjayhlLFt7bW9kdWxlOnQsbWV0aG9kOm4sYXJnczpyfV0pfX1mdW5jdGlvbiBmaXJlRXZlbnQoZSx0LG4scixpLG8pe3ZhciBhPWUuZ2V0UmVmKHQpO3JldHVybiBhP2UuZmlyZUV2ZW50KGEsbixyLGksbyk6cj8oci5fbm9kZUlkPXQsZS5maXJlRXZlbnQoZS5nZXRSZWYoIl9kb2N1bWVudEVsZW1lbnQiKSxuLHIsaSxvKSk6dm9pZCAwfWZ1bmN0aW9uIGNhbGxiYWNrKGUsdCxuLHIpe3JldHVybiBlLnRhc2tDZW50ZXIuY2FsbGJhY2sodCxuLHIpfWZ1bmN0aW9uIGNvbXBvbmVudEhvb2soZSx0LG4scixpKXtpZighZXx8IWUudGFza0NlbnRlcilyZXR1cm4gY29uc29sZS5lcnJvcignW0pTIEZyYW1ld29ya10gQ2FuXCd0IGZpbmQgImRvY3VtZW50IiBvciAidGFza0NlbnRlciIuJyksbnVsbDt2YXIgbz1udWxsO3RyeXtvPWUudGFza0NlbnRlci50cmlnZ2VySG9vayh0LG4scixpKX1jYXRjaChlKXt0aHJvdyBjb25zb2xlLmVycm9yKCdbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gdHJpZ2dlciB0aGUgIicrbisiQCIrcisnIiBob29rIG9uICcrdCsiLiIpLGV9cmV0dXJuIG99ZnVuY3Rpb24gcmVjZWl2ZVRhc2tzKGUsdCl7dmFyIG49Z2V0RG9jKGUpO3JldHVybiBuP0FycmF5LmlzQXJyYXkodCk/dC5tYXAoZnVuY3Rpb24oZSl7c3dpdGNoKGUubWV0aG9kKXtjYXNlImNhbGxiYWNrIjpyZXR1cm4gY2FsbGJhY2suYXBwbHkodm9pZCAwLFtuXS5jb25jYXQoZS5hcmdzKSk7Y2FzZSJmaXJlRXZlbnRTeW5jIjpjYXNlImZpcmVFdmVudCI6cmV0dXJuIGZpcmVFdmVudC5hcHBseSh2b2lkIDAsW25dLmNvbmNhdChlLmFyZ3MpKTtjYXNlImNvbXBvbmVudEhvb2siOnJldHVybiBjb21wb25lbnRIb29rLmFwcGx5KHZvaWQgMCxbbl0uY29uY2F0KGUuYXJncykpfX0pOnZvaWQgMDpuZXcgRXJyb3IoIltKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byByZWNlaXZlVGFza3MsIGluc3RhbmNlICgiK2UrIikgaXMgbm90IGF2YWlsYWJsZS4iKX1UYXNrQ2VudGVyLnByb3RvdHlwZS5jYWxsYmFjaz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuY2FsbGJhY2tNYW5hZ2VyLmNvbnN1bWUoZSx0LG4pfSxUYXNrQ2VudGVyLnByb3RvdHlwZS5yZWdpc3Rlckhvb2s9ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGg7bi0tOyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4oZT10aGlzLmNhbGxiYWNrTWFuYWdlcikucmVnaXN0ZXJIb29rLmFwcGx5KGUsdCl9LFRhc2tDZW50ZXIucHJvdG90eXBlLnRyaWdnZXJIb29rPWZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoO24tLTspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuKGU9dGhpcy5jYWxsYmFja01hbmFnZXIpLnRyaWdnZXJIb29rLmFwcGx5KGUsdCl9LFRhc2tDZW50ZXIucHJvdG90eXBlLnVwZGF0ZURhdGE9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuc2VuZCgibW9kdWxlIix7bW9kdWxlOiJkb20iLG1ldGhvZDoidXBkYXRlQ29tcG9uZW50RGF0YSJ9LFtlLHQsbl0pfSxUYXNrQ2VudGVyLnByb3RvdHlwZS5kZXN0cm95Q2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYWxsYmFja01hbmFnZXIuY2xvc2UoKX0sVGFza0NlbnRlci5wcm90b3R5cGUubm9ybWFsaXplPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpczt2b2lkIDA9PT10JiYodD0hMSk7dmFyIHI9dHlwb2YoZSk7aWYoZSYmZSBpbnN0YW5jZW9mIEVsZW1lbnQpcmV0dXJuIGUucmVmO2lmKGUmJmUuX2lzVnVlJiZlLiRlbCBpbnN0YW5jZW9mIEVsZW1lbnQpcmV0dXJuIGUuJGVsLnJlZjtpZigiRnVuY3Rpb24iPT09cilyZXR1cm4gdGhpcy5jYWxsYmFja01hbmFnZXIuYWRkKGUpLnRvU3RyaW5nKCk7aWYodCl7aWYoIk9iamVjdCI9PT1yKXt2YXIgaT17fTtmb3IodmFyIG8gaW4gZSlpW29dPW4ubm9ybWFsaXplKGVbb10sITApO3JldHVybiBpfWlmKCJBcnJheSI9PT1yKXJldHVybiBlLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gbi5ub3JtYWxpemUoZSwhMCl9KX1yZXR1cm4gZSYmZS5yZWYmJmVbIltbVmlydHVhbEVsZW1lbnRdXSJdP2UucmVmOm5vcm1hbGl6ZVByaW1pdGl2ZShlKX0sVGFza0NlbnRlci5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLG89dC5hY3Rpb24sYT10LmNvbXBvbmVudCxzPXQucmVmLGM9dC5tb2R1bGUsdT10Lm1ldGhvZDtzd2l0Y2gobj1uLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gaS5ub3JtYWxpemUoZSl9KSwiT2JqZWN0Ij09PXR5cG9mKHIpJiYocj10aGlzLm5vcm1hbGl6ZShyLCEwKSksZSl7Y2FzZSJkb20iOnJldHVybiBjaGVja0xldmVsKCJkZWJ1ZyIpJiZkZWJ1Z0xvZygiW3Rhc2tdKCIrdGhpcy5pbnN0YW5jZUlkKyIsIit0aGlzLnR5cGUrIiwiK28rIikgIitKU09OLnN0cmluZ2lmeShuKSksdGhpc1tvXSh0aGlzLmluc3RhbmNlSWQsbik7Y2FzZSJjb21wb25lbnQiOnJldHVybiB0aGlzLmNvbXBvbmVudEhhbmRsZXIodGhpcy5pbnN0YW5jZUlkLHMsdSxuLE9iamVjdC5hc3NpZ24oe2NvbXBvbmVudDphfSxyKSk7ZGVmYXVsdDpyZXR1cm4gY2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coIlt0YXNrXSgiK3RoaXMuaW5zdGFuY2VJZCsiLCIrYysiLCIrdSsiKSAiK0pTT04uc3RyaW5naWZ5KG4pKSx0aGlzLm1vZHVsZUhhbmRsZXIodGhpcy5pbnN0YW5jZUlkLGMsdSxuLHIpfX0sVGFza0NlbnRlci5wcm90b3R5cGUuY2FsbERPTT1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzW2VdKHRoaXMuaW5zdGFuY2VJZCx0KX0sVGFza0NlbnRlci5wcm90b3R5cGUuY2FsbENvbXBvbmVudD1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5jb21wb25lbnRIYW5kbGVyKHRoaXMuaW5zdGFuY2VJZCxlLHQsbixyKX0sVGFza0NlbnRlci5wcm90b3R5cGUuY2FsbE1vZHVsZT1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5tb2R1bGVIYW5kbGVyKHRoaXMuaW5zdGFuY2VJZCxlLHQsbixyKX07dmFyIHdlZXhNb2R1bGVzPXt9O2Z1bmN0aW9uIHJlZ2lzdGVyTW9kdWxlcyhlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZnVuY3Rpb24odCl7aGFzT3duKHdlZXhNb2R1bGVzLHQpfHwod2VleE1vZHVsZXNbdF09e30pLEFycmF5LmlzQXJyYXkoZVt0XSkmJmVbdF0uZm9yRWFjaChmdW5jdGlvbihlKXsic3RyaW5nIj09dHlwZW9mIGU/d2VleE1vZHVsZXNbdF1bZV09ITA6aXNQbGFpbk9iamVjdChlKSYmInN0cmluZyI9PXR5cGVvZiBlLm5hbWUmJih3ZWV4TW9kdWxlc1t0XVtlLm5hbWVdPWUuYXJnc3x8W10pfSl9O2Zvcih2YXIgbiBpbiBlKXQobil9ZnVuY3Rpb24gaXNSZWdpc3RlcmVkTW9kdWxlKGUsdCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0PyEoIXdlZXhNb2R1bGVzW2VdfHwhd2VleE1vZHVsZXNbZV1bdF0pOiEhd2VleE1vZHVsZXNbZV19ZnVuY3Rpb24gZ2V0TW9kdWxlRGVzY3JpcHRpb24oZSl7cmV0dXJuIHdlZXhNb2R1bGVzW2VdfXZhciB3ZWV4Q29tcG9uZW50cz17fTtmdW5jdGlvbiByZWdpc3RlckNvbXBvbmVudHMoZSl7QXJyYXkuaXNBcnJheShlKSYmZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UmJigic3RyaW5nIj09dHlwZW9mIGU/d2VleENvbXBvbmVudHNbZV09ITA6aXNQbGFpbk9iamVjdChlKSYmInN0cmluZyI9PXR5cGVvZiBlLnR5cGUmJnJlZ2lzdGVyRWxlbWVudCgod2VleENvbXBvbmVudHNbZS50eXBlXT1lKS50eXBlLGUubWV0aG9kcykpfSl9ZnVuY3Rpb24gaXNSZWdpc3RlcmVkQ29tcG9uZW50KGUpe3JldHVybiEhd2VleENvbXBvbmVudHNbZV19dmFyIHNlcnZpY2VzPVtdO2Z1bmN0aW9uIHJlZ2lzdGVyKGUsdCl7aGFzKGUpP2NvbnNvbGUud2FybignU2VydmljZSAiJytlKyciIGhhcyBiZWVuIHJlZ2lzdGVyZWQgYWxyZWFkeSEnKToodD1PYmplY3QuYXNzaWduKHt9LHQpLHNlcnZpY2VzLnB1c2goe25hbWU6ZSxvcHRpb25zOnR9KSl9ZnVuY3Rpb24gdW5yZWdpc3RlcihuKXtzZXJ2aWNlcy5zb21lKGZ1bmN0aW9uKGUsdCl7aWYoZS5uYW1lPT09bilyZXR1cm4gc2VydmljZXMuc3BsaWNlKHQsMSksITB9KX1mdW5jdGlvbiBoYXMoZSl7cmV0dXJuIDA8PWluZGV4T2YoZSl9ZnVuY3Rpb24gaW5kZXhPZihlKXtyZXR1cm4gc2VydmljZXMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLm5hbWV9KS5pbmRleE9mKGUpfXZhciBDb21tZW50PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dC5jYWxsKHRoaXMpLHRoaXMubm9kZVR5cGU9OCx0aGlzLm5vZGVJZD11bmlxdWVJZCgpLHRoaXMucmVmPXRoaXMubm9kZUlkLHRoaXMudHlwZT0iY29tbWVudCIsdGhpcy52YWx1ZT1lLHRoaXMuY2hpbGRyZW49W10sdGhpcy5wdXJlQ2hpbGRyZW49W119cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSwoKGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1lKS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iXHgzYyEtLSAiK3RoaXMudmFsdWUrIiAtLVx4M2UifSxlfShOb2RlKTtmdW5jdGlvbiBjcmVhdGVBY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9W10pLHttb2R1bGU6ImRvbSIsbWV0aG9kOmUsYXJnczp0fX12YXIgTGlzdGVuZXI9ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWUsdGhpcy5iYXRjaGVkPSExLHRoaXMudXBkYXRlcz1bXSwiZnVuY3Rpb24iPT10eXBlb2YgdD9PYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaGFuZGxlciIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnR9KTpjb25zb2xlLmVycm9yKCJbSlMgUnVudGltZV0gaW52YWxpZCBwYXJhbWV0ZXIsIGhhbmRsZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIil9O0xpc3RlbmVyLnByb3RvdHlwZS5jcmVhdGVGaW5pc2g9ZnVuY3Rpb24oZSl7cmV0dXJuKDAsdGhpcy5oYW5kbGVyKShbY3JlYXRlQWN0aW9uKCJjcmVhdGVGaW5pc2giKV0sZSl9LExpc3RlbmVyLnByb3RvdHlwZS51cGRhdGVGaW5pc2g9ZnVuY3Rpb24oZSl7cmV0dXJuKDAsdGhpcy5oYW5kbGVyKShbY3JlYXRlQWN0aW9uKCJ1cGRhdGVGaW5pc2giKV0sZSl9LExpc3RlbmVyLnByb3RvdHlwZS5yZWZyZXNoRmluaXNoPWZ1bmN0aW9uKGUpe3JldHVybigwLHRoaXMuaGFuZGxlcikoW2NyZWF0ZUFjdGlvbigicmVmcmVzaEZpbmlzaCIpXSxlKX0sTGlzdGVuZXIucHJvdG90eXBlLmNyZWF0ZUJvZHk9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50b0pTT04oKSxuPXQuY2hpbGRyZW47ZGVsZXRlIHQuY2hpbGRyZW47dmFyIHI9W2NyZWF0ZUFjdGlvbigiY3JlYXRlQm9keSIsW3RdKV07cmV0dXJuIG4mJnIucHVzaC5hcHBseShyLG4ubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBjcmVhdGVBY3Rpb24oImFkZEVsZW1lbnQiLFt0LnJlZixlLC0xXSl9KSksdGhpcy5hZGRBY3Rpb25zKHIpfSxMaXN0ZW5lci5wcm90b3R5cGUuYWRkRWxlbWVudD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIDA8PW58fChuPS0xKSx0aGlzLmFkZEFjdGlvbnMoY3JlYXRlQWN0aW9uKCJhZGRFbGVtZW50IixbdCxlLnRvSlNPTigpLG5dKSl9LExpc3RlbmVyLnByb3RvdHlwZS5yZW1vdmVFbGVtZW50PWZ1bmN0aW9uKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpe3ZhciB0PWUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBjcmVhdGVBY3Rpb24oInJlbW92ZUVsZW1lbnQiLFtlXSl9KTtyZXR1cm4gdGhpcy5hZGRBY3Rpb25zKHQpfXJldHVybiB0aGlzLmFkZEFjdGlvbnMoY3JlYXRlQWN0aW9uKCJyZW1vdmVFbGVtZW50IixbZV0pKX0sTGlzdGVuZXIucHJvdG90eXBlLm1vdmVFbGVtZW50PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigibW92ZUVsZW1lbnQiLFtlLHQsbl0pKX0sTGlzdGVuZXIucHJvdG90eXBlLnNldEF0dHI9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXt9O3JldHVybiByW3RdPW4sdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigidXBkYXRlQXR0cnMiLFtlLHJdKSl9LExpc3RlbmVyLnByb3RvdHlwZS5zZXRTdHlsZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9e307cmV0dXJuIHJbdF09bix0aGlzLmFkZEFjdGlvbnMoY3JlYXRlQWN0aW9uKCJ1cGRhdGVTdHlsZSIsW2Uscl0pKX0sTGlzdGVuZXIucHJvdG90eXBlLnNldFN0eWxlcz1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmFkZEFjdGlvbnMoY3JlYXRlQWN0aW9uKCJ1cGRhdGVTdHlsZSIsW2UsdF0pKX0sTGlzdGVuZXIucHJvdG90eXBlLmFkZEV2ZW50PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhjcmVhdGVBY3Rpb24oImFkZEV2ZW50IixbZSx0XSkpfSxMaXN0ZW5lci5wcm90b3R5cGUucmVtb3ZlRXZlbnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigicmVtb3ZlRXZlbnQiLFtlLHRdKSl9LExpc3RlbmVyLnByb3RvdHlwZS5oYW5kbGVyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQmJnQoKX0sTGlzdGVuZXIucHJvdG90eXBlLmFkZEFjdGlvbnM9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy51cGRhdGVzLG49dGhpcy5oYW5kbGVyO2lmKEFycmF5LmlzQXJyYXkoZSl8fChlPVtlXSksIXRoaXMuYmF0Y2hlZClyZXR1cm4gbihlKTt0LnB1c2guYXBwbHkodCxlKX07dmFyIGhhbmRsZXJNYXA9e2NyZWF0ZUJvZHk6ImNhbGxDcmVhdGVCb2R5IixhZGRFbGVtZW50OiJjYWxsQWRkRWxlbWVudCIscmVtb3ZlRWxlbWVudDoiY2FsbFJlbW92ZUVsZW1lbnQiLG1vdmVFbGVtZW50OiJjYWxsTW92ZUVsZW1lbnQiLHVwZGF0ZUF0dHJzOiJjYWxsVXBkYXRlQXR0cnMiLHVwZGF0ZVN0eWxlOiJjYWxsVXBkYXRlU3R5bGUiLGFkZEV2ZW50OiJjYWxsQWRkRXZlbnQiLHJlbW92ZUV2ZW50OiJjYWxsUmVtb3ZlRXZlbnQifTtmdW5jdGlvbiBjcmVhdGVIYW5kbGVyKHIsZSl7dmFyIGk9ZXx8Z2xvYmFsLmNhbGxOYXRpdmU7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIGkmJmNvbnNvbGUuZXJyb3IoIltKUyBSdW50aW1lXSBubyBkZWZhdWx0IGhhbmRsZXIiKSxmdW5jdGlvbihlKXtBcnJheS5pc0FycmF5KGUpfHwoZT1bZV0pO2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKXt2YXIgbj1kaXNwYXRjaFRhc2socixlW3RdLGkpO2lmKC0xPT09bilyZXR1cm4gbn19fWZ1bmN0aW9uIGhhc0F2YWlsYWJsZUhhbmRsZXIoZSx0KXtyZXR1cm4iZG9tIj09PWUmJmhhbmRsZXJNYXBbdF0mJiJmdW5jdGlvbiI9PXR5cGVvZiBnbG9iYWxbaGFuZGxlck1hcFt0XV19ZnVuY3Rpb24gZGlzcGF0Y2hUYXNrKGUsdCxuKXt2YXIgcj10Lm1vZHVsZSxpPXQubWV0aG9kLG89dC5hcmdzO3JldHVybiBoYXNBdmFpbGFibGVIYW5kbGVyKHIsaSk/Z2xvYmFsW2hhbmRsZXJNYXBbaV1dLmFwcGx5KGdsb2JhbCxbZV0uY29uY2F0KG8sWyItMSJdKSk6bihlLFt0XSwiLTEiKX1mdW5jdGlvbiB1cGRhdGVFbGVtZW50KGUsdCl7dmFyIG49dC5hdHRyc3x8e307Zm9yKHZhciByIGluIG4pZS5zZXRBdHRyKHIsbltyXSwhMCk7dmFyIGk9dC5zdHlsZXx8e307Zm9yKHZhciBvIGluIGkpZS5zZXRTdHlsZShvLGlbb10sITApfXZhciBEb2N1bWVudD1mdW5jdGlvbiBlKHQsbixyKXt0PXQ/dC50b1N0cmluZygpOiIiLHRoaXMuaWQ9dCx0aGlzLlVSTD1uLGFkZERvYyh0LHRoaXMpLHRoaXMubm9kZU1hcD17fTt2YXIgaT1lLkxpc3RlbmVyfHxMaXN0ZW5lcjt0aGlzLmxpc3RlbmVyPW5ldyBpKHQscnx8Y3JlYXRlSGFuZGxlcih0LGUuaGFuZGxlcikpLHRoaXMudGFza0NlbnRlcj1uZXcgVGFza0NlbnRlcih0LHI/ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49YXJndW1lbnRzLmxlbmd0aC0xOzA8bi0tOyl0W25dPWFyZ3VtZW50c1tuKzFdO3JldHVybiByLmFwcGx5KHZvaWQgMCx0KX06ZS5oYW5kbGVyKSx0aGlzLmNyZWF0ZURvY3VtZW50RWxlbWVudCgpfTtEb2N1bWVudC5wcm90b3R5cGUuZ2V0UmVmPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm5vZGVNYXBbZV19LERvY3VtZW50LnByb3RvdHlwZS5vcGVuPWZ1bmN0aW9uKCl7dGhpcy5saXN0ZW5lci5iYXRjaGVkPSExfSxEb2N1bWVudC5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXt0aGlzLmxpc3RlbmVyLmJhdGNoZWQ9ITB9LERvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVEb2N1bWVudEVsZW1lbnQ9ZnVuY3Rpb24oKXt2YXIgbj10aGlzO2lmKCF0aGlzLmRvY3VtZW50RWxlbWVudCl7dmFyIGU9bmV3IEVsZW1lbnQoImRvY3VtZW50Iik7ZS5kb2NJZD10aGlzLmlkLGUub3duZXJEb2N1bWVudD10aGlzLGUucm9sZT0iZG9jdW1lbnRFbGVtZW50IixlLmRlcHRoPTAsZS5yZWY9Il9kb2N1bWVudEVsZW1lbnQiLHRoaXMubm9kZU1hcC5fZG9jdW1lbnRFbGVtZW50PWUsdGhpcy5kb2N1bWVudEVsZW1lbnQ9ZSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiYXBwZW5kQ2hpbGQiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpmdW5jdGlvbihlKXthcHBlbmRCb2R5KG4sZSl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImluc2VydEJlZm9yZSIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmZ1bmN0aW9uKGUsdCl7YXBwZW5kQm9keShuLGUsdCl9fSksY2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coJ0NyZWF0ZSBkb2N1bWVudCBlbGVtZW50IChpZDogIicrZS5kb2NJZCsnIiwgcmVmOiAiJytlLnJlZisnIiknKX1yZXR1cm4gdGhpcy5kb2N1bWVudEVsZW1lbnR9LERvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVCb2R5PWZ1bmN0aW9uKGUsdCl7aWYoIXRoaXMuYm9keSl7dmFyIG49bmV3IEVsZW1lbnQoZSx0KTtzZXRCb2R5KHRoaXMsbiksY2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coIltjcmVhdGVCb2R5XSgiK3RoaXMuaWQrIiwiK24udHlwZSsiLCIrbi5yZWYrIikgKCIrSlNPTi5zdHJpbmdpZnkobi50b0pTT04oITApKSsiKS4iKX1yZXR1cm4gdGhpcy5ib2R5fSxEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlRWxlbWVudD1mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBFbGVtZW50KGUsdCk7cmV0dXJuIGNoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbY3JlYXRlRWxlbWVudF0oIit0aGlzLmlkKyIsIituLnR5cGUrIiwiK24ucmVmKyIpICgiK0pTT04uc3RyaW5naWZ5KG4udG9KU09OKCEwKSkrIikuIiksbn0sRG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUNvbW1lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBDb21tZW50KGUpfSxEb2N1bWVudC5wcm90b3R5cGUuZmlyZUV2ZW50PWZ1bmN0aW9uKGUsdCxuLHIsaSl7aWYoZSl7dmFyIG87KG49bnx8e30pLnR5cGU9bi50eXBlfHx0LG4udGFyZ2V0PWUsbi5jdXJyZW50VGFyZ2V0PWUsbi50aW1lc3RhbXA9RGF0ZS5ub3coKSxyJiZ1cGRhdGVFbGVtZW50KGUscik7dmFyIGE9dGhpcy5nZXRSZWYoIl9yb290Iik7cmV0dXJuIGEmJmEuYXR0ciYmKG89InRydWUiPT09YS5hdHRyLmJ1YmJsZSksIndlZXgiIT09dGhpcy5fXyRjb21waWxlcl9fJiYobj1wcm9jZXNzRXZlbnQobikpLGUuZmlyZUV2ZW50KHQsbixvLGkpfX0sRG9jdW1lbnQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtjaGVja0xldmVsKCJkZWJ1ZyIpJiZkZWJ1Z0xvZygiW2Rlc3Ryb3ldKCIrdGhpcy5pZCsiLGRvY3VtZW50LCIrdGhpcy5yZWYrJykgRGVzdHJveSBkb2N1bWVudCAoaWQ6ICInK3RoaXMuaWQrJyIsIFVSTDogIicrdGhpcy5VUkwrJyIpJyksdGhpcy50YXNrQ2VudGVyLmRlc3Ryb3lDYWxsYmFjaygpLGRlbGV0ZSB0aGlzLmxpc3RlbmVyLGRlbGV0ZSB0aGlzLm5vZGVNYXAsZGVsZXRlIHRoaXMudGFza0NlbnRlcixyZW1vdmVEb2ModGhpcy5pZCl9LERvY3VtZW50LmhhbmRsZXI9bnVsbDt2YXIgbGV4PXtJbnB1dEVsZW1lbnREaXY6IjxXaGl0ZVNwYWNlPnw8TGluZVRlcm1pbmF0b3I+fDxSZXNlcnZlZFdvcmQ+fDxJZGVudGlmaWVyPnw8TnVtZXJpY0xpdGVyYWw+fDxQdW5jdHVhdG9yPnw8U3RyaW5nTGl0ZXJhbD4iLElucHV0RWxlbWVudFJlZ0V4cDoiPFdoaXRlU3BhY2U+fDxMaW5lVGVybWluYXRvcj58PFJlc2VydmVkV29yZD58PElkZW50aWZpZXI+fDxOdW1lcmljTGl0ZXJhbD58PFB1bmN0dWF0b3I+fDxTdHJpbmdMaXRlcmFsPiIsUmVzZXJ2ZWRXb3JkOiI8S2V5d29yZD58PE51bGxMaXRlcmFsPnw8Qm9vbGVhbkxpdGVyYWw+IixXaGl0ZVNwYWNlOi9bXHRcdlxmXHUwMDIwXHUwMEEwXHUxNjgwXHUxODBFXHUyMDAwLVx1MjAwQVx1MjAyRlx1MjA1Zlx1MzAwMFx1RkVGRl0vLExpbmVUZXJtaW5hdG9yOi9bXG5cclx1MjAyOFx1MjAyOV0vLEtleXdvcmQ6L25ldyg/IVtfJGEtekEtWjAtOV0pfHZvaWQoPyFbXyRhLXpBLVowLTldKXxkZWxldGUoPyFbXyRhLXpBLVowLTldKXxpbig/IVtfJGEtekEtWjAtOV0pfGluc3RhbmNlb2YoPyFbXyRhLXpBLVowLTldKXx0eXBlb2YoPyFbXyRhLXpBLVowLTldKS8sTnVsbExpdGVyYWw6L251bGwoPyFbXyRhLXpBLVowLTldKS8sQm9vbGVhbkxpdGVyYWw6Lyg/OnRydWV8ZmFsc2UpKD8hW18kYS16QS1aMC05XSkvLElkZW50aWZpZXI6L1tfJGEtekEtWl1bXyRhLXpBLVowLTldKi8sUHVuY3R1YXRvcjovXC98PT58XCpcKnw+Pj49fD4+PXw8PD18PT09fCE9PXw+Pj58PDx8JT18XCo9fC09fFwrPXw8PXw+PXw9PXwhPXxcXj18XHw9fFx8XHx8JiZ8Jj18Pj58XCtcK3wtLXxcOnx9fFwqfCZ8XHx8XF58IXx+fC18XCt8XD98JXw9fD58PHwsfDt8XC4oPyFbMC05XSl8XF18XFt8XCl8XCh8ey8sRGl2UHVuY3R1YXRvcjovXC89fFwvLyxOdW1lcmljTGl0ZXJhbDovKD86MFt4WF1bMC05YS1mQS1GXSp8XC5bMC05XSt8KD86WzEtOV0rWzAtOV0qfDApKD86XC5bMC05XSp8XC4pPykoPzpbZUVdWystXXswLDF9WzAtOV0rKT8oPyFbXyRhLXpBLVowLTldKS8sU3RyaW5nTGl0ZXJhbDovIig/OlteIlxuXFxcclx1MjAyOFx1MjAyOV18XFwoPzpbJyJcXGJmbnJ0dlxuXHJcdTIwMjhcdTIwMjldfFxyXG4pfFxceFswLTlhLWZBLUZdezJ9fFxcdVswLTlhLWZBLUZdezR9fFxcW14wLTl1eCciXFxiZm5ydHZcblxcXHJcdTIwMjhcdTIwMjldKSoifCcoPzpbXidcblxcXHJcdTIwMjhcdTIwMjldfFxcKD86WyciXFxiZm5ydHZcblxyXHUyMDI4XHUyMDI5XXxcclxuKXxcXHhbMC05YS1mQS1GXXsyfXxcXHVbMC05YS1mQS1GXXs0fXxcXFteMC05dXgnIlxcYmZucnR2XG5cXFxyXHUyMDI4XHUyMDI5XSkqJy8sUmVndWxhckV4cHJlc3Npb25MaXRlcmFsOi9cLyg/OlxbKD86XFxbXHNcU118W15cXV0pKlxdfFteKlwvXFxcblxyXHUyMDI4XHUyMDI5XXxcXFteXG5cclx1MjAyOFx1MjAyOV0pKD86XFsoPzpcXFtcc1xTXXxbXlxdXSkqXF18W15cL1xcXG5cclx1MjAyOFx1MjAyOV18XFxbXlxuXHJcdTIwMjhcdTIwMjldKSpcL1swLTlhLXpBLVpdKi99O2Z1bmN0aW9uIFhSZWdFeHAocixlLGkpe3ZhciBvPVtlXTt2YXIgYT1mdW5jdGlvbiBuKGUpe3ZhciB0PW5ldyBSZWdFeHA7cmV0dXJuIHQuY29tcGlsZShlLnJlcGxhY2UoLzwoW14+XSspPi9nLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHJbdF0/KG8ucHVzaCh0KSxyW3RdaW5zdGFuY2VvZiBSZWdFeHA/IigiK3JbdF0uc291cmNlKyIpIjoiKCIrbihyW3RdKS5zb3VyY2UrIikiKToiIn0pLGkpLHR9KHJbZV0pO3RoaXMuZXhlYz1mdW5jdGlvbihlKXt2YXIgdD1hLmV4ZWMoZSk7aWYobnVsbD09dClyZXR1cm4gbnVsbDtmb3IodmFyIG49bmV3IFN0cmluZyh0WzBdKSxyPTA7cjxvLmxlbmd0aDtyKyspdFtyXSYmKG5bb1tyXV09dFtyXSk7cmV0dXJuIG59LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJsYXN0SW5kZXgiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYS5sYXN0SW5kZXh9LHNldDpmdW5jdGlvbihlKXthLmxhc3RJbmRleD1lfX0pfWZ1bmN0aW9uIExleGljYWxQYXJzZXIoKXt2YXIgaSxvPW5ldyBYUmVnRXhwKGxleCwiSW5wdXRFbGVtZW50RGl2IiwiZyIpLGE9bmV3IFhSZWdFeHAobGV4LCJJbnB1dEVsZW1lbnRSZWdFeHAiLCJnIik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInNvdXJjZSIse2dldDpmdW5jdGlvbigpe3JldHVybiBpfSxzZXQ6ZnVuY3Rpb24oZSl7aT1lLG8ubGFzdEluZGV4PTAsYS5sYXN0SW5kZXg9MH19KSx0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7by5sYXN0SW5kZXg9MCxhLmxhc3RJbmRleD0wfSx0aGlzLmdldE5leHRUb2tlbj1mdW5jdGlvbihlKXt2YXIgdCxuPW8ubGFzdEluZGV4LHI9KHQ9ZT9vOmEpLmV4ZWMoaSk7aWYociYmdC5sYXN0SW5kZXgtbj5yLmxlbmd0aCl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIlVuZXhwZWN0ZWQgdG9rZW4gSUxMRUdBTCIpO3JldHVybiBvLmxhc3RJbmRleD10Lmxhc3RJbmRleCxhLmxhc3RJbmRleD10Lmxhc3RJbmRleCxyfX12YXIgcnVsZXM9e0lkZW50aWZpZXJOYW1lOltbIklkZW50aWZpZXIiXV0sTGl0ZXJhbDpbWyJOdWxsTGl0ZXJhbCJdLFsiQm9vbGVhbkxpdGVyYWwiXSxbIk51bWVyaWNMaXRlcmFsIl0sWyJTdHJpbmdMaXRlcmFsIl0sWyJSZWd1bGFyRXhwcmVzc2lvbkxpdGVyYWwiXV0sUHJpbWFyeUV4cHJlc3Npb246W1siSWRlbnRpZmllciJdLFsiTGl0ZXJhbCJdLFsiKCIsIkV4cHJlc3Npb24iLCIpIl1dLENhbGxFeHByZXNzaW9uOltbIlByaW1hcnlFeHByZXNzaW9uIiwiQXJndW1lbnRzIl0sWyJDYWxsRXhwcmVzc2lvbiIsIkFyZ3VtZW50cyJdXSxBcmd1bWVudHM6W1siKCIsIikiXSxbIigiLCJBcmd1bWVudExpc3QiLCIpIl1dLEFyZ3VtZW50TGlzdDpbWyJDb25kaXRpb25hbEV4cHJlc3Npb24iXSxbIkFyZ3VtZW50TGlzdCIsIiwiLCJDb25kaXRpb25hbEV4cHJlc3Npb24iXV0sTGVmdEhhbmRTaWRlRXhwcmVzc2lvbjpbWyJQcmltYXJ5RXhwcmVzc2lvbiJdLFsiQ2FsbEV4cHJlc3Npb24iXV0sVW5hcnlFeHByZXNzaW9uOltbIkxlZnRIYW5kU2lkZUV4cHJlc3Npb24iXSxbInZvaWQiLCJVbmFyeUV4cHJlc3Npb24iXSxbIisiLCJVbmFyeUV4cHJlc3Npb24iXSxbIi0iLCJVbmFyeUV4cHJlc3Npb24iXSxbIn4iLCJVbmFyeUV4cHJlc3Npb24iXSxbIiEiLCJVbmFyeUV4cHJlc3Npb24iXV0sRXhwb25lbnRpYXRpb25FeHByZXNzaW9uOltbIlVuYXJ5RXhwcmVzc2lvbiJdLFsiRXhwb25lbnRpYXRpb25FeHByZXNzaW9uIiwiKioiLCJVbmFyeUV4cHJlc3Npb24iXV0sTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uOltbIk11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiIsIi8iLCJFeHBvbmVudGlhdGlvbkV4cHJlc3Npb24iXSxbIkV4cG9uZW50aWF0aW9uRXhwcmVzc2lvbiJdLFsiTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIiwiKiIsIkV4cG9uZW50aWF0aW9uRXhwcmVzc2lvbiJdLFsiTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIiwiJSIsIkV4cG9uZW50aWF0aW9uRXhwcmVzc2lvbiJdXSxBZGRpdGl2ZUV4cHJlc3Npb246W1siTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIl0sWyJBZGRpdGl2ZUV4cHJlc3Npb24iLCIrIiwiTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIl0sWyJBZGRpdGl2ZUV4cHJlc3Npb24iLCItIiwiTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIl1dLFNoaWZ0RXhwcmVzc2lvbjpbWyJBZGRpdGl2ZUV4cHJlc3Npb24iXSxbIlNoaWZ0RXhwcmVzc2lvbiIsIjw8IiwiQWRkaXRpdmVFeHByZXNzaW9uIl0sWyJTaGlmdEV4cHJlc3Npb24iLCI+PiIsIkFkZGl0aXZlRXhwcmVzc2lvbiJdLFsiU2hpZnRFeHByZXNzaW9uIiwiPj4+IiwiQWRkaXRpdmVFeHByZXNzaW9uIl1dLFJlbGF0aW9uYWxFeHByZXNzaW9uOltbIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCI8IiwiU2hpZnRFeHByZXNzaW9uIl0sWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiIsIj4iLCJTaGlmdEV4cHJlc3Npb24iXSxbIlJlbGF0aW9uYWxFeHByZXNzaW9uIiwiPD0iLCJTaGlmdEV4cHJlc3Npb24iXSxbIlJlbGF0aW9uYWxFeHByZXNzaW9uIiwiPj0iLCJTaGlmdEV4cHJlc3Npb24iXSxbIlJlbGF0aW9uYWxFeHByZXNzaW9uIiwiaW5zdGFuY2VvZiIsIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCJpbiIsIlNoaWZ0RXhwcmVzc2lvbiJdXSxFcXVhbGl0eUV4cHJlc3Npb246W1siUmVsYXRpb25hbEV4cHJlc3Npb24iXSxbIkVxdWFsaXR5RXhwcmVzc2lvbiIsIj09IiwiUmVsYXRpb25hbEV4cHJlc3Npb24iXSxbIkVxdWFsaXR5RXhwcmVzc2lvbiIsIiE9IiwiUmVsYXRpb25hbEV4cHJlc3Npb24iXSxbIkVxdWFsaXR5RXhwcmVzc2lvbiIsIj09PSIsIlJlbGF0aW9uYWxFeHByZXNzaW9uIl0sWyJFcXVhbGl0eUV4cHJlc3Npb24iLCIhPT0iLCJSZWxhdGlvbmFsRXhwcmVzc2lvbiJdXSxCaXR3aXNlQU5ERXhwcmVzc2lvbjpbWyJFcXVhbGl0eUV4cHJlc3Npb24iXSxbIkJpdHdpc2VBTkRFeHByZXNzaW9uIiwiJiIsIkVxdWFsaXR5RXhwcmVzc2lvbiJdXSxCaXR3aXNlWE9SRXhwcmVzc2lvbjpbWyJCaXR3aXNlQU5ERXhwcmVzc2lvbiJdLFsiQml0d2lzZVhPUkV4cHJlc3Npb24iLCJeIiwiQml0d2lzZUFOREV4cHJlc3Npb24iXV0sQml0d2lzZU9SRXhwcmVzc2lvbjpbWyJCaXR3aXNlWE9SRXhwcmVzc2lvbiJdLFsiQml0d2lzZU9SRXhwcmVzc2lvbiIsInwiLCJCaXR3aXNlWE9SRXhwcmVzc2lvbiJdXSxMb2dpY2FsQU5ERXhwcmVzc2lvbjpbWyJCaXR3aXNlT1JFeHByZXNzaW9uIl0sWyJMb2dpY2FsQU5ERXhwcmVzc2lvbiIsIiYmIiwiQml0d2lzZU9SRXhwcmVzc2lvbiJdXSxMb2dpY2FsT1JFeHByZXNzaW9uOltbIkxvZ2ljYWxBTkRFeHByZXNzaW9uIl0sWyJMb2dpY2FsT1JFeHByZXNzaW9uIiwifHwiLCJMb2dpY2FsQU5ERXhwcmVzc2lvbiJdXSxDb25kaXRpb25hbEV4cHJlc3Npb246W1siTG9naWNhbE9SRXhwcmVzc2lvbiJdLFsiTG9naWNhbE9SRXhwcmVzc2lvbiIsIj8iLCJMb2dpY2FsT1JFeHByZXNzaW9uIiwiOiIsIkxvZ2ljYWxPUkV4cHJlc3Npb24iXV0sRXhwcmVzc2lvbjpbWyJDb25kaXRpb25hbEV4cHJlc3Npb24iXSxbIkV4cHJlc3Npb24iLCIsIiwiQ29uZGl0aW9uYWxFeHByZXNzaW9uIl1dLFByb2dyYW06W1siRXhwcmVzc2lvbiJdXX07ZnVuY3Rpb24gU3ltYm9sJDEoZSx0KXt0aGlzLm5hbWU9ZSx0aGlzLnRva2VuPXQsdGhpcy5jaGlsZE5vZGVzPVtdLHRoaXMudG9TdHJpbmc9ZnVuY3Rpb24oZSl7aWYoZXx8KGU9IiIpLDE9PXRoaXMuY2hpbGROb2Rlcy5sZW5ndGgpcmV0dXJuIHRoaXMuY2hpbGROb2Rlc1swXS50b1N0cmluZyhlKTtmb3IodmFyIHQ9ZSt0aGlzLm5hbWUrKG51bGwhPXRoaXMudG9rZW4mJnRoaXMubmFtZSE9dGhpcy50b2tlbj8iOiIrdGhpcy50b2tlbjoiIikrIlxuIixuPTA7bjx0aGlzLmNoaWxkTm9kZXMubGVuZ3RoO24rKyl0Kz10aGlzLmNoaWxkTm9kZXNbbl0udG9TdHJpbmcoZSsiICAgICIpO3JldHVybiB0fX1mdW5jdGlvbiBTeW50YWN0aWNhbFBhcnNlcigpe3ZhciBlPXtQcm9ncmFtOiIkIn0sbz17fTshZnVuY3Rpb24gZShuKXtvW0pTT04uc3RyaW5naWZ5KG4pXT1uO2Zvcih2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhuKTtyLmxlbmd0aDspe3ZhciBpPXIuc2hpZnQoKTtydWxlc1tpXSYmcnVsZXNbaV0uZm9yRWFjaChmdW5jdGlvbihlKXtuW2VbMF1dfHxyLnB1c2goZVswXSk7dmFyIHQ9bjtlLmZvckVhY2goZnVuY3Rpb24oZSl7dFtlXXx8KHRbZV09e30pLHQ9dFtlXX0pLG5baV0uJGRpdiYmKHQuJGRpdj0hMCksdC4kcmVkdWNlPWksdC4kY291bnQ9ZS5sZW5ndGh9KX1mb3IodmFyIHQgaW4gbikib2JqZWN0IiE9dHlwZW9mIG5bdF18fCIkIj09dC5jaGFyQXQoMCl8fG5bdF0uJGNsb3N1cmV8fChvW0pTT04uc3RyaW5naWZ5KG5bdF0pXT9uW3RdPW9bSlNPTi5zdHJpbmdpZnkoblt0XSldOmUoblt0XSkpO24uJGNsb3N1cmU9ITB9KGUpO3ZhciBpPVtdLGE9W2VdLHM9ZTt0aGlzLmluc2VydFN5bWJvbD1mdW5jdGlvbihlLHQpe2Zvcig7IXNbZS5uYW1lXSYmcy4kcmVkdWNlOyl7Zm9yKHZhciBuPXMuJGNvdW50LHI9bmV3IFN5bWJvbCQxKHMuJHJlZHVjZSk7bi0tOylyLmNoaWxkTm9kZXMucHVzaChpLnBvcCgpKSxhLnBvcCgpO3M9YVthLmxlbmd0aC0xXSx0aGlzLmluc2VydFN5bWJvbChyKX1pZihzPXNbZS5uYW1lXSxpLnB1c2goZSksYS5wdXNoKHMpLCFzKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gcy4kZGl2fSx0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7aT1bXSxhPVtzPWVdfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZ3JhbW1hclRyZWUiLHtnZXQ6ZnVuY3Rpb24oKXt0cnl7Zm9yKDtzLiRyZWR1Y2U7KXtmb3IodmFyIGU9cy4kY291bnQsdD1uZXcgU3ltYm9sJDEocy4kcmVkdWNlKTtlLS07KXQuY2hpbGROb2Rlcy5wdXNoKGkucG9wKCkpLGEucG9wKCk7cz1hW2EubGVuZ3RoLTFdLHRoaXMuaW5zZXJ0U3ltYm9sKHQpfWlmKDA8aS5sZW5ndGgmJnNbIjsiXSlyZXR1cm4gdGhpcy5pbnNlcnRTeW1ib2wobmV3IFN5bWJvbCQxKCI7IiwiOyIpKSx0aGlzLmdyYW1tYXJUcmVlO2lmKDEhPWkubGVuZ3RofHwiUHJvZ3JhbSIhPWlbMF0ubmFtZSl0aHJvdyBuZXcgRXJyb3J9Y2F0Y2goZSl7dGhyb3cgbmV3IFN5bnRheEVycm9yKCJVbmV4cGVjdGVkIGVuZCBvZiBpbnB1dCIpfXJldHVybiBpWzBdfX0pfWZ1bmN0aW9uIFBhcnNlcigpe3RoaXMubGV4aWNhbFBhcnNlcj1uZXcgTGV4aWNhbFBhcnNlcix0aGlzLnN5bnRhY3RpY2FsUGFyc2VyPW5ldyBTeW50YWN0aWNhbFBhcnNlcjt2YXIgYT17fTtbIk51bGxMaXRlcmFsIiwiQm9vbGVhbkxpdGVyYWwiLCJOdW1lcmljTGl0ZXJhbCIsIlN0cmluZ0xpdGVyYWwiLCJSZWd1bGFyRXhwcmVzc2lvbkxpdGVyYWwiLCJJZGVudGlmaWVyIiwiKioiLCI9PiIsInsiLCJ9IiwiKCIsIikiLCJbIiwiXSIsIi4iLCI7IiwiLCIsIjwiLCI+IiwiPD0iLCI+PSIsIj09IiwiIT0iLCI9PT0iLCIhPT0iLCIrIiwiLSIsIioiLCIlIiwiKysiLCItLSIsIjw8IiwiPj4iLCI+Pj4iLCImIiwifCIsIl4iLCIhIiwifiIsIiYmIiwifHwiLCI/IiwiOiIsIj0iLCIrPSIsIi09IiwiKj0iLCIlPSIsIjw8PSIsIj4+PSIsIj4+Pj0iLCImPSIsInw9IiwiXj0iLCIvIiwiLz0iLCJpbnN0YW5jZW9mIiwidHlwZW9mIiwibmV3Iiwidm9pZCIsImRlYnVnZ2VyIiwidGhpcyIsImRlbGV0ZSIsImluIl0uZm9yRWFjaChmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxlLHt9KX0pLHRoaXMucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLmxleGljYWxQYXJzZXIucmVzZXQoKSx0aGlzLnN5bnRhY3RpY2FsUGFyc2VyLnJlc2V0KCl9LHRoaXMucGFyc2U9ZnVuY3Rpb24oZSx0KXt2YXIgbixyPXRoaXMsaT0hMTt0aGlzLmxleGljYWxQYXJzZXIuc291cmNlPWU7Zm9yKHZhciBvPSExO249dGhpcy5sZXhpY2FsUGFyc2VyLmdldE5leHRUb2tlbihvKTspe3QmJnQobik7dHJ5e2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG4pLnNvbWUoZnVuY3Rpb24oZSl7cmV0dXJuISFhLmhhc093blByb3BlcnR5KGUpJiYobz1yLnN5bnRhY3RpY2FsUGFyc2VyLmluc2VydFN5bWJvbChuZXcgU3ltYm9sJDEoZSxuKSxpKSwhKGk9ITEpKX0pKWNvbnRpbnVlOyhuLktleXdvcmR8fG4uUHVuY3R1YXRvcnx8bi5EaXZQdW5jdHVhdG9yKSYmYS5oYXNPd25Qcm9wZXJ0eShuLnRvU3RyaW5nKCkpJiYobz1yLnN5bnRhY3RpY2FsUGFyc2VyLmluc2VydFN5bWJvbChuZXcgU3ltYm9sJDEobi50b1N0cmluZygpLG4pLGkpKX1jYXRjaChlKXt0aHJvdyBuZXcgU3ludGF4RXJyb3IoIlVuZXhwZWN0ZWQgdG9rZW4gIituKX19cmV0dXJuIHRoaXMuc3ludGFjdGljYWxQYXJzZXIuZ3JhbW1hclRyZWV9fXZhciBwYXJzZXI9bmV3IFBhcnNlcjtmdW5jdGlvbiBKYXZhU2NyaXB0RXhwcmVzc2lvbih0ZXh0KXtwYXJzZXIucmVzZXQoKSx0aGlzLnRyZWU9cGFyc2VyLnBhcnNlKHRleHQpLHRoaXMucGF0aHM9W107dmFyIGNvbnRleHQ9T2JqZWN0LmNyZWF0ZShudWxsKSxtZT10aGlzLHBhdGhJbmRleD1PYmplY3QuY3JlYXRlKG51bGwpO2Z1bmN0aW9uIGNoZWNrU2ltcGxlKGUpe2Zvcih2YXIgdD1lO3QuY2hpbGROb2Rlcy5sZW5ndGg8PTEmJiJNZW1iZXJFeHByZXNzaW9uIiE9PXQubmFtZTspdD10LmNoaWxkTm9kZXNbMF07Ik1lbWJlckV4cHJlc3Npb24iPT09dC5uYW1lP21lLmlzU2ltcGxlPSEwOm1lLmlzU2ltcGxlPSExfWZ1bmN0aW9uIHdhbGsoZSl7aWYoIkNhbGxFeHByZXNzaW9uIj09PWUubmFtZSYmIkNhbGxFeHByZXNzaW9uIiE9PWUuY2hpbGROb2Rlc1tlLmNoaWxkTm9kZXMubGVuZ3RoLTFdLm5hbWUpe2dldFBhdGgoZS5jaGlsZE5vZGVzWzFdKTt3YWxrKGUuY2hpbGROb2Rlc1swXSl9ZWxzZSBpZigiTmV3RXhwcmVzc2lvbiI9PT1lLm5hbWUmJjE9PT1lLmNoaWxkTm9kZXMubGVuZ3RoKWdldFBhdGgoZS5jaGlsZE5vZGVzWzBdKTtlbHNlIGlmKCJNZW1iZXJFeHByZXNzaW9uIj09PWUubmFtZSYmMT09PWUuY2hpbGROb2Rlcy5sZW5ndGgpZ2V0UGF0aChlKTtlbHNlIGZvcih2YXIgdD0wO3Q8ZS5jaGlsZE5vZGVzLmxlbmd0aDt0Kyspd2FsayhlLmNoaWxkTm9kZXNbdF0pfWZ1bmN0aW9uIGdldFBhdGgoZSl7dmFyIHQ7aWYoIklkZW50aWZpZXJOYW1lIj09PWUuY2hpbGROb2Rlc1swXS5uYW1lKXJldHVybih0PWdldFBhdGgoZS5jaGlsZE5vZGVzWzJdKSkmJih0PXQuY29uY2F0KGUuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLnRva2VuLnRvU3RyaW5nKCkpKSxjcmVhdGVQYXRoKHQpLHQ7aWYoIlByaW1hcnlFeHByZXNzaW9uIj09PWUuY2hpbGROb2Rlc1swXS5uYW1lKXJldHVybiJJZGVudGlmaWVyIj09PWUuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLm5hbWU/KGNyZWF0ZVBhdGgodD1bZS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0udG9rZW4udG9TdHJpbmcoKV0pLHQpOm51bGw7aWYoIl0iPT09ZS5jaGlsZE5vZGVzWzBdLm5hbWUpcmV0dXJuIGdldFBhdGgoZS5jaGlsZE5vZGVzWzNdKSx3YWxrKGUuY2hpbGROb2Rlc1sxXSksbnVsbDtpZigiQXJndW1lbnRzIj09PWUuY2hpbGROb2Rlc1swXS5uYW1lKXJldHVybiB3YWxrKGUuY2hpbGROb2Rlc1swXSksd2FsayhlLmNoaWxkTm9kZXNbMV0pLG51bGw7Zm9yKHZhciBuPTA7bjxlLmNoaWxkTm9kZXMubGVuZ3RoO24rKyl3YWxrKGUuY2hpbGROb2Rlc1tuXSl9ZnVuY3Rpb24gY3JlYXRlUGF0aChlKXtmb3IodmFyIHQ9Y29udGV4dCxuPTA7bjxlLmxlbmd0aC0xO24rKyl0W2Vbbl1dfHwodFtlW25dXT1PYmplY3QuY3JlYXRlKG51bGwpKSx0PXRbZVtuXV07bWUucGF0aHMucHVzaChlKSxwYXRoSW5kZXhbZS5qb2luKCIuIildPSExfXRoaXMuaXNTaW1wbGUsdGhpcy5pc0NvbnN0LHdhbGsodGhpcy50cmVlKSxjaGVja1NpbXBsZSh0aGlzLnRyZWUpLDA9PT10aGlzLnBhdGhzLmxlbmd0aCYmKHRoaXMuaXNDb25zdD0hMCksdGhpcy5zZXR0ZXI9ZnVuY3Rpb24odCl7Zm9yKHZhciBuPWNvbnRleHQscj0wO3I8dC5sZW5ndGgtMTtyKyspblt0W3JdXXx8KG5bdFtyXV09T2JqZWN0LmNyZWF0ZShudWxsKSksbj1uW3Rbcl1dO3JldHVybntpc0NvbXBsZXRlZDpmdW5jdGlvbigpe2Zvcih2YXIgZSBpbiBwYXRoSW5kZXgpaWYoIXBhdGhJbmRleFtlXSlyZXR1cm4hMTtyZXR1cm4hMH0sc2V0OmZ1bmN0aW9uKGUpe3JldHVybiBwYXRoSW5kZXhbdC5qb2luKCIuIildfHwocGF0aEluZGV4W3Quam9pbigiLiIpXT0hMCksblt0W3JdXT1lLHRoaXMuaXNDb21wbGV0ZWQoKT9tZS5leGVjKCk6dm9pZCAwfX19LHRoaXMudmFsdWVPZj10aGlzLmV4ZWM9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGV2YWwodGV4dCl9LmNhbGwoY29udGV4dCl9Y2F0Y2goZSl7fX19ZnVuY3Rpb24gdmlzaXQodCl7dmFyIGUsbj10LmNoaWxkTm9kZXMuc2xpY2UoKS5yZXZlcnNlKCkscj1uLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hZS50b2tlbnx8IWUudG9rZW4uUHVuY3R1YXRvcn0pO2lmKCJVbmFyeUV4cHJlc3Npb24iPT09dC5uYW1lJiYoMj09PW4ubGVuZ3RoJiYiLSI9PT1uWzBdLm5hbWUmJjE9PT1yLmxlbmd0aCkpcmV0dXJuKGU9dmlzaXQoclswXSkpLnZhbHVlPS1lLnZhbHVlLGU7aWYoIkFyZ3VtZW50cyI9PT10Lm5hbWUpe2Zvcih2YXIgaT1bXSxvPXJbMF07bzspMz09PW8uY2hpbGROb2Rlcy5sZW5ndGgmJihpLnVuc2hpZnQoby5jaGlsZE5vZGVzWzBdKSxvPW8uY2hpbGROb2Rlc1syXSksMT09PW8uY2hpbGROb2Rlcy5sZW5ndGgmJihpLnVuc2hpZnQoby5jaGlsZE5vZGVzWzBdKSxvPW51bGwpO3JldHVybnt0eXBlOiJBcmd1bWVudHMiLGNoaWxkcmVuOmkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiB2aXNpdChlKX0pfX1pZihyJiYxPT09ci5sZW5ndGgpcmV0dXJuIGU9dmlzaXQoclswXSk7aWYodC50b2tlbiYmWyJOdWxsTGl0ZXJhbCIsIkJvb2xlYW5MaXRlcmFsIiwiTnVtZXJpY0xpdGVyYWwiLCJTdHJpbmdMaXRlcmFsIiwiSWRlbnRpZmllciJdLnNvbWUoZnVuY3Rpb24oZSl7cmV0dXJuIHQudG9rZW5bZV19KSl7dmFyIGE9T2JqZWN0LmtleXModC50b2tlbikuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlLm1hdGNoKC9MaXRlcmFsLyl8fGUubWF0Y2goL0lkZW50aWZpZXIvKX0pWzBdO3JldHVybnt0eXBlOmEsdmFsdWU6e051bGxMaXRlcmFsOm51bGwsQm9vbGVhbkxpdGVyYWw6Qm9vbGVhbih0LnRva2VuKSxOdW1lcmljTGl0ZXJhbDpOdW1iZXIodC50b2tlbiksU3RyaW5nTGl0ZXJhbDp0LnRva2VuLElkZW50aWZpZXI6dC50b2tlbn1bYV19fXJldHVybiJDYWxsRXhwcmVzc2lvbiI9PT10Lm5hbWU/e3R5cGU6IkNhbGxFeHByZXNzaW9uIixjaGlsZHJlbjpbdmlzaXQoblswXSksdmlzaXQoblsxXSldfTp7dHlwZTpuLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZS50b2tlbiYmZS50b2tlbi5QdW5jdHVhdG9yfSlbMF0ubmFtZSxjaGlsZHJlbjpuLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hZS50b2tlbnx8IWUudG9rZW4uUHVuY3R1YXRvcn0pLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gdmlzaXQoZSl9KX19ZnVuY3Rpb24gcGFyc2UoZSl7dmFyIHQ9bmV3IEphdmFTY3JpcHRFeHByZXNzaW9uKGUpO3JldHVybiBKU09OLnN0cmluZ2lmeSh2aXNpdCh0LnRyZWUpLG51bGwpfXZhciBvbGRDYWxsVXBkYXRlU3R5bGU9Z2xvYmFsLmNhbGxVcGRhdGVTdHlsZTtmdW5jdGlvbiBpc0JpbmRNZXRob2QoZSx0KXtyZXR1cm4oImJpbmRpbmd4Ij09PWV8fCJiaW5kaW5nIj09PWUpJiYiYmluZCI9PT10fWZ1bmN0aW9uIGZvcm1hdEV4cHJlc3Npb24oZSl7aWYodm9pZCAwIT09ZSl7dHJ5e2U9SlNPTi5wYXJzZShlKX1jYXRjaChlKXt9dmFyIHQ9e307aWYoInN0cmluZyI9PXR5cGVvZiBlP3Qub3JpZ2luPWU6ZSYmKHQub3JpZ2luPWUub3JpZ2luLHQudHJhbnNmb3JtZWQ9ZS50cmFuc2Zvcm1lZCksdC50cmFuc2Zvcm1lZHx8dC5vcmlnaW4pcmV0dXJuIHQudHJhbnNmb3JtZWQ9dC50cmFuc2Zvcm1lZHx8cGFyc2UodC5vcmlnaW4pLHR9fWZ1bmN0aW9uIGZvcm1hdEV4cHJlc3Npb25zKGUpe3JldHVybiBlJiYoZS5leGl0RXhwcmVzc2lvbj1mb3JtYXRFeHByZXNzaW9uKGUuZXhpdEV4cHJlc3Npb24pLGUucHJvcHMmJmUucHJvcHMuZm9yRWFjaChmdW5jdGlvbihlKXtlLmV4cHJlc3Npb249Zm9ybWF0RXhwcmVzc2lvbihlLmV4cHJlc3Npb24pfSkpLGV9ZnVuY3Rpb24gZml4Q2FsbGJhY2sodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKHZvaWQgMD09PWUmJihlPXt9KSwiZnVuY3Rpb24iPT10eXBlb2YgdClyZXR1cm4gdCh7c3RhdGU6ImVuZCI9PT1lLnN0YXRlPyJleGl0IjplLnN0YXRlLHQ6dm9pZCAwIT09ZS50P2UudDplLmRlbHRhVH0pfX1mdW5jdGlvbiBoYW5kbGVNb2R1bGVHZXR0ZXIoZSx0LG4pe3JldHVybiBpc0JpbmRNZXRob2QoZSx0KT9mdW5jdGlvbihlLHQpe2lmKHZvaWQgMD09PXQmJih0PWZ1bmN0aW9uKCl7fSksIWUpdGhyb3cgbmV3IEVycm9yKCJzaG91bGQgcGFzcyBvcHRpb25zIGZvciBiaW5kaW5nIik7cmV0dXJuIGZvcm1hdEV4cHJlc3Npb25zKGUpLG4oZSxlJiYidGltaW5nIj09PWUuZXZlbnRUeXBlP2ZpeENhbGxiYWNrKHQpOnQpfTpufWZ1bmN0aW9uIHNldElkKGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIltbQ3VycmVudEluc3RhbmNlSWRdXSIse3ZhbHVlOnR9KX1mdW5jdGlvbiBnZXRJZChlKXtyZXR1cm4gZVsiW1tDdXJyZW50SW5zdGFuY2VJZF1dIl19ZnVuY3Rpb24gbW9kdWxlR2V0dGVyKGUsbixyKXt2YXIgaT1nZXRUYXNrQ2VudGVyKGUpO3JldHVybiBpJiYiZnVuY3Rpb24iPT10eXBlb2YgaS5zZW5kP2Z1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3JldHVybiBpLnNlbmQoIm1vZHVsZSIse21vZHVsZTpuLG1ldGhvZDpyfSxlKX06KGNvbnNvbGUuZXJyb3IoIltKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBmaW5kIHRhc2tDZW50ZXIgKCIrZSsiKS4iKSxudWxsKX1mdW5jdGlvbiBtb2R1bGVTZXR0ZXIoZSx0LG4scil7dmFyIGk9Z2V0VGFza0NlbnRlcihlKTtyZXR1cm4gaSYmImZ1bmN0aW9uIj09dHlwZW9mIGkuc2VuZD8iZnVuY3Rpb24iIT10eXBlb2Ygcj8oY29uc29sZS5lcnJvcigiW0pTIEZyYW1ld29ya10gIit0KyIuIituKyIgbXVzdCBiZSBhc3NpZ25lZCBhcyBhIGZ1bmN0aW9uLiIpLG51bGwpOmZ1bmN0aW9uKGUpe3JldHVybiBpLnNlbmQoIm1vZHVsZSIse21vZHVsZTp0LG1ldGhvZDpufSxbZV0pfTooY29uc29sZS5lcnJvcigiW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGZpbmQgdGFza0NlbnRlciAoIitlKyIpLiIpLG51bGwpfWdsb2JhbC5jYWxsVXBkYXRlU3R5bGU9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49YXJndW1lbnRzLmxlbmd0aC0xOzA8bi0tOyl0W25dPWFyZ3VtZW50c1tuKzFdO3JldHVybiB0WzFdJiYodFsxXT1ub3JtYWxpemVVbml0KHRbMV0pKSxvbGRDYWxsVXBkYXRlU3R5bGUuYXBwbHkodm9pZCAwLFtlXS5jb25jYXQodCkpfTt2YXIgV2VleEluc3RhbmNlPWZ1bmN0aW9uKGUsdCxuKXtzZXRJZCh0aGlzLFN0cmluZyhlKSksdGhpcy5jb25maWc9dHx8e30sdGhpcy5fbmF0aXZlRGF0YT1ufHx7fSx0aGlzLmRvY3VtZW50PW5ldyBEb2N1bWVudChlLHRoaXMuY29uZmlnLmJ1bmRsZVVybCksdGhpcy5yZXF1aXJlTW9kdWxlPXRoaXMucmVxdWlyZU1vZHVsZS5iaW5kKHRoaXMpLHRoaXMuaW1wb3J0U2NyaXB0PXRoaXMuaW1wb3J0U2NyaXB0LmJpbmQodGhpcyksdGhpcy5pc1JlZ2lzdGVyZWRNb2R1bGU9aXNSZWdpc3RlcmVkTW9kdWxlLHRoaXMuaXNSZWdpc3RlcmVkQ29tcG9uZW50PWlzUmVnaXN0ZXJlZENvbXBvbmVudH0sX192dWVQbHVnaW4sX19kZWZpbmVQYWdlLF9fcmVnaXN0ZXJBcHAsX19yZWdpc3RlclBhZ2UsdW5pLGdldEFwcCxnZXRDdXJyZW50UGFnZXMsVW5pU2VydmljZUpTQnJpZGdlO2Z1bmN0aW9uIGNyZWF0ZVNlcnZpY2VDb250ZXh0KFN2LHh2LEN2LFR2LGUpe3ZhciBPdj1lLnNldFRpbWVvdXQsRXY9ZS5jbGVhclRpbWVvdXQsQXY9ZS5zZXRJbnRlcnZhbCxJdj1lLmNsZWFySW50ZXJ2YWwsJHY9ZS5fX3VuaUNvbmZpZyxQdj1lLl9fdW5pUm91dGVzLHQ9ZnVuY3Rpb24oKXt2YXIgZSxpLHQ9WyJiYXNlNjRUb0FycmF5QnVmZmVyIiwiYXJyYXlCdWZmZXJUb0Jhc2U2NCIsImFkZEludGVyY2VwdG9yIiwicmVtb3ZlSW50ZXJjZXB0b3IiLCJpbnRlcmNlcHRvcnMiXS5jb25jYXQoWyJyZXF1ZXN0IiwidXBsb2FkRmlsZSIsImRvd25sb2FkRmlsZSIsImNvbm5lY3RTb2NrZXQiLCJvblNvY2tldE9wZW4iLCJvblNvY2tldEVycm9yIiwic2VuZFNvY2tldE1lc3NhZ2UiLCJvblNvY2tldE1lc3NhZ2UiLCJjbG9zZVNvY2tldCIsIm9uU29ja2V0Q2xvc2UiLCJnZXRVcGRhdGVNYW5hZ2VyIiwiY29uZmlnTVRMUyJdLFsibmF2aWdhdGVUbyIsInJlZGlyZWN0VG8iLCJyZUxhdW5jaCIsInN3aXRjaFRhYiIsIm5hdmlnYXRlQmFjayJdLFsic2V0U3RvcmFnZSIsInNldFN0b3JhZ2VTeW5jIiwiZ2V0U3RvcmFnZSIsImdldFN0b3JhZ2VTeW5jIiwiZ2V0U3RvcmFnZUluZm8iLCJnZXRTdG9yYWdlSW5mb1N5bmMiLCJyZW1vdmVTdG9yYWdlIiwicmVtb3ZlU3RvcmFnZVN5bmMiLCJjbGVhclN0b3JhZ2UiLCJjbGVhclN0b3JhZ2VTeW5jIl0sWyJnZXRMb2NhdGlvbiIsImNob29zZUxvY2F0aW9uIiwib3BlbkxvY2F0aW9uIiwiY3JlYXRlTWFwQ29udGV4dCJdLFsiY2hvb3NlSW1hZ2UiLCJjaG9vc2VGaWxlIiwicHJldmlld0ltYWdlIiwiY2xvc2VQcmV2aWV3SW1hZ2UiLCJnZXRJbWFnZUluZm8iLCJnZXRWaWRlb0luZm8iLCJzYXZlSW1hZ2VUb1Bob3Rvc0FsYnVtIiwiY29tcHJlc3NJbWFnZSIsImNvbXByZXNzVmlkZW8iLCJnZXRSZWNvcmRlck1hbmFnZXIiLCJnZXRCYWNrZ3JvdW5kQXVkaW9NYW5hZ2VyIiwiY3JlYXRlQXVkaW9Db250ZXh0IiwiY3JlYXRlSW5uZXJBdWRpb0NvbnRleHQiLCJjaG9vc2VWaWRlbyIsInNhdmVWaWRlb1RvUGhvdG9zQWxidW0iLCJjcmVhdGVWaWRlb0NvbnRleHQiLCJjcmVhdGVDYW1lcmFDb250ZXh0IiwiY3JlYXRlTGl2ZVBsYXllckNvbnRleHQiLCJjcmVhdGVMaXZlUHVzaGVyQ29udGV4dCJdLFsiZ2V0U3lzdGVtSW5mbyIsImdldFN5c3RlbUluZm9TeW5jIiwiZ2V0V2luZG93SW5mbyIsImdldERldmljZUluZm8iLCJnZXRBcHBCYXNlSW5mbyIsImNhbklVc2UiLCJvbk1lbW9yeVdhcm5pbmciLCJnZXROZXR3b3JrVHlwZSIsIm9uTmV0d29ya1N0YXR1c0NoYW5nZSIsIm9mZk5ldHdvcmtTdGF0dXNDaGFuZ2UiLCJvbkFjY2VsZXJvbWV0ZXJDaGFuZ2UiLCJvZmZBY2NlbGVyb21ldGVyQ2hhbmdlIiwic3RhcnRBY2NlbGVyb21ldGVyIiwic3RvcEFjY2VsZXJvbWV0ZXIiLCJvbkNvbXBhc3NDaGFuZ2UiLCJvZmZDb21wYXNzQ2hhbmdlIiwic3RhcnRDb21wYXNzIiwic3RvcENvbXBhc3MiLCJvbkd5cm9zY29wZUNoYW5nZSIsInN0YXJ0R3lyb3Njb3BlIiwic3RvcEd5cm9zY29wZSIsIm1ha2VQaG9uZUNhbGwiLCJzY2FuQ29kZSIsInNldENsaXBib2FyZERhdGEiLCJnZXRDbGlwYm9hcmREYXRhIiwic2V0U2NyZWVuQnJpZ2h0bmVzcyIsImdldFNjcmVlbkJyaWdodG5lc3MiLCJzZXRLZWVwU2NyZWVuT24iLCJvblVzZXJDYXB0dXJlU2NyZWVuIiwidmlicmF0ZUxvbmciLCJ2aWJyYXRlU2hvcnQiLCJhZGRQaG9uZUNvbnRhY3QiLCJvcGVuQmx1ZXRvb3RoQWRhcHRlciIsInN0YXJ0Qmx1ZXRvb3RoRGV2aWNlc0Rpc2NvdmVyeSIsIm9uQmx1ZXRvb3RoRGV2aWNlRm91bmQiLCJzdG9wQmx1ZXRvb3RoRGV2aWNlc0Rpc2NvdmVyeSIsIm9uQmx1ZXRvb3RoQWRhcHRlclN0YXRlQ2hhbmdlIiwiZ2V0Q29ubmVjdGVkQmx1ZXRvb3RoRGV2aWNlcyIsImdldEJsdWV0b290aERldmljZXMiLCJnZXRCbHVldG9vdGhBZGFwdGVyU3RhdGUiLCJjbG9zZUJsdWV0b290aEFkYXB0ZXIiLCJ3cml0ZUJMRUNoYXJhY3RlcmlzdGljVmFsdWUiLCJyZWFkQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZSIsIm9uQkxFQ29ubmVjdGlvblN0YXRlQ2hhbmdlIiwib25CTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlIiwibm90aWZ5QkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZSIsImdldEJMRURldmljZVNlcnZpY2VzIiwiZ2V0QkxFRGV2aWNlQ2hhcmFjdGVyaXN0aWNzIiwiY3JlYXRlQkxFQ29ubmVjdGlvbiIsImNsb3NlQkxFQ29ubmVjdGlvbiIsInNldEJMRU1UVSIsImdldEJMRURldmljZVJTU0kiLCJvbkJlYWNvblNlcnZpY2VDaGFuZ2UiLCJvbkJlYWNvblVwZGF0ZSIsImdldEJlYWNvbnMiLCJzdGFydEJlYWNvbkRpc2NvdmVyeSIsInN0b3BCZWFjb25EaXNjb3ZlcnkiLCJjaGVja0lzU3VwcG9ydFNvdGVyQXV0aGVudGljYXRpb24iLCJjaGVja0lzU290ZXJFbnJvbGxlZEluRGV2aWNlIiwic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uIiwib25UaGVtZUNoYW5nZSIsIm9uVUlTdHlsZUNoYW5nZSIsImdldFN5c3RlbVNldHRpbmciLCJnZXRBcHBBdXRob3JpemVTZXR0aW5nIiwib3BlbkFwcEF1dGhvcml6ZVNldHRpbmciXSxbImhpZGVLZXlib2FyZCIsIm9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLCJvZmZLZXlib2FyZEhlaWdodENoYW5nZSIsImdldFNlbGVjdGVkVGV4dFJhbmdlIl0sWyJzaG93VG9hc3QiLCJoaWRlVG9hc3QiLCJzaG93TG9hZGluZyIsImhpZGVMb2FkaW5nIiwic2hvd01vZGFsIiwic2hvd0FjdGlvblNoZWV0Iiwic2V0TmF2aWdhdGlvbkJhclRpdGxlIiwic2V0TmF2aWdhdGlvbkJhckNvbG9yIiwic2hvd05hdmlnYXRpb25CYXJMb2FkaW5nIiwiaGlkZU5hdmlnYXRpb25CYXJMb2FkaW5nIiwic2V0VGFiQmFySXRlbSIsInNldFRhYkJhclN0eWxlIiwiaGlkZVRhYkJhciIsInNob3dUYWJCYXIiLCJzZXRUYWJCYXJCYWRnZSIsInJlbW92ZVRhYkJhckJhZGdlIiwic2hvd1RhYkJhclJlZERvdCIsImhpZGVUYWJCYXJSZWREb3QiLCJvblRhYkJhck1pZEJ1dHRvblRhcCIsInNldEJhY2tncm91bmRDb2xvciIsInNldEJhY2tncm91bmRUZXh0U3R5bGUiLCJjcmVhdGVBbmltYXRpb24iLCJwYWdlU2Nyb2xsVG8iLCJvbldpbmRvd1Jlc2l6ZSIsIm9mZldpbmRvd1Jlc2l6ZSIsImxvYWRGb250RmFjZSIsInN0YXJ0UHVsbERvd25SZWZyZXNoIiwic3RvcFB1bGxEb3duUmVmcmVzaCIsImNyZWF0ZVNlbGVjdG9yUXVlcnkiLCJjcmVhdGVJbnRlcnNlY3Rpb25PYnNlcnZlciIsImNyZWF0ZU1lZGlhUXVlcnlPYnNlcnZlciIsImdldE1lbnVCdXR0b25Cb3VuZGluZ0NsaWVudFJlY3QiLCJzaG93VG9wV2luZG93Iiwic2hvd0xlZnRXaW5kb3ciLCJzaG93UmlnaHRXaW5kb3ciLCJoaWRlVG9wV2luZG93IiwiaGlkZUxlZnRXaW5kb3ciLCJoaWRlUmlnaHRXaW5kb3ciLCJnZXRUb3BXaW5kb3dTdHlsZSIsImdldExlZnRXaW5kb3dTdHlsZSIsImdldFJpZ2h0V2luZG93U3R5bGUiLCJzZXRUb3BXaW5kb3dTdHlsZSIsInNldExlZnRXaW5kb3dTdHlsZSIsInNldFJpZ2h0V2luZG93U3R5bGUiLCJnZXRMb2NhbGUiLCJzZXRMb2NhbGUiLCJvbkxvY2FsZUNoYW5nZSJdLFsiJGVtaXQiLCIkb24iLCIkb25jZSIsIiRvZmYiXSxbInNhdmVGaWxlIiwiZ2V0U2F2ZWRGaWxlTGlzdCIsImdldFNhdmVkRmlsZUluZm8iLCJyZW1vdmVTYXZlZEZpbGUiLCJnZXRGaWxlSW5mbyIsIm9wZW5Eb2N1bWVudCIsImdldEZpbGVTeXN0ZW1NYW5hZ2VyIl0sWyJjcmVhdGVPZmZzY3JlZW5DYW52YXMiLCJjcmVhdGVDYW52YXNDb250ZXh0IiwiY2FudmFzVG9UZW1wRmlsZVBhdGgiLCJjYW52YXNQdXRJbWFnZURhdGEiLCJjYW52YXNHZXRJbWFnZURhdGEiXSxbImdldFByb3ZpZGVyIiwibG9naW4iLCJjaGVja1Nlc3Npb24iLCJnZXRVc2VySW5mbyIsImdldFVzZXJQcm9maWxlIiwicHJlTG9naW4iLCJjbG9zZUF1dGhWaWV3IiwiZ2V0Q2hlY2tCb3hTdGF0ZSIsImdldFVuaXZlcmlmeU1hbmFnZXIiLCJzaGFyZSIsInNoYXJlV2l0aFN5c3RlbSIsInNob3dTaGFyZU1lbnUiLCJoaWRlU2hhcmVNZW51IiwicmVxdWVzdFBheW1lbnQiLCJzdWJzY3JpYmVQdXNoIiwidW5zdWJzY3JpYmVQdXNoIiwib25QdXNoIiwib2ZmUHVzaCIsInJlcXVpcmVOYXRpdmVQbHVnaW4iLCJ1cHgycHgiLCJyZXN0b3JlR2xvYmFsIiwicmVxdWlyZUdsb2JhbCIsImdldFN1Yk5WdWVCeUlkIiwiZ2V0Q3VycmVudFN1Yk5WdWUiLCJzZXRQYWdlTWV0YSIsIm9uSG9zdEV2ZW50UmVjZWl2ZSIsIm9uTmF0aXZlRXZlbnRSZWNlaXZlIiwic2VuZE5hdGl2ZUV2ZW50IiwicHJlbG9hZFBhZ2UiLCJ1blByZWxvYWRQYWdlIiwibG9hZFN1YlBhY2thZ2UiLCJzZW5kSG9zdEV2ZW50IiwibmF2aWdhdGVUb01pbmlQcm9ncmFtIiwiZ2V0TGF1bmNoT3B0aW9uc1N5bmMiLCJnZXRFbnRlck9wdGlvbnNTeW5jIl0sWyJjcmVhdGVSZXdhcmRlZFZpZGVvQWQiLCJjcmVhdGVGdWxsU2NyZWVuVmlkZW9BZCIsImNyZWF0ZUludGVyc3RpdGlhbEFkIiwiY3JlYXRlSW50ZXJhY3RpdmVBZCJdLFsiaW52b2tlUHVzaENhbGxiYWNrIiwiZ2V0UHVzaENsaWVudElkIiwib25QdXNoTWVzc2FnZSIsIm9mZlB1c2hNZXNzYWdlIiwiY3JlYXRlUHVzaE1lc3NhZ2UiXSk7dHJ5e3ZhciBuPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJwYXNzaXZlIix7Z2V0OmZ1bmN0aW9uKCl7fX0pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0LXBhc3NpdmUiLG51bGwsbil9Y2F0Y2goZSl7fXZhciBhPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIscz0vXig/OltBLVphLXpcZCsvXXs0fSkqPyg/OltBLVphLXpcZCsvXXsyfSg/Oj09KT98W0EtWmEtelxkKy9dezN9PT8pPyQvO2Z1bmN0aW9uIGMoKXt2YXIgZSx0LG49TXYuZ2V0U3RvcmFnZVN5bmMoInVuaV9pZF90b2tlbiIpfHwiIixyPW4uc3BsaXQoIi4iKTtpZighbnx8MyE9PXIubGVuZ3RoKXJldHVybnt1aWQ6bnVsbCxyb2xlOltdLHBlcm1pc3Npb246W10sdG9rZW5FeHBpcmVkOjB9O3RyeXtlPUpTT04ucGFyc2UoKHQ9clsxXSxkZWNvZGVVUklDb21wb25lbnQoaSh0KS5zcGxpdCgiIikubWFwKGZ1bmN0aW9uKGUpe3JldHVybiIlIisoIjAwIitlLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtMil9KS5qb2luKCIiKSkpKX1jYXRjaChlKXt0aHJvdyBuZXcgRXJyb3IoIuiOt+WPluW9k+WJjeeUqOaIt+S/oeaBr+WHuumUme+8jOivpue7humUmeivr+S/oeaBr+S4uu+8miIrZS5tZXNzYWdlKX1yZXR1cm4gZS50b2tlbkV4cGlyZWQ9MWUzKmUuZXhwLGRlbGV0ZSBlLmV4cCxkZWxldGUgZS5pYXQsZX1pPSJmdW5jdGlvbiIhPXR5cGVvZiBhdG9iP2Z1bmN0aW9uKGUpe2lmKGU9U3RyaW5nKGUpLnJlcGxhY2UoL1tcdFxuXGZcciBdKy9nLCIiKSwhcy50ZXN0KGUpKXRocm93IG5ldyBFcnJvcigiRmFpbGVkIHRvIGV4ZWN1dGUgJ2F0b2InIG9uICdXaW5kb3cnOiBUaGUgc3RyaW5nIHRvIGJlIGRlY29kZWQgaXMgbm90IGNvcnJlY3RseSBlbmNvZGVkLiIpO3ZhciB0O2UrPSI9PSIuc2xpY2UoMi0oMyZlLmxlbmd0aCkpO2Zvcih2YXIgbixyLGk9IiIsbz0wO288ZS5sZW5ndGg7KXQ9YS5pbmRleE9mKGUuY2hhckF0KG8rKykpPDwxOHxhLmluZGV4T2YoZS5jaGFyQXQobysrKSk8PDEyfChuPWEuaW5kZXhPZihlLmNoYXJBdChvKyspKSk8PDZ8KHI9YS5pbmRleE9mKGUuY2hhckF0KG8rKykpKSxpKz02ND09PW4/U3RyaW5nLmZyb21DaGFyQ29kZSh0Pj4xNiYyNTUpOjY0PT09cj9TdHJpbmcuZnJvbUNoYXJDb2RlKHQ+PjE2JjI1NSx0Pj44JjI1NSk6U3RyaW5nLmZyb21DaGFyQ29kZSh0Pj4xNiYyNTUsdD4+OCYyNTUsMjU1JnQpO3JldHVybiBpfTphdG9iO3ZhciByPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsbz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIEMoZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGV9ZnVuY3Rpb24gdShlKXtyZXR1cm4gbnVsbCE9PWUmJiJvYmplY3QiPT10eXBlb2YgZX1mdW5jdGlvbiBUKGUpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09ci5jYWxsKGUpfWZ1bmN0aW9uIGsoZSx0KXtyZXR1cm4gby5jYWxsKGUsdCl9ZnVuY3Rpb24gbCgpe31mdW5jdGlvbiBmKGUpe3JldHVybiByLmNhbGwoZSkuc2xpY2UoOCwtMSl9ZnVuY3Rpb24gZCh0KXt2YXIgbj1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbltlXXx8KG5bZV09dChlKSl9fXZhciBwPS8tKFx3KS9nLGg9ZChmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKHAsZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD90LnRvVXBwZXJDYXNlKCk6IiJ9KX0pO2Z1bmN0aW9uIHYodCxuKXtpZih0PT09bilyZXR1cm4hMDt2YXIgZT11KHQpLHI9dShuKTtpZighZXx8IXIpcmV0dXJuIWUmJiFyJiZTdHJpbmcodCk9PT1TdHJpbmcobik7dHJ5e3ZhciBpPUFycmF5LmlzQXJyYXkodCksbz1BcnJheS5pc0FycmF5KG4pO2lmKGkmJm8pcmV0dXJuIHQubGVuZ3RoPT09bi5sZW5ndGgmJnQuZXZlcnkoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdihlLG5bdF0pfSk7aWYodCBpbnN0YW5jZW9mIERhdGUmJm4gaW5zdGFuY2VvZiBEYXRlKXJldHVybiB0LmdldFRpbWUoKT09PW4uZ2V0VGltZSgpO2lmKGl8fG8pcmV0dXJuITE7dmFyIGE9T2JqZWN0LmtleXModCkscz1PYmplY3Qua2V5cyhuKTtyZXR1cm4gYS5sZW5ndGg9PT1zLmxlbmd0aCYmYS5ldmVyeShmdW5jdGlvbihlKXtyZXR1cm4gdih0W2VdLG5bZV0pfSl9Y2F0Y2goZSl7cmV0dXJuITF9fXZhciBnPS9bIScoKSpdL2csbT1mdW5jdGlvbihlKXtyZXR1cm4iJSIrZS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KX0seT0vJTJDL2csXz1mdW5jdGlvbihlKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGUpLnJlcGxhY2UoZyxtKS5yZXBsYWNlKHksIiwiKX0sYj1kZWNvZGVVUklDb21wb25lbnQ7ZnVuY3Rpb24gdyhlKXt2YXIgaT17fTtyZXR1cm4oZT1lLnRyaW0oKS5yZXBsYWNlKC9eKFw/fCN8JikvLCIiKSkmJmUuc3BsaXQoIiYiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSgvXCsvZywiICIpLnNwbGl0KCI9Iiksbj1iKHQuc2hpZnQoKSkscj0wPHQubGVuZ3RoP2IodC5qb2luKCI9IikpOm51bGw7dm9pZCAwPT09aVtuXT9pW25dPXI6QXJyYXkuaXNBcnJheShpW25dKT9pW25dLnB1c2gocik6aVtuXT1baVtuXSxyXX0pLGl9ZnVuY3Rpb24gUyhyLGkpe3ZvaWQgMD09PWkmJihpPV8pO3ZhciBlPXI/T2JqZWN0LmtleXMocikubWFwKGZ1bmN0aW9uKHQpe3ZhciBlPXJbdF07aWYodm9pZCAwPT09ZSlyZXR1cm4iIjtpZihudWxsPT09ZSlyZXR1cm4gaSh0KTtpZihBcnJheS5pc0FycmF5KGUpKXt2YXIgbj1bXTtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZvaWQgMCE9PWUmJihudWxsPT09ZT9uLnB1c2goaSh0KSk6bi5wdXNoKGkodCkrIj0iK2koZSkpKX0pLG4uam9pbigiJiIpfXJldHVybiBpKHQpKyI9IitpKGUpfSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiAwPGUubGVuZ3RofSkuam9pbigiJiIpOm51bGw7cmV0dXJuIGU/Ij8iK2U6IiJ9dmFyIHg9MCxPPXt9O2Z1bmN0aW9uIEUoZSx0KXt2YXIgbj1PW2VdfHx7fTtkZWxldGUgT1tlXTt2YXIgcj10LmVyck1zZ3x8IiI7bmV3IFJlZ0V4cCgiXFw6XFxzKmZhaWwiKS50ZXN0KHIpP24uZmFpbCYmbi5mYWlsKHQpOm4uc3VjY2VzcyYmbi5zdWNjZXNzKHQpLG4uY29tcGxldGUmJm4uY29tcGxldGUodCl9dmFyIEE9e3dhcnA6ZnVuY3Rpb24oaSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1TdHJpbmcoeCsrKTtPW3RdPXtzdWNjZXNzOmUuc3VjY2VzcyxmYWlsOmUuZmFpbCxjb21wbGV0ZTplLmNvbXBsZXRlfTt2YXIgbj1PYmplY3QuYXNzaWduKHt9LGUpLHI9aS5iaW5kKHRoaXMpKG4sdCk7ciYmRSh0LHIpfX0saW52b2tlOkV9O2Z1bmN0aW9uIEkoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dHJ5e3JldHVybiBlLmFwcGx5KGUsYXJndW1lbnRzKX1jYXRjaChlKXtjb25zb2xlLmVycm9yKGUpfX19ZnVuY3Rpb24gJChlKXtyZXR1cm4gZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGUuYXBwbHkoZSxhcmd1bWVudHMpfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoZSl9fX12YXIgUD1bImludm9rZSIsInN1Y2Nlc3MiLCJmYWlsIiwiY29tcGxldGUiLCJyZXR1cm5WYWx1ZSJdLE09e30saj17fTtmdW5jdGlvbiBMKGksbyl7T2JqZWN0LmtleXMobykuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdCxuLHI7LTEhPT1QLmluZGV4T2YoZSkmJkMob1tlXSkmJihpW2VdPSh0PWlbZV0sbj1vW2VdLChyPW4/dD90LmNvbmNhdChuKTpBcnJheS5pc0FycmF5KG4pP246W25dOnQpP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspLTE9PT10LmluZGV4T2YoZVtuXSkmJnQucHVzaChlW25dKTtyZXR1cm4gdH0ocik6cikpfSl9ZnVuY3Rpb24gTihpLG8pe2kmJm8mJk9iamVjdC5rZXlzKG8pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQsbixyOy0xIT09UC5pbmRleE9mKGUpJiZDKG9bZV0pJiYodD1pW2VdLG49b1tlXSwtMSE9PShyPXQuaW5kZXhPZihuKSkmJnQuc3BsaWNlKHIsMSkpfSl9ZnVuY3Rpb24gQih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl8fGV9fWZ1bmN0aW9uIEQoZSl7cmV0dXJuISFlJiYoIm9iamVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZSkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnRoZW59ZnVuY3Rpb24gUihlLHQpe2Zvcih2YXIgbj0hMSxyPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBpPWVbcl07aWYobiluPVByb21pc2UucmVzb2x2ZShCKGkpKTtlbHNle3ZhciBvPWkodCk7aWYoRChvKSYmKG49UHJvbWlzZS5yZXNvbHZlKG8pKSwhMT09PW8pcmV0dXJue3RoZW46ZnVuY3Rpb24oKXt9fX19cmV0dXJuIG58fHt0aGVuOmZ1bmN0aW9uKGUpe3JldHVybiBlKHQpfX19ZnVuY3Rpb24gRihyLGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT17fSksWyJzdWNjZXNzIiwiZmFpbCIsImNvbXBsZXRlIl0uZm9yRWFjaChmdW5jdGlvbih0KXtpZihBcnJheS5pc0FycmF5KHJbdF0pKXt2YXIgbj1lW3RdO2VbdF09ZnVuY3Rpb24oZSl7UihyW3RdLGUpLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIEMobikmJm4oZSl8fGV9KX19fSksZX1mdW5jdGlvbiB6KGUsdCl7dmFyIG49W107QXJyYXkuaXNBcnJheShNLnJldHVyblZhbHVlKSYmbi5wdXNoLmFwcGx5KG4sTS5yZXR1cm5WYWx1ZSk7dmFyIHI9altlXTtyZXR1cm4gciYmQXJyYXkuaXNBcnJheShyLnJldHVyblZhbHVlKSYmbi5wdXNoLmFwcGx5KG4sci5yZXR1cm5WYWx1ZSksbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3Q9ZSh0KXx8dH0pLHR9ZnVuY3Rpb24gVihlLHQsbil7Zm9yKHZhciByPVtdLGk9YXJndW1lbnRzLmxlbmd0aC0zOzA8aS0tOylyW2ldPWFyZ3VtZW50c1tpKzNdO3ZhciBvPWZ1bmN0aW9uKGUpe3ZhciB0PU9iamVjdC5jcmVhdGUobnVsbCk7T2JqZWN0LmtleXMoTSkuZm9yRWFjaChmdW5jdGlvbihlKXsicmV0dXJuVmFsdWUiIT09ZSYmKHRbZV09TVtlXS5zbGljZSgpKX0pO3ZhciBuPWpbZV07cmV0dXJuIG4mJk9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oZSl7InJldHVyblZhbHVlIiE9PWUmJih0W2VdPSh0W2VdfHxbXSkuY29uY2F0KG5bZV0pKX0pLHR9KGUpO3JldHVybiBvJiZPYmplY3Qua2V5cyhvKS5sZW5ndGg/QXJyYXkuaXNBcnJheShvLmludm9rZSk/UihvLmludm9rZSxuKS50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiB0LmFwcGx5KHZvaWQgMCxbRihvLGUpXS5jb25jYXQocikpfSk6dC5hcHBseSh2b2lkIDAsW0YobyxuKV0uY29uY2F0KHIpKTp0LmFwcGx5KHZvaWQgMCxbbl0uY29uY2F0KHIpKX12YXIgVT17cmV0dXJuVmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEQoZSk/bmV3IFByb21pc2UoZnVuY3Rpb24odCxuKXtlLnRoZW4oZnVuY3Rpb24oZSl7ZVswXT9uKGVbMF0pOnQoZVsxXSl9KX0pOmV9fSxxPS9eXCR8V2luZG93JHxXaW5kb3dTdHlsZSR8c2VuZEhvc3RFdmVudHxzZW5kTmF0aXZlRXZlbnR8cmVzdG9yZUdsb2JhbHxyZXF1aXJlR2xvYmFsfGdldEN1cnJlbnRTdWJOVnVlfGdldE1lbnVCdXR0b25Cb3VuZGluZ0NsaWVudFJlY3R8XnJlcG9ydHxpbnRlcmNlcHRvcnN8SW50ZXJjZXB0b3IkfGdldFN1Yk5WdWVCeUlkfHJlcXVpcmVOYXRpdmVQbHVnaW58dXB4MnB4fGhpZGVLZXlib2FyZHxjYW5JVXNlfF5jcmVhdGV8U3luYyR8TWFuYWdlciR8YmFzZTY0VG9BcnJheUJ1ZmZlcnxhcnJheUJ1ZmZlclRvQmFzZTY0fGdldExvY2FsZXxzZXRMb2NhbGV8aW52b2tlUHVzaENhbGxiYWNrfGdldFdpbmRvd0luZm98Z2V0RGV2aWNlSW5mb3xnZXRBcHBCYXNlSW5mb3xnZXRTeXN0ZW1TZXR0aW5nfGdldEFwcEF1dGhvcml6ZVNldHRpbmcvLFc9L15jcmVhdGV8TWFuYWdlciQvLEg9WyJjcmVhdGVCTEVDb25uZWN0aW9uIl0sRz1bInJlcXVlc3QiLCJkb3dubG9hZEZpbGUiLCJ1cGxvYWRGaWxlIiwiY29ubmVjdFNvY2tldCJdLFg9WyJjcmVhdGVCTEVDb25uZWN0aW9uIiwiY3JlYXRlUHVzaE1lc3NhZ2UiXSxZPS9eb258Xm9mZi87ZnVuY3Rpb24gSihlKXtyZXR1cm4gcS50ZXN0KGUpJiYtMT09PVguaW5kZXhPZihlKX1mdW5jdGlvbiBLKGUpe3JldHVybiBZLnRlc3QoZSkmJiJvblB1c2giIT09ZX1mdW5jdGlvbiBaKGUpe3JldHVybiB0PWUsIShXLnRlc3QodCkmJi0xPT09SC5pbmRleE9mKHQpfHxKKGUpfHxLKGUpKTt2YXIgdH1mdW5jdGlvbiBRKGUpe3ZhciB0PXt9O2Zvcih2YXIgbiBpbiBlKXt2YXIgcj1lW25dO0MocikmJih0W25dPSQociksZGVsZXRlIGVbbl0pfXJldHVybiB0fVByb21pc2UucHJvdG90eXBlLmZpbmFsbHl8fChQcm9taXNlLnByb3RvdHlwZS5maW5hbGx5PWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuY29uc3RydWN0b3I7cmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gbi5yZXNvbHZlKHQoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBlfSl9LGZ1bmN0aW9uKGUpe3JldHVybiBuLnJlc29sdmUodCgpKS50aGVuKGZ1bmN0aW9uKCl7dGhyb3cgZX0pfSl9KTt2YXIgZWU9W3tuYW1lOiJiYXNlNjQiLHR5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfV0sdGU9W3tuYW1lOiJhcnJheUJ1ZmZlciIsdHlwZTpbQXJyYXlCdWZmZXIsVWludDhBcnJheV0scmVxdWlyZWQ6ITB9XSxuZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxiYXNlNjRUb0FycmF5QnVmZmVyOmVlLGFycmF5QnVmZmVyVG9CYXNlNjQ6dGV9KSxyZT1be25hbWU6InNjaGVtYSIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSxpZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjYW5JVXNlOnJlfSksb2U9W3tuYW1lOiJldmVudCIsdHlwZTpbU3RyaW5nLEFycmF5XSxyZXF1aXJlZDohMH0se25hbWU6ImNhbGxiYWNrIix0eXBlOkZ1bmN0aW9uLHJlcXVpcmVkOiEwfV0sYWU9b2Usc2U9W3tuYW1lOiJldmVudCIsdHlwZTpbU3RyaW5nLEFycmF5XX0se25hbWU6ImNhbGxiYWNrIix0eXBlOkZ1bmN0aW9ufV0sY2U9W3tuYW1lOiJldmVudCIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSx1ZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCwkb246b2UsJG9uY2U6YWUsJG9mZjpzZSwkZW1pdDpjZX0pLGxlPVt7bmFtZToibWV0aG9kIix0eXBlOltTdHJpbmcsT2JqZWN0XSxyZXF1aXJlZDohMH1dLGRlPWxlLGZlPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGFkZEludGVyY2VwdG9yOmxlLHJlbW92ZUludGVyY2VwdG9yOmRlfSkscGU9W3tuYW1lOiJ1cHgiLHR5cGU6W051bWJlcixTdHJpbmddLHJlcXVpcmVkOiEwfV0saGU9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsdXB4MnB4OnBlfSk7ZnVuY3Rpb24gdmUobil7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7ZSYmKHRbbl09TWF0aC5yb3VuZChlKSl9fXZhciBnZT17Y2FudmFzSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSx4Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMCx2YWxpZGF0b3I6dmUoIngiKX0seTp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOnZlKCJ5Iil9LHdpZHRoOnt0eXBlOk51bWJlcixyZXF1aXJlZDohMCx2YWxpZGF0b3I6dmUoIndpZHRoIil9LGhlaWdodDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOnZlKCJoZWlnaHQiKX19LG1lPXtjYW52YXNJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGRhdGE6e3R5cGU6VWludDhDbGFtcGVkQXJyYXkscmVxdWlyZWQ6ITB9LHg6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjp2ZSgieCIpfSx5Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMCx2YWxpZGF0b3I6dmUoInkiKX0sd2lkdGg6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjp2ZSgid2lkdGgiKX0saGVpZ2h0Ont0eXBlOk51bWJlcix2YWxpZGF0b3I6dmUoImhlaWdodCIpfX0seWU9e1BORzoicG5nIixKUEc6ImpwZyIsSlBFRzoianBnIn0sX2U9e3g6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MCx2YWxpZGF0b3I6dmUoIngiKX0seTp7dHlwZTpOdW1iZXIsZGVmYXVsdDowLHZhbGlkYXRvcjp2ZSgieSIpfSx3aWR0aDp7dHlwZTpOdW1iZXIsdmFsaWRhdG9yOnZlKCJ3aWR0aCIpfSxoZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbGlkYXRvcjp2ZSgiaGVpZ2h0Iil9LGRlc3RXaWR0aDp7dHlwZTpOdW1iZXIsdmFsaWRhdG9yOnZlKCJkZXN0V2lkdGgiKX0sZGVzdEhlaWdodDp7dHlwZTpOdW1iZXIsdmFsaWRhdG9yOnZlKCJkZXN0SGVpZ2h0Iil9LGNhbnZhc0lkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZmlsZVR5cGU6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9KGV8fCIiKS50b1VwcGVyQ2FzZSgpLHQuZmlsZVR5cGU9ZSBpbiB5ZT95ZVtlXTp5ZS5QTkd9fSxxdWFsaXR5Ont0eXBlOk51bWJlcix2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LnF1YWxpdHk9MDxlJiZlPDE/ZToxfX19LGJlPXtjYW52YXNJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGFjdGlvbnM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITB9LHJlc2VydmU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfX0sd2U9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY2FudmFzR2V0SW1hZ2VEYXRhOmdlLGNhbnZhc1B1dEltYWdlRGF0YTptZSxjYW52YXNUb1RlbXBGaWxlUGF0aDpfZSxkcmF3Q2FudmFzOmJlfSksa2U9W3tuYW1lOiJpZCIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSxTZT1rZSx4ZT1rZSxDZT1rZSxUZT1be25hbWU6ImNhbnZhc0lkIix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0se25hbWU6ImNvbXBvbmVudEluc3RhbmNlIix0eXBlOk9iamVjdH1dLE9lPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNyZWF0ZUF1ZGlvQ29udGV4dDpTZSxjcmVhdGVWaWRlb0NvbnRleHQ6eGUsY3JlYXRlTWFwQ29udGV4dDpDZSxjcmVhdGVDYW52YXNDb250ZXh0OlRlfSksRWU9e2ZpcnN0TmFtZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybiJhZGRQaG9uZUNvbnRhY3Q6ZmFpbCBwYXJhbWV0ZXIgZXJyb3I6IHBhcmFtZXRlci5maXJzdE5hbWUgc2hvdWxkIG5vdCBiZSBlbXB0eSBTdHJpbmc7In19fSxBZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxhZGRQaG9uZUNvbnRhY3Q6RWV9KSxJZT17cGhvbmVOdW1iZXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtpZighZSlyZXR1cm4ibWFrZVBob25lQ2FsbDpmYWlsIHBhcmFtZXRlciBlcnJvcjogcGFyYW1ldGVyLnBob25lTnVtYmVyIHNob3VsZCBub3QgYmUgZW1wdHkgU3RyaW5nOyJ9fX0sJGU9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsbWFrZVBob25lQ2FsbDpJZX0pLFBlPXtvbmx5RnJvbUNhbWVyYTp7dHlwZTpCb29sZWFufSxzY2FuVHlwZTp7dHlwZTpBcnJheX0sYXV0b0RlY29kZUNoYXJTZXQ6e3R5cGU6Qm9vbGVhbn0sc291bmQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6Im5vbmUifSxhdXRvWm9vbTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITB9fSxNZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxzY2FuQ29kZTpQZX0pLGplPUFycmF5LmlzQXJyYXksTGU9WyJ7IiwifSJdLE5lPWZ1bmN0aW9uKCl7dGhpcy5fY2FjaGVzPU9iamVjdC5jcmVhdGUobnVsbCl9O05lLnByb3RvdHlwZS5pbnRlcnBvbGF0ZT1mdW5jdGlvbihlLHQsbil7aWYodm9pZCAwPT09biYmKG49TGUpLCF0KXJldHVybltlXTt2YXIgcj10aGlzLl9jYWNoZXNbZV07cmV0dXJuIHJ8fChyPWZ1bmN0aW9uKGUsdCl7dmFyIG49dFswXSxyPXRbMV0saT1bXSxvPTAsYT0iIjtmb3IoO288ZS5sZW5ndGg7KXt2YXIgcz1lW28rK107aWYocz09PW4pe2EmJmkucHVzaCh7dHlwZToidGV4dCIsdmFsdWU6YX0pO3ZhciBjPWE9IiI7Zm9yKHM9ZVtvKytdO3ZvaWQgMCE9PXMmJnMhPT1yOyljKz1zLHM9ZVtvKytdO3ZhciB1PXM9PT1yLGw9QmUudGVzdChjKT8ibGlzdCI6dSYmRGUudGVzdChjKT8ibmFtZWQiOiJ1bmtub3duIjtpLnB1c2goe3ZhbHVlOmMsdHlwZTpsfSl9ZWxzZSBhKz1zfXJldHVybiBhJiZpLnB1c2goe3R5cGU6InRleHQiLHZhbHVlOmF9KSxpfShlLG4pLHRoaXMuX2NhY2hlc1tlXT1yKSxmdW5jdGlvbihlLHQpe3ZhciBuPVtdLHI9MCxpPWplKHQpPyJsaXN0Ijoobz10LG51bGwhPT1vJiYib2JqZWN0Ij09dHlwZW9mIG8/Im5hbWVkIjoidW5rbm93biIpO3ZhciBvO2lmKCJ1bmtub3duIj09PWkpcmV0dXJuIG47Zm9yKDtyPGUubGVuZ3RoOyl7dmFyIGE9ZVtyXTtzd2l0Y2goYS50eXBlKXtjYXNlInRleHQiOm4ucHVzaChhLnZhbHVlKTticmVhaztjYXNlImxpc3QiOm4ucHVzaCh0W3BhcnNlSW50KGEudmFsdWUsMTApXSk7YnJlYWs7Y2FzZSJuYW1lZCI6Im5hbWVkIj09PWkmJm4ucHVzaCh0W2EudmFsdWVdKX1yKyt9cmV0dXJuIG59KHIsdCl9O3ZhciBCZT0vXig/OlxkKSsvLERlPS9eKD86XHcpKy87dmFyIFJlPSJ6aC1IYW5zIixGZT0iemgtSGFudCIsemU9ImVuIixWZT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFVlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIFZlLmNhbGwoZSx0KX0scWU9bmV3IE5lO2Z1bmN0aW9uIFdlKGUsdCl7aWYoZSl7aWYoZT1lLnRyaW0oKS5yZXBsYWNlKC9fL2csIi0iKSx0JiZ0W2VdKXJldHVybiBlO2lmKDA9PT0oZT1lLnRvTG93ZXJDYXNlKCkpLmluZGV4T2YoInpoIikpcmV0dXJuLTE8ZS5pbmRleE9mKCItaGFucyIpP1JlOi0xPGUuaW5kZXhPZigiLWhhbnQiKT9GZToobj1lLFsiLXR3IiwiLWhrIiwiLW1vIiwiLWNodCJdLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuLTEhPT1uLmluZGV4T2YoZSl9KT9GZTpSZSk7dmFyIG4scixpPShyPWUsW3plLCJmciIsImVzIl0uZmluZChmdW5jdGlvbihlKXtyZXR1cm4gMD09PXIuaW5kZXhPZihlKX0pKTtyZXR1cm4gaXx8dm9pZCAwfX12YXIgSGU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sb2NhbGUsbj1lLmZhbGxiYWNrTG9jYWxlLHI9ZS5tZXNzYWdlcyxpPWUud2F0Y2hlcixvPWUuZm9ybWF0ZXI7dGhpcy5sb2NhbGU9emUsdGhpcy5mYWxsYmFja0xvY2FsZT16ZSx0aGlzLm1lc3NhZ2U9e30sdGhpcy5tZXNzYWdlcz17fSx0aGlzLndhdGNoZXJzPVtdLG4mJih0aGlzLmZhbGxiYWNrTG9jYWxlPW4pLHRoaXMuZm9ybWF0ZXI9b3x8cWUsdGhpcy5tZXNzYWdlcz1yfHx7fSx0aGlzLnNldExvY2FsZSh0fHx6ZSksaSYmdGhpcy53YXRjaExvY2FsZShpKX07ZnVuY3Rpb24gR2UoZSx0KXtyZXR1cm4tMTxlLmluZGV4T2YodFswXSl9SGUucHJvdG90eXBlLnNldExvY2FsZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLG49dGhpcy5sb2NhbGU7dGhpcy5sb2NhbGU9V2UoZSx0aGlzLm1lc3NhZ2VzKXx8dGhpcy5mYWxsYmFja0xvY2FsZSx0aGlzLm1lc3NhZ2VzW3RoaXMubG9jYWxlXXx8KHRoaXMubWVzc2FnZXNbdGhpcy5sb2NhbGVdPXt9KSx0aGlzLm1lc3NhZ2U9dGhpcy5tZXNzYWdlc1t0aGlzLmxvY2FsZV0sbiE9PXRoaXMubG9jYWxlJiZ0aGlzLndhdGNoZXJzLmZvckVhY2goZnVuY3Rpb24oZSl7ZSh0LmxvY2FsZSxuKX0pfSxIZS5wcm90b3R5cGUuZ2V0TG9jYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG9jYWxlfSxIZS5wcm90b3R5cGUud2F0Y2hMb2NhbGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXRoaXMud2F0Y2hlcnMucHVzaChlKS0xO3JldHVybiBmdW5jdGlvbigpe3Qud2F0Y2hlcnMuc3BsaWNlKG4sMSl9fSxIZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGUsdCxuKXt2b2lkIDA9PT1uJiYobj0hMCk7dmFyIHI9dGhpcy5tZXNzYWdlc1tlXTtyP24/T2JqZWN0LmFzc2lnbihyLHQpOk9iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24oZSl7VWUocixlKXx8KHJbZV09dFtlXSl9KTp0aGlzLm1lc3NhZ2VzW2VdPXR9LEhlLnByb3RvdHlwZS5mPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5mb3JtYXRlci5pbnRlcnBvbGF0ZShlLHQsbikuam9pbigiIil9LEhlLnByb3RvdHlwZS50PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLm1lc3NhZ2U7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0Pyh0PVdlKHQsdGhpcy5tZXNzYWdlcykpJiYocj10aGlzLm1lc3NhZ2VzW3RdKTpuPXQsVWUocixlKT90aGlzLmZvcm1hdGVyLmludGVycG9sYXRlKHJbZV0sbikuam9pbigiIik6KGNvbnNvbGUud2FybigiQ2Fubm90IHRyYW5zbGF0ZSB0aGUgdmFsdWUgb2Yga2V5cGF0aCAiK2UrIi4gVXNlIHRoZSB2YWx1ZSBvZiBrZXlwYXRoIGFzIGRlZmF1bHQuIiksZSl9O3ZhciBYZSxZZT00NCxKZT0iZW4iLEtlPXt9O09iamVjdC5hc3NpZ24oS2UsKChlPXt9KVtKZV09eyJ1bmkuYXBwLnF1aXQiOiJQcmVzcyBiYWNrIGJ1dHRvbiBhZ2FpbiB0byBleGl0IiwidW5pLmFzeW5jLmVycm9yIjoiVGhlIGNvbm5lY3Rpb24gdGltZWQgb3V0LCBjbGljayB0aGUgc2NyZWVuIHRvIHRyeSBhZ2Fpbi4iLCJ1bmkuc2hvd0FjdGlvblNoZWV0LmNhbmNlbCI6IkNhbmNlbCIsInVuaS5zaG93VG9hc3QudW5wYWlyZWQiOiJQbGVhc2Ugbm90ZSBzaG93VG9hc3QgbXVzdCBiZSBwYWlyZWQgd2l0aCBoaWRlVG9hc3QiLCJ1bmkuc2hvd0xvYWRpbmcudW5wYWlyZWQiOiJQbGVhc2Ugbm90ZSBzaG93TG9hZGluZyBtdXN0IGJlIHBhaXJlZCB3aXRoIGhpZGVMb2FkaW5nIiwidW5pLnNob3dNb2RhbC5jYW5jZWwiOiJDYW5jZWwiLCJ1bmkuc2hvd01vZGFsLmNvbmZpcm0iOiJPSyIsInVuaS5jaG9vc2VJbWFnZS5jYW5jZWwiOiJDYW5jZWwiLCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5hbGJ1bSI6IkFsYnVtIiwidW5pLmNob29zZUltYWdlLnNvdXJjZVR5cGUuY2FtZXJhIjoiQ2FtZXJhIiwidW5pLmNob29zZVZpZGVvLmNhbmNlbCI6IkNhbmNlbCIsInVuaS5jaG9vc2VWaWRlby5zb3VyY2VUeXBlLmFsYnVtIjoiQWxidW0iLCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5jYW1lcmEiOiJDYW1lcmEiLCJ1bmkuY2hvb3NlRmlsZS5ub3RVc2VyQWN0aXZhdGlvbiI6IkZpbGUgY2hvb3NlciBkaWFsb2cgY2FuIG9ubHkgYmUgc2hvd24gd2l0aCBhIHVzZXIgYWN0aXZhdGlvbiIsInVuaS5wcmV2aWV3SW1hZ2UuY2FuY2VsIjoiQ2FuY2VsIiwidW5pLnByZXZpZXdJbWFnZS5idXR0b24uc2F2ZSI6IlNhdmUgSW1hZ2UiLCJ1bmkucHJldmlld0ltYWdlLnNhdmUuc3VjY2VzcyI6IlNhdmVkIHN1Y2Nlc3NmdWxseSIsInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5mYWlsIjoiU2F2ZSBmYWlsZWQiLCJ1bmkuc2V0Q2xpcGJvYXJkRGF0YS5zdWNjZXNzIjoiQ29udGVudCBjb3BpZWQiLCJ1bmkuc2NhbkNvZGUudGl0bGUiOiJTY2FuIGNvZGUiLCJ1bmkuc2NhbkNvZGUuYWxidW0iOiJBbGJ1bSIsInVuaS5zY2FuQ29kZS5mYWlsIjoiUmVjb2duaXRpb24gZmFpbHVyZSIsInVuaS5zY2FuQ29kZS5mbGFzaC5vbiI6IlRhcCB0byB0dXJuIGxpZ2h0IG9uIiwidW5pLnNjYW5Db2RlLmZsYXNoLm9mZiI6IlRhcCB0byB0dXJuIGxpZ2h0IG9mZiIsInVuaS5zdGFydFNvdGVyQXV0aGVudGljYXRpb24uYXV0aENvbnRlbnQiOiJGaW5nZXJwcmludCByZWNvZ25pdGlvbiIsInVuaS5waWNrZXIuZG9uZSI6IkRvbmUiLCJ1bmkucGlja2VyLmNhbmNlbCI6IkNhbmNlbCIsInVuaS52aWRlby5kYW5tdSI6IkRhbm11IiwidW5pLnZpZGVvLnZvbHVtZSI6IlZvbHVtZSIsInVuaS5idXR0b24uZmVlZGJhY2sudGl0bGUiOiJmZWVkYmFjayIsInVuaS5idXR0b24uZmVlZGJhY2suc2VuZCI6InNlbmQiLCJ1bmkuY2hvb3NlTG9jYXRpb24uc2VhcmNoIjoiRmluZCBQbGFjZSIsInVuaS5jaG9vc2VMb2NhdGlvbi5jYW5jZWwiOiJDYW5jZWwifSxlLmVzPXsidW5pLmFwcC5xdWl0IjoiUHVsc2Ugb3RyYSB2ZXogcGFyYSBzYWxpciIsInVuaS5hc3luYy5lcnJvciI6IlNlIGFnb3TDsyBlbCB0aWVtcG8gZGUgY29uZXhpw7NuLCBoYWdhIGNsaWMgZW4gbGEgcGFudGFsbGEgcGFyYSB2b2x2ZXIgYSBpbnRlbnRhcmxvLiIsInVuaS5zaG93QWN0aW9uU2hlZXQuY2FuY2VsIjoiQ2FuY2VsYXIiLCJ1bmkuc2hvd1RvYXN0LnVucGFpcmVkIjoiVGVuZ2EgZW4gY3VlbnRhIHF1ZSBzaG93VG9hc3QgZGViZSBlc3RhciBlbXBhcmVqYWRvIGNvbiBoaWRlVG9hc3QiLCJ1bmkuc2hvd0xvYWRpbmcudW5wYWlyZWQiOiJUZW5nYSBlbiBjdWVudGEgcXVlIHNob3dMb2FkaW5nIGRlYmUgZXN0YXIgZW1wYXJlamFkbyBjb24gaGlkZUxvYWRpbmciLCJ1bmkuc2hvd01vZGFsLmNhbmNlbCI6IkNhbmNlbGFyIiwidW5pLnNob3dNb2RhbC5jb25maXJtIjoiT0siLCJ1bmkuY2hvb3NlSW1hZ2UuY2FuY2VsIjoiQ2FuY2VsYXIiLCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5hbGJ1bSI6IsOBbGJ1bSIsInVuaS5jaG9vc2VJbWFnZS5zb3VyY2VUeXBlLmNhbWVyYSI6IkPDoW1hcmEiLCJ1bmkuY2hvb3NlVmlkZW8uY2FuY2VsIjoiQ2FuY2VsYXIiLCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5hbGJ1bSI6IsOBbGJ1bSIsInVuaS5jaG9vc2VWaWRlby5zb3VyY2VUeXBlLmNhbWVyYSI6IkPDoW1hcmEiLCJ1bmkuY2hvb3NlRmlsZS5ub3RVc2VyQWN0aXZhdGlvbiI6IkVsIGN1YWRybyBkZSBkacOhbG9nbyBkZWwgc2VsZWN0b3IgZGUgYXJjaGl2b3Mgc29sbyBzZSBwdWVkZSBtb3N0cmFyIGNvbiBsYSBhY3RpdmFjacOzbiBkZWwgdXN1YXJpbyIsInVuaS5wcmV2aWV3SW1hZ2UuY2FuY2VsIjoiQ2FuY2VsYXIiLCJ1bmkucHJldmlld0ltYWdlLmJ1dHRvbi5zYXZlIjoiR3VhcmRhciBpbWFnZW4iLCJ1bmkucHJldmlld0ltYWdlLnNhdmUuc3VjY2VzcyI6Ikd1YXJkYWRvIGV4aXRvc2FtZW50ZSIsInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5mYWlsIjoiRXJyb3IgYWwgZ3VhcmRhciIsInVuaS5zZXRDbGlwYm9hcmREYXRhLnN1Y2Nlc3MiOiJDb250ZW5pZG8gY29waWFkbyIsInVuaS5zY2FuQ29kZS50aXRsZSI6IkPDs2RpZ28gZGUgZXNjYW5lbyIsInVuaS5zY2FuQ29kZS5hbGJ1bSI6IsOBbGJ1bSIsInVuaS5zY2FuQ29kZS5mYWlsIjoiw4ljaGVjIGRlIGxhIHJlY29ubmFpc3NhbmNlIiwidW5pLnNjYW5Db2RlLmZsYXNoLm9uIjoiVG9xdWUgcGFyYSBlbmNlbmRlciBsYSBsdXoiLCJ1bmkuc2NhbkNvZGUuZmxhc2gub2ZmIjoiVG9xdWUgcGFyYSBhcGFnYXIgbGEgbHV6IiwidW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi5hdXRoQ29udGVudCI6IlJlY29ub2NpbWllbnRvIGRlIGh1ZWxsYXMgZGFjdGlsYXJlcyIsInVuaS5waWNrZXIuZG9uZSI6Ik9LIiwidW5pLnBpY2tlci5jYW5jZWwiOiJDYW5jZWxhciIsInVuaS52aWRlby5kYW5tdSI6IkRhbm11IiwidW5pLnZpZGVvLnZvbHVtZSI6IlZvbHVtZW4iLCJ1bmkuYnV0dG9uLmZlZWRiYWNrLnRpdGxlIjoicmVhbGltZW50YWNpw7NuIiwidW5pLmJ1dHRvbi5mZWVkYmFjay5zZW5kIjoiZW52aWFyIiwidW5pLmNob29zZUxvY2F0aW9uLnNlYXJjaCI6IkVuY29udHJhciIsInVuaS5jaG9vc2VMb2NhdGlvbi5jYW5jZWwiOiJDYW5jZWxhciJ9LGUuZnI9eyJ1bmkuYXBwLnF1aXQiOiJBcHB1eWV6IMOgIG5vdXZlYXUgcG91ciBxdWl0dGVyIGwnYXBwbGljYXRpb24iLCJ1bmkuYXN5bmMuZXJyb3IiOiJMYSBjb25uZXhpb24gYSBleHBpcsOpLCBjbGlxdWV6IHN1ciBsJ8OpY3JhbiBwb3VyIHLDqWVzc2F5ZXIuIiwidW5pLnNob3dBY3Rpb25TaGVldC5jYW5jZWwiOiJBbm51bGVyIiwidW5pLnNob3dUb2FzdC51bnBhaXJlZCI6IlZldWlsbGV6IG5vdGVyIHF1ZSBzaG93VG9hc3QgZG9pdCDDqnRyZSBhc3NvY2nDqSDDoCBoaWRlVG9hc3QiLCJ1bmkuc2hvd0xvYWRpbmcudW5wYWlyZWQiOiJWZXVpbGxleiBub3RlciBxdWUgc2hvd0xvYWRpbmcgZG9pdCDDqnRyZSBhc3NvY2nDqSDDoCBoaWRlTG9hZGluZyIsInVuaS5zaG93TW9kYWwuY2FuY2VsIjoiQW5udWxlciIsInVuaS5zaG93TW9kYWwuY29uZmlybSI6Ik9LIiwidW5pLmNob29zZUltYWdlLmNhbmNlbCI6IkFubnVsZXIiLCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5hbGJ1bSI6IkFsYnVtIiwidW5pLmNob29zZUltYWdlLnNvdXJjZVR5cGUuY2FtZXJhIjoiQ2Ftw6lyYSIsInVuaS5jaG9vc2VWaWRlby5jYW5jZWwiOiJBbm51bGVyIiwidW5pLmNob29zZVZpZGVvLnNvdXJjZVR5cGUuYWxidW0iOiJBbGJ1bSIsInVuaS5jaG9vc2VWaWRlby5zb3VyY2VUeXBlLmNhbWVyYSI6IkNhbcOpcmEiLCJ1bmkuY2hvb3NlRmlsZS5ub3RVc2VyQWN0aXZhdGlvbiI6IkxhIGJvw650ZSBkZSBkaWFsb2d1ZSBkdSBzw6lsZWN0ZXVyIGRlIGZpY2hpZXIgbmUgcGV1dCDDqnRyZSBhZmZpY2jDqWUgcXUnYXZlYyB1bmUgYWN0aXZhdGlvbiBwYXIgbCd1dGlsaXNhdGV1ciIsInVuaS5wcmV2aWV3SW1hZ2UuY2FuY2VsIjoiQW5udWxlciIsInVuaS5wcmV2aWV3SW1hZ2UuYnV0dG9uLnNhdmUiOiJHdWFyZGFyIGltYWdlbiIsInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5zdWNjZXNzIjoiRW5yZWdpc3Ryw6kgYXZlYyBzdWNjw6hzIiwidW5pLnByZXZpZXdJbWFnZS5zYXZlLmZhaWwiOiLDiWNoZWMgZGUgbGEgc2F1dmVnYXJkZSIsInVuaS5zZXRDbGlwYm9hcmREYXRhLnN1Y2Nlc3MiOiJDb250ZW51IGNvcGnDqSIsInVuaS5zY2FuQ29kZS50aXRsZSI6IkNvZGUgZOKAmWFuYWx5c2UiLCJ1bmkuc2NhbkNvZGUuYWxidW0iOiJBbGJ1bSIsInVuaS5zY2FuQ29kZS5mYWlsIjoiRmFsbG8gZGUgcmVjb25vY2ltaWVudG8iLCJ1bmkuc2NhbkNvZGUuZmxhc2gub24iOiJBcHB1eWV6IHBvdXIgYWN0aXZlciBsJ8OpY2xhaXJhZ2UiLCJ1bmkuc2NhbkNvZGUuZmxhc2gub2ZmIjoiQXBwdXlleiBwb3VyIGTDqXNhY3RpdmVyIGwnw6ljbGFpcmFnZSIsInVuaS5zdGFydFNvdGVyQXV0aGVudGljYXRpb24uYXV0aENvbnRlbnQiOiJSZWNvbm5haXNzYW5jZSBkZSBsJ2VtcHJlaW50ZSBkaWdpdGFsZSIsInVuaS5waWNrZXIuZG9uZSI6Ik9LIiwidW5pLnBpY2tlci5jYW5jZWwiOiJBbm51bGVyIiwidW5pLnZpZGVvLmRhbm11IjoiRGFubXUiLCJ1bmkudmlkZW8udm9sdW1lIjoiTGUgVm9sdW1lIiwidW5pLmJ1dHRvbi5mZWVkYmFjay50aXRsZSI6InJldG91ciBkJ2luZm9ybWF0aW9uIiwidW5pLmJ1dHRvbi5mZWVkYmFjay5zZW5kIjoiZW52b3llciIsInVuaS5jaG9vc2VMb2NhdGlvbi5zZWFyY2giOiJUcm91dmUiLCJ1bmkuY2hvb3NlTG9jYXRpb24uY2FuY2VsIjoiQW5udWxlciJ9LGVbInpoLUhhbnMiXT17InVuaS5hcHAucXVpdCI6IuWGjeaMieS4gOasoemAgOWHuuW6lOeUqCIsInVuaS5hc3luYy5lcnJvciI6Iui/nuaOpeacjeWKoeWZqOi2heaXtu+8jOeCueWHu+Wxj+W5lemHjeivlSIsInVuaS5zaG93QWN0aW9uU2hlZXQuY2FuY2VsIjoi5Y+W5raIIiwidW5pLnNob3dUb2FzdC51bnBhaXJlZCI6Iuivt+azqOaEjyBzaG93VG9hc3Qg5LiOIGhpZGVUb2FzdCDlv4XpobvphY3lr7nkvb/nlKgiLCJ1bmkuc2hvd0xvYWRpbmcudW5wYWlyZWQiOiLor7fms6jmhI8gc2hvd0xvYWRpbmcg5LiOIGhpZGVMb2FkaW5nIOW/hemhu+mFjeWvueS9v+eUqCIsInVuaS5zaG93TW9kYWwuY2FuY2VsIjoi5Y+W5raIIiwidW5pLnNob3dNb2RhbC5jb25maXJtIjoi56Gu5a6aIiwidW5pLmNob29zZUltYWdlLmNhbmNlbCI6IuWPlua2iCIsInVuaS5jaG9vc2VJbWFnZS5zb3VyY2VUeXBlLmFsYnVtIjoi5LuO55u45YaM6YCJ5oupIiwidW5pLmNob29zZUltYWdlLnNvdXJjZVR5cGUuY2FtZXJhIjoi5ouN5pGEIiwidW5pLmNob29zZVZpZGVvLmNhbmNlbCI6IuWPlua2iCIsInVuaS5jaG9vc2VWaWRlby5zb3VyY2VUeXBlLmFsYnVtIjoi5LuO55u45YaM6YCJ5oupIiwidW5pLmNob29zZVZpZGVvLnNvdXJjZVR5cGUuY2FtZXJhIjoi5ouN5pGEIiwidW5pLmNob29zZUZpbGUubm90VXNlckFjdGl2YXRpb24iOiLmlofku7bpgInmi6nlmajlr7nor53moYblj6rog73lnKjnlLHnlKjmiLfmv4DmtLvml7bmmL7npLoiLCJ1bmkucHJldmlld0ltYWdlLmNhbmNlbCI6IuWPlua2iCIsInVuaS5wcmV2aWV3SW1hZ2UuYnV0dG9uLnNhdmUiOiLkv53lrZjlm77lg48iLCJ1bmkucHJldmlld0ltYWdlLnNhdmUuc3VjY2VzcyI6IuS/neWtmOWbvuWDj+WIsOebuOWGjOaIkOWKnyIsInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5mYWlsIjoi5L+d5a2Y5Zu+5YOP5Yiw55u45YaM5aSx6LSlIiwidW5pLnNldENsaXBib2FyZERhdGEuc3VjY2VzcyI6IuWGheWuueW3suWkjeWItiIsInVuaS5zY2FuQ29kZS50aXRsZSI6IuaJq+eggSIsInVuaS5zY2FuQ29kZS5hbGJ1bSI6IuebuOWGjCIsInVuaS5zY2FuQ29kZS5mYWlsIjoi6K+G5Yir5aSx6LSlIiwidW5pLnNjYW5Db2RlLmZsYXNoLm9uIjoi6L276Kem54Wn5LquIiwidW5pLnNjYW5Db2RlLmZsYXNoLm9mZiI6Iui9u+inpuWFs+mXrSIsInVuaS5zdGFydFNvdGVyQXV0aGVudGljYXRpb24uYXV0aENvbnRlbnQiOiLmjIfnurnor4bliKvkuK0uLi4iLCJ1bmkucGlja2VyLmRvbmUiOiLlrozmiJAiLCJ1bmkucGlja2VyLmNhbmNlbCI6IuWPlua2iCIsInVuaS52aWRlby5kYW5tdSI6IuW8ueW5lSIsInVuaS52aWRlby52b2x1bWUiOiLpn7Pph48iLCJ1bmkuYnV0dG9uLmZlZWRiYWNrLnRpdGxlIjoi6Zeu6aKY5Y+N6aaIIiwidW5pLmJ1dHRvbi5mZWVkYmFjay5zZW5kIjoi5Y+R6YCBIiwidW5pLmNob29zZUxvY2F0aW9uLnNlYXJjaCI6IuaQnOe0ouWcsOeCuSIsInVuaS5jaG9vc2VMb2NhdGlvbi5jYW5jZWwiOiLlj5bmtogifSxlWyJ6aC1IYW50Il09eyJ1bmkuYXBwLnF1aXQiOiLlho3mjInkuIDmrKHpgIDlh7rmh4nnlKgiLCJ1bmkuYXN5bmMuZXJyb3IiOiLpgKPmjqXmnI3li5nlmajotoXmmYLvvIzpu57mk4rlsY/luZXph43oqaYiLCJ1bmkuc2hvd0FjdGlvblNoZWV0LmNhbmNlbCI6IuWPlua2iCIsInVuaS5zaG93VG9hc3QudW5wYWlyZWQiOiLoq4vms6jmhI8gc2hvd1RvYXN0IOiIhyBoaWRlVG9hc3Qg5b+F6aCI6YWN5bCN5L2/55SoIiwidW5pLnNob3dMb2FkaW5nLnVucGFpcmVkIjoi6KuL5rOo5oSPIHNob3dMb2FkaW5nIOiIhyBoaWRlTG9hZGluZyDlv4XpoIjphY3lsI3kvb/nlKgiLCJ1bmkuc2hvd01vZGFsLmNhbmNlbCI6IuWPlua2iCIsInVuaS5zaG93TW9kYWwuY29uZmlybSI6IueiuuWumiIsInVuaS5jaG9vc2VJbWFnZS5jYW5jZWwiOiLlj5bmtogiLCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5hbGJ1bSI6IuW+nuebuOWGiumBuOaThyIsInVuaS5jaG9vc2VJbWFnZS5zb3VyY2VUeXBlLmNhbWVyYSI6IuaLjeaUnSIsInVuaS5jaG9vc2VWaWRlby5jYW5jZWwiOiLlj5bmtogiLCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5hbGJ1bSI6IuW+nuebuOWGiumBuOaThyIsInVuaS5jaG9vc2VWaWRlby5zb3VyY2VUeXBlLmNhbWVyYSI6IuaLjeaUnSIsInVuaS5jaG9vc2VGaWxlLm5vdFVzZXJBY3RpdmF0aW9uIjoi5paH5Lu26YG45pOH5Zmo5bCN6Kmx5qGG5Y+q6IO95Zyo55Sx55So5oi25r+A5rS75pmC6aGv56S6IiwidW5pLnByZXZpZXdJbWFnZS5jYW5jZWwiOiLlj5bmtogiLCJ1bmkucHJldmlld0ltYWdlLmJ1dHRvbi5zYXZlIjoi5L+d5a2Y5ZyW5YOPIiwidW5pLnByZXZpZXdJbWFnZS5zYXZlLnN1Y2Nlc3MiOiLkv53lrZjlnJblg4/liLDnm7jlhormiJDlip8iLCJ1bmkucHJldmlld0ltYWdlLnNhdmUuZmFpbCI6IuS/neWtmOWcluWDj+WIsOebuOWGiuWkseaVlyIsInVuaS5zZXRDbGlwYm9hcmREYXRhLnN1Y2Nlc3MiOiLlhaflrrnlt7LlvqnliLYiLCJ1bmkuc2NhbkNvZGUudGl0bGUiOiLmjoPnorwiLCJ1bmkuc2NhbkNvZGUuYWxidW0iOiLnm7jlhooiLCJ1bmkuc2NhbkNvZGUuZmFpbCI6IuitmOWIpeWkseaVlyIsInVuaS5zY2FuQ29kZS5mbGFzaC5vbiI6Iui8leinuOeFp+S6riIsInVuaS5zY2FuQ29kZS5mbGFzaC5vZmYiOiLovJXop7jpl5zplokiLCJ1bmkuc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uLmF1dGhDb250ZW50Ijoi5oyH57SL6K2Y5Yil5LitLi4uIiwidW5pLnBpY2tlci5kb25lIjoi5a6M5oiQIiwidW5pLnBpY2tlci5jYW5jZWwiOiLlj5bmtogiLCJ1bmkudmlkZW8uZGFubXUiOiLlvYjluZUiLCJ1bmkudmlkZW8udm9sdW1lIjoi6Z+z6YePIiwidW5pLmJ1dHRvbi5mZWVkYmFjay50aXRsZSI6IuWVj+mhjOWPjemliyIsInVuaS5idXR0b24uZmVlZGJhY2suc2VuZCI6IueZvOmAgSIsInVuaS5jaG9vc2VMb2NhdGlvbi5zZWFyY2giOiLmkJzntKLlnLDpu54iLCJ1bmkuY2hvb3NlTG9jYXRpb24uY2FuY2VsIjoi5Y+W5raIIn0sZSkpLFhlPSJvYmplY3QiPT10eXBlb2YgeHY/eHYucmVxdWlyZU1vZHVsZSgicGx1cyIpLmdldExhbmd1YWdlKCk6IiIsZnVuY3Rpb24oKXtpZihpdCgpKXt2YXIgZT1PYmplY3Qua2V5cygkdi5sb2NhbGVzKTtlLmxlbmd0aCYmZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PUtlW2VdLG49JHYubG9jYWxlc1tlXTt0P09iamVjdC5hc3NpZ24odCxuKTpLZVtlXT1ufSl9fSgpO3ZhciBaZT1mdW5jdGlvbihlLHQsbixyKXt2YXIgaTt2b2lkIDA9PT10JiYodD17fSksInN0cmluZyIhPXR5cGVvZiBlJiYoZT0oaT1bdCxlXSlbMF0sdD1pWzFdKSwic3RyaW5nIiE9dHlwZW9mIGUmJihlPXZvaWQgMCE9PU12JiZNdi5nZXRMb2NhbGU/TXYuZ2V0TG9jYWxlKCk6dm9pZCAwIT09Z2xvYmFsJiZnbG9iYWwuZ2V0TG9jYWxlP2dsb2JhbC5nZXRMb2NhbGUoKTp6ZSksInN0cmluZyIhPXR5cGVvZiBuJiYobj12b2lkIDAhPT0kdiYmJHYuZmFsbGJhY2tMb2NhbGV8fHplKTt2YXIgYT1uZXcgSGUoe2xvY2FsZTplLGZhbGxiYWNrTG9jYWxlOm4sbWVzc2FnZXM6dCx3YXRjaGVyOnJ9KSxzPWZ1bmN0aW9uKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGp2KXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYS50KGUsdCl9O2Vsc2V7dmFyIG89ITE7cz1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaT1qdigpLiR2bTtyZXR1cm4gaSYmKGkuJGxvY2FsZSxvfHwobz0hMCxyPWEsKG49aSkuJHdhdGNoTG9jYWxlP24uJHdhdGNoTG9jYWxlKGZ1bmN0aW9uKGUpe3Iuc2V0TG9jYWxlKGUpfSk6bi4kd2F0Y2goZnVuY3Rpb24oKXtyZXR1cm4gbi4kbG9jYWxlfSxmdW5jdGlvbihlKXtyLnNldExvY2FsZShlKX0pKSksYS50KGUsdCl9fXJldHVybiBzKGUsdCl9O3JldHVybntpMThuOmEsZjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGEuZihlLHQsbil9LHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcyhlLHQpfSxhZGQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj0hMCksYS5hZGQoZSx0LG4pfSx3YXRjaDpmdW5jdGlvbihlKXtyZXR1cm4gYS53YXRjaExvY2FsZShlKX0sZ2V0TG9jYWxlOmZ1bmN0aW9uKCl7cmV0dXJuIGEuZ2V0TG9jYWxlKCl9LHNldExvY2FsZTpmdW5jdGlvbihlKXtyZXR1cm4gYS5zZXRMb2NhbGUoZSl9fX0oWGUsS2UpLFFlPVplLnQsZXQ9KFplLm1peGluPXtiZWZvcmVDcmVhdGU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9WmUuaTE4bi53YXRjaExvY2FsZShmdW5jdGlvbigpe2UuJGZvcmNlVXBkYXRlKCl9KTt0aGlzLiRvbmNlKCJob29rOmJlZm9yZURlc3Ryb3kiLGZ1bmN0aW9uKCl7dCgpfSl9LG1ldGhvZHM6eyQkdDpmdW5jdGlvbihlLHQpe3JldHVybiBRZShlLHQpfX19LFplLmdldExvY2FsZSk7dmFyIHR0PVsiJSIsIiUiXTtmdW5jdGlvbiBudChlKXtyZXR1cm4gR2UoZSx0dCk/WmUuZihlLCh0PU12LmdldExvY2FsZSgpLChuPSR2LmxvY2FsZXMpW3RdfHxuWyR2LmZhbGxiYWNrTG9jYWxlXXx8bltKZV18fHt9KSx0dCk6ZTt2YXIgdCxufWZ1bmN0aW9uIHJ0KHQsZSl7cmV0dXJuIGUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuPWZ1bmN0aW9uIGUodCxuKXtpZigxIT09bi5sZW5ndGgpe3ZhciByPW4uc2hpZnQoKTtyZXR1cm4gZSh0JiZ0W3JdLG4pfWlmKHQpe3ZhciBpPXRbblswXV07aWYoInN0cmluZyI9PXR5cGVvZiBpJiZHZShpLHR0KSlyZXR1cm4gdH19KGUsdCk7aWYoIW4pcmV0dXJuITE7dmFyIHI9dFt0Lmxlbmd0aC0xXSxpPW5bcl07cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLHIse2dldDpmdW5jdGlvbigpe3JldHVybiBudChpKX0sc2V0OmZ1bmN0aW9uKGUpe2k9ZX19KSwhMH0odCxlKX0pfWZ1bmN0aW9uIGl0KCl7cmV0dXJuIHZvaWQgMCE9PSR2JiYkdi5sb2NhbGVzJiYhIU9iamVjdC5rZXlzKCR2LmxvY2FsZXMpLmxlbmd0aH12YXIgb3Q9e2RhdGE6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxzaG93VG9hc3Q6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiEwfSxiZWZvcmVTdWNjZXNzOmZ1bmN0aW9uKGUsdCl7aWYodC5zaG93VG9hc3Qpe3ZhciBuPVFlKCJ1bmkuc2V0Q2xpcGJvYXJkRGF0YS5zdWNjZXNzIik7biYmTXYuc2hvd1RvYXN0KHt0aXRsZTpuLGljb246InN1Y2Nlc3MiLG1hc2s6ITEsc3R5bGU6e3dpZHRoOnZvaWQgMH19KX19fSxhdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxzZXRDbGlwYm9hcmREYXRhOm90fSk7ZnVuY3Rpb24gc3QoZSx0KXtpZih0KXtpZigwPT09dC5pbmRleE9mKCIvIikpcmV0dXJuIHR9ZWxzZXtpZigwPT09KHQ9ZSkuaW5kZXhPZigiLyIpKXJldHVybiB0O3ZhciBuPUx2KCk7ZT1uLmxlbmd0aD9uW24ubGVuZ3RoLTFdLiRwYWdlLnJvdXRlOiIifWlmKDA9PT10LmluZGV4T2YoIi4vIikpcmV0dXJuIHN0KGUsdC5zdWJzdHIoMikpO2Zvcih2YXIgcj10LnNwbGl0KCIvIiksaT1yLmxlbmd0aCxvPTA7bzxpJiYiLi4iPT09cltvXTtvKyspO3Iuc3BsaWNlKDAsbyksdD1yLmpvaW4oIi8iKTt2YXIgYT0wPGUubGVuZ3RoP2Uuc3BsaXQoIi8iKTpbXTtyZXR1cm4gYS5zcGxpY2UoYS5sZW5ndGgtby0xLG8rMSksIi8iK2EuY29uY2F0KHIpLmpvaW4oIi8iKX12YXIgY3QsdXQ9L14oW2Etei1dKzopP1wvXC8vaSxsdD0vXmRhdGE6LiosLiovO2Z1bmN0aW9uIGR0KGUpe3JldHVybiBDdi5pby5jb252ZXJ0TG9jYWxGaWxlU3lzdGVtVVJMKGUpLnJlcGxhY2UoL15cLz9hcHBzXC8vLCIvYW5kcm9pZF9hc3NldC9hcHBzLyIpLnJlcGxhY2UoL1wvJC8sIiIpfWZ1bmN0aW9uIGZ0KGUpe3JldHVybiBjdHx8KGN0PSJmaWxlOi8vIitkdCgiX3d3dyIpKyIvIiksY3QrZX1mdW5jdGlvbiBwdChlKXtpZigwPT09ZS5pbmRleE9mKCIvIikpcmV0dXJuIDA9PT1lLmluZGV4T2YoIi8vIik/Imh0dHBzOiIrZTplLnN0YXJ0c1dpdGgoIi9zdG9yYWdlLyIpfHxlLnN0YXJ0c1dpdGgoIi9zZGNhcmQvIil8fGUuaW5jbHVkZXMoIi9Db250YWluZXJzL0RhdGEvQXBwbGljYXRpb24vIik/ImZpbGU6Ly8iK2U6ZnQoZS5zdWJzdHIoMSkpO2lmKHV0LnRlc3QoZSl8fGx0LnRlc3QoZSl8fDA9PT1lLmluZGV4T2YoImJsb2I6IikpcmV0dXJuIGU7aWYoMD09PWUuaW5kZXhPZigiX3d3dyIpfHwwPT09ZS5pbmRleE9mKCJfZG8iKSlyZXR1cm4iZmlsZTovLyIrZHQoZSk7dmFyIHQ9THYoKTtyZXR1cm4gdC5sZW5ndGg/ZnQoc3QodFt0Lmxlbmd0aC0xXS4kcGFnZS5yb3V0ZSxlKS5zdWJzdHIoMSkpOmV9dmFyIGh0PXt0ZW1wRmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QudGVtcEZpbGVQYXRoPXB0KGUpfX19LHZ0PVsibWQ1Iiwic2hhMSJdLGd0PXtmaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5maWxlUGF0aD1wdChlKX19LGRpZ2VzdEFsZ29yaXRobTp7dHlwZTpTdHJpbmcsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5kaWdlc3RBbGdvcml0aG09dnQuaW5jbHVkZXMoZSk/ZTp2dFswXX0sZGVmYXVsdDp2dFswXX19LG10PXtmaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5maWxlUGF0aD1wdChlKX19fSx5dD17ZmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuZmlsZVBhdGg9cHQoZSl9fX0sX3Q9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsc2F2ZUZpbGU6aHQsZ2V0RmlsZUluZm86Z3QsZ2V0U2F2ZWRGaWxlSW5mbzptdCxyZW1vdmVTYXZlZEZpbGU6eXR9KSxidD17ZmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxmaWxlVHlwZTp7dHlwZTpTdHJpbmd9fSx3dD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvcGVuRG9jdW1lbnQ6YnR9KSxrdD17a2V5d29yZDp7dHlwZTpTdHJpbmd9fSxTdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjaG9vc2VMb2NhdGlvbjprdH0pLHh0PVsid2dzODQiLCJnY2owMiJdLEN0PXt0eXBlOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPShlfHwiIikudG9Mb3dlckNhc2UoKSx0LnR5cGU9eHQuaW5kZXhPZihlKTwwP3h0WzBdOmV9fSxhbHRpdHVkZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9fSxUdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxnZXRMb2NhdGlvbjpDdH0pLE90PXtsYXRpdHVkZTp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITB9LGxvbmdpdHVkZTp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITB9LHNjYWxlOnt0eXBlOk51bWJlcix2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPU1hdGguZmxvb3IoZSksdC5zY2FsZT01PD1lJiZlPD0xOD9lOjE4fSxkZWZhdWx0OjE4fSxuYW1lOnt0eXBlOlN0cmluZ30sYWRkcmVzczp7dHlwZTpTdHJpbmd9fSxFdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvcGVuTG9jYXRpb246T3R9KSxBdD1bImFsbCIsImltYWdlIiwidmlkZW8iXSxJdD1bImFsYnVtIiwiY2FtZXJhIl0sJHQ9e2NvdW50Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMSxkZWZhdWx0OjEwMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPD0wJiYodC5jb3VudD0xMDApfX0sc291cmNlVHlwZTp7dHlwZTpBcnJheSxyZXF1aXJlZDohMSxkZWZhdWx0Okl0LHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9ZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIEl0LmluY2x1ZGVzKGUpfSksdC5zb3VyY2VUeXBlPWUubGVuZ3RoP2U6SXR9fSx0eXBlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMSxkZWZhdWx0OiJhbGwiLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe0F0LmluY2x1ZGVzKGUpfHwodC50eXBlPUF0WzBdKSx0LnR5cGU9ImFsbCI9PT10LnR5cGU/dC50eXBlPSIqIjp0LnR5cGV9fSxleHRlbnNpb246e3R5cGU6QXJyYXksZGVmYXVsdDpbIiJdLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4icGFyYW0gZXh0ZW5zaW9uIHNob3VsZCBub3QgYmUgZW1wdHkuIn19fSxQdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjaG9vc2VGaWxlOiR0fSksTXQ9WyJvcmlnaW5hbCIsImNvbXByZXNzZWQiXSxqdD1bImFsYnVtIiwiY2FtZXJhIl0sTHQ9e2NvdW50Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMSxkZWZhdWx0OjksdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZTw9MCYmKHQuY291bnQ9OSl9fSxzaXplVHlwZTp7dHlwZTpbQXJyYXksU3RyaW5nXSxyZXF1aXJlZDohMSxkZWZhdWx0Ok10LHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9KGU9InN0cmluZyI9PXR5cGVvZiBlP1tlXTplKS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIE10LmluY2x1ZGVzKGUpfSksdC5zaXplVHlwZT1lLmxlbmd0aD9lOk10fX0sc291cmNlVHlwZTp7dHlwZTpBcnJheSxyZXF1aXJlZDohMSxkZWZhdWx0Omp0LHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9ZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGp0LmluY2x1ZGVzKGUpfSksdC5zb3VyY2VUeXBlPWUubGVuZ3RoP2U6anR9fSxleHRlbnNpb246e3R5cGU6QXJyYXksZGVmYXVsdDpbIioiXSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuInBhcmFtIGV4dGVuc2lvbiBzaG91bGQgbm90IGJlIGVtcHR5LiJ9fX0sTnQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY2hvb3NlSW1hZ2U6THR9KSxCdD1bImFsYnVtIiwiY2FtZXJhIl0sRHQ9e3NvdXJjZVR5cGU6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITEsZGVmYXVsdDpCdCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPWUuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBCdC5pbmNsdWRlcyhlKX0pLHQuc291cmNlVHlwZT1lLmxlbmd0aD9lOkJ0fX0sY29tcHJlc3NlZDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITB9LG1heER1cmF0aW9uOnt0eXBlOk51bWJlcixkZWZhdWx0OjYwfSxjYW1lcmE6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6ImJhY2sifSxleHRlbnNpb246e3R5cGU6QXJyYXksZGVmYXVsdDpbIioiXSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuInBhcmFtIGV4dGVuc2lvbiBzaG91bGQgbm90IGJlIGVtcHR5LiJ9fX0sUnQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY2hvb3NlVmlkZW86RHR9KSxGdD17c3JjOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LnNyYz1wdChlKX19fSx6dD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjb21wcmVzc0ltYWdlOkZ0fSksVnQ9e3NyYzp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5zcmM9cHQoZSl9fSxxdWFsaXR5Ont0eXBlOlN0cmluZ30sYml0cmF0ZTp7dHlwZTpOdW1iZXJ9LGZwczp7dHlwZTpOdW1iZXJ9LHJlc29sdXRpb246e3R5cGU6TnVtYmVyfX0sVXQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY29tcHJlc3NWaWRlbzpWdH0pLHF0PXtzcmM6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3Quc3JjPXB0KGUpfX19LFd0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldEltYWdlSW5mbzpxdH0pLEh0PXtzcmM6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3Quc3JjPXB0KGUpfX19LEd0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldFZpZGVvSW5mbzpIdH0pLFh0PXt1cmxzOnt0eXBlOkFycmF5LHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3ZhciBuO2lmKHQudXJscz1lLm1hcChmdW5jdGlvbihlKXtpZigic3RyaW5nIj09dHlwZW9mIGUpcmV0dXJuIHB0KGUpO249ITB9KSxuKXJldHVybiJ1cmwgaXMgbm90IHN0cmluZyJ9fSxjdXJyZW50Ont0eXBlOltTdHJpbmcsTnVtYmVyXSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXsibnVtYmVyIj09dHlwZW9mIGU/dC5jdXJyZW50PTA8ZSYmZTx0LnVybHMubGVuZ3RoP2U6MDoic3RyaW5nIj09dHlwZW9mIGUmJmUmJih0LmN1cnJlbnQ9cHQoZSkpfSxkZWZhdWx0OjB9fSxZdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxwcmV2aWV3SW1hZ2U6WHR9KSxKdD17ZmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuZmlsZVBhdGg9cHQoZSl9fX0sS3Q9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsc2F2ZUltYWdlVG9QaG90b3NBbGJ1bTpKdH0pLFp0PXt1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxoZWFkZXI6e3R5cGU6T2JqZWN0LHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuaGVhZGVyPWV8fHt9fX19LFF0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGRvd25sb2FkRmlsZTpadH0pLGVuPXtPUFRJT05TOiJPUFRJT05TIixHRVQ6IkdFVCIsSEVBRDoiSEVBRCIsUE9TVDoiUE9TVCIsUFVUOiJQVVQiLERFTEVURToiREVMRVRFIixUUkFDRToiVFJBQ0UiLENPTk5FQ1Q6IkNPTk5FQ1QiLFBBVENIOiJQQVRDSCJ9LHRuPSJqc29uIixubj17VEVYVDoidGV4dCIsQVJSQVlCVUZGRVI6ImFycmF5YnVmZmVyIn0scm49ZW5jb2RlVVJJQ29tcG9uZW50O3ZhciBvbixhbj17bWV0aG9kOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPShlfHwiIikudG9VcHBlckNhc2UoKSx0Lm1ldGhvZD1PYmplY3QudmFsdWVzKGVuKS5pbmRleE9mKGUpPDA/ZW4uR0VUOmV9fSxkYXRhOnt0eXBlOltPYmplY3QsU3RyaW5nLEFycmF5LEFycmF5QnVmZmVyXSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmRhdGE9ZXx8IiJ9fSx1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QubWV0aG9kPT09ZW4uR0VUJiZUKHQuZGF0YSkmJk9iamVjdC5rZXlzKHQuZGF0YSkubGVuZ3RoJiYodC51cmw9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnNwbGl0KCIjIikscj1uWzFdfHwiIixpPShuPW5bMF0uc3BsaXQoIj8iKSlbMV18fCIiO2U9blswXTt2YXIgbz1pLnNwbGl0KCImIikuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlfSk7Zm9yKHZhciBhIGluIGk9e30sby5mb3JFYWNoKGZ1bmN0aW9uKGUpe2U9ZS5zcGxpdCgiPSIpLGlbZVswXV09ZVsxXX0pLHQpaWYoayh0LGEpKXt2YXIgcz10W2FdO251bGw9PXM/cz0iIjpUKHMpJiYocz1KU09OLnN0cmluZ2lmeShzKSksaVtybihhKV09cm4ocyl9cmV0dXJuIGUrKChpPU9iamVjdC5rZXlzKGkpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZSsiPSIraVtlXX0pLmpvaW4oIiYiKSk/Ij8iK2k6IiIpKyhyPyIjIityOiIiKX0oZSx0LmRhdGEpKX19LGhlYWRlcjp7dHlwZTpPYmplY3QsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5oZWFkZXI9ZXx8e307dC5tZXRob2QhPT1lbi5HRVQmJihPYmplY3Qua2V5cyhuKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiJjb250ZW50LXR5cGUiPT09ZS50b0xvd2VyQ2FzZSgpfSl8fChuWyJDb250ZW50LVR5cGUiXT0iYXBwbGljYXRpb24vanNvbiIpKX19LGRhdGFUeXBlOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmRhdGFUeXBlPShlfHx0bikudG9Mb3dlckNhc2UoKX19LHJlc3BvbnNlVHlwZTp7dHlwZTpTdHJpbmcsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZT0oZXx8IiIpLnRvTG93ZXJDYXNlKCksdC5yZXNwb25zZVR5cGU9T2JqZWN0LnZhbHVlcyhubikuaW5kZXhPZihlKTwwP25uLlRFWFQ6ZX19LHdpdGhDcmVkZW50aWFsczp7dHlwZTpCb29sZWFufSx0aW1lb3V0Ont0eXBlOk51bWJlcn19LHNuPXtjZXJ0aWZpY2F0ZXM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUpe2lmKGUuc29tZShmdW5jdGlvbihlKXtyZXR1cm4iU3RyaW5nIiE9PWYoZS5ob3N0KX0pKXJldHVybiLlj4LmlbDphY3nva7plJnor6/vvIzor7fnoa7orqTlkI7ph43or5UifX19LGNuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHJlcXVlc3Q6YW4sY29uZmlnTVRMUzpzbn0pLHVuPXtPUFRJT05TOiJPUFRJT05TIixHRVQ6IkdFVCIsSEVBRDoiSEVBRCIsUE9TVDoiUE9TVCIsUFVUOiJQVVQiLERFTEVURToiREVMRVRFIixUUkFDRToiVFJBQ0UiLENPTk5FQ1Q6IkNPTk5FQ1QifSxsbj17dXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0saGVhZGVyOnt0eXBlOk9iamVjdCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmhlYWRlcj1lfHx7fX19LG1ldGhvZDp7dHlwZTpTdHJpbmcsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZT0oZXx8IiIpLnRvVXBwZXJDYXNlKCksdC5tZXRob2Q9T2JqZWN0LnZhbHVlcyh1bikuaW5kZXhPZihlKTwwP3VuLkdFVDplfX0scHJvdG9jb2xzOnt0eXBlOltBcnJheSxTdHJpbmddLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpeyJzdHJpbmciPT10eXBlb2YgZSYmKGU9W2VdKSx0LnByb3RvY29scz0oZXx8W10pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV9KX19fSxkbj17ZGF0YTp7dHlwZTpbU3RyaW5nLEFycmF5QnVmZmVyXX19LGZuPXtjb2RlOnt0eXBlOk51bWJlcn0scmVhc29uOnt0eXBlOlN0cmluZ319LHBuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNvbm5lY3RTb2NrZXQ6bG4sc2VuZFNvY2tldE1lc3NhZ2U6ZG4sY2xvc2VTb2NrZXQ6Zm59KSxobj17dXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZmlsZXM6e3R5cGU6QXJyYXl9LGZpbGVQYXRoOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlJiYodC5maWxlUGF0aD1wdChlKSl9fSxuYW1lOnt0eXBlOlN0cmluZ30saGVhZGVyOnt0eXBlOk9iamVjdCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmhlYWRlcj1lfHx7fX19LGZvcm1EYXRhOnt0eXBlOk9iamVjdCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmZvcm1EYXRhPWV8fHt9fX19LHZuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHVwbG9hZEZpbGU6aG59KSxnbj17T0FVVEg6Ik9BVVRIIixTSEFSRToiU0hBUkUiLFBBWU1FTlQ6IlBBWU1FTlQiLFBVU0g6IlBVU0gifSxtbj17c2VydmljZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7aWYoKGU9KGV8fCIiKS50b1VwcGVyQ2FzZSgpKSYmT2JqZWN0LnZhbHVlcyhnbikuaW5kZXhPZihlKTwwKXJldHVybiJzZXJ2aWNlIGVycm9yIn19fSx5bj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxnZXRQcm92aWRlcjptbn0pLF9uPXtyb290Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24odCxlKXt2YXIgbj0kdi5zdWJQYWNrYWdlcztyZXR1cm4gQXJyYXkuaXNBcnJheShuKSYmMCE9PW4ubGVuZ3RoP24uZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5yb290PT09dH0pP3ZvaWQgMDoicm9vdCBgIit0KyJgIGlzIG5vdCBmb3VuZCI6Im5vIHN1YlBhY2thZ2VzIn19fSxibj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxsb2FkU3ViUGFja2FnZTpfbn0pLHduPXtVTklWRVJJRlk6InVuaXZlcmlmeSJ9LGtuPXtwcm92aWRlcjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsZGVmYXVsdDp3bi5VTklWRVJJRlksdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7aWYoT2JqZWN0LnZhbHVlcyh3bikuaW5kZXhPZihlKTwwKXJldHVybiJwcm92aWRlciBlcnJvciJ9fX0sU249T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwscHJlTG9naW46a259KTtmdW5jdGlvbiB4bihhKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgcj0oZT1zdChlKSkuc3BsaXQoIj8iKVswXSxuPVB2LmZpbmQoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXRoLG49ZS5hbGlhcztyZXR1cm4gdD09PXJ8fG49PT1yfSk7aWYoIW4pcmV0dXJuInBhZ2UgYCIrZSsiYCBpcyBub3QgZm91bmQiO2lmKCJuYXZpZ2F0ZVRvIj09PWF8fCJyZWRpcmVjdFRvIj09PWEpe2lmKG4ubWV0YS5pc1RhYkJhcilyZXR1cm4iY2FuIG5vdCAiK2ErIiBhIHRhYmJhciBwYWdlIn1lbHNlIGlmKCJzd2l0Y2hUYWIiPT09YSYmIW4ubWV0YS5pc1RhYkJhcilyZXR1cm4iY2FuIG5vdCBzd2l0Y2ggdG8gbm8tdGFiQmFyIHBhZ2UiO2lmKCJzd2l0Y2hUYWIiIT09YSYmInByZWxvYWRQYWdlIiE9PWF8fCFuLm1ldGEuaXNUYWJCYXJ8fCJhcHBMYXVuY2giPT09dC5vcGVuVHlwZXx8KGU9ciksbi5tZXRhLmlzRW50cnkmJihlPWUucmVwbGFjZShuLmFsaWFzLCIvIikpLHQudXJsPWZ1bmN0aW9uKGUpe2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gZTt2YXIgdD1lLmluZGV4T2YoIj8iKTtpZigtMT09PXQpcmV0dXJuIGU7dmFyIG49ZS5zdWJzdHIodCsxKS50cmltKCkucmVwbGFjZSgvXihcP3wjfCYpLywiIik7aWYoIW4pcmV0dXJuIGU7ZT1lLnN1YnN0cigwLHQpO3ZhciBpPVtdO3JldHVybiBuLnNwbGl0KCImIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoL1wrL2csIiAiKS5zcGxpdCgiPSIpLG49dC5zaGlmdCgpLHI9MDx0Lmxlbmd0aD90LmpvaW4oIj0iKToiIjtpLnB1c2gobisiPSIrZW5jb2RlVVJJQ29tcG9uZW50KHIpKX0pLGkubGVuZ3RoP2UrIj8iK2kuam9pbigiJiIpOmV9KGUpLCJ1blByZWxvYWRQYWdlIiE9PWEpaWYoInByZWxvYWRQYWdlIiE9PWEpe2lmKG9uPT09ZSYmImFwcExhdW5jaCIhPT10Lm9wZW5UeXBlKXJldHVybiBvbisiIGxvY2tlZCI7JHYucmVhZHkmJiExIT09JHYuZW5hYmxlTmF2aWdhdG9yTG9jayYmKG9uPWUpfWVsc2V7aWYoIW4ubWV0YS5pc05WdWUpcmV0dXJuImNhbiBub3QgcHJlbG9hZCB2dWUgcGFnZSI7aWYobi5tZXRhLmlzVGFiQmFyKXt2YXIgaT1MdighMCksbz0obi5hbGlhc3x8bi5wYXRoKS5zdWJzdHIoMSk7aWYoaS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnJvdXRlPT09b30pKXJldHVybiJ0YWJCYXIgcGFnZSBgIitvKyJgIGFscmVhZHkgZXhpc3RzIn19fX1mdW5jdGlvbiBDbihlLHQpe3JldHVybiB2b2lkIDA9PT10JiYodD17fSksT2JqZWN0LmFzc2lnbih7dXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6eG4oZSl9LGJlZm9yZUFsbDpmdW5jdGlvbigpe29uPSIifX0sdCl9ZnVuY3Rpb24gVG4odCl7cmV0dXJue2FuaW1hdGlvblR5cGU6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtpZihlJiYtMT09PXQuaW5kZXhPZihlKSlyZXR1cm4iYCIrZSsiYCBpcyBub3Qgc3VwcG9ydGVkIGZvciBgYW5pbWF0aW9uVHlwZWAgKHN1cHBvcnRlZCB2YWx1ZXMgYXJlOiBgIit0LmpvaW4oImB8YCIpKyJgKSJ9fSxhbmltYXRpb25EdXJhdGlvbjp7dHlwZTpOdW1iZXJ9fX12YXIgT24sRW4sQW49Q24oInJlZGlyZWN0VG8iKSxJbj1DbigicmVMYXVuY2giKSwkbj1DbigibmF2aWdhdGVUbyIsVG4oWyJzbGlkZS1pbi1yaWdodCIsInNsaWRlLWluLWxlZnQiLCJzbGlkZS1pbi10b3AiLCJzbGlkZS1pbi1ib3R0b20iLCJmYWRlLWluIiwiem9vbS1vdXQiLCJ6b29tLWZhZGUtb3V0IiwicG9wLWluIiwibm9uZSJdKSksUG49Q24oInN3aXRjaFRhYiIpLE1uPU9iamVjdC5hc3NpZ24oe2RlbHRhOnt0eXBlOk51bWJlcix2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPXBhcnNlSW50KGUpfHwxLHQuZGVsdGE9TWF0aC5taW4oTHYoKS5sZW5ndGgtMSxlKX19fSxUbihbInNsaWRlLW91dC1yaWdodCIsInNsaWRlLW91dC1sZWZ0Iiwic2xpZGUtb3V0LXRvcCIsInNsaWRlLW91dC1ib3R0b20iLCJmYWRlLW91dCIsInpvb20taW4iLCJ6b29tLWZhZGUtaW4iLCJwb3Atb3V0Iiwibm9uZSJdKSksam49e3VybDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOnhuKCJwcmVsb2FkUGFnZSIpfX0sTG49e3VybDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOnhuKCJ1blByZWxvYWRQYWdlIil9fSxObj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxyZWRpcmVjdFRvOkFuLHJlTGF1bmNoOkluLG5hdmlnYXRlVG86JG4sc3dpdGNoVGFiOlBuLG5hdmlnYXRlQmFjazpNbixwcmVsb2FkUGFnZTpqbix1blByZWxvYWRQYWdlOkxufSksQm49e2tleTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxEbj1be25hbWU6ImtleSIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSxSbj17a2V5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZGF0YTp7cmVxdWlyZWQ6ITB9fSxGbj1be25hbWU6ImtleSIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHtuYW1lOiJkYXRhIixyZXF1aXJlZDohMH1dLHpuPUJuLFZuPURuLFVuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldFN0b3JhZ2U6Qm4sZ2V0U3RvcmFnZVN5bmM6RG4sc2V0U3RvcmFnZTpSbixzZXRTdG9yYWdlU3luYzpGbixyZW1vdmVTdG9yYWdlOnpuLHJlbW92ZVN0b3JhZ2VTeW5jOlZufSkscW49e2ZhbWlseTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHNvdXJjZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGRlc2M6e3R5cGU6T2JqZWN0LHJlcXVpcmVkOiExfSxzdWNjZXNzOnt0eXBlOkZ1bmN0aW9uLHJlcXVpcmVkOiExfSxmYWlsOnt0eXBlOkZ1bmN0aW9uLHJlcXVpcmVkOiExfSxjb21wbGV0ZTp7dHlwZTpGdW5jdGlvbixyZXF1aXJlZDohMX19LFduPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGxvYWRGb250RmFjZTpxbn0pLEhuPVsiI2ZmZmZmZiIsIiMwMDAwMDAiXSxHbj17ZnJvbnRDb2xvcjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7aWYoLTE9PT1Ibi5pbmRleE9mKGUpKXJldHVybidpbnZhbGlkIGZyb250Q29sb3IgIicrZSsnIid9fSxiYWNrZ3JvdW5kQ29sb3I6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxhbmltYXRpb246e3R5cGU6T2JqZWN0LGRlZmF1bHQ6ZnVuY3Rpb24oKXtyZXR1cm57ZHVyYXRpb246MCx0aW1pbmdGdW5jOiJsaW5lYXIifX0sdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pLHQuYW5pbWF0aW9uPXtkdXJhdGlvbjplLmR1cmF0aW9ufHwwLHRpbWluZ0Z1bmM6ZS50aW1pbmdGdW5jfHwibGluZWFyIn19fX0sWG49e3RpdGxlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LFluPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHNldE5hdmlnYXRpb25CYXJDb2xvcjpHbixzZXROYXZpZ2F0aW9uQmFyVGl0bGU6WG59KSxKbj17c2Nyb2xsVG9wOnt0eXBlOk51bWJlcn0sZHVyYXRpb246e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MzAwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuZHVyYXRpb249TWF0aC5tYXgoMCxlKX19fSxLbj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxwYWdlU2Nyb2xsVG86Sm59KSxabj17dGl0bGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGNvbnRlbnQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LHNob3dDYW5jZWw6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiEwfSxjYW5jZWxUZXh0Ont0eXBlOlN0cmluZyxkZWZhdWx0OmZ1bmN0aW9uKCl7cmV0dXJuIFFlKCJ1bmkuc2hvd01vZGFsLmNhbmNlbCIpfX0sY2FuY2VsQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiMwMDAwMDAifSxjb25maXJtVGV4dDp7dHlwZTpTdHJpbmcsZGVmYXVsdDpmdW5jdGlvbigpe3JldHVybiBRZSgidW5pLnNob3dNb2RhbC5jb25maXJtIil9fSxjb25maXJtQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiMwMDdhZmYifSx2aXNpYmxlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMH19LFFuPXt0aXRsZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0saWNvbjp7ZGVmYXVsdDoic3VjY2VzcyIsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7LTE9PT1bInN1Y2Nlc3MiLCJsb2FkaW5nIiwiZXJyb3IiLCJub25lIl0uaW5kZXhPZihlKSYmKHQuaWNvbj0ic3VjY2VzcyIpfX0saW1hZ2U6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiIsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZSYmKHQuaW1hZ2U9cHQoZSkpfX0sZHVyYXRpb246e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MTUwMH0sbWFzazp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LHZpc2libGU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiEwfX0sZXI9e3RpdGxlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxpY29uOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJsb2FkaW5nIn0sZHVyYXRpb246e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MWU4fSxtYXNrOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sdmlzaWJsZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITB9fSx0cj17aXRlbUxpc3Q6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7aWYoIWUubGVuZ3RoKXJldHVybiJwYXJhbWV0ZXIuaXRlbUxpc3Qgc2hvdWxkIGhhdmUgYXQgbGVhc3QgMSBpdGVtIn19LGl0ZW1Db2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwMDAwMCJ9LHZpc2libGU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiEwfSxwb3BvdmVyOnt0eXBlOk9iamVjdH19LG5yPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHNob3dNb2RhbDpabixzaG93VG9hc3Q6UW4sc2hvd0xvYWRpbmc6ZXIsc2hvd0FjdGlvblNoZWV0OnRyfSkscnI9e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwfSxpcj17aW5kZXg6cnIsdGV4dDp7dHlwZTpTdHJpbmd9LGljb25QYXRoOnt0eXBlOlN0cmluZ30sc2VsZWN0ZWRJY29uUGF0aDp7dHlwZTpTdHJpbmd9LHBhZ2VQYXRoOnt0eXBlOlN0cmluZ319LG9yPXtjb2xvcjp7dHlwZTpTdHJpbmd9LHNlbGVjdGVkQ29sb3I6e3R5cGU6U3RyaW5nfSxiYWNrZ3JvdW5kQ29sb3I6e3R5cGU6U3RyaW5nfSxiYWNrZ3JvdW5kSW1hZ2U6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2UmJiEvXihsaW5lYXJ8cmFkaWFsKS1ncmFkaWVudFwoLis/XCk7PyQvLnRlc3QoZSkmJih0LmJhY2tncm91bmRJbWFnZT1wdChlKSl9fSxiYWNrZ3JvdW5kUmVwZWF0Ont0eXBlOlN0cmluZ30sYm9yZGVyU3R5bGU6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2UmJih0LmJvcmRlclN0eWxlPSJibGFjayI9PT1lPyJibGFjayI6IndoaXRlIil9fX0sYXI9e2FuaW1hdGlvbjp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9fSxzcj17YW5pbWF0aW9uOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX19LGNyPXtpbmRleDpycn0sdXI9e2luZGV4OnJyfSxscj17aW5kZXg6cnJ9LGRyPXtpbmRleDpycix0ZXh0Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt2YXIgbjt2b2lkIDA9PT0obj1lKSYmKG49IiIpLDQ8PSgiIituKS5yZXBsYWNlKC9bXlx4MDAtXHhmZl0vZywiKioiKS5sZW5ndGgmJih0LnRleHQ9Ii4uLiIpfX19LGZyPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHNldFRhYkJhckl0ZW06aXIsc2V0VGFiQmFyU3R5bGU6b3IsaGlkZVRhYkJhcjphcixzaG93VGFiQmFyOnNyLGhpZGVUYWJCYXJSZWREb3Q6Y3Isc2hvd1RhYkJhclJlZERvdDp1cixyZW1vdmVUYWJCYXJCYWRnZTpscixzZXRUYWJCYXJCYWRnZTpkcn0pLHByPU9iamVjdC5jcmVhdGUobnVsbCksaHI9KE9uPXsiLi9iYXNlL2Jhc2U2NC5qcyI6bmUsIi4vYmFzZS9jYW4taS11c2UuanMiOmllLCIuL2Jhc2UvZXZlbnQtYnVzLmpzIjp1ZSwiLi9iYXNlL2ludGVyY2VwdG9yLmpzIjpmZSwiLi9iYXNlL3VweDJweC5qcyI6aGUsIi4vY29udGV4dC9jYW52YXMuanMiOndlLCIuL2NvbnRleHQvY29udGV4dC5qcyI6T2UsIi4vZGV2aWNlL2FkZC1waG9uZS1jb250YWN0LmpzIjpBZSwiLi9kZXZpY2UvbWFrZS1waG9uZS1jYWxsLmpzIjokZSwiLi9kZXZpY2Uvc2Nhbi1jb2RlLmpzIjpNZSwiLi9kZXZpY2Uvc2V0LWNsaXBib2FyZC1kYXRhLmpzIjphdCwiLi9maWxlL2ZpbGUuanMiOl90LCIuL2ZpbGUvb3Blbi1kb2N1bWVudC5qcyI6d3QsIi4vbG9jYXRpb24vY2hvb3NlLWxvY2F0aW9uLmpzIjpTdCwiLi9sb2NhdGlvbi9nZXQtbG9jYXRpb24uanMiOlR0LCIuL2xvY2F0aW9uL29wZW4tbG9jYXRpb24uanMiOkV0LCIuL21lZGlhL2Nob29zZS1maWxlLmpzIjpQdCwiLi9tZWRpYS9jaG9vc2UtaW1hZ2UuanMiOk50LCIuL21lZGlhL2Nob29zZS12aWRlby5qcyI6UnQsIi4vbWVkaWEvY29tcHJlc3MtaW1hZ2UuanMiOnp0LCIuL21lZGlhL2NvbXByZXNzLXZpZGVvLmpzIjpVdCwiLi9tZWRpYS9nZXQtaW1hZ2UtaW5mby5qcyI6V3QsIi4vbWVkaWEvZ2V0LXZpZGVvLWluZm8uanMiOkd0LCIuL21lZGlhL3ByZXZpZXctaW1hZ2UuanMiOll0LCIuL21lZGlhL3NhdmUtaW1hZ2UtdG8tcGhvdG9zLWFsYnVtLmpzIjpLdCwiLi9uZXR3b3JrL2Rvd25sb2FkLWZpbGUuanMiOlF0LCIuL25ldHdvcmsvcmVxdWVzdC5qcyI6Y24sIi4vbmV0d29yay9zb2NrZXQuanMiOnBuLCIuL25ldHdvcmsvdXBsb2FkLWZpbGUuanMiOnZuLCIuL3BsdWdpbi9nZXQtcHJvdmlkZXIuanMiOnluLCIuL3BsdWdpbi9sb2FkLXN1Yi1wYWNrYWdlLmpzIjpibiwiLi9wbHVnaW4vcHJlLWxvZ2luLmpzIjpTbiwiLi9yb3V0ZS9yb3V0ZS5qcyI6Tm4sIi4vc3RvcmFnZS9zdG9yYWdlLmpzIjpVbiwiLi91aS9sb2FkLWZvbnQtZmFjZS5qcyI6V24sIi4vdWkvbmF2aWdhdGlvbi1iYXIuanMiOlluLCIuL3VpL3BhZ2Utc2Nyb2xsLXRvLmpzIjpLbiwiLi91aS9wb3B1cC5qcyI6bnIsIi4vdWkvdGFiLWJhci5qcyI6ZnJ9LChFbj1mdW5jdGlvbihlKXtyZXR1cm4gT25bZV18fGZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrZSsiJy4iKX0oKX0pLmtleXM9ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmtleXMoT24pfSxFbik7ZnVuY3Rpb24gdnIoZSx0LG4pe3ZhciByPXRbZV0saT0hayhuLGUpLG89bltlXTtpZigtMTxmdW5jdGlvbihlLHQpe2lmKCFBcnJheS5pc0FycmF5KHQpKXJldHVybiBfcih0LGUpPzA6LTE7Zm9yKHZhciBuPTAscj10Lmxlbmd0aDtuPHI7bisrKWlmKF9yKHRbbl0sZSkpcmV0dXJuIG47cmV0dXJuLTF9KEJvb2xlYW4sci50eXBlKSYmaSYmIWsociwiZGVmYXVsdCIpJiYobz0hMSksdm9pZCAwPT09byYmayhyLCJkZWZhdWx0Iikpe3ZhciBhPXIuZGVmYXVsdDtvPUMoYSk/YSgpOmEsbltlXT1vfXJldHVybiBmdW5jdGlvbihlLHQsbixyLGkpe2lmKGUucmVxdWlyZWQmJnIpcmV0dXJuIk1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyIGAiK3QrImAiO2lmKG51bGw9PW4mJiFlLnJlcXVpcmVkKXt2YXIgbz1lLnZhbGlkYXRvcjtyZXR1cm4gbz9vKG4saSk6dm9pZCAwfXZhciBhPWUudHlwZSxzPSFhfHwhMD09PWEsYz1bXTtpZihhKXtBcnJheS5pc0FycmF5KGEpfHwoYT1bYV0pO2Zvcih2YXIgdT0wO3U8YS5sZW5ndGgmJiFzO3UrKyl7dmFyIGw9bXIobixhW3VdKTtjLnB1c2gobC5leHBlY3RlZFR5cGV8fCIiKSxzPWwudmFsaWR9fWlmKCFzKXJldHVybiBmdW5jdGlvbihlLHQsbil7dmFyIHI9InBhcmFtZXRlciBgIitlKyJgLiBFeHBlY3RlZCAiK24uam9pbigiLCAiKSxpPW5bMF0sbz1mKHQpLGE9YnIodCxpKSxzPWJyKHQsbyk7MT09PW4ubGVuZ3RoJiZrcihpKSYmIWZ1bmN0aW9uKCl7dmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO2Zvcig7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtyZXR1cm4gZS5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiJib29sZWFuIj09PWUudG9Mb3dlckNhc2UoKX0pfShpLG8pJiYocis9IiB3aXRoIHZhbHVlICIrYSk7cis9IiwgZ290ICIrbysiICIsa3IobykmJihyKz0id2l0aCB2YWx1ZSAiK3MrIi4iKTtyZXR1cm4gcn0odCxuLGMpO3ZhciBkPWUudmFsaWRhdG9yO2lmKGQpcmV0dXJuIGQobixpKX0ocixlLG8saSxuKX1oci5rZXlzKCkuZm9yRWFjaChmdW5jdGlvbihlKXtPYmplY3QuYXNzaWduKHByLGhyKGUpKX0pO3ZhciBncj0vXihTdHJpbmd8TnVtYmVyfEJvb2xlYW58RnVuY3Rpb258U3ltYm9sKSQvO2Z1bmN0aW9uIG1yKGUsdCl7dmFyIG4scj15cih0KTtpZihnci50ZXN0KHIpKXt2YXIgaT10eXBlb2YgZTsobj1pPT09ci50b0xvd2VyQ2FzZSgpKXx8Im9iamVjdCIhPT1pfHwobj1lIGluc3RhbmNlb2YgdCl9ZWxzZSBuPTA8PWUuYnl0ZUxlbmd0aHx8KCJPYmplY3QiPT09cj9UKGUpOiJBcnJheSI9PT1yP0FycmF5LmlzQXJyYXkoZSk6ZSBpbnN0YW5jZW9mIHR8fGYoZSk9PT15cih0KSk7cmV0dXJue3ZhbGlkOm4sZXhwZWN0ZWRUeXBlOnJ9fWZ1bmN0aW9uIHlyKGUpe3ZhciB0PWUmJmUudG9TdHJpbmcoKS5tYXRjaCgvXlxzKmZ1bmN0aW9uIChcdyspLyk7cmV0dXJuIHQ/dFsxXToiIn1mdW5jdGlvbiBfcihlLHQpe3JldHVybiB5cihlKT09PXlyKHQpfWZ1bmN0aW9uIGJyKGUsdCl7cmV0dXJuIlN0cmluZyI9PT10PyciJytlKyciJzoiTnVtYmVyIj09PXQ/IiIrTnVtYmVyKGUpOiIiK2V9dmFyIHdyPVsic3RyaW5nIiwibnVtYmVyIiwiYm9vbGVhbiJdO2Z1bmN0aW9uIGtyKHQpe3JldHVybiB3ci5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiB0LnRvTG93ZXJDYXNlKCk9PT1lfSl9ZnVuY3Rpb24gU3IoZSx0LG4pe3ZhciByPXQrIjpmYWlsICIrZTtpZigtMT09PW4pdGhyb3cgbmV3IEVycm9yKHIpO3JldHVybiJudW1iZXIiPT10eXBlb2YgbiYmSXIobix7ZXJyTXNnOnJ9KSwhMX12YXIgeHI9W3tuYW1lOiJjYWxsYmFjayIsdHlwZTpGdW5jdGlvbixyZXF1aXJlZDohMH1dLENyPVsiYmVmb3JlVmFsaWRhdGUiLCJiZWZvcmVBbGwiLCJiZWZvcmVTdWNjZXNzIl07ZnVuY3Rpb24gVHIoZSxuLHQpe3ZhciByPXByW2VdO2lmKCFyJiZLKGUpJiYocj14cikscil7aWYoQXJyYXkuaXNBcnJheShyKSYmQXJyYXkuaXNBcnJheShuKSl7dmFyIGk9T2JqZWN0LmNyZWF0ZShudWxsKSxvPU9iamVjdC5jcmVhdGUobnVsbCksYT1uLmxlbmd0aDtyLmZvckVhY2goZnVuY3Rpb24oZSx0KXtpW2UubmFtZV09ZSx0PGEmJihvW2UubmFtZV09blt0XSl9KSxyPWksbj1vfWlmKEMoci5iZWZvcmVWYWxpZGF0ZSkpe3ZhciBzPXIuYmVmb3JlVmFsaWRhdGUobik7aWYocylyZXR1cm4gU3IocyxlLHQpfWZvcih2YXIgYz1PYmplY3Qua2V5cyhyKSx1PTA7dTxjLmxlbmd0aDt1KyspaWYoLTE9PT1Dci5pbmRleE9mKGNbdV0pKXt2YXIgbD12cihjW3VdLHIsbik7aWYobClyZXR1cm4gU3IobCxlLHQpfX1yZXR1cm4hMH12YXIgT3I9MSxFcj17fTtmdW5jdGlvbiBBcihlLHQsbil7dm9pZCAwPT09dCYmKHQ9e30pLHZvaWQgMD09PW4mJihuPXt9KTt2YXIgcj1mdW5jdGlvbihpLG8sZSl7aWYodm9pZCAwPT09byYmKG89e30pLHZvaWQgMD09PWUmJihlPXt9KSwhVChvKSlyZXR1cm57cGFyYW1zOm99O3ZhciB0PVEobz1PYmplY3QuYXNzaWduKHt9LG8pKSxhPXQuc3VjY2VzcyxzPXQuZmFpbCxjPXQuY2FuY2VsLHU9dC5jb21wbGV0ZSxsPUMoYSksZD1DKHMpLGY9QyhjKSxwPUModSk7aWYoIShsfHxkfHxmfHxwKSlyZXR1cm57cGFyYW1zOm99O3ZhciBuPXt9O2Zvcih2YXIgciBpbiBlKXt2YXIgaD1lW3JdO0MoaCkmJihuW3JdPUkoaCkpfXZhciB2PW4uYmVmb3JlU3VjY2VzcyxnPW4uYWZ0ZXJTdWNjZXNzLG09bi5iZWZvcmVGYWlsLHk9bi5hZnRlckZhaWwsXz1uLmJlZm9yZUNhbmNlbCxiPW4uYWZ0ZXJDYW5jZWwsdz1uLmJlZm9yZUFsbCxrPW4uYWZ0ZXJBbGwsUz1PcisrLHg9ImFwaS4iK2krIi4iK1M7cmV0dXJuIEVyW1NdPXtuYW1lOngsY2FsbGJhY2s6ZnVuY3Rpb24oZSl7aWYoZS5lcnJNc2c9ZS5lcnJNc2d8fGkrIjpvayIsLTEhPT1lLmVyck1zZy5pbmRleE9mKCI6b2siKSllLmVyck1zZz1pKyI6b2siO2Vsc2UgaWYoLTEhPT1lLmVyck1zZy5pbmRleE9mKCI6Y2FuY2VsIikpZS5lcnJNc2c9aSsiOmNhbmNlbCI7ZWxzZSBpZigtMSE9PWUuZXJyTXNnLmluZGV4T2YoIjpmYWlsIikpe3ZhciB0PSIiLG49ZS5lcnJNc2cuaW5kZXhPZigiICIpOy0xPG4mJih0PWUuZXJyTXNnLnN1YnN0cihuKSksZS5lcnJNc2c9aSsiOmZhaWwiK3R9Qyh3KSYmdyhlKTt2YXIgcj1lLmVyck1zZzswPT09ci5pbmRleE9mKGkrIjpvayIpPyhDKHYpJiZ2KGUsbyksbCYmYShlKSxDKGcpJiZnKGUpKTowPT09ci5pbmRleE9mKGkrIjpjYW5jZWwiKT8oZS5lcnJNc2c9ZS5lcnJNc2cucmVwbGFjZShpKyI6Y2FuY2VsIixpKyI6ZmFpbCBjYW5jZWwiKSxkJiZzKGUpLEMoXykmJl8oZSksZiYmYyhlKSxDKGIpJiZiKGUpKTowPT09ci5pbmRleE9mKGkrIjpmYWlsIikmJihDKG0pJiZtKGUpLGQmJnMoZSksQyh5KSYmeShlKSkscCYmdShlKSxDKGspJiZrKGUpfX0se3BhcmFtczpvLGNhbGxiYWNrSWQ6U319KGUsdCxuKSxpPXIucGFyYW1zLG89ci5jYWxsYmFja0lkO3JldHVybiBUKGkpJiYhVHIoZSxpLG8pP3twYXJhbXM6aSxjYWxsYmFja0lkOiExfTp7cGFyYW1zOmksY2FsbGJhY2tJZDpvfX1mdW5jdGlvbiBJcihlLHQsbil7aWYoIm51bWJlciI9PXR5cGVvZiBlKXt2YXIgcj1FcltlXTtpZihyKXJldHVybiByLmtlZXBBbGl2ZXx8ZGVsZXRlIEVyW2VdLHIuY2FsbGJhY2sodCxuKX1yZXR1cm4gdH1mdW5jdGlvbiAkcih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7Y29uc29sZS5lcnJvcigiQVBJIGAiK3QrImAgaXMgbm90IHlldCBpbXBsZW1lbnRlZCIpfX12YXIgUHI9WyJnZXRQdXNoQ2xpZW50SWQiLCJvblB1c2hNZXNzYWdlIiwib2ZmUHVzaE1lc3NhZ2UiXTtmdW5jdGlvbiBNcihjLHUsbCl7cmV0dXJuIHZvaWQgMD09PWwmJihsPXt9KSwtMTxQci5pbmRleE9mKGMpfHwhQyh1KT91OihlPWwsKHQ9cHJbY10pJiYoQyh0LmJlZm9yZUFsbCkmJihlLmJlZm9yZUFsbD10LmJlZm9yZUFsbCksQyh0LmJlZm9yZVN1Y2Nlc3MpJiYoZS5iZWZvcmVTdWNjZXNzPXQuYmVmb3JlU3VjY2VzcykpLGZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoO24tLTspdFtuXT1hcmd1bWVudHNbbl07aWYoSihjKSl7aWYoVHIoYyx0LC0xKSlyZXR1cm4gdS5hcHBseShudWxsLHQpfWVsc2UgaWYoSyhjKSl7aWYoVHIoYyx0LC0xKSlyZXR1cm4gdSgoYy5zdGFydHNXaXRoKCJvZmYiKT9mdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiBFcil7dmFyIHI9RXJbbl07aWYoci5uYW1lLnN0YXJ0c1dpdGgoImFwaS4iK2UucmVwbGFjZSgvXm9mZi8sIm9uIikpJiZyLmNhbGxiYWNrPT09dClyZXR1cm4gZGVsZXRlIEVyW25dLE51bWJlcihuKX1yZXR1cm4iZmFpbCJ9OmZ1bmN0aW9uKGUsdCl7dmFyIG49T3IrKyxyPSJhcGkuIitlKyIuIituO3JldHVybiBFcltuXT17bmFtZTpyLGtlZXBBbGl2ZTohMCxjYWxsYmFjazp0fSxufSkoYyx0WzBdKSl9ZWxzZXt2YXIgcj17fTt0Lmxlbmd0aCYmKHI9dFswXSk7dmFyIGksbz1BcihjLHIsbCksYT1vLnBhcmFtcyxzPW8uY2FsbGJhY2tJZDtpZighMSE9PXMpcmV0dXJuKGk9QyhhKT91KHMpOnUoYSxzKSkmJihlPWMsLTE9PT1HLmluZGV4T2YoZSkpJiZUKGk9SXIocyxpKSkmJihpLmVyck1zZz1pLmVyck1zZ3x8YysiOm9rIiksaX19KTt2YXIgZSx0fWZ1bmN0aW9uIGpyKGUsdCl7cmV0dXJuIGUodD17ZXhwb3J0czp7fX0sdC5leHBvcnRzKSx0LmV4cG9ydHN9dmFyIExyPWpyKGZ1bmN0aW9uKGUsdCl7IWZ1bmN0aW9uKCl7Zm9yKHZhciBvPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIixkPW5ldyBVaW50OEFycmF5KDI1NiksZT0wO2U8by5sZW5ndGg7ZSsrKWRbby5jaGFyQ29kZUF0KGUpXT1lO3QuZW5jb2RlPWZ1bmN0aW9uKGUpe3ZhciB0LG49bmV3IFVpbnQ4QXJyYXkoZSkscj1uLmxlbmd0aCxpPSIiO2Zvcih0PTA7dDxyO3QrPTMpaSs9b1tuW3RdPj4yXSxpKz1vWygzJm5bdF0pPDw0fG5bdCsxXT4+NF0saSs9b1soMTUmblt0KzFdKTw8MnxuW3QrMl0+PjZdLGkrPW9bNjMmblt0KzJdXTtyZXR1cm4gciUzPT0yP2k9aS5zdWJzdHJpbmcoMCxpLmxlbmd0aC0xKSsiPSI6ciUzPT0xJiYoaT1pLnN1YnN0cmluZygwLGkubGVuZ3RoLTIpKyI9PSIpLGl9LHQuZGVjb2RlPWZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG8sYT0uNzUqZS5sZW5ndGgscz1lLmxlbmd0aCxjPTA7Ij0iPT09ZVtlLmxlbmd0aC0xXSYmKGEtLSwiPSI9PT1lW2UubGVuZ3RoLTJdJiZhLS0pO3ZhciB1PW5ldyBBcnJheUJ1ZmZlcihhKSxsPW5ldyBVaW50OEFycmF5KHUpO2Zvcih0PTA7dDxzO3QrPTQpbj1kW2UuY2hhckNvZGVBdCh0KV0scj1kW2UuY2hhckNvZGVBdCh0KzEpXSxpPWRbZS5jaGFyQ29kZUF0KHQrMildLG89ZFtlLmNoYXJDb2RlQXQodCszKV0sbFtjKytdPW48PDJ8cj4+NCxsW2MrK109KDE1JnIpPDw0fGk+PjIsbFtjKytdPSgzJmkpPDw2fDYzJm87cmV0dXJuIHV9fSgpfSksTnI9THIuZW5jb2RlLEJyPUxyLmRlY29kZTt2YXIgRHI9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsYmFzZTY0VG9BcnJheUJ1ZmZlcjpmdW5jdGlvbihlKXtyZXR1cm4gQnIoZSl9LGFycmF5QnVmZmVyVG9CYXNlNjQ6ZnVuY3Rpb24oZSl7cmV0dXJuIE5yKGUpfX0pLFJyPXt9O3ZhciBGcj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjYW5JVXNlOmZ1bmN0aW9uKGUpe3JldHVybiBrKFJyLGUpP1JyW2VdOiEhayhFaCxlKX19KSx6cj17cHJvbWlzZUludGVyY2VwdG9yOlV9LFZyPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGludGVyY2VwdG9yczp6cixhZGRJbnRlcmNlcHRvcjpmdW5jdGlvbihlLHQpeyJzdHJpbmciPT10eXBlb2YgZSYmVCh0KT9MKGpbZV18fChqW2VdPXt9KSx0KTpUKGUpJiZMKE0sZSl9LHJlbW92ZUludGVyY2VwdG9yOmZ1bmN0aW9uKGUsdCl7InN0cmluZyI9PXR5cGVvZiBlP1QodCk/TihqW2VdLHQpOmRlbGV0ZSBqW2VdOlQoZSkmJk4oTSxlKX19KSxVcj0hMSxxcj0wLFdyPTA7ZnVuY3Rpb24gSHIoZSx0KXtyZXR1cm4gZT1OdW1iZXIoZSksaXNOYU4oZSk/dDplfXZhciBHcj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCx1cHgycHg6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbztpZigwPT09cXImJihuPU12LmdldFN5c3RlbUluZm9TeW5jKCkscj1uLnBsYXRmb3JtLGk9bi5waXhlbFJhdGlvLG89bi53aW5kb3dXaWR0aCxxcj1vLFdyPWksVXI9ImlvcyI9PT1yKSwwPT09KGU9TnVtYmVyKGUpKSlyZXR1cm4gMDt2YXIgYT0kdi5nbG9iYWxTdHlsZXx8JHYud2luZG93fHx7fSxzPUhyKGEucnB4Q2FsY01heERldmljZVdpZHRoLDk2MCksYz1IcihhLnJweENhbGNCYXNlRGV2aWNlV2lkdGgsMzc1KSx1PUhyKGEucnB4Q2FsY0luY2x1ZGVXaWR0aCw3NTApLGw9dHx8cXIsZD1lLzc1MCoobD1lPT09dXx8bDw9cz9sOmMpO3JldHVybiBkPDAmJihkPS1kKSwwPT09KGQ9TWF0aC5mbG9vcihkKzFlLTQpKSYmKGQ9MSE9PVdyJiZVcj8uNToxKSxlPDA/LWQ6ZH19KTtmdW5jdGlvbiBYcihlLHQsbixyKXtUdi5wdWJsaXNoSGFuZGxlcih0KyItYXVkaW8tIitlLHthdWRpb0lkOmUsdHlwZTpuLGRhdGE6cn0sdCl9dmFyIFlyPWZ1bmN0aW9uKGUsdCl7dGhpcy5pZD1lLHRoaXMucGFnZUlkPXR9O1lyLnByb3RvdHlwZS5zZXRTcmM9ZnVuY3Rpb24oZSl7WHIodGhpcy5pZCx0aGlzLnBhZ2VJZCwic2V0U3JjIix7c3JjOmV9KX0sWXIucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXtYcih0aGlzLmlkLHRoaXMucGFnZUlkLCJwbGF5Iil9LFlyLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe1hyKHRoaXMuaWQsdGhpcy5wYWdlSWQsInBhdXNlIil9LFlyLnByb3RvdHlwZS5zZWVrPWZ1bmN0aW9uKGUpe1hyKHRoaXMuaWQsdGhpcy5wYWdlSWQsInNlZWsiLHtwb3NpdGlvbjplfSl9O3ZhciBKcj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjcmVhdGVBdWRpb0NvbnRleHQ6ZnVuY3Rpb24oZSx0KXtpZih0KXJldHVybiBuZXcgWXIoZSx0LiRwYWdlLmlkKTt2YXIgbj1qdigpO2lmKG4uJHJvdXRlJiZuLiRyb3V0ZS5wYXJhbXMuX19pZF9fKXJldHVybiBuZXcgWXIoZSxuLiRyb3V0ZS5wYXJhbXMuX19pZF9fKTtUdi5lbWl0KCJvbkVycm9yIiwiY3JlYXRlQXVkaW9Db250ZXh0OmZhaWwiKX19KSxLcj1uZXcgU3Y7ZnVuY3Rpb24gWnIoZSx0LG4pe3JldHVybiBlW3RdLmFwcGx5KGUsbil9ZnVuY3Rpb24gUXIoKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PUFycmF5KGUpO2UtLTspdFtlXT1hcmd1bWVudHNbZV07cmV0dXJuIFpyKEtyLCIkb24iLFtdLmNvbmNhdCh0KSl9ZnVuY3Rpb24gZWkoKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PUFycmF5KGUpO2UtLTspdFtlXT1hcmd1bWVudHNbZV07cmV0dXJuIFpyKEtyLCIkb2ZmIixbXS5jb25jYXQodCkpfWZ1bmN0aW9uIHRpKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1BcnJheShlKTtlLS07KXRbZV09YXJndW1lbnRzW2VdO3JldHVybiBacihLciwiJG9uY2UiLFtdLmNvbmNhdCh0KSl9ZnVuY3Rpb24gbmkoKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PUFycmF5KGUpO2UtLTspdFtlXT1hcmd1bWVudHNbZV07cmV0dXJuIFpyKEtyLCIkZW1pdCIsW10uY29uY2F0KHQpKX12YXIgcmksaWk9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsJG9uOlFyLCRvZmY6ZWksJG9uY2U6dGksJGVtaXQ6bml9KTtmdW5jdGlvbiBvaSgpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtyZXR1cm4gVHYuaW52b2tlQ2FsbGJhY2tIYW5kbGVyLmFwcGx5KFR2LGUpfWZ1bmN0aW9uIGFpKGUpe3JldHVybiBNdi5yZXF1aXJlTmF0aXZlUGx1Z2luKGUpfWZ1bmN0aW9uIHNpKGUpe2Zvcih2YXIgdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGgtMTswPG4tLTspdFtuXT1hcmd1bWVudHNbbisxXTtyZXR1cm4gVHYuZW1pdC5hcHBseShUdixbImFwaS4iK2VdLmNvbmNhdCh0KSl9dmFyIGNpPUN2Lm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZTtmdW5jdGlvbiB1aShlKXtjaShyaT1lKX1mdW5jdGlvbiBsaShlKXtpZighZSl7dmFyIHQ9THYoKTtpZighdC5sZW5ndGgpcmV0dXJuO2lmKCEoZT10W3QubGVuZ3RoLTFdLiRwYWdlLm1ldGEuc3RhdHVzQmFyU3R5bGUpfHxlPT09cmkpcmV0dXJufWUhPT1yaSYmKHJpPWUsQ3YubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKGUpKX1mdW5jdGlvbiBkaSh0KXtpZih2b2lkIDA9PT10JiYodD0iIiksISR2LnRhYkJhcnx8IUFycmF5LmlzQXJyYXkoJHYudGFiQmFyLmxpc3QpKXJldHVybiExO3RyeXtpZighdCl7dmFyIGU9THYoKTtpZighZS5sZW5ndGgpcmV0dXJuITE7dmFyIG49ZVtlLmxlbmd0aC0xXTtyZXR1cm4hIW4mJm4uJHBhZ2UubWV0YS5pc1RhYkJhcn0vXlwvLy50ZXN0KHQpfHwodD0iLyIrdCk7dmFyIHI9UHYuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXRoPT09dH0pO3JldHVybiByJiZyLm1ldGEuaXNUYWJCYXJ9Y2F0Y2goZSl7fXJldHVybiExfWZ1bmN0aW9uIGZpKGUpe3JldHVybiBCcihlKX1mdW5jdGlvbiBwaShlKXtyZXR1cm4gTnIoZSl9ZnVuY3Rpb24gaGkoZSx0LG4scil7dmFyIGk9ZSh0KTtyZXR1cm4gaSYmaS5lcnJNc2cmJihpLmVyck1zZz1pLmVyck1zZy5yZXBsYWNlKG4scikpLGl9ZnVuY3Rpb24gdmkoZSl7cmV0dXJuIGU/ZS4kZ2V0QXBwV2VidmlldygpOmdpKCl9ZnVuY3Rpb24gZ2koKXt0cnl7dmFyIGU9THYoKTtpZihlLmxlbmd0aClyZXR1cm4gZVtlLmxlbmd0aC0xXS4kZ2V0QXBwV2VidmlldygpfWNhdGNoKGUpe319Q3YubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlPXVpO3ZhciBtaT1mdW5jdGlvbihlLHQpe2lmKDA9PT10LmluZGV4T2YoIi4vIikpcmV0dXJuIG1pKGUsdC5zdWJzdHIoMikpO3ZhciBuLHIsaT10LnNwbGl0KCIvIik7Zm9yKG49MCxyPWkubGVuZ3RoO248ciYmIi4uIj09PWlbbl07bisrKTtpLnNwbGljZSgwLG4pLHQ9aS5qb2luKCIvIik7dmFyIG89MDxlLmxlbmd0aD9lLnNwbGl0KCIvIik6W107cmV0dXJuIG8uc3BsaWNlKG8ubGVuZ3RoLW4tMSxuKzEpLG8uY29uY2F0KGkpLmpvaW4oIi8iKX0seWk9ZnVuY3Rpb24oZSl7cmV0dXJuIEN2LmlvLmNvbnZlcnRMb2NhbEZpbGVTeXN0ZW1VUkwoZSkucmVwbGFjZSgvXlwvP2FwcHNcLy8sIi9hbmRyb2lkX2Fzc2V0L2FwcHMvIikucmVwbGFjZSgvXC8kLywiIil9O2Z1bmN0aW9uIF9pKGUpe2lmKDA9PT1lLmluZGV4T2YoIi8vIikpcmV0dXJuImh0dHBzOiIrZTtpZigvXihbYS16LV0rOik/XC9cLy9pLnRlc3QoZSl8fC9eZGF0YTouKiwuKi8udGVzdChlKSlyZXR1cm4gZTtpZigwPT09ZS5pbmRleE9mKCJfd3d3Iil8fDA9PT1lLmluZGV4T2YoIl9kb2MiKXx8MD09PWUuaW5kZXhPZigiX2RvY3VtZW50cyIpfHwwPT09ZS5pbmRleE9mKCJfZG93bmxvYWRzIikpcmV0dXJuImZpbGU6Ly8iK3lpKGUpO3ZhciB0PSJmaWxlOi8vIit5aSgiX3d3dyIpO2lmKDA9PT1lLmluZGV4T2YoIi8iKSlyZXR1cm4gZS5zdGFydHNXaXRoKCIvc3RvcmFnZS8iKXx8ZS5zdGFydHNXaXRoKCIvc2RjYXJkLyIpfHxlLmluY2x1ZGVzKCIvQ29udGFpbmVycy9EYXRhL0FwcGxpY2F0aW9uLyIpPyJmaWxlOi8vIitlOnQrZTtpZigwPT09ZS5pbmRleE9mKCIuLi8iKXx8MD09PWUuaW5kZXhPZigiLi8iKSl7aWYoInN0cmluZyI9PXR5cGVvZiBfX2lkX18pcmV0dXJuIHQrbWkoIi8iK19faWRfXyxlKTt2YXIgbj1MdigpO2lmKG4ubGVuZ3RoKXJldHVybiB0K21pKCIvIituW24ubGVuZ3RoLTFdLnJvdXRlLGUpfXJldHVybiBlfXZhciBiaT0zLjE0MTU5MjY1MzU4OTc5Myx3aT02Mzc4MjQ1LGtpPS4wMDY2OTM0MjE2MjI5NjU5NDM7dmFyIFNpPWZ1bmN0aW9uKGUsdCl7dmFyIG49MiplLTEwMCszKnQrLjIqdCp0Ky4xKmUqdCsuMipNYXRoLnNxcnQoTWF0aC5hYnMoZSkpO3JldHVybiBuKz0yKigyMCpNYXRoLnNpbig2KmUqYmkpKzIwKk1hdGguc2luKDIqZSpiaSkpLzMsbis9MiooMjAqTWF0aC5zaW4odCpiaSkrNDAqTWF0aC5zaW4odC8zKmJpKSkvMyxuKz0yKigxNjAqTWF0aC5zaW4odC8xMipiaSkrMzIwKk1hdGguc2luKHQqYmkvMzApKS8zfSx4aT1mdW5jdGlvbihlLHQpe3ZhciBuPTMwMCtlKzIqdCsuMSplKmUrLjEqZSp0Ky4xKk1hdGguc3FydChNYXRoLmFicyhlKSk7cmV0dXJuIG4rPTIqKDIwKk1hdGguc2luKDYqZSpiaSkrMjAqTWF0aC5zaW4oMiplKmJpKSkvMyxuKz0yKigyMCpNYXRoLnNpbihlKmJpKSs0MCpNYXRoLnNpbihlLzMqYmkpKS8zLG4rPTIqKDE1MCpNYXRoLnNpbihlLzEyKmJpKSszMDAqTWF0aC5zaW4oZS8zMCpiaSkpLzN9LENpPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU8NzIuMDA0fHwxMzcuODM0NzxlfHx0PC44MjkzfHw1NS44MjcxPHR8fCExfTtmdW5jdGlvbiBUaShlLG4pe3JldHVybiBmdW5jdGlvbih0KXtDdltlXVtuXShmdW5jdGlvbihlKXtlJiYoZGVsZXRlIGUuY29kZSxkZWxldGUgZS5tZXNzYWdlKSxvaSh0LGUpfSl9fWZ1bmN0aW9uIE9pKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe2U9ZXx8e30sb2kodCxPYmplY3QuYXNzaWduKHt9LGUse2Vyck1zZzpuKyI6b2sifSkpfX1mdW5jdGlvbiBFaShhLHMsYyl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PShlPWV8fHt9KS5jb2RlO3ZvaWQgMD09PXQmJih0PTApO3ZhciBuPWUubWVzc2FnZSxyPXt9O2Zvcih2YXIgaSBpbiBlKS0xPT09WyJjb2RlIiwibWVzc2FnZSJdLmluZGV4T2YoaSkmJihyW2ldPWVbaV0pO3ZhciBvPXI7b2koYSxPYmplY3QuYXNzaWduKHt9LHtlcnJNc2c6cysiOmZhaWwgIisobnx8Y3x8IiIpLGVyckNvZGU6dCxjb2RlOnR9LG8pKX19ZnVuY3Rpb24gQWkobixyLGksbyl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7ImZ1bmN0aW9uIj09dHlwZW9mIGkmJihlPWkoZSkpLEN2W25dW3JdKE9iamVjdC5hc3NpZ24oZSx7c3VjY2VzczpmdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSksZGVsZXRlIGUuY29kZSxkZWxldGUgZS5tZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBvJiYoZT1vKGUpKSxvaSh0LE9iamVjdC5hc3NpZ24oe30sZSx7ZXJyTXNnOnIrIjpvayJ9KSl9LGZhaWw6RWkodCxyKX0pKX19ZnVuY3Rpb24gSWkoZSl7dmFyIHQ9ZS5zcGxpdCgiLyIpO3JldHVybiB0W3QubGVuZ3RoLTFdfXZhciAkaSxQaT0icGxheWJhY2siLE1pPXt9LGppPVsicGxheSIsImNhbnBsYXkiLCJlbmRlZCIsInN0b3AiLCJ3YWl0aW5nIiwic2Vla2luZyIsInNlZWtlZCIsInBhdXNlIl0sTGk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9e30pLHNpKCJvbkF1ZGlvU3RhdGVDaGFuZ2UiLE9iamVjdC5hc3NpZ24oe3N0YXRlOmV9LHQpKX07dmFyIE5pPW51bGwsQmk9MjUwLERpPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PXt9KSxzaSgib25CYWNrZ3JvdW5kQXVkaW9TdGF0ZUNoYW5nZSIsT2JqZWN0LmFzc2lnbih7c3RhdGU6ZX0sdCkpfSxSaT1bInBsYXkiLCJwYXVzZSIsImVuZGVkIiwic3RvcCIsImNhbnBsYXkiXTtmdW5jdGlvbiBGaSgpeyRpfHwoKCRpPUN2LmF1ZGlvLmNyZWF0ZVBsYXllcih7YXV0b3BsYXk6ITAsYmFja2dyb3VuZENvbnRyb2w6ITB9KSkuc3JjPSRpLnRpdGxlPSRpLmVwbmFtZT0kaS5zaW5nZXI9JGkuY292ZXJJbWdVcmw9JGkud2ViVXJsPSIiLCRpLnN0YXJ0VGltZT0wLFJpLmZvckVhY2goZnVuY3Rpb24odCl7JGkuYWRkRXZlbnRMaXN0ZW5lcih0LGZ1bmN0aW9uKCl7InBsYXkiPT09dD8oJGkuaXNTdG9wcGVkPSExLHppKCksTmk9QXYoZnVuY3Rpb24oKXtEaSgidGltZVVwZGF0ZSIse30pfSxCaSkpOiJzdG9wIj09PXQmJigkaS5pc1N0b3BwZWQ9ITApLCJwYXVzZSIhPT10JiYiZW5kZWQiIT09dCYmInN0b3AiIT09dHx8emkoKTt2YXIgZT0ib25NdXNpYyIrKHRbMF0udG9VcHBlckNhc2UoKSt0LnN1YnN0cigxKSk7c2koZSx7ZGF0YVVybDokaS5zcmMsZXJyTXNnOmUrIjpvayJ9KSxEaSh0LHtkYXRhVXJsOiRpLnNyY30pfSl9KSwkaS5hZGRFdmVudExpc3RlbmVyKCJ3YWl0aW5nIixmdW5jdGlvbigpe3ppKCksRGkoIndhaXRpbmciLHtkYXRhVXJsOiRpLnNyY30pfSksJGkuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGUpe3ppKCksc2koIm9uTXVzaWNFcnJvciIse2RhdGFVcmw6JGkuc3JjLGVyck1zZzoiRXJyb3I6IitlLm1lc3NhZ2V9KSxEaSgiZXJyb3IiLHtkYXRhVXJsOiRpLnNyYyxlcnJNc2c6ZS5tZXNzYWdlLGVyckNvZGU6ZS5jb2RlfSl9KSwkaS5hZGRFdmVudExpc3RlbmVyKCJwcmV2IixmdW5jdGlvbigpe3JldHVybiBzaSgib25CYWNrZ3JvdW5kQXVkaW9QcmV2Iil9KSwkaS5hZGRFdmVudExpc3RlbmVyKCJuZXh0IixmdW5jdGlvbigpe3JldHVybiBzaSgib25CYWNrZ3JvdW5kQXVkaW9OZXh0Iil9KSl9ZnVuY3Rpb24gemkoKXtudWxsIT09TmkmJkl2KE5pKX1mdW5jdGlvbiBWaShuLGUpe0ZpKCk7dmFyIHI9WyJzcmMiLCJzdGFydFRpbWUiLCJjb3ZlckltZ1VybCIsIndlYlVybCIsInNpbmdlciIsImVwbmFtZSIsInRpdGxlIl07aWYoZSYmInBsYXliYWNrUmF0ZSI9PT1lKXt2YXIgdD1uW2VdOyRpLnBsYXliYWNrUmF0ZSYmJGkucGxheWJhY2tSYXRlKHBhcnNlRmxvYXQodCkpfWVsc2V7dmFyIGk9e307T2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihlKXtpZigwPD1yLmluZGV4T2YoZSkpe3ZhciB0PW5bZV07ZT09PXJbMF0mJnQmJih0PV9pKHQpKSwkaVtlXT1pW2VdPXR9fSksJGkuc2V0U3R5bGVzKGkpfX1mdW5jdGlvbiBVaSgpe3JldHVybiAkaX1mdW5jdGlvbiBxaShlKXt2YXIgdD1lLm9wZXJhdGlvblR5cGUsbj1lLmRhdGFVcmwscj1lLnBvc2l0aW9uLGk9ZS5hcGk7dm9pZCAwPT09aSYmKGk9Im9wZXJhdGVNdXNpY1BsYXllciIpO3ZhciBvPWUudGl0bGUsYT1lLmNvdmVySW1nVXJsLHM9VWkoKTtyZXR1cm4gMDxbInJlc3VtZSIsInBhdXNlIiwic3RvcCJdLmluZGV4T2YodCk/cyYmc1t0XSgpOiJwbGF5Ij09PXQ/KFZpKHtzcmM6bixzdGFydFRpbWU6cix0aXRsZTpvLGNvdmVySW1nVXJsOmF9KSxzLnBsYXkoKSk6InNlZWsiPT09dCYmcyYmcy5zZWVrVG8ocikse2Vyck1zZzppKyI6b2sifX12YXIgV2k9InN1Y2Nlc3MiLEhpPSJmYWlsIixHaT1bV2ksSGksImNvbXBsZXRlIl07ZnVuY3Rpb24gWGkoZSx0LG4scil7aWYoZSl7aWYodm9pZCAwPT09bilyZXR1cm4gZVt0XSgpO3ZhciBpPUtpKG4scilbMV07cmV0dXJuIE9iamVjdC5rZXlzKGkpLmxlbmd0aD9lW3RdKFppKHQsaSkpOmVbdF0oKX19ZnVuY3Rpb24gWWkoZSx0LG4scil7aWYoZSl7dmFyIGk9S2kobixyKSxvPWlbMF0sYT1pWzFdO3JldHVybiBPYmplY3Qua2V5cyhhKS5sZW5ndGg/ZVt0XShvLFppKHQsYSkpOmVbdF0obyl9fWZ1bmN0aW9uIEppKGUsdCl7dmFyIG49ZnVuY3Rpb24gZSh0LG4pe2lmKCF0fHwhbilyZXR1cm47aWYobi5hdHRyJiZuLmF0dHIuaWQ9PT10KXJldHVybiBuO3ZhciByPW4uY2hpbGRyZW47aWYoIXIpcmV0dXJuO2Zvcih2YXIgaT0wLG89ci5sZW5ndGg7aTxvO2krKyl7dmFyIGE9ZSh0LHJbaV0pO2lmKGEpcmV0dXJuIGF9fShlLHQuJGVsKTtyZXR1cm4gbnx8Y29uc29sZS5lcnJvcigiQ2FuIG5vdCBmaW5kIGAiK2UrImAiKX1mdW5jdGlvbiBLaShuLGUpe3ZvaWQgMD09PW4mJihuPXt9KTt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpLHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9bltlXTtDKHQpJiYocltlXT10LGRlbGV0ZSBuW2VdKX07cmV0dXJuIEdpLmZvckVhY2godCksZSYmZS5mb3JFYWNoKHQpLFtuLHJdfWZ1bmN0aW9uIFppKGksbyl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZTtkZWxldGUgZS50eXBlO3ZhciBuPW9bdF07aWYodD09PVdpP2UuZXJyTXNnPWkrIjpvayI6dD09PUhpJiYoZS5lcnJNc2c9aSsiOmZhaWwiKyhlLm1zZz8iICIrZS5tc2c6IiIpKSxkZWxldGUgZS5jb2RlLGRlbGV0ZSBlLm1zZyxDKG4pJiZuKGUpLHQ9PT1XaXx8dD09PUhpKXt2YXIgcj1vLmNvbXBsZXRlO0MocikmJnIoZSl9fX12YXIgUWk9e2dldENlbnRlckxvY2F0aW9uOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFhpKGUsImdldENlbnRlckxvY2F0aW9uIix0KX0sbW92ZVRvTG9jYXRpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gWWkoZSwibW92ZVRvTG9jYXRpb24iLHQpfSx0cmFuc2xhdGVNYXJrZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gWWkoZSwidHJhbnNsYXRlTWFya2VyIix0LFsiYW5pbWF0aW9uRW5kIl0pfSxpbmNsdWRlUG9pbnRzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFlpKGUsImluY2x1ZGVQb2ludHMiLHQpfSxnZXRSZWdpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gWGkoZSwiZ2V0UmVnaW9uIix0KX0sZ2V0U2NhbGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gWGkoZSwiZ2V0U2NhbGUiLHQpfSxhZGRDdXN0b21MYXllcjpmdW5jdGlvbihlLHQpe3JldHVybiBZaShlLCJhZGRDdXN0b21MYXllciIsdCl9LHJlbW92ZUN1c3RvbUxheWVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFlpKGUsInJlbW92ZUN1c3RvbUxheWVyIix0KX0sYWRkR3JvdW5kT3ZlcmxheTpmdW5jdGlvbihlLHQpe3JldHVybiBZaShlLCJhZGRHcm91bmRPdmVybGF5Iix0KX0scmVtb3ZlR3JvdW5kT3ZlcmxheTpmdW5jdGlvbihlLHQpe3JldHVybiBZaShlLCJyZW1vdmVHcm91bmRPdmVybGF5Iix0KX0sdXBkYXRlR3JvdW5kT3ZlcmxheTpmdW5jdGlvbihlLHQpe3JldHVybiBZaShlLCJ1cGRhdGVHcm91bmRPdmVybGF5Iix0KX0saW5pdE1hcmtlckNsdXN0ZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gWWkoZSwiaW5pdE1hcmtlckNsdXN0ZXIiLHQpfSxhZGRNYXJrZXJzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFlpKGUsImFkZE1hcmtlcnMiLHQpfSxyZW1vdmVNYXJrZXJzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFlpKGUsInJlbW92ZU1hcmtlcnMiLHQpfSxtb3ZlQWxvbmc6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gWWkoZSwibW92ZUFsb25nIix0KX0sb3Blbk1hcEFwcDpmdW5jdGlvbihlLHQpe3JldHVybiBZaShlLCJvcGVuTWFwQXBwIix0KX0sb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5vbih0Lm5hbWUsdC5jYWxsYmFjayl9fTt2YXIgZW89e3BsYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIFhpKGUsInBsYXkiKX0scGF1c2U6ZnVuY3Rpb24oZSl7cmV0dXJuIFhpKGUsInBhdXNlIil9LHNlZWs6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gWWkoZSwic2VlayIsdC5wb3NpdGlvbil9LHN0b3A6ZnVuY3Rpb24oZSl7cmV0dXJuIFhpKGUsInN0b3AiKX0sc2VuZERhbm11OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFlpKGUsInNlbmREYW5tdSIsdCl9LHBsYXliYWNrUmF0ZTpmdW5jdGlvbihlLHQpe3JldHVybiBZaShlLCJwbGF5YmFja1JhdGUiLHQucmF0ZSl9LHJlcXVlc3RGdWxsU2NyZWVuOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFlpKGUsInJlcXVlc3RGdWxsU2NyZWVuIix0KX0sZXhpdEZ1bGxTY3JlZW46ZnVuY3Rpb24oZSl7cmV0dXJuIFhpKGUsImV4aXRGdWxsU2NyZWVuIil9LHNob3dTdGF0dXNCYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIFhpKGUsInNob3dTdGF0dXNCYXIiKX0saGlkZVN0YXR1c0JhcjpmdW5jdGlvbihlKXtyZXR1cm4gWGkoZSwiaGlkZVN0YXR1c0JhciIpfX07dmFyIHRvPWZ1bmN0aW9uKGUsdCl7dGhpcy5pZD1lLHRoaXMuY3R4PXR9O2Z1bmN0aW9uIG5vKGUsdCxuLHIpe3ZhciBpPXQuJHBhZ2UuaWQ7VHYucHVibGlzaEhhbmRsZXIoaSsiLWxpdmVwdXNoZXItIitlLHtsaXZlUHVzaGVySWQ6ZSx0eXBlOm4sZGF0YTpyfSxpKX10by5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIFhpKHRoaXMuY3R4LCJzdGFydCIsZSl9LHRvLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKGUpe3JldHVybiBYaSh0aGlzLmN0eCwic3RvcCIsZSl9LHRvLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbihlKXtyZXR1cm4gWGkodGhpcy5jdHgsInBhdXNlIixlKX0sdG8ucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbihlKXtyZXR1cm4gWGkodGhpcy5jdHgsInJlc3VtZSIsZSl9LHRvLnByb3RvdHlwZS5zd2l0Y2hDYW1lcmE9ZnVuY3Rpb24oZSl7cmV0dXJuIFhpKHRoaXMuY3R4LCJzd2l0Y2hDYW1lcmEiLGUpfSx0by5wcm90b3R5cGUuc25hcHNob3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIFhpKHRoaXMuY3R4LCJzbmFwc2hvdCIsZSl9LHRvLnByb3RvdHlwZS50b2dnbGVUb3JjaD1mdW5jdGlvbihlKXtyZXR1cm4gWGkodGhpcy5jdHgsInRvZ2dsZVRvcmNoIixlKX0sdG8ucHJvdG90eXBlLnBsYXlCR009ZnVuY3Rpb24oZSl7cmV0dXJuIFlpKHRoaXMuY3R4LCJwbGF5QkdNIixlKX0sdG8ucHJvdG90eXBlLnN0b3BCR009ZnVuY3Rpb24oZSl7cmV0dXJuIFhpKHRoaXMuY3R4LCJzdG9wQkdNIixlKX0sdG8ucHJvdG90eXBlLnBhdXNlQkdNPWZ1bmN0aW9uKGUpe3JldHVybiBYaSh0aGlzLmN0eCwicGF1c2VCR00iLGUpfSx0by5wcm90b3R5cGUucmVzdW1lQkdNPWZ1bmN0aW9uKGUpe3JldHVybiBYaSh0aGlzLmN0eCwicmVzdW1lQkdNIixlKX0sdG8ucHJvdG90eXBlLnNldEJHTVZvbHVtZT1mdW5jdGlvbihlKXtyZXR1cm4gWWkodGhpcy5jdHgsInNldEJHTVZvbHVtZSIsZSl9LHRvLnByb3RvdHlwZS5zdGFydFByZXZpZXc9ZnVuY3Rpb24oZSl7cmV0dXJuIFhpKHRoaXMuY3R4LCJzdGFydFByZXZpZXciLGUpfSx0by5wcm90b3R5cGUuc3RvcFByZXZpZXc9ZnVuY3Rpb24oZSl7cmV0dXJuIFhpKHRoaXMuY3R4LCJzdG9wUHJldmlldyIsZSl9LFR2LnN1YnNjcmliZSgib25MaXZlUHVzaGVyTWV0aG9kQ2FsbGJhY2siLGZ1bmN0aW9uKGUpe3ZhciB0PWUuY2FsbGJhY2tJZCxuPWUuZGF0YTtBLmludm9rZSh0LG4pfSk7dmFyIHJvPXtzdGFydFByZXZpZXc6InByZXZpZXciLHN0b3BQcmV2aWV3OiJzdG9wIn0saW89ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWUsdGhpcy5wYWdlVm09dH07aW8ucHJvdG90eXBlLm9uPWZ1bmN0aW9uKGUsdCl7bm8odGhpcy5pZCx0aGlzLnBhZ2VWbSwib24iLHtuYW1lOmUsY2FsbGJhY2s6dH0pfSxbInN0YXJ0Iiwic3RvcCIsInBhdXNlIiwicmVzdW1lIiwic3dpdGNoQ2FtZXJhIiwic3RhcnRQcmV2aWV3Iiwic3RvcFByZXZpZXciLCJzbmFwc2hvdCJdLmZvckVhY2goZnVuY3Rpb24ocil7aW8ucHJvdG90eXBlW3JdPUEud2FycChmdW5jdGlvbihlLHQpe2UuY2FsbGJhY2tJZD10O3ZhciBuPXJvW3JdP3JvW3JdOnI7bm8odGhpcy5pZCx0aGlzLnBhZ2VWbSxuLGUpfSl9KTt2YXIgb28sYW89MjAwLHNvPVsidW5rbm93biIsIm5vbmUiLCJldGhlcm5ldCIsIndpZmkiLCIyZyIsIjNnIiwiNGciLCI1ZyJdLGNvPSJfX1VOSUFQUF9NQVAiLHVvPSJfZG9jL3VuaWFwcF90ZW1wIixsbz11bysiXyIrRGF0ZS5ub3coKSxmbz1bXTtmdW5jdGlvbiBwbyhlLHQpe29vPW9vfHxDdi5hY2NlbGVyb21ldGVyLndhdGNoQWNjZWxlcmF0aW9uKGZ1bmN0aW9uKHQpe2ZvLmZvckVhY2goZnVuY3Rpb24oZSl7b2koZSx7eDp0LnhBeGlzLHk6dC55QXhpcyx6OnQuekF4aXN9KX0pfSxmdW5jdGlvbihlKXtvbz1udWxsLG9pKHQse2Vyck1zZzoic3RhcnRBY2NlbGVyb21ldGVyOmZhaWwgIitlLm1lc3NhZ2V9KX0se2ZyZXF1ZW5jeTphb30pLE92KGZ1bmN0aW9uKCl7b2kodCx7ZXJyTXNnOiJzdGFydEFjY2VsZXJvbWV0ZXI6b2sifSl9LGFvKX1mdW5jdGlvbiBobygpe3JldHVybiBvbyYmKEN2LmFjY2VsZXJvbWV0ZXIuY2xlYXJXYXRjaChvbyksb289bnVsbCkse319dmFyIHZvPXtuYW1lOntnaXZlbk5hbWU6ImZpcnN0TmFtZSIsbWlkZGxlTmFtZToibWlkZGxlTmFtZSIsZmFtaWx5TmFtZToibGFzdE5hbWUifSxuaWNrbmFtZToibmlja05hbWUiLHBob3Rvczp7dHlwZToidXJsIix2YWx1ZToicGhvdG9GaWxlUGF0aCJ9LG5vdGU6InJlbWFyayIscGhvbmVOdW1iZXJzOlt7dHlwZToibW9iaWxlIix2YWx1ZToibW9iaWxlUGhvbmVOdW1iZXIifSx7dHlwZToid29yayIsdmFsdWU6IndvcmtQaG9uZU51bWJlciJ9LHt0eXBlOiJjb21wYW55Iix2YWx1ZToiaG9zdE51bWJlciJ9LHt0eXBlOiJob21lIGZheCIsdmFsdWU6ImhvbWVGYXhOdW1iZXIifSx7dHlwZToid29yayBmYXgiLHZhbHVlOiJ3b3JrRmF4TnVtYmVyIn1dLGVtYWlsczpbe3R5cGU6ImhvbWUiLHZhbHVlOiJlbWFpbCJ9XSx1cmxzOlt7dHlwZToib3RoZXIiLHZhbHVlOiJ1cmwifV0sb3JnYW5pemF0aW9uczpbe3R5cGU6ImNvbXBhbnkiLG5hbWU6Im9yZ2FuaXphdGlvbiIsdGl0bGU6InRpdGxlIn1dLGltczpbe3R5cGU6Im90aGVyIix2YWx1ZToid2VDaGF0TnVtYmVyIn1dLGFkZHJlc3Nlczpbe3R5cGU6Im90aGVyIixwcmVmZXJyZWQ6ITAsY291bnRyeToiYWRkcmVzc0NvdW50cnkiLHJlZ2lvbjoiYWRkcmVzc1N0YXRlIixsb2NhbGl0eToiYWRkcmVzc0NpdHkiLHN0cmVldEFkZHJlc3M6ImFkZHJlc3NTdHJlZXQiLHBvc3RhbENvZGU6ImFkZHJlc3NQb3N0YWxDb2RlIn0se3R5cGU6ImhvbWUiLGNvdW50cnk6ImhvbWVBZGRyZXNzQ291bnRyeSIscmVnaW9uOiJob21lQWRkcmVzc1N0YXRlIixsb2NhbGl0eToiaG9tZUFkZHJlc3NDaXR5IixzdHJlZXRBZGRyZXNzOiJob21lQWRkcmVzc1N0cmVldCIscG9zdGFsQ29kZToiaG9tZUFkZHJlc3NQb3N0YWxDb2RlIn0se3R5cGU6ImNvbXBhbnkiLGNvdW50cnk6IndvcmtBZGRyZXNzQ291bnRyeSIscmVnaW9uOiJ3b3JrQWRkcmVzc1N0YXRlIixsb2NhbGl0eToid29ya0FkZHJlc3NDaXR5IixzdHJlZXRBZGRyZXNzOiJ3b3JrQWRkcmVzc1N0cmVldCIscG9zdGFsQ29kZToid29ya0FkZHJlc3NQb3N0YWxDb2RlIn1dfSxnbz1bInR5cGUiLCJwcmVmZXJyZWQiXTt2YXIgbW89VGkoImJsdWV0b290aCIsIm9uQmx1ZXRvb3RoRGV2aWNlRm91bmQiKSx5bz1UaSgiYmx1ZXRvb3RoIiwib25CbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2UiKSxfbz1UaSgiYmx1ZXRvb3RoIiwib25CTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2UiKSxibz1UaSgiYmx1ZXRvb3RoIiwib25CTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlIik7ZnVuY3Rpb24gd28oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUuZGV2aWNlSWQ7dCYmKGUuZGV2aWNlSWQ9dC50b1VwcGVyQ2FzZSgpKTt2YXIgbj1lLnNlcnZpY2VJZDtyZXR1cm4gbiYmKGUuc2VydmljZUlkPW4udG9VcHBlckNhc2UoKSksZX12YXIga28sU289QWkoImJsdWV0b290aCIsIm9wZW5CbHVldG9vdGhBZGFwdGVyIikseG89QWkoImJsdWV0b290aCIsImNsb3NlQmx1ZXRvb3RoQWRhcHRlciIpLENvPUFpKCJibHVldG9vdGgiLCJnZXRCbHVldG9vdGhBZGFwdGVyU3RhdGUiKSxUbz1BaSgiYmx1ZXRvb3RoIiwic3RhcnRCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5Iix3byksT289QWkoImJsdWV0b290aCIsInN0b3BCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5IiksRW89QWkoImJsdWV0b290aCIsImdldEJsdWV0b290aERldmljZXMiKSxBbz1BaSgiYmx1ZXRvb3RoIiwiZ2V0Q29ubmVjdGVkQmx1ZXRvb3RoRGV2aWNlcyIsd28pLElvPUFpKCJibHVldG9vdGgiLCJjcmVhdGVCTEVDb25uZWN0aW9uIix3byksJG89QWkoImJsdWV0b290aCIsImNsb3NlQkxFQ29ubmVjdGlvbiIsd28pLFBvPUFpKCJibHVldG9vdGgiLCJnZXRCTEVEZXZpY2VTZXJ2aWNlcyIsd28pLE1vPUFpKCJibHVldG9vdGgiLCJnZXRCTEVEZXZpY2VDaGFyYWN0ZXJpc3RpY3MiLHdvKSxqbz1BaSgiYmx1ZXRvb3RoIiwibm90aWZ5QkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZSIsd28pLExvPUFpKCJibHVldG9vdGgiLCJyZWFkQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZSIsd28pLE5vPUFpKCJibHVldG9vdGgiLCJ3cml0ZUJMRUNoYXJhY3RlcmlzdGljVmFsdWUiLHdvKSxCbz1BaSgiYmx1ZXRvb3RoIiwic2V0QkxFTVRVIix3byksRG89QWkoImJsdWV0b290aCIsImdldEJMRURldmljZVJTU0kiLHdvKTt2YXIgUm89W107ZnVuY3Rpb24gRm8oZSx0KXtrbz1rb3x8Q3Yub3JpZW50YXRpb24ud2F0Y2hPcmllbnRhdGlvbihmdW5jdGlvbih0KXtSby5mb3JFYWNoKGZ1bmN0aW9uKGUpe29pKGUse2RpcmVjdGlvbjp0Lm1hZ25ldGljSGVhZGluZ30pfSl9LGZ1bmN0aW9uKGUpe2tvPW51bGwsb2kodCx7ZXJyTXNnOiJzdGFydENvbXBhc3M6ZmFpbCAiK2UubWVzc2FnZX0pfSx7ZnJlcXVlbmN5OmFvfSksT3YoZnVuY3Rpb24oKXtvaSh0LHtlcnJNc2c6InN0YXJ0Q29tcGFzczpvayJ9KX0sYW8pfWZ1bmN0aW9uIHpvKCl7cmV0dXJuIGtvJiYoQ3Yub3JpZW50YXRpb24uY2xlYXJXYXRjaChrbyksa289bnVsbCkse319dmFyIFZvPVRpKCJpYmVhY29uIiwib25CZWFjb25VcGRhdGUiKSxVbz1UaSgiaWJlYWNvbiIsIm9uQmVhY29uU2VydmljZUNoYW5nZSIpLHFvPUFpKCJpYmVhY29uIiwiZ2V0QmVhY29ucyIpLFdvPUFpKCJpYmVhY29uIiwic3RhcnRCZWFjb25EaXNjb3ZlcnkiKSxIbz1BaSgiaWJlYWNvbiIsInN0b3BCZWFjb25EaXNjb3ZlcnkiKTt2YXIgR289IkFuZHJvaWQiPT09Q3Yub3MubmFtZSYmcGFyc2VJbnQoQ3Yub3MudmVyc2lvbik8NixYbz1Hbz8ic2xpZGUtaW4tcmlnaHQiOiJwb3AtaW4iLFlvPTMwMCxKbz1Hbz8ic2xpZGUtb3V0LXJpZ2h0IjoicG9wLW91dCIsS289NTAsWm89Il93d3cvX191bmlhcHB2aWV3Lmh0bWwiLFFvPSJmIixlYT0iaSIsdGE9ImUiLG5hPSJ2LXNob3ciLHJhPSJjIixpYT0icyIsb2E9InNjIixhYT17fSxzYT0iV0VCX0lOVk9LRV9BUFBTRVJWSUNFIjtmdW5jdGlvbiBjYShlLHQpe2lmKGU9PT1zYSlyZXR1cm4gc2koc2EsdC5kYXRhLHQud2Vidmlld0lkcyksITA7dmFyIG49YWFbZV07cmV0dXJuISFuJiYobih0KSxuLmtlZXBBbGl2ZXx8ZGVsZXRlIGFhW2VdLCEwKX1mdW5jdGlvbiB1YShlLHQsbil7aWYodm9pZCAwPT09biYmKG49ITApLGFhW2VdKXJldHVybiBjb25zb2xlLndhcm4oIiciK2UrIicgcmVnaXN0ZXJlZDogIithYVtlXS50b1N0cmluZygpKTt0LmtlZXBBbGl2ZT0hIW4sYWFbZV09dH12YXIgbGE9Il9fVU5JQVBQX1NDQU4iLGRhPSJfd3d3L19fdW5pYXBwc2Nhbi5odG1sIixmYT0ic2NhbkNvZGUiO3ZhciBwYSxoYSx2YSxnYSxtYSx5YT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxTQ0FOX0lEOmxhLFNDQU5fUEFUSDpkYSxzY2FuQ29kZTpmdW5jdGlvbihlLHQpe3ZhciBuPWUub25seUZyb21DYW1lcmE7dm9pZCAwPT09biYmKG49ITEpO3ZhciByPWUuc2NhblR5cGUsaT1lLmF1dG9EZWNvZGVDaGFyU2V0LG89Q3YuYmFyY29kZSxhPXtxckNvZGU6W28uUVIsby5BWlRFQyxvLk1BWElDT0RFXSxiYXJDb2RlOltvLkVBTjEzLG8uRUFOOCxvLlVQQ0Esby5VUENFLG8uQ09EQUJBUixvLkNPREUxMjgsby5DT0RFMzksby5DT0RFOTMsby5JVEYsby5SU1MxNCxvLlJTU0VYUEFOREVEXSxkYXRhbWF0cml4OltvLkRBVEFNQVRSSVhdLHBkZjQxNzpbby5QREY0MTddfSxzPXt9O3Nbby5RUl09IlFSX0NPREUiLHNbby5FQU4xM109IkVBTl8xMyIsc1tvLkVBTjhdPSJFQU5fOCIsc1tvLkRBVEFNQVRSSVhdPSJEQVRBX01BVFJJWCIsc1tvLlVQQ0FdPSJVUENfQSIsc1tvLlVQQ0VdPSJVUENfRSIsc1tvLkNPREFCQVJdPSJDT0RBQkFSIixzW28uQ09ERTM5XT0iQ09ERV8zOSIsc1tvLkNPREU5M109IkNPREVfOTMiLHNbby5DT0RFMTI4XT0iQ09ERV8xMjgiLHNbby5JVEZdPSJDT0RFXzI1IixzW28uUERGNDE3XT0iUERGXzQxNyIsc1tvLkFaVEVDXT0iQVpURUMiLHNbby5SU1MxNF09IlJTU18xNCIsc1tvLlJTU0VYUEFOREVEXT0iUlNTRVhQQU5ERUQiO3ZhciBjLHUsbD0ibGlnaHQiIT09KCJVSVN0YXR1c0JhclN0eWxlQmxhY2tUcmFuc2x1Y2VudCI9PT0oYz1Ddi5uYXZpZ2F0b3IuZ2V0U3RhdHVzQmFyU3R5bGUoKSl8fCJVSVN0YXR1c0JhclN0eWxlQmxhY2tPcGFxdWUiPT09Y3x8Im51bGwiPT09Yz9jPSJsaWdodCI6IlVJU3RhdHVzQmFyU3R5bGVEZWZhdWx0Ij09PWMmJihjPSJkYXJrIiksYyksZD1bXTtBcnJheS5pc0FycmF5KHIpJiZyLmxlbmd0aCYmci5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWFbZV07dCYmKGQ9ZC5jb25jYXQodCkpfSksZC5sZW5ndGh8fChkPWQuY29uY2F0KGEucXJDb2RlKS5jb25jYXQoYS5iYXJDb2RlKS5jb25jYXQoYS5kYXRhbWF0cml4KS5jb25jYXQoYS5wZGY0MTcpKTt2YXIgZj1bXTtufHxmLnB1c2goe2Zsb2F0OiJyaWdodCIsdGV4dDpRZSgidW5pLnNjYW5Db2RlLmFsYnVtIiksZm9udFNpemU6IjE3cHgiLHdpZHRoOiI2MHB4IixvbmNsaWNrOmZ1bmN0aW9uKCl7Q3YuZ2FsbGVyeS5waWNrKGZ1bmN0aW9uKGUpe28uc2NhbihlLGZ1bmN0aW9uKGUsdCxuLHIpe2wmJkN2Lm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpLHU9e3R5cGU6ZSxjb2RlOnQsY2hhclNldDpyfSxwLmNsb3NlKCJhdXRvIil9LGZ1bmN0aW9uKCl7Q3YubmF0aXZlVUkudG9hc3QoUWUoInVuaS5zY2FuQ29kZS5mYWlsIikpfSxkLGkpfSxmdW5jdGlvbihlKXtlLmNvZGUhPT0oIkFuZHJvaWQiPT09Q3Yub3MubmFtZT8xMjotMikmJkN2Lm5hdGl2ZVVJLnRvYXN0KFFlKCJ1bmkuc2NhbkNvZGUuZmFpbCIpKX0se211bHRpcGxlOiExLHN5c3RlbTohMSxmaWxlbmFtZTpsbysiL2dhbGxlcnkvIixwZXJtaXNzaW9uQWxlcnQ6ITB9KX19KTt2YXIgcD1Ddi53ZWJ2aWV3LmNyZWF0ZShkYSxsYSx7dGl0bGVOVmlldzp7YXV0b0JhY2tCdXR0b246ITAsdHlwZToiZmxvYXQiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSIsdGl0bGVDb2xvcjoiI2ZmZmZmZiIsdGl0bGVUZXh0OlFlKCJ1bmkuc2NhbkNvZGUudGl0bGUiKSx0aXRsZVNpemU6IjE3cHgiLGJ1dHRvbnM6Zn0scG9wR2VzdHVyZToiY2xvc2UiLGJhY2tCdXR0b25BdXRvQ29udHJvbDoiY2xvc2UifSx7X191bmlhcHBfdHlwZToic2NhbiIsX191bmlhcHBfZGFyazpsLF9fdW5pYXBwX3NjYW5fdHlwZTpkLF9fdW5pYXBwX2F1dG9fZGVjb2RlX2NoYXJfc2V0OmksX191bmlhcHBfbG9jYWxlOmV0KCksInVuaS1hcHAiOiJub25lIn0pLGg9Q3YubmF0aXZlVUkuc2hvd1dhaXRpbmcoKTtwLmFkZEV2ZW50TGlzdGVuZXIoInRpdGxlVXBkYXRlIixmdW5jdGlvbigpe3Auc2hvdyhYbyxZbyxmdW5jdGlvbigpe2guY2xvc2UoKX0pfSkscC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsZnVuY3Rpb24oKXtvaSh0LHU/e3Jlc3VsdDp1LmNvZGUsc2NhblR5cGU6c1t1LnR5cGVdfHwiIixjaGFyU2V0OnUuY2hhclNldHx8InV0ZjgiLHBhdGg6IiIsZXJyTXNnOiJzY2FuQ29kZTpvayJ9OntlcnJNc2c6InNjYW5Db2RlOmZhaWwgY2FuY2VsIn0pLGNhKGZhKX0pLGwmJihDdi5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0IikscC5hZGRFdmVudExpc3RlbmVyKCJwb3BHZXN0dXJlIixmdW5jdGlvbihlKXt2YXIgdD1lLnR5cGUsbj1lLnJlc3VsdDsic3RhcnQiPT09dD9Ddi5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKToiZW5kIiE9PXR8fG58fEN2Lm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgibGlnaHQiKX0pKSx1YShmYSxmdW5jdGlvbihlKXtlJiYiY29kZSJpbiBlJiYodT1lKX0sITEpfX0pO2Z1bmN0aW9uIF9hKCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJiJvYmplY3QiPT10eXBlb2YgbmF2aWdhdG9yJiYib2JqZWN0Ij09dHlwZW9mIGRvY3VtZW50PyJ3ZWJ2aWV3IjoidjgifWZ1bmN0aW9uIGJhKCl7cmV0dXJuIHBhLndlYnZpZXcuY3VycmVudFdlYnZpZXcoKS5pZH12YXIgd2E9e307ZnVuY3Rpb24ga2EoZSl7dmFyIHQ9ZS5kYXRhJiZlLmRhdGEuX19tZXNzYWdlO2lmKHQmJnQuX19wYWdlKXt2YXIgbj10Ll9fcGFnZSxyPXdhW25dO3ImJnIodCksdC5rZWVwfHxkZWxldGUgd2Fbbl19fXZhciBTYT1mdW5jdGlvbihlKXt0aGlzLndlYnZpZXc9ZX07ZnVuY3Rpb24geGEoZSl7dmFyIHQ9ZS5jb250ZXh0O3ZvaWQgMD09PXQmJih0PXt9KTt2YXIgbj1lLnVybCxyPWUuZGF0YTt2b2lkIDA9PT1yJiYocj17fSk7dmFyIGk9ZS5zdHlsZTt2b2lkIDA9PT1pJiYoaT17fSk7dmFyIG89ZS5vbk1lc3NhZ2UsYT1lLm9uQ2xvc2U7cGE9dC5wbHVzfHxDdixoYT10LndlZXh8fCgib2JqZWN0Ij09dHlwZW9mIHh2P3h2Om51bGwpLHZhPXQuQnJvYWRjYXN0Q2hhbm5lbHx8KCJvYmplY3QiPT10eXBlb2YgQnJvYWRjYXN0Q2hhbm5lbD9Ccm9hZGNhc3RDaGFubmVsOm51bGwpO3ZhciBzPSJwYWdlIitEYXRlLm5vdygpOyExIT09KGk9T2JqZWN0LmFzc2lnbih7fSxpKSkudGl0bGVOVmlldyYmIm5vbmUiIT09aS50aXRsZU5WaWV3JiYoaS50aXRsZU5WaWV3PU9iamVjdC5hc3NpZ24oe2F1dG9CYWNrQnV0dG9uOiEwLHRpdGxlU2l6ZToiMTdweCJ9LGkudGl0bGVOVmlldykpO3ZhciBjPXt0b3A6MCxib3R0b206MCx1c2luZ0NvbXBvbmVudHM6e30scG9wR2VzdHVyZToiY2xvc2UiLHNjcm9sbEluZGljYXRvcjoibm9uZSIsYW5pbWF0aW9uVHlwZToicG9wLWluIixhbmltYXRpb25EdXJhdGlvbjoyMDAsdW5pTlZpZXc6e3BhdGg6KCJzdHJpbmciPT10eXBlb2YgVlVFX0FQUF9URU1QTEFURV9QQVRIP1ZVRV9BUFBfVEVNUExBVEVfUEFUSDoiIikrIi8iK24rIi5qcyIsZGVmYXVsdEZvbnRTaXplOjE2LHZpZXdwb3J0OnBhLnNjcmVlbi5yZXNvbHV0aW9uV2lkdGh9fTtpPU9iamVjdC5hc3NpZ24oYyxpKTt2YXIgdSxsLGQ9cGEud2Vidmlldy5jcmVhdGUoIiIscyxpLHtleHRyYXM6e2Zyb206YmEoKSxydW50aW1lOl9hKCksZGF0YTpyLHVzZUdsb2JhbEV2ZW50OiF2YX19KTtyZXR1cm4gZC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsYSksdT1zLGw9ZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oZS5kYXRhKSxlLmtlZXB8fGQuY2xvc2UoImF1dG8iKX0sInY4Ij09PV9hKCk/dmE/KGdhJiZnYS5jbG9zZSgpLChnYT1uZXcgdmEoYmEoKSkpLm9ubWVzc2FnZT1rYSk6bWF8fChtYT1oYS5yZXF1aXJlTW9kdWxlKCJnbG9iYWxFdmVudCIpKS5hZGRFdmVudExpc3RlbmVyKCJwbHVzTWVzc2FnZSIsa2EpOndpbmRvdy5fX3BsdXNNZXNzYWdlPWthLHdhW3VdPWwsZC5zaG93KGkuYW5pbWF0aW9uVHlwZSxpLmFuaW1hdGlvbkR1cmF0aW9uKSxuZXcgU2EoZCl9U2EucHJvdG90eXBlLnNlbmRNZXNzYWdlPWZ1bmN0aW9uKGUpe3ZhciB0PUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoe19fbWVzc2FnZTp7ZGF0YTplfX0pKSxuPXRoaXMud2Vidmlldy5pZDt2YT9uZXcgdmEobikucG9zdE1lc3NhZ2UodCk6cGEud2Vidmlldy5wb3N0TWVzc2FnZVRvVW5pTlZpZXcodCxuKX0sU2EucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dGhpcy53ZWJ2aWV3LmNsb3NlKCl9O3ZhciBDYT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxzY2FuQ29kZTpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT0ibGlnaHQiIT09KCJVSVN0YXR1c0JhclN0eWxlQmxhY2tUcmFuc2x1Y2VudCI9PT0obj1Ddi5uYXZpZ2F0b3IuZ2V0U3RhdHVzQmFyU3R5bGUoKSl8fCJVSVN0YXR1c0JhclN0eWxlQmxhY2tPcGFxdWUiPT09bnx8Im51bGwiPT09bj9uPSJsaWdodCI6IlVJU3RhdHVzQmFyU3R5bGVEZWZhdWx0Ij09PW4mJihuPSJkYXJrIiksbiksbz14YSh7dXJsOiJfX3VuaWFwcHNjYW4iLGRhdGE6T2JqZWN0LmFzc2lnbih7fSxlLHttZXNzYWdlczp7ZmFpbDpRZSgidW5pLnNjYW5Db2RlLmZhaWwiKSwiZmxhc2gub24iOlFlKCJ1bmkuc2NhbkNvZGUuZmxhc2gub24iKSwiZmxhc2gub2ZmIjpRZSgidW5pLnNjYW5Db2RlLmZsYXNoLm9mZiIpfX0pLHN0eWxlOnthbmltYXRpb25UeXBlOmUuYW5pbWF0aW9uVHlwZXx8InBvcC1pbiIsdGl0bGVOVmlldzp7YXV0b0JhY2tCdXR0b246ITAsdHlwZToiZmxvYXQiLHRpdGxlVGV4dDplLnRpdGxlVGV4dHx8UWUoInVuaS5zY2FuQ29kZS50aXRsZSIpLHRpdGxlQ29sb3I6IiNmZmZmZmYiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSIsYnV0dG9uczplLm9ubHlGcm9tQ2FtZXJhP1tdOlt7dGV4dDplLmFsYnVtVGV4dHx8UWUoInVuaS5zY2FuQ29kZS5hbGJ1bSIpLGZvbnRTaXplOiIxN3B4Iix3aWR0aDoiNjBweCIsb25jbGljazpmdW5jdGlvbigpe28uc2VuZE1lc3NhZ2Uoe3R5cGU6ImdhbGxlcnkifSl9fV19LHBvcEdlc3R1cmU6ImNsb3NlIixiYWNrZ3JvdW5kOiIjMDAwMDAwIixiYWNrQnV0dG9uQXV0b0NvbnRyb2w6ImNsb3NlIn0sb25NZXNzYWdlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZXZlbnQsbj1lLmRldGFpbDsocj1uKS5lcnJNc2c9Im1hcmtlZCI9PT10PyJzY2FuQ29kZTpvayI6InNjYW5Db2RlOmZhaWwgIituLm1lc3NhZ2V9LG9uQ2xvc2U6ZnVuY3Rpb24oKXtpJiZDdi5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKSxvaSh0LHJ8fHtlcnJNc2c6InNjYW5Db2RlOmZhaWwgY2FuY2VsIn0pfX0pO2kmJihDdi5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0Iiksby53ZWJ2aWV3LmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZSxuPWUucmVzdWx0OyJzdGFydCI9PT10P0N2Lm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpOiJlbmQiIT09dHx8bnx8Q3YubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJsaWdodCIpfSkpfX0pO2Z1bmN0aW9uIFRhKCl7aWYoImlvcyIhPT1Ddi5vcy5uYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuITE7dmFyIGU9YWkoImZhY2VJRCIpO3JldHVybiEoIWV8fCFlLmlzU3VwcG9ydCgpKX1mdW5jdGlvbiBPYSgpe3JldHVybiEoIUN2LmZpbmdlcnByaW50fHwhQ3YuZmluZ2VycHJpbnQuaXNTdXBwb3J0KCkpfWZ1bmN0aW9uIEVhKCl7dmFyIGU9W107cmV0dXJuIE9hKCkmJmUucHVzaCgiZmluZ2VyUHJpbnQiKSxUYSgpJiZlLnB1c2goImZhY2lhbCIpLHtzdXBwb3J0TW9kZTplLGVyck1zZzoiY2hlY2tJc1N1cHBvcnRTb3RlckF1dGhlbnRpY2F0aW9uOm9rIn19ZnVuY3Rpb24gQWEoZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUuY2hlY2tBdXRoTW9kZTtpZigiZmluZ2VyUHJpbnQiPT09dClyZXR1cm4gT2EoKT97aXNFbnJvbGxlZDpDdi5maW5nZXJwcmludC5pc0tleWd1YXJkU2VjdXJlKCkmJkN2LmZpbmdlcnByaW50LmlzRW5yb2xsZWRGaW5nZXJwcmludHMoKSxlcnJNc2c6ImNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6b2sifTp7aXNFbnJvbGxlZDohMSxlcnJNc2c6ImNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6ZmFpbCBub3Qgc3VwcG9ydCJ9O2lmKCJmYWNpYWwiPT09dCl7aWYoVGEoKSl7dmFyIG49YWkoImZhY2VJRCIpO3JldHVybntpc0Vucm9sbGVkOm4mJm4uaXNLZXlndWFyZFNlY3VyZSgpJiZuLmlzRW5yb2xsZWRGYWNlSUQoKSxlcnJNc2c6ImNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6b2sifX1yZXR1cm57aXNFbnJvbGxlZDohMSxlcnJNc2c6ImNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6ZmFpbCBub3Qgc3VwcG9ydCJ9fXJldHVybntpc0Vucm9sbGVkOiExLGVyck1zZzoiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZTpmYWlsIG5vdCBzdXBwb3J0In19dmFyIElhLCRhLFBhPSEwO3ZhciBNYSxqYT1bXSxMYT17aWQ6IjAiLGluaXQ6ZnVuY3Rpb24oZSxuKXtlJiZlLmxpc3QubGVuZ3RoJiYoSWE9ZSk7dHJ5eyRhPWFpKCJ1bmktdGFidmlldyIpfWNhdGNoKGUpe2NvbnNvbGUubG9nKCd1bmkucmVxdWlyZU5hdGl2ZVBsdWdpbigidW5pLXRhYnZpZXciKSBlcnJvciAnK2UpfSRhLm9uTWFza0NsaWNrKGZ1bmN0aW9uKCl7amEuZm9yRWFjaChmdW5jdGlvbihlKXtlKCl9KX0pLCRhJiYkYS5vbkNsaWNrKGZ1bmN0aW9uKGUpe3ZhciB0PWUuaW5kZXg7bihJYS5saXN0W3RdLHQpfSksJGEmJiRhLm9uTWlkQnV0dG9uQ2xpY2soZnVuY3Rpb24oKXtzaSgib25UYWJCYXJNaWRCdXR0b25UYXAiLHt9KX0pfSxpbmRleE9mOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuY29uZmlnLG49dCYmdC5saXN0JiZ0Lmxpc3QubGVuZ3RoO2lmKG4pZm9yKHZhciByPTA7cjxuO3IrKylpZih0Lmxpc3Rbcl0ucGFnZVBhdGg9PT1lfHx0Lmxpc3Rbcl0ucGFnZVBhdGg9PT1lKyIuaHRtbCIpcmV0dXJuIHI7cmV0dXJuLTF9LHN3aXRjaFRhYjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmluZGV4T2YoZSk7cmV0dXJuIDA8PXQmJigkYSYmJGEuc3dpdGNoU2VsZWN0KHtpbmRleDp0fSksITApfSxzZXRUYWJCYXJCYWRnZTpmdW5jdGlvbihlLHQsbil7JGEmJigibm9uZSI9PT1lPygkYS5oaWRlVGFiQmFyUmVkRG90KHtpbmRleDp0fSksJGEucmVtb3ZlVGFiQmFyQmFkZ2Uoe2luZGV4OnR9KSk6InRleHQiPT09ZT8kYS5zZXRUYWJCYXJCYWRnZSh7aW5kZXg6dCx0ZXh0Om59KToicmVkRG90Ij09PWUmJiRhLnNob3dUYWJCYXJSZWREb3Qoe2luZGV4OnR9KSl9LHNldFRhYkJhckl0ZW06ZnVuY3Rpb24oZSx0LG4scixpLG8pe3ZhciBhPXtpbmRleDplfTtpZih2b2lkIDAhPT10JiYoYS50ZXh0PXQpLG4mJihhLmljb25QYXRoPV9pKG4pKSxyJiYoYS5zZWxlY3RlZEljb25QYXRoPV9pKHIpKSx2b2lkIDAhPT1vJiYoYS5pY29uZm9udD1vKSx2b2lkIDAhPT1pKXthLnZpc2libGU9SWEubGlzdFtlXS52aXNpYmxlPWksZGVsZXRlIGEuaW5kZXg7dmFyIHM9SWEubGlzdC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJue3Zpc2libGU6ZS52aXNpYmxlfX0pO3NbZV09YSwkYSYmJGEuc2V0VGFiQmFySXRlbXMoe2xpc3Q6c30pfWVsc2UgJGEmJiRhLnNldFRhYkJhckl0ZW0oYSl9LHNldFRhYkJhclN0eWxlOmZ1bmN0aW9uKGUpeyRhJiYkYS5zZXRUYWJCYXJTdHlsZShlKX0saGlkZVRhYkJhcjpmdW5jdGlvbihlKXtQYT0hMSwkYSYmJGEuaGlkZVRhYkJhcih7YW5pbWF0aW9uOmV9KX0sc2hvd1RhYkJhcjpmdW5jdGlvbihlKXtQYT0hMCwkYSYmJGEuc2hvd1RhYkJhcih7YW5pbWF0aW9uOmV9KX0sYXBwZW5kOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXM7JGEmJiRhLmFwcGVuZCh7aWQ6dC5pZH0sZnVuY3Rpb24oZSl7MCE9PWUuY29kZSYmT3YoZnVuY3Rpb24oKXtuLmFwcGVuZCh0KX0sMjApfSl9LGdldCBjb25maWcoKXtyZXR1cm4gSWF8fCR2LnRhYkJhcn0sZ2V0IHZpc2libGUoKXtyZXR1cm4gUGF9LGdldCBoZWlnaHQoKXt2YXIgZT10aGlzLmNvbmZpZztyZXR1cm4oZSYmZS5oZWlnaHQ/cGFyc2VGbG9hdChlLmhlaWdodCk6NTApK0N2Lm5hdmlnYXRvci5nZXRTYWZlQXJlYUluc2V0cygpLmRldmljZUJvdHRvbX0sZ2V0IGNvdmVyKCl7dmFyIGU9dGhpcy5jb25maWc7cmV0dXJuIGUmJjA8PVsiZXh0cmFsaWdodCIsImxpZ2h0IiwiZGFyayJdLmluZGV4T2YoZS5ibHVyRWZmZWN0KX0sc2V0U3R5bGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tYXNrOyRhLnNldE1hc2soe2NvbG9yOnR9KX0sYWRkRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihlLHQpe2phLnB1c2godCl9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj1qYS5pbmRleE9mKHQpO2phLnNwbGljZShuLDEpfX07ZnVuY3Rpb24gTmEoKXtyZXR1cm4gQ3YubmF2aWdhdG9yLmlzSW1tZXJzZWRTdGF0dXNiYXIoKT9NYXRoLnJvdW5kKCJpT1MiPT09Q3Yub3MubmFtZT9Ddi5uYXZpZ2F0b3IuZ2V0U2FmZUFyZWFJbnNldHMoKS50b3A6Q3YubmF2aWdhdG9yLmdldFN0YXR1c2JhckhlaWdodCgpKTowfWZ1bmN0aW9uIEJhKCl7dmFyIGUsdCxuLHIsaT0iaW9zIj09PUN2Lm9zLm5hbWUudG9Mb3dlckNhc2UoKSxvPShlPUN2LnNjcmVlbi5nZXRDdXJyZW50U2l6ZSgpLHQ9ZS5yZXNvbHV0aW9uV2lkdGgsbj1lLnJlc29sdXRpb25IZWlnaHQse3NjcmVlbldpZHRoOk1hdGgucm91bmQodCksc2NyZWVuSGVpZ2h0Ok1hdGgucm91bmQobil9KSxhPW8uc2NyZWVuV2lkdGgscz1vLnNjcmVlbkhlaWdodCxjPU5hKCksdT17aGVpZ2h0OjAsY292ZXI6ITF9LGw9Z2koKTtpZihsKXt2YXIgZD1sLmdldFN0eWxlKCk7KGQ9ZCYmZC50aXRsZU5WaWV3KSYmZC50eXBlJiYibm9uZSIhPT1kLnR5cGUmJih1LmhlaWdodD0idHJhbnNwYXJlbnQiPT09ZC50eXBlPzA6YytZZSx1LmNvdmVyPSJ0cmFuc3BhcmVudCI9PT1kLnR5cGV8fCJmbG9hdCI9PT1kLnR5cGUpLHI9bC5nZXRTYWZlQXJlYUluc2V0cygpfWVsc2Ugcj1Ddi5uYXZpZ2F0b3IuZ2V0U2FmZUFyZWFJbnNldHMoKTt2YXIgZj17aGVpZ2h0OjAsY292ZXI6ITF9O2RpKCkmJihmLmhlaWdodD1MYS52aXNpYmxlP0xhLmhlaWdodDowLGYuY292ZXI9TGEuY292ZXIpO3ZhciBwPXUuY292ZXI/dS5oZWlnaHQ6MCxoPWYuY292ZXI/Zi5oZWlnaHQ6MCx2PXMtdS5oZWlnaHQtZi5oZWlnaHQsZz1zLSh1LmNvdmVyPzA6dS5oZWlnaHQpLShmLmNvdmVyPzA6Zi5oZWlnaHQpLG09YTtmLmhlaWdodCYmIWYuY292ZXJ8fHIuYm90dG9tfHwhci5kZXZpY2VCb3R0b218fCh2LT1yLmRldmljZUJvdHRvbSxnLT1yLmRldmljZUJvdHRvbSk7dmFyIHk9e2xlZnQ6KHI9aT9yOntsZWZ0OjAscmlnaHQ6MCx0b3A6dS5oZWlnaHQmJiF1LmNvdmVyPzA6Yyxib3R0b206MH0pLmxlZnQscmlnaHQ6bS1yLnJpZ2h0LHRvcDpyLnRvcCxib3R0b206Zy1yLmJvdHRvbSx3aWR0aDptLXIubGVmdC1yLnJpZ2h0LGhlaWdodDpnLXIudG9wLXIuYm90dG9tfTtyZXR1cm57cGl4ZWxSYXRpbzpDdi5zY3JlZW4uc2NhbGUsc2NyZWVuV2lkdGg6YSxzY3JlZW5IZWlnaHQ6cyx3aW5kb3dXaWR0aDptLHdpbmRvd0hlaWdodDp2LHN0YXR1c0JhckhlaWdodDpjLHNhZmVBcmVhOnksc2FmZUFyZWFJbnNldHM6e3RvcDpyLnRvcCxyaWdodDpyLnJpZ2h0LGJvdHRvbTpyLmJvdHRvbSxsZWZ0OnIubGVmdH0sd2luZG93VG9wOnAsd2luZG93Qm90dG9tOmgsc2NyZWVuVG9wOnMtdn19dmFyIERhPXt9LFJhPSEwO2Z1bmN0aW9uIEZhKCl7aWYoUmEpe3ZhciBlPXh2LnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRTeXN0ZW1JbmZvU3luYztpZigic3RyaW5nIj09dHlwZW9mKERhPWUoKSkpdHJ5e0RhPUpTT04ucGFyc2UoRGEpfWNhdGNoKGUpe319fWZ1bmN0aW9uIHphKCl7RmEoKTt2YXIgZT1EYS5kZXZpY2VCcmFuZDt2b2lkIDA9PT1lJiYoZT0iIik7dmFyIHQ9RGEuZGV2aWNlTW9kZWwsbj1EYS5vc05hbWUscj1EYS5vc1ZlcnNpb24saT1EYS5kZXZpY2VPcmllbnRhdGlvbixvPURhLmRldmljZVR5cGUsYT1lLnRvTG93ZXJDYXNlKCkscz1uLnRvTG93ZXJDYXNlKCk7cmV0dXJue2JyYW5kOmEsZGV2aWNlQnJhbmQ6YSxkZXZpY2VNb2RlbDp0LGRldmljZVBpeGVsUmF0aW86Q3Yuc2NyZWVuLnNjYWxlLGRldmljZUlkOk1hPU1hfHxDdi5kZXZpY2UudXVpZCxkZXZpY2VPcmllbnRhdGlvbjppLGRldmljZVR5cGU6byxtb2RlbDp0LHBsYXRmb3JtOnMsc3lzdGVtOigiaW9zIj09PXM/ImlPUyI6IkFuZHJvaWQiKSsiICIrcn19ZnVuY3Rpb24gVmEoKXtGYSgpO3ZhciBlPURhLmhvc3RQYWNrYWdlTmFtZSx0PURhLmhvc3ROYW1lLG49RGEub3NMYW5ndWFnZSxyPURhLmhvc3RWZXJzaW9uLGk9RGEuaG9zdExhbmd1YWdlLG89RGEuaG9zdFRoZW1lO3JldHVybnthcHBJZDpEYS5hcHBJZCxhcHBOYW1lOkRhLmFwcE5hbWUsYXBwVmVyc2lvbjpEYS5hcHBWZXJzaW9uLGFwcFZlcnNpb25Db2RlOkRhLmFwcFZlcnNpb25Db2RlLGFwcFdndFZlcnNpb246RGEuYXBwV2d0VmVyc2lvbixhcHBMYW5ndWFnZTpNdiYmTXYuZ2V0TG9jYWxlP012LmdldExvY2FsZSgpOmksZW5hYmxlRGVidWc6ITEsaG9zdFNES1ZlcnNpb246dm9pZCAwLGhvc3RQYWNrYWdlTmFtZTplLGhvc3ROYW1lOnQsaG9zdFZlcnNpb246cixob3N0TGFuZ3VhZ2U6aSxob3N0VGhlbWU6byxob3N0Rm9udFNpemVTZXR0aW5nOnZvaWQgMCxsYW5ndWFnZTpuLFNES1ZlcnNpb246IiIsdGhlbWU6dm9pZCAwLHZlcnNpb246Q3YucnVudGltZS5pbm5lclZlcnNpb259fWZ1bmN0aW9uIFVhKCl7UmE9ITAsRmEoKSxSYT0hMTt2YXIgZT1CYSgpLHQ9emEoKSxuPVZhKCk7UmE9ITA7dmFyIHI9e2Vyck1zZzoiZ2V0U3lzdGVtSW5mbzpvayIsZm9udFNpemVTZXR0aW5nOm4uaG9zdEZvbnRTaXplU2V0dGluZyxvc05hbWU6RGEub3NOYW1lLnRvTG93ZXJDYXNlKCl9O0RhLmhvc3ROYW1lJiYoci5ob3N0U0RLVmVyc2lvbj1EYS51bmlSdW50aW1lVmVyc2lvbik7dmFyIGksbyxhPU9iamVjdC5hc3NpZ24oe30sRGEsZSx0LG4scik7cmV0dXJuIGRlbGV0ZSBhLnNjcmVlblRvcCxkZWxldGUgYS5lbmFibGVEZWJ1ZyxkZWxldGUgYS50aGVtZSxvPXt9LFQoaT1hKSYmT2JqZWN0LmtleXMoaSkuc29ydCgpLmZvckVhY2goZnVuY3Rpb24oZSl7b1tlXT1pW2VdfSksT2JqZWN0LmtleXMobyk/bzppfWZ1bmN0aW9uIHFhKCl7dmFyIGU9KDAseHYucmVxdWlyZU1vZHVsZSgicGx1cyIpLmdldEFwcEF1dGhvcml6ZVNldHRpbmcpKCk7dHJ5eyJzdHJpbmciPT10eXBlb2YgZSYmKGU9SlNPTi5wYXJzZShlKSl9Y2F0Y2goZSl7fWZvcih2YXIgdCBpbiBlKXtpZihPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpKSJ1bmRlZmluZWQiPT09ZVt0XSYmKGVbdF09dm9pZCAwKX1yZXR1cm4gZX12YXIgV2E9InVuaWFwcF9zYXZlIixIYT0iX2RvYy8iK1dhO2Z1bmN0aW9uIEdhKHQsbil7bj1ufHxmdW5jdGlvbigpe30sQ3YuaW8ucmVxdWVzdEZpbGVTeXN0ZW0oQ3YuaW8uUFJJVkFURV9ET0MsZnVuY3Rpb24oZSl7ZS5yb290LmdldERpcmVjdG9yeShXYSx7Y3JlYXRlOiEwfSx0LG4pfSxuKX12YXIgWGE9MDt2YXIgWWE9QWkoImlvIiwiZ2V0RmlsZUluZm8iKTt2YXIgSmE9ImNob29zZUxvY2F0aW9uIjt2YXIgS2E9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY2hvb3NlTG9jYXRpb246ZnVuY3Rpb24oZSx0KXt2YXIgbj1Ddi5uYXZpZ2F0b3IuZ2V0U3RhdHVzQmFyU3R5bGUoKSxyPUN2LndlYnZpZXcuY3JlYXRlKCJfd3d3L19fdW5pYXBwY2hvb3NlbG9jYXRpb24uaHRtbCIsY28se3RpdGxlTlZpZXc6e2F1dG9CYWNrQnV0dG9uOiEwLGJhY2tncm91bmRDb2xvcjoiIzAwMDAwMCIsdGl0bGVDb2xvcjoiI2ZmZmZmZiIsdGl0bGVUZXh0OiLpgInmi6nkvY3nva4iLHRpdGxlU2l6ZToiMTdweCIsYnV0dG9uczpbe2Zsb2F0OiJyaWdodCIsdGV4dDoi5a6M5oiQIixmb250U2l6ZToiMTdweCIsd2lkdGg6IjYwcHgiLG9uY2xpY2s6ZnVuY3Rpb24oKXtyLmV2YWxKUygiX19jaG9vc2VMb2NhdGlvbkNvbmZpcm1fXygpIil9fV19LHBvcEdlc3R1cmU6ImNsb3NlIixzY3JvbGxJbmRpY2F0b3I6Im5vbmUifSx7X191bmlhcHBfdHlwZToibWFwIixfX3VuaWFwcF9zdGF0dXNiYXJfc3R5bGU6biwidW5pLWFwcCI6Im5vbmUifSk7ImRhcmsiPT09biYmKEN2Lm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgibGlnaHQiKSxyLmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZSxuPWUucmVzdWx0OyJzdGFydCI9PT10P0N2Lm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpOiJlbmQiIT09dHx8bnx8Q3YubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJsaWdodCIpfSkpO3ZhciBpLG89MCxhPWZ1bmN0aW9uKCl7Mj09KytvJiZyLmV2YWxKUygiX19jaG9vc2VMb2NhdGlvbl9fKCIrSlNPTi5zdHJpbmdpZnkoZSkrIikiKX07ci5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWQiLGEpLHIuc2hvdygic2xpZGUtaW4tYm90dG9tIixZbyxhKSxyLmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIixmdW5jdGlvbigpe2k/b2kodCx7bmFtZTppLnBvaW5hbWUsYWRkcmVzczppLnBvaWFkZHJlc3MsbGF0aXR1ZGU6aS5sYXRsbmcubGF0LGxvbmdpdHVkZTppLmxhdGxuZy5sbmcsZXJyTXNnOiJjaG9vc2VMb2NhdGlvbjpvayJ9KTooY2EoSmEpLG9pKHQse2Vyck1zZzoiY2hvb3NlTG9jYXRpb246ZmFpbCBjYW5jZWwifSkpfSksdWEoSmEsZnVuY3Rpb24oZSl7ZSYmImxhdGxuZyJpbiBlJiYoaT1lKX0sITEpfX0pO3ZhciBaYT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjaG9vc2VMb2NhdGlvbjpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT0ibGlnaHQiIT09KCJVSVN0YXR1c0JhclN0eWxlQmxhY2tUcmFuc2x1Y2VudCI9PT0obj1Ddi5uYXZpZ2F0b3IuZ2V0U3RhdHVzQmFyU3R5bGUoKSl8fCJVSVN0YXR1c0JhclN0eWxlQmxhY2tPcGFxdWUiPT09bnx8Im51bGwiPT09bj9uPSJsaWdodCI6IlVJU3RhdHVzQmFyU3R5bGVEZWZhdWx0Ij09PW4mJihuPSJkYXJrIiksbiksbz14YSh7dXJsOiJfX3VuaWFwcGNob29zZWxvY2F0aW9uIixkYXRhOk9iamVjdC5hc3NpZ24oe30sZSx7bG9jYWxlOmV0KCl9KSxzdHlsZTp7YW5pbWF0aW9uVHlwZTplLmFuaW1hdGlvblR5cGV8fCJzbGlkZS1pbi1ib3R0b20iLHRpdGxlTlZpZXc6ITEscG9wR2VzdHVyZToiY2xvc2UiLHNjcm9sbEluZGljYXRvcjoibm9uZSJ9LG9uTWVzc2FnZTpmdW5jdGlvbihlKXt2YXIgdD1lLmV2ZW50LG49ZS5kZXRhaWw7InNlbGVjdGVkIj09PXQmJigocj1uKS5lcnJNc2c9ImNob29zZUxvY2F0aW9uOm9rIil9LG9uQ2xvc2U6ZnVuY3Rpb24oKXtpJiZDdi5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKSxvaSh0LHJ8fHtlcnJNc2c6ImNob29zZUxvY2F0aW9uOmZhaWwgY2FuY2VsIn0pfX0pO2kmJihDdi5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0Iiksby53ZWJ2aWV3LmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZSxuPWUucmVzdWx0OyJzdGFydCI9PT10P0N2Lm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpOiJlbmQiIT09dHx8bnx8Q3YubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJsaWdodCIpfSkpfX0pO2Z1bmN0aW9uIFFhKGUsdCxuKXt2YXIgcixpPXQuY29vcmRzO2UhPT10LmNvb3Jkc1R5cGUmJigid2dzODQiPT09ZT9yPWZ1bmN0aW9uKGUsdCl7aWYoQ2koZT0rZSx0PSt0KSlyZXR1cm5bZSx0XTt2YXIgbj1TaShlLTEwNSx0LTM1KSxyPXhpKGUtMTA1LHQtMzUpLGk9dC8xODAqYmksbz1NYXRoLnNpbihpKTtvPTEta2kqbypvO3ZhciBhPU1hdGguc3FydChvKTtyZXR1cm4gbj0xODAqbi8od2kqKDEta2kpLyhvKmEpKmJpKSxbMiplLShlKyhyPTE4MCpyLyh3aS9hKk1hdGguY29zKGkpKmJpKSkpLDIqdC0odCtuKV19KGkubG9uZ2l0dWRlLGkubGF0aXR1ZGUpOiJnY2owMiI9PT1lJiYocj1mdW5jdGlvbihlLHQpe2lmKENpKGU9K2UsdD0rdCkpcmV0dXJuW2UsdF07dmFyIG49U2koZS0xMDUsdC0zNSkscj14aShlLTEwNSx0LTM1KSxpPXQvMTgwKmJpLG89TWF0aC5zaW4oaSk7bz0xLWtpKm8qbzt2YXIgYT1NYXRoLnNxcnQobyk7cmV0dXJuIG49MTgwKm4vKHdpKigxLWtpKS8obyphKSpiaSksW2UrKHI9MTgwKnIvKHdpL2EqTWF0aC5jb3MoaSkqYmkpKSx0K25dfShpLmxvbmdpdHVkZSxpLmxhdGl0dWRlKSksciYmKGkubG9uZ2l0dWRlPXJbMF0saS5sYXRpdHVkZT1yWzFdKSk7b2kobix7dHlwZTplLGFsdGl0dWRlOmkuYWx0aXR1ZGV8fDAsbGF0aXR1ZGU6aS5sYXRpdHVkZSxsb25naXR1ZGU6aS5sb25naXR1ZGUsc3BlZWQ6aS5zcGVlZCxhY2N1cmFjeTppLmFjY3VyYWN5LGFkZHJlc3M6dC5hZGRyZXNzLGVyck1zZzoiZ2V0TG9jYXRpb246b2sifSl9dmFyIGVzPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLG9wZW5Mb2NhdGlvbjpmdW5jdGlvbihlKXt2YXIgdD1Ddi5uYXZpZ2F0b3IuZ2V0U3RhdHVzQmFyU3R5bGUoKSxuPUN2LndlYnZpZXcuY3JlYXRlKCJfd3d3L19fdW5pYXBwb3BlbmxvY2F0aW9uLmh0bWwiLGNvLHt0aXRsZU5WaWV3OnthdXRvQmFja0J1dHRvbjohMCx0aXRsZUNvbG9yOiIjZmZmZmZmIix0aXRsZVRleHQ6IiIsdGl0bGVTaXplOiIxN3B4Iix0eXBlOiJ0cmFuc3BhcmVudCJ9LHBvcEdlc3R1cmU6ImNsb3NlIixzY3JvbGxJbmRpY2F0b3I6Im5vbmUifSx7X191bmlhcHBfdHlwZToibWFwIixfX3VuaWFwcF9zdGF0dXNiYXJfc3R5bGU6dCwidW5pLWFwcCI6Im5vbmUifSk7cmV0dXJuImxpZ2h0Ij09PXQmJihDdi5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKSxuLmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZSxuPWUucmVzdWx0OyJzdGFydCI9PT10P0N2Lm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgibGlnaHQiKToiZW5kIiE9PXR8fG58fEN2Lm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpfSkpLG4uc2hvdyhYbyxZbyxmdW5jdGlvbigpe24uZXZhbEpTKCJfX29wZW5Mb2NhdGlvbl9fKCIrSlNPTi5zdHJpbmdpZnkoZSkrIikiKX0pLHtlcnJNc2c6Im9wZW5Mb2NhdGlvbjpvayJ9fX0pO3ZhciB0cz1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvcGVuTG9jYXRpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4geGEoe3VybDoiX191bmlhcHBvcGVubG9jYXRpb24iLGRhdGE6T2JqZWN0LmFzc2lnbih7fSxlLHtsb2NhbGU6ZXQoKX0pLHN0eWxlOnt0aXRsZU5WaWV3Ont0eXBlOiJ0cmFuc3BhcmVudCJ9LHBvcEdlc3R1cmU6ImNsb3NlIixiYWNrQnV0dG9uQXV0b0NvbnRyb2w6ImNsb3NlIn0sb25DbG9zZTpmdW5jdGlvbigpe29pKHQse2Vyck1zZzoib3BlbkxvY2F0aW9uOmZhaWwgY2FuY2VsIn0pfX0pLHtlcnJNc2c6Im9wZW5Mb2NhdGlvbjpvayJ9fX0pO3ZhciBucyxycyxpcyxvcyxhczt2YXIgc3MsY3MsdXM9QWkoImlvIiwiZ2V0SW1hZ2VJbmZvIixmdW5jdGlvbihlKXtyZXR1cm4gZS5zYXZlUGF0aD1lLmZpbGVuYW1lPWxvKyIvZG93bmxvYWQvIixlfSksbHM9QWkoImlvIiwiZ2V0VmlkZW9JbmZvIixmdW5jdGlvbihlKXtyZXR1cm4gZS5maWxlUGF0aD1lLnNyYyxlfSxmdW5jdGlvbihlKXtyZXR1cm57b3JpZW50YXRpb246ZS5vcmllbnRhdGlvbix0eXBlOmUudHlwZSxkdXJhdGlvbjplLmR1cmF0aW9uLHNpemU6ZS5zaXplLzEwMjQsaGVpZ2h0OmUuaGVpZ2h0LHdpZHRoOmUud2lkdGgsZnBzOmUuZnBzfHwzMCxiaXRyYXRlOmUuYml0cmF0ZX19KTt2YXIgZHM9ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT10JiYodD17fSksc2koIm9uUmVjb3JkZXJTdGF0ZUNoYW5nZSIsT2JqZWN0LmFzc2lnbih7c3RhdGU6ZX0sdCkpfSxmcz17c3RhcnQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmR1cmF0aW9uO3ZvaWQgMD09PW4mJihuPTZlNCk7dmFyIHI9ZS5zYW1wbGVSYXRlLGk9KGUubnVtYmVyT2ZDaGFubmVscyxlLmVuY29kZUJpdFJhdGUsZS5mb3JtYXQpO3ZvaWQgMD09PWkmJihpPSJtcDMiKTtlLmZyYW1lU2l6ZTt2YXIgbz1lLmF1ZGlvU291cmNlO2lmKHZvaWQgMD09PW8mJihvPSJhdXRvIiksc3MpcmV0dXJuIGRzKCJzdGFydCIpOyhzcz1Ddi5hdWRpby5nZXRSZWNvcmRlcigpKS5yZWNvcmQoe2Zvcm1hdDppLHNhbXBsZXJhdGU6cixmaWxlbmFtZTpsbysiL3JlY29yZGVyLyJ9LGZ1bmN0aW9uKGUpe3JldHVybiBkcygic3RvcCIse3RlbXBGaWxlUGF0aDplfSl9LGZ1bmN0aW9uKGUpe3JldHVybiBkcygiZXJyb3IiLHtlcnJNc2c6ZS5tZXNzYWdlfSl9KSxjcz1PdihmdW5jdGlvbigpe2ZzLnN0b3AoKX0sbiksZHMoInN0YXJ0Iil9LHN0b3A6ZnVuY3Rpb24oKXtzcyYmKHNzLnN0b3AoKSxzcz0hMSxjcyYmRXYoY3MpKX0scGF1c2U6ZnVuY3Rpb24oKXtzcyYmZHMoImVycm9yIix7ZXJyTXNnOiJVbnN1cHBvcnRlZCBvcGVyYXRpb246IHBhdXNlIn0pfSxyZXN1bWU6ZnVuY3Rpb24oKXtzcyYmZHMoImVycm9yIix7ZXJyTXNnOiJVbnN1cHBvcnRlZCBvcGVyYXRpb246IHJlc3VtZSJ9KX19O3ZhciBwcz0wLGhzPXt9LHZzPWZ1bmN0aW9uKGUpe3NpKCJvbkRvd25sb2FkVGFza1N0YXRlQ2hhbmdlIixlKX07dmFyIGdzPTAsbXM9e30seXM9ZnVuY3Rpb24oZSl7c2koIm9uUmVxdWVzdFRhc2tTdGF0ZUNoYW5nZSIsZSksZGVsZXRlIG1zW2dzXX0sX3M9ZnVuY3Rpb24oZSl7dmFyIHQ9ZVsiU2V0LUNvb2tpZSJdfHxlWyJzZXQtY29va2llIl0sbj1bXTtpZighdClyZXR1cm5bXTsiWyI9PT10WzBdJiYiXSI9PT10W3QubGVuZ3RoLTFdJiYodD10LnNsaWNlKDEsLTEpKTtmb3IodmFyIHI9dC5zcGxpdCgiOyIpLGk9MDtpPHIubGVuZ3RoO2krKyktMSE9PXJbaV0uaW5kZXhPZigiRXhwaXJlcz0iKXx8LTEhPT1yW2ldLmluZGV4T2YoImV4cGlyZXM9Iik/bi5wdXNoKHJbaV0ucmVwbGFjZSgiLCIsIiIpKTpuLnB1c2gocltpXSk7cmV0dXJuIG49bi5qb2luKCI7Iikuc3BsaXQoIiwiKX07ZnVuY3Rpb24gYnMoYyxlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS51cmwsbj1lLmRhdGEscj1lLmhlYWRlcixpPWUubWV0aG9kO3ZvaWQgMD09PWkmJihpPSJHRVQiKTt2YXIgdT1lLnJlc3BvbnNlVHlwZSxvPWUuc3NsVmVyaWZ5O3ZvaWQgMD09PW8mJihvPSEwKTt2YXIgYT1lLmZpcnN0SXB2NDt2b2lkIDA9PT1hJiYoYT0hMSk7dmFyIHM9ZS50bHMsbD1lLnRpbWVvdXQ7dm9pZCAwPT09bCYmKGw9JHYubmV0d29ya1RpbWVvdXQmJiR2Lm5ldHdvcmtUaW1lb3V0LnJlcXVlc3R8fDZlNCk7dmFyIGQsZixwPWFpKCJzdHJlYW0iKSxoPXt9LHY9ITE7Zm9yKHZhciBnIGluIHIpaWYodnx8ImNvbnRlbnQtdHlwZSIhPT1nLnRvTG93ZXJDYXNlKCkpaFtnXT1yW2ddO2Vsc2UgaWYodj0hMCxoWyJDb250ZW50LVR5cGUiXT1yW2ddLCJHRVQiIT09aSYmMD09PXJbZ10uaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJiJzdHJpbmciIT10eXBlb2YgbiYmIShuIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXt2YXIgbT1bXTtmb3IodmFyIHkgaW4gbilrKG4seSkmJm0ucHVzaChlbmNvZGVVUklDb21wb25lbnQoeSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChuW3ldKSk7bj1tLmpvaW4oIiYiKX12fHwiUE9TVCIhPT1pfHwoaFsiQ29udGVudC1UeXBlIl09ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIpLGwmJihkPU92KGZ1bmN0aW9uKCl7Zj0hMCx5cyh7cmVxdWVzdFRhc2tJZDpjLHN0YXRlOiJmYWlsIixzdGF0dXNDb2RlOjAsZXJyTXNnOiJ0aW1lb3V0In0pfSxsKzIwMCkpO3ZhciBfLGI9e21ldGhvZDppLHVybDp0LnRyaW0oKSxoZWFkZXJzOmgsdHlwZToiYXJyYXlidWZmZXIiPT09dT8iYmFzZTY0IjoidGV4dCIsdGltZW91dDpsfHw2ZTUsc3NsVmVyaWZ5OiFvLGZpcnN0SXB2NDphLHRsczpzfTsiR0VUIiE9PWkmJigiW29iamVjdCBBcnJheUJ1ZmZlcl0iPT09dG9TdHJpbmcuY2FsbChuKT9fPSEwOmIuYm9keT0ic3RyaW5nIj09dHlwZW9mIG4/bjpKU09OLnN0cmluZ2lmeShuKSk7dmFyIHc9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vayxuPWUuc3RhdHVzLHI9ZS5kYXRhLGk9ZS5oZWFkZXJzLG89ZS5lcnJvck1zZztpZighZil7ZCYmRXYoZCk7dmFyIGE9bjtpZigwPGEpeXMoe3JlcXVlc3RUYXNrSWQ6YyxzdGF0ZToic3VjY2VzcyIsZGF0YTp0JiYiYXJyYXlidWZmZXIiPT09dT9maShyKTpyLHN0YXR1c0NvZGU6YSxoZWFkZXI6aSxjb29raWVzOl9zKGkpfSk7ZWxzZXt2YXIgcz0iYWJvcnQgc3RhdHVzQ29kZToiK2E7byYmKHM9cysiICIrbykseXMoe3JlcXVlc3RUYXNrSWQ6YyxzdGF0ZToiZmFpbCIsc3RhdHVzQ29kZTphLGVyck1zZzpzfSl9fX07dHJ5e18/cC5mZXRjaFdpdGhBcnJheUJ1ZmZlcih7IkB0eXBlIjoiYmluYXJ5IixiYXNlNjQ6cGkobil9LGIsdyk6cC5mZXRjaChiLHcpLG1zW2NdPXthYm9ydDpmdW5jdGlvbigpe2Y9ITAsZCYmRXYoZCkseXMoe3JlcXVlc3RUYXNrSWQ6YyxzdGF0ZToiZmFpbCIsc3RhdHVzQ29kZTowLGVyck1zZzoiYWJvcnQifSl9fX1jYXRjaChlKXtyZXR1cm57cmVxdWVzdFRhc2tJZDpjLGVyck1zZzoiY3JlYXRlUmVxdWVzdFRhc2s6ZmFpbCJ9fXJldHVybntyZXF1ZXN0VGFza0lkOmMsZXJyTXNnOiJjcmVhdGVSZXF1ZXN0VGFzazpvayJ9fXZhciB3cyxrcz17fSxTcz1mdW5jdGlvbihlKXtzaSgib25Tb2NrZXRUYXNrU3RhdGVDaGFuZ2UiLGUpfTt2YXIgeHM9ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT10JiYodD17fSk7dmFyIG49dC51cmwscj0odC5kYXRhLHQuaGVhZGVyKSxpPSh0Lm1ldGhvZCx0LnByb3RvY29scyksbz13c3x8KCh3cz1haSgidW5pLXdlYlNvY2tldCIpKS5vbm9wZW4oZnVuY3Rpb24oZSl7U3Moe3NvY2tldFRhc2tJZDplLmlkLHN0YXRlOiJvcGVuIn0pfSksd3Mub25tZXNzYWdlKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0YTtTcyh7c29ja2V0VGFza0lkOmUuaWQsc3RhdGU6Im1lc3NhZ2UiLGRhdGE6Im9iamVjdCI9PXR5cGVvZiB0P2ZpKHQuYmFzZTY0KTp0fSl9KSx3cy5vbmVycm9yKGZ1bmN0aW9uKGUpe1NzKHtzb2NrZXRUYXNrSWQ6ZS5pZCxzdGF0ZToiZXJyb3IiLGVyck1zZzplLmRhdGF9KX0pLHdzLm9uY2xvc2UoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5pZDtkZWxldGUga3NbdF0sU3Moe3NvY2tldFRhc2tJZDp0LHN0YXRlOiJjbG9zZSJ9KX0pLHdzKTtyZXR1cm4gby5XZWJTb2NrZXQoe2lkOmUsdXJsOm4scHJvdG9jb2w6QXJyYXkuaXNBcnJheShpKT9pLmpvaW4oIiwiKTppLGhlYWRlcjpyfSksa3NbZV09byx7c29ja2V0VGFza0lkOmUsZXJyTXNnOiJjcmVhdGVTb2NrZXRUYXNrOm9rIn19O3ZhciBDcz0wLFRzPXt9LE9zPWZ1bmN0aW9uKGUpe3NpKCJvblVwbG9hZFRhc2tTdGF0ZUNoYW5nZSIsZSl9O3ZhciBFcyxBcz17b2F1dGg6ZnVuY3Rpb24odCl7Q3Yub2F1dGguZ2V0U2VydmljZXMoZnVuY3Rpb24oZSl7dmFyIG49W107ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQ7bi5wdXNoKHQpfSksdChudWxsLG4sZSl9LGZ1bmN0aW9uKGUpe3QoZSl9KX0sc2hhcmU6ZnVuY3Rpb24odCl7Q3Yuc2hhcmUuZ2V0U2VydmljZXMoZnVuY3Rpb24oZSl7dmFyIG49W107ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQ7bi5wdXNoKHQpfSksdChudWxsLG4sZSl9LGZ1bmN0aW9uKGUpe3QoZSl9KX0scGF5bWVudDpmdW5jdGlvbih0KXtDdi5wYXltZW50LmdldENoYW5uZWxzKGZ1bmN0aW9uKGUpe3ZhciBuPVtdO2UuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLmlkO24ucHVzaCh0KX0pLHQobnVsbCxuLGUpfSxmdW5jdGlvbihlKXt0KGUpfSl9LHB1c2g6ZnVuY3Rpb24oZSl7aWYodm9pZCAwIT09eHZ8fHZvaWQgMCE9PUN2KXt2YXIgdD1Ddi5wdXNoLmdldENsaWVudEluZm8oKTtlKG51bGwsW3QuaWRdLFt0XSl9ZWxzZSBlKG51bGwsW10pfX07ZnVuY3Rpb24gSXMoaSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKG4scil7Q3Yub2F1dGguZ2V0U2VydmljZXMoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlkPT09aX0pO3Q/bih0KTpyKG5ldyBFcnJvcigicHJvdmlkZXIgbm90IGZpbmQiKSl9LHIpfSl9ZnVuY3Rpb24gJHMobixyLGUpe3ZvaWQgMD09PWUmJihlPSEwKTt2YXIgaT1uLnByb3ZpZGVyfHwid2VpeGluIixvPVJzKHIsImxvZ2luIixlKSxhPSJhcHBsZSI9PT1pLHM9YT97c2NvcGU6ImVtYWlsIn06bi51bml2ZXJpZnlTdHlsZT97dW5pdmVyaWZ5U3R5bGU6ZnVuY3Rpb24oZSxyKXtUKGUpJiZUKGUuYnV0dG9ucykmJiJBcnJheSI9PT1mKGUuYnV0dG9ucy5saXN0KSYmZS5idXR0b25zLmxpc3QuZm9yRWFjaChmdW5jdGlvbih0LG4pe2UuYnV0dG9ucy5saXN0W25dLm9uY2xpY2s9ZnVuY3Rpb24oKXt2YXIgZT17Y29kZToiMzAwMDgiLG1lc3NhZ2U6IueUqOaIt+eCueWHu+S6huiHquWumuS5ieaMiemSriIsaW5kZXg6bixwcm92aWRlcjp0LnByb3ZpZGVyfTtUKEVzKT9Fcy5fdHJpZ2dlclVuaXZlcmlmeUJ1dHRvbnNDbGljayhlKTpqcygpLnRoZW4oZnVuY3Rpb24oKXtyKGUpfSl9fSk7cmV0dXJuIGV9KG4udW5pdmVyaWZ5U3R5bGUsbyl9Ont9LGM9ZT9vaTpBLmludm9rZTtJcyhpKS50aGVuKGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXtuLm9ubHlBdXRob3JpemUmJiJ3ZWl4aW4iPT09aT9lLmF1dGhvcml6ZShmdW5jdGlvbihlKXt2YXIgdD1lLmNvZGU7YyhyLHtjb2RlOnQsYXV0aFJlc3VsdDoiIixlcnJNc2c6ImxvZ2luOm9rIn0pfSxvKTplLmxvZ2luKGZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0LmF1dGhSZXN1bHQsbj1lLnRhcmdldC5hcHBsZUluZm87YyhyLHtjb2RlOnQuY29kZSxhdXRoUmVzdWx0OnQsYXBwbGVJbmZvOm4sZXJyTXNnOiJsb2dpbjpvayJ9KX0sbyxzKX1hfHwidW5pdmVyaWZ5Ij09PWk/dCgpOmUubG9nb3V0KHQsdCl9KS5jYXRjaChvKX1mdW5jdGlvbiBQcyhhLHMpe3ZhciBjPWEucHJvdmlkZXJ8fCJ3ZWl4aW4iLGU9RWkocywib3BlcmF0ZVdYRGF0YSIpO0lzKGMpLnRoZW4oZnVuY3Rpb24obyl7by5nZXRVc2VySW5mbyhmdW5jdGlvbihlKXt2YXIgdDtpZigid2VpeGluIj09PWMpe3ZhciBuPW8udXNlckluZm87dD17b3BlbklkOm4ub3BlbmlkLG5pY2tOYW1lOm4ubmlja25hbWUsZ2VuZGVyOm4uc2V4LGNpdHk6bi5jaXR5LHByb3ZpbmNlOm4ucHJvdmluY2UsY291bnRyeTpuLmNvdW50cnksYXZhdGFyVXJsOm4uaGVhZGltZ3VybCx1bmlvbklkOm4udW5pb25pZH19ZWxzZSBpZigiYXBwbGUiPT09Yyl7dmFyIHI9by5hcHBsZUluZm87dD17b3BlbklkOnIudXNlcixmdWxsTmFtZTpyLmZ1bGxOYW1lLGVtYWlsOnIuZW1haWwsYXV0aG9yaXphdGlvbkNvZGU6ci5hdXRob3JpemF0aW9uQ29kZSxpZGVudGl0eVRva2VuOnIuaWRlbnRpdHlUb2tlbixyZWFsVXNlclN0YXR1czpyLnJlYWxVc2VyU3RhdHVzfX1lbHNlKHQ9by51c2VySW5mbykub3BlbklkPXQub3BlbklkfHx0Lm9wZW5pZHx8by5hdXRoUmVzdWx0Lm9wZW5pZCx0Lm5pY2tOYW1lPXQubmlja05hbWV8fHQubmlja25hbWUsdC5hdmF0YXJVcmw9dC5hdmF0YXJVcmx8fHQuaGVhZGltZ3VybDt2YXIgaT17ZXJyTXNnOiJvcGVyYXRlV1hEYXRhOm9rIn07YS5kYXRhJiYid2ViYXBpX2dldHVzZXJpbmZvIj09PWEuZGF0YS5hcGlfbmFtZT9pLmRhdGE9e2RhdGE6SlNPTi5zdHJpbmdpZnkodCkscmF3RGF0YToiIixzaWduYXR1cmU6IiIsZW5jcnlwdGVkRGF0YToiIixpdjoiIn06aS51c2VySW5mbz10LG9pKHMsaSl9LGUpfSkuY2F0Y2goZnVuY3Rpb24oKXtvaShzLHtlcnJNc2c6Im9wZXJhdGVXWERhdGE6ZmFpbCDor7flhYjosIPnlKggdW5pLmxvZ2luIn0pfSl9ZnVuY3Rpb24gTXMoZSx0LG4pe3ZhciByPURzKHQsInByZUxvZ2luIixuKSxpPVJzKHQsInByZUxvZ2luIixuKTtJcyhlLnByb3ZpZGVyKS50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiBlLnByZUxvZ2luKHIsaSl9KS5jYXRjaChpKX1mdW5jdGlvbiBqcygpe3JldHVybiBJcygidW5pdmVyaWZ5IikudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gZS5jbG9zZUF1dGhWaWV3KCl9KX1mdW5jdGlvbiBMcyhlLHQsbil7dmFyIHI9RHModCwiZ2V0Q2hlY2tCb3hTdGF0ZSIsbiksaT1Scyh0LCJnZXRDaGVja0JveFN0YXRlIixuKTt0cnl7SXMoInVuaXZlcmlmeSIpLnRoZW4oZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRDaGVja0JveFN0YXRlKCk7cih7c3RhdGU6dH0pfSl9Y2F0Y2goZSl7aShlKX19dmFyIE5zLEJzPWZ1bmN0aW9uKCl7dGhpcy5wcm92aWRlcj0idW5pdmVyaWZ5Iix0aGlzLmV2ZW50TmFtZT0iYXBpLnVuaXZlcmlmeUJ1dHRvbnNDbGljayJ9O2Z1bmN0aW9uIERzKHQsbixlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9ITApLGU/T2kodCxuKTpmdW5jdGlvbihlKXtBLmludm9rZSh0LE9iamVjdC5hc3NpZ24oe30sZSx7ZXJyTXNnOm4rIjpvayJ9KSl9fWZ1bmN0aW9uIFJzKHIsaSxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9ITApLGU/RWkocixpKTpmdW5jdGlvbihlKXt2YXIgdD1lLmNvZGU7dm9pZCAwPT09dCYmKHQ9MCk7dmFyIG49ZS5tZXNzYWdlO0EuaW52b2tlKHIse2Vyck1zZzppKyI6ZmFpbCAiKyhufHwiIiksZXJyQ29kZTp0LGNvZGU6dH0pfX1Ccy5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXtqcygpfSxCcy5wcm90b3R5cGUubG9naW49ZnVuY3Rpb24oZSl7dGhpcy5fd2FycChmdW5jdGlvbihlLHQpe3JldHVybiAkcyhlLHQsITEpfSxlKX0sQnMucHJvdG90eXBlLmdldENoZWNrQm94U3RhdGU9ZnVuY3Rpb24oZSl7dGhpcy5fd2FycChmdW5jdGlvbihlLHQpe3JldHVybiBMcygwLHQsITEpfSxlKX0sQnMucHJvdG90eXBlLnByZUxvZ2luPWZ1bmN0aW9uKGUpe3RoaXMuX3dhcnAoZnVuY3Rpb24oZSx0KXtyZXR1cm4gTXMoZSx0LCExKX0sZSl9LEJzLnByb3RvdHlwZS5vbkJ1dHRvbnNDbGljaz1mdW5jdGlvbihlKXtUdi5vbih0aGlzLmV2ZW50TmFtZSxlKX0sQnMucHJvdG90eXBlLm9mZkJ1dHRvbnNDbGljaz1mdW5jdGlvbihlKXtUdi5vZmYodGhpcy5ldmVudE5hbWUsZSl9LEJzLnByb3RvdHlwZS5fdHJpZ2dlclVuaXZlcmlmeUJ1dHRvbnNDbGljaz1mdW5jdGlvbihlKXtUdi5lbWl0KHRoaXMuZXZlbnROYW1lLGUpfSxCcy5wcm90b3R5cGUuX3dhcnA9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gQS53YXJwKGUpKHRoaXMuX2dldE9wdGlvbnModCkpfTt2YXIgRnM9IShCcy5wcm90b3R5cGUuX2dldE9wdGlvbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXt9KSxPYmplY3QuYXNzaWduKHt9LGUse3Byb3ZpZGVyOnRoaXMucHJvdmlkZXJ9KX0pLHpzPSExO2Z1bmN0aW9uIFZzKGUpe3JldHVybiB4di5yZXF1aXJlTW9kdWxlKGUpfXZhciBVcz17MDp7bmFtZToid2ViIix0aXRsZToi5Zu+5paHIn0sMTp7bmFtZToidGV4dCIsdGl0bGU6Iue6r+aWh+WtlyJ9LDI6e25hbWU6ImltYWdlIix0aXRsZToi57qv5Zu+54mHIn0sMzp7bmFtZToibXVzaWMiLHRpdGxlOiLpn7PkuZAifSw0OntuYW1lOiJ2aWRlbyIsdGl0bGU6IuinhumikSJ9LDU6e25hbWU6Im1pbmlQcm9ncmFtIix0aXRsZToi5bCP56iL5bqPIn19LHFzPWZ1bmN0aW9uKGUsdCxuKXtlLnR5cGU9ZS50eXBlfHwwO3ZhciByPWUucHJvdmlkZXIsaT1lLnR5cGUsbz1lLnRpdGxlLGE9ZS5zdW1tYXJ5LHM9ZS5ocmVmLGM9ZS5pbWFnZVVybCx1PWUubWVkaWFVcmwsbD1lLnNjZW5lLGQ9ZS5taW5pUHJvZ3JhbSxmPWUub3BlbkN1c3RvbWVyU2VydmljZUNoYXQscD1lLmNvcnBpZCxoPWUuY3VzdG9tZXJVcmw7InN0cmluZyI9PXR5cGVvZiBjJiZjJiYoYz1faShjKSk7dmFyIHY9VXNbaSsiIl07aWYodil7dmFyIGc9e3Byb3ZpZGVyOnIsdHlwZTp2Lm5hbWUsdGl0bGU6byxjb250ZW50OmEsaHJlZjpzLHBpY3R1cmVzOltjXSx0aHVtYnM6W2NdLG1lZGlhOnUsbWluaVByb2dyYW06ZCxleHRyYTp7c2NlbmU6bH0sb3BlbkN1c3RvbWVyU2VydmljZUNoYXQ6Zixjb3JwaWQ6cCx1cmw6aH07cmV0dXJuIndlaXhpbiIhPT1yfHwxIT09aSYmMiE9PWl8fGRlbGV0ZSBnLnRodW1icyxnfXJldHVybiLliIbkuqvlj4LmlbAgdHlwZSDkuI3mraPnoa4ifSxXcz1mdW5jdGlvbihlLHQsbixyKXt2b2lkIDA9PT1yJiYocj0ic2hhcmUiKTt2YXIgaT1FaShuLHIpLG89dC5vcGVuQ3VzdG9tZXJTZXJ2aWNlQ2hhdD8ib3BlbkN1c3RvbWVyU2VydmljZUNoYXQiOiJzZW5kIjt0cnl7ZVtvXSh0LGZ1bmN0aW9uKCl7b2kobix7ZXJyTXNnOnIrIjpvayJ9KX0saSl9Y2F0Y2goZSl7aSh7bWVzc2FnZTp0LnByb3ZpZGVyKyIgIitvKyIg5pa55rOV6LCD55So5aSx6LSlIn0pfX07ZnVuY3Rpb24gSHMobixyLGkpe3ZvaWQgMD09PWkmJihpPSJzaGFyZSIpLG49cXMobik7dmFyIG89RWkocixpKTtpZigic3RyaW5nIj09dHlwZW9mIG4pcmV0dXJuIG9pKHIse2Vyck1zZzppKyI6ZmFpbCAiK259KTt2YXIgYT1uLnByb3ZpZGVyO0N2LnNoYXJlLmdldFNlcnZpY2VzKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5pZD09PWF9KTt0P3QuYXV0aGVudGljYXRlZD9Xcyh0LG4scik6dC5hdXRob3JpemUoZnVuY3Rpb24oKXtyZXR1cm4gV3ModCxuLHIpfSxvKTpvaShyLHtlcnJNc2c6aSsiOmZhaWwgc2VydmljZSBub3QgZm91bmQifSl9LG8pfWZ1bmN0aW9uIEdzKG4pe24uJHByb2Nlc3NlZD0hMCxuLnBvc3RNZXNzYWdlPWZ1bmN0aW9uKGUpe0N2LndlYnZpZXcucG9zdE1lc3NhZ2VUb1VuaU5WaWV3KHt0eXBlOiJVbmlBcHBTdWJOVnVlIixkYXRhOmV9LG4uaWQpfTt2YXIgcj1bXTtpZihuLm9uTWVzc2FnZT1mdW5jdGlvbihlKXtyLnB1c2goZSl9LG4uJGNvbnN1bWVNZXNzYWdlPWZ1bmN0aW9uKHQpe3IuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gZSh0KX0pfSxuLl9fdW5pYXBwX21hc2tfaWQpe3ZhciBpPW4uX191bmlhcHBfbWFzayxvPSIwIj09PW4uX191bmlhcHBfbWFza19pZD97c2V0U3R5bGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tYXNrO1ZzKCJ1bmktdGFidmlldyIpLnNldE1hc2soe2NvbG9yOnR9KX19OkN2LndlYnZpZXcuZ2V0V2Vidmlld0J5SWQobi5fX3VuaWFwcF9tYXNrX2lkKSxhPW4uc2hvdyxzPW4uaGlkZSxjPW4uY2xvc2UsdT1mdW5jdGlvbigpe28uc2V0U3R5bGUoe21hc2s6Im5vbmUifSl9O24uc2hvdz1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtyZXR1cm4gby5zZXRTdHlsZSh7bWFzazppfSksYS5hcHBseShuLGUpfSxuLmhpZGU9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIHUoKSxzLmFwcGx5KG4sZSl9LG4uY2xvc2U9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIHUoKSxyPVtdLGMuYXBwbHkobixlKX19fWZ1bmN0aW9uIFhzKGUpe3ZhciB0PUN2LndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoZSk7aWYobnVsbD09dCl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBmaW5kIFN1Yk5WdWUsIGlkPSIrZSk7dCYmIXQuJHByb2Nlc3NlZCYmR3ModCk7dmFyIG49dC5zZXRTdHlsZSxyPUN2LndlYnZpZXcuZ2V0V2Vidmlld0J5SWQodC5fX3VuaWFwcF9tYXNrX2lkKTtyZXR1cm4gdC5zZXRTdHlsZT1mdW5jdGlvbihlKXtlJiZlLm1hc2smJihyJiZyLnNldFN0eWxlKHttYXNrOmUubWFza30pLGRlbGV0ZSBlLm1hc2spLG4uY2FsbCh0aGlzLGUpfSx0fXZhciBZcz1bXTtmdW5jdGlvbiBKcyhlLHQsbil7cmV0dXJuIHh2LnJlcXVpcmVNb2R1bGUoInBsdXMiKS5zZW5kTmF0aXZlRXZlbnQoZSx0LG4pfVR2Lm9uKCJhcGkudW5pTVBOYXRpdmVFdmVudCIsZnVuY3Rpb24odCl7WXMuZm9yRWFjaChmdW5jdGlvbihlKXtvaShlLHQuZXZlbnQsdC5kYXRhKX0pfSk7dmFyIEtzPVtdO2Z1bmN0aW9uIFpzKHQsZSl7dmFyIG49ITEscj0kdi5zdWJQYWNrYWdlcztpZihBcnJheS5pc0FycmF5KHIpKXt2YXIgaT1yLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIDA9PT10LmluZGV4T2YoZS5yb290KX0pO2kmJihuPSEwLGZ1bmN0aW9uKGUsdCl7aWYoLTEhPT1Lcy5pbmRleE9mKGUpKXJldHVybiB0KCk7ZWMoW2VdLGZ1bmN0aW9uKCl7dCgpfSl9KGkucm9vdCxlKSl9bnx8ZSgpfXZhciBRcz0iYXBwLXN1Yi1zZXJ2aWNlLmpzIjtmdW5jdGlvbiBlYyhlLHQpe3ZhciBuLHI7bj1lLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gS3MucHVzaChlKSxlKyIvIitRc30pLHI9ZnVuY3Rpb24oZSl7dCYmdCghMCl9LCR2Lm9uU2VydmljZVJlYWR5KGZ1bmN0aW9uKCl7eHYucmVxdWlyZU1vZHVsZSgicGx1cyIpLmV2YWxKU0ZpbGVzKG4scil9KX12YXIgdGM9SnM7dmFyIG5jPU9iamVjdC5hc3NpZ247dmFyIHJjPXtwYXRoOiIiLHF1ZXJ5Ont9LHNjZW5lOjEwMDEscmVmZXJyZXJJbmZvOnthcHBJZDoiIixleHRyYURhdGE6e319fSxpYz17cGF0aDoiIixxdWVyeTp7fSxzY2VuZToxMDAxLHJlZmVycmVySW5mbzp7YXBwSWQ6IiIsZXh0cmFEYXRhOnt9fX07ZnVuY3Rpb24gb2MoKXtyZXR1cm4gcmN9ZnVuY3Rpb24gYWMoKXt2YXIgZT14di5yZXF1aXJlTW9kdWxlKCJwbHVzIik7aWYoZS5nZXRSZWRpcmVjdEluZm8pe3ZhciB0PWUuZ2V0UmVkaXJlY3RJbmZvKCl8fHt9LG49dC5wYXRoLHI9dC5xdWVyeSxpPXQuZXh0cmFEYXRhLG89dC51c2VyQWN0aW9uLGE9e2FwcElkOnQuZnJvbUFwcGlkLGV4dHJhRGF0YTp7fX07cmV0dXJuIGkmJihhLmV4dHJhRGF0YT1pKSx7cGF0aDpufHwiIixxdWVyeTpyPyI/IityOiIiLHJlZmVycmVySW5mbzphLHVzZXJBY3Rpb246b319fXZhciBzYz0yLGNjPSJ2ZFN5bmMiLHVjPSJ3ZWJ2aWV3UmVhZHkiLGxjPSJ2ZFN5bmNDYWxsYmFjayIsZGM9Imludm9rZUFwaSIsZmM9IldFQl9JTlZPS0VfQVBQU0VSVklDRSIscGM9IndlYnZpZXdJbnNlcnRlZCIsaGM9IndlYnZpZXdSZW1vdmVkIix2Yz0id2Vidmlld0lkIjtmdW5jdGlvbiBnYyhlKXt2YXIgdD1lLmJ1dHRvbnM7cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJnQuZm9yRWFjaChmdW5jdGlvbihlLHQpe3ZhciByO2Uub25jbGljaz0ocj10LGZ1bmN0aW9uKGUpe3ZhciB0PUx2KCk7aWYodC5sZW5ndGgpe2UuaW5kZXg9cjt2YXIgbj10W3QubGVuZ3RoLTFdO24uJHZtJiZuLiR2bS5fX2NhbGxfaG9vayYmbi4kdm0uX19jYWxsX2hvb2soIm9uTmF2aWdhdGlvbkJhckJ1dHRvblRhcCIsZSl9fSl9KSxlfWZ1bmN0aW9uIG1jKG4scil7dmFyIGU9ZnVuY3Rpb24oZSl7aWYoaXQoKSlyZXR1cm4gcnQoZSxbWyJ0aXRsZVRleHQiXSxbInNlYXJjaElucHV0IiwicGxhY2Vob2xkZXIiXV0pfShyKTtpZighZSlyZXR1cm4gcjt2YXIgaT1lWzBdLG89ZVsxXTtyZXR1cm4oaXx8bykmJk12Lm9uTG9jYWxlQ2hhbmdlKGZ1bmN0aW9uKCl7dmFyIGU9Q3Yud2Vidmlldy5nZXRXZWJ2aWV3QnlJZChuKyIiKTtpZihlKXt2YXIgdD17fTtpJiYodC50aXRsZVRleHQ9ci50aXRsZVRleHQpLG8mJih0LnNlYXJjaElucHV0PXtwbGFjZWhvbGRlcjpyLnNlYXJjaElucHV0LnBsYWNlaG9sZGVyfSksZS5zZXRTdHlsZSh7dGl0bGVOVmlldzp0fSl9fSkscn12YXIgeWM9LyhcZCsoXC5cZCspPylbcnx1XXB4L2c7ZnVuY3Rpb24gX2ModCl7dmFyIG49e30sZT1KU09OLnN0cmluZ2lmeSh0KTtpZih+ZS5pbmRleE9mKCJ1cHgiKXx8fmUuaW5kZXhPZigicnB4IikpdHJ5e249SlNPTi5wYXJzZShlLnJlcGxhY2UoeWMsZnVuY3Rpb24oZSx0KXtyZXR1cm4gTXYudXB4MnB4KHBhcnNlSW50KHQpfHwwKSsicHgifSkpfWNhdGNoKGUpe249dCxjb25zb2xlLmVycm9yKGUpfWVsc2Ugbj1KU09OLnBhcnNlKGUpO3JldHVybiBufXZhciBiYyx3Yz1bIm5hdmlnYXRpb25CYXJCYWNrZ3JvdW5kQ29sb3IiLCJuYXZpZ2F0aW9uQmFyVGV4dFN0eWxlIiwibmF2aWdhdGlvbkJhclRpdGxlVGV4dCIsIm5hdmlnYXRpb25CYXJTaGFkb3ciLCJuYXZpZ2F0aW9uU3R5bGUiLCJkaXNhYmxlU2Nyb2xsIiwiYmFja2dyb3VuZENvbG9yIiwiYmFja2dyb3VuZFRleHRTdHlsZSIsImVuYWJsZVB1bGxEb3duUmVmcmVzaCIsIm9uUmVhY2hCb3R0b21EaXN0YW5jZSIsInVzaW5nQ29tcG9uZW50cyIsInRpdGxlTlZpZXciLCJwdWxsVG9SZWZyZXNoIl07ZnVuY3Rpb24ga2MoZSx0LG4pe3ZvaWQgMD09PW4mJihuPXt9KTt2YXIgcj17Ym91bmNlOiJ2ZXJ0aWNhbCJ9O24ud2luZG93PV9jKE9iamVjdC5hc3NpZ24oSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSgkdi53aW5kb3d8fHt9KSksbi53aW5kb3d8fHt9KSksT2JqZWN0LmtleXMobi53aW5kb3cpLmZvckVhY2goZnVuY3Rpb24oZSl7LTE9PT13Yy5pbmRleE9mKGUpJiYocltlXT1uLndpbmRvd1tlXSl9KTt2YXIgaT1uLndpbmRvdy5iYWNrZ3JvdW5kQ29sb3I7KC9eI1thLXowLTldezZ9JC9pLnRlc3QoaSl8fCJ0cmFuc3BhcmVudCI9PT1pKSYmKHIuYmFja2dyb3VuZHx8KHIuYmFja2dyb3VuZD1pKSxyLmJhY2tncm91bmRDb2xvclRvcHx8KHIuYmFja2dyb3VuZENvbG9yVG9wPWkpKTt2YXIgbz1mdW5jdGlvbihlLHQpe3ZhciBuPXQud2luZG93LHI9bi50aXRsZU5WaWV3O2lmKHQubWV0YS5zdGF0dXNCYXJTdHlsZT0iYmxhY2siPT09bi5uYXZpZ2F0aW9uQmFyVGV4dFN0eWxlPyJkYXJrIjoibGlnaHQiLCExPT09cnx8ImZhbHNlIj09PXJ8fCJjdXN0b20iPT09bi5uYXZpZ2F0aW9uU3R5bGUmJiFUKHIpfHwiYWx3YXlzIj09PW4udHJhbnNwYXJlbnRUaXRsZSYmIVQocikpcmV0dXJuITE7dmFyIGk9bi50aXRsZUltYWdlfHwiIixvPW4udHJhbnNwYXJlbnRUaXRsZXx8Im5vbmUiLGE9bi5uYXZpZ2F0aW9uQmFyQmFja2dyb3VuZENvbG9yLHM9e2F1dG9CYWNrQnV0dG9uOiF0Lm1ldGEuaXNRdWl0LHRpdGxlVGV4dDoiIj09PWkmJm4ubmF2aWdhdGlvbkJhclRpdGxlVGV4dHx8IiIsdGl0bGVDb2xvcjoiYmxhY2siPT09bi5uYXZpZ2F0aW9uQmFyVGV4dFN0eWxlPyIjMDAwMDAwIjoiI2ZmZmZmZiIsdHlwZTp7bm9uZToiZGVmYXVsdCIsYXV0bzoidHJhbnNwYXJlbnQiLGFsd2F5czoiZmxvYXQifVtvXSxiYWNrZ3JvdW5kQ29sb3I6L14jW2EtejAtOV17Nn0kL2kudGVzdChhKXx8InRyYW5zcGFyZW50Ij09PWE/YToiI2Y3ZjdmNyIsdGFnczoiIj09PWk/W106W3t0YWc6ImltZyIsc3JjOmkscG9zaXRpb246e2xlZnQ6ImF1dG8iLHRvcDoiYXV0byIsd2lkdGg6ImF1dG8iLGhlaWdodDoiMjZweCJ9fV19O3JldHVybiBUKHIpP21jKGUsT2JqZWN0LmFzc2lnbihzLGdjKHIpKSk6bWMoZSxzKX0oZSxuKTtvJiYoMT09PWUmJiR2LnJlYWxFbnRyeVBhZ2VQYXRoJiYhbi5tZXRhLmlzUXVpdCYmKG8uYXV0b0JhY2tCdXR0b249ITApLHIudGl0bGVOVmlldz1vKTt2YXIgYT1mdW5jdGlvbihlKXt2YXIgdD1lLndpbmRvdztpZih0LmVuYWJsZVB1bGxEb3duUmVmcmVzaHx8dC5wdWxsVG9SZWZyZXNoJiZ0LnB1bGxUb1JlZnJlc2guc3VwcG9ydCl7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4iQW5kcm9pZCI9PT1Ddi5vcy5uYW1lP09iamVjdC5hc3NpZ24obix7c3VwcG9ydDohMCxzdHlsZToiY2lyY2xlIn0pOk9iamVjdC5hc3NpZ24obix7c3VwcG9ydDohMCxzdHlsZToiZGVmYXVsdCIsaGVpZ2h0OiI1MHB4IixyYW5nZToiMjAwcHgiLGNvbnRlbnRkb3duOntjYXB0aW9uOiIifSxjb250ZW50b3Zlcjp7Y2FwdGlvbjoiIn0sY29udGVudHJlZnJlc2g6e2NhcHRpb246IiJ9fSksdC5iYWNrZ3JvdW5kVGV4dFN0eWxlJiYobi5jb2xvcj10LmJhY2tncm91bmRUZXh0U3R5bGUsbi5zbm93Q29sb3I9dC5iYWNrZ3JvdW5kVGV4dFN0eWxlKSxPYmplY3QuYXNzaWduKG4sdC5wdWxsVG9SZWZyZXNofHx7fSksbn19KG4pO3JldHVybiBhJiYoImNpcmNsZSI9PT1hLnN0eWxlJiYoci5ib3VuY2U9Im5vbmUiKSxyLnB1bGxUb1JlZnJlc2g9YSksImhpZGUiPT09ci5wb3BHZXN0dXJlJiZkZWxldGUgci5wb3BHZXN0dXJlLG4ubWV0YS5pc1F1aXQmJihyLnBvcEdlc3R1cmU9ImlPUyI9PT1Ddi5vcy5uYW1lPyJhcHBiYWNrIjoibm9uZSIpLHQmJm4ubWV0YS5pc05WdWUmJihyLnVuaU5WaWV3PXtwYXRoOnQsZGVmYXVsdEZvbnRTaXplOiR2LmRlZmF1bHRGb250U2l6ZSx2aWV3cG9ydDokdi52aWV3cG9ydH0pLHJ9ZnVuY3Rpb24gU2MoKXtNdi5uYXZpZ2F0ZUJhY2soe2Zyb206ImJhY2tidXR0b24ifSl9ZnVuY3Rpb24geGMoZSx0LG4pe2lmKGUucGF0aCl7dmFyIHI9ZS5zdHlsZXx8e30saT0ibmF2aWdhdGlvbkJhciI9PT1lLnR5cGUsbz0icG9wdXAiPT09ZS50eXBlO2RlbGV0ZSByLnR5cGUsbyYmIWUuaWQmJmNvbnNvbGUud2Fybigic3ViTlZ1ZVsiK2UucGF0aCsiXSBpcyBtaXNzaW5nIGlkIiksci51bmlOVmlldz17cGF0aDplLnBhdGgucmVwbGFjZSgiLm52dWUiLCIuanMiKSxkZWZhdWx0Rm9udFNpemU6JHYuZGVmYXVsdEZvbnRTaXplLHZpZXdwb3J0OiR2LnZpZXdwb3J0fTt2YXIgYSxzPXtfX3VuaWFwcF9ob3N0OnQucGF0aCxfX3VuaWFwcF9vcmlnaW46ci51bmlOVmlldy5wYXRoLnNwbGl0KCI/IilbMF0ucmVwbGFjZSgiLmpzIiwiIiksX191bmlhcHBfb3JpZ2luX2lkOm4uaWQsX191bmlhcHBfb3JpZ2luX3R5cGU6bi5fX3VuaWFwcF90eXBlfTtpPyhyLnBvc2l0aW9uPSJkb2NrIixyLmRvY2s9InRvcCIsci50b3A9MCxyLndpZHRoPSIxMDAlIixyLmhlaWdodD1ZZStOYSgpLGRlbGV0ZSByLmxlZnQsZGVsZXRlIHIucmlnaHQsZGVsZXRlIHIuYm90dG9tLGRlbGV0ZSByLm1hcmdpbik6byYmKHIucG9zaXRpb249ImFic29sdXRlIixhPWRpKHQucGF0aCk/TGE6bixzLl9fdW5pYXBwX21hc2s9ci5tYXNrfHwicmdiYSgwLDAsMCwwLjUpIixzLl9fdW5pYXBwX21hc2tfaWQ9YS5pZCksZGVsZXRlIHIubWFzazt2YXIgYyx1PUN2LndlYnZpZXcuY3JlYXRlKCIiLGUuaWQscixzKTtvP2Z1bmN0aW9uKGUsdCxuKXtuLnBvcHVwU3ViTlZ1ZVdlYnZpZXdzfHwobi5wb3B1cFN1Yk5WdWVXZWJ2aWV3cz17fSksbi5wb3B1cFN1Yk5WdWVXZWJ2aWV3c1tlLmlkXT1lO3ZhciByPWZ1bmN0aW9uKCl7bi5zZXRTdHlsZSh7bWFzazoibm9uZSJ9KSxlLmhpZGUoImF1dG8iKX07bi5hZGRFdmVudExpc3RlbmVyKCJtYXNrQ2xpY2siLHIpO3ZhciBpPSExO2UuYWRkRXZlbnRMaXN0ZW5lcigic2hvdyIsZnVuY3Rpb24oKXtpfHwoQ3Yua2V5LnJlbW92ZUV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLFNjKSxDdi5rZXkuYWRkRXZlbnRMaXN0ZW5lcigiYmFja2J1dHRvbiIsciksaT0hMCl9KSxlLmFkZEV2ZW50TGlzdGVuZXIoImhpZGUiLGZ1bmN0aW9uKCl7aSYmKEN2LmtleS5yZW1vdmVFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixyKSxDdi5rZXkuYWRkRXZlbnRMaXN0ZW5lcigiYmFja2J1dHRvbiIsU2MpLGk9ITEpfSksZS5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsZnVuY3Rpb24oKXtkZWxldGUgbi5wb3B1cFN1Yk5WdWVXZWJ2aWV3c1tlLmlkXSxpJiYoQ3Yua2V5LnJlbW92ZUV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLHIpLEN2LmtleS5hZGRFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixTYyksaT0hMSl9KX0odSwwLGEpOihjPXUsbi5hcHBlbmQoYykpfX1mdW5jdGlvbiBDYyhpKXt2YXIgbixyLG8sZTtpLmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsKG49ZnVuY3Rpb24oZSl7dmFyIHQ9ZS53aWR0aCxuPWUuaGVpZ2h0LHI9e2RldmljZU9yaWVudGF0aW9uOjkwPT09TWF0aC5hYnMoQ3YubmF2aWdhdG9yLmdldE9yaWVudGF0aW9uKCkpPyJsYW5kc2NhcGUiOiJwb3J0cmFpdCIsc2l6ZTp7d2luZG93V2lkdGg6TWF0aC5jZWlsKHQpLHdpbmRvd0hlaWdodDpNYXRoLmNlaWwobil9fTtzaSgib25WaWV3RGlkUmVzaXplIixyKSxUdi5lbWl0KCJvblJlc2l6ZSIscixwYXJzZUludChpLmlkKSl9LHI9NTAsKGU9ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMsdD10aGlzO0V2KG8pLG89T3YoZnVuY3Rpb24oKXtyZXR1cm4gbi5hcHBseSh0LGUpfSxyKX0pLmNhbmNlbD1mdW5jdGlvbigpe0V2KG8pfSxlKSl9ZnVuY3Rpb24gVGMoZSl7dmFyIGw7ZS5hZGRFdmVudExpc3RlbmVyKCJwb3BHZXN0dXJlIixmdW5jdGlvbihlKXtpZigic3RhcnQiPT09ZS50eXBlKXt2YXIgdD1MdigpLG49dFt0Lmxlbmd0aC0yXTtsPXJpO3ZhciByPW4mJm4uJHBhZ2UubWV0YS5zdGF0dXNCYXJTdHlsZTtyJiZsaShyKX1lbHNlIGlmKCJlbmQiIT09ZS50eXBlfHxlLnJlc3VsdCl7aWYoImVuZCI9PT1lLnR5cGUmJmUucmVzdWx0KXt2YXIgaT1MdigpLG89aS5sZW5ndGgsYT1pW2kubGVuZ3RoLTFdO2EmJmEuJHJlbW92ZSgpLGxpKCksYSYmMT09PW8mJih1PWEsJHYucmVhbEVudHJ5UGFnZVBhdGgmJnUuJHBhZ2Uucm91dGU9PT0kdi5lbnRyeVBhZ2VQYXRoKT8oJHYuZW50cnlQYWdlUGF0aD0kdi5yZWFsRW50cnlQYWdlUGF0aCxkZWxldGUgJHYucmVhbEVudHJ5UGFnZVBhdGgsTXYucmVMYXVuY2goe3VybDoocz0kdi5lbnRyeVBhZ2VQYXRoLGM9cywwPT09Yy5pbmRleE9mKCIvIik/czoiLyIrcyl9KSk6VHYuZW1pdCgib25BcHBSb3V0ZSIse3R5cGU6Im5hdmlnYXRlQmFjayJ9KX19ZWxzZSBsaShsKTt2YXIgcyxjLHV9KX12YXIgT2M9MixFYz17cHVsbFRvUmVmcmVzaDoib25QdWxsRG93blJlZnJlc2giLHRpdGxlTlZpZXdTZWFyY2hJbnB1dENoYW5nZWQ6Im9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2hhbmdlZCIsdGl0bGVOVmlld1NlYXJjaElucHV0Q29uZmlybWVkOiJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENvbmZpcm1lZCIsdGl0bGVOVmlld1NlYXJjaElucHV0Q2xpY2tlZDoib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDbGlja2VkIix0aXRsZU5WaWV3U2VhcmNoSW5wdXRGb2N1c0NoYW5nZWQ6Im9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Rm9jdXNDaGFuZ2VkIn07ZnVuY3Rpb24gQWMoZSl7YmM9ZX1mdW5jdGlvbiBJYyhlKXtyZXR1cm4gZX1mdW5jdGlvbiAkYyhlLHQpe3ZhciBuPXQ/Uyh0LEljKToiIjtyZXR1cm57cGF0aDplLnN1YnN0cigxKSxxdWVyeTpuP24uc3Vic3RyKDEpOm59fWZ1bmN0aW9uIFBjKGUsdCxuLHIpe2lmKHZvaWQgMD09PXImJihyPXt9KSx0Lm1ldGEuaXNOVnVlKXt2YXIgaT1PYysrLG89a2MoaSxlLHQpO3JldHVybiBvLnVuaVBhZ2VVcmw9JGMoZSxuKSxvLmlzVGFiPSEhdC5tZXRhLmlzVGFiQmFyLEN2LndlYnZpZXcuY3JlYXRlKCIiLFN0cmluZyhpKSxvLE9iamVjdC5hc3NpZ24oe252dWU6ITB9LHIpKX1yZXR1cm4gMj09PU9jP0N2LndlYnZpZXcuZ2V0TGF1bmNoV2VidmlldygpOmJjfWZ1bmN0aW9uIE1jKG4sZSx0LHIpe2lmKCIxIj09PW4uaWR8fCFlLm1ldGEuaXNOVnVlKXt2YXIgaT1rYyhwYXJzZUludChuLmlkKSwiIixlKTtpLnVuaVBhZ2VVcmw9JGModCxyKSxlLm1ldGEuaXNOVnVlP2kuaXNUYWI9ISFlLm1ldGEuaXNUYWJCYXI6aS5kZWJ1Z1JlZnJlc2g9KG89dCxzPWUsYz0oYT1yKT9TKGEsSWMpOiIiLHtpc1RhYjpzLm1ldGEuaXNUYWJCYXIsYXJndW1lbnRzOkpTT04uc3RyaW5naWZ5KHtwYXRoOm8uc3Vic3RyKDEpLHF1ZXJ5OmM/Yy5zdWJzdHIoMSk6Y30pfSksbi5zZXRTdHlsZShpKX12YXIgbyxhLHMsYyx1LGwsZCxmLHAsaCx2LGcsbSx5PVR2Lm9uLF89VHYuZW1pdDtyZXR1cm4gbD1uLChkPSh1PWUpLndpbmRvdy5zdWJOVnVlcykmJmQubGVuZ3RoJiZkLmZvckVhY2goZnVuY3Rpb24oZSl7eGMoZSx1LGwpfSksT2JqZWN0LmtleXMoRWMpLmZvckVhY2goZnVuY3Rpb24odCl7bi5hZGRFdmVudExpc3RlbmVyKHQsZnVuY3Rpb24oZSl7XyhFY1t0XSxlLHBhcnNlSW50KG4uaWQpKX0pfSksKGY9bikucG9wdXBTdWJOVnVlV2Vidmlld3MmJmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLGZ1bmN0aW9uKCl7T2JqZWN0LmtleXMoZi5wb3B1cFN1Yk5WdWVXZWJ2aWV3cykuZm9yRWFjaChmdW5jdGlvbihlKXtmLnBvcHVwU3ViTlZ1ZVdlYnZpZXdzW2VdLmNsb3NlKCJub25lIil9KX0pLENjKG4pLCJpT1MiPT09Q3Yub3MubmFtZSYmKCFuLm52dWUmJihwPW4saD1Udi5zdWJzY3JpYmUsdj1Udi51bnN1YnNjcmliZSxnPXAuaWQsbT1mdW5jdGlvbihlLHQpe2lmKGc9PT10KXt2KHVjLG0pLHQ9cGFyc2VJbnQodCk7dmFyIG49THYoITApLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuJHBhZ2UuaWQ9PT10fSk7aWYoIW4pcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlBhZ2VbIit0KyJdIG5vdCBmb3VuZCIpO24uJHZtLl8kdmQucmVzdG9yZSgpfX0scC5hZGRFdmVudExpc3RlbmVyKCJyZWNvdmVyeSIsZnVuY3Rpb24oZSl7aCh1YyxtKX0pKSxUYyhuKSkseShuLmlkKyIuc3RhcnRQdWxsRG93blJlZnJlc2giLGZ1bmN0aW9uKCl7bi5iZWdpblB1bGxUb1JlZnJlc2goKX0pLHkobi5pZCsiLnN0b3BQdWxsRG93blJlZnJlc2giLGZ1bmN0aW9uKCl7bi5lbmRQdWxsVG9SZWZyZXNoKCl9KSxufXZhciBqYz17fTtmdW5jdGlvbiBMYyhlLHQpeyhqY1tlXXx8KGpjW2VdPVtdKSkucHVzaCh0KX12YXIgTmM9ITE7ZnVuY3Rpb24gQmModCxlLG4pe05jPXtwYXRoOnQsbnZ1ZTpQdi5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT10fSkubWV0YS5pc05WdWUsbmF2aWdhdGU6ZX19ZnVuY3Rpb24gRGMoZSx0LG4pe2lmKG4mJiR2LnNwbGFzaHNjcmVlbiYmJHYuc3BsYXNoc2NyZWVuLmF1dG9jbG9zZSYmISR2LnNwbGFzaHNjcmVlbi5hbHdheXNTaG93QmVmb3JlUmVuZGVyJiZDdi5uYXZpZ2F0b3IuY2xvc2VTcGxhc2hzY3JlZW4oKSwhbiYmTmMpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIldhaXRpbmcgdG8gbmF2aWdhdGUgdG86ICIrTmMucGF0aCsiLCBkbyBub3Qgb3BlcmF0ZSBjb250aW51b3VzbHk6ICIrZSsiLiIpO2lmKCJuYXRpdmUiPT09JHYucmVuZGVyZXIpcmV0dXJuIDA9PT1MdigpLmxlbmd0aD9CYyhlLHQpOnQoKTt2YXIgcj0hYmN8fGJjJiZiYy5fX3VuaWFwcF9yb3V0ZSxpPWJjJiYhYmMubG9hZGVkO3J8fGk/QmMoZSx0KTp0KCksaSYmTGMoYmMuaWQsUmMpfWZ1bmN0aW9uIFJjKCl7aWYoTmMpe3ZhciBlPU5jLm5hdmlnYXRlO3JldHVybiBOYz0hMSxlKCl9fWZ1bmN0aW9uIEZjKCl7aWYoIm5hdGl2ZSI9PT0kdi5yZW5kZXJlcil7aWYoIU5jKXJldHVybjtyZXR1cm4gTmMubnZ1ZT9SYygpOnZvaWQgMH12YXIgZT0oYmMmJiFiYy5fX3VuaWFwcF9yb3V0ZXx8KGJjPUN2LndlYnZpZXcuY3JlYXRlKFpvLFN0cmluZyhPYysrKSx7Y29udGVudEFkanVzdDohMX0pKSxiYyk7aWYoTmMpcmV0dXJuIE5jLm52dWU/UmMoKTp2b2lkKGUubG9hZGVkP05jLm5hdmlnYXRlKCk6TGMoZS5pZCxSYykpfWZ1bmN0aW9uIHpjKGUsdCxuKXtlW2UuX19wcmVsb2FkX18/ImhpZGUiOiJjbG9zZSJdKHQsbil9ZnVuY3Rpb24gVmMobixyLGUsaSx0KXt2b2lkIDA9PT10JiYodD1uLm52dWU/MDoxMDApO3ZhciBvPShlPXZvaWQgMD09PWU/WW86cGFyc2VJbnQoZSkpfHxZbztPdihmdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKCl7ZS5fY2FsbGVkfHwoZS5fY2FsbGVkPSEwLGkmJmkoKSxGYygpKX0sdD1PdihmdW5jdGlvbigpe2UoKX0sbysxNTApO24uc2hvdyhyfHxYbyxvLGZ1bmN0aW9uKCl7ZS5fY2FsbGVkfHxFdih0KSxlKCl9KX0sdCl9dmFyIFVjPTA7ZnVuY3Rpb24gcWModCxuLHIpe3ZhciBpPUx2KCksbz1pLmxlbmd0aCxhPWlbby0xXTsxPHQmJmkuc2xpY2Uoby10LG8tMSkucmV2ZXJzZSgpLmZvckVhY2goZnVuY3Rpb24oZSl7emMoZS4kZ2V0QXBwV2VidmlldygpLCJub25lIil9KTt2YXIgZT1mdW5jdGlvbihlKXtuP3pjKGUsbixyfHxZbyk6InJlZGlyZWN0Ij09PWEuJHBhZ2Uub3BlblR5cGU/emMoZSxKbyxZbyk6emMoZSwiYXV0byIpLGkuc2xpY2Uoby10LG8pLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGUuJHJlbW92ZSgpfSksbGkoKSxUdi5lbWl0KCJvbkFwcFJvdXRlIix7dHlwZToibmF2aWdhdGVCYWNrIn0pfSxzPWEuJGdldEFwcFdlYnZpZXcoKTtpZighYS5fX3VuaWFwcF93ZWJ2aWV3KXJldHVybiBlKHMpOyFmdW5jdGlvbihlLHQpe3ZhciBuPWUuY2hpbGRyZW4oKTtpZighbnx8IW4ubGVuZ3RoKXJldHVybiB0KCk7dmFyIHI9bi5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiAwPT09ZS5pZC5pbmRleE9mKHZjKX0pfHxuWzBdO3IuY2FuQmFjayhmdW5jdGlvbihlKXtlLmNhbkJhY2s/ci5iYWNrKCk6dCgpfSl9KHMsZnVuY3Rpb24oKXtlKHMpfSl9ZnVuY3Rpb24gV2MoZSl7dmFyIHQ9ZS5mcm9tO3ZvaWQgMD09PXQmJih0PSJuYXZpZ2F0ZUJhY2siKTt2YXIgbj1lLmRlbHRhLHI9ZS5hbmltYXRpb25UeXBlLGk9ZS5hbmltYXRpb25EdXJhdGlvbixvPUx2KCksYT1vW28ubGVuZ3RoLTFdO2lmKCEoYS4kdm0mJmEuJHZtLiRvcHRpb25zLm9uQmFja1ByZXNzJiZhLiR2bS5fX2NhbGxfaG9vayYmYS4kdm0uX19jYWxsX2hvb2soIm9uQmFja1ByZXNzIix7ZnJvbTp0fSkpKXJldHVybiBNdi5oaWRlVG9hc3QoKSxNdi5oaWRlTG9hZGluZygpLGEuJHBhZ2UubWV0YS5pc1F1aXQ/VWM/RGF0ZS5ub3coKS1VYzwyZTMmJkN2LnJ1bnRpbWUucXVpdCgpOihVYz1EYXRlLm5vdygpLEN2Lm5hdGl2ZVVJLnRvYXN0KFFlKCJ1bmkuYXBwLnF1aXQiKSksT3YoZnVuY3Rpb24oKXtVYz1udWxsfSwyZTMpKToxPT09YS4kcGFnZS5pZCYmJHYucmVhbEVudHJ5UGFnZVBhdGg/KCR2LmVudHJ5UGFnZVBhdGg9JHYucmVhbEVudHJ5UGFnZVBhdGgsZGVsZXRlICR2LnJlYWxFbnRyeVBhZ2VQYXRoLE12LnJlTGF1bmNoKHt1cmw6Ii8iKyR2LmVudHJ5UGFnZVBhdGh9KSk6cWMobixyLGkpLHtlcnJNc2c6Im5hdmlnYXRlQmFjazpvayJ9fXZhciBIYz1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7dGhpcy5pZD1lLHRoaXMubGlzdGVuZXI9e30sdGhpcy5lbWl0Q2FjaGU9e30sdCYmT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihlKXtuLm9uKGUsdFtlXSl9KX07SGMucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49YXJndW1lbnRzLmxlbmd0aC0xOzA8bi0tOyl0W25dPWFyZ3VtZW50c1tuKzFdO3ZhciByPXRoaXMubGlzdGVuZXJbZV07aWYoIXIpcmV0dXJuKHRoaXMuZW1pdENhY2hlW2VdfHwodGhpcy5lbWl0Q2FjaGVbZV09W10pKS5wdXNoKHQpO3IuZm9yRWFjaChmdW5jdGlvbihlKXtlLmZuLmFwcGx5KGUuZm4sdCl9KSx0aGlzLmxpc3RlbmVyW2VdPXIuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiJvbmNlIiE9PWUudHlwZX0pfSxIYy5wcm90b3R5cGUub249ZnVuY3Rpb24oZSx0KXt0aGlzLl9hZGRMaXN0ZW5lcihlLCJvbiIsdCksdGhpcy5fY2xlYXJDYWNoZShlKX0sSGMucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24oZSx0KXt0aGlzLl9hZGRMaXN0ZW5lcihlLCJvbmNlIix0KSx0aGlzLl9jbGVhckNhY2hlKGUpfSxIYy5wcm90b3R5cGUub2ZmPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5saXN0ZW5lcltlXTtpZihuKWlmKHQpZm9yKHZhciByPTA7cjxuLmxlbmd0aDspbltyXS5mbj09PXQmJihuLnNwbGljZShyLDEpLHItLSkscisrO2Vsc2UgZGVsZXRlIHRoaXMubGlzdGVuZXJbZV19LEhjLnByb3RvdHlwZS5fY2xlYXJDYWNoZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmVtaXRDYWNoZVtlXTtpZih0KWZvcig7MDx0Lmxlbmd0aDspdGhpcy5lbWl0LmFwcGx5KHRoaXMsW2VdLmNvbmNhdCh0LnNoaWZ0KCkpKX0sSGMucHJvdG90eXBlLl9hZGRMaXN0ZW5lcj1mdW5jdGlvbihlLHQsbil7KHRoaXMubGlzdGVuZXJbZV18fCh0aGlzLmxpc3RlbmVyW2VdPVtdKSkucHVzaCh7Zm46bix0eXBlOnR9KX07dmFyIEdjPTA7dmFyIFhjPU9iamVjdC5jcmVhdGUobnVsbCk7dmFyIFljPWQoZnVuY3Rpb24oZSl7cmV0dXJuIFhjW2VdKCl9KTt2YXIgSmM9ITE7ZnVuY3Rpb24gS2MoKXtpZighSmMpe3ZhciBlLHQ7aWYoSmM9ITAseHYucmVxdWlyZU1vZHVsZSgicGx1cyIpLmdldFJlZGlyZWN0SW5mbyl7dmFyIG49YWMoKSxyPW4ucGF0aCxpPW4ucXVlcnksbz1uLnJlZmVycmVySW5mbztyJiYoZT1yLHQ9aSksJHYucmVmZXJyZXJJbmZvPW99ZWxzZXt2YXIgYT1Ddi5ydW50aW1lLmFyZ3VtZW50cztpZighYSlyZXR1cm47dHJ5e3ZhciBzPUpTT04ucGFyc2UoYSk7ZT1zLnBhdGh8fHMucGF0aE5hbWUsdD1zLnF1ZXJ5PyI/IitzLnF1ZXJ5OiIifWNhdGNoKGUpe319aWYoZSYmZSE9PSR2LmVudHJ5UGFnZVBhdGgpe3ZhciBjPSIvIitlLHU9UHYuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXRoPT09Y30pO3U/KHUubWV0YS5pc1RhYkJhcnx8KCR2LnJlYWxFbnRyeVBhZ2VQYXRoPSR2LnJlYWxFbnRyeVBhZ2VQYXRofHwkdi5lbnRyeVBhZ2VQYXRoKSwkdi5lbnRyeVBhZ2VQYXRoPWUsJHYuZW50cnlQYWdlUXVlcnk9dCk6Y29uc29sZS5lcnJvcigiW3VuaS1hcHBdICIrZSsiIG5vdCBmb3VuZC4uLiIpfWVsc2UgdCYmKCR2LmVudHJ5UGFnZVF1ZXJ5PXQpfX12YXIgWmM9W107ZnVuY3Rpb24gUWMoZSl7cmV0dXJuIGU/WmMuc2xpY2UoMCk6WmMuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLiRwYWdlLm1ldGEuaXNUYWJCYXJ8fGUuJHBhZ2UubWV0YS52aXNpYmxlfSl9dmFyIGV1PXt9O2Z1bmN0aW9uIHR1KGUpe3ZhciB0PWUudXJsLG49ZS5wYXRoLGk9ZS5xdWVyeSxyPWUub3BlblR5cGUsbz1lLndlYnZpZXcsYT1lLmV2ZW50Q2hhbm5lbDtpZihvJiZLYygpLGV1W3RdJiYobz1ldVt0XSkuX19wYWdlX18pe2lmKCFRYyghMCkuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZT09PW8uX19wYWdlX199KSlyZXR1cm4gYSYmKG8uX19wYWdlX18uZXZlbnRDaGFubmVsPWEpLFpjLnB1c2goby5fX3BhZ2VfXyksbztvPW51bGx9dmFyIHM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShQdi5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT1ufSkpKTsicmVMYXVuY2giPT09cnx8ISR2LnJlYWxFbnRyeVBhZ2VQYXRoJiYwPT09UWMoKS5sZW5ndGg/cy5tZXRhLmlzUXVpdD0hMDpzLm1ldGEuaXNUYWJCYXJ8fChzLm1ldGEuaXNRdWl0PSExKSxvPyhvPUN2LndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoby5pZCkpLm52dWU9cy5tZXRhLmlzTlZ1ZTpvPVBjKG4scyxpKSxzLm1ldGEuaXNUYWJCYXImJihzLm1ldGEudmlzaWJsZT0hMCkscy5tZXRhLmlzVGFiQmFyJiZMYS5hcHBlbmQobyk7dmFyIGM9IjEiPT09by5pZCYmby5udnVlO01jKG8scyxuLGkpO3ZhciB1PW4uc2xpY2UoMSksbD17cm91dGU6by5fX3VuaWFwcF9yb3V0ZT11LG9wdGlvbnM6T2JqZWN0LmFzc2lnbih7fSxpfHx7fSksJGdldEFwcFdlYnZpZXc6ZnVuY3Rpb24oKXtyZXR1cm4gQ3Yud2Vidmlldy5nZXRXZWJ2aWV3QnlJZChvLmlkKX0sZXZlbnRDaGFubmVsOmEsJHBhZ2U6e2lkOnBhcnNlSW50KG8uaWQpLG1ldGE6cy5tZXRhLHBhdGg6bixyb3V0ZTp1LGZ1bGxQYXRoOnQsb3BlblR5cGU6cn0sJHJlbW92ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1aYy5maW5kSW5kZXgoZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10fSk7LTEhPT1lJiYoby5udnVlfHx0aGlzLiR2bS4kZGVzdHJveSgpLFpjLnNwbGljZShlLDEpKX0sc2VsZWN0Q29tcG9uZW50OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLiR2bS5zZWxlY3RDb21wb25lbnQoZSl9LHNlbGVjdEFsbENvbXBvbmVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuJHZtLnNlbGVjdEFsbENvbXBvbmVudHMoZSl9fTtpZihaYy5wdXNoKGwpLG8uX19wcmVsb2FkX18mJihvLl9fcGFnZV9fPWwpLGMmJigkdi5zcGxhc2hzY3JlZW4mJiR2LnNwbGFzaHNjcmVlbi5hdXRvY2xvc2UmJiEkdi5zcGxhc2hzY3JlZW4uYWx3YXlzU2hvd0JlZm9yZVJlbmRlciYmQ3YubmF2aWdhdG9yLmNsb3NlU3BsYXNoc2NyZWVuKCksJHYub25SZWFkeShmdW5jdGlvbigpe0ZjKCl9KSksIW8ubnZ1ZSl7dmFyIGQ9by5pZDt0cnl7WnModSxmdW5jdGlvbigpe3ZhciBlLHQsbixyOyhlPXUsdD1kLG49aSxyPWwsWGNbZV18fGNvbnNvbGUuZXJyb3IoZSsiIG5vdCBmb3VuZCIpLG5ldyhZYyhlKSkoe21wVHlwZToicGFnZSIscGFnZUlkOnQscGFnZVBhdGg6ZSxwYWdlUXVlcnk6bixwYWdlSW5zdGFuY2U6cn0pKS4kbW91bnQoKX0pfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoZSl9fXJldHVybiBvfWZ1bmN0aW9uIG51KGUsdCl7dmFyIG49ZS51cmwscj1lLnBhdGgsaT1lLnF1ZXJ5LG89ZS5ldmVudHMsYT1lLmFuaW1hdGlvblR5cGUscz1lLmFuaW1hdGlvbkR1cmF0aW9uO1R2LmVtaXQoIm9uQXBwUm91dGUiLHt0eXBlOiJuYXZpZ2F0ZVRvIixwYXRoOnJ9KTt2YXIgYz0odm9pZCAwPT09ITEmJiEwLG5ldyBIYygrK0djLG8pKTtWYyh0dSh7dXJsOm4scGF0aDpyLHF1ZXJ5Omksb3BlblR5cGU6Im5hdmlnYXRlIixldmVudENoYW5uZWw6Y30pLGEscyxmdW5jdGlvbigpe29pKHQse2Vyck1zZzoibmF2aWdhdGVUbzpvayIsZXZlbnRDaGFubmVsOmN9KX0pLGxpKCl9ZnVuY3Rpb24gcnUoZSx0KXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9e30pLEFycmF5LmlzQXJyYXkoZVt0XSkmJmVbdF0ubGVuZ3RofWZ1bmN0aW9uIGl1KGUscil7dmFyIHQ9ZS51cmwsbj1lLnBhdGgsaT1lLnF1ZXJ5LG89ZS5leGlzdHMsYT1MdigpLHM9YS5sZW5ndGgtMTtpZigiYmFjayI9PT1vKXt2YXIgYz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9THYoKSxuPXQubGVuZ3RoO24tLTspe3ZhciByPXRbbl07aWYoci4kcGFnZSYmci4kcGFnZS5mdWxsUGF0aD09PWUpcmV0dXJuIG59cmV0dXJuLTF9KHQpO2lmKC0xIT09Yyl7dmFyIHU9cy1jO2lmKDA8dSlyZXR1cm4gV2Moe2RlbHRhOnV9KSx2b2lkIG9pKHIse2Vyck1zZzoicmVkaXJlY3RUbzpvayJ9KX19dmFyIGw9YVtzXTtsJiZsLiRyZW1vdmUoKSxWYyh0dSh7dXJsOnQscGF0aDpuLHF1ZXJ5Omksb3BlblR5cGU6InJlZGlyZWN0In0pLCJub25lIiwwLGZ1bmN0aW9uKCl7aWYobCl7dmFyIGU9bC4kZ2V0QXBwV2VidmlldygpO2UuX19wcmVsb2FkX18mJih0PWUsKG49T2JqZWN0LmtleXMoZXUpLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGV1W2VdLmlkPT09dC5pZH0pKSYmZGVsZXRlIGV1W25dKSxlLmNsb3NlKCJub25lIil9dmFyIHQsbjtvaShyLHtlcnJNc2c6InJlZGlyZWN0VG86b2sifSl9KSxsaSgpfXZhciBvdSxhdSxzdSxjdSx1dT0iX19UWVBFIixsdT0idW5pLXN0b3JhZ2Uta2V5cyI7ZnVuY3Rpb24gZHUoZSl7dHJ5e3ZhciB0PSJzdHJpbmciPT10eXBlb2YgZT9KU09OLnBhcnNlKGUpOmUsbj10LnR5cGU7aWYoMDw9WyJvYmplY3QiLCJzdHJpbmciLCJudW1iZXIiLCJib29sZWFuIiwidW5kZWZpbmVkIl0uaW5kZXhPZihuKSl7dmFyIHI9T2JqZWN0LmtleXModCk7aWYoMj09PXIubGVuZ3RoJiYiZGF0YSJpbiB0KXtpZih0eXBlb2YgdC5kYXRhPT09bilyZXR1cm4gdC5kYXRhO2lmKCJvYmplY3QiPT09biYmL15cZHs0fS1cZHsyfS1cZHsyfVRcZHsyfVw6XGR7Mn1cOlxkezJ9XC5cZHszfVokLy50ZXN0KHQuZGF0YSkpcmV0dXJuIG5ldyBEYXRlKHQuZGF0YSl9ZWxzZSBpZigxPT09ci5sZW5ndGgpcmV0dXJuIiJ9fWNhdGNoKGUpe319ZnVuY3Rpb24gZnUoZSx0KXt2YXIgbj10O2lmKCJzdHJpbmciIT09ZXx8InN0cmluZyI9PT1lJiYneyJ0eXBlIjoidW5kZWZpbmVkIn0nPT09dCl0cnl7dmFyIHI9SlNPTi5wYXJzZSh0KSxpPWR1KHIpO2lmKHZvaWQgMCE9PWkpbj1pO2Vsc2UgaWYoZSYmInN0cmluZyI9PXR5cGVvZihuPXIpKXt2YXIgbz10eXBlb2Yocj1KU09OLnBhcnNlKHIpKTsibnVtYmVyIj09PW8mJiJkYXRlIj09PWU/bj1uZXcgRGF0ZShyKTpvPT09KFsibnVsbCIsImFycmF5Il0uaW5kZXhPZihlKTwwP2U6Im9iamVjdCIpJiYobj1yKX19Y2F0Y2goZSl7fXJldHVybiBufWZ1bmN0aW9uIHB1KCl7Zm9yKHZhciBlPUN2LnN0b3JhZ2UubGVuZ3RofHxDdi5zdG9yYWdlLmdldExlbmd0aCgpfHwwLHQ9W10sbj0wLHI9MDtyPGU7cisrKXt2YXIgaT1Ddi5zdG9yYWdlLmtleShyKTtpZihpIT09bHUmJihpLmluZGV4T2YodXUpPDB8fGkuaW5kZXhPZih1dSkrdXUubGVuZ3RoIT09aS5sZW5ndGgpKXt2YXIgbz1Ddi5zdG9yYWdlLmdldEl0ZW0oaSk7bis9aS5sZW5ndGgrby5sZW5ndGgsdC5wdXNoKGkpfX1yZXR1cm57a2V5czp0LGN1cnJlbnRTaXplOk1hdGguY2VpbCgyKm4vMTAyNCksbGltaXRTaXplOk51bWJlci5NQVhfVkFMVUUsZXJyTXNnOiJnZXRTdG9yYWdlSW5mbzpvayJ9fWZ1bmN0aW9uIGh1KGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLnRpdGxlO3ZvaWQgMD09PXQmJih0PSIiKTt2YXIgbj1lLmljb247dm9pZCAwPT09biYmKG49InN1Y2Nlc3MiKTt2YXIgcj1lLmltYWdlO3ZvaWQgMD09PXImJihyPSIiKTt2YXIgaT1lLmR1cmF0aW9uO3ZvaWQgMD09PWkmJihpPTE1MDApO3ZhciBvPWUubWFzazt2b2lkIDA9PT1vJiYobz0hMSk7dmFyIGE9ZS5wb3NpdGlvbjt2b2lkIDA9PT1hJiYoYT0iIik7dmFyIHM9ZS50eXBlO3ZvaWQgMD09PXMmJihzPSJ0b2FzdCIpO3ZhciBjPWUuc3R5bGU7aWYodnUobnVsbCksYXU9cyxbInRvcCIsImNlbnRlciIsImJvdHRvbSJdLmluY2x1ZGVzKGEpKUN2Lm5hdGl2ZVVJLnRvYXN0KHQse3ZlcnRpY2FsQWxpZ246YX0pLG91PSEwO2Vsc2V7biYmIX5bInN1Y2Nlc3MiLCJsb2FkaW5nIiwiZXJyb3IiLCJub25lIl0uaW5kZXhPZihuKSYmKG49InN1Y2Nlc3MiKTt2YXIgdT17bW9kYWw6byxiYWNrOiJ0cmFuc21pdCIscGFkZGluZzoiMTBweCIsc2l6ZToiMTZweCJ9O3J8fG4mJiJub25lIiE9PW4/KHUud2lkdGg9IjE0MHB4Iix1LmhlaWdodD0iMTEycHgiKTp1LmxvYWRpbmc9e2Rpc3BsYXk6Im5vbmUifSxyP3UubG9hZGluZz17ZGlzcGxheToiYmxvY2siLGhlaWdodDoiNTVweCIsaWNvbjpyLGludGVydmFsOml9Oi0xIT09WyJzdWNjZXNzIiwiZXJyb3IiXS5pbmRleE9mKG4pJiYodS5sb2FkaW5nPXtkaXNwbGF5OiJibG9jayIsaGVpZ2h0OiI1NXB4IixpY29uOiJzdWNjZXNzIj09PW4/Il9fdW5pYXBwc3VjY2Vzcy5wbmciOiJfX3VuaWFwcGVycm9yLnBuZyIsaW50ZXJ2YWw6aX0pLG91PUN2Lm5hdGl2ZVVJLnNob3dXYWl0aW5nKHQsT2JqZWN0LmFzc2lnbih1LGMpKX1yZXR1cm4gc3U9T3YoZnVuY3Rpb24oKXt2dShudWxsKX0saSkse2Vyck1zZzoic2hvd1RvYXN0Om9rIn19ZnVuY3Rpb24gdnUoZSl7aWYodm9pZCAwPT09ZSYmKGU9InRvYXN0IiksIWV8fGU9PT1hdSlyZXR1cm4gc3UmJihFdihzdSksc3U9bnVsbCksITA9PT1vdT9Ddi5uYXRpdmVVSS5jbG9zZVRvYXN0KCk6b3UmJm91LmNsb3NlJiZvdS5jbG9zZSgpLGF1PW91PW51bGwse2Vyck1zZzoiaGlkZTpvayJ9fXZhciBndT17fTtmdW5jdGlvbiBtdShlKXt2YXIgbj1ndVtlXTtyZXR1cm4gbnx8KG49e2lkOjEsY2FsbGJhY2tzOk9iamVjdC5jcmVhdGUobnVsbCl9LGd1W2VdPW4pLHtnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG4uY2FsbGJhY2tzW2VdfSxwb3A6ZnVuY3Rpb24oZSl7dmFyIHQ9bi5jYWxsYmFja3NbZV07cmV0dXJuIHQmJmRlbGV0ZSBuLmNhbGxiYWNrc1tlXSx0fSxwdXNoOmZ1bmN0aW9uKGUpe3ZhciB0PW4uaWQrKztyZXR1cm4gbi5jYWxsYmFja3NbdF09ZSx0fX19dmFyIHl1PW11KCJyZXF1ZXN0Q29tcG9uZW50SW5mbyIpO2Z1bmN0aW9uIF91KG4pe3ZhciByPXt9O3JldHVybiBPYmplY3Qua2V5cyhufHx7fSkuZm9yRWFjaChmdW5jdGlvbihlKXtpZigwPT09ZS5pbmRleE9mKCJkYXRhIikpe3ZhciB0PWUucmVwbGFjZSgiZGF0YSIsIiIpO3Q9dC5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSt0LnNsaWNlKDEpLHJbdF09bltlXX19KSxyfWZ1bmN0aW9uIGJ1KGUsdCxuKXt2YXIgcj1lLl8kd2VleC5yZXF1aXJlTW9kdWxlKCJkb20iKSxpPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl0uc2VsZWN0b3I7MD09PXIuaW5kZXhPZigiIyIpJiZ0LnB1c2goci5zdWJzdHJpbmcoMSkpfXJldHVybiB0fSh0KSxvPW5ldyBBcnJheShpLmxlbmd0aCk7IWZ1bmN0aW9uIGUodCxuLHIpe3ZhciBpPW4uY2hpbGRyZW47aWYoIUFycmF5LmlzQXJyYXkoaSkpcmV0dXJuITE7Zm9yKHZhciBvPTA7bzxpLmxlbmd0aDtvKyspe3ZhciBhPWlbb107aWYoYS5hdHRyKXt2YXIgcz10LmluZGV4T2YoYS5hdHRyLmlkKTtpZigwPD1zJiYocltzXT17aWQ6dFtzXSxyZWY6YS5yZWYsZGF0YXNldDpfdShhLmF0dHIpfSwxPT09dC5sZW5ndGgpKWJyZWFrfWEuY2hpbGRyZW4mJmUodCxhLHIpfX0oaSxlLiRlbCxvKSxmdW5jdGlvbiB0KG4scixpLG8sYSl7dmFyIHM9cltpXTtuLmdldENvbXBvbmVudFJlY3Qocy5yZWYsZnVuY3Rpb24oZSl7ZS5zaXplLmlkPXMuaWQsZS5zaXplLmRhdGFzZXQ9cy5kYXRhc2V0LG8ucHVzaChlLnNpemUpLChpKz0xKTxyLmxlbmd0aD90KG4scixpLG8sYSk6YShvKX0pfShyLG8sMCxbXSxmdW5jdGlvbihlKXtuKGUpfSl9ZnVuY3Rpb24gd3UoZSx0LG4scil7VHYucHVibGlzaEhhbmRsZXIodCx7dHlwZTpuLGRhdGE6cn0sZSl9VHYuc3Vic2NyaWJlKCJvbkFkTWV0aG9kQ2FsbGJhY2siLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jYWxsYmFja0lkOyFmdW5jdGlvbihlLG4sdCl7dmFyIHI9ZS5hZHBpZCxpPWUud2lkdGgsbz1yKyItIitpLGE9a3Vbb107aWYoYSYmMDxhLmxlbmd0aClyZXR1cm4gbihhLnNwbGljZSgwLDEpWzBdKTtDdi5hZC5nZXRBZHMoZSxmdW5jdGlvbihlKXt2YXIgdD1lLmFkcztuKHQuc3BsaWNlKDAsMSlbMF0pLGt1W29dPWE/YS5jb25jYXQodCk6dH0sZnVuY3Rpb24oZSl7dCh7ZXJyQ29kZTplLmNvZGUsZXJyTXNnOmUubWVzc2FnZX0pfSl9KGUuZGF0YSxmdW5jdGlvbihlKXt3dSh0LG4sInN1Y2Nlc3MiLGUpfSxmdW5jdGlvbihlKXt3dSh0LG4sImZhaWwiLGUpfSl9KTt2YXIga3U9e307dmFyIFN1PVsibG9hZCIsImNsb3NlIiwidmVyaWZ5IiwiZXJyb3IiLCJhZENsaWNrZWQiXSx4dT1bLTUwMDEsLTUwMDIsLTUwMDMsLTUwMDQsLTUwMDUsLTUwMDZdLEN1PXtjb2RlOi01MDA4LGVyck1zZzoi5bm/5ZGK5pWw5o2u5bey6L+H5pyf77yM6K+36YeN5paw5Yqg6L29In0sVHU9ImNzaiIsT3U9ZnVuY3Rpb24oZSl7dmFyIGk9dGhpczt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49dGhpcy5fY2FsbGJhY2tzPXt9O1N1LmZvckVhY2goZnVuY3Rpb24odCl7blt0XT1bXTt2YXIgZT10WzBdLnRvVXBwZXJDYXNlKCkrdC5zdWJzdHIoMSk7aVsib24iK2VdPWZ1bmN0aW9uKGUpe25bdF0ucHVzaChlKX19KSx0aGlzLl9wcmVsb2FkPXZvaWQgMD09PWUucHJlbG9hZHx8ZS5wcmVsb2FkLHRoaXMuX2lzTG9hZD0hMSx0aGlzLl9pc0xvYWRpbmc9ITEsdGhpcy5fYWRFcnJvcj0iIix0aGlzLl9sb2FkUHJvbWlzZVJlc29sdmU9bnVsbCx0aGlzLl9sb2FkUHJvbWlzZVJlamVjdD1udWxsLHRoaXMuX2xhc3RMb2FkVGltZT0wO3ZhciB0PXRoaXMuX3Jld2FyZEFkPUN2LmFkLmNyZWF0ZVJld2FyZGVkVmlkZW9BZChlKTt0Lm9uTG9hZChmdW5jdGlvbihlKXtpLl9pc0xvYWQ9ITAsaS5faXNMb2FkaW5nPSExLGkuX2xhc3RMb2FkVGltZT1EYXRlLm5vdygpLGkuX2Rpc3BhdGNoRXZlbnQoImxvYWQiLHt9KSxudWxsIT1pLl9sb2FkUHJvbWlzZVJlc29sdmUmJihpLl9sb2FkUHJvbWlzZVJlc29sdmUoKSxpLl9sb2FkUHJvbWlzZVJlc29sdmU9bnVsbCl9KSx0Lm9uQ2xvc2UoZnVuY3Rpb24oZSl7aS5faXNMb2FkPSExLGkuX2lzTG9hZGluZz0hMSxpLl9wcmVsb2FkJiZpLl9sb2FkQWQoKSxpLl9kaXNwYXRjaEV2ZW50KCJjbG9zZSIse2lzRW5kZWQ6ZS5pc0VuZGVkfSl9KSx0Lm9uVmVyaWZ5JiZ0Lm9uVmVyaWZ5KGZ1bmN0aW9uKGUpe2kuX2Rpc3BhdGNoRXZlbnQoInZlcmlmeSIse2lzVmFsaWQ6ZS5pc1ZhbGlkfSl9KSx0Lm9uRXJyb3IoZnVuY3Rpb24oZSl7aS5faXNMb2FkaW5nPSExO3ZhciB0PWUuY29kZSxuPWUubWVzc2FnZSxyPXtjb2RlOnQsZXJyTXNnOm59O2kuX2FkRXJyb3I9biwtNTAwOD09PXQmJihpLl9pc0xvYWQ9ITEpLGkuX2Rpc3BhdGNoRXZlbnQoImVycm9yIixyKSwtNTAwNSE9PXQmJi0xIT09eHUuaW5kZXgodCl8fG51bGw9PWkuX2xvYWRQcm9taXNlUmVqZWN0fHwoaS5fbG9hZFByb21pc2VSZWplY3QociksaS5fbG9hZFByb21pc2VSZWplY3Q9bnVsbCl9KSx0Lm9uQWRDbGlja2VkKGZ1bmN0aW9uKGUpe2kuX2Rpc3BhdGNoRXZlbnQoImFkQ2xpY2tlZCIse30pfSksdGhpcy5fbG9hZEFkKCl9LEV1PXtpc0V4cGlyZWQ6e2NvbmZpZ3VyYWJsZTohMH19O0V1LmlzRXhwaXJlZC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMCE9PXRoaXMuX2xhc3RMb2FkVGltZSYmMThlNTxNYXRoLmFicyhEYXRlLm5vdygpLXRoaXMuX2xhc3RMb2FkVGltZSl9LE91LnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKCl7dmFyIG49dGhpcztyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSx0KXtuLl9sb2FkUHJvbWlzZVJlc29sdmU9ZSxuLl9sb2FkUHJvbWlzZVJlamVjdD10LG4uX2lzTG9hZGluZ3x8KG4uX2lzTG9hZD9lKCk6bi5fbG9hZEFkKCkpfSl9LE91LnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dmFyIG49dGhpcztyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSx0KXtpZighbi5faXNMb2FkaW5nKXtpZihuLmdldFByb3ZpZGVyKCk9PT1UdSYmbi5pc0V4cGlyZWQpcmV0dXJuIG4uX2lzTG9hZD0hMSxuLl9kaXNwYXRjaEV2ZW50KCJlcnJvciIsQ3UpLHZvaWQgdChuZXcgRXJyb3IoQ3UuZXJyTXNnKSk7bi5faXNMb2FkPyhuLl9yZXdhcmRBZC5zaG93KCksZSgpKTp0KG5ldyBFcnJvcihuLl9hZEVycm9yKSl9fSl9LE91LnByb3RvdHlwZS5nZXRQcm92aWRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZXdhcmRBZC5nZXRQcm92aWRlcigpfSxPdS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuX3Jld2FyZEFkLmRlc3Ryb3koKX0sT3UucHJvdG90eXBlLl9sb2FkQWQ9ZnVuY3Rpb24oKXt0aGlzLl9pc0xvYWQ9ITEsdGhpcy5faXNMb2FkaW5nPSEwLHRoaXMuX3Jld2FyZEFkLmxvYWQoKX0sT3UucHJvdG90eXBlLl9kaXNwYXRjaEV2ZW50PWZ1bmN0aW9uKGUsdCl7dGhpcy5fY2FsbGJhY2tzW2VdLmZvckVhY2goZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUodHx8e30pfSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE91LnByb3RvdHlwZSxFdSk7dmFyIEF1PSJsb2FkIixJdT0iY2xvc2UiLCR1PSJlcnJvciIsUHU9ImFkQ2xpY2tlZCIsTXU9W0F1LEl1LCR1LFB1XSxqdT1mdW5jdGlvbihlLHQpe3ZhciByPXRoaXMsbj10aGlzLl9jYWxsYmFja3M9e307TXUuZm9yRWFjaChmdW5jdGlvbih0KXtuW3RdPVtdO3ZhciBlPXRbMF0udG9VcHBlckNhc2UoKSt0LnN1YnN0cigxKTtyWyJvbiIrZV09ZnVuY3Rpb24oZSl7blt0XS5wdXNoKGUpfX0pLHRoaXMuX3ByZWxvYWQ9dm9pZCAwIT09dC5wcmVsb2FkJiZ0LnByZWxvYWQsdGhpcy5faXNMb2FkZWQ9ITEsdGhpcy5faXNMb2FkaW5nPSExLHRoaXMuX2FkRXJyb3I9IiIsdGhpcy5fbG9hZFByb21pc2VSZXNvbHZlPW51bGwsdGhpcy5fbG9hZFByb21pc2VSZWplY3Q9bnVsbCx0aGlzLl9zaG93UHJvbWlzZVJlc29sdmU9bnVsbCx0aGlzLl9zaG93UHJvbWlzZVJlamVjdD1udWxsO3ZhciBpPXRoaXMuX2FkPWU7aS5vbkxvYWQoZnVuY3Rpb24oZSl7ci5faXNMb2FkZWQ9ITAsci5faXNMb2FkaW5nPSExLG51bGwhPXIuX2xvYWRQcm9taXNlUmVzb2x2ZSYmKHIuX2xvYWRQcm9taXNlUmVzb2x2ZSgpLHIuX2xvYWRQcm9taXNlUmVzb2x2ZT1udWxsKSxudWxsIT1yLl9zaG93UHJvbWlzZVJlc29sdmUmJihyLl9zaG93UHJvbWlzZVJlc29sdmUoKSxyLl9zaG93UHJvbWlzZVJlc29sdmU9bnVsbCxyLl9zaG93QWQoKSksci5fZGlzcGF0Y2hFdmVudChBdSx7fSl9KSxpLm9uQ2xvc2UoZnVuY3Rpb24oZSl7ci5faXNMb2FkZWQ9ITEsci5faXNMb2FkaW5nPSExLHIuX2Rpc3BhdGNoRXZlbnQoSXUse2lzRW5kZWQ6ZS5pc0VuZGVkfSksITA9PT1yLl9wcmVsb2FkJiZyLl9sb2FkQWQoKX0pLGkub25FcnJvcihmdW5jdGlvbihlKXtyLl9pc0xvYWRpbmc9ITE7dmFyIHQ9e2NvZGU6ZS5jb2RlLGVyck1zZzplLm1lc3NhZ2V9O3IuX2FkRXJyb3I9dCxyLl9kaXNwYXRjaEV2ZW50KCR1LHQpO3ZhciBuPW5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShyLl9hZEVycm9yKSk7bi5jb2RlPWUuY29kZSxuLmVyck1zZz1lLm1lc3NhZ2UsbnVsbCE9ci5fbG9hZFByb21pc2VSZWplY3QmJihyLl9sb2FkUHJvbWlzZVJlamVjdChuKSxyLl9sb2FkUHJvbWlzZVJlamVjdD1udWxsKSxudWxsIT1yLl9zaG93UHJvbWlzZVJlamVjdCYmKHIuX3Nob3dQcm9taXNlUmVqZWN0KG4pLHIuX3Nob3dQcm9taXNlUmVqZWN0PW51bGwpfSksaS5vbkFkQ2xpY2tlZCYmaS5vbkFkQ2xpY2tlZChmdW5jdGlvbihlKXtyLl9kaXNwYXRjaEV2ZW50KFB1LHt9KX0pfTtqdS5wcm90b3R5cGUubG9hZD1mdW5jdGlvbigpe3ZhciBuPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUsdCl7bi5fbG9hZFByb21pc2VSZXNvbHZlPWUsbi5fbG9hZFByb21pc2VSZWplY3Q9dCxuLl9pc0xvYWRpbmd8fChuLl9pc0xvYWRlZD9lKCk6bi5fbG9hZEFkKCkpfSl9LGp1LnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dmFyIG49dGhpcztyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSx0KXtuLl9zaG93UHJvbWlzZVJlc29sdmU9ZSxuLl9zaG93UHJvbWlzZVJlamVjdD10LG4uX2lzTG9hZGluZ3x8KG4uX2lzTG9hZGVkPyhuLl9zaG93QWQoKSxlKCkpOm4uX2xvYWRBZCgpKX0pfSxqdS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuX2FkLmRlc3Ryb3koKX0sanUucHJvdG90eXBlLmdldFByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FkLmdldFByb3ZpZGVyKCl9LGp1LnByb3RvdHlwZS5fbG9hZEFkPWZ1bmN0aW9uKCl7dGhpcy5fYWRFcnJvcj0iIix0aGlzLl9pc0xvYWRlZD0hMSx0aGlzLl9pc0xvYWRpbmc9ITAsdGhpcy5fYWQubG9hZCgpfSxqdS5wcm90b3R5cGUuX3Nob3dBZD1mdW5jdGlvbigpe3RoaXMuX2FkLnNob3coKX0sanUucHJvdG90eXBlLl9kaXNwYXRjaEV2ZW50PWZ1bmN0aW9uKGUsdCl7dGhpcy5fY2FsbGJhY2tzW2VdLmZvckVhY2goZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUodHx8e30pfSl9O3ZhciBMdT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPXt9KSx0LmNhbGwodGhpcyxDdi5hZC5jcmVhdGVGdWxsU2NyZWVuVmlkZW9BZChlKSxlKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLChlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSkuY29uc3RydWN0b3I9ZX0oanUpO3ZhciBOdT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPXt9KSx0LmNhbGwodGhpcyxDdi5hZC5jcmVhdGVJbnRlcnN0aXRpYWxBZChlKSxlKSx0aGlzLl9sb2FkQWQoKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLChlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSkuY29uc3RydWN0b3I9ZX0oanUpO3ZhciBCdT17fSxEdT17fTt2YXIgUnU9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcyxyPXRoaXMuX2NhbGxiYWNrcz17fTtNdS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JbdF09W107dmFyIGU9dFswXS50b1VwcGVyQ2FzZSgpK3Quc3Vic3RyKDEpO25bIm9uIitlXT1mdW5jdGlvbihlKXtyW3RdLnB1c2goZSl9fSksdGhpcy5fYWQ9bnVsbCx0aGlzLl9hZEVycm9yPSIiLHRoaXMuX2FkcGlkPWUuYWRwaWQsdGhpcy5fcHJvdmlkZXI9ZS5wcm92aWRlcix0aGlzLl91c2VyRGF0YT1lLnVzZXJEYXRhfHx7fSx0aGlzLl9pc0xvYWRlZD0hMSx0aGlzLl9pc0xvYWRpbmc9ITEsdGhpcy5fbG9hZFByb21pc2VSZXNvbHZlPW51bGwsdGhpcy5fbG9hZFByb21pc2VSZWplY3Q9bnVsbCx0aGlzLl9zaG93UHJvbWlzZVJlc29sdmU9bnVsbCx0aGlzLl9zaG93UHJvbWlzZVJlamVjdD1udWxsLE92KGZ1bmN0aW9uKCl7bi5faW5pdCgpfSl9O1J1LnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fYWRFcnJvcj0iIixmdW5jdGlvbihlKXt2YXIgcj1lLnByb3ZpZGVyO2lmKEJ1W3JdfHwoQnVbcl09e30pLCJvYmplY3QiIT10eXBlb2YgQnVbcl0uaW5zdGFuY2UpaWYoRHVbcl18fChEdVtyXT1bXSksRHVbcl0ucHVzaChlKSwhMCE9PUJ1W3JdLmxvYWRpbmcpe0J1W3JdLmxvYWRpbmc9ITA7dmFyIGk9YWkocil8fHt9LHQ9aS5pbml0fHxpLmluaXRTREs7aWYoIXQpcmV0dXJuIER1W3JdLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5mYWlsKHtjb2RlOi0xLG1lc3NhZ2U6InByb3ZpZGVyIFsiK3IrIl0gaW52YWxpZCJ9KX0pLER1W3JdLmxlbmd0aD0wLEJ1W3JdLmxvYWRpbmc9ITE7QnVbcl0ucGx1Z2luPWksZS5fX3BsdWdpbj1pLHQoZnVuY3Rpb24odCl7dmFyIGU9dC5jb2RlLG49IkJYTS1BRCI9PT1yPzA9PT1lfHwxPT09ZTowPT09ZTtuP0J1W3JdLmluc3RhbmNlPWk6QnVbcl0ubG9hZGluZz0hMSxEdVtyXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe24/ZS5zdWNjZXNzKGUuX19wbHVnaW4pOmUuZmFpbCh0KX0pLER1W3JdLmxlbmd0aD0wfSl9ZWxzZSBlLl9fcGx1Z2luPUJ1W3JdLnBsdWdpbjtlbHNlIGUuc3VjY2VzcyhCdVtyXS5pbnN0YW5jZSl9KHtwcm92aWRlcjp0aGlzLl9wcm92aWRlcixzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuX2FkPWUsdC5fdXNlckRhdGEmJnQuYmluZFVzZXJEYXRhKHQuX3VzZXJEYXRhKSx0Ll9sb2FkQWQoKX0sZmFpbDpmdW5jdGlvbihlKXt0Ll9hZEVycm9yPWUsdC5fZGlzcGF0Y2hFdmVudCgkdSxlKX19KX0sUnUucHJvdG90eXBlLmdldFByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb3ZpZGVyfSxSdS5wcm90b3R5cGUubG9hZD1mdW5jdGlvbigpe3ZhciBuPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUsdCl7bi5fbG9hZFByb21pc2VSZXNvbHZlPWUsbi5fbG9hZFByb21pc2VSZWplY3Q9dCxuLl9pc0xvYWRpbmd8fChuLl9hZEVycm9yP24uX2luaXQoKTpuLl9pc0xvYWRlZD9lKCk6bi5fbG9hZEFkKCkpfSl9LFJ1LnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dmFyIG49dGhpcztyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSx0KXtuLl9zaG93UHJvbWlzZVJlc29sdmU9ZSxuLl9zaG93UHJvbWlzZVJlamVjdD10LG4uX2lzTG9hZGluZ3x8KG4uX2FkRXJyb3I/bi5faW5pdCgpOm4uX2lzTG9hZGVkPyhuLl9zaG93QWQoKSxlKCkpOm4uX2xvYWRBZCgpKX0pfSxSdS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe251bGwhPT10aGlzLl9hZCYmdGhpcy5fYWQuZGVzdHJveSYmdGhpcy5fYWQuZGVzdHJveSh7YWRwaWQ6dGhpcy5fYWRwaWR9KX0sUnUucHJvdG90eXBlLmJpbmRVc2VyRGF0YT1mdW5jdGlvbihlKXtudWxsIT09dGhpcy5fYWQmJnRoaXMuX2FkLmJpbmRVc2VyRGF0YSYmdGhpcy5fYWQuYmluZFVzZXJEYXRhKGUpfSxSdS5wcm90b3R5cGUuX2xvYWRBZD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYobnVsbCE9PXRoaXMuX2FkKXtpZighMD09PXRoaXMuX2lzTG9hZGluZylyZXR1cm47dGhpcy5faXNMb2FkaW5nPSEwLHRoaXMuX2FkLmxvYWREYXRhKE9iamVjdC5hc3NpZ24oe30se2FkcGlkOnRoaXMuX2FkcGlkfSx0aGlzLl91c2VyRGF0YSksZnVuY3Rpb24oZSl7dC5faXNMb2FkZWQ9ITAsdC5faXNMb2FkaW5nPSExLG51bGwhPXQuX2xvYWRQcm9taXNlUmVzb2x2ZSYmKHQuX2xvYWRQcm9taXNlUmVzb2x2ZSgpLHQuX2xvYWRQcm9taXNlUmVzb2x2ZT1udWxsKSxudWxsIT10Ll9zaG93UHJvbWlzZVJlc29sdmUmJih0Ll9zaG93UHJvbWlzZVJlc29sdmUoKSx0Ll9zaG93UHJvbWlzZVJlc29sdmU9bnVsbCx0Ll9zaG93QWQoKSksdC5fZGlzcGF0Y2hFdmVudChBdSxlKX0sZnVuY3Rpb24oZSl7dC5faXNMb2FkaW5nPSExLG51bGwhPXQuX3Nob3dQcm9taXNlUmVqZWN0JiYodC5fc2hvd1Byb21pc2VSZWplY3QodC5fY3JlYXRlRXJyb3IoZSkpLHQuX3Nob3dQcm9taXNlUmVqZWN0PW51bGwpLHQuX2Rpc3BhdGNoRXZlbnQoJHUsZSl9KX19LFJ1LnByb3RvdHlwZS5fc2hvd0FkPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztudWxsIT09dGhpcy5fYWQmJiEwPT09dGhpcy5faXNMb2FkZWQmJnRoaXMuX2FkLnNob3coe2FkcGlkOnRoaXMuX2FkcGlkfSxmdW5jdGlvbihlKXt0Ll9pc0xvYWRlZD0hMX0sZnVuY3Rpb24oZSl7dC5faXNMb2FkZWQ9ITEsbnVsbCE9dC5fc2hvd1Byb21pc2VSZWplY3QmJih0Ll9zaG93UHJvbWlzZVJlamVjdCh0Ll9jcmVhdGVFcnJvcihlKSksdC5fc2hvd1Byb21pc2VSZWplY3Q9bnVsbCksdC5fZGlzcGF0Y2hFdmVudCgkdSxlKX0pfSxSdS5wcm90b3R5cGUuX2NyZWF0ZUVycm9yPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShlKSk7cmV0dXJuIHQuY29kZT1lLmNvZGUsdC5lcnJNc2c9ZS5tZXNzYWdlLHR9LFJ1LnByb3RvdHlwZS5fZGlzcGF0Y2hFdmVudD1mdW5jdGlvbihlLHQpe3RoaXMuX2NhbGxiYWNrc1tlXS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlKHR8fHt9KX0pfTt2YXIgRnU9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsc3RhcnRQdWxsRG93blJlZnJlc2g6ZnVuY3Rpb24oKXtyZXR1cm4gY3UmJmN1LmVuZFB1bGxUb1JlZnJlc2goKSwoY3U9Z2koKSk/KGN1LmJlZ2luUHVsbFRvUmVmcmVzaCgpLHtlcnJNc2c6InN0YXJ0UHVsbERvd25SZWZyZXNoOm9rIn0pOntlcnJNc2c6InN0YXJ0UHVsbERvd25SZWZyZXNoOmZhaWwifX0sc3RvcFB1bGxEb3duUmVmcmVzaDpmdW5jdGlvbigpe3JldHVybiBjdXx8KGN1PWdpKCkpLGN1PyhjdS5lbmRQdWxsVG9SZWZyZXNoKCksY3U9bnVsbCx7ZXJyTXNnOiJzdG9wUHVsbERvd25SZWZyZXNoOm9rIn0pOntlcnJNc2c6InN0b3BQdWxsRG93blJlZnJlc2g6ZmFpbCJ9fSwkb246UXIsJG9mZjplaSwkb25jZTp0aSwkZW1pdDpuaSxjcmVhdGVBdWRpb0luc3RhbmNlOmZ1bmN0aW9uKCl7dmFyIGU9IiIrRGF0ZS5ub3coKStNYXRoLnJhbmRvbSgpLHQ9TWlbZV09Q3YuYXVkaW8uY3JlYXRlUGxheWVyKCIiKTtyZXR1cm4gdC5zcmM9IiIsdC52b2x1bWU9MSx0LnN0YXJ0VGltZT0wLHQuc2V0U2Vzc2lvbkNhdGVnb3J5KFBpKSx7ZXJyTXNnOiJjcmVhdGVBdWRpb0luc3RhbmNlOm9rIixhdWRpb0lkOmV9fSxkZXN0cm95QXVkaW9JbnN0YW5jZTpmdW5jdGlvbihlKXt2YXIgdD1lLmF1ZGlvSWQ7cmV0dXJuIE1pW3RdJiYoTWlbdF0uY2xvc2UoKSxkZWxldGUgTWlbdF0pLHtlcnJNc2c6ImRlc3Ryb3lBdWRpb0luc3RhbmNlOm9rIixhdWRpb0lkOnR9fSxzZXRBdWRpb1N0YXRlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuYXVkaW9JZCxuPWUuc3JjLHI9ZS5zdGFydFRpbWUsaT1lLmF1dG9wbGF5O3ZvaWQgMD09PWkmJihpPSExKTt2YXIgbz1lLmxvb3A7dm9pZCAwPT09byYmKG89ITEpLGUub2JleU11dGVTd2l0Y2g7dmFyIGE9ZS52b2x1bWUscz1lLnNlc3Npb25DYXRlZ29yeTt2b2lkIDA9PT1zJiYocz1QaSk7dmFyIGMsdSxsPWUucGxheWJhY2tSYXRlLGQ9TWlbdF07aWYoZCl7dmFyIGY9e2xvb3A6byxhdXRvcGxheTppfTtpZihuKXt2YXIgcD1faShuKTtkLnNyYyE9PXAmJihkLnNyYz1mLnNyYz1wKX1yJiYoZC5zdGFydFRpbWU9Zi5zdGFydFRpbWU9ciksIm51bWJlciI9PXR5cGVvZiBhJiYoZC52b2x1bWU9Zi52b2x1bWU9YSksZC5zZXRTdHlsZXMoZikscyYmZC5zZXRTZXNzaW9uQ2F0ZWdvcnkocyksbCYmZC5wbGF5YmFja1JhdGUmJmQucGxheWJhY2tSYXRlKGwpLCh1PU1pW2M9dF0pJiYodS5pbml0U3RhdGVDaGFnZXx8KHUuaW5pdFN0YXRlQ2hhZ2U9ITAsdS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oZSl7TGkoImVycm9yIix7YXVkaW9JZDpjLGVyck1zZzoiTWVkaWFFcnJvciIsZXJyQ29kZTplLmNvZGV9KX0pLGppLmZvckVhY2goZnVuY3Rpb24oZSl7dS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oKXsicGxheSI9PT1lP3UuaXNTdG9wcGVkPSExOiJzdG9wIj09PWUmJih1LmlzU3RvcHBlZD0hMCksTGkoZSx7YXVkaW9JZDpjfSl9KX0pKSl9cmV0dXJue2Vyck1zZzoic2V0QXVkaW9TdGF0ZTpvayJ9fSxnZXRBdWRpb1N0YXRlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuYXVkaW9JZCxuPU1pW3RdO2lmKCFuKXJldHVybntlcnJNc2c6ImdldEF1ZGlvU3RhdGU6ZmFpbCJ9O3ZhciByPW4uc3JjLGk9bi5zdGFydFRpbWUsbz1uLnZvbHVtZTtyZXR1cm57ZXJyTXNnOiJnZXRBdWRpb1N0YXRlOm9rIixkdXJhdGlvbjoxZTMqKG4uZ2V0RHVyYXRpb24oKXx8MCksY3VycmVudFRpbWU6bi5pc1N0b3BwZWQ/MDoxZTMqbi5nZXRQb3NpdGlvbigpLHBhdXNlZDpuLmlzUGF1c2VkKCksc3JjOnIsdm9sdW1lOm8sc3RhcnRUaW1lOjFlMyppLGJ1ZmZlcmVkOjFlMypuLmdldEJ1ZmZlcmVkKCl9fSxvcGVyYXRlQXVkaW86ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vcGVyYXRpb25UeXBlLG49ZS5hdWRpb0lkLHI9ZS5jdXJyZW50VGltZSxpPU1pW25dLG89WyJwbGF5IiwicGF1c2UiLCJzdG9wIl07cmV0dXJuIDA8PW8uaW5kZXhPZih0KT9pW3Q9PT1vWzBdJiZpLmlzUGF1c2VkKCk/InJlc3VtZSI6dF0oKToic2VlayI9PT10JiZpLnNlZWtUbyhyLzFlMykse2Vyck1zZzoib3BlcmF0ZUF1ZGlvOm9rIn19LGdldE11c2ljUGxheWVyU3RhdGU6ZnVuY3Rpb24oKXt2YXIgZT1VaSgpO3JldHVybiBlP3tkYXRhVXJsOmUuc3JjLGR1cmF0aW9uOmUuZ2V0RHVyYXRpb24oKXx8MCxjdXJyZW50UG9zaXRpb246ZS5nZXRQb3NpdGlvbigpLHN0YXR1czplLmlzUGF1c2VkKCk/MDoxLGRvd25sb2FkUGVyY2VudDpNYXRoLnJvdW5kKDEwMCplLmdldEJ1ZmZlcmVkKCkvZS5nZXREdXJhdGlvbigpKSxlcnJNc2c6ImdldE11c2ljUGxheWVyU3RhdGU6b2sifTp7c3RhdHVzOjIsZXJyTXNnOiJnZXRNdXNpY1BsYXllclN0YXRlOm9rIn19LG9wZXJhdGVNdXNpY1BsYXllcjpxaSxzZXRCYWNrZ3JvdW5kQXVkaW9TdGF0ZTpmdW5jdGlvbihlLHQpe3JldHVybiBWaShlLHQpLHtlcnJNc2c6InNldEJhY2tncm91bmRBdWRpb1N0YXRlOm9rIn19LG9wZXJhdGVCYWNrZ3JvdW5kQXVkaW86ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vcGVyYXRpb25UeXBlLG49ZS5zcmMscj1lLnN0YXJ0VGltZSxpPWUuY3VycmVudFRpbWU7cmV0dXJuIHFpKHtvcGVyYXRpb25UeXBlOnQsZGF0YVVybDpuLHBvc2l0aW9uOnJ8fGl8fDAsYXBpOiJvcGVyYXRlQmFja2dyb3VuZEF1ZGlvIn0pfSxnZXRCYWNrZ3JvdW5kQXVkaW9TdGF0ZTpmdW5jdGlvbigpe3ZhciBlPXtkdXJhdGlvbjowLGN1cnJlbnRUaW1lOjAscGF1c2VkOiExLHNyYzoiIixidWZmZXJlZDowLHRpdGxlOiIiLGVwbmFtZToiIixzaW5nZXI6IiIsY292ZXJJbWdVcmw6IiIsd2ViVXJsOiIiLHN0YXJ0VGltZTowLGVyck1zZzoiZ2V0QmFja2dyb3VuZEF1ZGlvU3RhdGU6b2sifSx0PVVpKCk7aWYodCl7dmFyIG49e2R1cmF0aW9uOnQuZ2V0RHVyYXRpb24oKXx8MCxjdXJyZW50VGltZTp0LmlzU3RvcHBlZD8wOnQuZ2V0UG9zaXRpb24oKSxwYXVzZWQ6dC5pc1BhdXNlZCgpLHNyYzp0LnNyYyxidWZmZXJlZDp0LmdldEJ1ZmZlcmVkKCksdGl0bGU6dC50aXRsZSxlcG5hbWU6dC5lcG5hbWUsc2luZ2VyOnQuc2luZ2VyLGNvdmVySW1nVXJsOnQuY292ZXJJbWdVcmwsd2ViVXJsOnQud2ViVXJsLHN0YXJ0VGltZTp0LnN0YXJ0VGltZX07ZT1PYmplY3QuYXNzaWduKGUsbil9cmV0dXJuIGV9LG9wZXJhdGVNYXBQbGF5ZXI6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHMsYyx1LGw7dC4kcGFnZS5tZXRhLmlzTlZ1ZT8oYz1lLHU9dCxsPXIsUWlbbl0oSmkoYyx1KSxsKSk6KGk9ZSxvPW4sYT1yLHM9dC4kcGFnZS5pZCxUdi5wdWJsaXNoSGFuZGxlcihzKyItbWFwLSIraSx7bWFwSWQ6aSx0eXBlOm8sZGF0YTphfSxzKSl9LG9wZXJhdGVWaWRlb1BsYXllcjpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscyxjLHUsbDt0LiRwYWdlLm1ldGEuaXNOVnVlPyhjPWUsdT10LGw9cixlb1tuXShKaShjLHUpLGwpKTooaT1lLG89bixhPXIscz10LiRwYWdlLmlkLFR2LnB1Ymxpc2hIYW5kbGVyKHMrIi12aWRlby0iK2kse3ZpZGVvSWQ6aSx0eXBlOm8sZGF0YTphfSxzKSl9LExpdmVQdXNoZXJDb250ZXh0OmlvLGNyZWF0ZUxpdmVQdXNoZXJDb250ZXh0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuJHBhZ2UubWV0YS5pc05WdWU/ZnVuY3Rpb24oZSx0KXtpZighdClyZXR1cm4gY29uc29sZS53YXJuKCJ1bmkuY3JlYXRlTGl2ZVB1c2hlckNvbnRleHQ6IDIgYXJndW1lbnRzIHJlcXVpcmVkLCBidXQgb25seSAxIHByZXNlbnQiKTt2YXIgbj1KaShlLHQpO3JldHVybiBuP25ldyB0byhlLG4pOmNvbnNvbGUud2FybigiQ2FuIG5vdCBmaW5kIGAiK2UrImAiKX0oZSx0KTpuZXcgaW8oZSx0KX0sc3RhcnRBY2NlbGVyb21ldGVyOnBvLHN0b3BBY2NlbGVyb21ldGVyOmhvLG9uQWNjZWxlcm9tZXRlckNoYW5nZTpmdW5jdGlvbihlKXtmby5sZW5ndGh8fHBvKCksZm8ucHVzaChlKX0sb2ZmQWNjZWxlcm9tZXRlckNoYW5nZTpmdW5jdGlvbihlKXtpZihlKXt2YXIgdD1mby5pbmRleE9mKGUpOzA8PXQmJmZvLnNwbGljZSh0LDEpfWZvLmxlbmd0aHx8aG8oKX0sYWRkUGhvbmVDb250YWN0OmZ1bmN0aW9uKG4scil7Q3YuY29udGFjdHMuZ2V0QWRkcmVzc0Jvb2soQ3YuY29udGFjdHMuQUREUkVTU0JPT0tfUEhPTkUsZnVuY3Rpb24oZSl7IW4ucGhvdG9GaWxlUGF0aCYmKG4ucGhvdG9GaWxlUGF0aD0iIik7dmFyIHQ9ZS5jcmVhdGUoKTshZnVuY3Rpb24gcihpLG8sdCl7dmFyIGE9MDtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihuKXt2YXIgZT10W25dOyJvYmplY3QiIT10eXBlb2YgZT8tMSE9PWdvLmluZGV4T2Yobik/aVtuXT10W25dOnZvaWQgMCE9PW9bZV0/KGErKyxpW25dPW9bZV0pOmRlbGV0ZSBpW25dOmUgaW5zdGFuY2VvZiBBcnJheT8oaVtuXT1bXSxlLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9e307cih0LG8sZSkmJmlbbl0ucHVzaCh0KX0pLGlbbl0ubGVuZ3RoP2ErKzpkZWxldGUgaVtuXSk6KGlbbl09e30scihpW25dLG8sZSk/YSsrOmRlbGV0ZSBpW25dKX0pLGF9KHQsbix2byksdC5zYXZlKGZ1bmN0aW9uKCl7b2kocix7ZXJyTXNnOiJhZGRQaG9uZUNvbnRhY3Q6b2sifSl9LGZ1bmN0aW9uKGUpe29pKHIse2Vyck1zZzoiYWRkUGhvbmVDb250YWN0OmZhaWwifSl9KX0sZnVuY3Rpb24oZSl7b2kocix7ZXJyTXNnOiJhZGRQaG9uZUNvbnRhY3Q6ZmFpbCJ9KX0pfSxvbkJsdWV0b290aERldmljZUZvdW5kOm1vLG9uQmx1ZXRvb3RoQWRhcHRlclN0YXRlQ2hhbmdlOnlvLG9uQkxFQ29ubmVjdGlvblN0YXRlQ2hhbmdlOl9vLG9uQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZTpibyxvcGVuQmx1ZXRvb3RoQWRhcHRlcjpTbyxjbG9zZUJsdWV0b290aEFkYXB0ZXI6eG8sZ2V0Qmx1ZXRvb3RoQWRhcHRlclN0YXRlOkNvLHN0YXJ0Qmx1ZXRvb3RoRGV2aWNlc0Rpc2NvdmVyeTpUbyxzdG9wQmx1ZXRvb3RoRGV2aWNlc0Rpc2NvdmVyeTpPbyxnZXRCbHVldG9vdGhEZXZpY2VzOkVvLGdldENvbm5lY3RlZEJsdWV0b290aERldmljZXM6QW8sY3JlYXRlQkxFQ29ubmVjdGlvbjpJbyxjbG9zZUJMRUNvbm5lY3Rpb246JG8sZ2V0QkxFRGV2aWNlU2VydmljZXM6UG8sZ2V0QkxFRGV2aWNlQ2hhcmFjdGVyaXN0aWNzOk1vLG5vdGlmeUJMRUNoYXJhY3RlcmlzdGljVmFsdWVDaGFuZ2U6am8scmVhZEJMRUNoYXJhY3RlcmlzdGljVmFsdWU6TG8sd3JpdGVCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlOk5vLHNldEJMRU1UVTpCbyxnZXRCTEVEZXZpY2VSU1NJOkRvLGdldFNjcmVlbkJyaWdodG5lc3M6ZnVuY3Rpb24oKXtyZXR1cm57ZXJyTXNnOiJnZXRTY3JlZW5CcmlnaHRuZXNzOm9rIix2YWx1ZTpDdi5zY3JlZW4uZ2V0QnJpZ2h0bmVzcyghMSl9fSxzZXRTY3JlZW5CcmlnaHRuZXNzOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLnZhbHVlO3JldHVybiBDdi5zY3JlZW4uc2V0QnJpZ2h0bmVzcyh0LCExKSx7ZXJyTXNnOiJzZXRTY3JlZW5CcmlnaHRuZXNzOm9rIn19LHNldEtlZXBTY3JlZW5PbjpmdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS5rZWVwU2NyZWVuT247cmV0dXJuIEN2LmRldmljZS5zZXRXYWtlbG9jayghIXQpLHtlcnJNc2c6InNldEtlZXBTY3JlZW5PbjpvayJ9fSxnZXRDbGlwYm9hcmREYXRhOmZ1bmN0aW9uKGUsdCl7YWkoImNsaXBib2FyZCIpLmdldFN0cmluZyhmdW5jdGlvbihlKXsic3VjY2VzcyI9PT1lLnJlc3VsdD9vaSh0LHtkYXRhOmUuZGF0YSxlcnJNc2c6ImdldENsaXBib2FyZERhdGE6b2sifSk6b2kodCx7ZGF0YTplLnJlc3VsdCxlcnJNc2c6ImdldENsaXBib2FyZERhdGE6ZmFpbCJ9KX0pfSxzZXRDbGlwYm9hcmREYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0YTtyZXR1cm4gYWkoImNsaXBib2FyZCIpLnNldFN0cmluZyh0KSx7ZXJyTXNnOiJzZXRDbGlwYm9hcmREYXRhOm9rIn19LHN0YXJ0Q29tcGFzczpGbyxzdG9wQ29tcGFzczp6byxvbkNvbXBhc3NDaGFuZ2U6ZnVuY3Rpb24oZSl7Um8ubGVuZ3RofHxGbygpLFJvLnB1c2goZSl9LG9mZkNvbXBhc3NDaGFuZ2U6ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9Um8uaW5kZXhPZihlKTswPD10JiZSby5zcGxpY2UodCwxKX1Sby5sZW5ndGh8fHpvKCl9LGdldE5ldHdvcmtUeXBlOmZ1bmN0aW9uKCl7cmV0dXJue2Vyck1zZzoiZ2V0TmV0d29ya1R5cGU6b2siLG5ldHdvcmtUeXBlOnNvW0N2Lm5ldHdvcmtpbmZvLmdldEN1cnJlbnRUeXBlKCldfHwidW5rbm93biJ9fSxvbkJlYWNvblVwZGF0ZTpWbyxvbkJlYWNvblNlcnZpY2VDaGFuZ2U6VW8sZ2V0QmVhY29uczpxbyxzdGFydEJlYWNvbkRpc2NvdmVyeTpXbyxzdG9wQmVhY29uRGlzY292ZXJ5OkhvLG1ha2VQaG9uZUNhbGw6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUucGhvbmVOdW1iZXI7cmV0dXJuIEN2LmRldmljZS5kaWFsKHQpLHtlcnJNc2c6Im1ha2VQaG9uZUNhbGw6b2sifX0sc2NhbkNvZGU6ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07dmFyIG49IndlZXgiIT09JHYubnZ1ZUNvbXBpbGVyP0NhOnlhO3JldHVybiBuLnNjYW5Db2RlLmFwcGx5KG4sZSl9LGNoZWNrSXNTdXBwb3J0U290ZXJBdXRoZW50aWNhdGlvbjpFYSxjaGVja0lzU290ZXJFbnJvbGxlZEluRGV2aWNlOkFhLHN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLnJlcXVlc3RBdXRoTW9kZXMscj1lLmNoYWxsZW5nZTt2b2lkIDA9PT1yJiYocj0hMSk7dmFyIGk9ZS5hdXRoQ29udGVudCxvPUVhKCkuc3VwcG9ydE1vZGU7aWYoMD09PW8ubGVuZ3RoKXJldHVybnthdXRoTW9kZTpvWzBdfHwiZmluZ2VyUHJpbnQiLGVyckNvZGU6OTAwMDEsZXJyTXNnOiJzdGFydFNvdGVyQXV0aGVudGljYXRpb246ZmFpbCJ9O3ZhciBhPVtdO2lmKG4ubWFwKGZ1bmN0aW9uKGUsdCl7LTE8by5pbmRleE9mKGUpJiZhLnB1c2goZSl9KSwwPT09YS5sZW5ndGgpcmV0dXJue2F1dGhNb2RlOmFbMF18fCJmaW5nZXJQcmludCIsZXJyQ29kZTo5MDAwMyxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIG5vIGNvcnJlc3BvbmRpbmcgbW9kZSJ9O3ZhciBzPVtdO2lmKGEubWFwKGZ1bmN0aW9uKGUsdCl7QWEoe2NoZWNrQXV0aE1vZGU6ZX0pLmlzRW5yb2xsZWQmJnMucHVzaChlKX0pLDA9PT1zLmxlbmd0aClyZXR1cm57YXV0aE1vZGU6YVswXSxlcnJDb2RlOjkwMDExLGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwgbm8gIithWzBdKyIgZW5yb2xsZWQifTt2YXIgYz1zWzBdOyJmaW5nZXJQcmludCI9PT1jPygiYW5kcm9pZCI9PT1Ddi5vcy5uYW1lLnRvTG93ZXJDYXNlKCkmJihDdi5uYXRpdmVVSS5zaG93V2FpdGluZyhpfHxRZSgidW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi5hdXRoQ29udGVudCIpKS5vbmNsb3NlPWZ1bmN0aW9uKCl7Q3YuZmluZ2VycHJpbnQuY2FuY2VsKCl9KSxDdi5maW5nZXJwcmludC5hdXRoZW50aWNhdGUoZnVuY3Rpb24oKXtDdi5uYXRpdmVVSS5jbG9zZVdhaXRpbmcoKSxvaSh0LHthdXRoTW9kZTpjLGVyckNvZGU6MCxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpvayJ9KX0sZnVuY3Rpb24oZSl7c3dpdGNoKGUuY29kZSl7Y2FzZSBlLkFVVEhFTlRJQ0FURV9NSVNNQVRDSDpicmVhaztjYXNlIGUuQVVUSEVOVElDQVRFX09WRVJMSU1JVDpDdi5uYXRpdmVVSS5jbG9zZVdhaXRpbmcoKSxvaSh0LHthdXRoTW9kZTpjLGVyckNvZGU6OTAwMTAsZXJyTXNnOiJzdGFydFNvdGVyQXV0aGVudGljYXRpb246ZmFpbCBhdXRoZW50aWNhdGUgZnJlZXplLiBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyIn0pO2JyZWFrO2Nhc2UgZS5DQU5DRUw6Q3YubmF0aXZlVUkuY2xvc2VXYWl0aW5nKCksb2kodCx7YXV0aE1vZGU6YyxlcnJDb2RlOjkwMDA4LGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwgY2FuY2VsIn0pO2JyZWFrO2RlZmF1bHQ6Q3YubmF0aXZlVUkuY2xvc2VXYWl0aW5nKCksb2kodCx7YXV0aE1vZGU6YyxlcnJDb2RlOjkwMDA3LGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwifSl9fSx7bWVzc2FnZTppfSkpOiJmYWNpYWwiPT09YyYmYWkoImZhY2VJRCIpLmF1dGhlbnRpY2F0ZSh7bWVzc2FnZTppfSxmdW5jdGlvbihlKXtpZigic3VjY2VzcyI9PT1lLnR5cGUmJjA9PT1lLmNvZGUpb2kodCx7YXV0aE1vZGU6YyxlcnJDb2RlOjAsZXJyTXNnOiJzdGFydFNvdGVyQXV0aGVudGljYXRpb246b2sifSk7ZWxzZSBzd2l0Y2goZS5jb2RlKXtjYXNlIDQ6b2kodCx7YXV0aE1vZGU6YyxlcnJDb2RlOjkwMDA5LGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwifSk7YnJlYWs7Y2FzZSA1Om9pKHQse2F1dGhNb2RlOmMsZXJyQ29kZTo5MDAxMCxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIGF1dGhlbnRpY2F0ZSBmcmVlemUuIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIifSk7YnJlYWs7Y2FzZSA2Om9pKHQse2F1dGhNb2RlOmMsZXJyQ29kZTo5MDAwOCxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIGNhbmNlbCJ9KTticmVhaztkZWZhdWx0Om9pKHQse2F1dGhNb2RlOmMsZXJyQ29kZTo5MDAwNyxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIn0pfX0pfSxnZXREZXZpY2VJbmZvOnphLGdldEFwcEJhc2VJbmZvOlZhLGdldFN5c3RlbUluZm9TeW5jOmZ1bmN0aW9uKCl7cmV0dXJuIGhpKFVhLE9iamVjdC5jcmVhdGUobnVsbCksImdldFN5c3RlbUluZm8iLCJnZXRTeXN0ZW1JbmZvU3luYyIpfSxnZXRTeXN0ZW1JbmZvOlVhLHZpYnJhdGVMb25nOmZ1bmN0aW9uKCl7cmV0dXJuIEN2LmRldmljZS52aWJyYXRlKDQwMCkse2Vyck1zZzoidmlicmF0ZUxvbmc6b2sifX0sdmlicmF0ZVNob3J0OmZ1bmN0aW9uKCl7cmV0dXJuIEN2LmRldmljZS52aWJyYXRlKDE1KSx7ZXJyTXNnOiJ2aWJyYXRlU2hvcnQ6b2sifX0sZ2V0V2luZG93SW5mbzpCYSxnZXRTeXN0ZW1TZXR0aW5nOmZ1bmN0aW9uKCl7dmFyIGU9KDAseHYucmVxdWlyZU1vZHVsZSgicGx1cyIpLmdldFN5c3RlbVNldHRpbmcpKCk7dHJ5eyJzdHJpbmciPT10eXBlb2YgZSYmKGU9SlNPTi5wYXJzZShlKSl9Y2F0Y2goZSl7fXJldHVybiBlfSxnZXRBcHBBdXRob3JpemVTZXR0aW5nOnFhLG9wZW5BcHBBdXRob3JpemVTZXR0aW5nOmZ1bmN0aW9uKGUsdCl7KDAseHYucmVxdWlyZU1vZHVsZSgicGx1cyIpLm9wZW5BcHBBdXRob3JpemVTZXR0aW5nKShmdW5jdGlvbihlKXsic3VjY2VzcyI9PT1lLnR5cGU/b2kodCx7ZXJyTXNnOiJnZXRDbGlwYm9hcmREYXRhOm9rIn0pOm9pKHQse2Vyck1zZzoiZ2V0Q2xpcGJvYXJkRGF0YTpmYWlsIn0pfSl9LHNhdmVGaWxlOmZ1bmN0aW9uKGUsbil7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0LHI9ZS50ZW1wRmlsZVBhdGgsaT1FaShuLCJzYXZlRmlsZSIpLG89IiIrRGF0ZS5ub3coKStYYSsrKygxPCh0PXIuc3BsaXQoIi4iKSkubGVuZ3RoPyIuIit0W3QubGVuZ3RoLTFdOiIiKTtDdi5pby5yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMKHIsZnVuY3Rpb24odCl7R2EoZnVuY3Rpb24oZSl7dC5jb3B5VG8oZSxvLGZ1bmN0aW9uKCl7b2kobix7ZXJyTXNnOiJzYXZlRmlsZTpvayIsc2F2ZWRGaWxlUGF0aDpIYSsiLyIrb30pfSxpKX0saSl9LGkpfSxnZXRTYXZlZEZpbGVMaXN0OmZ1bmN0aW9uKGUsaSl7dmFyIG89RWkoaSwiZ2V0U2F2ZWRGaWxlTGlzdCIpO0dhKGZ1bmN0aW9uKGUpe3ZhciB0PWUuY3JlYXRlUmVhZGVyKCkscj1bXTt0LnJlYWRFbnRyaWVzKGZ1bmN0aW9uKG4pe24mJm4ubGVuZ3RoP24uZm9yRWFjaChmdW5jdGlvbih0KXt0LmdldE1ldGFkYXRhKGZ1bmN0aW9uKGUpe3IucHVzaCh7ZmlsZVBhdGg6Q3YuaW8uY29udmVydEFic29sdXRlRmlsZVN5c3RlbSh0LmZ1bGxQYXRoKSxjcmVhdGVUaW1lOmUubW9kaWZpY2F0aW9uVGltZS5nZXRUaW1lKCksc2l6ZTplLnNpemV9KSxyLmxlbmd0aD09PW4ubGVuZ3RoJiZvaShpLHtlcnJNc2c6ImdldFNhdmVkRmlsZUxpc3Q6b2siLGZpbGVMaXN0OnJ9KX0sbywhMSl9KTpvaShpLHtlcnJNc2c6ImdldFNhdmVkRmlsZUxpc3Q6b2siLGZpbGVMaXN0OnJ9KX0sbyl9LG8pfSxnZXRGaWxlSW5mbzpZYSxnZXRTYXZlZEZpbGVJbmZvOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUuZmlsZVBhdGgscj1FaSh0LCJnZXRTYXZlZEZpbGVJbmZvIik7Q3YuaW8ucmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSTChuLGZ1bmN0aW9uKGUpe2UuZ2V0TWV0YWRhdGEoZnVuY3Rpb24oZSl7b2kodCx7Y3JlYXRlVGltZTplLm1vZGlmaWNhdGlvblRpbWUuZ2V0VGltZSgpLHNpemU6ZS5zaXplLGVyck1zZzoiZ2V0U2F2ZWRGaWxlSW5mbzpvayJ9KX0sciwhMSl9LHIpfSxyZW1vdmVTYXZlZEZpbGU6ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS5maWxlUGF0aCxyPUVpKHQsInJlbW92ZVNhdmVkRmlsZSIpO0N2LmlvLnJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkwobixmdW5jdGlvbihlKXtlLnJlbW92ZShmdW5jdGlvbigpe29pKHQse2Vyck1zZzoicmVtb3ZlU2F2ZWRGaWxlOm9rIn0pfSxyKX0scil9LG9wZW5Eb2N1bWVudDpmdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLmZpbGVQYXRoLHI9KGUuZmlsZVR5cGUsT2kodCwic2F2ZUZpbGUiKSksaT1FaSh0LCJzYXZlRmlsZSIpO0N2LnJ1bnRpbWUub3BlbkRvY3VtZW50KF9pKG4pLHZvaWQgMCxyLGkpfSxjaG9vc2VMb2NhdGlvbjpmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTt2YXIgbj0id2VleCIhPT0kdi5udnVlQ29tcGlsZXI/WmE6S2E7cmV0dXJuIG4uY2hvb3NlTG9jYXRpb24uYXBwbHkobixlKX0sZ2V0TG9jYXRpb246ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS50eXBlO3ZvaWQgMD09PW4mJihuPSJ3Z3M4NCIpO3ZhciByPWUuZ2VvY29kZTt2b2lkIDA9PT1yJiYocj0hMSk7dmFyIGk9ZS5hbHRpdHVkZTt2b2lkIDA9PT1pJiYoaT0hMSk7dmFyIG89ZS5pc0hpZ2hBY2N1cmFjeTt2b2lkIDA9PT1vJiYobz0hMSk7dmFyIGE9ZS5oaWdoQWNjdXJhY3lFeHBpcmVUaW1lLHM9RWkodCwiZ2V0TG9jYXRpb24iKTtDdi5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oZnVuY3Rpb24oZSl7UWEobixlLHQpfSxmdW5jdGlvbihlKXsxNTAxIT09ZS5jb2RlP3MoZSk6UWEobixlLHQpfSx7Z2VvY29kZTpyLGVuYWJsZUhpZ2hBY2N1cmFjeTpvfHxpLHRpbWVvdXQ6YSxjb29yZHNUeXBlOm59KX0sb3BlbkxvY2F0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3ZhciBuPSJ3ZWV4IiE9PSR2Lm52dWVDb21waWxlcj90czplcztyZXR1cm4gbi5vcGVuTG9jYXRpb24uYXBwbHkobixlKX0sc3RhcnRSZWNvcmQ6ZnVuY3Rpb24oZSx0KXtucyYmbnMuc3RvcCgpLChucz1Ddi5hdWRpby5nZXRSZWNvcmRlcigpKS5yZWNvcmQoe2ZpbGVuYW1lOiJfZG9jL2F1ZGlvLyIsZm9ybWF0OiJhYWMifSxmdW5jdGlvbihlKXtvaSh0LHtlcnJNc2c6InN0YXJ0UmVjb3JkOm9rIix0ZW1wRmlsZVBhdGg6ZX0pfSxmdW5jdGlvbihlKXtvaSh0LHtlcnJNc2c6InN0YXJ0UmVjb3JkOmZhaWwifSl9KSxycz1PdihmdW5jdGlvbigpe25zLnN0b3AoKSxucz0hMX0sMzZlNSl9LHN0b3BSZWNvcmQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnM/KHJzJiZFdihycyksbnMuc3RvcCgpLHtlcnJNc2c6InN0b3BSZWNvcmQ6b2sifSk6e2Vyck1zZzoic3RvcFJlY29yZDpmYWlsIn19LHBsYXlWb2ljZTpmdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLmZpbGVQYXRoO2lmKGlzJiZvcz09PW4mJiJwYXVzZSI9PT1hcylyZXR1cm4gYXM9InBsYXkiLGlzLnBsYXkoZnVuY3Rpb24oZSl7YXM9b3M9aXM9ITEsb2kodCx7ZXJyTXNnOiJwbGF5Vm9pY2U6b2sifSl9KSx7ZXJyTXNnOiJwbGF5Vm9pY2U6b2sifTtpcyYmaXMuc3RvcCgpLG9zPW4sYXM9InBsYXkiLChpcz1Ddi5hdWRpby5jcmVhdGVQbGF5ZXIoX2kobikpKS5wbGF5KGZ1bmN0aW9uKGUpe2FzPW9zPWlzPSExLG9pKHQse2Vyck1zZzoicGxheVZvaWNlOm9rIn0pfSl9LHBhdXNlVm9pY2U6ZnVuY3Rpb24oKXtyZXR1cm4gaXMmJiJwbGF5Ij09PWFzJiYoaXMucGF1c2UoKSxhcz0icGF1c2UiKSx7ZXJyTXNnOiJwYXVzZVZvaWNlOm9rIn19LHN0b3BWb2ljZTpmdW5jdGlvbigpe3JldHVybiBpcyYmKGlzLnN0b3AoKSxhcz1vcz1pcz0hMSkse2Vyck1zZzoic3RvcFZvaWNlOm9rIn19LGNob29zZUltYWdlOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUuY291bnQscj1lLnNpemVUeXBlLGk9ZS5zb3VyY2VUeXBlLG89ZS5jcm9wLGE9RWkodCwiY2hvb3NlSW1hZ2UiLCJjYW5jZWwiKTtmdW5jdGlvbiBzKHIpe3ZhciBpPVtdLG89W107UHJvbWlzZS5hbGwoci5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHI9ZSxuZXcgUHJvbWlzZShmdW5jdGlvbih0LG4pe0N2LmlvLnJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkwocixmdW5jdGlvbihlKXtlLmdldE1ldGFkYXRhKHQsbiwhMSl9LG4pfSk7dmFyIHJ9KSkudGhlbihmdW5jdGlvbihlKXtlLmZvckVhY2goZnVuY3Rpb24oZSx0KXt2YXIgbj1yW3RdO28ucHVzaChuKSxpLnB1c2goe3BhdGg6bixzaXplOmUuc2l6ZX0pfSksb2kodCx7ZXJyTXNnOiJjaG9vc2VJbWFnZTpvayIsdGVtcEZpbGVQYXRoczpvLHRlbXBGaWxlczppfSl9KS5jYXRjaChhKX1mdW5jdGlvbiBjKCl7Q3YuY2FtZXJhLmdldENhbWVyYSgpLmNhcHR1cmVJbWFnZShmdW5jdGlvbihlKXtyZXR1cm4gcyhbZV0pfSxhLHtmaWxlbmFtZTpsbysiL2NhbWVyYS8iLHJlc29sdXRpb246ImhpZ2giLGNyb3A6byxzaXplVHlwZTpyfSl9ZnVuY3Rpb24gdSgpe0N2LmdhbGxlcnkucGljayhmdW5jdGlvbihlKXtyZXR1cm4gcyhlLmZpbGVzKX0sYSx7bWF4aW11bTpuLG11bHRpcGxlOiEwLHN5c3RlbTohMSxmaWxlbmFtZTpsbysiL2dhbGxlcnkvIixwZXJtaXNzaW9uQWxlcnQ6ITAsY3JvcDpvLHNpemVUeXBlOnJ9KX1pZigxPT09aS5sZW5ndGgpe2lmKGkuaW5jbHVkZXMoImFsYnVtIikpcmV0dXJuIHZvaWQgdSgpO2lmKGkuaW5jbHVkZXMoImNhbWVyYSIpKXJldHVybiB2b2lkIGMoKX1Ddi5uYXRpdmVVSS5hY3Rpb25TaGVldCh7Y2FuY2VsOlFlKCJ1bmkuY2hvb3NlSW1hZ2UuY2FuY2VsIiksYnV0dG9uczpbe3RpdGxlOlFlKCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5jYW1lcmEiKX0se3RpdGxlOlFlKCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5hbGJ1bSIpfV19LGZ1bmN0aW9uKGUpe3N3aXRjaChlLmluZGV4KXtjYXNlIDE6YygpO2JyZWFrO2Nhc2UgMjp1KCk7YnJlYWs7ZGVmYXVsdDphKCl9fSl9LGNob29zZVZpZGVvOmZ1bmN0aW9uKGUscil7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUuc291cmNlVHlwZSxuPWUuY29tcHJlc3NlZCxpPWUubWF4RHVyYXRpb24sbz1lLmNhbWVyYSxhPUVpKHIsImNob29zZVZpZGVvIiwiY2FuY2VsIik7ZnVuY3Rpb24gcyhuKXt2b2lkIDA9PT1uJiYobj0iIiksQ3YuaW8uZ2V0VmlkZW9JbmZvKHtmaWxlUGF0aDpuLHN1Y2Nlc3M6ZnVuY3Rpb24oZSl7dmFyIHQ9e2Vyck1zZzoiY2hvb3NlVmlkZW86b2siLHRlbXBGaWxlUGF0aDpufTt0LnNpemU9ZS5zaXplLHQuZHVyYXRpb249ZS5kdXJhdGlvbix0LndpZHRoPWUud2lkdGgsdC5oZWlnaHQ9ZS5oZWlnaHQsb2kocix0KX0sZmFpbDphfSl9ZnVuY3Rpb24gYygpe0N2LmdhbGxlcnkucGljayhmdW5jdGlvbihlKXtyZXR1cm4gcyhlLmZpbGVzWzBdKX0sYSx7ZmlsdGVyOiJ2aWRlbyIsc3lzdGVtOiExLG11bHRpcGxlOiEwLG1heGltdW06MSxmaWxlbmFtZTpsbysiL2dhbGxlcnkvIixwZXJtaXNzaW9uQWxlcnQ6ITAsdmlkZW9Db21wcmVzczpufSl9ZnVuY3Rpb24gdSgpe0N2LmNhbWVyYS5nZXRDYW1lcmEoKS5zdGFydFZpZGVvQ2FwdHVyZShzLGEse2luZGV4OiJmcm9udCI9PT1vPzI6MSx2aWRlb01heGltdW1EdXJhdGlvbjppLGZpbGVuYW1lOmxvKyIvY2FtZXJhLyIsdmlkZW9Db21wcmVzczpufSl9aWYoMT09PXQubGVuZ3RoKXtpZih0LmluY2x1ZGVzKCJhbGJ1bSIpKXJldHVybiB2b2lkIGMoKTtpZih0LmluY2x1ZGVzKCJjYW1lcmEiKSlyZXR1cm4gdm9pZCB1KCl9Q3YubmF0aXZlVUkuYWN0aW9uU2hlZXQoe2NhbmNlbDpRZSgidW5pLmNob29zZVZpZGVvLmNhbmNlbCIpLGJ1dHRvbnM6W3t0aXRsZTpRZSgidW5pLmNob29zZVZpZGVvLnNvdXJjZVR5cGUuY2FtZXJhIil9LHt0aXRsZTpRZSgidW5pLmNob29zZVZpZGVvLnNvdXJjZVR5cGUuYWxidW0iKX1dfSxmdW5jdGlvbihlKXtzd2l0Y2goZS5pbmRleCl7Y2FzZSAxOnUoKTticmVhaztjYXNlIDI6YygpO2JyZWFrO2RlZmF1bHQ6YSgpfX0pfSxjb21wcmVzc0ltYWdlOmZ1bmN0aW9uKGUsdCl7dmFyIG49bG8rIi9jb21wcmVzc2VkLyIrRGF0ZS5ub3coKSsiXyIrSWkoZS5zcmMpLHI9RWkodCwiY29tcHJlc3NJbWFnZSIpO0N2LnppcC5jb21wcmVzc0ltYWdlKE9iamVjdC5hc3NpZ24oe30sZSx7ZHN0Om59KSxmdW5jdGlvbigpe29pKHQse2Vyck1zZzoiY29tcHJlc3NJbWFnZTpvayIsdGVtcEZpbGVQYXRoOm59KX0scil9LGNvbXByZXNzVmlkZW86ZnVuY3Rpb24oZSx0KXt2YXIgbj1sbysiL2NvbXByZXNzZWQvIitEYXRlLm5vdygpKyJfIitJaShlLnNyYykscj1PaSh0LCJjb21wcmVzc1ZpZGVvIiksaT1FaSh0LCJjb21wcmVzc1ZpZGVvIik7Q3YuemlwLmNvbXByZXNzVmlkZW8oT2JqZWN0LmFzc2lnbih7fSxlLHtmaWxlbmFtZTpufSkscixpKX0sZ2V0SW1hZ2VJbmZvOnVzLGdldFZpZGVvSW5mbzpscyxwcmV2aWV3SW1hZ2VQbHVzOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLmN1cnJlbnQ7dm9pZCAwPT09dCYmKHQ9MCk7dmFyIG49ZS5iYWNrZ3JvdW5kO3ZvaWQgMD09PW4mJihuPSIjMDAwMDAwIik7dmFyIHI9ZS5pbmRpY2F0b3I7dm9pZCAwPT09ciYmKHI9Im51bWJlciIpO3ZhciBpPWUubG9vcDt2b2lkIDA9PT1pJiYoaT0hMSk7dmFyIG89ZS51cmxzLGE9ZS5sb25nUHJlc3NBY3Rpb25zO289by5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIF9pKGUpfSk7dmFyIHM9TnVtYmVyKHQpO3JldHVybiB0PWlzTmFOKHMpPyh0PW8uaW5kZXhPZihfaSh0KSkpPDA/MDp0OnMsQ3YubmF0aXZlVUkucHJldmlld0ltYWdlKG8se2N1cnJlbnQ6dCxiYWNrZ3JvdW5kOm4saW5kaWNhdG9yOnIsbG9vcDppLG9uTG9uZ1ByZXNzOmZ1bmN0aW9uKHQpe3ZhciBlPVtdLG49IiIscj0iIixpPWEmJmEuY2FsbGJhY2tJZDtpPyhlPWEuaXRlbUxpc3Q/YS5pdGVtTGlzdDpbXSxuPWEuaXRlbUNvbG9yP2EuaXRlbUNvbG9yOiIjMDAwMDAwIixyPWEudGl0bGU/YS50aXRsZToiIik6KGU9W1FlKCJ1bmkucHJldmlld0ltYWdlLmJ1dHRvbi5zYXZlIildLG49IiMwMDAwMDAiLHI9IiIpO3ZhciBvPXtidXR0b25zOmUubWFwKGZ1bmN0aW9uKGUpe3JldHVybnt0aXRsZTplLGNvbG9yOm59fSksY2FuY2VsOlFlKCJ1bmkucHJldmlld0ltYWdlLmNhbmNlbCIpfTtyJiYoby50aXRsZT1yKSxDdi5uYXRpdmVVSS5hY3Rpb25TaGVldChvLGZ1bmN0aW9uKGUpe2lmKDA8ZS5pbmRleCl7aWYoaSlyZXR1cm4gdm9pZCBzaShhLmNhbGxiYWNrSWQse2Vyck1zZzoic2hvd0FjdGlvblNoZWV0Om9rIix0YXBJbmRleDplLmluZGV4LTEsaW5kZXg6dC5pbmRleH0pO0N2LmdhbGxlcnkuc2F2ZSh0LnVybCxmdW5jdGlvbihlKXtDdi5uYXRpdmVVSS50b2FzdChRZSgidW5pLnByZXZpZXdJbWFnZS5zYXZlLnN1Y2Nlc3MiKSl9LGZ1bmN0aW9uKCl7Q3YubmF0aXZlVUkudG9hc3QoUWUoInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5mYWlsIikpfSl9ZWxzZSBpJiZzaShhLmNhbGxiYWNrSWQse2Vyck1zZzoic2hvd0FjdGlvblNoZWV0OmZhaWwgY2FuY2VsIn0pfSl9fSkse2Vyck1zZzoicHJldmlld0ltYWdlOm9rIn19LGNsb3NlUHJldmlld0ltYWdlUGx1czpmdW5jdGlvbigpe3RyeXtyZXR1cm4gQ3YubmF0aXZlVUkuY2xvc2VQcmV2aWV3SW1hZ2UoKSx7ZXJyTXNnOiJjbG9zZVByZXZpZXdJbWFnZVBsdXM6b2sifX1jYXRjaChlKXtyZXR1cm57ZXJyTXNnOiJjbG9zZVByZXZpZXdJbWFnZVBsdXM6ZmFpbCJ9fX0sb3BlcmF0ZVJlY29yZGVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5vcGVyYXRpb25UeXBlLHI9e307Zm9yKHZhciBpIGluIGUpLTE9PT1bIm9wZXJhdGlvblR5cGUiXS5pbmRleE9mKGkpJiYocltpXT1lW2ldKTt2YXIgbz1yO3JldHVybiBmc1tuXShvKSx7ZXJyTXNnOiJvcGVyYXRlUmVjb3JkZXI6b2sifX0sc2F2ZUltYWdlVG9QaG90b3NBbGJ1bTpmdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLmZpbGVQYXRoLHI9T2kodCwic2F2ZUltYWdlVG9QaG90b3NBbGJ1bSIpLGk9RWkodCwic2F2ZUltYWdlVG9QaG90b3NBbGJ1bSIpO0N2LmdhbGxlcnkuc2F2ZShfaShuKSxyLGkpfSxzYXZlVmlkZW9Ub1Bob3Rvc0FsYnVtOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUuZmlsZVBhdGg7Q3YuZ2FsbGVyeS5zYXZlKF9pKG4pLGZ1bmN0aW9uKGUpe29pKHQse2Vyck1zZzoic2F2ZVZpZGVvVG9QaG90b3NBbGJ1bTpvayJ9KX0sZnVuY3Rpb24oZSl7b2kodCx7ZXJyTXNnOiJzYXZlVmlkZW9Ub1Bob3Rvc0FsYnVtOmZhaWwifSl9KX0sb3BlcmF0ZURvd25sb2FkVGFzazpmdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS5kb3dubG9hZFRhc2tJZCxuPWUub3BlcmF0aW9uVHlwZSxyPWhzW3RdO3JldHVybiByJiYiYWJvcnQiPT09bj8oZGVsZXRlIGhzW3RdLHIuYWJvcnQoKSx2cyh7ZG93bmxvYWRUYXNrSWQ6dCxzdGF0ZToiZmFpbCIsZXJyTXNnOiJhYm9ydCJ9KSx7ZXJyTXNnOiJvcGVyYXRlRG93bmxvYWRUYXNrOm9rIn0pOntlcnJNc2c6Im9wZXJhdGVEb3dubG9hZFRhc2s6ZmFpbCJ9fSxjcmVhdGVEb3dubG9hZFRhc2s6ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUudXJsLHI9ZS5oZWFkZXIsaT1lLnRpbWVvdXQ7aT0oaXx8JHYubmV0d29ya1RpbWVvdXQmJiR2Lm5ldHdvcmtUaW1lb3V0LnJlcXVlc3R8fDZlNCkvMWUzO3ZhciBvPUN2LmRvd25sb2FkZXIuY3JlYXRlRG93bmxvYWQodCx7dGltZW91dDppLGZpbGVuYW1lOmxvKyIvZG93bmxvYWQvIixyZXRyeTowLHJldHJ5SW50ZXJ2YWw6MH0sZnVuY3Rpb24oZSx0KXt2cyh0P3tkb3dubG9hZFRhc2tJZDpuLHN0YXRlOiJzdWNjZXNzIix0ZW1wRmlsZVBhdGg6ZS5maWxlbmFtZSxzdGF0dXNDb2RlOnR9Ontkb3dubG9hZFRhc2tJZDpuLHN0YXRlOiJmYWlsIixzdGF0dXNDb2RlOnR9KX0pO2Zvcih2YXIgYSBpbiByKWsocixhKSYmby5zZXRSZXF1ZXN0SGVhZGVyKGEsclthXSk7cmV0dXJuIG8uYWRkRXZlbnRMaXN0ZW5lcigic3RhdGVjaGFuZ2VkIixmdW5jdGlvbihlLHQpe2UuZG93bmxvYWRlZFNpemUmJmUudG90YWxTaXplJiZ2cyh7ZG93bmxvYWRUYXNrSWQ6bixzdGF0ZToicHJvZ3Jlc3NVcGRhdGUiLHByb2dyZXNzOnBhcnNlSW50KGUuZG93bmxvYWRlZFNpemUvZS50b3RhbFNpemUqMTAwKSx0b3RhbEJ5dGVzV3JpdHRlbjplLmRvd25sb2FkZWRTaXplLHRvdGFsQnl0ZXNFeHBlY3RlZFRvV3JpdGU6ZS50b3RhbFNpemV9KX0pLChoc1tuXT1vKS5zdGFydCgpLHtkb3dubG9hZFRhc2tJZDpuLGVyck1zZzoiY3JlYXRlRG93bmxvYWRUYXNrOm9rIn19KCsrcHMsZSl9LGNyZWF0ZVJlcXVlc3RUYXNrQnlJZDpicyxjcmVhdGVSZXF1ZXN0VGFzazpmdW5jdGlvbihlKXtyZXR1cm4gYnMoKytncyxlKX0sb3BlcmF0ZVJlcXVlc3RUYXNrOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLnJlcXVlc3RUYXNrSWQsbj1lLm9wZXJhdGlvblR5cGUscj1tc1t0XTtyZXR1cm4gciYmImFib3J0Ij09PW4/KHIuYWJvcnQoKSx7ZXJyTXNnOiJvcGVyYXRlUmVxdWVzdFRhc2s6b2sifSk6e2Vyck1zZzoib3BlcmF0ZVJlcXVlc3RUYXNrOmZhaWwifX0sY29uZmlnTVRMUzpmdW5jdGlvbihlLGkpe3ZhciB0PWUuY2VydGlmaWNhdGVzO2FpKCJzdHJlYW0iKS5jb25maWdNVExTKHQsZnVuY3Rpb24oZSl7dmFyIHQ9ZS50eXBlLG49ZS5jb2RlLHI9ZS5tZXNzYWdlO3N3aXRjaCh0KXtjYXNlInN1Y2Nlc3MiOm9pKGkse2Vyck1zZzoiY29uZmlnTVRMUzpvayIsY29kZTpufSk7YnJlYWs7Y2FzZSJmYWlsIjpvaShpLHtlcnJNc2c6ImNvbmZpZ01UTFM6ZmFpbCAiK3IsY29kZTpufSl9fSl9LGNyZWF0ZVNvY2tldFRhc2s6ZnVuY3Rpb24oZSl7cmV0dXJuIHhzKFN0cmluZyhEYXRlLm5vdygpKSxlKX0sb3BlcmF0ZVNvY2tldFRhc2s6ZnVuY3Rpb24oZSl7dmFyIHQ9ZSxuPXQub3BlcmF0aW9uVHlwZSxyPXQuY29kZSxpPXQucmVhc29uLG89dC5kYXRhLGE9dC5zb2NrZXRUYXNrSWQscz1rc1thXTtpZighcylyZXR1cm57ZXJyTXNnOiJvcGVyYXRlU29ja2V0VGFzazpmYWlsIn07c3dpdGNoKG4pe2Nhc2Uic2VuZCI6cmV0dXJuIG8mJnMuc2VuZCh7aWQ6YSxkYXRhOiJvYmplY3QiPT10eXBlb2Ygbz97IkB0eXBlIjoiYmluYXJ5IixiYXNlNjQ6cGkobyl9Om99KSx7ZXJyTXNnOiJvcGVyYXRlU29ja2V0VGFzazpvayJ9O2Nhc2UiY2xvc2UiOnJldHVybiBzLmNsb3NlKHtpZDphLGNvZGU6cixyZWFzb246aX0pLGRlbGV0ZSBrc1thXSx7ZXJyTXNnOiJvcGVyYXRlU29ja2V0VGFzazpvayJ9fXJldHVybntlcnJNc2c6Im9wZXJhdGVTb2NrZXRUYXNrOmZhaWwifX0sb3BlcmF0ZVVwbG9hZFRhc2s6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUudXBsb2FkVGFza0lkLG49ZS5vcGVyYXRpb25UeXBlLHI9VHNbdF07cmV0dXJuIHImJiJhYm9ydCI9PT1uPyhkZWxldGUgVHNbdF0sci5hYm9ydCgpLE9zKHt1cGxvYWRUYXNrSWQ6dCxzdGF0ZToiZmFpbCIsZXJyTXNnOiJhYm9ydCJ9KSx7ZXJyTXNnOiJvcGVyYXRlVXBsb2FkVGFzazpvayJ9KTp7ZXJyTXNnOiJvcGVyYXRlVXBsb2FkVGFzazpmYWlsIn19LGNyZWF0ZVVwbG9hZFRhc2s6ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUudXJsLHI9ZS5maWxlUGF0aCxpPWUubmFtZSxvPWUuZmlsZXMsYT1lLmhlYWRlcixzPWUuZm9ybURhdGEsYz1lLnRpbWVvdXQ7dm9pZCAwPT09YyYmKGM9JHYubmV0d29ya1RpbWVvdXQudXBsb2FkRmlsZT8kdi5uZXR3b3JrVGltZW91dC51cGxvYWRGaWxlLzFlMzoxMjApO3ZhciB1PUN2LnVwbG9hZGVyLmNyZWF0ZVVwbG9hZCh0LHt0aW1lb3V0OmMscmV0cnk6MCxyZXRyeUludGVydmFsOjB9LGZ1bmN0aW9uKGUsdCl7T3ModD97dXBsb2FkVGFza0lkOm4sc3RhdGU6InN1Y2Nlc3MiLGRhdGE6ZS5yZXNwb25zZVRleHQsc3RhdHVzQ29kZTp0fTp7dXBsb2FkVGFza0lkOm4sc3RhdGU6ImZhaWwiLGRhdGE6IiIsc3RhdHVzQ29kZTp0fSksZGVsZXRlIFRzW25dfSk7Zm9yKHZhciBsIGluIGEpayhhLGwpJiZ1LnNldFJlcXVlc3RIZWFkZXIobCxTdHJpbmcoYVtsXSkpO2Zvcih2YXIgZCBpbiBzKWsocyxkKSYmdS5hZGREYXRhKGQsU3RyaW5nKHNbZF0pKTtyZXR1cm4gbyYmby5sZW5ndGg/by5mb3JFYWNoKGZ1bmN0aW9uKGUpe3UuYWRkRmlsZShfaShlLnVyaXx8ZS5maWxlUGF0aCkse2tleTplLm5hbWV8fCJmaWxlIn0pfSk6dS5hZGRGaWxlKF9pKHIpLHtrZXk6aX0pLHUuYWRkRXZlbnRMaXN0ZW5lcigic3RhdGVjaGFuZ2VkIixmdW5jdGlvbihlLHQpe2UudXBsb2FkZWRTaXplJiZlLnRvdGFsU2l6ZSYmT3Moe3VwbG9hZFRhc2tJZDpuLHN0YXRlOiJwcm9ncmVzc1VwZGF0ZSIscHJvZ3Jlc3M6cGFyc2VJbnQoZS51cGxvYWRlZFNpemUvZS50b3RhbFNpemUqMTAwKSx0b3RhbEJ5dGVzU2VudDplLnVwbG9hZGVkU2l6ZSx0b3RhbEJ5dGVzRXhwZWN0ZWRUb1NlbmQ6ZS50b3RhbFNpemV9KX0pLChUc1tuXT11KS5zdGFydCgpLHt1cGxvYWRUYXNrSWQ6bixlcnJNc2c6ImNyZWF0ZVVwbG9hZFRhc2s6b2sifX0oKytDcyxlKX0sZ2V0UHJvdmlkZXI6ZnVuY3Rpb24oZSxyKXt2YXIgaT1lLnNlcnZpY2U7QXNbaV0/QXNbaV0oZnVuY3Rpb24oZSx0LG4pe29pKHIsZT97ZXJyTXNnOiJnZXRQcm92aWRlcjpmYWlsICIrZS5tZXNzYWdlfTp7ZXJyTXNnOiJnZXRQcm92aWRlcjpvayIsc2VydmljZTppLHByb3ZpZGVyOnQscHJvdmlkZXJzOm4ubWFwKGZ1bmN0aW9uKGUpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGUuc2VydmljZVJlYWR5JiYoZS5pc0FwcEV4aXN0PWUuc2VydmljZVJlYWR5KSwiYm9vbGVhbiI9PXR5cGVvZiBlLm5hdGl2ZUNsaWVudCYmKGUuaXNBcHBFeGlzdD1lLm5hdGl2ZUNsaWVudCksZX0pfSl9KTpvaShyLHtlcnJNc2c6ImdldFByb3ZpZGVyOmZhaWwgc2VydmljZSBub3QgZm91bmQifSl9LGxvZ2luOiRzLGdldFVzZXJJbmZvOlBzLGdldFVzZXJQcm9maWxlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFBzKGUsdCl9LG9wZXJhdGVXWERhdGE6ZnVuY3Rpb24oZSx0KXtzd2l0Y2goZS5kYXRhLmFwaV9uYW1lKXtjYXNlIndlYmFwaV9nZXR1c2VyaW5mbyI6UHMoZSx0KTticmVhaztkZWZhdWx0OnJldHVybntlcnJNc2c6Im9wZXJhdGVXWERhdGE6ZmFpbCJ9fX0scHJlTG9naW46TXMsY2xvc2VBdXRoVmlldzpqcyxnZXRDaGVja0JveFN0YXRlOkxzLGdldFVuaXZlcmlmeU1hbmFnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gRXN8fChFcz1uZXcgQnMpfSxyZXF1ZXN0UGF5bWVudDpmdW5jdGlvbihuLHIpe3ZhciBpPW4ucHJvdmlkZXIsbz1FaShyLCJyZXF1ZXN0UGF5bWVudCIpO0N2LnBheW1lbnQuZ2V0Q2hhbm5lbHMoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlkPT09aX0pO3Q/Q3YucGF5bWVudC5yZXF1ZXN0KHQsbi5vcmRlckluZm8sZnVuY3Rpb24oZSl7ZS5lcnJNc2c9InJlcXVlc3RQYXltZW50Om9rIixvaShyLGUpfSxvKTpvaShyLHtlcnJNc2c6InJlcXVlc3RQYXltZW50OmZhaWwgc2VydmljZSBub3QgZm91bmQifSl9LG8pfSxzdWJzY3JpYmVQdXNoOmZ1bmN0aW9uKGUsdCl7dmFyIG49Q3YucHVzaC5nZXRDbGllbnRJbmZvKCk7cmV0dXJuIG4/KEZzfHwoRnM9ITAsQ3YucHVzaC5hZGRFdmVudExpc3RlbmVyKCJyZWNlaXZlIixmdW5jdGlvbihlKXtOcyYmIXpzJiZzaSgib25QdXNoTWVzc2FnZSIse21lc3NhZ2VJZDplLl9fVVVJRF9fLGRhdGE6ZS5wYXlsb2FkLGVyck1zZzoib25QdXNoOm9rIn0pfSkpLHpzPSExLG4uZXJyTXNnPSJzdWJzY3JpYmVQdXNoOm9rIixuKTp7ZXJyTXNnOiJzdWJzY3JpYmVQdXNoOmZhaWwg6K+356Gu5L+d5b2T5YmN6L+Q6KGM546v5aKD5bey5YyF5ZCrIHB1c2gg5qih5Z2XIn19LHVuc3Vic2NyaWJlUHVzaDpmdW5jdGlvbihlKXtyZXR1cm4genM9ITAse2Vyck1zZzoidW5zdWJzY3JpYmVQdXNoOm9rIn19LG9uUHVzaDpmdW5jdGlvbigpe3JldHVybiBGcz9Ddi5wdXNoLmdldENsaWVudEluZm8oKT8oTnM9ITAse2Vyck1zZzoib25QdXNoOm9rIn0pOntlcnJNc2c6Im9uUHVzaDpmYWlsIOivt+ehruS/neW9k+WJjei/kOihjOeOr+Wig+W3suWMheWQqyBwdXNoIOaooeWdlyJ9OntlcnJNc2c6Im9uUHVzaDpmYWlsIOivt+WFiOiwg+eUqCB1bmkuc3Vic2NyaWJlUHVzaCJ9fSxvZmZQdXNoOmZ1bmN0aW9uKGUpe3JldHVybiBOcz0hMSx7ZXJyTXNnOiJvZmZQdXNoOm9rIn19LGNyZWF0ZVB1c2hNZXNzYWdlOmZ1bmN0aW9uKGUsdCl7dmFyIG49cWEoKTtpZigiYXV0aG9yaXplZCIhPT1uLm5vdGlmaWNhdGlvbkF1dGhvcml6ZWQpcmV0dXJuIG9pKHQse2Vyck1zZzoiY3JlYXRlUHVzaE1lc3NhZ2U6ZmFpbCBub3RpZmljYXRpb25BdXRob3JpemVkOiAiK24ubm90aWZpY2F0aW9uQXV0aG9yaXplZH0pO3ZhciByPU9iamVjdC5hc3NpZ24oe30sZSk7ZGVsZXRlIHIuY29udGVudCxkZWxldGUgci5wYXlsb2FkLEN2LnB1c2guY3JlYXRlTWVzc2FnZShlLmNvbnRlbnQsZS5wYXlsb2FkLHIpLG9pKHQse2Vyck1zZzoiY3JlYXRlUHVzaE1lc3NhZ2U6b2sifSl9LHJlcXVpcmVOYXRpdmVQbHVnaW46VnMsc2hhcmVBcHBNZXNzYWdlRGlyZWN0bHk6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnRpdGxlLHI9ZS5wYXRoLGk9ZS5pbWFnZVVybCxvPWUudXNlRGVmYXVsdFNuYXBzaG90O249bnx8JHYuYXBwbmFtZTt2YXIgYT1mdW5jdGlvbigpe0hzKHtwcm92aWRlcjoid2VpeGluIix0eXBlOjAsdGl0bGU6bixpbWFnZVVybDppLGhyZWY6cixzY2VuZToiV1hTY2VuZVNlc3Npb24ifSx0LCJzaGFyZUFwcE1lc3NhZ2VEaXJlY3RseSIpfSxzPUVpKHQsInNoYXJlQXBwTWVzc2FnZURpcmVjdGx5Iik7aWYobyl7dmFyIGM9THYoKSx1PUN2LndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoY1tjLmxlbmd0aC0xXS5fX3d4V2Vidmlld0lkX18rIiIpO2lmKHUpe3ZhciBsPW5ldyBDdi5uYXRpdmVPYmouQml0bWFwO3UuZHJhdyhsLGZ1bmN0aW9uKCl7dmFyIGU9bG8rIi9zaGFyZS9zbmFwc2hvdC5qcGciO2wuc2F2ZShlLHtvdmVyd3JpdGU6ITAsZm9ybWF0OiJqcGcifSxmdW5jdGlvbigpe2k9ZSxhKCl9LHMpfSxzKX1lbHNlIGEoKX1lbHNlIGEoKX0sc2hhcmU6SHMsc2hhcmVXaXRoU3lzdGVtOmZ1bmN0aW9uKGUsdCxuKXt2b2lkIDA9PT1uJiYobj0ic2hhcmVXaXRoU3lzdGVtIik7dmFyIHI9ZS50eXBlLGk9ZS5pbWFnZVVybCxvPWUuc3VtbWFyeSxhPWUuaHJlZjtyPXJ8fCJ0ZXh0Ijt2YXIgcz1FaSh0LG4pO1sidGV4dCIsImltYWdlIl0uaW5kZXhPZihyKTwwJiZvaSh0LHtlcnJNc2c6bisiOmZhaWwg5YiG5Lqr5Y+C5pWwIHR5cGUg5LiN5q2j56GuIn0pLCJzdHJpbmciPT10eXBlb2YgaSYmaSYmKGk9X2koaSkpLEN2LnNoYXJlLnNlbmRXaXRoU3lzdGVtKHt0eXBlOnIscGljdHVyZXM6aSYmW2ldLGNvbnRlbnQ6byxocmVmOmF9LGZ1bmN0aW9uKGUpe29pKHQse2Vyck1zZzpuKyI6b2sifSl9LHMpfSxyZXN0b3JlR2xvYmFsOmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt2YXIgYTtDdiE9PXQmJih4dj1lLGE9KEN2PXQpLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSxjaT1hLEN2Lm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZT11aSxPdj1uLEV2PXIsQXY9aSxJdj1vKSwkdi5zZXJ2aWNlUmVhZHk9ITB9LHJlcXVpcmVHbG9iYWw6ZnVuY3Rpb24oKXtmb3IodmFyIGU9WyJBcnJheUJ1ZmZlciIsIkludDhBcnJheSIsIlVpbnQ4QXJyYXkiLCJVaW50OENsYW1wZWRBcnJheSIsIkludDE2QXJyYXkiLCJVaW50MTZBcnJheSIsIkludDMyQXJyYXkiLCJVaW50MzJBcnJheSIsIkZsb2F0MzJBcnJheSIsIkZsb2F0NjRBcnJheSIsIkJpZ0ludDY0QXJyYXkiLCJCaWdVaW50NjRBcnJheSJdLHQ9e30sbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3Rbcl09Z2xvYmFsW3JdfXJldHVybiB0fSxnZXRTdWJOVnVlQnlJZDpYcyxnZXRDdXJyZW50U3ViTlZ1ZTpmdW5jdGlvbigpe3JldHVybiBYcyhDdi53ZWJ2aWV3LmN1cnJlbnRXZWJ2aWV3KCkuaWQpfSxvbkhvc3RFdmVudFJlY2VpdmU6ZnVuY3Rpb24oZSl7WXMucHVzaChlKX0sb25OYXRpdmVFdmVudFJlY2VpdmU6ZnVuY3Rpb24oZSl7WXMucHVzaChlKX0sc2VuZE5hdGl2ZUV2ZW50OkpzLGxvYWRTdWJQYWNrYWdlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPWUucm9vdDtpZigtMSE9PUtzLmluZGV4T2YoaSkpcmV0dXJue2Vyck1zZzoibG9hZFN1YlBhY2thZ2U6b2sifTtLcy5wdXNoKGkpLG49aSsiL2FwcC1zdWItc2VydmljZS5qcyIscj1mdW5jdGlvbihlKXtvaSh0LHtlcnJNc2c6ImxvYWRTdWJQYWNrYWdlOm9rIn0pfSwkdi5vblNlcnZpY2VSZWFkeShmdW5jdGlvbigpe3h2LnJlcXVpcmVNb2R1bGUoInBsdXMiKS5ldmFsSlNGaWxlcyhbbl0scil9KX0sc2VuZEhvc3RFdmVudDp0YyxuYXZpZ2F0ZVRvTWluaVByb2dyYW06ZnVuY3Rpb24oZSx0KXt0YygibmF2aWdhdGVUb1VuaU1QIixlLGZ1bmN0aW9uKGUpe2lmKGUuZXJyTXNnJiYtMT09PWUuZXJyTXNnLmluZGV4T2YoIjpvayIpKXJldHVybiBvaSh0LHtlcnJNc2c6ZS5lcnJNc2d9KTtvaSh0LHtlcnJNc2c6Im5hdmlnYXRlVG9NaW5pUHJvZ3JhbTpvayJ9KX0pfSxnZXRMYXVuY2hPcHRpb25zU3luYzpmdW5jdGlvbigpe3JldHVybiBpY30sZ2V0RW50ZXJPcHRpb25zU3luYzpmdW5jdGlvbigpe3JldHVybiBvYygpfSxuYXZpZ2F0ZUJhY2s6V2MsbmF2aWdhdGVUbzpmdW5jdGlvbihlLHQpe3ZhciBuPWUudXJsLHI9ZS5ldmVudHMsaT1lLm9wZW5UeXBlLG89ZS5hbmltYXRpb25UeXBlLGE9ZS5hbmltYXRpb25EdXJhdGlvbixzPW4uc3BsaXQoIj8iKSxjPXNbMF0sdT1Qdi5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT1jfSkud2luZG93LGw9JHYud2luZG93fHx7fTtvfHwobz11LmFuaW1hdGlvblR5cGV8fGwuYW5pbWF0aW9uVHlwZXx8WG8pLGF8fChhPXUuYW5pbWF0aW9uRHVyYXRpb258fGwuYW5pbWF0aW9uRHVyYXRpb258fFlvKTt2YXIgZD13KHNbMV18fCIiKTtEYyhjLGZ1bmN0aW9uKCl7bnUoe3VybDpuLHBhdGg6YyxxdWVyeTpkLGV2ZW50czpyLGFuaW1hdGlvblR5cGU6byxhbmltYXRpb25EdXJhdGlvbjphfSx0KX0sImFwcExhdW5jaCI9PT1pKX0scmVMYXVuY2g6ZnVuY3Rpb24oZSxhKXt2YXIgcz1lLnVybCx0PXMuc3BsaXQoIj8iKSxjPXRbMF0sdT13KHRbMV18fCIiKTtEYyhjLGZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaSxvO3Q9YSxuPShlPXt1cmw6cyxwYXRoOmMscXVlcnk6dX0pLnVybCxyPWUucGF0aCxpPWUucXVlcnksbz1MdighMCkuc2xpY2UoMCksUHYuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXRoPT09cn0pLm1ldGEuaXNUYWJCYXImJkxhLnN3aXRjaFRhYihyLnNsaWNlKDEpKSxWYyh0dSh7dXJsOm4scGF0aDpyLHF1ZXJ5Omksb3BlblR5cGU6InJlTGF1bmNoIn0pLCJub25lIiwwLGZ1bmN0aW9uKCl7by5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuJHJlbW92ZSgpLHpjKGUuJGdldEFwcFdlYnZpZXcoKSwibm9uZSIpfSksb2kodCx7ZXJyTXNnOiJyZUxhdW5jaDpvayJ9KX0pLGxpKCl9KX0scmVkaXJlY3RUbzpmdW5jdGlvbihlLHQpe3ZhciBuPWUudXJsLHI9ZS5leGlzdHMsaT1uLnNwbGl0KCI/Iiksbz1pWzBdLGE9dyhpWzFdfHwiIik7RGMobyxmdW5jdGlvbigpe2l1KHt1cmw6bixwYXRoOm8scXVlcnk6YSxleGlzdHM6cn0sdCl9KX0sc3dpdGNoVGFiOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS51cmwscj1lLmZyb20saT1lLm9wZW5UeXBlLG89bi5zcGxpdCgiPyIpLGE9b1swXSxzPXcob1sxXXx8IiIpO0RjKGEsZnVuY3Rpb24oKXshZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnVybCxyPWUucGF0aCxpPWUucXVlcnk7ZS5mcm9tLExhLnN3aXRjaFRhYihyLnNsaWNlKDEpKTt2YXIgbyxhLHM9THYoKSxjPXMubGVuZ3RoLHU9ITEsbD0hMTtpZigxPD1jJiYoKG89c1tjLTFdKS4kcGFnZS5tZXRhLmlzVGFiQmFyP3U9ITA6KGw9ITAscy5yZXZlcnNlKCkuZm9yRWFjaChmdW5jdGlvbihlKXtlLiRwYWdlLm1ldGEuaXNUYWJCYXJ8fGU9PT1vfHwoZS4kcmVtb3ZlKCksemMoZS4kZ2V0QXBwV2VidmlldygpLCJub25lIikpfSksby4kcmVtb3ZlKCksT3YoZnVuY3Rpb24oKXsicmVkaXJlY3QiPT09by4kcGFnZS5vcGVuVHlwZT96YyhvLiRnZXRBcHBXZWJ2aWV3KCksSm8sWW8pOnpjKG8uJGdldEFwcFdlYnZpZXcoKSwiYXV0byIpfSwxMDApKSksTHYoITApLmZvckVhY2goZnVuY3Rpb24oZSl7Ii8iK2Uucm91dGU9PT1yPyhlLiRwYWdlLm1ldGEudmlzaWJsZXx8KGw9ITApLGUuJHBhZ2UubWV0YS52aXNpYmxlPSEwLGE9ZSk6ZS4kcGFnZS5tZXRhLmlzVGFiQmFyJiYoZS4kcGFnZS5tZXRhLnZpc2libGU9ITEpfSksbz09PWEmJih1PSExKSxvJiZ1JiZvLiR2bS5fX2NhbGxfaG9vaygib25IaWRlIiksIWEpcmV0dXJuIFZjKHR1KHt1cmw6bixwYXRoOnIscXVlcnk6aSxvcGVuVHlwZToic3dpdGNoVGFiIn0pLCJub25lIiwwLGZ1bmN0aW9uKCl7bGkoKSxvaSh0LHtlcnJNc2c6InN3aXRjaFRhYjpvayJ9KX0sNzApO3ZhciBkPWEuJGdldEFwcFdlYnZpZXcoKTtkLnNob3coIm5vbmUiKSxsJiYhZC5fX3ByZWxvYWRfXyYmYS4kdm0uX19jYWxsX2hvb2soIm9uU2hvdyIpLGxpKCksb2kodCx7ZXJyTXNnOiJzd2l0Y2hUYWI6b2sifSl9KHt1cmw6bixwYXRoOmEscXVlcnk6cyxmcm9tOnJ9LHQpfSwiYXBwTGF1bmNoIj09PWkpfSx1blByZWxvYWRQYWdlOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj1lLnVybCxpPSgobj1ldVt0PXJdKSYmKG4uX19wYWdlX18mJlFjKCEwKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09bi5fX3BhZ2VfX30pP24uX19wcmVsb2FkX189ITE6bi5jbG9zZSgibm9uZSIpLGRlbGV0ZSBldVt0XSksbik7cmV0dXJuIGk/e2lkOmkuaWQsdXJsOnIsZXJyTXNnOiJ1blByZWxvYWRQYWdlOm9rIn06e3VybDpyLGVyck1zZzoidW5QcmVsb2FkUGFnZTpmYWlsIG5vdCBmb3VuZCJ9fSxwcmVsb2FkUGFnZTpmdW5jdGlvbihlLHQpe3ZhciBuPWUudXJsLHI9bi5zcGxpdCgiPyIpO29pKHQse2lkOmZ1bmN0aW9uKGUpe3ZhciB0PWUudXJsLG49ZS5wYXRoLHI9ZS5xdWVyeTtpZighZXVbdF0pe3ZhciBpPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoUHYuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXRoPT09bn0pKSk7ZXVbdF09UGMobixpLHIse19fcHJlbG9hZF9fOiEwLF9fcXVlcnlfXzpKU09OLnN0cmluZ2lmeShyKX0pfXJldHVybiBldVt0XX0oe3VybDpuLHBhdGg6clswXSxxdWVyeTp3KHJbMV18fCIiKX0pLmlkLHVybDpuLGVyck1zZzoicHJlbG9hZFBhZ2U6b2sifSl9LHNldFN0b3JhZ2U6ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS5rZXkscj1lLmRhdGEsaT0oZS5pc1N5bmMsdHlwZW9mIHIpLG89InN0cmluZyI9PT1pP3I6SlNPTi5zdHJpbmdpZnkoe3R5cGU6aSxkYXRhOnJ9KTt0cnl7InN0cmluZyI9PT1pJiZ2b2lkIDAhPT1kdShvKT9Ddi5zdG9yYWdlLnNldEl0ZW1Bc3luYyhuK3V1LGkpOkN2LnN0b3JhZ2UucmVtb3ZlSXRlbUFzeW5jKG4rdXUpLEN2LnN0b3JhZ2Uuc2V0SXRlbUFzeW5jKG4sbyxmdW5jdGlvbigpe29pKHQse2Vyck1zZzoic2V0U3RvcmFnZTpvayJ9KX0sZnVuY3Rpb24oZSl7b2kodCx7ZXJyTXNnOiJzZXRTdG9yYWdlOmZhaWwgIitlLm1lc3NhZ2V9KX0pfWNhdGNoKGUpe29pKHQse2Vyck1zZzoic2V0U3RvcmFnZTpmYWlsICIrZX0pfX0sc2V0U3RvcmFnZVN5bmM6ZnVuY3Rpb24oZSx0KXt2YXIgbj10eXBlb2YgdCxyPSJzdHJpbmciPT09bj90OkpTT04uc3RyaW5naWZ5KHt0eXBlOm4sZGF0YTp0fSk7dHJ5eyJzdHJpbmciPT09biYmdm9pZCAwIT09ZHUocik/Q3Yuc3RvcmFnZS5zZXRJdGVtKGUrdXUsbik6Q3Yuc3RvcmFnZS5yZW1vdmVJdGVtKGUrdXUpLEN2LnN0b3JhZ2Uuc2V0SXRlbShlLHIpfWNhdGNoKGUpe319LGdldFN0b3JhZ2U6ZnVuY3Rpb24oZSxyKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS5rZXk7Q3Yuc3RvcmFnZS5nZXRJdGVtQXN5bmModCxmdW5jdGlvbihuKXtDdi5zdG9yYWdlLmdldEl0ZW1Bc3luYyh0K3V1LGZ1bmN0aW9uKGUpe3ZhciB0PShlLmRhdGF8fCIiKS50b0xvd2VyQ2FzZSgpO29pKHIse2RhdGE6ZnUodCxuLmRhdGEpLGVyck1zZzoiZ2V0U3RvcmFnZTpvayJ9KX0sZnVuY3Rpb24oKXtvaShyLHtkYXRhOmZ1KCIiLG4uZGF0YSksZXJyTXNnOiJnZXRTdG9yYWdlOm9rIn0pfSl9LGZ1bmN0aW9uKGUpe29pKHIse2RhdGE6IiIsZXJyTXNnOiJnZXRTdG9yYWdlOmZhaWwgIitlLm1lc3NhZ2V9KX0pfSxnZXRTdG9yYWdlU3luYzpmdW5jdGlvbihlKXt2YXIgdD1Ddi5zdG9yYWdlLmdldEl0ZW0oZSksbj0oQ3Yuc3RvcmFnZS5nZXRJdGVtKGUrdXUpfHwiIikudG9Mb3dlckNhc2UoKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQ/IiI6ZnUobix0KX0scmVtb3ZlU3RvcmFnZTpmdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLmtleTtDdi5zdG9yYWdlLnJlbW92ZUl0ZW1Bc3luYyhuK3V1KSxDdi5zdG9yYWdlLnJlbW92ZUl0ZW1Bc3luYyhuLGZ1bmN0aW9uKGUpe29pKHQse2Vyck1zZzoicmVtb3ZlU3RvcmFnZTpvayJ9KX0sZnVuY3Rpb24oZSl7b2kodCx7ZXJyTXNnOiJyZW1vdmVTdG9yYWdlOmZhaWwgIitlLm1lc3NhZ2V9KX0pfSxyZW1vdmVTdG9yYWdlU3luYzpmdW5jdGlvbihlKXtDdi5zdG9yYWdlLnJlbW92ZUl0ZW0oZSt1dSksQ3Yuc3RvcmFnZS5yZW1vdmVJdGVtKGUpfSxjbGVhclN0b3JhZ2U6ZnVuY3Rpb24oZSx0KXtDdi5zdG9yYWdlLmNsZWFyQXN5bmMoZnVuY3Rpb24oZSl7b2kodCx7ZXJyTXNnOiJjbGVhclN0b3JhZ2U6b2sifSl9LGZ1bmN0aW9uKGUpe29pKHQse2Vyck1zZzoiY2xlYXJTdG9yYWdlOmZhaWwgIitlLm1lc3NhZ2V9KX0pfSxjbGVhclN0b3JhZ2VTeW5jOmZ1bmN0aW9uKCl7Q3Yuc3RvcmFnZS5jbGVhcigpfSxnZXRTdG9yYWdlSW5mbzpwdSxnZXRTdG9yYWdlSW5mb1N5bmM6ZnVuY3Rpb24oKXt2YXIgZT1wdSgpO3JldHVybiBkZWxldGUgZS5lcnJNc2csZX0sc2hvd0tleWJvYXJkOmZ1bmN0aW9uKCl7cmV0dXJuIEN2LmtleS5zaG93U29mdEtleWJvcmQoKSx7ZXJyTXNnOiJzaG93S2V5Ym9hcmQ6b2sifX0saGlkZUtleWJvYXJkOmZ1bmN0aW9uKCl7cmV0dXJuIEN2LmtleS5oaWRlU29mdEtleWJvcmQoKSx7ZXJyTXNnOiJoaWRlS2V5Ym9hcmQ6b2sifX0sc2V0TmF2aWdhdGlvbkJhclRpdGxlOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLl9fcGFnZV9fLG49ZS50aXRsZTt2b2lkIDA9PT1uJiYobj0iIik7dmFyIHI9dmkodCk7aWYocil7dmFyIGk9ci5nZXRTdHlsZSgpO3JldHVybiBpJiZpLnRpdGxlTlZpZXcmJnIuc2V0U3R5bGUoe3RpdGxlTlZpZXc6e3RpdGxlVGV4dDpufX0pLHtlcnJNc2c6InNldE5hdmlnYXRpb25CYXJUaXRsZTpvayJ9fXJldHVybntlcnJNc2c6InNldE5hdmlnYXRpb25CYXJUaXRsZTpmYWlsIn19LHNob3dOYXZpZ2F0aW9uQmFyTG9hZGluZzpmdW5jdGlvbigpe3JldHVybiBDdi5uYXRpdmVVSS5zaG93V2FpdGluZygiIix7bW9kYWw6ITF9KSx7ZXJyTXNnOiJzaG93TmF2aWdhdGlvbkJhckxvYWRpbmc6b2sifX0saGlkZU5hdmlnYXRpb25CYXJMb2FkaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIEN2Lm5hdGl2ZVVJLmNsb3NlV2FpdGluZygpLHtlcnJNc2c6ImhpZGVOYXZpZ2F0aW9uQmFyTG9hZGluZzpvayJ9fSxzZXROYXZpZ2F0aW9uQmFyQ29sb3I6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0LG4scj1lLl9fcGFnZV9fLGk9ZS5mcm9udENvbG9yLG89ZS5iYWNrZ3JvdW5kQ29sb3IsYT12aShyKTtpZihhKXt2YXIgcz17fTtpJiYocy50aXRsZUNvbG9yPWkpLG8mJihzLmJhY2tncm91bmRDb2xvcj1vKTt2YXIgYz0iIzAwMDAwMCI9PT1pPyJkYXJrIjoibGlnaHQiO0N2Lm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZShjKSx0PWMsKG49THYoKSkubGVuZ3RoJiYobltuLmxlbmd0aC0xXS4kcGFnZS5tZXRhLnN0YXR1c0JhclN0eWxlPXQpO3ZhciB1PWEuZ2V0U3R5bGUoKTtyZXR1cm4gdSYmdS50aXRsZU5WaWV3JiYodS50aXRsZU5WaWV3LmF1dG9CYWNrQnV0dG9uJiYocy5iYWNrQnV0dG9uPXMuYmFja0J1dHRvbnx8e30scy5iYWNrQnV0dG9uLmNvbG9yPWkpLGEuc2V0U3R5bGUoe3RpdGxlTlZpZXc6c30pKSx7ZXJyTXNnOiJzZXROYXZpZ2F0aW9uQmFyQ29sb3I6b2sifX1yZXR1cm57ZXJyTXNnOiJzZXROYXZpZ2F0aW9uQmFyQ29sb3I6ZmFpbCJ9fSxzaG93TG9hZGluZzpmdW5jdGlvbihlKXtyZXR1cm4gaGkoaHUsT2JqZWN0LmFzc2lnbih7fSxlLHt0eXBlOiJsb2FkaW5nIn0pLCJzaG93VG9hc3QiLCJzaG93TG9hZGluZyIpfSxoaWRlTG9hZGluZzpmdW5jdGlvbigpe3JldHVybiBoaSh2dSwibG9hZGluZyIsImhpZGUiLCJoaWRlTG9hZGluZyIpfSxzaG93VG9hc3Q6aHUsaGlkZVRvYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIGhpKHZ1LCJ0b2FzdCIsImhpZGUiLCJoaWRlVG9hc3QiKX0saGlkZTp2dSxzaG93TW9kYWw6ZnVuY3Rpb24oZSxpKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS50aXRsZTt2b2lkIDA9PT10JiYodD0iIik7dmFyIG49ZS5jb250ZW50O3ZvaWQgMD09PW4mJihuPSIiKTt2YXIgbz1lLnNob3dDYW5jZWw7dm9pZCAwPT09byYmKG89ITApO3ZhciByPWUuY2FuY2VsVGV4dCxhPShlLmNhbmNlbENvbG9yLGUuY29uZmlybVRleHQpLHM9KGUuY29uZmlybUNvbG9yLGUuZWRpdGFibGUpO3ZvaWQgMD09PXMmJihzPSExKTt2YXIgYz1lLnBsYWNlaG9sZGVyVGV4dDt2b2lkIDA9PT1jJiYoYz0iIik7dmFyIHU9bz9bcixhXTpbYV0sbD1zP2M6dTtuPW58fCIgIixDdi5uYXRpdmVVSVtzPyJwcm9tcHQiOiJjb25maXJtIl0obixmdW5jdGlvbihlKXtpZihvKXt2YXIgdD0xPT09ZS5pbmRleCxuPXtlcnJNc2c6InNob3dNb2RhbDpvayIsY29uZmlybTp0LGNhbmNlbDowPT09ZS5pbmRleHx8LTE9PT1lLmluZGV4fTt0JiZzJiYobi5jb250ZW50PWUudmFsdWUpLG9pKGksbil9ZWxzZXt2YXIgcj17ZXJyTXNnOiJzaG93TW9kYWw6b2siLGNvbmZpcm06MD09PWUuaW5kZXgsY2FuY2VsOiExfTtzJiYoci5jb250ZW50PWUudmFsdWUpLG9pKGkscil9fSx0LGwsdSl9LHNob3dBY3Rpb25TaGVldDpmdW5jdGlvbihlLHQpe3ZhciBuPWUuaXRlbUxpc3Q7dm9pZCAwPT09biYmKG49W10pO3ZhciByPWUuaXRlbUNvbG9yO3ZvaWQgMD09PXImJihyPSIjMDAwMDAwIik7dmFyIGk9ZS50aXRsZTt2b2lkIDA9PT1pJiYoaT0iIik7dmFyIG89ZS5wb3BvdmVyLGE9e2J1dHRvbnM6bi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJue3RpdGxlOmUsY29sb3I6cn19KX07aSYmKGEudGl0bGU9aSksYS5jYW5jZWw9UWUoInVuaS5zaG93QWN0aW9uU2hlZXQuY2FuY2VsIiksQ3YubmF0aXZlVUkuYWN0aW9uU2hlZXQoT2JqZWN0LmFzc2lnbihhLHtwb3BvdmVyOm99KSxmdW5jdGlvbihlKXswPGUuaW5kZXg/b2kodCx7ZXJyTXNnOiJzaG93QWN0aW9uU2hlZXQ6b2siLHRhcEluZGV4OmUuaW5kZXgtMX0pOm9pKHQse2Vyck1zZzoic2hvd0FjdGlvblNoZWV0OmZhaWwgY2FuY2VsIn0pfSl9LHNldFRhYkJhckJhZGdlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuaW5kZXgsbj1lLnRleHQscj1lLnR5cGU7cmV0dXJuIHZvaWQgMD09PXImJihyPSJ0ZXh0IiksTGEuc2V0VGFiQmFyQmFkZ2Uocix0LG4pLHtlcnJNc2c6InNldFRhYkJhckJhZGdlOm9rIn19LHNldFRhYkJhckl0ZW06ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5pbmRleCxuPWUudGV4dCxyPWUuaWNvblBhdGgsaT1lLnNlbGVjdGVkSWNvblBhdGgsbz1lLnBhZ2VQYXRoLGE9ZS52aXNpYmxlLHM9ZS5pY29uZm9udDtMYS5zZXRUYWJCYXJJdGVtKHQsbixyLGksYSxzKTt2YXIgYz1vJiZQdi5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT1vfSk7aWYoYyl7dmFyIHU9Yy5tZXRhO3UuaXNUYWJCYXI9ITAsdS50YWJCYXJJbmRleD10LHUuaXNRdWl0PSEwO3ZhciBsPSR2LnRhYkJhcjtsJiZsLmxpc3QmJmwubGlzdFt0XSYmKGwubGlzdFt0XS5wYWdlUGF0aD1vLnN0YXJ0c1dpdGgoIi8iKT9vLnN1YnN0cmluZygxKTpvKX1yZXR1cm57ZXJyTXNnOiJzZXRUYWJCYXJJdGVtOm9rIn19LHNldFRhYkJhclN0eWxlOmZ1bmN0aW9uKGUpe2lmKHZvaWQgMD09PWUmJihlPXt9KSwhZGkoKSlyZXR1cm57ZXJyTXNnOiJzZXRUYWJCYXJTdHlsZTpmYWlsIG5vdCBUYWJCYXIgcGFnZSJ9O3ZhciB0PXtibGFjazoicmdiYSgwLDAsMCwwLjQpIix3aGl0ZToicmdiYSgyNTUsMjU1LDI1NSwwLjQpIn0sbj1lLmJvcmRlclN0eWxlO3JldHVybiBuIGluIHQmJihlLmJvcmRlclN0eWxlPXRbbl0pLExhLnNldFRhYkJhclN0eWxlKGUpLHtlcnJNc2c6InNldFRhYkJhclN0eWxlOm9rIn19LGhpZGVUYWJCYXI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hbmltYXRpb247cmV0dXJuIGRpKCk/KExhLmhpZGVUYWJCYXIodCkse2Vyck1zZzoiaGlkZVRhYkJhcjpvayJ9KTp7ZXJyTXNnOiJoaWRlVGFiQmFyOmZhaWwgbm90IFRhYkJhciBwYWdlIn19LHNob3dUYWJCYXI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hbmltYXRpb247cmV0dXJuIGRpKCk/KExhLnNob3dUYWJCYXIodCkse2Vyck1zZzoic2hvd1RhYkJhcjpvayJ9KTp7ZXJyTXNnOiJzaG93VGFiQmFyOmZhaWwgbm90IFRhYkJhciBwYWdlIn19LHJlcXVlc3RDb21wb25lbnRJbmZvOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG87ZS4kcGFnZS5tZXRhLmlzTlZ1ZT9idShlLHQsbik6KHI9ZSxpPXQsbz1uLFR2LnB1Ymxpc2hIYW5kbGVyKCJyZXF1ZXN0Q29tcG9uZW50SW5mbyIse3JlcUlkOnl1LnB1c2gobykscmVxczppfSxyLiRwYWdlLmlkKSl9LGNyZWF0ZVJld2FyZGVkVmlkZW9BZDpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IE91KGUpfSxjcmVhdGVGdWxsU2NyZWVuVmlkZW9BZDpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IEx1KGUpfSxjcmVhdGVJbnRlcnN0aXRpYWxBZDpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IE51KGUpfSxjcmVhdGVJbnRlcmFjdGl2ZUFkOmZ1bmN0aW9uKGUpe3JldHVybiBlLnByb3ZpZGVyP2UuYWRwaWQ/bmV3IFJ1KGUpOm5ldyBFcnJvcigiYWRwaWQgaW52YWxpZCIpOm5ldyBFcnJvcigicHJvdmlkZXIgaW52YWxpZCIpfX0pLHp1PU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSxGdSxpaSk7ZnVuY3Rpb24gVnUoZSl7Zm9yKHZhciB0PVtdLG49YXJndW1lbnRzLmxlbmd0aC0xOzA8bi0tOyl0W25dPWFyZ3VtZW50c1tuKzFdO3JldHVybiB6dVtlXS5hcHBseShudWxsLHQpfWZ1bmN0aW9uIFV1KGUsdCl7cmV0dXJuIFR2Lm9uKCJhcGkuIitlLHQpfWZ1bmN0aW9uIHF1KGUpe3ZhciB0PUx2KCksbj10Lmxlbmd0aDtyZXR1cm4gbnx8VHYuZW1pdCgib25FcnJvciIsZSsiOmZhaWwiKSx0W24tMV0uJHZtfWZ1bmN0aW9uIFd1KCl7dmFyIGU9THYoKSx0PWVbZS5sZW5ndGgtMV07cmV0dXJuIHQmJnQuJHBhZ2UuaWR9dmFyIEh1PVsiY2FucGxheSIsInBsYXkiLCJwYXVzZSIsInN0b3AiLCJlbmRlZCIsInRpbWVVcGRhdGUiLCJwcmV2IiwibmV4dCIsImVycm9yIiwid2FpdGluZyJdLEd1PXt9O0h1LmZvckVhY2goZnVuY3Rpb24oZSl7R3VbZV09W119KTt2YXIgWHUsWXU9W3tuYW1lOiJkdXJhdGlvbiIscmVhZG9ubHk6ITB9LHtuYW1lOiJjdXJyZW50VGltZSIscmVhZG9ubHk6ITB9LHtuYW1lOiJwYXVzZWQiLHJlYWRvbmx5OiEwfSx7bmFtZToic3JjIixjYWNoZTohMH0se25hbWU6InN0YXJ0VGltZSIsZGVmYXVsdDowLGNhY2hlOiEwfSx7bmFtZToiYnVmZmVyZWQiLHJlYWRvbmx5OiEwfSx7bmFtZToidGl0bGUiLGNhY2hlOiEwfSx7bmFtZToiZXBuYW1lIixjYWNoZTohMH0se25hbWU6InNpbmdlciIsY2FjaGU6ITB9LHtuYW1lOiJjb3ZlckltZ1VybCIsY2FjaGU6ITB9LHtuYW1lOiJ3ZWJVcmwiLGNhY2hlOiEwfSx7bmFtZToicHJvdG9jb2wiLHJlYWRvbmx5OiEwLGRlZmF1bHQ6Imh0dHAifSx7bmFtZToicGxheWJhY2tSYXRlIixkZWZhdWx0OjEsY2FjaGU6ITB9XSxKdT1bInByZXYiLCJuZXh0Il0sS3U9ZnVuY3Rpb24oKXt2YXIgcj10aGlzO3RoaXMuX29wdGlvbnM9e30sVXUoIm9uQmFja2dyb3VuZEF1ZGlvU3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUuc3RhdGUsbj1lLmVyck1zZyxyPWUuZXJyQ29kZTtHdVt0XS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlKCJlcnJvciI9PT10P3tlcnJNc2c6bixlcnJDb2RlOnJ9Ont9KX0pfSksSnUuZm9yRWFjaChmdW5jdGlvbihlKXtVdSgib25CYWNrZ3JvdW5kQXVkaW8iKyhlWzBdLnRvVXBwZXJDYXNlKCkrZS5zdWJzdHIoMSkpLGZ1bmN0aW9uKCl7R3VbZV0uZm9yRWFjaChmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmZSh7fSl9KX0pfSksWXUuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgbj10Lm5hbWUsZT17Z2V0OmZ1bmN0aW9uKCl7dmFyIGU9dC5jYWNoZT90aGlzLl9vcHRpb25zOlZ1KCJnZXRCYWNrZ3JvdW5kQXVkaW9TdGF0ZSIpO3JldHVybiBuIGluIGU/ZVtuXTp0LmRlZmF1bHR9fTt0LnJlYWRvbmx5fHwoZS5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5fb3B0aW9uc1tuXT1lLFZ1KCJzZXRCYWNrZ3JvdW5kQXVkaW9TdGF0ZSIsT2JqZWN0LmFzc2lnbih7fSx0aGlzLl9vcHRpb25zLHthdWRpb0lkOnRoaXMuaWR9KSxuKX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLG4sZSl9KX07S3UucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLl9vcGVyYXRlKCJwbGF5Iil9LEt1LnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMuX29wZXJhdGUoInBhdXNlIil9LEt1LnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKCl7dGhpcy5fb3BlcmF0ZSgic3RvcCIpfSxLdS5wcm90b3R5cGUuc2Vlaz1mdW5jdGlvbihlKXt0aGlzLl9vcGVyYXRlKCJzZWVrIix7Y3VycmVudFRpbWU6ZX0pfSxLdS5wcm90b3R5cGUuX29wZXJhdGU9ZnVuY3Rpb24oZSx0KXtWdSgib3BlcmF0ZUJhY2tncm91bmRBdWRpbyIsT2JqZWN0LmFzc2lnbih7fSx0LHtvcGVyYXRpb25UeXBlOmV9KSl9LEh1LmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9dFswXS50b1VwcGVyQ2FzZSgpK3Quc3Vic3RyKDEpO0t1LnByb3RvdHlwZVsib24iK2VdPWZ1bmN0aW9uKGUpe0d1W3RdLnB1c2goZSl9fSk7dmFyIFp1PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldEJhY2tncm91bmRBdWRpb01hbmFnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gWHV8fChYdT1uZXcgS3UpfX0pLFF1PWpyKGZ1bmN0aW9uKGUsdCl7dmFyIG49InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5JiYidW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQxNkFycmF5JiYidW5kZWZpbmVkIiE9dHlwZW9mIEludDMyQXJyYXk7dC5hc3NpZ249ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG4scj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7ci5sZW5ndGg7KXt2YXIgaT1yLnNoaWZ0KCk7aWYoaSl7aWYoIm9iamVjdCIhPXR5cGVvZiBpKXRocm93IG5ldyBUeXBlRXJyb3IoaSsibXVzdCBiZSBub24tb2JqZWN0Iik7Zm9yKHZhciBvIGluIGkpdD1pLG49byxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxuKSYmKGVbb109aVtvXSl9fXJldHVybiBlfSx0LnNocmlua0J1Zj1mdW5jdGlvbihlLHQpe3JldHVybiBlLmxlbmd0aD09PXQ/ZTplLnN1YmFycmF5P2Uuc3ViYXJyYXkoMCx0KTooZS5sZW5ndGg9dCxlKX07dmFyIHI9e2FycmF5U2V0OmZ1bmN0aW9uKGUsdCxuLHIsaSl7aWYodC5zdWJhcnJheSYmZS5zdWJhcnJheSllLnNldCh0LnN1YmFycmF5KG4sbityKSxpKTtlbHNlIGZvcih2YXIgbz0wO288cjtvKyspZVtpK29dPXRbbitvXX0sZmxhdHRlbkNodW5rczpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGE7Zm9yKHQ9cj0wLG49ZS5sZW5ndGg7dDxuO3QrKylyKz1lW3RdLmxlbmd0aDtmb3IoYT1uZXcgVWludDhBcnJheShyKSx0PWk9MCxuPWUubGVuZ3RoO3Q8bjt0Kyspbz1lW3RdLGEuc2V0KG8saSksaSs9by5sZW5ndGg7cmV0dXJuIGF9fSxpPXthcnJheVNldDpmdW5jdGlvbihlLHQsbixyLGkpe2Zvcih2YXIgbz0wO288cjtvKyspZVtpK29dPXRbbitvXX0sZmxhdHRlbkNodW5rczpmdW5jdGlvbihlKXtyZXR1cm5bXS5jb25jYXQuYXBwbHkoW10sZSl9fTt0LnNldFR5cGVkPWZ1bmN0aW9uKGUpe2U/KHQuQnVmOD1VaW50OEFycmF5LHQuQnVmMTY9VWludDE2QXJyYXksdC5CdWYzMj1JbnQzMkFycmF5LHQuYXNzaWduKHQscikpOih0LkJ1Zjg9QXJyYXksdC5CdWYxNj1BcnJheSx0LkJ1ZjMyPUFycmF5LHQuYXNzaWduKHQsaSkpfSx0LnNldFR5cGVkKG4pfSksZWw9KFF1LmFzc2lnbixRdS5zaHJpbmtCdWYsUXUuc2V0VHlwZWQsUXUuQnVmOCxRdS5CdWYxNixRdS5CdWYzMiwwKSx0bD0xO2Z1bmN0aW9uIG5sKGUpe2Zvcih2YXIgdD1lLmxlbmd0aDswPD0tLXQ7KWVbdF09MH12YXIgcmw9MCxpbD0yOSxvbD0yNTYsYWw9b2wrMStpbCxzbD0zMCxjbD0xOSx1bD0yKmFsKzEsbGw9MTUsZGw9MTYsZmw9NyxwbD0yNTYsaGw9MTYsdmw9MTcsZ2w9MTgsbWw9WzAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDIsMiwyLDIsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsMF0seWw9WzAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTNdLF9sPVswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMyw3XSxibD1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0sd2w9bmV3IEFycmF5KDIqKGFsKzIpKTtubCh3bCk7dmFyIGtsPW5ldyBBcnJheSgyKnNsKTtubChrbCk7dmFyIFNsPW5ldyBBcnJheSg1MTIpO25sKFNsKTt2YXIgeGw9bmV3IEFycmF5KDI1Nik7bmwoeGwpO3ZhciBDbD1uZXcgQXJyYXkoaWwpO25sKENsKTt2YXIgVGwsT2wsRWwsQWw9bmV3IEFycmF5KHNsKTtmdW5jdGlvbiBJbChlLHQsbixyLGkpe3RoaXMuc3RhdGljX3RyZWU9ZSx0aGlzLmV4dHJhX2JpdHM9dCx0aGlzLmV4dHJhX2Jhc2U9bix0aGlzLmVsZW1zPXIsdGhpcy5tYXhfbGVuZ3RoPWksdGhpcy5oYXNfc3RyZWU9ZSYmZS5sZW5ndGh9ZnVuY3Rpb24gJGwoZSx0KXt0aGlzLmR5bl90cmVlPWUsdGhpcy5tYXhfY29kZT0wLHRoaXMuc3RhdF9kZXNjPXR9ZnVuY3Rpb24gUGwoZSl7cmV0dXJuIGU8MjU2P1NsW2VdOlNsWzI1NisoZT4+PjcpXX1mdW5jdGlvbiBNbChlLHQpe2UucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPTI1NSZ0LGUucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPXQ+Pj44JjI1NX1mdW5jdGlvbiBqbChlLHQsbil7ZS5iaV92YWxpZD5kbC1uPyhlLmJpX2J1Znw9dDw8ZS5iaV92YWxpZCY2NTUzNSxNbChlLGUuYmlfYnVmKSxlLmJpX2J1Zj10Pj5kbC1lLmJpX3ZhbGlkLGUuYmlfdmFsaWQrPW4tZGwpOihlLmJpX2J1Znw9dDw8ZS5iaV92YWxpZCY2NTUzNSxlLmJpX3ZhbGlkKz1uKX1mdW5jdGlvbiBMbChlLHQsbil7amwoZSxuWzIqdF0sblsyKnQrMV0pfWZ1bmN0aW9uIE5sKGUsdCl7Zm9yKHZhciBuPTA7bnw9MSZlLGU+Pj49MSxuPDw9MSwwPC0tdDspO3JldHVybiBuPj4+MX1mdW5jdGlvbiBCbChlLHQsbil7dmFyIHIsaSxvPW5ldyBBcnJheShsbCsxKSxhPTA7Zm9yKHI9MTtyPD1sbDtyKyspb1tyXT1hPWErbltyLTFdPDwxO2ZvcihpPTA7aTw9dDtpKyspe3ZhciBzPWVbMippKzFdOzAhPT1zJiYoZVsyKmldPU5sKG9bc10rKyxzKSl9fWZ1bmN0aW9uIERsKGUpe3ZhciB0O2Zvcih0PTA7dDxhbDt0KyspZS5keW5fbHRyZWVbMip0XT0wO2Zvcih0PTA7dDxzbDt0KyspZS5keW5fZHRyZWVbMip0XT0wO2Zvcih0PTA7dDxjbDt0KyspZS5ibF90cmVlWzIqdF09MDtlLmR5bl9sdHJlZVsyKnBsXT0xLGUub3B0X2xlbj1lLnN0YXRpY19sZW49MCxlLmxhc3RfbGl0PWUubWF0Y2hlcz0wfWZ1bmN0aW9uIFJsKGUpezg8ZS5iaV92YWxpZD9NbChlLGUuYmlfYnVmKTowPGUuYmlfdmFsaWQmJihlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT1lLmJpX2J1ZiksZS5iaV9idWY9MCxlLmJpX3ZhbGlkPTB9ZnVuY3Rpb24gRmwoZSx0LG4scil7dmFyIGk9Mip0LG89MipuO3JldHVybiBlW2ldPGVbb118fGVbaV09PT1lW29dJiZyW3RdPD1yW25dfWZ1bmN0aW9uIHpsKGUsdCxuKXtmb3IodmFyIHI9ZS5oZWFwW25dLGk9bjw8MTtpPD1lLmhlYXBfbGVuJiYoaTxlLmhlYXBfbGVuJiZGbCh0LGUuaGVhcFtpKzFdLGUuaGVhcFtpXSxlLmRlcHRoKSYmaSsrLCFGbCh0LHIsZS5oZWFwW2ldLGUuZGVwdGgpKTspZS5oZWFwW25dPWUuaGVhcFtpXSxuPWksaTw8PTE7ZS5oZWFwW25dPXJ9ZnVuY3Rpb24gVmwoZSx0LG4pe3ZhciByLGksbyxhLHM9MDtpZigwIT09ZS5sYXN0X2xpdClmb3IoO3I9ZS5wZW5kaW5nX2J1ZltlLmRfYnVmKzIqc108PDh8ZS5wZW5kaW5nX2J1ZltlLmRfYnVmKzIqcysxXSxpPWUucGVuZGluZ19idWZbZS5sX2J1ZitzXSxzKyssMD09PXI/TGwoZSxpLHQpOihMbChlLChvPXhsW2ldKStvbCsxLHQpLDAhPT0oYT1tbFtvXSkmJmpsKGUsaS09Q2xbb10sYSksTGwoZSxvPVBsKC0tciksbiksMCE9PShhPXlsW29dKSYmamwoZSxyLT1BbFtvXSxhKSksczxlLmxhc3RfbGl0Oyk7TGwoZSxwbCx0KX1mdW5jdGlvbiBVbChlLHQpe3ZhciBuLHIsaSxvPXQuZHluX3RyZWUsYT10LnN0YXRfZGVzYy5zdGF0aWNfdHJlZSxzPXQuc3RhdF9kZXNjLmhhc19zdHJlZSxjPXQuc3RhdF9kZXNjLmVsZW1zLHU9LTE7Zm9yKGUuaGVhcF9sZW49MCxlLmhlYXBfbWF4PXVsLG49MDtuPGM7bisrKTAhPT1vWzIqbl0/KGUuaGVhcFsrK2UuaGVhcF9sZW5dPXU9bixlLmRlcHRoW25dPTApOm9bMipuKzFdPTA7Zm9yKDtlLmhlYXBfbGVuPDI7KW9bMiooaT1lLmhlYXBbKytlLmhlYXBfbGVuXT11PDI/Kyt1OjApXT0xLGUuZGVwdGhbaV09MCxlLm9wdF9sZW4tLSxzJiYoZS5zdGF0aWNfbGVuLT1hWzIqaSsxXSk7Zm9yKHQubWF4X2NvZGU9dSxuPWUuaGVhcF9sZW4+PjE7MTw9bjtuLS0pemwoZSxvLG4pO2ZvcihpPWM7bj1lLmhlYXBbMV0sZS5oZWFwWzFdPWUuaGVhcFtlLmhlYXBfbGVuLS1dLHpsKGUsbywxKSxyPWUuaGVhcFsxXSxlLmhlYXBbLS1lLmhlYXBfbWF4XT1uLGUuaGVhcFstLWUuaGVhcF9tYXhdPXIsb1syKmldPW9bMipuXStvWzIqcl0sZS5kZXB0aFtpXT0oZS5kZXB0aFtuXT49ZS5kZXB0aFtyXT9lLmRlcHRoW25dOmUuZGVwdGhbcl0pKzEsb1syKm4rMV09b1syKnIrMV09aSxlLmhlYXBbMV09aSsrLHpsKGUsbywxKSwyPD1lLmhlYXBfbGVuOyk7ZS5oZWFwWy0tZS5oZWFwX21heF09ZS5oZWFwWzFdLGZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYSxzLGM9dC5keW5fdHJlZSx1PXQubWF4X2NvZGUsbD10LnN0YXRfZGVzYy5zdGF0aWNfdHJlZSxkPXQuc3RhdF9kZXNjLmhhc19zdHJlZSxmPXQuc3RhdF9kZXNjLmV4dHJhX2JpdHMscD10LnN0YXRfZGVzYy5leHRyYV9iYXNlLGg9dC5zdGF0X2Rlc2MubWF4X2xlbmd0aCx2PTA7Zm9yKG89MDtvPD1sbDtvKyspZS5ibF9jb3VudFtvXT0wO2ZvcihjWzIqZS5oZWFwW2UuaGVhcF9tYXhdKzFdPTAsbj1lLmhlYXBfbWF4KzE7bjx1bDtuKyspaDwobz1jWzIqY1syKihyPWUuaGVhcFtuXSkrMV0rMV0rMSkmJihvPWgsdisrKSxjWzIqcisxXT1vLHU8cnx8KGUuYmxfY291bnRbb10rKyxhPTAscDw9ciYmKGE9ZltyLXBdKSxzPWNbMipyXSxlLm9wdF9sZW4rPXMqKG8rYSksZCYmKGUuc3RhdGljX2xlbis9cyoobFsyKnIrMV0rYSkpKTtpZigwIT09dil7ZG97Zm9yKG89aC0xOzA9PT1lLmJsX2NvdW50W29dOylvLS07ZS5ibF9jb3VudFtvXS0tLGUuYmxfY291bnRbbysxXSs9MixlLmJsX2NvdW50W2hdLS0sdi09Mn13aGlsZSgwPHYpO2ZvcihvPWg7MCE9PW87by0tKWZvcihyPWUuYmxfY291bnRbb107MCE9PXI7KXU8KGk9ZS5oZWFwWy0tbl0pfHwoY1syKmkrMV0hPT1vJiYoZS5vcHRfbGVuKz0oby1jWzIqaSsxXSkqY1syKmldLGNbMippKzFdPW8pLHItLSl9fShlLHQpLEJsKG8sdSxlLmJsX2NvdW50KX1mdW5jdGlvbiBxbChlLHQsbil7dmFyIHIsaSxvPS0xLGE9dFsxXSxzPTAsYz03LHU9NDtmb3IoMD09PWEmJihjPTEzOCx1PTMpLHRbMioobisxKSsxXT02NTUzNSxyPTA7cjw9bjtyKyspaT1hLGE9dFsyKihyKzEpKzFdLCsrczxjJiZpPT09YXx8KHM8dT9lLmJsX3RyZWVbMippXSs9czowIT09aT8oaSE9PW8mJmUuYmxfdHJlZVsyKmldKyssZS5ibF90cmVlWzIqaGxdKyspOnM8PTEwP2UuYmxfdHJlZVsyKnZsXSsrOmUuYmxfdHJlZVsyKmdsXSsrLG89aSwocz0wKT09PWE/KGM9MTM4LHU9Myk6aT09PWE/KGM9Nix1PTMpOihjPTcsdT00KSl9ZnVuY3Rpb24gV2woZSx0LG4pe3ZhciByLGksbz0tMSxhPXRbMV0scz0wLGM9Nyx1PTQ7Zm9yKDA9PT1hJiYoYz0xMzgsdT0zKSxyPTA7cjw9bjtyKyspaWYoaT1hLGE9dFsyKihyKzEpKzFdLCEoKytzPGMmJmk9PT1hKSl7aWYoczx1KWZvcig7TGwoZSxpLGUuYmxfdHJlZSksMCE9LS1zOyk7ZWxzZSAwIT09aT8oaSE9PW8mJihMbChlLGksZS5ibF90cmVlKSxzLS0pLExsKGUsaGwsZS5ibF90cmVlKSxqbChlLHMtMywyKSk6czw9MTA/KExsKGUsdmwsZS5ibF90cmVlKSxqbChlLHMtMywzKSk6KExsKGUsZ2wsZS5ibF90cmVlKSxqbChlLHMtMTEsNykpO289aSwocz0wKT09PWE/KGM9MTM4LHU9Myk6aT09PWE/KGM9Nix1PTMpOihjPTcsdT00KX19bmwoQWwpO3ZhciBIbD0hMTtmdW5jdGlvbiBHbChlLHQsbixyKXt2YXIgaSxvLGEscztqbChlLChybDw8MSkrKHI/MTowKSwzKSxvPXQsYT1uLHM9ITAsUmwoaT1lKSxzJiYoTWwoaSxhKSxNbChpLH5hKSksUXUuYXJyYXlTZXQoaS5wZW5kaW5nX2J1ZixpLndpbmRvdyxvLGEsaS5wZW5kaW5nKSxpLnBlbmRpbmcrPWF9dmFyIFhsPXtfdHJfaW5pdDpmdW5jdGlvbihlKXtIbHx8KGZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaSxvPW5ldyBBcnJheShsbCsxKTtmb3Iocj1uPTA7cjxpbC0xO3IrKylmb3IoQ2xbcl09bixlPTA7ZTwxPDxtbFtyXTtlKyspeGxbbisrXT1yO2Zvcih4bFtuLTFdPXIscj1pPTA7cjwxNjtyKyspZm9yKEFsW3JdPWksZT0wO2U8MTw8eWxbcl07ZSsrKVNsW2krK109cjtmb3IoaT4+PTc7cjxzbDtyKyspZm9yKEFsW3JdPWk8PDcsZT0wO2U8MTw8eWxbcl0tNztlKyspU2xbMjU2K2krK109cjtmb3IodD0wO3Q8PWxsO3QrKylvW3RdPTA7Zm9yKGU9MDtlPD0xNDM7KXdsWzIqZSsxXT04LGUrKyxvWzhdKys7Zm9yKDtlPD0yNTU7KXdsWzIqZSsxXT05LGUrKyxvWzldKys7Zm9yKDtlPD0yNzk7KXdsWzIqZSsxXT03LGUrKyxvWzddKys7Zm9yKDtlPD0yODc7KXdsWzIqZSsxXT04LGUrKyxvWzhdKys7Zm9yKEJsKHdsLGFsKzEsbyksZT0wO2U8c2w7ZSsrKWtsWzIqZSsxXT01LGtsWzIqZV09TmwoZSw1KTtUbD1uZXcgSWwod2wsbWwsb2wrMSxhbCxsbCksT2w9bmV3IElsKGtsLHlsLDAsc2wsbGwpLEVsPW5ldyBJbChuZXcgQXJyYXkoMCksX2wsMCxjbCxmbCl9KCksSGw9ITApLGUubF9kZXNjPW5ldyAkbChlLmR5bl9sdHJlZSxUbCksZS5kX2Rlc2M9bmV3ICRsKGUuZHluX2R0cmVlLE9sKSxlLmJsX2Rlc2M9bmV3ICRsKGUuYmxfdHJlZSxFbCksZS5iaV9idWY9MCxlLmJpX3ZhbGlkPTAsRGwoZSl9LF90cl9zdG9yZWRfYmxvY2s6R2wsX3RyX2ZsdXNoX2Jsb2NrOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYT0wOzA8ZS5sZXZlbD8oMj09PWUuc3RybS5kYXRhX3R5cGUmJihlLnN0cm0uZGF0YV90eXBlPWZ1bmN0aW9uKGUpe3ZhciB0LG49NDA5MzYyNDQ0Nztmb3IodD0wO3Q8PTMxO3QrKyxuPj4+PTEpaWYoMSZuJiYwIT09ZS5keW5fbHRyZWVbMip0XSlyZXR1cm4gZWw7aWYoMCE9PWUuZHluX2x0cmVlWzE4XXx8MCE9PWUuZHluX2x0cmVlWzIwXXx8MCE9PWUuZHluX2x0cmVlWzI2XSlyZXR1cm4gdGw7Zm9yKHQ9MzI7dDxvbDt0KyspaWYoMCE9PWUuZHluX2x0cmVlWzIqdF0pcmV0dXJuIHRsO3JldHVybiBlbH0oZSkpLFVsKGUsZS5sX2Rlc2MpLFVsKGUsZS5kX2Rlc2MpLGE9ZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHFsKGUsZS5keW5fbHRyZWUsZS5sX2Rlc2MubWF4X2NvZGUpLHFsKGUsZS5keW5fZHRyZWUsZS5kX2Rlc2MubWF4X2NvZGUpLFVsKGUsZS5ibF9kZXNjKSx0PWNsLTE7Mzw9dCYmMD09PWUuYmxfdHJlZVsyKmJsW3RdKzFdO3QtLSk7cmV0dXJuIGUub3B0X2xlbis9MyoodCsxKSs1KzUrNCx0fShlKSxpPWUub3B0X2xlbiszKzc+Pj4zLChvPWUuc3RhdGljX2xlbiszKzc+Pj4zKTw9aSYmKGk9bykpOmk9bz1uKzUsbis0PD1pJiYtMSE9PXQ/R2woZSx0LG4scik6ND09PWUuc3RyYXRlZ3l8fG89PT1pPyhqbChlLDIrKHI/MTowKSwzKSxWbChlLHdsLGtsKSk6KGpsKGUsNCsocj8xOjApLDMpLGZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpO2ZvcihqbChlLHQtMjU3LDUpLGpsKGUsbi0xLDUpLGpsKGUsci00LDQpLGk9MDtpPHI7aSsrKWpsKGUsZS5ibF90cmVlWzIqYmxbaV0rMV0sMyk7V2woZSxlLmR5bl9sdHJlZSx0LTEpLFdsKGUsZS5keW5fZHRyZWUsbi0xKX0oZSxlLmxfZGVzYy5tYXhfY29kZSsxLGUuZF9kZXNjLm1heF9jb2RlKzEsYSsxKSxWbChlLGUuZHluX2x0cmVlLGUuZHluX2R0cmVlKSksRGwoZSksciYmUmwoZSl9LF90cl90YWxseTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGUucGVuZGluZ19idWZbZS5kX2J1ZisyKmUubGFzdF9saXRdPXQ+Pj44JjI1NSxlLnBlbmRpbmdfYnVmW2UuZF9idWYrMiplLmxhc3RfbGl0KzFdPTI1NSZ0LGUucGVuZGluZ19idWZbZS5sX2J1ZitlLmxhc3RfbGl0XT0yNTUmbixlLmxhc3RfbGl0KyssMD09PXQ/ZS5keW5fbHRyZWVbMipuXSsrOihlLm1hdGNoZXMrKyx0LS0sZS5keW5fbHRyZWVbMiooeGxbbl0rb2wrMSldKyssZS5keW5fZHRyZWVbMipQbCh0KV0rKyksZS5sYXN0X2xpdD09PWUubGl0X2J1ZnNpemUtMX0sX3RyX2FsaWduOmZ1bmN0aW9uKGUpe3ZhciB0O2psKGUsMiwzKSxMbChlLHBsLHdsKSwxNj09PSh0PWUpLmJpX3ZhbGlkPyhNbCh0LHQuYmlfYnVmKSx0LmJpX2J1Zj0wLHQuYmlfdmFsaWQ9MCk6ODw9dC5iaV92YWxpZCYmKHQucGVuZGluZ19idWZbdC5wZW5kaW5nKytdPTI1NSZ0LmJpX2J1Zix0LmJpX2J1Zj4+PTgsdC5iaV92YWxpZC09OCl9fTt2YXIgWWw9ZnVuY3Rpb24oZSx0LG4scil7Zm9yKHZhciBpPTY1NTM1JmV8MCxvPWU+Pj4xNiY2NTUzNXwwLGE9MDswIT09bjspe2ZvcihuLT1hPTJlMzxuPzJlMzpuO289bysoaT1pK3RbcisrXXwwKXwwLC0tYTspO2klPTY1NTIxLG8lPTY1NTIxfXJldHVybiBpfG88PDE2fDB9O3ZhciBKbD1mdW5jdGlvbigpe2Zvcih2YXIgZSx0PVtdLG49MDtuPDI1NjtuKyspe2U9bjtmb3IodmFyIHI9MDtyPDg7cisrKWU9MSZlPzM5ODgyOTIzODReZT4+PjE6ZT4+PjE7dFtuXT1lfXJldHVybiB0fSgpO3ZhciBLbCxabD1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT1KbCxvPXIrbjtlXj0tMTtmb3IodmFyIGE9cjthPG87YSsrKWU9ZT4+PjheaVsyNTUmKGVedFthXSldO3JldHVybi0xXmV9LFFsPXsyOiJuZWVkIGRpY3Rpb25hcnkiLDE6InN0cmVhbSBlbmQiLDA6IiIsIi0xIjoiZmlsZSBlcnJvciIsIi0yIjoic3RyZWFtIGVycm9yIiwiLTMiOiJkYXRhIGVycm9yIiwiLTQiOiJpbnN1ZmZpY2llbnQgbWVtb3J5IiwiLTUiOiJidWZmZXIgZXJyb3IiLCItNiI6ImluY29tcGF0aWJsZSB2ZXJzaW9uIn0sZWQ9MCx0ZD00LG5kPTAscmQ9LTIsaWQ9LTEsb2Q9NCxhZD0yLHNkPTgsY2Q9OSx1ZD0yODYsbGQ9MzAsZGQ9MTksZmQ9Mip1ZCsxLHBkPTE1LGhkPTMsdmQ9MjU4LGdkPXZkK2hkKzEsbWQ9NDIseWQ9MTEzLF9kPTEsYmQ9Mix3ZD0zLGtkPTQ7ZnVuY3Rpb24gU2QoZSx0KXtyZXR1cm4gZS5tc2c9UWxbdF0sdH1mdW5jdGlvbiB4ZChlKXtyZXR1cm4oZTw8MSktKDQ8ZT85OjApfWZ1bmN0aW9uIENkKGUpe2Zvcih2YXIgdD1lLmxlbmd0aDswPD0tLXQ7KWVbdF09MH1mdW5jdGlvbiBUZChlKXt2YXIgdD1lLnN0YXRlLG49dC5wZW5kaW5nO24+ZS5hdmFpbF9vdXQmJihuPWUuYXZhaWxfb3V0KSwwIT09biYmKFF1LmFycmF5U2V0KGUub3V0cHV0LHQucGVuZGluZ19idWYsdC5wZW5kaW5nX291dCxuLGUubmV4dF9vdXQpLGUubmV4dF9vdXQrPW4sdC5wZW5kaW5nX291dCs9bixlLnRvdGFsX291dCs9bixlLmF2YWlsX291dC09bix0LnBlbmRpbmctPW4sMD09PXQucGVuZGluZyYmKHQucGVuZGluZ19vdXQ9MCkpfWZ1bmN0aW9uIE9kKGUsdCl7WGwuX3RyX2ZsdXNoX2Jsb2NrKGUsMDw9ZS5ibG9ja19zdGFydD9lLmJsb2NrX3N0YXJ0Oi0xLGUuc3Ryc3RhcnQtZS5ibG9ja19zdGFydCx0KSxlLmJsb2NrX3N0YXJ0PWUuc3Ryc3RhcnQsVGQoZS5zdHJtKX1mdW5jdGlvbiBFZChlLHQpe2UucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPXR9ZnVuY3Rpb24gQWQoZSx0KXtlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT10Pj4+OCYyNTUsZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109MjU1JnR9ZnVuY3Rpb24gSWQoZSx0KXt2YXIgbixyLGk9ZS5tYXhfY2hhaW5fbGVuZ3RoLG89ZS5zdHJzdGFydCxhPWUucHJldl9sZW5ndGgscz1lLm5pY2VfbWF0Y2gsYz1lLnN0cnN0YXJ0PmUud19zaXplLWdkP2Uuc3Ryc3RhcnQtKGUud19zaXplLWdkKTowLHU9ZS53aW5kb3csbD1lLndfbWFzayxkPWUucHJldixmPWUuc3Ryc3RhcnQrdmQscD11W28rYS0xXSxoPXVbbythXTtlLnByZXZfbGVuZ3RoPj1lLmdvb2RfbWF0Y2gmJihpPj49Mikscz5lLmxvb2thaGVhZCYmKHM9ZS5sb29rYWhlYWQpO2Rve2lmKHVbKG49dCkrYV09PT1oJiZ1W24rYS0xXT09PXAmJnVbbl09PT11W29dJiZ1Wysrbl09PT11W28rMV0pe28rPTIsbisrO2Rve313aGlsZSh1Wysrb109PT11Wysrbl0mJnVbKytvXT09PXVbKytuXSYmdVsrK29dPT09dVsrK25dJiZ1Wysrb109PT11Wysrbl0mJnVbKytvXT09PXVbKytuXSYmdVsrK29dPT09dVsrK25dJiZ1Wysrb109PT11Wysrbl0mJnVbKytvXT09PXVbKytuXSYmbzxmKTtpZihyPXZkLShmLW8pLG89Zi12ZCxhPHIpe2lmKGUubWF0Y2hfc3RhcnQ9dCxzPD0oYT1yKSlicmVhaztwPXVbbythLTFdLGg9dVtvK2FdfX19d2hpbGUoKHQ9ZFt0JmxdKT5jJiYwIT0tLWkpO3JldHVybiBhPD1lLmxvb2thaGVhZD9hOmUubG9va2FoZWFkfWZ1bmN0aW9uICRkKGUpe3ZhciB0LG4scixpLG8sYSxzLGMsdSxsLGQ9ZS53X3NpemU7ZG97aWYoaT1lLndpbmRvd19zaXplLWUubG9va2FoZWFkLWUuc3Ryc3RhcnQsZS5zdHJzdGFydD49ZCsoZC1nZCkpe2ZvcihRdS5hcnJheVNldChlLndpbmRvdyxlLndpbmRvdyxkLGQsMCksZS5tYXRjaF9zdGFydC09ZCxlLnN0cnN0YXJ0LT1kLGUuYmxvY2tfc3RhcnQtPWQsdD1uPWUuaGFzaF9zaXplO3I9ZS5oZWFkWy0tdF0sZS5oZWFkW3RdPWQ8PXI/ci1kOjAsLS1uOyk7Zm9yKHQ9bj1kO3I9ZS5wcmV2Wy0tdF0sZS5wcmV2W3RdPWQ8PXI/ci1kOjAsLS1uOyk7aSs9ZH1pZigwPT09ZS5zdHJtLmF2YWlsX2luKWJyZWFrO2lmKGE9ZS5zdHJtLHM9ZS53aW5kb3csYz1lLnN0cnN0YXJ0K2UubG9va2FoZWFkLHU9aSxsPXZvaWQgMCxsPWEuYXZhaWxfaW4sdTxsJiYobD11KSxuPTA9PT1sPzA6KGEuYXZhaWxfaW4tPWwsUXUuYXJyYXlTZXQocyxhLmlucHV0LGEubmV4dF9pbixsLGMpLDE9PT1hLnN0YXRlLndyYXA/YS5hZGxlcj1ZbChhLmFkbGVyLHMsbCxjKToyPT09YS5zdGF0ZS53cmFwJiYoYS5hZGxlcj1abChhLmFkbGVyLHMsbCxjKSksYS5uZXh0X2luKz1sLGEudG90YWxfaW4rPWwsbCksZS5sb29rYWhlYWQrPW4sZS5sb29rYWhlYWQrZS5pbnNlcnQ+PWhkKWZvcihvPWUuc3Ryc3RhcnQtZS5pbnNlcnQsZS5pbnNfaD1lLndpbmRvd1tvXSxlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbbysxXSkmZS5oYXNoX21hc2s7ZS5pbnNlcnQmJihlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbbytoZC0xXSkmZS5oYXNoX21hc2ssZS5wcmV2W28mZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09byxvKyssZS5pbnNlcnQtLSwhKGUubG9va2FoZWFkK2UuaW5zZXJ0PGhkKSk7KTt9d2hpbGUoZS5sb29rYWhlYWQ8Z2QmJjAhPT1lLnN0cm0uYXZhaWxfaW4pfWZ1bmN0aW9uIFBkKGUsdCl7Zm9yKHZhciBuLHI7Oyl7aWYoZS5sb29rYWhlYWQ8Z2Qpe2lmKCRkKGUpLGUubG9va2FoZWFkPGdkJiZ0PT09ZWQpcmV0dXJuIF9kO2lmKDA9PT1lLmxvb2thaGVhZClicmVha31pZihuPTAsZS5sb29rYWhlYWQ+PWhkJiYoZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2Uuc3Ryc3RhcnQraGQtMV0pJmUuaGFzaF9tYXNrLG49ZS5wcmV2W2Uuc3Ryc3RhcnQmZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09ZS5zdHJzdGFydCksMCE9PW4mJmUuc3Ryc3RhcnQtbjw9ZS53X3NpemUtZ2QmJihlLm1hdGNoX2xlbmd0aD1JZChlLG4pKSxlLm1hdGNoX2xlbmd0aD49aGQpaWYocj1YbC5fdHJfdGFsbHkoZSxlLnN0cnN0YXJ0LWUubWF0Y2hfc3RhcnQsZS5tYXRjaF9sZW5ndGgtaGQpLGUubG9va2FoZWFkLT1lLm1hdGNoX2xlbmd0aCxlLm1hdGNoX2xlbmd0aDw9ZS5tYXhfbGF6eV9tYXRjaCYmZS5sb29rYWhlYWQ+PWhkKXtmb3IoZS5tYXRjaF9sZW5ndGgtLTtlLnN0cnN0YXJ0KyssZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2Uuc3Ryc3RhcnQraGQtMV0pJmUuaGFzaF9tYXNrLG49ZS5wcmV2W2Uuc3Ryc3RhcnQmZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09ZS5zdHJzdGFydCwwIT0tLWUubWF0Y2hfbGVuZ3RoOyk7ZS5zdHJzdGFydCsrfWVsc2UgZS5zdHJzdGFydCs9ZS5tYXRjaF9sZW5ndGgsZS5tYXRjaF9sZW5ndGg9MCxlLmluc19oPWUud2luZG93W2Uuc3Ryc3RhcnRdLGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tlLnN0cnN0YXJ0KzFdKSZlLmhhc2hfbWFzaztlbHNlIHI9WGwuX3RyX3RhbGx5KGUsMCxlLndpbmRvd1tlLnN0cnN0YXJ0XSksZS5sb29rYWhlYWQtLSxlLnN0cnN0YXJ0Kys7aWYociYmKE9kKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gX2R9cmV0dXJuIGUuaW5zZXJ0PWUuc3Ryc3RhcnQ8aGQtMT9lLnN0cnN0YXJ0OmhkLTEsdD09PXRkPyhPZChlLCEwKSwwPT09ZS5zdHJtLmF2YWlsX291dD93ZDprZCk6ZS5sYXN0X2xpdCYmKE9kKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KT9fZDpiZH1mdW5jdGlvbiBNZChlLHQpe2Zvcih2YXIgbixyLGk7Oyl7aWYoZS5sb29rYWhlYWQ8Z2Qpe2lmKCRkKGUpLGUubG9va2FoZWFkPGdkJiZ0PT09ZWQpcmV0dXJuIF9kO2lmKDA9PT1lLmxvb2thaGVhZClicmVha31pZihuPTAsZS5sb29rYWhlYWQ+PWhkJiYoZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2Uuc3Ryc3RhcnQraGQtMV0pJmUuaGFzaF9tYXNrLG49ZS5wcmV2W2Uuc3Ryc3RhcnQmZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09ZS5zdHJzdGFydCksZS5wcmV2X2xlbmd0aD1lLm1hdGNoX2xlbmd0aCxlLnByZXZfbWF0Y2g9ZS5tYXRjaF9zdGFydCxlLm1hdGNoX2xlbmd0aD1oZC0xLDAhPT1uJiZlLnByZXZfbGVuZ3RoPGUubWF4X2xhenlfbWF0Y2gmJmUuc3Ryc3RhcnQtbjw9ZS53X3NpemUtZ2QmJihlLm1hdGNoX2xlbmd0aD1JZChlLG4pLGUubWF0Y2hfbGVuZ3RoPD01JiYoMT09PWUuc3RyYXRlZ3l8fGUubWF0Y2hfbGVuZ3RoPT09aGQmJjQwOTY8ZS5zdHJzdGFydC1lLm1hdGNoX3N0YXJ0KSYmKGUubWF0Y2hfbGVuZ3RoPWhkLTEpKSxlLnByZXZfbGVuZ3RoPj1oZCYmZS5tYXRjaF9sZW5ndGg8PWUucHJldl9sZW5ndGgpe2ZvcihpPWUuc3Ryc3RhcnQrZS5sb29rYWhlYWQtaGQscj1YbC5fdHJfdGFsbHkoZSxlLnN0cnN0YXJ0LTEtZS5wcmV2X21hdGNoLGUucHJldl9sZW5ndGgtaGQpLGUubG9va2FoZWFkLT1lLnByZXZfbGVuZ3RoLTEsZS5wcmV2X2xlbmd0aC09MjsrK2Uuc3Ryc3RhcnQ8PWkmJihlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbZS5zdHJzdGFydCtoZC0xXSkmZS5oYXNoX21hc2ssbj1lLnByZXZbZS5zdHJzdGFydCZlLndfbWFza109ZS5oZWFkW2UuaW5zX2hdLGUuaGVhZFtlLmluc19oXT1lLnN0cnN0YXJ0KSwwIT0tLWUucHJldl9sZW5ndGg7KTtpZihlLm1hdGNoX2F2YWlsYWJsZT0wLGUubWF0Y2hfbGVuZ3RoPWhkLTEsZS5zdHJzdGFydCsrLHImJihPZChlLCExKSwwPT09ZS5zdHJtLmF2YWlsX291dCkpcmV0dXJuIF9kfWVsc2UgaWYoZS5tYXRjaF9hdmFpbGFibGUpe2lmKChyPVhsLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydC0xXSkpJiZPZChlLCExKSxlLnN0cnN0YXJ0KyssZS5sb29rYWhlYWQtLSwwPT09ZS5zdHJtLmF2YWlsX291dClyZXR1cm4gX2R9ZWxzZSBlLm1hdGNoX2F2YWlsYWJsZT0xLGUuc3Ryc3RhcnQrKyxlLmxvb2thaGVhZC0tfXJldHVybiBlLm1hdGNoX2F2YWlsYWJsZSYmKHI9WGwuX3RyX3RhbGx5KGUsMCxlLndpbmRvd1tlLnN0cnN0YXJ0LTFdKSxlLm1hdGNoX2F2YWlsYWJsZT0wKSxlLmluc2VydD1lLnN0cnN0YXJ0PGhkLTE/ZS5zdHJzdGFydDpoZC0xLHQ9PT10ZD8oT2QoZSwhMCksMD09PWUuc3RybS5hdmFpbF9vdXQ/d2Q6a2QpOmUubGFzdF9saXQmJihPZChlLCExKSwwPT09ZS5zdHJtLmF2YWlsX291dCk/X2Q6YmR9ZnVuY3Rpb24gamQoZSx0LG4scixpKXt0aGlzLmdvb2RfbGVuZ3RoPWUsdGhpcy5tYXhfbGF6eT10LHRoaXMubmljZV9sZW5ndGg9bix0aGlzLm1heF9jaGFpbj1yLHRoaXMuZnVuYz1pfWZ1bmN0aW9uIExkKCl7dGhpcy5zdHJtPW51bGwsdGhpcy5zdGF0dXM9MCx0aGlzLnBlbmRpbmdfYnVmPW51bGwsdGhpcy5wZW5kaW5nX2J1Zl9zaXplPTAsdGhpcy5wZW5kaW5nX291dD0wLHRoaXMucGVuZGluZz0wLHRoaXMud3JhcD0wLHRoaXMuZ3poZWFkPW51bGwsdGhpcy5nemluZGV4PTAsdGhpcy5tZXRob2Q9c2QsdGhpcy5sYXN0X2ZsdXNoPS0xLHRoaXMud19zaXplPTAsdGhpcy53X2JpdHM9MCx0aGlzLndfbWFzaz0wLHRoaXMud2luZG93PW51bGwsdGhpcy53aW5kb3dfc2l6ZT0wLHRoaXMucHJldj1udWxsLHRoaXMuaGVhZD1udWxsLHRoaXMuaW5zX2g9MCx0aGlzLmhhc2hfc2l6ZT0wLHRoaXMuaGFzaF9iaXRzPTAsdGhpcy5oYXNoX21hc2s9MCx0aGlzLmhhc2hfc2hpZnQ9MCx0aGlzLmJsb2NrX3N0YXJ0PTAsdGhpcy5tYXRjaF9sZW5ndGg9MCx0aGlzLnByZXZfbWF0Y2g9MCx0aGlzLm1hdGNoX2F2YWlsYWJsZT0wLHRoaXMuc3Ryc3RhcnQ9MCx0aGlzLm1hdGNoX3N0YXJ0PTAsdGhpcy5sb29rYWhlYWQ9MCx0aGlzLnByZXZfbGVuZ3RoPTAsdGhpcy5tYXhfY2hhaW5fbGVuZ3RoPTAsdGhpcy5tYXhfbGF6eV9tYXRjaD0wLHRoaXMubGV2ZWw9MCx0aGlzLnN0cmF0ZWd5PTAsdGhpcy5nb29kX21hdGNoPTAsdGhpcy5uaWNlX21hdGNoPTAsdGhpcy5keW5fbHRyZWU9bmV3IFF1LkJ1ZjE2KDIqZmQpLHRoaXMuZHluX2R0cmVlPW5ldyBRdS5CdWYxNigyKigyKmxkKzEpKSx0aGlzLmJsX3RyZWU9bmV3IFF1LkJ1ZjE2KDIqKDIqZGQrMSkpLENkKHRoaXMuZHluX2x0cmVlKSxDZCh0aGlzLmR5bl9kdHJlZSksQ2QodGhpcy5ibF90cmVlKSx0aGlzLmxfZGVzYz1udWxsLHRoaXMuZF9kZXNjPW51bGwsdGhpcy5ibF9kZXNjPW51bGwsdGhpcy5ibF9jb3VudD1uZXcgUXUuQnVmMTYocGQrMSksdGhpcy5oZWFwPW5ldyBRdS5CdWYxNigyKnVkKzEpLENkKHRoaXMuaGVhcCksdGhpcy5oZWFwX2xlbj0wLHRoaXMuaGVhcF9tYXg9MCx0aGlzLmRlcHRoPW5ldyBRdS5CdWYxNigyKnVkKzEpLENkKHRoaXMuZGVwdGgpLHRoaXMubF9idWY9MCx0aGlzLmxpdF9idWZzaXplPTAsdGhpcy5sYXN0X2xpdD0wLHRoaXMuZF9idWY9MCx0aGlzLm9wdF9sZW49MCx0aGlzLnN0YXRpY19sZW49MCx0aGlzLm1hdGNoZXM9MCx0aGlzLmluc2VydD0wLHRoaXMuYmlfYnVmPTAsdGhpcy5iaV92YWxpZD0wfWZ1bmN0aW9uIE5kKGUpe3ZhciB0O3JldHVybiBlJiZlLnN0YXRlPyhlLnRvdGFsX2luPWUudG90YWxfb3V0PTAsZS5kYXRhX3R5cGU9YWQsKHQ9ZS5zdGF0ZSkucGVuZGluZz0wLHQucGVuZGluZ19vdXQ9MCx0LndyYXA8MCYmKHQud3JhcD0tdC53cmFwKSx0LnN0YXR1cz10LndyYXA/bWQ6eWQsZS5hZGxlcj0yPT09dC53cmFwPzA6MSx0Lmxhc3RfZmx1c2g9ZWQsWGwuX3RyX2luaXQodCksbmQpOlNkKGUscmQpfWZ1bmN0aW9uIEJkKGUpe3ZhciB0LG49TmQoZSk7cmV0dXJuIG49PT1uZCYmKCh0PWUuc3RhdGUpLndpbmRvd19zaXplPTIqdC53X3NpemUsQ2QodC5oZWFkKSx0Lm1heF9sYXp5X21hdGNoPUtsW3QubGV2ZWxdLm1heF9sYXp5LHQuZ29vZF9tYXRjaD1LbFt0LmxldmVsXS5nb29kX2xlbmd0aCx0Lm5pY2VfbWF0Y2g9S2xbdC5sZXZlbF0ubmljZV9sZW5ndGgsdC5tYXhfY2hhaW5fbGVuZ3RoPUtsW3QubGV2ZWxdLm1heF9jaGFpbix0LnN0cnN0YXJ0PTAsdC5ibG9ja19zdGFydD0wLHQubG9va2FoZWFkPTAsdC5pbnNlcnQ9MCx0Lm1hdGNoX2xlbmd0aD10LnByZXZfbGVuZ3RoPWhkLTEsdC5tYXRjaF9hdmFpbGFibGU9MCx0Lmluc19oPTApLG59ZnVuY3Rpb24gRGQoZSx0LG4scixpLG8pe2lmKCFlKXJldHVybiByZDt2YXIgYT0xO2lmKHQ9PT1pZCYmKHQ9NikscjwwPyhhPTAscj0tcik6MTU8ciYmKGE9MixyLT0xNiksaTwxfHxjZDxpfHxuIT09c2R8fHI8OHx8MTU8cnx8dDwwfHw5PHR8fG88MHx8b2Q8bylyZXR1cm4gU2QoZSxyZCk7OD09PXImJihyPTkpO3ZhciBzPW5ldyBMZDtyZXR1cm4oZS5zdGF0ZT1zKS5zdHJtPWUscy53cmFwPWEscy5nemhlYWQ9bnVsbCxzLndfYml0cz1yLHMud19zaXplPTE8PHMud19iaXRzLHMud19tYXNrPXMud19zaXplLTEscy5oYXNoX2JpdHM9aSs3LHMuaGFzaF9zaXplPTE8PHMuaGFzaF9iaXRzLHMuaGFzaF9tYXNrPXMuaGFzaF9zaXplLTEscy5oYXNoX3NoaWZ0PX5+KChzLmhhc2hfYml0cytoZC0xKS9oZCkscy53aW5kb3c9bmV3IFF1LkJ1ZjgoMipzLndfc2l6ZSkscy5oZWFkPW5ldyBRdS5CdWYxNihzLmhhc2hfc2l6ZSkscy5wcmV2PW5ldyBRdS5CdWYxNihzLndfc2l6ZSkscy5saXRfYnVmc2l6ZT0xPDxpKzYscy5wZW5kaW5nX2J1Zl9zaXplPTQqcy5saXRfYnVmc2l6ZSxzLnBlbmRpbmdfYnVmPW5ldyBRdS5CdWY4KHMucGVuZGluZ19idWZfc2l6ZSkscy5kX2J1Zj0xKnMubGl0X2J1ZnNpemUscy5sX2J1Zj0zKnMubGl0X2J1ZnNpemUscy5sZXZlbD10LHMuc3RyYXRlZ3k9byxzLm1ldGhvZD1uLEJkKGUpfUtsPVtuZXcgamQoMCwwLDAsMCxmdW5jdGlvbihlLHQpe3ZhciBuPTY1NTM1O2ZvcihuPmUucGVuZGluZ19idWZfc2l6ZS01JiYobj1lLnBlbmRpbmdfYnVmX3NpemUtNSk7Oyl7aWYoZS5sb29rYWhlYWQ8PTEpe2lmKCRkKGUpLDA9PT1lLmxvb2thaGVhZCYmdD09PWVkKXJldHVybiBfZDtpZigwPT09ZS5sb29rYWhlYWQpYnJlYWt9ZS5zdHJzdGFydCs9ZS5sb29rYWhlYWQsZS5sb29rYWhlYWQ9MDt2YXIgcj1lLmJsb2NrX3N0YXJ0K247aWYoKDA9PT1lLnN0cnN0YXJ0fHxlLnN0cnN0YXJ0Pj1yKSYmKGUubG9va2FoZWFkPWUuc3Ryc3RhcnQtcixlLnN0cnN0YXJ0PXIsT2QoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpKXJldHVybiBfZDtpZihlLnN0cnN0YXJ0LWUuYmxvY2tfc3RhcnQ+PWUud19zaXplLWdkJiYoT2QoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpKXJldHVybiBfZH1yZXR1cm4gZS5pbnNlcnQ9MCx0PT09dGQ/KE9kKGUsITApLDA9PT1lLnN0cm0uYXZhaWxfb3V0P3dkOmtkKTooZS5zdHJzdGFydD5lLmJsb2NrX3N0YXJ0JiYoT2QoZSwhMSksZS5zdHJtLmF2YWlsX291dCksX2QpfSksbmV3IGpkKDQsNCw4LDQsUGQpLG5ldyBqZCg0LDUsMTYsOCxQZCksbmV3IGpkKDQsNiwzMiwzMixQZCksbmV3IGpkKDQsNCwxNiwxNixNZCksbmV3IGpkKDgsMTYsMzIsMzIsTWQpLG5ldyBqZCg4LDE2LDEyOCwxMjgsTWQpLG5ldyBqZCg4LDMyLDEyOCwyNTYsTWQpLG5ldyBqZCgzMiwxMjgsMjU4LDEwMjQsTWQpLG5ldyBqZCgzMiwyNTgsMjU4LDQwOTYsTWQpXTt2YXIgUmQ9e2RlZmxhdGVJbml0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIERkKGUsdCxzZCwxNSw4LDApfSxkZWZsYXRlSW5pdDI6RGQsZGVmbGF0ZVJlc2V0OkJkLGRlZmxhdGVSZXNldEtlZXA6TmQsZGVmbGF0ZVNldEhlYWRlcjpmdW5jdGlvbihlLHQpe3JldHVybiBlJiZlLnN0YXRlPzIhPT1lLnN0YXRlLndyYXA/cmQ6KGUuc3RhdGUuZ3poZWFkPXQsbmQpOnJkfSxkZWZsYXRlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG87aWYoIWV8fCFlLnN0YXRlfHw1PHR8fHQ8MClyZXR1cm4gZT9TZChlLHJkKTpyZDtpZihyPWUuc3RhdGUsIWUub3V0cHV0fHwhZS5pbnB1dCYmMCE9PWUuYXZhaWxfaW58fDY2Nj09PXIuc3RhdHVzJiZ0IT09dGQpcmV0dXJuIFNkKGUsMD09PWUuYXZhaWxfb3V0Py01OnJkKTtpZihyLnN0cm09ZSxuPXIubGFzdF9mbHVzaCxyLmxhc3RfZmx1c2g9dCxyLnN0YXR1cz09PW1kKWlmKDI9PT1yLndyYXApZS5hZGxlcj0wLEVkKHIsMzEpLEVkKHIsMTM5KSxFZChyLDgpLHIuZ3poZWFkPyhFZChyLChyLmd6aGVhZC50ZXh0PzE6MCkrKHIuZ3poZWFkLmhjcmM/MjowKSsoci5nemhlYWQuZXh0cmE/NDowKSsoci5nemhlYWQubmFtZT84OjApKyhyLmd6aGVhZC5jb21tZW50PzE2OjApKSxFZChyLDI1NSZyLmd6aGVhZC50aW1lKSxFZChyLHIuZ3poZWFkLnRpbWU+PjgmMjU1KSxFZChyLHIuZ3poZWFkLnRpbWU+PjE2JjI1NSksRWQocixyLmd6aGVhZC50aW1lPj4yNCYyNTUpLEVkKHIsOT09PXIubGV2ZWw/MjoyPD1yLnN0cmF0ZWd5fHxyLmxldmVsPDI/NDowKSxFZChyLDI1NSZyLmd6aGVhZC5vcyksci5nemhlYWQuZXh0cmEmJnIuZ3poZWFkLmV4dHJhLmxlbmd0aCYmKEVkKHIsMjU1JnIuZ3poZWFkLmV4dHJhLmxlbmd0aCksRWQocixyLmd6aGVhZC5leHRyYS5sZW5ndGg+PjgmMjU1KSksci5nemhlYWQuaGNyYyYmKGUuYWRsZXI9WmwoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZywwKSksci5nemluZGV4PTAsci5zdGF0dXM9NjkpOihFZChyLDApLEVkKHIsMCksRWQociwwKSxFZChyLDApLEVkKHIsMCksRWQociw5PT09ci5sZXZlbD8yOjI8PXIuc3RyYXRlZ3l8fHIubGV2ZWw8Mj80OjApLEVkKHIsMyksci5zdGF0dXM9eWQpO2Vsc2V7dmFyIGE9c2QrKHIud19iaXRzLTg8PDQpPDw4O2F8PSgyPD1yLnN0cmF0ZWd5fHxyLmxldmVsPDI/MDpyLmxldmVsPDY/MTo2PT09ci5sZXZlbD8yOjMpPDw2LDAhPT1yLnN0cnN0YXJ0JiYoYXw9MzIpLGErPTMxLWElMzEsci5zdGF0dXM9eWQsQWQocixhKSwwIT09ci5zdHJzdGFydCYmKEFkKHIsZS5hZGxlcj4+PjE2KSxBZChyLDY1NTM1JmUuYWRsZXIpKSxlLmFkbGVyPTF9aWYoNjk9PT1yLnN0YXR1cylpZihyLmd6aGVhZC5leHRyYSl7Zm9yKGk9ci5wZW5kaW5nO3IuZ3ppbmRleDwoNjU1MzUmci5nemhlYWQuZXh0cmEubGVuZ3RoKSYmKHIucGVuZGluZyE9PXIucGVuZGluZ19idWZfc2l6ZXx8KHIuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5pJiYoZS5hZGxlcj1abChlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLWksaSkpLFRkKGUpLGk9ci5wZW5kaW5nLHIucGVuZGluZyE9PXIucGVuZGluZ19idWZfc2l6ZSkpOylFZChyLDI1NSZyLmd6aGVhZC5leHRyYVtyLmd6aW5kZXhdKSxyLmd6aW5kZXgrKztyLmd6aGVhZC5oY3JjJiZyLnBlbmRpbmc+aSYmKGUuYWRsZXI9WmwoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZy1pLGkpKSxyLmd6aW5kZXg9PT1yLmd6aGVhZC5leHRyYS5sZW5ndGgmJihyLmd6aW5kZXg9MCxyLnN0YXR1cz03Myl9ZWxzZSByLnN0YXR1cz03MztpZig3Mz09PXIuc3RhdHVzKWlmKHIuZ3poZWFkLm5hbWUpe2k9ci5wZW5kaW5nO2Rve2lmKHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSYmKHIuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5pJiYoZS5hZGxlcj1abChlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLWksaSkpLFRkKGUpLGk9ci5wZW5kaW5nLHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSkpe289MTticmVha31FZChyLG89ci5nemluZGV4PHIuZ3poZWFkLm5hbWUubGVuZ3RoPzI1NSZyLmd6aGVhZC5uYW1lLmNoYXJDb2RlQXQoci5nemluZGV4KyspOjApfXdoaWxlKDAhPT1vKTtyLmd6aGVhZC5oY3JjJiZyLnBlbmRpbmc+aSYmKGUuYWRsZXI9WmwoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZy1pLGkpKSwwPT09byYmKHIuZ3ppbmRleD0wLHIuc3RhdHVzPTkxKX1lbHNlIHIuc3RhdHVzPTkxO2lmKDkxPT09ci5zdGF0dXMpaWYoci5nemhlYWQuY29tbWVudCl7aT1yLnBlbmRpbmc7ZG97aWYoci5wZW5kaW5nPT09ci5wZW5kaW5nX2J1Zl9zaXplJiYoci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPmkmJihlLmFkbGVyPVpsKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctaSxpKSksVGQoZSksaT1yLnBlbmRpbmcsci5wZW5kaW5nPT09ci5wZW5kaW5nX2J1Zl9zaXplKSl7bz0xO2JyZWFrfUVkKHIsbz1yLmd6aW5kZXg8ci5nemhlYWQuY29tbWVudC5sZW5ndGg/MjU1JnIuZ3poZWFkLmNvbW1lbnQuY2hhckNvZGVBdChyLmd6aW5kZXgrKyk6MCl9d2hpbGUoMCE9PW8pO3IuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5pJiYoZS5hZGxlcj1abChlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLWksaSkpLDA9PT1vJiYoci5zdGF0dXM9MTAzKX1lbHNlIHIuc3RhdHVzPTEwMztpZigxMDM9PT1yLnN0YXR1cyYmKHIuZ3poZWFkLmhjcmM/KHIucGVuZGluZysyPnIucGVuZGluZ19idWZfc2l6ZSYmVGQoZSksci5wZW5kaW5nKzI8PXIucGVuZGluZ19idWZfc2l6ZSYmKEVkKHIsMjU1JmUuYWRsZXIpLEVkKHIsZS5hZGxlcj4+OCYyNTUpLGUuYWRsZXI9MCxyLnN0YXR1cz15ZCkpOnIuc3RhdHVzPXlkKSwwIT09ci5wZW5kaW5nKXtpZihUZChlKSwwPT09ZS5hdmFpbF9vdXQpcmV0dXJuIHIubGFzdF9mbHVzaD0tMSxuZH1lbHNlIGlmKDA9PT1lLmF2YWlsX2luJiZ4ZCh0KTw9eGQobikmJnQhPT10ZClyZXR1cm4gU2QoZSwtNSk7aWYoNjY2PT09ci5zdGF0dXMmJjAhPT1lLmF2YWlsX2luKXJldHVybiBTZChlLC01KTtpZigwIT09ZS5hdmFpbF9pbnx8MCE9PXIubG9va2FoZWFkfHx0IT09ZWQmJjY2NiE9PXIuc3RhdHVzKXt2YXIgcz0yPT09ci5zdHJhdGVneT9mdW5jdGlvbihlLHQpe2Zvcih2YXIgbjs7KXtpZigwPT09ZS5sb29rYWhlYWQmJigkZChlKSwwPT09ZS5sb29rYWhlYWQpKXtpZih0PT09ZWQpcmV0dXJuIF9kO2JyZWFrfWlmKGUubWF0Y2hfbGVuZ3RoPTAsbj1YbC5fdHJfdGFsbHkoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnRdKSxlLmxvb2thaGVhZC0tLGUuc3Ryc3RhcnQrKyxuJiYoT2QoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpKXJldHVybiBfZH1yZXR1cm4gZS5pbnNlcnQ9MCx0PT09dGQ/KE9kKGUsITApLDA9PT1lLnN0cm0uYXZhaWxfb3V0P3dkOmtkKTplLmxhc3RfbGl0JiYoT2QoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpP19kOmJkfShyLHQpOjM9PT1yLnN0cmF0ZWd5P2Z1bmN0aW9uKGUsdCl7Zm9yKHZhciBuLHIsaSxvLGE9ZS53aW5kb3c7Oyl7aWYoZS5sb29rYWhlYWQ8PXZkKXtpZigkZChlKSxlLmxvb2thaGVhZDw9dmQmJnQ9PT1lZClyZXR1cm4gX2Q7aWYoMD09PWUubG9va2FoZWFkKWJyZWFrfWlmKGUubWF0Y2hfbGVuZ3RoPTAsZS5sb29rYWhlYWQ+PWhkJiYwPGUuc3Ryc3RhcnQmJihyPWFbaT1lLnN0cnN0YXJ0LTFdKT09PWFbKytpXSYmcj09PWFbKytpXSYmcj09PWFbKytpXSl7bz1lLnN0cnN0YXJ0K3ZkO2Rve313aGlsZShyPT09YVsrK2ldJiZyPT09YVsrK2ldJiZyPT09YVsrK2ldJiZyPT09YVsrK2ldJiZyPT09YVsrK2ldJiZyPT09YVsrK2ldJiZyPT09YVsrK2ldJiZyPT09YVsrK2ldJiZpPG8pO2UubWF0Y2hfbGVuZ3RoPXZkLShvLWkpLGUubWF0Y2hfbGVuZ3RoPmUubG9va2FoZWFkJiYoZS5tYXRjaF9sZW5ndGg9ZS5sb29rYWhlYWQpfWlmKGUubWF0Y2hfbGVuZ3RoPj1oZD8obj1YbC5fdHJfdGFsbHkoZSwxLGUubWF0Y2hfbGVuZ3RoLWhkKSxlLmxvb2thaGVhZC09ZS5tYXRjaF9sZW5ndGgsZS5zdHJzdGFydCs9ZS5tYXRjaF9sZW5ndGgsZS5tYXRjaF9sZW5ndGg9MCk6KG49WGwuX3RyX3RhbGx5KGUsMCxlLndpbmRvd1tlLnN0cnN0YXJ0XSksZS5sb29rYWhlYWQtLSxlLnN0cnN0YXJ0KyspLG4mJihPZChlLCExKSwwPT09ZS5zdHJtLmF2YWlsX291dCkpcmV0dXJuIF9kfXJldHVybiBlLmluc2VydD0wLHQ9PT10ZD8oT2QoZSwhMCksMD09PWUuc3RybS5hdmFpbF9vdXQ/d2Q6a2QpOmUubGFzdF9saXQmJihPZChlLCExKSwwPT09ZS5zdHJtLmF2YWlsX291dCk/X2Q6YmR9KHIsdCk6S2xbci5sZXZlbF0uZnVuYyhyLHQpO2lmKHMhPT13ZCYmcyE9PWtkfHwoci5zdGF0dXM9NjY2KSxzPT09X2R8fHM9PT13ZClyZXR1cm4gMD09PWUuYXZhaWxfb3V0JiYoci5sYXN0X2ZsdXNoPS0xKSxuZDtpZihzPT09YmQmJigxPT09dD9YbC5fdHJfYWxpZ24ocik6NSE9PXQmJihYbC5fdHJfc3RvcmVkX2Jsb2NrKHIsMCwwLCExKSwzPT09dCYmKENkKHIuaGVhZCksMD09PXIubG9va2FoZWFkJiYoci5zdHJzdGFydD0wLHIuYmxvY2tfc3RhcnQ9MCxyLmluc2VydD0wKSkpLFRkKGUpLDA9PT1lLmF2YWlsX291dCkpcmV0dXJuIHIubGFzdF9mbHVzaD0tMSxuZH1yZXR1cm4gdCE9PXRkP25kOnIud3JhcDw9MD8xOigyPT09ci53cmFwPyhFZChyLDI1NSZlLmFkbGVyKSxFZChyLGUuYWRsZXI+PjgmMjU1KSxFZChyLGUuYWRsZXI+PjE2JjI1NSksRWQocixlLmFkbGVyPj4yNCYyNTUpLEVkKHIsMjU1JmUudG90YWxfaW4pLEVkKHIsZS50b3RhbF9pbj4+OCYyNTUpLEVkKHIsZS50b3RhbF9pbj4+MTYmMjU1KSxFZChyLGUudG90YWxfaW4+PjI0JjI1NSkpOihBZChyLGUuYWRsZXI+Pj4xNiksQWQociw2NTUzNSZlLmFkbGVyKSksVGQoZSksMDxyLndyYXAmJihyLndyYXA9LXIud3JhcCksMCE9PXIucGVuZGluZz9uZDoxKX0sZGVmbGF0ZUVuZDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gZSYmZS5zdGF0ZT8odD1lLnN0YXRlLnN0YXR1cykhPT1tZCYmNjkhPT10JiY3MyE9PXQmJjkxIT09dCYmMTAzIT09dCYmdCE9PXlkJiY2NjYhPT10P1NkKGUscmQpOihlLnN0YXRlPW51bGwsdD09PXlkP1NkKGUsLTMpOm5kKTpyZH0sZGVmbGF0ZVNldERpY3Rpb25hcnk6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhLHMsYyx1LGw9dC5sZW5ndGg7aWYoIWV8fCFlLnN0YXRlKXJldHVybiByZDtpZigyPT09KG89KG49ZS5zdGF0ZSkud3JhcCl8fDE9PT1vJiZuLnN0YXR1cyE9PW1kfHxuLmxvb2thaGVhZClyZXR1cm4gcmQ7Zm9yKDE9PT1vJiYoZS5hZGxlcj1ZbChlLmFkbGVyLHQsbCwwKSksbi53cmFwPTAsbD49bi53X3NpemUmJigwPT09byYmKENkKG4uaGVhZCksbi5zdHJzdGFydD0wLG4uYmxvY2tfc3RhcnQ9MCxuLmluc2VydD0wKSx1PW5ldyBRdS5CdWY4KG4ud19zaXplKSxRdS5hcnJheVNldCh1LHQsbC1uLndfc2l6ZSxuLndfc2l6ZSwwKSx0PXUsbD1uLndfc2l6ZSksYT1lLmF2YWlsX2luLHM9ZS5uZXh0X2luLGM9ZS5pbnB1dCxlLmF2YWlsX2luPWwsZS5uZXh0X2luPTAsZS5pbnB1dD10LCRkKG4pO24ubG9va2FoZWFkPj1oZDspe2ZvcihyPW4uc3Ryc3RhcnQsaT1uLmxvb2thaGVhZC0oaGQtMSk7bi5pbnNfaD0obi5pbnNfaDw8bi5oYXNoX3NoaWZ0Xm4ud2luZG93W3IraGQtMV0pJm4uaGFzaF9tYXNrLG4ucHJldltyJm4ud19tYXNrXT1uLmhlYWRbbi5pbnNfaF0sbi5oZWFkW24uaW5zX2hdPXIscisrLC0taTspO24uc3Ryc3RhcnQ9cixuLmxvb2thaGVhZD1oZC0xLCRkKG4pfXJldHVybiBuLnN0cnN0YXJ0Kz1uLmxvb2thaGVhZCxuLmJsb2NrX3N0YXJ0PW4uc3Ryc3RhcnQsbi5pbnNlcnQ9bi5sb29rYWhlYWQsbi5sb29rYWhlYWQ9MCxuLm1hdGNoX2xlbmd0aD1uLnByZXZfbGVuZ3RoPWhkLTEsbi5tYXRjaF9hdmFpbGFibGU9MCxlLm5leHRfaW49cyxlLmlucHV0PWMsZS5hdmFpbF9pbj1hLG4ud3JhcD1vLG5kfSxkZWZsYXRlSW5mbzoicGFrbyBkZWZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSJ9LEZkPSEwLHpkPSEwO3RyeXtTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsWzBdKX1jYXRjaChlKXtGZD0hMX10cnl7U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLG5ldyBVaW50OEFycmF5KDEpKX1jYXRjaChlKXt6ZD0hMX1mb3IodmFyIFZkPW5ldyBRdS5CdWY4KDI1NiksVWQ9MDtVZDwyNTY7VWQrKylWZFtVZF09MjUyPD1VZD82OjI0ODw9VWQ/NToyNDA8PVVkPzQ6MjI0PD1VZD8zOjE5Mjw9VWQ/MjoxO1ZkWzI1NF09VmRbMjU0XT0xO2Z1bmN0aW9uIHFkKGUsdCl7aWYodDw2NTUzNCYmKGUuc3ViYXJyYXkmJnpkfHwhZS5zdWJhcnJheSYmRmQpKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsUXUuc2hyaW5rQnVmKGUsdCkpO2Zvcih2YXIgbj0iIixyPTA7cjx0O3IrKyluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbcl0pO3JldHVybiBufXZhciBXZD17c3RyaW5nMmJ1ZjpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGE9ZS5sZW5ndGgscz0wO2ZvcihpPTA7aTxhO2krKyk1NTI5Nj09KDY0NTEyJihuPWUuY2hhckNvZGVBdChpKSkpJiZpKzE8YSYmNTYzMjA9PSg2NDUxMiYocj1lLmNoYXJDb2RlQXQoaSsxKSkpJiYobj02NTUzNisobi01NTI5Njw8MTApKyhyLTU2MzIwKSxpKyspLHMrPW48MTI4PzE6bjwyMDQ4PzI6bjw2NTUzNj8zOjQ7Zm9yKHQ9bmV3IFF1LkJ1ZjgocyksaT1vPTA7bzxzO2krKyk1NTI5Nj09KDY0NTEyJihuPWUuY2hhckNvZGVBdChpKSkpJiZpKzE8YSYmNTYzMjA9PSg2NDUxMiYocj1lLmNoYXJDb2RlQXQoaSsxKSkpJiYobj02NTUzNisobi01NTI5Njw8MTApKyhyLTU2MzIwKSxpKyspLG48MTI4P3RbbysrXT1uOihuPDIwNDg/dFtvKytdPTE5MnxuPj4+Njoobjw2NTUzNj90W28rK109MjI0fG4+Pj4xMjoodFtvKytdPTI0MHxuPj4+MTgsdFtvKytdPTEyOHxuPj4+MTImNjMpLHRbbysrXT0xMjh8bj4+PjYmNjMpLHRbbysrXT0xMjh8NjMmbik7cmV0dXJuIHR9LGJ1ZjJiaW5zdHJpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuIHFkKGUsZS5sZW5ndGgpfSxiaW5zdHJpbmcyYnVmOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1uZXcgUXUuQnVmOChlLmxlbmd0aCksbj0wLHI9dC5sZW5ndGg7bjxyO24rKyl0W25dPWUuY2hhckNvZGVBdChuKTtyZXR1cm4gdH0sYnVmMnN0cmluZzpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGE9dHx8ZS5sZW5ndGgscz1uZXcgQXJyYXkoMiphKTtmb3Iobj1yPTA7bjxhOylpZigoaT1lW24rK10pPDEyOClzW3IrK109aTtlbHNlIGlmKDQ8KG89VmRbaV0pKXNbcisrXT02NTUzMyxuKz1vLTE7ZWxzZXtmb3IoaSY9Mj09PW8/MzE6Mz09PW8/MTU6NzsxPG8mJm48YTspaT1pPDw2fDYzJmVbbisrXSxvLS07MTxvP3NbcisrXT02NTUzMzppPDY1NTM2P3NbcisrXT1pOihpLT02NTUzNixzW3IrK109NTUyOTZ8aT4+MTAmMTAyMyxzW3IrK109NTYzMjB8MTAyMyZpKX1yZXR1cm4gcWQocyxyKX0sdXRmOGJvcmRlcjpmdW5jdGlvbihlLHQpe3ZhciBuO2ZvcigodD10fHxlLmxlbmd0aCk+ZS5sZW5ndGgmJih0PWUubGVuZ3RoKSxuPXQtMTswPD1uJiYxMjg9PSgxOTImZVtuXSk7KW4tLTtyZXR1cm4gbjwwP3Q6MD09PW4/dDpuK1ZkW2Vbbl1dPnQ/bjp0fX07dmFyIEhkPWZ1bmN0aW9uKCl7dGhpcy5pbnB1dD1udWxsLHRoaXMubmV4dF9pbj0wLHRoaXMuYXZhaWxfaW49MCx0aGlzLnRvdGFsX2luPTAsdGhpcy5vdXRwdXQ9bnVsbCx0aGlzLm5leHRfb3V0PTAsdGhpcy5hdmFpbF9vdXQ9MCx0aGlzLnRvdGFsX291dD0wLHRoaXMubXNnPSIiLHRoaXMuc3RhdGU9bnVsbCx0aGlzLmRhdGFfdHlwZT0yLHRoaXMuYWRsZXI9MH0sR2Q9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxYZD0wLFlkPS0xLEpkPTAsS2Q9ODtmdW5jdGlvbiBaZChlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBaZCkpcmV0dXJuIG5ldyBaZChlKTt0aGlzLm9wdGlvbnM9UXUuYXNzaWduKHtsZXZlbDpZZCxtZXRob2Q6S2QsY2h1bmtTaXplOjE2Mzg0LHdpbmRvd0JpdHM6MTUsbWVtTGV2ZWw6OCxzdHJhdGVneTpKZCx0bzoiIn0sZXx8e30pO3ZhciB0PXRoaXMub3B0aW9uczt0LnJhdyYmMDx0LndpbmRvd0JpdHM/dC53aW5kb3dCaXRzPS10LndpbmRvd0JpdHM6dC5nemlwJiYwPHQud2luZG93Qml0cyYmdC53aW5kb3dCaXRzPDE2JiYodC53aW5kb3dCaXRzKz0xNiksdGhpcy5lcnI9MCx0aGlzLm1zZz0iIix0aGlzLmVuZGVkPSExLHRoaXMuY2h1bmtzPVtdLHRoaXMuc3RybT1uZXcgSGQsdGhpcy5zdHJtLmF2YWlsX291dD0wO3ZhciBuPVJkLmRlZmxhdGVJbml0Mih0aGlzLnN0cm0sdC5sZXZlbCx0Lm1ldGhvZCx0LndpbmRvd0JpdHMsdC5tZW1MZXZlbCx0LnN0cmF0ZWd5KTtpZihuIT09WGQpdGhyb3cgbmV3IEVycm9yKFFsW25dKTtpZih0LmhlYWRlciYmUmQuZGVmbGF0ZVNldEhlYWRlcih0aGlzLnN0cm0sdC5oZWFkZXIpLHQuZGljdGlvbmFyeSl7dmFyIHI7aWYocj0ic3RyaW5nIj09dHlwZW9mIHQuZGljdGlvbmFyeT9XZC5zdHJpbmcyYnVmKHQuZGljdGlvbmFyeSk6IltvYmplY3QgQXJyYXlCdWZmZXJdIj09PUdkLmNhbGwodC5kaWN0aW9uYXJ5KT9uZXcgVWludDhBcnJheSh0LmRpY3Rpb25hcnkpOnQuZGljdGlvbmFyeSwobj1SZC5kZWZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0scikpIT09WGQpdGhyb3cgbmV3IEVycm9yKFFsW25dKTt0aGlzLl9kaWN0X3NldD0hMH19ZnVuY3Rpb24gUWQoZSx0KXt2YXIgbj1uZXcgWmQodCk7aWYobi5wdXNoKGUsITApLG4uZXJyKXRocm93IG4ubXNnfHxRbFtuLmVycl07cmV0dXJuIG4ucmVzdWx0fVpkLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPXRoaXMuc3RybSxvPXRoaXMub3B0aW9ucy5jaHVua1NpemU7aWYodGhpcy5lbmRlZClyZXR1cm4hMTtyPXQ9PT1+fnQ/dDohMD09PXQ/NDowLCJzdHJpbmciPT10eXBlb2YgZT9pLmlucHV0PVdkLnN0cmluZzJidWYoZSk6IltvYmplY3QgQXJyYXlCdWZmZXJdIj09PUdkLmNhbGwoZSk/aS5pbnB1dD1uZXcgVWludDhBcnJheShlKTppLmlucHV0PWUsaS5uZXh0X2luPTAsaS5hdmFpbF9pbj1pLmlucHV0Lmxlbmd0aDtkb3tpZigwPT09aS5hdmFpbF9vdXQmJihpLm91dHB1dD1uZXcgUXUuQnVmOChvKSxpLm5leHRfb3V0PTAsaS5hdmFpbF9vdXQ9byksMSE9PShuPVJkLmRlZmxhdGUoaSxyKSkmJm4hPT1YZClyZXR1cm4gdGhpcy5vbkVuZChuKSwhKHRoaXMuZW5kZWQ9ITApOzAhPT1pLmF2YWlsX291dCYmKDAhPT1pLmF2YWlsX2lufHw0IT09ciYmMiE9PXIpfHwoInN0cmluZyI9PT10aGlzLm9wdGlvbnMudG8/dGhpcy5vbkRhdGEoV2QuYnVmMmJpbnN0cmluZyhRdS5zaHJpbmtCdWYoaS5vdXRwdXQsaS5uZXh0X291dCkpKTp0aGlzLm9uRGF0YShRdS5zaHJpbmtCdWYoaS5vdXRwdXQsaS5uZXh0X291dCkpKX13aGlsZSgoMDxpLmF2YWlsX2lufHwwPT09aS5hdmFpbF9vdXQpJiYxIT09bik7cmV0dXJuIDQ9PT1yPyhuPVJkLmRlZmxhdGVFbmQodGhpcy5zdHJtKSx0aGlzLm9uRW5kKG4pLHRoaXMuZW5kZWQ9ITAsbj09PVhkKToyIT09cnx8KHRoaXMub25FbmQoWGQpLCEoaS5hdmFpbF9vdXQ9MCkpfSxaZC5wcm90b3R5cGUub25EYXRhPWZ1bmN0aW9uKGUpe3RoaXMuY2h1bmtzLnB1c2goZSl9LFpkLnByb3RvdHlwZS5vbkVuZD1mdW5jdGlvbihlKXtlPT09WGQmJigic3RyaW5nIj09PXRoaXMub3B0aW9ucy50bz90aGlzLnJlc3VsdD10aGlzLmNodW5rcy5qb2luKCIiKTp0aGlzLnJlc3VsdD1RdS5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKSksdGhpcy5jaHVua3M9W10sdGhpcy5lcnI9ZSx0aGlzLm1zZz10aGlzLnN0cm0ubXNnfTt2YXIgZWY9e0RlZmxhdGU6WmQsZGVmbGF0ZTpRZCxkZWZsYXRlUmF3OmZ1bmN0aW9uKGUsdCl7cmV0dXJuKHQ9dHx8e30pLnJhdz0hMCxRZChlLHQpfSxnemlwOmZ1bmN0aW9uKGUsdCl7cmV0dXJuKHQ9dHx8e30pLmd6aXA9ITAsUWQoZSx0KX19LHRmPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYSxzLGMsdSxsLGQsZixwLGgsdixnLG0seSxfLGIsdyxrLFMseCxDLFQ7bj1lLnN0YXRlLHI9ZS5uZXh0X2luLEM9ZS5pbnB1dCxpPXIrKGUuYXZhaWxfaW4tNSksbz1lLm5leHRfb3V0LFQ9ZS5vdXRwdXQsYT1vLSh0LWUuYXZhaWxfb3V0KSxzPW8rKGUuYXZhaWxfb3V0LTI1NyksYz1uLmRtYXgsdT1uLndzaXplLGw9bi53aGF2ZSxkPW4ud25leHQsZj1uLndpbmRvdyxwPW4uaG9sZCxoPW4uYml0cyx2PW4ubGVuY29kZSxnPW4uZGlzdGNvZGUsbT0oMTw8bi5sZW5iaXRzKS0xLHk9KDE8PG4uZGlzdGJpdHMpLTE7ZTpkb3toPDE1JiYocCs9Q1tyKytdPDxoLGgrPTgscCs9Q1tyKytdPDxoLGgrPTgpLF89dltwJm1dO3Q6Zm9yKDs7KXtpZihwPj4+PWI9Xz4+PjI0LGgtPWIsMD09PShiPV8+Pj4xNiYyNTUpKVRbbysrXT02NTUzNSZfO2Vsc2V7aWYoISgxNiZiKSl7aWYoMD09KDY0JmIpKXtfPXZbKDY1NTM1Jl8pKyhwJigxPDxiKS0xKV07Y29udGludWUgdH1pZigzMiZiKXtuLm1vZGU9MTI7YnJlYWsgZX1lLm1zZz0iaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIixuLm1vZGU9MzA7YnJlYWsgZX13PTY1NTM1Jl8sKGImPTE1KSYmKGg8YiYmKHArPUNbcisrXTw8aCxoKz04KSx3Kz1wJigxPDxiKS0xLHA+Pj49YixoLT1iKSxoPDE1JiYocCs9Q1tyKytdPDxoLGgrPTgscCs9Q1tyKytdPDxoLGgrPTgpLF89Z1twJnldO246Zm9yKDs7KXtpZihwPj4+PWI9Xz4+PjI0LGgtPWIsISgxNiYoYj1fPj4+MTYmMjU1KSkpe2lmKDA9PSg2NCZiKSl7Xz1nWyg2NTUzNSZfKSsocCYoMTw8YiktMSldO2NvbnRpbnVlIG59ZS5tc2c9ImludmFsaWQgZGlzdGFuY2UgY29kZSIsbi5tb2RlPTMwO2JyZWFrIGV9aWYoaz02NTUzNSZfLGg8KGImPTE1KSYmKHArPUNbcisrXTw8aCwoaCs9OCk8YiYmKHArPUNbcisrXTw8aCxoKz04KSksYzwoays9cCYoMTw8YiktMSkpe2UubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsbi5tb2RlPTMwO2JyZWFrIGV9aWYocD4+Pj1iLGgtPWIsKGI9by1hKTxrKXtpZihsPChiPWstYikmJm4uc2FuZSl7ZS5tc2c9ImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIixuLm1vZGU9MzA7YnJlYWsgZX1pZih4PWYsKFM9MCk9PT1kKXtpZihTKz11LWIsYjx3KXtmb3Iody09YjtUW28rK109ZltTKytdLC0tYjspO1M9by1rLHg9VH19ZWxzZSBpZihkPGIpe2lmKFMrPXUrZC1iLChiLT1kKTx3KXtmb3Iody09YjtUW28rK109ZltTKytdLC0tYjspO2lmKFM9MCxkPHcpe2Zvcih3LT1iPWQ7VFtvKytdPWZbUysrXSwtLWI7KTtTPW8tayx4PVR9fX1lbHNlIGlmKFMrPWQtYixiPHcpe2Zvcih3LT1iO1RbbysrXT1mW1MrK10sLS1iOyk7Uz1vLWsseD1UfWZvcig7Mjx3OylUW28rK109eFtTKytdLFRbbysrXT14W1MrK10sVFtvKytdPXhbUysrXSx3LT0zO3cmJihUW28rK109eFtTKytdLDE8dyYmKFRbbysrXT14W1MrK10pKX1lbHNle2ZvcihTPW8taztUW28rK109VFtTKytdLFRbbysrXT1UW1MrK10sVFtvKytdPVRbUysrXSwyPCh3LT0zKTspO3cmJihUW28rK109VFtTKytdLDE8dyYmKFRbbysrXT1UW1MrK10pKX1icmVha319YnJlYWt9fXdoaWxlKHI8aSYmbzxzKTtyLT13PWg+PjMscCY9KDE8PChoLT13PDwzKSktMSxlLm5leHRfaW49cixlLm5leHRfb3V0PW8sZS5hdmFpbF9pbj1yPGk/aS1yKzU6NS0oci1pKSxlLmF2YWlsX291dD1vPHM/cy1vKzI1NzoyNTctKG8tcyksbi5ob2xkPXAsbi5iaXRzPWh9LG5mPVszLDQsNSw2LDcsOCw5LDEwLDExLDEzLDE1LDE3LDE5LDIzLDI3LDMxLDM1LDQzLDUxLDU5LDY3LDgzLDk5LDExNSwxMzEsMTYzLDE5NSwyMjcsMjU4LDAsMF0scmY9WzE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE3LDE3LDE3LDE3LDE4LDE4LDE4LDE4LDE5LDE5LDE5LDE5LDIwLDIwLDIwLDIwLDIxLDIxLDIxLDIxLDE2LDcyLDc4XSxvZj1bMSwyLDMsNCw1LDcsOSwxMywxNywyNSwzMyw0OSw2NSw5NywxMjksMTkzLDI1NywzODUsNTEzLDc2OSwxMDI1LDE1MzcsMjA0OSwzMDczLDQwOTcsNjE0NSw4MTkzLDEyMjg5LDE2Mzg1LDI0NTc3LDAsMF0sYWY9WzE2LDE2LDE2LDE2LDE3LDE3LDE4LDE4LDE5LDE5LDIwLDIwLDIxLDIxLDIyLDIyLDIzLDIzLDI0LDI0LDI1LDI1LDI2LDI2LDI3LDI3LDI4LDI4LDI5LDI5LDY0LDY0XSxzZj1mdW5jdGlvbihlLHQsbixyLGksbyxhLHMpe3ZhciBjLHUsbCxkLGYscCxoLHYsZyxtPXMuYml0cyx5PTAsXz0wLGI9MCx3PTAsaz0wLFM9MCx4PTAsQz0wLFQ9MCxPPTAsRT1udWxsLEE9MCxJPW5ldyBRdS5CdWYxNigxNiksJD1uZXcgUXUuQnVmMTYoMTYpLFA9bnVsbCxNPTA7Zm9yKHk9MDt5PD0xNTt5KyspSVt5XT0wO2ZvcihfPTA7XzxyO18rKylJW3RbbitfXV0rKztmb3Ioaz1tLHc9MTU7MTw9dyYmMD09PUlbd107dy0tKTtpZih3PGsmJihrPXcpLDA9PT13KXJldHVybiBpW28rK109MjA5NzE1MjAsaVtvKytdPTIwOTcxNTIwLHMuYml0cz0xLDA7Zm9yKGI9MTtiPHcmJjA9PT1JW2JdO2IrKyk7Zm9yKGs8YiYmKGs9YikseT1DPTE7eTw9MTU7eSsrKWlmKEM8PD0xLChDLT1JW3ldKTwwKXJldHVybi0xO2lmKDA8QyYmKDA9PT1lfHwxIT09dykpcmV0dXJuLTE7Zm9yKCRbMV09MCx5PTE7eTwxNTt5KyspJFt5KzFdPSRbeV0rSVt5XTtmb3IoXz0wO188cjtfKyspMCE9PXRbbitfXSYmKGFbJFt0W24rX11dKytdPV8pO2lmKDA9PT1lPyhFPVA9YSxwPTE5KToxPT09ZT8oRT1uZixBLT0yNTcsUD1yZixNLT0yNTcscD0yNTYpOihFPW9mLFA9YWYscD0tMSkseT1iLGY9byx4PV89Tz0wLGw9LTEsZD0oVD0xPDwoUz1rKSktMSwxPT09ZSYmODUyPFR8fDI9PT1lJiY1OTI8VClyZXR1cm4gMTtmb3IoOzspe2ZvcihoPXkteCxhW19dPHA/KHY9MCxnPWFbX10pOmFbX10+cD8odj1QW00rYVtfXV0sZz1FW0ErYVtfXV0pOih2PTk2LGc9MCksYz0xPDx5LXgsYj11PTE8PFM7aVtmKyhPPj54KSsodS09YyldPWg8PDI0fHY8PDE2fGd8MCwwIT09dTspO2ZvcihjPTE8PHktMTtPJmM7KWM+Pj0xO2lmKDAhPT1jPyhPJj1jLTEsTys9Yyk6Tz0wLF8rKywwPT0tLUlbeV0pe2lmKHk9PT13KWJyZWFrO3k9dFtuK2FbX11dfWlmKGs8eSYmKE8mZCkhPT1sKXtmb3IoMD09PXgmJih4PWspLGYrPWIsQz0xPDwoUz15LXgpO1MreDx3JiYhKChDLT1JW1MreF0pPD0wKTspUysrLEM8PD0xO2lmKFQrPTE8PFMsMT09PWUmJjg1MjxUfHwyPT09ZSYmNTkyPFQpcmV0dXJuIDE7aVtsPU8mZF09azw8MjR8Uzw8MTZ8Zi1vfDB9fXJldHVybiAwIT09TyYmKGlbZitPXT15LXg8PDI0fDY0PDwxNnwwKSxzLmJpdHM9aywwfSxjZj0xLHVmPTIsbGY9MCxkZj0tMixmZj0xLHBmPTg1MixoZj01OTI7ZnVuY3Rpb24gdmYoZSl7cmV0dXJuKGU+Pj4yNCYyNTUpKyhlPj4+OCY2NTI4MCkrKCg2NTI4MCZlKTw8OCkrKCgyNTUmZSk8PDI0KX1mdW5jdGlvbiBnZigpe3RoaXMubW9kZT0wLHRoaXMubGFzdD0hMSx0aGlzLndyYXA9MCx0aGlzLmhhdmVkaWN0PSExLHRoaXMuZmxhZ3M9MCx0aGlzLmRtYXg9MCx0aGlzLmNoZWNrPTAsdGhpcy50b3RhbD0wLHRoaXMuaGVhZD1udWxsLHRoaXMud2JpdHM9MCx0aGlzLndzaXplPTAsdGhpcy53aGF2ZT0wLHRoaXMud25leHQ9MCx0aGlzLndpbmRvdz1udWxsLHRoaXMuaG9sZD0wLHRoaXMuYml0cz0wLHRoaXMubGVuZ3RoPTAsdGhpcy5vZmZzZXQ9MCx0aGlzLmV4dHJhPTAsdGhpcy5sZW5jb2RlPW51bGwsdGhpcy5kaXN0Y29kZT1udWxsLHRoaXMubGVuYml0cz0wLHRoaXMuZGlzdGJpdHM9MCx0aGlzLm5jb2RlPTAsdGhpcy5ubGVuPTAsdGhpcy5uZGlzdD0wLHRoaXMuaGF2ZT0wLHRoaXMubmV4dD1udWxsLHRoaXMubGVucz1uZXcgUXUuQnVmMTYoMzIwKSx0aGlzLndvcms9bmV3IFF1LkJ1ZjE2KDI4OCksdGhpcy5sZW5keW49bnVsbCx0aGlzLmRpc3RkeW49bnVsbCx0aGlzLnNhbmU9MCx0aGlzLmJhY2s9MCx0aGlzLndhcz0wfWZ1bmN0aW9uIG1mKGUpe3ZhciB0O3JldHVybiBlJiZlLnN0YXRlPyh0PWUuc3RhdGUsZS50b3RhbF9pbj1lLnRvdGFsX291dD10LnRvdGFsPTAsZS5tc2c9IiIsdC53cmFwJiYoZS5hZGxlcj0xJnQud3JhcCksdC5tb2RlPWZmLHQubGFzdD0wLHQuaGF2ZWRpY3Q9MCx0LmRtYXg9MzI3NjgsdC5oZWFkPW51bGwsdC5ob2xkPTAsdC5iaXRzPTAsdC5sZW5jb2RlPXQubGVuZHluPW5ldyBRdS5CdWYzMihwZiksdC5kaXN0Y29kZT10LmRpc3RkeW49bmV3IFF1LkJ1ZjMyKGhmKSx0LnNhbmU9MSx0LmJhY2s9LTEsbGYpOmRmfWZ1bmN0aW9uIHlmKGUpe3ZhciB0O3JldHVybiBlJiZlLnN0YXRlPygodD1lLnN0YXRlKS53c2l6ZT0wLHQud2hhdmU9MCx0LnduZXh0PTAsbWYoZSkpOmRmfWZ1bmN0aW9uIF9mKGUsdCl7dmFyIG4scjtyZXR1cm4gZSYmZS5zdGF0ZT8ocj1lLnN0YXRlLHQ8MD8obj0wLHQ9LXQpOihuPTErKHQ+PjQpLHQ8NDgmJih0Jj0xNSkpLHQmJih0PDh8fDE1PHQpP2RmOihudWxsIT09ci53aW5kb3cmJnIud2JpdHMhPT10JiYoci53aW5kb3c9bnVsbCksci53cmFwPW4sci53Yml0cz10LHlmKGUpKSk6ZGZ9ZnVuY3Rpb24gYmYoZSx0KXt2YXIgbixyO3JldHVybiBlPyhyPW5ldyBnZiwoZS5zdGF0ZT1yKS53aW5kb3c9bnVsbCwobj1fZihlLHQpKSE9PWxmJiYoZS5zdGF0ZT1udWxsKSxuKTpkZn12YXIgd2Ysa2YsU2Y9ITA7ZnVuY3Rpb24geGYoZSl7aWYoU2Ype3ZhciB0O2Zvcih3Zj1uZXcgUXUuQnVmMzIoNTEyKSxrZj1uZXcgUXUuQnVmMzIoMzIpLHQ9MDt0PDE0NDspZS5sZW5zW3QrK109ODtmb3IoO3Q8MjU2OyllLmxlbnNbdCsrXT05O2Zvcig7dDwyODA7KWUubGVuc1t0KytdPTc7Zm9yKDt0PDI4ODspZS5sZW5zW3QrK109ODtmb3Ioc2YoY2YsZS5sZW5zLDAsMjg4LHdmLDAsZS53b3JrLHtiaXRzOjl9KSx0PTA7dDwzMjspZS5sZW5zW3QrK109NTtzZih1ZixlLmxlbnMsMCwzMixrZiwwLGUud29yayx7Yml0czo1fSksU2Y9ITF9ZS5sZW5jb2RlPXdmLGUubGVuYml0cz05LGUuZGlzdGNvZGU9a2YsZS5kaXN0Yml0cz01fWZ1bmN0aW9uIENmKGUsdCxuLHIpe3ZhciBpLG89ZS5zdGF0ZTtyZXR1cm4gbnVsbD09PW8ud2luZG93JiYoby53c2l6ZT0xPDxvLndiaXRzLG8ud25leHQ9MCxvLndoYXZlPTAsby53aW5kb3c9bmV3IFF1LkJ1Zjgoby53c2l6ZSkpLHI+PW8ud3NpemU/KFF1LmFycmF5U2V0KG8ud2luZG93LHQsbi1vLndzaXplLG8ud3NpemUsMCksby53bmV4dD0wLG8ud2hhdmU9by53c2l6ZSk6KHI8KGk9by53c2l6ZS1vLnduZXh0KSYmKGk9ciksUXUuYXJyYXlTZXQoby53aW5kb3csdCxuLXIsaSxvLnduZXh0KSwoci09aSk/KFF1LmFycmF5U2V0KG8ud2luZG93LHQsbi1yLHIsMCksby53bmV4dD1yLG8ud2hhdmU9by53c2l6ZSk6KG8ud25leHQrPWksby53bmV4dD09PW8ud3NpemUmJihvLnduZXh0PTApLG8ud2hhdmU8by53c2l6ZSYmKG8ud2hhdmUrPWkpKSksMH12YXIgVGY9e2luZmxhdGVSZXNldDp5ZixpbmZsYXRlUmVzZXQyOl9mLGluZmxhdGVSZXNldEtlZXA6bWYsaW5mbGF0ZUluaXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGJmKGUsMTUpfSxpbmZsYXRlSW5pdDI6YmYsaW5mbGF0ZTpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscyxjLHUsbCxkLGYscCxoLHYsZyxtLHksXyxiLHcsayxTLHgsQyxUPTAsTz1uZXcgUXUuQnVmOCg0KSxFPVsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1XTtpZighZXx8IWUuc3RhdGV8fCFlLm91dHB1dHx8IWUuaW5wdXQmJjAhPT1lLmF2YWlsX2luKXJldHVybiBkZjsxMj09PShuPWUuc3RhdGUpLm1vZGUmJihuLm1vZGU9MTMpLGE9ZS5uZXh0X291dCxpPWUub3V0cHV0LGM9ZS5hdmFpbF9vdXQsbz1lLm5leHRfaW4scj1lLmlucHV0LHM9ZS5hdmFpbF9pbix1PW4uaG9sZCxsPW4uYml0cyxkPXMsZj1jLFM9bGY7ZTpmb3IoOzspc3dpdGNoKG4ubW9kZSl7Y2FzZSBmZjppZigwPT09bi53cmFwKXtuLm1vZGU9MTM7YnJlYWt9Zm9yKDtsPDE2Oyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYoMiZuLndyYXAmJjM1NjE1PT09dSl7T1tuLmNoZWNrPTBdPTI1NSZ1LE9bMV09dT4+PjgmMjU1LG4uY2hlY2s9Wmwobi5jaGVjayxPLDIsMCksbD11PTAsbi5tb2RlPTI7YnJlYWt9aWYobi5mbGFncz0wLG4uaGVhZCYmKG4uaGVhZC5kb25lPSExKSwhKDEmbi53cmFwKXx8KCgoMjU1JnUpPDw4KSsodT4+OCkpJTMxKXtlLm1zZz0iaW5jb3JyZWN0IGhlYWRlciBjaGVjayIsbi5tb2RlPTMwO2JyZWFrfWlmKDghPSgxNSZ1KSl7ZS5tc2c9InVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIixuLm1vZGU9MzA7YnJlYWt9aWYobC09NCxrPTgrKDE1Jih1Pj4+PTQpKSwwPT09bi53Yml0cyluLndiaXRzPWs7ZWxzZSBpZihrPm4ud2JpdHMpe2UubXNnPSJpbnZhbGlkIHdpbmRvdyBzaXplIixuLm1vZGU9MzA7YnJlYWt9bi5kbWF4PTE8PGssZS5hZGxlcj1uLmNoZWNrPTEsbi5tb2RlPTUxMiZ1PzEwOjEyLGw9dT0wO2JyZWFrO2Nhc2UgMjpmb3IoO2w8MTY7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1pZihuLmZsYWdzPXUsOCE9KDI1NSZuLmZsYWdzKSl7ZS5tc2c9InVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIixuLm1vZGU9MzA7YnJlYWt9aWYoNTczNDQmbi5mbGFncyl7ZS5tc2c9InVua25vd24gaGVhZGVyIGZsYWdzIHNldCIsbi5tb2RlPTMwO2JyZWFrfW4uaGVhZCYmKG4uaGVhZC50ZXh0PXU+PjgmMSksNTEyJm4uZmxhZ3MmJihPWzBdPTI1NSZ1LE9bMV09dT4+PjgmMjU1LG4uY2hlY2s9Wmwobi5jaGVjayxPLDIsMCkpLGw9dT0wLG4ubW9kZT0zO2Nhc2UgMzpmb3IoO2w8MzI7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1uLmhlYWQmJihuLmhlYWQudGltZT11KSw1MTImbi5mbGFncyYmKE9bMF09MjU1JnUsT1sxXT11Pj4+OCYyNTUsT1syXT11Pj4+MTYmMjU1LE9bM109dT4+PjI0JjI1NSxuLmNoZWNrPVpsKG4uY2hlY2ssTyw0LDApKSxsPXU9MCxuLm1vZGU9NDtjYXNlIDQ6Zm9yKDtsPDE2Oyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9bi5oZWFkJiYobi5oZWFkLnhmbGFncz0yNTUmdSxuLmhlYWQub3M9dT4+OCksNTEyJm4uZmxhZ3MmJihPWzBdPTI1NSZ1LE9bMV09dT4+PjgmMjU1LG4uY2hlY2s9Wmwobi5jaGVjayxPLDIsMCkpLGw9dT0wLG4ubW9kZT01O2Nhc2UgNTppZigxMDI0Jm4uZmxhZ3Mpe2Zvcig7bDwxNjspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fW4ubGVuZ3RoPXUsbi5oZWFkJiYobi5oZWFkLmV4dHJhX2xlbj11KSw1MTImbi5mbGFncyYmKE9bMF09MjU1JnUsT1sxXT11Pj4+OCYyNTUsbi5jaGVjaz1abChuLmNoZWNrLE8sMiwwKSksbD11PTB9ZWxzZSBuLmhlYWQmJihuLmhlYWQuZXh0cmE9bnVsbCk7bi5tb2RlPTY7Y2FzZSA2OmlmKDEwMjQmbi5mbGFncyYmKHM8KHA9bi5sZW5ndGgpJiYocD1zKSxwJiYobi5oZWFkJiYoaz1uLmhlYWQuZXh0cmFfbGVuLW4ubGVuZ3RoLG4uaGVhZC5leHRyYXx8KG4uaGVhZC5leHRyYT1uZXcgQXJyYXkobi5oZWFkLmV4dHJhX2xlbikpLFF1LmFycmF5U2V0KG4uaGVhZC5leHRyYSxyLG8scCxrKSksNTEyJm4uZmxhZ3MmJihuLmNoZWNrPVpsKG4uY2hlY2sscixwLG8pKSxzLT1wLG8rPXAsbi5sZW5ndGgtPXApLG4ubGVuZ3RoKSlicmVhayBlO24ubGVuZ3RoPTAsbi5tb2RlPTc7Y2FzZSA3OmlmKDIwNDgmbi5mbGFncyl7aWYoMD09PXMpYnJlYWsgZTtmb3IocD0wO2s9cltvK3ArK10sbi5oZWFkJiZrJiZuLmxlbmd0aDw2NTUzNiYmKG4uaGVhZC5uYW1lKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGspKSxrJiZwPHM7KTtpZig1MTImbi5mbGFncyYmKG4uY2hlY2s9Wmwobi5jaGVjayxyLHAsbykpLHMtPXAsbys9cCxrKWJyZWFrIGV9ZWxzZSBuLmhlYWQmJihuLmhlYWQubmFtZT1udWxsKTtuLmxlbmd0aD0wLG4ubW9kZT04O2Nhc2UgODppZig0MDk2Jm4uZmxhZ3Mpe2lmKDA9PT1zKWJyZWFrIGU7Zm9yKHA9MDtrPXJbbytwKytdLG4uaGVhZCYmayYmbi5sZW5ndGg8NjU1MzYmJihuLmhlYWQuY29tbWVudCs9U3RyaW5nLmZyb21DaGFyQ29kZShrKSksayYmcDxzOyk7aWYoNTEyJm4uZmxhZ3MmJihuLmNoZWNrPVpsKG4uY2hlY2sscixwLG8pKSxzLT1wLG8rPXAsaylicmVhayBlfWVsc2Ugbi5oZWFkJiYobi5oZWFkLmNvbW1lbnQ9bnVsbCk7bi5tb2RlPTk7Y2FzZSA5OmlmKDUxMiZuLmZsYWdzKXtmb3IoO2w8MTY7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1pZih1IT09KDY1NTM1Jm4uY2hlY2spKXtlLm1zZz0iaGVhZGVyIGNyYyBtaXNtYXRjaCIsbi5tb2RlPTMwO2JyZWFrfWw9dT0wfW4uaGVhZCYmKG4uaGVhZC5oY3JjPW4uZmxhZ3M+PjkmMSxuLmhlYWQuZG9uZT0hMCksZS5hZGxlcj1uLmNoZWNrPTAsbi5tb2RlPTEyO2JyZWFrO2Nhc2UgMTA6Zm9yKDtsPDMyOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9ZS5hZGxlcj1uLmNoZWNrPXZmKHUpLGw9dT0wLG4ubW9kZT0xMTtjYXNlIDExOmlmKDA9PT1uLmhhdmVkaWN0KXJldHVybiBlLm5leHRfb3V0PWEsZS5hdmFpbF9vdXQ9YyxlLm5leHRfaW49byxlLmF2YWlsX2luPXMsbi5ob2xkPXUsbi5iaXRzPWwsMjtlLmFkbGVyPW4uY2hlY2s9MSxuLm1vZGU9MTI7Y2FzZSAxMjppZig1PT09dHx8Nj09PXQpYnJlYWsgZTtjYXNlIDEzOmlmKG4ubGFzdCl7dT4+Pj03JmwsbC09NyZsLG4ubW9kZT0yNzticmVha31mb3IoO2w8Mzspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fXN3aXRjaChuLmxhc3Q9MSZ1LGwtPTEsMyYodT4+Pj0xKSl7Y2FzZSAwOm4ubW9kZT0xNDticmVhaztjYXNlIDE6aWYoeGYobiksbi5tb2RlPTIwLDY9PT10KXt1Pj4+PTIsbC09MjticmVhayBlfWJyZWFrO2Nhc2UgMjpuLm1vZGU9MTc7YnJlYWs7Y2FzZSAzOmUubXNnPSJpbnZhbGlkIGJsb2NrIHR5cGUiLG4ubW9kZT0zMH11Pj4+PTIsbC09MjticmVhaztjYXNlIDE0OmZvcih1Pj4+PTcmbCxsLT03Jmw7bDwzMjspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fWlmKCg2NTUzNSZ1KSE9KHU+Pj4xNl42NTUzNSkpe2UubXNnPSJpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzIixuLm1vZGU9MzA7YnJlYWt9aWYobi5sZW5ndGg9NjU1MzUmdSxsPXU9MCxuLm1vZGU9MTUsNj09PXQpYnJlYWsgZTtjYXNlIDE1Om4ubW9kZT0xNjtjYXNlIDE2OmlmKHA9bi5sZW5ndGgpe2lmKHM8cCYmKHA9cyksYzxwJiYocD1jKSwwPT09cClicmVhayBlO1F1LmFycmF5U2V0KGkscixvLHAsYSkscy09cCxvKz1wLGMtPXAsYSs9cCxuLmxlbmd0aC09cDticmVha31uLm1vZGU9MTI7YnJlYWs7Y2FzZSAxNzpmb3IoO2w8MTQ7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1pZihuLm5sZW49MjU3KygzMSZ1KSx1Pj4+PTUsbC09NSxuLm5kaXN0PTErKDMxJnUpLHU+Pj49NSxsLT01LG4ubmNvZGU9NCsoMTUmdSksdT4+Pj00LGwtPTQsMjg2PG4ubmxlbnx8MzA8bi5uZGlzdCl7ZS5tc2c9InRvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzIixuLm1vZGU9MzA7YnJlYWt9bi5oYXZlPTAsbi5tb2RlPTE4O2Nhc2UgMTg6Zm9yKDtuLmhhdmU8bi5uY29kZTspe2Zvcig7bDwzOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9bi5sZW5zW0Vbbi5oYXZlKytdXT03JnUsdT4+Pj0zLGwtPTN9Zm9yKDtuLmhhdmU8MTk7KW4ubGVuc1tFW24uaGF2ZSsrXV09MDtpZihuLmxlbmNvZGU9bi5sZW5keW4sbi5sZW5iaXRzPTcseD17Yml0czpuLmxlbmJpdHN9LFM9c2YoMCxuLmxlbnMsMCwxOSxuLmxlbmNvZGUsMCxuLndvcmsseCksbi5sZW5iaXRzPXguYml0cyxTKXtlLm1zZz0iaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0IixuLm1vZGU9MzA7YnJlYWt9bi5oYXZlPTAsbi5tb2RlPTE5O2Nhc2UgMTk6Zm9yKDtuLmhhdmU8bi5ubGVuK24ubmRpc3Q7KXtmb3IoO209KFQ9bi5sZW5jb2RlW3UmKDE8PG4ubGVuYml0cyktMV0pPj4+MTYmMjU1LHk9NjU1MzUmVCwhKChnPVQ+Pj4yNCk8PWwpOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYoeTwxNil1Pj4+PWcsbC09ZyxuLmxlbnNbbi5oYXZlKytdPXk7ZWxzZXtpZigxNj09PXkpe2ZvcihDPWcrMjtsPEM7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1pZih1Pj4+PWcsbC09ZywwPT09bi5oYXZlKXtlLm1zZz0iaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCIsbi5tb2RlPTMwO2JyZWFrfWs9bi5sZW5zW24uaGF2ZS0xXSxwPTMrKDMmdSksdT4+Pj0yLGwtPTJ9ZWxzZSBpZigxNz09PXkpe2ZvcihDPWcrMztsPEM7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1sLT1nLGs9MCxwPTMrKDcmKHU+Pj49ZykpLHU+Pj49MyxsLT0zfWVsc2V7Zm9yKEM9Zys3O2w8Qzspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fWwtPWcsaz0wLHA9MTErKDEyNyYodT4+Pj1nKSksdT4+Pj03LGwtPTd9aWYobi5oYXZlK3A+bi5ubGVuK24ubmRpc3Qpe2UubXNnPSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IixuLm1vZGU9MzA7YnJlYWt9Zm9yKDtwLS07KW4ubGVuc1tuLmhhdmUrK109a319aWYoMzA9PT1uLm1vZGUpYnJlYWs7aWYoMD09PW4ubGVuc1syNTZdKXtlLm1zZz0iaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrIixuLm1vZGU9MzA7YnJlYWt9aWYobi5sZW5iaXRzPTkseD17Yml0czpuLmxlbmJpdHN9LFM9c2YoY2Ysbi5sZW5zLDAsbi5ubGVuLG4ubGVuY29kZSwwLG4ud29yayx4KSxuLmxlbmJpdHM9eC5iaXRzLFMpe2UubXNnPSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RocyBzZXQiLG4ubW9kZT0zMDticmVha31pZihuLmRpc3RiaXRzPTYsbi5kaXN0Y29kZT1uLmRpc3RkeW4seD17Yml0czpuLmRpc3RiaXRzfSxTPXNmKHVmLG4ubGVucyxuLm5sZW4sbi5uZGlzdCxuLmRpc3Rjb2RlLDAsbi53b3JrLHgpLG4uZGlzdGJpdHM9eC5iaXRzLFMpe2UubXNnPSJpbnZhbGlkIGRpc3RhbmNlcyBzZXQiLG4ubW9kZT0zMDticmVha31pZihuLm1vZGU9MjAsNj09PXQpYnJlYWsgZTtjYXNlIDIwOm4ubW9kZT0yMTtjYXNlIDIxOmlmKDY8PXMmJjI1ODw9Yyl7ZS5uZXh0X291dD1hLGUuYXZhaWxfb3V0PWMsZS5uZXh0X2luPW8sZS5hdmFpbF9pbj1zLG4uaG9sZD11LG4uYml0cz1sLHRmKGUsZiksYT1lLm5leHRfb3V0LGk9ZS5vdXRwdXQsYz1lLmF2YWlsX291dCxvPWUubmV4dF9pbixyPWUuaW5wdXQscz1lLmF2YWlsX2luLHU9bi5ob2xkLGw9bi5iaXRzLDEyPT09bi5tb2RlJiYobi5iYWNrPS0xKTticmVha31mb3Iobi5iYWNrPTA7bT0oVD1uLmxlbmNvZGVbdSYoMTw8bi5sZW5iaXRzKS0xXSk+Pj4xNiYyNTUseT02NTUzNSZULCEoKGc9VD4+PjI0KTw9bCk7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1pZihtJiYwPT0oMjQwJm0pKXtmb3IoXz1nLGI9bSx3PXk7bT0oVD1uLmxlbmNvZGVbdysoKHUmKDE8PF8rYiktMSk+Pl8pXSk+Pj4xNiYyNTUseT02NTUzNSZULCEoXysoZz1UPj4+MjQpPD1sKTspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fXU+Pj49XyxsLT1fLG4uYmFjays9X31pZih1Pj4+PWcsbC09ZyxuLmJhY2srPWcsbi5sZW5ndGg9eSwwPT09bSl7bi5tb2RlPTI2O2JyZWFrfWlmKDMyJm0pe24uYmFjaz0tMSxuLm1vZGU9MTI7YnJlYWt9aWYoNjQmbSl7ZS5tc2c9ImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSIsbi5tb2RlPTMwO2JyZWFrfW4uZXh0cmE9MTUmbSxuLm1vZGU9MjI7Y2FzZSAyMjppZihuLmV4dHJhKXtmb3IoQz1uLmV4dHJhO2w8Qzspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fW4ubGVuZ3RoKz11JigxPDxuLmV4dHJhKS0xLHU+Pj49bi5leHRyYSxsLT1uLmV4dHJhLG4uYmFjays9bi5leHRyYX1uLndhcz1uLmxlbmd0aCxuLm1vZGU9MjM7Y2FzZSAyMzpmb3IoO209KFQ9bi5kaXN0Y29kZVt1JigxPDxuLmRpc3RiaXRzKS0xXSk+Pj4xNiYyNTUseT02NTUzNSZULCEoKGc9VD4+PjI0KTw9bCk7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1pZigwPT0oMjQwJm0pKXtmb3IoXz1nLGI9bSx3PXk7bT0oVD1uLmRpc3Rjb2RlW3crKCh1JigxPDxfK2IpLTEpPj5fKV0pPj4+MTYmMjU1LHk9NjU1MzUmVCwhKF8rKGc9VD4+PjI0KTw9bCk7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH11Pj4+PV8sbC09XyxuLmJhY2srPV99aWYodT4+Pj1nLGwtPWcsbi5iYWNrKz1nLDY0Jm0pe2UubXNnPSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiLG4ubW9kZT0zMDticmVha31uLm9mZnNldD15LG4uZXh0cmE9MTUmbSxuLm1vZGU9MjQ7Y2FzZSAyNDppZihuLmV4dHJhKXtmb3IoQz1uLmV4dHJhO2w8Qzspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fW4ub2Zmc2V0Kz11JigxPDxuLmV4dHJhKS0xLHU+Pj49bi5leHRyYSxsLT1uLmV4dHJhLG4uYmFjays9bi5leHRyYX1pZihuLm9mZnNldD5uLmRtYXgpe2UubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsbi5tb2RlPTMwO2JyZWFrfW4ubW9kZT0yNTtjYXNlIDI1OmlmKDA9PT1jKWJyZWFrIGU7aWYocD1mLWMsbi5vZmZzZXQ+cCl7aWYoKHA9bi5vZmZzZXQtcCk+bi53aGF2ZSYmbi5zYW5lKXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLG4ubW9kZT0zMDticmVha31wPm4ud25leHQ/KHAtPW4ud25leHQsaD1uLndzaXplLXApOmg9bi53bmV4dC1wLHA+bi5sZW5ndGgmJihwPW4ubGVuZ3RoKSx2PW4ud2luZG93fWVsc2Ugdj1pLGg9YS1uLm9mZnNldCxwPW4ubGVuZ3RoO2ZvcihjPHAmJihwPWMpLGMtPXAsbi5sZW5ndGgtPXA7aVthKytdPXZbaCsrXSwtLXA7KTswPT09bi5sZW5ndGgmJihuLm1vZGU9MjEpO2JyZWFrO2Nhc2UgMjY6aWYoMD09PWMpYnJlYWsgZTtpW2ErK109bi5sZW5ndGgsYy0tLG4ubW9kZT0yMTticmVhaztjYXNlIDI3OmlmKG4ud3JhcCl7Zm9yKDtsPDMyOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdXw9cltvKytdPDxsLGwrPTh9aWYoZi09YyxlLnRvdGFsX291dCs9ZixuLnRvdGFsKz1mLGYmJihlLmFkbGVyPW4uY2hlY2s9bi5mbGFncz9abChuLmNoZWNrLGksZixhLWYpOllsKG4uY2hlY2ssaSxmLGEtZikpLGY9Yywobi5mbGFncz91OnZmKHUpKSE9PW4uY2hlY2spe2UubXNnPSJpbmNvcnJlY3QgZGF0YSBjaGVjayIsbi5tb2RlPTMwO2JyZWFrfWw9dT0wfW4ubW9kZT0yODtjYXNlIDI4OmlmKG4ud3JhcCYmbi5mbGFncyl7Zm9yKDtsPDMyOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYodSE9PSg0Mjk0OTY3Mjk1Jm4udG90YWwpKXtlLm1zZz0iaW5jb3JyZWN0IGxlbmd0aCBjaGVjayIsbi5tb2RlPTMwO2JyZWFrfWw9dT0wfW4ubW9kZT0yOTtjYXNlIDI5OlM9MTticmVhayBlO2Nhc2UgMzA6Uz0tMzticmVhayBlO2Nhc2UgMzE6cmV0dXJuLTQ7Y2FzZSAzMjpkZWZhdWx0OnJldHVybiBkZn1yZXR1cm4gZS5uZXh0X291dD1hLGUuYXZhaWxfb3V0PWMsZS5uZXh0X2luPW8sZS5hdmFpbF9pbj1zLG4uaG9sZD11LG4uYml0cz1sLChuLndzaXplfHxmIT09ZS5hdmFpbF9vdXQmJm4ubW9kZTwzMCYmKG4ubW9kZTwyN3x8NCE9PXQpKSYmQ2YoZSxlLm91dHB1dCxlLm5leHRfb3V0LGYtZS5hdmFpbF9vdXQpLGQtPWUuYXZhaWxfaW4sZi09ZS5hdmFpbF9vdXQsZS50b3RhbF9pbis9ZCxlLnRvdGFsX291dCs9ZixuLnRvdGFsKz1mLG4ud3JhcCYmZiYmKGUuYWRsZXI9bi5jaGVjaz1uLmZsYWdzP1psKG4uY2hlY2ssaSxmLGUubmV4dF9vdXQtZik6WWwobi5jaGVjayxpLGYsZS5uZXh0X291dC1mKSksZS5kYXRhX3R5cGU9bi5iaXRzKyhuLmxhc3Q/NjQ6MCkrKDEyPT09bi5tb2RlPzEyODowKSsoMjA9PT1uLm1vZGV8fDE1PT09bi5tb2RlPzI1NjowKSwoMD09PWQmJjA9PT1mfHw0PT09dCkmJlM9PT1sZiYmKFM9LTUpLFN9LGluZmxhdGVFbmQ6ZnVuY3Rpb24oZSl7aWYoIWV8fCFlLnN0YXRlKXJldHVybiBkZjt2YXIgdD1lLnN0YXRlO3JldHVybiB0LndpbmRvdyYmKHQud2luZG93PW51bGwpLGUuc3RhdGU9bnVsbCxsZn0saW5mbGF0ZUdldEhlYWRlcjpmdW5jdGlvbihlLHQpe3ZhciBuO3JldHVybiBlJiZlLnN0YXRlPzA9PSgyJihuPWUuc3RhdGUpLndyYXApP2RmOigobi5oZWFkPXQpLmRvbmU9ITEsbGYpOmRmfSxpbmZsYXRlU2V0RGljdGlvbmFyeTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9dC5sZW5ndGg7cmV0dXJuIGUmJmUuc3RhdGU/MCE9PShuPWUuc3RhdGUpLndyYXAmJjExIT09bi5tb2RlP2RmOjExPT09bi5tb2RlJiZZbCgxLHQsciwwKSE9PW4uY2hlY2s/LTM6Q2YoZSx0LHIscik/KG4ubW9kZT0zMSwtNCk6KG4uaGF2ZWRpY3Q9MSxsZik6ZGZ9LGluZmxhdGVJbmZvOiJwYWtvIGluZmxhdGUgKGZyb20gTm9kZWNhIHByb2plY3QpIn0sT2Y9e1pfTk9fRkxVU0g6MCxaX1BBUlRJQUxfRkxVU0g6MSxaX1NZTkNfRkxVU0g6MixaX0ZVTExfRkxVU0g6MyxaX0ZJTklTSDo0LFpfQkxPQ0s6NSxaX1RSRUVTOjYsWl9PSzowLFpfU1RSRUFNX0VORDoxLFpfTkVFRF9ESUNUOjIsWl9FUlJOTzotMSxaX1NUUkVBTV9FUlJPUjotMixaX0RBVEFfRVJST1I6LTMsWl9CVUZfRVJST1I6LTUsWl9OT19DT01QUkVTU0lPTjowLFpfQkVTVF9TUEVFRDoxLFpfQkVTVF9DT01QUkVTU0lPTjo5LFpfREVGQVVMVF9DT01QUkVTU0lPTjotMSxaX0ZJTFRFUkVEOjEsWl9IVUZGTUFOX09OTFk6MixaX1JMRTozLFpfRklYRUQ6NCxaX0RFRkFVTFRfU1RSQVRFR1k6MCxaX0JJTkFSWTowLFpfVEVYVDoxLFpfVU5LTk9XTjoyLFpfREVGTEFURUQ6OH07dmFyIEVmPWZ1bmN0aW9uKCl7dGhpcy50ZXh0PTAsdGhpcy50aW1lPTAsdGhpcy54ZmxhZ3M9MCx0aGlzLm9zPTAsdGhpcy5leHRyYT1udWxsLHRoaXMuZXh0cmFfbGVuPTAsdGhpcy5uYW1lPSIiLHRoaXMuY29tbWVudD0iIix0aGlzLmhjcmM9MCx0aGlzLmRvbmU9ITF9LEFmPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gSWYoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgSWYpKXJldHVybiBuZXcgSWYoZSk7dGhpcy5vcHRpb25zPVF1LmFzc2lnbih7Y2h1bmtTaXplOjE2Mzg0LHdpbmRvd0JpdHM6MCx0bzoiIn0sZXx8e30pO3ZhciB0PXRoaXMub3B0aW9uczt0LnJhdyYmMDw9dC53aW5kb3dCaXRzJiZ0LndpbmRvd0JpdHM8MTYmJih0LndpbmRvd0JpdHM9LXQud2luZG93Qml0cywwPT09dC53aW5kb3dCaXRzJiYodC53aW5kb3dCaXRzPS0xNSkpLCEoMDw9dC53aW5kb3dCaXRzJiZ0LndpbmRvd0JpdHM8MTYpfHxlJiZlLndpbmRvd0JpdHN8fCh0LndpbmRvd0JpdHMrPTMyKSwxNTx0LndpbmRvd0JpdHMmJnQud2luZG93Qml0czw0OCYmMD09KDE1JnQud2luZG93Qml0cykmJih0LndpbmRvd0JpdHN8PTE1KSx0aGlzLmVycj0wLHRoaXMubXNnPSIiLHRoaXMuZW5kZWQ9ITEsdGhpcy5jaHVua3M9W10sdGhpcy5zdHJtPW5ldyBIZCx0aGlzLnN0cm0uYXZhaWxfb3V0PTA7dmFyIG49VGYuaW5mbGF0ZUluaXQyKHRoaXMuc3RybSx0LndpbmRvd0JpdHMpO2lmKG4hPT1PZi5aX09LKXRocm93IG5ldyBFcnJvcihRbFtuXSk7aWYodGhpcy5oZWFkZXI9bmV3IEVmLFRmLmluZmxhdGVHZXRIZWFkZXIodGhpcy5zdHJtLHRoaXMuaGVhZGVyKSx0LmRpY3Rpb25hcnkmJigic3RyaW5nIj09dHlwZW9mIHQuZGljdGlvbmFyeT90LmRpY3Rpb25hcnk9V2Quc3RyaW5nMmJ1Zih0LmRpY3Rpb25hcnkpOiJbb2JqZWN0IEFycmF5QnVmZmVyXSI9PT1BZi5jYWxsKHQuZGljdGlvbmFyeSkmJih0LmRpY3Rpb25hcnk9bmV3IFVpbnQ4QXJyYXkodC5kaWN0aW9uYXJ5KSksdC5yYXcmJihuPVRmLmluZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSx0LmRpY3Rpb25hcnkpKSE9PU9mLlpfT0spKXRocm93IG5ldyBFcnJvcihRbFtuXSl9ZnVuY3Rpb24gJGYoZSx0KXt2YXIgbj1uZXcgSWYodCk7aWYobi5wdXNoKGUsITApLG4uZXJyKXRocm93IG4ubXNnfHxRbFtuLmVycl07cmV0dXJuIG4ucmVzdWx0fUlmLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYSxzPXRoaXMuc3RybSxjPXRoaXMub3B0aW9ucy5jaHVua1NpemUsdT10aGlzLm9wdGlvbnMuZGljdGlvbmFyeSxsPSExO2lmKHRoaXMuZW5kZWQpcmV0dXJuITE7cj10PT09fn50P3Q6ITA9PT10P09mLlpfRklOSVNIOk9mLlpfTk9fRkxVU0gsInN0cmluZyI9PXR5cGVvZiBlP3MuaW5wdXQ9V2QuYmluc3RyaW5nMmJ1ZihlKToiW29iamVjdCBBcnJheUJ1ZmZlcl0iPT09QWYuY2FsbChlKT9zLmlucHV0PW5ldyBVaW50OEFycmF5KGUpOnMuaW5wdXQ9ZSxzLm5leHRfaW49MCxzLmF2YWlsX2luPXMuaW5wdXQubGVuZ3RoO2Rve2lmKDA9PT1zLmF2YWlsX291dCYmKHMub3V0cHV0PW5ldyBRdS5CdWY4KGMpLHMubmV4dF9vdXQ9MCxzLmF2YWlsX291dD1jKSwobj1UZi5pbmZsYXRlKHMsT2YuWl9OT19GTFVTSCkpPT09T2YuWl9ORUVEX0RJQ1QmJnUmJihuPVRmLmluZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSx1KSksbj09PU9mLlpfQlVGX0VSUk9SJiYhMD09PWwmJihuPU9mLlpfT0ssbD0hMSksbiE9PU9mLlpfU1RSRUFNX0VORCYmbiE9PU9mLlpfT0spcmV0dXJuIHRoaXMub25FbmQobiksISh0aGlzLmVuZGVkPSEwKTtzLm5leHRfb3V0JiYoMCE9PXMuYXZhaWxfb3V0JiZuIT09T2YuWl9TVFJFQU1fRU5EJiYoMCE9PXMuYXZhaWxfaW58fHIhPT1PZi5aX0ZJTklTSCYmciE9PU9mLlpfU1lOQ19GTFVTSCl8fCgic3RyaW5nIj09PXRoaXMub3B0aW9ucy50bz8oaT1XZC51dGY4Ym9yZGVyKHMub3V0cHV0LHMubmV4dF9vdXQpLG89cy5uZXh0X291dC1pLGE9V2QuYnVmMnN0cmluZyhzLm91dHB1dCxpKSxzLm5leHRfb3V0PW8scy5hdmFpbF9vdXQ9Yy1vLG8mJlF1LmFycmF5U2V0KHMub3V0cHV0LHMub3V0cHV0LGksbywwKSx0aGlzLm9uRGF0YShhKSk6dGhpcy5vbkRhdGEoUXUuc2hyaW5rQnVmKHMub3V0cHV0LHMubmV4dF9vdXQpKSkpLDA9PT1zLmF2YWlsX2luJiYwPT09cy5hdmFpbF9vdXQmJihsPSEwKX13aGlsZSgoMDxzLmF2YWlsX2lufHwwPT09cy5hdmFpbF9vdXQpJiZuIT09T2YuWl9TVFJFQU1fRU5EKTtyZXR1cm4gbj09PU9mLlpfU1RSRUFNX0VORCYmKHI9T2YuWl9GSU5JU0gpLHI9PT1PZi5aX0ZJTklTSD8obj1UZi5pbmZsYXRlRW5kKHRoaXMuc3RybSksdGhpcy5vbkVuZChuKSx0aGlzLmVuZGVkPSEwLG49PT1PZi5aX09LKTpyIT09T2YuWl9TWU5DX0ZMVVNIfHwodGhpcy5vbkVuZChPZi5aX09LKSwhKHMuYXZhaWxfb3V0PTApKX0sSWYucHJvdG90eXBlLm9uRGF0YT1mdW5jdGlvbihlKXt0aGlzLmNodW5rcy5wdXNoKGUpfSxJZi5wcm90b3R5cGUub25FbmQ9ZnVuY3Rpb24oZSl7ZT09PU9mLlpfT0smJigic3RyaW5nIj09PXRoaXMub3B0aW9ucy50bz90aGlzLnJlc3VsdD10aGlzLmNodW5rcy5qb2luKCIiKTp0aGlzLnJlc3VsdD1RdS5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKSksdGhpcy5jaHVua3M9W10sdGhpcy5lcnI9ZSx0aGlzLm1zZz10aGlzLnN0cm0ubXNnfTt2YXIgUGY9e0luZmxhdGU6SWYsaW5mbGF0ZTokZixpbmZsYXRlUmF3OmZ1bmN0aW9uKGUsdCl7cmV0dXJuKHQ9dHx8e30pLnJhdz0hMCwkZihlLHQpfSx1bmd6aXA6JGZ9LE1mPXt9OygwLFF1LmFzc2lnbikoTWYsZWYsUGYsT2YpO3ZhciBqZj1NZixMZj1tdSgiY2FudmFzRXZlbnQiKTtmdW5jdGlvbiBOZihlLHQsbixyKXtUdi5wdWJsaXNoSGFuZGxlcih0KyItY2FudmFzLSIrZSx7Y2FudmFzSWQ6ZSx0eXBlOm4sZGF0YTpyfSx0KX1Udi5zdWJzY3JpYmUoIm9uQ2FudmFzTWV0aG9kQ2FsbGJhY2siLGZ1bmN0aW9uKGUpe3ZhciB0PWUuY2FsbGJhY2tJZCxuPWUuZGF0YSxyPUxmLnBvcCh0KTtyJiZyKG4pfSk7dmFyIEJmPXthbGljZWJsdWU6IiNmMGY4ZmYiLGFudGlxdWV3aGl0ZToiI2ZhZWJkNyIsYXF1YToiIzAwZmZmZiIsYXF1YW1hcmluZToiIzdmZmZkNCIsYXp1cmU6IiNmMGZmZmYiLGJlaWdlOiIjZjVmNWRjIixiaXNxdWU6IiNmZmU0YzQiLGJsYWNrOiIjMDAwMDAwIixibGFuY2hlZGFsbW9uZDoiI2ZmZWJjZCIsYmx1ZToiIzAwMDBmZiIsYmx1ZXZpb2xldDoiIzhhMmJlMiIsYnJvd246IiNhNTJhMmEiLGJ1cmx5d29vZDoiI2RlYjg4NyIsY2FkZXRibHVlOiIjNWY5ZWEwIixjaGFydHJldXNlOiIjN2ZmZjAwIixjaG9jb2xhdGU6IiNkMjY5MWUiLGNvcmFsOiIjZmY3ZjUwIixjb3JuZmxvd2VyYmx1ZToiIzY0OTVlZCIsY29ybnNpbGs6IiNmZmY4ZGMiLGNyaW1zb246IiNkYzE0M2MiLGN5YW46IiMwMGZmZmYiLGRhcmtibHVlOiIjMDAwMDhiIixkYXJrY3lhbjoiIzAwOGI4YiIsZGFya2dvbGRlbnJvZDoiI2I4ODYwYiIsZGFya2dyYXk6IiNhOWE5YTkiLGRhcmtncmV5OiIjYTlhOWE5IixkYXJrZ3JlZW46IiMwMDY0MDAiLGRhcmtraGFraToiI2JkYjc2YiIsZGFya21hZ2VudGE6IiM4YjAwOGIiLGRhcmtvbGl2ZWdyZWVuOiIjNTU2YjJmIixkYXJrb3JhbmdlOiIjZmY4YzAwIixkYXJrb3JjaGlkOiIjOTkzMmNjIixkYXJrcmVkOiIjOGIwMDAwIixkYXJrc2FsbW9uOiIjZTk5NjdhIixkYXJrc2VhZ3JlZW46IiM4ZmJjOGYiLGRhcmtzbGF0ZWJsdWU6IiM0ODNkOGIiLGRhcmtzbGF0ZWdyYXk6IiMyZjRmNGYiLGRhcmtzbGF0ZWdyZXk6IiMyZjRmNGYiLGRhcmt0dXJxdW9pc2U6IiMwMGNlZDEiLGRhcmt2aW9sZXQ6IiM5NDAwZDMiLGRlZXBwaW5rOiIjZmYxNDkzIixkZWVwc2t5Ymx1ZToiIzAwYmZmZiIsZGltZ3JheToiIzY5Njk2OSIsZGltZ3JleToiIzY5Njk2OSIsZG9kZ2VyYmx1ZToiIzFlOTBmZiIsZmlyZWJyaWNrOiIjYjIyMjIyIixmbG9yYWx3aGl0ZToiI2ZmZmFmMCIsZm9yZXN0Z3JlZW46IiMyMjhiMjIiLGZ1Y2hzaWE6IiNmZjAwZmYiLGdhaW5zYm9ybzoiI2RjZGNkYyIsZ2hvc3R3aGl0ZToiI2Y4ZjhmZiIsZ29sZDoiI2ZmZDcwMCIsZ29sZGVucm9kOiIjZGFhNTIwIixncmF5OiIjODA4MDgwIixncmV5OiIjODA4MDgwIixncmVlbjoiIzAwODAwMCIsZ3JlZW55ZWxsb3c6IiNhZGZmMmYiLGhvbmV5ZGV3OiIjZjBmZmYwIixob3RwaW5rOiIjZmY2OWI0IixpbmRpYW5yZWQ6IiNjZDVjNWMiLGluZGlnbzoiIzRiMDA4MiIsaXZvcnk6IiNmZmZmZjAiLGtoYWtpOiIjZjBlNjhjIixsYXZlbmRlcjoiI2U2ZTZmYSIsbGF2ZW5kZXJibHVzaDoiI2ZmZjBmNSIsbGF3bmdyZWVuOiIjN2NmYzAwIixsZW1vbmNoaWZmb246IiNmZmZhY2QiLGxpZ2h0Ymx1ZToiI2FkZDhlNiIsbGlnaHRjb3JhbDoiI2YwODA4MCIsbGlnaHRjeWFuOiIjZTBmZmZmIixsaWdodGdvbGRlbnJvZHllbGxvdzoiI2ZhZmFkMiIsbGlnaHRncmF5OiIjZDNkM2QzIixsaWdodGdyZXk6IiNkM2QzZDMiLGxpZ2h0Z3JlZW46IiM5MGVlOTAiLGxpZ2h0cGluazoiI2ZmYjZjMSIsbGlnaHRzYWxtb246IiNmZmEwN2EiLGxpZ2h0c2VhZ3JlZW46IiMyMGIyYWEiLGxpZ2h0c2t5Ymx1ZToiIzg3Y2VmYSIsbGlnaHRzbGF0ZWdyYXk6IiM3Nzg4OTkiLGxpZ2h0c2xhdGVncmV5OiIjNzc4ODk5IixsaWdodHN0ZWVsYmx1ZToiI2IwYzRkZSIsbGlnaHR5ZWxsb3c6IiNmZmZmZTAiLGxpbWU6IiMwMGZmMDAiLGxpbWVncmVlbjoiIzMyY2QzMiIsbGluZW46IiNmYWYwZTYiLG1hZ2VudGE6IiNmZjAwZmYiLG1hcm9vbjoiIzgwMDAwMCIsbWVkaXVtYXF1YW1hcmluZToiIzY2Y2RhYSIsbWVkaXVtYmx1ZToiIzAwMDBjZCIsbWVkaXVtb3JjaGlkOiIjYmE1NWQzIixtZWRpdW1wdXJwbGU6IiM5MzcwZGIiLG1lZGl1bXNlYWdyZWVuOiIjM2NiMzcxIixtZWRpdW1zbGF0ZWJsdWU6IiM3YjY4ZWUiLG1lZGl1bXNwcmluZ2dyZWVuOiIjMDBmYTlhIixtZWRpdW10dXJxdW9pc2U6IiM0OGQxY2MiLG1lZGl1bXZpb2xldHJlZDoiI2M3MTU4NSIsbWlkbmlnaHRibHVlOiIjMTkxOTcwIixtaW50Y3JlYW06IiNmNWZmZmEiLG1pc3R5cm9zZToiI2ZmZTRlMSIsbW9jY2FzaW46IiNmZmU0YjUiLG5hdmFqb3doaXRlOiIjZmZkZWFkIixuYXZ5OiIjMDAwMDgwIixvbGRsYWNlOiIjZmRmNWU2IixvbGl2ZToiIzgwODAwMCIsb2xpdmVkcmFiOiIjNmI4ZTIzIixvcmFuZ2U6IiNmZmE1MDAiLG9yYW5nZXJlZDoiI2ZmNDUwMCIsb3JjaGlkOiIjZGE3MGQ2IixwYWxlZ29sZGVucm9kOiIjZWVlOGFhIixwYWxlZ3JlZW46IiM5OGZiOTgiLHBhbGV0dXJxdW9pc2U6IiNhZmVlZWUiLHBhbGV2aW9sZXRyZWQ6IiNkYjcwOTMiLHBhcGF5YXdoaXA6IiNmZmVmZDUiLHBlYWNocHVmZjoiI2ZmZGFiOSIscGVydToiI2NkODUzZiIscGluazoiI2ZmYzBjYiIscGx1bToiI2RkYTBkZCIscG93ZGVyYmx1ZToiI2IwZTBlNiIscHVycGxlOiIjODAwMDgwIixyZWJlY2NhcHVycGxlOiIjNjYzMzk5IixyZWQ6IiNmZjAwMDAiLHJvc3licm93bjoiI2JjOGY4ZiIscm95YWxibHVlOiIjNDE2OWUxIixzYWRkbGVicm93bjoiIzhiNDUxMyIsc2FsbW9uOiIjZmE4MDcyIixzYW5keWJyb3duOiIjZjRhNDYwIixzZWFncmVlbjoiIzJlOGI1NyIsc2Vhc2hlbGw6IiNmZmY1ZWUiLHNpZW5uYToiI2EwNTIyZCIsc2lsdmVyOiIjYzBjMGMwIixza3libHVlOiIjODdjZWViIixzbGF0ZWJsdWU6IiM2YTVhY2QiLHNsYXRlZ3JheToiIzcwODA5MCIsc2xhdGVncmV5OiIjNzA4MDkwIixzbm93OiIjZmZmYWZhIixzcHJpbmdncmVlbjoiIzAwZmY3ZiIsc3RlZWxibHVlOiIjNDY4MmI0Iix0YW46IiNkMmI0OGMiLHRlYWw6IiMwMDgwODAiLHRoaXN0bGU6IiNkOGJmZDgiLHRvbWF0bzoiI2ZmNjM0NyIsdHVycXVvaXNlOiIjNDBlMGQwIix2aW9sZXQ6IiNlZTgyZWUiLHdoZWF0OiIjZjVkZWIzIix3aGl0ZToiI2ZmZmZmZiIsd2hpdGVzbW9rZToiI2Y1ZjVmNSIseWVsbG93OiIjZmZmZjAwIix5ZWxsb3dncmVlbjoiIzlhY2QzMiIsdHJhbnNwYXJlbnQ6IiMwMDAwMDAwMCJ9O2Z1bmN0aW9uIERmKGUpe3ZhciB0PW51bGw7aWYobnVsbCE9KHQ9L14jKFswLTl8QS1GfGEtZl17Nn0pJC8uZXhlYyhlPWV8fCIjMDAwMDAwIikpKXJldHVybltwYXJzZUludCh0WzFdLnNsaWNlKDAsMiksMTYpLHBhcnNlSW50KHRbMV0uc2xpY2UoMiw0KSwxNikscGFyc2VJbnQodFsxXS5zbGljZSg0KSwxNiksMjU1XTtpZihudWxsIT0odD0vXiMoWzAtOXxBLUZ8YS1mXXszfSkkLy5leGVjKGUpKSl7dmFyIG49dFsxXS5zbGljZSgwLDEpLHI9dFsxXS5zbGljZSgxLDIpLGk9dFsxXS5zbGljZSgyLDMpO3JldHVybltuPXBhcnNlSW50KG4rbiwxNikscj1wYXJzZUludChyK3IsMTYpLGk9cGFyc2VJbnQoaStpLDE2KSwyNTVdfWlmKG51bGwhPSh0PS9ecmdiXCgoLispXCkkLy5leGVjKGUpKSlyZXR1cm4gdFsxXS5zcGxpdCgiLCIpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5taW4oMjU1LHBhcnNlSW50KGUudHJpbSgpKSl9KS5jb25jYXQoMjU1KTtpZihudWxsIT0odD0vXnJnYmFcKCguKylcKSQvLmV4ZWMoZSkpKXJldHVybiB0WzFdLnNwbGl0KCIsIikubWFwKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIDM9PT10P01hdGguZmxvb3IoMjU1KnBhcnNlRmxvYXQoZS50cmltKCkpKTpNYXRoLm1pbigyNTUscGFyc2VJbnQoZS50cmltKCkpKX0pO3ZhciBvPWUudG9Mb3dlckNhc2UoKTtpZihrKEJmLG8pKXt0PS9eIyhbMC05fEEtRnxhLWZdezYsOH0pJC8uZXhlYyhCZltvXSk7dmFyIGE9cGFyc2VJbnQodFsxXS5zbGljZSgwLDIpLDE2KSxzPXBhcnNlSW50KHRbMV0uc2xpY2UoMiw0KSwxNiksYz1wYXJzZUludCh0WzFdLnNsaWNlKDQsNiksMTYpLHU9cGFyc2VJbnQodFsxXS5zbGljZSg2LDgpLDE2KTtyZXR1cm5bYSxzLGMsdT0wPD11P3U6MjU1XX1yZXR1cm4gY29uc29sZS5lcnJvcigidW5zdXBwb3J0ZWQgY29sb3I6IitlKSxbMCwwLDAsMjU1XX1mdW5jdGlvbiBSZihlLHQpe3RoaXMudHlwZT0icGF0dGVybiIsdGhpcy5kYXRhPWUsdGhpcy5jb2xvclN0b3A9dH12YXIgRmY9ZnVuY3Rpb24oZSx0KXt0aGlzLnR5cGU9ZSx0aGlzLmRhdGE9dCx0aGlzLmNvbG9yU3RvcD1bXX07RmYucHJvdG90eXBlLmFkZENvbG9yU3RvcD1mdW5jdGlvbihlLHQpe3RoaXMuY29sb3JTdG9wLnB1c2goW2UsRGYodCldKX07ZnVuY3Rpb24gemYoZSl7dGhpcy53aWR0aD1lfXZhciBWZj1mdW5jdGlvbihlLHQpe3RoaXMuaWQ9ZSx0aGlzLnBhZ2VJZD10LHRoaXMuYWN0aW9ucz1bXSx0aGlzLnBhdGg9W10sdGhpcy5zdWJwYXRoPVtdLHRoaXMuY3VycmVudFRyYW5zZm9ybT1bXSx0aGlzLmN1cnJlbnRTdGVwQW5pbWF0ZXM9W10sdGhpcy5kcmF3aW5nU3RhdGU9W10sdGhpcy5zdGF0ZT17bGluZURhc2g6WzAsMF0sc2hhZG93T2Zmc2V0WDowLHNoYWRvd09mZnNldFk6MCxzaGFkb3dCbHVyOjAsc2hhZG93Q29sb3I6WzAsMCwwLDBdLGZvbnQ6IjEwcHggc2Fucy1zZXJpZiIsZm9udFNpemU6MTAsZm9udFdlaWdodDoibm9ybWFsIixmb250U3R5bGU6Im5vcm1hbCIsZm9udEZhbWlseToic2Fucy1zZXJpZiJ9fSxVZj17bGluZURhc2hPZmZzZXQ6e2NvbmZpZ3VyYWJsZTohMH0sZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uOntjb25maWd1cmFibGU6ITB9LHNoYWRvd0JsdXI6e2NvbmZpZ3VyYWJsZTohMH0sc2hhZG93Q29sb3I6e2NvbmZpZ3VyYWJsZTohMH0sc2hhZG93T2Zmc2V0WDp7Y29uZmlndXJhYmxlOiEwfSxzaGFkb3dPZmZzZXRZOntjb25maWd1cmFibGU6ITB9LGZvbnQ6e2NvbmZpZ3VyYWJsZTohMH0sZmlsbFN0eWxlOntjb25maWd1cmFibGU6ITB9LHN0cm9rZVN0eWxlOntjb25maWd1cmFibGU6ITB9LGdsb2JhbEFscGhhOntjb25maWd1cmFibGU6ITB9LHRleHRBbGlnbjp7Y29uZmlndXJhYmxlOiEwfSxsaW5lQ2FwOntjb25maWd1cmFibGU6ITB9LGxpbmVKb2luOntjb25maWd1cmFibGU6ITB9LGxpbmVXaWR0aDp7Y29uZmlndXJhYmxlOiEwfSxtaXRlckxpbWl0Ontjb25maWd1cmFibGU6ITB9LHRleHRCYXNlbGluZTp7Y29uZmlndXJhYmxlOiEwfX07VmYucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT0hMSk7dmFyIG4scj1bXS5jb25jYXQodGhpcy5hY3Rpb25zKTt0aGlzLmFjdGlvbnM9W10sdGhpcy5wYXRoPVtdLCJmdW5jdGlvbiI9PXR5cGVvZiB0JiYobj1MZi5wdXNoKHQpKSxOZih0aGlzLmlkLHRoaXMucGFnZUlkLCJhY3Rpb25zQ2hhbmdlZCIse2FjdGlvbnM6cixyZXNlcnZlOmUsY2FsbGJhY2tJZDpufSl9LFZmLnByb3RvdHlwZS5jcmVhdGVMaW5lYXJHcmFkaWVudD1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbmV3IEZmKCJsaW5lYXIiLFtlLHQsbixyXSl9LFZmLnByb3RvdHlwZS5jcmVhdGVDaXJjdWxhckdyYWRpZW50PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbmV3IEZmKCJyYWRpYWwiLFtlLHQsbl0pfSxWZi5wcm90b3R5cGUuY3JlYXRlUGF0dGVybj1mdW5jdGlvbihlLHQpe2lmKHZvaWQgMD09PXQpY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIGV4ZWN1dGUgJ2NyZWF0ZVBhdHRlcm4nIG9uICdDYW52YXNDb250ZXh0JzogMiBhcmd1bWVudHMgcmVxdWlyZWQsIGJ1dCBvbmx5IDEgcHJlc2VudC4iKTtlbHNle2lmKCEoWyJyZXBlYXQiLCJyZXBlYXQteCIsInJlcGVhdC15Iiwibm8tcmVwZWF0Il0uaW5kZXhPZih0KTwwKSlyZXR1cm4gbmV3IFJmKGUsdCk7Y29uc29sZS5lcnJvcigiRmFpbGVkIHRvIGV4ZWN1dGUgJ2NyZWF0ZVBhdHRlcm4nIG9uICdDYW52YXNDb250ZXh0JzogVGhlIHByb3ZpZGVkIHR5cGUgKCciK3QrIicpIGlzIG5vdCBvbmUgb2YgJ3JlcGVhdCcsICduby1yZXBlYXQnLCAncmVwZWF0LXgnLCBvciAncmVwZWF0LXknLiIpfX0sVmYucHJvdG90eXBlLm1lYXN1cmVUZXh0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc3RhdGUuZm9udCxuPTAscj1Ddi53ZWJ2aWV3LmFsbCgpLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0VVJMKCkuZW5kc1dpdGgoInd3dy9fX3VuaWFwcHZpZXcuaHRtbCIpfSk7cmV0dXJuIHImJihuPU51bWJlcihyLmV2YWxKU1N5bmMoIigiK2Z1bmN0aW9uKGUsdCl7dmFyIG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIikuZ2V0Q29udGV4dCgiMmQiKTtyZXR1cm4gbi5mb250PXQsbi5tZWFzdXJlVGV4dChlKS53aWR0aHx8MH0udG9TdHJpbmcoKSsiKSgiK0pTT04uc3RyaW5naWZ5KGUpKyIsIitKU09OLnN0cmluZ2lmeSh0KSsiKSIpKSksbmV3IHpmKG4pfSxWZi5wcm90b3R5cGUuc2F2ZT1mdW5jdGlvbigpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNhdmUiLGRhdGE6W119KSx0aGlzLmRyYXdpbmdTdGF0ZS5wdXNoKHRoaXMuc3RhdGUpfSxWZi5wcm90b3R5cGUucmVzdG9yZT1mdW5jdGlvbigpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InJlc3RvcmUiLGRhdGE6W119KSx0aGlzLnN0YXRlPXRoaXMuZHJhd2luZ1N0YXRlLnBvcCgpfHx7bGluZURhc2g6WzAsMF0sc2hhZG93T2Zmc2V0WDowLHNoYWRvd09mZnNldFk6MCxzaGFkb3dCbHVyOjAsc2hhZG93Q29sb3I6WzAsMCwwLDBdLGZvbnQ6IjEwcHggc2Fucy1zZXJpZiIsZm9udFNpemU6MTAsZm9udFdlaWdodDoibm9ybWFsIixmb250U3R5bGU6Im5vcm1hbCIsZm9udEZhbWlseToic2Fucy1zZXJpZiJ9fSxWZi5wcm90b3R5cGUuYmVnaW5QYXRoPWZ1bmN0aW9uKCl7dGhpcy5wYXRoPVtdLHRoaXMuc3VicGF0aD1bXSx0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJiZWdpblBhdGgiLGRhdGE6W119KX0sVmYucHJvdG90eXBlLm1vdmVUbz1mdW5jdGlvbihlLHQpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6Im1vdmVUbyIsZGF0YTpbZSx0XX0pLHRoaXMuc3VicGF0aD1bW2UsdF1dfSxWZi5wcm90b3R5cGUubGluZVRvPWZ1bmN0aW9uKGUsdCl7MD09PXRoaXMucGF0aC5sZW5ndGgmJjA9PT10aGlzLnN1YnBhdGgubGVuZ3RoP3RoaXMucGF0aC5wdXNoKHttZXRob2Q6Im1vdmVUbyIsZGF0YTpbZSx0XX0pOnRoaXMucGF0aC5wdXNoKHttZXRob2Q6ImxpbmVUbyIsZGF0YTpbZSx0XX0pLHRoaXMuc3VicGF0aC5wdXNoKFtlLHRdKX0sVmYucHJvdG90eXBlLnF1YWRyYXRpY0N1cnZlVG89ZnVuY3Rpb24oZSx0LG4scil7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoicXVhZHJhdGljQ3VydmVUbyIsZGF0YTpbZSx0LG4scl19KSx0aGlzLnN1YnBhdGgucHVzaChbbixyXSl9LFZmLnByb3RvdHlwZS5iZXppZXJDdXJ2ZVRvPWZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJiZXppZXJDdXJ2ZVRvIixkYXRhOltlLHQsbixyLGksb119KSx0aGlzLnN1YnBhdGgucHVzaChbaSxvXSl9LFZmLnByb3RvdHlwZS5hcmM9ZnVuY3Rpb24oZSx0LG4scixpLG8pe3ZvaWQgMD09PW8mJihvPSExKSx0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJhcmMiLGRhdGE6W2UsdCxuLHIsaSxvXX0pLHRoaXMuc3VicGF0aC5wdXNoKFtlLHRdKX0sVmYucHJvdG90eXBlLnJlY3Q9ZnVuY3Rpb24oZSx0LG4scil7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoicmVjdCIsZGF0YTpbZSx0LG4scl19KSx0aGlzLnN1YnBhdGg9W1tlLHRdXX0sVmYucHJvdG90eXBlLmFyY1RvPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoiYXJjVG8iLGRhdGE6W2UsdCxuLHIsaV19KSx0aGlzLnN1YnBhdGgucHVzaChbbixyXSl9LFZmLnByb3RvdHlwZS5jbGlwPWZ1bmN0aW9uKCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoiY2xpcCIsZGF0YTpbXS5jb25jYXQodGhpcy5wYXRoKX0pfSxWZi5wcm90b3R5cGUuY2xvc2VQYXRoPWZ1bmN0aW9uKCl7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoiY2xvc2VQYXRoIixkYXRhOltdfSksdGhpcy5zdWJwYXRoLmxlbmd0aCYmKHRoaXMuc3VicGF0aD1bdGhpcy5zdWJwYXRoLnNoaWZ0KCldKX0sVmYucHJvdG90eXBlLmNsZWFyQWN0aW9ucz1mdW5jdGlvbigpe3RoaXMuYWN0aW9ucz1bXSx0aGlzLnBhdGg9W10sdGhpcy5zdWJwYXRoPVtdfSxWZi5wcm90b3R5cGUuZ2V0QWN0aW9ucz1mdW5jdGlvbigpe3ZhciBlPVtdLmNvbmNhdCh0aGlzLmFjdGlvbnMpO3JldHVybiB0aGlzLmNsZWFyQWN0aW9ucygpLGV9LFVmLmxpbmVEYXNoT2Zmc2V0LnNldD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRMaW5lRGFzaE9mZnNldCIsZGF0YTpbZV19KX0sVWYuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uLnNldD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRHbG9iYWxDb21wb3NpdGVPcGVyYXRpb24iLGRhdGE6W2VdfSl9LFVmLnNoYWRvd0JsdXIuc2V0PWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldFNoYWRvd0JsdXIiLGRhdGE6W2VdfSl9LFVmLnNoYWRvd0NvbG9yLnNldD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRTaGFkb3dDb2xvciIsZGF0YTpbZV19KX0sVWYuc2hhZG93T2Zmc2V0WC5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0U2hhZG93T2Zmc2V0WCIsZGF0YTpbZV19KX0sVWYuc2hhZG93T2Zmc2V0WS5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0U2hhZG93T2Zmc2V0WSIsZGF0YTpbZV19KX0sVWYuZm9udC5zZXQ9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcyx0PSh0aGlzLnN0YXRlLmZvbnQ9ZSkubWF0Y2goL14oKFtcd1wtXStccykqKShcZCtyP3B4KShcLyhcZCtcLj9cZCoocj9weCk/KSk/XHMrKC4qKS8pO2lmKHQpe3ZhciByPXRbMV0udHJpbSgpLnNwbGl0KC9ccy8pLGk9cGFyc2VGbG9hdCh0WzNdKSxvPXRbN10sYT1bXTtyLmZvckVhY2goZnVuY3Rpb24oZSx0KXstMTxbIml0YWxpYyIsIm9ibGlxdWUiLCJub3JtYWwiXS5pbmRleE9mKGUpPyhhLnB1c2goe21ldGhvZDoic2V0Rm9udFN0eWxlIixkYXRhOltlXX0pLG4uc3RhdGUuZm9udFN0eWxlPWUpOi0xPFsiYm9sZCIsIm5vcm1hbCJdLmluZGV4T2YoZSk/KGEucHVzaCh7bWV0aG9kOiJzZXRGb250V2VpZ2h0IixkYXRhOltlXX0pLG4uc3RhdGUuZm9udFdlaWdodD1lKTowPT09dD8oYS5wdXNoKHttZXRob2Q6InNldEZvbnRTdHlsZSIsZGF0YTpbIm5vcm1hbCJdfSksbi5zdGF0ZS5mb250U3R5bGU9Im5vcm1hbCIpOjE9PT10JiZzKCl9KSwxPT09ci5sZW5ndGgmJnMoKSxyPWEubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLmRhdGFbMF19KS5qb2luKCIgIiksdGhpcy5zdGF0ZS5mb250U2l6ZT1pLHRoaXMuc3RhdGUuZm9udEZhbWlseT1vLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldEZvbnQiLGRhdGE6W3IrIiAiK2krInB4ICIrb119KX1lbHNlIGNvbnNvbGUud2FybigiRmFpbGVkIHRvIHNldCAnZm9udCcgb24gJ0NhbnZhc0NvbnRleHQnOiBpbnZhbGlkIGZvcm1hdC4iKTtmdW5jdGlvbiBzKCl7YS5wdXNoKHttZXRob2Q6InNldEZvbnRXZWlnaHQiLGRhdGE6WyJub3JtYWwiXX0pLG4uc3RhdGUuZm9udFdlaWdodD0ibm9ybWFsIn19LFVmLmZvbnQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdGUuZm9udH0sVWYuZmlsbFN0eWxlLnNldD1mdW5jdGlvbihlKXt0aGlzLnNldEZpbGxTdHlsZShlKX0sVWYuc3Ryb2tlU3R5bGUuc2V0PWZ1bmN0aW9uKGUpe3RoaXMuc2V0U3Ryb2tlU3R5bGUoZSl9LFVmLmdsb2JhbEFscGhhLnNldD1mdW5jdGlvbihlKXtlPU1hdGguZmxvb3IoMjU1KnBhcnNlRmxvYXQoZSkpLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldEdsb2JhbEFscGhhIixkYXRhOltlXX0pfSxVZi50ZXh0QWxpZ24uc2V0PWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldFRleHRBbGlnbiIsZGF0YTpbZV19KX0sVWYubGluZUNhcC5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0TGluZUNhcCIsZGF0YTpbZV19KX0sVWYubGluZUpvaW4uc2V0PWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldExpbmVKb2luIixkYXRhOltlXX0pfSxVZi5saW5lV2lkdGguc2V0PWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldExpbmVXaWR0aCIsZGF0YTpbZV19KX0sVWYubWl0ZXJMaW1pdC5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0TWl0ZXJMaW1pdCIsZGF0YTpbZV19KX0sVWYudGV4dEJhc2VsaW5lLnNldD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRUZXh0QmFzZWxpbmUiLGRhdGE6W2VdfSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFZmLnByb3RvdHlwZSxVZiksWyJzY2FsZSIsInJvdGF0ZSIsInRyYW5zbGF0ZSIsInNldFRyYW5zZm9ybSIsInRyYW5zZm9ybSJdLmNvbmNhdChbImRyYXdJbWFnZSIsImZpbGxUZXh0IiwiZmlsbCIsInN0cm9rZSIsImZpbGxSZWN0Iiwic3Ryb2tlUmVjdCIsImNsZWFyUmVjdCIsInN0cm9rZVRleHQiXSkuZm9yRWFjaChmdW5jdGlvbihlKXtWZi5wcm90b3R5cGVbZV09ZnVuY3Rpb24oZCl7c3dpdGNoKGQpe2Nhc2UiZmlsbCI6Y2FzZSJzdHJva2UiOnJldHVybiBmdW5jdGlvbigpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6ZCsiUGF0aCIsZGF0YTpbXS5jb25jYXQodGhpcy5wYXRoKX0pfTtjYXNlImZpbGxSZWN0IjpyZXR1cm4gZnVuY3Rpb24oZSx0LG4scil7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoiZmlsbFBhdGgiLGRhdGE6W3ttZXRob2Q6InJlY3QiLGRhdGE6W2UsdCxuLHJdfV19KX07Y2FzZSJzdHJva2VSZWN0IjpyZXR1cm4gZnVuY3Rpb24oZSx0LG4scil7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic3Ryb2tlUGF0aCIsZGF0YTpbe21ldGhvZDoicmVjdCIsZGF0YTpbZSx0LG4scl19XX0pfTtjYXNlImZpbGxUZXh0IjpjYXNlInN0cm9rZVRleHQiOnJldHVybiBmdW5jdGlvbihlLHQsbixyKXt2YXIgaT1bZS50b1N0cmluZygpLHQsbl07Im51bWJlciI9PXR5cGVvZiByJiZpLnB1c2gociksdGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpkLGRhdGE6aX0pfTtjYXNlImRyYXdJbWFnZSI6cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIsaSxvLGEscyxjKXt2YXIgdTtmdW5jdGlvbiBsKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZX12b2lkIDA9PT1jJiYobz10LGE9bixzPXIsYz1pLGk9cj1uPXQ9dm9pZCAwKSx1PWwodCkmJmwobikmJmwocikmJmwoaSk/W2UsbyxhLHMsYyx0LG4scixpXTpsKHMpJiZsKGMpP1tlLG8sYSxzLGNdOltlLG8sYV0sdGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpkLGRhdGE6dX0pfTtkZWZhdWx0OnJldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOmQsZGF0YTplfSl9fX0oZSl9KSxbInNldEZpbGxTdHlsZSIsInNldFRleHRBbGlnbiIsInNldFN0cm9rZVN0eWxlIiwic2V0R2xvYmFsQWxwaGEiLCJzZXRTaGFkb3ciLCJzZXRGb250U2l6ZSIsInNldExpbmVDYXAiLCJzZXRMaW5lSm9pbiIsInNldExpbmVXaWR0aCIsInNldE1pdGVyTGltaXQiLCJzZXRUZXh0QmFzZWxpbmUiLCJzZXRMaW5lRGFzaCJdLmZvckVhY2goZnVuY3Rpb24oZSl7VmYucHJvdG90eXBlW2VdPWZ1bmN0aW9uKGkpe3N3aXRjaChpKXtjYXNlInNldEZpbGxTdHlsZSI6Y2FzZSJzZXRTdHJva2VTdHlsZSI6cmV0dXJuIGZ1bmN0aW9uKGUpeyJvYmplY3QiIT10eXBlb2YgZT90aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOmksZGF0YTpbIm5vcm1hbCIsRGYoZSldfSk6dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDppLGRhdGE6W2UudHlwZSxlLmRhdGEsZS5jb2xvclN0b3BdfSl9O2Nhc2Uic2V0R2xvYmFsQWxwaGEiOnJldHVybiBmdW5jdGlvbihlKXtlPU1hdGguZmxvb3IoMjU1KnBhcnNlRmxvYXQoZSkpLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6aSxkYXRhOltlXX0pfTtjYXNlInNldFNoYWRvdyI6cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIpe3I9RGYociksdGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDppLGRhdGE6W2UsdCxuLHJdfSksdGhpcy5zdGF0ZS5zaGFkb3dCbHVyPW4sdGhpcy5zdGF0ZS5zaGFkb3dDb2xvcj1yLHRoaXMuc3RhdGUuc2hhZG93T2Zmc2V0WD1lLHRoaXMuc3RhdGUuc2hhZG93T2Zmc2V0WT10fTtjYXNlInNldExpbmVEYXNoIjpyZXR1cm4gZnVuY3Rpb24oZSx0KXtlPWV8fFswLDBdLHQ9dHx8MCx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOmksZGF0YTpbZSx0XX0pLHRoaXMuc3RhdGUubGluZURhc2g9ZX07Y2FzZSJzZXRGb250U2l6ZSI6cmV0dXJuIGZ1bmN0aW9uKGUpe3RoaXMuc3RhdGUuZm9udD10aGlzLnN0YXRlLmZvbnQucmVwbGFjZSgvXGQrXC4/XGQqcHgvLGUrInB4IiksdGhpcy5zdGF0ZS5mb250U2l6ZT1lLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6aSxkYXRhOltlXX0pfTtkZWZhdWx0OnJldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOmksZGF0YTplfSl9fX0oZSl9KTt2YXIgcWY9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQ2FudmFzQ29udGV4dDpWZixjcmVhdGVDYW52YXNDb250ZXh0OmZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4gbmV3IFZmKGUsdC4kcGFnZS5pZCk7dmFyIG49V3UoKTtpZihuKXJldHVybiBuZXcgVmYoZSxuKTtUdi5lbWl0KCJvbkVycm9yIiwiY3JlYXRlQ2FudmFzQ29udGV4dDpmYWlsIil9LGNhbnZhc0dldEltYWdlRGF0YTpmdW5jdGlvbihlLG4pe3ZhciB0PWUuY2FudmFzSWQscj1lLngsaT1lLnksbz1lLndpZHRoLGE9ZS5oZWlnaHQscz1XdSgpO3M/TmYodCxzLCJnZXRJbWFnZURhdGEiLHt4OnIseTppLHdpZHRoOm8saGVpZ2h0OmEsY2FsbGJhY2tJZDpMZi5wdXNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0YTt0JiZ0Lmxlbmd0aCYmKGUuY29tcHJlc3NlZCYmKHQ9amYuaW5mbGF0ZVJhdyh0KSxkZWxldGUgZS5jb21wcmVzc2VkKSxlLmRhdGE9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHQpKSxvaShuLGUpfSl9KTpvaShuLHtlcnJNc2c6ImNhbnZhc0dldEltYWdlRGF0YTpmYWlsIn0pfSxjYW52YXNQdXRJbWFnZURhdGE6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNhbnZhc0lkLHI9ZS5kYXRhLGk9ZS54LG89ZS55LGE9ZS53aWR0aCxzPWUuaGVpZ2h0LGM9V3UoKTtpZihjKXt2YXIgdSxsPUxmLnB1c2goZnVuY3Rpb24oZSl7b2kodCxlKX0pOyJpT1MiIT09Q3Yub3MubmFtZXx8ImJvb2xlYW4iPT10eXBlb2YgX19XRUVYX0RFVlRPT0xfXz8ocj1qZi5kZWZsYXRlUmF3KHIse3RvOiJzdHJpbmcifSksdT0hMCk6cj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChyKSxOZihuLGMsInB1dEltYWdlRGF0YSIse2RhdGE6cix4OmkseTpvLHdpZHRoOmEsaGVpZ2h0OnMsY29tcHJlc3NlZDp1LGNhbGxiYWNrSWQ6bH0pfWVsc2Ugb2kodCx7ZXJyTXNnOiJjYW52YXNQdXRJbWFnZURhdGE6ZmFpbCJ9KX0sY2FudmFzVG9UZW1wRmlsZVBhdGg6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLng7dm9pZCAwPT09biYmKG49MCk7dmFyIHI9ZS55O3ZvaWQgMD09PXImJihyPTApO3ZhciBpPWUud2lkdGgsbz1lLmhlaWdodCxhPWUuZGVzdFdpZHRoLHM9ZS5kZXN0SGVpZ2h0LGM9ZS5jYW52YXNJZCx1PWUuZmlsZVR5cGUsbD1lLnF1YWxpdHksZD1XdSgpO2lmKGQpe3ZhciBmPUxmLnB1c2goZnVuY3Rpb24oZSl7b2kodCxlKX0pO05mKGMsZCwidG9UZW1wRmlsZVBhdGgiLHt4Om4seTpyLHdpZHRoOmksaGVpZ2h0Om8sZGVzdFdpZHRoOmEsZGVzdEhlaWdodDpzLGZpbGVUeXBlOnUscXVhbGl0eTpsLGRpcm5hbWU6bG8rIi9jYW52YXMiLGNhbGxiYWNrSWQ6Zn0pfWVsc2Ugb2kodCx7ZXJyTXNnOiJjYW52YXNUb1RlbXBGaWxlUGF0aDpmYWlsIn0pfX0pO2Z1bmN0aW9uIFdmKGUsdCxuLHIpe1Z1KCJvcGVyYXRlTWFwUGxheWVyIixlLHQsbixyKX1Udi5zdWJzY3JpYmUoIm9uTWFwTWV0aG9kQ2FsbGJhY2siLGZ1bmN0aW9uKGUpe3ZhciB0PWUuY2FsbGJhY2tJZCxuPWUuZGF0YTtBLmludm9rZSh0LG4pfSk7dmFyIEhmPWZ1bmN0aW9uKGUsdCl7dGhpcy5pZD1lLHRoaXMucGFnZVZtPXR9O0hmLnByb3RvdHlwZS5vbj1mdW5jdGlvbihlLHQpe1dmKHRoaXMuaWQsdGhpcy5wYWdlVm0sIm9uIix7bmFtZTplLGNhbGxiYWNrOnR9KX0sSGYucHJvdG90eXBlLiRnZXRBcHBNYXA9ZnVuY3Rpb24oKXtyZXR1cm4gQ3YubWFwcy5nZXRNYXBCeUlkKHRoaXMucGFnZVZtLiRwYWdlLmlkKyItbWFwLSIrdGhpcy5pZCl9LFsiZ2V0Q2VudGVyTG9jYXRpb24iLCJtb3ZlVG9Mb2NhdGlvbiIsImdldFNjYWxlIiwiZ2V0UmVnaW9uIiwiaW5jbHVkZVBvaW50cyIsInRyYW5zbGF0ZU1hcmtlciIsImFkZEN1c3RvbUxheWVyIiwicmVtb3ZlQ3VzdG9tTGF5ZXIiLCJhZGRHcm91bmRPdmVybGF5IiwicmVtb3ZlR3JvdW5kT3ZlcmxheSIsInVwZGF0ZUdyb3VuZE92ZXJsYXkiLCJpbml0TWFya2VyQ2x1c3RlciIsImFkZE1hcmtlcnMiLCJyZW1vdmVNYXJrZXJzIiwibW92ZUFsb25nIiwib3Blbk1hcEFwcCJdLmZvckVhY2goZnVuY3Rpb24obil7SGYucHJvdG90eXBlW25dPUEud2FycChmdW5jdGlvbihlLHQpe2UuY2FsbGJhY2tJZD10LFdmKHRoaXMuaWQsdGhpcy5wYWdlVm0sbixlKX0pfSk7dmFyIEdmPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLE1hcENvbnRleHQ6SGYsY3JlYXRlTWFwQ29udGV4dDpmdW5jdGlvbihlLHQpe3JldHVybiBuZXcgSGYoZSx0fHxxdSgiY3JlYXRlTWFwQ29udGV4dCIpKX19KSxYZj1bLjUsLjgsMSwxLjI1LDEuNSwyXTtmdW5jdGlvbiBZZihlLHQsbixyKXtWdSgib3BlcmF0ZVZpZGVvUGxheWVyIixlLHQsbixyKX12YXIgSmY9ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWUsdGhpcy5wYWdlVm09dH07SmYucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXtZZih0aGlzLmlkLHRoaXMucGFnZVZtLCJwbGF5Iil9LEpmLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe1lmKHRoaXMuaWQsdGhpcy5wYWdlVm0sInBhdXNlIil9LEpmLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKCl7WWYodGhpcy5pZCx0aGlzLnBhZ2VWbSwic3RvcCIpfSxKZi5wcm90b3R5cGUuc2Vlaz1mdW5jdGlvbihlKXtZZih0aGlzLmlkLHRoaXMucGFnZVZtLCJzZWVrIix7cG9zaXRpb246ZX0pfSxKZi5wcm90b3R5cGUuc2VuZERhbm11PWZ1bmN0aW9uKGUpe1lmKHRoaXMuaWQsdGhpcy5wYWdlVm0sInNlbmREYW5tdSIsZSl9LEpmLnByb3RvdHlwZS5wbGF5YmFja1JhdGU9ZnVuY3Rpb24oZSl7flhmLmluZGV4T2YoZSl8fChlPTEpLFlmKHRoaXMuaWQsdGhpcy5wYWdlVm0sInBsYXliYWNrUmF0ZSIse3JhdGU6ZX0pfSxKZi5wcm90b3R5cGUucmVxdWVzdEZ1bGxTY3JlZW49ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pLFlmKHRoaXMuaWQsdGhpcy5wYWdlVm0sInJlcXVlc3RGdWxsU2NyZWVuIixlKX0sSmYucHJvdG90eXBlLmV4aXRGdWxsU2NyZWVuPWZ1bmN0aW9uKCl7WWYodGhpcy5pZCx0aGlzLnBhZ2VWbSwiZXhpdEZ1bGxTY3JlZW4iKX0sSmYucHJvdG90eXBlLnNob3dTdGF0dXNCYXI9ZnVuY3Rpb24oKXtZZih0aGlzLmlkLHRoaXMucGFnZVZtLCJzaG93U3RhdHVzQmFyIil9LEpmLnByb3RvdHlwZS5oaWRlU3RhdHVzQmFyPWZ1bmN0aW9uKCl7WWYodGhpcy5pZCx0aGlzLnBhZ2VWbSwiaGlkZVN0YXR1c0JhciIpfTt2YXIgS2Y9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsVmlkZW9Db250ZXh0OkpmLGNyZWF0ZVZpZGVvQ29udGV4dDpmdW5jdGlvbihlLHQpe3JldHVybiBuZXcgSmYoZSx0fHxxdSgiY3JlYXRlVmlkZW9Db250ZXh0IikpfX0pO2Z1bmN0aW9uIFpmKGUsdCxuLHIpe1R2LnB1Ymxpc2hIYW5kbGVyKHQrIi1lZGl0b3ItIitlLHtjb21wb25lbnRJZDplLHR5cGU6bixkYXRhOnJ9LHQpfVR2LnN1YnNjcmliZSgib25FZGl0b3JNZXRob2RDYWxsYmFjayIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jYWxsYmFja0lkLG49ZS5kYXRhO0EuaW52b2tlKHQsbil9KTt2YXIgUWY9ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWUsdGhpcy5wYWdlSWQ9dH07UWYucHJvdG90eXBlLmZvcm1hdD1mdW5jdGlvbihlLHQpe1pmKHRoaXMuaWQsdGhpcy5wYWdlSWQsImZvcm1hdCIse29wdGlvbnM6e25hbWU6ZSx2YWx1ZTp0fX0pfSxbImluc2VydERpdmlkZXIiLCJpbnNlcnRJbWFnZSIsImluc2VydFRleHQiLCJzZXRDb250ZW50cyIsImdldENvbnRlbnRzIiwiY2xlYXIiLCJyZW1vdmVGb3JtYXQiLCJ1bmRvIiwicmVkbyIsImJsdXIiLCJnZXRTZWxlY3Rpb25UZXh0Iiwic2Nyb2xsSW50b1ZpZXciXS5mb3JFYWNoKGZ1bmN0aW9uKG4pe1FmLnByb3RvdHlwZVtuXT1BLndhcnAoZnVuY3Rpb24oZSx0KXtaZih0aGlzLmlkLHRoaXMucGFnZUlkLG4se29wdGlvbnM6ZSxjYWxsYmFja0lkOnR9KX0pfSk7dmFyIGVwPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLEVkaXRvckNvbnRleHQ6UWZ9KSx0cD1bImNhbnBsYXkiLCJwbGF5IiwicGF1c2UiLCJzdG9wIiwiZW5kZWQiLCJ0aW1lVXBkYXRlIiwiZXJyb3IiLCJ3YWl0aW5nIiwic2Vla2luZyIsInNlZWtlZCJdLG5wPVt7bmFtZToic3JjIixjYWNoZTohMH0se25hbWU6InN0YXJ0VGltZSIsZGVmYXVsdDowLGNhY2hlOiEwfSx7bmFtZToiYXV0b3BsYXkiLGRlZmF1bHQ6ITEsY2FjaGU6ITB9LHtuYW1lOiJsb29wIixkZWZhdWx0OiExLGNhY2hlOiEwfSx7bmFtZToib2JleU11dGVTd2l0Y2giLGRlZmF1bHQ6ITAscmVhZG9ubHk6ITAsY2FjaGU6ITB9LHtuYW1lOiJkdXJhdGlvbiIscmVhZG9ubHk6ITB9LHtuYW1lOiJjdXJyZW50VGltZSIscmVhZG9ubHk6ITB9LHtuYW1lOiJwYXVzZWQiLHJlYWRvbmx5OiEwfSx7bmFtZToiYnVmZmVyZWQiLHJlYWRvbmx5OiEwfSx7bmFtZToidm9sdW1lIn0se25hbWU6InNlc3Npb25DYXRlZ29yeSJ9LHtuYW1lOiJwbGF5YmFja1JhdGUiLGNhY2hlOiEwfV0scnA9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0aGlzLmlkPWUsdGhpcy5fY2FsbGJhY2tzPXt9LHRoaXMuX29wdGlvbnM9e30sdHAuZm9yRWFjaChmdW5jdGlvbihlKXt0Ll9jYWxsYmFja3NbZS50b0xvd2VyQ2FzZSgpXT1bXX0pLG5wLmZvckVhY2goZnVuY3Rpb24obil7dmFyIHI9bi5uYW1lLGU9e2dldDpmdW5jdGlvbigpe3ZhciBlPW4uY2FjaGU/dGhpcy5fb3B0aW9uczpWdSgiZ2V0QXVkaW9TdGF0ZSIse2F1ZGlvSWQ6dGhpcy5pZH0pLHQ9ciBpbiBlP2Vbcl06bi5kZWZhdWx0O3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmInZvbHVtZSIhPT1yP3QvMWUzOnR9fTtuLnJlYWRvbmx5fHwoZS5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5fb3B0aW9uc1tyXT1lLFZ1KCJzZXRBdWRpb1N0YXRlIixPYmplY3QuYXNzaWduKHt9LHRoaXMuX29wdGlvbnMse2F1ZGlvSWQ6dGhpcy5pZH0pKX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIsZSl9KX07ZnVuY3Rpb24gaXAoZSx0LG4scil7ZS5fY2FsbGJhY2tzW3RdLmZvckVhY2goZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUoImVycm9yIj09PXQ/e2Vyck1zZzpuLGVyckNvZGU6cn06e30pfSl9cnAucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLl9vcGVyYXRlKCJwbGF5Iil9LHJwLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMuX29wZXJhdGUoInBhdXNlIil9LHJwLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKCl7dGhpcy5fb3BlcmF0ZSgic3RvcCIpfSxycC5wcm90b3R5cGUuc2Vlaz1mdW5jdGlvbihlKXt0aGlzLl9vcGVyYXRlKCJzZWVrIix7Y3VycmVudFRpbWU6MWUzKmV9KX0scnAucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtJdih0aGlzLl9fdGltaW5nKSxWdSgiZGVzdHJveUF1ZGlvSW5zdGFuY2UiLHthdWRpb0lkOnRoaXMuaWR9KSxkZWxldGUgb3BbdGhpcy5pZF19LHJwLnByb3RvdHlwZS5fb3BlcmF0ZT1mdW5jdGlvbihlLHQpe1Z1KCJvcGVyYXRlQXVkaW8iLE9iamVjdC5hc3NpZ24oe30sdCx7YXVkaW9JZDp0aGlzLmlkLG9wZXJhdGlvblR5cGU6ZX0pKX0sdHAuZm9yRWFjaChmdW5jdGlvbihyKXt2YXIgZT1yWzBdLnRvVXBwZXJDYXNlKCkrci5zdWJzdHIoMSk7cj1yLnRvTG93ZXJDYXNlKCkscnAucHJvdG90eXBlWyJvbiIrZV09ZnVuY3Rpb24oZSl7dGhpcy5fY2FsbGJhY2tzW3JdLnB1c2goZSl9LHJwLnByb3RvdHlwZVsib2ZmIitlXT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9jYWxsYmFja3Nbcl0sbj10LmluZGV4T2YoZSk7MDw9biYmdC5zcGxpY2UobiwxKX19KSxVdSgib25BdWRpb1N0YXRlQ2hhbmdlIixmdW5jdGlvbihlKXt2YXIgdD1lLnN0YXRlLG49ZS5hdWRpb0lkLHI9ZS5lcnJNc2csaT1lLmVyckNvZGUsbz1vcFtuXTtpZihvKWlmKGlwKG8sdCxyLGkpLCJwbGF5Ij09PXQpe3ZhciBhPW8uY3VycmVudFRpbWU7by5fX3RpbWluZz1BdihmdW5jdGlvbigpe28uY3VycmVudFRpbWUhPT1hJiZpcChvLCJ0aW1ldXBkYXRlIil9LDIwMCl9ZWxzZSJwYXVzZSIhPT10JiYic3RvcCIhPT10JiYiZXJyb3IiIT09dHx8SXYoby5fX3RpbWluZyl9KTt2YXIgb3A9T2JqZWN0LmNyZWF0ZShudWxsKTt2YXIgYXA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY3JlYXRlSW5uZXJBdWRpb0NvbnRleHQ6ZnVuY3Rpb24oKXt2YXIgZT1WdSgiY3JlYXRlQXVkaW9JbnN0YW5jZSIpLmF1ZGlvSWQsdD1uZXcgcnAoZSk7cmV0dXJuIG9wW2VdPXR9fSksc3A9W107VXUoIm9uTmV0d29ya1N0YXR1c0NoYW5nZSIsZnVuY3Rpb24odCl7c3AuZm9yRWFjaChmdW5jdGlvbihlKXtvaShlLHQpfSl9KTt2YXIgY3A9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsb25OZXR3b3JrU3RhdHVzQ2hhbmdlOmZ1bmN0aW9uKGUpe3NwLnB1c2goZSl9LG9mZk5ldHdvcmtTdGF0dXNDaGFuZ2U6ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9c3AuaW5kZXhPZihlKTswPD10JiZzcC5zcGxpY2UodCwxKX19fSksdXA9W107VXUoIm9uVGhlbWVDaGFuZ2UiLGZ1bmN0aW9uKHQpe3VwLmZvckVhY2goZnVuY3Rpb24oZSl7b2koZSx0KX0pfSksVXUoIm9uVUlTdHlsZUNoYW5nZSIsZnVuY3Rpb24odCl7dXAuZm9yRWFjaChmdW5jdGlvbihlKXtvaShlLHQpfSl9KTt2YXIgbHA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsb25UaGVtZUNoYW5nZTpmdW5jdGlvbihlKXt1cC5wdXNoKGUpfSxvblVJU3R5bGVDaGFuZ2U6ZnVuY3Rpb24oZSl7dXAucHVzaChlKSxjb25zb2xlLndhcm4oJ1RoZSAidW5pLm9uVUlTdHlsZUNoYW5nZSIgQVBJIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgInVuaS5vblRoZW1lQ2hhbmdlIi4gTGVhcm4gbW9yZTogaHR0cHM6Ly91bmlhcHAuZGNsb3VkLm5ldC5jbi9hcGkvc3lzdGVtL3RoZW1lLicpfX0pLGRwPW11KCJnZXRTZWxlY3RlZFRleHRSYW5nZUV2ZW50Iik7VHYuc3Vic2NyaWJlKCJvbkdldFNlbGVjdGVkVGV4dFJhbmdlIixmdW5jdGlvbihlKXt2YXIgdD1lLmNhbGxiYWNrSWQsbj1lLmRhdGE7Y29uc29sZS5sb2coIm9uR2V0U2VsZWN0ZWRUZXh0UmFuZ2UiKTt2YXIgcj1kcC5wb3AodCk7ciYmcihuKX0pO3ZhciBmcCxwcD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxnZXRTZWxlY3RlZFRleHRSYW5nZTpmdW5jdGlvbihlLHQpe3ZhciBuPVd1KCk7VHYucHVibGlzaEhhbmRsZXIoImdldFNlbGVjdGVkVGV4dFJhbmdlIix7cGFnZUlkOm4sY2FsbGJhY2tJZDpkcC5wdXNoKGZ1bmN0aW9uKGUpe29pKHQsZSl9KX0sbil9fSk7VXUoIm9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLGZ1bmN0aW9uKGUpe2ZwJiZvaShmcCxlKX0pO3ZhciBocD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvbktleWJvYXJkSGVpZ2h0Q2hhbmdlOmZ1bmN0aW9uKGUpe3ZhciB0O3Q9ZnAsVHYucmVtb3ZlQ2FsbGJhY2tIYW5kbGVyKHQpLGZwPWV9LG9mZktleWJvYXJkSGVpZ2h0Q2hhbmdlOmZ1bmN0aW9uKCl7ZnA9bnVsbH19KSx2cD0ibG9uZ1ByZXNzQWN0aW9uc0NhbGxiYWNrIixncD17fTtVdSh2cCxmdW5jdGlvbihlKXt2YXIgdD1lLmVyck1zZ3x8IiI7bmV3IFJlZ0V4cCgiXFw6XFxzKmZhaWwiKS50ZXN0KHQpP2dwLmZhaWwmJmdwLmZhaWwoZSk6Z3Auc3VjY2VzcyYmZ3Auc3VjY2VzcyhlKSxncC5jb21wbGV0ZSYmZ3AuY29tcGxldGUoZSl9KTt2YXIgbXAseXA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwscHJldmlld0ltYWdlOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT17fSksKChncD1lLmxvbmdQcmVzc0FjdGlvbnN8fHt9KS5zdWNjZXNzfHxncC5mYWlsfHxncC5jb21wbGV0ZSkmJihncC5jYWxsYmFja0lkPXZwKSxWdSgicHJldmlld0ltYWdlUGx1cyIsZSl9LGNsb3NlUHJldmlld0ltYWdlOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT17fSksVnUoImNsb3NlUHJldmlld0ltYWdlUGx1cyIsZSl9fSksX3A9e3BhdXNlOm51bGwscmVzdW1lOm51bGwsc3RhcnQ6bnVsbCxzdG9wOm51bGwsZXJyb3I6bnVsbH0sYnA9ZnVuY3Rpb24oKXtVdSgib25SZWNvcmRlclN0YXRlQ2hhbmdlIixmdW5jdGlvbihlKXt2YXIgdD1lLnN0YXRlO2RlbGV0ZSBlLnN0YXRlLGRlbGV0ZSBlLmVyck1zZywiZnVuY3Rpb24iPT10eXBlb2YgX3BbdF0mJl9wW3RdKGUpfSl9O2JwLnByb3RvdHlwZS5vbkVycm9yPWZ1bmN0aW9uKGUpe19wLmVycm9yPWV9LGJwLnByb3RvdHlwZS5vbkZyYW1lUmVjb3JkZWQ9ZnVuY3Rpb24oZSl7fSxicC5wcm90b3R5cGUub25JbnRlcnJ1cHRpb25CZWdpbj1mdW5jdGlvbihlKXt9LGJwLnByb3RvdHlwZS5vbkludGVycnVwdGlvbkVuZD1mdW5jdGlvbihlKXt9LGJwLnByb3RvdHlwZS5vblBhdXNlPWZ1bmN0aW9uKGUpe19wLnBhdXNlPWV9LGJwLnByb3RvdHlwZS5vblJlc3VtZT1mdW5jdGlvbihlKXtfcC5yZXN1bWU9ZX0sYnAucHJvdG90eXBlLm9uU3RhcnQ9ZnVuY3Rpb24oZSl7X3Auc3RhcnQ9ZX0sYnAucHJvdG90eXBlLm9uU3RvcD1mdW5jdGlvbihlKXtfcC5zdG9wPWV9LGJwLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe1Z1KCJvcGVyYXRlUmVjb3JkZXIiLHtvcGVyYXRpb25UeXBlOiJwYXVzZSJ9KX0sYnAucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe1Z1KCJvcGVyYXRlUmVjb3JkZXIiLHtvcGVyYXRpb25UeXBlOiJyZXN1bWUifSl9LGJwLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbihlKXtWdSgib3BlcmF0ZVJlY29yZGVyIixPYmplY3QuYXNzaWduKHt9LGUse29wZXJhdGlvblR5cGU6InN0YXJ0In0pKX0sYnAucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oKXtWdSgib3BlcmF0ZVJlY29yZGVyIix7b3BlcmF0aW9uVHlwZToic3RvcCJ9KX07dmFyIHdwPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldFJlY29yZGVyTWFuYWdlcjpmdW5jdGlvbigpe3JldHVybiBtcHx8KG1wPW5ldyBicCl9fSksa3A9ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWUsdGhpcy5fY2FsbGJhY2tJZD10LHRoaXMuX2NhbGxiYWNrcz1bXX07a3AucHJvdG90eXBlLmFib3J0PWZ1bmN0aW9uKCl7VnUoIm9wZXJhdGVEb3dubG9hZFRhc2siLHtkb3dubG9hZFRhc2tJZDp0aGlzLmlkLG9wZXJhdGlvblR5cGU6ImFib3J0In0pfSxrcC5wcm90b3R5cGUub25Qcm9ncmVzc1VwZGF0ZT1mdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmdGhpcy5fY2FsbGJhY2tzLnB1c2goZSl9LGtwLnByb3RvdHlwZS5vbkhlYWRlcnNSZWNlaXZlZD1mdW5jdGlvbigpe30sa3AucHJvdG90eXBlLm9mZlByb2dyZXNzVXBkYXRlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2NhbGxiYWNrcy5pbmRleE9mKGUpOzA8PXQmJnRoaXMuX2NhbGxiYWNrcy5zcGxpY2UodCwxKX0sa3AucHJvdG90eXBlLm9mZkhlYWRlcnNSZWNlaXZlZD1mdW5jdGlvbigpe307dmFyIFNwPU9iamVjdC5jcmVhdGUobnVsbCk7VXUoIm9uRG93bmxvYWRUYXNrU3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUuZG93bmxvYWRUYXNrSWQsbj1lLnN0YXRlLHI9ZS50ZW1wRmlsZVBhdGgsaT1lLnN0YXR1c0NvZGUsbz1lLnByb2dyZXNzLGE9ZS50b3RhbEJ5dGVzV3JpdHRlbixzPWUudG90YWxCeXRlc0V4cGVjdGVkVG9Xcml0ZSxjPWUuZXJyTXNnLHU9U3BbdF0sbD11Ll9jYWxsYmFja0lkO3N3aXRjaChuKXtjYXNlInByb2dyZXNzVXBkYXRlIjp1Ll9jYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbihlKXtlKHtwcm9ncmVzczpvLHRvdGFsQnl0ZXNXcml0dGVuOmEsdG90YWxCeXRlc0V4cGVjdGVkVG9Xcml0ZTpzfSl9KTticmVhaztjYXNlInN1Y2Nlc3MiOm9pKGwse3RlbXBGaWxlUGF0aDpyLHN0YXR1c0NvZGU6aSxlcnJNc2c6InJlcXVlc3Q6b2sifSk7Y2FzZSJmYWlsIjpvaShsLHtlcnJNc2c6InJlcXVlc3Q6ZmFpbCAiK2N9KTtkZWZhdWx0Ok92KGZ1bmN0aW9uKCl7ZGVsZXRlIFNwW3RdfSwxMDApfX0pO3ZhciB4cD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxkb3dubG9hZEZpbGU6ZnVuY3Rpb24oZSx0KXt2YXIgbj1WdSgiY3JlYXRlRG93bmxvYWRUYXNrIixlKS5kb3dubG9hZFRhc2tJZCxyPW5ldyBrcChuLHQpO3JldHVybiBTcFtuXT1yfX0pLENwPU9iamVjdC5jcmVhdGUobnVsbCk7VXUoIm9uUmVxdWVzdFRhc2tTdGF0ZUNoYW5nZSIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXF1ZXN0VGFza0lkLG49ZS5zdGF0ZSxyPWUuZGF0YSxpPWUuc3RhdHVzQ29kZSxvPWUuaGVhZGVyLGE9ZS5lcnJNc2cscz1lLmNvb2tpZXMsYz1DcFt0XXx8e30sdT1jLmFyZ3MsbD1jLmNhbGxiYWNrSWQ7aWYobClzd2l0Y2goZGVsZXRlIENwW3RdLG4pe2Nhc2Uic3VjY2VzcyI6b2kobCxmdW5jdGlvbihyLGUpe2lmKCJzdHJpbmciPT10eXBlb2Ygci5kYXRhJiY2NTI3OT09PXIuZGF0YS5jaGFyQ29kZUF0KDApJiYoci5kYXRhPXIuZGF0YS5zdWJzdHIoMSkpLHIuc3RhdHVzQ29kZT1wYXJzZUludChyLnN0YXR1c0NvZGUsMTApLFQoci5oZWFkZXIpJiYoci5oZWFkZXI9T2JqZWN0LmtleXMoci5oZWFkZXIpLnJlZHVjZShmdW5jdGlvbihlLHQpe3ZhciBuPXIuaGVhZGVyW3RdO3JldHVybiBBcnJheS5pc0FycmF5KG4pP2VbdF09bi5qb2luKCIsIik6InN0cmluZyI9PXR5cGVvZiBuJiYoZVt0XT1uKSxlfSx7fSkpLGUuZGF0YVR5cGUmJiJqc29uIj09PWUuZGF0YVR5cGUudG9Mb3dlckNhc2UoKSl0cnl7ci5kYXRhPUpTT04ucGFyc2Uoci5kYXRhKX1jYXRjaChlKXt9cmV0dXJuIHJ9KHtkYXRhOnIsc3RhdHVzQ29kZTppLGhlYWRlcjpvLGVyck1zZzoicmVxdWVzdDpvayIsY29va2llczpzfSx1KSk7YnJlYWs7Y2FzZSJmYWlsIjpvaShsLHtlcnJNc2c6InJlcXVlc3Q6ZmFpbCAiK2F9KX19KTt2YXIgVHA9ZnVuY3Rpb24oZSl7dGhpcy5pZD1lfTtUcC5wcm90b3R5cGUuYWJvcnQ9ZnVuY3Rpb24oKXtWdSgib3BlcmF0ZVJlcXVlc3RUYXNrIix7cmVxdWVzdFRhc2tJZDp0aGlzLmlkLG9wZXJhdGlvblR5cGU6ImFib3J0In0pfSxUcC5wcm90b3R5cGUub2ZmSGVhZGVyc1JlY2VpdmVkPWZ1bmN0aW9uKCl7fSxUcC5wcm90b3R5cGUub25IZWFkZXJzUmVjZWl2ZWQ9ZnVuY3Rpb24oKXt9O3ZhciBPcD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxyZXF1ZXN0OmZ1bmN0aW9uKGUsdCl7dmFyIG47Zm9yKHZhciByIGluIGUuaGVhZGVyKWlmKCJjb250ZW50LXR5cGUiPT09ci50b0xvd2VyQ2FzZSgpKXtuPWUuaGVhZGVyW3JdO2JyZWFrfSJHRVQiIT09ZS5tZXRob2QmJjA9PT1uLmluZGV4T2YoImFwcGxpY2F0aW9uL2pzb24iKSYmVChlLmRhdGEpJiYoZS5kYXRhPUpTT04uc3RyaW5naWZ5KGUuZGF0YSkpO3ZhciBpPVZ1KCJjcmVhdGVSZXF1ZXN0VGFzayIsZSkucmVxdWVzdFRhc2tJZDtyZXR1cm4gQ3BbaV09e2FyZ3M6ZSxjYWxsYmFja0lkOnR9LG5ldyBUcChpKX19KSxFcD1mdW5jdGlvbihlKXt0aGlzLmlkPWUsdGhpcy5fY2FsbGJhY2tzPXtvcGVuOltdLGNsb3NlOltdLGVycm9yOltdLG1lc3NhZ2U6W119LHRoaXMuQ0xPU0VEPTMsdGhpcy5DTE9TSU5HPTIsdGhpcy5DT05ORUNUSU5HPTAsdGhpcy5PUEVOPTEsdGhpcy5yZWFkeVN0YXRlPXRoaXMuQ0xPU0VEfTtFcC5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihlKXt0aGlzLnJlYWR5U3RhdGUhPT10aGlzLk9QRU4mJnRoaXMuX2NhbGxiYWNrKGUsInNlbmRTb2NrZXRNZXNzYWdlOmZhaWwgV2ViU29ja2V0IGlzIG5vdCBjb25uZWN0ZWQiKTt2YXIgdD1WdSgib3BlcmF0ZVNvY2tldFRhc2siLE9iamVjdC5hc3NpZ24oe30sZSx7b3BlcmF0aW9uVHlwZToic2VuZCIsc29ja2V0VGFza0lkOnRoaXMuaWR9KSkuZXJyTXNnO3RoaXMuX2NhbGxiYWNrKGUsdC5yZXBsYWNlKCJvcGVyYXRlU29ja2V0VGFzayIsInNlbmRTb2NrZXRNZXNzYWdlIikpfSxFcC5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oZSl7dGhpcy5yZWFkeVN0YXRlPXRoaXMuQ0xPU0lORzt2YXIgdD1WdSgib3BlcmF0ZVNvY2tldFRhc2siLE9iamVjdC5hc3NpZ24oe30sZSx7b3BlcmF0aW9uVHlwZToiY2xvc2UiLHNvY2tldFRhc2tJZDp0aGlzLmlkfSkpLmVyck1zZzt0aGlzLl9jYWxsYmFjayhlLHQucmVwbGFjZSgib3BlcmF0ZVNvY2tldFRhc2siLCJjbG9zZVNvY2tldCIpKX0sRXAucHJvdG90eXBlLm9uT3Blbj1mdW5jdGlvbihlKXt0aGlzLl9jYWxsYmFja3Mub3Blbi5wdXNoKGUpfSxFcC5wcm90b3R5cGUub25DbG9zZT1mdW5jdGlvbihlKXt0aGlzLl9jYWxsYmFja3MuY2xvc2UucHVzaChlKX0sRXAucHJvdG90eXBlLm9uRXJyb3I9ZnVuY3Rpb24oZSl7dGhpcy5fY2FsbGJhY2tzLmVycm9yLnB1c2goZSl9LEVwLnByb3RvdHlwZS5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7dGhpcy5fY2FsbGJhY2tzLm1lc3NhZ2UucHVzaChlKX0sRXAucHJvdG90eXBlLl9jYWxsYmFjaz1mdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLnN1Y2Nlc3Mscj1lLmZhaWwsaT1lLmNvbXBsZXRlLG89e2Vyck1zZzp0fTsvOm9rJC8udGVzdCh0KT8iZnVuY3Rpb24iPT10eXBlb2YgbiYmbihvKToiZnVuY3Rpb24iPT10eXBlb2YgciYmcihvKSwiZnVuY3Rpb24iPT10eXBlb2YgaSYmaShvKX07dmFyIEFwPU9iamVjdC5jcmVhdGUobnVsbCksSXA9W10sJHA9T2JqZWN0LmNyZWF0ZShudWxsKTtVdSgib25Tb2NrZXRUYXNrU3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUuc29ja2V0VGFza0lkLG49ZS5zdGF0ZSxyPWUuZGF0YSxpPShlLmVyck1zZyxBcFt0XSk7aWYoaSl7aWYoIm9wZW4iPT09biYmKGkucmVhZHlTdGF0ZT1pLk9QRU4pLGk9PT1JcFswXSYmJHBbbl0mJm9pKCRwW25dLCJtZXNzYWdlIj09PW4/e2RhdGE6cn06e30pLCJlcnJvciI9PT1ufHwiY2xvc2UiPT09bil7aS5yZWFkeVN0YXRlPWkuQ0xPU0VELGRlbGV0ZSBBcFt0XTt2YXIgbz1JcC5pbmRleE9mKGkpOzA8PW8mJklwLnNwbGljZShvLDEpfWkuX2NhbGxiYWNrc1tuXS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlKCJtZXNzYWdlIj09PW4/e2RhdGE6cn06e30pfSl9fSk7dmFyIFBwLE1wPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNvbm5lY3RTb2NrZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj1WdSgiY3JlYXRlU29ja2V0VGFzayIsZSkuc29ja2V0VGFza0lkLHI9bmV3IEVwKG4pO3JldHVybiBBcFtuXT1yLElwLnB1c2gociksT3YoZnVuY3Rpb24oKXtvaSh0LHtlcnJNc2c6ImNvbm5lY3RTb2NrZXQ6b2sifSl9LDApLHJ9LHNlbmRTb2NrZXRNZXNzYWdlOmZ1bmN0aW9uKGUsdCl7dmFyIG49SXBbMF07aWYobiYmbi5yZWFkeVN0YXRlPT09bi5PUEVOKXJldHVybiBWdSgib3BlcmF0ZVNvY2tldFRhc2siLE9iamVjdC5hc3NpZ24oe30sZSx7b3BlcmF0aW9uVHlwZToic2VuZCIsc29ja2V0VGFza0lkOm4uaWR9KSk7b2kodCx7ZXJyTXNnOiJzZW5kU29ja2V0TWVzc2FnZTpmYWlsIFdlYlNvY2tldCBpcyBub3QgY29ubmVjdGVkIn0pfSxjbG9zZVNvY2tldDpmdW5jdGlvbihlLHQpe3ZhciBuPUlwWzBdO2lmKG4pcmV0dXJuIG4ucmVhZHlTdGF0ZT1uLkNMT1NJTkcsVnUoIm9wZXJhdGVTb2NrZXRUYXNrIixPYmplY3QuYXNzaWduKHt9LGUse29wZXJhdGlvblR5cGU6ImNsb3NlIixzb2NrZXRUYXNrSWQ6bi5pZH0pKTtvaSh0LHtlcnJNc2c6ImNsb3NlU29ja2V0OmZhaWwgV2ViU29ja2V0IGlzIG5vdCBjb25uZWN0ZWQifSl9LG9uU29ja2V0T3BlbjpmdW5jdGlvbihlKXskcC5vcGVuPWV9LG9uU29ja2V0RXJyb3I6ZnVuY3Rpb24oZSl7JHAuZXJyb3I9ZX0sb25Tb2NrZXRNZXNzYWdlOmZ1bmN0aW9uKGUpeyRwLm1lc3NhZ2U9ZX0sb25Tb2NrZXRDbG9zZTpmdW5jdGlvbihlKXskcC5jbG9zZT1lfX0pLGpwPWZ1bmN0aW9uKCl7fTtqcC5wcm90b3R5cGUub25DaGVja0ZvclVwZGF0ZT1mdW5jdGlvbigpe30sanAucHJvdG90eXBlLm9uVXBkYXRlUmVhZHk9ZnVuY3Rpb24oKXt9LGpwLnByb3RvdHlwZS5vblVwZGF0ZUZhaWxlZD1mdW5jdGlvbigpe30sanAucHJvdG90eXBlLmFwcGx5VXBkYXRlPWZ1bmN0aW9uKCl7fTt2YXIgTHA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZ2V0VXBkYXRlTWFuYWdlcjpmdW5jdGlvbigpe3JldHVybiBQcHx8KFBwPW5ldyBqcCl9fSksTnA9ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWUsdGhpcy5fY2FsbGJhY2tJZD10LHRoaXMuX2NhbGxiYWNrcz1bXX07TnAucHJvdG90eXBlLmFib3J0PWZ1bmN0aW9uKCl7VnUoIm9wZXJhdGVVcGxvYWRUYXNrIix7dXBsb2FkVGFza0lkOnRoaXMuaWQsb3BlcmF0aW9uVHlwZToiYWJvcnQifSl9LE5wLnByb3RvdHlwZS5vblByb2dyZXNzVXBkYXRlPWZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBlJiZ0aGlzLl9jYWxsYmFja3MucHVzaChlKX0sTnAucHJvdG90eXBlLm9uSGVhZGVyc1JlY2VpdmVkPWZ1bmN0aW9uKCl7fSxOcC5wcm90b3R5cGUub2ZmUHJvZ3Jlc3NVcGRhdGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fY2FsbGJhY2tzLmluZGV4T2YoZSk7MDw9dCYmdGhpcy5fY2FsbGJhY2tzLnNwbGljZSh0LDEpfSxOcC5wcm90b3R5cGUub2ZmSGVhZGVyc1JlY2VpdmVkPWZ1bmN0aW9uKCl7fTt2YXIgQnA9T2JqZWN0LmNyZWF0ZShudWxsKTtVdSgib25VcGxvYWRUYXNrU3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudXBsb2FkVGFza0lkLG49ZS5zdGF0ZSxyPWUuZGF0YSxpPWUuc3RhdHVzQ29kZSxvPWUucHJvZ3Jlc3MsYT1lLnRvdGFsQnl0ZXNTZW50LHM9ZS50b3RhbEJ5dGVzRXhwZWN0ZWRUb1NlbmQsYz1lLmVyck1zZyx1PUJwW3RdLGw9dS5fY2FsbGJhY2tJZDtzd2l0Y2gobil7Y2FzZSJwcm9ncmVzc1VwZGF0ZSI6dS5fY2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24oZSl7ZSh7cHJvZ3Jlc3M6byx0b3RhbEJ5dGVzU2VudDphLHRvdGFsQnl0ZXNFeHBlY3RlZFRvU2VuZDpzfSl9KTticmVhaztjYXNlInN1Y2Nlc3MiOm9pKGwse2RhdGE6cixzdGF0dXNDb2RlOmksZXJyTXNnOiJyZXF1ZXN0Om9rIn0pO2Nhc2UiZmFpbCI6b2kobCx7ZXJyTXNnOiJyZXF1ZXN0OmZhaWwgIitjfSk7ZGVmYXVsdDpPdihmdW5jdGlvbigpe2RlbGV0ZSBCcFt0XX0sMTAwKX19KTt2YXIgRHAsUnAsRnAsenAsVnA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsdXBsb2FkRmlsZTpmdW5jdGlvbihlLHQpe3ZhciBuPVZ1KCJjcmVhdGVVcGxvYWRUYXNrIixlKS51cGxvYWRUYXNrSWQscj1uZXcgTnAobix0KTtyZXR1cm4gQnBbbl09cn19KTtmdW5jdGlvbiBVcChlKXt0cnl7cmV0dXJuIEpTT04ucGFyc2UoZSl9Y2F0Y2goZSl7fXJldHVybiBlfWZ1bmN0aW9uIHFwKHQpe2lmKCJlbmFibGVkIj09PXQudHlwZSlGcD0hMCx6cD10Lm9mZmxpbmU7ZWxzZSBpZigiY2xpZW50SWQiPT09dC50eXBlKURwPXQuY2lkLFJwPXQuZXJyTXNnLEhwKERwLHQuZXJyTXNnKTtlbHNlIGlmKCJwdXNoTXNnIj09PXQudHlwZSlmb3IodmFyIGU9e3R5cGU6InJlY2VpdmUiLGRhdGE6VXAodC5tZXNzYWdlKX0sbj0wO248R3AubGVuZ3RoO24rKyl7aWYoKDAsR3Bbbl0pKGUpLGUuc3RvcHBlZClicmVha31lbHNlImNsaWNrIj09PXQudHlwZSYmR3AuZm9yRWFjaChmdW5jdGlvbihlKXtlKHt0eXBlOiJjbGljayIsZGF0YTpVcCh0Lm1lc3NhZ2UpfSl9KX12YXIgV3A9W107ZnVuY3Rpb24gSHAodCxuKXtXcC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UodCxuKX0pLFdwLmxlbmd0aD0wfXZhciBHcD1bXSxYcD0hMSxZcD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxpbnZva2VQdXNoQ2FsbGJhY2s6cXAsZ2V0UHVzaENsaWVudElkOmZ1bmN0aW9uKGUpe1QoZSl8fChlPXt9KTt2YXIgdD1RKGUpLHI9dC5zdWNjZXNzLGk9dC5mYWlsLG89dC5jb21wbGV0ZSxhPUMocikscz1DKGkpLGM9QyhvKTt6cD9Ddi5wdXNoLmdldENsaWVudEluZm9Bc3luYyhmdW5jdGlvbihlKXt2YXIgdD17ZXJyTXNnOiJnZXRQdXNoQ2xpZW50SWQ6b2siLGNpZDplLmNsaWVudGlkfTthJiZyKHQpLGMmJm8odCl9LGZ1bmN0aW9uKGUpe2U9e2Vyck1zZzoiZ2V0UHVzaENsaWVudElkOmZhaWwgIitlLmNvZGUrIjogIitlLm1lc3NhZ2V9LHMmJmkoZSksYyYmbyhlKX0pOlByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24oKXt2b2lkIDA9PT1GcCYmKEZwPSExLERwPSIiLFJwPSJ1bmlQdXNoIGlzIG5vdCBlbmFibGVkIiksV3AucHVzaChmdW5jdGlvbihlLHQpe3ZhciBuO2U/KG49e2Vyck1zZzoiZ2V0UHVzaENsaWVudElkOm9rIixjaWQ6ZX0sYSYmcihuKSk6KG49e2Vyck1zZzoiZ2V0UHVzaENsaWVudElkOmZhaWwiKyh0PyIgIit0OiIiKX0scyYmaShuKSksYyYmbyhuKX0pLHZvaWQgMCE9PURwJiZIcChEcCxScCl9KX0sb25QdXNoTWVzc2FnZTpmdW5jdGlvbihlKXstMT09PUdwLmluZGV4T2YoZSkmJkdwLnB1c2goZSksWHB8fChYcD0hMCxDdi5wdXNoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihlKXtxcCh7dHlwZToiY2xpY2siLG1lc3NhZ2U6ZX0pfSksQ3YucHVzaC5hZGRFdmVudExpc3RlbmVyKCJyZWNlaXZlIixmdW5jdGlvbihlKXtxcCh7dHlwZToicHVzaE1zZyIsbWVzc2FnZTplfSl9KSl9LG9mZlB1c2hNZXNzYWdlOmZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PUdwLmluZGV4T2YoZSk7LTE8dCYmR3Auc3BsaWNlKHQsMSl9ZWxzZSBHcC5sZW5ndGg9MH19KSxKcD17ZHVyYXRpb246NDAwLHRpbWluZ0Z1bmN0aW9uOiJsaW5lYXIiLGRlbGF5OjAsdHJhbnNmb3JtT3JpZ2luOiI1MCUgNTAlIDAifSxLcD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnM9W10sdGhpcy5jdXJyZW50VHJhbnNmb3JtPXt9LHRoaXMuY3VycmVudFN0ZXBBbmltYXRlcz1bXSx0aGlzLm9wdGlvbj1PYmplY3QuYXNzaWduKHt9LEpwLGUpfTtLcC5wcm90b3R5cGUuX2dldE9wdGlvbj1mdW5jdGlvbihlKXt2YXIgdD17dHJhbnNpdGlvbjpPYmplY3QuYXNzaWduKHt9LHRoaXMub3B0aW9uLGUpfTtyZXR1cm4gdC50cmFuc2Zvcm1PcmlnaW49dC50cmFuc2l0aW9uLnRyYW5zZm9ybU9yaWdpbixkZWxldGUgdC50cmFuc2l0aW9uLnRyYW5zZm9ybU9yaWdpbix0fSxLcC5wcm90b3R5cGUuX3B1c2hBbmltYXRlcz1mdW5jdGlvbihlLHQpe3RoaXMuY3VycmVudFN0ZXBBbmltYXRlcy5wdXNoKHt0eXBlOmUsYXJnczp0fSl9LEtwLnByb3RvdHlwZS5fY29udmVyVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC9bQS1aXS9nLGZ1bmN0aW9uKGUpe3JldHVybiItIitlLnRvTG93ZXJDYXNlKCl9KX0sS3AucHJvdG90eXBlLl9nZXRWYWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGU/ZSsicHgiOmV9LEtwLnByb3RvdHlwZS5leHBvcnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmFjdGlvbnM7cmV0dXJuIHRoaXMuYWN0aW9ucz1bXSx7YWN0aW9uczplfX0sS3AucHJvdG90eXBlLnN0ZXA9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gdGhpcy5jdXJyZW50U3RlcEFuaW1hdGVzLmZvckVhY2goZnVuY3Rpb24oZSl7InN0eWxlIiE9PWUudHlwZT90LmN1cnJlbnRUcmFuc2Zvcm1bZS50eXBlXT1lOnQuY3VycmVudFRyYW5zZm9ybVtlLnR5cGUrIi4iK2UuYXJnc1swXV09ZX0pLHRoaXMuYWN0aW9ucy5wdXNoKHthbmltYXRlczpPYmplY3QudmFsdWVzKHRoaXMuY3VycmVudFRyYW5zZm9ybSksb3B0aW9uOnRoaXMuX2dldE9wdGlvbihlKX0pLHRoaXMuY3VycmVudFN0ZXBBbmltYXRlcz1bXSx0aGlzfTt2YXIgWnA9WyJvcGFjaXR5IiwiYmFja2dyb3VuZENvbG9yIl0sUXA9WyJ3aWR0aCIsImhlaWdodCIsImxlZnQiLCJyaWdodCIsInRvcCIsImJvdHRvbSJdO1sibWF0cml4IiwibWF0cml4M2QiLCJyb3RhdGUiLCJyb3RhdGUzZCIsInJvdGF0ZVgiLCJyb3RhdGVZIiwicm90YXRlWiIsInNjYWxlIiwic2NhbGUzZCIsInNjYWxlWCIsInNjYWxlWSIsInNjYWxlWiIsInNrZXciLCJza2V3WCIsInNrZXdZIiwidHJhbnNsYXRlIiwidHJhbnNsYXRlM2QiLCJ0cmFuc2xhdGVYIiwidHJhbnNsYXRlWSIsInRyYW5zbGF0ZVoiXS5jb25jYXQoWnAsUXApLmZvckVhY2goZnVuY3Rpb24obil7S3AucHJvdG90eXBlW25dPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3JldHVybiBacC5jb25jYXQoUXApLmluY2x1ZGVzKG4pP3RoaXMuX3B1c2hBbmltYXRlcygic3R5bGUiLFt0aGlzLl9jb252ZXJUeXBlKG4pLFFwLmluY2x1ZGVzKG4pP3RoaXMuX2dldFZhbHVlKGVbMF0pOmVbMF1dKTp0aGlzLl9wdXNoQW5pbWF0ZXMobixlKSx0aGlzfX0pO3ZhciBlaD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjcmVhdGVBbmltYXRpb246ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBLcChlKX19KSx0aD1tdSgicmVxdWVzdENvbXBvbmVudE9ic2VydmVyIiksbmg9e3RocmVzaG9sZHM6WzBdLGluaXRpYWxSYXRpbzowLG9ic2VydmVBbGw6ITF9LHJoPWZ1bmN0aW9uKGUsdCl7dGhpcy5wYWdlSWQ9ZS4kcGFnZSYmZS4kcGFnZS5pZCx0aGlzLmNvbXBvbmVudD1lLl8kaWR8fGUsdGhpcy5vcHRpb25zPU9iamVjdC5hc3NpZ24oe30sbmgsdCl9O3JoLnByb3RvdHlwZS5fbWFrZVJvb3RNYXJnaW49ZnVuY3Rpb24odCl7dm9pZCAwPT09dCYmKHQ9e30pLHRoaXMub3B0aW9ucy5yb290TWFyZ2luPVsidG9wIiwicmlnaHQiLCJib3R0b20iLCJsZWZ0Il0ubWFwKGZ1bmN0aW9uKGUpe3JldHVybihOdW1iZXIodFtlXSl8fDApKyJweCJ9KS5qb2luKCIgIil9LHJoLnByb3RvdHlwZS5yZWxhdGl2ZVRvPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub3B0aW9ucy5yZWxhdGl2ZVRvU2VsZWN0b3I9ZSx0aGlzLl9tYWtlUm9vdE1hcmdpbih0KSx0aGlzfSxyaC5wcm90b3R5cGUucmVsYXRpdmVUb1ZpZXdwb3J0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9wdGlvbnMucmVsYXRpdmVUb1NlbGVjdG9yPW51bGwsdGhpcy5fbWFrZVJvb3RNYXJnaW4oZSksdGhpc30scmgucHJvdG90eXBlLm9ic2VydmU9ZnVuY3Rpb24oZSx0KXsiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHRoaXMub3B0aW9ucy5zZWxlY3Rvcj1lLHRoaXMucmVxSWQ9dGgucHVzaCh0KSxUdi5wdWJsaXNoSGFuZGxlcigicmVxdWVzdENvbXBvbmVudE9ic2VydmVyIix7cmVxSWQ6dGhpcy5yZXFJZCxjb21wb25lbnQ6dGhpcy5jb21wb25lbnQsb3B0aW9uczp0aGlzLm9wdGlvbnN9LCh0aGlzLmNvbXBvbmVudCx0aGlzLnBhZ2VJZCkpKX0scmgucHJvdG90eXBlLmRpc2Nvbm5lY3Q9ZnVuY3Rpb24oKXtUdi5wdWJsaXNoSGFuZGxlcigiZGVzdHJveUNvbXBvbmVudE9ic2VydmVyIix7cmVxSWQ6dGhpcy5yZXFJZH0sKHRoaXMuY29tcG9uZW50LHRoaXMucGFnZUlkKSl9O3ZhciBpaD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjcmVhdGVJbnRlcnNlY3Rpb25PYnNlcnZlcjpmdW5jdGlvbihlLHQpe3JldHVybiBlLl9pc1Z1ZXx8KHQ9ZSxlPW51bGwpLG5ldyByaChlfHxxdSgiY3JlYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiKSx0KX19KSxvaD1tdSgicmVxdWVzdE1lZGlhUXVlcnlPYnNlcnZlciIpLGFoPWZ1bmN0aW9uKGUsdCl7dGhpcy5wYWdlSWQ9ZS4kcGFnZSYmZS4kcGFnZS5pZCx0aGlzLmNvbXBvbmVudD1lLl8kaWR8fGUsdGhpcy5vcHRpb25zPXR9O2FoLnByb3RvdHlwZS5vYnNlcnZlPWZ1bmN0aW9uKGUsdCl7ImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0aGlzLm9wdGlvbnM9ZSx0aGlzLnJlcUlkPW9oLnB1c2godCksVHYucHVibGlzaEhhbmRsZXIoInJlcXVlc3RNZWRpYVF1ZXJ5T2JzZXJ2ZXIiLHtyZXFJZDp0aGlzLnJlcUlkLGNvbXBvbmVudDp0aGlzLmNvbXBvbmVudCxvcHRpb25zOnRoaXMub3B0aW9uc30sKHRoaXMuY29tcG9uZW50LHRoaXMucGFnZUlkKSkpfSxhaC5wcm90b3R5cGUuZGlzY29ubmVjdD1mdW5jdGlvbigpe1R2LnB1Ymxpc2hIYW5kbGVyKCJkZXN0cm95TWVkaWFRdWVyeU9ic2VydmVyIix7cmVxSWQ6dGhpcy5yZXFJZH0sKHRoaXMuY29tcG9uZW50LHRoaXMucGFnZUlkKSl9O3ZhciBzaD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjcmVhdGVNZWRpYVF1ZXJ5T2JzZXJ2ZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5faXNWdWV8fCh0PWUsZT1udWxsKSxuZXcgYWgoZXx8cXUoImNyZWF0ZU1lZGlhUXVlcnlPYnNlcnZlciIpLHQpfX0pLGNoPXtjYW52YXM6VmYsbWFwOkhmLHZpZGVvOkpmLGVkaXRvcjpRZn07ZnVuY3Rpb24gdWgoZSl7aWYoZSYmZS5jb250ZXh0KXt2YXIgdD1lLmNvbnRleHQsbj10LmlkLHI9dC5uYW1lLGk9dC5wYWdlLG89Y2hbcl07ZS5jb250ZXh0PW8mJm5ldyBvKG4saSl9fXZhciBsaD1mdW5jdGlvbihlLHQsbixyKXt0aGlzLl9zZWxlY3RvclF1ZXJ5PWUsdGhpcy5fY29tcG9uZW50PXQsdGhpcy5fc2VsZWN0b3I9bix0aGlzLl9zaW5nbGU9cn07bGgucHJvdG90eXBlLmJvdW5kaW5nQ2xpZW50UmVjdD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fc2VsZWN0b3JRdWVyeS5fcHVzaCh0aGlzLl9zZWxlY3Rvcix0aGlzLl9jb21wb25lbnQsdGhpcy5fc2luZ2xlLHtpZDohMCxkYXRhc2V0OiEwLHJlY3Q6ITAsc2l6ZTohMH0sZSksdGhpcy5fc2VsZWN0b3JRdWVyeX0sbGgucHJvdG90eXBlLmZpZWxkcz1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9zZWxlY3RvclF1ZXJ5Ll9wdXNoKHRoaXMuX3NlbGVjdG9yLHRoaXMuX2NvbXBvbmVudCx0aGlzLl9zaW5nbGUsZSx0KSx0aGlzLl9zZWxlY3RvclF1ZXJ5fSxsaC5wcm90b3R5cGUuc2Nyb2xsT2Zmc2V0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9zZWxlY3RvclF1ZXJ5Ll9wdXNoKHRoaXMuX3NlbGVjdG9yLHRoaXMuX2NvbXBvbmVudCx0aGlzLl9zaW5nbGUse2lkOiEwLGRhdGFzZXQ6ITAsc2Nyb2xsT2Zmc2V0OiEwfSxlKSx0aGlzLl9zZWxlY3RvclF1ZXJ5fSxsaC5wcm90b3R5cGUuY29udGV4dD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fc2VsZWN0b3JRdWVyeS5fcHVzaCh0aGlzLl9zZWxlY3Rvcix0aGlzLl9jb21wb25lbnQsdGhpcy5fc2luZ2xlLHtjb250ZXh0OiEwfSxlKSx0aGlzLl9zZWxlY3RvclF1ZXJ5fTt2YXIgZGg9ZnVuY3Rpb24oZSl7dGhpcy5fcGFnZT1lLHRoaXMuX3F1ZXVlPVtdLHRoaXMuX3F1ZXVlQ2I9W10sdGhpcy5fbm9kZXNSZWY9bnVsbH07ZGgucHJvdG90eXBlLmV4ZWM9ZnVuY3Rpb24odCl7dmFyIGk9dGhpcztyZXR1cm4gVnUoInJlcXVlc3RDb21wb25lbnRJbmZvIix0aGlzLl9wYWdlLHRoaXMuX3F1ZXVlLGZ1bmN0aW9uKGUpe3ZhciByPWkuX3F1ZXVlQ2I7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUsdCl7QXJyYXkuaXNBcnJheShlKT9lLmZvckVhY2godWgpOnVoKGUpO3ZhciBuPXJbdF07QyhuKSYmbi5jYWxsKGksZSl9KSxDKHQpJiZ0LmNhbGwoaSxlKX0pLHRoaXMuX25vZGVzUmVmfSxkaC5wcm90b3R5cGUuaW49ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2NvbXBvbmVudD1lLl8kaWR8fGUsdGhpc30sZGgucHJvdG90eXBlLnNlbGVjdD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fbm9kZXNSZWY9bmV3IGxoKHRoaXMsdGhpcy5fY29tcG9uZW50LGUsITApfSxkaC5wcm90b3R5cGUuc2VsZWN0QWxsPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9ub2Rlc1JlZj1uZXcgbGgodGhpcyx0aGlzLl9jb21wb25lbnQsZSwhMSl9LGRoLnByb3RvdHlwZS5zZWxlY3RWaWV3cG9ydD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub2Rlc1JlZj1uZXcgbGgodGhpcywwLCIiLCEwKX0sZGgucHJvdG90eXBlLl9wdXNoPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dGhpcy5fcXVldWUucHVzaCh7Y29tcG9uZW50OnQsc2VsZWN0b3I6ZSxzaW5nbGU6bixmaWVsZHM6cn0pLHRoaXMuX3F1ZXVlQ2IucHVzaChpKX07dmFyIGZoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNyZWF0ZVNlbGVjdG9yUXVlcnk6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBkaChlfHxxdSgiY3JlYXRlU2VsZWN0b3JRdWVyeSIpKX19KTtUdi5zdWJzY3JpYmUoIm9uTG9hZEZvbnRGYWNlQ2FsbGJhY2siLGZ1bmN0aW9uKGUpe29pKGUuY2FsbGJhY2tJZCxlLmRhdGEpfSk7dmFyIHBoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGxvYWRGb250RmFjZTpmdW5jdGlvbihlLHQpe3ZhciBuPVd1KCk7aWYoIW4pcmV0dXJue2Vyck1zZzoibG9hZEZvbnRGYWNlOmZhaWwgbm90IGZvbnQgcGFnZSJ9O1R2LnB1Ymxpc2hIYW5kbGVyKCJsb2FkRm9udEZhY2UiLHtvcHRpb25zOmUsY2FsbGJhY2tJZDp0fSxuKX19KTt2YXIgaGg9W107dmFyIHZoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldExvY2FsZTpmdW5jdGlvbigpe3ZhciBlPWp2KHthbGxvd0RlZmF1bHQ6ITB9KTtyZXR1cm4gZSYmZS4kdm0/ZS4kdm0uJGxvY2FsZTpaZS5nZXRMb2NhbGUoKX0sc2V0TG9jYWxlOmZ1bmN0aW9uKHQpe3JldHVybiBqdigpLiR2bS4kbG9jYWxlIT09dCYmKGp2KCkuJHZtLiRsb2NhbGU9dCxMdigpLmZvckVhY2goZnVuY3Rpb24oZSl7VHYucHVibGlzaEhhbmRsZXIoInNldExvY2FsZSIsdCxlLiRwYWdlLmlkKX0pLHh2LnJlcXVpcmVNb2R1bGUoInBsdXMiKS5zZXRMYW5ndWFnZSh0KSxoaC5mb3JFYWNoKGZ1bmN0aW9uKGUpe29pKGUse2xvY2FsZTp0fSl9KSwhMCl9LG9uTG9jYWxlQ2hhbmdlOmZ1bmN0aW9uKGUpe2hoLnB1c2goZSl9fSk7dmFyIGdoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHBhZ2VTY3JvbGxUbzpmdW5jdGlvbihlKXt2YXIgdD1MdigpO3JldHVybiB0Lmxlbmd0aCYmVHYucHVibGlzaEhhbmRsZXIoInBhZ2VTY3JvbGxUbyIsZSx0W3QubGVuZ3RoLTFdLiRwYWdlLmlkKSx7fX19KTt2YXIgbWg9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsc2V0UGFnZU1ldGE6ZnVuY3Rpb24oZSl7dmFyIHQ9THYoKTtyZXR1cm4gdC5sZW5ndGgmJlR2LnB1Ymxpc2hIYW5kbGVyKCJzZXRQYWdlTWV0YSIsZSx0W3QubGVuZ3RoLTFdLiRwYWdlLmlkKSx7fX19KTtmdW5jdGlvbiB5aChlKXtyZXR1cm4gVnUoInNldFRhYkJhckJhZGdlIix7aW5kZXg6ZS5pbmRleCx0eXBlOiJub25lIn0pfXZhciBfaD15aCxiaD1bXTtVdSgib25UYWJCYXJNaWRCdXR0b25UYXAiLGZ1bmN0aW9uKHQpe2JoLmZvckVhY2goZnVuY3Rpb24oZSl7b2koZSx0KX0pfSk7dmFyIHdoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHJlbW92ZVRhYkJhckJhZGdlOnloLHNob3dUYWJCYXJSZWREb3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIFZ1KCJzZXRUYWJCYXJCYWRnZSIse2luZGV4OmUuaW5kZXgsdHlwZToicmVkRG90In0pfSxoaWRlVGFiQmFyUmVkRG90Ol9oLG9uVGFiQmFyTWlkQnV0dG9uVGFwOmZ1bmN0aW9uKGUpe2JoLnB1c2goZSl9fSksa2g9W107VXUoIm9uVmlld0RpZFJlc2l6ZSIsZnVuY3Rpb24odCl7a2guZm9yRWFjaChmdW5jdGlvbihlKXtvaShlLHQpfSl9KTt2YXIgU2gseGgsQ2g9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsb25XaW5kb3dSZXNpemU6ZnVuY3Rpb24oZSl7a2gucHVzaChlKX0sb2ZmV2luZG93UmVzaXplOmZ1bmN0aW9uKGUpe2toLnNwbGljZShraC5pbmRleE9mKGUpLDEpfX0pLFRoPU9iamVjdC5jcmVhdGUobnVsbCksT2g9KFNoPXsiLi9iYXNlL2Jhc2U2NC5qcyI6RHIsIi4vYmFzZS9jYW4taS11c2UuanMiOkZyLCIuL2Jhc2UvaW50ZXJjZXB0b3IuanMiOlZyLCIuL2Jhc2UvdXB4MnB4LmpzIjpHciwiLi9jb250ZXh0L2F1ZGlvLmpzIjpKciwiLi9jb250ZXh0L2JhY2tncm91bmQtYXVkaW8uanMiOlp1LCIuL2NvbnRleHQvY2FudmFzLmpzIjpxZiwiLi9jb250ZXh0L2NyZWF0ZS1tYXAtY29udGV4dC5qcyI6R2YsIi4vY29udGV4dC9jcmVhdGUtdmlkZW8tY29udGV4dC5qcyI6S2YsIi4vY29udGV4dC9lZGl0b3IuanMiOmVwLCIuL2NvbnRleHQvaW5uZXItYXVkaW8uanMiOmFwLCIuL2RldmljZS9uZXR3b3JrLmpzIjpjcCwiLi9kZXZpY2UvdGhlbWUuanMiOmxwLCIuL2tleWJvYXJkL2dldC1zZWxlY3RlZC10ZXh0LXJhbmdlLmpzIjpwcCwiLi9rZXlib2FyZC9rZXlib2FyZC5qcyI6aHAsIi4vbWVkaWEvcHJldmlldy1pbWFnZS5qcyI6eXAsIi4vbWVkaWEvcmVjb3JkZXIuanMiOndwLCIuL25ldHdvcmsvZG93bmxvYWQtZmlsZS5qcyI6eHAsIi4vbmV0d29yay9yZXF1ZXN0LmpzIjpPcCwiLi9uZXR3b3JrL3NvY2tldC5qcyI6TXAsIi4vbmV0d29yay91cGRhdGUuanMiOkxwLCIuL25ldHdvcmsvdXBsb2FkLWZpbGUuanMiOlZwLCIuL3BsdWdpbi9wdXNoLmpzIjpZcCwiLi91aS9jcmVhdGUtYW5pbWF0aW9uLmpzIjplaCwiLi91aS9jcmVhdGUtaW50ZXJzZWN0aW9uLW9ic2VydmVyLmpzIjppaCwiLi91aS9jcmVhdGUtbWVkaWEtcXVlcnktb2JzZXJ2ZXIuanMiOnNoLCIuL3VpL2NyZWF0ZS1zZWxlY3Rvci1xdWVyeS5qcyI6ZmgsIi4vdWkvbG9hZC1mb250LWZhY2UuanMiOnBoLCIuL3VpL2xvY2FsZS5qcyI6dmgsIi4vdWkvcGFnZS1zY3JvbGwtdG8uanMiOmdoLCIuL3VpL3NldC1wYWdlLW1ldGEuanMiOm1oLCIuL3VpL3RhYi1iYXIuanMiOndoLCIuL3VpL3dpbmRvdy5qcyI6Q2h9LCh4aD1mdW5jdGlvbihlKXtyZXR1cm4gU2hbZV18fGZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrZSsiJy4iKX0oKX0pLmtleXM9ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmtleXMoU2gpfSx4aCk7T2gua2V5cygpLmZvckVhY2goZnVuY3Rpb24oZSl7T2JqZWN0LmFzc2lnbihUaCxPaChlKSl9KTt2YXIgRWg9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLFRoLHp1KSxBaD1PYmplY3QuY3JlYXRlKG51bGwpO3QuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgaSxvO0VoW2VdP0FoW2VdPShvPU1yKGk9ZSxFaFtlXSksWihpKT9mdW5jdGlvbihuKXt2b2lkIDA9PT1uJiYobj17fSk7Zm9yKHZhciByPVtdLGU9YXJndW1lbnRzLmxlbmd0aC0xOzA8ZS0tOylyW2VdPWFyZ3VtZW50c1tlKzFdO3JldHVybiBDKG4uc3VjY2Vzcyl8fEMobi5mYWlsKXx8QyhuLmNvbXBsZXRlKT96KGksVi5hcHBseSh2b2lkIDAsW2ksbyxuXS5jb25jYXQocikpKTp6KGksbmV3IFByb21pc2UoZnVuY3Rpb24oZSx0KXtWLmFwcGx5KHZvaWQgMCxbaSxvLE9iamVjdC5hc3NpZ24oe30sbix7c3VjY2VzczplLGZhaWw6dH0pXS5jb25jYXQocikpfSkudGhlbihmdW5jdGlvbihlKXtyZXR1cm5bbnVsbCxlXX0pLmNhdGNoKGZ1bmN0aW9uKGUpe3JldHVybltlXX0pKX06byk6QWhbZV09JHIoZSl9KTt2YXIgSWg9T2JqZWN0LmNyZWF0ZShudWxsKTtmdW5jdGlvbiAkaChlLHQsbil7cmV0dXJuIm9uRXJyb3IiIT09dCYmY29uc29sZS5kZWJ1ZygiQXBw77yaIit0KyIgaGF2ZSBiZWVuIGludm9rZWQiKyhuPyIgIitKU09OLnN0cmluZ2lmeShuKToiIikpLChlPWUuJHZtfHxlKS5fX2NhbGxfaG9vayYmZS5fX2NhbGxfaG9vayh0LG4pfWZ1bmN0aW9uIFBoKGUsdCxuKXtyZXR1cm4ib25QYWdlU2Nyb2xsIiE9PXQmJmNvbnNvbGUuZGVidWcoZS4kcGFnZS5yb3V0ZSsiWyIrZS4kcGFnZS5pZCsiXe+8miIrdCsiIGhhdmUgYmVlbiBpbnZva2VkIiksaT10LG89biwocj0ocj1lKS4kdm18fHIpLl9fY2FsbF9ob29rJiZyLl9fY2FsbF9ob29rKGksbyk7dmFyIHIsaSxvfWZ1bmN0aW9uIE1oKGUsdCl7dmFyIG49ZS5uYW1lLHI9ZS5hcmc7InBvc3RNZXNzYWdlIj09PW4/ZnVuY3Rpb24odCxlKXt0PXBhcnNlSW50KHQpO3ZhciBuPUx2KCEwKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLiRwYWdlLmlkPT09dH0pO2lmKG4mJiFuLiRwYWdlLm1ldGEuaXNOVnVlKXt2YXIgcj1uLiR2bS5fJHZkLmVsZW1lbnRzLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIndlYi12aWV3Ij09PWUudHlwZSYmZS5ldmVudHMubWVzc2FnZX0pO2lmKCFyKXJldHVybjtyLmRpc3BhdGNoRXZlbnQoIm1lc3NhZ2UiLHt0eXBlOiJtZXNzYWdlIix0YXJnZXQ6T2JqZWN0LmNyZWF0ZShudWxsKSxjdXJyZW50VGFyZ2V0Ok9iamVjdC5jcmVhdGUobnVsbCksdGltZVN0YW1wOkRhdGUubm93KCksZGV0YWlsOntkYXRhOltlXX19KX19KHRbMF0scik6TXZbbl0ocil9ZnVuY3Rpb24gamgoZSx0KXt2YXIgbj10LmdldEFwcCxpPXQuZ2V0Q3VycmVudFBhZ2VzO2Z1bmN0aW9uIHIoZSx0KXt2YXIgbj1pKCk7bi5sZW5ndGgmJlBoKG5bbi5sZW5ndGgtMV0sZSx0KX1mdW5jdGlvbiBvKHQpe3JldHVybiBmdW5jdGlvbihlKXtyKHQsZSl9fXZhciBhPXtuYXZpZ2F0ZVRvOmZ1bmN0aW9uKCl7cigib25IaWRlIil9LG5hdmlnYXRlQmFjazpmdW5jdGlvbigpe3IoIm9uU2hvdyIpfX07ZSgib25FcnJvciIsZnVuY3Rpb24oZSl7JGgobigpLCJvbkVycm9yIixlKX0pLGUoIm9uUGFnZU5vdEZvdW5kIixmdW5jdGlvbihlKXskaChuKCksIm9uUGFnZU5vdEZvdW5kIixlKX0pLGUoIm9uQXBwUm91dGUiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZSxuPWFbdF07biYmbigpfSksZSgib25BcHBFbnRlckJhY2tncm91bmQiLGZ1bmN0aW9uKCl7JGgobigpLCJvbkhpZGUiKSxyKCJvbkhpZGUiKX0pLGUoIm9uQXBwRW50ZXJGb3JlZ3JvdW5kIixmdW5jdGlvbihlKXskaChuKCksIm9uU2hvdyIsZSksMCE9PWkoKS5sZW5ndGgmJnIoIm9uU2hvdyIpfSksZSgib25SZXNpemUiLGZ1bmN0aW9uKGUsdCl7dmFyIG49aSgpLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuJHBhZ2UuaWQ9PT10fSk7biYmUGgobiwib25SZXNpemUiLGUpfSksZSgib25QdWxsRG93blJlZnJlc2giLGZ1bmN0aW9uKGUsdCl7dmFyIG4scj1pKCkuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS4kcGFnZS5pZD09PXR9KTtyJiYoY3U9Im51bWJlciI9PXR5cGVvZihuPXQpP0N2LndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoU3RyaW5nKG4pKTpuLFBoKHIsIm9uUHVsbERvd25SZWZyZXNoIikpfSksZSgib25UYWJJdGVtVGFwIixvKCJvblRhYkl0ZW1UYXAiKSksZSgib25OYXZpZ2F0aW9uQmFyQnV0dG9uVGFwIixvKCJvbk5hdmlnYXRpb25CYXJCdXR0b25UYXAiKSksZSgib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDaGFuZ2VkIixvKCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENoYW5nZWQiKSksZSgib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDb25maXJtZWQiLG8oIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q29uZmlybWVkIikpLGUoIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2xpY2tlZCIsbygib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDbGlja2VkIikpLGUoIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Rm9jdXNDaGFuZ2VkIixvKCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dEZvY3VzQ2hhbmdlZCIpKSxlKCJvbldlYkludm9rZUFwcFNlcnZpY2UiLE1oKX10LmZvckVhY2goZnVuY3Rpb24oZSl7RWhbZV0/SWhbZV09TXIoZSxFaFtlXSk6SWhbZV09JHIoZSl9KTt2YXIgTGg9ITE7ZnVuY3Rpb24gTmgoZSx0KXt2YXIgbj0iMSI9PT10O2lmKCFufHwhTGgpe2lmKG4/KExoPSEwLEFjKEN2LndlYnZpZXcuZ2V0TGF1bmNoV2VidmlldygpKSk6YmN8fEFjKEN2LndlYnZpZXcuZ2V0V2Vidmlld0J5SWQodCkpLGJjLmlkIT09dClyZXR1cm4gY29uc29sZS5lcnJvcigid2Vidmlld1JlYWR5WyIrYmMuaWQrIl1bIit0KyJdIG5vdCBtYXRjaCIpO3ZhciByLGk7aWYoYmMubG9hZGVkPSEwLGk9amNbcj10XSxBcnJheS5pc0FycmF5KGkpJiZpLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGUoKX0pLGRlbGV0ZSBqY1tyXSxuKXt2YXIgbz0iLyIrJHYuZW50cnlQYWdlUGF0aCxhPVB2LmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUucGF0aD09PW99KTtpZighYS5tZXRhLmlzTlZ1ZSl7dmFyIHM9YS5tZXRhLmlzVGFiQmFyPyJzd2l0Y2hUYWIiOiJuYXZpZ2F0ZVRvIjtyZXR1cm4gTXZbc10oe3VybDpvKygkdi5lbnRyeVBhZ2VRdWVyeXx8IiIpLG9wZW5UeXBlOiJhcHBMYXVuY2gifSl9fX19dmFyIEJoPU9iamVjdC5jcmVhdGUobnVsbCk7ZnVuY3Rpb24gRGgoZSx0KXt2YXIgbj1lLmRhdGEscj0oZS5vcHRpb25zLEJoW3RdKTtBcnJheS5pc0FycmF5KHIpJiZyLmZvckVhY2goZnVuY3Rpb24oZSl7ZShuKX0pfXZhciBSaCxGaD1bXTtmdW5jdGlvbiB6aCgpe2Zvcih2YXIgZT1GaC5zbGljZSgwKSx0PUZoLmxlbmd0aD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0oKX1mdW5jdGlvbiBWaChlKXt2YXIgdD1lLmRhdGEsbj10Lm1ldGhvZCxyPXQuYXJncztNdltuXSYmTXZbbl0ocil9ZnVuY3Rpb24gVWgoZSx0KXt2YXIgbj1lLmNpZCxyPWUubWV0aG9kLGk9ZS5hcmdzO3Q9cGFyc2VJbnQodCk7dmFyIG89THYoITApLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuJHBhZ2UuaWQ9PT10fSk7aWYoIW8pcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlBhZ2VbIit0KyJdIG5vdCBmb3VuZCIpO3ZhciBhPW8uJHZtLl8kdmQuZ2V0Vm0obik7aWYoIWEpcmV0dXJuIGNvbnNvbGUuZXJyb3IoInZtWyIrbisiXSBub3QgZm91bmQiKTthW3JdJiZhW3JdKGkpfWZ1bmN0aW9uIHFoKHQpe3Q9cGFyc2VJbnQodCk7dmFyIGU9THYoITApLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuJHBhZ2UuaWQ9PT10fSk7cmV0dXJuIGV8fGNvbnNvbGUuZXJyb3IoIlBhZ2VbIit0KyJdIG5vdCBmb3VuZCIpfWZ1bmN0aW9uIFdoKGUsdCl7dmFyIG49cWgodCk7biYmKG4uX191bmlhcHBfd2Vidmlldz0hMCl9ZnVuY3Rpb24gSGgoZSx0KXt2YXIgbj1xaCh0KTtuJiZkZWxldGUgbi5fX3VuaWFwcF93ZWJ2aWV3fWZ1bmN0aW9uIEdoKCl7dmFyIGU9VHYub24sbj1Udi5lbWl0LHQ9VHYuc3Vic2NyaWJlLHI9VHYucHVibGlzaEhhbmRsZXIsaT1Udi5zdWJzY3JpYmVIYW5kbGVyO2lmKGZ1bmN0aW9uKGUsdCl7dC5nZXRBcHA7dmFyIGk9dC5nZXRDdXJyZW50UGFnZXM7ZnVuY3Rpb24gbihyKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXt0PXBhcnNlSW50KHQpO3ZhciBuPWkoKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLiRwYWdlLmlkPT09dH0pO24mJlBoKG4scixlKX19dmFyIG89bXUoInJlcXVlc3RDb21wb25lbnRJbmZvIiksYT1tdSgicmVxdWVzdENvbXBvbmVudE9ic2VydmVyIikscz1tdSgicmVxdWVzdE1lZGlhUXVlcnlPYnNlcnZlciIpO2UoIm9uUGFnZVNjcm9sbCIsbigib25QYWdlU2Nyb2xsIikpLGUoIm9uUmVhY2hCb3R0b20iLG4oIm9uUmVhY2hCb3R0b20iKSksZSgib25SZXF1ZXN0Q29tcG9uZW50SW5mbyIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXFJZCxuPWUucmVzLHI9by5wb3AodCk7ciYmcihuKX0pLGUoIm9uUmVxdWVzdENvbXBvbmVudE9ic2VydmVyIixmdW5jdGlvbihlKXt2YXIgdD1lLnJlcUlkLG49ZS5yZXFFbmQscj1lLnJlcyxpPWEuZ2V0KHQpO2lmKGkpe2lmKG4pcmV0dXJuIHZvaWQgYS5wb3AodCk7aShyKX19KSxlKCJvblJlcXVlc3RNZWRpYVF1ZXJ5T2JzZXJ2ZXIiLGZ1bmN0aW9uKGUpe3ZhciB0PWUucmVxSWQsbj1lLnJlcUVuZCxyPWUucmVzLGk9cy5nZXQodCk7aWYoaSl7aWYobilyZXR1cm4gdm9pZCBzLnBvcCh0KTtpKHIpfX0pfSh0LHtnZXRBcHA6anYsZ2V0Q3VycmVudFBhZ2VzOkx2fSksdWEoInN1YnNjcmliZUhhbmRsZXIiLGZ1bmN0aW9uKGUpe2koZS50eXBlLGUuZGF0YSxlLnBhZ2VJZCl9KSwibmF0aXZlIiE9PSR2LnJlbmRlcmVyKXt0KHVjLE5oKSx0KGNjLERoKSx0KGxjLHpoKTt2YXIgbz0iLyIrJHYuZW50cnlQYWdlUGF0aDtQdi5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT1vfSkubWV0YS5pc05WdWV8fHIodWMsT2JqZWN0LmNyZWF0ZShudWxsKSxbMV0pfWUoImFwaS4iK2ZjLGZ1bmN0aW9uKGUsdCl7bigib25XZWJJbnZva2VBcHBTZXJ2aWNlIixlLHQpfSksdCgib25XeHNJbnZva2VDYWxsTWV0aG9kIixVaCksdChkYyxWaCksdChwYyxXaCksdChoYyxIaCl9dmFyIFhoPXtnbG9iYWxEYXRhOnt9fTtmdW5jdGlvbiBZaChlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS5hbGxvd0RlZmF1bHQ7cmV0dXJuIHZvaWQgMD09PXQmJih0PSExKSxSaHx8KHQ/WGg6dm9pZCBjb25zb2xlLmVycm9yKCJbd2Fybl06IGdldEFwcCgpIGZhaWxlZC4gTGVhcm4gbW9yZTogaHR0cHM6Ly91bmlhcHAuZGNsb3VkLmlvL2NvbGxvY2F0aW9uL2ZyYW1lL3dpbmRvdz9pZD1nZXRhcHAuIikpfWZ1bmN0aW9uIEpoKCl7dmFyIGU9YWkoImdsb2JhbEV2ZW50Iiksbz1Udi5lbWl0O3h2LmNvbmZpZy5wcmVsb2FkP0N2LmtleS5hZGRFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixTYyk6Q3YuZ2xvYmFsRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigic3BsYXNoY2xvc2VkIixmdW5jdGlvbigpe0N2LmtleS5hZGRFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixTYyl9KSxDdi5nbG9iYWxFdmVudC5hZGRFdmVudExpc3RlbmVyKCJwYXVzZSIsZnVuY3Rpb24oKXtvKCJvbkFwcEVudGVyQmFja2dyb3VuZCIpfSksQ3YuZ2xvYmFsRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVzdW1lIixmdW5jdGlvbigpe3ZhciBlLHQsbixyLGk9YWMoKTtpJiZpLnVzZXJBY3Rpb24mJih0PShlPWkpLnBhdGgsbj1lLnF1ZXJ5LHI9ZS5yZWZlcnJlckluZm8sbmMocmMse3BhdGg6dCxxdWVyeTpuP3cobik6e30scmVmZXJyZXJJbmZvOnJ8fHt9fSkpLG8oIm9uQXBwRW50ZXJGb3JlZ3JvdW5kIixvYygpKX0pLEN2Lmdsb2JhbEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoIm5ldGNoYW5nZSIsZnVuY3Rpb24oKXt2YXIgZT1zb1tDdi5uZXR3b3JraW5mby5nZXRDdXJyZW50VHlwZSgpXXx8InVua25vd24iO3NpKCJvbk5ldHdvcmtTdGF0dXNDaGFuZ2UiLHtpc0Nvbm5lY3RlZDoibm9uZSIhPT1lLG5ldHdvcmtUeXBlOmV9KX0pO3ZhciB0PTA7Q3YuZ2xvYmFsRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigiS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLGZ1bmN0aW9uKGUpe3QhPT1lLmhlaWdodCYmc2koIm9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLHtoZWlnaHQ6dD1lLmhlaWdodH0pfSksZS5hZGRFdmVudExpc3RlbmVyKCJ1aXN0eWxlY2hhbmdlIixmdW5jdGlvbihlKXt2YXIgdD17dGhlbWU6ZS51aXN0eWxlfTskaChSaCwib25UaGVtZUNoYW5nZSIsdCksc2koIm9uVGhlbWVDaGFuZ2UiLHQpLHNpKCJvblVJU3R5bGVDaGFuZ2UiLHtzdHlsZTplLnVpc3R5bGV9KX0pLGUuYWRkRXZlbnRMaXN0ZW5lcigidW5pTVBOYXRpdmVFdmVudCIsZnVuY3Rpb24oZSl7c2koInVuaU1QTmF0aXZlRXZlbnQiLGUpfSksQ3YuZ2xvYmFsRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigicGx1c01lc3NhZ2UiLEtoKSxDdi5nbG9iYWxFdmVudC5hZGRFdmVudExpc3RlbmVyKCJXZWJ2aWV3UG9zdE1lc3NhZ2UiLEtoKX1mdW5jdGlvbiBLaChlKXtlLmRhdGEmJmUuZGF0YS50eXBlJiZjYShlLmRhdGEudHlwZSxlLmRhdGEuYXJnc3x8e30pfWZ1bmN0aW9uIFpoKGUpe3ZhciB0LG4scixpLG89KHQ9e3BhdGg6JHYuZW50cnlQYWdlUGF0aCxxdWVyeTokdi5lbnRyeVBhZ2VRdWVyeSxyZWZlcnJlckluZm86JHYucmVmZXJyZXJJbmZvfSxuPXQucGF0aCxyPXQucXVlcnksaT10LnJlZmVycmVySW5mbyxuYyhpYyx7cGF0aDpuLHF1ZXJ5OnI/dyhyKTp7fSxyZWZlcnJlckluZm86aXx8e30sY2hhbm5lbDpDdi5ydW50aW1lLmNoYW5uZWwsbGF1bmNoZXI6Q3YucnVudGltZS5sYXVuY2hlcn0pLG5jKHJjLGljKSxpYyk7JGgoZSwib25MYXVuY2giLG8pLCRoKGUsIm9uU2hvdyIsbyk7dmFyIGE9eHYucmVxdWlyZU1vZHVsZSgicGx1cyIpLmdldEFwcFN0YXRlOzI9PT0oYSYmTnVtYmVyKGEoKSkpJiYkaChlLCJvbkhpZGUiLG8pfWZ1bmN0aW9uIFFoKCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gMD09PShlPWUucmVwbGFjZSgvXC8kLywiIikpLmluZGV4T2YoIl8iKT9Ddi5pby5jb252ZXJ0TG9jYWxGaWxlU3lzdGVtVVJMKGUpOmV9dmFyIHQ9ZSh1byksbj1lKGxvKSxyPW4uc3BsaXQoIi8iKTtyLnBvcCgpLHI9ci5qb2luKCIvIiksQ3YuaW8ucmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSTChDdi5pby5jb252ZXJ0QWJzb2x1dGVGaWxlU3lzdGVtKHIpLGZ1bmN0aW9uKGUpe2UuY3JlYXRlUmVhZGVyKCkucmVhZEVudHJpZXMoZnVuY3Rpb24oZSl7ZSYmZS5sZW5ndGgmJmUuZm9yRWFjaChmdW5jdGlvbihlKXtlLmlzRGlyZWN0b3J5JiYwPT09ZS5mdWxsUGF0aC5pbmRleE9mKHQpJiYwIT09ZS5mdWxsUGF0aC5pbmRleE9mKG4pJiZlLnJlbW92ZVJlY3Vyc2l2ZWx5KCl9KX0pfSl9ZnVuY3Rpb24gZXYoZSx0KXt2YXIgbixyLGksbzsoUmg9ZSkuJHZtPWUsbj1lLGk9dC5vYnNlcnZhYmxlKHtsb2NhbGU6cnx8WmUuZ2V0TG9jYWxlKCl9KSxvPVtdLG4uJHdhdGNoTG9jYWxlPWZ1bmN0aW9uKGUpe28ucHVzaChlKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIiRsb2NhbGUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaS5sb2NhbGV9LHNldDpmdW5jdGlvbih0KXtpLmxvY2FsZT10LG8uZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gZSh0KX0pfX0pLE9iamVjdC5hc3NpZ24oUmgsWGgpO3ZhciBhPWUuJG9wdGlvbnMuZ2xvYmFsRGF0YXx8e307UmguZ2xvYmFsRGF0YT1PYmplY3QuYXNzaWduKGEsUmguZ2xvYmFsRGF0YSksamgoVHYub24se2dldEFwcDpZaCxnZXRDdXJyZW50UGFnZXM6UWN9KSxLYygpLGZ1bmN0aW9uKCl7aWYoJHYudGFiQmFyJiYkdi50YWJCYXIubGlzdCYmJHYudGFiQmFyLmxpc3QubGVuZ3RoKXskdi50YWJCYXIuc2VsZWN0ZWQ9MDt2YXIgZT0kdi50YWJCYXIubGlzdC5maW5kSW5kZXgoZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFnZVBhdGg9PT0kdi5lbnRyeVBhZ2VQYXRofSk7TGEuaW5pdCgkdi50YWJCYXIsZnVuY3Rpb24oZSx0KXtNdi5zd2l0Y2hUYWIoe3VybDoiLyIrZS5wYWdlUGF0aCxvcGVuVHlwZToic3dpdGNoVGFiIixmcm9tOiJ0YWJCYXIiLHN1Y2Nlc3M6ZnVuY3Rpb24oKXtUdi5lbWl0KCJvblRhYkl0ZW1UYXAiLHtpbmRleDp0LHRleHQ6ZS50ZXh0LHBhZ2VQYXRoOmUucGFnZVBhdGh9KX19KX0pLC0xIT09ZSYmMCE9PSgkdi50YWJCYXIuc2VsZWN0ZWQ9ZSkmJkxhLnN3aXRjaFRhYigkdi5lbnRyeVBhZ2VQYXRoKX19KCksSmgoKSxHaCgpLFpoKGUpLE92KFFoLDFlNCksJHYucmVhZHk9ITB9dmFyIHR2PVsidW5pLWFwcCIsInVuaS1sYXlvdXQiLCJ1bmktY29udGVudCIsInVuaS1tYWluIiwidW5pLXRvcC13aW5kb3ciLCJ1bmktbGVmdC13aW5kb3ciLCJ1bmktcmlnaHQtd2luZG93IiwidW5pLXRhYmJhciIsInVuaS1wYWdlIiwidW5pLXBhZ2UtaGVhZCIsInVuaS1wYWdlLXdyYXBwZXIiLCJ1bmktcGFnZS1ib2R5IiwidW5pLXBhZ2UtcmVmcmVzaCIsInVuaS1hY3Rpb25zaGVldCIsInVuaS1tb2RhbCIsInVuaS10b2FzdCIsInVuaS1yZXNpemUtc2Vuc29yIiwidW5pLXNoYWRvdy1yb290IiwidW5pLWFkIiwidW5pLWF1ZGlvIiwidW5pLWJ1dHRvbiIsInVuaS1jYW1lcmEiLCJ1bmktY2FudmFzIiwidW5pLWNoZWNrYm94IiwidW5pLWNoZWNrYm94LWdyb3VwIiwidW5pLWNvdmVyLWltYWdlIiwidW5pLWNvdmVyLXZpZXciLCJ1bmktZWRpdG9yIiwidW5pLWZvcm0iLCJ1bmktZnVuY3Rpb25hbC1wYWdlLW5hdmlnYXRvciIsInVuaS1pY29uIiwidW5pLWltYWdlIiwidW5pLWlucHV0IiwidW5pLWxhYmVsIiwidW5pLWxpdmUtcGxheWVyIiwidW5pLWxpdmUtcHVzaGVyIiwidW5pLW1hcCIsInVuaS1tb3ZhYmxlLWFyZWEiLCJ1bmktbW92YWJsZS12aWV3IiwidW5pLW5hdmlnYXRvciIsInVuaS1vZmZpY2lhbC1hY2NvdW50IiwidW5pLW9wZW4tZGF0YSIsInVuaS1waWNrZXIiLCJ1bmktcGlja2VyLXZpZXciLCJ1bmktcGlja2VyLXZpZXctY29sdW1uIiwidW5pLXByb2dyZXNzIiwidW5pLXJhZGlvIiwidW5pLXJhZGlvLWdyb3VwIiwidW5pLXJpY2gtdGV4dCIsInVuaS1zY3JvbGwtdmlldyIsInVuaS1zbGlkZXIiLCJ1bmktc3dpcGVyIiwidW5pLXN3aXBlci1pdGVtIiwidW5pLXN3aXRjaCIsInVuaS10ZXh0IiwidW5pLXRleHRhcmVhIiwidW5pLXZpZGVvIiwidW5pLXZpZXciLCJ1bmktd2ViLXZpZXciXTtmdW5jdGlvbiBudihlKXtpZigwPT09ZS5pbmRleE9mKCIjIikpe3ZhciB0PWUuc3Vic3RyKDEpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4hKCFlLmNvbXBvbmVudEluc3RhbmNlfHxlLmNvbXBvbmVudEluc3RhbmNlLmlkIT09dCl8fCEoIWUuZGF0YXx8IWUuZGF0YS5hdHRyc3x8ZS5kYXRhLmF0dHJzLmlkIT09dCl9fWlmKDA9PT1lLmluZGV4T2YoIi4iKSl7dmFyIG49ZS5zdWJzdHIoMSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLmRhdGEmJmZ1bmN0aW9uKGUsdCxuKXt2b2lkIDA9PT10JiYodD0iIik7dm9pZCAwPT09biYmKG49IiIpO2lmKHQpcmV0dXJuLTEhPT10LnNwbGl0KHJ2KS5pbmRleE9mKGUpO2lmKG4mJiJzdHJpbmciPT10eXBlb2YgbilyZXR1cm4tMSE9PW4uc3BsaXQocnYpLmluZGV4T2YoZSl9KG4sZS5kYXRhLnN0YXRpY0NsYXNzLGUuZGF0YS5jbGFzcyl9fX12YXIgcnY9L1xzKy87ZnVuY3Rpb24gaXYoZSl7ZS5wcm90b3R5cGUuY3JlYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIE12LmNyZWF0ZUludGVyc2VjdGlvbk9ic2VydmVyKHRoaXMsZSl9LGUucHJvdG90eXBlLmNyZWF0ZU1lZGlhUXVlcnlPYnNlcnZlcj1mdW5jdGlvbihlKXtyZXR1cm4gTXYuY3JlYXRlTWVkaWFRdWVyeU9ic2VydmVyKHRoaXMsZSl9LGUucHJvdG90eXBlLnNlbGVjdENvbXBvbmVudD1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24gZSh0LG4pe2lmKG4odC4kdm5vZGV8fHQuX3Zub2RlKSlyZXR1cm4gdDtmb3IodmFyIHI9dC4kY2hpbGRyZW4saT0wO2k8ci5sZW5ndGg7aSsrKXt2YXIgbz1lKHJbaV0sbik7aWYobylyZXR1cm4gb319KHRoaXMsbnYoZSkpfSxlLnByb3RvdHlwZS5zZWxlY3RBbGxDb21wb25lbnRzPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbiBlKHQsbixyKXtuKHQuJHZub2RlfHx0Ll92bm9kZSkmJnIucHVzaCh0KTtmb3IodmFyIGk9dC4kY2hpbGRyZW4sbz0wO288aS5sZW5ndGg7bysrKWUoaVtvXSxuLHIpO3JldHVybiByfSh0aGlzLG52KGUpLFtdKX19ZnVuY3Rpb24gb3YoZSx0LG4pe2lmKCFlLiRwYXJlbnQpcmV0dXJuIi0xIjt2YXIgcj1lLiR2bm9kZSxpPXIuY29udGV4dCxvPXIuZGF0YS5hdHRycy5faTtyZXR1cm4gbiYmayhyLmRhdGEsImtleSIpJiYobz1vKyI7IityLmRhdGEua2V5KSxpJiZpIT09dCYmaS5fJGlkP2kuXyRpZCsiOyIrdC5fJGlkKyIsIitvOnQuXyRpZCsiLCIrb312YXIgYXYsc3YsY3Y9ImFuZHJvaWQiPT09Q3Yub3MubmFtZS50b0xvd2VyQ2FzZSgpPzMwMDo3MDAsdXY9MDtmdW5jdGlvbiBsdihlKXtyZXR1cm4gZS5wcmV2ZW50RGVmYXVsdD1sLGUuc3RvcFByb3BhZ2F0aW9uPWwsKHQ9ZSkubXA9T2JqZWN0LmFzc2lnbih7IkB3YXJuaW5nIjoibXAgaXMgZGVwcmVjYXRlZCJ9LHQpLHQuX3Byb2Nlc3NlZD0hMCx0O3ZhciB0fVV1KCJvbktleWJvYXJkSGVpZ2h0Q2hhbmdlIixmdW5jdGlvbihlKXtpZigwPCh1dj1lLmhlaWdodCkpe3ZhciB0PWF2O2F2PW51bGwsdCYmdCgpfX0pO3ZhciBkdj17fTtkdlsyMF09ZnVuY3Rpb24oZSxzKXtlLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXSxuPWVbMV0scj1lWzJdO249U3RyaW5nKG4pO3ZhciBpPXMuZWxlbWVudHMuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5jaWQ9PT10JiZlLm5pZD09PW59KTtpZihpKXt2YXIgbz1yLnR5cGUsYT1sdihyKTsiZm9jdXMiPT09b3x8ImJsdXIiPT09bz9mdW5jdGlvbihlLHQpe2lmKGF2PW51bGwsc3YmJkV2KHN2KSwiZm9jdXMiPT09ZS50eXBlKXtpZighKDA8dXYpKXJldHVybiBzdj1PdihmdW5jdGlvbigpe2UuZGV0YWlsLmhlaWdodD11dix0KGUpfSxjdiksYXY9ZnVuY3Rpb24oKXtFdihzdiksZS5kZXRhaWwuaGVpZ2h0PXV2LHQoZSl9O2UuZGV0YWlsLmhlaWdodD11dn10KGUpfShhLGZ1bmN0aW9uKGUpe2kuZGlzcGF0Y2hFdmVudChvLGUpfSk6aS5kaXNwYXRjaEV2ZW50KG8sYSl9fSl9O3ZhciBmdj1mdW5jdGlvbihlLHQsbixyKXt0aGlzLnBhZ2VJZD1lLHRoaXMucGFnZVBhdGg9dCx0aGlzLnBhZ2VRdWVyeT1uLHRoaXMucGFnZVZtPXIsdGhpcy5iYXRjaERhdGE9W10sdGhpcy52bXM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLmluaXRpYWxpemVkPSExLHRoaXMucGFnZUNyZWF0ZURhdGE9ITEsdGhpcy5lbGVtZW50cz1bXSx0aGlzLl9pbml0KCl9O2Z1bmN0aW9uIHB2KGUsdCxuKXtlW3RdPW59ZnVuY3Rpb24gaHYoZSx0KXt2YXIgbixyLGk7Zm9yKHIgaW4gZSlpPWVbcl0sdih0W3JdLGkpfHxwdihufHwobj1PYmplY3QuY3JlYXRlKG51bGwpKSxyLGkpO3JldHVybiBufWZ1bmN0aW9uIHZ2KGUsdCxuKXt2YXIgcixpLG87Zm9yKHIgaW4gZSlpZihpPWVbcl0sbz10W3JdKXt2YXIgYT1odihpLG8pO2EmJnB2KG4scixhKX1lbHNlIHB2KG4scixpKTtyZXR1cm4gbn1mdW5jdGlvbiBndihuLHIpe3ZhciBlPXIuJG9wdGlvbnMubXBPcHRpb25zO3JldHVybiBlJiZBcnJheS5pc0FycmF5KGUuZXh0ZXJuYWxDbGFzc2VzKSYmZS5leHRlcm5hbENsYXNzZXMuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1yW2goZSldO3QmJihuPW4ucmVwbGFjZShlLHQpKX0pLG59ZnVuY3Rpb24gbXYoZSx0LG4pe3N3aXRjaCh0KXtjYXNlIHJhOm49Z3YodGhpcy5fJHN0cmluZ2lmeUNsYXNzKG4pLHRoaXMpO2JyZWFrO2Nhc2Ugb2E6bj1ndihuLHRoaXMpO2JyZWFrO2Nhc2UgaWE6bj10aGlzLl8kbm9ybWFsaXplU3R5bGVCaW5kaW5nKG4pO2JyZWFrO2Nhc2UgZWE6Y2FzZSBuYTpjYXNlIHRhOm49bj8xOjA7YnJlYWs7Y2FzZSBRbzpyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl8kbmV3RGF0YVtlXXx8KHRoaXMuXyRuZXdEYXRhW2VdPXt9KSxyPW5bUW9dfHwobltRb109W10pO2lmKHQuZm9ySXRlbXMpcmV0dXJuIHQuZmlsbCYmZnVuY3Rpb24oZSx0KXt2YXIgbixyO2lmKEFycmF5LmlzQXJyYXkoZSl8fCJzdHJpbmciPT10eXBlb2YgZSlmb3Iobj0wLHI9ZS5sZW5ndGg7bjxyO24rKyl0W25dPW47ZWxzZSBpZigibnVtYmVyIj09dHlwZW9mIGUpZm9yKG49MDtuPGU7bisrKXRbbl09bjtlbHNlIGlmKHUoZSkpZm9yKG49MCxyPU9iamVjdC5rZXlzKGUpLmxlbmd0aDtuPHI7bisrKXRbbl09bn0odC5mb3JJdGVtcyxyKSx0LmZvckl0ZW1zO3ZhciBpPXQuZm9ySW5kZXgsbz10LmtleTtrKHQsImtleUluZGV4Iik/KCJvYmplY3QiIT10eXBlb2YgcltpXSYmKHJbaV09e30pLHJbaV1bImsiK3Qua2V5SW5kZXhdPW8pOnJbaV09bztyZXR1cm4gb30uY2FsbCh0aGlzLGUsbil9cmV0dXJuKHRoaXMuXyRuZXdEYXRhW2VdfHwodGhpcy5fJG5ld0RhdGFbZV09e30pKVt0XT1ufWZ2LnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbigpe3ZhciBlLHQsbj10aGlzO2U9dGhpcy5wYWdlSWQsdD1mdW5jdGlvbihlKXt2YXIgcjtyPW4sZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0sbj1lWzFdO2R2W3RdKG4scil9KX0sKEJoW2VdfHwoQmhbZV09W10pKS5wdXNoKHQpfSxmdi5wcm90b3R5cGUuYWRkTW91bnRlZFZtPWZ1bmN0aW9uKGUpe2UuXyRtb3VudGVkKCksdGhpcy5hZGRWZFN5bmNDYWxsYmFjayhmdW5jdGlvbigpe2UuX19jYWxsX2hvb2soIm1vdW50ZWQiKX0pfSxmdi5wcm90b3R5cGUuYWRkVXBkYXRlZFZtPWZ1bmN0aW9uKGUpe2UuXyR1cGRhdGVkKCksdGhpcy5hZGRWZFN5bmNDYWxsYmFjayhmdW5jdGlvbigpe2UuX19jYWxsX2hvb2soInVwZGF0ZWQiKX0pfSxmdi5wcm90b3R5cGUuYWRkVmRTeW5jQ2FsbGJhY2s9ZnVuY3Rpb24oZSl7QyhlKSYmRmgucHVzaChlKX0sZnYucHJvdG90eXBlLmdldFZtPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnZtc1tlXX0sZnYucHJvdG90eXBlLmFkZFZtPWZ1bmN0aW9uKGUpe3ZhciBuPWUuXyRpZCx0PXRoaXMudm1zW25dO2lmKHQpe3ZhciByPW92KHQsdC4kcGFyZW50LHNjKTt0Ll8kaWQ9cix0aGlzLnZtc1tyXT10LHRoaXMuZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLmNpZDtlLmNpZD10PT09bj9yOnR9KX10aGlzLnZtc1tuXT1lfSxmdi5wcm90b3R5cGUucmVtb3ZlVm09ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5fJGlkO2U9PT10aGlzLnZtc1t0XSYmKHRoaXMuYmF0Y2hEYXRhPXRoaXMuYmF0Y2hEYXRhLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZVsxXVswXSE9PXR9KSxkZWxldGUgdGhpcy52bXNbdF0pfSxmdi5wcm90b3R5cGUuYWRkRWxlbWVudD1mdW5jdGlvbihlKXstMT09PXRoaXMuZWxlbWVudHMuaW5kZXhPZihlKSYmdGhpcy5lbGVtZW50cy5wdXNoKGUpfSxmdi5wcm90b3R5cGUucmVtb3ZlRWxlbWVudD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmVsZW1lbnRzLmluZGV4T2YoZSk7LTEhPT10JiZ0aGlzLmVsZW1lbnRzLnNwbGljZSh0LDEpfSxmdi5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT1bdCxuXTtyJiZpLnB1c2gociksdGhpcy5iYXRjaERhdGEucHVzaChbZSxpXSl9LGZ2LnByb3RvdHlwZS5maW5kPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMuYmF0Y2hEYXRhLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGVbMF09PT10JiZlWzFdWzBdPT09bn0pfSxmdi5wcm90b3R5cGUuc2VuZFBhZ2VDcmVhdGU9ZnVuY3Rpb24oZSl7dGhpcy5wYWdlQ3JlYXRlRGF0YT1lLFR2LnB1Ymxpc2hIYW5kbGVyKGNjLHtkYXRhOltbMixlXV0sb3B0aW9uczp7dGltZXN0YW1wOkRhdGUubm93KCl9fSxbdGhpcy5wYWdlSWRdKX0sZnYucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7dGhpcy5pbml0aWFsaXplZHx8KHRoaXMuaW5pdGlhbGl6ZWQ9ITAsdGhpcy5iYXRjaERhdGEucHVzaChbMTAsW3RoaXMucGFnZUlkLHRoaXMucGFnZVBhdGgsdGhpcy5wYWdlUXVlcnldXSkpO3ZhciBlPXRoaXMuYmF0Y2hEYXRhLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hKDY9PT1lWzBdJiYhT2JqZWN0LmtleXMoZVsxXVsxXSkubGVuZ3RoKX0pO3RoaXMuYmF0Y2hEYXRhLmxlbmd0aD0wLGUubGVuZ3RoJiZUdi5wdWJsaXNoSGFuZGxlcihjYyx7ZGF0YTplLG9wdGlvbnM6e3RpbWVzdGFtcDpEYXRlLm5vdygpfX0sW3RoaXMucGFnZUlkXSl9LGZ2LnByb3RvdHlwZS5yZXN0b3JlUGFnZUNyZWF0ZT1mdW5jdGlvbigpe3RoaXMuYmF0Y2hEYXRhLnB1c2goWzIsdGhpcy5wYWdlQ3JlYXRlRGF0YV0pfSxmdi5wcm90b3R5cGUucmVzdG9yZU1vdW50ZWREYXRhPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxuPWZ1bmN0aW9uKGUpe2UuXyRpZCYmdC5wdXNoKDQsZS5fJGlkLGUuXyRkYXRhLHZvaWQgMCksZS4kY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gbihlKX0pfTtuKHRoaXMucGFnZVZtKX0sZnYucHJvdG90eXBlLnJlc3RvcmVQYWdlQ3JlYXRlZD1mdW5jdGlvbigpe3RoaXMuYmF0Y2hEYXRhLnB1c2goWzEwLFt0aGlzLnBhZ2VJZCx0aGlzLnBhZ2VQYXRoLHRoaXMucGFnZVF1ZXJ5XV0pfSxmdi5wcm90b3R5cGUucmVzdG9yZT1mdW5jdGlvbigpe3RoaXMuaW5pdGlhbGl6ZWQ9ITAsdGhpcy5iYXRjaERhdGEubGVuZ3RoPTAsdGhpcy5yZXN0b3JlUGFnZUNyZWF0ZSgpLHRoaXMucmVzdG9yZU1vdW50ZWREYXRhKCksdGhpcy5yZXN0b3JlUGFnZUNyZWF0ZWQoKSx0aGlzLmZsdXNoKCl9LGZ2LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGU7dGhpcy5iYXRjaERhdGEubGVuZ3RoPTAsdGhpcy52bXM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLmluaXRpYWxpemVkPSExLHRoaXMuZWxlbWVudHMubGVuZ3RoPTAsZT10aGlzLnBhZ2VJZCxkZWxldGUgQmhbZV19O3ZhciB5dj1bIm9uTGF1bmNoIiwib25TaG93Iiwib25IaWRlIiwib25VbmlOVmlld01lc3NhZ2UiLCJvblBhZ2VOb3RGb3VuZCIsIm9uVGhlbWVDaGFuZ2UiLCJvbkVycm9yIiwib25VbmhhbmRsZWRSZWplY3Rpb24iLCJvbkluaXQiLCJvbkxvYWQiLCJvblJlYWR5Iiwib25VbmxvYWQiLCJvblB1bGxEb3duUmVmcmVzaCIsIm9uUmVhY2hCb3R0b20iLCJvblRhYkl0ZW1UYXAiLCJvbkFkZFRvRmF2b3JpdGVzIiwib25TaGFyZVRpbWVsaW5lIiwib25TaGFyZUFwcE1lc3NhZ2UiLCJvblJlc2l6ZSIsIm9uUGFnZVNjcm9sbCIsIm9uTmF2aWdhdGlvbkJhckJ1dHRvblRhcCIsIm9uQmFja1ByZXNzIiwib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDaGFuZ2VkIiwib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDb25maXJtZWQiLCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENsaWNrZWQiLCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dEZvY3VzQ2hhbmdlZCIsIm9uUGFnZVNob3ciLCJvblBhZ2VIaWRlIiwib25QYWdlUmVzaXplIiwib25TZXJ2aWNlQ3JlYXRlZCIsIm9uU2VydmljZUF0dGFjaGVkIl0sX3Y9WyJkYXRhIiwicHJvcGVydGllcyIsIm9wdGlvbnMiLCJyZWxhdGlvbnMiXTtmdW5jdGlvbiBidihpLG8pe3ZhciBlLHQ7X3YuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdCxuLHI7dD1pLChuPW8pW3I9ZV0mJk9iamVjdC5hc3NpZ24odFtyXXx8KHRbcl09e30pLG5bcl0pfSksby5leHRlcm5hbENsYXNzZXMmJihlPWkuZXh0ZXJuYWxDbGFzc2VzfHwoaS5leHRlcm5hbENsYXNzZXM9W10pLHQ9by5leHRlcm5hbENsYXNzZXMsZS5wdXNoLmFwcGx5KGUsdCkpLG8ucGF0aCYmKGkucGF0aD1vLnBhdGgpfWZ1bmN0aW9uIHd2KGcpeyFmdW5jdGlvbihlKXt2YXIgcj1lLmV4dGVuZDtlLmV4dGVuZD1mdW5jdGlvbih0KXt2YXIgbj0odD10fHx7fSkubWV0aG9kcztyZXR1cm4gbiYmT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihlKXstMSE9PXl2LmluZGV4T2YoZSkmJih0W2VdPW5bZV0sZGVsZXRlIG5bZV0pfSksci5jYWxsKHRoaXMsdCl9O3ZhciB0PWUuY29uZmlnLm9wdGlvbk1lcmdlU3RyYXRlZ2llcyxuPXQuY3JlYXRlZDt5di5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RbZV09bn0pLHQubXBPcHRpb25zPWZ1bmN0aW9uKGUsdCl7aWYoIWUpcmV0dXJuIHQ7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gYnYobixlKSx0JiZidihuLHQpLG59fShnKSxnLm1peGluKHtiZWZvcmVDcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy4kb3B0aW9ucztlLnN0b3JlJiYhZy5wcm90b3R5cGUuJHN0b3JlJiYoZy5wcm90b3R5cGUuJHN0b3JlPWUuc3RvcmUpO3ZhciBuLHIsaSxvLGEscyxjLHUsbCxkLGY9ZS53eHM7aWYoZiYmT2JqZWN0LmtleXMoZikuZm9yRWFjaChmdW5jdGlvbihlKXt0W2VdPWZbZV19KSwicGFnZSI9PT10aGlzLm1wVHlwZSl7dmFyIHA9anYoKTtwLiR2bSYmcC4kdm0uJGkxOG4mJih0aGlzLl9pMThuPXAuJHZtLiRpMThuKSx0aGlzLiRzY29wZT10aGlzLiRvcHRpb25zLnBhZ2VJbnN0YW5jZSxkZWxldGUodGhpcy4kc2NvcGUuJHZtPXRoaXMpLiRvcHRpb25zLnBhZ2VJbnN0YW5jZTt2YXIgaD10aGlzLiRzY29wZS5yb3V0ZSx2PXRoaXMuJHNjb3BlLiRwYWdlLmlkO3RoaXMuXyR2ZC5zZW5kUGFnZUNyZWF0ZShbdixoLChuPXRoaXMscj1oLGk9Ii8iK3Isbz1Qdi5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT1pfSksYT1PYmplY3QuYXNzaWduKHt9LCR2LndpbmRvdyxvLndpbmRvdykscz0hMD09PWEuZGlzYWJsZVNjcm9sbD8xOjAsYz1rKGEsIm9uUmVhY2hCb3R0b21EaXN0YW5jZSIpP3BhcnNlSW50KGEub25SZWFjaEJvdHRvbURpc3RhbmNlKTpLbyx1PXJ1KG4uJG9wdGlvbnMsIm9uUGFnZVNjcm9sbCIpPzE6MCxsPXJ1KG4uJG9wdGlvbnMsIm9uUmVhY2hCb3R0b20iKT8xOjAsZD1OYSgpLHt2ZXJzaW9uOnNjLGxvY2FsZTp4di5yZXF1aXJlTW9kdWxlKCJwbHVzIikuZ2V0TGFuZ3VhZ2UoKSxkaXNhYmxlU2Nyb2xsOnMsb25QYWdlU2Nyb2xsOnUsb25QYWdlUmVhY2hCb3R0b206bCxvblJlYWNoQm90dG9tRGlzdGFuY2U6YyxzdGF0dXNiYXJIZWlnaHQ6ZCx3aW5kb3dUb3A6YS50aXRsZU5WaWV3JiYiZmxvYXQiPT09YS50aXRsZU5WaWV3LnR5cGU/ZCtZZTowLHdpbmRvd0JvdHRvbTowPD1MYS5pbmRleE9mKHIpJiZMYS5jb3Zlcj9MYS5oZWlnaHQ6MH0pXSl9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7InBhZ2UiPT09dGhpcy5tcFR5cGUmJihQaCh0aGlzLiRzY29wZSwib25Mb2FkIixmdW5jdGlvbihuKXt2b2lkIDA9PT1uJiYobj17fSk7dmFyIHI9e307cmV0dXJuIE9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24odCl7dHJ5e3JbdF09YihuW3RdKX1jYXRjaChlKXtyW3RdPW5bdF19fSkscn0odGhpcy4kb3B0aW9ucy5wYWdlUXVlcnkpKSxQaCh0aGlzLiRzY29wZSwib25TaG93IikpfSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7InBhZ2UiPT09dGhpcy5tcFR5cGUmJlBoKHRoaXMuJHNjb3BlLCJvblVubG9hZCIpfSxtb3VudGVkOmZ1bmN0aW9uKCl7InBhZ2UiPT09dGhpcy5tcFR5cGUmJihQaCh0aGlzLiRzY29wZSwib25SZWFkeSIpLGZ1bmN0aW9uKGUpe2lmKCR2LnByZWxvYWRSdWxlKXt2YXIgdD0kdi5wcmVsb2FkUnVsZVtlXTt0JiZBcnJheS5pc0FycmF5KHQucGFja2FnZXMpJiZ0LnBhY2thZ2VzLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4tMT09PUtzLmluZGV4T2YoZSl9KS5sZW5ndGgmJmVjKHQucGFja2FnZXMpfX0odGhpcy4kc2NvcGUucm91dGUpKX19KX12YXIga3Y9e2luc3RhbGw6ZnVuY3Rpb24obyxlKXt2YXIgdCxuOyFmdW5jdGlvbihvKXtvLmNvbmZpZy5lcnJvckhhbmRsZXI9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWYoZSk7by51dGlsLndhcm4oIkVycm9yIGluICIrbisnOiAiJysoIkVycm9yIj09PXI/ZS50b1N0cmluZygpOmUpKyciJyx0KTt2YXIgaT0iZnVuY3Rpb24iPT10eXBlb2YganYmJmp2KCk7aSYmcnUoaS4kb3B0aW9ucywib25FcnJvciIpP2kuX19jYWxsX2hvb2soIm9uRXJyb3IiLGUpOmNvbnNvbGUuZXJyb3IoZSl9O3ZhciB0PW8uY29uZmlnLmlzUmVzZXJ2ZWRUYWc7by5jb25maWcuaXNSZXNlcnZlZFRhZz1mdW5jdGlvbihlKXtyZXR1cm4tMSE9PXR2LmluZGV4T2YoZSl8fHQoZSl9LG8uY29uZmlnLmlnbm9yZWRFbGVtZW50cz10djt2YXIgbj1vLmNvbmZpZy5nZXRUYWdOYW1lc3BhY2Uscj1bInN3aXRjaCIsImltYWdlIiwidGV4dCIsInZpZXciXTtvLmNvbmZpZy5nZXRUYWdOYW1lc3BhY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIX5yLmluZGV4T2YoZSkmJm4oZSl9fShvKSwodD1vKS5wcm90b3R5cGUuXyRzPW12LHQucHJvdG90eXBlLl8kc2V0RGF0YT1mdW5jdGlvbihlLHQpe3RoaXMuXyR2ZC5wdXNoKGUsdGhpcy5fJGlkLHQsND09PWUmJnZvaWQgMCl9LHQucHJvdG90eXBlLl8kbW91bnRlZD1mdW5jdGlvbigpe3RoaXMuXyR2ZCYmKHZ2KHRoaXMuXyRuZXdEYXRhLHRoaXMuXyRkYXRhLHRoaXMuXyR2ZE1vdW50ZWREYXRhKSx0aGlzLl8kZGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuXyRuZXdEYXRhKSksInBhZ2UiPT09dGhpcy5tcFR5cGUmJnRoaXMuXyR2ZC5mbHVzaCgpKX0sdC5wcm90b3R5cGUuXyR1cGRhdGVkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl8kdmQmJih2dih0aGlzLl8kbmV3RGF0YSx0aGlzLl8kZGF0YSx0aGlzLl8kdmRVcGRhdGVkRGF0YSksdGhpcy5fJGRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLl8kbmV3RGF0YSkpLHRoaXMuXyR2ZC5pbml0aWFsaXplZCYmT3YoZnVuY3Rpb24oKXtlLiRuZXh0VGljayhlLl8kdmQuZmx1c2guYmluZChlLl8kdmQpKX0sMCkpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsIl8kdmQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcm9vdC5fJHZkb21TeW5jfX0pLHQubWl4aW4oe2JlZm9yZUNyZWF0ZTpmdW5jdGlvbigpe3RoaXMuJG9wdGlvbnMubXBUeXBlJiYodGhpcy5tcFR5cGU9dGhpcy4kb3B0aW9ucy5tcFR5cGUpLCJhcHAiIT09dGhpcy5tcFR5cGUmJigicGFnZSI9PT10aGlzLm1wVHlwZSYmKHRoaXMuXyR2ZG9tU3luYz1uZXcgZnYodGhpcy4kb3B0aW9ucy5wYWdlSWQsdGhpcy4kb3B0aW9ucy5wYWdlUGF0aCx0aGlzLiRvcHRpb25zLnBhZ2VRdWVyeSx0aGlzKSksdGhpcy5fJHZkJiYodGhpcy5fJGlkPW92KHRoaXMsdGhpcy4kcGFyZW50LHNjKSx0aGlzLl8kdmQuYWRkVm0odGhpcyksdGhpcy5fJHZkTW91bnRlZERhdGE9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl8kc2V0RGF0YSg0LHRoaXMuXyR2ZE1vdW50ZWREYXRhKSx0aGlzLl8kZGF0YT1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuXyRuZXdEYXRhPU9iamVjdC5jcmVhdGUobnVsbCkpKX0sYmVmb3JlVXBkYXRlOmZ1bmN0aW9uKCl7aWYodGhpcy5fJHZkKXt2YXIgZT10aGlzLl8kdmQuZmluZCg0LHRoaXMuXyRpZCk7ZT8odGhpcy5fJGRhdGE9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl8kdmRVcGRhdGVkRGF0YT1lWzFdWzFdPU9iamVjdC5jcmVhdGUobnVsbCkpOih0aGlzLl8kdmRVcGRhdGVkRGF0YT1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuXyRzZXREYXRhKDYsdGhpcy5fJHZkVXBkYXRlZERhdGEpKSx0aGlzLl8kbmV3RGF0YT1PYmplY3QuY3JlYXRlKG51bGwpfX0sYmVmb3JlRGVzdHJveTpmdW5jdGlvbigpe3RoaXMuXyR2ZCYmKHRoaXMuXyR2ZC5yZW1vdmVWbSh0aGlzKSx0aGlzLl8kdmRvbVN5bmMmJnRoaXMuXyR2ZG9tU3luYy5kZXN0cm95KCkpfX0pLHd2KG8pLGl2KG8pLChuPW8pLnByb3RvdHlwZS51bmlJREhhc1JvbGU9ZnVuY3Rpb24oZSl7cmV0dXJuLTE8YygpLnJvbGUuaW5kZXhPZihlKX0sbi5wcm90b3R5cGUudW5pSURIYXNQZXJtaXNzaW9uPWZ1bmN0aW9uKGUpe3ZhciB0PWMoKS5wZXJtaXNzaW9uO3JldHVybiB0aGlzLnVuaUlESGFzUm9sZSgiYWRtaW4iKXx8LTE8dC5pbmRleE9mKGUpfSxuLnByb3RvdHlwZS51bmlJRFRva2VuVmFsaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gYygpLnRva2VuRXhwaXJlZD5EYXRlLm5vdygpfSxvLnByb3RvdHlwZS5nZXRPcGVuZXJFdmVudENoYW5uZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcm9vdC4kc2NvcGUuZXZlbnRDaGFubmVsfHwodGhpcy4kcm9vdC4kc2NvcGUuZXZlbnRDaGFubmVsPW5ldyBIYyksdGhpcy4kcm9vdC4kc2NvcGUuZXZlbnRDaGFubmVsfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoby5wcm90b3R5cGUsIiRwYWdlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHJvb3QuJHNjb3BlLiRwYWdlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLnByb3RvdHlwZSwiJG1wIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue3BhZ2U6dGhpcy4kcm9vdC4kc2NvcGV9fX0pO3ZhciByPW8ucHJvdG90eXBlLiRtb3VudDtvLnByb3RvdHlwZS4kbW91bnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2lmKCJhcHAiPT09dGhpcy5tcFR5cGUpe2lmKHRoaXMuJG9wdGlvbnMucmVuZGVyPWZ1bmN0aW9uKCl7fSx4di5jb25maWcucHJlbG9hZClyZXR1cm4gdm9pZCB4di5yZXF1aXJlTW9kdWxlKCJnbG9iYWxFdmVudCIpLmFkZEV2ZW50TGlzdGVuZXIoImxhdW5jaEFwcCIsZnVuY3Rpb24oKXtDdi51cGRhdGVDb25maWdJbmZvJiZDdi51cGRhdGVDb25maWdJbmZvKCksZXYobixvKSxyLmNhbGwobixlLHQpfSk7ZXYodGhpcyxvKX1yZXR1cm4gci5jYWxsKHRoaXMsZSx0KX0sby5wcm90b3R5cGUuJG5leHRUaWNrPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMscj10aGlzLl93YXRjaGVyLGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQsZT1uZXcgUHJvbWlzZShmdW5jdGlvbihlKXtyJiZuLl8kcXVldWUuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gcj09PWV9KT9GaC5wdXNoKGk/dC5iaW5kKG4pOmUpOm8ubmV4dFRpY2soaT9mdW5jdGlvbigpe3JldHVybiB0LmNhbGwobil9OmUpLGkmJmUoKX0pO3JldHVybiBpP3ZvaWQgMDplfX19O3JldHVybiBBaC5fXyR3eF9fPUloLFR2LnB1Ymxpc2hIYW5kbGVyPWZ1bmN0aW9uKGUsdCxuKXt0PUpTT04uc3RyaW5naWZ5KHQpLEFycmF5LmlzQXJyYXkobil8fChuPVtuXSk7dmFyIHI9InR5cGVvZiBVbmlWaWV3SlNCcmlkZ2UgIT09ICd1bmRlZmluZWQnICYmIFVuaVZpZXdKU0JyaWRnZS5zdWJzY3JpYmVIYW5kbGVyKFwiIitlKyciLCcrdCsiLF9fUEFHRV9JRF9fKSI7bi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PUN2LndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoU3RyaW5nKGUpKTt0JiZ0LmV2YWxKUyhyLnJlcGxhY2UoIl9fUEFHRV9JRF9fIixlKSl9KX0sVHYuaW52b2tlQ2FsbGJhY2tIYW5kbGVyPUlyLFR2LnJlbW92ZUNhbGxiYWNrSGFuZGxlcj1mdW5jdGlvbihlKXtkZWxldGUgRXJbZV19LHtfX3Z1ZVBsdWdpbjprdixfX2RlZmluZVBhZ2U6ZnVuY3Rpb24oZSx0KXtYY1tlXT10fSxfX3JlZ2lzdGVyQXBwOmV2LF9fcmVnaXN0ZXJQYWdlOnR1LHVuaTpBaCxnZXRBcHA6WWgsZ2V0Q3VycmVudFBhZ2VzOlFjLEV2ZW50Q2hhbm5lbDpIY319KCksTXY9dC51bmksanY9dC5nZXRBcHAsTHY9dC5nZXRDdXJyZW50UGFnZXM7cmV0dXJuIHR9ZnVuY3Rpb24gaW5pdFNlcnZpY2VKU0JyaWRnZShlKXt2YXIgcj1uZXcgZTtVbmlTZXJ2aWNlSlNCcmlkZ2U9e29uOnIuJG9uLmJpbmQociksb2ZmOnIuJG9mZi5iaW5kKHIpLG9uY2U6ci4kb25jZS5iaW5kKHIpLGVtaXQ6ci4kZW1pdC5iaW5kKHIpLHN1YnNjcmliZTpmdW5jdGlvbihlLHQpe3JldHVybiByLiRvbigidmlldy4iK2UsdCl9LHVuc3Vic2NyaWJlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIuJG9mZigidmlldy4iK2UsdCl9LHN1YnNjcmliZUhhbmRsZXI6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiByLiRlbWl0KCJ2aWV3LiIrZSx0LG4pfX19ZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VDb250ZXh0JDEoZSl7dmFyIHQsbj1lLndlZXgscj1lLlZ1ZSxpPW5ldyBlLldlZXhQbHVzKG4pOyhVbmlTZXJ2aWNlSlNCcmlkZ2V8fGluaXRTZXJ2aWNlSlNCcmlkZ2UociksdW5pKXx8KHQ9Y3JlYXRlU2VydmljZUNvbnRleHQocixuLGksVW5pU2VydmljZUpTQnJpZGdlLGUpLF9fdnVlUGx1Z2luPXQuX192dWVQbHVnaW4sX19kZWZpbmVQYWdlPXQuX19kZWZpbmVQYWdlLF9fcmVnaXN0ZXJBcHA9dC5fX3JlZ2lzdGVyQXBwLF9fcmVnaXN0ZXJQYWdlPXQuX19yZWdpc3RlclBhZ2UsdW5pPXQudW5pLGdldEFwcD10LmdldEFwcCxnZXRDdXJyZW50UGFnZXM9dC5nZXRDdXJyZW50UGFnZXMpO3JldHVybntfX3Z1ZVBsdWdpbjpfX3Z1ZVBsdWdpbixfX2RlZmluZVBhZ2U6X19kZWZpbmVQYWdlLF9fcmVnaXN0ZXJBcHA6X19yZWdpc3RlckFwcCxfX3JlZ2lzdGVyUGFnZTpfX3JlZ2lzdGVyUGFnZSxwbHVzOmksdW5pOnVuaSx3eDp1bmkuX18kd3hfX3x8dW5pLGdldEFwcDpnZXRBcHAsZ2V0Q3VycmVudFBhZ2VzOmdldEN1cnJlbnRQYWdlcyxVbmlTZXJ2aWNlSlNCcmlkZ2U6VW5pU2VydmljZUpTQnJpZGdlfX1mdW5jdGlvbiBzdHlsZU1peGluKGUpe2UucHJvdG90eXBlLl9fbWVyZ2Vfc3R5bGU9ZnVuY3Rpb24ocixlKXtpZih2b2lkIDA9PT1yJiYocj17fSkscil7dmFyIGk9ZXx8dGhpcy4kb3B0aW9ucy5zdHlsZTtPYmplY3Qua2V5cyhyKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWlbZV07aWYodCl7dmFyIG49cltlXTtPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBhPW5bZV0scz10W2VdOyJvYmplY3QiPT10eXBlb2YgYT8oIm9iamVjdCIhPXR5cGVvZiBzJiYocz10W2VdPXt9KSxPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PSEwO2lmKHNbZV0pZm9yKHZhciBuPWFbZV0uc2xpY2UoMSwzKSxyPXNbZV0uc2xpY2UoMSwzKSxpPTA7aTxyLmxlbmd0aDtpKyspe3ZhciBvPW5baV0tcltpXTtpZigwIT09byl7dD0wPG87YnJlYWt9fXQmJihzW2VdPWFbZV0pfSkpOnRbZV09YX0pfWVsc2UgaVtlXT1PYmplY3QuYXNzaWduKHt9LHJbZV0pfSksZXx8KHRoaXMuJG9wdGlvbnMuc3R5bGU9aSl9fX1mdW5jdGlvbiBiNjREZWNvZGVVbmljb2RlKGUpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoYXRvYihlKS5zcGxpdCgiIikubWFwKGZ1bmN0aW9uKGUpe3JldHVybiIlIisoIjAwIitlLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtMil9KS5qb2luKCIiKSl9ZnVuY3Rpb24gZ2V0Q3VycmVudFVzZXJJbmZvKCl7dmFyIGUsdD10aGlzLnVuaS5nZXRTdG9yYWdlU3luYygidW5pX2lkX3Rva2VuIil8fCIiLG49dC5zcGxpdCgiLiIpO2lmKCF0fHwzIT09bi5sZW5ndGgpcmV0dXJue3VpZDpudWxsLHJvbGU6W10scGVybWlzc2lvbjpbXSx0b2tlbkV4cGlyZWQ6MH07dHJ5e2U9SlNPTi5wYXJzZShiNjREZWNvZGVVbmljb2RlKG5bMV0pKX1jYXRjaChlKXt0aHJvdyBuZXcgRXJyb3IoIuiOt+WPluW9k+WJjeeUqOaIt+S/oeaBr+WHuumUme+8jOivpue7humUmeivr+S/oeaBr+S4uu+8miIrZS5tZXNzYWdlKX1yZXR1cm4gZS50b2tlbkV4cGlyZWQ9MWUzKmUuZXhwLGRlbGV0ZSBlLmV4cCxkZWxldGUgZS5pYXQsZX1mdW5jdGlvbiB1bmlJZE1peGluKGUsbil7ZS5wcm90b3R5cGUudW5pSURIYXNSb2xlPWZ1bmN0aW9uKGUpe3JldHVybi0xPGdldEN1cnJlbnRVc2VySW5mby5iaW5kKG4pKCkucm9sZS5pbmRleE9mKGUpfSxlLnByb3RvdHlwZS51bmlJREhhc1Blcm1pc3Npb249ZnVuY3Rpb24oZSl7dmFyIHQ9Z2V0Q3VycmVudFVzZXJJbmZvLmJpbmQobikoKS5wZXJtaXNzaW9uO3JldHVybiB0aGlzLnVuaUlESGFzUm9sZSgiYWRtaW4iKXx8LTE8dC5pbmRleE9mKGUpfSxlLnByb3RvdHlwZS51bmlJRFRva2VuVmFsaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gZ2V0Q3VycmVudFVzZXJJbmZvLmJpbmQobikoKS50b2tlbkV4cGlyZWQ+RGF0ZS5ub3coKX19V2VleEluc3RhbmNlLnByb3RvdHlwZS5yZXF1aXJlTW9kdWxlPWZ1bmN0aW9uKG4pe3ZhciByPWdldElkKHRoaXMpO2lmKHImJnRoaXMuZG9jdW1lbnQmJnRoaXMuZG9jdW1lbnQudGFza0NlbnRlcil7aWYoaXNSZWdpc3RlcmVkTW9kdWxlKG4pKXt2YXIgZT17fSx0PWdldE1vZHVsZURlc2NyaXB0aW9uKG4pLGk9ZnVuY3Rpb24odCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGhhbmRsZU1vZHVsZUdldHRlcihuLHQsbW9kdWxlR2V0dGVyKHIsbix0KSl9LHNldDpmdW5jdGlvbihlKXtyZXR1cm4gbW9kdWxlU2V0dGVyKHIsbix0LGUpfX0pfTtmb3IodmFyIG8gaW4gdClpKG8pO3JldHVybiBlfWNvbnNvbGUud2FybigiW0pTIEZyYW1ld29ya10g5b2T5YmN6L+Q6KGM55qE5Z+65bqn5LiN5YyF5ZCr5Y6f55Sf5o+S5Lu2WyIrbisiXe+8jOivt+WcqG1hbmlmZXN05Lit6YWN572u6K+l5o+S5Lu277yM6YeN5paw5Yi25L2c5YyF5ous6K+l5Y6f55Sf5o+S5Lu255qE6Ieq5a6a5LmJ6L+Q6KGM5Z+65bqnIil9ZWxzZSBjb25zb2xlLmVycm9yKCdbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gcmVxdWlyZU1vZHVsZSgiJytuKyciKSwgaW5zdGFuY2UgKCcrcisiKSBkb2Vzbid0IGV4aXN0IGFueW1vcmUuIil9LFdlZXhJbnN0YW5jZS5wcm90b3R5cGUuc3VwcG9ydHM9ZnVuY3Rpb24oZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBudWxsO3ZhciB0PWUubWF0Y2goL15AKFx3KylcLyhbXHctXSspKFwuKFx3KykpPyQvaSk7aWYodCl7dmFyIG49dFsxXSxyPXRbMl0saT10WzRdO3N3aXRjaChuKXtjYXNlIm1vZHVsZSI6cmV0dXJuIGlzUmVnaXN0ZXJlZE1vZHVsZShyLGkpO2Nhc2UiY29tcG9uZW50IjpyZXR1cm4gaXNSZWdpc3RlcmVkQ29tcG9uZW50KHIpfX1yZXR1cm4gbnVsbH0sV2VleEluc3RhbmNlLnByb3RvdHlwZS5pbXBvcnRTY3JpcHQ9ZnVuY3Rpb24oZSxyKXt2b2lkIDA9PT1yJiYocj17fSk7dmFyIGk9Z2V0SWQodGhpcyksbz1nZXRUYXNrQ2VudGVyKGkpO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0LG4pe28mJiJmdW5jdGlvbiI9PXR5cGVvZiBvLnNlbmR8fG4obmV3IEVycm9yKCdbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gaW1wb3J0IHNjcmlwdCAiJytlKyciLCBubyB0YXNrQ2VudGVyICgnK2krIikgbWF0Y2hlZC4iKSk7dHJ5e28uc2VuZCgibW9kdWxlIix7bW9kdWxlOiJzY3JpcHQiLG1ldGhvZDoiaW1wb3J0U2NyaXB0In0sW2Uscl0se2NhbGxiYWNrOltmdW5jdGlvbihlKXtyZXR1cm4gdChlKX0sZnVuY3Rpb24oZSl7cmV0dXJuIG4oZSl9XX0pfWNhdGNoKGUpe24oZSl9fSl9O3ZhciBkZWNvZGU9ZGVjb2RlVVJJQ29tcG9uZW50O2Z1bmN0aW9uIHBhcnNlUXVlcnkoZSl7dmFyIGk9e307cmV0dXJuKGU9ZS50cmltKCkucmVwbGFjZSgvXihcP3wjfCYpLywiIikpJiZlLnNwbGl0KCImIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoL1wrL2csIiAiKS5zcGxpdCgiPSIpLG49ZGVjb2RlKHQuc2hpZnQoKSkscj0wPHQubGVuZ3RoP2RlY29kZSh0LmpvaW4oIj0iKSk6bnVsbDt2b2lkIDA9PT1pW25dP2lbbl09cjpBcnJheS5pc0FycmF5KGlbbl0pP2lbbl0ucHVzaChyKTppW25dPVtpW25dLHJdfSksaX12YXIgTElGRUNZQ0xFX0hPT0tTPVsib25MYXVuY2giLCJvblNob3ciLCJvbkhpZGUiLCJvblVuaU5WaWV3TWVzc2FnZSIsIm9uUGFnZU5vdEZvdW5kIiwib25UaGVtZUNoYW5nZSIsIm9uRXJyb3IiLCJvblVuaGFuZGxlZFJlamVjdGlvbiIsIm9uTG9hZCIsIm9uUmVhZHkiLCJvblVubG9hZCIsIm9uUHVsbERvd25SZWZyZXNoIiwib25SZWFjaEJvdHRvbSIsIm9uVGFiSXRlbVRhcCIsIm9uQWRkVG9GYXZvcml0ZXMiLCJvblNoYXJlVGltZWxpbmUiLCJvblNoYXJlQXBwTWVzc2FnZSIsIm9uUmVzaXplIiwib25QYWdlU2Nyb2xsIiwib25OYXZpZ2F0aW9uQmFyQnV0dG9uVGFwIiwib25CYWNrUHJlc3MiLCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENoYW5nZWQiLCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENvbmZpcm1lZCIsIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2xpY2tlZCIsIm9uUGFnZVNob3ciLCJvblBhZ2VIaWRlIiwib25QYWdlUmVzaXplIl07ZnVuY3Rpb24gcGFyc2VRdWVyeUJ5QnVuZGxlVXJsKGUpe3ZhciB0PXt9O2lmKGUmJiJzdHJpbmciPT10eXBlb2YgZSl7dmFyIG49ZS5pbmRleE9mKCI/Iik7aWYoLTEhPT1uKXt2YXIgcj1lLnN1YnN0cihuKzEpOyIuanMiPT09ci5zdWJzdHIoLTMpJiYocj1yLnN1YnN0cigwLHIubGVuZ3RoLTMpKSx0PXBhcnNlUXVlcnkocil9fXJldHVybiB0fXZhciBJTlNUQU5DRV9JRD0iW1tDdXJyZW50SW5zdGFuY2VJZF1dIjtmdW5jdGlvbiBnZXRJZCQxKGUpe3JldHVybiBlW0lOU1RBTkNFX0lEXX1mdW5jdGlvbiBpbml0U2NvcGUodCxlKXt2YXIgbj1lLmdldEN1cnJlbnRQYWdlcygpLHI9bltuLmxlbmd0aC0xXTtpZih0aGlzLiRvcHRpb25zLnJvdXRlPT09ci5yb3V0ZSlyLiR2bT10aGlzLHJbSU5TVEFOQ0VfSURdPWdldElkJDEodCk7ZWxzZSBpZih0LmNvbmZpZy5vbGRJbnN0YW5jZUlkKXt2YXIgaT1lLmdldEN1cnJlbnRQYWdlcyghMCkuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZ2V0SWQkMShlKT09PXQuY29uZmlnLm9sZEluc3RhbmNlSWR9KTtpJiYoaS4kdm09dGhpcyl9dGhpcy4kc2NvcGU9cn1mdW5jdGlvbiBsaWZlY3ljbGVNaXhpbihyLGksbyl7dmFyIHQ9ci5jb25maWcub3B0aW9uTWVyZ2VTdHJhdGVnaWVzLG49dC5jcmVhdGVkO0xJRkVDWUNMRV9IT09LUy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RbZV09bn0pO3ZhciBhPXBhcnNlUXVlcnlCeUJ1bmRsZVVybChpLmNvbmZpZy5idW5kbGVVcmwpO3IubWl4aW4oe2JlZm9yZUNyZWF0ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5fJHdlZXg9aTt0cnl7dmFyIHQ9by5nZXRBcHAoe2FsbG93RGVmYXVsdDohMH0pO3QmJiF0aGlzLiRzdG9yZSYmKHQuJHN0b3JlfHx0LiR2bSYmdC4kdm0uJHN0b3JlKSYmKHRoaXMuJHN0b3JlPXQuJHN0b3JlfHx0LiR2bS4kc3RvcmUpfWNhdGNoKGUpe31zd2l0Y2godGhpcy4kb3B0aW9ucy5tcFR5cGUpe2Nhc2UiYXBwIjppZih0aGlzLm1wVHlwZT0iYXBwIix0aGlzLiRvcHRpb25zLnJlbmRlcj1mdW5jdGlvbigpe30sby53ZWV4LmNvbmZpZy5wcmVsb2FkKW8ud2VleC5yZXF1aXJlTW9kdWxlKCJnbG9iYWxFdmVudCIpLmFkZEV2ZW50TGlzdGVuZXIoImxhdW5jaEFwcCIsZnVuY3Rpb24oKXtvLnBsdXMudXBkYXRlQ29uZmlnSW5mbyYmby5wbHVzLnVwZGF0ZUNvbmZpZ0luZm8oKSxvLl9fcmVnaXN0ZXJBcHAoZSxyKX0pO2Vsc2Ugby5fX3JlZ2lzdGVyQXBwKHRoaXMscik7YnJlYWs7Y2FzZSJwYWdlIjp0aGlzLm1wVHlwZT0icGFnZSI7dmFyIG49by5wbHVzLndlYnZpZXcuY3VycmVudFdlYnZpZXcoKTtuLl9fcHJlbG9hZF9fPyhuLmFkZEV2ZW50TGlzdGVuZXIoInNob3ciLGZ1bmN0aW9uKCl7IWUuJHNjb3BlJiZpbml0U2NvcGUuY2FsbChlLGksbyksZS5fX2NhbGxfaG9vaygib25TaG93Iil9KSxuLmFkZEV2ZW50TGlzdGVuZXIoImhpZGUiLGZ1bmN0aW9uKCl7ZS5fX2NhbGxfaG9vaygib25IaWRlIil9KSk6KDA9PT1vLmdldEN1cnJlbnRQYWdlcygpLmxlbmd0aCYmby5fX3JlZ2lzdGVyUGFnZSh7dXJsOmkuY29uZmlnLmJ1bmRsZVVybCxwYXRoOiIvIit0aGlzLiRvcHRpb25zLnJvdXRlLHdlYnZpZXc6bn0pLGluaXRTY29wZS5jYWxsKHRoaXMsaSxvKSl9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7aWYoInBhZ2UiPT09dGhpcy4kb3B0aW9ucy5tcFR5cGUpe3ZhciBlPW8ucGx1cy53ZWJ2aWV3LmN1cnJlbnRXZWJ2aWV3KCk7aWYoZS5fX3ByZWxvYWRfXyl7dmFyIHQ9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLGEpO2lmKGUuX19xdWVyeV9fKXRyeXtPYmplY3QuYXNzaWduKHQsSlNPTi5wYXJzZShlLl9fcXVlcnlfXykpfWNhdGNoKGUpe310aGlzLl9fY2FsbF9ob29rKCJvbkxvYWQiLHQpfWVsc2V7dmFyIG49T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLGEpLHI9by5nZXRDdXJyZW50UGFnZXMoKTtPYmplY3QuYXNzaWduKG4scltyLmxlbmd0aC0xXS5vcHRpb25zKSx0aGlzLl9fY2FsbF9ob29rKCJvbkxvYWQiLG4pLHRoaXMuX19jYWxsX2hvb2soIm9uU2hvdyIpfX19LG1vdW50ZWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzOyJwYWdlIj09PXRoaXMuJG9wdGlvbnMubXBUeXBlJiYodGhpcy5fX2NhbGxfaG9vaygib25SZWFkeSIpLHRoaXMuJG9wdGlvbnMub25QYWdlU2Nyb2xsJiZ0aGlzLiRlbC5hZGRFdmVudCgic2Nyb2xsIixmdW5jdGlvbihlKXtlLnNjcm9sbFRvcD1lLmRldGFpbC5zY3JvbGxUb3AsdC5fX2NhbGxfaG9vaygib25QYWdlU2Nyb2xsIixlKX0pLHRoaXMuJG9wdGlvbnMub25SZWFjaEJvdHRvbSYmdGhpcy4kZWwuYWRkRXZlbnQoInNjcm9sbHRvbG93ZXIiLGZ1bmN0aW9uKGUpe3QuX19jYWxsX2hvb2soIm9uUmVhY2hCb3R0b20iLGUpfSkpfSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7InBhZ2UiPT09dGhpcy4kb3B0aW9ucy5tcFR5cGUmJnRoaXMuX19jYWxsX2hvb2soIm9uVW5sb2FkIil9fSl9ZnVuY3Rpb24gYnJvYWRjYXN0KGUsdCl7Zm9yKHZhciBuPVtdLHI9YXJndW1lbnRzLmxlbmd0aC0yOzA8ci0tOyluW3JdPWFyZ3VtZW50c1tyKzJdO2Zvcih2YXIgaT10aGlzLiRjaGlsZHJlbixvPWkubGVuZ3RoLGE9MDthPG87YSsrKXt2YXIgcz1pW2FdLGM9cy4kb3B0aW9ucy5uYW1lO2lmKH5lLmluZGV4T2YoYykpcmV0dXJuIHMuJGVtaXQuYXBwbHkocyxbdF0uY29uY2F0KG4pKSwhMTtpZighMT09PWJyb2FkY2FzdC5hcHBseShzLFtlLHRdLmNvbmNhdChbbl0pKSlyZXR1cm4hMX19dmFyIGVtaXR0ZXI9e21ldGhvZHM6eyR0cmlnZ2VyOmZ1bmN0aW9uKGUsdCl7dGhpcy4kZW1pdChlLHByb2Nlc3NDdXN0b21FdmVudC5jYWxsKHRoaXMsZSx0LHRoaXMuJGVsKSl9LCRkaXNwYXRjaDpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bXSxyPWFyZ3VtZW50cy5sZW5ndGgtMjswPHItLTspbltyXT1hcmd1bWVudHNbcisyXTsic3RyaW5nIj09dHlwZW9mIGUmJihlPVtlXSk7Zm9yKHZhciBpPXRoaXMuJHBhcmVudHx8dGhpcy4kcm9vdCxvPWkuJG9wdGlvbnMubmFtZTtpJiYoIW98fCF+ZS5pbmRleE9mKG8pKTspKGk9aS4kcGFyZW50KSYmKG89aS4kb3B0aW9ucy5uYW1lKTtpJiZpLiRlbWl0LmFwcGx5KGksW3RdLmNvbmNhdChuKSl9LCRicm9hZGNhc3Q6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49W10scj1hcmd1bWVudHMubGVuZ3RoLTI7MDxyLS07KW5bcl09YXJndW1lbnRzW3IrMl07InN0cmluZyI9PXR5cGVvZiBlJiYoZT1bZV0pLGJyb2FkY2FzdC5hcHBseSh0aGlzLFtlLHRdLmNvbmNhdChuKSl9fX0sbGlzdGVuZXJzPXtwcm9wczp7aWQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dmFyIG49dGhpczt0aGlzLl9hZGRMaXN0ZW5lcnModGhpcy5pZCksdGhpcy4kd2F0Y2goImlkIixmdW5jdGlvbihlLHQpe24uX3JlbW92ZUxpc3RlbmVycyh0LCEwKSxuLl9hZGRMaXN0ZW5lcnMoZSwhMCl9KX0sYmVmb3JlRGVzdHJveTpmdW5jdGlvbigpe3RoaXMuX3JlbW92ZUxpc3RlbmVycyh0aGlzLmlkKX0sbWV0aG9kczp7X2FkZExpc3RlbmVyczpmdW5jdGlvbih0LG4pe3ZhciByPXRoaXM7aWYoIW58fHQpe3ZhciBpPXRoaXMuJG9wdGlvbnMubGlzdGVuZXJzOyJPYmplY3QiPT09dHlwb2YoaSkmJk9iamVjdC5rZXlzKGkpLmZvckVhY2goZnVuY3Rpb24oZSl7bj8wIT09ZS5pbmRleE9mKCJAIikmJjAhPT1lLmluZGV4T2YoInVuaS0iKSYmci5fJGJ1cy4kb24oInVuaS0iK2UrIi0iK3QscltpW2VdXSk6MD09PWUuaW5kZXhPZigiQCIpP3IuJG9uKCJ1bmktIitlLnN1YnN0cigxKSxyW2lbZV1dKTowPT09ZS5pbmRleE9mKCJ1bmktIik/ci5fJGJ1cy4kb24oZSxyW2lbZV1dKTp0JiZyLl8kYnVzLiRvbigidW5pLSIrZSsiLSIrci4kcGFnZS5pZCsiLSIrdCxyW2lbZV1dKX0pfX0sX3JlbW92ZUxpc3RlbmVyczpmdW5jdGlvbih0LG4pe3ZhciByPXRoaXM7aWYoIW58fHQpe3ZhciBpPXRoaXMuJG9wdGlvbnMubGlzdGVuZXJzOyJPYmplY3QiPT09dHlwb2YoaSkmJk9iamVjdC5rZXlzKGkpLmZvckVhY2goZnVuY3Rpb24oZSl7bj8wIT09ZS5pbmRleE9mKCJAIikmJjAhPT1lLmluZGV4T2YoInVuaS0iKSYmci5fJGJ1cy4kb2ZmKCJ1bmktIitlKyItIit0LHJbaVtlXV0pOjA9PT1lLmluZGV4T2YoIkAiKT9yLiRvZmYoInVuaS0iK2Uuc3Vic3RyKDEpLHJbaVtlXV0pOjA9PT1lLmluZGV4T2YoInVuaS0iKT9yLl8kYnVzLiRvZmYoZSxyW2lbZV1dKTp0JiZyLl8kYnVzLiRvZmYoInVuaS0iK2UrIi0iK3IuJHBhZ2UuaWQrIi0iK3QscltpW2VdXSl9KX19fX0sX2FkRGF0YUNhY2hlPXt9O2Z1bmN0aW9uIGdldEFkRGF0YShlLHQsbixyLGksbyl7dmFyIGE9dCsiLSIrbixzPV9hZERhdGFDYWNoZVthXTtzJiYwPHMubGVuZ3RoP2kocy5zcGxpY2UoMCwxKVswXSk6ZS5hZC5nZXRBZHMoe2FkcGlkOnQsY291bnQ6NSx3aWR0aDpuLGV4dDp7Y2hhbm5lbDpyfX0sZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hZHM7aSh0LnNwbGljZSgwLDEpWzBdKSxfYWREYXRhQ2FjaGVbYV09cz9zLmNvbmNhdCh0KTp0fSxmdW5jdGlvbihlKXtvKHtlcnJDb2RlOmUuY29kZSxlcnJNc2c6ZS5tZXNzYWdlfSl9KX1mdW5jdGlvbiBnZXRBZChuLHIpe3JldHVybntuYW1lOiJBZCIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXIsbGlzdGVuZXJzXSxwcm9wczp7YWRwaWQ6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6IiJ9LGRhdGE6e3R5cGU6T2JqZWN0fSx3aWR0aDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sY2hhbm5lbDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57YWRXaWR0aDowLGFkRGF0YTp7fX19LG1vdW50ZWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKHRoaXMuZGF0YSl0aGlzLl9maWxsRGF0YSh0aGlzLmRhdGEpO2Vsc2UgaWYodGhpcy5hZHBpZCl7aWYodGhpcy53aWR0aCYmMDx0aGlzLndpZHRoLmxlbmd0aCl7dmFyIGU9cGFyc2VGbG9hdCh0aGlzLndpZHRoKTtyZXR1cm4vXGQrW3VyXXB4JC9pLnRlc3QodGhpcy53aWR0aCk/dGhpcy5hZFdpZHRoPXVweDJweChlKTp0aGlzLmFkV2lkdGg9ZSx2b2lkIHRoaXMuX2xvYWREYXRhKCl9c2V0VGltZW91dChmdW5jdGlvbigpe24ucmVxdWlyZU1vZHVsZSgiZG9tIikuZ2V0Q29tcG9uZW50UmVjdCh0LiRyZWZzLmFkLGZ1bmN0aW9uKGUpe3QuYWRXaWR0aD0wPT09ZS5zaXplLndpZHRoPy0xOmUuc2l6ZS53aWR0aCx0Ll9sb2FkRGF0YSgpfSl9LDUwKX19LHdhdGNoOnthZHBpZDpmdW5jdGlvbihlKXtlJiZ0aGlzLl9sb2FkRGF0YShlKX0sZGF0YTpmdW5jdGlvbihlKXtlJiZ0aGlzLl9maWxsRGF0YShlKX19LG1ldGhvZHM6e19vbmRvd25sb2FkY2hhbmdlOmZ1bmN0aW9uKGUpe3RoaXMuJHRyaWdnZXIoImRvd25sb2FkY2hhbmdlIixlLmRldGFpbCl9LF9vbmRpc2xpa2U6ZnVuY3Rpb24oZSl7dGhpcy4kdHJpZ2dlcigiY2xvc2UiLGUuZGV0YWlsKX0sX2xvYWREYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7Z2V0QWREYXRhKHIucGx1c3x8bmV3IHIuV2VleFBsdXMoci53ZWV4KSxlfHx0aGlzLmFkcGlkLHRoaXMuYWRXaWR0aCx0aGlzLmNoYW5uZWwsZnVuY3Rpb24oZSl7dC5fZmlsbERhdGEoZSl9LGZ1bmN0aW9uKGUpe3QuJHRyaWdnZXIoImVycm9yIixlKX0pfSxfZmlsbERhdGE6ZnVuY3Rpb24oZSl7dGhpcy5hZERhdGE9ZSx0aGlzLiR0cmlnZ2VyKCJsb2FkIix7fSl9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9e30sbj10aGlzLiRsaXN0ZW5lcnM7cmV0dXJuIG4uZG93bmxvYWRjaGFuZ2UmJih0LmRvd25sb2FkY2hhbmdlPXRoaXMuX29uZG93bmxvYWRjaGFuZ2UpLG4uY2xvc2UmJih0LmRpc2xpa2U9dGhpcy5fb25kaXNsaWtlKSxlKCJ1LWFkIix0aGlzLl9nKHtyZWY6ImFkIixhdHRyczp7ZGF0YTp0aGlzLmFkRGF0YSxyZW5kZXJpbmc6ITB9LG9uOnR9LG4pLFtdLDEpfX19ZnVuY3Rpb24gaW5pdCQzKGUsdCxuKXtlLmNvbXBvbmVudCgiYWQiLGdldEFkKHQsbikpfXZhciBfYWREYXRhQ2FjaGUkMT17fTtmdW5jdGlvbiBnZXRBZERhdGEkMShlLHQsbixyLGksbyl7dmFyIGE9dCsiLSIrbixzPV9hZERhdGFDYWNoZSQxW2FdO3MmJjA8cy5sZW5ndGg/aShzLnNwbGljZSgwLDEpWzBdKTplLmFkLmdldERyYXdBZHMoe2FkcGlkOnQsY291bnQ6Myx3aWR0aDpuLGhlaWdodDpyfSxmdW5jdGlvbihlKXt2YXIgdD1lLmFkcztpKHQuc3BsaWNlKDAsMSlbMF0pLF9hZERhdGFDYWNoZSQxW2FdPXM/cy5jb25jYXQodCk6dH0sZnVuY3Rpb24oZSl7byh7ZXJyQ29kZTplLmNvZGUsZXJyTXNnOmUubWVzc2FnZX0pfSl9ZnVuY3Rpb24gZ2V0QWQkMShlLG4pe3JldHVybntuYW1lOiJBZERyYXciLGlzUmVzZXJ2ZWQ6ITAsbWl4aW5zOltlbWl0dGVyLGxpc3RlbmVyc10scHJvcHM6e2FkcGlkOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OiIifSxkYXRhOnt0eXBlOk9iamVjdH0sd2lkdGg6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue2FkV2lkdGg6MCxhZEhlaWdodDowLGFkRGF0YTp7fX19LG1vdW50ZWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuZGF0YT90aGlzLl9maWxsRGF0YSh0aGlzLmRhdGEpOnRoaXMuYWRwaWQmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnJlcXVpcmVNb2R1bGUoImRvbSIpLmdldENvbXBvbmVudFJlY3QodC4kcmVmcy5hZCxmdW5jdGlvbihlKXt0LmFkV2lkdGg9MD09PWUuc2l6ZS53aWR0aD8tMTplLnNpemUud2lkdGgsdC5hZEhlaWdodD0wPT09ZS5zaXplLmhlaWdodD8tMTplLnNpemUuaGVpZ2h0LHQuX2xvYWREYXRhKCl9KX0sMTAwKX0sd2F0Y2g6e2FkcGlkOmZ1bmN0aW9uKGUpe2UmJnRoaXMuX2xvYWREYXRhKGUpfSxkYXRhOmZ1bmN0aW9uKGUpe2UmJnRoaXMuX2ZpbGxEYXRhKGUpfX0sYmVmb3JlRGVzdHJveTpmdW5jdGlvbigpeyhuLnBsdXN8fG5ldyBuLldlZXhQbHVzKG4ud2VleCkpLmFkLnJlbGVhc2VBZERhdGEodGhpcy5hZERhdGEpfSxtZXRob2RzOntfb25kaXNsaWtlOmZ1bmN0aW9uKGUpe3RoaXMuJHRyaWdnZXIoImNsb3NlIixlLmRldGFpbCl9LF9sb2FkRGF0YTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2dldEFkRGF0YSQxKG4ucGx1c3x8bmV3IG4uV2VleFBsdXMobi53ZWV4KSxlfHx0aGlzLmFkcGlkLHRoaXMuYWRXaWR0aCx0aGlzLmFkSGVpZ2h0LGZ1bmN0aW9uKGUpe3QuX2ZpbGxEYXRhKGUpfSxmdW5jdGlvbihlKXt0LiR0cmlnZ2VyKCJlcnJvciIsZSl9KX0sX2ZpbGxEYXRhOmZ1bmN0aW9uKGUpe3RoaXMuYWREYXRhPWUsdGhpcy4kdHJpZ2dlcigibG9hZCIse30pfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXt9LG49dGhpcy4kbGlzdGVuZXJzO3JldHVybiBuLmNsb3NlJiYodC5kaXNsaWtlPXRoaXMuX29uZGlzbGlrZSksZSgidS1hZC1kcmF3Iix0aGlzLl9nKHtyZWY6ImFkIixhdHRyczp7ZGF0YTp0aGlzLmFkRGF0YSxyZW5kZXJpbmc6ITB9LG9uOnR9LG4pLFtdLDEpfX19ZnVuY3Rpb24gaW5pdCQ0KGUsdCxuKXtlLmNvbXBvbmVudCgiYWQtZHJhdyIsZ2V0QWQkMSh0LG4pKX12YXIgT1BFTl9UWVBFUz1bImFncmVlUHJpdmFjeSIsImRpc2FncmVlUHJpdmFjeSJdO2Z1bmN0aW9uIGdldEJ1dHRvbihlLHIpe3JldHVybntuYW1lOiJCdXR0b24iLGlzUmVzZXJ2ZWQ6ITAsbWl4aW5zOltlbWl0dGVyLGxpc3RlbmVyc10scHJvcHM6e2hvdmVyQ2xhc3M6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6ImJ1dHRvbi1ob3ZlciJ9LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0saWQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LHR5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6ImRlZmF1bHQifSxzaXplOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJkZWZhdWx0In0scGxhaW46e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxsb2FkaW5nOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0saG92ZXJTdG9wUHJvcGFnYXRpb246e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxob3ZlclN0YXJ0VGltZTp7dHlwZTpOdW1iZXIsZGVmYXVsdDoyMH0saG92ZXJTdGF5VGltZTp7dHlwZTpOdW1iZXIsZGVmYXVsdDo3MH0sb3BlblR5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGZvcm1UeXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIiLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm5+WyIiLCJzdWJtaXQiLCJyZXNldCJdLmluZGV4T2YoZSl9fX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntUWVBFUzp7ZGVmYXVsdDoiZCIscHJpbWFyeToicCIsd2FybjoidyJ9LGNsaWNrRnVuY3Rpb246bnVsbH19LG1ldGhvZHM6e19vbkNsaWNrOmZ1bmN0aW9uKGUsdCl7aWYoIXRoaXMuZGlzYWJsZWQmJigiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5jbGlja0Z1bmN0aW9uJiZ0aGlzLmNsaWNrRnVuY3Rpb24oZSksdGhpcy5mb3JtVHlwZSYmdGhpcy4kZGlzcGF0Y2goIkZvcm0iLCJzdWJtaXQiPT09dGhpcy5mb3JtVHlwZT8idW5pLWZvcm0tc3VibWl0IjoidW5pLWZvcm0tcmVzZXQiLHt0eXBlOnRoaXMuZm9ybVR5cGV9LHRoaXMpLDA8dGhpcy5vcGVuVHlwZS5sZW5ndGgmJjA8PU9QRU5fVFlQRVMuaW5kZXhPZih0aGlzLm9wZW5UeXBlKSkpe3ZhciBuPXIucGx1c3x8bmV3IHIuV2VleFBsdXMoci53ZWV4KTt0aGlzWyJfIit0aGlzLm9wZW5UeXBlXShuKSx0aGlzLiR0cmlnZ2VyKHRoaXMub3BlblR5cGUudG9Mb3dlckNhc2UoKSx7fSl9fSxfYWdyZWVQcml2YWN5OmZ1bmN0aW9uKGUpe2UucnVudGltZS5hZ3JlZVByaXZhY3koKX0sX2Rpc2FncmVlUHJpdmFjeTpmdW5jdGlvbihlKXtlLnJ1bnRpbWUuZGlzYWdyZWVQcml2YWN5KCl9LF9nZXRDbGFzczpmdW5jdGlvbihlKXt2YXIgdD0idWItIit0aGlzLlRZUEVTW3RoaXMudHlwZV0rZTtyZXR1cm4gdGhpcy5kaXNhYmxlZCYmKHQrPSItZCIpLHRoaXMucGxhaW4mJih0Kz0iLXBsYWluIiksIi10Ij09PWUmJiJtaW5pIj09PXRoaXMuc2l6ZSYmKHQrPSIgdWItbWluaSIpLHR9LF9nZXRIb3ZlckNsYXNzOmZ1bmN0aW9uKGUpe2lmKHRoaXMuZGlzYWJsZWQpcmV0dXJuIiI7dmFyIHQ9InViLSIrdGhpcy5UWVBFU1t0aGlzLnR5cGVdK2UrIi1ob3ZlciI7cmV0dXJuIHRoaXMucGxhaW4mJih0Kz0iLXBsYWluIiksdH19LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49QXJyYXkuaXNBcnJheSh0aGlzLiRzbG90cy5kZWZhdWx0KT90aGlzLiRzbG90cy5kZWZhdWx0OltdO3JldHVybiAxPT09bi5sZW5ndGgmJm5bMF0udGV4dCYmKG49ZSgidS10ZXh0Iix7c3RhdGljQ2xhc3M6WyJ1Yi10Il0sY2xhc3M6dC5fZ2V0Q2xhc3MoIi10Iil9LFt0Ll90KCJkZWZhdWx0IildLDIpKSx0aGlzLmNsaWNrRnVuY3Rpb249dC4kbGlzdGVuZXJzLmNsaWNrLGRlbGV0ZSB0LiRsaXN0ZW5lcnMuY2xpY2ssZSgidmlldyIsdC5fZyh7c3RhdGljQ2xhc3M6WyJ1YiJdLGNsYXNzOnQuX2dldENsYXNzKCIiKSxhdHRyczp7ZGF0YVVuY1R5cGU6InVuaS1idXR0b24iLGhvdmVyQ2xhc3M6dC5fZ2V0SG92ZXJDbGFzcygiIiksaG92ZXJTdGFydFRpbWU6dC5ob3ZlclN0YXJ0VGltZSxob3ZlclN0YXlUaW1lOnQuaG92ZXJTdGF5VGltZX0sb246e2NsaWNrOnQuX29uQ2xpY2t9fSx0LiRsaXN0ZW5lcnMpLFt0LmxvYWRpbmc/ZSgibG9hZGluZy1pbmRpY2F0b3IiLHtzdGF0aWNDbGFzczpbInViLWxvYWRpbmciXSxjbGFzczpbInViLSIrdC5UWVBFU1t0LnR5cGVdKyItbG9hZGluZyJdLGF0dHJzOnthcnJvdzoiZmFsc2UiLGFuaW1hdGluZzoidHJ1ZSJ9fSk6dC5fZSgpXS5jb25jYXQobiksMSl9LHN0eWxlOnt1Yjp7ZmxleERpcmVjdGlvbjoicm93IixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJjZW50ZXIiLHBvc2l0aW9uOiJyZWxhdGl2ZSIscGFkZGluZ0xlZnQ6IjUiLHBhZGRpbmdSaWdodDoiNSIsb3ZlcmZsb3c6ImhpZGRlbiIsY29sb3I6IiMwMDAwMDAiLGJhY2tncm91bmRDb2xvcjoiI2Y4ZjhmOCIsYm9yZGVyUmFkaXVzOiI1Iixib3JkZXJTdHlsZToic29saWQiLGJvcmRlcldpZHRoOiIxIixib3JkZXJDb2xvcjoiI2RiZGJkYiJ9LCJ1Yi10Ijp7Y29sb3I6IiMwMDAwMDAiLGZvbnRTaXplOiIxOCIsdGV4dERlY29yYXRpb246Im5vbmUiLGxpbmVIZWlnaHQ6IjQ2In0sInViLWQiOntiYWNrZ3JvdW5kQ29sb3I6IiNmOGY4ZjgifSwidWItcCI6e2JhY2tncm91bmRDb2xvcjoiIzAwN2FmZiIsYm9yZGVyQ29sb3I6IiMwMDYyY2MifSwidWItdyI6e2JhY2tncm91bmRDb2xvcjoiI2U2NDM0MCIsYm9yZGVyQ29sb3I6IiNiODM2MzMifSwidWItZC10Ijp7Y29sb3I6IiMwMDAwMDAifSwidWItcC10Ijp7Y29sb3I6IiNmZmZmZmYifSwidWItdy10Ijp7Y29sb3I6IiNmZmZmZmYifSwidWItZC1kIjp7YmFja2dyb3VuZENvbG9yOiIjZjdmN2Y3In0sInViLXAtZCI6e2JhY2tncm91bmRDb2xvcjoiIzYzYWNmYyIsYm9yZGVyQ29sb3I6IiM0ZjhhY2EifSwidWItdy1kIjp7YmFja2dyb3VuZENvbG9yOiIjZWM4Yjg5Iixib3JkZXJDb2xvcjoiI2JkNmY2ZSJ9LCJ1Yi1kLXQtZCI6e2NvbG9yOiIjY2NjY2NjIn0sInViLXAtdC1kIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSJ9LCJ1Yi13LXQtZCI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikifSwidWItZC1wbGFpbiI6e2JvcmRlckNvbG9yOiIjMzUzNTM1IixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifSwidWItcC1wbGFpbiI6e2JvcmRlckNvbG9yOiIjMDA3YWZmIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifSwidWItdy1wbGFpbiI6e2JvcmRlckNvbG9yOiIjZTY0MzQwIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifSwidWItZC10LXBsYWluIjp7Y29sb3I6IiMzNTM1MzUifSwidWItcC10LXBsYWluIjp7Y29sb3I6IiMwMDdhZmYifSwidWItdy10LXBsYWluIjp7Y29sb3I6IiNlNjQzNDAifSwidWItZC1kLXBsYWluIjp7Ym9yZGVyQ29sb3I6IiNjNmM2YzYiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi1wLWQtcGxhaW4iOntib3JkZXJDb2xvcjoiI2M2YzZjNiIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn0sInViLXctZC1wbGFpbiI6e2JvcmRlckNvbG9yOiIjYzZjNmM2IixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifSwidWItZC10LWQtcGxhaW4iOntjb2xvcjoicmdiYSgwLDAsMCwwLjIpIn0sInViLXAtdC1kLXBsYWluIjp7Y29sb3I6InJnYmEoMCwwLDAsMC4yKSJ9LCJ1Yi13LXQtZC1wbGFpbiI6e2NvbG9yOiJyZ2JhKDAsMCwwLDAuMikifSwidWItbWluaSI6e2xpbmVIZWlnaHQ6IjMwIixmb250U2l6ZToiMTMiLHBhZGRpbmdUb3A6MCxwYWRkaW5nUmlnaHQ6IjE3LjUiLHBhZGRpbmdCb3R0b206MCxwYWRkaW5nTGVmdDoiMTcuNSJ9LCJ1Yi1sb2FkaW5nIjp7d2lkdGg6IjE4IixoZWlnaHQ6IjE4IixtYXJnaW5SaWdodDoiMTAifSwidWItZC1sb2FkaW5nIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn0sInViLXAtbG9hZGluZyI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi13LWxvYWRpbmciOntjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjYpIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifSwidWItZC1sb2FkaW5nLXBsYWluIjp7Y29sb3I6IiMzNTM1MzUifSwidWItcC1sb2FkaW5nLXBsYWluIjp7Y29sb3I6IiMwMDdhZmYiLGJhY2tncm91bmRDb2xvcjoiIzAwNjJjYyJ9LCJ1Yi13LWxvYWRpbmctcGxhaW4iOntjb2xvcjoiI2U2NDM0MCIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn0sInViLWQtaG92ZXIiOntvcGFjaXR5Oi44LGJhY2tncm91bmRDb2xvcjoiI2RlZGVkZSJ9LCJ1Yi1wLWhvdmVyIjp7b3BhY2l0eTouOCxiYWNrZ3JvdW5kQ29sb3I6IiMwMDYyY2MifSwidWItdy1ob3ZlciI6e29wYWNpdHk6LjgsYmFja2dyb3VuZENvbG9yOiIjY2UzYzM5In0sInViLWQtdC1ob3ZlciI6e2NvbG9yOiJyZ2JhKDAsMCwwLDAuNikifSwidWItcC10LWhvdmVyIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSJ9LCJ1Yi13LXQtaG92ZXIiOntjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjYpIn0sInViLWQtaG92ZXItcGxhaW4iOntjb2xvcjoicmdiYSg1Myw1Myw1MywwLjYpIixib3JkZXJDb2xvcjoicmdiYSg1Myw1Myw1MywwLjYpIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifSwidWItcC1ob3Zlci1wbGFpbiI6e2NvbG9yOiJyZ2JhKDI2LDE3MywyNSwwLjYpIixib3JkZXJDb2xvcjoicmdiYSgwLDEyMiwyNTUsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn0sInViLXctaG92ZXItcGxhaW4iOntjb2xvcjoicmdiYSgyMzAsNjcsNjQsMC42KSIsYm9yZGVyQ29sb3I6InJnYmEoMjMwLDY3LDY0LDAuNikiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9fSxsaXN0ZW5lcnM6eyJsYWJlbC1jbGljayI6Il9vbkNsaWNrIiwiQGxhYmVsLWNsaWNrIjoiX29uQ2xpY2sifX19ZnVuY3Rpb24gaW5pdCQ1KGUsdCxuKXtlLmNvbXBvbmVudCgiYnV0dG9uIixnZXRCdXR0b24odCxuKSl9ZnVuY3Rpb24gZ2V0Q2hlY2tib3hHcm91cChlKXtyZXR1cm57bmFtZToiQ2hlY2tib3hHcm91cCIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXIsbGlzdGVuZXJzXSxwcm9wczp7bmFtZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57Y2hlY2tib3hMaXN0OltdfX0sbGlzdGVuZXJzOnsiQGNoZWNrYm94LWNoYW5nZSI6Il9jaGFuZ2VIYW5kbGVyIiwiQGNoZWNrYm94LWdyb3VwLXVwZGF0ZSI6Il9jaGVja2JveEdyb3VwVXBkYXRlSGFuZGxlciJ9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInVuaS1mb3JtLWdyb3VwLXVwZGF0ZSIse3R5cGU6ImFkZCIsdm06dGhpc30pfSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy4kZGlzcGF0Y2goIkZvcm0iLCJ1bmktZm9ybS1ncm91cC11cGRhdGUiLHt0eXBlOiJyZW1vdmUiLHZtOnRoaXN9KX0sbWV0aG9kczp7X2NoYW5nZUhhbmRsZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9W107dGhpcy5jaGVja2JveExpc3QuZm9yRWFjaChmdW5jdGlvbihlKXtlLmNoZWNrYm94Q2hlY2tlZCYmdC5wdXNoKGUudmFsdWUpfSksdGhpcy4kdHJpZ2dlcigiY2hhbmdlIix7dmFsdWU6dH0pfSxfY2hlY2tib3hHcm91cFVwZGF0ZUhhbmRsZXI6ZnVuY3Rpb24oZSl7aWYoImFkZCI9PT1lLnR5cGUpdGhpcy5jaGVja2JveExpc3QucHVzaChlLnZtKTtlbHNle3ZhciB0PXRoaXMuY2hlY2tib3hMaXN0LmluZGV4T2YoZS52bSk7dGhpcy5jaGVja2JveExpc3Quc3BsaWNlKHQsMSl9fSxfZ2V0Rm9ybURhdGE6ZnVuY3Rpb24oKXt2YXIgZT17fTtpZigiIiE9PXRoaXMubmFtZSl7dmFyIHQ9W107dGhpcy5jaGVja2JveExpc3QuZm9yRWFjaChmdW5jdGlvbihlKXtlLmNoZWNrYm94Q2hlY2tlZCYmdC5wdXNoKGUudmFsdWUpfSksZS52YWx1ZT10LGUua2V5PXRoaXMubmFtZX1yZXR1cm4gZX19LHJlbmRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZSgiZGl2Iix0aGlzLl9nKHtzdGF0aWNDbGFzczpbInVuaS1jaGVja2JveC1ncm91cCJdfSx0aGlzLiRsaXN0ZW5lcnMpLFt0aGlzLl90KCJkZWZhdWx0IildLDIpfSxzdHlsZTp7fX19ZnVuY3Rpb24gaW5pdCQ2KGUsdCl7ZS5jb21wb25lbnQoImNoZWNrYm94LWdyb3VwIixnZXRDaGVja2JveEdyb3VwKHQpKX1mdW5jdGlvbiBnZXRDaGVja2JveChlKXtyZXR1cm57bmFtZToiQ2hlY2tib3giLGlzUmVzZXJ2ZWQ6ITAsbWl4aW5zOltlbWl0dGVyLGxpc3RlbmVyc10scHJvcHM6e2NoZWNrZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxpZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxjb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwN2FmZiJ9LHZhbHVlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntjaGVja2JveENoZWNrZWQ6dGhpcy5jaGVja2VkLGNoZWNrYm94VmFsdWU6dGhpcy52YWx1ZX19LHdhdGNoOntjaGVja2VkOmZ1bmN0aW9uKGUpe3RoaXMuY2hlY2tib3hDaGVja2VkPWV9LHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMuY2hlY2tib3hWYWx1ZT1lfX0sbGlzdGVuZXJzOnsibGFiZWwtY2xpY2siOiJfb25DbGljayIsIkBsYWJlbC1jbGljayI6Il9vbkNsaWNrIn0sY29tcHV0ZWQ6e2NoZWNrYm94Q29sb3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXNhYmxlZD8iI2FkYWRhZCI6dGhpcy5jb2xvcn19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLiRkaXNwYXRjaCgiQ2hlY2tib3hHcm91cCIsInVuaS1jaGVja2JveC1ncm91cC11cGRhdGUiLHt0eXBlOiJhZGQiLHZtOnRoaXN9KSx0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInVuaS1mb3JtLWdyb3VwLXVwZGF0ZSIse3R5cGU6ImFkZCIsdm06dGhpc30pfSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy4kZGlzcGF0Y2goIkNoZWNrYm94R3JvdXAiLCJ1bmktY2hlY2tib3gtZ3JvdXAtdXBkYXRlIix7dHlwZToicmVtb3ZlIix2bTp0aGlzfSksdGhpcy4kZGlzcGF0Y2goIkZvcm0iLCJ1bmktZm9ybS1ncm91cC11cGRhdGUiLHt0eXBlOiJyZW1vdmUiLHZtOnRoaXN9KX0sbWV0aG9kczp7X29uQ2xpY2s6ZnVuY3Rpb24oZSl7dGhpcy5kaXNhYmxlZHx8KHRoaXMuY2hlY2tib3hDaGVja2VkPSF0aGlzLmNoZWNrYm94Q2hlY2tlZCx0aGlzLiRkaXNwYXRjaCgiQ2hlY2tib3hHcm91cCIsInVuaS1jaGVja2JveC1jaGFuZ2UiLGUpKX0sX3Jlc2V0Rm9ybURhdGE6ZnVuY3Rpb24oKXt0aGlzLmNoZWNrYm94Q2hlY2tlZD0hMX19LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3JldHVybiBlKCJkaXYiLHQuX2coe2F0dHJzOntkYXRhVW5jVHlwZToidW5pLWNoZWNrYm94In0sb246e2NsaWNrOnQuX29uQ2xpY2t9fSx0LiRsaXN0ZW5lcnMpLFtlKCJkaXYiLHtzdGF0aWNDbGFzczpbInVuaS1jaGVja2JveCJdfSxbZSgiZGl2Iix7c3RhdGljQ2xhc3M6WyJ1bmktY2hlY2tib3gtaW5wdXQiXSxjbGFzczpbdC5kaXNhYmxlZD8idW5pLWNoZWNrYm94LWlucHV0LWRpc2FibGVkIjoiIl19LFt0LmNoZWNrYm94Q2hlY2tlZD9lKCJ1LXRleHQiLHtzdGF0aWNDbGFzczpbInVuaS1pY29uIl0sc3R5bGU6e2NvbG9yOnQuY2hlY2tib3hDb2xvcn19LFt0Ll92KHQuX3MoIu6oiCIpKV0pOnQuX2UoKV0pLGUoInUtdGV4dCIse3N0YXRpY0NsYXNzOlsidW5pLXNsb3QiXX0sW3QuX3QoImRlZmF1bHQiKV0sMildKV0pfSxzdHlsZTp7InVuaS1jaGVja2JveCI6e2ZsZXhEaXJlY3Rpb246InJvdyIsYWxpZ25JdGVtczoiY2VudGVyIn0sInVuaS1jaGVja2JveC1pbnB1dCI6e2p1c3RpZnlDb250ZW50OiJjZW50ZXIiLGFsaWduSXRlbXM6ImNlbnRlciIscG9zaXRpb246InJlbGF0aXZlIixib3JkZXJXaWR0aDoiMSIsYm9yZGVyQ29sb3I6IiNkMWQxZDEiLGJvcmRlclN0eWxlOiJzb2xpZCIsYmFja2dyb3VuZENvbG9yOiIjZmZmZmZmIixib3JkZXJSYWRpdXM6IjMiLHdpZHRoOiIyMiIsaGVpZ2h0OiIyMiJ9LCJ1bmktaWNvbiI6e2ZvbnRGYW1pbHk6InVuaW5jb21wb25lbnRzIixmb250U2l6ZToiMTYiLG1hcmdpbkxlZnQ6IjIiLG1hcmdpblRvcDoiMiIsY29sb3I6IiMwMDdhZmYifSwidW5pLWNoZWNrYm94LWlucHV0LWRpc2FibGVkIjp7YmFja2dyb3VuZENvbG9yOiIjZTFlMWUxIn0sInVuaS1jaGVja2JveC1pbnB1dC1kaXNhYmxlZC1iZWZvcmUiOntjb2xvcjoiI2FkYWRhZCJ9LCJ1bmktc2xvdCI6e2ZvbnRTaXplOiIxNiIsbWFyZ2luTGVmdDoiNSJ9LCJ1bmktY2hlY2tib3gtZ3JvdXAiOntkaXNwbGF5OiJibG9jayJ9fX19ZnVuY3Rpb24gaW5pdCQ3KGUsdCl7ZS5jb21wb25lbnQoImNoZWNrYm94IixnZXRDaGVja2JveCh0KSl9dmFyIE5BVElWRV9DT01QT05FTlRfVFlQRVM9WyJ1LWlucHV0IiwidS10ZXh0YXJlYSJdO2Z1bmN0aW9uIGdldEZvcm0oZSl7dmFyIGk9ZS5yZXF1aXJlTW9kdWxlKCJwbHVzIik7cmV0dXJue25hbWU6IkZvcm0iLGlzUmVzZXJ2ZWQ6ITAsbWl4aW5zOltlbWl0dGVyLGxpc3RlbmVyc10sZGF0YTpmdW5jdGlvbigpe3JldHVybntjaGlsZHJlbkxpc3Q6W119fSxsaXN0ZW5lcnM6eyJAZm9ybS1zdWJtaXQiOiJfb25TdWJtaXQiLCJAZm9ybS1yZXNldCI6Il9vblJlc2V0IiwiQGZvcm0tZ3JvdXAtdXBkYXRlIjoiX2Zvcm1Hcm91cFVwZGF0ZUhhbmRsZXIifSxtZXRob2RzOntfb25TdWJtaXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZ2V0TmF0aXZlRm9ybURhdGEoKXx8e307dGhpcy5jaGlsZHJlbkxpc3QuZm9yRWFjaChmdW5jdGlvbihlKXtlLl9nZXRGb3JtRGF0YSYmZS5fZ2V0Rm9ybURhdGEoKS5rZXkmJih0W2UuX2dldEZvcm1EYXRhKCkua2V5XT1lLl9nZXRGb3JtRGF0YSgpLnZhbHVlKX0pLHRoaXMuJHRyaWdnZXIoInN1Ym1pdCIse3ZhbHVlOnR9KX0sX29uUmVzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kdHJpZ2dlcigicmVzZXQiLHt9KSx0aGlzLl9nZXROYXRpdmVGb3JtRGF0YSghMCksdGhpcy5jaGlsZHJlbkxpc3QuZm9yRWFjaChmdW5jdGlvbihlKXtlLl9yZXNldEZvcm1EYXRhJiZlLl9yZXNldEZvcm1EYXRhKCl9KX0sX2Zvcm1Hcm91cFVwZGF0ZUhhbmRsZXI6ZnVuY3Rpb24oZSl7aWYoImFkZCI9PT1lLnR5cGUpdGhpcy5jaGlsZHJlbkxpc3QucHVzaChlLnZtKTtlbHNle3ZhciB0PXRoaXMuY2hpbGRyZW5MaXN0LmluZGV4T2YoZS52bSk7dGhpcy5jaGlsZHJlbkxpc3Quc3BsaWNlKHQsMSl9fSxfZ2V0TmF0aXZlRm9ybURhdGE6ZnVuY3Rpb24obil7dmFyIHI9e307cmV0dXJuIGZ1bmN0aW9uIHQoZSl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpezA8PU5BVElWRV9DT01QT05FTlRfVFlQRVMuaW5kZXhPZihlLnRhZykmJmUuZGF0YS5hdHRycyYmZS5kYXRhLmF0dHJzLm5hbWUmJihuP2UuZWxtLnNldFZhbHVlKCIiKTpyW2UuZGF0YS5hdHRycy5uYW1lXT1pLmdldFZhbHVlKGUuZWxtLm5vZGVJZCkpLGUuY2hpbGRyZW4mJnQoZS5jaGlsZHJlbil9KX0odGhpcy4kdm5vZGUuY29tcG9uZW50T3B0aW9ucy5jaGlsZHJlbikscn19LHJlbmRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZSgidmlldyIsdGhpcy5fZyh7fSx0aGlzLiRsaXN0ZW5lcnMpLFt0aGlzLl90KCJkZWZhdWx0IildLDIpfX19ZnVuY3Rpb24gaW5pdCQ4KGUsdCl7ZS5jb21wb25lbnQoImZvcm0iLGdldEZvcm0odCkpfXZhciBpY29uQ2hhcnM9e3N1Y2Nlc3M6Iu6ohiIsaW5mbzoi7qiDIix3YXJuOiLuqIsiLHdhaXRpbmc6Iu6oiSIsc2FmZV9zdWNjZXNzOiLuqIQiLHNhZmVfd2Fybjoi7qiFIixzdWNjZXNzX2NpcmNsZToi7qiHIixzdWNjZXNzX25vX2NpcmNsZToi7qiIIix3YWl0aW5nX2NpcmNsZToi7qiKIixjaXJjbGU6Iu6ogSIsZG93bmxvYWQ6Iu6ogiIsaW5mb19jaXJjbGU6Iu6ojCIsY2FuY2VsOiLuqI0iLHNlYXJjaDoi7qiOIixjbGVhcjoi7qiPIn0saWNvbkNvbG9ycz17c3VjY2VzczoiIzA5YmIwNyIsaW5mbzoiIzEwYWVmZiIsd2FybjoiI2Y3NjI2MCIsd2FpdGluZzoiIzEwYWVmZiIsc2FmZV9zdWNjZXNzOiIjMDliYjA3IixzYWZlX3dhcm46IiNmZmJlMDAiLHN1Y2Nlc3NfY2lyY2xlOiIjMDliYjA3IixzdWNjZXNzX25vX2NpcmNsZToiIzA5YmIwNyIsd2FpdGluZ19jaXJjbGU6IiMxMGFlZmYiLGNpcmNsZToiI2M5YzljOSIsZG93bmxvYWQ6IiMwOWJiMDciLGluZm9fY2lyY2xlOiIjMDliYjA3IixjYW5jZWw6IiNmNDM1MzAiLHNlYXJjaDoiI2IyYjJiMiIsY2xlYXI6IiNiMmIyYjIifTtmdW5jdGlvbiBnZXRJY29uKGUpe3JldHVybntuYW1lOiJJY29uIixpc1Jlc2VydmVkOiEwLHByb3BzOnt0eXBlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxzaXplOnt0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OjIzfSxjb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57aWNvbkNoYXJzOmljb25DaGFyc319LGJlZm9yZUNyZWF0ZTpmdW5jdGlvbigpe30sY29tcHV0ZWQ6e3N0eWxlczpmdW5jdGlvbigpe3JldHVybntjb2xvcjp0aGlzLmNvbG9yfHxpY29uQ29sb3JzW3RoaXMudHlwZV0sZm9udFNpemU6dGhpcy5zaXplfX19LHJlbmRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZSgidS10ZXh0Iix0aGlzLl9nKHtzdGF0aWNDbGFzczpbInVuaS1pY29uIl0sc3R5bGU6dGhpcy5zdHlsZXN9LHRoaXMuJGxpc3RlbmVycyksW3RoaXMuaWNvbkNoYXJzW3RoaXMudHlwZV1dKX0sc3R5bGU6eyJ1bmktaWNvbiI6e2ZvbnRGYW1pbHk6InVuaW5jb21wb25lbnRzIn19fX1mdW5jdGlvbiBpbml0JDkoZSx0KXtlLmNvbXBvbmVudCgiaWNvbiIsZ2V0SWNvbih0KSl9ZnVuY3Rpb24gZ2V0TGFiZWwoZSl7cmV0dXJue25hbWU6IkxhYmVsIixpc1Jlc2VydmVkOiEwLG1peGluczpbZW1pdHRlcixsaXN0ZW5lcnNdLHByb3BzOntmb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxtZXRob2RzOntfb25DbGljazpmdW5jdGlvbihlKXt2YXIgdD1lLnRhcmdldC5hdHRyLmRhdGFVbmNUeXBlfHwiIixuPS9edW5pLShjaGVja2JveHxyYWRpb3xzd2l0Y2gpLS8udGVzdCh0KTtufHwobj0vXnVuaS0oY2hlY2tib3h8cmFkaW98c3dpdGNofGJ1dHRvbikkL2kudGVzdCh0KSksbnx8KHRoaXMuZm9yP3RoaXMuXyRidXMuJGVtaXQoInVuaS1sYWJlbC1jbGljay0iK3RoaXMuJHBhZ2UuaWQrIi0iK3RoaXMuZm9yLGUsITApOnRoaXMuJGJyb2FkY2FzdChbIkNoZWNrYm94IiwiUmFkaW8iLCJTd2l0Y2giLCJCdXR0b24iXSwidW5pLWxhYmVsLWNsaWNrIixlLCEwKSl9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGUoImRpdiIsdGhpcy5fZyh7b246e2NsaWNrOnRoaXMuX29uQ2xpY2t9fSx0aGlzLiRsaXN0ZW5lcnMpLFt0aGlzLl90KCJkZWZhdWx0IildLDIpfX19ZnVuY3Rpb24gaW5pdCQxMChlLHQpe2UuY29tcG9uZW50KCJsYWJlbCIsZ2V0TGFiZWwodCkpfWZ1bmN0aW9uIGdldE1vdmFibGVBcmVhKGUpe3ZhciB0PWUucmVxdWlyZU1vZHVsZSgiZG9tIik7cmV0dXJue25hbWU6Ik1vdmFibGVBcmVhIixpc1Jlc2VydmVkOiEwLHByb3BzOntzY2FsZUFyZWE6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfX0sZGF0YTpmdW5jdGlvbigpe3JldHVybnt3aWR0aDowLGhlaWdodDowLGl0ZW1zOltdfX0sbWV0aG9kczp7X3Jlc2l6ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5fZ2V0V0goKS50aGVuKGZ1bmN0aW9uKCl7ZS5pdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY29tcG9uZW50SW5zdGFuY2Uuc2V0UGFyZW50KCl9KX0pfSxfcGFuc3RhcnQ6ZnVuY3Rpb24oZSl7dGhpcy50b3VjaEl0ZW0mJnRoaXMudG91Y2hJdGVtLnRvdWNoc3RhcnQoZSl9LF9wYW5tb3ZlOmZ1bmN0aW9uKGUpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy50b3VjaEl0ZW0mJnRoaXMudG91Y2hJdGVtLnRvdWNobW92ZShlKX0sX3BhbmVuZDpmdW5jdGlvbihlKXt0aGlzLnRvdWNoSXRlbSYmKHRoaXMudG91Y2hJdGVtLnRvdWNoZW5kKGUpLHRoaXMudG91Y2hJdGVtPW51bGwpfSxfZ2V0V0g6ZnVuY3Rpb24oKXt2YXIgbz10aGlzO3JldHVybiB0aGlzLl9nZXRDb21wb25lbnRTaXplKHRoaXMuJHJlZnMuZWwpLnRoZW4oZnVuY3Rpb24oZSl7dmFyIHQ9ZS53aWR0aCxuPWUuaGVpZ2h0LHI9ZS50b3AsaT1lLmxlZnQ7by53aWR0aD10LG8uaGVpZ2h0PW4sby50b3A9cixvLmxlZnQ9aX0pfSxfZ2V0Q29tcG9uZW50U2l6ZTpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24obil7dC5nZXRDb21wb25lbnRSZWN0KGUsZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zaXplO24odCl9KX0pfX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuaXRlbXM9W10sdGhpcy5nYXBWPXt4Om51bGwseTpudWxsfSx0aGlzLnBpbmNoU3RhcnRMZW49bnVsbH0sbW91bnRlZDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2UuX19pc01vdW50ZWQ9ITAsZS5fcmVzaXplKCl9LDIwMCl9LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49W107KEFycmF5LmlzQXJyYXkodGhpcy4kc2xvdHMuZGVmYXVsdCk/ZGVlcENsb25lKHRoaXMuJHNsb3RzLmRlZmF1bHQsZSk6W10pLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jb21wb25lbnRPcHRpb25zJiYibW92YWJsZS12aWV3Ij09PWUuY29tcG9uZW50T3B0aW9ucy50YWcmJm4ucHVzaChlKX0pLHRoaXMuaXRlbXM9bjt2YXIgcj17fTtyZXR1cm5bInBhbnN0YXJ0IiwicGFubW92ZSIsInBhbmVuZCJdLmZvckVhY2goZnVuY3Rpb24oZSl7cltlXT10WyJfIitlXX0pLGUoImRpdiIsdGhpcy5fZyh7cmVmOiJlbCIsb246cixzdGF0aWNDbGFzczpbInVuaS1tb3ZhYmxlLWFyZWEiXX0sdGhpcy4kbGlzdGVuZXJzKSxuLDIpfSxzdHlsZTp7InVuaS1tb3ZhYmxlLWFyZWEiOntvdmVyZmxvdzoiaGlkZGVuIix3aWR0aDoiMTBweCIsaGVpZ2h0OiIxMHB4In19fX1mdW5jdGlvbiBpbml0JDExKGUsdCl7ZS5jb21wb25lbnQoIm1vdmFibGUtYXJlYSIsZ2V0TW92YWJsZUFyZWEodCkpfXZhciB0b3VjaHRyYWNrPXttZXRob2RzOnt0b3VjaHRyYWNrOmZ1bmN0aW9uKGkpe3ZhciBvPXRoaXMsYT0wLHM9MCxjPTAsdT0wLG49ZnVuY3Rpb24oZSx0LG4scil7aWYoITE9PT1vW2ldKHt0YXJnZXQ6ZS50YXJnZXQsY3VycmVudFRhcmdldDplLmN1cnJlbnRUYXJnZXQsc3RvcFByb3BhZ2F0aW9uOmUuc3RvcFByb3BhZ2F0aW9uLmJpbmQoZSksdG91Y2hlczplLnRvdWNoZXMsY2hhbmdlZFRvdWNoZXM6ZS5jaGFuZ2VkVG91Y2hlcyxkZXRhaWw6e3N0YXRlOnQseDA6bix5MDpyLGR4Om4tYSxkeTpyLXMsZGR4Om4tYyxkZHk6ci11LHRpbWVTdGFtcDplLnRpbWVTdGFtcHx8RGF0ZS5ub3coKX19KSlyZXR1cm4hMX0scj1udWxsO3RoaXMuYWRkTGlzdGVuZXIoInRvdWNoc3RhcnQiLGZ1bmN0aW9uKGUpe2lmKCFyKXJldHVybiBhPWM9KHI9ZSkudG91Y2hlc1swXS5wYWdlWCxzPXU9ZS50b3VjaGVzWzBdLnBhZ2VZLG4oZSwic3RhcnQiLGEscyl9KSx0aGlzLmFkZExpc3RlbmVyKCJ0b3VjaG1vdmUiLGZ1bmN0aW9uKGUpe2lmKHIpe3ZhciB0PW4oZSwibW92ZSIsZS50b3VjaGVzWzBdLnBhZ2VYLGUudG91Y2hlc1swXS5wYWdlWSk7cmV0dXJuIGM9ZS50b3VjaGVzWzBdLnBhZ2VYLHU9ZS50b3VjaGVzWzBdLnBhZ2VZLHR9fSksdGhpcy5hZGRMaXN0ZW5lcigidG91Y2hlbmQiLGZ1bmN0aW9uKGUpe2lmKHIpcmV0dXJuIHI9bnVsbCxuKGUsImVuZCIsZS5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWCxlLmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VZKX0pfSx0b3VjaHN0YXJ0OmZ1bmN0aW9uKGUpe3RoaXMuY2FsbGJhY2soInRvdWNoc3RhcnQiLGUpfSx0b3VjaG1vdmU6ZnVuY3Rpb24oZSl7dGhpcy5jYWxsYmFjaygidG91Y2htb3ZlIixlKX0sdG91Y2hlbmQ6ZnVuY3Rpb24oZSl7dGhpcy5jYWxsYmFjaygidG91Y2hlbmQiLGUpfSxhZGRMaXN0ZW5lcjpmdW5jdGlvbihlLHQpe3RoaXMuX19ldmVudFtlXT1mdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgdCYmKGUudG91Y2hlcz1lLmNoYW5nZWRUb3VjaGVzLCExPT09dChlKSYmZS5zdG9wUHJvcGFnYXRpb24oKSl9fSxjYWxsYmFjazpmdW5jdGlvbihlLHQpe3RoaXMuX19ldmVudFtlXSYmdGhpcy5fX2V2ZW50W2VdKHQpfX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX19ldmVudD17fX19O2Z1bmN0aW9uIGUoZSx0LG4pe3JldHVybiB0LW48ZSYmZTx0K259ZnVuY3Rpb24gdCh0LG4pe3JldHVybiBlKHQsMCxuKX1mdW5jdGlvbiBEZWNsaW5lKCl7fWZ1bmN0aW9uIEZyaWN0aW9uKGUsdCl7dGhpcy5fbT1lLHRoaXMuX2Y9MWUzKnQsdGhpcy5fc3RhcnRUaW1lPTAsdGhpcy5fdj0wfWZ1bmN0aW9uIFNwcmluZyhlLHQsbil7dGhpcy5fbT1lLHRoaXMuX2s9dCx0aGlzLl9jPW4sdGhpcy5fc29sdXRpb249bnVsbCx0aGlzLl9lbmRQb3NpdGlvbj0wLHRoaXMuX3N0YXJ0VGltZT0wfWZ1bmN0aW9uIFNURChlLHQsbil7dGhpcy5fc3ByaW5nWD1uZXcgU3ByaW5nKGUsdCxuKSx0aGlzLl9zcHJpbmdZPW5ldyBTcHJpbmcoZSx0LG4pLHRoaXMuX3NwcmluZ1NjYWxlPW5ldyBTcHJpbmcoZSx0LG4pLHRoaXMuX3N0YXJ0VGltZT0wfURlY2xpbmUucHJvdG90eXBlLng9ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGguc3FydChlKX0sRnJpY3Rpb24ucHJvdG90eXBlLnNldFY9ZnVuY3Rpb24oZSx0KXt2YXIgbj1NYXRoLnBvdyhNYXRoLnBvdyhlLDIpK01hdGgucG93KHQsMiksLjUpO3RoaXMuX3hfdj1lLHRoaXMuX3lfdj10LHRoaXMuX3hfYT0tdGhpcy5fZip0aGlzLl94X3Yvbix0aGlzLl95X2E9LXRoaXMuX2YqdGhpcy5feV92L24sdGhpcy5fdD1NYXRoLmFicyhlL3RoaXMuX3hfYSl8fE1hdGguYWJzKHQvdGhpcy5feV9hKSx0aGlzLl9sYXN0RHQ9bnVsbCx0aGlzLl9zdGFydFRpbWU9KG5ldyBEYXRlKS5nZXRUaW1lKCl9LEZyaWN0aW9uLnByb3RvdHlwZS5zZXRTPWZ1bmN0aW9uKGUsdCl7dGhpcy5feF9zPWUsdGhpcy5feV9zPXR9LEZyaWN0aW9uLnByb3RvdHlwZS5zPWZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPSgobmV3IERhdGUpLmdldFRpbWUoKS10aGlzLl9zdGFydFRpbWUpLzFlMyksZT50aGlzLl90JiYoZT10aGlzLl90LHRoaXMuX2xhc3REdD1lKTt2YXIgdD10aGlzLl94X3YqZSsuNSp0aGlzLl94X2EqTWF0aC5wb3coZSwyKSt0aGlzLl94X3Msbj10aGlzLl95X3YqZSsuNSp0aGlzLl95X2EqTWF0aC5wb3coZSwyKSt0aGlzLl95X3M7cmV0dXJuKDA8dGhpcy5feF9hJiZ0PHRoaXMuX2VuZFBvc2l0aW9uWHx8dGhpcy5feF9hPDAmJnQ+dGhpcy5fZW5kUG9zaXRpb25YKSYmKHQ9dGhpcy5fZW5kUG9zaXRpb25YKSwoMDx0aGlzLl95X2EmJm48dGhpcy5fZW5kUG9zaXRpb25ZfHx0aGlzLl95X2E8MCYmbj50aGlzLl9lbmRQb3NpdGlvblkpJiYobj10aGlzLl9lbmRQb3NpdGlvblkpLHt4OnQseTpufX0sRnJpY3Rpb24ucHJvdG90eXBlLmRzPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0oKG5ldyBEYXRlKS5nZXRUaW1lKCktdGhpcy5fc3RhcnRUaW1lKS8xZTMpLGU+dGhpcy5fdCYmKGU9dGhpcy5fdCkse2R4OnRoaXMuX3hfdit0aGlzLl94X2EqZSxkeTp0aGlzLl95X3YrdGhpcy5feV9hKmV9fSxGcmljdGlvbi5wcm90b3R5cGUuZGVsdGE9ZnVuY3Rpb24oKXtyZXR1cm57eDotMS41Kk1hdGgucG93KHRoaXMuX3hfdiwyKS90aGlzLl94X2F8fDAseTotMS41Kk1hdGgucG93KHRoaXMuX3lfdiwyKS90aGlzLl95X2F8fDB9fSxGcmljdGlvbi5wcm90b3R5cGUuZHQ9ZnVuY3Rpb24oKXtyZXR1cm4tdGhpcy5feF92L3RoaXMuX3hfYX0sRnJpY3Rpb24ucHJvdG90eXBlLmRvbmU9ZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMucygpLngsdGhpcy5fZW5kUG9zaXRpb25YKXx8ZSh0aGlzLnMoKS55LHRoaXMuX2VuZFBvc2l0aW9uWSl8fHRoaXMuX2xhc3REdD09PXRoaXMuX3Q7cmV0dXJuIHRoaXMuX2xhc3REdD1udWxsLHR9LEZyaWN0aW9uLnByb3RvdHlwZS5zZXRFbmQ9ZnVuY3Rpb24oZSx0KXt0aGlzLl9lbmRQb3NpdGlvblg9ZSx0aGlzLl9lbmRQb3NpdGlvblk9dH0sRnJpY3Rpb24ucHJvdG90eXBlLnJlY29uZmlndXJlPWZ1bmN0aW9uKGUsdCl7dGhpcy5fbT1lLHRoaXMuX2Y9MWUzKnR9LFNwcmluZy5wcm90b3R5cGUuX3NvbHZlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5fYyxyPXRoaXMuX20saT10aGlzLl9rLG89bipuLTQqcippO2lmKDA9PT1vKXt2YXIgYT0tbi8oMipyKSxzPWUsYz10LyhhKmUpO3JldHVybnt4OmZ1bmN0aW9uKGUpe3JldHVybihzK2MqZSkqTWF0aC5wb3coTWF0aC5FLGEqZSl9LGR4OmZ1bmN0aW9uKGUpe3ZhciB0PU1hdGgucG93KE1hdGguRSxhKmUpO3JldHVybiBhKihzK2MqZSkqdCtjKnR9fX1pZigwPG8pe3ZhciB1PSgtbi1NYXRoLnNxcnQobykpLygyKnIpLGw9KC1uK01hdGguc3FydChvKSkvKDIqciksZD0odC11KmUpLyhsLXUpLGY9ZS1kO3JldHVybnt4OmZ1bmN0aW9uKGUpe3ZhciB0LG47cmV0dXJuIGU9PT10aGlzLl90JiYodD10aGlzLl9wb3dFUjFULG49dGhpcy5fcG93RVIyVCksdGhpcy5fdD1lLHR8fCh0PXRoaXMuX3Bvd0VSMVQ9TWF0aC5wb3coTWF0aC5FLHUqZSkpLG58fChuPXRoaXMuX3Bvd0VSMlQ9TWF0aC5wb3coTWF0aC5FLGwqZSkpLGYqdCtkKm59LGR4OmZ1bmN0aW9uKGUpe3ZhciB0LG47cmV0dXJuIGU9PT10aGlzLl90JiYodD10aGlzLl9wb3dFUjFULG49dGhpcy5fcG93RVIyVCksdGhpcy5fdD1lLHR8fCh0PXRoaXMuX3Bvd0VSMVQ9TWF0aC5wb3coTWF0aC5FLHUqZSkpLG58fChuPXRoaXMuX3Bvd0VSMlQ9TWF0aC5wb3coTWF0aC5FLGwqZSkpLGYqdSp0K2QqbCpufX19dmFyIHA9TWF0aC5zcXJ0KDQqcippLW4qbikvKDIqciksaD0tbi8yKnIsdj1lLGc9KHQtaCplKS9wO3JldHVybnt4OmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnBvdyhNYXRoLkUsaCplKSoodipNYXRoLmNvcyhwKmUpK2cqTWF0aC5zaW4ocCplKSl9LGR4OmZ1bmN0aW9uKGUpe3ZhciB0PU1hdGgucG93KE1hdGguRSxoKmUpLG49TWF0aC5jb3MocCplKSxyPU1hdGguc2luKHAqZSk7cmV0dXJuIHQqKGcqcCpuLXYqcCpyKStoKnQqKGcqcit2Km4pfX19LFNwcmluZy5wcm90b3R5cGUueD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9KChuZXcgRGF0ZSkuZ2V0VGltZSgpLXRoaXMuX3N0YXJ0VGltZSkvMWUzKSx0aGlzLl9zb2x1dGlvbj90aGlzLl9lbmRQb3NpdGlvbit0aGlzLl9zb2x1dGlvbi54KGUpOjB9LFNwcmluZy5wcm90b3R5cGUuZHg9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSgobmV3IERhdGUpLmdldFRpbWUoKS10aGlzLl9zdGFydFRpbWUpLzFlMyksdGhpcy5fc29sdXRpb24/dGhpcy5fc29sdXRpb24uZHgoZSk6MH0sU3ByaW5nLnByb3RvdHlwZS5zZXRFbmQ9ZnVuY3Rpb24oZSxuLHIpe2lmKHJ8fChyPShuZXcgRGF0ZSkuZ2V0VGltZSgpKSxlIT09dGhpcy5fZW5kUG9zaXRpb258fCF0KG4sLjEpKXtuPW58fDA7dmFyIGk9dGhpcy5fZW5kUG9zaXRpb247dGhpcy5fc29sdXRpb24mJih0KG4sLjEpJiYobj10aGlzLl9zb2x1dGlvbi5keCgoci10aGlzLl9zdGFydFRpbWUpLzFlMykpLGk9dGhpcy5fc29sdXRpb24ueCgoci10aGlzLl9zdGFydFRpbWUpLzFlMyksdChuLC4xKSYmKG49MCksdChpLC4xKSYmKGk9MCksaSs9dGhpcy5fZW5kUG9zaXRpb24pLHRoaXMuX3NvbHV0aW9uJiZ0KGktZSwuMSkmJnQobiwuMSl8fCh0aGlzLl9lbmRQb3NpdGlvbj1lLHRoaXMuX3NvbHV0aW9uPXRoaXMuX3NvbHZlKGktdGhpcy5fZW5kUG9zaXRpb24sbiksdGhpcy5fc3RhcnRUaW1lPXIpfX0sU3ByaW5nLnByb3RvdHlwZS5zbmFwPWZ1bmN0aW9uKGUpe3RoaXMuX3N0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLl9lbmRQb3NpdGlvbj1lLHRoaXMuX3NvbHV0aW9uPXt4OmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGR4OmZ1bmN0aW9uKCl7cmV0dXJuIDB9fX0sU3ByaW5nLnByb3RvdHlwZS5kb25lPWZ1bmN0aW9uKG4pe3JldHVybiBufHwobj0obmV3IERhdGUpLmdldFRpbWUoKSksZSh0aGlzLngoKSx0aGlzLl9lbmRQb3NpdGlvbiwuMSkmJnQodGhpcy5keCgpLC4xKX0sU3ByaW5nLnByb3RvdHlwZS5yZWNvbmZpZ3VyZT1mdW5jdGlvbihlLHQsbil7dGhpcy5fbT1lLHRoaXMuX2s9dCx0aGlzLl9jPW4sdGhpcy5kb25lKCl8fCh0aGlzLl9zb2x1dGlvbj10aGlzLl9zb2x2ZSh0aGlzLngoKS10aGlzLl9lbmRQb3NpdGlvbix0aGlzLmR4KCkpLHRoaXMuX3N0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSl9LFNwcmluZy5wcm90b3R5cGUuc3ByaW5nQ29uc3RhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fa30sU3ByaW5nLnByb3RvdHlwZS5kYW1waW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2N9LFNwcmluZy5wcm90b3R5cGUuY29uZmlndXJhdGlvbj1mdW5jdGlvbigpe3JldHVyblt7bGFiZWw6IlNwcmluZyBDb25zdGFudCIscmVhZDp0aGlzLnNwcmluZ0NvbnN0YW50LmJpbmQodGhpcyksd3JpdGU6ZnVuY3Rpb24oZSx0KXtlLnJlY29uZmlndXJlKDEsdCxlLmRhbXBpbmcoKSl9LmJpbmQodGhpcyx0aGlzKSxtaW46MTAwLG1heDoxZTN9LHtsYWJlbDoiRGFtcGluZyIscmVhZDp0aGlzLmRhbXBpbmcuYmluZCh0aGlzKSx3cml0ZTpmdW5jdGlvbihlLHQpe2UucmVjb25maWd1cmUoMSxlLnNwcmluZ0NvbnN0YW50KCksdCl9LmJpbmQodGhpcyx0aGlzKSxtaW46MSxtYXg6NTAwfV19LFNURC5wcm90b3R5cGUuc2V0RW5kPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuX3NwcmluZ1guc2V0RW5kKGUscixpKSx0aGlzLl9zcHJpbmdZLnNldEVuZCh0LHIsaSksdGhpcy5fc3ByaW5nU2NhbGUuc2V0RW5kKG4scixpKSx0aGlzLl9zdGFydFRpbWU9aX0sU1RELnByb3RvdHlwZS54PWZ1bmN0aW9uKCl7dmFyIGU9KChuZXcgRGF0ZSkuZ2V0VGltZSgpLXRoaXMuX3N0YXJ0VGltZSkvMWUzO3JldHVybnt4OnRoaXMuX3NwcmluZ1gueChlKSx5OnRoaXMuX3NwcmluZ1kueChlKSxzY2FsZTp0aGlzLl9zcHJpbmdTY2FsZS54KGUpfX0sU1RELnByb3RvdHlwZS5kb25lPWZ1bmN0aW9uKCl7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7cmV0dXJuIHRoaXMuX3NwcmluZ1guZG9uZShlKSYmdGhpcy5fc3ByaW5nWS5kb25lKGUpJiZ0aGlzLl9zcHJpbmdTY2FsZS5kb25lKGUpfSxTVEQucHJvdG90eXBlLnJlY29uZmlndXJlPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLl9zcHJpbmdYLnJlY29uZmlndXJlKGUsdCxuKSx0aGlzLl9zcHJpbmdZLnJlY29uZmlndXJlKGUsdCxuKSx0aGlzLl9zcHJpbmdTY2FsZS5yZWNvbmZpZ3VyZShlLHQsbil9O3ZhciByZXF1ZXN0aW5nPSExO2Z1bmN0aW9uIHJlcXVlc3RBbmltYXRpb25GcmFtZShlKXtyZXR1cm4gc2V0VGltZW91dChlLDE2KX1mdW5jdGlvbiBjYW5jZWxBbmltYXRpb25GcmFtZShlKXtjbGVhclRpbWVvdXQoZSl9ZnVuY3Rpb24gX3JlcXVlc3RBbmltYXRpb25GcmFtZShlKXtyZXF1ZXN0aW5nfHwocmVxdWVzdGluZz0hMCxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXtlKCkscmVxdWVzdGluZz0hMX0pKX1mdW5jdGlvbiB2KGUsdCl7cmV0dXJuKygoMWUzKmUtMWUzKnQpLzFlMykudG9GaXhlZCgxKX1mdW5jdGlvbiBnKGEsZSx0KXt2YXIgbj17aWQ6MCxjYW5jZWxsZWQ6ITF9O3JldHVybiBmdW5jdGlvbiBlKHQsbixyLGkpe2lmKCF0fHwhdC5jYW5jZWxsZWQpe3Iobik7dmFyIG89YS5kb25lKCk7b3x8dC5jYW5jZWxsZWR8fCh0LmlkPXJlcXVlc3RBbmltYXRpb25GcmFtZShlLmJpbmQobnVsbCx0LG4scixpKSkpLG8mJmkmJmkobil9fShuLGEsZSx0KSx7Y2FuY2VsOmZ1bmN0aW9uKGUpe2UmJmUuaWQmJmNhbmNlbEFuaW1hdGlvbkZyYW1lKGUuaWQpLGUmJihlLmNhbmNlbGxlZD0hMCl9LmJpbmQobnVsbCxuKSxtb2RlbDphfX1mdW5jdGlvbiBnZXRNb3ZhYmxlVmlldyhlKXt2YXIgdD1lLnJlcXVpcmVNb2R1bGUoImRvbSIpLHM9ZS5yZXF1aXJlTW9kdWxlKCJhbmltYXRpb24iKTtyZXR1cm57bmFtZToiTW92YWJsZVZpZXciLGlzUmVzZXJ2ZWQ6ITAsbWl4aW5zOlt0b3VjaHRyYWNrLGVtaXR0ZXJdLHByb3BzOntkaXJlY3Rpb246e3R5cGU6U3RyaW5nLGRlZmF1bHQ6Im5vbmUifSxpbmVydGlhOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sb3V0T2ZCb3VuZHM6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSx4Ont0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LHk6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MH0sZGFtcGluZzp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoyMH0sZnJpY3Rpb246e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6Mn0sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxzY2FsZTp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LHNjYWxlTWluOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0Oi41fSxzY2FsZU1heDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoxMH0sc2NhbGVWYWx1ZTp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoxfSxhbmltYXRpb246e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiEwfX0sZGF0YTpmdW5jdGlvbigpe3JldHVybnt4U3luYzp0aGlzLl9nZXRQeCh0aGlzLngpLHlTeW5jOnRoaXMuX2dldFB4KHRoaXMueSksc2NhbGVWYWx1ZVN5bmM6dGhpcy5fZ2V0U2NhbGVOdW1iZXIodGhpcy5zY2FsZVZhbHVlKSx3aWR0aDowLGhlaWdodDowLG1pblg6MCxtaW5ZOjAsbWF4WDowLG1heFk6MH19LGNvbXB1dGVkOntkYW1waW5nTnVtYmVyOmZ1bmN0aW9uKCl7dmFyIGU9TnVtYmVyKHRoaXMuZGFtcGluZyk7cmV0dXJuIGlzTmFOKGUpPzIwOmV9LGZyaWN0aW9uTnVtYmVyOmZ1bmN0aW9uKCl7dmFyIGU9TnVtYmVyKHRoaXMuZnJpY3Rpb24pO3JldHVybiBpc05hTihlKXx8ZTw9MD8yOmV9LHNjYWxlTWluTnVtYmVyOmZ1bmN0aW9uKCl7dmFyIGU9TnVtYmVyKHRoaXMuc2NhbGVNaW4pO3JldHVybiBpc05hTihlKT8uNTplfSxzY2FsZU1heE51bWJlcjpmdW5jdGlvbigpe3ZhciBlPU51bWJlcih0aGlzLnNjYWxlTWF4KTtyZXR1cm4gaXNOYU4oZSk/MTA6ZX0seE1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuZGlyZWN0aW9ufHwiaG9yaXpvbnRhbCI9PT10aGlzLmRpcmVjdGlvbn0seU1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuZGlyZWN0aW9ufHwidmVydGljYWwiPT09dGhpcy5kaXJlY3Rpb259fSx3YXRjaDp7eDpmdW5jdGlvbihlKXt0aGlzLnhTeW5jPXRoaXMuX2dldFB4KGUpfSx4U3luYzpmdW5jdGlvbihlKXt0aGlzLl9zZXRYKGUpfSx5OmZ1bmN0aW9uKGUpe3RoaXMueVN5bmM9dGhpcy5fZ2V0UHgoZSl9LHlTeW5jOmZ1bmN0aW9uKGUpe3RoaXMuX3NldFkoZSl9LHNjYWxlVmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5fc2V0U2NhbGVWYWx1ZSh0aGlzLl9nZXRTY2FsZU51bWJlcihlKSl9LHNjYWxlVmFsdWVTeW5jOmZ1bmN0aW9uKGUpe3RoaXMuX3NldFNjYWxlVmFsdWUoZSl9LHNjYWxlTWluTnVtYmVyOmZ1bmN0aW9uKCl7dGhpcy5fc2V0U2NhbGVNaW5Pck1heCgpfSxzY2FsZU1heE51bWJlcjpmdW5jdGlvbigpe3RoaXMuX3NldFNjYWxlTWluT3JNYXgoKX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9vZmZzZXQ9e3g6MCx5OjB9LHRoaXMuX3NjYWxlT2Zmc2V0PXt4OjAseTowfSx0aGlzLl90cmFuc2xhdGVYPTAsdGhpcy5fdHJhbnNsYXRlWT0wLHRoaXMuX3NjYWxlPTEsdGhpcy5fb2xkU2NhbGU9MSx0aGlzLl9TVEQ9bmV3IFNURCgxLDkqTWF0aC5wb3codGhpcy5kYW1waW5nTnVtYmVyLDIpLzQwLHRoaXMuZGFtcGluZ051bWJlciksdGhpcy5fZnJpY3Rpb249bmV3IEZyaWN0aW9uKDEsdGhpcy5mcmljdGlvbk51bWJlciksdGhpcy5fZGVjbGluZVg9bmV3IERlY2xpbmUsdGhpcy5fZGVjbGluZVk9bmV3IERlY2xpbmUsdGhpcy5fX3RvdWNoSW5mbz17aGlzdG9yeVg6WzAsMF0saGlzdG9yeVk6WzAsMF0saGlzdG9yeVQ6WzAsMF19LHRoaXMuX3JlY3Q9e3RvcDowLGxlZnQ6MCx3aWR0aDowLGhlaWdodDowfX0sbW91bnRlZDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy50b3VjaHRyYWNrKCJfb25UcmFjayIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLl91cGRhdGVSZWN0KCkudGhlbihmdW5jdGlvbigpe2Uuc2V0UGFyZW50KCl9KX0sMTAwKSx0aGlzLl9mcmljdGlvbi5yZWNvbmZpZ3VyZSgxLHRoaXMuZnJpY3Rpb25OdW1iZXIpLHRoaXMuX1NURC5yZWNvbmZpZ3VyZSgxLDkqTWF0aC5wb3codGhpcy5kYW1waW5nTnVtYmVyLDIpLzQwLHRoaXMuZGFtcGluZ051bWJlcil9LG1ldGhvZHM6e19nZXRQeDpmdW5jdGlvbihlKXtyZXR1cm4gTnVtYmVyKGUpfHwwfSxfZ2V0U2NhbGVOdW1iZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9TnVtYmVyKGUpLGlzTmFOKGUpPzE6ZX0sX3NldFg6ZnVuY3Rpb24oZSl7aWYodGhpcy54TW92ZSl7aWYoZSt0aGlzLl9zY2FsZU9mZnNldC54PT09dGhpcy5fdHJhbnNsYXRlWClyZXR1cm4gdGhpcy5fdHJhbnNsYXRlWDt0aGlzLl9TRkEmJnRoaXMuX1NGQS5jYW5jZWwoKSx0aGlzLl9hbmltYXRpb25UbyhlK3RoaXMuX3NjYWxlT2Zmc2V0LngsdGhpcy55U3luYyt0aGlzLl9zY2FsZU9mZnNldC55LHRoaXMuX3NjYWxlKX1yZXR1cm4gZX0sX3NldFk6ZnVuY3Rpb24oZSl7aWYodGhpcy55TW92ZSl7aWYoZSt0aGlzLl9zY2FsZU9mZnNldC55PT09dGhpcy5fdHJhbnNsYXRlWSlyZXR1cm4gdGhpcy5fdHJhbnNsYXRlWTt0aGlzLl9TRkEmJnRoaXMuX1NGQS5jYW5jZWwoKSx0aGlzLl9hbmltYXRpb25Ubyh0aGlzLnhTeW5jK3RoaXMuX3NjYWxlT2Zmc2V0LngsZSt0aGlzLl9zY2FsZU9mZnNldC55LHRoaXMuX3NjYWxlKX1yZXR1cm4gZX0sX3NldFNjYWxlTWluT3JNYXg6ZnVuY3Rpb24oKXtpZighdGhpcy5zY2FsZSlyZXR1cm4hMTt0aGlzLl91cGRhdGVTY2FsZSh0aGlzLl9zY2FsZSwhMCksdGhpcy5fdXBkYXRlT2xkU2NhbGUodGhpcy5fc2NhbGUpfSxfc2V0U2NhbGVWYWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4hIXRoaXMuc2NhbGUmJihlPXRoaXMuX2FkanVzdFNjYWxlKGUpLHRoaXMuX3VwZGF0ZVNjYWxlKGUsITApLHRoaXMuX3VwZGF0ZU9sZFNjYWxlKGUpLGUpfSxfX2hhbmRsZVRvdWNoU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9pc1NjYWxpbmd8fHRoaXMuZGlzYWJsZWR8fCh0aGlzLl9GQSYmdGhpcy5fRkEuY2FuY2VsKCksdGhpcy5fU0ZBJiZ0aGlzLl9TRkEuY2FuY2VsKCksdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5WD1bMCwwXSx0aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlZPVswLDBdLHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVQ9WzAsMF0sdGhpcy54TW92ZSYmKHRoaXMuX19iYXNlWD10aGlzLl90cmFuc2xhdGVYKSx0aGlzLnlNb3ZlJiYodGhpcy5fX2Jhc2VZPXRoaXMuX3RyYW5zbGF0ZVkpLHRoaXMuX2NoZWNrQ2FuTW92ZT1udWxsLHRoaXMuX2ZpcnN0TW92ZURpcmVjdGlvbj1udWxsLHRoaXMuX2lzVG91Y2hpbmc9ITApfSxfX2hhbmRsZVRvdWNoTW92ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKCF0aGlzLl9pc1NjYWxpbmcmJiF0aGlzLmRpc2FibGVkJiZ0aGlzLl9pc1RvdWNoaW5nKXt2YXIgbj10aGlzLl90cmFuc2xhdGVYLHI9dGhpcy5fdHJhbnNsYXRlWTtpZihudWxsPT09dGhpcy5fZmlyc3RNb3ZlRGlyZWN0aW9uJiYodGhpcy5fZmlyc3RNb3ZlRGlyZWN0aW9uPTE8TWF0aC5hYnMoZS5kZXRhaWwuZHgvZS5kZXRhaWwuZHkpPyJodG91Y2htb3ZlIjoidnRvdWNobW92ZSIpLHRoaXMueE1vdmUmJihuPWUuZGV0YWlsLmR4K3RoaXMuX19iYXNlWCx0aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlYLnNoaWZ0KCksdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5WC5wdXNoKG4pLHRoaXMueU1vdmV8fG51bGwhPT10aGlzLl9jaGVja0Nhbk1vdmV8fCh0aGlzLl9jaGVja0Nhbk1vdmU9TWF0aC5hYnMoZS5kZXRhaWwuZHgvZS5kZXRhaWwuZHkpPDEpKSx0aGlzLnlNb3ZlJiYocj1lLmRldGFpbC5keSt0aGlzLl9fYmFzZVksdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5WS5zaGlmdCgpLHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVkucHVzaChyKSx0aGlzLnhNb3ZlfHxudWxsIT09dGhpcy5fY2hlY2tDYW5Nb3ZlfHwodGhpcy5fY2hlY2tDYW5Nb3ZlPU1hdGguYWJzKGUuZGV0YWlsLmR5L2UuZGV0YWlsLmR4KTwxKSksdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5VC5zaGlmdCgpLHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVQucHVzaChlLmRldGFpbC50aW1lU3RhbXApLCF0aGlzLl9jaGVja0Nhbk1vdmUpe3ZhciBpPSJ0b3VjaCI7bjx0aGlzLm1pblg/dGhpcy5vdXRPZkJvdW5kcz8oaT0idG91Y2gtb3V0LW9mLWJvdW5kcyIsbj10aGlzLm1pblgtdGhpcy5fZGVjbGluZVgueCh0aGlzLm1pblgtbikpOm49dGhpcy5taW5YOm4+dGhpcy5tYXhYJiYodGhpcy5vdXRPZkJvdW5kcz8oaT0idG91Y2gtb3V0LW9mLWJvdW5kcyIsbj10aGlzLm1heFgrdGhpcy5fZGVjbGluZVgueChuLXRoaXMubWF4WCkpOm49dGhpcy5tYXhYKSxyPHRoaXMubWluWT90aGlzLm91dE9mQm91bmRzPyhpPSJ0b3VjaC1vdXQtb2YtYm91bmRzIixyPXRoaXMubWluWS10aGlzLl9kZWNsaW5lWS54KHRoaXMubWluWS1yKSk6cj10aGlzLm1pblk6cj50aGlzLm1heFkmJih0aGlzLm91dE9mQm91bmRzPyhpPSJ0b3VjaC1vdXQtb2YtYm91bmRzIixyPXRoaXMubWF4WSt0aGlzLl9kZWNsaW5lWS54KHItdGhpcy5tYXhZKSk6cj10aGlzLm1heFkpLF9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXt0Ll9zZXRUcmFuc2Zvcm0obixyLHQuX3NjYWxlLGkpfSl9fX0sX19oYW5kbGVUb3VjaEVuZDpmdW5jdGlvbigpe3ZhciByPXRoaXM7aWYoIXRoaXMuX2lzU2NhbGluZyYmIXRoaXMuZGlzYWJsZWQmJnRoaXMuX2lzVG91Y2hpbmcmJih0aGlzLl9pc1RvdWNoaW5nPSExLCF0aGlzLl9jaGVja0Nhbk1vdmUmJiF0aGlzLl9yZXZpc2UoIm91dC1vZi1ib3VuZHMiKSYmdGhpcy5pbmVydGlhKSl7dmFyIGU9MWUzKih0aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlYWzFdLXRoaXMuX190b3VjaEluZm8uaGlzdG9yeVhbMF0pLyh0aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlUWzFdLXRoaXMuX190b3VjaEluZm8uaGlzdG9yeVRbMF0pLHQ9MWUzKih0aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlZWzFdLXRoaXMuX190b3VjaEluZm8uaGlzdG9yeVlbMF0pLyh0aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlUWzFdLXRoaXMuX190b3VjaEluZm8uaGlzdG9yeVRbMF0pO3RoaXMuX2ZyaWN0aW9uLnNldFYoZSx0KSx0aGlzLl9mcmljdGlvbi5zZXRTKHRoaXMuX3RyYW5zbGF0ZVgsdGhpcy5fdHJhbnNsYXRlWSk7dmFyIG49dGhpcy5fZnJpY3Rpb24uZGVsdGEoKS54LGk9dGhpcy5fZnJpY3Rpb24uZGVsdGEoKS55LG89bit0aGlzLl90cmFuc2xhdGVYLGE9aSt0aGlzLl90cmFuc2xhdGVZO288dGhpcy5taW5YPyhvPXRoaXMubWluWCxhPXRoaXMuX3RyYW5zbGF0ZVkrKHRoaXMubWluWC10aGlzLl90cmFuc2xhdGVYKSppL24pOm8+dGhpcy5tYXhYJiYobz10aGlzLm1heFgsYT10aGlzLl90cmFuc2xhdGVZKyh0aGlzLm1heFgtdGhpcy5fdHJhbnNsYXRlWCkqaS9uKSxhPHRoaXMubWluWT8oYT10aGlzLm1pblksbz10aGlzLl90cmFuc2xhdGVYKyh0aGlzLm1pblktdGhpcy5fdHJhbnNsYXRlWSkqbi9pKTphPnRoaXMubWF4WSYmKGE9dGhpcy5tYXhZLG89dGhpcy5fdHJhbnNsYXRlWCsodGhpcy5tYXhZLXRoaXMuX3RyYW5zbGF0ZVkpKm4vaSksdGhpcy5fZnJpY3Rpb24uc2V0RW5kKG8sYSksdGhpcy5fRkE9Zyh0aGlzLl9mcmljdGlvbixmdW5jdGlvbigpe3ZhciBlPXIuX2ZyaWN0aW9uLnMoKSx0PWUueCxuPWUueTtyLl9zZXRUcmFuc2Zvcm0odCxuLHIuX3NjYWxlLCJmcmljdGlvbiIpfSxmdW5jdGlvbigpe3IuX0ZBLmNhbmNlbCgpfSl9fSxfb25UcmFjazpmdW5jdGlvbihlKXtzd2l0Y2goZS5kZXRhaWwuc3RhdGUpe2Nhc2Uic3RhcnQiOnRoaXMuX19oYW5kbGVUb3VjaFN0YXJ0KCk7YnJlYWs7Y2FzZSJtb3ZlIjp0aGlzLl9faGFuZGxlVG91Y2hNb3ZlKGUpO2JyZWFrO2Nhc2UiZW5kIjp0aGlzLl9faGFuZGxlVG91Y2hFbmQoKX19LF9nZXRMaW1pdFhZOmZ1bmN0aW9uKGUsdCl7dmFyIG49ITE7cmV0dXJuIGU+dGhpcy5tYXhYPyhlPXRoaXMubWF4WCxuPSEwKTplPHRoaXMubWluWCYmKGU9dGhpcy5taW5YLG49ITApLHQ+dGhpcy5tYXhZPyh0PXRoaXMubWF4WSxuPSEwKTp0PHRoaXMubWluWSYmKHQ9dGhpcy5taW5ZLG49ITApLHt4OmUseTp0LG91dE9mQm91bmRzOm59fSxzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtpZih0aGlzLiRwYXJlbnQuX19pc01vdW50ZWQpe3RoaXMuX0ZBJiZ0aGlzLl9GQS5jYW5jZWwoKSx0aGlzLl9TRkEmJnRoaXMuX1NGQS5jYW5jZWwoKTt2YXIgZT10aGlzLnNjYWxlP3RoaXMuc2NhbGVWYWx1ZVN5bmM6MTt0aGlzLl91cGRhdGVPZmZzZXQoKSx0aGlzLl91cGRhdGVXSChlKSx0aGlzLl91cGRhdGVCb3VuZGFyeSgpLHRoaXMuX3RyYW5zbGF0ZVg9dGhpcy54U3luYyt0aGlzLl9zY2FsZU9mZnNldC54LHRoaXMuX3RyYW5zbGF0ZVk9dGhpcy55U3luYyt0aGlzLl9zY2FsZU9mZnNldC55O3ZhciB0PXRoaXMuX2dldExpbWl0WFkodGhpcy5fdHJhbnNsYXRlWCx0aGlzLl90cmFuc2xhdGVZKSxuPXQueCxyPXQueTt0aGlzLl9zZXRUcmFuc2Zvcm0obixyLGUsIiIsITApLHRoaXMuX3VwZGF0ZU9sZFNjYWxlKGUpfX0sX3VwZGF0ZU9mZnNldDpmdW5jdGlvbigpe3RoaXMuX29mZnNldC54PXRoaXMuX3JlY3QubGVmdC10aGlzLiRwYXJlbnQubGVmdCx0aGlzLl9vZmZzZXQueT10aGlzLl9yZWN0LnRvcC10aGlzLiRwYXJlbnQudG9wfSxfdXBkYXRlV0g6ZnVuY3Rpb24oZSl7ZT1lfHx0aGlzLl9zY2FsZSxlPXRoaXMuX2FkanVzdFNjYWxlKGUpO3ZhciB0PXRoaXMuX3JlY3Q7dGhpcy5oZWlnaHQ9dC5oZWlnaHQvdGhpcy5fc2NhbGUsdGhpcy53aWR0aD10LndpZHRoL3RoaXMuX3NjYWxlO3ZhciBuPXRoaXMuaGVpZ2h0KmUscj10aGlzLndpZHRoKmU7dGhpcy5fc2NhbGVPZmZzZXQueD0oci10aGlzLndpZHRoKS8yLHRoaXMuX3NjYWxlT2Zmc2V0Lnk9KG4tdGhpcy5oZWlnaHQpLzJ9LF91cGRhdGVCb3VuZGFyeTpmdW5jdGlvbigpe3ZhciBlPTAtdGhpcy5fb2Zmc2V0LngrdGhpcy5fc2NhbGVPZmZzZXQueCx0PXRoaXMuJHBhcmVudC53aWR0aC10aGlzLndpZHRoLXRoaXMuX29mZnNldC54LXRoaXMuX3NjYWxlT2Zmc2V0Lng7dGhpcy5taW5YPU1hdGgubWluKGUsdCksdGhpcy5tYXhYPU1hdGgubWF4KGUsdCk7dmFyIG49MC10aGlzLl9vZmZzZXQueSt0aGlzLl9zY2FsZU9mZnNldC55LHI9dGhpcy4kcGFyZW50LmhlaWdodC10aGlzLmhlaWdodC10aGlzLl9vZmZzZXQueS10aGlzLl9zY2FsZU9mZnNldC55O3RoaXMubWluWT1NYXRoLm1pbihuLHIpLHRoaXMubWF4WT1NYXRoLm1heChuLHIpfSxfYmVnaW5TY2FsZTpmdW5jdGlvbigpe3RoaXMuX2lzU2NhbGluZz0hMH0sX2VuZFNjYWxlOmZ1bmN0aW9uKCl7dGhpcy5faXNTY2FsaW5nPSExLHRoaXMuX3VwZGF0ZU9sZFNjYWxlKHRoaXMuX3NjYWxlKX0sX3NldFNjYWxlOmZ1bmN0aW9uKGUpe3RoaXMuc2NhbGUmJihlPXRoaXMuX2FkanVzdFNjYWxlKGUpLGU9dGhpcy5fb2xkU2NhbGUqZSx0aGlzLl9iZWdpblNjYWxlKCksdGhpcy5fdXBkYXRlU2NhbGUoZSkpfSxfdXBkYXRlU2NhbGU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2lmKHRoaXMuc2NhbGUpe2U9dGhpcy5fYWRqdXN0U2NhbGUoZSksdGhpcy5fdXBkYXRlV0goZSksdGhpcy5fdXBkYXRlQm91bmRhcnkoKTt2YXIgcj10aGlzLl9nZXRMaW1pdFhZKHRoaXMuX3RyYW5zbGF0ZVgsdGhpcy5fdHJhbnNsYXRlWSksaT1yLngsbz1yLnk7dD90aGlzLl9hbmltYXRpb25UbyhpLG8sZSwiIiwhMCwhMCk6X3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe24uX3NldFRyYW5zZm9ybShpLG8sZSwiIiwhMCwhMCl9KX19LF91cGRhdGVPbGRTY2FsZTpmdW5jdGlvbihlKXt0aGlzLl9vbGRTY2FsZT1lfSxfYWRqdXN0U2NhbGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9TWF0aC5tYXgoLjUsdGhpcy5zY2FsZU1pbk51bWJlcixlKSxlPU1hdGgubWluKDEwLHRoaXMuc2NhbGVNYXhOdW1iZXIsZSl9LF9hbmltYXRpb25UbzpmdW5jdGlvbihlLHQsbixpLG8sYSl7dmFyIHM9dGhpczt0aGlzLl9GQSYmdGhpcy5fRkEuY2FuY2VsKCksdGhpcy5fU0ZBJiZ0aGlzLl9TRkEuY2FuY2VsKCksdGhpcy54TW92ZXx8KGU9dGhpcy5fdHJhbnNsYXRlWCksdGhpcy55TW92ZXx8KHQ9dGhpcy5fdHJhbnNsYXRlWSksdGhpcy5zY2FsZXx8KG49dGhpcy5fc2NhbGUpO3ZhciByPXRoaXMuX2dldExpbWl0WFkoZSx0KTtlPXIueCx0PXIueSx0aGlzLmFuaW1hdGlvbj8odGhpcy5fU1RELl9zcHJpbmdYLl9zb2x1dGlvbj1udWxsLHRoaXMuX1NURC5fc3ByaW5nWS5fc29sdXRpb249bnVsbCx0aGlzLl9TVEQuX3NwcmluZ1NjYWxlLl9zb2x1dGlvbj1udWxsLHRoaXMuX1NURC5fc3ByaW5nWC5fZW5kUG9zaXRpb249dGhpcy5fdHJhbnNsYXRlWCx0aGlzLl9TVEQuX3NwcmluZ1kuX2VuZFBvc2l0aW9uPXRoaXMuX3RyYW5zbGF0ZVksdGhpcy5fU1RELl9zcHJpbmdTY2FsZS5fZW5kUG9zaXRpb249dGhpcy5fc2NhbGUsdGhpcy5fU1RELnNldEVuZChlLHQsbiwxKSx0aGlzLl9TRkE9Zyh0aGlzLl9TVEQsZnVuY3Rpb24oKXt2YXIgZT1zLl9TVEQueCgpLHQ9ZS54LG49ZS55LHI9ZS5zY2FsZTtzLl9zZXRUcmFuc2Zvcm0odCxuLHIsaSxvLGEpfSxmdW5jdGlvbigpe3MuX1NGQS5jYW5jZWwoKX0pKTp0aGlzLl9zZXRUcmFuc2Zvcm0oZSx0LG4saSxvLGEpfSxfcmV2aXNlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2dldExpbWl0WFkodGhpcy5fdHJhbnNsYXRlWCx0aGlzLl90cmFuc2xhdGVZKSxuPXQueCxyPXQueSxpPXQub3V0T2ZCb3VuZHM7cmV0dXJuIGkmJnRoaXMuX2FuaW1hdGlvblRvKG4scix0aGlzLl9zY2FsZSxlKSxpfSxfc2V0VHJhbnNmb3JtOmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt2b2lkIDA9PT1yJiYocj0iIiksbnVsbCE9PWUmJiJOYU4iIT09ZS50b1N0cmluZygpJiYibnVtYmVyIj09dHlwZW9mIGV8fChlPXRoaXMuX3RyYW5zbGF0ZVh8fDApLG51bGwhPT10JiYiTmFOIiE9PXQudG9TdHJpbmcoKSYmIm51bWJlciI9PXR5cGVvZiB0fHwodD10aGlzLl90cmFuc2xhdGVZfHwwKSxlPU51bWJlcihlLnRvRml4ZWQoMSkpLHQ9TnVtYmVyKHQudG9GaXhlZCgxKSksbj1OdW1iZXIobi50b0ZpeGVkKDEpKSx0aGlzLl90cmFuc2xhdGVYPT09ZSYmdGhpcy5fdHJhbnNsYXRlWT09PXR8fGl8fHRoaXMuJHRyaWdnZXIoImNoYW5nZSIse3g6dihlLHRoaXMuX3NjYWxlT2Zmc2V0LngpLHk6dih0LHRoaXMuX3NjYWxlT2Zmc2V0LnkpLHNvdXJjZTpyfSksdGhpcy5zY2FsZXx8KG49dGhpcy5fc2NhbGUpLG49KyhuPXRoaXMuX2FkanVzdFNjYWxlKG4pKS50b0ZpeGVkKDMpLG8mJm4hPT10aGlzLl9zY2FsZSYmdGhpcy4kdHJpZ2dlcigic2NhbGUiLHt4OmUseTp0LHNjYWxlOm59KTt2YXIgYT0idHJhbnNsYXRlKCIrZSsicHgsICIrdCsicHgpIHNjYWxlKCIrbisiKSI7cy50cmFuc2l0aW9uKHRoaXMuJHJlZnMuZWwse3N0eWxlczp7dHJhbnNmb3JtOmF9LGR1cmF0aW9uOjAsZGVsYXk6MH0pLHRoaXMuX3RyYW5zbGF0ZVg9ZSx0aGlzLl90cmFuc2xhdGVZPXQsdGhpcy5fc2NhbGU9bn0sX3RvdWNoc3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLiRwYXJlbnQudG91Y2hJdGVtPXRoaXN9LF9nZXRDb21wb25lbnRTaXplOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihuKXt0LmdldENvbXBvbmVudFJlY3QoZSxmdW5jdGlvbihlKXt2YXIgdD1lLnNpemU7bih0KX0pfSl9LF91cGRhdGVSZWN0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm4gdGhpcy5fZ2V0Q29tcG9uZW50U2l6ZSh0aGlzLiRyZWZzLmVsKS50aGVuKGZ1bmN0aW9uKGUpe3QuX3JlY3Q9ZX0pfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXt0b3VjaHN0YXJ0OnRoaXMuX3RvdWNoc3RhcnR9O3JldHVybiBlKCJkaXYiLHRoaXMuX2coe3JlZjoiZWwiLG9uOnQsc3RhdGljQ2xhc3M6WyJ1bmktbW92YWJsZS12aWV3Il0sc3RhdGljU3R5bGU6e3RyYW5zZm9ybU9yaWdpbjoiY2VudGVyIn0sYXR0cnM6e3ByZXZlbnRHZXN0dXJlOiEwfX0sdGhpcy4kbGlzdGVuZXJzKSx0aGlzLiRzbG90cy5kZWZhdWx0LDIpfSxzdHlsZTp7InVuaS1tb3ZhYmxlLXZpZXciOntwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDoiMHB4IixsZWZ0OiIwcHgiLHdpZHRoOiIxMHB4IixoZWlnaHQ6IjEwcHgifX19fWZ1bmN0aW9uIGluaXQkMTIoZSx0KXtlLmNvbXBvbmVudCgibW92YWJsZS12aWV3IixnZXRNb3ZhYmxlVmlldyh0KSl9dmFyIE9QRU5fVFlQRVMkMT17bmF2aWdhdGU6Im5hdmlnYXRlVG8iLHJlZGlyZWN0OiJyZWRpcmVjdFRvIixzd2l0Y2hUYWI6InN3aXRjaFRhYiIscmVMYXVuY2g6InJlTGF1bmNoIixuYXZpZ2F0ZUJhY2s6Im5hdmlnYXRlQmFjayJ9LEFOSU1BVElPTl9UWVBFX0lOPVsic2xpZGUtaW4tcmlnaHQiLCJzbGlkZS1pbi1sZWZ0Iiwic2xpZGUtaW4tdG9wIiwic2xpZGUtaW4tYm90dG9tIiwiZmFkZS1pbiIsInpvb20tb3V0Iiwiem9vbS1mYWRlLW91dCIsInBvcC1pbiIsIm5vbmUiXSxBTklNQVRJT05fVFlQRV9PVVQ9WyJzbGlkZS1vdXQtcmlnaHQiLCJzbGlkZS1vdXQtbGVmdCIsInNsaWRlLW91dC10b3AiLCJzbGlkZS1vdXQtYm90dG9tIiwiZmFkZS1vdXQiLCJ6b29tLWluIiwiem9vbS1mYWRlLWluIiwicG9wLW91dCIsIm5vbmUiXSxwbHVzXyxCcm9hZGNhc3RDaGFubmVsXyxjaGFubmVsO2Z1bmN0aW9uIGdldE5hdmlnYXRvcihlLHQpe3JldHVybntuYW1lOiJOYXZpZ2F0b3IiLGlzUmVzZXJ2ZWQ6ITAscHJvcHM6e3VybDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sb3BlblR5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6Im5hdmlnYXRlIix2YWxpZGF0b3I6ZnVuY3Rpb24oZSl7cmV0dXJuISFPUEVOX1RZUEVTJDFbZV19fSxkZWx0YTp7dHlwZTpOdW1iZXIsZGVmYXVsdDoxfSxhbmltYXRpb25UeXBlOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24oZSl7cmV0dXJuIWV8fH5BTklNQVRJT05fVFlQRV9JTi5jb25jYXQoQU5JTUFUSU9OX1RZUEVfT1VUKS5pbmRleE9mKGUpfX0sYW5pbWF0aW9uRHVyYXRpb246e3R5cGU6W1N0cmluZyxOdW1iZXJdLGRlZmF1bHQ6MzAwfSxob3ZlckNsYXNzOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJuYXZpZ2F0b3ItaG92ZXIifSxob3ZlclN0b3BQcm9wYWdhdGlvbjp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGhvdmVyU3RhcnRUaW1lOnt0eXBlOk51bWJlcixkZWZhdWx0OjUwfSxob3ZlclN0YXlUaW1lOnt0eXBlOk51bWJlcixkZWZhdWx0OjYwMH19LG1ldGhvZHM6e19jbGljazpmdW5jdGlvbigpe2lmKCJuYXZpZ2F0ZUJhY2siPT09dGhpcy5vcGVuVHlwZXx8dGhpcy51cmwpe3ZhciBlPXBhcnNlSW50KHRoaXMuYW5pbWF0aW9uRHVyYXRpb24pO3N3aXRjaCh0aGlzLm9wZW5UeXBlKXtjYXNlIm5hdmlnYXRlIjp0Lm5hdmlnYXRlVG8oe3VybDp0aGlzLnVybCxhbmltYXRpb25UeXBlOnRoaXMuYW5pbWF0aW9uVHlwZXx8InBvcC1pbiIsYW5pbWF0aW9uRHVyYXRpb246ZX0pO2JyZWFrO2Nhc2UicmVkaXJlY3QiOnQucmVkaXJlY3RUbyh7dXJsOnRoaXMudXJsfSk7YnJlYWs7Y2FzZSJzd2l0Y2hUYWIiOnQuc3dpdGNoVGFiKHt1cmw6dGhpcy51cmx9KTticmVhaztjYXNlInJlTGF1bmNoIjp0LnJlTGF1bmNoKHt1cmw6dGhpcy51cmx9KTticmVhaztjYXNlIm5hdmlnYXRlQmFjayI6dC5uYXZpZ2F0ZUJhY2soe2RlbHRhOnRoaXMuZGVsdGEsYW5pbWF0aW9uVHlwZTp0aGlzLmFuaW1hdGlvblR5cGV8fCJwb3Atb3V0IixhbmltYXRpb25EdXJhdGlvbjplfSl9fWVsc2UgY29uc29sZS5lcnJvcigiPG5hdmlnYXRvci8+IHNob3VsZCBoYXZlIHVybCBhdHRyaWJ1dGUgd2hlbiB1c2luZyBuYXZpZ2F0ZVRvLCByZWRpcmVjdFRvLCByZUxhdW5jaCBvciBzd2l0Y2hUYWIiKX19LHJlbmRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZSgidmlldyIsdGhpcy5fZyh7YXR0cnM6e2hvdmVyQ2xhc3M6dGhpcy5ob3ZlckNsYXNzLGhvdmVyU3RvcFByb3BhZ2F0aW9uOnRoaXMuaG92ZXJTdG9wUHJvcGFnYXRpb24saG92ZXJTdGFydFRpbWU6dGhpcy5ob3ZlclN0YXJ0VGltZSxob3ZlclN0YXlUaW1lOnRoaXMuaG92ZXJTdGF5VGltZX0sb246e2NsaWNrOnRoaXMuX2NsaWNrfX0sdGhpcy4kbGlzdGVuZXJzKSxbdGhpcy5fdCgiZGVmYXVsdCIpXSwyKX0sc3R5bGU6eyJuYXZpZ2F0b3ItaG92ZXIiOntiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMC4xKSIsb3BhY2l0eTouN319fX1mdW5jdGlvbiBpbml0JDEzKGUsdCxuKXtlLmNvbXBvbmVudCgibmF2aWdhdG9yIixnZXROYXZpZ2F0b3IodCxuLnVuaSkpfWZ1bmN0aW9uIGdldFJ1bnRpbWUoKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmIm9iamVjdCI9PXR5cGVvZiBuYXZpZ2F0b3ImJiJvYmplY3QiPT10eXBlb2YgZG9jdW1lbnQ/IndlYnZpZXciOiJ2OCJ9ZnVuY3Rpb24gZ2V0UGFnZUlkKCl7cmV0dXJuIHBsdXNfLndlYnZpZXcuY3VycmVudFdlYnZpZXcoKS5pZH12YXIgY2FsbGJhY2tzPXt9O2Z1bmN0aW9uIG9uUGx1c01lc3NhZ2UoZSl7dmFyIHQ9ZS5kYXRhJiZlLmRhdGEuX19tZXNzYWdlO2lmKHQmJnQuX19wYWdlKXt2YXIgbj10Ll9fcGFnZSxyPWNhbGxiYWNrc1tuXTtyJiZyKHQpLHQua2VlcHx8ZGVsZXRlIGNhbGxiYWNrc1tuXX19ZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihlLHQpeyJ2OCI9PT1nZXRSdW50aW1lKCk/KGNoYW5uZWwmJmNoYW5uZWwuY2xvc2UoKSwoY2hhbm5lbD1uZXcgQnJvYWRjYXN0Q2hhbm5lbF8oZ2V0UGFnZUlkKCkpKS5vbm1lc3NhZ2U9b25QbHVzTWVzc2FnZSk6d2luZG93Ll9fcGx1c01lc3NhZ2U9b25QbHVzTWVzc2FnZSxjYWxsYmFja3NbZV09dH12YXIgUGFnZT1mdW5jdGlvbihlKXt0aGlzLndlYnZpZXc9ZX07ZnVuY3Rpb24gc2hvd1BhZ2UoZSl7dmFyIHQ9ZS5jb250ZXh0O3ZvaWQgMD09PXQmJih0PXt9KTt2YXIgbj1lLnVybCxyPWUuZGF0YTt2b2lkIDA9PT1yJiYocj17fSk7dmFyIGk9ZS5zdHlsZTt2b2lkIDA9PT1pJiYoaT17fSk7dmFyIG89ZS5vbk1lc3NhZ2UsYT1lLm9uQ2xvc2U7cGx1c189dC5wbHVzfHxwbHVzLEJyb2FkY2FzdENoYW5uZWxfPXQuQnJvYWRjYXN0Q2hhbm5lbHx8QnJvYWRjYXN0Q2hhbm5lbDt2YXIgcz0icGFnZSIrRGF0ZS5ub3coKTshMSE9PShpPU9iamVjdC5hc3NpZ24oe30saSkpLnRpdGxlTlZpZXcmJiJub25lIiE9PWkudGl0bGVOVmlldyYmKGkudGl0bGVOVmlldz1PYmplY3QuYXNzaWduKHthdXRvQmFja0J1dHRvbjohMCx0aXRsZVNpemU6IjE3cHgifSxpLnRpdGxlTlZpZXcpKTt2YXIgYz17dG9wOjAsYm90dG9tOjAsdXNpbmdDb21wb25lbnRzOnt9LHBvcEdlc3R1cmU6ImNsb3NlIixzY3JvbGxJbmRpY2F0b3I6Im5vbmUiLGFuaW1hdGlvblR5cGU6InBvcC1pbiIsYW5pbWF0aW9uRHVyYXRpb246MjAwLHVuaU5WaWV3OntwYXRoOigib2JqZWN0Ij09dHlwZW9mIHByb2Nlc3MmJnByb2Nlc3MuZW52JiZwcm9jZXNzLmVudi5WVUVfQVBQX1RFTVBMQVRFX1BBVEh8fCIiKSsiLyIrbisiLmpzIixkZWZhdWx0Rm9udFNpemU6MTYsdmlld3BvcnQ6cGx1c18uc2NyZWVuLnJlc29sdXRpb25XaWR0aH19O2k9T2JqZWN0LmFzc2lnbihjLGkpO3ZhciB1PXBsdXNfLndlYnZpZXcuY3JlYXRlKCIiLHMsaSx7ZXh0cmFzOntmcm9tOmdldFBhZ2VJZCgpLHJ1bnRpbWU6Z2V0UnVudGltZSgpLGRhdGE6cn19KTtyZXR1cm4gdS5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsYSksYWRkRXZlbnRMaXN0ZW5lcihzLGZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBvJiZvKGUuZGF0YSksZS5rZWVwfHx1LmNsb3NlKCJhdXRvIil9KSx1LnNob3coaS5hbmltYXRpb25UeXBlLGkuYW5pbWF0aW9uRHVyYXRpb24pLG5ldyBQYWdlKHUpfWZ1bmN0aW9uIGdldFBpY2tlcihlLHQpe3ZhciBvPXtTRUxFQ1RPUjoic2VsZWN0b3IiLE1VTFRJU0VMRUNUT1I6Im11bHRpU2VsZWN0b3IiLFRJTUU6InRpbWUiLERBVEU6ImRhdGUifSxhPXtZRUFSOiJ5ZWFyIixNT05USDoibW9udGgiLERBWToiZGF5In0scj1bInJhbmdlIiwicmFuZ2VLZXkiLCJ2YWx1ZSIsIm1vZGUiLCJmaWVsZHMiLCJzdGFydCIsImVuZCIsImRpc2FibGVkIl07ZnVuY3Rpb24gcyhlKXtyZXR1cm4gOTxlP2U6IjAiK2V9ZnVuY3Rpb24gYyhlLHQpe3ZhciBuPW5ldyBEYXRlO3JldHVybiBlPVN0cmluZyhlfHwiIiksdD09PW8uVElNRT8yPT09KGU9ZS5zcGxpdCgiOiIpKS5sZW5ndGgmJm4uc2V0SG91cnMocGFyc2VJbnQoZVswXSkscGFyc2VJbnQoZVsxXSkpOjM9PT0oZT1lLnNwbGl0KCItIikpLmxlbmd0aCYmbi5zZXRGdWxsWWVhcihwYXJzZUludChlWzBdKSxwYXJzZUludChlWzFdLTEpLHBhcnNlSW50KGVbMl0pKSxufXJldHVybntuYW1lOiJQaWNrZXIiLGlzUmVzZXJ2ZWQ6ITAsbWl4aW5zOltlbWl0dGVyXSxwcm9wczp7cmFuZ2U6e3R5cGU6QXJyYXksZGVmYXVsdDpmdW5jdGlvbigpe3JldHVybltdfX0scmFuZ2VLZXk6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LHZhbHVlOnt0eXBlOltOdW1iZXIsU3RyaW5nLEFycmF5XSxkZWZhdWx0OjB9LG1vZGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6by5TRUxFQ1RPUix2YWxpZGF0b3I6ZnVuY3Rpb24oZSl7cmV0dXJuIDA8PU9iamVjdC52YWx1ZXMobykuaW5kZXhPZihlKX19LGZpZWxkczp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sc3RhcnQ6e3R5cGU6W1N0cmluZyxOdW1iZXJdLGRlZmF1bHQ6ZnVuY3Rpb24oKXtpZih0aGlzLm1vZGU9PT1vLlRJTUUpcmV0dXJuIjAwOjAwIjtpZih0aGlzLm1vZGU9PT1vLkRBVEUpe3ZhciBlPShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKS0xMDA7c3dpdGNoKHRoaXMuZmllbGRzKXtjYXNlIGEuWUVBUjpyZXR1cm4gZTtjYXNlIGEuTU9OVEg6cmV0dXJuIGUrIi0wMSI7ZGVmYXVsdDpyZXR1cm4gZSsiLTAxLTAxIn19cmV0dXJuIiJ9fSxlbmQ6e3R5cGU6W1N0cmluZyxOdW1iZXJdLGRlZmF1bHQ6ZnVuY3Rpb24oKXtpZih0aGlzLm1vZGU9PT1vLlRJTUUpcmV0dXJuIjIzOjU5IjtpZih0aGlzLm1vZGU9PT1vLkRBVEUpe3ZhciBlPShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSsxMDA7c3dpdGNoKHRoaXMuZmllbGRzKXtjYXNlIGEuWUVBUjpyZXR1cm4gZTtjYXNlIGEuTU9OVEg6cmV0dXJuIGUrIi0xMiI7ZGVmYXVsdDpyZXR1cm4gZSsiLTEyLTMxIn19cmV0dXJuIiJ9fSxkaXNhYmxlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9fSxjb21wdXRlZDp7YXR0cnM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49e307cmV0dXJuIHIuZm9yRWFjaChmdW5jdGlvbihlKXtuW2VdPXQuJHByb3BzW2VdfSksbn19LG1ldGhvZHM6e19zaG93OmZ1bmN0aW9uKCl7dGhpcy5fc2hvd1BpY2tlcihPYmplY3QuYXNzaWduKHt9LHRoaXMuYXR0cnMpKX0sX3Nob3dQaWNrZXI6ZnVuY3Rpb24obil7dmFyIHI9dGhpcyxlPXQucGx1c3x8bmV3IHQuV2VleFBsdXModC53ZWV4KTtpZihlLmtleS5oaWRlU29mdEtleWJvcmQoKSx0aGlzLm1vZGUhPT1vLlRJTUUmJnRoaXMubW9kZSE9PW8uREFURXx8bi5maWVsZHMpe24uZmllbGRzPU9iamVjdC52YWx1ZXMoYSkuaW5jbHVkZXMobi5maWVsZHMpP24uZmllbGRzOmEuREFZO3ZhciBpPXtldmVudDoiY2FuY2VsIn07dGhpcy5wYWdlPXNob3dQYWdlKHtjb250ZXh0Ok9iamVjdC5hc3NpZ24oe30sdCx7cGx1czplfSksdXJsOiJfX3VuaWFwcHBpY2tlciIsZGF0YTpuLHN0eWxlOnt0aXRsZU5WaWV3OiExLGFuaW1hdGlvblR5cGU6Im5vbmUiLGFuaW1hdGlvbkR1cmF0aW9uOjAsYmFja2dyb3VuZDoicmdiYSgwLDAsMCwwKSIscG9wR2VzdHVyZToibm9uZSJ9LG9uTWVzc2FnZTpmdW5jdGlvbihlKXt2YXIgdD1lLmV2ZW50O2lmKCJjcmVhdGVkIiE9PXQpcmV0dXJuImNvbHVtbmNoYW5nZSI9PT10PyhkZWxldGUgZS5ldmVudCx2b2lkIHIuJHRyaWdnZXIodCxlKSk6dm9pZChpPWUpO3IuX3VwZGF0ZVBpY2tlcihuKX0sb25DbG9zZTpmdW5jdGlvbigpe3IucGFnZT1udWxsO3ZhciBlPWkuZXZlbnQ7ZGVsZXRlIGkuZXZlbnQsci4kdHJpZ2dlcihlLGkpfX0pfWVsc2UgZS5uYXRpdmVVSVt0aGlzLm1vZGU9PT1vLlRJTUU/InBpY2tUaW1lIjoicGlja0RhdGUiXShmdW5jdGlvbihlKXt2YXIgdD1lLmRhdGU7ci4kdHJpZ2dlcigiY2hhbmdlIix7dmFsdWU6ci5tb2RlPT09by5USU1FP3ModC5nZXRIb3VycygpKSsiOiIrcyh0LmdldE1pbnV0ZXMoKSk6dC5nZXRGdWxsWWVhcigpKyItIitzKHQuZ2V0TW9udGgoKSsxKSsiLSIrcyh0LmdldERhdGUoKSl9KX0sZnVuY3Rpb24oKXtyLiR0cmlnZ2VyKCJjYW5jZWwiLHt9KX0sdGhpcy5tb2RlPT09by5USU1FP3t0aW1lOmModGhpcy52YWx1ZSxvLlRJTUUpfTp7ZGF0ZTpjKHRoaXMudmFsdWUsby5EQVRFKSxtaW5EYXRlOmModGhpcy5zdGFydCxvLkRBVEUpLG1heERhdGU6Yyh0aGlzLmVuZCxvLkRBVEUpfSl9LF91cGRhdGVQaWNrZXI6ZnVuY3Rpb24oZSl7dGhpcy5wYWdlJiZ0aGlzLnBhZ2Uuc2VuZE1lc3NhZ2UoZSl9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLiR3YXRjaCgiYXR0cnMiLGZ1bmN0aW9uKGUpe3QuX3VwZGF0ZVBpY2tlcihlKX0se2RlZXA6ITB9KX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXt9O3JldHVybiB0aGlzLmRpc2FibGVkfHwodC5jbGljaz10aGlzLl9zaG93KSxlKCJkaXYiLHRoaXMuX2coe29uOnR9LHRoaXMuJGxpc3RlbmVyKSx0aGlzLiRzbG90cy5kZWZhdWx0LDIpfX19ZnVuY3Rpb24gaW5pdCQxNChlLHQsbil7ZS5jb21wb25lbnQoInBpY2tlciIsZ2V0UGlja2VyKHQsbikpfVBhZ2UucHJvdG90eXBlLnNlbmRNZXNzYWdlPWZ1bmN0aW9uKGUpe3ZhciB0PUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoe19fbWVzc2FnZTp7ZGF0YTplfX0pKTtuZXcgQnJvYWRjYXN0Q2hhbm5lbF8odGhpcy53ZWJ2aWV3LmlkKS5wb3N0TWVzc2FnZSh0KX0sUGFnZS5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXt0aGlzLndlYnZpZXcuY2xvc2UoKX07dmFyIFBSSU1BUllfQ09MT1I9IiMwMDdBRkYiLEJBQ0tHUk9VTkRfQ09MT1I9IiNFQkVCRUIiLEFOSU1BVEVfSU5URVJWQUxfREVGQVVMVD0zMCxGT05UX1NJWkU9MTYsU1RST0tFX1dJRFRIPTY7ZnVuY3Rpb24gZ2V0UHJvZ3Jlc3MoZSxuKXtyZXR1cm57bmFtZToiUHJvZ3Jlc3MiLGlzUmVzZXJ2ZWQ6ITAsbWl4aW5zOltlbWl0dGVyXSxwcm9wczp7cGVyY2VudDp7dHlwZTpbU3RyaW5nLE51bWJlcl0sZGVmYXVsdDowfSxzaG93SW5mbzp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGJvcmRlclJhZGl1czp7dHlwZTpbU3RyaW5nLE51bWJlcl0sZGVmYXVsdDowfSxmb250U2l6ZTp7dHlwZTpbU3RyaW5nLE51bWJlcl0sZGVmYXVsdDpGT05UX1NJWkV9LHN0cm9rZVdpZHRoOnt0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OlNUUk9LRV9XSURUSH0sYWN0aXZlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sYWN0aXZlQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6UFJJTUFSWV9DT0xPUn0sYWN0aXZlTW9kZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiYmFja3dhcmRzIn0sYmFja2dyb3VuZENvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OkJBQ0tHUk9VTkRfQ09MT1J9LGR1cmF0aW9uOnt0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OkFOSU1BVEVfSU5URVJWQUxfREVGQVVMVH19LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57d2lkdGg6MCxjdXJQZXJjZW50OjB9fSxjb21wdXRlZDp7YmFyU3R5bGU6ZnVuY3Rpb24oKXtyZXR1cm57aGVpZ2h0OnRoaXMuc3Ryb2tlV2lkdGgsYm9yZGVyUmFkaXVzOnRoaXMuYm9yZGVyUmFkaXVzLGJhY2tncm91bmRDb2xvcjp0aGlzLmJhY2tncm91bmRDb2xvcn19LGlubmVyQmFyU3R5bGU6ZnVuY3Rpb24oKXtyZXR1cm57d2lkdGg6dGhpcy5hY3RpdmVXaWR0aCxoZWlnaHQ6dGhpcy5zdHJva2VXaWR0aCxiYWNrZ3JvdW5kQ29sb3I6dGhpcy5hY3RpdmVDb2xvcn19LGFjdGl2ZVdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3VyUGVyY2VudCp0aGlzLndpZHRoLzEwMH0sZmluYWxQZXJjZW50OmZ1bmN0aW9uKCl7dmFyIGU9cGFyc2VGbG9hdCh0aGlzLnBlcmNlbnQsMTApO3JldHVybiAxMDA8ZSYmKGU9MTAwKSxlPDAmJihlPTApLGV9fSx3YXRjaDp7ZmluYWxQZXJjZW50OmZ1bmN0aW9uKGUsdCl7dGhpcy5fdGltZXJJZCYmbi5jbGVhckludGVydmFsKHRoaXMuX3RpbWVySWQpLHRoaXMuX2xhc3RQZXJjZW50PXR8fDAsdGhpcy5fYW5pbWF0ZSgpfX0sbW91bnRlZDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2UucmVxdWlyZU1vZHVsZSgiZG9tIikuZ2V0Q29tcG9uZW50UmVjdCh0LiRyZWZzLnByb2dyZXNzLGZ1bmN0aW9uKGUpe3Qud2lkdGg9ZS5zaXplLndpZHRoLHQuX2FuaW1hdGUoKX0pfSw1MCl9LG1ldGhvZHM6e19hbmltYXRlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXMuZmluYWxQZXJjZW50O2lmKCF0aGlzLmFjdGl2ZSlyZXR1cm4gdGhpcy5jdXJQZXJjZW50PXQ7dGhpcy5jdXJQZXJjZW50PSJmb3J3YXJkcyI9PT10aGlzLmFjdGl2ZU1vZGU/dGhpcy5fbGFzdFBlcmNlbnQ6MCx0aGlzLl90aW1lcklkPW4uc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0PD1lLmN1clBlcmNlbnQrMT8oZS5jdXJQZXJjZW50PXQsbi5jbGVhckludGVydmFsKGUuX3RpbWVySWQpLGUuJHRyaWdnZXIoImFjdGl2ZWVuZCIse2N1clBlcmNlbnQ6ZS5jdXJQZXJjZW50fSkpOisrZS5jdXJQZXJjZW50fSx0aGlzLmR1cmF0aW9uKX19LHJlbmRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZSgiZGl2Iix0aGlzLl9nKHtyZWY6InByb2dyZXNzIixzdGF0aWNDbGFzczpbInVuaS1wcm9ncmVzcyJdfSx0aGlzLiRsaXN0ZW5lcnMpLFtlKCJkaXYiLHtzdGF0aWNDbGFzczpbInVuaS1wcm9ncmVzcy1iYXIiXSxzdHlsZTp0aGlzLmJhclN0eWxlfSxbZSgiZGl2Iix7c3RhdGljQ2xhc3M6WyJ1bmktcHJvZ3Jlc3MtaW5uZXItYmFyIl0sc3R5bGU6dGhpcy5pbm5lckJhclN0eWxlfSldKSx0aGlzLnNob3dJbmZvP1tlKCJ1LXRleHQiLHtzdGF0aWNDbGFzczpbInVuaS1wcm9ncmVzcy1pbmZvIl0sc3R5bGU6e2ZvbnRTaXplOnRoaXMuZm9udFNpemV9fSxbdGhpcy5jdXJQZXJjZW50KyIlIl0pXTp0aGlzLl9lKCldLDIpfSxzdHlsZTp7InVuaS1wcm9ncmVzcyI6e2ZsZXg6MSxmbGV4RGlyZWN0aW9uOiJyb3ciLGFsaWduSXRlbXM6ImNlbnRlciJ9LCJ1bmktcHJvZ3Jlc3MtYmFyIjp7ZmxleDoxfSwidW5pLXByb2dyZXNzLWlubmVyLWJhciI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSJ9LCJ1bmktcHJvZ3Jlc3MtaW5mbyI6e21hcmdpbkxlZnQ6IjE1cHgifX19fWZ1bmN0aW9uIGluaXQkMTUoZSx0LG4pe2UuY29tcG9uZW50KCJwcm9ncmVzcyIsZ2V0UHJvZ3Jlc3ModCxuKSl9ZnVuY3Rpb24gZ2V0UmFkaW9Hcm91cChlKXtyZXR1cm57bmFtZToiUmFkaW9Hcm91cCIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXIsbGlzdGVuZXJzXSxwcm9wczp7bmFtZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57cmFkaW9MaXN0OltdfX0sbGlzdGVuZXJzOnsiQHJhZGlvLWNoYW5nZSI6Il9jaGFuZ2VIYW5kbGVyIiwiQHJhZGlvLWdyb3VwLXVwZGF0ZSI6Il9yYWRpb0dyb3VwVXBkYXRlSGFuZGxlciJ9LG1vdW50ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9yZXNldFJhZGlvR3JvdXBWYWx1ZSh0aGlzLnJhZGlvTGlzdC5sZW5ndGgtMSl9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInVuaS1mb3JtLWdyb3VwLXVwZGF0ZSIse3R5cGU6ImFkZCIsdm06dGhpc30pfSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy4kZGlzcGF0Y2goIkZvcm0iLCJ1bmktZm9ybS1ncm91cC11cGRhdGUiLHt0eXBlOiJyZW1vdmUiLHZtOnRoaXN9KX0sbWV0aG9kczp7X2NoYW5nZUhhbmRsZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnJhZGlvTGlzdC5pbmRleE9mKHQpO3RoaXMuX3Jlc2V0UmFkaW9Hcm91cFZhbHVlKG4sITApLHRoaXMuJHRyaWdnZXIoImNoYW5nZSIse3ZhbHVlOnQucmFkaW9WYWx1ZX0pfSxfcmFkaW9Hcm91cFVwZGF0ZUhhbmRsZXI6ZnVuY3Rpb24oZSl7aWYoImFkZCI9PT1lLnR5cGUpdGhpcy5yYWRpb0xpc3QucHVzaChlLnZtKTtlbHNle3ZhciB0PXRoaXMucmFkaW9MaXN0LmluZGV4T2YoZS52bSk7dGhpcy5yYWRpb0xpc3Quc3BsaWNlKHQsMSl9fSxfcmVzZXRSYWRpb0dyb3VwVmFsdWU6ZnVuY3Rpb24odCxyKXt2YXIgaT10aGlzO3RoaXMucmFkaW9MaXN0LmZvckVhY2goZnVuY3Rpb24oZSxuKXtuIT09dCYmKHI/aS5yYWRpb0xpc3Rbbl0ucmFkaW9DaGVja2VkPSExOmkucmFkaW9MaXN0LmZvckVhY2goZnVuY3Rpb24oZSx0KXt0PD1ufHxpLnJhZGlvTGlzdFt0XS5yYWRpb0NoZWNrZWQmJihpLnJhZGlvTGlzdFtuXS5yYWRpb0NoZWNrZWQ9ITEpfSkpfSl9LF9nZXRGb3JtRGF0YTpmdW5jdGlvbigpe3ZhciBlPXt9O2lmKCIiIT09dGhpcy5uYW1lKXt2YXIgdD0iIjt0aGlzLnJhZGlvTGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UucmFkaW9DaGVja2VkJiYodD1lLnZhbHVlKX0pLGUudmFsdWU9dCxlLmtleT10aGlzLm5hbWV9cmV0dXJuIGV9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGUoImRpdiIsdGhpcy5fZyh7fSx0aGlzLiRsaXN0ZW5lcnMpLFt0aGlzLl90KCJkZWZhdWx0IildLDIpfX19ZnVuY3Rpb24gaW5pdCQxNihlLHQpe2UuY29tcG9uZW50KCJyYWRpby1ncm91cCIsZ2V0UmFkaW9Hcm91cCh0KSl9ZnVuY3Rpb24gZ2V0UmFkaW8oZSl7cmV0dXJue25hbWU6IlJhZGlvIixpc1Jlc2VydmVkOiEwLG1peGluczpbZW1pdHRlcixsaXN0ZW5lcnNdLHByb3BzOntjaGVja2VkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0saWQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sY29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiMwMDdBRkYifSx2YWx1ZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57cmFkaW9DaGVja2VkOnRoaXMuY2hlY2tlZCxyYWRpb1ZhbHVlOnRoaXMudmFsdWV9fSxsaXN0ZW5lcnM6eyJsYWJlbC1jbGljayI6Il9vbkNsaWNrIiwiQGxhYmVsLWNsaWNrIjoiX29uQ2xpY2sifSxjb21wdXRlZDp7Y2hlY2tlZFN0eWxlOmZ1bmN0aW9uKCl7cmV0dXJue2JhY2tncm91bmRDb2xvcjp0aGlzLmNvbG9yLGJvcmRlckNvbG9yOnRoaXMuY29sb3J9fSx1bmNoZWNrZWRTdHlsZTpmdW5jdGlvbigpe3JldHVybntib3JkZXJDb2xvcjoiI2QxZDFkMSJ9fX0sd2F0Y2g6e2NoZWNrZWQ6ZnVuY3Rpb24oZSl7dGhpcy5yYWRpb0NoZWNrZWQ9ZX0sdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5yYWRpb1ZhbHVlPWV9fSxiZWZvcmVDcmVhdGU6ZnVuY3Rpb24oKXt9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLiRkaXNwYXRjaCgiUmFkaW9Hcm91cCIsInVuaS1yYWRpby1ncm91cC11cGRhdGUiLHt0eXBlOiJhZGQiLHZtOnRoaXN9KSx0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInVuaS1mb3JtLWdyb3VwLXVwZGF0ZSIse3R5cGU6ImFkZCIsdm06dGhpc30pfSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy4kZGlzcGF0Y2goIlJhZGlvR3JvdXAiLCJ1bmktcmFkaW8tZ3JvdXAtdXBkYXRlIix7dHlwZToicmVtb3ZlIix2bTp0aGlzfSksdGhpcy4kZGlzcGF0Y2goIkZvcm0iLCJ1bmktZm9ybS1ncm91cC11cGRhdGUiLHt0eXBlOiJyZW1vdmUiLHZtOnRoaXN9KX0sbWV0aG9kczp7X29uQ2xpY2s6ZnVuY3Rpb24oZSl7dGhpcy5kaXNhYmxlZHx8dGhpcy5yYWRpb0NoZWNrZWR8fCh0aGlzLnJhZGlvQ2hlY2tlZD0hMCx0aGlzLiRkaXNwYXRjaCgiUmFkaW9Hcm91cCIsInVuaS1yYWRpby1jaGFuZ2UiLGUsdGhpcykpfSxfcmVzZXRGb3JtRGF0YTpmdW5jdGlvbigpe3RoaXMucmFkaW9DaGVja2VkPSExfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIGUoImRpdiIsdC5fZyh7c3RhdGljQ2xhc3M6WyJ1bmktcmFkaW8iXSxhdHRyczp7ZGF0YVVuY1R5cGU6InVuaS1yYWRpbyJ9LG9uOntjbGljazp0Ll9vbkNsaWNrfX0sdC4kbGlzdGVuZXJzKSxbZSgiZGl2Iix7c3RhdGljQ2xhc3M6WyJ1bmktcmFkaW8taW5wdXQiXSxzdHlsZTp0LnJhZGlvQ2hlY2tlZD90LmNoZWNrZWRTdHlsZTp0LnVuY2hlY2tlZFN0eWxlfSxbdC5yYWRpb0NoZWNrZWQ/ZSgidS10ZXh0Iix7c3RhdGljQ2xhc3M6WyJ1bmktcmFkaW8taW5wdXQtaWNvbiJdfSxbdC5fdih0Ll9zKCLuqIgiKSldKTp0Ll9lKCldLDEpLGUoInUtdGV4dCIse3N0YXRpY0NsYXNzOlsidW5pLXRleHQiXX0sW3QuX3QoImRlZmF1bHQiKV0sMildLDEpfSxzdHlsZTp7InVuaS1yYWRpbyI6e2FsaWduSXRlbXM6ImNlbnRlciIsZmxleERpcmVjdGlvbjoicm93In0sInVuaS1yYWRpby1pbnB1dCI6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsYWxpZ25JdGVtczoiY2VudGVyIixqdXN0aWZ5Q29udGVudDoiY2VudGVyIixtYXJnaW5SaWdodDoiNSIsYmFja2dyb3VuZENvbG9yOiIjZmZmZmZmIixib3JkZXJTdHlsZToic29saWQiLGJvcmRlcldpZHRoOiIxIixib3JkZXJDb2xvcjoiI2QxZDFkMSIsYm9yZGVyUmFkaXVzOjUwLHdpZHRoOiIyMiIsaGVpZ2h0OiIyMiIsb3V0bGluZTowfSwidW5pLXJhZGlvLWlucHV0LWljb24iOntmb250RmFtaWx5OiJ1bmluY29tcG9uZW50cyIsZm9udFNpemU6IjE0Iixjb2xvcjoiI2ZmZmZmZiJ9LCJ1bmktcmFkaW8taW5wdXQtZGlzYWJsZWQiOntiYWNrZ3JvdW5kQ29sb3I6IiNlMWUxZTEiLGJvcmRlckNvbG9yOiIjZDFkMWQxIixjb2xvcjoiI2FkYWRhZCJ9fX19ZnVuY3Rpb24gaW5pdCQxNyhlLHQpe2UuY29tcG9uZW50KCJyYWRpbyIsZ2V0UmFkaW8odCkpfWZ1bmN0aW9uIG5vcm1hbGl6ZU5vZGVzKGUsdCxuKXt2YXIgYz1bInNwYW4iLCJhIiwiaW1hZ2UiLCJpbWciXTtmdW5jdGlvbiBhKGUpe3JldHVybiBlLl9fYmxvY2s9ITAsZX1mdW5jdGlvbiByKG8pe3JldHVybiBmdW5jdGlvbihlLHQpe3JldHVybiByPW8saT10LCEobj1lKS5zdHlsZS5mb250U2l6ZSYmKG4uc3R5bGUuZm9udFNpemU9aS5kZWZhdWx0Rm9udFNpemUqciksYShzKG4pKTt2YXIgbixyLGl9fWZ1bmN0aW9uIHMoZSl7cmV0dXJuIWUuc3R5bGUuZm9udFdlaWdodCYmKGUuc3R5bGUuZm9udFdlaWdodD0iYm9sZCIpLGV9dmFyIHU9e2Jsb2NrcXVvdGU6YSxicjpmdW5jdGlvbihlKXtyZXR1cm4gZS5fX3ZhbHVlPSIgIixhKGUpfSxkaXY6YSxkbDphLGgxOnIoMiksaDI6cigxLjUpLGgzOnIoMS4xNyksaDQ6cigxKSxoNTpyKC44MyksaDY6ciguNjcpLGhyOmEsb2w6YSxwOmEsc3Ryb25nOnMsdGFibGU6YSx0Ym9keTphLHRmb290OmEsdGhlYWQ6YSx1bDphfSxsPS8mKGFtcHxndHxsdHxuYnNwfHF1b3R8YXBvcyk7L2csZD17YW1wOiImIixndDoiPiIsbHQ6IjwiLG5ic3A6IiAiLHF1b3Q6JyInLGFwb3M6IicifTt2YXIgZixwPXtfX2Jsb2NrOiEwLF9fYnJlYWs6ITAsY2hpbGRyZW46W119O2Z1bmN0aW9uIGkodCxlLG4pe3ZhciByPSh0Lm5hbWV8fCIiKS50b0xvd2VyQ2FzZSgpLGk9cixvPXVbcl07LTE9PT1jLmluZGV4T2YocikmJihyPSJzcGFuIiksImltZyI9PT1yJiYocj0iaW1hZ2UiKTt2YXIgYT17dHlwZTpyLF9fdHlwZTppLGF0dHI6T2JqZWN0LmNyZWF0ZShudWxsKX07aWYoKCJ0ZXh0Ij09PXQudHlwZXx8dC50ZXh0KSYmKGEuX192YWx1ZT1hLmF0dHIudmFsdWU9KHQudGV4dHx8IiIpLnRyaW0oKS5yZXBsYWNlKGwsZnVuY3Rpb24oZSx0KXtyZXR1cm4gZFt0XX0pKSx0LmF0dHJzJiZPYmplY3Qua2V5cyh0LmF0dHJzKS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyJjbGFzcyIhPT1lJiYic3R5bGUiIT09ZSYmKGEuYXR0cltlXT10LmF0dHJzW2VdKX0pLGEuc3R5bGU9bm9ybWFsaXplVW5pdChmdW5jdGlvbihlLHQpe3ZhciBuPU9iamVjdC5jcmVhdGUobnVsbCk7aWYoZS5hdHRycyl7dmFyIHI9KGUuYXR0cnMuY2xhc3N8fCIiKS5zcGxpdCgiICIpLGk9dC4kb3B0aW9ucy5zdHlsZXx8e307ci5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UmJmlbZV0mJk9iamVjdC5hc3NpZ24obixpW2VdKX0pLE9iamVjdC5hc3NpZ24obixwYXJzZVN0eWxlVGV4dChlLmF0dHJzLnN0eWxlfHwiIikpfWlmKCJpbWciPT09ZS5uYW1lfHwiaW1hZ2UiPT09ZS5uYW1lKXt2YXIgbz1lLmF0dHJzO24ud2lkdGg9bi53aWR0aHx8by53aWR0aCxuLmhlaWdodD1uLmhlaWdodHx8by5oZWlnaHR9cmV0dXJuIG59KHQsZSkpLG8mJm8oYSxuKSwocC5fX2Jsb2NrfHxhLl9fYmxvY2spJiYhZil7dmFyIHM9e3R5cGU6InNwYW4iLF9fdHlwZToiYnJlYWsiLGF0dHI6e3ZhbHVlOiJcbiJ9fTtwLmNoaWxkcmVuLnB1c2gocyksZj1bcCxzXX1yZXR1cm4oKHA9YSkuX192YWx1ZXx8ImltYWdlIj09PXAudHlwZSYmcC5hdHRyLnNyYykmJihmPW51bGwpLGEuY2hpbGRyZW49aCh0LmNoaWxkcmVuLGUsbiksKHA9YSkuX19ibG9jayYmcC5zdHlsZS5oZWlnaHQmJiEvXjAocHgpPyQvLnRlc3QocC5zdHlsZS5oZWlnaHQpJiYoZj1udWxsKSxhfWZ1bmN0aW9uIGgoZSx0LG4pe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2UubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBpKGUsdCxuKX0pOltdfXZhciBvPWgoZSx0LG4pO2lmKGYpe3ZhciB2PWZbMF0sZz1mWzFdLG09di5jaGlsZHJlbix5PW0uaW5kZXhPZihnKTttLnNwbGljZSh5LDEpfXJldHVybiBvfWZ1bmN0aW9uIGdldFJpY2hUZXh0KGUpe3JldHVybntuYW1lOiJSaWNoVGV4dCIsaXNSZXNlcnZlZDohMCxwcm9wczp7bm9kZXM6e3R5cGU6W0FycmF5LFN0cmluZ10sZGVmYXVsdDpmdW5jdGlvbigpe3JldHVybltdfX19LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD1ub3JtYWxpemVOb2Rlcyh0aGlzLm5vZGVzfHxbXSx0aGlzLiR2bm9kZS5jb250ZXh0LHtkZWZhdWx0Rm9udFNpemU6MTZ9KTtyZXR1cm4gZSgidS1yaWNoLXRleHQiLHRoaXMuX2coe2F0dHJzOnt2YWx1ZTp0fX0sdGhpcy4kbGlzdGVuZXJzKSl9fX1mdW5jdGlvbiBpbml0JDE4KGUsdCl7ZS5jb21wb25lbnQoInJpY2gtdGV4dCIsZ2V0UmljaFRleHQodCkpfWZ1bmN0aW9uIGdldFN3aXBlckl0ZW0oZSl7cmV0dXJue25hbWU6IlN3aXBlckl0ZW0iLGlzUmVzZXJ2ZWQ6ITAscHJvcHM6e2l0ZW1JZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LHJlbmRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZSgiZGl2Iix0aGlzLl9nKHtzdGF0aWNDbGFzczpbInVuaS1zd2lwZXItaXRlbSJdLHN0YXRpY1N0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6MCx0b3A6MCxyaWdodDowLGJvdHRvbTowLG92ZXJmbG93OiJoaWRkZW4ifX0sdGhpcy4kbGlzdGVuZXJzKSx0aGlzLl90KCJkZWZhdWx0IiksMil9fX1mdW5jdGlvbiBpbml0JDE5KGUsdCl7ZS5jb21wb25lbnQoInN3aXBlci1pdGVtIixnZXRTd2lwZXJJdGVtKHQpKX1mdW5jdGlvbiBnZXRTd2lwZXIocil7dmFyIHQ9ci5yZXF1aXJlTW9kdWxlKCJkb20iKTtyZXR1cm57bmFtZToiU3dpcGVyIixpc1Jlc2VydmVkOiEwLG1peGluczpbZW1pdHRlcl0scHJvcHM6e2luZGljYXRvckRvdHM6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSx2ZXJ0aWNhbDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGF1dG9wbGF5Ont0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sY2lyY3VsYXI6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxpbnRlcnZhbDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDo1ZTN9LGR1cmF0aW9uOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjUwMH0sY3VycmVudDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfSxpbmRpY2F0b3JDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoicmdiYSgwLDAsMCwuMykifSxpbmRpY2F0b3JBY3RpdmVDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwMDAwMCJ9LHByZXZpb3VzTWFyZ2luOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxuZXh0TWFyZ2luOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxjdXJyZW50SXRlbUlkOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxza2lwSGlkZGVuSXRlbUxheW91dDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGRpc3BsYXlNdWx0aXBsZUl0ZW1zOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjF9LGRpc2FibGVUb3VjaDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue2N1cnJlbnRTeW5jOnRoaXMuY3VycmVudCxjdXJyZW50Q2hhbmdlU291cmNlOiJhdXRvcGxheSJ9fSx3YXRjaDp7Y3VycmVudDpmdW5jdGlvbigpe3RoaXMuX2N1cnJlbnRDaGVjaygpfSxjdXJyZW50SXRlbUlkOmZ1bmN0aW9uKCl7dGhpcy5fY3VycmVudENoZWNrKCl9LGN1cnJlbnRTeW5jOmZ1bmN0aW9uKCl7dGhpcy4kdHJpZ2dlcigiY2hhbmdlIix0aGlzLl9nZXREZXRhaWwoKSl9fSxtZXRob2RzOntvbkNoYW5nZTpmdW5jdGlvbihlKXt2YXIgdD1lLmRldGFpbDsic3RyaW5nIj09dHlwZW9mIHQuc291cmNlJiYodGhpcy5jdXJyZW50Q2hhbmdlU291cmNlPXQuc291cmNlKSx0aGlzLmN1cnJlbnRTeW5jPXQuaW5kZXgsdGhpcy5fbGFzdE9mZnNldFJhdGlvPTB9LG9uU2Nyb2xsOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMudmVydGljYWw/ZS5kZXRhaWwub2Zmc2V0WVJhdGlvOmUuZGV0YWlsLm9mZnNldFhSYXRpbztpZigoZS5kcmFnfHxlLmRldGFpbC5kcmFnKSYmKHRoaXMuY3VycmVudENoYW5nZVNvdXJjZT0idG91Y2giKSwwPT09dCl7dmFyIG49TWF0aC5hYnModGhpcy5fbGFzdE9mZnNldFJhdGlvKTtpZigxPT09bilyZXR1cm47LjU8biYmKHQ9MSl9dGhpcy5fbGFzdE9mZnNldFJhdGlvPXQsdGhpcy4kdHJpZ2dlcigidHJhbnNpdGlvbiIse2R4OnRoaXMudmVydGljYWw/MDotdGhpcy5fd2lkdGgqdCxkeTp0aGlzLnZlcnRpY2FsPy10aGlzLl9oZWlnaHQqdDowfSl9LG9uU2Nyb2xsRW5kOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1mdW5jdGlvbigpe3QuJHRyaWdnZXIoImFuaW1hdGlvbmZpbmlzaCIsdC5fZ2V0RGV0YWlsKCkpLHQuY3VycmVudENoYW5nZVNvdXJjZT0iYXV0b3BsYXkifTsiaU9TIj09PXIuY29uZmlnLmVudi5wbGF0Zm9ybT9zZXRUaW1lb3V0KG4sNTApOm4oKX0sX2dldERldGFpbDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuY3VycmVudFN5bmMsdD10aGlzLml0ZW1zW2VdfHx7fTtyZXR1cm57Y3VycmVudDplLGN1cnJlbnRJdGVtSWQ6dC5jb21wb25lbnRJbnN0YW5jZSYmdC5jb21wb25lbnRJbnN0YW5jZS5pdGVtSWR8fCIiLHNvdXJjZTp0aGlzLmN1cnJlbnRDaGFuZ2VTb3VyY2V9fSxfY3VycmVudENoZWNrOmZ1bmN0aW9uKCl7dmFyIGU9LTE7aWYodGhpcy5jdXJyZW50SXRlbUlkKWZvcih2YXIgdD0wLG49dGhpcy5pdGVtczt0PG4ubGVuZ3RoO3QrKyl7dmFyIHI9blt0XS5jb21wb25lbnRJbnN0YW5jZTtpZihyJiZyLml0ZW1JZD09PXRoaXMuY3VycmVudEl0ZW1JZCl7ZT10O2JyZWFrfX1lPDAmJihlPU1hdGgucm91bmQodGhpcy5jdXJyZW50KXx8MCksZT1lPDA/MDplLHRoaXMuY3VycmVudFN5bmMhPT1lJiYodGhpcy5jdXJyZW50Q2hhbmdlU291cmNlPSIiLHRoaXMuY3VycmVudFN5bmM9ZSl9LF9nZXRXSDpmdW5jdGlvbigpe3ZhciByPXRoaXM7dGhpcy5fZ2V0Q29tcG9uZW50U2l6ZSh0aGlzLiRyZWZzLmVsKS50aGVuKGZ1bmN0aW9uKGUpe3ZhciB0PWUud2lkdGgsbj1lLmhlaWdodDtlLnRvcCxlLmxlZnQ7ci5fd2lkdGg9dCxyLl9oZWlnaHQ9bn0pfSxfZ2V0Q29tcG9uZW50U2l6ZTpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24obil7dC5nZXRDb21wb25lbnRSZWN0KGUsZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zaXplO24odCl9KX0pfX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuaXRlbXM9W10sdGhpcy5fd2lkdGg9dGhpcy5oZWlnaHQ9MH0sbW91bnRlZDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5fY3VycmVudENoZWNrKCksc2V0VGltZW91dChmdW5jdGlvbigpe2UuX2dldFdIKCl9LDEwMCl9LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD1bXTsoQXJyYXkuaXNBcnJheSh0aGlzLiRzbG90cy5kZWZhdWx0KT9kZWVwQ2xvbmUodGhpcy4kc2xvdHMuZGVmYXVsdCxlKTpbXSkuZm9yRWFjaChmdW5jdGlvbihlKXtlLmNvbXBvbmVudE9wdGlvbnMmJiJzd2lwZXItaXRlbSI9PT1lLmNvbXBvbmVudE9wdGlvbnMudGFnJiZ0LnB1c2goZSl9KSx0aGlzLml0ZW1zPXQ7dmFyIG49e30scj10aGlzLiRsaXN0ZW5lcnM7cmV0dXJuKHIuY2hhbmdlfHxyLmFuaW1hdGlvbmZpbmlzaHx8ci50cmFuc2l0aW9uKSYmKG4uc2Nyb2xsPXRoaXMub25TY3JvbGwsbi5zY3JvbGxlbmQ9dGhpcy5vblNjcm9sbEVuZCksci5jaGFuZ2UmJihuLmNoYW5nZT10aGlzLm9uQ2hhbmdlKSxlKCJkaXYiLHRoaXMuX2coe3JlZjoiZWwiLHN0YXRpY0NsYXNzOlsidW5pLXN3aXBlciJdfSxyKSxbZSgic2xpZGVyIix7c3RhdGljQ2xhc3M6WyJ1bmktc3dpcGVyLXNsaWRlciJdLGF0dHJzOnthdXRvUGxheTp0aGlzLmF1dG9wbGF5LGludGVydmFsOnRoaXMuaW50ZXJ2YWwsaW5kZXg6dGhpcy5jdXJyZW50U3luYyxrZWVwSW5kZXg6ITAsc2hvd0luZGljYXRvcnM6dGhpcy5pbmRpY2F0b3JEb3RzLGluZmluaXRlOnRoaXMuY2lyY3VsYXIsdmVydGljYWw6dGhpcy52ZXJ0aWNhbCxzY3JvbGxhYmxlOiF0aGlzLmRpc2FibGVUb3VjaH0sb246bn0sdC5jb25jYXQoW2UoImluZGljYXRvciIse3N0YXRpY0NsYXNzOlsidW5pLXN3aXBlci1kb3RzIl0sc3R5bGU6e2l0ZW1Db2xvcjp0aGlzLmluZGljYXRvckNvbG9yLGl0ZW1TZWxlY3RlZENvbG9yOnRoaXMuaW5kaWNhdG9yQWN0aXZlQ29sb3IsaXRlbVNpemU6OCxvcGFjaXR5OnRoaXMuaW5kaWNhdG9yRG90cz8xOjB9fSldKSwyKV0pfSxzdHlsZTp7InVuaS1zd2lwZXIiOntwb3NpdGlvbjoicmVsYXRpdmUiLGhlaWdodDoiMTUwcHgifSwidW5pLXN3aXBlci1zbGlkZXIiOntwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6MCx0b3A6MCxyaWdodDowLGJvdHRvbTowfSwidW5pLXN3aXBlci1kb3RzIjp7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OjAscmlnaHQ6MCxib3R0b206IjEwIixoZWlnaHQ6IjEwIn19fX1mdW5jdGlvbiBpbml0JDIwKGUsdCl7ZS5jb21wb25lbnQoInN3aXBlciIsZ2V0U3dpcGVyKHQpKX1mdW5jdGlvbiBnZXRTd2l0Y2goZSl7cmV0dXJue25hbWU6IlN3aXRjaCIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXIsbGlzdGVuZXJzXSxwcm9wczp7bmFtZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0saWQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LHR5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6InN3aXRjaCJ9LGNoZWNrZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxkaXNhYmxlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDA3YWZmIn19LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57c3dpdGNoQ2hlY2tlZDp0aGlzLmNoZWNrZWR9fSx3YXRjaDp7Y2hlY2tlZDpmdW5jdGlvbihlKXt0aGlzLnN3aXRjaENoZWNrZWQ9ZX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInVuaS1mb3JtLWdyb3VwLXVwZGF0ZSIse3R5cGU6ImFkZCIsdm06dGhpc30pfSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy4kZGlzcGF0Y2goIkZvcm0iLCJ1bmktZm9ybS1ncm91cC11cGRhdGUiLHt0eXBlOiJyZW1vdmUiLHZtOnRoaXN9KX0sbWV0aG9kczp7X29uQ2xpY2s6ZnVuY3Rpb24oZSx0KXt0aGlzLmRpc2FibGVkfHwodD90aGlzLnN3aXRjaENoZWNrZWQ9IXRoaXMuc3dpdGNoQ2hlY2tlZDoodGhpcy5zd2l0Y2hDaGVja2VkPWUuZGV0YWlsLnZhbHVlLHRoaXMuJHRyaWdnZXIoImNoYW5nZSIse3ZhbHVlOnRoaXMuc3dpdGNoQ2hlY2tlZH0pKSl9LF9yZXNldEZvcm1EYXRhOmZ1bmN0aW9uKCl7dGhpcy5zd2l0Y2hDaGVja2VkPSExfSxfZ2V0Rm9ybURhdGE6ZnVuY3Rpb24oKXt2YXIgZT17fTtyZXR1cm4iIiE9PXRoaXMubmFtZSYmKGUudmFsdWU9dGhpcy5zd2l0Y2hDaGVja2VkLGUua2V5PXRoaXMubmFtZSksZX19LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49dGhpcy4kbGlzdGVuZXJzO3JldHVybiBlKCJkaXYiLHQuX2coe3N0eWxlOntwYWRkaW5nUmlnaHQ6NX19LG4pLFsic3dpdGNoIj09PXQudHlwZT9lKCJkYy1zd2l0Y2giLHthdHRyczp7ZGF0YVVuY1R5cGU6InVuaS1zd2l0Y2giLGNvbG9yOnQuY29sb3IsY2hlY2tlZDp0LnN3aXRjaENoZWNrZWQsZGlzYWJsZWQ6dC5kaXNhYmxlZH0sc3R5bGU6e3dpZHRoOjUyLGhlaWdodDozMn0sb246e2NoYW5nZTp0Ll9vbkNsaWNrfX0pOnQuX2UoKSwiY2hlY2tib3giPT09dC50eXBlP2UoImNoZWNrYm94Iix7YXR0cnM6e2RhdGFVbmNUeXBlOiJ1bmktc3dpdGNoIixjaGVja2VkOnQuc3dpdGNoQ2hlY2tlZCxkaXNhYmxlZDp0LmRpc2FibGVkfSxzdHlsZTp7Y29sb3I6dC5jb2xvcn0sb246e2NsaWNrOnQuX29uQ2xpY2t9fSk6dC5fZSgpXSwxKX0sbGlzdGVuZXJzOnsibGFiZWwtY2xpY2siOiJfb25DbGljayIsIkBsYWJlbC1jbGljayI6Il9vbkNsaWNrIn19fWZ1bmN0aW9uIGluaXQkMjEoZSx0KXtlLmNvbXBvbmVudCgic3dpdGNoIixnZXRTd2l0Y2godCkpfWZ1bmN0aW9uIGdldFNsaWRlcihlKXtyZXR1cm57bmFtZToiVVNsaWRlciIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXIsbGlzdGVuZXJzXSxwcm9wczp7bmFtZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sbWluOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LG1heDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoxMDB9LHZhbHVlOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LHN0ZXA6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MX0sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxjb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiI2U5ZTllOSJ9LGJhY2tncm91bmRDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiI2U5ZTllOSJ9LGFjdGl2ZUNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDA3YWZmIn0sc2VsZWN0ZWRDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwN2FmZiJ9LGJsb2NrQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiNmZmZmZmYifSxibG9ja1NpemU6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6Mjh9LHNob3dWYWx1ZTp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue2xlZnQ6MCx3aWR0aDowLHNsaWRlclZhbHVlOk51bWJlcih0aGlzLnZhbHVlKSxzbGlkZXJUaHVtYlZhbHVlOjB9fSxjb21wdXRlZDp7dHJhY2tTdHlsZTpmdW5jdGlvbigpe3JldHVybntiYWNrZ3JvdW5kQ29sb3I6dGhpcy5fZ2V0QmdDb2xvcigpfX0sdHJhY2tBY3RpdmVTdHlsZTpmdW5jdGlvbigpe3JldHVybntiYWNrZ3JvdW5kQ29sb3I6dGhpcy5fZ2V0QWN0aXZlQ29sb3IoKSx3aWR0aDp0aGlzLnRodW1iVmFsdWUrInB4In19LHRodW1iU3R5bGU6ZnVuY3Rpb24oKXtyZXR1cm57d2lkdGg6dGhpcy5ibG9ja1NpemUrInB4IixoZWlnaHQ6dGhpcy5ibG9ja1NpemUrInB4IixtYXJnaW5Ub3A6LXRoaXMuYmxvY2tTaXplLzIrInB4IixsZWZ0OnRoaXMudGh1bWJWYWx1ZSsicHgiLGJhY2tncm91bmRDb2xvcjp0aGlzLmJsb2NrQ29sb3J9fSx0aHVtYlZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuc2xpZGVyVmFsdWUtTnVtYmVyKHRoaXMubWluKSkvKE51bWJlcih0aGlzLm1heCktTnVtYmVyKHRoaXMubWluKSkqdGhpcy53aWR0aH19LHdhdGNoOnt2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnNsaWRlclZhbHVlPU51bWJlcihlKX19LG1vdW50ZWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX3gwPTAsdGhpcy5feDE9MCx0aGlzLiRldmVudE9sZD1udWxsLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnJlcXVpcmVNb2R1bGUoImRvbSIpLmdldENvbXBvbmVudFJlY3QodC4kcmVmc1sic2xpZGVyLXRyYWNrIl0sZnVuY3Rpb24oZSl7dC5sZWZ0PWUuc2l6ZS5sZWZ0LHQud2lkdGg9ZS5zaXplLndpZHRofSl9LDUwKX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToiYWRkIix2bTp0aGlzfSl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInVuaS1mb3JtLWdyb3VwLXVwZGF0ZSIse3R5cGU6InJlbW92ZSIsdm06dGhpc30pfSxtZXRob2RzOntfaGFuZGxlU3RhcnQ6ZnVuY3Rpb24oZSl7aWYoMT09PWUuY2hhbmdlZFRvdWNoZXMubGVuZ3RoJiYhdGhpcy5fJGV2ZW50T2xkKXt2YXIgdD0odGhpcy5fJGV2ZW50T2xkPWUpLmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYO3RoaXMuX3gwPXRoaXMuX3gxPXQsdGhpcy5fb25UcmFjaygic3RhcnQiLHQpfX0sX2hhbmRsZU1vdmU6ZnVuY3Rpb24oZSl7aWYoMT09PWUuY2hhbmdlZFRvdWNoZXMubGVuZ3RoJiZ0aGlzLl8kZXZlbnRPbGQpe3ZhciB0PWUuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVg7dGhpcy5fb25UcmFjaygibW92ZSIsdCksdGhpcy5feDE9dH19LF9oYW5kbGVFbmQ6ZnVuY3Rpb24oZSl7aWYoMT09PWUuY2hhbmdlZFRvdWNoZXMubGVuZ3RoJiZ0aGlzLl8kZXZlbnRPbGQpe3ZhciB0PWUuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVg7dGhpcy5fJGV2ZW50T2xkPW51bGwsdGhpcy5fb25UcmFjaygiZW5kIix0KX19LF9vblRyYWNrOmZ1bmN0aW9uKGUsdCl7dGhpcy5kaXNhYmxlZHx8KCJtb3ZlIj09PWU/KHRoaXMuX29uVXNlckNoYW5nZWRWYWx1ZSh7eDp0fSksdGhpcy4kdHJpZ2dlcigiY2hhbmdpbmciLHt2YWx1ZTp0aGlzLnNsaWRlclZhbHVlfSkpOiJlbmQiPT09ZSYmKHRoaXMuX29uVXNlckNoYW5nZWRWYWx1ZSh7eDp0fSksdGhpcy4kdHJpZ2dlcigiY2hhbmdlIix7dmFsdWU6dGhpcy5zbGlkZXJWYWx1ZX0pKSl9LF9vblVzZXJDaGFuZ2VkVmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS54O3Q8MCYmKHQ9MCksdD50aGlzLndpZHRoJiYodD10aGlzLndpZHRoKSx0aGlzLnNsaWRlclZhbHVlPXRoaXMuX2ZpbHRlclZhbHVlKHQpfSxfZmlsdGVyVmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS90aGlzLndpZHRoKihOdW1iZXIodGhpcy5tYXgpLU51bWJlcih0aGlzLm1pbikpLG49TnVtYmVyKHRoaXMuc3RlcCk7cmV0dXJuIDA8biYmbjx0JiZ0JW4vbiE9MCYmKHQtPXQlbikscGFyc2VJbnQodCtOdW1iZXIodGhpcy5taW4pKX0sX2dldEJnQ29sb3I6ZnVuY3Rpb24oKXtyZXR1cm4iI2U5ZTllOSIhPT10aGlzLmJhY2tncm91bmRDb2xvcj90aGlzLmJhY2tncm91bmRDb2xvcjoiIzAwN2FmZiIhPT10aGlzLmNvbG9yP3RoaXMuY29sb3I6IiMwMDdhZmYifSxfZ2V0QWN0aXZlQ29sb3I6ZnVuY3Rpb24oKXtyZXR1cm4iIzAwN2FmZiIhPT10aGlzLmFjdGl2ZUNvbG9yP3RoaXMuYWN0aXZlQ29sb3I6IiNlOWU5ZTkiIT09dGhpcy5zZWxlY3RlZENvbG9yP3RoaXMuc2VsZWN0ZWRDb2xvcjoiI2U5ZTllOSJ9LF9yZXNldEZvcm1EYXRhOmZ1bmN0aW9uKCl7dGhpcy5zbGlkZXJWYWx1ZT10aGlzLm1pbn0sX2dldEZvcm1EYXRhOmZ1bmN0aW9uKCl7dmFyIGU9e307cmV0dXJuIiIhPT10aGlzLm5hbWUmJihlLnZhbHVlPXRoaXMuc2xpZGVyVmFsdWUsZS5rZXk9dGhpcy5uYW1lKSxlfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIGUoImRpdiIsdC5fZyh7c3RhdGljQ2xhc3M6WyJ1bmktc2xpZGVyIl0sc3R5bGU6e2ZsZXhEaXJlY3Rpb246ImNvbHVtbiJ9fSx0LiRsaXN0ZW5lcnMpLFtlKCJkaXYiLHtzdGF0aWNDbGFzczpbInVuaS1zbGlkZXItd3JhcHBlciJdfSxbZSgiZGl2Iix7c3RhdGljQ2xhc3M6WyJ1bmktc2xpZGVyLXRhcC1hcmVhIl0sb246e3RvdWNoc3RhcnQ6dC5faGFuZGxlU3RhcnQsdG91Y2htb3ZlOnQuX2hhbmRsZU1vdmUsdG91Y2hlbmQ6dC5faGFuZGxlRW5kfSxzdHlsZTp7ZmxleERpcmVjdGlvbjoiY29sdW1uIn19LFtlKCJkaXYiLHtyZWY6InNsaWRlci10cmFjayIsc3RhdGljQ2xhc3M6WyJ1bmktc2xpZGVyLWhhbmRsZS13cmFwcGVyIl0sc3R5bGU6dC50cmFja1N0eWxlfSxbZSgiZGl2Iix7c3RhdGljQ2xhc3M6WyJ1bmktc2xpZGVyLXRyYWNrIl0sc3R5bGU6dC50cmFja0FjdGl2ZVN0eWxlfSldKSxlKCJkaXYiLHtyZWY6InVuaS1zbGlkZXItaGFuZGxlIixzdGF0aWNDbGFzczpbInVuaS1zbGlkZXItdGh1bWIiXSxzdHlsZTp0LnRodW1iU3R5bGV9KV0pLHQuc2hvd1ZhbHVlP2UoInUtdGV4dCIse3N0YXRpY0NsYXNzOlsidW5pLXNsaWRlci12YWx1ZSJdfSxbdC5fdih0Ll9zKHQuc2xpZGVyVmFsdWUpKV0pOnQuX2UoKV0pXSl9LHN0eWxlOnsidW5pLXNsaWRlciI6e2ZsZXg6MSxtYXJnaW5Ub3A6IjEyIixtYXJnaW5SaWdodDowLG1hcmdpbkJvdHRvbToiMTIiLG1hcmdpbkxlZnQ6MCxwYWRkaW5nVG9wOjAscGFkZGluZ1JpZ2h0OjAscGFkZGluZ0JvdHRvbTowLHBhZGRpbmdMZWZ0OjB9LCJ1bmktc2xpZGVyLXdyYXBwZXIiOntmbGV4RGlyZWN0aW9uOiJyb3ciLGFsaWduSXRlbXM6ImNlbnRlciIsbWluSGVpZ2h0OiIzMCJ9LCJ1bmktc2xpZGVyLXRhcC1hcmVhIjp7cG9zaXRpb246InJlbGF0aXZlIixmbGV4OjEscGFkZGluZ1RvcDoiMTUiLHBhZGRpbmdSaWdodDowLHBhZGRpbmdCb3R0b206IjE1IixwYWRkaW5nTGVmdDowfSwidW5pLXNsaWRlci1oYW5kbGUtd3JhcHBlciI6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsbWFyZ2luVG9wOjAsbWFyZ2luUmlnaHQ6IjE4IixtYXJnaW5Cb3R0b206MCxtYXJnaW5MZWZ0OiIxOCIsaGVpZ2h0OiIyIixib3JkZXJSYWRpdXM6IjUiLGJhY2tncm91bmRDb2xvcjoiI2U5ZTllOSIsdHJhbnNpdGlvblByb3BlcnR5OiJiYWNrZ3JvdW5kQ29sb3IiLHRyYW5zaXRpb25EdXJhdGlvbjozMDAsdHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uOiJlYXNlIn0sIkBUUkFOU0lUSU9OIjp7InVuaS1zbGlkZXItaGFuZGxlLXdyYXBwZXIiOntwcm9wZXJ0eToiYmFja2dyb3VuZENvbG9yIixkdXJhdGlvbjozMDAsdGltaW5nRnVuY3Rpb246ImVhc2UifSwidW5pLXNsaWRlci10cmFjayI6e3Byb3BlcnR5OiJiYWNrZ3JvdW5kQ29sb3IiLGR1cmF0aW9uOjMwMCx0aW1pbmdGdW5jdGlvbjoiZWFzZSJ9LCJ1bmktc2xpZGVyLXRodW1iIjp7cHJvcGVydHk6ImJvcmRlckNvbG9yIixkdXJhdGlvbjozMDAsdGltaW5nRnVuY3Rpb246ImVhc2UifX0sInVuaS1zbGlkZXItdHJhY2siOntoZWlnaHQ6IjIiLGJvcmRlclJhZGl1czoiNiIsYmFja2dyb3VuZENvbG9yOiIjMDA3YWZmIix0cmFuc2l0aW9uUHJvcGVydHk6ImJhY2tncm91bmRDb2xvciIsdHJhbnNpdGlvbkR1cmF0aW9uOjMwMCx0cmFuc2l0aW9uVGltaW5nRnVuY3Rpb246ImVhc2UifSwidW5pLXNsaWRlci10aHVtYiI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsd2lkdGg6IjI4IixoZWlnaHQ6IjI4Iixib3JkZXJSYWRpdXM6NTAsYm94U2hhZG93OiIwIDAgNHB4ICNlYmViZWIiLHRyYW5zaXRpb25Qcm9wZXJ0eToiYm9yZGVyQ29sb3IiLHRyYW5zaXRpb25EdXJhdGlvbjozMDAsdHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uOiJlYXNlIn0sInVuaS1zbGlkZXItc3RlcCI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsd2lkdGg6MTAwLGhlaWdodDoiMiIsYmFja2dyb3VuZDoidHJhbnNwYXJlbnQiLHpJbmRleDoxfSwidW5pLXNsaWRlci12YWx1ZSI6e2NvbG9yOiIjODg4ODg4Iixmb250U2l6ZToiMTQiLG1hcmdpblJpZ2h0OiIxNCJ9fX19ZnVuY3Rpb24gaW5pdCQyMihlLHQpe2UuY29tcG9uZW50KCJ1LXNsaWRlciIsZ2V0U2xpZGVyKHQpKX1mdW5jdGlvbiBnZXRQaWNrZXJWaWV3KGUpe3JldHVybntuYW1lOiJQaWNrZXJWaWV3Iixpc1Jlc2VydmVkOiEwLG1peGluczpbZW1pdHRlcl0scHJvcHM6e3ZhbHVlOnt0eXBlOkFycmF5LGRlZmF1bHQ6ZnVuY3Rpb24oKXtyZXR1cm5bXX0sdmFsaWRhdG9yOmZ1bmN0aW9uKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpJiZlLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGV9KS5sZW5ndGg9PT1lLmxlbmd0aH19LGhlaWdodDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfSxpbmRpY2F0b3JTdHlsZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sbWFza1N0eWxlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybnttYXNrU3R5bGVTeW5jOnRoaXMuZ2V0U3R5bGUodGhpcy5tYXNrU3R5bGUpLGluZGljYXRvclN0eWxlU3luYzp0aGlzLmdldFN0eWxlKHRoaXMuaW5kaWNhdG9yU3R5bGUpLHZhbHVlU3luYzpbXS5jb25jYXQodGhpcy52YWx1ZSl9fSx3YXRjaDp7dmFsdWU6ZnVuY3Rpb24oZSl7dmFyIG49dGhpczt0aGlzLnZhbHVlU3luYy5sZW5ndGg9ZS5sZW5ndGgsZS5mb3JFYWNoKGZ1bmN0aW9uKGUsdCl7ZSE9PW4udmFsdWVTeW5jW3RdJiYobi52YWx1ZVN5bmNbdF09ZSxuLml0ZW1zW3RdLmNvbXBvbmVudEluc3RhbmNlLnNldEN1cnJlbnQoZSkpfSl9LG1hc2tTdHlsZTpmdW5jdGlvbihlKXt0aGlzLm1hc2tTdHlsZVN5bmM9dGhpcy5nZXRTdHlsZShlKX0saW5kaWNhdG9yU3R5bGU6ZnVuY3Rpb24oZSl7dGhpcy5pbmRpY2F0b3JTdHlsZVN5bmM9dGhpcy5nZXRTdHlsZShlKX19LG1ldGhvZHM6e2dldFN0eWxlOmZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuYXNzaWduKHt9LCJzdHJpbmciPT10eXBlb2YgZT9wYXJzZVN0eWxlVGV4dChlKTplKX0sZ2V0SXRlbUluZGV4OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLml0ZW1zLmluZGV4T2YoZSl9LGdldEl0ZW1WYWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy52YWx1ZVN5bmNbdGhpcy5nZXRJdGVtSW5kZXgoZS4kdm5vZGUpXXx8MH0sc2V0SXRlbVZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5nZXRJdGVtSW5kZXgoZS4kdm5vZGUpO3RoaXMudmFsdWVTeW5jW25dPXQ7dmFyIHI9W10uY29uY2F0KHRoaXMudmFsdWVTeW5jKTt0aGlzLiRlbWl0KCJ1cGRhdGU6dmFsdWUiLHIpLHRoaXMuJHRyaWdnZXIoImNoYW5nZSIse3ZhbHVlOnJ9KX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLml0ZW1zPVtdfSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9W107cmV0dXJuKEFycmF5LmlzQXJyYXkodGhpcy4kc2xvdHMuZGVmYXVsdCk/ZGVlcENsb25lKHRoaXMuJHNsb3RzLmRlZmF1bHQsZSk6W10pLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jb21wb25lbnRPcHRpb25zJiYicGlja2VyLXZpZXctY29sdW1uIj09PWUuY29tcG9uZW50T3B0aW9ucy50YWcmJnQucHVzaChlKX0pLHRoaXMuaXRlbXM9dCxlKCJkaXYiLHRoaXMuX2coe3N0YXRpY0NsYXNzOlsidW5pLXBpY2tlci12aWV3Il0sYXR0cnM6e3ByZXZlbnRHZXN0dXJlOiEwfX0sdGhpcy4kbGlzdGVuZXJzKSxbZSgiZGl2Iix7c3RhdGljQ2xhc3M6WyJ1bmktcGlja2VyLXZpZXctd3JhcHBlciJdfSx0KV0sMil9LHN0eWxlOnsidW5pLXBpY2tlci12aWV3Ijp7cG9zaXRpb246InJlbGF0aXZlIn0sInVuaS1waWNrZXItdmlldy13cmFwcGVyIjp7ZGlzcGxheToiZmxleCIsZmxleERpcmVjdGlvbjoicm93Iixwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxyaWdodDowLGJvdHRvbTowLG92ZXJmbG93OiJoaWRkZW4ifX19fWZ1bmN0aW9uIGluaXQkMjMoZSx0KXtlLmNvbXBvbmVudCgicGlja2VyLXZpZXciLGdldFBpY2tlclZpZXcodCkpfWZ1bmN0aW9uIGdldEhlaWdodChlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9KGUuaGVpZ2h0fHxlLmxpbmVIZWlnaHR8fCIiKS5tYXRjaCgvKC0/W1xkXC5dKylweC8pLG49MDtyZXR1cm4gdCYmKG49cGFyc2VGbG9hdCh0WzFdKSksbn1mdW5jdGlvbiBnZXRQaWNrZXJWaWV3Q29sdW1uKGUpe3ZhciByPWUucmVxdWlyZU1vZHVsZSgiZG9tIiksbz0iYW5kcm9pZCI9PT1lLmNvbmZpZy5lbnYucGxhdGZvcm0udG9Mb3dlckNhc2UoKTtyZXR1cm57bmFtZToiUGlja2VyVmlld0NvbHVtbiIsaXNSZXNlcnZlZDohMCxwcm9wczp7bGVuZ3RoOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue2luZGljYXRvckhlaWdodDpnZXRIZWlnaHQodGhpcy4kcGFyZW50LmluZGljYXRvclN0eWxlU3luYyksaGVpZ2h0OnBhcnNlRmxvYXQodGhpcy4kcGFyZW50LmhlaWdodCksY3VycmVudDp0aGlzLiRwYXJlbnQuZ2V0SXRlbVZhbHVlKHRoaXMpfX0sd2F0Y2g6e2N1cnJlbnQ6ZnVuY3Rpb24oZSl7dGhpcy5faXNNb3VudGVkJiZ0aGlzLiRwYXJlbnQuc2V0SXRlbVZhbHVlKHRoaXMsZSl9LGxlbmd0aDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2Uuc2V0Q3VycmVudChlLmN1cnJlbnQsITAsITApfSwxNTApfX0sbW91bnRlZDpmdW5jdGlvbigpe3RoaXMuY2hlY2tNb3VudGVkKCl9LG1ldGhvZHM6e2NoZWNrTW91bnRlZDpmdW5jdGlvbigpe3ZhciBuLHIsaT10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtQcm9taXNlLmFsbChbaS5fZ2V0Q29tcG9uZW50U2l6ZShpLiRyZWZzLmVsKS50aGVuKGZ1bmN0aW9uKGUpe3ZhciB0PWUuaGVpZ2h0O249aS5oZWlnaHQ9dH0pLG8mJmkubGVuZ3RoP2kuX2dldENvbXBvbmVudFNpemUoaS4kcmVmcy5pdGVtKS50aGVuKGZ1bmN0aW9uKGUpe3ZhciB0PWUuaGVpZ2h0O3I9aS5pbmRpY2F0b3JIZWlnaHQ9dC9pLmxlbmd0aH0pOmkuX2dldENvbXBvbmVudFNpemUoaS4kcmVmcy5pbmRpY2F0b3IpLnRoZW4oZnVuY3Rpb24oZSl7dmFyIHQ9ZS5oZWlnaHQ7cj1pLmluZGljYXRvckhlaWdodD10fSldKS50aGVuKGZ1bmN0aW9uKCl7biYmcj9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aS5zZXRDdXJyZW50KGkuY3VycmVudCwhMSwhMCksaS5faXNNb3VudGVkPSEwfSw1MCk6aS5jaGVja01vdW50ZWQoKX0pfSw1MCl9LG9uU2Nyb2xsZW5kOmZ1bmN0aW9uKGUpe2lmKCEoRGF0ZS5ub3coKS10aGlzLnNjcm9sbFRvRWxlbWVudFRpbWU8MzQwKSl7dmFyIHQ9ZS5kZXRhaWwuY29udGVudE9mZnNldC55LG49TWF0aC5yb3VuZCh0L3RoaXMuaW5kaWNhdG9ySGVpZ2h0KTt0JXRoaXMuaW5kaWNhdG9ySGVpZ2h0P3RoaXMuc2V0Q3VycmVudChuLCEwLCEwKTp0aGlzLmN1cnJlbnQ9bn19LHNldEN1cnJlbnQ6ZnVuY3Rpb24oZSx0LG4pe3ZvaWQgMD09PXQmJih0PSEwKSwodGhpcy5jdXJyZW50IT09ZXx8bikmJihyLnNjcm9sbFRvRWxlbWVudCh0aGlzLiRyZWZzLmNvbnRlbnQse29mZnNldDplKnRoaXMuaW5kaWNhdG9ySGVpZ2h0LGFuaW1hdGVkOnR9KSx0aGlzLmN1cnJlbnQ9ZSx0JiYodGhpcy5zY3JvbGxUb0VsZW1lbnRUaW1lPURhdGUubm93KCkpKX0sX2dldENvbXBvbmVudFNpemU6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKG4pe3IuZ2V0Q29tcG9uZW50UmVjdChlLGZ1bmN0aW9uKGUpe3ZhciB0PWUuc2l6ZTtuKHQpfSl9KX19LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLiRzbG90cy5kZWZhdWx0LG49KHRoaXMuaGVpZ2h0LXRoaXMuaW5kaWNhdG9ySGVpZ2h0KS8yLHI9dGhpcy5oZWlnaHQtbisicHgiO24rPSJweCI7dmFyIGk9e3Nob3dTY3JvbGxiYXI6ITEsc2Nyb2xsVG9CZWdpbjohMSxkZWNlbGVyYXRpb25SYXRlOi4zLHNjcm9sbFk6ITB9O3JldHVybiBvfHwoaS5zY3JvbGxUb3A9dGhpcy5jdXJyZW50KnRoaXMuaW5kaWNhdG9ySGVpZ2h0KSxlKCJkaXYiLHRoaXMuX2coe3JlZjoiZWwiLHN0YXRpY0NsYXNzOlsidW5pLXBpY2tlci12aWV3LWNvbHVtbiJdfSx0aGlzLiRsaXN0ZW5lcnMpLFtlKCJzY3JvbGwtdmlldyIse3N0YXRpY0NsYXNzOlsidW5pLXBpY2tlci12aWV3LWdyb3VwIl0sYXR0cnM6aSxvbjp7c2Nyb2xsZW5kOnRoaXMub25TY3JvbGxlbmR9LHN0eWxlOntmbGV4RGlyZWN0aW9uOiJjb2x1bW4ifX0sW2UoImRpdiIse3JlZjoiY29udGVudCIsc3RhdGljQ2xhc3M6WyJ1bmktcGlja2VyLXZpZXctY29udGVudCJdLHN0eWxlOntmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLHBhZGRpbmdUb3A6bixwYWRkaW5nQm90dG9tOm59fSxvP1tlKCJkaXYiLHtyZWY6Iml0ZW0iLHN0eWxlOntmbGV4RGlyZWN0aW9uOiJjb2x1bW4ifX0sdCldOnQpXSksZSgidS1zY2FsYWJsZSIse3N0YXRpY0NsYXNzOlsidW5pLXBpY2tlci12aWV3LW1hc2siXSxzdHlsZTp0aGlzLiRwYXJlbnQubWFza1N0eWxlU3luY30sW2UoInUtc2NhbGFibGUiLHtzdGF0aWNDbGFzczpbInVuaS1waWNrZXItdmlldy1tYXNrIiwidW5pLXBpY2tlci12aWV3LW1hc2stdG9wIl0sc3R5bGU6e2JvdHRvbTpyfX0pLGUoInUtc2NhbGFibGUiLHtzdGF0aWNDbGFzczpbInVuaS1waWNrZXItdmlldy1tYXNrIiwidW5pLXBpY2tlci12aWV3LW1hc2stYm90dG9tIl0sc3R5bGU6e3RvcDpyfX0pXSksZSgidS1zY2FsYWJsZSIse3JlZjoiaW5kaWNhdG9yIixzdGF0aWNDbGFzczpbInVuaS1waWNrZXItdmlldy1pbmRpY2F0b3IiXSxzdHlsZTpPYmplY3QuYXNzaWduKHt9LHRoaXMuJHBhcmVudC5pbmRpY2F0b3JTdHlsZVN5bmMse3RvcDpufSl9KV0sMil9LHN0eWxlOnsidW5pLXBpY2tlci12aWV3LWNvbHVtbiI6e2ZsZXg6MSxwb3NpdGlvbjoicmVsYXRpdmUiLGFsaWduSXRlbXM6InN0cmV0Y2giLG92ZXJmbG93OiJoaWRkZW4ifSwidW5pLXBpY2tlci12aWV3LW1hc2siOntwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxyaWdodDowLGJvdHRvbTowLHBvaW50ZXJFdmVudHM6Im5vbmUifSwidW5pLXBpY2tlci12aWV3LW1hc2stdG9wIjp7Ym90dG9tOjAsYmFja2dyb3VuZEltYWdlOiJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSkscmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpKSJ9LCJ1bmktcGlja2VyLXZpZXctbWFzay1ib3R0b20iOnt0b3A6MCxiYWNrZ3JvdW5kSW1hZ2U6ImxpbmVhci1ncmFkaWVudCh0byB0b3AscmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KSxyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNikpIn0sInVuaS1waWNrZXItdmlldy1ncm91cCI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjAsbGVmdDowLHJpZ2h0OjAsYm90dG9tOjB9LCJ1bmktcGlja2VyLXZpZXctY29udGVudCI6e3BhZGRpbmdUb3A6MCxwYWRkaW5nUmlnaHQ6MCxwYWRkaW5nQm90dG9tOjAscGFkZGluZ0xlZnQ6MH0sInVuaS1waWNrZXItdmlldy1pbmRpY2F0b3IiOntwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6MCxyaWdodDowLHRvcDowLGhlaWdodDoiMzRweCIscG9pbnRlckV2ZW50czoibm9uZSIsYm9yZGVyQ29sb3I6IiNlNWU1ZTUiLGJvcmRlclRvcFdpZHRoOiIxcHgiLGJvcmRlckJvdHRvbVdpZHRoOiIxcHgifX19fWZ1bmN0aW9uIGluaXQkMjQoZSx0KXtlLmNvbXBvbmVudCgicGlja2VyLXZpZXctY29sdW1uIixnZXRQaWNrZXJWaWV3Q29sdW1uKHQpKX12YXIgaW5pdENvbXBvbmVudHM9W2luaXQkMyxpbml0JDQsaW5pdCQ1LGluaXQkNixpbml0JDcsaW5pdCQ4LGluaXQkOSxpbml0JDEwLGluaXQkMTEsaW5pdCQxMixpbml0JDEzLGluaXQkMTQsaW5pdCQxNSxpbml0JDE2LGluaXQkMTcsaW5pdCQxOCxpbml0JDE5LGluaXQkMjAsaW5pdCQyMSxpbml0JDIyLGluaXQkMjMsaW5pdCQyNF0sdW5pQXBwPXtpbnN0YWxsOmZ1bmN0aW9uKHQsbil7dC5wcm90b3R5cGUuXyRidXM9bmV3IHQsdC5wcm90b3R5cGUuZ2V0T3BlbmVyRXZlbnRDaGFubmVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHJvb3QuJHNjb3BlLmV2ZW50Q2hhbm5lbHx8KHRoaXMuJHJvb3QuJHNjb3BlLmV2ZW50Q2hhbm5lbD1uZXcgbi5FdmVudENoYW5uZWwpLHRoaXMuJHJvb3QuJHNjb3BlLmV2ZW50Q2hhbm5lbH0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCIkcGFnZSIse2dldDpmdW5jdGlvbigpe3JldHVybiF0aGlzLiRzY29wZSYmdGhpcy4kcm9vdCYmdGhpcy4kcm9vdC4kc2NvcGUmJih0aGlzLiRzY29wZT10aGlzLiRyb290LiRzY29wZSksdGhpcy4kc2NvcGUuJHBhZ2V9fSksc3R5bGVNaXhpbih0KSx1bmlJZE1peGluKHQsbiksbGlmZWN5Y2xlTWl4aW4odCxuLndlZXgsbiksIndlZXgiIT09bi5fX3VuaUNvbmZpZy5udnVlQ29tcGlsZXImJmluaXRDb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24oZSl7ZSh0LG4ud2VleCxuKX0pfX07ZnVuY3Rpb24gdnVlRmFjdG9yeShlLHQpe3ZhciBtPU9iamVjdC5mcmVlemUoe30pO2Z1bmN0aW9uIGooZSl7cmV0dXJuIG51bGw9PWV9ZnVuY3Rpb24gTChlKXtyZXR1cm4gbnVsbCE9ZX1mdW5jdGlvbiBOKGUpe3JldHVybiEwPT09ZX1mdW5jdGlvbiBjKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZXx8Im51bWJlciI9PXR5cGVvZiBlfHwic3ltYm9sIj09dHlwZW9mIGV8fCJib29sZWFuIj09dHlwZW9mIGV9ZnVuY3Rpb24geShlKXtyZXR1cm4gbnVsbCE9PWUmJiJvYmplY3QiPT10eXBlb2YgZX12YXIgbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIGQoZSl7cmV0dXJuIG4uY2FsbChlKS5zbGljZSg4LC0xKX1mdW5jdGlvbiB1KGUpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09bi5jYWxsKGUpfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIltvYmplY3QgUmVnRXhwXSI9PT1uLmNhbGwoZSl9ZnVuY3Rpb24gbyhlKXt2YXIgdD1wYXJzZUZsb2F0KFN0cmluZyhlKSk7cmV0dXJuIDA8PXQmJk1hdGguZmxvb3IodCk9PT10JiZpc0Zpbml0ZShlKX1mdW5jdGlvbiBfKGUpe3JldHVybiBMKGUpJiYiZnVuY3Rpb24iPT10eXBlb2YgZS50aGVuJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5jYXRjaH1mdW5jdGlvbiByKGUpe3JldHVybiBudWxsPT1lPyIiOkFycmF5LmlzQXJyYXkoZSl8fHUoZSkmJmUudG9TdHJpbmc9PT1uP0pTT04uc3RyaW5naWZ5KGUsbnVsbCwyKTpTdHJpbmcoZSl9ZnVuY3Rpb24gYShlKXt2YXIgdD1wYXJzZUZsb2F0KGUpO3JldHVybiBpc05hTih0KT9lOnR9ZnVuY3Rpb24gcyhlLHQpe2Zvcih2YXIgbj1PYmplY3QuY3JlYXRlKG51bGwpLHI9ZS5zcGxpdCgiLCIpLGk9MDtpPHIubGVuZ3RoO2krKyluW3JbaV1dPSEwO3JldHVybiB0P2Z1bmN0aW9uKGUpe3JldHVybiBuW2UudG9Mb3dlckNhc2UoKV19OmZ1bmN0aW9uKGUpe3JldHVybiBuW2VdfX12YXIgbD1zKCJzbG90LGNvbXBvbmVudCIsITApLGY9cygia2V5LHJlZixzbG90LHNsb3Qtc2NvcGUsaXMiKTtmdW5jdGlvbiBiKGUsdCl7aWYoZS5sZW5ndGgpe3ZhciBuPWUuaW5kZXhPZih0KTtpZigtMTxuKXJldHVybiBlLnNwbGljZShuLDEpfX12YXIgcD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIHcoZSx0KXtyZXR1cm4gcC5jYWxsKGUsdCl9ZnVuY3Rpb24gaCh0KXt2YXIgbj1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbltlXXx8KG5bZV09dChlKSl9fXZhciB2PS8tKFx3KS9nLGc9aChmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKHYsZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD90LnRvVXBwZXJDYXNlKCk6IiJ9KX0pLGs9aChmdW5jdGlvbihlKXtyZXR1cm4gZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnNsaWNlKDEpfSksUz0vXEIoW0EtWl0pL2cseD1oKGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoUywiLSQxIikudG9Mb3dlckNhc2UoKX0pO3ZhciBDPUZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kP2Z1bmN0aW9uKGUsdCl7cmV0dXJuIGUuYmluZCh0KX06ZnVuY3Rpb24obixyKXtmdW5jdGlvbiBlKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIHQ/MTx0P24uYXBwbHkocixhcmd1bWVudHMpOm4uY2FsbChyLGUpOm4uY2FsbChyKX1yZXR1cm4gZS5fbGVuZ3RoPW4ubGVuZ3RoLGV9O2Z1bmN0aW9uIFQoZSx0KXt0PXR8fDA7Zm9yKHZhciBuPWUubGVuZ3RoLXQscj1uZXcgQXJyYXkobik7bi0tOylyW25dPWVbbit0XTtyZXR1cm4gcn1mdW5jdGlvbiBPKGUsdCl7Zm9yKHZhciBuIGluIHQpZVtuXT10W25dO3JldHVybiBlfWZ1bmN0aW9uIEUoZSl7Zm9yKHZhciB0PXt9LG49MDtuPGUubGVuZ3RoO24rKyllW25dJiZPKHQsZVtuXSk7cmV0dXJuIHR9ZnVuY3Rpb24gQShlLHQsbil7fXZhciBJPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4hMX0sJD1mdW5jdGlvbihlKXtyZXR1cm4gZX07ZnVuY3Rpb24gUCh0LG4pe2lmKHQ9PT1uKXJldHVybiEwO3ZhciBlPXkodCkscj15KG4pO2lmKCFlfHwhcilyZXR1cm4hZSYmIXImJlN0cmluZyh0KT09PVN0cmluZyhuKTt0cnl7dmFyIGk9QXJyYXkuaXNBcnJheSh0KSxvPUFycmF5LmlzQXJyYXkobik7aWYoaSYmbylyZXR1cm4gdC5sZW5ndGg9PT1uLmxlbmd0aCYmdC5ldmVyeShmdW5jdGlvbihlLHQpe3JldHVybiBQKGUsblt0XSl9KTtpZih0IGluc3RhbmNlb2YgRGF0ZSYmbiBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIHQuZ2V0VGltZSgpPT09bi5nZXRUaW1lKCk7aWYoaXx8bylyZXR1cm4hMTt2YXIgYT1PYmplY3Qua2V5cyh0KSxzPU9iamVjdC5rZXlzKG4pO3JldHVybiBhLmxlbmd0aD09PXMubGVuZ3RoJiZhLmV2ZXJ5KGZ1bmN0aW9uKGUpe3JldHVybiBQKHRbZV0sbltlXSl9KX1jYXRjaChlKXtyZXR1cm4hMX19ZnVuY3Rpb24gTShlLHQpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKWlmKFAoZVtuXSx0KSlyZXR1cm4gbjtyZXR1cm4tMX1mdW5jdGlvbiBCKGUpe3ZhciB0PSExO3JldHVybiBmdW5jdGlvbigpe3R8fCh0PSEwLGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX19dmFyIEQ9ImRhdGEtc2VydmVyLXJlbmRlcmVkIixSPVsiY29tcG9uZW50IiwiZGlyZWN0aXZlIiwiZmlsdGVyIl0sRj1bImJlZm9yZUNyZWF0ZSIsImNyZWF0ZWQiLCJiZWZvcmVNb3VudCIsIm1vdW50ZWQiLCJiZWZvcmVVcGRhdGUiLCJ1cGRhdGVkIiwiYmVmb3JlRGVzdHJveSIsImRlc3Ryb3llZCIsImFjdGl2YXRlZCIsImRlYWN0aXZhdGVkIiwiZXJyb3JDYXB0dXJlZCIsInNlcnZlclByZWZldGNoIl0sej17b3B0aW9uTWVyZ2VTdHJhdGVnaWVzOk9iamVjdC5jcmVhdGUobnVsbCksc2lsZW50OiExLHByb2R1Y3Rpb25UaXA6ITAsZGV2dG9vbHM6ITAscGVyZm9ybWFuY2U6ITEsZXJyb3JIYW5kbGVyOm51bGwsd2FybkhhbmRsZXI6bnVsbCxpZ25vcmVkRWxlbWVudHM6W10sa2V5Q29kZXM6T2JqZWN0LmNyZWF0ZShudWxsKSxpc1Jlc2VydmVkVGFnOkksaXNSZXNlcnZlZEF0dHI6SSxpc1Vua25vd25FbGVtZW50OkksZ2V0VGFnTmFtZXNwYWNlOkEscGFyc2VQbGF0Zm9ybVRhZ05hbWU6JCxtdXN0VXNlUHJvcDpJLGFzeW5jOiEwLF9saWZlY3ljbGVIb29rczpGfSxWPS9hLXpBLVpcdTAwQjdcdTAwQzAtXHUwMEQ2XHUwMEQ4LVx1MDBGNlx1MDBGOC1cdTAzN0RcdTAzN0YtXHUxRkZGXHUyMDBDLVx1MjAwRFx1MjAzRi1cdTIwNDBcdTIwNzAtXHUyMThGXHUyQzAwLVx1MkZFRlx1MzAwMS1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZGRC87ZnVuY3Rpb24gVShlKXt2YXIgdD0oZSsiIikuY2hhckNvZGVBdCgwKTtyZXR1cm4gMzY9PT10fHw5NT09PXR9ZnVuY3Rpb24gcShlLHQsbixyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpuLGVudW1lcmFibGU6ISFyLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pfXZhciBXPW5ldyBSZWdFeHAoIlteIitWLnNvdXJjZSsiLiRfXFxkXSIpO3ZhciBILEc9Il9fcHJvdG9fXyJpbnt9LFg9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3csWT0idW5kZWZpbmVkIiE9dHlwZW9mIFdYRW52aXJvbm1lbnQmJiEhV1hFbnZpcm9ubWVudC5wbGF0Zm9ybSxKPVkmJldYRW52aXJvbm1lbnQucGxhdGZvcm0udG9Mb3dlckNhc2UoKSxLPVgmJndpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCksWj1LJiYvbXNpZXx0cmlkZW50Ly50ZXN0KEspLFE9KEsmJksuaW5kZXhPZigibXNpZSA5LjAiKSxLJiYwPEsuaW5kZXhPZigiZWRnZS8iKSksZWU9KEsmJksuaW5kZXhPZigiYW5kcm9pZCIpLEsmJi9pcGhvbmV8aXBhZHxpcG9kfGlvcy8udGVzdChLKSxLJiYvY2hyb21lXC9cZCsvLnRlc3QoSyksSyYmL3BoYW50b21qcy8udGVzdChLKSxLJiZLLm1hdGNoKC9maXJlZm94XC8oXGQrKS8pLHt9LndhdGNoKTtpZihYKXRyeXt2YXIgdGU9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KHRlLCJwYXNzaXZlIix7Z2V0OmZ1bmN0aW9uKCl7fX0pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0LXBhc3NpdmUiLG51bGwsdGUpfWNhdGNoKGUpe312YXIgbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09SCYmKEg9IVgmJiFZJiZ2b2lkIDAhPT1nbG9iYWwmJihnbG9iYWwucHJvY2VzcyYmInNlcnZlciI9PT1nbG9iYWwucHJvY2Vzcy5lbnYuVlVFX0VOVikpLEh9LHJlPVgmJndpbmRvdy5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fO2Z1bmN0aW9uIGllKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYvbmF0aXZlIGNvZGUvLnRlc3QoZS50b1N0cmluZygpKX12YXIgb2UsYWU9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJmllKFN5bWJvbCkmJiJ1bmRlZmluZWQiIT10eXBlb2YgUmVmbGVjdCYmaWUoUmVmbGVjdC5vd25LZXlzKTtvZT0idW5kZWZpbmVkIiE9dHlwZW9mIFNldCYmaWUoU2V0KT9TZXQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dGhpcy5zZXQ9T2JqZWN0LmNyZWF0ZShudWxsKX1yZXR1cm4gZS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGUpe3JldHVybiEwPT09dGhpcy5zZXRbZV19LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlKXt0aGlzLnNldFtlXT0hMH0sZS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnNldD1PYmplY3QuY3JlYXRlKG51bGwpfSxlfSgpO3ZhciBzZT1BLGNlPUEsdWU9QSxsZT1BLGRlPSJ1bmRlZmluZWQiIT10eXBlb2YgY29uc29sZSxmZT0vKD86XnxbLV9dKShcdykvZztzZT1mdW5jdGlvbihlLHQpe3ZhciBuPXQ/dWUodCk6IiI7ei53YXJuSGFuZGxlcj96Lndhcm5IYW5kbGVyLmNhbGwobnVsbCxlLHQsbik6ZGUmJiF6LnNpbGVudCYmY29uc29sZS5lcnJvcigiW1Z1ZSB3YXJuXTogIitlK24pfSxjZT1mdW5jdGlvbihlLHQpe2RlJiYhei5zaWxlbnQmJmNvbnNvbGUud2FybigiW1Z1ZSB0aXBdOiAiK2UrKHQ/dWUodCk6IiIpKX0sbGU9ZnVuY3Rpb24oZSx0KXtpZihlLiRyb290PT09ZSlyZXR1cm4gZS4kb3B0aW9ucyYmZS4kb3B0aW9ucy5fX2ZpbGU/ImF0ICIrZS4kb3B0aW9ucy5fX2ZpbGUrIjoxIjoiPFJvb3Q+Ijt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgZSYmbnVsbCE9ZS5jaWQ/ZS5vcHRpb25zOmUuX2lzVnVlP2UuJG9wdGlvbnN8fGUuY29uc3RydWN0b3Iub3B0aW9uczplLHI9bi5uYW1lfHxuLl9jb21wb25lbnRUYWcsaT1uLl9fZmlsZTtpZighciYmaSl7dmFyIG89aS5tYXRjaCgvKFteL1xcXSspXC52dWUkLyk7cj1vJiZvWzFdfXJldHVybihyPyI8IityLnJlcGxhY2UoZmUsZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9VcHBlckNhc2UoKX0pLnJlcGxhY2UoL1stX10vZywiIikrIj4iOiI8QW5vbnltb3VzPiIpKyhpJiYhMSE9PXQ/IiBhdCAiK2krIjoxIjoiIil9O3VlPWZ1bmN0aW9uKGUpe2lmKGUuX2lzVnVlJiZlLiRwYXJlbnQpe2Zvcih2YXIgdD1bXSxuPTA7ZTspe2lmKDA8dC5sZW5ndGgpe3ZhciByPXRbdC5sZW5ndGgtMV07aWYoci5jb25zdHJ1Y3Rvcj09PWUuY29uc3RydWN0b3Ipe24rKyxlPWUuJHBhcmVudDtjb250aW51ZX0wPG4mJih0W3QubGVuZ3RoLTFdPVtyLG5dLG49MCl9dC5wdXNoKGUpLGU9ZS4kcGFyZW50fXJldHVybiJcblxuZm91bmQgaW5cblxuIit0Lm1hcChmdW5jdGlvbihlLHQpe3JldHVybiIiKygwPT09dD8iLS0tXHgzZSAiOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPSIiO3Q7KXQlMj09MSYmKG4rPWUpLDE8dCYmKGUrPWUpLHQ+Pj0xO3JldHVybiBufSgi44CAIiwzKzEqdCkpKyhBcnJheS5pc0FycmF5KGUpP2xlKGVbMF0pKyIuLi4gKCIrZVsxXSsiIHJlY3Vyc2l2ZSBjYWxscykiOmxlKGUpKX0pLmpvaW4oIlxuIil9cmV0dXJuIlxuXG4oZm91bmQgIitsZShlKSsiKSJ9O3ZhciBwZT0wLGhlPWZ1bmN0aW9uKCl7dGhpcy5pZD12b2lkIDAhPT10P3QudWlkKys6cGUrKyx0aGlzLnN1YnM9W119O2Z1bmN0aW9uIHZlKGUpe2hlLlNoYXJlZE9iamVjdC50YXJnZXRTdGFjay5wdXNoKGUpLGhlLlNoYXJlZE9iamVjdC50YXJnZXQ9ZX1mdW5jdGlvbiBnZSgpe2hlLlNoYXJlZE9iamVjdC50YXJnZXRTdGFjay5wb3AoKSxoZS5TaGFyZWRPYmplY3QudGFyZ2V0PWhlLlNoYXJlZE9iamVjdC50YXJnZXRTdGFja1toZS5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2subGVuZ3RoLTFdfWhlLnByb3RvdHlwZS5hZGRTdWI9ZnVuY3Rpb24oZSl7dGhpcy5zdWJzLnB1c2goZSl9LGhlLnByb3RvdHlwZS5yZW1vdmVTdWI9ZnVuY3Rpb24oZSl7Yih0aGlzLnN1YnMsZSl9LGhlLnByb3RvdHlwZS5kZXBlbmQ9ZnVuY3Rpb24oKXtoZS5TaGFyZWRPYmplY3QudGFyZ2V0JiZoZS5TaGFyZWRPYmplY3QudGFyZ2V0LmFkZERlcCh0aGlzKX0saGUucHJvdG90eXBlLm5vdGlmeT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc3Vicy5zbGljZSgpO3ouYXN5bmN8fGUuc29ydChmdW5jdGlvbihlLHQpe3JldHVybiBlLmlkLXQuaWR9KTtmb3IodmFyIHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspZVt0XS51cGRhdGUoKX0saGUuU2hhcmVkT2JqZWN0PXZvaWQgMCE9PXQ/dDp7fSxoZS5TaGFyZWRPYmplY3QudGFyZ2V0PW51bGwsaGUuU2hhcmVkT2JqZWN0LnRhcmdldFN0YWNrPVtdO3ZhciBtZT1mdW5jdGlvbihlLHQsbixyLGksbyxhLHMpe3RoaXMudGFnPWUsdGhpcy5kYXRhPXQsdGhpcy5jaGlsZHJlbj1uLHRoaXMudGV4dD1yLHRoaXMuZWxtPWksdGhpcy5ucz12b2lkIDAsdGhpcy5jb250ZXh0PW8sdGhpcy5mbkNvbnRleHQ9dm9pZCAwLHRoaXMuZm5PcHRpb25zPXZvaWQgMCx0aGlzLmZuU2NvcGVJZD12b2lkIDAsdGhpcy5rZXk9dCYmdC5rZXksdGhpcy5jb21wb25lbnRPcHRpb25zPWEsdGhpcy5jb21wb25lbnRJbnN0YW5jZT12b2lkIDAsdGhpcy5wYXJlbnQ9dm9pZCAwLHRoaXMucmF3PSExLHRoaXMuaXNTdGF0aWM9ITEsdGhpcy5pc1Jvb3RJbnNlcnQ9ITAsdGhpcy5pc0NvbW1lbnQ9ITEsdGhpcy5pc0Nsb25lZD0hMSx0aGlzLmlzT25jZT0hMSx0aGlzLmFzeW5jRmFjdG9yeT1zLHRoaXMuYXN5bmNNZXRhPXZvaWQgMCx0aGlzLmlzQXN5bmNQbGFjZWhvbGRlcj0hMX0seWU9e2NoaWxkOntjb25maWd1cmFibGU6ITB9fTt5ZS5jaGlsZC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb21wb25lbnRJbnN0YW5jZX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMobWUucHJvdG90eXBlLHllKTt2YXIgX2U9ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9IiIpO3ZhciB0PW5ldyBtZTtyZXR1cm4gdC50ZXh0PWUsdC5pc0NvbW1lbnQ9ITAsdH07ZnVuY3Rpb24gYmUoZSl7cmV0dXJuIG5ldyBtZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCxTdHJpbmcoZSkpfWZ1bmN0aW9uIHdlKGUpe3ZhciB0PW5ldyBtZShlLnRhZyxlLmRhdGEsZS5jaGlsZHJlbiYmZS5jaGlsZHJlbi5zbGljZSgpLGUudGV4dCxlLmVsbSxlLmNvbnRleHQsZS5jb21wb25lbnRPcHRpb25zLGUuYXN5bmNGYWN0b3J5KTtyZXR1cm4gdC5ucz1lLm5zLHQuaXNTdGF0aWM9ZS5pc1N0YXRpYyx0LmtleT1lLmtleSx0LmlzQ29tbWVudD1lLmlzQ29tbWVudCx0LmZuQ29udGV4dD1lLmZuQ29udGV4dCx0LmZuT3B0aW9ucz1lLmZuT3B0aW9ucyx0LmZuU2NvcGVJZD1lLmZuU2NvcGVJZCx0LmFzeW5jTWV0YT1lLmFzeW5jTWV0YSx0LmlzQ2xvbmVkPSEwLHR9dmFyIGtlPUFycmF5LnByb3RvdHlwZSxTZT1PYmplY3QuY3JlYXRlKGtlKTtbInB1c2giLCJwb3AiLCJzaGlmdCIsInVuc2hpZnQiLCJzcGxpY2UiLCJzb3J0IiwicmV2ZXJzZSJdLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIHM9a2VbYV07cShTZSxhLGZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cyx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09ZVtuXTt2YXIgcixpPXMuYXBwbHkodGhpcyx0KSxvPXRoaXMuX19vYl9fO3N3aXRjaChhKXtjYXNlInB1c2giOmNhc2UidW5zaGlmdCI6cj10O2JyZWFrO2Nhc2Uic3BsaWNlIjpyPXQuc2xpY2UoMil9cmV0dXJuIHImJm8ub2JzZXJ2ZUFycmF5KHIpLG8uZGVwLm5vdGlmeSgpLGl9KX0pO3ZhciB4ZT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhTZSksQ2U9ITA7ZnVuY3Rpb24gVGUoZSl7Q2U9ZX12YXIgT2U9ZnVuY3Rpb24oZSl7dmFyIHQ7dGhpcy52YWx1ZT1lLHRoaXMuZGVwPW5ldyBoZSx0aGlzLnZtQ291bnQ9MCxxKGUsIl9fb2JfXyIsdGhpcyksQXJyYXkuaXNBcnJheShlKT8oRz8odD1TZSxlLl9fcHJvdG9fXz10KTpmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPTAsaT1uLmxlbmd0aDtyPGk7cisrKXt2YXIgbz1uW3JdO3EoZSxvLHRbb10pfX0oZSxTZSx4ZSksdGhpcy5vYnNlcnZlQXJyYXkoZSkpOnRoaXMud2FsayhlKX07ZnVuY3Rpb24gRWUoZSx0KXt2YXIgbjtpZih5KGUpJiYhKGUgaW5zdGFuY2VvZiBtZSkpcmV0dXJuIHcoZSwiX19vYl9fIikmJmUuX19vYl9fIGluc3RhbmNlb2YgT2U/bj1lLl9fb2JfXzpDZSYmIW5lKCkmJihBcnJheS5pc0FycmF5KGUpfHx1KGUpKSYmT2JqZWN0LmlzRXh0ZW5zaWJsZShlKSYmIWUuX2lzVnVlJiYobj1uZXcgT2UoZSkpLHQmJm4mJm4udm1Db3VudCsrLG59ZnVuY3Rpb24gQWUobixlLHIsaSxvKXt2YXIgYT1uZXcgaGUsdD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSk7aWYoIXR8fCExIT09dC5jb25maWd1cmFibGUpe3ZhciBzPXQmJnQuZ2V0LGM9dCYmdC5zZXQ7cyYmIWN8fDIhPT1hcmd1bWVudHMubGVuZ3RofHwocj1uW2VdKTt2YXIgdT0hbyYmRWUocik7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sZSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7dmFyIGU9cz9zLmNhbGwobik6cjtyZXR1cm4gaGUuU2hhcmVkT2JqZWN0LnRhcmdldCYmKGEuZGVwZW5kKCksdSYmKHUuZGVwLmRlcGVuZCgpLEFycmF5LmlzQXJyYXkoZSkmJmZ1bmN0aW9uIGUodCl7Zm9yKHZhciBuPXZvaWQgMCxyPTAsaT10Lmxlbmd0aDtyPGk7cisrKShuPXRbcl0pJiZuLl9fb2JfXyYmbi5fX29iX18uZGVwLmRlcGVuZCgpLEFycmF5LmlzQXJyYXkobikmJmUobil9KGUpKSksZX0sc2V0OmZ1bmN0aW9uKGUpe3ZhciB0PXM/cy5jYWxsKG4pOnI7ZT09PXR8fGUhPWUmJnQhPXR8fChpJiZpKCkscyYmIWN8fChjP2MuY2FsbChuLGUpOnI9ZSx1PSFvJiZFZShlKSxhLm5vdGlmeSgpKSl9fSl9fWZ1bmN0aW9uIEllKGUsdCxuKXtpZigoaihlKXx8YyhlKSkmJnNlKCJDYW5ub3Qgc2V0IHJlYWN0aXZlIHByb3BlcnR5IG9uIHVuZGVmaW5lZCwgbnVsbCwgb3IgcHJpbWl0aXZlIHZhbHVlOiAiK2UpLEFycmF5LmlzQXJyYXkoZSkmJm8odCkpcmV0dXJuIGUubGVuZ3RoPU1hdGgubWF4KGUubGVuZ3RoLHQpLGUuc3BsaWNlKHQsMSxuKSxuO2lmKHQgaW4gZSYmISh0IGluIE9iamVjdC5wcm90b3R5cGUpKXJldHVybiBlW3RdPW47dmFyIHI9ZS5fX29iX187cmV0dXJuIGUuX2lzVnVlfHxyJiZyLnZtQ291bnQ/KHNlKCJBdm9pZCBhZGRpbmcgcmVhY3RpdmUgcHJvcGVydGllcyB0byBhIFZ1ZSBpbnN0YW5jZSBvciBpdHMgcm9vdCAkZGF0YSBhdCBydW50aW1lIC0gZGVjbGFyZSBpdCB1cGZyb250IGluIHRoZSBkYXRhIG9wdGlvbi4iKSxuKTpyPyhBZShyLnZhbHVlLHQsbiksci5kZXAubm90aWZ5KCksbik6ZVt0XT1ufWZ1bmN0aW9uICRlKGUsdCl7aWYoKGooZSl8fGMoZSkpJiZzZSgiQ2Fubm90IGRlbGV0ZSByZWFjdGl2ZSBwcm9wZXJ0eSBvbiB1bmRlZmluZWQsIG51bGwsIG9yIHByaW1pdGl2ZSB2YWx1ZTogIitlKSxBcnJheS5pc0FycmF5KGUpJiZvKHQpKWUuc3BsaWNlKHQsMSk7ZWxzZXt2YXIgbj1lLl9fb2JfXztlLl9pc1Z1ZXx8biYmbi52bUNvdW50P3NlKCJBdm9pZCBkZWxldGluZyBwcm9wZXJ0aWVzIG9uIGEgVnVlIGluc3RhbmNlIG9yIGl0cyByb290ICRkYXRhIC0ganVzdCBzZXQgaXQgdG8gbnVsbC4iKTp3KGUsdCkmJihkZWxldGUgZVt0XSxuJiZuLmRlcC5ub3RpZnkoKSl9fU9lLnByb3RvdHlwZS53YWxrPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDtuKyspQWUoZSx0W25dKX0sT2UucHJvdG90eXBlLm9ic2VydmVBcnJheT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspRWUoZVt0XSl9O3ZhciBQZT16Lm9wdGlvbk1lcmdlU3RyYXRlZ2llcztmdW5jdGlvbiBNZShlLHQpe2lmKCF0KXJldHVybiBlO2Zvcih2YXIgbixyLGksbz1hZT9SZWZsZWN0Lm93bktleXModCk6T2JqZWN0LmtleXModCksYT0wO2E8by5sZW5ndGg7YSsrKSJfX29iX18iIT09KG49b1thXSkmJihyPWVbbl0saT10W25dLHcoZSxuKT9yIT09aSYmdShyKSYmdShpKSYmTWUocixpKTpJZShlLG4saSkpO3JldHVybiBlfWZ1bmN0aW9uIGplKG4scixpKXtyZXR1cm4gaT9mdW5jdGlvbigpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiByP3IuY2FsbChpLGkpOnIsdD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmNhbGwoaSxpKTpuO3JldHVybiBlP01lKGUsdCk6dH06cj9uP2Z1bmN0aW9uKCl7cmV0dXJuIE1lKCJmdW5jdGlvbiI9PXR5cGVvZiByP3IuY2FsbCh0aGlzLHRoaXMpOnIsImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5jYWxsKHRoaXMsdGhpcyk6bil9OnI6bn1mdW5jdGlvbiBMZShlLHQpe3ZhciBuPXQ/ZT9lLmNvbmNhdCh0KTpBcnJheS5pc0FycmF5KHQpP3Q6W3RdOmU7cmV0dXJuIG4/ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoO24rKyktMT09PXQuaW5kZXhPZihlW25dKSYmdC5wdXNoKGVbbl0pO3JldHVybiB0fShuKTpufWZ1bmN0aW9uIE5lKGUsdCxuLHIpe3ZhciBpPU9iamVjdC5jcmVhdGUoZXx8bnVsbCk7cmV0dXJuIHQ/KFJlKHIsdCxuKSxPKGksdCkpOml9UGUuZWw9UGUucHJvcHNEYXRhPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBufHxzZSgnb3B0aW9uICInK3IrJyIgY2FuIG9ubHkgYmUgdXNlZCBkdXJpbmcgaW5zdGFuY2UgY3JlYXRpb24gd2l0aCB0aGUgYG5ld2Aga2V5d29yZC4nKSxCZShlLHQpfSxQZS5kYXRhPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj9qZShlLHQsbik6dCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/KHNlKCdUaGUgImRhdGEiIG9wdGlvbiBzaG91bGQgYmUgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBwZXItaW5zdGFuY2UgdmFsdWUgaW4gY29tcG9uZW50IGRlZmluaXRpb25zLicsbiksZSk6amUoZSx0KX0sRi5mb3JFYWNoKGZ1bmN0aW9uKGUpe1BlW2VdPUxlfSksUi5mb3JFYWNoKGZ1bmN0aW9uKGUpe1BlW2UrInMiXT1OZX0pLFBlLndhdGNoPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9PT1lZSYmKGU9dm9pZCAwKSx0PT09ZWUmJih0PXZvaWQgMCksIXQpcmV0dXJuIE9iamVjdC5jcmVhdGUoZXx8bnVsbCk7aWYoUmUocix0LG4pLCFlKXJldHVybiB0O3ZhciBpPXt9O2Zvcih2YXIgbyBpbiBPKGksZSksdCl7dmFyIGE9aVtvXSxzPXRbb107YSYmIUFycmF5LmlzQXJyYXkoYSkmJihhPVthXSksaVtvXT1hP2EuY29uY2F0KHMpOkFycmF5LmlzQXJyYXkocyk/czpbc119cmV0dXJuIGl9LFBlLnByb3BzPVBlLm1ldGhvZHM9UGUuaW5qZWN0PVBlLmNvbXB1dGVkPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKHQmJlJlKHIsdCxuKSwhZSlyZXR1cm4gdDt2YXIgaT1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBPKGksZSksdCYmTyhpLHQpLGl9LFBlLnByb3ZpZGU9amU7dmFyIEJlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQ/ZTp0fTtmdW5jdGlvbiBEZShlKXtuZXcgUmVnRXhwKCJeW2EtekEtWl1bXFwtXFwuMC05XyIrVi5zb3VyY2UrIl0qJCIpLnRlc3QoZSl8fHNlKCdJbnZhbGlkIGNvbXBvbmVudCBuYW1lOiAiJytlKyciLiBDb21wb25lbnQgbmFtZXMgc2hvdWxkIGNvbmZvcm0gdG8gdmFsaWQgY3VzdG9tIGVsZW1lbnQgbmFtZSBpbiBodG1sNSBzcGVjaWZpY2F0aW9uLicpLChsKGUpfHx6LmlzUmVzZXJ2ZWRUYWcoZSkpJiZzZSgiRG8gbm90IHVzZSBidWlsdC1pbiBvciByZXNlcnZlZCBIVE1MIGVsZW1lbnRzIGFzIGNvbXBvbmVudCBpZDogIitlKX1mdW5jdGlvbiBSZShlLHQsbil7dSh0KXx8c2UoJ0ludmFsaWQgdmFsdWUgZm9yIG9wdGlvbiAiJytlKyciOiBleHBlY3RlZCBhbiBPYmplY3QsIGJ1dCBnb3QgJytkKHQpKyIuIixuKX1mdW5jdGlvbiBGZShuLHIsaSl7aWYoZnVuY3Rpb24oZSl7Zm9yKHZhciB0IGluIGUuY29tcG9uZW50cylEZSh0KX0ociksImZ1bmN0aW9uIj09dHlwZW9mIHImJihyPXIub3B0aW9ucyksZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnByb3BzO2lmKG4pe3ZhciByLGksbz17fTtpZihBcnJheS5pc0FycmF5KG4pKWZvcihyPW4ubGVuZ3RoO3ItLTspInN0cmluZyI9PXR5cGVvZihpPW5bcl0pP29bZyhpKV09e3R5cGU6bnVsbH06c2UoInByb3BzIG11c3QgYmUgc3RyaW5ncyB3aGVuIHVzaW5nIGFycmF5IHN5bnRheC4iKTtlbHNlIGlmKHUobikpZm9yKHZhciBhIGluIG4paT1uW2FdLG9bZyhhKV09dShpKT9pOnt0eXBlOml9O2Vsc2Ugc2UoJ0ludmFsaWQgdmFsdWUgZm9yIG9wdGlvbiAicHJvcHMiOiBleHBlY3RlZCBhbiBBcnJheSBvciBhbiBPYmplY3QsIGJ1dCBnb3QgJytkKG4pKyIuIix0KTtlLnByb3BzPW99fShyLGkpLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5pbmplY3Q7aWYobil7dmFyIHI9ZS5pbmplY3Q9e307aWYoQXJyYXkuaXNBcnJheShuKSlmb3IodmFyIGk9MDtpPG4ubGVuZ3RoO2krKylyW25baV1dPXtmcm9tOm5baV19O2Vsc2UgaWYodShuKSlmb3IodmFyIG8gaW4gbil7dmFyIGE9bltvXTtyW29dPXUoYSk/Tyh7ZnJvbTpvfSxhKTp7ZnJvbTphfX1lbHNlIHNlKCdJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gImluamVjdCI6IGV4cGVjdGVkIGFuIEFycmF5IG9yIGFuIE9iamVjdCwgYnV0IGdvdCAnK2QobikrIi4iLHQpfX0ocixpKSxmdW5jdGlvbihlKXt2YXIgdD1lLmRpcmVjdGl2ZXM7aWYodClmb3IodmFyIG4gaW4gdCl7dmFyIHI9dFtuXTsiZnVuY3Rpb24iPT10eXBlb2YgciYmKHRbbl09e2JpbmQ6cix1cGRhdGU6cn0pfX0ociksIXIuX2Jhc2UmJihyLmV4dGVuZHMmJihuPUZlKG4sci5leHRlbmRzLGkpKSxyLm1peGlucykpZm9yKHZhciBlPTAsdD1yLm1peGlucy5sZW5ndGg7ZTx0O2UrKyluPUZlKG4sci5taXhpbnNbZV0saSk7dmFyIG8sYT17fTtmb3IobyBpbiBuKXMobyk7Zm9yKG8gaW4gcil3KG4sbyl8fHMobyk7ZnVuY3Rpb24gcyhlKXt2YXIgdD1QZVtlXXx8QmU7YVtlXT10KG5bZV0scltlXSxpLGUpfXJldHVybiBhfWZ1bmN0aW9uIHplKGUsdCxuLHIpe2lmKCJzdHJpbmciPT10eXBlb2Ygbil7dmFyIGk9ZVt0XTtpZih3KGksbikpcmV0dXJuIGlbbl07dmFyIG89ZyhuKTtpZih3KGksbykpcmV0dXJuIGlbb107dmFyIGE9ayhvKTtpZih3KGksYSkpcmV0dXJuIGlbYV07dmFyIHM9aVtuXXx8aVtvXXx8aVthXTtyZXR1cm4gciYmIXMmJnNlKCJGYWlsZWQgdG8gcmVzb2x2ZSAiK3Quc2xpY2UoMCwtMSkrIjogIituLGUpLHN9fWZ1bmN0aW9uIFZlKGUsdCxuLHIpe3ZhciBpPXRbZV0sbz0hdyhuLGUpLGE9bltlXSxzPUdlKEJvb2xlYW4saS50eXBlKTtpZigtMTxzKWlmKG8mJiF3KGksImRlZmF1bHQiKSlhPSExO2Vsc2UgaWYoIiI9PT1hfHxhPT09eChlKSl7dmFyIGM9R2UoU3RyaW5nLGkudHlwZSk7KGM8MHx8czxjKSYmKGE9ITApfWlmKHZvaWQgMD09PWEpe2E9ZnVuY3Rpb24oZSx0LG4pe2lmKCF3KHQsImRlZmF1bHQiKSlyZXR1cm47dmFyIHI9dC5kZWZhdWx0O3kocikmJnNlKCdJbnZhbGlkIGRlZmF1bHQgdmFsdWUgZm9yIHByb3AgIicrbisnIjogUHJvcHMgd2l0aCB0eXBlIE9iamVjdC9BcnJheSBtdXN0IHVzZSBhIGZhY3RvcnkgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLicsZSk7aWYoZSYmZS4kb3B0aW9ucy5wcm9wc0RhdGEmJnZvaWQgMD09PWUuJG9wdGlvbnMucHJvcHNEYXRhW25dJiZ2b2lkIDAhPT1lLl9wcm9wc1tuXSlyZXR1cm4gZS5fcHJvcHNbbl07cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHImJiJGdW5jdGlvbiIhPT1XZSh0LnR5cGUpP3IuY2FsbChlKTpyfShyLGksZSk7dmFyIHU9Q2U7VGUoITApLEVlKGEpLFRlKHUpfXJldHVybiBmdW5jdGlvbihlLHQsbixyLGkpe2lmKGUucmVxdWlyZWQmJmkpcmV0dXJuIHNlKCdNaXNzaW5nIHJlcXVpcmVkIHByb3A6ICInK3QrJyInLHIpO2lmKG51bGw9PW4mJiFlLnJlcXVpcmVkKXJldHVybjt2YXIgbz1lLnR5cGUsYT0hb3x8ITA9PT1vLHM9W107aWYobyl7QXJyYXkuaXNBcnJheShvKXx8KG89W29dKTtmb3IodmFyIGM9MDtjPG8ubGVuZ3RoJiYhYTtjKyspe3ZhciB1PXFlKG4sb1tjXSk7cy5wdXNoKHUuZXhwZWN0ZWRUeXBlfHwiIiksYT11LnZhbGlkfX1pZighYSlyZXR1cm4gc2UoZnVuY3Rpb24oZSx0LG4pe3ZhciByPSdJbnZhbGlkIHByb3A6IHR5cGUgY2hlY2sgZmFpbGVkIGZvciBwcm9wICInK2UrJyIuIEV4cGVjdGVkICcrbi5tYXAoaykuam9pbigiLCAiKSxpPW5bMF0sbz1kKHQpLGE9WGUodCxpKSxzPVhlKHQsbyk7MT09PW4ubGVuZ3RoJiZZZShpKSYmIWZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoO2Zvcig7bi0tOyl0W25dPWVbbl07cmV0dXJuIHQuc29tZShmdW5jdGlvbihlKXtyZXR1cm4iYm9vbGVhbiI9PT1lLnRvTG93ZXJDYXNlKCl9KX0oaSxvKSYmKHIrPSIgd2l0aCB2YWx1ZSAiK2EpO3IrPSIsIGdvdCAiK28rIiAiLFllKG8pJiYocis9IndpdGggdmFsdWUgIitzKyIuIik7cmV0dXJuIHJ9KHQsbixzKSxyKTt2YXIgbD1lLnZhbGlkYXRvcjtsJiYobChuKXx8c2UoJ0ludmFsaWQgcHJvcDogY3VzdG9tIHZhbGlkYXRvciBjaGVjayBmYWlsZWQgZm9yIHByb3AgIicrdCsnIi4nLHIpKX0oaSxlLGEscixvKSxhfXZhciBVZT0vXihTdHJpbmd8TnVtYmVyfEJvb2xlYW58RnVuY3Rpb258U3ltYm9sKSQvO2Z1bmN0aW9uIHFlKGUsdCl7dmFyIG4scj1XZSh0KTtpZihVZS50ZXN0KHIpKXt2YXIgaT10eXBlb2YgZTsobj1pPT09ci50b0xvd2VyQ2FzZSgpKXx8Im9iamVjdCIhPT1pfHwobj1lIGluc3RhbmNlb2YgdCl9ZWxzZSBuPSJPYmplY3QiPT09cj91KGUpOiJBcnJheSI9PT1yP0FycmF5LmlzQXJyYXkoZSk6ZSBpbnN0YW5jZW9mIHQ7cmV0dXJue3ZhbGlkOm4sZXhwZWN0ZWRUeXBlOnJ9fWZ1bmN0aW9uIFdlKGUpe3ZhciB0PWUmJmUudG9TdHJpbmcoKS5tYXRjaCgvXlxzKmZ1bmN0aW9uIChcdyspLyk7cmV0dXJuIHQ/dFsxXToiIn1mdW5jdGlvbiBIZShlLHQpe3JldHVybiBXZShlKT09PVdlKHQpfWZ1bmN0aW9uIEdlKGUsdCl7aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIEhlKHQsZSk/MDotMTtmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjtuKyspaWYoSGUodFtuXSxlKSlyZXR1cm4gbjtyZXR1cm4tMX1mdW5jdGlvbiBYZShlLHQpe3JldHVybiJTdHJpbmciPT09dD8nIicrZSsnIic6Ik51bWJlciI9PT10PyIiK051bWJlcihlKToiIitlfWZ1bmN0aW9uIFllKHQpe3JldHVyblsic3RyaW5nIiwibnVtYmVyIiwiYm9vbGVhbiJdLnNvbWUoZnVuY3Rpb24oZSl7cmV0dXJuIHQudG9Mb3dlckNhc2UoKT09PWV9KX1mdW5jdGlvbiBKZShlLHQsbil7dmUoKTt0cnl7aWYodClmb3IodmFyIHI9dDtyPXIuJHBhcmVudDspe3ZhciBpPXIuJG9wdGlvbnMuZXJyb3JDYXB0dXJlZDtpZihpKWZvcih2YXIgbz0wO288aS5sZW5ndGg7bysrKXRyeXtpZighMT09PWlbb10uY2FsbChyLGUsdCxuKSlyZXR1cm59Y2F0Y2goZSl7WmUoZSxyLCJlcnJvckNhcHR1cmVkIGhvb2siKX19WmUoZSx0LG4pfWZpbmFsbHl7Z2UoKX19ZnVuY3Rpb24gS2UoZSx0LG4scixpKXt2YXIgbzt0cnl7KG89bj9lLmFwcGx5KHQsbik6ZS5jYWxsKHQpKSYmIW8uX2lzVnVlJiZfKG8pJiYhby5faGFuZGxlZCYmKG8uY2F0Y2goZnVuY3Rpb24oZSl7cmV0dXJuIEplKGUscixpKyIgKFByb21pc2UvYXN5bmMpIil9KSxvLl9oYW5kbGVkPSEwKX1jYXRjaChlKXtKZShlLHIsaSl9cmV0dXJuIG99ZnVuY3Rpb24gWmUodCxlLG4pe2lmKHouZXJyb3JIYW5kbGVyKXRyeXtyZXR1cm4gei5lcnJvckhhbmRsZXIuY2FsbChudWxsLHQsZSxuKX1jYXRjaChlKXtlIT09dCYmUWUoZSxudWxsLCJjb25maWcuZXJyb3JIYW5kbGVyIil9UWUodCxlLG4pfWZ1bmN0aW9uIFFlKGUsdCxuKXtpZihzZSgiRXJyb3IgaW4gIituKyc6ICInK2UudG9TdHJpbmcoKSsnIicsdCksIVgmJiFZfHwidW5kZWZpbmVkIj09dHlwZW9mIGNvbnNvbGUpdGhyb3cgZTtjb25zb2xlLmVycm9yKGUpfXZhciBldD1bXSx0dD0hMTtmdW5jdGlvbiBudCgpe3R0PSExO2Zvcih2YXIgZT1ldC5zbGljZSgwKSx0PWV0Lmxlbmd0aD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0oKX12YXIgcnQsaXQ9ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KG50LDApfTtmdW5jdGlvbiBvdChlLHQpe3ZhciBuO2lmKGV0LnB1c2goZnVuY3Rpb24oKXtpZihlKXRyeXtlLmNhbGwodCl9Y2F0Y2goZSl7SmUoZSx0LCJuZXh0VGljayIpfWVsc2UgbiYmbih0KX0pLHR0fHwodHQ9ITAsaXQoKSksIWUmJiJ1bmRlZmluZWQiIT10eXBlb2YgUHJvbWlzZSlyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSl7bj1lfSl9dmFyIGF0PXMoIkluZmluaXR5LHVuZGVmaW5lZCxOYU4saXNGaW5pdGUsaXNOYU4scGFyc2VGbG9hdCxwYXJzZUludCxkZWNvZGVVUkksZGVjb2RlVVJJQ29tcG9uZW50LGVuY29kZVVSSSxlbmNvZGVVUklDb21wb25lbnQsTWF0aCxOdW1iZXIsRGF0ZSxBcnJheSxPYmplY3QsQm9vbGVhbixTdHJpbmcsUmVnRXhwLE1hcCxTZXQsSlNPTixJbnRsLHJlcXVpcmUiKSxzdD1mdW5jdGlvbihlLHQpe3NlKCdQcm9wZXJ0eSBvciBtZXRob2QgIicrdCsnIiBpcyBub3QgZGVmaW5lZCBvbiB0aGUgaW5zdGFuY2UgYnV0IHJlZmVyZW5jZWQgZHVyaW5nIHJlbmRlci4gTWFrZSBzdXJlIHRoYXQgdGhpcyBwcm9wZXJ0eSBpcyByZWFjdGl2ZSwgZWl0aGVyIGluIHRoZSBkYXRhIG9wdGlvbiwgb3IgZm9yIGNsYXNzLWJhc2VkIGNvbXBvbmVudHMsIGJ5IGluaXRpYWxpemluZyB0aGUgcHJvcGVydHkuIFNlZTogaHR0cHM6Ly92dWVqcy5vcmcvdjIvZ3VpZGUvcmVhY3Rpdml0eS5odG1sI0RlY2xhcmluZy1SZWFjdGl2ZS1Qcm9wZXJ0aWVzLicsZSl9LGN0PWZ1bmN0aW9uKGUsdCl7c2UoJ1Byb3BlcnR5ICInK3QrJyIgbXVzdCBiZSBhY2Nlc3NlZCB3aXRoICIkZGF0YS4nK3QrJyIgYmVjYXVzZSBwcm9wZXJ0aWVzIHN0YXJ0aW5nIHdpdGggIiQiIG9yICJfIiBhcmUgbm90IHByb3hpZWQgaW4gdGhlIFZ1ZSBpbnN0YW5jZSB0byBwcmV2ZW50IGNvbmZsaWN0cyB3aXRoIFZ1ZSBpbnRlcm5hbHMuIFNlZTogaHR0cHM6Ly92dWVqcy5vcmcvdjIvYXBpLyNkYXRhJyxlKX0sdXQ9InVuZGVmaW5lZCIhPXR5cGVvZiBQcm94eSYmaWUoUHJveHkpO2lmKHV0KXt2YXIgbHQ9cygic3RvcCxwcmV2ZW50LHNlbGYsY3RybCxzaGlmdCxhbHQsbWV0YSxleGFjdCIpO3oua2V5Q29kZXM9bmV3IFByb3h5KHoua2V5Q29kZXMse3NldDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGx0KHQpPyhzZSgiQXZvaWQgb3ZlcndyaXRpbmcgYnVpbHQtaW4gbW9kaWZpZXIgaW4gY29uZmlnLmtleUNvZGVzOiAuIit0KSwhMSk6KGVbdF09biwhMCl9fSl9dmFyIGR0PXtoYXM6ZnVuY3Rpb24oZSx0KXt2YXIgbj10IGluIGUscj1hdCh0KXx8InN0cmluZyI9PXR5cGVvZiB0JiYiXyI9PT10LmNoYXJBdCgwKSYmISh0IGluIGUuJGRhdGEpO3JldHVybiBufHxyfHwodCBpbiBlLiRkYXRhP2N0KGUsdCk6c3QoZSx0KSksbnx8IXJ9fSxmdD17Z2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0fHx0IGluIGV8fCh0IGluIGUuJGRhdGE/Y3QoZSx0KTpzdChlLHQpKSxlW3RdfX07cnQ9ZnVuY3Rpb24oZSl7aWYodXQpe3ZhciB0PWUuJG9wdGlvbnMsbj10LnJlbmRlciYmdC5yZW5kZXIuX3dpdGhTdHJpcHBlZD9mdDpkdDtlLl9yZW5kZXJQcm94eT1uZXcgUHJveHkoZSxuKX1lbHNlIGUuX3JlbmRlclByb3h5PWV9O3ZhciBwdCxodCx2dD1uZXcgb2U7ZnVuY3Rpb24gZ3QoZSl7IWZ1bmN0aW9uIGUodCxuKXt2YXIgcixpO3ZhciBvPUFycmF5LmlzQXJyYXkodCk7aWYoIW8mJiF5KHQpfHxPYmplY3QuaXNGcm96ZW4odCl8fHQgaW5zdGFuY2VvZiBtZSlyZXR1cm47aWYodC5fX29iX18pe3ZhciBhPXQuX19vYl9fLmRlcC5pZDtpZihuLmhhcyhhKSlyZXR1cm47bi5hZGQoYSl9aWYobylmb3Iocj10Lmxlbmd0aDtyLS07KWUodFtyXSxuKTtlbHNlIGZvcihpPU9iamVjdC5rZXlzKHQpLHI9aS5sZW5ndGg7ci0tOyllKHRbaVtyXV0sbil9KGUsdnQpLHZ0LmNsZWFyKCl9dmFyIG10PVgmJndpbmRvdy5wZXJmb3JtYW5jZTttdCYmbXQubWFyayYmbXQubWVhc3VyZSYmbXQuY2xlYXJNYXJrcyYmbXQuY2xlYXJNZWFzdXJlcyYmKHB0PWZ1bmN0aW9uKGUpe3JldHVybiBtdC5tYXJrKGUpfSxodD1mdW5jdGlvbihlLHQsbil7bXQubWVhc3VyZShlLHQsbiksbXQuY2xlYXJNYXJrcyh0KSxtdC5jbGVhck1hcmtzKG4pfSk7dmFyIHl0PWgoZnVuY3Rpb24oZSl7dmFyIHQ9IiYiPT09ZS5jaGFyQXQoMCksbj0ifiI9PT0oZT10P2Uuc2xpY2UoMSk6ZSkuY2hhckF0KDApLHI9IiEiPT09KGU9bj9lLnNsaWNlKDEpOmUpLmNoYXJBdCgwKTtyZXR1cm57bmFtZTplPXI/ZS5zbGljZSgxKTplLG9uY2U6bixjYXB0dXJlOnIscGFzc2l2ZTp0fX0pO2Z1bmN0aW9uIF90KGUsaSl7ZnVuY3Rpb24gbygpe3ZhciBlPWFyZ3VtZW50cyx0PW8uZm5zO2lmKCFBcnJheS5pc0FycmF5KHQpKXJldHVybiBLZSh0LG51bGwsYXJndW1lbnRzLGksInYtb24gaGFuZGxlciIpO2Zvcih2YXIgbj10LnNsaWNlKCkscj0wO3I8bi5sZW5ndGg7cisrKUtlKG5bcl0sbnVsbCxlLGksInYtb24gaGFuZGxlciIpfXJldHVybiBvLmZucz1lLG99ZnVuY3Rpb24gYnQoZSx0LG4scixpLG8pe3ZhciBhLHMsYyx1O2ZvcihhIGluIGUpcz1lW2FdLGM9dFthXSx1PXl0KGEpLGoocyk/c2UoJ0ludmFsaWQgaGFuZGxlciBmb3IgZXZlbnQgIicrdS5uYW1lKyciOiBnb3QgJytTdHJpbmcocyksbyk6aihjKT8oaihzLmZucykmJihzPWVbYV09X3QocyxvKSksTih1Lm9uY2UpJiYocz1lW2FdPWkodS5uYW1lLHMsdS5jYXB0dXJlKSksbih1Lm5hbWUscyx1LmNhcHR1cmUsdS5wYXNzaXZlLHUucGFyYW1zKSk6cyE9PWMmJihjLmZucz1zLGVbYV09Yyk7Zm9yKGEgaW4gdClqKGVbYV0pJiZyKCh1PXl0KGEpKS5uYW1lLHRbYV0sdS5jYXB0dXJlKX1mdW5jdGlvbiB3dChlLHQsbil7dmFyIHI7ZSBpbnN0YW5jZW9mIG1lJiYoZT1lLmRhdGEuaG9va3x8KGUuZGF0YS5ob29rPXt9KSk7dmFyIGk9ZVt0XTtmdW5jdGlvbiBvKCl7bi5hcHBseSh0aGlzLGFyZ3VtZW50cyksYihyLmZucyxvKX1qKGkpP3I9X3QoW29dKTpMKGkuZm5zKSYmTihpLm1lcmdlZCk/KHI9aSkuZm5zLnB1c2gobyk6cj1fdChbaSxvXSksci5tZXJnZWQ9ITAsZVt0XT1yfWZ1bmN0aW9uIGt0KGUsdCxuLHIpe3ZhciBpPXQub3B0aW9ucy5tcE9wdGlvbnMmJnQub3B0aW9ucy5tcE9wdGlvbnMucHJvcGVydGllcztpZihqKGkpKXJldHVybiBuO3ZhciBvPXQub3B0aW9ucy5tcE9wdGlvbnMuZXh0ZXJuYWxDbGFzc2VzfHxbXSxhPWUuYXR0cnMscz1lLnByb3BzO2lmKEwoYSl8fEwocykpZm9yKHZhciBjIGluIGkpe3ZhciB1PXgoYyk7KFN0KG4scyxjLHUsITApfHxTdChuLGEsYyx1LCExKSkmJm5bY10mJi0xIT09by5pbmRleE9mKHUpJiZyW2cobltjXSldJiYobltjXT1yW2cobltjXSldKX1yZXR1cm4gbn1mdW5jdGlvbiBTdChlLHQsbixyLGkpe2lmKEwodCkpe2lmKHcodCxuKSlyZXR1cm4gZVtuXT10W25dLGl8fGRlbGV0ZSB0W25dLCEwO2lmKHcodCxyKSlyZXR1cm4gZVtuXT10W3JdLGl8fGRlbGV0ZSB0W3JdLCEwfXJldHVybiExfWZ1bmN0aW9uIHh0KGUpe3JldHVybiBjKGUpP1tiZShlKV06QXJyYXkuaXNBcnJheShlKT9mdW5jdGlvbiBlKHQsbil7dmFyIHI9W107dmFyIGksbyxhLHM7Zm9yKGk9MDtpPHQubGVuZ3RoO2krKylqKG89dFtpXSl8fCJib29sZWFuIj09dHlwZW9mIG98fChhPXIubGVuZ3RoLTEscz1yW2FdLEFycmF5LmlzQXJyYXkobyk/MDxvLmxlbmd0aCYmKEN0KChvPWUobywobnx8IiIpKyJfIitpKSlbMF0pJiZDdChzKSYmKHJbYV09YmUocy50ZXh0K29bMF0udGV4dCksby5zaGlmdCgpKSxyLnB1c2guYXBwbHkocixvKSk6YyhvKT9DdChzKT9yW2FdPWJlKHMudGV4dCtvKToiIiE9PW8mJnIucHVzaChiZShvKSk6Q3QobykmJkN0KHMpP3JbYV09YmUocy50ZXh0K28udGV4dCk6KE4odC5faXNWTGlzdCkmJkwoby50YWcpJiZqKG8ua2V5KSYmTChuKSYmKG8ua2V5PSJfX3ZsaXN0IituKyJfIitpKyJfXyIpLHIucHVzaChvKSkpO3JldHVybiByfShlKTp2b2lkIDB9ZnVuY3Rpb24gQ3QoZSl7cmV0dXJuIEwoZSkmJkwoZS50ZXh0KSYmITE9PT1lLmlzQ29tbWVudH1mdW5jdGlvbiBUdChlLHQpe2lmKGUpe2Zvcih2YXIgbj1PYmplY3QuY3JlYXRlKG51bGwpLHI9YWU/UmVmbGVjdC5vd25LZXlzKGUpOk9iamVjdC5rZXlzKGUpLGk9MDtpPHIubGVuZ3RoO2krKyl7dmFyIG89cltpXTtpZigiX19vYl9fIiE9PW8pe2Zvcih2YXIgYT1lW29dLmZyb20scz10O3M7KXtpZihzLl9wcm92aWRlZCYmdyhzLl9wcm92aWRlZCxhKSl7bltvXT1zLl9wcm92aWRlZFthXTticmVha31zPXMuJHBhcmVudH1pZighcylpZigiZGVmYXVsdCJpbiBlW29dKXt2YXIgYz1lW29dLmRlZmF1bHQ7bltvXT0iZnVuY3Rpb24iPT10eXBlb2YgYz9jLmNhbGwodCk6Y31lbHNlIHNlKCdJbmplY3Rpb24gIicrbysnIiBub3QgZm91bmQnLHQpfX1yZXR1cm4gbn19ZnVuY3Rpb24gT3QoZSx0KXtpZighZXx8IWUubGVuZ3RoKXJldHVybnt9O2Zvcih2YXIgbj17fSxyPTAsaT1lLmxlbmd0aDtyPGk7cisrKXt2YXIgbz1lW3JdLGE9by5kYXRhO2lmKGEmJmEuYXR0cnMmJmEuYXR0cnMuc2xvdCYmZGVsZXRlIGEuYXR0cnMuc2xvdCxvLmNvbnRleHQhPT10JiZvLmZuQ29udGV4dCE9PXR8fCFhfHxudWxsPT1hLnNsb3QpKG4uZGVmYXVsdHx8KG4uZGVmYXVsdD1bXSkpLnB1c2gobyk7ZWxzZXt2YXIgcz1hLnNsb3QsYz1uW3NdfHwobltzXT1bXSk7InRlbXBsYXRlIj09PW8udGFnP2MucHVzaC5hcHBseShjLG8uY2hpbGRyZW58fFtdKTpjLnB1c2gobyl9fWZvcih2YXIgdSBpbiBuKW5bdV0uZXZlcnkoRXQpJiZkZWxldGUgblt1XTtyZXR1cm4gbn1mdW5jdGlvbiBFdChlKXtyZXR1cm4gZS5pc0NvbW1lbnQmJiFlLmFzeW5jRmFjdG9yeXx8IiAiPT09ZS50ZXh0fWZ1bmN0aW9uIEF0KGUsdCxuKXt2YXIgcixpPTA8T2JqZWN0LmtleXModCkubGVuZ3RoLG89ZT8hIWUuJHN0YWJsZTohaSxhPWUmJmUuJGtleTtpZihlKXtpZihlLl9ub3JtYWxpemVkKXJldHVybiBlLl9ub3JtYWxpemVkO2lmKG8mJm4mJm4hPT1tJiZhPT09bi4ka2V5JiYhaSYmIW4uJGhhc05vcm1hbClyZXR1cm4gbjtmb3IodmFyIHMgaW4gcj17fSxlKWVbc10mJiIkIiE9PXNbMF0mJihyW3NdPUl0KHQscyxlW3NdKSl9ZWxzZSByPXt9O2Zvcih2YXIgYyBpbiB0KWMgaW4gcnx8KHJbY109JHQodCxjKSk7cmV0dXJuIGUmJk9iamVjdC5pc0V4dGVuc2libGUoZSkmJihlLl9ub3JtYWxpemVkPXIpLHEociwiJHN0YWJsZSIsbykscShyLCIka2V5IixhKSxxKHIsIiRoYXNOb3JtYWwiLGkpLHJ9ZnVuY3Rpb24gSXQoZSx0LG4pe3ZhciByPWZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD9uLmFwcGx5KG51bGwsYXJndW1lbnRzKTpuKHt9KTtyZXR1cm4oZT1lJiYib2JqZWN0Ij09dHlwZW9mIGUmJiFBcnJheS5pc0FycmF5KGUpP1tlXTp4dChlKSkmJigwPT09ZS5sZW5ndGh8fDE9PT1lLmxlbmd0aCYmZVswXS5pc0NvbW1lbnQpP3ZvaWQgMDplfTtyZXR1cm4gbi5wcm94eSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7Z2V0OnIsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxyfWZ1bmN0aW9uICR0KGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGVbdF19fWZ1bmN0aW9uIFB0KGUsdCl7dmFyIG4scixpLG8sYTtpZihBcnJheS5pc0FycmF5KGUpfHwic3RyaW5nIj09dHlwZW9mIGUpZm9yKG49bmV3IEFycmF5KGUubGVuZ3RoKSxyPTAsaT1lLmxlbmd0aDtyPGk7cisrKW5bcl09dChlW3JdLHIscixyKTtlbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgZSlmb3Iobj1uZXcgQXJyYXkoZSkscj0wO3I8ZTtyKyspbltyXT10KHIrMSxyLHIscik7ZWxzZSBpZih5KGUpKWlmKGFlJiZlW1N5bWJvbC5pdGVyYXRvcl0pe249W107dmFyIHM9ZVtTeW1ib2wuaXRlcmF0b3JdKCksYz1zLm5leHQoKTtmb3Iocj0wOyFjLmRvbmU7KW4ucHVzaCh0KGMudmFsdWUsbi5sZW5ndGgscixyKyspKSxjPXMubmV4dCgpfWVsc2UgZm9yKG89T2JqZWN0LmtleXMoZSksbj1uZXcgQXJyYXkoby5sZW5ndGgpLHI9MCxpPW8ubGVuZ3RoO3I8aTtyKyspYT1vW3JdLG5bcl09dChlW2FdLGEscixyKTtyZXR1cm4gTChuKXx8KG49W10pLG4uX2lzVkxpc3Q9ITAsbn1mdW5jdGlvbiBNdChlLHQsbixyKXt2YXIgaSxvPXRoaXMuJHNjb3BlZFNsb3RzW2VdO28/KG49bnx8e30sciYmKHkocil8fHNlKCJzbG90IHYtYmluZCB3aXRob3V0IGFyZ3VtZW50IGV4cGVjdHMgYW4gT2JqZWN0Iix0aGlzKSxuPU8oTyh7fSxyKSxuKSksaT1vKG4sdGhpcyxuLl9pKXx8dCk6aT10aGlzLiRzbG90c1tlXXx8dDt2YXIgYT1uJiZuLnNsb3Q7cmV0dXJuIGE/dGhpcy4kY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiLHtzbG90OmF9LGkpOml9ZnVuY3Rpb24ganQoZSl7cmV0dXJuIHplKHRoaXMuJG9wdGlvbnMsImZpbHRlcnMiLGUsITApfHwkfWZ1bmN0aW9uIEx0KGUsdCl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/LTE9PT1lLmluZGV4T2YodCk6ZSE9PXR9ZnVuY3Rpb24gTnQoZSx0LG4scixpKXt2YXIgbz16LmtleUNvZGVzW3RdfHxuO3JldHVybiBpJiZyJiYhei5rZXlDb2Rlc1t0XT9MdChpLHIpOm8/THQobyxlKTpyP3gocikhPT10OnZvaWQgMH1mdW5jdGlvbiBCdChpLG8sYSxzLGMpe2lmKGEpaWYoeShhKSl7dmFyIHU7QXJyYXkuaXNBcnJheShhKSYmKGE9RShhKSk7dmFyIGU9ZnVuY3Rpb24odCl7aWYoImNsYXNzIj09PXR8fCJzdHlsZSI9PT10fHxmKHQpKXU9aTtlbHNle3ZhciBlPWkuYXR0cnMmJmkuYXR0cnMudHlwZTt1PXN8fHoubXVzdFVzZVByb3AobyxlLHQpP2kuZG9tUHJvcHN8fChpLmRvbVByb3BzPXt9KTppLmF0dHJzfHwoaS5hdHRycz17fSl9dmFyIG49Zyh0KSxyPXgodCk7biBpbiB1fHxyIGluIHV8fCh1W3RdPWFbdF0sYyYmKChpLm9ufHwoaS5vbj17fSkpWyJ1cGRhdGU6Iit0XT1mdW5jdGlvbihlKXthW3RdPWV9KSl9O2Zvcih2YXIgdCBpbiBhKWUodCl9ZWxzZSBzZSgidi1iaW5kIHdpdGhvdXQgYXJndW1lbnQgZXhwZWN0cyBhbiBPYmplY3Qgb3IgQXJyYXkgdmFsdWUiLHRoaXMpO3JldHVybiBpfWZ1bmN0aW9uIER0KGUsdCl7dmFyIG49dGhpcy5fc3RhdGljVHJlZXN8fCh0aGlzLl9zdGF0aWNUcmVlcz1bXSkscj1uW2VdO3JldHVybiByJiYhdHx8RnQocj1uW2VdPXRoaXMuJG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zW2VdLmNhbGwodGhpcy5fcmVuZGVyUHJveHksbnVsbCx0aGlzKSwiX19zdGF0aWNfXyIrZSwhMSkscn1mdW5jdGlvbiBSdChlLHQsbil7cmV0dXJuIEZ0KGUsIl9fb25jZV9fIit0KyhuPyJfIituOiIiKSwhMCksZX1mdW5jdGlvbiBGdChlLHQsbil7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyllW3JdJiYic3RyaW5nIiE9dHlwZW9mIGVbcl0mJnp0KGVbcl0sdCsiXyIrcixuKTtlbHNlIHp0KGUsdCxuKX1mdW5jdGlvbiB6dChlLHQsbil7ZS5pc1N0YXRpYz0hMCxlLmtleT10LGUuaXNPbmNlPW59ZnVuY3Rpb24gVnQoZSx0KXtpZih0KWlmKHUodCkpe3ZhciBuPWUub249ZS5vbj9PKHt9LGUub24pOnt9O2Zvcih2YXIgciBpbiB0KXt2YXIgaT1uW3JdLG89dFtyXTtuW3JdPWk/W10uY29uY2F0KGksbyk6b319ZWxzZSBzZSgidi1vbiB3aXRob3V0IGFyZ3VtZW50IGV4cGVjdHMgYW4gT2JqZWN0IHZhbHVlIix0aGlzKTtyZXR1cm4gZX1mdW5jdGlvbiBVdChlLHQsbixyKXt0PXR8fHskc3RhYmxlOiFufTtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXTtBcnJheS5pc0FycmF5KG8pP1V0KG8sdCxuKTpvJiYoby5wcm94eSYmKG8uZm4ucHJveHk9ITApLHRbby5rZXldPW8uZm4pfXJldHVybiByJiYodC4ka2V5PXIpLHR9ZnVuY3Rpb24gcXQoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rPTIpe3ZhciByPXRbbl07InN0cmluZyI9PXR5cGVvZiByJiZyP2VbdFtuXV09dFtuKzFdOiIiIT09ciYmbnVsbCE9PXImJnNlKCJJbnZhbGlkIHZhbHVlIGZvciBkeW5hbWljIGRpcmVjdGl2ZSBhcmd1bWVudCAoZXhwZWN0ZWQgc3RyaW5nIG9yIG51bGwpOiAiK3IsdGhpcyl9cmV0dXJuIGV9ZnVuY3Rpb24gV3QoZSx0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/dCtlOmV9ZnVuY3Rpb24gSHQoZSl7ZS5fbz1SdCxlLl9uPWEsZS5fcz1yLGUuX2w9UHQsZS5fdD1NdCxlLl9xPVAsZS5faT1NLGUuX209RHQsZS5fZj1qdCxlLl9rPU50LGUuX2I9QnQsZS5fdj1iZSxlLl9lPV9lLGUuX3U9VXQsZS5fZz1WdCxlLl9kPXF0LGUuX3A9V3R9ZnVuY3Rpb24gR3QoZSx0LG4sbyxyKXt2YXIgYSxpPXRoaXMscz1yLm9wdGlvbnM7dyhvLCJfdWlkIik/KGE9T2JqZWN0LmNyZWF0ZShvKSkuX29yaWdpbmFsPW86bz0oYT1vKS5fb3JpZ2luYWw7dmFyIGM9TihzLl9jb21waWxlZCksdT0hYzt0aGlzLmRhdGE9ZSx0aGlzLnByb3BzPXQsdGhpcy5jaGlsZHJlbj1uLHRoaXMucGFyZW50PW8sdGhpcy5saXN0ZW5lcnM9ZS5vbnx8bSx0aGlzLmluamVjdGlvbnM9VHQocy5pbmplY3QsbyksdGhpcy5zbG90cz1mdW5jdGlvbigpe3JldHVybiBpLiRzbG90c3x8QXQoZS5zY29wZWRTbG90cyxpLiRzbG90cz1PdChuLG8pKSxpLiRzbG90c30sT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInNjb3BlZFNsb3RzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQXQoZS5zY29wZWRTbG90cyx0aGlzLnNsb3RzKCkpfX0pLGMmJih0aGlzLiRvcHRpb25zPXMsdGhpcy4kc2xvdHM9dGhpcy5zbG90cygpLHRoaXMuJHNjb3BlZFNsb3RzPUF0KGUuc2NvcGVkU2xvdHMsdGhpcy4kc2xvdHMpKSxzLl9zY29wZUlkP3RoaXMuX2M9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9bm4oYSxlLHQsbixyLHUpO3JldHVybiBpJiYhQXJyYXkuaXNBcnJheShpKSYmKGkuZm5TY29wZUlkPXMuX3Njb3BlSWQsaS5mbkNvbnRleHQ9byksaX06dGhpcy5fYz1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbm4oYSxlLHQsbixyLHUpfX1mdW5jdGlvbiBYdChlLHQsbixyLGkpe3ZhciBvPXdlKGUpO3JldHVybiBvLmZuQ29udGV4dD1uLG8uZm5PcHRpb25zPXIsKG8uZGV2dG9vbHNNZXRhPW8uZGV2dG9vbHNNZXRhfHx7fSkucmVuZGVyQ29udGV4dD1pLHQuc2xvdCYmKChvLmRhdGF8fChvLmRhdGE9e30pKS5zbG90PXQuc2xvdCksb31mdW5jdGlvbiBZdChlLHQpe2Zvcih2YXIgbiBpbiB0KWVbZyhuKV09dFtuXX1IdChHdC5wcm90b3R5cGUpO3ZhciBKdD17aW5pdDpmdW5jdGlvbihlLHQpe2lmKGUuY29tcG9uZW50SW5zdGFuY2UmJiFlLmNvbXBvbmVudEluc3RhbmNlLl9pc0Rlc3Ryb3llZCYmZS5kYXRhLmtlZXBBbGl2ZSl7dmFyIG49ZTtKdC5wcmVwYXRjaChuLG4pfWVsc2V7KGUuY29tcG9uZW50SW5zdGFuY2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj17X2lzQ29tcG9uZW50OiEwLF9wYXJlbnRWbm9kZTplLHBhcmVudDp0fSxyPWUuZGF0YS5pbmxpbmVUZW1wbGF0ZTtMKHIpJiYobi5yZW5kZXI9ci5yZW5kZXIsbi5zdGF0aWNSZW5kZXJGbnM9ci5zdGF0aWNSZW5kZXJGbnMpO3JldHVybiBuZXcgZS5jb21wb25lbnRPcHRpb25zLkN0b3Iobil9KGUsZG4pKS4kbW91bnQodD9lLmVsbTp2b2lkIDAsdCl9fSxwcmVwYXRjaDpmdW5jdGlvbihlLHQpe3ZhciBuPXQuY29tcG9uZW50T3B0aW9uczshZnVuY3Rpb24oZSx0LG4scixpKXtmbj0hMDt2YXIgbz1yLmRhdGEuc2NvcGVkU2xvdHMsYT1lLiRzY29wZWRTbG90cyxzPSEhKG8mJiFvLiRzdGFibGV8fGEhPT1tJiYhYS4kc3RhYmxlfHxvJiZlLiRzY29wZWRTbG90cy4ka2V5IT09by4ka2V5KSxjPSEhKGl8fGUuJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVufHxzKTtlLiRvcHRpb25zLl9wYXJlbnRWbm9kZT1yLGUuJHZub2RlPXIsZS5fdm5vZGUmJihlLl92bm9kZS5wYXJlbnQ9cik7aWYoZS4kb3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW49aSxlLiRhdHRycz1yLmRhdGEuYXR0cnN8fG0sZS4kbGlzdGVuZXJzPW58fG0sdCYmZS4kb3B0aW9ucy5wcm9wcyl7VGUoITEpO2Zvcih2YXIgdT1lLl9wcm9wcyxsPWUuJG9wdGlvbnMuX3Byb3BLZXlzfHxbXSxkPTA7ZDxsLmxlbmd0aDtkKyspe3ZhciBmPWxbZF0scD1lLiRvcHRpb25zLnByb3BzO3VbZl09VmUoZixwLHQsZSl9VGUoITApLGUuJG9wdGlvbnMucHJvcHNEYXRhPXR9ZS5fJHVwZGF0ZVByb3BlcnRpZXMmJmUuXyR1cGRhdGVQcm9wZXJ0aWVzKGUpLG49bnx8bTt2YXIgaD1lLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7ZS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzPW4sbG4oZSxuLGgpLGMmJihlLiRzbG90cz1PdChpLHIuY29udGV4dCksZS4kZm9yY2VVcGRhdGUoKSk7Zm49ITF9KHQuY29tcG9uZW50SW5zdGFuY2U9ZS5jb21wb25lbnRJbnN0YW5jZSxuLnByb3BzRGF0YSxuLmxpc3RlbmVycyx0LG4uY2hpbGRyZW4pfSxpbnNlcnQ6ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLmNvbnRleHQscj1lLmNvbXBvbmVudEluc3RhbmNlO3IuX2lzTW91bnRlZHx8KHIuX2lzTW91bnRlZD0hMCxyLl8kdmQ/KHZuKHIsIm9uU2VydmljZUNyZWF0ZWQiKSx2bihyLCJvblNlcnZpY2VBdHRhY2hlZCIpLHIuXyR2ZC5hZGRNb3VudGVkVm0ocikpOnZuKHIsIm1vdW50ZWQiKSksZS5kYXRhLmtlZXBBbGl2ZSYmKG4uX2lzTW91bnRlZD8oKHQ9cikuX2luYWN0aXZlPSExLHluLnB1c2godCkpOmhuKHIsITApKX0sZGVzdHJveTpmdW5jdGlvbihlKXt2YXIgdD1lLmNvbXBvbmVudEluc3RhbmNlO3QuX2lzRGVzdHJveWVkfHwoZS5kYXRhLmtlZXBBbGl2ZT9mdW5jdGlvbiBlKHQsbil7aWYobiYmKHQuX2RpcmVjdEluYWN0aXZlPSEwLHBuKHQpKSlyZXR1cm47aWYoIXQuX2luYWN0aXZlKXt0Ll9pbmFjdGl2ZT0hMDtmb3IodmFyIHI9MDtyPHQuJGNoaWxkcmVuLmxlbmd0aDtyKyspZSh0LiRjaGlsZHJlbltyXSk7dm4odCwiZGVhY3RpdmF0ZWQiKX19KHQsITApOnQuJGRlc3Ryb3koKSl9fSxLdD1PYmplY3Qua2V5cyhKdCk7ZnVuY3Rpb24gWnQoZSx0LG4scixpKXtpZighaihlKSl7dmFyIG89bi4kb3B0aW9ucy5fYmFzZTtpZih5KGUpJiYoZT1vLmV4dGVuZChlKSksImZ1bmN0aW9uIj09dHlwZW9mIGUpe3ZhciBhLHMsYyx1LGwsZCxmO2lmKGooZS5jaWQpJiZ2b2lkIDA9PT0oZT1mdW5jdGlvbih0LG4pe2lmKE4odC5lcnJvcikmJkwodC5lcnJvckNvbXApKXJldHVybiB0LmVycm9yQ29tcDtpZihMKHQucmVzb2x2ZWQpKXJldHVybiB0LnJlc29sdmVkO3ZhciBlPW9uO2UmJkwodC5vd25lcnMpJiYtMT09PXQub3duZXJzLmluZGV4T2YoZSkmJnQub3duZXJzLnB1c2goZSk7aWYoTih0LmxvYWRpbmcpJiZMKHQubG9hZGluZ0NvbXApKXJldHVybiB0LmxvYWRpbmdDb21wO2lmKGUmJiFMKHQub3duZXJzKSl7dmFyIHI9dC5vd25lcnM9W2VdLGk9ITAsbz1udWxsLGE9bnVsbDtlLiRvbigiaG9vazpkZXN0cm95ZWQiLGZ1bmN0aW9uKCl7cmV0dXJuIGIocixlKX0pO3ZhciBzPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49ci5sZW5ndGg7dDxuO3QrKylyW3RdLiRmb3JjZVVwZGF0ZSgpO2UmJihyLmxlbmd0aD0wLG51bGwhPT1vJiYoY2xlYXJUaW1lb3V0KG8pLG89bnVsbCksbnVsbCE9PWEmJihjbGVhclRpbWVvdXQoYSksYT1udWxsKSl9LGM9QihmdW5jdGlvbihlKXt0LnJlc29sdmVkPWFuKGUsbiksaT9yLmxlbmd0aD0wOnMoITApfSksdT1CKGZ1bmN0aW9uKGUpe3NlKCJGYWlsZWQgdG8gcmVzb2x2ZSBhc3luYyBjb21wb25lbnQ6ICIrU3RyaW5nKHQpKyhlPyJcblJlYXNvbjogIitlOiIiKSksTCh0LmVycm9yQ29tcCkmJih0LmVycm9yPSEwLHMoITApKX0pLGw9dChjLHUpO3JldHVybiB5KGwpJiYoXyhsKT9qKHQucmVzb2x2ZWQpJiZsLnRoZW4oYyx1KTpfKGwuY29tcG9uZW50KSYmKGwuY29tcG9uZW50LnRoZW4oYyx1KSxMKGwuZXJyb3IpJiYodC5lcnJvckNvbXA9YW4obC5lcnJvcixuKSksTChsLmxvYWRpbmcpJiYodC5sb2FkaW5nQ29tcD1hbihsLmxvYWRpbmcsbiksMD09PWwuZGVsYXk/dC5sb2FkaW5nPSEwOm89c2V0VGltZW91dChmdW5jdGlvbigpe289bnVsbCxqKHQucmVzb2x2ZWQpJiZqKHQuZXJyb3IpJiYodC5sb2FkaW5nPSEwLHMoITEpKX0sbC5kZWxheXx8MjAwKSksTChsLnRpbWVvdXQpJiYoYT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YT1udWxsLGoodC5yZXNvbHZlZCkmJnUoInRpbWVvdXQgKCIrbC50aW1lb3V0KyJtcykiKX0sbC50aW1lb3V0KSkpKSxpPSExLHQubG9hZGluZz90LmxvYWRpbmdDb21wOnQucmVzb2x2ZWR9fShhPWUsbykpKXJldHVybiBzPWEsYz10LHU9bixsPXIsZD1pLChmPV9lKCkpLmFzeW5jRmFjdG9yeT1zLGYuYXN5bmNNZXRhPXtkYXRhOmMsY29udGV4dDp1LGNoaWxkcmVuOmwsdGFnOmR9LGY7dD10fHx7fSxXbihlKSxMKHQubW9kZWwpJiZmdW5jdGlvbihlLHQpe3ZhciBuPWUubW9kZWwmJmUubW9kZWwucHJvcHx8InZhbHVlIixyPWUubW9kZWwmJmUubW9kZWwuZXZlbnR8fCJpbnB1dCI7KHQuYXR0cnN8fCh0LmF0dHJzPXt9KSlbbl09dC5tb2RlbC52YWx1ZTt2YXIgaT10Lm9ufHwodC5vbj17fSksbz1pW3JdLGE9dC5tb2RlbC5jYWxsYmFjaztMKG8pPyhBcnJheS5pc0FycmF5KG8pPy0xPT09by5pbmRleE9mKGEpOm8hPT1hKSYmKGlbcl09W2FdLmNvbmNhdChvKSk6aVtyXT1hfShlLm9wdGlvbnMsdCk7dmFyIHA9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dC5vcHRpb25zLnByb3BzO2lmKGooaSkpcmV0dXJuIGt0KGUsdCx7fSxyKTt2YXIgbz17fSxhPWUuYXR0cnMscz1lLnByb3BzO2lmKEwoYSl8fEwocykpZm9yKHZhciBjIGluIGkpe3ZhciB1PXgoYyksbD1jLnRvTG93ZXJDYXNlKCk7YyE9PWwmJmEmJncoYSxsKSYmY2UoJ1Byb3AgIicrbCsnIiBpcyBwYXNzZWQgdG8gY29tcG9uZW50ICcrbGUobnx8dCkrJywgYnV0IHRoZSBkZWNsYXJlZCBwcm9wIG5hbWUgaXMgIicrYysnIi4gTm90ZSB0aGF0IEhUTUwgYXR0cmlidXRlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgY2FtZWxDYXNlZCBwcm9wcyBuZWVkIHRvIHVzZSB0aGVpciBrZWJhYi1jYXNlIGVxdWl2YWxlbnRzIHdoZW4gdXNpbmcgaW4tRE9NIHRlbXBsYXRlcy4gWW91IHNob3VsZCBwcm9iYWJseSB1c2UgIicrdSsnIiBpbnN0ZWFkIG9mICInK2MrJyIuJyksU3QobyxzLGMsdSwhMCl8fFN0KG8sYSxjLHUsITEpfXJldHVybiBrdChlLHQsbyxyKX0odCxlLGksbik7aWYoTihlLm9wdGlvbnMuZnVuY3Rpb25hbCkpcmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG89ZS5vcHRpb25zLGE9e30scz1vLnByb3BzO2lmKEwocykpZm9yKHZhciBjIGluIHMpYVtjXT1WZShjLHMsdHx8bSk7ZWxzZSBMKG4uYXR0cnMpJiZZdChhLG4uYXR0cnMpLEwobi5wcm9wcykmJll0KGEsbi5wcm9wcyk7dmFyIHU9bmV3IEd0KG4sYSxpLHIsZSksbD1vLnJlbmRlci5jYWxsKG51bGwsdS5fYyx1KTtpZihsIGluc3RhbmNlb2YgbWUpcmV0dXJuIFh0KGwsbix1LnBhcmVudCxvLHUpO2lmKEFycmF5LmlzQXJyYXkobCkpe2Zvcih2YXIgZD14dChsKXx8W10sZj1uZXcgQXJyYXkoZC5sZW5ndGgpLHA9MDtwPGQubGVuZ3RoO3ArKylmW3BdPVh0KGRbcF0sbix1LnBhcmVudCxvLHUpO3JldHVybiBmfX0oZSxwLHQsbixyKTt2YXIgaD10Lm9uO2lmKHQub249dC5uYXRpdmVPbixOKGUub3B0aW9ucy5hYnN0cmFjdCkpe3ZhciB2PXQuc2xvdDt0PXt9LHYmJih0LnNsb3Q9dil9IWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmhvb2t8fChlLmhvb2s9e30pLG49MDtuPEt0Lmxlbmd0aDtuKyspe3ZhciByPUt0W25dLGk9dFtyXSxvPUp0W3JdO2k9PT1vfHxpJiZpLl9tZXJnZWR8fCh0W3JdPWk/UXQobyxpKTpvKX19KHQpO3ZhciBnPWUub3B0aW9ucy5uYW1lfHxpO3JldHVybiBuZXcgbWUoInZ1ZS1jb21wb25lbnQtIitlLmNpZCsoZz8iLSIrZzoiIiksdCx2b2lkIDAsdm9pZCAwLHZvaWQgMCxuLHtDdG9yOmUscHJvcHNEYXRhOnAsbGlzdGVuZXJzOmgsdGFnOmksY2hpbGRyZW46cn0sYSl9c2UoIkludmFsaWQgQ29tcG9uZW50IGRlZmluaXRpb246ICIrU3RyaW5nKGUpLG4pfX1mdW5jdGlvbiBRdChuLHIpe3ZhciBlPWZ1bmN0aW9uKGUsdCl7bihlLHQpLHIoZSx0KX07cmV0dXJuIGUuX21lcmdlZD0hMCxlfXZhciBlbj0xLHRuPTI7ZnVuY3Rpb24gbm4oZSx0LG4scixpLG8pe3JldHVybihBcnJheS5pc0FycmF5KG4pfHxjKG4pKSYmKGk9cixyPW4sbj12b2lkIDApLE4obykmJihpPXRuKSxmdW5jdGlvbihlLHQsbixyLGkpe2lmKEwobikmJkwobi5fX29iX18pKXJldHVybiBzZSgiQXZvaWQgdXNpbmcgb2JzZXJ2ZWQgZGF0YSBvYmplY3QgYXMgdm5vZGUgZGF0YTogIitKU09OLnN0cmluZ2lmeShuKSsiXG5BbHdheXMgY3JlYXRlIGZyZXNoIHZub2RlIGRhdGEgb2JqZWN0cyBpbiBlYWNoIHJlbmRlciEiLGUpLF9lKCk7TChuKSYmTChuLmlzKSYmKHQ9bi5pcyk7aWYoIXQpcmV0dXJuIF9lKCk7TChuKSYmTChuLmtleSkmJiFjKG4ua2V5KSYmc2UoIkF2b2lkIHVzaW5nIG5vbi1wcmltaXRpdmUgdmFsdWUgYXMga2V5LCB1c2Ugc3RyaW5nL251bWJlciB2YWx1ZSBpbnN0ZWFkLiIsZSk7QXJyYXkuaXNBcnJheShyKSYmImZ1bmN0aW9uIj09dHlwZW9mIHJbMF0mJigobj1ufHx7fSkuc2NvcGVkU2xvdHM9e2RlZmF1bHQ6clswXX0sci5sZW5ndGg9MCk7aT09PXRuP3I9eHQocik6aT09PWVuJiYocj1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKylpZihBcnJheS5pc0FycmF5KGVbdF0pKXJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGUpO3JldHVybiBlfShyKSk7dmFyIG8sYTtpZigic3RyaW5nIj09dHlwZW9mIHQpe3ZhciBzO2E9ZS4kdm5vZGUmJmUuJHZub2RlLm5zfHx6LmdldFRhZ05hbWVzcGFjZSh0KSx6LmlzUmVzZXJ2ZWRUYWcodCk/KEwobikmJkwobi5uYXRpdmVPbikmJnNlKCJUaGUgLm5hdGl2ZSBtb2RpZmllciBmb3Igdi1vbiBpcyBvbmx5IHZhbGlkIG9uIGNvbXBvbmVudHMgYnV0IGl0IHdhcyB1c2VkIG9uIDwiK3QrIj4uIixlKSxvPW5ldyBtZSh6LnBhcnNlUGxhdGZvcm1UYWdOYW1lKHQpLG4scix2b2lkIDAsdm9pZCAwLGUpKTpvPW4mJm4ucHJlfHwhTChzPXplKGUuJG9wdGlvbnMsImNvbXBvbmVudHMiLHQpKT9uZXcgbWUodCxuLHIsdm9pZCAwLHZvaWQgMCxlKTpadChzLG4sZSxyLHQpfWVsc2Ugbz1adCh0LG4sZSxyKTtyZXR1cm4gQXJyYXkuaXNBcnJheShvKT9vOkwobyk/KEwoYSkmJmZ1bmN0aW9uIGUodCxuLHIpe3QubnM9bjsiZm9yZWlnbk9iamVjdCI9PT10LnRhZyYmKHI9IShuPXZvaWQgMCkpO2lmKEwodC5jaGlsZHJlbikpZm9yKHZhciBpPTAsbz10LmNoaWxkcmVuLmxlbmd0aDtpPG87aSsrKXt2YXIgYT10LmNoaWxkcmVuW2ldO0woYS50YWcpJiYoaihhLm5zKXx8TihyKSYmInN2ZyIhPT1hLnRhZykmJmUoYSxuLHIpfX0obyxhKSxMKG4pJiZmdW5jdGlvbihlKXt5KGUuc3R5bGUpJiZndChlLnN0eWxlKTt5KGUuY2xhc3MpJiZndChlLmNsYXNzKX0obiksbyk6X2UoKX0oZSx0LG4scixpKX12YXIgcm4sb249bnVsbDtmdW5jdGlvbiBhbihlLHQpe3JldHVybihlLl9fZXNNb2R1bGV8fGFlJiYiTW9kdWxlIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXSkmJihlPWUuZGVmYXVsdCkseShlKT90LmV4dGVuZChlKTplfWZ1bmN0aW9uIHNuKGUsdCl7cm4uJG9uKGUsdCl9ZnVuY3Rpb24gY24oZSx0KXtybi4kb2ZmKGUsdCl9ZnVuY3Rpb24gdW4odCxuKXt2YXIgcj1ybjtyZXR1cm4gZnVuY3Rpb24gZSgpe251bGwhPT1uLmFwcGx5KG51bGwsYXJndW1lbnRzKSYmci4kb2ZmKHQsZSl9fWZ1bmN0aW9uIGxuKGUsdCxuKXtidCh0LG58fHt9LHNuLGNuLHVuLHJuPWUpLHJuPXZvaWQgMH12YXIgZG49bnVsbCxmbj0hMTtmdW5jdGlvbiBwbihlKXtmb3IoO2UmJihlPWUuJHBhcmVudCk7KWlmKGUuX2luYWN0aXZlKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIGhuKGUsdCl7aWYodCl7aWYoZS5fZGlyZWN0SW5hY3RpdmU9ITEscG4oZSkpcmV0dXJufWVsc2UgaWYoZS5fZGlyZWN0SW5hY3RpdmUpcmV0dXJuO2lmKGUuX2luYWN0aXZlfHxudWxsPT09ZS5faW5hY3RpdmUpe2UuX2luYWN0aXZlPSExO2Zvcih2YXIgbj0wO248ZS4kY2hpbGRyZW4ubGVuZ3RoO24rKylobihlLiRjaGlsZHJlbltuXSk7dm4oZSwiYWN0aXZhdGVkIil9fWZ1bmN0aW9uIHZuKGUsdCl7dmUoKTt2YXIgbj1lLiRvcHRpb25zW3RdLHI9dCsiIGhvb2siO2lmKG4pZm9yKHZhciBpPTAsbz1uLmxlbmd0aDtpPG87aSsrKUtlKG5baV0sZSxudWxsLGUscik7ZS5faGFzSG9va0V2ZW50JiZlLiRlbWl0KCJob29rOiIrdCksZ2UoKX12YXIgZ249MTAwLG1uPVtdLHluPVtdLF9uPXt9LGJuPXt9LHduPSExLGtuPSExLFNuPTA7dmFyIHhuPURhdGUubm93O2lmKFgmJiFaKXt2YXIgQ249d2luZG93LnBlcmZvcm1hbmNlO0NuJiYiZnVuY3Rpb24iPT10eXBlb2YgQ24ubm93JiZ4bigpPmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLnRpbWVTdGFtcCYmKHhuPWZ1bmN0aW9uKCl7cmV0dXJuIENuLm5vdygpfSl9ZnVuY3Rpb24gVG4oKXt2YXIgZSx0O2Zvcih4bigpLGtuPSEwLG1uLnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5pZC10LmlkfSksU249MDtTbjxtbi5sZW5ndGg7U24rKylpZigoZT1tbltTbl0pLmJlZm9yZSYmZS5iZWZvcmUoKSx0PWUuaWQsX25bdF09bnVsbCxlLnJ1bigpLG51bGwhPV9uW3RdJiYoYm5bdF09KGJuW3RdfHwwKSsxLGJuW3RdPmduKSl7c2UoIllvdSBtYXkgaGF2ZSBhbiBpbmZpbml0ZSB1cGRhdGUgbG9vcCAiKyhlLnVzZXI/J2luIHdhdGNoZXIgd2l0aCBleHByZXNzaW9uICInK2UuZXhwcmVzc2lvbisnIic6ImluIGEgY29tcG9uZW50IHJlbmRlciBmdW5jdGlvbi4iKSxlLnZtKTticmVha312YXIgbj15bi5zbGljZSgpLHI9bW4uc2xpY2UoKTtTbj1tbi5sZW5ndGg9eW4ubGVuZ3RoPTAsX249e30sd249a249IShibj17fSksZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspZVt0XS5faW5hY3RpdmU9ITAsaG4oZVt0XSwhMCl9KG4pLGZ1bmN0aW9uKGUpe3ZhciB0PWUubGVuZ3RoO2Zvcig7dC0tOyl7dmFyIG49ZVt0XSxyPW4udm07ci5fd2F0Y2hlcj09PW4mJnIuX2lzTW91bnRlZCYmIXIuX2lzRGVzdHJveWVkJiYoci5fJHZkP3IuXyR2ZC5hZGRVcGRhdGVkVm0ocik6dm4ociwidXBkYXRlZCIpKX19KHIpLHJlJiZ6LmRldnRvb2xzJiZyZS5lbWl0KCJmbHVzaCIpfXZhciBPbj0wLEVuPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dGhpcy52bT1lLGkmJihlLl93YXRjaGVyPXRoaXMpLGUuX3dhdGNoZXJzLnB1c2godGhpcykscj8odGhpcy5kZWVwPSEhci5kZWVwLHRoaXMudXNlcj0hIXIudXNlcix0aGlzLmxhenk9ISFyLmxhenksdGhpcy5zeW5jPSEhci5zeW5jLHRoaXMuYmVmb3JlPXIuYmVmb3JlKTp0aGlzLmRlZXA9dGhpcy51c2VyPXRoaXMubGF6eT10aGlzLnN5bmM9ITEsdGhpcy5jYj1uLHRoaXMuaWQ9KytPbix0aGlzLmFjdGl2ZT0hMCx0aGlzLmRpcnR5PXRoaXMubGF6eSx0aGlzLmRlcHM9W10sdGhpcy5uZXdEZXBzPVtdLHRoaXMuZGVwSWRzPW5ldyBvZSx0aGlzLm5ld0RlcElkcz1uZXcgb2UsdGhpcy5leHByZXNzaW9uPXQudG9TdHJpbmcoKSwiZnVuY3Rpb24iPT10eXBlb2YgdD90aGlzLmdldHRlcj10Oih0aGlzLmdldHRlcj1mdW5jdGlvbihlKXtpZighVy50ZXN0KGUpKXt2YXIgbj1lLnNwbGl0KCIuIik7cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8bi5sZW5ndGg7dCsrKXtpZighZSlyZXR1cm47ZT1lW25bdF1dfXJldHVybiBlfX19KHQpLHRoaXMuZ2V0dGVyfHwodGhpcy5nZXR0ZXI9QSxzZSgnRmFpbGVkIHdhdGNoaW5nIHBhdGg6ICInK3QrJyIgV2F0Y2hlciBvbmx5IGFjY2VwdHMgc2ltcGxlIGRvdC1kZWxpbWl0ZWQgcGF0aHMuIEZvciBmdWxsIGNvbnRyb2wsIHVzZSBhIGZ1bmN0aW9uIGluc3RlYWQuJyxlKSkpLHRoaXMudmFsdWU9dGhpcy5sYXp5P3ZvaWQgMDp0aGlzLmdldCgpfTtFbi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKCl7dmFyIGU7dmUodGhpcyk7dmFyIHQ9dGhpcy52bTt0cnl7ZT10aGlzLmdldHRlci5jYWxsKHQsdCl9Y2F0Y2goZSl7aWYoIXRoaXMudXNlcil0aHJvdyBlO0plKGUsdCwnZ2V0dGVyIGZvciB3YXRjaGVyICInK3RoaXMuZXhwcmVzc2lvbisnIicpfWZpbmFsbHl7dGhpcy5kZWVwJiZndChlKSxnZSgpLHRoaXMuY2xlYW51cERlcHMoKX1yZXR1cm4gZX0sRW4ucHJvdG90eXBlLmFkZERlcD1mdW5jdGlvbihlKXt2YXIgdD1lLmlkO3RoaXMubmV3RGVwSWRzLmhhcyh0KXx8KHRoaXMubmV3RGVwSWRzLmFkZCh0KSx0aGlzLm5ld0RlcHMucHVzaChlKSx0aGlzLmRlcElkcy5oYXModCl8fGUuYWRkU3ViKHRoaXMpKX0sRW4ucHJvdG90eXBlLmNsZWFudXBEZXBzPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuZGVwcy5sZW5ndGg7ZS0tOyl7dmFyIHQ9dGhpcy5kZXBzW2VdO3RoaXMubmV3RGVwSWRzLmhhcyh0LmlkKXx8dC5yZW1vdmVTdWIodGhpcyl9dmFyIG49dGhpcy5kZXBJZHM7dGhpcy5kZXBJZHM9dGhpcy5uZXdEZXBJZHMsdGhpcy5uZXdEZXBJZHM9bix0aGlzLm5ld0RlcElkcy5jbGVhcigpLG49dGhpcy5kZXBzLHRoaXMuZGVwcz10aGlzLm5ld0RlcHMsdGhpcy5uZXdEZXBzPW4sdGhpcy5uZXdEZXBzLmxlbmd0aD0wfSxFbi5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5sYXp5P3RoaXMuZGlydHk9ITA6dGhpcy5zeW5jP3RoaXMucnVuKCk6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5pZDtpZihudWxsPT1fblt0XSl7aWYoX25bdF09ITAsa24pe2Zvcih2YXIgbj1tbi5sZW5ndGgtMTtTbjxuJiZtbltuXS5pZD5lLmlkOyluLS07bW4uc3BsaWNlKG4rMSwwLGUpfWVsc2UgbW4ucHVzaChlKTtpZighd24pe2lmKHduPSEwLCF6LmFzeW5jKXJldHVybiBUbigpO290KFRuKX19fSh0aGlzKX0sRW4ucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe2lmKHRoaXMuYWN0aXZlKXt2YXIgZT10aGlzLmdldCgpO2lmKGUhPT10aGlzLnZhbHVlfHx5KGUpfHx0aGlzLmRlZXApe3ZhciB0PXRoaXMudmFsdWU7aWYodGhpcy52YWx1ZT1lLHRoaXMudXNlcil0cnl7dGhpcy5jYi5jYWxsKHRoaXMudm0sZSx0KX1jYXRjaChlKXtKZShlLHRoaXMudm0sJ2NhbGxiYWNrIGZvciB3YXRjaGVyICInK3RoaXMuZXhwcmVzc2lvbisnIicpfWVsc2UgdGhpcy5jYi5jYWxsKHRoaXMudm0sZSx0KX19fSxFbi5wcm90b3R5cGUuZXZhbHVhdGU9ZnVuY3Rpb24oKXt0aGlzLnZhbHVlPXRoaXMuZ2V0KCksdGhpcy5kaXJ0eT0hMX0sRW4ucHJvdG90eXBlLmRlcGVuZD1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLmRlcHMubGVuZ3RoO2UtLTspdGhpcy5kZXBzW2VdLmRlcGVuZCgpfSxFbi5wcm90b3R5cGUudGVhcmRvd249ZnVuY3Rpb24oKXtpZih0aGlzLmFjdGl2ZSl7dGhpcy52bS5faXNCZWluZ0Rlc3Ryb3llZHx8Yih0aGlzLnZtLl93YXRjaGVycyx0aGlzKTtmb3IodmFyIGU9dGhpcy5kZXBzLmxlbmd0aDtlLS07KXRoaXMuZGVwc1tlXS5yZW1vdmVTdWIodGhpcyk7dGhpcy5hY3RpdmU9ITF9fTt2YXIgQW49e2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpBLHNldDpBfTtmdW5jdGlvbiBJbihlLHQsbil7QW4uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbdF1bbl19LEFuLnNldD1mdW5jdGlvbihlKXt0aGlzW3RdW25dPWV9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4sQW4pfWZ1bmN0aW9uICRuKGUpe2UuX3dhdGNoZXJzPVtdO3ZhciB0PWUuJG9wdGlvbnM7dC5wcm9wcyYmZnVuY3Rpb24ocixpKXt2YXIgbz1yLiRvcHRpb25zLnByb3BzRGF0YXx8e30sYT1yLl9wcm9wcz17fSxzPXIuJG9wdGlvbnMuX3Byb3BLZXlzPVtdLGM9IXIuJHBhcmVudDtjfHxUZSghMSk7dmFyIGU9ZnVuY3Rpb24oZSl7cy5wdXNoKGUpO3ZhciB0PVZlKGUsaSxvLHIpLG49eChlKTsoZihuKXx8ei5pc1Jlc2VydmVkQXR0cihuKSkmJnNlKCciJytuKyciIGlzIGEgcmVzZXJ2ZWQgYXR0cmlidXRlIGFuZCBjYW5ub3QgYmUgdXNlZCBhcyBjb21wb25lbnQgcHJvcC4nLHIpLEFlKGEsZSx0LGZ1bmN0aW9uKCl7Y3x8Zm58fHNlKCJBdm9pZCBtdXRhdGluZyBhIHByb3AgZGlyZWN0bHkgc2luY2UgdGhlIHZhbHVlIHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2hlbmV2ZXIgdGhlIHBhcmVudCBjb21wb25lbnQgcmUtcmVuZGVycy4gSW5zdGVhZCwgdXNlIGEgZGF0YSBvciBjb21wdXRlZCBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgcHJvcCdzIHZhbHVlLiBQcm9wIGJlaW5nIG11dGF0ZWQ6IFwiIitlKyciJyxyKX0pLGUgaW4gcnx8SW4ociwiX3Byb3BzIixlKX07Zm9yKHZhciB0IGluIGkpZSh0KTtUZSghMCl9KGUsdC5wcm9wcyksdC5tZXRob2RzJiZmdW5jdGlvbihlLHQpe3ZhciBuPWUuJG9wdGlvbnMucHJvcHM7Zm9yKHZhciByIGluIHQpImZ1bmN0aW9uIiE9dHlwZW9mIHRbcl0mJnNlKCdNZXRob2QgIicrcisnIiBoYXMgdHlwZSAiJyt0eXBlb2YgdFtyXSsnIiBpbiB0aGUgY29tcG9uZW50IGRlZmluaXRpb24uIERpZCB5b3UgcmVmZXJlbmNlIHRoZSBmdW5jdGlvbiBjb3JyZWN0bHk/JyxlKSxuJiZ3KG4scikmJnNlKCdNZXRob2QgIicrcisnIiBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQgYXMgYSBwcm9wLicsZSksciBpbiBlJiZVKHIpJiZzZSgnTWV0aG9kICInK3IrJyIgY29uZmxpY3RzIHdpdGggYW4gZXhpc3RpbmcgVnVlIGluc3RhbmNlIG1ldGhvZC4gQXZvaWQgZGVmaW5pbmcgY29tcG9uZW50IG1ldGhvZHMgdGhhdCBzdGFydCB3aXRoIF8gb3IgJC4nKSxlW3JdPSJmdW5jdGlvbiIhPXR5cGVvZiB0W3JdP0E6Qyh0W3JdLGUpfShlLHQubWV0aG9kcyksdC5kYXRhP2Z1bmN0aW9uKGUpe3ZhciB0PWUuJG9wdGlvbnMuZGF0YTt1KHQ9ZS5fZGF0YT0iZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbihlLHQpe3ZlKCk7dHJ5e3JldHVybiBlLmNhbGwodCx0KX1jYXRjaChlKXtyZXR1cm4gSmUoZSx0LCJkYXRhKCkiKSx7fX1maW5hbGx5e2dlKCl9fSh0LGUpOnR8fHt9KXx8KHQ9e30sc2UoImRhdGEgZnVuY3Rpb25zIHNob3VsZCByZXR1cm4gYW4gb2JqZWN0OlxuaHR0cHM6Ly92dWVqcy5vcmcvdjIvZ3VpZGUvY29tcG9uZW50cy5odG1sI2RhdGEtTXVzdC1CZS1hLUZ1bmN0aW9uIixlKSk7dmFyIG49T2JqZWN0LmtleXModCkscj1lLiRvcHRpb25zLnByb3BzLGk9ZS4kb3B0aW9ucy5tZXRob2RzLG89bi5sZW5ndGg7Zm9yKDtvLS07KXt2YXIgYT1uW29dO2kmJncoaSxhKSYmc2UoJ01ldGhvZCAiJythKyciIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCBhcyBhIGRhdGEgcHJvcGVydHkuJyxlKSxyJiZ3KHIsYSk/c2UoJ1RoZSBkYXRhIHByb3BlcnR5ICInK2ErJyIgaXMgYWxyZWFkeSBkZWNsYXJlZCBhcyBhIHByb3AuIFVzZSBwcm9wIGRlZmF1bHQgdmFsdWUgaW5zdGVhZC4nLGUpOlUoYSl8fEluKGUsIl9kYXRhIixhKX1FZSh0LCEwKX0oZSk6RWUoZS5fZGF0YT17fSwhMCksdC5jb21wdXRlZCYmZnVuY3Rpb24oZSx0KXt2YXIgbj1lLl9jb21wdXRlZFdhdGNoZXJzPU9iamVjdC5jcmVhdGUobnVsbCkscj1uZSgpO2Zvcih2YXIgaSBpbiB0KXt2YXIgbz10W2ldLGE9ImZ1bmN0aW9uIj09dHlwZW9mIG8/bzpvLmdldDtudWxsPT1hJiZzZSgnR2V0dGVyIGlzIG1pc3NpbmcgZm9yIGNvbXB1dGVkIHByb3BlcnR5ICInK2krJyIuJyxlKSxyfHwobltpXT1uZXcgRW4oZSxhfHxBLEEsUG4pKSxpIGluIGU/aSBpbiBlLiRkYXRhP3NlKCdUaGUgY29tcHV0ZWQgcHJvcGVydHkgIicraSsnIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gZGF0YS4nLGUpOmUuJG9wdGlvbnMucHJvcHMmJmkgaW4gZS4kb3B0aW9ucy5wcm9wcyYmc2UoJ1RoZSBjb21wdXRlZCBwcm9wZXJ0eSAiJytpKyciIGlzIGFscmVhZHkgZGVmaW5lZCBhcyBhIHByb3AuJyxlKTpNbihlLGksbyl9fShlLHQuY29tcHV0ZWQpLHQud2F0Y2gmJnQud2F0Y2ghPT1lZSYmZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4gaW4gdCl7dmFyIHI9dFtuXTtpZihBcnJheS5pc0FycmF5KHIpKWZvcih2YXIgaT0wO2k8ci5sZW5ndGg7aSsrKU5uKGUsbixyW2ldKTtlbHNlIE5uKGUsbixyKX19KGUsdC53YXRjaCl9dmFyIFBuPXtsYXp5OiEwfTtmdW5jdGlvbiBNbihlLHQsbil7dmFyIHI9IW5lKCk7ImZ1bmN0aW9uIj09dHlwZW9mIG4/KEFuLmdldD1yP2puKHQpOkxuKG4pLEFuLnNldD1BKTooQW4uZ2V0PW4uZ2V0P3ImJiExIT09bi5jYWNoZT9qbih0KTpMbihuLmdldCk6QSxBbi5zZXQ9bi5zZXR8fEEpLEFuLnNldD09PUEmJihBbi5zZXQ9ZnVuY3Rpb24oKXtzZSgnQ29tcHV0ZWQgcHJvcGVydHkgIicrdCsnIiB3YXMgYXNzaWduZWQgdG8gYnV0IGl0IGhhcyBubyBzZXR0ZXIuJyx0aGlzKX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQsQW4pfWZ1bmN0aW9uIGpuKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2NvbXB1dGVkV2F0Y2hlcnMmJnRoaXMuX2NvbXB1dGVkV2F0Y2hlcnNbdF07aWYoZSlyZXR1cm4gZS5kaXJ0eSYmZS5ldmFsdWF0ZSgpLGhlLlNoYXJlZE9iamVjdC50YXJnZXQmJmUuZGVwZW5kKCksZS52YWx1ZX19ZnVuY3Rpb24gTG4oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUuY2FsbCh0aGlzLHRoaXMpfX1mdW5jdGlvbiBObihlLHQsbixyKXtyZXR1cm4gdShuKSYmKG49KHI9bikuaGFuZGxlciksInN0cmluZyI9PXR5cGVvZiBuJiYobj1lW25dKSxlLiR3YXRjaCh0LG4scil9dmFyIEJuLERuLFJuLEZuLHpuLFZuLFVuLHFuPTA7ZnVuY3Rpb24gV24oZSl7dmFyIHQ9ZS5vcHRpb25zO2lmKGUuc3VwZXIpe3ZhciBuPVduKGUuc3VwZXIpO2lmKG4hPT1lLnN1cGVyT3B0aW9ucyl7ZS5zdXBlck9wdGlvbnM9bjt2YXIgcj1mdW5jdGlvbihlKXt2YXIgdCxuPWUub3B0aW9ucyxyPWUuc2VhbGVkT3B0aW9ucztmb3IodmFyIGkgaW4gbiluW2ldIT09cltpXSYmKHR8fCh0PXt9KSx0W2ldPW5baV0pO3JldHVybiB0fShlKTtyJiZPKGUuZXh0ZW5kT3B0aW9ucyxyKSwodD1lLm9wdGlvbnM9RmUobixlLmV4dGVuZE9wdGlvbnMpKS5uYW1lJiYodC5jb21wb25lbnRzW3QubmFtZV09ZSl9fXJldHVybiB0fWZ1bmN0aW9uIEhuKGUpe3RoaXMgaW5zdGFuY2VvZiBIbnx8c2UoIlZ1ZSBpcyBhIGNvbnN0cnVjdG9yIGFuZCBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIGBuZXdgIGtleXdvcmQiKSx0aGlzLl9pbml0KGUpfWZ1bmN0aW9uIEduKGUpe2UuY2lkPTA7dmFyIGE9MTtlLmV4dGVuZD1mdW5jdGlvbihlKXtlPWV8fHt9O3ZhciB0PXRoaXMsbj10LmNpZCxyPWUuX0N0b3J8fChlLl9DdG9yPXt9KTtpZihyW25dKXJldHVybiByW25dO3ZhciBpPWUubmFtZXx8dC5vcHRpb25zLm5hbWU7aSYmRGUoaSk7dmFyIG89ZnVuY3Rpb24oZSl7dGhpcy5faW5pdChlKX07cmV0dXJuKChvLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKSkuY29uc3RydWN0b3I9bykuY2lkPWErKyxvLm9wdGlvbnM9RmUodC5vcHRpb25zLGUpLG8uc3VwZXI9dCxvLm9wdGlvbnMucHJvcHMmJmZ1bmN0aW9uKGUpe3ZhciB0PWUub3B0aW9ucy5wcm9wcztmb3IodmFyIG4gaW4gdClJbihlLnByb3RvdHlwZSwiX3Byb3BzIixuKX0obyksby5vcHRpb25zLmNvbXB1dGVkJiZmdW5jdGlvbihlKXt2YXIgdD1lLm9wdGlvbnMuY29tcHV0ZWQ7Zm9yKHZhciBuIGluIHQpTW4oZS5wcm90b3R5cGUsbix0W25dKX0obyksby5leHRlbmQ9dC5leHRlbmQsby5taXhpbj10Lm1peGluLG8udXNlPXQudXNlLFIuZm9yRWFjaChmdW5jdGlvbihlKXtvW2VdPXRbZV19KSxpJiYoby5vcHRpb25zLmNvbXBvbmVudHNbaV09byksby5zdXBlck9wdGlvbnM9dC5vcHRpb25zLG8uZXh0ZW5kT3B0aW9ucz1lLG8uc2VhbGVkT3B0aW9ucz1PKHt9LG8ub3B0aW9ucykscltuXT1vfX1mdW5jdGlvbiBYbihlKXtyZXR1cm4gZSYmKGUuQ3Rvci5vcHRpb25zLm5hbWV8fGUudGFnKX1mdW5jdGlvbiBZbihlLHQpe3JldHVybiBBcnJheS5pc0FycmF5KGUpPy0xPGUuaW5kZXhPZih0KToic3RyaW5nIj09dHlwZW9mIGU/LTE8ZS5zcGxpdCgiLCIpLmluZGV4T2YodCk6ISFpKGUpJiZlLnRlc3QodCl9ZnVuY3Rpb24gSm4oZSx0KXt2YXIgbj1lLmNhY2hlLHI9ZS5rZXlzLGk9ZS5fdm5vZGU7Zm9yKHZhciBvIGluIG4pe3ZhciBhPW5bb107aWYoYSl7dmFyIHM9WG4oYS5jb21wb25lbnRPcHRpb25zKTtzJiYhdChzKSYmS24obixvLHIsaSl9fX1mdW5jdGlvbiBLbihlLHQsbixyKXt2YXIgaT1lW3RdOyFpfHxyJiZpLnRhZz09PXIudGFnfHxpLmNvbXBvbmVudEluc3RhbmNlLiRkZXN0cm95KCksZVt0XT1udWxsLGIobix0KX1Ibi5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhLHM9dGhpcztzLl91aWQ9cW4rKyx6LnBlcmZvcm1hbmNlJiZwdCYmKHQ9InZ1ZS1wZXJmLXN0YXJ0OiIrcy5fdWlkLG49InZ1ZS1wZXJmLWVuZDoiK3MuX3VpZCxwdCh0KSkscy5faXNWdWU9ITAsZSYmZS5faXNDb21wb25lbnQ/ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLiRvcHRpb25zPU9iamVjdC5jcmVhdGUoZS5jb25zdHJ1Y3Rvci5vcHRpb25zKSxyPXQuX3BhcmVudFZub2RlO24ucGFyZW50PXQucGFyZW50O3ZhciBpPShuLl9wYXJlbnRWbm9kZT1yKS5jb21wb25lbnRPcHRpb25zO24ucHJvcHNEYXRhPWkucHJvcHNEYXRhLG4uX3BhcmVudExpc3RlbmVycz1pLmxpc3RlbmVycyxuLl9yZW5kZXJDaGlsZHJlbj1pLmNoaWxkcmVuLG4uX2NvbXBvbmVudFRhZz1pLnRhZyx0LnJlbmRlciYmKG4ucmVuZGVyPXQucmVuZGVyLG4uc3RhdGljUmVuZGVyRm5zPXQuc3RhdGljUmVuZGVyRm5zKX0ocyxlKTpzLiRvcHRpb25zPUZlKFduKHMuY29uc3RydWN0b3IpLGV8fHt9LHMpLHJ0KHMpLGZ1bmN0aW9uKGUpe3ZhciB0PWUuJG9wdGlvbnMsbj10LnBhcmVudDtpZihuJiYhdC5hYnN0cmFjdCl7Zm9yKDtuLiRvcHRpb25zLmFic3RyYWN0JiZuLiRwYXJlbnQ7KW49bi4kcGFyZW50O24uJGNoaWxkcmVuLnB1c2goZSl9ZS4kcGFyZW50PW4sZS4kcm9vdD1uP24uJHJvb3Q6ZSxlLiRjaGlsZHJlbj1bXSxlLiRyZWZzPXt9LGUuX3dhdGNoZXI9bnVsbCxlLl9pbmFjdGl2ZT1udWxsLGUuX2RpcmVjdEluYWN0aXZlPSExLGUuX2lzTW91bnRlZD0hMSxlLl9pc0Rlc3Ryb3llZD0hMSxlLl9pc0JlaW5nRGVzdHJveWVkPSExfShzLl9zZWxmPXMpLGZ1bmN0aW9uKGUpe2UuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLGUuX2hhc0hvb2tFdmVudD0hMTt2YXIgdD1lLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7dCYmbG4oZSx0KX0ocyksZnVuY3Rpb24oaSl7aS5fdm5vZGU9bnVsbCxpLl9zdGF0aWNUcmVlcz1udWxsO3ZhciBlPWkuJG9wdGlvbnMsdD1pLiR2bm9kZT1lLl9wYXJlbnRWbm9kZSxuPXQmJnQuY29udGV4dDtpLiRzbG90cz1PdChlLl9yZW5kZXJDaGlsZHJlbixuKSxpLiRzY29wZWRTbG90cz1tLGkuX2M9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIG5uKGksZSx0LG4sciwhMSl9LGkuJGNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIG5uKGksZSx0LG4sciwhMCl9O3ZhciByPXQmJnQuZGF0YTtBZShpLCIkYXR0cnMiLHImJnIuYXR0cnN8fG0sZnVuY3Rpb24oKXshZm4mJnNlKCIkYXR0cnMgaXMgcmVhZG9ubHkuIixpKX0sITApLEFlKGksIiRsaXN0ZW5lcnMiLGUuX3BhcmVudExpc3RlbmVyc3x8bSxmdW5jdGlvbigpeyFmbiYmc2UoIiRsaXN0ZW5lcnMgaXMgcmVhZG9ubHkuIixpKX0sITApfShzKSx2bihzLCJiZWZvcmVDcmVhdGUiKSwoaT1UdCgocj1zKS4kb3B0aW9ucy5pbmplY3QscikpJiYoVGUoITEpLE9iamVjdC5rZXlzKGkpLmZvckVhY2goZnVuY3Rpb24oZSl7QWUocixlLGlbZV0sZnVuY3Rpb24oKXtzZSgnQXZvaWQgbXV0YXRpbmcgYW4gaW5qZWN0ZWQgdmFsdWUgZGlyZWN0bHkgc2luY2UgdGhlIGNoYW5nZXMgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuZXZlciB0aGUgcHJvdmlkZWQgY29tcG9uZW50IHJlLXJlbmRlcnMuIGluamVjdGlvbiBiZWluZyBtdXRhdGVkOiAiJytlKyciJyxyKX0pfSksVGUoITApKSwkbihzKSwoYT0obz1zKS4kb3B0aW9ucy5wcm92aWRlKSYmKG8uX3Byb3ZpZGVkPSJmdW5jdGlvbiI9PXR5cGVvZiBhP2EuY2FsbChvKTphKSx2bihzLCJjcmVhdGVkIiksei5wZXJmb3JtYW5jZSYmcHQmJihzLl9uYW1lPWxlKHMsITEpLHB0KG4pLGh0KCJ2dWUgIitzLl9uYW1lKyIgaW5pdCIsdCxuKSkscy4kb3B0aW9ucy5lbCYmcy4kbW91bnQocy4kb3B0aW9ucy5lbCl9LEJuPUhuLFJuPXtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvcHN9fSwoRG49e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhfX0pLnNldD1mdW5jdGlvbigpe3NlKCJBdm9pZCByZXBsYWNpbmcgaW5zdGFuY2Ugcm9vdCAkZGF0YS4gVXNlIG5lc3RlZCBkYXRhIHByb3BlcnRpZXMgaW5zdGVhZC4iLHRoaXMpfSxSbi5zZXQ9ZnVuY3Rpb24oKXtzZSgiJHByb3BzIGlzIHJlYWRvbmx5LiIsdGhpcyl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCbi5wcm90b3R5cGUsIiRkYXRhIixEbiksT2JqZWN0LmRlZmluZVByb3BlcnR5KEJuLnByb3RvdHlwZSwiJHByb3BzIixSbiksQm4ucHJvdG90eXBlLiRzZXQ9SWUsQm4ucHJvdG90eXBlLiRkZWxldGU9JGUsQm4ucHJvdG90eXBlLiR3YXRjaD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcztpZih1KHQpKXJldHVybiBObihyLGUsdCxuKTsobj1ufHx7fSkudXNlcj0hMDt2YXIgaT1uZXcgRW4ocixlLHQsbik7aWYobi5pbW1lZGlhdGUpdHJ5e3QuY2FsbChyLGkudmFsdWUpfWNhdGNoKGUpe0plKGUsciwnY2FsbGJhY2sgZm9yIGltbWVkaWF0ZSB3YXRjaGVyICInK2kuZXhwcmVzc2lvbisnIicpfXJldHVybiBmdW5jdGlvbigpe2kudGVhcmRvd24oKX19LHpuPS9eaG9vazovLChGbj1IbikucHJvdG90eXBlLiRvbj1mdW5jdGlvbihlLHQpe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKXRoaXMuJG9uKGVbbl0sdCk7ZWxzZSh0aGlzLl9ldmVudHNbZV18fCh0aGlzLl9ldmVudHNbZV09W10pKS5wdXNoKHQpLHpuLnRlc3QoZSkmJih0aGlzLl9oYXNIb29rRXZlbnQ9ITApO3JldHVybiB0aGlzfSxGbi5wcm90b3R5cGUuJG9uY2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2Z1bmN0aW9uIHIoKXtuLiRvZmYoZSxyKSx0LmFwcGx5KG4sYXJndW1lbnRzKX1yZXR1cm4gci5mbj10LG4uJG9uKGUsciksbn0sRm4ucHJvdG90eXBlLiRvZmY9ZnVuY3Rpb24oZSx0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcztpZihBcnJheS5pc0FycmF5KGUpKXtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspdGhpcy4kb2ZmKGVbbl0sdCk7cmV0dXJuIHRoaXN9dmFyIGksbz10aGlzLl9ldmVudHNbZV07aWYoIW8pcmV0dXJuIHRoaXM7aWYoIXQpcmV0dXJuIHRoaXMuX2V2ZW50c1tlXT1udWxsLHRoaXM7Zm9yKHZhciBhPW8ubGVuZ3RoO2EtLTspaWYoKGk9b1thXSk9PT10fHxpLmZuPT09dCl7by5zcGxpY2UoYSwxKTticmVha31yZXR1cm4gdGhpc30sRm4ucHJvdG90eXBlLiRlbWl0PWZ1bmN0aW9uKGUpe3ZhciB0PWUudG9Mb3dlckNhc2UoKTt0IT09ZSYmdGhpcy5fZXZlbnRzW3RdJiZjZSgnRXZlbnQgIicrdCsnIiBpcyBlbWl0dGVkIGluIGNvbXBvbmVudCAnK2xlKHRoaXMpKycgYnV0IHRoZSBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQgZm9yICInK2UrJyIuIE5vdGUgdGhhdCBIVE1MIGF0dHJpYnV0ZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUgYW5kIHlvdSBjYW5ub3QgdXNlIHYtb24gdG8gbGlzdGVuIHRvIGNhbWVsQ2FzZSBldmVudHMgd2hlbiB1c2luZyBpbi1ET00gdGVtcGxhdGVzLiBZb3Ugc2hvdWxkIHByb2JhYmx5IHVzZSAiJyt4KGUpKyciIGluc3RlYWQgb2YgIicrZSsnIi4nKTt2YXIgbj10aGlzLl9ldmVudHNbZV07aWYobil7bj0xPG4ubGVuZ3RoP1Qobik6bjtmb3IodmFyIHI9VChhcmd1bWVudHMsMSksaT0nZXZlbnQgaGFuZGxlciBmb3IgIicrZSsnIicsbz0wLGE9bi5sZW5ndGg7bzxhO28rKylLZShuW29dLHRoaXMscix0aGlzLGkpfXJldHVybiB0aGlzfSwoVm49SG4pLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj10aGlzLGk9ci4kZWwsbz1yLl92bm9kZSxhPShuPWRuLGRuPXIsZnVuY3Rpb24oKXtkbj1ufSk7ci5fdm5vZGU9ZSxyLiRlbD1vP3IuX19wYXRjaF9fKG8sZSk6ci5fX3BhdGNoX18oci4kZWwsZSx0LCExKSxhKCksaSYmKGkuX192dWVfXz1udWxsKSxyLiRlbCYmKHIuJGVsLl9fdnVlX189ciksci4kdm5vZGUmJnIuJHBhcmVudCYmci4kdm5vZGU9PT1yLiRwYXJlbnQuX3Zub2RlJiYoci4kcGFyZW50LiRlbD1yLiRlbCl9LFZuLnByb3RvdHlwZS4kZm9yY2VVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl93YXRjaGVyJiZ0aGlzLl93YXRjaGVyLnVwZGF0ZSgpfSxWbi5wcm90b3R5cGUuJGRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKCFlLl9pc0JlaW5nRGVzdHJveWVkKXt2bihlLCJiZWZvcmVEZXN0cm95IiksZS5faXNCZWluZ0Rlc3Ryb3llZD0hMDt2YXIgdD1lLiRwYXJlbnQ7IXR8fHQuX2lzQmVpbmdEZXN0cm95ZWR8fGUuJG9wdGlvbnMuYWJzdHJhY3R8fGIodC4kY2hpbGRyZW4sZSksZS5fd2F0Y2hlciYmZS5fd2F0Y2hlci50ZWFyZG93bigpO2Zvcih2YXIgbj1lLl93YXRjaGVycy5sZW5ndGg7bi0tOyllLl93YXRjaGVyc1tuXS50ZWFyZG93bigpO2UuX2RhdGEuX19vYl9fJiZlLl9kYXRhLl9fb2JfXy52bUNvdW50LS0sZS5faXNEZXN0cm95ZWQ9ITAsZS5fX3BhdGNoX18oZS5fdm5vZGUsbnVsbCksdm4oZSwiZGVzdHJveWVkIiksZS4kb2ZmKCksZS4kZWwmJihlLiRlbC5fX3Z1ZV9fPW51bGwpLGUuJHZub2RlJiYoZS4kdm5vZGUucGFyZW50PW51bGwpfX0sSHQoKFVuPUhuKS5wcm90b3R5cGUpLFVuLnByb3RvdHlwZS4kbmV4dFRpY2s9ZnVuY3Rpb24oZSl7cmV0dXJuIG90KGUsdGhpcyl9LFVuLnByb3RvdHlwZS5fcmVuZGVyPWZ1bmN0aW9uKCl7dmFyIHQsbj10aGlzLGU9bi4kb3B0aW9ucyxyPWUucmVuZGVyLGk9ZS5fcGFyZW50Vm5vZGU7aSYmKG4uJHNjb3BlZFNsb3RzPUF0KGkuZGF0YS5zY29wZWRTbG90cyxuLiRzbG90cyxuLiRzY29wZWRTbG90cykpLG4uJHZub2RlPWk7dHJ5e29uPW4sdD1yLmNhbGwobi5fcmVuZGVyUHJveHksbi4kY3JlYXRlRWxlbWVudCl9Y2F0Y2goZSl7aWYoSmUoZSxuLCJyZW5kZXIiKSxuLiRvcHRpb25zLnJlbmRlckVycm9yKXRyeXt0PW4uJG9wdGlvbnMucmVuZGVyRXJyb3IuY2FsbChuLl9yZW5kZXJQcm94eSxuLiRjcmVhdGVFbGVtZW50LGUpfWNhdGNoKGUpe0plKGUsbiwicmVuZGVyRXJyb3IiKSx0PW4uX3Zub2RlfWVsc2UgdD1uLl92bm9kZX1maW5hbGx5e29uPW51bGx9cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJjE9PT10Lmxlbmd0aCYmKHQ9dFswXSksdCBpbnN0YW5jZW9mIG1lfHwoQXJyYXkuaXNBcnJheSh0KSYmc2UoIk11bHRpcGxlIHJvb3Qgbm9kZXMgcmV0dXJuZWQgZnJvbSByZW5kZXIgZnVuY3Rpb24uIFJlbmRlciBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIGEgc2luZ2xlIHJvb3Qgbm9kZS4iLG4pLHQ9X2UoKSksdC5wYXJlbnQ9aSx0fTt2YXIgWm4sUW4sZXIsdHI9W1N0cmluZyxSZWdFeHAsQXJyYXldLG5yPXtLZWVwQWxpdmU6e25hbWU6ImtlZXAtYWxpdmUiLGFic3RyYWN0OiEwLHByb3BzOntpbmNsdWRlOnRyLGV4Y2x1ZGU6dHIsbWF4OltTdHJpbmcsTnVtYmVyXX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuY2FjaGU9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLmtleXM9W119LGRlc3Ryb3llZDpmdW5jdGlvbigpe2Zvcih2YXIgZSBpbiB0aGlzLmNhY2hlKUtuKHRoaXMuY2FjaGUsZSx0aGlzLmtleXMpfSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLiR3YXRjaCgiaW5jbHVkZSIsZnVuY3Rpb24odCl7Sm4oZSxmdW5jdGlvbihlKXtyZXR1cm4gWW4odCxlKX0pfSksdGhpcy4kd2F0Y2goImV4Y2x1ZGUiLGZ1bmN0aW9uKHQpe0puKGUsZnVuY3Rpb24oZSl7cmV0dXJuIVluKHQsZSl9KX0pfSxyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRzbG90cy5kZWZhdWx0LHQ9ZnVuY3Rpb24oZSl7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyl7dmFyIG49ZVt0XTtpZihMKG4pJiYoTChuLmNvbXBvbmVudE9wdGlvbnMpfHwocj1uKS5pc0NvbW1lbnQmJnIuYXN5bmNGYWN0b3J5KSlyZXR1cm4gbn12YXIgcn0oZSksbj10JiZ0LmNvbXBvbmVudE9wdGlvbnM7aWYobil7dmFyIHI9WG4obiksaT10aGlzLmluY2x1ZGUsbz10aGlzLmV4Y2x1ZGU7aWYoaSYmKCFyfHwhWW4oaSxyKSl8fG8mJnImJlluKG8scikpcmV0dXJuIHQ7dmFyIGE9dGhpcy5jYWNoZSxzPXRoaXMua2V5cyxjPW51bGw9PXQua2V5P24uQ3Rvci5jaWQrKG4udGFnPyI6OiIrbi50YWc6IiIpOnQua2V5O2FbY10/KHQuY29tcG9uZW50SW5zdGFuY2U9YVtjXS5jb21wb25lbnRJbnN0YW5jZSxiKHMsYykscy5wdXNoKGMpKTooYVtjXT10LHMucHVzaChjKSx0aGlzLm1heCYmcy5sZW5ndGg+cGFyc2VJbnQodGhpcy5tYXgpJiZLbihhLHNbMF0scyx0aGlzLl92bm9kZSkpLHQuZGF0YS5rZWVwQWxpdmU9ITB9cmV0dXJuIHR8fGUmJmVbMF19fX07Wm49SG4sZXI9e2dldDpmdW5jdGlvbigpe3JldHVybiB6fSxzZXQ6ZnVuY3Rpb24oKXtzZSgiRG8gbm90IHJlcGxhY2UgdGhlIFZ1ZS5jb25maWcgb2JqZWN0LCBzZXQgaW5kaXZpZHVhbCBmaWVsZHMgaW5zdGVhZC4iKX19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShabiwiY29uZmlnIixlciksWm4udXRpbD17d2FybjpzZSxleHRlbmQ6TyxtZXJnZU9wdGlvbnM6RmUsZGVmaW5lUmVhY3RpdmU6QWV9LFpuLnNldD1JZSxabi5kZWxldGU9JGUsWm4ubmV4dFRpY2s9b3QsWm4ub2JzZXJ2YWJsZT1mdW5jdGlvbihlKXtyZXR1cm4gRWUoZSksZX0sWm4ub3B0aW9ucz1PYmplY3QuY3JlYXRlKG51bGwpLFIuZm9yRWFjaChmdW5jdGlvbihlKXtabi5vcHRpb25zW2UrInMiXT1PYmplY3QuY3JlYXRlKG51bGwpfSksTygoWm4ub3B0aW9ucy5fYmFzZT1abikub3B0aW9ucy5jb21wb25lbnRzLG5yKSxabi51c2U9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5faW5zdGFsbGVkUGx1Z2luc3x8KHRoaXMuX2luc3RhbGxlZFBsdWdpbnM9W10pO2lmKC0xPHQuaW5kZXhPZihlKSlyZXR1cm4gdGhpczt2YXIgbj1UKGFyZ3VtZW50cywxKTtyZXR1cm4gbi51bnNoaWZ0KHRoaXMpLCJmdW5jdGlvbiI9PXR5cGVvZiBlLmluc3RhbGw/ZS5pbnN0YWxsLmFwcGx5KGUsbik6ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUuYXBwbHkobnVsbCxuKSx0LnB1c2goZSksdGhpc30sWm4ubWl4aW49ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub3B0aW9ucz1GZSh0aGlzLm9wdGlvbnMsZSksdGhpc30sR24oWm4pLFFuPVpuLFIuZm9yRWFjaChmdW5jdGlvbihuKXtRbltuXT1mdW5jdGlvbihlLHQpe3JldHVybiB0PygiY29tcG9uZW50Ij09PW4mJkRlKGUpLCJjb21wb25lbnQiPT09biYmdSh0KSYmKHQubmFtZT10Lm5hbWV8fGUsdD10aGlzLm9wdGlvbnMuX2Jhc2UuZXh0ZW5kKHQpKSwiZGlyZWN0aXZlIj09PW4mJiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYodD17YmluZDp0LHVwZGF0ZTp0fSksdGhpcy5vcHRpb25zW24rInMiXVtlXT10KTp0aGlzLm9wdGlvbnNbbisicyJdW2VdfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShIbi5wcm90b3R5cGUsIiRpc1NlcnZlciIse2dldDpuZX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShIbi5wcm90b3R5cGUsIiRzc3JDb250ZXh0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHZub2RlJiZ0aGlzLiR2bm9kZS5zc3JDb250ZXh0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShIbiwiRnVuY3Rpb25hbFJlbmRlckNvbnRleHQiLHt2YWx1ZTpHdH0pLEhuLnZlcnNpb249IjIuNi4xMSI7dmFyIHJyPTE7ZnVuY3Rpb24gaXIoKXtyZXR1cm4ocnIrKykudG9TdHJpbmcoKX12YXIgb3I9ZnVuY3Rpb24oKXt0aGlzLm5vZGVJZD1pcigpLHRoaXMucmVmPXRoaXMubm9kZUlkLHRoaXMuY2hpbGRyZW49W10sdGhpcy5wdXJlQ2hpbGRyZW49W10sdGhpcy5wYXJlbnROb2RlPW51bGwsdGhpcy5uZXh0U2libGluZz1udWxsLHRoaXMucHJldmlvdXNTaWJsaW5nPW51bGx9O29yLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5fJHZkJiZ0aGlzLl8kdmQucmVtb3ZlRWxlbWVudCh0aGlzKSx0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5kZXN0cm95KCl9KX07dmFyIGFyPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dC5jYWxsKHRoaXMpLHRoaXMubm9kZVR5cGU9OCx0aGlzLm5vZGVJZD1pcigpLHRoaXMucmVmPXRoaXMubm9kZUlkLHRoaXMudHlwZT0iY29tbWVudCIsdGhpcy52YWx1ZT1lLHRoaXMuY2hpbGRyZW49W10sdGhpcy5wdXJlQ2hpbGRyZW49W119cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSwoKGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1lKS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iXHgzYyEtLSAiK3RoaXMudmFsdWUrIiAtLVx4M2UifSxlfShvcik7ZnVuY3Rpb24gc3IoZSx0LG4pe3ZhciByPWUuZG9jdW1lbnRFbGVtZW50O2lmKCEoMDxyLnB1cmVDaGlsZHJlbi5sZW5ndGh8fHQucGFyZW50Tm9kZSkpe3ZhciBpPXIuY2hpbGRyZW4sbz1pLmluZGV4T2Yobik7bzwwP2kucHVzaCh0KTppLnNwbGljZShvLDAsdCksMT09PXQubm9kZVR5cGU/KCJib2R5Ij09PXQucm9sZT8odC5kb2NJZD1lLmlkLHQub3duZXJEb2N1bWVudD1lLHQucGFyZW50Tm9kZT1yKToodC5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UucGFyZW50Tm9kZT10fSksY3IoZSx0KSx0LmRvY0lkPWUuaWQsdC5vd25lckRvY3VtZW50PWUpLHVyKHQsciksci5wdXJlQ2hpbGRyZW4ucHVzaCh0KSk6dC5wYXJlbnROb2RlPXJ9fWZ1bmN0aW9uIGNyKGUsdCl7dC5yb2xlPSJib2R5Iix0LmRlcHRoPTEsdC5yZWY9Il9yb290IixlLmJvZHk9dH1mdW5jdGlvbiB1cih0LGUpeyh0LnBhcmVudE5vZGU9ZSkuZG9jSWQmJih0LmRvY0lkPWUuZG9jSWQsdC5vd25lckRvY3VtZW50PWUub3duZXJEb2N1bWVudCx0LmRlcHRoPWUuZGVwdGgrMSksdC5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3VyKGUsdCl9KX1mdW5jdGlvbiBscihlKXtmb3IoO2U7KXtpZigxPT09ZS5ub2RlVHlwZSlyZXR1cm4gZTtlPWUubmV4dFNpYmxpbmd9fWZ1bmN0aW9uIGRyKGUpe2Zvcig7ZTspe2lmKDE9PT1lLm5vZGVUeXBlKXJldHVybiBlO2U9ZS5wcmV2aW91c1NpYmxpbmd9fWZ1bmN0aW9uIGZyKGUsdCxuLHIpe248MCYmKG49MCk7dmFyIGk9dFtuLTFdLG89dFtuXTtyZXR1cm4gdC5zcGxpY2UobiwwLGUpLHImJihpJiYoaS5uZXh0U2libGluZz1lKSxlLnByZXZpb3VzU2libGluZz1pLChlLm5leHRTaWJsaW5nPW8pJiYoby5wcmV2aW91c1NpYmxpbmc9ZSkpLG59ZnVuY3Rpb24gcHIoZSx0LG4scil7dmFyIGk9dC5pbmRleE9mKGUpO2lmKGk8MClyZXR1cm4tMTtpZihyKXt2YXIgbz10W2ktMV0sYT10W2krMV07byYmKG8ubmV4dFNpYmxpbmc9YSksYSYmKGEucHJldmlvdXNTaWJsaW5nPW8pfXQuc3BsaWNlKGksMSk7dmFyIHM9bjtpPD1uJiYocz1uLTEpO3ZhciBjPXRbcy0xXSx1PXRbc107cmV0dXJuIHQuc3BsaWNlKHMsMCxlKSxyJiYoYyYmKGMubmV4dFNpYmxpbmc9ZSksZS5wcmV2aW91c1NpYmxpbmc9YywoZS5uZXh0U2libGluZz11KSYmKHUucHJldmlvdXNTaWJsaW5nPWUpKSxpPT09cz8tMTpufWZ1bmN0aW9uIGhyKGUsdCxuKXt2YXIgcj10LmluZGV4T2YoZSk7aWYoIShyPDApKXtpZihuKXt2YXIgaT10W3ItMV0sbz10W3IrMV07aSYmKGkubmV4dFNpYmxpbmc9byksbyYmKG8ucHJldmlvdXNTaWJsaW5nPWkpfXQuc3BsaWNlKHIsMSl9fXZhciB2cj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPSJ2aWV3IiksdC5jYWxsKHRoaXMpLHRoaXMubm9kZVR5cGU9MSx0aGlzLm5vZGVJZD1pcigpLHRoaXMucmVmPXRoaXMubm9kZUlkLHRoaXMudHlwZT1lLHRoaXMuYXR0cj17fSx0aGlzLmV2ZW50cz17fSx0aGlzLmNoaWxkcmVuPVtdLHRoaXMucHVyZUNoaWxkcmVuPVtdfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksKChlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSkuY29uc3RydWN0b3I9ZSkucHJvdG90eXBlLnNldEF0dHJpYnV0ZT1mdW5jdGlvbihlLHQpeyJjaWQiPT09ZT90aGlzLmNpZD10OiJuaWQiPT09ZSYmKHRoaXMubmlkPXQpfSxlLnByb3RvdHlwZS5kaXNwYXRjaEV2ZW50PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5ldmVudHNbZV07biYmbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UodCl9KX0sZS5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe2lmKCIiPT09dGhpcy5jaWR8fCIiPT09dGhpcy5uaWQpcmV0dXJuIGNvbnNvbGUuZXJyb3IoImNpZD0iK3RoaXMuY2lkKyIsbmlkPSIrdGhpcy5uaWQrIiBhZGRFdmVudExpc3RlbmVyKCIrZSsiKSBub3QgZm91bmQiKTsodGhpcy5ldmVudHNbZV18fCh0aGlzLmV2ZW50c1tlXT1bXSkpLnB1c2godCksdGhpcy5fJHZkLmFkZEVsZW1lbnQodGhpcyl9LGUucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2lmKCIiPT09dGhpcy5jaWR8fCIiPT09dGhpcy5uaWQpcmV0dXJuIGNvbnNvbGUuZXJyb3IoImNpZD0iK3RoaXMuY2lkKyIsbmlkPSIrdGhpcy5uaWQrIiByZW1vdmVFdmVudExpc3RlbmVyKCIrZSsiKSBub3QgZm91bmQiKTt2YXIgcj0hMTtpZih0aGlzLmV2ZW50c1tlXSl7dmFyIGk9dGhpcy5ldmVudHNbZV0uaW5kZXhPZih0KTstMSE9PWkmJih0aGlzLmV2ZW50c1tlXS5zcGxpY2UoaSwxKSxyPSEwKX1yfHxjb25zb2xlLmVycm9yKCJjaWQ9Iit0aGlzLmNpZCsiLG5pZD0iK3RoaXMubmlkKyIgcmVtb3ZlRXZlbnRMaXN0ZW5lcigiK2UrIikgaGFuZGxlciBub3QgZm91bmQiKSxPYmplY3Qua2V5cyh0aGlzLmV2ZW50cykuZXZlcnkoZnVuY3Rpb24oZSl7cmV0dXJuIDA9PT1uLmV2ZW50c1tlXS5sZW5ndGh9KSYmdGhpcy5fJHZkLnJlbW92ZUVsZW1lbnQodGhpcyl9LGUucHJvdG90eXBlLmFwcGVuZENoaWxkPWZ1bmN0aW9uKGUpe2UucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlIT09dGhpc3x8KGUucGFyZW50Tm9kZT8ocHIoZSx0aGlzLmNoaWxkcmVuLHRoaXMuY2hpbGRyZW4ubGVuZ3RoLCEwKSwxPT09ZS5ub2RlVHlwZSYmcHIoZSx0aGlzLnB1cmVDaGlsZHJlbix0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgpKToodXIoZSx0aGlzKSxmcihlLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5sZW5ndGgsITApLDE9PT1lLm5vZGVUeXBlJiZmcihlLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCkpKX0sZS5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlPWZ1bmN0aW9uKGUsdCl7aWYoIShlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZSE9PXRoaXN8fGU9PT10fHxlLm5leHRTaWJsaW5nJiZlLm5leHRTaWJsaW5nPT09dCkpaWYoZS5wYXJlbnROb2RlKXtpZihwcihlLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKHQpLCEwKSwxPT09ZS5ub2RlVHlwZSl7dmFyIG49bHIodCk7cHIoZSx0aGlzLnB1cmVDaGlsZHJlbixuP3RoaXMucHVyZUNoaWxkcmVuLmluZGV4T2Yobik6dGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKX19ZWxzZSBpZih1cihlLHRoaXMpLGZyKGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmluZGV4T2YodCksITApLDE9PT1lLm5vZGVUeXBlKXt2YXIgcj1scih0KTtmcihlLHRoaXMucHVyZUNoaWxkcmVuLHI/dGhpcy5wdXJlQ2hpbGRyZW4uaW5kZXhPZihyKTp0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgpfX0sZS5wcm90b3R5cGUuaW5zZXJ0QWZ0ZXI9ZnVuY3Rpb24oZSx0KXtlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZSE9PXRoaXN8fGU9PT10fHxlLnByZXZpb3VzU2libGluZyYmZS5wcmV2aW91c1NpYmxpbmc9PT10fHwoZS5wYXJlbnROb2RlPyhwcihlLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKHQpKzEsITApLDE9PT1lLm5vZGVUeXBlJiZwcihlLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YoZHIodCkpKzEpKToodXIoZSx0aGlzKSxmcihlLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKHQpKzEsITApLDE9PT1lLm5vZGVUeXBlJiZmcihlLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YoZHIodCkpKzEpKSl9LGUucHJvdG90eXBlLnJlbW92ZUNoaWxkPWZ1bmN0aW9uKGUsdCl7ZS5wYXJlbnROb2RlJiYoaHIoZSx0aGlzLmNoaWxkcmVuLCEwKSwxPT09ZS5ub2RlVHlwZSYmaHIoZSx0aGlzLnB1cmVDaGlsZHJlbikpLHR8fGUuZGVzdHJveSgpfSxlLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlKXtlLmRlc3Ryb3koKX0pLHRoaXMuY2hpbGRyZW4ubGVuZ3RoPTAsdGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoPTB9LGUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIjwiK3RoaXMudHlwZSsiIGF0dHI9IitKU09OLnN0cmluZ2lmeSh0aGlzLmF0dHIpKyIgc3R5bGU9IitKU09OLnN0cmluZ2lmeSh0aGlzLnRvU3R5bGUoKSkrIj4iK3RoaXMucHVyZUNoaWxkcmVuLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS50b1N0cmluZygpfSkuam9pbigiIikrIjwvIit0aGlzLnR5cGUrIj4ifSxlfShvciksZ3I9ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWU/ZS50b1N0cmluZygpOiIiLHRoaXMuVVJMPXQsdGhpcy5jcmVhdGVEb2N1bWVudEVsZW1lbnQoKX07Z3IucHJvdG90eXBlLmNyZWF0ZURvY3VtZW50RWxlbWVudD1mdW5jdGlvbigpe3ZhciBuPXRoaXM7aWYoIXRoaXMuZG9jdW1lbnRFbGVtZW50KXt2YXIgZT1uZXcgdnIoImRvY3VtZW50Iik7ZS5kb2NJZD10aGlzLmlkLGUub3duZXJEb2N1bWVudD10aGlzLGUucm9sZT0iZG9jdW1lbnRFbGVtZW50IixlLmRlcHRoPTAsZS5yZWY9Il9kb2N1bWVudEVsZW1lbnQiLHRoaXMuZG9jdW1lbnRFbGVtZW50PWUsT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImFwcGVuZENoaWxkIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oZSl7c3IobixlKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiaW5zZXJ0QmVmb3JlIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oZSx0KXtzcihuLGUsdCl9fSl9cmV0dXJuIHRoaXMuZG9jdW1lbnRFbGVtZW50fSxnci5wcm90b3R5cGUuY3JlYXRlQm9keT1mdW5jdGlvbihlKXt0aGlzLmJvZHl8fGNyKHRoaXMsbmV3IHZyKGUpKTtyZXR1cm4gdGhpcy5ib2R5fSxnci5wcm90b3R5cGUuY3JlYXRlRWxlbWVudD1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHZyKGUpfSxnci5wcm90b3R5cGUuY3JlYXRlQ29tbWVudD1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IGFyKGUpfSxnci5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe307dmFyIG1yPXMoInN0eWxlLGNsYXNzIikseXI9KHMoImlucHV0LHRleHRhcmVhLG9wdGlvbixzZWxlY3QscHJvZ3Jlc3MiKSxzKCJjb250ZW50ZWRpdGFibGUsZHJhZ2dhYmxlLHNwZWxsY2hlY2siKSxzKCJldmVudHMsY2FyZXQsdHlwaW5nLHBsYWludGV4dC1vbmx5IikscygiYWxsb3dmdWxsc2NyZWVuLGFzeW5jLGF1dG9mb2N1cyxhdXRvcGxheSxjaGVja2VkLGNvbXBhY3QsY29udHJvbHMsZGVjbGFyZSxkZWZhdWx0LGRlZmF1bHRjaGVja2VkLGRlZmF1bHRtdXRlZCxkZWZhdWx0c2VsZWN0ZWQsZGVmZXIsZGlzYWJsZWQsZW5hYmxlZCxmb3Jtbm92YWxpZGF0ZSxoaWRkZW4saW5kZXRlcm1pbmF0ZSxpbmVydCxpc21hcCxpdGVtc2NvcGUsbG9vcCxtdWx0aXBsZSxtdXRlZCxub2hyZWYsbm9yZXNpemUsbm9zaGFkZSxub3ZhbGlkYXRlLG5vd3JhcCxvcGVuLHBhdXNlb25leGl0LHJlYWRvbmx5LHJlcXVpcmVkLHJldmVyc2VkLHNjb3BlZCxzZWFtbGVzcyxzZWxlY3RlZCxzb3J0YWJsZSx0cmFuc2xhdGUsdHJ1ZXNwZWVkLHR5cGVtdXN0bWF0Y2gsdmlzaWJsZSIpLHMoImh0bWwsYm9keSxiYXNlLGhlYWQsbGluayxtZXRhLHN0eWxlLHRpdGxlLGFkZHJlc3MsYXJ0aWNsZSxhc2lkZSxmb290ZXIsaGVhZGVyLGgxLGgyLGgzLGg0LGg1LGg2LGhncm91cCxuYXYsc2VjdGlvbixkaXYsZGQsZGwsZHQsZmlnY2FwdGlvbixmaWd1cmUscGljdHVyZSxocixpbWcsbGksbWFpbixvbCxwLHByZSx1bCxhLGIsYWJicixiZGksYmRvLGJyLGNpdGUsY29kZSxkYXRhLGRmbixlbSxpLGtiZCxtYXJrLHEscnAscnQscnRjLHJ1YnkscyxzYW1wLHNtYWxsLHNwYW4sc3Ryb25nLHN1YixzdXAsdGltZSx1LHZhcix3YnIsYXJlYSxhdWRpbyxtYXAsdHJhY2ssdmlkZW8sZW1iZWQsb2JqZWN0LHBhcmFtLHNvdXJjZSxjYW52YXMsc2NyaXB0LG5vc2NyaXB0LGRlbCxpbnMsY2FwdGlvbixjb2wsY29sZ3JvdXAsdGFibGUsdGhlYWQsdGJvZHksdGQsdGgsdHIsYnV0dG9uLGRhdGFsaXN0LGZpZWxkc2V0LGZvcm0saW5wdXQsbGFiZWwsbGVnZW5kLG1ldGVyLG9wdGdyb3VwLG9wdGlvbixvdXRwdXQscHJvZ3Jlc3Msc2VsZWN0LHRleHRhcmVhLGRldGFpbHMsZGlhbG9nLG1lbnUsbWVudWl0ZW0sc3VtbWFyeSxjb250ZW50LGVsZW1lbnQsc2hhZG93LHRlbXBsYXRlLGJsb2NrcXVvdGUsaWZyYW1lLHRmb290IikpO3ZhciBfcj1PYmplY3QuZnJlZXplKHtjcmVhdGVFbGVtZW50OmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdnIoZSl9LGNyZWF0ZUVsZW1lbnROUzpmdW5jdGlvbihlLHQpe3JldHVybiBuZXcgdnIoZSsiOiIrdCl9LGNyZWF0ZVRleHROb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB2cigidGV4dCIpfSxjcmVhdGVDb21tZW50OmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgYXIoZSl9LGluc2VydEJlZm9yZTpmdW5jdGlvbihlLHQsbil7ZS5pbnNlcnRCZWZvcmUodCxuKX0scmVtb3ZlQ2hpbGQ6ZnVuY3Rpb24oZSx0KXtlLnJlbW92ZUNoaWxkKHQpfSxhcHBlbmRDaGlsZDpmdW5jdGlvbihlLHQpe2UuYXBwZW5kQ2hpbGQodCl9LHBhcmVudE5vZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZX0sbmV4dFNpYmxpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubmV4dFNpYmxpbmd9LHRhZ05hbWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHlwZX0sc2V0VGV4dENvbnRlbnQ6ZnVuY3Rpb24oKXt9LHNldFN0eWxlU2NvcGU6ZnVuY3Rpb24oKXt9fSksYnI9e2NyZWF0ZTpmdW5jdGlvbihlLHQpe3dyKHQpfSx1cGRhdGU6ZnVuY3Rpb24oZSx0KXtlLmRhdGEucmVmIT09dC5kYXRhLnJlZiYmKHdyKGUsITApLHdyKHQpKX0sZGVzdHJveTpmdW5jdGlvbihlKXt3cihlLCEwKX19O2Z1bmN0aW9uIHdyKGUsdCl7dmFyIG49ZS5kYXRhLnJlZjtpZihMKG4pKXt2YXIgcj1lLmNvbnRleHQsaT1lLmNvbXBvbmVudEluc3RhbmNlfHxlLmVsbSxvPXIuJHJlZnM7dD9BcnJheS5pc0FycmF5KG9bbl0pP2Iob1tuXSxpKTpvW25dPT09aSYmKG9bbl09dm9pZCAwKTplLmRhdGEucmVmSW5Gb3I/QXJyYXkuaXNBcnJheShvW25dKT9vW25dLmluZGV4T2YoaSk8MCYmb1tuXS5wdXNoKGkpOm9bbl09W2ldOm9bbl09aX19cygiaHRtbCxib2R5LGJhc2UsaGVhZCxsaW5rLG1ldGEsc3R5bGUsdGl0bGUsYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGZvb3RlcixoZWFkZXIsaDEsaDIsaDMsaDQsaDUsaDYsaGdyb3VwLG5hdixzZWN0aW9uLGRpdixkZCxkbCxkdCxmaWdjYXB0aW9uLGZpZ3VyZSxwaWN0dXJlLGhyLGltZyxsaSxtYWluLG9sLHAscHJlLHVsLGEsYixhYmJyLGJkaSxiZG8sYnIsY2l0ZSxjb2RlLGRhdGEsZGZuLGVtLGksa2JkLG1hcmsscSxycCxydCxydGMscnVieSxzLHNhbXAsc21hbGwsc3BhbixzdHJvbmcsc3ViLHN1cCx0aW1lLHUsdmFyLHdicixhcmVhLGF1ZGlvLG1hcCx0cmFjayx2aWRlbyxlbWJlZCxvYmplY3QscGFyYW0sc291cmNlLGNhbnZhcyxzY3JpcHQsbm9zY3JpcHQsZGVsLGlucyxjYXB0aW9uLGNvbCxjb2xncm91cCx0YWJsZSx0aGVhZCx0Ym9keSx0ZCx0aCx0cixidXR0b24sZGF0YWxpc3QsZmllbGRzZXQsZm9ybSxpbnB1dCxsYWJlbCxsZWdlbmQsbWV0ZXIsb3B0Z3JvdXAsb3B0aW9uLG91dHB1dCxwcm9ncmVzcyxzZWxlY3QsdGV4dGFyZWEsZGV0YWlscyxkaWFsb2csbWVudSxtZW51aXRlbSxzdW1tYXJ5LGNvbnRlbnQsZWxlbWVudCxzaGFkb3csdGVtcGxhdGUsYmxvY2txdW90ZSxpZnJhbWUsdGZvb3QiKSxzKCJzdmcsYW5pbWF0ZSxjaXJjbGUsY2xpcHBhdGgsY3Vyc29yLGRlZnMsZGVzYyxlbGxpcHNlLGZpbHRlcixmb250LWZhY2UsZm9yZWlnbk9iamVjdCxnLGdseXBoLGltYWdlLGxpbmUsbWFya2VyLG1hc2ssbWlzc2luZy1nbHlwaCxwYXRoLHBhdHRlcm4scG9seWdvbixwb2x5bGluZSxyZWN0LHN3aXRjaCxzeW1ib2wsdGV4dCx0ZXh0cGF0aCx0c3Bhbix1c2UsdmlldyIsITApO3ZhciBrcj1zKCJ0ZXh0LG51bWJlcixwYXNzd29yZCxzZWFyY2gsZW1haWwsdGVsLHVybCIpLFNyPW5ldyBtZSgiIix7fSxbXSkseHI9WyJjcmVhdGUiLCJhY3RpdmF0ZSIsInVwZGF0ZSIsInJlbW92ZSIsImRlc3Ryb3kiXTtmdW5jdGlvbiBDcihlLHQpe3JldHVybiBlLmtleT09PXQua2V5JiYoZS50YWc9PT10LnRhZyYmZS5pc0NvbW1lbnQ9PT10LmlzQ29tbWVudCYmTChlLmRhdGEpPT09TCh0LmRhdGEpJiZmdW5jdGlvbihlLHQpe2lmKCJpbnB1dCIhPT1lLnRhZylyZXR1cm4hMDt2YXIgbixyPUwobj1lLmRhdGEpJiZMKG49bi5hdHRycykmJm4udHlwZSxpPUwobj10LmRhdGEpJiZMKG49bi5hdHRycykmJm4udHlwZTtyZXR1cm4gcj09PWl8fGtyKHIpJiZrcihpKX0oZSx0KXx8TihlLmlzQXN5bmNQbGFjZWhvbGRlcikmJmUuYXN5bmNGYWN0b3J5PT09dC5hc3luY0ZhY3RvcnkmJmoodC5hc3luY0ZhY3RvcnkuZXJyb3IpKX1mdW5jdGlvbiBUcihlLHQsbil7dmFyIHIsaSxvPXt9O2ZvcihyPXQ7cjw9bjsrK3IpTChpPWVbcl0ua2V5KSYmKG9baV09cik7cmV0dXJuIG99dmFyIE9yPXtjcmVhdGU6RXIsdXBkYXRlOkVyLGRlc3Ryb3k6ZnVuY3Rpb24oZSl7RXIoZSxTcil9fTtmdW5jdGlvbiBFcihlLHQpeyhlLmRhdGEuZGlyZWN0aXZlc3x8dC5kYXRhLmRpcmVjdGl2ZXMpJiZmdW5jdGlvbih0LG4pe3ZhciBlLHIsaSxvPXQ9PT1TcixhPW49PT1TcixzPUlyKHQuZGF0YS5kaXJlY3RpdmVzLHQuY29udGV4dCksYz1JcihuLmRhdGEuZGlyZWN0aXZlcyxuLmNvbnRleHQpLHU9W10sbD1bXTtmb3IoZSBpbiBjKXI9c1tlXSxpPWNbZV0scj8oaS5vbGRWYWx1ZT1yLnZhbHVlLGkub2xkQXJnPXIuYXJnLCRyKGksInVwZGF0ZSIsbix0KSxpLmRlZiYmaS5kZWYuY29tcG9uZW50VXBkYXRlZCYmbC5wdXNoKGkpKTooJHIoaSwiYmluZCIsbix0KSxpLmRlZiYmaS5kZWYuaW5zZXJ0ZWQmJnUucHVzaChpKSk7aWYodS5sZW5ndGgpe3ZhciBkPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTx1Lmxlbmd0aDtlKyspJHIodVtlXSwiaW5zZXJ0ZWQiLG4sdCl9O28/d3QobiwiaW5zZXJ0IixkKTpkKCl9bC5sZW5ndGgmJnd0KG4sInBvc3RwYXRjaCIsZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPGwubGVuZ3RoO2UrKykkcihsW2VdLCJjb21wb25lbnRVcGRhdGVkIixuLHQpfSk7aWYoIW8pZm9yKGUgaW4gcyljW2VdfHwkcihzW2VdLCJ1bmJpbmQiLHQsdCxhKX0oZSx0KX12YXIgQXI9T2JqZWN0LmNyZWF0ZShudWxsKTtmdW5jdGlvbiBJcihlLHQpe3ZhciBuLHIsaSxvPU9iamVjdC5jcmVhdGUobnVsbCk7aWYoIWUpcmV0dXJuIG87Zm9yKG49MDtuPGUubGVuZ3RoO24rKykocj1lW25dKS5tb2RpZmllcnN8fChyLm1vZGlmaWVycz1BciksKG9bKGk9cixpLnJhd05hbWV8fGkubmFtZSsiLiIrT2JqZWN0LmtleXMoaS5tb2RpZmllcnN8fHt9KS5qb2luKCIuIikpXT1yKS5kZWY9emUodC4kb3B0aW9ucywiZGlyZWN0aXZlcyIsci5uYW1lLCEwKTtyZXR1cm4gb31mdW5jdGlvbiAkcih0LG4scixlLGkpe3ZhciBvPXQuZGVmJiZ0LmRlZltuXTtpZihvKXRyeXtvKHIuZWxtLHQscixlLGkpfWNhdGNoKGUpe0plKGUsci5jb250ZXh0LCJkaXJlY3RpdmUgIit0Lm5hbWUrIiAiK24rIiBob29rIil9fWZ1bmN0aW9uIFByKGUsbil7aWYoIWooZS5kYXRhLnd4c1Byb3BzKXx8IWoobi5kYXRhLnd4c1Byb3BzKSl7dmFyIHI9ZS4kd3hzV2F0Y2hlcyx0PU9iamVjdC5rZXlzKG4uZGF0YS53eHNQcm9wcyk7aWYocnx8dC5sZW5ndGgpe3J8fChyPXt9KTt2YXIgaT1uLmRhdGEud3hzUHJvcHM7bi4kd3hzV2F0Y2hlcz17fSxPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWlbZV07bi4kd3hzV2F0Y2hlc1tlXT1yW2VdfHxuLmNvbnRleHQuJHdhdGNoKHQsZnVuY3Rpb24oKXt0aGlzLiRmb3JjZVVwZGF0ZSgpfSx7aW1tZWRpYXRlOiEwLGRlZXA6ITB9KX0pLE9iamVjdC5rZXlzKHIpLmZvckVhY2goZnVuY3Rpb24oZSl7bi4kd3hzV2F0Y2hlc1tlXXx8KHJbZV0oKSxkZWxldGUgcltlXSl9KX19fWZ1bmN0aW9uIE1yKGUsdCl7dmFyIG49dC5kYXRhLmF0dHJzO2lmKCFqKG4pJiYhaihuLl9pKSl7dmFyIHIsaSxvPXQuZWxtO28uZGF0YXNldD1PYmplY3QuYXNzaWduKG8uZGF0YXNldHx8e30sKHI9bixpPU9iamVjdC5jcmVhdGUobnVsbCksT2JqZWN0LmtleXMocikuZm9yRWFjaChmdW5jdGlvbih0KXtpZigwPT09dC5pbmRleE9mKCJkYXRhLSIpKXt2YXIgbj1nKHQucmVwbGFjZSgiZGF0YS0iLCIiKSk7dHJ5e2lbbl09SlNPTi5wYXJzZShyW3RdKX1jYXRjaChlKXtpW25dPXJbdF19fX0pLGkpKX19dmFyIGpyLExyPSJfX3IiLE5yPSJfX2MiO2Z1bmN0aW9uIEJyKHQsbixyKXt2YXIgaT1qcjtyZXR1cm4gZnVuY3Rpb24gZSgpe251bGwhPT1uLmFwcGx5KG51bGwsYXJndW1lbnRzKSYmUnIodCxlLHIsaSl9fWZ1bmN0aW9uIERyKGUsdCl7anIuYWRkRXZlbnRMaXN0ZW5lcihlLHQpfWZ1bmN0aW9uIFJyKGUsdCxuLHIpe3QmJihyfHxqcikucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHQuX3dyYXBwZXJ8fHQpfWZ1bmN0aW9uIEZyKGUsdCl7aWYoIWooZS5kYXRhLm9uKXx8IWoodC5kYXRhLm9uKSl7dmFyIG49dC5kYXRhLm9ufHx7fSxyPWUuZGF0YS5vbnx8e307KGpyPXQuZWxtKS5fJHZkPXQuY29udGV4dC5fJHZkO2Zvcih2YXIgaT10LmNvbnRleHQsbz0odC5kYXRhLmF0dHJzfHx7fSkuX2ksYT10LnBhcmVudDthJiZhLmNvbXBvbmVudEluc3RhbmNlOyl7dmFyIHM9YS5kYXRhLmF0dHJzJiZhLmRhdGEuYXR0cnMuX2k7TChzKSYmKG89InItIitzKSxhPWEucGFyZW50fWpyLnNldEF0dHJpYnV0ZSgibmlkIixTdHJpbmcobykpLGpyLnNldEF0dHJpYnV0ZSgiY2lkIixpLl8kaWQpLGZ1bmN0aW9uKGUpe0woZVtMcl0pJiYoZS5pbnB1dD1bXS5jb25jYXQoZVtMcl0sZS5pbnB1dHx8W10pLGRlbGV0ZSBlW0xyXSk7TChlW05yXSkmJihlLmNoYW5nZT1bXS5jb25jYXQoZVtOcl0sZS5jaGFuZ2V8fFtdKSxkZWxldGUgZVtOcl0pfShuKSxidChuLHIsRHIsUnIsQnIsdC5jb250ZXh0KSxqcj12b2lkIDB9fXZhciB6cj1mdW5jdGlvbihlKXt2YXIgcix0LGc9e30sbj1lLm1vZHVsZXMsbT1lLm5vZGVPcHM7Zm9yKHI9MDtyPHhyLmxlbmd0aDsrK3IpZm9yKGdbeHJbcl1dPVtdLHQ9MDt0PG4ubGVuZ3RoOysrdClMKG5bdF1beHJbcl1dKSYmZ1t4cltyXV0ucHVzaChuW3RdW3hyW3JdXSk7ZnVuY3Rpb24gbyhlKXt2YXIgdD1tLnBhcmVudE5vZGUoZSk7TCh0KSYmbS5yZW1vdmVDaGlsZCh0LGUpfWZ1bmN0aW9uIHkodCxlKXtyZXR1cm4hZSYmIXQubnMmJiEoei5pZ25vcmVkRWxlbWVudHMubGVuZ3RoJiZ6Lmlnbm9yZWRFbGVtZW50cy5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiBpKGUpP2UudGVzdCh0LnRhZyk6ZT09PXQudGFnfSkpJiZ6LmlzVW5rbm93bkVsZW1lbnQodC50YWcpfXZhciBsPTA7ZnVuY3Rpb24gXyhlLHQsbixyLGksbyxhKXtpZihMKGUuZWxtKSYmTChvKSYmKGU9b1thXT13ZShlKSksZS5pc1Jvb3RJbnNlcnQ9IWksIWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPWUuZGF0YTtpZihMKGkpKXt2YXIgbz1MKGUuY29tcG9uZW50SW5zdGFuY2UpJiZpLmtlZXBBbGl2ZTtpZihMKGk9aS5ob29rKSYmTChpPWkuaW5pdCkmJmkoZSwhMSksTChlLmNvbXBvbmVudEluc3RhbmNlKSlyZXR1cm4gYihlLHQpLGQobixlLmVsbSxyKSxOKG8pJiZmdW5jdGlvbihlLHQsbixyKXtmb3IodmFyIGksbz1lO28uY29tcG9uZW50SW5zdGFuY2U7KWlmKG89by5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUsTChpPW8uZGF0YSkmJkwoaT1pLnRyYW5zaXRpb24pKXtmb3IoaT0wO2k8Zy5hY3RpdmF0ZS5sZW5ndGg7KytpKWcuYWN0aXZhdGVbaV0oU3Isbyk7dC5wdXNoKG8pO2JyZWFrfWQobixlLmVsbSxyKX0oZSx0LG4sciksITB9fShlLHQsbixyKSl7dmFyIHM9ZS5kYXRhLGM9ZS5jaGlsZHJlbix1PWUudGFnO0wodSk/KHMmJnMucHJlJiZsKysseShlLGwpJiZzZSgiVW5rbm93biBjdXN0b20gZWxlbWVudDogPCIrdSsnPiAtIGRpZCB5b3UgcmVnaXN0ZXIgdGhlIGNvbXBvbmVudCBjb3JyZWN0bHk/IEZvciByZWN1cnNpdmUgY29tcG9uZW50cywgbWFrZSBzdXJlIHRvIHByb3ZpZGUgdGhlICJuYW1lIiBvcHRpb24uJyxlLmNvbnRleHQpLGUuZWxtPWUubnM/bS5jcmVhdGVFbGVtZW50TlMoZS5ucyx1KTptLmNyZWF0ZUVsZW1lbnQodSxlKSxmKGUpLHcoZSxjLHQpLEwocykmJlMoZSx0KSxkKG4sZS5lbG0scikscyYmcy5wcmUmJmwtLSk6KE4oZS5pc0NvbW1lbnQpP2UuZWxtPW0uY3JlYXRlQ29tbWVudChlLnRleHQpOmUuZWxtPW0uY3JlYXRlVGV4dE5vZGUoZS50ZXh0KSxkKG4sZS5lbG0scikpfX1mdW5jdGlvbiBiKGUsdCl7TChlLmRhdGEucGVuZGluZ0luc2VydCkmJih0LnB1c2guYXBwbHkodCxlLmRhdGEucGVuZGluZ0luc2VydCksZS5kYXRhLnBlbmRpbmdJbnNlcnQ9bnVsbCksZS5lbG09ZS5jb21wb25lbnRJbnN0YW5jZS4kZWwsayhlKT8oUyhlLHQpLGYoZSkpOih3cihlKSx0LnB1c2goZSkpfWZ1bmN0aW9uIGQoZSx0LG4pe0woZSkmJihMKG4pP20ucGFyZW50Tm9kZShuKT09PWUmJm0uaW5zZXJ0QmVmb3JlKGUsdCxuKTptLmFwcGVuZENoaWxkKGUsdCkpfWZ1bmN0aW9uIHcoZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkodCkpe08odCk7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDsrK3IpXyh0W3JdLG4sZS5lbG0sbnVsbCwhMCx0LHIpfWVsc2UgYyhlLnRleHQpJiZtLmFwcGVuZENoaWxkKGUuZWxtLG0uY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGUudGV4dCkpKX1mdW5jdGlvbiBrKGUpe2Zvcig7ZS5jb21wb25lbnRJbnN0YW5jZTspZT1lLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTtyZXR1cm4gTChlLnRhZyl9ZnVuY3Rpb24gUyhlLHQpe2Zvcih2YXIgbj0wO248Zy5jcmVhdGUubGVuZ3RoOysrbilnLmNyZWF0ZVtuXShTcixlKTtMKHI9ZS5kYXRhLmhvb2spJiYoTChyLmNyZWF0ZSkmJnIuY3JlYXRlKFNyLGUpLEwoci5pbnNlcnQpJiZ0LnB1c2goZSkpfWZ1bmN0aW9uIGYoZSl7dmFyIHQ7aWYoTCh0PWUuZm5TY29wZUlkKSltLnNldFN0eWxlU2NvcGUoZS5lbG0sdCk7ZWxzZSBmb3IodmFyIG49ZTtuOylMKHQ9bi5jb250ZXh0KSYmTCh0PXQuJG9wdGlvbnMuX3Njb3BlSWQpJiZtLnNldFN0eWxlU2NvcGUoZS5lbG0sdCksbj1uLnBhcmVudDtMKHQ9ZG4pJiZ0IT09ZS5jb250ZXh0JiZ0IT09ZS5mbkNvbnRleHQmJkwodD10LiRvcHRpb25zLl9zY29wZUlkKSYmbS5zZXRTdHlsZVNjb3BlKGUuZWxtLHQpfWZ1bmN0aW9uIHgoZSx0LG4scixpLG8pe2Zvcig7cjw9aTsrK3IpXyhuW3JdLG8sZSx0LCExLG4scil9ZnVuY3Rpb24gQyhlKXt2YXIgdCxuLHI9ZS5kYXRhO2lmKEwocikpZm9yKEwodD1yLmhvb2spJiZMKHQ9dC5kZXN0cm95KSYmdChlKSx0PTA7dDxnLmRlc3Ryb3kubGVuZ3RoOysrdClnLmRlc3Ryb3lbdF0oZSk7aWYoTCh0PWUuY2hpbGRyZW4pKWZvcihuPTA7bjxlLmNoaWxkcmVuLmxlbmd0aDsrK24pQyhlLmNoaWxkcmVuW25dKX1mdW5jdGlvbiBUKGUsdCxuKXtmb3IoO3Q8PW47Kyt0KXt2YXIgcj1lW3RdO0wocikmJihMKHIudGFnKT8oYShyKSxDKHIpKTpvKHIuZWxtKSl9fWZ1bmN0aW9uIGEoZSx0KXtpZihMKHQpfHxMKGUuZGF0YSkpe3ZhciBuLHIsaT1nLnJlbW92ZS5sZW5ndGgrMTtpZihMKHQpP3QubGlzdGVuZXJzKz1pOnQ9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKCl7MD09LS1uLmxpc3RlbmVycyYmbyhlKX1yZXR1cm4gbi5saXN0ZW5lcnM9dCxufShlLmVsbSxpKSxMKG49ZS5jb21wb25lbnRJbnN0YW5jZSkmJkwobj1uLl92bm9kZSkmJkwobi5kYXRhKSlhKG4sdCk7ZWxzZSBpZihMKHI9ZS5jaGlsZHJlbikpZm9yKG49MDtuPHIubGVuZ3RoO24rKylyW25dLnRhZyYmYShyW25dKTtmb3Iobj0wO248Zy5yZW1vdmUubGVuZ3RoOysrbilnLnJlbW92ZVtuXShlLHQpO0wobj1lLmRhdGEuaG9vaykmJkwobj1uLnJlbW92ZSk/bihlLHQpOnQoKX1lbHNlIG8oZS5lbG0pfWZ1bmN0aW9uIE8oZSl7Zm9yKHZhciB0PXt9LG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXSxpPXIua2V5O0woaSkmJih0W2ldP3NlKCJEdXBsaWNhdGUga2V5cyBkZXRlY3RlZDogJyIraSsiJy4gVGhpcyBtYXkgY2F1c2UgYW4gdXBkYXRlIGVycm9yLiIsci5jb250ZXh0KTp0W2ldPSEwKX19ZnVuY3Rpb24gRShlLHQsbixyKXtmb3IodmFyIGk9bjtpPHI7aSsrKXt2YXIgbz10W2ldO2lmKEwobykmJkNyKGUsbykpcmV0dXJuIGl9fWZ1bmN0aW9uIEEoZSx0LG4scixpLG8pe2lmKGUhPT10KXtMKHQuZWxtKSYmTChyKSYmKHQ9cltpXT13ZSh0KSk7dmFyIGE9dC5lbG09ZS5lbG07aWYoTihlLmlzQXN5bmNQbGFjZWhvbGRlcikpTCh0LmFzeW5jRmFjdG9yeS5yZXNvbHZlZCk/TShlLmVsbSx0LG4pOnQuaXNBc3luY1BsYWNlaG9sZGVyPSEwO2Vsc2UgaWYoTih0LmlzU3RhdGljKSYmTihlLmlzU3RhdGljKSYmdC5rZXk9PT1lLmtleSYmKE4odC5pc0Nsb25lZCl8fE4odC5pc09uY2UpKSl0LmNvbXBvbmVudEluc3RhbmNlPWUuY29tcG9uZW50SW5zdGFuY2U7ZWxzZXt2YXIgcyxjPXQuZGF0YTtMKGMpJiZMKHM9Yy5ob29rKSYmTChzPXMucHJlcGF0Y2gpJiZzKGUsdCk7dmFyIHU9ZS5jaGlsZHJlbixsPXQuY2hpbGRyZW47aWYoTChjKSYmayh0KSl7Zm9yKHM9MDtzPGcudXBkYXRlLmxlbmd0aDsrK3MpZy51cGRhdGVbc10oZSx0KTtMKHM9Yy5ob29rKSYmTChzPXMudXBkYXRlKSYmcyhlLHQpfWoodC50ZXh0KT9MKHUpJiZMKGwpP3UhPT1sJiZmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvLGEscyxjPTAsdT0wLGw9dC5sZW5ndGgtMSxkPXRbMF0sZj10W2xdLHA9bi5sZW5ndGgtMSxoPW5bMF0sdj1uW3BdLGc9IWk7Zm9yKE8obik7Yzw9bCYmdTw9cDspaihkKT9kPXRbKytjXTpqKGYpP2Y9dFstLWxdOkNyKGQsaCk/KEEoZCxoLHIsbix1KSxkPXRbKytjXSxoPW5bKyt1XSk6Q3IoZix2KT8oQShmLHYscixuLHApLGY9dFstLWxdLHY9blstLXBdKTpDcihkLHYpPyhBKGQsdixyLG4scCksZyYmbS5pbnNlcnRCZWZvcmUoZSxkLmVsbSxtLm5leHRTaWJsaW5nKGYuZWxtKSksZD10WysrY10sdj1uWy0tcF0pOihDcihmLGgpPyhBKGYsaCxyLG4sdSksZyYmbS5pbnNlcnRCZWZvcmUoZSxmLmVsbSxkLmVsbSksZj10Wy0tbF0pOihqKG8pJiYobz1Ucih0LGMsbCkpLGooYT1MKGgua2V5KT9vW2gua2V5XTpFKGgsdCxjLGwpKT9fKGgscixlLGQuZWxtLCExLG4sdSk6Q3Iocz10W2FdLGgpPyhBKHMsaCxyLG4sdSksdFthXT12b2lkIDAsZyYmbS5pbnNlcnRCZWZvcmUoZSxzLmVsbSxkLmVsbSkpOl8oaCxyLGUsZC5lbG0sITEsbix1KSksaD1uWysrdV0pO2w8Yz94KGUsaihuW3ArMV0pP251bGw6bltwKzFdLmVsbSxuLHUscCxyKTpwPHUmJlQodCxjLGwpfShhLHUsbCxuLG8pOkwobCk/KE8obCksTChlLnRleHQpJiZtLnNldFRleHRDb250ZW50KGEsIiIpLHgoYSxudWxsLGwsMCxsLmxlbmd0aC0xLG4pKTpMKHUpP1QodSwwLHUubGVuZ3RoLTEpOkwoZS50ZXh0KSYmbS5zZXRUZXh0Q29udGVudChhLCIiKTplLnRleHQhPT10LnRleHQmJm0uc2V0VGV4dENvbnRlbnQoYSx0LnRleHQpLEwoYykmJkwocz1jLmhvb2spJiZMKHM9cy5wb3N0cGF0Y2gpJiZzKGUsdCl9fX1mdW5jdGlvbiBJKGUsdCxuKXtpZihOKG4pJiZMKGUucGFyZW50KSllLnBhcmVudC5kYXRhLnBlbmRpbmdJbnNlcnQ9dDtlbHNlIGZvcih2YXIgcj0wO3I8dC5sZW5ndGg7KytyKXRbcl0uZGF0YS5ob29rLmluc2VydCh0W3JdKX12YXIgJD0hMSxQPXMoImF0dHJzLGNsYXNzLHN0YXRpY0NsYXNzLHN0YXRpY1N0eWxlLGtleSIpO2Z1bmN0aW9uIE0oZSx0LG4scil7dmFyIGksbyxhLHMsYz10LnRhZyx1PXQuZGF0YSxsPXQuY2hpbGRyZW47aWYocj1yfHx1JiZ1LnByZSx0LmVsbT1lLE4odC5pc0NvbW1lbnQpJiZMKHQuYXN5bmNGYWN0b3J5KSlyZXR1cm4gdC5pc0FzeW5jUGxhY2Vob2xkZXI9ITA7aWYobz1lLHM9ciwhKEwoKGE9dCkudGFnKT8wPT09YS50YWcuaW5kZXhPZigidnVlLWNvbXBvbmVudCIpfHwheShhLHMpJiZhLnRhZy50b0xvd2VyQ2FzZSgpPT09KG8udGFnTmFtZSYmby50YWdOYW1lLnRvTG93ZXJDYXNlKCkpOm8ubm9kZVR5cGU9PT0oYS5pc0NvbW1lbnQ/ODozKSkpcmV0dXJuITE7aWYoTCh1KSYmKEwoaT11Lmhvb2spJiZMKGk9aS5pbml0KSYmaSh0LCEwKSxMKGk9dC5jb21wb25lbnRJbnN0YW5jZSkpKXJldHVybiBiKHQsbiksITA7aWYoTChjKSl7aWYoTChsKSlpZihlLmhhc0NoaWxkTm9kZXMoKSlpZihMKGk9dSkmJkwoaT1pLmRvbVByb3BzKSYmTChpPWkuaW5uZXJIVE1MKSl7aWYoaSE9PWUuaW5uZXJIVE1MKXJldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgY29uc29sZXx8JHx8KCQ9ITAsY29uc29sZS53YXJuKCJQYXJlbnQ6ICIsZSksY29uc29sZS53YXJuKCJzZXJ2ZXIgaW5uZXJIVE1MOiAiLGkpLGNvbnNvbGUud2FybigiY2xpZW50IGlubmVySFRNTDogIixlLmlubmVySFRNTCkpLCExfWVsc2V7Zm9yKHZhciBkPSEwLGY9ZS5maXJzdENoaWxkLHA9MDtwPGwubGVuZ3RoO3ArKyl7aWYoIWZ8fCFNKGYsbFtwXSxuLHIpKXtkPSExO2JyZWFrfWY9Zi5uZXh0U2libGluZ31pZighZHx8ZilyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIGNvbnNvbGV8fCR8fCgkPSEwLGNvbnNvbGUud2FybigiUGFyZW50OiAiLGUpLGNvbnNvbGUud2FybigiTWlzbWF0Y2hpbmcgY2hpbGROb2RlcyB2cy4gVk5vZGVzOiAiLGUuY2hpbGROb2RlcyxsKSksITF9ZWxzZSB3KHQsbCxuKTtpZihMKHUpKXt2YXIgaD0hMTtmb3IodmFyIHYgaW4gdSlpZighUCh2KSl7aD0hMCxTKHQsbik7YnJlYWt9IWgmJnUuY2xhc3MmJmd0KHUuY2xhc3MpfX1lbHNlIGUuZGF0YSE9PXQudGV4dCYmKGUuZGF0YT10LnRleHQpO3JldHVybiEwfXJldHVybiBmdW5jdGlvbihlLHQsbixyKXtpZighaih0KSl7dmFyIGksbz0hMSxhPVtdO2lmKGooZSkpbz0hMCxfKHQsYSk7ZWxzZXt2YXIgcz1MKGUubm9kZVR5cGUpO2lmKCFzJiZDcihlLHQpKUEoZSx0LGEsbnVsbCxudWxsLHIpO2Vsc2V7aWYocyl7aWYoMT09PWUubm9kZVR5cGUmJmUuaGFzQXR0cmlidXRlKEQpJiYoZS5yZW1vdmVBdHRyaWJ1dGUoRCksbj0hMCksTihuKSl7aWYoTShlLHQsYSkpcmV0dXJuIEkodCxhLCEwKSxlO3NlKCJUaGUgY2xpZW50LXNpZGUgcmVuZGVyZWQgdmlydHVhbCBET00gdHJlZSBpcyBub3QgbWF0Y2hpbmcgc2VydmVyLXJlbmRlcmVkIGNvbnRlbnQuIFRoaXMgaXMgbGlrZWx5IGNhdXNlZCBieSBpbmNvcnJlY3QgSFRNTCBtYXJrdXAsIGZvciBleGFtcGxlIG5lc3RpbmcgYmxvY2stbGV2ZWwgZWxlbWVudHMgaW5zaWRlIDxwPiwgb3IgbWlzc2luZyA8dGJvZHk+LiBCYWlsaW5nIGh5ZHJhdGlvbiBhbmQgcGVyZm9ybWluZyBmdWxsIGNsaWVudC1zaWRlIHJlbmRlci4iKX1pPWUsZT1uZXcgbWUobS50YWdOYW1lKGkpLnRvTG93ZXJDYXNlKCkse30sW10sdm9pZCAwLGkpfXZhciBjPWUuZWxtLHU9bS5wYXJlbnROb2RlKGMpO2lmKF8odCxhLGMuX2xlYXZlQ2I/bnVsbDp1LG0ubmV4dFNpYmxpbmcoYykpLEwodC5wYXJlbnQpKWZvcih2YXIgbD10LnBhcmVudCxkPWsodCk7bDspe2Zvcih2YXIgZj0wO2Y8Zy5kZXN0cm95Lmxlbmd0aDsrK2YpZy5kZXN0cm95W2ZdKGwpO2lmKGwuZWxtPXQuZWxtLGQpe2Zvcih2YXIgcD0wO3A8Zy5jcmVhdGUubGVuZ3RoOysrcClnLmNyZWF0ZVtwXShTcixsKTt2YXIgaD1sLmRhdGEuaG9vay5pbnNlcnQ7aWYoaC5tZXJnZWQpZm9yKHZhciB2PTE7djxoLmZucy5sZW5ndGg7disrKWguZm5zW3ZdKCl9ZWxzZSB3cihsKTtsPWwucGFyZW50fUwodSk/VChbZV0sMCwwKTpMKGUudGFnKSYmQyhlKX19cmV0dXJuIEkodCxhLG8pLHQuZWxtfUwoZSkmJkMoZSl9fSh7bm9kZU9wczpfcixtb2R1bGVzOlt7Y3JlYXRlOlByLHVwZGF0ZTpQcn0se2NyZWF0ZTpNcix1cGRhdGU6TXJ9LHtjcmVhdGU6RnIsdXBkYXRlOkZyfV0uY29uY2F0KFticixPcl0pfSksVnI9e21vZGVsOnt9LHNob3c6e319O2Z1bmN0aW9uIFVyKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPSIiLHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspTCh0PVVyKGVbcl0pKSYmIiIhPT10JiYobiYmKG4rPSIgIiksbis9dCk7cmV0dXJuIG59KGUpOnkoZSk/ZnVuY3Rpb24oZSl7dmFyIHQ9IiI7Zm9yKHZhciBuIGluIGUpZVtuXSYmKHQmJih0Kz0iICIpLHQrPW4pO3JldHVybiB0fShlKToic3RyaW5nIj09dHlwZW9mIGU/ZToiIn12YXIgcXI9aChmdW5jdGlvbihlKXt2YXIgbj17fSxyPS86KC4rKS87cmV0dXJuIGUuc3BsaXQoLzsoPyFbXihdKlwpKS9nKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PWUuc3BsaXQocik7MTx0Lmxlbmd0aCYmKG5bdFswXS50cmltKCldPXRbMV0udHJpbSgpKX19KSxufSk7ZnVuY3Rpb24gV3IoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/RShlKToic3RyaW5nIj09dHlwZW9mIGU/cXIoZSk6ZX1mdW5jdGlvbiBIcihlLHQpe3ZlKCk7dmFyIG4scj10aGlzLiRvcHRpb25zW2VdLGk9ZSsiIGhvb2siO2lmKHIpZm9yKHZhciBvPTAsYT1yLmxlbmd0aDtvPGE7bysrKW49S2UocltvXSx0aGlzLHQ/W3RdOm51bGwsdGhpcyxpKTtyZXR1cm4gdGhpcy5faGFzSG9va0V2ZW50JiZ0aGlzLiRlbWl0KCJob29rOiIrZSx0KSxnZSgpLG59dmFyIEdyPXtpbnN0YWxsOmZ1bmN0aW9uKGUpe2UucHJvdG90eXBlLl8kcXVldWU9bW4sZS5wcm90b3R5cGUuX19jYWxsX2hvb2s9SHIsZS5wcm90b3R5cGUuXyRzdHJpbmdpZnlDbGFzcz1VcixlLnByb3RvdHlwZS5fJG5vcm1hbGl6ZVN0eWxlQmluZGluZz1Xcn19O0huLmNvbmZpZy5tdXN0VXNlUHJvcD1mdW5jdGlvbigpe3JldHVybiExfSxIbi5jb25maWcuaXNSZXNlcnZlZFRhZz15cixIbi5jb25maWcuaXNSZXNlcnZlZEF0dHI9bXIsSG4uY29uZmlnLmdldFRhZ05hbWVzcGFjZT1mdW5jdGlvbigpe30sSG4uY29uZmlnLmlzVW5rbm93bkVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sTyhIbi5vcHRpb25zLmRpcmVjdGl2ZXMsVnIpLE8oSG4ub3B0aW9ucy5jb21wb25lbnRzLHt9KSxIbi5wcm90b3R5cGUuX19wYXRjaF9fPXpyLEhuLnByb3RvdHlwZS4kbW91bnQ9ZnVuY3Rpb24oZSx0KXtpZigicGFnZSI9PT10aGlzLiRvcHRpb25zLm1wVHlwZSl7dmFyIG49bmV3IGdyKHRoaXMuJG9wdGlvbnMucGFnZUlkLHRoaXMuJG9wdGlvbnMucGFnZVBhdGgpOyhlPW4uY3JlYXRlQ29tbWVudCgicm9vdCIpKS5oYXNBdHRyaWJ1dGU9ZS5yZW1vdmVBdHRyaWJ1dGU9ZnVuY3Rpb24oKXt9LG4uZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKGUpfXJldHVybiByPWUsYT10LChvPXRoaXMpLiRlbD1yLG8uJG9wdGlvbnMucmVuZGVyfHwoby4kb3B0aW9ucy5yZW5kZXI9X2Usby4kb3B0aW9ucy50ZW1wbGF0ZSYmIiMiIT09by4kb3B0aW9ucy50ZW1wbGF0ZS5jaGFyQXQoMCl8fG8uJG9wdGlvbnMuZWx8fHI/c2UoIllvdSBhcmUgdXNpbmcgdGhlIHJ1bnRpbWUtb25seSBidWlsZCBvZiBWdWUgd2hlcmUgdGhlIHRlbXBsYXRlIGNvbXBpbGVyIGlzIG5vdCBhdmFpbGFibGUuIEVpdGhlciBwcmUtY29tcGlsZSB0aGUgdGVtcGxhdGVzIGludG8gcmVuZGVyIGZ1bmN0aW9ucywgb3IgdXNlIHRoZSBjb21waWxlci1pbmNsdWRlZCBidWlsZC4iLG8pOnNlKCJGYWlsZWQgdG8gbW91bnQgY29tcG9uZW50OiB0ZW1wbGF0ZSBvciByZW5kZXIgZnVuY3Rpb24gbm90IGRlZmluZWQuIixvKSksdm4obywiYmVmb3JlTW91bnQiKSxpPXoucGVyZm9ybWFuY2UmJnB0P2Z1bmN0aW9uKCl7dmFyIGU9by5fbmFtZSx0PW8uX3VpZCxuPSJ2dWUtcGVyZi1zdGFydDoiK3Qscj0idnVlLXBlcmYtZW5kOiIrdDtwdChuKTt2YXIgaT1vLl9yZW5kZXIoKTtwdChyKSxodCgidnVlICIrZSsiIHJlbmRlciIsbixyKSxwdChuKSxvLl91cGRhdGUoaSxhKSxwdChyKSxodCgidnVlICIrZSsiIHBhdGNoIixuLHIpfTpmdW5jdGlvbigpe28uX3VwZGF0ZShvLl9yZW5kZXIoKSxhKX0sbmV3IEVuKG8saSxBLHtiZWZvcmU6ZnVuY3Rpb24oKXtvLl9pc01vdW50ZWQmJiFvLl9pc0Rlc3Ryb3llZCYmdm4obywiYmVmb3JlVXBkYXRlIil9fSwhMCksYT0hMSxudWxsPT1vLiR2bm9kZSYmKG8uX2lzTW91bnRlZD0hMCxvLl8kdmQ/KHZuKG8sIm9uU2VydmljZUNyZWF0ZWQiKSx2bihvLCJvblNlcnZpY2VBdHRhY2hlZCIpLG8uXyR2ZC5hZGRNb3VudGVkVm0obykpOnZuKG8sIm1vdW50ZWQiKSksbzt2YXIgbyxyLGEsaX0sSG4udXNlKEdyKSxlLlZ1ZT1Ibn12YXIgaXNGaXJzdD0hMCxmcmFtZXdvcmtzLHJ1bnRpbWVDb25maWc7ZnVuY3Rpb24gaW5pdCQyKGUpe2lmKGUuX191bmlDb25maWcpe3ZhciB0PWUud2VleDtpc0ZpcnN0JiYoZ2xvYmFsLldYRW52aXJvbm1lbnQuZGV2aWNlV2lkdGg9dC5jb25maWcuZW52LmRldmljZVdpZHRoKTt2YXIgbj1lLl9fdW5pQ29uZmlnLHI9IndlZXgiPT09bi5udnVlQ29tcGlsZXI7dC5kb2N1bWVudC5fXyRhdXRvbWF0b3JfXz0hIW4uYXV0b21hdG9yLHQuZG9jdW1lbnQuX18kY29tcGlsZXJfXz1yPyJ3ZWV4IjoidW5pLWFwcCIsdC5kb2N1bWVudC5fXyRzdHlsZUNvbXBpbGVyX189IndlZXgiPT09bi5udnVlU3R5bGVDb21waWxlcj8id2VleCI6InVuaS1hcHAiLGdsb2JhbC5XWEVudmlyb25tZW50LmR5bmFtaWNScHg9ISghbi53aW5kb3d8fCFuLndpbmRvdy5keW5hbWljUnB4KTt2YXIgaT0ibmF0aXZlIiE9PW4ucmVuZGVyZXImJi0xIT09dC5jb25maWcuYnVuZGxlVXJsLmluZGV4T2YoImFwcC1zZXJ2aWNlLmpzIik7aWYoaSl7dmFyIG89e307dnVlRmFjdG9yeShvLGUuU2hhcmVkT2JqZWN0KSxlLlZ1ZT1vLlZ1ZX1pZihPYmplY3QuYXNzaWduKGUsY3JlYXRlSW5zdGFuY2VDb250ZXh0JDEoZSkpLGkmJmUuVnVlLnVzZShlLl9fdnVlUGx1Z2luKSxkZWxldGUgZS5fX3Z1ZVBsdWdpbiwhcil7dmFyIGE9ZS5wbHVzO2lmKCJpb3MiPT09Z2xvYmFsLldYRW52aXJvbm1lbnQucGxhdGZvcm0udG9Mb3dlckNhc2UoKSl7dmFyIHM9YS5zY3JlZW47Z2xvYmFsLldYRW52aXJvbm1lbnQuZGV2aWNlV2lkdGg9cy53aWR0aCxnbG9iYWwuV1hFbnZpcm9ubWVudC5kZXZpY2VIZWlnaHQ9cy5oZWlnaHR9dmFyIGM9Z2xvYmFsLldYRW52aXJvbm1lbnQsdT1jLnNjYWxlLGw9Yy5kZXZpY2VXaWR0aCxkPWMucGxhdGZvcm0sZj1NYXRoLmNlaWwobC91KSxwPXQucmVxdWlyZU1vZHVsZSgibWV0YSIpO2lmKCIxIj09PXQuY29uZmlnLnBsdXNfd2ViX2lkKXt2YXIgaD10LnJlcXVpcmVNb2R1bGUoInBsdXMiKTtoLnNldERlZmF1bHRGb250U2l6ZSYmaC5zZXREZWZhdWx0Rm9udFNpemUoMTYpfSJpb3MiPT09ZC50b0xvd2VyQ2FzZSgpJiZwLnNldFZpZXdwb3J0KHt3aWR0aDpmLHJvdW5kT2ZmRGV2aWF0aW9uOiExfSl9aXx8ZS5WdWUudXNlKHVuaUFwcCxlKX19ZnVuY3Rpb24gZ2V0SlNGTVZlcnNpb24oKXtyZXR1cm4iMC4yOS42In1mdW5jdGlvbiBjcmVhdGVTZXJ2aWNlcyhpLG8sYSl7dmFyIHM9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gcy5zZXJ2aWNlPU9iamVjdC5jcmVhdGUobnVsbCksc2VydmljZXMuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLm5hbWUsbj1lLm9wdGlvbnMuY3JlYXRlO2lmKG4pdHJ5e3ZhciByPW4oaSxvLGEpO09iamVjdC5hc3NpZ24ocy5zZXJ2aWNlLHIpLE9iamVjdC5hc3NpZ24ocyxyLmluc3RhbmNlKX1jYXRjaChlKXtjb25zb2xlLmVycm9yKCJbSlMgUnVudGltZV0gRmFpbGVkIHRvIGNyZWF0ZSBzZXJ2aWNlICIrdCsiLiIpfX0pLGRlbGV0ZSBzLnNlcnZpY2UuaW5zdGFuY2UsT2JqZWN0LmZyZWV6ZShzLnNlcnZpY2UpLHN9dmFyIGluc3RhbmNlVHlwZU1hcD17fTtmdW5jdGlvbiBnZXRGcmFtZXdvcmtUeXBlKGUpe3JldHVybiBpbnN0YW5jZVR5cGVNYXBbZV19dmFyIFNoYXJlZE9iamVjdD17dWlkOjB9O2Z1bmN0aW9uIGNyZWF0ZUluc3RhbmNlQ29udGV4dChlLHQsbil7dm9pZCAwPT09dCYmKHQ9e30pO3ZhciByPW5ldyBXZWV4SW5zdGFuY2UoZSx0LG4pO2luc3RhbmNlVHlwZU1hcFtlXT0iVnVlIjt2YXIgaT1ydW50aW1lQ29uZmlnLmZyYW1ld29ya3MuVnVlO2lmKCFpKXJldHVybiBuZXcgRXJyb3IoJ1tKUyBGcmFtZXdvcmtdIEludmFsaWQgYnVuZGxlIHR5cGUgIlZ1ZSIuJyk7dmFyIG89Y3JlYXRlU2VydmljZXMoZSx7d2VleDpyLGNvbmZpZzp0LGNyZWF0ZWQ6RGF0ZS5ub3coKSxmcmFtZXdvcms6IlZ1ZSIsYnVuZGxlVHlwZToiVnVlIn0scnVudGltZUNvbmZpZyk7T2JqZWN0LmZyZWV6ZShvKTt2YXIgYT1PYmplY3QuY3JlYXRlKG51bGwpO09iamVjdC5hc3NpZ24oYSxvLHtTaGFyZWRPYmplY3Q6U2hhcmVkT2JqZWN0LHdlZXg6cixnZXRKU0ZNVmVyc2lvbjpnZXRKU0ZNVmVyc2lvbixyZXF1aXJlTW9kdWxlOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3JldHVybiByLnJlcXVpcmVNb2R1bGUuYXBwbHkocixlKX0sX19XRUVYX0NBTExfSkFWQVNDUklQVF9fOnJlY2VpdmVUYXNrcyxzZXJ2aWNlczpvfSksT2JqZWN0LmZyZWV6ZShhKTt2YXIgcz1PYmplY3QuYXNzaWduKHt9LGEpO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBpLmNyZWF0ZUluc3RhbmNlQ29udGV4dCYmT2JqZWN0LmFzc2lnbihzLGkuY3JlYXRlSW5zdGFuY2VDb250ZXh0KGUsYSxuKSksaW5pdCQyKHMpLE9iamVjdC5mcmVlemUocyksc31mdW5jdGlvbiBjcmVhdGVJbnN0YW5jZShlLHQsbixyKXtpZihpbnN0YW5jZVR5cGVNYXBbZV0pcmV0dXJuIG5ldyBFcnJvcignVGhlIGluc3RhbmNlIGlkICInK2UrJyIgaGFzIGFscmVhZHkgYmVlbiB1c2VkIScpO3ZhciBpPSJWdWUiO2luc3RhbmNlVHlwZU1hcFtlXT1pLChuPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobnx8e30pKSkuZW52PUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZ2xvYmFsLldYRW52aXJvbm1lbnR8fHt9KSksbi5idW5kbGVUeXBlPWk7dmFyIG89cnVudGltZUNvbmZpZy5mcmFtZXdvcmtzLlZ1ZTtpZighbylyZXR1cm4gbmV3IEVycm9yKCdbSlMgRnJhbWV3b3JrXSBJbnZhbGlkIGJ1bmRsZSB0eXBlICJWdWUiLicpO3ZhciBhPWNyZWF0ZUluc3RhbmNlQ29udGV4dChlLG4scik7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG8uY3JlYXRlSW5zdGFuY2UpcmV0dXJuIG8uY3JlYXRlSW5zdGFuY2UoZSx0LG4scixhKTtydW5JbkNvbnRleHQodCxhKX1mdW5jdGlvbiBydW5JbkNvbnRleHQoZSx0KXt2YXIgbj1bXSxyPVtdO2Zvcih2YXIgaSBpbiB0KW4ucHVzaChpKSxyLnB1c2godFtpXSk7dmFyIG89IlxuICAgIChmdW5jdGlvbiAoZ2xvYmFsKSB7XG4gICAgICAiK2UrIlxuICAgIH0pKE9iamVjdC5jcmVhdGUodGhpcykpXG4gICI7cmV0dXJuKG5ldyhGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseShGdW5jdGlvbixbbnVsbF0uY29uY2F0KG4sW29dKSkpKS5hcHBseSh2b2lkIDAscil9ZnVuY3Rpb24gZ2V0Um9vdChlKXt2YXIgdD1nZXREb2MoZSk7dHJ5e2lmKHQmJnQuYm9keSlyZXR1cm4gdC5ib2R5LnRvSlNPTigpfWNhdGNoKGUpe3JldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIltKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBnZXQgdGhlIHZpcnR1YWwgZG9tIHRyZWUuIil9fXZhciBtZXRob2RzPXtjcmVhdGVJbnN0YW5jZTpjcmVhdGVJbnN0YW5jZSxjcmVhdGVJbnN0YW5jZUNvbnRleHQ6Y3JlYXRlSW5zdGFuY2VDb250ZXh0LGdldFJvb3Q6Z2V0Um9vdCxnZXRKU0ZNVmVyc2lvbjpnZXRKU0ZNVmVyc2lvbixnZXREb2N1bWVudDpnZXREb2MscmVnaXN0ZXJTZXJ2aWNlOnJlZ2lzdGVyLHVucmVnaXN0ZXJTZXJ2aWNlOnVucmVnaXN0ZXIsY2FsbEpTOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZnJhbWV3b3Jrc1tnZXRGcmFtZXdvcmtUeXBlKGUpXTtyZXR1cm4gbiYmImZ1bmN0aW9uIj09dHlwZW9mIG4ucmVjZWl2ZVRhc2tzP24ucmVjZWl2ZVRhc2tzKGUsdCk6cmVjZWl2ZVRhc2tzKGUsdCl9fTtmdW5jdGlvbiBnZW5JbnN0YW5jZShzKXttZXRob2RzW3NdPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3ZhciBuLHI9ZVswXSxpPWdldEZyYW1ld29ya1R5cGUocik7aWYoaSYmZnJhbWV3b3Jrc1tpXSl7dmFyIG89KG49ZnJhbWV3b3Jrc1tpXSlbc10uYXBwbHkobixlKSxhPXtmcmFtZXdvcms6aX07cmV0dXJuInJlZnJlc2hJbnN0YW5jZSI9PT1zP3NlcnZpY2VzLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vcHRpb25zLnJlZnJlc2g7dCYmdChyLHtpbmZvOmEscnVudGltZTpydW50aW1lQ29uZmlnfSl9KToiZGVzdHJveUluc3RhbmNlIj09PXMmJihzZXJ2aWNlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUub3B0aW9ucy5kZXN0cm95O3QmJnQocix7aW5mbzphLHJ1bnRpbWU6cnVudGltZUNvbmZpZ30pfSksZGVsZXRlIGluc3RhbmNlVHlwZU1hcFtyXSksb319fWZ1bmN0aW9uIGFkYXB0TWV0aG9kKGksbyl7bWV0aG9kc1tpXT1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtmb3IodmFyIG4gaW4iZnVuY3Rpb24iPT10eXBlb2YgbyYmby5hcHBseSh2b2lkIDAsZSkscnVudGltZUNvbmZpZy5mcmFtZXdvcmtzKXt2YXIgcj1ydW50aW1lQ29uZmlnLmZyYW1ld29ya3Nbbl07ciYmcltpXSYmcltpXS5hcHBseShyLGUpfX19ZnVuY3Rpb24gaW5pdCQkMShlKXtmb3IodmFyIHQgaW4gZnJhbWV3b3Jrcz0ocnVudGltZUNvbmZpZz1lfHx7fSkuZnJhbWV3b3Jrc3x8e30saW5pdCQxKCksZnJhbWV3b3Jrcyl7dmFyIG49ZnJhbWV3b3Jrc1t0XTtpZigiZnVuY3Rpb24iPT10eXBlb2Ygbi5pbml0KXRyeXtuLmluaXQoZSl9Y2F0Y2goZSl7fX1yZXR1cm4gYWRhcHRNZXRob2QoInJlZ2lzdGVyQ29tcG9uZW50cyIscmVnaXN0ZXJDb21wb25lbnRzKSxhZGFwdE1ldGhvZCgicmVnaXN0ZXJNb2R1bGVzIixyZWdpc3Rlck1vZHVsZXMpLGFkYXB0TWV0aG9kKCJyZWdpc3Rlck1ldGhvZHMiKSxbImRlc3Ryb3lJbnN0YW5jZSIsInJlZnJlc2hJbnN0YW5jZSJdLmZvckVhY2goZ2VuSW5zdGFuY2UpLG1ldGhvZHN9dmFyIGNvbmZpZz17RG9jdW1lbnQ6RG9jdW1lbnQsRWxlbWVudDpFbGVtZW50LENvbW1lbnQ6Q29tbWVudCxMaXN0ZW5lcjpMaXN0ZW5lcixUYXNrQ2VudGVyOlRhc2tDZW50ZXIsc2VuZFRhc2tzOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBjYWxsTmF0aXZlP2NhbGxOYXRpdmUuYXBwbHkodm9pZCAwLGUpOihnbG9iYWwuY2FsbE5hdGl2ZXx8ZnVuY3Rpb24oKXt9KS5hcHBseSh2b2lkIDAsZSl9fTtmdW5jdGlvbiBmcmVlemVQcm90b3R5cGUoKXtPYmplY3QuZnJlZXplKGNvbmZpZy5Db21tZW50KSxPYmplY3QuZnJlZXplKGNvbmZpZy5MaXN0ZW5lciksT2JqZWN0LmZyZWV6ZShjb25maWcuRG9jdW1lbnQucHJvdG90eXBlKSxPYmplY3QuZnJlZXplKGNvbmZpZy5Db21tZW50LnByb3RvdHlwZSksT2JqZWN0LmZyZWV6ZShjb25maWcuTGlzdGVuZXIucHJvdG90eXBlKX1Eb2N1bWVudC5oYW5kbGVyPWNvbmZpZy5zZW5kVGFza3M7dmFyIHJ1bnRpbWU9e3NlcnZpY2U6e3JlZ2lzdGVyOnJlZ2lzdGVyLHVucmVnaXN0ZXI6dW5yZWdpc3RlcixoYXM6aGFzfSxmcmVlemVQcm90b3R5cGU6ZnJlZXplUHJvdG90eXBlLGluaXQ6aW5pdCQkMSxjb25maWc6Y29uZmlnfTtmdW5jdGlvbiBNZXNzYWdlRXZlbnQoZSx0KXt2b2lkIDA9PT10JiYodD17fSksdGhpcy50eXBlPWV8fCJtZXNzYWdlIix0aGlzLmRhdGE9dC5kYXRhfHxudWxsLHRoaXMub3JpZ2luPXQub3JpZ2lufHwiIix0aGlzLnNvdXJjZT10LnNvdXJjZXx8bnVsbCx0aGlzLnBvcnRzPXQucG9ydHN8fFtdLHRoaXMudGFyZ2V0PW51bGwsdGhpcy50aW1lU3RhbXA9RGF0ZS5ub3coKX12YXIgY2hhbm5lbHM9e30saW5zdGFuY2VzPXt9O2Z1bmN0aW9uIEJyb2FkY2FzdENoYW5uZWwkMSgpe31Ccm9hZGNhc3RDaGFubmVsJDEucHJvdG90eXBlLnBvc3RNZXNzYWdlPWZ1bmN0aW9uKGUpe2lmKHRoaXMuX2Nsb3NlZCl0aHJvdyBuZXcgRXJyb3IoJ0Jyb2FkY2FzdENoYW5uZWwgIicrdGhpcy5uYW1lKyciIGlzIGNsb3NlZC4nKTt2YXIgdD1jaGFubmVsc1t0aGlzLm5hbWVdO2lmKHQmJnQubGVuZ3RoKWZvcih2YXIgbj0wO248dC5sZW5ndGg7KytuKXt2YXIgcj10W25dO3IuX2Nsb3NlZHx8cj09PXRoaXN8fCJmdW5jdGlvbiI9PXR5cGVvZiByLm9ubWVzc2FnZSYmci5vbm1lc3NhZ2UobmV3IE1lc3NhZ2VFdmVudCgibWVzc2FnZSIse2RhdGE6ZX0pKX19LEJyb2FkY2FzdENoYW5uZWwkMS5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKCF0aGlzLl9jbG9zZWQmJih0aGlzLl9jbG9zZWQ9ITAsY2hhbm5lbHNbdGhpcy5uYW1lXSkpe3ZhciBlPWNoYW5uZWxzW3RoaXMubmFtZV0uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlIT09dH0pO2UubGVuZ3RoP2NoYW5uZWxzW3RoaXMubmFtZV09ZTpkZWxldGUgY2hhbm5lbHNbdGhpcy5uYW1lXX19O3ZhciBCcm9hZGNhc3RDaGFubmVsJDI9e2NyZWF0ZTpmdW5jdGlvbih0LGUsbil7aWYoaW5zdGFuY2VzW3RdPVtdLCJmdW5jdGlvbiI9PXR5cGVvZiBnbG9iYWwuQnJvYWRjYXN0Q2hhbm5lbClyZXR1cm57fTt2YXIgcj17QnJvYWRjYXN0Q2hhbm5lbDpmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibmFtZSIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiExLHZhbHVlOlN0cmluZyhlKX0pLHRoaXMuX2Nsb3NlZD0hMSx0aGlzLm9ubWVzc2FnZT1udWxsLGNoYW5uZWxzW3RoaXMubmFtZV18fChjaGFubmVsc1t0aGlzLm5hbWVdPVtdKSxjaGFubmVsc1t0aGlzLm5hbWVdLnB1c2godGhpcyksaW5zdGFuY2VzW3RdLnB1c2godGhpcyl9fTtyZXR1cm4gci5Ccm9hZGNhc3RDaGFubmVsLnByb3RvdHlwZT1Ccm9hZGNhc3RDaGFubmVsJDEucHJvdG90eXBlLHtpbnN0YW5jZTpyfX0sZGVzdHJveTpmdW5jdGlvbihlLHQpe2luc3RhbmNlc1tlXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNsb3NlKCl9KSxkZWxldGUgaW5zdGFuY2VzW2VdfX0sc2VydmljZXMkMT17QnJvYWRjYXN0Q2hhbm5lbDpCcm9hZGNhc3RDaGFubmVsJDJ9LG9VYixwVWIsclViLHNVYjtmdW5jdGlvbiBzZXR1cChlKXt2YXIgdD1ydW50aW1lLmluaXQsbj1ydW50aW1lLmNvbmZpZztuLmZyYW1ld29ya3M9ZTt2YXIgcj1zdWJ2ZXJzaW9uLm5hdGl2ZSxpPXN1YnZlcnNpb24udHJhbnNmb3JtZXI7Zm9yKHZhciBvIGluIHNlcnZpY2VzJDEpcnVudGltZS5zZXJ2aWNlLnJlZ2lzdGVyKG8sc2VydmljZXMkMVtvXSk7cnVudGltZS5mcmVlemVQcm90b3R5cGUoKSxnbG9iYWwuZnJhbWV3b3JrVmVyc2lvbj1yLGdsb2JhbC50cmFuc2Zvcm1lclZlcnNpb249aTt2YXIgYT10KG4pLHM9ZnVuY3Rpb24ocil7Z2xvYmFsW3JdPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3ZhciBuPWFbcl0uYXBwbHkoYSxlKTtyZXR1cm4gbiBpbnN0YW5jZW9mIEVycm9yJiZjb25zb2xlLmVycm9yKG4udG9TdHJpbmcoKSksbn19O2Zvcih2YXIgYyBpbiBhKXMoYyl9ZnVuY3Rpb24gdW53cmFwRXhwb3J0cyhlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwiZGVmYXVsdCIpP2UuZGVmYXVsdDplfWZ1bmN0aW9uIGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGUsdCl7cmV0dXJuIGUodD17ZXhwb3J0czp7fX0sdC5leHBvcnRzKSx0LmV4cG9ydHN9QXJyYXkuZnJvbXx8KEFycmF5LmZyb209KG9VYj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLHBVYj1mdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZXx8IltvYmplY3QgRnVuY3Rpb25dIj09PW9VYi5jYWxsKGUpfSxyVWI9TWF0aC5wb3coMiw1MyktMSxzVWI9ZnVuY3Rpb24oZSl7dmFyIHQsbj0odD1OdW1iZXIoZSksaXNOYU4odCk/MDowIT09dCYmaXNGaW5pdGUodCk/KDA8dD8xOi0xKSpNYXRoLmZsb29yKE1hdGguYWJzKHQpKTp0KTtyZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgobiwwKSxyVWIpfSxmdW5jdGlvbihlKXt2YXIgdD1PYmplY3QoZSk7aWYobnVsbD09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcnJheS5mcm9tIHJlcXVpcmVzIGFuIGFycmF5LWxpa2Ugb2JqZWN0IC0gbm90IG51bGwgb3IgdW5kZWZpbmVkIik7dmFyIG4scj0xPGFyZ3VtZW50cy5sZW5ndGg/YXJndW1lbnRzWzFdOnZvaWQgMDtpZih2b2lkIDAhPT1yKXtpZighcFViKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5LmZyb206IHdoZW4gcHJvdmlkZWQsIHRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uIik7Mjxhcmd1bWVudHMubGVuZ3RoJiYobj1hcmd1bWVudHNbMl0pfWZvcih2YXIgaSxvPXNVYih0Lmxlbmd0aCksYT1wVWIodGhpcyk/T2JqZWN0KG5ldyB0aGlzKG8pKTpuZXcgQXJyYXkobykscz0wO3M8bzspaT10W3NdLGFbc109cj92b2lkIDA9PT1uP3IoaSxzKTpyLmNhbGwobixpLHMpOmkscys9MTtyZXR1cm4gYS5sZW5ndGg9byxhfSkpO3ZhciBfZ2xvYmFsPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZXhwb3J0cz0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93Lk1hdGg9PU1hdGg/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZiYmc2VsZi5NYXRoPT1NYXRoP3NlbGY6RnVuY3Rpb24oInJldHVybiB0aGlzIikoKTsibnVtYmVyIj09dHlwZW9mIF9fZyYmKF9fZz10KX0pLF9jb3JlPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZXhwb3J0cz17dmVyc2lvbjoiMi41LjcifTsibnVtYmVyIj09dHlwZW9mIF9fZSYmKF9fZT10KX0pLF9jb3JlXzE9X2NvcmUudmVyc2lvbixfaXNPYmplY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlP251bGwhPT1lOiJmdW5jdGlvbiI9PXR5cGVvZiBlfSxfYW5PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoIV9pc09iamVjdChlKSl0aHJvdyBUeXBlRXJyb3IoZSsiIGlzIG5vdCBhbiBvYmplY3QhIik7cmV0dXJuIGV9LF9mYWlscz1mdW5jdGlvbihlKXt0cnl7cmV0dXJuISFlKCl9Y2F0Y2goZSl7cmV0dXJuITB9fSxfZGVzY3JpcHRvcnM9IV9mYWlscyhmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSksZG9jdW1lbnQkMT1fZ2xvYmFsLmRvY3VtZW50LGlzPV9pc09iamVjdChkb2N1bWVudCQxKSYmX2lzT2JqZWN0KGRvY3VtZW50JDEuY3JlYXRlRWxlbWVudCksX2RvbUNyZWF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gaXM/ZG9jdW1lbnQkMS5jcmVhdGVFbGVtZW50KGUpOnt9fSxfaWU4RG9tRGVmaW5lPSFfZGVzY3JpcHRvcnMmJiFfZmFpbHMoZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KF9kb21DcmVhdGUoImRpdiIpLCJhIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSkuYX0pLF90b1ByaW1pdGl2ZT1mdW5jdGlvbihlLHQpe2lmKCFfaXNPYmplY3QoZSkpcmV0dXJuIGU7dmFyIG4scjtpZih0JiYiZnVuY3Rpb24iPT10eXBlb2Yobj1lLnRvU3RyaW5nKSYmIV9pc09iamVjdChyPW4uY2FsbChlKSkpcmV0dXJuIHI7aWYoImZ1bmN0aW9uIj09dHlwZW9mKG49ZS52YWx1ZU9mKSYmIV9pc09iamVjdChyPW4uY2FsbChlKSkpcmV0dXJuIHI7aWYoIXQmJiJmdW5jdGlvbiI9PXR5cGVvZihuPWUudG9TdHJpbmcpJiYhX2lzT2JqZWN0KHI9bi5jYWxsKGUpKSlyZXR1cm4gcjt0aHJvdyBUeXBlRXJyb3IoIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZSIpfSxkUD1PYmplY3QuZGVmaW5lUHJvcGVydHksZj1fZGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnR5OmZ1bmN0aW9uKGUsdCxuKXtpZihfYW5PYmplY3QoZSksdD1fdG9QcmltaXRpdmUodCwhMCksX2FuT2JqZWN0KG4pLF9pZThEb21EZWZpbmUpdHJ5e3JldHVybiBkUChlLHQsbil9Y2F0Y2goZSl7fWlmKCJnZXQiaW4gbnx8InNldCJpbiBuKXRocm93IFR5cGVFcnJvcigiQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhIik7cmV0dXJuInZhbHVlImluIG4mJihlW3RdPW4udmFsdWUpLGV9LF9vYmplY3REcD17ZjpmfSxfcHJvcGVydHlEZXNjPWZ1bmN0aW9uKGUsdCl7cmV0dXJue2VudW1lcmFibGU6ISgxJmUpLGNvbmZpZ3VyYWJsZTohKDImZSksd3JpdGFibGU6ISg0JmUpLHZhbHVlOnR9fSxfaGlkZT1fZGVzY3JpcHRvcnM/ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBfb2JqZWN0RHAuZihlLHQsX3Byb3BlcnR5RGVzYygxLG4pKX06ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlW3RdPW4sZX0saGFzT3duUHJvcGVydHk9e30uaGFzT3duUHJvcGVydHksX2hhcz1mdW5jdGlvbihlLHQpe3JldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCl9LGlkPTAscHg9TWF0aC5yYW5kb20oKSxfdWlkPWZ1bmN0aW9uKGUpe3JldHVybiJTeW1ib2woIi5jb25jYXQodm9pZCAwPT09ZT8iIjplLCIpXyIsKCsraWQrcHgpLnRvU3RyaW5nKDM2KSl9LF9yZWRlZmluZT1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihlKXt2YXIgbz1fdWlkKCJzcmMiKSx0PSJ0b1N0cmluZyIsbj1GdW5jdGlvblt0XSxhPSgiIituKS5zcGxpdCh0KTtfY29yZS5pbnNwZWN0U291cmNlPWZ1bmN0aW9uKGUpe3JldHVybiBuLmNhbGwoZSl9LChlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9ImZ1bmN0aW9uIj09dHlwZW9mIG47aSYmKF9oYXMobiwibmFtZSIpfHxfaGlkZShuLCJuYW1lIix0KSksZVt0XSE9PW4mJihpJiYoX2hhcyhuLG8pfHxfaGlkZShuLG8sZVt0XT8iIitlW3RdOmEuam9pbihTdHJpbmcodCkpKSksZT09PV9nbG9iYWw/ZVt0XT1uOnI/ZVt0XT9lW3RdPW46X2hpZGUoZSx0LG4pOihkZWxldGUgZVt0XSxfaGlkZShlLHQsbikpKX0pKEZ1bmN0aW9uLnByb3RvdHlwZSx0LGZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMmJnRoaXNbb118fG4uY2FsbCh0aGlzKX0pfSksX2FGdW5jdGlvbj1mdW5jdGlvbihlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBUeXBlRXJyb3IoZSsiIGlzIG5vdCBhIGZ1bmN0aW9uISIpO3JldHVybiBlfSxfY3R4PWZ1bmN0aW9uKHIsaSxlKXtpZihfYUZ1bmN0aW9uKHIpLHZvaWQgMD09PWkpcmV0dXJuIHI7c3dpdGNoKGUpe2Nhc2UgMTpyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHIuY2FsbChpLGUpfTtjYXNlIDI6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIuY2FsbChpLGUsdCl9O2Nhc2UgMzpyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe3JldHVybiByLmNhbGwoaSxlLHQsbil9fXJldHVybiBmdW5jdGlvbigpe3JldHVybiByLmFwcGx5KGksYXJndW1lbnRzKX19LFBST1RPVFlQRT0icHJvdG90eXBlIiwkZXhwb3J0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzPWUmJGV4cG9ydC5GLGM9ZSYkZXhwb3J0LkcsdT1lJiRleHBvcnQuUyxsPWUmJGV4cG9ydC5QLGQ9ZSYkZXhwb3J0LkIsZj1jP19nbG9iYWw6dT9fZ2xvYmFsW3RdfHwoX2dsb2JhbFt0XT17fSk6KF9nbG9iYWxbdF18fHt9KVtQUk9UT1RZUEVdLHA9Yz9fY29yZTpfY29yZVt0XXx8KF9jb3JlW3RdPXt9KSxoPXBbUFJPVE9UWVBFXXx8KHBbUFJPVE9UWVBFXT17fSk7Zm9yKHIgaW4gYyYmKG49dCksbilvPSgoaT0hcyYmZiYmdm9pZCAwIT09ZltyXSk/ZjpuKVtyXSxhPWQmJmk/X2N0eChvLF9nbG9iYWwpOmwmJiJmdW5jdGlvbiI9PXR5cGVvZiBvP19jdHgoRnVuY3Rpb24uY2FsbCxvKTpvLGYmJl9yZWRlZmluZShmLHIsbyxlJiRleHBvcnQuVSkscFtyXSE9byYmX2hpZGUocCxyLGEpLGwmJmhbcl0hPW8mJihoW3JdPW8pfTtfZ2xvYmFsLmNvcmU9X2NvcmUsJGV4cG9ydC5GPTEsJGV4cG9ydC5HPTIsJGV4cG9ydC5TPTQsJGV4cG9ydC5QPTgsJGV4cG9ydC5CPTE2LCRleHBvcnQuVz0zMiwkZXhwb3J0LlU9NjQsJGV4cG9ydC5SPTEyODt2YXIgX2V4cG9ydD0kZXhwb3J0LHRvU3RyaW5nJDE9e30udG9TdHJpbmcsX2NvZj1mdW5jdGlvbihlKXtyZXR1cm4gdG9TdHJpbmckMS5jYWxsKGUpLnNsaWNlKDgsLTEpfSxfaW9iamVjdD1PYmplY3QoInoiKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKT9PYmplY3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIlN0cmluZyI9PV9jb2YoZSk/ZS5zcGxpdCgiIik6T2JqZWN0KGUpfSxfZGVmaW5lZD1mdW5jdGlvbihlKXtpZihudWxsPT1lKXRocm93IFR5cGVFcnJvcigiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gICIrZSk7cmV0dXJuIGV9LF90b0lvYmplY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIF9pb2JqZWN0KF9kZWZpbmVkKGUpKX0sY2VpbD1NYXRoLmNlaWwsZmxvb3I9TWF0aC5mbG9vcixfdG9JbnRlZ2VyPWZ1bmN0aW9uKGUpe3JldHVybiBpc05hTihlPStlKT8wOigwPGU/Zmxvb3I6Y2VpbCkoZSl9LG1pbj1NYXRoLm1pbixfdG9MZW5ndGg9ZnVuY3Rpb24oZSl7cmV0dXJuIDA8ZT9taW4oX3RvSW50ZWdlcihlKSw5MDA3MTk5MjU0NzQwOTkxKTowfSxtYXg9TWF0aC5tYXgsbWluJDE9TWF0aC5taW4sX3RvQWJzb2x1dGVJbmRleD1mdW5jdGlvbihlLHQpe3JldHVybihlPV90b0ludGVnZXIoZSkpPDA/bWF4KGUrdCwwKTptaW4kMShlLHQpfSxfYXJyYXlJbmNsdWRlcz1mdW5jdGlvbihzKXtyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk9X3RvSW9iamVjdChlKSxvPV90b0xlbmd0aChpLmxlbmd0aCksYT1fdG9BYnNvbHV0ZUluZGV4KG4sbyk7aWYocyYmdCE9dCl7Zm9yKDthPG87KWlmKChyPWlbYSsrXSkhPXIpcmV0dXJuITB9ZWxzZSBmb3IoO2E8bzthKyspaWYoKHN8fGEgaW4gaSkmJmlbYV09PT10KXJldHVybiBzfHxhfHwwO3JldHVybiFzJiYtMX19LF9saWJyYXJ5PSExLF9zaGFyZWQ9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24oZSl7dmFyIHQ9Il9fY29yZS1qc19zaGFyZWRfXyIsbj1fZ2xvYmFsW3RdfHwoX2dsb2JhbFt0XT17fSk7KGUuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiBuW2VdfHwobltlXT12b2lkIDAhPT10P3Q6e30pfSkoInZlcnNpb25zIixbXSkucHVzaCh7dmVyc2lvbjpfY29yZS52ZXJzaW9uLG1vZGU6X2xpYnJhcnk/InB1cmUiOiJnbG9iYWwiLGNvcHlyaWdodDoiwqkgMjAxOCBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KSJ9KX0pLHNoYXJlZCQyPV9zaGFyZWQoImtleXMiKSxfc2hhcmVkS2V5PWZ1bmN0aW9uKGUpe3JldHVybiBzaGFyZWQkMltlXXx8KHNoYXJlZCQyW2VdPV91aWQoZSkpfSxhcnJheUluZGV4T2Y9X2FycmF5SW5jbHVkZXMoITEpLElFX1BST1RPPV9zaGFyZWRLZXkoIklFX1BST1RPIiksX29iamVjdEtleXNJbnRlcm5hbD1mdW5jdGlvbihlLHQpe3ZhciBuLHI9X3RvSW9iamVjdChlKSxpPTAsbz1bXTtmb3IobiBpbiByKW4hPUlFX1BST1RPJiZfaGFzKHIsbikmJm8ucHVzaChuKTtmb3IoO3QubGVuZ3RoPmk7KV9oYXMocixuPXRbaSsrXSkmJih+YXJyYXlJbmRleE9mKG8sbil8fG8ucHVzaChuKSk7cmV0dXJuIG99LF9lbnVtQnVnS2V5cz0iY29uc3RydWN0b3IsaGFzT3duUHJvcGVydHksaXNQcm90b3R5cGVPZixwcm9wZXJ0eUlzRW51bWVyYWJsZSx0b0xvY2FsZVN0cmluZyx0b1N0cmluZyx2YWx1ZU9mIi5zcGxpdCgiLCIpLF9vYmplY3RLZXlzPU9iamVjdC5rZXlzfHxmdW5jdGlvbihlKXtyZXR1cm4gX29iamVjdEtleXNJbnRlcm5hbChlLF9lbnVtQnVnS2V5cyl9LGYkMT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLF9vYmplY3RHb3BzPXtmOmYkMX0sZiQyPXt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLF9vYmplY3RQaWU9e2Y6ZiQyfSxfdG9PYmplY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdChfZGVmaW5lZChlKSl9LCRhc3NpZ249T2JqZWN0LmFzc2lnbixfb2JqZWN0QXNzaWduPSEkYXNzaWdufHxfZmFpbHMoZnVuY3Rpb24oKXt2YXIgZT17fSx0PXt9LG49U3ltYm9sKCkscj0iYWJjZGVmZ2hpamtsbW5vcHFyc3QiO3JldHVybiBlW25dPTcsci5zcGxpdCgiIikuZm9yRWFjaChmdW5jdGlvbihlKXt0W2VdPWV9KSw3IT0kYXNzaWduKHt9LGUpW25dfHxPYmplY3Qua2V5cygkYXNzaWduKHt9LHQpKS5qb2luKCIiKSE9cn0pP2Z1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPWFyZ3VtZW50cyxyPV90b09iamVjdChlKSxpPWFyZ3VtZW50cy5sZW5ndGgsbz0xLGE9X29iamVjdEdvcHMuZixzPV9vYmplY3RQaWUuZjtvPGk7KWZvcih2YXIgYyx1PV9pb2JqZWN0KG5bbysrXSksbD1hP19vYmplY3RLZXlzKHUpLmNvbmNhdChhKHUpKTpfb2JqZWN0S2V5cyh1KSxkPWwubGVuZ3RoLGY9MDtmPGQ7KXMuY2FsbCh1LGM9bFtmKytdKSYmKHJbY109dVtjXSk7cmV0dXJuIHJ9OiRhc3NpZ247X2V4cG9ydChfZXhwb3J0LlMrX2V4cG9ydC5GLCJPYmplY3QiLHthc3NpZ246X29iamVjdEFzc2lnbn0pO3ZhciBhc3NpZ249X2NvcmUuT2JqZWN0LmFzc2lnbjtPYmplY3Quc2V0UHJvdG90eXBlT2Z8fChPYmplY3Quc2V0UHJvdG90eXBlT2Y9ZnVuY3Rpb24odCxuKXt2YXIgcjtmdW5jdGlvbiBpKGUsdCl7cmV0dXJuIHIuY2FsbChlLHQpLGV9dHJ5eyhyPXQuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQucHJvdG90eXBlLG4pLnNldCkuY2FsbCh7fSxudWxsKX1jYXRjaChlKXtpZih0LnByb3RvdHlwZSE9PXt9W25dKXJldHVybjtyPWZ1bmN0aW9uKGUpe3RoaXNbbl09ZX0saS5wb2x5ZmlsbD1pKGkoe30sbnVsbCksdC5wcm90b3R5cGUpaW5zdGFuY2VvZiB0fXJldHVybiBpfShPYmplY3QsIl9fcHJvdG9fXyIpKTt2YXIgV1hFbnZpcm9ubWVudCQxPWdsb2JhbC5XWEVudmlyb25tZW50O3ZvaWQgMD09PVdYRW52aXJvbm1lbnQkMXx8ImlPUyIhPT1XWEVudmlyb25tZW50JDEucGxhdGZvcm18fFdYRW52aXJvbm1lbnQkMS5fX2VuYWJsZV9uYXRpdmVfcHJvbWlzZV9ffHwoZ2xvYmFsLlByb21pc2U9dm9pZCAwKTt2YXIgX3drcz1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihlKXt2YXIgdD1fc2hhcmVkKCJ3a3MiKSxuPV9nbG9iYWwuU3ltYm9sLHI9ImZ1bmN0aW9uIj09dHlwZW9mIG47KGUuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gdFtlXXx8KHRbZV09ciYmbltlXXx8KHI/bjpfdWlkKSgiU3ltYm9sLiIrZSkpfSkuc3RvcmU9dH0pLFRBRz1fd2tzKCJ0b1N0cmluZ1RhZyIpLEFSRz0iQXJndW1lbnRzIj09X2NvZihmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpLHRyeUdldD1mdW5jdGlvbihlLHQpe3RyeXtyZXR1cm4gZVt0XX1jYXRjaChlKXt9fSxfY2xhc3NvZj1mdW5jdGlvbihlKXt2YXIgdCxuLHI7cmV0dXJuIHZvaWQgMD09PWU/IlVuZGVmaW5lZCI6bnVsbD09PWU/Ik51bGwiOiJzdHJpbmciPT10eXBlb2Yobj10cnlHZXQodD1PYmplY3QoZSksVEFHKSk/bjpBUkc/X2NvZih0KToiT2JqZWN0Ij09KHI9X2NvZih0KSkmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LmNhbGxlZT8iQXJndW1lbnRzIjpyfSx0ZXN0PXt9O3Rlc3RbX3drcygidG9TdHJpbmdUYWciKV09InoiLHRlc3QrIiIhPSJbb2JqZWN0IHpdIiYmX3JlZGVmaW5lKE9iamVjdC5wcm90b3R5cGUsInRvU3RyaW5nIixmdW5jdGlvbigpe3JldHVybiJbb2JqZWN0ICIrX2NsYXNzb2YodGhpcykrIl0ifSwhMCk7dmFyIF9zdHJpbmdBdD1mdW5jdGlvbihzKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9U3RyaW5nKF9kZWZpbmVkKGUpKSxvPV90b0ludGVnZXIodCksYT1pLmxlbmd0aDtyZXR1cm4gbzwwfHxhPD1vP3M/IiI6dm9pZCAwOihuPWkuY2hhckNvZGVBdChvKSk8NTUyOTZ8fDU2MzE5PG58fG8rMT09PWF8fChyPWkuY2hhckNvZGVBdChvKzEpKTw1NjMyMHx8NTczNDM8cj9zP2kuY2hhckF0KG8pOm46cz9pLnNsaWNlKG8sbysyKTpyLTU2MzIwKyhuLTU1Mjk2PDwxMCkrNjU1MzZ9fSxfaXRlcmF0b3JzPXt9LF9vYmplY3REcHM9X2Rlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzOmZ1bmN0aW9uKGUsdCl7X2FuT2JqZWN0KGUpO2Zvcih2YXIgbixyPV9vYmplY3RLZXlzKHQpLGk9ci5sZW5ndGgsbz0wO288aTspX29iamVjdERwLmYoZSxuPXJbbysrXSx0W25dKTtyZXR1cm4gZX0sZG9jdW1lbnQkMj1fZ2xvYmFsLmRvY3VtZW50LF9odG1sPWRvY3VtZW50JDImJmRvY3VtZW50JDIuZG9jdW1lbnRFbGVtZW50LElFX1BST1RPJDE9X3NoYXJlZEtleSgiSUVfUFJPVE8iKSxFbXB0eT1mdW5jdGlvbigpe30sUFJPVE9UWVBFJDE9InByb3RvdHlwZSIsY3JlYXRlRGljdD1mdW5jdGlvbigpe3ZhciBlLHQ9X2RvbUNyZWF0ZSgiaWZyYW1lIiksbj1fZW51bUJ1Z0tleXMubGVuZ3RoO2Zvcih0LnN0eWxlLmRpc3BsYXk9Im5vbmUiLF9odG1sLmFwcGVuZENoaWxkKHQpLHQuc3JjPSJqYXZhc2NyaXB0OiIsKGU9dC5jb250ZW50V2luZG93LmRvY3VtZW50KS5vcGVuKCksZS53cml0ZSgiPHNjcmlwdD5kb2N1bWVudC5GPU9iamVjdDxcL3NjcmlwdD4iKSxlLmNsb3NlKCksY3JlYXRlRGljdD1lLkY7bi0tOylkZWxldGUgY3JlYXRlRGljdFtQUk9UT1RZUEUkMV1bX2VudW1CdWdLZXlzW25dXTtyZXR1cm4gY3JlYXRlRGljdCgpfSxfb2JqZWN0Q3JlYXRlPU9iamVjdC5jcmVhdGV8fGZ1bmN0aW9uKGUsdCl7dmFyIG47cmV0dXJuIG51bGwhPT1lPyhFbXB0eVtQUk9UT1RZUEUkMV09X2FuT2JqZWN0KGUpLG49bmV3IEVtcHR5LEVtcHR5W1BST1RPVFlQRSQxXT1udWxsLG5bSUVfUFJPVE8kMV09ZSk6bj1jcmVhdGVEaWN0KCksdm9pZCAwPT09dD9uOl9vYmplY3REcHMobix0KX0sZGVmPV9vYmplY3REcC5mLFRBRyQxPV93a3MoInRvU3RyaW5nVGFnIiksX3NldFRvU3RyaW5nVGFnPWZ1bmN0aW9uKGUsdCxuKXtlJiYhX2hhcyhlPW4/ZTplLnByb3RvdHlwZSxUQUckMSkmJmRlZihlLFRBRyQxLHtjb25maWd1cmFibGU6ITAsdmFsdWU6dH0pfSxJdGVyYXRvclByb3RvdHlwZT17fTtfaGlkZShJdGVyYXRvclByb3RvdHlwZSxfd2tzKCJpdGVyYXRvciIpLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KTt2YXIgX2l0ZXJDcmVhdGU9ZnVuY3Rpb24oZSx0LG4pe2UucHJvdG90eXBlPV9vYmplY3RDcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUse25leHQ6X3Byb3BlcnR5RGVzYygxLG4pfSksX3NldFRvU3RyaW5nVGFnKGUsdCsiIEl0ZXJhdG9yIil9LElFX1BST1RPJDI9X3NoYXJlZEtleSgiSUVfUFJPVE8iKSxPYmplY3RQcm90bz1PYmplY3QucHJvdG90eXBlLF9vYmplY3RHcG89T2JqZWN0LmdldFByb3RvdHlwZU9mfHxmdW5jdGlvbihlKXtyZXR1cm4gZT1fdG9PYmplY3QoZSksX2hhcyhlLElFX1BST1RPJDIpP2VbSUVfUFJPVE8kMl06ImZ1bmN0aW9uIj09dHlwZW9mIGUuY29uc3RydWN0b3ImJmUgaW5zdGFuY2VvZiBlLmNvbnN0cnVjdG9yP2UuY29uc3RydWN0b3IucHJvdG90eXBlOmUgaW5zdGFuY2VvZiBPYmplY3Q/T2JqZWN0UHJvdG86bnVsbH0sSVRFUkFUT1I9X3drcygiaXRlcmF0b3IiKSxCVUdHWT0hKFtdLmtleXMmJiJuZXh0ImluW10ua2V5cygpKSxGRl9JVEVSQVRPUj0iQEBpdGVyYXRvciIsS0VZUz0ia2V5cyIsVkFMVUVTPSJ2YWx1ZXMiLHJldHVyblRoaXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sX2l0ZXJEZWZpbmU9ZnVuY3Rpb24oZSx0LG4scixpLG8sYSl7X2l0ZXJDcmVhdGUobix0LHIpO3ZhciBzLGMsdSxsPWZ1bmN0aW9uKGUpe2lmKCFCVUdHWSYmZSBpbiBoKXJldHVybiBoW2VdO3N3aXRjaChlKXtjYXNlIEtFWVM6Y2FzZSBWQUxVRVM6cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMsZSl9fXJldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzLGUpfX0sZD10KyIgSXRlcmF0b3IiLGY9aT09VkFMVUVTLHA9ITEsaD1lLnByb3RvdHlwZSx2PWhbSVRFUkFUT1JdfHxoW0ZGX0lURVJBVE9SXXx8aSYmaFtpXSxnPXZ8fGwoaSksbT1pP2Y/bCgiZW50cmllcyIpOmc6dm9pZCAwLHk9IkFycmF5Ij09dCYmaC5lbnRyaWVzfHx2O2lmKHkmJih1PV9vYmplY3RHcG8oeS5jYWxsKG5ldyBlKSkpIT09T2JqZWN0LnByb3RvdHlwZSYmdS5uZXh0JiYoX3NldFRvU3RyaW5nVGFnKHUsZCwhMCksX2xpYnJhcnl8fCJmdW5jdGlvbiI9PXR5cGVvZiB1W0lURVJBVE9SXXx8X2hpZGUodSxJVEVSQVRPUixyZXR1cm5UaGlzKSksZiYmdiYmdi5uYW1lIT09VkFMVUVTJiYocD0hMCxnPWZ1bmN0aW9uKCl7cmV0dXJuIHYuY2FsbCh0aGlzKX0pLF9saWJyYXJ5JiYhYXx8IUJVR0dZJiYhcCYmaFtJVEVSQVRPUl18fF9oaWRlKGgsSVRFUkFUT1IsZyksX2l0ZXJhdG9yc1t0XT1nLF9pdGVyYXRvcnNbZF09cmV0dXJuVGhpcyxpKWlmKHM9e3ZhbHVlczpmP2c6bChWQUxVRVMpLGtleXM6bz9nOmwoS0VZUyksZW50cmllczptfSxhKWZvcihjIGluIHMpYyBpbiBofHxfcmVkZWZpbmUoaCxjLHNbY10pO2Vsc2UgX2V4cG9ydChfZXhwb3J0LlArX2V4cG9ydC5GKihCVUdHWXx8cCksdCxzKTtyZXR1cm4gc30sJGF0PV9zdHJpbmdBdCghMCk7X2l0ZXJEZWZpbmUoU3RyaW5nLCJTdHJpbmciLGZ1bmN0aW9uKGUpe3RoaXMuX3Q9U3RyaW5nKGUpLHRoaXMuX2k9MH0sZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXMuX3Qsbj10aGlzLl9pO3JldHVybiBuPj10Lmxlbmd0aD97dmFsdWU6dm9pZCAwLGRvbmU6ITB9OihlPSRhdCh0LG4pLHRoaXMuX2krPWUubGVuZ3RoLHt2YWx1ZTplLGRvbmU6ITF9KX0pO3ZhciBVTlNDT1BBQkxFUz1fd2tzKCJ1bnNjb3BhYmxlcyIpLEFycmF5UHJvdG89QXJyYXkucHJvdG90eXBlO251bGw9PUFycmF5UHJvdG9bVU5TQ09QQUJMRVNdJiZfaGlkZShBcnJheVByb3RvLFVOU0NPUEFCTEVTLHt9KTt2YXIgX2FkZFRvVW5zY29wYWJsZXM9ZnVuY3Rpb24oZSl7QXJyYXlQcm90b1tVTlNDT1BBQkxFU11bZV09ITB9LF9pdGVyU3RlcD1mdW5jdGlvbihlLHQpe3JldHVybnt2YWx1ZTp0LGRvbmU6ISFlfX0sZXM2X2FycmF5X2l0ZXJhdG9yPV9pdGVyRGVmaW5lKEFycmF5LCJBcnJheSIsZnVuY3Rpb24oZSx0KXt0aGlzLl90PV90b0lvYmplY3QoZSksdGhpcy5faT0wLHRoaXMuX2s9dH0sZnVuY3Rpb24oKXt2YXIgZT10aGlzLl90LHQ9dGhpcy5fayxuPXRoaXMuX2krKztyZXR1cm4hZXx8bj49ZS5sZW5ndGg/KHRoaXMuX3Q9dm9pZCAwLF9pdGVyU3RlcCgxKSk6X2l0ZXJTdGVwKDAsImtleXMiPT10P246InZhbHVlcyI9PXQ/ZVtuXTpbbixlW25dXSl9LCJ2YWx1ZXMiKTtfaXRlcmF0b3JzLkFyZ3VtZW50cz1faXRlcmF0b3JzLkFycmF5LF9hZGRUb1Vuc2NvcGFibGVzKCJrZXlzIiksX2FkZFRvVW5zY29wYWJsZXMoInZhbHVlcyIpLF9hZGRUb1Vuc2NvcGFibGVzKCJlbnRyaWVzIik7Zm9yKHZhciBJVEVSQVRPUiQxPV93a3MoIml0ZXJhdG9yIiksVE9fU1RSSU5HX1RBRz1fd2tzKCJ0b1N0cmluZ1RhZyIpLEFycmF5VmFsdWVzPV9pdGVyYXRvcnMuQXJyYXksRE9NSXRlcmFibGVzPXtDU1NSdWxlTGlzdDohMCxDU1NTdHlsZURlY2xhcmF0aW9uOiExLENTU1ZhbHVlTGlzdDohMSxDbGllbnRSZWN0TGlzdDohMSxET01SZWN0TGlzdDohMSxET01TdHJpbmdMaXN0OiExLERPTVRva2VuTGlzdDohMCxEYXRhVHJhbnNmZXJJdGVtTGlzdDohMSxGaWxlTGlzdDohMSxIVE1MQWxsQ29sbGVjdGlvbjohMSxIVE1MQ29sbGVjdGlvbjohMSxIVE1MRm9ybUVsZW1lbnQ6ITEsSFRNTFNlbGVjdEVsZW1lbnQ6ITEsTWVkaWFMaXN0OiEwLE1pbWVUeXBlQXJyYXk6ITEsTmFtZWROb2RlTWFwOiExLE5vZGVMaXN0OiEwLFBhaW50UmVxdWVzdExpc3Q6ITEsUGx1Z2luOiExLFBsdWdpbkFycmF5OiExLFNWR0xlbmd0aExpc3Q6ITEsU1ZHTnVtYmVyTGlzdDohMSxTVkdQYXRoU2VnTGlzdDohMSxTVkdQb2ludExpc3Q6ITEsU1ZHU3RyaW5nTGlzdDohMSxTVkdUcmFuc2Zvcm1MaXN0OiExLFNvdXJjZUJ1ZmZlckxpc3Q6ITEsU3R5bGVTaGVldExpc3Q6ITAsVGV4dFRyYWNrQ3VlTGlzdDohMSxUZXh0VHJhY2tMaXN0OiExLFRvdWNoTGlzdDohMX0sY29sbGVjdGlvbnM9X29iamVjdEtleXMoRE9NSXRlcmFibGVzKSxpPTA7aTxjb2xsZWN0aW9ucy5sZW5ndGg7aSsrKXt2YXIgTkFNRT1jb2xsZWN0aW9uc1tpXSxleHBsaWNpdD1ET01JdGVyYWJsZXNbTkFNRV0sQ29sbGVjdGlvbj1fZ2xvYmFsW05BTUVdLHByb3RvPUNvbGxlY3Rpb24mJkNvbGxlY3Rpb24ucHJvdG90eXBlLGtleTtpZihwcm90byYmKHByb3RvW0lURVJBVE9SJDFdfHxfaGlkZShwcm90byxJVEVSQVRPUiQxLEFycmF5VmFsdWVzKSxwcm90b1tUT19TVFJJTkdfVEFHXXx8X2hpZGUocHJvdG8sVE9fU1RSSU5HX1RBRyxOQU1FKSxfaXRlcmF0b3JzW05BTUVdPUFycmF5VmFsdWVzLGV4cGxpY2l0KSlmb3Ioa2V5IGluIGVzNl9hcnJheV9pdGVyYXRvcilwcm90b1trZXldfHxfcmVkZWZpbmUocHJvdG8sa2V5LGVzNl9hcnJheV9pdGVyYXRvcltrZXldLCEwKX12YXIgX2FuSW5zdGFuY2U9ZnVuY3Rpb24oZSx0LG4scil7aWYoIShlIGluc3RhbmNlb2YgdCl8fHZvaWQgMCE9PXImJnIgaW4gZSl0aHJvdyBUeXBlRXJyb3IobisiOiBpbmNvcnJlY3QgaW52b2NhdGlvbiEiKTtyZXR1cm4gZX0sX2l0ZXJDYWxsPWZ1bmN0aW9uKHQsZSxuLHIpe3RyeXtyZXR1cm4gcj9lKF9hbk9iamVjdChuKVswXSxuWzFdKTplKG4pfWNhdGNoKGUpe3ZhciBpPXQucmV0dXJuO3Rocm93IHZvaWQgMCE9PWkmJl9hbk9iamVjdChpLmNhbGwodCkpLGV9fSxJVEVSQVRPUiQyPV93a3MoIml0ZXJhdG9yIiksQXJyYXlQcm90byQxPUFycmF5LnByb3RvdHlwZSxfaXNBcnJheUl0ZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMCE9PWUmJihfaXRlcmF0b3JzLkFycmF5PT09ZXx8QXJyYXlQcm90byQxW0lURVJBVE9SJDJdPT09ZSl9LElURVJBVE9SJDM9X3drcygiaXRlcmF0b3IiKSxjb3JlX2dldEl0ZXJhdG9yTWV0aG9kPV9jb3JlLmdldEl0ZXJhdG9yTWV0aG9kPWZ1bmN0aW9uKGUpe2lmKG51bGwhPWUpcmV0dXJuIGVbSVRFUkFUT1IkM118fGVbIkBAaXRlcmF0b3IiXXx8X2l0ZXJhdG9yc1tfY2xhc3NvZihlKV19LF9mb3JPZj1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihlKXt2YXIgZj17fSxwPXt9LHQ9ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG8sYSxzLGMsdT1pP2Z1bmN0aW9uKCl7cmV0dXJuIGV9OmNvcmVfZ2V0SXRlcmF0b3JNZXRob2QoZSksbD1fY3R4KG4scix0PzI6MSksZD0wO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB1KXRocm93IFR5cGVFcnJvcihlKyIgaXMgbm90IGl0ZXJhYmxlISIpO2lmKF9pc0FycmF5SXRlcih1KSl7Zm9yKG89X3RvTGVuZ3RoKGUubGVuZ3RoKTtkPG87ZCsrKWlmKChjPXQ/bChfYW5PYmplY3QoYT1lW2RdKVswXSxhWzFdKTpsKGVbZF0pKT09PWZ8fGM9PT1wKXJldHVybiBjfWVsc2UgZm9yKHM9dS5jYWxsKGUpOyEoYT1zLm5leHQoKSkuZG9uZTspaWYoKGM9X2l0ZXJDYWxsKHMsbCxhLnZhbHVlLHQpKT09PWZ8fGM9PT1wKXJldHVybiBjfTt0LkJSRUFLPWYsdC5SRVRVUk49cH0pLFNQRUNJRVM9X3drcygic3BlY2llcyIpLF9zcGVjaWVzQ29uc3RydWN0b3I9ZnVuY3Rpb24oZSx0KXt2YXIgbixyPV9hbk9iamVjdChlKS5jb25zdHJ1Y3RvcjtyZXR1cm4gdm9pZCAwPT09cnx8bnVsbD09KG49X2FuT2JqZWN0KHIpW1NQRUNJRVNdKT90Ol9hRnVuY3Rpb24obil9LF9pbnZva2U9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXZvaWQgMD09PW47c3dpdGNoKHQubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHI/ZSgpOmUuY2FsbChuKTtjYXNlIDE6cmV0dXJuIHI/ZSh0WzBdKTplLmNhbGwobix0WzBdKTtjYXNlIDI6cmV0dXJuIHI/ZSh0WzBdLHRbMV0pOmUuY2FsbChuLHRbMF0sdFsxXSk7Y2FzZSAzOnJldHVybiByP2UodFswXSx0WzFdLHRbMl0pOmUuY2FsbChuLHRbMF0sdFsxXSx0WzJdKTtjYXNlIDQ6cmV0dXJuIHI/ZSh0WzBdLHRbMV0sdFsyXSx0WzNdKTplLmNhbGwobix0WzBdLHRbMV0sdFsyXSx0WzNdKX1yZXR1cm4gZS5hcHBseShuLHQpfSxwcm9jZXNzJDI9X2dsb2JhbC5wcm9jZXNzLHNldFRhc2s9X2dsb2JhbC5zZXRJbW1lZGlhdGUsY2xlYXJUYXNrPV9nbG9iYWwuY2xlYXJJbW1lZGlhdGUsTWVzc2FnZUNoYW5uZWw9X2dsb2JhbC5NZXNzYWdlQ2hhbm5lbCxEaXNwYXRjaD1fZ2xvYmFsLkRpc3BhdGNoLGNvdW50ZXI9MCxxdWV1ZT17fSxPTlJFQURZU1RBVEVDSEFOR0U9Im9ucmVhZHlzdGF0ZWNoYW5nZSIsZGVmZXIsY2hhbm5lbCQxLHBvcnQscnVuPWZ1bmN0aW9uKCl7dmFyIGU9K3RoaXM7aWYocXVldWUuaGFzT3duUHJvcGVydHkoZSkpe3ZhciB0PXF1ZXVlW2VdO2RlbGV0ZSBxdWV1ZVtlXSx0KCl9fSxsaXN0ZW5lcj1mdW5jdGlvbihlKXtydW4uY2FsbChlLmRhdGEpfTtzZXRUYXNrJiZjbGVhclRhc2t8fChzZXRUYXNrPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1hcmd1bWVudHMsbj1bXSxyPTE7YXJndW1lbnRzLmxlbmd0aD5yOyluLnB1c2godFtyKytdKTtyZXR1cm4gcXVldWVbKytjb3VudGVyXT1mdW5jdGlvbigpe19pbnZva2UoImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpGdW5jdGlvbihlKSxuKX0sZGVmZXIoY291bnRlciksY291bnRlcn0sY2xlYXJUYXNrPWZ1bmN0aW9uKGUpe2RlbGV0ZSBxdWV1ZVtlXX0sInByb2Nlc3MiPT1fY29mKHByb2Nlc3MkMik/ZGVmZXI9ZnVuY3Rpb24oZSl7cHJvY2VzcyQyLm5leHRUaWNrKF9jdHgocnVuLGUsMSkpfTpEaXNwYXRjaCYmRGlzcGF0Y2gubm93P2RlZmVyPWZ1bmN0aW9uKGUpe0Rpc3BhdGNoLm5vdyhfY3R4KHJ1bixlLDEpKX06TWVzc2FnZUNoYW5uZWw/KGNoYW5uZWwkMT1uZXcgTWVzc2FnZUNoYW5uZWwscG9ydD1jaGFubmVsJDEucG9ydDIsY2hhbm5lbCQxLnBvcnQxLm9ubWVzc2FnZT1saXN0ZW5lcixkZWZlcj1fY3R4KHBvcnQucG9zdE1lc3NhZ2UscG9ydCwxKSk6X2dsb2JhbC5hZGRFdmVudExpc3RlbmVyJiYiZnVuY3Rpb24iPT10eXBlb2YgcG9zdE1lc3NhZ2UmJiFfZ2xvYmFsLmltcG9ydFNjcmlwdHM/KGRlZmVyPWZ1bmN0aW9uKGUpe19nbG9iYWwucG9zdE1lc3NhZ2UoZSsiIiwiKiIpfSxfZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGxpc3RlbmVyLCExKSk6ZGVmZXI9T05SRUFEWVNUQVRFQ0hBTkdFIGluIF9kb21DcmVhdGUoInNjcmlwdCIpP2Z1bmN0aW9uKGUpe19odG1sLmFwcGVuZENoaWxkKF9kb21DcmVhdGUoInNjcmlwdCIpKVtPTlJFQURZU1RBVEVDSEFOR0VdPWZ1bmN0aW9uKCl7X2h0bWwucmVtb3ZlQ2hpbGQodGhpcykscnVuLmNhbGwoZSl9fTpmdW5jdGlvbihlKXtzZXRUaW1lb3V0KF9jdHgocnVuLGUsMSksMCl9KTt2YXIgX3Rhc2s9e3NldDpzZXRUYXNrLGNsZWFyOmNsZWFyVGFza30sbWFjcm90YXNrPV90YXNrLnNldCxPYnNlcnZlcj1fZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXJ8fF9nbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcixwcm9jZXNzJDM9X2dsb2JhbC5wcm9jZXNzLFByb21pc2UkMT1fZ2xvYmFsLlByb21pc2UsaXNOb2RlJDE9InByb2Nlc3MiPT1fY29mKHByb2Nlc3MkMyksX21pY3JvdGFzaz1mdW5jdGlvbigpe3ZhciBuLHIsaSxlPWZ1bmN0aW9uKCl7dmFyIGUsdDtmb3IoaXNOb2RlJDEmJihlPXByb2Nlc3MkMy5kb21haW4pJiZlLmV4aXQoKTtuOyl7dD1uLmZuLG49bi5uZXh0O3RyeXt0KCl9Y2F0Y2goZSl7dGhyb3cgbj9pKCk6cj12b2lkIDAsZX19cj12b2lkIDAsZSYmZS5lbnRlcigpfTtpZihpc05vZGUkMSlpPWZ1bmN0aW9uKCl7cHJvY2VzcyQzLm5leHRUaWNrKGUpfTtlbHNlIGlmKCFPYnNlcnZlcnx8X2dsb2JhbC5uYXZpZ2F0b3ImJl9nbG9iYWwubmF2aWdhdG9yLnN0YW5kYWxvbmUpaWYoUHJvbWlzZSQxJiZQcm9taXNlJDEucmVzb2x2ZSl7dmFyIHQ9UHJvbWlzZSQxLnJlc29sdmUodm9pZCAwKTtpPWZ1bmN0aW9uKCl7dC50aGVuKGUpfX1lbHNlIGk9ZnVuY3Rpb24oKXttYWNyb3Rhc2suY2FsbChfZ2xvYmFsLGUpfTtlbHNle3ZhciBvPSEwLGE9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiIpO25ldyBPYnNlcnZlcihlKS5vYnNlcnZlKGEse2NoYXJhY3RlckRhdGE6ITB9KSxpPWZ1bmN0aW9uKCl7YS5kYXRhPW89IW99fXJldHVybiBmdW5jdGlvbihlKXt2YXIgdD17Zm46ZSxuZXh0OnZvaWQgMH07ciYmKHIubmV4dD10KSxufHwobj10LGkoKSkscj10fX07ZnVuY3Rpb24gUHJvbWlzZUNhcGFiaWxpdHkoZSl7dmFyIG4scjt0aGlzLnByb21pc2U9bmV3IGUoZnVuY3Rpb24oZSx0KXtpZih2b2lkIDAhPT1ufHx2b2lkIDAhPT1yKXRocm93IFR5cGVFcnJvcigiQmFkIFByb21pc2UgY29uc3RydWN0b3IiKTtuPWUscj10fSksdGhpcy5yZXNvbHZlPV9hRnVuY3Rpb24obiksdGhpcy5yZWplY3Q9X2FGdW5jdGlvbihyKX12YXIgZiQzPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoZSl9LF9uZXdQcm9taXNlQ2FwYWJpbGl0eT17ZjpmJDN9LF9wZXJmb3JtPWZ1bmN0aW9uKGUpe3RyeXtyZXR1cm57ZTohMSx2OmUoKX19Y2F0Y2goZSl7cmV0dXJue2U6ITAsdjplfX19LG5hdmlnYXRvciQxPV9nbG9iYWwubmF2aWdhdG9yLF91c2VyQWdlbnQ9bmF2aWdhdG9yJDEmJm5hdmlnYXRvciQxLnVzZXJBZ2VudHx8IiIsX3Byb21pc2VSZXNvbHZlPWZ1bmN0aW9uKGUsdCl7aWYoX2FuT2JqZWN0KGUpLF9pc09iamVjdCh0KSYmdC5jb25zdHJ1Y3Rvcj09PWUpcmV0dXJuIHQ7dmFyIG49X25ld1Byb21pc2VDYXBhYmlsaXR5LmYoZSk7cmV0dXJuKDAsbi5yZXNvbHZlKSh0KSxuLnByb21pc2V9LF9yZWRlZmluZUFsbD1mdW5jdGlvbihlLHQsbil7Zm9yKHZhciByIGluIHQpX3JlZGVmaW5lKGUscix0W3JdLG4pO3JldHVybiBlfSxTUEVDSUVTJDE9X3drcygic3BlY2llcyIpLF9zZXRTcGVjaWVzPWZ1bmN0aW9uKGUpe3ZhciB0PV9nbG9iYWxbZV07X2Rlc2NyaXB0b3JzJiZ0JiYhdFtTUEVDSUVTJDFdJiZfb2JqZWN0RHAuZih0LFNQRUNJRVMkMSx7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzfX0pfSxJVEVSQVRPUiQ0PV93a3MoIml0ZXJhdG9yIiksU0FGRV9DTE9TSU5HPSExO3RyeXt2YXIgcml0ZXI9WzddW0lURVJBVE9SJDRdKCk7cml0ZXIucmV0dXJuPWZ1bmN0aW9uKCl7U0FGRV9DTE9TSU5HPSEwfX1jYXRjaChlKXt9dmFyIF9pdGVyRGV0ZWN0PWZ1bmN0aW9uKGUsdCl7aWYoIXQmJiFTQUZFX0NMT1NJTkcpcmV0dXJuITE7dmFyIG49ITE7dHJ5e3ZhciByPVs3XSxpPXJbSVRFUkFUT1IkNF0oKTtpLm5leHQ9ZnVuY3Rpb24oKXtyZXR1cm57ZG9uZTpuPSEwfX0scltJVEVSQVRPUiQ0XT1mdW5jdGlvbigpe3JldHVybiBpfSxlKHIpfWNhdGNoKGUpe31yZXR1cm4gbn0sdGFzaz1fdGFzay5zZXQsbWljcm90YXNrPV9taWNyb3Rhc2soKSxQUk9NSVNFPSJQcm9taXNlIixUeXBlRXJyb3IkMT1fZ2xvYmFsLlR5cGVFcnJvcixwcm9jZXNzJDE9X2dsb2JhbC5wcm9jZXNzLHZlcnNpb25zPXByb2Nlc3MkMSYmcHJvY2VzcyQxLnZlcnNpb25zLHY4PXZlcnNpb25zJiZ2ZXJzaW9ucy52OHx8IiIsJFByb21pc2U9X2dsb2JhbFtQUk9NSVNFXSxpc05vZGU9InByb2Nlc3MiPT1fY2xhc3NvZihwcm9jZXNzJDEpLGVtcHR5PWZ1bmN0aW9uKCl7fSxJbnRlcm5hbCxuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHksT3duUHJvbWlzZUNhcGFiaWxpdHksV3JhcHBlcixuZXdQcm9taXNlQ2FwYWJpbGl0eT1uZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHk9X25ld1Byb21pc2VDYXBhYmlsaXR5LmYsVVNFX05BVElWRT0hIWZ1bmN0aW9uKCl7dHJ5e3ZhciBlPSRQcm9taXNlLnJlc29sdmUoMSksdD0oZS5jb25zdHJ1Y3Rvcj17fSlbX3drcygic3BlY2llcyIpXT1mdW5jdGlvbihlKXtlKGVtcHR5LGVtcHR5KX07cmV0dXJuKGlzTm9kZXx8ImZ1bmN0aW9uIj09dHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCkmJmUudGhlbihlbXB0eSlpbnN0YW5jZW9mIHQmJjAhPT12OC5pbmRleE9mKCI2LjYiKSYmLTE9PT1fdXNlckFnZW50LmluZGV4T2YoIkNocm9tZS82NiIpfWNhdGNoKGUpe319KCksaXNUaGVuYWJsZT1mdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4hKCFfaXNPYmplY3QoZSl8fCJmdW5jdGlvbiIhPXR5cGVvZih0PWUudGhlbikpJiZ0fSxub3RpZnk9ZnVuY3Rpb24obCxuKXtpZighbC5fbil7bC5fbj0hMDt2YXIgcj1sLl9jO21pY3JvdGFzayhmdW5jdGlvbigpe2Zvcih2YXIgYz1sLl92LHU9MT09bC5fcyxlPTAsdD1mdW5jdGlvbihlKXt2YXIgdCxuLHIsaT11P2Uub2s6ZS5mYWlsLG89ZS5yZXNvbHZlLGE9ZS5yZWplY3Qscz1lLmRvbWFpbjt0cnl7aT8odXx8KDI9PWwuX2gmJm9uSGFuZGxlVW5oYW5kbGVkKGwpLGwuX2g9MSksITA9PT1pP3Q9YzoocyYmcy5lbnRlcigpLHQ9aShjKSxzJiYocy5leGl0KCkscj0hMCkpLHQ9PT1lLnByb21pc2U/YShUeXBlRXJyb3IkMSgiUHJvbWlzZS1jaGFpbiBjeWNsZSIpKToobj1pc1RoZW5hYmxlKHQpKT9uLmNhbGwodCxvLGEpOm8odCkpOmEoYyl9Y2F0Y2goZSl7cyYmIXImJnMuZXhpdCgpLGEoZSl9fTtyLmxlbmd0aD5lOyl0KHJbZSsrXSk7bC5fYz1bXSxsLl9uPSExLG4mJiFsLl9oJiZvblVuaGFuZGxlZChsKX0pfX0sb25VbmhhbmRsZWQ9ZnVuY3Rpb24obyl7dGFzay5jYWxsKF9nbG9iYWwsZnVuY3Rpb24oKXt2YXIgZSx0LG4scj1vLl92LGk9aXNVbmhhbmRsZWQobyk7aWYoaSYmKGU9X3BlcmZvcm0oZnVuY3Rpb24oKXtpc05vZGU/cHJvY2VzcyQxLmVtaXQoInVuaGFuZGxlZFJlamVjdGlvbiIscixvKToodD1fZ2xvYmFsLm9udW5oYW5kbGVkcmVqZWN0aW9uKT90KHtwcm9taXNlOm8scmVhc29uOnJ9KToobj1fZ2xvYmFsLmNvbnNvbGUpJiZuLmVycm9yJiZuLmVycm9yKCJVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24iLHIpfSksby5faD1pc05vZGV8fGlzVW5oYW5kbGVkKG8pPzI6MSksby5fYT12b2lkIDAsaSYmZS5lKXRocm93IGUudn0pfSxpc1VuaGFuZGxlZD1mdW5jdGlvbihlKXtyZXR1cm4gMSE9PWUuX2gmJjA9PT0oZS5fYXx8ZS5fYykubGVuZ3RofSxvbkhhbmRsZVVuaGFuZGxlZD1mdW5jdGlvbih0KXt0YXNrLmNhbGwoX2dsb2JhbCxmdW5jdGlvbigpe3ZhciBlO2lzTm9kZT9wcm9jZXNzJDEuZW1pdCgicmVqZWN0aW9uSGFuZGxlZCIsdCk6KGU9X2dsb2JhbC5vbnJlamVjdGlvbmhhbmRsZWQpJiZlKHtwcm9taXNlOnQscmVhc29uOnQuX3Z9KX0pfSwkcmVqZWN0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dC5fZHx8KHQuX2Q9ITAsKHQ9dC5fd3x8dCkuX3Y9ZSx0Ll9zPTIsdC5fYXx8KHQuX2E9dC5fYy5zbGljZSgpKSxub3RpZnkodCwhMCkpfSwkcmVzb2x2ZT1mdW5jdGlvbihlKXt2YXIgbixyPXRoaXM7aWYoIXIuX2Qpe3IuX2Q9ITAscj1yLl93fHxyO3RyeXtpZihyPT09ZSl0aHJvdyBUeXBlRXJyb3IkMSgiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGYiKTsobj1pc1RoZW5hYmxlKGUpKT9taWNyb3Rhc2soZnVuY3Rpb24oKXt2YXIgdD17X3c6cixfZDohMX07dHJ5e24uY2FsbChlLF9jdHgoJHJlc29sdmUsdCwxKSxfY3R4KCRyZWplY3QsdCwxKSl9Y2F0Y2goZSl7JHJlamVjdC5jYWxsKHQsZSl9fSk6KHIuX3Y9ZSxyLl9zPTEsbm90aWZ5KHIsITEpKX1jYXRjaChlKXskcmVqZWN0LmNhbGwoe193OnIsX2Q6ITF9LGUpfX19O1VTRV9OQVRJVkV8fCgkUHJvbWlzZT1mdW5jdGlvbihlKXtfYW5JbnN0YW5jZSh0aGlzLCRQcm9taXNlLFBST01JU0UsIl9oIiksX2FGdW5jdGlvbihlKSxJbnRlcm5hbC5jYWxsKHRoaXMpO3RyeXtlKF9jdHgoJHJlc29sdmUsdGhpcywxKSxfY3R4KCRyZWplY3QsdGhpcywxKSl9Y2F0Y2goZSl7JHJlamVjdC5jYWxsKHRoaXMsZSl9fSxJbnRlcm5hbD1mdW5jdGlvbihlKXt0aGlzLl9jPVtdLHRoaXMuX2E9dm9pZCAwLHRoaXMuX3M9MCx0aGlzLl9kPSExLHRoaXMuX3Y9dm9pZCAwLHRoaXMuX2g9MCx0aGlzLl9uPSExfSxJbnRlcm5hbC5wcm90b3R5cGU9X3JlZGVmaW5lQWxsKCRQcm9taXNlLnByb3RvdHlwZSx7dGhlbjpmdW5jdGlvbihlLHQpe3ZhciBuPW5ld1Byb21pc2VDYXBhYmlsaXR5KF9zcGVjaWVzQ29uc3RydWN0b3IodGhpcywkUHJvbWlzZSkpO3JldHVybiBuLm9rPSJmdW5jdGlvbiIhPXR5cGVvZiBlfHxlLG4uZmFpbD0iZnVuY3Rpb24iPT10eXBlb2YgdCYmdCxuLmRvbWFpbj1pc05vZGU/cHJvY2VzcyQxLmRvbWFpbjp2b2lkIDAsdGhpcy5fYy5wdXNoKG4pLHRoaXMuX2EmJnRoaXMuX2EucHVzaChuKSx0aGlzLl9zJiZub3RpZnkodGhpcywhMSksbi5wcm9taXNlfSxjYXRjaDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50aGVuKHZvaWQgMCxlKX19KSxPd25Qcm9taXNlQ2FwYWJpbGl0eT1mdW5jdGlvbigpe3ZhciBlPW5ldyBJbnRlcm5hbDt0aGlzLnByb21pc2U9ZSx0aGlzLnJlc29sdmU9X2N0eCgkcmVzb2x2ZSxlLDEpLHRoaXMucmVqZWN0PV9jdHgoJHJlamVjdCxlLDEpfSxfbmV3UHJvbWlzZUNhcGFiaWxpdHkuZj1uZXdQcm9taXNlQ2FwYWJpbGl0eT1mdW5jdGlvbihlKXtyZXR1cm4gZT09PSRQcm9taXNlfHxlPT09V3JhcHBlcj9uZXcgT3duUHJvbWlzZUNhcGFiaWxpdHkoZSk6bmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5KGUpfSksX2V4cG9ydChfZXhwb3J0LkcrX2V4cG9ydC5XK19leHBvcnQuRiohVVNFX05BVElWRSx7UHJvbWlzZTokUHJvbWlzZX0pLF9zZXRUb1N0cmluZ1RhZygkUHJvbWlzZSxQUk9NSVNFKSxfc2V0U3BlY2llcyhQUk9NSVNFKSxXcmFwcGVyPV9jb3JlW1BST01JU0VdLF9leHBvcnQoX2V4cG9ydC5TK19leHBvcnQuRiohVVNFX05BVElWRSxQUk9NSVNFLHtyZWplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3UHJvbWlzZUNhcGFiaWxpdHkodGhpcyk7cmV0dXJuKDAsdC5yZWplY3QpKGUpLHQucHJvbWlzZX19KSxfZXhwb3J0KF9leHBvcnQuUytfZXhwb3J0LkYqKF9saWJyYXJ5fHwhVVNFX05BVElWRSksUFJPTUlTRSx7cmVzb2x2ZTpmdW5jdGlvbihlKXtyZXR1cm4gX3Byb21pc2VSZXNvbHZlKF9saWJyYXJ5JiZ0aGlzPT09V3JhcHBlcj8kUHJvbWlzZTp0aGlzLGUpfX0pLF9leHBvcnQoX2V4cG9ydC5TK19leHBvcnQuRiohKFVTRV9OQVRJVkUmJl9pdGVyRGV0ZWN0KGZ1bmN0aW9uKGUpeyRQcm9taXNlLmFsbChlKS5jYXRjaChlbXB0eSl9KSksUFJPTUlTRSx7YWxsOmZ1bmN0aW9uKGUpe3ZhciBhPXRoaXMsdD1uZXdQcm9taXNlQ2FwYWJpbGl0eShhKSxzPXQucmVzb2x2ZSxjPXQucmVqZWN0LG49X3BlcmZvcm0oZnVuY3Rpb24oKXt2YXIgcj1bXSxpPTAsbz0xO19mb3JPZihlLCExLGZ1bmN0aW9uKGUpe3ZhciB0PWkrKyxuPSExO3IucHVzaCh2b2lkIDApLG8rKyxhLnJlc29sdmUoZSkudGhlbihmdW5jdGlvbihlKXtufHwobj0hMCxyW3RdPWUsLS1vfHxzKHIpKX0sYyl9KSwtLW98fHMocil9KTtyZXR1cm4gbi5lJiZjKG4udiksdC5wcm9taXNlfSxyYWNlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1uZXdQcm9taXNlQ2FwYWJpbGl0eSh0KSxyPW4ucmVqZWN0LGk9X3BlcmZvcm0oZnVuY3Rpb24oKXtfZm9yT2YoZSwhMSxmdW5jdGlvbihlKXt0LnJlc29sdmUoZSkudGhlbihuLnJlc29sdmUscil9KX0pO3JldHVybiBpLmUmJnIoaS52KSxuLnByb21pc2V9fSk7dmFyICRpbmNsdWRlcz1fYXJyYXlJbmNsdWRlcyghMCk7X2V4cG9ydChfZXhwb3J0LlAsIkFycmF5Iix7aW5jbHVkZXM6ZnVuY3Rpb24oZSl7cmV0dXJuICRpbmNsdWRlcyh0aGlzLGUsMTxhcmd1bWVudHMubGVuZ3RoP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pLF9hZGRUb1Vuc2NvcGFibGVzKCJpbmNsdWRlcyIpO3ZhciBpc0VudW09X29iamVjdFBpZS5mLF9vYmplY3RUb0FycmF5PWZ1bmN0aW9uKHMpe3JldHVybiBmdW5jdGlvbihlKXtmb3IodmFyIHQsbj1fdG9Jb2JqZWN0KGUpLHI9X29iamVjdEtleXMobiksaT1yLmxlbmd0aCxvPTAsYT1bXTtvPGk7KWlzRW51bS5jYWxsKG4sdD1yW28rK10pJiZhLnB1c2gocz9bdCxuW3RdXTpuW3RdKTtyZXR1cm4gYX19LCR2YWx1ZXM9X29iamVjdFRvQXJyYXkoITEpO19leHBvcnQoX2V4cG9ydC5TLCJPYmplY3QiLHt2YWx1ZXM6ZnVuY3Rpb24oZSl7cmV0dXJuICR2YWx1ZXMoZSl9fSk7dmFyIG9yaWdpbmFsQ29uc29sZT1nbG9iYWwuY29uc29sZTtmdW5jdGlvbiBzZXROYXRpdmVDb25zb2xlKCl7aWYoZ2VuZXJhdGVMZXZlbE1hcCgpLGdsb2JhbC5XWEVudmlyb25tZW50JiYiV2ViIiE9PWdsb2JhbC5XWEVudmlyb25tZW50LnBsYXRmb3JtKWdsb2JhbC5jb25zb2xlPXtkZWJ1ZzpmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtjaGVja0xldmVsKCJkZWJ1ZyIpJiZnbG9iYWwubmF0aXZlTG9nLmFwcGx5KGdsb2JhbCxmb3JtYXQoZSkuY29uY2F0KFsiX19ERUJVRyJdKSl9LGxvZzpmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtjaGVja0xldmVsKCJsb2ciKSYmZ2xvYmFsLm5hdGl2ZUxvZy5hcHBseShnbG9iYWwsZm9ybWF0KGUpLmNvbmNhdChbIl9fTE9HIl0pKX0saW5mbzpmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtjaGVja0xldmVsKCJpbmZvIikmJmdsb2JhbC5uYXRpdmVMb2cuYXBwbHkoZ2xvYmFsLGZvcm1hdChlKS5jb25jYXQoWyJfX0lORk8iXSkpfSx3YXJuOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2NoZWNrTGV2ZWwoIndhcm4iKSYmZ2xvYmFsLm5hdGl2ZUxvZy5hcHBseShnbG9iYWwsZm9ybWF0KGUpLmNvbmNhdChbIl9fV0FSTiJdKSl9LGVycm9yOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2NoZWNrTGV2ZWwoImVycm9yIikmJmdsb2JhbC5uYXRpdmVMb2cuYXBwbHkoZ2xvYmFsLGZvcm1hdChlKS5jb25jYXQoWyJfX0VSUk9SIl0pKX19O2Vsc2V7dmFyIGU9Y29uc29sZS5kZWJ1Zyx0PWNvbnNvbGUubG9nLG49Y29uc29sZS5pbmZvLHI9Y29uc29sZS53YXJuLGk9Y29uc29sZS5lcnJvcjtjb25zb2xlLl9fb3JpX189e2RlYnVnOmUsbG9nOnQsaW5mbzpuLHdhcm46cixlcnJvcjppfSxjb25zb2xlLmRlYnVnPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2NoZWNrTGV2ZWwoImRlYnVnIikmJmNvbnNvbGUuX19vcmlfXy5kZWJ1Zy5hcHBseShjb25zb2xlLGUpfSxjb25zb2xlLmxvZz1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtjaGVja0xldmVsKCJsb2ciKSYmY29uc29sZS5fX29yaV9fLmxvZy5hcHBseShjb25zb2xlLGUpfSxjb25zb2xlLmluZm89ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07Y2hlY2tMZXZlbCgiaW5mbyIpJiZjb25zb2xlLl9fb3JpX18uaW5mby5hcHBseShjb25zb2xlLGUpfSxjb25zb2xlLndhcm49ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07Y2hlY2tMZXZlbCgid2FybiIpJiZjb25zb2xlLl9fb3JpX18ud2Fybi5hcHBseShjb25zb2xlLGUpfSxjb25zb2xlLmVycm9yPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2NoZWNrTGV2ZWwoImVycm9yIikmJmNvbnNvbGUuX19vcmlfXy5lcnJvci5hcHBseShjb25zb2xlLGUpfX19ZnVuY3Rpb24gZm9ybWF0KGUpe3JldHVybiBlLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZT0iW29iamVjdCBvYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS50b0xvd2VyQ2FzZSgpP0pTT04uc3RyaW5naWZ5KGUpOlN0cmluZyhlKX0pfXZhciBvcmlnaW5hbFNldFRpbWVvdXQ9Z2xvYmFsLnNldFRpbWVvdXQsc2V0VGltZW91dE5hdGl2ZT1nbG9iYWwuc2V0VGltZW91dE5hdGl2ZTtmdW5jdGlvbiBzZXROYXRpdmVUaW1lcigpe2lmKHZvaWQgMD09PXNldFRpbWVvdXQmJiJmdW5jdGlvbiI9PXR5cGVvZiBzZXRUaW1lb3V0TmF0aXZlKXt2YXIgbj17fSxyPTA7Z2xvYmFsLnNldFRpbWVvdXQ9ZnVuY3Rpb24oZSx0KXtuWysrcl09ZSxzZXRUaW1lb3V0TmF0aXZlKHIudG9TdHJpbmcoKSx0KX0sZ2xvYmFsLnNldFRpbWVvdXRDYWxsYmFjaz1mdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgbltlXSYmKG5bZV0oKSxkZWxldGUgbltlXSl9fX1zZXROYXRpdmVUaW1lcigpLCJ1bmRlZmluZWQiPT10eXBlb2YgV1hFbnZpcm9ubWVudHx8V1hFbnZpcm9ubWVudC5fX2VuYWJsZV9uYXRpdmVfcHJvbWlzZV9fO3ZhciBmYWN0b3J5PWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKGUpe2UuZXhwb3J0cz1mdW5jdGlvbihlLGEsdCl7dmFyIF89T2JqZWN0LmZyZWV6ZSh7fSk7ZnVuY3Rpb24gRShlKXtyZXR1cm4gbnVsbD09ZX1mdW5jdGlvbiBBKGUpe3JldHVybiBudWxsIT1lfWZ1bmN0aW9uIEkoZSl7cmV0dXJuITA9PT1lfWZ1bmN0aW9uICQoZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlfHwibnVtYmVyIj09dHlwZW9mIGV8fCJzeW1ib2wiPT10eXBlb2YgZXx8ImJvb2xlYW4iPT10eXBlb2YgZX1mdW5jdGlvbiBiKGUpe3JldHVybiBudWxsIT09ZSYmIm9iamVjdCI9PXR5cGVvZiBlfXZhciByPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gZChlKXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PXIuY2FsbChlKX1mdW5jdGlvbiBpKGUpe3ZhciB0PXBhcnNlRmxvYXQoU3RyaW5nKGUpKTtyZXR1cm4gMDw9dCYmTWF0aC5mbG9vcih0KT09PXQmJmlzRmluaXRlKGUpfWZ1bmN0aW9uIHcoZSl7cmV0dXJuIEEoZSkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnRoZW4mJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNhdGNofWZ1bmN0aW9uIG4oZSl7cmV0dXJuIG51bGw9PWU/IiI6QXJyYXkuaXNBcnJheShlKXx8ZChlKSYmZS50b1N0cmluZz09PXI/SlNPTi5zdHJpbmdpZnkoZSxudWxsLDIpOlN0cmluZyhlKX1mdW5jdGlvbiBvKGUpe3ZhciB0PXBhcnNlRmxvYXQoZSk7cmV0dXJuIGlzTmFOKHQpP2U6dH1mdW5jdGlvbiBzKGUsdCl7Zm9yKHZhciBuPU9iamVjdC5jcmVhdGUobnVsbCkscj1lLnNwbGl0KCIsIiksaT0wO2k8ci5sZW5ndGg7aSsrKW5bcltpXV09ITA7cmV0dXJuIHQ/ZnVuY3Rpb24oZSl7cmV0dXJuIG5bZS50b0xvd2VyQ2FzZSgpXX06ZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV19fXMoInNsb3QsY29tcG9uZW50IiwhMCk7dmFyIGw9cygia2V5LHJlZixzbG90LHNsb3Qtc2NvcGUsaXMiKTtmdW5jdGlvbiBrKGUsdCl7aWYoZS5sZW5ndGgpe3ZhciBuPWUuaW5kZXhPZih0KTtpZigtMTxuKXJldHVybiBlLnNwbGljZShuLDEpfX12YXIgYz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIGYoZSx0KXtyZXR1cm4gYy5jYWxsKGUsdCl9ZnVuY3Rpb24gdSh0KXt2YXIgbj1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbltlXXx8KG5bZV09dChlKSl9fXZhciBwPS8tKFx3KS9nLGg9dShmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKHAsZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD90LnRvVXBwZXJDYXNlKCk6IiJ9KX0pLHY9dShmdW5jdGlvbihlKXtyZXR1cm4gZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnNsaWNlKDEpfSksZz0vXEIoW0EtWl0pL2csUz11KGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoZywiLSQxIikudG9Mb3dlckNhc2UoKX0pO3ZhciBtPUZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kP2Z1bmN0aW9uKGUsdCl7cmV0dXJuIGUuYmluZCh0KX06ZnVuY3Rpb24obixyKXtmdW5jdGlvbiBlKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIHQ/MTx0P24uYXBwbHkocixhcmd1bWVudHMpOm4uY2FsbChyLGUpOm4uY2FsbChyKX1yZXR1cm4gZS5fbGVuZ3RoPW4ubGVuZ3RoLGV9O2Z1bmN0aW9uIHkoZSx0KXt0PXR8fDA7Zm9yKHZhciBuPWUubGVuZ3RoLXQscj1uZXcgQXJyYXkobik7bi0tOylyW25dPWVbbit0XTtyZXR1cm4gcn1mdW5jdGlvbiBOKGUsdCl7Zm9yKHZhciBuIGluIHQpZVtuXT10W25dO3JldHVybiBlfWZ1bmN0aW9uIHgoZSl7Zm9yKHZhciB0PXt9LG49MDtuPGUubGVuZ3RoO24rKyllW25dJiZOKHQsZVtuXSk7cmV0dXJuIHR9ZnVuY3Rpb24gQihlLHQsbil7fXZhciBDPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4hMX0sVD1mdW5jdGlvbihlKXtyZXR1cm4gZX07ZnVuY3Rpb24gTyh0LG4pe2lmKHQ9PT1uKXJldHVybiEwO3ZhciBlPWIodCkscj1iKG4pO2lmKCFlfHwhcilyZXR1cm4hZSYmIXImJlN0cmluZyh0KT09PVN0cmluZyhuKTt0cnl7dmFyIGk9QXJyYXkuaXNBcnJheSh0KSxvPUFycmF5LmlzQXJyYXkobik7aWYoaSYmbylyZXR1cm4gdC5sZW5ndGg9PT1uLmxlbmd0aCYmdC5ldmVyeShmdW5jdGlvbihlLHQpe3JldHVybiBPKGUsblt0XSl9KTtpZih0IGluc3RhbmNlb2YgRGF0ZSYmbiBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIHQuZ2V0VGltZSgpPT09bi5nZXRUaW1lKCk7aWYoaXx8bylyZXR1cm4hMTt2YXIgYT1PYmplY3Qua2V5cyh0KSxzPU9iamVjdC5rZXlzKG4pO3JldHVybiBhLmxlbmd0aD09PXMubGVuZ3RoJiZhLmV2ZXJ5KGZ1bmN0aW9uKGUpe3JldHVybiBPKHRbZV0sbltlXSl9KX1jYXRjaChlKXtyZXR1cm4hMX19ZnVuY3Rpb24gUChlLHQpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKWlmKE8oZVtuXSx0KSlyZXR1cm4gbjtyZXR1cm4tMX1mdW5jdGlvbiBEKGUpe3ZhciB0PSExO3JldHVybiBmdW5jdGlvbigpe3R8fCh0PSEwLGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX19dmFyIE09ImRhdGEtc2VydmVyLXJlbmRlcmVkIixqPVsiY29tcG9uZW50IiwiZGlyZWN0aXZlIiwiZmlsdGVyIl0sTD1bImJlZm9yZUNyZWF0ZSIsImNyZWF0ZWQiLCJiZWZvcmVNb3VudCIsIm1vdW50ZWQiLCJiZWZvcmVVcGRhdGUiLCJ1cGRhdGVkIiwiYmVmb3JlRGVzdHJveSIsImRlc3Ryb3llZCIsImFjdGl2YXRlZCIsImRlYWN0aXZhdGVkIiwiZXJyb3JDYXB0dXJlZCIsInNlcnZlclByZWZldGNoIl0sUj17b3B0aW9uTWVyZ2VTdHJhdGVnaWVzOk9iamVjdC5jcmVhdGUobnVsbCksc2lsZW50OiExLHByb2R1Y3Rpb25UaXA6ITEsZGV2dG9vbHM6ITEscGVyZm9ybWFuY2U6ITEsZXJyb3JIYW5kbGVyOm51bGwsd2FybkhhbmRsZXI6bnVsbCxpZ25vcmVkRWxlbWVudHM6W10sa2V5Q29kZXM6T2JqZWN0LmNyZWF0ZShudWxsKSxpc1Jlc2VydmVkVGFnOkMsaXNSZXNlcnZlZEF0dHI6Qyxpc1Vua25vd25FbGVtZW50OkMsZ2V0VGFnTmFtZXNwYWNlOkIscGFyc2VQbGF0Zm9ybVRhZ05hbWU6VCxtdXN0VXNlUHJvcDpDLGFzeW5jOiEwLF9saWZlY3ljbGVIb29rczpMfTtmdW5jdGlvbiBGKGUsdCxuLHIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse3ZhbHVlOm4sZW51bWVyYWJsZTohIXIsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9dmFyIHo9bmV3IFJlZ0V4cCgiW14iKy9hLXpBLVpcdTAwQjdcdTAwQzAtXHUwMEQ2XHUwMEQ4LVx1MDBGNlx1MDBGOC1cdTAzN0RcdTAzN0YtXHUxRkZGXHUyMDBDLVx1MjAwRFx1MjAzRi1cdTIwNDBcdTIwNzAtXHUyMThGXHUyQzAwLVx1MkZFRlx1MzAwMS1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZGRC8uc291cmNlKyIuJF9cXGRdIik7dmFyIFYsVT0iX19wcm90b19fImlue30scT0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyxXPSJ1bmRlZmluZWQiIT10eXBlb2YgV1hFbnZpcm9ubWVudCYmISFXWEVudmlyb25tZW50LnBsYXRmb3JtLEg9VyYmV1hFbnZpcm9ubWVudC5wbGF0Zm9ybS50b0xvd2VyQ2FzZSgpLEc9cSYmd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSxYPUcmJi9tc2llfHRyaWRlbnQvLnRlc3QoRyksWT1HJiYwPEcuaW5kZXhPZigibXNpZSA5LjAiKSxKPUcmJjA8Ry5pbmRleE9mKCJlZGdlLyIpLEs9KEcmJkcuaW5kZXhPZigiYW5kcm9pZCIpLEcmJi9pcGhvbmV8aXBhZHxpcG9kfGlvcy8udGVzdChHKSxHJiYvY2hyb21lXC9cZCsvLnRlc3QoRyksRyYmL3BoYW50b21qcy8udGVzdChHKSxHJiZHLm1hdGNoKC9maXJlZm94XC8oXGQrKS8pLHt9LndhdGNoKTtpZihxKXRyeXt2YXIgWj17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoWiwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe319KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdC1wYXNzaXZlIixudWxsLFopfWNhdGNoKGUpe312YXIgUT1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT1WJiYoVj0hcSYmIVcmJnZvaWQgMCE9PWdsb2JhbCYmKGdsb2JhbC5wcm9jZXNzJiYic2VydmVyIj09PWdsb2JhbC5wcm9jZXNzLmVudi5WVUVfRU5WKSksVn0sZWU9cSYmd2luZG93Ll9fVlVFX0RFVlRPT0xTX0dMT0JBTF9IT09LX187ZnVuY3Rpb24gdGUoZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUmJi9uYXRpdmUgY29kZS8udGVzdChlLnRvU3RyaW5nKCkpfXZhciBuZSxyZT0idW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmdGUoU3ltYm9sKSYmInVuZGVmaW5lZCIhPXR5cGVvZiBSZWZsZWN0JiZ0ZShSZWZsZWN0Lm93bktleXMpO25lPSJ1bmRlZmluZWQiIT10eXBlb2YgU2V0JiZ0ZShTZXQpP1NldDpmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt0aGlzLnNldD1PYmplY3QuY3JlYXRlKG51bGwpfXJldHVybiBlLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24oZSl7cmV0dXJuITA9PT10aGlzLnNldFtlXX0sZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGUpe3RoaXMuc2V0W2VdPSEwfSxlLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuc2V0PU9iamVjdC5jcmVhdGUobnVsbCl9LGV9KCk7dmFyIGllPUIsb2U9MCxhZT1mdW5jdGlvbigpe3RoaXMuaWQ9dm9pZCAwIT09dD90LnVpZCsrOm9lKyssdGhpcy5zdWJzPVtdfTtmdW5jdGlvbiBzZShlKXthZS5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2sucHVzaChlKSxhZS5TaGFyZWRPYmplY3QudGFyZ2V0PWV9ZnVuY3Rpb24gY2UoKXthZS5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2sucG9wKCksYWUuU2hhcmVkT2JqZWN0LnRhcmdldD1hZS5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2tbYWUuU2hhcmVkT2JqZWN0LnRhcmdldFN0YWNrLmxlbmd0aC0xXX1hZS5wcm90b3R5cGUuYWRkU3ViPWZ1bmN0aW9uKGUpe3RoaXMuc3Vicy5wdXNoKGUpfSxhZS5wcm90b3R5cGUucmVtb3ZlU3ViPWZ1bmN0aW9uKGUpe2sodGhpcy5zdWJzLGUpfSxhZS5wcm90b3R5cGUuZGVwZW5kPWZ1bmN0aW9uKCl7YWUuU2hhcmVkT2JqZWN0LnRhcmdldCYmYWUuU2hhcmVkT2JqZWN0LnRhcmdldC5hZGREZXAodGhpcyl9LGFlLnByb3RvdHlwZS5ub3RpZnk9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5zdWJzLnNsaWNlKCksdD0wLG49ZS5sZW5ndGg7dDxuO3QrKyllW3RdLnVwZGF0ZSgpfSxhZS5TaGFyZWRPYmplY3Q9dm9pZCAwIT09dD90Ont9LGFlLlNoYXJlZE9iamVjdC50YXJnZXQ9bnVsbCxhZS5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2s9W107dmFyIHVlPWZ1bmN0aW9uKGUsdCxuLHIsaSxvLGEscyl7dCYmQXJyYXkuaXNBcnJheSh0LmNsYXNzKSYmKHQuY2xhc3M9dC5jbGFzcy5zbGljZSgwKSksdGhpcy50YWc9ZSx0aGlzLmRhdGE9dCx0aGlzLmNoaWxkcmVuPW4sdGhpcy50ZXh0PXIsdGhpcy5lbG09aSx0aGlzLm5zPXZvaWQgMCx0aGlzLmNvbnRleHQ9byx0aGlzLmZuQ29udGV4dD12b2lkIDAsdGhpcy5mbk9wdGlvbnM9dm9pZCAwLHRoaXMuZm5TY29wZUlkPXZvaWQgMCx0aGlzLmtleT10JiZ0LmtleSx0aGlzLmNvbXBvbmVudE9wdGlvbnM9YSx0aGlzLmNvbXBvbmVudEluc3RhbmNlPXZvaWQgMCx0aGlzLnBhcmVudD12b2lkIDAsdGhpcy5yYXc9ITEsdGhpcy5pc1N0YXRpYz0hMSx0aGlzLmlzUm9vdEluc2VydD0hMCx0aGlzLmlzQ29tbWVudD0hMSx0aGlzLmlzQ2xvbmVkPSExLHRoaXMuaXNPbmNlPSExLHRoaXMuYXN5bmNGYWN0b3J5PXMsdGhpcy5hc3luY01ldGE9dm9pZCAwLHRoaXMuaXNBc3luY1BsYWNlaG9sZGVyPSExfSxsZT17Y2hpbGQ6e2NvbmZpZ3VyYWJsZTohMH19O2xlLmNoaWxkLmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbXBvbmVudEluc3RhbmNlfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh1ZS5wcm90b3R5cGUsbGUpO3ZhciBkZT1mdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT0iIik7dmFyIHQ9bmV3IHVlO3JldHVybiB0LnRleHQ9ZSx0LmlzQ29tbWVudD0hMCx0fTtmdW5jdGlvbiBmZShlKXtyZXR1cm4gbmV3IHVlKHZvaWQgMCx2b2lkIDAsdm9pZCAwLFN0cmluZyhlKSl9ZnVuY3Rpb24gcGUoZSl7dmFyIHQ9bmV3IHVlKGUudGFnLGUuZGF0YSxlLmNoaWxkcmVuJiZlLmNoaWxkcmVuLnNsaWNlKCksZS50ZXh0LGUuZWxtLGUuY29udGV4dCxlLmNvbXBvbmVudE9wdGlvbnMsZS5hc3luY0ZhY3RvcnkpO3JldHVybiB0Lm5zPWUubnMsdC5pc1N0YXRpYz1lLmlzU3RhdGljLHQua2V5PWUua2V5LHQuaXNDb21tZW50PWUuaXNDb21tZW50LHQuZm5Db250ZXh0PWUuZm5Db250ZXh0LHQuZm5PcHRpb25zPWUuZm5PcHRpb25zLHQuZm5TY29wZUlkPWUuZm5TY29wZUlkLHQuYXN5bmNNZXRhPWUuYXN5bmNNZXRhLHQuaXNDbG9uZWQ9ITAsdH12YXIgaGU9QXJyYXkucHJvdG90eXBlLHZlPU9iamVjdC5jcmVhdGUoaGUpO1sicHVzaCIsInBvcCIsInNoaWZ0IiwidW5zaGlmdCIsInNwbGljZSIsInNvcnQiLCJyZXZlcnNlIl0uZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgcz1oZVthXTtGKHZlLGEsZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoO24tLTspdFtuXT1lW25dO3ZhciByLGk9cy5hcHBseSh0aGlzLHQpLG89dGhpcy5fX29iX187c3dpdGNoKGEpe2Nhc2UicHVzaCI6Y2FzZSJ1bnNoaWZ0IjpyPXQ7YnJlYWs7Y2FzZSJzcGxpY2UiOnI9dC5zbGljZSgyKX1yZXR1cm4gciYmby5vYnNlcnZlQXJyYXkociksby5kZXAubm90aWZ5KCksaX0pfSk7dmFyIGdlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZlKSxtZT0hMDtmdW5jdGlvbiB5ZShlKXttZT1lfXZhciBfZT1mdW5jdGlvbihlKXt2YXIgdDt0aGlzLnZhbHVlPWUsdGhpcy5kZXA9bmV3IGFlLHRoaXMudm1Db3VudD0wLEYoZSwiX19vYl9fIix0aGlzKSxBcnJheS5pc0FycmF5KGUpPyhVPyh0PXZlLGUuX19wcm90b19fPXQpOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9MCxpPW4ubGVuZ3RoO3I8aTtyKyspe3ZhciBvPW5bcl07RihlLG8sdFtvXSl9fShlLHZlLGdlKSx0aGlzLm9ic2VydmVBcnJheShlKSk6dGhpcy53YWxrKGUpfTtmdW5jdGlvbiBiZShlLHQpe3ZhciBuO2lmKGIoZSkmJiEoZSBpbnN0YW5jZW9mIHVlKSlyZXR1cm4gZihlLCJfX29iX18iKSYmZS5fX29iX18gaW5zdGFuY2VvZiBfZT9uPWUuX19vYl9fOm1lJiYhUSgpJiYoQXJyYXkuaXNBcnJheShlKXx8ZChlKSkmJk9iamVjdC5pc0V4dGVuc2libGUoZSkmJiFlLl9pc1Z1ZSYmKG49bmV3IF9lKGUpKSx0JiZuJiZuLnZtQ291bnQrKyxufWZ1bmN0aW9uIHdlKG4sZSxyLHQsaSl7dmFyIG89bmV3IGFlLGE9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpO2lmKCFhfHwhMSE9PWEuY29uZmlndXJhYmxlKXt2YXIgcz1hJiZhLmdldCxjPWEmJmEuc2V0O3MmJiFjfHwyIT09YXJndW1lbnRzLmxlbmd0aHx8KHI9bltlXSk7dmFyIHU9IWkmJmJlKHIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3ZhciBlPXM/cy5jYWxsKG4pOnI7cmV0dXJuIGFlLlNoYXJlZE9iamVjdC50YXJnZXQmJihvLmRlcGVuZCgpLHUmJih1LmRlcC5kZXBlbmQoKSxBcnJheS5pc0FycmF5KGUpJiZmdW5jdGlvbiBlKHQpe2Zvcih2YXIgbj12b2lkIDAscj0wLGk9dC5sZW5ndGg7cjxpO3IrKykobj10W3JdKSYmbi5fX29iX18mJm4uX19vYl9fLmRlcC5kZXBlbmQoKSxBcnJheS5pc0FycmF5KG4pJiZlKG4pfShlKSkpLGV9LHNldDpmdW5jdGlvbihlKXt2YXIgdD1zP3MuY2FsbChuKTpyO2U9PT10fHxlIT1lJiZ0IT10fHxzJiYhY3x8KGM/Yy5jYWxsKG4sZSk6cj1lLHU9IWkmJmJlKGUpLG8ubm90aWZ5KCkpfX0pfX1mdW5jdGlvbiBrZShlLHQsbil7aWYoQXJyYXkuaXNBcnJheShlKSYmaSh0KSlyZXR1cm4gZS5sZW5ndGg9TWF0aC5tYXgoZS5sZW5ndGgsdCksZS5zcGxpY2UodCwxLG4pLG47aWYodCBpbiBlJiYhKHQgaW4gT2JqZWN0LnByb3RvdHlwZSkpcmV0dXJuIGVbdF09bjt2YXIgcj1lLl9fb2JfXztyZXR1cm4gZS5faXNWdWV8fHImJnIudm1Db3VudD9uOnI/KHdlKHIudmFsdWUsdCxuKSxyLmRlcC5ub3RpZnkoKSxuKTplW3RdPW59ZnVuY3Rpb24gU2UoZSx0KXtpZihBcnJheS5pc0FycmF5KGUpJiZpKHQpKWUuc3BsaWNlKHQsMSk7ZWxzZXt2YXIgbj1lLl9fb2JfXztlLl9pc1Z1ZXx8biYmbi52bUNvdW50fHxmKGUsdCkmJihkZWxldGUgZVt0XSxuJiZuLmRlcC5ub3RpZnkoKSl9fV9lLnByb3RvdHlwZS53YWxrPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDtuKyspd2UoZSx0W25dKX0sX2UucHJvdG90eXBlLm9ic2VydmVBcnJheT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspYmUoZVt0XSl9O3ZhciB4ZT1SLm9wdGlvbk1lcmdlU3RyYXRlZ2llcztmdW5jdGlvbiBDZShlLHQpe2lmKCF0KXJldHVybiBlO2Zvcih2YXIgbixyLGksbz1yZT9SZWZsZWN0Lm93bktleXModCk6T2JqZWN0LmtleXModCksYT0wO2E8by5sZW5ndGg7YSsrKSJfX29iX18iIT09KG49b1thXSkmJihyPWVbbl0saT10W25dLGYoZSxuKT9yIT09aSYmZChyKSYmZChpKSYmQ2UocixpKTprZShlLG4saSkpO3JldHVybiBlfWZ1bmN0aW9uIFRlKG4scixpKXtyZXR1cm4gaT9mdW5jdGlvbigpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiByP3IuY2FsbChpLGkpOnIsdD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmNhbGwoaSxpKTpuO3JldHVybiBlP0NlKGUsdCk6dH06cj9uP2Z1bmN0aW9uKCl7cmV0dXJuIENlKCJmdW5jdGlvbiI9PXR5cGVvZiByP3IuY2FsbCh0aGlzLHRoaXMpOnIsImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5jYWxsKHRoaXMsdGhpcyk6bil9OnI6bn1mdW5jdGlvbiBPZShlLHQpe3ZhciBuPXQ/ZT9lLmNvbmNhdCh0KTpBcnJheS5pc0FycmF5KHQpP3Q6W3RdOmU7cmV0dXJuIG4/ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoO24rKyktMT09PXQuaW5kZXhPZihlW25dKSYmdC5wdXNoKGVbbl0pO3JldHVybiB0fShuKTpufWZ1bmN0aW9uIEVlKGUsdCxuLHIpe3ZhciBpPU9iamVjdC5jcmVhdGUoZXx8bnVsbCk7cmV0dXJuIHQ/TihpLHQpOml9eGUuZGF0YT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4/VGUoZSx0LG4pOnQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6VGUoZSx0KX0sTC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3hlW2VdPU9lfSksai5mb3JFYWNoKGZ1bmN0aW9uKGUpe3hlW2UrInMiXT1FZX0pLHhlLndhdGNoPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9PT1LJiYoZT12b2lkIDApLHQ9PT1LJiYodD12b2lkIDApLCF0KXJldHVybiBPYmplY3QuY3JlYXRlKGV8fG51bGwpO2lmKCFlKXJldHVybiB0O3ZhciBpPXt9O2Zvcih2YXIgbyBpbiBOKGksZSksdCl7dmFyIGE9aVtvXSxzPXRbb107YSYmIUFycmF5LmlzQXJyYXkoYSkmJihhPVthXSksaVtvXT1hP2EuY29uY2F0KHMpOkFycmF5LmlzQXJyYXkocyk/czpbc119cmV0dXJuIGl9LHhlLnByb3BzPXhlLm1ldGhvZHM9eGUuaW5qZWN0PXhlLmNvbXB1dGVkPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKCFlKXJldHVybiB0O3ZhciBpPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIE4oaSxlKSx0JiZOKGksdCksaX0seGUucHJvdmlkZT1UZTt2YXIgQWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dD9lOnR9O2Z1bmN0aW9uIEllKG4scixpKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgciYmKHI9ci5vcHRpb25zKSxmdW5jdGlvbihlLHQpe3ZhciBuPWUucHJvcHM7aWYobil7dmFyIHIsaSxvPXt9O2lmKEFycmF5LmlzQXJyYXkobikpZm9yKHI9bi5sZW5ndGg7ci0tOykic3RyaW5nIj09dHlwZW9mKGk9bltyXSkmJihvW2goaSldPXt0eXBlOm51bGx9KTtlbHNlIGlmKGQobikpZm9yKHZhciBhIGluIG4paT1uW2FdLG9baChhKV09ZChpKT9pOnt0eXBlOml9O2UucHJvcHM9b319KHIpLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5pbmplY3Q7aWYobil7dmFyIHI9ZS5pbmplY3Q9e307aWYoQXJyYXkuaXNBcnJheShuKSlmb3IodmFyIGk9MDtpPG4ubGVuZ3RoO2krKylyW25baV1dPXtmcm9tOm5baV19O2Vsc2UgaWYoZChuKSlmb3IodmFyIG8gaW4gbil7dmFyIGE9bltvXTtyW29dPWQoYSk/Tih7ZnJvbTpvfSxhKTp7ZnJvbTphfX19fShyKSxmdW5jdGlvbihlKXt2YXIgdD1lLmRpcmVjdGl2ZXM7aWYodClmb3IodmFyIG4gaW4gdCl7dmFyIHI9dFtuXTsiZnVuY3Rpb24iPT10eXBlb2YgciYmKHRbbl09e2JpbmQ6cix1cGRhdGU6cn0pfX0ociksIXIuX2Jhc2UmJihyLmV4dGVuZHMmJihuPUllKG4sci5leHRlbmRzLGkpKSxyLm1peGlucykpZm9yKHZhciBlPTAsdD1yLm1peGlucy5sZW5ndGg7ZTx0O2UrKyluPUllKG4sci5taXhpbnNbZV0saSk7dmFyIG8sYT17fTtmb3IobyBpbiBuKXMobyk7Zm9yKG8gaW4gcilmKG4sbyl8fHMobyk7ZnVuY3Rpb24gcyhlKXt2YXIgdD14ZVtlXXx8QWU7YVtlXT10KG5bZV0scltlXSxpLGUpfXJldHVybiBhfWZ1bmN0aW9uICRlKGUsdCxuLHIpe2lmKCJzdHJpbmciPT10eXBlb2Ygbil7dmFyIGk9ZVt0XTtpZihmKGksbikpcmV0dXJuIGlbbl07dmFyIG89aChuKTtpZihmKGksbykpcmV0dXJuIGlbb107dmFyIGE9dihvKTtyZXR1cm4gZihpLGEpP2lbYV06aVtuXXx8aVtvXXx8aVthXX19ZnVuY3Rpb24gUGUoZSx0LG4scil7dmFyIGk9dFtlXSxvPSFmKG4sZSksYT1uW2VdLHM9TGUoQm9vbGVhbixpLnR5cGUpO2lmKC0xPHMpaWYobyYmIWYoaSwiZGVmYXVsdCIpKWE9ITE7ZWxzZSBpZigiIj09PWF8fGE9PT1TKGUpKXt2YXIgYz1MZShTdHJpbmcsaS50eXBlKTsoYzwwfHxzPGMpJiYoYT0hMCl9aWYodm9pZCAwPT09YSl7YT1mdW5jdGlvbihlLHQsbil7aWYoIWYodCwiZGVmYXVsdCIpKXJldHVybjt2YXIgcj10LmRlZmF1bHQ7aWYoZSYmZS4kb3B0aW9ucy5wcm9wc0RhdGEmJnZvaWQgMD09PWUuJG9wdGlvbnMucHJvcHNEYXRhW25dJiZ2b2lkIDAhPT1lLl9wcm9wc1tuXSlyZXR1cm4gZS5fcHJvcHNbbl07cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHImJiJGdW5jdGlvbiIhPT1NZSh0LnR5cGUpP3IuY2FsbChlKTpyfShyLGksZSk7dmFyIHU9bWU7eWUoITApLGJlKGEpLHllKHUpfXJldHVybiBhfWZ1bmN0aW9uIE1lKGUpe3ZhciB0PWUmJmUudG9TdHJpbmcoKS5tYXRjaCgvXlxzKmZ1bmN0aW9uIChcdyspLyk7cmV0dXJuIHQ/dFsxXToiIn1mdW5jdGlvbiBqZShlLHQpe3JldHVybiBNZShlKT09PU1lKHQpfWZ1bmN0aW9uIExlKGUsdCl7aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIGplKHQsZSk/MDotMTtmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjtuKyspaWYoamUodFtuXSxlKSlyZXR1cm4gbjtyZXR1cm4tMX1mdW5jdGlvbiBOZShlLHQsbil7c2UoKTt0cnl7aWYodClmb3IodmFyIHI9dDtyPXIuJHBhcmVudDspe3ZhciBpPXIuJG9wdGlvbnMuZXJyb3JDYXB0dXJlZDtpZihpKWZvcih2YXIgbz0wO288aS5sZW5ndGg7bysrKXRyeXtpZighMT09PWlbb10uY2FsbChyLGUsdCxuKSlyZXR1cm59Y2F0Y2goZSl7RGUoZSxyLCJlcnJvckNhcHR1cmVkIGhvb2siKX19RGUoZSx0LG4pfWZpbmFsbHl7Y2UoKX19ZnVuY3Rpb24gQmUoZSx0LG4scixpKXt2YXIgbzt0cnl7KG89bj9lLmFwcGx5KHQsbik6ZS5jYWxsKHQpKSYmIW8uX2lzVnVlJiZ3KG8pJiYhby5faGFuZGxlZCYmKG8uY2F0Y2goZnVuY3Rpb24oZSl7cmV0dXJuIE5lKGUscixpKyIgKFByb21pc2UvYXN5bmMpIil9KSxvLl9oYW5kbGVkPSEwKX1jYXRjaChlKXtOZShlLHIsaSl9cmV0dXJuIG99ZnVuY3Rpb24gRGUodCxlLG4pe2lmKFIuZXJyb3JIYW5kbGVyKXRyeXtyZXR1cm4gUi5lcnJvckhhbmRsZXIuY2FsbChudWxsLHQsZSxuKX1jYXRjaChlKXtlIT09dCYmUmUoZSxudWxsLCJjb25maWcuZXJyb3JIYW5kbGVyIil9UmUodCxlLG4pfWZ1bmN0aW9uIFJlKGUsdCxuKXtpZighcSYmIVd8fCJ1bmRlZmluZWQiPT10eXBlb2YgY29uc29sZSl0aHJvdyBlO2NvbnNvbGUuZXJyb3IoZSl9dmFyIEZlPVtdLHplPSExO2Z1bmN0aW9uIFZlKCl7emU9ITE7Zm9yKHZhciBlPUZlLnNsaWNlKDApLHQ9RmUubGVuZ3RoPTA7dDxlLmxlbmd0aDt0KyspZVt0XSgpfXZhciBVZT1mdW5jdGlvbigpe3NldFRpbWVvdXQoVmUsMCl9O2Z1bmN0aW9uIHFlKGUsdCl7dmFyIG47aWYoRmUucHVzaChmdW5jdGlvbigpe2lmKGUpdHJ5e2UuY2FsbCh0KX1jYXRjaChlKXtOZShlLHQsIm5leHRUaWNrIil9ZWxzZSBuJiZuKHQpfSksemV8fCh6ZT0hMCxVZSgpKSwhZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBQcm9taXNlKXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlKXtuPWV9KX12YXIgV2U9bmV3IG5lO2Z1bmN0aW9uIEhlKGUpeyFmdW5jdGlvbiBlKHQsbil7dmFyIHIsaTt2YXIgbz1BcnJheS5pc0FycmF5KHQpO2lmKCFvJiYhYih0KXx8T2JqZWN0LmlzRnJvemVuKHQpfHx0IGluc3RhbmNlb2YgdWUpcmV0dXJuO2lmKHQuX19vYl9fKXt2YXIgYT10Ll9fb2JfXy5kZXAuaWQ7aWYobi5oYXMoYSkpcmV0dXJuO24uYWRkKGEpfWlmKG8pZm9yKHI9dC5sZW5ndGg7ci0tOyllKHRbcl0sbik7ZWxzZSBmb3IoaT1PYmplY3Qua2V5cyh0KSxyPWkubGVuZ3RoO3ItLTspZSh0W2lbcl1dLG4pfShlLFdlKSxXZS5jbGVhcigpfXZhciBHZT11KGZ1bmN0aW9uKGUpe3ZhciB0PSImIj09PWUuY2hhckF0KDApLG49In4iPT09KGU9dD9lLnNsaWNlKDEpOmUpLmNoYXJBdCgwKSxyPSIhIj09PShlPW4/ZS5zbGljZSgxKTplKS5jaGFyQXQoMCk7cmV0dXJue25hbWU6ZT1yP2Uuc2xpY2UoMSk6ZSxvbmNlOm4sY2FwdHVyZTpyLHBhc3NpdmU6dH19KTtmdW5jdGlvbiBYZShlLGkpe2Z1bmN0aW9uIG8oKXt2YXIgZT1hcmd1bWVudHMsdD1vLmZucztpZighQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gQmUodCxudWxsLGFyZ3VtZW50cyxpLCJ2LW9uIGhhbmRsZXIiKTtmb3IodmFyIG49dC5zbGljZSgpLHI9MDtyPG4ubGVuZ3RoO3IrKylCZShuW3JdLG51bGwsZSxpLCJ2LW9uIGhhbmRsZXIiKX1yZXR1cm4gby5mbnM9ZSxvfWZ1bmN0aW9uIFllKGUsdCxuLHIsaSxvKXt2YXIgYSxzLGMsdSxsO2ZvcihhIGluIGUpcz1jPWVbYV0sdT10W2FdLGw9R2UoYSksZChzKSYmKGM9cy5oYW5kbGVyLGwucGFyYW1zPXMucGFyYW1zKSxFKGMpfHwoRSh1KT8oRShjLmZucykmJihjPWVbYV09WGUoYyxvKSksSShsLm9uY2UpJiYoYz1lW2FdPWkobC5uYW1lLGMsbC5jYXB0dXJlKSksbihsLm5hbWUsYyxsLmNhcHR1cmUsbC5wYXNzaXZlLGwucGFyYW1zKSk6YyE9PXUmJih1LmZucz1jLGVbYV09dSkpO2ZvcihhIGluIHQpRShlW2FdKSYmcigobD1HZShhKSkubmFtZSx0W2FdLGwuY2FwdHVyZSl9ZnVuY3Rpb24gSmUoZSx0LG4pe3ZhciByO2UgaW5zdGFuY2VvZiB1ZSYmKGU9ZS5kYXRhLmhvb2t8fChlLmRhdGEuaG9vaz17fSkpO3ZhciBpPWVbdF07ZnVuY3Rpb24gbygpe24uYXBwbHkodGhpcyxhcmd1bWVudHMpLGsoci5mbnMsbyl9RShpKT9yPVhlKFtvXSk6QShpLmZucykmJkkoaS5tZXJnZWQpPyhyPWkpLmZucy5wdXNoKG8pOnI9WGUoW2ksb10pLHIubWVyZ2VkPSEwLGVbdF09cn1mdW5jdGlvbiBLZShlLHQsbixyLGkpe2lmKEEodCkpe2lmKGYodCxuKSlyZXR1cm4gZVtuXT10W25dLGl8fGRlbGV0ZSB0W25dLCEwO2lmKGYodCxyKSlyZXR1cm4gZVtuXT10W3JdLGl8fGRlbGV0ZSB0W3JdLCEwfXJldHVybiExfWZ1bmN0aW9uIFplKGUpe3JldHVybiAkKGUpP1tmZShlKV06QXJyYXkuaXNBcnJheShlKT9mdW5jdGlvbiBlKHQsbil7dmFyIHI9W107dmFyIGksbyxhLHM7Zm9yKGk9MDtpPHQubGVuZ3RoO2krKylFKG89dFtpXSl8fCJib29sZWFuIj09dHlwZW9mIG98fChhPXIubGVuZ3RoLTEscz1yW2FdLEFycmF5LmlzQXJyYXkobyk/MDxvLmxlbmd0aCYmKFFlKChvPWUobywobnx8IiIpKyJfIitpKSlbMF0pJiZRZShzKSYmKHJbYV09ZmUocy50ZXh0K29bMF0udGV4dCksby5zaGlmdCgpKSxyLnB1c2guYXBwbHkocixvKSk6JChvKT9RZShzKT9yW2FdPWZlKHMudGV4dCtvKToiIiE9PW8mJnIucHVzaChmZShvKSk6UWUobykmJlFlKHMpP3JbYV09ZmUocy50ZXh0K28udGV4dCk6KEkodC5faXNWTGlzdCkmJkEoby50YWcpJiZFKG8ua2V5KSYmQShuKSYmKG8ua2V5PSJfX3ZsaXN0IituKyJfIitpKyJfXyIpLHIucHVzaChvKSkpO3JldHVybiByfShlKTp2b2lkIDB9ZnVuY3Rpb24gUWUoZSl7cmV0dXJuIEEoZSkmJkEoZS50ZXh0KSYmITE9PT1lLmlzQ29tbWVudH1mdW5jdGlvbiBldChlKXt2YXIgdD1lLiRvcHRpb25zLnByb3ZpZGU7dCYmKGUuX3Byb3ZpZGVkPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3QuY2FsbChlKTp0KX1mdW5jdGlvbiB0dCh0KXt2YXIgbj1udCh0LiRvcHRpb25zLmluamVjdCx0KTtuJiYoeWUoITEpLE9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oZSl7d2UodCxlLG5bZV0pfSkseWUoITApKX1mdW5jdGlvbiBudChlLHQpe2lmKGUpe2Zvcih2YXIgbj1PYmplY3QuY3JlYXRlKG51bGwpLHI9cmU/UmVmbGVjdC5vd25LZXlzKGUpOk9iamVjdC5rZXlzKGUpLGk9MDtpPHIubGVuZ3RoO2krKyl7dmFyIG89cltpXTtpZigiX19vYl9fIiE9PW8pe2Zvcih2YXIgYT1lW29dLmZyb20scz10O3M7KXtpZihzLl9wcm92aWRlZCYmZihzLl9wcm92aWRlZCxhKSl7bltvXT1zLl9wcm92aWRlZFthXTticmVha31zPXMuJHBhcmVudH1pZighcyYmImRlZmF1bHQiaW4gZVtvXSl7dmFyIGM9ZVtvXS5kZWZhdWx0O25bb109ImZ1bmN0aW9uIj09dHlwZW9mIGM/Yy5jYWxsKHQpOmN9fX1yZXR1cm4gbn19ZnVuY3Rpb24gcnQoZSx0KXtpZighZXx8IWUubGVuZ3RoKXJldHVybnt9O2Zvcih2YXIgbj17fSxyPTAsaT1lLmxlbmd0aDtyPGk7cisrKXt2YXIgbz1lW3JdLGE9by5kYXRhO2lmKGEmJmEuYXR0cnMmJmEuYXR0cnMuc2xvdCYmZGVsZXRlIGEuYXR0cnMuc2xvdCxvLmNvbnRleHQhPT10JiZvLmZuQ29udGV4dCE9PXR8fCFhfHxudWxsPT1hLnNsb3Qpby5hc3luY01ldGEmJm8uYXN5bmNNZXRhLmRhdGEmJiJwYWdlIj09PW8uYXN5bmNNZXRhLmRhdGEuc2xvdD8obi5wYWdlfHwobi5wYWdlPVtdKSkucHVzaChvKToobi5kZWZhdWx0fHwobi5kZWZhdWx0PVtdKSkucHVzaChvKTtlbHNle3ZhciBzPWEuc2xvdCxjPW5bc118fChuW3NdPVtdKTsidGVtcGxhdGUiPT09by50YWc/Yy5wdXNoLmFwcGx5KGMsby5jaGlsZHJlbnx8W10pOmMucHVzaChvKX19Zm9yKHZhciB1IGluIG4pblt1XS5ldmVyeShpdCkmJmRlbGV0ZSBuW3VdO3JldHVybiBufWZ1bmN0aW9uIGl0KGUpe3JldHVybiBlLmlzQ29tbWVudCYmIWUuYXN5bmNGYWN0b3J5fHwiICI9PT1lLnRleHR9ZnVuY3Rpb24gb3QoZSx0LG4pe3ZhciByLGk9MDxPYmplY3Qua2V5cyh0KS5sZW5ndGgsbz1lPyEhZS4kc3RhYmxlOiFpLGE9ZSYmZS4ka2V5O2lmKGUpe2lmKGUuX25vcm1hbGl6ZWQpcmV0dXJuIGUuX25vcm1hbGl6ZWQ7aWYobyYmbiYmbiE9PV8mJmE9PT1uLiRrZXkmJiFpJiYhbi4kaGFzTm9ybWFsKXJldHVybiBuO2Zvcih2YXIgcyBpbiByPXt9LGUpZVtzXSYmIiQiIT09c1swXSYmKHJbc109YXQodCxzLGVbc10pKX1lbHNlIHI9e307Zm9yKHZhciBjIGluIHQpYyBpbiByfHwocltjXT1zdCh0LGMpKTtyZXR1cm4gZSYmT2JqZWN0LmlzRXh0ZW5zaWJsZShlKSYmKGUuX25vcm1hbGl6ZWQ9ciksRihyLCIkc3RhYmxlIixvKSxGKHIsIiRrZXkiLGEpLEYociwiJGhhc05vcm1hbCIsaSkscn1mdW5jdGlvbiBhdChlLHQsbil7dmFyIHI9ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoP24uYXBwbHkobnVsbCxhcmd1bWVudHMpOm4oe30pO3JldHVybihlPWUmJiJvYmplY3QiPT10eXBlb2YgZSYmIUFycmF5LmlzQXJyYXkoZSk/W2VdOlplKGUpKSYmKDA9PT1lLmxlbmd0aHx8MT09PWUubGVuZ3RoJiZlWzBdLmlzQ29tbWVudCk/dm9pZCAwOmV9O3JldHVybiBuLnByb3h5JiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtnZXQ6cixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHJ9ZnVuY3Rpb24gc3QoZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZVt0XX19ZnVuY3Rpb24gY3QoZSx0KXt2YXIgbixyLGksbyxhO2lmKEFycmF5LmlzQXJyYXkoZSl8fCJzdHJpbmciPT10eXBlb2YgZSlmb3Iobj1uZXcgQXJyYXkoZS5sZW5ndGgpLHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspbltyXT10KGVbcl0scik7ZWxzZSBpZigibnVtYmVyIj09dHlwZW9mIGUpZm9yKG49bmV3IEFycmF5KGUpLHI9MDtyPGU7cisrKW5bcl09dChyKzEscik7ZWxzZSBpZihiKGUpKWlmKHJlJiZlW1N5bWJvbC5pdGVyYXRvcl0pe249W107Zm9yKHZhciBzPWVbU3ltYm9sLml0ZXJhdG9yXSgpLGM9cy5uZXh0KCk7IWMuZG9uZTspbi5wdXNoKHQoYy52YWx1ZSxuLmxlbmd0aCkpLGM9cy5uZXh0KCl9ZWxzZSBmb3Iobz1PYmplY3Qua2V5cyhlKSxuPW5ldyBBcnJheShvLmxlbmd0aCkscj0wLGk9by5sZW5ndGg7cjxpO3IrKylhPW9bcl0sbltyXT10KGVbYV0sYSxyKTtyZXR1cm4gQShuKXx8KG49W10pLG4uX2lzVkxpc3Q9ITAsbn1mdW5jdGlvbiB1dChlLHQsbixyKXt2YXIgaSxvPXRoaXMuJHNjb3BlZFNsb3RzW2VdO28/KG49bnx8e30sciYmKG49TihOKHt9LHIpLG4pKSxpPW8obil8fHQpOmk9dGhpcy4kc2xvdHNbZV18fHQ7dmFyIGE9biYmbi5zbG90O3JldHVybiBhP3RoaXMuJGNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIix7c2xvdDphfSxpKTppfWZ1bmN0aW9uIGx0KGUpe3JldHVybiAkZSh0aGlzLiRvcHRpb25zLCJmaWx0ZXJzIixlKXx8VH1mdW5jdGlvbiBkdChlLHQpe3JldHVybiBBcnJheS5pc0FycmF5KGUpPy0xPT09ZS5pbmRleE9mKHQpOmUhPT10fWZ1bmN0aW9uIGZ0KGUsdCxuLHIsaSl7dmFyIG89Ui5rZXlDb2Rlc1t0XXx8bjtyZXR1cm4gaSYmciYmIVIua2V5Q29kZXNbdF0/ZHQoaSxyKTpvP2R0KG8sZSk6cj9TKHIpIT09dDp2b2lkIDB9ZnVuY3Rpb24gcHQoaSxvLGEscyxjKXtpZihhKWlmKGIoYSkpe3ZhciB1O0FycmF5LmlzQXJyYXkoYSkmJihhPXgoYSkpO3ZhciBlPWZ1bmN0aW9uKHQpe2lmKCJjbGFzcyI9PT10fHwic3R5bGUiPT09dHx8bCh0KSl1PWk7ZWxzZXt2YXIgZT1pLmF0dHJzJiZpLmF0dHJzLnR5cGU7dT1zfHxSLm11c3RVc2VQcm9wKG8sZSx0KT9pLmRvbVByb3BzfHwoaS5kb21Qcm9wcz17fSk6aS5hdHRyc3x8KGkuYXR0cnM9e30pfXZhciBuPWgodCkscj1TKHQpO24gaW4gdXx8ciBpbiB1fHwodVt0XT1hW3RdLGMmJigoaS5vbnx8KGkub249e30pKVsidXBkYXRlOiIrdF09ZnVuY3Rpb24oZSl7YVt0XT1lfSkpfTtmb3IodmFyIHQgaW4gYSllKHQpfWVsc2U7cmV0dXJuIGl9ZnVuY3Rpb24gaHQoZSx0KXt2YXIgbj10aGlzLl9zdGF0aWNUcmVlc3x8KHRoaXMuX3N0YXRpY1RyZWVzPVtdKSxyPW5bZV07cmV0dXJuIHImJiF0fHxndChyPW5bZV09dGhpcy4kb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnNbZV0uY2FsbCh0aGlzLl9yZW5kZXJQcm94eSxudWxsLHRoaXMpLCJfX3N0YXRpY19fIitlLCExKSxyfWZ1bmN0aW9uIHZ0KGUsdCxuKXtyZXR1cm4gZ3QoZSwiX19vbmNlX18iK3QrKG4/Il8iK246IiIpLCEwKSxlfWZ1bmN0aW9uIGd0KGUsdCxuKXtpZihBcnJheS5pc0FycmF5KGUpKWZvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKWVbcl0mJiJzdHJpbmciIT10eXBlb2YgZVtyXSYmbXQoZVtyXSx0KyJfIityLG4pO2Vsc2UgbXQoZSx0LG4pfWZ1bmN0aW9uIG10KGUsdCxuKXtlLmlzU3RhdGljPSEwLGUua2V5PXQsZS5pc09uY2U9bn1mdW5jdGlvbiB5dChlLHQpe2lmKHQpaWYoZCh0KSl7dmFyIG49ZS5vbj1lLm9uP04oe30sZS5vbik6e307Zm9yKHZhciByIGluIHQpe3ZhciBpPW5bcl0sbz10W3JdO25bcl09aT9bXS5jb25jYXQoaSxvKTpvfX1lbHNlO3JldHVybiBlfWZ1bmN0aW9uIF90KGUsdCxuLHIpe3Q9dHx8eyRzdGFibGU6IW59O2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldO0FycmF5LmlzQXJyYXkobyk/X3Qobyx0LG4pOm8mJihvLnByb3h5JiYoby5mbi5wcm94eT0hMCksdFtvLmtleV09by5mbil9cmV0dXJuIHImJih0LiRrZXk9ciksdH1mdW5jdGlvbiBidChlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bis9Mil7dmFyIHI9dFtuXTsic3RyaW5nIj09dHlwZW9mIHImJnImJihlW3Rbbl1dPXRbbisxXSl9cmV0dXJuIGV9ZnVuY3Rpb24gd3QoZSx0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/dCtlOmV9ZnVuY3Rpb24ga3QoZSl7ZS5fbz12dCxlLl9uPW8sZS5fcz1uLGUuX2w9Y3QsZS5fdD11dCxlLl9xPU8sZS5faT1QLGUuX209aHQsZS5fZj1sdCxlLl9rPWZ0LGUuX2I9cHQsZS5fdj1mZSxlLl9lPWRlLGUuX3U9X3QsZS5fZz15dCxlLl9kPWJ0LGUuX3A9d3R9ZnVuY3Rpb24gU3QoZSx0LG4sbyxyKXt2YXIgYSxpPXRoaXMscz1yLm9wdGlvbnM7ZihvLCJfdWlkIik/KGE9T2JqZWN0LmNyZWF0ZShvKSkuX29yaWdpbmFsPW86bz0oYT1vKS5fb3JpZ2luYWw7dmFyIGM9SShzLl9jb21waWxlZCksdT0hYzt0aGlzLmRhdGE9ZSx0aGlzLnByb3BzPXQsdGhpcy5jaGlsZHJlbj1uLHRoaXMucGFyZW50PW8sdGhpcy5saXN0ZW5lcnM9ZS5vbnx8Xyx0aGlzLmluamVjdGlvbnM9bnQocy5pbmplY3QsbyksdGhpcy5zbG90cz1mdW5jdGlvbigpe3JldHVybiBpLiRzbG90c3x8b3QoZS5zY29wZWRTbG90cyxpLiRzbG90cz1ydChuLG8pKSxpLiRzbG90c30sT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInNjb3BlZFNsb3RzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb3QoZS5zY29wZWRTbG90cyx0aGlzLnNsb3RzKCkpfX0pLGMmJih0aGlzLiRvcHRpb25zPXMsdGhpcy4kc2xvdHM9dGhpcy5zbG90cygpLHRoaXMuJHNjb3BlZFNsb3RzPW90KGUuc2NvcGVkU2xvdHMsdGhpcy4kc2xvdHMpKSxzLl9zY29wZUlkP3RoaXMuX2M9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9VXQoYSxlLHQsbixyLHUpO3JldHVybiBpJiYhQXJyYXkuaXNBcnJheShpKSYmKGkuZm5TY29wZUlkPXMuX3Njb3BlSWQsaS5mbkNvbnRleHQ9byksaX06dGhpcy5fYz1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gVXQoYSxlLHQsbixyLHUpfX1mdW5jdGlvbiB4dChlLHQsbixyLGkpe3ZhciBvPXBlKGUpO3JldHVybiBvLmZuQ29udGV4dD1uLG8uZm5PcHRpb25zPXIsdC5zbG90JiYoKG8uZGF0YXx8KG8uZGF0YT17fSkpLnNsb3Q9dC5zbG90KSxvfWZ1bmN0aW9uIEN0KGUsdCl7Zm9yKHZhciBuIGluIHQpZVtoKG4pXT10W25dfWt0KFN0LnByb3RvdHlwZSk7dmFyIFR0PSJAaW5SZWN5Y2xlTGlzdCI7ZnVuY3Rpb24gT3QoZSx0LG4scil7aWYoYSYmYS50YXNrQ2VudGVyKXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBhLnRhc2tDZW50ZXIucmVnaXN0ZXJIb29rP2EudGFza0NlbnRlci5yZWdpc3Rlckhvb2soZSx0LG4scik6dm9pZCAwfWZ1bmN0aW9uIEV0KGUsbix0KXtpZihiKG4pKWlmKHQpZS4kcmVmcz17fTtlbHNle3ZhciByPWUuJHJlZnN8fHt9O09iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9bltlXTtyW2VdPTE9PT10Lmxlbmd0aD90WzBdOnR9KSxlLiRyZWZzPXJ9fWZ1bmN0aW9uIEF0KGUsbixyLHQpe2lmKGIocikpe3ZhciBpPWUuJHJlZnN8fHt9O3Q/T2JqZWN0LmtleXMocikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1yW2VdO2lbZV0mJigxPT09dC5sZW5ndGgmJkFycmF5LmlzQXJyYXkoaVtlXSk/ZGVsZXRlIGlbZV1bbl06ZGVsZXRlIGlbZV0pfSk6KE9iamVjdC5rZXlzKHIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9cltlXTsxPT09dC5sZW5ndGg/KEFycmF5LmlzQXJyYXkoaVtlXSl8fChpW2VdPVtdKSxpW2VdW25dPXRbMF0pOmlbZV09dH0pLGUuJHJlZnM9aSl9fXZhciBJdD0wO2Z1bmN0aW9uICR0KGUpe3ZhciB0PWUuJG9wdGlvbnMuZGF0YSxuPWUuJG9wdGlvbnMuY29tcHV0ZWR8fHt9LHI9ZS5fZGF0YT9PYmplY3QuYXNzaWduKHt9LGUuX2RhdGEpOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3duKHQsZSk6dHx8e30saT17fTtmb3IodmFyIG8gaW4gbilpW29dPWVbb107cmV0dXJuIE9iamVjdC5hc3NpZ24oe30scixpKX1mdW5jdGlvbiBQdChlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHI9dGhpcyx0PWUuY29tcG9uZW50SWQ7RihyLCJfdm1UZW1wbGF0ZSIsZS52bVRlbXBsYXRlKSxyLl91aWQ9dHx8InZpcnR1YWwtY29tcG9uZW50LSIrSXQrKyxyLl9pc1Z1ZT0hMCxlJiZlLl9pc0NvbXBvbmVudD9MbihyLGUpOnIuJG9wdGlvbnM9SWUoTm4oci5jb25zdHJ1Y3RvciksZXx8e30sciksbm4oKHIuX3JlbmRlclByb3h5PXIpLl9zZWxmPXIpLEp0KHIpLHF0KHIpLGFuKHIsImJlZm9yZUNyZWF0ZSIpLHR0KHIpLGJuKHIpLGV0KHIpLGFuKHIsImNyZWF0ZWQiKSxPdCh0LCJsaWZlY3ljbGUiLCJhdHRhY2giLGZ1bmN0aW9uKGUpe0V0KHIsZSYmZS5yZWZzKSxhbihyLCJiZWZvcmVNb3VudCIpLG5ldyBtbihyLGZ1bmN0aW9uKCl7cmV0dXJuICR0KHIpfSxmdW5jdGlvbigpe3JldHVybiByLl91cGRhdGUoci5fdm5vZGUsITEpfSksci5faXNNb3VudGVkPSEwLGFuKHIsIm1vdW50ZWQiKX0pLE90KHQsImxpZmVjeWNsZSIsInVwZGF0ZSIsZnVuY3Rpb24oZSl7RXQocixlJiZlLnJlZnMpLHIuX3VwZGF0ZShyLl92bm9kZSwhMSl9KSxPdCh0LCJsaWZlY3ljbGUiLCJzeW5jU3RhdGUiLGZ1bmN0aW9uKGUsdCl7aWYoZCh0KSlmb3IodmFyIG4gaW4gdClyW25dPXRbbl07cmV0dXJuICR0KHIpfSksT3QodCwibGlmZWN5Y2xlIiwiZGV0YWNoIixmdW5jdGlvbihlKXtFdChyLGUmJmUucmVmcywhMCksci4kZGVzdHJveSgpLHIuX3ZtVGVtcGxhdGUmJihyLl92bVRlbXBsYXRlLnJlbW92ZVZpcnR1YWxDb21wb25lbnQoci5fdWlkKSxkZWxldGUgci5fdm1UZW1wbGF0ZSl9KX1mdW5jdGlvbiBNdChlKXt2YXIgdD10aGlzLG49dC4kb3B0aW9ucy5jb21wb25lbnRJZDsodC5faXNNb3VudGVkJiZhbih0LCJiZWZvcmVVcGRhdGUiKSx0Ll92bm9kZT1lLHQuX2lzTW91bnRlZCYmbikmJmZ1bmN0aW9uKGUsdCxuKXtpZihhJiZhLnRhc2tDZW50ZXIpImZ1bmN0aW9uIj09dHlwZW9mIGEudGFza0NlbnRlci51cGRhdGVEYXRhJiZhLnRhc2tDZW50ZXIudXBkYXRlRGF0YShlLHQsbil9KG4sJHQodCksZnVuY3Rpb24oKXthbih0LCJ1cGRhdGVkIil9KX1mdW5jdGlvbiBqdChlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9dGhpczt0Ll91aWQ9InZpcnR1YWwtY29tcG9uZW50LXRlbXBsYXRlLSIrSXQrKyx0Ll9pc1Z1ZT0hMCxlJiZlLl9pc0NvbXBvbmVudD9Mbih0LGUpOnQuJG9wdGlvbnM9SWUoTm4odC5jb25zdHJ1Y3RvciksZXx8e30sdCksSnQodC5fc2VsZj10KSxxdCh0KSxibih0KSx0aGlzLnJlZ2lzdGVyVmlydHVhbENvbXBvbmVudCgpfWZ1bmN0aW9uIEx0KGUpe3ZhciB0LG4saSxvO2RlbGV0ZSBlLmRhdGEuYXR0cnNbVHRdLG49KHQ9ZSkuY29tcG9uZW50T3B0aW9ucy5DdG9yLGk9bi5leHRlbmQoe30pLG89aS5wcm90b3R5cGUuJGVtaXQsaS5wcm90b3R5cGUuX2luaXQ9UHQsaS5wcm90b3R5cGUuX3VwZGF0ZT1NdCxpLnByb3RvdHlwZS4kZW1pdD1mdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMsdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGg7bi0tOyl0W25dPWVbbl07dmFyIHI9dGhpcy5fdWlkLGk9dGhpcy5fdm1UZW1wbGF0ZTtyZXR1cm4gciYmaSYmKHQucHVzaChyKSxvLmFwcGx5KGksdCkpLG8uYXBwbHkodGhpcyx0KX0sdC5jb21wb25lbnRPcHRpb25zLkN0b3I9bi5leHRlbmQoe21ldGhvZHM6e3JlZ2lzdGVyVmlydHVhbENvbXBvbmVudDpmdW5jdGlvbigpe3ZhciByPXRoaXM7RihyLCJfdmlydHVhbENvbXBvbmVudHMiLHt9KSxPdChTdHJpbmcoci5fdWlkKSwibGlmZWN5Y2xlIiwiY3JlYXRlIixmdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBpKHt2bVRlbXBsYXRlOnIsY29tcG9uZW50SWQ6ZSxwcm9wc0RhdGE6dH0pO3JldHVybiBuLl91aWQ9ZSxyLl92aXJ0dWFsQ29tcG9uZW50cyYmKHIuX3ZpcnR1YWxDb21wb25lbnRzW2VdPW4pLCR0KG4pfSl9LHJlbW92ZVZpcnR1YWxDb21wb25lbnQ6ZnVuY3Rpb24oZSl7ZGVsZXRlIHRoaXMuX3ZpcnR1YWxDb21wb25lbnRzW2VdfX0sZGVzdHJveWVkOmZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXMuX3ZpcnR1YWxDb21wb25lbnRzfX0pLHQuY29tcG9uZW50T3B0aW9ucy5DdG9yLnByb3RvdHlwZS5faW5pdD1qdCx0LmNvbXBvbmVudE9wdGlvbnMuQ3Rvci5wcm90b3R5cGUuX3VwZGF0ZT1CO3ZhciByPVJ0KGUpLGE9ci4kb3B0aW9uc1siQHJlbmRlciJdO2lmKGEpdHJ5e3JldHVybiBhLmNhbGwocil9Y2F0Y2goZSl7TmUoZSxyLCJAcmVuZGVyIil9fXZhciBOdD17aW5pdDpmdW5jdGlvbihlLHQsbixyKXtpZihlLmNvbXBvbmVudEluc3RhbmNlJiYhZS5jb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQmJmUuZGF0YS5rZWVwQWxpdmUpe3ZhciBpPWU7TnQucHJlcGF0Y2goaSxpKX1lbHNleyhlLmNvbXBvbmVudEluc3RhbmNlPVJ0KGUsdG4sbixyKSkuJG1vdW50KHQ/ZS5lbG06dm9pZCAwLHQpfX0scHJlcGF0Y2g6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmNvbXBvbmVudE9wdGlvbnM7IWZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG89ci5kYXRhLnNjb3BlZFNsb3RzLGE9ZS4kc2NvcGVkU2xvdHMscz0hIShvJiYhby4kc3RhYmxlfHxhIT09XyYmIWEuJHN0YWJsZXx8byYmZS4kc2NvcGVkU2xvdHMuJGtleSE9PW8uJGtleSksYz0hIShpfHxlLiRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbnx8cyk7ZS4kb3B0aW9ucy5fcGFyZW50Vm5vZGU9cixlLiR2bm9kZT1yLGUuX3Zub2RlJiYoZS5fdm5vZGUucGFyZW50PXIpO2lmKGUuJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuPWksZS4kYXR0cnM9ci5kYXRhLmF0dHJzfHxfLGUuJGxpc3RlbmVycz1ufHxfLHQmJmUuJG9wdGlvbnMucHJvcHMpe3llKCExKTtmb3IodmFyIHU9ZS5fcHJvcHMsbD1lLiRvcHRpb25zLl9wcm9wS2V5c3x8W10sZD0wO2Q8bC5sZW5ndGg7ZCsrKXt2YXIgZj1sW2RdLHA9ZS4kb3B0aW9ucy5wcm9wczt1W2ZdPVBlKGYscCx0LGUpfXllKCEwKSxlLiRvcHRpb25zLnByb3BzRGF0YT10fW49bnx8Xzt2YXIgaD1lLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7ZS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzPW4sZW4oZSxuLGgpLGMmJihlLiRzbG90cz1ydChpLHIuY29udGV4dCksZS4kZm9yY2VVcGRhdGUoKSl9KHQuY29tcG9uZW50SW5zdGFuY2U9ZS5jb21wb25lbnRJbnN0YW5jZSxuLnByb3BzRGF0YSxuLmxpc3RlbmVycyx0LG4uY2hpbGRyZW4pfSxpbnNlcnQ6ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLmNvbnRleHQscj1lLmNvbXBvbmVudEluc3RhbmNlO3IuX2lzTW91bnRlZHx8KHIuX2lzTW91bnRlZD0hMCxhbihyLCJtb3VudGVkIikpLGUuZGF0YS5rZWVwQWxpdmUmJihuLl9pc01vdW50ZWQ/KCh0PXIpLl9pbmFjdGl2ZT0hMSxjbi5wdXNoKHQpKTpvbihyLCEwKSl9LGRlc3Ryb3k6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb21wb25lbnRJbnN0YW5jZTt0Ll9pc0Rlc3Ryb3llZHx8KGUuZGF0YS5rZWVwQWxpdmU/ZnVuY3Rpb24gZSh0LG4pe2lmKG4mJih0Ll9kaXJlY3RJbmFjdGl2ZT0hMCxybih0KSkpcmV0dXJuO2lmKCF0Ll9pbmFjdGl2ZSl7dC5faW5hY3RpdmU9ITA7Zm9yKHZhciByPTA7cjx0LiRjaGlsZHJlbi5sZW5ndGg7cisrKWUodC4kY2hpbGRyZW5bcl0pO2FuKHQsImRlYWN0aXZhdGVkIil9fSh0LCEwKTp0LiRkZXN0cm95KCkpfX0sQnQ9T2JqZWN0LmtleXMoTnQpO2Z1bmN0aW9uIER0KGUsdCxuLHIsaSl7aWYoIUUoZSkpe3ZhciBvPW4uJG9wdGlvbnMuX2Jhc2U7aWYoYihlKSYmKGU9by5leHRlbmQoZSkpLCJmdW5jdGlvbiI9PXR5cGVvZiBlKXt2YXIgYSxzLGMsdSxsLGQsZjtpZihFKGUuY2lkKSYmdm9pZCAwPT09KGU9ZnVuY3Rpb24odCxuKXtpZihJKHQuZXJyb3IpJiZBKHQuZXJyb3JDb21wKSlyZXR1cm4gdC5lcnJvckNvbXA7aWYoQSh0LnJlc29sdmVkKSlyZXR1cm4gdC5yZXNvbHZlZDt2YXIgZT1IdDtlJiZBKHQub3duZXJzKSYmLTE9PT10Lm93bmVycy5pbmRleE9mKGUpJiZ0Lm93bmVycy5wdXNoKGUpO2lmKEkodC5sb2FkaW5nKSYmQSh0LmxvYWRpbmdDb21wKSlyZXR1cm4gdC5sb2FkaW5nQ29tcDtpZihlJiYhQSh0Lm93bmVycykpe3ZhciByPXQub3duZXJzPVtlXSxpPSEwLG89bnVsbCxhPW51bGw7ZS4kb24oImhvb2s6ZGVzdHJveWVkIixmdW5jdGlvbigpe3JldHVybiBrKHIsZSl9KTt2YXIgcz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPXIubGVuZ3RoO3Q8bjt0Kyspclt0XS4kZm9yY2VVcGRhdGUoKTtlJiYoci5sZW5ndGg9MCxudWxsIT09byYmKGNsZWFyVGltZW91dChvKSxvPW51bGwpLG51bGwhPT1hJiYoY2xlYXJUaW1lb3V0KGEpLGE9bnVsbCkpfSxjPUQoZnVuY3Rpb24oZSl7dC5yZXNvbHZlZD1HdChlLG4pLGk/ci5sZW5ndGg9MDpzKCEwKX0pLHU9RChmdW5jdGlvbihlKXtBKHQuZXJyb3JDb21wKSYmKHQuZXJyb3I9ITAscyghMCkpfSksbD10KGMsdSk7cmV0dXJuIGIobCkmJih3KGwpP0UodC5yZXNvbHZlZCkmJmwudGhlbihjLHUpOncobC5jb21wb25lbnQpJiYobC5jb21wb25lbnQudGhlbihjLHUpLEEobC5lcnJvcikmJih0LmVycm9yQ29tcD1HdChsLmVycm9yLG4pKSxBKGwubG9hZGluZykmJih0LmxvYWRpbmdDb21wPUd0KGwubG9hZGluZyxuKSwwPT09bC5kZWxheT90LmxvYWRpbmc9ITA6bz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bz1udWxsLEUodC5yZXNvbHZlZCkmJkUodC5lcnJvcikmJih0LmxvYWRpbmc9ITAscyghMSkpfSxsLmRlbGF5fHwyMDApKSxBKGwudGltZW91dCkmJihhPXNldFRpbWVvdXQoZnVuY3Rpb24oKXthPW51bGwsRSh0LnJlc29sdmVkKSYmdShudWxsKX0sbC50aW1lb3V0KSkpKSxpPSExLHQubG9hZGluZz90LmxvYWRpbmdDb21wOnQucmVzb2x2ZWR9fShhPWUsbykpKXJldHVybiBzPWEsYz10LHU9bixsPXIsZD1pLChmPWRlKCkpLmFzeW5jRmFjdG9yeT1zLGYuYXN5bmNNZXRhPXtkYXRhOmMsY29udGV4dDp1LGNoaWxkcmVuOmwsdGFnOmR9LGY7dD10fHx7fSxObihlKSxBKHQubW9kZWwpJiZmdW5jdGlvbihlLHQpe3ZhciBuPWUubW9kZWwmJmUubW9kZWwucHJvcHx8InZhbHVlIixyPWUubW9kZWwmJmUubW9kZWwuZXZlbnR8fCJpbnB1dCI7KHQuYXR0cnN8fCh0LmF0dHJzPXt9KSlbbl09dC5tb2RlbC52YWx1ZTt2YXIgaT10Lm9ufHwodC5vbj17fSksbz1pW3JdLGE9dC5tb2RlbC5jYWxsYmFjaztBKG8pPyhBcnJheS5pc0FycmF5KG8pPy0xPT09by5pbmRleE9mKGEpOm8hPT1hKSYmKGlbcl09W2FdLmNvbmNhdChvKSk6aVtyXT1hfShlLm9wdGlvbnMsdCk7dmFyIHA9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXQub3B0aW9ucy5wcm9wcztpZighRShyKSl7dmFyIGk9e30sbz1lLmF0dHJzLGE9ZS5wcm9wcztpZihBKG8pfHxBKGEpKWZvcih2YXIgcyBpbiByKXt2YXIgYz1TKHMpO0tlKGksYSxzLGMsITApfHxLZShpLG8scyxjLCExKX1yZXR1cm4gaX19KHQsZSk7aWYoSShlLm9wdGlvbnMuZnVuY3Rpb25hbCkpcmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG89ZS5vcHRpb25zLGE9e30scz1vLnByb3BzO2lmKEEocykpZm9yKHZhciBjIGluIHMpYVtjXT1QZShjLHMsdHx8Xyk7ZWxzZSBBKG4uYXR0cnMpJiZDdChhLG4uYXR0cnMpLEEobi5wcm9wcykmJkN0KGEsbi5wcm9wcyk7dmFyIHU9bmV3IFN0KG4sYSxpLHIsZSksbD1vLnJlbmRlci5jYWxsKG51bGwsdS5fYyx1KTtpZihsIGluc3RhbmNlb2YgdWUpcmV0dXJuIHh0KGwsbix1LnBhcmVudCxvKTtpZihBcnJheS5pc0FycmF5KGwpKXtmb3IodmFyIGQ9WmUobCl8fFtdLGY9bmV3IEFycmF5KGQubGVuZ3RoKSxwPTA7cDxkLmxlbmd0aDtwKyspZltwXT14dChkW3BdLG4sdS5wYXJlbnQsbyk7cmV0dXJuIGZ9fShlLHAsdCxuLHIpO3ZhciBoPXQub247aWYodC5vbj10Lm5hdGl2ZU9uLEkoZS5vcHRpb25zLmFic3RyYWN0KSl7dmFyIHY9dC5zbG90O3Q9e30sdiYmKHQuc2xvdD12KX0hZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUuaG9va3x8KGUuaG9vaz17fSksbj0wO248QnQubGVuZ3RoO24rKyl7dmFyIHI9QnRbbl0saT10W3JdLG89TnRbcl07aT09PW98fGkmJmkuX21lcmdlZHx8KHRbcl09aT9GdChvLGkpOm8pfX0odCk7dmFyIGcsbT1lLm9wdGlvbnMubmFtZXx8aSx5PW5ldyB1ZSgidnVlLWNvbXBvbmVudC0iK2UuY2lkKyhtPyItIittOiIiKSx0LHZvaWQgMCx2b2lkIDAsdm9pZCAwLG4se0N0b3I6ZSxwcm9wc0RhdGE6cCxsaXN0ZW5lcnM6aCx0YWc6aSxjaGlsZHJlbjpyfSxhKTtyZXR1cm4oZz15KS5kYXRhLmF0dHJzJiZUdCBpbiBnLmRhdGEuYXR0cnM/THQoeSk6eX19fWZ1bmN0aW9uIFJ0KGUsdCxuLHIpe3ZhciBpPXtfaXNDb21wb25lbnQ6ITAsX3BhcmVudFZub2RlOmUscGFyZW50OnQsX3BhcmVudEVsbTpufHxudWxsLF9yZWZFbG06cnx8bnVsbH0sbz1lLmRhdGEuaW5saW5lVGVtcGxhdGU7cmV0dXJuIEEobykmJihpLnJlbmRlcj1vLnJlbmRlcixpLnN0YXRpY1JlbmRlckZucz1vLnN0YXRpY1JlbmRlckZucyksbmV3IGUuY29tcG9uZW50T3B0aW9ucy5DdG9yKGkpfWZ1bmN0aW9uIEZ0KG4scil7dmFyIGU9ZnVuY3Rpb24oZSx0KXtuKGUsdCkscihlLHQpfTtyZXR1cm4gZS5fbWVyZ2VkPSEwLGV9dmFyIHp0PTEsVnQ9MjtmdW5jdGlvbiBVdChlLHQsbixyLGksbyl7cmV0dXJuKEFycmF5LmlzQXJyYXkobil8fCQobikpJiYoaT1yLHI9bixuPXZvaWQgMCksSShvKSYmKGk9VnQpLGZ1bmN0aW9uKGUsdCxuLHIsaSl7aWYoQShuKSYmQShuLl9fb2JfXykpcmV0dXJuIGRlKCk7QShuKSYmQShuLmlzKSYmKHQ9bi5pcyk7aWYoIXQpcmV0dXJuIGRlKCk7QXJyYXkuaXNBcnJheShyKSYmImZ1bmN0aW9uIj09dHlwZW9mIHJbMF0mJigobj1ufHx7fSkuc2NvcGVkU2xvdHM9e2RlZmF1bHQ6clswXX0sci5sZW5ndGg9MCk7aT09PVZ0P3I9WmUocik6aT09PXp0JiYocj1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKylpZihBcnJheS5pc0FycmF5KGVbdF0pKXJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGUpO3JldHVybiBlfShyKSk7dmFyIG8sYTtpZigic3RyaW5nIj09dHlwZW9mIHQpe3ZhciBzO2E9ZS4kdm5vZGUmJmUuJHZub2RlLm5zfHxSLmdldFRhZ05hbWVzcGFjZSh0KSxvPVIuaXNSZXNlcnZlZFRhZyh0KT9uZXcgdWUoUi5wYXJzZVBsYXRmb3JtVGFnTmFtZSh0KSxuLHIsdm9pZCAwLHZvaWQgMCxlKTpuJiZuLnByZXx8IUEocz0kZShlLiRvcHRpb25zLCJjb21wb25lbnRzIix0KSk/bmV3IHVlKHQsbixyLHZvaWQgMCx2b2lkIDAsZSk6RHQocyxuLGUscix0KX1lbHNlIG89RHQodCxuLGUscik7cmV0dXJuIEFycmF5LmlzQXJyYXkobyk/bzpBKG8pPyhBKGEpJiZmdW5jdGlvbiBlKHQsbixyKXt0Lm5zPW47ImZvcmVpZ25PYmplY3QiPT09dC50YWcmJihyPSEobj12b2lkIDApKTtpZihBKHQuY2hpbGRyZW4pKWZvcih2YXIgaT0wLG89dC5jaGlsZHJlbi5sZW5ndGg7aTxvO2krKyl7dmFyIGE9dC5jaGlsZHJlbltpXTtBKGEudGFnKSYmKEUoYS5ucyl8fEkocikmJiJzdmciIT09YS50YWcpJiZlKGEsbixyKX19KG8sYSksQShuKSYmZnVuY3Rpb24oZSl7YihlLnN0eWxlKSYmSGUoZS5zdHlsZSk7YihlLmNsYXNzKSYmSGUoZS5jbGFzcyl9KG4pLG8pOmRlKCl9KGUsdCxuLHIsaSl9ZnVuY3Rpb24gcXQoaSl7aS5fdm5vZGU9bnVsbCxpLl9zdGF0aWNUcmVlcz1udWxsO3ZhciBlPWkuJG9wdGlvbnMsdD1pLiR2bm9kZT1lLl9wYXJlbnRWbm9kZSxuPXQmJnQuY29udGV4dDtpLiRzbG90cz1ydChlLl9yZW5kZXJDaGlsZHJlbixuKSxpLiRzY29wZWRTbG90cz1fLGkuX2M9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIFV0KGksZSx0LG4sciwhMSl9LGkuJGNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIFV0KGksZSx0LG4sciwhMCl9O3ZhciByPXQmJnQuZGF0YTt3ZShpLCIkYXR0cnMiLHImJnIuYXR0cnN8fF8sbnVsbCwhMCksd2UoaSwiJGxpc3RlbmVycyIsZS5fcGFyZW50TGlzdGVuZXJzfHxfLG51bGwsITApfXZhciBXdCxIdD1udWxsO2Z1bmN0aW9uIEd0KGUsdCl7cmV0dXJuKGUuX19lc01vZHVsZXx8cmUmJiJNb2R1bGUiPT09ZVtTeW1ib2wudG9TdHJpbmdUYWddKSYmKGU9ZS5kZWZhdWx0KSxiKGUpP3QuZXh0ZW5kKGUpOmV9ZnVuY3Rpb24gWHQoZSl7cmV0dXJuIGUuaXNDb21tZW50JiZlLmFzeW5jRmFjdG9yeX1mdW5jdGlvbiBZdChlKXtpZihBcnJheS5pc0FycmF5KGUpKWZvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKXt2YXIgbj1lW3RdO2lmKEEobikmJihBKG4uY29tcG9uZW50T3B0aW9ucyl8fFh0KG4pKSlyZXR1cm4gbn19ZnVuY3Rpb24gSnQoZSl7ZS5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksZS5faGFzSG9va0V2ZW50PSExO3ZhciB0PWUuJG9wdGlvbnMuX3BhcmVudExpc3RlbmVyczt0JiZlbihlLHQpfWZ1bmN0aW9uIEt0KGUsdCl7V3QuJG9uKGUsdCl9ZnVuY3Rpb24gWnQoZSx0KXtXdC4kb2ZmKGUsdCl9ZnVuY3Rpb24gUXQodCxuKXt2YXIgcj1XdDtyZXR1cm4gZnVuY3Rpb24gZSgpe251bGwhPT1uLmFwcGx5KG51bGwsYXJndW1lbnRzKSYmci4kb2ZmKHQsZSl9fWZ1bmN0aW9uIGVuKGUsdCxuKXtZZSh0LG58fHt9LEt0LFp0LFF0LFd0PWUpLFd0PXZvaWQgMH12YXIgdG49bnVsbDtmdW5jdGlvbiBubihlKXt2YXIgdD1lLiRvcHRpb25zLG49dC5wYXJlbnQ7aWYobiYmIXQuYWJzdHJhY3Qpe2Zvcig7bi4kb3B0aW9ucy5hYnN0cmFjdCYmbi4kcGFyZW50OyluPW4uJHBhcmVudDtuLiRjaGlsZHJlbi5wdXNoKGUpfWUuJHBhcmVudD1uLGUuJHJvb3Q9bj9uLiRyb290OmUsZS4kY2hpbGRyZW49W10sZS4kcmVmcz17fSxlLl93YXRjaGVyPW51bGwsZS5faW5hY3RpdmU9bnVsbCxlLl9kaXJlY3RJbmFjdGl2ZT0hMSxlLl9pc01vdW50ZWQ9ITEsZS5faXNEZXN0cm95ZWQ9ITEsZS5faXNCZWluZ0Rlc3Ryb3llZD0hMX1mdW5jdGlvbiBybihlKXtmb3IoO2UmJihlPWUuJHBhcmVudCk7KWlmKGUuX2luYWN0aXZlKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIG9uKGUsdCl7aWYodCl7aWYoZS5fZGlyZWN0SW5hY3RpdmU9ITEscm4oZSkpcmV0dXJufWVsc2UgaWYoZS5fZGlyZWN0SW5hY3RpdmUpcmV0dXJuO2lmKGUuX2luYWN0aXZlfHxudWxsPT09ZS5faW5hY3RpdmUpe2UuX2luYWN0aXZlPSExO2Zvcih2YXIgbj0wO248ZS4kY2hpbGRyZW4ubGVuZ3RoO24rKylvbihlLiRjaGlsZHJlbltuXSk7YW4oZSwiYWN0aXZhdGVkIil9fWZ1bmN0aW9uIGFuKGUsdCl7c2UoKTt2YXIgbj1lLiRvcHRpb25zW3RdLHI9dCsiIGhvb2siO2lmKG4pZm9yKHZhciBpPTAsbz1uLmxlbmd0aDtpPG87aSsrKUJlKG5baV0sZSxudWxsLGUscik7ZS5faGFzSG9va0V2ZW50JiZlLiRlbWl0KCJob29rOiIrdCksY2UoKX12YXIgc249W10sY249W10sdW49e30sbG49ITEsZG49ITEsZm49MDt2YXIgcG49RGF0ZS5ub3c7aWYocSYmIVgpe3ZhciBobj13aW5kb3cucGVyZm9ybWFuY2U7aG4mJiJmdW5jdGlvbiI9PXR5cGVvZiBobi5ub3cmJnBuKCk+YS5jcmVhdGVFdmVudCgiRXZlbnQiKS50aW1lU3RhbXAmJihwbj1mdW5jdGlvbigpe3JldHVybiBobi5ub3coKX0pfWZ1bmN0aW9uIHZuKCl7dmFyIGUsdDtmb3IocG4oKSxkbj0hMCxzbi5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuaWQtdC5pZH0pLGZuPTA7Zm48c24ubGVuZ3RoO2ZuKyspKGU9c25bZm5dKS5iZWZvcmUmJmUuYmVmb3JlKCksdD1lLmlkLHVuW3RdPW51bGwsZS5ydW4oKTt2YXIgbj1jbi5zbGljZSgpLHI9c24uc2xpY2UoKTtmbj1zbi5sZW5ndGg9Y24ubGVuZ3RoPTAsbG49ZG49ISh1bj17fSksZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspZVt0XS5faW5hY3RpdmU9ITAsb24oZVt0XSwhMCl9KG4pLGZ1bmN0aW9uKGUpe3ZhciB0PWUubGVuZ3RoO2Zvcig7dC0tOyl7dmFyIG49ZVt0XSxyPW4udm07ci5fd2F0Y2hlcj09PW4mJnIuX2lzTW91bnRlZCYmIXIuX2lzRGVzdHJveWVkJiZhbihyLCJ1cGRhdGVkIil9fShyKSxlZSYmUi5kZXZ0b29scyYmZWUuZW1pdCgiZmx1c2giKX12YXIgZ249MCxtbj1mdW5jdGlvbihlLHQsbixyLGkpe3RoaXMudm09ZSxpJiYoZS5fd2F0Y2hlcj10aGlzKSxlLl93YXRjaGVycy5wdXNoKHRoaXMpLHI/KHRoaXMuZGVlcD0hIXIuZGVlcCx0aGlzLnVzZXI9ISFyLnVzZXIsdGhpcy5sYXp5PSEhci5sYXp5LHRoaXMuc3luYz0hIXIuc3luYyx0aGlzLmJlZm9yZT1yLmJlZm9yZSk6dGhpcy5kZWVwPXRoaXMudXNlcj10aGlzLmxhenk9dGhpcy5zeW5jPSExLHRoaXMuY2I9bix0aGlzLmlkPSsrZ24sdGhpcy5hY3RpdmU9ITAsdGhpcy5kaXJ0eT10aGlzLmxhenksdGhpcy5kZXBzPVtdLHRoaXMubmV3RGVwcz1bXSx0aGlzLmRlcElkcz1uZXcgbmUsdGhpcy5uZXdEZXBJZHM9bmV3IG5lLHRoaXMuZXhwcmVzc2lvbj0iIiwiZnVuY3Rpb24iPT10eXBlb2YgdD90aGlzLmdldHRlcj10Oih0aGlzLmdldHRlcj1mdW5jdGlvbihlKXtpZighei50ZXN0KGUpKXt2YXIgbj1lLnNwbGl0KCIuIik7cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8bi5sZW5ndGg7dCsrKXtpZighZSlyZXR1cm47ZT1lW25bdF1dfXJldHVybiBlfX19KHQpLHRoaXMuZ2V0dGVyfHwodGhpcy5nZXR0ZXI9QikpLHRoaXMudmFsdWU9dGhpcy5sYXp5P3ZvaWQgMDp0aGlzLmdldCgpfTttbi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKCl7dmFyIGU7c2UodGhpcyk7dmFyIHQ9dGhpcy52bTt0cnl7ZT10aGlzLmdldHRlci5jYWxsKHQsdCl9Y2F0Y2goZSl7aWYoIXRoaXMudXNlcil0aHJvdyBlO05lKGUsdCwnZ2V0dGVyIGZvciB3YXRjaGVyICInK3RoaXMuZXhwcmVzc2lvbisnIicpfWZpbmFsbHl7dGhpcy5kZWVwJiZIZShlKSxjZSgpLHRoaXMuY2xlYW51cERlcHMoKX1yZXR1cm4gZX0sbW4ucHJvdG90eXBlLmFkZERlcD1mdW5jdGlvbihlKXt2YXIgdD1lLmlkO3RoaXMubmV3RGVwSWRzLmhhcyh0KXx8KHRoaXMubmV3RGVwSWRzLmFkZCh0KSx0aGlzLm5ld0RlcHMucHVzaChlKSx0aGlzLmRlcElkcy5oYXModCl8fGUuYWRkU3ViKHRoaXMpKX0sbW4ucHJvdG90eXBlLmNsZWFudXBEZXBzPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuZGVwcy5sZW5ndGg7ZS0tOyl7dmFyIHQ9dGhpcy5kZXBzW2VdO3RoaXMubmV3RGVwSWRzLmhhcyh0LmlkKXx8dC5yZW1vdmVTdWIodGhpcyl9dmFyIG49dGhpcy5kZXBJZHM7dGhpcy5kZXBJZHM9dGhpcy5uZXdEZXBJZHMsdGhpcy5uZXdEZXBJZHM9bix0aGlzLm5ld0RlcElkcy5jbGVhcigpLG49dGhpcy5kZXBzLHRoaXMuZGVwcz10aGlzLm5ld0RlcHMsdGhpcy5uZXdEZXBzPW4sdGhpcy5uZXdEZXBzLmxlbmd0aD0wfSxtbi5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5sYXp5P3RoaXMuZGlydHk9ITA6dGhpcy5zeW5jP3RoaXMucnVuKCk6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5pZDtpZihudWxsPT11blt0XSl7aWYodW5bdF09ITAsZG4pe2Zvcih2YXIgbj1zbi5sZW5ndGgtMTtmbjxuJiZzbltuXS5pZD5lLmlkOyluLS07c24uc3BsaWNlKG4rMSwwLGUpfWVsc2Ugc24ucHVzaChlKTtsbnx8KGxuPSEwLHFlKHZuKSl9fSh0aGlzKX0sbW4ucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe2lmKHRoaXMuYWN0aXZlKXt2YXIgZT10aGlzLmdldCgpO2lmKGUhPT10aGlzLnZhbHVlfHxiKGUpfHx0aGlzLmRlZXApe3ZhciB0PXRoaXMudmFsdWU7aWYodGhpcy52YWx1ZT1lLHRoaXMudXNlcil0cnl7dGhpcy5jYi5jYWxsKHRoaXMudm0sZSx0KX1jYXRjaChlKXtOZShlLHRoaXMudm0sJ2NhbGxiYWNrIGZvciB3YXRjaGVyICInK3RoaXMuZXhwcmVzc2lvbisnIicpfWVsc2UgdGhpcy5jYi5jYWxsKHRoaXMudm0sZSx0KX19fSxtbi5wcm90b3R5cGUuZXZhbHVhdGU9ZnVuY3Rpb24oKXt0aGlzLnZhbHVlPXRoaXMuZ2V0KCksdGhpcy5kaXJ0eT0hMX0sbW4ucHJvdG90eXBlLmRlcGVuZD1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLmRlcHMubGVuZ3RoO2UtLTspdGhpcy5kZXBzW2VdLmRlcGVuZCgpfSxtbi5wcm90b3R5cGUudGVhcmRvd249ZnVuY3Rpb24oKXtpZih0aGlzLmFjdGl2ZSl7dGhpcy52bS5faXNCZWluZ0Rlc3Ryb3llZHx8ayh0aGlzLnZtLl93YXRjaGVycyx0aGlzKTtmb3IodmFyIGU9dGhpcy5kZXBzLmxlbmd0aDtlLS07KXRoaXMuZGVwc1tlXS5yZW1vdmVTdWIodGhpcyk7dGhpcy5hY3RpdmU9ITF9fTt2YXIgeW49e2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpCLHNldDpCfTtmdW5jdGlvbiBfbihlLHQsbil7eW4uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbdF1bbl19LHluLnNldD1mdW5jdGlvbihlKXt0aGlzW3RdW25dPWV9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4seW4pfWZ1bmN0aW9uIGJuKGUpe2UuX3dhdGNoZXJzPVtdO3ZhciB0PWUuJG9wdGlvbnM7dC5wcm9wcyYmZnVuY3Rpb24obixyKXt2YXIgaT1uLiRvcHRpb25zLnByb3BzRGF0YXx8e30sbz1uLl9wcm9wcz17fSxhPW4uJG9wdGlvbnMuX3Byb3BLZXlzPVtdO24uJHBhcmVudCYmeWUoITEpO3ZhciBlPWZ1bmN0aW9uKGUpe2EucHVzaChlKTt2YXIgdD1QZShlLHIsaSxuKTt3ZShvLGUsdCksZSBpbiBufHxfbihuLCJfcHJvcHMiLGUpfTtmb3IodmFyIHQgaW4gcillKHQpO3llKCEwKX0oZSx0LnByb3BzKSx0Lm1ldGhvZHMmJmZ1bmN0aW9uKGUsdCl7ZS4kb3B0aW9ucy5wcm9wcztmb3IodmFyIG4gaW4gdCllW25dPSJmdW5jdGlvbiIhPXR5cGVvZiB0W25dP0I6bSh0W25dLGUpfShlLHQubWV0aG9kcyksdC5kYXRhP2Z1bmN0aW9uKGUpe3ZhciB0PWUuJG9wdGlvbnMuZGF0YTtkKHQ9ZS5fZGF0YT0iZnVuY3Rpb24iPT10eXBlb2YgdD93bih0LGUpOnR8fHt9KXx8KHQ9e30pO3ZhciBuPU9iamVjdC5rZXlzKHQpLHI9ZS4kb3B0aW9ucy5wcm9wcyxpPShlLiRvcHRpb25zLm1ldGhvZHMsbi5sZW5ndGgpO2Zvcig7aS0tOyl7dmFyIG89bltpXTtyJiZmKHIsbyl8fCh2b2lkIDAsMzYhPT0oYT0obysiIikuY2hhckNvZGVBdCgwKSkmJjk1IT09YSYmX24oZSwiX2RhdGEiLG8pKX12YXIgYTtiZSh0LCEwKX0oZSk6YmUoZS5fZGF0YT17fSwhMCksdC5jb21wdXRlZCYmZnVuY3Rpb24oZSx0KXt2YXIgbj1lLl9jb21wdXRlZFdhdGNoZXJzPU9iamVjdC5jcmVhdGUobnVsbCkscj1RKCk7Zm9yKHZhciBpIGluIHQpe3ZhciBvPXRbaV0sYT0iZnVuY3Rpb24iPT10eXBlb2Ygbz9vOm8uZ2V0O3J8fChuW2ldPW5ldyBtbihlLGF8fEIsQixrbikpLGkgaW4gZXx8U24oZSxpLG8pfX0oZSx0LmNvbXB1dGVkKSx0LndhdGNoJiZ0LndhdGNoIT09SyYmZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4gaW4gdCl7dmFyIHI9dFtuXTtpZihBcnJheS5pc0FycmF5KHIpKWZvcih2YXIgaT0wO2k8ci5sZW5ndGg7aSsrKVRuKGUsbixyW2ldKTtlbHNlIFRuKGUsbixyKX19KGUsdC53YXRjaCl9ZnVuY3Rpb24gd24oZSx0KXtzZSgpO3RyeXtyZXR1cm4gZS5jYWxsKHQsdCl9Y2F0Y2goZSl7cmV0dXJuIE5lKGUsdCwiZGF0YSgpIikse319ZmluYWxseXtjZSgpfX12YXIga249e2xhenk6ITB9O2Z1bmN0aW9uIFNuKGUsdCxuKXt2YXIgcj0hUSgpOyJmdW5jdGlvbiI9PXR5cGVvZiBuPyh5bi5nZXQ9cj94bih0KTpDbihuKSx5bi5zZXQ9Qik6KHluLmdldD1uLmdldD9yJiYhMSE9PW4uY2FjaGU/eG4odCk6Q24obi5nZXQpOkIseW4uc2V0PW4uc2V0fHxCKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHluKX1mdW5jdGlvbiB4bih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9jb21wdXRlZFdhdGNoZXJzJiZ0aGlzLl9jb21wdXRlZFdhdGNoZXJzW3RdO2lmKGUpcmV0dXJuIGUuZGlydHkmJmUuZXZhbHVhdGUoKSxhZS5TaGFyZWRPYmplY3QudGFyZ2V0JiZlLmRlcGVuZCgpLGUudmFsdWV9fWZ1bmN0aW9uIENuKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmNhbGwodGhpcyx0aGlzKX19ZnVuY3Rpb24gVG4oZSx0LG4scil7cmV0dXJuIGQobikmJihuPShyPW4pLmhhbmRsZXIpLCJzdHJpbmciPT10eXBlb2YgbiYmKG49ZVtuXSksZS4kd2F0Y2godCxuLHIpfXZhciBPbixFbixBbixJbiwkbixQbixNbixqbj0wO2Z1bmN0aW9uIExuKGUsdCl7dmFyIG49ZS4kb3B0aW9ucz1PYmplY3QuY3JlYXRlKGUuY29uc3RydWN0b3Iub3B0aW9ucykscj10Ll9wYXJlbnRWbm9kZTtuLnBhcmVudD10LnBhcmVudCxuLl9wYXJlbnRWbm9kZT1yLG4uX3BhcmVudEVsbT10Ll9wYXJlbnRFbG0sbi5fcmVmRWxtPXQuX3JlZkVsbTt2YXIgaT1yLmNvbXBvbmVudE9wdGlvbnM7bi5wcm9wc0RhdGE9aS5wcm9wc0RhdGEsbi5fcGFyZW50TGlzdGVuZXJzPWkubGlzdGVuZXJzLG4uX3JlbmRlckNoaWxkcmVuPWkuY2hpbGRyZW4sbi5fY29tcG9uZW50VGFnPWkudGFnLHQucmVuZGVyJiYobi5yZW5kZXI9dC5yZW5kZXIsbi5zdGF0aWNSZW5kZXJGbnM9dC5zdGF0aWNSZW5kZXJGbnMpfWZ1bmN0aW9uIE5uKGUpe3ZhciB0PWUub3B0aW9ucztpZihlLnN1cGVyKXt2YXIgbj1ObihlLnN1cGVyKTtpZihuIT09ZS5zdXBlck9wdGlvbnMpe2Uuc3VwZXJPcHRpb25zPW47dmFyIHI9ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLm9wdGlvbnMscj1lLnNlYWxlZE9wdGlvbnM7Zm9yKHZhciBpIGluIG4pbltpXSE9PXJbaV0mJih0fHwodD17fSksdFtpXT1uW2ldKTtyZXR1cm4gdH0oZSk7ciYmTihlLmV4dGVuZE9wdGlvbnMsciksKHQ9ZS5vcHRpb25zPUllKG4sZS5leHRlbmRPcHRpb25zKSkubmFtZSYmKHQuY29tcG9uZW50c1t0Lm5hbWVdPWUpfX1yZXR1cm4gdH1mdW5jdGlvbiBCbihlKXt0aGlzLl9pbml0KGUpfWZ1bmN0aW9uIERuKGUpe2UuY2lkPTA7dmFyIGE9MTtlLmV4dGVuZD1mdW5jdGlvbihlKXtlPWV8fHt9O3ZhciB0PXRoaXMsbj10LmNpZCxyPWUuX0N0b3J8fChlLl9DdG9yPXt9KTtpZihyW25dKXJldHVybiByW25dO3ZhciBpPWUubmFtZXx8dC5vcHRpb25zLm5hbWUsbz1mdW5jdGlvbihlKXt0aGlzLl9pbml0KGUpfTtyZXR1cm4oKG8ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1vKS5jaWQ9YSsrLG8ub3B0aW9ucz1JZSh0Lm9wdGlvbnMsZSksby5zdXBlcj10LG8ub3B0aW9ucy5wcm9wcyYmZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vcHRpb25zLnByb3BzO2Zvcih2YXIgbiBpbiB0KV9uKGUucHJvdG90eXBlLCJfcHJvcHMiLG4pfShvKSxvLm9wdGlvbnMuY29tcHV0ZWQmJmZ1bmN0aW9uKGUpe3ZhciB0PWUub3B0aW9ucy5jb21wdXRlZDtmb3IodmFyIG4gaW4gdClTbihlLnByb3RvdHlwZSxuLHRbbl0pfShvKSxvLmV4dGVuZD10LmV4dGVuZCxvLm1peGluPXQubWl4aW4sby51c2U9dC51c2Usai5mb3JFYWNoKGZ1bmN0aW9uKGUpe29bZV09dFtlXX0pLGkmJihvLm9wdGlvbnMuY29tcG9uZW50c1tpXT1vKSxvLnN1cGVyT3B0aW9ucz10Lm9wdGlvbnMsby5leHRlbmRPcHRpb25zPWUsby5zZWFsZWRPcHRpb25zPU4oe30sby5vcHRpb25zKSxyW25dPW99fWZ1bmN0aW9uIFJuKGUpe3JldHVybiBlJiYoZS5DdG9yLm9wdGlvbnMubmFtZXx8ZS50YWcpfWZ1bmN0aW9uIEZuKGUsdCl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/LTE8ZS5pbmRleE9mKHQpOiJzdHJpbmciPT10eXBlb2YgZT8tMTxlLnNwbGl0KCIsIikuaW5kZXhPZih0KToobj1lLCJbb2JqZWN0IFJlZ0V4cF0iPT09ci5jYWxsKG4pJiZlLnRlc3QodCkpO3ZhciBufWZ1bmN0aW9uIHpuKGUsdCl7dmFyIG49ZS5jYWNoZSxyPWUua2V5cyxpPWUuX3Zub2RlO2Zvcih2YXIgbyBpbiBuKXt2YXIgYT1uW29dO2lmKGEpe3ZhciBzPVJuKGEuY29tcG9uZW50T3B0aW9ucyk7cyYmIXQocykmJlZuKG4sbyxyLGkpfX19ZnVuY3Rpb24gVm4oZSx0LG4scil7dmFyIGk9ZVt0XTshaXx8ciYmaS50YWc9PT1yLnRhZ3x8aS5jb21wb25lbnRJbnN0YW5jZS4kZGVzdHJveSgpLGVbdF09bnVsbCxrKG4sdCl9Qm4ucHJvdG90eXBlLl9pbml0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dC5fdWlkPWpuKyssdC5faXNWdWU9ITAsZSYmZS5faXNDb21wb25lbnQ/TG4odCxlKTp0LiRvcHRpb25zPUllKE5uKHQuY29uc3RydWN0b3IpLGV8fHt9LHQpLG5uKCh0Ll9yZW5kZXJQcm94eT10KS5fc2VsZj10KSxKdCh0KSxxdCh0KSxhbih0LCJiZWZvcmVDcmVhdGUiKSwibXAtdG91dGlhbyIhPT10Lm1wSG9zdCYmdHQodCksYm4odCksIm1wLXRvdXRpYW8iIT09dC5tcEhvc3QmJmV0KHQpLCJtcC10b3V0aWFvIiE9PXQubXBIb3N0JiZhbih0LCJjcmVhdGVkIiksdC4kb3B0aW9ucy5lbCYmdC4kbW91bnQodC4kb3B0aW9ucy5lbCl9LE9uPUJuLEVuPXtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YX19LEFuPXtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvcHN9fSxPYmplY3QuZGVmaW5lUHJvcGVydHkoT24ucHJvdG90eXBlLCIkZGF0YSIsRW4pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPbi5wcm90b3R5cGUsIiRwcm9wcyIsQW4pLE9uLnByb3RvdHlwZS4kc2V0PWtlLE9uLnByb3RvdHlwZS4kZGVsZXRlPVNlLE9uLnByb3RvdHlwZS4kd2F0Y2g9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXM7aWYoZCh0KSlyZXR1cm4gVG4ocixlLHQsbik7KG49bnx8e30pLnVzZXI9ITA7dmFyIGk9bmV3IG1uKHIsZSx0LG4pO2lmKG4uaW1tZWRpYXRlKXRyeXt0LmNhbGwocixpLnZhbHVlKX1jYXRjaChlKXtOZShlLHIsJ2NhbGxiYWNrIGZvciBpbW1lZGlhdGUgd2F0Y2hlciAiJytpLmV4cHJlc3Npb24rJyInKX1yZXR1cm4gZnVuY3Rpb24oKXtpLnRlYXJkb3duKCl9fSwkbj0vXmhvb2s6LywoSW49Qm4pLnByb3RvdHlwZS4kb249ZnVuY3Rpb24oZSx0KXtpZihBcnJheS5pc0FycmF5KGUpKWZvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyl0aGlzLiRvbihlW25dLHQpO2Vsc2UodGhpcy5fZXZlbnRzW2VdfHwodGhpcy5fZXZlbnRzW2VdPVtdKSkucHVzaCh0KSwkbi50ZXN0KGUpJiYodGhpcy5faGFzSG9va0V2ZW50PSEwKTtyZXR1cm4gdGhpc30sSW4ucHJvdG90eXBlLiRvbmNlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztmdW5jdGlvbiByKCl7bi4kb2ZmKGUsciksdC5hcHBseShuLGFyZ3VtZW50cyl9cmV0dXJuIHIuZm49dCxuLiRvbihlLHIpLG59LEluLnByb3RvdHlwZS4kb2ZmPWZ1bmN0aW9uKGUsdCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXM7aWYoQXJyYXkuaXNBcnJheShlKSl7Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKXRoaXMuJG9mZihlW25dLHQpO3JldHVybiB0aGlzfXZhciBpLG89dGhpcy5fZXZlbnRzW2VdO2lmKCFvKXJldHVybiB0aGlzO2lmKCF0KXJldHVybiB0aGlzLl9ldmVudHNbZV09bnVsbCx0aGlzO2Zvcih2YXIgYT1vLmxlbmd0aDthLS07KWlmKChpPW9bYV0pPT09dHx8aS5mbj09PXQpe28uc3BsaWNlKGEsMSk7YnJlYWt9cmV0dXJuIHRoaXN9LEluLnByb3RvdHlwZS4kZW1pdD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9ldmVudHNbZV07aWYodCl7dD0xPHQubGVuZ3RoP3kodCk6dDtmb3IodmFyIG49eShhcmd1bWVudHMsMSkscj0nZXZlbnQgaGFuZGxlciBmb3IgIicrZSsnIicsaT0wLG89dC5sZW5ndGg7aTxvO2krKylCZSh0W2ldLHRoaXMsbix0aGlzLHIpfXJldHVybiB0aGlzfSwoUG49Qm4pLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj10aGlzLGk9ci4kZWwsbz1yLl92bm9kZSxhPShuPXRuLHRuPXIsZnVuY3Rpb24oKXt0bj1ufSk7ci5fdm5vZGU9ZSxvP3IuJGVsPXIuX19wYXRjaF9fKG8sZSk6KHIuJGVsPXIuX19wYXRjaF9fKHIuJGVsLGUsdCwhMSxyLiRvcHRpb25zLl9wYXJlbnRFbG0sci4kb3B0aW9ucy5fcmVmRWxtKSxyLiRvcHRpb25zLl9wYXJlbnRFbG09ci4kb3B0aW9ucy5fcmVmRWxtPW51bGwpLGEoKSxpJiYoaS5fX3Z1ZV9fPW51bGwpLHIuJGVsJiYoci4kZWwuX192dWVfXz1yKSxyLiR2bm9kZSYmci4kcGFyZW50JiZyLiR2bm9kZT09PXIuJHBhcmVudC5fdm5vZGUmJihyLiRwYXJlbnQuJGVsPXIuJGVsKX0sUG4ucHJvdG90eXBlLiRmb3JjZVVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuX3dhdGNoZXImJnRoaXMuX3dhdGNoZXIudXBkYXRlKCl9LFBuLnByb3RvdHlwZS4kZGVzdHJveT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYoIWUuX2lzQmVpbmdEZXN0cm95ZWQpe2FuKGUsImJlZm9yZURlc3Ryb3kiKSxlLl9pc0JlaW5nRGVzdHJveWVkPSEwO3ZhciB0PWUuJHBhcmVudDshdHx8dC5faXNCZWluZ0Rlc3Ryb3llZHx8ZS4kb3B0aW9ucy5hYnN0cmFjdHx8ayh0LiRjaGlsZHJlbixlKSxlLl93YXRjaGVyJiZlLl93YXRjaGVyLnRlYXJkb3duKCk7Zm9yKHZhciBuPWUuX3dhdGNoZXJzLmxlbmd0aDtuLS07KWUuX3dhdGNoZXJzW25dLnRlYXJkb3duKCk7ZS5fZGF0YS5fX29iX18mJmUuX2RhdGEuX19vYl9fLnZtQ291bnQtLSxlLl9pc0Rlc3Ryb3llZD0hMCxlLl9fcGF0Y2hfXyhlLl92bm9kZSxudWxsKSxhbihlLCJkZXN0cm95ZWQiKSxlLiRvZmYoKSxlLiRlbCYmKGUuJGVsLl9fdnVlX189bnVsbCksZS4kdm5vZGUmJihlLiR2bm9kZS5wYXJlbnQ9bnVsbCl9fSxrdCgoTW49Qm4pLnByb3RvdHlwZSksTW4ucHJvdG90eXBlLiRuZXh0VGljaz1mdW5jdGlvbihlKXtyZXR1cm4gcWUoZSx0aGlzKX0sTW4ucHJvdG90eXBlLl9yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdCxuPXRoaXMsZT1uLiRvcHRpb25zLHI9ZS5yZW5kZXIsaT1lLl9wYXJlbnRWbm9kZTtpJiYobi4kc2NvcGVkU2xvdHM9b3QoaS5kYXRhLnNjb3BlZFNsb3RzLG4uJHNsb3RzLG4uJHNjb3BlZFNsb3RzKSksbi4kdm5vZGU9aTt0cnl7SHQ9bix0PXIuY2FsbChuLl9yZW5kZXJQcm94eSxuLiRjcmVhdGVFbGVtZW50KX1jYXRjaChlKXtOZShlLG4sInJlbmRlciIpLHQ9bi5fdm5vZGV9ZmluYWxseXtIdD1udWxsfXJldHVybiBBcnJheS5pc0FycmF5KHQpJiYxPT09dC5sZW5ndGgmJih0PXRbMF0pLHQgaW5zdGFuY2VvZiB1ZXx8KHQ9ZGUoKSksdC5wYXJlbnQ9aSx0fTt2YXIgVW4scW4sV24sSG49W1N0cmluZyxSZWdFeHAsQXJyYXldLEduPXtLZWVwQWxpdmU6e25hbWU6ImtlZXAtYWxpdmUiLGFic3RyYWN0OiEwLHByb3BzOntpbmNsdWRlOkhuLGV4Y2x1ZGU6SG4sbWF4OltTdHJpbmcsTnVtYmVyXX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuY2FjaGU9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLmtleXM9W119LGRlc3Ryb3llZDpmdW5jdGlvbigpe2Zvcih2YXIgZSBpbiB0aGlzLmNhY2hlKVZuKHRoaXMuY2FjaGUsZSx0aGlzLmtleXMpfSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLiR3YXRjaCgiaW5jbHVkZSIsZnVuY3Rpb24odCl7em4oZSxmdW5jdGlvbihlKXtyZXR1cm4gRm4odCxlKX0pfSksdGhpcy4kd2F0Y2goImV4Y2x1ZGUiLGZ1bmN0aW9uKHQpe3puKGUsZnVuY3Rpb24oZSl7cmV0dXJuIUZuKHQsZSl9KX0pfSxyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRzbG90cy5kZWZhdWx0LHQ9WXQoZSksbj10JiZ0LmNvbXBvbmVudE9wdGlvbnM7aWYobil7dmFyIHI9Um4obiksaT10aGlzLmluY2x1ZGUsbz10aGlzLmV4Y2x1ZGU7aWYoaSYmKCFyfHwhRm4oaSxyKSl8fG8mJnImJkZuKG8scikpcmV0dXJuIHQ7dmFyIGE9dGhpcy5jYWNoZSxzPXRoaXMua2V5cyxjPW51bGw9PXQua2V5P24uQ3Rvci5jaWQrKG4udGFnPyI6OiIrbi50YWc6IiIpOnQua2V5O2FbY10/KHQuY29tcG9uZW50SW5zdGFuY2U9YVtjXS5jb21wb25lbnRJbnN0YW5jZSxrKHMsYykscy5wdXNoKGMpKTooYVtjXT10LHMucHVzaChjKSx0aGlzLm1heCYmcy5sZW5ndGg+cGFyc2VJbnQodGhpcy5tYXgpJiZWbihhLHNbMF0scyx0aGlzLl92bm9kZSkpLHQuZGF0YS5rZWVwQWxpdmU9ITB9cmV0dXJuIHR8fGUmJmVbMF19fX07VW49Qm4sV249e2dldDpmdW5jdGlvbigpe3JldHVybiBSfX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KFVuLCJjb25maWciLFduKSxVbi51dGlsPXt3YXJuOmllLGV4dGVuZDpOLG1lcmdlT3B0aW9uczpJZSxkZWZpbmVSZWFjdGl2ZTp3ZX0sVW4uc2V0PWtlLFVuLmRlbGV0ZT1TZSxVbi5uZXh0VGljaz1xZSxVbi5vYnNlcnZhYmxlPWZ1bmN0aW9uKGUpe3JldHVybiBiZShlKSxlfSxVbi5vcHRpb25zPU9iamVjdC5jcmVhdGUobnVsbCksai5mb3JFYWNoKGZ1bmN0aW9uKGUpe1VuLm9wdGlvbnNbZSsicyJdPU9iamVjdC5jcmVhdGUobnVsbCl9KSxOKChVbi5vcHRpb25zLl9iYXNlPVVuKS5vcHRpb25zLmNvbXBvbmVudHMsR24pLFVuLnVzZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9pbnN0YWxsZWRQbHVnaW5zfHwodGhpcy5faW5zdGFsbGVkUGx1Z2lucz1bXSk7aWYoLTE8dC5pbmRleE9mKGUpKXJldHVybiB0aGlzO3ZhciBuPXkoYXJndW1lbnRzLDEpO3JldHVybiBuLnVuc2hpZnQodGhpcyksImZ1bmN0aW9uIj09dHlwZW9mIGUuaW5zdGFsbD9lLmluc3RhbGwuYXBwbHkoZSxuKToiZnVuY3Rpb24iPT10eXBlb2YgZSYmZS5hcHBseShudWxsLG4pLHQucHVzaChlKSx0aGlzfSxVbi5taXhpbj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vcHRpb25zPUllKHRoaXMub3B0aW9ucyxlKSx0aGlzfSxEbihVbikscW49VW4sai5mb3JFYWNoKGZ1bmN0aW9uKG4pe3FuW25dPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/KCJjb21wb25lbnQiPT09biYmZCh0KSYmKHQubmFtZT10Lm5hbWV8fGUsdD10aGlzLm9wdGlvbnMuX2Jhc2UuZXh0ZW5kKHQpKSwiZGlyZWN0aXZlIj09PW4mJiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYodD17YmluZDp0LHVwZGF0ZTp0fSksdGhpcy5vcHRpb25zW24rInMiXVtlXT10KTp0aGlzLm9wdGlvbnNbbisicyJdW2VdfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCbi5wcm90b3R5cGUsIiRpc1NlcnZlciIse2dldDpRfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEJuLnByb3RvdHlwZSwiJHNzckNvbnRleHQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdm5vZGUmJnRoaXMuJHZub2RlLnNzckNvbnRleHR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEJuLCJGdW5jdGlvbmFsUmVuZGVyQ29udGV4dCIse3ZhbHVlOlN0fSksQm4udmVyc2lvbj0iMi42LjEwIjt2YXIgWG49MTtmdW5jdGlvbiBZbihlKXt0aGlzLmluc3RhbmNlSWQ9IiIsdGhpcy5ub2RlSWQ9WG4rKyx0aGlzLnBhcmVudE5vZGU9bnVsbCx0aGlzLm5vZGVUeXBlPTMsdGhpcy50ZXh0PWV9ZnVuY3Rpb24gSm4oZSl7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChlKX12YXIgS249T2JqZWN0LmZyZWV6ZSh7bmFtZXNwYWNlTWFwOnt9LGNyZWF0ZUVsZW1lbnQ6Sm4sY3JlYXRlRWxlbWVudE5TOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChlKyI6Iit0KX0sY3JlYXRlVGV4dE5vZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBZbihlKX0sY3JlYXRlQ29tbWVudDpmdW5jdGlvbihlKXtyZXR1cm4gYS5jcmVhdGVDb21tZW50KGUpfSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24oZSx0LG4pe2lmKDMhPT10Lm5vZGVUeXBlKWUuaW5zZXJ0QmVmb3JlKHQsbik7ZWxzZXt2YXIgcj0id2VleCI9PT1hLl9fJGNvbXBpbGVyX18/InRleHQiOiJ1LXRleHQiO2lmKGUudHlwZT09PXIpZS5zZXRBdHRyKCJ2YWx1ZSIsdC50ZXh0KSx0LnBhcmVudE5vZGU9ZTtlbHNle3ZhciBpPUpuKHIpO2kuc2V0QXR0cigidmFsdWUiLHQudGV4dCksZS5pbnNlcnRCZWZvcmUoaSxuKX19fSxyZW1vdmVDaGlsZDpmdW5jdGlvbihlLHQpezMhPT10Lm5vZGVUeXBlP2UucmVtb3ZlQ2hpbGQodCk6ZS5zZXRBdHRyKCJ2YWx1ZSIsIiIpfSxhcHBlbmRDaGlsZDpmdW5jdGlvbihlLHQpe2lmKDMhPT10Lm5vZGVUeXBlKWUuYXBwZW5kQ2hpbGQodCk7ZWxzZXt2YXIgbj0id2VleCI9PT1hLl9fJGNvbXBpbGVyX18/InRleHQiOiJ1LXRleHQiO2lmKGUudHlwZT09PW4pZS5zZXRBdHRyKCJ2YWx1ZSIsdC50ZXh0KSx0LnBhcmVudE5vZGU9ZTtlbHNle3ZhciByPUpuKG4pO3Iuc2V0QXR0cigidmFsdWUiLHQudGV4dCksZS5hcHBlbmRDaGlsZChyKX19fSxwYXJlbnROb2RlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnBhcmVudE5vZGV9LG5leHRTaWJsaW5nOmZ1bmN0aW9uKGUpe3JldHVybiBlLm5leHRTaWJsaW5nfSx0YWdOYW1lOmZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGV9LHNldFRleHRDb250ZW50OmZ1bmN0aW9uKGUsdCl7ZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUuc2V0QXR0cigidmFsdWUiLHQpfSxzZXRBdHRyaWJ1dGU6ZnVuY3Rpb24oZSx0LG4pe2Uuc2V0QXR0cih0LG4pfSxzZXRTdHlsZVNjb3BlOmZ1bmN0aW9uKGUsdCl7ZS5zZXRBdHRyKCJAc3R5bGVTY29wZSIsdCl9fSksWm49e2NyZWF0ZTpmdW5jdGlvbihlLHQpe1FuKHQpfSx1cGRhdGU6ZnVuY3Rpb24oZSx0KXtlLmRhdGEucmVmIT09dC5kYXRhLnJlZiYmKFFuKGUsITApLFFuKHQpKX0sZGVzdHJveTpmdW5jdGlvbihlKXtRbihlLCEwKX19O2Z1bmN0aW9uIFFuKGUsdCl7dmFyIG49ZS5kYXRhLnJlZjtpZihBKG4pKXt2YXIgcj1lLmNvbnRleHQsaT1lLmNvbXBvbmVudEluc3RhbmNlfHxlLmVsbSxvPXIuJHJlZnM7dD9BcnJheS5pc0FycmF5KG9bbl0pP2sob1tuXSxpKTpvW25dPT09aSYmKG9bbl09dm9pZCAwKTplLmRhdGEucmVmSW5Gb3I/QXJyYXkuaXNBcnJheShvW25dKT9vW25dLmluZGV4T2YoaSk8MCYmb1tuXS5wdXNoKGkpOm9bbl09W2ldOm9bbl09aX19cygiaHRtbCxib2R5LGJhc2UsaGVhZCxsaW5rLG1ldGEsc3R5bGUsdGl0bGUsYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGZvb3RlcixoZWFkZXIsaDEsaDIsaDMsaDQsaDUsaDYsaGdyb3VwLG5hdixzZWN0aW9uLGRpdixkZCxkbCxkdCxmaWdjYXB0aW9uLGZpZ3VyZSxwaWN0dXJlLGhyLGltZyxsaSxtYWluLG9sLHAscHJlLHVsLGEsYixhYmJyLGJkaSxiZG8sYnIsY2l0ZSxjb2RlLGRhdGEsZGZuLGVtLGksa2JkLG1hcmsscSxycCxydCxydGMscnVieSxzLHNhbXAsc21hbGwsc3BhbixzdHJvbmcsc3ViLHN1cCx0aW1lLHUsdmFyLHdicixhcmVhLGF1ZGlvLG1hcCx0cmFjayx2aWRlbyxlbWJlZCxvYmplY3QscGFyYW0sc291cmNlLGNhbnZhcyxzY3JpcHQsbm9zY3JpcHQsZGVsLGlucyxjYXB0aW9uLGNvbCxjb2xncm91cCx0YWJsZSx0aGVhZCx0Ym9keSx0ZCx0aCx0cixidXR0b24sZGF0YWxpc3QsZmllbGRzZXQsZm9ybSxpbnB1dCxsYWJlbCxsZWdlbmQsbWV0ZXIsb3B0Z3JvdXAsb3B0aW9uLG91dHB1dCxwcm9ncmVzcyxzZWxlY3QsdGV4dGFyZWEsZGV0YWlscyxkaWFsb2csbWVudSxtZW51aXRlbSxzdW1tYXJ5LGNvbnRlbnQsZWxlbWVudCxzaGFkb3csdGVtcGxhdGUsYmxvY2txdW90ZSxpZnJhbWUsdGZvb3QiKSxzKCJzdmcsYW5pbWF0ZSxjaXJjbGUsY2xpcHBhdGgsY3Vyc29yLGRlZnMsZGVzYyxlbGxpcHNlLGZpbHRlcixmb250LWZhY2UsZm9yZWlnbk9iamVjdCxnLGdseXBoLGltYWdlLGxpbmUsbWFya2VyLG1hc2ssbWlzc2luZy1nbHlwaCxwYXRoLHBhdHRlcm4scG9seWdvbixwb2x5bGluZSxyZWN0LHN3aXRjaCxzeW1ib2wsdGV4dCx0ZXh0cGF0aCx0c3Bhbix1c2UsdmlldyIsITApO3ZhciBlcj1zKCJ0ZXh0LG51bWJlcixwYXNzd29yZCxzZWFyY2gsZW1haWwsdGVsLHVybCIpLHRyPW5ldyB1ZSgiIix7fSxbXSksbnI9WyJjcmVhdGUiLCJhY3RpdmF0ZSIsInVwZGF0ZSIsInJlbW92ZSIsImRlc3Ryb3kiXTtmdW5jdGlvbiBycihlLHQpe3JldHVybiBlLmtleT09PXQua2V5JiYoZS50YWc9PT10LnRhZyYmZS5pc0NvbW1lbnQ9PT10LmlzQ29tbWVudCYmQShlLmRhdGEpPT09QSh0LmRhdGEpJiZmdW5jdGlvbihlLHQpe2lmKCJpbnB1dCIhPT1lLnRhZylyZXR1cm4hMDt2YXIgbixyPUEobj1lLmRhdGEpJiZBKG49bi5hdHRycykmJm4udHlwZSxpPUEobj10LmRhdGEpJiZBKG49bi5hdHRycykmJm4udHlwZTtyZXR1cm4gcj09PWl8fGVyKHIpJiZlcihpKX0oZSx0KXx8SShlLmlzQXN5bmNQbGFjZWhvbGRlcikmJmUuYXN5bmNGYWN0b3J5PT09dC5hc3luY0ZhY3RvcnkmJkUodC5hc3luY0ZhY3RvcnkuZXJyb3IpKX1mdW5jdGlvbiBpcihlLHQsbil7dmFyIHIsaSxvPXt9O2ZvcihyPXQ7cjw9bjsrK3IpQShpPWVbcl0ua2V5KSYmKG9baV09cik7cmV0dXJuIG99dmFyIG9yPXtjcmVhdGU6YXIsdXBkYXRlOmFyLGRlc3Ryb3k6ZnVuY3Rpb24oZSl7YXIoZSx0cil9fTtmdW5jdGlvbiBhcihlLHQpeyhlLmRhdGEuZGlyZWN0aXZlc3x8dC5kYXRhLmRpcmVjdGl2ZXMpJiZmdW5jdGlvbih0LG4pe3ZhciBlLHIsaSxvPXQ9PT10cixhPW49PT10cixzPWNyKHQuZGF0YS5kaXJlY3RpdmVzLHQuY29udGV4dCksYz1jcihuLmRhdGEuZGlyZWN0aXZlcyxuLmNvbnRleHQpLHU9W10sbD1bXTtmb3IoZSBpbiBjKXI9c1tlXSxpPWNbZV0scj8oaS5vbGRWYWx1ZT1yLnZhbHVlLGkub2xkQXJnPXIuYXJnLHVyKGksInVwZGF0ZSIsbix0KSxpLmRlZiYmaS5kZWYuY29tcG9uZW50VXBkYXRlZCYmbC5wdXNoKGkpKToodXIoaSwiYmluZCIsbix0KSxpLmRlZiYmaS5kZWYuaW5zZXJ0ZWQmJnUucHVzaChpKSk7aWYodS5sZW5ndGgpe3ZhciBkPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTx1Lmxlbmd0aDtlKyspdXIodVtlXSwiaW5zZXJ0ZWQiLG4sdCl9O28/SmUobiwiaW5zZXJ0IixkKTpkKCl9bC5sZW5ndGgmJkplKG4sInBvc3RwYXRjaCIsZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPGwubGVuZ3RoO2UrKyl1cihsW2VdLCJjb21wb25lbnRVcGRhdGVkIixuLHQpfSk7aWYoIW8pZm9yKGUgaW4gcyljW2VdfHx1cihzW2VdLCJ1bmJpbmQiLHQsdCxhKX0oZSx0KX12YXIgc3I9T2JqZWN0LmNyZWF0ZShudWxsKTtmdW5jdGlvbiBjcihlLHQpe3ZhciBuLHIsaSxvPU9iamVjdC5jcmVhdGUobnVsbCk7aWYoIWUpcmV0dXJuIG87Zm9yKG49MDtuPGUubGVuZ3RoO24rKykocj1lW25dKS5tb2RpZmllcnN8fChyLm1vZGlmaWVycz1zciksKG9bKGk9cixpLnJhd05hbWV8fGkubmFtZSsiLiIrT2JqZWN0LmtleXMoaS5tb2RpZmllcnN8fHt9KS5qb2luKCIuIikpXT1yKS5kZWY9JGUodC4kb3B0aW9ucywiZGlyZWN0aXZlcyIsci5uYW1lKTtyZXR1cm4gb31mdW5jdGlvbiB1cih0LG4scixlLGkpe3ZhciBvPXQuZGVmJiZ0LmRlZltuXTtpZihvKXRyeXtvKHIuZWxtLHQscixlLGkpfWNhdGNoKGUpe05lKGUsci5jb250ZXh0LCJkaXJlY3RpdmUgIit0Lm5hbWUrIiAiK24rIiBob29rIil9fXZhciBscj1bWm4sb3JdLGRyPXUoZnVuY3Rpb24oZSl7dmFyIG49e30scj0vOiguKykvO3JldHVybiBlLnNwbGl0KC87KD8hW14oXSpcKSkvZykuZm9yRWFjaChmdW5jdGlvbihlKXtpZihlKXt2YXIgdD1lLnNwbGl0KHIpOzE8dC5sZW5ndGgmJihuW3RbMF0udHJpbSgpXT10WzFdLnRyaW0oKSl9fSksbn0pO2Z1bmN0aW9uIGZyKGUpe3ZhciB0PXByKGUuc3R5bGUpO3JldHVybiBlLnN0YXRpY1N0eWxlP04oZS5zdGF0aWNTdHlsZSx0KTp0fWZ1bmN0aW9uIHByKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP3goZSk6InN0cmluZyI9PXR5cGVvZiBlP2RyKGUpOmV9dmFyIGhyPXt2aWV3OntjbGFzczpbImhvdmVyQ2xhc3MiXSxzdHlsZTpbXX0sYnV0dG9uOntjbGFzczpbImhvdmVyQ2xhc3MiXSxzdHlsZTpbXX0sbmF2aWdhdG9yOntjbGFzczpbImhvdmVyQ2xhc3MiXSxzdHlsZTpbXX0sInUtaW5wdXQiOntjbGFzczpbInBsYWNlaG9sZGVyQ2xhc3MiXSxzdHlsZTpbInBsYWNlaG9sZGVyU3R5bGUiXX0sInUtdGV4dGFyZWEiOntjbGFzczpbInBsYWNlaG9sZGVyQ2xhc3MiXSxzdHlsZTpbInBsYWNlaG9sZGVyU3R5bGUiXX0sInBpY2tlci12aWV3Ijp7Y2xhc3M6WyJpbmRpY2F0b3JDbGFzcyIsIm1hc2tDbGFzcyJdLHN0eWxlOlsiaW5kaWNhdG9yU3R5bGUiLCJtYXNrU3R5bGUiXX19O2Z1bmN0aW9uIHZyKGUsdCxuLHIpe2lmKCF0KXJldHVybiB0O3ZhciBpPWhyW24udHlwZV07aWYoaSl7aWYoLTEhPT1pLmNsYXNzLmluZGV4T2YoZSkpcmV0dXJuIHIuJG9wdGlvbnMuc3R5bGUmJnIuJG9wdGlvbnMuc3R5bGVbdF18fHt9O2lmKC0xIT09aS5zdHlsZS5pbmRleE9mKGUpKXJldHVybiBwcih0KX1yZXR1cm4gdH1mdW5jdGlvbiBncihlLHQpe2lmKGUuZGF0YS5hdHRyc3x8dC5kYXRhLmF0dHJzKXt2YXIgbixyLGk9dC5lbG0sbz1lLmRhdGEuYXR0cnN8fHt9LGE9dC5kYXRhLmF0dHJzfHx7fTthLl9fb2JfXyYmKGE9dC5kYXRhLmF0dHJzPU4oe30sYSkpO3ZhciBzPSJmdW5jdGlvbiI9PXR5cGVvZiBpLnNldEF0dHJzLGM9e307Zm9yKG4gaW4gYSlyPWFbbl0sb1tuXSE9PXImJihzP2Nbbl09cjppLnNldEF0dHIobix2cihuLHIsaSx0LmNvbnRleHQpKSk7Zm9yKG4gaW4gbyludWxsPT1hW25dJiYocz9jW25dPXZvaWQgMDppLnNldEF0dHIobikpO3MmJmkuc2V0QXR0cnMoZnVuY3Rpb24obyxlLHQpe3ZhciBhPWhyW2UudHlwZV07aWYoIWEpcmV0dXJuIG87dmFyIHM9dC4kb3B0aW9ucy5zdHlsZXx8e30sYz1zWyJAVkVSU0lPTiJdfHwxO3JldHVybiBPYmplY3Qua2V5cyhvKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PW9bZV07aWYoLTEhPT1hLmNsYXNzLmluZGV4T2YoZSkpaWYoYzwyfHwhKCIuIit0IGluIHMpKW9bZV09c1t0XXx8e307ZWxzZXt2YXIgbj0oc1siLiIrdF18fHt9KVsiIl18fHt9LHI9e307Zm9yKHZhciBpIGluIG4pcltpXT1uW2ldWzBdO29bZV09cn1lbHNlLTEhPT1hLnN0eWxlLmluZGV4T2YoZSkmJihvW2VdPXByKHQpKX0pLG99KGMsaSx0LmNvbnRleHQpKX19dmFyIG1yPXtjcmVhdGU6Z3IsdXBkYXRlOmdyfTtmdW5jdGlvbiB5cihlKXtmb3IodmFyIHQ9X3IoZSksbj1lLHI9ZTtBKHIuY29tcG9uZW50SW5zdGFuY2UpOykocj1yLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSkmJnIuZGF0YSYmKHQ9TihfcihyKSx0KSk7Zm9yKDtBKG49bi5wYXJlbnQpOyluJiZuLmRhdGEmJih0PU4odCxfcihuKSkpO3JldHVybiB0fWZ1bmN0aW9uIF9yKGUpe3ZhciB0LG4scixpLG89ZS5kYXRhO3JldHVybiBFKG8uc3RhdGljQ2xhc3MpJiZFKG8uY2xhc3MpP3t9Oih0PWZ1bmN0aW9uKGUpe3ZhciB0PVtdLG49ZS5zdGF0aWNDbGFzcyxyPWUuY2xhc3M7biYmdC5wdXNoLmFwcGx5KHQsbik7QXJyYXkuaXNBcnJheShyKT90LnB1c2guYXBwbHkodCxyKTpiKHIpP3QucHVzaC5hcHBseSh0LE9iamVjdC5rZXlzKHIpLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gcltlXX0pKToic3RyaW5nIj09dHlwZW9mIHImJnQucHVzaC5hcHBseSh0LHIudHJpbSgpLnNwbGl0KC9ccysvKSk7cmV0dXJuIHR9KG8pLG49ZS5jb250ZXh0LHI9bi4kb3B0aW9ucy5zdHlsZXx8e30saT17fSx0LmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9cltlXTtOKGksdCl9KSxpKX1mdW5jdGlvbiBicihlLHQsbixyKXt2YXIgaSxvLGE9e307Zm9yKG8gaW4gbilFKHRbb10pJiYoYVtyKG8pXT0iIik7Zm9yKG8gaW4gdCkoaT10W29dKSE9PW5bb10mJihhW3IobyldPWkpO2Uuc2V0U3R5bGVzKGEpfWZ1bmN0aW9uIHdyKGUsdCxuKXt2YXIgcj10JiZ0LmNvbnRleHQuJG9wdGlvbnMuc3R5bGU7ciYmIWUuaW5jbHVkZXMocikmJihuP2UudW5zaGlmdChyKTplLnB1c2gocikpfWZ1bmN0aW9uIGtyKGUpe2Zvcih2YXIgdD1lLmRhdGEsbj1lLHI9ZTtBKHIuY29tcG9uZW50SW5zdGFuY2UpOykocj1yLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSkmJnIuZGF0YSYmKHQ9U3Ioci5kYXRhLHQpKTtmb3IoO0Eobj1uLnBhcmVudCk7KW4mJm4uZGF0YSYmKHQ9U3IodCxuLmRhdGEpKTtyZXR1cm4gZnVuY3Rpb24oZSx0KXtpZihBKGUpfHxBKHQpKXJldHVybiB4cihDcihlKSxDcih0KSk7cmV0dXJuIiJ9KHQuc3RhdGljQ2xhc3MsdC5jbGFzcyl9ZnVuY3Rpb24gU3IoZSx0KXtyZXR1cm57c3RhdGljQ2xhc3M6eHIoQ3IoZS5zdGF0aWNDbGFzcyksQ3IodC5zdGF0aWNDbGFzcykpLGNsYXNzOkEoZS5jbGFzcyk/W2UuY2xhc3MsdC5jbGFzc106dC5jbGFzc319ZnVuY3Rpb24geHIoZSx0KXtyZXR1cm4gZT90P2UrIiAiK3Q6ZTp0fHwiIn1mdW5jdGlvbiBDcihlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9mdW5jdGlvbihlKXtmb3IodmFyIHQsbj0iIixyPTAsaT1lLmxlbmd0aDtyPGk7cisrKUEodD1DcihlW3JdKSkmJiIiIT09dCYmKG4mJihuKz0iICIpLG4rPXQpO3JldHVybiBufShlKTpiKGUpP2Z1bmN0aW9uKGUpe3ZhciB0PSIiO2Zvcih2YXIgbiBpbiBlKWVbbl0mJih0JiYodCs9IiAiKSx0Kz1uKTtyZXR1cm4gdH0oZSk6InN0cmluZyI9PXR5cGVvZiBlP2U6IiJ9ZnVuY3Rpb24gVHIoZSx0KXt2YXIgbj10LmRhdGEscj1lLmRhdGE7aWYoIShFKG4uc3RhdGljQ2xhc3MpJiZFKG4uY2xhc3MpJiYoRShyKXx8RShyLnN0YXRpY0NsYXNzKSYmRShyLmNsYXNzKSkpKXt2YXIgaT0id2VleCI9PT1hLl9fJHN0eWxlQ29tcGlsZXJfXztpZihhLl9fJGF1dG9tYXRvcl9ffHwhaSl7aXx8dC5lbG0uc2V0U3R5bGVzaGVldCYmdC5lbG0uc2V0U3R5bGVzaGVldChmdW5jdGlvbihlKXt2YXIgdD1bXSxuPWUscj1lO2Zvcih3cih0LGUpO0Eoci5jb21wb25lbnRJbnN0YW5jZSk7KXdyKHQscj1yLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSwhMCk7Zm9yKDtBKG49bi5wYXJlbnQpOyl3cih0LG4pO3JldHVybiB0fSh0KSk7dmFyIG89a3IodCk7dC5lbG0uc2V0Q2xhc3NMaXN0JiZ0LmVsbS5zZXRDbGFzc0xpc3Qoby5zcGxpdCgiICIpKX1pJiZicih0LmVsbSx5cih0KSx5cihlKSxPcil9fWZ1bmN0aW9uIE9yKGUpe3JldHVybiBlfXZhciBFcixBcixJcj17Y3JlYXRlOlRyLHVwZGF0ZTpUcn07ZnVuY3Rpb24gJHIoZSx0LG4scixpKXtpZihuKWNvbnNvbGUubG9nKCJXZWV4IGRvIG5vdCBzdXBwb3J0IGV2ZW50IGluIGJ1YmJsZSBwaGFzZS4iKTtlbHNle2lmKEFyJiZBci5fdmlydHVhbENvbXBvbmVudHMpe0VyLl9jb250ZXh0PUFyO3ZhciBvPXQ7dD1mdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMsdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGg7bi0tOyl0W25dPWVbbl07dmFyIHI9KHRbMF18fHt9KS5jb21wb25lbnRJZCxpPXRoaXMuX2NvbnRleHQ7ciYmdGhpcy5fY29udGV4dCYmKGk9KHRoaXMuX2NvbnRleHQuX3ZpcnR1YWxDb21wb25lbnRzfHx7fSlbcl18fGkpO3RyeXshZnVuY3Rpb24oZSx0LG4pe3ZvaWQgMD09PW4mJihuPW51bGwpO3ZhciByPWUuZm5zO2lmKCFBcnJheS5pc0FycmF5KHIpKXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiByP3IuYXBwbHkobix0KTplLmFwcGx5KG4sdCk7Zm9yKHZhciBpPXIuc2xpY2UoKSxvPTA7bzxpLmxlbmd0aDtvKyspaVtvXS5hcHBseShuLHQpfShvLHQsaSl9Y2F0Y2goZSl7TmUoZSxpLCJGYWlsZWQgdG8gaW52b2tlIHZpcnR1YWwgY29tcG9uZW50IGhhbmRsZXIgKCIrcisiKSIpfX19RXIuYWRkRXZlbnQoZSx0LGkpfX1mdW5jdGlvbiBQcihlLHQsbixyKXsocnx8RXIpLnJlbW92ZUV2ZW50KGUpfWZ1bmN0aW9uIE1yKGUsdCl7aWYoZS5kYXRhLm9ufHx0LmRhdGEub24pe3ZhciBuPXQuZGF0YS5vbnx8e30scj1lLmRhdGEub258fHt9O0VyPXQuZWxtLEFyPXQuY29udGV4dCxZZShuLHIsJHIsUHIsdC5jb250ZXh0KSxBcj1Fcj12b2lkIDB9fXZhciBqcj17Y3JlYXRlOk1yLHVwZGF0ZTpNcn0sTHI9dShoKTtmdW5jdGlvbiBOcihlLHQpe3ZhciBuPXQuZGF0YSxyPWUuZGF0YTtpZighKEUobi5zdGF0aWNTdHlsZSkmJkUobi5zdHlsZSkmJkUoci5zdGF0aWNTdHlsZSkmJkUoci5zdHlsZSkpKXt2YXIgaT10LmVsbSxvPXIuc3RhdGljU3R5bGUsYT1yLm5vcm1hbGl6ZWRTdHlsZXx8ci5zdHlsZXx8e30scz1vfHxhLGM9cHIodC5kYXRhLnN0eWxlKXx8e307dC5kYXRhLm5vcm1hbGl6ZWRTdHlsZT1BKGMuX19vYl9fKT9OKHt9LGMpOmMsYnIoaSxmdW5jdGlvbihlLHQpe3ZhciBuLHI9e307aWYodClmb3IodmFyIGk9ZTtpLmNvbXBvbmVudEluc3RhbmNlOykoaT1pLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSkmJmkuZGF0YSYmKG49ZnIoaS5kYXRhKSkmJk4ocixuKTsobj1mcihlLmRhdGEpKSYmTihyLG4pO2Zvcih2YXIgbz1lO289by5wYXJlbnQ7KW8uZGF0YSYmKG49ZnIoby5kYXRhKSkmJk4ocixuKTtyZXR1cm4gcn0odCwhMCkscyxMcil9fXZhciBCcj17Y3JlYXRlOk5yLHVwZGF0ZTpOcn07ZnVuY3Rpb24gRHIoZSl7aWYoZSl7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXt2YXIgdD17fTtyZXR1cm4hMSE9PWUuY3NzJiZOKHQsUnIoZS5uYW1lfHwidiIpKSxOKHQsZSksdH1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/UnIoZSk6dm9pZCAwfX12YXIgUnI9dShmdW5jdGlvbihlKXtyZXR1cm57ZW50ZXJDbGFzczplKyItZW50ZXIiLGVudGVyVG9DbGFzczplKyItZW50ZXItdG8iLGVudGVyQWN0aXZlQ2xhc3M6ZSsiLWVudGVyLWFjdGl2ZSIsbGVhdmVDbGFzczplKyItbGVhdmUiLGxlYXZlVG9DbGFzczplKyItbGVhdmUtdG8iLGxlYXZlQWN0aXZlQ2xhc3M6ZSsiLWxlYXZlLWFjdGl2ZSJ9fSk7cSYmIVkmJih2b2lkIDA9PT13aW5kb3cub250cmFuc2l0aW9uZW5kJiZ3aW5kb3cub253ZWJraXR0cmFuc2l0aW9uZW5kLHZvaWQgMD09PXdpbmRvdy5vbmFuaW1hdGlvbmVuZCYmd2luZG93Lm9ud2Via2l0YW5pbWF0aW9uZW5kKTtxJiZ3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lJiZ3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KTtmdW5jdGlvbiBGcihlLG4pe3ZhciByPW4uZWxtO3IuX2xlYXZlQ2ImJihyLl9sZWF2ZUNiLmNhbmNlbGxlZD0hMCxyLl9sZWF2ZUNiKCkpO3ZhciB0PURyKG4uZGF0YS50cmFuc2l0aW9uKTtpZih0JiYhci5fZW50ZXJDYil7Zm9yKHZhciBpPXQuZW50ZXJDbGFzcyxvPXQuZW50ZXJUb0NsYXNzLGE9dC5lbnRlckFjdGl2ZUNsYXNzLHM9dC5hcHBlYXJDbGFzcyxjPXQuYXBwZWFyVG9DbGFzcyx1PXQuYXBwZWFyQWN0aXZlQ2xhc3MsbD10LmJlZm9yZUVudGVyLGQ9dC5lbnRlcixmPXQuYWZ0ZXJFbnRlcixwPXQuZW50ZXJDYW5jZWxsZWQsaD10LmJlZm9yZUFwcGVhcix2PXQuYXBwZWFyLGc9dC5hZnRlckFwcGVhcixtPXQuYXBwZWFyQ2FuY2VsbGVkLHk9dG4sXz10bi4kdm5vZGU7XyYmXy5wYXJlbnQ7KXk9KF89Xy5wYXJlbnQpLmNvbnRleHQ7dmFyIGI9IXkuX2lzTW91bnRlZHx8IW4uaXNSb290SW5zZXJ0O2lmKCFifHx2fHwiIj09PXYpe3ZhciB3PWI/czppLGs9Yj9jOm8sUz1iP3U6YSx4PWImJmh8fGwsQz1iJiYiZnVuY3Rpb24iPT10eXBlb2Ygdj92OmQsVD1iJiZnfHxmLE89YiYmbXx8cCxFPUMmJjE8KEMuX2xlbmd0aHx8Qy5sZW5ndGgpLEE9bi5jb250ZXh0LiRvcHRpb25zLnN0eWxlfHx7fSxJPUFbd10sJD1BWyJAVFJBTlNJVElPTiJdJiZBWyJAVFJBTlNJVElPTiJdW1NdfHx7fSxQPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG89e30sYT10W25dLHM9dFtyXSxjPXRbaV07aWYoYSlmb3IodmFyIHUgaW4gYSlvW3VdPWUuc3R5bGVbdV07aWYoYylmb3IodmFyIGwgaW4gYykwIT09bC5pbmRleE9mKCJ0cmFuc2l0aW9uIikmJihvW2xdPWNbbF0pO3MmJk4obyxzKTtyZXR1cm4gb30ocixBLHcsayxTKSxNPTA8T2JqZWN0LmtleXMoUCkubGVuZ3RoLGo9ci5fZW50ZXJDYj1EKGZ1bmN0aW9uKCl7ai5jYW5jZWxsZWQ/TyYmTyhyKTpUJiZUKHIpLHIuX2VudGVyQ2I9bnVsbH0pO2lmKHNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgZT1yLnBhcmVudE5vZGUsdD1lJiZlLl9wZW5kaW5nJiZlLl9wZW5kaW5nW24ua2V5XTsodCYmdC5jb250ZXh0PT09bi5jb250ZXh0JiZ0LnRhZz09PW4udGFnJiZ0LmVsbS5fbGVhdmVDYiYmdC5lbG0uX2xlYXZlQ2IoKSxDJiZDKHIsaiksTSk/bi5jb250ZXh0LiRyZXF1aXJlV2VleE1vZHVsZSgiYW5pbWF0aW9uIikudHJhbnNpdGlvbihyLnJlZix7c3R5bGVzOlAsZHVyYXRpb246JC5kdXJhdGlvbnx8MCxkZWxheTokLmRlbGF5fHwwLHRpbWluZ0Z1bmN0aW9uOiQudGltaW5nRnVuY3Rpb258fCJsaW5lYXIifSxFP0I6aik6RXx8aigpfSwxNikseCYmeChyKSxJKWlmKCJmdW5jdGlvbiI9PXR5cGVvZiByLnNldFN0eWxlcylyLnNldFN0eWxlcyhJKTtlbHNlIGZvcih2YXIgTCBpbiBJKXIuc2V0U3R5bGUoTCxJW0xdKTtNfHxFfHxqKCl9fX12YXIgenI9ZnVuY3Rpb24oZSl7dmFyIHIsdCx5PXt9LG49ZS5tb2R1bGVzLF89ZS5ub2RlT3BzO2ZvcihyPTA7cjxuci5sZW5ndGg7KytyKWZvcih5W25yW3JdXT1bXSx0PTA7dDxuLmxlbmd0aDsrK3QpQShuW3RdW25yW3JdXSkmJnlbbnJbcl1dLnB1c2goblt0XVtucltyXV0pO2Z1bmN0aW9uIG8oZSl7dmFyIHQ9Xy5wYXJlbnROb2RlKGUpO0EodCkmJl8ucmVtb3ZlQ2hpbGQodCxlKX1mdW5jdGlvbiBiKGUsdCxuLHIsaSxvLGEpe2lmKEEoZS5lbG0pJiZBKG8pJiYoZT1vW2FdPXBlKGUpKSxlLmlzUm9vdEluc2VydD0haSwhZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9ZS5kYXRhO2lmKEEoaSkpe3ZhciBvPUEoZS5jb21wb25lbnRJbnN0YW5jZSkmJmkua2VlcEFsaXZlO2lmKEEoaT1pLmhvb2spJiZBKGk9aS5pbml0KSYmaShlLCExLG4sciksQShlLmNvbXBvbmVudEluc3RhbmNlKSlyZXR1cm4gcChlLHQpLGQobixlLmVsbSxyKSxJKG8pJiZmdW5jdGlvbihlLHQsbixyKXtmb3IodmFyIGksbz1lO28uY29tcG9uZW50SW5zdGFuY2U7KWlmKG89by5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUsQShpPW8uZGF0YSkmJkEoaT1pLnRyYW5zaXRpb24pKXtmb3IoaT0wO2k8eS5hY3RpdmF0ZS5sZW5ndGg7KytpKXkuYWN0aXZhdGVbaV0odHIsbyk7dC5wdXNoKG8pO2JyZWFrfWQobixlLmVsbSxyKX0oZSx0LG4sciksITB9fShlLHQsbixyKSl7dmFyIHM9ZS5kYXRhLGM9ZS5jaGlsZHJlbix1PWUudGFnO2lmKEEodSkpe2UuZWxtPWUubnM/Xy5jcmVhdGVFbGVtZW50TlMoZS5ucyx1KTpfLmNyZWF0ZUVsZW1lbnQodSxlKSxmKGUpO3ZhciBsPUEocykmJkkocy5hcHBlbmRBc1RyZWUpO2x8fChBKHMpJiZ2KGUsdCksZChuLGUuZWxtLHIpKSxoKGUsYyx0KSxsJiYoQShzKSYmdihlLHQpLGQobixlLmVsbSxyKSl9ZWxzZSBJKGUuaXNDb21tZW50KT9lLmVsbT1fLmNyZWF0ZUNvbW1lbnQoZS50ZXh0KTplLmVsbT1fLmNyZWF0ZVRleHROb2RlKGUudGV4dCksZChuLGUuZWxtLHIpfX1mdW5jdGlvbiBwKGUsdCl7QShlLmRhdGEucGVuZGluZ0luc2VydCkmJih0LnB1c2guYXBwbHkodCxlLmRhdGEucGVuZGluZ0luc2VydCksZS5kYXRhLnBlbmRpbmdJbnNlcnQ9bnVsbCksZS5lbG09ZS5jb21wb25lbnRJbnN0YW5jZS4kZWwsdyhlKT8odihlLHQpLGYoZSkpOihRbihlKSx0LnB1c2goZSkpfWZ1bmN0aW9uIGQoZSx0LG4pe0EoZSkmJihBKG4pP18ucGFyZW50Tm9kZShuKT09PWUmJl8uaW5zZXJ0QmVmb3JlKGUsdCxuKTpfLmFwcGVuZENoaWxkKGUsdCkpfWZ1bmN0aW9uIGgoZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKHZhciByPTA7cjx0Lmxlbmd0aDsrK3IpYih0W3JdLG4sZS5lbG0sbnVsbCwhMCx0LHIpO2Vsc2UgJChlLnRleHQpJiZfLmFwcGVuZENoaWxkKGUuZWxtLF8uY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGUudGV4dCkpKX1mdW5jdGlvbiB3KGUpe2Zvcig7ZS5jb21wb25lbnRJbnN0YW5jZTspZT1lLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTtyZXR1cm4gQShlLnRhZyl9ZnVuY3Rpb24gdihlLHQpe2Zvcih2YXIgbj0wO248eS5jcmVhdGUubGVuZ3RoOysrbil5LmNyZWF0ZVtuXSh0cixlKTtBKHI9ZS5kYXRhLmhvb2spJiYoQShyLmNyZWF0ZSkmJnIuY3JlYXRlKHRyLGUpLEEoci5pbnNlcnQpJiZ0LnB1c2goZSkpfWZ1bmN0aW9uIGYoZSl7dmFyIHQ7aWYoQSh0PWUuZm5TY29wZUlkKSlfLnNldFN0eWxlU2NvcGUoZS5lbG0sdCk7ZWxzZSBmb3IodmFyIG49ZTtuOylBKHQ9bi5jb250ZXh0KSYmQSh0PXQuJG9wdGlvbnMuX3Njb3BlSWQpJiZfLnNldFN0eWxlU2NvcGUoZS5lbG0sdCksbj1uLnBhcmVudDtBKHQ9dG4pJiZ0IT09ZS5jb250ZXh0JiZ0IT09ZS5mbkNvbnRleHQmJkEodD10LiRvcHRpb25zLl9zY29wZUlkKSYmXy5zZXRTdHlsZVNjb3BlKGUuZWxtLHQpfWZ1bmN0aW9uIG0oZSx0LG4scixpLG8pe2Zvcig7cjw9aTsrK3IpYihuW3JdLG8sZSx0LCExLG4scil9ZnVuY3Rpb24gayhlKXt2YXIgdCxuLHI9ZS5kYXRhO2lmKEEocikpZm9yKEEodD1yLmhvb2spJiZBKHQ9dC5kZXN0cm95KSYmdChlKSx0PTA7dDx5LmRlc3Ryb3kubGVuZ3RoOysrdCl5LmRlc3Ryb3lbdF0oZSk7aWYoQSh0PWUuY2hpbGRyZW4pKWZvcihuPTA7bjxlLmNoaWxkcmVuLmxlbmd0aDsrK24payhlLmNoaWxkcmVuW25dKX1mdW5jdGlvbiBTKGUsdCxuLHIpe2Zvcig7bjw9cjsrK24pe3ZhciBpPXRbbl07QShpKSYmKEEoaS50YWcpPyhhKGkpLGsoaSkpOm8oaS5lbG0pKX19ZnVuY3Rpb24gYShlLHQpe2lmKEEodCl8fEEoZS5kYXRhKSl7dmFyIG4scj15LnJlbW92ZS5sZW5ndGgrMTtmb3IoQSh0KT90Lmxpc3RlbmVycys9cjp0PWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbigpezA9PS0tbi5saXN0ZW5lcnMmJm8oZSl9cmV0dXJuIG4ubGlzdGVuZXJzPXQsbn0oZS5lbG0sciksQShuPWUuY29tcG9uZW50SW5zdGFuY2UpJiZBKG49bi5fdm5vZGUpJiZBKG4uZGF0YSkmJmEobix0KSxuPTA7bjx5LnJlbW92ZS5sZW5ndGg7KytuKXkucmVtb3ZlW25dKGUsdCk7QShuPWUuZGF0YS5ob29rKSYmQShuPW4ucmVtb3ZlKT9uKGUsdCk6dCgpfWVsc2UgbyhlLmVsbSl9ZnVuY3Rpb24geChlLHQsbixyKXtmb3IodmFyIGk9bjtpPHI7aSsrKXt2YXIgbz10W2ldO2lmKEEobykmJnJyKGUsbykpcmV0dXJuIGl9fWZ1bmN0aW9uIEMoZSx0LG4scixpLG8pe2lmKGUhPT10KXtBKHQuZWxtKSYmQShyKSYmKHQ9cltpXT1wZSh0KSk7dmFyIGE9dC5lbG09ZS5lbG07aWYoSShlLmlzQXN5bmNQbGFjZWhvbGRlcikpQSh0LmFzeW5jRmFjdG9yeS5yZXNvbHZlZCk/TyhlLmVsbSx0LG4pOnQuaXNBc3luY1BsYWNlaG9sZGVyPSEwO2Vsc2UgaWYoSSh0LmlzU3RhdGljKSYmSShlLmlzU3RhdGljKSYmdC5rZXk9PT1lLmtleSYmKEkodC5pc0Nsb25lZCl8fEkodC5pc09uY2UpKSl0LmNvbXBvbmVudEluc3RhbmNlPWUuY29tcG9uZW50SW5zdGFuY2U7ZWxzZXt2YXIgcyxjPXQuZGF0YTtBKGMpJiZBKHM9Yy5ob29rKSYmQShzPXMucHJlcGF0Y2gpJiZzKGUsdCk7dmFyIHU9ZS5jaGlsZHJlbixsPXQuY2hpbGRyZW47aWYoQShjKSYmdyh0KSl7Zm9yKHM9MDtzPHkudXBkYXRlLmxlbmd0aDsrK3MpeS51cGRhdGVbc10oZSx0KTtBKHM9Yy5ob29rKSYmQShzPXMudXBkYXRlKSYmcyhlLHQpfUUodC50ZXh0KT9BKHUpJiZBKGwpP3UhPT1sJiZmdW5jdGlvbihlLHQsbixyLGkpe2Zvcih2YXIgbyxhLHMsYz0wLHU9MCxsPXQubGVuZ3RoLTEsZD10WzBdLGY9dFtsXSxwPW4ubGVuZ3RoLTEsaD1uWzBdLHY9bltwXSxnPSFpO2M8PWwmJnU8PXA7KUUoZCk/ZD10WysrY106RShmKT9mPXRbLS1sXTpycihkLGgpPyhDKGQsaCxyLG4sdSksZD10WysrY10saD1uWysrdV0pOnJyKGYsdik/KEMoZix2LHIsbixwKSxmPXRbLS1sXSx2PW5bLS1wXSk6cnIoZCx2KT8oQyhkLHYscixuLHApLGcmJl8uaW5zZXJ0QmVmb3JlKGUsZC5lbG0sXy5uZXh0U2libGluZyhmLmVsbSkpLGQ9dFsrK2NdLHY9blstLXBdKToocnIoZixoKT8oQyhmLGgscixuLHUpLGcmJl8uaW5zZXJ0QmVmb3JlKGUsZi5lbG0sZC5lbG0pLGY9dFstLWxdKTooRShvKSYmKG89aXIodCxjLGwpKSxFKGE9QShoLmtleSk/b1toLmtleV06eChoLHQsYyxsKSk/YihoLHIsZSxkLmVsbSwhMSxuLHUpOnJyKHM9dFthXSxoKT8oQyhzLGgscixuLHUpLHRbYV09dm9pZCAwLGcmJl8uaW5zZXJ0QmVmb3JlKGUscy5lbG0sZC5lbG0pKTpiKGgscixlLGQuZWxtLCExLG4sdSkpLGg9blsrK3VdKTtsPGM/bShlLEUobltwKzFdKT9udWxsOm5bcCsxXS5lbG0sbix1LHAscik6cDx1JiZTKDAsdCxjLGwpfShhLHUsbCxuLG8pOkEobCk/KEEoZS50ZXh0KSYmXy5zZXRUZXh0Q29udGVudChhLCIiKSxtKGEsbnVsbCxsLDAsbC5sZW5ndGgtMSxuKSk6QSh1KT9TKDAsdSwwLHUubGVuZ3RoLTEpOkEoZS50ZXh0KSYmXy5zZXRUZXh0Q29udGVudChhLCIiKTplLnRleHQhPT10LnRleHQmJl8uc2V0VGV4dENvbnRlbnQoYSx0LnRleHQpLEEoYykmJkEocz1jLmhvb2spJiZBKHM9cy5wb3N0cGF0Y2gpJiZzKGUsdCl9fX1mdW5jdGlvbiBUKGUsdCxuKXtpZihJKG4pJiZBKGUucGFyZW50KSllLnBhcmVudC5kYXRhLnBlbmRpbmdJbnNlcnQ9dDtlbHNlIGZvcih2YXIgcj0wO3I8dC5sZW5ndGg7KytyKXRbcl0uZGF0YS5ob29rLmluc2VydCh0W3JdKX12YXIgZz1zKCJhdHRycyxjbGFzcyxzdGF0aWNDbGFzcyxzdGF0aWNTdHlsZSxrZXkiKTtmdW5jdGlvbiBPKGUsdCxuLHIpe3ZhciBpLG89dC50YWcsYT10LmRhdGEscz10LmNoaWxkcmVuO2lmKHI9cnx8YSYmYS5wcmUsdC5lbG09ZSxJKHQuaXNDb21tZW50KSYmQSh0LmFzeW5jRmFjdG9yeSkpcmV0dXJuIHQuaXNBc3luY1BsYWNlaG9sZGVyPSEwO2lmKEEoYSkmJihBKGk9YS5ob29rKSYmQShpPWkuaW5pdCkmJmkodCwhMCksQShpPXQuY29tcG9uZW50SW5zdGFuY2UpKSlyZXR1cm4gcCh0LG4pLCEwO2lmKEEobykpe2lmKEEocykpaWYoZS5oYXNDaGlsZE5vZGVzKCkpaWYoQShpPWEpJiZBKGk9aS5kb21Qcm9wcykmJkEoaT1pLmlubmVySFRNTCkpe2lmKGkhPT1lLmlubmVySFRNTClyZXR1cm4hMX1lbHNle2Zvcih2YXIgYz0hMCx1PWUuZmlyc3RDaGlsZCxsPTA7bDxzLmxlbmd0aDtsKyspe2lmKCF1fHwhTyh1LHNbbF0sbixyKSl7Yz0hMTticmVha311PXUubmV4dFNpYmxpbmd9aWYoIWN8fHUpcmV0dXJuITF9ZWxzZSBoKHQscyxuKTtpZihBKGEpKXt2YXIgZD0hMTtmb3IodmFyIGYgaW4gYSlpZighZyhmKSl7ZD0hMCx2KHQsbik7YnJlYWt9IWQmJmEuY2xhc3MmJkhlKGEuY2xhc3MpfX1lbHNlIGUuZGF0YSE9PXQudGV4dCYmKGUuZGF0YT10LnRleHQpO3JldHVybiEwfXJldHVybiBmdW5jdGlvbihlLHQsbixyLGksbyl7aWYoIUUodCkpe3ZhciBhLHM9ITEsYz1bXTtpZihFKGUpKXM9ITAsYih0LGMsaSxvKTtlbHNle3ZhciB1PUEoZS5ub2RlVHlwZSk7aWYoIXUmJnJyKGUsdCkpQyhlLHQsYyxudWxsLG51bGwscik7ZWxzZXtpZih1KXtpZigxPT09ZS5ub2RlVHlwZSYmZS5oYXNBdHRyaWJ1dGUoTSkmJihlLnJlbW92ZUF0dHJpYnV0ZShNKSxuPSEwKSxJKG4pJiZPKGUsdCxjKSlyZXR1cm4gVCh0LGMsITApLGU7YT1lLGU9bmV3IHVlKF8udGFnTmFtZShhKS50b0xvd2VyQ2FzZSgpLHt9LFtdLHZvaWQgMCxhKX12YXIgbD1lLmVsbSxkPV8ucGFyZW50Tm9kZShsKTtpZihiKHQsYyxsLl9sZWF2ZUNiP251bGw6ZCxfLm5leHRTaWJsaW5nKGwpKSxBKHQucGFyZW50KSlmb3IodmFyIGY9dC5wYXJlbnQscD13KHQpO2Y7KXtmb3IodmFyIGg9MDtoPHkuZGVzdHJveS5sZW5ndGg7KytoKXkuZGVzdHJveVtoXShmKTtpZihmLmVsbT10LmVsbSxwKXtmb3IodmFyIHY9MDt2PHkuY3JlYXRlLmxlbmd0aDsrK3YpeS5jcmVhdGVbdl0odHIsZik7dmFyIGc9Zi5kYXRhLmhvb2suaW5zZXJ0O2lmKGcubWVyZ2VkKWZvcih2YXIgbT0xO208Zy5mbnMubGVuZ3RoO20rKylnLmZuc1ttXSgpfWVsc2UgUW4oZik7Zj1mLnBhcmVudH1BKGQpP1MoMCxbZV0sMCwwKTpBKGUudGFnKSYmayhlKX19cmV0dXJuIFQodCxjLHMpLHQuZWxtfUEoZSkmJmsoZSl9fSh7bm9kZU9wczpLbixtb2R1bGVzOlttcixJcixqcixCcix7Y3JlYXRlOkZyLGFjdGl2YXRlOkZyLHJlbW92ZTpmdW5jdGlvbihuLGUpe3ZhciByPW4uZWxtO3IuX2VudGVyQ2ImJihyLl9lbnRlckNiLmNhbmNlbGxlZD0hMCxyLl9lbnRlckNiKCkpO3ZhciB0PURyKG4uZGF0YS50cmFuc2l0aW9uKTtpZighdClyZXR1cm4gZSgpO2lmKHIuX2xlYXZlQ2IpcmV0dXJuO3ZhciBpPXQubGVhdmVDbGFzcyxvPXQubGVhdmVUb0NsYXNzLGE9dC5sZWF2ZUFjdGl2ZUNsYXNzLHM9dC5iZWZvcmVMZWF2ZSxjPXQubGVhdmUsdT10LmFmdGVyTGVhdmUsbD10LmxlYXZlQ2FuY2VsbGVkLGQ9dC5kZWxheUxlYXZlLGY9YyYmMTwoYy5fbGVuZ3RofHxjLmxlbmd0aCkscD1uLmNvbnRleHQuJG9wdGlvbnMuc3R5bGV8fHt9LGg9cFtpXSx2PXBbb118fHBbYV0sZz1wWyJAVFJBTlNJVElPTiJdJiZwWyJAVFJBTlNJVElPTiJdW2FdfHx7fSxtPXIuX2xlYXZlQ2I9RChmdW5jdGlvbigpe3IucGFyZW50Tm9kZSYmci5wYXJlbnROb2RlLl9wZW5kaW5nJiYoci5wYXJlbnROb2RlLl9wZW5kaW5nW24ua2V5XT1udWxsKSxtLmNhbmNlbGxlZD9sJiZsKHIpOihlKCksdSYmdShyKSksci5fbGVhdmVDYj1udWxsfSk7ZD9kKHkpOnkoKTtmdW5jdGlvbiB5KCl7dmFyIGU9bi5jb250ZXh0LiRyZXF1aXJlV2VleE1vZHVsZSgiYW5pbWF0aW9uIik7ZnVuY3Rpb24gdCgpe2UudHJhbnNpdGlvbihyLnJlZix7c3R5bGVzOnYsZHVyYXRpb246Zy5kdXJhdGlvbnx8MCxkZWxheTpnLmRlbGF5fHwwLHRpbWluZ0Z1bmN0aW9uOmcudGltaW5nRnVuY3Rpb258fCJsaW5lYXIifSxmP0I6bSl9bS5jYW5jZWxsZWR8fChuLmRhdGEuc2hvd3x8KChyLnBhcmVudE5vZGUuX3BlbmRpbmd8fChyLnBhcmVudE5vZGUuX3BlbmRpbmc9e30pKVtuLmtleV09bikscyYmcyhyKSxoP2UudHJhbnNpdGlvbihyLnJlZix7c3R5bGVzOmh9LHQpOnQoKSxjJiZjKHIsbSksdnx8Znx8bSgpKX19fV0uY29uY2F0KGxyKSxMT05HX0xJU1RfVEhSRVNIT0xEOjEwfSksVnI9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmUpO2Z1bmN0aW9uIFVyKGUscil7dmFyIGk9ZS4kZWw7cmV0dXJuIGkmJiJmdW5jdGlvbiI9PXR5cGVvZiBpW3JdP2Z1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cyx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09ZVtuXTtyZXR1cm4gaVtyXS5hcHBseShpLHQpfTooaWUoIkNhbid0IGZpbmQgY29tcG9uZW50IG1ldGhvZCBcIiIrcisnIiBvbiAnK2kudHlwZSksQil9ZnVuY3Rpb24gcXIoZSxuKXtBcnJheS5pc0FycmF5KG4pJiYoIWZ1bmN0aW9uKGYsbil7Zm9yKHZhciBlPWZ1bmN0aW9uKGUsdCl7dmFyIGQ9VnJbZV07RihuLGQsZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoO24tLTspdFtuXT1lW25dO3ZhciByPXRoaXMubGVuZ3RoLGk9dmVbZF07ImZ1bmN0aW9uIj09dHlwZW9mIGkmJmkuYXBwbHkodGhpcyx0KTt2YXIgbz1VcihmLCJyZW1vdmVEYXRhIiksYT1VcihmLCJpbnNlcnRSYW5nZSIpLHM9VXIoZiwic2V0TGlzdERhdGEiKTtzd2l0Y2goZCl7Y2FzZSJwdXNoIjphKHIsdCk7YnJlYWs7Y2FzZSJwb3AiOm8oci0xLDEpO2JyZWFrO2Nhc2Uic2hpZnQiOm8oMCwxKTticmVhaztjYXNlInVuc2hpZnQiOmEoMCx0KTticmVhaztjYXNlInNwbGljZSI6dmFyIGM9dFswXSx1PXRbMV0sbD10LnNsaWNlKDIpOzA8dSYmbyhjLHUpLDA8bC5sZW5ndGgmJmEoYyxsKTticmVhaztjYXNlInNvcnQiOmNhc2UicmV2ZXJzZSI6cyh0aGlzLnNsaWNlKCkpfX0pfSx0PTAscj1Wci5sZW5ndGg7dDxyO3QrKyllKHQpfShlLG4pLG4uZm9yRWFjaChmdW5jdGlvbih0KXtkKHQpJiYhZih0LCJbW1dhdGNoZWRdXSIpJiYoRih0LCJbW1dhdGNoZWRdXSIsITApLGUuJHdhdGNoKGZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHQpdFtlXX0sZnVuY3Rpb24oKXtVcihlLCJ1cGRhdGVEYXRhIikobi5pbmRleE9mKHQpLHQpfSx7ZGVlcDohMH0pKX0pKX12YXIgV3I9e25hbWU6InJlY3ljbGUtbGlzdCIsbWV0aG9kczp7Y2xvc2VzdDpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PWFyZ3VtZW50cyxuPVtdLHI9YXJndW1lbnRzLmxlbmd0aDtyLS07KW5bcl09dFtyXTtyZXR1cm4oZT10aGlzLiRlbCkuY2xvc2VzdC5hcHBseShlLG4pfSxxdWVyeUVsZW1lbnQ6ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD1hcmd1bWVudHMsbj1bXSxyPWFyZ3VtZW50cy5sZW5ndGg7ci0tOyluW3JdPXRbcl07cmV0dXJuKGU9dGhpcy4kZWwpLnF1ZXJ5RWxlbWVudC5hcHBseShlLG4pfSxxdWVyeUVsZW1lbnRBbGw6ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD1hcmd1bWVudHMsbj1bXSxyPWFyZ3VtZW50cy5sZW5ndGg7ci0tOyluW3JdPXRbcl07cmV0dXJuKGU9dGhpcy4kZWwpLnF1ZXJ5RWxlbWVudEFsbC5hcHBseShlLG4pfSxzY3JvbGxUb0VsZW1lbnQ6ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD1hcmd1bWVudHMsbj1bXSxyPWFyZ3VtZW50cy5sZW5ndGg7ci0tOyluW3JdPXRbcl07cmV0dXJuKGU9dGhpcy4kZWwpLnNjcm9sbFRvRWxlbWVudC5hcHBseShlLG4pfSxyZXNldExvYWRtb3JlOmZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9YXJndW1lbnRzLG49W10scj1hcmd1bWVudHMubGVuZ3RoO3ItLTspbltyXT10W3JdO3JldHVybihlPXRoaXMuJGVsKS5yZXNldExvYWRtb3JlLmFwcGx5KGUsbil9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZih0aGlzLl92bm9kZSYmdGhpcy4kb3B0aW9uc1siW1tVc2VDYWNoZV1dIl0pcmV0dXJuIEYodGhpcy4kb3B0aW9ucywiW1tVc2VDYWNoZV1dIiwhMSksdGhpcy5fdm5vZGU7dmFyIG49dGhpcy4kb3B0aW9ucy5wYXJlbnQscj10aGlzLiRhdHRycy5iaW5kaW5nRXhwcmVzc2lvbjtyZXR1cm4gbiYmciYmKG4uJHdhdGNoKHIsZnVuY3Rpb24oKXtyZXR1cm4gRih0LiRvcHRpb25zLCJbW1VzZUNhY2hlXV0iLCEwKX0se2RlZXA6ITAsaW1tZWRpYXRlOiEwfSkscXIodGhpcyx0aGlzLiRhdHRycy5saXN0RGF0YSksbi4kd2F0Y2gocixmdW5jdGlvbihlKXtxcih0LGUpfSkpLHRoaXMuX2V2ZW50cy5fYXR0YWNoX3Nsb3Q9ZnVuY3Rpb24oZSl7QXQodC4kcGFyZW50fHx0LGUucG9zaXRpb24sZS5yZWZzKX0sdGhpcy5fZXZlbnRzLl9kZXRhY2hfc2xvdD1mdW5jdGlvbihlKXtBdCh0LiRwYXJlbnR8fHQsZS5wb3NpdGlvbixlLnJlZnMsITApfSxlKCJ3ZWV4OnJlY3ljbGUtbGlzdCIse29uOnRoaXMuX2V2ZW50c30sdGhpcy4kc2xvdHMuZGVmYXVsdCl9LHJlbmRlckVycm9yOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUoInRleHQiLHtzdHlsZTp7Zm9udFNpemU6IjM2cHgiLGNvbG9yOiIjRkYwMDAwIn0sdmFsdWU6dC50b1N0cmluZygpfSl9fSxIcj17bmFtZTpTdHJpbmcsYXBwZWFyOkJvb2xlYW4sY3NzOkJvb2xlYW4sbW9kZTpTdHJpbmcsdHlwZTpTdHJpbmcsZW50ZXJDbGFzczpTdHJpbmcsbGVhdmVDbGFzczpTdHJpbmcsZW50ZXJUb0NsYXNzOlN0cmluZyxsZWF2ZVRvQ2xhc3M6U3RyaW5nLGVudGVyQWN0aXZlQ2xhc3M6U3RyaW5nLGxlYXZlQWN0aXZlQ2xhc3M6U3RyaW5nLGFwcGVhckNsYXNzOlN0cmluZyxhcHBlYXJBY3RpdmVDbGFzczpTdHJpbmcsYXBwZWFyVG9DbGFzczpTdHJpbmcsZHVyYXRpb246W051bWJlcixTdHJpbmcsT2JqZWN0XX07ZnVuY3Rpb24gR3IoZSl7dmFyIHQ9ZSYmZS5jb21wb25lbnRPcHRpb25zO3JldHVybiB0JiZ0LkN0b3Iub3B0aW9ucy5hYnN0cmFjdD9HcihZdCh0LmNoaWxkcmVuKSk6ZX1mdW5jdGlvbiBYcihlKXt2YXIgdD17fSxuPWUuJG9wdGlvbnM7Zm9yKHZhciByIGluIG4ucHJvcHNEYXRhKXRbcl09ZVtyXTt2YXIgaT1uLl9wYXJlbnRMaXN0ZW5lcnM7Zm9yKHZhciBvIGluIGkpdFtoKG8pXT1pW29dO3JldHVybiB0fWZ1bmN0aW9uIFlyKGUsdCl7aWYoL1xkLWtlZXAtYWxpdmUkLy50ZXN0KHQudGFnKSlyZXR1cm4gZSgia2VlcC1hbGl2ZSIse3Byb3BzOnQuY29tcG9uZW50T3B0aW9ucy5wcm9wc0RhdGF9KX12YXIgSnI9ZnVuY3Rpb24oZSl7cmV0dXJuIGUudGFnfHxYdChlKX0sS3I9ZnVuY3Rpb24oZSl7cmV0dXJuInNob3ciPT09ZS5uYW1lfSxacj17bmFtZToidHJhbnNpdGlvbiIscHJvcHM6SHIsYWJzdHJhY3Q6ITAscmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj10aGlzLiRzbG90cy5kZWZhdWx0O2lmKG4mJihuPW4uZmlsdGVyKEpyKSkubGVuZ3RoKXt2YXIgcj10aGlzLm1vZGUsaT1uWzBdO2lmKGZ1bmN0aW9uKGUpe2Zvcig7ZT1lLnBhcmVudDspaWYoZS5kYXRhLnRyYW5zaXRpb24pcmV0dXJuITB9KHRoaXMuJHZub2RlKSlyZXR1cm4gaTt2YXIgbz1HcihpKTtpZighbylyZXR1cm4gaTtpZih0aGlzLl9sZWF2aW5nKXJldHVybiBZcihlLGkpO3ZhciBhPSJfX3RyYW5zaXRpb24tIit0aGlzLl91aWQrIi0iO28ua2V5PW51bGw9PW8ua2V5P28uaXNDb21tZW50P2ErImNvbW1lbnQiOmErby50YWc6JChvLmtleSk/MD09PVN0cmluZyhvLmtleSkuaW5kZXhPZihhKT9vLmtleTphK28ua2V5Om8ua2V5O3ZhciBzLGMsdT0oby5kYXRhfHwoby5kYXRhPXt9KSkudHJhbnNpdGlvbj1Ycih0aGlzKSxsPXRoaXMuX3Zub2RlLGQ9R3IobCk7aWYoby5kYXRhLmRpcmVjdGl2ZXMmJm8uZGF0YS5kaXJlY3RpdmVzLnNvbWUoS3IpJiYoby5kYXRhLnNob3c9ITApLGQmJmQuZGF0YSYmKHM9bywoYz1kKS5rZXkhPT1zLmtleXx8Yy50YWchPT1zLnRhZykmJiFYdChkKSYmKCFkLmNvbXBvbmVudEluc3RhbmNlfHwhZC5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUuaXNDb21tZW50KSl7dmFyIGY9ZC5kYXRhLnRyYW5zaXRpb249Tih7fSx1KTtpZigib3V0LWluIj09PXIpcmV0dXJuIHRoaXMuX2xlYXZpbmc9ITAsSmUoZiwiYWZ0ZXJMZWF2ZSIsZnVuY3Rpb24oKXt0Ll9sZWF2aW5nPSExLHQuJGZvcmNlVXBkYXRlKCl9KSxZcihlLGkpO2lmKCJpbi1vdXQiPT09cil7aWYoWHQobykpcmV0dXJuIGw7dmFyIHAsaD1mdW5jdGlvbigpe3AoKX07SmUodSwiYWZ0ZXJFbnRlciIsaCksSmUodSwiZW50ZXJDYW5jZWxsZWQiLGgpLEplKGYsImRlbGF5TGVhdmUiLGZ1bmN0aW9uKGUpe3A9ZX0pfX1yZXR1cm4gaX19fSxRcj1OKHt0YWc6U3RyaW5nLG1vdmVDbGFzczpTdHJpbmd9LEhyKTtkZWxldGUgUXIubW9kZTt2YXIgZWk9e1JlY3ljbGVMaXN0OldyLFRyYW5zaXRpb246WnIsVHJhbnNpdGlvbkdyb3VwOntwcm9wczpRcixjcmVhdGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kcmVxdWlyZVdlZXhNb2R1bGUoImRvbSIpO3RoaXMuZ2V0UG9zaXRpb249ZnVuY3Rpb24ocil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQsbil7ZS5nZXRDb21wb25lbnRSZWN0KHIucmVmLGZ1bmN0aW9uKGUpe2UucmVzdWx0P3QoZS5zaXplKTpuKG5ldyBFcnJvcigiZmFpbGVkIHRvIGdldCByZWN0IGZvciBlbGVtZW50OiAiK3IudGFnKSl9KX0pfTt2YXIgcj10aGlzLiRyZXF1aXJlV2VleE1vZHVsZSgiYW5pbWF0aW9uIik7dGhpcy5hbmltYXRlPWZ1bmN0aW9uKHQsbil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUpe3IudHJhbnNpdGlvbih0LnJlZixuLGUpfSl9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMudGFnfHx0aGlzLiR2bm9kZS5kYXRhLnRhZ3x8InNwYW4iLG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPXRoaXMucHJldkNoaWxkcmVuPXRoaXMuY2hpbGRyZW4saT10aGlzLiRzbG90cy5kZWZhdWx0fHxbXSxvPXRoaXMuY2hpbGRyZW49W10sYT1Ycih0aGlzKSxzPTA7czxpLmxlbmd0aDtzKyspe3ZhciBjPWlbc107Yy50YWcmJm51bGwhPWMua2V5JiYwIT09U3RyaW5nKGMua2V5KS5pbmRleE9mKCJfX3ZsaXN0IikmJihvLnB1c2goYyksKChuW2Mua2V5XT1jKS5kYXRhfHwoYy5kYXRhPXt9KSkudHJhbnNpdGlvbj1hKX1pZihyKXt2YXIgdT1bXSxsPVtdO3IuZm9yRWFjaChmdW5jdGlvbihlKXtlLmRhdGEudHJhbnNpdGlvbj1hLG5bZS5rZXldP3UucHVzaChlKTpsLnB1c2goZSl9KSx0aGlzLmtlcHQ9ZSh0LG51bGwsdSksdGhpcy5yZW1vdmVkPWx9cmV0dXJuIGUodCxudWxsLG8pfSxiZWZvcmVVcGRhdGU6ZnVuY3Rpb24oKXt0aGlzLl9fcGF0Y2hfXyh0aGlzLl92bm9kZSx0aGlzLmtlcHQsITEsITApLHRoaXMuX3Zub2RlPXRoaXMua2VwdH0sdXBkYXRlZDpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJldkNoaWxkcmVuLHQ9dGhpcy5tb3ZlQ2xhc3N8fCh0aGlzLm5hbWV8fCJ2IikrIi1tb3ZlIjtlLmxlbmd0aCYmdGhpcy5nZXRNb3ZlRGF0YShlWzBdLmNvbnRleHQsdCl9LG1ldGhvZHM6e2dldE1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS4kb3B0aW9ucy5zdHlsZXx8e307cmV0dXJuIG5bIkBUUkFOU0lUSU9OIl0mJm5bIkBUUkFOU0lUSU9OIl1bdF19fX19LHRpPXMoInRlbXBsYXRlLHNjcmlwdCxzdHlsZSxlbGVtZW50LGNvbnRlbnQsc2xvdCxsaW5rLG1ldGEsc3ZnLHZpZXcsYSxkaXYsaW1nLGltYWdlLHRleHQsdS10ZXh0LHNwYW4saW5wdXQsdGV4dGFyZWEsc3Bpbm5lcixzZWxlY3Qsc2xpZGVyLHNsaWRlci1uZWlnaGJvcixpbmRpY2F0b3IsY2FudmFzLGxpc3QsY2VsbCxoZWFkZXIsbG9hZGluZyxsb2FkaW5nLWluZGljYXRvcixyZWZyZXNoLHNjcm9sbGFibGUsc2Nyb2xsZXIsdmlkZW8sd2ViLGVtYmVkLHRhYmJhcix0YWJoZWFkZXIsZGF0ZXBpY2tlcix0aW1lcGlja2VyLG1hcnF1ZWUsY291bnRkb3duIiwhMCksbmk9KHMoIndlYixzcGlubmVyLHN3aXRjaCx2aWRlbyx0ZXh0YXJlYSxjYW52YXMsaW5kaWNhdG9yLG1hcnF1ZWUsY291bnRkb3duIiwhMCkscygicmljaHRleHQsdHJhbnNpdGlvbix0cmFuc2l0aW9uLWdyb3VwLHJlY3ljbGUtbGlzdCIsITApKTtzKCJlbWJlZCxpbWcsaW1hZ2UsaW5wdXQsbGluayxtZXRhIiwhMCk7Qm4uY29uZmlnLm11c3RVc2VQcm9wPWZ1bmN0aW9uKCl7cmV0dXJuITF9LEJuLmNvbmZpZy5pc1Jlc2VydmVkVGFnPXRpLEJuLmNvbmZpZy5pc1J1bnRpbWVDb21wb25lbnQ9bmksQm4uY29uZmlnLmlzVW5rbm93bkVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sQm4ub3B0aW9ucy5kaXJlY3RpdmVzPXt9LEJuLm9wdGlvbnMuY29tcG9uZW50cz1laSxCbi5wcm90b3R5cGUuX19wYXRjaF9fPXpyLEJuLnByb3RvdHlwZS4kbW91bnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbj10aGlzLHI9ZSYmKG89dGhpcy4kZG9jdW1lbnQsKGE9by5jcmVhdGVDb21tZW50KCJyb290IikpLmhhc0F0dHJpYnV0ZT1hLnJlbW92ZUF0dHJpYnV0ZT1CLG8uZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKGEpLGEpLGk9dCxuLiRlbD1yLG4uJG9wdGlvbnMucmVuZGVyfHwobi4kb3B0aW9ucy5yZW5kZXI9ZGUpLGFuKG4sImJlZm9yZU1vdW50IiksbmV3IG1uKG4sZnVuY3Rpb24oKXtuLl91cGRhdGUobi5fcmVuZGVyKCksaSl9LEIse2JlZm9yZTpmdW5jdGlvbigpe24uX2lzTW91bnRlZCYmIW4uX2lzRGVzdHJveWVkJiZhbihuLCJiZWZvcmVVcGRhdGUiKX19LCEwKSxpPSExLG51bGw9PW4uJHZub2RlJiYobi5faXNNb3VudGVkPSEwLGFuKG4sIm1vdW50ZWQiKSksbjt2YXIgbixyLGksbyxhfSxCbi5wcm90b3R5cGUuX19jYWxsX2hvb2s9ZnVuY3Rpb24oZSx0KXtzZSgpO3ZhciBuLHI9dGhpcy4kb3B0aW9uc1tlXSxpPWUrIiBob29rIjtpZihyKWZvcih2YXIgbz0wLGE9ci5sZW5ndGg7bzxhO28rKyluPUJlKHJbb10sdGhpcyx0P1t0XTpudWxsLHRoaXMsaSk7cmV0dXJuIHRoaXMuX2hhc0hvb2tFdmVudCYmdGhpcy4kZW1pdCgiaG9vazoiK2UsdCksY2UoKSxufSxlLlZ1ZT1Cbn19KTt1bndyYXBFeHBvcnRzKGZhY3RvcnkpO3ZhciB3ZWV4VnVlRnJhbWV3b3JrPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBkPXt9O3QuY3JlYXRlSW5zdGFuY2VDb250ZXh0PWZ1bmN0aW9uKGUsdCxuKXt2b2lkIDA9PT1uJiYobj17fSk7dmFyIHIsaSxvLGEscz10LndlZXgsYz0oZFtlXT17aW5zdGFuY2VJZDplLGNvbmZpZzpzLmNvbmZpZyxkb2N1bWVudDpzLmRvY3VtZW50LGRhdGE6bn0pLlZ1ZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9e307ZmFjdG9yeShyLHQuZG9jdW1lbnQsbik7dmFyIGk9ci5WdWUsbz1kW2VdLGE9L153ZWV4Oi9pLHM9aS5jb25maWcuaXNSZXNlcnZlZFRhZ3x8ZnVuY3Rpb24oKXtyZXR1cm4hMX0sYz1pLmNvbmZpZy5pc1J1bnRpbWVDb21wb25lbnR8fGZ1bmN0aW9uKCl7cmV0dXJuITF9O3JldHVybiBpLmNvbmZpZy5pc1Jlc2VydmVkVGFnPWZ1bmN0aW9uKGUpe3JldHVybiFjKGUpJiZ0LnN1cHBvcnRzKCJAY29tcG9uZW50LyIrZSl8fHMoZSl8fGEudGVzdChlKX0saS5jb25maWcucGFyc2VQbGF0Zm9ybVRhZ05hbWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShhLCIiKX0saS5wcm90b3R5cGUuJGluc3RhbmNlSWQ9ZSxpLnByb3RvdHlwZS4kZG9jdW1lbnQ9by5kb2N1bWVudCxpLnByb3RvdHlwZS4kcmVxdWlyZVdlZXhNb2R1bGU9dC5yZXF1aXJlTW9kdWxlLGkubWl4aW4oe2JlZm9yZUNyZWF0ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuJG9wdGlvbnM7aWYoZS5lbCl7dmFyIHQ9ZS5kYXRhLG49KCJmdW5jdGlvbiI9PXR5cGVvZiB0P3QoKTp0KXx8e307ZS5kYXRhPU9iamVjdC5hc3NpZ24obixvLmRhdGEpLG8uYXBwPXRoaXN9fSxtb3VudGVkOmZ1bmN0aW9uKCl7aWYodGhpcy4kb3B0aW9ucy5lbCYmdC5kb2N1bWVudCYmby5hcHA9PT10aGlzKXRyeXt0LmRvY3VtZW50LnRhc2tDZW50ZXIuc2VuZCgiZG9tIix7YWN0aW9uOiJjcmVhdGVGaW5pc2gifSxbXSl9Y2F0Y2goZSl7fX19KSxpLnByb3RvdHlwZS4kZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7aWYoby5hcHAgaW5zdGFuY2VvZiBpKXJldHVybiBvLmNvbmZpZ30saX0oZSxzLHQuU2hhcmVkT2JqZWN0KSx1PShyPWUsaT1zLnJlcXVpcmVNb2R1bGUsbz1kW3JdLGE9aSgidGltZXIiKSx7c2V0VGltZW91dDpmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMsdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGg7bi0tOyl0W25dPWVbbl07aWYoYS5zZXRUaW1lb3V0KXt2YXIgcj1vLmRvY3VtZW50LnRhc2tDZW50ZXIuY2FsbGJhY2tNYW5hZ2VyLmxhc3RDYWxsYmFja0lkO3JldHVybiBhLnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0WzBdLmFwcGx5KHQsdC5zbGljZSgyKSl9LHRbMV0pLChyKzEpLnRvU3RyaW5nKCl9fSxzZXRJbnRlcnZhbDpmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMsdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGg7bi0tOyl0W25dPWVbbl07aWYoYS5zZXRJbnRlcnZhbCl7dmFyIHI9by5kb2N1bWVudC50YXNrQ2VudGVyLmNhbGxiYWNrTWFuYWdlci5sYXN0Q2FsbGJhY2tJZDtyZXR1cm4gYS5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RbMF0uYXBwbHkodCx0LnNsaWNlKDIpKX0sdFsxXSksKHIrMSkudG9TdHJpbmcoKX19LGNsZWFyVGltZW91dDpmdW5jdGlvbihlKXthLmNsZWFyVGltZW91dCYmYS5jbGVhclRpbWVvdXQoZSl9LGNsZWFySW50ZXJ2YWw6ZnVuY3Rpb24oZSl7YS5jbGVhckludGVydmFsJiZhLmNsZWFySW50ZXJ2YWwoZSl9fSksbD1PYmplY3QuYXNzaWduKHtWdWU6Y30sdSk7cmV0dXJuIE9iamVjdC5mcmVlemUobCksbH0sdC5kZXN0cm95SW5zdGFuY2U9ZnVuY3Rpb24oZSl7dmFyIHQ9ZFtlXTtpZih0JiZ0LmFwcCBpbnN0YW5jZW9mIHQuVnVlKXt0cnl7dC5hcHAuJGRlc3Ryb3koKSx0LmRvY3VtZW50LmRlc3Ryb3koKX1jYXRjaChlKXt9ZGVsZXRlIHQuZG9jdW1lbnQsZGVsZXRlIHQuYXBwfWRlbGV0ZSBkW2VdfSx0LnJlZnJlc2hJbnN0YW5jZT1mdW5jdGlvbihlLHQpe3ZhciBuPWRbZV07aWYoIShuJiZuLmFwcCBpbnN0YW5jZW9mIG4uVnVlKSlyZXR1cm4gbmV3IEVycm9yKCJyZWZyZXNoSW5zdGFuY2U6IGluc3RhbmNlICIrZSsiIG5vdCBmb3VuZCEiKTtpZihuLlZ1ZSYmbi5WdWUuc2V0KWZvcih2YXIgciBpbiB0KW4uVnVlLnNldChuLmFwcCxyLHRbcl0pO24uZG9jdW1lbnQudGFza0NlbnRlci5zZW5kKCJkb20iLHthY3Rpb246InJlZnJlc2hGaW5pc2gifSxbXSl9fSksaW5kZXg9dW53cmFwRXhwb3J0cyh3ZWV4VnVlRnJhbWV3b3JrKSx3ZWV4VnVlRnJhbWV3b3JrXzE9d2VleFZ1ZUZyYW1ld29yay5jcmVhdGVJbnN0YW5jZUNvbnRleHQsd2VleFZ1ZUZyYW1ld29ya18yPXdlZXhWdWVGcmFtZXdvcmsuZGVzdHJveUluc3RhbmNlLHdlZXhWdWVGcmFtZXdvcmtfMz13ZWV4VnVlRnJhbWV3b3JrLnJlZnJlc2hJbnN0YW5jZSxWdWU9T2JqZWN0LmZyZWV6ZSh7ZGVmYXVsdDppbmRleCxfX21vZHVsZUV4cG9ydHM6d2VleFZ1ZUZyYW1ld29yayxjcmVhdGVJbnN0YW5jZUNvbnRleHQ6d2VleFZ1ZUZyYW1ld29ya18xLGRlc3Ryb3lJbnN0YW5jZTp3ZWV4VnVlRnJhbWV3b3JrXzIscmVmcmVzaEluc3RhbmNlOndlZXhWdWVGcmFtZXdvcmtfM30pO3NldE5hdGl2ZUNvbnNvbGUoKSxzZXR1cCh7VnVlOlZ1ZX0pfSk7Cg==