12 |
- //{"version":"3.6.4","encode":"base64"}
- 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/e3R5cGU6IkNhbGxFeHByZXNzaW9uIixjaGlsZHJlbjpbdmlzaXQoblswXSksdmlzaXQoblsxXSldfTp7dHlwZTpuLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZS50b2tlbiYmZS50b2tlbi5QdW5jdHVhdG9yfSlbMF0ubmFtZSxjaGlsZHJlbjpuLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hZS50b2tlbnx8IWUudG9rZW4uUHVuY3R1YXRvcn0pLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gdmlzaXQoZSl9KX19ZnVuY3Rpb24gcGFyc2UoZSl7dmFyIHQ9bmV3IEphdmFTY3JpcHRFeHByZXNzaW9uKGUpO3JldHVybiBKU09OLnN0cmluZ2lmeSh2aXNpdCh0LnRyZWUpLG51bGwpfXZhciBvbGRDYWxsVXBkYXRlU3R5bGU9Z2xvYmFsLmNhbGxVcGRhdGVTdHlsZTtmdW5jdGlvbiBpc0JpbmRNZXRob2QoZSx0KXtyZXR1cm4oImJpbmRpbmd4Ij09PWV8fCJiaW5kaW5nIj09PWUpJiYiYmluZCI9PT10fWZ1bmN0aW9uIGZvcm1hdEV4cHJlc3Npb24oZSl7aWYodm9pZCAwIT09ZSl7dHJ5e2U9SlNPTi5wYXJzZShlKX1jYXRjaChlKXt9dmFyIHQ9e307aWYoInN0cmluZyI9PXR5cGVvZiBlP3Qub3JpZ2luPWU6ZSYmKHQub3JpZ2luPWUub3JpZ2luLHQudHJhbnNmb3JtZWQ9ZS50cmFuc2Zvcm1lZCksdC50cmFuc2Zvcm1lZHx8dC5vcmlnaW4pcmV0dXJuIHQudHJhbnNmb3JtZWQ9dC50cmFuc2Zvcm1lZHx8cGFyc2UodC5vcmlnaW4pLHR9fWZ1bmN0aW9uIGZvcm1hdEV4cHJlc3Npb25zKGUpe3JldHVybiBlJiYoZS5leGl0RXhwcmVzc2lvbj1mb3JtYXRFeHByZXNzaW9uKGUuZXhpdEV4cHJlc3Npb24pLGUucHJvcHMmJmUucHJvcHMuZm9yRWFjaChmdW5jdGlvbihlKXtlLmV4cHJlc3Npb249Zm9ybWF0RXhwcmVzc2lvbihlLmV4cHJlc3Npb24pfSkpLGV9ZnVuY3Rpb24gZml4Q2FsbGJhY2sodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKHZvaWQgMD09PWUmJihlPXt9KSwiZnVuY3Rpb24iPT10eXBlb2YgdClyZXR1cm4gdCh7c3RhdGU6ImVuZCI9PT1lLnN0YXRlPyJleGl0IjplLnN0YXRlLHQ6dm9pZCAwIT09ZS50P2UudDplLmRlbHRhVH0pfX1mdW5jdGlvbiBoYW5kbGVNb2R1bGVHZXR0ZXIoZSx0LG4pe3JldHVybiBpc0JpbmRNZXRob2QoZSx0KT9mdW5jdGlvbihlLHQpe2lmKHZvaWQgMD09PXQmJih0PWZ1bmN0aW9uKCl7fSksIWUpdGhyb3cgbmV3IEVycm9yKCJzaG91bGQgcGFzcyBvcHRpb25zIGZvciBiaW5kaW5nIik7cmV0dXJuIGZvcm1hdEV4cHJlc3Npb25zKGUpLG4oZSxlJiYidGltaW5nIj09PWUuZXZlbnRUeXBlP2ZpeENhbGxiYWNrKHQpOnQpfTpufWZ1bmN0aW9uIHNldElkKGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIltbQ3VycmVudEluc3RhbmNlSWRdXSIse3ZhbHVlOnR9KX1mdW5jdGlvbiBnZXRJZChlKXtyZXR1cm4gZVsiW1tDdXJyZW50SW5zdGFuY2VJZF1dIl19ZnVuY3Rpb24gbW9kdWxlR2V0dGVyKGUsbixyKXt2YXIgaT1nZXRUYXNrQ2VudGVyKGUpO3JldHVybiBpJiYiZnVuY3Rpb24iPT10eXBlb2YgaS5zZW5kP2Z1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3JldHVybiBpLnNlbmQoIm1vZHVsZSIse21vZHVsZTpuLG1ldGhvZDpyfSxlKX06KGNvbnNvbGUuZXJyb3IoIltKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBmaW5kIHRhc2tDZW50ZXIgKCIrZSsiKS4iKSxudWxsKX1mdW5jdGlvbiBtb2R1bGVTZXR0ZXIoZSx0LG4scil7dmFyIGk9Z2V0VGFza0NlbnRlcihlKTtyZXR1cm4gaSYmImZ1bmN0aW9uIj09dHlwZW9mIGkuc2VuZD8iZnVuY3Rpb24iIT10eXBlb2Ygcj8oY29uc29sZS5lcnJvcigiW0pTIEZyYW1ld29ya10gIit0KyIuIituKyIgbXVzdCBiZSBhc3NpZ25lZCBhcyBhIGZ1bmN0aW9uLiIpLG51bGwpOmZ1bmN0aW9uKGUpe3JldHVybiBpLnNlbmQoIm1vZHVsZSIse21vZHVsZTp0LG1ldGhvZDpufSxbZV0pfTooY29uc29sZS5lcnJvcigiW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGZpbmQgdGFza0NlbnRlciAoIitlKyIpLiIpLG51bGwpfWdsb2JhbC5jYWxsVXBkYXRlU3R5bGU9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49YXJndW1lbnRzLmxlbmd0aC0xOzA8bi0tOyl0W25dPWFyZ3VtZW50c1tuKzFdO3JldHVybiB0WzFdJiYodFsxXT1ub3JtYWxpemVVbml0KHRbMV0pKSxvbGRDYWxsVXBkYXRlU3R5bGUuYXBwbHkodm9pZCAwLFtlXS5jb25jYXQodCkpfTt2YXIgV2VleEluc3RhbmNlPWZ1bmN0aW9uKGUsdCxuKXtzZXRJZCh0aGlzLFN0cmluZyhlKSksdGhpcy5jb25maWc9dHx8e30sdGhpcy5fbmF0aXZlRGF0YT1ufHx7fSx0aGlzLmRvY3VtZW50PW5ldyBEb2N1bWVudChlLHRoaXMuY29uZmlnLmJ1bmRsZVVybCksdGhpcy5yZXF1aXJlTW9kdWxlPXRoaXMucmVxdWlyZU1vZHVsZS5iaW5kKHRoaXMpLHRoaXMuaW1wb3J0U2NyaXB0PXRoaXMuaW1wb3J0U2NyaXB0LmJpbmQodGhpcyksdGhpcy5pc1JlZ2lzdGVyZWRNb2R1bGU9aXNSZWdpc3RlcmVkTW9kdWxlLHRoaXMuaXNSZWdpc3RlcmVkQ29tcG9uZW50PWlzUmVnaXN0ZXJlZENvbXBvbmVudH0sX192dWVQbHVnaW4sX19kZWZpbmVQYWdlLF9fcmVnaXN0ZXJBcHAsX19yZWdpc3RlclBhZ2UsdW5pLGdldEFwcCxnZXRDdXJyZW50UGFnZXMsVW5pU2VydmljZUpTQnJpZGdlO2Z1bmN0aW9uIGNyZWF0ZVNlcnZpY2VDb250ZXh0KFN2LHh2LEN2LFR2LGUpe3ZhciBPdj1lLnNldFRpbWVvdXQsRXY9ZS5jbGVhclRpbWVvdXQsSXY9ZS5zZXRJbnRlcnZhbCxBdj1lLmNsZWFySW50ZXJ2YWwsJHY9ZS5fX3VuaUNvbmZpZyxQdj1lLl9fdW5pUm91dGVzLHQ9ZnVuY3Rpb24oKXt2YXIgZSxpLHQ9WyJiYXNlNjRUb0FycmF5QnVmZmVyIiwiYXJyYXlCdWZmZXJUb0Jhc2U2NCIsImFkZEludGVyY2VwdG9yIiwicmVtb3ZlSW50ZXJjZXB0b3IiLCJpbnRlcmNlcHRvcnMiXS5jb25jYXQoWyJyZXF1ZXN0IiwidXBsb2FkRmlsZSIsImRvd25sb2FkRmlsZSIsImNvbm5lY3RTb2NrZXQiLCJvblNvY2tldE9wZW4iLCJvblNvY2tldEVycm9yIiwic2VuZFNvY2tldE1lc3NhZ2UiLCJvblNvY2tldE1lc3NhZ2UiLCJjbG9zZVNvY2tldCIsIm9uU29ja2V0Q2xvc2UiLCJnZXRVcGRhdGVNYW5hZ2VyIiwiY29uZmlnTVRMUyJdLFsibmF2aWdhdGVUbyIsInJlZGlyZWN0VG8iLCJyZUxhdW5jaCIsInN3aXRjaFRhYiIsIm5hdmlnYXRlQmFjayJdLFsic2V0U3RvcmFnZSIsInNldFN0b3JhZ2VTeW5jIiwiZ2V0U3RvcmFnZSIsImdldFN0b3JhZ2VTeW5jIiwiZ2V0U3RvcmFnZUluZm8iLCJnZXRTdG9yYWdlSW5mb1N5bmMiLCJyZW1vdmVTdG9yYWdlIiwicmVtb3ZlU3RvcmFnZVN5bmMiLCJjbGVhclN0b3JhZ2UiLCJjbGVhclN0b3JhZ2VTeW5jIl0sWyJnZXRMb2NhdGlvbiIsImNob29zZUxvY2F0aW9uIiwib3BlbkxvY2F0aW9uIiwiY3JlYXRlTWFwQ29udGV4dCJdLFsiY2hvb3NlSW1hZ2UiLCJjaG9vc2VGaWxlIiwicHJldmlld0ltYWdlIiwiY2xvc2VQcmV2aWV3SW1hZ2UiLCJnZXRJbWFnZUluZm8iLCJnZXRWaWRlb0luZm8iLCJzYXZlSW1hZ2VUb1Bob3Rvc0FsYnVtIiwiY29tcHJlc3NJbWFnZSIsImNvbXByZXNzVmlkZW8iLCJnZXRSZWNvcmRlck1hbmFnZXIiLCJnZXRCYWNrZ3JvdW5kQXVkaW9NYW5hZ2VyIiwiY3JlYXRlQXVkaW9Db250ZXh0IiwiY3JlYXRlSW5uZXJBdWRpb0NvbnRleHQiLCJjaG9vc2VWaWRlbyIsInNhdmVWaWRlb1RvUGhvdG9zQWxidW0iLCJjcmVhdGVWaWRlb0NvbnRleHQiLCJjcmVhdGVDYW1lcmFDb250ZXh0IiwiY3JlYXRlTGl2ZVBsYXllckNvbnRleHQiLCJjcmVhdGVMaXZlUHVzaGVyQ29udGV4dCJdLFsiZ2V0U3lzdGVtSW5mbyIsImdldFN5c3RlbUluZm9TeW5jIiwiZ2V0V2luZG93SW5mbyIsImdldERldmljZUluZm8iLCJnZXRBcHBCYXNlSW5mbyIsImNhbklVc2UiLCJvbk1lbW9yeVdhcm5pbmciLCJnZXROZXR3b3JrVHlwZSIsIm9uTmV0d29ya1N0YXR1c0NoYW5nZSIsIm9mZk5ldHdvcmtTdGF0dXNDaGFuZ2UiLCJvbkFjY2VsZXJvbWV0ZXJDaGFuZ2UiLCJvZmZBY2NlbGVyb21ldGVyQ2hhbmdlIiwic3RhcnRBY2NlbGVyb21ldGVyIiwic3RvcEFjY2VsZXJvbWV0ZXIiLCJvbkNvbXBhc3NDaGFuZ2UiLCJvZmZDb21wYXNzQ2hhbmdlIiwic3RhcnRDb21wYXNzIiwic3RvcENvbXBhc3MiLCJvbkd5cm9zY29wZUNoYW5nZSIsInN0YXJ0R3lyb3Njb3BlIiwic3RvcEd5cm9zY29wZSIsIm1ha2VQaG9uZUNhbGwiLCJzY2FuQ29kZSIsInNldENsaXBib2FyZERhdGEiLCJnZXRDbGlwYm9hcmREYXRhIiwic2V0U2NyZWVuQnJpZ2h0bmVzcyIsImdldFNjcmVlbkJyaWdodG5lc3MiLCJzZXRLZWVwU2NyZWVuT24iLCJvblVzZXJDYXB0dXJlU2NyZWVuIiwidmlicmF0ZUxvbmciLCJ2aWJyYXRlU2hvcnQiLCJhZGRQaG9uZUNvbnRhY3QiLCJvcGVuQmx1ZXRvb3RoQWRhcHRlciIsInN0YXJ0Qmx1ZXRvb3RoRGV2aWNlc0Rpc2NvdmVyeSIsIm9uQmx1ZXRvb3RoRGV2aWNlRm91bmQiLCJzdG9wQmx1ZXRvb3RoRGV2aWNlc0Rpc2NvdmVyeSIsIm9uQmx1ZXRvb3RoQWRhcHRlclN0YXRlQ2hhbmdlIiwiZ2V0Q29ubmVjdGVkQmx1ZXRvb3RoRGV2aWNlcyIsImdldEJsdWV0b290aERldmljZXMiLCJnZXRCbHVldG9vdGhBZGFwdGVyU3RhdGUiLCJjbG9zZUJsdWV0b290aEFkYXB0ZXIiLCJ3cml0ZUJMRUNoYXJhY3RlcmlzdGljVmFsdWUiLCJyZWFkQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZSIsIm9uQkxFQ29ubmVjdGlvblN0YXRlQ2hhbmdlIiwib25CTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlIiwibm90aWZ5QkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZSIsImdldEJMRURldmljZVNlcnZpY2VzIiwiZ2V0QkxFRGV2aWNlQ2hhcmFjdGVyaXN0aWNzIiwiY3JlYXRlQkxFQ29ubmVjdGlvbiIsImNsb3NlQkxFQ29ubmVjdGlvbiIsInNldEJMRU1UVSIsImdldEJMRURldmljZVJTU0kiLCJvbkJlYWNvblNlcnZpY2VDaGFuZ2UiLCJvbkJlYWNvblVwZGF0ZSIsImdldEJlYWNvbnMiLCJzdGFydEJlYWNvbkRpc2NvdmVyeSIsInN0b3BCZWFjb25EaXNjb3ZlcnkiLCJjaGVja0lzU3VwcG9ydFNvdGVyQXV0aGVudGljYXRpb24iLCJjaGVja0lzU290ZXJFbnJvbGxlZEluRGV2aWNlIiwic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uIiwib25UaGVtZUNoYW5nZSIsIm9uVUlTdHlsZUNoYW5nZSIsImdldFN5c3RlbVNldHRpbmciLCJnZXRBcHBBdXRob3JpemVTZXR0aW5nIiwib3BlbkFwcEF1dGhvcml6ZVNldHRpbmciXSxbImhpZGVLZXlib2FyZCIsIm9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLCJvZmZLZXlib2FyZEhlaWdodENoYW5nZSIsImdldFNlbGVjdGVkVGV4dFJhbmdlIl0sWyJzaG93VG9hc3QiLCJoaWRlVG9hc3QiLCJzaG93TG9hZGluZyIsImhpZGVMb2FkaW5nIiwic2hvd01vZGFsIiwic2hvd0FjdGlvblNoZWV0Iiwic2V0TmF2aWdhdGlvbkJhclRpdGxlIiwic2V0TmF2aWdhdGlvbkJhckNvbG9yIiwic2hvd05hdmlnYXRpb25CYXJMb2FkaW5nIiwiaGlkZU5hdmlnYXRpb25CYXJMb2FkaW5nIiwic2V0VGFiQmFySXRlbSIsInNldFRhYkJhclN0eWxlIiwiaGlkZVRhYkJhciIsInNob3dUYWJCYXIiLCJzZXRUYWJCYXJCYWRnZSIsInJlbW92ZVRhYkJhckJhZGdlIiwic2hvd1RhYkJhclJlZERvdCIsImhpZGVUYWJCYXJSZWREb3QiLCJvblRhYkJhck1pZEJ1dHRvblRhcCIsInNldEJhY2tncm91bmRDb2xvciIsInNldEJhY2tncm91bmRUZXh0U3R5bGUiLCJjcmVhdGVBbmltYXRpb24iLCJwYWdlU2Nyb2xsVG8iLCJvbldpbmRvd1Jlc2l6ZSIsIm9mZldpbmRvd1Jlc2l6ZSIsImxvYWRGb250RmFjZSIsInN0YXJ0UHVsbERvd25SZWZyZXNoIiwic3RvcFB1bGxEb3duUmVmcmVzaCIsImNyZWF0ZVNlbGVjdG9yUXVlcnkiLCJjcmVhdGVJbnRlcnNlY3Rpb25PYnNlcnZlciIsImNyZWF0ZU1lZGlhUXVlcnlPYnNlcnZlciIsImdldE1lbnVCdXR0b25Cb3VuZGluZ0NsaWVudFJlY3QiLCJzaG93VG9wV2luZG93Iiwic2hvd0xlZnRXaW5kb3ciLCJzaG93UmlnaHRXaW5kb3ciLCJoaWRlVG9wV2luZG93IiwiaGlkZUxlZnRXaW5kb3ciLCJoaWRlUmlnaHRXaW5kb3ciLCJnZXRUb3BXaW5kb3dTdHlsZSIsImdldExlZnRXaW5kb3dTdHlsZSIsImdldFJpZ2h0V2luZG93U3R5bGUiLCJzZXRUb3BXaW5kb3dTdHlsZSIsInNldExlZnRXaW5kb3dTdHlsZSIsInNldFJpZ2h0V2luZG93U3R5bGUiLCJnZXRMb2NhbGUiLCJzZXRMb2NhbGUiLCJvbkxvY2FsZUNoYW5nZSJdLFsiJGVtaXQiLCIkb24iLCIkb25jZSIsIiRvZmYiXSxbInNhdmVGaWxlIiwiZ2V0U2F2ZWRGaWxlTGlzdCIsImdldFNhdmVkRmlsZUluZm8iLCJyZW1vdmVTYXZlZEZpbGUiLCJnZXRGaWxlSW5mbyIsIm9wZW5Eb2N1bWVudCIsImdldEZpbGVTeXN0ZW1NYW5hZ2VyIl0sWyJjcmVhdGVPZmZzY3JlZW5DYW52YXMiLCJjcmVhdGVDYW52YXNDb250ZXh0IiwiY2FudmFzVG9UZW1wRmlsZVBhdGgiLCJjYW52YXNQdXRJbWFnZURhdGEiLCJjYW52YXNHZXRJbWFnZURhdGEiXSxbImdldFByb3ZpZGVyIiwibG9naW4iLCJjaGVja1Nlc3Npb24iLCJnZXRVc2VySW5mbyIsImdldFVzZXJQcm9maWxlIiwicHJlTG9naW4iLCJjbG9zZUF1dGhWaWV3IiwiZ2V0Q2hlY2tCb3hTdGF0ZSIsImdldFVuaXZlcmlmeU1hbmFnZXIiLCJzaGFyZSIsInNoYXJlV2l0aFN5c3RlbSIsInNob3dTaGFyZU1lbnUiLCJoaWRlU2hhcmVNZW51IiwicmVxdWVzdFBheW1lbnQiLCJzdWJzY3JpYmVQdXNoIiwidW5zdWJzY3JpYmVQdXNoIiwib25QdXNoIiwib2ZmUHVzaCIsInJlcXVpcmVOYXRpdmVQbHVnaW4iLCJ1cHgycHgiLCJyZXN0b3JlR2xvYmFsIiwicmVxdWlyZUdsb2JhbCIsImdldFN1Yk5WdWVCeUlkIiwiZ2V0Q3VycmVudFN1Yk5WdWUiLCJzZXRQYWdlTWV0YSIsIm9uSG9zdEV2ZW50UmVjZWl2ZSIsIm9uTmF0aXZlRXZlbnRSZWNlaXZlIiwic2VuZE5hdGl2ZUV2ZW50IiwicHJlbG9hZFBhZ2UiLCJ1blByZWxvYWRQYWdlIiwibG9hZFN1YlBhY2thZ2UiLCJzZW5kSG9zdEV2ZW50IiwibmF2aWdhdGVUb01pbmlQcm9ncmFtIiwiZ2V0TGF1bmNoT3B0aW9uc1N5bmMiLCJnZXRFbnRlck9wdGlvbnNTeW5jIl0sWyJjcmVhdGVSZXdhcmRlZFZpZGVvQWQiLCJjcmVhdGVGdWxsU2NyZWVuVmlkZW9BZCIsImNyZWF0ZUludGVyc3RpdGlhbEFkIiwiY3JlYXRlSW50ZXJhY3RpdmVBZCJdLFsiaW52b2tlUHVzaENhbGxiYWNrIiwiZ2V0UHVzaENsaWVudElkIiwib25QdXNoTWVzc2FnZSIsIm9mZlB1c2hNZXNzYWdlIiwiY3JlYXRlUHVzaE1lc3NhZ2UiXSk7dHJ5e3ZhciBuPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJwYXNzaXZlIix7Z2V0OmZ1bmN0aW9uKCl7fX0pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0LXBhc3NpdmUiLG51bGwsbil9Y2F0Y2goZSl7fXZhciBhPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIscz0vXig/OltBLVphLXpcZCsvXXs0fSkqPyg/OltBLVphLXpcZCsvXXsyfSg/Oj09KT98W0EtWmEtelxkKy9dezN9PT8pPyQvO2Z1bmN0aW9uIGMoKXt2YXIgZSx0LG49TXYuZ2V0U3RvcmFnZVN5bmMoInVuaV9pZF90b2tlbiIpfHwiIixyPW4uc3BsaXQoIi4iKTtpZighbnx8MyE9PXIubGVuZ3RoKXJldHVybnt1aWQ6bnVsbCxyb2xlOltdLHBlcm1pc3Npb246W10sdG9rZW5FeHBpcmVkOjB9O3RyeXtlPUpTT04ucGFyc2UoKHQ9clsxXSxkZWNvZGVVUklDb21wb25lbnQoaSh0KS5zcGxpdCgiIikubWFwKGZ1bmN0aW9uKGUpe3JldHVybiIlIisoIjAwIitlLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtMil9KS5qb2luKCIiKSkpKX1jYXRjaChlKXt0aHJvdyBuZXcgRXJyb3IoIuiOt+WPluW9k+WJjeeUqOaIt+S/oeaBr+WHuumUme+8jOivpue7humUmeivr+S/oeaBr+S4uu+8miIrZS5tZXNzYWdlKX1yZXR1cm4gZS50b2tlbkV4cGlyZWQ9MWUzKmUuZXhwLGRlbGV0ZSBlLmV4cCxkZWxldGUgZS5pYXQsZX1pPSJmdW5jdGlvbiIhPXR5cGVvZiBhdG9iP2Z1bmN0aW9uKGUpe2lmKGU9U3RyaW5nKGUpLnJlcGxhY2UoL1tcdFxuXGZcciBdKy9nLCIiKSwhcy50ZXN0KGUpKXRocm93IG5ldyBFcnJvcigiRmFpbGVkIHRvIGV4ZWN1dGUgJ2F0b2InIG9uICdXaW5kb3cnOiBUaGUgc3RyaW5nIHRvIGJlIGRlY29kZWQgaXMgbm90IGNvcnJlY3RseSBlbmNvZGVkLiIpO3ZhciB0O2UrPSI9PSIuc2xpY2UoMi0oMyZlLmxlbmd0aCkpO2Zvcih2YXIgbixyLGk9IiIsbz0wO288ZS5sZW5ndGg7KXQ9YS5pbmRleE9mKGUuY2hhckF0KG8rKykpPDwxOHxhLmluZGV4T2YoZS5jaGFyQXQobysrKSk8PDEyfChuPWEuaW5kZXhPZihlLmNoYXJBdChvKyspKSk8PDZ8KHI9YS5pbmRleE9mKGUuY2hhckF0KG8rKykpKSxpKz02ND09PW4/U3RyaW5nLmZyb21DaGFyQ29kZSh0Pj4xNiYyNTUpOjY0PT09cj9TdHJpbmcuZnJvbUNoYXJDb2RlKHQ+PjE2JjI1NSx0Pj44JjI1NSk6U3RyaW5nLmZyb21DaGFyQ29kZSh0Pj4xNiYyNTUsdD4+OCYyNTUsMjU1JnQpO3JldHVybiBpfTphdG9iO3ZhciByPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsbz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIEMoZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGV9ZnVuY3Rpb24gdShlKXtyZXR1cm4gbnVsbCE9PWUmJiJvYmplY3QiPT10eXBlb2YgZX1mdW5jdGlvbiBUKGUpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09ci5jYWxsKGUpfWZ1bmN0aW9uIGsoZSx0KXtyZXR1cm4gby5jYWxsKGUsdCl9ZnVuY3Rpb24gbCgpe31mdW5jdGlvbiBmKGUpe3JldHVybiByLmNhbGwoZSkuc2xpY2UoOCwtMSl9ZnVuY3Rpb24gZCh0KXt2YXIgbj1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbltlXXx8KG5bZV09dChlKSl9fXZhciBwPS8tKFx3KS9nLGg9ZChmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKHAsZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD90LnRvVXBwZXJDYXNlKCk6IiJ9KX0pO2Z1bmN0aW9uIHYodCxuKXtpZih0PT09bilyZXR1cm4hMDt2YXIgZT11KHQpLHI9dShuKTtpZighZXx8IXIpcmV0dXJuIWUmJiFyJiZTdHJpbmcodCk9PT1TdHJpbmcobik7dHJ5e3ZhciBpPUFycmF5LmlzQXJyYXkodCksbz1BcnJheS5pc0FycmF5KG4pO2lmKGkmJm8pcmV0dXJuIHQubGVuZ3RoPT09bi5sZW5ndGgmJnQuZXZlcnkoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdihlLG5bdF0pfSk7aWYodCBpbnN0YW5jZW9mIERhdGUmJm4gaW5zdGFuY2VvZiBEYXRlKXJldHVybiB0LmdldFRpbWUoKT09PW4uZ2V0VGltZSgpO2lmKGl8fG8pcmV0dXJuITE7dmFyIGE9T2JqZWN0LmtleXModCkscz1PYmplY3Qua2V5cyhuKTtyZXR1cm4gYS5sZW5ndGg9PT1zLmxlbmd0aCYmYS5ldmVyeShmdW5jdGlvbihlKXtyZXR1cm4gdih0W2VdLG5bZV0pfSl9Y2F0Y2goZSl7cmV0dXJuITF9fXZhciBnPS9bIScoKSpdL2csbT1mdW5jdGlvbihlKXtyZXR1cm4iJSIrZS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KX0seT0vJTJDL2csXz1mdW5jdGlvbihlKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGUpLnJlcGxhY2UoZyxtKS5yZXBsYWNlKHksIiwiKX0sYj1kZWNvZGVVUklDb21wb25lbnQ7ZnVuY3Rpb24gdyhlKXt2YXIgaT17fTtyZXR1cm4oZT1lLnRyaW0oKS5yZXBsYWNlKC9eKFw/fCN8JikvLCIiKSkmJmUuc3BsaXQoIiYiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSgvXCsvZywiICIpLnNwbGl0KCI9Iiksbj1iKHQuc2hpZnQoKSkscj0wPHQubGVuZ3RoP2IodC5qb2luKCI9IikpOm51bGw7dm9pZCAwPT09aVtuXT9pW25dPXI6QXJyYXkuaXNBcnJheShpW25dKT9pW25dLnB1c2gocik6aVtuXT1baVtuXSxyXX0pLGl9ZnVuY3Rpb24gUyhyLGkpe3ZvaWQgMD09PWkmJihpPV8pO3ZhciBlPXI/T2JqZWN0LmtleXMocikubWFwKGZ1bmN0aW9uKHQpe3ZhciBlPXJbdF07aWYodm9pZCAwPT09ZSlyZXR1cm4iIjtpZihudWxsPT09ZSlyZXR1cm4gaSh0KTtpZihBcnJheS5pc0FycmF5KGUpKXt2YXIgbj1bXTtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZvaWQgMCE9PWUmJihudWxsPT09ZT9uLnB1c2goaSh0KSk6bi5wdXNoKGkodCkrIj0iK2koZSkpKX0pLG4uam9pbigiJiIpfXJldHVybiBpKHQpKyI9IitpKGUpfSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiAwPGUubGVuZ3RofSkuam9pbigiJiIpOm51bGw7cmV0dXJuIGU/Ij8iK2U6IiJ9dmFyIHg9MCxPPXt9O2Z1bmN0aW9uIEUoZSx0KXt2YXIgbj1PW2VdfHx7fTtkZWxldGUgT1tlXTt2YXIgcj10LmVyck1zZ3x8IiI7bmV3IFJlZ0V4cCgiXFw6XFxzKmZhaWwiKS50ZXN0KHIpP24uZmFpbCYmbi5mYWlsKHQpOm4uc3VjY2VzcyYmbi5zdWNjZXNzKHQpLG4uY29tcGxldGUmJm4uY29tcGxldGUodCl9dmFyIEk9e3dhcnA6ZnVuY3Rpb24oaSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1TdHJpbmcoeCsrKTtPW3RdPXtzdWNjZXNzOmUuc3VjY2VzcyxmYWlsOmUuZmFpbCxjb21wbGV0ZTplLmNvbXBsZXRlfTt2YXIgbj1PYmplY3QuYXNzaWduKHt9LGUpLHI9aS5iaW5kKHRoaXMpKG4sdCk7ciYmRSh0LHIpfX0saW52b2tlOkV9O2Z1bmN0aW9uIEEoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dHJ5e3JldHVybiBlLmFwcGx5KGUsYXJndW1lbnRzKX1jYXRjaChlKXtjb25zb2xlLmVycm9yKGUpfX19ZnVuY3Rpb24gJChlKXtyZXR1cm4gZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGUuYXBwbHkoZSxhcmd1bWVudHMpfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoZSl9fX12YXIgUD1bImludm9rZSIsInN1Y2Nlc3MiLCJmYWlsIiwiY29tcGxldGUiLCJyZXR1cm5WYWx1ZSJdLE09e30saj17fTtmdW5jdGlvbiBMKGksbyl7T2JqZWN0LmtleXMobykuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdCxuLHI7LTEhPT1QLmluZGV4T2YoZSkmJkMob1tlXSkmJihpW2VdPSh0PWlbZV0sbj1vW2VdLChyPW4/dD90LmNvbmNhdChuKTpBcnJheS5pc0FycmF5KG4pP246W25dOnQpP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspLTE9PT10LmluZGV4T2YoZVtuXSkmJnQucHVzaChlW25dKTtyZXR1cm4gdH0ocik6cikpfSl9ZnVuY3Rpb24gQihpLG8pe2kmJm8mJk9iamVjdC5rZXlzKG8pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQsbixyOy0xIT09UC5pbmRleE9mKGUpJiZDKG9bZV0pJiYodD1pW2VdLG49b1tlXSwtMSE9PShyPXQuaW5kZXhPZihuKSkmJnQuc3BsaWNlKHIsMSkpfSl9ZnVuY3Rpb24gTih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl8fGV9fWZ1bmN0aW9uIEQoZSl7cmV0dXJuISFlJiYoIm9iamVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZSkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnRoZW59ZnVuY3Rpb24gUihlLHQpe2Zvcih2YXIgbj0hMSxyPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBpPWVbcl07aWYobiluPVByb21pc2UucmVzb2x2ZShOKGkpKTtlbHNle3ZhciBvPWkodCk7aWYoRChvKSYmKG49UHJvbWlzZS5yZXNvbHZlKG8pKSwhMT09PW8pcmV0dXJue3RoZW46ZnVuY3Rpb24oKXt9fX19cmV0dXJuIG58fHt0aGVuOmZ1bmN0aW9uKGUpe3JldHVybiBlKHQpfX19ZnVuY3Rpb24gRihyLGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT17fSksWyJzdWNjZXNzIiwiZmFpbCIsImNvbXBsZXRlIl0uZm9yRWFjaChmdW5jdGlvbih0KXtpZihBcnJheS5pc0FycmF5KHJbdF0pKXt2YXIgbj1lW3RdO2VbdF09ZnVuY3Rpb24oZSl7UihyW3RdLGUpLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIEMobikmJm4oZSl8fGV9KX19fSksZX1mdW5jdGlvbiB6KGUsdCl7dmFyIG49W107QXJyYXkuaXNBcnJheShNLnJldHVyblZhbHVlKSYmbi5wdXNoLmFwcGx5KG4sTS5yZXR1cm5WYWx1ZSk7dmFyIHI9altlXTtyZXR1cm4gciYmQXJyYXkuaXNBcnJheShyLnJldHVyblZhbHVlKSYmbi5wdXNoLmFwcGx5KG4sci5yZXR1cm5WYWx1ZSksbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3Q9ZSh0KXx8dH0pLHR9ZnVuY3Rpb24gVihlLHQsbil7Zm9yKHZhciByPVtdLGk9YXJndW1lbnRzLmxlbmd0aC0zOzA8aS0tOylyW2ldPWFyZ3VtZW50c1tpKzNdO3ZhciBvPWZ1bmN0aW9uKGUpe3ZhciB0PU9iamVjdC5jcmVhdGUobnVsbCk7T2JqZWN0LmtleXMoTSkuZm9yRWFjaChmdW5jdGlvbihlKXsicmV0dXJuVmFsdWUiIT09ZSYmKHRbZV09TVtlXS5zbGljZSgpKX0pO3ZhciBuPWpbZV07cmV0dXJuIG4mJk9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oZSl7InJldHVyblZhbHVlIiE9PWUmJih0W2VdPSh0W2VdfHxbXSkuY29uY2F0KG5bZV0pKX0pLHR9KGUpO3JldHVybiBvJiZPYmplY3Qua2V5cyhvKS5sZW5ndGg/QXJyYXkuaXNBcnJheShvLmludm9rZSk/UihvLmludm9rZSxuKS50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiB0LmFwcGx5KHZvaWQgMCxbRihvLGUpXS5jb25jYXQocikpfSk6dC5hcHBseSh2b2lkIDAsW0YobyxuKV0uY29uY2F0KHIpKTp0LmFwcGx5KHZvaWQgMCxbbl0uY29uY2F0KHIpKX12YXIgVT17cmV0dXJuVmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEQoZSk/bmV3IFByb21pc2UoZnVuY3Rpb24odCxuKXtlLnRoZW4oZnVuY3Rpb24oZSl7ZVswXT9uKGVbMF0pOnQoZVsxXSl9KX0pOmV9fSxxPS9eXCR8V2luZG93JHxXaW5kb3dTdHlsZSR8c2VuZEhvc3RFdmVudHxzZW5kTmF0aXZlRXZlbnR8cmVzdG9yZUdsb2JhbHxyZXF1aXJlR2xvYmFsfGdldEN1cnJlbnRTdWJOVnVlfGdldE1lbnVCdXR0b25Cb3VuZGluZ0NsaWVudFJlY3R8XnJlcG9ydHxpbnRlcmNlcHRvcnN8SW50ZXJjZXB0b3IkfGdldFN1Yk5WdWVCeUlkfHJlcXVpcmVOYXRpdmVQbHVnaW58dXB4MnB4fGhpZGVLZXlib2FyZHxjYW5JVXNlfF5jcmVhdGV8U3luYyR8TWFuYWdlciR8YmFzZTY0VG9BcnJheUJ1ZmZlcnxhcnJheUJ1ZmZlclRvQmFzZTY0fGdldExvY2FsZXxzZXRMb2NhbGV8aW52b2tlUHVzaENhbGxiYWNrfGdldFdpbmRvd0luZm98Z2V0RGV2aWNlSW5mb3xnZXRBcHBCYXNlSW5mb3xnZXRTeXN0ZW1TZXR0aW5nfGdldEFwcEF1dGhvcml6ZVNldHRpbmcvLFc9L15jcmVhdGV8TWFuYWdlciQvLEg9WyJjcmVhdGVCTEVDb25uZWN0aW9uIl0sRz1bInJlcXVlc3QiLCJkb3dubG9hZEZpbGUiLCJ1cGxvYWRGaWxlIiwiY29ubmVjdFNvY2tldCJdLFg9WyJjcmVhdGVCTEVDb25uZWN0aW9uIiwiY3JlYXRlUHVzaE1lc3NhZ2UiXSxZPS9eb258Xm9mZi87ZnVuY3Rpb24gSihlKXtyZXR1cm4gcS50ZXN0KGUpJiYtMT09PVguaW5kZXhPZihlKX1mdW5jdGlvbiBLKGUpe3JldHVybiBZLnRlc3QoZSkmJiJvblB1c2giIT09ZX1mdW5jdGlvbiBaKGUpe3JldHVybiB0PWUsIShXLnRlc3QodCkmJi0xPT09SC5pbmRleE9mKHQpfHxKKGUpfHxLKGUpKTt2YXIgdH1mdW5jdGlvbiBRKGUpe3ZhciB0PXt9O2Zvcih2YXIgbiBpbiBlKXt2YXIgcj1lW25dO0MocikmJih0W25dPSQociksZGVsZXRlIGVbbl0pfXJldHVybiB0fVByb21pc2UucHJvdG90eXBlLmZpbmFsbHl8fChQcm9taXNlLnByb3RvdHlwZS5maW5hbGx5PWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuY29uc3RydWN0b3I7cmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gbi5yZXNvbHZlKHQoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBlfSl9LGZ1bmN0aW9uKGUpe3JldHVybiBuLnJlc29sdmUodCgpKS50aGVuKGZ1bmN0aW9uKCl7dGhyb3cgZX0pfSl9KTt2YXIgZWU9W3tuYW1lOiJiYXNlNjQiLHR5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfV0sdGU9W3tuYW1lOiJhcnJheUJ1ZmZlciIsdHlwZTpbQXJyYXlCdWZmZXIsVWludDhBcnJheV0scmVxdWlyZWQ6ITB9XSxuZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxiYXNlNjRUb0FycmF5QnVmZmVyOmVlLGFycmF5QnVmZmVyVG9CYXNlNjQ6dGV9KSxyZT1be25hbWU6InNjaGVtYSIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSxpZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjYW5JVXNlOnJlfSksb2U9W3tuYW1lOiJldmVudCIsdHlwZTpbU3RyaW5nLEFycmF5XSxyZXF1aXJlZDohMH0se25hbWU6ImNhbGxiYWNrIix0eXBlOkZ1bmN0aW9uLHJlcXVpcmVkOiEwfV0sYWU9b2Usc2U9W3tuYW1lOiJldmVudCIsdHlwZTpbU3RyaW5nLEFycmF5XX0se25hbWU6ImNhbGxiYWNrIix0eXBlOkZ1bmN0aW9ufV0sY2U9W3tuYW1lOiJldmVudCIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSx1ZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCwkb246b2UsJG9uY2U6YWUsJG9mZjpzZSwkZW1pdDpjZX0pLGxlPVt7bmFtZToibWV0aG9kIix0eXBlOltTdHJpbmcsT2JqZWN0XSxyZXF1aXJlZDohMH1dLGRlPWxlLGZlPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGFkZEludGVyY2VwdG9yOmxlLHJlbW92ZUludGVyY2VwdG9yOmRlfSkscGU9W3tuYW1lOiJ1cHgiLHR5cGU6W051bWJlcixTdHJpbmddLHJlcXVpcmVkOiEwfV0saGU9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsdXB4MnB4OnBlfSk7ZnVuY3Rpb24gdmUobil7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7ZSYmKHRbbl09TWF0aC5yb3VuZChlKSl9fXZhciBnZT17Y2FudmFzSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSx4Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMCx2YWxpZGF0b3I6dmUoIngiKX0seTp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOnZlKCJ5Iil9LHdpZHRoOnt0eXBlOk51bWJlcixyZXF1aXJlZDohMCx2YWxpZGF0b3I6dmUoIndpZHRoIil9LGhlaWdodDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOnZlKCJoZWlnaHQiKX19LG1lPXtjYW52YXNJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGRhdGE6e3R5cGU6VWludDhDbGFtcGVkQXJyYXkscmVxdWlyZWQ6ITB9LHg6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjp2ZSgieCIpfSx5Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMCx2YWxpZGF0b3I6dmUoInkiKX0sd2lkdGg6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjp2ZSgid2lkdGgiKX0saGVpZ2h0Ont0eXBlOk51bWJlcix2YWxpZGF0b3I6dmUoImhlaWdodCIpfX0seWU9e1BORzoicG5nIixKUEc6ImpwZyIsSlBFRzoianBnIn0sX2U9e3g6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MCx2YWxpZGF0b3I6dmUoIngiKX0seTp7dHlwZTpOdW1iZXIsZGVmYXVsdDowLHZhbGlkYXRvcjp2ZSgieSIpfSx3aWR0aDp7dHlwZTpOdW1iZXIsdmFsaWRhdG9yOnZlKCJ3aWR0aCIpfSxoZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbGlkYXRvcjp2ZSgiaGVpZ2h0Iil9LGRlc3RXaWR0aDp7dHlwZTpOdW1iZXIsdmFsaWRhdG9yOnZlKCJkZXN0V2lkdGgiKX0sZGVzdEhlaWdodDp7dHlwZTpOdW1iZXIsdmFsaWRhdG9yOnZlKCJkZXN0SGVpZ2h0Iil9LGNhbnZhc0lkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZmlsZVR5cGU6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9KGV8fCIiKS50b1VwcGVyQ2FzZSgpLHQuZmlsZVR5cGU9ZSBpbiB5ZT95ZVtlXTp5ZS5QTkd9fSxxdWFsaXR5Ont0eXBlOk51bWJlcix2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LnF1YWxpdHk9MDxlJiZlPDE/ZToxfX19LGJlPXtjYW52YXNJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGFjdGlvbnM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITB9LHJlc2VydmU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfX0sd2U9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY2FudmFzR2V0SW1hZ2VEYXRhOmdlLGNhbnZhc1B1dEltYWdlRGF0YTptZSxjYW52YXNUb1RlbXBGaWxlUGF0aDpfZSxkcmF3Q2FudmFzOmJlfSksa2U9W3tuYW1lOiJpZCIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSxTZT1rZSx4ZT1rZSxDZT1rZSxUZT1be25hbWU6ImNhbnZhc0lkIix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0se25hbWU6ImNvbXBvbmVudEluc3RhbmNlIix0eXBlOk9iamVjdH1dLE9lPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNyZWF0ZUF1ZGlvQ29udGV4dDpTZSxjcmVhdGVWaWRlb0NvbnRleHQ6eGUsY3JlYXRlTWFwQ29udGV4dDpDZSxjcmVhdGVDYW52YXNDb250ZXh0OlRlfSksRWU9e2ZpcnN0TmFtZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybiJhZGRQaG9uZUNvbnRhY3Q6ZmFpbCBwYXJhbWV0ZXIgZXJyb3I6IHBhcmFtZXRlci5maXJzdE5hbWUgc2hvdWxkIG5vdCBiZSBlbXB0eSBTdHJpbmc7In19fSxJZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxhZGRQaG9uZUNvbnRhY3Q6RWV9KSxBZT17cGhvbmVOdW1iZXI6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtpZighZSlyZXR1cm4ibWFrZVBob25lQ2FsbDpmYWlsIHBhcmFtZXRlciBlcnJvcjogcGFyYW1ldGVyLnBob25lTnVtYmVyIHNob3VsZCBub3QgYmUgZW1wdHkgU3RyaW5nOyJ9fX0sJGU9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsbWFrZVBob25lQ2FsbDpBZX0pLFBlPXtvbmx5RnJvbUNhbWVyYTp7dHlwZTpCb29sZWFufSxzY2FuVHlwZTp7dHlwZTpBcnJheX0sYXV0b0RlY29kZUNoYXJTZXQ6e3R5cGU6Qm9vbGVhbn0sc291bmQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6Im5vbmUifSxhdXRvWm9vbTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITB9fSxNZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxzY2FuQ29kZTpQZX0pLGplPUFycmF5LmlzQXJyYXksTGU9WyJ7IiwifSJdLEJlPWZ1bmN0aW9uKCl7dGhpcy5fY2FjaGVzPU9iamVjdC5jcmVhdGUobnVsbCl9O0JlLnByb3RvdHlwZS5pbnRlcnBvbGF0ZT1mdW5jdGlvbihlLHQsbil7aWYodm9pZCAwPT09biYmKG49TGUpLCF0KXJldHVybltlXTt2YXIgcj10aGlzLl9jYWNoZXNbZV07cmV0dXJuIHJ8fChyPWZ1bmN0aW9uKGUsdCl7dmFyIG49dFswXSxyPXRbMV0saT1bXSxvPTAsYT0iIjtmb3IoO288ZS5sZW5ndGg7KXt2YXIgcz1lW28rK107aWYocz09PW4pe2EmJmkucHVzaCh7dHlwZToidGV4dCIsdmFsdWU6YX0pO3ZhciBjPWE9IiI7Zm9yKHM9ZVtvKytdO3ZvaWQgMCE9PXMmJnMhPT1yOyljKz1zLHM9ZVtvKytdO3ZhciB1PXM9PT1yLGw9TmUudGVzdChjKT8ibGlzdCI6dSYmRGUudGVzdChjKT8ibmFtZWQiOiJ1bmtub3duIjtpLnB1c2goe3ZhbHVlOmMsdHlwZTpsfSl9ZWxzZSBhKz1zfXJldHVybiBhJiZpLnB1c2goe3R5cGU6InRleHQiLHZhbHVlOmF9KSxpfShlLG4pLHRoaXMuX2NhY2hlc1tlXT1yKSxmdW5jdGlvbihlLHQpe3ZhciBuPVtdLHI9MCxpPWplKHQpPyJsaXN0Ijoobz10LG51bGwhPT1vJiYib2JqZWN0Ij09dHlwZW9mIG8/Im5hbWVkIjoidW5rbm93biIpO3ZhciBvO2lmKCJ1bmtub3duIj09PWkpcmV0dXJuIG47Zm9yKDtyPGUubGVuZ3RoOyl7dmFyIGE9ZVtyXTtzd2l0Y2goYS50eXBlKXtjYXNlInRleHQiOm4ucHVzaChhLnZhbHVlKTticmVhaztjYXNlImxpc3QiOm4ucHVzaCh0W3BhcnNlSW50KGEudmFsdWUsMTApXSk7YnJlYWs7Y2FzZSJuYW1lZCI6Im5hbWVkIj09PWkmJm4ucHVzaCh0W2EudmFsdWVdKX1yKyt9cmV0dXJuIG59KHIsdCl9O3ZhciBOZT0vXig/OlxkKSsvLERlPS9eKD86XHcpKy87dmFyIFJlPSJ6aC1IYW5zIixGZT0iemgtSGFudCIsemU9ImVuIixWZT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFVlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIFZlLmNhbGwoZSx0KX0scWU9bmV3IEJlO2Z1bmN0aW9uIFdlKGUsdCl7aWYoZSl7aWYoZT1lLnRyaW0oKS5yZXBsYWNlKC9fL2csIi0iKSx0JiZ0W2VdKXJldHVybiBlO2lmKDA9PT0oZT1lLnRvTG93ZXJDYXNlKCkpLmluZGV4T2YoInpoIikpcmV0dXJuLTE8ZS5pbmRleE9mKCItaGFucyIpP1JlOi0xPGUuaW5kZXhPZigiLWhhbnQiKT9GZToobj1lLFsiLXR3IiwiLWhrIiwiLW1vIiwiLWNodCJdLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuLTEhPT1uLmluZGV4T2YoZSl9KT9GZTpSZSk7dmFyIG4scixpPShyPWUsW3plLCJmciIsImVzIl0uZmluZChmdW5jdGlvbihlKXtyZXR1cm4gMD09PXIuaW5kZXhPZihlKX0pKTtyZXR1cm4gaXx8dm9pZCAwfX12YXIgSGU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sb2NhbGUsbj1lLmZhbGxiYWNrTG9jYWxlLHI9ZS5tZXNzYWdlcyxpPWUud2F0Y2hlcixvPWUuZm9ybWF0ZXI7dGhpcy5sb2NhbGU9emUsdGhpcy5mYWxsYmFja0xvY2FsZT16ZSx0aGlzLm1lc3NhZ2U9e30sdGhpcy5tZXNzYWdlcz17fSx0aGlzLndhdGNoZXJzPVtdLG4mJih0aGlzLmZhbGxiYWNrTG9jYWxlPW4pLHRoaXMuZm9ybWF0ZXI9b3x8cWUsdGhpcy5tZXNzYWdlcz1yfHx7fSx0aGlzLnNldExvY2FsZSh0fHx6ZSksaSYmdGhpcy53YXRjaExvY2FsZShpKX07ZnVuY3Rpb24gR2UoZSx0KXtyZXR1cm4tMTxlLmluZGV4T2YodFswXSl9SGUucHJvdG90eXBlLnNldExvY2FsZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLG49dGhpcy5sb2NhbGU7dGhpcy5sb2NhbGU9V2UoZSx0aGlzLm1lc3NhZ2VzKXx8dGhpcy5mYWxsYmFja0xvY2FsZSx0aGlzLm1lc3NhZ2VzW3RoaXMubG9jYWxlXXx8KHRoaXMubWVzc2FnZXNbdGhpcy5sb2NhbGVdPXt9KSx0aGlzLm1lc3NhZ2U9dGhpcy5tZXNzYWdlc1t0aGlzLmxvY2FsZV0sbiE9PXRoaXMubG9jYWxlJiZ0aGlzLndhdGNoZXJzLmZvckVhY2goZnVuY3Rpb24oZSl7ZSh0LmxvY2FsZSxuKX0pfSxIZS5wcm90b3R5cGUuZ2V0TG9jYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG9jYWxlfSxIZS5wcm90b3R5cGUud2F0Y2hMb2NhbGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXRoaXMud2F0Y2hlcnMucHVzaChlKS0xO3JldHVybiBmdW5jdGlvbigpe3Qud2F0Y2hlcnMuc3BsaWNlKG4sMSl9fSxIZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGUsdCxuKXt2b2lkIDA9PT1uJiYobj0hMCk7dmFyIHI9dGhpcy5tZXNzYWdlc1tlXTtyP24/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/ZTp2dFswXX0sZGVmYXVsdDp2dFswXX19LG10PXtmaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5maWxlUGF0aD1wdChlKX19fSx5dD17ZmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuZmlsZVBhdGg9cHQoZSl9fX0sX3Q9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsc2F2ZUZpbGU6aHQsZ2V0RmlsZUluZm86Z3QsZ2V0U2F2ZWRGaWxlSW5mbzptdCxyZW1vdmVTYXZlZEZpbGU6eXR9KSxidD17ZmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxmaWxlVHlwZTp7dHlwZTpTdHJpbmd9fSx3dD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvcGVuRG9jdW1lbnQ6YnR9KSxrdD17a2V5d29yZDp7dHlwZTpTdHJpbmd9fSxTdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjaG9vc2VMb2NhdGlvbjprdH0pLHh0PVsid2dzODQiLCJnY2owMiJdLEN0PXt0eXBlOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPShlfHwiIikudG9Mb3dlckNhc2UoKSx0LnR5cGU9eHQuaW5kZXhPZihlKTwwP3h0WzBdOmV9fSxhbHRpdHVkZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9fSxUdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxnZXRMb2NhdGlvbjpDdH0pLE90PXtsYXRpdHVkZTp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITB9LGxvbmdpdHVkZTp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITB9LHNjYWxlOnt0eXBlOk51bWJlcix2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPU1hdGguZmxvb3IoZSksdC5zY2FsZT01PD1lJiZlPD0xOD9lOjE4fSxkZWZhdWx0OjE4fSxuYW1lOnt0eXBlOlN0cmluZ30sYWRkcmVzczp7dHlwZTpTdHJpbmd9fSxFdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvcGVuTG9jYXRpb246T3R9KSxJdD1bImFsbCIsImltYWdlIiwidmlkZW8iXSxBdD1bImFsYnVtIiwiY2FtZXJhIl0sJHQ9e2NvdW50Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMSxkZWZhdWx0OjEwMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPD0wJiYodC5jb3VudD0xMDApfX0sc291cmNlVHlwZTp7dHlwZTpBcnJheSxyZXF1aXJlZDohMSxkZWZhdWx0OkF0LHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9ZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIEF0LmluY2x1ZGVzKGUpfSksdC5zb3VyY2VUeXBlPWUubGVuZ3RoP2U6QXR9fSx0eXBlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMSxkZWZhdWx0OiJhbGwiLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe0l0LmluY2x1ZGVzKGUpfHwodC50eXBlPUl0WzBdKSx0LnR5cGU9ImFsbCI9PT10LnR5cGU/dC50eXBlPSIqIjp0LnR5cGV9fSxleHRlbnNpb246e3R5cGU6QXJyYXksZGVmYXVsdDpbIiJdLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4icGFyYW0gZXh0ZW5zaW9uIHNob3VsZCBub3QgYmUgZW1wdHkuIn19fSxQdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjaG9vc2VGaWxlOiR0fSksTXQ9WyJvcmlnaW5hbCIsImNvbXByZXNzZWQiXSxqdD1bImFsYnVtIiwiY2FtZXJhIl0sTHQ9e2NvdW50Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMSxkZWZhdWx0OjksdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZTw9MCYmKHQuY291bnQ9OSl9fSxzaXplVHlwZTp7dHlwZTpbQXJyYXksU3RyaW5nXSxyZXF1aXJlZDohMSxkZWZhdWx0Ok10LHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9KGU9InN0cmluZyI9PXR5cGVvZiBlP1tlXTplKS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIE10LmluY2x1ZGVzKGUpfSksdC5zaXplVHlwZT1lLmxlbmd0aD9lOk10fX0sc291cmNlVHlwZTp7dHlwZTpBcnJheSxyZXF1aXJlZDohMSxkZWZhdWx0Omp0LHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9ZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGp0LmluY2x1ZGVzKGUpfSksdC5zb3VyY2VUeXBlPWUubGVuZ3RoP2U6anR9fSxleHRlbnNpb246e3R5cGU6QXJyYXksZGVmYXVsdDpbIioiXSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuInBhcmFtIGV4dGVuc2lvbiBzaG91bGQgbm90IGJlIGVtcHR5LiJ9fX0sQnQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY2hvb3NlSW1hZ2U6THR9KSxOdD1bImFsYnVtIiwiY2FtZXJhIl0sRHQ9e3NvdXJjZVR5cGU6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITEsZGVmYXVsdDpOdCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPWUuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBOdC5pbmNsdWRlcyhlKX0pLHQuc291cmNlVHlwZT1lLmxlbmd0aD9lOk50fX0sY29tcHJlc3NlZDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITB9LG1heER1cmF0aW9uOnt0eXBlOk51bWJlcixkZWZhdWx0OjYwfSxjYW1lcmE6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6ImJhY2sifSxleHRlbnNpb246e3R5cGU6QXJyYXksZGVmYXVsdDpbIioiXSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuInBhcmFtIGV4dGVuc2lvbiBzaG91bGQgbm90IGJlIGVtcHR5LiJ9fX0sUnQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY2hvb3NlVmlkZW86RHR9KSxGdD17c3JjOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LnNyYz1wdChlKX19fSx6dD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjb21wcmVzc0ltYWdlOkZ0fSksVnQ9e3NyYzp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5zcmM9cHQoZSl9fSxxdWFsaXR5Ont0eXBlOlN0cmluZ30sYml0cmF0ZTp7dHlwZTpOdW1iZXJ9LGZwczp7dHlwZTpOdW1iZXJ9LHJlc29sdXRpb246e3R5cGU6TnVtYmVyfX0sVXQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY29tcHJlc3NWaWRlbzpWdH0pLHF0PXtzcmM6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3Quc3JjPXB0KGUpfX19LFd0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldEltYWdlSW5mbzpxdH0pLEh0PXtzcmM6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3Quc3JjPXB0KGUpfX19LEd0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldFZpZGVvSW5mbzpIdH0pLFh0PXt1cmxzOnt0eXBlOkFycmF5LHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3ZhciBuO2lmKHQudXJscz1lLm1hcChmdW5jdGlvbihlKXtpZigic3RyaW5nIj09dHlwZW9mIGUpcmV0dXJuIHB0KGUpO249ITB9KSxuKXJldHVybiJ1cmwgaXMgbm90IHN0cmluZyJ9fSxjdXJyZW50Ont0eXBlOltTdHJpbmcsTnVtYmVyXSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXsibnVtYmVyIj09dHlwZW9mIGU/dC5jdXJyZW50PTA8ZSYmZTx0LnVybHMubGVuZ3RoP2U6MDoic3RyaW5nIj09dHlwZW9mIGUmJmUmJih0LmN1cnJlbnQ9cHQoZSkpfSxkZWZhdWx0OjB9fSxZdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxwcmV2aWV3SW1hZ2U6WHR9KSxKdD17ZmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuZmlsZVBhdGg9cHQoZSl9fX0sS3Q9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsc2F2ZUltYWdlVG9QaG90b3NBbGJ1bTpKdH0pLFp0PXt1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxoZWFkZXI6e3R5cGU6T2JqZWN0LHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuaGVhZGVyPWV8fHt9fX19LFF0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGRvd25sb2FkRmlsZTpadH0pLGVuPXtPUFRJT05TOiJPUFRJT05TIixHRVQ6IkdFVCIsSEVBRDoiSEVBRCIsUE9TVDoiUE9TVCIsUFVUOiJQVVQiLERFTEVURToiREVMRVRFIixUUkFDRToiVFJBQ0UiLENPTk5FQ1Q6IkNPTk5FQ1QiLFBBVENIOiJQQVRDSCJ9LHRuPSJqc29uIixubj17VEVYVDoidGV4dCIsQVJSQVlCVUZGRVI6ImFycmF5YnVmZmVyIn0scm49ZW5jb2RlVVJJQ29tcG9uZW50O3ZhciBvbixhbj17bWV0aG9kOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPShlfHwiIikudG9VcHBlckNhc2UoKSx0Lm1ldGhvZD1PYmplY3QudmFsdWVzKGVuKS5pbmRleE9mKGUpPDA/ZW4uR0VUOmV9fSxkYXRhOnt0eXBlOltPYmplY3QsU3RyaW5nLEFycmF5LEFycmF5QnVmZmVyXSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmRhdGE9ZXx8IiJ9fSx1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QubWV0aG9kPT09ZW4uR0VUJiZUKHQuZGF0YSkmJk9iamVjdC5rZXlzKHQuZGF0YSkubGVuZ3RoJiYodC51cmw9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnNwbGl0KCIjIikscj1uWzFdfHwiIixpPShuPW5bMF0uc3BsaXQoIj8iKSlbMV18fCIiO2U9blswXTt2YXIgbz1pLnNwbGl0KCImIikuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlfSk7Zm9yKHZhciBhIGluIGk9e30sby5mb3JFYWNoKGZ1bmN0aW9uKGUpe2U9ZS5zcGxpdCgiPSIpLGlbZVswXV09ZVsxXX0pLHQpaWYoayh0LGEpKXt2YXIgcz10W2FdO251bGw9PXM/cz0iIjpUKHMpJiYocz1KU09OLnN0cmluZ2lmeShzKSksaVtybihhKV09cm4ocyl9cmV0dXJuIGUrKChpPU9iamVjdC5rZXlzKGkpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZSsiPSIraVtlXX0pLmpvaW4oIiYiKSk/Ij8iK2k6IiIpKyhyPyIjIityOiIiKX0oZSx0LmRhdGEpKX19LGhlYWRlcjp7dHlwZTpPYmplY3QsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5oZWFkZXI9ZXx8e307dC5tZXRob2QhPT1lbi5HRVQmJihPYmplY3Qua2V5cyhuKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiJjb250ZW50LXR5cGUiPT09ZS50b0xvd2VyQ2FzZSgpfSl8fChuWyJDb250ZW50LVR5cGUiXT0iYXBwbGljYXRpb24vanNvbiIpKX19LGRhdGFUeXBlOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmRhdGFUeXBlPShlfHx0bikudG9Mb3dlckNhc2UoKX19LHJlc3BvbnNlVHlwZTp7dHlwZTpTdHJpbmcsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZT0oZXx8IiIpLnRvTG93ZXJDYXNlKCksdC5yZXNwb25zZVR5cGU9T2JqZWN0LnZhbHVlcyhubikuaW5kZXhPZihlKTwwP25uLlRFWFQ6ZX19LHdpdGhDcmVkZW50aWFsczp7dHlwZTpCb29sZWFufSx0aW1lb3V0Ont0eXBlOk51bWJlcn19LHNuPXtjZXJ0aWZpY2F0ZXM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUpe2lmKGUuc29tZShmdW5jdGlvbihlKXtyZXR1cm4iU3RyaW5nIiE9PWYoZS5ob3N0KX0pKXJldHVybiLlj4LmlbDphY3nva7plJnor6/vvIzor7fnoa7orqTlkI7ph43or5UifX19LGNuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHJlcXVlc3Q6YW4sY29uZmlnTVRMUzpzbn0pLHVuPXtPUFRJT05TOiJPUFRJT05TIixHRVQ6IkdFVCIsSEVBRDoiSEVBRCIsUE9TVDoiUE9TVCIsUFVUOiJQVVQiLERFTEVURToiREVMRVRFIixUUkFDRToiVFJBQ0UiLENPTk5FQ1Q6IkNPTk5FQ1QifSxsbj17dXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0saGVhZGVyOnt0eXBlOk9iamVjdCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmhlYWRlcj1lfHx7fX19LG1ldGhvZDp7dHlwZTpTdHJpbmcsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZT0oZXx8IiIpLnRvVXBwZXJDYXNlKCksdC5tZXRob2Q9T2JqZWN0LnZhbHVlcyh1bikuaW5kZXhPZihlKTwwP3VuLkdFVDplfX0scHJvdG9jb2xzOnt0eXBlOltBcnJheSxTdHJpbmddLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpeyJzdHJpbmciPT10eXBlb2YgZSYmKGU9W2VdKSx0LnByb3RvY29scz0oZXx8W10pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV9KX19fSxkbj17ZGF0YTp7dHlwZTpbU3RyaW5nLEFycmF5QnVmZmVyXX19LGZuPXtjb2RlOnt0eXBlOk51bWJlcn0scmVhc29uOnt0eXBlOlN0cmluZ319LHBuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNvbm5lY3RTb2NrZXQ6bG4sc2VuZFNvY2tldE1lc3NhZ2U6ZG4sY2xvc2VTb2NrZXQ6Zm59KSxobj17dXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZmlsZXM6e3R5cGU6QXJyYXl9LGZpbGVQYXRoOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlJiYodC5maWxlUGF0aD1wdChlKSl9fSxuYW1lOnt0eXBlOlN0cmluZ30saGVhZGVyOnt0eXBlOk9iamVjdCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmhlYWRlcj1lfHx7fX19LGZvcm1EYXRhOnt0eXBlOk9iamVjdCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmZvcm1EYXRhPWV8fHt9fX19LHZuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHVwbG9hZEZpbGU6aG59KSxnbj17T0FVVEg6Ik9BVVRIIixTSEFSRToiU0hBUkUiLFBBWU1FTlQ6IlBBWU1FTlQiLFBVU0g6IlBVU0gifSxtbj17c2VydmljZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7aWYoKGU9KGV8fCIiKS50b1VwcGVyQ2FzZSgpKSYmT2JqZWN0LnZhbHVlcyhnbikuaW5kZXhPZihlKTwwKXJldHVybiJzZXJ2aWNlIGVycm9yIn19fSx5bj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxnZXRQcm92aWRlcjptbn0pLF9uPXtyb290Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24odCxlKXt2YXIgbj0kdi5zdWJQYWNrYWdlcztyZXR1cm4gQXJyYXkuaXNBcnJheShuKSYmMCE9PW4ubGVuZ3RoP24uZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5yb290PT09dH0pP3ZvaWQgMDoicm9vdCBgIit0KyJgIGlzIG5vdCBmb3VuZCI6Im5vIHN1YlBhY2thZ2VzIn19fSxibj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxsb2FkU3ViUGFja2FnZTpfbn0pLHduPXtVTklWRVJJRlk6InVuaXZlcmlmeSJ9LGtuPXtwcm92aWRlcjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsZGVmYXVsdDp3bi5VTklWRVJJRlksdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7aWYoT2JqZWN0LnZhbHVlcyh3bikuaW5kZXhPZihlKTwwKXJldHVybiJwcm92aWRlciBlcnJvciJ9fX0sU249T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwscHJlTG9naW46a259KTtmdW5jdGlvbiB4bihhKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgcj0oZT1zdChlKSkuc3BsaXQoIj8iKVswXSxuPVB2LmZpbmQoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXRoLG49ZS5hbGlhcztyZXR1cm4gdD09PXJ8fG49PT1yfSk7aWYoIW4pcmV0dXJuInBhZ2UgYCIrZSsiYCBpcyBub3QgZm91bmQiO2lmKCJuYXZpZ2F0ZVRvIj09PWF8fCJyZWRpcmVjdFRvIj09PWEpe2lmKG4ubWV0YS5pc1RhYkJhcilyZXR1cm4iY2FuIG5vdCAiK2ErIiBhIHRhYmJhciBwYWdlIn1lbHNlIGlmKCJzd2l0Y2hUYWIiPT09YSYmIW4ubWV0YS5pc1RhYkJhcilyZXR1cm4iY2FuIG5vdCBzd2l0Y2ggdG8gbm8tdGFiQmFyIHBhZ2UiO2lmKCJzd2l0Y2hUYWIiIT09YSYmInByZWxvYWRQYWdlIiE9PWF8fCFuLm1ldGEuaXNUYWJCYXJ8fCJhcHBMYXVuY2giPT09dC5vcGVuVHlwZXx8KGU9ciksbi5tZXRhLmlzRW50cnkmJihlPWUucmVwbGFjZShuLmFsaWFzLCIvIikpLHQudXJsPWZ1bmN0aW9uKGUpe2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gZTt2YXIgdD1lLmluZGV4T2YoIj8iKTtpZigtMT09PXQpcmV0dXJuIGU7dmFyIG49ZS5zdWJzdHIodCsxKS50cmltKCkucmVwbGFjZSgvXihcP3wjfCYpLywiIik7aWYoIW4pcmV0dXJuIGU7ZT1lLnN1YnN0cigwLHQpO3ZhciBpPVtdO3JldHVybiBuLnNwbGl0KCImIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoL1wrL2csIiAiKS5zcGxpdCgiPSIpLG49dC5zaGlmdCgpLHI9MDx0Lmxlbmd0aD90LmpvaW4oIj0iKToiIjtpLnB1c2gobisiPSIrZW5jb2RlVVJJQ29tcG9uZW50KHIpKX0pLGkubGVuZ3RoP2UrIj8iK2kuam9pbigiJiIpOmV9KGUpLCJ1blByZWxvYWRQYWdlIiE9PWEpaWYoInByZWxvYWRQYWdlIiE9PWEpe2lmKG9uPT09ZSYmImFwcExhdW5jaCIhPT10Lm9wZW5UeXBlKXJldHVybiBvbisiIGxvY2tlZCI7JHYucmVhZHkmJiExIT09JHYuZW5hYmxlTmF2aWdhdG9yTG9jayYmKG9uPWUpfWVsc2V7aWYoIW4ubWV0YS5pc05WdWUpcmV0dXJuImNhbiBub3QgcHJlbG9hZCB2dWUgcGFnZSI7aWYobi5tZXRhLmlzVGFiQmFyKXt2YXIgaT1MdighMCksbz0obi5hbGlhc3x8bi5wYXRoKS5zdWJzdHIoMSk7aWYoaS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnJvdXRlPT09b30pKXJldHVybiJ0YWJCYXIgcGFnZSBgIitvKyJgIGFscmVhZHkgZXhpc3RzIn19fX1mdW5jdGlvbiBDbihlLHQpe3JldHVybiB2b2lkIDA9PT10JiYodD17fSksT2JqZWN0LmFzc2lnbih7dXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6eG4oZSl9LGJlZm9yZUFsbDpmdW5jdGlvbigpe29uPSIifX0sdCl9ZnVuY3Rpb24gVG4odCl7cmV0dXJue2FuaW1hdGlvblR5cGU6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtpZihlJiYtMT09PXQuaW5kZXhPZihlKSlyZXR1cm4iYCIrZSsiYCBpcyBub3Qgc3VwcG9ydGVkIGZvciBgYW5pbWF0aW9uVHlwZWAgKHN1cHBvcnRlZCB2YWx1ZXMgYXJlOiBgIit0LmpvaW4oImB8YCIpKyJgKSJ9fSxhbmltYXRpb25EdXJhdGlvbjp7dHlwZTpOdW1iZXJ9fX12YXIgT24sRW4sSW49Q24oInJlZGlyZWN0VG8iKSxBbj1DbigicmVMYXVuY2giKSwkbj1DbigibmF2aWdhdGVUbyIsVG4oWyJzbGlkZS1pbi1yaWdodCIsInNsaWRlLWluLWxlZnQiLCJzbGlkZS1pbi10b3AiLCJzbGlkZS1pbi1ib3R0b20iLCJmYWRlLWluIiwiem9vbS1vdXQiLCJ6b29tLWZhZGUtb3V0IiwicG9wLWluIiwibm9uZSJdKSksUG49Q24oInN3aXRjaFRhYiIpLE1uPU9iamVjdC5hc3NpZ24oe2RlbHRhOnt0eXBlOk51bWJlcix2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPXBhcnNlSW50KGUpfHwxLHQuZGVsdGE9TWF0aC5taW4oTHYoKS5sZW5ndGgtMSxlKX19fSxUbihbInNsaWRlLW91dC1yaWdodCIsInNsaWRlLW91dC1sZWZ0Iiwic2xpZGUtb3V0LXRvcCIsInNsaWRlLW91dC1ib3R0b20iLCJmYWRlLW91dCIsInpvb20taW4iLCJ6b29tLWZhZGUtaW4iLCJwb3Atb3V0Iiwibm9uZSJdKSksam49e3VybDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOnhuKCJwcmVsb2FkUGFnZSIpfX0sTG49e3VybDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOnhuKCJ1blByZWxvYWRQYWdlIil9fSxCbj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxyZWRpcmVjdFRvOkluLHJlTGF1bmNoOkFuLG5hdmlnYXRlVG86JG4sc3dpdGNoVGFiOlBuLG5hdmlnYXRlQmFjazpNbixwcmVsb2FkUGFnZTpqbix1blByZWxvYWRQYWdlOkxufSksTm49e2tleTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxEbj1be25hbWU6ImtleSIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSxSbj17a2V5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZGF0YTp7cmVxdWlyZWQ6ITB9fSxGbj1be25hbWU6ImtleSIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHtuYW1lOiJkYXRhIixyZXF1aXJlZDohMH1dLHpuPU5uLFZuPURuLFVuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldFN0b3JhZ2U6Tm4sZ2V0U3RvcmFnZVN5bmM6RG4sc2V0U3RvcmFnZTpSbixzZXRTdG9yYWdlU3luYzpGbixyZW1vdmVTdG9yYWdlOnpuLHJlbW92ZVN0b3JhZ2VTeW5jOlZufSkscW49e2ZhbWlseTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHNvdXJjZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGRlc2M6e3R5cGU6T2JqZWN0LHJlcXVpcmVkOiExfSxzdWNjZXNzOnt0eXBlOkZ1bmN0aW9uLHJlcXVpcmVkOiExfSxmYWlsOnt0eXBlOkZ1bmN0aW9uLHJlcXVpcmVkOiExfSxjb21wbGV0ZTp7dHlwZTpGdW5jdGlvbixyZXF1aXJlZDohMX19LFduPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGxvYWRGb250RmFjZTpxbn0pLEhuPVsiI2ZmZmZmZiIsIiMwMDAwMDAiXSxHbj17ZnJvbnRDb2xvcjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7aWYoLTE9PT1Ibi5pbmRleE9mKGUpKXJldHVybidpbnZhbGlkIGZyb250Q29sb3IgIicrZSsnIid9fSxiYWNrZ3JvdW5kQ29sb3I6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxhbmltYXRpb246e3R5cGU6T2JqZWN0LGRlZmF1bHQ6ZnVuY3Rpb24oKXtyZXR1cm57ZHVyYXRpb246MCx0aW1pbmdGdW5jOiJsaW5lYXIifX0sdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pLHQuYW5pbWF0aW9uPXtkdXJhdGlvbjplLmR1cmF0aW9ufHwwLHRpbWluZ0Z1bmM6ZS50aW1pbmdGdW5jfHwibGluZWFyIn19fX0sWG49e3RpdGxlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LFluPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHNldE5hdmlnYXRpb25CYXJDb2xvcjpHbixzZXROYXZpZ2F0aW9uQmFyVGl0bGU6WG59KSxKbj17c2Nyb2xsVG9wOnt0eXBlOk51bWJlcn0sZHVyYXRpb246e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MzAwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuZHVyYXRpb249TWF0aC5tYXgoMCxlKX19fSxLbj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxwYWdlU2Nyb2xsVG86Sm59KSxabj17dGl0bGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGNvbnRlbnQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LHNob3dDYW5jZWw6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiEwfSxjYW5jZWxUZXh0Ont0eXBlOlN0cmluZyxkZWZhdWx0OmZ1bmN0aW9uKCl7cmV0dXJuIFFlKCJ1bmkuc2hvd01vZGFsLmNhbmNlbCIpfX0sY2FuY2VsQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiMwMDAwMDAifSxjb25maXJtVGV4dDp7dHlwZTpTdHJpbmcsZGVmYXVsdDpmdW5jdGlvbigpe3JldHVybiBRZSgidW5pLnNob3dNb2RhbC5jb25maXJtIil9fSxjb25maXJtQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiMwMDdhZmYifSx2aXNpYmxlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMH19LFFuPXt0aXRsZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0saWNvbjp7ZGVmYXVsdDoic3VjY2VzcyIsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7LTE9PT1bInN1Y2Nlc3MiLCJsb2FkaW5nIiwiZXJyb3IiLCJub25lIl0uaW5kZXhPZihlKSYmKHQuaWNvbj0ic3VjY2VzcyIpfX0saW1hZ2U6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiIsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZSYmKHQuaW1hZ2U9cHQoZSkpfX0sZHVyYXRpb246e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MTUwMH0sbWFzazp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LHZpc2libGU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiEwfX0sZXI9e3RpdGxlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxpY29uOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJsb2FkaW5nIn0sZHVyYXRpb246e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MWU4fSxtYXNrOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sdmlzaWJsZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITB9fSx0cj17aXRlbUxpc3Q6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7aWYoIWUubGVuZ3RoKXJldHVybiJwYXJhbWV0ZXIuaXRlbUxpc3Qgc2hvdWxkIGhhdmUgYXQgbGVhc3QgMSBpdGVtIn19LGl0ZW1Db2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwMDAwMCJ9LHZpc2libGU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiEwfSxwb3BvdmVyOnt0eXBlOk9iamVjdH19LG5yPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHNob3dNb2RhbDpabixzaG93VG9hc3Q6UW4sc2hvd0xvYWRpbmc6ZXIsc2hvd0FjdGlvblNoZWV0OnRyfSkscnI9e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwfSxpcj17aW5kZXg6cnIsdGV4dDp7dHlwZTpTdHJpbmd9LGljb25QYXRoOnt0eXBlOlN0cmluZ30sc2VsZWN0ZWRJY29uUGF0aDp7dHlwZTpTdHJpbmd9LHBhZ2VQYXRoOnt0eXBlOlN0cmluZ319LG9yPXtjb2xvcjp7dHlwZTpTdHJpbmd9LHNlbGVjdGVkQ29sb3I6e3R5cGU6U3RyaW5nfSxiYWNrZ3JvdW5kQ29sb3I6e3R5cGU6U3RyaW5nfSxiYWNrZ3JvdW5kSW1hZ2U6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2UmJiEvXihsaW5lYXJ8cmFkaWFsKS1ncmFkaWVudFwoLis/XCk7PyQvLnRlc3QoZSkmJih0LmJhY2tncm91bmRJbWFnZT1wdChlKSl9fSxiYWNrZ3JvdW5kUmVwZWF0Ont0eXBlOlN0cmluZ30sYm9yZGVyU3R5bGU6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2UmJih0LmJvcmRlclN0eWxlPSJibGFjayI9PT1lPyJibGFjayI6IndoaXRlIil9fX0sYXI9e2FuaW1hdGlvbjp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9fSxzcj17YW5pbWF0aW9uOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX19LGNyPXtpbmRleDpycn0sdXI9e2luZGV4OnJyfSxscj17aW5kZXg6cnJ9LGRyPXtpbmRleDpycix0ZXh0Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt2YXIgbjt2b2lkIDA9PT0obj1lKSYmKG49IiIpLDQ8PSgiIituKS5yZXBsYWNlKC9bXlx4MDAtXHhmZl0vZywiKioiKS5sZW5ndGgmJih0LnRleHQ9Ii4uLiIpfX19LGZyPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHNldFRhYkJhckl0ZW06aXIsc2V0VGFiQmFyU3R5bGU6b3IsaGlkZVRhYkJhcjphcixzaG93VGFiQmFyOnNyLGhpZGVUYWJCYXJSZWREb3Q6Y3Isc2hvd1RhYkJhclJlZERvdDp1cixyZW1vdmVUYWJCYXJCYWRnZTpscixzZXRUYWJCYXJCYWRnZTpkcn0pLHByPU9iamVjdC5jcmVhdGUobnVsbCksaHI9KE9uPXsiLi9iYXNlL2Jhc2U2NC5qcyI6bmUsIi4vYmFzZS9jYW4taS11c2UuanMiOmllLCIuL2Jhc2UvZXZlbnQtYnVzLmpzIjp1ZSwiLi9iYXNlL2ludGVyY2VwdG9yLmpzIjpmZSwiLi9iYXNlL3VweDJweC5qcyI6aGUsIi4vY29udGV4dC9jYW52YXMuanMiOndlLCIuL2NvbnRleHQvY29udGV4dC5qcyI6T2UsIi4vZGV2aWNlL2FkZC1waG9uZS1jb250YWN0LmpzIjpJZSwiLi9kZXZpY2UvbWFrZS1waG9uZS1jYWxsLmpzIjokZSwiLi9kZXZpY2Uvc2Nhbi1jb2RlLmpzIjpNZSwiLi9kZXZpY2Uvc2V0LWNsaXBib2FyZC1kYXRhLmpzIjphdCwiLi9maWxlL2ZpbGUuanMiOl90LCIuL2ZpbGUvb3Blbi1kb2N1bWVudC5qcyI6d3QsIi4vbG9jYXRpb24vY2hvb3NlLWxvY2F0aW9uLmpzIjpTdCwiLi9sb2NhdGlvbi9nZXQtbG9jYXRpb24uanMiOlR0LCIuL2xvY2F0aW9uL29wZW4tbG9jYXRpb24uanMiOkV0LCIuL21lZGlhL2Nob29zZS1maWxlLmpzIjpQdCwiLi9tZWRpYS9jaG9vc2UtaW1hZ2UuanMiOkJ0LCIuL21lZGlhL2Nob29zZS12aWRlby5qcyI6UnQsIi4vbWVkaWEvY29tcHJlc3MtaW1hZ2UuanMiOnp0LCIuL21lZGlhL2NvbXByZXNzLXZpZGVvLmpzIjpVdCwiLi9tZWRpYS9nZXQtaW1hZ2UtaW5mby5qcyI6V3QsIi4vbWVkaWEvZ2V0LXZpZGVvLWluZm8uanMiOkd0LCIuL21lZGlhL3ByZXZpZXctaW1hZ2UuanMiOll0LCIuL21lZGlhL3NhdmUtaW1hZ2UtdG8tcGhvdG9zLWFsYnVtLmpzIjpLdCwiLi9uZXR3b3JrL2Rvd25sb2FkLWZpbGUuanMiOlF0LCIuL25ldHdvcmsvcmVxdWVzdC5qcyI6Y24sIi4vbmV0d29yay9zb2NrZXQuanMiOnBuLCIuL25ldHdvcmsvdXBsb2FkLWZpbGUuanMiOnZuLCIuL3BsdWdpbi9nZXQtcHJvdmlkZXIuanMiOnluLCIuL3BsdWdpbi9sb2FkLXN1Yi1wYWNrYWdlLmpzIjpibiwiLi9wbHVnaW4vcHJlLWxvZ2luLmpzIjpTbiwiLi9yb3V0ZS9yb3V0ZS5qcyI6Qm4sIi4vc3RvcmFnZS9zdG9yYWdlLmpzIjpVbiwiLi91aS9sb2FkLWZvbnQtZmFjZS5qcyI6V24sIi4vdWkvbmF2aWdhdGlvbi1iYXIuanMiOlluLCIuL3VpL3BhZ2Utc2Nyb2xsLXRvLmpzIjpLbiwiLi91aS9wb3B1cC5qcyI6bnIsIi4vdWkvdGFiLWJhci5qcyI6ZnJ9LChFbj1mdW5jdGlvbihlKXtyZXR1cm4gT25bZV18fGZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrZSsiJy4iKX0oKX0pLmtleXM9ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmtleXMoT24pfSxFbik7ZnVuY3Rpb24gdnIoZSx0LG4pe3ZhciByPXRbZV0saT0hayhuLGUpLG89bltlXTtpZigtMTxmdW5jdGlvbihlLHQpe2lmKCFBcnJheS5pc0FycmF5KHQpKXJldHVybiBfcih0LGUpPzA6LTE7Zm9yKHZhciBuPTAscj10Lmxlbmd0aDtuPHI7bisrKWlmKF9yKHRbbl0sZSkpcmV0dXJuIG47cmV0dXJuLTF9KEJvb2xlYW4sci50eXBlKSYmaSYmIWsociwiZGVmYXVsdCIpJiYobz0hMSksdm9pZCAwPT09byYmayhyLCJkZWZhdWx0Iikpe3ZhciBhPXIuZGVmYXVsdDtvPUMoYSk/YSgpOmEsbltlXT1vfXJldHVybiBmdW5jdGlvbihlLHQsbixyLGkpe2lmKGUucmVxdWlyZWQmJnIpcmV0dXJuIk1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyIGAiK3QrImAiO2lmKG51bGw9PW4mJiFlLnJlcXVpcmVkKXt2YXIgbz1lLnZhbGlkYXRvcjtyZXR1cm4gbz9vKG4saSk6dm9pZCAwfXZhciBhPWUudHlwZSxzPSFhfHwhMD09PWEsYz1bXTtpZihhKXtBcnJheS5pc0FycmF5KGEpfHwoYT1bYV0pO2Zvcih2YXIgdT0wO3U8YS5sZW5ndGgmJiFzO3UrKyl7dmFyIGw9bXIobixhW3VdKTtjLnB1c2gobC5leHBlY3RlZFR5cGV8fCIiKSxzPWwudmFsaWR9fWlmKCFzKXJldHVybiBmdW5jdGlvbihlLHQsbil7dmFyIHI9InBhcmFtZXRlciBgIitlKyJgLiBFeHBlY3RlZCAiK24uam9pbigiLCAiKSxpPW5bMF0sbz1mKHQpLGE9YnIodCxpKSxzPWJyKHQsbyk7MT09PW4ubGVuZ3RoJiZrcihpKSYmIWZ1bmN0aW9uKCl7dmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO2Zvcig7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtyZXR1cm4gZS5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiJib29sZWFuIj09PWUudG9Mb3dlckNhc2UoKX0pfShpLG8pJiYocis9IiB3aXRoIHZhbHVlICIrYSk7cis9IiwgZ290ICIrbysiICIsa3IobykmJihyKz0id2l0aCB2YWx1ZSAiK3MrIi4iKTtyZXR1cm4gcn0odCxuLGMpO3ZhciBkPWUudmFsaWRhdG9yO2lmKGQpcmV0dXJuIGQobixpKX0ocixlLG8saSxuKX1oci5rZXlzKCkuZm9yRWFjaChmdW5jdGlvbihlKXtPYmplY3QuYXNzaWduKHByLGhyKGUpKX0pO3ZhciBncj0vXihTdHJpbmd8TnVtYmVyfEJvb2xlYW58RnVuY3Rpb258U3ltYm9sKSQvO2Z1bmN0aW9uIG1yKGUsdCl7dmFyIG4scj15cih0KTtpZihnci50ZXN0KHIpKXt2YXIgaT10eXBlb2YgZTsobj1pPT09ci50b0xvd2VyQ2FzZSgpKXx8Im9iamVjdCIhPT1pfHwobj1lIGluc3RhbmNlb2YgdCl9ZWxzZSBuPTA8PWUuYnl0ZUxlbmd0aHx8KCJPYmplY3QiPT09cj9UKGUpOiJBcnJheSI9PT1yP0FycmF5LmlzQXJyYXkoZSk6ZSBpbnN0YW5jZW9mIHR8fGYoZSk9PT15cih0KSk7cmV0dXJue3ZhbGlkOm4sZXhwZWN0ZWRUeXBlOnJ9fWZ1bmN0aW9uIHlyKGUpe3ZhciB0PWUmJmUudG9TdHJpbmcoKS5tYXRjaCgvXlxzKmZ1bmN0aW9uIChcdyspLyk7cmV0dXJuIHQ/dFsxXToiIn1mdW5jdGlvbiBfcihlLHQpe3JldHVybiB5cihlKT09PXlyKHQpfWZ1bmN0aW9uIGJyKGUsdCl7cmV0dXJuIlN0cmluZyI9PT10PyciJytlKyciJzoiTnVtYmVyIj09PXQ/IiIrTnVtYmVyKGUpOiIiK2V9dmFyIHdyPVsic3RyaW5nIiwibnVtYmVyIiwiYm9vbGVhbiJdO2Z1bmN0aW9uIGtyKHQpe3JldHVybiB3ci5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiB0LnRvTG93ZXJDYXNlKCk9PT1lfSl9ZnVuY3Rpb24gU3IoZSx0LG4pe3ZhciByPXQrIjpmYWlsICIrZTtpZigtMT09PW4pdGhyb3cgbmV3IEVycm9yKHIpO3JldHVybiJudW1iZXIiPT10eXBlb2YgbiYmQXIobix7ZXJyTXNnOnJ9KSwhMX12YXIgeHI9W3tuYW1lOiJjYWxsYmFjayIsdHlwZTpGdW5jdGlvbixyZXF1aXJlZDohMH1dLENyPVsiYmVmb3JlVmFsaWRhdGUiLCJiZWZvcmVBbGwiLCJiZWZvcmVTdWNjZXNzIl07ZnVuY3Rpb24gVHIoZSxuLHQpe3ZhciByPXByW2VdO2lmKCFyJiZLKGUpJiYocj14cikscil7aWYoQXJyYXkuaXNBcnJheShyKSYmQXJyYXkuaXNBcnJheShuKSl7dmFyIGk9T2JqZWN0LmNyZWF0ZShudWxsKSxvPU9iamVjdC5jcmVhdGUobnVsbCksYT1uLmxlbmd0aDtyLmZvckVhY2goZnVuY3Rpb24oZSx0KXtpW2UubmFtZV09ZSx0PGEmJihvW2UubmFtZV09blt0XSl9KSxyPWksbj1vfWlmKEMoci5iZWZvcmVWYWxpZGF0ZSkpe3ZhciBzPXIuYmVmb3JlVmFsaWRhdGUobik7aWYocylyZXR1cm4gU3IocyxlLHQpfWZvcih2YXIgYz1PYmplY3Qua2V5cyhyKSx1PTA7dTxjLmxlbmd0aDt1KyspaWYoLTE9PT1Dci5pbmRleE9mKGNbdV0pKXt2YXIgbD12cihjW3VdLHIsbik7aWYobClyZXR1cm4gU3IobCxlLHQpfX1yZXR1cm4hMH12YXIgT3I9MSxFcj17fTtmdW5jdGlvbiBJcihlLHQsbil7dm9pZCAwPT09dCYmKHQ9e30pLHZvaWQgMD09PW4mJihuPXt9KTt2YXIgcj1mdW5jdGlvbihpLG8sZSl7aWYodm9pZCAwPT09byYmKG89e30pLHZvaWQgMD09PWUmJihlPXt9KSwhVChvKSlyZXR1cm57cGFyYW1zOm99O3ZhciB0PVEobz1PYmplY3QuYXNzaWduKHt9LG8pKSxhPXQuc3VjY2VzcyxzPXQuZmFpbCxjPXQuY2FuY2VsLHU9dC5jb21wbGV0ZSxsPUMoYSksZD1DKHMpLGY9QyhjKSxwPUModSk7aWYoIShsfHxkfHxmfHxwKSlyZXR1cm57cGFyYW1zOm99O3ZhciBuPXt9O2Zvcih2YXIgciBpbiBlKXt2YXIgaD1lW3JdO0MoaCkmJihuW3JdPUEoaCkpfXZhciB2PW4uYmVmb3JlU3VjY2VzcyxnPW4uYWZ0ZXJTdWNjZXNzLG09bi5iZWZvcmVGYWlsLHk9bi5hZnRlckZhaWwsXz1uLmJlZm9yZUNhbmNlbCxiPW4uYWZ0ZXJDYW5jZWwsdz1uLmJlZm9yZUFsbCxrPW4uYWZ0ZXJBbGwsUz1PcisrLHg9ImFwaS4iK2krIi4iK1M7cmV0dXJuIEVyW1NdPXtuYW1lOngsY2FsbGJhY2s6ZnVuY3Rpb24oZSl7aWYoZS5lcnJNc2c9ZS5lcnJNc2d8fGkrIjpvayIsLTEhPT1lLmVyck1zZy5pbmRleE9mKCI6b2siKSllLmVyck1zZz1pKyI6b2siO2Vsc2UgaWYoLTEhPT1lLmVyck1zZy5pbmRleE9mKCI6Y2FuY2VsIikpZS5lcnJNc2c9aSsiOmNhbmNlbCI7ZWxzZSBpZigtMSE9PWUuZXJyTXNnLmluZGV4T2YoIjpmYWlsIikpe3ZhciB0PSIiLG49ZS5lcnJNc2cuaW5kZXhPZigiICIpOy0xPG4mJih0PWUuZXJyTXNnLnN1YnN0cihuKSksZS5lcnJNc2c9aSsiOmZhaWwiK3R9Qyh3KSYmdyhlKTt2YXIgcj1lLmVyck1zZzswPT09ci5pbmRleE9mKGkrIjpvayIpPyhDKHYpJiZ2KGUsbyksbCYmYShlKSxDKGcpJiZnKGUpKTowPT09ci5pbmRleE9mKGkrIjpjYW5jZWwiKT8oZS5lcnJNc2c9ZS5lcnJNc2cucmVwbGFjZShpKyI6Y2FuY2VsIixpKyI6ZmFpbCBjYW5jZWwiKSxkJiZzKGUpLEMoXykmJl8oZSksZiYmYyhlKSxDKGIpJiZiKGUpKTowPT09ci5pbmRleE9mKGkrIjpmYWlsIikmJihDKG0pJiZtKGUpLGQmJnMoZSksQyh5KSYmeShlKSkscCYmdShlKSxDKGspJiZrKGUpfX0se3BhcmFtczpvLGNhbGxiYWNrSWQ6U319KGUsdCxuKSxpPXIucGFyYW1zLG89ci5jYWxsYmFja0lkO3JldHVybiBUKGkpJiYhVHIoZSxpLG8pP3twYXJhbXM6aSxjYWxsYmFja0lkOiExfTp7cGFyYW1zOmksY2FsbGJhY2tJZDpvfX1mdW5jdGlvbiBBcihlLHQsbil7aWYoIm51bWJlciI9PXR5cGVvZiBlKXt2YXIgcj1FcltlXTtpZihyKXJldHVybiByLmtlZXBBbGl2ZXx8ZGVsZXRlIEVyW2VdLHIuY2FsbGJhY2sodCxuKX1yZXR1cm4gdH1mdW5jdGlvbiAkcih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7Y29uc29sZS5lcnJvcigiQVBJIGAiK3QrImAgaXMgbm90IHlldCBpbXBsZW1lbnRlZCIpfX12YXIgUHI9WyJnZXRQdXNoQ2xpZW50SWQiLCJvblB1c2hNZXNzYWdlIiwib2ZmUHVzaE1lc3NhZ2UiXTtmdW5jdGlvbiBNcihjLHUsbCl7cmV0dXJuIHZvaWQgMD09PWwmJihsPXt9KSwtMTxQci5pbmRleE9mKGMpfHwhQyh1KT91OihlPWwsKHQ9cHJbY10pJiYoQyh0LmJlZm9yZUFsbCkmJihlLmJlZm9yZUFsbD10LmJlZm9yZUFsbCksQyh0LmJlZm9yZVN1Y2Nlc3MpJiYoZS5iZWZvcmVTdWNjZXNzPXQuYmVmb3JlU3VjY2VzcykpLGZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoO24tLTspdFtuXT1hcmd1bWVudHNbbl07aWYoSihjKSl7aWYoVHIoYyx0LC0xKSlyZXR1cm4gdS5hcHBseShudWxsLHQpfWVsc2UgaWYoSyhjKSl7aWYoVHIoYyx0LC0xKSlyZXR1cm4gdSgoYy5zdGFydHNXaXRoKCJvZmYiKT9mdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiBFcil7dmFyIHI9RXJbbl07aWYoci5uYW1lLnN0YXJ0c1dpdGgoImFwaS4iK2UucmVwbGFjZSgvXm9mZi8sIm9uIikpJiZyLmNhbGxiYWNrPT09dClyZXR1cm4gZGVsZXRlIEVyW25dLE51bWJlcihuKX1yZXR1cm4iZmFpbCJ9OmZ1bmN0aW9uKGUsdCl7dmFyIG49T3IrKyxyPSJhcGkuIitlKyIuIituO3JldHVybiBFcltuXT17bmFtZTpyLGtlZXBBbGl2ZTohMCxjYWxsYmFjazp0fSxufSkoYyx0WzBdKSl9ZWxzZXt2YXIgcj17fTt0Lmxlbmd0aCYmKHI9dFswXSk7dmFyIGksbz1JcihjLHIsbCksYT1vLnBhcmFtcyxzPW8uY2FsbGJhY2tJZDtpZighMSE9PXMpcmV0dXJuKGk9QyhhKT91KHMpOnUoYSxzKSkmJihlPWMsLTE9PT1HLmluZGV4T2YoZSkpJiZUKGk9QXIocyxpKSkmJihpLmVyck1zZz1pLmVyck1zZ3x8YysiOm9rIiksaX19KTt2YXIgZSx0fWZ1bmN0aW9uIGpyKGUsdCl7cmV0dXJuIGUodD17ZXhwb3J0czp7fX0sdC5leHBvcnRzKSx0LmV4cG9ydHN9dmFyIExyPWpyKGZ1bmN0aW9uKGUsdCl7IWZ1bmN0aW9uKCl7Zm9yKHZhciBvPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIixkPW5ldyBVaW50OEFycmF5KDI1NiksZT0wO2U8by5sZW5ndGg7ZSsrKWRbby5jaGFyQ29kZUF0KGUpXT1lO3QuZW5jb2RlPWZ1bmN0aW9uKGUpe3ZhciB0LG49bmV3IFVpbnQ4QXJyYXkoZSkscj1uLmxlbmd0aCxpPSIiO2Zvcih0PTA7dDxyO3QrPTMpaSs9b1tuW3RdPj4yXSxpKz1vWygzJm5bdF0pPDw0fG5bdCsxXT4+NF0saSs9b1soMTUmblt0KzFdKTw8MnxuW3QrMl0+PjZdLGkrPW9bNjMmblt0KzJdXTtyZXR1cm4gciUzPT0yP2k9aS5zdWJzdHJpbmcoMCxpLmxlbmd0aC0xKSsiPSI6ciUzPT0xJiYoaT1pLnN1YnN0cmluZygwLGkubGVuZ3RoLTIpKyI9PSIpLGl9LHQuZGVjb2RlPWZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG8sYT0uNzUqZS5sZW5ndGgscz1lLmxlbmd0aCxjPTA7Ij0iPT09ZVtlLmxlbmd0aC0xXSYmKGEtLSwiPSI9PT1lW2UubGVuZ3RoLTJdJiZhLS0pO3ZhciB1PW5ldyBBcnJheUJ1ZmZlcihhKSxsPW5ldyBVaW50OEFycmF5KHUpO2Zvcih0PTA7dDxzO3QrPTQpbj1kW2UuY2hhckNvZGVBdCh0KV0scj1kW2UuY2hhckNvZGVBdCh0KzEpXSxpPWRbZS5jaGFyQ29kZUF0KHQrMildLG89ZFtlLmNoYXJDb2RlQXQodCszKV0sbFtjKytdPW48PDJ8cj4+NCxsW2MrK109KDE1JnIpPDw0fGk+PjIsbFtjKytdPSgzJmkpPDw2fDYzJm87cmV0dXJuIHV9fSgpfSksQnI9THIuZW5jb2RlLE5yPUxyLmRlY29kZTt2YXIgRHI9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsYmFzZTY0VG9BcnJheUJ1ZmZlcjpmdW5jdGlvbihlKXtyZXR1cm4gTnIoZSl9LGFycmF5QnVmZmVyVG9CYXNlNjQ6ZnVuY3Rpb24oZSl7cmV0dXJuIEJyKGUpfX0pLFJyPXt9O3ZhciBGcj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjYW5JVXNlOmZ1bmN0aW9uKGUpe3JldHVybiBrKFJyLGUpP1JyW2VdOiEhayhFaCxlKX19KSx6cj17cHJvbWlzZUludGVyY2VwdG9yOlV9LFZyPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGludGVyY2VwdG9yczp6cixhZGRJbnRlcmNlcHRvcjpmdW5jdGlvbihlLHQpeyJzdHJpbmciPT10eXBlb2YgZSYmVCh0KT9MKGpbZV18fChqW2VdPXt9KSx0KTpUKGUpJiZMKE0sZSl9LHJlbW92ZUludGVyY2VwdG9yOmZ1bmN0aW9uKGUsdCl7InN0cmluZyI9PXR5cGVvZiBlP1QodCk/QihqW2VdLHQpOmRlbGV0ZSBqW2VdOlQoZSkmJkIoTSxlKX19KSxVcj0hMSxxcj0wLFdyPTA7ZnVuY3Rpb24gSHIoZSx0KXtyZXR1cm4gZT1OdW1iZXIoZSksaXNOYU4oZSk/dDplfXZhciBHcj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCx1cHgycHg6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbztpZigwPT09cXImJihuPU12LmdldFN5c3RlbUluZm9TeW5jKCkscj1uLnBsYXRmb3JtLGk9bi5waXhlbFJhdGlvLG89bi53aW5kb3dXaWR0aCxxcj1vLFdyPWksVXI9ImlvcyI9PT1yKSwwPT09KGU9TnVtYmVyKGUpKSlyZXR1cm4gMDt2YXIgYT0kdi5nbG9iYWxTdHlsZXx8JHYud2luZG93fHx7fSxzPUhyKGEucnB4Q2FsY01heERldmljZVdpZHRoLDk2MCksYz1IcihhLnJweENhbGNCYXNlRGV2aWNlV2lkdGgsMzc1KSx1PUhyKGEucnB4Q2FsY0luY2x1ZGVXaWR0aCw3NTApLGw9dHx8cXIsZD1lLzc1MCoobD1lPT09dXx8bDw9cz9sOmMpO3JldHVybiBkPDAmJihkPS1kKSwwPT09KGQ9TWF0aC5mbG9vcihkKzFlLTQpKSYmKGQ9MSE9PVdyJiZVcj8uNToxKSxlPDA/LWQ6ZH19KTtmdW5jdGlvbiBYcihlLHQsbixyKXtUdi5wdWJsaXNoSGFuZGxlcih0KyItYXVkaW8tIitlLHthdWRpb0lkOmUsdHlwZTpuLGRhdGE6cn0sdCl9dmFyIFlyPWZ1bmN0aW9uKGUsdCl7dGhpcy5pZD1lLHRoaXMucGFnZUlkPXR9O1lyLnByb3RvdHlwZS5zZXRTcmM9ZnVuY3Rpb24oZSl7WHIodGhpcy5pZCx0aGlzLnBhZ2VJZCwic2V0U3JjIix7c3JjOmV9KX0sWXIucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXtYcih0aGlzLmlkLHRoaXMucGFnZUlkLCJwbGF5Iil9LFlyLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe1hyKHRoaXMuaWQsdGhpcy5wYWdlSWQsInBhdXNlIil9LFlyLnByb3RvdHlwZS5zZWVrPWZ1bmN0aW9uKGUpe1hyKHRoaXMuaWQsdGhpcy5wYWdlSWQsInNlZWsiLHtwb3NpdGlvbjplfSl9O3ZhciBKcj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjcmVhdGVBdWRpb0NvbnRleHQ6ZnVuY3Rpb24oZSx0KXtpZih0KXJldHVybiBuZXcgWXIoZSx0LiRwYWdlLmlkKTt2YXIgbj1qdigpO2lmKG4uJHJvdXRlJiZuLiRyb3V0ZS5wYXJhbXMuX19pZF9fKXJldHVybiBuZXcgWXIoZSxuLiRyb3V0ZS5wYXJhbXMuX19pZF9fKTtUdi5lbWl0KCJvbkVycm9yIiwiY3JlYXRlQXVkaW9Db250ZXh0OmZhaWwiKX19KSxLcj1uZXcgU3Y7ZnVuY3Rpb24gWnIoZSx0LG4pe3JldHVybiBlW3RdLmFwcGx5KGUsbil9ZnVuY3Rpb24gUXIoKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PUFycmF5KGUpO2UtLTspdFtlXT1hcmd1bWVudHNbZV07cmV0dXJuIFpyKEtyLCIkb24iLFtdLmNvbmNhdCh0KSl9ZnVuY3Rpb24gZWkoKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PUFycmF5KGUpO2UtLTspdFtlXT1hcmd1bWVudHNbZV07cmV0dXJuIFpyKEtyLCIkb2ZmIixbXS5jb25jYXQodCkpfWZ1bmN0aW9uIHRpKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1BcnJheShlKTtlLS07KXRbZV09YXJndW1lbnRzW2VdO3JldHVybiBacihLciwiJG9uY2UiLFtdLmNvbmNhdCh0KSl9ZnVuY3Rpb24gbmkoKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PUFycmF5KGUpO2UtLTspdFtlXT1hcmd1bWVudHNbZV07cmV0dXJuIFpyKEtyLCIkZW1pdCIsW10uY29uY2F0KHQpKX12YXIgcmksaWk9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsJG9uOlFyLCRvZmY6ZWksJG9uY2U6dGksJGVtaXQ6bml9KTtmdW5jdGlvbiBvaSgpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtyZXR1cm4gVHYuaW52b2tlQ2FsbGJhY2tIYW5kbGVyLmFwcGx5KFR2LGUpfWZ1bmN0aW9uIGFpKGUpe3JldHVybiBNdi5yZXF1aXJlTmF0aXZlUGx1Z2luKGUpfWZ1bmN0aW9uIHNpKGUpe2Zvcih2YXIgdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGgtMTswPG4tLTspdFtuXT1hcmd1bWVudHNbbisxXTtyZXR1cm4gVHYuZW1pdC5hcHBseShUdixbImFwaS4iK2VdLmNvbmNhdCh0KSl9dmFyIGNpPUN2Lm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZTtmdW5jdGlvbiB1aShlKXtjaShyaT1lKX1mdW5jdGlvbiBsaShlKXtpZighZSl7dmFyIHQ9THYoKTtpZighdC5sZW5ndGgpcmV0dXJuO2lmKCEoZT10W3QubGVuZ3RoLTFdLiRwYWdlLm1ldGEuc3RhdHVzQmFyU3R5bGUpfHxlPT09cmkpcmV0dXJufWUhPT1yaSYmKHJpPWUsQ3YubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKGUpKX1mdW5jdGlvbiBkaSh0KXtpZih2b2lkIDA9PT10JiYodD0iIiksISR2LnRhYkJhcnx8IUFycmF5LmlzQXJyYXkoJHYudGFiQmFyLmxpc3QpKXJldHVybiExO3RyeXtpZighdCl7dmFyIGU9THYoKTtpZighZS5sZW5ndGgpcmV0dXJuITE7dmFyIG49ZVtlLmxlbmd0aC0xXTtyZXR1cm4hIW4mJm4uJHBhZ2UubWV0YS5pc1RhYkJhcn0vXlwvLy50ZXN0KHQpfHwodD0iLyIrdCk7dmFyIHI9UHYuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXRoPT09dH0pO3JldHVybiByJiZyLm1ldGEuaXNUYWJCYXJ9Y2F0Y2goZSl7fXJldHVybiExfWZ1bmN0aW9uIGZpKGUpe3JldHVybiBOcihlKX1mdW5jdGlvbiBwaShlKXtyZXR1cm4gQnIoZSl9ZnVuY3Rpb24gaGkoZSx0LG4scil7dmFyIGk9ZSh0KTtyZXR1cm4gaSYmaS5lcnJNc2cmJihpLmVyck1zZz1pLmVyck1zZy5yZXBsYWNlKG4scikpLGl9ZnVuY3Rpb24gdmkoZSl7cmV0dXJuIGU/ZS4kZ2V0QXBwV2VidmlldygpOmdpKCl9ZnVuY3Rpb24gZ2koKXt0cnl7dmFyIGU9THYoKTtpZihlLmxlbmd0aClyZXR1cm4gZVtlLmxlbmd0aC0xXS4kZ2V0QXBwV2VidmlldygpfWNhdGNoKGUpe319Q3YubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlPXVpO3ZhciBtaT1mdW5jdGlvbihlLHQpe2lmKDA9PT10LmluZGV4T2YoIi4vIikpcmV0dXJuIG1pKGUsdC5zdWJzdHIoMikpO3ZhciBuLHIsaT10LnNwbGl0KCIvIik7Zm9yKG49MCxyPWkubGVuZ3RoO248ciYmIi4uIj09PWlbbl07bisrKTtpLnNwbGljZSgwLG4pLHQ9aS5qb2luKCIvIik7dmFyIG89MDxlLmxlbmd0aD9lLnNwbGl0KCIvIik6W107cmV0dXJuIG8uc3BsaWNlKG8ubGVuZ3RoLW4tMSxuKzEpLG8uY29uY2F0KGkpLmpvaW4oIi8iKX0seWk9ZnVuY3Rpb24oZSl7cmV0dXJuIEN2LmlvLmNvbnZlcnRMb2NhbEZpbGVTeXN0ZW1VUkwoZSkucmVwbGFjZSgvXlwvP2FwcHNcLy8sIi9hbmRyb2lkX2Fzc2V0L2FwcHMvIikucmVwbGFjZSgvXC8kLywiIil9O2Z1bmN0aW9uIF9pKGUpe2lmKDA9PT1lLmluZGV4T2YoIi8vIikpcmV0dXJuImh0dHBzOiIrZTtpZigvXihbYS16LV0rOik/XC9cLy9pLnRlc3QoZSl8fC9eZGF0YTouKiwuKi8udGVzdChlKSlyZXR1cm4gZTtpZigwPT09ZS5pbmRleE9mKCJfd3d3Iil8fDA9PT1lLmluZGV4T2YoIl9kb2MiKXx8MD09PWUuaW5kZXhPZigiX2RvY3VtZW50cyIpfHwwPT09ZS5pbmRleE9mKCJfZG93bmxvYWRzIikpcmV0dXJuImZpbGU6Ly8iK3lpKGUpO3ZhciB0PSJmaWxlOi8vIit5aSgiX3d3dyIpO2lmKDA9PT1lLmluZGV4T2YoIi8iKSlyZXR1cm4gZS5zdGFydHNXaXRoKCIvc3RvcmFnZS8iKXx8ZS5zdGFydHNXaXRoKCIvc2RjYXJkLyIpfHxlLmluY2x1ZGVzKCIvQ29udGFpbmVycy9EYXRhL0FwcGxpY2F0aW9uLyIpPyJmaWxlOi8vIitlOnQrZTtpZigwPT09ZS5pbmRleE9mKCIuLi8iKXx8MD09PWUuaW5kZXhPZigiLi8iKSl7aWYoInN0cmluZyI9PXR5cGVvZiBfX2lkX18pcmV0dXJuIHQrbWkoIi8iK19faWRfXyxlKTt2YXIgbj1MdigpO2lmKG4ubGVuZ3RoKXJldHVybiB0K21pKCIvIituW24ubGVuZ3RoLTFdLnJvdXRlLGUpfXJldHVybiBlfXZhciBiaT0zLjE0MTU5MjY1MzU4OTc5Myx3aT02Mzc4MjQ1LGtpPS4wMDY2OTM0MjE2MjI5NjU5NDM7dmFyIFNpPWZ1bmN0aW9uKGUsdCl7dmFyIG49MiplLTEwMCszKnQrLjIqdCp0Ky4xKmUqdCsuMipNYXRoLnNxcnQoTWF0aC5hYnMoZSkpO3JldHVybiBuKz0yKigyMCpNYXRoLnNpbig2KmUqYmkpKzIwKk1hdGguc2luKDIqZSpiaSkpLzMsbis9MiooMjAqTWF0aC5zaW4odCpiaSkrNDAqTWF0aC5zaW4odC8zKmJpKSkvMyxuKz0yKigxNjAqTWF0aC5zaW4odC8xMipiaSkrMzIwKk1hdGguc2luKHQqYmkvMzApKS8zfSx4aT1mdW5jdGlvbihlLHQpe3ZhciBuPTMwMCtlKzIqdCsuMSplKmUrLjEqZSp0Ky4xKk1hdGguc3FydChNYXRoLmFicyhlKSk7cmV0dXJuIG4rPTIqKDIwKk1hdGguc2luKDYqZSpiaSkrMjAqTWF0aC5zaW4oMiplKmJpKSkvMyxuKz0yKigyMCpNYXRoLnNpbihlKmJpKSs0MCpNYXRoLnNpbihlLzMqYmkpKS8zLG4rPTIqKDE1MCpNYXRoLnNpbihlLzEyKmJpKSszMDAqTWF0aC5zaW4oZS8zMCpiaSkpLzN9LENpPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU8NzIuMDA0fHwxMzcuODM0NzxlfHx0PC44MjkzfHw1NS44MjcxPHR8fCExfTtmdW5jdGlvbiBUaShlLG4pe3JldHVybiBmdW5jdGlvbih0KXtDdltlXVtuXShmdW5jdGlvbihlKXtlJiYoZGVsZXRlIGUuY29kZSxkZWxldGUgZS5tZXNzYWdlKSxvaSh0LGUpfSl9fWZ1bmN0aW9uIE9pKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe2U9ZXx8e30sb2kodCxPYmplY3QuYXNzaWduKHt9LGUse2Vyck1zZzpuKyI6b2sifSkpfX1mdW5jdGlvbiBFaShhLHMsYyl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PShlPWV8fHt9KS5jb2RlO3ZvaWQgMD09PXQmJih0PTApO3ZhciBuPWUubWVzc2FnZSxyPXt9O2Zvcih2YXIgaSBpbiBlKS0xPT09WyJjb2RlIiwibWVzc2FnZSJdLmluZGV4T2YoaSkmJihyW2ldPWVbaV0pO3ZhciBvPXI7b2koYSxPYmplY3QuYXNzaWduKHt9LHtlcnJNc2c6cysiOmZhaWwgIisobnx8Y3x8IiIpLGVyckNvZGU6dCxjb2RlOnR9LG8pKX19ZnVuY3Rpb24gSWkobixyLGksbyl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7ImZ1bmN0aW9uIj09dHlwZW9mIGkmJihlPWkoZSkpLEN2W25dW3JdKE9iamVjdC5hc3NpZ24oZSx7c3VjY2VzczpmdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSksZGVsZXRlIGUuY29kZSxkZWxldGUgZS5tZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBvJiYoZT1vKGUpKSxvaSh0LE9iamVjdC5hc3NpZ24oe30sZSx7ZXJyTXNnOnIrIjpvayJ9KSl9LGZhaWw6RWkodCxyKX0pKX19ZnVuY3Rpb24gQWkoZSl7dmFyIHQ9ZS5zcGxpdCgiLyIpO3JldHVybiB0W3QubGVuZ3RoLTFdfXZhciAkaSxQaT0icGxheWJhY2siLE1pPXt9LGppPVsicGxheSIsImNhbnBsYXkiLCJlbmRlZCIsInN0b3AiLCJ3YWl0aW5nIiwic2Vla2luZyIsInNlZWtlZCIsInBhdXNlIl0sTGk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9e30pLHNpKCJvbkF1ZGlvU3RhdGVDaGFuZ2UiLE9iamVjdC5hc3NpZ24oe3N0YXRlOmV9LHQpKX07dmFyIEJpPW51bGwsTmk9MjUwLERpPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PXt9KSxzaSgib25CYWNrZ3JvdW5kQXVkaW9TdGF0ZUNoYW5nZSIsT2JqZWN0LmFzc2lnbih7c3RhdGU6ZX0sdCkpfSxSaT1bInBsYXkiLCJwYXVzZSIsImVuZGVkIiwic3RvcCIsImNhbnBsYXkiXTtmdW5jdGlvbiBGaSgpeyRpfHwoKCRpPUN2LmF1ZGlvLmNyZWF0ZVBsYXllcih7YXV0b3BsYXk6ITAsYmFja2dyb3VuZENvbnRyb2w6ITB9KSkuc3JjPSRpLnRpdGxlPSRpLmVwbmFtZT0kaS5zaW5nZXI9JGkuY292ZXJJbWdVcmw9JGkud2ViVXJsPSIiLCRpLnN0YXJ0VGltZT0wLFJpLmZvckVhY2goZnVuY3Rpb24odCl7JGkuYWRkRXZlbnRMaXN0ZW5lcih0LGZ1bmN0aW9uKCl7InBsYXkiPT09dD8oJGkuaXNTdG9wcGVkPSExLHppKCksQmk9SXYoZnVuY3Rpb24oKXtEaSgidGltZVVwZGF0ZSIse30pfSxOaSkpOiJzdG9wIj09PXQmJigkaS5pc1N0b3BwZWQ9ITApLCJwYXVzZSIhPT10JiYiZW5kZWQiIT09dCYmInN0b3AiIT09dHx8emkoKTt2YXIgZT0ib25NdXNpYyIrKHRbMF0udG9VcHBlckNhc2UoKSt0LnN1YnN0cigxKSk7c2koZSx7ZGF0YVVybDokaS5zcmMsZXJyTXNnOmUrIjpvayJ9KSxEaSh0LHtkYXRhVXJsOiRpLnNyY30pfSl9KSwkaS5hZGRFdmVudExpc3RlbmVyKCJ3YWl0aW5nIixmdW5jdGlvbigpe3ppKCksRGkoIndhaXRpbmciLHtkYXRhVXJsOiRpLnNyY30pfSksJGkuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGUpe3ppKCksc2koIm9uTXVzaWNFcnJvciIse2RhdGFVcmw6JGkuc3JjLGVyck1zZzoiRXJyb3I6IitlLm1lc3NhZ2V9KSxEaSgiZXJyb3IiLHtkYXRhVXJsOiRpLnNyYyxlcnJNc2c6ZS5tZXNzYWdlLGVyckNvZGU6ZS5jb2RlfSl9KSwkaS5hZGRFdmVudExpc3RlbmVyKCJwcmV2IixmdW5jdGlvbigpe3JldHVybiBzaSgib25CYWNrZ3JvdW5kQXVkaW9QcmV2Iil9KSwkaS5hZGRFdmVudExpc3RlbmVyKCJuZXh0IixmdW5jdGlvbigpe3JldHVybiBzaSgib25CYWNrZ3JvdW5kQXVkaW9OZXh0Iil9KSl9ZnVuY3Rpb24gemkoKXtudWxsIT09QmkmJkF2KEJpKX1mdW5jdGlvbiBWaShuLGUpe0ZpKCk7dmFyIHI9WyJzcmMiLCJzdGFydFRpbWUiLCJjb3ZlckltZ1VybCIsIndlYlVybCIsInNpbmdlciIsImVwbmFtZSIsInRpdGxlIl07aWYoZSYmInBsYXliYWNrUmF0ZSI9PT1lKXt2YXIgdD1uW2VdOyRpLnBsYXliYWNrUmF0ZSYmJGkucGxheWJhY2tSYXRlKHBhcnNlRmxvYXQodCkpfWVsc2V7dmFyIGk9e307T2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihlKXtpZigwPD1yLmluZGV4T2YoZSkpe3ZhciB0PW5bZV07ZT09PXJbMF0mJnQmJih0PV9pKHQpKSwkaVtlXT1pW2VdPXR9fSksJGkuc2V0U3R5bGVzKGkpfX1mdW5jdGlvbiBVaSgpe3JldHVybiAkaX1mdW5jdGlvbiBxaShlKXt2YXIgdD1lLm9wZXJhdGlvblR5cGUsbj1lLmRhdGFVcmwscj1lLnBvc2l0aW9uLGk9ZS5hcGk7dm9pZCAwPT09aSYmKGk9Im9wZXJhdGVNdXNpY1BsYXllciIpO3ZhciBvPWUudGl0bGUsYT1lLmNvdmVySW1nVXJsLHM9VWkoKTtyZXR1cm4gMDxbInJlc3VtZSIsInBhdXNlIiwic3RvcCJdLmluZGV4T2YodCk/cyYmc1t0XSgpOiJwbGF5Ij09PXQ/KFZpKHtzcmM6bixzdGFydFRpbWU6cix0aXRsZTpvLGNvdmVySW1nVXJsOmF9KSxzLnBsYXkoKSk6InNlZWsiPT09dCYmcyYmcy5zZWVrVG8ocikse2Vyck1zZzppKyI6b2sifX12YXIgV2k9InN1Y2Nlc3MiLEhpPSJmYWlsIixHaT1bV2ksSGksImNvbXBsZXRlIl07ZnVuY3Rpb24gWGkoZSx0LG4scil7aWYoZSl7aWYodm9pZCAwPT09bilyZXR1cm4gZVt0XSgpO3ZhciBpPUtpKG4scilbMV07cmV0dXJuIE9iamVjdC5rZXlzKGkpLmxlbmd0aD9lW3RdKFppKHQsaSkpOmVbdF0oKX19ZnVuY3Rpb24gWWkoZSx0LG4scil7aWYoZSl7dmFyIGk9S2kobixyKSxvPWlbMF0sYT1pWzFdO3JldHVybiBPYmplY3Qua2V5cyhhKS5sZW5ndGg/ZVt0XShvLFppKHQsYSkpOmVbdF0obyl9fWZ1bmN0aW9uIEppKGUsdCl7dmFyIG49ZnVuY3Rpb24gZSh0LG4pe2lmKCF0fHwhbilyZXR1cm47aWYobi5hdHRyJiZuLmF0dHIuaWQ9PT10KXJldHVybiBuO3ZhciByPW4uY2hpbGRyZW47aWYoIXIpcmV0dXJuO2Zvcih2YXIgaT0wLG89ci5sZW5ndGg7aTxvO2krKyl7dmFyIGE9ZSh0LHJbaV0pO2lmKGEpcmV0dXJuIGF9fShlLHQuJGVsKTtyZXR1cm4gbnx8Y29uc29sZS5lcnJvcigiQ2FuIG5vdCBmaW5kIGAiK2UrImAiKX1mdW5jdGlvbiBLaShuLGUpe3ZvaWQgMD09PW4mJihuPXt9KTt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpLHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9bltlXTtDKHQpJiYocltlXT10LGRlbGV0ZSBuW2VdKX07cmV0dXJuIEdpLmZvckVhY2godCksZSYmZS5mb3JFYWNoKHQpLFtuLHJdfWZ1bmN0aW9uIFppKGksbyl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZTtkZWxldGUgZS50eXBlO3ZhciBuPW9bdF07aWYodD09PVdpP2UuZXJyTXNnPWkrIjpvayI6dD09PUhpJiYoZS5lcnJNc2c9aSsiOmZhaWwiKyhlLm1zZz8iICIrZS5tc2c6IiIpKSxkZWxldGUgZS5jb2RlLGRlbGV0ZSBlLm1zZyxDKG4pJiZuKGUpLHQ9PT1XaXx8dD09PUhpKXt2YXIgcj1vLmNvbXBsZXRlO0MocikmJnIoZSl9fX12YXIgUWk9e2dldENlbnRlckxvY2F0aW9uOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFhpKGUsImdldENlbnRlckxvY2F0aW9uIix0KX0sbW92ZVRvTG9jYXRpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gWWkoZSwibW92ZVRvTG9jYXRpb24iLHQpfSx0cmFuc2xhdGVNYXJrZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gWWkoZSwidHJhbnNsYXRlTWFya2VyIix0LFsiYW5pbWF0aW9uRW5kIl0pfSxpbmNsdWRlUG9pbnRzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFlpKGUsImluY2x1ZGVQb2ludHMiLHQpfSxnZXRSZWdpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gWGkoZSwiZ2V0UmVnaW9uIix0KX0sZ2V0U2NhbGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gWGkoZSwiZ2V0U2NhbGUiLHQpfSxhZGRDdXN0b21MYXllcjpmdW5jdGlvbihlLHQpe3JldHVybiBZaShlLCJhZGRDdXN0b21MYXllciIsdCl9LHJlbW92ZUN1c3RvbUxheWVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFlpKGUsInJlbW92ZUN1c3RvbUxheWVyIix0KX0sYWRkR3JvdW5kT3ZlcmxheTpmdW5jdGlvbihlLHQpe3JldHVybiBZaShlLCJhZGRHcm91bmRPdmVybGF5Iix0KX0scmVtb3ZlR3JvdW5kT3ZlcmxheTpmdW5jdGlvbihlLHQpe3JldHVybiBZaShlLCJyZW1vdmVHcm91bmRPdmVybGF5Iix0KX0sdXBkYXRlR3JvdW5kT3ZlcmxheTpmdW5jdGlvbihlLHQpe3JldHVybiBZaShlLCJ1cGRhdGVHcm91bmRPdmVybGF5Iix0KX0saW5pdE1hcmtlckNsdXN0ZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gWWkoZSwiaW5pdE1hcmtlckNsdXN0ZXIiLHQpfSxhZGRNYXJrZXJzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFlpKGUsImFkZE1hcmtlcnMiLHQpfSxyZW1vdmVNYXJrZXJzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFlpKGUsInJlbW92ZU1hcmtlcnMiLHQpfSxtb3ZlQWxvbmc6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gWWkoZSwibW92ZUFsb25nIix0KX0sb3Blbk1hcEFwcDpmdW5jdGlvbihlLHQpe3JldHVybiBZaShlLCJvcGVuTWFwQXBwIix0KX0sb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5vbih0Lm5hbWUsdC5jYWxsYmFjayl9fTt2YXIgZW89e3BsYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIFhpKGUsInBsYXkiKX0scGF1c2U6ZnVuY3Rpb24oZSl7cmV0dXJuIFhpKGUsInBhdXNlIil9LHNlZWs6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gWWkoZSwic2VlayIsdC5wb3NpdGlvbil9LHN0b3A6ZnVuY3Rpb24oZSl7cmV0dXJuIFhpKGUsInN0b3AiKX0sc2VuZERhbm11OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFlpKGUsInNlbmREYW5tdSIsdCl9LHBsYXliYWNrUmF0ZTpmdW5jdGlvbihlLHQpe3JldHVybiBZaShlLCJwbGF5YmFja1JhdGUiLHQucmF0ZSl9LHJlcXVlc3RGdWxsU2NyZWVuOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFlpKGUsInJlcXVlc3RGdWxsU2NyZWVuIix0KX0sZXhpdEZ1bGxTY3JlZW46ZnVuY3Rpb24oZSl7cmV0dXJuIFhpKGUsImV4aXRGdWxsU2NyZWVuIil9LHNob3dTdGF0dXNCYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIFhpKGUsInNob3dTdGF0dXNCYXIiKX0saGlkZVN0YXR1c0JhcjpmdW5jdGlvbihlKXtyZXR1cm4gWGkoZSwiaGlkZVN0YXR1c0JhciIpfX07dmFyIHRvPWZ1bmN0aW9uKGUsdCl7dGhpcy5pZD1lLHRoaXMuY3R4PXR9O2Z1bmN0aW9uIG5vKGUsdCxuLHIpe3ZhciBpPXQuJHBhZ2UuaWQ7VHYucHVibGlzaEhhbmRsZXIoaSsiLWxpdmVwdXNoZXItIitlLHtsaXZlUHVzaGVySWQ6ZSx0eXBlOm4sZGF0YTpyfSxpKX10by5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIFhpKHRoaXMuY3R4LCJzdGFydCIsZSl9LHRvLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKGUpe3JldHVybiBYaSh0aGlzLmN0eCwic3RvcCIsZSl9LHRvLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbihlKXtyZXR1cm4gWGkodGhpcy5jdHgsInBhdXNlIixlKX0sdG8ucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbihlKXtyZXR1cm4gWGkodGhpcy5jdHgsInJlc3VtZSIsZSl9LHRvLnByb3RvdHlwZS5zd2l0Y2hDYW1lcmE9ZnVuY3Rpb24oZSl7cmV0dXJuIFhpKHRoaXMuY3R4LCJzd2l0Y2hDYW1lcmEiLGUpfSx0by5wcm90b3R5cGUuc25hcHNob3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIFhpKHRoaXMuY3R4LCJzbmFwc2hvdCIsZSl9LHRvLnByb3RvdHlwZS50b2dnbGVUb3JjaD1mdW5jdGlvbihlKXtyZXR1cm4gWGkodGhpcy5jdHgsInRvZ2dsZVRvcmNoIixlKX0sdG8ucHJvdG90eXBlLnBsYXlCR009ZnVuY3Rpb24oZSl7cmV0dXJuIFlpKHRoaXMuY3R4LCJwbGF5QkdNIixlKX0sdG8ucHJvdG90eXBlLnN0b3BCR009ZnVuY3Rpb24oZSl7cmV0dXJuIFhpKHRoaXMuY3R4LCJzdG9wQkdNIixlKX0sdG8ucHJvdG90eXBlLnBhdXNlQkdNPWZ1bmN0aW9uKGUpe3JldHVybiBYaSh0aGlzLmN0eCwicGF1c2VCR00iLGUpfSx0by5wcm90b3R5cGUucmVzdW1lQkdNPWZ1bmN0aW9uKGUpe3JldHVybiBYaSh0aGlzLmN0eCwicmVzdW1lQkdNIixlKX0sdG8ucHJvdG90eXBlLnNldEJHTVZvbHVtZT1mdW5jdGlvbihlKXtyZXR1cm4gWWkodGhpcy5jdHgsInNldEJHTVZvbHVtZSIsZSl9LHRvLnByb3RvdHlwZS5zdGFydFByZXZpZXc9ZnVuY3Rpb24oZSl7cmV0dXJuIFhpKHRoaXMuY3R4LCJzdGFydFByZXZpZXciLGUpfSx0by5wcm90b3R5cGUuc3RvcFByZXZpZXc9ZnVuY3Rpb24oZSl7cmV0dXJuIFhpKHRoaXMuY3R4LCJzdG9wUHJldmlldyIsZSl9LFR2LnN1YnNjcmliZSgib25MaXZlUHVzaGVyTWV0aG9kQ2FsbGJhY2siLGZ1bmN0aW9uKGUpe3ZhciB0PWUuY2FsbGJhY2tJZCxuPWUuZGF0YTtJLmludm9rZSh0LG4pfSk7dmFyIHJvPXtzdGFydFByZXZpZXc6InByZXZpZXciLHN0b3BQcmV2aWV3OiJzdG9wIn0saW89ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWUsdGhpcy5wYWdlVm09dH07aW8ucHJvdG90eXBlLm9uPWZ1bmN0aW9uKGUsdCl7bm8odGhpcy5pZCx0aGlzLnBhZ2VWbSwib24iLHtuYW1lOmUsY2FsbGJhY2s6dH0pfSxbInN0YXJ0Iiwic3RvcCIsInBhdXNlIiwicmVzdW1lIiwic3dpdGNoQ2FtZXJhIiwic3RhcnRQcmV2aWV3Iiwic3RvcFByZXZpZXciLCJzbmFwc2hvdCJdLmZvckVhY2goZnVuY3Rpb24ocil7aW8ucHJvdG90eXBlW3JdPUkud2FycChmdW5jdGlvbihlLHQpe2UuY2FsbGJhY2tJZD10O3ZhciBuPXJvW3JdP3JvW3JdOnI7bm8odGhpcy5pZCx0aGlzLnBhZ2VWbSxuLGUpfSl9KTt2YXIgb28sYW89MjAwLHNvPVsidW5rbm93biIsIm5vbmUiLCJldGhlcm5ldCIsIndpZmkiLCIyZyIsIjNnIiwiNGciLCI1ZyJdLGNvPSJfX1VOSUFQUF9NQVAiLHVvPSJfZG9jL3VuaWFwcF90ZW1wIixsbz11bysiXyIrRGF0ZS5ub3coKSxmbz1bXTtmdW5jdGlvbiBwbyhlLHQpe29vPW9vfHxDdi5hY2NlbGVyb21ldGVyLndhdGNoQWNjZWxlcmF0aW9uKGZ1bmN0aW9uKHQpe2ZvLmZvckVhY2goZnVuY3Rpb24oZSl7b2koZSx7eDp0LnhBeGlzLHk6dC55QXhpcyx6OnQuekF4aXN9KX0pfSxmdW5jdGlvbihlKXtvbz1udWxsLG9pKHQse2Vyck1zZzoic3RhcnRBY2NlbGVyb21ldGVyOmZhaWwgIitlLm1lc3NhZ2V9KX0se2ZyZXF1ZW5jeTphb30pLE92KGZ1bmN0aW9uKCl7b2kodCx7ZXJyTXNnOiJzdGFydEFjY2VsZXJvbWV0ZXI6b2sifSl9LGFvKX1mdW5jdGlvbiBobygpe3JldHVybiBvbyYmKEN2LmFjY2VsZXJvbWV0ZXIuY2xlYXJXYXRjaChvbyksb289bnVsbCkse319dmFyIHZvPXtuYW1lOntnaXZlbk5hbWU6ImZpcnN0TmFtZSIsbWlkZGxlTmFtZToibWlkZGxlTmFtZSIsZmFtaWx5TmFtZToibGFzdE5hbWUifSxuaWNrbmFtZToibmlja05hbWUiLHBob3Rvczp7dHlwZToidXJsIix2YWx1ZToicGhvdG9GaWxlUGF0aCJ9LG5vdGU6InJlbWFyayIscGhvbmVOdW1iZXJzOlt7dHlwZToibW9iaWxlIix2YWx1ZToibW9iaWxlUGhvbmVOdW1iZXIifSx7dHlwZToid29yayIsdmFsdWU6IndvcmtQaG9uZU51bWJlciJ9LHt0eXBlOiJjb21wYW55Iix2YWx1ZToiaG9zdE51bWJlciJ9LHt0eXBlOiJob21lIGZheCIsdmFsdWU6ImhvbWVGYXhOdW1iZXIifSx7dHlwZToid29yayBmYXgiLHZhbHVlOiJ3b3JrRmF4TnVtYmVyIn1dLGVtYWlsczpbe3R5cGU6ImhvbWUiLHZhbHVlOiJlbWFpbCJ9XSx1cmxzOlt7dHlwZToib3RoZXIiLHZhbHVlOiJ1cmwifV0sb3JnYW5pemF0aW9uczpbe3R5cGU6ImNvbXBhbnkiLG5hbWU6Im9yZ2FuaXphdGlvbiIsdGl0bGU6InRpdGxlIn1dLGltczpbe3R5cGU6Im90aGVyIix2YWx1ZToid2VDaGF0TnVtYmVyIn1dLGFkZHJlc3Nlczpbe3R5cGU6Im90aGVyIixwcmVmZXJyZWQ6ITAsY291bnRyeToiYWRkcmVzc0NvdW50cnkiLHJlZ2lvbjoiYWRkcmVzc1N0YXRlIixsb2NhbGl0eToiYWRkcmVzc0NpdHkiLHN0cmVldEFkZHJlc3M6ImFkZHJlc3NTdHJlZXQiLHBvc3RhbENvZGU6ImFkZHJlc3NQb3N0YWxDb2RlIn0se3R5cGU6ImhvbWUiLGNvdW50cnk6ImhvbWVBZGRyZXNzQ291bnRyeSIscmVnaW9uOiJob21lQWRkcmVzc1N0YXRlIixsb2NhbGl0eToiaG9tZUFkZHJlc3NDaXR5IixzdHJlZXRBZGRyZXNzOiJob21lQWRkcmVzc1N0cmVldCIscG9zdGFsQ29kZToiaG9tZUFkZHJlc3NQb3N0YWxDb2RlIn0se3R5cGU6ImNvbXBhbnkiLGNvdW50cnk6IndvcmtBZGRyZXNzQ291bnRyeSIscmVnaW9uOiJ3b3JrQWRkcmVzc1N0YXRlIixsb2NhbGl0eToid29ya0FkZHJlc3NDaXR5IixzdHJlZXRBZGRyZXNzOiJ3b3JrQWRkcmVzc1N0cmVldCIscG9zdGFsQ29kZToid29ya0FkZHJlc3NQb3N0YWxDb2RlIn1dfSxnbz1bInR5cGUiLCJwcmVmZXJyZWQiXTt2YXIgbW89VGkoImJsdWV0b290aCIsIm9uQmx1ZXRvb3RoRGV2aWNlRm91bmQiKSx5bz1UaSgiYmx1ZXRvb3RoIiwib25CbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2UiKSxfbz1UaSgiYmx1ZXRvb3RoIiwib25CTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2UiKSxibz1UaSgiYmx1ZXRvb3RoIiwib25CTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlIik7ZnVuY3Rpb24gd28oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUuZGV2aWNlSWQ7dCYmKGUuZGV2aWNlSWQ9dC50b1VwcGVyQ2FzZSgpKTt2YXIgbj1lLnNlcnZpY2VJZDtyZXR1cm4gbiYmKGUuc2VydmljZUlkPW4udG9VcHBlckNhc2UoKSksZX12YXIga28sU289SWkoImJsdWV0b290aCIsIm9wZW5CbHVldG9vdGhBZGFwdGVyIikseG89SWkoImJsdWV0b290aCIsImNsb3NlQmx1ZXRvb3RoQWRhcHRlciIpLENvPUlpKCJibHVldG9vdGgiLCJnZXRCbHVldG9vdGhBZGFwdGVyU3RhdGUiKSxUbz1JaSgiYmx1ZXRvb3RoIiwic3RhcnRCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5Iix3byksT289SWkoImJsdWV0b290aCIsInN0b3BCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5IiksRW89SWkoImJsdWV0b290aCIsImdldEJsdWV0b290aERldmljZXMiKSxJbz1JaSgiYmx1ZXRvb3RoIiwiZ2V0Q29ubmVjdGVkQmx1ZXRvb3RoRGV2aWNlcyIsd28pLEFvPUlpKCJibHVldG9vdGgiLCJjcmVhdGVCTEVDb25uZWN0aW9uIix3byksJG89SWkoImJsdWV0b290aCIsImNsb3NlQkxFQ29ubmVjdGlvbiIsd28pLFBvPUlpKCJibHVldG9vdGgiLCJnZXRCTEVEZXZpY2VTZXJ2aWNlcyIsd28pLE1vPUlpKCJibHVldG9vdGgiLCJnZXRCTEVEZXZpY2VDaGFyYWN0ZXJpc3RpY3MiLHdvKSxqbz1JaSgiYmx1ZXRvb3RoIiwibm90aWZ5QkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZSIsd28pLExvPUlpKCJibHVldG9vdGgiLCJyZWFkQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZSIsd28pLEJvPUlpKCJibHVldG9vdGgiLCJ3cml0ZUJMRUNoYXJhY3RlcmlzdGljVmFsdWUiLHdvKSxObz1JaSgiYmx1ZXRvb3RoIiwic2V0QkxFTVRVIix3byksRG89SWkoImJsdWV0b290aCIsImdldEJMRURldmljZVJTU0kiLHdvKTt2YXIgUm89W107ZnVuY3Rpb24gRm8oZSx0KXtrbz1rb3x8Q3Yub3JpZW50YXRpb24ud2F0Y2hPcmllbnRhdGlvbihmdW5jdGlvbih0KXtSby5mb3JFYWNoKGZ1bmN0aW9uKGUpe29pKGUse2RpcmVjdGlvbjp0Lm1hZ25ldGljSGVhZGluZ30pfSl9LGZ1bmN0aW9uKGUpe2tvPW51bGwsb2kodCx7ZXJyTXNnOiJzdGFydENvbXBhc3M6ZmFpbCAiK2UubWVzc2FnZX0pfSx7ZnJlcXVlbmN5OmFvfSksT3YoZnVuY3Rpb24oKXtvaSh0LHtlcnJNc2c6InN0YXJ0Q29tcGFzczpvayJ9KX0sYW8pfWZ1bmN0aW9uIHpvKCl7cmV0dXJuIGtvJiYoQ3Yub3JpZW50YXRpb24uY2xlYXJXYXRjaChrbyksa289bnVsbCkse319dmFyIFZvPVRpKCJpYmVhY29uIiwib25CZWFjb25VcGRhdGUiKSxVbz1UaSgiaWJlYWNvbiIsIm9uQmVhY29uU2VydmljZUNoYW5nZSIpLHFvPUlpKCJpYmVhY29uIiwiZ2V0QmVhY29ucyIpLFdvPUlpKCJpYmVhY29uIiwic3RhcnRCZWFjb25EaXNjb3ZlcnkiKSxIbz1JaSgiaWJlYWNvbiIsInN0b3BCZWFjb25EaXNjb3ZlcnkiKTt2YXIgR289IkFuZHJvaWQiPT09Q3Yub3MubmFtZSYmcGFyc2VJbnQoQ3Yub3MudmVyc2lvbik8NixYbz1Hbz8ic2xpZGUtaW4tcmlnaHQiOiJwb3AtaW4iLFlvPTMwMCxKbz1Hbz8ic2xpZGUtb3V0LXJpZ2h0IjoicG9wLW91dCIsS289NTAsWm89Il93d3cvX191bmlhcHB2aWV3Lmh0bWwiLFFvPSJmIixlYT0iaSIsdGE9ImUiLG5hPSJ2LXNob3ciLHJhPSJjIixpYT0icyIsb2E9InNjIixhYT17fSxzYT0iV0VCX0lOVk9LRV9BUFBTRVJWSUNFIjtmdW5jdGlvbiBjYShlLHQpe2lmKGU9PT1zYSlyZXR1cm4gc2koc2EsdC5kYXRhLHQud2Vidmlld0lkcyksITA7dmFyIG49YWFbZV07cmV0dXJuISFuJiYobih0KSxuLmtlZXBBbGl2ZXx8ZGVsZXRlIGFhW2VdLCEwKX1mdW5jdGlvbiB1YShlLHQsbil7aWYodm9pZCAwPT09biYmKG49ITApLGFhW2VdKXJldHVybiBjb25zb2xlLndhcm4oIiciK2UrIicgcmVnaXN0ZXJlZDogIithYVtlXS50b1N0cmluZygpKTt0LmtlZXBBbGl2ZT0hIW4sYWFbZV09dH12YXIgbGE9Il9fVU5JQVBQX1NDQU4iLGRhPSJfd3d3L19fdW5pYXBwc2Nhbi5odG1sIixmYT0ic2NhbkNvZGUiO3ZhciBwYSxoYSx2YSxnYSxtYSx5YT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxTQ0FOX0lEOmxhLFNDQU5fUEFUSDpkYSxzY2FuQ29kZTpmdW5jdGlvbihlLHQpe3ZhciBuPWUub25seUZyb21DYW1lcmE7dm9pZCAwPT09biYmKG49ITEpO3ZhciByPWUuc2NhblR5cGUsaT1lLmF1dG9EZWNvZGVDaGFyU2V0LG89Q3YuYmFyY29kZSxhPXtxckNvZGU6W28uUVIsby5BWlRFQyxvLk1BWElDT0RFXSxiYXJDb2RlOltvLkVBTjEzLG8uRUFOOCxvLlVQQ0Esby5VUENFLG8uQ09EQUJBUixvLkNPREUxMjgsby5DT0RFMzksby5DT0RFOTMsby5JVEYsby5SU1MxNCxvLlJTU0VYUEFOREVEXSxkYXRhbWF0cml4OltvLkRBVEFNQVRSSVhdLHBkZjQxNzpbby5QREY0MTddfSxzPXt9O3Nbby5RUl09IlFSX0NPREUiLHNbby5FQU4xM109IkVBTl8xMyIsc1tvLkVBTjhdPSJFQU5fOCIsc1tvLkRBVEFNQVRSSVhdPSJEQVRBX01BVFJJWCIsc1tvLlVQQ0FdPSJVUENfQSIsc1tvLlVQQ0VdPSJVUENfRSIsc1tvLkNPREFCQVJdPSJDT0RBQkFSIixzW28uQ09ERTM5XT0iQ09ERV8zOSIsc1tvLkNPREU5M109IkNPREVfOTMiLHNbby5DT0RFMTI4XT0iQ09ERV8xMjgiLHNbby5JVEZdPSJDT0RFXzI1IixzW28uUERGNDE3XT0iUERGXzQxNyIsc1tvLkFaVEVDXT0iQVpURUMiLHNbby5SU1MxNF09IlJTU18xNCIsc1tvLlJTU0VYUEFOREVEXT0iUlNTRVhQQU5ERUQiO3ZhciBjLHUsbD0ibGlnaHQiIT09KCJVSVN0YXR1c0JhclN0eWxlQmxhY2tUcmFuc2x1Y2VudCI9PT0oYz1Ddi5uYXZpZ2F0b3IuZ2V0U3RhdHVzQmFyU3R5bGUoKSl8fCJVSVN0YXR1c0JhclN0eWxlQmxhY2tPcGFxdWUiPT09Y3x8Im51bGwiPT09Yz9jPSJsaWdodCI6IlVJU3RhdHVzQmFyU3R5bGVEZWZhdWx0Ij09PWMmJihjPSJkYXJrIiksYyksZD1bXTtBcnJheS5pc0FycmF5KHIpJiZyLmxlbmd0aCYmci5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWFbZV07dCYmKGQ9ZC5jb25jYXQodCkpfSksZC5sZW5ndGh8fChkPWQuY29uY2F0KGEucXJDb2RlKS5jb25jYXQoYS5iYXJDb2RlKS5jb25jYXQoYS5kYXRhbWF0cml4KS5jb25jYXQoYS5wZGY0MTcpKTt2YXIgZj1bXTtufHxmLnB1c2goe2Zsb2F0OiJyaWdodCIsdGV4dDpRZSgidW5pLnNjYW5Db2RlLmFsYnVtIiksZm9udFNpemU6IjE3cHgiLHdpZHRoOiI2MHB4IixvbmNsaWNrOmZ1bmN0aW9uKCl7Q3YuZ2FsbGVyeS5waWNrKGZ1bmN0aW9uKGUpe28uc2NhbihlLGZ1bmN0aW9uKGUsdCxuLHIpe2wmJkN2Lm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpLHU9e3R5cGU6ZSxjb2RlOnQsY2hhclNldDpyfSxwLmNsb3NlKCJhdXRvIil9LGZ1bmN0aW9uKCl7Q3YubmF0aXZlVUkudG9hc3QoUWUoInVuaS5zY2FuQ29kZS5mYWlsIikpfSxkLGkpfSxmdW5jdGlvbihlKXtlLmNvZGUhPT0oIkFuZHJvaWQiPT09Q3Yub3MubmFtZT8xMjotMikmJkN2Lm5hdGl2ZVVJLnRvYXN0KFFlKCJ1bmkuc2NhbkNvZGUuZmFpbCIpKX0se211bHRpcGxlOiExLHN5c3RlbTohMSxmaWxlbmFtZTpsbysiL2dhbGxlcnkvIixwZXJtaXNzaW9uQWxlcnQ6ITB9KX19KTt2YXIgcD1Ddi53ZWJ2aWV3LmNyZWF0ZShkYSxsYSx7dGl0bGVOVmlldzp7YXV0b0JhY2tCdXR0b246ITAsdHlwZToiZmxvYXQiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSIsdGl0bGVDb2xvcjoiI2ZmZmZmZiIsdGl0bGVUZXh0OlFlKCJ1bmkuc2NhbkNvZGUudGl0bGUiKSx0aXRsZVNpemU6IjE3cHgiLGJ1dHRvbnM6Zn0scG9wR2VzdHVyZToiY2xvc2UiLGJhY2tCdXR0b25BdXRvQ29udHJvbDoiY2xvc2UifSx7X191bmlhcHBfdHlwZToic2NhbiIsX191bmlhcHBfZGFyazpsLF9fdW5pYXBwX3NjYW5fdHlwZTpkLF9fdW5pYXBwX2F1dG9fZGVjb2RlX2NoYXJfc2V0OmksX191bmlhcHBfbG9jYWxlOmV0KCksInVuaS1hcHAiOiJub25lIn0pLGg9Q3YubmF0aXZlVUkuc2hvd1dhaXRpbmcoKTtwLmFkZEV2ZW50TGlzdGVuZXIoInRpdGxlVXBkYXRlIixmdW5jdGlvbigpe3Auc2hvdyhYbyxZbyxmdW5jdGlvbigpe2guY2xvc2UoKX0pfSkscC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsZnVuY3Rpb24oKXtvaSh0LHU/e3Jlc3VsdDp1LmNvZGUsc2NhblR5cGU6c1t1LnR5cGVdfHwiIixjaGFyU2V0OnUuY2hhclNldHx8InV0ZjgiLHBhdGg6IiIsZXJyTXNnOiJzY2FuQ29kZTpvayJ9OntlcnJNc2c6InNjYW5Db2RlOmZhaWwgY2FuY2VsIn0pLGNhKGZhKX0pLGwmJihDdi5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0IikscC5hZGRFdmVudExpc3RlbmVyKCJwb3BHZXN0dXJlIixmdW5jdGlvbihlKXt2YXIgdD1lLnR5cGUsbj1lLnJlc3VsdDsic3RhcnQiPT09dD9Ddi5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKToiZW5kIiE9PXR8fG58fEN2Lm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgibGlnaHQiKX0pKSx1YShmYSxmdW5jdGlvbihlKXtlJiYiY29kZSJpbiBlJiYodT1lKX0sITEpfX0pO2Z1bmN0aW9uIF9hKCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJiJvYmplY3QiPT10eXBlb2YgbmF2aWdhdG9yJiYib2JqZWN0Ij09dHlwZW9mIGRvY3VtZW50PyJ3ZWJ2aWV3IjoidjgifWZ1bmN0aW9uIGJhKCl7cmV0dXJuIHBhLndlYnZpZXcuY3VycmVudFdlYnZpZXcoKS5pZH12YXIgd2E9e307ZnVuY3Rpb24ga2EoZSl7dmFyIHQ9ZS5kYXRhJiZlLmRhdGEuX19tZXNzYWdlO2lmKHQmJnQuX19wYWdlKXt2YXIgbj10Ll9fcGFnZSxyPXdhW25dO3ImJnIodCksdC5rZWVwfHxkZWxldGUgd2Fbbl19fXZhciBTYT1mdW5jdGlvbihlKXt0aGlzLndlYnZpZXc9ZX07ZnVuY3Rpb24geGEoZSl7dmFyIHQ9ZS5jb250ZXh0O3ZvaWQgMD09PXQmJih0PXt9KTt2YXIgbj1lLnVybCxyPWUuZGF0YTt2b2lkIDA9PT1yJiYocj17fSk7dmFyIGk9ZS5zdHlsZTt2b2lkIDA9PT1pJiYoaT17fSk7dmFyIG89ZS5vbk1lc3NhZ2UsYT1lLm9uQ2xvc2U7cGE9dC5wbHVzfHxDdixoYT10LndlZXh8fCgib2JqZWN0Ij09dHlwZW9mIHh2P3h2Om51bGwpLHZhPXQuQnJvYWRjYXN0Q2hhbm5lbHx8KCJvYmplY3QiPT10eXBlb2YgQnJvYWRjYXN0Q2hhbm5lbD9Ccm9hZGNhc3RDaGFubmVsOm51bGwpO3ZhciBzPSJwYWdlIitEYXRlLm5vdygpOyExIT09KGk9T2JqZWN0LmFzc2lnbih7fSxpKSkudGl0bGVOVmlldyYmIm5vbmUiIT09aS50aXRsZU5WaWV3JiYoaS50aXRsZU5WaWV3PU9iamVjdC5hc3NpZ24oe2F1dG9CYWNrQnV0dG9uOiEwLHRpdGxlU2l6ZToiMTdweCJ9LGkudGl0bGVOVmlldykpO3ZhciBjPXt0b3A6MCxib3R0b206MCx1c2luZ0NvbXBvbmVudHM6e30scG9wR2VzdHVyZToiY2xvc2UiLHNjcm9sbEluZGljYXRvcjoibm9uZSIsYW5pbWF0aW9uVHlwZToicG9wLWluIixhbmltYXRpb25EdXJhdGlvbjoyMDAsdW5pTlZpZXc6e3BhdGg6KCJzdHJpbmciPT10eXBlb2YgVlVFX0FQUF9URU1QTEFURV9QQVRIP1ZVRV9BUFBfVEVNUExBVEVfUEFUSDoiIikrIi8iK24rIi5qcyIsZGVmYXVsdEZvbnRTaXplOjE2LHZpZXdwb3J0OnBhLnNjcmVlbi5yZXNvbHV0aW9uV2lkdGh9fTtpPU9iamVjdC5hc3NpZ24oYyxpKTt2YXIgdSxsLGQ9cGEud2Vidmlldy5jcmVhdGUoIiIscyxpLHtleHRyYXM6e2Zyb206YmEoKSxydW50aW1lOl9hKCksZGF0YTpyLHVzZUdsb2JhbEV2ZW50OiF2YX19KTtyZXR1cm4gZC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsYSksdT1zLGw9ZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oZS5kYXRhKSxlLmtlZXB8fGQuY2xvc2UoImF1dG8iKX0sInY4Ij09PV9hKCk/dmE/KGdhJiZnYS5jbG9zZSgpLChnYT1uZXcgdmEoYmEoKSkpLm9ubWVzc2FnZT1rYSk6bWF8fChtYT1oYS5yZXF1aXJlTW9kdWxlKCJnbG9iYWxFdmVudCIpKS5hZGRFdmVudExpc3RlbmVyKCJwbHVzTWVzc2FnZSIsa2EpOndpbmRvdy5fX3BsdXNNZXNzYWdlPWthLHdhW3VdPWwsZC5zaG93KGkuYW5pbWF0aW9uVHlwZSxpLmFuaW1hdGlvbkR1cmF0aW9uKSxuZXcgU2EoZCl9U2EucHJvdG90eXBlLnNlbmRNZXNzYWdlPWZ1bmN0aW9uKGUpe3ZhciB0PUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoe19fbWVzc2FnZTp7ZGF0YTplfX0pKSxuPXRoaXMud2Vidmlldy5pZDt2YT9uZXcgdmEobikucG9zdE1lc3NhZ2UodCk6cGEud2Vidmlldy5wb3N0TWVzc2FnZVRvVW5pTlZpZXcodCxuKX0sU2EucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dGhpcy53ZWJ2aWV3LmNsb3NlKCl9O3ZhciBDYT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxzY2FuQ29kZTpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT0ibGlnaHQiIT09KCJVSVN0YXR1c0JhclN0eWxlQmxhY2tUcmFuc2x1Y2VudCI9PT0obj1Ddi5uYXZpZ2F0b3IuZ2V0U3RhdHVzQmFyU3R5bGUoKSl8fCJVSVN0YXR1c0JhclN0eWxlQmxhY2tPcGFxdWUiPT09bnx8Im51bGwiPT09bj9uPSJsaWdodCI6IlVJU3RhdHVzQmFyU3R5bGVEZWZhdWx0Ij09PW4mJihuPSJkYXJrIiksbiksbz14YSh7dXJsOiJfX3VuaWFwcHNjYW4iLGRhdGE6T2JqZWN0LmFzc2lnbih7fSxlLHttZXNzYWdlczp7ZmFpbDpRZSgidW5pLnNjYW5Db2RlLmZhaWwiKSwiZmxhc2gub24iOlFlKCJ1bmkuc2NhbkNvZGUuZmxhc2gub24iKSwiZmxhc2gub2ZmIjpRZSgidW5pLnNjYW5Db2RlLmZsYXNoLm9mZiIpfX0pLHN0eWxlOnthbmltYXRpb25UeXBlOmUuYW5pbWF0aW9uVHlwZXx8InBvcC1pbiIsdGl0bGVOVmlldzp7YXV0b0JhY2tCdXR0b246ITAsdHlwZToiZmxvYXQiLHRpdGxlVGV4dDplLnRpdGxlVGV4dHx8UWUoInVuaS5zY2FuQ29kZS50aXRsZSIpLHRpdGxlQ29sb3I6IiNmZmZmZmYiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSIsYnV0dG9uczplLm9ubHlGcm9tQ2FtZXJhP1tdOlt7dGV4dDplLmFsYnVtVGV4dHx8UWUoInVuaS5zY2FuQ29kZS5hbGJ1bSIpLGZvbnRTaXplOiIxN3B4Iix3aWR0aDoiNjBweCIsb25jbGljazpmdW5jdGlvbigpe28uc2VuZE1lc3NhZ2Uoe3R5cGU6ImdhbGxlcnkifSl9fV19LHBvcEdlc3R1cmU6ImNsb3NlIixiYWNrZ3JvdW5kOiIjMDAwMDAwIixiYWNrQnV0dG9uQXV0b0NvbnRyb2w6ImNsb3NlIn0sb25NZXNzYWdlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZXZlbnQsbj1lLmRldGFpbDsocj1uKS5lcnJNc2c9Im1hcmtlZCI9PT10PyJzY2FuQ29kZTpvayI6InNjYW5Db2RlOmZhaWwgIituLm1lc3NhZ2V9LG9uQ2xvc2U6ZnVuY3Rpb24oKXtpJiZDdi5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKSxvaSh0LHJ8fHtlcnJNc2c6InNjYW5Db2RlOmZhaWwgY2FuY2VsIn0pfX0pO2kmJihDdi5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0Iiksby53ZWJ2aWV3LmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZSxuPWUucmVzdWx0OyJzdGFydCI9PT10P0N2Lm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpOiJlbmQiIT09dHx8bnx8Q3YubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJsaWdodCIpfSkpfX0pO2Z1bmN0aW9uIFRhKCl7aWYoImlvcyIhPT1Ddi5vcy5uYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuITE7dmFyIGU9YWkoImZhY2VJRCIpO3JldHVybiEoIWV8fCFlLmlzU3VwcG9ydCgpKX1mdW5jdGlvbiBPYSgpe3JldHVybiEoIUN2LmZpbmdlcnByaW50fHwhQ3YuZmluZ2VycHJpbnQuaXNTdXBwb3J0KCkpfWZ1bmN0aW9uIEVhKCl7dmFyIGU9W107cmV0dXJuIE9hKCkmJmUucHVzaCgiZmluZ2VyUHJpbnQiKSxUYSgpJiZlLnB1c2goImZhY2lhbCIpLHtzdXBwb3J0TW9kZTplLGVyck1zZzoiY2hlY2tJc1N1cHBvcnRTb3RlckF1dGhlbnRpY2F0aW9uOm9rIn19ZnVuY3Rpb24gSWEoZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUuY2hlY2tBdXRoTW9kZTtpZigiZmluZ2VyUHJpbnQiPT09dClyZXR1cm4gT2EoKT97aXNFbnJvbGxlZDpDdi5maW5nZXJwcmludC5pc0tleWd1YXJkU2VjdXJlKCkmJkN2LmZpbmdlcnByaW50LmlzRW5yb2xsZWRGaW5nZXJwcmludHMoKSxlcnJNc2c6ImNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6b2sifTp7aXNFbnJvbGxlZDohMSxlcnJNc2c6ImNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6ZmFpbCBub3Qgc3VwcG9ydCJ9O2lmKCJmYWNpYWwiPT09dCl7aWYoVGEoKSl7dmFyIG49YWkoImZhY2VJRCIpO3JldHVybntpc0Vucm9sbGVkOm4mJm4uaXNLZXlndWFyZFNlY3VyZSgpJiZuLmlzRW5yb2xsZWRGYWNlSUQoKSxlcnJNc2c6ImNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6b2sifX1yZXR1cm57aXNFbnJvbGxlZDohMSxlcnJNc2c6ImNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6ZmFpbCBub3Qgc3VwcG9ydCJ9fXJldHVybntpc0Vucm9sbGVkOiExLGVyck1zZzoiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZTpmYWlsIG5vdCBzdXBwb3J0In19dmFyIEFhLCRhLFBhPSEwO3ZhciBNYSxqYT1bXSxMYT17aWQ6IjAiLGluaXQ6ZnVuY3Rpb24oZSxuKXtlJiZlLmxpc3QubGVuZ3RoJiYoQWE9ZSk7dHJ5eyRhPWFpKCJ1bmktdGFidmlldyIpfWNhdGNoKGUpe2NvbnNvbGUubG9nKCd1bmkucmVxdWlyZU5hdGl2ZVBsdWdpbigidW5pLXRhYnZpZXciKSBlcnJvciAnK2UpfSRhLm9uTWFza0NsaWNrKGZ1bmN0aW9uKCl7amEuZm9yRWFjaChmdW5jdGlvbihlKXtlKCl9KX0pLCRhJiYkYS5vbkNsaWNrKGZ1bmN0aW9uKGUpe3ZhciB0PWUuaW5kZXg7bihBYS5saXN0W3RdLHQpfSksJGEmJiRhLm9uTWlkQnV0dG9uQ2xpY2soZnVuY3Rpb24oKXtzaSgib25UYWJCYXJNaWRCdXR0b25UYXAiLHt9KX0pfSxpbmRleE9mOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuY29uZmlnLG49dCYmdC5saXN0JiZ0Lmxpc3QubGVuZ3RoO2lmKG4pZm9yKHZhciByPTA7cjxuO3IrKylpZih0Lmxpc3Rbcl0ucGFnZVBhdGg9PT1lfHx0Lmxpc3Rbcl0ucGFnZVBhdGg9PT1lKyIuaHRtbCIpcmV0dXJuIHI7cmV0dXJuLTF9LHN3aXRjaFRhYjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmluZGV4T2YoZSk7cmV0dXJuIDA8PXQmJigkYSYmJGEuc3dpdGNoU2VsZWN0KHtpbmRleDp0fSksITApfSxzZXRUYWJCYXJCYWRnZTpmdW5jdGlvbihlLHQsbil7JGEmJigibm9uZSI9PT1lPygkYS5oaWRlVGFiQmFyUmVkRG90KHtpbmRleDp0fSksJGEucmVtb3ZlVGFiQmFyQmFkZ2Uoe2luZGV4OnR9KSk6InRleHQiPT09ZT8kYS5zZXRUYWJCYXJCYWRnZSh7aW5kZXg6dCx0ZXh0Om59KToicmVkRG90Ij09PWUmJiRhLnNob3dUYWJCYXJSZWREb3Qoe2luZGV4OnR9KSl9LHNldFRhYkJhckl0ZW06ZnVuY3Rpb24oZSx0LG4scixpLG8pe3ZhciBhPXtpbmRleDplfTtpZih2b2lkIDAhPT10JiYoYS50ZXh0PXQpLG4mJihhLmljb25QYXRoPV9pKG4pKSxyJiYoYS5zZWxlY3RlZEljb25QYXRoPV9pKHIpKSx2b2lkIDAhPT1vJiYoYS5pY29uZm9udD1vKSx2b2lkIDAhPT1pKXthLnZpc2libGU9QWEubGlzdFtlXS52aXNpYmxlPWksZGVsZXRlIGEuaW5kZXg7dmFyIHM9QWEubGlzdC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJue3Zpc2libGU6ZS52aXNpYmxlfX0pO3NbZV09YSwkYSYmJGEuc2V0VGFiQmFySXRlbXMoe2xpc3Q6c30pfWVsc2UgJGEmJiRhLnNldFRhYkJhckl0ZW0oYSl9LHNldFRhYkJhclN0eWxlOmZ1bmN0aW9uKGUpeyRhJiYkYS5zZXRUYWJCYXJTdHlsZShlKX0saGlkZVRhYkJhcjpmdW5jdGlvbihlKXtQYT0hMSwkYSYmJGEuaGlkZVRhYkJhcih7YW5pbWF0aW9uOmV9KX0sc2hvd1RhYkJhcjpmdW5jdGlvbihlKXtQYT0hMCwkYSYmJGEuc2hvd1RhYkJhcih7YW5pbWF0aW9uOmV9KX0sYXBwZW5kOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXM7JGEmJiRhLmFwcGVuZCh7aWQ6dC5pZH0sZnVuY3Rpb24oZSl7MCE9PWUuY29kZSYmT3YoZnVuY3Rpb24oKXtuLmFwcGVuZCh0KX0sMjApfSl9LGdldCBjb25maWcoKXtyZXR1cm4gQWF8fCR2LnRhYkJhcn0sZ2V0IHZpc2libGUoKXtyZXR1cm4gUGF9LGdldCBoZWlnaHQoKXt2YXIgZT10aGlzLmNvbmZpZztyZXR1cm4oZSYmZS5oZWlnaHQ/cGFyc2VGbG9hdChlLmhlaWdodCk6NTApK0N2Lm5hdmlnYXRvci5nZXRTYWZlQXJlYUluc2V0cygpLmRldmljZUJvdHRvbX0sZ2V0IGNvdmVyKCl7dmFyIGU9dGhpcy5jb25maWc7cmV0dXJuIGUmJjA8PVsiZXh0cmFsaWdodCIsImxpZ2h0IiwiZGFyayJdLmluZGV4T2YoZS5ibHVyRWZmZWN0KX0sc2V0U3R5bGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tYXNrOyRhLnNldE1hc2soe2NvbG9yOnR9KX0sYWRkRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihlLHQpe2phLnB1c2godCl9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj1qYS5pbmRleE9mKHQpO2phLnNwbGljZShuLDEpfX07ZnVuY3Rpb24gQmEoKXtyZXR1cm4gQ3YubmF2aWdhdG9yLmlzSW1tZXJzZWRTdGF0dXNiYXIoKT9NYXRoLnJvdW5kKCJpT1MiPT09Q3Yub3MubmFtZT9Ddi5uYXZpZ2F0b3IuZ2V0U2FmZUFyZWFJbnNldHMoKS50b3A6Q3YubmF2aWdhdG9yLmdldFN0YXR1c2JhckhlaWdodCgpKTowfWZ1bmN0aW9uIE5hKCl7dmFyIGUsdCxuLHIsaT0iaW9zIj09PUN2Lm9zLm5hbWUudG9Mb3dlckNhc2UoKSxvPShlPUN2LnNjcmVlbi5nZXRDdXJyZW50U2l6ZSgpLHQ9ZS5yZXNvbHV0aW9uV2lkdGgsbj1lLnJlc29sdXRpb25IZWlnaHQse3NjcmVlbldpZHRoOk1hdGgucm91bmQodCksc2NyZWVuSGVpZ2h0Ok1hdGgucm91bmQobil9KSxhPW8uc2NyZWVuV2lkdGgscz1vLnNjcmVlbkhlaWdodCxjPUJhKCksdT17aGVpZ2h0OjAsY292ZXI6ITF9LGw9Z2koKTtpZihsKXt2YXIgZD1sLmdldFN0eWxlKCk7KGQ9ZCYmZC50aXRsZU5WaWV3KSYmZC50eXBlJiYibm9uZSIhPT1kLnR5cGUmJih1LmhlaWdodD0idHJhbnNwYXJlbnQiPT09ZC50eXBlPzA6YytZZSx1LmNvdmVyPSJ0cmFuc3BhcmVudCI9PT1kLnR5cGV8fCJmbG9hdCI9PT1kLnR5cGUpLHI9bC5nZXRTYWZlQXJlYUluc2V0cygpfWVsc2Ugcj1Ddi5uYXZpZ2F0b3IuZ2V0U2FmZUFyZWFJbnNldHMoKTt2YXIgZj17aGVpZ2h0OjAsY292ZXI6ITF9O2RpKCkmJihmLmhlaWdodD1MYS52aXNpYmxlP0xhLmhlaWdodDowLGYuY292ZXI9TGEuY292ZXIpO3ZhciBwPXUuY292ZXI/dS5oZWlnaHQ6MCxoPWYuY292ZXI/Zi5oZWlnaHQ6MCx2PXMtdS5oZWlnaHQtZi5oZWlnaHQsZz1zLSh1LmNvdmVyPzA6dS5oZWlnaHQpLShmLmNvdmVyPzA6Zi5oZWlnaHQpLG09YTtmLmhlaWdodCYmIWYuY292ZXJ8fHIuYm90dG9tfHwhci5kZXZpY2VCb3R0b218fCh2LT1yLmRldmljZUJvdHRvbSxnLT1yLmRldmljZUJvdHRvbSk7dmFyIHk9e2xlZnQ6KHI9aT9yOntsZWZ0OjAscmlnaHQ6MCx0b3A6dS5oZWlnaHQmJiF1LmNvdmVyPzA6Yyxib3R0b206MH0pLmxlZnQscmlnaHQ6bS1yLnJpZ2h0LHRvcDpyLnRvcCxib3R0b206Zy1yLmJvdHRvbSx3aWR0aDptLXIubGVmdC1yLnJpZ2h0LGhlaWdodDpnLXIudG9wLXIuYm90dG9tfTtyZXR1cm57cGl4ZWxSYXRpbzpDdi5zY3JlZW4uc2NhbGUsc2NyZWVuV2lkdGg6YSxzY3JlZW5IZWlnaHQ6cyx3aW5kb3dXaWR0aDptLHdpbmRvd0hlaWdodDp2LHN0YXR1c0JhckhlaWdodDpjLHNhZmVBcmVhOnksc2FmZUFyZWFJbnNldHM6e3RvcDpyLnRvcCxyaWdodDpyLnJpZ2h0LGJvdHRvbTpyLmJvdHRvbSxsZWZ0OnIubGVmdH0sd2luZG93VG9wOnAsd2luZG93Qm90dG9tOmgsc2NyZWVuVG9wOnMtdn19dmFyIERhPXt9LFJhPSEwO2Z1bmN0aW9uIEZhKCl7aWYoUmEpe3ZhciBlPXh2LnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRTeXN0ZW1JbmZvU3luYztpZigic3RyaW5nIj09dHlwZW9mKERhPWUoKSkpdHJ5e0RhPUpTT04ucGFyc2UoRGEpfWNhdGNoKGUpe319fWZ1bmN0aW9uIHphKCl7RmEoKTt2YXIgZT1EYS5kZXZpY2VCcmFuZDt2b2lkIDA9PT1lJiYoZT0iIik7dmFyIHQ9RGEuZGV2aWNlTW9kZWwsbj1EYS5vc05hbWUscj1EYS5vc1ZlcnNpb24saT1EYS5kZXZpY2VPcmllbnRhdGlvbixvPURhLmRldmljZVR5cGUsYT1lLnRvTG93ZXJDYXNlKCkscz1uLnRvTG93ZXJDYXNlKCk7cmV0dXJue2JyYW5kOmEsZGV2aWNlQnJhbmQ6YSxkZXZpY2VNb2RlbDp0LGRldmljZVBpeGVsUmF0aW86Q3Yuc2NyZWVuLnNjYWxlLGRldmljZUlkOk1hPU1hfHxDdi5kZXZpY2UudXVpZCxkZXZpY2VPcmllbnRhdGlvbjppLGRldmljZVR5cGU6byxtb2RlbDp0LHBsYXRmb3JtOnMsc3lzdGVtOigiaW9zIj09PXM/ImlPUyI6IkFuZHJvaWQiKSsiICIrcn19ZnVuY3Rpb24gVmEoKXtGYSgpO3ZhciBlPURhLmhvc3RQYWNrYWdlTmFtZSx0PURhLmhvc3ROYW1lLG49RGEub3NMYW5ndWFnZSxyPURhLmhvc3RWZXJzaW9uLGk9RGEuaG9zdExhbmd1YWdlLG89RGEuaG9zdFRoZW1lO3JldHVybnthcHBJZDpEYS5hcHBJZCxhcHBOYW1lOkRhLmFwcE5hbWUsYXBwVmVyc2lvbjpEYS5hcHBWZXJzaW9uLGFwcFZlcnNpb25Db2RlOkRhLmFwcFZlcnNpb25Db2RlLGFwcFdndFZlcnNpb246RGEuYXBwV2d0VmVyc2lvbixhcHBMYW5ndWFnZTpNdiYmTXYuZ2V0TG9jYWxlP012LmdldExvY2FsZSgpOmksZW5hYmxlRGVidWc6ITEsaG9zdFNES1ZlcnNpb246dm9pZCAwLGhvc3RQYWNrYWdlTmFtZTplLGhvc3ROYW1lOnQsaG9zdFZlcnNpb246cixob3N0TGFuZ3VhZ2U6aSxob3N0VGhlbWU6byxob3N0Rm9udFNpemVTZXR0aW5nOnZvaWQgMCxsYW5ndWFnZTpuLFNES1ZlcnNpb246IiIsdGhlbWU6dm9pZCAwLHZlcnNpb246Q3YucnVudGltZS5pbm5lclZlcnNpb259fWZ1bmN0aW9uIFVhKCl7UmE9ITAsRmEoKSxSYT0hMTt2YXIgZT1OYSgpLHQ9emEoKSxuPVZhKCk7UmE9ITA7dmFyIHI9e2Vyck1zZzoiZ2V0U3lzdGVtSW5mbzpvayIsZm9udFNpemVTZXR0aW5nOm4uaG9zdEZvbnRTaXplU2V0dGluZyxvc05hbWU6RGEub3NOYW1lLnRvTG93ZXJDYXNlKCl9O0RhLmhvc3ROYW1lJiYoci5ob3N0U0RLVmVyc2lvbj1EYS51bmlSdW50aW1lVmVyc2lvbik7dmFyIGksbyxhPU9iamVjdC5hc3NpZ24oe30sRGEsZSx0LG4scik7cmV0dXJuIGRlbGV0ZSBhLnNjcmVlblRvcCxkZWxldGUgYS5lbmFibGVEZWJ1ZyxkZWxldGUgYS50aGVtZSxvPXt9LFQoaT1hKSYmT2JqZWN0LmtleXMoaSkuc29ydCgpLmZvckVhY2goZnVuY3Rpb24oZSl7b1tlXT1pW2VdfSksT2JqZWN0LmtleXMobyk/bzppfWZ1bmN0aW9uIHFhKCl7dmFyIGU9KDAseHYucmVxdWlyZU1vZHVsZSgicGx1cyIpLmdldEFwcEF1dGhvcml6ZVNldHRpbmcpKCk7dHJ5eyJzdHJpbmciPT10eXBlb2YgZSYmKGU9SlNPTi5wYXJzZShlKSl9Y2F0Y2goZSl7fWZvcih2YXIgdCBpbiBlKXtpZihPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpKSJ1bmRlZmluZWQiPT09ZVt0XSYmKGVbdF09dm9pZCAwKX1yZXR1cm4gZX12YXIgV2E9InVuaWFwcF9zYXZlIixIYT0iX2RvYy8iK1dhO2Z1bmN0aW9uIEdhKHQsbil7bj1ufHxmdW5jdGlvbigpe30sQ3YuaW8ucmVxdWVzdEZpbGVTeXN0ZW0oQ3YuaW8uUFJJVkFURV9ET0MsZnVuY3Rpb24oZSl7ZS5yb290LmdldERpcmVjdG9yeShXYSx7Y3JlYXRlOiEwfSx0LG4pfSxuKX12YXIgWGE9MDt2YXIgWWE9SWkoImlvIiwiZ2V0RmlsZUluZm8iKTt2YXIgSmE9ImNob29zZUxvY2F0aW9uIjt2YXIgS2E9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY2hvb3NlTG9jYXRpb246ZnVuY3Rpb24oZSx0KXt2YXIgbj1Ddi5uYXZpZ2F0b3IuZ2V0U3RhdHVzQmFyU3R5bGUoKSxyPUN2LndlYnZpZXcuY3JlYXRlKCJfd3d3L19fdW5pYXBwY2hvb3NlbG9jYXRpb24uaHRtbCIsY28se3RpdGxlTlZpZXc6e2F1dG9CYWNrQnV0dG9uOiEwLGJhY2tncm91bmRDb2xvcjoiIzAwMDAwMCIsdGl0bGVDb2xvcjoiI2ZmZmZmZiIsdGl0bGVUZXh0OiLpgInmi6nkvY3nva4iLHRpdGxlU2l6ZToiMTdweCIsYnV0dG9uczpbe2Zsb2F0OiJyaWdodCIsdGV4dDoi5a6M5oiQIixmb250U2l6ZToiMTdweCIsd2lkdGg6IjYwcHgiLG9uY2xpY2s6ZnVuY3Rpb24oKXtyLmV2YWxKUygiX19jaG9vc2VMb2NhdGlvbkNvbmZpcm1fXygpIil9fV19LHBvcEdlc3R1cmU6ImNsb3NlIixzY3JvbGxJbmRpY2F0b3I6Im5vbmUifSx7X191bmlhcHBfdHlwZToibWFwIixfX3VuaWFwcF9zdGF0dXNiYXJfc3R5bGU6biwidW5pLWFwcCI6Im5vbmUifSk7ImRhcmsiPT09biYmKEN2Lm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgibGlnaHQiKSxyLmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZSxuPWUucmVzdWx0OyJzdGFydCI9PT10P0N2Lm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpOiJlbmQiIT09dHx8bnx8Q3YubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJsaWdodCIpfSkpO3ZhciBpLG89MCxhPWZ1bmN0aW9uKCl7Mj09KytvJiZyLmV2YWxKUygiX19jaG9vc2VMb2NhdGlvbl9fKCIrSlNPTi5zdHJpbmdpZnkoZSkrIikiKX07ci5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWQiLGEpLHIuc2hvdygic2xpZGUtaW4tYm90dG9tIixZbyxhKSxyLmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIixmdW5jdGlvbigpe2k/b2kodCx7bmFtZTppLnBvaW5hbWUsYWRkcmVzczppLnBvaWFkZHJlc3MsbGF0aXR1ZGU6aS5sYXRsbmcubGF0LGxvbmdpdHVkZTppLmxhdGxuZy5sbmcsZXJyTXNnOiJjaG9vc2VMb2NhdGlvbjpvayJ9KTooY2EoSmEpLG9pKHQse2Vyck1zZzoiY2hvb3NlTG9jYXRpb246ZmFpbCBjYW5jZWwifSkpfSksdWEoSmEsZnVuY3Rpb24oZSl7ZSYmImxhdGxuZyJpbiBlJiYoaT1lKX0sITEpfX0pO3ZhciBaYT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjaG9vc2VMb2NhdGlvbjpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT0ibGlnaHQiIT09KCJVSVN0YXR1c0JhclN0eWxlQmxhY2tUcmFuc2x1Y2VudCI9PT0obj1Ddi5uYXZpZ2F0b3IuZ2V0U3RhdHVzQmFyU3R5bGUoKSl8fCJVSVN0YXR1c0JhclN0eWxlQmxhY2tPcGFxdWUiPT09bnx8Im51bGwiPT09bj9uPSJsaWdodCI6IlVJU3RhdHVzQmFyU3R5bGVEZWZhdWx0Ij09PW4mJihuPSJkYXJrIiksbiksbz14YSh7dXJsOiJfX3VuaWFwcGNob29zZWxvY2F0aW9uIixkYXRhOk9iamVjdC5hc3NpZ24oe30sZSx7bG9jYWxlOmV0KCl9KSxzdHlsZTp7YW5pbWF0aW9uVHlwZTplLmFuaW1hdGlvblR5cGV8fCJzbGlkZS1pbi1ib3R0b20iLHRpdGxlTlZpZXc6ITEscG9wR2VzdHVyZToiY2xvc2UiLHNjcm9sbEluZGljYXRvcjoibm9uZSJ9LG9uTWVzc2FnZTpmdW5jdGlvbihlKXt2YXIgdD1lLmV2ZW50LG49ZS5kZXRhaWw7InNlbGVjdGVkIj09PXQmJigocj1uKS5lcnJNc2c9ImNob29zZUxvY2F0aW9uOm9rIil9LG9uQ2xvc2U6ZnVuY3Rpb24oKXtpJiZDdi5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKSxvaSh0LHJ8fHtlcnJNc2c6ImNob29zZUxvY2F0aW9uOmZhaWwgY2FuY2VsIn0pfX0pO2kmJihDdi5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0Iiksby53ZWJ2aWV3LmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZSxuPWUucmVzdWx0OyJzdGFydCI9PT10P0N2Lm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpOiJlbmQiIT09dHx8bnx8Q3YubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJsaWdodCIpfSkpfX0pO2Z1bmN0aW9uIFFhKGUsdCxuKXt2YXIgcixpPXQuY29vcmRzO2UhPT10LmNvb3Jkc1R5cGUmJigid2dzODQiPT09ZT9yPWZ1bmN0aW9uKGUsdCl7aWYoQ2koZT0rZSx0PSt0KSlyZXR1cm5bZSx0XTt2YXIgbj1TaShlLTEwNSx0LTM1KSxyPXhpKGUtMTA1LHQtMzUpLGk9dC8xODAqYmksbz1NYXRoLnNpbihpKTtvPTEta2kqbypvO3ZhciBhPU1hdGguc3FydChvKTtyZXR1cm4gbj0xODAqbi8od2kqKDEta2kpLyhvKmEpKmJpKSxbMiplLShlKyhyPTE4MCpyLyh3aS9hKk1hdGguY29zKGkpKmJpKSkpLDIqdC0odCtuKV19KGkubG9uZ2l0dWRlLGkubGF0aXR1ZGUpOiJnY2owMiI9PT1lJiYocj1mdW5jdGlvbihlLHQpe2lmKENpKGU9K2UsdD0rdCkpcmV0dXJuW2UsdF07dmFyIG49U2koZS0xMDUsdC0zNSkscj14aShlLTEwNSx0LTM1KSxpPXQvMTgwKmJpLG89TWF0aC5zaW4oaSk7bz0xLWtpKm8qbzt2YXIgYT1NYXRoLnNxcnQobyk7cmV0dXJuIG49MTgwKm4vKHdpKigxLWtpKS8obyphKSpiaSksW2UrKHI9MTgwKnIvKHdpL2EqTWF0aC5jb3MoaSkqYmkpKSx0K25dfShpLmxvbmdpdHVkZSxpLmxhdGl0dWRlKSksciYmKGkubG9uZ2l0dWRlPXJbMF0saS5sYXRpdHVkZT1yWzFdKSk7b2kobix7dHlwZTplLGFsdGl0dWRlOmkuYWx0aXR1ZGV8fDAsbGF0aXR1ZGU6aS5sYXRpdHVkZSxsb25naXR1ZGU6aS5sb25naXR1ZGUsc3BlZWQ6aS5zcGVlZCxhY2N1cmFjeTppLmFjY3VyYWN5LGFkZHJlc3M6dC5hZGRyZXNzLGVyck1zZzoiZ2V0TG9jYXRpb246b2sifSl9dmFyIGVzPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLG9wZW5Mb2NhdGlvbjpmdW5jdGlvbihlKXt2YXIgdD1Ddi5uYXZpZ2F0b3IuZ2V0U3RhdHVzQmFyU3R5bGUoKSxuPUN2LndlYnZpZXcuY3JlYXRlKCJfd3d3L19fdW5pYXBwb3BlbmxvY2F0aW9uLmh0bWwiLGNvLHt0aXRsZU5WaWV3OnthdXRvQmFja0J1dHRvbjohMCx0aXRsZUNvbG9yOiIjZmZmZmZmIix0aXRsZVRleHQ6IiIsdGl0bGVTaXplOiIxN3B4Iix0eXBlOiJ0cmFuc3BhcmVudCJ9LHBvcEdlc3R1cmU6ImNsb3NlIixzY3JvbGxJbmRpY2F0b3I6Im5vbmUifSx7X191bmlhcHBfdHlwZToibWFwIixfX3VuaWFwcF9zdGF0dXNiYXJfc3R5bGU6dCwidW5pLWFwcCI6Im5vbmUifSk7cmV0dXJuImxpZ2h0Ij09PXQmJihDdi5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKSxuLmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZSxuPWUucmVzdWx0OyJzdGFydCI9PT10P0N2Lm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgibGlnaHQiKToiZW5kIiE9PXR8fG58fEN2Lm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpfSkpLG4uc2hvdyhYbyxZbyxmdW5jdGlvbigpe24uZXZhbEpTKCJfX29wZW5Mb2NhdGlvbl9fKCIrSlNPTi5zdHJpbmdpZnkoZSkrIikiKX0pLHtlcnJNc2c6Im9wZW5Mb2NhdGlvbjpvayJ9fX0pO3ZhciB0cz1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvcGVuTG9jYXRpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4geGEoe3VybDoiX191bmlhcHBvcGVubG9jYXRpb24iLGRhdGE6T2JqZWN0LmFzc2lnbih7fSxlLHtsb2NhbGU6ZXQoKX0pLHN0eWxlOnt0aXRsZU5WaWV3Ont0eXBlOiJ0cmFuc3BhcmVudCJ9LHBvcEdlc3R1cmU6ImNsb3NlIixiYWNrQnV0dG9uQXV0b0NvbnRyb2w6ImNsb3NlIn0sb25DbG9zZTpmdW5jdGlvbigpe29pKHQse2Vyck1zZzoib3BlbkxvY2F0aW9uOmZhaWwgY2FuY2VsIn0pfX0pLHtlcnJNc2c6Im9wZW5Mb2NhdGlvbjpvayJ9fX0pO3ZhciBucyxycyxpcyxvcyxhczt2YXIgc3MsY3MsdXM9SWkoImlvIiwiZ2V0SW1hZ2VJbmZvIixmdW5jdGlvbihlKXtyZXR1cm4gZS5zYXZlUGF0aD1lLmZpbGVuYW1lPWxvKyIvZG93bmxvYWQvIixlfSksbHM9SWkoImlvIiwiZ2V0VmlkZW9JbmZvIixmdW5jdGlvbihlKXtyZXR1cm4gZS5maWxlUGF0aD1lLnNyYyxlfSxmdW5jdGlvbihlKXtyZXR1cm57b3JpZW50YXRpb246ZS5vcmllbnRhdGlvbix0eXBlOmUudHlwZSxkdXJhdGlvbjplLmR1cmF0aW9uLHNpemU6ZS5zaXplLzEwMjQsaGVpZ2h0OmUuaGVpZ2h0LHdpZHRoOmUud2lkdGgsZnBzOmUuZnBzfHwzMCxiaXRyYXRlOmUuYml0cmF0ZX19KTt2YXIgZHM9ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT10JiYodD17fSksc2koIm9uUmVjb3JkZXJTdGF0ZUNoYW5nZSIsT2JqZWN0LmFzc2lnbih7c3RhdGU6ZX0sdCkpfSxmcz17c3RhcnQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmR1cmF0aW9uO3ZvaWQgMD09PW4mJihuPTZlNCk7dmFyIHI9ZS5zYW1wbGVSYXRlLGk9KGUubnVtYmVyT2ZDaGFubmVscyxlLmVuY29kZUJpdFJhdGUsZS5mb3JtYXQpO3ZvaWQgMD09PWkmJihpPSJtcDMiKTtlLmZyYW1lU2l6ZTt2YXIgbz1lLmF1ZGlvU291cmNlO2lmKHZvaWQgMD09PW8mJihvPSJhdXRvIiksc3MpcmV0dXJuIGRzKCJzdGFydCIpOyhzcz1Ddi5hdWRpby5nZXRSZWNvcmRlcigpKS5yZWNvcmQoe2Zvcm1hdDppLHNhbXBsZXJhdGU6cixmaWxlbmFtZTpsbysiL3JlY29yZGVyLyJ9LGZ1bmN0aW9uKGUpe3JldHVybiBkcygic3RvcCIse3RlbXBGaWxlUGF0aDplfSl9LGZ1bmN0aW9uKGUpe3JldHVybiBkcygiZXJyb3IiLHtlcnJNc2c6ZS5tZXNzYWdlfSl9KSxjcz1PdihmdW5jdGlvbigpe2ZzLnN0b3AoKX0sbiksZHMoInN0YXJ0Iil9LHN0b3A6ZnVuY3Rpb24oKXtzcyYmKHNzLnN0b3AoKSxzcz0hMSxjcyYmRXYoY3MpKX0scGF1c2U6ZnVuY3Rpb24oKXtzcyYmZHMoImVycm9yIix7ZXJyTXNnOiJVbnN1cHBvcnRlZCBvcGVyYXRpb246IHBhdXNlIn0pfSxyZXN1bWU6ZnVuY3Rpb24oKXtzcyYmZHMoImVycm9yIix7ZXJyTXNnOiJVbnN1cHBvcnRlZCBvcGVyYXRpb246IHJlc3VtZSJ9KX19O3ZhciBwcz0wLGhzPXt9LHZzPWZ1bmN0aW9uKGUpe3NpKCJvbkRvd25sb2FkVGFza1N0YXRlQ2hhbmdlIixlKX07dmFyIGdzPTAsbXM9e30seXM9ZnVuY3Rpb24oZSl7c2koIm9uUmVxdWVzdFRhc2tTdGF0ZUNoYW5nZSIsZSksZGVsZXRlIG1zW2dzXX0sX3M9ZnVuY3Rpb24oZSl7dmFyIHQ9ZVsiU2V0LUNvb2tpZSJdfHxlWyJzZXQtY29va2llIl0sbj1bXTtpZighdClyZXR1cm5bXTsiWyI9PT10WzBdJiYiXSI9PT10W3QubGVuZ3RoLTFdJiYodD10LnNsaWNlKDEsLTEpKTtmb3IodmFyIHI9dC5zcGxpdCgiOyIpLGk9MDtpPHIubGVuZ3RoO2krKyktMSE9PXJbaV0uaW5kZXhPZigiRXhwaXJlcz0iKXx8LTEhPT1yW2ldLmluZGV4T2YoImV4cGlyZXM9Iik/bi5wdXNoKHJbaV0ucmVwbGFjZSgiLCIsIiIpKTpuLnB1c2gocltpXSk7cmV0dXJuIG49bi5qb2luKCI7Iikuc3BsaXQoIiwiKX07ZnVuY3Rpb24gYnMoYyxlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS51cmwsbj1lLmRhdGEscj1lLmhlYWRlcixpPWUubWV0aG9kO3ZvaWQgMD09PWkmJihpPSJHRVQiKTt2YXIgdT1lLnJlc3BvbnNlVHlwZSxvPWUuc3NsVmVyaWZ5O3ZvaWQgMD09PW8mJihvPSEwKTt2YXIgYT1lLmZpcnN0SXB2NDt2b2lkIDA9PT1hJiYoYT0hMSk7dmFyIHM9ZS50bHMsbD1lLnRpbWVvdXQ7dm9pZCAwPT09bCYmKGw9JHYubmV0d29ya1RpbWVvdXQmJiR2Lm5ldHdvcmtUaW1lb3V0LnJlcXVlc3R8fDZlNCk7dmFyIGQsZixwPWFpKCJzdHJlYW0iKSxoPXt9LHY9ITE7Zm9yKHZhciBnIGluIHIpaWYodnx8ImNvbnRlbnQtdHlwZSIhPT1nLnRvTG93ZXJDYXNlKCkpaFtnXT1yW2ddO2Vsc2UgaWYodj0hMCxoWyJDb250ZW50LVR5cGUiXT1yW2ddLCJHRVQiIT09aSYmMD09PXJbZ10uaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJiJzdHJpbmciIT10eXBlb2YgbiYmIShuIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXt2YXIgbT1bXTtmb3IodmFyIHkgaW4gbilrKG4seSkmJm0ucHVzaChlbmNvZGVVUklDb21wb25lbnQoeSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChuW3ldKSk7bj1tLmpvaW4oIiYiKX12fHwiUE9TVCIhPT1pfHwoaFsiQ29udGVudC1UeXBlIl09ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIpLGwmJihkPU92KGZ1bmN0aW9uKCl7Zj0hMCx5cyh7cmVxdWVzdFRhc2tJZDpjLHN0YXRlOiJmYWlsIixzdGF0dXNDb2RlOjAsZXJyTXNnOiJ0aW1lb3V0In0pfSxsKzIwMCkpO3ZhciBfLGI9e21ldGhvZDppLHVybDp0LnRyaW0oKSxoZWFkZXJzOmgsdHlwZToiYXJyYXlidWZmZXIiPT09dT8iYmFzZTY0IjoidGV4dCIsdGltZW91dDpsfHw2ZTUsc3NsVmVyaWZ5OiFvLGZpcnN0SXB2NDphLHRsczpzfTsiR0VUIiE9PWkmJigiW29iamVjdCBBcnJheUJ1ZmZlcl0iPT09dG9TdHJpbmcuY2FsbChuKT9fPSEwOmIuYm9keT0ic3RyaW5nIj09dHlwZW9mIG4/bjpKU09OLnN0cmluZ2lmeShuKSk7dmFyIHc9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vayxuPWUuc3RhdHVzLHI9ZS5kYXRhLGk9ZS5oZWFkZXJzLG89ZS5lcnJvck1zZztpZighZil7ZCYmRXYoZCk7dmFyIGE9bjtpZigwPGEpeXMoe3JlcXVlc3RUYXNrSWQ6YyxzdGF0ZToic3VjY2VzcyIsZGF0YTp0JiYiYXJyYXlidWZmZXIiPT09dT9maShyKTpyLHN0YXR1c0NvZGU6YSxoZWFkZXI6aSxjb29raWVzOl9zKGkpfSk7ZWxzZXt2YXIgcz0iYWJvcnQgc3RhdHVzQ29kZToiK2E7byYmKHM9cysiICIrbykseXMoe3JlcXVlc3RUYXNrSWQ6YyxzdGF0ZToiZmFpbCIsc3RhdHVzQ29kZTphLGVyck1zZzpzfSl9fX07dHJ5e18/cC5mZXRjaFdpdGhBcnJheUJ1ZmZlcih7IkB0eXBlIjoiYmluYXJ5IixiYXNlNjQ6cGkobil9LGIsdyk6cC5mZXRjaChiLHcpLG1zW2NdPXthYm9ydDpmdW5jdGlvbigpe2Y9ITAsZCYmRXYoZCkseXMoe3JlcXVlc3RUYXNrSWQ6YyxzdGF0ZToiZmFpbCIsc3RhdHVzQ29kZTowLGVyck1zZzoiYWJvcnQifSl9fX1jYXRjaChlKXtyZXR1cm57cmVxdWVzdFRhc2tJZDpjLGVyck1zZzoiY3JlYXRlUmVxdWVzdFRhc2s6ZmFpbCJ9fXJldHVybntyZXF1ZXN0VGFza0lkOmMsZXJyTXNnOiJjcmVhdGVSZXF1ZXN0VGFzazpvayJ9fXZhciB3cyxrcz17fSxTcz1mdW5jdGlvbihlKXtzaSgib25Tb2NrZXRUYXNrU3RhdGVDaGFuZ2UiLGUpfTt2YXIgeHM9ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT10JiYodD17fSk7dmFyIG49dC51cmwscj0odC5kYXRhLHQuaGVhZGVyKSxpPSh0Lm1ldGhvZCx0LnByb3RvY29scyksbz13c3x8KCh3cz1haSgidW5pLXdlYlNvY2tldCIpKS5vbm9wZW4oZnVuY3Rpb24oZSl7U3Moe3NvY2tldFRhc2tJZDplLmlkLHN0YXRlOiJvcGVuIn0pfSksd3Mub25tZXNzYWdlKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0YTtTcyh7c29ja2V0VGFza0lkOmUuaWQsc3RhdGU6Im1lc3NhZ2UiLGRhdGE6Im9iamVjdCI9PXR5cGVvZiB0P2ZpKHQuYmFzZTY0KTp0fSl9KSx3cy5vbmVycm9yKGZ1bmN0aW9uKGUpe1NzKHtzb2NrZXRUYXNrSWQ6ZS5pZCxzdGF0ZToiZXJyb3IiLGVyck1zZzplLmRhdGF9KX0pLHdzLm9uY2xvc2UoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5pZDtkZWxldGUga3NbdF0sU3Moe3NvY2tldFRhc2tJZDp0LHN0YXRlOiJjbG9zZSJ9KX0pLHdzKTtyZXR1cm4gby5XZWJTb2NrZXQoe2lkOmUsdXJsOm4scHJvdG9jb2w6QXJyYXkuaXNBcnJheShpKT9pLmpvaW4oIiwiKTppLGhlYWRlcjpyfSksa3NbZV09byx7c29ja2V0VGFza0lkOmUsZXJyTXNnOiJjcmVhdGVTb2NrZXRUYXNrOm9rIn19O3ZhciBDcz0wLFRzPXt9LE9zPWZ1bmN0aW9uKGUpe3NpKCJvblVwbG9hZFRhc2tTdGF0ZUNoYW5nZSIsZSl9O3ZhciBFcyxJcz17b2F1dGg6ZnVuY3Rpb24odCl7Q3Yub2F1dGguZ2V0U2VydmljZXMoZnVuY3Rpb24oZSl7dmFyIG49W107ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQ7bi5wdXNoKHQpfSksdChudWxsLG4sZSl9LGZ1bmN0aW9uKGUpe3QoZSl9KX0sc2hhcmU6ZnVuY3Rpb24odCl7Q3Yuc2hhcmUuZ2V0U2VydmljZXMoZnVuY3Rpb24oZSl7dmFyIG49W107ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQ7bi5wdXNoKHQpfSksdChudWxsLG4sZSl9LGZ1bmN0aW9uKGUpe3QoZSl9KX0scGF5bWVudDpmdW5jdGlvbih0KXtDdi5wYXltZW50LmdldENoYW5uZWxzKGZ1bmN0aW9uKGUpe3ZhciBuPVtdO2UuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLmlkO24ucHVzaCh0KX0pLHQobnVsbCxuLGUpfSxmdW5jdGlvbihlKXt0KGUpfSl9LHB1c2g6ZnVuY3Rpb24oZSl7aWYodm9pZCAwIT09eHZ8fHZvaWQgMCE9PUN2KXt2YXIgdD1Ddi5wdXNoLmdldENsaWVudEluZm8oKTtlKG51bGwsW3QuaWRdLFt0XSl9ZWxzZSBlKG51bGwsW10pfX07ZnVuY3Rpb24gQXMoaSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKG4scil7Q3Yub2F1dGguZ2V0U2VydmljZXMoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlkPT09aX0pO3Q/bih0KTpyKG5ldyBFcnJvcigicHJvdmlkZXIgbm90IGZpbmQiKSl9LHIpfSl9ZnVuY3Rpb24gJHMobixyLGUpe3ZvaWQgMD09PWUmJihlPSEwKTt2YXIgaT1uLnByb3ZpZGVyfHwid2VpeGluIixvPVJzKHIsImxvZ2luIixlKSxhPSJhcHBsZSI9PT1pLHM9YT97c2NvcGU6ImVtYWlsIn06bi51bml2ZXJpZnlTdHlsZT97dW5pdmVyaWZ5U3R5bGU6ZnVuY3Rpb24oZSxyKXtUKGUpJiZUKGUuYnV0dG9ucykmJiJBcnJheSI9PT1mKGUuYnV0dG9ucy5saXN0KSYmZS5idXR0b25zLmxpc3QuZm9yRWFjaChmdW5jdGlvbih0LG4pe2UuYnV0dG9ucy5saXN0W25dLm9uY2xpY2s9ZnVuY3Rpb24oKXt2YXIgZT17Y29kZToiMzAwMDgiLG1lc3NhZ2U6IueUqOaIt+eCueWHu+S6huiHquWumuS5ieaMiemSriIsaW5kZXg6bixwcm92aWRlcjp0LnByb3ZpZGVyfTtUKEVzKT9Fcy5fdHJpZ2dlclVuaXZlcmlmeUJ1dHRvbnNDbGljayhlKTpqcygpLnRoZW4oZnVuY3Rpb24oKXtyKGUpfSl9fSk7cmV0dXJuIGV9KG4udW5pdmVyaWZ5U3R5bGUsbyl9Ont9LGM9ZT9vaTpJLmludm9rZTtBcyhpKS50aGVuKGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXtuLm9ubHlBdXRob3JpemUmJiJ3ZWl4aW4iPT09aT9lLmF1dGhvcml6ZShmdW5jdGlvbihlKXt2YXIgdD1lLmNvZGU7YyhyLHtjb2RlOnQsYXV0aFJlc3VsdDoiIixlcnJNc2c6ImxvZ2luOm9rIn0pfSxvKTplLmxvZ2luKGZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0LmF1dGhSZXN1bHQsbj1lLnRhcmdldC5hcHBsZUluZm87YyhyLHtjb2RlOnQuY29kZSxhdXRoUmVzdWx0OnQsYXBwbGVJbmZvOm4sZXJyTXNnOiJsb2dpbjpvayJ9KX0sbyxzKX1hfHwidW5pdmVyaWZ5Ij09PWk/dCgpOmUubG9nb3V0KHQsdCl9KS5jYXRjaChvKX1mdW5jdGlvbiBQcyhhLHMpe3ZhciBjPWEucHJvdmlkZXJ8fCJ3ZWl4aW4iLGU9RWkocywib3BlcmF0ZVdYRGF0YSIpO0FzKGMpLnRoZW4oZnVuY3Rpb24obyl7by5nZXRVc2VySW5mbyhmdW5jdGlvbihlKXt2YXIgdDtpZigid2VpeGluIj09PWMpe3ZhciBuPW8udXNlckluZm87dD17b3BlbklkOm4ub3BlbmlkLG5pY2tOYW1lOm4ubmlja25hbWUsZ2VuZGVyOm4uc2V4LGNpdHk6bi5jaXR5LHByb3ZpbmNlOm4ucHJvdmluY2UsY291bnRyeTpuLmNvdW50cnksYXZhdGFyVXJsOm4uaGVhZGltZ3VybCx1bmlvbklkOm4udW5pb25pZH19ZWxzZSBpZigiYXBwbGUiPT09Yyl7dmFyIHI9by5hcHBsZUluZm87dD17b3BlbklkOnIudXNlcixmdWxsTmFtZTpyLmZ1bGxOYW1lLGVtYWlsOnIuZW1haWwsYXV0aG9yaXphdGlvbkNvZGU6ci5hdXRob3JpemF0aW9uQ29kZSxpZGVudGl0eVRva2VuOnIuaWRlbnRpdHlUb2tlbixyZWFsVXNlclN0YXR1czpyLnJlYWxVc2VyU3RhdHVzfX1lbHNlKHQ9by51c2VySW5mbykub3BlbklkPXQub3BlbklkfHx0Lm9wZW5pZHx8by5hdXRoUmVzdWx0Lm9wZW5pZCx0Lm5pY2tOYW1lPXQubmlja05hbWV8fHQubmlja25hbWUsdC5hdmF0YXJVcmw9dC5hdmF0YXJVcmx8fHQuaGVhZGltZ3VybDt2YXIgaT17ZXJyTXNnOiJvcGVyYXRlV1hEYXRhOm9rIn07YS5kYXRhJiYid2ViYXBpX2dldHVzZXJpbmZvIj09PWEuZGF0YS5hcGlfbmFtZT9pLmRhdGE9e2RhdGE6SlNPTi5zdHJpbmdpZnkodCkscmF3RGF0YToiIixzaWduYXR1cmU6IiIsZW5jcnlwdGVkRGF0YToiIixpdjoiIn06aS51c2VySW5mbz10LG9pKHMsaSl9LGUpfSkuY2F0Y2goZnVuY3Rpb24oKXtvaShzLHtlcnJNc2c6Im9wZXJhdGVXWERhdGE6ZmFpbCDor7flhYjosIPnlKggdW5pLmxvZ2luIn0pfSl9ZnVuY3Rpb24gTXMoZSx0LG4pe3ZhciByPURzKHQsInByZUxvZ2luIixuKSxpPVJzKHQsInByZUxvZ2luIixuKTtBcyhlLnByb3ZpZGVyKS50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiBlLnByZUxvZ2luKHIsaSl9KS5jYXRjaChpKX1mdW5jdGlvbiBqcygpe3JldHVybiBBcygidW5pdmVyaWZ5IikudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gZS5jbG9zZUF1dGhWaWV3KCl9KX1mdW5jdGlvbiBMcyhlLHQsbil7dmFyIHI9RHModCwiZ2V0Q2hlY2tCb3hTdGF0ZSIsbiksaT1Scyh0LCJnZXRDaGVja0JveFN0YXRlIixuKTt0cnl7QXMoInVuaXZlcmlmeSIpLnRoZW4oZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRDaGVja0JveFN0YXRlKCk7cih7c3RhdGU6dH0pfSl9Y2F0Y2goZSl7aShlKX19dmFyIEJzLE5zPWZ1bmN0aW9uKCl7dGhpcy5wcm92aWRlcj0idW5pdmVyaWZ5Iix0aGlzLmV2ZW50TmFtZT0iYXBpLnVuaXZlcmlmeUJ1dHRvbnNDbGljayJ9O2Z1bmN0aW9uIERzKHQsbixlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9ITApLGU/T2kodCxuKTpmdW5jdGlvbihlKXtJLmludm9rZSh0LE9iamVjdC5hc3NpZ24oe30sZSx7ZXJyTXNnOm4rIjpvayJ9KSl9fWZ1bmN0aW9uIFJzKHIsaSxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9ITApLGU/RWkocixpKTpmdW5jdGlvbihlKXt2YXIgdD1lLmNvZGU7dm9pZCAwPT09dCYmKHQ9MCk7dmFyIG49ZS5tZXNzYWdlO0kuaW52b2tlKHIse2Vyck1zZzppKyI6ZmFpbCAiKyhufHwiIiksZXJyQ29kZTp0LGNvZGU6dH0pfX1Ocy5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXtqcygpfSxOcy5wcm90b3R5cGUubG9naW49ZnVuY3Rpb24oZSl7dGhpcy5fd2FycChmdW5jdGlvbihlLHQpe3JldHVybiAkcyhlLHQsITEpfSxlKX0sTnMucHJvdG90eXBlLmdldENoZWNrQm94U3RhdGU9ZnVuY3Rpb24oZSl7dGhpcy5fd2FycChmdW5jdGlvbihlLHQpe3JldHVybiBMcygwLHQsITEpfSxlKX0sTnMucHJvdG90eXBlLnByZUxvZ2luPWZ1bmN0aW9uKGUpe3RoaXMuX3dhcnAoZnVuY3Rpb24oZSx0KXtyZXR1cm4gTXMoZSx0LCExKX0sZSl9LE5zLnByb3RvdHlwZS5vbkJ1dHRvbnNDbGljaz1mdW5jdGlvbihlKXtUdi5vbih0aGlzLmV2ZW50TmFtZSxlKX0sTnMucHJvdG90eXBlLm9mZkJ1dHRvbnNDbGljaz1mdW5jdGlvbihlKXtUdi5vZmYodGhpcy5ldmVudE5hbWUsZSl9LE5zLnByb3RvdHlwZS5fdHJpZ2dlclVuaXZlcmlmeUJ1dHRvbnNDbGljaz1mdW5jdGlvbihlKXtUdi5lbWl0KHRoaXMuZXZlbnROYW1lLGUpfSxOcy5wcm90b3R5cGUuX3dhcnA9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gSS53YXJwKGUpKHRoaXMuX2dldE9wdGlvbnModCkpfTt2YXIgRnM9IShOcy5wcm90b3R5cGUuX2dldE9wdGlvbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXt9KSxPYmplY3QuYXNzaWduKHt9LGUse3Byb3ZpZGVyOnRoaXMucHJvdmlkZXJ9KX0pLHpzPSExO2Z1bmN0aW9uIFZzKGUpe3JldHVybiB4di5yZXF1aXJlTW9kdWxlKGUpfXZhciBVcz17MDp7bmFtZToid2ViIix0aXRsZToi5Zu+5paHIn0sMTp7bmFtZToidGV4dCIsdGl0bGU6Iue6r+aWh+WtlyJ9LDI6e25hbWU6ImltYWdlIix0aXRsZToi57qv5Zu+54mHIn0sMzp7bmFtZToibXVzaWMiLHRpdGxlOiLpn7PkuZAifSw0OntuYW1lOiJ2aWRlbyIsdGl0bGU6IuinhumikSJ9LDU6e25hbWU6Im1pbmlQcm9ncmFtIix0aXRsZToi5bCP56iL5bqPIn19LHFzPWZ1bmN0aW9uKGUsdCxuKXtlLnR5cGU9ZS50eXBlfHwwO3ZhciByPWUucHJvdmlkZXIsaT1lLnR5cGUsbz1lLnRpdGxlLGE9ZS5zdW1tYXJ5LHM9ZS5ocmVmLGM9ZS5pbWFnZVVybCx1PWUubWVkaWFVcmwsbD1lLnNjZW5lLGQ9ZS5taW5pUHJvZ3JhbSxmPWUub3BlbkN1c3RvbWVyU2VydmljZUNoYXQscD1lLmNvcnBpZCxoPWUuY3VzdG9tZXJVcmw7InN0cmluZyI9PXR5cGVvZiBjJiZjJiYoYz1faShjKSk7dmFyIHY9VXNbaSsiIl07aWYodil7dmFyIGc9e3Byb3ZpZGVyOnIsdHlwZTp2Lm5hbWUsdGl0bGU6byxjb250ZW50OmEsaHJlZjpzLHBpY3R1cmVzOltjXSx0aHVtYnM6W2NdLG1lZGlhOnUsbWluaVByb2dyYW06ZCxleHRyYTp7c2NlbmU6bH0sb3BlbkN1c3RvbWVyU2VydmljZUNoYXQ6Zixjb3JwaWQ6cCx1cmw6aH07cmV0dXJuIndlaXhpbiIhPT1yfHwxIT09aSYmMiE9PWl8fGRlbGV0ZSBnLnRodW1icyxnfXJldHVybiLliIbkuqvlj4LmlbAgdHlwZSDkuI3mraPnoa4ifSxXcz1mdW5jdGlvbihlLHQsbixyKXt2b2lkIDA9PT1yJiYocj0ic2hhcmUiKTt2YXIgaT1FaShuLHIpLG89dC5vcGVuQ3VzdG9tZXJTZXJ2aWNlQ2hhdD8ib3BlbkN1c3RvbWVyU2VydmljZUNoYXQiOiJzZW5kIjt0cnl7ZVtvXSh0LGZ1bmN0aW9uKCl7b2kobix7ZXJyTXNnOnIrIjpvayJ9KX0saSl9Y2F0Y2goZSl7aSh7bWVzc2FnZTp0LnByb3ZpZGVyKyIgIitvKyIg5pa55rOV6LCD55So5aSx6LSlIn0pfX07ZnVuY3Rpb24gSHMobixyLGkpe3ZvaWQgMD09PWkmJihpPSJzaGFyZSIpLG49cXMobik7dmFyIG89RWkocixpKTtpZigic3RyaW5nIj09dHlwZW9mIG4pcmV0dXJuIG9pKHIse2Vyck1zZzppKyI6ZmFpbCAiK259KTt2YXIgYT1uLnByb3ZpZGVyO0N2LnNoYXJlLmdldFNlcnZpY2VzKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5pZD09PWF9KTt0P3QuYXV0aGVudGljYXRlZD9Xcyh0LG4scik6dC5hdXRob3JpemUoZnVuY3Rpb24oKXtyZXR1cm4gV3ModCxuLHIpfSxvKTpvaShyLHtlcnJNc2c6aSsiOmZhaWwgc2VydmljZSBub3QgZm91bmQifSl9LG8pfWZ1bmN0aW9uIEdzKG4pe24uJHByb2Nlc3NlZD0hMCxuLnBvc3RNZXNzYWdlPWZ1bmN0aW9uKGUpe0N2LndlYnZpZXcucG9zdE1lc3NhZ2VUb1VuaU5WaWV3KHt0eXBlOiJVbmlBcHBTdWJOVnVlIixkYXRhOmV9LG4uaWQpfTt2YXIgcj1bXTtpZihuLm9uTWVzc2FnZT1mdW5jdGlvbihlKXtyLnB1c2goZSl9LG4uJGNvbnN1bWVNZXNzYWdlPWZ1bmN0aW9uKHQpe3IuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gZSh0KX0pfSxuLl9fdW5pYXBwX21hc2tfaWQpe3ZhciBpPW4uX191bmlhcHBfbWFzayxvPSIwIj09PW4uX191bmlhcHBfbWFza19pZD97c2V0U3R5bGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tYXNrO1ZzKCJ1bmktdGFidmlldyIpLnNldE1hc2soe2NvbG9yOnR9KX19OkN2LndlYnZpZXcuZ2V0V2Vidmlld0J5SWQobi5fX3VuaWFwcF9tYXNrX2lkKSxhPW4uc2hvdyxzPW4uaGlkZSxjPW4uY2xvc2UsdT1mdW5jdGlvbigpe28uc2V0U3R5bGUoe21hc2s6Im5vbmUifSl9O24uc2hvdz1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtyZXR1cm4gby5zZXRTdHlsZSh7bWFzazppfSksYS5hcHBseShuLGUpfSxuLmhpZGU9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIHUoKSxzLmFwcGx5KG4sZSl9LG4uY2xvc2U9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIHUoKSxyPVtdLGMuYXBwbHkobixlKX19fWZ1bmN0aW9uIFhzKGUpe3ZhciB0PUN2LndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoZSk7aWYobnVsbD09dCl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBmaW5kIFN1Yk5WdWUsIGlkPSIrZSk7dCYmIXQuJHByb2Nlc3NlZCYmR3ModCk7dmFyIG49dC5zZXRTdHlsZSxyPUN2LndlYnZpZXcuZ2V0V2Vidmlld0J5SWQodC5fX3VuaWFwcF9tYXNrX2lkKTtyZXR1cm4gdC5zZXRTdHlsZT1mdW5jdGlvbihlKXtlJiZlLm1hc2smJihyJiZyLnNldFN0eWxlKHttYXNrOmUubWFza30pLGRlbGV0ZSBlLm1hc2spLG4uY2FsbCh0aGlzLGUpfSx0fXZhciBZcz1bXTtmdW5jdGlvbiBKcyhlLHQsbil7cmV0dXJuIHh2LnJlcXVpcmVNb2R1bGUoInBsdXMiKS5zZW5kTmF0aXZlRXZlbnQoZSx0LG4pfVR2Lm9uKCJhcGkudW5pTVBOYXRpdmVFdmVudCIsZnVuY3Rpb24odCl7WXMuZm9yRWFjaChmdW5jdGlvbihlKXtvaShlLHQuZXZlbnQsdC5kYXRhKX0pfSk7dmFyIEtzPVtdO2Z1bmN0aW9uIFpzKHQsZSl7dmFyIG49ITEscj0kdi5zdWJQYWNrYWdlcztpZihBcnJheS5pc0FycmF5KHIpKXt2YXIgaT1yLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIDA9PT10LmluZGV4T2YoZS5yb290KX0pO2kmJihuPSEwLGZ1bmN0aW9uKGUsdCl7aWYoLTEhPT1Lcy5pbmRleE9mKGUpKXJldHVybiB0KCk7ZWMoW2VdLGZ1bmN0aW9uKCl7dCgpfSl9KGkucm9vdCxlKSl9bnx8ZSgpfXZhciBRcz0iYXBwLXN1Yi1zZXJ2aWNlLmpzIjtmdW5jdGlvbiBlYyhlLHQpe3ZhciBuLHI7bj1lLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gS3MucHVzaChlKSxlKyIvIitRc30pLHI9ZnVuY3Rpb24oZSl7dCYmdCghMCl9LCR2Lm9uU2VydmljZVJlYWR5KGZ1bmN0aW9uKCl7eHYucmVxdWlyZU1vZHVsZSgicGx1cyIpLmV2YWxKU0ZpbGVzKG4scil9KX12YXIgdGM9SnM7dmFyIG5jPU9iamVjdC5hc3NpZ247dmFyIHJjPXtwYXRoOiIiLHF1ZXJ5Ont9LHNjZW5lOjEwMDEscmVmZXJyZXJJbmZvOnthcHBJZDoiIixleHRyYURhdGE6e319fSxpYz17cGF0aDoiIixxdWVyeTp7fSxzY2VuZToxMDAxLHJlZmVycmVySW5mbzp7YXBwSWQ6IiIsZXh0cmFEYXRhOnt9fX07ZnVuY3Rpb24gb2MoKXtyZXR1cm4gcmN9ZnVuY3Rpb24gYWMoKXt2YXIgZT14di5yZXF1aXJlTW9kdWxlKCJwbHVzIik7aWYoZS5nZXRSZWRpcmVjdEluZm8pe3ZhciB0PWUuZ2V0UmVkaXJlY3RJbmZvKCl8fHt9LG49dC5wYXRoLHI9dC5xdWVyeSxpPXQuZXh0cmFEYXRhLG89dC51c2VyQWN0aW9uLGE9e2FwcElkOnQuZnJvbUFwcGlkLGV4dHJhRGF0YTp7fX07cmV0dXJuIGkmJihhLmV4dHJhRGF0YT1pKSx7cGF0aDpufHwiIixxdWVyeTpyPyI/IityOiIiLHJlZmVycmVySW5mbzphLHVzZXJBY3Rpb246b319fXZhciBzYz0yLGNjPSJ2ZFN5bmMiLHVjPSJ3ZWJ2aWV3UmVhZHkiLGxjPSJ2ZFN5bmNDYWxsYmFjayIsZGM9Imludm9rZUFwaSIsZmM9IldFQl9JTlZPS0VfQVBQU0VSVklDRSIscGM9IndlYnZpZXdJbnNlcnRlZCIsaGM9IndlYnZpZXdSZW1vdmVkIix2Yz0id2Vidmlld0lkIjtmdW5jdGlvbiBnYyhlKXt2YXIgdD1lLmJ1dHRvbnM7cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJnQuZm9yRWFjaChmdW5jdGlvbihlLHQpe3ZhciByO2Uub25jbGljaz0ocj10LGZ1bmN0aW9uKGUpe3ZhciB0PUx2KCk7aWYodC5sZW5ndGgpe2UuaW5kZXg9cjt2YXIgbj10W3QubGVuZ3RoLTFdO24uJHZtJiZuLiR2bS5fX2NhbGxfaG9vayYmbi4kdm0uX19jYWxsX2hvb2soIm9uTmF2aWdhdGlvbkJhckJ1dHRvblRhcCIsZSl9fSl9KSxlfWZ1bmN0aW9uIG1jKG4scil7dmFyIGU9ZnVuY3Rpb24oZSl7aWYoaXQoKSlyZXR1cm4gcnQoZSxbWyJ0aXRsZVRleHQiXSxbInNlYXJjaElucHV0IiwicGxhY2Vob2xkZXIiXV0pfShyKTtpZighZSlyZXR1cm4gcjt2YXIgaT1lWzBdLG89ZVsxXTtyZXR1cm4oaXx8bykmJk12Lm9uTG9jYWxlQ2hhbmdlKGZ1bmN0aW9uKCl7dmFyIGU9Q3Yud2Vidmlldy5nZXRXZWJ2aWV3QnlJZChuKyIiKTtpZihlKXt2YXIgdD17fTtpJiYodC50aXRsZVRleHQ9ci50aXRsZVRleHQpLG8mJih0LnNlYXJjaElucHV0PXtwbGFjZWhvbGRlcjpyLnNlYXJjaElucHV0LnBsYWNlaG9sZGVyfSksZS5zZXRTdHlsZSh7dGl0bGVOVmlldzp0fSl9fSkscn12YXIgeWM9LyhcZCsoXC5cZCspPylbcnx1XXB4L2c7ZnVuY3Rpb24gX2ModCl7dmFyIG49e30sZT1KU09OLnN0cmluZ2lmeSh0KTtpZih+ZS5pbmRleE9mKCJ1cHgiKXx8fmUuaW5kZXhPZigicnB4IikpdHJ5e249SlNPTi5wYXJzZShlLnJlcGxhY2UoeWMsZnVuY3Rpb24oZSx0KXtyZXR1cm4gTXYudXB4MnB4KHBhcnNlSW50KHQpfHwwKSsicHgifSkpfWNhdGNoKGUpe249dCxjb25zb2xlLmVycm9yKGUpfWVsc2Ugbj1KU09OLnBhcnNlKGUpO3JldHVybiBufXZhciBiYyx3Yz1bIm5hdmlnYXRpb25CYXJCYWNrZ3JvdW5kQ29sb3IiLCJuYXZpZ2F0aW9uQmFyVGV4dFN0eWxlIiwibmF2aWdhdGlvbkJhclRpdGxlVGV4dCIsIm5hdmlnYXRpb25CYXJTaGFkb3ciLCJuYXZpZ2F0aW9uU3R5bGUiLCJkaXNhYmxlU2Nyb2xsIiwiYmFja2dyb3VuZENvbG9yIiwiYmFja2dyb3VuZFRleHRTdHlsZSIsImVuYWJsZVB1bGxEb3duUmVmcmVzaCIsIm9uUmVhY2hCb3R0b21EaXN0YW5jZSIsInVzaW5nQ29tcG9uZW50cyIsInRpdGxlTlZpZXciLCJwdWxsVG9SZWZyZXNoIl07ZnVuY3Rpb24ga2MoZSx0LG4pe3ZvaWQgMD09PW4mJihuPXt9KTt2YXIgcj17Ym91bmNlOiJ2ZXJ0aWNhbCJ9O24ud2luZG93PV9jKE9iamVjdC5hc3NpZ24oSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSgkdi53aW5kb3d8fHt9KSksbi53aW5kb3d8fHt9KSksT2JqZWN0LmtleXMobi53aW5kb3cpLmZvckVhY2goZnVuY3Rpb24oZSl7LTE9PT13Yy5pbmRleE9mKGUpJiYocltlXT1uLndpbmRvd1tlXSl9KTt2YXIgaT1uLndpbmRvdy5iYWNrZ3JvdW5kQ29sb3I7KC9eI1thLXowLTldezZ9JC9pLnRlc3QoaSl8fCJ0cmFuc3BhcmVudCI9PT1pKSYmKHIuYmFja2dyb3VuZHx8KHIuYmFja2dyb3VuZD1pKSxyLmJhY2tncm91bmRDb2xvclRvcHx8KHIuYmFja2dyb3VuZENvbG9yVG9wPWkpKTt2YXIgbz1mdW5jdGlvbihlLHQpe3ZhciBuPXQud2luZG93LHI9bi50aXRsZU5WaWV3O2lmKHQubWV0YS5zdGF0dXNCYXJTdHlsZT0iYmxhY2siPT09bi5uYXZpZ2F0aW9uQmFyVGV4dFN0eWxlPyJkYXJrIjoibGlnaHQiLCExPT09cnx8ImZhbHNlIj09PXJ8fCJjdXN0b20iPT09bi5uYXZpZ2F0aW9uU3R5bGUmJiFUKHIpfHwiYWx3YXlzIj09PW4udHJhbnNwYXJlbnRUaXRsZSYmIVQocikpcmV0dXJuITE7dmFyIGk9bi50aXRsZUltYWdlfHwiIixvPW4udHJhbnNwYXJlbnRUaXRsZXx8Im5vbmUiLGE9bi5uYXZpZ2F0aW9uQmFyQmFja2dyb3VuZENvbG9yLHM9e2F1dG9CYWNrQnV0dG9uOiF0Lm1ldGEuaXNRdWl0LHRpdGxlVGV4dDoiIj09PWkmJm4ubmF2aWdhdGlvbkJhclRpdGxlVGV4dHx8IiIsdGl0bGVDb2xvcjoiYmxhY2siPT09bi5uYXZpZ2F0aW9uQmFyVGV4dFN0eWxlPyIjMDAwMDAwIjoiI2ZmZmZmZiIsdHlwZTp7bm9uZToiZGVmYXVsdCIsYXV0bzoidHJhbnNwYXJlbnQiLGFsd2F5czoiZmxvYXQifVtvXSxiYWNrZ3JvdW5kQ29sb3I6L14jW2EtejAtOV17Nn0kL2kudGVzdChhKXx8InRyYW5zcGFyZW50Ij09PWE/YToiI2Y3ZjdmNyIsdGFnczoiIj09PWk/W106W3t0YWc6ImltZyIsc3JjOmkscG9zaXRpb246e2xlZnQ6ImF1dG8iLHRvcDoiYXV0byIsd2lkdGg6ImF1dG8iLGhlaWdodDoiMjZweCJ9fV19O3JldHVybiBUKHIpP21jKGUsT2JqZWN0LmFzc2lnbihzLGdjKHIpKSk6bWMoZSxzKX0oZSxuKTtvJiYoMT09PWUmJiR2LnJlYWxFbnRyeVBhZ2VQYXRoJiYhbi5tZXRhLmlzUXVpdCYmKG8uYXV0b0JhY2tCdXR0b249ITApLHIudGl0bGVOVmlldz1vKTt2YXIgYT1mdW5jdGlvbihlKXt2YXIgdD1lLndpbmRvdztpZih0LmVuYWJsZVB1bGxEb3duUmVmcmVzaHx8dC5wdWxsVG9SZWZyZXNoJiZ0LnB1bGxUb1JlZnJlc2guc3VwcG9ydCl7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4iQW5kcm9pZCI9PT1Ddi5vcy5uYW1lP09iamVjdC5hc3NpZ24obix7c3VwcG9ydDohMCxzdHlsZToiY2lyY2xlIn0pOk9iamVjdC5hc3NpZ24obix7c3VwcG9ydDohMCxzdHlsZToiZGVmYXVsdCIsaGVpZ2h0OiI1MHB4IixyYW5nZToiMjAwcHgiLGNvbnRlbnRkb3duOntjYXB0aW9uOiIifSxjb250ZW50b3Zlcjp7Y2FwdGlvbjoiIn0sY29udGVudHJlZnJlc2g6e2NhcHRpb246IiJ9fSksdC5iYWNrZ3JvdW5kVGV4dFN0eWxlJiYobi5jb2xvcj10LmJhY2tncm91bmRUZXh0U3R5bGUsbi5zbm93Q29sb3I9dC5iYWNrZ3JvdW5kVGV4dFN0eWxlKSxPYmplY3QuYXNzaWduKG4sdC5wdWxsVG9SZWZyZXNofHx7fSksbn19KG4pO3JldHVybiBhJiYoImNpcmNsZSI9PT1hLnN0eWxlJiYoci5ib3VuY2U9Im5vbmUiKSxyLnB1bGxUb1JlZnJlc2g9YSksImhpZGUiPT09ci5wb3BHZXN0dXJlJiZkZWxldGUgci5wb3BHZXN0dXJlLG4ubWV0YS5pc1F1aXQmJihyLnBvcEdlc3R1cmU9ImlPUyI9PT1Ddi5vcy5uYW1lPyJhcHBiYWNrIjoibm9uZSIpLHQmJm4ubWV0YS5pc05WdWUmJihyLnVuaU5WaWV3PXtwYXRoOnQsZGVmYXVsdEZvbnRTaXplOiR2LmRlZmF1bHRGb250U2l6ZSx2aWV3cG9ydDokdi52aWV3cG9ydH0pLHJ9ZnVuY3Rpb24gU2MoKXtNdi5uYXZpZ2F0ZUJhY2soe2Zyb206ImJhY2tidXR0b24ifSl9ZnVuY3Rpb24geGMoZSx0LG4pe2lmKGUucGF0aCl7dmFyIHI9ZS5zdHlsZXx8e30saT0ibmF2aWdhdGlvbkJhciI9PT1lLnR5cGUsbz0icG9wdXAiPT09ZS50eXBlO2RlbGV0ZSByLnR5cGUsbyYmIWUuaWQmJmNvbnNvbGUud2Fybigic3ViTlZ1ZVsiK2UucGF0aCsiXSBpcyBtaXNzaW5nIGlkIiksci51bmlOVmlldz17cGF0aDplLnBhdGgucmVwbGFjZSgiLm52dWUiLCIuanMiKSxkZWZhdWx0Rm9udFNpemU6JHYuZGVmYXVsdEZvbnRTaXplLHZpZXdwb3J0OiR2LnZpZXdwb3J0fTt2YXIgYSxzPXtfX3VuaWFwcF9ob3N0OnQucGF0aCxfX3VuaWFwcF9vcmlnaW46ci51bmlOVmlldy5wYXRoLnNwbGl0KCI/IilbMF0ucmVwbGFjZSgiLmpzIiwiIiksX191bmlhcHBfb3JpZ2luX2lkOm4uaWQsX191bmlhcHBfb3JpZ2luX3R5cGU6bi5fX3VuaWFwcF90eXBlfTtpPyhyLnBvc2l0aW9uPSJkb2NrIixyLmRvY2s9InRvcCIsci50b3A9MCxyLndpZHRoPSIxMDAlIixyLmhlaWdodD1ZZStCYSgpLGRlbGV0ZSByLmxlZnQsZGVsZXRlIHIucmlnaHQsZGVsZXRlIHIuYm90dG9tLGRlbGV0ZSByLm1hcmdpbik6byYmKHIucG9zaXRpb249ImFic29sdXRlIixhPWRpKHQucGF0aCk/TGE6bixzLl9fdW5pYXBwX21hc2s9ci5tYXNrfHwicmdiYSgwLDAsMCwwLjUpIixzLl9fdW5pYXBwX21hc2tfaWQ9YS5pZCksZGVsZXRlIHIubWFzazt2YXIgYyx1PUN2LndlYnZpZXcuY3JlYXRlKCIiLGUuaWQscixzKTtvP2Z1bmN0aW9uKGUsdCxuKXtuLnBvcHVwU3ViTlZ1ZVdlYnZpZXdzfHwobi5wb3B1cFN1Yk5WdWVXZWJ2aWV3cz17fSksbi5wb3B1cFN1Yk5WdWVXZWJ2aWV3c1tlLmlkXT1lO3ZhciByPWZ1bmN0aW9uKCl7bi5zZXRTdHlsZSh7bWFzazoibm9uZSJ9KSxlLmhpZGUoImF1dG8iKX07bi5hZGRFdmVudExpc3RlbmVyKCJtYXNrQ2xpY2siLHIpO3ZhciBpPSExO2UuYWRkRXZlbnRMaXN0ZW5lcigic2hvdyIsZnVuY3Rpb24oKXtpfHwoQ3Yua2V5LnJlbW92ZUV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLFNjKSxDdi5rZXkuYWRkRXZlbnRMaXN0ZW5lcigiYmFja2J1dHRvbiIsciksaT0hMCl9KSxlLmFkZEV2ZW50TGlzdGVuZXIoImhpZGUiLGZ1bmN0aW9uKCl7aSYmKEN2LmtleS5yZW1vdmVFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixyKSxDdi5rZXkuYWRkRXZlbnRMaXN0ZW5lcigiYmFja2J1dHRvbiIsU2MpLGk9ITEpfSksZS5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsZnVuY3Rpb24oKXtkZWxldGUgbi5wb3B1cFN1Yk5WdWVXZWJ2aWV3c1tlLmlkXSxpJiYoQ3Yua2V5LnJlbW92ZUV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLHIpLEN2LmtleS5hZGRFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixTYyksaT0hMSl9KX0odSwwLGEpOihjPXUsbi5hcHBlbmQoYykpfX1mdW5jdGlvbiBDYyhpKXt2YXIgbixyLG8sZTtpLmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsKG49ZnVuY3Rpb24oZSl7dmFyIHQ9ZS53aWR0aCxuPWUuaGVpZ2h0LHI9e2RldmljZU9yaWVudGF0aW9uOjkwPT09TWF0aC5hYnMoQ3YubmF2aWdhdG9yLmdldE9yaWVudGF0aW9uKCkpPyJsYW5kc2NhcGUiOiJwb3J0cmFpdCIsc2l6ZTp7d2luZG93V2lkdGg6TWF0aC5jZWlsKHQpLHdpbmRvd0hlaWdodDpNYXRoLmNlaWwobil9fTtzaSgib25WaWV3RGlkUmVzaXplIixyKSxUdi5lbWl0KCJvblJlc2l6ZSIscixwYXJzZUludChpLmlkKSl9LHI9NTAsKGU9ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMsdD10aGlzO0V2KG8pLG89T3YoZnVuY3Rpb24oKXtyZXR1cm4gbi5hcHBseSh0LGUpfSxyKX0pLmNhbmNlbD1mdW5jdGlvbigpe0V2KG8pfSxlKSl9ZnVuY3Rpb24gVGMoZSl7dmFyIGw7ZS5hZGRFdmVudExpc3RlbmVyKCJwb3BHZXN0dXJlIixmdW5jdGlvbihlKXtpZigic3RhcnQiPT09ZS50eXBlKXt2YXIgdD1MdigpLG49dFt0Lmxlbmd0aC0yXTtsPXJpO3ZhciByPW4mJm4uJHBhZ2UubWV0YS5zdGF0dXNCYXJTdHlsZTtyJiZsaShyKX1lbHNlIGlmKCJlbmQiIT09ZS50eXBlfHxlLnJlc3VsdCl7aWYoImVuZCI9PT1lLnR5cGUmJmUucmVzdWx0KXt2YXIgaT1MdigpLG89aS5sZW5ndGgsYT1pW2kubGVuZ3RoLTFdO2EmJmEuJHJlbW92ZSgpLGxpKCksYSYmMT09PW8mJih1PWEsJHYucmVhbEVudHJ5UGFnZVBhdGgmJnUuJHBhZ2Uucm91dGU9PT0kdi5lbnRyeVBhZ2VQYXRoKT8oJHYuZW50cnlQYWdlUGF0aD0kdi5yZWFsRW50cnlQYWdlUGF0aCxkZWxldGUgJHYucmVhbEVudHJ5UGFnZVBhdGgsTXYucmVMYXVuY2goe3VybDoocz0kdi5lbnRyeVBhZ2VQYXRoLGM9cywwPT09Yy5pbmRleE9mKCIvIik/czoiLyIrcyl9KSk6VHYuZW1pdCgib25BcHBSb3V0ZSIse3R5cGU6Im5hdmlnYXRlQmFjayJ9KX19ZWxzZSBsaShsKTt2YXIgcyxjLHV9KX12YXIgT2M9MixFYz17cHVsbFRvUmVmcmVzaDoib25QdWxsRG93blJlZnJlc2giLHRpdGxlTlZpZXdTZWFyY2hJbnB1dENoYW5nZWQ6Im9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2hhbmdlZCIsdGl0bGVOVmlld1NlYXJjaElucHV0Q29uZmlybWVkOiJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENvbmZpcm1lZCIsdGl0bGVOVmlld1NlYXJjaElucHV0Q2xpY2tlZDoib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDbGlja2VkIix0aXRsZU5WaWV3U2VhcmNoSW5wdXRGb2N1c0NoYW5nZWQ6Im9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Rm9jdXNDaGFuZ2VkIn07ZnVuY3Rpb24gSWMoZSl7YmM9ZX1mdW5jdGlvbiBBYyhlKXtyZXR1cm4gZX1mdW5jdGlvbiAkYyhlLHQpe3ZhciBuPXQ/Uyh0LEFjKToiIjtyZXR1cm57cGF0aDplLnN1YnN0cigxKSxxdWVyeTpuP24uc3Vic3RyKDEpOm59fWZ1bmN0aW9uIFBjKGUsdCxuLHIpe2lmKHZvaWQgMD09PXImJihyPXt9KSx0Lm1ldGEuaXNOVnVlKXt2YXIgaT1PYysrLG89a2MoaSxlLHQpO3JldHVybiBvLnVuaVBhZ2VVcmw9JGMoZSxuKSxvLmlzVGFiPSEhdC5tZXRhLmlzVGFiQmFyLEN2LndlYnZpZXcuY3JlYXRlKCIiLFN0cmluZyhpKSxvLE9iamVjdC5hc3NpZ24oe252dWU6ITB9LHIpKX1yZXR1cm4gMj09PU9jP0N2LndlYnZpZXcuZ2V0TGF1bmNoV2VidmlldygpOmJjfWZ1bmN0aW9uIE1jKG4sZSx0LHIpe2lmKCIxIj09PW4uaWR8fCFlLm1ldGEuaXNOVnVlKXt2YXIgaT1rYyhwYXJzZUludChuLmlkKSwiIixlKTtpLnVuaVBhZ2VVcmw9JGModCxyKSxlLm1ldGEuaXNOVnVlP2kuaXNUYWI9ISFlLm1ldGEuaXNUYWJCYXI6aS5kZWJ1Z1JlZnJlc2g9KG89dCxzPWUsYz0oYT1yKT9TKGEsQWMpOiIiLHtpc1RhYjpzLm1ldGEuaXNUYWJCYXIsYXJndW1lbnRzOkpTT04uc3RyaW5naWZ5KHtwYXRoOm8uc3Vic3RyKDEpLHF1ZXJ5OmM/Yy5zdWJzdHIoMSk6Y30pfSksbi5zZXRTdHlsZShpKX12YXIgbyxhLHMsYyx1LGwsZCxmLHAsaCx2LGcsbSx5PVR2Lm9uLF89VHYuZW1pdDtyZXR1cm4gbD1uLChkPSh1PWUpLndpbmRvdy5zdWJOVnVlcykmJmQubGVuZ3RoJiZkLmZvckVhY2goZnVuY3Rpb24oZSl7eGMoZSx1LGwpfSksT2JqZWN0LmtleXMoRWMpLmZvckVhY2goZnVuY3Rpb24odCl7bi5hZGRFdmVudExpc3RlbmVyKHQsZnVuY3Rpb24oZSl7XyhFY1t0XSxlLHBhcnNlSW50KG4uaWQpKX0pfSksKGY9bikucG9wdXBTdWJOVnVlV2Vidmlld3MmJmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLGZ1bmN0aW9uKCl7T2JqZWN0LmtleXMoZi5wb3B1cFN1Yk5WdWVXZWJ2aWV3cykuZm9yRWFjaChmdW5jdGlvbihlKXtmLnBvcHVwU3ViTlZ1ZVdlYnZpZXdzW2VdLmNsb3NlKCJub25lIil9KX0pLENjKG4pLCJpT1MiPT09Q3Yub3MubmFtZSYmKCFuLm52dWUmJihwPW4saD1Udi5zdWJzY3JpYmUsdj1Udi51bnN1YnNjcmliZSxnPXAuaWQsbT1mdW5jdGlvbihlLHQpe2lmKGc9PT10KXt2KHVjLG0pLHQ9cGFyc2VJbnQodCk7dmFyIG49THYoITApLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuJHBhZ2UuaWQ9PT10fSk7aWYoIW4pcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlBhZ2VbIit0KyJdIG5vdCBmb3VuZCIpO24uJHZtLl8kdmQucmVzdG9yZSgpfX0scC5hZGRFdmVudExpc3RlbmVyKCJyZWNvdmVyeSIsZnVuY3Rpb24oZSl7aCh1YyxtKX0pKSxUYyhuKSkseShuLmlkKyIuc3RhcnRQdWxsRG93blJlZnJlc2giLGZ1bmN0aW9uKCl7bi5iZWdpblB1bGxUb1JlZnJlc2goKX0pLHkobi5pZCsiLnN0b3BQdWxsRG93blJlZnJlc2giLGZ1bmN0aW9uKCl7bi5lbmRQdWxsVG9SZWZyZXNoKCl9KSxufXZhciBqYz17fTtmdW5jdGlvbiBMYyhlLHQpeyhqY1tlXXx8KGpjW2VdPVtdKSkucHVzaCh0KX12YXIgQmM9ITE7ZnVuY3Rpb24gTmModCxlLG4pe0JjPXtwYXRoOnQsbnZ1ZTpQdi5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT10fSkubWV0YS5pc05WdWUsbmF2aWdhdGU6ZX19ZnVuY3Rpb24gRGMoZSx0LG4pe2lmKG4mJiR2LnNwbGFzaHNjcmVlbiYmJHYuc3BsYXNoc2NyZWVuLmF1dG9jbG9zZSYmISR2LnNwbGFzaHNjcmVlbi5hbHdheXNTaG93QmVmb3JlUmVuZGVyJiZDdi5uYXZpZ2F0b3IuY2xvc2VTcGxhc2hzY3JlZW4oKSwhbiYmQmMpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIldhaXRpbmcgdG8gbmF2aWdhdGUgdG86ICIrQmMucGF0aCsiLCBkbyBub3Qgb3BlcmF0ZSBjb250aW51b3VzbHk6ICIrZSsiLiIpO2lmKCJuYXRpdmUiPT09JHYucmVuZGVyZXIpcmV0dXJuIDA9PT1MdigpLmxlbmd0aD9OYyhlLHQpOnQoKTt2YXIgcj0hYmN8fGJjJiZiYy5fX3VuaWFwcF9yb3V0ZSxpPWJjJiYhYmMubG9hZGVkO3J8fGk/TmMoZSx0KTp0KCksaSYmTGMoYmMuaWQsUmMpfWZ1bmN0aW9uIFJjKCl7aWYoQmMpe3ZhciBlPUJjLm5hdmlnYXRlO3JldHVybiBCYz0hMSxlKCl9fWZ1bmN0aW9uIEZjKCl7aWYoIm5hdGl2ZSI9PT0kdi5yZW5kZXJlcil7aWYoIUJjKXJldHVybjtyZXR1cm4gQmMubnZ1ZT9SYygpOnZvaWQgMH12YXIgZT0oYmMmJiFiYy5fX3VuaWFwcF9yb3V0ZXx8KGJjPUN2LndlYnZpZXcuY3JlYXRlKFpvLFN0cmluZyhPYysrKSx7Y29udGVudEFkanVzdDohMX0pKSxiYyk7aWYoQmMpcmV0dXJuIEJjLm52dWU/UmMoKTp2b2lkKGUubG9hZGVkP0JjLm5hdmlnYXRlKCk6TGMoZS5pZCxSYykpfWZ1bmN0aW9uIHpjKGUsdCxuKXtlW2UuX19wcmVsb2FkX18/ImhpZGUiOiJjbG9zZSJdKHQsbil9ZnVuY3Rpb24gVmMobixyLGUsaSx0KXt2b2lkIDA9PT10JiYodD1uLm52dWU/MDoxMDApO3ZhciBvPShlPXZvaWQgMD09PWU/WW86cGFyc2VJbnQoZSkpfHxZbztPdihmdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKCl7ZS5fY2FsbGVkfHwoZS5fY2FsbGVkPSEwLGkmJmkoKSxGYygpKX0sdD1PdihmdW5jdGlvbigpe2UoKX0sbysxNTApO24uc2hvdyhyfHxYbyxvLGZ1bmN0aW9uKCl7ZS5fY2FsbGVkfHxFdih0KSxlKCl9KX0sdCl9dmFyIFVjPTA7ZnVuY3Rpb24gcWModCxuLHIpe3ZhciBpPUx2KCksbz1pLmxlbmd0aCxhPWlbby0xXTsxPHQmJmkuc2xpY2Uoby10LG8tMSkucmV2ZXJzZSgpLmZvckVhY2goZnVuY3Rpb24oZSl7emMoZS4kZ2V0QXBwV2VidmlldygpLCJub25lIil9KTt2YXIgZT1mdW5jdGlvbihlKXtuP3pjKGUsbixyfHxZbyk6InJlZGlyZWN0Ij09PWEuJHBhZ2Uub3BlblR5cGU/emMoZSxKbyxZbyk6emMoZSwiYXV0byIpLGkuc2xpY2Uoby10LG8pLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGUuJHJlbW92ZSgpfSksbGkoKSxUdi5lbWl0KCJvbkFwcFJvdXRlIix7dHlwZToibmF2aWdhdGVCYWNrIn0pfSxzPWEuJGdldEFwcFdlYnZpZXcoKTtpZighYS5fX3VuaWFwcF93ZWJ2aWV3KXJldHVybiBlKHMpOyFmdW5jdGlvbihlLHQpe3ZhciBuPWUuY2hpbGRyZW4oKTtpZighbnx8IW4ubGVuZ3RoKXJldHVybiB0KCk7dmFyIHI9bi5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiAwPT09ZS5pZC5pbmRleE9mKHZjKX0pfHxuWzBdO3IuY2FuQmFjayhmdW5jdGlvbihlKXtlLmNhbkJhY2s/ci5iYWNrKCk6dCgpfSl9KHMsZnVuY3Rpb24oKXtlKHMpfSl9ZnVuY3Rpb24gV2MoZSl7dmFyIHQ9ZS5mcm9tO3ZvaWQgMD09PXQmJih0PSJuYXZpZ2F0ZUJhY2siKTt2YXIgbj1lLmRlbHRhLHI9ZS5hbmltYXRpb25UeXBlLGk9ZS5hbmltYXRpb25EdXJhdGlvbixvPUx2KCksYT1vW28ubGVuZ3RoLTFdO2lmKCEoYS4kdm0mJmEuJHZtLiRvcHRpb25zLm9uQmFja1ByZXNzJiZhLiR2bS5fX2NhbGxfaG9vayYmYS4kdm0uX19jYWxsX2hvb2soIm9uQmFja1ByZXNzIix7ZnJvbTp0fSkpKXJldHVybiBNdi5oaWRlVG9hc3QoKSxNdi5oaWRlTG9hZGluZygpLGEuJHBhZ2UubWV0YS5pc1F1aXQ/VWM/RGF0ZS5ub3coKS1VYzwyZTMmJkN2LnJ1bnRpbWUucXVpdCgpOihVYz1EYXRlLm5vdygpLEN2Lm5hdGl2ZVVJLnRvYXN0KFFlKCJ1bmkuYXBwLnF1aXQiKSksT3YoZnVuY3Rpb24oKXtVYz1udWxsfSwyZTMpKToxPT09YS4kcGFnZS5pZCYmJHYucmVhbEVudHJ5UGFnZVBhdGg/KCR2LmVudHJ5UGFnZVBhdGg9JHYucmVhbEVudHJ5UGFnZVBhdGgsZGVsZXRlICR2LnJlYWxFbnRyeVBhZ2VQYXRoLE12LnJlTGF1bmNoKHt1cmw6Ii8iKyR2LmVudHJ5UGFnZVBhdGh9KSk6cWMobixyLGkpLHtlcnJNc2c6Im5hdmlnYXRlQmFjazpvayJ9fXZhciBIYz1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7dGhpcy5pZD1lLHRoaXMubGlzdGVuZXI9e30sdGhpcy5lbWl0Q2FjaGU9e30sdCYmT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihlKXtuLm9uKGUsdFtlXSl9KX07SGMucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49YXJndW1lbnRzLmxlbmd0aC0xOzA8bi0tOyl0W25dPWFyZ3VtZW50c1tuKzFdO3ZhciByPXRoaXMubGlzdGVuZXJbZV07aWYoIXIpcmV0dXJuKHRoaXMuZW1pdENhY2hlW2VdfHwodGhpcy5lbWl0Q2FjaGVbZV09W10pKS5wdXNoKHQpO3IuZm9yRWFjaChmdW5jdGlvbihlKXtlLmZuLmFwcGx5KGUuZm4sdCl9KSx0aGlzLmxpc3RlbmVyW2VdPXIuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiJvbmNlIiE9PWUudHlwZX0pfSxIYy5wcm90b3R5cGUub249ZnVuY3Rpb24oZSx0KXt0aGlzLl9hZGRMaXN0ZW5lcihlLCJvbiIsdCksdGhpcy5fY2xlYXJDYWNoZShlKX0sSGMucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24oZSx0KXt0aGlzLl9hZGRMaXN0ZW5lcihlLCJvbmNlIix0KSx0aGlzLl9jbGVhckNhY2hlKGUpfSxIYy5wcm90b3R5cGUub2ZmPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5saXN0ZW5lcltlXTtpZihuKWlmKHQpZm9yKHZhciByPTA7cjxuLmxlbmd0aDspbltyXS5mbj09PXQmJihuLnNwbGljZShyLDEpLHItLSkscisrO2Vsc2UgZGVsZXRlIHRoaXMubGlzdGVuZXJbZV19LEhjLnByb3RvdHlwZS5fY2xlYXJDYWNoZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmVtaXRDYWNoZVtlXTtpZih0KWZvcig7MDx0Lmxlbmd0aDspdGhpcy5lbWl0LmFwcGx5KHRoaXMsW2VdLmNvbmNhdCh0LnNoaWZ0KCkpKX0sSGMucHJvdG90eXBlLl9hZGRMaXN0ZW5lcj1mdW5jdGlvbihlLHQsbil7KHRoaXMubGlzdGVuZXJbZV18fCh0aGlzLmxpc3RlbmVyW2VdPVtdKSkucHVzaCh7Zm46bix0eXBlOnR9KX07dmFyIEdjPTA7dmFyIFhjPU9iamVjdC5jcmVhdGUobnVsbCk7dmFyIFljPWQoZnVuY3Rpb24oZSl7cmV0dXJuIFhjW2VdKCl9KTt2YXIgSmM9ITE7ZnVuY3Rpb24gS2MoKXtpZighSmMpe3ZhciBlLHQ7aWYoSmM9ITAseHYucmVxdWlyZU1vZHVsZSgicGx1cyIpLmdldFJlZGlyZWN0SW5mbyl7dmFyIG49YWMoKSxyPW4ucGF0aCxpPW4ucXVlcnksbz1uLnJlZmVycmVySW5mbztyJiYoZT1yLHQ9aSksJHYucmVmZXJyZXJJbmZvPW99ZWxzZXt2YXIgYT1Ddi5ydW50aW1lLmFyZ3VtZW50cztpZighYSlyZXR1cm47dHJ5e3ZhciBzPUpTT04ucGFyc2UoYSk7ZT1zLnBhdGh8fHMucGF0aE5hbWUsdD1zLnF1ZXJ5PyI/IitzLnF1ZXJ5OiIifWNhdGNoKGUpe319aWYoZSYmZSE9PSR2LmVudHJ5UGFnZVBhdGgpe3ZhciBjPSIvIitlLHU9UHYuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXRoPT09Y30pO3U/KHUubWV0YS5pc1RhYkJhcnx8KCR2LnJlYWxFbnRyeVBhZ2VQYXRoPSR2LnJlYWxFbnRyeVBhZ2VQYXRofHwkdi5lbnRyeVBhZ2VQYXRoKSwkdi5lbnRyeVBhZ2VQYXRoPWUsJHYuZW50cnlQYWdlUXVlcnk9dCk6Y29uc29sZS5lcnJvcigiW3VuaS1hcHBdICIrZSsiIG5vdCBmb3VuZC4uLiIpfWVsc2UgdCYmKCR2LmVudHJ5UGFnZVF1ZXJ5PXQpfX12YXIgWmM9W107ZnVuY3Rpb24gUWMoZSl7cmV0dXJuIGU/WmMuc2xpY2UoMCk6WmMuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLiRwYWdlLm1ldGEuaXNUYWJCYXJ8fGUuJHBhZ2UubWV0YS52aXNpYmxlfSl9dmFyIGV1PXt9O2Z1bmN0aW9uIHR1KGUpe3ZhciB0PWUudXJsLG49ZS5wYXRoLGk9ZS5xdWVyeSxyPWUub3BlblR5cGUsbz1lLndlYnZpZXcsYT1lLmV2ZW50Q2hhbm5lbDtpZihvJiZLYygpLGV1W3RdJiYobz1ldVt0XSkuX19wYWdlX18pe2lmKCFRYyghMCkuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZT09PW8uX19wYWdlX199KSlyZXR1cm4gYSYmKG8uX19wYWdlX18uZXZlbnRDaGFubmVsPWEpLFpjLnB1c2goby5fX3BhZ2VfXyksbztvPW51bGx9dmFyIHM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShQdi5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT1ufSkpKTsicmVMYXVuY2giPT09cnx8ISR2LnJlYWxFbnRyeVBhZ2VQYXRoJiYwPT09UWMoKS5sZW5ndGg/cy5tZXRhLmlzUXVpdD0hMDpzLm1ldGEuaXNUYWJCYXJ8fChzLm1ldGEuaXNRdWl0PSExKSxvPyhvPUN2LndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoby5pZCkpLm52dWU9cy5tZXRhLmlzTlZ1ZTpvPVBjKG4scyxpKSxzLm1ldGEuaXNUYWJCYXImJihzLm1ldGEudmlzaWJsZT0hMCkscy5tZXRhLmlzVGFiQmFyJiZMYS5hcHBlbmQobyk7dmFyIGM9IjEiPT09by5pZCYmby5udnVlO01jKG8scyxuLGkpO3ZhciB1PW4uc2xpY2UoMSksbD17cm91dGU6by5fX3VuaWFwcF9yb3V0ZT11LG9wdGlvbnM6T2JqZWN0LmFzc2lnbih7fSxpfHx7fSksJGdldEFwcFdlYnZpZXc6ZnVuY3Rpb24oKXtyZXR1cm4gQ3Yud2Vidmlldy5nZXRXZWJ2aWV3QnlJZChvLmlkKX0sZXZlbnRDaGFubmVsOmEsJHBhZ2U6e2lkOnBhcnNlSW50KG8uaWQpLG1ldGE6cy5tZXRhLHBhdGg6bixyb3V0ZTp1LGZ1bGxQYXRoOnQsb3BlblR5cGU6cn0sJHJlbW92ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1aYy5maW5kSW5kZXgoZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10fSk7LTEhPT1lJiYoby5udnVlfHx0aGlzLiR2bS4kZGVzdHJveSgpLFpjLnNwbGljZShlLDEpKX0sc2VsZWN0Q29tcG9uZW50OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLiR2bS5zZWxlY3RDb21wb25lbnQoZSl9LHNlbGVjdEFsbENvbXBvbmVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuJHZtLnNlbGVjdEFsbENvbXBvbmVudHMoZSl9fTtpZihaYy5wdXNoKGwpLG8uX19wcmVsb2FkX18mJihvLl9fcGFnZV9fPWwpLGMmJigkdi5zcGxhc2hzY3JlZW4mJiR2LnNwbGFzaHNjcmVlbi5hdXRvY2xvc2UmJiEkdi5zcGxhc2hzY3JlZW4uYWx3YXlzU2hvd0JlZm9yZVJlbmRlciYmQ3YubmF2aWdhdG9yLmNsb3NlU3BsYXNoc2NyZWVuKCksJHYub25SZWFkeShmdW5jdGlvbigpe0ZjKCl9KSksIW8ubnZ1ZSl7dmFyIGQ9by5pZDt0cnl7WnModSxmdW5jdGlvbigpe3ZhciBlLHQsbixyOyhlPXUsdD1kLG49aSxyPWwsWGNbZV18fGNvbnNvbGUuZXJyb3IoZSsiIG5vdCBmb3VuZCIpLG5ldyhZYyhlKSkoe21wVHlwZToicGFnZSIscGFnZUlkOnQscGFnZVBhdGg6ZSxwYWdlUXVlcnk6bixwYWdlSW5zdGFuY2U6cn0pKS4kbW91bnQoKX0pfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoZSl9fXJldHVybiBvfWZ1bmN0aW9uIG51KGUsdCl7dmFyIG49ZS51cmwscj1lLnBhdGgsaT1lLnF1ZXJ5LG89ZS5ldmVudHMsYT1lLmFuaW1hdGlvblR5cGUscz1lLmFuaW1hdGlvbkR1cmF0aW9uO1R2LmVtaXQoIm9uQXBwUm91dGUiLHt0eXBlOiJuYXZpZ2F0ZVRvIixwYXRoOnJ9KTt2YXIgYz0odm9pZCAwPT09ITEmJiEwLG5ldyBIYygrK0djLG8pKTtWYyh0dSh7dXJsOm4scGF0aDpyLHF1ZXJ5Omksb3BlblR5cGU6Im5hdmlnYXRlIixldmVudENoYW5uZWw6Y30pLGEscyxmdW5jdGlvbigpe29pKHQse2Vyck1zZzoibmF2aWdhdGVUbzpvayIsZXZlbnRDaGFubmVsOmN9KX0pLGxpKCl9ZnVuY3Rpb24gcnUoZSx0KXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9e30pLEFycmF5LmlzQXJyYXkoZVt0XSkmJmVbdF0ubGVuZ3RofWZ1bmN0aW9uIGl1KGUscil7dmFyIHQ9ZS51cmwsbj1lLnBhdGgsaT1lLnF1ZXJ5LG89ZS5leGlzdHMsYT1MdigpLHM9YS5sZW5ndGgtMTtpZigiYmFjayI9PT1vKXt2YXIgYz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9THYoKSxuPXQubGVuZ3RoO24tLTspe3ZhciByPXRbbl07aWYoci4kcGFnZSYmci4kcGFnZS5mdWxsUGF0aD09PWUpcmV0dXJuIG59cmV0dXJuLTF9KHQpO2lmKC0xIT09Yyl7dmFyIHU9cy1jO2lmKDA8dSlyZXR1cm4gV2Moe2RlbHRhOnV9KSx2b2lkIG9pKHIse2Vyck1zZzoicmVkaXJlY3RUbzpvayJ9KX19dmFyIGw9YVtzXTtsJiZsLiRyZW1vdmUoKSxWYyh0dSh7dXJsOnQscGF0aDpuLHF1ZXJ5Omksb3BlblR5cGU6InJlZGlyZWN0In0pLCJub25lIiwwLGZ1bmN0aW9uKCl7aWYobCl7dmFyIGU9bC4kZ2V0QXBwV2VidmlldygpO2UuX19wcmVsb2FkX18mJih0PWUsKG49T2JqZWN0LmtleXMoZXUpLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGV1W2VdLmlkPT09dC5pZH0pKSYmZGVsZXRlIGV1W25dKSxlLmNsb3NlKCJub25lIil9dmFyIHQsbjtvaShyLHtlcnJNc2c6InJlZGlyZWN0VG86b2sifSl9KSxsaSgpfXZhciBvdSxhdSxzdSxjdSx1dT0iX19UWVBFIixsdT0idW5pLXN0b3JhZ2Uta2V5cyI7ZnVuY3Rpb24gZHUoZSl7dHJ5e3ZhciB0PSJzdHJpbmciPT10eXBlb2YgZT9KU09OLnBhcnNlKGUpOmUsbj10LnR5cGU7aWYoMDw9WyJvYmplY3QiLCJzdHJpbmciLCJudW1iZXIiLCJib29sZWFuIiwidW5kZWZpbmVkIl0uaW5kZXhPZihuKSl7dmFyIHI9T2JqZWN0LmtleXModCk7aWYoMj09PXIubGVuZ3RoJiYiZGF0YSJpbiB0KXtpZih0eXBlb2YgdC5kYXRhPT09bilyZXR1cm4gdC5kYXRhO2lmKCJvYmplY3QiPT09biYmL15cZHs0fS1cZHsyfS1cZHsyfVRcZHsyfVw6XGR7Mn1cOlxkezJ9XC5cZHszfVokLy50ZXN0KHQuZGF0YSkpcmV0dXJuIG5ldyBEYXRlKHQuZGF0YSl9ZWxzZSBpZigxPT09ci5sZW5ndGgpcmV0dXJuIiJ9fWNhdGNoKGUpe319ZnVuY3Rpb24gZnUoZSx0KXt2YXIgbj10O2lmKCJzdHJpbmciIT09ZXx8InN0cmluZyI9PT1lJiYneyJ0eXBlIjoidW5kZWZpbmVkIn0nPT09dCl0cnl7dmFyIHI9SlNPTi5wYXJzZSh0KSxpPWR1KHIpO2lmKHZvaWQgMCE9PWkpbj1pO2Vsc2UgaWYoZSYmInN0cmluZyI9PXR5cGVvZihuPXIpKXt2YXIgbz10eXBlb2Yocj1KU09OLnBhcnNlKHIpKTsibnVtYmVyIj09PW8mJiJkYXRlIj09PWU/bj1uZXcgRGF0ZShyKTpvPT09KFsibnVsbCIsImFycmF5Il0uaW5kZXhPZihlKTwwP2U6Im9iamVjdCIpJiYobj1yKX19Y2F0Y2goZSl7fXJldHVybiBufWZ1bmN0aW9uIHB1KCl7Zm9yKHZhciBlPUN2LnN0b3JhZ2UubGVuZ3RofHxDdi5zdG9yYWdlLmdldExlbmd0aCgpfHwwLHQ9W10sbj0wLHI9MDtyPGU7cisrKXt2YXIgaT1Ddi5zdG9yYWdlLmtleShyKTtpZihpIT09bHUmJihpLmluZGV4T2YodXUpPDB8fGkuaW5kZXhPZih1dSkrdXUubGVuZ3RoIT09aS5sZW5ndGgpKXt2YXIgbz1Ddi5zdG9yYWdlLmdldEl0ZW0oaSk7bis9aS5sZW5ndGgrby5sZW5ndGgsdC5wdXNoKGkpfX1yZXR1cm57a2V5czp0LGN1cnJlbnRTaXplOk1hdGguY2VpbCgyKm4vMTAyNCksbGltaXRTaXplOk51bWJlci5NQVhfVkFMVUUsZXJyTXNnOiJnZXRTdG9yYWdlSW5mbzpvayJ9fWZ1bmN0aW9uIGh1KGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLnRpdGxlO3ZvaWQgMD09PXQmJih0PSIiKTt2YXIgbj1lLmljb247dm9pZCAwPT09biYmKG49InN1Y2Nlc3MiKTt2YXIgcj1lLmltYWdlO3ZvaWQgMD09PXImJihyPSIiKTt2YXIgaT1lLmR1cmF0aW9uO3ZvaWQgMD09PWkmJihpPTE1MDApO3ZhciBvPWUubWFzazt2b2lkIDA9PT1vJiYobz0hMSk7dmFyIGE9ZS5wb3NpdGlvbjt2b2lkIDA9PT1hJiYoYT0iIik7dmFyIHM9ZS50eXBlO3ZvaWQgMD09PXMmJihzPSJ0b2FzdCIpO3ZhciBjPWUuc3R5bGU7aWYodnUobnVsbCksYXU9cyxbInRvcCIsImNlbnRlciIsImJvdHRvbSJdLmluY2x1ZGVzKGEpKUN2Lm5hdGl2ZVVJLnRvYXN0KHQse3ZlcnRpY2FsQWxpZ246YX0pLG91PSEwO2Vsc2V7biYmIX5bInN1Y2Nlc3MiLCJsb2FkaW5nIiwiZXJyb3IiLCJub25lIl0uaW5kZXhPZihuKSYmKG49InN1Y2Nlc3MiKTt2YXIgdT17bW9kYWw6byxiYWNrOiJ0cmFuc21pdCIscGFkZGluZzoiMTBweCIsc2l6ZToiMTZweCJ9O3J8fG4mJiJub25lIiE9PW4/KHUud2lkdGg9IjE0MHB4Iix1LmhlaWdodD0iMTEycHgiKTp1LmxvYWRpbmc9e2Rpc3BsYXk6Im5vbmUifSxyP3UubG9hZGluZz17ZGlzcGxheToiYmxvY2siLGhlaWdodDoiNTVweCIsaWNvbjpyLGludGVydmFsOml9Oi0xIT09WyJzdWNjZXNzIiwiZXJyb3IiXS5pbmRleE9mKG4pJiYodS5sb2FkaW5nPXtkaXNwbGF5OiJibG9jayIsaGVpZ2h0OiI1NXB4IixpY29uOiJzdWNjZXNzIj09PW4/Il9fdW5pYXBwc3VjY2Vzcy5wbmciOiJfX3VuaWFwcGVycm9yLnBuZyIsaW50ZXJ2YWw6aX0pLG91PUN2Lm5hdGl2ZVVJLnNob3dXYWl0aW5nKHQsT2JqZWN0LmFzc2lnbih1LGMpKX1yZXR1cm4gc3U9T3YoZnVuY3Rpb24oKXt2dShudWxsKX0saSkse2Vyck1zZzoic2hvd1RvYXN0Om9rIn19ZnVuY3Rpb24gdnUoZSl7aWYodm9pZCAwPT09ZSYmKGU9InRvYXN0IiksIWV8fGU9PT1hdSlyZXR1cm4gc3UmJihFdihzdSksc3U9bnVsbCksITA9PT1vdT9Ddi5uYXRpdmVVSS5jbG9zZVRvYXN0KCk6b3UmJm91LmNsb3NlJiZvdS5jbG9zZSgpLGF1PW91PW51bGwse2Vyck1zZzoiaGlkZTpvayJ9fXZhciBndT17fTtmdW5jdGlvbiBtdShlKXt2YXIgbj1ndVtlXTtyZXR1cm4gbnx8KG49e2lkOjEsY2FsbGJhY2tzOk9iamVjdC5jcmVhdGUobnVsbCl9LGd1W2VdPW4pLHtnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG4uY2FsbGJhY2tzW2VdfSxwb3A6ZnVuY3Rpb24oZSl7dmFyIHQ9bi5jYWxsYmFja3NbZV07cmV0dXJuIHQmJmRlbGV0ZSBuLmNhbGxiYWNrc1tlXSx0fSxwdXNoOmZ1bmN0aW9uKGUpe3ZhciB0PW4uaWQrKztyZXR1cm4gbi5jYWxsYmFja3NbdF09ZSx0fX19dmFyIHl1PW11KCJyZXF1ZXN0Q29tcG9uZW50SW5mbyIpO2Z1bmN0aW9uIF91KG4pe3ZhciByPXt9O3JldHVybiBPYmplY3Qua2V5cyhufHx7fSkuZm9yRWFjaChmdW5jdGlvbihlKXtpZigwPT09ZS5pbmRleE9mKCJkYXRhIikpe3ZhciB0PWUucmVwbGFjZSgiZGF0YSIsIiIpO3Q9dC5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSt0LnNsaWNlKDEpLHJbdF09bltlXX19KSxyfWZ1bmN0aW9uIGJ1KGUsdCxuKXt2YXIgcj1lLl8kd2VleC5yZXF1aXJlTW9kdWxlKCJkb20iKSxpPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl0uc2VsZWN0b3I7MD09PXIuaW5kZXhPZigiIyIpJiZ0LnB1c2goci5zdWJzdHJpbmcoMSkpfXJldHVybiB0fSh0KSxvPW5ldyBBcnJheShpLmxlbmd0aCk7IWZ1bmN0aW9uIGUodCxuLHIpe3ZhciBpPW4uY2hpbGRyZW47aWYoIUFycmF5LmlzQXJyYXkoaSkpcmV0dXJuITE7Zm9yKHZhciBvPTA7bzxpLmxlbmd0aDtvKyspe3ZhciBhPWlbb107aWYoYS5hdHRyKXt2YXIgcz10LmluZGV4T2YoYS5hdHRyLmlkKTtpZigwPD1zJiYocltzXT17aWQ6dFtzXSxyZWY6YS5yZWYsZGF0YXNldDpfdShhLmF0dHIpfSwxPT09dC5sZW5ndGgpKWJyZWFrfWEuY2hpbGRyZW4mJmUodCxhLHIpfX0oaSxlLiRlbCxvKSxmdW5jdGlvbiB0KG4scixpLG8sYSl7dmFyIHM9cltpXTtuLmdldENvbXBvbmVudFJlY3Qocy5yZWYsZnVuY3Rpb24oZSl7ZS5zaXplLmlkPXMuaWQsZS5zaXplLmRhdGFzZXQ9cy5kYXRhc2V0LG8ucHVzaChlLnNpemUpLChpKz0xKTxyLmxlbmd0aD90KG4scixpLG8sYSk6YShvKX0pfShyLG8sMCxbXSxmdW5jdGlvbihlKXtuKGUpfSl9ZnVuY3Rpb24gd3UoZSx0LG4scil7VHYucHVibGlzaEhhbmRsZXIodCx7dHlwZTpuLGRhdGE6cn0sZSl9VHYuc3Vic2NyaWJlKCJvbkFkTWV0aG9kQ2FsbGJhY2siLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jYWxsYmFja0lkOyFmdW5jdGlvbihlLG4sdCl7dmFyIHI9ZS5hZHBpZCxpPWUud2lkdGgsbz1yKyItIitpLGE9a3Vbb107aWYoYSYmMDxhLmxlbmd0aClyZXR1cm4gbihhLnNwbGljZSgwLDEpWzBdKTtDdi5hZC5nZXRBZHMoZSxmdW5jdGlvbihlKXt2YXIgdD1lLmFkcztuKHQuc3BsaWNlKDAsMSlbMF0pLGt1W29dPWE/YS5jb25jYXQodCk6dH0sZnVuY3Rpb24oZSl7dCh7ZXJyQ29kZTplLmNvZGUsZXJyTXNnOmUubWVzc2FnZX0pfSl9KGUuZGF0YSxmdW5jdGlvbihlKXt3dSh0LG4sInN1Y2Nlc3MiLGUpfSxmdW5jdGlvbihlKXt3dSh0LG4sImZhaWwiLGUpfSl9KTt2YXIga3U9e307dmFyIFN1PVsibG9hZCIsImNsb3NlIiwidmVyaWZ5IiwiZXJyb3IiLCJhZENsaWNrZWQiXSx4dT1bLTUwMDEsLTUwMDIsLTUwMDMsLTUwMDQsLTUwMDUsLTUwMDZdLEN1PXtjb2RlOi01MDA4LGVyck1zZzoi5bm/5ZGK5pWw5o2u5bey6L+H5pyf77yM6K+36YeN5paw5Yqg6L29In0sVHU9ImNzaiIsT3U9ZnVuY3Rpb24oZSl7dmFyIGk9dGhpczt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49dGhpcy5fY2FsbGJhY2tzPXt9O1N1LmZvckVhY2goZnVuY3Rpb24odCl7blt0XT1bXTt2YXIgZT10WzBdLnRvVXBwZXJDYXNlKCkrdC5zdWJzdHIoMSk7aVsib24iK2VdPWZ1bmN0aW9uKGUpe25bdF0ucHVzaChlKX19KSx0aGlzLl9wcmVsb2FkPXZvaWQgMD09PWUucHJlbG9hZHx8ZS5wcmVsb2FkLHRoaXMuX2lzTG9hZD0hMSx0aGlzLl9pc0xvYWRpbmc9ITEsdGhpcy5fYWRFcnJvcj0iIix0aGlzLl9sb2FkUHJvbWlzZVJlc29sdmU9bnVsbCx0aGlzLl9sb2FkUHJvbWlzZVJlamVjdD1udWxsLHRoaXMuX2xhc3RMb2FkVGltZT0wO3ZhciB0PXRoaXMuX3Jld2FyZEFkPUN2LmFkLmNyZWF0ZVJld2FyZGVkVmlkZW9BZChlKTt0Lm9uTG9hZChmdW5jdGlvbihlKXtpLl9pc0xvYWQ9ITAsaS5faXNMb2FkaW5nPSExLGkuX2xhc3RMb2FkVGltZT1EYXRlLm5vdygpLGkuX2Rpc3BhdGNoRXZlbnQoImxvYWQiLHt9KSxudWxsIT1pLl9sb2FkUHJvbWlzZVJlc29sdmUmJihpLl9sb2FkUHJvbWlzZVJlc29sdmUoKSxpLl9sb2FkUHJvbWlzZVJlc29sdmU9bnVsbCl9KSx0Lm9uQ2xvc2UoZnVuY3Rpb24oZSl7aS5faXNMb2FkPSExLGkuX2lzTG9hZGluZz0hMSxpLl9wcmVsb2FkJiZpLl9sb2FkQWQoKSxpLl9kaXNwYXRjaEV2ZW50KCJjbG9zZSIse2lzRW5kZWQ6ZS5pc0VuZGVkfSl9KSx0Lm9uVmVyaWZ5JiZ0Lm9uVmVyaWZ5KGZ1bmN0aW9uKGUpe2kuX2Rpc3BhdGNoRXZlbnQoInZlcmlmeSIse2lzVmFsaWQ6ZS5pc1ZhbGlkfSl9KSx0Lm9uRXJyb3IoZnVuY3Rpb24oZSl7aS5faXNMb2FkaW5nPSExO3ZhciB0PWUuY29kZSxuPWUubWVzc2FnZSxyPXtjb2RlOnQsZXJyTXNnOm59O2kuX2FkRXJyb3I9biwtNTAwOD09PXQmJihpLl9pc0xvYWQ9ITEpLGkuX2Rpc3BhdGNoRXZlbnQoImVycm9yIixyKSwtNTAwNSE9PXQmJi0xIT09eHUuaW5kZXgodCl8fG51bGw9PWkuX2xvYWRQcm9taXNlUmVqZWN0fHwoaS5fbG9hZFByb21pc2VSZWplY3QociksaS5fbG9hZFByb21pc2VSZWplY3Q9bnVsbCl9KSx0Lm9uQWRDbGlja2VkKGZ1bmN0aW9uKGUpe2kuX2Rpc3BhdGNoRXZlbnQoImFkQ2xpY2tlZCIse30pfSksdGhpcy5fbG9hZEFkKCl9LEV1PXtpc0V4cGlyZWQ6e2NvbmZpZ3VyYWJsZTohMH19O0V1LmlzRXhwaXJlZC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMCE9PXRoaXMuX2xhc3RMb2FkVGltZSYmMThlNTxNYXRoLmFicyhEYXRlLm5vdygpLXRoaXMuX2xhc3RMb2FkVGltZSl9LE91LnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKCl7dmFyIG49dGhpcztyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSx0KXtuLl9sb2FkUHJvbWlzZVJlc29sdmU9ZSxuLl9sb2FkUHJvbWlzZVJlamVjdD10LG4uX2lzTG9hZGluZ3x8KG4uX2lzTG9hZD9lKCk6bi5fbG9hZEFkKCkpfSl9LE91LnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dmFyIG49dGhpcztyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSx0KXtpZighbi5faXNMb2FkaW5nKXtpZihuLmdldFByb3ZpZGVyKCk9PT1UdSYmbi5pc0V4cGlyZWQpcmV0dXJuIG4uX2lzTG9hZD0hMSxuLl9kaXNwYXRjaEV2ZW50KCJlcnJvciIsQ3UpLHZvaWQgdChuZXcgRXJyb3IoQ3UuZXJyTXNnKSk7bi5faXNMb2FkPyhuLl9yZXdhcmRBZC5zaG93KCksZSgpKTp0KG5ldyBFcnJvcihuLl9hZEVycm9yKSl9fSl9LE91LnByb3RvdHlwZS5nZXRQcm92aWRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZXdhcmRBZC5nZXRQcm92aWRlcigpfSxPdS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuX3Jld2FyZEFkLmRlc3Ryb3koKX0sT3UucHJvdG90eXBlLl9sb2FkQWQ9ZnVuY3Rpb24oKXt0aGlzLl9pc0xvYWQ9ITEsdGhpcy5faXNMb2FkaW5nPSEwLHRoaXMuX3Jld2FyZEFkLmxvYWQoKX0sT3UucHJvdG90eXBlLl9kaXNwYXRjaEV2ZW50PWZ1bmN0aW9uKGUsdCl7dGhpcy5fY2FsbGJhY2tzW2VdLmZvckVhY2goZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUodHx8e30pfSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE91LnByb3RvdHlwZSxFdSk7dmFyIEl1PSJsb2FkIixBdT0iY2xvc2UiLCR1PSJlcnJvciIsUHU9ImFkQ2xpY2tlZCIsTXU9W0l1LEF1LCR1LFB1XSxqdT1mdW5jdGlvbihlLHQpe3ZhciByPXRoaXMsbj10aGlzLl9jYWxsYmFja3M9e307TXUuZm9yRWFjaChmdW5jdGlvbih0KXtuW3RdPVtdO3ZhciBlPXRbMF0udG9VcHBlckNhc2UoKSt0LnN1YnN0cigxKTtyWyJvbiIrZV09ZnVuY3Rpb24oZSl7blt0XS5wdXNoKGUpfX0pLHRoaXMuX3ByZWxvYWQ9dm9pZCAwIT09dC5wcmVsb2FkJiZ0LnByZWxvYWQsdGhpcy5faXNMb2FkZWQ9ITEsdGhpcy5faXNMb2FkaW5nPSExLHRoaXMuX2FkRXJyb3I9IiIsdGhpcy5fbG9hZFByb21pc2VSZXNvbHZlPW51bGwsdGhpcy5fbG9hZFByb21pc2VSZWplY3Q9bnVsbCx0aGlzLl9zaG93UHJvbWlzZVJlc29sdmU9bnVsbCx0aGlzLl9zaG93UHJvbWlzZVJlamVjdD1udWxsO3ZhciBpPXRoaXMuX2FkPWU7aS5vbkxvYWQoZnVuY3Rpb24oZSl7ci5faXNMb2FkZWQ9ITAsci5faXNMb2FkaW5nPSExLG51bGwhPXIuX2xvYWRQcm9taXNlUmVzb2x2ZSYmKHIuX2xvYWRQcm9taXNlUmVzb2x2ZSgpLHIuX2xvYWRQcm9taXNlUmVzb2x2ZT1udWxsKSxudWxsIT1yLl9zaG93UHJvbWlzZVJlc29sdmUmJihyLl9zaG93UHJvbWlzZVJlc29sdmUoKSxyLl9zaG93UHJvbWlzZVJlc29sdmU9bnVsbCxyLl9zaG93QWQoKSksci5fZGlzcGF0Y2hFdmVudChJdSx7fSl9KSxpLm9uQ2xvc2UoZnVuY3Rpb24oZSl7ci5faXNMb2FkZWQ9ITEsci5faXNMb2FkaW5nPSExLHIuX2Rpc3BhdGNoRXZlbnQoQXUse2lzRW5kZWQ6ZS5pc0VuZGVkfSksITA9PT1yLl9wcmVsb2FkJiZyLl9sb2FkQWQoKX0pLGkub25FcnJvcihmdW5jdGlvbihlKXtyLl9pc0xvYWRpbmc9ITE7dmFyIHQ9e2NvZGU6ZS5jb2RlLGVyck1zZzplLm1lc3NhZ2V9O3IuX2FkRXJyb3I9dCxyLl9kaXNwYXRjaEV2ZW50KCR1LHQpO3ZhciBuPW5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShyLl9hZEVycm9yKSk7bi5jb2RlPWUuY29kZSxuLmVyck1zZz1lLm1lc3NhZ2UsbnVsbCE9ci5fbG9hZFByb21pc2VSZWplY3QmJihyLl9sb2FkUHJvbWlzZVJlamVjdChuKSxyLl9sb2FkUHJvbWlzZVJlamVjdD1udWxsKSxudWxsIT1yLl9zaG93UHJvbWlzZVJlamVjdCYmKHIuX3Nob3dQcm9taXNlUmVqZWN0KG4pLHIuX3Nob3dQcm9taXNlUmVqZWN0PW51bGwpfSksaS5vbkFkQ2xpY2tlZCYmaS5vbkFkQ2xpY2tlZChmdW5jdGlvbihlKXtyLl9kaXNwYXRjaEV2ZW50KFB1LHt9KX0pfTtqdS5wcm90b3R5cGUubG9hZD1mdW5jdGlvbigpe3ZhciBuPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUsdCl7bi5fbG9hZFByb21pc2VSZXNvbHZlPWUsbi5fbG9hZFByb21pc2VSZWplY3Q9dCxuLl9pc0xvYWRpbmd8fChuLl9pc0xvYWRlZD9lKCk6bi5fbG9hZEFkKCkpfSl9LGp1LnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dmFyIG49dGhpcztyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSx0KXtuLl9zaG93UHJvbWlzZVJlc29sdmU9ZSxuLl9zaG93UHJvbWlzZVJlamVjdD10LG4uX2lzTG9hZGluZ3x8KG4uX2lzTG9hZGVkPyhuLl9zaG93QWQoKSxlKCkpOm4uX2xvYWRBZCgpKX0pfSxqdS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuX2FkLmRlc3Ryb3koKX0sanUucHJvdG90eXBlLmdldFByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FkLmdldFByb3ZpZGVyKCl9LGp1LnByb3RvdHlwZS5fbG9hZEFkPWZ1bmN0aW9uKCl7dGhpcy5fYWRFcnJvcj0iIix0aGlzLl9pc0xvYWRlZD0hMSx0aGlzLl9pc0xvYWRpbmc9ITAsdGhpcy5fYWQubG9hZCgpfSxqdS5wcm90b3R5cGUuX3Nob3dBZD1mdW5jdGlvbigpe3RoaXMuX2FkLnNob3coKX0sanUucHJvdG90eXBlLl9kaXNwYXRjaEV2ZW50PWZ1bmN0aW9uKGUsdCl7dGhpcy5fY2FsbGJhY2tzW2VdLmZvckVhY2goZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUodHx8e30pfSl9O3ZhciBMdT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPXt9KSx0LmNhbGwodGhpcyxDdi5hZC5jcmVhdGVGdWxsU2NyZWVuVmlkZW9BZChlKSxlKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLChlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSkuY29uc3RydWN0b3I9ZX0oanUpO3ZhciBCdT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPXt9KSx0LmNhbGwodGhpcyxDdi5hZC5jcmVhdGVJbnRlcnN0aXRpYWxBZChlKSxlKSx0aGlzLl9sb2FkQWQoKX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLChlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSkuY29uc3RydWN0b3I9ZX0oanUpO3ZhciBOdT17fSxEdT17fTt2YXIgUnU9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcyxyPXRoaXMuX2NhbGxiYWNrcz17fTtNdS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JbdF09W107dmFyIGU9dFswXS50b1VwcGVyQ2FzZSgpK3Quc3Vic3RyKDEpO25bIm9uIitlXT1mdW5jdGlvbihlKXtyW3RdLnB1c2goZSl9fSksdGhpcy5fYWQ9bnVsbCx0aGlzLl9hZEVycm9yPSIiLHRoaXMuX2FkcGlkPWUuYWRwaWQsdGhpcy5fcHJvdmlkZXI9ZS5wcm92aWRlcix0aGlzLl91c2VyRGF0YT1lLnVzZXJEYXRhfHx7fSx0aGlzLl9pc0xvYWRlZD0hMSx0aGlzLl9pc0xvYWRpbmc9ITEsdGhpcy5fbG9hZFByb21pc2VSZXNvbHZlPW51bGwsdGhpcy5fbG9hZFByb21pc2VSZWplY3Q9bnVsbCx0aGlzLl9zaG93UHJvbWlzZVJlc29sdmU9bnVsbCx0aGlzLl9zaG93UHJvbWlzZVJlamVjdD1udWxsLE92KGZ1bmN0aW9uKCl7bi5faW5pdCgpfSl9O1J1LnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fYWRFcnJvcj0iIixmdW5jdGlvbihlKXt2YXIgcj1lLnByb3ZpZGVyO2lmKE51W3JdfHwoTnVbcl09e30pLCJvYmplY3QiIT10eXBlb2YgTnVbcl0uaW5zdGFuY2UpaWYoRHVbcl18fChEdVtyXT1bXSksRHVbcl0ucHVzaChlKSwhMCE9PU51W3JdLmxvYWRpbmcpe051W3JdLmxvYWRpbmc9ITA7dmFyIGk9YWkocil8fHt9LHQ9aS5pbml0fHxpLmluaXRTREs7aWYoIXQpcmV0dXJuIER1W3JdLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5mYWlsKHtjb2RlOi0xLG1lc3NhZ2U6InByb3ZpZGVyIFsiK3IrIl0gaW52YWxpZCJ9KX0pLER1W3JdLmxlbmd0aD0wLE51W3JdLmxvYWRpbmc9ITE7TnVbcl0ucGx1Z2luPWksZS5fX3BsdWdpbj1pLHQoZnVuY3Rpb24odCl7dmFyIGU9dC5jb2RlLG49IkJYTS1BRCI9PT1yPzA9PT1lfHwxPT09ZTowPT09ZTtuP051W3JdLmluc3RhbmNlPWk6TnVbcl0ubG9hZGluZz0hMSxEdVtyXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe24/ZS5zdWNjZXNzKGUuX19wbHVnaW4pOmUuZmFpbCh0KX0pLER1W3JdLmxlbmd0aD0wfSl9ZWxzZSBlLl9fcGx1Z2luPU51W3JdLnBsdWdpbjtlbHNlIGUuc3VjY2VzcyhOdVtyXS5pbnN0YW5jZSl9KHtwcm92aWRlcjp0aGlzLl9wcm92aWRlcixzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuX2FkPWUsdC5fdXNlckRhdGEmJnQuYmluZFVzZXJEYXRhKHQuX3VzZXJEYXRhKSx0Ll9sb2FkQWQoKX0sZmFpbDpmdW5jdGlvbihlKXt0Ll9hZEVycm9yPWUsdC5fZGlzcGF0Y2hFdmVudCgkdSxlKX19KX0sUnUucHJvdG90eXBlLmdldFByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb3ZpZGVyfSxSdS5wcm90b3R5cGUubG9hZD1mdW5jdGlvbigpe3ZhciBuPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUsdCl7bi5fbG9hZFByb21pc2VSZXNvbHZlPWUsbi5fbG9hZFByb21pc2VSZWplY3Q9dCxuLl9pc0xvYWRpbmd8fChuLl9hZEVycm9yP24uX2luaXQoKTpuLl9pc0xvYWRlZD9lKCk6bi5fbG9hZEFkKCkpfSl9LFJ1LnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dmFyIG49dGhpcztyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSx0KXtuLl9zaG93UHJvbWlzZVJlc29sdmU9ZSxuLl9zaG93UHJvbWlzZVJlamVjdD10LG4uX2lzTG9hZGluZ3x8KG4uX2FkRXJyb3I/bi5faW5pdCgpOm4uX2lzTG9hZGVkPyhuLl9zaG93QWQoKSxlKCkpOm4uX2xvYWRBZCgpKX0pfSxSdS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe251bGwhPT10aGlzLl9hZCYmdGhpcy5fYWQuZGVzdHJveSYmdGhpcy5fYWQuZGVzdHJveSh7YWRwaWQ6dGhpcy5fYWRwaWR9KX0sUnUucHJvdG90eXBlLmJpbmRVc2VyRGF0YT1mdW5jdGlvbihlKXtudWxsIT09dGhpcy5fYWQmJnRoaXMuX2FkLmJpbmRVc2VyRGF0YSYmdGhpcy5fYWQuYmluZFVzZXJEYXRhKGUpfSxSdS5wcm90b3R5cGUuX2xvYWRBZD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYobnVsbCE9PXRoaXMuX2FkKXtpZighMD09PXRoaXMuX2lzTG9hZGluZylyZXR1cm47dGhpcy5faXNMb2FkaW5nPSEwLHRoaXMuX2FkLmxvYWREYXRhKE9iamVjdC5hc3NpZ24oe30se2FkcGlkOnRoaXMuX2FkcGlkfSx0aGlzLl91c2VyRGF0YSksZnVuY3Rpb24oZSl7dC5faXNMb2FkZWQ9ITAsdC5faXNMb2FkaW5nPSExLG51bGwhPXQuX2xvYWRQcm9taXNlUmVzb2x2ZSYmKHQuX2xvYWRQcm9taXNlUmVzb2x2ZSgpLHQuX2xvYWRQcm9taXNlUmVzb2x2ZT1udWxsKSxudWxsIT10Ll9zaG93UHJvbWlzZVJlc29sdmUmJih0Ll9zaG93UHJvbWlzZVJlc29sdmUoKSx0Ll9zaG93UHJvbWlzZVJlc29sdmU9bnVsbCx0Ll9zaG93QWQoKSksdC5fZGlzcGF0Y2hFdmVudChJdSxlKX0sZnVuY3Rpb24oZSl7dC5faXNMb2FkaW5nPSExLG51bGwhPXQuX3Nob3dQcm9taXNlUmVqZWN0JiYodC5fc2hvd1Byb21pc2VSZWplY3QodC5fY3JlYXRlRXJyb3IoZSkpLHQuX3Nob3dQcm9taXNlUmVqZWN0PW51bGwpLHQuX2Rpc3BhdGNoRXZlbnQoJHUsZSl9KX19LFJ1LnByb3RvdHlwZS5fc2hvd0FkPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztudWxsIT09dGhpcy5fYWQmJiEwPT09dGhpcy5faXNMb2FkZWQmJnRoaXMuX2FkLnNob3coe2FkcGlkOnRoaXMuX2FkcGlkfSxmdW5jdGlvbihlKXt0Ll9pc0xvYWRlZD0hMX0sZnVuY3Rpb24oZSl7dC5faXNMb2FkZWQ9ITEsbnVsbCE9dC5fc2hvd1Byb21pc2VSZWplY3QmJih0Ll9zaG93UHJvbWlzZVJlamVjdCh0Ll9jcmVhdGVFcnJvcihlKSksdC5fc2hvd1Byb21pc2VSZWplY3Q9bnVsbCksdC5fZGlzcGF0Y2hFdmVudCgkdSxlKX0pfSxSdS5wcm90b3R5cGUuX2NyZWF0ZUVycm9yPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShlKSk7cmV0dXJuIHQuY29kZT1lLmNvZGUsdC5lcnJNc2c9ZS5tZXNzYWdlLHR9LFJ1LnByb3RvdHlwZS5fZGlzcGF0Y2hFdmVudD1mdW5jdGlvbihlLHQpe3RoaXMuX2NhbGxiYWNrc1tlXS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlKHR8fHt9KX0pfTt2YXIgRnU9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsc3RhcnRQdWxsRG93blJlZnJlc2g6ZnVuY3Rpb24oKXtyZXR1cm4gY3UmJmN1LmVuZFB1bGxUb1JlZnJlc2goKSwoY3U9Z2koKSk/KGN1LmJlZ2luUHVsbFRvUmVmcmVzaCgpLHtlcnJNc2c6InN0YXJ0UHVsbERvd25SZWZyZXNoOm9rIn0pOntlcnJNc2c6InN0YXJ0UHVsbERvd25SZWZyZXNoOmZhaWwifX0sc3RvcFB1bGxEb3duUmVmcmVzaDpmdW5jdGlvbigpe3JldHVybiBjdXx8KGN1PWdpKCkpLGN1PyhjdS5lbmRQdWxsVG9SZWZyZXNoKCksY3U9bnVsbCx7ZXJyTXNnOiJzdG9wUHVsbERvd25SZWZyZXNoOm9rIn0pOntlcnJNc2c6InN0b3BQdWxsRG93blJlZnJlc2g6ZmFpbCJ9fSwkb246UXIsJG9mZjplaSwkb25jZTp0aSwkZW1pdDpuaSxjcmVhdGVBdWRpb0luc3RhbmNlOmZ1bmN0aW9uKCl7dmFyIGU9IiIrRGF0ZS5ub3coKStNYXRoLnJhbmRvbSgpLHQ9TWlbZV09Q3YuYXVkaW8uY3JlYXRlUGxheWVyKCIiKTtyZXR1cm4gdC5zcmM9IiIsdC52b2x1bWU9MSx0LnN0YXJ0VGltZT0wLHQuc2V0U2Vzc2lvbkNhdGVnb3J5KFBpKSx7ZXJyTXNnOiJjcmVhdGVBdWRpb0luc3RhbmNlOm9rIixhdWRpb0lkOmV9fSxkZXN0cm95QXVkaW9JbnN0YW5jZTpmdW5jdGlvbihlKXt2YXIgdD1lLmF1ZGlvSWQ7cmV0dXJuIE1pW3RdJiYoTWlbdF0uY2xvc2UoKSxkZWxldGUgTWlbdF0pLHtlcnJNc2c6ImRlc3Ryb3lBdWRpb0luc3RhbmNlOm9rIixhdWRpb0lkOnR9fSxzZXRBdWRpb1N0YXRlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuYXVkaW9JZCxuPWUuc3JjLHI9ZS5zdGFydFRpbWUsaT1lLmF1dG9wbGF5O3ZvaWQgMD09PWkmJihpPSExKTt2YXIgbz1lLmxvb3A7dm9pZCAwPT09byYmKG89ITEpLGUub2JleU11dGVTd2l0Y2g7dmFyIGE9ZS52b2x1bWUscz1lLnNlc3Npb25DYXRlZ29yeTt2b2lkIDA9PT1zJiYocz1QaSk7dmFyIGMsdSxsPWUucGxheWJhY2tSYXRlLGQ9TWlbdF07aWYoZCl7dmFyIGY9e2xvb3A6byxhdXRvcGxheTppfTtpZihuKXt2YXIgcD1faShuKTtkLnNyYyE9PXAmJihkLnNyYz1mLnNyYz1wKX1yJiYoZC5zdGFydFRpbWU9Zi5zdGFydFRpbWU9ciksIm51bWJlciI9PXR5cGVvZiBhJiYoZC52b2x1bWU9Zi52b2x1bWU9YSksZC5zZXRTdHlsZXMoZikscyYmZC5zZXRTZXNzaW9uQ2F0ZWdvcnkocyksbCYmZC5wbGF5YmFja1JhdGUmJmQucGxheWJhY2tSYXRlKGwpLCh1PU1pW2M9dF0pJiYodS5pbml0U3RhdGVDaGFnZXx8KHUuaW5pdFN0YXRlQ2hhZ2U9ITAsdS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oZSl7TGkoImVycm9yIix7YXVkaW9JZDpjLGVyck1zZzoiTWVkaWFFcnJvciIsZXJyQ29kZTplLmNvZGV9KX0pLGppLmZvckVhY2goZnVuY3Rpb24oZSl7dS5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24oKXsicGxheSI9PT1lP3UuaXNTdG9wcGVkPSExOiJzdG9wIj09PWUmJih1LmlzU3RvcHBlZD0hMCksTGkoZSx7YXVkaW9JZDpjfSl9KX0pKSl9cmV0dXJue2Vyck1zZzoic2V0QXVkaW9TdGF0ZTpvayJ9fSxnZXRBdWRpb1N0YXRlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuYXVkaW9JZCxuPU1pW3RdO2lmKCFuKXJldHVybntlcnJNc2c6ImdldEF1ZGlvU3RhdGU6ZmFpbCJ9O3ZhciByPW4uc3JjLGk9bi5zdGFydFRpbWUsbz1uLnZvbHVtZTtyZXR1cm57ZXJyTXNnOiJnZXRBdWRpb1N0YXRlOm9rIixkdXJhdGlvbjoxZTMqKG4uZ2V0RHVyYXRpb24oKXx8MCksY3VycmVudFRpbWU6bi5pc1N0b3BwZWQ/MDoxZTMqbi5nZXRQb3NpdGlvbigpLHBhdXNlZDpuLmlzUGF1c2VkKCksc3JjOnIsdm9sdW1lOm8sc3RhcnRUaW1lOjFlMyppLGJ1ZmZlcmVkOjFlMypuLmdldEJ1ZmZlcmVkKCl9fSxvcGVyYXRlQXVkaW86ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vcGVyYXRpb25UeXBlLG49ZS5hdWRpb0lkLHI9ZS5jdXJyZW50VGltZSxpPU1pW25dLG89WyJwbGF5IiwicGF1c2UiLCJzdG9wIl07cmV0dXJuIDA8PW8uaW5kZXhPZih0KT9pW3Q9PT1vWzBdJiZpLmlzUGF1c2VkKCk/InJlc3VtZSI6dF0oKToic2VlayI9PT10JiZpLnNlZWtUbyhyLzFlMykse2Vyck1zZzoib3BlcmF0ZUF1ZGlvOm9rIn19LGdldE11c2ljUGxheWVyU3RhdGU6ZnVuY3Rpb24oKXt2YXIgZT1VaSgpO3JldHVybiBlP3tkYXRhVXJsOmUuc3JjLGR1cmF0aW9uOmUuZ2V0RHVyYXRpb24oKXx8MCxjdXJyZW50UG9zaXRpb246ZS5nZXRQb3NpdGlvbigpLHN0YXR1czplLmlzUGF1c2VkKCk/MDoxLGRvd25sb2FkUGVyY2VudDpNYXRoLnJvdW5kKDEwMCplLmdldEJ1ZmZlcmVkKCkvZS5nZXREdXJhdGlvbigpKSxlcnJNc2c6ImdldE11c2ljUGxheWVyU3RhdGU6b2sifTp7c3RhdHVzOjIsZXJyTXNnOiJnZXRNdXNpY1BsYXllclN0YXRlOm9rIn19LG9wZXJhdGVNdXNpY1BsYXllcjpxaSxzZXRCYWNrZ3JvdW5kQXVkaW9TdGF0ZTpmdW5jdGlvbihlLHQpe3JldHVybiBWaShlLHQpLHtlcnJNc2c6InNldEJhY2tncm91bmRBdWRpb1N0YXRlOm9rIn19LG9wZXJhdGVCYWNrZ3JvdW5kQXVkaW86ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vcGVyYXRpb25UeXBlLG49ZS5zcmMscj1lLnN0YXJ0VGltZSxpPWUuY3VycmVudFRpbWU7cmV0dXJuIHFpKHtvcGVyYXRpb25UeXBlOnQsZGF0YVVybDpuLHBvc2l0aW9uOnJ8fGl8fDAsYXBpOiJvcGVyYXRlQmFja2dyb3VuZEF1ZGlvIn0pfSxnZXRCYWNrZ3JvdW5kQXVkaW9TdGF0ZTpmdW5jdGlvbigpe3ZhciBlPXtkdXJhdGlvbjowLGN1cnJlbnRUaW1lOjAscGF1c2VkOiExLHNyYzoiIixidWZmZXJlZDowLHRpdGxlOiIiLGVwbmFtZToiIixzaW5nZXI6IiIsY292ZXJJbWdVcmw6IiIsd2ViVXJsOiIiLHN0YXJ0VGltZTowLGVyck1zZzoiZ2V0QmFja2dyb3VuZEF1ZGlvU3RhdGU6b2sifSx0PVVpKCk7aWYodCl7dmFyIG49e2R1cmF0aW9uOnQuZ2V0RHVyYXRpb24oKXx8MCxjdXJyZW50VGltZTp0LmlzU3RvcHBlZD8wOnQuZ2V0UG9zaXRpb24oKSxwYXVzZWQ6dC5pc1BhdXNlZCgpLHNyYzp0LnNyYyxidWZmZXJlZDp0LmdldEJ1ZmZlcmVkKCksdGl0bGU6dC50aXRsZSxlcG5hbWU6dC5lcG5hbWUsc2luZ2VyOnQuc2luZ2VyLGNvdmVySW1nVXJsOnQuY292ZXJJbWdVcmwsd2ViVXJsOnQud2ViVXJsLHN0YXJ0VGltZTp0LnN0YXJ0VGltZX07ZT1PYmplY3QuYXNzaWduKGUsbil9cmV0dXJuIGV9LG9wZXJhdGVNYXBQbGF5ZXI6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHMsYyx1LGw7dC4kcGFnZS5tZXRhLmlzTlZ1ZT8oYz1lLHU9dCxsPXIsUWlbbl0oSmkoYyx1KSxsKSk6KGk9ZSxvPW4sYT1yLHM9dC4kcGFnZS5pZCxUdi5wdWJsaXNoSGFuZGxlcihzKyItbWFwLSIraSx7bWFwSWQ6aSx0eXBlOm8sZGF0YTphfSxzKSl9LG9wZXJhdGVWaWRlb1BsYXllcjpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscyxjLHUsbDt0LiRwYWdlLm1ldGEuaXNOVnVlPyhjPWUsdT10LGw9cixlb1tuXShKaShjLHUpLGwpKTooaT1lLG89bixhPXIscz10LiRwYWdlLmlkLFR2LnB1Ymxpc2hIYW5kbGVyKHMrIi12aWRlby0iK2kse3ZpZGVvSWQ6aSx0eXBlOm8sZGF0YTphfSxzKSl9LExpdmVQdXNoZXJDb250ZXh0OmlvLGNyZWF0ZUxpdmVQdXNoZXJDb250ZXh0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuJHBhZ2UubWV0YS5pc05WdWU/ZnVuY3Rpb24oZSx0KXtpZighdClyZXR1cm4gY29uc29sZS53YXJuKCJ1bmkuY3JlYXRlTGl2ZVB1c2hlckNvbnRleHQ6IDIgYXJndW1lbnRzIHJlcXVpcmVkLCBidXQgb25seSAxIHByZXNlbnQiKTt2YXIgbj1KaShlLHQpO3JldHVybiBuP25ldyB0byhlLG4pOmNvbnNvbGUud2FybigiQ2FuIG5vdCBmaW5kIGAiK2UrImAiKX0oZSx0KTpuZXcgaW8oZSx0KX0sc3RhcnRBY2NlbGVyb21ldGVyOnBvLHN0b3BBY2NlbGVyb21ldGVyOmhvLG9uQWNjZWxlcm9tZXRlckNoYW5nZTpmdW5jdGlvbihlKXtmby5sZW5ndGh8fHBvKCksZm8ucHVzaChlKX0sb2ZmQWNjZWxlcm9tZXRlckNoYW5nZTpmdW5jdGlvbihlKXtpZihlKXt2YXIgdD1mby5pbmRleE9mKGUpOzA8PXQmJmZvLnNwbGljZSh0LDEpfWZvLmxlbmd0aHx8aG8oKX0sYWRkUGhvbmVDb250YWN0OmZ1bmN0aW9uKG4scil7Q3YuY29udGFjdHMuZ2V0QWRkcmVzc0Jvb2soQ3YuY29udGFjdHMuQUREUkVTU0JPT0tfUEhPTkUsZnVuY3Rpb24oZSl7IW4ucGhvdG9GaWxlUGF0aCYmKG4ucGhvdG9GaWxlUGF0aD0iIik7dmFyIHQ9ZS5jcmVhdGUoKTshZnVuY3Rpb24gcihpLG8sdCl7dmFyIGE9MDtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihuKXt2YXIgZT10W25dOyJvYmplY3QiIT10eXBlb2YgZT8tMSE9PWdvLmluZGV4T2Yobik/aVtuXT10W25dOnZvaWQgMCE9PW9bZV0/KGErKyxpW25dPW9bZV0pOmRlbGV0ZSBpW25dOmUgaW5zdGFuY2VvZiBBcnJheT8oaVtuXT1bXSxlLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9e307cih0LG8sZSkmJmlbbl0ucHVzaCh0KX0pLGlbbl0ubGVuZ3RoP2ErKzpkZWxldGUgaVtuXSk6KGlbbl09e30scihpW25dLG8sZSk/YSsrOmRlbGV0ZSBpW25dKX0pLGF9KHQsbix2byksdC5zYXZlKGZ1bmN0aW9uKCl7b2kocix7ZXJyTXNnOiJhZGRQaG9uZUNvbnRhY3Q6b2sifSl9LGZ1bmN0aW9uKGUpe29pKHIse2Vyck1zZzoiYWRkUGhvbmVDb250YWN0OmZhaWwifSl9KX0sZnVuY3Rpb24oZSl7b2kocix7ZXJyTXNnOiJhZGRQaG9uZUNvbnRhY3Q6ZmFpbCJ9KX0pfSxvbkJsdWV0b290aERldmljZUZvdW5kOm1vLG9uQmx1ZXRvb3RoQWRhcHRlclN0YXRlQ2hhbmdlOnlvLG9uQkxFQ29ubmVjdGlvblN0YXRlQ2hhbmdlOl9vLG9uQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZTpibyxvcGVuQmx1ZXRvb3RoQWRhcHRlcjpTbyxjbG9zZUJsdWV0b290aEFkYXB0ZXI6eG8sZ2V0Qmx1ZXRvb3RoQWRhcHRlclN0YXRlOkNvLHN0YXJ0Qmx1ZXRvb3RoRGV2aWNlc0Rpc2NvdmVyeTpUbyxzdG9wQmx1ZXRvb3RoRGV2aWNlc0Rpc2NvdmVyeTpPbyxnZXRCbHVldG9vdGhEZXZpY2VzOkVvLGdldENvbm5lY3RlZEJsdWV0b290aERldmljZXM6SW8sY3JlYXRlQkxFQ29ubmVjdGlvbjpBbyxjbG9zZUJMRUNvbm5lY3Rpb246JG8sZ2V0QkxFRGV2aWNlU2VydmljZXM6UG8sZ2V0QkxFRGV2aWNlQ2hhcmFjdGVyaXN0aWNzOk1vLG5vdGlmeUJMRUNoYXJhY3RlcmlzdGljVmFsdWVDaGFuZ2U6am8scmVhZEJMRUNoYXJhY3RlcmlzdGljVmFsdWU6TG8sd3JpdGVCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlOkJvLHNldEJMRU1UVTpObyxnZXRCTEVEZXZpY2VSU1NJOkRvLGdldFNjcmVlbkJyaWdodG5lc3M6ZnVuY3Rpb24oKXtyZXR1cm57ZXJyTXNnOiJnZXRTY3JlZW5CcmlnaHRuZXNzOm9rIix2YWx1ZTpDdi5zY3JlZW4uZ2V0QnJpZ2h0bmVzcyghMSl9fSxzZXRTY3JlZW5CcmlnaHRuZXNzOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLnZhbHVlO3JldHVybiBDdi5zY3JlZW4uc2V0QnJpZ2h0bmVzcyh0LCExKSx7ZXJyTXNnOiJzZXRTY3JlZW5CcmlnaHRuZXNzOm9rIn19LHNldEtlZXBTY3JlZW5PbjpmdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS5rZWVwU2NyZWVuT247cmV0dXJuIEN2LmRldmljZS5zZXRXYWtlbG9jayghIXQpLHtlcnJNc2c6InNldEtlZXBTY3JlZW5PbjpvayJ9fSxnZXRDbGlwYm9hcmREYXRhOmZ1bmN0aW9uKGUsdCl7YWkoImNsaXBib2FyZCIpLmdldFN0cmluZyhmdW5jdGlvbihlKXsic3VjY2VzcyI9PT1lLnJlc3VsdD9vaSh0LHtkYXRhOmUuZGF0YSxlcnJNc2c6ImdldENsaXBib2FyZERhdGE6b2sifSk6b2kodCx7ZGF0YTplLnJlc3VsdCxlcnJNc2c6ImdldENsaXBib2FyZERhdGE6ZmFpbCJ9KX0pfSxzZXRDbGlwYm9hcmREYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0YTtyZXR1cm4gYWkoImNsaXBib2FyZCIpLnNldFN0cmluZyh0KSx7ZXJyTXNnOiJzZXRDbGlwYm9hcmREYXRhOm9rIn19LHN0YXJ0Q29tcGFzczpGbyxzdG9wQ29tcGFzczp6byxvbkNvbXBhc3NDaGFuZ2U6ZnVuY3Rpb24oZSl7Um8ubGVuZ3RofHxGbygpLFJvLnB1c2goZSl9LG9mZkNvbXBhc3NDaGFuZ2U6ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9Um8uaW5kZXhPZihlKTswPD10JiZSby5zcGxpY2UodCwxKX1Sby5sZW5ndGh8fHpvKCl9LGdldE5ldHdvcmtUeXBlOmZ1bmN0aW9uKCl7cmV0dXJue2Vyck1zZzoiZ2V0TmV0d29ya1R5cGU6b2siLG5ldHdvcmtUeXBlOnNvW0N2Lm5ldHdvcmtpbmZvLmdldEN1cnJlbnRUeXBlKCldfHwidW5rbm93biJ9fSxvbkJlYWNvblVwZGF0ZTpWbyxvbkJlYWNvblNlcnZpY2VDaGFuZ2U6VW8sZ2V0QmVhY29uczpxbyxzdGFydEJlYWNvbkRpc2NvdmVyeTpXbyxzdG9wQmVhY29uRGlzY292ZXJ5OkhvLG1ha2VQaG9uZUNhbGw6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUucGhvbmVOdW1iZXI7cmV0dXJuIEN2LmRldmljZS5kaWFsKHQpLHtlcnJNc2c6Im1ha2VQaG9uZUNhbGw6b2sifX0sc2NhbkNvZGU6ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07dmFyIG49IndlZXgiIT09JHYubnZ1ZUNvbXBpbGVyP0NhOnlhO3JldHVybiBuLnNjYW5Db2RlLmFwcGx5KG4sZSl9LGNoZWNrSXNTdXBwb3J0U290ZXJBdXRoZW50aWNhdGlvbjpFYSxjaGVja0lzU290ZXJFbnJvbGxlZEluRGV2aWNlOklhLHN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLnJlcXVlc3RBdXRoTW9kZXMscj1lLmNoYWxsZW5nZTt2b2lkIDA9PT1yJiYocj0hMSk7dmFyIGk9ZS5hdXRoQ29udGVudCxvPUVhKCkuc3VwcG9ydE1vZGU7aWYoMD09PW8ubGVuZ3RoKXJldHVybnthdXRoTW9kZTpvWzBdfHwiZmluZ2VyUHJpbnQiLGVyckNvZGU6OTAwMDEsZXJyTXNnOiJzdGFydFNvdGVyQXV0aGVudGljYXRpb246ZmFpbCJ9O3ZhciBhPVtdO2lmKG4ubWFwKGZ1bmN0aW9uKGUsdCl7LTE8by5pbmRleE9mKGUpJiZhLnB1c2goZSl9KSwwPT09YS5sZW5ndGgpcmV0dXJue2F1dGhNb2RlOmFbMF18fCJmaW5nZXJQcmludCIsZXJyQ29kZTo5MDAwMyxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIG5vIGNvcnJlc3BvbmRpbmcgbW9kZSJ9O3ZhciBzPVtdO2lmKGEubWFwKGZ1bmN0aW9uKGUsdCl7SWEoe2NoZWNrQXV0aE1vZGU6ZX0pLmlzRW5yb2xsZWQmJnMucHVzaChlKX0pLDA9PT1zLmxlbmd0aClyZXR1cm57YXV0aE1vZGU6YVswXSxlcnJDb2RlOjkwMDExLGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwgbm8gIithWzBdKyIgZW5yb2xsZWQifTt2YXIgYz1zWzBdOyJmaW5nZXJQcmludCI9PT1jPygiYW5kcm9pZCI9PT1Ddi5vcy5uYW1lLnRvTG93ZXJDYXNlKCkmJihDdi5uYXRpdmVVSS5zaG93V2FpdGluZyhpfHxRZSgidW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi5hdXRoQ29udGVudCIpKS5vbmNsb3NlPWZ1bmN0aW9uKCl7Q3YuZmluZ2VycHJpbnQuY2FuY2VsKCl9KSxDdi5maW5nZXJwcmludC5hdXRoZW50aWNhdGUoZnVuY3Rpb24oKXtDdi5uYXRpdmVVSS5jbG9zZVdhaXRpbmcoKSxvaSh0LHthdXRoTW9kZTpjLGVyckNvZGU6MCxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpvayJ9KX0sZnVuY3Rpb24oZSl7c3dpdGNoKGUuY29kZSl7Y2FzZSBlLkFVVEhFTlRJQ0FURV9NSVNNQVRDSDpicmVhaztjYXNlIGUuQVVUSEVOVElDQVRFX09WRVJMSU1JVDpDdi5uYXRpdmVVSS5jbG9zZVdhaXRpbmcoKSxvaSh0LHthdXRoTW9kZTpjLGVyckNvZGU6OTAwMTAsZXJyTXNnOiJzdGFydFNvdGVyQXV0aGVudGljYXRpb246ZmFpbCBhdXRoZW50aWNhdGUgZnJlZXplLiBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyIn0pO2JyZWFrO2Nhc2UgZS5DQU5DRUw6Q3YubmF0aXZlVUkuY2xvc2VXYWl0aW5nKCksb2kodCx7YXV0aE1vZGU6YyxlcnJDb2RlOjkwMDA4LGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwgY2FuY2VsIn0pO2JyZWFrO2RlZmF1bHQ6Q3YubmF0aXZlVUkuY2xvc2VXYWl0aW5nKCksb2kodCx7YXV0aE1vZGU6YyxlcnJDb2RlOjkwMDA3LGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwifSl9fSx7bWVzc2FnZTppfSkpOiJmYWNpYWwiPT09YyYmYWkoImZhY2VJRCIpLmF1dGhlbnRpY2F0ZSh7bWVzc2FnZTppfSxmdW5jdGlvbihlKXtpZigic3VjY2VzcyI9PT1lLnR5cGUmJjA9PT1lLmNvZGUpb2kodCx7YXV0aE1vZGU6YyxlcnJDb2RlOjAsZXJyTXNnOiJzdGFydFNvdGVyQXV0aGVudGljYXRpb246b2sifSk7ZWxzZSBzd2l0Y2goZS5jb2RlKXtjYXNlIDQ6b2kodCx7YXV0aE1vZGU6YyxlcnJDb2RlOjkwMDA5LGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwifSk7YnJlYWs7Y2FzZSA1Om9pKHQse2F1dGhNb2RlOmMsZXJyQ29kZTo5MDAxMCxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIGF1dGhlbnRpY2F0ZSBmcmVlemUuIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIifSk7YnJlYWs7Y2FzZSA2Om9pKHQse2F1dGhNb2RlOmMsZXJyQ29kZTo5MDAwOCxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIGNhbmNlbCJ9KTticmVhaztkZWZhdWx0Om9pKHQse2F1dGhNb2RlOmMsZXJyQ29kZTo5MDAwNyxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIn0pfX0pfSxnZXREZXZpY2VJbmZvOnphLGdldEFwcEJhc2VJbmZvOlZhLGdldFN5c3RlbUluZm9TeW5jOmZ1bmN0aW9uKCl7cmV0dXJuIGhpKFVhLE9iamVjdC5jcmVhdGUobnVsbCksImdldFN5c3RlbUluZm8iLCJnZXRTeXN0ZW1JbmZvU3luYyIpfSxnZXRTeXN0ZW1JbmZvOlVhLHZpYnJhdGVMb25nOmZ1bmN0aW9uKCl7cmV0dXJuIEN2LmRldmljZS52aWJyYXRlKDQwMCkse2Vyck1zZzoidmlicmF0ZUxvbmc6b2sifX0sdmlicmF0ZVNob3J0OmZ1bmN0aW9uKCl7cmV0dXJuIEN2LmRldmljZS52aWJyYXRlKDE1KSx7ZXJyTXNnOiJ2aWJyYXRlU2hvcnQ6b2sifX0sZ2V0V2luZG93SW5mbzpOYSxnZXRTeXN0ZW1TZXR0aW5nOmZ1bmN0aW9uKCl7dmFyIGU9KDAseHYucmVxdWlyZU1vZHVsZSgicGx1cyIpLmdldFN5c3RlbVNldHRpbmcpKCk7dHJ5eyJzdHJpbmciPT10eXBlb2YgZSYmKGU9SlNPTi5wYXJzZShlKSl9Y2F0Y2goZSl7fXJldHVybiBlfSxnZXRBcHBBdXRob3JpemVTZXR0aW5nOnFhLG9wZW5BcHBBdXRob3JpemVTZXR0aW5nOmZ1bmN0aW9uKGUsdCl7KDAseHYucmVxdWlyZU1vZHVsZSgicGx1cyIpLm9wZW5BcHBBdXRob3JpemVTZXR0aW5nKShmdW5jdGlvbihlKXsic3VjY2VzcyI9PT1lLnR5cGU/b2kodCx7ZXJyTXNnOiJnZXRDbGlwYm9hcmREYXRhOm9rIn0pOm9pKHQse2Vyck1zZzoiZ2V0Q2xpcGJvYXJkRGF0YTpmYWlsIn0pfSl9LHNhdmVGaWxlOmZ1bmN0aW9uKGUsbil7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0LHI9ZS50ZW1wRmlsZVBhdGgsaT1FaShuLCJzYXZlRmlsZSIpLG89IiIrRGF0ZS5ub3coKStYYSsrKygxPCh0PXIuc3BsaXQoIi4iKSkubGVuZ3RoPyIuIit0W3QubGVuZ3RoLTFdOiIiKTtDdi5pby5yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMKHIsZnVuY3Rpb24odCl7R2EoZnVuY3Rpb24oZSl7dC5jb3B5VG8oZSxvLGZ1bmN0aW9uKCl7b2kobix7ZXJyTXNnOiJzYXZlRmlsZTpvayIsc2F2ZWRGaWxlUGF0aDpIYSsiLyIrb30pfSxpKX0saSl9LGkpfSxnZXRTYXZlZEZpbGVMaXN0OmZ1bmN0aW9uKGUsaSl7dmFyIG89RWkoaSwiZ2V0U2F2ZWRGaWxlTGlzdCIpO0dhKGZ1bmN0aW9uKGUpe3ZhciB0PWUuY3JlYXRlUmVhZGVyKCkscj1bXTt0LnJlYWRFbnRyaWVzKGZ1bmN0aW9uKG4pe24mJm4ubGVuZ3RoP24uZm9yRWFjaChmdW5jdGlvbih0KXt0LmdldE1ldGFkYXRhKGZ1bmN0aW9uKGUpe3IucHVzaCh7ZmlsZVBhdGg6Q3YuaW8uY29udmVydEFic29sdXRlRmlsZVN5c3RlbSh0LmZ1bGxQYXRoKSxjcmVhdGVUaW1lOmUubW9kaWZpY2F0aW9uVGltZS5nZXRUaW1lKCksc2l6ZTplLnNpemV9KSxyLmxlbmd0aD09PW4ubGVuZ3RoJiZvaShpLHtlcnJNc2c6ImdldFNhdmVkRmlsZUxpc3Q6b2siLGZpbGVMaXN0OnJ9KX0sbywhMSl9KTpvaShpLHtlcnJNc2c6ImdldFNhdmVkRmlsZUxpc3Q6b2siLGZpbGVMaXN0OnJ9KX0sbyl9LG8pfSxnZXRGaWxlSW5mbzpZYSxnZXRTYXZlZEZpbGVJbmZvOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUuZmlsZVBhdGgscj1FaSh0LCJnZXRTYXZlZEZpbGVJbmZvIik7Q3YuaW8ucmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSTChuLGZ1bmN0aW9uKGUpe2UuZ2V0TWV0YWRhdGEoZnVuY3Rpb24oZSl7b2kodCx7Y3JlYXRlVGltZTplLm1vZGlmaWNhdGlvblRpbWUuZ2V0VGltZSgpLHNpemU6ZS5zaXplLGVyck1zZzoiZ2V0U2F2ZWRGaWxlSW5mbzpvayJ9KX0sciwhMSl9LHIpfSxyZW1vdmVTYXZlZEZpbGU6ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS5maWxlUGF0aCxyPUVpKHQsInJlbW92ZVNhdmVkRmlsZSIpO0N2LmlvLnJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkwobixmdW5jdGlvbihlKXtlLnJlbW92ZShmdW5jdGlvbigpe29pKHQse2Vyck1zZzoicmVtb3ZlU2F2ZWRGaWxlOm9rIn0pfSxyKX0scil9LG9wZW5Eb2N1bWVudDpmdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLmZpbGVQYXRoLHI9KGUuZmlsZVR5cGUsT2kodCwic2F2ZUZpbGUiKSksaT1FaSh0LCJzYXZlRmlsZSIpO0N2LnJ1bnRpbWUub3BlbkRvY3VtZW50KF9pKG4pLHZvaWQgMCxyLGkpfSxjaG9vc2VMb2NhdGlvbjpmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTt2YXIgbj0id2VleCIhPT0kdi5udnVlQ29tcGlsZXI/WmE6S2E7cmV0dXJuIG4uY2hvb3NlTG9jYXRpb24uYXBwbHkobixlKX0sZ2V0TG9jYXRpb246ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS50eXBlO3ZvaWQgMD09PW4mJihuPSJ3Z3M4NCIpO3ZhciByPWUuZ2VvY29kZTt2b2lkIDA9PT1yJiYocj0hMSk7dmFyIGk9ZS5hbHRpdHVkZTt2b2lkIDA9PT1pJiYoaT0hMSk7dmFyIG89ZS5pc0hpZ2hBY2N1cmFjeTt2b2lkIDA9PT1vJiYobz0hMSk7dmFyIGE9ZS5oaWdoQWNjdXJhY3lFeHBpcmVUaW1lLHM9RWkodCwiZ2V0TG9jYXRpb24iKTtDdi5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oZnVuY3Rpb24oZSl7UWEobixlLHQpfSxmdW5jdGlvbihlKXsxNTAxIT09ZS5jb2RlP3MoZSk6UWEobixlLHQpfSx7Z2VvY29kZTpyLGVuYWJsZUhpZ2hBY2N1cmFjeTpvfHxpLHRpbWVvdXQ6YSxjb29yZHNUeXBlOm59KX0sb3BlbkxvY2F0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3ZhciBuPSJ3ZWV4IiE9PSR2Lm52dWVDb21waWxlcj90czplcztyZXR1cm4gbi5vcGVuTG9jYXRpb24uYXBwbHkobixlKX0sc3RhcnRSZWNvcmQ6ZnVuY3Rpb24oZSx0KXtucyYmbnMuc3RvcCgpLChucz1Ddi5hdWRpby5nZXRSZWNvcmRlcigpKS5yZWNvcmQoe2ZpbGVuYW1lOiJfZG9jL2F1ZGlvLyIsZm9ybWF0OiJhYWMifSxmdW5jdGlvbihlKXtvaSh0LHtlcnJNc2c6InN0YXJ0UmVjb3JkOm9rIix0ZW1wRmlsZVBhdGg6ZX0pfSxmdW5jdGlvbihlKXtvaSh0LHtlcnJNc2c6InN0YXJ0UmVjb3JkOmZhaWwifSl9KSxycz1PdihmdW5jdGlvbigpe25zLnN0b3AoKSxucz0hMX0sMzZlNSl9LHN0b3BSZWNvcmQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnM/KHJzJiZFdihycyksbnMuc3RvcCgpLHtlcnJNc2c6InN0b3BSZWNvcmQ6b2sifSk6e2Vyck1zZzoic3RvcFJlY29yZDpmYWlsIn19LHBsYXlWb2ljZTpmdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLmZpbGVQYXRoO2lmKGlzJiZvcz09PW4mJiJwYXVzZSI9PT1hcylyZXR1cm4gYXM9InBsYXkiLGlzLnBsYXkoZnVuY3Rpb24oZSl7YXM9b3M9aXM9ITEsb2kodCx7ZXJyTXNnOiJwbGF5Vm9pY2U6b2sifSl9KSx7ZXJyTXNnOiJwbGF5Vm9pY2U6b2sifTtpcyYmaXMuc3RvcCgpLG9zPW4sYXM9InBsYXkiLChpcz1Ddi5hdWRpby5jcmVhdGVQbGF5ZXIoX2kobikpKS5wbGF5KGZ1bmN0aW9uKGUpe2FzPW9zPWlzPSExLG9pKHQse2Vyck1zZzoicGxheVZvaWNlOm9rIn0pfSl9LHBhdXNlVm9pY2U6ZnVuY3Rpb24oKXtyZXR1cm4gaXMmJiJwbGF5Ij09PWFzJiYoaXMucGF1c2UoKSxhcz0icGF1c2UiKSx7ZXJyTXNnOiJwYXVzZVZvaWNlOm9rIn19LHN0b3BWb2ljZTpmdW5jdGlvbigpe3JldHVybiBpcyYmKGlzLnN0b3AoKSxhcz1vcz1pcz0hMSkse2Vyck1zZzoic3RvcFZvaWNlOm9rIn19LGNob29zZUltYWdlOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUuY291bnQscj1lLnNpemVUeXBlLGk9ZS5zb3VyY2VUeXBlLG89ZS5jcm9wLGE9RWkodCwiY2hvb3NlSW1hZ2UiLCJjYW5jZWwiKTtmdW5jdGlvbiBzKHIpe3ZhciBpPVtdLG89W107UHJvbWlzZS5hbGwoci5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHI9ZSxuZXcgUHJvbWlzZShmdW5jdGlvbih0LG4pe0N2LmlvLnJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkwocixmdW5jdGlvbihlKXtlLmdldE1ldGFkYXRhKHQsbiwhMSl9LG4pfSk7dmFyIHJ9KSkudGhlbihmdW5jdGlvbihlKXtlLmZvckVhY2goZnVuY3Rpb24oZSx0KXt2YXIgbj1yW3RdO28ucHVzaChuKSxpLnB1c2goe3BhdGg6bixzaXplOmUuc2l6ZX0pfSksb2kodCx7ZXJyTXNnOiJjaG9vc2VJbWFnZTpvayIsdGVtcEZpbGVQYXRoczpvLHRlbXBGaWxlczppfSl9KS5jYXRjaChhKX1mdW5jdGlvbiBjKCl7Q3YuY2FtZXJhLmdldENhbWVyYSgpLmNhcHR1cmVJbWFnZShmdW5jdGlvbihlKXtyZXR1cm4gcyhbZV0pfSxhLHtmaWxlbmFtZTpsbysiL2NhbWVyYS8iLHJlc29sdXRpb246ImhpZ2giLGNyb3A6byxzaXplVHlwZTpyfSl9ZnVuY3Rpb24gdSgpe0N2LmdhbGxlcnkucGljayhmdW5jdGlvbihlKXtyZXR1cm4gcyhlLmZpbGVzKX0sYSx7bWF4aW11bTpuLG11bHRpcGxlOiEwLHN5c3RlbTohMSxmaWxlbmFtZTpsbysiL2dhbGxlcnkvIixwZXJtaXNzaW9uQWxlcnQ6ITAsY3JvcDpvLHNpemVUeXBlOnJ9KX1pZigxPT09aS5sZW5ndGgpe2lmKGkuaW5jbHVkZXMoImFsYnVtIikpcmV0dXJuIHZvaWQgdSgpO2lmKGkuaW5jbHVkZXMoImNhbWVyYSIpKXJldHVybiB2b2lkIGMoKX1Ddi5uYXRpdmVVSS5hY3Rpb25TaGVldCh7Y2FuY2VsOlFlKCJ1bmkuY2hvb3NlSW1hZ2UuY2FuY2VsIiksYnV0dG9uczpbe3RpdGxlOlFlKCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5jYW1lcmEiKX0se3RpdGxlOlFlKCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5hbGJ1bSIpfV19LGZ1bmN0aW9uKGUpe3N3aXRjaChlLmluZGV4KXtjYXNlIDE6YygpO2JyZWFrO2Nhc2UgMjp1KCk7YnJlYWs7ZGVmYXVsdDphKCl9fSl9LGNob29zZVZpZGVvOmZ1bmN0aW9uKGUscil7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUuc291cmNlVHlwZSxuPWUuY29tcHJlc3NlZCxpPWUubWF4RHVyYXRpb24sbz1lLmNhbWVyYSxhPUVpKHIsImNob29zZVZpZGVvIiwiY2FuY2VsIik7ZnVuY3Rpb24gcyhuKXt2b2lkIDA9PT1uJiYobj0iIiksQ3YuaW8uZ2V0VmlkZW9JbmZvKHtmaWxlUGF0aDpuLHN1Y2Nlc3M6ZnVuY3Rpb24oZSl7dmFyIHQ9e2Vyck1zZzoiY2hvb3NlVmlkZW86b2siLHRlbXBGaWxlUGF0aDpufTt0LnNpemU9ZS5zaXplLHQuZHVyYXRpb249ZS5kdXJhdGlvbix0LndpZHRoPWUud2lkdGgsdC5oZWlnaHQ9ZS5oZWlnaHQsb2kocix0KX0sZmFpbDphfSl9ZnVuY3Rpb24gYygpe0N2LmdhbGxlcnkucGljayhmdW5jdGlvbihlKXtyZXR1cm4gcyhlLmZpbGVzWzBdKX0sYSx7ZmlsdGVyOiJ2aWRlbyIsc3lzdGVtOiExLG11bHRpcGxlOiEwLG1heGltdW06MSxmaWxlbmFtZTpsbysiL2dhbGxlcnkvIixwZXJtaXNzaW9uQWxlcnQ6ITAsdmlkZW9Db21wcmVzczpufSl9ZnVuY3Rpb24gdSgpe0N2LmNhbWVyYS5nZXRDYW1lcmEoKS5zdGFydFZpZGVvQ2FwdHVyZShzLGEse2luZGV4OiJmcm9udCI9PT1vPzI6MSx2aWRlb01heGltdW1EdXJhdGlvbjppLGZpbGVuYW1lOmxvKyIvY2FtZXJhLyIsdmlkZW9Db21wcmVzczpufSl9aWYoMT09PXQubGVuZ3RoKXtpZih0LmluY2x1ZGVzKCJhbGJ1bSIpKXJldHVybiB2b2lkIGMoKTtpZih0LmluY2x1ZGVzKCJjYW1lcmEiKSlyZXR1cm4gdm9pZCB1KCl9Q3YubmF0aXZlVUkuYWN0aW9uU2hlZXQoe2NhbmNlbDpRZSgidW5pLmNob29zZVZpZGVvLmNhbmNlbCIpLGJ1dHRvbnM6W3t0aXRsZTpRZSgidW5pLmNob29zZVZpZGVvLnNvdXJjZVR5cGUuY2FtZXJhIil9LHt0aXRsZTpRZSgidW5pLmNob29zZVZpZGVvLnNvdXJjZVR5cGUuYWxidW0iKX1dfSxmdW5jdGlvbihlKXtzd2l0Y2goZS5pbmRleCl7Y2FzZSAxOnUoKTticmVhaztjYXNlIDI6YygpO2JyZWFrO2RlZmF1bHQ6YSgpfX0pfSxjb21wcmVzc0ltYWdlOmZ1bmN0aW9uKGUsdCl7dmFyIG49bG8rIi9jb21wcmVzc2VkLyIrRGF0ZS5ub3coKSsiXyIrQWkoZS5zcmMpLHI9RWkodCwiY29tcHJlc3NJbWFnZSIpO0N2LnppcC5jb21wcmVzc0ltYWdlKE9iamVjdC5hc3NpZ24oe30sZSx7ZHN0Om59KSxmdW5jdGlvbigpe29pKHQse2Vyck1zZzoiY29tcHJlc3NJbWFnZTpvayIsdGVtcEZpbGVQYXRoOm59KX0scil9LGNvbXByZXNzVmlkZW86ZnVuY3Rpb24oZSx0KXt2YXIgbj1sbysiL2NvbXByZXNzZWQvIitEYXRlLm5vdygpKyJfIitBaShlLnNyYykscj1PaSh0LCJjb21wcmVzc1ZpZGVvIiksaT1FaSh0LCJjb21wcmVzc1ZpZGVvIik7Q3YuemlwLmNvbXByZXNzVmlkZW8oT2JqZWN0LmFzc2lnbih7fSxlLHtmaWxlbmFtZTpufSkscixpKX0sZ2V0SW1hZ2VJbmZvOnVzLGdldFZpZGVvSW5mbzpscyxwcmV2aWV3SW1hZ2VQbHVzOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLmN1cnJlbnQ7dm9pZCAwPT09dCYmKHQ9MCk7dmFyIG49ZS5iYWNrZ3JvdW5kO3ZvaWQgMD09PW4mJihuPSIjMDAwMDAwIik7dmFyIHI9ZS5pbmRpY2F0b3I7dm9pZCAwPT09ciYmKHI9Im51bWJlciIpO3ZhciBpPWUubG9vcDt2b2lkIDA9PT1pJiYoaT0hMSk7dmFyIG89ZS51cmxzLGE9ZS5sb25nUHJlc3NBY3Rpb25zO289by5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIF9pKGUpfSk7dmFyIHM9TnVtYmVyKHQpO3JldHVybiB0PWlzTmFOKHMpPyh0PW8uaW5kZXhPZihfaSh0KSkpPDA/MDp0OnMsQ3YubmF0aXZlVUkucHJldmlld0ltYWdlKG8se2N1cnJlbnQ6dCxiYWNrZ3JvdW5kOm4saW5kaWNhdG9yOnIsbG9vcDppLG9uTG9uZ1ByZXNzOmZ1bmN0aW9uKHQpe3ZhciBlPVtdLG49IiIscj0iIixpPWEmJmEuY2FsbGJhY2tJZDtpPyhlPWEuaXRlbUxpc3Q/YS5pdGVtTGlzdDpbXSxuPWEuaXRlbUNvbG9yP2EuaXRlbUNvbG9yOiIjMDAwMDAwIixyPWEudGl0bGU/YS50aXRsZToiIik6KGU9W1FlKCJ1bmkucHJldmlld0ltYWdlLmJ1dHRvbi5zYXZlIildLG49IiMwMDAwMDAiLHI9IiIpO3ZhciBvPXtidXR0b25zOmUubWFwKGZ1bmN0aW9uKGUpe3JldHVybnt0aXRsZTplLGNvbG9yOm59fSksY2FuY2VsOlFlKCJ1bmkucHJldmlld0ltYWdlLmNhbmNlbCIpfTtyJiYoby50aXRsZT1yKSxDdi5uYXRpdmVVSS5hY3Rpb25TaGVldChvLGZ1bmN0aW9uKGUpe2lmKDA8ZS5pbmRleCl7aWYoaSlyZXR1cm4gdm9pZCBzaShhLmNhbGxiYWNrSWQse2Vyck1zZzoic2hvd0FjdGlvblNoZWV0Om9rIix0YXBJbmRleDplLmluZGV4LTEsaW5kZXg6dC5pbmRleH0pO0N2LmdhbGxlcnkuc2F2ZSh0LnVybCxmdW5jdGlvbihlKXtDdi5uYXRpdmVVSS50b2FzdChRZSgidW5pLnByZXZpZXdJbWFnZS5zYXZlLnN1Y2Nlc3MiKSl9LGZ1bmN0aW9uKCl7Q3YubmF0aXZlVUkudG9hc3QoUWUoInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5mYWlsIikpfSl9ZWxzZSBpJiZzaShhLmNhbGxiYWNrSWQse2Vyck1zZzoic2hvd0FjdGlvblNoZWV0OmZhaWwgY2FuY2VsIn0pfSl9fSkse2Vyck1zZzoicHJldmlld0ltYWdlOm9rIn19LGNsb3NlUHJldmlld0ltYWdlUGx1czpmdW5jdGlvbigpe3RyeXtyZXR1cm4gQ3YubmF0aXZlVUkuY2xvc2VQcmV2aWV3SW1hZ2UoKSx7ZXJyTXNnOiJjbG9zZVByZXZpZXdJbWFnZVBsdXM6b2sifX1jYXRjaChlKXtyZXR1cm57ZXJyTXNnOiJjbG9zZVByZXZpZXdJbWFnZVBsdXM6ZmFpbCJ9fX0sb3BlcmF0ZVJlY29yZGVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5vcGVyYXRpb25UeXBlLHI9e307Zm9yKHZhciBpIGluIGUpLTE9PT1bIm9wZXJhdGlvblR5cGUiXS5pbmRleE9mKGkpJiYocltpXT1lW2ldKTt2YXIgbz1yO3JldHVybiBmc1tuXShvKSx7ZXJyTXNnOiJvcGVyYXRlUmVjb3JkZXI6b2sifX0sc2F2ZUltYWdlVG9QaG90b3NBbGJ1bTpmdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLmZpbGVQYXRoLHI9T2kodCwic2F2ZUltYWdlVG9QaG90b3NBbGJ1bSIpLGk9RWkodCwic2F2ZUltYWdlVG9QaG90b3NBbGJ1bSIpO0N2LmdhbGxlcnkuc2F2ZShfaShuKSxyLGkpfSxzYXZlVmlkZW9Ub1Bob3Rvc0FsYnVtOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUuZmlsZVBhdGg7Q3YuZ2FsbGVyeS5zYXZlKF9pKG4pLGZ1bmN0aW9uKGUpe29pKHQse2Vyck1zZzoic2F2ZVZpZGVvVG9QaG90b3NBbGJ1bTpvayJ9KX0sZnVuY3Rpb24oZSl7b2kodCx7ZXJyTXNnOiJzYXZlVmlkZW9Ub1Bob3Rvc0FsYnVtOmZhaWwifSl9KX0sb3BlcmF0ZURvd25sb2FkVGFzazpmdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS5kb3dubG9hZFRhc2tJZCxuPWUub3BlcmF0aW9uVHlwZSxyPWhzW3RdO3JldHVybiByJiYiYWJvcnQiPT09bj8oZGVsZXRlIGhzW3RdLHIuYWJvcnQoKSx2cyh7ZG93bmxvYWRUYXNrSWQ6dCxzdGF0ZToiZmFpbCIsZXJyTXNnOiJhYm9ydCJ9KSx7ZXJyTXNnOiJvcGVyYXRlRG93bmxvYWRUYXNrOm9rIn0pOntlcnJNc2c6Im9wZXJhdGVEb3dubG9hZFRhc2s6ZmFpbCJ9fSxjcmVhdGVEb3dubG9hZFRhc2s6ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUudXJsLHI9ZS5oZWFkZXIsaT1lLnRpbWVvdXQ7aT0oaXx8JHYubmV0d29ya1RpbWVvdXQmJiR2Lm5ldHdvcmtUaW1lb3V0LnJlcXVlc3R8fDZlNCkvMWUzO3ZhciBvPUN2LmRvd25sb2FkZXIuY3JlYXRlRG93bmxvYWQodCx7dGltZW91dDppLGZpbGVuYW1lOmxvKyIvZG93bmxvYWQvIixyZXRyeTowLHJldHJ5SW50ZXJ2YWw6MH0sZnVuY3Rpb24oZSx0KXt2cyh0P3tkb3dubG9hZFRhc2tJZDpuLHN0YXRlOiJzdWNjZXNzIix0ZW1wRmlsZVBhdGg6ZS5maWxlbmFtZSxzdGF0dXNDb2RlOnR9Ontkb3dubG9hZFRhc2tJZDpuLHN0YXRlOiJmYWlsIixzdGF0dXNDb2RlOnR9KX0pO2Zvcih2YXIgYSBpbiByKWsocixhKSYmby5zZXRSZXF1ZXN0SGVhZGVyKGEsclthXSk7cmV0dXJuIG8uYWRkRXZlbnRMaXN0ZW5lcigic3RhdGVjaGFuZ2VkIixmdW5jdGlvbihlLHQpe2UuZG93bmxvYWRlZFNpemUmJmUudG90YWxTaXplJiZ2cyh7ZG93bmxvYWRUYXNrSWQ6bixzdGF0ZToicHJvZ3Jlc3NVcGRhdGUiLHByb2dyZXNzOnBhcnNlSW50KGUuZG93bmxvYWRlZFNpemUvZS50b3RhbFNpemUqMTAwKSx0b3RhbEJ5dGVzV3JpdHRlbjplLmRvd25sb2FkZWRTaXplLHRvdGFsQnl0ZXNFeHBlY3RlZFRvV3JpdGU6ZS50b3RhbFNpemV9KX0pLChoc1tuXT1vKS5zdGFydCgpLHtkb3dubG9hZFRhc2tJZDpuLGVyck1zZzoiY3JlYXRlRG93bmxvYWRUYXNrOm9rIn19KCsrcHMsZSl9LGNyZWF0ZVJlcXVlc3RUYXNrQnlJZDpicyxjcmVhdGVSZXF1ZXN0VGFzazpmdW5jdGlvbihlKXtyZXR1cm4gYnMoKytncyxlKX0sb3BlcmF0ZVJlcXVlc3RUYXNrOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLnJlcXVlc3RUYXNrSWQsbj1lLm9wZXJhdGlvblR5cGUscj1tc1t0XTtyZXR1cm4gciYmImFib3J0Ij09PW4/KHIuYWJvcnQoKSx7ZXJyTXNnOiJvcGVyYXRlUmVxdWVzdFRhc2s6b2sifSk6e2Vyck1zZzoib3BlcmF0ZVJlcXVlc3RUYXNrOmZhaWwifX0sY29uZmlnTVRMUzpmdW5jdGlvbihlLGkpe3ZhciB0PWUuY2VydGlmaWNhdGVzO2FpKCJzdHJlYW0iKS5jb25maWdNVExTKHQsZnVuY3Rpb24oZSl7dmFyIHQ9ZS50eXBlLG49ZS5jb2RlLHI9ZS5tZXNzYWdlO3N3aXRjaCh0KXtjYXNlInN1Y2Nlc3MiOm9pKGkse2Vyck1zZzoiY29uZmlnTVRMUzpvayIsY29kZTpufSk7YnJlYWs7Y2FzZSJmYWlsIjpvaShpLHtlcnJNc2c6ImNvbmZpZ01UTFM6ZmFpbCAiK3IsY29kZTpufSl9fSl9LGNyZWF0ZVNvY2tldFRhc2s6ZnVuY3Rpb24oZSl7cmV0dXJuIHhzKFN0cmluZyhEYXRlLm5vdygpKSxlKX0sb3BlcmF0ZVNvY2tldFRhc2s6ZnVuY3Rpb24oZSl7dmFyIHQ9ZSxuPXQub3BlcmF0aW9uVHlwZSxyPXQuY29kZSxpPXQucmVhc29uLG89dC5kYXRhLGE9dC5zb2NrZXRUYXNrSWQscz1rc1thXTtpZighcylyZXR1cm57ZXJyTXNnOiJvcGVyYXRlU29ja2V0VGFzazpmYWlsIn07c3dpdGNoKG4pe2Nhc2Uic2VuZCI6cmV0dXJuIG8mJnMuc2VuZCh7aWQ6YSxkYXRhOiJvYmplY3QiPT10eXBlb2Ygbz97IkB0eXBlIjoiYmluYXJ5IixiYXNlNjQ6cGkobyl9Om99KSx7ZXJyTXNnOiJvcGVyYXRlU29ja2V0VGFzazpvayJ9O2Nhc2UiY2xvc2UiOnJldHVybiBzLmNsb3NlKHtpZDphLGNvZGU6cixyZWFzb246aX0pLGRlbGV0ZSBrc1thXSx7ZXJyTXNnOiJvcGVyYXRlU29ja2V0VGFzazpvayJ9fXJldHVybntlcnJNc2c6Im9wZXJhdGVTb2NrZXRUYXNrOmZhaWwifX0sb3BlcmF0ZVVwbG9hZFRhc2s6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUudXBsb2FkVGFza0lkLG49ZS5vcGVyYXRpb25UeXBlLHI9VHNbdF07cmV0dXJuIHImJiJhYm9ydCI9PT1uPyhkZWxldGUgVHNbdF0sci5hYm9ydCgpLE9zKHt1cGxvYWRUYXNrSWQ6dCxzdGF0ZToiZmFpbCIsZXJyTXNnOiJhYm9ydCJ9KSx7ZXJyTXNnOiJvcGVyYXRlVXBsb2FkVGFzazpvayJ9KTp7ZXJyTXNnOiJvcGVyYXRlVXBsb2FkVGFzazpmYWlsIn19LGNyZWF0ZVVwbG9hZFRhc2s6ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUudXJsLHI9ZS5maWxlUGF0aCxpPWUubmFtZSxvPWUuZmlsZXMsYT1lLmhlYWRlcixzPWUuZm9ybURhdGEsYz1lLnRpbWVvdXQ7dm9pZCAwPT09YyYmKGM9JHYubmV0d29ya1RpbWVvdXQudXBsb2FkRmlsZT8kdi5uZXR3b3JrVGltZW91dC51cGxvYWRGaWxlLzFlMzoxMjApO3ZhciB1PUN2LnVwbG9hZGVyLmNyZWF0ZVVwbG9hZCh0LHt0aW1lb3V0OmMscmV0cnk6MCxyZXRyeUludGVydmFsOjB9LGZ1bmN0aW9uKGUsdCl7T3ModD97dXBsb2FkVGFza0lkOm4sc3RhdGU6InN1Y2Nlc3MiLGRhdGE6ZS5yZXNwb25zZVRleHQsc3RhdHVzQ29kZTp0fTp7dXBsb2FkVGFza0lkOm4sc3RhdGU6ImZhaWwiLGRhdGE6IiIsc3RhdHVzQ29kZTp0fSksZGVsZXRlIFRzW25dfSk7Zm9yKHZhciBsIGluIGEpayhhLGwpJiZ1LnNldFJlcXVlc3RIZWFkZXIobCxTdHJpbmcoYVtsXSkpO2Zvcih2YXIgZCBpbiBzKWsocyxkKSYmdS5hZGREYXRhKGQsU3RyaW5nKHNbZF0pKTtyZXR1cm4gbyYmby5sZW5ndGg/by5mb3JFYWNoKGZ1bmN0aW9uKGUpe3UuYWRkRmlsZShfaShlLnVyaXx8ZS5maWxlUGF0aCkse2tleTplLm5hbWV8fCJmaWxlIn0pfSk6dS5hZGRGaWxlKF9pKHIpLHtrZXk6aX0pLHUuYWRkRXZlbnRMaXN0ZW5lcigic3RhdGVjaGFuZ2VkIixmdW5jdGlvbihlLHQpe2UudXBsb2FkZWRTaXplJiZlLnRvdGFsU2l6ZSYmT3Moe3VwbG9hZFRhc2tJZDpuLHN0YXRlOiJwcm9ncmVzc1VwZGF0ZSIscHJvZ3Jlc3M6cGFyc2VJbnQoZS51cGxvYWRlZFNpemUvZS50b3RhbFNpemUqMTAwKSx0b3RhbEJ5dGVzU2VudDplLnVwbG9hZGVkU2l6ZSx0b3RhbEJ5dGVzRXhwZWN0ZWRUb1NlbmQ6ZS50b3RhbFNpemV9KX0pLChUc1tuXT11KS5zdGFydCgpLHt1cGxvYWRUYXNrSWQ6bixlcnJNc2c6ImNyZWF0ZVVwbG9hZFRhc2s6b2sifX0oKytDcyxlKX0sZ2V0UHJvdmlkZXI6ZnVuY3Rpb24oZSxyKXt2YXIgaT1lLnNlcnZpY2U7SXNbaV0/SXNbaV0oZnVuY3Rpb24oZSx0LG4pe29pKHIsZT97ZXJyTXNnOiJnZXRQcm92aWRlcjpmYWlsICIrZS5tZXNzYWdlfTp7ZXJyTXNnOiJnZXRQcm92aWRlcjpvayIsc2VydmljZTppLHByb3ZpZGVyOnQscHJvdmlkZXJzOm4ubWFwKGZ1bmN0aW9uKGUpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGUuc2VydmljZVJlYWR5JiYoZS5pc0FwcEV4aXN0PWUuc2VydmljZVJlYWR5KSwiYm9vbGVhbiI9PXR5cGVvZiBlLm5hdGl2ZUNsaWVudCYmKGUuaXNBcHBFeGlzdD1lLm5hdGl2ZUNsaWVudCksZX0pfSl9KTpvaShyLHtlcnJNc2c6ImdldFByb3ZpZGVyOmZhaWwgc2VydmljZSBub3QgZm91bmQifSl9LGxvZ2luOiRzLGdldFVzZXJJbmZvOlBzLGdldFVzZXJQcm9maWxlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFBzKGUsdCl9LG9wZXJhdGVXWERhdGE6ZnVuY3Rpb24oZSx0KXtzd2l0Y2goZS5kYXRhLmFwaV9uYW1lKXtjYXNlIndlYmFwaV9nZXR1c2VyaW5mbyI6UHMoZSx0KTticmVhaztkZWZhdWx0OnJldHVybntlcnJNc2c6Im9wZXJhdGVXWERhdGE6ZmFpbCJ9fX0scHJlTG9naW46TXMsY2xvc2VBdXRoVmlldzpqcyxnZXRDaGVja0JveFN0YXRlOkxzLGdldFVuaXZlcmlmeU1hbmFnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gRXN8fChFcz1uZXcgTnMpfSxyZXF1ZXN0UGF5bWVudDpmdW5jdGlvbihuLHIpe3ZhciBpPW4ucHJvdmlkZXIsbz1FaShyLCJyZXF1ZXN0UGF5bWVudCIpO0N2LnBheW1lbnQuZ2V0Q2hhbm5lbHMoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlkPT09aX0pO3Q/Q3YucGF5bWVudC5yZXF1ZXN0KHQsbi5vcmRlckluZm8sZnVuY3Rpb24oZSl7ZS5lcnJNc2c9InJlcXVlc3RQYXltZW50Om9rIixvaShyLGUpfSxvKTpvaShyLHtlcnJNc2c6InJlcXVlc3RQYXltZW50OmZhaWwgc2VydmljZSBub3QgZm91bmQifSl9LG8pfSxzdWJzY3JpYmVQdXNoOmZ1bmN0aW9uKGUsdCl7dmFyIG49Q3YucHVzaC5nZXRDbGllbnRJbmZvKCk7cmV0dXJuIG4/KEZzfHwoRnM9ITAsQ3YucHVzaC5hZGRFdmVudExpc3RlbmVyKCJyZWNlaXZlIixmdW5jdGlvbihlKXtCcyYmIXpzJiZzaSgib25QdXNoTWVzc2FnZSIse21lc3NhZ2VJZDplLl9fVVVJRF9fLGRhdGE6ZS5wYXlsb2FkLGVyck1zZzoib25QdXNoOm9rIn0pfSkpLHpzPSExLG4uZXJyTXNnPSJzdWJzY3JpYmVQdXNoOm9rIixuKTp7ZXJyTXNnOiJzdWJzY3JpYmVQdXNoOmZhaWwg6K+356Gu5L+d5b2T5YmN6L+Q6KGM546v5aKD5bey5YyF5ZCrIHB1c2gg5qih5Z2XIn19LHVuc3Vic2NyaWJlUHVzaDpmdW5jdGlvbihlKXtyZXR1cm4genM9ITAse2Vyck1zZzoidW5zdWJzY3JpYmVQdXNoOm9rIn19LG9uUHVzaDpmdW5jdGlvbigpe3JldHVybiBGcz9Ddi5wdXNoLmdldENsaWVudEluZm8oKT8oQnM9ITAse2Vyck1zZzoib25QdXNoOm9rIn0pOntlcnJNc2c6Im9uUHVzaDpmYWlsIOivt+ehruS/neW9k+WJjei/kOihjOeOr+Wig+W3suWMheWQqyBwdXNoIOaooeWdlyJ9OntlcnJNc2c6Im9uUHVzaDpmYWlsIOivt+WFiOiwg+eUqCB1bmkuc3Vic2NyaWJlUHVzaCJ9fSxvZmZQdXNoOmZ1bmN0aW9uKGUpe3JldHVybiBCcz0hMSx7ZXJyTXNnOiJvZmZQdXNoOm9rIn19LGNyZWF0ZVB1c2hNZXNzYWdlOmZ1bmN0aW9uKGUsdCl7dmFyIG49cWEoKTtpZigiYXV0aG9yaXplZCIhPT1uLm5vdGlmaWNhdGlvbkF1dGhvcml6ZWQpcmV0dXJuIG9pKHQse2Vyck1zZzoiY3JlYXRlUHVzaE1lc3NhZ2U6ZmFpbCBub3RpZmljYXRpb25BdXRob3JpemVkOiAiK24ubm90aWZpY2F0aW9uQXV0aG9yaXplZH0pO3ZhciByPU9iamVjdC5hc3NpZ24oe30sZSk7ZGVsZXRlIHIuY29udGVudCxkZWxldGUgci5wYXlsb2FkLEN2LnB1c2guY3JlYXRlTWVzc2FnZShlLmNvbnRlbnQsZS5wYXlsb2FkLHIpLG9pKHQse2Vyck1zZzoiY3JlYXRlUHVzaE1lc3NhZ2U6b2sifSl9LHJlcXVpcmVOYXRpdmVQbHVnaW46VnMsc2hhcmVBcHBNZXNzYWdlRGlyZWN0bHk6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnRpdGxlLHI9ZS5wYXRoLGk9ZS5pbWFnZVVybCxvPWUudXNlRGVmYXVsdFNuYXBzaG90O249bnx8JHYuYXBwbmFtZTt2YXIgYT1mdW5jdGlvbigpe0hzKHtwcm92aWRlcjoid2VpeGluIix0eXBlOjAsdGl0bGU6bixpbWFnZVVybDppLGhyZWY6cixzY2VuZToiV1hTY2VuZVNlc3Npb24ifSx0LCJzaGFyZUFwcE1lc3NhZ2VEaXJlY3RseSIpfSxzPUVpKHQsInNoYXJlQXBwTWVzc2FnZURpcmVjdGx5Iik7aWYobyl7dmFyIGM9THYoKSx1PUN2LndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoY1tjLmxlbmd0aC0xXS5fX3d4V2Vidmlld0lkX18rIiIpO2lmKHUpe3ZhciBsPW5ldyBDdi5uYXRpdmVPYmouQml0bWFwO3UuZHJhdyhsLGZ1bmN0aW9uKCl7dmFyIGU9bG8rIi9zaGFyZS9zbmFwc2hvdC5qcGciO2wuc2F2ZShlLHtvdmVyd3JpdGU6ITAsZm9ybWF0OiJqcGcifSxmdW5jdGlvbigpe2k9ZSxhKCl9LHMpfSxzKX1lbHNlIGEoKX1lbHNlIGEoKX0sc2hhcmU6SHMsc2hhcmVXaXRoU3lzdGVtOmZ1bmN0aW9uKGUsdCxuKXt2b2lkIDA9PT1uJiYobj0ic2hhcmVXaXRoU3lzdGVtIik7dmFyIHI9ZS50eXBlLGk9ZS5pbWFnZVVybCxvPWUuc3VtbWFyeSxhPWUuaHJlZjtyPXJ8fCJ0ZXh0Ijt2YXIgcz1FaSh0LG4pO1sidGV4dCIsImltYWdlIl0uaW5kZXhPZihyKTwwJiZvaSh0LHtlcnJNc2c6bisiOmZhaWwg5YiG5Lqr5Y+C5pWwIHR5cGUg5LiN5q2j56GuIn0pLCJzdHJpbmciPT10eXBlb2YgaSYmaSYmKGk9X2koaSkpLEN2LnNoYXJlLnNlbmRXaXRoU3lzdGVtKHt0eXBlOnIscGljdHVyZXM6aSYmW2ldLGNvbnRlbnQ6byxocmVmOmF9LGZ1bmN0aW9uKGUpe29pKHQse2Vyck1zZzpuKyI6b2sifSl9LHMpfSxyZXN0b3JlR2xvYmFsOmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt2YXIgYTtDdiE9PXQmJih4dj1lLGE9KEN2PXQpLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSxjaT1hLEN2Lm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZT11aSxPdj1uLEV2PXIsSXY9aSxBdj1vKSwkdi5zZXJ2aWNlUmVhZHk9ITB9LHJlcXVpcmVHbG9iYWw6ZnVuY3Rpb24oKXtmb3IodmFyIGU9WyJBcnJheUJ1ZmZlciIsIkludDhBcnJheSIsIlVpbnQ4QXJyYXkiLCJVaW50OENsYW1wZWRBcnJheSIsIkludDE2QXJyYXkiLCJVaW50MTZBcnJheSIsIkludDMyQXJyYXkiLCJVaW50MzJBcnJheSIsIkZsb2F0MzJBcnJheSIsIkZsb2F0NjRBcnJheSIsIkJpZ0ludDY0QXJyYXkiLCJCaWdVaW50NjRBcnJheSJdLHQ9e30sbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3Rbcl09Z2xvYmFsW3JdfXJldHVybiB0fSxnZXRTdWJOVnVlQnlJZDpYcyxnZXRDdXJyZW50U3ViTlZ1ZTpmdW5jdGlvbigpe3JldHVybiBYcyhDdi53ZWJ2aWV3LmN1cnJlbnRXZWJ2aWV3KCkuaWQpfSxvbkhvc3RFdmVudFJlY2VpdmU6ZnVuY3Rpb24oZSl7WXMucHVzaChlKX0sb25OYXRpdmVFdmVudFJlY2VpdmU6ZnVuY3Rpb24oZSl7WXMucHVzaChlKX0sc2VuZE5hdGl2ZUV2ZW50OkpzLGxvYWRTdWJQYWNrYWdlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPWUucm9vdDtpZigtMSE9PUtzLmluZGV4T2YoaSkpcmV0dXJue2Vyck1zZzoibG9hZFN1YlBhY2thZ2U6b2sifTtLcy5wdXNoKGkpLG49aSsiL2FwcC1zdWItc2VydmljZS5qcyIscj1mdW5jdGlvbihlKXtvaSh0LHtlcnJNc2c6ImxvYWRTdWJQYWNrYWdlOm9rIn0pfSwkdi5vblNlcnZpY2VSZWFkeShmdW5jdGlvbigpe3h2LnJlcXVpcmVNb2R1bGUoInBsdXMiKS5ldmFsSlNGaWxlcyhbbl0scil9KX0sc2VuZEhvc3RFdmVudDp0YyxuYXZpZ2F0ZVRvTWluaVByb2dyYW06ZnVuY3Rpb24oZSx0KXt0YygibmF2aWdhdGVUb1VuaU1QIixlLGZ1bmN0aW9uKGUpe2lmKGUuZXJyTXNnJiYtMT09PWUuZXJyTXNnLmluZGV4T2YoIjpvayIpKXJldHVybiBvaSh0LHtlcnJNc2c6ZS5lcnJNc2d9KTtvaSh0LHtlcnJNc2c6Im5hdmlnYXRlVG9NaW5pUHJvZ3JhbTpvayJ9KX0pfSxnZXRMYXVuY2hPcHRpb25zU3luYzpmdW5jdGlvbigpe3JldHVybiBpY30sZ2V0RW50ZXJPcHRpb25zU3luYzpmdW5jdGlvbigpe3JldHVybiBvYygpfSxuYXZpZ2F0ZUJhY2s6V2MsbmF2aWdhdGVUbzpmdW5jdGlvbihlLHQpe3ZhciBuPWUudXJsLHI9ZS5ldmVudHMsaT1lLm9wZW5UeXBlLG89ZS5hbmltYXRpb25UeXBlLGE9ZS5hbmltYXRpb25EdXJhdGlvbixzPW4uc3BsaXQoIj8iKSxjPXNbMF0sdT1Qdi5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT1jfSkud2luZG93LGw9JHYud2luZG93fHx7fTtvfHwobz11LmFuaW1hdGlvblR5cGV8fGwuYW5pbWF0aW9uVHlwZXx8WG8pLGF8fChhPXUuYW5pbWF0aW9uRHVyYXRpb258fGwuYW5pbWF0aW9uRHVyYXRpb258fFlvKTt2YXIgZD13KHNbMV18fCIiKTtEYyhjLGZ1bmN0aW9uKCl7bnUoe3VybDpuLHBhdGg6YyxxdWVyeTpkLGV2ZW50czpyLGFuaW1hdGlvblR5cGU6byxhbmltYXRpb25EdXJhdGlvbjphfSx0KX0sImFwcExhdW5jaCI9PT1pKX0scmVMYXVuY2g6ZnVuY3Rpb24oZSxhKXt2YXIgcz1lLnVybCx0PXMuc3BsaXQoIj8iKSxjPXRbMF0sdT13KHRbMV18fCIiKTtEYyhjLGZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaSxvO3Q9YSxuPShlPXt1cmw6cyxwYXRoOmMscXVlcnk6dX0pLnVybCxyPWUucGF0aCxpPWUucXVlcnksbz1MdighMCkuc2xpY2UoMCksUHYuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXRoPT09cn0pLm1ldGEuaXNUYWJCYXImJkxhLnN3aXRjaFRhYihyLnNsaWNlKDEpKSxWYyh0dSh7dXJsOm4scGF0aDpyLHF1ZXJ5Omksb3BlblR5cGU6InJlTGF1bmNoIn0pLCJub25lIiwwLGZ1bmN0aW9uKCl7by5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuJHJlbW92ZSgpLHpjKGUuJGdldEFwcFdlYnZpZXcoKSwibm9uZSIpfSksb2kodCx7ZXJyTXNnOiJyZUxhdW5jaDpvayJ9KX0pLGxpKCl9KX0scmVkaXJlY3RUbzpmdW5jdGlvbihlLHQpe3ZhciBuPWUudXJsLHI9ZS5leGlzdHMsaT1uLnNwbGl0KCI/Iiksbz1pWzBdLGE9dyhpWzFdfHwiIik7RGMobyxmdW5jdGlvbigpe2l1KHt1cmw6bixwYXRoOm8scXVlcnk6YSxleGlzdHM6cn0sdCl9KX0sc3dpdGNoVGFiOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS51cmwscj1lLmZyb20saT1lLm9wZW5UeXBlLG89bi5zcGxpdCgiPyIpLGE9b1swXSxzPXcob1sxXXx8IiIpO0RjKGEsZnVuY3Rpb24oKXshZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnVybCxyPWUucGF0aCxpPWUucXVlcnk7ZS5mcm9tLExhLnN3aXRjaFRhYihyLnNsaWNlKDEpKTt2YXIgbyxhLHM9THYoKSxjPXMubGVuZ3RoLHU9ITEsbD0hMTtpZigxPD1jJiYoKG89c1tjLTFdKS4kcGFnZS5tZXRhLmlzVGFiQmFyP3U9ITA6KGw9ITAscy5yZXZlcnNlKCkuZm9yRWFjaChmdW5jdGlvbihlKXtlLiRwYWdlLm1ldGEuaXNUYWJCYXJ8fGU9PT1vfHwoZS4kcmVtb3ZlKCksemMoZS4kZ2V0QXBwV2VidmlldygpLCJub25lIikpfSksby4kcmVtb3ZlKCksT3YoZnVuY3Rpb24oKXsicmVkaXJlY3QiPT09by4kcGFnZS5vcGVuVHlwZT96YyhvLiRnZXRBcHBXZWJ2aWV3KCksSm8sWW8pOnpjKG8uJGdldEFwcFdlYnZpZXcoKSwiYXV0byIpfSwxMDApKSksTHYoITApLmZvckVhY2goZnVuY3Rpb24oZSl7Ii8iK2Uucm91dGU9PT1yPyhlLiRwYWdlLm1ldGEudmlzaWJsZXx8KGw9ITApLGUuJHBhZ2UubWV0YS52aXNpYmxlPSEwLGE9ZSk6ZS4kcGFnZS5tZXRhLmlzVGFiQmFyJiYoZS4kcGFnZS5tZXRhLnZpc2libGU9ITEpfSksbz09PWEmJih1PSExKSxvJiZ1JiZvLiR2bS5fX2NhbGxfaG9vaygib25IaWRlIiksIWEpcmV0dXJuIFZjKHR1KHt1cmw6bixwYXRoOnIscXVlcnk6aSxvcGVuVHlwZToic3dpdGNoVGFiIn0pLCJub25lIiwwLGZ1bmN0aW9uKCl7bGkoKSxvaSh0LHtlcnJNc2c6InN3aXRjaFRhYjpvayJ9KX0sNzApO3ZhciBkPWEuJGdldEFwcFdlYnZpZXcoKTtkLnNob3coIm5vbmUiKSxsJiYhZC5fX3ByZWxvYWRfXyYmYS4kdm0uX19jYWxsX2hvb2soIm9uU2hvdyIpLGxpKCksb2kodCx7ZXJyTXNnOiJzd2l0Y2hUYWI6b2sifSl9KHt1cmw6bixwYXRoOmEscXVlcnk6cyxmcm9tOnJ9LHQpfSwiYXBwTGF1bmNoIj09PWkpfSx1blByZWxvYWRQYWdlOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj1lLnVybCxpPSgobj1ldVt0PXJdKSYmKG4uX19wYWdlX18mJlFjKCEwKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09bi5fX3BhZ2VfX30pP24uX19wcmVsb2FkX189ITE6bi5jbG9zZSgibm9uZSIpLGRlbGV0ZSBldVt0XSksbik7cmV0dXJuIGk/e2lkOmkuaWQsdXJsOnIsZXJyTXNnOiJ1blByZWxvYWRQYWdlOm9rIn06e3VybDpyLGVyck1zZzoidW5QcmVsb2FkUGFnZTpmYWlsIG5vdCBmb3VuZCJ9fSxwcmVsb2FkUGFnZTpmdW5jdGlvbihlLHQpe3ZhciBuPWUudXJsLHI9bi5zcGxpdCgiPyIpO29pKHQse2lkOmZ1bmN0aW9uKGUpe3ZhciB0PWUudXJsLG49ZS5wYXRoLHI9ZS5xdWVyeTtpZighZXVbdF0pe3ZhciBpPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoUHYuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXRoPT09bn0pKSk7ZXVbdF09UGMobixpLHIse19fcHJlbG9hZF9fOiEwLF9fcXVlcnlfXzpKU09OLnN0cmluZ2lmeShyKX0pfXJldHVybiBldVt0XX0oe3VybDpuLHBhdGg6clswXSxxdWVyeTp3KHJbMV18fCIiKX0pLmlkLHVybDpuLGVyck1zZzoicHJlbG9hZFBhZ2U6b2sifSl9LHNldFN0b3JhZ2U6ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS5rZXkscj1lLmRhdGEsaT0oZS5pc1N5bmMsdHlwZW9mIHIpLG89InN0cmluZyI9PT1pP3I6SlNPTi5zdHJpbmdpZnkoe3R5cGU6aSxkYXRhOnJ9KTt0cnl7InN0cmluZyI9PT1pJiZ2b2lkIDAhPT1kdShvKT9Ddi5zdG9yYWdlLnNldEl0ZW1Bc3luYyhuK3V1LGkpOkN2LnN0b3JhZ2UucmVtb3ZlSXRlbUFzeW5jKG4rdXUpLEN2LnN0b3JhZ2Uuc2V0SXRlbUFzeW5jKG4sbyxmdW5jdGlvbigpe29pKHQse2Vyck1zZzoic2V0U3RvcmFnZTpvayJ9KX0sZnVuY3Rpb24oZSl7b2kodCx7ZXJyTXNnOiJzZXRTdG9yYWdlOmZhaWwgIitlLm1lc3NhZ2V9KX0pfWNhdGNoKGUpe29pKHQse2Vyck1zZzoic2V0U3RvcmFnZTpmYWlsICIrZX0pfX0sc2V0U3RvcmFnZVN5bmM6ZnVuY3Rpb24oZSx0KXt2YXIgbj10eXBlb2YgdCxyPSJzdHJpbmciPT09bj90OkpTT04uc3RyaW5naWZ5KHt0eXBlOm4sZGF0YTp0fSk7dHJ5eyJzdHJpbmciPT09biYmdm9pZCAwIT09ZHUocik/Q3Yuc3RvcmFnZS5zZXRJdGVtKGUrdXUsbik6Q3Yuc3RvcmFnZS5yZW1vdmVJdGVtKGUrdXUpLEN2LnN0b3JhZ2Uuc2V0SXRlbShlLHIpfWNhdGNoKGUpe319LGdldFN0b3JhZ2U6ZnVuY3Rpb24oZSxyKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS5rZXk7Q3Yuc3RvcmFnZS5nZXRJdGVtQXN5bmModCxmdW5jdGlvbihuKXtDdi5zdG9yYWdlLmdldEl0ZW1Bc3luYyh0K3V1LGZ1bmN0aW9uKGUpe3ZhciB0PShlLmRhdGF8fCIiKS50b0xvd2VyQ2FzZSgpO29pKHIse2RhdGE6ZnUodCxuLmRhdGEpLGVyck1zZzoiZ2V0U3RvcmFnZTpvayJ9KX0sZnVuY3Rpb24oKXtvaShyLHtkYXRhOmZ1KCIiLG4uZGF0YSksZXJyTXNnOiJnZXRTdG9yYWdlOm9rIn0pfSl9LGZ1bmN0aW9uKGUpe29pKHIse2RhdGE6IiIsZXJyTXNnOiJnZXRTdG9yYWdlOmZhaWwgIitlLm1lc3NhZ2V9KX0pfSxnZXRTdG9yYWdlU3luYzpmdW5jdGlvbihlKXt2YXIgdD1Ddi5zdG9yYWdlLmdldEl0ZW0oZSksbj0oQ3Yuc3RvcmFnZS5nZXRJdGVtKGUrdXUpfHwiIikudG9Mb3dlckNhc2UoKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQ/IiI6ZnUobix0KX0scmVtb3ZlU3RvcmFnZTpmdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLmtleTtDdi5zdG9yYWdlLnJlbW92ZUl0ZW1Bc3luYyhuK3V1KSxDdi5zdG9yYWdlLnJlbW92ZUl0ZW1Bc3luYyhuLGZ1bmN0aW9uKGUpe29pKHQse2Vyck1zZzoicmVtb3ZlU3RvcmFnZTpvayJ9KX0sZnVuY3Rpb24oZSl7b2kodCx7ZXJyTXNnOiJyZW1vdmVTdG9yYWdlOmZhaWwgIitlLm1lc3NhZ2V9KX0pfSxyZW1vdmVTdG9yYWdlU3luYzpmdW5jdGlvbihlKXtDdi5zdG9yYWdlLnJlbW92ZUl0ZW0oZSt1dSksQ3Yuc3RvcmFnZS5yZW1vdmVJdGVtKGUpfSxjbGVhclN0b3JhZ2U6ZnVuY3Rpb24oZSx0KXtDdi5zdG9yYWdlLmNsZWFyQXN5bmMoZnVuY3Rpb24oZSl7b2kodCx7ZXJyTXNnOiJjbGVhclN0b3JhZ2U6b2sifSl9LGZ1bmN0aW9uKGUpe29pKHQse2Vyck1zZzoiY2xlYXJTdG9yYWdlOmZhaWwgIitlLm1lc3NhZ2V9KX0pfSxjbGVhclN0b3JhZ2VTeW5jOmZ1bmN0aW9uKCl7Q3Yuc3RvcmFnZS5jbGVhcigpfSxnZXRTdG9yYWdlSW5mbzpwdSxnZXRTdG9yYWdlSW5mb1N5bmM6ZnVuY3Rpb24oKXt2YXIgZT1wdSgpO3JldHVybiBkZWxldGUgZS5lcnJNc2csZX0sc2hvd0tleWJvYXJkOmZ1bmN0aW9uKCl7cmV0dXJuIEN2LmtleS5zaG93U29mdEtleWJvcmQoKSx7ZXJyTXNnOiJzaG93S2V5Ym9hcmQ6b2sifX0saGlkZUtleWJvYXJkOmZ1bmN0aW9uKCl7cmV0dXJuIEN2LmtleS5oaWRlU29mdEtleWJvcmQoKSx7ZXJyTXNnOiJoaWRlS2V5Ym9hcmQ6b2sifX0sc2V0TmF2aWdhdGlvbkJhclRpdGxlOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLl9fcGFnZV9fLG49ZS50aXRsZTt2b2lkIDA9PT1uJiYobj0iIik7dmFyIHI9dmkodCk7aWYocil7dmFyIGk9ci5nZXRTdHlsZSgpO3JldHVybiBpJiZpLnRpdGxlTlZpZXcmJnIuc2V0U3R5bGUoe3RpdGxlTlZpZXc6e3RpdGxlVGV4dDpufX0pLHtlcnJNc2c6InNldE5hdmlnYXRpb25CYXJUaXRsZTpvayJ9fXJldHVybntlcnJNc2c6InNldE5hdmlnYXRpb25CYXJUaXRsZTpmYWlsIn19LHNob3dOYXZpZ2F0aW9uQmFyTG9hZGluZzpmdW5jdGlvbigpe3JldHVybiBDdi5uYXRpdmVVSS5zaG93V2FpdGluZygiIix7bW9kYWw6ITF9KSx7ZXJyTXNnOiJzaG93TmF2aWdhdGlvbkJhckxvYWRpbmc6b2sifX0saGlkZU5hdmlnYXRpb25CYXJMb2FkaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIEN2Lm5hdGl2ZVVJLmNsb3NlV2FpdGluZygpLHtlcnJNc2c6ImhpZGVOYXZpZ2F0aW9uQmFyTG9hZGluZzpvayJ9fSxzZXROYXZpZ2F0aW9uQmFyQ29sb3I6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0LG4scj1lLl9fcGFnZV9fLGk9ZS5mcm9udENvbG9yLG89ZS5iYWNrZ3JvdW5kQ29sb3IsYT12aShyKTtpZihhKXt2YXIgcz17fTtpJiYocy50aXRsZUNvbG9yPWkpLG8mJihzLmJhY2tncm91bmRDb2xvcj1vKTt2YXIgYz0iIzAwMDAwMCI9PT1pPyJkYXJrIjoibGlnaHQiO0N2Lm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZShjKSx0PWMsKG49THYoKSkubGVuZ3RoJiYobltuLmxlbmd0aC0xXS4kcGFnZS5tZXRhLnN0YXR1c0JhclN0eWxlPXQpO3ZhciB1PWEuZ2V0U3R5bGUoKTtyZXR1cm4gdSYmdS50aXRsZU5WaWV3JiYodS50aXRsZU5WaWV3LmF1dG9CYWNrQnV0dG9uJiYocy5iYWNrQnV0dG9uPXMuYmFja0J1dHRvbnx8e30scy5iYWNrQnV0dG9uLmNvbG9yPWkpLGEuc2V0U3R5bGUoe3RpdGxlTlZpZXc6c30pKSx7ZXJyTXNnOiJzZXROYXZpZ2F0aW9uQmFyQ29sb3I6b2sifX1yZXR1cm57ZXJyTXNnOiJzZXROYXZpZ2F0aW9uQmFyQ29sb3I6ZmFpbCJ9fSxzaG93TG9hZGluZzpmdW5jdGlvbihlKXtyZXR1cm4gaGkoaHUsT2JqZWN0LmFzc2lnbih7fSxlLHt0eXBlOiJsb2FkaW5nIn0pLCJzaG93VG9hc3QiLCJzaG93TG9hZGluZyIpfSxoaWRlTG9hZGluZzpmdW5jdGlvbigpe3JldHVybiBoaSh2dSwibG9hZGluZyIsImhpZGUiLCJoaWRlTG9hZGluZyIpfSxzaG93VG9hc3Q6aHUsaGlkZVRvYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIGhpKHZ1LCJ0b2FzdCIsImhpZGUiLCJoaWRlVG9hc3QiKX0saGlkZTp2dSxzaG93TW9kYWw6ZnVuY3Rpb24oZSxpKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS50aXRsZTt2b2lkIDA9PT10JiYodD0iIik7dmFyIG49ZS5jb250ZW50O3ZvaWQgMD09PW4mJihuPSIiKTt2YXIgbz1lLnNob3dDYW5jZWw7dm9pZCAwPT09byYmKG89ITApO3ZhciByPWUuY2FuY2VsVGV4dCxhPShlLmNhbmNlbENvbG9yLGUuY29uZmlybVRleHQpLHM9KGUuY29uZmlybUNvbG9yLGUuZWRpdGFibGUpO3ZvaWQgMD09PXMmJihzPSExKTt2YXIgYz1lLnBsYWNlaG9sZGVyVGV4dDt2b2lkIDA9PT1jJiYoYz0iIik7dmFyIHU9bz9bcixhXTpbYV0sbD1zP2M6dTtuPW58fCIgIixDdi5uYXRpdmVVSVtzPyJwcm9tcHQiOiJjb25maXJtIl0obixmdW5jdGlvbihlKXtpZihvKXt2YXIgdD0xPT09ZS5pbmRleCxuPXtlcnJNc2c6InNob3dNb2RhbDpvayIsY29uZmlybTp0LGNhbmNlbDowPT09ZS5pbmRleHx8LTE9PT1lLmluZGV4fTt0JiZzJiYobi5jb250ZW50PWUudmFsdWUpLG9pKGksbil9ZWxzZXt2YXIgcj17ZXJyTXNnOiJzaG93TW9kYWw6b2siLGNvbmZpcm06MD09PWUuaW5kZXgsY2FuY2VsOiExfTtzJiYoci5jb250ZW50PWUudmFsdWUpLG9pKGkscil9fSx0LGwsdSl9LHNob3dBY3Rpb25TaGVldDpmdW5jdGlvbihlLHQpe3ZhciBuPWUuaXRlbUxpc3Q7dm9pZCAwPT09biYmKG49W10pO3ZhciByPWUuaXRlbUNvbG9yO3ZvaWQgMD09PXImJihyPSIjMDAwMDAwIik7dmFyIGk9ZS50aXRsZTt2b2lkIDA9PT1pJiYoaT0iIik7dmFyIG89ZS5wb3BvdmVyLGE9e2J1dHRvbnM6bi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJue3RpdGxlOmUsY29sb3I6cn19KX07aSYmKGEudGl0bGU9aSksYS5jYW5jZWw9UWUoInVuaS5zaG93QWN0aW9uU2hlZXQuY2FuY2VsIiksQ3YubmF0aXZlVUkuYWN0aW9uU2hlZXQoT2JqZWN0LmFzc2lnbihhLHtwb3BvdmVyOm99KSxmdW5jdGlvbihlKXswPGUuaW5kZXg/b2kodCx7ZXJyTXNnOiJzaG93QWN0aW9uU2hlZXQ6b2siLHRhcEluZGV4OmUuaW5kZXgtMX0pOm9pKHQse2Vyck1zZzoic2hvd0FjdGlvblNoZWV0OmZhaWwgY2FuY2VsIn0pfSl9LHNldFRhYkJhckJhZGdlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuaW5kZXgsbj1lLnRleHQscj1lLnR5cGU7cmV0dXJuIHZvaWQgMD09PXImJihyPSJ0ZXh0IiksTGEuc2V0VGFiQmFyQmFkZ2Uocix0LG4pLHtlcnJNc2c6InNldFRhYkJhckJhZGdlOm9rIn19LHNldFRhYkJhckl0ZW06ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5pbmRleCxuPWUudGV4dCxyPWUuaWNvblBhdGgsaT1lLnNlbGVjdGVkSWNvblBhdGgsbz1lLnBhZ2VQYXRoLGE9ZS52aXNpYmxlLHM9ZS5pY29uZm9udDtMYS5zZXRUYWJCYXJJdGVtKHQsbixyLGksYSxzKTt2YXIgYz1vJiZQdi5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT1vfSk7aWYoYyl7dmFyIHU9Yy5tZXRhO3UuaXNUYWJCYXI9ITAsdS50YWJCYXJJbmRleD10LHUuaXNRdWl0PSEwO3ZhciBsPSR2LnRhYkJhcjtsJiZsLmxpc3QmJmwubGlzdFt0XSYmKGwubGlzdFt0XS5wYWdlUGF0aD1vLnN0YXJ0c1dpdGgoIi8iKT9vLnN1YnN0cmluZygxKTpvKX1yZXR1cm57ZXJyTXNnOiJzZXRUYWJCYXJJdGVtOm9rIn19LHNldFRhYkJhclN0eWxlOmZ1bmN0aW9uKGUpe2lmKHZvaWQgMD09PWUmJihlPXt9KSwhZGkoKSlyZXR1cm57ZXJyTXNnOiJzZXRUYWJCYXJTdHlsZTpmYWlsIG5vdCBUYWJCYXIgcGFnZSJ9O3ZhciB0PXtibGFjazoicmdiYSgwLDAsMCwwLjQpIix3aGl0ZToicmdiYSgyNTUsMjU1LDI1NSwwLjQpIn0sbj1lLmJvcmRlclN0eWxlO3JldHVybiBuIGluIHQmJihlLmJvcmRlclN0eWxlPXRbbl0pLExhLnNldFRhYkJhclN0eWxlKGUpLHtlcnJNc2c6InNldFRhYkJhclN0eWxlOm9rIn19LGhpZGVUYWJCYXI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hbmltYXRpb247cmV0dXJuIGRpKCk/KExhLmhpZGVUYWJCYXIodCkse2Vyck1zZzoiaGlkZVRhYkJhcjpvayJ9KTp7ZXJyTXNnOiJoaWRlVGFiQmFyOmZhaWwgbm90IFRhYkJhciBwYWdlIn19LHNob3dUYWJCYXI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hbmltYXRpb247cmV0dXJuIGRpKCk/KExhLnNob3dUYWJCYXIodCkse2Vyck1zZzoic2hvd1RhYkJhcjpvayJ9KTp7ZXJyTXNnOiJzaG93VGFiQmFyOmZhaWwgbm90IFRhYkJhciBwYWdlIn19LHJlcXVlc3RDb21wb25lbnRJbmZvOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG87ZS4kcGFnZS5tZXRhLmlzTlZ1ZT9idShlLHQsbik6KHI9ZSxpPXQsbz1uLFR2LnB1Ymxpc2hIYW5kbGVyKCJyZXF1ZXN0Q29tcG9uZW50SW5mbyIse3JlcUlkOnl1LnB1c2gobykscmVxczppfSxyLiRwYWdlLmlkKSl9LGNyZWF0ZVJld2FyZGVkVmlkZW9BZDpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IE91KGUpfSxjcmVhdGVGdWxsU2NyZWVuVmlkZW9BZDpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IEx1KGUpfSxjcmVhdGVJbnRlcnN0aXRpYWxBZDpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IEJ1KGUpfSxjcmVhdGVJbnRlcmFjdGl2ZUFkOmZ1bmN0aW9uKGUpe3JldHVybiBlLnByb3ZpZGVyP2UuYWRwaWQ/bmV3IFJ1KGUpOm5ldyBFcnJvcigiYWRwaWQgaW52YWxpZCIpOm5ldyBFcnJvcigicHJvdmlkZXIgaW52YWxpZCIpfX0pLHp1PU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSxGdSxpaSk7ZnVuY3Rpb24gVnUoZSl7Zm9yKHZhciB0PVtdLG49YXJndW1lbnRzLmxlbmd0aC0xOzA8bi0tOyl0W25dPWFyZ3VtZW50c1tuKzFdO3JldHVybiB6dVtlXS5hcHBseShudWxsLHQpfWZ1bmN0aW9uIFV1KGUsdCl7cmV0dXJuIFR2Lm9uKCJhcGkuIitlLHQpfWZ1bmN0aW9uIHF1KGUpe3ZhciB0PUx2KCksbj10Lmxlbmd0aDtyZXR1cm4gbnx8VHYuZW1pdCgib25FcnJvciIsZSsiOmZhaWwiKSx0W24tMV0uJHZtfWZ1bmN0aW9uIFd1KCl7dmFyIGU9THYoKSx0PWVbZS5sZW5ndGgtMV07cmV0dXJuIHQmJnQuJHBhZ2UuaWR9dmFyIEh1PVsiY2FucGxheSIsInBsYXkiLCJwYXVzZSIsInN0b3AiLCJlbmRlZCIsInRpbWVVcGRhdGUiLCJwcmV2IiwibmV4dCIsImVycm9yIiwid2FpdGluZyJdLEd1PXt9O0h1LmZvckVhY2goZnVuY3Rpb24oZSl7R3VbZV09W119KTt2YXIgWHUsWXU9W3tuYW1lOiJkdXJhdGlvbiIscmVhZG9ubHk6ITB9LHtuYW1lOiJjdXJyZW50VGltZSIscmVhZG9ubHk6ITB9LHtuYW1lOiJwYXVzZWQiLHJlYWRvbmx5OiEwfSx7bmFtZToic3JjIixjYWNoZTohMH0se25hbWU6InN0YXJ0VGltZSIsZGVmYXVsdDowLGNhY2hlOiEwfSx7bmFtZToiYnVmZmVyZWQiLHJlYWRvbmx5OiEwfSx7bmFtZToidGl0bGUiLGNhY2hlOiEwfSx7bmFtZToiZXBuYW1lIixjYWNoZTohMH0se25hbWU6InNpbmdlciIsY2FjaGU6ITB9LHtuYW1lOiJjb3ZlckltZ1VybCIsY2FjaGU6ITB9LHtuYW1lOiJ3ZWJVcmwiLGNhY2hlOiEwfSx7bmFtZToicHJvdG9jb2wiLHJlYWRvbmx5OiEwLGRlZmF1bHQ6Imh0dHAifSx7bmFtZToicGxheWJhY2tSYXRlIixkZWZhdWx0OjEsY2FjaGU6ITB9XSxKdT1bInByZXYiLCJuZXh0Il0sS3U9ZnVuY3Rpb24oKXt2YXIgcj10aGlzO3RoaXMuX29wdGlvbnM9e30sVXUoIm9uQmFja2dyb3VuZEF1ZGlvU3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUuc3RhdGUsbj1lLmVyck1zZyxyPWUuZXJyQ29kZTtHdVt0XS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlKCJlcnJvciI9PT10P3tlcnJNc2c6bixlcnJDb2RlOnJ9Ont9KX0pfSksSnUuZm9yRWFjaChmdW5jdGlvbihlKXtVdSgib25CYWNrZ3JvdW5kQXVkaW8iKyhlWzBdLnRvVXBwZXJDYXNlKCkrZS5zdWJzdHIoMSkpLGZ1bmN0aW9uKCl7R3VbZV0uZm9yRWFjaChmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmZSh7fSl9KX0pfSksWXUuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgbj10Lm5hbWUsZT17Z2V0OmZ1bmN0aW9uKCl7dmFyIGU9dC5jYWNoZT90aGlzLl9vcHRpb25zOlZ1KCJnZXRCYWNrZ3JvdW5kQXVkaW9TdGF0ZSIpO3JldHVybiBuIGluIGU/ZVtuXTp0LmRlZmF1bHR9fTt0LnJlYWRvbmx5fHwoZS5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5fb3B0aW9uc1tuXT1lLFZ1KCJzZXRCYWNrZ3JvdW5kQXVkaW9TdGF0ZSIsT2JqZWN0LmFzc2lnbih7fSx0aGlzLl9vcHRpb25zLHthdWRpb0lkOnRoaXMuaWR9KSxuKX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLG4sZSl9KX07S3UucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLl9vcGVyYXRlKCJwbGF5Iil9LEt1LnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMuX29wZXJhdGUoInBhdXNlIil9LEt1LnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKCl7dGhpcy5fb3BlcmF0ZSgic3RvcCIpfSxLdS5wcm90b3R5cGUuc2Vlaz1mdW5jdGlvbihlKXt0aGlzLl9vcGVyYXRlKCJzZWVrIix7Y3VycmVudFRpbWU6ZX0pfSxLdS5wcm90b3R5cGUuX29wZXJhdGU9ZnVuY3Rpb24oZSx0KXtWdSgib3BlcmF0ZUJhY2tncm91bmRBdWRpbyIsT2JqZWN0LmFzc2lnbih7fSx0LHtvcGVyYXRpb25UeXBlOmV9KSl9LEh1LmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9dFswXS50b1VwcGVyQ2FzZSgpK3Quc3Vic3RyKDEpO0t1LnByb3RvdHlwZVsib24iK2VdPWZ1bmN0aW9uKGUpe0d1W3RdLnB1c2goZSl9fSk7dmFyIFp1PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldEJhY2tncm91bmRBdWRpb01hbmFnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gWHV8fChYdT1uZXcgS3UpfX0pLFF1PWpyKGZ1bmN0aW9uKGUsdCl7dmFyIG49InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5JiYidW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQxNkFycmF5JiYidW5kZWZpbmVkIiE9dHlwZW9mIEludDMyQXJyYXk7dC5hc3NpZ249ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG4scj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7ci5sZW5ndGg7KXt2YXIgaT1yLnNoaWZ0KCk7aWYoaSl7aWYoIm9iamVjdCIhPXR5cGVvZiBpKXRocm93IG5ldyBUeXBlRXJyb3IoaSsibXVzdCBiZSBub24tb2JqZWN0Iik7Zm9yKHZhciBvIGluIGkpdD1pLG49byxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxuKSYmKGVbb109aVtvXSl9fXJldHVybiBlfSx0LnNocmlua0J1Zj1mdW5jdGlvbihlLHQpe3JldHVybiBlLmxlbmd0aD09PXQ/ZTplLnN1YmFycmF5P2Uuc3ViYXJyYXkoMCx0KTooZS5sZW5ndGg9dCxlKX07dmFyIHI9e2FycmF5U2V0OmZ1bmN0aW9uKGUsdCxuLHIsaSl7aWYodC5zdWJhcnJheSYmZS5zdWJhcnJheSllLnNldCh0LnN1YmFycmF5KG4sbityKSxpKTtlbHNlIGZvcih2YXIgbz0wO288cjtvKyspZVtpK29dPXRbbitvXX0sZmxhdHRlbkNodW5rczpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGE7Zm9yKHQ9cj0wLG49ZS5sZW5ndGg7dDxuO3QrKylyKz1lW3RdLmxlbmd0aDtmb3IoYT1uZXcgVWludDhBcnJheShyKSx0PWk9MCxuPWUubGVuZ3RoO3Q8bjt0Kyspbz1lW3RdLGEuc2V0KG8saSksaSs9by5sZW5ndGg7cmV0dXJuIGF9fSxpPXthcnJheVNldDpmdW5jdGlvbihlLHQsbixyLGkpe2Zvcih2YXIgbz0wO288cjtvKyspZVtpK29dPXRbbitvXX0sZmxhdHRlbkNodW5rczpmdW5jdGlvbihlKXtyZXR1cm5bXS5jb25jYXQuYXBwbHkoW10sZSl9fTt0LnNldFR5cGVkPWZ1bmN0aW9uKGUpe2U/KHQuQnVmOD1VaW50OEFycmF5LHQuQnVmMTY9VWludDE2QXJyYXksdC5CdWYzMj1JbnQzMkFycmF5LHQuYXNzaWduKHQscikpOih0LkJ1Zjg9QXJyYXksdC5CdWYxNj1BcnJheSx0LkJ1ZjMyPUFycmF5LHQuYXNzaWduKHQsaSkpfSx0LnNldFR5cGVkKG4pfSksZWw9KFF1LmFzc2lnbixRdS5zaHJpbmtCdWYsUXUuc2V0VHlwZWQsUXUuQnVmOCxRdS5CdWYxNixRdS5CdWYzMiwwKSx0bD0xO2Z1bmN0aW9uIG5sKGUpe2Zvcih2YXIgdD1lLmxlbmd0aDswPD0tLXQ7KWVbdF09MH12YXIgcmw9MCxpbD0yOSxvbD0yNTYsYWw9b2wrMStpbCxzbD0zMCxjbD0xOSx1bD0yKmFsKzEsbGw9MTUsZGw9MTYsZmw9NyxwbD0yNTYsaGw9MTYsdmw9MTcsZ2w9MTgsbWw9WzAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDIsMiwyLDIsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsMF0seWw9WzAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTNdLF9sPVswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMyw3XSxibD1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0sd2w9bmV3IEFycmF5KDIqKGFsKzIpKTtubCh3bCk7dmFyIGtsPW5ldyBBcnJheSgyKnNsKTtubChrbCk7dmFyIFNsPW5ldyBBcnJheSg1MTIpO25sKFNsKTt2YXIgeGw9bmV3IEFycmF5KDI1Nik7bmwoeGwpO3ZhciBDbD1uZXcgQXJyYXkoaWwpO25sKENsKTt2YXIgVGwsT2wsRWwsSWw9bmV3IEFycmF5KHNsKTtmdW5jdGlvbiBBbChlLHQsbixyLGkpe3RoaXMuc3RhdGljX3RyZWU9ZSx0aGlzLmV4dHJhX2JpdHM9dCx0aGlzLmV4dHJhX2Jhc2U9bix0aGlzLmVsZW1zPXIsdGhpcy5tYXhfbGVuZ3RoPWksdGhpcy5oYXNfc3RyZWU9ZSYmZS5sZW5ndGh9ZnVuY3Rpb24gJGwoZSx0KXt0aGlzLmR5bl90cmVlPWUsdGhpcy5tYXhfY29kZT0wLHRoaXMuc3RhdF9kZXNjPXR9ZnVuY3Rpb24gUGwoZSl7cmV0dXJuIGU8MjU2P1NsW2VdOlNsWzI1NisoZT4+PjcpXX1mdW5jdGlvbiBNbChlLHQpe2UucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPTI1NSZ0LGUucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPXQ+Pj44JjI1NX1mdW5jdGlvbiBqbChlLHQsbil7ZS5iaV92YWxpZD5kbC1uPyhlLmJpX2J1Znw9dDw8ZS5iaV92YWxpZCY2NTUzNSxNbChlLGUuYmlfYnVmKSxlLmJpX2J1Zj10Pj5kbC1lLmJpX3ZhbGlkLGUuYmlfdmFsaWQrPW4tZGwpOihlLmJpX2J1Znw9dDw8ZS5iaV92YWxpZCY2NTUzNSxlLmJpX3ZhbGlkKz1uKX1mdW5jdGlvbiBMbChlLHQsbil7amwoZSxuWzIqdF0sblsyKnQrMV0pfWZ1bmN0aW9uIEJsKGUsdCl7Zm9yKHZhciBuPTA7bnw9MSZlLGU+Pj49MSxuPDw9MSwwPC0tdDspO3JldHVybiBuPj4+MX1mdW5jdGlvbiBObChlLHQsbil7dmFyIHIsaSxvPW5ldyBBcnJheShsbCsxKSxhPTA7Zm9yKHI9MTtyPD1sbDtyKyspb1tyXT1hPWErbltyLTFdPDwxO2ZvcihpPTA7aTw9dDtpKyspe3ZhciBzPWVbMippKzFdOzAhPT1zJiYoZVsyKmldPUJsKG9bc10rKyxzKSl9fWZ1bmN0aW9uIERsKGUpe3ZhciB0O2Zvcih0PTA7dDxhbDt0KyspZS5keW5fbHRyZWVbMip0XT0wO2Zvcih0PTA7dDxzbDt0KyspZS5keW5fZHRyZWVbMip0XT0wO2Zvcih0PTA7dDxjbDt0KyspZS5ibF90cmVlWzIqdF09MDtlLmR5bl9sdHJlZVsyKnBsXT0xLGUub3B0X2xlbj1lLnN0YXRpY19sZW49MCxlLmxhc3RfbGl0PWUubWF0Y2hlcz0wfWZ1bmN0aW9uIFJsKGUpezg8ZS5iaV92YWxpZD9NbChlLGUuYmlfYnVmKTowPGUuYmlfdmFsaWQmJihlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT1lLmJpX2J1ZiksZS5iaV9idWY9MCxlLmJpX3ZhbGlkPTB9ZnVuY3Rpb24gRmwoZSx0LG4scil7dmFyIGk9Mip0LG89MipuO3JldHVybiBlW2ldPGVbb118fGVbaV09PT1lW29dJiZyW3RdPD1yW25dfWZ1bmN0aW9uIHpsKGUsdCxuKXtmb3IodmFyIHI9ZS5oZWFwW25dLGk9bjw8MTtpPD1lLmhlYXBfbGVuJiYoaTxlLmhlYXBfbGVuJiZGbCh0LGUuaGVhcFtpKzFdLGUuaGVhcFtpXSxlLmRlcHRoKSYmaSsrLCFGbCh0LHIsZS5oZWFwW2ldLGUuZGVwdGgpKTspZS5oZWFwW25dPWUuaGVhcFtpXSxuPWksaTw8PTE7ZS5oZWFwW25dPXJ9ZnVuY3Rpb24gVmwoZSx0LG4pe3ZhciByLGksbyxhLHM9MDtpZigwIT09ZS5sYXN0X2xpdClmb3IoO3I9ZS5wZW5kaW5nX2J1ZltlLmRfYnVmKzIqc108PDh8ZS5wZW5kaW5nX2J1ZltlLmRfYnVmKzIqcysxXSxpPWUucGVuZGluZ19idWZbZS5sX2J1ZitzXSxzKyssMD09PXI/TGwoZSxpLHQpOihMbChlLChvPXhsW2ldKStvbCsxLHQpLDAhPT0oYT1tbFtvXSkmJmpsKGUsaS09Q2xbb10sYSksTGwoZSxvPVBsKC0tciksbiksMCE9PShhPXlsW29dKSYmamwoZSxyLT1JbFtvXSxhKSksczxlLmxhc3RfbGl0Oyk7TGwoZSxwbCx0KX1mdW5jdGlvbiBVbChlLHQpe3ZhciBuLHIsaSxvPXQuZHluX3RyZWUsYT10LnN0YXRfZGVzYy5zdGF0aWNfdHJlZSxzPXQuc3RhdF9kZXNjLmhhc19zdHJlZSxjPXQuc3RhdF9kZXNjLmVsZW1zLHU9LTE7Zm9yKGUuaGVhcF9sZW49MCxlLmhlYXBfbWF4PXVsLG49MDtuPGM7bisrKTAhPT1vWzIqbl0/KGUuaGVhcFsrK2UuaGVhcF9sZW5dPXU9bixlLmRlcHRoW25dPTApOm9bMipuKzFdPTA7Zm9yKDtlLmhlYXBfbGVuPDI7KW9bMiooaT1lLmhlYXBbKytlLmhlYXBfbGVuXT11PDI/Kyt1OjApXT0xLGUuZGVwdGhbaV09MCxlLm9wdF9sZW4tLSxzJiYoZS5zdGF0aWNfbGVuLT1hWzIqaSsxXSk7Zm9yKHQubWF4X2NvZGU9dSxuPWUuaGVhcF9sZW4+PjE7MTw9bjtuLS0pemwoZSxvLG4pO2ZvcihpPWM7bj1lLmhlYXBbMV0sZS5oZWFwWzFdPWUuaGVhcFtlLmhlYXBfbGVuLS1dLHpsKGUsbywxKSxyPWUuaGVhcFsxXSxlLmhlYXBbLS1lLmhlYXBfbWF4XT1uLGUuaGVhcFstLWUuaGVhcF9tYXhdPXIsb1syKmldPW9bMipuXStvWzIqcl0sZS5kZXB0aFtpXT0oZS5kZXB0aFtuXT49ZS5kZXB0aFtyXT9lLmRlcHRoW25dOmUuZGVwdGhbcl0pKzEsb1syKm4rMV09b1syKnIrMV09aSxlLmhlYXBbMV09aSsrLHpsKGUsbywxKSwyPD1lLmhlYXBfbGVuOyk7ZS5oZWFwWy0tZS5oZWFwX21heF09ZS5oZWFwWzFdLGZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYSxzLGM9dC5keW5fdHJlZSx1PXQubWF4X2NvZGUsbD10LnN0YXRfZGVzYy5zdGF0aWNfdHJlZSxkPXQuc3RhdF9kZXNjLmhhc19zdHJlZSxmPXQuc3RhdF9kZXNjLmV4dHJhX2JpdHMscD10LnN0YXRfZGVzYy5leHRyYV9iYXNlLGg9dC5zdGF0X2Rlc2MubWF4X2xlbmd0aCx2PTA7Zm9yKG89MDtvPD1sbDtvKyspZS5ibF9jb3VudFtvXT0wO2ZvcihjWzIqZS5oZWFwW2UuaGVhcF9tYXhdKzFdPTAsbj1lLmhlYXBfbWF4KzE7bjx1bDtuKyspaDwobz1jWzIqY1syKihyPWUuaGVhcFtuXSkrMV0rMV0rMSkmJihvPWgsdisrKSxjWzIqcisxXT1vLHU8cnx8KGUuYmxfY291bnRbb10rKyxhPTAscDw9ciYmKGE9ZltyLXBdKSxzPWNbMipyXSxlLm9wdF9sZW4rPXMqKG8rYSksZCYmKGUuc3RhdGljX2xlbis9cyoobFsyKnIrMV0rYSkpKTtpZigwIT09dil7ZG97Zm9yKG89aC0xOzA9PT1lLmJsX2NvdW50W29dOylvLS07ZS5ibF9jb3VudFtvXS0tLGUuYmxfY291bnRbbysxXSs9MixlLmJsX2NvdW50W2hdLS0sdi09Mn13aGlsZSgwPHYpO2ZvcihvPWg7MCE9PW87by0tKWZvcihyPWUuYmxfY291bnRbb107MCE9PXI7KXU8KGk9ZS5oZWFwWy0tbl0pfHwoY1syKmkrMV0hPT1vJiYoZS5vcHRfbGVuKz0oby1jWzIqaSsxXSkqY1syKmldLGNbMippKzFdPW8pLHItLSl9fShlLHQpLE5sKG8sdSxlLmJsX2NvdW50KX1mdW5jdGlvbiBxbChlLHQsbil7dmFyIHIsaSxvPS0xLGE9dFsxXSxzPTAsYz03LHU9NDtmb3IoMD09PWEmJihjPTEzOCx1PTMpLHRbMioobisxKSsxXT02NTUzNSxyPTA7cjw9bjtyKyspaT1hLGE9dFsyKihyKzEpKzFdLCsrczxjJiZpPT09YXx8KHM8dT9lLmJsX3RyZWVbMippXSs9czowIT09aT8oaSE9PW8mJmUuYmxfdHJlZVsyKmldKyssZS5ibF90cmVlWzIqaGxdKyspOnM8PTEwP2UuYmxfdHJlZVsyKnZsXSsrOmUuYmxfdHJlZVsyKmdsXSsrLG89aSwocz0wKT09PWE/KGM9MTM4LHU9Myk6aT09PWE/KGM9Nix1PTMpOihjPTcsdT00KSl9ZnVuY3Rpb24gV2woZSx0LG4pe3ZhciByLGksbz0tMSxhPXRbMV0scz0wLGM9Nyx1PTQ7Zm9yKDA9PT1hJiYoYz0xMzgsdT0zKSxyPTA7cjw9bjtyKyspaWYoaT1hLGE9dFsyKihyKzEpKzFdLCEoKytzPGMmJmk9PT1hKSl7aWYoczx1KWZvcig7TGwoZSxpLGUuYmxfdHJlZSksMCE9LS1zOyk7ZWxzZSAwIT09aT8oaSE9PW8mJihMbChlLGksZS5ibF90cmVlKSxzLS0pLExsKGUsaGwsZS5ibF90cmVlKSxqbChlLHMtMywyKSk6czw9MTA/KExsKGUsdmwsZS5ibF90cmVlKSxqbChlLHMtMywzKSk6KExsKGUsZ2wsZS5ibF90cmVlKSxqbChlLHMtMTEsNykpO289aSwocz0wKT09PWE/KGM9MTM4LHU9Myk6aT09PWE/KGM9Nix1PTMpOihjPTcsdT00KX19bmwoSWwpO3ZhciBIbD0hMTtmdW5jdGlvbiBHbChlLHQsbixyKXt2YXIgaSxvLGEscztqbChlLChybDw8MSkrKHI/MTowKSwzKSxvPXQsYT1uLHM9ITAsUmwoaT1lKSxzJiYoTWwoaSxhKSxNbChpLH5hKSksUXUuYXJyYXlTZXQoaS5wZW5kaW5nX2J1ZixpLndpbmRvdyxvLGEsaS5wZW5kaW5nKSxpLnBlbmRpbmcrPWF9dmFyIFhsPXtfdHJfaW5pdDpmdW5jdGlvbihlKXtIbHx8KGZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaSxvPW5ldyBBcnJheShsbCsxKTtmb3Iocj1uPTA7cjxpbC0xO3IrKylmb3IoQ2xbcl09bixlPTA7ZTwxPDxtbFtyXTtlKyspeGxbbisrXT1yO2Zvcih4bFtuLTFdPXIscj1pPTA7cjwxNjtyKyspZm9yKElsW3JdPWksZT0wO2U8MTw8eWxbcl07ZSsrKVNsW2krK109cjtmb3IoaT4+PTc7cjxzbDtyKyspZm9yKElsW3JdPWk8PDcsZT0wO2U8MTw8eWxbcl0tNztlKyspU2xbMjU2K2krK109cjtmb3IodD0wO3Q8PWxsO3QrKylvW3RdPTA7Zm9yKGU9MDtlPD0xNDM7KXdsWzIqZSsxXT04LGUrKyxvWzhdKys7Zm9yKDtlPD0yNTU7KXdsWzIqZSsxXT05LGUrKyxvWzldKys7Zm9yKDtlPD0yNzk7KXdsWzIqZSsxXT03LGUrKyxvWzddKys7Zm9yKDtlPD0yODc7KXdsWzIqZSsxXT04LGUrKyxvWzhdKys7Zm9yKE5sKHdsLGFsKzEsbyksZT0wO2U8c2w7ZSsrKWtsWzIqZSsxXT01LGtsWzIqZV09QmwoZSw1KTtUbD1uZXcgQWwod2wsbWwsb2wrMSxhbCxsbCksT2w9bmV3IEFsKGtsLHlsLDAsc2wsbGwpLEVsPW5ldyBBbChuZXcgQXJyYXkoMCksX2wsMCxjbCxmbCl9KCksSGw9ITApLGUubF9kZXNjPW5ldyAkbChlLmR5bl9sdHJlZSxUbCksZS5kX2Rlc2M9bmV3ICRsKGUuZHluX2R0cmVlLE9sKSxlLmJsX2Rlc2M9bmV3ICRsKGUuYmxfdHJlZSxFbCksZS5iaV9idWY9MCxlLmJpX3ZhbGlkPTAsRGwoZSl9LF90cl9zdG9yZWRfYmxvY2s6R2wsX3RyX2ZsdXNoX2Jsb2NrOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYT0wOzA8ZS5sZXZlbD8oMj09PWUuc3RybS5kYXRhX3R5cGUmJihlLnN0cm0uZGF0YV90eXBlPWZ1bmN0aW9uKGUpe3ZhciB0LG49NDA5MzYyNDQ0Nztmb3IodD0wO3Q8PTMxO3QrKyxuPj4+PTEpaWYoMSZuJiYwIT09ZS5keW5fbHRyZWVbMip0XSlyZXR1cm4gZWw7aWYoMCE9PWUuZHluX2x0cmVlWzE4XXx8MCE9PWUuZHluX2x0cmVlWzIwXXx8MCE9PWUuZHluX2x0cmVlWzI2XSlyZXR1cm4gdGw7Zm9yKHQ9MzI7dDxvbDt0KyspaWYoMCE9PWUuZHluX2x0cmVlWzIqdF0pcmV0dXJuIHRsO3JldHVybiBlbH0oZSkpLFVsKGUsZS5sX2Rlc2MpLFVsKGUsZS5kX2Rlc2MpLGE9ZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHFsKGUsZS5keW5fbHRyZWUsZS5sX2Rlc2MubWF4X2NvZGUpLHFsKGUsZS5keW5fZHRyZWUsZS5kX2Rlc2MubWF4X2NvZGUpLFVsKGUsZS5ibF9kZXNjKSx0PWNsLTE7Mzw9dCYmMD09PWUuYmxfdHJlZVsyKmJsW3RdKzFdO3QtLSk7cmV0dXJuIGUub3B0X2xlbis9MyoodCsxKSs1KzUrNCx0fShlKSxpPWUub3B0X2xlbiszKzc+Pj4zLChvPWUuc3RhdGljX2xlbiszKzc+Pj4zKTw9aSYmKGk9bykpOmk9bz1uKzUsbis0PD1pJiYtMSE9PXQ/R2woZSx0LG4scik6ND09PWUuc3RyYXRlZ3l8fG89PT1pPyhqbChlLDIrKHI/MTowKSwzKSxWbChlLHdsLGtsKSk6KGpsKGUsNCsocj8xOjApLDMpLGZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpO2ZvcihqbChlLHQtMjU3LDUpLGpsKGUsbi0xLDUpLGpsKGUsci00LDQpLGk9MDtpPHI7aSsrKWpsKGUsZS5ibF90cmVlWzIqYmxbaV0rMV0sMyk7V2woZSxlLmR5bl9sdHJlZSx0LTEpLFdsKGUsZS5keW5fZHRyZWUsbi0xKX0oZSxlLmxfZGVzYy5tYXhfY29kZSsxLGUuZF9kZXNjLm1heF9jb2RlKzEsYSsxKSxWbChlLGUuZHluX2x0cmVlLGUuZHluX2R0cmVlKSksRGwoZSksciYmUmwoZSl9LF90cl90YWxseTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGUucGVuZGluZ19idWZbZS5kX2J1ZisyKmUubGFzdF9saXRdPXQ+Pj44JjI1NSxlLnBlbmRpbmdfYnVmW2UuZF9idWYrMiplLmxhc3RfbGl0KzFdPTI1NSZ0LGUucGVuZGluZ19idWZbZS5sX2J1ZitlLmxhc3RfbGl0XT0yNTUmbixlLmxhc3RfbGl0KyssMD09PXQ/ZS5keW5fbHRyZWVbMipuXSsrOihlLm1hdGNoZXMrKyx0LS0sZS5keW5fbHRyZWVbMiooeGxbbl0rb2wrMSldKyssZS5keW5fZHRyZWVbMipQbCh0KV0rKyksZS5sYXN0X2xpdD09PWUubGl0X2J1ZnNpemUtMX0sX3RyX2FsaWduOmZ1bmN0aW9uKGUpe3ZhciB0O2psKGUsMiwzKSxMbChlLHBsLHdsKSwxNj09PSh0PWUpLmJpX3ZhbGlkPyhNbCh0LHQuYmlfYnVmKSx0LmJpX2J1Zj0wLHQuYmlfdmFsaWQ9MCk6ODw9dC5iaV92YWxpZCYmKHQucGVuZGluZ19idWZbdC5wZW5kaW5nKytdPTI1NSZ0LmJpX2J1Zix0LmJpX2J1Zj4+PTgsdC5iaV92YWxpZC09OCl9fTt2YXIgWWw9ZnVuY3Rpb24oZSx0LG4scil7Zm9yKHZhciBpPTY1NTM1JmV8MCxvPWU+Pj4xNiY2NTUzNXwwLGE9MDswIT09bjspe2ZvcihuLT1hPTJlMzxuPzJlMzpuO289bysoaT1pK3RbcisrXXwwKXwwLC0tYTspO2klPTY1NTIxLG8lPTY1NTIxfXJldHVybiBpfG88PDE2fDB9O3ZhciBKbD1mdW5jdGlvbigpe2Zvcih2YXIgZSx0PVtdLG49MDtuPDI1NjtuKyspe2U9bjtmb3IodmFyIHI9MDtyPDg7cisrKWU9MSZlPzM5ODgyOTIzODReZT4+PjE6ZT4+PjE7dFtuXT1lfXJldHVybiB0fSgpO3ZhciBLbCxabD1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT1KbCxvPXIrbjtlXj0tMTtmb3IodmFyIGE9cjthPG87YSsrKWU9ZT4+PjheaVsyNTUmKGVedFthXSldO3JldHVybi0xXmV9LFFsPXsyOiJuZWVkIGRpY3Rpb25hcnkiLDE6InN0cmVhbSBlbmQiLDA6IiIsIi0xIjoiZmlsZSBlcnJvciIsIi0yIjoic3RyZWFtIGVycm9yIiwiLTMiOiJkYXRhIGVycm9yIiwiLTQiOiJpbnN1ZmZpY2llbnQgbWVtb3J5IiwiLTUiOiJidWZmZXIgZXJyb3IiLCItNiI6ImluY29tcGF0aWJsZSB2ZXJzaW9uIn0sZWQ9MCx0ZD00LG5kPTAscmQ9LTIsaWQ9LTEsb2Q9NCxhZD0yLHNkPTgsY2Q9OSx1ZD0yODYsbGQ9MzAsZGQ9MTksZmQ9Mip1ZCsxLHBkPTE1LGhkPTMsdmQ9MjU4LGdkPXZkK2hkKzEsbWQ9NDIseWQ9MTEzLF9kPTEsYmQ9Mix3ZD0zLGtkPTQ7ZnVuY3Rpb24gU2QoZSx0KXtyZXR1cm4gZS5tc2c9UWxbdF0sdH1mdW5jdGlvbiB4ZChlKXtyZXR1cm4oZTw8MSktKDQ8ZT85OjApfWZ1bmN0aW9uIENkKGUpe2Zvcih2YXIgdD1lLmxlbmd0aDswPD0tLXQ7KWVbdF09MH1mdW5jdGlvbiBUZChlKXt2YXIgdD1lLnN0YXRlLG49dC5wZW5kaW5nO24+ZS5hdmFpbF9vdXQmJihuPWUuYXZhaWxfb3V0KSwwIT09biYmKFF1LmFycmF5U2V0KGUub3V0cHV0LHQucGVuZGluZ19idWYsdC5wZW5kaW5nX291dCxuLGUubmV4dF9vdXQpLGUubmV4dF9vdXQrPW4sdC5wZW5kaW5nX291dCs9bixlLnRvdGFsX291dCs9bixlLmF2YWlsX291dC09bix0LnBlbmRpbmctPW4sMD09PXQucGVuZGluZyYmKHQucGVuZGluZ19vdXQ9MCkpfWZ1bmN0aW9uIE9kKGUsdCl7WGwuX3RyX2ZsdXNoX2Jsb2NrKGUsMDw9ZS5ibG9ja19zdGFydD9lLmJsb2NrX3N0YXJ0Oi0xLGUuc3Ryc3RhcnQtZS5ibG9ja19zdGFydCx0KSxlLmJsb2NrX3N0YXJ0PWUuc3Ryc3RhcnQsVGQoZS5zdHJtKX1mdW5jdGlvbiBFZChlLHQpe2UucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPXR9ZnVuY3Rpb24gSWQoZSx0KXtlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT10Pj4+OCYyNTUsZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109MjU1JnR9ZnVuY3Rpb24gQWQoZSx0KXt2YXIgbixyLGk9ZS5tYXhfY2hhaW5fbGVuZ3RoLG89ZS5zdHJzdGFydCxhPWUucHJldl9sZW5ndGgscz1lLm5pY2VfbWF0Y2gsYz1lLnN0cnN0YXJ0PmUud19zaXplLWdkP2Uuc3Ryc3RhcnQtKGUud19zaXplLWdkKTowLHU9ZS53aW5kb3csbD1lLndfbWFzayxkPWUucHJldixmPWUuc3Ryc3RhcnQrdmQscD11W28rYS0xXSxoPXVbbythXTtlLnByZXZfbGVuZ3RoPj1lLmdvb2RfbWF0Y2gmJihpPj49Mikscz5lLmxvb2thaGVhZCYmKHM9ZS5sb29rYWhlYWQpO2Rve2lmKHVbKG49dCkrYV09PT1oJiZ1W24rYS0xXT09PXAmJnVbbl09PT11W29dJiZ1Wysrbl09PT11W28rMV0pe28rPTIsbisrO2Rve313aGlsZSh1Wysrb109PT11Wysrbl0mJnVbKytvXT09PXVbKytuXSYmdVsrK29dPT09dVsrK25dJiZ1Wysrb109PT11Wysrbl0mJnVbKytvXT09PXVbKytuXSYmdVsrK29dPT09dVsrK25dJiZ1Wysrb109PT11Wysrbl0mJnVbKytvXT09PXVbKytuXSYmbzxmKTtpZihyPXZkLShmLW8pLG89Zi12ZCxhPHIpe2lmKGUubWF0Y2hfc3RhcnQ9dCxzPD0oYT1yKSlicmVhaztwPXVbbythLTFdLGg9dVtvK2FdfX19d2hpbGUoKHQ9ZFt0JmxdKT5jJiYwIT0tLWkpO3JldHVybiBhPD1lLmxvb2thaGVhZD9hOmUubG9va2FoZWFkfWZ1bmN0aW9uICRkKGUpe3ZhciB0LG4scixpLG8sYSxzLGMsdSxsLGQ9ZS53X3NpemU7ZG97aWYoaT1lLndpbmRvd19zaXplLWUubG9va2FoZWFkLWUuc3Ryc3RhcnQsZS5zdHJzdGFydD49ZCsoZC1nZCkpe2ZvcihRdS5hcnJheVNldChlLndpbmRvdyxlLndpbmRvdyxkLGQsMCksZS5tYXRjaF9zdGFydC09ZCxlLnN0cnN0YXJ0LT1kLGUuYmxvY2tfc3RhcnQtPWQsdD1uPWUuaGFzaF9zaXplO3I9ZS5oZWFkWy0tdF0sZS5oZWFkW3RdPWQ8PXI/ci1kOjAsLS1uOyk7Zm9yKHQ9bj1kO3I9ZS5wcmV2Wy0tdF0sZS5wcmV2W3RdPWQ8PXI/ci1kOjAsLS1uOyk7aSs9ZH1pZigwPT09ZS5zdHJtLmF2YWlsX2luKWJyZWFrO2lmKGE9ZS5zdHJtLHM9ZS53aW5kb3csYz1lLnN0cnN0YXJ0K2UubG9va2FoZWFkLHU9aSxsPXZvaWQgMCxsPWEuYXZhaWxfaW4sdTxsJiYobD11KSxuPTA9PT1sPzA6KGEuYXZhaWxfaW4tPWwsUXUuYXJyYXlTZXQocyxhLmlucHV0LGEubmV4dF9pbixsLGMpLDE9PT1hLnN0YXRlLndyYXA/YS5hZGxlcj1ZbChhLmFkbGVyLHMsbCxjKToyPT09YS5zdGF0ZS53cmFwJiYoYS5hZGxlcj1abChhLmFkbGVyLHMsbCxjKSksYS5uZXh0X2luKz1sLGEudG90YWxfaW4rPWwsbCksZS5sb29rYWhlYWQrPW4sZS5sb29rYWhlYWQrZS5pbnNlcnQ+PWhkKWZvcihvPWUuc3Ryc3RhcnQtZS5pbnNlcnQsZS5pbnNfaD1lLndpbmRvd1tvXSxlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbbysxXSkmZS5oYXNoX21hc2s7ZS5pbnNlcnQmJihlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbbytoZC0xXSkmZS5oYXNoX21hc2ssZS5wcmV2W28mZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09byxvKyssZS5pbnNlcnQtLSwhKGUubG9va2FoZWFkK2UuaW5zZXJ0PGhkKSk7KTt9d2hpbGUoZS5sb29rYWhlYWQ8Z2QmJjAhPT1lLnN0cm0uYXZhaWxfaW4pfWZ1bmN0aW9uIFBkKGUsdCl7Zm9yKHZhciBuLHI7Oyl7aWYoZS5sb29rYWhlYWQ8Z2Qpe2lmKCRkKGUpLGUubG9va2FoZWFkPGdkJiZ0PT09ZWQpcmV0dXJuIF9kO2lmKDA9PT1lLmxvb2thaGVhZClicmVha31pZihuPTAsZS5sb29rYWhlYWQ+PWhkJiYoZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2Uuc3Ryc3RhcnQraGQtMV0pJmUuaGFzaF9tYXNrLG49ZS5wcmV2W2Uuc3Ryc3RhcnQmZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09ZS5zdHJzdGFydCksMCE9PW4mJmUuc3Ryc3RhcnQtbjw9ZS53X3NpemUtZ2QmJihlLm1hdGNoX2xlbmd0aD1BZChlLG4pKSxlLm1hdGNoX2xlbmd0aD49aGQpaWYocj1YbC5fdHJfdGFsbHkoZSxlLnN0cnN0YXJ0LWUubWF0Y2hfc3RhcnQsZS5tYXRjaF9sZW5ndGgtaGQpLGUubG9va2FoZWFkLT1lLm1hdGNoX2xlbmd0aCxlLm1hdGNoX2xlbmd0aDw9ZS5tYXhfbGF6eV9tYXRjaCYmZS5sb29rYWhlYWQ+PWhkKXtmb3IoZS5tYXRjaF9sZW5ndGgtLTtlLnN0cnN0YXJ0KyssZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2Uuc3Ryc3RhcnQraGQtMV0pJmUuaGFzaF9tYXNrLG49ZS5wcmV2W2Uuc3Ryc3RhcnQmZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09ZS5zdHJzdGFydCwwIT0tLWUubWF0Y2hfbGVuZ3RoOyk7ZS5zdHJzdGFydCsrfWVsc2UgZS5zdHJzdGFydCs9ZS5tYXRjaF9sZW5ndGgsZS5tYXRjaF9sZW5ndGg9MCxlLmluc19oPWUud2luZG93W2Uuc3Ryc3RhcnRdLGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tlLnN0cnN0YXJ0KzFdKSZlLmhhc2hfbWFzaztlbHNlIHI9WGwuX3RyX3RhbGx5KGUsMCxlLndpbmRvd1tlLnN0cnN0YXJ0XSksZS5sb29rYWhlYWQtLSxlLnN0cnN0YXJ0Kys7aWYociYmKE9kKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gX2R9cmV0dXJuIGUuaW5zZXJ0PWUuc3Ryc3RhcnQ8aGQtMT9lLnN0cnN0YXJ0OmhkLTEsdD09PXRkPyhPZChlLCEwKSwwPT09ZS5zdHJtLmF2YWlsX291dD93ZDprZCk6ZS5sYXN0X2xpdCYmKE9kKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KT9fZDpiZH1mdW5jdGlvbiBNZChlLHQpe2Zvcih2YXIgbixyLGk7Oyl7aWYoZS5sb29rYWhlYWQ8Z2Qpe2lmKCRkKGUpLGUubG9va2FoZWFkPGdkJiZ0PT09ZWQpcmV0dXJuIF9kO2lmKDA9PT1lLmxvb2thaGVhZClicmVha31pZihuPTAsZS5sb29rYWhlYWQ+PWhkJiYoZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2Uuc3Ryc3RhcnQraGQtMV0pJmUuaGFzaF9tYXNrLG49ZS5wcmV2W2Uuc3Ryc3RhcnQmZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09ZS5zdHJzdGFydCksZS5wcmV2X2xlbmd0aD1lLm1hdGNoX2xlbmd0aCxlLnByZXZfbWF0Y2g9ZS5tYXRjaF9zdGFydCxlLm1hdGNoX2xlbmd0aD1oZC0xLDAhPT1uJiZlLnByZXZfbGVuZ3RoPGUubWF4X2xhenlfbWF0Y2gmJmUuc3Ryc3RhcnQtbjw9ZS53X3NpemUtZ2QmJihlLm1hdGNoX2xlbmd0aD1BZChlLG4pLGUubWF0Y2hfbGVuZ3RoPD01JiYoMT09PWUuc3RyYXRlZ3l8fGUubWF0Y2hfbGVuZ3RoPT09aGQmJjQwOTY8ZS5zdHJzdGFydC1lLm1hdGNoX3N0YXJ0KSYmKGUubWF0Y2hfbGVuZ3RoPWhkLTEpKSxlLnByZXZfbGVuZ3RoPj1oZCYmZS5tYXRjaF9sZW5ndGg8PWUucHJldl9sZW5ndGgpe2ZvcihpPWUuc3Ryc3RhcnQrZS5sb29rYWhlYWQtaGQscj1YbC5fdHJfdGFsbHkoZSxlLnN0cnN0YXJ0LTEtZS5wcmV2X21hdGNoLGUucHJldl9sZW5ndGgtaGQpLGUubG9va2FoZWFkLT1lLnByZXZfbGVuZ3RoLTEsZS5wcmV2X2xlbmd0aC09MjsrK2Uuc3Ryc3RhcnQ8PWkmJihlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbZS5zdHJzdGFydCtoZC0xXSkmZS5oYXNoX21hc2ssbj1lLnByZXZbZS5zdHJzdGFydCZlLndfbWFza109ZS5oZWFkW2UuaW5zX2hdLGUuaGVhZFtlLmluc19oXT1lLnN0cnN0YXJ0KSwwIT0tLWUucHJldl9sZW5ndGg7KTtpZihlLm1hdGNoX2F2YWlsYWJsZT0wLGUubWF0Y2hfbGVuZ3RoPWhkLTEsZS5zdHJzdGFydCsrLHImJihPZChlLCExKSwwPT09ZS5zdHJtLmF2YWlsX291dCkpcmV0dXJuIF9kfWVsc2UgaWYoZS5tYXRjaF9hdmFpbGFibGUpe2lmKChyPVhsLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydC0xXSkpJiZPZChlLCExKSxlLnN0cnN0YXJ0KyssZS5sb29rYWhlYWQtLSwwPT09ZS5zdHJtLmF2YWlsX291dClyZXR1cm4gX2R9ZWxzZSBlLm1hdGNoX2F2YWlsYWJsZT0xLGUuc3Ryc3RhcnQrKyxlLmxvb2thaGVhZC0tfXJldHVybiBlLm1hdGNoX2F2YWlsYWJsZSYmKHI9WGwuX3RyX3RhbGx5KGUsMCxlLndpbmRvd1tlLnN0cnN0YXJ0LTFdKSxlLm1hdGNoX2F2YWlsYWJsZT0wKSxlLmluc2VydD1lLnN0cnN0YXJ0PGhkLTE/ZS5zdHJzdGFydDpoZC0xLHQ9PT10ZD8oT2QoZSwhMCksMD09PWUuc3RybS5hdmFpbF9vdXQ/d2Q6a2QpOmUubGFzdF9saXQmJihPZChlLCExKSwwPT09ZS5zdHJtLmF2YWlsX291dCk/X2Q6YmR9ZnVuY3Rpb24gamQoZSx0LG4scixpKXt0aGlzLmdvb2RfbGVuZ3RoPWUsdGhpcy5tYXhfbGF6eT10LHRoaXMubmljZV9sZW5ndGg9bix0aGlzLm1heF9jaGFpbj1yLHRoaXMuZnVuYz1pfWZ1bmN0aW9uIExkKCl7dGhpcy5zdHJtPW51bGwsdGhpcy5zdGF0dXM9MCx0aGlzLnBlbmRpbmdfYnVmPW51bGwsdGhpcy5wZW5kaW5nX2J1Zl9zaXplPTAsdGhpcy5wZW5kaW5nX291dD0wLHRoaXMucGVuZGluZz0wLHRoaXMud3JhcD0wLHRoaXMuZ3poZWFkPW51bGwsdGhpcy5nemluZGV4PTAsdGhpcy5tZXRob2Q9c2QsdGhpcy5sYXN0X2ZsdXNoPS0xLHRoaXMud19zaXplPTAsdGhpcy53X2JpdHM9MCx0aGlzLndfbWFzaz0wLHRoaXMud2luZG93PW51bGwsdGhpcy53aW5kb3dfc2l6ZT0wLHRoaXMucHJldj1udWxsLHRoaXMuaGVhZD1udWxsLHRoaXMuaW5zX2g9MCx0aGlzLmhhc2hfc2l6ZT0wLHRoaXMuaGFzaF9iaXRzPTAsdGhpcy5oYXNoX21hc2s9MCx0aGlzLmhhc2hfc2hpZnQ9MCx0aGlzLmJsb2NrX3N0YXJ0PTAsdGhpcy5tYXRjaF9sZW5ndGg9MCx0aGlzLnByZXZfbWF0Y2g9MCx0aGlzLm1hdGNoX2F2YWlsYWJsZT0wLHRoaXMuc3Ryc3RhcnQ9MCx0aGlzLm1hdGNoX3N0YXJ0PTAsdGhpcy5sb29rYWhlYWQ9MCx0aGlzLnByZXZfbGVuZ3RoPTAsdGhpcy5tYXhfY2hhaW5fbGVuZ3RoPTAsdGhpcy5tYXhfbGF6eV9tYXRjaD0wLHRoaXMubGV2ZWw9MCx0aGlzLnN0cmF0ZWd5PTAsdGhpcy5nb29kX21hdGNoPTAsdGhpcy5uaWNlX21hdGNoPTAsdGhpcy5keW5fbHRyZWU9bmV3IFF1LkJ1ZjE2KDIqZmQpLHRoaXMuZHluX2R0cmVlPW5ldyBRdS5CdWYxNigyKigyKmxkKzEpKSx0aGlzLmJsX3RyZWU9bmV3IFF1LkJ1ZjE2KDIqKDIqZGQrMSkpLENkKHRoaXMuZHluX2x0cmVlKSxDZCh0aGlzLmR5bl9kdHJlZSksQ2QodGhpcy5ibF90cmVlKSx0aGlzLmxfZGVzYz1udWxsLHRoaXMuZF9kZXNjPW51bGwsdGhpcy5ibF9kZXNjPW51bGwsdGhpcy5ibF9jb3VudD1uZXcgUXUuQnVmMTYocGQrMSksdGhpcy5oZWFwPW5ldyBRdS5CdWYxNigyKnVkKzEpLENkKHRoaXMuaGVhcCksdGhpcy5oZWFwX2xlbj0wLHRoaXMuaGVhcF9tYXg9MCx0aGlzLmRlcHRoPW5ldyBRdS5CdWYxNigyKnVkKzEpLENkKHRoaXMuZGVwdGgpLHRoaXMubF9idWY9MCx0aGlzLmxpdF9idWZzaXplPTAsdGhpcy5sYXN0X2xpdD0wLHRoaXMuZF9idWY9MCx0aGlzLm9wdF9sZW49MCx0aGlzLnN0YXRpY19sZW49MCx0aGlzLm1hdGNoZXM9MCx0aGlzLmluc2VydD0wLHRoaXMuYmlfYnVmPTAsdGhpcy5iaV92YWxpZD0wfWZ1bmN0aW9uIEJkKGUpe3ZhciB0O3JldHVybiBlJiZlLnN0YXRlPyhlLnRvdGFsX2luPWUudG90YWxfb3V0PTAsZS5kYXRhX3R5cGU9YWQsKHQ9ZS5zdGF0ZSkucGVuZGluZz0wLHQucGVuZGluZ19vdXQ9MCx0LndyYXA8MCYmKHQud3JhcD0tdC53cmFwKSx0LnN0YXR1cz10LndyYXA/bWQ6eWQsZS5hZGxlcj0yPT09dC53cmFwPzA6MSx0Lmxhc3RfZmx1c2g9ZWQsWGwuX3RyX2luaXQodCksbmQpOlNkKGUscmQpfWZ1bmN0aW9uIE5kKGUpe3ZhciB0LG49QmQoZSk7cmV0dXJuIG49PT1uZCYmKCh0PWUuc3RhdGUpLndpbmRvd19zaXplPTIqdC53X3NpemUsQ2QodC5oZWFkKSx0Lm1heF9sYXp5X21hdGNoPUtsW3QubGV2ZWxdLm1heF9sYXp5LHQuZ29vZF9tYXRjaD1LbFt0LmxldmVsXS5nb29kX2xlbmd0aCx0Lm5pY2VfbWF0Y2g9S2xbdC5sZXZlbF0ubmljZV9sZW5ndGgsdC5tYXhfY2hhaW5fbGVuZ3RoPUtsW3QubGV2ZWxdLm1heF9jaGFpbix0LnN0cnN0YXJ0PTAsdC5ibG9ja19zdGFydD0wLHQubG9va2FoZWFkPTAsdC5pbnNlcnQ9MCx0Lm1hdGNoX2xlbmd0aD10LnByZXZfbGVuZ3RoPWhkLTEsdC5tYXRjaF9hdmFpbGFibGU9MCx0Lmluc19oPTApLG59ZnVuY3Rpb24gRGQoZSx0LG4scixpLG8pe2lmKCFlKXJldHVybiByZDt2YXIgYT0xO2lmKHQ9PT1pZCYmKHQ9NikscjwwPyhhPTAscj0tcik6MTU8ciYmKGE9MixyLT0xNiksaTwxfHxjZDxpfHxuIT09c2R8fHI8OHx8MTU8cnx8dDwwfHw5PHR8fG88MHx8b2Q8bylyZXR1cm4gU2QoZSxyZCk7OD09PXImJihyPTkpO3ZhciBzPW5ldyBMZDtyZXR1cm4oZS5zdGF0ZT1zKS5zdHJtPWUscy53cmFwPWEscy5nemhlYWQ9bnVsbCxzLndfYml0cz1yLHMud19zaXplPTE8PHMud19iaXRzLHMud19tYXNrPXMud19zaXplLTEscy5oYXNoX2JpdHM9aSs3LHMuaGFzaF9zaXplPTE8PHMuaGFzaF9iaXRzLHMuaGFzaF9tYXNrPXMuaGFzaF9zaXplLTEscy5oYXNoX3NoaWZ0PX5+KChzLmhhc2hfYml0cytoZC0xKS9oZCkscy53aW5kb3c9bmV3IFF1LkJ1ZjgoMipzLndfc2l6ZSkscy5oZWFkPW5ldyBRdS5CdWYxNihzLmhhc2hfc2l6ZSkscy5wcmV2PW5ldyBRdS5CdWYxNihzLndfc2l6ZSkscy5saXRfYnVmc2l6ZT0xPDxpKzYscy5wZW5kaW5nX2J1Zl9zaXplPTQqcy5saXRfYnVmc2l6ZSxzLnBlbmRpbmdfYnVmPW5ldyBRdS5CdWY4KHMucGVuZGluZ19idWZfc2l6ZSkscy5kX2J1Zj0xKnMubGl0X2J1ZnNpemUscy5sX2J1Zj0zKnMubGl0X2J1ZnNpemUscy5sZXZlbD10LHMuc3RyYXRlZ3k9byxzLm1ldGhvZD1uLE5kKGUpfUtsPVtuZXcgamQoMCwwLDAsMCxmdW5jdGlvbihlLHQpe3ZhciBuPTY1NTM1O2ZvcihuPmUucGVuZGluZ19idWZfc2l6ZS01JiYobj1lLnBlbmRpbmdfYnVmX3NpemUtNSk7Oyl7aWYoZS5sb29rYWhlYWQ8PTEpe2lmKCRkKGUpLDA9PT1lLmxvb2thaGVhZCYmdD09PWVkKXJldHVybiBfZDtpZigwPT09ZS5sb29rYWhlYWQpYnJlYWt9ZS5zdHJzdGFydCs9ZS5sb29rYWhlYWQsZS5sb29rYWhlYWQ9MDt2YXIgcj1lLmJsb2NrX3N0YXJ0K247aWYoKDA9PT1lLnN0cnN0YXJ0fHxlLnN0cnN0YXJ0Pj1yKSYmKGUubG9va2FoZWFkPWUuc3Ryc3RhcnQtcixlLnN0cnN0YXJ0PXIsT2QoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpKXJldHVybiBfZDtpZihlLnN0cnN0YXJ0LWUuYmxvY2tfc3RhcnQ+PWUud19zaXplLWdkJiYoT2QoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpKXJldHVybiBfZH1yZXR1cm4gZS5pbnNlcnQ9MCx0PT09dGQ/KE9kKGUsITApLDA9PT1lLnN0cm0uYXZhaWxfb3V0P3dkOmtkKTooZS5zdHJzdGFydD5lLmJsb2NrX3N0YXJ0JiYoT2QoZSwhMSksZS5zdHJtLmF2YWlsX291dCksX2QpfSksbmV3IGpkKDQsNCw4LDQsUGQpLG5ldyBqZCg0LDUsMTYsOCxQZCksbmV3IGpkKDQsNiwzMiwzMixQZCksbmV3IGpkKDQsNCwxNiwxNixNZCksbmV3IGpkKDgsMTYsMzIsMzIsTWQpLG5ldyBqZCg4LDE2LDEyOCwxMjgsTWQpLG5ldyBqZCg4LDMyLDEyOCwyNTYsTWQpLG5ldyBqZCgzMiwxMjgsMjU4LDEwMjQsTWQpLG5ldyBqZCgzMiwyNTgsMjU4LDQwOTYsTWQpXTt2YXIgUmQ9e2RlZmxhdGVJbml0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIERkKGUsdCxzZCwxNSw4LDApfSxkZWZsYXRlSW5pdDI6RGQsZGVmbGF0ZVJlc2V0Ok5kLGRlZmxhdGVSZXNldEtlZXA6QmQsZGVmbGF0ZVNldEhlYWRlcjpmdW5jdGlvbihlLHQpe3JldHVybiBlJiZlLnN0YXRlPzIhPT1lLnN0YXRlLndyYXA/cmQ6KGUuc3RhdGUuZ3poZWFkPXQsbmQpOnJkfSxkZWZsYXRlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG87aWYoIWV8fCFlLnN0YXRlfHw1PHR8fHQ8MClyZXR1cm4gZT9TZChlLHJkKTpyZDtpZihyPWUuc3RhdGUsIWUub3V0cHV0fHwhZS5pbnB1dCYmMCE9PWUuYXZhaWxfaW58fDY2Nj09PXIuc3RhdHVzJiZ0IT09dGQpcmV0dXJuIFNkKGUsMD09PWUuYXZhaWxfb3V0Py01OnJkKTtpZihyLnN0cm09ZSxuPXIubGFzdF9mbHVzaCxyLmxhc3RfZmx1c2g9dCxyLnN0YXR1cz09PW1kKWlmKDI9PT1yLndyYXApZS5hZGxlcj0wLEVkKHIsMzEpLEVkKHIsMTM5KSxFZChyLDgpLHIuZ3poZWFkPyhFZChyLChyLmd6aGVhZC50ZXh0PzE6MCkrKHIuZ3poZWFkLmhjcmM/MjowKSsoci5nemhlYWQuZXh0cmE/NDowKSsoci5nemhlYWQubmFtZT84OjApKyhyLmd6aGVhZC5jb21tZW50PzE2OjApKSxFZChyLDI1NSZyLmd6aGVhZC50aW1lKSxFZChyLHIuZ3poZWFkLnRpbWU+PjgmMjU1KSxFZChyLHIuZ3poZWFkLnRpbWU+PjE2JjI1NSksRWQocixyLmd6aGVhZC50aW1lPj4yNCYyNTUpLEVkKHIsOT09PXIubGV2ZWw/MjoyPD1yLnN0cmF0ZWd5fHxyLmxldmVsPDI/NDowKSxFZChyLDI1NSZyLmd6aGVhZC5vcyksci5nemhlYWQuZXh0cmEmJnIuZ3poZWFkLmV4dHJhLmxlbmd0aCYmKEVkKHIsMjU1JnIuZ3poZWFkLmV4dHJhLmxlbmd0aCksRWQocixyLmd6aGVhZC5leHRyYS5sZW5ndGg+PjgmMjU1KSksci5nemhlYWQuaGNyYyYmKGUuYWRsZXI9WmwoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZywwKSksci5nemluZGV4PTAsci5zdGF0dXM9NjkpOihFZChyLDApLEVkKHIsMCksRWQociwwKSxFZChyLDApLEVkKHIsMCksRWQociw5PT09ci5sZXZlbD8yOjI8PXIuc3RyYXRlZ3l8fHIubGV2ZWw8Mj80OjApLEVkKHIsMyksci5zdGF0dXM9eWQpO2Vsc2V7dmFyIGE9c2QrKHIud19iaXRzLTg8PDQpPDw4O2F8PSgyPD1yLnN0cmF0ZWd5fHxyLmxldmVsPDI/MDpyLmxldmVsPDY/MTo2PT09ci5sZXZlbD8yOjMpPDw2LDAhPT1yLnN0cnN0YXJ0JiYoYXw9MzIpLGErPTMxLWElMzEsci5zdGF0dXM9eWQsSWQocixhKSwwIT09ci5zdHJzdGFydCYmKElkKHIsZS5hZGxlcj4+PjE2KSxJZChyLDY1NTM1JmUuYWRsZXIpKSxlLmFkbGVyPTF9aWYoNjk9PT1yLnN0YXR1cylpZihyLmd6aGVhZC5leHRyYSl7Zm9yKGk9ci5wZW5kaW5nO3IuZ3ppbmRleDwoNjU1MzUmci5nemhlYWQuZXh0cmEubGVuZ3RoKSYmKHIucGVuZGluZyE9PXIucGVuZGluZ19idWZfc2l6ZXx8KHIuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5pJiYoZS5hZGxlcj1abChlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLWksaSkpLFRkKGUpLGk9ci5wZW5kaW5nLHIucGVuZGluZyE9PXIucGVuZGluZ19idWZfc2l6ZSkpOylFZChyLDI1NSZyLmd6aGVhZC5leHRyYVtyLmd6aW5kZXhdKSxyLmd6aW5kZXgrKztyLmd6aGVhZC5oY3JjJiZyLnBlbmRpbmc+aSYmKGUuYWRsZXI9WmwoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZy1pLGkpKSxyLmd6aW5kZXg9PT1yLmd6aGVhZC5leHRyYS5sZW5ndGgmJihyLmd6aW5kZXg9MCxyLnN0YXR1cz03Myl9ZWxzZSByLnN0YXR1cz03MztpZig3Mz09PXIuc3RhdHVzKWlmKHIuZ3poZWFkLm5hbWUpe2k9ci5wZW5kaW5nO2Rve2lmKHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSYmKHIuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5pJiYoZS5hZGxlcj1abChlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLWksaSkpLFRkKGUpLGk9ci5wZW5kaW5nLHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSkpe289MTticmVha31FZChyLG89ci5nemluZGV4PHIuZ3poZWFkLm5hbWUubGVuZ3RoPzI1NSZyLmd6aGVhZC5uYW1lLmNoYXJDb2RlQXQoci5nemluZGV4KyspOjApfXdoaWxlKDAhPT1vKTtyLmd6aGVhZC5oY3JjJiZyLnBlbmRpbmc+aSYmKGUuYWRsZXI9WmwoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZy1pLGkpKSwwPT09byYmKHIuZ3ppbmRleD0wLHIuc3RhdHVzPTkxKX1lbHNlIHIuc3RhdHVzPTkxO2lmKDkxPT09ci5zdGF0dXMpaWYoci5nemhlYWQuY29tbWVudCl7aT1yLnBlbmRpbmc7ZG97aWYoci5wZW5kaW5nPT09ci5wZW5kaW5nX2J1Zl9zaXplJiYoci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPmkmJihlLmFkbGVyPVpsKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctaSxpKSksVGQoZSksaT1yLnBlbmRpbmcsci5wZW5kaW5nPT09ci5wZW5kaW5nX2J1Zl9zaXplKSl7bz0xO2JyZWFrfUVkKHIsbz1yLmd6aW5kZXg8ci5nemhlYWQuY29tbWVudC5sZW5ndGg/MjU1JnIuZ3poZWFkLmNvbW1lbnQuY2hhckNvZGVBdChyLmd6aW5kZXgrKyk6MCl9d2hpbGUoMCE9PW8pO3IuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5pJiYoZS5hZGxlcj1abChlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLWksaSkpLDA9PT1vJiYoci5zdGF0dXM9MTAzKX1lbHNlIHIuc3RhdHVzPTEwMztpZigxMDM9PT1yLnN0YXR1cyYmKHIuZ3poZWFkLmhjcmM/KHIucGVuZGluZysyPnIucGVuZGluZ19idWZfc2l6ZSYmVGQoZSksci5wZW5kaW5nKzI8PXIucGVuZGluZ19idWZfc2l6ZSYmKEVkKHIsMjU1JmUuYWRsZXIpLEVkKHIsZS5hZGxlcj4+OCYyNTUpLGUuYWRsZXI9MCxyLnN0YXR1cz15ZCkpOnIuc3RhdHVzPXlkKSwwIT09ci5wZW5kaW5nKXtpZihUZChlKSwwPT09ZS5hdmFpbF9vdXQpcmV0dXJuIHIubGFzdF9mbHVzaD0tMSxuZH1lbHNlIGlmKDA9PT1lLmF2YWlsX2luJiZ4ZCh0KTw9eGQobikmJnQhPT10ZClyZXR1cm4gU2QoZSwtNSk7aWYoNjY2PT09ci5zdGF0dXMmJjAhPT1lLmF2YWlsX2luKXJldHVybiBTZChlLC01KTtpZigwIT09ZS5hdmFpbF9pbnx8MCE9PXIubG9va2FoZWFkfHx0IT09ZWQmJjY2NiE9PXIuc3RhdHVzKXt2YXIgcz0yPT09ci5zdHJhdGVneT9mdW5jdGlvbihlLHQpe2Zvcih2YXIgbjs7KXtpZigwPT09ZS5sb29rYWhlYWQmJigkZChlKSwwPT09ZS5sb29rYWhlYWQpKXtpZih0PT09ZWQpcmV0dXJuIF9kO2JyZWFrfWlmKGUubWF0Y2hfbGVuZ3RoPTAsbj1YbC5fdHJfdGFsbHkoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnRdKSxlLmxvb2thaGVhZC0tLGUuc3Ryc3RhcnQrKyxuJiYoT2QoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpKXJldHVybiBfZH1yZXR1cm4gZS5pbnNlcnQ9MCx0PT09dGQ/KE9kKGUsITApLDA9PT1lLnN0cm0uYXZhaWxfb3V0P3dkOmtkKTplLmxhc3RfbGl0JiYoT2QoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpP19kOmJkfShyLHQpOjM9PT1yLnN0cmF0ZWd5P2Z1bmN0aW9uKGUsdCl7Zm9yKHZhciBuLHIsaSxvLGE9ZS53aW5kb3c7Oyl7aWYoZS5sb29rYWhlYWQ8PXZkKXtpZigkZChlKSxlLmxvb2thaGVhZDw9dmQmJnQ9PT1lZClyZXR1cm4gX2Q7aWYoMD09PWUubG9va2FoZWFkKWJyZWFrfWlmKGUubWF0Y2hfbGVuZ3RoPTAsZS5sb29rYWhlYWQ+PWhkJiYwPGUuc3Ryc3RhcnQmJihyPWFbaT1lLnN0cnN0YXJ0LTFdKT09PWFbKytpXSYmcj09PWFbKytpXSYmcj09PWFbKytpXSl7bz1lLnN0cnN0YXJ0K3ZkO2Rve313aGlsZShyPT09YVsrK2ldJiZyPT09YVsrK2ldJiZyPT09YVsrK2ldJiZyPT09YVsrK2ldJiZyPT09YVsrK2ldJiZyPT09YVsrK2ldJiZyPT09YVsrK2ldJiZyPT09YVsrK2ldJiZpPG8pO2UubWF0Y2hfbGVuZ3RoPXZkLShvLWkpLGUubWF0Y2hfbGVuZ3RoPmUubG9va2FoZWFkJiYoZS5tYXRjaF9sZW5ndGg9ZS5sb29rYWhlYWQpfWlmKGUubWF0Y2hfbGVuZ3RoPj1oZD8obj1YbC5fdHJfdGFsbHkoZSwxLGUubWF0Y2hfbGVuZ3RoLWhkKSxlLmxvb2thaGVhZC09ZS5tYXRjaF9sZW5ndGgsZS5zdHJzdGFydCs9ZS5tYXRjaF9sZW5ndGgsZS5tYXRjaF9sZW5ndGg9MCk6KG49WGwuX3RyX3RhbGx5KGUsMCxlLndpbmRvd1tlLnN0cnN0YXJ0XSksZS5sb29rYWhlYWQtLSxlLnN0cnN0YXJ0KyspLG4mJihPZChlLCExKSwwPT09ZS5zdHJtLmF2YWlsX291dCkpcmV0dXJuIF9kfXJldHVybiBlLmluc2VydD0wLHQ9PT10ZD8oT2QoZSwhMCksMD09PWUuc3RybS5hdmFpbF9vdXQ/d2Q6a2QpOmUubGFzdF9saXQmJihPZChlLCExKSwwPT09ZS5zdHJtLmF2YWlsX291dCk/X2Q6YmR9KHIsdCk6S2xbci5sZXZlbF0uZnVuYyhyLHQpO2lmKHMhPT13ZCYmcyE9PWtkfHwoci5zdGF0dXM9NjY2KSxzPT09X2R8fHM9PT13ZClyZXR1cm4gMD09PWUuYXZhaWxfb3V0JiYoci5sYXN0X2ZsdXNoPS0xKSxuZDtpZihzPT09YmQmJigxPT09dD9YbC5fdHJfYWxpZ24ocik6NSE9PXQmJihYbC5fdHJfc3RvcmVkX2Jsb2NrKHIsMCwwLCExKSwzPT09dCYmKENkKHIuaGVhZCksMD09PXIubG9va2FoZWFkJiYoci5zdHJzdGFydD0wLHIuYmxvY2tfc3RhcnQ9MCxyLmluc2VydD0wKSkpLFRkKGUpLDA9PT1lLmF2YWlsX291dCkpcmV0dXJuIHIubGFzdF9mbHVzaD0tMSxuZH1yZXR1cm4gdCE9PXRkP25kOnIud3JhcDw9MD8xOigyPT09ci53cmFwPyhFZChyLDI1NSZlLmFkbGVyKSxFZChyLGUuYWRsZXI+PjgmMjU1KSxFZChyLGUuYWRsZXI+PjE2JjI1NSksRWQocixlLmFkbGVyPj4yNCYyNTUpLEVkKHIsMjU1JmUudG90YWxfaW4pLEVkKHIsZS50b3RhbF9pbj4+OCYyNTUpLEVkKHIsZS50b3RhbF9pbj4+MTYmMjU1KSxFZChyLGUudG90YWxfaW4+PjI0JjI1NSkpOihJZChyLGUuYWRsZXI+Pj4xNiksSWQociw2NTUzNSZlLmFkbGVyKSksVGQoZSksMDxyLndyYXAmJihyLndyYXA9LXIud3JhcCksMCE9PXIucGVuZGluZz9uZDoxKX0sZGVmbGF0ZUVuZDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gZSYmZS5zdGF0ZT8odD1lLnN0YXRlLnN0YXR1cykhPT1tZCYmNjkhPT10JiY3MyE9PXQmJjkxIT09dCYmMTAzIT09dCYmdCE9PXlkJiY2NjYhPT10P1NkKGUscmQpOihlLnN0YXRlPW51bGwsdD09PXlkP1NkKGUsLTMpOm5kKTpyZH0sZGVmbGF0ZVNldERpY3Rpb25hcnk6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhLHMsYyx1LGw9dC5sZW5ndGg7aWYoIWV8fCFlLnN0YXRlKXJldHVybiByZDtpZigyPT09KG89KG49ZS5zdGF0ZSkud3JhcCl8fDE9PT1vJiZuLnN0YXR1cyE9PW1kfHxuLmxvb2thaGVhZClyZXR1cm4gcmQ7Zm9yKDE9PT1vJiYoZS5hZGxlcj1ZbChlLmFkbGVyLHQsbCwwKSksbi53cmFwPTAsbD49bi53X3NpemUmJigwPT09byYmKENkKG4uaGVhZCksbi5zdHJzdGFydD0wLG4uYmxvY2tfc3RhcnQ9MCxuLmluc2VydD0wKSx1PW5ldyBRdS5CdWY4KG4ud19zaXplKSxRdS5hcnJheVNldCh1LHQsbC1uLndfc2l6ZSxuLndfc2l6ZSwwKSx0PXUsbD1uLndfc2l6ZSksYT1lLmF2YWlsX2luLHM9ZS5uZXh0X2luLGM9ZS5pbnB1dCxlLmF2YWlsX2luPWwsZS5uZXh0X2luPTAsZS5pbnB1dD10LCRkKG4pO24ubG9va2FoZWFkPj1oZDspe2ZvcihyPW4uc3Ryc3RhcnQsaT1uLmxvb2thaGVhZC0oaGQtMSk7bi5pbnNfaD0obi5pbnNfaDw8bi5oYXNoX3NoaWZ0Xm4ud2luZG93W3IraGQtMV0pJm4uaGFzaF9tYXNrLG4ucHJldltyJm4ud19tYXNrXT1uLmhlYWRbbi5pbnNfaF0sbi5oZWFkW24uaW5zX2hdPXIscisrLC0taTspO24uc3Ryc3RhcnQ9cixuLmxvb2thaGVhZD1oZC0xLCRkKG4pfXJldHVybiBuLnN0cnN0YXJ0Kz1uLmxvb2thaGVhZCxuLmJsb2NrX3N0YXJ0PW4uc3Ryc3RhcnQsbi5pbnNlcnQ9bi5sb29rYWhlYWQsbi5sb29rYWhlYWQ9MCxuLm1hdGNoX2xlbmd0aD1uLnByZXZfbGVuZ3RoPWhkLTEsbi5tYXRjaF9hdmFpbGFibGU9MCxlLm5leHRfaW49cyxlLmlucHV0PWMsZS5hdmFpbF9pbj1hLG4ud3JhcD1vLG5kfSxkZWZsYXRlSW5mbzoicGFrbyBkZWZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSJ9LEZkPSEwLHpkPSEwO3RyeXtTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsWzBdKX1jYXRjaChlKXtGZD0hMX10cnl7U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLG5ldyBVaW50OEFycmF5KDEpKX1jYXRjaChlKXt6ZD0hMX1mb3IodmFyIFZkPW5ldyBRdS5CdWY4KDI1NiksVWQ9MDtVZDwyNTY7VWQrKylWZFtVZF09MjUyPD1VZD82OjI0ODw9VWQ/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/cy1vKzI1NzoyNTctKG8tcyksbi5ob2xkPXAsbi5iaXRzPWh9LG5mPVszLDQsNSw2LDcsOCw5LDEwLDExLDEzLDE1LDE3LDE5LDIzLDI3LDMxLDM1LDQzLDUxLDU5LDY3LDgzLDk5LDExNSwxMzEsMTYzLDE5NSwyMjcsMjU4LDAsMF0scmY9WzE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE3LDE3LDE3LDE3LDE4LDE4LDE4LDE4LDE5LDE5LDE5LDE5LDIwLDIwLDIwLDIwLDIxLDIxLDIxLDIxLDE2LDcyLDc4XSxvZj1bMSwyLDMsNCw1LDcsOSwxMywxNywyNSwzMyw0OSw2NSw5NywxMjksMTkzLDI1NywzODUsNTEzLDc2OSwxMDI1LDE1MzcsMjA0OSwzMDczLDQwOTcsNjE0NSw4MTkzLDEyMjg5LDE2Mzg1LDI0NTc3LDAsMF0sYWY9WzE2LDE2LDE2LDE2LDE3LDE3LDE4LDE4LDE5LDE5LDIwLDIwLDIxLDIxLDIyLDIyLDIzLDIzLDI0LDI0LDI1LDI1LDI2LDI2LDI3LDI3LDI4LDI4LDI5LDI5LDY0LDY0XSxzZj1mdW5jdGlvbihlLHQsbixyLGksbyxhLHMpe3ZhciBjLHUsbCxkLGYscCxoLHYsZyxtPXMuYml0cyx5PTAsXz0wLGI9MCx3PTAsaz0wLFM9MCx4PTAsQz0wLFQ9MCxPPTAsRT1udWxsLEk9MCxBPW5ldyBRdS5CdWYxNigxNiksJD1uZXcgUXUuQnVmMTYoMTYpLFA9bnVsbCxNPTA7Zm9yKHk9MDt5PD0xNTt5KyspQVt5XT0wO2ZvcihfPTA7XzxyO18rKylBW3RbbitfXV0rKztmb3Ioaz1tLHc9MTU7MTw9dyYmMD09PUFbd107dy0tKTtpZih3PGsmJihrPXcpLDA9PT13KXJldHVybiBpW28rK109MjA5NzE1MjAsaVtvKytdPTIwOTcxNTIwLHMuYml0cz0xLDA7Zm9yKGI9MTtiPHcmJjA9PT1BW2JdO2IrKyk7Zm9yKGs8YiYmKGs9YikseT1DPTE7eTw9MTU7eSsrKWlmKEM8PD0xLChDLT1BW3ldKTwwKXJldHVybi0xO2lmKDA8QyYmKDA9PT1lfHwxIT09dykpcmV0dXJuLTE7Zm9yKCRbMV09MCx5PTE7eTwxNTt5KyspJFt5KzFdPSRbeV0rQVt5XTtmb3IoXz0wO188cjtfKyspMCE9PXRbbitfXSYmKGFbJFt0W24rX11dKytdPV8pO2lmKDA9PT1lPyhFPVA9YSxwPTE5KToxPT09ZT8oRT1uZixJLT0yNTcsUD1yZixNLT0yNTcscD0yNTYpOihFPW9mLFA9YWYscD0tMSkseT1iLGY9byx4PV89Tz0wLGw9LTEsZD0oVD0xPDwoUz1rKSktMSwxPT09ZSYmODUyPFR8fDI9PT1lJiY1OTI8VClyZXR1cm4gMTtmb3IoOzspe2ZvcihoPXkteCxhW19dPHA/KHY9MCxnPWFbX10pOmFbX10+cD8odj1QW00rYVtfXV0sZz1FW0krYVtfXV0pOih2PTk2LGc9MCksYz0xPDx5LXgsYj11PTE8PFM7aVtmKyhPPj54KSsodS09YyldPWg8PDI0fHY8PDE2fGd8MCwwIT09dTspO2ZvcihjPTE8PHktMTtPJmM7KWM+Pj0xO2lmKDAhPT1jPyhPJj1jLTEsTys9Yyk6Tz0wLF8rKywwPT0tLUFbeV0pe2lmKHk9PT13KWJyZWFrO3k9dFtuK2FbX11dfWlmKGs8eSYmKE8mZCkhPT1sKXtmb3IoMD09PXgmJih4PWspLGYrPWIsQz0xPDwoUz15LXgpO1MreDx3JiYhKChDLT1BW1MreF0pPD0wKTspUysrLEM8PD0xO2lmKFQrPTE8PFMsMT09PWUmJjg1MjxUfHwyPT09ZSYmNTkyPFQpcmV0dXJuIDE7aVtsPU8mZF09azw8MjR8Uzw8MTZ8Zi1vfDB9fXJldHVybiAwIT09TyYmKGlbZitPXT15LXg8PDI0fDY0PDwxNnwwKSxzLmJpdHM9aywwfSxjZj0xLHVmPTIsbGY9MCxkZj0tMixmZj0xLHBmPTg1MixoZj01OTI7ZnVuY3Rpb24gdmYoZSl7cmV0dXJuKGU+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/KG4ubW9kZT0zMSwtNCk6KG4uaGF2ZWRpY3Q9MSxsZik6ZGZ9LGluZmxhdGVJbmZvOiJwYWtvIGluZmxhdGUgKGZyb20gTm9kZWNhIHByb2plY3QpIn0sT2Y9e1pfTk9fRkxVU0g6MCxaX1BBUlRJQUxfRkxVU0g6MSxaX1NZTkNfRkxVU0g6MixaX0ZVTExfRkxVU0g6MyxaX0ZJTklTSDo0LFpfQkxPQ0s6NSxaX1RSRUVTOjYsWl9PSzowLFpfU1RSRUFNX0VORDoxLFpfTkVFRF9ESUNUOjIsWl9FUlJOTzotMSxaX1NUUkVBTV9FUlJPUjotMixaX0RBVEFfRVJST1I6LTMsWl9CVUZfRVJST1I6LTUsWl9OT19DT01QUkVTU0lPTjowLFpfQkVTVF9TUEVFRDoxLFpfQkVTVF9DT01QUkVTU0lPTjo5LFpfREVGQVVMVF9DT01QUkVTU0lPTjotMSxaX0ZJTFRFUkVEOjEsWl9IVUZGTUFOX09OTFk6MixaX1JMRTozLFpfRklYRUQ6NCxaX0RFRkFVTFRfU1RSQVRFR1k6MCxaX0JJTkFSWTowLFpfVEVYVDoxLFpfVU5LTk9XTjoyLFpfREVGTEFURUQ6OH07dmFyIEVmPWZ1bmN0aW9uKCl7dGhpcy50ZXh0PTAsdGhpcy50aW1lPTAsdGhpcy54ZmxhZ3M9MCx0aGlzLm9zPTAsdGhpcy5leHRyYT1udWxsLHRoaXMuZXh0cmFfbGVuPTAsdGhpcy5uYW1lPSIiLHRoaXMuY29tbWVudD0iIix0aGlzLmhjcmM9MCx0aGlzLmRvbmU9ITF9LElmPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gQWYoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgQWYpKXJldHVybiBuZXcgQWYoZSk7dGhpcy5vcHRpb25zPVF1LmFzc2lnbih7Y2h1bmtTaXplOjE2Mzg0LHdpbmRvd0JpdHM6MCx0bzoiIn0sZXx8e30pO3ZhciB0PXRoaXMub3B0aW9uczt0LnJhdyYmMDw9dC53aW5kb3dCaXRzJiZ0LndpbmRvd0JpdHM8MTYmJih0LndpbmRvd0JpdHM9LXQud2luZG93Qml0cywwPT09dC53aW5kb3dCaXRzJiYodC53aW5kb3dCaXRzPS0xNSkpLCEoMDw9dC53aW5kb3dCaXRzJiZ0LndpbmRvd0JpdHM8MTYpfHxlJiZlLndpbmRvd0JpdHN8fCh0LndpbmRvd0JpdHMrPTMyKSwxNTx0LndpbmRvd0JpdHMmJnQud2luZG93Qml0czw0OCYmMD09KDE1JnQud2luZG93Qml0cykmJih0LndpbmRvd0JpdHN8PTE1KSx0aGlzLmVycj0wLHRoaXMubXNnPSIiLHRoaXMuZW5kZWQ9ITEsdGhpcy5jaHVua3M9W10sdGhpcy5zdHJtPW5ldyBIZCx0aGlzLnN0cm0uYXZhaWxfb3V0PTA7dmFyIG49VGYuaW5mbGF0ZUluaXQyKHRoaXMuc3RybSx0LndpbmRvd0JpdHMpO2lmKG4hPT1PZi5aX09LKXRocm93IG5ldyBFcnJvcihRbFtuXSk7aWYodGhpcy5oZWFkZXI9bmV3IEVmLFRmLmluZmxhdGVHZXRIZWFkZXIodGhpcy5zdHJtLHRoaXMuaGVhZGVyKSx0LmRpY3Rpb25hcnkmJigic3RyaW5nIj09dHlwZW9mIHQuZGljdGlvbmFyeT90LmRpY3Rpb25hcnk9V2Quc3RyaW5nMmJ1Zih0LmRpY3Rpb25hcnkpOiJbb2JqZWN0IEFycmF5QnVmZmVyXSI9PT1JZi5jYWxsKHQuZGljdGlvbmFyeSkmJih0LmRpY3Rpb25hcnk9bmV3IFVpbnQ4QXJyYXkodC5kaWN0aW9uYXJ5KSksdC5yYXcmJihuPVRmLmluZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSx0LmRpY3Rpb25hcnkpKSE9PU9mLlpfT0spKXRocm93IG5ldyBFcnJvcihRbFtuXSl9ZnVuY3Rpb24gJGYoZSx0KXt2YXIgbj1uZXcgQWYodCk7aWYobi5wdXNoKGUsITApLG4uZXJyKXRocm93IG4ubXNnfHxRbFtuLmVycl07cmV0dXJuIG4ucmVzdWx0fUFmLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYSxzPXRoaXMuc3RybSxjPXRoaXMub3B0aW9ucy5jaHVua1NpemUsdT10aGlzLm9wdGlvbnMuZGljdGlvbmFyeSxsPSExO2lmKHRoaXMuZW5kZWQpcmV0dXJuITE7cj10PT09fn50P3Q6ITA9PT10P09mLlpfRklOSVNIOk9mLlpfTk9fRkxVU0gsInN0cmluZyI9PXR5cGVvZiBlP3MuaW5wdXQ9V2QuYmluc3RyaW5nMmJ1ZihlKToiW29iamVjdCBBcnJheUJ1ZmZlcl0iPT09SWYuY2FsbChlKT9zLmlucHV0PW5ldyBVaW50OEFycmF5KGUpOnMuaW5wdXQ9ZSxzLm5leHRfaW49MCxzLmF2YWlsX2luPXMuaW5wdXQubGVuZ3RoO2Rve2lmKDA9PT1zLmF2YWlsX291dCYmKHMub3V0cHV0PW5ldyBRdS5CdWY4KGMpLHMubmV4dF9vdXQ9MCxzLmF2YWlsX291dD1jKSwobj1UZi5pbmZsYXRlKHMsT2YuWl9OT19GTFVTSCkpPT09T2YuWl9ORUVEX0RJQ1QmJnUmJihuPVRmLmluZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSx1KSksbj09PU9mLlpfQlVGX0VSUk9SJiYhMD09PWwmJihuPU9mLlpfT0ssbD0hMSksbiE9PU9mLlpfU1RSRUFNX0VORCYmbiE9PU9mLlpfT0spcmV0dXJuIHRoaXMub25FbmQobiksISh0aGlzLmVuZGVkPSEwKTtzLm5leHRfb3V0JiYoMCE9PXMuYXZhaWxfb3V0JiZuIT09T2YuWl9TVFJFQU1fRU5EJiYoMCE9PXMuYXZhaWxfaW58fHIhPT1PZi5aX0ZJTklTSCYmciE9PU9mLlpfU1lOQ19GTFVTSCl8fCgic3RyaW5nIj09PXRoaXMub3B0aW9ucy50bz8oaT1XZC51dGY4Ym9yZGVyKHMub3V0cHV0LHMubmV4dF9vdXQpLG89cy5uZXh0X291dC1pLGE9V2QuYnVmMnN0cmluZyhzLm91dHB1dCxpKSxzLm5leHRfb3V0PW8scy5hdmFpbF9vdXQ9Yy1vLG8mJlF1LmFycmF5U2V0KHMub3V0cHV0LHMub3V0cHV0LGksbywwKSx0aGlzLm9uRGF0YShhKSk6dGhpcy5vbkRhdGEoUXUuc2hyaW5rQnVmKHMub3V0cHV0LHMubmV4dF9vdXQpKSkpLDA9PT1zLmF2YWlsX2luJiYwPT09cy5hdmFpbF9vdXQmJihsPSEwKX13aGlsZSgoMDxzLmF2YWlsX2lufHwwPT09cy5hdmFpbF9vdXQpJiZuIT09T2YuWl9TVFJFQU1fRU5EKTtyZXR1cm4gbj09PU9mLlpfU1RSRUFNX0VORCYmKHI9T2YuWl9GSU5JU0gpLHI9PT1PZi5aX0ZJTklTSD8obj1UZi5pbmZsYXRlRW5kKHRoaXMuc3RybSksdGhpcy5vbkVuZChuKSx0aGlzLmVuZGVkPSEwLG49PT1PZi5aX09LKTpyIT09T2YuWl9TWU5DX0ZMVVNIfHwodGhpcy5vbkVuZChPZi5aX09LKSwhKHMuYXZhaWxfb3V0PTApKX0sQWYucHJvdG90eXBlLm9uRGF0YT1mdW5jdGlvbihlKXt0aGlzLmNodW5rcy5wdXNoKGUpfSxBZi5wcm90b3R5cGUub25FbmQ9ZnVuY3Rpb24oZSl7ZT09PU9mLlpfT0smJigic3RyaW5nIj09PXRoaXMub3B0aW9ucy50bz90aGlzLnJlc3VsdD10aGlzLmNodW5rcy5qb2luKCIiKTp0aGlzLnJlc3VsdD1RdS5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKSksdGhpcy5jaHVua3M9W10sdGhpcy5lcnI9ZSx0aGlzLm1zZz10aGlzLnN0cm0ubXNnfTt2YXIgUGY9e0luZmxhdGU6QWYsaW5mbGF0ZTokZixpbmZsYXRlUmF3OmZ1bmN0aW9uKGUsdCl7cmV0dXJuKHQ9dHx8e30pLnJhdz0hMCwkZihlLHQpfSx1bmd6aXA6JGZ9LE1mPXt9OygwLFF1LmFzc2lnbikoTWYsZWYsUGYsT2YpO3ZhciBqZj1NZixMZj1tdSgiY2FudmFzRXZlbnQiKTtmdW5jdGlvbiBCZihlLHQsbixyKXtUdi5wdWJsaXNoSGFuZGxlcih0KyItY2FudmFzLSIrZSx7Y2FudmFzSWQ6ZSx0eXBlOm4sZGF0YTpyfSx0KX1Udi5zdWJzY3JpYmUoIm9uQ2FudmFzTWV0aG9kQ2FsbGJhY2siLGZ1bmN0aW9uKGUpe3ZhciB0PWUuY2FsbGJhY2tJZCxuPWUuZGF0YSxyPUxmLnBvcCh0KTtyJiZyKG4pfSk7dmFyIE5mPXthbGljZWJsdWU6IiNmMGY4ZmYiLGFudGlxdWV3aGl0ZToiI2ZhZWJkNyIsYXF1YToiIzAwZmZmZiIsYXF1YW1hcmluZToiIzdmZmZkNCIsYXp1cmU6IiNmMGZmZmYiLGJlaWdlOiIjZjVmNWRjIixiaXNxdWU6IiNmZmU0YzQiLGJsYWNrOiIjMDAwMDAwIixibGFuY2hlZGFsbW9uZDoiI2ZmZWJjZCIsYmx1ZToiIzAwMDBmZiIsYmx1ZXZpb2xldDoiIzhhMmJlMiIsYnJvd246IiNhNTJhMmEiLGJ1cmx5d29vZDoiI2RlYjg4NyIsY2FkZXRibHVlOiIjNWY5ZWEwIixjaGFydHJldXNlOiIjN2ZmZjAwIixjaG9jb2xhdGU6IiNkMjY5MWUiLGNvcmFsOiIjZmY3ZjUwIixjb3JuZmxvd2VyYmx1ZToiIzY0OTVlZCIsY29ybnNpbGs6IiNmZmY4ZGMiLGNyaW1zb246IiNkYzE0M2MiLGN5YW46IiMwMGZmZmYiLGRhcmtibHVlOiIjMDAwMDhiIixkYXJrY3lhbjoiIzAwOGI4YiIsZGFya2dvbGRlbnJvZDoiI2I4ODYwYiIsZGFya2dyYXk6IiNhOWE5YTkiLGRhcmtncmV5OiIjYTlhOWE5IixkYXJrZ3JlZW46IiMwMDY0MDAiLGRhcmtraGFraToiI2JkYjc2YiIsZGFya21hZ2VudGE6IiM4YjAwOGIiLGRhcmtvbGl2ZWdyZWVuOiIjNTU2YjJmIixkYXJrb3JhbmdlOiIjZmY4YzAwIixkYXJrb3JjaGlkOiIjOTkzMmNjIixkYXJrcmVkOiIjOGIwMDAwIixkYXJrc2FsbW9uOiIjZTk5NjdhIixkYXJrc2VhZ3JlZW46IiM4ZmJjOGYiLGRhcmtzbGF0ZWJsdWU6IiM0ODNkOGIiLGRhcmtzbGF0ZWdyYXk6IiMyZjRmNGYiLGRhcmtzbGF0ZWdyZXk6IiMyZjRmNGYiLGRhcmt0dXJxdW9pc2U6IiMwMGNlZDEiLGRhcmt2aW9sZXQ6IiM5NDAwZDMiLGRlZXBwaW5rOiIjZmYxNDkzIixkZWVwc2t5Ymx1ZToiIzAwYmZmZiIsZGltZ3JheToiIzY5Njk2OSIsZGltZ3JleToiIzY5Njk2OSIsZG9kZ2VyYmx1ZToiIzFlOTBmZiIsZmlyZWJyaWNrOiIjYjIyMjIyIixmbG9yYWx3aGl0ZToiI2ZmZmFmMCIsZm9yZXN0Z3JlZW46IiMyMjhiMjIiLGZ1Y2hzaWE6IiNmZjAwZmYiLGdhaW5zYm9ybzoiI2RjZGNkYyIsZ2hvc3R3aGl0ZToiI2Y4ZjhmZiIsZ29sZDoiI2ZmZDcwMCIsZ29sZGVucm9kOiIjZGFhNTIwIixncmF5OiIjODA4MDgwIixncmV5OiIjODA4MDgwIixncmVlbjoiIzAwODAwMCIsZ3JlZW55ZWxsb3c6IiNhZGZmMmYiLGhvbmV5ZGV3OiIjZjBmZmYwIixob3RwaW5rOiIjZmY2OWI0IixpbmRpYW5yZWQ6IiNjZDVjNWMiLGluZGlnbzoiIzRiMDA4MiIsaXZvcnk6IiNmZmZmZjAiLGtoYWtpOiIjZjBlNjhjIixsYXZlbmRlcjoiI2U2ZTZmYSIsbGF2ZW5kZXJibHVzaDoiI2ZmZjBmNSIsbGF3bmdyZWVuOiIjN2NmYzAwIixsZW1vbmNoaWZmb246IiNmZmZhY2QiLGxpZ2h0Ymx1ZToiI2FkZDhlNiIsbGlnaHRjb3JhbDoiI2YwODA4MCIsbGlnaHRjeWFuOiIjZTBmZmZmIixsaWdodGdvbGRlbnJvZHllbGxvdzoiI2ZhZmFkMiIsbGlnaHRncmF5OiIjZDNkM2QzIixsaWdodGdyZXk6IiNkM2QzZDMiLGxpZ2h0Z3JlZW46IiM5MGVlOTAiLGxpZ2h0cGluazoiI2ZmYjZjMSIsbGlnaHRzYWxtb246IiNmZmEwN2EiLGxpZ2h0c2VhZ3JlZW46IiMyMGIyYWEiLGxpZ2h0c2t5Ymx1ZToiIzg3Y2VmYSIsbGlnaHRzbGF0ZWdyYXk6IiM3Nzg4OTkiLGxpZ2h0c2xhdGVncmV5OiIjNzc4ODk5IixsaWdodHN0ZWVsYmx1ZToiI2IwYzRkZSIsbGlnaHR5ZWxsb3c6IiNmZmZmZTAiLGxpbWU6IiMwMGZmMDAiLGxpbWVncmVlbjoiIzMyY2QzMiIsbGluZW46IiNmYWYwZTYiLG1hZ2VudGE6IiNmZjAwZmYiLG1hcm9vbjoiIzgwMDAwMCIsbWVkaXVtYXF1YW1hcmluZToiIzY2Y2RhYSIsbWVkaXVtYmx1ZToiIzAwMDBjZCIsbWVkaXVtb3JjaGlkOiIjYmE1NWQzIixtZWRpdW1wdXJwbGU6IiM5MzcwZGIiLG1lZGl1bXNlYWdyZWVuOiIjM2NiMzcxIixtZWRpdW1zbGF0ZWJsdWU6IiM3YjY4ZWUiLG1lZGl1bXNwcmluZ2dyZWVuOiIjMDBmYTlhIixtZWRpdW10dXJxdW9pc2U6IiM0OGQxY2MiLG1lZGl1bXZpb2xldHJlZDoiI2M3MTU4NSIsbWlkbmlnaHRibHVlOiIjMTkxOTcwIixtaW50Y3JlYW06IiNmNWZmZmEiLG1pc3R5cm9zZToiI2ZmZTRlMSIsbW9jY2FzaW46IiNmZmU0YjUiLG5hdmFqb3doaXRlOiIjZmZkZWFkIixuYXZ5OiIjMDAwMDgwIixvbGRsYWNlOiIjZmRmNWU2IixvbGl2ZToiIzgwODAwMCIsb2xpdmVkcmFiOiIjNmI4ZTIzIixvcmFuZ2U6IiNmZmE1MDAiLG9yYW5nZXJlZDoiI2ZmNDUwMCIsb3JjaGlkOiIjZGE3MGQ2IixwYWxlZ29sZGVucm9kOiIjZWVlOGFhIixwYWxlZ3JlZW46IiM5OGZiOTgiLHBhbGV0dXJxdW9pc2U6IiNhZmVlZWUiLHBhbGV2aW9sZXRyZWQ6IiNkYjcwOTMiLHBhcGF5YXdoaXA6IiNmZmVmZDUiLHBlYWNocHVmZjoiI2ZmZGFiOSIscGVydToiI2NkODUzZiIscGluazoiI2ZmYzBjYiIscGx1bToiI2RkYTBkZCIscG93ZGVyYmx1ZToiI2IwZTBlNiIscHVycGxlOiIjODAwMDgwIixyZWJlY2NhcHVycGxlOiIjNjYzMzk5IixyZWQ6IiNmZjAwMDAiLHJvc3licm93bjoiI2JjOGY4ZiIscm95YWxibHVlOiIjNDE2OWUxIixzYWRkbGVicm93bjoiIzhiNDUxMyIsc2FsbW9uOiIjZmE4MDcyIixzYW5keWJyb3duOiIjZjRhNDYwIixzZWFncmVlbjoiIzJlOGI1NyIsc2Vhc2hlbGw6IiNmZmY1ZWUiLHNpZW5uYToiI2EwNTIyZCIsc2lsdmVyOiIjYzBjMGMwIixza3libHVlOiIjODdjZWViIixzbGF0ZWJsdWU6IiM2YTVhY2QiLHNsYXRlZ3JheToiIzcwODA5MCIsc2xhdGVncmV5OiIjNzA4MDkwIixzbm93OiIjZmZmYWZhIixzcHJpbmdncmVlbjoiIzAwZmY3ZiIsc3RlZWxibHVlOiIjNDY4MmI0Iix0YW46IiNkMmI0OGMiLHRlYWw6IiMwMDgwODAiLHRoaXN0bGU6IiNkOGJmZDgiLHRvbWF0bzoiI2ZmNjM0NyIsdHVycXVvaXNlOiIjNDBlMGQwIix2aW9sZXQ6IiNlZTgyZWUiLHdoZWF0OiIjZjVkZWIzIix3aGl0ZToiI2ZmZmZmZiIsd2hpdGVzbW9rZToiI2Y1ZjVmNSIseWVsbG93OiIjZmZmZjAwIix5ZWxsb3dncmVlbjoiIzlhY2QzMiIsdHJhbnNwYXJlbnQ6IiMwMDAwMDAwMCJ9O2Z1bmN0aW9uIERmKGUpe3ZhciB0PW51bGw7aWYobnVsbCE9KHQ9L14jKFswLTl8QS1GfGEtZl17Nn0pJC8uZXhlYyhlPWV8fCIjMDAwMDAwIikpKXJldHVybltwYXJzZUludCh0WzFdLnNsaWNlKDAsMiksMTYpLHBhcnNlSW50KHRbMV0uc2xpY2UoMiw0KSwxNikscGFyc2VJbnQodFsxXS5zbGljZSg0KSwxNiksMjU1XTtpZihudWxsIT0odD0vXiMoWzAtOXxBLUZ8YS1mXXszfSkkLy5leGVjKGUpKSl7dmFyIG49dFsxXS5zbGljZSgwLDEpLHI9dFsxXS5zbGljZSgxLDIpLGk9dFsxXS5zbGljZSgyLDMpO3JldHVybltuPXBhcnNlSW50KG4rbiwxNikscj1wYXJzZUludChyK3IsMTYpLGk9cGFyc2VJbnQoaStpLDE2KSwyNTVdfWlmKG51bGwhPSh0PS9ecmdiXCgoLispXCkkLy5leGVjKGUpKSlyZXR1cm4gdFsxXS5zcGxpdCgiLCIpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5taW4oMjU1LHBhcnNlSW50KGUudHJpbSgpKSl9KS5jb25jYXQoMjU1KTtpZihudWxsIT0odD0vXnJnYmFcKCguKylcKSQvLmV4ZWMoZSkpKXJldHVybiB0WzFdLnNwbGl0KCIsIikubWFwKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIDM9PT10P01hdGguZmxvb3IoMjU1KnBhcnNlRmxvYXQoZS50cmltKCkpKTpNYXRoLm1pbigyNTUscGFyc2VJbnQoZS50cmltKCkpKX0pO3ZhciBvPWUudG9Mb3dlckNhc2UoKTtpZihrKE5mLG8pKXt0PS9eIyhbMC05fEEtRnxhLWZdezYsOH0pJC8uZXhlYyhOZltvXSk7dmFyIGE9cGFyc2VJbnQodFsxXS5zbGljZSgwLDIpLDE2KSxzPXBhcnNlSW50KHRbMV0uc2xpY2UoMiw0KSwxNiksYz1wYXJzZUludCh0WzFdLnNsaWNlKDQsNiksMTYpLHU9cGFyc2VJbnQodFsxXS5zbGljZSg2LDgpLDE2KTtyZXR1cm5bYSxzLGMsdT0wPD11P3U6MjU1XX1yZXR1cm4gY29uc29sZS5lcnJvcigidW5zdXBwb3J0ZWQgY29sb3I6IitlKSxbMCwwLDAsMjU1XX1mdW5jdGlvbiBSZihlLHQpe3RoaXMudHlwZT0icGF0dGVybiIsdGhpcy5kYXRhPWUsdGhpcy5jb2xvclN0b3A9dH12YXIgRmY9ZnVuY3Rpb24oZSx0KXt0aGlzLnR5cGU9ZSx0aGlzLmRhdGE9dCx0aGlzLmNvbG9yU3RvcD1bXX07RmYucHJvdG90eXBlLmFkZENvbG9yU3RvcD1mdW5jdGlvbihlLHQpe3RoaXMuY29sb3JTdG9wLnB1c2goW2UsRGYodCldKX07ZnVuY3Rpb24gemYoZSl7dGhpcy53aWR0aD1lfXZhciBWZj1mdW5jdGlvbihlLHQpe3RoaXMuaWQ9ZSx0aGlzLnBhZ2VJZD10LHRoaXMuYWN0aW9ucz1bXSx0aGlzLnBhdGg9W10sdGhpcy5zdWJwYXRoPVtdLHRoaXMuY3VycmVudFRyYW5zZm9ybT1bXSx0aGlzLmN1cnJlbnRTdGVwQW5pbWF0ZXM9W10sdGhpcy5kcmF3aW5nU3RhdGU9W10sdGhpcy5zdGF0ZT17bGluZURhc2g6WzAsMF0sc2hhZG93T2Zmc2V0WDowLHNoYWRvd09mZnNldFk6MCxzaGFkb3dCbHVyOjAsc2hhZG93Q29sb3I6WzAsMCwwLDBdLGZvbnQ6IjEwcHggc2Fucy1zZXJpZiIsZm9udFNpemU6MTAsZm9udFdlaWdodDoibm9ybWFsIixmb250U3R5bGU6Im5vcm1hbCIsZm9udEZhbWlseToic2Fucy1zZXJpZiJ9fSxVZj17bGluZURhc2hPZmZzZXQ6e2NvbmZpZ3VyYWJsZTohMH0sZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uOntjb25maWd1cmFibGU6ITB9LHNoYWRvd0JsdXI6e2NvbmZpZ3VyYWJsZTohMH0sc2hhZG93Q29sb3I6e2NvbmZpZ3VyYWJsZTohMH0sc2hhZG93T2Zmc2V0WDp7Y29uZmlndXJhYmxlOiEwfSxzaGFkb3dPZmZzZXRZOntjb25maWd1cmFibGU6ITB9LGZvbnQ6e2NvbmZpZ3VyYWJsZTohMH0sZmlsbFN0eWxlOntjb25maWd1cmFibGU6ITB9LHN0cm9rZVN0eWxlOntjb25maWd1cmFibGU6ITB9LGdsb2JhbEFscGhhOntjb25maWd1cmFibGU6ITB9LHRleHRBbGlnbjp7Y29uZmlndXJhYmxlOiEwfSxsaW5lQ2FwOntjb25maWd1cmFibGU6ITB9LGxpbmVKb2luOntjb25maWd1cmFibGU6ITB9LGxpbmVXaWR0aDp7Y29uZmlndXJhYmxlOiEwfSxtaXRlckxpbWl0Ontjb25maWd1cmFibGU6ITB9LHRleHRCYXNlbGluZTp7Y29uZmlndXJhYmxlOiEwfX07VmYucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT0hMSk7dmFyIG4scj1bXS5jb25jYXQodGhpcy5hY3Rpb25zKTt0aGlzLmFjdGlvbnM9W10sdGhpcy5wYXRoPVtdLCJmdW5jdGlvbiI9PXR5cGVvZiB0JiYobj1MZi5wdXNoKHQpKSxCZih0aGlzLmlkLHRoaXMucGFnZUlkLCJhY3Rpb25zQ2hhbmdlZCIse2FjdGlvbnM6cixyZXNlcnZlOmUsY2FsbGJhY2tJZDpufSl9LFZmLnByb3RvdHlwZS5jcmVhdGVMaW5lYXJHcmFkaWVudD1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbmV3IEZmKCJsaW5lYXIiLFtlLHQsbixyXSl9LFZmLnByb3RvdHlwZS5jcmVhdGVDaXJjdWxhckdyYWRpZW50PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbmV3IEZmKCJyYWRpYWwiLFtlLHQsbl0pfSxWZi5wcm90b3R5cGUuY3JlYXRlUGF0dGVybj1mdW5jdGlvbihlLHQpe2lmKHZvaWQgMD09PXQpY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIGV4ZWN1dGUgJ2NyZWF0ZVBhdHRlcm4nIG9uICdDYW52YXNDb250ZXh0JzogMiBhcmd1bWVudHMgcmVxdWlyZWQsIGJ1dCBvbmx5IDEgcHJlc2VudC4iKTtlbHNle2lmKCEoWyJyZXBlYXQiLCJyZXBlYXQteCIsInJlcGVhdC15Iiwibm8tcmVwZWF0Il0uaW5kZXhPZih0KTwwKSlyZXR1cm4gbmV3IFJmKGUsdCk7Y29uc29sZS5lcnJvcigiRmFpbGVkIHRvIGV4ZWN1dGUgJ2NyZWF0ZVBhdHRlcm4nIG9uICdDYW52YXNDb250ZXh0JzogVGhlIHByb3ZpZGVkIHR5cGUgKCciK3QrIicpIGlzIG5vdCBvbmUgb2YgJ3JlcGVhdCcsICduby1yZXBlYXQnLCAncmVwZWF0LXgnLCBvciAncmVwZWF0LXknLiIpfX0sVmYucHJvdG90eXBlLm1lYXN1cmVUZXh0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc3RhdGUuZm9udCxuPTAscj1Ddi53ZWJ2aWV3LmFsbCgpLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0VVJMKCkuZW5kc1dpdGgoInd3dy9fX3VuaWFwcHZpZXcuaHRtbCIpfSk7cmV0dXJuIHImJihuPU51bWJlcihyLmV2YWxKU1N5bmMoIigiK2Z1bmN0aW9uKGUsdCl7dmFyIG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIikuZ2V0Q29udGV4dCgiMmQiKTtyZXR1cm4gbi5mb250PXQsbi5tZWFzdXJlVGV4dChlKS53aWR0aHx8MH0udG9TdHJpbmcoKSsiKSgiK0pTT04uc3RyaW5naWZ5KGUpKyIsIitKU09OLnN0cmluZ2lmeSh0KSsiKSIpKSksbmV3IHpmKG4pfSxWZi5wcm90b3R5cGUuc2F2ZT1mdW5jdGlvbigpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNhdmUiLGRhdGE6W119KSx0aGlzLmRyYXdpbmdTdGF0ZS5wdXNoKHRoaXMuc3RhdGUpfSxWZi5wcm90b3R5cGUucmVzdG9yZT1mdW5jdGlvbigpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InJlc3RvcmUiLGRhdGE6W119KSx0aGlzLnN0YXRlPXRoaXMuZHJhd2luZ1N0YXRlLnBvcCgpfHx7bGluZURhc2g6WzAsMF0sc2hhZG93T2Zmc2V0WDowLHNoYWRvd09mZnNldFk6MCxzaGFkb3dCbHVyOjAsc2hhZG93Q29sb3I6WzAsMCwwLDBdLGZvbnQ6IjEwcHggc2Fucy1zZXJpZiIsZm9udFNpemU6MTAsZm9udFdlaWdodDoibm9ybWFsIixmb250U3R5bGU6Im5vcm1hbCIsZm9udEZhbWlseToic2Fucy1zZXJpZiJ9fSxWZi5wcm90b3R5cGUuYmVnaW5QYXRoPWZ1bmN0aW9uKCl7dGhpcy5wYXRoPVtdLHRoaXMuc3VicGF0aD1bXSx0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJiZWdpblBhdGgiLGRhdGE6W119KX0sVmYucHJvdG90eXBlLm1vdmVUbz1mdW5jdGlvbihlLHQpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6Im1vdmVUbyIsZGF0YTpbZSx0XX0pLHRoaXMuc3VicGF0aD1bW2UsdF1dfSxWZi5wcm90b3R5cGUubGluZVRvPWZ1bmN0aW9uKGUsdCl7MD09PXRoaXMucGF0aC5sZW5ndGgmJjA9PT10aGlzLnN1YnBhdGgubGVuZ3RoP3RoaXMucGF0aC5wdXNoKHttZXRob2Q6Im1vdmVUbyIsZGF0YTpbZSx0XX0pOnRoaXMucGF0aC5wdXNoKHttZXRob2Q6ImxpbmVUbyIsZGF0YTpbZSx0XX0pLHRoaXMuc3VicGF0aC5wdXNoKFtlLHRdKX0sVmYucHJvdG90eXBlLnF1YWRyYXRpY0N1cnZlVG89ZnVuY3Rpb24oZSx0LG4scil7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoicXVhZHJhdGljQ3VydmVUbyIsZGF0YTpbZSx0LG4scl19KSx0aGlzLnN1YnBhdGgucHVzaChbbixyXSl9LFZmLnByb3RvdHlwZS5iZXppZXJDdXJ2ZVRvPWZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJiZXppZXJDdXJ2ZVRvIixkYXRhOltlLHQsbixyLGksb119KSx0aGlzLnN1YnBhdGgucHVzaChbaSxvXSl9LFZmLnByb3RvdHlwZS5hcmM9ZnVuY3Rpb24oZSx0LG4scixpLG8pe3ZvaWQgMD09PW8mJihvPSExKSx0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJhcmMiLGRhdGE6W2UsdCxuLHIsaSxvXX0pLHRoaXMuc3VicGF0aC5wdXNoKFtlLHRdKX0sVmYucHJvdG90eXBlLnJlY3Q9ZnVuY3Rpb24oZSx0LG4scil7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoicmVjdCIsZGF0YTpbZSx0LG4scl19KSx0aGlzLnN1YnBhdGg9W1tlLHRdXX0sVmYucHJvdG90eXBlLmFyY1RvPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoiYXJjVG8iLGRhdGE6W2UsdCxuLHIsaV19KSx0aGlzLnN1YnBhdGgucHVzaChbbixyXSl9LFZmLnByb3RvdHlwZS5jbGlwPWZ1bmN0aW9uKCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoiY2xpcCIsZGF0YTpbXS5jb25jYXQodGhpcy5wYXRoKX0pfSxWZi5wcm90b3R5cGUuY2xvc2VQYXRoPWZ1bmN0aW9uKCl7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoiY2xvc2VQYXRoIixkYXRhOltdfSksdGhpcy5zdWJwYXRoLmxlbmd0aCYmKHRoaXMuc3VicGF0aD1bdGhpcy5zdWJwYXRoLnNoaWZ0KCldKX0sVmYucHJvdG90eXBlLmNsZWFyQWN0aW9ucz1mdW5jdGlvbigpe3RoaXMuYWN0aW9ucz1bXSx0aGlzLnBhdGg9W10sdGhpcy5zdWJwYXRoPVtdfSxWZi5wcm90b3R5cGUuZ2V0QWN0aW9ucz1mdW5jdGlvbigpe3ZhciBlPVtdLmNvbmNhdCh0aGlzLmFjdGlvbnMpO3JldHVybiB0aGlzLmNsZWFyQWN0aW9ucygpLGV9LFVmLmxpbmVEYXNoT2Zmc2V0LnNldD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRMaW5lRGFzaE9mZnNldCIsZGF0YTpbZV19KX0sVWYuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uLnNldD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRHbG9iYWxDb21wb3NpdGVPcGVyYXRpb24iLGRhdGE6W2VdfSl9LFVmLnNoYWRvd0JsdXIuc2V0PWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldFNoYWRvd0JsdXIiLGRhdGE6W2VdfSl9LFVmLnNoYWRvd0NvbG9yLnNldD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRTaGFkb3dDb2xvciIsZGF0YTpbZV19KX0sVWYuc2hhZG93T2Zmc2V0WC5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0U2hhZG93T2Zmc2V0WCIsZGF0YTpbZV19KX0sVWYuc2hhZG93T2Zmc2V0WS5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0U2hhZG93T2Zmc2V0WSIsZGF0YTpbZV19KX0sVWYuZm9udC5zZXQ9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcyx0PSh0aGlzLnN0YXRlLmZvbnQ9ZSkubWF0Y2goL14oKFtcd1wtXStccykqKShcZCtyP3B4KShcLyhcZCtcLj9cZCoocj9weCk/KSk/XHMrKC4qKS8pO2lmKHQpe3ZhciByPXRbMV0udHJpbSgpLnNwbGl0KC9ccy8pLGk9cGFyc2VGbG9hdCh0WzNdKSxvPXRbN10sYT1bXTtyLmZvckVhY2goZnVuY3Rpb24oZSx0KXstMTxbIml0YWxpYyIsIm9ibGlxdWUiLCJub3JtYWwiXS5pbmRleE9mKGUpPyhhLnB1c2goe21ldGhvZDoic2V0Rm9udFN0eWxlIixkYXRhOltlXX0pLG4uc3RhdGUuZm9udFN0eWxlPWUpOi0xPFsiYm9sZCIsIm5vcm1hbCJdLmluZGV4T2YoZSk/KGEucHVzaCh7bWV0aG9kOiJzZXRGb250V2VpZ2h0IixkYXRhOltlXX0pLG4uc3RhdGUuZm9udFdlaWdodD1lKTowPT09dD8oYS5wdXNoKHttZXRob2Q6InNldEZvbnRTdHlsZSIsZGF0YTpbIm5vcm1hbCJdfSksbi5zdGF0ZS5mb250U3R5bGU9Im5vcm1hbCIpOjE9PT10JiZzKCl9KSwxPT09ci5sZW5ndGgmJnMoKSxyPWEubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLmRhdGFbMF19KS5qb2luKCIgIiksdGhpcy5zdGF0ZS5mb250U2l6ZT1pLHRoaXMuc3RhdGUuZm9udEZhbWlseT1vLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldEZvbnQiLGRhdGE6W3IrIiAiK2krInB4ICIrb119KX1lbHNlIGNvbnNvbGUud2FybigiRmFpbGVkIHRvIHNldCAnZm9udCcgb24gJ0NhbnZhc0NvbnRleHQnOiBpbnZhbGlkIGZvcm1hdC4iKTtmdW5jdGlvbiBzKCl7YS5wdXNoKHttZXRob2Q6InNldEZvbnRXZWlnaHQiLGRhdGE6WyJub3JtYWwiXX0pLG4uc3RhdGUuZm9udFdlaWdodD0ibm9ybWFsIn19LFVmLmZvbnQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdGUuZm9udH0sVWYuZmlsbFN0eWxlLnNldD1mdW5jdGlvbihlKXt0aGlzLnNldEZpbGxTdHlsZShlKX0sVWYuc3Ryb2tlU3R5bGUuc2V0PWZ1bmN0aW9uKGUpe3RoaXMuc2V0U3Ryb2tlU3R5bGUoZSl9LFVmLmdsb2JhbEFscGhhLnNldD1mdW5jdGlvbihlKXtlPU1hdGguZmxvb3IoMjU1KnBhcnNlRmxvYXQoZSkpLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldEdsb2JhbEFscGhhIixkYXRhOltlXX0pfSxVZi50ZXh0QWxpZ24uc2V0PWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldFRleHRBbGlnbiIsZGF0YTpbZV19KX0sVWYubGluZUNhcC5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0TGluZUNhcCIsZGF0YTpbZV19KX0sVWYubGluZUpvaW4uc2V0PWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldExpbmVKb2luIixkYXRhOltlXX0pfSxVZi5saW5lV2lkdGguc2V0PWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldExpbmVXaWR0aCIsZGF0YTpbZV19KX0sVWYubWl0ZXJMaW1pdC5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0TWl0ZXJMaW1pdCIsZGF0YTpbZV19KX0sVWYudGV4dEJhc2VsaW5lLnNldD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRUZXh0QmFzZWxpbmUiLGRhdGE6W2VdfSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFZmLnByb3RvdHlwZSxVZiksWyJzY2FsZSIsInJvdGF0ZSIsInRyYW5zbGF0ZSIsInNldFRyYW5zZm9ybSIsInRyYW5zZm9ybSJdLmNvbmNhdChbImRyYXdJbWFnZSIsImZpbGxUZXh0IiwiZmlsbCIsInN0cm9rZSIsImZpbGxSZWN0Iiwic3Ryb2tlUmVjdCIsImNsZWFyUmVjdCIsInN0cm9rZVRleHQiXSkuZm9yRWFjaChmdW5jdGlvbihlKXtWZi5wcm90b3R5cGVbZV09ZnVuY3Rpb24oZCl7c3dpdGNoKGQpe2Nhc2UiZmlsbCI6Y2FzZSJzdHJva2UiOnJldHVybiBmdW5jdGlvbigpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6ZCsiUGF0aCIsZGF0YTpbXS5jb25jYXQodGhpcy5wYXRoKX0pfTtjYXNlImZpbGxSZWN0IjpyZXR1cm4gZnVuY3Rpb24oZSx0LG4scil7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoiZmlsbFBhdGgiLGRhdGE6W3ttZXRob2Q6InJlY3QiLGRhdGE6W2UsdCxuLHJdfV19KX07Y2FzZSJzdHJva2VSZWN0IjpyZXR1cm4gZnVuY3Rpb24oZSx0LG4scil7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic3Ryb2tlUGF0aCIsZGF0YTpbe21ldGhvZDoicmVjdCIsZGF0YTpbZSx0LG4scl19XX0pfTtjYXNlImZpbGxUZXh0IjpjYXNlInN0cm9rZVRleHQiOnJldHVybiBmdW5jdGlvbihlLHQsbixyKXt2YXIgaT1bZS50b1N0cmluZygpLHQsbl07Im51bWJlciI9PXR5cGVvZiByJiZpLnB1c2gociksdGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpkLGRhdGE6aX0pfTtjYXNlImRyYXdJbWFnZSI6cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIsaSxvLGEscyxjKXt2YXIgdTtmdW5jdGlvbiBsKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZX12b2lkIDA9PT1jJiYobz10LGE9bixzPXIsYz1pLGk9cj1uPXQ9dm9pZCAwKSx1PWwodCkmJmwobikmJmwocikmJmwoaSk/W2UsbyxhLHMsYyx0LG4scixpXTpsKHMpJiZsKGMpP1tlLG8sYSxzLGNdOltlLG8sYV0sdGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpkLGRhdGE6dX0pfTtkZWZhdWx0OnJldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOmQsZGF0YTplfSl9fX0oZSl9KSxbInNldEZpbGxTdHlsZSIsInNldFRleHRBbGlnbiIsInNldFN0cm9rZVN0eWxlIiwic2V0R2xvYmFsQWxwaGEiLCJzZXRTaGFkb3ciLCJzZXRGb250U2l6ZSIsInNldExpbmVDYXAiLCJzZXRMaW5lSm9pbiIsInNldExpbmVXaWR0aCIsInNldE1pdGVyTGltaXQiLCJzZXRUZXh0QmFzZWxpbmUiLCJzZXRMaW5lRGFzaCJdLmZvckVhY2goZnVuY3Rpb24oZSl7VmYucHJvdG90eXBlW2VdPWZ1bmN0aW9uKGkpe3N3aXRjaChpKXtjYXNlInNldEZpbGxTdHlsZSI6Y2FzZSJzZXRTdHJva2VTdHlsZSI6cmV0dXJuIGZ1bmN0aW9uKGUpeyJvYmplY3QiIT10eXBlb2YgZT90aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOmksZGF0YTpbIm5vcm1hbCIsRGYoZSldfSk6dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDppLGRhdGE6W2UudHlwZSxlLmRhdGEsZS5jb2xvclN0b3BdfSl9O2Nhc2Uic2V0R2xvYmFsQWxwaGEiOnJldHVybiBmdW5jdGlvbihlKXtlPU1hdGguZmxvb3IoMjU1KnBhcnNlRmxvYXQoZSkpLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6aSxkYXRhOltlXX0pfTtjYXNlInNldFNoYWRvdyI6cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIpe3I9RGYociksdGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDppLGRhdGE6W2UsdCxuLHJdfSksdGhpcy5zdGF0ZS5zaGFkb3dCbHVyPW4sdGhpcy5zdGF0ZS5zaGFkb3dDb2xvcj1yLHRoaXMuc3RhdGUuc2hhZG93T2Zmc2V0WD1lLHRoaXMuc3RhdGUuc2hhZG93T2Zmc2V0WT10fTtjYXNlInNldExpbmVEYXNoIjpyZXR1cm4gZnVuY3Rpb24oZSx0KXtlPWV8fFswLDBdLHQ9dHx8MCx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOmksZGF0YTpbZSx0XX0pLHRoaXMuc3RhdGUubGluZURhc2g9ZX07Y2FzZSJzZXRGb250U2l6ZSI6cmV0dXJuIGZ1bmN0aW9uKGUpe3RoaXMuc3RhdGUuZm9udD10aGlzLnN0YXRlLmZvbnQucmVwbGFjZSgvXGQrXC4/XGQqcHgvLGUrInB4IiksdGhpcy5zdGF0ZS5mb250U2l6ZT1lLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6aSxkYXRhOltlXX0pfTtkZWZhdWx0OnJldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOmksZGF0YTplfSl9fX0oZSl9KTt2YXIgcWY9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQ2FudmFzQ29udGV4dDpWZixjcmVhdGVDYW52YXNDb250ZXh0OmZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4gbmV3IFZmKGUsdC4kcGFnZS5pZCk7dmFyIG49V3UoKTtpZihuKXJldHVybiBuZXcgVmYoZSxuKTtUdi5lbWl0KCJvbkVycm9yIiwiY3JlYXRlQ2FudmFzQ29udGV4dDpmYWlsIil9LGNhbnZhc0dldEltYWdlRGF0YTpmdW5jdGlvbihlLG4pe3ZhciB0PWUuY2FudmFzSWQscj1lLngsaT1lLnksbz1lLndpZHRoLGE9ZS5oZWlnaHQscz1XdSgpO3M/QmYodCxzLCJnZXRJbWFnZURhdGEiLHt4OnIseTppLHdpZHRoOm8saGVpZ2h0OmEsY2FsbGJhY2tJZDpMZi5wdXNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0YTt0JiZ0Lmxlbmd0aCYmKGUuY29tcHJlc3NlZCYmKHQ9amYuaW5mbGF0ZVJhdyh0KSxkZWxldGUgZS5jb21wcmVzc2VkKSxlLmRhdGE9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHQpKSxvaShuLGUpfSl9KTpvaShuLHtlcnJNc2c6ImNhbnZhc0dldEltYWdlRGF0YTpmYWlsIn0pfSxjYW52YXNQdXRJbWFnZURhdGE6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNhbnZhc0lkLHI9ZS5kYXRhLGk9ZS54LG89ZS55LGE9ZS53aWR0aCxzPWUuaGVpZ2h0LGM9V3UoKTtpZihjKXt2YXIgdSxsPUxmLnB1c2goZnVuY3Rpb24oZSl7b2kodCxlKX0pOyJpT1MiIT09Q3Yub3MubmFtZXx8ImJvb2xlYW4iPT10eXBlb2YgX19XRUVYX0RFVlRPT0xfXz8ocj1qZi5kZWZsYXRlUmF3KHIse3RvOiJzdHJpbmcifSksdT0hMCk6cj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChyKSxCZihuLGMsInB1dEltYWdlRGF0YSIse2RhdGE6cix4OmkseTpvLHdpZHRoOmEsaGVpZ2h0OnMsY29tcHJlc3NlZDp1LGNhbGxiYWNrSWQ6bH0pfWVsc2Ugb2kodCx7ZXJyTXNnOiJjYW52YXNQdXRJbWFnZURhdGE6ZmFpbCJ9KX0sY2FudmFzVG9UZW1wRmlsZVBhdGg6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLng7dm9pZCAwPT09biYmKG49MCk7dmFyIHI9ZS55O3ZvaWQgMD09PXImJihyPTApO3ZhciBpPWUud2lkdGgsbz1lLmhlaWdodCxhPWUuZGVzdFdpZHRoLHM9ZS5kZXN0SGVpZ2h0LGM9ZS5jYW52YXNJZCx1PWUuZmlsZVR5cGUsbD1lLnF1YWxpdHksZD1XdSgpO2lmKGQpe3ZhciBmPUxmLnB1c2goZnVuY3Rpb24oZSl7b2kodCxlKX0pO0JmKGMsZCwidG9UZW1wRmlsZVBhdGgiLHt4Om4seTpyLHdpZHRoOmksaGVpZ2h0Om8sZGVzdFdpZHRoOmEsZGVzdEhlaWdodDpzLGZpbGVUeXBlOnUscXVhbGl0eTpsLGRpcm5hbWU6bG8rIi9jYW52YXMiLGNhbGxiYWNrSWQ6Zn0pfWVsc2Ugb2kodCx7ZXJyTXNnOiJjYW52YXNUb1RlbXBGaWxlUGF0aDpmYWlsIn0pfX0pO2Z1bmN0aW9uIFdmKGUsdCxuLHIpe1Z1KCJvcGVyYXRlTWFwUGxheWVyIixlLHQsbixyKX1Udi5zdWJzY3JpYmUoIm9uTWFwTWV0aG9kQ2FsbGJhY2siLGZ1bmN0aW9uKGUpe3ZhciB0PWUuY2FsbGJhY2tJZCxuPWUuZGF0YTtJLmludm9rZSh0LG4pfSk7dmFyIEhmPWZ1bmN0aW9uKGUsdCl7dGhpcy5pZD1lLHRoaXMucGFnZVZtPXR9O0hmLnByb3RvdHlwZS5vbj1mdW5jdGlvbihlLHQpe1dmKHRoaXMuaWQsdGhpcy5wYWdlVm0sIm9uIix7bmFtZTplLGNhbGxiYWNrOnR9KX0sSGYucHJvdG90eXBlLiRnZXRBcHBNYXA9ZnVuY3Rpb24oKXtyZXR1cm4gQ3YubWFwcy5nZXRNYXBCeUlkKHRoaXMucGFnZVZtLiRwYWdlLmlkKyItbWFwLSIrdGhpcy5pZCl9LFsiZ2V0Q2VudGVyTG9jYXRpb24iLCJtb3ZlVG9Mb2NhdGlvbiIsImdldFNjYWxlIiwiZ2V0UmVnaW9uIiwiaW5jbHVkZVBvaW50cyIsInRyYW5zbGF0ZU1hcmtlciIsImFkZEN1c3RvbUxheWVyIiwicmVtb3ZlQ3VzdG9tTGF5ZXIiLCJhZGRHcm91bmRPdmVybGF5IiwicmVtb3ZlR3JvdW5kT3ZlcmxheSIsInVwZGF0ZUdyb3VuZE92ZXJsYXkiLCJpbml0TWFya2VyQ2x1c3RlciIsImFkZE1hcmtlcnMiLCJyZW1vdmVNYXJrZXJzIiwibW92ZUFsb25nIiwib3Blbk1hcEFwcCJdLmZvckVhY2goZnVuY3Rpb24obil7SGYucHJvdG90eXBlW25dPUkud2FycChmdW5jdGlvbihlLHQpe2UuY2FsbGJhY2tJZD10LFdmKHRoaXMuaWQsdGhpcy5wYWdlVm0sbixlKX0pfSk7dmFyIEdmPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLE1hcENvbnRleHQ6SGYsY3JlYXRlTWFwQ29udGV4dDpmdW5jdGlvbihlLHQpe3JldHVybiBuZXcgSGYoZSx0fHxxdSgiY3JlYXRlTWFwQ29udGV4dCIpKX19KSxYZj1bLjUsLjgsMSwxLjI1LDEuNSwyXTtmdW5jdGlvbiBZZihlLHQsbixyKXtWdSgib3BlcmF0ZVZpZGVvUGxheWVyIixlLHQsbixyKX12YXIgSmY9ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWUsdGhpcy5wYWdlVm09dH07SmYucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXtZZih0aGlzLmlkLHRoaXMucGFnZVZtLCJwbGF5Iil9LEpmLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe1lmKHRoaXMuaWQsdGhpcy5wYWdlVm0sInBhdXNlIil9LEpmLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKCl7WWYodGhpcy5pZCx0aGlzLnBhZ2VWbSwic3RvcCIpfSxKZi5wcm90b3R5cGUuc2Vlaz1mdW5jdGlvbihlKXtZZih0aGlzLmlkLHRoaXMucGFnZVZtLCJzZWVrIix7cG9zaXRpb246ZX0pfSxKZi5wcm90b3R5cGUuc2VuZERhbm11PWZ1bmN0aW9uKGUpe1lmKHRoaXMuaWQsdGhpcy5wYWdlVm0sInNlbmREYW5tdSIsZSl9LEpmLnByb3RvdHlwZS5wbGF5YmFja1JhdGU9ZnVuY3Rpb24oZSl7flhmLmluZGV4T2YoZSl8fChlPTEpLFlmKHRoaXMuaWQsdGhpcy5wYWdlVm0sInBsYXliYWNrUmF0ZSIse3JhdGU6ZX0pfSxKZi5wcm90b3R5cGUucmVxdWVzdEZ1bGxTY3JlZW49ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pLFlmKHRoaXMuaWQsdGhpcy5wYWdlVm0sInJlcXVlc3RGdWxsU2NyZWVuIixlKX0sSmYucHJvdG90eXBlLmV4aXRGdWxsU2NyZWVuPWZ1bmN0aW9uKCl7WWYodGhpcy5pZCx0aGlzLnBhZ2VWbSwiZXhpdEZ1bGxTY3JlZW4iKX0sSmYucHJvdG90eXBlLnNob3dTdGF0dXNCYXI9ZnVuY3Rpb24oKXtZZih0aGlzLmlkLHRoaXMucGFnZVZtLCJzaG93U3RhdHVzQmFyIil9LEpmLnByb3RvdHlwZS5oaWRlU3RhdHVzQmFyPWZ1bmN0aW9uKCl7WWYodGhpcy5pZCx0aGlzLnBhZ2VWbSwiaGlkZVN0YXR1c0JhciIpfTt2YXIgS2Y9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsVmlkZW9Db250ZXh0OkpmLGNyZWF0ZVZpZGVvQ29udGV4dDpmdW5jdGlvbihlLHQpe3JldHVybiBuZXcgSmYoZSx0fHxxdSgiY3JlYXRlVmlkZW9Db250ZXh0IikpfX0pO2Z1bmN0aW9uIFpmKGUsdCxuLHIpe1R2LnB1Ymxpc2hIYW5kbGVyKHQrIi1lZGl0b3ItIitlLHtjb21wb25lbnRJZDplLHR5cGU6bixkYXRhOnJ9LHQpfVR2LnN1YnNjcmliZSgib25FZGl0b3JNZXRob2RDYWxsYmFjayIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jYWxsYmFja0lkLG49ZS5kYXRhO0kuaW52b2tlKHQsbil9KTt2YXIgUWY9ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWUsdGhpcy5wYWdlSWQ9dH07UWYucHJvdG90eXBlLmZvcm1hdD1mdW5jdGlvbihlLHQpe1pmKHRoaXMuaWQsdGhpcy5wYWdlSWQsImZvcm1hdCIse29wdGlvbnM6e25hbWU6ZSx2YWx1ZTp0fX0pfSxbImluc2VydERpdmlkZXIiLCJpbnNlcnRJbWFnZSIsImluc2VydFRleHQiLCJzZXRDb250ZW50cyIsImdldENvbnRlbnRzIiwiY2xlYXIiLCJyZW1vdmVGb3JtYXQiLCJ1bmRvIiwicmVkbyIsImJsdXIiLCJnZXRTZWxlY3Rpb25UZXh0Iiwic2Nyb2xsSW50b1ZpZXciXS5mb3JFYWNoKGZ1bmN0aW9uKG4pe1FmLnByb3RvdHlwZVtuXT1JLndhcnAoZnVuY3Rpb24oZSx0KXtaZih0aGlzLmlkLHRoaXMucGFnZUlkLG4se29wdGlvbnM6ZSxjYWxsYmFja0lkOnR9KX0pfSk7dmFyIGVwPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLEVkaXRvckNvbnRleHQ6UWZ9KSx0cD1bImNhbnBsYXkiLCJwbGF5IiwicGF1c2UiLCJzdG9wIiwiZW5kZWQiLCJ0aW1lVXBkYXRlIiwiZXJyb3IiLCJ3YWl0aW5nIiwic2Vla2luZyIsInNlZWtlZCJdLG5wPVt7bmFtZToic3JjIixjYWNoZTohMH0se25hbWU6InN0YXJ0VGltZSIsZGVmYXVsdDowLGNhY2hlOiEwfSx7bmFtZToiYXV0b3BsYXkiLGRlZmF1bHQ6ITEsY2FjaGU6ITB9LHtuYW1lOiJsb29wIixkZWZhdWx0OiExLGNhY2hlOiEwfSx7bmFtZToib2JleU11dGVTd2l0Y2giLGRlZmF1bHQ6ITAscmVhZG9ubHk6ITAsY2FjaGU6ITB9LHtuYW1lOiJkdXJhdGlvbiIscmVhZG9ubHk6ITB9LHtuYW1lOiJjdXJyZW50VGltZSIscmVhZG9ubHk6ITB9LHtuYW1lOiJwYXVzZWQiLHJlYWRvbmx5OiEwfSx7bmFtZToiYnVmZmVyZWQiLHJlYWRvbmx5OiEwfSx7bmFtZToidm9sdW1lIn0se25hbWU6InNlc3Npb25DYXRlZ29yeSJ9LHtuYW1lOiJwbGF5YmFja1JhdGUiLGNhY2hlOiEwfV0scnA9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0aGlzLmlkPWUsdGhpcy5fY2FsbGJhY2tzPXt9LHRoaXMuX29wdGlvbnM9e30sdHAuZm9yRWFjaChmdW5jdGlvbihlKXt0Ll9jYWxsYmFja3NbZS50b0xvd2VyQ2FzZSgpXT1bXX0pLG5wLmZvckVhY2goZnVuY3Rpb24obil7dmFyIHI9bi5uYW1lLGU9e2dldDpmdW5jdGlvbigpe3ZhciBlPW4uY2FjaGU/dGhpcy5fb3B0aW9uczpWdSgiZ2V0QXVkaW9TdGF0ZSIse2F1ZGlvSWQ6dGhpcy5pZH0pLHQ9ciBpbiBlP2Vbcl06bi5kZWZhdWx0O3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmInZvbHVtZSIhPT1yP3QvMWUzOnR9fTtuLnJlYWRvbmx5fHwoZS5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5fb3B0aW9uc1tyXT1lLFZ1KCJzZXRBdWRpb1N0YXRlIixPYmplY3QuYXNzaWduKHt9LHRoaXMuX29wdGlvbnMse2F1ZGlvSWQ6dGhpcy5pZH0pKX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIsZSl9KX07ZnVuY3Rpb24gaXAoZSx0LG4scil7ZS5fY2FsbGJhY2tzW3RdLmZvckVhY2goZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUoImVycm9yIj09PXQ/e2Vyck1zZzpuLGVyckNvZGU6cn06e30pfSl9cnAucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLl9vcGVyYXRlKCJwbGF5Iil9LHJwLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMuX29wZXJhdGUoInBhdXNlIil9LHJwLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKCl7dGhpcy5fb3BlcmF0ZSgic3RvcCIpfSxycC5wcm90b3R5cGUuc2Vlaz1mdW5jdGlvbihlKXt0aGlzLl9vcGVyYXRlKCJzZWVrIix7Y3VycmVudFRpbWU6MWUzKmV9KX0scnAucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtBdih0aGlzLl9fdGltaW5nKSxWdSgiZGVzdHJveUF1ZGlvSW5zdGFuY2UiLHthdWRpb0lkOnRoaXMuaWR9KSxkZWxldGUgb3BbdGhpcy5pZF19LHJwLnByb3RvdHlwZS5fb3BlcmF0ZT1mdW5jdGlvbihlLHQpe1Z1KCJvcGVyYXRlQXVkaW8iLE9iamVjdC5hc3NpZ24oe30sdCx7YXVkaW9JZDp0aGlzLmlkLG9wZXJhdGlvblR5cGU6ZX0pKX0sdHAuZm9yRWFjaChmdW5jdGlvbihyKXt2YXIgZT1yWzBdLnRvVXBwZXJDYXNlKCkrci5zdWJzdHIoMSk7cj1yLnRvTG93ZXJDYXNlKCkscnAucHJvdG90eXBlWyJvbiIrZV09ZnVuY3Rpb24oZSl7dGhpcy5fY2FsbGJhY2tzW3JdLnB1c2goZSl9LHJwLnByb3RvdHlwZVsib2ZmIitlXT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9jYWxsYmFja3Nbcl0sbj10LmluZGV4T2YoZSk7MDw9biYmdC5zcGxpY2UobiwxKX19KSxVdSgib25BdWRpb1N0YXRlQ2hhbmdlIixmdW5jdGlvbihlKXt2YXIgdD1lLnN0YXRlLG49ZS5hdWRpb0lkLHI9ZS5lcnJNc2csaT1lLmVyckNvZGUsbz1vcFtuXTtpZihvKWlmKGlwKG8sdCxyLGkpLCJwbGF5Ij09PXQpe3ZhciBhPW8uY3VycmVudFRpbWU7by5fX3RpbWluZz1JdihmdW5jdGlvbigpe28uY3VycmVudFRpbWUhPT1hJiZpcChvLCJ0aW1ldXBkYXRlIil9LDIwMCl9ZWxzZSJwYXVzZSIhPT10JiYic3RvcCIhPT10JiYiZXJyb3IiIT09dHx8QXYoby5fX3RpbWluZyl9KTt2YXIgb3A9T2JqZWN0LmNyZWF0ZShudWxsKTt2YXIgYXA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY3JlYXRlSW5uZXJBdWRpb0NvbnRleHQ6ZnVuY3Rpb24oKXt2YXIgZT1WdSgiY3JlYXRlQXVkaW9JbnN0YW5jZSIpLmF1ZGlvSWQsdD1uZXcgcnAoZSk7cmV0dXJuIG9wW2VdPXR9fSksc3A9W107VXUoIm9uTmV0d29ya1N0YXR1c0NoYW5nZSIsZnVuY3Rpb24odCl7c3AuZm9yRWFjaChmdW5jdGlvbihlKXtvaShlLHQpfSl9KTt2YXIgY3A9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsb25OZXR3b3JrU3RhdHVzQ2hhbmdlOmZ1bmN0aW9uKGUpe3NwLnB1c2goZSl9LG9mZk5ldHdvcmtTdGF0dXNDaGFuZ2U6ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9c3AuaW5kZXhPZihlKTswPD10JiZzcC5zcGxpY2UodCwxKX19fSksdXA9W107VXUoIm9uVGhlbWVDaGFuZ2UiLGZ1bmN0aW9uKHQpe3VwLmZvckVhY2goZnVuY3Rpb24oZSl7b2koZSx0KX0pfSksVXUoIm9uVUlTdHlsZUNoYW5nZSIsZnVuY3Rpb24odCl7dXAuZm9yRWFjaChmdW5jdGlvbihlKXtvaShlLHQpfSl9KTt2YXIgbHA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsb25UaGVtZUNoYW5nZTpmdW5jdGlvbihlKXt1cC5wdXNoKGUpfSxvblVJU3R5bGVDaGFuZ2U6ZnVuY3Rpb24oZSl7dXAucHVzaChlKSxjb25zb2xlLndhcm4oJ1RoZSAidW5pLm9uVUlTdHlsZUNoYW5nZSIgQVBJIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgInVuaS5vblRoZW1lQ2hhbmdlIi4gTGVhcm4gbW9yZTogaHR0cHM6Ly91bmlhcHAuZGNsb3VkLm5ldC5jbi9hcGkvc3lzdGVtL3RoZW1lLicpfX0pLGRwPW11KCJnZXRTZWxlY3RlZFRleHRSYW5nZUV2ZW50Iik7VHYuc3Vic2NyaWJlKCJvbkdldFNlbGVjdGVkVGV4dFJhbmdlIixmdW5jdGlvbihlKXt2YXIgdD1lLmNhbGxiYWNrSWQsbj1lLmRhdGE7Y29uc29sZS5sb2coIm9uR2V0U2VsZWN0ZWRUZXh0UmFuZ2UiKTt2YXIgcj1kcC5wb3AodCk7ciYmcihuKX0pO3ZhciBmcCxwcD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxnZXRTZWxlY3RlZFRleHRSYW5nZTpmdW5jdGlvbihlLHQpe3ZhciBuPVd1KCk7VHYucHVibGlzaEhhbmRsZXIoImdldFNlbGVjdGVkVGV4dFJhbmdlIix7cGFnZUlkOm4sY2FsbGJhY2tJZDpkcC5wdXNoKGZ1bmN0aW9uKGUpe29pKHQsZSl9KX0sbil9fSk7VXUoIm9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLGZ1bmN0aW9uKGUpe2ZwJiZvaShmcCxlKX0pO3ZhciBocD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvbktleWJvYXJkSGVpZ2h0Q2hhbmdlOmZ1bmN0aW9uKGUpe3ZhciB0O3Q9ZnAsVHYucmVtb3ZlQ2FsbGJhY2tIYW5kbGVyKHQpLGZwPWV9LG9mZktleWJvYXJkSGVpZ2h0Q2hhbmdlOmZ1bmN0aW9uKCl7ZnA9bnVsbH19KSx2cD0ibG9uZ1ByZXNzQWN0aW9uc0NhbGxiYWNrIixncD17fTtVdSh2cCxmdW5jdGlvbihlKXt2YXIgdD1lLmVyck1zZ3x8IiI7bmV3IFJlZ0V4cCgiXFw6XFxzKmZhaWwiKS50ZXN0KHQpP2dwLmZhaWwmJmdwLmZhaWwoZSk6Z3Auc3VjY2VzcyYmZ3Auc3VjY2VzcyhlKSxncC5jb21wbGV0ZSYmZ3AuY29tcGxldGUoZSl9KTt2YXIgbXAseXA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwscHJldmlld0ltYWdlOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT17fSksKChncD1lLmxvbmdQcmVzc0FjdGlvbnN8fHt9KS5zdWNjZXNzfHxncC5mYWlsfHxncC5jb21wbGV0ZSkmJihncC5jYWxsYmFja0lkPXZwKSxWdSgicHJldmlld0ltYWdlUGx1cyIsZSl9LGNsb3NlUHJldmlld0ltYWdlOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT17fSksVnUoImNsb3NlUHJldmlld0ltYWdlUGx1cyIsZSl9fSksX3A9e3BhdXNlOm51bGwscmVzdW1lOm51bGwsc3RhcnQ6bnVsbCxzdG9wOm51bGwsZXJyb3I6bnVsbH0sYnA9ZnVuY3Rpb24oKXtVdSgib25SZWNvcmRlclN0YXRlQ2hhbmdlIixmdW5jdGlvbihlKXt2YXIgdD1lLnN0YXRlO2RlbGV0ZSBlLnN0YXRlLGRlbGV0ZSBlLmVyck1zZywiZnVuY3Rpb24iPT10eXBlb2YgX3BbdF0mJl9wW3RdKGUpfSl9O2JwLnByb3RvdHlwZS5vbkVycm9yPWZ1bmN0aW9uKGUpe19wLmVycm9yPWV9LGJwLnByb3RvdHlwZS5vbkZyYW1lUmVjb3JkZWQ9ZnVuY3Rpb24oZSl7fSxicC5wcm90b3R5cGUub25JbnRlcnJ1cHRpb25CZWdpbj1mdW5jdGlvbihlKXt9LGJwLnByb3RvdHlwZS5vbkludGVycnVwdGlvbkVuZD1mdW5jdGlvbihlKXt9LGJwLnByb3RvdHlwZS5vblBhdXNlPWZ1bmN0aW9uKGUpe19wLnBhdXNlPWV9LGJwLnByb3RvdHlwZS5vblJlc3VtZT1mdW5jdGlvbihlKXtfcC5yZXN1bWU9ZX0sYnAucHJvdG90eXBlLm9uU3RhcnQ9ZnVuY3Rpb24oZSl7X3Auc3RhcnQ9ZX0sYnAucHJvdG90eXBlLm9uU3RvcD1mdW5jdGlvbihlKXtfcC5zdG9wPWV9LGJwLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe1Z1KCJvcGVyYXRlUmVjb3JkZXIiLHtvcGVyYXRpb25UeXBlOiJwYXVzZSJ9KX0sYnAucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe1Z1KCJvcGVyYXRlUmVjb3JkZXIiLHtvcGVyYXRpb25UeXBlOiJyZXN1bWUifSl9LGJwLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbihlKXtWdSgib3BlcmF0ZVJlY29yZGVyIixPYmplY3QuYXNzaWduKHt9LGUse29wZXJhdGlvblR5cGU6InN0YXJ0In0pKX0sYnAucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oKXtWdSgib3BlcmF0ZVJlY29yZGVyIix7b3BlcmF0aW9uVHlwZToic3RvcCJ9KX07dmFyIHdwPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldFJlY29yZGVyTWFuYWdlcjpmdW5jdGlvbigpe3JldHVybiBtcHx8KG1wPW5ldyBicCl9fSksa3A9ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWUsdGhpcy5fY2FsbGJhY2tJZD10LHRoaXMuX2NhbGxiYWNrcz1bXX07a3AucHJvdG90eXBlLmFib3J0PWZ1bmN0aW9uKCl7VnUoIm9wZXJhdGVEb3dubG9hZFRhc2siLHtkb3dubG9hZFRhc2tJZDp0aGlzLmlkLG9wZXJhdGlvblR5cGU6ImFib3J0In0pfSxrcC5wcm90b3R5cGUub25Qcm9ncmVzc1VwZGF0ZT1mdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmdGhpcy5fY2FsbGJhY2tzLnB1c2goZSl9LGtwLnByb3RvdHlwZS5vbkhlYWRlcnNSZWNlaXZlZD1mdW5jdGlvbigpe30sa3AucHJvdG90eXBlLm9mZlByb2dyZXNzVXBkYXRlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2NhbGxiYWNrcy5pbmRleE9mKGUpOzA8PXQmJnRoaXMuX2NhbGxiYWNrcy5zcGxpY2UodCwxKX0sa3AucHJvdG90eXBlLm9mZkhlYWRlcnNSZWNlaXZlZD1mdW5jdGlvbigpe307dmFyIFNwPU9iamVjdC5jcmVhdGUobnVsbCk7VXUoIm9uRG93bmxvYWRUYXNrU3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUuZG93bmxvYWRUYXNrSWQsbj1lLnN0YXRlLHI9ZS50ZW1wRmlsZVBhdGgsaT1lLnN0YXR1c0NvZGUsbz1lLnByb2dyZXNzLGE9ZS50b3RhbEJ5dGVzV3JpdHRlbixzPWUudG90YWxCeXRlc0V4cGVjdGVkVG9Xcml0ZSxjPWUuZXJyTXNnLHU9U3BbdF0sbD11Ll9jYWxsYmFja0lkO3N3aXRjaChuKXtjYXNlInByb2dyZXNzVXBkYXRlIjp1Ll9jYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbihlKXtlKHtwcm9ncmVzczpvLHRvdGFsQnl0ZXNXcml0dGVuOmEsdG90YWxCeXRlc0V4cGVjdGVkVG9Xcml0ZTpzfSl9KTticmVhaztjYXNlInN1Y2Nlc3MiOm9pKGwse3RlbXBGaWxlUGF0aDpyLHN0YXR1c0NvZGU6aSxlcnJNc2c6InJlcXVlc3Q6b2sifSk7Y2FzZSJmYWlsIjpvaShsLHtlcnJNc2c6InJlcXVlc3Q6ZmFpbCAiK2N9KTtkZWZhdWx0Ok92KGZ1bmN0aW9uKCl7ZGVsZXRlIFNwW3RdfSwxMDApfX0pO3ZhciB4cD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxkb3dubG9hZEZpbGU6ZnVuY3Rpb24oZSx0KXt2YXIgbj1WdSgiY3JlYXRlRG93bmxvYWRUYXNrIixlKS5kb3dubG9hZFRhc2tJZCxyPW5ldyBrcChuLHQpO3JldHVybiBTcFtuXT1yfX0pLENwPU9iamVjdC5jcmVhdGUobnVsbCk7VXUoIm9uUmVxdWVzdFRhc2tTdGF0ZUNoYW5nZSIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXF1ZXN0VGFza0lkLG49ZS5zdGF0ZSxyPWUuZGF0YSxpPWUuc3RhdHVzQ29kZSxvPWUuaGVhZGVyLGE9ZS5lcnJNc2cscz1lLmNvb2tpZXMsYz1DcFt0XXx8e30sdT1jLmFyZ3MsbD1jLmNhbGxiYWNrSWQ7aWYobClzd2l0Y2goZGVsZXRlIENwW3RdLG4pe2Nhc2Uic3VjY2VzcyI6b2kobCxmdW5jdGlvbihyLGUpe2lmKCJzdHJpbmciPT10eXBlb2Ygci5kYXRhJiY2NTI3OT09PXIuZGF0YS5jaGFyQ29kZUF0KDApJiYoci5kYXRhPXIuZGF0YS5zdWJzdHIoMSkpLHIuc3RhdHVzQ29kZT1wYXJzZUludChyLnN0YXR1c0NvZGUsMTApLFQoci5oZWFkZXIpJiYoci5oZWFkZXI9T2JqZWN0LmtleXMoci5oZWFkZXIpLnJlZHVjZShmdW5jdGlvbihlLHQpe3ZhciBuPXIuaGVhZGVyW3RdO3JldHVybiBBcnJheS5pc0FycmF5KG4pP2VbdF09bi5qb2luKCIsIik6InN0cmluZyI9PXR5cGVvZiBuJiYoZVt0XT1uKSxlfSx7fSkpLGUuZGF0YVR5cGUmJiJqc29uIj09PWUuZGF0YVR5cGUudG9Mb3dlckNhc2UoKSl0cnl7ci5kYXRhPUpTT04ucGFyc2Uoci5kYXRhKX1jYXRjaChlKXt9cmV0dXJuIHJ9KHtkYXRhOnIsc3RhdHVzQ29kZTppLGhlYWRlcjpvLGVyck1zZzoicmVxdWVzdDpvayIsY29va2llczpzfSx1KSk7YnJlYWs7Y2FzZSJmYWlsIjpvaShsLHtlcnJNc2c6InJlcXVlc3Q6ZmFpbCAiK2F9KX19KTt2YXIgVHA9ZnVuY3Rpb24oZSl7dGhpcy5pZD1lfTtUcC5wcm90b3R5cGUuYWJvcnQ9ZnVuY3Rpb24oKXtWdSgib3BlcmF0ZVJlcXVlc3RUYXNrIix7cmVxdWVzdFRhc2tJZDp0aGlzLmlkLG9wZXJhdGlvblR5cGU6ImFib3J0In0pfSxUcC5wcm90b3R5cGUub2ZmSGVhZGVyc1JlY2VpdmVkPWZ1bmN0aW9uKCl7fSxUcC5wcm90b3R5cGUub25IZWFkZXJzUmVjZWl2ZWQ9ZnVuY3Rpb24oKXt9O3ZhciBPcD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxyZXF1ZXN0OmZ1bmN0aW9uKGUsdCl7dmFyIG47Zm9yKHZhciByIGluIGUuaGVhZGVyKWlmKCJjb250ZW50LXR5cGUiPT09ci50b0xvd2VyQ2FzZSgpKXtuPWUuaGVhZGVyW3JdO2JyZWFrfSJHRVQiIT09ZS5tZXRob2QmJjA9PT1uLmluZGV4T2YoImFwcGxpY2F0aW9uL2pzb24iKSYmVChlLmRhdGEpJiYoZS5kYXRhPUpTT04uc3RyaW5naWZ5KGUuZGF0YSkpO3ZhciBpPVZ1KCJjcmVhdGVSZXF1ZXN0VGFzayIsZSkucmVxdWVzdFRhc2tJZDtyZXR1cm4gQ3BbaV09e2FyZ3M6ZSxjYWxsYmFja0lkOnR9LG5ldyBUcChpKX19KSxFcD1mdW5jdGlvbihlKXt0aGlzLmlkPWUsdGhpcy5fY2FsbGJhY2tzPXtvcGVuOltdLGNsb3NlOltdLGVycm9yOltdLG1lc3NhZ2U6W119LHRoaXMuQ0xPU0VEPTMsdGhpcy5DTE9TSU5HPTIsdGhpcy5DT05ORUNUSU5HPTAsdGhpcy5PUEVOPTEsdGhpcy5yZWFkeVN0YXRlPXRoaXMuQ0xPU0VEfTtFcC5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihlKXt0aGlzLnJlYWR5U3RhdGUhPT10aGlzLk9QRU4mJnRoaXMuX2NhbGxiYWNrKGUsInNlbmRTb2NrZXRNZXNzYWdlOmZhaWwgV2ViU29ja2V0IGlzIG5vdCBjb25uZWN0ZWQiKTt2YXIgdD1WdSgib3BlcmF0ZVNvY2tldFRhc2siLE9iamVjdC5hc3NpZ24oe30sZSx7b3BlcmF0aW9uVHlwZToic2VuZCIsc29ja2V0VGFza0lkOnRoaXMuaWR9KSkuZXJyTXNnO3RoaXMuX2NhbGxiYWNrKGUsdC5yZXBsYWNlKCJvcGVyYXRlU29ja2V0VGFzayIsInNlbmRTb2NrZXRNZXNzYWdlIikpfSxFcC5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oZSl7dGhpcy5yZWFkeVN0YXRlPXRoaXMuQ0xPU0lORzt2YXIgdD1WdSgib3BlcmF0ZVNvY2tldFRhc2siLE9iamVjdC5hc3NpZ24oe30sZSx7b3BlcmF0aW9uVHlwZToiY2xvc2UiLHNvY2tldFRhc2tJZDp0aGlzLmlkfSkpLmVyck1zZzt0aGlzLl9jYWxsYmFjayhlLHQucmVwbGFjZSgib3BlcmF0ZVNvY2tldFRhc2siLCJjbG9zZVNvY2tldCIpKX0sRXAucHJvdG90eXBlLm9uT3Blbj1mdW5jdGlvbihlKXt0aGlzLl9jYWxsYmFja3Mub3Blbi5wdXNoKGUpfSxFcC5wcm90b3R5cGUub25DbG9zZT1mdW5jdGlvbihlKXt0aGlzLl9jYWxsYmFja3MuY2xvc2UucHVzaChlKX0sRXAucHJvdG90eXBlLm9uRXJyb3I9ZnVuY3Rpb24oZSl7dGhpcy5fY2FsbGJhY2tzLmVycm9yLnB1c2goZSl9LEVwLnByb3RvdHlwZS5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7dGhpcy5fY2FsbGJhY2tzLm1lc3NhZ2UucHVzaChlKX0sRXAucHJvdG90eXBlLl9jYWxsYmFjaz1mdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLnN1Y2Nlc3Mscj1lLmZhaWwsaT1lLmNvbXBsZXRlLG89e2Vyck1zZzp0fTsvOm9rJC8udGVzdCh0KT8iZnVuY3Rpb24iPT10eXBlb2YgbiYmbihvKToiZnVuY3Rpb24iPT10eXBlb2YgciYmcihvKSwiZnVuY3Rpb24iPT10eXBlb2YgaSYmaShvKX07dmFyIElwPU9iamVjdC5jcmVhdGUobnVsbCksQXA9W10sJHA9T2JqZWN0LmNyZWF0ZShudWxsKTtVdSgib25Tb2NrZXRUYXNrU3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUuc29ja2V0VGFza0lkLG49ZS5zdGF0ZSxyPWUuZGF0YSxpPShlLmVyck1zZyxJcFt0XSk7aWYoaSl7aWYoIm9wZW4iPT09biYmKGkucmVhZHlTdGF0ZT1pLk9QRU4pLGk9PT1BcFswXSYmJHBbbl0mJm9pKCRwW25dLCJtZXNzYWdlIj09PW4/e2RhdGE6cn06e30pLCJlcnJvciI9PT1ufHwiY2xvc2UiPT09bil7aS5yZWFkeVN0YXRlPWkuQ0xPU0VELGRlbGV0ZSBJcFt0XTt2YXIgbz1BcC5pbmRleE9mKGkpOzA8PW8mJkFwLnNwbGljZShvLDEpfWkuX2NhbGxiYWNrc1tuXS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlKCJtZXNzYWdlIj09PW4/e2RhdGE6cn06e30pfSl9fSk7dmFyIFBwLE1wPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNvbm5lY3RTb2NrZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj1WdSgiY3JlYXRlU29ja2V0VGFzayIsZSkuc29ja2V0VGFza0lkLHI9bmV3IEVwKG4pO3JldHVybiBJcFtuXT1yLEFwLnB1c2gociksT3YoZnVuY3Rpb24oKXtvaSh0LHtlcnJNc2c6ImNvbm5lY3RTb2NrZXQ6b2sifSl9LDApLHJ9LHNlbmRTb2NrZXRNZXNzYWdlOmZ1bmN0aW9uKGUsdCl7dmFyIG49QXBbMF07aWYobiYmbi5yZWFkeVN0YXRlPT09bi5PUEVOKXJldHVybiBWdSgib3BlcmF0ZVNvY2tldFRhc2siLE9iamVjdC5hc3NpZ24oe30sZSx7b3BlcmF0aW9uVHlwZToic2VuZCIsc29ja2V0VGFza0lkOm4uaWR9KSk7b2kodCx7ZXJyTXNnOiJzZW5kU29ja2V0TWVzc2FnZTpmYWlsIFdlYlNvY2tldCBpcyBub3QgY29ubmVjdGVkIn0pfSxjbG9zZVNvY2tldDpmdW5jdGlvbihlLHQpe3ZhciBuPUFwWzBdO2lmKG4pcmV0dXJuIG4ucmVhZHlTdGF0ZT1uLkNMT1NJTkcsVnUoIm9wZXJhdGVTb2NrZXRUYXNrIixPYmplY3QuYXNzaWduKHt9LGUse29wZXJhdGlvblR5cGU6ImNsb3NlIixzb2NrZXRUYXNrSWQ6bi5pZH0pKTtvaSh0LHtlcnJNc2c6ImNsb3NlU29ja2V0OmZhaWwgV2ViU29ja2V0IGlzIG5vdCBjb25uZWN0ZWQifSl9LG9uU29ja2V0T3BlbjpmdW5jdGlvbihlKXskcC5vcGVuPWV9LG9uU29ja2V0RXJyb3I6ZnVuY3Rpb24oZSl7JHAuZXJyb3I9ZX0sb25Tb2NrZXRNZXNzYWdlOmZ1bmN0aW9uKGUpeyRwLm1lc3NhZ2U9ZX0sb25Tb2NrZXRDbG9zZTpmdW5jdGlvbihlKXskcC5jbG9zZT1lfX0pLGpwPWZ1bmN0aW9uKCl7fTtqcC5wcm90b3R5cGUub25DaGVja0ZvclVwZGF0ZT1mdW5jdGlvbigpe30sanAucHJvdG90eXBlLm9uVXBkYXRlUmVhZHk9ZnVuY3Rpb24oKXt9LGpwLnByb3RvdHlwZS5vblVwZGF0ZUZhaWxlZD1mdW5jdGlvbigpe30sanAucHJvdG90eXBlLmFwcGx5VXBkYXRlPWZ1bmN0aW9uKCl7fTt2YXIgTHA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZ2V0VXBkYXRlTWFuYWdlcjpmdW5jdGlvbigpe3JldHVybiBQcHx8KFBwPW5ldyBqcCl9fSksQnA9ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWUsdGhpcy5fY2FsbGJhY2tJZD10LHRoaXMuX2NhbGxiYWNrcz1bXX07QnAucHJvdG90eXBlLmFib3J0PWZ1bmN0aW9uKCl7VnUoIm9wZXJhdGVVcGxvYWRUYXNrIix7dXBsb2FkVGFza0lkOnRoaXMuaWQsb3BlcmF0aW9uVHlwZToiYWJvcnQifSl9LEJwLnByb3RvdHlwZS5vblByb2dyZXNzVXBkYXRlPWZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBlJiZ0aGlzLl9jYWxsYmFja3MucHVzaChlKX0sQnAucHJvdG90eXBlLm9uSGVhZGVyc1JlY2VpdmVkPWZ1bmN0aW9uKCl7fSxCcC5wcm90b3R5cGUub2ZmUHJvZ3Jlc3NVcGRhdGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fY2FsbGJhY2tzLmluZGV4T2YoZSk7MDw9dCYmdGhpcy5fY2FsbGJhY2tzLnNwbGljZSh0LDEpfSxCcC5wcm90b3R5cGUub2ZmSGVhZGVyc1JlY2VpdmVkPWZ1bmN0aW9uKCl7fTt2YXIgTnA9T2JqZWN0LmNyZWF0ZShudWxsKTtVdSgib25VcGxvYWRUYXNrU3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudXBsb2FkVGFza0lkLG49ZS5zdGF0ZSxyPWUuZGF0YSxpPWUuc3RhdHVzQ29kZSxvPWUucHJvZ3Jlc3MsYT1lLnRvdGFsQnl0ZXNTZW50LHM9ZS50b3RhbEJ5dGVzRXhwZWN0ZWRUb1NlbmQsYz1lLmVyck1zZyx1PU5wW3RdLGw9dS5fY2FsbGJhY2tJZDtzd2l0Y2gobil7Y2FzZSJwcm9ncmVzc1VwZGF0ZSI6dS5fY2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24oZSl7ZSh7cHJvZ3Jlc3M6byx0b3RhbEJ5dGVzU2VudDphLHRvdGFsQnl0ZXNFeHBlY3RlZFRvU2VuZDpzfSl9KTticmVhaztjYXNlInN1Y2Nlc3MiOm9pKGwse2RhdGE6cixzdGF0dXNDb2RlOmksZXJyTXNnOiJyZXF1ZXN0Om9rIn0pO2Nhc2UiZmFpbCI6b2kobCx7ZXJyTXNnOiJyZXF1ZXN0OmZhaWwgIitjfSk7ZGVmYXVsdDpPdihmdW5jdGlvbigpe2RlbGV0ZSBOcFt0XX0sMTAwKX19KTt2YXIgRHAsUnAsRnAsenAsVnA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsdXBsb2FkRmlsZTpmdW5jdGlvbihlLHQpe3ZhciBuPVZ1KCJjcmVhdGVVcGxvYWRUYXNrIixlKS51cGxvYWRUYXNrSWQscj1uZXcgQnAobix0KTtyZXR1cm4gTnBbbl09cn19KTtmdW5jdGlvbiBVcChlKXt0cnl7cmV0dXJuIEpTT04ucGFyc2UoZSl9Y2F0Y2goZSl7fXJldHVybiBlfWZ1bmN0aW9uIHFwKHQpe2lmKCJlbmFibGVkIj09PXQudHlwZSlGcD0hMCx6cD10Lm9mZmxpbmU7ZWxzZSBpZigiY2xpZW50SWQiPT09dC50eXBlKURwPXQuY2lkLFJwPXQuZXJyTXNnLEhwKERwLHQuZXJyTXNnKTtlbHNlIGlmKCJwdXNoTXNnIj09PXQudHlwZSlmb3IodmFyIGU9e3R5cGU6InJlY2VpdmUiLGRhdGE6VXAodC5tZXNzYWdlKX0sbj0wO248R3AubGVuZ3RoO24rKyl7aWYoKDAsR3Bbbl0pKGUpLGUuc3RvcHBlZClicmVha31lbHNlImNsaWNrIj09PXQudHlwZSYmR3AuZm9yRWFjaChmdW5jdGlvbihlKXtlKHt0eXBlOiJjbGljayIsZGF0YTpVcCh0Lm1lc3NhZ2UpfSl9KX12YXIgV3A9W107ZnVuY3Rpb24gSHAodCxuKXtXcC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UodCxuKX0pLFdwLmxlbmd0aD0wfXZhciBHcD1bXSxYcD0hMSxZcD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxpbnZva2VQdXNoQ2FsbGJhY2s6cXAsZ2V0UHVzaENsaWVudElkOmZ1bmN0aW9uKGUpe1QoZSl8fChlPXt9KTt2YXIgdD1RKGUpLHI9dC5zdWNjZXNzLGk9dC5mYWlsLG89dC5jb21wbGV0ZSxhPUMocikscz1DKGkpLGM9QyhvKTt6cD9Ddi5wdXNoLmdldENsaWVudEluZm9Bc3luYyhmdW5jdGlvbihlKXt2YXIgdD17ZXJyTXNnOiJnZXRQdXNoQ2xpZW50SWQ6b2siLGNpZDplLmNsaWVudGlkfTthJiZyKHQpLGMmJm8odCl9LGZ1bmN0aW9uKGUpe2U9e2Vyck1zZzoiZ2V0UHVzaENsaWVudElkOmZhaWwgIitlLmNvZGUrIjogIitlLm1lc3NhZ2V9LHMmJmkoZSksYyYmbyhlKX0pOlByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24oKXt2b2lkIDA9PT1GcCYmKEZwPSExLERwPSIiLFJwPSJ1bmlQdXNoIGlzIG5vdCBlbmFibGVkIiksV3AucHVzaChmdW5jdGlvbihlLHQpe3ZhciBuO2U/KG49e2Vyck1zZzoiZ2V0UHVzaENsaWVudElkOm9rIixjaWQ6ZX0sYSYmcihuKSk6KG49e2Vyck1zZzoiZ2V0UHVzaENsaWVudElkOmZhaWwiKyh0PyIgIit0OiIiKX0scyYmaShuKSksYyYmbyhuKX0pLHZvaWQgMCE9PURwJiZIcChEcCxScCl9KX0sb25QdXNoTWVzc2FnZTpmdW5jdGlvbihlKXstMT09PUdwLmluZGV4T2YoZSkmJkdwLnB1c2goZSksWHB8fChYcD0hMCxDdi5wdXNoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihlKXtxcCh7dHlwZToiY2xpY2siLG1lc3NhZ2U6ZX0pfSksQ3YucHVzaC5hZGRFdmVudExpc3RlbmVyKCJyZWNlaXZlIixmdW5jdGlvbihlKXtxcCh7dHlwZToicHVzaE1zZyIsbWVzc2FnZTplfSl9KSl9LG9mZlB1c2hNZXNzYWdlOmZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PUdwLmluZGV4T2YoZSk7LTE8dCYmR3Auc3BsaWNlKHQsMSl9ZWxzZSBHcC5sZW5ndGg9MH19KSxKcD17ZHVyYXRpb246NDAwLHRpbWluZ0Z1bmN0aW9uOiJsaW5lYXIiLGRlbGF5OjAsdHJhbnNmb3JtT3JpZ2luOiI1MCUgNTAlIDAifSxLcD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnM9W10sdGhpcy5jdXJyZW50VHJhbnNmb3JtPXt9LHRoaXMuY3VycmVudFN0ZXBBbmltYXRlcz1bXSx0aGlzLm9wdGlvbj1PYmplY3QuYXNzaWduKHt9LEpwLGUpfTtLcC5wcm90b3R5cGUuX2dldE9wdGlvbj1mdW5jdGlvbihlKXt2YXIgdD17dHJhbnNpdGlvbjpPYmplY3QuYXNzaWduKHt9LHRoaXMub3B0aW9uLGUpfTtyZXR1cm4gdC50cmFuc2Zvcm1PcmlnaW49dC50cmFuc2l0aW9uLnRyYW5zZm9ybU9yaWdpbixkZWxldGUgdC50cmFuc2l0aW9uLnRyYW5zZm9ybU9yaWdpbix0fSxLcC5wcm90b3R5cGUuX3B1c2hBbmltYXRlcz1mdW5jdGlvbihlLHQpe3RoaXMuY3VycmVudFN0ZXBBbmltYXRlcy5wdXNoKHt0eXBlOmUsYXJnczp0fSl9LEtwLnByb3RvdHlwZS5fY29udmVyVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC9bQS1aXS9nLGZ1bmN0aW9uKGUpe3JldHVybiItIitlLnRvTG93ZXJDYXNlKCl9KX0sS3AucHJvdG90eXBlLl9nZXRWYWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGU/ZSsicHgiOmV9LEtwLnByb3RvdHlwZS5leHBvcnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmFjdGlvbnM7cmV0dXJuIHRoaXMuYWN0aW9ucz1bXSx7YWN0aW9uczplfX0sS3AucHJvdG90eXBlLnN0ZXA9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gdGhpcy5jdXJyZW50U3RlcEFuaW1hdGVzLmZvckVhY2goZnVuY3Rpb24oZSl7InN0eWxlIiE9PWUudHlwZT90LmN1cnJlbnRUcmFuc2Zvcm1bZS50eXBlXT1lOnQuY3VycmVudFRyYW5zZm9ybVtlLnR5cGUrIi4iK2UuYXJnc1swXV09ZX0pLHRoaXMuYWN0aW9ucy5wdXNoKHthbmltYXRlczpPYmplY3QudmFsdWVzKHRoaXMuY3VycmVudFRyYW5zZm9ybSksb3B0aW9uOnRoaXMuX2dldE9wdGlvbihlKX0pLHRoaXMuY3VycmVudFN0ZXBBbmltYXRlcz1bXSx0aGlzfTt2YXIgWnA9WyJvcGFjaXR5IiwiYmFja2dyb3VuZENvbG9yIl0sUXA9WyJ3aWR0aCIsImhlaWdodCIsImxlZnQiLCJyaWdodCIsInRvcCIsImJvdHRvbSJdO1sibWF0cml4IiwibWF0cml4M2QiLCJyb3RhdGUiLCJyb3RhdGUzZCIsInJvdGF0ZVgiLCJyb3RhdGVZIiwicm90YXRlWiIsInNjYWxlIiwic2NhbGUzZCIsInNjYWxlWCIsInNjYWxlWSIsInNjYWxlWiIsInNrZXciLCJza2V3WCIsInNrZXdZIiwidHJhbnNsYXRlIiwidHJhbnNsYXRlM2QiLCJ0cmFuc2xhdGVYIiwidHJhbnNsYXRlWSIsInRyYW5zbGF0ZVoiXS5jb25jYXQoWnAsUXApLmZvckVhY2goZnVuY3Rpb24obil7S3AucHJvdG90eXBlW25dPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3JldHVybiBacC5jb25jYXQoUXApLmluY2x1ZGVzKG4pP3RoaXMuX3B1c2hBbmltYXRlcygic3R5bGUiLFt0aGlzLl9jb252ZXJUeXBlKG4pLFFwLmluY2x1ZGVzKG4pP3RoaXMuX2dldFZhbHVlKGVbMF0pOmVbMF1dKTp0aGlzLl9wdXNoQW5pbWF0ZXMobixlKSx0aGlzfX0pO3ZhciBlaD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjcmVhdGVBbmltYXRpb246ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBLcChlKX19KSx0aD1tdSgicmVxdWVzdENvbXBvbmVudE9ic2VydmVyIiksbmg9e3RocmVzaG9sZHM6WzBdLGluaXRpYWxSYXRpbzowLG9ic2VydmVBbGw6ITF9LHJoPWZ1bmN0aW9uKGUsdCl7dGhpcy5wYWdlSWQ9ZS4kcGFnZSYmZS4kcGFnZS5pZCx0aGlzLmNvbXBvbmVudD1lLl8kaWR8fGUsdGhpcy5vcHRpb25zPU9iamVjdC5hc3NpZ24oe30sbmgsdCl9O3JoLnByb3RvdHlwZS5fbWFrZVJvb3RNYXJnaW49ZnVuY3Rpb24odCl7dm9pZCAwPT09dCYmKHQ9e30pLHRoaXMub3B0aW9ucy5yb290TWFyZ2luPVsidG9wIiwicmlnaHQiLCJib3R0b20iLCJsZWZ0Il0ubWFwKGZ1bmN0aW9uKGUpe3JldHVybihOdW1iZXIodFtlXSl8fDApKyJweCJ9KS5qb2luKCIgIil9LHJoLnByb3RvdHlwZS5yZWxhdGl2ZVRvPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub3B0aW9ucy5yZWxhdGl2ZVRvU2VsZWN0b3I9ZSx0aGlzLl9tYWtlUm9vdE1hcmdpbih0KSx0aGlzfSxyaC5wcm90b3R5cGUucmVsYXRpdmVUb1ZpZXdwb3J0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9wdGlvbnMucmVsYXRpdmVUb1NlbGVjdG9yPW51bGwsdGhpcy5fbWFrZVJvb3RNYXJnaW4oZSksdGhpc30scmgucHJvdG90eXBlLm9ic2VydmU9ZnVuY3Rpb24oZSx0KXsiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHRoaXMub3B0aW9ucy5zZWxlY3Rvcj1lLHRoaXMucmVxSWQ9dGgucHVzaCh0KSxUdi5wdWJsaXNoSGFuZGxlcigicmVxdWVzdENvbXBvbmVudE9ic2VydmVyIix7cmVxSWQ6dGhpcy5yZXFJZCxjb21wb25lbnQ6dGhpcy5jb21wb25lbnQsb3B0aW9uczp0aGlzLm9wdGlvbnN9LCh0aGlzLmNvbXBvbmVudCx0aGlzLnBhZ2VJZCkpKX0scmgucHJvdG90eXBlLmRpc2Nvbm5lY3Q9ZnVuY3Rpb24oKXtUdi5wdWJsaXNoSGFuZGxlcigiZGVzdHJveUNvbXBvbmVudE9ic2VydmVyIix7cmVxSWQ6dGhpcy5yZXFJZH0sKHRoaXMuY29tcG9uZW50LHRoaXMucGFnZUlkKSl9O3ZhciBpaD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjcmVhdGVJbnRlcnNlY3Rpb25PYnNlcnZlcjpmdW5jdGlvbihlLHQpe3JldHVybiBlLl9pc1Z1ZXx8KHQ9ZSxlPW51bGwpLG5ldyByaChlfHxxdSgiY3JlYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiKSx0KX19KSxvaD1tdSgicmVxdWVzdE1lZGlhUXVlcnlPYnNlcnZlciIpLGFoPWZ1bmN0aW9uKGUsdCl7dGhpcy5wYWdlSWQ9ZS4kcGFnZSYmZS4kcGFnZS5pZCx0aGlzLmNvbXBvbmVudD1lLl8kaWR8fGUsdGhpcy5vcHRpb25zPXR9O2FoLnByb3RvdHlwZS5vYnNlcnZlPWZ1bmN0aW9uKGUsdCl7ImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0aGlzLm9wdGlvbnM9ZSx0aGlzLnJlcUlkPW9oLnB1c2godCksVHYucHVibGlzaEhhbmRsZXIoInJlcXVlc3RNZWRpYVF1ZXJ5T2JzZXJ2ZXIiLHtyZXFJZDp0aGlzLnJlcUlkLGNvbXBvbmVudDp0aGlzLmNvbXBvbmVudCxvcHRpb25zOnRoaXMub3B0aW9uc30sKHRoaXMuY29tcG9uZW50LHRoaXMucGFnZUlkKSkpfSxhaC5wcm90b3R5cGUuZGlzY29ubmVjdD1mdW5jdGlvbigpe1R2LnB1Ymxpc2hIYW5kbGVyKCJkZXN0cm95TWVkaWFRdWVyeU9ic2VydmVyIix7cmVxSWQ6dGhpcy5yZXFJZH0sKHRoaXMuY29tcG9uZW50LHRoaXMucGFnZUlkKSl9O3ZhciBzaD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjcmVhdGVNZWRpYVF1ZXJ5T2JzZXJ2ZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5faXNWdWV8fCh0PWUsZT1udWxsKSxuZXcgYWgoZXx8cXUoImNyZWF0ZU1lZGlhUXVlcnlPYnNlcnZlciIpLHQpfX0pLGNoPXtjYW52YXM6VmYsbWFwOkhmLHZpZGVvOkpmLGVkaXRvcjpRZn07ZnVuY3Rpb24gdWgoZSl7aWYoZSYmZS5jb250ZXh0KXt2YXIgdD1lLmNvbnRleHQsbj10LmlkLHI9dC5uYW1lLGk9dC5wYWdlLG89Y2hbcl07ZS5jb250ZXh0PW8mJm5ldyBvKG4saSl9fXZhciBsaD1mdW5jdGlvbihlLHQsbixyKXt0aGlzLl9zZWxlY3RvclF1ZXJ5PWUsdGhpcy5fY29tcG9uZW50PXQsdGhpcy5fc2VsZWN0b3I9bix0aGlzLl9zaW5nbGU9cn07bGgucHJvdG90eXBlLmJvdW5kaW5nQ2xpZW50UmVjdD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fc2VsZWN0b3JRdWVyeS5fcHVzaCh0aGlzLl9zZWxlY3Rvcix0aGlzLl9jb21wb25lbnQsdGhpcy5fc2luZ2xlLHtpZDohMCxkYXRhc2V0OiEwLHJlY3Q6ITAsc2l6ZTohMH0sZSksdGhpcy5fc2VsZWN0b3JRdWVyeX0sbGgucHJvdG90eXBlLmZpZWxkcz1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9zZWxlY3RvclF1ZXJ5Ll9wdXNoKHRoaXMuX3NlbGVjdG9yLHRoaXMuX2NvbXBvbmVudCx0aGlzLl9zaW5nbGUsZSx0KSx0aGlzLl9zZWxlY3RvclF1ZXJ5fSxsaC5wcm90b3R5cGUuc2Nyb2xsT2Zmc2V0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9zZWxlY3RvclF1ZXJ5Ll9wdXNoKHRoaXMuX3NlbGVjdG9yLHRoaXMuX2NvbXBvbmVudCx0aGlzLl9zaW5nbGUse2lkOiEwLGRhdGFzZXQ6ITAsc2Nyb2xsT2Zmc2V0OiEwfSxlKSx0aGlzLl9zZWxlY3RvclF1ZXJ5fSxsaC5wcm90b3R5cGUuY29udGV4dD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fc2VsZWN0b3JRdWVyeS5fcHVzaCh0aGlzLl9zZWxlY3Rvcix0aGlzLl9jb21wb25lbnQsdGhpcy5fc2luZ2xlLHtjb250ZXh0OiEwfSxlKSx0aGlzLl9zZWxlY3RvclF1ZXJ5fTt2YXIgZGg9ZnVuY3Rpb24oZSl7dGhpcy5fcGFnZT1lLHRoaXMuX3F1ZXVlPVtdLHRoaXMuX3F1ZXVlQ2I9W10sdGhpcy5fbm9kZXNSZWY9bnVsbH07ZGgucHJvdG90eXBlLmV4ZWM9ZnVuY3Rpb24odCl7dmFyIGk9dGhpcztyZXR1cm4gVnUoInJlcXVlc3RDb21wb25lbnRJbmZvIix0aGlzLl9wYWdlLHRoaXMuX3F1ZXVlLGZ1bmN0aW9uKGUpe3ZhciByPWkuX3F1ZXVlQ2I7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUsdCl7QXJyYXkuaXNBcnJheShlKT9lLmZvckVhY2godWgpOnVoKGUpO3ZhciBuPXJbdF07QyhuKSYmbi5jYWxsKGksZSl9KSxDKHQpJiZ0LmNhbGwoaSxlKX0pLHRoaXMuX25vZGVzUmVmfSxkaC5wcm90b3R5cGUuaW49ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2NvbXBvbmVudD1lLl8kaWR8fGUsdGhpc30sZGgucHJvdG90eXBlLnNlbGVjdD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fbm9kZXNSZWY9bmV3IGxoKHRoaXMsdGhpcy5fY29tcG9uZW50LGUsITApfSxkaC5wcm90b3R5cGUuc2VsZWN0QWxsPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9ub2Rlc1JlZj1uZXcgbGgodGhpcyx0aGlzLl9jb21wb25lbnQsZSwhMSl9LGRoLnByb3RvdHlwZS5zZWxlY3RWaWV3cG9ydD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub2Rlc1JlZj1uZXcgbGgodGhpcywwLCIiLCEwKX0sZGgucHJvdG90eXBlLl9wdXNoPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dGhpcy5fcXVldWUucHVzaCh7Y29tcG9uZW50OnQsc2VsZWN0b3I6ZSxzaW5nbGU6bixmaWVsZHM6cn0pLHRoaXMuX3F1ZXVlQ2IucHVzaChpKX07dmFyIGZoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNyZWF0ZVNlbGVjdG9yUXVlcnk6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBkaChlfHxxdSgiY3JlYXRlU2VsZWN0b3JRdWVyeSIpKX19KTtUdi5zdWJzY3JpYmUoIm9uTG9hZEZvbnRGYWNlQ2FsbGJhY2siLGZ1bmN0aW9uKGUpe29pKGUuY2FsbGJhY2tJZCxlLmRhdGEpfSk7dmFyIHBoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGxvYWRGb250RmFjZTpmdW5jdGlvbihlLHQpe3ZhciBuPVd1KCk7aWYoIW4pcmV0dXJue2Vyck1zZzoibG9hZEZvbnRGYWNlOmZhaWwgbm90IGZvbnQgcGFnZSJ9O1R2LnB1Ymxpc2hIYW5kbGVyKCJsb2FkRm9udEZhY2UiLHtvcHRpb25zOmUsY2FsbGJhY2tJZDp0fSxuKX19KTt2YXIgaGg9W107dmFyIHZoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldExvY2FsZTpmdW5jdGlvbigpe3ZhciBlPWp2KHthbGxvd0RlZmF1bHQ6ITB9KTtyZXR1cm4gZSYmZS4kdm0/ZS4kdm0uJGxvY2FsZTpaZS5nZXRMb2NhbGUoKX0sc2V0TG9jYWxlOmZ1bmN0aW9uKHQpe3JldHVybiBqdigpLiR2bS4kbG9jYWxlIT09dCYmKGp2KCkuJHZtLiRsb2NhbGU9dCxMdigpLmZvckVhY2goZnVuY3Rpb24oZSl7VHYucHVibGlzaEhhbmRsZXIoInNldExvY2FsZSIsdCxlLiRwYWdlLmlkKX0pLHh2LnJlcXVpcmVNb2R1bGUoInBsdXMiKS5zZXRMYW5ndWFnZSh0KSxoaC5mb3JFYWNoKGZ1bmN0aW9uKGUpe29pKGUse2xvY2FsZTp0fSl9KSwhMCl9LG9uTG9jYWxlQ2hhbmdlOmZ1bmN0aW9uKGUpe2hoLnB1c2goZSl9fSk7dmFyIGdoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHBhZ2VTY3JvbGxUbzpmdW5jdGlvbihlKXt2YXIgdD1MdigpO3JldHVybiB0Lmxlbmd0aCYmVHYucHVibGlzaEhhbmRsZXIoInBhZ2VTY3JvbGxUbyIsZSx0W3QubGVuZ3RoLTFdLiRwYWdlLmlkKSx7fX19KTt2YXIgbWg9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsc2V0UGFnZU1ldGE6ZnVuY3Rpb24oZSl7dmFyIHQ9THYoKTtyZXR1cm4gdC5sZW5ndGgmJlR2LnB1Ymxpc2hIYW5kbGVyKCJzZXRQYWdlTWV0YSIsZSx0W3QubGVuZ3RoLTFdLiRwYWdlLmlkKSx7fX19KTtmdW5jdGlvbiB5aChlKXtyZXR1cm4gVnUoInNldFRhYkJhckJhZGdlIix7aW5kZXg6ZS5pbmRleCx0eXBlOiJub25lIn0pfXZhciBfaD15aCxiaD1bXTtVdSgib25UYWJCYXJNaWRCdXR0b25UYXAiLGZ1bmN0aW9uKHQpe2JoLmZvckVhY2goZnVuY3Rpb24oZSl7b2koZSx0KX0pfSk7dmFyIHdoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHJlbW92ZVRhYkJhckJhZGdlOnloLHNob3dUYWJCYXJSZWREb3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIFZ1KCJzZXRUYWJCYXJCYWRnZSIse2luZGV4OmUuaW5kZXgsdHlwZToicmVkRG90In0pfSxoaWRlVGFiQmFyUmVkRG90Ol9oLG9uVGFiQmFyTWlkQnV0dG9uVGFwOmZ1bmN0aW9uKGUpe2JoLnB1c2goZSl9fSksa2g9W107VXUoIm9uVmlld0RpZFJlc2l6ZSIsZnVuY3Rpb24odCl7a2guZm9yRWFjaChmdW5jdGlvbihlKXtvaShlLHQpfSl9KTt2YXIgU2gseGgsQ2g9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsb25XaW5kb3dSZXNpemU6ZnVuY3Rpb24oZSl7a2gucHVzaChlKX0sb2ZmV2luZG93UmVzaXplOmZ1bmN0aW9uKGUpe2toLnNwbGljZShraC5pbmRleE9mKGUpLDEpfX0pLFRoPU9iamVjdC5jcmVhdGUobnVsbCksT2g9KFNoPXsiLi9iYXNlL2Jhc2U2NC5qcyI6RHIsIi4vYmFzZS9jYW4taS11c2UuanMiOkZyLCIuL2Jhc2UvaW50ZXJjZXB0b3IuanMiOlZyLCIuL2Jhc2UvdXB4MnB4LmpzIjpHciwiLi9jb250ZXh0L2F1ZGlvLmpzIjpKciwiLi9jb250ZXh0L2JhY2tncm91bmQtYXVkaW8uanMiOlp1LCIuL2NvbnRleHQvY2FudmFzLmpzIjpxZiwiLi9jb250ZXh0L2NyZWF0ZS1tYXAtY29udGV4dC5qcyI6R2YsIi4vY29udGV4dC9jcmVhdGUtdmlkZW8tY29udGV4dC5qcyI6S2YsIi4vY29udGV4dC9lZGl0b3IuanMiOmVwLCIuL2NvbnRleHQvaW5uZXItYXVkaW8uanMiOmFwLCIuL2RldmljZS9uZXR3b3JrLmpzIjpjcCwiLi9kZXZpY2UvdGhlbWUuanMiOmxwLCIuL2tleWJvYXJkL2dldC1zZWxlY3RlZC10ZXh0LXJhbmdlLmpzIjpwcCwiLi9rZXlib2FyZC9rZXlib2FyZC5qcyI6aHAsIi4vbWVkaWEvcHJldmlldy1pbWFnZS5qcyI6eXAsIi4vbWVkaWEvcmVjb3JkZXIuanMiOndwLCIuL25ldHdvcmsvZG93bmxvYWQtZmlsZS5qcyI6eHAsIi4vbmV0d29yay9yZXF1ZXN0LmpzIjpPcCwiLi9uZXR3b3JrL3NvY2tldC5qcyI6TXAsIi4vbmV0d29yay91cGRhdGUuanMiOkxwLCIuL25ldHdvcmsvdXBsb2FkLWZpbGUuanMiOlZwLCIuL3BsdWdpbi9wdXNoLmpzIjpZcCwiLi91aS9jcmVhdGUtYW5pbWF0aW9uLmpzIjplaCwiLi91aS9jcmVhdGUtaW50ZXJzZWN0aW9uLW9ic2VydmVyLmpzIjppaCwiLi91aS9jcmVhdGUtbWVkaWEtcXVlcnktb2JzZXJ2ZXIuanMiOnNoLCIuL3VpL2NyZWF0ZS1zZWxlY3Rvci1xdWVyeS5qcyI6ZmgsIi4vdWkvbG9hZC1mb250LWZhY2UuanMiOnBoLCIuL3VpL2xvY2FsZS5qcyI6dmgsIi4vdWkvcGFnZS1zY3JvbGwtdG8uanMiOmdoLCIuL3VpL3NldC1wYWdlLW1ldGEuanMiOm1oLCIuL3VpL3RhYi1iYXIuanMiOndoLCIuL3VpL3dpbmRvdy5qcyI6Q2h9LCh4aD1mdW5jdGlvbihlKXtyZXR1cm4gU2hbZV18fGZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrZSsiJy4iKX0oKX0pLmtleXM9ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmtleXMoU2gpfSx4aCk7T2gua2V5cygpLmZvckVhY2goZnVuY3Rpb24oZSl7T2JqZWN0LmFzc2lnbihUaCxPaChlKSl9KTt2YXIgRWg9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLFRoLHp1KSxJaD1PYmplY3QuY3JlYXRlKG51bGwpO3QuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgaSxvO0VoW2VdP0loW2VdPShvPU1yKGk9ZSxFaFtlXSksWihpKT9mdW5jdGlvbihuKXt2b2lkIDA9PT1uJiYobj17fSk7Zm9yKHZhciByPVtdLGU9YXJndW1lbnRzLmxlbmd0aC0xOzA8ZS0tOylyW2VdPWFyZ3VtZW50c1tlKzFdO3JldHVybiBDKG4uc3VjY2Vzcyl8fEMobi5mYWlsKXx8QyhuLmNvbXBsZXRlKT96KGksVi5hcHBseSh2b2lkIDAsW2ksbyxuXS5jb25jYXQocikpKTp6KGksbmV3IFByb21pc2UoZnVuY3Rpb24oZSx0KXtWLmFwcGx5KHZvaWQgMCxbaSxvLE9iamVjdC5hc3NpZ24oe30sbix7c3VjY2VzczplLGZhaWw6dH0pXS5jb25jYXQocikpfSkudGhlbihmdW5jdGlvbihlKXtyZXR1cm5bbnVsbCxlXX0pLmNhdGNoKGZ1bmN0aW9uKGUpe3JldHVybltlXX0pKX06byk6SWhbZV09JHIoZSl9KTt2YXIgQWg9T2JqZWN0LmNyZWF0ZShudWxsKTtmdW5jdGlvbiAkaChlLHQsbil7cmV0dXJuIm9uRXJyb3IiIT09dCYmY29uc29sZS5kZWJ1ZygiQXBw77yaIit0KyIgaGF2ZSBiZWVuIGludm9rZWQiKyhuPyIgIitKU09OLnN0cmluZ2lmeShuKToiIikpLChlPWUuJHZtfHxlKS5fX2NhbGxfaG9vayYmZS5fX2NhbGxfaG9vayh0LG4pfWZ1bmN0aW9uIFBoKGUsdCxuKXtyZXR1cm4ib25QYWdlU2Nyb2xsIiE9PXQmJmNvbnNvbGUuZGVidWcoZS4kcGFnZS5yb3V0ZSsiWyIrZS4kcGFnZS5pZCsiXe+8miIrdCsiIGhhdmUgYmVlbiBpbnZva2VkIiksaT10LG89biwocj0ocj1lKS4kdm18fHIpLl9fY2FsbF9ob29rJiZyLl9fY2FsbF9ob29rKGksbyk7dmFyIHIsaSxvfWZ1bmN0aW9uIE1oKGUsdCl7dmFyIG49ZS5uYW1lLHI9ZS5hcmc7InBvc3RNZXNzYWdlIj09PW4/ZnVuY3Rpb24odCxlKXt0PXBhcnNlSW50KHQpO3ZhciBuPUx2KCEwKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLiRwYWdlLmlkPT09dH0pO2lmKG4mJiFuLiRwYWdlLm1ldGEuaXNOVnVlKXt2YXIgcj1uLiR2bS5fJHZkLmVsZW1lbnRzLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIndlYi12aWV3Ij09PWUudHlwZSYmZS5ldmVudHMubWVzc2FnZX0pO2lmKCFyKXJldHVybjtyLmRpc3BhdGNoRXZlbnQoIm1lc3NhZ2UiLHt0eXBlOiJtZXNzYWdlIix0YXJnZXQ6T2JqZWN0LmNyZWF0ZShudWxsKSxjdXJyZW50VGFyZ2V0Ok9iamVjdC5jcmVhdGUobnVsbCksdGltZVN0YW1wOkRhdGUubm93KCksZGV0YWlsOntkYXRhOltlXX19KX19KHRbMF0scik6TXZbbl0ocil9ZnVuY3Rpb24gamgoZSx0KXt2YXIgbj10LmdldEFwcCxpPXQuZ2V0Q3VycmVudFBhZ2VzO2Z1bmN0aW9uIHIoZSx0KXt2YXIgbj1pKCk7bi5sZW5ndGgmJlBoKG5bbi5sZW5ndGgtMV0sZSx0KX1mdW5jdGlvbiBvKHQpe3JldHVybiBmdW5jdGlvbihlKXtyKHQsZSl9fXZhciBhPXtuYXZpZ2F0ZVRvOmZ1bmN0aW9uKCl7cigib25IaWRlIil9LG5hdmlnYXRlQmFjazpmdW5jdGlvbigpe3IoIm9uU2hvdyIpfX07ZSgib25FcnJvciIsZnVuY3Rpb24oZSl7JGgobigpLCJvbkVycm9yIixlKX0pLGUoIm9uUGFnZU5vdEZvdW5kIixmdW5jdGlvbihlKXskaChuKCksIm9uUGFnZU5vdEZvdW5kIixlKX0pLGUoIm9uQXBwUm91dGUiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZSxuPWFbdF07biYmbigpfSksZSgib25BcHBFbnRlckJhY2tncm91bmQiLGZ1bmN0aW9uKCl7JGgobigpLCJvbkhpZGUiKSxyKCJvbkhpZGUiKX0pLGUoIm9uQXBwRW50ZXJGb3JlZ3JvdW5kIixmdW5jdGlvbihlKXskaChuKCksIm9uU2hvdyIsZSksMCE9PWkoKS5sZW5ndGgmJnIoIm9uU2hvdyIpfSksZSgib25SZXNpemUiLGZ1bmN0aW9uKGUsdCl7dmFyIG49aSgpLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuJHBhZ2UuaWQ9PT10fSk7biYmUGgobiwib25SZXNpemUiLGUpfSksZSgib25QdWxsRG93blJlZnJlc2giLGZ1bmN0aW9uKGUsdCl7dmFyIG4scj1pKCkuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS4kcGFnZS5pZD09PXR9KTtyJiYoY3U9Im51bWJlciI9PXR5cGVvZihuPXQpP0N2LndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoU3RyaW5nKG4pKTpuLFBoKHIsIm9uUHVsbERvd25SZWZyZXNoIikpfSksZSgib25UYWJJdGVtVGFwIixvKCJvblRhYkl0ZW1UYXAiKSksZSgib25OYXZpZ2F0aW9uQmFyQnV0dG9uVGFwIixvKCJvbk5hdmlnYXRpb25CYXJCdXR0b25UYXAiKSksZSgib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDaGFuZ2VkIixvKCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENoYW5nZWQiKSksZSgib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDb25maXJtZWQiLG8oIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q29uZmlybWVkIikpLGUoIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2xpY2tlZCIsbygib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDbGlja2VkIikpLGUoIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Rm9jdXNDaGFuZ2VkIixvKCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dEZvY3VzQ2hhbmdlZCIpKSxlKCJvbldlYkludm9rZUFwcFNlcnZpY2UiLE1oKX10LmZvckVhY2goZnVuY3Rpb24oZSl7RWhbZV0/QWhbZV09TXIoZSxFaFtlXSk6QWhbZV09JHIoZSl9KTt2YXIgTGg9ITE7ZnVuY3Rpb24gQmgoZSx0KXt2YXIgbj0iMSI9PT10O2lmKCFufHwhTGgpe2lmKG4/KExoPSEwLEljKEN2LndlYnZpZXcuZ2V0TGF1bmNoV2VidmlldygpKSk6YmN8fEljKEN2LndlYnZpZXcuZ2V0V2Vidmlld0J5SWQodCkpLGJjLmlkIT09dClyZXR1cm4gY29uc29sZS5lcnJvcigid2Vidmlld1JlYWR5WyIrYmMuaWQrIl1bIit0KyJdIG5vdCBtYXRjaCIpO3ZhciByLGk7aWYoYmMubG9hZGVkPSEwLGk9amNbcj10XSxBcnJheS5pc0FycmF5KGkpJiZpLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGUoKX0pLGRlbGV0ZSBqY1tyXSxuKXt2YXIgbz0iLyIrJHYuZW50cnlQYWdlUGF0aCxhPVB2LmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUucGF0aD09PW99KTtpZighYS5tZXRhLmlzTlZ1ZSl7dmFyIHM9YS5tZXRhLmlzVGFiQmFyPyJzd2l0Y2hUYWIiOiJuYXZpZ2F0ZVRvIjtyZXR1cm4gTXZbc10oe3VybDpvKygkdi5lbnRyeVBhZ2VRdWVyeXx8IiIpLG9wZW5UeXBlOiJhcHBMYXVuY2gifSl9fX19dmFyIE5oPU9iamVjdC5jcmVhdGUobnVsbCk7ZnVuY3Rpb24gRGgoZSx0KXt2YXIgbj1lLmRhdGEscj0oZS5vcHRpb25zLE5oW3RdKTtBcnJheS5pc0FycmF5KHIpJiZyLmZvckVhY2goZnVuY3Rpb24oZSl7ZShuKX0pfXZhciBSaCxGaD1bXTtmdW5jdGlvbiB6aCgpe2Zvcih2YXIgZT1GaC5zbGljZSgwKSx0PUZoLmxlbmd0aD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0oKX1mdW5jdGlvbiBWaChlKXt2YXIgdD1lLmRhdGEsbj10Lm1ldGhvZCxyPXQuYXJncztNdltuXSYmTXZbbl0ocil9ZnVuY3Rpb24gVWgoZSx0KXt2YXIgbj1lLmNpZCxyPWUubWV0aG9kLGk9ZS5hcmdzO3Q9cGFyc2VJbnQodCk7dmFyIG89THYoITApLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuJHBhZ2UuaWQ9PT10fSk7aWYoIW8pcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlBhZ2VbIit0KyJdIG5vdCBmb3VuZCIpO3ZhciBhPW8uJHZtLl8kdmQuZ2V0Vm0obik7aWYoIWEpcmV0dXJuIGNvbnNvbGUuZXJyb3IoInZtWyIrbisiXSBub3QgZm91bmQiKTthW3JdJiZhW3JdKGkpfWZ1bmN0aW9uIHFoKHQpe3Q9cGFyc2VJbnQodCk7dmFyIGU9THYoITApLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuJHBhZ2UuaWQ9PT10fSk7cmV0dXJuIGV8fGNvbnNvbGUuZXJyb3IoIlBhZ2VbIit0KyJdIG5vdCBmb3VuZCIpfWZ1bmN0aW9uIFdoKGUsdCl7dmFyIG49cWgodCk7biYmKG4uX191bmlhcHBfd2Vidmlldz0hMCl9ZnVuY3Rpb24gSGgoZSx0KXt2YXIgbj1xaCh0KTtuJiZkZWxldGUgbi5fX3VuaWFwcF93ZWJ2aWV3fWZ1bmN0aW9uIEdoKCl7dmFyIGU9VHYub24sbj1Udi5lbWl0LHQ9VHYuc3Vic2NyaWJlLHI9VHYucHVibGlzaEhhbmRsZXIsaT1Udi5zdWJzY3JpYmVIYW5kbGVyO2lmKGZ1bmN0aW9uKGUsdCl7dC5nZXRBcHA7dmFyIGk9dC5nZXRDdXJyZW50UGFnZXM7ZnVuY3Rpb24gbihyKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXt0PXBhcnNlSW50KHQpO3ZhciBuPWkoKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLiRwYWdlLmlkPT09dH0pO24mJlBoKG4scixlKX19dmFyIG89bXUoInJlcXVlc3RDb21wb25lbnRJbmZvIiksYT1tdSgicmVxdWVzdENvbXBvbmVudE9ic2VydmVyIikscz1tdSgicmVxdWVzdE1lZGlhUXVlcnlPYnNlcnZlciIpO2UoIm9uUGFnZVNjcm9sbCIsbigib25QYWdlU2Nyb2xsIikpLGUoIm9uUmVhY2hCb3R0b20iLG4oIm9uUmVhY2hCb3R0b20iKSksZSgib25SZXF1ZXN0Q29tcG9uZW50SW5mbyIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXFJZCxuPWUucmVzLHI9by5wb3AodCk7ciYmcihuKX0pLGUoIm9uUmVxdWVzdENvbXBvbmVudE9ic2VydmVyIixmdW5jdGlvbihlKXt2YXIgdD1lLnJlcUlkLG49ZS5yZXFFbmQscj1lLnJlcyxpPWEuZ2V0KHQpO2lmKGkpe2lmKG4pcmV0dXJuIHZvaWQgYS5wb3AodCk7aShyKX19KSxlKCJvblJlcXVlc3RNZWRpYVF1ZXJ5T2JzZXJ2ZXIiLGZ1bmN0aW9uKGUpe3ZhciB0PWUucmVxSWQsbj1lLnJlcUVuZCxyPWUucmVzLGk9cy5nZXQodCk7aWYoaSl7aWYobilyZXR1cm4gdm9pZCBzLnBvcCh0KTtpKHIpfX0pfSh0LHtnZXRBcHA6anYsZ2V0Q3VycmVudFBhZ2VzOkx2fSksdWEoInN1YnNjcmliZUhhbmRsZXIiLGZ1bmN0aW9uKGUpe2koZS50eXBlLGUuZGF0YSxlLnBhZ2VJZCl9KSwibmF0aXZlIiE9PSR2LnJlbmRlcmVyKXt0KHVjLEJoKSx0KGNjLERoKSx0KGxjLHpoKTt2YXIgbz0iLyIrJHYuZW50cnlQYWdlUGF0aDtQdi5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT1vfSkubWV0YS5pc05WdWV8fHIodWMsT2JqZWN0LmNyZWF0ZShudWxsKSxbMV0pfWUoImFwaS4iK2ZjLGZ1bmN0aW9uKGUsdCl7bigib25XZWJJbnZva2VBcHBTZXJ2aWNlIixlLHQpfSksdCgib25XeHNJbnZva2VDYWxsTWV0aG9kIixVaCksdChkYyxWaCksdChwYyxXaCksdChoYyxIaCl9dmFyIFhoPXtnbG9iYWxEYXRhOnt9fTtmdW5jdGlvbiBZaChlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS5hbGxvd0RlZmF1bHQ7cmV0dXJuIHZvaWQgMD09PXQmJih0PSExKSxSaHx8KHQ/WGg6dm9pZCBjb25zb2xlLmVycm9yKCJbd2Fybl06IGdldEFwcCgpIGZhaWxlZC4gTGVhcm4gbW9yZTogaHR0cHM6Ly91bmlhcHAuZGNsb3VkLmlvL2NvbGxvY2F0aW9uL2ZyYW1lL3dpbmRvdz9pZD1nZXRhcHAuIikpfWZ1bmN0aW9uIEpoKCl7dmFyIGU9YWkoImdsb2JhbEV2ZW50Iiksbz1Udi5lbWl0O3h2LmNvbmZpZy5wcmVsb2FkP0N2LmtleS5hZGRFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixTYyk6Q3YuZ2xvYmFsRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigic3BsYXNoY2xvc2VkIixmdW5jdGlvbigpe0N2LmtleS5hZGRFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixTYyl9KSxDdi5nbG9iYWxFdmVudC5hZGRFdmVudExpc3RlbmVyKCJwYXVzZSIsZnVuY3Rpb24oKXtvKCJvbkFwcEVudGVyQmFja2dyb3VuZCIpfSksQ3YuZ2xvYmFsRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVzdW1lIixmdW5jdGlvbigpe3ZhciBlLHQsbixyLGk9YWMoKTtpJiZpLnVzZXJBY3Rpb24mJih0PShlPWkpLnBhdGgsbj1lLnF1ZXJ5LHI9ZS5yZWZlcnJlckluZm8sbmMocmMse3BhdGg6dCxxdWVyeTpuP3cobik6e30scmVmZXJyZXJJbmZvOnJ8fHt9fSkpLG8oIm9uQXBwRW50ZXJGb3JlZ3JvdW5kIixvYygpKX0pLEN2Lmdsb2JhbEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoIm5ldGNoYW5nZSIsZnVuY3Rpb24oKXt2YXIgZT1zb1tDdi5uZXR3b3JraW5mby5nZXRDdXJyZW50VHlwZSgpXXx8InVua25vd24iO3NpKCJvbk5ldHdvcmtTdGF0dXNDaGFuZ2UiLHtpc0Nvbm5lY3RlZDoibm9uZSIhPT1lLG5ldHdvcmtUeXBlOmV9KX0pO3ZhciB0PTA7Q3YuZ2xvYmFsRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigiS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLGZ1bmN0aW9uKGUpe3QhPT1lLmhlaWdodCYmc2koIm9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLHtoZWlnaHQ6dD1lLmhlaWdodH0pfSksZS5hZGRFdmVudExpc3RlbmVyKCJ1aXN0eWxlY2hhbmdlIixmdW5jdGlvbihlKXt2YXIgdD17dGhlbWU6ZS51aXN0eWxlfTskaChSaCwib25UaGVtZUNoYW5nZSIsdCksc2koIm9uVGhlbWVDaGFuZ2UiLHQpLHNpKCJvblVJU3R5bGVDaGFuZ2UiLHtzdHlsZTplLnVpc3R5bGV9KX0pLGUuYWRkRXZlbnRMaXN0ZW5lcigidW5pTVBOYXRpdmVFdmVudCIsZnVuY3Rpb24oZSl7c2koInVuaU1QTmF0aXZlRXZlbnQiLGUpfSksQ3YuZ2xvYmFsRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigicGx1c01lc3NhZ2UiLEtoKSxDdi5nbG9iYWxFdmVudC5hZGRFdmVudExpc3RlbmVyKCJXZWJ2aWV3UG9zdE1lc3NhZ2UiLEtoKX1mdW5jdGlvbiBLaChlKXtlLmRhdGEmJmUuZGF0YS50eXBlJiZjYShlLmRhdGEudHlwZSxlLmRhdGEuYXJnc3x8e30pfWZ1bmN0aW9uIFpoKGUpe3ZhciB0LG4scixpLG89KHQ9e3BhdGg6JHYuZW50cnlQYWdlUGF0aCxxdWVyeTokdi5lbnRyeVBhZ2VRdWVyeSxyZWZlcnJlckluZm86JHYucmVmZXJyZXJJbmZvfSxuPXQucGF0aCxyPXQucXVlcnksaT10LnJlZmVycmVySW5mbyxuYyhpYyx7cGF0aDpuLHF1ZXJ5OnI/dyhyKTp7fSxyZWZlcnJlckluZm86aXx8e30sY2hhbm5lbDpDdi5ydW50aW1lLmNoYW5uZWwsbGF1bmNoZXI6Q3YucnVudGltZS5sYXVuY2hlcn0pLG5jKHJjLGljKSxpYyk7JGgoZSwib25MYXVuY2giLG8pLCRoKGUsIm9uU2hvdyIsbyk7dmFyIGE9eHYucmVxdWlyZU1vZHVsZSgicGx1cyIpLmdldEFwcFN0YXRlOzI9PT0oYSYmTnVtYmVyKGEoKSkpJiYkaChlLCJvbkhpZGUiLG8pfWZ1bmN0aW9uIFFoKCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gMD09PShlPWUucmVwbGFjZSgvXC8kLywiIikpLmluZGV4T2YoIl8iKT9Ddi5pby5jb252ZXJ0TG9jYWxGaWxlU3lzdGVtVVJMKGUpOmV9dmFyIHQ9ZSh1byksbj1lKGxvKSxyPW4uc3BsaXQoIi8iKTtyLnBvcCgpLHI9ci5qb2luKCIvIiksQ3YuaW8ucmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSTChDdi5pby5jb252ZXJ0QWJzb2x1dGVGaWxlU3lzdGVtKHIpLGZ1bmN0aW9uKGUpe2UuY3JlYXRlUmVhZGVyKCkucmVhZEVudHJpZXMoZnVuY3Rpb24oZSl7ZSYmZS5sZW5ndGgmJmUuZm9yRWFjaChmdW5jdGlvbihlKXtlLmlzRGlyZWN0b3J5JiYwPT09ZS5mdWxsUGF0aC5pbmRleE9mKHQpJiYwIT09ZS5mdWxsUGF0aC5pbmRleE9mKG4pJiZlLnJlbW92ZVJlY3Vyc2l2ZWx5KCl9KX0pfSl9ZnVuY3Rpb24gZXYoZSx0KXt2YXIgbixyLGksbzsoUmg9ZSkuJHZtPWUsbj1lLGk9dC5vYnNlcnZhYmxlKHtsb2NhbGU6cnx8WmUuZ2V0TG9jYWxlKCl9KSxvPVtdLG4uJHdhdGNoTG9jYWxlPWZ1bmN0aW9uKGUpe28ucHVzaChlKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIiRsb2NhbGUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaS5sb2NhbGV9LHNldDpmdW5jdGlvbih0KXtpLmxvY2FsZT10LG8uZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gZSh0KX0pfX0pLE9iamVjdC5hc3NpZ24oUmgsWGgpO3ZhciBhPWUuJG9wdGlvbnMuZ2xvYmFsRGF0YXx8e307UmguZ2xvYmFsRGF0YT1PYmplY3QuYXNzaWduKGEsUmguZ2xvYmFsRGF0YSksamgoVHYub24se2dldEFwcDpZaCxnZXRDdXJyZW50UGFnZXM6UWN9KSxLYygpLGZ1bmN0aW9uKCl7aWYoJHYudGFiQmFyJiYkdi50YWJCYXIubGlzdCYmJHYudGFiQmFyLmxpc3QubGVuZ3RoKXskdi50YWJCYXIuc2VsZWN0ZWQ9MDt2YXIgZT0kdi50YWJCYXIubGlzdC5maW5kSW5kZXgoZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFnZVBhdGg9PT0kdi5lbnRyeVBhZ2VQYXRofSk7TGEuaW5pdCgkdi50YWJCYXIsZnVuY3Rpb24oZSx0KXtNdi5zd2l0Y2hUYWIoe3VybDoiLyIrZS5wYWdlUGF0aCxvcGVuVHlwZToic3dpdGNoVGFiIixmcm9tOiJ0YWJCYXIiLHN1Y2Nlc3M6ZnVuY3Rpb24oKXtUdi5lbWl0KCJvblRhYkl0ZW1UYXAiLHtpbmRleDp0LHRleHQ6ZS50ZXh0LHBhZ2VQYXRoOmUucGFnZVBhdGh9KX19KX0pLC0xIT09ZSYmMCE9PSgkdi50YWJCYXIuc2VsZWN0ZWQ9ZSkmJkxhLnN3aXRjaFRhYigkdi5lbnRyeVBhZ2VQYXRoKX19KCksSmgoKSxHaCgpLFpoKGUpLE92KFFoLDFlNCksJHYucmVhZHk9ITB9dmFyIHR2PVsidW5pLWFwcCIsInVuaS1sYXlvdXQiLCJ1bmktY29udGVudCIsInVuaS1tYWluIiwidW5pLXRvcC13aW5kb3ciLCJ1bmktbGVmdC13aW5kb3ciLCJ1bmktcmlnaHQtd2luZG93IiwidW5pLXRhYmJhciIsInVuaS1wYWdlIiwidW5pLXBhZ2UtaGVhZCIsInVuaS1wYWdlLXdyYXBwZXIiLCJ1bmktcGFnZS1ib2R5IiwidW5pLXBhZ2UtcmVmcmVzaCIsInVuaS1hY3Rpb25zaGVldCIsInVuaS1tb2RhbCIsInVuaS10b2FzdCIsInVuaS1yZXNpemUtc2Vuc29yIiwidW5pLXNoYWRvdy1yb290IiwidW5pLWFkIiwidW5pLWF1ZGlvIiwidW5pLWJ1dHRvbiIsInVuaS1jYW1lcmEiLCJ1bmktY2FudmFzIiwidW5pLWNoZWNrYm94IiwidW5pLWNoZWNrYm94LWdyb3VwIiwidW5pLWNvdmVyLWltYWdlIiwidW5pLWNvdmVyLXZpZXciLCJ1bmktZWRpdG9yIiwidW5pLWZvcm0iLCJ1bmktZnVuY3Rpb25hbC1wYWdlLW5hdmlnYXRvciIsInVuaS1pY29uIiwidW5pLWltYWdlIiwidW5pLWlucHV0IiwidW5pLWxhYmVsIiwidW5pLWxpdmUtcGxheWVyIiwidW5pLWxpdmUtcHVzaGVyIiwidW5pLW1hcCIsInVuaS1tb3ZhYmxlLWFyZWEiLCJ1bmktbW92YWJsZS12aWV3IiwidW5pLW5hdmlnYXRvciIsInVuaS1vZmZpY2lhbC1hY2NvdW50IiwidW5pLW9wZW4tZGF0YSIsInVuaS1waWNrZXIiLCJ1bmktcGlja2VyLXZpZXciLCJ1bmktcGlja2VyLXZpZXctY29sdW1uIiwidW5pLXByb2dyZXNzIiwidW5pLXJhZGlvIiwidW5pLXJhZGlvLWdyb3VwIiwidW5pLXJpY2gtdGV4dCIsInVuaS1zY3JvbGwtdmlldyIsInVuaS1zbGlkZXIiLCJ1bmktc3dpcGVyIiwidW5pLXN3aXBlci1pdGVtIiwidW5pLXN3aXRjaCIsInVuaS10ZXh0IiwidW5pLXRleHRhcmVhIiwidW5pLXZpZGVvIiwidW5pLXZpZXciLCJ1bmktd2ViLXZpZXciXTtmdW5jdGlvbiBudihlKXtpZigwPT09ZS5pbmRleE9mKCIjIikpe3ZhciB0PWUuc3Vic3RyKDEpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4hKCFlLmNvbXBvbmVudEluc3RhbmNlfHxlLmNvbXBvbmVudEluc3RhbmNlLmlkIT09dCl8fCEoIWUuZGF0YXx8IWUuZGF0YS5hdHRyc3x8ZS5kYXRhLmF0dHJzLmlkIT09dCl9fWlmKDA9PT1lLmluZGV4T2YoIi4iKSl7dmFyIG49ZS5zdWJzdHIoMSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLmRhdGEmJmZ1bmN0aW9uKGUsdCxuKXt2b2lkIDA9PT10JiYodD0iIik7dm9pZCAwPT09biYmKG49IiIpO2lmKHQpcmV0dXJuLTEhPT10LnNwbGl0KHJ2KS5pbmRleE9mKGUpO2lmKG4mJiJzdHJpbmciPT10eXBlb2YgbilyZXR1cm4tMSE9PW4uc3BsaXQocnYpLmluZGV4T2YoZSl9KG4sZS5kYXRhLnN0YXRpY0NsYXNzLGUuZGF0YS5jbGFzcyl9fX12YXIgcnY9L1xzKy87ZnVuY3Rpb24gaXYoZSl7ZS5wcm90b3R5cGUuY3JlYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIE12LmNyZWF0ZUludGVyc2VjdGlvbk9ic2VydmVyKHRoaXMsZSl9LGUucHJvdG90eXBlLmNyZWF0ZU1lZGlhUXVlcnlPYnNlcnZlcj1mdW5jdGlvbihlKXtyZXR1cm4gTXYuY3JlYXRlTWVkaWFRdWVyeU9ic2VydmVyKHRoaXMsZSl9LGUucHJvdG90eXBlLnNlbGVjdENvbXBvbmVudD1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24gZSh0LG4pe2lmKG4odC4kdm5vZGV8fHQuX3Zub2RlKSlyZXR1cm4gdDtmb3IodmFyIHI9dC4kY2hpbGRyZW4saT0wO2k8ci5sZW5ndGg7aSsrKXt2YXIgbz1lKHJbaV0sbik7aWYobylyZXR1cm4gb319KHRoaXMsbnYoZSkpfSxlLnByb3RvdHlwZS5zZWxlY3RBbGxDb21wb25lbnRzPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbiBlKHQsbixyKXtuKHQuJHZub2RlfHx0Ll92bm9kZSkmJnIucHVzaCh0KTtmb3IodmFyIGk9dC4kY2hpbGRyZW4sbz0wO288aS5sZW5ndGg7bysrKWUoaVtvXSxuLHIpO3JldHVybiByfSh0aGlzLG52KGUpLFtdKX19ZnVuY3Rpb24gb3YoZSx0LG4pe2lmKCFlLiRwYXJlbnQpcmV0dXJuIi0xIjt2YXIgcj1lLiR2bm9kZSxpPXIuY29udGV4dCxvPXIuZGF0YS5hdHRycy5faTtyZXR1cm4gbiYmayhyLmRhdGEsImtleSIpJiYobz1vKyI7IityLmRhdGEua2V5KSxpJiZpIT09dCYmaS5fJGlkP2kuXyRpZCsiOyIrdC5fJGlkKyIsIitvOnQuXyRpZCsiLCIrb312YXIgYXYsc3YsY3Y9ImFuZHJvaWQiPT09Q3Yub3MubmFtZS50b0xvd2VyQ2FzZSgpPzMwMDo3MDAsdXY9MDtmdW5jdGlvbiBsdihlKXtyZXR1cm4gZS5wcmV2ZW50RGVmYXVsdD1sLGUuc3RvcFByb3BhZ2F0aW9uPWwsKHQ9ZSkubXA9T2JqZWN0LmFzc2lnbih7IkB3YXJuaW5nIjoibXAgaXMgZGVwcmVjYXRlZCJ9LHQpLHQuX3Byb2Nlc3NlZD0hMCx0O3ZhciB0fVV1KCJvbktleWJvYXJkSGVpZ2h0Q2hhbmdlIixmdW5jdGlvbihlKXtpZigwPCh1dj1lLmhlaWdodCkpe3ZhciB0PWF2O2F2PW51bGwsdCYmdCgpfX0pO3ZhciBkdj17fTtkdlsyMF09ZnVuY3Rpb24oZSxzKXtlLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXSxuPWVbMV0scj1lWzJdO249U3RyaW5nKG4pO3ZhciBpPXMuZWxlbWVudHMuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5jaWQ9PT10JiZlLm5pZD09PW59KTtpZihpKXt2YXIgbz1yLnR5cGUsYT1sdihyKTsiZm9jdXMiPT09b3x8ImJsdXIiPT09bz9mdW5jdGlvbihlLHQpe2lmKGF2PW51bGwsc3YmJkV2KHN2KSwiZm9jdXMiPT09ZS50eXBlKXtpZighKDA8dXYpKXJldHVybiBzdj1PdihmdW5jdGlvbigpe2UuZGV0YWlsLmhlaWdodD11dix0KGUpfSxjdiksYXY9ZnVuY3Rpb24oKXtFdihzdiksZS5kZXRhaWwuaGVpZ2h0PXV2LHQoZSl9O2UuZGV0YWlsLmhlaWdodD11dn10KGUpfShhLGZ1bmN0aW9uKGUpe2kuZGlzcGF0Y2hFdmVudChvLGUpfSk6aS5kaXNwYXRjaEV2ZW50KG8sYSl9fSl9O3ZhciBmdj1mdW5jdGlvbihlLHQsbixyKXt0aGlzLnBhZ2VJZD1lLHRoaXMucGFnZVBhdGg9dCx0aGlzLnBhZ2VRdWVyeT1uLHRoaXMucGFnZVZtPXIsdGhpcy5iYXRjaERhdGE9W10sdGhpcy52bXM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLmluaXRpYWxpemVkPSExLHRoaXMucGFnZUNyZWF0ZURhdGE9ITEsdGhpcy5lbGVtZW50cz1bXSx0aGlzLl9pbml0KCl9O2Z1bmN0aW9uIHB2KGUsdCxuKXtlW3RdPW59ZnVuY3Rpb24gaHYoZSx0KXt2YXIgbixyLGk7Zm9yKHIgaW4gZSlpPWVbcl0sdih0W3JdLGkpfHxwdihufHwobj1PYmplY3QuY3JlYXRlKG51bGwpKSxyLGkpO3JldHVybiBufWZ1bmN0aW9uIHZ2KGUsdCxuKXt2YXIgcixpLG87Zm9yKHIgaW4gZSlpZihpPWVbcl0sbz10W3JdKXt2YXIgYT1odihpLG8pO2EmJnB2KG4scixhKX1lbHNlIHB2KG4scixpKTtyZXR1cm4gbn1mdW5jdGlvbiBndihuLHIpe3ZhciBlPXIuJG9wdGlvbnMubXBPcHRpb25zO3JldHVybiBlJiZBcnJheS5pc0FycmF5KGUuZXh0ZXJuYWxDbGFzc2VzKSYmZS5leHRlcm5hbENsYXNzZXMuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1yW2goZSldO3QmJihuPW4ucmVwbGFjZShlLHQpKX0pLG59ZnVuY3Rpb24gbXYoZSx0LG4pe3N3aXRjaCh0KXtjYXNlIHJhOm49Z3YodGhpcy5fJHN0cmluZ2lmeUNsYXNzKG4pLHRoaXMpO2JyZWFrO2Nhc2Ugb2E6bj1ndihuLHRoaXMpO2JyZWFrO2Nhc2UgaWE6bj10aGlzLl8kbm9ybWFsaXplU3R5bGVCaW5kaW5nKG4pO2JyZWFrO2Nhc2UgZWE6Y2FzZSBuYTpjYXNlIHRhOm49bj8xOjA7YnJlYWs7Y2FzZSBRbzpyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl8kbmV3RGF0YVtlXXx8KHRoaXMuXyRuZXdEYXRhW2VdPXt9KSxyPW5bUW9dfHwobltRb109W10pO2lmKHQuZm9ySXRlbXMpcmV0dXJuIHQuZmlsbCYmZnVuY3Rpb24oZSx0KXt2YXIgbixyO2lmKEFycmF5LmlzQXJyYXkoZSl8fCJzdHJpbmciPT10eXBlb2YgZSlmb3Iobj0wLHI9ZS5sZW5ndGg7bjxyO24rKyl0W25dPW47ZWxzZSBpZigibnVtYmVyIj09dHlwZW9mIGUpZm9yKG49MDtuPGU7bisrKXRbbl09bjtlbHNlIGlmKHUoZSkpZm9yKG49MCxyPU9iamVjdC5rZXlzKGUpLmxlbmd0aDtuPHI7bisrKXRbbl09bn0odC5mb3JJdGVtcyxyKSx0LmZvckl0ZW1zO3ZhciBpPXQuZm9ySW5kZXgsbz10LmtleTtrKHQsImtleUluZGV4Iik/KCJvYmplY3QiIT10eXBlb2YgcltpXSYmKHJbaV09e30pLHJbaV1bImsiK3Qua2V5SW5kZXhdPW8pOnJbaV09bztyZXR1cm4gb30uY2FsbCh0aGlzLGUsbil9cmV0dXJuKHRoaXMuXyRuZXdEYXRhW2VdfHwodGhpcy5fJG5ld0RhdGFbZV09e30pKVt0XT1ufWZ2LnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbigpe3ZhciBlLHQsbj10aGlzO2U9dGhpcy5wYWdlSWQsdD1mdW5jdGlvbihlKXt2YXIgcjtyPW4sZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0sbj1lWzFdO2R2W3RdKG4scil9KX0sKE5oW2VdfHwoTmhbZV09W10pKS5wdXNoKHQpfSxmdi5wcm90b3R5cGUuYWRkTW91bnRlZFZtPWZ1bmN0aW9uKGUpe2UuXyRtb3VudGVkKCksdGhpcy5hZGRWZFN5bmNDYWxsYmFjayhmdW5jdGlvbigpe2UuX19jYWxsX2hvb2soIm1vdW50ZWQiKX0pfSxmdi5wcm90b3R5cGUuYWRkVXBkYXRlZFZtPWZ1bmN0aW9uKGUpe2UuXyR1cGRhdGVkKCksdGhpcy5hZGRWZFN5bmNDYWxsYmFjayhmdW5jdGlvbigpe2UuX19jYWxsX2hvb2soInVwZGF0ZWQiKX0pfSxmdi5wcm90b3R5cGUuYWRkVmRTeW5jQ2FsbGJhY2s9ZnVuY3Rpb24oZSl7QyhlKSYmRmgucHVzaChlKX0sZnYucHJvdG90eXBlLmdldFZtPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnZtc1tlXX0sZnYucHJvdG90eXBlLmFkZFZtPWZ1bmN0aW9uKGUpe3ZhciBuPWUuXyRpZCx0PXRoaXMudm1zW25dO2lmKHQpe3ZhciByPW92KHQsdC4kcGFyZW50LHNjKTt0Ll8kaWQ9cix0aGlzLnZtc1tyXT10LHRoaXMuZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLmNpZDtlLmNpZD10PT09bj9yOnR9KX10aGlzLnZtc1tuXT1lfSxmdi5wcm90b3R5cGUucmVtb3ZlVm09ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5fJGlkO2U9PT10aGlzLnZtc1t0XSYmKHRoaXMuYmF0Y2hEYXRhPXRoaXMuYmF0Y2hEYXRhLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZVsxXVswXSE9PXR9KSxkZWxldGUgdGhpcy52bXNbdF0pfSxmdi5wcm90b3R5cGUuYWRkRWxlbWVudD1mdW5jdGlvbihlKXstMT09PXRoaXMuZWxlbWVudHMuaW5kZXhPZihlKSYmdGhpcy5lbGVtZW50cy5wdXNoKGUpfSxmdi5wcm90b3R5cGUucmVtb3ZlRWxlbWVudD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmVsZW1lbnRzLmluZGV4T2YoZSk7LTEhPT10JiZ0aGlzLmVsZW1lbnRzLnNwbGljZSh0LDEpfSxmdi5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT1bdCxuXTtyJiZpLnB1c2gociksdGhpcy5iYXRjaERhdGEucHVzaChbZSxpXSl9LGZ2LnByb3RvdHlwZS5maW5kPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMuYmF0Y2hEYXRhLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGVbMF09PT10JiZlWzFdWzBdPT09bn0pfSxmdi5wcm90b3R5cGUuc2VuZFBhZ2VDcmVhdGU9ZnVuY3Rpb24oZSl7dGhpcy5wYWdlQ3JlYXRlRGF0YT1lLFR2LnB1Ymxpc2hIYW5kbGVyKGNjLHtkYXRhOltbMixlXV0sb3B0aW9uczp7dGltZXN0YW1wOkRhdGUubm93KCl9fSxbdGhpcy5wYWdlSWRdKX0sZnYucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7dGhpcy5pbml0aWFsaXplZHx8KHRoaXMuaW5pdGlhbGl6ZWQ9ITAsdGhpcy5iYXRjaERhdGEucHVzaChbMTAsW3RoaXMucGFnZUlkLHRoaXMucGFnZVBhdGgsdGhpcy5wYWdlUXVlcnldXSkpO3ZhciBlPXRoaXMuYmF0Y2hEYXRhLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hKDY9PT1lWzBdJiYhT2JqZWN0LmtleXMoZVsxXVsxXSkubGVuZ3RoKX0pO3RoaXMuYmF0Y2hEYXRhLmxlbmd0aD0wLGUubGVuZ3RoJiZUdi5wdWJsaXNoSGFuZGxlcihjYyx7ZGF0YTplLG9wdGlvbnM6e3RpbWVzdGFtcDpEYXRlLm5vdygpfX0sW3RoaXMucGFnZUlkXSl9LGZ2LnByb3RvdHlwZS5yZXN0b3JlUGFnZUNyZWF0ZT1mdW5jdGlvbigpe3RoaXMuYmF0Y2hEYXRhLnB1c2goWzIsdGhpcy5wYWdlQ3JlYXRlRGF0YV0pfSxmdi5wcm90b3R5cGUucmVzdG9yZU1vdW50ZWREYXRhPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxuPWZ1bmN0aW9uKGUpe2UuXyRpZCYmdC5wdXNoKDQsZS5fJGlkLGUuXyRkYXRhLHZvaWQgMCksZS4kY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gbihlKX0pfTtuKHRoaXMucGFnZVZtKX0sZnYucHJvdG90eXBlLnJlc3RvcmVQYWdlQ3JlYXRlZD1mdW5jdGlvbigpe3RoaXMuYmF0Y2hEYXRhLnB1c2goWzEwLFt0aGlzLnBhZ2VJZCx0aGlzLnBhZ2VQYXRoLHRoaXMucGFnZVF1ZXJ5XV0pfSxmdi5wcm90b3R5cGUucmVzdG9yZT1mdW5jdGlvbigpe3RoaXMuaW5pdGlhbGl6ZWQ9ITAsdGhpcy5iYXRjaERhdGEubGVuZ3RoPTAsdGhpcy5yZXN0b3JlUGFnZUNyZWF0ZSgpLHRoaXMucmVzdG9yZU1vdW50ZWREYXRhKCksdGhpcy5yZXN0b3JlUGFnZUNyZWF0ZWQoKSx0aGlzLmZsdXNoKCl9LGZ2LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGU7dGhpcy5iYXRjaERhdGEubGVuZ3RoPTAsdGhpcy52bXM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLmluaXRpYWxpemVkPSExLHRoaXMuZWxlbWVudHMubGVuZ3RoPTAsZT10aGlzLnBhZ2VJZCxkZWxldGUgTmhbZV19O3ZhciB5dj1bIm9uTGF1bmNoIiwib25TaG93Iiwib25IaWRlIiwib25VbmlOVmlld01lc3NhZ2UiLCJvblBhZ2VOb3RGb3VuZCIsIm9uVGhlbWVDaGFuZ2UiLCJvbkVycm9yIiwib25VbmhhbmRsZWRSZWplY3Rpb24iLCJvbkluaXQiLCJvbkxvYWQiLCJvblJlYWR5Iiwib25VbmxvYWQiLCJvblB1bGxEb3duUmVmcmVzaCIsIm9uUmVhY2hCb3R0b20iLCJvblRhYkl0ZW1UYXAiLCJvbkFkZFRvRmF2b3JpdGVzIiwib25TaGFyZVRpbWVsaW5lIiwib25TaGFyZUFwcE1lc3NhZ2UiLCJvblJlc2l6ZSIsIm9uUGFnZVNjcm9sbCIsIm9uTmF2aWdhdGlvbkJhckJ1dHRvblRhcCIsIm9uQmFja1ByZXNzIiwib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDaGFuZ2VkIiwib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDb25maXJtZWQiLCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENsaWNrZWQiLCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dEZvY3VzQ2hhbmdlZCIsIm9uUGFnZVNob3ciLCJvblBhZ2VIaWRlIiwib25QYWdlUmVzaXplIiwib25TZXJ2aWNlQ3JlYXRlZCIsIm9uU2VydmljZUF0dGFjaGVkIl0sX3Y9WyJkYXRhIiwicHJvcGVydGllcyIsIm9wdGlvbnMiLCJyZWxhdGlvbnMiXTtmdW5jdGlvbiBidihpLG8pe3ZhciBlLHQ7X3YuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdCxuLHI7dD1pLChuPW8pW3I9ZV0mJk9iamVjdC5hc3NpZ24odFtyXXx8KHRbcl09e30pLG5bcl0pfSksby5leHRlcm5hbENsYXNzZXMmJihlPWkuZXh0ZXJuYWxDbGFzc2VzfHwoaS5leHRlcm5hbENsYXNzZXM9W10pLHQ9by5leHRlcm5hbENsYXNzZXMsZS5wdXNoLmFwcGx5KGUsdCkpLG8ucGF0aCYmKGkucGF0aD1vLnBhdGgpfWZ1bmN0aW9uIHd2KGcpeyFmdW5jdGlvbihlKXt2YXIgcj1lLmV4dGVuZDtlLmV4dGVuZD1mdW5jdGlvbih0KXt2YXIgbj0odD10fHx7fSkubWV0aG9kcztyZXR1cm4gbiYmT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihlKXstMSE9PXl2LmluZGV4T2YoZSkmJih0W2VdPW5bZV0sZGVsZXRlIG5bZV0pfSksci5jYWxsKHRoaXMsdCl9O3ZhciB0PWUuY29uZmlnLm9wdGlvbk1lcmdlU3RyYXRlZ2llcyxuPXQuY3JlYXRlZDt5di5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RbZV09bn0pLHQubXBPcHRpb25zPWZ1bmN0aW9uKGUsdCl7aWYoIWUpcmV0dXJuIHQ7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gYnYobixlKSx0JiZidihuLHQpLG59fShnKSxnLm1peGluKHtiZWZvcmVDcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy4kb3B0aW9ucztlLnN0b3JlJiYhZy5wcm90b3R5cGUuJHN0b3JlJiYoZy5wcm90b3R5cGUuJHN0b3JlPWUuc3RvcmUpO3ZhciBuLHIsaSxvLGEscyxjLHUsbCxkLGY9ZS53eHM7aWYoZiYmT2JqZWN0LmtleXMoZikuZm9yRWFjaChmdW5jdGlvbihlKXt0W2VdPWZbZV19KSwicGFnZSI9PT10aGlzLm1wVHlwZSl7dmFyIHA9anYoKTtwLiR2bSYmcC4kdm0uJGkxOG4mJih0aGlzLl9pMThuPXAuJHZtLiRpMThuKSx0aGlzLiRzY29wZT10aGlzLiRvcHRpb25zLnBhZ2VJbnN0YW5jZSxkZWxldGUodGhpcy4kc2NvcGUuJHZtPXRoaXMpLiRvcHRpb25zLnBhZ2VJbnN0YW5jZTt2YXIgaD10aGlzLiRzY29wZS5yb3V0ZSx2PXRoaXMuJHNjb3BlLiRwYWdlLmlkO3RoaXMuXyR2ZC5zZW5kUGFnZUNyZWF0ZShbdixoLChuPXRoaXMscj1oLGk9Ii8iK3Isbz1Qdi5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT1pfSksYT1PYmplY3QuYXNzaWduKHt9LCR2LndpbmRvdyxvLndpbmRvdykscz0hMD09PWEuZGlzYWJsZVNjcm9sbD8xOjAsYz1rKGEsIm9uUmVhY2hCb3R0b21EaXN0YW5jZSIpP3BhcnNlSW50KGEub25SZWFjaEJvdHRvbURpc3RhbmNlKTpLbyx1PXJ1KG4uJG9wdGlvbnMsIm9uUGFnZVNjcm9sbCIpPzE6MCxsPXJ1KG4uJG9wdGlvbnMsIm9uUmVhY2hCb3R0b20iKT8xOjAsZD1CYSgpLHt2ZXJzaW9uOnNjLGxvY2FsZTp4di5yZXF1aXJlTW9kdWxlKCJwbHVzIikuZ2V0TGFuZ3VhZ2UoKSxkaXNhYmxlU2Nyb2xsOnMsb25QYWdlU2Nyb2xsOnUsb25QYWdlUmVhY2hCb3R0b206bCxvblJlYWNoQm90dG9tRGlzdGFuY2U6YyxzdGF0dXNiYXJIZWlnaHQ6ZCx3aW5kb3dUb3A6YS50aXRsZU5WaWV3JiYiZmxvYXQiPT09YS50aXRsZU5WaWV3LnR5cGU/ZCtZZTowLHdpbmRvd0JvdHRvbTowPD1MYS5pbmRleE9mKHIpJiZMYS5jb3Zlcj9MYS5oZWlnaHQ6MH0pXSl9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7InBhZ2UiPT09dGhpcy5tcFR5cGUmJihQaCh0aGlzLiRzY29wZSwib25Mb2FkIixmdW5jdGlvbihuKXt2b2lkIDA9PT1uJiYobj17fSk7dmFyIHI9e307cmV0dXJuIE9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24odCl7dHJ5e3JbdF09YihuW3RdKX1jYXRjaChlKXtyW3RdPW5bdF19fSkscn0odGhpcy4kb3B0aW9ucy5wYWdlUXVlcnkpKSxQaCh0aGlzLiRzY29wZSwib25TaG93IikpfSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7InBhZ2UiPT09dGhpcy5tcFR5cGUmJlBoKHRoaXMuJHNjb3BlLCJvblVubG9hZCIpfSxtb3VudGVkOmZ1bmN0aW9uKCl7InBhZ2UiPT09dGhpcy5tcFR5cGUmJihQaCh0aGlzLiRzY29wZSwib25SZWFkeSIpLGZ1bmN0aW9uKGUpe2lmKCR2LnByZWxvYWRSdWxlKXt2YXIgdD0kdi5wcmVsb2FkUnVsZVtlXTt0JiZBcnJheS5pc0FycmF5KHQucGFja2FnZXMpJiZ0LnBhY2thZ2VzLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4tMT09PUtzLmluZGV4T2YoZSl9KS5sZW5ndGgmJmVjKHQucGFja2FnZXMpfX0odGhpcy4kc2NvcGUucm91dGUpKX19KX12YXIga3Y9e2luc3RhbGw6ZnVuY3Rpb24obyxlKXt2YXIgdCxuOyFmdW5jdGlvbihvKXtvLmNvbmZpZy5lcnJvckhhbmRsZXI9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWYoZSk7by51dGlsLndhcm4oIkVycm9yIGluICIrbisnOiAiJysoIkVycm9yIj09PXI/ZS50b1N0cmluZygpOmUpKyciJyx0KTt2YXIgaT0iZnVuY3Rpb24iPT10eXBlb2YganYmJmp2KCk7aSYmcnUoaS4kb3B0aW9ucywib25FcnJvciIpP2kuX19jYWxsX2hvb2soIm9uRXJyb3IiLGUpOmNvbnNvbGUuZXJyb3IoZSl9O3ZhciB0PW8uY29uZmlnLmlzUmVzZXJ2ZWRUYWc7by5jb25maWcuaXNSZXNlcnZlZFRhZz1mdW5jdGlvbihlKXtyZXR1cm4tMSE9PXR2LmluZGV4T2YoZSl8fHQoZSl9LG8uY29uZmlnLmlnbm9yZWRFbGVtZW50cz10djt2YXIgbj1vLmNvbmZpZy5nZXRUYWdOYW1lc3BhY2Uscj1bInN3aXRjaCIsImltYWdlIiwidGV4dCIsInZpZXciXTtvLmNvbmZpZy5nZXRUYWdOYW1lc3BhY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIX5yLmluZGV4T2YoZSkmJm4oZSl9fShvKSwodD1vKS5wcm90b3R5cGUuXyRzPW12LHQucHJvdG90eXBlLl8kc2V0RGF0YT1mdW5jdGlvbihlLHQpe3RoaXMuXyR2ZC5wdXNoKGUsdGhpcy5fJGlkLHQsND09PWUmJnZvaWQgMCl9LHQucHJvdG90eXBlLl8kbW91bnRlZD1mdW5jdGlvbigpe3RoaXMuXyR2ZCYmKHZ2KHRoaXMuXyRuZXdEYXRhLHRoaXMuXyRkYXRhLHRoaXMuXyR2ZE1vdW50ZWREYXRhKSx0aGlzLl8kZGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuXyRuZXdEYXRhKSksInBhZ2UiPT09dGhpcy5tcFR5cGUmJnRoaXMuXyR2ZC5mbHVzaCgpKX0sdC5wcm90b3R5cGUuXyR1cGRhdGVkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl8kdmQmJih2dih0aGlzLl8kbmV3RGF0YSx0aGlzLl8kZGF0YSx0aGlzLl8kdmRVcGRhdGVkRGF0YSksdGhpcy5fJGRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLl8kbmV3RGF0YSkpLHRoaXMuXyR2ZC5pbml0aWFsaXplZCYmT3YoZnVuY3Rpb24oKXtlLiRuZXh0VGljayhlLl8kdmQuZmx1c2guYmluZChlLl8kdmQpKX0sMCkpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsIl8kdmQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcm9vdC5fJHZkb21TeW5jfX0pLHQubWl4aW4oe2JlZm9yZUNyZWF0ZTpmdW5jdGlvbigpe3RoaXMuJG9wdGlvbnMubXBUeXBlJiYodGhpcy5tcFR5cGU9dGhpcy4kb3B0aW9ucy5tcFR5cGUpLCJhcHAiIT09dGhpcy5tcFR5cGUmJigicGFnZSI9PT10aGlzLm1wVHlwZSYmKHRoaXMuXyR2ZG9tU3luYz1uZXcgZnYodGhpcy4kb3B0aW9ucy5wYWdlSWQsdGhpcy4kb3B0aW9ucy5wYWdlUGF0aCx0aGlzLiRvcHRpb25zLnBhZ2VRdWVyeSx0aGlzKSksdGhpcy5fJHZkJiYodGhpcy5fJGlkPW92KHRoaXMsdGhpcy4kcGFyZW50LHNjKSx0aGlzLl8kdmQuYWRkVm0odGhpcyksdGhpcy5fJHZkTW91bnRlZERhdGE9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl8kc2V0RGF0YSg0LHRoaXMuXyR2ZE1vdW50ZWREYXRhKSx0aGlzLl8kZGF0YT1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuXyRuZXdEYXRhPU9iamVjdC5jcmVhdGUobnVsbCkpKX0sYmVmb3JlVXBkYXRlOmZ1bmN0aW9uKCl7aWYodGhpcy5fJHZkKXt2YXIgZT10aGlzLl8kdmQuZmluZCg0LHRoaXMuXyRpZCk7ZT8odGhpcy5fJGRhdGE9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl8kdmRVcGRhdGVkRGF0YT1lWzFdWzFdPU9iamVjdC5jcmVhdGUobnVsbCkpOih0aGlzLl8kdmRVcGRhdGVkRGF0YT1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuXyRzZXREYXRhKDYsdGhpcy5fJHZkVXBkYXRlZERhdGEpKSx0aGlzLl8kbmV3RGF0YT1PYmplY3QuY3JlYXRlKG51bGwpfX0sYmVmb3JlRGVzdHJveTpmdW5jdGlvbigpe3RoaXMuXyR2ZCYmKHRoaXMuXyR2ZC5yZW1vdmVWbSh0aGlzKSx0aGlzLl8kdmRvbVN5bmMmJnRoaXMuXyR2ZG9tU3luYy5kZXN0cm95KCkpfX0pLHd2KG8pLGl2KG8pLChuPW8pLnByb3RvdHlwZS51bmlJREhhc1JvbGU9ZnVuY3Rpb24oZSl7cmV0dXJuLTE8YygpLnJvbGUuaW5kZXhPZihlKX0sbi5wcm90b3R5cGUudW5pSURIYXNQZXJtaXNzaW9uPWZ1bmN0aW9uKGUpe3ZhciB0PWMoKS5wZXJtaXNzaW9uO3JldHVybiB0aGlzLnVuaUlESGFzUm9sZSgiYWRtaW4iKXx8LTE8dC5pbmRleE9mKGUpfSxuLnByb3RvdHlwZS51bmlJRFRva2VuVmFsaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gYygpLnRva2VuRXhwaXJlZD5EYXRlLm5vdygpfSxvLnByb3RvdHlwZS5nZXRPcGVuZXJFdmVudENoYW5uZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcm9vdC4kc2NvcGUuZXZlbnRDaGFubmVsfHwodGhpcy4kcm9vdC4kc2NvcGUuZXZlbnRDaGFubmVsPW5ldyBIYyksdGhpcy4kcm9vdC4kc2NvcGUuZXZlbnRDaGFubmVsfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoby5wcm90b3R5cGUsIiRwYWdlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHJvb3QuJHNjb3BlLiRwYWdlfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLnByb3RvdHlwZSwiJG1wIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJue3BhZ2U6dGhpcy4kcm9vdC4kc2NvcGV9fX0pO3ZhciByPW8ucHJvdG90eXBlLiRtb3VudDtvLnByb3RvdHlwZS4kbW91bnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2lmKCJhcHAiPT09dGhpcy5tcFR5cGUpe2lmKHRoaXMuJG9wdGlvbnMucmVuZGVyPWZ1bmN0aW9uKCl7fSx4di5jb25maWcucHJlbG9hZClyZXR1cm4gdm9pZCB4di5yZXF1aXJlTW9kdWxlKCJnbG9iYWxFdmVudCIpLmFkZEV2ZW50TGlzdGVuZXIoImxhdW5jaEFwcCIsZnVuY3Rpb24oKXtDdi51cGRhdGVDb25maWdJbmZvJiZDdi51cGRhdGVDb25maWdJbmZvKCksZXYobixvKSxyLmNhbGwobixlLHQpfSk7ZXYodGhpcyxvKX1yZXR1cm4gci5jYWxsKHRoaXMsZSx0KX0sby5wcm90b3R5cGUuJG5leHRUaWNrPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMscj10aGlzLl93YXRjaGVyLGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQsZT1uZXcgUHJvbWlzZShmdW5jdGlvbihlKXtyJiZuLl8kcXVldWUuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gcj09PWV9KT9GaC5wdXNoKGk/dC5iaW5kKG4pOmUpOm8ubmV4dFRpY2soaT9mdW5jdGlvbigpe3JldHVybiB0LmNhbGwobil9OmUpLGkmJmUoKX0pO3JldHVybiBpP3ZvaWQgMDplfX19O3JldHVybiBJaC5fXyR3eF9fPUFoLFR2LnB1Ymxpc2hIYW5kbGVyPWZ1bmN0aW9uKGUsdCxuKXt0PUpTT04uc3RyaW5naWZ5KHQpLEFycmF5LmlzQXJyYXkobil8fChuPVtuXSk7dmFyIHI9InR5cGVvZiBVbmlWaWV3SlNCcmlkZ2UgIT09ICd1bmRlZmluZWQnICYmIFVuaVZpZXdKU0JyaWRnZS5zdWJzY3JpYmVIYW5kbGVyKFwiIitlKyciLCcrdCsiLF9fUEFHRV9JRF9fKSI7bi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PUN2LndlYnZpZXcuZ2V0V2Vidmlld0J5SWQoU3RyaW5nKGUpKTt0JiZ0LmV2YWxKUyhyLnJlcGxhY2UoIl9fUEFHRV9JRF9fIixlKSl9KX0sVHYuaW52b2tlQ2FsbGJhY2tIYW5kbGVyPUFyLFR2LnJlbW92ZUNhbGxiYWNrSGFuZGxlcj1mdW5jdGlvbihlKXtkZWxldGUgRXJbZV19LHtfX3Z1ZVBsdWdpbjprdixfX2RlZmluZVBhZ2U6ZnVuY3Rpb24oZSx0KXtYY1tlXT10fSxfX3JlZ2lzdGVyQXBwOmV2LF9fcmVnaXN0ZXJQYWdlOnR1LHVuaTpJaCxnZXRBcHA6WWgsZ2V0Q3VycmVudFBhZ2VzOlFjLEV2ZW50Q2hhbm5lbDpIY319KCksTXY9dC51bmksanY9dC5nZXRBcHAsTHY9dC5nZXRDdXJyZW50UGFnZXM7cmV0dXJuIHR9ZnVuY3Rpb24gaW5pdFNlcnZpY2VKU0JyaWRnZShlKXt2YXIgcj1uZXcgZTtVbmlTZXJ2aWNlSlNCcmlkZ2U9e29uOnIuJG9uLmJpbmQociksb2ZmOnIuJG9mZi5iaW5kKHIpLG9uY2U6ci4kb25jZS5iaW5kKHIpLGVtaXQ6ci4kZW1pdC5iaW5kKHIpLHN1YnNjcmliZTpmdW5jdGlvbihlLHQpe3JldHVybiByLiRvbigidmlldy4iK2UsdCl9LHVuc3Vic2NyaWJlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIuJG9mZigidmlldy4iK2UsdCl9LHN1YnNjcmliZUhhbmRsZXI6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiByLiRlbWl0KCJ2aWV3LiIrZSx0LG4pfX19ZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VDb250ZXh0JDEoZSl7dmFyIHQsbj1lLndlZXgscj1lLlZ1ZSxpPW5ldyBlLldlZXhQbHVzKG4pOyhVbmlTZXJ2aWNlSlNCcmlkZ2V8fGluaXRTZXJ2aWNlSlNCcmlkZ2UociksdW5pKXx8KHQ9Y3JlYXRlU2VydmljZUNvbnRleHQocixuLGksVW5pU2VydmljZUpTQnJpZGdlLGUpLF9fdnVlUGx1Z2luPXQuX192dWVQbHVnaW4sX19kZWZpbmVQYWdlPXQuX19kZWZpbmVQYWdlLF9fcmVnaXN0ZXJBcHA9dC5fX3JlZ2lzdGVyQXBwLF9fcmVnaXN0ZXJQYWdlPXQuX19yZWdpc3RlclBhZ2UsdW5pPXQudW5pLGdldEFwcD10LmdldEFwcCxnZXRDdXJyZW50UGFnZXM9dC5nZXRDdXJyZW50UGFnZXMpO3JldHVybntfX3Z1ZVBsdWdpbjpfX3Z1ZVBsdWdpbixfX2RlZmluZVBhZ2U6X19kZWZpbmVQYWdlLF9fcmVnaXN0ZXJBcHA6X19yZWdpc3RlckFwcCxfX3JlZ2lzdGVyUGFnZTpfX3JlZ2lzdGVyUGFnZSxwbHVzOmksdW5pOnVuaSx3eDp1bmkuX18kd3hfX3x8dW5pLGdldEFwcDpnZXRBcHAsZ2V0Q3VycmVudFBhZ2VzOmdldEN1cnJlbnRQYWdlcyxVbmlTZXJ2aWNlSlNCcmlkZ2U6VW5pU2VydmljZUpTQnJpZGdlfX1mdW5jdGlvbiBzdHlsZU1peGluKGUpe2UucHJvdG90eXBlLl9fbWVyZ2Vfc3R5bGU9ZnVuY3Rpb24ocixlKXtpZih2b2lkIDA9PT1yJiYocj17fSkscil7dmFyIGk9ZXx8dGhpcy4kb3B0aW9ucy5zdHlsZTtPYmplY3Qua2V5cyhyKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWlbZV07aWYodCl7dmFyIG49cltlXTtPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBhPW5bZV0scz10W2VdOyJvYmplY3QiPT10eXBlb2YgYT8oIm9iamVjdCIhPXR5cGVvZiBzJiYocz10W2VdPXt9KSxPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PSEwO2lmKHNbZV0pZm9yKHZhciBuPWFbZV0uc2xpY2UoMSwzKSxyPXNbZV0uc2xpY2UoMSwzKSxpPTA7aTxyLmxlbmd0aDtpKyspe3ZhciBvPW5baV0tcltpXTtpZigwIT09byl7dD0wPG87YnJlYWt9fXQmJihzW2VdPWFbZV0pfSkpOnRbZV09YX0pfWVsc2UgaVtlXT1PYmplY3QuYXNzaWduKHt9LHJbZV0pfSksZXx8KHRoaXMuJG9wdGlvbnMuc3R5bGU9aSl9fX1mdW5jdGlvbiBiNjREZWNvZGVVbmljb2RlKGUpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoYXRvYihlKS5zcGxpdCgiIikubWFwKGZ1bmN0aW9uKGUpe3JldHVybiIlIisoIjAwIitlLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtMil9KS5qb2luKCIiKSl9ZnVuY3Rpb24gZ2V0Q3VycmVudFVzZXJJbmZvKCl7dmFyIGUsdD10aGlzLnVuaS5nZXRTdG9yYWdlU3luYygidW5pX2lkX3Rva2VuIil8fCIiLG49dC5zcGxpdCgiLiIpO2lmKCF0fHwzIT09bi5sZW5ndGgpcmV0dXJue3VpZDpudWxsLHJvbGU6W10scGVybWlzc2lvbjpbXSx0b2tlbkV4cGlyZWQ6MH07dHJ5e2U9SlNPTi5wYXJzZShiNjREZWNvZGVVbmljb2RlKG5bMV0pKX1jYXRjaChlKXt0aHJvdyBuZXcgRXJyb3IoIuiOt+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/W1xkXC5dKylweC8pLG49MDtyZXR1cm4gdCYmKG49cGFyc2VGbG9hdCh0WzFdKSksbn1mdW5jdGlvbiBnZXRQaWNrZXJWaWV3Q29sdW1uKGUpe3ZhciByPWUucmVxdWlyZU1vZHVsZSgiZG9tIiksbz0iYW5kcm9pZCI9PT1lLmNvbmZpZy5lbnYucGxhdGZvcm0udG9Mb3dlckNhc2UoKTtyZXR1cm57bmFtZToiUGlja2VyVmlld0NvbHVtbiIsaXNSZXNlcnZlZDohMCxwcm9wczp7bGVuZ3RoOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue2luZGljYXRvckhlaWdodDpnZXRIZWlnaHQodGhpcy4kcGFyZW50LmluZGljYXRvclN0eWxlU3luYyksaGVpZ2h0OnBhcnNlRmxvYXQodGhpcy4kcGFyZW50LmhlaWdodCksY3VycmVudDp0aGlzLiRwYXJlbnQuZ2V0SXRlbVZhbHVlKHRoaXMpfX0sd2F0Y2g6e2N1cnJlbnQ6ZnVuY3Rpb24oZSl7dGhpcy5faXNNb3VudGVkJiZ0aGlzLiRwYXJlbnQuc2V0SXRlbVZhbHVlKHRoaXMsZSl9LGxlbmd0aDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2Uuc2V0Q3VycmVudChlLmN1cnJlbnQsITAsITApfSwxNTApfX0sbW91bnRlZDpmdW5jdGlvbigpe3RoaXMuY2hlY2tNb3VudGVkKCl9LG1ldGhvZHM6e2NoZWNrTW91bnRlZDpmdW5jdGlvbigpe3ZhciBuLHIsaT10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtQcm9taXNlLmFsbChbaS5fZ2V0Q29tcG9uZW50U2l6ZShpLiRyZWZzLmVsKS50aGVuKGZ1bmN0aW9uKGUpe3ZhciB0PWUuaGVpZ2h0O249aS5oZWlnaHQ9dH0pLG8mJmkubGVuZ3RoP2kuX2dldENvbXBvbmVudFNpemUoaS4kcmVmcy5pdGVtKS50aGVuKGZ1bmN0aW9uKGUpe3ZhciB0PWUuaGVpZ2h0O3I9aS5pbmRpY2F0b3JIZWlnaHQ9dC9pLmxlbmd0aH0pOmkuX2dldENvbXBvbmVudFNpemUoaS4kcmVmcy5pbmRpY2F0b3IpLnRoZW4oZnVuY3Rpb24oZSl7dmFyIHQ9ZS5oZWlnaHQ7cj1pLmluZGljYXRvckhlaWdodD10fSldKS50aGVuKGZ1bmN0aW9uKCl7biYmcj9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aS5zZXRDdXJyZW50KGkuY3VycmVudCwhMSwhMCksaS5faXNNb3VudGVkPSEwfSw1MCk6aS5jaGVja01vdW50ZWQoKX0pfSw1MCl9LG9uU2Nyb2xsZW5kOmZ1bmN0aW9uKGUpe2lmKCEoRGF0ZS5ub3coKS10aGlzLnNjcm9sbFRvRWxlbWVudFRpbWU8MzQwKSl7dmFyIHQ9ZS5kZXRhaWwuY29udGVudE9mZnNldC55LG49TWF0aC5yb3VuZCh0L3RoaXMuaW5kaWNhdG9ySGVpZ2h0KTt0JXRoaXMuaW5kaWNhdG9ySGVpZ2h0P3RoaXMuc2V0Q3VycmVudChuLCEwLCEwKTp0aGlzLmN1cnJlbnQ9bn19LHNldEN1cnJlbnQ6ZnVuY3Rpb24oZSx0LG4pe3ZvaWQgMD09PXQmJih0PSEwKSwodGhpcy5jdXJyZW50IT09ZXx8bikmJihyLnNjcm9sbFRvRWxlbWVudCh0aGlzLiRyZWZzLmNvbnRlbnQse29mZnNldDplKnRoaXMuaW5kaWNhdG9ySGVpZ2h0LGFuaW1hdGVkOnR9KSx0aGlzLmN1cnJlbnQ9ZSx0JiYodGhpcy5zY3JvbGxUb0VsZW1lbnRUaW1lPURhdGUubm93KCkpKX0sX2dldENvbXBvbmVudFNpemU6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKG4pe3IuZ2V0Q29tcG9uZW50UmVjdChlLGZ1bmN0aW9uKGUpe3ZhciB0PWUuc2l6ZTtuKHQpfSl9KX19LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLiRzbG90cy5kZWZhdWx0LG49KHRoaXMuaGVpZ2h0LXRoaXMuaW5kaWNhdG9ySGVpZ2h0KS8yLHI9dGhpcy5oZWlnaHQtbisicHgiO24rPSJweCI7dmFyIGk9e3Nob3dTY3JvbGxiYXI6ITEsc2Nyb2xsVG9CZWdpbjohMSxkZWNlbGVyYXRpb25SYXRlOi4zLHNjcm9sbFk6ITB9O3JldHVybiBvfHwoaS5zY3JvbGxUb3A9dGhpcy5jdXJyZW50KnRoaXMuaW5kaWNhdG9ySGVpZ2h0KSxlKCJkaXYiLHRoaXMuX2coe3JlZjoiZWwiLHN0YXRpY0NsYXNzOlsidW5pLXBpY2tlci12aWV3LWNvbHVtbiJdfSx0aGlzLiRsaXN0ZW5lcnMpLFtlKCJzY3JvbGwtdmlldyIse3N0YXRpY0NsYXNzOlsidW5pLXBpY2tlci12aWV3LWdyb3VwIl0sYXR0cnM6aSxvbjp7c2Nyb2xsZW5kOnRoaXMub25TY3JvbGxlbmR9LHN0eWxlOntmbGV4RGlyZWN0aW9uOiJjb2x1bW4ifX0sW2UoImRpdiIse3JlZjoiY29udGVudCIsc3RhdGljQ2xhc3M6WyJ1bmktcGlja2VyLXZpZXctY29udGVudCJdLHN0eWxlOntmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLHBhZGRpbmdUb3A6bixwYWRkaW5nQm90dG9tOm59fSxvP1tlKCJkaXYiLHtyZWY6Iml0ZW0iLHN0eWxlOntmbGV4RGlyZWN0aW9uOiJjb2x1bW4ifX0sdCldOnQpXSksZSgidS1zY2FsYWJsZSIse3N0YXRpY0NsYXNzOlsidW5pLXBpY2tlci12aWV3LW1hc2siXSxzdHlsZTp0aGlzLiRwYXJlbnQubWFza1N0eWxlU3luY30sW2UoInUtc2NhbGFibGUiLHtzdGF0aWNDbGFzczpbInVuaS1waWNrZXItdmlldy1tYXNrIiwidW5pLXBpY2tlci12aWV3LW1hc2stdG9wIl0sc3R5bGU6e2JvdHRvbTpyfX0pLGUoInUtc2NhbGFibGUiLHtzdGF0aWNDbGFzczpbInVuaS1waWNrZXItdmlldy1tYXNrIiwidW5pLXBpY2tlci12aWV3LW1hc2stYm90dG9tIl0sc3R5bGU6e3RvcDpyfX0pXSksZSgidS1zY2FsYWJsZSIse3JlZjoiaW5kaWNhdG9yIixzdGF0aWNDbGFzczpbInVuaS1waWNrZXItdmlldy1pbmRpY2F0b3IiXSxzdHlsZTpPYmplY3QuYXNzaWduKHt9LHRoaXMuJHBhcmVudC5pbmRpY2F0b3JTdHlsZVN5bmMse3RvcDpufSl9KV0sMil9LHN0eWxlOnsidW5pLXBpY2tlci12aWV3LWNvbHVtbiI6e2ZsZXg6MSxwb3NpdGlvbjoicmVsYXRpdmUiLGFsaWduSXRlbXM6InN0cmV0Y2giLG92ZXJmbG93OiJoaWRkZW4ifSwidW5pLXBpY2tlci12aWV3LW1hc2siOntwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxyaWdodDowLGJvdHRvbTowLHBvaW50ZXJFdmVudHM6Im5vbmUifSwidW5pLXBpY2tlci12aWV3LW1hc2stdG9wIjp7Ym90dG9tOjAsYmFja2dyb3VuZEltYWdlOiJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSkscmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpKSJ9LCJ1bmktcGlja2VyLXZpZXctbWFzay1ib3R0b20iOnt0b3A6MCxiYWNrZ3JvdW5kSW1hZ2U6ImxpbmVhci1ncmFkaWVudCh0byB0b3AscmdiYSgyNTUsIDI1NSwgMjU1LCAwLjk1KSxyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNikpIn0sInVuaS1waWNrZXItdmlldy1ncm91cCI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjAsbGVmdDowLHJpZ2h0OjAsYm90dG9tOjB9LCJ1bmktcGlja2VyLXZpZXctY29udGVudCI6e3BhZGRpbmdUb3A6MCxwYWRkaW5nUmlnaHQ6MCxwYWRkaW5nQm90dG9tOjAscGFkZGluZ0xlZnQ6MH0sInVuaS1waWNrZXItdmlldy1pbmRpY2F0b3IiOntwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6MCxyaWdodDowLHRvcDowLGhlaWdodDoiMzRweCIscG9pbnRlckV2ZW50czoibm9uZSIsYm9yZGVyQ29sb3I6IiNlNWU1ZTUiLGJvcmRlclRvcFdpZHRoOiIxcHgiLGJvcmRlckJvdHRvbVdpZHRoOiIxcHgifX19fWZ1bmN0aW9uIGluaXQkMjQoZSx0KXtlLmNvbXBvbmVudCgicGlja2VyLXZpZXctY29sdW1uIixnZXRQaWNrZXJWaWV3Q29sdW1uKHQpKX12YXIgaW5pdENvbXBvbmVudHM9W2luaXQkMyxpbml0JDQsaW5pdCQ1LGluaXQkNixpbml0JDcsaW5pdCQ4LGluaXQkOSxpbml0JDEwLGluaXQkMTEsaW5pdCQxMixpbml0JDEzLGluaXQkMTQsaW5pdCQxNSxpbml0JDE2LGluaXQkMTcsaW5pdCQxOCxpbml0JDE5LGluaXQkMjAsaW5pdCQyMSxpbml0JDIyLGluaXQkMjMsaW5pdCQyNF0sdW5pQXBwPXtpbnN0YWxsOmZ1bmN0aW9uKHQsbil7dC5wcm90b3R5cGUuXyRidXM9bmV3IHQsdC5wcm90b3R5cGUuZ2V0T3BlbmVyRXZlbnRDaGFubmVsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHJvb3QuJHNjb3BlLmV2ZW50Q2hhbm5lbHx8KHRoaXMuJHJvb3QuJHNjb3BlLmV2ZW50Q2hhbm5lbD1uZXcgbi5FdmVudENoYW5uZWwpLHRoaXMuJHJvb3QuJHNjb3BlLmV2ZW50Q2hhbm5lbH0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCIkcGFnZSIse2dldDpmdW5jdGlvbigpe3JldHVybiF0aGlzLiRzY29wZSYmdGhpcy4kcm9vdCYmdGhpcy4kcm9vdC4kc2NvcGUmJih0aGlzLiRzY29wZT10aGlzLiRyb290LiRzY29wZSksdGhpcy4kc2NvcGUuJHBhZ2V9fSksc3R5bGVNaXhpbih0KSx1bmlJZE1peGluKHQsbiksbGlmZWN5Y2xlTWl4aW4odCxuLndlZXgsbiksIndlZXgiIT09bi5fX3VuaUNvbmZpZy5udnVlQ29tcGlsZXImJmluaXRDb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24oZSl7ZSh0LG4ud2VleCxuKX0pfX07ZnVuY3Rpb24gdnVlRmFjdG9yeShlLHQpe3ZhciBtPU9iamVjdC5mcmVlemUoe30pO2Z1bmN0aW9uIEUoZSl7cmV0dXJuIG51bGw9PWV9ZnVuY3Rpb24gSShlKXtyZXR1cm4gbnVsbCE9ZX1mdW5jdGlvbiBBKGUpe3JldHVybiEwPT09ZX1mdW5jdGlvbiBjKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZXx8Im51bWJlciI9PXR5cGVvZiBlfHwic3ltYm9sIj09dHlwZW9mIGV8fCJib29sZWFuIj09dHlwZW9mIGV9ZnVuY3Rpb24geShlKXtyZXR1cm4gbnVsbCE9PWUmJiJvYmplY3QiPT10eXBlb2YgZX12YXIgcj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIHUoZSl7cmV0dXJuIltvYmplY3QgT2JqZWN0XSI9PT1yLmNhbGwoZSl9ZnVuY3Rpb24gaShlKXt2YXIgdD1wYXJzZUZsb2F0KFN0cmluZyhlKSk7cmV0dXJuIDA8PXQmJk1hdGguZmxvb3IodCk9PT10JiZpc0Zpbml0ZShlKX1mdW5jdGlvbiBfKGUpe3JldHVybiBJKGUpJiYiZnVuY3Rpb24iPT10eXBlb2YgZS50aGVuJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5jYXRjaH1mdW5jdGlvbiBuKGUpe3JldHVybiBudWxsPT1lPyIiOkFycmF5LmlzQXJyYXkoZSl8fHUoZSkmJmUudG9TdHJpbmc9PT1yP0pTT04uc3RyaW5naWZ5KGUsbnVsbCwyKTpTdHJpbmcoZSl9ZnVuY3Rpb24gbyhlKXt2YXIgdD1wYXJzZUZsb2F0KGUpO3JldHVybiBpc05hTih0KT9lOnR9ZnVuY3Rpb24gcyhlLHQpe2Zvcih2YXIgbj1PYmplY3QuY3JlYXRlKG51bGwpLHI9ZS5zcGxpdCgiLCIpLGk9MDtpPHIubGVuZ3RoO2krKyluW3JbaV1dPSEwO3JldHVybiB0P2Z1bmN0aW9uKGUpe3JldHVybiBuW2UudG9Mb3dlckNhc2UoKV19OmZ1bmN0aW9uKGUpe3JldHVybiBuW2VdfX1zKCJzbG90LGNvbXBvbmVudCIsITApO3ZhciBsPXMoImtleSxyZWYsc2xvdCxzbG90LXNjb3BlLGlzIik7ZnVuY3Rpb24gYihlLHQpe2lmKGUubGVuZ3RoKXt2YXIgbj1lLmluZGV4T2YodCk7aWYoLTE8bilyZXR1cm4gZS5zcGxpY2UobiwxKX19dmFyIGE9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBkKGUsdCl7cmV0dXJuIGEuY2FsbChlLHQpfWZ1bmN0aW9uIGYodCl7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV18fChuW2VdPXQoZSkpfX12YXIgcD0vLShcdykvZyxoPWYoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShwLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/dC50b1VwcGVyQ2FzZSgpOiIifSl9KSx2PWYoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKX0pLGc9L1xCKFtBLVpdKS9nLHc9ZihmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGcsIi0kMSIpLnRvTG93ZXJDYXNlKCl9KTt2YXIgaz1GdW5jdGlvbi5wcm90b3R5cGUuYmluZD9mdW5jdGlvbihlLHQpe3JldHVybiBlLmJpbmQodCl9OmZ1bmN0aW9uKG4scil7ZnVuY3Rpb24gZShlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoO3JldHVybiB0PzE8dD9uLmFwcGx5KHIsYXJndW1lbnRzKTpuLmNhbGwocixlKTpuLmNhbGwocil9cmV0dXJuIGUuX2xlbmd0aD1uLmxlbmd0aCxlfTtmdW5jdGlvbiBTKGUsdCl7dD10fHwwO2Zvcih2YXIgbj1lLmxlbmd0aC10LHI9bmV3IEFycmF5KG4pO24tLTspcltuXT1lW24rdF07cmV0dXJuIHJ9ZnVuY3Rpb24geChlLHQpe2Zvcih2YXIgbiBpbiB0KWVbbl09dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBDKGUpe2Zvcih2YXIgdD17fSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXSYmeCh0LGVbbl0pO3JldHVybiB0fWZ1bmN0aW9uIFQoZSx0LG4pe312YXIgTz1mdW5jdGlvbihlLHQsbil7cmV0dXJuITF9LCQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9O2Z1bmN0aW9uIFAodCxuKXtpZih0PT09bilyZXR1cm4hMDt2YXIgZT15KHQpLHI9eShuKTtpZighZXx8IXIpcmV0dXJuIWUmJiFyJiZTdHJpbmcodCk9PT1TdHJpbmcobik7dHJ5e3ZhciBpPUFycmF5LmlzQXJyYXkodCksbz1BcnJheS5pc0FycmF5KG4pO2lmKGkmJm8pcmV0dXJuIHQubGVuZ3RoPT09bi5sZW5ndGgmJnQuZXZlcnkoZnVuY3Rpb24oZSx0KXtyZXR1cm4gUChlLG5bdF0pfSk7aWYodCBpbnN0YW5jZW9mIERhdGUmJm4gaW5zdGFuY2VvZiBEYXRlKXJldHVybiB0LmdldFRpbWUoKT09PW4uZ2V0VGltZSgpO2lmKGl8fG8pcmV0dXJuITE7dmFyIGE9T2JqZWN0LmtleXModCkscz1PYmplY3Qua2V5cyhuKTtyZXR1cm4gYS5sZW5ndGg9PT1zLmxlbmd0aCYmYS5ldmVyeShmdW5jdGlvbihlKXtyZXR1cm4gUCh0W2VdLG5bZV0pfSl9Y2F0Y2goZSl7cmV0dXJuITF9fWZ1bmN0aW9uIE0oZSx0KXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylpZihQKGVbbl0sdCkpcmV0dXJuIG47cmV0dXJuLTF9ZnVuY3Rpb24gaihlKXt2YXIgdD0hMTtyZXR1cm4gZnVuY3Rpb24oKXt0fHwodD0hMCxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fXZhciBMPSJkYXRhLXNlcnZlci1yZW5kZXJlZCIsQj1bImNvbXBvbmVudCIsImRpcmVjdGl2ZSIsImZpbHRlciJdLE49WyJiZWZvcmVDcmVhdGUiLCJjcmVhdGVkIiwiYmVmb3JlTW91bnQiLCJtb3VudGVkIiwiYmVmb3JlVXBkYXRlIiwidXBkYXRlZCIsImJlZm9yZURlc3Ryb3kiLCJkZXN0cm95ZWQiLCJhY3RpdmF0ZWQiLCJkZWFjdGl2YXRlZCIsImVycm9yQ2FwdHVyZWQiLCJzZXJ2ZXJQcmVmZXRjaCJdLEQ9e29wdGlvbk1lcmdlU3RyYXRlZ2llczpPYmplY3QuY3JlYXRlKG51bGwpLHNpbGVudDohMSxwcm9kdWN0aW9uVGlwOiExLGRldnRvb2xzOiExLHBlcmZvcm1hbmNlOiExLGVycm9ySGFuZGxlcjpudWxsLHdhcm5IYW5kbGVyOm51bGwsaWdub3JlZEVsZW1lbnRzOltdLGtleUNvZGVzOk9iamVjdC5jcmVhdGUobnVsbCksaXNSZXNlcnZlZFRhZzpPLGlzUmVzZXJ2ZWRBdHRyOk8saXNVbmtub3duRWxlbWVudDpPLGdldFRhZ05hbWVzcGFjZTpULHBhcnNlUGxhdGZvcm1UYWdOYW1lOiQsbXVzdFVzZVByb3A6Tyxhc3luYzohMCxfbGlmZWN5Y2xlSG9va3M6Tn07ZnVuY3Rpb24gUihlLHQsbixyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpuLGVudW1lcmFibGU6ISFyLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pfXZhciBGPW5ldyBSZWdFeHAoIlteIisvYS16QS1aXHUwMEI3XHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMzdEXHUwMzdGLVx1MUZGRlx1MjAwQy1cdTIwMERcdTIwM0YtXHUyMDQwXHUyMDcwLVx1MjE4Rlx1MkMwMC1cdTJGRUZcdTMwMDEtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRkQvLnNvdXJjZSsiLiRfXFxkXSIpO3ZhciB6LFY9Il9fcHJvdG9fXyJpbnt9LFU9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cscT0idW5kZWZpbmVkIiE9dHlwZW9mIFdYRW52aXJvbm1lbnQmJiEhV1hFbnZpcm9ubWVudC5wbGF0Zm9ybSxXPXEmJldYRW52aXJvbm1lbnQucGxhdGZvcm0udG9Mb3dlckNhc2UoKSxIPVUmJndpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCksRz1IJiYvbXNpZXx0cmlkZW50Ly50ZXN0KEgpLFg9KEgmJkguaW5kZXhPZigibXNpZSA5LjAiKSxIJiYwPEguaW5kZXhPZigiZWRnZS8iKSksWT0oSCYmSC5pbmRleE9mKCJhbmRyb2lkIiksSCYmL2lwaG9uZXxpcGFkfGlwb2R8aW9zLy50ZXN0KEgpLEgmJi9jaHJvbWVcL1xkKy8udGVzdChIKSxIJiYvcGhhbnRvbWpzLy50ZXN0KEgpLEgmJkgubWF0Y2goL2ZpcmVmb3hcLyhcZCspLykse30ud2F0Y2gpO2lmKFUpdHJ5e3ZhciBKPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShKLCJwYXNzaXZlIix7Z2V0OmZ1bmN0aW9uKCl7fX0pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0LXBhc3NpdmUiLG51bGwsSil9Y2F0Y2goZSl7fXZhciBLPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PXomJih6PSFVJiYhcSYmdm9pZCAwIT09Z2xvYmFsJiYoZ2xvYmFsLnByb2Nlc3MmJiJzZXJ2ZXIiPT09Z2xvYmFsLnByb2Nlc3MuZW52LlZVRV9FTlYpKSx6fSxaPVUmJndpbmRvdy5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fO2Z1bmN0aW9uIFEoZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUmJi9uYXRpdmUgY29kZS8udGVzdChlLnRvU3RyaW5nKCkpfXZhciBlZSx0ZT0idW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmUShTeW1ib2wpJiYidW5kZWZpbmVkIiE9dHlwZW9mIFJlZmxlY3QmJlEoUmVmbGVjdC5vd25LZXlzKTtlZT0idW5kZWZpbmVkIiE9dHlwZW9mIFNldCYmUShTZXQpP1NldDpmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt0aGlzLnNldD1PYmplY3QuY3JlYXRlKG51bGwpfXJldHVybiBlLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24oZSl7cmV0dXJuITA9PT10aGlzLnNldFtlXX0sZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGUpe3RoaXMuc2V0W2VdPSEwfSxlLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuc2V0PU9iamVjdC5jcmVhdGUobnVsbCl9LGV9KCk7dmFyIG5lPVQscmU9MCxpZT1mdW5jdGlvbigpe3RoaXMuaWQ9dm9pZCAwIT09dD90LnVpZCsrOnJlKyssdGhpcy5zdWJzPVtdfTtmdW5jdGlvbiBvZShlKXtpZS5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2sucHVzaChlKSxpZS5TaGFyZWRPYmplY3QudGFyZ2V0PWV9ZnVuY3Rpb24gYWUoKXtpZS5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2sucG9wKCksaWUuU2hhcmVkT2JqZWN0LnRhcmdldD1pZS5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2tbaWUuU2hhcmVkT2JqZWN0LnRhcmdldFN0YWNrLmxlbmd0aC0xXX1pZS5wcm90b3R5cGUuYWRkU3ViPWZ1bmN0aW9uKGUpe3RoaXMuc3Vicy5wdXNoKGUpfSxpZS5wcm90b3R5cGUucmVtb3ZlU3ViPWZ1bmN0aW9uKGUpe2IodGhpcy5zdWJzLGUpfSxpZS5wcm90b3R5cGUuZGVwZW5kPWZ1bmN0aW9uKCl7aWUuU2hhcmVkT2JqZWN0LnRhcmdldCYmaWUuU2hhcmVkT2JqZWN0LnRhcmdldC5hZGREZXAodGhpcyl9LGllLnByb3RvdHlwZS5ub3RpZnk9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5zdWJzLnNsaWNlKCksdD0wLG49ZS5sZW5ndGg7dDxuO3QrKyllW3RdLnVwZGF0ZSgpfSxpZS5TaGFyZWRPYmplY3Q9dm9pZCAwIT09dD90Ont9LGllLlNoYXJlZE9iamVjdC50YXJnZXQ9bnVsbCxpZS5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2s9W107dmFyIHNlPWZ1bmN0aW9uKGUsdCxuLHIsaSxvLGEscyl7dGhpcy50YWc9ZSx0aGlzLmRhdGE9dCx0aGlzLmNoaWxkcmVuPW4sdGhpcy50ZXh0PXIsdGhpcy5lbG09aSx0aGlzLm5zPXZvaWQgMCx0aGlzLmNvbnRleHQ9byx0aGlzLmZuQ29udGV4dD12b2lkIDAsdGhpcy5mbk9wdGlvbnM9dm9pZCAwLHRoaXMuZm5TY29wZUlkPXZvaWQgMCx0aGlzLmtleT10JiZ0LmtleSx0aGlzLmNvbXBvbmVudE9wdGlvbnM9YSx0aGlzLmNvbXBvbmVudEluc3RhbmNlPXZvaWQgMCx0aGlzLnBhcmVudD12b2lkIDAsdGhpcy5yYXc9ITEsdGhpcy5pc1N0YXRpYz0hMSx0aGlzLmlzUm9vdEluc2VydD0hMCx0aGlzLmlzQ29tbWVudD0hMSx0aGlzLmlzQ2xvbmVkPSExLHRoaXMuaXNPbmNlPSExLHRoaXMuYXN5bmNGYWN0b3J5PXMsdGhpcy5hc3luY01ldGE9dm9pZCAwLHRoaXMuaXNBc3luY1BsYWNlaG9sZGVyPSExfSxjZT17Y2hpbGQ6e2NvbmZpZ3VyYWJsZTohMH19O2NlLmNoaWxkLmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbXBvbmVudEluc3RhbmNlfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhzZS5wcm90b3R5cGUsY2UpO3ZhciB1ZT1mdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT0iIik7dmFyIHQ9bmV3IHNlO3JldHVybiB0LnRleHQ9ZSx0LmlzQ29tbWVudD0hMCx0fTtmdW5jdGlvbiBsZShlKXtyZXR1cm4gbmV3IHNlKHZvaWQgMCx2b2lkIDAsdm9pZCAwLFN0cmluZyhlKSl9ZnVuY3Rpb24gZGUoZSl7dmFyIHQ9bmV3IHNlKGUudGFnLGUuZGF0YSxlLmNoaWxkcmVuJiZlLmNoaWxkcmVuLnNsaWNlKCksZS50ZXh0LGUuZWxtLGUuY29udGV4dCxlLmNvbXBvbmVudE9wdGlvbnMsZS5hc3luY0ZhY3RvcnkpO3JldHVybiB0Lm5zPWUubnMsdC5pc1N0YXRpYz1lLmlzU3RhdGljLHQua2V5PWUua2V5LHQuaXNDb21tZW50PWUuaXNDb21tZW50LHQuZm5Db250ZXh0PWUuZm5Db250ZXh0LHQuZm5PcHRpb25zPWUuZm5PcHRpb25zLHQuZm5TY29wZUlkPWUuZm5TY29wZUlkLHQuYXN5bmNNZXRhPWUuYXN5bmNNZXRhLHQuaXNDbG9uZWQ9ITAsdH12YXIgZmU9QXJyYXkucHJvdG90eXBlLHBlPU9iamVjdC5jcmVhdGUoZmUpO1sicHVzaCIsInBvcCIsInNoaWZ0IiwidW5zaGlmdCIsInNwbGljZSIsInNvcnQiLCJyZXZlcnNlIl0uZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgcz1mZVthXTtSKHBlLGEsZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoO24tLTspdFtuXT1lW25dO3ZhciByLGk9cy5hcHBseSh0aGlzLHQpLG89dGhpcy5fX29iX187c3dpdGNoKGEpe2Nhc2UicHVzaCI6Y2FzZSJ1bnNoaWZ0IjpyPXQ7YnJlYWs7Y2FzZSJzcGxpY2UiOnI9dC5zbGljZSgyKX1yZXR1cm4gciYmby5vYnNlcnZlQXJyYXkociksby5kZXAubm90aWZ5KCksaX0pfSk7dmFyIGhlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHBlKSx2ZT0hMDtmdW5jdGlvbiBnZShlKXt2ZT1lfXZhciBtZT1mdW5jdGlvbihlKXt2YXIgdDt0aGlzLnZhbHVlPWUsdGhpcy5kZXA9bmV3IGllLHRoaXMudm1Db3VudD0wLFIoZSwiX19vYl9fIix0aGlzKSxBcnJheS5pc0FycmF5KGUpPyhWPyh0PXBlLGUuX19wcm90b19fPXQpOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9MCxpPW4ubGVuZ3RoO3I8aTtyKyspe3ZhciBvPW5bcl07UihlLG8sdFtvXSl9fShlLHBlLGhlKSx0aGlzLm9ic2VydmVBcnJheShlKSk6dGhpcy53YWxrKGUpfTtmdW5jdGlvbiB5ZShlLHQpe3ZhciBuO2lmKHkoZSkmJiEoZSBpbnN0YW5jZW9mIHNlKSlyZXR1cm4gZChlLCJfX29iX18iKSYmZS5fX29iX18gaW5zdGFuY2VvZiBtZT9uPWUuX19vYl9fOnZlJiYhSygpJiYoQXJyYXkuaXNBcnJheShlKXx8dShlKSkmJk9iamVjdC5pc0V4dGVuc2libGUoZSkmJiFlLl9pc1Z1ZSYmKG49bmV3IG1lKGUpKSx0JiZuJiZuLnZtQ291bnQrKyxufWZ1bmN0aW9uIF9lKG4sZSxyLHQsaSl7dmFyIG89bmV3IGllLGE9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpO2lmKCFhfHwhMSE9PWEuY29uZmlndXJhYmxlKXt2YXIgcz1hJiZhLmdldCxjPWEmJmEuc2V0O3MmJiFjfHwyIT09YXJndW1lbnRzLmxlbmd0aHx8KHI9bltlXSk7dmFyIHU9IWkmJnllKHIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3ZhciBlPXM/cy5jYWxsKG4pOnI7cmV0dXJuIGllLlNoYXJlZE9iamVjdC50YXJnZXQmJihvLmRlcGVuZCgpLHUmJih1LmRlcC5kZXBlbmQoKSxBcnJheS5pc0FycmF5KGUpJiZmdW5jdGlvbiBlKHQpe2Zvcih2YXIgbj12b2lkIDAscj0wLGk9dC5sZW5ndGg7cjxpO3IrKykobj10W3JdKSYmbi5fX29iX18mJm4uX19vYl9fLmRlcC5kZXBlbmQoKSxBcnJheS5pc0FycmF5KG4pJiZlKG4pfShlKSkpLGV9LHNldDpmdW5jdGlvbihlKXt2YXIgdD1zP3MuY2FsbChuKTpyO2U9PT10fHxlIT1lJiZ0IT10fHxzJiYhY3x8KGM/Yy5jYWxsKG4sZSk6cj1lLHU9IWkmJnllKGUpLG8ubm90aWZ5KCkpfX0pfX1mdW5jdGlvbiBiZShlLHQsbil7aWYoQXJyYXkuaXNBcnJheShlKSYmaSh0KSlyZXR1cm4gZS5sZW5ndGg9TWF0aC5tYXgoZS5sZW5ndGgsdCksZS5zcGxpY2UodCwxLG4pLG47aWYodCBpbiBlJiYhKHQgaW4gT2JqZWN0LnByb3RvdHlwZSkpcmV0dXJuIGVbdF09bjt2YXIgcj1lLl9fb2JfXztyZXR1cm4gZS5faXNWdWV8fHImJnIudm1Db3VudD9uOnI/KF9lKHIudmFsdWUsdCxuKSxyLmRlcC5ub3RpZnkoKSxuKTplW3RdPW59ZnVuY3Rpb24gd2UoZSx0KXtpZihBcnJheS5pc0FycmF5KGUpJiZpKHQpKWUuc3BsaWNlKHQsMSk7ZWxzZXt2YXIgbj1lLl9fb2JfXztlLl9pc1Z1ZXx8biYmbi52bUNvdW50fHxkKGUsdCkmJihkZWxldGUgZVt0XSxuJiZuLmRlcC5ub3RpZnkoKSl9fW1lLnByb3RvdHlwZS53YWxrPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDtuKyspX2UoZSx0W25dKX0sbWUucHJvdG90eXBlLm9ic2VydmVBcnJheT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspeWUoZVt0XSl9O3ZhciBrZT1ELm9wdGlvbk1lcmdlU3RyYXRlZ2llcztmdW5jdGlvbiBTZShlLHQpe2lmKCF0KXJldHVybiBlO2Zvcih2YXIgbixyLGksbz10ZT9SZWZsZWN0Lm93bktleXModCk6T2JqZWN0LmtleXModCksYT0wO2E8by5sZW5ndGg7YSsrKSJfX29iX18iIT09KG49b1thXSkmJihyPWVbbl0saT10W25dLGQoZSxuKT9yIT09aSYmdShyKSYmdShpKSYmU2UocixpKTpiZShlLG4saSkpO3JldHVybiBlfWZ1bmN0aW9uIHhlKG4scixpKXtyZXR1cm4gaT9mdW5jdGlvbigpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiByP3IuY2FsbChpLGkpOnIsdD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmNhbGwoaSxpKTpuO3JldHVybiBlP1NlKGUsdCk6dH06cj9uP2Z1bmN0aW9uKCl7cmV0dXJuIFNlKCJmdW5jdGlvbiI9PXR5cGVvZiByP3IuY2FsbCh0aGlzLHRoaXMpOnIsImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5jYWxsKHRoaXMsdGhpcyk6bil9OnI6bn1mdW5jdGlvbiBDZShlLHQpe3ZhciBuPXQ/ZT9lLmNvbmNhdCh0KTpBcnJheS5pc0FycmF5KHQpP3Q6W3RdOmU7cmV0dXJuIG4/ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoO24rKyktMT09PXQuaW5kZXhPZihlW25dKSYmdC5wdXNoKGVbbl0pO3JldHVybiB0fShuKTpufWZ1bmN0aW9uIFRlKGUsdCxuLHIpe3ZhciBpPU9iamVjdC5jcmVhdGUoZXx8bnVsbCk7cmV0dXJuIHQ/eChpLHQpOml9a2UuZGF0YT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4/eGUoZSx0LG4pOnQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6eGUoZSx0KX0sTi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2tlW2VdPUNlfSksQi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2tlW2UrInMiXT1UZX0pLGtlLndhdGNoPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9PT1ZJiYoZT12b2lkIDApLHQ9PT1ZJiYodD12b2lkIDApLCF0KXJldHVybiBPYmplY3QuY3JlYXRlKGV8fG51bGwpO2lmKCFlKXJldHVybiB0O3ZhciBpPXt9O2Zvcih2YXIgbyBpbiB4KGksZSksdCl7dmFyIGE9aVtvXSxzPXRbb107YSYmIUFycmF5LmlzQXJyYXkoYSkmJihhPVthXSksaVtvXT1hP2EuY29uY2F0KHMpOkFycmF5LmlzQXJyYXkocyk/czpbc119cmV0dXJuIGl9LGtlLnByb3BzPWtlLm1ldGhvZHM9a2UuaW5qZWN0PWtlLmNvbXB1dGVkPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKCFlKXJldHVybiB0O3ZhciBpPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIHgoaSxlKSx0JiZ4KGksdCksaX0sa2UucHJvdmlkZT14ZTt2YXIgT2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dD9lOnR9O2Z1bmN0aW9uIEVlKG4scixpKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgciYmKHI9ci5vcHRpb25zKSxmdW5jdGlvbihlLHQpe3ZhciBuPWUucHJvcHM7aWYobil7dmFyIHIsaSxvPXt9O2lmKEFycmF5LmlzQXJyYXkobikpZm9yKHI9bi5sZW5ndGg7ci0tOykic3RyaW5nIj09dHlwZW9mKGk9bltyXSkmJihvW2goaSldPXt0eXBlOm51bGx9KTtlbHNlIGlmKHUobikpZm9yKHZhciBhIGluIG4paT1uW2FdLG9baChhKV09dShpKT9pOnt0eXBlOml9O2UucHJvcHM9b319KHIpLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5pbmplY3Q7aWYobil7dmFyIHI9ZS5pbmplY3Q9e307aWYoQXJyYXkuaXNBcnJheShuKSlmb3IodmFyIGk9MDtpPG4ubGVuZ3RoO2krKylyW25baV1dPXtmcm9tOm5baV19O2Vsc2UgaWYodShuKSlmb3IodmFyIG8gaW4gbil7dmFyIGE9bltvXTtyW29dPXUoYSk/eCh7ZnJvbTpvfSxhKTp7ZnJvbTphfX19fShyKSxmdW5jdGlvbihlKXt2YXIgdD1lLmRpcmVjdGl2ZXM7aWYodClmb3IodmFyIG4gaW4gdCl7dmFyIHI9dFtuXTsiZnVuY3Rpb24iPT10eXBlb2YgciYmKHRbbl09e2JpbmQ6cix1cGRhdGU6cn0pfX0ociksIXIuX2Jhc2UmJihyLmV4dGVuZHMmJihuPUVlKG4sci5leHRlbmRzLGkpKSxyLm1peGlucykpZm9yKHZhciBlPTAsdD1yLm1peGlucy5sZW5ndGg7ZTx0O2UrKyluPUVlKG4sci5taXhpbnNbZV0saSk7dmFyIG8sYT17fTtmb3IobyBpbiBuKXMobyk7Zm9yKG8gaW4gcilkKG4sbyl8fHMobyk7ZnVuY3Rpb24gcyhlKXt2YXIgdD1rZVtlXXx8T2U7YVtlXT10KG5bZV0scltlXSxpLGUpfXJldHVybiBhfWZ1bmN0aW9uIEllKGUsdCxuLHIpe2lmKCJzdHJpbmciPT10eXBlb2Ygbil7dmFyIGk9ZVt0XTtpZihkKGksbikpcmV0dXJuIGlbbl07dmFyIG89aChuKTtpZihkKGksbykpcmV0dXJuIGlbb107dmFyIGE9dihvKTtyZXR1cm4gZChpLGEpP2lbYV06aVtuXXx8aVtvXXx8aVthXX19ZnVuY3Rpb24gQWUoZSx0LG4scil7dmFyIGk9dFtlXSxvPSFkKG4sZSksYT1uW2VdLHM9TWUoQm9vbGVhbixpLnR5cGUpO2lmKC0xPHMpaWYobyYmIWQoaSwiZGVmYXVsdCIpKWE9ITE7ZWxzZSBpZigiIj09PWF8fGE9PT13KGUpKXt2YXIgYz1NZShTdHJpbmcsaS50eXBlKTsoYzwwfHxzPGMpJiYoYT0hMCl9aWYodm9pZCAwPT09YSl7YT1mdW5jdGlvbihlLHQsbil7aWYoIWQodCwiZGVmYXVsdCIpKXJldHVybjt2YXIgcj10LmRlZmF1bHQ7aWYoZSYmZS4kb3B0aW9ucy5wcm9wc0RhdGEmJnZvaWQgMD09PWUuJG9wdGlvbnMucHJvcHNEYXRhW25dJiZ2b2lkIDAhPT1lLl9wcm9wc1tuXSlyZXR1cm4gZS5fcHJvcHNbbl07cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHImJiJGdW5jdGlvbiIhPT0kZSh0LnR5cGUpP3IuY2FsbChlKTpyfShyLGksZSk7dmFyIHU9dmU7Z2UoITApLHllKGEpLGdlKHUpfXJldHVybiBhfWZ1bmN0aW9uICRlKGUpe3ZhciB0PWUmJmUudG9TdHJpbmcoKS5tYXRjaCgvXlxzKmZ1bmN0aW9uIChcdyspLyk7cmV0dXJuIHQ/dFsxXToiIn1mdW5jdGlvbiBQZShlLHQpe3JldHVybiAkZShlKT09PSRlKHQpfWZ1bmN0aW9uIE1lKGUsdCl7aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIFBlKHQsZSk/MDotMTtmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjtuKyspaWYoUGUodFtuXSxlKSlyZXR1cm4gbjtyZXR1cm4tMX1mdW5jdGlvbiBqZShlLHQsbil7b2UoKTt0cnl7aWYodClmb3IodmFyIHI9dDtyPXIuJHBhcmVudDspe3ZhciBpPXIuJG9wdGlvbnMuZXJyb3JDYXB0dXJlZDtpZihpKWZvcih2YXIgbz0wO288aS5sZW5ndGg7bysrKXRyeXtpZighMT09PWlbb10uY2FsbChyLGUsdCxuKSlyZXR1cm59Y2F0Y2goZSl7QmUoZSxyLCJlcnJvckNhcHR1cmVkIGhvb2siKX19QmUoZSx0LG4pfWZpbmFsbHl7YWUoKX19ZnVuY3Rpb24gTGUoZSx0LG4scixpKXt2YXIgbzt0cnl7KG89bj9lLmFwcGx5KHQsbik6ZS5jYWxsKHQpKSYmIW8uX2lzVnVlJiZfKG8pJiYhby5faGFuZGxlZCYmKG8uY2F0Y2goZnVuY3Rpb24oZSl7cmV0dXJuIGplKGUscixpKyIgKFByb21pc2UvYXN5bmMpIil9KSxvLl9oYW5kbGVkPSEwKX1jYXRjaChlKXtqZShlLHIsaSl9cmV0dXJuIG99ZnVuY3Rpb24gQmUodCxlLG4pe2lmKEQuZXJyb3JIYW5kbGVyKXRyeXtyZXR1cm4gRC5lcnJvckhhbmRsZXIuY2FsbChudWxsLHQsZSxuKX1jYXRjaChlKXtlIT09dCYmTmUoZSxudWxsLCJjb25maWcuZXJyb3JIYW5kbGVyIil9TmUodCxlLG4pfWZ1bmN0aW9uIE5lKGUsdCxuKXtpZighVSYmIXF8fCJ1bmRlZmluZWQiPT10eXBlb2YgY29uc29sZSl0aHJvdyBlO2NvbnNvbGUuZXJyb3IoZSl9dmFyIERlPVtdLFJlPSExO2Z1bmN0aW9uIEZlKCl7UmU9ITE7Zm9yKHZhciBlPURlLnNsaWNlKDApLHQ9RGUubGVuZ3RoPTA7dDxlLmxlbmd0aDt0KyspZVt0XSgpfXZhciB6ZT1mdW5jdGlvbigpe3NldFRpbWVvdXQoRmUsMCl9O2Z1bmN0aW9uIFZlKGUsdCl7dmFyIG47aWYoRGUucHVzaChmdW5jdGlvbigpe2lmKGUpdHJ5e2UuY2FsbCh0KX1jYXRjaChlKXtqZShlLHQsIm5leHRUaWNrIil9ZWxzZSBuJiZuKHQpfSksUmV8fChSZT0hMCx6ZSgpKSwhZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBQcm9taXNlKXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlKXtuPWV9KX12YXIgVWU9bmV3IGVlO2Z1bmN0aW9uIHFlKGUpeyFmdW5jdGlvbiBlKHQsbil7dmFyIHIsaTt2YXIgbz1BcnJheS5pc0FycmF5KHQpO2lmKCFvJiYheSh0KXx8T2JqZWN0LmlzRnJvemVuKHQpfHx0IGluc3RhbmNlb2Ygc2UpcmV0dXJuO2lmKHQuX19vYl9fKXt2YXIgYT10Ll9fb2JfXy5kZXAuaWQ7aWYobi5oYXMoYSkpcmV0dXJuO24uYWRkKGEpfWlmKG8pZm9yKHI9dC5sZW5ndGg7ci0tOyllKHRbcl0sbik7ZWxzZSBmb3IoaT1PYmplY3Qua2V5cyh0KSxyPWkubGVuZ3RoO3ItLTspZSh0W2lbcl1dLG4pfShlLFVlKSxVZS5jbGVhcigpfXZhciBXZT1mKGZ1bmN0aW9uKGUpe3ZhciB0PSImIj09PWUuY2hhckF0KDApLG49In4iPT09KGU9dD9lLnNsaWNlKDEpOmUpLmNoYXJBdCgwKSxyPSIhIj09PShlPW4/ZS5zbGljZSgxKTplKS5jaGFyQXQoMCk7cmV0dXJue25hbWU6ZT1yP2Uuc2xpY2UoMSk6ZSxvbmNlOm4sY2FwdHVyZTpyLHBhc3NpdmU6dH19KTtmdW5jdGlvbiBIZShlLGkpe2Z1bmN0aW9uIG8oKXt2YXIgZT1hcmd1bWVudHMsdD1vLmZucztpZighQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gTGUodCxudWxsLGFyZ3VtZW50cyxpLCJ2LW9uIGhhbmRsZXIiKTtmb3IodmFyIG49dC5zbGljZSgpLHI9MDtyPG4ubGVuZ3RoO3IrKylMZShuW3JdLG51bGwsZSxpLCJ2LW9uIGhhbmRsZXIiKX1yZXR1cm4gby5mbnM9ZSxvfWZ1bmN0aW9uIEdlKGUsdCxuLHIsaSxvKXt2YXIgYSxzLGMsdTtmb3IoYSBpbiBlKXM9ZVthXSxjPXRbYV0sdT1XZShhKSxFKHMpfHwoRShjKT8oRShzLmZucykmJihzPWVbYV09SGUocyxvKSksQSh1Lm9uY2UpJiYocz1lW2FdPWkodS5uYW1lLHMsdS5jYXB0dXJlKSksbih1Lm5hbWUscyx1LmNhcHR1cmUsdS5wYXNzaXZlLHUucGFyYW1zKSk6cyE9PWMmJihjLmZucz1zLGVbYV09YykpO2ZvcihhIGluIHQpRShlW2FdKSYmcigodT1XZShhKSkubmFtZSx0W2FdLHUuY2FwdHVyZSl9ZnVuY3Rpb24gWGUoZSx0LG4pe3ZhciByO2UgaW5zdGFuY2VvZiBzZSYmKGU9ZS5kYXRhLmhvb2t8fChlLmRhdGEuaG9vaz17fSkpO3ZhciBpPWVbdF07ZnVuY3Rpb24gbygpe24uYXBwbHkodGhpcyxhcmd1bWVudHMpLGIoci5mbnMsbyl9RShpKT9yPUhlKFtvXSk6SShpLmZucykmJkEoaS5tZXJnZWQpPyhyPWkpLmZucy5wdXNoKG8pOnI9SGUoW2ksb10pLHIubWVyZ2VkPSEwLGVbdF09cn1mdW5jdGlvbiBZZShlLHQsbixyKXt2YXIgaT10Lm9wdGlvbnMubXBPcHRpb25zJiZ0Lm9wdGlvbnMubXBPcHRpb25zLnByb3BlcnRpZXM7aWYoRShpKSlyZXR1cm4gbjt2YXIgbz10Lm9wdGlvbnMubXBPcHRpb25zLmV4dGVybmFsQ2xhc3Nlc3x8W10sYT1lLmF0dHJzLHM9ZS5wcm9wcztpZihJKGEpfHxJKHMpKWZvcih2YXIgYyBpbiBpKXt2YXIgdT13KGMpOyhKZShuLHMsYyx1LCEwKXx8SmUobixhLGMsdSwhMSkpJiZuW2NdJiYtMSE9PW8uaW5kZXhPZih1KSYmcltoKG5bY10pXSYmKG5bY109cltoKG5bY10pXSl9cmV0dXJuIG59ZnVuY3Rpb24gSmUoZSx0LG4scixpKXtpZihJKHQpKXtpZihkKHQsbikpcmV0dXJuIGVbbl09dFtuXSxpfHxkZWxldGUgdFtuXSwhMDtpZihkKHQscikpcmV0dXJuIGVbbl09dFtyXSxpfHxkZWxldGUgdFtyXSwhMH1yZXR1cm4hMX1mdW5jdGlvbiBLZShlKXtyZXR1cm4gYyhlKT9bbGUoZSldOkFycmF5LmlzQXJyYXkoZSk/ZnVuY3Rpb24gZSh0LG4pe3ZhciByPVtdO3ZhciBpLG8sYSxzO2ZvcihpPTA7aTx0Lmxlbmd0aDtpKyspRShvPXRbaV0pfHwiYm9vbGVhbiI9PXR5cGVvZiBvfHwoYT1yLmxlbmd0aC0xLHM9clthXSxBcnJheS5pc0FycmF5KG8pPzA8by5sZW5ndGgmJihaZSgobz1lKG8sKG58fCIiKSsiXyIraSkpWzBdKSYmWmUocykmJihyW2FdPWxlKHMudGV4dCtvWzBdLnRleHQpLG8uc2hpZnQoKSksci5wdXNoLmFwcGx5KHIsbykpOmMobyk/WmUocyk/clthXT1sZShzLnRleHQrbyk6IiIhPT1vJiZyLnB1c2gobGUobykpOlplKG8pJiZaZShzKT9yW2FdPWxlKHMudGV4dCtvLnRleHQpOihBKHQuX2lzVkxpc3QpJiZJKG8udGFnKSYmRShvLmtleSkmJkkobikmJihvLmtleT0iX192bGlzdCIrbisiXyIraSsiX18iKSxyLnB1c2gobykpKTtyZXR1cm4gcn0oZSk6dm9pZCAwfWZ1bmN0aW9uIFplKGUpe3JldHVybiBJKGUpJiZJKGUudGV4dCkmJiExPT09ZS5pc0NvbW1lbnR9ZnVuY3Rpb24gUWUoZSx0KXtpZihlKXtmb3IodmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPXRlP1JlZmxlY3Qub3duS2V5cyhlKTpPYmplY3Qua2V5cyhlKSxpPTA7aTxyLmxlbmd0aDtpKyspe3ZhciBvPXJbaV07aWYoIl9fb2JfXyIhPT1vKXtmb3IodmFyIGE9ZVtvXS5mcm9tLHM9dDtzOyl7aWYocy5fcHJvdmlkZWQmJmQocy5fcHJvdmlkZWQsYSkpe25bb109cy5fcHJvdmlkZWRbYV07YnJlYWt9cz1zLiRwYXJlbnR9aWYoIXMmJiJkZWZhdWx0ImluIGVbb10pe3ZhciBjPWVbb10uZGVmYXVsdDtuW29dPSJmdW5jdGlvbiI9PXR5cGVvZiBjP2MuY2FsbCh0KTpjfX19cmV0dXJuIG59fWZ1bmN0aW9uIGV0KGUsdCl7aWYoIWV8fCFlLmxlbmd0aClyZXR1cm57fTtmb3IodmFyIG49e30scj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyl7dmFyIG89ZVtyXSxhPW8uZGF0YTtpZihhJiZhLmF0dHJzJiZhLmF0dHJzLnNsb3QmJmRlbGV0ZSBhLmF0dHJzLnNsb3Qsby5jb250ZXh0IT09dCYmby5mbkNvbnRleHQhPT10fHwhYXx8bnVsbD09YS5zbG90KShuLmRlZmF1bHR8fChuLmRlZmF1bHQ9W10pKS5wdXNoKG8pO2Vsc2V7dmFyIHM9YS5zbG90LGM9bltzXXx8KG5bc109W10pOyJ0ZW1wbGF0ZSI9PT1vLnRhZz9jLnB1c2guYXBwbHkoYyxvLmNoaWxkcmVufHxbXSk6Yy5wdXNoKG8pfX1mb3IodmFyIHUgaW4gbiluW3VdLmV2ZXJ5KHR0KSYmZGVsZXRlIG5bdV07cmV0dXJuIG59ZnVuY3Rpb24gdHQoZSl7cmV0dXJuIGUuaXNDb21tZW50JiYhZS5hc3luY0ZhY3Rvcnl8fCIgIj09PWUudGV4dH1mdW5jdGlvbiBudChlLHQsbil7dmFyIHIsaT0wPE9iamVjdC5rZXlzKHQpLmxlbmd0aCxvPWU/ISFlLiRzdGFibGU6IWksYT1lJiZlLiRrZXk7aWYoZSl7aWYoZS5fbm9ybWFsaXplZClyZXR1cm4gZS5fbm9ybWFsaXplZDtpZihvJiZuJiZuIT09bSYmYT09PW4uJGtleSYmIWkmJiFuLiRoYXNOb3JtYWwpcmV0dXJuIG47Zm9yKHZhciBzIGluIHI9e30sZSllW3NdJiYiJCIhPT1zWzBdJiYocltzXT1ydCh0LHMsZVtzXSkpfWVsc2Ugcj17fTtmb3IodmFyIGMgaW4gdCljIGluIHJ8fChyW2NdPWl0KHQsYykpO3JldHVybiBlJiZPYmplY3QuaXNFeHRlbnNpYmxlKGUpJiYoZS5fbm9ybWFsaXplZD1yKSxSKHIsIiRzdGFibGUiLG8pLFIociwiJGtleSIsYSksUihyLCIkaGFzTm9ybWFsIixpKSxyfWZ1bmN0aW9uIHJ0KGUsdCxuKXt2YXIgcj1mdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg/bi5hcHBseShudWxsLGFyZ3VtZW50cyk6bih7fSk7cmV0dXJuKGU9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYhQXJyYXkuaXNBcnJheShlKT9bZV06S2UoZSkpJiYoMD09PWUubGVuZ3RofHwxPT09ZS5sZW5ndGgmJmVbMF0uaXNDb21tZW50KT92b2lkIDA6ZX07cmV0dXJuIG4ucHJveHkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2dldDpyLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSkscn1mdW5jdGlvbiBpdChlLHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlW3RdfX1mdW5jdGlvbiBvdChlLHQpe3ZhciBuLHIsaSxvLGE7aWYoQXJyYXkuaXNBcnJheShlKXx8InN0cmluZyI9PXR5cGVvZiBlKWZvcihuPW5ldyBBcnJheShlLmxlbmd0aCkscj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyluW3JdPXQoZVtyXSxyLHIscik7ZWxzZSBpZigibnVtYmVyIj09dHlwZW9mIGUpZm9yKG49bmV3IEFycmF5KGUpLHI9MDtyPGU7cisrKW5bcl09dChyKzEscixyLHIpO2Vsc2UgaWYoeShlKSlpZih0ZSYmZVtTeW1ib2wuaXRlcmF0b3JdKXtuPVtdO3ZhciBzPWVbU3ltYm9sLml0ZXJhdG9yXSgpLGM9cy5uZXh0KCk7Zm9yKHI9MDshYy5kb25lOyluLnB1c2godChjLnZhbHVlLG4ubGVuZ3RoLHIscisrKSksYz1zLm5leHQoKX1lbHNlIGZvcihvPU9iamVjdC5rZXlzKGUpLG49bmV3IEFycmF5KG8ubGVuZ3RoKSxyPTAsaT1vLmxlbmd0aDtyPGk7cisrKWE9b1tyXSxuW3JdPXQoZVthXSxhLHIscik7cmV0dXJuIEkobil8fChuPVtdKSxuLl9pc1ZMaXN0PSEwLG59ZnVuY3Rpb24gYXQoZSx0LG4scil7dmFyIGksbz10aGlzLiRzY29wZWRTbG90c1tlXTtvPyhuPW58fHt9LHImJihuPXgoeCh7fSxyKSxuKSksaT1vKG4sdGhpcyxuLl9pKXx8dCk6aT10aGlzLiRzbG90c1tlXXx8dDt2YXIgYT1uJiZuLnNsb3Q7cmV0dXJuIGE/dGhpcy4kY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiLHtzbG90OmF9LGkpOml9ZnVuY3Rpb24gc3QoZSl7cmV0dXJuIEllKHRoaXMuJG9wdGlvbnMsImZpbHRlcnMiLGUpfHwkfWZ1bmN0aW9uIGN0KGUsdCl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/LTE9PT1lLmluZGV4T2YodCk6ZSE9PXR9ZnVuY3Rpb24gdXQoZSx0LG4scixpKXt2YXIgbz1ELmtleUNvZGVzW3RdfHxuO3JldHVybiBpJiZyJiYhRC5rZXlDb2Rlc1t0XT9jdChpLHIpOm8/Y3QobyxlKTpyP3cocikhPT10OnZvaWQgMH1mdW5jdGlvbiBsdChpLG8sYSxzLGMpe2lmKGEpaWYoeShhKSl7dmFyIHU7QXJyYXkuaXNBcnJheShhKSYmKGE9QyhhKSk7dmFyIGU9ZnVuY3Rpb24odCl7aWYoImNsYXNzIj09PXR8fCJzdHlsZSI9PT10fHxsKHQpKXU9aTtlbHNle3ZhciBlPWkuYXR0cnMmJmkuYXR0cnMudHlwZTt1PXN8fEQubXVzdFVzZVByb3AobyxlLHQpP2kuZG9tUHJvcHN8fChpLmRvbVByb3BzPXt9KTppLmF0dHJzfHwoaS5hdHRycz17fSl9dmFyIG49aCh0KSxyPXcodCk7biBpbiB1fHxyIGluIHV8fCh1W3RdPWFbdF0sYyYmKChpLm9ufHwoaS5vbj17fSkpWyJ1cGRhdGU6Iit0XT1mdW5jdGlvbihlKXthW3RdPWV9KSl9O2Zvcih2YXIgdCBpbiBhKWUodCl9ZWxzZTtyZXR1cm4gaX1mdW5jdGlvbiBkdChlLHQpe3ZhciBuPXRoaXMuX3N0YXRpY1RyZWVzfHwodGhpcy5fc3RhdGljVHJlZXM9W10pLHI9bltlXTtyZXR1cm4gciYmIXR8fHB0KHI9bltlXT10aGlzLiRvcHRpb25zLnN0YXRpY1JlbmRlckZuc1tlXS5jYWxsKHRoaXMuX3JlbmRlclByb3h5LG51bGwsdGhpcyksIl9fc3RhdGljX18iK2UsITEpLHJ9ZnVuY3Rpb24gZnQoZSx0LG4pe3JldHVybiBwdChlLCJfX29uY2VfXyIrdCsobj8iXyIrbjoiIiksITApLGV9ZnVuY3Rpb24gcHQoZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspZVtyXSYmInN0cmluZyIhPXR5cGVvZiBlW3JdJiZodChlW3JdLHQrIl8iK3Isbik7ZWxzZSBodChlLHQsbil9ZnVuY3Rpb24gaHQoZSx0LG4pe2UuaXNTdGF0aWM9ITAsZS5rZXk9dCxlLmlzT25jZT1ufWZ1bmN0aW9uIHZ0KGUsdCl7aWYodClpZih1KHQpKXt2YXIgbj1lLm9uPWUub24/eCh7fSxlLm9uKTp7fTtmb3IodmFyIHIgaW4gdCl7dmFyIGk9bltyXSxvPXRbcl07bltyXT1pP1tdLmNvbmNhdChpLG8pOm99fWVsc2U7cmV0dXJuIGV9ZnVuY3Rpb24gZ3QoZSx0LG4scil7dD10fHx7JHN0YWJsZTohbn07Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07QXJyYXkuaXNBcnJheShvKT9ndChvLHQsbik6byYmKG8ucHJveHkmJihvLmZuLnByb3h5PSEwKSx0W28ua2V5XT1vLmZuKX1yZXR1cm4gciYmKHQuJGtleT1yKSx0fWZ1bmN0aW9uIG10KGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKz0yKXt2YXIgcj10W25dOyJzdHJpbmciPT10eXBlb2YgciYmciYmKGVbdFtuXV09dFtuKzFdKX1yZXR1cm4gZX1mdW5jdGlvbiB5dChlLHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZT90K2U6ZX1mdW5jdGlvbiBfdChlKXtlLl9vPWZ0LGUuX249byxlLl9zPW4sZS5fbD1vdCxlLl90PWF0LGUuX3E9UCxlLl9pPU0sZS5fbT1kdCxlLl9mPXN0LGUuX2s9dXQsZS5fYj1sdCxlLl92PWxlLGUuX2U9dWUsZS5fdT1ndCxlLl9nPXZ0LGUuX2Q9bXQsZS5fcD15dH1mdW5jdGlvbiBidChlLHQsbixvLHIpe3ZhciBhLGk9dGhpcyxzPXIub3B0aW9ucztkKG8sIl91aWQiKT8oYT1PYmplY3QuY3JlYXRlKG8pKS5fb3JpZ2luYWw9bzpvPShhPW8pLl9vcmlnaW5hbDt2YXIgYz1BKHMuX2NvbXBpbGVkKSx1PSFjO3RoaXMuZGF0YT1lLHRoaXMucHJvcHM9dCx0aGlzLmNoaWxkcmVuPW4sdGhpcy5wYXJlbnQ9byx0aGlzLmxpc3RlbmVycz1lLm9ufHxtLHRoaXMuaW5qZWN0aW9ucz1RZShzLmluamVjdCxvKSx0aGlzLnNsb3RzPWZ1bmN0aW9uKCl7cmV0dXJuIGkuJHNsb3RzfHxudChlLnNjb3BlZFNsb3RzLGkuJHNsb3RzPWV0KG4sbykpLGkuJHNsb3RzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic2NvcGVkU2xvdHMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBudChlLnNjb3BlZFNsb3RzLHRoaXMuc2xvdHMoKSl9fSksYyYmKHRoaXMuJG9wdGlvbnM9cyx0aGlzLiRzbG90cz10aGlzLnNsb3RzKCksdGhpcy4kc2NvcGVkU2xvdHM9bnQoZS5zY29wZWRTbG90cyx0aGlzLiRzbG90cykpLHMuX3Njb3BlSWQ/dGhpcy5fYz1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT1JdChhLGUsdCxuLHIsdSk7cmV0dXJuIGkmJiFBcnJheS5pc0FycmF5KGkpJiYoaS5mblNjb3BlSWQ9cy5fc2NvcGVJZCxpLmZuQ29udGV4dD1vKSxpfTp0aGlzLl9jPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBJdChhLGUsdCxuLHIsdSl9fWZ1bmN0aW9uIHd0KGUsdCxuLHIsaSl7dmFyIG89ZGUoZSk7cmV0dXJuIG8uZm5Db250ZXh0PW4sby5mbk9wdGlvbnM9cix0LnNsb3QmJigoby5kYXRhfHwoby5kYXRhPXt9KSkuc2xvdD10LnNsb3QpLG99ZnVuY3Rpb24ga3QoZSx0KXtmb3IodmFyIG4gaW4gdCllW2gobildPXRbbl19X3QoYnQucHJvdG90eXBlKTt2YXIgU3Q9e2luaXQ6ZnVuY3Rpb24oZSx0KXtpZihlLmNvbXBvbmVudEluc3RhbmNlJiYhZS5jb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQmJmUuZGF0YS5rZWVwQWxpdmUpe3ZhciBuPWU7U3QucHJlcGF0Y2gobixuKX1lbHNleyhlLmNvbXBvbmVudEluc3RhbmNlPWZ1bmN0aW9uKGUsdCl7dmFyIG49e19pc0NvbXBvbmVudDohMCxfcGFyZW50Vm5vZGU6ZSxwYXJlbnQ6dH0scj1lLmRhdGEuaW5saW5lVGVtcGxhdGU7SShyKSYmKG4ucmVuZGVyPXIucmVuZGVyLG4uc3RhdGljUmVuZGVyRm5zPXIuc3RhdGljUmVuZGVyRm5zKTtyZXR1cm4gbmV3IGUuY29tcG9uZW50T3B0aW9ucy5DdG9yKG4pfShlLE50KSkuJG1vdW50KHQ/ZS5lbG06dm9pZCAwLHQpfX0scHJlcGF0Y2g6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmNvbXBvbmVudE9wdGlvbnM7IWZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG89ci5kYXRhLnNjb3BlZFNsb3RzLGE9ZS4kc2NvcGVkU2xvdHMscz0hIShvJiYhby4kc3RhYmxlfHxhIT09bSYmIWEuJHN0YWJsZXx8byYmZS4kc2NvcGVkU2xvdHMuJGtleSE9PW8uJGtleSksYz0hIShpfHxlLiRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbnx8cyk7ZS4kb3B0aW9ucy5fcGFyZW50Vm5vZGU9cixlLiR2bm9kZT1yLGUuX3Zub2RlJiYoZS5fdm5vZGUucGFyZW50PXIpO2lmKGUuJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuPWksZS4kYXR0cnM9ci5kYXRhLmF0dHJzfHxtLGUuJGxpc3RlbmVycz1ufHxtLHQmJmUuJG9wdGlvbnMucHJvcHMpe2dlKCExKTtmb3IodmFyIHU9ZS5fcHJvcHMsbD1lLiRvcHRpb25zLl9wcm9wS2V5c3x8W10sZD0wO2Q8bC5sZW5ndGg7ZCsrKXt2YXIgZj1sW2RdLHA9ZS4kb3B0aW9ucy5wcm9wczt1W2ZdPUFlKGYscCx0LGUpfWdlKCEwKSxlLiRvcHRpb25zLnByb3BzRGF0YT10fWUuXyR1cGRhdGVQcm9wZXJ0aWVzJiZlLl8kdXBkYXRlUHJvcGVydGllcyhlKSxuPW58fG07dmFyIGg9ZS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO2UuJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycz1uLEJ0KGUsbixoKSxjJiYoZS4kc2xvdHM9ZXQoaSxyLmNvbnRleHQpLGUuJGZvcmNlVXBkYXRlKCkpfSh0LmNvbXBvbmVudEluc3RhbmNlPWUuY29tcG9uZW50SW5zdGFuY2Usbi5wcm9wc0RhdGEsbi5saXN0ZW5lcnMsdCxuLmNoaWxkcmVuKX0saW5zZXJ0OmZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5jb250ZXh0LHI9ZS5jb21wb25lbnRJbnN0YW5jZTtyLl9pc01vdW50ZWR8fChyLl9pc01vdW50ZWQ9ITAsci5fJHZkPyhGdChyLCJvblNlcnZpY2VDcmVhdGVkIiksRnQociwib25TZXJ2aWNlQXR0YWNoZWQiKSxyLl8kdmQuYWRkTW91bnRlZFZtKHIpKTpGdChyLCJtb3VudGVkIikpLGUuZGF0YS5rZWVwQWxpdmUmJihuLl9pc01vdW50ZWQ/KCh0PXIpLl9pbmFjdGl2ZT0hMSxWdC5wdXNoKHQpKTpSdChyLCEwKSl9LGRlc3Ryb3k6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb21wb25lbnRJbnN0YW5jZTt0Ll9pc0Rlc3Ryb3llZHx8KGUuZGF0YS5rZWVwQWxpdmU/ZnVuY3Rpb24gZSh0LG4pe2lmKG4mJih0Ll9kaXJlY3RJbmFjdGl2ZT0hMCxEdCh0KSkpcmV0dXJuO2lmKCF0Ll9pbmFjdGl2ZSl7dC5faW5hY3RpdmU9ITA7Zm9yKHZhciByPTA7cjx0LiRjaGlsZHJlbi5sZW5ndGg7cisrKWUodC4kY2hpbGRyZW5bcl0pO0Z0KHQsImRlYWN0aXZhdGVkIil9fSh0LCEwKTp0LiRkZXN0cm95KCkpfX0seHQ9T2JqZWN0LmtleXMoU3QpO2Z1bmN0aW9uIEN0KGUsdCxuLHIsaSl7aWYoIUUoZSkpe3ZhciBvPW4uJG9wdGlvbnMuX2Jhc2U7aWYoeShlKSYmKGU9by5leHRlbmQoZSkpLCJmdW5jdGlvbiI9PXR5cGVvZiBlKXt2YXIgYSxzLGMsdSxsLGQsZjtpZihFKGUuY2lkKSYmdm9pZCAwPT09KGU9ZnVuY3Rpb24odCxuKXtpZihBKHQuZXJyb3IpJiZJKHQuZXJyb3JDb21wKSlyZXR1cm4gdC5lcnJvckNvbXA7aWYoSSh0LnJlc29sdmVkKSlyZXR1cm4gdC5yZXNvbHZlZDt2YXIgZT0kdDtlJiZJKHQub3duZXJzKSYmLTE9PT10Lm93bmVycy5pbmRleE9mKGUpJiZ0Lm93bmVycy5wdXNoKGUpO2lmKEEodC5sb2FkaW5nKSYmSSh0LmxvYWRpbmdDb21wKSlyZXR1cm4gdC5sb2FkaW5nQ29tcDtpZihlJiYhSSh0Lm93bmVycykpe3ZhciByPXQub3duZXJzPVtlXSxpPSEwLG89bnVsbCxhPW51bGw7ZS4kb24oImhvb2s6ZGVzdHJveWVkIixmdW5jdGlvbigpe3JldHVybiBiKHIsZSl9KTt2YXIgcz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPXIubGVuZ3RoO3Q8bjt0Kyspclt0XS4kZm9yY2VVcGRhdGUoKTtlJiYoci5sZW5ndGg9MCxudWxsIT09byYmKGNsZWFyVGltZW91dChvKSxvPW51bGwpLG51bGwhPT1hJiYoY2xlYXJUaW1lb3V0KGEpLGE9bnVsbCkpfSxjPWooZnVuY3Rpb24oZSl7dC5yZXNvbHZlZD1QdChlLG4pLGk/ci5sZW5ndGg9MDpzKCEwKX0pLHU9aihmdW5jdGlvbihlKXtJKHQuZXJyb3JDb21wKSYmKHQuZXJyb3I9ITAscyghMCkpfSksbD10KGMsdSk7cmV0dXJuIHkobCkmJihfKGwpP0UodC5yZXNvbHZlZCkmJmwudGhlbihjLHUpOl8obC5jb21wb25lbnQpJiYobC5jb21wb25lbnQudGhlbihjLHUpLEkobC5lcnJvcikmJih0LmVycm9yQ29tcD1QdChsLmVycm9yLG4pKSxJKGwubG9hZGluZykmJih0LmxvYWRpbmdDb21wPVB0KGwubG9hZGluZyxuKSwwPT09bC5kZWxheT90LmxvYWRpbmc9ITA6bz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bz1udWxsLEUodC5yZXNvbHZlZCkmJkUodC5lcnJvcikmJih0LmxvYWRpbmc9ITAscyghMSkpfSxsLmRlbGF5fHwyMDApKSxJKGwudGltZW91dCkmJihhPXNldFRpbWVvdXQoZnVuY3Rpb24oKXthPW51bGwsRSh0LnJlc29sdmVkKSYmdShudWxsKX0sbC50aW1lb3V0KSkpKSxpPSExLHQubG9hZGluZz90LmxvYWRpbmdDb21wOnQucmVzb2x2ZWR9fShhPWUsbykpKXJldHVybiBzPWEsYz10LHU9bixsPXIsZD1pLChmPXVlKCkpLmFzeW5jRmFjdG9yeT1zLGYuYXN5bmNNZXRhPXtkYXRhOmMsY29udGV4dDp1LGNoaWxkcmVuOmwsdGFnOmR9LGY7dD10fHx7fSx2bihlKSxJKHQubW9kZWwpJiZmdW5jdGlvbihlLHQpe3ZhciBuPWUubW9kZWwmJmUubW9kZWwucHJvcHx8InZhbHVlIixyPWUubW9kZWwmJmUubW9kZWwuZXZlbnR8fCJpbnB1dCI7KHQuYXR0cnN8fCh0LmF0dHJzPXt9KSlbbl09dC5tb2RlbC52YWx1ZTt2YXIgaT10Lm9ufHwodC5vbj17fSksbz1pW3JdLGE9dC5tb2RlbC5jYWxsYmFjaztJKG8pPyhBcnJheS5pc0FycmF5KG8pPy0xPT09by5pbmRleE9mKGEpOm8hPT1hKSYmKGlbcl09W2FdLmNvbmNhdChvKSk6aVtyXT1hfShlLm9wdGlvbnMsdCk7dmFyIHA9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dC5vcHRpb25zLnByb3BzO2lmKEUoaSkpcmV0dXJuIFllKGUsdCx7fSxyKTt2YXIgbz17fSxhPWUuYXR0cnMscz1lLnByb3BzO2lmKEkoYSl8fEkocykpZm9yKHZhciBjIGluIGkpe3ZhciB1PXcoYyk7SmUobyxzLGMsdSwhMCl8fEplKG8sYSxjLHUsITEpfXJldHVybiBZZShlLHQsbyxyKX0odCxlLDAsbik7aWYoQShlLm9wdGlvbnMuZnVuY3Rpb25hbCkpcmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG89ZS5vcHRpb25zLGE9e30scz1vLnByb3BzO2lmKEkocykpZm9yKHZhciBjIGluIHMpYVtjXT1BZShjLHMsdHx8bSk7ZWxzZSBJKG4uYXR0cnMpJiZrdChhLG4uYXR0cnMpLEkobi5wcm9wcykmJmt0KGEsbi5wcm9wcyk7dmFyIHU9bmV3IGJ0KG4sYSxpLHIsZSksbD1vLnJlbmRlci5jYWxsKG51bGwsdS5fYyx1KTtpZihsIGluc3RhbmNlb2Ygc2UpcmV0dXJuIHd0KGwsbix1LnBhcmVudCxvKTtpZihBcnJheS5pc0FycmF5KGwpKXtmb3IodmFyIGQ9S2UobCl8fFtdLGY9bmV3IEFycmF5KGQubGVuZ3RoKSxwPTA7cDxkLmxlbmd0aDtwKyspZltwXT13dChkW3BdLG4sdS5wYXJlbnQsbyk7cmV0dXJuIGZ9fShlLHAsdCxuLHIpO3ZhciBoPXQub247aWYodC5vbj10Lm5hdGl2ZU9uLEEoZS5vcHRpb25zLmFic3RyYWN0KSl7dmFyIHY9dC5zbG90O3Q9e30sdiYmKHQuc2xvdD12KX0hZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUuaG9va3x8KGUuaG9vaz17fSksbj0wO248eHQubGVuZ3RoO24rKyl7dmFyIHI9eHRbbl0saT10W3JdLG89U3Rbcl07aT09PW98fGkmJmkuX21lcmdlZHx8KHRbcl09aT9UdChvLGkpOm8pfX0odCk7dmFyIGc9ZS5vcHRpb25zLm5hbWV8fGk7cmV0dXJuIG5ldyBzZSgidnVlLWNvbXBvbmVudC0iK2UuY2lkKyhnPyItIitnOiIiKSx0LHZvaWQgMCx2b2lkIDAsdm9pZCAwLG4se0N0b3I6ZSxwcm9wc0RhdGE6cCxsaXN0ZW5lcnM6aCx0YWc6aSxjaGlsZHJlbjpyfSxhKX19fWZ1bmN0aW9uIFR0KG4scil7dmFyIGU9ZnVuY3Rpb24oZSx0KXtuKGUsdCkscihlLHQpfTtyZXR1cm4gZS5fbWVyZ2VkPSEwLGV9dmFyIE90PTEsRXQ9MjtmdW5jdGlvbiBJdChlLHQsbixyLGksbyl7cmV0dXJuKEFycmF5LmlzQXJyYXkobil8fGMobikpJiYoaT1yLHI9bixuPXZvaWQgMCksQShvKSYmKGk9RXQpLGZ1bmN0aW9uKGUsdCxuLHIsaSl7aWYoSShuKSYmSShuLl9fb2JfXykpcmV0dXJuIHVlKCk7SShuKSYmSShuLmlzKSYmKHQ9bi5pcyk7aWYoIXQpcmV0dXJuIHVlKCk7QXJyYXkuaXNBcnJheShyKSYmImZ1bmN0aW9uIj09dHlwZW9mIHJbMF0mJigobj1ufHx7fSkuc2NvcGVkU2xvdHM9e2RlZmF1bHQ6clswXX0sci5sZW5ndGg9MCk7aT09PUV0P3I9S2Uocik6aT09PU90JiYocj1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKylpZihBcnJheS5pc0FycmF5KGVbdF0pKXJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGUpO3JldHVybiBlfShyKSk7dmFyIG8sYTtpZigic3RyaW5nIj09dHlwZW9mIHQpe3ZhciBzO2E9ZS4kdm5vZGUmJmUuJHZub2RlLm5zfHxELmdldFRhZ05hbWVzcGFjZSh0KSxvPUQuaXNSZXNlcnZlZFRhZyh0KT9uZXcgc2UoRC5wYXJzZVBsYXRmb3JtVGFnTmFtZSh0KSxuLHIsdm9pZCAwLHZvaWQgMCxlKTpuJiZuLnByZXx8IUkocz1JZShlLiRvcHRpb25zLCJjb21wb25lbnRzIix0KSk/bmV3IHNlKHQsbixyLHZvaWQgMCx2b2lkIDAsZSk6Q3QocyxuLGUscix0KX1lbHNlIG89Q3QodCxuLGUscik7cmV0dXJuIEFycmF5LmlzQXJyYXkobyk/bzpJKG8pPyhJKGEpJiZmdW5jdGlvbiBlKHQsbixyKXt0Lm5zPW47ImZvcmVpZ25PYmplY3QiPT09dC50YWcmJihyPSEobj12b2lkIDApKTtpZihJKHQuY2hpbGRyZW4pKWZvcih2YXIgaT0wLG89dC5jaGlsZHJlbi5sZW5ndGg7aTxvO2krKyl7dmFyIGE9dC5jaGlsZHJlbltpXTtJKGEudGFnKSYmKEUoYS5ucyl8fEEocikmJiJzdmciIT09YS50YWcpJiZlKGEsbixyKX19KG8sYSksSShuKSYmZnVuY3Rpb24oZSl7eShlLnN0eWxlKSYmcWUoZS5zdHlsZSk7eShlLmNsYXNzKSYmcWUoZS5jbGFzcyl9KG4pLG8pOnVlKCl9KGUsdCxuLHIsaSl9dmFyIEF0LCR0PW51bGw7ZnVuY3Rpb24gUHQoZSx0KXtyZXR1cm4oZS5fX2VzTW9kdWxlfHx0ZSYmIk1vZHVsZSI9PT1lW1N5bWJvbC50b1N0cmluZ1RhZ10pJiYoZT1lLmRlZmF1bHQpLHkoZSk/dC5leHRlbmQoZSk6ZX1mdW5jdGlvbiBNdChlLHQpe0F0LiRvbihlLHQpfWZ1bmN0aW9uIGp0KGUsdCl7QXQuJG9mZihlLHQpfWZ1bmN0aW9uIEx0KHQsbil7dmFyIHI9QXQ7cmV0dXJuIGZ1bmN0aW9uIGUoKXtudWxsIT09bi5hcHBseShudWxsLGFyZ3VtZW50cykmJnIuJG9mZih0LGUpfX1mdW5jdGlvbiBCdChlLHQsbil7R2UodCxufHx7fSxNdCxqdCxMdCxBdD1lKSxBdD12b2lkIDB9dmFyIE50PW51bGw7ZnVuY3Rpb24gRHQoZSl7Zm9yKDtlJiYoZT1lLiRwYXJlbnQpOylpZihlLl9pbmFjdGl2ZSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBSdChlLHQpe2lmKHQpe2lmKGUuX2RpcmVjdEluYWN0aXZlPSExLER0KGUpKXJldHVybn1lbHNlIGlmKGUuX2RpcmVjdEluYWN0aXZlKXJldHVybjtpZihlLl9pbmFjdGl2ZXx8bnVsbD09PWUuX2luYWN0aXZlKXtlLl9pbmFjdGl2ZT0hMTtmb3IodmFyIG49MDtuPGUuJGNoaWxkcmVuLmxlbmd0aDtuKyspUnQoZS4kY2hpbGRyZW5bbl0pO0Z0KGUsImFjdGl2YXRlZCIpfX1mdW5jdGlvbiBGdChlLHQpe29lKCk7dmFyIG49ZS4kb3B0aW9uc1t0XSxyPXQrIiBob29rIjtpZihuKWZvcih2YXIgaT0wLG89bi5sZW5ndGg7aTxvO2krKylMZShuW2ldLGUsbnVsbCxlLHIpO2UuX2hhc0hvb2tFdmVudCYmZS4kZW1pdCgiaG9vazoiK3QpLGFlKCl9dmFyIHp0PVtdLFZ0PVtdLFV0PXt9LHF0PSExLFd0PSExLEh0PTA7dmFyIEd0PURhdGUubm93O2lmKFUmJiFHKXt2YXIgWHQ9d2luZG93LnBlcmZvcm1hbmNlO1h0JiYiZnVuY3Rpb24iPT10eXBlb2YgWHQubm93JiZHdCgpPmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLnRpbWVTdGFtcCYmKEd0PWZ1bmN0aW9uKCl7cmV0dXJuIFh0Lm5vdygpfSl9ZnVuY3Rpb24gWXQoKXt2YXIgZSx0O2ZvcihHdCgpLFd0PSEwLHp0LnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5pZC10LmlkfSksSHQ9MDtIdDx6dC5sZW5ndGg7SHQrKykoZT16dFtIdF0pLmJlZm9yZSYmZS5iZWZvcmUoKSx0PWUuaWQsVXRbdF09bnVsbCxlLnJ1bigpO3ZhciBuPVZ0LnNsaWNlKCkscj16dC5zbGljZSgpO0h0PXp0Lmxlbmd0aD1WdC5sZW5ndGg9MCxxdD1XdD0hKFV0PXt9KSxmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdLl9pbmFjdGl2ZT0hMCxSdChlW3RdLCEwKX0obiksZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGg7Zm9yKDt0LS07KXt2YXIgbj1lW3RdLHI9bi52bTtyLl93YXRjaGVyPT09biYmci5faXNNb3VudGVkJiYhci5faXNEZXN0cm95ZWQmJihyLl8kdmQ/ci5fJHZkLmFkZFVwZGF0ZWRWbShyKTpGdChyLCJ1cGRhdGVkIikpfX0ociksWiYmRC5kZXZ0b29scyYmWi5lbWl0KCJmbHVzaCIpfXZhciBKdD0wLEt0PWZ1bmN0aW9uKGUsdCxuLHIsaSl7dGhpcy52bT1lLGkmJihlLl93YXRjaGVyPXRoaXMpLGUuX3dhdGNoZXJzLnB1c2godGhpcykscj8odGhpcy5kZWVwPSEhci5kZWVwLHRoaXMudXNlcj0hIXIudXNlcix0aGlzLmxhenk9ISFyLmxhenksdGhpcy5zeW5jPSEhci5zeW5jLHRoaXMuYmVmb3JlPXIuYmVmb3JlKTp0aGlzLmRlZXA9dGhpcy51c2VyPXRoaXMubGF6eT10aGlzLnN5bmM9ITEsdGhpcy5jYj1uLHRoaXMuaWQ9KytKdCx0aGlzLmFjdGl2ZT0hMCx0aGlzLmRpcnR5PXRoaXMubGF6eSx0aGlzLmRlcHM9W10sdGhpcy5uZXdEZXBzPVtdLHRoaXMuZGVwSWRzPW5ldyBlZSx0aGlzLm5ld0RlcElkcz1uZXcgZWUsdGhpcy5leHByZXNzaW9uPSIiLCJmdW5jdGlvbiI9PXR5cGVvZiB0P3RoaXMuZ2V0dGVyPXQ6KHRoaXMuZ2V0dGVyPWZ1bmN0aW9uKGUpe2lmKCFGLnRlc3QoZSkpe3ZhciBuPWUuc3BsaXQoIi4iKTtyZXR1cm4gZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxuLmxlbmd0aDt0Kyspe2lmKCFlKXJldHVybjtlPWVbblt0XV19cmV0dXJuIGV9fX0odCksdGhpcy5nZXR0ZXJ8fCh0aGlzLmdldHRlcj1UKSksdGhpcy52YWx1ZT10aGlzLmxhenk/dm9pZCAwOnRoaXMuZ2V0KCl9O0t0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oKXt2YXIgZTtvZSh0aGlzKTt2YXIgdD10aGlzLnZtO3RyeXtlPXRoaXMuZ2V0dGVyLmNhbGwodCx0KX1jYXRjaChlKXtpZighdGhpcy51c2VyKXRocm93IGU7amUoZSx0LCdnZXR0ZXIgZm9yIHdhdGNoZXIgIicrdGhpcy5leHByZXNzaW9uKyciJyl9ZmluYWxseXt0aGlzLmRlZXAmJnFlKGUpLGFlKCksdGhpcy5jbGVhbnVwRGVwcygpfXJldHVybiBlfSxLdC5wcm90b3R5cGUuYWRkRGVwPWZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQ7dGhpcy5uZXdEZXBJZHMuaGFzKHQpfHwodGhpcy5uZXdEZXBJZHMuYWRkKHQpLHRoaXMubmV3RGVwcy5wdXNoKGUpLHRoaXMuZGVwSWRzLmhhcyh0KXx8ZS5hZGRTdWIodGhpcykpfSxLdC5wcm90b3R5cGUuY2xlYW51cERlcHM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5kZXBzLmxlbmd0aDtlLS07KXt2YXIgdD10aGlzLmRlcHNbZV07dGhpcy5uZXdEZXBJZHMuaGFzKHQuaWQpfHx0LnJlbW92ZVN1Yih0aGlzKX12YXIgbj10aGlzLmRlcElkczt0aGlzLmRlcElkcz10aGlzLm5ld0RlcElkcyx0aGlzLm5ld0RlcElkcz1uLHRoaXMubmV3RGVwSWRzLmNsZWFyKCksbj10aGlzLmRlcHMsdGhpcy5kZXBzPXRoaXMubmV3RGVwcyx0aGlzLm5ld0RlcHM9bix0aGlzLm5ld0RlcHMubGVuZ3RoPTB9LEt0LnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmxhenk/dGhpcy5kaXJ0eT0hMDp0aGlzLnN5bmM/dGhpcy5ydW4oKTpmdW5jdGlvbihlKXt2YXIgdD1lLmlkO2lmKG51bGw9PVV0W3RdKXtpZihVdFt0XT0hMCxXdCl7Zm9yKHZhciBuPXp0Lmxlbmd0aC0xO0h0PG4mJnp0W25dLmlkPmUuaWQ7KW4tLTt6dC5zcGxpY2UobisxLDAsZSl9ZWxzZSB6dC5wdXNoKGUpO3F0fHwocXQ9ITAsVmUoWXQpKX19KHRoaXMpfSxLdC5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7aWYodGhpcy5hY3RpdmUpe3ZhciBlPXRoaXMuZ2V0KCk7aWYoZSE9PXRoaXMudmFsdWV8fHkoZSl8fHRoaXMuZGVlcCl7dmFyIHQ9dGhpcy52YWx1ZTtpZih0aGlzLnZhbHVlPWUsdGhpcy51c2VyKXRyeXt0aGlzLmNiLmNhbGwodGhpcy52bSxlLHQpfWNhdGNoKGUpe2plKGUsdGhpcy52bSwnY2FsbGJhY2sgZm9yIHdhdGNoZXIgIicrdGhpcy5leHByZXNzaW9uKyciJyl9ZWxzZSB0aGlzLmNiLmNhbGwodGhpcy52bSxlLHQpfX19LEt0LnByb3RvdHlwZS5ldmFsdWF0ZT1mdW5jdGlvbigpe3RoaXMudmFsdWU9dGhpcy5nZXQoKSx0aGlzLmRpcnR5PSExfSxLdC5wcm90b3R5cGUuZGVwZW5kPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuZGVwcy5sZW5ndGg7ZS0tOyl0aGlzLmRlcHNbZV0uZGVwZW5kKCl9LEt0LnByb3RvdHlwZS50ZWFyZG93bj1mdW5jdGlvbigpe2lmKHRoaXMuYWN0aXZlKXt0aGlzLnZtLl9pc0JlaW5nRGVzdHJveWVkfHxiKHRoaXMudm0uX3dhdGNoZXJzLHRoaXMpO2Zvcih2YXIgZT10aGlzLmRlcHMubGVuZ3RoO2UtLTspdGhpcy5kZXBzW2VdLnJlbW92ZVN1Yih0aGlzKTt0aGlzLmFjdGl2ZT0hMX19O3ZhciBadD17ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OlQsc2V0OlR9O2Z1bmN0aW9uIFF0KGUsdCxuKXtadC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1t0XVtuXX0sWnQuc2V0PWZ1bmN0aW9uKGUpe3RoaXNbdF1bbl09ZX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbixadCl9ZnVuY3Rpb24gZW4oZSl7ZS5fd2F0Y2hlcnM9W107dmFyIHQ9ZS4kb3B0aW9uczt0LnByb3BzJiZmdW5jdGlvbihuLHIpe3ZhciBpPW4uJG9wdGlvbnMucHJvcHNEYXRhfHx7fSxvPW4uX3Byb3BzPXt9LGE9bi4kb3B0aW9ucy5fcHJvcEtleXM9W107bi4kcGFyZW50JiZnZSghMSk7dmFyIGU9ZnVuY3Rpb24oZSl7YS5wdXNoKGUpO3ZhciB0PUFlKGUscixpLG4pO19lKG8sZSx0KSxlIGluIG58fFF0KG4sIl9wcm9wcyIsZSl9O2Zvcih2YXIgdCBpbiByKWUodCk7Z2UoITApfShlLHQucHJvcHMpLHQubWV0aG9kcyYmZnVuY3Rpb24oZSx0KXtlLiRvcHRpb25zLnByb3BzO2Zvcih2YXIgbiBpbiB0KWVbbl09ImZ1bmN0aW9uIiE9dHlwZW9mIHRbbl0/VDprKHRbbl0sZSl9KGUsdC5tZXRob2RzKSx0LmRhdGE/ZnVuY3Rpb24oZSl7dmFyIHQ9ZS4kb3B0aW9ucy5kYXRhO3UodD1lLl9kYXRhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P2Z1bmN0aW9uKGUsdCl7b2UoKTt0cnl7cmV0dXJuIGUuY2FsbCh0LHQpfWNhdGNoKGUpe3JldHVybiBqZShlLHQsImRhdGEoKSIpLHt9fWZpbmFsbHl7YWUoKX19KHQsZSk6dHx8e30pfHwodD17fSk7dmFyIG49T2JqZWN0LmtleXModCkscj1lLiRvcHRpb25zLnByb3BzLGk9KGUuJG9wdGlvbnMubWV0aG9kcyxuLmxlbmd0aCk7Zm9yKDtpLS07KXt2YXIgbz1uW2ldO3ImJmQocixvKXx8KHZvaWQgMCwzNiE9PShhPShvKyIiKS5jaGFyQ29kZUF0KDApKSYmOTUhPT1hJiZRdChlLCJfZGF0YSIsbykpfXZhciBhO3llKHQsITApfShlKTp5ZShlLl9kYXRhPXt9LCEwKSx0LmNvbXB1dGVkJiZmdW5jdGlvbihlLHQpe3ZhciBuPWUuX2NvbXB1dGVkV2F0Y2hlcnM9T2JqZWN0LmNyZWF0ZShudWxsKSxyPUsoKTtmb3IodmFyIGkgaW4gdCl7dmFyIG89dFtpXSxhPSJmdW5jdGlvbiI9PXR5cGVvZiBvP286by5nZXQ7cnx8KG5baV09bmV3IEt0KGUsYXx8VCxULHRuKSksaSBpbiBlfHxubihlLGksbyl9fShlLHQuY29tcHV0ZWQpLHQud2F0Y2gmJnQud2F0Y2ghPT1ZJiZmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KXt2YXIgcj10W25dO2lmKEFycmF5LmlzQXJyYXkocikpZm9yKHZhciBpPTA7aTxyLmxlbmd0aDtpKyspYW4oZSxuLHJbaV0pO2Vsc2UgYW4oZSxuLHIpfX0oZSx0LndhdGNoKX12YXIgdG49e2xhenk6ITB9O2Z1bmN0aW9uIG5uKGUsdCxuKXt2YXIgcj0hSygpOyJmdW5jdGlvbiI9PXR5cGVvZiBuPyhadC5nZXQ9cj9ybih0KTpvbihuKSxadC5zZXQ9VCk6KFp0LmdldD1uLmdldD9yJiYhMSE9PW4uY2FjaGU/cm4odCk6b24obi5nZXQpOlQsWnQuc2V0PW4uc2V0fHxUKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LFp0KX1mdW5jdGlvbiBybih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9jb21wdXRlZFdhdGNoZXJzJiZ0aGlzLl9jb21wdXRlZFdhdGNoZXJzW3RdO2lmKGUpcmV0dXJuIGUuZGlydHkmJmUuZXZhbHVhdGUoKSxpZS5TaGFyZWRPYmplY3QudGFyZ2V0JiZlLmRlcGVuZCgpLGUudmFsdWV9fWZ1bmN0aW9uIG9uKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmNhbGwodGhpcyx0aGlzKX19ZnVuY3Rpb24gYW4oZSx0LG4scil7cmV0dXJuIHUobikmJihuPShyPW4pLmhhbmRsZXIpLCJzdHJpbmciPT10eXBlb2YgbiYmKG49ZVtuXSksZS4kd2F0Y2godCxuLHIpfXZhciBzbixjbix1bixsbixkbixmbixwbixobj0wO2Z1bmN0aW9uIHZuKGUpe3ZhciB0PWUub3B0aW9ucztpZihlLnN1cGVyKXt2YXIgbj12bihlLnN1cGVyKTtpZihuIT09ZS5zdXBlck9wdGlvbnMpe2Uuc3VwZXJPcHRpb25zPW47dmFyIHI9ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLm9wdGlvbnMscj1lLnNlYWxlZE9wdGlvbnM7Zm9yKHZhciBpIGluIG4pbltpXSE9PXJbaV0mJih0fHwodD17fSksdFtpXT1uW2ldKTtyZXR1cm4gdH0oZSk7ciYmeChlLmV4dGVuZE9wdGlvbnMsciksKHQ9ZS5vcHRpb25zPUVlKG4sZS5leHRlbmRPcHRpb25zKSkubmFtZSYmKHQuY29tcG9uZW50c1t0Lm5hbWVdPWUpfX1yZXR1cm4gdH1mdW5jdGlvbiBnbihlKXt0aGlzLl9pbml0KGUpfWZ1bmN0aW9uIG1uKGUpe2UuY2lkPTA7dmFyIGE9MTtlLmV4dGVuZD1mdW5jdGlvbihlKXtlPWV8fHt9O3ZhciB0PXRoaXMsbj10LmNpZCxyPWUuX0N0b3J8fChlLl9DdG9yPXt9KTtpZihyW25dKXJldHVybiByW25dO3ZhciBpPWUubmFtZXx8dC5vcHRpb25zLm5hbWUsbz1mdW5jdGlvbihlKXt0aGlzLl9pbml0KGUpfTtyZXR1cm4oKG8ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1vKS5jaWQ9YSsrLG8ub3B0aW9ucz1FZSh0Lm9wdGlvbnMsZSksby5zdXBlcj10LG8ub3B0aW9ucy5wcm9wcyYmZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vcHRpb25zLnByb3BzO2Zvcih2YXIgbiBpbiB0KVF0KGUucHJvdG90eXBlLCJfcHJvcHMiLG4pfShvKSxvLm9wdGlvbnMuY29tcHV0ZWQmJmZ1bmN0aW9uKGUpe3ZhciB0PWUub3B0aW9ucy5jb21wdXRlZDtmb3IodmFyIG4gaW4gdClubihlLnByb3RvdHlwZSxuLHRbbl0pfShvKSxvLmV4dGVuZD10LmV4dGVuZCxvLm1peGluPXQubWl4aW4sby51c2U9dC51c2UsQi5mb3JFYWNoKGZ1bmN0aW9uKGUpe29bZV09dFtlXX0pLGkmJihvLm9wdGlvbnMuY29tcG9uZW50c1tpXT1vKSxvLnN1cGVyT3B0aW9ucz10Lm9wdGlvbnMsby5leHRlbmRPcHRpb25zPWUsby5zZWFsZWRPcHRpb25zPXgoe30sby5vcHRpb25zKSxyW25dPW99fWZ1bmN0aW9uIHluKGUpe3JldHVybiBlJiYoZS5DdG9yLm9wdGlvbnMubmFtZXx8ZS50YWcpfWZ1bmN0aW9uIF9uKGUsdCl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/LTE8ZS5pbmRleE9mKHQpOiJzdHJpbmciPT10eXBlb2YgZT8tMTxlLnNwbGl0KCIsIikuaW5kZXhPZih0KToobj1lLCJbb2JqZWN0IFJlZ0V4cF0iPT09ci5jYWxsKG4pJiZlLnRlc3QodCkpO3ZhciBufWZ1bmN0aW9uIGJuKGUsdCl7dmFyIG49ZS5jYWNoZSxyPWUua2V5cyxpPWUuX3Zub2RlO2Zvcih2YXIgbyBpbiBuKXt2YXIgYT1uW29dO2lmKGEpe3ZhciBzPXluKGEuY29tcG9uZW50T3B0aW9ucyk7cyYmIXQocykmJnduKG4sbyxyLGkpfX19ZnVuY3Rpb24gd24oZSx0LG4scil7dmFyIGk9ZVt0XTshaXx8ciYmaS50YWc9PT1yLnRhZ3x8aS5jb21wb25lbnRJbnN0YW5jZS4kZGVzdHJveSgpLGVbdF09bnVsbCxiKG4sdCl9Z24ucHJvdG90eXBlLl9pbml0PWZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG89dGhpcztvLl91aWQ9aG4rKyxvLl9pc1Z1ZT0hMCxlJiZlLl9pc0NvbXBvbmVudD9mdW5jdGlvbihlLHQpe3ZhciBuPWUuJG9wdGlvbnM9T2JqZWN0LmNyZWF0ZShlLmNvbnN0cnVjdG9yLm9wdGlvbnMpLHI9dC5fcGFyZW50Vm5vZGU7bi5wYXJlbnQ9dC5wYXJlbnQ7dmFyIGk9KG4uX3BhcmVudFZub2RlPXIpLmNvbXBvbmVudE9wdGlvbnM7bi5wcm9wc0RhdGE9aS5wcm9wc0RhdGEsbi5fcGFyZW50TGlzdGVuZXJzPWkubGlzdGVuZXJzLG4uX3JlbmRlckNoaWxkcmVuPWkuY2hpbGRyZW4sbi5fY29tcG9uZW50VGFnPWkudGFnLHQucmVuZGVyJiYobi5yZW5kZXI9dC5yZW5kZXIsbi5zdGF0aWNSZW5kZXJGbnM9dC5zdGF0aWNSZW5kZXJGbnMpfShvLGUpOm8uJG9wdGlvbnM9RWUodm4oby5jb25zdHJ1Y3RvciksZXx8e30sbyksZnVuY3Rpb24oZSl7dmFyIHQ9ZS4kb3B0aW9ucyxuPXQucGFyZW50O2lmKG4mJiF0LmFic3RyYWN0KXtmb3IoO24uJG9wdGlvbnMuYWJzdHJhY3QmJm4uJHBhcmVudDspbj1uLiRwYXJlbnQ7bi4kY2hpbGRyZW4ucHVzaChlKX1lLiRwYXJlbnQ9bixlLiRyb290PW4/bi4kcm9vdDplLGUuJGNoaWxkcmVuPVtdLGUuJHJlZnM9e30sZS5fd2F0Y2hlcj1udWxsLGUuX2luYWN0aXZlPW51bGwsZS5fZGlyZWN0SW5hY3RpdmU9ITEsZS5faXNNb3VudGVkPSExLGUuX2lzRGVzdHJveWVkPSExLGUuX2lzQmVpbmdEZXN0cm95ZWQ9ITF9KChvLl9yZW5kZXJQcm94eT1vKS5fc2VsZj1vKSxmdW5jdGlvbihlKXtlLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSxlLl9oYXNIb29rRXZlbnQ9ITE7dmFyIHQ9ZS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO3QmJkJ0KGUsdCl9KG8pLGZ1bmN0aW9uKGkpe2kuX3Zub2RlPW51bGwsaS5fc3RhdGljVHJlZXM9bnVsbDt2YXIgZT1pLiRvcHRpb25zLHQ9aS4kdm5vZGU9ZS5fcGFyZW50Vm5vZGUsbj10JiZ0LmNvbnRleHQ7aS4kc2xvdHM9ZXQoZS5fcmVuZGVyQ2hpbGRyZW4sbiksaS4kc2NvcGVkU2xvdHM9bSxpLl9jPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBJdChpLGUsdCxuLHIsITEpfSxpLiRjcmVhdGVFbGVtZW50PWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBJdChpLGUsdCxuLHIsITApfTt2YXIgcj10JiZ0LmRhdGE7X2UoaSwiJGF0dHJzIixyJiZyLmF0dHJzfHxtLG51bGwsITApLF9lKGksIiRsaXN0ZW5lcnMiLGUuX3BhcmVudExpc3RlbmVyc3x8bSxudWxsLCEwKX0obyksRnQobywiYmVmb3JlQ3JlYXRlIiksKG49UWUoKHQ9bykuJG9wdGlvbnMuaW5qZWN0LHQpKSYmKGdlKCExKSxPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe19lKHQsZSxuW2VdKX0pLGdlKCEwKSksZW4obyksKGk9KHI9bykuJG9wdGlvbnMucHJvdmlkZSkmJihyLl9wcm92aWRlZD0iZnVuY3Rpb24iPT10eXBlb2YgaT9pLmNhbGwocik6aSksRnQobywiY3JlYXRlZCIpLG8uJG9wdGlvbnMuZWwmJm8uJG1vdW50KG8uJG9wdGlvbnMuZWwpfSxzbj1nbixjbj17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGF9fSx1bj17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb3BzfX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHNuLnByb3RvdHlwZSwiJGRhdGEiLGNuKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoc24ucHJvdG90eXBlLCIkcHJvcHMiLHVuKSxzbi5wcm90b3R5cGUuJHNldD1iZSxzbi5wcm90b3R5cGUuJGRlbGV0ZT13ZSxzbi5wcm90b3R5cGUuJHdhdGNoPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzO2lmKHUodCkpcmV0dXJuIGFuKHIsZSx0LG4pOyhuPW58fHt9KS51c2VyPSEwO3ZhciBpPW5ldyBLdChyLGUsdCxuKTtpZihuLmltbWVkaWF0ZSl0cnl7dC5jYWxsKHIsaS52YWx1ZSl9Y2F0Y2goZSl7amUoZSxyLCdjYWxsYmFjayBmb3IgaW1tZWRpYXRlIHdhdGNoZXIgIicraS5leHByZXNzaW9uKyciJyl9cmV0dXJuIGZ1bmN0aW9uKCl7aS50ZWFyZG93bigpfX0sZG49L15ob29rOi8sKGxuPWduKS5wcm90b3R5cGUuJG9uPWZ1bmN0aW9uKGUsdCl7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspdGhpcy4kb24oZVtuXSx0KTtlbHNlKHRoaXMuX2V2ZW50c1tlXXx8KHRoaXMuX2V2ZW50c1tlXT1bXSkpLnB1c2godCksZG4udGVzdChlKSYmKHRoaXMuX2hhc0hvb2tFdmVudD0hMCk7cmV0dXJuIHRoaXN9LGxuLnByb3RvdHlwZS4kb25jZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7ZnVuY3Rpb24gcigpe24uJG9mZihlLHIpLHQuYXBwbHkobixhcmd1bWVudHMpfXJldHVybiByLmZuPXQsbi4kb24oZSxyKSxufSxsbi5wcm90b3R5cGUuJG9mZj1mdW5jdGlvbihlLHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzO2lmKEFycmF5LmlzQXJyYXkoZSkpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyl0aGlzLiRvZmYoZVtuXSx0KTtyZXR1cm4gdGhpc312YXIgaSxvPXRoaXMuX2V2ZW50c1tlXTtpZighbylyZXR1cm4gdGhpcztpZighdClyZXR1cm4gdGhpcy5fZXZlbnRzW2VdPW51bGwsdGhpcztmb3IodmFyIGE9by5sZW5ndGg7YS0tOylpZigoaT1vW2FdKT09PXR8fGkuZm49PT10KXtvLnNwbGljZShhLDEpO2JyZWFrfXJldHVybiB0aGlzfSxsbi5wcm90b3R5cGUuJGVtaXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZXZlbnRzW2VdO2lmKHQpe3Q9MTx0Lmxlbmd0aD9TKHQpOnQ7Zm9yKHZhciBuPVMoYXJndW1lbnRzLDEpLHI9J2V2ZW50IGhhbmRsZXIgZm9yICInK2UrJyInLGk9MCxvPXQubGVuZ3RoO2k8bztpKyspTGUodFtpXSx0aGlzLG4sdGhpcyxyKX1yZXR1cm4gdGhpc30sKGZuPWduKS5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9dGhpcyxpPXIuJGVsLG89ci5fdm5vZGUsYT0obj1OdCxOdD1yLGZ1bmN0aW9uKCl7TnQ9bn0pO3IuX3Zub2RlPWUsci4kZWw9bz9yLl9fcGF0Y2hfXyhvLGUpOnIuX19wYXRjaF9fKHIuJGVsLGUsdCwhMSksYSgpLGkmJihpLl9fdnVlX189bnVsbCksci4kZWwmJihyLiRlbC5fX3Z1ZV9fPXIpLHIuJHZub2RlJiZyLiRwYXJlbnQmJnIuJHZub2RlPT09ci4kcGFyZW50Ll92bm9kZSYmKHIuJHBhcmVudC4kZWw9ci4kZWwpfSxmbi5wcm90b3R5cGUuJGZvcmNlVXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fd2F0Y2hlciYmdGhpcy5fd2F0Y2hlci51cGRhdGUoKX0sZm4ucHJvdG90eXBlLiRkZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZighZS5faXNCZWluZ0Rlc3Ryb3llZCl7RnQoZSwiYmVmb3JlRGVzdHJveSIpLGUuX2lzQmVpbmdEZXN0cm95ZWQ9ITA7dmFyIHQ9ZS4kcGFyZW50OyF0fHx0Ll9pc0JlaW5nRGVzdHJveWVkfHxlLiRvcHRpb25zLmFic3RyYWN0fHxiKHQuJGNoaWxkcmVuLGUpLGUuX3dhdGNoZXImJmUuX3dhdGNoZXIudGVhcmRvd24oKTtmb3IodmFyIG49ZS5fd2F0Y2hlcnMubGVuZ3RoO24tLTspZS5fd2F0Y2hlcnNbbl0udGVhcmRvd24oKTtlLl9kYXRhLl9fb2JfXyYmZS5fZGF0YS5fX29iX18udm1Db3VudC0tLGUuX2lzRGVzdHJveWVkPSEwLGUuX19wYXRjaF9fKGUuX3Zub2RlLG51bGwpLEZ0KGUsImRlc3Ryb3llZCIpLGUuJG9mZigpLGUuJGVsJiYoZS4kZWwuX192dWVfXz1udWxsKSxlLiR2bm9kZSYmKGUuJHZub2RlLnBhcmVudD1udWxsKX19LF90KChwbj1nbikucHJvdG90eXBlKSxwbi5wcm90b3R5cGUuJG5leHRUaWNrPWZ1bmN0aW9uKGUpe3JldHVybiBWZShlLHRoaXMpfSxwbi5wcm90b3R5cGUuX3JlbmRlcj1mdW5jdGlvbigpe3ZhciB0LG49dGhpcyxlPW4uJG9wdGlvbnMscj1lLnJlbmRlcixpPWUuX3BhcmVudFZub2RlO2kmJihuLiRzY29wZWRTbG90cz1udChpLmRhdGEuc2NvcGVkU2xvdHMsbi4kc2xvdHMsbi4kc2NvcGVkU2xvdHMpKSxuLiR2bm9kZT1pO3RyeXskdD1uLHQ9ci5jYWxsKG4uX3JlbmRlclByb3h5LG4uJGNyZWF0ZUVsZW1lbnQpfWNhdGNoKGUpe2plKGUsbiwicmVuZGVyIiksdD1uLl92bm9kZX1maW5hbGx5eyR0PW51bGx9cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJjE9PT10Lmxlbmd0aCYmKHQ9dFswXSksdCBpbnN0YW5jZW9mIHNlfHwodD11ZSgpKSx0LnBhcmVudD1pLHR9O3ZhciBrbixTbix4bixDbj1bU3RyaW5nLFJlZ0V4cCxBcnJheV0sVG49e0tlZXBBbGl2ZTp7bmFtZToia2VlcC1hbGl2ZSIsYWJzdHJhY3Q6ITAscHJvcHM6e2luY2x1ZGU6Q24sZXhjbHVkZTpDbixtYXg6W1N0cmluZyxOdW1iZXJdfSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5jYWNoZT1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMua2V5cz1bXX0sZGVzdHJveWVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHRoaXMuY2FjaGUpd24odGhpcy5jYWNoZSxlLHRoaXMua2V5cyl9LG1vdW50ZWQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuJHdhdGNoKCJpbmNsdWRlIixmdW5jdGlvbih0KXtibihlLGZ1bmN0aW9uKGUpe3JldHVybiBfbih0LGUpfSl9KSx0aGlzLiR3YXRjaCgiZXhjbHVkZSIsZnVuY3Rpb24odCl7Ym4oZSxmdW5jdGlvbihlKXtyZXR1cm4hX24odCxlKX0pfSl9LHJlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuJHNsb3RzLmRlZmF1bHQsdD1mdW5jdGlvbihlKXtpZihBcnJheS5pc0FycmF5KGUpKWZvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKXt2YXIgbj1lW3RdO2lmKEkobikmJihJKG4uY29tcG9uZW50T3B0aW9ucyl8fChyPW4pLmlzQ29tbWVudCYmci5hc3luY0ZhY3RvcnkpKXJldHVybiBufXZhciByfShlKSxuPXQmJnQuY29tcG9uZW50T3B0aW9ucztpZihuKXt2YXIgcj15bihuKSxpPXRoaXMuaW5jbHVkZSxvPXRoaXMuZXhjbHVkZTtpZihpJiYoIXJ8fCFfbihpLHIpKXx8byYmciYmX24obyxyKSlyZXR1cm4gdDt2YXIgYT10aGlzLmNhY2hlLHM9dGhpcy5rZXlzLGM9bnVsbD09dC5rZXk/bi5DdG9yLmNpZCsobi50YWc/Ijo6IituLnRhZzoiIik6dC5rZXk7YVtjXT8odC5jb21wb25lbnRJbnN0YW5jZT1hW2NdLmNvbXBvbmVudEluc3RhbmNlLGIocyxjKSxzLnB1c2goYykpOihhW2NdPXQscy5wdXNoKGMpLHRoaXMubWF4JiZzLmxlbmd0aD5wYXJzZUludCh0aGlzLm1heCkmJnduKGEsc1swXSxzLHRoaXMuX3Zub2RlKSksdC5kYXRhLmtlZXBBbGl2ZT0hMH1yZXR1cm4gdHx8ZSYmZVswXX19fTtrbj1nbix4bj17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIER9fSxPYmplY3QuZGVmaW5lUHJvcGVydHkoa24sImNvbmZpZyIseG4pLGtuLnV0aWw9e3dhcm46bmUsZXh0ZW5kOngsbWVyZ2VPcHRpb25zOkVlLGRlZmluZVJlYWN0aXZlOl9lfSxrbi5zZXQ9YmUsa24uZGVsZXRlPXdlLGtuLm5leHRUaWNrPVZlLGtuLm9ic2VydmFibGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHllKGUpLGV9LGtuLm9wdGlvbnM9T2JqZWN0LmNyZWF0ZShudWxsKSxCLmZvckVhY2goZnVuY3Rpb24oZSl7a24ub3B0aW9uc1tlKyJzIl09T2JqZWN0LmNyZWF0ZShudWxsKX0pLHgoKGtuLm9wdGlvbnMuX2Jhc2U9a24pLm9wdGlvbnMuY29tcG9uZW50cyxUbiksa24udXNlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2luc3RhbGxlZFBsdWdpbnN8fCh0aGlzLl9pbnN0YWxsZWRQbHVnaW5zPVtdKTtpZigtMTx0LmluZGV4T2YoZSkpcmV0dXJuIHRoaXM7dmFyIG49Uyhhcmd1bWVudHMsMSk7cmV0dXJuIG4udW5zaGlmdCh0aGlzKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5pbnN0YWxsP2UuaW5zdGFsbC5hcHBseShlLG4pOiJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLmFwcGx5KG51bGwsbiksdC5wdXNoKGUpLHRoaXN9LGtuLm1peGluPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9wdGlvbnM9RWUodGhpcy5vcHRpb25zLGUpLHRoaXN9LG1uKGtuKSxTbj1rbixCLmZvckVhY2goZnVuY3Rpb24obil7U25bbl09ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD8oImNvbXBvbmVudCI9PT1uJiZ1KHQpJiYodC5uYW1lPXQubmFtZXx8ZSx0PXRoaXMub3B0aW9ucy5fYmFzZS5leHRlbmQodCkpLCJkaXJlY3RpdmUiPT09biYmImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PXtiaW5kOnQsdXBkYXRlOnR9KSx0aGlzLm9wdGlvbnNbbisicyJdW2VdPXQpOnRoaXMub3B0aW9uc1tuKyJzIl1bZV19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGduLnByb3RvdHlwZSwiJGlzU2VydmVyIix7Z2V0Okt9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZ24ucHJvdG90eXBlLCIkc3NyQ29udGV4dCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiR2bm9kZSYmdGhpcy4kdm5vZGUuc3NyQ29udGV4dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZ24sIkZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0Iix7dmFsdWU6YnR9KSxnbi52ZXJzaW9uPSIyLjYuMTEiO3ZhciBPbj0xO2Z1bmN0aW9uIEVuKCl7cmV0dXJuKE9uKyspLnRvU3RyaW5nKCl9dmFyIEluPWZ1bmN0aW9uKCl7dGhpcy5ub2RlSWQ9RW4oKSx0aGlzLnJlZj10aGlzLm5vZGVJZCx0aGlzLmNoaWxkcmVuPVtdLHRoaXMucHVyZUNoaWxkcmVuPVtdLHRoaXMucGFyZW50Tm9kZT1udWxsLHRoaXMubmV4dFNpYmxpbmc9bnVsbCx0aGlzLnByZXZpb3VzU2libGluZz1udWxsfTtJbi5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuXyR2ZCYmdGhpcy5fJHZkLnJlbW92ZUVsZW1lbnQodGhpcyksdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuZGVzdHJveSgpfSl9O3ZhciBBbj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKSx0aGlzLm5vZGVUeXBlPTgsdGhpcy5ub2RlSWQ9RW4oKSx0aGlzLnJlZj10aGlzLm5vZGVJZCx0aGlzLnR5cGU9ImNvbW1lbnQiLHRoaXMudmFsdWU9ZSx0aGlzLmNoaWxkcmVuPVtdLHRoaXMucHVyZUNoaWxkcmVuPVtdfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksKChlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSkuY29uc3RydWN0b3I9ZSkucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIlx4M2MhLS0gIit0aGlzLnZhbHVlKyIgLS1ceDNlIn0sZX0oSW4pO2Z1bmN0aW9uICRuKGUsdCxuKXt2YXIgcj1lLmRvY3VtZW50RWxlbWVudDtpZighKDA8ci5wdXJlQ2hpbGRyZW4ubGVuZ3RofHx0LnBhcmVudE5vZGUpKXt2YXIgaT1yLmNoaWxkcmVuLG89aS5pbmRleE9mKG4pO288MD9pLnB1c2godCk6aS5zcGxpY2UobywwLHQpLDE9PT10Lm5vZGVUeXBlPygiYm9keSI9PT10LnJvbGU/KHQuZG9jSWQ9ZS5pZCx0Lm93bmVyRG9jdW1lbnQ9ZSx0LnBhcmVudE5vZGU9cik6KHQuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlKXtlLnBhcmVudE5vZGU9dH0pLFBuKGUsdCksdC5kb2NJZD1lLmlkLHQub3duZXJEb2N1bWVudD1lKSxNbih0LHIpLHIucHVyZUNoaWxkcmVuLnB1c2godCkpOnQucGFyZW50Tm9kZT1yfX1mdW5jdGlvbiBQbihlLHQpe3Qucm9sZT0iYm9keSIsdC5kZXB0aD0xLHQucmVmPSJfcm9vdCIsZS5ib2R5PXR9ZnVuY3Rpb24gTW4odCxlKXsodC5wYXJlbnROb2RlPWUpLmRvY0lkJiYodC5kb2NJZD1lLmRvY0lkLHQub3duZXJEb2N1bWVudD1lLm93bmVyRG9jdW1lbnQsdC5kZXB0aD1lLmRlcHRoKzEpLHQuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlKXtNbihlLHQpfSl9ZnVuY3Rpb24gam4oZSl7Zm9yKDtlOyl7aWYoMT09PWUubm9kZVR5cGUpcmV0dXJuIGU7ZT1lLm5leHRTaWJsaW5nfX1mdW5jdGlvbiBMbihlKXtmb3IoO2U7KXtpZigxPT09ZS5ub2RlVHlwZSlyZXR1cm4gZTtlPWUucHJldmlvdXNTaWJsaW5nfX1mdW5jdGlvbiBCbihlLHQsbixyKXtuPDAmJihuPTApO3ZhciBpPXRbbi0xXSxvPXRbbl07cmV0dXJuIHQuc3BsaWNlKG4sMCxlKSxyJiYoaSYmKGkubmV4dFNpYmxpbmc9ZSksZS5wcmV2aW91c1NpYmxpbmc9aSwoZS5uZXh0U2libGluZz1vKSYmKG8ucHJldmlvdXNTaWJsaW5nPWUpKSxufWZ1bmN0aW9uIE5uKGUsdCxuLHIpe3ZhciBpPXQuaW5kZXhPZihlKTtpZihpPDApcmV0dXJuLTE7aWYocil7dmFyIG89dFtpLTFdLGE9dFtpKzFdO28mJihvLm5leHRTaWJsaW5nPWEpLGEmJihhLnByZXZpb3VzU2libGluZz1vKX10LnNwbGljZShpLDEpO3ZhciBzPW47aTw9biYmKHM9bi0xKTt2YXIgYz10W3MtMV0sdT10W3NdO3JldHVybiB0LnNwbGljZShzLDAsZSksciYmKGMmJihjLm5leHRTaWJsaW5nPWUpLGUucHJldmlvdXNTaWJsaW5nPWMsKGUubmV4dFNpYmxpbmc9dSkmJih1LnByZXZpb3VzU2libGluZz1lKSksaT09PXM/LTE6bn1mdW5jdGlvbiBEbihlLHQsbil7dmFyIHI9dC5pbmRleE9mKGUpO2lmKCEocjwwKSl7aWYobil7dmFyIGk9dFtyLTFdLG89dFtyKzFdO2kmJihpLm5leHRTaWJsaW5nPW8pLG8mJihvLnByZXZpb3VzU2libGluZz1pKX10LnNwbGljZShyLDEpfX12YXIgUm49ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2b2lkIDA9PT1lJiYoZT0idmlldyIpLHQuY2FsbCh0aGlzKSx0aGlzLm5vZGVUeXBlPTEsdGhpcy5ub2RlSWQ9RW4oKSx0aGlzLnJlZj10aGlzLm5vZGVJZCx0aGlzLnR5cGU9ZSx0aGlzLmF0dHI9e30sdGhpcy5ldmVudHM9e30sdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnB1cmVDaGlsZHJlbj1bXX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLCgoZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWUpLnByb3RvdHlwZS5zZXRBdHRyaWJ1dGU9ZnVuY3Rpb24oZSx0KXsiY2lkIj09PWU/dGhpcy5jaWQ9dDoibmlkIj09PWUmJih0aGlzLm5pZD10KX0sZS5wcm90b3R5cGUuZGlzcGF0Y2hFdmVudD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZXZlbnRzW2VdO24mJm4uZm9yRWFjaChmdW5jdGlvbihlKXtlKHQpfSl9LGUucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oZSx0KXtpZigiIj09PXRoaXMuY2lkfHwiIj09PXRoaXMubmlkKXJldHVybiBjb25zb2xlLmVycm9yKCJjaWQ9Iit0aGlzLmNpZCsiLG5pZD0iK3RoaXMubmlkKyIgYWRkRXZlbnRMaXN0ZW5lcigiK2UrIikgbm90IGZvdW5kIik7KHRoaXMuZXZlbnRzW2VdfHwodGhpcy5ldmVudHNbZV09W10pKS5wdXNoKHQpLHRoaXMuXyR2ZC5hZGRFbGVtZW50KHRoaXMpfSxlLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztpZigiIj09PXRoaXMuY2lkfHwiIj09PXRoaXMubmlkKXJldHVybiBjb25zb2xlLmVycm9yKCJjaWQ9Iit0aGlzLmNpZCsiLG5pZD0iK3RoaXMubmlkKyIgcmVtb3ZlRXZlbnRMaXN0ZW5lcigiK2UrIikgbm90IGZvdW5kIik7dmFyIHI9ITE7aWYodGhpcy5ldmVudHNbZV0pe3ZhciBpPXRoaXMuZXZlbnRzW2VdLmluZGV4T2YodCk7LTEhPT1pJiYodGhpcy5ldmVudHNbZV0uc3BsaWNlKGksMSkscj0hMCl9cnx8Y29uc29sZS5lcnJvcigiY2lkPSIrdGhpcy5jaWQrIixuaWQ9Iit0aGlzLm5pZCsiIHJlbW92ZUV2ZW50TGlzdGVuZXIoIitlKyIpIGhhbmRsZXIgbm90IGZvdW5kIiksT2JqZWN0LmtleXModGhpcy5ldmVudHMpLmV2ZXJ5KGZ1bmN0aW9uKGUpe3JldHVybiAwPT09bi5ldmVudHNbZV0ubGVuZ3RofSkmJnRoaXMuXyR2ZC5yZW1vdmVFbGVtZW50KHRoaXMpfSxlLnByb3RvdHlwZS5hcHBlbmRDaGlsZD1mdW5jdGlvbihlKXtlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZSE9PXRoaXN8fChlLnBhcmVudE5vZGU/KE5uKGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmxlbmd0aCwhMCksMT09PWUubm9kZVR5cGUmJk5uKGUsdGhpcy5wdXJlQ2hpbGRyZW4sdGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKSk6KE1uKGUsdGhpcyksQm4oZSx0aGlzLmNoaWxkcmVuLHRoaXMuY2hpbGRyZW4ubGVuZ3RoLCEwKSwxPT09ZS5ub2RlVHlwZSYmQm4oZSx0aGlzLnB1cmVDaGlsZHJlbix0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgpKSl9LGUucHJvdG90eXBlLmluc2VydEJlZm9yZT1mdW5jdGlvbihlLHQpe2lmKCEoZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUhPT10aGlzfHxlPT09dHx8ZS5uZXh0U2libGluZyYmZS5uZXh0U2libGluZz09PXQpKWlmKGUucGFyZW50Tm9kZSl7aWYoTm4oZSx0aGlzLmNoaWxkcmVuLHRoaXMuY2hpbGRyZW4uaW5kZXhPZih0KSwhMCksMT09PWUubm9kZVR5cGUpe3ZhciBuPWpuKHQpO05uKGUsdGhpcy5wdXJlQ2hpbGRyZW4sbj90aGlzLnB1cmVDaGlsZHJlbi5pbmRleE9mKG4pOnRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCl9fWVsc2UgaWYoTW4oZSx0aGlzKSxCbihlLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKHQpLCEwKSwxPT09ZS5ub2RlVHlwZSl7dmFyIHI9am4odCk7Qm4oZSx0aGlzLnB1cmVDaGlsZHJlbixyP3RoaXMucHVyZUNoaWxkcmVuLmluZGV4T2Yocik6dGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKX19LGUucHJvdG90eXBlLmluc2VydEFmdGVyPWZ1bmN0aW9uKGUsdCl7ZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUhPT10aGlzfHxlPT09dHx8ZS5wcmV2aW91c1NpYmxpbmcmJmUucHJldmlvdXNTaWJsaW5nPT09dHx8KGUucGFyZW50Tm9kZT8oTm4oZSx0aGlzLmNoaWxkcmVuLHRoaXMuY2hpbGRyZW4uaW5kZXhPZih0KSsxLCEwKSwxPT09ZS5ub2RlVHlwZSYmTm4oZSx0aGlzLnB1cmVDaGlsZHJlbix0aGlzLnB1cmVDaGlsZHJlbi5pbmRleE9mKExuKHQpKSsxKSk6KE1uKGUsdGhpcyksQm4oZSx0aGlzLmNoaWxkcmVuLHRoaXMuY2hpbGRyZW4uaW5kZXhPZih0KSsxLCEwKSwxPT09ZS5ub2RlVHlwZSYmQm4oZSx0aGlzLnB1cmVDaGlsZHJlbix0aGlzLnB1cmVDaGlsZHJlbi5pbmRleE9mKExuKHQpKSsxKSkpfSxlLnByb3RvdHlwZS5yZW1vdmVDaGlsZD1mdW5jdGlvbihlLHQpe2UucGFyZW50Tm9kZSYmKERuKGUsdGhpcy5jaGlsZHJlbiwhMCksMT09PWUubm9kZVR5cGUmJkRuKGUsdGhpcy5wdXJlQ2hpbGRyZW4pKSx0fHxlLmRlc3Ryb3koKX0sZS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5kZXN0cm95KCl9KSx0aGlzLmNoaWxkcmVuLmxlbmd0aD0wLHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aD0wfSxlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiI8Iit0aGlzLnR5cGUrIiBhdHRyPSIrSlNPTi5zdHJpbmdpZnkodGhpcy5hdHRyKSsiIHN0eWxlPSIrSlNPTi5zdHJpbmdpZnkodGhpcy50b1N0eWxlKCkpKyI+Iit0aGlzLnB1cmVDaGlsZHJlbi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9TdHJpbmcoKX0pLmpvaW4oIiIpKyI8LyIrdGhpcy50eXBlKyI+In0sZX0oSW4pLEZuPWZ1bmN0aW9uKGUsdCl7dGhpcy5pZD1lP2UudG9TdHJpbmcoKToiIix0aGlzLlVSTD10LHRoaXMuY3JlYXRlRG9jdW1lbnRFbGVtZW50KCl9O0ZuLnByb3RvdHlwZS5jcmVhdGVEb2N1bWVudEVsZW1lbnQ9ZnVuY3Rpb24oKXt2YXIgbj10aGlzO2lmKCF0aGlzLmRvY3VtZW50RWxlbWVudCl7dmFyIGU9bmV3IFJuKCJkb2N1bWVudCIpO2UuZG9jSWQ9dGhpcy5pZCxlLm93bmVyRG9jdW1lbnQ9dGhpcyxlLnJvbGU9ImRvY3VtZW50RWxlbWVudCIsZS5kZXB0aD0wLGUucmVmPSJfZG9jdW1lbnRFbGVtZW50Iix0aGlzLmRvY3VtZW50RWxlbWVudD1lLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJhcHBlbmRDaGlsZCIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmZ1bmN0aW9uKGUpeyRuKG4sZSl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImluc2VydEJlZm9yZSIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmZ1bmN0aW9uKGUsdCl7JG4obixlLHQpfX0pfXJldHVybiB0aGlzLmRvY3VtZW50RWxlbWVudH0sRm4ucHJvdG90eXBlLmNyZWF0ZUJvZHk9ZnVuY3Rpb24oZSl7dGhpcy5ib2R5fHxQbih0aGlzLG5ldyBSbihlKSk7cmV0dXJuIHRoaXMuYm9keX0sRm4ucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBSbihlKX0sRm4ucHJvdG90eXBlLmNyZWF0ZUNvbW1lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBBbihlKX0sRm4ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt9O3ZhciB6bj1zKCJzdHlsZSxjbGFzcyIpLFZuPShzKCJpbnB1dCx0ZXh0YXJlYSxvcHRpb24sc2VsZWN0LHByb2dyZXNzIikscygiY29udGVudGVkaXRhYmxlLGRyYWdnYWJsZSxzcGVsbGNoZWNrIikscygiZXZlbnRzLGNhcmV0LHR5cGluZyxwbGFpbnRleHQtb25seSIpLHMoImFsbG93ZnVsbHNjcmVlbixhc3luYyxhdXRvZm9jdXMsYXV0b3BsYXksY2hlY2tlZCxjb21wYWN0LGNvbnRyb2xzLGRlY2xhcmUsZGVmYXVsdCxkZWZhdWx0Y2hlY2tlZCxkZWZhdWx0bXV0ZWQsZGVmYXVsdHNlbGVjdGVkLGRlZmVyLGRpc2FibGVkLGVuYWJsZWQsZm9ybW5vdmFsaWRhdGUsaGlkZGVuLGluZGV0ZXJtaW5hdGUsaW5lcnQsaXNtYXAsaXRlbXNjb3BlLGxvb3AsbXVsdGlwbGUsbXV0ZWQsbm9ocmVmLG5vcmVzaXplLG5vc2hhZGUsbm92YWxpZGF0ZSxub3dyYXAsb3BlbixwYXVzZW9uZXhpdCxyZWFkb25seSxyZXF1aXJlZCxyZXZlcnNlZCxzY29wZWQsc2VhbWxlc3Msc2VsZWN0ZWQsc29ydGFibGUsdHJhbnNsYXRlLHRydWVzcGVlZCx0eXBlbXVzdG1hdGNoLHZpc2libGUiKSxzKCJodG1sLGJvZHksYmFzZSxoZWFkLGxpbmssbWV0YSxzdHlsZSx0aXRsZSxhZGRyZXNzLGFydGljbGUsYXNpZGUsZm9vdGVyLGhlYWRlcixoMSxoMixoMyxoNCxoNSxoNixoZ3JvdXAsbmF2LHNlY3Rpb24sZGl2LGRkLGRsLGR0LGZpZ2NhcHRpb24sZmlndXJlLHBpY3R1cmUsaHIsaW1nLGxpLG1haW4sb2wscCxwcmUsdWwsYSxiLGFiYnIsYmRpLGJkbyxicixjaXRlLGNvZGUsZGF0YSxkZm4sZW0saSxrYmQsbWFyayxxLHJwLHJ0LHJ0YyxydWJ5LHMsc2FtcCxzbWFsbCxzcGFuLHN0cm9uZyxzdWIsc3VwLHRpbWUsdSx2YXIsd2JyLGFyZWEsYXVkaW8sbWFwLHRyYWNrLHZpZGVvLGVtYmVkLG9iamVjdCxwYXJhbSxzb3VyY2UsY2FudmFzLHNjcmlwdCxub3NjcmlwdCxkZWwsaW5zLGNhcHRpb24sY29sLGNvbGdyb3VwLHRhYmxlLHRoZWFkLHRib2R5LHRkLHRoLHRyLGJ1dHRvbixkYXRhbGlzdCxmaWVsZHNldCxmb3JtLGlucHV0LGxhYmVsLGxlZ2VuZCxtZXRlcixvcHRncm91cCxvcHRpb24sb3V0cHV0LHByb2dyZXNzLHNlbGVjdCx0ZXh0YXJlYSxkZXRhaWxzLGRpYWxvZyxtZW51LG1lbnVpdGVtLHN1bW1hcnksY29udGVudCxlbGVtZW50LHNoYWRvdyx0ZW1wbGF0ZSxibG9ja3F1b3RlLGlmcmFtZSx0Zm9vdCIpKTt2YXIgVW49T2JqZWN0LmZyZWV6ZSh7Y3JlYXRlRWxlbWVudDpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IFJuKGUpfSxjcmVhdGVFbGVtZW50TlM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IFJuKGUrIjoiK3QpfSxjcmVhdGVUZXh0Tm9kZTpmdW5jdGlvbigpe3JldHVybiBuZXcgUm4oInRleHQiKX0sY3JlYXRlQ29tbWVudDpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IEFuKGUpfSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24oZSx0LG4pe2UuaW5zZXJ0QmVmb3JlKHQsbil9LHJlbW92ZUNoaWxkOmZ1bmN0aW9uKGUsdCl7ZS5yZW1vdmVDaGlsZCh0KX0sYXBwZW5kQ2hpbGQ6ZnVuY3Rpb24oZSx0KXtlLmFwcGVuZENoaWxkKHQpfSxwYXJlbnROb2RlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnBhcmVudE5vZGV9LG5leHRTaWJsaW5nOmZ1bmN0aW9uKGUpe3JldHVybiBlLm5leHRTaWJsaW5nfSx0YWdOYW1lOmZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGV9LHNldFRleHRDb250ZW50OmZ1bmN0aW9uKCl7fSxzZXRTdHlsZVNjb3BlOmZ1bmN0aW9uKCl7fX0pLHFuPXtjcmVhdGU6ZnVuY3Rpb24oZSx0KXtXbih0KX0sdXBkYXRlOmZ1bmN0aW9uKGUsdCl7ZS5kYXRhLnJlZiE9PXQuZGF0YS5yZWYmJihXbihlLCEwKSxXbih0KSl9LGRlc3Ryb3k6ZnVuY3Rpb24oZSl7V24oZSwhMCl9fTtmdW5jdGlvbiBXbihlLHQpe3ZhciBuPWUuZGF0YS5yZWY7aWYoSShuKSl7dmFyIHI9ZS5jb250ZXh0LGk9ZS5jb21wb25lbnRJbnN0YW5jZXx8ZS5lbG0sbz1yLiRyZWZzO3Q/QXJyYXkuaXNBcnJheShvW25dKT9iKG9bbl0saSk6b1tuXT09PWkmJihvW25dPXZvaWQgMCk6ZS5kYXRhLnJlZkluRm9yP0FycmF5LmlzQXJyYXkob1tuXSk/b1tuXS5pbmRleE9mKGkpPDAmJm9bbl0ucHVzaChpKTpvW25dPVtpXTpvW25dPWl9fXMoImh0bWwsYm9keSxiYXNlLGhlYWQsbGluayxtZXRhLHN0eWxlLHRpdGxlLGFkZHJlc3MsYXJ0aWNsZSxhc2lkZSxmb290ZXIsaGVhZGVyLGgxLGgyLGgzLGg0LGg1LGg2LGhncm91cCxuYXYsc2VjdGlvbixkaXYsZGQsZGwsZHQsZmlnY2FwdGlvbixmaWd1cmUscGljdHVyZSxocixpbWcsbGksbWFpbixvbCxwLHByZSx1bCxhLGIsYWJicixiZGksYmRvLGJyLGNpdGUsY29kZSxkYXRhLGRmbixlbSxpLGtiZCxtYXJrLHEscnAscnQscnRjLHJ1YnkscyxzYW1wLHNtYWxsLHNwYW4sc3Ryb25nLHN1YixzdXAsdGltZSx1LHZhcix3YnIsYXJlYSxhdWRpbyxtYXAsdHJhY2ssdmlkZW8sZW1iZWQsb2JqZWN0LHBhcmFtLHNvdXJjZSxjYW52YXMsc2NyaXB0LG5vc2NyaXB0LGRlbCxpbnMsY2FwdGlvbixjb2wsY29sZ3JvdXAsdGFibGUsdGhlYWQsdGJvZHksdGQsdGgsdHIsYnV0dG9uLGRhdGFsaXN0LGZpZWxkc2V0LGZvcm0saW5wdXQsbGFiZWwsbGVnZW5kLG1ldGVyLG9wdGdyb3VwLG9wdGlvbixvdXRwdXQscHJvZ3Jlc3Msc2VsZWN0LHRleHRhcmVhLGRldGFpbHMsZGlhbG9nLG1lbnUsbWVudWl0ZW0sc3VtbWFyeSxjb250ZW50LGVsZW1lbnQsc2hhZG93LHRlbXBsYXRlLGJsb2NrcXVvdGUsaWZyYW1lLHRmb290Iikscygic3ZnLGFuaW1hdGUsY2lyY2xlLGNsaXBwYXRoLGN1cnNvcixkZWZzLGRlc2MsZWxsaXBzZSxmaWx0ZXIsZm9udC1mYWNlLGZvcmVpZ25PYmplY3QsZyxnbHlwaCxpbWFnZSxsaW5lLG1hcmtlcixtYXNrLG1pc3NpbmctZ2x5cGgscGF0aCxwYXR0ZXJuLHBvbHlnb24scG9seWxpbmUscmVjdCxzd2l0Y2gsc3ltYm9sLHRleHQsdGV4dHBhdGgsdHNwYW4sdXNlLHZpZXciLCEwKTt2YXIgSG49cygidGV4dCxudW1iZXIscGFzc3dvcmQsc2VhcmNoLGVtYWlsLHRlbCx1cmwiKSxHbj1uZXcgc2UoIiIse30sW10pLFhuPVsiY3JlYXRlIiwiYWN0aXZhdGUiLCJ1cGRhdGUiLCJyZW1vdmUiLCJkZXN0cm95Il07ZnVuY3Rpb24gWW4oZSx0KXtyZXR1cm4gZS5rZXk9PT10LmtleSYmKGUudGFnPT09dC50YWcmJmUuaXNDb21tZW50PT09dC5pc0NvbW1lbnQmJkkoZS5kYXRhKT09PUkodC5kYXRhKSYmZnVuY3Rpb24oZSx0KXtpZigiaW5wdXQiIT09ZS50YWcpcmV0dXJuITA7dmFyIG4scj1JKG49ZS5kYXRhKSYmSShuPW4uYXR0cnMpJiZuLnR5cGUsaT1JKG49dC5kYXRhKSYmSShuPW4uYXR0cnMpJiZuLnR5cGU7cmV0dXJuIHI9PT1pfHxIbihyKSYmSG4oaSl9KGUsdCl8fEEoZS5pc0FzeW5jUGxhY2Vob2xkZXIpJiZlLmFzeW5jRmFjdG9yeT09PXQuYXN5bmNGYWN0b3J5JiZFKHQuYXN5bmNGYWN0b3J5LmVycm9yKSl9ZnVuY3Rpb24gSm4oZSx0LG4pe3ZhciByLGksbz17fTtmb3Iocj10O3I8PW47KytyKUkoaT1lW3JdLmtleSkmJihvW2ldPXIpO3JldHVybiBvfXZhciBLbj17Y3JlYXRlOlpuLHVwZGF0ZTpabixkZXN0cm95OmZ1bmN0aW9uKGUpe1puKGUsR24pfX07ZnVuY3Rpb24gWm4oZSx0KXsoZS5kYXRhLmRpcmVjdGl2ZXN8fHQuZGF0YS5kaXJlY3RpdmVzKSYmZnVuY3Rpb24odCxuKXt2YXIgZSxyLGksbz10PT09R24sYT1uPT09R24scz1lcih0LmRhdGEuZGlyZWN0aXZlcyx0LmNvbnRleHQpLGM9ZXIobi5kYXRhLmRpcmVjdGl2ZXMsbi5jb250ZXh0KSx1PVtdLGw9W107Zm9yKGUgaW4gYylyPXNbZV0saT1jW2VdLHI/KGkub2xkVmFsdWU9ci52YWx1ZSxpLm9sZEFyZz1yLmFyZyx0cihpLCJ1cGRhdGUiLG4sdCksaS5kZWYmJmkuZGVmLmNvbXBvbmVudFVwZGF0ZWQmJmwucHVzaChpKSk6KHRyKGksImJpbmQiLG4sdCksaS5kZWYmJmkuZGVmLmluc2VydGVkJiZ1LnB1c2goaSkpO2lmKHUubGVuZ3RoKXt2YXIgZD1mdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8dS5sZW5ndGg7ZSsrKXRyKHVbZV0sImluc2VydGVkIixuLHQpfTtvP1hlKG4sImluc2VydCIsZCk6ZCgpfWwubGVuZ3RoJiZYZShuLCJwb3N0cGF0Y2giLGZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTxsLmxlbmd0aDtlKyspdHIobFtlXSwiY29tcG9uZW50VXBkYXRlZCIsbix0KX0pO2lmKCFvKWZvcihlIGluIHMpY1tlXXx8dHIoc1tlXSwidW5iaW5kIix0LHQsYSl9KGUsdCl9dmFyIFFuPU9iamVjdC5jcmVhdGUobnVsbCk7ZnVuY3Rpb24gZXIoZSx0KXt2YXIgbixyLGksbz1PYmplY3QuY3JlYXRlKG51bGwpO2lmKCFlKXJldHVybiBvO2ZvcihuPTA7bjxlLmxlbmd0aDtuKyspKHI9ZVtuXSkubW9kaWZpZXJzfHwoci5tb2RpZmllcnM9UW4pLChvWyhpPXIsaS5yYXdOYW1lfHxpLm5hbWUrIi4iK09iamVjdC5rZXlzKGkubW9kaWZpZXJzfHx7fSkuam9pbigiLiIpKV09cikuZGVmPUllKHQuJG9wdGlvbnMsImRpcmVjdGl2ZXMiLHIubmFtZSk7cmV0dXJuIG99ZnVuY3Rpb24gdHIodCxuLHIsZSxpKXt2YXIgbz10LmRlZiYmdC5kZWZbbl07aWYobyl0cnl7byhyLmVsbSx0LHIsZSxpKX1jYXRjaChlKXtqZShlLHIuY29udGV4dCwiZGlyZWN0aXZlICIrdC5uYW1lKyIgIituKyIgaG9vayIpfX1mdW5jdGlvbiBucihlLG4pe2lmKCFFKGUuZGF0YS53eHNQcm9wcyl8fCFFKG4uZGF0YS53eHNQcm9wcykpe3ZhciByPWUuJHd4c1dhdGNoZXMsdD1PYmplY3Qua2V5cyhuLmRhdGEud3hzUHJvcHMpO2lmKHJ8fHQubGVuZ3RoKXtyfHwocj17fSk7dmFyIGk9bi5kYXRhLnd4c1Byb3BzO24uJHd4c1dhdGNoZXM9e30sT2JqZWN0LmtleXMoaSkuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1pW2VdO24uJHd4c1dhdGNoZXNbZV09cltlXXx8bi5jb250ZXh0LiR3YXRjaCh0LGZ1bmN0aW9uKCl7dGhpcy4kZm9yY2VVcGRhdGUoKX0se2ltbWVkaWF0ZTohMCxkZWVwOiEwfSl9KSxPYmplY3Qua2V5cyhyKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe24uJHd4c1dhdGNoZXNbZV18fChyW2VdKCksZGVsZXRlIHJbZV0pfSl9fX1mdW5jdGlvbiBycihlLHQpe3ZhciBuPXQuZGF0YS5hdHRycztpZighRShuKSYmIUUobi5faSkpe3ZhciByLGksbz10LmVsbTtvLmRhdGFzZXQ9T2JqZWN0LmFzc2lnbihvLmRhdGFzZXR8fHt9LChyPW4saT1PYmplY3QuY3JlYXRlKG51bGwpLE9iamVjdC5rZXlzKHIpLmZvckVhY2goZnVuY3Rpb24odCl7aWYoMD09PXQuaW5kZXhPZigiZGF0YS0iKSl7dmFyIG49aCh0LnJlcGxhY2UoImRhdGEtIiwiIikpO3RyeXtpW25dPUpTT04ucGFyc2Uoclt0XSl9Y2F0Y2goZSl7aVtuXT1yW3RdfX19KSxpKSl9fXZhciBpcixvcj0iX19yIixhcj0iX19jIjtmdW5jdGlvbiBzcih0LG4scil7dmFyIGk9aXI7cmV0dXJuIGZ1bmN0aW9uIGUoKXtudWxsIT09bi5hcHBseShudWxsLGFyZ3VtZW50cykmJnVyKHQsZSxyLGkpfX1mdW5jdGlvbiBjcihlLHQpe2lyLmFkZEV2ZW50TGlzdGVuZXIoZSx0KX1mdW5jdGlvbiB1cihlLHQsbixyKXt0JiYocnx8aXIpLnJlbW92ZUV2ZW50TGlzdGVuZXIoZSx0Ll93cmFwcGVyfHx0KX1mdW5jdGlvbiBscihlLHQpe2lmKCFFKGUuZGF0YS5vbil8fCFFKHQuZGF0YS5vbikpe3ZhciBuPXQuZGF0YS5vbnx8e30scj1lLmRhdGEub258fHt9Oyhpcj10LmVsbSkuXyR2ZD10LmNvbnRleHQuXyR2ZDtmb3IodmFyIGk9dC5jb250ZXh0LG89KHQuZGF0YS5hdHRyc3x8e30pLl9pLGE9dC5wYXJlbnQ7YSYmYS5jb21wb25lbnRJbnN0YW5jZTspe3ZhciBzPWEuZGF0YS5hdHRycyYmYS5kYXRhLmF0dHJzLl9pO0kocykmJihvPSJyLSIrcyksYT1hLnBhcmVudH1pci5zZXRBdHRyaWJ1dGUoIm5pZCIsU3RyaW5nKG8pKSxpci5zZXRBdHRyaWJ1dGUoImNpZCIsaS5fJGlkKSxmdW5jdGlvbihlKXtJKGVbb3JdKSYmKGUuaW5wdXQ9W10uY29uY2F0KGVbb3JdLGUuaW5wdXR8fFtdKSxkZWxldGUgZVtvcl0pO0koZVthcl0pJiYoZS5jaGFuZ2U9W10uY29uY2F0KGVbYXJdLGUuY2hhbmdlfHxbXSksZGVsZXRlIGVbYXJdKX0obiksR2UobixyLGNyLHVyLHNyLHQuY29udGV4dCksaXI9dm9pZCAwfX12YXIgZHI9ZnVuY3Rpb24oZSl7dmFyIHIsdCxnPXt9LG49ZS5tb2R1bGVzLG09ZS5ub2RlT3BzO2ZvcihyPTA7cjxYbi5sZW5ndGg7KytyKWZvcihnW1huW3JdXT1bXSx0PTA7dDxuLmxlbmd0aDsrK3QpSShuW3RdW1huW3JdXSkmJmdbWG5bcl1dLnB1c2goblt0XVtYbltyXV0pO2Z1bmN0aW9uIG8oZSl7dmFyIHQ9bS5wYXJlbnROb2RlKGUpO0kodCkmJm0ucmVtb3ZlQ2hpbGQodCxlKX1mdW5jdGlvbiB5KGUsdCxuLHIsaSxvLGEpe2lmKEkoZS5lbG0pJiZJKG8pJiYoZT1vW2FdPWRlKGUpKSxlLmlzUm9vdEluc2VydD0haSwhZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9ZS5kYXRhO2lmKEkoaSkpe3ZhciBvPUkoZS5jb21wb25lbnRJbnN0YW5jZSkmJmkua2VlcEFsaXZlO2lmKEkoaT1pLmhvb2spJiZJKGk9aS5pbml0KSYmaShlLCExKSxJKGUuY29tcG9uZW50SW5zdGFuY2UpKXJldHVybiBwKGUsdCksbChuLGUuZWxtLHIpLEEobykmJmZ1bmN0aW9uKGUsdCxuLHIpe2Zvcih2YXIgaSxvPWU7by5jb21wb25lbnRJbnN0YW5jZTspaWYobz1vLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSxJKGk9by5kYXRhKSYmSShpPWkudHJhbnNpdGlvbikpe2ZvcihpPTA7aTxnLmFjdGl2YXRlLmxlbmd0aDsrK2kpZy5hY3RpdmF0ZVtpXShHbixvKTt0LnB1c2gobyk7YnJlYWt9bChuLGUuZWxtLHIpfShlLHQsbixyKSwhMH19KGUsdCxuLHIpKXt2YXIgcz1lLmRhdGEsYz1lLmNoaWxkcmVuLHU9ZS50YWc7SSh1KT8oZS5lbG09ZS5ucz9tLmNyZWF0ZUVsZW1lbnROUyhlLm5zLHUpOm0uY3JlYXRlRWxlbWVudCh1LGUpLGQoZSksaChlLGMsdCksSShzKSYmdihlLHQpKTpBKGUuaXNDb21tZW50KT9lLmVsbT1tLmNyZWF0ZUNvbW1lbnQoZS50ZXh0KTplLmVsbT1tLmNyZWF0ZVRleHROb2RlKGUudGV4dCksbChuLGUuZWxtLHIpfX1mdW5jdGlvbiBwKGUsdCl7SShlLmRhdGEucGVuZGluZ0luc2VydCkmJih0LnB1c2guYXBwbHkodCxlLmRhdGEucGVuZGluZ0luc2VydCksZS5kYXRhLnBlbmRpbmdJbnNlcnQ9bnVsbCksZS5lbG09ZS5jb21wb25lbnRJbnN0YW5jZS4kZWwsXyhlKT8odihlLHQpLGQoZSkpOihXbihlKSx0LnB1c2goZSkpfWZ1bmN0aW9uIGwoZSx0LG4pe0koZSkmJihJKG4pP20ucGFyZW50Tm9kZShuKT09PWUmJm0uaW5zZXJ0QmVmb3JlKGUsdCxuKTptLmFwcGVuZENoaWxkKGUsdCkpfWZ1bmN0aW9uIGgoZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKHZhciByPTA7cjx0Lmxlbmd0aDsrK3IpeSh0W3JdLG4sZS5lbG0sbnVsbCwhMCx0LHIpO2Vsc2UgYyhlLnRleHQpJiZtLmFwcGVuZENoaWxkKGUuZWxtLG0uY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGUudGV4dCkpKX1mdW5jdGlvbiBfKGUpe2Zvcig7ZS5jb21wb25lbnRJbnN0YW5jZTspZT1lLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTtyZXR1cm4gSShlLnRhZyl9ZnVuY3Rpb24gdihlLHQpe2Zvcih2YXIgbj0wO248Zy5jcmVhdGUubGVuZ3RoOysrbilnLmNyZWF0ZVtuXShHbixlKTtJKHI9ZS5kYXRhLmhvb2spJiYoSShyLmNyZWF0ZSkmJnIuY3JlYXRlKEduLGUpLEkoci5pbnNlcnQpJiZ0LnB1c2goZSkpfWZ1bmN0aW9uIGQoZSl7dmFyIHQ7aWYoSSh0PWUuZm5TY29wZUlkKSltLnNldFN0eWxlU2NvcGUoZS5lbG0sdCk7ZWxzZSBmb3IodmFyIG49ZTtuOylJKHQ9bi5jb250ZXh0KSYmSSh0PXQuJG9wdGlvbnMuX3Njb3BlSWQpJiZtLnNldFN0eWxlU2NvcGUoZS5lbG0sdCksbj1uLnBhcmVudDtJKHQ9TnQpJiZ0IT09ZS5jb250ZXh0JiZ0IT09ZS5mbkNvbnRleHQmJkkodD10LiRvcHRpb25zLl9zY29wZUlkKSYmbS5zZXRTdHlsZVNjb3BlKGUuZWxtLHQpfWZ1bmN0aW9uIGIoZSx0LG4scixpLG8pe2Zvcig7cjw9aTsrK3IpeShuW3JdLG8sZSx0LCExLG4scil9ZnVuY3Rpb24gdyhlKXt2YXIgdCxuLHI9ZS5kYXRhO2lmKEkocikpZm9yKEkodD1yLmhvb2spJiZJKHQ9dC5kZXN0cm95KSYmdChlKSx0PTA7dDxnLmRlc3Ryb3kubGVuZ3RoOysrdClnLmRlc3Ryb3lbdF0oZSk7aWYoSSh0PWUuY2hpbGRyZW4pKWZvcihuPTA7bjxlLmNoaWxkcmVuLmxlbmd0aDsrK24pdyhlLmNoaWxkcmVuW25dKX1mdW5jdGlvbiBrKGUsdCxuKXtmb3IoO3Q8PW47Kyt0KXt2YXIgcj1lW3RdO0kocikmJihJKHIudGFnKT8oYShyKSx3KHIpKTpvKHIuZWxtKSl9fWZ1bmN0aW9uIGEoZSx0KXtpZihJKHQpfHxJKGUuZGF0YSkpe3ZhciBuLHIsaT1nLnJlbW92ZS5sZW5ndGgrMTtpZihJKHQpP3QubGlzdGVuZXJzKz1pOnQ9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKCl7MD09LS1uLmxpc3RlbmVycyYmbyhlKX1yZXR1cm4gbi5saXN0ZW5lcnM9dCxufShlLmVsbSxpKSxJKG49ZS5jb21wb25lbnRJbnN0YW5jZSkmJkkobj1uLl92bm9kZSkmJkkobi5kYXRhKSlhKG4sdCk7ZWxzZSBpZihJKHI9ZS5jaGlsZHJlbikpZm9yKG49MDtuPHIubGVuZ3RoO24rKylyW25dLnRhZyYmYShyW25dKTtmb3Iobj0wO248Zy5yZW1vdmUubGVuZ3RoOysrbilnLnJlbW92ZVtuXShlLHQpO0kobj1lLmRhdGEuaG9vaykmJkkobj1uLnJlbW92ZSk/bihlLHQpOnQoKX1lbHNlIG8oZS5lbG0pfWZ1bmN0aW9uIFMoZSx0LG4scil7Zm9yKHZhciBpPW47aTxyO2krKyl7dmFyIG89dFtpXTtpZihJKG8pJiZZbihlLG8pKXJldHVybiBpfX1mdW5jdGlvbiB4KGUsdCxuLHIsaSxvKXtpZihlIT09dCl7SSh0LmVsbSkmJkkocikmJih0PXJbaV09ZGUodCkpO3ZhciBhPXQuZWxtPWUuZWxtO2lmKEEoZS5pc0FzeW5jUGxhY2Vob2xkZXIpKUkodC5hc3luY0ZhY3RvcnkucmVzb2x2ZWQpP08oZS5lbG0sdCxuKTp0LmlzQXN5bmNQbGFjZWhvbGRlcj0hMDtlbHNlIGlmKEEodC5pc1N0YXRpYykmJkEoZS5pc1N0YXRpYykmJnQua2V5PT09ZS5rZXkmJihBKHQuaXNDbG9uZWQpfHxBKHQuaXNPbmNlKSkpdC5jb21wb25lbnRJbnN0YW5jZT1lLmNvbXBvbmVudEluc3RhbmNlO2Vsc2V7dmFyIHMsYz10LmRhdGE7SShjKSYmSShzPWMuaG9vaykmJkkocz1zLnByZXBhdGNoKSYmcyhlLHQpO3ZhciB1PWUuY2hpbGRyZW4sbD10LmNoaWxkcmVuO2lmKEkoYykmJl8odCkpe2ZvcihzPTA7czxnLnVwZGF0ZS5sZW5ndGg7KytzKWcudXBkYXRlW3NdKGUsdCk7SShzPWMuaG9vaykmJkkocz1zLnVwZGF0ZSkmJnMoZSx0KX1FKHQudGV4dCk/SSh1KSYmSShsKT91IT09bCYmZnVuY3Rpb24oZSx0LG4scixpKXtmb3IodmFyIG8sYSxzLGM9MCx1PTAsbD10Lmxlbmd0aC0xLGQ9dFswXSxmPXRbbF0scD1uLmxlbmd0aC0xLGg9blswXSx2PW5bcF0sZz0haTtjPD1sJiZ1PD1wOylFKGQpP2Q9dFsrK2NdOkUoZik/Zj10Wy0tbF06WW4oZCxoKT8oeChkLGgscixuLHUpLGQ9dFsrK2NdLGg9blsrK3VdKTpZbihmLHYpPyh4KGYsdixyLG4scCksZj10Wy0tbF0sdj1uWy0tcF0pOlluKGQsdik/KHgoZCx2LHIsbixwKSxnJiZtLmluc2VydEJlZm9yZShlLGQuZWxtLG0ubmV4dFNpYmxpbmcoZi5lbG0pKSxkPXRbKytjXSx2PW5bLS1wXSk6KFluKGYsaCk/KHgoZixoLHIsbix1KSxnJiZtLmluc2VydEJlZm9yZShlLGYuZWxtLGQuZWxtKSxmPXRbLS1sXSk6KEUobykmJihvPUpuKHQsYyxsKSksRShhPUkoaC5rZXkpP29baC5rZXldOlMoaCx0LGMsbCkpP3koaCxyLGUsZC5lbG0sITEsbix1KTpZbihzPXRbYV0saCk/KHgocyxoLHIsbix1KSx0W2FdPXZvaWQgMCxnJiZtLmluc2VydEJlZm9yZShlLHMuZWxtLGQuZWxtKSk6eShoLHIsZSxkLmVsbSwhMSxuLHUpKSxoPW5bKyt1XSk7bDxjP2IoZSxFKG5bcCsxXSk/bnVsbDpuW3ArMV0uZWxtLG4sdSxwLHIpOnA8dSYmayh0LGMsbCl9KGEsdSxsLG4sbyk6SShsKT8oSShlLnRleHQpJiZtLnNldFRleHRDb250ZW50KGEsIiIpLGIoYSxudWxsLGwsMCxsLmxlbmd0aC0xLG4pKTpJKHUpP2sodSwwLHUubGVuZ3RoLTEpOkkoZS50ZXh0KSYmbS5zZXRUZXh0Q29udGVudChhLCIiKTplLnRleHQhPT10LnRleHQmJm0uc2V0VGV4dENvbnRlbnQoYSx0LnRleHQpLEkoYykmJkkocz1jLmhvb2spJiZJKHM9cy5wb3N0cGF0Y2gpJiZzKGUsdCl9fX1mdW5jdGlvbiBDKGUsdCxuKXtpZihBKG4pJiZJKGUucGFyZW50KSllLnBhcmVudC5kYXRhLnBlbmRpbmdJbnNlcnQ9dDtlbHNlIGZvcih2YXIgcj0wO3I8dC5sZW5ndGg7KytyKXRbcl0uZGF0YS5ob29rLmluc2VydCh0W3JdKX12YXIgVD1zKCJhdHRycyxjbGFzcyxzdGF0aWNDbGFzcyxzdGF0aWNTdHlsZSxrZXkiKTtmdW5jdGlvbiBPKGUsdCxuLHIpe3ZhciBpLG89dC50YWcsYT10LmRhdGEscz10LmNoaWxkcmVuO2lmKHI9cnx8YSYmYS5wcmUsdC5lbG09ZSxBKHQuaXNDb21tZW50KSYmSSh0LmFzeW5jRmFjdG9yeSkpcmV0dXJuIHQuaXNBc3luY1BsYWNlaG9sZGVyPSEwO2lmKEkoYSkmJihJKGk9YS5ob29rKSYmSShpPWkuaW5pdCkmJmkodCwhMCksSShpPXQuY29tcG9uZW50SW5zdGFuY2UpKSlyZXR1cm4gcCh0LG4pLCEwO2lmKEkobykpe2lmKEkocykpaWYoZS5oYXNDaGlsZE5vZGVzKCkpaWYoSShpPWEpJiZJKGk9aS5kb21Qcm9wcykmJkkoaT1pLmlubmVySFRNTCkpe2lmKGkhPT1lLmlubmVySFRNTClyZXR1cm4hMX1lbHNle2Zvcih2YXIgYz0hMCx1PWUuZmlyc3RDaGlsZCxsPTA7bDxzLmxlbmd0aDtsKyspe2lmKCF1fHwhTyh1LHNbbF0sbixyKSl7Yz0hMTticmVha311PXUubmV4dFNpYmxpbmd9aWYoIWN8fHUpcmV0dXJuITF9ZWxzZSBoKHQscyxuKTtpZihJKGEpKXt2YXIgZD0hMTtmb3IodmFyIGYgaW4gYSlpZighVChmKSl7ZD0hMCx2KHQsbik7YnJlYWt9IWQmJmEuY2xhc3MmJnFlKGEuY2xhc3MpfX1lbHNlIGUuZGF0YSE9PXQudGV4dCYmKGUuZGF0YT10LnRleHQpO3JldHVybiEwfXJldHVybiBmdW5jdGlvbihlLHQsbixyKXtpZighRSh0KSl7dmFyIGksbz0hMSxhPVtdO2lmKEUoZSkpbz0hMCx5KHQsYSk7ZWxzZXt2YXIgcz1JKGUubm9kZVR5cGUpO2lmKCFzJiZZbihlLHQpKXgoZSx0LGEsbnVsbCxudWxsLHIpO2Vsc2V7aWYocyl7aWYoMT09PWUubm9kZVR5cGUmJmUuaGFzQXR0cmlidXRlKEwpJiYoZS5yZW1vdmVBdHRyaWJ1dGUoTCksbj0hMCksQShuKSYmTyhlLHQsYSkpcmV0dXJuIEModCxhLCEwKSxlO2k9ZSxlPW5ldyBzZShtLnRhZ05hbWUoaSkudG9Mb3dlckNhc2UoKSx7fSxbXSx2b2lkIDAsaSl9dmFyIGM9ZS5lbG0sdT1tLnBhcmVudE5vZGUoYyk7aWYoeSh0LGEsYy5fbGVhdmVDYj9udWxsOnUsbS5uZXh0U2libGluZyhjKSksSSh0LnBhcmVudCkpZm9yKHZhciBsPXQucGFyZW50LGQ9Xyh0KTtsOyl7Zm9yKHZhciBmPTA7ZjxnLmRlc3Ryb3kubGVuZ3RoOysrZilnLmRlc3Ryb3lbZl0obCk7aWYobC5lbG09dC5lbG0sZCl7Zm9yKHZhciBwPTA7cDxnLmNyZWF0ZS5sZW5ndGg7KytwKWcuY3JlYXRlW3BdKEduLGwpO3ZhciBoPWwuZGF0YS5ob29rLmluc2VydDtpZihoLm1lcmdlZClmb3IodmFyIHY9MTt2PGguZm5zLmxlbmd0aDt2KyspaC5mbnNbdl0oKX1lbHNlIFduKGwpO2w9bC5wYXJlbnR9SSh1KT9rKFtlXSwwLDApOkkoZS50YWcpJiZ3KGUpfX1yZXR1cm4gQyh0LGEsbyksdC5lbG19SShlKSYmdyhlKX19KHtub2RlT3BzOlVuLG1vZHVsZXM6W3tjcmVhdGU6bnIsdXBkYXRlOm5yfSx7Y3JlYXRlOnJyLHVwZGF0ZTpycn0se2NyZWF0ZTpscix1cGRhdGU6bHJ9XS5jb25jYXQoW3FuLEtuXSl9KSxmcj17bW9kZWw6e30sc2hvdzp7fX07ZnVuY3Rpb24gcHIoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49IiIscj0wLGk9ZS5sZW5ndGg7cjxpO3IrKylJKHQ9cHIoZVtyXSkpJiYiIiE9PXQmJihuJiYobis9IiAiKSxuKz10KTtyZXR1cm4gbn0oZSk6eShlKT9mdW5jdGlvbihlKXt2YXIgdD0iIjtmb3IodmFyIG4gaW4gZSllW25dJiYodCYmKHQrPSIgIiksdCs9bik7cmV0dXJuIHR9KGUpOiJzdHJpbmciPT10eXBlb2YgZT9lOiIifXZhciBocj1mKGZ1bmN0aW9uKGUpe3ZhciBuPXt9LHI9LzooLispLztyZXR1cm4gZS5zcGxpdCgvOyg/IVteKF0qXCkpL2cpLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9ZS5zcGxpdChyKTsxPHQubGVuZ3RoJiYoblt0WzBdLnRyaW0oKV09dFsxXS50cmltKCkpfX0pLG59KTtmdW5jdGlvbiB2cihlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9DKGUpOiJzdHJpbmciPT10eXBlb2YgZT9ocihlKTplfWZ1bmN0aW9uIGdyKGUsdCl7b2UoKTt2YXIgbixyPXRoaXMuJG9wdGlvbnNbZV0saT1lKyIgaG9vayI7aWYocilmb3IodmFyIG89MCxhPXIubGVuZ3RoO288YTtvKyspbj1MZShyW29dLHRoaXMsdD9bdF06bnVsbCx0aGlzLGkpO3JldHVybiB0aGlzLl9oYXNIb29rRXZlbnQmJnRoaXMuJGVtaXQoImhvb2s6IitlLHQpLGFlKCksbn12YXIgbXI9e2luc3RhbGw6ZnVuY3Rpb24oZSl7ZS5wcm90b3R5cGUuXyRxdWV1ZT16dCxlLnByb3RvdHlwZS5fX2NhbGxfaG9vaz1ncixlLnByb3RvdHlwZS5fJHN0cmluZ2lmeUNsYXNzPXByLGUucHJvdG90eXBlLl8kbm9ybWFsaXplU3R5bGVCaW5kaW5nPXZyfX07Z24uY29uZmlnLm11c3RVc2VQcm9wPWZ1bmN0aW9uKCl7cmV0dXJuITF9LGduLmNvbmZpZy5pc1Jlc2VydmVkVGFnPVZuLGduLmNvbmZpZy5pc1Jlc2VydmVkQXR0cj16bixnbi5jb25maWcuZ2V0VGFnTmFtZXNwYWNlPWZ1bmN0aW9uKCl7fSxnbi5jb25maWcuaXNVbmtub3duRWxlbWVudD1mdW5jdGlvbigpe3JldHVybiExfSx4KGduLm9wdGlvbnMuZGlyZWN0aXZlcyxmcikseChnbi5vcHRpb25zLmNvbXBvbmVudHMse30pLGduLnByb3RvdHlwZS5fX3BhdGNoX189ZHIsZ24ucHJvdG90eXBlLiRtb3VudD1mdW5jdGlvbihlLHQpe2lmKCJwYWdlIj09PXRoaXMuJG9wdGlvbnMubXBUeXBlKXt2YXIgbj1uZXcgRm4odGhpcy4kb3B0aW9ucy5wYWdlSWQsdGhpcy4kb3B0aW9ucy5wYWdlUGF0aCk7KGU9bi5jcmVhdGVDb21tZW50KCJyb290IikpLmhhc0F0dHJpYnV0ZT1lLnJlbW92ZUF0dHJpYnV0ZT1mdW5jdGlvbigpe30sbi5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoZSl9cmV0dXJuIGk9ZSxvPXQsKHI9dGhpcykuJGVsPWksci4kb3B0aW9ucy5yZW5kZXJ8fChyLiRvcHRpb25zLnJlbmRlcj11ZSksRnQociwiYmVmb3JlTW91bnQiKSxuZXcgS3QocixmdW5jdGlvbigpe3IuX3VwZGF0ZShyLl9yZW5kZXIoKSxvKX0sVCx7YmVmb3JlOmZ1bmN0aW9uKCl7ci5faXNNb3VudGVkJiYhci5faXNEZXN0cm95ZWQmJkZ0KHIsImJlZm9yZVVwZGF0ZSIpfX0sITApLG89ITEsbnVsbD09ci4kdm5vZGUmJihyLl9pc01vdW50ZWQ9ITAsci5fJHZkPyhGdChyLCJvblNlcnZpY2VDcmVhdGVkIiksRnQociwib25TZXJ2aWNlQXR0YWNoZWQiKSxyLl8kdmQuYWRkTW91bnRlZFZtKHIpKTpGdChyLCJtb3VudGVkIikpLHI7dmFyIHIsaSxvfSxnbi51c2UobXIpLGUuVnVlPWdufXZhciBpc0ZpcnN0PSEwLGZyYW1ld29ya3MscnVudGltZUNvbmZpZztmdW5jdGlvbiBpbml0JDIoZSl7aWYoZS5fX3VuaUNvbmZpZyl7dmFyIHQ9ZS53ZWV4O2lzRmlyc3QmJihnbG9iYWwuV1hFbnZpcm9ubWVudC5kZXZpY2VXaWR0aD10LmNvbmZpZy5lbnYuZGV2aWNlV2lkdGgpO3ZhciBuPWUuX191bmlDb25maWcscj0id2VleCI9PT1uLm52dWVDb21waWxlcjt0LmRvY3VtZW50Ll9fJGF1dG9tYXRvcl9fPSEhbi5hdXRvbWF0b3IsdC5kb2N1bWVudC5fXyRjb21waWxlcl9fPXI/IndlZXgiOiJ1bmktYXBwIix0LmRvY3VtZW50Ll9fJHN0eWxlQ29tcGlsZXJfXz0id2VleCI9PT1uLm52dWVTdHlsZUNvbXBpbGVyPyJ3ZWV4IjoidW5pLWFwcCIsZ2xvYmFsLldYRW52aXJvbm1lbnQuZHluYW1pY1JweD0hKCFuLndpbmRvd3x8IW4ud2luZG93LmR5bmFtaWNScHgpO3ZhciBpPSJuYXRpdmUiIT09bi5yZW5kZXJlciYmLTEhPT10LmNvbmZpZy5idW5kbGVVcmwuaW5kZXhPZigiYXBwLXNlcnZpY2UuanMiKTtpZihpKXt2YXIgbz17fTt2dWVGYWN0b3J5KG8sZS5TaGFyZWRPYmplY3QpLGUuVnVlPW8uVnVlfWlmKE9iamVjdC5hc3NpZ24oZSxjcmVhdGVJbnN0YW5jZUNvbnRleHQkMShlKSksaSYmZS5WdWUudXNlKGUuX192dWVQbHVnaW4pLGRlbGV0ZSBlLl9fdnVlUGx1Z2luLCFyKXt2YXIgYT1lLnBsdXM7aWYoImlvcyI9PT1nbG9iYWwuV1hFbnZpcm9ubWVudC5wbGF0Zm9ybS50b0xvd2VyQ2FzZSgpKXt2YXIgcz1hLnNjcmVlbjtnbG9iYWwuV1hFbnZpcm9ubWVudC5kZXZpY2VXaWR0aD1zLndpZHRoLGdsb2JhbC5XWEVudmlyb25tZW50LmRldmljZUhlaWdodD1zLmhlaWdodH12YXIgYz1nbG9iYWwuV1hFbnZpcm9ubWVudCx1PWMuc2NhbGUsbD1jLmRldmljZVdpZHRoLGQ9Yy5wbGF0Zm9ybSxmPU1hdGguY2VpbChsL3UpLHA9dC5yZXF1aXJlTW9kdWxlKCJtZXRhIik7aWYoIjEiPT09dC5jb25maWcucGx1c193ZWJfaWQpe3ZhciBoPXQucmVxdWlyZU1vZHVsZSgicGx1cyIpO2guc2V0RGVmYXVsdEZvbnRTaXplJiZoLnNldERlZmF1bHRGb250U2l6ZSgxNil9ImlvcyI9PT1kLnRvTG93ZXJDYXNlKCkmJnAuc2V0Vmlld3BvcnQoe3dpZHRoOmYscm91bmRPZmZEZXZpYXRpb246ITF9KX1pfHxlLlZ1ZS51c2UodW5pQXBwLGUpfX1mdW5jdGlvbiBnZXRKU0ZNVmVyc2lvbigpe3JldHVybiIwLjI5LjYifWZ1bmN0aW9uIGNyZWF0ZVNlcnZpY2VzKGksbyxhKXt2YXIgcz1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBzLnNlcnZpY2U9T2JqZWN0LmNyZWF0ZShudWxsKSxzZXJ2aWNlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUubmFtZSxuPWUub3B0aW9ucy5jcmVhdGU7aWYobil0cnl7dmFyIHI9bihpLG8sYSk7T2JqZWN0LmFzc2lnbihzLnNlcnZpY2UsciksT2JqZWN0LmFzc2lnbihzLHIuaW5zdGFuY2UpfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoIltKUyBSdW50aW1lXSBGYWlsZWQgdG8gY3JlYXRlIHNlcnZpY2UgIit0KyIuIil9fSksZGVsZXRlIHMuc2VydmljZS5pbnN0YW5jZSxPYmplY3QuZnJlZXplKHMuc2VydmljZSksc312YXIgaW5zdGFuY2VUeXBlTWFwPXt9O2Z1bmN0aW9uIGdldEZyYW1ld29ya1R5cGUoZSl7cmV0dXJuIGluc3RhbmNlVHlwZU1hcFtlXX12YXIgU2hhcmVkT2JqZWN0PXt1aWQ6MH07ZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VDb250ZXh0KGUsdCxuKXt2b2lkIDA9PT10JiYodD17fSk7dmFyIHI9bmV3IFdlZXhJbnN0YW5jZShlLHQsbik7aW5zdGFuY2VUeXBlTWFwW2VdPSJWdWUiO3ZhciBpPXJ1bnRpbWVDb25maWcuZnJhbWV3b3Jrcy5WdWU7aWYoIWkpcmV0dXJuIG5ldyBFcnJvcignW0pTIEZyYW1ld29ya10gSW52YWxpZCBidW5kbGUgdHlwZSAiVnVlIi4nKTt2YXIgbz1jcmVhdGVTZXJ2aWNlcyhlLHt3ZWV4OnIsY29uZmlnOnQsY3JlYXRlZDpEYXRlLm5vdygpLGZyYW1ld29yazoiVnVlIixidW5kbGVUeXBlOiJWdWUifSxydW50aW1lQ29uZmlnKTtPYmplY3QuZnJlZXplKG8pO3ZhciBhPU9iamVjdC5jcmVhdGUobnVsbCk7T2JqZWN0LmFzc2lnbihhLG8se1NoYXJlZE9iamVjdDpTaGFyZWRPYmplY3Qsd2VleDpyLGdldEpTRk1WZXJzaW9uOmdldEpTRk1WZXJzaW9uLHJlcXVpcmVNb2R1bGU6ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIHIucmVxdWlyZU1vZHVsZS5hcHBseShyLGUpfSxfX1dFRVhfQ0FMTF9KQVZBU0NSSVBUX186cmVjZWl2ZVRhc2tzLHNlcnZpY2VzOm99KSxPYmplY3QuZnJlZXplKGEpO3ZhciBzPU9iamVjdC5hc3NpZ24oe30sYSk7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGkuY3JlYXRlSW5zdGFuY2VDb250ZXh0JiZPYmplY3QuYXNzaWduKHMsaS5jcmVhdGVJbnN0YW5jZUNvbnRleHQoZSxhLG4pKSxpbml0JDIocyksT2JqZWN0LmZyZWV6ZShzKSxzfWZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlKGUsdCxuLHIpe2lmKGluc3RhbmNlVHlwZU1hcFtlXSlyZXR1cm4gbmV3IEVycm9yKCdUaGUgaW5zdGFuY2UgaWQgIicrZSsnIiBoYXMgYWxyZWFkeSBiZWVuIHVzZWQhJyk7dmFyIGk9IlZ1ZSI7aW5zdGFuY2VUeXBlTWFwW2VdPWksKG49SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShufHx7fSkpKS5lbnY9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShnbG9iYWwuV1hFbnZpcm9ubWVudHx8e30pKSxuLmJ1bmRsZVR5cGU9aTt2YXIgbz1ydW50aW1lQ29uZmlnLmZyYW1ld29ya3MuVnVlO2lmKCFvKXJldHVybiBuZXcgRXJyb3IoJ1tKUyBGcmFtZXdvcmtdIEludmFsaWQgYnVuZGxlIHR5cGUgIlZ1ZSIuJyk7dmFyIGE9Y3JlYXRlSW5zdGFuY2VDb250ZXh0KGUsbixyKTtpZigiZnVuY3Rpb24iPT10eXBlb2Ygby5jcmVhdGVJbnN0YW5jZSlyZXR1cm4gby5jcmVhdGVJbnN0YW5jZShlLHQsbixyLGEpO3J1bkluQ29udGV4dCh0LGEpfWZ1bmN0aW9uIHJ1bkluQ29udGV4dChlLHQpe3ZhciBuPVtdLHI9W107Zm9yKHZhciBpIGluIHQpbi5wdXNoKGkpLHIucHVzaCh0W2ldKTt2YXIgbz0iXG4gICAgKGZ1bmN0aW9uIChnbG9iYWwpIHtcbiAgICAgICIrZSsiXG4gICAgfSkoT2JqZWN0LmNyZWF0ZSh0aGlzKSlcbiAgIjtyZXR1cm4obmV3KEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmFwcGx5KEZ1bmN0aW9uLFtudWxsXS5jb25jYXQobixbb10pKSkpLmFwcGx5KHZvaWQgMCxyKX1mdW5jdGlvbiBnZXRSb290KGUpe3ZhciB0PWdldERvYyhlKTt0cnl7aWYodCYmdC5ib2R5KXJldHVybiB0LmJvZHkudG9KU09OKCl9Y2F0Y2goZSl7cmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGdldCB0aGUgdmlydHVhbCBkb20gdHJlZS4iKX19dmFyIG1ldGhvZHM9e2NyZWF0ZUluc3RhbmNlOmNyZWF0ZUluc3RhbmNlLGNyZWF0ZUluc3RhbmNlQ29udGV4dDpjcmVhdGVJbnN0YW5jZUNvbnRleHQsZ2V0Um9vdDpnZXRSb290LGdldEpTRk1WZXJzaW9uOmdldEpTRk1WZXJzaW9uLGdldERvY3VtZW50OmdldERvYyxyZWdpc3RlclNlcnZpY2U6cmVnaXN0ZXIsdW5yZWdpc3RlclNlcnZpY2U6dW5yZWdpc3RlcixjYWxsSlM6ZnVuY3Rpb24oZSx0KXt2YXIgbj1mcmFtZXdvcmtzW2dldEZyYW1ld29ya1R5cGUoZSldO3JldHVybiBuJiYiZnVuY3Rpb24iPT10eXBlb2Ygbi5yZWNlaXZlVGFza3M/bi5yZWNlaXZlVGFza3MoZSx0KTpyZWNlaXZlVGFza3MoZSx0KX19O2Z1bmN0aW9uIGdlbkluc3RhbmNlKHMpe21ldGhvZHNbc109ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07dmFyIG4scj1lWzBdLGk9Z2V0RnJhbWV3b3JrVHlwZShyKTtpZihpJiZmcmFtZXdvcmtzW2ldKXt2YXIgbz0obj1mcmFtZXdvcmtzW2ldKVtzXS5hcHBseShuLGUpLGE9e2ZyYW1ld29yazppfTtyZXR1cm4icmVmcmVzaEluc3RhbmNlIj09PXM/c2VydmljZXMuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLm9wdGlvbnMucmVmcmVzaDt0JiZ0KHIse2luZm86YSxydW50aW1lOnJ1bnRpbWVDb25maWd9KX0pOiJkZXN0cm95SW5zdGFuY2UiPT09cyYmKHNlcnZpY2VzLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vcHRpb25zLmRlc3Ryb3k7dCYmdChyLHtpbmZvOmEscnVudGltZTpydW50aW1lQ29uZmlnfSl9KSxkZWxldGUgaW5zdGFuY2VUeXBlTWFwW3JdKSxvfX19ZnVuY3Rpb24gYWRhcHRNZXRob2QoaSxvKXttZXRob2RzW2ldPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2Zvcih2YXIgbiBpbiJmdW5jdGlvbiI9PXR5cGVvZiBvJiZvLmFwcGx5KHZvaWQgMCxlKSxydW50aW1lQ29uZmlnLmZyYW1ld29ya3Mpe3ZhciByPXJ1bnRpbWVDb25maWcuZnJhbWV3b3Jrc1tuXTtyJiZyW2ldJiZyW2ldLmFwcGx5KHIsZSl9fX1mdW5jdGlvbiBpbml0JCQxKGUpe2Zvcih2YXIgdCBpbiBmcmFtZXdvcmtzPShydW50aW1lQ29uZmlnPWV8fHt9KS5mcmFtZXdvcmtzfHx7fSxpbml0JDEoKSxmcmFtZXdvcmtzKXt2YXIgbj1mcmFtZXdvcmtzW3RdO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuLmluaXQpdHJ5e24uaW5pdChlKX1jYXRjaChlKXt9fXJldHVybiBhZGFwdE1ldGhvZCgicmVnaXN0ZXJDb21wb25lbnRzIixyZWdpc3RlckNvbXBvbmVudHMpLGFkYXB0TWV0aG9kKCJyZWdpc3Rlck1vZHVsZXMiLHJlZ2lzdGVyTW9kdWxlcyksYWRhcHRNZXRob2QoInJlZ2lzdGVyTWV0aG9kcyIpLFsiZGVzdHJveUluc3RhbmNlIiwicmVmcmVzaEluc3RhbmNlIl0uZm9yRWFjaChnZW5JbnN0YW5jZSksbWV0aG9kc312YXIgY29uZmlnPXtEb2N1bWVudDpEb2N1bWVudCxFbGVtZW50OkVsZW1lbnQsQ29tbWVudDpDb21tZW50LExpc3RlbmVyOkxpc3RlbmVyLFRhc2tDZW50ZXI6VGFza0NlbnRlcixzZW5kVGFza3M6ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGNhbGxOYXRpdmU/Y2FsbE5hdGl2ZS5hcHBseSh2b2lkIDAsZSk6KGdsb2JhbC5jYWxsTmF0aXZlfHxmdW5jdGlvbigpe30pLmFwcGx5KHZvaWQgMCxlKX19O2Z1bmN0aW9uIGZyZWV6ZVByb3RvdHlwZSgpe09iamVjdC5mcmVlemUoY29uZmlnLkNvbW1lbnQpLE9iamVjdC5mcmVlemUoY29uZmlnLkxpc3RlbmVyKSxPYmplY3QuZnJlZXplKGNvbmZpZy5Eb2N1bWVudC5wcm90b3R5cGUpLE9iamVjdC5mcmVlemUoY29uZmlnLkNvbW1lbnQucHJvdG90eXBlKSxPYmplY3QuZnJlZXplKGNvbmZpZy5MaXN0ZW5lci5wcm90b3R5cGUpfURvY3VtZW50LmhhbmRsZXI9Y29uZmlnLnNlbmRUYXNrczt2YXIgcnVudGltZT17c2VydmljZTp7cmVnaXN0ZXI6cmVnaXN0ZXIsdW5yZWdpc3Rlcjp1bnJlZ2lzdGVyLGhhczpoYXN9LGZyZWV6ZVByb3RvdHlwZTpmcmVlemVQcm90b3R5cGUsaW5pdDppbml0JCQxLGNvbmZpZzpjb25maWd9O2Z1bmN0aW9uIE1lc3NhZ2VFdmVudChlLHQpe3ZvaWQgMD09PXQmJih0PXt9KSx0aGlzLnR5cGU9ZXx8Im1lc3NhZ2UiLHRoaXMuZGF0YT10LmRhdGF8fG51bGwsdGhpcy5vcmlnaW49dC5vcmlnaW58fCIiLHRoaXMuc291cmNlPXQuc291cmNlfHxudWxsLHRoaXMucG9ydHM9dC5wb3J0c3x8W10sdGhpcy50YXJnZXQ9bnVsbCx0aGlzLnRpbWVTdGFtcD1EYXRlLm5vdygpfXZhciBjaGFubmVscz17fSxpbnN0YW5jZXM9e307ZnVuY3Rpb24gQnJvYWRjYXN0Q2hhbm5lbCQxKCl7fUJyb2FkY2FzdENoYW5uZWwkMS5wcm90b3R5cGUucG9zdE1lc3NhZ2U9ZnVuY3Rpb24oZSl7aWYodGhpcy5fY2xvc2VkKXRocm93IG5ldyBFcnJvcignQnJvYWRjYXN0Q2hhbm5lbCAiJyt0aGlzLm5hbWUrJyIgaXMgY2xvc2VkLicpO3ZhciB0PWNoYW5uZWxzW3RoaXMubmFtZV07aWYodCYmdC5sZW5ndGgpZm9yKHZhciBuPTA7bjx0Lmxlbmd0aDsrK24pe3ZhciByPXRbbl07ci5fY2xvc2VkfHxyPT09dGhpc3x8ImZ1bmN0aW9uIj09dHlwZW9mIHIub25tZXNzYWdlJiZyLm9ubWVzc2FnZShuZXcgTWVzc2FnZUV2ZW50KCJtZXNzYWdlIix7ZGF0YTplfSkpfX0sQnJvYWRjYXN0Q2hhbm5lbCQxLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoIXRoaXMuX2Nsb3NlZCYmKHRoaXMuX2Nsb3NlZD0hMCxjaGFubmVsc1t0aGlzLm5hbWVdKSl7dmFyIGU9Y2hhbm5lbHNbdGhpcy5uYW1lXS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT10fSk7ZS5sZW5ndGg/Y2hhbm5lbHNbdGhpcy5uYW1lXT1lOmRlbGV0ZSBjaGFubmVsc1t0aGlzLm5hbWVdfX07dmFyIEJyb2FkY2FzdENoYW5uZWwkMj17Y3JlYXRlOmZ1bmN0aW9uKHQsZSxuKXtpZihpbnN0YW5jZXNbdF09W10sImZ1bmN0aW9uIj09dHlwZW9mIGdsb2JhbC5Ccm9hZGNhc3RDaGFubmVsKXJldHVybnt9O3ZhciByPXtCcm9hZGNhc3RDaGFubmVsOmZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJuYW1lIix7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITEsdmFsdWU6U3RyaW5nKGUpfSksdGhpcy5fY2xvc2VkPSExLHRoaXMub25tZXNzYWdlPW51bGwsY2hhbm5lbHNbdGhpcy5uYW1lXXx8KGNoYW5uZWxzW3RoaXMubmFtZV09W10pLGNoYW5uZWxzW3RoaXMubmFtZV0ucHVzaCh0aGlzKSxpbnN0YW5jZXNbdF0ucHVzaCh0aGlzKX19O3JldHVybiByLkJyb2FkY2FzdENoYW5uZWwucHJvdG90eXBlPUJyb2FkY2FzdENoYW5uZWwkMS5wcm90b3R5cGUse2luc3RhbmNlOnJ9fSxkZXN0cm95OmZ1bmN0aW9uKGUsdCl7aW5zdGFuY2VzW2VdLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xvc2UoKX0pLGRlbGV0ZSBpbnN0YW5jZXNbZV19fSxzZXJ2aWNlcyQxPXtCcm9hZGNhc3RDaGFubmVsOkJyb2FkY2FzdENoYW5uZWwkMn0sRlJiLEdSYixJUmIsSlJiO2Z1bmN0aW9uIHNldHVwKGUpe3ZhciB0PXJ1bnRpbWUuaW5pdCxuPXJ1bnRpbWUuY29uZmlnO24uZnJhbWV3b3Jrcz1lO3ZhciByPXN1YnZlcnNpb24ubmF0aXZlLGk9c3VidmVyc2lvbi50cmFuc2Zvcm1lcjtmb3IodmFyIG8gaW4gc2VydmljZXMkMSlydW50aW1lLnNlcnZpY2UucmVnaXN0ZXIobyxzZXJ2aWNlcyQxW29dKTtydW50aW1lLmZyZWV6ZVByb3RvdHlwZSgpLGdsb2JhbC5mcmFtZXdvcmtWZXJzaW9uPXIsZ2xvYmFsLnRyYW5zZm9ybWVyVmVyc2lvbj1pO3ZhciBhPXQobikscz1mdW5jdGlvbihyKXtnbG9iYWxbcl09ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07dmFyIG49YVtyXS5hcHBseShhLGUpO3JldHVybiBuIGluc3RhbmNlb2YgRXJyb3ImJmNvbnNvbGUuZXJyb3Iobi50b1N0cmluZygpKSxufX07Zm9yKHZhciBjIGluIGEpcyhjKX1mdW5jdGlvbiB1bndyYXBFeHBvcnRzKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkZWZhdWx0Iik/ZS5kZWZhdWx0OmV9ZnVuY3Rpb24gY3JlYXRlQ29tbW9uanNNb2R1bGUoZSx0KXtyZXR1cm4gZSh0PXtleHBvcnRzOnt9fSx0LmV4cG9ydHMpLHQuZXhwb3J0c31BcnJheS5mcm9tfHwoQXJyYXkuZnJvbT0oRlJiPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsR1JiPWZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlfHwiW29iamVjdCBGdW5jdGlvbl0iPT09RlJiLmNhbGwoZSl9LElSYj1NYXRoLnBvdygyLDUzKS0xLEpSYj1mdW5jdGlvbihlKXt2YXIgdCxuPSh0PU51bWJlcihlKSxpc05hTih0KT8wOjAhPT10JiZpc0Zpbml0ZSh0KT8oMDx0PzE6LTEpKk1hdGguZmxvb3IoTWF0aC5hYnModCkpOnQpO3JldHVybiBNYXRoLm1pbihNYXRoLm1heChuLDApLElSYil9LGZ1bmN0aW9uKGUpe3ZhciB0PU9iamVjdChlKTtpZihudWxsPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5LmZyb20gcmVxdWlyZXMgYW4gYXJyYXktbGlrZSBvYmplY3QgLSBub3QgbnVsbCBvciB1bmRlZmluZWQiKTt2YXIgbixyPTE8YXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMV06dm9pZCAwO2lmKHZvaWQgMCE9PXIpe2lmKCFHUmIocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJyYXkuZnJvbTogd2hlbiBwcm92aWRlZCwgdGhlIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24iKTsyPGFyZ3VtZW50cy5sZW5ndGgmJihuPWFyZ3VtZW50c1syXSl9Zm9yKHZhciBpLG89SlJiKHQubGVuZ3RoKSxhPUdSYih0aGlzKT9PYmplY3QobmV3IHRoaXMobykpOm5ldyBBcnJheShvKSxzPTA7czxvOylpPXRbc10sYVtzXT1yP3ZvaWQgMD09PW4/cihpLHMpOnIuY2FsbChuLGkscyk6aSxzKz0xO3JldHVybiBhLmxlbmd0aD1vLGF9KSk7dmFyIF9nbG9iYWw9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5leHBvcnRzPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cuTWF0aD09TWF0aD93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiZzZWxmLk1hdGg9PU1hdGg/c2VsZjpGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpOyJudW1iZXIiPT10eXBlb2YgX19nJiYoX19nPXQpfSksX2NvcmU9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5leHBvcnRzPXt2ZXJzaW9uOiIyLjUuNyJ9OyJudW1iZXIiPT10eXBlb2YgX19lJiYoX19lPXQpfSksX2NvcmVfMT1fY29yZS52ZXJzaW9uLF9pc09iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGU/bnVsbCE9PWU6ImZ1bmN0aW9uIj09dHlwZW9mIGV9LF9hbk9iamVjdD1mdW5jdGlvbihlKXtpZighX2lzT2JqZWN0KGUpKXRocm93IFR5cGVFcnJvcihlKyIgaXMgbm90IGFuIG9iamVjdCEiKTtyZXR1cm4gZX0sX2ZhaWxzPWZ1bmN0aW9uKGUpe3RyeXtyZXR1cm4hIWUoKX1jYXRjaChlKXtyZXR1cm4hMH19LF9kZXNjcmlwdG9ycz0hX2ZhaWxzKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmF9KSxkb2N1bWVudCQxPV9nbG9iYWwuZG9jdW1lbnQsaXM9X2lzT2JqZWN0KGRvY3VtZW50JDEpJiZfaXNPYmplY3QoZG9jdW1lbnQkMS5jcmVhdGVFbGVtZW50KSxfZG9tQ3JlYXRlPWZ1bmN0aW9uKGUpe3JldHVybiBpcz9kb2N1bWVudCQxLmNyZWF0ZUVsZW1lbnQoZSk6e319LF9pZThEb21EZWZpbmU9IV9kZXNjcmlwdG9ycyYmIV9mYWlscyhmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoX2RvbUNyZWF0ZSgiZGl2IiksImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSksX3RvUHJpbWl0aXZlPWZ1bmN0aW9uKGUsdCl7aWYoIV9pc09iamVjdChlKSlyZXR1cm4gZTt2YXIgbixyO2lmKHQmJiJmdW5jdGlvbiI9PXR5cGVvZihuPWUudG9TdHJpbmcpJiYhX2lzT2JqZWN0KHI9bi5jYWxsKGUpKSlyZXR1cm4gcjtpZigiZnVuY3Rpb24iPT10eXBlb2Yobj1lLnZhbHVlT2YpJiYhX2lzT2JqZWN0KHI9bi5jYWxsKGUpKSlyZXR1cm4gcjtpZighdCYmImZ1bmN0aW9uIj09dHlwZW9mKG49ZS50b1N0cmluZykmJiFfaXNPYmplY3Qocj1uLmNhbGwoZSkpKXJldHVybiByO3Rocm93IFR5cGVFcnJvcigiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIil9LGRQPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxmPV9kZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24oZSx0LG4pe2lmKF9hbk9iamVjdChlKSx0PV90b1ByaW1pdGl2ZSh0LCEwKSxfYW5PYmplY3QobiksX2llOERvbURlZmluZSl0cnl7cmV0dXJuIGRQKGUsdCxuKX1jYXRjaChlKXt9aWYoImdldCJpbiBufHwic2V0ImluIG4pdGhyb3cgVHlwZUVycm9yKCJBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCEiKTtyZXR1cm4idmFsdWUiaW4gbiYmKGVbdF09bi52YWx1ZSksZX0sX29iamVjdERwPXtmOmZ9LF9wcm9wZXJ0eURlc2M9ZnVuY3Rpb24oZSx0KXtyZXR1cm57ZW51bWVyYWJsZTohKDEmZSksY29uZmlndXJhYmxlOiEoMiZlKSx3cml0YWJsZTohKDQmZSksdmFsdWU6dH19LF9oaWRlPV9kZXNjcmlwdG9ycz9mdW5jdGlvbihlLHQsbil7cmV0dXJuIF9vYmplY3REcC5mKGUsdCxfcHJvcGVydHlEZXNjKDEsbikpfTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGVbdF09bixlfSxoYXNPd25Qcm9wZXJ0eT17fS5oYXNPd25Qcm9wZXJ0eSxfaGFzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoZSx0KX0saWQ9MCxweD1NYXRoLnJhbmRvbSgpLF91aWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIlN5bWJvbCgiLmNvbmNhdCh2b2lkIDA9PT1lPyIiOmUsIilfIiwoKytpZCtweCkudG9TdHJpbmcoMzYpKX0sX3JlZGVmaW5lPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKGUpe3ZhciBvPV91aWQoInNyYyIpLHQ9InRvU3RyaW5nIixuPUZ1bmN0aW9uW3RdLGE9KCIiK24pLnNwbGl0KHQpO19jb3JlLmluc3BlY3RTb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIG4uY2FsbChlKX0sKGUuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT0iZnVuY3Rpb24iPT10eXBlb2YgbjtpJiYoX2hhcyhuLCJuYW1lIil8fF9oaWRlKG4sIm5hbWUiLHQpKSxlW3RdIT09biYmKGkmJihfaGFzKG4sbyl8fF9oaWRlKG4sbyxlW3RdPyIiK2VbdF06YS5qb2luKFN0cmluZyh0KSkpKSxlPT09X2dsb2JhbD9lW3RdPW46cj9lW3RdP2VbdF09bjpfaGlkZShlLHQsbik6KGRlbGV0ZSBlW3RdLF9oaWRlKGUsdCxuKSkpfSkoRnVuY3Rpb24ucHJvdG90eXBlLHQsZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdGhpcyYmdGhpc1tvXXx8bi5jYWxsKHRoaXMpfSl9KSxfYUZ1bmN0aW9uPWZ1bmN0aW9uKGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IFR5cGVFcnJvcihlKyIgaXMgbm90IGEgZnVuY3Rpb24hIik7cmV0dXJuIGV9LF9jdHg9ZnVuY3Rpb24ocixpLGUpe2lmKF9hRnVuY3Rpb24ociksdm9pZCAwPT09aSlyZXR1cm4gcjtzd2l0Y2goZSl7Y2FzZSAxOnJldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gci5jYWxsKGksZSl9O2Nhc2UgMjpyZXR1cm4gZnVuY3Rpb24oZSx0KXtyZXR1cm4gci5jYWxsKGksZSx0KX07Y2FzZSAzOnJldHVybiBmdW5jdGlvbihlLHQsbil7cmV0dXJuIHIuY2FsbChpLGUsdCxuKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHIuYXBwbHkoaSxhcmd1bWVudHMpfX0sUFJPVE9UWVBFPSJwcm90b3R5cGUiLCRleHBvcnQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHM9ZSYkZXhwb3J0LkYsYz1lJiRleHBvcnQuRyx1PWUmJGV4cG9ydC5TLGw9ZSYkZXhwb3J0LlAsZD1lJiRleHBvcnQuQixmPWM/X2dsb2JhbDp1P19nbG9iYWxbdF18fChfZ2xvYmFsW3RdPXt9KTooX2dsb2JhbFt0XXx8e30pW1BST1RPVFlQRV0scD1jP19jb3JlOl9jb3JlW3RdfHwoX2NvcmVbdF09e30pLGg9cFtQUk9UT1RZUEVdfHwocFtQUk9UT1RZUEVdPXt9KTtmb3IociBpbiBjJiYobj10KSxuKW89KChpPSFzJiZmJiZ2b2lkIDAhPT1mW3JdKT9mOm4pW3JdLGE9ZCYmaT9fY3R4KG8sX2dsb2JhbCk6bCYmImZ1bmN0aW9uIj09dHlwZW9mIG8/X2N0eChGdW5jdGlvbi5jYWxsLG8pOm8sZiYmX3JlZGVmaW5lKGYscixvLGUmJGV4cG9ydC5VKSxwW3JdIT1vJiZfaGlkZShwLHIsYSksbCYmaFtyXSE9byYmKGhbcl09byl9O19nbG9iYWwuY29yZT1fY29yZSwkZXhwb3J0LkY9MSwkZXhwb3J0Lkc9MiwkZXhwb3J0LlM9NCwkZXhwb3J0LlA9OCwkZXhwb3J0LkI9MTYsJGV4cG9ydC5XPTMyLCRleHBvcnQuVT02NCwkZXhwb3J0LlI9MTI4O3ZhciBfZXhwb3J0PSRleHBvcnQsdG9TdHJpbmckMT17fS50b1N0cmluZyxfY29mPWZ1bmN0aW9uKGUpe3JldHVybiB0b1N0cmluZyQxLmNhbGwoZSkuc2xpY2UoOCwtMSl9LF9pb2JqZWN0PU9iamVjdCgieiIpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApP09iamVjdDpmdW5jdGlvbihlKXtyZXR1cm4iU3RyaW5nIj09X2NvZihlKT9lLnNwbGl0KCIiKTpPYmplY3QoZSl9LF9kZWZpbmVkPWZ1bmN0aW9uKGUpe2lmKG51bGw9PWUpdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgIitlKTtyZXR1cm4gZX0sX3RvSW9iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4gX2lvYmplY3QoX2RlZmluZWQoZSkpfSxjZWlsPU1hdGguY2VpbCxmbG9vcj1NYXRoLmZsb29yLF90b0ludGVnZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIGlzTmFOKGU9K2UpPzA6KDA8ZT9mbG9vcjpjZWlsKShlKX0sbWluPU1hdGgubWluLF90b0xlbmd0aD1mdW5jdGlvbihlKXtyZXR1cm4gMDxlP21pbihfdG9JbnRlZ2VyKGUpLDkwMDcxOTkyNTQ3NDA5OTEpOjB9LG1heD1NYXRoLm1heCxtaW4kMT1NYXRoLm1pbixfdG9BYnNvbHV0ZUluZGV4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuKGU9X3RvSW50ZWdlcihlKSk8MD9tYXgoZSt0LDApOm1pbiQxKGUsdCl9LF9hcnJheUluY2x1ZGVzPWZ1bmN0aW9uKHMpe3JldHVybiBmdW5jdGlvbihlLHQsbil7dmFyIHIsaT1fdG9Jb2JqZWN0KGUpLG89X3RvTGVuZ3RoKGkubGVuZ3RoKSxhPV90b0Fic29sdXRlSW5kZXgobixvKTtpZihzJiZ0IT10KXtmb3IoO2E8bzspaWYoKHI9aVthKytdKSE9cilyZXR1cm4hMH1lbHNlIGZvcig7YTxvO2ErKylpZigoc3x8YSBpbiBpKSYmaVthXT09PXQpcmV0dXJuIHN8fGF8fDA7cmV0dXJuIXMmJi0xfX0sX2xpYnJhcnk9ITEsX3NoYXJlZD1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihlKXt2YXIgdD0iX19jb3JlLWpzX3NoYXJlZF9fIixuPV9nbG9iYWxbdF18fChfZ2xvYmFsW3RdPXt9KTsoZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5bZV18fChuW2VdPXZvaWQgMCE9PXQ/dDp7fSl9KSgidmVyc2lvbnMiLFtdKS5wdXNoKHt2ZXJzaW9uOl9jb3JlLnZlcnNpb24sbW9kZTpfbGlicmFyeT8icHVyZSI6Imdsb2JhbCIsY29weXJpZ2h0OiLCqSAyMDE4IERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpIn0pfSksc2hhcmVkJDI9X3NoYXJlZCgia2V5cyIpLF9zaGFyZWRLZXk9ZnVuY3Rpb24oZSl7cmV0dXJuIHNoYXJlZCQyW2VdfHwoc2hhcmVkJDJbZV09X3VpZChlKSl9LGFycmF5SW5kZXhPZj1fYXJyYXlJbmNsdWRlcyghMSksSUVfUFJPVE89X3NoYXJlZEtleSgiSUVfUFJPVE8iKSxfb2JqZWN0S2V5c0ludGVybmFsPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1fdG9Jb2JqZWN0KGUpLGk9MCxvPVtdO2ZvcihuIGluIHIpbiE9SUVfUFJPVE8mJl9oYXMocixuKSYmby5wdXNoKG4pO2Zvcig7dC5sZW5ndGg+aTspX2hhcyhyLG49dFtpKytdKSYmKH5hcnJheUluZGV4T2YobyxuKXx8by5wdXNoKG4pKTtyZXR1cm4gb30sX2VudW1CdWdLZXlzPSJjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YiLnNwbGl0KCIsIiksX29iamVjdEtleXM9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKGUpe3JldHVybiBfb2JqZWN0S2V5c0ludGVybmFsKGUsX2VudW1CdWdLZXlzKX0sZiQxPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsX29iamVjdEdvcHM9e2Y6ZiQxfSxmJDI9e30ucHJvcGVydHlJc0VudW1lcmFibGUsX29iamVjdFBpZT17ZjpmJDJ9LF90b09iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0KF9kZWZpbmVkKGUpKX0sJGFzc2lnbj1PYmplY3QuYXNzaWduLF9vYmplY3RBc3NpZ249ISRhc3NpZ258fF9mYWlscyhmdW5jdGlvbigpe3ZhciBlPXt9LHQ9e30sbj1TeW1ib2woKSxyPSJhYmNkZWZnaGlqa2xtbm9wcXJzdCI7cmV0dXJuIGVbbl09NyxyLnNwbGl0KCIiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RbZV09ZX0pLDchPSRhc3NpZ24oe30sZSlbbl18fE9iamVjdC5rZXlzKCRhc3NpZ24oe30sdCkpLmpvaW4oIiIpIT1yfSk/ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49YXJndW1lbnRzLHI9X3RvT2JqZWN0KGUpLGk9YXJndW1lbnRzLmxlbmd0aCxvPTEsYT1fb2JqZWN0R29wcy5mLHM9X29iamVjdFBpZS5mO288aTspZm9yKHZhciBjLHU9X2lvYmplY3QobltvKytdKSxsPWE/X29iamVjdEtleXModSkuY29uY2F0KGEodSkpOl9vYmplY3RLZXlzKHUpLGQ9bC5sZW5ndGgsZj0wO2Y8ZDspcy5jYWxsKHUsYz1sW2YrK10pJiYocltjXT11W2NdKTtyZXR1cm4gcn06JGFzc2lnbjtfZXhwb3J0KF9leHBvcnQuUytfZXhwb3J0LkYsIk9iamVjdCIse2Fzc2lnbjpfb2JqZWN0QXNzaWdufSk7dmFyIGFzc2lnbj1fY29yZS5PYmplY3QuYXNzaWduO09iamVjdC5zZXRQcm90b3R5cGVPZnx8KE9iamVjdC5zZXRQcm90b3R5cGVPZj1mdW5jdGlvbih0LG4pe3ZhciByO2Z1bmN0aW9uIGkoZSx0KXtyZXR1cm4gci5jYWxsKGUsdCksZX10cnl7KHI9dC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodC5wcm90b3R5cGUsbikuc2V0KS5jYWxsKHt9LG51bGwpfWNhdGNoKGUpe2lmKHQucHJvdG90eXBlIT09e31bbl0pcmV0dXJuO3I9ZnVuY3Rpb24oZSl7dGhpc1tuXT1lfSxpLnBvbHlmaWxsPWkoaSh7fSxudWxsKSx0LnByb3RvdHlwZSlpbnN0YW5jZW9mIHR9cmV0dXJuIGl9KE9iamVjdCwiX19wcm90b19fIikpO3ZhciBXWEVudmlyb25tZW50JDE9Z2xvYmFsLldYRW52aXJvbm1lbnQ7dm9pZCAwPT09V1hFbnZpcm9ubWVudCQxfHwiaU9TIiE9PVdYRW52aXJvbm1lbnQkMS5wbGF0Zm9ybXx8V1hFbnZpcm9ubWVudCQxLl9fZW5hYmxlX25hdGl2ZV9wcm9taXNlX198fChnbG9iYWwuUHJvbWlzZT12b2lkIDApO3ZhciBfd2tzPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKGUpe3ZhciB0PV9zaGFyZWQoIndrcyIpLG49X2dsb2JhbC5TeW1ib2wscj0iZnVuY3Rpb24iPT10eXBlb2YgbjsoZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfHwodFtlXT1yJiZuW2VdfHwocj9uOl91aWQpKCJTeW1ib2wuIitlKSl9KS5zdG9yZT10fSksVEFHPV93a3MoInRvU3RyaW5nVGFnIiksQVJHPSJBcmd1bWVudHMiPT1fY29mKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSksdHJ5R2V0PWZ1bmN0aW9uKGUsdCl7dHJ5e3JldHVybiBlW3RdfWNhdGNoKGUpe319LF9jbGFzc29mPWZ1bmN0aW9uKGUpe3ZhciB0LG4scjtyZXR1cm4gdm9pZCAwPT09ZT8iVW5kZWZpbmVkIjpudWxsPT09ZT8iTnVsbCI6InN0cmluZyI9PXR5cGVvZihuPXRyeUdldCh0PU9iamVjdChlKSxUQUcpKT9uOkFSRz9fY29mKHQpOiJPYmplY3QiPT0ocj1fY29mKHQpKSYmImZ1bmN0aW9uIj09dHlwZW9mIHQuY2FsbGVlPyJBcmd1bWVudHMiOnJ9LHRlc3Q9e307dGVzdFtfd2tzKCJ0b1N0cmluZ1RhZyIpXT0ieiIsdGVzdCsiIiE9IltvYmplY3Qgel0iJiZfcmVkZWZpbmUoT2JqZWN0LnByb3RvdHlwZSwidG9TdHJpbmciLGZ1bmN0aW9uKCl7cmV0dXJuIltvYmplY3QgIitfY2xhc3NvZih0aGlzKSsiXSJ9LCEwKTt2YXIgX3N0cmluZ0F0PWZ1bmN0aW9uKHMpe3JldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT1TdHJpbmcoX2RlZmluZWQoZSkpLG89X3RvSW50ZWdlcih0KSxhPWkubGVuZ3RoO3JldHVybiBvPDB8fGE8PW8/cz8iIjp2b2lkIDA6KG49aS5jaGFyQ29kZUF0KG8pKTw1NTI5Nnx8NTYzMTk8bnx8bysxPT09YXx8KHI9aS5jaGFyQ29kZUF0KG8rMSkpPDU2MzIwfHw1NzM0MzxyP3M/aS5jaGFyQXQobyk6bjpzP2kuc2xpY2UobyxvKzIpOnItNTYzMjArKG4tNTUyOTY8PDEwKSs2NTUzNn19LF9pdGVyYXRvcnM9e30sX29iamVjdERwcz1fZGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXM6ZnVuY3Rpb24oZSx0KXtfYW5PYmplY3QoZSk7Zm9yKHZhciBuLHI9X29iamVjdEtleXModCksaT1yLmxlbmd0aCxvPTA7bzxpOylfb2JqZWN0RHAuZihlLG49cltvKytdLHRbbl0pO3JldHVybiBlfSxkb2N1bWVudCQyPV9nbG9iYWwuZG9jdW1lbnQsX2h0bWw9ZG9jdW1lbnQkMiYmZG9jdW1lbnQkMi5kb2N1bWVudEVsZW1lbnQsSUVfUFJPVE8kMT1fc2hhcmVkS2V5KCJJRV9QUk9UTyIpLEVtcHR5PWZ1bmN0aW9uKCl7fSxQUk9UT1RZUEUkMT0icHJvdG90eXBlIixjcmVhdGVEaWN0PWZ1bmN0aW9uKCl7dmFyIGUsdD1fZG9tQ3JlYXRlKCJpZnJhbWUiKSxuPV9lbnVtQnVnS2V5cy5sZW5ndGg7Zm9yKHQuc3R5bGUuZGlzcGxheT0ibm9uZSIsX2h0bWwuYXBwZW5kQ2hpbGQodCksdC5zcmM9ImphdmFzY3JpcHQ6IiwoZT10LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQpLm9wZW4oKSxlLndyaXRlKCI8c2NyaXB0PmRvY3VtZW50LkY9T2JqZWN0PFwvc2NyaXB0PiIpLGUuY2xvc2UoKSxjcmVhdGVEaWN0PWUuRjtuLS07KWRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRSQxXVtfZW51bUJ1Z0tleXNbbl1dO3JldHVybiBjcmVhdGVEaWN0KCl9LF9vYmplY3RDcmVhdGU9T2JqZWN0LmNyZWF0ZXx8ZnVuY3Rpb24oZSx0KXt2YXIgbjtyZXR1cm4gbnVsbCE9PWU/KEVtcHR5W1BST1RPVFlQRSQxXT1fYW5PYmplY3QoZSksbj1uZXcgRW1wdHksRW1wdHlbUFJPVE9UWVBFJDFdPW51bGwsbltJRV9QUk9UTyQxXT1lKTpuPWNyZWF0ZURpY3QoKSx2b2lkIDA9PT10P246X29iamVjdERwcyhuLHQpfSxkZWY9X29iamVjdERwLmYsVEFHJDE9X3drcygidG9TdHJpbmdUYWciKSxfc2V0VG9TdHJpbmdUYWc9ZnVuY3Rpb24oZSx0LG4pe2UmJiFfaGFzKGU9bj9lOmUucHJvdG90eXBlLFRBRyQxKSYmZGVmKGUsVEFHJDEse2NvbmZpZ3VyYWJsZTohMCx2YWx1ZTp0fSl9LEl0ZXJhdG9yUHJvdG90eXBlPXt9O19oaWRlKEl0ZXJhdG9yUHJvdG90eXBlLF93a3MoIml0ZXJhdG9yIiksZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pO3ZhciBfaXRlckNyZWF0ZT1mdW5jdGlvbihlLHQsbil7ZS5wcm90b3R5cGU9X29iamVjdENyZWF0ZShJdGVyYXRvclByb3RvdHlwZSx7bmV4dDpfcHJvcGVydHlEZXNjKDEsbil9KSxfc2V0VG9TdHJpbmdUYWcoZSx0KyIgSXRlcmF0b3IiKX0sSUVfUFJPVE8kMj1fc2hhcmVkS2V5KCJJRV9QUk9UTyIpLE9iamVjdFByb3RvPU9iamVjdC5wcm90b3R5cGUsX29iamVjdEdwbz1PYmplY3QuZ2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uKGUpe3JldHVybiBlPV90b09iamVjdChlKSxfaGFzKGUsSUVfUFJPVE8kMik/ZVtJRV9QUk9UTyQyXToiZnVuY3Rpb24iPT10eXBlb2YgZS5jb25zdHJ1Y3RvciYmZSBpbnN0YW5jZW9mIGUuY29uc3RydWN0b3I/ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGU6ZSBpbnN0YW5jZW9mIE9iamVjdD9PYmplY3RQcm90bzpudWxsfSxJVEVSQVRPUj1fd2tzKCJpdGVyYXRvciIpLEJVR0dZPSEoW10ua2V5cyYmIm5leHQiaW5bXS5rZXlzKCkpLEZGX0lURVJBVE9SPSJAQGl0ZXJhdG9yIixLRVlTPSJrZXlzIixWQUxVRVM9InZhbHVlcyIscmV0dXJuVGhpcz1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxfaXRlckRlZmluZT1mdW5jdGlvbihlLHQsbixyLGksbyxhKXtfaXRlckNyZWF0ZShuLHQscik7dmFyIHMsYyx1LGw9ZnVuY3Rpb24oZSl7aWYoIUJVR0dZJiZlIGluIGgpcmV0dXJuIGhbZV07c3dpdGNoKGUpe2Nhc2UgS0VZUzpjYXNlIFZBTFVFUzpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcyxlKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMsZSl9fSxkPXQrIiBJdGVyYXRvciIsZj1pPT1WQUxVRVMscD0hMSxoPWUucHJvdG90eXBlLHY9aFtJVEVSQVRPUl18fGhbRkZfSVRFUkFUT1JdfHxpJiZoW2ldLGc9dnx8bChpKSxtPWk/Zj9sKCJlbnRyaWVzIik6Zzp2b2lkIDAseT0iQXJyYXkiPT10JiZoLmVudHJpZXN8fHY7aWYoeSYmKHU9X29iamVjdEdwbyh5LmNhbGwobmV3IGUpKSkhPT1PYmplY3QucHJvdG90eXBlJiZ1Lm5leHQmJihfc2V0VG9TdHJpbmdUYWcodSxkLCEwKSxfbGlicmFyeXx8ImZ1bmN0aW9uIj09dHlwZW9mIHVbSVRFUkFUT1JdfHxfaGlkZSh1LElURVJBVE9SLHJldHVyblRoaXMpKSxmJiZ2JiZ2Lm5hbWUhPT1WQUxVRVMmJihwPSEwLGc9ZnVuY3Rpb24oKXtyZXR1cm4gdi5jYWxsKHRoaXMpfSksX2xpYnJhcnkmJiFhfHwhQlVHR1kmJiFwJiZoW0lURVJBVE9SXXx8X2hpZGUoaCxJVEVSQVRPUixnKSxfaXRlcmF0b3JzW3RdPWcsX2l0ZXJhdG9yc1tkXT1yZXR1cm5UaGlzLGkpaWYocz17dmFsdWVzOmY/ZzpsKFZBTFVFUyksa2V5czpvP2c6bChLRVlTKSxlbnRyaWVzOm19LGEpZm9yKGMgaW4gcyljIGluIGh8fF9yZWRlZmluZShoLGMsc1tjXSk7ZWxzZSBfZXhwb3J0KF9leHBvcnQuUCtfZXhwb3J0LkYqKEJVR0dZfHxwKSx0LHMpO3JldHVybiBzfSwkYXQ9X3N0cmluZ0F0KCEwKTtfaXRlckRlZmluZShTdHJpbmcsIlN0cmluZyIsZnVuY3Rpb24oZSl7dGhpcy5fdD1TdHJpbmcoZSksdGhpcy5faT0wfSxmdW5jdGlvbigpe3ZhciBlLHQ9dGhpcy5fdCxuPXRoaXMuX2k7cmV0dXJuIG4+PXQubGVuZ3RoP3t2YWx1ZTp2b2lkIDAsZG9uZTohMH06KGU9JGF0KHQsbiksdGhpcy5faSs9ZS5sZW5ndGgse3ZhbHVlOmUsZG9uZTohMX0pfSk7dmFyIFVOU0NPUEFCTEVTPV93a3MoInVuc2NvcGFibGVzIiksQXJyYXlQcm90bz1BcnJheS5wcm90b3R5cGU7bnVsbD09QXJyYXlQcm90b1tVTlNDT1BBQkxFU10mJl9oaWRlKEFycmF5UHJvdG8sVU5TQ09QQUJMRVMse30pO3ZhciBfYWRkVG9VbnNjb3BhYmxlcz1mdW5jdGlvbihlKXtBcnJheVByb3RvW1VOU0NPUEFCTEVTXVtlXT0hMH0sX2l0ZXJTdGVwPWZ1bmN0aW9uKGUsdCl7cmV0dXJue3ZhbHVlOnQsZG9uZTohIWV9fSxlczZfYXJyYXlfaXRlcmF0b3I9X2l0ZXJEZWZpbmUoQXJyYXksIkFycmF5IixmdW5jdGlvbihlLHQpe3RoaXMuX3Q9X3RvSW9iamVjdChlKSx0aGlzLl9pPTAsdGhpcy5faz10fSxmdW5jdGlvbigpe3ZhciBlPXRoaXMuX3QsdD10aGlzLl9rLG49dGhpcy5faSsrO3JldHVybiFlfHxuPj1lLmxlbmd0aD8odGhpcy5fdD12b2lkIDAsX2l0ZXJTdGVwKDEpKTpfaXRlclN0ZXAoMCwia2V5cyI9PXQ/bjoidmFsdWVzIj09dD9lW25dOltuLGVbbl1dKX0sInZhbHVlcyIpO19pdGVyYXRvcnMuQXJndW1lbnRzPV9pdGVyYXRvcnMuQXJyYXksX2FkZFRvVW5zY29wYWJsZXMoImtleXMiKSxfYWRkVG9VbnNjb3BhYmxlcygidmFsdWVzIiksX2FkZFRvVW5zY29wYWJsZXMoImVudHJpZXMiKTtmb3IodmFyIElURVJBVE9SJDE9X3drcygiaXRlcmF0b3IiKSxUT19TVFJJTkdfVEFHPV93a3MoInRvU3RyaW5nVGFnIiksQXJyYXlWYWx1ZXM9X2l0ZXJhdG9ycy5BcnJheSxET01JdGVyYWJsZXM9e0NTU1J1bGVMaXN0OiEwLENTU1N0eWxlRGVjbGFyYXRpb246ITEsQ1NTVmFsdWVMaXN0OiExLENsaWVudFJlY3RMaXN0OiExLERPTVJlY3RMaXN0OiExLERPTVN0cmluZ0xpc3Q6ITEsRE9NVG9rZW5MaXN0OiEwLERhdGFUcmFuc2Zlckl0ZW1MaXN0OiExLEZpbGVMaXN0OiExLEhUTUxBbGxDb2xsZWN0aW9uOiExLEhUTUxDb2xsZWN0aW9uOiExLEhUTUxGb3JtRWxlbWVudDohMSxIVE1MU2VsZWN0RWxlbWVudDohMSxNZWRpYUxpc3Q6ITAsTWltZVR5cGVBcnJheTohMSxOYW1lZE5vZGVNYXA6ITEsTm9kZUxpc3Q6ITAsUGFpbnRSZXF1ZXN0TGlzdDohMSxQbHVnaW46ITEsUGx1Z2luQXJyYXk6ITEsU1ZHTGVuZ3RoTGlzdDohMSxTVkdOdW1iZXJMaXN0OiExLFNWR1BhdGhTZWdMaXN0OiExLFNWR1BvaW50TGlzdDohMSxTVkdTdHJpbmdMaXN0OiExLFNWR1RyYW5zZm9ybUxpc3Q6ITEsU291cmNlQnVmZmVyTGlzdDohMSxTdHlsZVNoZWV0TGlzdDohMCxUZXh0VHJhY2tDdWVMaXN0OiExLFRleHRUcmFja0xpc3Q6ITEsVG91Y2hMaXN0OiExfSxjb2xsZWN0aW9ucz1fb2JqZWN0S2V5cyhET01JdGVyYWJsZXMpLGk9MDtpPGNvbGxlY3Rpb25zLmxlbmd0aDtpKyspe3ZhciBOQU1FPWNvbGxlY3Rpb25zW2ldLGV4cGxpY2l0PURPTUl0ZXJhYmxlc1tOQU1FXSxDb2xsZWN0aW9uPV9nbG9iYWxbTkFNRV0scHJvdG89Q29sbGVjdGlvbiYmQ29sbGVjdGlvbi5wcm90b3R5cGUsa2V5O2lmKHByb3RvJiYocHJvdG9bSVRFUkFUT1IkMV18fF9oaWRlKHByb3RvLElURVJBVE9SJDEsQXJyYXlWYWx1ZXMpLHByb3RvW1RPX1NUUklOR19UQUddfHxfaGlkZShwcm90byxUT19TVFJJTkdfVEFHLE5BTUUpLF9pdGVyYXRvcnNbTkFNRV09QXJyYXlWYWx1ZXMsZXhwbGljaXQpKWZvcihrZXkgaW4gZXM2X2FycmF5X2l0ZXJhdG9yKXByb3RvW2tleV18fF9yZWRlZmluZShwcm90byxrZXksZXM2X2FycmF5X2l0ZXJhdG9yW2tleV0sITApfXZhciBfYW5JbnN0YW5jZT1mdW5jdGlvbihlLHQsbixyKXtpZighKGUgaW5zdGFuY2VvZiB0KXx8dm9pZCAwIT09ciYmciBpbiBlKXRocm93IFR5cGVFcnJvcihuKyI6IGluY29ycmVjdCBpbnZvY2F0aW9uISIpO3JldHVybiBlfSxfaXRlckNhbGw9ZnVuY3Rpb24odCxlLG4scil7dHJ5e3JldHVybiByP2UoX2FuT2JqZWN0KG4pWzBdLG5bMV0pOmUobil9Y2F0Y2goZSl7dmFyIGk9dC5yZXR1cm47dGhyb3cgdm9pZCAwIT09aSYmX2FuT2JqZWN0KGkuY2FsbCh0KSksZX19LElURVJBVE9SJDI9X3drcygiaXRlcmF0b3IiKSxBcnJheVByb3RvJDE9QXJyYXkucHJvdG90eXBlLF9pc0FycmF5SXRlcj1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwIT09ZSYmKF9pdGVyYXRvcnMuQXJyYXk9PT1lfHxBcnJheVByb3RvJDFbSVRFUkFUT1IkMl09PT1lKX0sSVRFUkFUT1IkMz1fd2tzKCJpdGVyYXRvciIpLGNvcmVfZ2V0SXRlcmF0b3JNZXRob2Q9X2NvcmUuZ2V0SXRlcmF0b3JNZXRob2Q9ZnVuY3Rpb24oZSl7aWYobnVsbCE9ZSlyZXR1cm4gZVtJVEVSQVRPUiQzXXx8ZVsiQEBpdGVyYXRvciJdfHxfaXRlcmF0b3JzW19jbGFzc29mKGUpXX0sX2Zvck9mPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKGUpe3ZhciBmPXt9LHA9e30sdD1lLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsYyx1PWk/ZnVuY3Rpb24oKXtyZXR1cm4gZX06Y29yZV9nZXRJdGVyYXRvck1ldGhvZChlKSxsPV9jdHgobixyLHQ/MjoxKSxkPTA7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHUpdGhyb3cgVHlwZUVycm9yKGUrIiBpcyBub3QgaXRlcmFibGUhIik7aWYoX2lzQXJyYXlJdGVyKHUpKXtmb3Iobz1fdG9MZW5ndGgoZS5sZW5ndGgpO2Q8bztkKyspaWYoKGM9dD9sKF9hbk9iamVjdChhPWVbZF0pWzBdLGFbMV0pOmwoZVtkXSkpPT09Znx8Yz09PXApcmV0dXJuIGN9ZWxzZSBmb3Iocz11LmNhbGwoZSk7IShhPXMubmV4dCgpKS5kb25lOylpZigoYz1faXRlckNhbGwocyxsLGEudmFsdWUsdCkpPT09Znx8Yz09PXApcmV0dXJuIGN9O3QuQlJFQUs9Zix0LlJFVFVSTj1wfSksU1BFQ0lFUz1fd2tzKCJzcGVjaWVzIiksX3NwZWNpZXNDb25zdHJ1Y3Rvcj1mdW5jdGlvbihlLHQpe3ZhciBuLHI9X2FuT2JqZWN0KGUpLmNvbnN0cnVjdG9yO3JldHVybiB2b2lkIDA9PT1yfHxudWxsPT0obj1fYW5PYmplY3QocilbU1BFQ0lFU10pP3Q6X2FGdW5jdGlvbihuKX0sX2ludm9rZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9dm9pZCAwPT09bjtzd2l0Y2godC5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gcj9lKCk6ZS5jYWxsKG4pO2Nhc2UgMTpyZXR1cm4gcj9lKHRbMF0pOmUuY2FsbChuLHRbMF0pO2Nhc2UgMjpyZXR1cm4gcj9lKHRbMF0sdFsxXSk6ZS5jYWxsKG4sdFswXSx0WzFdKTtjYXNlIDM6cmV0dXJuIHI/ZSh0WzBdLHRbMV0sdFsyXSk6ZS5jYWxsKG4sdFswXSx0WzFdLHRbMl0pO2Nhc2UgNDpyZXR1cm4gcj9lKHRbMF0sdFsxXSx0WzJdLHRbM10pOmUuY2FsbChuLHRbMF0sdFsxXSx0WzJdLHRbM10pfXJldHVybiBlLmFwcGx5KG4sdCl9LHByb2Nlc3MkMj1fZ2xvYmFsLnByb2Nlc3Msc2V0VGFzaz1fZ2xvYmFsLnNldEltbWVkaWF0ZSxjbGVhclRhc2s9X2dsb2JhbC5jbGVhckltbWVkaWF0ZSxNZXNzYWdlQ2hhbm5lbD1fZ2xvYmFsLk1lc3NhZ2VDaGFubmVsLERpc3BhdGNoPV9nbG9iYWwuRGlzcGF0Y2gsY291bnRlcj0wLHF1ZXVlPXt9LE9OUkVBRFlTVEFURUNIQU5HRT0ib25yZWFkeXN0YXRlY2hhbmdlIixkZWZlcixjaGFubmVsJDEscG9ydCxydW49ZnVuY3Rpb24oKXt2YXIgZT0rdGhpcztpZihxdWV1ZS5oYXNPd25Qcm9wZXJ0eShlKSl7dmFyIHQ9cXVldWVbZV07ZGVsZXRlIHF1ZXVlW2VdLHQoKX19LGxpc3RlbmVyPWZ1bmN0aW9uKGUpe3J1bi5jYWxsKGUuZGF0YSl9O3NldFRhc2smJmNsZWFyVGFza3x8KHNldFRhc2s9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWFyZ3VtZW50cyxuPVtdLHI9MTthcmd1bWVudHMubGVuZ3RoPnI7KW4ucHVzaCh0W3IrK10pO3JldHVybiBxdWV1ZVsrK2NvdW50ZXJdPWZ1bmN0aW9uKCl7X2ludm9rZSgiZnVuY3Rpb24iPT10eXBlb2YgZT9lOkZ1bmN0aW9uKGUpLG4pfSxkZWZlcihjb3VudGVyKSxjb3VudGVyfSxjbGVhclRhc2s9ZnVuY3Rpb24oZSl7ZGVsZXRlIHF1ZXVlW2VdfSwicHJvY2VzcyI9PV9jb2YocHJvY2VzcyQyKT9kZWZlcj1mdW5jdGlvbihlKXtwcm9jZXNzJDIubmV4dFRpY2soX2N0eChydW4sZSwxKSl9OkRpc3BhdGNoJiZEaXNwYXRjaC5ub3c/ZGVmZXI9ZnVuY3Rpb24oZSl7RGlzcGF0Y2gubm93KF9jdHgocnVuLGUsMSkpfTpNZXNzYWdlQ2hhbm5lbD8oY2hhbm5lbCQxPW5ldyBNZXNzYWdlQ2hhbm5lbCxwb3J0PWNoYW5uZWwkMS5wb3J0MixjaGFubmVsJDEucG9ydDEub25tZXNzYWdlPWxpc3RlbmVyLGRlZmVyPV9jdHgocG9ydC5wb3N0TWVzc2FnZSxwb3J0LDEpKTpfZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBwb3N0TWVzc2FnZSYmIV9nbG9iYWwuaW1wb3J0U2NyaXB0cz8oZGVmZXI9ZnVuY3Rpb24oZSl7X2dsb2JhbC5wb3N0TWVzc2FnZShlKyIiLCIqIil9LF9nbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbGlzdGVuZXIsITEpKTpkZWZlcj1PTlJFQURZU1RBVEVDSEFOR0UgaW4gX2RvbUNyZWF0ZSgic2NyaXB0Iik/ZnVuY3Rpb24oZSl7X2h0bWwuYXBwZW5kQ2hpbGQoX2RvbUNyZWF0ZSgic2NyaXB0IikpW09OUkVBRFlTVEFURUNIQU5HRV09ZnVuY3Rpb24oKXtfaHRtbC5yZW1vdmVDaGlsZCh0aGlzKSxydW4uY2FsbChlKX19OmZ1bmN0aW9uKGUpe3NldFRpbWVvdXQoX2N0eChydW4sZSwxKSwwKX0pO3ZhciBfdGFzaz17c2V0OnNldFRhc2ssY2xlYXI6Y2xlYXJUYXNrfSxtYWNyb3Rhc2s9X3Rhc2suc2V0LE9ic2VydmVyPV9nbG9iYWwuTXV0YXRpb25PYnNlcnZlcnx8X2dsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyLHByb2Nlc3MkMz1fZ2xvYmFsLnByb2Nlc3MsUHJvbWlzZSQxPV9nbG9iYWwuUHJvbWlzZSxpc05vZGUkMT0icHJvY2VzcyI9PV9jb2YocHJvY2VzcyQzKSxfbWljcm90YXNrPWZ1bmN0aW9uKCl7dmFyIG4scixpLGU9ZnVuY3Rpb24oKXt2YXIgZSx0O2Zvcihpc05vZGUkMSYmKGU9cHJvY2VzcyQzLmRvbWFpbikmJmUuZXhpdCgpO247KXt0PW4uZm4sbj1uLm5leHQ7dHJ5e3QoKX1jYXRjaChlKXt0aHJvdyBuP2koKTpyPXZvaWQgMCxlfX1yPXZvaWQgMCxlJiZlLmVudGVyKCl9O2lmKGlzTm9kZSQxKWk9ZnVuY3Rpb24oKXtwcm9jZXNzJDMubmV4dFRpY2soZSl9O2Vsc2UgaWYoIU9ic2VydmVyfHxfZ2xvYmFsLm5hdmlnYXRvciYmX2dsb2JhbC5uYXZpZ2F0b3Iuc3RhbmRhbG9uZSlpZihQcm9taXNlJDEmJlByb21pc2UkMS5yZXNvbHZlKXt2YXIgdD1Qcm9taXNlJDEucmVzb2x2ZSh2b2lkIDApO2k9ZnVuY3Rpb24oKXt0LnRoZW4oZSl9fWVsc2UgaT1mdW5jdGlvbigpe21hY3JvdGFzay5jYWxsKF9nbG9iYWwsZSl9O2Vsc2V7dmFyIG89ITAsYT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIik7bmV3IE9ic2VydmVyKGUpLm9ic2VydmUoYSx7Y2hhcmFjdGVyRGF0YTohMH0pLGk9ZnVuY3Rpb24oKXthLmRhdGE9bz0hb319cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PXtmbjplLG5leHQ6dm9pZCAwfTtyJiYoci5uZXh0PXQpLG58fChuPXQsaSgpKSxyPXR9fTtmdW5jdGlvbiBQcm9taXNlQ2FwYWJpbGl0eShlKXt2YXIgbixyO3RoaXMucHJvbWlzZT1uZXcgZShmdW5jdGlvbihlLHQpe2lmKHZvaWQgMCE9PW58fHZvaWQgMCE9PXIpdGhyb3cgVHlwZUVycm9yKCJCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvciIpO249ZSxyPXR9KSx0aGlzLnJlc29sdmU9X2FGdW5jdGlvbihuKSx0aGlzLnJlamVjdD1fYUZ1bmN0aW9uKHIpfXZhciBmJDM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlQ2FwYWJpbGl0eShlKX0sX25ld1Byb21pc2VDYXBhYmlsaXR5PXtmOmYkM30sX3BlcmZvcm09ZnVuY3Rpb24oZSl7dHJ5e3JldHVybntlOiExLHY6ZSgpfX1jYXRjaChlKXtyZXR1cm57ZTohMCx2OmV9fX0sbmF2aWdhdG9yJDE9X2dsb2JhbC5uYXZpZ2F0b3IsX3VzZXJBZ2VudD1uYXZpZ2F0b3IkMSYmbmF2aWdhdG9yJDEudXNlckFnZW50fHwiIixfcHJvbWlzZVJlc29sdmU9ZnVuY3Rpb24oZSx0KXtpZihfYW5PYmplY3QoZSksX2lzT2JqZWN0KHQpJiZ0LmNvbnN0cnVjdG9yPT09ZSlyZXR1cm4gdDt2YXIgbj1fbmV3UHJvbWlzZUNhcGFiaWxpdHkuZihlKTtyZXR1cm4oMCxuLnJlc29sdmUpKHQpLG4ucHJvbWlzZX0sX3JlZGVmaW5lQWxsPWZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHIgaW4gdClfcmVkZWZpbmUoZSxyLHRbcl0sbik7cmV0dXJuIGV9LFNQRUNJRVMkMT1fd2tzKCJzcGVjaWVzIiksX3NldFNwZWNpZXM9ZnVuY3Rpb24oZSl7dmFyIHQ9X2dsb2JhbFtlXTtfZGVzY3JpcHRvcnMmJnQmJiF0W1NQRUNJRVMkMV0mJl9vYmplY3REcC5mKHQsU1BFQ0lFUyQxLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fSl9LElURVJBVE9SJDQ9X3drcygiaXRlcmF0b3IiKSxTQUZFX0NMT1NJTkc9ITE7dHJ5e3ZhciByaXRlcj1bN11bSVRFUkFUT1IkNF0oKTtyaXRlci5yZXR1cm49ZnVuY3Rpb24oKXtTQUZFX0NMT1NJTkc9ITB9fWNhdGNoKGUpe312YXIgX2l0ZXJEZXRlY3Q9ZnVuY3Rpb24oZSx0KXtpZighdCYmIVNBRkVfQ0xPU0lORylyZXR1cm4hMTt2YXIgbj0hMTt0cnl7dmFyIHI9WzddLGk9cltJVEVSQVRPUiQ0XSgpO2kubmV4dD1mdW5jdGlvbigpe3JldHVybntkb25lOm49ITB9fSxyW0lURVJBVE9SJDRdPWZ1bmN0aW9uKCl7cmV0dXJuIGl9LGUocil9Y2F0Y2goZSl7fXJldHVybiBufSx0YXNrPV90YXNrLnNldCxtaWNyb3Rhc2s9X21pY3JvdGFzaygpLFBST01JU0U9IlByb21pc2UiLFR5cGVFcnJvciQxPV9nbG9iYWwuVHlwZUVycm9yLHByb2Nlc3MkMT1fZ2xvYmFsLnByb2Nlc3MsdmVyc2lvbnM9cHJvY2VzcyQxJiZwcm9jZXNzJDEudmVyc2lvbnMsdjg9dmVyc2lvbnMmJnZlcnNpb25zLnY4fHwiIiwkUHJvbWlzZT1fZ2xvYmFsW1BST01JU0VdLGlzTm9kZT0icHJvY2VzcyI9PV9jbGFzc29mKHByb2Nlc3MkMSksZW1wdHk9ZnVuY3Rpb24oKXt9LEludGVybmFsLG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSxPd25Qcm9taXNlQ2FwYWJpbGl0eSxXcmFwcGVyLG5ld1Byb21pc2VDYXBhYmlsaXR5PW5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eT1fbmV3UHJvbWlzZUNhcGFiaWxpdHkuZixVU0VfTkFUSVZFPSEhZnVuY3Rpb24oKXt0cnl7dmFyIGU9JFByb21pc2UucmVzb2x2ZSgxKSx0PShlLmNvbnN0cnVjdG9yPXt9KVtfd2tzKCJzcGVjaWVzIildPWZ1bmN0aW9uKGUpe2UoZW1wdHksZW1wdHkpfTtyZXR1cm4oaXNOb2RlfHwiZnVuY3Rpb24iPT10eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50KSYmZS50aGVuKGVtcHR5KWluc3RhbmNlb2YgdCYmMCE9PXY4LmluZGV4T2YoIjYuNiIpJiYtMT09PV91c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lLzY2Iil9Y2F0Y2goZSl7fX0oKSxpc1RoZW5hYmxlPWZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiEoIV9pc09iamVjdChlKXx8ImZ1bmN0aW9uIiE9dHlwZW9mKHQ9ZS50aGVuKSkmJnR9LG5vdGlmeT1mdW5jdGlvbihsLG4pe2lmKCFsLl9uKXtsLl9uPSEwO3ZhciByPWwuX2M7bWljcm90YXNrKGZ1bmN0aW9uKCl7Zm9yKHZhciBjPWwuX3YsdT0xPT1sLl9zLGU9MCx0PWZ1bmN0aW9uKGUpe3ZhciB0LG4scixpPXU/ZS5vazplLmZhaWwsbz1lLnJlc29sdmUsYT1lLnJlamVjdCxzPWUuZG9tYWluO3RyeXtpPyh1fHwoMj09bC5faCYmb25IYW5kbGVVbmhhbmRsZWQobCksbC5faD0xKSwhMD09PWk/dD1jOihzJiZzLmVudGVyKCksdD1pKGMpLHMmJihzLmV4aXQoKSxyPSEwKSksdD09PWUucHJvbWlzZT9hKFR5cGVFcnJvciQxKCJQcm9taXNlLWNoYWluIGN5Y2xlIikpOihuPWlzVGhlbmFibGUodCkpP24uY2FsbCh0LG8sYSk6byh0KSk6YShjKX1jYXRjaChlKXtzJiYhciYmcy5leGl0KCksYShlKX19O3IubGVuZ3RoPmU7KXQocltlKytdKTtsLl9jPVtdLGwuX249ITEsbiYmIWwuX2gmJm9uVW5oYW5kbGVkKGwpfSl9fSxvblVuaGFuZGxlZD1mdW5jdGlvbihvKXt0YXNrLmNhbGwoX2dsb2JhbCxmdW5jdGlvbigpe3ZhciBlLHQsbixyPW8uX3YsaT1pc1VuaGFuZGxlZChvKTtpZihpJiYoZT1fcGVyZm9ybShmdW5jdGlvbigpe2lzTm9kZT9wcm9jZXNzJDEuZW1pdCgidW5oYW5kbGVkUmVqZWN0aW9uIixyLG8pOih0PV9nbG9iYWwub251bmhhbmRsZWRyZWplY3Rpb24pP3Qoe3Byb21pc2U6byxyZWFzb246cn0pOihuPV9nbG9iYWwuY29uc29sZSkmJm4uZXJyb3ImJm4uZXJyb3IoIlVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbiIscil9KSxvLl9oPWlzTm9kZXx8aXNVbmhhbmRsZWQobyk/MjoxKSxvLl9hPXZvaWQgMCxpJiZlLmUpdGhyb3cgZS52fSl9LGlzVW5oYW5kbGVkPWZ1bmN0aW9uKGUpe3JldHVybiAxIT09ZS5faCYmMD09PShlLl9hfHxlLl9jKS5sZW5ndGh9LG9uSGFuZGxlVW5oYW5kbGVkPWZ1bmN0aW9uKHQpe3Rhc2suY2FsbChfZ2xvYmFsLGZ1bmN0aW9uKCl7dmFyIGU7aXNOb2RlP3Byb2Nlc3MkMS5lbWl0KCJyZWplY3Rpb25IYW5kbGVkIix0KTooZT1fZ2xvYmFsLm9ucmVqZWN0aW9uaGFuZGxlZCkmJmUoe3Byb21pc2U6dCxyZWFzb246dC5fdn0pfSl9LCRyZWplY3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0Ll9kfHwodC5fZD0hMCwodD10Ll93fHx0KS5fdj1lLHQuX3M9Mix0Ll9hfHwodC5fYT10Ll9jLnNsaWNlKCkpLG5vdGlmeSh0LCEwKSl9LCRyZXNvbHZlPWZ1bmN0aW9uKGUpe3ZhciBuLHI9dGhpcztpZighci5fZCl7ci5fZD0hMCxyPXIuX3d8fHI7dHJ5e2lmKHI9PT1lKXRocm93IFR5cGVFcnJvciQxKCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZiIpOyhuPWlzVGhlbmFibGUoZSkpP21pY3JvdGFzayhmdW5jdGlvbigpe3ZhciB0PXtfdzpyLF9kOiExfTt0cnl7bi5jYWxsKGUsX2N0eCgkcmVzb2x2ZSx0LDEpLF9jdHgoJHJlamVjdCx0LDEpKX1jYXRjaChlKXskcmVqZWN0LmNhbGwodCxlKX19KTooci5fdj1lLHIuX3M9MSxub3RpZnkociwhMSkpfWNhdGNoKGUpeyRyZWplY3QuY2FsbCh7X3c6cixfZDohMX0sZSl9fX07VVNFX05BVElWRXx8KCRQcm9taXNlPWZ1bmN0aW9uKGUpe19hbkluc3RhbmNlKHRoaXMsJFByb21pc2UsUFJPTUlTRSwiX2giKSxfYUZ1bmN0aW9uKGUpLEludGVybmFsLmNhbGwodGhpcyk7dHJ5e2UoX2N0eCgkcmVzb2x2ZSx0aGlzLDEpLF9jdHgoJHJlamVjdCx0aGlzLDEpKX1jYXRjaChlKXskcmVqZWN0LmNhbGwodGhpcyxlKX19LEludGVybmFsPWZ1bmN0aW9uKGUpe3RoaXMuX2M9W10sdGhpcy5fYT12b2lkIDAsdGhpcy5fcz0wLHRoaXMuX2Q9ITEsdGhpcy5fdj12b2lkIDAsdGhpcy5faD0wLHRoaXMuX249ITF9LEludGVybmFsLnByb3RvdHlwZT1fcmVkZWZpbmVBbGwoJFByb21pc2UucHJvdG90eXBlLHt0aGVuOmZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3UHJvbWlzZUNhcGFiaWxpdHkoX3NwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCRQcm9taXNlKSk7cmV0dXJuIG4ub2s9ImZ1bmN0aW9uIiE9dHlwZW9mIGV8fGUsbi5mYWlsPSJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0LG4uZG9tYWluPWlzTm9kZT9wcm9jZXNzJDEuZG9tYWluOnZvaWQgMCx0aGlzLl9jLnB1c2gobiksdGhpcy5fYSYmdGhpcy5fYS5wdXNoKG4pLHRoaXMuX3MmJm5vdGlmeSh0aGlzLCExKSxuLnByb21pc2V9LGNhdGNoOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRoZW4odm9pZCAwLGUpfX0pLE93blByb21pc2VDYXBhYmlsaXR5PWZ1bmN0aW9uKCl7dmFyIGU9bmV3IEludGVybmFsO3RoaXMucHJvbWlzZT1lLHRoaXMucmVzb2x2ZT1fY3R4KCRyZXNvbHZlLGUsMSksdGhpcy5yZWplY3Q9X2N0eCgkcmVqZWN0LGUsMSl9LF9uZXdQcm9taXNlQ2FwYWJpbGl0eS5mPW5ld1Byb21pc2VDYXBhYmlsaXR5PWZ1bmN0aW9uKGUpe3JldHVybiBlPT09JFByb21pc2V8fGU9PT1XcmFwcGVyP25ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShlKTpuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoZSl9KSxfZXhwb3J0KF9leHBvcnQuRytfZXhwb3J0LlcrX2V4cG9ydC5GKiFVU0VfTkFUSVZFLHtQcm9taXNlOiRQcm9taXNlfSksX3NldFRvU3RyaW5nVGFnKCRQcm9taXNlLFBST01JU0UpLF9zZXRTcGVjaWVzKFBST01JU0UpLFdyYXBwZXI9X2NvcmVbUFJPTUlTRV0sX2V4cG9ydChfZXhwb3J0LlMrX2V4cG9ydC5GKiFVU0VfTkFUSVZFLFBST01JU0Use3JlamVjdDpmdW5jdGlvbihlKXt2YXIgdD1uZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKTtyZXR1cm4oMCx0LnJlamVjdCkoZSksdC5wcm9taXNlfX0pLF9leHBvcnQoX2V4cG9ydC5TK19leHBvcnQuRiooX2xpYnJhcnl8fCFVU0VfTkFUSVZFKSxQUk9NSVNFLHtyZXNvbHZlOmZ1bmN0aW9uKGUpe3JldHVybiBfcHJvbWlzZVJlc29sdmUoX2xpYnJhcnkmJnRoaXM9PT1XcmFwcGVyPyRQcm9taXNlOnRoaXMsZSl9fSksX2V4cG9ydChfZXhwb3J0LlMrX2V4cG9ydC5GKiEoVVNFX05BVElWRSYmX2l0ZXJEZXRlY3QoZnVuY3Rpb24oZSl7JFByb21pc2UuYWxsKGUpLmNhdGNoKGVtcHR5KX0pKSxQUk9NSVNFLHthbGw6ZnVuY3Rpb24oZSl7dmFyIGE9dGhpcyx0PW5ld1Byb21pc2VDYXBhYmlsaXR5KGEpLHM9dC5yZXNvbHZlLGM9dC5yZWplY3Qsbj1fcGVyZm9ybShmdW5jdGlvbigpe3ZhciByPVtdLGk9MCxvPTE7X2Zvck9mKGUsITEsZnVuY3Rpb24oZSl7dmFyIHQ9aSsrLG49ITE7ci5wdXNoKHZvaWQgMCksbysrLGEucmVzb2x2ZShlKS50aGVuKGZ1bmN0aW9uKGUpe258fChuPSEwLHJbdF09ZSwtLW98fHMocikpfSxjKX0pLC0tb3x8cyhyKX0pO3JldHVybiBuLmUmJmMobi52KSx0LnByb21pc2V9LHJhY2U6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPW5ld1Byb21pc2VDYXBhYmlsaXR5KHQpLHI9bi5yZWplY3QsaT1fcGVyZm9ybShmdW5jdGlvbigpe19mb3JPZihlLCExLGZ1bmN0aW9uKGUpe3QucmVzb2x2ZShlKS50aGVuKG4ucmVzb2x2ZSxyKX0pfSk7cmV0dXJuIGkuZSYmcihpLnYpLG4ucHJvbWlzZX19KTt2YXIgJGluY2x1ZGVzPV9hcnJheUluY2x1ZGVzKCEwKTtfZXhwb3J0KF9leHBvcnQuUCwiQXJyYXkiLHtpbmNsdWRlczpmdW5jdGlvbihlKXtyZXR1cm4gJGluY2x1ZGVzKHRoaXMsZSwxPGFyZ3VtZW50cy5sZW5ndGg/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSksX2FkZFRvVW5zY29wYWJsZXMoImluY2x1ZGVzIik7dmFyIGlzRW51bT1fb2JqZWN0UGllLmYsX29iamVjdFRvQXJyYXk9ZnVuY3Rpb24ocyl7cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPV90b0lvYmplY3QoZSkscj1fb2JqZWN0S2V5cyhuKSxpPXIubGVuZ3RoLG89MCxhPVtdO288aTspaXNFbnVtLmNhbGwobix0PXJbbysrXSkmJmEucHVzaChzP1t0LG5bdF1dOm5bdF0pO3JldHVybiBhfX0sJHZhbHVlcz1fb2JqZWN0VG9BcnJheSghMSk7X2V4cG9ydChfZXhwb3J0LlMsIk9iamVjdCIse3ZhbHVlczpmdW5jdGlvbihlKXtyZXR1cm4gJHZhbHVlcyhlKX19KTt2YXIgb3JpZ2luYWxDb25zb2xlPWdsb2JhbC5jb25zb2xlO2Z1bmN0aW9uIHNldE5hdGl2ZUNvbnNvbGUoKXtpZihnZW5lcmF0ZUxldmVsTWFwKCksZ2xvYmFsLldYRW52aXJvbm1lbnQmJiJXZWIiIT09Z2xvYmFsLldYRW52aXJvbm1lbnQucGxhdGZvcm0pZ2xvYmFsLmNvbnNvbGU9e2RlYnVnOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2NoZWNrTGV2ZWwoImRlYnVnIikmJmdsb2JhbC5uYXRpdmVMb2cuYXBwbHkoZ2xvYmFsLGZvcm1hdChlKS5jb25jYXQoWyJfX0RFQlVHIl0pKX0sbG9nOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2NoZWNrTGV2ZWwoImxvZyIpJiZnbG9iYWwubmF0aXZlTG9nLmFwcGx5KGdsb2JhbCxmb3JtYXQoZSkuY29uY2F0KFsiX19MT0ciXSkpfSxpbmZvOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2NoZWNrTGV2ZWwoImluZm8iKSYmZ2xvYmFsLm5hdGl2ZUxvZy5hcHBseShnbG9iYWwsZm9ybWF0KGUpLmNvbmNhdChbIl9fSU5GTyJdKSl9LHdhcm46ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07Y2hlY2tMZXZlbCgid2FybiIpJiZnbG9iYWwubmF0aXZlTG9nLmFwcGx5KGdsb2JhbCxmb3JtYXQoZSkuY29uY2F0KFsiX19XQVJOIl0pKX0sZXJyb3I6ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07Y2hlY2tMZXZlbCgiZXJyb3IiKSYmZ2xvYmFsLm5hdGl2ZUxvZy5hcHBseShnbG9iYWwsZm9ybWF0KGUpLmNvbmNhdChbIl9fRVJST1IiXSkpfX07ZWxzZXt2YXIgZT1jb25zb2xlLmRlYnVnLHQ9Y29uc29sZS5sb2csbj1jb25zb2xlLmluZm8scj1jb25zb2xlLndhcm4saT1jb25zb2xlLmVycm9yO2NvbnNvbGUuX19vcmlfXz17ZGVidWc6ZSxsb2c6dCxpbmZvOm4sd2FybjpyLGVycm9yOml9LGNvbnNvbGUuZGVidWc9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07Y2hlY2tMZXZlbCgiZGVidWciKSYmY29uc29sZS5fX29yaV9fLmRlYnVnLmFwcGx5KGNvbnNvbGUsZSl9LGNvbnNvbGUubG9nPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2NoZWNrTGV2ZWwoImxvZyIpJiZjb25zb2xlLl9fb3JpX18ubG9nLmFwcGx5KGNvbnNvbGUsZSl9LGNvbnNvbGUuaW5mbz1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtjaGVja0xldmVsKCJpbmZvIikmJmNvbnNvbGUuX19vcmlfXy5pbmZvLmFwcGx5KGNvbnNvbGUsZSl9LGNvbnNvbGUud2Fybj1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtjaGVja0xldmVsKCJ3YXJuIikmJmNvbnNvbGUuX19vcmlfXy53YXJuLmFwcGx5KGNvbnNvbGUsZSl9LGNvbnNvbGUuZXJyb3I9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07Y2hlY2tMZXZlbCgiZXJyb3IiKSYmY29uc29sZS5fX29yaV9fLmVycm9yLmFwcGx5KGNvbnNvbGUsZSl9fX1mdW5jdGlvbiBmb3JtYXQoZSl7cmV0dXJuIGUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlPSJbb2JqZWN0IG9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnRvTG93ZXJDYXNlKCk/SlNPTi5zdHJpbmdpZnkoZSk6U3RyaW5nKGUpfSl9dmFyIG9yaWdpbmFsU2V0VGltZW91dD1nbG9iYWwuc2V0VGltZW91dCxzZXRUaW1lb3V0TmF0aXZlPWdsb2JhbC5zZXRUaW1lb3V0TmF0aXZlO2Z1bmN0aW9uIHNldE5hdGl2ZVRpbWVyKCl7aWYodm9pZCAwPT09c2V0VGltZW91dCYmImZ1bmN0aW9uIj09dHlwZW9mIHNldFRpbWVvdXROYXRpdmUpe3ZhciBuPXt9LHI9MDtnbG9iYWwuc2V0VGltZW91dD1mdW5jdGlvbihlLHQpe25bKytyXT1lLHNldFRpbWVvdXROYXRpdmUoci50b1N0cmluZygpLHQpfSxnbG9iYWwuc2V0VGltZW91dENhbGxiYWNrPWZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBuW2VdJiYobltlXSgpLGRlbGV0ZSBuW2VdKX19fXNldE5hdGl2ZVRpbWVyKCksInVuZGVmaW5lZCI9PXR5cGVvZiBXWEVudmlyb25tZW50fHxXWEVudmlyb25tZW50Ll9fZW5hYmxlX25hdGl2ZV9wcm9taXNlX187dmFyIGZhY3Rvcnk9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24oZSl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsYSx0KXt2YXIgXz1PYmplY3QuZnJlZXplKHt9KTtmdW5jdGlvbiBFKGUpe3JldHVybiBudWxsPT1lfWZ1bmN0aW9uIEkoZSl7cmV0dXJuIG51bGwhPWV9ZnVuY3Rpb24gQShlKXtyZXR1cm4hMD09PWV9ZnVuY3Rpb24gJChlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZXx8InN5bWJvbCI9PXR5cGVvZiBlfHwiYm9vbGVhbiI9PXR5cGVvZiBlfWZ1bmN0aW9uIGIoZSl7cmV0dXJuIG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV9dmFyIHI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBkKGUpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09ci5jYWxsKGUpfWZ1bmN0aW9uIGkoZSl7dmFyIHQ9cGFyc2VGbG9hdChTdHJpbmcoZSkpO3JldHVybiAwPD10JiZNYXRoLmZsb29yKHQpPT09dCYmaXNGaW5pdGUoZSl9ZnVuY3Rpb24gdyhlKXtyZXR1cm4gSShlKSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudGhlbiYmImZ1bmN0aW9uIj09dHlwZW9mIGUuY2F0Y2h9ZnVuY3Rpb24gbihlKXtyZXR1cm4gbnVsbD09ZT8iIjpBcnJheS5pc0FycmF5KGUpfHxkKGUpJiZlLnRvU3RyaW5nPT09cj9KU09OLnN0cmluZ2lmeShlLG51bGwsMik6U3RyaW5nKGUpfWZ1bmN0aW9uIG8oZSl7dmFyIHQ9cGFyc2VGbG9hdChlKTtyZXR1cm4gaXNOYU4odCk/ZTp0fWZ1bmN0aW9uIHMoZSx0KXtmb3IodmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPWUuc3BsaXQoIiwiKSxpPTA7aTxyLmxlbmd0aDtpKyspbltyW2ldXT0hMDtyZXR1cm4gdD9mdW5jdGlvbihlKXtyZXR1cm4gbltlLnRvTG93ZXJDYXNlKCldfTpmdW5jdGlvbihlKXtyZXR1cm4gbltlXX19cygic2xvdCxjb21wb25lbnQiLCEwKTt2YXIgbD1zKCJrZXkscmVmLHNsb3Qsc2xvdC1zY29wZSxpcyIpO2Z1bmN0aW9uIGsoZSx0KXtpZihlLmxlbmd0aCl7dmFyIG49ZS5pbmRleE9mKHQpO2lmKC0xPG4pcmV0dXJuIGUuc3BsaWNlKG4sMSl9fXZhciBjPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gZihlLHQpe3JldHVybiBjLmNhbGwoZSx0KX1mdW5jdGlvbiB1KHQpe3ZhciBuPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBuW2VdfHwobltlXT10KGUpKX19dmFyIHA9Ly0oXHcpL2csaD11KGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UocCxmdW5jdGlvbihlLHQpe3JldHVybiB0P3QudG9VcHBlckNhc2UoKToiIn0pfSksdj11KGZ1bmN0aW9uKGUpe3JldHVybiBlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSl9KSxnPS9cQihbQS1aXSkvZyxTPXUoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShnLCItJDEiKS50b0xvd2VyQ2FzZSgpfSk7dmFyIG09RnVuY3Rpb24ucHJvdG90eXBlLmJpbmQ/ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5iaW5kKHQpfTpmdW5jdGlvbihuLHIpe2Z1bmN0aW9uIGUoZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gdD8xPHQ/bi5hcHBseShyLGFyZ3VtZW50cyk6bi5jYWxsKHIsZSk6bi5jYWxsKHIpfXJldHVybiBlLl9sZW5ndGg9bi5sZW5ndGgsZX07ZnVuY3Rpb24geShlLHQpe3Q9dHx8MDtmb3IodmFyIG49ZS5sZW5ndGgtdCxyPW5ldyBBcnJheShuKTtuLS07KXJbbl09ZVtuK3RdO3JldHVybiByfWZ1bmN0aW9uIEIoZSx0KXtmb3IodmFyIG4gaW4gdCllW25dPXRbbl07cmV0dXJuIGV9ZnVuY3Rpb24geChlKXtmb3IodmFyIHQ9e30sbj0wO248ZS5sZW5ndGg7bisrKWVbbl0mJkIodCxlW25dKTtyZXR1cm4gdH1mdW5jdGlvbiBOKGUsdCxuKXt9dmFyIEM9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiExfSxUPWZ1bmN0aW9uKGUpe3JldHVybiBlfTtmdW5jdGlvbiBPKHQsbil7aWYodD09PW4pcmV0dXJuITA7dmFyIGU9Yih0KSxyPWIobik7aWYoIWV8fCFyKXJldHVybiFlJiYhciYmU3RyaW5nKHQpPT09U3RyaW5nKG4pO3RyeXt2YXIgaT1BcnJheS5pc0FycmF5KHQpLG89QXJyYXkuaXNBcnJheShuKTtpZihpJiZvKXJldHVybiB0Lmxlbmd0aD09PW4ubGVuZ3RoJiZ0LmV2ZXJ5KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIE8oZSxuW3RdKX0pO2lmKHQgaW5zdGFuY2VvZiBEYXRlJiZuIGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gdC5nZXRUaW1lKCk9PT1uLmdldFRpbWUoKTtpZihpfHxvKXJldHVybiExO3ZhciBhPU9iamVjdC5rZXlzKHQpLHM9T2JqZWN0LmtleXMobik7cmV0dXJuIGEubGVuZ3RoPT09cy5sZW5ndGgmJmEuZXZlcnkoZnVuY3Rpb24oZSl7cmV0dXJuIE8odFtlXSxuW2VdKX0pfWNhdGNoKGUpe3JldHVybiExfX1mdW5jdGlvbiBQKGUsdCl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspaWYoTyhlW25dLHQpKXJldHVybiBuO3JldHVybi0xfWZ1bmN0aW9uIEQoZSl7dmFyIHQ9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7dHx8KHQ9ITAsZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfX12YXIgTT0iZGF0YS1zZXJ2ZXItcmVuZGVyZWQiLGo9WyJjb21wb25lbnQiLCJkaXJlY3RpdmUiLCJmaWx0ZXIiXSxMPVsiYmVmb3JlQ3JlYXRlIiwiY3JlYXRlZCIsImJlZm9yZU1vdW50IiwibW91bnRlZCIsImJlZm9yZVVwZGF0ZSIsInVwZGF0ZWQiLCJiZWZvcmVEZXN0cm95IiwiZGVzdHJveWVkIiwiYWN0aXZhdGVkIiwiZGVhY3RpdmF0ZWQiLCJlcnJvckNhcHR1cmVkIiwic2VydmVyUHJlZmV0Y2giXSxSPXtvcHRpb25NZXJnZVN0cmF0ZWdpZXM6T2JqZWN0LmNyZWF0ZShudWxsKSxzaWxlbnQ6ITEscHJvZHVjdGlvblRpcDohMSxkZXZ0b29sczohMSxwZXJmb3JtYW5jZTohMSxlcnJvckhhbmRsZXI6bnVsbCx3YXJuSGFuZGxlcjpudWxsLGlnbm9yZWRFbGVtZW50czpbXSxrZXlDb2RlczpPYmplY3QuY3JlYXRlKG51bGwpLGlzUmVzZXJ2ZWRUYWc6Qyxpc1Jlc2VydmVkQXR0cjpDLGlzVW5rbm93bkVsZW1lbnQ6QyxnZXRUYWdOYW1lc3BhY2U6TixwYXJzZVBsYXRmb3JtVGFnTmFtZTpULG11c3RVc2VQcm9wOkMsYXN5bmM6ITAsX2xpZmVjeWNsZUhvb2tzOkx9O2Z1bmN0aW9uIEYoZSx0LG4scil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEhcix3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KX12YXIgej1uZXcgUmVnRXhwKCJbXiIrL2EtekEtWlx1MDBCN1x1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDM3RFx1MDM3Ri1cdTFGRkZcdTIwMEMtXHUyMDBEXHUyMDNGLVx1MjA0MFx1MjA3MC1cdTIxOEZcdTJDMDAtXHUyRkVGXHUzMDAxLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkZELy5zb3VyY2UrIi4kX1xcZF0iKTt2YXIgVixVPSJfX3Byb3RvX18iaW57fSxxPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93LFc9InVuZGVmaW5lZCIhPXR5cGVvZiBXWEVudmlyb25tZW50JiYhIVdYRW52aXJvbm1lbnQucGxhdGZvcm0sSD1XJiZXWEVudmlyb25tZW50LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCksRz1xJiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLFg9RyYmL21zaWV8dHJpZGVudC8udGVzdChHKSxZPUcmJjA8Ry5pbmRleE9mKCJtc2llIDkuMCIpLEo9RyYmMDxHLmluZGV4T2YoImVkZ2UvIiksSz0oRyYmRy5pbmRleE9mKCJhbmRyb2lkIiksRyYmL2lwaG9uZXxpcGFkfGlwb2R8aW9zLy50ZXN0KEcpLEcmJi9jaHJvbWVcL1xkKy8udGVzdChHKSxHJiYvcGhhbnRvbWpzLy50ZXN0KEcpLEcmJkcubWF0Y2goL2ZpcmVmb3hcLyhcZCspLykse30ud2F0Y2gpO2lmKHEpdHJ5e3ZhciBaPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShaLCJwYXNzaXZlIix7Z2V0OmZ1bmN0aW9uKCl7fX0pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0LXBhc3NpdmUiLG51bGwsWil9Y2F0Y2goZSl7fXZhciBRPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PVYmJihWPSFxJiYhVyYmdm9pZCAwIT09Z2xvYmFsJiYoZ2xvYmFsLnByb2Nlc3MmJiJzZXJ2ZXIiPT09Z2xvYmFsLnByb2Nlc3MuZW52LlZVRV9FTlYpKSxWfSxlZT1xJiZ3aW5kb3cuX19WVUVfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztmdW5jdGlvbiB0ZShlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYmL25hdGl2ZSBjb2RlLy50ZXN0KGUudG9TdHJpbmcoKSl9dmFyIG5lLHJlPSJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZ0ZShTeW1ib2wpJiYidW5kZWZpbmVkIiE9dHlwZW9mIFJlZmxlY3QmJnRlKFJlZmxlY3Qub3duS2V5cyk7bmU9InVuZGVmaW5lZCIhPXR5cGVvZiBTZXQmJnRlKFNldCk/U2V0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3RoaXMuc2V0PU9iamVjdC5jcmVhdGUobnVsbCl9cmV0dXJuIGUucHJvdG90eXBlLmhhcz1mdW5jdGlvbihlKXtyZXR1cm4hMD09PXRoaXMuc2V0W2VdfSxlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oZSl7dGhpcy5zZXRbZV09ITB9LGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5zZXQ9T2JqZWN0LmNyZWF0ZShudWxsKX0sZX0oKTt2YXIgaWU9TixvZT0wLGFlPWZ1bmN0aW9uKCl7dGhpcy5pZD12b2lkIDAhPT10P3QudWlkKys6b2UrKyx0aGlzLnN1YnM9W119O2Z1bmN0aW9uIHNlKGUpe2FlLlNoYXJlZE9iamVjdC50YXJnZXRTdGFjay5wdXNoKGUpLGFlLlNoYXJlZE9iamVjdC50YXJnZXQ9ZX1mdW5jdGlvbiBjZSgpe2FlLlNoYXJlZE9iamVjdC50YXJnZXRTdGFjay5wb3AoKSxhZS5TaGFyZWRPYmplY3QudGFyZ2V0PWFlLlNoYXJlZE9iamVjdC50YXJnZXRTdGFja1thZS5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2subGVuZ3RoLTFdfWFlLnByb3RvdHlwZS5hZGRTdWI9ZnVuY3Rpb24oZSl7dGhpcy5zdWJzLnB1c2goZSl9LGFlLnByb3RvdHlwZS5yZW1vdmVTdWI9ZnVuY3Rpb24oZSl7ayh0aGlzLnN1YnMsZSl9LGFlLnByb3RvdHlwZS5kZXBlbmQ9ZnVuY3Rpb24oKXthZS5TaGFyZWRPYmplY3QudGFyZ2V0JiZhZS5TaGFyZWRPYmplY3QudGFyZ2V0LmFkZERlcCh0aGlzKX0sYWUucHJvdG90eXBlLm5vdGlmeT1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLnN1YnMuc2xpY2UoKSx0PTAsbj1lLmxlbmd0aDt0PG47dCsrKWVbdF0udXBkYXRlKCl9LGFlLlNoYXJlZE9iamVjdD12b2lkIDAhPT10P3Q6e30sYWUuU2hhcmVkT2JqZWN0LnRhcmdldD1udWxsLGFlLlNoYXJlZE9iamVjdC50YXJnZXRTdGFjaz1bXTt2YXIgdWU9ZnVuY3Rpb24oZSx0LG4scixpLG8sYSxzKXt0JiZBcnJheS5pc0FycmF5KHQuY2xhc3MpJiYodC5jbGFzcz10LmNsYXNzLnNsaWNlKDApKSx0aGlzLnRhZz1lLHRoaXMuZGF0YT10LHRoaXMuY2hpbGRyZW49bix0aGlzLnRleHQ9cix0aGlzLmVsbT1pLHRoaXMubnM9dm9pZCAwLHRoaXMuY29udGV4dD1vLHRoaXMuZm5Db250ZXh0PXZvaWQgMCx0aGlzLmZuT3B0aW9ucz12b2lkIDAsdGhpcy5mblNjb3BlSWQ9dm9pZCAwLHRoaXMua2V5PXQmJnQua2V5LHRoaXMuY29tcG9uZW50T3B0aW9ucz1hLHRoaXMuY29tcG9uZW50SW5zdGFuY2U9dm9pZCAwLHRoaXMucGFyZW50PXZvaWQgMCx0aGlzLnJhdz0hMSx0aGlzLmlzU3RhdGljPSExLHRoaXMuaXNSb290SW5zZXJ0PSEwLHRoaXMuaXNDb21tZW50PSExLHRoaXMuaXNDbG9uZWQ9ITEsdGhpcy5pc09uY2U9ITEsdGhpcy5hc3luY0ZhY3Rvcnk9cyx0aGlzLmFzeW5jTWV0YT12b2lkIDAsdGhpcy5pc0FzeW5jUGxhY2Vob2xkZXI9ITF9LGxlPXtjaGlsZDp7Y29uZmlndXJhYmxlOiEwfX07bGUuY2hpbGQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcG9uZW50SW5zdGFuY2V9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHVlLnByb3RvdHlwZSxsZSk7dmFyIGRlPWZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPSIiKTt2YXIgdD1uZXcgdWU7cmV0dXJuIHQudGV4dD1lLHQuaXNDb21tZW50PSEwLHR9O2Z1bmN0aW9uIGZlKGUpe3JldHVybiBuZXcgdWUodm9pZCAwLHZvaWQgMCx2b2lkIDAsU3RyaW5nKGUpKX1mdW5jdGlvbiBwZShlKXt2YXIgdD1uZXcgdWUoZS50YWcsZS5kYXRhLGUuY2hpbGRyZW4mJmUuY2hpbGRyZW4uc2xpY2UoKSxlLnRleHQsZS5lbG0sZS5jb250ZXh0LGUuY29tcG9uZW50T3B0aW9ucyxlLmFzeW5jRmFjdG9yeSk7cmV0dXJuIHQubnM9ZS5ucyx0LmlzU3RhdGljPWUuaXNTdGF0aWMsdC5rZXk9ZS5rZXksdC5pc0NvbW1lbnQ9ZS5pc0NvbW1lbnQsdC5mbkNvbnRleHQ9ZS5mbkNvbnRleHQsdC5mbk9wdGlvbnM9ZS5mbk9wdGlvbnMsdC5mblNjb3BlSWQ9ZS5mblNjb3BlSWQsdC5hc3luY01ldGE9ZS5hc3luY01ldGEsdC5pc0Nsb25lZD0hMCx0fXZhciBoZT1BcnJheS5wcm90b3R5cGUsdmU9T2JqZWN0LmNyZWF0ZShoZSk7WyJwdXNoIiwicG9wIiwic2hpZnQiLCJ1bnNoaWZ0Iiwic3BsaWNlIiwic29ydCIsInJldmVyc2UiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBzPWhlW2FdO0YodmUsYSxmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMsdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGg7bi0tOyl0W25dPWVbbl07dmFyIHIsaT1zLmFwcGx5KHRoaXMsdCksbz10aGlzLl9fb2JfXztzd2l0Y2goYSl7Y2FzZSJwdXNoIjpjYXNlInVuc2hpZnQiOnI9dDticmVhaztjYXNlInNwbGljZSI6cj10LnNsaWNlKDIpfXJldHVybiByJiZvLm9ic2VydmVBcnJheShyKSxvLmRlcC5ub3RpZnkoKSxpfSl9KTt2YXIgZ2U9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmUpLG1lPSEwO2Z1bmN0aW9uIHllKGUpe21lPWV9dmFyIF9lPWZ1bmN0aW9uKGUpe3ZhciB0O3RoaXMudmFsdWU9ZSx0aGlzLmRlcD1uZXcgYWUsdGhpcy52bUNvdW50PTAsRihlLCJfX29iX18iLHRoaXMpLEFycmF5LmlzQXJyYXkoZSk/KFU/KHQ9dmUsZS5fX3Byb3RvX189dCk6ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj0wLGk9bi5sZW5ndGg7cjxpO3IrKyl7dmFyIG89bltyXTtGKGUsbyx0W29dKX19KGUsdmUsZ2UpLHRoaXMub2JzZXJ2ZUFycmF5KGUpKTp0aGlzLndhbGsoZSl9O2Z1bmN0aW9uIGJlKGUsdCl7dmFyIG47aWYoYihlKSYmIShlIGluc3RhbmNlb2YgdWUpKXJldHVybiBmKGUsIl9fb2JfXyIpJiZlLl9fb2JfXyBpbnN0YW5jZW9mIF9lP249ZS5fX29iX186bWUmJiFRKCkmJihBcnJheS5pc0FycmF5KGUpfHxkKGUpKSYmT2JqZWN0LmlzRXh0ZW5zaWJsZShlKSYmIWUuX2lzVnVlJiYobj1uZXcgX2UoZSkpLHQmJm4mJm4udm1Db3VudCsrLG59ZnVuY3Rpb24gd2UobixlLHIsdCxpKXt2YXIgbz1uZXcgYWUsYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSk7aWYoIWF8fCExIT09YS5jb25maWd1cmFibGUpe3ZhciBzPWEmJmEuZ2V0LGM9YSYmYS5zZXQ7cyYmIWN8fDIhPT1hcmd1bWVudHMubGVuZ3RofHwocj1uW2VdKTt2YXIgdT0haSYmYmUocik7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4sZSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7dmFyIGU9cz9zLmNhbGwobik6cjtyZXR1cm4gYWUuU2hhcmVkT2JqZWN0LnRhcmdldCYmKG8uZGVwZW5kKCksdSYmKHUuZGVwLmRlcGVuZCgpLEFycmF5LmlzQXJyYXkoZSkmJmZ1bmN0aW9uIGUodCl7Zm9yKHZhciBuPXZvaWQgMCxyPTAsaT10Lmxlbmd0aDtyPGk7cisrKShuPXRbcl0pJiZuLl9fb2JfXyYmbi5fX29iX18uZGVwLmRlcGVuZCgpLEFycmF5LmlzQXJyYXkobikmJmUobil9KGUpKSksZX0sc2V0OmZ1bmN0aW9uKGUpe3ZhciB0PXM/cy5jYWxsKG4pOnI7ZT09PXR8fGUhPWUmJnQhPXR8fHMmJiFjfHwoYz9jLmNhbGwobixlKTpyPWUsdT0haSYmYmUoZSksby5ub3RpZnkoKSl9fSl9fWZ1bmN0aW9uIGtlKGUsdCxuKXtpZihBcnJheS5pc0FycmF5KGUpJiZpKHQpKXJldHVybiBlLmxlbmd0aD1NYXRoLm1heChlLmxlbmd0aCx0KSxlLnNwbGljZSh0LDEsbiksbjtpZih0IGluIGUmJiEodCBpbiBPYmplY3QucHJvdG90eXBlKSlyZXR1cm4gZVt0XT1uO3ZhciByPWUuX19vYl9fO3JldHVybiBlLl9pc1Z1ZXx8ciYmci52bUNvdW50P246cj8od2Uoci52YWx1ZSx0LG4pLHIuZGVwLm5vdGlmeSgpLG4pOmVbdF09bn1mdW5jdGlvbiBTZShlLHQpe2lmKEFycmF5LmlzQXJyYXkoZSkmJmkodCkpZS5zcGxpY2UodCwxKTtlbHNle3ZhciBuPWUuX19vYl9fO2UuX2lzVnVlfHxuJiZuLnZtQ291bnR8fGYoZSx0KSYmKGRlbGV0ZSBlW3RdLG4mJm4uZGVwLm5vdGlmeSgpKX19X2UucHJvdG90eXBlLndhbGs9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoO24rKyl3ZShlLHRbbl0pfSxfZS5wcm90b3R5cGUub2JzZXJ2ZUFycmF5PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49ZS5sZW5ndGg7dDxuO3QrKyliZShlW3RdKX07dmFyIHhlPVIub3B0aW9uTWVyZ2VTdHJhdGVnaWVzO2Z1bmN0aW9uIENlKGUsdCl7aWYoIXQpcmV0dXJuIGU7Zm9yKHZhciBuLHIsaSxvPXJlP1JlZmxlY3Qub3duS2V5cyh0KTpPYmplY3Qua2V5cyh0KSxhPTA7YTxvLmxlbmd0aDthKyspIl9fb2JfXyIhPT0obj1vW2FdKSYmKHI9ZVtuXSxpPXRbbl0sZihlLG4pP3IhPT1pJiZkKHIpJiZkKGkpJiZDZShyLGkpOmtlKGUsbixpKSk7cmV0dXJuIGV9ZnVuY3Rpb24gVGUobixyLGkpe3JldHVybiBpP2Z1bmN0aW9uKCl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHI/ci5jYWxsKGksaSk6cix0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP24uY2FsbChpLGkpOm47cmV0dXJuIGU/Q2UoZSx0KTp0fTpyP24/ZnVuY3Rpb24oKXtyZXR1cm4gQ2UoImZ1bmN0aW9uIj09dHlwZW9mIHI/ci5jYWxsKHRoaXMsdGhpcyk6ciwiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmNhbGwodGhpcyx0aGlzKTpuKX06cjpufWZ1bmN0aW9uIE9lKGUsdCl7dmFyIG49dD9lP2UuY29uY2F0KHQpOkFycmF5LmlzQXJyYXkodCk/dDpbdF06ZTtyZXR1cm4gbj9mdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7bisrKS0xPT09dC5pbmRleE9mKGVbbl0pJiZ0LnB1c2goZVtuXSk7cmV0dXJuIHR9KG4pOm59ZnVuY3Rpb24gRWUoZSx0LG4scil7dmFyIGk9T2JqZWN0LmNyZWF0ZShlfHxudWxsKTtyZXR1cm4gdD9CKGksdCk6aX14ZS5kYXRhPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj9UZShlLHQsbik6dCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTpUZShlLHQpfSxMLmZvckVhY2goZnVuY3Rpb24oZSl7eGVbZV09T2V9KSxqLmZvckVhY2goZnVuY3Rpb24oZSl7eGVbZSsicyJdPUVlfSkseGUud2F0Y2g9ZnVuY3Rpb24oZSx0LG4scil7aWYoZT09PUsmJihlPXZvaWQgMCksdD09PUsmJih0PXZvaWQgMCksIXQpcmV0dXJuIE9iamVjdC5jcmVhdGUoZXx8bnVsbCk7aWYoIWUpcmV0dXJuIHQ7dmFyIGk9e307Zm9yKHZhciBvIGluIEIoaSxlKSx0KXt2YXIgYT1pW29dLHM9dFtvXTthJiYhQXJyYXkuaXNBcnJheShhKSYmKGE9W2FdKSxpW29dPWE/YS5jb25jYXQocyk6QXJyYXkuaXNBcnJheShzKT9zOltzXX1yZXR1cm4gaX0seGUucHJvcHM9eGUubWV0aG9kcz14ZS5pbmplY3Q9eGUuY29tcHV0ZWQ9ZnVuY3Rpb24oZSx0LG4scil7aWYoIWUpcmV0dXJuIHQ7dmFyIGk9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gQihpLGUpLHQmJkIoaSx0KSxpfSx4ZS5wcm92aWRlPVRlO3ZhciBJZT1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT10P2U6dH07ZnVuY3Rpb24gQWUobixyLGkpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiByJiYocj1yLm9wdGlvbnMpLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5wcm9wcztpZihuKXt2YXIgcixpLG89e307aWYoQXJyYXkuaXNBcnJheShuKSlmb3Iocj1uLmxlbmd0aDtyLS07KSJzdHJpbmciPT10eXBlb2YoaT1uW3JdKSYmKG9baChpKV09e3R5cGU6bnVsbH0pO2Vsc2UgaWYoZChuKSlmb3IodmFyIGEgaW4gbilpPW5bYV0sb1toKGEpXT1kKGkpP2k6e3R5cGU6aX07ZS5wcm9wcz1vfX0ociksZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmluamVjdDtpZihuKXt2YXIgcj1lLmluamVjdD17fTtpZihBcnJheS5pc0FycmF5KG4pKWZvcih2YXIgaT0wO2k8bi5sZW5ndGg7aSsrKXJbbltpXV09e2Zyb206bltpXX07ZWxzZSBpZihkKG4pKWZvcih2YXIgbyBpbiBuKXt2YXIgYT1uW29dO3Jbb109ZChhKT9CKHtmcm9tOm99LGEpOntmcm9tOmF9fX19KHIpLGZ1bmN0aW9uKGUpe3ZhciB0PWUuZGlyZWN0aXZlcztpZih0KWZvcih2YXIgbiBpbiB0KXt2YXIgcj10W25dOyJmdW5jdGlvbiI9PXR5cGVvZiByJiYodFtuXT17YmluZDpyLHVwZGF0ZTpyfSl9fShyKSwhci5fYmFzZSYmKHIuZXh0ZW5kcyYmKG49QWUobixyLmV4dGVuZHMsaSkpLHIubWl4aW5zKSlmb3IodmFyIGU9MCx0PXIubWl4aW5zLmxlbmd0aDtlPHQ7ZSsrKW49QWUobixyLm1peGluc1tlXSxpKTt2YXIgbyxhPXt9O2ZvcihvIGluIG4pcyhvKTtmb3IobyBpbiByKWYobixvKXx8cyhvKTtmdW5jdGlvbiBzKGUpe3ZhciB0PXhlW2VdfHxJZTthW2VdPXQobltlXSxyW2VdLGksZSl9cmV0dXJuIGF9ZnVuY3Rpb24gJGUoZSx0LG4scil7aWYoInN0cmluZyI9PXR5cGVvZiBuKXt2YXIgaT1lW3RdO2lmKGYoaSxuKSlyZXR1cm4gaVtuXTt2YXIgbz1oKG4pO2lmKGYoaSxvKSlyZXR1cm4gaVtvXTt2YXIgYT12KG8pO3JldHVybiBmKGksYSk/aVthXTppW25dfHxpW29dfHxpW2FdfX1mdW5jdGlvbiBQZShlLHQsbixyKXt2YXIgaT10W2VdLG89IWYobixlKSxhPW5bZV0scz1MZShCb29sZWFuLGkudHlwZSk7aWYoLTE8cylpZihvJiYhZihpLCJkZWZhdWx0IikpYT0hMTtlbHNlIGlmKCIiPT09YXx8YT09PVMoZSkpe3ZhciBjPUxlKFN0cmluZyxpLnR5cGUpOyhjPDB8fHM8YykmJihhPSEwKX1pZih2b2lkIDA9PT1hKXthPWZ1bmN0aW9uKGUsdCxuKXtpZighZih0LCJkZWZhdWx0IikpcmV0dXJuO3ZhciByPXQuZGVmYXVsdDtpZihlJiZlLiRvcHRpb25zLnByb3BzRGF0YSYmdm9pZCAwPT09ZS4kb3B0aW9ucy5wcm9wc0RhdGFbbl0mJnZvaWQgMCE9PWUuX3Byb3BzW25dKXJldHVybiBlLl9wcm9wc1tuXTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgciYmIkZ1bmN0aW9uIiE9PU1lKHQudHlwZSk/ci5jYWxsKGUpOnJ9KHIsaSxlKTt2YXIgdT1tZTt5ZSghMCksYmUoYSkseWUodSl9cmV0dXJuIGF9ZnVuY3Rpb24gTWUoZSl7dmFyIHQ9ZSYmZS50b1N0cmluZygpLm1hdGNoKC9eXHMqZnVuY3Rpb24gKFx3KykvKTtyZXR1cm4gdD90WzFdOiIifWZ1bmN0aW9uIGplKGUsdCl7cmV0dXJuIE1lKGUpPT09TWUodCl9ZnVuY3Rpb24gTGUoZSx0KXtpZighQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gamUodCxlKT8wOi0xO2Zvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyO24rKylpZihqZSh0W25dLGUpKXJldHVybiBuO3JldHVybi0xfWZ1bmN0aW9uIEJlKGUsdCxuKXtzZSgpO3RyeXtpZih0KWZvcih2YXIgcj10O3I9ci4kcGFyZW50Oyl7dmFyIGk9ci4kb3B0aW9ucy5lcnJvckNhcHR1cmVkO2lmKGkpZm9yKHZhciBvPTA7bzxpLmxlbmd0aDtvKyspdHJ5e2lmKCExPT09aVtvXS5jYWxsKHIsZSx0LG4pKXJldHVybn1jYXRjaChlKXtEZShlLHIsImVycm9yQ2FwdHVyZWQgaG9vayIpfX1EZShlLHQsbil9ZmluYWxseXtjZSgpfX1mdW5jdGlvbiBOZShlLHQsbixyLGkpe3ZhciBvO3RyeXsobz1uP2UuYXBwbHkodCxuKTplLmNhbGwodCkpJiYhby5faXNWdWUmJncobykmJiFvLl9oYW5kbGVkJiYoby5jYXRjaChmdW5jdGlvbihlKXtyZXR1cm4gQmUoZSxyLGkrIiAoUHJvbWlzZS9hc3luYykiKX0pLG8uX2hhbmRsZWQ9ITApfWNhdGNoKGUpe0JlKGUscixpKX1yZXR1cm4gb31mdW5jdGlvbiBEZSh0LGUsbil7aWYoUi5lcnJvckhhbmRsZXIpdHJ5e3JldHVybiBSLmVycm9ySGFuZGxlci5jYWxsKG51bGwsdCxlLG4pfWNhdGNoKGUpe2UhPT10JiZSZShlLG51bGwsImNvbmZpZy5lcnJvckhhbmRsZXIiKX1SZSh0LGUsbil9ZnVuY3Rpb24gUmUoZSx0LG4pe2lmKCFxJiYhV3x8InVuZGVmaW5lZCI9PXR5cGVvZiBjb25zb2xlKXRocm93IGU7Y29uc29sZS5lcnJvcihlKX12YXIgRmU9W10semU9ITE7ZnVuY3Rpb24gVmUoKXt6ZT0hMTtmb3IodmFyIGU9RmUuc2xpY2UoMCksdD1GZS5sZW5ndGg9MDt0PGUubGVuZ3RoO3QrKyllW3RdKCl9dmFyIFVlPWZ1bmN0aW9uKCl7c2V0VGltZW91dChWZSwwKX07ZnVuY3Rpb24gcWUoZSx0KXt2YXIgbjtpZihGZS5wdXNoKGZ1bmN0aW9uKCl7aWYoZSl0cnl7ZS5jYWxsKHQpfWNhdGNoKGUpe0JlKGUsdCwibmV4dFRpY2siKX1lbHNlIG4mJm4odCl9KSx6ZXx8KHplPSEwLFVlKCkpLCFlJiYidW5kZWZpbmVkIiE9dHlwZW9mIFByb21pc2UpcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUpe249ZX0pfXZhciBXZT1uZXcgbmU7ZnVuY3Rpb24gSGUoZSl7IWZ1bmN0aW9uIGUodCxuKXt2YXIgcixpO3ZhciBvPUFycmF5LmlzQXJyYXkodCk7aWYoIW8mJiFiKHQpfHxPYmplY3QuaXNGcm96ZW4odCl8fHQgaW5zdGFuY2VvZiB1ZSlyZXR1cm47aWYodC5fX29iX18pe3ZhciBhPXQuX19vYl9fLmRlcC5pZDtpZihuLmhhcyhhKSlyZXR1cm47bi5hZGQoYSl9aWYobylmb3Iocj10Lmxlbmd0aDtyLS07KWUodFtyXSxuKTtlbHNlIGZvcihpPU9iamVjdC5rZXlzKHQpLHI9aS5sZW5ndGg7ci0tOyllKHRbaVtyXV0sbil9KGUsV2UpLFdlLmNsZWFyKCl9dmFyIEdlPXUoZnVuY3Rpb24oZSl7dmFyIHQ9IiYiPT09ZS5jaGFyQXQoMCksbj0ifiI9PT0oZT10P2Uuc2xpY2UoMSk6ZSkuY2hhckF0KDApLHI9IiEiPT09KGU9bj9lLnNsaWNlKDEpOmUpLmNoYXJBdCgwKTtyZXR1cm57bmFtZTplPXI/ZS5zbGljZSgxKTplLG9uY2U6bixjYXB0dXJlOnIscGFzc2l2ZTp0fX0pO2Z1bmN0aW9uIFhlKGUsaSl7ZnVuY3Rpb24gbygpe3ZhciBlPWFyZ3VtZW50cyx0PW8uZm5zO2lmKCFBcnJheS5pc0FycmF5KHQpKXJldHVybiBOZSh0LG51bGwsYXJndW1lbnRzLGksInYtb24gaGFuZGxlciIpO2Zvcih2YXIgbj10LnNsaWNlKCkscj0wO3I8bi5sZW5ndGg7cisrKU5lKG5bcl0sbnVsbCxlLGksInYtb24gaGFuZGxlciIpfXJldHVybiBvLmZucz1lLG99ZnVuY3Rpb24gWWUoZSx0LG4scixpLG8pe3ZhciBhLHMsYyx1LGw7Zm9yKGEgaW4gZSlzPWM9ZVthXSx1PXRbYV0sbD1HZShhKSxkKHMpJiYoYz1zLmhhbmRsZXIsbC5wYXJhbXM9cy5wYXJhbXMpLEUoYyl8fChFKHUpPyhFKGMuZm5zKSYmKGM9ZVthXT1YZShjLG8pKSxBKGwub25jZSkmJihjPWVbYV09aShsLm5hbWUsYyxsLmNhcHR1cmUpKSxuKGwubmFtZSxjLGwuY2FwdHVyZSxsLnBhc3NpdmUsbC5wYXJhbXMpKTpjIT09dSYmKHUuZm5zPWMsZVthXT11KSk7Zm9yKGEgaW4gdClFKGVbYV0pJiZyKChsPUdlKGEpKS5uYW1lLHRbYV0sbC5jYXB0dXJlKX1mdW5jdGlvbiBKZShlLHQsbil7dmFyIHI7ZSBpbnN0YW5jZW9mIHVlJiYoZT1lLmRhdGEuaG9va3x8KGUuZGF0YS5ob29rPXt9KSk7dmFyIGk9ZVt0XTtmdW5jdGlvbiBvKCl7bi5hcHBseSh0aGlzLGFyZ3VtZW50cyksayhyLmZucyxvKX1FKGkpP3I9WGUoW29dKTpJKGkuZm5zKSYmQShpLm1lcmdlZCk/KHI9aSkuZm5zLnB1c2gobyk6cj1YZShbaSxvXSksci5tZXJnZWQ9ITAsZVt0XT1yfWZ1bmN0aW9uIEtlKGUsdCxuLHIsaSl7aWYoSSh0KSl7aWYoZih0LG4pKXJldHVybiBlW25dPXRbbl0saXx8ZGVsZXRlIHRbbl0sITA7aWYoZih0LHIpKXJldHVybiBlW25dPXRbcl0saXx8ZGVsZXRlIHRbcl0sITB9cmV0dXJuITF9ZnVuY3Rpb24gWmUoZSl7cmV0dXJuICQoZSk/W2ZlKGUpXTpBcnJheS5pc0FycmF5KGUpP2Z1bmN0aW9uIGUodCxuKXt2YXIgcj1bXTt2YXIgaSxvLGEscztmb3IoaT0wO2k8dC5sZW5ndGg7aSsrKUUobz10W2ldKXx8ImJvb2xlYW4iPT10eXBlb2Ygb3x8KGE9ci5sZW5ndGgtMSxzPXJbYV0sQXJyYXkuaXNBcnJheShvKT8wPG8ubGVuZ3RoJiYoUWUoKG89ZShvLChufHwiIikrIl8iK2kpKVswXSkmJlFlKHMpJiYoclthXT1mZShzLnRleHQrb1swXS50ZXh0KSxvLnNoaWZ0KCkpLHIucHVzaC5hcHBseShyLG8pKTokKG8pP1FlKHMpP3JbYV09ZmUocy50ZXh0K28pOiIiIT09byYmci5wdXNoKGZlKG8pKTpRZShvKSYmUWUocyk/clthXT1mZShzLnRleHQrby50ZXh0KTooQSh0Ll9pc1ZMaXN0KSYmSShvLnRhZykmJkUoby5rZXkpJiZJKG4pJiYoby5rZXk9Il9fdmxpc3QiK24rIl8iK2krIl9fIiksci5wdXNoKG8pKSk7cmV0dXJuIHJ9KGUpOnZvaWQgMH1mdW5jdGlvbiBRZShlKXtyZXR1cm4gSShlKSYmSShlLnRleHQpJiYhMT09PWUuaXNDb21tZW50fWZ1bmN0aW9uIGV0KGUpe3ZhciB0PWUuJG9wdGlvbnMucHJvdmlkZTt0JiYoZS5fcHJvdmlkZWQ9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dC5jYWxsKGUpOnQpfWZ1bmN0aW9uIHR0KHQpe3ZhciBuPW50KHQuJG9wdGlvbnMuaW5qZWN0LHQpO24mJih5ZSghMSksT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihlKXt3ZSh0LGUsbltlXSl9KSx5ZSghMCkpfWZ1bmN0aW9uIG50KGUsdCl7aWYoZSl7Zm9yKHZhciBuPU9iamVjdC5jcmVhdGUobnVsbCkscj1yZT9SZWZsZWN0Lm93bktleXMoZSk6T2JqZWN0LmtleXMoZSksaT0wO2k8ci5sZW5ndGg7aSsrKXt2YXIgbz1yW2ldO2lmKCJfX29iX18iIT09byl7Zm9yKHZhciBhPWVbb10uZnJvbSxzPXQ7czspe2lmKHMuX3Byb3ZpZGVkJiZmKHMuX3Byb3ZpZGVkLGEpKXtuW29dPXMuX3Byb3ZpZGVkW2FdO2JyZWFrfXM9cy4kcGFyZW50fWlmKCFzJiYiZGVmYXVsdCJpbiBlW29dKXt2YXIgYz1lW29dLmRlZmF1bHQ7bltvXT0iZnVuY3Rpb24iPT10eXBlb2YgYz9jLmNhbGwodCk6Y319fXJldHVybiBufX1mdW5jdGlvbiBydChlLHQpe2lmKCFlfHwhZS5sZW5ndGgpcmV0dXJue307Zm9yKHZhciBuPXt9LHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspe3ZhciBvPWVbcl0sYT1vLmRhdGE7aWYoYSYmYS5hdHRycyYmYS5hdHRycy5zbG90JiZkZWxldGUgYS5hdHRycy5zbG90LG8uY29udGV4dCE9PXQmJm8uZm5Db250ZXh0IT09dHx8IWF8fG51bGw9PWEuc2xvdClvLmFzeW5jTWV0YSYmby5hc3luY01ldGEuZGF0YSYmInBhZ2UiPT09by5hc3luY01ldGEuZGF0YS5zbG90PyhuLnBhZ2V8fChuLnBhZ2U9W10pKS5wdXNoKG8pOihuLmRlZmF1bHR8fChuLmRlZmF1bHQ9W10pKS5wdXNoKG8pO2Vsc2V7dmFyIHM9YS5zbG90LGM9bltzXXx8KG5bc109W10pOyJ0ZW1wbGF0ZSI9PT1vLnRhZz9jLnB1c2guYXBwbHkoYyxvLmNoaWxkcmVufHxbXSk6Yy5wdXNoKG8pfX1mb3IodmFyIHUgaW4gbiluW3VdLmV2ZXJ5KGl0KSYmZGVsZXRlIG5bdV07cmV0dXJuIG59ZnVuY3Rpb24gaXQoZSl7cmV0dXJuIGUuaXNDb21tZW50JiYhZS5hc3luY0ZhY3Rvcnl8fCIgIj09PWUudGV4dH1mdW5jdGlvbiBvdChlLHQsbil7dmFyIHIsaT0wPE9iamVjdC5rZXlzKHQpLmxlbmd0aCxvPWU/ISFlLiRzdGFibGU6IWksYT1lJiZlLiRrZXk7aWYoZSl7aWYoZS5fbm9ybWFsaXplZClyZXR1cm4gZS5fbm9ybWFsaXplZDtpZihvJiZuJiZuIT09XyYmYT09PW4uJGtleSYmIWkmJiFuLiRoYXNOb3JtYWwpcmV0dXJuIG47Zm9yKHZhciBzIGluIHI9e30sZSllW3NdJiYiJCIhPT1zWzBdJiYocltzXT1hdCh0LHMsZVtzXSkpfWVsc2Ugcj17fTtmb3IodmFyIGMgaW4gdCljIGluIHJ8fChyW2NdPXN0KHQsYykpO3JldHVybiBlJiZPYmplY3QuaXNFeHRlbnNpYmxlKGUpJiYoZS5fbm9ybWFsaXplZD1yKSxGKHIsIiRzdGFibGUiLG8pLEYociwiJGtleSIsYSksRihyLCIkaGFzTm9ybWFsIixpKSxyfWZ1bmN0aW9uIGF0KGUsdCxuKXt2YXIgcj1mdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg/bi5hcHBseShudWxsLGFyZ3VtZW50cyk6bih7fSk7cmV0dXJuKGU9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYhQXJyYXkuaXNBcnJheShlKT9bZV06WmUoZSkpJiYoMD09PWUubGVuZ3RofHwxPT09ZS5sZW5ndGgmJmVbMF0uaXNDb21tZW50KT92b2lkIDA6ZX07cmV0dXJuIG4ucHJveHkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2dldDpyLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSkscn1mdW5jdGlvbiBzdChlLHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlW3RdfX1mdW5jdGlvbiBjdChlLHQpe3ZhciBuLHIsaSxvLGE7aWYoQXJyYXkuaXNBcnJheShlKXx8InN0cmluZyI9PXR5cGVvZiBlKWZvcihuPW5ldyBBcnJheShlLmxlbmd0aCkscj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyluW3JdPXQoZVtyXSxyKTtlbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgZSlmb3Iobj1uZXcgQXJyYXkoZSkscj0wO3I8ZTtyKyspbltyXT10KHIrMSxyKTtlbHNlIGlmKGIoZSkpaWYocmUmJmVbU3ltYm9sLml0ZXJhdG9yXSl7bj1bXTtmb3IodmFyIHM9ZVtTeW1ib2wuaXRlcmF0b3JdKCksYz1zLm5leHQoKTshYy5kb25lOyluLnB1c2godChjLnZhbHVlLG4ubGVuZ3RoKSksYz1zLm5leHQoKX1lbHNlIGZvcihvPU9iamVjdC5rZXlzKGUpLG49bmV3IEFycmF5KG8ubGVuZ3RoKSxyPTAsaT1vLmxlbmd0aDtyPGk7cisrKWE9b1tyXSxuW3JdPXQoZVthXSxhLHIpO3JldHVybiBJKG4pfHwobj1bXSksbi5faXNWTGlzdD0hMCxufWZ1bmN0aW9uIHV0KGUsdCxuLHIpe3ZhciBpLG89dGhpcy4kc2NvcGVkU2xvdHNbZV07bz8obj1ufHx7fSxyJiYobj1CKEIoe30sciksbikpLGk9byhuKXx8dCk6aT10aGlzLiRzbG90c1tlXXx8dDt2YXIgYT1uJiZuLnNsb3Q7cmV0dXJuIGE/dGhpcy4kY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiLHtzbG90OmF9LGkpOml9ZnVuY3Rpb24gbHQoZSl7cmV0dXJuICRlKHRoaXMuJG9wdGlvbnMsImZpbHRlcnMiLGUpfHxUfWZ1bmN0aW9uIGR0KGUsdCl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/LTE9PT1lLmluZGV4T2YodCk6ZSE9PXR9ZnVuY3Rpb24gZnQoZSx0LG4scixpKXt2YXIgbz1SLmtleUNvZGVzW3RdfHxuO3JldHVybiBpJiZyJiYhUi5rZXlDb2Rlc1t0XT9kdChpLHIpOm8/ZHQobyxlKTpyP1MocikhPT10OnZvaWQgMH1mdW5jdGlvbiBwdChpLG8sYSxzLGMpe2lmKGEpaWYoYihhKSl7dmFyIHU7QXJyYXkuaXNBcnJheShhKSYmKGE9eChhKSk7dmFyIGU9ZnVuY3Rpb24odCl7aWYoImNsYXNzIj09PXR8fCJzdHlsZSI9PT10fHxsKHQpKXU9aTtlbHNle3ZhciBlPWkuYXR0cnMmJmkuYXR0cnMudHlwZTt1PXN8fFIubXVzdFVzZVByb3AobyxlLHQpP2kuZG9tUHJvcHN8fChpLmRvbVByb3BzPXt9KTppLmF0dHJzfHwoaS5hdHRycz17fSl9dmFyIG49aCh0KSxyPVModCk7biBpbiB1fHxyIGluIHV8fCh1W3RdPWFbdF0sYyYmKChpLm9ufHwoaS5vbj17fSkpWyJ1cGRhdGU6Iit0XT1mdW5jdGlvbihlKXthW3RdPWV9KSl9O2Zvcih2YXIgdCBpbiBhKWUodCl9ZWxzZTtyZXR1cm4gaX1mdW5jdGlvbiBodChlLHQpe3ZhciBuPXRoaXMuX3N0YXRpY1RyZWVzfHwodGhpcy5fc3RhdGljVHJlZXM9W10pLHI9bltlXTtyZXR1cm4gciYmIXR8fGd0KHI9bltlXT10aGlzLiRvcHRpb25zLnN0YXRpY1JlbmRlckZuc1tlXS5jYWxsKHRoaXMuX3JlbmRlclByb3h5LG51bGwsdGhpcyksIl9fc3RhdGljX18iK2UsITEpLHJ9ZnVuY3Rpb24gdnQoZSx0LG4pe3JldHVybiBndChlLCJfX29uY2VfXyIrdCsobj8iXyIrbjoiIiksITApLGV9ZnVuY3Rpb24gZ3QoZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspZVtyXSYmInN0cmluZyIhPXR5cGVvZiBlW3JdJiZtdChlW3JdLHQrIl8iK3Isbik7ZWxzZSBtdChlLHQsbil9ZnVuY3Rpb24gbXQoZSx0LG4pe2UuaXNTdGF0aWM9ITAsZS5rZXk9dCxlLmlzT25jZT1ufWZ1bmN0aW9uIHl0KGUsdCl7aWYodClpZihkKHQpKXt2YXIgbj1lLm9uPWUub24/Qih7fSxlLm9uKTp7fTtmb3IodmFyIHIgaW4gdCl7dmFyIGk9bltyXSxvPXRbcl07bltyXT1pP1tdLmNvbmNhdChpLG8pOm99fWVsc2U7cmV0dXJuIGV9ZnVuY3Rpb24gX3QoZSx0LG4scil7dD10fHx7JHN0YWJsZTohbn07Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07QXJyYXkuaXNBcnJheShvKT9fdChvLHQsbik6byYmKG8ucHJveHkmJihvLmZuLnByb3h5PSEwKSx0W28ua2V5XT1vLmZuKX1yZXR1cm4gciYmKHQuJGtleT1yKSx0fWZ1bmN0aW9uIGJ0KGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKz0yKXt2YXIgcj10W25dOyJzdHJpbmciPT10eXBlb2YgciYmciYmKGVbdFtuXV09dFtuKzFdKX1yZXR1cm4gZX1mdW5jdGlvbiB3dChlLHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZT90K2U6ZX1mdW5jdGlvbiBrdChlKXtlLl9vPXZ0LGUuX249byxlLl9zPW4sZS5fbD1jdCxlLl90PXV0LGUuX3E9TyxlLl9pPVAsZS5fbT1odCxlLl9mPWx0LGUuX2s9ZnQsZS5fYj1wdCxlLl92PWZlLGUuX2U9ZGUsZS5fdT1fdCxlLl9nPXl0LGUuX2Q9YnQsZS5fcD13dH1mdW5jdGlvbiBTdChlLHQsbixvLHIpe3ZhciBhLGk9dGhpcyxzPXIub3B0aW9ucztmKG8sIl91aWQiKT8oYT1PYmplY3QuY3JlYXRlKG8pKS5fb3JpZ2luYWw9bzpvPShhPW8pLl9vcmlnaW5hbDt2YXIgYz1BKHMuX2NvbXBpbGVkKSx1PSFjO3RoaXMuZGF0YT1lLHRoaXMucHJvcHM9dCx0aGlzLmNoaWxkcmVuPW4sdGhpcy5wYXJlbnQ9byx0aGlzLmxpc3RlbmVycz1lLm9ufHxfLHRoaXMuaW5qZWN0aW9ucz1udChzLmluamVjdCxvKSx0aGlzLnNsb3RzPWZ1bmN0aW9uKCl7cmV0dXJuIGkuJHNsb3RzfHxvdChlLnNjb3BlZFNsb3RzLGkuJHNsb3RzPXJ0KG4sbykpLGkuJHNsb3RzfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic2NvcGVkU2xvdHMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBvdChlLnNjb3BlZFNsb3RzLHRoaXMuc2xvdHMoKSl9fSksYyYmKHRoaXMuJG9wdGlvbnM9cyx0aGlzLiRzbG90cz10aGlzLnNsb3RzKCksdGhpcy4kc2NvcGVkU2xvdHM9b3QoZS5zY29wZWRTbG90cyx0aGlzLiRzbG90cykpLHMuX3Njb3BlSWQ/dGhpcy5fYz1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT1VdChhLGUsdCxuLHIsdSk7cmV0dXJuIGkmJiFBcnJheS5pc0FycmF5KGkpJiYoaS5mblNjb3BlSWQ9cy5fc2NvcGVJZCxpLmZuQ29udGV4dD1vKSxpfTp0aGlzLl9jPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBVdChhLGUsdCxuLHIsdSl9fWZ1bmN0aW9uIHh0KGUsdCxuLHIsaSl7dmFyIG89cGUoZSk7cmV0dXJuIG8uZm5Db250ZXh0PW4sby5mbk9wdGlvbnM9cix0LnNsb3QmJigoby5kYXRhfHwoby5kYXRhPXt9KSkuc2xvdD10LnNsb3QpLG99ZnVuY3Rpb24gQ3QoZSx0KXtmb3IodmFyIG4gaW4gdCllW2gobildPXRbbl19a3QoU3QucHJvdG90eXBlKTt2YXIgVHQ9IkBpblJlY3ljbGVMaXN0IjtmdW5jdGlvbiBPdChlLHQsbixyKXtpZihhJiZhLnRhc2tDZW50ZXIpcmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGEudGFza0NlbnRlci5yZWdpc3Rlckhvb2s/YS50YXNrQ2VudGVyLnJlZ2lzdGVySG9vayhlLHQsbixyKTp2b2lkIDB9ZnVuY3Rpb24gRXQoZSxuLHQpe2lmKGIobikpaWYodCllLiRyZWZzPXt9O2Vsc2V7dmFyIHI9ZS4kcmVmc3x8e307T2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1uW2VdO3JbZV09MT09PXQubGVuZ3RoP3RbMF06dH0pLGUuJHJlZnM9cn19ZnVuY3Rpb24gSXQoZSxuLHIsdCl7aWYoYihyKSl7dmFyIGk9ZS4kcmVmc3x8e307dD9PYmplY3Qua2V5cyhyKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PXJbZV07aVtlXSYmKDE9PT10Lmxlbmd0aCYmQXJyYXkuaXNBcnJheShpW2VdKT9kZWxldGUgaVtlXVtuXTpkZWxldGUgaVtlXSl9KTooT2JqZWN0LmtleXMocikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1yW2VdOzE9PT10Lmxlbmd0aD8oQXJyYXkuaXNBcnJheShpW2VdKXx8KGlbZV09W10pLGlbZV1bbl09dFswXSk6aVtlXT10fSksZS4kcmVmcz1pKX19dmFyIEF0PTA7ZnVuY3Rpb24gJHQoZSl7dmFyIHQ9ZS4kb3B0aW9ucy5kYXRhLG49ZS4kb3B0aW9ucy5jb21wdXRlZHx8e30scj1lLl9kYXRhP09iamVjdC5hc3NpZ24oe30sZS5fZGF0YSk6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/d24odCxlKTp0fHx7fSxpPXt9O2Zvcih2YXIgbyBpbiBuKWlbb109ZVtvXTtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSxyLGkpfWZ1bmN0aW9uIFB0KGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgcj10aGlzLHQ9ZS5jb21wb25lbnRJZDtGKHIsIl92bVRlbXBsYXRlIixlLnZtVGVtcGxhdGUpLHIuX3VpZD10fHwidmlydHVhbC1jb21wb25lbnQtIitBdCsrLHIuX2lzVnVlPSEwLGUmJmUuX2lzQ29tcG9uZW50P0xuKHIsZSk6ci4kb3B0aW9ucz1BZShCbihyLmNvbnN0cnVjdG9yKSxlfHx7fSxyKSxubigoci5fcmVuZGVyUHJveHk9cikuX3NlbGY9ciksSnQocikscXQociksYW4ociwiYmVmb3JlQ3JlYXRlIiksdHQociksYm4ociksZXQociksYW4ociwiY3JlYXRlZCIpLE90KHQsImxpZmVjeWNsZSIsImF0dGFjaCIsZnVuY3Rpb24oZSl7RXQocixlJiZlLnJlZnMpLGFuKHIsImJlZm9yZU1vdW50IiksbmV3IG1uKHIsZnVuY3Rpb24oKXtyZXR1cm4gJHQocil9LGZ1bmN0aW9uKCl7cmV0dXJuIHIuX3VwZGF0ZShyLl92bm9kZSwhMSl9KSxyLl9pc01vdW50ZWQ9ITAsYW4ociwibW91bnRlZCIpfSksT3QodCwibGlmZWN5Y2xlIiwidXBkYXRlIixmdW5jdGlvbihlKXtFdChyLGUmJmUucmVmcyksci5fdXBkYXRlKHIuX3Zub2RlLCExKX0pLE90KHQsImxpZmVjeWNsZSIsInN5bmNTdGF0ZSIsZnVuY3Rpb24oZSx0KXtpZihkKHQpKWZvcih2YXIgbiBpbiB0KXJbbl09dFtuXTtyZXR1cm4gJHQocil9KSxPdCh0LCJsaWZlY3ljbGUiLCJkZXRhY2giLGZ1bmN0aW9uKGUpe0V0KHIsZSYmZS5yZWZzLCEwKSxyLiRkZXN0cm95KCksci5fdm1UZW1wbGF0ZSYmKHIuX3ZtVGVtcGxhdGUucmVtb3ZlVmlydHVhbENvbXBvbmVudChyLl91aWQpLGRlbGV0ZSByLl92bVRlbXBsYXRlKX0pfWZ1bmN0aW9uIE10KGUpe3ZhciB0PXRoaXMsbj10LiRvcHRpb25zLmNvbXBvbmVudElkOyh0Ll9pc01vdW50ZWQmJmFuKHQsImJlZm9yZVVwZGF0ZSIpLHQuX3Zub2RlPWUsdC5faXNNb3VudGVkJiZuKSYmZnVuY3Rpb24oZSx0LG4pe2lmKGEmJmEudGFza0NlbnRlcikiZnVuY3Rpb24iPT10eXBlb2YgYS50YXNrQ2VudGVyLnVwZGF0ZURhdGEmJmEudGFza0NlbnRlci51cGRhdGVEYXRhKGUsdCxuKX0obiwkdCh0KSxmdW5jdGlvbigpe2FuKHQsInVwZGF0ZWQiKX0pfWZ1bmN0aW9uIGp0KGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD10aGlzO3QuX3VpZD0idmlydHVhbC1jb21wb25lbnQtdGVtcGxhdGUtIitBdCsrLHQuX2lzVnVlPSEwLGUmJmUuX2lzQ29tcG9uZW50P0xuKHQsZSk6dC4kb3B0aW9ucz1BZShCbih0LmNvbnN0cnVjdG9yKSxlfHx7fSx0KSxKdCh0Ll9zZWxmPXQpLHF0KHQpLGJuKHQpLHRoaXMucmVnaXN0ZXJWaXJ0dWFsQ29tcG9uZW50KCl9ZnVuY3Rpb24gTHQoZSl7dmFyIHQsbixpLG87ZGVsZXRlIGUuZGF0YS5hdHRyc1tUdF0sbj0odD1lKS5jb21wb25lbnRPcHRpb25zLkN0b3IsaT1uLmV4dGVuZCh7fSksbz1pLnByb3RvdHlwZS4kZW1pdCxpLnByb3RvdHlwZS5faW5pdD1QdCxpLnByb3RvdHlwZS5fdXBkYXRlPU10LGkucHJvdG90eXBlLiRlbWl0PWZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cyx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09ZVtuXTt2YXIgcj10aGlzLl91aWQsaT10aGlzLl92bVRlbXBsYXRlO3JldHVybiByJiZpJiYodC5wdXNoKHIpLG8uYXBwbHkoaSx0KSksby5hcHBseSh0aGlzLHQpfSx0LmNvbXBvbmVudE9wdGlvbnMuQ3Rvcj1uLmV4dGVuZCh7bWV0aG9kczp7cmVnaXN0ZXJWaXJ0dWFsQ29tcG9uZW50OmZ1bmN0aW9uKCl7dmFyIHI9dGhpcztGKHIsIl92aXJ0dWFsQ29tcG9uZW50cyIse30pLE90KFN0cmluZyhyLl91aWQpLCJsaWZlY3ljbGUiLCJjcmVhdGUiLGZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IGkoe3ZtVGVtcGxhdGU6cixjb21wb25lbnRJZDplLHByb3BzRGF0YTp0fSk7cmV0dXJuIG4uX3VpZD1lLHIuX3ZpcnR1YWxDb21wb25lbnRzJiYoci5fdmlydHVhbENvbXBvbmVudHNbZV09biksJHQobil9KX0scmVtb3ZlVmlydHVhbENvbXBvbmVudDpmdW5jdGlvbihlKXtkZWxldGUgdGhpcy5fdmlydHVhbENvbXBvbmVudHNbZV19fSxkZXN0cm95ZWQ6ZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5fdmlydHVhbENvbXBvbmVudHN9fSksdC5jb21wb25lbnRPcHRpb25zLkN0b3IucHJvdG90eXBlLl9pbml0PWp0LHQuY29tcG9uZW50T3B0aW9ucy5DdG9yLnByb3RvdHlwZS5fdXBkYXRlPU47dmFyIHI9UnQoZSksYT1yLiRvcHRpb25zWyJAcmVuZGVyIl07aWYoYSl0cnl7cmV0dXJuIGEuY2FsbChyKX1jYXRjaChlKXtCZShlLHIsIkByZW5kZXIiKX19dmFyIEJ0PXtpbml0OmZ1bmN0aW9uKGUsdCxuLHIpe2lmKGUuY29tcG9uZW50SW5zdGFuY2UmJiFlLmNvbXBvbmVudEluc3RhbmNlLl9pc0Rlc3Ryb3llZCYmZS5kYXRhLmtlZXBBbGl2ZSl7dmFyIGk9ZTtCdC5wcmVwYXRjaChpLGkpfWVsc2V7KGUuY29tcG9uZW50SW5zdGFuY2U9UnQoZSx0bixuLHIpKS4kbW91bnQodD9lLmVsbTp2b2lkIDAsdCl9fSxwcmVwYXRjaDpmdW5jdGlvbihlLHQpe3ZhciBuPXQuY29tcG9uZW50T3B0aW9uczshZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbz1yLmRhdGEuc2NvcGVkU2xvdHMsYT1lLiRzY29wZWRTbG90cyxzPSEhKG8mJiFvLiRzdGFibGV8fGEhPT1fJiYhYS4kc3RhYmxlfHxvJiZlLiRzY29wZWRTbG90cy4ka2V5IT09by4ka2V5KSxjPSEhKGl8fGUuJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVufHxzKTtlLiRvcHRpb25zLl9wYXJlbnRWbm9kZT1yLGUuJHZub2RlPXIsZS5fdm5vZGUmJihlLl92bm9kZS5wYXJlbnQ9cik7aWYoZS4kb3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW49aSxlLiRhdHRycz1yLmRhdGEuYXR0cnN8fF8sZS4kbGlzdGVuZXJzPW58fF8sdCYmZS4kb3B0aW9ucy5wcm9wcyl7eWUoITEpO2Zvcih2YXIgdT1lLl9wcm9wcyxsPWUuJG9wdGlvbnMuX3Byb3BLZXlzfHxbXSxkPTA7ZDxsLmxlbmd0aDtkKyspe3ZhciBmPWxbZF0scD1lLiRvcHRpb25zLnByb3BzO3VbZl09UGUoZixwLHQsZSl9eWUoITApLGUuJG9wdGlvbnMucHJvcHNEYXRhPXR9bj1ufHxfO3ZhciBoPWUuJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycztlLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM9bixlbihlLG4saCksYyYmKGUuJHNsb3RzPXJ0KGksci5jb250ZXh0KSxlLiRmb3JjZVVwZGF0ZSgpKX0odC5jb21wb25lbnRJbnN0YW5jZT1lLmNvbXBvbmVudEluc3RhbmNlLG4ucHJvcHNEYXRhLG4ubGlzdGVuZXJzLHQsbi5jaGlsZHJlbil9LGluc2VydDpmdW5jdGlvbihlKXt2YXIgdCxuPWUuY29udGV4dCxyPWUuY29tcG9uZW50SW5zdGFuY2U7ci5faXNNb3VudGVkfHwoci5faXNNb3VudGVkPSEwLGFuKHIsIm1vdW50ZWQiKSksZS5kYXRhLmtlZXBBbGl2ZSYmKG4uX2lzTW91bnRlZD8oKHQ9cikuX2luYWN0aXZlPSExLGNuLnB1c2godCkpOm9uKHIsITApKX0sZGVzdHJveTpmdW5jdGlvbihlKXt2YXIgdD1lLmNvbXBvbmVudEluc3RhbmNlO3QuX2lzRGVzdHJveWVkfHwoZS5kYXRhLmtlZXBBbGl2ZT9mdW5jdGlvbiBlKHQsbil7aWYobiYmKHQuX2RpcmVjdEluYWN0aXZlPSEwLHJuKHQpKSlyZXR1cm47aWYoIXQuX2luYWN0aXZlKXt0Ll9pbmFjdGl2ZT0hMDtmb3IodmFyIHI9MDtyPHQuJGNoaWxkcmVuLmxlbmd0aDtyKyspZSh0LiRjaGlsZHJlbltyXSk7YW4odCwiZGVhY3RpdmF0ZWQiKX19KHQsITApOnQuJGRlc3Ryb3koKSl9fSxOdD1PYmplY3Qua2V5cyhCdCk7ZnVuY3Rpb24gRHQoZSx0LG4scixpKXtpZighRShlKSl7dmFyIG89bi4kb3B0aW9ucy5fYmFzZTtpZihiKGUpJiYoZT1vLmV4dGVuZChlKSksImZ1bmN0aW9uIj09dHlwZW9mIGUpe3ZhciBhLHMsYyx1LGwsZCxmO2lmKEUoZS5jaWQpJiZ2b2lkIDA9PT0oZT1mdW5jdGlvbih0LG4pe2lmKEEodC5lcnJvcikmJkkodC5lcnJvckNvbXApKXJldHVybiB0LmVycm9yQ29tcDtpZihJKHQucmVzb2x2ZWQpKXJldHVybiB0LnJlc29sdmVkO3ZhciBlPUh0O2UmJkkodC5vd25lcnMpJiYtMT09PXQub3duZXJzLmluZGV4T2YoZSkmJnQub3duZXJzLnB1c2goZSk7aWYoQSh0LmxvYWRpbmcpJiZJKHQubG9hZGluZ0NvbXApKXJldHVybiB0LmxvYWRpbmdDb21wO2lmKGUmJiFJKHQub3duZXJzKSl7dmFyIHI9dC5vd25lcnM9W2VdLGk9ITAsbz1udWxsLGE9bnVsbDtlLiRvbigiaG9vazpkZXN0cm95ZWQiLGZ1bmN0aW9uKCl7cmV0dXJuIGsocixlKX0pO3ZhciBzPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49ci5sZW5ndGg7dDxuO3QrKylyW3RdLiRmb3JjZVVwZGF0ZSgpO2UmJihyLmxlbmd0aD0wLG51bGwhPT1vJiYoY2xlYXJUaW1lb3V0KG8pLG89bnVsbCksbnVsbCE9PWEmJihjbGVhclRpbWVvdXQoYSksYT1udWxsKSl9LGM9RChmdW5jdGlvbihlKXt0LnJlc29sdmVkPUd0KGUsbiksaT9yLmxlbmd0aD0wOnMoITApfSksdT1EKGZ1bmN0aW9uKGUpe0kodC5lcnJvckNvbXApJiYodC5lcnJvcj0hMCxzKCEwKSl9KSxsPXQoYyx1KTtyZXR1cm4gYihsKSYmKHcobCk/RSh0LnJlc29sdmVkKSYmbC50aGVuKGMsdSk6dyhsLmNvbXBvbmVudCkmJihsLmNvbXBvbmVudC50aGVuKGMsdSksSShsLmVycm9yKSYmKHQuZXJyb3JDb21wPUd0KGwuZXJyb3IsbikpLEkobC5sb2FkaW5nKSYmKHQubG9hZGluZ0NvbXA9R3QobC5sb2FkaW5nLG4pLDA9PT1sLmRlbGF5P3QubG9hZGluZz0hMDpvPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtvPW51bGwsRSh0LnJlc29sdmVkKSYmRSh0LmVycm9yKSYmKHQubG9hZGluZz0hMCxzKCExKSl9LGwuZGVsYXl8fDIwMCkpLEkobC50aW1lb3V0KSYmKGE9c2V0VGltZW91dChmdW5jdGlvbigpe2E9bnVsbCxFKHQucmVzb2x2ZWQpJiZ1KG51bGwpfSxsLnRpbWVvdXQpKSkpLGk9ITEsdC5sb2FkaW5nP3QubG9hZGluZ0NvbXA6dC5yZXNvbHZlZH19KGE9ZSxvKSkpcmV0dXJuIHM9YSxjPXQsdT1uLGw9cixkPWksKGY9ZGUoKSkuYXN5bmNGYWN0b3J5PXMsZi5hc3luY01ldGE9e2RhdGE6Yyxjb250ZXh0OnUsY2hpbGRyZW46bCx0YWc6ZH0sZjt0PXR8fHt9LEJuKGUpLEkodC5tb2RlbCkmJmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5tb2RlbCYmZS5tb2RlbC5wcm9wfHwidmFsdWUiLHI9ZS5tb2RlbCYmZS5tb2RlbC5ldmVudHx8ImlucHV0IjsodC5hdHRyc3x8KHQuYXR0cnM9e30pKVtuXT10Lm1vZGVsLnZhbHVlO3ZhciBpPXQub258fCh0Lm9uPXt9KSxvPWlbcl0sYT10Lm1vZGVsLmNhbGxiYWNrO0kobyk/KEFycmF5LmlzQXJyYXkobyk/LTE9PT1vLmluZGV4T2YoYSk6byE9PWEpJiYoaVtyXT1bYV0uY29uY2F0KG8pKTppW3JdPWF9KGUub3B0aW9ucyx0KTt2YXIgcD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dC5vcHRpb25zLnByb3BzO2lmKCFFKHIpKXt2YXIgaT17fSxvPWUuYXR0cnMsYT1lLnByb3BzO2lmKEkobyl8fEkoYSkpZm9yKHZhciBzIGluIHIpe3ZhciBjPVMocyk7S2UoaSxhLHMsYywhMCl8fEtlKGksbyxzLGMsITEpfXJldHVybiBpfX0odCxlKTtpZihBKGUub3B0aW9ucy5mdW5jdGlvbmFsKSlyZXR1cm4gZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbz1lLm9wdGlvbnMsYT17fSxzPW8ucHJvcHM7aWYoSShzKSlmb3IodmFyIGMgaW4gcylhW2NdPVBlKGMscyx0fHxfKTtlbHNlIEkobi5hdHRycykmJkN0KGEsbi5hdHRycyksSShuLnByb3BzKSYmQ3QoYSxuLnByb3BzKTt2YXIgdT1uZXcgU3QobixhLGkscixlKSxsPW8ucmVuZGVyLmNhbGwobnVsbCx1Ll9jLHUpO2lmKGwgaW5zdGFuY2VvZiB1ZSlyZXR1cm4geHQobCxuLHUucGFyZW50LG8pO2lmKEFycmF5LmlzQXJyYXkobCkpe2Zvcih2YXIgZD1aZShsKXx8W10sZj1uZXcgQXJyYXkoZC5sZW5ndGgpLHA9MDtwPGQubGVuZ3RoO3ArKylmW3BdPXh0KGRbcF0sbix1LnBhcmVudCxvKTtyZXR1cm4gZn19KGUscCx0LG4scik7dmFyIGg9dC5vbjtpZih0Lm9uPXQubmF0aXZlT24sQShlLm9wdGlvbnMuYWJzdHJhY3QpKXt2YXIgdj10LnNsb3Q7dD17fSx2JiYodC5zbG90PXYpfSFmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5ob29rfHwoZS5ob29rPXt9KSxuPTA7bjxOdC5sZW5ndGg7bisrKXt2YXIgcj1OdFtuXSxpPXRbcl0sbz1CdFtyXTtpPT09b3x8aSYmaS5fbWVyZ2VkfHwodFtyXT1pP0Z0KG8saSk6byl9fSh0KTt2YXIgZyxtPWUub3B0aW9ucy5uYW1lfHxpLHk9bmV3IHVlKCJ2dWUtY29tcG9uZW50LSIrZS5jaWQrKG0/Ii0iK206IiIpLHQsdm9pZCAwLHZvaWQgMCx2b2lkIDAsbix7Q3RvcjplLHByb3BzRGF0YTpwLGxpc3RlbmVyczpoLHRhZzppLGNoaWxkcmVuOnJ9LGEpO3JldHVybihnPXkpLmRhdGEuYXR0cnMmJlR0IGluIGcuZGF0YS5hdHRycz9MdCh5KTp5fX19ZnVuY3Rpb24gUnQoZSx0LG4scil7dmFyIGk9e19pc0NvbXBvbmVudDohMCxfcGFyZW50Vm5vZGU6ZSxwYXJlbnQ6dCxfcGFyZW50RWxtOm58fG51bGwsX3JlZkVsbTpyfHxudWxsfSxvPWUuZGF0YS5pbmxpbmVUZW1wbGF0ZTtyZXR1cm4gSShvKSYmKGkucmVuZGVyPW8ucmVuZGVyLGkuc3RhdGljUmVuZGVyRm5zPW8uc3RhdGljUmVuZGVyRm5zKSxuZXcgZS5jb21wb25lbnRPcHRpb25zLkN0b3IoaSl9ZnVuY3Rpb24gRnQobixyKXt2YXIgZT1mdW5jdGlvbihlLHQpe24oZSx0KSxyKGUsdCl9O3JldHVybiBlLl9tZXJnZWQ9ITAsZX12YXIgenQ9MSxWdD0yO2Z1bmN0aW9uIFV0KGUsdCxuLHIsaSxvKXtyZXR1cm4oQXJyYXkuaXNBcnJheShuKXx8JChuKSkmJihpPXIscj1uLG49dm9pZCAwKSxBKG8pJiYoaT1WdCksZnVuY3Rpb24oZSx0LG4scixpKXtpZihJKG4pJiZJKG4uX19vYl9fKSlyZXR1cm4gZGUoKTtJKG4pJiZJKG4uaXMpJiYodD1uLmlzKTtpZighdClyZXR1cm4gZGUoKTtBcnJheS5pc0FycmF5KHIpJiYiZnVuY3Rpb24iPT10eXBlb2YgclswXSYmKChuPW58fHt9KS5zY29wZWRTbG90cz17ZGVmYXVsdDpyWzBdfSxyLmxlbmd0aD0wKTtpPT09VnQ/cj1aZShyKTppPT09enQmJihyPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKWlmKEFycmF5LmlzQXJyYXkoZVt0XSkpcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sZSk7cmV0dXJuIGV9KHIpKTt2YXIgbyxhO2lmKCJzdHJpbmciPT10eXBlb2YgdCl7dmFyIHM7YT1lLiR2bm9kZSYmZS4kdm5vZGUubnN8fFIuZ2V0VGFnTmFtZXNwYWNlKHQpLG89Ui5pc1Jlc2VydmVkVGFnKHQpP25ldyB1ZShSLnBhcnNlUGxhdGZvcm1UYWdOYW1lKHQpLG4scix2b2lkIDAsdm9pZCAwLGUpOm4mJm4ucHJlfHwhSShzPSRlKGUuJG9wdGlvbnMsImNvbXBvbmVudHMiLHQpKT9uZXcgdWUodCxuLHIsdm9pZCAwLHZvaWQgMCxlKTpEdChzLG4sZSxyLHQpfWVsc2Ugbz1EdCh0LG4sZSxyKTtyZXR1cm4gQXJyYXkuaXNBcnJheShvKT9vOkkobyk/KEkoYSkmJmZ1bmN0aW9uIGUodCxuLHIpe3QubnM9bjsiZm9yZWlnbk9iamVjdCI9PT10LnRhZyYmKHI9IShuPXZvaWQgMCkpO2lmKEkodC5jaGlsZHJlbikpZm9yKHZhciBpPTAsbz10LmNoaWxkcmVuLmxlbmd0aDtpPG87aSsrKXt2YXIgYT10LmNoaWxkcmVuW2ldO0koYS50YWcpJiYoRShhLm5zKXx8QShyKSYmInN2ZyIhPT1hLnRhZykmJmUoYSxuLHIpfX0obyxhKSxJKG4pJiZmdW5jdGlvbihlKXtiKGUuc3R5bGUpJiZIZShlLnN0eWxlKTtiKGUuY2xhc3MpJiZIZShlLmNsYXNzKX0obiksbyk6ZGUoKX0oZSx0LG4scixpKX1mdW5jdGlvbiBxdChpKXtpLl92bm9kZT1udWxsLGkuX3N0YXRpY1RyZWVzPW51bGw7dmFyIGU9aS4kb3B0aW9ucyx0PWkuJHZub2RlPWUuX3BhcmVudFZub2RlLG49dCYmdC5jb250ZXh0O2kuJHNsb3RzPXJ0KGUuX3JlbmRlckNoaWxkcmVuLG4pLGkuJHNjb3BlZFNsb3RzPV8saS5fYz1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gVXQoaSxlLHQsbixyLCExKX0saS4kY3JlYXRlRWxlbWVudD1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gVXQoaSxlLHQsbixyLCEwKX07dmFyIHI9dCYmdC5kYXRhO3dlKGksIiRhdHRycyIsciYmci5hdHRyc3x8XyxudWxsLCEwKSx3ZShpLCIkbGlzdGVuZXJzIixlLl9wYXJlbnRMaXN0ZW5lcnN8fF8sbnVsbCwhMCl9dmFyIFd0LEh0PW51bGw7ZnVuY3Rpb24gR3QoZSx0KXtyZXR1cm4oZS5fX2VzTW9kdWxlfHxyZSYmIk1vZHVsZSI9PT1lW1N5bWJvbC50b1N0cmluZ1RhZ10pJiYoZT1lLmRlZmF1bHQpLGIoZSk/dC5leHRlbmQoZSk6ZX1mdW5jdGlvbiBYdChlKXtyZXR1cm4gZS5pc0NvbW1lbnQmJmUuYXN5bmNGYWN0b3J5fWZ1bmN0aW9uIFl0KGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciBuPWVbdF07aWYoSShuKSYmKEkobi5jb21wb25lbnRPcHRpb25zKXx8WHQobikpKXJldHVybiBufX1mdW5jdGlvbiBKdChlKXtlLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSxlLl9oYXNIb29rRXZlbnQ9ITE7dmFyIHQ9ZS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO3QmJmVuKGUsdCl9ZnVuY3Rpb24gS3QoZSx0KXtXdC4kb24oZSx0KX1mdW5jdGlvbiBadChlLHQpe1d0LiRvZmYoZSx0KX1mdW5jdGlvbiBRdCh0LG4pe3ZhciByPVd0O3JldHVybiBmdW5jdGlvbiBlKCl7bnVsbCE9PW4uYXBwbHkobnVsbCxhcmd1bWVudHMpJiZyLiRvZmYodCxlKX19ZnVuY3Rpb24gZW4oZSx0LG4pe1llKHQsbnx8e30sS3QsWnQsUXQsV3Q9ZSksV3Q9dm9pZCAwfXZhciB0bj1udWxsO2Z1bmN0aW9uIG5uKGUpe3ZhciB0PWUuJG9wdGlvbnMsbj10LnBhcmVudDtpZihuJiYhdC5hYnN0cmFjdCl7Zm9yKDtuLiRvcHRpb25zLmFic3RyYWN0JiZuLiRwYXJlbnQ7KW49bi4kcGFyZW50O24uJGNoaWxkcmVuLnB1c2goZSl9ZS4kcGFyZW50PW4sZS4kcm9vdD1uP24uJHJvb3Q6ZSxlLiRjaGlsZHJlbj1bXSxlLiRyZWZzPXt9LGUuX3dhdGNoZXI9bnVsbCxlLl9pbmFjdGl2ZT1udWxsLGUuX2RpcmVjdEluYWN0aXZlPSExLGUuX2lzTW91bnRlZD0hMSxlLl9pc0Rlc3Ryb3llZD0hMSxlLl9pc0JlaW5nRGVzdHJveWVkPSExfWZ1bmN0aW9uIHJuKGUpe2Zvcig7ZSYmKGU9ZS4kcGFyZW50KTspaWYoZS5faW5hY3RpdmUpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gb24oZSx0KXtpZih0KXtpZihlLl9kaXJlY3RJbmFjdGl2ZT0hMSxybihlKSlyZXR1cm59ZWxzZSBpZihlLl9kaXJlY3RJbmFjdGl2ZSlyZXR1cm47aWYoZS5faW5hY3RpdmV8fG51bGw9PT1lLl9pbmFjdGl2ZSl7ZS5faW5hY3RpdmU9ITE7Zm9yKHZhciBuPTA7bjxlLiRjaGlsZHJlbi5sZW5ndGg7bisrKW9uKGUuJGNoaWxkcmVuW25dKTthbihlLCJhY3RpdmF0ZWQiKX19ZnVuY3Rpb24gYW4oZSx0KXtzZSgpO3ZhciBuPWUuJG9wdGlvbnNbdF0scj10KyIgaG9vayI7aWYobilmb3IodmFyIGk9MCxvPW4ubGVuZ3RoO2k8bztpKyspTmUobltpXSxlLG51bGwsZSxyKTtlLl9oYXNIb29rRXZlbnQmJmUuJGVtaXQoImhvb2s6Iit0KSxjZSgpfXZhciBzbj1bXSxjbj1bXSx1bj17fSxsbj0hMSxkbj0hMSxmbj0wO3ZhciBwbj1EYXRlLm5vdztpZihxJiYhWCl7dmFyIGhuPXdpbmRvdy5wZXJmb3JtYW5jZTtobiYmImZ1bmN0aW9uIj09dHlwZW9mIGhuLm5vdyYmcG4oKT5hLmNyZWF0ZUV2ZW50KCJFdmVudCIpLnRpbWVTdGFtcCYmKHBuPWZ1bmN0aW9uKCl7cmV0dXJuIGhuLm5vdygpfSl9ZnVuY3Rpb24gdm4oKXt2YXIgZSx0O2ZvcihwbigpLGRuPSEwLHNuLnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5pZC10LmlkfSksZm49MDtmbjxzbi5sZW5ndGg7Zm4rKykoZT1zbltmbl0pLmJlZm9yZSYmZS5iZWZvcmUoKSx0PWUuaWQsdW5bdF09bnVsbCxlLnJ1bigpO3ZhciBuPWNuLnNsaWNlKCkscj1zbi5zbGljZSgpO2ZuPXNuLmxlbmd0aD1jbi5sZW5ndGg9MCxsbj1kbj0hKHVuPXt9KSxmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdLl9pbmFjdGl2ZT0hMCxvbihlW3RdLCEwKX0obiksZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGg7Zm9yKDt0LS07KXt2YXIgbj1lW3RdLHI9bi52bTtyLl93YXRjaGVyPT09biYmci5faXNNb3VudGVkJiYhci5faXNEZXN0cm95ZWQmJmFuKHIsInVwZGF0ZWQiKX19KHIpLGVlJiZSLmRldnRvb2xzJiZlZS5lbWl0KCJmbHVzaCIpfXZhciBnbj0wLG1uPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dGhpcy52bT1lLGkmJihlLl93YXRjaGVyPXRoaXMpLGUuX3dhdGNoZXJzLnB1c2godGhpcykscj8odGhpcy5kZWVwPSEhci5kZWVwLHRoaXMudXNlcj0hIXIudXNlcix0aGlzLmxhenk9ISFyLmxhenksdGhpcy5zeW5jPSEhci5zeW5jLHRoaXMuYmVmb3JlPXIuYmVmb3JlKTp0aGlzLmRlZXA9dGhpcy51c2VyPXRoaXMubGF6eT10aGlzLnN5bmM9ITEsdGhpcy5jYj1uLHRoaXMuaWQ9Kytnbix0aGlzLmFjdGl2ZT0hMCx0aGlzLmRpcnR5PXRoaXMubGF6eSx0aGlzLmRlcHM9W10sdGhpcy5uZXdEZXBzPVtdLHRoaXMuZGVwSWRzPW5ldyBuZSx0aGlzLm5ld0RlcElkcz1uZXcgbmUsdGhpcy5leHByZXNzaW9uPSIiLCJmdW5jdGlvbiI9PXR5cGVvZiB0P3RoaXMuZ2V0dGVyPXQ6KHRoaXMuZ2V0dGVyPWZ1bmN0aW9uKGUpe2lmKCF6LnRlc3QoZSkpe3ZhciBuPWUuc3BsaXQoIi4iKTtyZXR1cm4gZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxuLmxlbmd0aDt0Kyspe2lmKCFlKXJldHVybjtlPWVbblt0XV19cmV0dXJuIGV9fX0odCksdGhpcy5nZXR0ZXJ8fCh0aGlzLmdldHRlcj1OKSksdGhpcy52YWx1ZT10aGlzLmxhenk/dm9pZCAwOnRoaXMuZ2V0KCl9O21uLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oKXt2YXIgZTtzZSh0aGlzKTt2YXIgdD10aGlzLnZtO3RyeXtlPXRoaXMuZ2V0dGVyLmNhbGwodCx0KX1jYXRjaChlKXtpZighdGhpcy51c2VyKXRocm93IGU7QmUoZSx0LCdnZXR0ZXIgZm9yIHdhdGNoZXIgIicrdGhpcy5leHByZXNzaW9uKyciJyl9ZmluYWxseXt0aGlzLmRlZXAmJkhlKGUpLGNlKCksdGhpcy5jbGVhbnVwRGVwcygpfXJldHVybiBlfSxtbi5wcm90b3R5cGUuYWRkRGVwPWZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQ7dGhpcy5uZXdEZXBJZHMuaGFzKHQpfHwodGhpcy5uZXdEZXBJZHMuYWRkKHQpLHRoaXMubmV3RGVwcy5wdXNoKGUpLHRoaXMuZGVwSWRzLmhhcyh0KXx8ZS5hZGRTdWIodGhpcykpfSxtbi5wcm90b3R5cGUuY2xlYW51cERlcHM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5kZXBzLmxlbmd0aDtlLS07KXt2YXIgdD10aGlzLmRlcHNbZV07dGhpcy5uZXdEZXBJZHMuaGFzKHQuaWQpfHx0LnJlbW92ZVN1Yih0aGlzKX12YXIgbj10aGlzLmRlcElkczt0aGlzLmRlcElkcz10aGlzLm5ld0RlcElkcyx0aGlzLm5ld0RlcElkcz1uLHRoaXMubmV3RGVwSWRzLmNsZWFyKCksbj10aGlzLmRlcHMsdGhpcy5kZXBzPXRoaXMubmV3RGVwcyx0aGlzLm5ld0RlcHM9bix0aGlzLm5ld0RlcHMubGVuZ3RoPTB9LG1uLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmxhenk/dGhpcy5kaXJ0eT0hMDp0aGlzLnN5bmM/dGhpcy5ydW4oKTpmdW5jdGlvbihlKXt2YXIgdD1lLmlkO2lmKG51bGw9PXVuW3RdKXtpZih1blt0XT0hMCxkbil7Zm9yKHZhciBuPXNuLmxlbmd0aC0xO2ZuPG4mJnNuW25dLmlkPmUuaWQ7KW4tLTtzbi5zcGxpY2UobisxLDAsZSl9ZWxzZSBzbi5wdXNoKGUpO2xufHwobG49ITAscWUodm4pKX19KHRoaXMpfSxtbi5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7aWYodGhpcy5hY3RpdmUpe3ZhciBlPXRoaXMuZ2V0KCk7aWYoZSE9PXRoaXMudmFsdWV8fGIoZSl8fHRoaXMuZGVlcCl7dmFyIHQ9dGhpcy52YWx1ZTtpZih0aGlzLnZhbHVlPWUsdGhpcy51c2VyKXRyeXt0aGlzLmNiLmNhbGwodGhpcy52bSxlLHQpfWNhdGNoKGUpe0JlKGUsdGhpcy52bSwnY2FsbGJhY2sgZm9yIHdhdGNoZXIgIicrdGhpcy5leHByZXNzaW9uKyciJyl9ZWxzZSB0aGlzLmNiLmNhbGwodGhpcy52bSxlLHQpfX19LG1uLnByb3RvdHlwZS5ldmFsdWF0ZT1mdW5jdGlvbigpe3RoaXMudmFsdWU9dGhpcy5nZXQoKSx0aGlzLmRpcnR5PSExfSxtbi5wcm90b3R5cGUuZGVwZW5kPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuZGVwcy5sZW5ndGg7ZS0tOyl0aGlzLmRlcHNbZV0uZGVwZW5kKCl9LG1uLnByb3RvdHlwZS50ZWFyZG93bj1mdW5jdGlvbigpe2lmKHRoaXMuYWN0aXZlKXt0aGlzLnZtLl9pc0JlaW5nRGVzdHJveWVkfHxrKHRoaXMudm0uX3dhdGNoZXJzLHRoaXMpO2Zvcih2YXIgZT10aGlzLmRlcHMubGVuZ3RoO2UtLTspdGhpcy5kZXBzW2VdLnJlbW92ZVN1Yih0aGlzKTt0aGlzLmFjdGl2ZT0hMX19O3ZhciB5bj17ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0Ok4sc2V0Ok59O2Z1bmN0aW9uIF9uKGUsdCxuKXt5bi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1t0XVtuXX0seW4uc2V0PWZ1bmN0aW9uKGUpe3RoaXNbdF1bbl09ZX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix5bil9ZnVuY3Rpb24gYm4oZSl7ZS5fd2F0Y2hlcnM9W107dmFyIHQ9ZS4kb3B0aW9uczt0LnByb3BzJiZmdW5jdGlvbihuLHIpe3ZhciBpPW4uJG9wdGlvbnMucHJvcHNEYXRhfHx7fSxvPW4uX3Byb3BzPXt9LGE9bi4kb3B0aW9ucy5fcHJvcEtleXM9W107bi4kcGFyZW50JiZ5ZSghMSk7dmFyIGU9ZnVuY3Rpb24oZSl7YS5wdXNoKGUpO3ZhciB0PVBlKGUscixpLG4pO3dlKG8sZSx0KSxlIGluIG58fF9uKG4sIl9wcm9wcyIsZSl9O2Zvcih2YXIgdCBpbiByKWUodCk7eWUoITApfShlLHQucHJvcHMpLHQubWV0aG9kcyYmZnVuY3Rpb24oZSx0KXtlLiRvcHRpb25zLnByb3BzO2Zvcih2YXIgbiBpbiB0KWVbbl09ImZ1bmN0aW9uIiE9dHlwZW9mIHRbbl0/TjptKHRbbl0sZSl9KGUsdC5tZXRob2RzKSx0LmRhdGE/ZnVuY3Rpb24oZSl7dmFyIHQ9ZS4kb3B0aW9ucy5kYXRhO2QodD1lLl9kYXRhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3duKHQsZSk6dHx8e30pfHwodD17fSk7dmFyIG49T2JqZWN0LmtleXModCkscj1lLiRvcHRpb25zLnByb3BzLGk9KGUuJG9wdGlvbnMubWV0aG9kcyxuLmxlbmd0aCk7Zm9yKDtpLS07KXt2YXIgbz1uW2ldO3ImJmYocixvKXx8KHZvaWQgMCwzNiE9PShhPShvKyIiKS5jaGFyQ29kZUF0KDApKSYmOTUhPT1hJiZfbihlLCJfZGF0YSIsbykpfXZhciBhO2JlKHQsITApfShlKTpiZShlLl9kYXRhPXt9LCEwKSx0LmNvbXB1dGVkJiZmdW5jdGlvbihlLHQpe3ZhciBuPWUuX2NvbXB1dGVkV2F0Y2hlcnM9T2JqZWN0LmNyZWF0ZShudWxsKSxyPVEoKTtmb3IodmFyIGkgaW4gdCl7dmFyIG89dFtpXSxhPSJmdW5jdGlvbiI9PXR5cGVvZiBvP286by5nZXQ7cnx8KG5baV09bmV3IG1uKGUsYXx8TixOLGtuKSksaSBpbiBlfHxTbihlLGksbyl9fShlLHQuY29tcHV0ZWQpLHQud2F0Y2gmJnQud2F0Y2ghPT1LJiZmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KXt2YXIgcj10W25dO2lmKEFycmF5LmlzQXJyYXkocikpZm9yKHZhciBpPTA7aTxyLmxlbmd0aDtpKyspVG4oZSxuLHJbaV0pO2Vsc2UgVG4oZSxuLHIpfX0oZSx0LndhdGNoKX1mdW5jdGlvbiB3bihlLHQpe3NlKCk7dHJ5e3JldHVybiBlLmNhbGwodCx0KX1jYXRjaChlKXtyZXR1cm4gQmUoZSx0LCJkYXRhKCkiKSx7fX1maW5hbGx5e2NlKCl9fXZhciBrbj17bGF6eTohMH07ZnVuY3Rpb24gU24oZSx0LG4pe3ZhciByPSFRKCk7ImZ1bmN0aW9uIj09dHlwZW9mIG4/KHluLmdldD1yP3huKHQpOkNuKG4pLHluLnNldD1OKTooeW4uZ2V0PW4uZ2V0P3ImJiExIT09bi5jYWNoZT94bih0KTpDbihuLmdldCk6Tix5bi5zZXQ9bi5zZXR8fE4pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQseW4pfWZ1bmN0aW9uIHhuKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2NvbXB1dGVkV2F0Y2hlcnMmJnRoaXMuX2NvbXB1dGVkV2F0Y2hlcnNbdF07aWYoZSlyZXR1cm4gZS5kaXJ0eSYmZS5ldmFsdWF0ZSgpLGFlLlNoYXJlZE9iamVjdC50YXJnZXQmJmUuZGVwZW5kKCksZS52YWx1ZX19ZnVuY3Rpb24gQ24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUuY2FsbCh0aGlzLHRoaXMpfX1mdW5jdGlvbiBUbihlLHQsbixyKXtyZXR1cm4gZChuKSYmKG49KHI9bikuaGFuZGxlciksInN0cmluZyI9PXR5cGVvZiBuJiYobj1lW25dKSxlLiR3YXRjaCh0LG4scil9dmFyIE9uLEVuLEluLEFuLCRuLFBuLE1uLGpuPTA7ZnVuY3Rpb24gTG4oZSx0KXt2YXIgbj1lLiRvcHRpb25zPU9iamVjdC5jcmVhdGUoZS5jb25zdHJ1Y3Rvci5vcHRpb25zKSxyPXQuX3BhcmVudFZub2RlO24ucGFyZW50PXQucGFyZW50LG4uX3BhcmVudFZub2RlPXIsbi5fcGFyZW50RWxtPXQuX3BhcmVudEVsbSxuLl9yZWZFbG09dC5fcmVmRWxtO3ZhciBpPXIuY29tcG9uZW50T3B0aW9ucztuLnByb3BzRGF0YT1pLnByb3BzRGF0YSxuLl9wYXJlbnRMaXN0ZW5lcnM9aS5saXN0ZW5lcnMsbi5fcmVuZGVyQ2hpbGRyZW49aS5jaGlsZHJlbixuLl9jb21wb25lbnRUYWc9aS50YWcsdC5yZW5kZXImJihuLnJlbmRlcj10LnJlbmRlcixuLnN0YXRpY1JlbmRlckZucz10LnN0YXRpY1JlbmRlckZucyl9ZnVuY3Rpb24gQm4oZSl7dmFyIHQ9ZS5vcHRpb25zO2lmKGUuc3VwZXIpe3ZhciBuPUJuKGUuc3VwZXIpO2lmKG4hPT1lLnN1cGVyT3B0aW9ucyl7ZS5zdXBlck9wdGlvbnM9bjt2YXIgcj1mdW5jdGlvbihlKXt2YXIgdCxuPWUub3B0aW9ucyxyPWUuc2VhbGVkT3B0aW9ucztmb3IodmFyIGkgaW4gbiluW2ldIT09cltpXSYmKHR8fCh0PXt9KSx0W2ldPW5baV0pO3JldHVybiB0fShlKTtyJiZCKGUuZXh0ZW5kT3B0aW9ucyxyKSwodD1lLm9wdGlvbnM9QWUobixlLmV4dGVuZE9wdGlvbnMpKS5uYW1lJiYodC5jb21wb25lbnRzW3QubmFtZV09ZSl9fXJldHVybiB0fWZ1bmN0aW9uIE5uKGUpe3RoaXMuX2luaXQoZSl9ZnVuY3Rpb24gRG4oZSl7ZS5jaWQ9MDt2YXIgYT0xO2UuZXh0ZW5kPWZ1bmN0aW9uKGUpe2U9ZXx8e307dmFyIHQ9dGhpcyxuPXQuY2lkLHI9ZS5fQ3Rvcnx8KGUuX0N0b3I9e30pO2lmKHJbbl0pcmV0dXJuIHJbbl07dmFyIGk9ZS5uYW1lfHx0Lm9wdGlvbnMubmFtZSxvPWZ1bmN0aW9uKGUpe3RoaXMuX2luaXQoZSl9O3JldHVybigoby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPW8pLmNpZD1hKyssby5vcHRpb25zPUFlKHQub3B0aW9ucyxlKSxvLnN1cGVyPXQsby5vcHRpb25zLnByb3BzJiZmdW5jdGlvbihlKXt2YXIgdD1lLm9wdGlvbnMucHJvcHM7Zm9yKHZhciBuIGluIHQpX24oZS5wcm90b3R5cGUsIl9wcm9wcyIsbil9KG8pLG8ub3B0aW9ucy5jb21wdXRlZCYmZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vcHRpb25zLmNvbXB1dGVkO2Zvcih2YXIgbiBpbiB0KVNuKGUucHJvdG90eXBlLG4sdFtuXSl9KG8pLG8uZXh0ZW5kPXQuZXh0ZW5kLG8ubWl4aW49dC5taXhpbixvLnVzZT10LnVzZSxqLmZvckVhY2goZnVuY3Rpb24oZSl7b1tlXT10W2VdfSksaSYmKG8ub3B0aW9ucy5jb21wb25lbnRzW2ldPW8pLG8uc3VwZXJPcHRpb25zPXQub3B0aW9ucyxvLmV4dGVuZE9wdGlvbnM9ZSxvLnNlYWxlZE9wdGlvbnM9Qih7fSxvLm9wdGlvbnMpLHJbbl09b319ZnVuY3Rpb24gUm4oZSl7cmV0dXJuIGUmJihlLkN0b3Iub3B0aW9ucy5uYW1lfHxlLnRhZyl9ZnVuY3Rpb24gRm4oZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT8tMTxlLmluZGV4T2YodCk6InN0cmluZyI9PXR5cGVvZiBlPy0xPGUuc3BsaXQoIiwiKS5pbmRleE9mKHQpOihuPWUsIltvYmplY3QgUmVnRXhwXSI9PT1yLmNhbGwobikmJmUudGVzdCh0KSk7dmFyIG59ZnVuY3Rpb24gem4oZSx0KXt2YXIgbj1lLmNhY2hlLHI9ZS5rZXlzLGk9ZS5fdm5vZGU7Zm9yKHZhciBvIGluIG4pe3ZhciBhPW5bb107aWYoYSl7dmFyIHM9Um4oYS5jb21wb25lbnRPcHRpb25zKTtzJiYhdChzKSYmVm4obixvLHIsaSl9fX1mdW5jdGlvbiBWbihlLHQsbixyKXt2YXIgaT1lW3RdOyFpfHxyJiZpLnRhZz09PXIudGFnfHxpLmNvbXBvbmVudEluc3RhbmNlLiRkZXN0cm95KCksZVt0XT1udWxsLGsobix0KX1Obi5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0Ll91aWQ9am4rKyx0Ll9pc1Z1ZT0hMCxlJiZlLl9pc0NvbXBvbmVudD9Mbih0LGUpOnQuJG9wdGlvbnM9QWUoQm4odC5jb25zdHJ1Y3RvciksZXx8e30sdCksbm4oKHQuX3JlbmRlclByb3h5PXQpLl9zZWxmPXQpLEp0KHQpLHF0KHQpLGFuKHQsImJlZm9yZUNyZWF0ZSIpLCJtcC10b3V0aWFvIiE9PXQubXBIb3N0JiZ0dCh0KSxibih0KSwibXAtdG91dGlhbyIhPT10Lm1wSG9zdCYmZXQodCksIm1wLXRvdXRpYW8iIT09dC5tcEhvc3QmJmFuKHQsImNyZWF0ZWQiKSx0LiRvcHRpb25zLmVsJiZ0LiRtb3VudCh0LiRvcHRpb25zLmVsKX0sT249Tm4sRW49e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhfX0sSW49e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wc319LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPbi5wcm90b3R5cGUsIiRkYXRhIixFbiksT2JqZWN0LmRlZmluZVByb3BlcnR5KE9uLnByb3RvdHlwZSwiJHByb3BzIixJbiksT24ucHJvdG90eXBlLiRzZXQ9a2UsT24ucHJvdG90eXBlLiRkZWxldGU9U2UsT24ucHJvdG90eXBlLiR3YXRjaD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcztpZihkKHQpKXJldHVybiBUbihyLGUsdCxuKTsobj1ufHx7fSkudXNlcj0hMDt2YXIgaT1uZXcgbW4ocixlLHQsbik7aWYobi5pbW1lZGlhdGUpdHJ5e3QuY2FsbChyLGkudmFsdWUpfWNhdGNoKGUpe0JlKGUsciwnY2FsbGJhY2sgZm9yIGltbWVkaWF0ZSB3YXRjaGVyICInK2kuZXhwcmVzc2lvbisnIicpfXJldHVybiBmdW5jdGlvbigpe2kudGVhcmRvd24oKX19LCRuPS9eaG9vazovLChBbj1ObikucHJvdG90eXBlLiRvbj1mdW5jdGlvbihlLHQpe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKXRoaXMuJG9uKGVbbl0sdCk7ZWxzZSh0aGlzLl9ldmVudHNbZV18fCh0aGlzLl9ldmVudHNbZV09W10pKS5wdXNoKHQpLCRuLnRlc3QoZSkmJih0aGlzLl9oYXNIb29rRXZlbnQ9ITApO3JldHVybiB0aGlzfSxBbi5wcm90b3R5cGUuJG9uY2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2Z1bmN0aW9uIHIoKXtuLiRvZmYoZSxyKSx0LmFwcGx5KG4sYXJndW1lbnRzKX1yZXR1cm4gci5mbj10LG4uJG9uKGUsciksbn0sQW4ucHJvdG90eXBlLiRvZmY9ZnVuY3Rpb24oZSx0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcztpZihBcnJheS5pc0FycmF5KGUpKXtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspdGhpcy4kb2ZmKGVbbl0sdCk7cmV0dXJuIHRoaXN9dmFyIGksbz10aGlzLl9ldmVudHNbZV07aWYoIW8pcmV0dXJuIHRoaXM7aWYoIXQpcmV0dXJuIHRoaXMuX2V2ZW50c1tlXT1udWxsLHRoaXM7Zm9yKHZhciBhPW8ubGVuZ3RoO2EtLTspaWYoKGk9b1thXSk9PT10fHxpLmZuPT09dCl7by5zcGxpY2UoYSwxKTticmVha31yZXR1cm4gdGhpc30sQW4ucHJvdG90eXBlLiRlbWl0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2V2ZW50c1tlXTtpZih0KXt0PTE8dC5sZW5ndGg/eSh0KTp0O2Zvcih2YXIgbj15KGFyZ3VtZW50cywxKSxyPSdldmVudCBoYW5kbGVyIGZvciAiJytlKyciJyxpPTAsbz10Lmxlbmd0aDtpPG87aSsrKU5lKHRbaV0sdGhpcyxuLHRoaXMscil9cmV0dXJuIHRoaXN9LChQbj1ObikucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24oZSx0KXt2YXIgbixyPXRoaXMsaT1yLiRlbCxvPXIuX3Zub2RlLGE9KG49dG4sdG49cixmdW5jdGlvbigpe3RuPW59KTtyLl92bm9kZT1lLG8/ci4kZWw9ci5fX3BhdGNoX18obyxlKTooci4kZWw9ci5fX3BhdGNoX18oci4kZWwsZSx0LCExLHIuJG9wdGlvbnMuX3BhcmVudEVsbSxyLiRvcHRpb25zLl9yZWZFbG0pLHIuJG9wdGlvbnMuX3BhcmVudEVsbT1yLiRvcHRpb25zLl9yZWZFbG09bnVsbCksYSgpLGkmJihpLl9fdnVlX189bnVsbCksci4kZWwmJihyLiRlbC5fX3Z1ZV9fPXIpLHIuJHZub2RlJiZyLiRwYXJlbnQmJnIuJHZub2RlPT09ci4kcGFyZW50Ll92bm9kZSYmKHIuJHBhcmVudC4kZWw9ci4kZWwpfSxQbi5wcm90b3R5cGUuJGZvcmNlVXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fd2F0Y2hlciYmdGhpcy5fd2F0Y2hlci51cGRhdGUoKX0sUG4ucHJvdG90eXBlLiRkZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZighZS5faXNCZWluZ0Rlc3Ryb3llZCl7YW4oZSwiYmVmb3JlRGVzdHJveSIpLGUuX2lzQmVpbmdEZXN0cm95ZWQ9ITA7dmFyIHQ9ZS4kcGFyZW50OyF0fHx0Ll9pc0JlaW5nRGVzdHJveWVkfHxlLiRvcHRpb25zLmFic3RyYWN0fHxrKHQuJGNoaWxkcmVuLGUpLGUuX3dhdGNoZXImJmUuX3dhdGNoZXIudGVhcmRvd24oKTtmb3IodmFyIG49ZS5fd2F0Y2hlcnMubGVuZ3RoO24tLTspZS5fd2F0Y2hlcnNbbl0udGVhcmRvd24oKTtlLl9kYXRhLl9fb2JfXyYmZS5fZGF0YS5fX29iX18udm1Db3VudC0tLGUuX2lzRGVzdHJveWVkPSEwLGUuX19wYXRjaF9fKGUuX3Zub2RlLG51bGwpLGFuKGUsImRlc3Ryb3llZCIpLGUuJG9mZigpLGUuJGVsJiYoZS4kZWwuX192dWVfXz1udWxsKSxlLiR2bm9kZSYmKGUuJHZub2RlLnBhcmVudD1udWxsKX19LGt0KChNbj1ObikucHJvdG90eXBlKSxNbi5wcm90b3R5cGUuJG5leHRUaWNrPWZ1bmN0aW9uKGUpe3JldHVybiBxZShlLHRoaXMpfSxNbi5wcm90b3R5cGUuX3JlbmRlcj1mdW5jdGlvbigpe3ZhciB0LG49dGhpcyxlPW4uJG9wdGlvbnMscj1lLnJlbmRlcixpPWUuX3BhcmVudFZub2RlO2kmJihuLiRzY29wZWRTbG90cz1vdChpLmRhdGEuc2NvcGVkU2xvdHMsbi4kc2xvdHMsbi4kc2NvcGVkU2xvdHMpKSxuLiR2bm9kZT1pO3RyeXtIdD1uLHQ9ci5jYWxsKG4uX3JlbmRlclByb3h5LG4uJGNyZWF0ZUVsZW1lbnQpfWNhdGNoKGUpe0JlKGUsbiwicmVuZGVyIiksdD1uLl92bm9kZX1maW5hbGx5e0h0PW51bGx9cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJjE9PT10Lmxlbmd0aCYmKHQ9dFswXSksdCBpbnN0YW5jZW9mIHVlfHwodD1kZSgpKSx0LnBhcmVudD1pLHR9O3ZhciBVbixxbixXbixIbj1bU3RyaW5nLFJlZ0V4cCxBcnJheV0sR249e0tlZXBBbGl2ZTp7bmFtZToia2VlcC1hbGl2ZSIsYWJzdHJhY3Q6ITAscHJvcHM6e2luY2x1ZGU6SG4sZXhjbHVkZTpIbixtYXg6W1N0cmluZyxOdW1iZXJdfSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5jYWNoZT1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMua2V5cz1bXX0sZGVzdHJveWVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHRoaXMuY2FjaGUpVm4odGhpcy5jYWNoZSxlLHRoaXMua2V5cyl9LG1vdW50ZWQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuJHdhdGNoKCJpbmNsdWRlIixmdW5jdGlvbih0KXt6bihlLGZ1bmN0aW9uKGUpe3JldHVybiBGbih0LGUpfSl9KSx0aGlzLiR3YXRjaCgiZXhjbHVkZSIsZnVuY3Rpb24odCl7em4oZSxmdW5jdGlvbihlKXtyZXR1cm4hRm4odCxlKX0pfSl9LHJlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuJHNsb3RzLmRlZmF1bHQsdD1ZdChlKSxuPXQmJnQuY29tcG9uZW50T3B0aW9ucztpZihuKXt2YXIgcj1SbihuKSxpPXRoaXMuaW5jbHVkZSxvPXRoaXMuZXhjbHVkZTtpZihpJiYoIXJ8fCFGbihpLHIpKXx8byYmciYmRm4obyxyKSlyZXR1cm4gdDt2YXIgYT10aGlzLmNhY2hlLHM9dGhpcy5rZXlzLGM9bnVsbD09dC5rZXk/bi5DdG9yLmNpZCsobi50YWc/Ijo6IituLnRhZzoiIik6dC5rZXk7YVtjXT8odC5jb21wb25lbnRJbnN0YW5jZT1hW2NdLmNvbXBvbmVudEluc3RhbmNlLGsocyxjKSxzLnB1c2goYykpOihhW2NdPXQscy5wdXNoKGMpLHRoaXMubWF4JiZzLmxlbmd0aD5wYXJzZUludCh0aGlzLm1heCkmJlZuKGEsc1swXSxzLHRoaXMuX3Zub2RlKSksdC5kYXRhLmtlZXBBbGl2ZT0hMH1yZXR1cm4gdHx8ZSYmZVswXX19fTtVbj1ObixXbj17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFJ9fSxPYmplY3QuZGVmaW5lUHJvcGVydHkoVW4sImNvbmZpZyIsV24pLFVuLnV0aWw9e3dhcm46aWUsZXh0ZW5kOkIsbWVyZ2VPcHRpb25zOkFlLGRlZmluZVJlYWN0aXZlOndlfSxVbi5zZXQ9a2UsVW4uZGVsZXRlPVNlLFVuLm5leHRUaWNrPXFlLFVuLm9ic2VydmFibGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGJlKGUpLGV9LFVuLm9wdGlvbnM9T2JqZWN0LmNyZWF0ZShudWxsKSxqLmZvckVhY2goZnVuY3Rpb24oZSl7VW4ub3B0aW9uc1tlKyJzIl09T2JqZWN0LmNyZWF0ZShudWxsKX0pLEIoKFVuLm9wdGlvbnMuX2Jhc2U9VW4pLm9wdGlvbnMuY29tcG9uZW50cyxHbiksVW4udXNlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2luc3RhbGxlZFBsdWdpbnN8fCh0aGlzLl9pbnN0YWxsZWRQbHVnaW5zPVtdKTtpZigtMTx0LmluZGV4T2YoZSkpcmV0dXJuIHRoaXM7dmFyIG49eShhcmd1bWVudHMsMSk7cmV0dXJuIG4udW5zaGlmdCh0aGlzKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5pbnN0YWxsP2UuaW5zdGFsbC5hcHBseShlLG4pOiJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLmFwcGx5KG51bGwsbiksdC5wdXNoKGUpLHRoaXN9LFVuLm1peGluPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9wdGlvbnM9QWUodGhpcy5vcHRpb25zLGUpLHRoaXN9LERuKFVuKSxxbj1VbixqLmZvckVhY2goZnVuY3Rpb24obil7cW5bbl09ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD8oImNvbXBvbmVudCI9PT1uJiZkKHQpJiYodC5uYW1lPXQubmFtZXx8ZSx0PXRoaXMub3B0aW9ucy5fYmFzZS5leHRlbmQodCkpLCJkaXJlY3RpdmUiPT09biYmImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PXtiaW5kOnQsdXBkYXRlOnR9KSx0aGlzLm9wdGlvbnNbbisicyJdW2VdPXQpOnRoaXMub3B0aW9uc1tuKyJzIl1bZV19fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KE5uLnByb3RvdHlwZSwiJGlzU2VydmVyIix7Z2V0OlF9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoTm4ucHJvdG90eXBlLCIkc3NyQ29udGV4dCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiR2bm9kZSYmdGhpcy4kdm5vZGUuc3NyQ29udGV4dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoTm4sIkZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0Iix7dmFsdWU6U3R9KSxObi52ZXJzaW9uPSIyLjYuMTAiO3ZhciBYbj0xO2Z1bmN0aW9uIFluKGUpe3RoaXMuaW5zdGFuY2VJZD0iIix0aGlzLm5vZGVJZD1YbisrLHRoaXMucGFyZW50Tm9kZT1udWxsLHRoaXMubm9kZVR5cGU9Myx0aGlzLnRleHQ9ZX1mdW5jdGlvbiBKbihlKXtyZXR1cm4gYS5jcmVhdGVFbGVtZW50KGUpfXZhciBLbj1PYmplY3QuZnJlZXplKHtuYW1lc3BhY2VNYXA6e30sY3JlYXRlRWxlbWVudDpKbixjcmVhdGVFbGVtZW50TlM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYS5jcmVhdGVFbGVtZW50KGUrIjoiK3QpfSxjcmVhdGVUZXh0Tm9kZTpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IFluKGUpfSxjcmVhdGVDb21tZW50OmZ1bmN0aW9uKGUpe3JldHVybiBhLmNyZWF0ZUNvbW1lbnQoZSl9LGluc2VydEJlZm9yZTpmdW5jdGlvbihlLHQsbil7aWYoMyE9PXQubm9kZVR5cGUpZS5pbnNlcnRCZWZvcmUodCxuKTtlbHNle3ZhciByPSJ3ZWV4Ij09PWEuX18kY29tcGlsZXJfXz8idGV4dCI6InUtdGV4dCI7aWYoZS50eXBlPT09cillLnNldEF0dHIoInZhbHVlIix0LnRleHQpLHQucGFyZW50Tm9kZT1lO2Vsc2V7dmFyIGk9Sm4ocik7aS5zZXRBdHRyKCJ2YWx1ZSIsdC50ZXh0KSxlLmluc2VydEJlZm9yZShpLG4pfX19LHJlbW92ZUNoaWxkOmZ1bmN0aW9uKGUsdCl7MyE9PXQubm9kZVR5cGU/ZS5yZW1vdmVDaGlsZCh0KTplLnNldEF0dHIoInZhbHVlIiwiIil9LGFwcGVuZENoaWxkOmZ1bmN0aW9uKGUsdCl7aWYoMyE9PXQubm9kZVR5cGUpZS5hcHBlbmRDaGlsZCh0KTtlbHNle3ZhciBuPSJ3ZWV4Ij09PWEuX18kY29tcGlsZXJfXz8idGV4dCI6InUtdGV4dCI7aWYoZS50eXBlPT09billLnNldEF0dHIoInZhbHVlIix0LnRleHQpLHQucGFyZW50Tm9kZT1lO2Vsc2V7dmFyIHI9Sm4obik7ci5zZXRBdHRyKCJ2YWx1ZSIsdC50ZXh0KSxlLmFwcGVuZENoaWxkKHIpfX19LHBhcmVudE5vZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZX0sbmV4dFNpYmxpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubmV4dFNpYmxpbmd9LHRhZ05hbWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHlwZX0sc2V0VGV4dENvbnRlbnQ6ZnVuY3Rpb24oZSx0KXtlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5zZXRBdHRyKCJ2YWx1ZSIsdCl9LHNldEF0dHJpYnV0ZTpmdW5jdGlvbihlLHQsbil7ZS5zZXRBdHRyKHQsbil9LHNldFN0eWxlU2NvcGU6ZnVuY3Rpb24oZSx0KXtlLnNldEF0dHIoIkBzdHlsZVNjb3BlIix0KX19KSxabj17Y3JlYXRlOmZ1bmN0aW9uKGUsdCl7UW4odCl9LHVwZGF0ZTpmdW5jdGlvbihlLHQpe2UuZGF0YS5yZWYhPT10LmRhdGEucmVmJiYoUW4oZSwhMCksUW4odCkpfSxkZXN0cm95OmZ1bmN0aW9uKGUpe1FuKGUsITApfX07ZnVuY3Rpb24gUW4oZSx0KXt2YXIgbj1lLmRhdGEucmVmO2lmKEkobikpe3ZhciByPWUuY29udGV4dCxpPWUuY29tcG9uZW50SW5zdGFuY2V8fGUuZWxtLG89ci4kcmVmczt0P0FycmF5LmlzQXJyYXkob1tuXSk/ayhvW25dLGkpOm9bbl09PT1pJiYob1tuXT12b2lkIDApOmUuZGF0YS5yZWZJbkZvcj9BcnJheS5pc0FycmF5KG9bbl0pP29bbl0uaW5kZXhPZihpKTwwJiZvW25dLnB1c2goaSk6b1tuXT1baV06b1tuXT1pfX1zKCJodG1sLGJvZHksYmFzZSxoZWFkLGxpbmssbWV0YSxzdHlsZSx0aXRsZSxhZGRyZXNzLGFydGljbGUsYXNpZGUsZm9vdGVyLGhlYWRlcixoMSxoMixoMyxoNCxoNSxoNixoZ3JvdXAsbmF2LHNlY3Rpb24sZGl2LGRkLGRsLGR0LGZpZ2NhcHRpb24sZmlndXJlLHBpY3R1cmUsaHIsaW1nLGxpLG1haW4sb2wscCxwcmUsdWwsYSxiLGFiYnIsYmRpLGJkbyxicixjaXRlLGNvZGUsZGF0YSxkZm4sZW0saSxrYmQsbWFyayxxLHJwLHJ0LHJ0YyxydWJ5LHMsc2FtcCxzbWFsbCxzcGFuLHN0cm9uZyxzdWIsc3VwLHRpbWUsdSx2YXIsd2JyLGFyZWEsYXVkaW8sbWFwLHRyYWNrLHZpZGVvLGVtYmVkLG9iamVjdCxwYXJhbSxzb3VyY2UsY2FudmFzLHNjcmlwdCxub3NjcmlwdCxkZWwsaW5zLGNhcHRpb24sY29sLGNvbGdyb3VwLHRhYmxlLHRoZWFkLHRib2R5LHRkLHRoLHRyLGJ1dHRvbixkYXRhbGlzdCxmaWVsZHNldCxmb3JtLGlucHV0LGxhYmVsLGxlZ2VuZCxtZXRlcixvcHRncm91cCxvcHRpb24sb3V0cHV0LHByb2dyZXNzLHNlbGVjdCx0ZXh0YXJlYSxkZXRhaWxzLGRpYWxvZyxtZW51LG1lbnVpdGVtLHN1bW1hcnksY29udGVudCxlbGVtZW50LHNoYWRvdyx0ZW1wbGF0ZSxibG9ja3F1b3RlLGlmcmFtZSx0Zm9vdCIpLHMoInN2ZyxhbmltYXRlLGNpcmNsZSxjbGlwcGF0aCxjdXJzb3IsZGVmcyxkZXNjLGVsbGlwc2UsZmlsdGVyLGZvbnQtZmFjZSxmb3JlaWduT2JqZWN0LGcsZ2x5cGgsaW1hZ2UsbGluZSxtYXJrZXIsbWFzayxtaXNzaW5nLWdseXBoLHBhdGgscGF0dGVybixwb2x5Z29uLHBvbHlsaW5lLHJlY3Qsc3dpdGNoLHN5bWJvbCx0ZXh0LHRleHRwYXRoLHRzcGFuLHVzZSx2aWV3IiwhMCk7dmFyIGVyPXMoInRleHQsbnVtYmVyLHBhc3N3b3JkLHNlYXJjaCxlbWFpbCx0ZWwsdXJsIiksdHI9bmV3IHVlKCIiLHt9LFtdKSxucj1bImNyZWF0ZSIsImFjdGl2YXRlIiwidXBkYXRlIiwicmVtb3ZlIiwiZGVzdHJveSJdO2Z1bmN0aW9uIHJyKGUsdCl7cmV0dXJuIGUua2V5PT09dC5rZXkmJihlLnRhZz09PXQudGFnJiZlLmlzQ29tbWVudD09PXQuaXNDb21tZW50JiZJKGUuZGF0YSk9PT1JKHQuZGF0YSkmJmZ1bmN0aW9uKGUsdCl7aWYoImlucHV0IiE9PWUudGFnKXJldHVybiEwO3ZhciBuLHI9SShuPWUuZGF0YSkmJkkobj1uLmF0dHJzKSYmbi50eXBlLGk9SShuPXQuZGF0YSkmJkkobj1uLmF0dHJzKSYmbi50eXBlO3JldHVybiByPT09aXx8ZXIocikmJmVyKGkpfShlLHQpfHxBKGUuaXNBc3luY1BsYWNlaG9sZGVyKSYmZS5hc3luY0ZhY3Rvcnk9PT10LmFzeW5jRmFjdG9yeSYmRSh0LmFzeW5jRmFjdG9yeS5lcnJvcikpfWZ1bmN0aW9uIGlyKGUsdCxuKXt2YXIgcixpLG89e307Zm9yKHI9dDtyPD1uOysrcilJKGk9ZVtyXS5rZXkpJiYob1tpXT1yKTtyZXR1cm4gb312YXIgb3I9e2NyZWF0ZTphcix1cGRhdGU6YXIsZGVzdHJveTpmdW5jdGlvbihlKXthcihlLHRyKX19O2Z1bmN0aW9uIGFyKGUsdCl7KGUuZGF0YS5kaXJlY3RpdmVzfHx0LmRhdGEuZGlyZWN0aXZlcykmJmZ1bmN0aW9uKHQsbil7dmFyIGUscixpLG89dD09PXRyLGE9bj09PXRyLHM9Y3IodC5kYXRhLmRpcmVjdGl2ZXMsdC5jb250ZXh0KSxjPWNyKG4uZGF0YS5kaXJlY3RpdmVzLG4uY29udGV4dCksdT1bXSxsPVtdO2ZvcihlIGluIGMpcj1zW2VdLGk9Y1tlXSxyPyhpLm9sZFZhbHVlPXIudmFsdWUsaS5vbGRBcmc9ci5hcmcsdXIoaSwidXBkYXRlIixuLHQpLGkuZGVmJiZpLmRlZi5jb21wb25lbnRVcGRhdGVkJiZsLnB1c2goaSkpOih1cihpLCJiaW5kIixuLHQpLGkuZGVmJiZpLmRlZi5pbnNlcnRlZCYmdS5wdXNoKGkpKTtpZih1Lmxlbmd0aCl7dmFyIGQ9ZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPHUubGVuZ3RoO2UrKyl1cih1W2VdLCJpbnNlcnRlZCIsbix0KX07bz9KZShuLCJpbnNlcnQiLGQpOmQoKX1sLmxlbmd0aCYmSmUobiwicG9zdHBhdGNoIixmdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8bC5sZW5ndGg7ZSsrKXVyKGxbZV0sImNvbXBvbmVudFVwZGF0ZWQiLG4sdCl9KTtpZighbylmb3IoZSBpbiBzKWNbZV18fHVyKHNbZV0sInVuYmluZCIsdCx0LGEpfShlLHQpfXZhciBzcj1PYmplY3QuY3JlYXRlKG51bGwpO2Z1bmN0aW9uIGNyKGUsdCl7dmFyIG4scixpLG89T2JqZWN0LmNyZWF0ZShudWxsKTtpZighZSlyZXR1cm4gbztmb3Iobj0wO248ZS5sZW5ndGg7bisrKShyPWVbbl0pLm1vZGlmaWVyc3x8KHIubW9kaWZpZXJzPXNyKSwob1soaT1yLGkucmF3TmFtZXx8aS5uYW1lKyIuIitPYmplY3Qua2V5cyhpLm1vZGlmaWVyc3x8e30pLmpvaW4oIi4iKSldPXIpLmRlZj0kZSh0LiRvcHRpb25zLCJkaXJlY3RpdmVzIixyLm5hbWUpO3JldHVybiBvfWZ1bmN0aW9uIHVyKHQsbixyLGUsaSl7dmFyIG89dC5kZWYmJnQuZGVmW25dO2lmKG8pdHJ5e28oci5lbG0sdCxyLGUsaSl9Y2F0Y2goZSl7QmUoZSxyLmNvbnRleHQsImRpcmVjdGl2ZSAiK3QubmFtZSsiICIrbisiIGhvb2siKX19dmFyIGxyPVtabixvcl0sZHI9dShmdW5jdGlvbihlKXt2YXIgbj17fSxyPS86KC4rKS87cmV0dXJuIGUuc3BsaXQoLzsoPyFbXihdKlwpKS9nKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PWUuc3BsaXQocik7MTx0Lmxlbmd0aCYmKG5bdFswXS50cmltKCldPXRbMV0udHJpbSgpKX19KSxufSk7ZnVuY3Rpb24gZnIoZSl7dmFyIHQ9cHIoZS5zdHlsZSk7cmV0dXJuIGUuc3RhdGljU3R5bGU/QihlLnN0YXRpY1N0eWxlLHQpOnR9ZnVuY3Rpb24gcHIoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/eChlKToic3RyaW5nIj09dHlwZW9mIGU/ZHIoZSk6ZX12YXIgaHI9e3ZpZXc6e2NsYXNzOlsiaG92ZXJDbGFzcyJdLHN0eWxlOltdfSxidXR0b246e2NsYXNzOlsiaG92ZXJDbGFzcyJdLHN0eWxlOltdfSxuYXZpZ2F0b3I6e2NsYXNzOlsiaG92ZXJDbGFzcyJdLHN0eWxlOltdfSwidS1pbnB1dCI6e2NsYXNzOlsicGxhY2Vob2xkZXJDbGFzcyJdLHN0eWxlOlsicGxhY2Vob2xkZXJTdHlsZSJdfSwidS10ZXh0YXJlYSI6e2NsYXNzOlsicGxhY2Vob2xkZXJDbGFzcyJdLHN0eWxlOlsicGxhY2Vob2xkZXJTdHlsZSJdfSwicGlja2VyLXZpZXciOntjbGFzczpbImluZGljYXRvckNsYXNzIiwibWFza0NsYXNzIl0sc3R5bGU6WyJpbmRpY2F0b3JTdHlsZSIsIm1hc2tTdHlsZSJdfX07ZnVuY3Rpb24gdnIoZSx0LG4scil7aWYoIXQpcmV0dXJuIHQ7dmFyIGk9aHJbbi50eXBlXTtpZihpKXtpZigtMSE9PWkuY2xhc3MuaW5kZXhPZihlKSlyZXR1cm4gci4kb3B0aW9ucy5zdHlsZSYmci4kb3B0aW9ucy5zdHlsZVt0XXx8e307aWYoLTEhPT1pLnN0eWxlLmluZGV4T2YoZSkpcmV0dXJuIHByKHQpfXJldHVybiB0fWZ1bmN0aW9uIGdyKGUsdCl7aWYoZS5kYXRhLmF0dHJzfHx0LmRhdGEuYXR0cnMpe3ZhciBuLHIsaT10LmVsbSxvPWUuZGF0YS5hdHRyc3x8e30sYT10LmRhdGEuYXR0cnN8fHt9O2EuX19vYl9fJiYoYT10LmRhdGEuYXR0cnM9Qih7fSxhKSk7dmFyIHM9ImZ1bmN0aW9uIj09dHlwZW9mIGkuc2V0QXR0cnMsYz17fTtmb3IobiBpbiBhKXI9YVtuXSxvW25dIT09ciYmKHM/Y1tuXT1yOmkuc2V0QXR0cihuLHZyKG4scixpLHQuY29udGV4dCkpKTtmb3IobiBpbiBvKW51bGw9PWFbbl0mJihzP2Nbbl09dm9pZCAwOmkuc2V0QXR0cihuKSk7cyYmaS5zZXRBdHRycyhmdW5jdGlvbihvLGUsdCl7dmFyIGE9aHJbZS50eXBlXTtpZighYSlyZXR1cm4gbzt2YXIgcz10LiRvcHRpb25zLnN0eWxlfHx7fSxjPXNbIkBWRVJTSU9OIl18fDE7cmV0dXJuIE9iamVjdC5rZXlzKG8pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9b1tlXTtpZigtMSE9PWEuY2xhc3MuaW5kZXhPZihlKSlpZihjPDJ8fCEoIi4iK3QgaW4gcykpb1tlXT1zW3RdfHx7fTtlbHNle3ZhciBuPShzWyIuIit0XXx8e30pWyIiXXx8e30scj17fTtmb3IodmFyIGkgaW4gbilyW2ldPW5baV1bMF07b1tlXT1yfWVsc2UtMSE9PWEuc3R5bGUuaW5kZXhPZihlKSYmKG9bZV09cHIodCkpfSksb30oYyxpLHQuY29udGV4dCkpfX12YXIgbXI9e2NyZWF0ZTpncix1cGRhdGU6Z3J9O2Z1bmN0aW9uIHlyKGUpe2Zvcih2YXIgdD1fcihlKSxuPWUscj1lO0koci5jb21wb25lbnRJbnN0YW5jZSk7KShyPXIuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlKSYmci5kYXRhJiYodD1CKF9yKHIpLHQpKTtmb3IoO0kobj1uLnBhcmVudCk7KW4mJm4uZGF0YSYmKHQ9Qih0LF9yKG4pKSk7cmV0dXJuIHR9ZnVuY3Rpb24gX3IoZSl7dmFyIHQsbixyLGksbz1lLmRhdGE7cmV0dXJuIEUoby5zdGF0aWNDbGFzcykmJkUoby5jbGFzcyk/e306KHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9W10sbj1lLnN0YXRpY0NsYXNzLHI9ZS5jbGFzcztuJiZ0LnB1c2guYXBwbHkodCxuKTtBcnJheS5pc0FycmF5KHIpP3QucHVzaC5hcHBseSh0LHIpOmIocik/dC5wdXNoLmFwcGx5KHQsT2JqZWN0LmtleXMocikuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiByW2VdfSkpOiJzdHJpbmciPT10eXBlb2YgciYmdC5wdXNoLmFwcGx5KHQsci50cmltKCkuc3BsaXQoL1xzKy8pKTtyZXR1cm4gdH0obyksbj1lLmNvbnRleHQscj1uLiRvcHRpb25zLnN0eWxlfHx7fSxpPXt9LHQuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1yW2VdO0IoaSx0KX0pLGkpfWZ1bmN0aW9uIGJyKGUsdCxuLHIpe3ZhciBpLG8sYT17fTtmb3IobyBpbiBuKUUodFtvXSkmJihhW3IobyldPSIiKTtmb3IobyBpbiB0KShpPXRbb10pIT09bltvXSYmKGFbcihvKV09aSk7ZS5zZXRTdHlsZXMoYSl9ZnVuY3Rpb24gd3IoZSx0LG4pe3ZhciByPXQmJnQuY29udGV4dC4kb3B0aW9ucy5zdHlsZTtyJiYhZS5pbmNsdWRlcyhyKSYmKG4/ZS51bnNoaWZ0KHIpOmUucHVzaChyKSl9ZnVuY3Rpb24ga3IoZSl7Zm9yKHZhciB0PWUuZGF0YSxuPWUscj1lO0koci5jb21wb25lbnRJbnN0YW5jZSk7KShyPXIuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlKSYmci5kYXRhJiYodD1TcihyLmRhdGEsdCkpO2Zvcig7SShuPW4ucGFyZW50KTspbiYmbi5kYXRhJiYodD1Tcih0LG4uZGF0YSkpO3JldHVybiBmdW5jdGlvbihlLHQpe2lmKEkoZSl8fEkodCkpcmV0dXJuIHhyKENyKGUpLENyKHQpKTtyZXR1cm4iIn0odC5zdGF0aWNDbGFzcyx0LmNsYXNzKX1mdW5jdGlvbiBTcihlLHQpe3JldHVybntzdGF0aWNDbGFzczp4cihDcihlLnN0YXRpY0NsYXNzKSxDcih0LnN0YXRpY0NsYXNzKSksY2xhc3M6SShlLmNsYXNzKT9bZS5jbGFzcyx0LmNsYXNzXTp0LmNsYXNzfX1mdW5jdGlvbiB4cihlLHQpe3JldHVybiBlP3Q/ZSsiICIrdDplOnR8fCIifWZ1bmN0aW9uIENyKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPSIiLHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspSSh0PUNyKGVbcl0pKSYmIiIhPT10JiYobiYmKG4rPSIgIiksbis9dCk7cmV0dXJuIG59KGUpOmIoZSk/ZnVuY3Rpb24oZSl7dmFyIHQ9IiI7Zm9yKHZhciBuIGluIGUpZVtuXSYmKHQmJih0Kz0iICIpLHQrPW4pO3JldHVybiB0fShlKToic3RyaW5nIj09dHlwZW9mIGU/ZToiIn1mdW5jdGlvbiBUcihlLHQpe3ZhciBuPXQuZGF0YSxyPWUuZGF0YTtpZighKEUobi5zdGF0aWNDbGFzcykmJkUobi5jbGFzcykmJihFKHIpfHxFKHIuc3RhdGljQ2xhc3MpJiZFKHIuY2xhc3MpKSkpe3ZhciBpPSJ3ZWV4Ij09PWEuX18kc3R5bGVDb21waWxlcl9fO2lmKGEuX18kYXV0b21hdG9yX198fCFpKXtpfHx0LmVsbS5zZXRTdHlsZXNoZWV0JiZ0LmVsbS5zZXRTdHlsZXNoZWV0KGZ1bmN0aW9uKGUpe3ZhciB0PVtdLG49ZSxyPWU7Zm9yKHdyKHQsZSk7SShyLmNvbXBvbmVudEluc3RhbmNlKTspd3IodCxyPXIuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlLCEwKTtmb3IoO0kobj1uLnBhcmVudCk7KXdyKHQsbik7cmV0dXJuIHR9KHQpKTt2YXIgbz1rcih0KTt0LmVsbS5zZXRDbGFzc0xpc3QmJnQuZWxtLnNldENsYXNzTGlzdChvLnNwbGl0KCIgIikpfWkmJmJyKHQuZWxtLHlyKHQpLHlyKGUpLE9yKX19ZnVuY3Rpb24gT3IoZSl7cmV0dXJuIGV9dmFyIEVyLElyLEFyPXtjcmVhdGU6VHIsdXBkYXRlOlRyfTtmdW5jdGlvbiAkcihlLHQsbixyLGkpe2lmKG4pY29uc29sZS5sb2coIldlZXggZG8gbm90IHN1cHBvcnQgZXZlbnQgaW4gYnViYmxlIHBoYXNlLiIpO2Vsc2V7aWYoSXImJklyLl92aXJ0dWFsQ29tcG9uZW50cyl7RXIuX2NvbnRleHQ9SXI7dmFyIG89dDt0PWZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cyx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09ZVtuXTt2YXIgcj0odFswXXx8e30pLmNvbXBvbmVudElkLGk9dGhpcy5fY29udGV4dDtyJiZ0aGlzLl9jb250ZXh0JiYoaT0odGhpcy5fY29udGV4dC5fdmlydHVhbENvbXBvbmVudHN8fHt9KVtyXXx8aSk7dHJ5eyFmdW5jdGlvbihlLHQsbil7dm9pZCAwPT09biYmKG49bnVsbCk7dmFyIHI9ZS5mbnM7aWYoIUFycmF5LmlzQXJyYXkocikpcmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHI/ci5hcHBseShuLHQpOmUuYXBwbHkobix0KTtmb3IodmFyIGk9ci5zbGljZSgpLG89MDtvPGkubGVuZ3RoO28rKylpW29dLmFwcGx5KG4sdCl9KG8sdCxpKX1jYXRjaChlKXtCZShlLGksIkZhaWxlZCB0byBpbnZva2UgdmlydHVhbCBjb21wb25lbnQgaGFuZGxlciAoIityKyIpIil9fX1Fci5hZGRFdmVudChlLHQsaSl9fWZ1bmN0aW9uIFByKGUsdCxuLHIpeyhyfHxFcikucmVtb3ZlRXZlbnQoZSl9ZnVuY3Rpb24gTXIoZSx0KXtpZihlLmRhdGEub258fHQuZGF0YS5vbil7dmFyIG49dC5kYXRhLm9ufHx7fSxyPWUuZGF0YS5vbnx8e307RXI9dC5lbG0sSXI9dC5jb250ZXh0LFllKG4sciwkcixQcix0LmNvbnRleHQpLElyPUVyPXZvaWQgMH19dmFyIGpyPXtjcmVhdGU6TXIsdXBkYXRlOk1yfSxMcj11KGgpO2Z1bmN0aW9uIEJyKGUsdCl7dmFyIG49dC5kYXRhLHI9ZS5kYXRhO2lmKCEoRShuLnN0YXRpY1N0eWxlKSYmRShuLnN0eWxlKSYmRShyLnN0YXRpY1N0eWxlKSYmRShyLnN0eWxlKSkpe3ZhciBpPXQuZWxtLG89ci5zdGF0aWNTdHlsZSxhPXIubm9ybWFsaXplZFN0eWxlfHxyLnN0eWxlfHx7fSxzPW98fGEsYz1wcih0LmRhdGEuc3R5bGUpfHx7fTt0LmRhdGEubm9ybWFsaXplZFN0eWxlPUkoYy5fX29iX18pP0Ioe30sYyk6YyxicihpLGZ1bmN0aW9uKGUsdCl7dmFyIG4scj17fTtpZih0KWZvcih2YXIgaT1lO2kuY29tcG9uZW50SW5zdGFuY2U7KShpPWkuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlKSYmaS5kYXRhJiYobj1mcihpLmRhdGEpKSYmQihyLG4pOyhuPWZyKGUuZGF0YSkpJiZCKHIsbik7Zm9yKHZhciBvPWU7bz1vLnBhcmVudDspby5kYXRhJiYobj1mcihvLmRhdGEpKSYmQihyLG4pO3JldHVybiByfSh0LCEwKSxzLExyKX19dmFyIE5yPXtjcmVhdGU6QnIsdXBkYXRlOkJyfTtmdW5jdGlvbiBEcihlKXtpZihlKXtpZigib2JqZWN0Ij09dHlwZW9mIGUpe3ZhciB0PXt9O3JldHVybiExIT09ZS5jc3MmJkIodCxScihlLm5hbWV8fCJ2IikpLEIodCxlKSx0fXJldHVybiJzdHJpbmciPT10eXBlb2YgZT9ScihlKTp2b2lkIDB9fXZhciBScj11KGZ1bmN0aW9uKGUpe3JldHVybntlbnRlckNsYXNzOmUrIi1lbnRlciIsZW50ZXJUb0NsYXNzOmUrIi1lbnRlci10byIsZW50ZXJBY3RpdmVDbGFzczplKyItZW50ZXItYWN0aXZlIixsZWF2ZUNsYXNzOmUrIi1sZWF2ZSIsbGVhdmVUb0NsYXNzOmUrIi1sZWF2ZS10byIsbGVhdmVBY3RpdmVDbGFzczplKyItbGVhdmUtYWN0aXZlIn19KTtxJiYhWSYmKHZvaWQgMD09PXdpbmRvdy5vbnRyYW5zaXRpb25lbmQmJndpbmRvdy5vbndlYmtpdHRyYW5zaXRpb25lbmQsdm9pZCAwPT09d2luZG93Lm9uYW5pbWF0aW9uZW5kJiZ3aW5kb3cub253ZWJraXRhbmltYXRpb25lbmQpO3EmJndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUmJndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpO2Z1bmN0aW9uIEZyKGUsbil7dmFyIHI9bi5lbG07ci5fbGVhdmVDYiYmKHIuX2xlYXZlQ2IuY2FuY2VsbGVkPSEwLHIuX2xlYXZlQ2IoKSk7dmFyIHQ9RHIobi5kYXRhLnRyYW5zaXRpb24pO2lmKHQmJiFyLl9lbnRlckNiKXtmb3IodmFyIGk9dC5lbnRlckNsYXNzLG89dC5lbnRlclRvQ2xhc3MsYT10LmVudGVyQWN0aXZlQ2xhc3Mscz10LmFwcGVhckNsYXNzLGM9dC5hcHBlYXJUb0NsYXNzLHU9dC5hcHBlYXJBY3RpdmVDbGFzcyxsPXQuYmVmb3JlRW50ZXIsZD10LmVudGVyLGY9dC5hZnRlckVudGVyLHA9dC5lbnRlckNhbmNlbGxlZCxoPXQuYmVmb3JlQXBwZWFyLHY9dC5hcHBlYXIsZz10LmFmdGVyQXBwZWFyLG09dC5hcHBlYXJDYW5jZWxsZWQseT10bixfPXRuLiR2bm9kZTtfJiZfLnBhcmVudDspeT0oXz1fLnBhcmVudCkuY29udGV4dDt2YXIgYj0heS5faXNNb3VudGVkfHwhbi5pc1Jvb3RJbnNlcnQ7aWYoIWJ8fHZ8fCIiPT09dil7dmFyIHc9Yj9zOmksaz1iP2M6byxTPWI/dTphLHg9YiYmaHx8bCxDPWImJiJmdW5jdGlvbiI9PXR5cGVvZiB2P3Y6ZCxUPWImJmd8fGYsTz1iJiZtfHxwLEU9QyYmMTwoQy5fbGVuZ3RofHxDLmxlbmd0aCksST1uLmNvbnRleHQuJG9wdGlvbnMuc3R5bGV8fHt9LEE9SVt3XSwkPUlbIkBUUkFOU0lUSU9OIl0mJklbIkBUUkFOU0lUSU9OIl1bU118fHt9LFA9ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbz17fSxhPXRbbl0scz10W3JdLGM9dFtpXTtpZihhKWZvcih2YXIgdSBpbiBhKW9bdV09ZS5zdHlsZVt1XTtpZihjKWZvcih2YXIgbCBpbiBjKTAhPT1sLmluZGV4T2YoInRyYW5zaXRpb24iKSYmKG9bbF09Y1tsXSk7cyYmQihvLHMpO3JldHVybiBvfShyLEksdyxrLFMpLE09MDxPYmplY3Qua2V5cyhQKS5sZW5ndGgsaj1yLl9lbnRlckNiPUQoZnVuY3Rpb24oKXtqLmNhbmNlbGxlZD9PJiZPKHIpOlQmJlQociksci5fZW50ZXJDYj1udWxsfSk7aWYoc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBlPXIucGFyZW50Tm9kZSx0PWUmJmUuX3BlbmRpbmcmJmUuX3BlbmRpbmdbbi5rZXldOyh0JiZ0LmNvbnRleHQ9PT1uLmNvbnRleHQmJnQudGFnPT09bi50YWcmJnQuZWxtLl9sZWF2ZUNiJiZ0LmVsbS5fbGVhdmVDYigpLEMmJkMocixqKSxNKT9uLmNvbnRleHQuJHJlcXVpcmVXZWV4TW9kdWxlKCJhbmltYXRpb24iKS50cmFuc2l0aW9uKHIucmVmLHtzdHlsZXM6UCxkdXJhdGlvbjokLmR1cmF0aW9ufHwwLGRlbGF5OiQuZGVsYXl8fDAsdGltaW5nRnVuY3Rpb246JC50aW1pbmdGdW5jdGlvbnx8ImxpbmVhciJ9LEU/TjpqKTpFfHxqKCl9LDE2KSx4JiZ4KHIpLEEpaWYoImZ1bmN0aW9uIj09dHlwZW9mIHIuc2V0U3R5bGVzKXIuc2V0U3R5bGVzKEEpO2Vsc2UgZm9yKHZhciBMIGluIEEpci5zZXRTdHlsZShMLEFbTF0pO018fEV8fGooKX19fXZhciB6cj1mdW5jdGlvbihlKXt2YXIgcix0LHk9e30sbj1lLm1vZHVsZXMsXz1lLm5vZGVPcHM7Zm9yKHI9MDtyPG5yLmxlbmd0aDsrK3IpZm9yKHlbbnJbcl1dPVtdLHQ9MDt0PG4ubGVuZ3RoOysrdClJKG5bdF1bbnJbcl1dKSYmeVtucltyXV0ucHVzaChuW3RdW25yW3JdXSk7ZnVuY3Rpb24gbyhlKXt2YXIgdD1fLnBhcmVudE5vZGUoZSk7SSh0KSYmXy5yZW1vdmVDaGlsZCh0LGUpfWZ1bmN0aW9uIGIoZSx0LG4scixpLG8sYSl7aWYoSShlLmVsbSkmJkkobykmJihlPW9bYV09cGUoZSkpLGUuaXNSb290SW5zZXJ0PSFpLCFmdW5jdGlvbihlLHQsbixyKXt2YXIgaT1lLmRhdGE7aWYoSShpKSl7dmFyIG89SShlLmNvbXBvbmVudEluc3RhbmNlKSYmaS5rZWVwQWxpdmU7aWYoSShpPWkuaG9vaykmJkkoaT1pLmluaXQpJiZpKGUsITEsbixyKSxJKGUuY29tcG9uZW50SW5zdGFuY2UpKXJldHVybiBwKGUsdCksZChuLGUuZWxtLHIpLEEobykmJmZ1bmN0aW9uKGUsdCxuLHIpe2Zvcih2YXIgaSxvPWU7by5jb21wb25lbnRJbnN0YW5jZTspaWYobz1vLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSxJKGk9by5kYXRhKSYmSShpPWkudHJhbnNpdGlvbikpe2ZvcihpPTA7aTx5LmFjdGl2YXRlLmxlbmd0aDsrK2kpeS5hY3RpdmF0ZVtpXSh0cixvKTt0LnB1c2gobyk7YnJlYWt9ZChuLGUuZWxtLHIpfShlLHQsbixyKSwhMH19KGUsdCxuLHIpKXt2YXIgcz1lLmRhdGEsYz1lLmNoaWxkcmVuLHU9ZS50YWc7aWYoSSh1KSl7ZS5lbG09ZS5ucz9fLmNyZWF0ZUVsZW1lbnROUyhlLm5zLHUpOl8uY3JlYXRlRWxlbWVudCh1LGUpLGYoZSk7dmFyIGw9SShzKSYmQShzLmFwcGVuZEFzVHJlZSk7bHx8KEkocykmJnYoZSx0KSxkKG4sZS5lbG0scikpLGgoZSxjLHQpLGwmJihJKHMpJiZ2KGUsdCksZChuLGUuZWxtLHIpKX1lbHNlIEEoZS5pc0NvbW1lbnQpP2UuZWxtPV8uY3JlYXRlQ29tbWVudChlLnRleHQpOmUuZWxtPV8uY3JlYXRlVGV4dE5vZGUoZS50ZXh0KSxkKG4sZS5lbG0scil9fWZ1bmN0aW9uIHAoZSx0KXtJKGUuZGF0YS5wZW5kaW5nSW5zZXJ0KSYmKHQucHVzaC5hcHBseSh0LGUuZGF0YS5wZW5kaW5nSW5zZXJ0KSxlLmRhdGEucGVuZGluZ0luc2VydD1udWxsKSxlLmVsbT1lLmNvbXBvbmVudEluc3RhbmNlLiRlbCx3KGUpPyh2KGUsdCksZihlKSk6KFFuKGUpLHQucHVzaChlKSl9ZnVuY3Rpb24gZChlLHQsbil7SShlKSYmKEkobik/Xy5wYXJlbnROb2RlKG4pPT09ZSYmXy5pbnNlcnRCZWZvcmUoZSx0LG4pOl8uYXBwZW5kQ2hpbGQoZSx0KSl9ZnVuY3Rpb24gaChlLHQsbil7aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IodmFyIHI9MDtyPHQubGVuZ3RoOysrciliKHRbcl0sbixlLmVsbSxudWxsLCEwLHQscik7ZWxzZSAkKGUudGV4dCkmJl8uYXBwZW5kQ2hpbGQoZS5lbG0sXy5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoZS50ZXh0KSkpfWZ1bmN0aW9uIHcoZSl7Zm9yKDtlLmNvbXBvbmVudEluc3RhbmNlOyllPWUuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlO3JldHVybiBJKGUudGFnKX1mdW5jdGlvbiB2KGUsdCl7Zm9yKHZhciBuPTA7bjx5LmNyZWF0ZS5sZW5ndGg7KytuKXkuY3JlYXRlW25dKHRyLGUpO0kocj1lLmRhdGEuaG9vaykmJihJKHIuY3JlYXRlKSYmci5jcmVhdGUodHIsZSksSShyLmluc2VydCkmJnQucHVzaChlKSl9ZnVuY3Rpb24gZihlKXt2YXIgdDtpZihJKHQ9ZS5mblNjb3BlSWQpKV8uc2V0U3R5bGVTY29wZShlLmVsbSx0KTtlbHNlIGZvcih2YXIgbj1lO247KUkodD1uLmNvbnRleHQpJiZJKHQ9dC4kb3B0aW9ucy5fc2NvcGVJZCkmJl8uc2V0U3R5bGVTY29wZShlLmVsbSx0KSxuPW4ucGFyZW50O0kodD10bikmJnQhPT1lLmNvbnRleHQmJnQhPT1lLmZuQ29udGV4dCYmSSh0PXQuJG9wdGlvbnMuX3Njb3BlSWQpJiZfLnNldFN0eWxlU2NvcGUoZS5lbG0sdCl9ZnVuY3Rpb24gbShlLHQsbixyLGksbyl7Zm9yKDtyPD1pOysrciliKG5bcl0sbyxlLHQsITEsbixyKX1mdW5jdGlvbiBrKGUpe3ZhciB0LG4scj1lLmRhdGE7aWYoSShyKSlmb3IoSSh0PXIuaG9vaykmJkkodD10LmRlc3Ryb3kpJiZ0KGUpLHQ9MDt0PHkuZGVzdHJveS5sZW5ndGg7Kyt0KXkuZGVzdHJveVt0XShlKTtpZihJKHQ9ZS5jaGlsZHJlbikpZm9yKG49MDtuPGUuY2hpbGRyZW4ubGVuZ3RoOysrbilrKGUuY2hpbGRyZW5bbl0pfWZ1bmN0aW9uIFMoZSx0LG4scil7Zm9yKDtuPD1yOysrbil7dmFyIGk9dFtuXTtJKGkpJiYoSShpLnRhZyk/KGEoaSksayhpKSk6byhpLmVsbSkpfX1mdW5jdGlvbiBhKGUsdCl7aWYoSSh0KXx8SShlLmRhdGEpKXt2YXIgbixyPXkucmVtb3ZlLmxlbmd0aCsxO2ZvcihJKHQpP3QubGlzdGVuZXJzKz1yOnQ9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKCl7MD09LS1uLmxpc3RlbmVycyYmbyhlKX1yZXR1cm4gbi5saXN0ZW5lcnM9dCxufShlLmVsbSxyKSxJKG49ZS5jb21wb25lbnRJbnN0YW5jZSkmJkkobj1uLl92bm9kZSkmJkkobi5kYXRhKSYmYShuLHQpLG49MDtuPHkucmVtb3ZlLmxlbmd0aDsrK24peS5yZW1vdmVbbl0oZSx0KTtJKG49ZS5kYXRhLmhvb2spJiZJKG49bi5yZW1vdmUpP24oZSx0KTp0KCl9ZWxzZSBvKGUuZWxtKX1mdW5jdGlvbiB4KGUsdCxuLHIpe2Zvcih2YXIgaT1uO2k8cjtpKyspe3ZhciBvPXRbaV07aWYoSShvKSYmcnIoZSxvKSlyZXR1cm4gaX19ZnVuY3Rpb24gQyhlLHQsbixyLGksbyl7aWYoZSE9PXQpe0kodC5lbG0pJiZJKHIpJiYodD1yW2ldPXBlKHQpKTt2YXIgYT10LmVsbT1lLmVsbTtpZihBKGUuaXNBc3luY1BsYWNlaG9sZGVyKSlJKHQuYXN5bmNGYWN0b3J5LnJlc29sdmVkKT9PKGUuZWxtLHQsbik6dC5pc0FzeW5jUGxhY2Vob2xkZXI9ITA7ZWxzZSBpZihBKHQuaXNTdGF0aWMpJiZBKGUuaXNTdGF0aWMpJiZ0LmtleT09PWUua2V5JiYoQSh0LmlzQ2xvbmVkKXx8QSh0LmlzT25jZSkpKXQuY29tcG9uZW50SW5zdGFuY2U9ZS5jb21wb25lbnRJbnN0YW5jZTtlbHNle3ZhciBzLGM9dC5kYXRhO0koYykmJkkocz1jLmhvb2spJiZJKHM9cy5wcmVwYXRjaCkmJnMoZSx0KTt2YXIgdT1lLmNoaWxkcmVuLGw9dC5jaGlsZHJlbjtpZihJKGMpJiZ3KHQpKXtmb3Iocz0wO3M8eS51cGRhdGUubGVuZ3RoOysrcyl5LnVwZGF0ZVtzXShlLHQpO0kocz1jLmhvb2spJiZJKHM9cy51cGRhdGUpJiZzKGUsdCl9RSh0LnRleHQpP0kodSkmJkkobCk/dSE9PWwmJmZ1bmN0aW9uKGUsdCxuLHIsaSl7Zm9yKHZhciBvLGEscyxjPTAsdT0wLGw9dC5sZW5ndGgtMSxkPXRbMF0sZj10W2xdLHA9bi5sZW5ndGgtMSxoPW5bMF0sdj1uW3BdLGc9IWk7Yzw9bCYmdTw9cDspRShkKT9kPXRbKytjXTpFKGYpP2Y9dFstLWxdOnJyKGQsaCk/KEMoZCxoLHIsbix1KSxkPXRbKytjXSxoPW5bKyt1XSk6cnIoZix2KT8oQyhmLHYscixuLHApLGY9dFstLWxdLHY9blstLXBdKTpycihkLHYpPyhDKGQsdixyLG4scCksZyYmXy5pbnNlcnRCZWZvcmUoZSxkLmVsbSxfLm5leHRTaWJsaW5nKGYuZWxtKSksZD10WysrY10sdj1uWy0tcF0pOihycihmLGgpPyhDKGYsaCxyLG4sdSksZyYmXy5pbnNlcnRCZWZvcmUoZSxmLmVsbSxkLmVsbSksZj10Wy0tbF0pOihFKG8pJiYobz1pcih0LGMsbCkpLEUoYT1JKGgua2V5KT9vW2gua2V5XTp4KGgsdCxjLGwpKT9iKGgscixlLGQuZWxtLCExLG4sdSk6cnIocz10W2FdLGgpPyhDKHMsaCxyLG4sdSksdFthXT12b2lkIDAsZyYmXy5pbnNlcnRCZWZvcmUoZSxzLmVsbSxkLmVsbSkpOmIoaCxyLGUsZC5lbG0sITEsbix1KSksaD1uWysrdV0pO2w8Yz9tKGUsRShuW3ArMV0pP251bGw6bltwKzFdLmVsbSxuLHUscCxyKTpwPHUmJlMoMCx0LGMsbCl9KGEsdSxsLG4sbyk6SShsKT8oSShlLnRleHQpJiZfLnNldFRleHRDb250ZW50KGEsIiIpLG0oYSxudWxsLGwsMCxsLmxlbmd0aC0xLG4pKTpJKHUpP1MoMCx1LDAsdS5sZW5ndGgtMSk6SShlLnRleHQpJiZfLnNldFRleHRDb250ZW50KGEsIiIpOmUudGV4dCE9PXQudGV4dCYmXy5zZXRUZXh0Q29udGVudChhLHQudGV4dCksSShjKSYmSShzPWMuaG9vaykmJkkocz1zLnBvc3RwYXRjaCkmJnMoZSx0KX19fWZ1bmN0aW9uIFQoZSx0LG4pe2lmKEEobikmJkkoZS5wYXJlbnQpKWUucGFyZW50LmRhdGEucGVuZGluZ0luc2VydD10O2Vsc2UgZm9yKHZhciByPTA7cjx0Lmxlbmd0aDsrK3IpdFtyXS5kYXRhLmhvb2suaW5zZXJ0KHRbcl0pfXZhciBnPXMoImF0dHJzLGNsYXNzLHN0YXRpY0NsYXNzLHN0YXRpY1N0eWxlLGtleSIpO2Z1bmN0aW9uIE8oZSx0LG4scil7dmFyIGksbz10LnRhZyxhPXQuZGF0YSxzPXQuY2hpbGRyZW47aWYocj1yfHxhJiZhLnByZSx0LmVsbT1lLEEodC5pc0NvbW1lbnQpJiZJKHQuYXN5bmNGYWN0b3J5KSlyZXR1cm4gdC5pc0FzeW5jUGxhY2Vob2xkZXI9ITA7aWYoSShhKSYmKEkoaT1hLmhvb2spJiZJKGk9aS5pbml0KSYmaSh0LCEwKSxJKGk9dC5jb21wb25lbnRJbnN0YW5jZSkpKXJldHVybiBwKHQsbiksITA7aWYoSShvKSl7aWYoSShzKSlpZihlLmhhc0NoaWxkTm9kZXMoKSlpZihJKGk9YSkmJkkoaT1pLmRvbVByb3BzKSYmSShpPWkuaW5uZXJIVE1MKSl7aWYoaSE9PWUuaW5uZXJIVE1MKXJldHVybiExfWVsc2V7Zm9yKHZhciBjPSEwLHU9ZS5maXJzdENoaWxkLGw9MDtsPHMubGVuZ3RoO2wrKyl7aWYoIXV8fCFPKHUsc1tsXSxuLHIpKXtjPSExO2JyZWFrfXU9dS5uZXh0U2libGluZ31pZighY3x8dSlyZXR1cm4hMX1lbHNlIGgodCxzLG4pO2lmKEkoYSkpe3ZhciBkPSExO2Zvcih2YXIgZiBpbiBhKWlmKCFnKGYpKXtkPSEwLHYodCxuKTticmVha30hZCYmYS5jbGFzcyYmSGUoYS5jbGFzcyl9fWVsc2UgZS5kYXRhIT09dC50ZXh0JiYoZS5kYXRhPXQudGV4dCk7cmV0dXJuITB9cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIsaSxvKXtpZighRSh0KSl7dmFyIGEscz0hMSxjPVtdO2lmKEUoZSkpcz0hMCxiKHQsYyxpLG8pO2Vsc2V7dmFyIHU9SShlLm5vZGVUeXBlKTtpZighdSYmcnIoZSx0KSlDKGUsdCxjLG51bGwsbnVsbCxyKTtlbHNle2lmKHUpe2lmKDE9PT1lLm5vZGVUeXBlJiZlLmhhc0F0dHJpYnV0ZShNKSYmKGUucmVtb3ZlQXR0cmlidXRlKE0pLG49ITApLEEobikmJk8oZSx0LGMpKXJldHVybiBUKHQsYywhMCksZTthPWUsZT1uZXcgdWUoXy50YWdOYW1lKGEpLnRvTG93ZXJDYXNlKCkse30sW10sdm9pZCAwLGEpfXZhciBsPWUuZWxtLGQ9Xy5wYXJlbnROb2RlKGwpO2lmKGIodCxjLGwuX2xlYXZlQ2I/bnVsbDpkLF8ubmV4dFNpYmxpbmcobCkpLEkodC5wYXJlbnQpKWZvcih2YXIgZj10LnBhcmVudCxwPXcodCk7Zjspe2Zvcih2YXIgaD0wO2g8eS5kZXN0cm95Lmxlbmd0aDsrK2gpeS5kZXN0cm95W2hdKGYpO2lmKGYuZWxtPXQuZWxtLHApe2Zvcih2YXIgdj0wO3Y8eS5jcmVhdGUubGVuZ3RoOysrdil5LmNyZWF0ZVt2XSh0cixmKTt2YXIgZz1mLmRhdGEuaG9vay5pbnNlcnQ7aWYoZy5tZXJnZWQpZm9yKHZhciBtPTE7bTxnLmZucy5sZW5ndGg7bSsrKWcuZm5zW21dKCl9ZWxzZSBRbihmKTtmPWYucGFyZW50fUkoZCk/UygwLFtlXSwwLDApOkkoZS50YWcpJiZrKGUpfX1yZXR1cm4gVCh0LGMscyksdC5lbG19SShlKSYmayhlKX19KHtub2RlT3BzOktuLG1vZHVsZXM6W21yLEFyLGpyLE5yLHtjcmVhdGU6RnIsYWN0aXZhdGU6RnIscmVtb3ZlOmZ1bmN0aW9uKG4sZSl7dmFyIHI9bi5lbG07ci5fZW50ZXJDYiYmKHIuX2VudGVyQ2IuY2FuY2VsbGVkPSEwLHIuX2VudGVyQ2IoKSk7dmFyIHQ9RHIobi5kYXRhLnRyYW5zaXRpb24pO2lmKCF0KXJldHVybiBlKCk7aWYoci5fbGVhdmVDYilyZXR1cm47dmFyIGk9dC5sZWF2ZUNsYXNzLG89dC5sZWF2ZVRvQ2xhc3MsYT10LmxlYXZlQWN0aXZlQ2xhc3Mscz10LmJlZm9yZUxlYXZlLGM9dC5sZWF2ZSx1PXQuYWZ0ZXJMZWF2ZSxsPXQubGVhdmVDYW5jZWxsZWQsZD10LmRlbGF5TGVhdmUsZj1jJiYxPChjLl9sZW5ndGh8fGMubGVuZ3RoKSxwPW4uY29udGV4dC4kb3B0aW9ucy5zdHlsZXx8e30saD1wW2ldLHY9cFtvXXx8cFthXSxnPXBbIkBUUkFOU0lUSU9OIl0mJnBbIkBUUkFOU0lUSU9OIl1bYV18fHt9LG09ci5fbGVhdmVDYj1EKGZ1bmN0aW9uKCl7ci5wYXJlbnROb2RlJiZyLnBhcmVudE5vZGUuX3BlbmRpbmcmJihyLnBhcmVudE5vZGUuX3BlbmRpbmdbbi5rZXldPW51bGwpLG0uY2FuY2VsbGVkP2wmJmwocik6KGUoKSx1JiZ1KHIpKSxyLl9sZWF2ZUNiPW51bGx9KTtkP2QoeSk6eSgpO2Z1bmN0aW9uIHkoKXt2YXIgZT1uLmNvbnRleHQuJHJlcXVpcmVXZWV4TW9kdWxlKCJhbmltYXRpb24iKTtmdW5jdGlvbiB0KCl7ZS50cmFuc2l0aW9uKHIucmVmLHtzdHlsZXM6dixkdXJhdGlvbjpnLmR1cmF0aW9ufHwwLGRlbGF5OmcuZGVsYXl8fDAsdGltaW5nRnVuY3Rpb246Zy50aW1pbmdGdW5jdGlvbnx8ImxpbmVhciJ9LGY/TjptKX1tLmNhbmNlbGxlZHx8KG4uZGF0YS5zaG93fHwoKHIucGFyZW50Tm9kZS5fcGVuZGluZ3x8KHIucGFyZW50Tm9kZS5fcGVuZGluZz17fSkpW24ua2V5XT1uKSxzJiZzKHIpLGg/ZS50cmFuc2l0aW9uKHIucmVmLHtzdHlsZXM6aH0sdCk6dCgpLGMmJmMocixtKSx2fHxmfHxtKCkpfX19XS5jb25jYXQobHIpLExPTkdfTElTVF9USFJFU0hPTEQ6MTB9KSxWcj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2ZSk7ZnVuY3Rpb24gVXIoZSxyKXt2YXIgaT1lLiRlbDtyZXR1cm4gaSYmImZ1bmN0aW9uIj09dHlwZW9mIGlbcl0/ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoO24tLTspdFtuXT1lW25dO3JldHVybiBpW3JdLmFwcGx5KGksdCl9OihpZSgiQ2FuJ3QgZmluZCBjb21wb25lbnQgbWV0aG9kIFwiIityKyciIG9uICcraS50eXBlKSxOKX1mdW5jdGlvbiBxcihlLG4pe0FycmF5LmlzQXJyYXkobikmJighZnVuY3Rpb24oZixuKXtmb3IodmFyIGU9ZnVuY3Rpb24oZSx0KXt2YXIgZD1WcltlXTtGKG4sZCxmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMsdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGg7bi0tOyl0W25dPWVbbl07dmFyIHI9dGhpcy5sZW5ndGgsaT12ZVtkXTsiZnVuY3Rpb24iPT10eXBlb2YgaSYmaS5hcHBseSh0aGlzLHQpO3ZhciBvPVVyKGYsInJlbW92ZURhdGEiKSxhPVVyKGYsImluc2VydFJhbmdlIikscz1VcihmLCJzZXRMaXN0RGF0YSIpO3N3aXRjaChkKXtjYXNlInB1c2giOmEocix0KTticmVhaztjYXNlInBvcCI6byhyLTEsMSk7YnJlYWs7Y2FzZSJzaGlmdCI6bygwLDEpO2JyZWFrO2Nhc2UidW5zaGlmdCI6YSgwLHQpO2JyZWFrO2Nhc2Uic3BsaWNlIjp2YXIgYz10WzBdLHU9dFsxXSxsPXQuc2xpY2UoMik7MDx1JiZvKGMsdSksMDxsLmxlbmd0aCYmYShjLGwpO2JyZWFrO2Nhc2Uic29ydCI6Y2FzZSJyZXZlcnNlIjpzKHRoaXMuc2xpY2UoKSl9fSl9LHQ9MCxyPVZyLmxlbmd0aDt0PHI7dCsrKWUodCl9KGUsbiksbi5mb3JFYWNoKGZ1bmN0aW9uKHQpe2QodCkmJiFmKHQsIltbV2F0Y2hlZF1dIikmJihGKHQsIltbV2F0Y2hlZF1dIiwhMCksZS4kd2F0Y2goZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdCl0W2VdfSxmdW5jdGlvbigpe1VyKGUsInVwZGF0ZURhdGEiKShuLmluZGV4T2YodCksdCl9LHtkZWVwOiEwfSkpfSkpfXZhciBXcj17bmFtZToicmVjeWNsZS1saXN0IixtZXRob2RzOntjbG9zZXN0OmZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9YXJndW1lbnRzLG49W10scj1hcmd1bWVudHMubGVuZ3RoO3ItLTspbltyXT10W3JdO3JldHVybihlPXRoaXMuJGVsKS5jbG9zZXN0LmFwcGx5KGUsbil9LHF1ZXJ5RWxlbWVudDpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PWFyZ3VtZW50cyxuPVtdLHI9YXJndW1lbnRzLmxlbmd0aDtyLS07KW5bcl09dFtyXTtyZXR1cm4oZT10aGlzLiRlbCkucXVlcnlFbGVtZW50LmFwcGx5KGUsbil9LHF1ZXJ5RWxlbWVudEFsbDpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PWFyZ3VtZW50cyxuPVtdLHI9YXJndW1lbnRzLmxlbmd0aDtyLS07KW5bcl09dFtyXTtyZXR1cm4oZT10aGlzLiRlbCkucXVlcnlFbGVtZW50QWxsLmFwcGx5KGUsbil9LHNjcm9sbFRvRWxlbWVudDpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PWFyZ3VtZW50cyxuPVtdLHI9YXJndW1lbnRzLmxlbmd0aDtyLS07KW5bcl09dFtyXTtyZXR1cm4oZT10aGlzLiRlbCkuc2Nyb2xsVG9FbGVtZW50LmFwcGx5KGUsbil9LHJlc2V0TG9hZG1vcmU6ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD1hcmd1bWVudHMsbj1bXSxyPWFyZ3VtZW50cy5sZW5ndGg7ci0tOyluW3JdPXRbcl07cmV0dXJuKGU9dGhpcy4kZWwpLnJlc2V0TG9hZG1vcmUuYXBwbHkoZSxuKX19LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKHRoaXMuX3Zub2RlJiZ0aGlzLiRvcHRpb25zWyJbW1VzZUNhY2hlXV0iXSlyZXR1cm4gRih0aGlzLiRvcHRpb25zLCJbW1VzZUNhY2hlXV0iLCExKSx0aGlzLl92bm9kZTt2YXIgbj10aGlzLiRvcHRpb25zLnBhcmVudCxyPXRoaXMuJGF0dHJzLmJpbmRpbmdFeHByZXNzaW9uO3JldHVybiBuJiZyJiYobi4kd2F0Y2gocixmdW5jdGlvbigpe3JldHVybiBGKHQuJG9wdGlvbnMsIltbVXNlQ2FjaGVdXSIsITApfSx7ZGVlcDohMCxpbW1lZGlhdGU6ITB9KSxxcih0aGlzLHRoaXMuJGF0dHJzLmxpc3REYXRhKSxuLiR3YXRjaChyLGZ1bmN0aW9uKGUpe3FyKHQsZSl9KSksdGhpcy5fZXZlbnRzLl9hdHRhY2hfc2xvdD1mdW5jdGlvbihlKXtJdCh0LiRwYXJlbnR8fHQsZS5wb3NpdGlvbixlLnJlZnMpfSx0aGlzLl9ldmVudHMuX2RldGFjaF9zbG90PWZ1bmN0aW9uKGUpe0l0KHQuJHBhcmVudHx8dCxlLnBvc2l0aW9uLGUucmVmcywhMCl9LGUoIndlZXg6cmVjeWNsZS1saXN0Iix7b246dGhpcy5fZXZlbnRzfSx0aGlzLiRzbG90cy5kZWZhdWx0KX0scmVuZGVyRXJyb3I6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSgidGV4dCIse3N0eWxlOntmb250U2l6ZToiMzZweCIsY29sb3I6IiNGRjAwMDAifSx2YWx1ZTp0LnRvU3RyaW5nKCl9KX19LEhyPXtuYW1lOlN0cmluZyxhcHBlYXI6Qm9vbGVhbixjc3M6Qm9vbGVhbixtb2RlOlN0cmluZyx0eXBlOlN0cmluZyxlbnRlckNsYXNzOlN0cmluZyxsZWF2ZUNsYXNzOlN0cmluZyxlbnRlclRvQ2xhc3M6U3RyaW5nLGxlYXZlVG9DbGFzczpTdHJpbmcsZW50ZXJBY3RpdmVDbGFzczpTdHJpbmcsbGVhdmVBY3RpdmVDbGFzczpTdHJpbmcsYXBwZWFyQ2xhc3M6U3RyaW5nLGFwcGVhckFjdGl2ZUNsYXNzOlN0cmluZyxhcHBlYXJUb0NsYXNzOlN0cmluZyxkdXJhdGlvbjpbTnVtYmVyLFN0cmluZyxPYmplY3RdfTtmdW5jdGlvbiBHcihlKXt2YXIgdD1lJiZlLmNvbXBvbmVudE9wdGlvbnM7cmV0dXJuIHQmJnQuQ3Rvci5vcHRpb25zLmFic3RyYWN0P0dyKFl0KHQuY2hpbGRyZW4pKTplfWZ1bmN0aW9uIFhyKGUpe3ZhciB0PXt9LG49ZS4kb3B0aW9ucztmb3IodmFyIHIgaW4gbi5wcm9wc0RhdGEpdFtyXT1lW3JdO3ZhciBpPW4uX3BhcmVudExpc3RlbmVycztmb3IodmFyIG8gaW4gaSl0W2gobyldPWlbb107cmV0dXJuIHR9ZnVuY3Rpb24gWXIoZSx0KXtpZigvXGQta2VlcC1hbGl2ZSQvLnRlc3QodC50YWcpKXJldHVybiBlKCJrZWVwLWFsaXZlIix7cHJvcHM6dC5jb21wb25lbnRPcHRpb25zLnByb3BzRGF0YX0pfXZhciBKcj1mdW5jdGlvbihlKXtyZXR1cm4gZS50YWd8fFh0KGUpfSxLcj1mdW5jdGlvbihlKXtyZXR1cm4ic2hvdyI9PT1lLm5hbWV9LFpyPXtuYW1lOiJ0cmFuc2l0aW9uIixwcm9wczpIcixhYnN0cmFjdDohMCxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXRoaXMuJHNsb3RzLmRlZmF1bHQ7aWYobiYmKG49bi5maWx0ZXIoSnIpKS5sZW5ndGgpe3ZhciByPXRoaXMubW9kZSxpPW5bMF07aWYoZnVuY3Rpb24oZSl7Zm9yKDtlPWUucGFyZW50OylpZihlLmRhdGEudHJhbnNpdGlvbilyZXR1cm4hMH0odGhpcy4kdm5vZGUpKXJldHVybiBpO3ZhciBvPUdyKGkpO2lmKCFvKXJldHVybiBpO2lmKHRoaXMuX2xlYXZpbmcpcmV0dXJuIFlyKGUsaSk7dmFyIGE9Il9fdHJhbnNpdGlvbi0iK3RoaXMuX3VpZCsiLSI7by5rZXk9bnVsbD09by5rZXk/by5pc0NvbW1lbnQ/YSsiY29tbWVudCI6YStvLnRhZzokKG8ua2V5KT8wPT09U3RyaW5nKG8ua2V5KS5pbmRleE9mKGEpP28ua2V5OmErby5rZXk6by5rZXk7dmFyIHMsYyx1PShvLmRhdGF8fChvLmRhdGE9e30pKS50cmFuc2l0aW9uPVhyKHRoaXMpLGw9dGhpcy5fdm5vZGUsZD1HcihsKTtpZihvLmRhdGEuZGlyZWN0aXZlcyYmby5kYXRhLmRpcmVjdGl2ZXMuc29tZShLcikmJihvLmRhdGEuc2hvdz0hMCksZCYmZC5kYXRhJiYocz1vLChjPWQpLmtleSE9PXMua2V5fHxjLnRhZyE9PXMudGFnKSYmIVh0KGQpJiYoIWQuY29tcG9uZW50SW5zdGFuY2V8fCFkLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZS5pc0NvbW1lbnQpKXt2YXIgZj1kLmRhdGEudHJhbnNpdGlvbj1CKHt9LHUpO2lmKCJvdXQtaW4iPT09cilyZXR1cm4gdGhpcy5fbGVhdmluZz0hMCxKZShmLCJhZnRlckxlYXZlIixmdW5jdGlvbigpe3QuX2xlYXZpbmc9ITEsdC4kZm9yY2VVcGRhdGUoKX0pLFlyKGUsaSk7aWYoImluLW91dCI9PT1yKXtpZihYdChvKSlyZXR1cm4gbDt2YXIgcCxoPWZ1bmN0aW9uKCl7cCgpfTtKZSh1LCJhZnRlckVudGVyIixoKSxKZSh1LCJlbnRlckNhbmNlbGxlZCIsaCksSmUoZiwiZGVsYXlMZWF2ZSIsZnVuY3Rpb24oZSl7cD1lfSl9fXJldHVybiBpfX19LFFyPUIoe3RhZzpTdHJpbmcsbW92ZUNsYXNzOlN0cmluZ30sSHIpO2RlbGV0ZSBRci5tb2RlO3ZhciBlaT17UmVjeWNsZUxpc3Q6V3IsVHJhbnNpdGlvbjpacixUcmFuc2l0aW9uR3JvdXA6e3Byb3BzOlFyLGNyZWF0ZWQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRyZXF1aXJlV2VleE1vZHVsZSgiZG9tIik7dGhpcy5nZXRQb3NpdGlvbj1mdW5jdGlvbihyKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24odCxuKXtlLmdldENvbXBvbmVudFJlY3Qoci5yZWYsZnVuY3Rpb24oZSl7ZS5yZXN1bHQ/dChlLnNpemUpOm4obmV3IEVycm9yKCJmYWlsZWQgdG8gZ2V0IHJlY3QgZm9yIGVsZW1lbnQ6ICIrci50YWcpKX0pfSl9O3ZhciByPXRoaXMuJHJlcXVpcmVXZWV4TW9kdWxlKCJhbmltYXRpb24iKTt0aGlzLmFuaW1hdGU9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSl7ci50cmFuc2l0aW9uKHQucmVmLG4sZSl9KX19LHJlbmRlcjpmdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy50YWd8fHRoaXMuJHZub2RlLmRhdGEudGFnfHwic3BhbiIsbj1PYmplY3QuY3JlYXRlKG51bGwpLHI9dGhpcy5wcmV2Q2hpbGRyZW49dGhpcy5jaGlsZHJlbixpPXRoaXMuJHNsb3RzLmRlZmF1bHR8fFtdLG89dGhpcy5jaGlsZHJlbj1bXSxhPVhyKHRoaXMpLHM9MDtzPGkubGVuZ3RoO3MrKyl7dmFyIGM9aVtzXTtjLnRhZyYmbnVsbCE9Yy5rZXkmJjAhPT1TdHJpbmcoYy5rZXkpLmluZGV4T2YoIl9fdmxpc3QiKSYmKG8ucHVzaChjKSwoKG5bYy5rZXldPWMpLmRhdGF8fChjLmRhdGE9e30pKS50cmFuc2l0aW9uPWEpfWlmKHIpe3ZhciB1PVtdLGw9W107ci5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuZGF0YS50cmFuc2l0aW9uPWEsbltlLmtleV0/dS5wdXNoKGUpOmwucHVzaChlKX0pLHRoaXMua2VwdD1lKHQsbnVsbCx1KSx0aGlzLnJlbW92ZWQ9bH1yZXR1cm4gZSh0LG51bGwsbyl9LGJlZm9yZVVwZGF0ZTpmdW5jdGlvbigpe3RoaXMuX19wYXRjaF9fKHRoaXMuX3Zub2RlLHRoaXMua2VwdCwhMSwhMCksdGhpcy5fdm5vZGU9dGhpcy5rZXB0fSx1cGRhdGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcmV2Q2hpbGRyZW4sdD10aGlzLm1vdmVDbGFzc3x8KHRoaXMubmFtZXx8InYiKSsiLW1vdmUiO2UubGVuZ3RoJiZ0aGlzLmdldE1vdmVEYXRhKGVbMF0uY29udGV4dCx0KX0sbWV0aG9kczp7Z2V0TW92ZURhdGE6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLiRvcHRpb25zLnN0eWxlfHx7fTtyZXR1cm4gblsiQFRSQU5TSVRJT04iXSYmblsiQFRSQU5TSVRJT04iXVt0XX19fX0sdGk9cygidGVtcGxhdGUsc2NyaXB0LHN0eWxlLGVsZW1lbnQsY29udGVudCxzbG90LGxpbmssbWV0YSxzdmcsdmlldyxhLGRpdixpbWcsaW1hZ2UsdGV4dCx1LXRleHQsc3BhbixpbnB1dCx0ZXh0YXJlYSxzcGlubmVyLHNlbGVjdCxzbGlkZXIsc2xpZGVyLW5laWdoYm9yLGluZGljYXRvcixjYW52YXMsbGlzdCxjZWxsLGhlYWRlcixsb2FkaW5nLGxvYWRpbmctaW5kaWNhdG9yLHJlZnJlc2gsc2Nyb2xsYWJsZSxzY3JvbGxlcix2aWRlbyx3ZWIsZW1iZWQsdGFiYmFyLHRhYmhlYWRlcixkYXRlcGlja2VyLHRpbWVwaWNrZXIsbWFycXVlZSxjb3VudGRvd24iLCEwKSxuaT0ocygid2ViLHNwaW5uZXIsc3dpdGNoLHZpZGVvLHRleHRhcmVhLGNhbnZhcyxpbmRpY2F0b3IsbWFycXVlZSxjb3VudGRvd24iLCEwKSxzKCJyaWNodGV4dCx0cmFuc2l0aW9uLHRyYW5zaXRpb24tZ3JvdXAscmVjeWNsZS1saXN0IiwhMCkpO3MoImVtYmVkLGltZyxpbWFnZSxpbnB1dCxsaW5rLG1ldGEiLCEwKTtObi5jb25maWcubXVzdFVzZVByb3A9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sTm4uY29uZmlnLmlzUmVzZXJ2ZWRUYWc9dGksTm4uY29uZmlnLmlzUnVudGltZUNvbXBvbmVudD1uaSxObi5jb25maWcuaXNVbmtub3duRWxlbWVudD1mdW5jdGlvbigpe3JldHVybiExfSxObi5vcHRpb25zLmRpcmVjdGl2ZXM9e30sTm4ub3B0aW9ucy5jb21wb25lbnRzPWVpLE5uLnByb3RvdHlwZS5fX3BhdGNoX189enIsTm4ucHJvdG90eXBlLiRtb3VudD1mdW5jdGlvbihlLHQpe3JldHVybiBuPXRoaXMscj1lJiYobz10aGlzLiRkb2N1bWVudCwoYT1vLmNyZWF0ZUNvbW1lbnQoInJvb3QiKSkuaGFzQXR0cmlidXRlPWEucmVtb3ZlQXR0cmlidXRlPU4sby5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoYSksYSksaT10LG4uJGVsPXIsbi4kb3B0aW9ucy5yZW5kZXJ8fChuLiRvcHRpb25zLnJlbmRlcj1kZSksYW4obiwiYmVmb3JlTW91bnQiKSxuZXcgbW4obixmdW5jdGlvbigpe24uX3VwZGF0ZShuLl9yZW5kZXIoKSxpKX0sTix7YmVmb3JlOmZ1bmN0aW9uKCl7bi5faXNNb3VudGVkJiYhbi5faXNEZXN0cm95ZWQmJmFuKG4sImJlZm9yZVVwZGF0ZSIpfX0sITApLGk9ITEsbnVsbD09bi4kdm5vZGUmJihuLl9pc01vdW50ZWQ9ITAsYW4obiwibW91bnRlZCIpKSxuO3ZhciBuLHIsaSxvLGF9LE5uLnByb3RvdHlwZS5fX2NhbGxfaG9vaz1mdW5jdGlvbihlLHQpe3NlKCk7dmFyIG4scj10aGlzLiRvcHRpb25zW2VdLGk9ZSsiIGhvb2siO2lmKHIpZm9yKHZhciBvPTAsYT1yLmxlbmd0aDtvPGE7bysrKW49TmUocltvXSx0aGlzLHQ/W3RdOm51bGwsdGhpcyxpKTtyZXR1cm4gdGhpcy5faGFzSG9va0V2ZW50JiZ0aGlzLiRlbWl0KCJob29rOiIrZSx0KSxjZSgpLG59LGUuVnVlPU5ufX0pO3Vud3JhcEV4cG9ydHMoZmFjdG9yeSk7dmFyIHdlZXhWdWVGcmFtZXdvcms9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24oZSx0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGQ9e307dC5jcmVhdGVJbnN0YW5jZUNvbnRleHQ9ZnVuY3Rpb24oZSx0LG4pe3ZvaWQgMD09PW4mJihuPXt9KTt2YXIgcixpLG8sYSxzPXQud2VleCxjPShkW2VdPXtpbnN0YW5jZUlkOmUsY29uZmlnOnMuY29uZmlnLGRvY3VtZW50OnMuZG9jdW1lbnQsZGF0YTpufSkuVnVlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj17fTtmYWN0b3J5KHIsdC5kb2N1bWVudCxuKTt2YXIgaT1yLlZ1ZSxvPWRbZV0sYT0vXndlZXg6L2kscz1pLmNvbmZpZy5pc1Jlc2VydmVkVGFnfHxmdW5jdGlvbigpe3JldHVybiExfSxjPWkuY29uZmlnLmlzUnVudGltZUNvbXBvbmVudHx8ZnVuY3Rpb24oKXtyZXR1cm4hMX07cmV0dXJuIGkuY29uZmlnLmlzUmVzZXJ2ZWRUYWc9ZnVuY3Rpb24oZSl7cmV0dXJuIWMoZSkmJnQuc3VwcG9ydHMoIkBjb21wb25lbnQvIitlKXx8cyhlKXx8YS50ZXN0KGUpfSxpLmNvbmZpZy5wYXJzZVBsYXRmb3JtVGFnTmFtZT1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGEsIiIpfSxpLnByb3RvdHlwZS4kaW5zdGFuY2VJZD1lLGkucHJvdG90eXBlLiRkb2N1bWVudD1vLmRvY3VtZW50LGkucHJvdG90eXBlLiRyZXF1aXJlV2VleE1vZHVsZT10LnJlcXVpcmVNb2R1bGUsaS5taXhpbih7YmVmb3JlQ3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kb3B0aW9ucztpZihlLmVsKXt2YXIgdD1lLmRhdGEsbj0oImZ1bmN0aW9uIj09dHlwZW9mIHQ/dCgpOnQpfHx7fTtlLmRhdGE9T2JqZWN0LmFzc2lnbihuLG8uZGF0YSksby5hcHA9dGhpc319LG1vdW50ZWQ6ZnVuY3Rpb24oKXtpZih0aGlzLiRvcHRpb25zLmVsJiZ0LmRvY3VtZW50JiZvLmFwcD09PXRoaXMpdHJ5e3QuZG9jdW1lbnQudGFza0NlbnRlci5zZW5kKCJkb20iLHthY3Rpb246ImNyZWF0ZUZpbmlzaCJ9LFtdKX1jYXRjaChlKXt9fX0pLGkucHJvdG90eXBlLiRnZXRDb25maWc9ZnVuY3Rpb24oKXtpZihvLmFwcCBpbnN0YW5jZW9mIGkpcmV0dXJuIG8uY29uZmlnfSxpfShlLHMsdC5TaGFyZWRPYmplY3QpLHU9KHI9ZSxpPXMucmVxdWlyZU1vZHVsZSxvPWRbcl0sYT1pKCJ0aW1lciIpLHtzZXRUaW1lb3V0OmZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cyx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09ZVtuXTtpZihhLnNldFRpbWVvdXQpe3ZhciByPW8uZG9jdW1lbnQudGFza0NlbnRlci5jYWxsYmFja01hbmFnZXIubGFzdENhbGxiYWNrSWQ7cmV0dXJuIGEuc2V0VGltZW91dChmdW5jdGlvbigpe3RbMF0uYXBwbHkodCx0LnNsaWNlKDIpKX0sdFsxXSksKHIrMSkudG9TdHJpbmcoKX19LHNldEludGVydmFsOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cyx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09ZVtuXTtpZihhLnNldEludGVydmFsKXt2YXIgcj1vLmRvY3VtZW50LnRhc2tDZW50ZXIuY2FsbGJhY2tNYW5hZ2VyLmxhc3RDYWxsYmFja0lkO3JldHVybiBhLnNldEludGVydmFsKGZ1bmN0aW9uKCl7dFswXS5hcHBseSh0LHQuc2xpY2UoMikpfSx0WzFdKSwocisxKS50b1N0cmluZygpfX0sY2xlYXJUaW1lb3V0OmZ1bmN0aW9uKGUpe2EuY2xlYXJUaW1lb3V0JiZhLmNsZWFyVGltZW91dChlKX0sY2xlYXJJbnRlcnZhbDpmdW5jdGlvbihlKXthLmNsZWFySW50ZXJ2YWwmJmEuY2xlYXJJbnRlcnZhbChlKX19KSxsPU9iamVjdC5hc3NpZ24oe1Z1ZTpjfSx1KTtyZXR1cm4gT2JqZWN0LmZyZWV6ZShsKSxsfSx0LmRlc3Ryb3lJbnN0YW5jZT1mdW5jdGlvbihlKXt2YXIgdD1kW2VdO2lmKHQmJnQuYXBwIGluc3RhbmNlb2YgdC5WdWUpe3RyeXt0LmFwcC4kZGVzdHJveSgpLHQuZG9jdW1lbnQuZGVzdHJveSgpfWNhdGNoKGUpe31kZWxldGUgdC5kb2N1bWVudCxkZWxldGUgdC5hcHB9ZGVsZXRlIGRbZV19LHQucmVmcmVzaEluc3RhbmNlPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZFtlXTtpZighKG4mJm4uYXBwIGluc3RhbmNlb2Ygbi5WdWUpKXJldHVybiBuZXcgRXJyb3IoInJlZnJlc2hJbnN0YW5jZTogaW5zdGFuY2UgIitlKyIgbm90IGZvdW5kISIpO2lmKG4uVnVlJiZuLlZ1ZS5zZXQpZm9yKHZhciByIGluIHQpbi5WdWUuc2V0KG4uYXBwLHIsdFtyXSk7bi5kb2N1bWVudC50YXNrQ2VudGVyLnNlbmQoImRvbSIse2FjdGlvbjoicmVmcmVzaEZpbmlzaCJ9LFtdKX19KSxpbmRleD11bndyYXBFeHBvcnRzKHdlZXhWdWVGcmFtZXdvcmspLHdlZXhWdWVGcmFtZXdvcmtfMT13ZWV4VnVlRnJhbWV3b3JrLmNyZWF0ZUluc3RhbmNlQ29udGV4dCx3ZWV4VnVlRnJhbWV3b3JrXzI9d2VleFZ1ZUZyYW1ld29yay5kZXN0cm95SW5zdGFuY2Usd2VleFZ1ZUZyYW1ld29ya18zPXdlZXhWdWVGcmFtZXdvcmsucmVmcmVzaEluc3RhbmNlLFZ1ZT1PYmplY3QuZnJlZXplKHtkZWZhdWx0OmluZGV4LF9fbW9kdWxlRXhwb3J0czp3ZWV4VnVlRnJhbWV3b3JrLGNyZWF0ZUluc3RhbmNlQ29udGV4dDp3ZWV4VnVlRnJhbWV3b3JrXzEsZGVzdHJveUluc3RhbmNlOndlZXhWdWVGcmFtZXdvcmtfMixyZWZyZXNoSW5zdGFuY2U6d2VleFZ1ZUZyYW1ld29ya18zfSk7c2V0TmF0aXZlQ29uc29sZSgpLHNldHVwKHtWdWU6VnVlfSl9KTsK
|