scanCode安卓原生插件
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

2 lines
719 KiB

//{"version":"3.8.7","encode":"base64"}
dmFyIF9fVW5pU2VydmljZVN0YXJ0VGltZV9fPURhdGUubm93KCksZ2xvYmFsPXRoaXMscHJvY2Vzcz17ZW52Ont9fSxzZXRUaW1lb3V0PWdsb2JhbC5zZXRUaW1lb3V0OyFmdW5jdGlvbihlLHQpeyJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGU/dCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKHQpOnQoKX0oMCxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgc3VidmVyc2lvbj17ZnJhbWV3b3JrOiIwLjI5LjYiLHRyYW5zZm9ybWVyOiI+PTAuMS41IDwwLjUifTtmdW5jdGlvbiBnZXRIb29rS2V5KGUsdCxuKXtyZXR1cm4gdCsiQCIrbisiIyIrZX12YXIgQ2FsbGJhY2tNYW5hZ2VyPWZ1bmN0aW9uKGUpe3RoaXMuaW5zdGFuY2VJZD1TdHJpbmcoZSksdGhpcy5sYXN0Q2FsbGJhY2tJZD0wLHRoaXMuY2FsbGJhY2tzPXt9LHRoaXMuaG9va3M9e319O0NhbGxiYWNrTWFuYWdlci5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmxhc3RDYWxsYmFja0lkKyssdGhpcy5jYWxsYmFja3NbdGhpcy5sYXN0Q2FsbGJhY2tJZF09ZSx0aGlzLmxhc3RDYWxsYmFja0lkfSxDYWxsYmFja01hbmFnZXIucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmNhbGxiYWNrc1tlXTtyZXR1cm4gZGVsZXRlIHRoaXMuY2FsbGJhY2tzW2VdLHR9LENhbGxiYWNrTWFuYWdlci5wcm90b3R5cGUucmVnaXN0ZXJIb29rPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPWdldEhvb2tLZXkoZSx0LG4pO3RoaXMuaG9va3NbaV0mJmNvbnNvbGUud2FybignW0pTIEZyYW1ld29ya10gT3ZlcnJpZGUgYW4gZXhpc3RpbmcgY29tcG9uZW50IGhvb2sgIicraSsnIi4nKSx0aGlzLmhvb2tzW2ldPXJ9LENhbGxiYWNrTWFuYWdlci5wcm90b3R5cGUudHJpZ2dlckhvb2s9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9Z2V0SG9va0tleShlLHQsbiksbz10aGlzLmhvb2tzW2ldO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBvKXJldHVybiBjb25zb2xlLmVycm9yKCJbSlMgRnJhbWV3b3JrXSBJbnZhbGlkIGhvb2sgZnVuY3Rpb24gdHlwZSAoIit0eXBlb2YgbysnKSBvbiAiJytpKyciLicpLG51bGw7dmFyIGE9bnVsbDt0cnl7YT1vLmFwcGx5KG51bGwscnx8W10pfWNhdGNoKGUpe3Rocm93IGNvbnNvbGUuZXJyb3IoJ1tKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBleGVjdXRlIHRoZSBob29rIGZ1bmN0aW9uIG9uICInK2krJyIuJyksZX1yZXR1cm4gYX0sQ2FsbGJhY2tNYW5hZ2VyLnByb3RvdHlwZS5jb25zdW1lPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLmNhbGxiYWNrc1tlXTtpZih2b2lkIDAhPT1uJiYhMSE9PW58fGRlbGV0ZSB0aGlzLmNhbGxiYWNrc1tlXSwiZnVuY3Rpb24iPT10eXBlb2Ygcil0cnl7cmV0dXJuIHIuY2FsbChudWxsLHQsbil9Y2F0Y2goZSl7dGhyb3cgY29uc29sZS5lcnJvcigiW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGV4ZWN1dGUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uOlxuICIrZS50b1N0cmluZygpKSxlfXJldHVybiBuZXcgRXJyb3IoJ2ludmFsaWQgY2FsbGJhY2sgaWQgIicrZSsnIicpfSxDYWxsYmFja01hbmFnZXIucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dGhpcy5jYWxsYmFja3M9e30sdGhpcy5ob29rcz17fX07dmFyIG5leHROb2RlUmVmPTE7ZnVuY3Rpb24gdW5pcXVlSWQoKXtyZXR1cm4obmV4dE5vZGVSZWYrKykudG9TdHJpbmcoKX1mdW5jdGlvbiB0eXBvZihlKXt2YXIgdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk7cmV0dXJuIHQuc3Vic3RyaW5nKDgsdC5sZW5ndGgtMSl9ZnVuY3Rpb24gaXNQbGFpbk9iamVjdChlKXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX1mdW5jdGlvbiBoYXNPd24oZSx0KXtyZXR1cm4gaXNQbGFpbk9iamVjdChlKSYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCl9ZnVuY3Rpb24gYnVmZmVyVG9CYXNlNjQoZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGJ0b2EpcmV0dXJuIiI7dmFyIHQ9QXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKG5ldyBVaW50OEFycmF5KGUpLGZ1bmN0aW9uKGUpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGUpfSkuam9pbigiIik7cmV0dXJuIGJ0b2EodCl9ZnVuY3Rpb24gaXNFbXB0eShlKXtpZighZXx8Im9iamVjdCIhPXR5cGVvZiBlKXJldHVybiEwO2Zvcih2YXIgdCBpbiBlKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpKXJldHVybiExO3JldHVybiEwfXZhciBMRVZFTFM9WyJvZmYiLCJlcnJvciIsIndhcm4iLCJpbmZvIiwibG9nIiwiZGVidWciXSxsZXZlbE1hcD17fTtmdW5jdGlvbiBnZW5lcmF0ZUxldmVsTWFwKCl7TEVWRUxTLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49TEVWRUxTLmluZGV4T2YodCk7bGV2ZWxNYXBbdF09e30sTEVWRUxTLmZvckVhY2goZnVuY3Rpb24oZSl7TEVWRUxTLmluZGV4T2YoZSk8PW4mJihsZXZlbE1hcFt0XVtlXT0hMCl9KX0pfWZ1bmN0aW9uIGNoZWNrTGV2ZWwoZSl7dmFyIHQ9Z2xvYmFsLldYRW52aXJvbm1lbnQmJmdsb2JhbC5XWEVudmlyb25tZW50LmxvZ0xldmVsfHwibG9nIjtyZXR1cm4gbGV2ZWxNYXBbdF0mJmxldmVsTWFwW3RdW2VdfWZ1bmN0aW9uIGRlYnVnTG9nKGUpe2dsb2JhbC5uYXRpdmVMb2coInd4SW50ZXJhY3Rpb25BbmFseXplcjogW2pzZm1dIitlLCJfX0RFQlVHIil9dmFyIGRvY01hcD17fTtmdW5jdGlvbiBhZGREb2MoZSx0KXtlJiYoZG9jTWFwW2VdPXQpfWZ1bmN0aW9uIGdldERvYyhlKXtyZXR1cm4gZG9jTWFwW2VdfWZ1bmN0aW9uIHJlbW92ZURvYyhlKXtkZWxldGUgZG9jTWFwW2VdfWZ1bmN0aW9uIGdldFRhc2tDZW50ZXIoZSl7dmFyIHQ9ZG9jTWFwW2VdO3JldHVybiB0JiZ0LnRhc2tDZW50ZXI/dC50YXNrQ2VudGVyOm51bGx9ZnVuY3Rpb24gYXBwZW5kQm9keShlLHQsbil7dmFyIHI9ZS5kb2N1bWVudEVsZW1lbnQ7aWYoISgwPHIucHVyZUNoaWxkcmVuLmxlbmd0aHx8dC5wYXJlbnROb2RlKSl7dmFyIGk9ci5jaGlsZHJlbixvPWkuaW5kZXhPZihuKTtvPDA/aS5wdXNoKHQpOmkuc3BsaWNlKG8sMCx0KSwxPT09dC5ub2RlVHlwZT8oImJvZHkiPT09dC5yb2xlPyh0LmRvY0lkPWUuaWQsdC5vd25lckRvY3VtZW50PWUsdC5wYXJlbnROb2RlPXIsbGlua1BhcmVudCh0LHIpKToodC5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UucGFyZW50Tm9kZT10fSksc2V0Qm9keShlLHQpLHQuZG9jSWQ9ZS5pZCx0Lm93bmVyRG9jdW1lbnQ9ZSxsaW5rUGFyZW50KHQsciksZGVsZXRlIGUubm9kZU1hcFt0Lm5vZGVJZF0pLHIucHVyZUNoaWxkcmVuLnB1c2godCksc2VuZEJvZHkoZSx0KSk6KHQucGFyZW50Tm9kZT1yLGUubm9kZU1hcFt0LnJlZl09dCksdC5yZWFkeT0hMCx0LmNvbXB1dGVDbGFzc0xpc3QmJnQuY29tcHV0ZUNsYXNzTGlzdCgpfX1mdW5jdGlvbiBzZW5kQm9keShlLHQpe3ZhciBuPXQudG9KU09OKCk7ZSYmZS50YXNrQ2VudGVyJiYiZnVuY3Rpb24iPT10eXBlb2YgZS50YXNrQ2VudGVyLnNlbmQmJmUudGFza0NlbnRlci5zZW5kKCJkb20iLHthY3Rpb246ImNyZWF0ZUJvZHkifSxbbl0pfWZ1bmN0aW9uIHNldEJvZHkoZSx0KXt0LnJvbGU9ImJvZHkiLHQuZGVwdGg9MSxkZWxldGUgZS5ub2RlTWFwW3Qubm9kZUlkXSx0LnJlZj0iX3Jvb3QiLGUubm9kZU1hcC5fcm9vdD10LGUuYm9keT10fWZ1bmN0aW9uIGxpbmtQYXJlbnQodCxlKXsodC5wYXJlbnROb2RlPWUpLmRvY0lkJiYodC5kb2NJZD1lLmRvY0lkLHQub3duZXJEb2N1bWVudD1lLm93bmVyRG9jdW1lbnQsKHQub3duZXJEb2N1bWVudC5ub2RlTWFwW3Qubm9kZUlkXT10KS5kZXB0aD1lLmRlcHRoKzEpLHQuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlKXtsaW5rUGFyZW50KGUsdCl9KX1mdW5jdGlvbiBuZXh0RWxlbWVudChlKXtmb3IoO2U7KXtpZigxPT09ZS5ub2RlVHlwZSlyZXR1cm4gZTtlPWUubmV4dFNpYmxpbmd9fWZ1bmN0aW9uIHByZXZpb3VzRWxlbWVudChlKXtmb3IoO2U7KXtpZigxPT09ZS5ub2RlVHlwZSlyZXR1cm4gZTtlPWUucHJldmlvdXNTaWJsaW5nfX1mdW5jdGlvbiBpbnNlcnRJbmRleChlLHQsbixyKXtuPDAmJihuPTApO3ZhciBpPXRbbi0xXSxvPXRbbl07cmV0dXJuIHQuc3BsaWNlKG4sMCxlKSxyJiYoaSYmKGkubmV4dFNpYmxpbmc9ZSksZS5wcmV2aW91c1NpYmxpbmc9aSwoZS5uZXh0U2libGluZz1vKSYmKG8ucHJldmlvdXNTaWJsaW5nPWUpKSxufWZ1bmN0aW9uIG1vdmVJbmRleChlLHQsbixyKXt2YXIgaT10LmluZGV4T2YoZSk7aWYoaTwwKXJldHVybi0xO2lmKHIpe3ZhciBvPXRbaS0xXSxhPXRbaSsxXTtvJiYoby5uZXh0U2libGluZz1hKSxhJiYoYS5wcmV2aW91c1NpYmxpbmc9byl9dC5zcGxpY2UoaSwxKTt2YXIgcz1uO2k8PW4mJihzPW4tMSk7dmFyIGM9dFtzLTFdLHU9dFtzXTtyZXR1cm4gdC5zcGxpY2UocywwLGUpLHImJihjJiYoYy5uZXh0U2libGluZz1lKSxlLnByZXZpb3VzU2libGluZz1jLChlLm5leHRTaWJsaW5nPXUpJiYodS5wcmV2aW91c1NpYmxpbmc9ZSkpLGk9PT1zPy0xOm59ZnVuY3Rpb24gcmVtb3ZlSW5kZXgoZSx0LG4pe3ZhciByPXQuaW5kZXhPZihlKTtpZighKHI8MCkpe2lmKG4pe3ZhciBpPXRbci0xXSxvPXRbcisxXTtpJiYoaS5uZXh0U2libGluZz1vKSxvJiYoby5wcmV2aW91c1NpYmxpbmc9aSl9dC5zcGxpY2UociwxKX19dmFyIE5vZGU9ZnVuY3Rpb24oKXt0aGlzLm5vZGVJZD11bmlxdWVJZCgpLHRoaXMucmVmPXRoaXMubm9kZUlkLHRoaXMuY2hpbGRyZW49W10sdGhpcy5wdXJlQ2hpbGRyZW49W10sdGhpcy5wYXJlbnROb2RlPW51bGwsdGhpcy5uZXh0U2libGluZz1udWxsLHRoaXMucHJldmlvdXNTaWJsaW5nPW51bGx9LEVsZW1lbnQkMjtmdW5jdGlvbiBzZXRFbGVtZW50KGUpe0VsZW1lbnQkMj1lfU5vZGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgZT1nZXREb2ModGhpcy5kb2NJZCk7ZSYmKGRlbGV0ZSB0aGlzLmRvY0lkLGRlbGV0ZSBlLm5vZGVNYXBbdGhpcy5ub2RlSWRdKSx0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5kZXN0cm95KCl9KX07dmFyIHJlZ2lzdGVyZWRFbGVtZW50cz17fTtmdW5jdGlvbiByZWdpc3RlckVsZW1lbnQoaSxlKXtpZihBcnJheS5pc0FycmF5KGUpJiZlLmxlbmd0aCl7dmFyIHQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBlJiYodC5fX3Byb3RvX189ZSksKHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj10fShFbGVtZW50JDIpO2UuZm9yRWFjaChmdW5jdGlvbihyKXt0LnByb3RvdHlwZVtyXT1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTt2YXIgbj1nZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpO2lmKG4pcmV0dXJuIG4uc2VuZCgiY29tcG9uZW50Iix7cmVmOnRoaXMucmVmLGNvbXBvbmVudDppLG1ldGhvZDpyfSxlKX19KSxyZWdpc3RlcmVkRWxlbWVudHNbaV09dH19ZnVuY3Rpb24gZ2V0V2VleEVsZW1lbnQoZSl7cmV0dXJuIHJlZ2lzdGVyZWRFbGVtZW50c1tlXX1mdW5jdGlvbiBjYWNoZWQodCl7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV18fChuW2VdPXQoZSkpfX12YXIgcGFyc2VTdHlsZVRleHQ9Y2FjaGVkKGZ1bmN0aW9uKGUpe3ZhciBuPXt9LHI9LzooLispLztyZXR1cm4gZS5zcGxpdCgvOyg/IVteKF0qXCkpL2cpLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9ZS5zcGxpdChyKTsxPHQubGVuZ3RoJiYoblt0WzBdLnRyaW0oKV09dFsxXS50cmltKCkpfX0pLG59KSxmaXJzdExldHRlclRvTG93ZXJDYXNlPWNhY2hlZChmdW5jdGlvbihlKXtyZXR1cm4gZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKStlLnNsaWNlKDEpfSk7ZnVuY3Rpb24gaXNEZWYoZSl7cmV0dXJuIHZvaWQgMCE9PWV9ZnVuY3Rpb24gaXNGbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZX12YXIgX3RvU3RyaW5nPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gdG9SYXdUeXBlKGUpe3JldHVybiBfdG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LC0xKX1mdW5jdGlvbiBoYXNMaWZlY3ljbGVIb29rKGUsdCl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXt9KSxBcnJheS5pc0FycmF5KGVbdF0pJiZlW3RdLmxlbmd0aH12YXIgcHJvY2Vzc29ycz17c2xpZGVyOntjaGFuZ2U6ZnVuY3Rpb24oZSl7cmV0dXJue2luZGV4OmUuaW5kZXgsc291cmNlOmUuc291cmNlfX0sc2Nyb2xsOmZ1bmN0aW9uKGUpe3JldHVybntvZmZzZXRYUmF0aW86ZS5vZmZzZXRYUmF0aW8sb2Zmc2V0WVJhdGlvOmUub2Zmc2V0WVJhdGlvLGRyYWc6ZS5kcmFnfX19LCJzY3JvbGwtdmlldyI6e3Njcm9sbGVuZDpmdW5jdGlvbihlKXtyZXR1cm57Y29udGVudE9mZnNldDplLmNvbnRlbnRPZmZzZXR9fX19O2Z1bmN0aW9uIHByb2Nlc3NUYXJnZXQoZSl7dmFyIHQ9ZS5hdHRyLG49ZS5vZmZzZXRMZWZ0LHI9ZS5vZmZzZXRUb3AsaT17fTtyZXR1cm4gT2JqZWN0LmtleXModHx8e30pLmZvckVhY2goZnVuY3Rpb24oZSl7MD09PWUuaW5kZXhPZigiZGF0YSIpJiYoaVtmaXJzdExldHRlclRvTG93ZXJDYXNlKGUucmVwbGFjZSgiZGF0YSIsIiIpKV09dFtlXSl9KSx7aWQ6dCYmdC5pZHx8IiIsZGF0YXNldDppLG9mZnNldExlZnQ6bnx8MCxvZmZzZXRUb3A6cnx8MH19ZnVuY3Rpb24gcHJvY2Vzc0N1c3RvbUV2ZW50KGUsdCxuKXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9e30pLHZvaWQgMD09PW4mJihuPXt9KSxuPXByb2Nlc3NUYXJnZXQobikse3R5cGU6ZSx0aW1lU3RhbXA6RGF0ZS5ub3coKSx0YXJnZXQ6bixjdXJyZW50VGFyZ2V0Om4sZGV0YWlsOnR9fXZhciBXRUVYX1RBR1M9WyJhIiwiZGl2IiwibGlzdCIsImNlbGwiLCJsb2FkaW5nIiwicmVmcmVzaCIsInJlY3ljbGUtbGlzdCIsInNjcm9sbGVyIiwiaW5kaWNhdG9yIiwid2F0ZXJmYWxsIiwid2ViIiwicmljaHRleHQiXSxJR05PUkVfRVZFTlRTPVsidmlld2FwcGVhciIsInZpZXdkaXNhcHBlYXIiLCJpdGVtY2xpY2siXSxFVkVOVF9FWFRSQVM9e21hcmtlcnRhcDpbIm1hcmtlcklkIl0sY29udHJvbHRhcDpbImNvbnRyb2xJZCJdLHJlZ2lvbmNoYW5nZTpbImNhdXNlZEJ5Il0sZW5kOlsiY2F1c2VkQnkiXSxhcHBlYXI6WyJkaXJlY3Rpb24iXSxkaXNhcHBlYXI6WyJkaXJlY3Rpb24iXX07ZnVuY3Rpb24gcHJvY2Vzc0V2ZW50KHQsZSl7dmFyIG49dC50eXBlO2lmKC0xIT09SUdOT1JFX0VWRU5UUy5pbmRleE9mKG4pKXJldHVybiB0O3ZhciByPXQuY3VycmVudFRhcmdldCxpPXIudHlwZS5yZXBsYWNlKCJ1LSIsIiIpO2lmKC0xIT09V0VFWF9UQUdTLmluZGV4T2YoaSkpcmV0dXJuIHQ7dmFyIG89dC50aW1lc3RhbXAsYT10LnRhcmdldDtpZighaXNEZWYoZSkpe3ZhciBzPXByb2Nlc3NvcnNbaV07ZT1zJiZpc0ZuKHNbbl0pP3Nbbl0odCk6dC5kZXRhaWx8fHt9fXZhciBjPXt0eXBlOm4sdGltZVN0YW1wOm8sdGFyZ2V0OnByb2Nlc3NUYXJnZXQoYSksY3VycmVudFRhcmdldDpwcm9jZXNzVGFyZ2V0KHIpLGRldGFpbDplLHRvdWNoZXM6InRvdWNoZW5kIj09PW58fCJwYW5lbmQiPT09bj9bXTp0LmNoYW5nZWRUb3VjaGVzLGNoYW5nZWRUb3VjaGVzOnQuY2hhbmdlZFRvdWNoZXN9O3QuY29tcG9uZW50SWQmJihjLmNvbXBvbmVudElkPXQuY29tcG9uZW50SWQpO3ZhciB1PUVWRU5UX0VYVFJBU1tuXTtyZXR1cm4gdSYmdS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuaGFzT3duUHJvcGVydHkoZSkmJihjW2VdPXRbZV0pfSksY312YXIgQkFTRV9ERVZJQ0VfV0lEVEg9NzUwLGRldmljZURQUj0xLGRldmljZVdpZHRoPTA7ZnVuY3Rpb24gdXB4MnB4KGUsdCl7aWYoMD09PWRldmljZVdpZHRoJiYoZGV2aWNlRFBSPWdsb2JhbC5XWEVudmlyb25tZW50LnNjYWxlLGRldmljZVdpZHRoPU1hdGguY2VpbChnbG9iYWwuV1hFbnZpcm9ubWVudC5kZXZpY2VXaWR0aC9kZXZpY2VEUFIpKSwwPT09KGU9TnVtYmVyKGUpKSlyZXR1cm4gMDt2YXIgbj1lL0JBU0VfREVWSUNFX1dJRFRIKih0fHxkZXZpY2VXaWR0aCkscj1uLnRvU3RyaW5nKCkuc3BsaXQoIi4iKTtyZXR1cm4gMj09PXIubGVuZ3RoPyhyWzFdPXJbMV0uc3Vic3RyaW5nKDAsMiksTnVtYmVyKHIuam9pbigiLiIpKSk6bn12YXIgVU5JVF9SRT0vKFsrLV0/XGQrKFwuXGQrKT8pW3J8dV1weC9nO2Z1bmN0aW9uIG5vcm1hbGl6ZVVuaXQobil7cmV0dXJuIGdsb2JhbC5XWEVudmlyb25tZW50LmR5bmFtaWNScHh8fCJPYmplY3QiIT09dHlwb2Yobil8fE9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9bltlXTsic3RyaW5nIj09dHlwZW9mIHQmJihuW2VdPXQucmVwbGFjZShVTklUX1JFLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHVweDJweCh0KX0pKX0pLG59ZnVuY3Rpb24gZGVlcENsb25lKGUsaSl7cmV0dXJuIGUubWFwKGZ1bmN0aW9uIGUodCl7dmFyIG49dC5jaGlsZHJlbiYmdC5jaGlsZHJlbi5tYXAoZSkscj1pKHQudGFnLHQuZGF0YSxuKTtyZXR1cm4gci50ZXh0PXQudGV4dCxyLmlzQ29tbWVudD10LmlzQ29tbWVudCxyLmNvbXBvbmVudE9wdGlvbnM9dC5jb21wb25lbnRPcHRpb25zLHIuZWxtPXQuZWxtLHIuY29udGV4dD10LmNvbnRleHQsci5ucz10Lm5zLHIuaXNTdGF0aWM9dC5pc1N0YXRpYyxyLmtleT10LmtleSxyfSl9ZnVuY3Rpb24gZ2VuZXJhdGVEZWNsYXJhdGlvbihlLHQsbil7cmV0dXJue3R5cGU6ImRlY2xhcmF0aW9uIixwcm9wZXJ0eTplLHZhbHVlOnR9fWZ1bmN0aW9uIGNsZWFySW1wb3J0YW50KGUpe3ZhciB0PVN0cmluZyhlKS5yZXBsYWNlKC9ccyohaW1wb3J0YW50L2csIiIpO3JldHVybnt2YWx1ZTp0LGltcG9ydGFudDplIT09dH19ZnVuY3Rpb24gY3JlYXRlUGFyc2VyKHMpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD1jbGVhckltcG9ydGFudChlLnZhbHVlKSxuPXQudmFsdWUscj10LmltcG9ydGFudCxpPWUucG9zaXRpb24sbz1uLnNwbGl0KC9ccysvKSxhPVtdO3N3aXRjaChvLmxlbmd0aCl7Y2FzZSAxOm8ucHVzaChvWzBdLG9bMF0sb1swXSk7YnJlYWs7Y2FzZSAyOm8ucHVzaChvWzBdLG9bMV0pO2JyZWFrO2Nhc2UgMzpvLnB1c2gob1sxXSl9cmV0dXJuIGEucHVzaChnZW5lcmF0ZURlY2xhcmF0aW9uKHMrIlRvcCIsb1swXSxyLGkpLGdlbmVyYXRlRGVjbGFyYXRpb24ocysiUmlnaHQiLG9bMV0scixpKSxnZW5lcmF0ZURlY2xhcmF0aW9uKHMrIkJvdHRvbSIsb1syXSxyLGkpLGdlbmVyYXRlRGVjbGFyYXRpb24ocysiTGVmdCIsb1szXSxyLGkpKSxhfX12YXIgbWFyZ2luPWNyZWF0ZVBhcnNlcigibWFyZ2luIikscGFkZGluZz1jcmVhdGVQYXJzZXIoInBhZGRpbmciKTtmdW5jdGlvbiBib3JkZXIoZSl7dmFyIHQ9Y2xlYXJJbXBvcnRhbnQoZS52YWx1ZSksbj10LnZhbHVlLHI9dC5pbXBvcnRhbnQsaT1lLnByb3BlcnR5LG89bi5yZXBsYWNlKC9ccyosXHMqL2csIiwiKS5zcGxpdCgvXHMrLyksYT1bL15bXGQuXStcUyokLywvXihzb2xpZHxkYXNoZWR8ZG90dGVkKSQvLC9cUysvXS5tYXAoZnVuY3Rpb24odCl7dmFyIGU9by5maW5kSW5kZXgoZnVuY3Rpb24oZSl7cmV0dXJuIHQudGVzdChlKX0pO3JldHVybiBlPDA/bnVsbDpvLnNwbGljZShlLDEpWzBdfSk7cmV0dXJuIG8ubGVuZ3RoP2U6W2dlbmVyYXRlRGVjbGFyYXRpb24oaSsiV2lkdGgiLChhWzBdfHwiMCIpLnRyaW0oKSxyKSxnZW5lcmF0ZURlY2xhcmF0aW9uKGkrIlN0eWxlIiwoYVsxXXx8InNvbGlkIikudHJpbSgpLHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oaSsiQ29sb3IiLChhWzJdfHwiIzAwMDAwMCIpLnRyaW0oKSxyKV19ZnVuY3Rpb24gYm9yZGVyUHJvcGVydHkoZSl7dmFyIHQ9Y2xlYXJJbXBvcnRhbnQoZS52YWx1ZSksbj10LnZhbHVlLHI9dC5pbXBvcnRhbnQsaT1lLnByb3BlcnR5LnN1YnN0cmluZyg2KSxvPW4ucmVwbGFjZSgvXHMqLFxzKi9nLCIsIikuc3BsaXQoL1xzKy8pLGE9W107c3dpdGNoKG8ubGVuZ3RoKXtjYXNlIDE6cmV0dXJuIGU7Y2FzZSAyOm8ucHVzaChvWzBdLG9bMV0pO2JyZWFrO2Nhc2UgMzpvLnB1c2gob1sxXSl9cmV0dXJuIGEucHVzaChnZW5lcmF0ZURlY2xhcmF0aW9uKCJib3JkZXJUb3AiK2ksb1swXSxyKSxnZW5lcmF0ZURlY2xhcmF0aW9uKCJib3JkZXJSaWdodCIraSxvWzFdLHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oImJvcmRlckJvdHRvbSIraSxvWzJdLHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oImJvcmRlckxlZnQiK2ksb1szXSxyKSksYX1mdW5jdGlvbiBib3JkZXJSYWRpdXMoZSl7dmFyIHQ9Y2xlYXJJbXBvcnRhbnQoZS52YWx1ZSksbj10LnZhbHVlLHI9dC5pbXBvcnRhbnQsaT1uLnNwbGl0KC9ccysvKSxvPVtdO2lmKG4uaW5jbHVkZXMoIi8iKSlyZXR1cm4gZTtzd2l0Y2goaS5sZW5ndGgpe2Nhc2UgMTpyZXR1cm4gZTtjYXNlIDI6aS5wdXNoKGlbMF0saVsxXSk7YnJlYWs7Y2FzZSAzOmkucHVzaChpWzFdKX1yZXR1cm4gby5wdXNoKGdlbmVyYXRlRGVjbGFyYXRpb24oImJvcmRlclRvcExlZnRSYWRpdXMiLGlbMF0sciksZ2VuZXJhdGVEZWNsYXJhdGlvbigiYm9yZGVyVG9wUmlnaHRSYWRpdXMiLGlbMV0sciksZ2VuZXJhdGVEZWNsYXJhdGlvbigiYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMiLGlbMl0sciksZ2VuZXJhdGVEZWNsYXJhdGlvbigiYm9yZGVyQm90dG9tTGVmdFJhZGl1cyIsaVszXSxyKSksb31mdW5jdGlvbiBmbGV4RmxvdyhlKXt2YXIgdD1jbGVhckltcG9ydGFudChlLnZhbHVlKSxuPXQudmFsdWUscj10LmltcG9ydGFudCxpPW4uc3BsaXQoL1xzKy8pLG89Wy9eKGNvbHVtbnxjb2x1bW4tcmV2ZXJzZXxyb3d8cm93LXJldmVyc2UpJC8sL14obm93cmFwfHdyYXB8d3JhcC1yZXZlcnNlKSQvXS5tYXAoZnVuY3Rpb24odCl7dmFyIGU9aS5maW5kSW5kZXgoZnVuY3Rpb24oZSl7cmV0dXJuIHQudGVzdChlKX0pO3JldHVybiBlPDA/bnVsbDppLnNwbGljZShlLDEpWzBdfSk7cmV0dXJuIGkubGVuZ3RoP2U6W2dlbmVyYXRlRGVjbGFyYXRpb24oImZsZXhEaXJlY3Rpb24iLG9bMF18fCJjb2x1bW4iLHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oImZsZXhXcmFwIixvWzFdfHwibm93cmFwIixyKV19ZnVuY3Rpb24gZm9udChlKXt2YXIgdD1jbGVhckltcG9ydGFudChlLnZhbHVlKSxuPXQudmFsdWUscj10LmltcG9ydGFudCxpPW4ucmVwbGFjZSgvLFxzKi9nLCIsIikucmVwbGFjZSgvXHMqXC9ccyovLCIvIikucmVwbGFjZSgvWyciXS4rP1snIl0vZyxmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC9ccysvZywiIyIpfSkuc3BsaXQoL1xzKy8pLG89W10sYT1bIm5vcm1hbCIsIml0YWxpYyIsIm9ibGlxdWUiXTtvLnB1c2goZ2VuZXJhdGVEZWNsYXJhdGlvbigiZm9udFN0eWxlIixhW01hdGgubWF4KDAsYS5pbmRleE9mKGlbMF0pKV0scikpO3ZhciBzPWkuc2xpY2UoMCwtMikuZmluZChmdW5jdGlvbihlKXtyZXR1cm4vbm9ybWFsfGJvbGR8bGlnaHRlcnxib2xkZXJ8XGQrLy50ZXN0KGUpfSk7aWYocyYmby5wdXNoKGdlbmVyYXRlRGVjbGFyYXRpb24oImZvbnRXZWlnaHQiLHMscikpLGk9aS5zbGljZSgtMiksL1tcZC5dK1xTKihcL1tcZC5dK1xTKik/Ly50ZXN0KGlbMF0pKXt2YXIgYz1pWzBdLnNwbGl0KCIvIiksdT1jWzBdLGw9Y1sxXTtyZXR1cm4gby5wdXNoKGdlbmVyYXRlRGVjbGFyYXRpb24oImZvbnRTaXplIix1LHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oImxpbmVIZWlnaHQiLGx8fCJub3JtYWwiLHIpLGdlbmVyYXRlRGVjbGFyYXRpb24oImZvbnRGYW1pbHkiLGlbMV0ucmVwbGFjZSgvIy9nLCIgIikscikpLG99cmV0dXJuW119ZnVuY3Rpb24gYmFja2dyb3VuZChlKXt2YXIgdD1jbGVhckltcG9ydGFudChlLnZhbHVlKSxuPXQudmFsdWUscj10LmltcG9ydGFudDtyZXR1cm4vXiM/XFMrJC8udGVzdChuKXx8L15yZ2JhPyguKykkLy50ZXN0KG4pP2dlbmVyYXRlRGVjbGFyYXRpb24oImJhY2tncm91bmRDb2xvciIsbixyKTovXmxpbmVhci1ncmFkaWVudCguKykkLy50ZXN0KG4pP2dlbmVyYXRlRGVjbGFyYXRpb24oImJhY2tncm91bmRJbWFnZSIsbixyKTplfXZhciBwYXJzZXJDb2xsZWN0aW9uPXttYXJnaW46bWFyZ2luLHBhZGRpbmc6cGFkZGluZyxib3JkZXI6Ym9yZGVyLGJvcmRlclRvcDpib3JkZXIsYm9yZGVyUmlnaHQ6Ym9yZGVyLGJvcmRlckJvdHRvbTpib3JkZXIsYm9yZGVyTGVmdDpib3JkZXIsYm9yZGVyU3R5bGU6Ym9yZGVyUHJvcGVydHksYm9yZGVyV2lkdGg6Ym9yZGVyUHJvcGVydHksYm9yZGVyQ29sb3I6Ym9yZGVyUHJvcGVydHksYm9yZGVyUmFkaXVzOmJvcmRlclJhZGl1cyxmbGV4RmxvdzpmbGV4Rmxvdyxmb250OmZvbnQsYmFja2dyb3VuZDpiYWNrZ3JvdW5kfTtmdW5jdGlvbiBleHBhbmRTaG9ydGhhbmRQcm9wZXJ0eShlKXt2YXIgdD1wYXJzZXJDb2xsZWN0aW9uW2UucHJvcGVydHldO3JldHVybiB0JiYoZT10KGUpKSxbXS5jb25jYXQoZSl9dmFyIERFRkFVTFRfVEFHX05BTUU9ImRpdiIsQlVCQkxFX0VWRU5UUz1bImNsaWNrIiwibG9uZ3ByZXNzIiwidG91Y2hzdGFydCIsInRvdWNobW92ZSIsInRvdWNoZW5kIiwicGFuc3RhcnQiLCJwYW5tb3ZlIiwicGFuZW5kIiwiaG9yaXpvbnRhbHBhbiIsInZlcnRpY2FscGFuIiwic3dpcGUiXTtmdW5jdGlvbiByZWdpc3Rlck5vZGUoZSx0KXtnZXREb2MoZSkubm9kZU1hcFt0Lm5vZGVJZF09dH12YXIgRWxlbWVudD1mdW5jdGlvbihpKXtmdW5jdGlvbiBlKGUsdCxuKXt2b2lkIDA9PT1lJiYoZT1ERUZBVUxUX1RBR19OQU1FKSxpLmNhbGwodGhpcyk7dmFyIHI9Z2V0V2VleEVsZW1lbnQoZSk7aWYociYmIW4pcmV0dXJuIG5ldyByKGUsdCwhMCk7dD10fHx7fSx0aGlzLm5vZGVUeXBlPTEsdGhpcy5ub2RlSWQ9dW5pcXVlSWQoKSx0aGlzLnJlZj10aGlzLm5vZGVJZCx0aGlzLnR5cGU9ZSx0aGlzLmF0dHI9dC5hdHRyfHx7fSx0aGlzLnN0eWxlPXQuc3R5bGV8fHt9LHRoaXMuY2xhc3NTdHlsZT10LmNsYXNzU3R5bGV8fHt9LHRoaXMuZXZlbnQ9e30sdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnB1cmVDaGlsZHJlbj1bXSx0aGlzLmNsYXNzTGlzdD10LmNsYXNzTGlzdHx8W10sdGhpcy5zdHlsZXNoZWV0PXQuc3R5bGVzaGVldHx8W10sdGhpcy5yZWFkeT0hMX1yZXR1cm4gaSYmKGUuX19wcm90b19fPWkpLCgoZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShpJiZpLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWUpLnByb3RvdHlwZS5hcHBlbmRDaGlsZD1mdW5jdGlvbihlKXtpZighZS5wYXJlbnROb2RlfHxlLnBhcmVudE5vZGU9PT10aGlzKWlmKGUucGFyZW50Tm9kZSl7aWYoY2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coIlthcHBlbmRDaGlsZF0oIit0aGlzLmRvY0lkKyIsIitlLnR5cGUrIiwiK2UucmVmKyIpIE1vdmUgPCIrZS50eXBlKyI+IHRvICIrdGhpcy5jaGlsZHJlbi5sZW5ndGgrIiBvZiA8Iit0aGlzLnR5cGUrIj4gKCIrdGhpcy5yZWYrIikuIiksbW92ZUluZGV4KGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmxlbmd0aCwhMCksMT09PWUubm9kZVR5cGUpe3ZhciB0PW1vdmVJbmRleChlLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCksbj1nZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpO24mJjA8PXQmJih0aGlzLmNvbXB1dGVDaGlsZHJlbkNsYXNzTGlzdChlKSxuLnNlbmQoImRvbSIse2FjdGlvbjoibW92ZUVsZW1lbnQifSxbZS5yZWYsdGhpcy5yZWYsdF0pKX19ZWxzZSBpZihjaGVja0xldmVsKCJkZWJ1ZyIpJiZkZWJ1Z0xvZygiW2FwcGVuZENoaWxkXSgiK3RoaXMuZG9jSWQrIiwiK2UudHlwZSsiLCIrZS5yZWYrIikgQXBwZW5kIDwiK2UudHlwZSsiPiB0byA8Iit0aGlzLnR5cGUrIj4gKCIrdGhpcy5yZWYrIikuIiksbGlua1BhcmVudChlLHRoaXMpLGluc2VydEluZGV4KGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmxlbmd0aCwhMCksdGhpcy5kb2NJZCYmcmVnaXN0ZXJOb2RlKHRoaXMuZG9jSWQsZSksMT09PWUubm9kZVR5cGUpe2luc2VydEluZGV4KGUsdGhpcy5wdXJlQ2hpbGRyZW4sdGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKTt2YXIgcj1nZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpO3ImJih0aGlzLmNvbXB1dGVDaGlsZHJlbkNsYXNzTGlzdChlKSxyLnNlbmQoImRvbSIse2FjdGlvbjoiYWRkRWxlbWVudCJ9LFt0aGlzLnJlZixlLnRvSlNPTigpLC0xXSkpLGUucmVhZHk9ITB9fSxlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmU9ZnVuY3Rpb24oZSx0KXtpZighKGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlIT09dGhpc3x8ZT09PXR8fGUubmV4dFNpYmxpbmcmJmUubmV4dFNpYmxpbmc9PT10KSlpZihlLnBhcmVudE5vZGUpe2lmKG1vdmVJbmRleChlLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5pbmRleE9mKHQpLCEwKSwxPT09ZS5ub2RlVHlwZSl7dmFyIG49bmV4dEVsZW1lbnQodCkscj1tb3ZlSW5kZXgoZSx0aGlzLnB1cmVDaGlsZHJlbixuP3RoaXMucHVyZUNoaWxkcmVuLmluZGV4T2Yobik6dGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKSxpPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7aSYmMDw9ciYmKHRoaXMuY29tcHV0ZUNoaWxkcmVuQ2xhc3NMaXN0KGUpLGkuc2VuZCgiZG9tIix7YWN0aW9uOiJtb3ZlRWxlbWVudCJ9LFtlLnJlZix0aGlzLnJlZixyXSkpfX1lbHNlIGlmKGNoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbaW5zZXJ0QmVmb3JlXSgiK3RoaXMuZG9jSWQrIiwiK2UudHlwZSsiLCIrZS5yZWYrIikgSW5zZXJ0IDwiK2UudHlwZSsiPiB0byA8Iit0aGlzLnR5cGUrIj4gKCIrdGhpcy5yZWYrIiksIGJlZm9yZSAoIit0LnJlZisiKS4iKSxsaW5rUGFyZW50KGUsdGhpcyksaW5zZXJ0SW5kZXgoZSx0aGlzLmNoaWxkcmVuLHRoaXMuY2hpbGRyZW4uaW5kZXhPZih0KSwhMCksdGhpcy5kb2NJZCYmcmVnaXN0ZXJOb2RlKHRoaXMuZG9jSWQsZSksMT09PWUubm9kZVR5cGUpe3ZhciBvPW5leHRFbGVtZW50KHQpLGE9aW5zZXJ0SW5kZXgoZSx0aGlzLnB1cmVDaGlsZHJlbixvP3RoaXMucHVyZUNoaWxkcmVuLmluZGV4T2Yobyk6dGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKSxzPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7cyYmKHRoaXMuY29tcHV0ZUNoaWxkcmVuQ2xhc3NMaXN0KGUpLHMuc2VuZCgiZG9tIix7YWN0aW9uOiJhZGRFbGVtZW50In0sW3RoaXMucmVmLGUudG9KU09OKCksYV0pKSxlLnJlYWR5PSEwfX0sZS5wcm90b3R5cGUuaW5zZXJ0QWZ0ZXI9ZnVuY3Rpb24oZSx0KXtpZighKGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlIT09dGhpc3x8ZT09PXR8fGUucHJldmlvdXNTaWJsaW5nJiZlLnByZXZpb3VzU2libGluZz09PXQpKWlmKGUucGFyZW50Tm9kZSl7aWYobW92ZUluZGV4KGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmluZGV4T2YodCkrMSwhMCksMT09PWUubm9kZVR5cGUpe3ZhciBuPW1vdmVJbmRleChlLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YocHJldmlvdXNFbGVtZW50KHQpKSsxKSxyPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7ciYmMDw9biYmKHRoaXMuY29tcHV0ZUNoaWxkcmVuQ2xhc3NMaXN0KGUpLHIuc2VuZCgiZG9tIix7YWN0aW9uOiJtb3ZlRWxlbWVudCJ9LFtlLnJlZix0aGlzLnJlZixuXSkpfX1lbHNlIGlmKGNoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbaW5zZXJ0QWZ0ZXJdKCIrdGhpcy5kb2NJZCsiLCIrZS50eXBlKyIsIitlLnJlZisiKSBJbnNlcnQgPCIrZS50eXBlKyI+IHRvIDwiK3RoaXMudHlwZSsiPiAoIit0aGlzLnJlZisiKSwgYWZ0ZXIgKCIrdC5yZWYrIikuIiksbGlua1BhcmVudChlLHRoaXMpLGluc2VydEluZGV4KGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmluZGV4T2YodCkrMSwhMCksdGhpcy5kb2NJZCYmcmVnaXN0ZXJOb2RlKHRoaXMuZG9jSWQsZSksMT09PWUubm9kZVR5cGUpe3ZhciBpPWluc2VydEluZGV4KGUsdGhpcy5wdXJlQ2hpbGRyZW4sdGhpcy5wdXJlQ2hpbGRyZW4uaW5kZXhPZihwcmV2aW91c0VsZW1lbnQodCkpKzEpLG89Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTtvJiYodGhpcy5jb21wdXRlQ2hpbGRyZW5DbGFzc0xpc3QoZSksby5zZW5kKCJkb20iLHthY3Rpb246ImFkZEVsZW1lbnQifSxbdGhpcy5yZWYsZS50b0pTT04oKSxpXSkpLGUucmVhZHk9ITB9fSxlLnByb3RvdHlwZS5yZW1vdmVDaGlsZD1mdW5jdGlvbihlLHQpe2lmKGUucGFyZW50Tm9kZSl7aWYocmVtb3ZlSW5kZXgoZSx0aGlzLmNoaWxkcmVuLCEwKSwxPT09ZS5ub2RlVHlwZSl7Y2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coIltyZW1vdmVDaGlsZF0oIit0aGlzLmRvY0lkKyIsIitlLnR5cGUrIiwiK2UucmVmKyIpIFJlbW92ZSA8IitlLnR5cGUrIj4gZnJvbSA8Iit0aGlzLnR5cGUrIj4gKCIrdGhpcy5yZWYrIikuIikscmVtb3ZlSW5kZXgoZSx0aGlzLnB1cmVDaGlsZHJlbik7dmFyIG49Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTtuJiZuLnNlbmQoImRvbSIse2FjdGlvbjoicmVtb3ZlRWxlbWVudCJ9LFtlLnJlZl0pLGUucmVhZHk9ITF9dGhpcy5jb21wdXRlQ2hpbGRyZW5DbGFzc0xpc3QoZSxlLm5leHRTaWJsaW5nfHx7fSl9dHx8ZS5kZXN0cm95KCl9LGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dmFyIHQ9Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTt0aGlzLnB1cmVDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QmJnQuc2VuZCgiZG9tIix7YWN0aW9uOiJyZW1vdmVFbGVtZW50In0sW2UucmVmXSksZS5yZWFkeT0hMX0pLHRoaXMuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlKXtlLmRlc3Ryb3koKX0pLHRoaXMuY2hpbGRyZW4ubGVuZ3RoPTAsdGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoPTB9LGUucHJvdG90eXBlLnNldEF0dHI9ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMuYXR0cltlXSE9PXR8fCExPT09bil7dGhpcy5hdHRyW2VdPXQ7dmFyIHI9Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTtpZighbiYmcil7dmFyIGk9e307aVtlXT10LHIuc2VuZCgiZG9tIix7YWN0aW9uOiJ1cGRhdGVBdHRycyJ9LFt0aGlzLnJlZixpXSl9fX0sZS5wcm90b3R5cGUuc2V0QXR0cnM9ZnVuY3Rpb24oZSx0KXtpZighaXNFbXB0eShlKSl7dmFyIG49e307Zm9yKHZhciByIGluIGUpdGhpcy5hdHRyW3JdIT09ZVtyXSYmKHRoaXMuYXR0cltyXT1lW3JdLG5bcl09ZVtyXSk7aWYoIWlzRW1wdHkobikpe3ZhciBpPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7IXQmJmkmJmkuc2VuZCgiZG9tIix7YWN0aW9uOiJ1cGRhdGVBdHRycyJ9LFt0aGlzLnJlZixuXSl9fX0sZS5wcm90b3R5cGUuc2V0U3R5bGU9ZnVuY3Rpb24oZSx0LG8pe3ZhciBhPXRoaXM7ZXhwYW5kU2hvcnRoYW5kUHJvcGVydHkoe3Byb3BlcnR5OmUsdmFsdWU6dH0pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wcm9wZXJ0eSxuPWUudmFsdWU7aWYoYS5zdHlsZVt0XSE9PW58fCExPT09byl7YS5zdHlsZVt0XT1uO3ZhciByPWdldFRhc2tDZW50ZXIoYS5kb2NJZCk7aWYoIW8mJnIpe3ZhciBpPXt9O2lbdF09IiI9PT1uJiZ0IGluIGEuY2xhc3NTdHlsZT9hLmNsYXNzU3R5bGVbdF06bixyLnNlbmQoImRvbSIse2FjdGlvbjoidXBkYXRlU3R5bGUifSxbYS5yZWYsaV0pfX19KX0sZS5wcm90b3R5cGUuc2V0U3R5bGVzPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcztpZighaXNFbXB0eShlKSl7dmFyIGk9e307Zm9yKHZhciBuIGluIGUpe2V4cGFuZFNob3J0aGFuZFByb3BlcnR5KHtwcm9wZXJ0eTpuLHZhbHVlOmVbbl19KS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUucHJvcGVydHksbj1lLnZhbHVlO3Iuc3R5bGVbdF0hPT1uJiYoci5zdHlsZVt0XT1uLGlbdF09IiI9PT1uJiZ0IGluIHIuY2xhc3NTdHlsZT9yLmNsYXNzU3R5bGVbdF06bil9KX1pZighaXNFbXB0eShpKSl7dmFyIG89Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTshdCYmbyYmby5zZW5kKCJkb20iLHthY3Rpb246InVwZGF0ZVN0eWxlIn0sW3RoaXMucmVmLGldKX19fSxlLnByb3RvdHlwZS5zZXRDbGFzc1N0eWxlPWZ1bmN0aW9uKGUpe3ZhciB0PSExO2Zvcih2YXIgbiBpbiB0aGlzLmNsYXNzU3R5bGUpbiBpbiBlfHwodD0hMCx0aGlzLmNsYXNzU3R5bGVbbl09IiIpO2Zvcih2YXIgciBpbiBlKWVbcl0hPT10aGlzLmNsYXNzU3R5bGVbcl0mJih0PSEwLHRoaXMuY2xhc3NTdHlsZVtyXT1lW3JdKTtpZih0KXt2YXIgaT1nZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpO2kmJnRoaXMucmVhZHkmJmkuc2VuZCgiZG9tIix7YWN0aW9uOiJ1cGRhdGVTdHlsZSJ9LFt0aGlzLnJlZix0aGlzLnRvU3R5bGUoKV0pfX0sZS5wcm90b3R5cGUuYWRkRXZlbnQ9ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMuZXZlbnR8fCh0aGlzLmV2ZW50PXt9KSwhdGhpcy5ldmVudFtlXSl7Y2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coIlthZGRFdmVudF0oIit0aGlzLmRvY0lkKyIsIit0aGlzLnR5cGUrIiwiK3RoaXMucmVmKycpIEFkZCAiJytlKyciIGV2ZW50IG9uIDwnK3RoaXMudHlwZSsiPiAoIit0aGlzLnJlZisiKS4iKSx0aGlzLmV2ZW50W2VdPXtoYW5kbGVyOnQscGFyYW1zOm59O3ZhciByPWdldFRhc2tDZW50ZXIodGhpcy5kb2NJZCk7ciYmci5zZW5kKCJkb20iLHthY3Rpb246ImFkZEV2ZW50In0sW3RoaXMucmVmLGVdKX19LGUucHJvdG90eXBlLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGUpe2lmKHRoaXMuZXZlbnQmJnRoaXMuZXZlbnRbZV0pe2NoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbcmVtb3ZlRXZlbnRdKCIrdGhpcy5kb2NJZCsiLCIrdGhpcy50eXBlKyIsIit0aGlzLnJlZisnKSBSZW1vdmUgIicrZSsnIiBldmVudCBvbiA8Jyt0aGlzLnR5cGUrIj4gKCIrdGhpcy5yZWYrIikuIiksZGVsZXRlIHRoaXMuZXZlbnRbZV07dmFyIHQ9Z2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKTt0JiZ0LnNlbmQoImRvbSIse2FjdGlvbjoicmVtb3ZlRXZlbnQifSxbdGhpcy5yZWYsZV0pfX0sZS5wcm90b3R5cGUuZmlyZUV2ZW50PWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBpPW51bGwsbz0hMSxhPXRoaXMuZXZlbnRbdF07aWYoYSYmZSl7Y2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coIltmaXJlRXZlbnRdKCIrdGhpcy5kb2NJZCsiLCIrdGhpcy50eXBlKyIsIit0aGlzLnJlZisnKSBGaXJlICInK3QrJyIgZXZlbnQgb24gPCcrdGhpcy50eXBlKyI+ICgiK3RoaXMucmVmKyIpLiIpO3ZhciBzPWEuaGFuZGxlcjtlLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbigpe289ITB9O3RyeXtpPXImJnIucGFyYW1zP3MuY2FsbC5hcHBseShzLFt0aGlzXS5jb25jYXQoci5wYXJhbXMsW2VdKSk6cy5jYWxsKHRoaXMsZSl9Y2F0Y2goZSl7dGhyb3cgY29uc29sZS5lcnJvcignW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGludm9rZSB0aGUgZXZlbnQgaGFuZGxlciBvZiAiJyt0KyciIG9uICcrdGhpcy50eXBlKyIgKCIrdGhpcy5yZWYrIik6XG4gIitlLnRvU3RyaW5nKCkpLGV9fXJldHVybiFvJiZuJiYtMSE9PUJVQkJMRV9FVkVOVFMuaW5kZXhPZih0KSYmdGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuZmlyZUV2ZW50JiYoZS5jdXJyZW50VGFyZ2V0PXRoaXMucGFyZW50Tm9kZSx0aGlzLnBhcmVudE5vZGUuZmlyZUV2ZW50KHQsZSxuKSksaX0sZS5wcm90b3R5cGUudG9TdHlsZT1mdW5jdGlvbigpe3ZhciBlPU9iamVjdC5hc3NpZ24oe30sdGhpcy5jbGFzc1N0eWxlKSx0PXRoaXMuc3R5bGU7Zm9yKHZhciBuIGluIHQpe3ZhciByPXRbbl07ZVtuXT0iIj09PXImJm4gaW4gdGhpcy5jbGFzc1N0eWxlP3RoaXMuY2xhc3NTdHlsZVtuXTpyfXJldHVybiBlfSxlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9ITEpO3ZhciB0PXtyZWY6dGhpcy5yZWYudG9TdHJpbmcoKSx0eXBlOnRoaXMudHlwZSxhdHRyOnRoaXMuYXR0cixzdHlsZTpub3JtYWxpemVVbml0KHRoaXMudG9TdHlsZSgpKX07dGhpcy5jbGFzc0xpc3QmJnRoaXMuY2xhc3NMaXN0Lmxlbmd0aCYmKHQuY2xhc3M9dGhpcy5jbGFzc0xpc3Quam9pbigiICIpKTt2YXIgbj1bXTtmb3IodmFyIHIgaW4gdGhpcy5ldmVudCl7dmFyIGk9dGhpcy5ldmVudFtyXS5wYXJhbXM7aT9uLnB1c2goe3R5cGU6cixwYXJhbXM6aX0pOm4ucHVzaChyKX1yZXR1cm4gbi5sZW5ndGgmJih0LmV2ZW50PW4pLCFlJiZ0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgmJih0LmNoaWxkcmVuPXRoaXMucHVyZUNoaWxkcmVuLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS50b0pTT04oKX0pKSx0fSxlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiI8Iit0aGlzLnR5cGUrIiBhdHRyPSIrSlNPTi5zdHJpbmdpZnkodGhpcy5hdHRyKSsiIHN0eWxlPSIrSlNPTi5zdHJpbmdpZnkodGhpcy50b1N0eWxlKCkpKyI+Iit0aGlzLnB1cmVDaGlsZHJlbi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9TdHJpbmcoKX0pLmpvaW4oIiIpKyI8LyIrdGhpcy50eXBlKyI+In0sZS5wcm90b3R5cGUuc2V0Q2xhc3NMaXN0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7ZS5sZW5ndGg9PT10aGlzLmNsYXNzTGlzdC5sZW5ndGgmJjA9PT1lLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hdC5jbGFzc0xpc3QuaW5jbHVkZXMoZSl9KS5sZW5ndGh8fCh0aGlzLmNsYXNzTGlzdD1lLHRoaXMucGFyZW50Tm9kZSYmdGhpcy5jb21wdXRlQ2xhc3NMaXN0KCkpfSxlLnByb3RvdHlwZS5zZXRTdHlsZXNoZWV0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7ZS5sZW5ndGg9PT10aGlzLnN0eWxlc2hlZXQubGVuZ3RoJiYwPT09ZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIXQuc3R5bGVzaGVldC5pbmNsdWRlcyhlKX0pLmxlbmd0aHx8KHRoaXMuc3R5bGVzaGVldD1lLHRoaXMuY2xhc3NMaXN0Lmxlbmd0aCYmdGhpcy5wYXJlbnROb2RlJiZ0aGlzLmNvbXB1dGVDbGFzc0xpc3QoKSl9LGUucHJvdG90eXBlLmNvbXB1dGVDaGlsZHJlbkNsYXNzTGlzdD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuY2hpbGRyZW4scj10fHxlLGk9cj9uLmluZGV4T2Yocik6MCxvPW4ubGVuZ3RoLTE7Zm9yKCFlfHxlLmNsYXNzTGlzdCYmZS5jbGFzc0xpc3QubGVuZ3RofHwobz10P2ktMTppKTswPD1pJiZpPD1vO2krKyl7dmFyIGE9bltpXTthLmNvbXB1dGVDbGFzc0xpc3QmJmEuY29tcHV0ZUNsYXNzTGlzdCgpfX0sZS5wcm90b3R5cGUuY29tcHV0ZUNsYXNzTGlzdD1mdW5jdGlvbigpe3ZhciB1PXRoaXMsZT10aGlzLmNsYXNzTGlzdCx0PXRoaXMuc3R5bGVzaGVldCxwPXt9LGg9e307ZnVuY3Rpb24gbChlLHQpe3ZhciBuPXQmJnQuY2xhc3NMaXN0O3JldHVybiBuJiZuLmluY2x1ZGVzKGUpfXQuZm9yRWFjaChmdW5jdGlvbihuLGYpe2UuZm9yRWFjaChmdW5jdGlvbihlKXtpZigoblsiQFZFUlNJT04iXXx8MSk8Mil7dmFyIHQ9bltlXTt0JiZPYmplY3QuYXNzaWduKHAsdCl9ZWxzZXt2YXIgYz1uWyIuIitlXTtjJiZPYmplY3Qua2V5cyhjKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PXU7aWYoZSlmb3IodmFyIG49ZS5zcGxpdCgiLiIpLHI9bi5sZW5ndGgtMTswPHI7ci0tKXt2YXIgaT1uW3JdLG89aVtpLmxlbmd0aC0xXSxhPWkucmVwbGFjZSgvWyt+PiBdJC8sIiIpO2lmKCJ+Ij09PW98fCIgIj09PW8pe2Zvcih2YXIgcz0ifiI9PT1vPyJwcmV2aW91c1NpYmxpbmciOiJwYXJlbnROb2RlIjt0JiYhbChhLHQ9dFtzXSk7KTtpZighdClyZXR1cm59ZWxzZSBpZigiPiI9PT1vP3Q9dCYmdC5wYXJlbnROb2RlOiIrIj09PW8mJih0PXQmJnQucHJldmlvdXNTaWJsaW5nKSwhbChhLHQpKXJldHVybn12YXIgZD1jW2VdO09iamVjdC5rZXlzKGQpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZFtlXSxuPXRbMF0scj10WzFdLGk9dFsyXSxvPXRbM10sYT1bcixpLGYsb10scz1oW2VdLGM9ITA7aWYocylmb3IodmFyIHU9MDt1PHMubGVuZ3RoO3UrKyl7dmFyIGw9YVt1XS1zW3VdO2lmKDAhPT1sKXtjPTA8bDticmVha319YyYmKHBbZV09bixoW2VdPWEpfSl9KX19KX0pLHRoaXMuc2V0Q2xhc3NTdHlsZShwKSx0aGlzLmNvbXB1dGVDaGlsZHJlbkNsYXNzTGlzdCgpfSxlfShOb2RlKTtmdW5jdGlvbiBub3JtYWxpemVQcmltaXRpdmUoZSl7dmFyIHQ9dHlwb2YoZSk7c3dpdGNoKHQpe2Nhc2UiVW5kZWZpbmVkIjpjYXNlIk51bGwiOnJldHVybiIiO2Nhc2UiUmVnRXhwIjpyZXR1cm4gZS50b1N0cmluZygpO2Nhc2UiRGF0ZSI6cmV0dXJuIGUudG9JU09TdHJpbmcoKTtjYXNlIk51bWJlciI6Y2FzZSJTdHJpbmciOmNhc2UiQm9vbGVhbiI6Y2FzZSJBcnJheSI6Y2FzZSJPYmplY3QiOnJldHVybiBlO2Nhc2UiQXJyYXlCdWZmZXIiOnJldHVybnsiQHR5cGUiOiJiaW5hcnkiLGRhdGFUeXBlOnQsYmFzZTY0OmJ1ZmZlclRvQmFzZTY0KGUpfTtjYXNlIkludDhBcnJheSI6Y2FzZSJVaW50OEFycmF5IjpjYXNlIlVpbnQ4Q2xhbXBlZEFycmF5IjpjYXNlIkludDE2QXJyYXkiOmNhc2UiVWludDE2QXJyYXkiOmNhc2UiSW50MzJBcnJheSI6Y2FzZSJVaW50MzJBcnJheSI6Y2FzZSJGbG9hdDMyQXJyYXkiOmNhc2UiRmxvYXQ2NEFycmF5IjpyZXR1cm57IkB0eXBlIjoiYmluYXJ5IixkYXRhVHlwZTp0LGJhc2U2NDpidWZmZXJUb0Jhc2U2NChlLmJ1ZmZlcil9O2RlZmF1bHQ6cmV0dXJuIEpTT04uc3RyaW5naWZ5KGUpfX1zZXRFbGVtZW50KEVsZW1lbnQpO3ZhciBmYWxsYmFjaz1mdW5jdGlvbigpe30sVGFza0NlbnRlcj1mdW5jdGlvbihlLHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpbnN0YW5jZUlkIix7ZW51bWVyYWJsZTohMCx2YWx1ZTpTdHJpbmcoZSl9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY2FsbGJhY2tNYW5hZ2VyIix7ZW51bWVyYWJsZTohMCx2YWx1ZTpuZXcgQ2FsbGJhY2tNYW5hZ2VyKGUpfSksZmFsbGJhY2s9dHx8ZnVuY3Rpb24oKXt9fTtmdW5jdGlvbiBpbml0JDEoKXt2YXIgZT17Y3JlYXRlRmluaXNoOmdsb2JhbC5jYWxsQ3JlYXRlRmluaXNoLHVwZGF0ZUZpbmlzaDpnbG9iYWwuY2FsbFVwZGF0ZUZpbmlzaCxyZWZyZXNoRmluaXNoOmdsb2JhbC5jYWxsUmVmcmVzaEZpbmlzaCxjcmVhdGVCb2R5Omdsb2JhbC5jYWxsQ3JlYXRlQm9keSxhZGRFbGVtZW50Omdsb2JhbC5jYWxsQWRkRWxlbWVudCxyZW1vdmVFbGVtZW50Omdsb2JhbC5jYWxsUmVtb3ZlRWxlbWVudCxtb3ZlRWxlbWVudDpnbG9iYWwuY2FsbE1vdmVFbGVtZW50LHVwZGF0ZUF0dHJzOmdsb2JhbC5jYWxsVXBkYXRlQXR0cnMsdXBkYXRlU3R5bGU6Z2xvYmFsLmNhbGxVcGRhdGVTdHlsZSxhZGRFdmVudDpnbG9iYWwuY2FsbEFkZEV2ZW50LHJlbW92ZUV2ZW50Omdsb2JhbC5jYWxsUmVtb3ZlRXZlbnQsX191cGRhdGVDb21wb25lbnREYXRhOmdsb2JhbC5fX3VwZGF0ZUNvbXBvbmVudERhdGF9LHQ9VGFza0NlbnRlci5wcm90b3R5cGUsbj1mdW5jdGlvbihuKXt2YXIgcj1lW25dO3Rbbl09cj9mdW5jdGlvbihlLHQpe3JldHVybiByLmFwcGx5KHZvaWQgMCxbZV0uY29uY2F0KHQpKX06ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZmFsbGJhY2soZSxbe21vZHVsZToiZG9tIixtZXRob2Q6bixhcmdzOnR9XSwiLTEiKX19O2Zvcih2YXIgciBpbiBlKW4ocik7dC5jb21wb25lbnRIYW5kbGVyPWdsb2JhbC5jYWxsTmF0aXZlQ29tcG9uZW50fHxmdW5jdGlvbihlLHQsbixyLGkpe3JldHVybiBmYWxsYmFjayhlLFt7Y29tcG9uZW50OmkuY29tcG9uZW50LHJlZjp0LG1ldGhvZDpuLGFyZ3M6cn1dKX0sdC5tb2R1bGVIYW5kbGVyPWdsb2JhbC5jYWxsTmF0aXZlTW9kdWxlfHxmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gZmFsbGJhY2soZSxbe21vZHVsZTp0LG1ldGhvZDpuLGFyZ3M6cn1dKX19ZnVuY3Rpb24gZmlyZUV2ZW50KGUsdCxuLHIsaSxvKXt2YXIgYT1lLmdldFJlZih0KTtyZXR1cm4gYT9lLmZpcmVFdmVudChhLG4scixpLG8pOnI/KHIuX25vZGVJZD10LGUuZmlyZUV2ZW50KGUuZ2V0UmVmKCJfZG9jdW1lbnRFbGVtZW50IiksbixyLGksbykpOnZvaWQgMH1mdW5jdGlvbiBjYWxsYmFjayhlLHQsbixyKXtyZXR1cm4gZS50YXNrQ2VudGVyLmNhbGxiYWNrKHQsbixyKX1mdW5jdGlvbiBjb21wb25lbnRIb29rKGUsdCxuLHIsaSl7aWYoIWV8fCFlLnRhc2tDZW50ZXIpcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1tKUyBGcmFtZXdvcmtdIENhblwndCBmaW5kICJkb2N1bWVudCIgb3IgInRhc2tDZW50ZXIiLicpLG51bGw7dmFyIG89bnVsbDt0cnl7bz1lLnRhc2tDZW50ZXIudHJpZ2dlckhvb2sodCxuLHIsaSl9Y2F0Y2goZSl7dGhyb3cgY29uc29sZS5lcnJvcignW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIHRyaWdnZXIgdGhlICInK24rIkAiK3IrJyIgaG9vayBvbiAnK3QrIi4iKSxlfXJldHVybiBvfWZ1bmN0aW9uIHJlY2VpdmVUYXNrcyhlLHQpe3ZhciBuPWdldERvYyhlKTtyZXR1cm4gbj9BcnJheS5pc0FycmF5KHQpP3QubWFwKGZ1bmN0aW9uKGUpe3N3aXRjaChlLm1ldGhvZCl7Y2FzZSJjYWxsYmFjayI6cmV0dXJuIGNhbGxiYWNrLmFwcGx5KHZvaWQgMCxbbl0uY29uY2F0KGUuYXJncykpO2Nhc2UiZmlyZUV2ZW50U3luYyI6Y2FzZSJmaXJlRXZlbnQiOnJldHVybiBmaXJlRXZlbnQuYXBwbHkodm9pZCAwLFtuXS5jb25jYXQoZS5hcmdzKSk7Y2FzZSJjb21wb25lbnRIb29rIjpyZXR1cm4gY29tcG9uZW50SG9vay5hcHBseSh2b2lkIDAsW25dLmNvbmNhdChlLmFyZ3MpKX19KTp2b2lkIDA6bmV3IEVycm9yKCJbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gcmVjZWl2ZVRhc2tzLCBpbnN0YW5jZSAoIitlKyIpIGlzIG5vdCBhdmFpbGFibGUuIil9VGFza0NlbnRlci5wcm90b3R5cGUuY2FsbGJhY2s9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLmNhbGxiYWNrTWFuYWdlci5jb25zdW1lKGUsdCxuKX0sVGFza0NlbnRlci5wcm90b3R5cGUucmVnaXN0ZXJIb29rPWZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoO24tLTspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuKGU9dGhpcy5jYWxsYmFja01hbmFnZXIpLnJlZ2lzdGVySG9vay5hcHBseShlLHQpfSxUYXNrQ2VudGVyLnByb3RvdHlwZS50cmlnZ2VySG9vaz1mdW5jdGlvbigpe2Zvcih2YXIgZSx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09YXJndW1lbnRzW25dO3JldHVybihlPXRoaXMuY2FsbGJhY2tNYW5hZ2VyKS50cmlnZ2VySG9vay5hcHBseShlLHQpfSxUYXNrQ2VudGVyLnByb3RvdHlwZS51cGRhdGVEYXRhPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLnNlbmQoIm1vZHVsZSIse21vZHVsZToiZG9tIixtZXRob2Q6InVwZGF0ZUNvbXBvbmVudERhdGEifSxbZSx0LG5dKX0sVGFza0NlbnRlci5wcm90b3R5cGUuZGVzdHJveUNhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FsbGJhY2tNYW5hZ2VyLmNsb3NlKCl9LFRhc2tDZW50ZXIucHJvdG90eXBlLm5vcm1hbGl6ZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7dm9pZCAwPT09dCYmKHQ9ITEpO3ZhciByPXR5cG9mKGUpO2lmKGUmJmUgaW5zdGFuY2VvZiBFbGVtZW50KXJldHVybiBlLnJlZjtpZihlJiZlLl9pc1Z1ZSYmZS4kZWwgaW5zdGFuY2VvZiBFbGVtZW50KXJldHVybiBlLiRlbC5yZWY7aWYoIkZ1bmN0aW9uIj09PXIpcmV0dXJuIHRoaXMuY2FsbGJhY2tNYW5hZ2VyLmFkZChlKS50b1N0cmluZygpO2lmKHQpe2lmKCJPYmplY3QiPT09cil7dmFyIGk9e307Zm9yKHZhciBvIGluIGUpaVtvXT1uLm5vcm1hbGl6ZShlW29dLCEwKTtyZXR1cm4gaX1pZigiQXJyYXkiPT09cilyZXR1cm4gZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIG4ubm9ybWFsaXplKGUsITApfSl9cmV0dXJuIGUmJmUucmVmJiZlWyJbW1ZpcnR1YWxFbGVtZW50XV0iXT9lLnJlZjpub3JtYWxpemVQcmltaXRpdmUoZSl9LFRhc2tDZW50ZXIucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dGhpcyxvPXQuYWN0aW9uLGE9dC5jb21wb25lbnQscz10LnJlZixjPXQubW9kdWxlLHU9dC5tZXRob2Q7c3dpdGNoKG49bi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGkubm9ybWFsaXplKGUpfSksIk9iamVjdCI9PT10eXBvZihyKSYmKHI9dGhpcy5ub3JtYWxpemUociwhMCkpLGUpe2Nhc2UiZG9tIjpyZXR1cm4gY2hlY2tMZXZlbCgiZGVidWciKSYmZGVidWdMb2coIlt0YXNrXSgiK3RoaXMuaW5zdGFuY2VJZCsiLCIrdGhpcy50eXBlKyIsIitvKyIpICIrSlNPTi5zdHJpbmdpZnkobikpLHRoaXNbb10odGhpcy5pbnN0YW5jZUlkLG4pO2Nhc2UiY29tcG9uZW50IjpyZXR1cm4gdGhpcy5jb21wb25lbnRIYW5kbGVyKHRoaXMuaW5zdGFuY2VJZCxzLHUsbixPYmplY3QuYXNzaWduKHtjb21wb25lbnQ6YX0scikpO2RlZmF1bHQ6cmV0dXJuIGNoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbdGFza10oIit0aGlzLmluc3RhbmNlSWQrIiwiK2MrIiwiK3UrIikgIitKU09OLnN0cmluZ2lmeShuKSksdGhpcy5tb2R1bGVIYW5kbGVyKHRoaXMuaW5zdGFuY2VJZCxjLHUsbixyKX19LFRhc2tDZW50ZXIucHJvdG90eXBlLmNhbGxET009ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpc1tlXSh0aGlzLmluc3RhbmNlSWQsdCl9LFRhc2tDZW50ZXIucHJvdG90eXBlLmNhbGxDb21wb25lbnQ9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMuY29tcG9uZW50SGFuZGxlcih0aGlzLmluc3RhbmNlSWQsZSx0LG4scil9LFRhc2tDZW50ZXIucHJvdG90eXBlLmNhbGxNb2R1bGU9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMubW9kdWxlSGFuZGxlcih0aGlzLmluc3RhbmNlSWQsZSx0LG4scil9O3ZhciB3ZWV4TW9kdWxlcz17fTtmdW5jdGlvbiByZWdpc3Rlck1vZHVsZXMoZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWZ1bmN0aW9uKHQpe2hhc093bih3ZWV4TW9kdWxlcyx0KXx8KHdlZXhNb2R1bGVzW3RdPXt9KSxBcnJheS5pc0FycmF5KGVbdF0pJiZlW3RdLmZvckVhY2goZnVuY3Rpb24oZSl7InN0cmluZyI9PXR5cGVvZiBlP3dlZXhNb2R1bGVzW3RdW2VdPSEwOmlzUGxhaW5PYmplY3QoZSkmJiJzdHJpbmciPT10eXBlb2YgZS5uYW1lJiYod2VleE1vZHVsZXNbdF1bZS5uYW1lXT1lLmFyZ3N8fFtdKX0pfTtmb3IodmFyIG4gaW4gZSl0KG4pfWZ1bmN0aW9uIGlzUmVnaXN0ZXJlZE1vZHVsZShlLHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD8hKCF3ZWV4TW9kdWxlc1tlXXx8IXdlZXhNb2R1bGVzW2VdW3RdKTohIXdlZXhNb2R1bGVzW2VdfWZ1bmN0aW9uIGdldE1vZHVsZURlc2NyaXB0aW9uKGUpe3JldHVybiB3ZWV4TW9kdWxlc1tlXX12YXIgd2VleENvbXBvbmVudHM9e307ZnVuY3Rpb24gcmVnaXN0ZXJDb21wb25lbnRzKGUpe0FycmF5LmlzQXJyYXkoZSkmJmUuZm9yRWFjaChmdW5jdGlvbihlKXtlJiYoInN0cmluZyI9PXR5cGVvZiBlP3dlZXhDb21wb25lbnRzW2VdPSEwOmlzUGxhaW5PYmplY3QoZSkmJiJzdHJpbmciPT10eXBlb2YgZS50eXBlJiZyZWdpc3RlckVsZW1lbnQoKHdlZXhDb21wb25lbnRzW2UudHlwZV09ZSkudHlwZSxlLm1ldGhvZHMpKX0pfWZ1bmN0aW9uIGlzUmVnaXN0ZXJlZENvbXBvbmVudChlKXtyZXR1cm4hIXdlZXhDb21wb25lbnRzW2VdfXZhciBzZXJ2aWNlcz1bXTtmdW5jdGlvbiByZWdpc3RlcihlLHQpe2hhcyhlKT9jb25zb2xlLndhcm4oJ1NlcnZpY2UgIicrZSsnIiBoYXMgYmVlbiByZWdpc3RlcmVkIGFscmVhZHkhJyk6KHQ9T2JqZWN0LmFzc2lnbih7fSx0KSxzZXJ2aWNlcy5wdXNoKHtuYW1lOmUsb3B0aW9uczp0fSkpfWZ1bmN0aW9uIHVucmVnaXN0ZXIobil7c2VydmljZXMuc29tZShmdW5jdGlvbihlLHQpe2lmKGUubmFtZT09PW4pcmV0dXJuIHNlcnZpY2VzLnNwbGljZSh0LDEpLCEwfSl9ZnVuY3Rpb24gaGFzKGUpe3JldHVybiAwPD1pbmRleE9mKGUpfWZ1bmN0aW9uIGluZGV4T2YoZSl7cmV0dXJuIHNlcnZpY2VzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5uYW1lfSkuaW5kZXhPZihlKX12YXIgQ29tbWVudD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKSx0aGlzLm5vZGVUeXBlPTgsdGhpcy5ub2RlSWQ9dW5pcXVlSWQoKSx0aGlzLnJlZj10aGlzLm5vZGVJZCx0aGlzLnR5cGU9ImNvbW1lbnQiLHRoaXMudmFsdWU9ZSx0aGlzLmNoaWxkcmVuPVtdLHRoaXMucHVyZUNoaWxkcmVuPVtdfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksKChlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSkuY29uc3RydWN0b3I9ZSkucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIlx4M2MhLS0gIit0aGlzLnZhbHVlKyIgLS1ceDNlIn0sZX0oTm9kZSk7ZnVuY3Rpb24gY3JlYXRlQWN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PVtdKSx7bW9kdWxlOiJkb20iLG1ldGhvZDplLGFyZ3M6dH19dmFyIExpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7dGhpcy5pZD1lLHRoaXMuYmF0Y2hlZD0hMSx0aGlzLnVwZGF0ZXM9W10sImZ1bmN0aW9uIj09dHlwZW9mIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImhhbmRsZXIiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp0fSk6Y29uc29sZS5lcnJvcigiW0pTIFJ1bnRpbWVdIGludmFsaWQgcGFyYW1ldGVyLCBoYW5kbGVyIG11c3QgYmUgYSBmdW5jdGlvbiIpfTtMaXN0ZW5lci5wcm90b3R5cGUuY3JlYXRlRmluaXNoPWZ1bmN0aW9uKGUpe3JldHVybigwLHRoaXMuaGFuZGxlcikoW2NyZWF0ZUFjdGlvbigiY3JlYXRlRmluaXNoIildLGUpfSxMaXN0ZW5lci5wcm90b3R5cGUudXBkYXRlRmluaXNoPWZ1bmN0aW9uKGUpe3JldHVybigwLHRoaXMuaGFuZGxlcikoW2NyZWF0ZUFjdGlvbigidXBkYXRlRmluaXNoIildLGUpfSxMaXN0ZW5lci5wcm90b3R5cGUucmVmcmVzaEZpbmlzaD1mdW5jdGlvbihlKXtyZXR1cm4oMCx0aGlzLmhhbmRsZXIpKFtjcmVhdGVBY3Rpb24oInJlZnJlc2hGaW5pc2giKV0sZSl9LExpc3RlbmVyLnByb3RvdHlwZS5jcmVhdGVCb2R5PWZ1bmN0aW9uKGUpe3ZhciB0PWUudG9KU09OKCksbj10LmNoaWxkcmVuO2RlbGV0ZSB0LmNoaWxkcmVuO3ZhciByPVtjcmVhdGVBY3Rpb24oImNyZWF0ZUJvZHkiLFt0XSldO3JldHVybiBuJiZyLnB1c2guYXBwbHkocixuLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gY3JlYXRlQWN0aW9uKCJhZGRFbGVtZW50IixbdC5yZWYsZSwtMV0pfSkpLHRoaXMuYWRkQWN0aW9ucyhyKX0sTGlzdGVuZXIucHJvdG90eXBlLmFkZEVsZW1lbnQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiAwPD1ufHwobj0tMSksdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigiYWRkRWxlbWVudCIsW3QsZS50b0pTT04oKSxuXSkpfSxMaXN0ZW5lci5wcm90b3R5cGUucmVtb3ZlRWxlbWVudD1mdW5jdGlvbihlKXtpZihBcnJheS5pc0FycmF5KGUpKXt2YXIgdD1lLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gY3JlYXRlQWN0aW9uKCJyZW1vdmVFbGVtZW50IixbZV0pfSk7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyh0KX1yZXR1cm4gdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigicmVtb3ZlRWxlbWVudCIsW2VdKSl9LExpc3RlbmVyLnByb3RvdHlwZS5tb3ZlRWxlbWVudD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhjcmVhdGVBY3Rpb24oIm1vdmVFbGVtZW50IixbZSx0LG5dKSl9LExpc3RlbmVyLnByb3RvdHlwZS5zZXRBdHRyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj17fTtyZXR1cm4gclt0XT1uLHRoaXMuYWRkQWN0aW9ucyhjcmVhdGVBY3Rpb24oInVwZGF0ZUF0dHJzIixbZSxyXSkpfSxMaXN0ZW5lci5wcm90b3R5cGUuc2V0U3R5bGU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXt9O3JldHVybiByW3RdPW4sdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigidXBkYXRlU3R5bGUiLFtlLHJdKSl9LExpc3RlbmVyLnByb3RvdHlwZS5zZXRTdHlsZXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigidXBkYXRlU3R5bGUiLFtlLHRdKSl9LExpc3RlbmVyLnByb3RvdHlwZS5hZGRFdmVudD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmFkZEFjdGlvbnMoY3JlYXRlQWN0aW9uKCJhZGRFdmVudCIsW2UsdF0pKX0sTGlzdGVuZXIucHJvdG90eXBlLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhjcmVhdGVBY3Rpb24oInJlbW92ZUV2ZW50IixbZSx0XSkpfSxMaXN0ZW5lci5wcm90b3R5cGUuaGFuZGxlcj1mdW5jdGlvbihlLHQpe3JldHVybiB0JiZ0KCl9LExpc3RlbmVyLnByb3RvdHlwZS5hZGRBY3Rpb25zPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMudXBkYXRlcyxuPXRoaXMuaGFuZGxlcjtpZihBcnJheS5pc0FycmF5KGUpfHwoZT1bZV0pLCF0aGlzLmJhdGNoZWQpcmV0dXJuIG4oZSk7dC5wdXNoLmFwcGx5KHQsZSl9O3ZhciBoYW5kbGVyTWFwPXtjcmVhdGVCb2R5OiJjYWxsQ3JlYXRlQm9keSIsYWRkRWxlbWVudDoiY2FsbEFkZEVsZW1lbnQiLHJlbW92ZUVsZW1lbnQ6ImNhbGxSZW1vdmVFbGVtZW50Iixtb3ZlRWxlbWVudDoiY2FsbE1vdmVFbGVtZW50Iix1cGRhdGVBdHRyczoiY2FsbFVwZGF0ZUF0dHJzIix1cGRhdGVTdHlsZToiY2FsbFVwZGF0ZVN0eWxlIixhZGRFdmVudDoiY2FsbEFkZEV2ZW50IixyZW1vdmVFdmVudDoiY2FsbFJlbW92ZUV2ZW50In07ZnVuY3Rpb24gY3JlYXRlSGFuZGxlcihyLGUpe3ZhciBpPWV8fGdsb2JhbC5jYWxsTmF0aXZlO3JldHVybiJmdW5jdGlvbiIhPXR5cGVvZiBpJiZjb25zb2xlLmVycm9yKCJbSlMgUnVudGltZV0gbm8gZGVmYXVsdCBoYW5kbGVyIiksZnVuY3Rpb24oZSl7QXJyYXkuaXNBcnJheShlKXx8KGU9W2VdKTtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyl7dmFyIG49ZGlzcGF0Y2hUYXNrKHIsZVt0XSxpKTtpZigtMT09PW4pcmV0dXJuIG59fX1mdW5jdGlvbiBoYXNBdmFpbGFibGVIYW5kbGVyKGUsdCl7cmV0dXJuImRvbSI9PT1lJiZoYW5kbGVyTWFwW3RdJiYiZnVuY3Rpb24iPT10eXBlb2YgZ2xvYmFsW2hhbmRsZXJNYXBbdF1dfWZ1bmN0aW9uIGRpc3BhdGNoVGFzayhlLHQsbil7dmFyIHI9dC5tb2R1bGUsaT10Lm1ldGhvZCxvPXQuYXJncztyZXR1cm4gaGFzQXZhaWxhYmxlSGFuZGxlcihyLGkpP2dsb2JhbFtoYW5kbGVyTWFwW2ldXS5hcHBseShnbG9iYWwsW2VdLmNvbmNhdChvLFsiLTEiXSkpOm4oZSxbdF0sIi0xIil9ZnVuY3Rpb24gdXBkYXRlRWxlbWVudChlLHQpe3ZhciBuPXQuYXR0cnN8fHt9O2Zvcih2YXIgciBpbiBuKWUuc2V0QXR0cihyLG5bcl0sITApO3ZhciBpPXQuc3R5bGV8fHt9O2Zvcih2YXIgbyBpbiBpKWUuc2V0U3R5bGUobyxpW29dLCEwKX12YXIgRG9jdW1lbnQ9ZnVuY3Rpb24gZSh0LG4scil7dD10P3QudG9TdHJpbmcoKToiIix0aGlzLmlkPXQsdGhpcy5VUkw9bixhZGREb2ModCx0aGlzKSx0aGlzLm5vZGVNYXA9e307dmFyIGk9ZS5MaXN0ZW5lcnx8TGlzdGVuZXI7dGhpcy5saXN0ZW5lcj1uZXcgaSh0LHJ8fGNyZWF0ZUhhbmRsZXIodCxlLmhhbmRsZXIpKSx0aGlzLnRhc2tDZW50ZXI9bmV3IFRhc2tDZW50ZXIodCxyP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGgtMTswPG4tLTspdFtuXT1hcmd1bWVudHNbbisxXTtyZXR1cm4gci5hcHBseSh2b2lkIDAsdCl9OmUuaGFuZGxlciksdGhpcy5jcmVhdGVEb2N1bWVudEVsZW1lbnQoKX07RG9jdW1lbnQucHJvdG90eXBlLmdldFJlZj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5ub2RlTWFwW2VdfSxEb2N1bWVudC5wcm90b3R5cGUub3Blbj1mdW5jdGlvbigpe3RoaXMubGlzdGVuZXIuYmF0Y2hlZD0hMX0sRG9jdW1lbnQucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dGhpcy5saXN0ZW5lci5iYXRjaGVkPSEwfSxEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlRG9jdW1lbnRFbGVtZW50PWZ1bmN0aW9uKCl7dmFyIG49dGhpcztpZighdGhpcy5kb2N1bWVudEVsZW1lbnQpe3ZhciBlPW5ldyBFbGVtZW50KCJkb2N1bWVudCIpO2UuZG9jSWQ9dGhpcy5pZCxlLm93bmVyRG9jdW1lbnQ9dGhpcyxlLnJvbGU9ImRvY3VtZW50RWxlbWVudCIsZS5kZXB0aD0wLGUucmVmPSJfZG9jdW1lbnRFbGVtZW50Iix0aGlzLm5vZGVNYXAuX2RvY3VtZW50RWxlbWVudD1lLHRoaXMuZG9jdW1lbnRFbGVtZW50PWUsT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImFwcGVuZENoaWxkIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oZSl7YXBwZW5kQm9keShuLGUpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJpbnNlcnRCZWZvcmUiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpmdW5jdGlvbihlLHQpe2FwcGVuZEJvZHkobixlLHQpfX0pLGNoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCdDcmVhdGUgZG9jdW1lbnQgZWxlbWVudCAoaWQ6ICInK2UuZG9jSWQrJyIsIHJlZjogIicrZS5yZWYrJyIpJyl9cmV0dXJuIHRoaXMuZG9jdW1lbnRFbGVtZW50fSxEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlQm9keT1mdW5jdGlvbihlLHQpe2lmKCF0aGlzLmJvZHkpe3ZhciBuPW5ldyBFbGVtZW50KGUsdCk7c2V0Qm9keSh0aGlzLG4pLGNoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbY3JlYXRlQm9keV0oIit0aGlzLmlkKyIsIituLnR5cGUrIiwiK24ucmVmKyIpICgiK0pTT04uc3RyaW5naWZ5KG4udG9KU09OKCEwKSkrIikuIil9cmV0dXJuIHRoaXMuYm9keX0sRG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgRWxlbWVudChlLHQpO3JldHVybiBjaGVja0xldmVsKCJkZWJ1ZyIpJiZkZWJ1Z0xvZygiW2NyZWF0ZUVsZW1lbnRdKCIrdGhpcy5pZCsiLCIrbi50eXBlKyIsIituLnJlZisiKSAoIitKU09OLnN0cmluZ2lmeShuLnRvSlNPTighMCkpKyIpLiIpLG59LERvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVDb21tZW50PWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgQ29tbWVudChlKX0sRG9jdW1lbnQucHJvdG90eXBlLmZpcmVFdmVudD1mdW5jdGlvbihlLHQsbixyLGkpe2lmKGUpeyhuPW58fHt9KS50eXBlPW4udHlwZXx8dCxuLnRhcmdldD1lLG4uY3VycmVudFRhcmdldD1lLG4udGltZXN0YW1wPURhdGUubm93KCksciYmdXBkYXRlRWxlbWVudChlLHIpO3ZhciBvPSJ3ZWV4IiE9PXRoaXMuX18kY29tcGlsZXJfXyxhPXRoaXMuZ2V0UmVmKCJfcm9vdCIpO2lmKGEmJmEuYXR0cil7dmFyIHM9YS5hdHRyLmJ1YmJsZTtvPSJ0cnVlIj09PXN8fCEwPT09c3x8byYmdm9pZCAwPT09c31yZXR1cm4id2VleCIhPT10aGlzLl9fJGNvbXBpbGVyX18mJihuPXByb2Nlc3NFdmVudChuKSksZS5maXJlRXZlbnQodCxuLG8saSl9fSxEb2N1bWVudC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe2NoZWNrTGV2ZWwoImRlYnVnIikmJmRlYnVnTG9nKCJbZGVzdHJveV0oIit0aGlzLmlkKyIsZG9jdW1lbnQsIit0aGlzLnJlZisnKSBEZXN0cm95IGRvY3VtZW50IChpZDogIicrdGhpcy5pZCsnIiwgVVJMOiAiJyt0aGlzLlVSTCsnIiknKSx0aGlzLnRhc2tDZW50ZXIuZGVzdHJveUNhbGxiYWNrKCksZGVsZXRlIHRoaXMubGlzdGVuZXIsZGVsZXRlIHRoaXMubm9kZU1hcCxkZWxldGUgdGhpcy50YXNrQ2VudGVyLHJlbW92ZURvYyh0aGlzLmlkKX0sRG9jdW1lbnQuaGFuZGxlcj1udWxsO3ZhciBsZXg9e0lucHV0RWxlbWVudERpdjoiPFdoaXRlU3BhY2U+fDxMaW5lVGVybWluYXRvcj58PFJlc2VydmVkV29yZD58PElkZW50aWZpZXI+fDxOdW1lcmljTGl0ZXJhbD58PFB1bmN0dWF0b3I+fDxTdHJpbmdMaXRlcmFsPiIsSW5wdXRFbGVtZW50UmVnRXhwOiI8V2hpdGVTcGFjZT58PExpbmVUZXJtaW5hdG9yPnw8UmVzZXJ2ZWRXb3JkPnw8SWRlbnRpZmllcj58PE51bWVyaWNMaXRlcmFsPnw8UHVuY3R1YXRvcj58PFN0cmluZ0xpdGVyYWw+IixSZXNlcnZlZFdvcmQ6IjxLZXl3b3JkPnw8TnVsbExpdGVyYWw+fDxCb29sZWFuTGl0ZXJhbD4iLFdoaXRlU3BhY2U6L1tcdFx2XGZcdTAwMjBcdTAwQTBcdTE2ODBcdTE4MEVcdTIwMDAtXHUyMDBBXHUyMDJGXHUyMDVmXHUzMDAwXHVGRUZGXS8sTGluZVRlcm1pbmF0b3I6L1tcblxyXHUyMDI4XHUyMDI5XS8sS2V5d29yZDovbmV3KD8hW18kYS16QS1aMC05XSl8dm9pZCg/IVtfJGEtekEtWjAtOV0pfGRlbGV0ZSg/IVtfJGEtekEtWjAtOV0pfGluKD8hW18kYS16QS1aMC05XSl8aW5zdGFuY2VvZig/IVtfJGEtekEtWjAtOV0pfHR5cGVvZig/IVtfJGEtekEtWjAtOV0pLyxOdWxsTGl0ZXJhbDovbnVsbCg/IVtfJGEtekEtWjAtOV0pLyxCb29sZWFuTGl0ZXJhbDovKD86dHJ1ZXxmYWxzZSkoPyFbXyRhLXpBLVowLTldKS8sSWRlbnRpZmllcjovW18kYS16QS1aXVtfJGEtekEtWjAtOV0qLyxQdW5jdHVhdG9yOi9cL3w9PnxcKlwqfD4+Pj18Pj49fDw8PXw9PT18IT09fD4+Pnw8PHwlPXxcKj18LT18XCs9fDw9fD49fD09fCE9fFxePXxcfD18XHxcfHwmJnwmPXw+PnxcK1wrfC0tfFw6fH18XCp8JnxcfHxcXnwhfH58LXxcK3xcP3wlfD18Pnw8fCx8O3xcLig/IVswLTldKXxcXXxcW3xcKXxcKHx7LyxEaXZQdW5jdHVhdG9yOi9cLz18XC8vLE51bWVyaWNMaXRlcmFsOi8oPzowW3hYXVswLTlhLWZBLUZdKnxcLlswLTldK3woPzpbMS05XStbMC05XSp8MCkoPzpcLlswLTldKnxcLik/KSg/OltlRV1bKy1dezAsMX1bMC05XSspPyg/IVtfJGEtekEtWjAtOV0pLyxTdHJpbmdMaXRlcmFsOi8iKD86W14iXG5cXFxyXHUyMDI4XHUyMDI5XXxcXCg/OlsnIlxcYmZucnR2XG5cclx1MjAyOFx1MjAyOV18XHJcbil8XFx4WzAtOWEtZkEtRl17Mn18XFx1WzAtOWEtZkEtRl17NH18XFxbXjAtOXV4JyJcXGJmbnJ0dlxuXFxcclx1MjAyOFx1MjAyOV0pKiJ8Jyg/OlteJ1xuXFxcclx1MjAyOFx1MjAyOV18XFwoPzpbJyJcXGJmbnJ0dlxuXHJcdTIwMjhcdTIwMjldfFxyXG4pfFxceFswLTlhLWZBLUZdezJ9fFxcdVswLTlhLWZBLUZdezR9fFxcW14wLTl1eCciXFxiZm5ydHZcblxcXHJcdTIwMjhcdTIwMjldKSonLyxSZWd1bGFyRXhwcmVzc2lvbkxpdGVyYWw6L1wvKD86XFsoPzpcXFtcc1xTXXxbXlxdXSkqXF18W14qXC9cXFxuXHJcdTIwMjhcdTIwMjldfFxcW15cblxyXHUyMDI4XHUyMDI5XSkoPzpcWyg/OlxcW1xzXFNdfFteXF1dKSpcXXxbXlwvXFxcblxyXHUyMDI4XHUyMDI5XXxcXFteXG5cclx1MjAyOFx1MjAyOV0pKlwvWzAtOWEtekEtWl0qL307ZnVuY3Rpb24gWFJlZ0V4cChyLGUsaSl7dmFyIG89W2VdO3ZhciBhPWZ1bmN0aW9uIG4oZSl7dmFyIHQ9bmV3IFJlZ0V4cDtyZXR1cm4gdC5jb21waWxlKGUucmVwbGFjZSgvPChbXj5dKyk+L2csZnVuY3Rpb24oZSx0KXtyZXR1cm4gclt0XT8oby5wdXNoKHQpLHJbdF1pbnN0YW5jZW9mIFJlZ0V4cD8iKCIrclt0XS5zb3VyY2UrIikiOiIoIituKHJbdF0pLnNvdXJjZSsiKSIpOiIifSksaSksdH0ocltlXSk7dGhpcy5leGVjPWZ1bmN0aW9uKGUpe3ZhciB0PWEuZXhlYyhlKTtpZihudWxsPT10KXJldHVybiBudWxsO2Zvcih2YXIgbj1uZXcgU3RyaW5nKHRbMF0pLHI9MDtyPG8ubGVuZ3RoO3IrKyl0W3JdJiYobltvW3JdXT10W3JdKTtyZXR1cm4gbn0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImxhc3RJbmRleCIse2dldDpmdW5jdGlvbigpe3JldHVybiBhLmxhc3RJbmRleH0sc2V0OmZ1bmN0aW9uKGUpe2EubGFzdEluZGV4PWV9fSl9ZnVuY3Rpb24gTGV4aWNhbFBhcnNlcigpe3ZhciBpLG89bmV3IFhSZWdFeHAobGV4LCJJbnB1dEVsZW1lbnREaXYiLCJnIiksYT1uZXcgWFJlZ0V4cChsZXgsIklucHV0RWxlbWVudFJlZ0V4cCIsImciKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic291cmNlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGl9LHNldDpmdW5jdGlvbihlKXtpPWUsby5sYXN0SW5kZXg9MCxhLmxhc3RJbmRleD0wfX0pLHRoaXMucmVzZXQ9ZnVuY3Rpb24oKXtvLmxhc3RJbmRleD0wLGEubGFzdEluZGV4PTB9LHRoaXMuZ2V0TmV4dFRva2VuPWZ1bmN0aW9uKGUpe3ZhciB0LG49by5sYXN0SW5kZXgscj0odD1lP286YSkuZXhlYyhpKTtpZihyJiZ0Lmxhc3RJbmRleC1uPnIubGVuZ3RoKXRocm93IG5ldyBTeW50YXhFcnJvcigiVW5leHBlY3RlZCB0b2tlbiBJTExFR0FMIik7cmV0dXJuIG8ubGFzdEluZGV4PXQubGFzdEluZGV4LGEubGFzdEluZGV4PXQubGFzdEluZGV4LHJ9fXZhciBydWxlcz17SWRlbnRpZmllck5hbWU6W1siSWRlbnRpZmllciJdXSxMaXRlcmFsOltbIk51bGxMaXRlcmFsIl0sWyJCb29sZWFuTGl0ZXJhbCJdLFsiTnVtZXJpY0xpdGVyYWwiXSxbIlN0cmluZ0xpdGVyYWwiXSxbIlJlZ3VsYXJFeHByZXNzaW9uTGl0ZXJhbCJdXSxQcmltYXJ5RXhwcmVzc2lvbjpbWyJJZGVudGlmaWVyIl0sWyJMaXRlcmFsIl0sWyIoIiwiRXhwcmVzc2lvbiIsIikiXV0sQ2FsbEV4cHJlc3Npb246W1siUHJpbWFyeUV4cHJlc3Npb24iLCJBcmd1bWVudHMiXSxbIkNhbGxFeHByZXNzaW9uIiwiQXJndW1lbnRzIl1dLEFyZ3VtZW50czpbWyIoIiwiKSJdLFsiKCIsIkFyZ3VtZW50TGlzdCIsIikiXV0sQXJndW1lbnRMaXN0OltbIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJdLFsiQXJndW1lbnRMaXN0IiwiLCIsIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJdXSxMZWZ0SGFuZFNpZGVFeHByZXNzaW9uOltbIlByaW1hcnlFeHByZXNzaW9uIl0sWyJDYWxsRXhwcmVzc2lvbiJdXSxVbmFyeUV4cHJlc3Npb246W1siTGVmdEhhbmRTaWRlRXhwcmVzc2lvbiJdLFsidm9pZCIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsiKyIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsiLSIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsifiIsIlVuYXJ5RXhwcmVzc2lvbiJdLFsiISIsIlVuYXJ5RXhwcmVzc2lvbiJdXSxFeHBvbmVudGlhdGlvbkV4cHJlc3Npb246W1siVW5hcnlFeHByZXNzaW9uIl0sWyJFeHBvbmVudGlhdGlvbkV4cHJlc3Npb24iLCIqKiIsIlVuYXJ5RXhwcmVzc2lvbiJdXSxNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb246W1siTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIiwiLyIsIkV4cG9uZW50aWF0aW9uRXhwcmVzc2lvbiJdLFsiRXhwb25lbnRpYXRpb25FeHByZXNzaW9uIl0sWyJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iLCIqIiwiRXhwb25lbnRpYXRpb25FeHByZXNzaW9uIl0sWyJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iLCIlIiwiRXhwb25lbnRpYXRpb25FeHByZXNzaW9uIl1dLEFkZGl0aXZlRXhwcmVzc2lvbjpbWyJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iXSxbIkFkZGl0aXZlRXhwcmVzc2lvbiIsIisiLCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iXSxbIkFkZGl0aXZlRXhwcmVzc2lvbiIsIi0iLCJNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iXV0sU2hpZnRFeHByZXNzaW9uOltbIkFkZGl0aXZlRXhwcmVzc2lvbiJdLFsiU2hpZnRFeHByZXNzaW9uIiwiPDwiLCJBZGRpdGl2ZUV4cHJlc3Npb24iXSxbIlNoaWZ0RXhwcmVzc2lvbiIsIj4+IiwiQWRkaXRpdmVFeHByZXNzaW9uIl0sWyJTaGlmdEV4cHJlc3Npb24iLCI+Pj4iLCJBZGRpdGl2ZUV4cHJlc3Npb24iXV0sUmVsYXRpb25hbEV4cHJlc3Npb246W1siU2hpZnRFeHByZXNzaW9uIl0sWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiIsIjwiLCJTaGlmdEV4cHJlc3Npb24iXSxbIlJlbGF0aW9uYWxFeHByZXNzaW9uIiwiPiIsIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCI8PSIsIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCI+PSIsIlNoaWZ0RXhwcmVzc2lvbiJdLFsiUmVsYXRpb25hbEV4cHJlc3Npb24iLCJpbnN0YW5jZW9mIiwiU2hpZnRFeHByZXNzaW9uIl0sWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiIsImluIiwiU2hpZnRFeHByZXNzaW9uIl1dLEVxdWFsaXR5RXhwcmVzc2lvbjpbWyJSZWxhdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXF1YWxpdHlFeHByZXNzaW9uIiwiPT0iLCJSZWxhdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXF1YWxpdHlFeHByZXNzaW9uIiwiIT0iLCJSZWxhdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXF1YWxpdHlFeHByZXNzaW9uIiwiPT09IiwiUmVsYXRpb25hbEV4cHJlc3Npb24iXSxbIkVxdWFsaXR5RXhwcmVzc2lvbiIsIiE9PSIsIlJlbGF0aW9uYWxFeHByZXNzaW9uIl1dLEJpdHdpc2VBTkRFeHByZXNzaW9uOltbIkVxdWFsaXR5RXhwcmVzc2lvbiJdLFsiQml0d2lzZUFOREV4cHJlc3Npb24iLCImIiwiRXF1YWxpdHlFeHByZXNzaW9uIl1dLEJpdHdpc2VYT1JFeHByZXNzaW9uOltbIkJpdHdpc2VBTkRFeHByZXNzaW9uIl0sWyJCaXR3aXNlWE9SRXhwcmVzc2lvbiIsIl4iLCJCaXR3aXNlQU5ERXhwcmVzc2lvbiJdXSxCaXR3aXNlT1JFeHByZXNzaW9uOltbIkJpdHdpc2VYT1JFeHByZXNzaW9uIl0sWyJCaXR3aXNlT1JFeHByZXNzaW9uIiwifCIsIkJpdHdpc2VYT1JFeHByZXNzaW9uIl1dLExvZ2ljYWxBTkRFeHByZXNzaW9uOltbIkJpdHdpc2VPUkV4cHJlc3Npb24iXSxbIkxvZ2ljYWxBTkRFeHByZXNzaW9uIiwiJiYiLCJCaXR3aXNlT1JFeHByZXNzaW9uIl1dLExvZ2ljYWxPUkV4cHJlc3Npb246W1siTG9naWNhbEFOREV4cHJlc3Npb24iXSxbIkxvZ2ljYWxPUkV4cHJlc3Npb24iLCJ8fCIsIkxvZ2ljYWxBTkRFeHByZXNzaW9uIl1dLENvbmRpdGlvbmFsRXhwcmVzc2lvbjpbWyJMb2dpY2FsT1JFeHByZXNzaW9uIl0sWyJMb2dpY2FsT1JFeHByZXNzaW9uIiwiPyIsIkxvZ2ljYWxPUkV4cHJlc3Npb24iLCI6IiwiTG9naWNhbE9SRXhwcmVzc2lvbiJdXSxFeHByZXNzaW9uOltbIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJdLFsiRXhwcmVzc2lvbiIsIiwiLCJDb25kaXRpb25hbEV4cHJlc3Npb24iXV0sUHJvZ3JhbTpbWyJFeHByZXNzaW9uIl1dfTtmdW5jdGlvbiBTeW1ib2wkMShlLHQpe3RoaXMubmFtZT1lLHRoaXMudG9rZW49dCx0aGlzLmNoaWxkTm9kZXM9W10sdGhpcy50b1N0cmluZz1mdW5jdGlvbihlKXtpZihlfHwoZT0iIiksMT09dGhpcy5jaGlsZE5vZGVzLmxlbmd0aClyZXR1cm4gdGhpcy5jaGlsZE5vZGVzWzBdLnRvU3RyaW5nKGUpO2Zvcih2YXIgdD1lK3RoaXMubmFtZSsobnVsbCE9dGhpcy50b2tlbiYmdGhpcy5uYW1lIT10aGlzLnRva2VuPyI6Iit0aGlzLnRva2VuOiIiKSsiXG4iLG49MDtuPHRoaXMuY2hpbGROb2Rlcy5sZW5ndGg7bisrKXQrPXRoaXMuY2hpbGROb2Rlc1tuXS50b1N0cmluZyhlKyIgICAgIik7cmV0dXJuIHR9fWZ1bmN0aW9uIFN5bnRhY3RpY2FsUGFyc2VyKCl7dmFyIGU9e1Byb2dyYW06IiQifSxvPXt9OyFmdW5jdGlvbiBlKG4pe29bSlNPTi5zdHJpbmdpZnkobildPW47Zm9yKHZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG4pO3IubGVuZ3RoOyl7dmFyIGk9ci5zaGlmdCgpO3J1bGVzW2ldJiZydWxlc1tpXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe25bZVswXV18fHIucHVzaChlWzBdKTt2YXIgdD1uO2UuZm9yRWFjaChmdW5jdGlvbihlKXt0W2VdfHwodFtlXT17fSksdD10W2VdfSksbltpXS4kZGl2JiYodC4kZGl2PSEwKSx0LiRyZWR1Y2U9aSx0LiRjb3VudD1lLmxlbmd0aH0pfWZvcih2YXIgdCBpbiBuKSJvYmplY3QiIT10eXBlb2Ygblt0XXx8IiQiPT10LmNoYXJBdCgwKXx8blt0XS4kY2xvc3VyZXx8KG9bSlNPTi5zdHJpbmdpZnkoblt0XSldP25bdF09b1tKU09OLnN0cmluZ2lmeShuW3RdKV06ZShuW3RdKSk7bi4kY2xvc3VyZT0hMH0oZSk7dmFyIGk9W10sYT1bZV0scz1lO3RoaXMuaW5zZXJ0U3ltYm9sPWZ1bmN0aW9uKGUsdCl7Zm9yKDshc1tlLm5hbWVdJiZzLiRyZWR1Y2U7KXtmb3IodmFyIG49cy4kY291bnQscj1uZXcgU3ltYm9sJDEocy4kcmVkdWNlKTtuLS07KXIuY2hpbGROb2Rlcy5wdXNoKGkucG9wKCkpLGEucG9wKCk7cz1hW2EubGVuZ3RoLTFdLHRoaXMuaW5zZXJ0U3ltYm9sKHIpfWlmKHM9c1tlLm5hbWVdLGkucHVzaChlKSxhLnB1c2gocyksIXMpdGhyb3cgbmV3IEVycm9yO3JldHVybiBzLiRkaXZ9LHRoaXMucmVzZXQ9ZnVuY3Rpb24oKXtpPVtdLGE9W3M9ZV19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJncmFtbWFyVHJlZSIse2dldDpmdW5jdGlvbigpe3RyeXtmb3IoO3MuJHJlZHVjZTspe2Zvcih2YXIgZT1zLiRjb3VudCx0PW5ldyBTeW1ib2wkMShzLiRyZWR1Y2UpO2UtLTspdC5jaGlsZE5vZGVzLnB1c2goaS5wb3AoKSksYS5wb3AoKTtzPWFbYS5sZW5ndGgtMV0sdGhpcy5pbnNlcnRTeW1ib2wodCl9aWYoMDxpLmxlbmd0aCYmc1siOyJdKXJldHVybiB0aGlzLmluc2VydFN5bWJvbChuZXcgU3ltYm9sJDEoIjsiLCI7IikpLHRoaXMuZ3JhbW1hclRyZWU7aWYoMSE9aS5sZW5ndGh8fCJQcm9ncmFtIiE9aVswXS5uYW1lKXRocm93IG5ldyBFcnJvcn1jYXRjaChlKXt0aHJvdyBuZXcgU3ludGF4RXJyb3IoIlVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0Iil9cmV0dXJuIGlbMF19fSl9ZnVuY3Rpb24gUGFyc2VyKCl7dGhpcy5sZXhpY2FsUGFyc2VyPW5ldyBMZXhpY2FsUGFyc2VyLHRoaXMuc3ludGFjdGljYWxQYXJzZXI9bmV3IFN5bnRhY3RpY2FsUGFyc2VyO3ZhciBhPXt9O1siTnVsbExpdGVyYWwiLCJCb29sZWFuTGl0ZXJhbCIsIk51bWVyaWNMaXRlcmFsIiwiU3RyaW5nTGl0ZXJhbCIsIlJlZ3VsYXJFeHByZXNzaW9uTGl0ZXJhbCIsIklkZW50aWZpZXIiLCIqKiIsIj0+IiwieyIsIn0iLCIoIiwiKSIsIlsiLCJdIiwiLiIsIjsiLCIsIiwiPCIsIj4iLCI8PSIsIj49IiwiPT0iLCIhPSIsIj09PSIsIiE9PSIsIisiLCItIiwiKiIsIiUiLCIrKyIsIi0tIiwiPDwiLCI+PiIsIj4+PiIsIiYiLCJ8IiwiXiIsIiEiLCJ+IiwiJiYiLCJ8fCIsIj8iLCI6IiwiPSIsIis9IiwiLT0iLCIqPSIsIiU9IiwiPDw9IiwiPj49IiwiPj4+PSIsIiY9IiwifD0iLCJePSIsIi8iLCIvPSIsImluc3RhbmNlb2YiLCJ0eXBlb2YiLCJuZXciLCJ2b2lkIiwiZGVidWdnZXIiLCJ0aGlzIiwiZGVsZXRlIiwiaW4iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGUse30pfSksdGhpcy5yZXNldD1mdW5jdGlvbigpe3RoaXMubGV4aWNhbFBhcnNlci5yZXNldCgpLHRoaXMuc3ludGFjdGljYWxQYXJzZXIucmVzZXQoKX0sdGhpcy5wYXJzZT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9dGhpcyxpPSExO3RoaXMubGV4aWNhbFBhcnNlci5zb3VyY2U9ZTtmb3IodmFyIG89ITE7bj10aGlzLmxleGljYWxQYXJzZXIuZ2V0TmV4dFRva2VuKG8pOyl7dCYmdChuKTt0cnl7aWYoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobikuc29tZShmdW5jdGlvbihlKXtyZXR1cm4hIWEuaGFzT3duUHJvcGVydHkoZSkmJihvPXIuc3ludGFjdGljYWxQYXJzZXIuaW5zZXJ0U3ltYm9sKG5ldyBTeW1ib2wkMShlLG4pLGkpLCEoaT0hMSkpfSkpY29udGludWU7KG4uS2V5d29yZHx8bi5QdW5jdHVhdG9yfHxuLkRpdlB1bmN0dWF0b3IpJiZhLmhhc093blByb3BlcnR5KG4udG9TdHJpbmcoKSkmJihvPXIuc3ludGFjdGljYWxQYXJzZXIuaW5zZXJ0U3ltYm9sKG5ldyBTeW1ib2wkMShuLnRvU3RyaW5nKCksbiksaSkpfWNhdGNoKGUpe3Rocm93IG5ldyBTeW50YXhFcnJvcigiVW5leHBlY3RlZCB0b2tlbiAiK24pfX1yZXR1cm4gdGhpcy5zeW50YWN0aWNhbFBhcnNlci5ncmFtbWFyVHJlZX19dmFyIHBhcnNlcj1uZXcgUGFyc2VyO2Z1bmN0aW9uIEphdmFTY3JpcHRFeHByZXNzaW9uKHRleHQpe3BhcnNlci5yZXNldCgpLHRoaXMudHJlZT1wYXJzZXIucGFyc2UodGV4dCksdGhpcy5wYXRocz1bXTt2YXIgY29udGV4dD1PYmplY3QuY3JlYXRlKG51bGwpLG1lPXRoaXMscGF0aEluZGV4PU9iamVjdC5jcmVhdGUobnVsbCk7ZnVuY3Rpb24gY2hlY2tTaW1wbGUoZSl7Zm9yKHZhciB0PWU7dC5jaGlsZE5vZGVzLmxlbmd0aDw9MSYmIk1lbWJlckV4cHJlc3Npb24iIT09dC5uYW1lOyl0PXQuY2hpbGROb2Rlc1swXTsiTWVtYmVyRXhwcmVzc2lvbiI9PT10Lm5hbWU/bWUuaXNTaW1wbGU9ITA6bWUuaXNTaW1wbGU9ITF9ZnVuY3Rpb24gd2FsayhlKXtpZigiQ2FsbEV4cHJlc3Npb24iPT09ZS5uYW1lJiYiQ2FsbEV4cHJlc3Npb24iIT09ZS5jaGlsZE5vZGVzW2UuY2hpbGROb2Rlcy5sZW5ndGgtMV0ubmFtZSl7Z2V0UGF0aChlLmNoaWxkTm9kZXNbMV0pO3dhbGsoZS5jaGlsZE5vZGVzWzBdKX1lbHNlIGlmKCJOZXdFeHByZXNzaW9uIj09PWUubmFtZSYmMT09PWUuY2hpbGROb2Rlcy5sZW5ndGgpZ2V0UGF0aChlLmNoaWxkTm9kZXNbMF0pO2Vsc2UgaWYoIk1lbWJlckV4cHJlc3Npb24iPT09ZS5uYW1lJiYxPT09ZS5jaGlsZE5vZGVzLmxlbmd0aClnZXRQYXRoKGUpO2Vsc2UgZm9yKHZhciB0PTA7dDxlLmNoaWxkTm9kZXMubGVuZ3RoO3QrKyl3YWxrKGUuY2hpbGROb2Rlc1t0XSl9ZnVuY3Rpb24gZ2V0UGF0aChlKXt2YXIgdDtpZigiSWRlbnRpZmllck5hbWUiPT09ZS5jaGlsZE5vZGVzWzBdLm5hbWUpcmV0dXJuKHQ9Z2V0UGF0aChlLmNoaWxkTm9kZXNbMl0pKSYmKHQ9dC5jb25jYXQoZS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0udG9rZW4udG9TdHJpbmcoKSkpLGNyZWF0ZVBhdGgodCksdDtpZigiUHJpbWFyeUV4cHJlc3Npb24iPT09ZS5jaGlsZE5vZGVzWzBdLm5hbWUpcmV0dXJuIklkZW50aWZpZXIiPT09ZS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0ubmFtZT8oY3JlYXRlUGF0aCh0PVtlLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS50b2tlbi50b1N0cmluZygpXSksdCk6bnVsbDtpZigiXSI9PT1lLmNoaWxkTm9kZXNbMF0ubmFtZSlyZXR1cm4gZ2V0UGF0aChlLmNoaWxkTm9kZXNbM10pLHdhbGsoZS5jaGlsZE5vZGVzWzFdKSxudWxsO2lmKCJBcmd1bWVudHMiPT09ZS5jaGlsZE5vZGVzWzBdLm5hbWUpcmV0dXJuIHdhbGsoZS5jaGlsZE5vZGVzWzBdKSx3YWxrKGUuY2hpbGROb2Rlc1sxXSksbnVsbDtmb3IodmFyIG49MDtuPGUuY2hpbGROb2Rlcy5sZW5ndGg7bisrKXdhbGsoZS5jaGlsZE5vZGVzW25dKX1mdW5jdGlvbiBjcmVhdGVQYXRoKGUpe2Zvcih2YXIgdD1jb250ZXh0LG49MDtuPGUubGVuZ3RoLTE7bisrKXRbZVtuXV18fCh0W2Vbbl1dPU9iamVjdC5jcmVhdGUobnVsbCkpLHQ9dFtlW25dXTttZS5wYXRocy5wdXNoKGUpLHBhdGhJbmRleFtlLmpvaW4oIi4iKV09ITF9dGhpcy5pc1NpbXBsZSx0aGlzLmlzQ29uc3Qsd2Fsayh0aGlzLnRyZWUpLGNoZWNrU2ltcGxlKHRoaXMudHJlZSksMD09PXRoaXMucGF0aHMubGVuZ3RoJiYodGhpcy5pc0NvbnN0PSEwKSx0aGlzLnNldHRlcj1mdW5jdGlvbih0KXtmb3IodmFyIG49Y29udGV4dCxyPTA7cjx0Lmxlbmd0aC0xO3IrKyluW3Rbcl1dfHwoblt0W3JdXT1PYmplY3QuY3JlYXRlKG51bGwpKSxuPW5bdFtyXV07cmV0dXJue2lzQ29tcGxldGVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHBhdGhJbmRleClpZighcGF0aEluZGV4W2VdKXJldHVybiExO3JldHVybiEwfSxzZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHBhdGhJbmRleFt0LmpvaW4oIi4iKV18fChwYXRoSW5kZXhbdC5qb2luKCIuIildPSEwKSxuW3Rbcl1dPWUsdGhpcy5pc0NvbXBsZXRlZCgpP21lLmV4ZWMoKTp2b2lkIDB9fX0sdGhpcy52YWx1ZU9mPXRoaXMuZXhlYz1mdW5jdGlvbigpe3RyeXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZXZhbCh0ZXh0KX0uY2FsbChjb250ZXh0KX1jYXRjaChlKXt9fX1mdW5jdGlvbiB2aXNpdCh0KXt2YXIgZSxuPXQuY2hpbGROb2Rlcy5zbGljZSgpLnJldmVyc2UoKSxyPW4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLnRva2VufHwhZS50b2tlbi5QdW5jdHVhdG9yfSk7aWYoIlVuYXJ5RXhwcmVzc2lvbiI9PT10Lm5hbWUmJigyPT09bi5sZW5ndGgmJiItIj09PW5bMF0ubmFtZSYmMT09PXIubGVuZ3RoKSlyZXR1cm4oZT12aXNpdChyWzBdKSkudmFsdWU9LWUudmFsdWUsZTtpZigiQXJndW1lbnRzIj09PXQubmFtZSl7Zm9yKHZhciBpPVtdLG89clswXTtvOykzPT09by5jaGlsZE5vZGVzLmxlbmd0aCYmKGkudW5zaGlmdChvLmNoaWxkTm9kZXNbMF0pLG89by5jaGlsZE5vZGVzWzJdKSwxPT09by5jaGlsZE5vZGVzLmxlbmd0aCYmKGkudW5zaGlmdChvLmNoaWxkTm9kZXNbMF0pLG89bnVsbCk7cmV0dXJue3R5cGU6IkFyZ3VtZW50cyIsY2hpbGRyZW46aS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHZpc2l0KGUpfSl9fWlmKHImJjE9PT1yLmxlbmd0aClyZXR1cm4gZT12aXNpdChyWzBdKTtpZih0LnRva2VuJiZbIk51bGxMaXRlcmFsIiwiQm9vbGVhbkxpdGVyYWwiLCJOdW1lcmljTGl0ZXJhbCIsIlN0cmluZ0xpdGVyYWwiLCJJZGVudGlmaWVyIl0uc29tZShmdW5jdGlvbihlKXtyZXR1cm4gdC50b2tlbltlXX0pKXt2YXIgYT1PYmplY3Qua2V5cyh0LnRva2VuKS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUubWF0Y2goL0xpdGVyYWwvKXx8ZS5tYXRjaCgvSWRlbnRpZmllci8pfSlbMF07cmV0dXJue3R5cGU6YSx2YWx1ZTp7TnVsbExpdGVyYWw6bnVsbCxCb29sZWFuTGl0ZXJhbDpCb29sZWFuKHQudG9rZW4pLE51bWVyaWNMaXRlcmFsOk51bWJlcih0LnRva2VuKSxTdHJpbmdMaXRlcmFsOnQudG9rZW4sSWRlbnRpZmllcjp0LnRva2VufVthXX19cmV0dXJuIkNhbGxFeHByZXNzaW9uIj09PXQubmFtZT97dHlwZToiQ2FsbEV4cHJlc3Npb24iLGNoaWxkcmVuOlt2aXNpdChuWzBdKSx2aXNpdChuWzFdKV19Ont0eXBlOm4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRva2VuJiZlLnRva2VuLlB1bmN0dWF0b3J9KVswXS5uYW1lLGNoaWxkcmVuOm4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLnRva2VufHwhZS50b2tlbi5QdW5jdHVhdG9yfSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiB2aXNpdChlKX0pfX1mdW5jdGlvbiBwYXJzZShlKXt2YXIgdD1uZXcgSmF2YVNjcmlwdEV4cHJlc3Npb24oZSk7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHZpc2l0KHQudHJlZSksbnVsbCl9dmFyIG9sZENhbGxVcGRhdGVTdHlsZT1nbG9iYWwuY2FsbFVwZGF0ZVN0eWxlO2Z1bmN0aW9uIGlzQmluZE1ldGhvZChlLHQpe3JldHVybigiYmluZGluZ3giPT09ZXx8ImJpbmRpbmciPT09ZSkmJiJiaW5kIj09PXR9ZnVuY3Rpb24gZm9ybWF0RXhwcmVzc2lvbihlKXtpZih2b2lkIDAhPT1lKXt0cnl7ZT1KU09OLnBhcnNlKGUpfWNhdGNoKGUpe312YXIgdD17fTtpZigic3RyaW5nIj09dHlwZW9mIGU/dC5vcmlnaW49ZTplJiYodC5vcmlnaW49ZS5vcmlnaW4sdC50cmFuc2Zvcm1lZD1lLnRyYW5zZm9ybWVkKSx0LnRyYW5zZm9ybWVkfHx0Lm9yaWdpbilyZXR1cm4gdC50cmFuc2Zvcm1lZD10LnRyYW5zZm9ybWVkfHxwYXJzZSh0Lm9yaWdpbiksdH19ZnVuY3Rpb24gZm9ybWF0RXhwcmVzc2lvbnMoZSl7cmV0dXJuIGUmJihlLmV4aXRFeHByZXNzaW9uPWZvcm1hdEV4cHJlc3Npb24oZS5leGl0RXhwcmVzc2lvbiksZS5wcm9wcyYmZS5wcm9wcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuZXhwcmVzc2lvbj1mb3JtYXRFeHByZXNzaW9uKGUuZXhwcmVzc2lvbil9KSksZX1mdW5jdGlvbiBmaXhDYWxsYmFjayh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09ZSYmKGU9e30pLCJmdW5jdGlvbiI9PXR5cGVvZiB0KXJldHVybiB0KHtzdGF0ZToiZW5kIj09PWUuc3RhdGU/ImV4aXQiOmUuc3RhdGUsdDp2b2lkIDAhPT1lLnQ/ZS50OmUuZGVsdGFUfSl9fWZ1bmN0aW9uIGhhbmRsZU1vZHVsZUdldHRlcihlLHQsbil7cmV0dXJuIGlzQmluZE1ldGhvZChlLHQpP2Z1bmN0aW9uKGUsdCl7aWYodm9pZCAwPT09dCYmKHQ9ZnVuY3Rpb24oKXt9KSwhZSl0aHJvdyBuZXcgRXJyb3IoInNob3VsZCBwYXNzIG9wdGlvbnMgZm9yIGJpbmRpbmciKTtyZXR1cm4gZm9ybWF0RXhwcmVzc2lvbnMoZSksbihlLGUmJiJ0aW1pbmciPT09ZS5ldmVudFR5cGU/Zml4Q2FsbGJhY2sodCk6dCl9Om59ZnVuY3Rpb24gc2V0SWQoZSx0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiW1tDdXJyZW50SW5zdGFuY2VJZF1dIix7dmFsdWU6dH0pfWZ1bmN0aW9uIGdldElkKGUpe3JldHVybiBlWyJbW0N1cnJlbnRJbnN0YW5jZUlkXV0iXX1mdW5jdGlvbiBtb2R1bGVHZXR0ZXIoZSxuLHIpe3ZhciBpPWdldFRhc2tDZW50ZXIoZSk7cmV0dXJuIGkmJiJmdW5jdGlvbiI9PXR5cGVvZiBpLnNlbmQ/ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIGkuc2VuZCgibW9kdWxlIix7bW9kdWxlOm4sbWV0aG9kOnJ9LGUpfTooY29uc29sZS5lcnJvcigiW0pTIEZyYW1ld29ya10gRmFpbGVkIHRvIGZpbmQgdGFza0NlbnRlciAoIitlKyIpLiIpLG51bGwpfWZ1bmN0aW9uIG1vZHVsZVNldHRlcihlLHQsbixyKXt2YXIgaT1nZXRUYXNrQ2VudGVyKGUpO3JldHVybiBpJiYiZnVuY3Rpb24iPT10eXBlb2YgaS5zZW5kPyJmdW5jdGlvbiIhPXR5cGVvZiByPyhjb25zb2xlLmVycm9yKCJbSlMgRnJhbWV3b3JrXSAiK3QrIi4iK24rIiBtdXN0IGJlIGFzc2lnbmVkIGFzIGEgZnVuY3Rpb24uIiksbnVsbCk6ZnVuY3Rpb24oZSl7cmV0dXJuIGkuc2VuZCgibW9kdWxlIix7bW9kdWxlOnQsbWV0aG9kOm59LFtlXSl9Oihjb25zb2xlLmVycm9yKCJbSlMgRnJhbWV3b3JrXSBGYWlsZWQgdG8gZmluZCB0YXNrQ2VudGVyICgiK2UrIikuIiksbnVsbCl9Z2xvYmFsLmNhbGxVcGRhdGVTdHlsZT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoLTE7MDxuLS07KXRbbl09YXJndW1lbnRzW24rMV07cmV0dXJuIHRbMV0mJih0WzFdPW5vcm1hbGl6ZVVuaXQodFsxXSkpLG9sZENhbGxVcGRhdGVTdHlsZS5hcHBseSh2b2lkIDAsW2VdLmNvbmNhdCh0KSl9O3ZhciBXZWV4SW5zdGFuY2U9ZnVuY3Rpb24oZSx0LG4pe3NldElkKHRoaXMsU3RyaW5nKGUpKSx0aGlzLmNvbmZpZz10fHx7fSx0aGlzLl9uYXRpdmVEYXRhPW58fHt9LHRoaXMuZG9jdW1lbnQ9bmV3IERvY3VtZW50KGUsdGhpcy5jb25maWcuYnVuZGxlVXJsKSx0aGlzLnJlcXVpcmVNb2R1bGU9dGhpcy5yZXF1aXJlTW9kdWxlLmJpbmQodGhpcyksdGhpcy5pbXBvcnRTY3JpcHQ9dGhpcy5pbXBvcnRTY3JpcHQuYmluZCh0aGlzKSx0aGlzLmlzUmVnaXN0ZXJlZE1vZHVsZT1pc1JlZ2lzdGVyZWRNb2R1bGUsdGhpcy5pc1JlZ2lzdGVyZWRDb21wb25lbnQ9aXNSZWdpc3RlcmVkQ29tcG9uZW50fSxfX3Z1ZVBsdWdpbixfX2RlZmluZVBhZ2UsX19yZWdpc3RlckFwcCxfX3JlZ2lzdGVyUGFnZSx1bmksZ2V0QXBwLGdldEN1cnJlbnRQYWdlcyxVbmlTZXJ2aWNlSlNCcmlkZ2U7ZnVuY3Rpb24gY3JlYXRlU2VydmljZUNvbnRleHQodGcsbmcscmcsaWcsZSl7dmFyIG9nPWUuc2V0VGltZW91dCxhZz1lLmNsZWFyVGltZW91dCxzZz1lLnNldEludGVydmFsLGNnPWUuY2xlYXJJbnRlcnZhbCx1Zz1lLl9fdW5pQ29uZmlnLGxnPWUuX191bmlSb3V0ZXMsdD1mdW5jdGlvbigpe3ZhciBlLGksdD1bImJhc2U2NFRvQXJyYXlCdWZmZXIiLCJhcnJheUJ1ZmZlclRvQmFzZTY0IiwiYWRkSW50ZXJjZXB0b3IiLCJyZW1vdmVJbnRlcmNlcHRvciIsImludGVyY2VwdG9ycyJdLmNvbmNhdChbInJlcXVlc3QiLCJ1cGxvYWRGaWxlIiwiZG93bmxvYWRGaWxlIiwiY29ubmVjdFNvY2tldCIsIm9uU29ja2V0T3BlbiIsIm9uU29ja2V0RXJyb3IiLCJzZW5kU29ja2V0TWVzc2FnZSIsIm9uU29ja2V0TWVzc2FnZSIsImNsb3NlU29ja2V0Iiwib25Tb2NrZXRDbG9zZSIsImdldFVwZGF0ZU1hbmFnZXIiLCJjb25maWdNVExTIl0sWyJuYXZpZ2F0ZVRvIiwicmVkaXJlY3RUbyIsInJlTGF1bmNoIiwic3dpdGNoVGFiIiwibmF2aWdhdGVCYWNrIl0sWyJzZXRTdG9yYWdlIiwic2V0U3RvcmFnZVN5bmMiLCJnZXRTdG9yYWdlIiwiZ2V0U3RvcmFnZVN5bmMiLCJnZXRTdG9yYWdlSW5mbyIsImdldFN0b3JhZ2VJbmZvU3luYyIsInJlbW92ZVN0b3JhZ2UiLCJyZW1vdmVTdG9yYWdlU3luYyIsImNsZWFyU3RvcmFnZSIsImNsZWFyU3RvcmFnZVN5bmMiXSxbImdldExvY2F0aW9uIiwiY2hvb3NlTG9jYXRpb24iLCJvcGVuTG9jYXRpb24iLCJjcmVhdGVNYXBDb250ZXh0Iiwib25Mb2NhdGlvbkNoYW5nZSIsIm9uTG9jYXRpb25DaGFuZ2VFcnJvciIsInN0YXJ0TG9jYXRpb25VcGRhdGUiLCJzdG9wTG9jYXRpb25VcGRhdGUiLCJvZmZMb2NhdGlvbkNoYW5nZSIsIm9mZkxvY2F0aW9uQ2hhbmdlRXJyb3IiXSxbImNob29zZUltYWdlIiwiY2hvb3NlRmlsZSIsInByZXZpZXdJbWFnZSIsImNsb3NlUHJldmlld0ltYWdlIiwiZ2V0SW1hZ2VJbmZvIiwiZ2V0VmlkZW9JbmZvIiwic2F2ZUltYWdlVG9QaG90b3NBbGJ1bSIsImNvbXByZXNzSW1hZ2UiLCJjb21wcmVzc1ZpZGVvIiwiZ2V0UmVjb3JkZXJNYW5hZ2VyIiwiZ2V0QmFja2dyb3VuZEF1ZGlvTWFuYWdlciIsImNyZWF0ZUF1ZGlvQ29udGV4dCIsImNyZWF0ZUlubmVyQXVkaW9Db250ZXh0IiwiY2hvb3NlVmlkZW8iLCJzYXZlVmlkZW9Ub1Bob3Rvc0FsYnVtIiwiY3JlYXRlVmlkZW9Db250ZXh0IiwiY3JlYXRlQ2FtZXJhQ29udGV4dCIsImNyZWF0ZUxpdmVQbGF5ZXJDb250ZXh0IiwiY3JlYXRlTGl2ZVB1c2hlckNvbnRleHQiXSxbImdldFN5c3RlbUluZm8iLCJnZXRTeXN0ZW1JbmZvU3luYyIsImdldFdpbmRvd0luZm8iLCJnZXREZXZpY2VJbmZvIiwiZ2V0QXBwQmFzZUluZm8iLCJjYW5JVXNlIiwib25NZW1vcnlXYXJuaW5nIiwiZ2V0TmV0d29ya1R5cGUiLCJvbk5ldHdvcmtTdGF0dXNDaGFuZ2UiLCJvZmZOZXR3b3JrU3RhdHVzQ2hhbmdlIiwib25BY2NlbGVyb21ldGVyQ2hhbmdlIiwib2ZmQWNjZWxlcm9tZXRlckNoYW5nZSIsInN0YXJ0QWNjZWxlcm9tZXRlciIsInN0b3BBY2NlbGVyb21ldGVyIiwib25Db21wYXNzQ2hhbmdlIiwib2ZmQ29tcGFzc0NoYW5nZSIsInN0YXJ0Q29tcGFzcyIsInN0b3BDb21wYXNzIiwib25HeXJvc2NvcGVDaGFuZ2UiLCJzdGFydEd5cm9zY29wZSIsInN0b3BHeXJvc2NvcGUiLCJtYWtlUGhvbmVDYWxsIiwic2NhbkNvZGUiLCJzZXRDbGlwYm9hcmREYXRhIiwiZ2V0Q2xpcGJvYXJkRGF0YSIsInNldFNjcmVlbkJyaWdodG5lc3MiLCJnZXRTY3JlZW5CcmlnaHRuZXNzIiwic2V0S2VlcFNjcmVlbk9uIiwib25Vc2VyQ2FwdHVyZVNjcmVlbiIsInZpYnJhdGVMb25nIiwidmlicmF0ZVNob3J0IiwiYWRkUGhvbmVDb250YWN0Iiwib3BlbkJsdWV0b290aEFkYXB0ZXIiLCJzdGFydEJsdWV0b290aERldmljZXNEaXNjb3ZlcnkiLCJvbkJsdWV0b290aERldmljZUZvdW5kIiwic3RvcEJsdWV0b290aERldmljZXNEaXNjb3ZlcnkiLCJvbkJsdWV0b290aEFkYXB0ZXJTdGF0ZUNoYW5nZSIsImdldENvbm5lY3RlZEJsdWV0b290aERldmljZXMiLCJnZXRCbHVldG9vdGhEZXZpY2VzIiwiZ2V0Qmx1ZXRvb3RoQWRhcHRlclN0YXRlIiwiY2xvc2VCbHVldG9vdGhBZGFwdGVyIiwid3JpdGVCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlIiwicmVhZEJMRUNoYXJhY3RlcmlzdGljVmFsdWUiLCJvbkJMRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZSIsIm9uQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZSIsIm5vdGlmeUJMRUNoYXJhY3RlcmlzdGljVmFsdWVDaGFuZ2UiLCJnZXRCTEVEZXZpY2VTZXJ2aWNlcyIsImdldEJMRURldmljZUNoYXJhY3RlcmlzdGljcyIsImNyZWF0ZUJMRUNvbm5lY3Rpb24iLCJjbG9zZUJMRUNvbm5lY3Rpb24iLCJzZXRCTEVNVFUiLCJnZXRCTEVEZXZpY2VSU1NJIiwib25CZWFjb25TZXJ2aWNlQ2hhbmdlIiwib25CZWFjb25VcGRhdGUiLCJnZXRCZWFjb25zIiwic3RhcnRCZWFjb25EaXNjb3ZlcnkiLCJzdG9wQmVhY29uRGlzY292ZXJ5IiwiY2hlY2tJc1N1cHBvcnRTb3RlckF1dGhlbnRpY2F0aW9uIiwiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZSIsInN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbiIsIm9uVGhlbWVDaGFuZ2UiLCJvZmZUaGVtZUNoYW5nZSIsIm9uVUlTdHlsZUNoYW5nZSIsImdldFN5c3RlbVNldHRpbmciLCJnZXRBcHBBdXRob3JpemVTZXR0aW5nIiwib3BlbkFwcEF1dGhvcml6ZVNldHRpbmciXSxbImhpZGVLZXlib2FyZCIsIm9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2UiLCJvZmZLZXlib2FyZEhlaWdodENoYW5nZSIsImdldFNlbGVjdGVkVGV4dFJhbmdlIl0sWyJzaG93VG9hc3QiLCJoaWRlVG9hc3QiLCJzaG93TG9hZGluZyIsImhpZGVMb2FkaW5nIiwic2hvd01vZGFsIiwic2hvd0FjdGlvblNoZWV0Iiwic2V0TmF2aWdhdGlvbkJhclRpdGxlIiwic2V0TmF2aWdhdGlvbkJhckNvbG9yIiwic2hvd05hdmlnYXRpb25CYXJMb2FkaW5nIiwiaGlkZU5hdmlnYXRpb25CYXJMb2FkaW5nIiwic2V0VGFiQmFySXRlbSIsInNldFRhYkJhclN0eWxlIiwiaGlkZVRhYkJhciIsInNob3dUYWJCYXIiLCJzZXRUYWJCYXJCYWRnZSIsInJlbW92ZVRhYkJhckJhZGdlIiwic2hvd1RhYkJhclJlZERvdCIsImhpZGVUYWJCYXJSZWREb3QiLCJvblRhYkJhck1pZEJ1dHRvblRhcCIsInNldEJhY2tncm91bmRDb2xvciIsInNldEJhY2tncm91bmRUZXh0U3R5bGUiLCJjcmVhdGVBbmltYXRpb24iLCJwYWdlU2Nyb2xsVG8iLCJvbldpbmRvd1Jlc2l6ZSIsIm9mZldpbmRvd1Jlc2l6ZSIsImxvYWRGb250RmFjZSIsInN0YXJ0UHVsbERvd25SZWZyZXNoIiwic3RvcFB1bGxEb3duUmVmcmVzaCIsImNyZWF0ZVNlbGVjdG9yUXVlcnkiLCJjcmVhdGVJbnRlcnNlY3Rpb25PYnNlcnZlciIsImNyZWF0ZU1lZGlhUXVlcnlPYnNlcnZlciIsImdldE1lbnVCdXR0b25Cb3VuZGluZ0NsaWVudFJlY3QiLCJzaG93VG9wV2luZG93Iiwic2hvd0xlZnRXaW5kb3ciLCJzaG93UmlnaHRXaW5kb3ciLCJoaWRlVG9wV2luZG93IiwiaGlkZUxlZnRXaW5kb3ciLCJoaWRlUmlnaHRXaW5kb3ciLCJnZXRUb3BXaW5kb3dTdHlsZSIsImdldExlZnRXaW5kb3dTdHlsZSIsImdldFJpZ2h0V2luZG93U3R5bGUiLCJzZXRUb3BXaW5kb3dTdHlsZSIsInNldExlZnRXaW5kb3dTdHlsZSIsInNldFJpZ2h0V2luZG93U3R5bGUiLCJnZXRMb2NhbGUiLCJzZXRMb2NhbGUiLCJvbkxvY2FsZUNoYW5nZSJdLFsiJGVtaXQiLCIkb24iLCIkb25jZSIsIiRvZmYiXSxbInNhdmVGaWxlIiwiZ2V0U2F2ZWRGaWxlTGlzdCIsImdldFNhdmVkRmlsZUluZm8iLCJyZW1vdmVTYXZlZEZpbGUiLCJnZXRGaWxlSW5mbyIsIm9wZW5Eb2N1bWVudCIsImdldEZpbGVTeXN0ZW1NYW5hZ2VyIl0sWyJjcmVhdGVPZmZzY3JlZW5DYW52YXMiLCJjcmVhdGVDYW52YXNDb250ZXh0IiwiY2FudmFzVG9UZW1wRmlsZVBhdGgiLCJjYW52YXNQdXRJbWFnZURhdGEiLCJjYW52YXNHZXRJbWFnZURhdGEiXSxbImdldFByb3ZpZGVyIiwibG9naW4iLCJjaGVja1Nlc3Npb24iLCJnZXRVc2VySW5mbyIsImdldFVzZXJQcm9maWxlIiwicHJlTG9naW4iLCJjbG9zZUF1dGhWaWV3IiwiZ2V0Q2hlY2tCb3hTdGF0ZSIsImdldFVuaXZlcmlmeU1hbmFnZXIiLCJzaGFyZSIsInNoYXJlV2l0aFN5c3RlbSIsInNob3dTaGFyZU1lbnUiLCJoaWRlU2hhcmVNZW51IiwicmVxdWVzdFBheW1lbnQiLCJzdWJzY3JpYmVQdXNoIiwidW5zdWJzY3JpYmVQdXNoIiwib25QdXNoIiwib2ZmUHVzaCIsInJlcXVpcmVOYXRpdmVQbHVnaW4iLCJ1cHgycHgiLCJyZXN0b3JlR2xvYmFsIiwicmVxdWlyZUdsb2JhbCIsImdldFN1Yk5WdWVCeUlkIiwiZ2V0Q3VycmVudFN1Yk5WdWUiLCJzZXRQYWdlTWV0YSIsIm9uSG9zdEV2ZW50UmVjZWl2ZSIsIm9uTmF0aXZlRXZlbnRSZWNlaXZlIiwic2VuZE5hdGl2ZUV2ZW50IiwicHJlbG9hZFBhZ2UiLCJ1blByZWxvYWRQYWdlIiwibG9hZFN1YlBhY2thZ2UiLCJzZW5kSG9zdEV2ZW50IiwibmF2aWdhdGVUb01pbmlQcm9ncmFtIiwiZ2V0TGF1bmNoT3B0aW9uc1N5bmMiLCJnZXRFbnRlck9wdGlvbnNTeW5jIiwiaW5pdFVUU1Byb3h5Q2xhc3MiLCJpbml0VVRTUHJveHlGdW5jdGlvbiIsImluaXRVVFNJbmRleENsYXNzTmFtZSIsImluaXRVVFNDbGFzc05hbWUiLCJpbml0VVRTUGFja2FnZU5hbWUiLCJyZXF1aXJlVVRTUGx1Z2luIiwicmVnaXN0ZXJVVFNQbHVnaW4iLCJyZWdpc3RlclVUU0ludGVyZmFjZSJdLFsiY3JlYXRlUmV3YXJkZWRWaWRlb0FkIiwiY3JlYXRlRnVsbFNjcmVlblZpZGVvQWQiLCJjcmVhdGVJbnRlcnN0aXRpYWxBZCIsImNyZWF0ZUludGVyYWN0aXZlQWQiXSxbImludm9rZVB1c2hDYWxsYmFjayIsImdldFB1c2hDbGllbnRJZCIsIm9uUHVzaE1lc3NhZ2UiLCJvZmZQdXNoTWVzc2FnZSIsImNyZWF0ZVB1c2hNZXNzYWdlIl0pO3RyeXt2YXIgbj17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe319KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdC1wYXNzaXZlIixudWxsLG4pfWNhdGNoKGUpe312YXIgYT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLHM9L14oPzpbQS1aYS16XGQrL117NH0pKj8oPzpbQS1aYS16XGQrL117Mn0oPzo9PSk/fFtBLVphLXpcZCsvXXszfT0/KT8kLztmdW5jdGlvbiBjKCl7dmFyIGUsdCxuPWRnLmdldFN0b3JhZ2VTeW5jKCJ1bmlfaWRfdG9rZW4iKXx8IiIscj1uLnNwbGl0KCIuIik7aWYoIW58fDMhPT1yLmxlbmd0aClyZXR1cm57dWlkOm51bGwscm9sZTpbXSxwZXJtaXNzaW9uOltdLHRva2VuRXhwaXJlZDowfTt0cnl7ZT1KU09OLnBhcnNlKCh0PXJbMV0sZGVjb2RlVVJJQ29tcG9uZW50KGkodCkuc3BsaXQoIiIpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4iJSIrKCIwMCIrZS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpfSkuam9pbigiIikpKSl9Y2F0Y2goZSl7dGhyb3cgbmV3IEVycm9yKCLojrflj5blvZPliY3nlKjmiLfkv6Hmga/lh7rplJnvvIzor6bnu4bplJnor6/kv6Hmga/kuLrvvJoiK2UubWVzc2FnZSl9cmV0dXJuIGUudG9rZW5FeHBpcmVkPTFlMyplLmV4cCxkZWxldGUgZS5leHAsZGVsZXRlIGUuaWF0LGV9aT0iZnVuY3Rpb24iIT10eXBlb2YgYXRvYj9mdW5jdGlvbihlKXtpZihlPVN0cmluZyhlKS5yZXBsYWNlKC9bXHRcblxmXHIgXSsvZywiIiksIXMudGVzdChlKSl0aHJvdyBuZXcgRXJyb3IoIkZhaWxlZCB0byBleGVjdXRlICdhdG9iJyBvbiAnV2luZG93JzogVGhlIHN0cmluZyB0byBiZSBkZWNvZGVkIGlzIG5vdCBjb3JyZWN0bHkgZW5jb2RlZC4iKTt2YXIgdDtlKz0iPT0iLnNsaWNlKDItKDMmZS5sZW5ndGgpKTtmb3IodmFyIG4scixpPSIiLG89MDtvPGUubGVuZ3RoOyl0PWEuaW5kZXhPZihlLmNoYXJBdChvKyspKTw8MTh8YS5pbmRleE9mKGUuY2hhckF0KG8rKykpPDwxMnwobj1hLmluZGV4T2YoZS5jaGFyQXQobysrKSkpPDw2fChyPWEuaW5kZXhPZihlLmNoYXJBdChvKyspKSksaSs9NjQ9PT1uP1N0cmluZy5mcm9tQ2hhckNvZGUodD4+MTYmMjU1KTo2ND09PXI/U3RyaW5nLmZyb21DaGFyQ29kZSh0Pj4xNiYyNTUsdD4+OCYyNTUpOlN0cmluZy5mcm9tQ2hhckNvZGUodD4+MTYmMjU1LHQ+PjgmMjU1LDI1NSZ0KTtyZXR1cm4gaX06YXRvYjt2YXIgcj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLG89T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxtPU9iamVjdC5hc3NpZ247ZnVuY3Rpb24gQyhlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZX1mdW5jdGlvbiB1KGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZX12YXIgbD11O2Z1bmN0aW9uIGQoZSl7cmV0dXJuIG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV9ZnVuY3Rpb24gVChlKXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PXIuY2FsbChlKX1mdW5jdGlvbiBrKGUsdCl7cmV0dXJuIG8uY2FsbChlLHQpfWZ1bmN0aW9uIGYoKXt9ZnVuY3Rpb24gcChlKXtyZXR1cm4gci5jYWxsKGUpLnNsaWNlKDgsLTEpfWZ1bmN0aW9uIGgodCl7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV18fChuW2VdPXQoZSkpfX12YXIgdj0vLShcdykvZyxnPWgoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSh2LGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/dC50b1VwcGVyQ2FzZSgpOiIifSl9KSx5PWgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKX0pO2Z1bmN0aW9uIF8odCxuKXtpZih0PT09bilyZXR1cm4hMDt2YXIgZT1kKHQpLHI9ZChuKTtpZighZXx8IXIpcmV0dXJuIWUmJiFyJiZTdHJpbmcodCk9PT1TdHJpbmcobik7dHJ5e3ZhciBpPUFycmF5LmlzQXJyYXkodCksbz1BcnJheS5pc0FycmF5KG4pO2lmKGkmJm8pcmV0dXJuIHQubGVuZ3RoPT09bi5sZW5ndGgmJnQuZXZlcnkoZnVuY3Rpb24oZSx0KXtyZXR1cm4gXyhlLG5bdF0pfSk7aWYodCBpbnN0YW5jZW9mIERhdGUmJm4gaW5zdGFuY2VvZiBEYXRlKXJldHVybiB0LmdldFRpbWUoKT09PW4uZ2V0VGltZSgpO2lmKGl8fG8pcmV0dXJuITE7dmFyIGE9T2JqZWN0LmtleXModCkscz1PYmplY3Qua2V5cyhuKTtyZXR1cm4gYS5sZW5ndGg9PT1zLmxlbmd0aCYmYS5ldmVyeShmdW5jdGlvbihlKXtyZXR1cm4gXyh0W2VdLG5bZV0pfSl9Y2F0Y2goZSl7cmV0dXJuITF9fXZhciBiPS9bIScoKSpdL2csdz1mdW5jdGlvbihlKXtyZXR1cm4iJSIrZS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KX0sUz0vJTJDL2cseD1mdW5jdGlvbihlKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGUpLnJlcGxhY2UoYix3KS5yZXBsYWNlKFMsIiwiKX0sTz1kZWNvZGVVUklDb21wb25lbnQ7ZnVuY3Rpb24gRShlKXt2YXIgaT17fTtyZXR1cm4oZT1lLnRyaW0oKS5yZXBsYWNlKC9eKFw/fCN8JikvLCIiKSkmJmUuc3BsaXQoIiYiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSgvXCsvZywiICIpLnNwbGl0KCI9Iiksbj1PKHQuc2hpZnQoKSkscj0wPHQubGVuZ3RoP08odC5qb2luKCI9IikpOm51bGw7dm9pZCAwPT09aVtuXT9pW25dPXI6QXJyYXkuaXNBcnJheShpW25dKT9pW25dLnB1c2gocik6aVtuXT1baVtuXSxyXX0pLGl9ZnVuY3Rpb24gQShyLGkpe3ZvaWQgMD09PWkmJihpPXgpO3ZhciBlPXI/T2JqZWN0LmtleXMocikubWFwKGZ1bmN0aW9uKHQpe3ZhciBlPXJbdF07aWYodm9pZCAwPT09ZSlyZXR1cm4iIjtpZihudWxsPT09ZSlyZXR1cm4gaSh0KTtpZihBcnJheS5pc0FycmF5KGUpKXt2YXIgbj1bXTtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZvaWQgMCE9PWUmJihudWxsPT09ZT9uLnB1c2goaSh0KSk6bi5wdXNoKGkodCkrIj0iK2koZSkpKX0pLG4uam9pbigiJiIpfXJldHVybiBpKHQpKyI9IitpKGUpfSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiAwPGUubGVuZ3RofSkuam9pbigiJiIpOm51bGw7cmV0dXJuIGU/Ij8iK2U6IiJ9dmFyIEk9MCwkPXt9O2Z1bmN0aW9uIFAoZSx0KXt2YXIgbj0kW2VdfHx7fTtkZWxldGUgJFtlXTt2YXIgcj10LmVyck1zZ3x8IiI7bmV3IFJlZ0V4cCgiXFw6XFxzKmZhaWwiKS50ZXN0KHIpP24uZmFpbCYmbi5mYWlsKHQpOm4uc3VjY2VzcyYmbi5zdWNjZXNzKHQpLG4uY29tcGxldGUmJm4uY29tcGxldGUodCl9dmFyIE09e3dhcnA6ZnVuY3Rpb24oaSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1TdHJpbmcoSSsrKTskW3RdPXtzdWNjZXNzOmUuc3VjY2VzcyxmYWlsOmUuZmFpbCxjb21wbGV0ZTplLmNvbXBsZXRlfTt2YXIgbj1PYmplY3QuYXNzaWduKHt9LGUpLHI9aS5iaW5kKHRoaXMpKG4sdCk7ciYmUCh0LHIpfX0saW52b2tlOlB9LGo9e2JsYWNrOiJyZ2JhKDAsMCwwLDAuNCkiLHdoaXRlOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNCkifTtmdW5jdGlvbiBMKGUsbyxhKXt2b2lkIDA9PT1vJiYobz17fSksdm9pZCAwPT09YSYmKGE9ImxpZ2h0Iik7dmFyIHM9b1thXSx0PXt9O3JldHVybiBzPyhPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3ZhciBpPWVbcl07dFtyXT1mdW5jdGlvbigpe2lmKFQoaSkpcmV0dXJuIEwoaSxvLGEpO2lmKEFycmF5LmlzQXJyYXkoaSkpcmV0dXJuIGkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBUKGUpP0woZSxvLGEpOmV9KTtpZih1KGkpJiZpLnN0YXJ0c1dpdGgoIkAiKSl7dmFyIGU9aS5yZXBsYWNlKCJAIiwiIiksdD1zW2VdfHxpO3N3aXRjaChyKXtjYXNlImJvcmRlclN0eWxlIjp0PShuPXQpJiZuIGluIGo/altuXTpufXJldHVybiB0fXZhciBuO3JldHVybiBpfSgpfSksdCk6ZX1mdW5jdGlvbiBOKGUpe3JldHVybiBmdW5jdGlvbigpe3RyeXtyZXR1cm4gZS5hcHBseShlLGFyZ3VtZW50cyl9Y2F0Y2goZSl7Y29uc29sZS5lcnJvcihlKX19fWZ1bmN0aW9uIEIoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dHJ5e3JldHVybiBlLmFwcGx5KGUsYXJndW1lbnRzKX1jYXRjaChlKXtjb25zb2xlLmVycm9yKGUpfX19dmFyIEQ9WyJpbnZva2UiLCJzdWNjZXNzIiwiZmFpbCIsImNvbXBsZXRlIiwicmV0dXJuVmFsdWUiXSxSPXt9LEY9e307ZnVuY3Rpb24geihpLG8pe09iamVjdC5rZXlzKG8pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQsbixyOy0xIT09RC5pbmRleE9mKGUpJiZDKG9bZV0pJiYoaVtlXT0odD1pW2VdLG49b1tlXSwocj1uP3Q/dC5jb25jYXQobik6QXJyYXkuaXNBcnJheShuKT9uOltuXTp0KT9mdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7bisrKS0xPT09dC5pbmRleE9mKGVbbl0pJiZ0LnB1c2goZVtuXSk7cmV0dXJuIHR9KHIpOnIpKX0pfWZ1bmN0aW9uIFUoaSxvKXtpJiZvJiZPYmplY3Qua2V5cyhvKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0LG4scjstMSE9PUQuaW5kZXhPZihlKSYmQyhvW2VdKSYmKHQ9aVtlXSxuPW9bZV0sLTEhPT0ocj10LmluZGV4T2YobikpJiZ0LnNwbGljZShyLDEpKX0pfWZ1bmN0aW9uIFYodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSxuKXx8ZX19ZnVuY3Rpb24gcShlKXtyZXR1cm4hIWUmJigib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlKSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudGhlbn1mdW5jdGlvbiBXKGUsdCxuKXtmb3IodmFyIHI9ITEsaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldO2lmKHIpcj1Qcm9taXNlLnJlc29sdmUoVihvLG4pKTtlbHNle3ZhciBhPW8odCxuKTtpZihxKGEpJiYocj1Qcm9taXNlLnJlc29sdmUoYSkpLCExPT09YSlyZXR1cm57dGhlbjpmdW5jdGlvbigpe319fX1yZXR1cm4gcnx8e3RoZW46ZnVuY3Rpb24oZSl7cmV0dXJuIGUodCl9fX1mdW5jdGlvbiBIKHIsaSl7cmV0dXJuIHZvaWQgMD09PWkmJihpPXt9KSxbInN1Y2Nlc3MiLCJmYWlsIiwiY29tcGxldGUiXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKEFycmF5LmlzQXJyYXkoclt0XSkpe3ZhciBuPWlbdF07aVt0XT1mdW5jdGlvbihlKXtXKHJbdF0sZSxpKS50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiBDKG4pJiZuKGUpfHxlfSl9fX0pLGl9ZnVuY3Rpb24gRyhlLHQpe3ZhciBuPVtdO0FycmF5LmlzQXJyYXkoUi5yZXR1cm5WYWx1ZSkmJm4ucHVzaC5hcHBseShuLFIucmV0dXJuVmFsdWUpO3ZhciByPUZbZV07cmV0dXJuIHImJkFycmF5LmlzQXJyYXkoci5yZXR1cm5WYWx1ZSkmJm4ucHVzaC5hcHBseShuLHIucmV0dXJuVmFsdWUpLG4uZm9yRWFjaChmdW5jdGlvbihlKXt0PWUodCl8fHR9KSx0fWZ1bmN0aW9uIFgoZSl7dmFyIHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtPYmplY3Qua2V5cyhSKS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyJyZXR1cm5WYWx1ZSIhPT1lJiYodFtlXT1SW2VdLnNsaWNlKCkpfSk7dmFyIG49RltlXTtyZXR1cm4gbiYmT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihlKXsicmV0dXJuVmFsdWUiIT09ZSYmKHRbZV09KHRbZV18fFtdKS5jb25jYXQobltlXSkpfSksdH1mdW5jdGlvbiBZKHQsbixlKXtmb3IodmFyIHI9W10saT1hcmd1bWVudHMubGVuZ3RoLTM7MDxpLS07KXJbaV09YXJndW1lbnRzW2krM107dmFyIG89WCh0KTtyZXR1cm4gbyYmT2JqZWN0LmtleXMobykubGVuZ3RoP0FycmF5LmlzQXJyYXkoby5pbnZva2UpP1coby5pbnZva2UsZSkudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gbi5hcHBseSh2b2lkIDAsW0goWCh0KSxlKV0uY29uY2F0KHIpKX0pOm4uYXBwbHkodm9pZCAwLFtIKG8sZSldLmNvbmNhdChyKSk6bi5hcHBseSh2b2lkIDAsW2VdLmNvbmNhdChyKSl9dmFyIEo9e3JldHVyblZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBxKGUpP25ldyBQcm9taXNlKGZ1bmN0aW9uKHQsbil7ZS50aGVuKGZ1bmN0aW9uKGUpe2VbMF0/bihlWzBdKTp0KGVbMV0pfSl9KTplfX0sSz0vXlwkfFdpbmRvdyR8V2luZG93U3R5bGUkfHNlbmRIb3N0RXZlbnR8c2VuZE5hdGl2ZUV2ZW50fHJlc3RvcmVHbG9iYWx8cmVxdWlyZUdsb2JhbHxnZXRDdXJyZW50U3ViTlZ1ZXxnZXRNZW51QnV0dG9uQm91bmRpbmdDbGllbnRSZWN0fF5yZXBvcnR8aW50ZXJjZXB0b3JzfEludGVyY2VwdG9yJHxnZXRTdWJOVnVlQnlJZHxyZXF1aXJlTmF0aXZlUGx1Z2lufHVweDJweHxoaWRlS2V5Ym9hcmR8Y2FuSVVzZXxeY3JlYXRlfFN5bmMkfE1hbmFnZXIkfGJhc2U2NFRvQXJyYXlCdWZmZXJ8YXJyYXlCdWZmZXJUb0Jhc2U2NHxnZXRMb2NhbGV8c2V0TG9jYWxlfGludm9rZVB1c2hDYWxsYmFja3xnZXRXaW5kb3dJbmZvfGdldERldmljZUluZm98Z2V0QXBwQmFzZUluZm98Z2V0U3lzdGVtU2V0dGluZ3xnZXRBcHBBdXRob3JpemVTZXR0aW5nfGluaXRVVFN8cmVxdWlyZVVUU3xyZWdpc3RlclVUUy8sWj0vXmNyZWF0ZXxNYW5hZ2VyJC8sUT1bImNyZWF0ZUJMRUNvbm5lY3Rpb24iXSxlZT1bInJlcXVlc3QiLCJkb3dubG9hZEZpbGUiLCJ1cGxvYWRGaWxlIiwiY29ubmVjdFNvY2tldCJdLHRlPVsiY3JlYXRlQkxFQ29ubmVjdGlvbiIsImNyZWF0ZVB1c2hNZXNzYWdlIl0sbmU9L15vbnxeb2ZmLztmdW5jdGlvbiByZShlKXtyZXR1cm4gSy50ZXN0KGUpJiYtMT09PXRlLmluZGV4T2YoZSl9ZnVuY3Rpb24gaWUoZSl7cmV0dXJuIG5lLnRlc3QoZSkmJiJvblB1c2giIT09ZX1mdW5jdGlvbiBvZShlKXtyZXR1cm4gdD1lLCEoWi50ZXN0KHQpJiYtMT09PVEuaW5kZXhPZih0KXx8cmUoZSl8fGllKGUpKTt2YXIgdH1mdW5jdGlvbiBhZShlKXt2YXIgdD17fTtmb3IodmFyIG4gaW4gZSl7dmFyIHI9ZVtuXTtDKHIpJiYodFtuXT1CKHIpLGRlbGV0ZSBlW25dKX1yZXR1cm4gdH1Qcm9taXNlLnByb3RvdHlwZS5maW5hbGx5fHwoUHJvbWlzZS5wcm90b3R5cGUuZmluYWxseT1mdW5jdGlvbih0KXt2YXIgbj10aGlzLmNvbnN0cnVjdG9yO3JldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIG4ucmVzb2x2ZSh0KCkpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gZX0pfSxmdW5jdGlvbihlKXtyZXR1cm4gbi5yZXNvbHZlKHQoKSkudGhlbihmdW5jdGlvbigpe3Rocm93IGV9KX0pfSk7dmFyIHNlPVt7bmFtZToiYmFzZTY0Iix0eXBlOlN0cmluZyxyZXF1aXJlZDohMH1dLGNlPVt7bmFtZToiYXJyYXlCdWZmZXIiLHR5cGU6W0FycmF5QnVmZmVyLFVpbnQ4QXJyYXldLHJlcXVpcmVkOiEwfV0sdWU9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsYmFzZTY0VG9BcnJheUJ1ZmZlcjpzZSxhcnJheUJ1ZmZlclRvQmFzZTY0OmNlfSksbGU9W3tuYW1lOiJzY2hlbWEiLHR5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfV0sZGU9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY2FuSVVzZTpsZX0pLGZlPVt7bmFtZToiZXZlbnQiLHR5cGU6W1N0cmluZyxBcnJheV0scmVxdWlyZWQ6ITB9LHtuYW1lOiJjYWxsYmFjayIsdHlwZTpGdW5jdGlvbixyZXF1aXJlZDohMH1dLHBlPWZlLGhlPVt7bmFtZToiZXZlbnQiLHR5cGU6W1N0cmluZyxBcnJheV19LHtuYW1lOiJjYWxsYmFjayIsdHlwZTpGdW5jdGlvbn1dLHZlPVt7bmFtZToiZXZlbnQiLHR5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfV0sZ2U9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsJG9uOmZlLCRvbmNlOnBlLCRvZmY6aGUsJGVtaXQ6dmV9KSxtZT1be25hbWU6Im1ldGhvZCIsdHlwZTpbU3RyaW5nLE9iamVjdF0scmVxdWlyZWQ6ITB9XSx5ZT1tZSxfZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxhZGRJbnRlcmNlcHRvcjptZSxyZW1vdmVJbnRlcmNlcHRvcjp5ZX0pLGJlPVt7bmFtZToidXB4Iix0eXBlOltOdW1iZXIsU3RyaW5nXSxyZXF1aXJlZDohMH1dLHdlPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHVweDJweDpiZX0pO2Z1bmN0aW9uIGtlKG4pe3JldHVybiBmdW5jdGlvbihlLHQpe2UmJih0W25dPU1hdGgucm91bmQoZSkpfX12YXIgU2U9e2NhbnZhc0lkOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0seDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmtlKCJ4Iil9LHk6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjprZSgieSIpfSx3aWR0aDp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmtlKCJ3aWR0aCIpfSxoZWlnaHQ6e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjprZSgiaGVpZ2h0Iil9fSx4ZT17Y2FudmFzSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxkYXRhOnt0eXBlOlVpbnQ4Q2xhbXBlZEFycmF5LHJlcXVpcmVkOiEwfSx4Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMCx2YWxpZGF0b3I6a2UoIngiKX0seTp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmtlKCJ5Iil9LHdpZHRoOnt0eXBlOk51bWJlcixyZXF1aXJlZDohMCx2YWxpZGF0b3I6a2UoIndpZHRoIil9LGhlaWdodDp7dHlwZTpOdW1iZXIsdmFsaWRhdG9yOmtlKCJoZWlnaHQiKX19LENlPXtQTkc6InBuZyIsSlBHOiJqcGciLEpQRUc6ImpwZyJ9LFRlPXt4Ont0eXBlOk51bWJlcixkZWZhdWx0OjAsdmFsaWRhdG9yOmtlKCJ4Iil9LHk6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MCx2YWxpZGF0b3I6a2UoInkiKX0sd2lkdGg6e3R5cGU6TnVtYmVyLHZhbGlkYXRvcjprZSgid2lkdGgiKX0saGVpZ2h0Ont0eXBlOk51bWJlcix2YWxpZGF0b3I6a2UoImhlaWdodCIpfSxkZXN0V2lkdGg6e3R5cGU6TnVtYmVyLHZhbGlkYXRvcjprZSgiZGVzdFdpZHRoIil9LGRlc3RIZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbGlkYXRvcjprZSgiZGVzdEhlaWdodCIpfSxjYW52YXNJZDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGZpbGVUeXBlOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPShlfHwiIikudG9VcHBlckNhc2UoKSx0LmZpbGVUeXBlPWUgaW4gQ2U/Q2VbZV06Q2UuUE5HfX0scXVhbGl0eTp7dHlwZTpOdW1iZXIsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5xdWFsaXR5PTA8ZSYmZTwxP2U6MX19fSxPZT17Y2FudmFzSWQ6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxhY3Rpb25zOnt0eXBlOkFycmF5LHJlcXVpcmVkOiEwfSxyZXNlcnZlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX19LEVlPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNhbnZhc0dldEltYWdlRGF0YTpTZSxjYW52YXNQdXRJbWFnZURhdGE6eGUsY2FudmFzVG9UZW1wRmlsZVBhdGg6VGUsZHJhd0NhbnZhczpPZX0pLEFlPVt7bmFtZToiaWQiLHR5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfV0sSWU9QWUsJGU9QWUsUGU9QWUsTWU9W3tuYW1lOiJjYW52YXNJZCIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHtuYW1lOiJjb21wb25lbnRJbnN0YW5jZSIsdHlwZTpPYmplY3R9XSxqZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjcmVhdGVBdWRpb0NvbnRleHQ6SWUsY3JlYXRlVmlkZW9Db250ZXh0OiRlLGNyZWF0ZU1hcENvbnRleHQ6UGUsY3JlYXRlQ2FudmFzQ29udGV4dDpNZX0pLExlPXtmaXJzdE5hbWU6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtpZighZSlyZXR1cm4iYWRkUGhvbmVDb250YWN0OmZhaWwgcGFyYW1ldGVyIGVycm9yOiBwYXJhbWV0ZXIuZmlyc3ROYW1lIHNob3VsZCBub3QgYmUgZW1wdHkgU3RyaW5nOyJ9fX0sTmU9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsYWRkUGhvbmVDb250YWN0OkxlfSksQmU9e3Bob25lTnVtYmVyOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuIm1ha2VQaG9uZUNhbGw6ZmFpbCBwYXJhbWV0ZXIgZXJyb3I6IHBhcmFtZXRlci5waG9uZU51bWJlciBzaG91bGQgbm90IGJlIGVtcHR5IFN0cmluZzsifX19LERlPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLG1ha2VQaG9uZUNhbGw6QmV9KSxSZT17b25seUZyb21DYW1lcmE6e3R5cGU6Qm9vbGVhbn0sc2NhblR5cGU6e3R5cGU6QXJyYXl9LGF1dG9EZWNvZGVDaGFyU2V0Ont0eXBlOkJvb2xlYW59LHNvdW5kOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJub25lIn0sYXV0b1pvb206e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiEwfX0sRmU9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsc2NhbkNvZGU6UmV9KSx6ZT1bInsiLCJ9Il0sVWU9ZnVuY3Rpb24oKXt0aGlzLl9jYWNoZXM9T2JqZWN0LmNyZWF0ZShudWxsKX07VWUucHJvdG90eXBlLmludGVycG9sYXRlPWZ1bmN0aW9uKGUsdCxuKXtpZih2b2lkIDA9PT1uJiYobj16ZSksIXQpcmV0dXJuW2VdO3ZhciByPXRoaXMuX2NhY2hlc1tlXTtyZXR1cm4gcnx8KHI9ZnVuY3Rpb24oZSx0KXt2YXIgbj10WzBdLHI9dFsxXSxpPVtdLG89MCxhPSIiO2Zvcig7bzxlLmxlbmd0aDspe3ZhciBzPWVbbysrXTtpZihzPT09bil7YSYmaS5wdXNoKHt0eXBlOiJ0ZXh0Iix2YWx1ZTphfSk7dmFyIGM9YT0iIjtmb3Iocz1lW28rK107dm9pZCAwIT09cyYmcyE9PXI7KWMrPXMscz1lW28rK107dmFyIHU9cz09PXIsbD1WZS50ZXN0KGMpPyJsaXN0Ijp1JiZxZS50ZXN0KGMpPyJuYW1lZCI6InVua25vd24iO2kucHVzaCh7dmFsdWU6Yyx0eXBlOmx9KX1lbHNlIGErPXN9cmV0dXJuIGEmJmkucHVzaCh7dHlwZToidGV4dCIsdmFsdWU6YX0pLGl9KGUsbiksdGhpcy5fY2FjaGVzW2VdPXIpLGZ1bmN0aW9uKGUsdCl7dmFyIG49W10scj0wLGk9QXJyYXkuaXNBcnJheSh0KT8ibGlzdCI6KG89dCxudWxsIT09byYmIm9iamVjdCI9PXR5cGVvZiBvPyJuYW1lZCI6InVua25vd24iKTt2YXIgbztpZigidW5rbm93biI9PT1pKXJldHVybiBuO2Zvcig7cjxlLmxlbmd0aDspe3ZhciBhPWVbcl07c3dpdGNoKGEudHlwZSl7Y2FzZSJ0ZXh0IjpuLnB1c2goYS52YWx1ZSk7YnJlYWs7Y2FzZSJsaXN0IjpuLnB1c2godFtwYXJzZUludChhLnZhbHVlLDEwKV0pO2JyZWFrO2Nhc2UibmFtZWQiOiJuYW1lZCI9PT1pJiZuLnB1c2godFthLnZhbHVlXSl9cisrfXJldHVybiBufShyLHQpfTt2YXIgVmU9L14oPzpcZCkrLyxxZT0vXig/Olx3KSsvO3ZhciBXZT0iemgtSGFucyIsSGU9InpoLUhhbnQiLEdlPSJlbiIsWGU9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxZZT1mdW5jdGlvbihlLHQpe3JldHVybiBYZS5jYWxsKGUsdCl9LEplPW5ldyBVZTtmdW5jdGlvbiBLZShlLHQpe2lmKGUpe2lmKGU9ZS50cmltKCkucmVwbGFjZSgvXy9nLCItIiksdCYmdFtlXSlyZXR1cm4gZTtpZigiY2hpbmVzZSI9PT0oZT1lLnRvTG93ZXJDYXNlKCkpKXJldHVybiBXZTtpZigwPT09ZS5pbmRleE9mKCJ6aCIpKXJldHVybi0xPGUuaW5kZXhPZigiLWhhbnMiKT9XZTotMTxlLmluZGV4T2YoIi1oYW50Iik/SGU6KG49ZSxbIi10dyIsIi1oayIsIi1tbyIsIi1jaHQiXS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybi0xIT09bi5pbmRleE9mKGUpfSk/SGU6V2UpO3ZhciBuLHI9W0dlLCJmciIsImVzIl07dCYmMDxPYmplY3Qua2V5cyh0KS5sZW5ndGgmJihyPU9iamVjdC5rZXlzKHQpKTt2YXIgaSxvPShpPWUsci5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiAwPT09aS5pbmRleE9mKGUpfSkpO3JldHVybiBvfHx2b2lkIDB9fXZhciBaZT1mdW5jdGlvbihlKXt2YXIgdD1lLmxvY2FsZSxuPWUuZmFsbGJhY2tMb2NhbGUscj1lLm1lc3NhZ2VzLGk9ZS53YXRjaGVyLG89ZS5mb3JtYXRlcjt0aGlzLmxvY2FsZT1HZSx0aGlzLmZhbGxiYWNrTG9jYWxlPUdlLHRoaXMubWVzc2FnZT17fSx0aGlzLm1lc3NhZ2VzPXt9LHRoaXMud2F0Y2hlcnM9W10sbiYmKHRoaXMuZmFsbGJhY2tMb2NhbGU9biksdGhpcy5mb3JtYXRlcj1vfHxKZSx0aGlzLm1lc3NhZ2VzPXJ8fHt9LHRoaXMuc2V0TG9jYWxlKHR8fEdlKSxpJiZ0aGlzLndhdGNoTG9jYWxlKGkpfTtmdW5jdGlvbiBRZShlLHQpe3JldHVybi0xPGUuaW5kZXhPZih0WzBdKX1aZS5wcm90b3R5cGUuc2V0TG9jYWxlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj10aGlzLmxvY2FsZTt0aGlzLmxvY2FsZT1LZShlLHRoaXMubWVzc2FnZXMpfHx0aGlzLmZhbGxiYWNrTG9jYWxlLHRoaXMubWVzc2FnZXNbdGhpcy5sb2NhbGVdfHwodGhpcy5tZXNzYWdlc1t0aGlzLmxvY2FsZV09e30pLHRoaXMubWVzc2FnZT10aGlzLm1lc3NhZ2VzW3RoaXMubG9jYWxlXSxuIT09dGhpcy5sb2NhbGUmJnRoaXMud2F0Y2hlcnMuZm9yRWFjaChmdW5jdGlvbihlKXtlKHQubG9jYWxlLG4pfSl9LFplLnByb3RvdHlwZS5nZXRMb2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb2NhbGV9LFplLnByb3RvdHlwZS53YXRjaExvY2FsZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLG49dGhpcy53YXRjaGVycy5wdXNoKGUpLTE7cmV0dXJuIGZ1bmN0aW9uKCl7dC53YXRjaGVycy5zcGxpY2UobiwxKX19LFplLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oZSx0LG4pe3ZvaWQgMD09PW4mJihuPSEwKTt2YXIgcj10aGlzLm1lc3NhZ2VzW2VdO3I/bj9PYmplY3QuYXNzaWduKHIsdCk6T2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihlKXtZZShyLGUpfHwocltlXT10W2VdKX0pOnRoaXMubWVzc2FnZXNbZV09dH0sWmUucHJvdG90eXBlLmY9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLmZvcm1hdGVyLmludGVycG9sYXRlKGUsdCxuKS5qb2luKCIiKX0sWmUucHJvdG90eXBlLnQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMubWVzc2FnZTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/KHQ9S2UodCx0aGlzLm1lc3NhZ2VzKSkmJihyPXRoaXMubWVzc2FnZXNbdF0pOm49dCxZZShyLGUpP3RoaXMuZm9ybWF0ZXIuaW50ZXJwb2xhdGUocltlXSxuKS5qb2luKCIiKTooY29uc29sZS53YXJuKCJDYW5ub3QgdHJhbnNsYXRlIHRoZSB2YWx1ZSBvZiBrZXlwYXRoICIrZSsiLiBVc2UgdGhlIHZhbHVlIG9mIGtleXBhdGggYXMgZGVmYXVsdC4iKSxlKX07dmFyIGV0LHR0PTQ0LG50PSJvblRoZW1lQ2hhbmdlIixydD0iZW4iLGl0PXt9O09iamVjdC5hc3NpZ24oaXQsKChlPXt9KVtydF09eyJ1bmkuYXBwLnF1aXQiOiJQcmVzcyBiYWNrIGJ1dHRvbiBhZ2FpbiB0byBleGl0IiwidW5pLmFzeW5jLmVycm9yIjoiVGhlIGNvbm5lY3Rpb24gdGltZWQgb3V0LCBjbGljayB0aGUgc2NyZWVuIHRvIHRyeSBhZ2Fpbi4iLCJ1bmkuc2hvd0FjdGlvblNoZWV0LmNhbmNlbCI6IkNhbmNlbCIsInVuaS5zaG93VG9hc3QudW5wYWlyZWQiOiJQbGVhc2Ugbm90ZSBzaG93VG9hc3QgbXVzdCBiZSBwYWlyZWQgd2l0aCBoaWRlVG9hc3QiLCJ1bmkuc2hvd0xvYWRpbmcudW5wYWlyZWQiOiJQbGVhc2Ugbm90ZSBzaG93TG9hZGluZyBtdXN0IGJlIHBhaXJlZCB3aXRoIGhpZGVMb2FkaW5nIiwidW5pLnNob3dNb2RhbC5jYW5jZWwiOiJDYW5jZWwiLCJ1bmkuc2hvd01vZGFsLmNvbmZpcm0iOiJPSyIsInVuaS5jaG9vc2VJbWFnZS5jYW5jZWwiOiJDYW5jZWwiLCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5hbGJ1bSI6IkFsYnVtIiwidW5pLmNob29zZUltYWdlLnNvdXJjZVR5cGUuY2FtZXJhIjoiQ2FtZXJhIiwidW5pLmNob29zZVZpZGVvLmNhbmNlbCI6IkNhbmNlbCIsInVuaS5jaG9vc2VWaWRlby5zb3VyY2VUeXBlLmFsYnVtIjoiQWxidW0iLCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5jYW1lcmEiOiJDYW1lcmEiLCJ1bmkuY2hvb3NlRmlsZS5ub3RVc2VyQWN0aXZhdGlvbiI6IkZpbGUgY2hvb3NlciBkaWFsb2cgY2FuIG9ubHkgYmUgc2hvd24gd2l0aCBhIHVzZXIgYWN0aXZhdGlvbiIsInVuaS5wcmV2aWV3SW1hZ2UuY2FuY2VsIjoiQ2FuY2VsIiwidW5pLnByZXZpZXdJbWFnZS5idXR0b24uc2F2ZSI6IlNhdmUgSW1hZ2UiLCJ1bmkucHJldmlld0ltYWdlLnNhdmUuc3VjY2VzcyI6IlNhdmVkIHN1Y2Nlc3NmdWxseSIsInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5mYWlsIjoiU2F2ZSBmYWlsZWQiLCJ1bmkuc2V0Q2xpcGJvYXJkRGF0YS5zdWNjZXNzIjoiQ29udGVudCBjb3BpZWQiLCJ1bmkuc2NhbkNvZGUudGl0bGUiOiJTY2FuIGNvZGUiLCJ1bmkuc2NhbkNvZGUuYWxidW0iOiJBbGJ1bSIsInVuaS5zY2FuQ29kZS5mYWlsIjoiUmVjb2duaXRpb24gZmFpbHVyZSIsInVuaS5zY2FuQ29kZS5mbGFzaC5vbiI6IlRhcCB0byB0dXJuIGxpZ2h0IG9uIiwidW5pLnNjYW5Db2RlLmZsYXNoLm9mZiI6IlRhcCB0byB0dXJuIGxpZ2h0IG9mZiIsInVuaS5zdGFydFNvdGVyQXV0aGVudGljYXRpb24uYXV0aENvbnRlbnQiOiJGaW5nZXJwcmludCByZWNvZ25pdGlvbiIsInVuaS5zdGFydFNvdGVyQXV0aGVudGljYXRpb24ud2FpdGluZ0NvbnRlbnQiOiJVbnJlY29nbml6YWJsZSIsInVuaS5waWNrZXIuZG9uZSI6IkRvbmUiLCJ1bmkucGlja2VyLmNhbmNlbCI6IkNhbmNlbCIsInVuaS52aWRlby5kYW5tdSI6IkRhbm11IiwidW5pLnZpZGVvLnZvbHVtZSI6IlZvbHVtZSIsInVuaS5idXR0b24uZmVlZGJhY2sudGl0bGUiOiJmZWVkYmFjayIsInVuaS5idXR0b24uZmVlZGJhY2suc2VuZCI6InNlbmQiLCJ1bmkuY2hvb3NlTG9jYXRpb24uc2VhcmNoIjoiRmluZCBQbGFjZSIsInVuaS5jaG9vc2VMb2NhdGlvbi5jYW5jZWwiOiJDYW5jZWwifSxlLmVzPXsidW5pLmFwcC5xdWl0IjoiUHVsc2Ugb3RyYSB2ZXogcGFyYSBzYWxpciIsInVuaS5hc3luYy5lcnJvciI6IlNlIGFnb3TDsyBlbCB0aWVtcG8gZGUgY29uZXhpw7NuLCBoYWdhIGNsaWMgZW4gbGEgcGFudGFsbGEgcGFyYSB2b2x2ZXIgYSBpbnRlbnRhcmxvLiIsInVuaS5zaG93QWN0aW9uU2hlZXQuY2FuY2VsIjoiQ2FuY2VsYXIiLCJ1bmkuc2hvd1RvYXN0LnVucGFpcmVkIjoiVGVuZ2EgZW4gY3VlbnRhIHF1ZSBzaG93VG9hc3QgZGViZSBlc3RhciBlbXBhcmVqYWRvIGNvbiBoaWRlVG9hc3QiLCJ1bmkuc2hvd0xvYWRpbmcudW5wYWlyZWQiOiJUZW5nYSBlbiBjdWVudGEgcXVlIHNob3dMb2FkaW5nIGRlYmUgZXN0YXIgZW1wYXJlamFkbyBjb24gaGlkZUxvYWRpbmciLCJ1bmkuc2hvd01vZGFsLmNhbmNlbCI6IkNhbmNlbGFyIiwidW5pLnNob3dNb2RhbC5jb25maXJtIjoiT0siLCJ1bmkuY2hvb3NlSW1hZ2UuY2FuY2VsIjoiQ2FuY2VsYXIiLCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5hbGJ1bSI6IsOBbGJ1bSIsInVuaS5jaG9vc2VJbWFnZS5zb3VyY2VUeXBlLmNhbWVyYSI6IkPDoW1hcmEiLCJ1bmkuY2hvb3NlVmlkZW8uY2FuY2VsIjoiQ2FuY2VsYXIiLCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5hbGJ1bSI6IsOBbGJ1bSIsInVuaS5jaG9vc2VWaWRlby5zb3VyY2VUeXBlLmNhbWVyYSI6IkPDoW1hcmEiLCJ1bmkuY2hvb3NlRmlsZS5ub3RVc2VyQWN0aXZhdGlvbiI6IkVsIGN1YWRybyBkZSBkacOhbG9nbyBkZWwgc2VsZWN0b3IgZGUgYXJjaGl2b3Mgc29sbyBzZSBwdWVkZSBtb3N0cmFyIGNvbiBsYSBhY3RpdmFjacOzbiBkZWwgdXN1YXJpbyIsInVuaS5wcmV2aWV3SW1hZ2UuY2FuY2VsIjoiQ2FuY2VsYXIiLCJ1bmkucHJldmlld0ltYWdlLmJ1dHRvbi5zYXZlIjoiR3VhcmRhciBpbWFnZW4iLCJ1bmkucHJldmlld0ltYWdlLnNhdmUuc3VjY2VzcyI6Ikd1YXJkYWRvIGV4aXRvc2FtZW50ZSIsInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5mYWlsIjoiRXJyb3IgYWwgZ3VhcmRhciIsInVuaS5zZXRDbGlwYm9hcmREYXRhLnN1Y2Nlc3MiOiJDb250ZW5pZG8gY29waWFkbyIsInVuaS5zY2FuQ29kZS50aXRsZSI6IkPDs2RpZ28gZGUgZXNjYW5lbyIsInVuaS5zY2FuQ29kZS5hbGJ1bSI6IsOBbGJ1bSIsInVuaS5zY2FuQ29kZS5mYWlsIjoiw4ljaGVjIGRlIGxhIHJlY29ubmFpc3NhbmNlIiwidW5pLnNjYW5Db2RlLmZsYXNoLm9uIjoiVG9xdWUgcGFyYSBlbmNlbmRlciBsYSBsdXoiLCJ1bmkuc2NhbkNvZGUuZmxhc2gub2ZmIjoiVG9xdWUgcGFyYSBhcGFnYXIgbGEgbHV6IiwidW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi5hdXRoQ29udGVudCI6IlJlY29ub2NpbWllbnRvIGRlIGh1ZWxsYXMgZGFjdGlsYXJlcyIsInVuaS5zdGFydFNvdGVyQXV0aGVudGljYXRpb24ud2FpdGluZ0NvbnRlbnQiOiJJcnJlY29ub2NpYmxlIiwidW5pLnBpY2tlci5kb25lIjoiT0siLCJ1bmkucGlja2VyLmNhbmNlbCI6IkNhbmNlbGFyIiwidW5pLnZpZGVvLmRhbm11IjoiRGFubXUiLCJ1bmkudmlkZW8udm9sdW1lIjoiVm9sdW1lbiIsInVuaS5idXR0b24uZmVlZGJhY2sudGl0bGUiOiJyZWFsaW1lbnRhY2nDs24iLCJ1bmkuYnV0dG9uLmZlZWRiYWNrLnNlbmQiOiJlbnZpYXIiLCJ1bmkuY2hvb3NlTG9jYXRpb24uc2VhcmNoIjoiRW5jb250cmFyIiwidW5pLmNob29zZUxvY2F0aW9uLmNhbmNlbCI6IkNhbmNlbGFyIn0sZS5mcj17InVuaS5hcHAucXVpdCI6IkFwcHV5ZXogw6Agbm91dmVhdSBwb3VyIHF1aXR0ZXIgbCdhcHBsaWNhdGlvbiIsInVuaS5hc3luYy5lcnJvciI6IkxhIGNvbm5leGlvbiBhIGV4cGlyw6ksIGNsaXF1ZXogc3VyIGwnw6ljcmFuIHBvdXIgcsOpZXNzYXllci4iLCJ1bmkuc2hvd0FjdGlvblNoZWV0LmNhbmNlbCI6IkFubnVsZXIiLCJ1bmkuc2hvd1RvYXN0LnVucGFpcmVkIjoiVmV1aWxsZXogbm90ZXIgcXVlIHNob3dUb2FzdCBkb2l0IMOqdHJlIGFzc29jacOpIMOgIGhpZGVUb2FzdCIsInVuaS5zaG93TG9hZGluZy51bnBhaXJlZCI6IlZldWlsbGV6IG5vdGVyIHF1ZSBzaG93TG9hZGluZyBkb2l0IMOqdHJlIGFzc29jacOpIMOgIGhpZGVMb2FkaW5nIiwidW5pLnNob3dNb2RhbC5jYW5jZWwiOiJBbm51bGVyIiwidW5pLnNob3dNb2RhbC5jb25maXJtIjoiT0siLCJ1bmkuY2hvb3NlSW1hZ2UuY2FuY2VsIjoiQW5udWxlciIsInVuaS5jaG9vc2VJbWFnZS5zb3VyY2VUeXBlLmFsYnVtIjoiQWxidW0iLCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5jYW1lcmEiOiJDYW3DqXJhIiwidW5pLmNob29zZVZpZGVvLmNhbmNlbCI6IkFubnVsZXIiLCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5hbGJ1bSI6IkFsYnVtIiwidW5pLmNob29zZVZpZGVvLnNvdXJjZVR5cGUuY2FtZXJhIjoiQ2Ftw6lyYSIsInVuaS5jaG9vc2VGaWxlLm5vdFVzZXJBY3RpdmF0aW9uIjoiTGEgYm/DrnRlIGRlIGRpYWxvZ3VlIGR1IHPDqWxlY3RldXIgZGUgZmljaGllciBuZSBwZXV0IMOqdHJlIGFmZmljaMOpZSBxdSdhdmVjIHVuZSBhY3RpdmF0aW9uIHBhciBsJ3V0aWxpc2F0ZXVyIiwidW5pLnByZXZpZXdJbWFnZS5jYW5jZWwiOiJBbm51bGVyIiwidW5pLnByZXZpZXdJbWFnZS5idXR0b24uc2F2ZSI6Ikd1YXJkYXIgaW1hZ2VuIiwidW5pLnByZXZpZXdJbWFnZS5zYXZlLnN1Y2Nlc3MiOiJFbnJlZ2lzdHLDqSBhdmVjIHN1Y2PDqHMiLCJ1bmkucHJldmlld0ltYWdlLnNhdmUuZmFpbCI6IsOJY2hlYyBkZSBsYSBzYXV2ZWdhcmRlIiwidW5pLnNldENsaXBib2FyZERhdGEuc3VjY2VzcyI6IkNvbnRlbnUgY29wacOpIiwidW5pLnNjYW5Db2RlLnRpdGxlIjoiQ29kZSBk4oCZYW5hbHlzZSIsInVuaS5zY2FuQ29kZS5hbGJ1bSI6IkFsYnVtIiwidW5pLnNjYW5Db2RlLmZhaWwiOiJGYWxsbyBkZSByZWNvbm9jaW1pZW50byIsInVuaS5zY2FuQ29kZS5mbGFzaC5vbiI6IkFwcHV5ZXogcG91ciBhY3RpdmVyIGwnw6ljbGFpcmFnZSIsInVuaS5zY2FuQ29kZS5mbGFzaC5vZmYiOiJBcHB1eWV6IHBvdXIgZMOpc2FjdGl2ZXIgbCfDqWNsYWlyYWdlIiwidW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi5hdXRoQ29udGVudCI6IlJlY29ubmFpc3NhbmNlIGRlIGwnZW1wcmVpbnRlIGRpZ2l0YWxlIiwidW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi53YWl0aW5nQ29udGVudCI6Ik3DqWNvbm5haXNzYWJsZSIsInVuaS5waWNrZXIuZG9uZSI6Ik9LIiwidW5pLnBpY2tlci5jYW5jZWwiOiJBbm51bGVyIiwidW5pLnZpZGVvLmRhbm11IjoiRGFubXUiLCJ1bmkudmlkZW8udm9sdW1lIjoiTGUgVm9sdW1lIiwidW5pLmJ1dHRvbi5mZWVkYmFjay50aXRsZSI6InJldG91ciBkJ2luZm9ybWF0aW9uIiwidW5pLmJ1dHRvbi5mZWVkYmFjay5zZW5kIjoiZW52b3llciIsInVuaS5jaG9vc2VMb2NhdGlvbi5zZWFyY2giOiJUcm91dmUiLCJ1bmkuY2hvb3NlTG9jYXRpb24uY2FuY2VsIjoiQW5udWxlciJ9LGVbInpoLUhhbnMiXT17InVuaS5hcHAucXVpdCI6IuWGjeaMieS4gOasoemAgOWHuuW6lOeUqCIsInVuaS5hc3luYy5lcnJvciI6Iui/nuaOpeacjeWKoeWZqOi2heaXtu+8jOeCueWHu+Wxj+W5lemHjeivlSIsInVuaS5zaG93QWN0aW9uU2hlZXQuY2FuY2VsIjoi5Y+W5raIIiwidW5pLnNob3dUb2FzdC51bnBhaXJlZCI6Iuivt+azqOaEjyBzaG93VG9hc3Qg5LiOIGhpZGVUb2FzdCDlv4XpobvphY3lr7nkvb/nlKgiLCJ1bmkuc2hvd0xvYWRpbmcudW5wYWlyZWQiOiLor7fms6jmhI8gc2hvd0xvYWRpbmcg5LiOIGhpZGVMb2FkaW5nIOW/hemhu+mFjeWvueS9v+eUqCIsInVuaS5zaG93TW9kYWwuY2FuY2VsIjoi5Y+W5raIIiwidW5pLnNob3dNb2RhbC5jb25maXJtIjoi56Gu5a6aIiwidW5pLmNob29zZUltYWdlLmNhbmNlbCI6IuWPlua2iCIsInVuaS5jaG9vc2VJbWFnZS5zb3VyY2VUeXBlLmFsYnVtIjoi5LuO55u45YaM6YCJ5oupIiwidW5pLmNob29zZUltYWdlLnNvdXJjZVR5cGUuY2FtZXJhIjoi5ouN5pGEIiwidW5pLmNob29zZVZpZGVvLmNhbmNlbCI6IuWPlua2iCIsInVuaS5jaG9vc2VWaWRlby5zb3VyY2VUeXBlLmFsYnVtIjoi5LuO55u45YaM6YCJ5oupIiwidW5pLmNob29zZVZpZGVvLnNvdXJjZVR5cGUuY2FtZXJhIjoi5ouN5pGEIiwidW5pLmNob29zZUZpbGUubm90VXNlckFjdGl2YXRpb24iOiLmlofku7bpgInmi6nlmajlr7nor53moYblj6rog73lnKjnlLHnlKjmiLfmv4DmtLvml7bmmL7npLoiLCJ1bmkucHJldmlld0ltYWdlLmNhbmNlbCI6IuWPlua2iCIsInVuaS5wcmV2aWV3SW1hZ2UuYnV0dG9uLnNhdmUiOiLkv53lrZjlm77lg48iLCJ1bmkucHJldmlld0ltYWdlLnNhdmUuc3VjY2VzcyI6IuS/neWtmOWbvuWDj+WIsOebuOWGjOaIkOWKnyIsInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5mYWlsIjoi5L+d5a2Y5Zu+5YOP5Yiw55u45YaM5aSx6LSlIiwidW5pLnNldENsaXBib2FyZERhdGEuc3VjY2VzcyI6IuWGheWuueW3suWkjeWItiIsInVuaS5zY2FuQ29kZS50aXRsZSI6IuaJq+eggSIsInVuaS5zY2FuQ29kZS5hbGJ1bSI6IuebuOWGjCIsInVuaS5zY2FuQ29kZS5mYWlsIjoi6K+G5Yir5aSx6LSlIiwidW5pLnNjYW5Db2RlLmZsYXNoLm9uIjoi6L276Kem54Wn5LquIiwidW5pLnNjYW5Db2RlLmZsYXNoLm9mZiI6Iui9u+inpuWFs+mXrSIsInVuaS5zdGFydFNvdGVyQXV0aGVudGljYXRpb24uYXV0aENvbnRlbnQiOiLmjIfnurnor4bliKvkuK0uLi4iLCJ1bmkuc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uLndhaXRpbmdDb250ZW50Ijoi5peg5rOV6K+G5YirIiwidW5pLnBpY2tlci5kb25lIjoi5a6M5oiQIiwidW5pLnBpY2tlci5jYW5jZWwiOiLlj5bmtogiLCJ1bmkudmlkZW8uZGFubXUiOiLlvLnluZUiLCJ1bmkudmlkZW8udm9sdW1lIjoi6Z+z6YePIiwidW5pLmJ1dHRvbi5mZWVkYmFjay50aXRsZSI6IumXrumimOWPjemmiCIsInVuaS5idXR0b24uZmVlZGJhY2suc2VuZCI6IuWPkemAgSIsInVuaS5jaG9vc2VMb2NhdGlvbi5zZWFyY2giOiLmkJzntKLlnLDngrkiLCJ1bmkuY2hvb3NlTG9jYXRpb24uY2FuY2VsIjoi5Y+W5raIIn0sZVsiemgtSGFudCJdPXsidW5pLmFwcC5xdWl0Ijoi5YaN5oyJ5LiA5qyh6YCA5Ye65oeJ55SoIiwidW5pLmFzeW5jLmVycm9yIjoi6YCj5o6l5pyN5YuZ5Zmo6LaF5pmC77yM6bue5pOK5bGP5bmV6YeN6KmmIiwidW5pLnNob3dBY3Rpb25TaGVldC5jYW5jZWwiOiLlj5bmtogiLCJ1bmkuc2hvd1RvYXN0LnVucGFpcmVkIjoi6KuL5rOo5oSPIHNob3dUb2FzdCDoiIcgaGlkZVRvYXN0IOW/hemgiOmFjeWwjeS9v+eUqCIsInVuaS5zaG93TG9hZGluZy51bnBhaXJlZCI6Iuiri+azqOaEjyBzaG93TG9hZGluZyDoiIcgaGlkZUxvYWRpbmcg5b+F6aCI6YWN5bCN5L2/55SoIiwidW5pLnNob3dNb2RhbC5jYW5jZWwiOiLlj5bmtogiLCJ1bmkuc2hvd01vZGFsLmNvbmZpcm0iOiLnorrlrpoiLCJ1bmkuY2hvb3NlSW1hZ2UuY2FuY2VsIjoi5Y+W5raIIiwidW5pLmNob29zZUltYWdlLnNvdXJjZVR5cGUuYWxidW0iOiLlvp7nm7jlhorpgbjmk4ciLCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5jYW1lcmEiOiLmi43mlJ0iLCJ1bmkuY2hvb3NlVmlkZW8uY2FuY2VsIjoi5Y+W5raIIiwidW5pLmNob29zZVZpZGVvLnNvdXJjZVR5cGUuYWxidW0iOiLlvp7nm7jlhorpgbjmk4ciLCJ1bmkuY2hvb3NlVmlkZW8uc291cmNlVHlwZS5jYW1lcmEiOiLmi43mlJ0iLCJ1bmkuY2hvb3NlRmlsZS5ub3RVc2VyQWN0aXZhdGlvbiI6IuaWh+S7tumBuOaTh+WZqOWwjeipseahhuWPquiDveWcqOeUseeUqOaItua/gOa0u+aZgumhr+ekuiIsInVuaS5wcmV2aWV3SW1hZ2UuY2FuY2VsIjoi5Y+W5raIIiwidW5pLnByZXZpZXdJbWFnZS5idXR0b24uc2F2ZSI6IuS/neWtmOWcluWDjyIsInVuaS5wcmV2aWV3SW1hZ2Uuc2F2ZS5zdWNjZXNzIjoi5L+d5a2Y5ZyW5YOP5Yiw55u45YaK5oiQ5YqfIiwidW5pLnByZXZpZXdJbWFnZS5zYXZlLmZhaWwiOiLkv53lrZjlnJblg4/liLDnm7jlhorlpLHmlZciLCJ1bmkuc2V0Q2xpcGJvYXJkRGF0YS5zdWNjZXNzIjoi5YWn5a655bey5b6p5Yi2IiwidW5pLnNjYW5Db2RlLnRpdGxlIjoi5o6D56K8IiwidW5pLnNjYW5Db2RlLmFsYnVtIjoi55u45YaKIiwidW5pLnNjYW5Db2RlLmZhaWwiOiLorZjliKXlpLHmlZciLCJ1bmkuc2NhbkNvZGUuZmxhc2gub24iOiLovJXop7jnhafkuq4iLCJ1bmkuc2NhbkNvZGUuZmxhc2gub2ZmIjoi6LyV6Ke46Zec6ZaJIiwidW5pLnN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbi5hdXRoQ29udGVudCI6IuaMh+e0i+itmOWIpeS4rS4uLiIsInVuaS5zdGFydFNvdGVyQXV0aGVudGljYXRpb24ud2FpdGluZ0NvbnRlbnQiOiLnhKHms5XorZjliKUiLCJ1bmkucGlja2VyLmRvbmUiOiLlrozmiJAiLCJ1bmkucGlja2VyLmNhbmNlbCI6IuWPlua2iCIsInVuaS52aWRlby5kYW5tdSI6IuW9iOW5lSIsInVuaS52aWRlby52b2x1bWUiOiLpn7Pph48iLCJ1bmkuYnV0dG9uLmZlZWRiYWNrLnRpdGxlIjoi5ZWP6aGM5Y+N6aWLIiwidW5pLmJ1dHRvbi5mZWVkYmFjay5zZW5kIjoi55m86YCBIiwidW5pLmNob29zZUxvY2F0aW9uLnNlYXJjaCI6IuaQnOe0ouWcsOm7niIsInVuaS5jaG9vc2VMb2NhdGlvbi5jYW5jZWwiOiLlj5bmtogifSxlKSksZXQ9Im9iamVjdCI9PXR5cGVvZiBuZz9uZy5yZXF1aXJlTW9kdWxlKCJwbHVzIikuZ2V0TGFuZ3VhZ2UoKToiIixmdW5jdGlvbigpe2lmKGR0KCkpe3ZhciBlPU9iamVjdC5rZXlzKHVnLmxvY2FsZXMpO2UubGVuZ3RoJiZlLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9aXRbZV0sbj11Zy5sb2NhbGVzW2VdO3Q/T2JqZWN0LmFzc2lnbih0LG4pOml0W2VdPW59KX19KCk7dmFyIG90PWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpO3ZvaWQgMD09PXQmJih0PXt9KSwic3RyaW5nIiE9dHlwZW9mIGUmJihlPShpPVt0LGVdKVswXSx0PWlbMV0pLCJzdHJpbmciIT10eXBlb2YgZSYmKGU9dm9pZCAwIT09ZGcmJmRnLmdldExvY2FsZT9kZy5nZXRMb2NhbGUoKTp2b2lkIDAhPT1nbG9iYWwmJmdsb2JhbC5nZXRMb2NhbGU/Z2xvYmFsLmdldExvY2FsZSgpOkdlKSwic3RyaW5nIiE9dHlwZW9mIG4mJihuPXZvaWQgMCE9PXVnJiZ1Zy5mYWxsYmFja0xvY2FsZXx8R2UpO3ZhciBhPW5ldyBaZSh7bG9jYWxlOmUsZmFsbGJhY2tMb2NhbGU6bixtZXNzYWdlczp0LHdhdGNoZXI6cn0pLHM9ZnVuY3Rpb24oZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZmcpcz1mdW5jdGlvbihlLHQpe3JldHVybiBhLnQoZSx0KX07ZWxzZXt2YXIgbz0hMTtzPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPWZnKCkuJHZtO3JldHVybiBpJiYoaS4kbG9jYWxlLG98fChvPSEwLHI9YSwobj1pKS4kd2F0Y2hMb2NhbGU/bi4kd2F0Y2hMb2NhbGUoZnVuY3Rpb24oZSl7ci5zZXRMb2NhbGUoZSl9KTpuLiR3YXRjaChmdW5jdGlvbigpe3JldHVybiBuLiRsb2NhbGV9LGZ1bmN0aW9uKGUpe3Iuc2V0TG9jYWxlKGUpfSkpKSxhLnQoZSx0KX19cmV0dXJuIHMoZSx0KX07cmV0dXJue2kxOG46YSxmOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gYS5mKGUsdCxuKX0sdDpmdW5jdGlvbihlLHQpe3JldHVybiBzKGUsdCl9LGFkZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHZvaWQgMD09PW4mJihuPSEwKSxhLmFkZChlLHQsbil9LHdhdGNoOmZ1bmN0aW9uKGUpe3JldHVybiBhLndhdGNoTG9jYWxlKGUpfSxnZXRMb2NhbGU6ZnVuY3Rpb24oKXtyZXR1cm4gYS5nZXRMb2NhbGUoKX0sc2V0TG9jYWxlOmZ1bmN0aW9uKGUpe3JldHVybiBhLnNldExvY2FsZShlKX19fShldCxpdCksYXQ9b3QudCxzdD0ob3QubWl4aW49e2JlZm9yZUNyZWF0ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1vdC5pMThuLndhdGNoTG9jYWxlKGZ1bmN0aW9uKCl7ZS4kZm9yY2VVcGRhdGUoKX0pO3RoaXMuJG9uY2UoImhvb2s6YmVmb3JlRGVzdHJveSIsZnVuY3Rpb24oKXt0KCl9KX0sbWV0aG9kczp7JCR0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGF0KGUsdCl9fX0sb3QuZ2V0TG9jYWxlKTt2YXIgY3Q9WyIlIiwiJSJdO2Z1bmN0aW9uIHV0KGUpe3JldHVybiBRZShlLGN0KT9vdC5mKGUsKHQ9ZGcuZ2V0TG9jYWxlKCksKG49dWcubG9jYWxlcylbdF18fG5bdWcuZmFsbGJhY2tMb2NhbGVdfHxuW3J0XXx8e30pLGN0KTplO3ZhciB0LG59ZnVuY3Rpb24gbHQodCxlKXtyZXR1cm4gZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uIHQoZSxuKXt2YXIgcj1mdW5jdGlvbiBlKHQsbil7aWYoMSE9PW4ubGVuZ3RoKXt2YXIgcj1uLnNoaWZ0KCk7cmV0dXJuIGUodCYmdFtyXSxuKX1pZih0KXt2YXIgaT1mdW5jdGlvbihlKXtyZXR1cm4gdShlKSYmUWUoZSxjdCl9LG89blswXSxhPVtdO2lmKEFycmF5LmlzQXJyYXkodCkmJihhPXQuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBpKGVbb10pfSkpLmxlbmd0aClyZXR1cm4gYTt2YXIgcz10W29dO2lmKGkocykpcmV0dXJuIHR9fShlLG4pO2lmKCFyKXJldHVybiExO3ZhciBpPW5bbi5sZW5ndGgtMV07aWYoQXJyYXkuaXNBcnJheShyKSlyLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSxbaV0pfSk7ZWxzZXt2YXIgbz1yW2ldO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLGkse2dldDpmdW5jdGlvbigpe3JldHVybiB1dChvKX0sc2V0OmZ1bmN0aW9uKGUpe289ZX19KX1yZXR1cm4hMH0odCxlKX0pfWZ1bmN0aW9uIGR0KCl7cmV0dXJuIHZvaWQgMCE9PXVnJiZ1Zy5sb2NhbGVzJiYhIU9iamVjdC5rZXlzKHVnLmxvY2FsZXMpLmxlbmd0aH12YXIgZnQ9e2RhdGE6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxzaG93VG9hc3Q6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiEwfSxiZWZvcmVTdWNjZXNzOmZ1bmN0aW9uKGUsdCl7aWYodC5zaG93VG9hc3Qpe3ZhciBuPWF0KCJ1bmkuc2V0Q2xpcGJvYXJkRGF0YS5zdWNjZXNzIik7biYmZGcuc2hvd1RvYXN0KHt0aXRsZTpuLGljb246InN1Y2Nlc3MiLG1hc2s6ITEsc3R5bGU6e3dpZHRoOnZvaWQgMH19KX19fSxwdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxzZXRDbGlwYm9hcmREYXRhOmZ0fSk7ZnVuY3Rpb24gaHQoZSx0KXtpZih0KXtpZigwPT09dC5pbmRleE9mKCIvIikpcmV0dXJuIHR9ZWxzZXtpZigwPT09KHQ9ZSkuaW5kZXhPZigiLyIpKXJldHVybiB0O3ZhciBuPXBnKCk7ZT1uLmxlbmd0aD9uW24ubGVuZ3RoLTFdLiRwYWdlLnJvdXRlOiIifWlmKDA9PT10LmluZGV4T2YoIi4vIikpcmV0dXJuIGh0KGUsdC5zdWJzdHIoMikpO2Zvcih2YXIgcj10LnNwbGl0KCIvIiksaT1yLmxlbmd0aCxvPTA7bzxpJiYiLi4iPT09cltvXTtvKyspO3Iuc3BsaWNlKDAsbyksdD1yLmpvaW4oIi8iKTt2YXIgYT0wPGUubGVuZ3RoP2Uuc3BsaXQoIi8iKTpbXTtyZXR1cm4gYS5zcGxpY2UoYS5sZW5ndGgtby0xLG8rMSksIi8iK2EuY29uY2F0KHIpLmpvaW4oIi8iKX12YXIgdnQsZ3Q9L14oW2Etei1dKzopP1wvXC8vaSxtdD0vXmRhdGE6LiosLiovO2Z1bmN0aW9uIHl0KGUpe3JldHVybiByZy5pby5jb252ZXJ0TG9jYWxGaWxlU3lzdGVtVVJMKGUpLnJlcGxhY2UoL15cLz9hcHBzXC8vLCIvYW5kcm9pZF9hc3NldC9hcHBzLyIpLnJlcGxhY2UoL1wvJC8sIiIpfWZ1bmN0aW9uIF90KGUpe3JldHVybiB2dHx8KHZ0PSJmaWxlOi8vIit5dCgiX3d3dyIpKyIvIiksdnQrZX1mdW5jdGlvbiBidChlKXtpZigwPT09ZS5pbmRleE9mKCIvIikpcmV0dXJuIDA9PT1lLmluZGV4T2YoIi8vIik/Imh0dHBzOiIrZTplLnN0YXJ0c1dpdGgoIi9zdG9yYWdlLyIpfHxlLnN0YXJ0c1dpdGgoIi9zZGNhcmQvIil8fGUuaW5jbHVkZXMoIi9Db250YWluZXJzL0RhdGEvQXBwbGljYXRpb24vIik/ImZpbGU6Ly8iK2U6X3QoZS5zdWJzdHIoMSkpO2lmKGd0LnRlc3QoZSl8fG10LnRlc3QoZSl8fDA9PT1lLmluZGV4T2YoImJsb2I6IikpcmV0dXJuIGU7aWYoMD09PWUuaW5kZXhPZigiX3d3dyIpfHwwPT09ZS5pbmRleE9mKCJfZG8iKSlyZXR1cm4iZmlsZTovLyIreXQoZSk7dmFyIHQ9cGcoKTtyZXR1cm4gdC5sZW5ndGg/X3QoaHQodFt0Lmxlbmd0aC0xXS4kcGFnZS5yb3V0ZSxlKS5zdWJzdHIoMSkpOmV9dmFyIHd0PXt0ZW1wRmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QudGVtcEZpbGVQYXRoPWJ0KGUpfX19LGt0PVsibWQ1Iiwic2hhMSJdLFN0PXtmaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5maWxlUGF0aD1idChlKX19LGRpZ2VzdEFsZ29yaXRobTp7dHlwZTpTdHJpbmcsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5kaWdlc3RBbGdvcml0aG09a3QuaW5jbHVkZXMoZSk/ZTprdFswXX0sZGVmYXVsdDprdFswXX19LHh0PXtmaWxlUGF0aDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5maWxlUGF0aD1idChlKX19fSxDdD17ZmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuZmlsZVBhdGg9YnQoZSl9fX0sVHQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsc2F2ZUZpbGU6d3QsZ2V0RmlsZUluZm86U3QsZ2V0U2F2ZWRGaWxlSW5mbzp4dCxyZW1vdmVTYXZlZEZpbGU6Q3R9KSxPdD17ZmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxmaWxlVHlwZTp7dHlwZTpTdHJpbmd9fSxFdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvcGVuRG9jdW1lbnQ6T3R9KSxBdD17a2V5d29yZDp7dHlwZTpTdHJpbmd9fSxJdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjaG9vc2VMb2NhdGlvbjpBdH0pLCR0PVsid2dzODQiLCJnY2owMiJdLFB0PXt0eXBlOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPShlfHwiIikudG9Mb3dlckNhc2UoKSx0LnR5cGU9JHQuaW5kZXhPZihlKTwwPyR0WzBdOmV9fSxhbHRpdHVkZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9fSxNdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxnZXRMb2NhdGlvbjpQdH0pLGp0PXtsYXRpdHVkZTp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITB9LGxvbmdpdHVkZTp7dHlwZTpOdW1iZXIscmVxdWlyZWQ6ITB9LHNjYWxlOnt0eXBlOk51bWJlcix2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPU1hdGguZmxvb3IoZSksdC5zY2FsZT01PD1lJiZlPD0xOD9lOjE4fSxkZWZhdWx0OjE4fSxuYW1lOnt0eXBlOlN0cmluZ30sYWRkcmVzczp7dHlwZTpTdHJpbmd9fSxMdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvcGVuTG9jYXRpb246anR9KSxOdD1bImFsbCIsImltYWdlIiwidmlkZW8iXSxCdD1bImFsYnVtIiwiY2FtZXJhIl0sRHQ9e2NvdW50Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMSxkZWZhdWx0OjEwMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPD0wJiYodC5jb3VudD0xMDApfX0sc291cmNlVHlwZTp7dHlwZTpBcnJheSxyZXF1aXJlZDohMSxkZWZhdWx0OkJ0LHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9ZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIEJ0LmluY2x1ZGVzKGUpfSksdC5zb3VyY2VUeXBlPWUubGVuZ3RoP2U6QnR9fSx0eXBlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMSxkZWZhdWx0OiJhbGwiLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe050LmluY2x1ZGVzKGUpfHwodC50eXBlPU50WzBdKSx0LnR5cGU9ImFsbCI9PT10LnR5cGU/dC50eXBlPSIqIjp0LnR5cGV9fSxleHRlbnNpb246e3R5cGU6QXJyYXksZGVmYXVsdDpbIiJdLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4icGFyYW0gZXh0ZW5zaW9uIHNob3VsZCBub3QgYmUgZW1wdHkuIn19fSxSdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjaG9vc2VGaWxlOkR0fSksRnQ9WyJvcmlnaW5hbCIsImNvbXByZXNzZWQiXSx6dD1bImFsYnVtIiwiY2FtZXJhIl0sVXQ9e2NvdW50Ont0eXBlOk51bWJlcixyZXF1aXJlZDohMSxkZWZhdWx0OjksdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZTw9MCYmKHQuY291bnQ9OSl9fSxzaXplVHlwZTp7dHlwZTpbQXJyYXksU3RyaW5nXSxyZXF1aXJlZDohMSxkZWZhdWx0OkZ0LHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9KGU9InN0cmluZyI9PXR5cGVvZiBlP1tlXTplKS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIEZ0LmluY2x1ZGVzKGUpfSksdC5zaXplVHlwZT1lLmxlbmd0aD9lOkZ0fX0sc291cmNlVHlwZTp7dHlwZTpBcnJheSxyZXF1aXJlZDohMSxkZWZhdWx0Onp0LHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2U9ZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIHp0LmluY2x1ZGVzKGUpfSksdC5zb3VyY2VUeXBlPWUubGVuZ3RoP2U6enR9fSxleHRlbnNpb246e3R5cGU6QXJyYXksZGVmYXVsdDpbIioiXSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuInBhcmFtIGV4dGVuc2lvbiBzaG91bGQgbm90IGJlIGVtcHR5LiJ9fX0sVnQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY2hvb3NlSW1hZ2U6VXR9KSxxdD1bImFsYnVtIiwiY2FtZXJhIl0sV3Q9e3NvdXJjZVR5cGU6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITEsZGVmYXVsdDpxdCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPWUuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBxdC5pbmNsdWRlcyhlKX0pLHQuc291cmNlVHlwZT1lLmxlbmd0aD9lOnF0fX0sY29tcHJlc3NlZDp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITB9LG1heER1cmF0aW9uOnt0eXBlOk51bWJlcixkZWZhdWx0OjYwfSxjYW1lcmE6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6ImJhY2sifSxleHRlbnNpb246e3R5cGU6QXJyYXksZGVmYXVsdDpbIioiXSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuInBhcmFtIGV4dGVuc2lvbiBzaG91bGQgbm90IGJlIGVtcHR5LiJ9fX0sSHQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY2hvb3NlVmlkZW86V3R9KSxHdD17c3JjOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LnNyYz1idChlKX19fSxYdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjb21wcmVzc0ltYWdlOkd0fSksWXQ9e3NyYzp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dC5zcmM9YnQoZSl9fSxxdWFsaXR5Ont0eXBlOlN0cmluZ30sYml0cmF0ZTp7dHlwZTpOdW1iZXJ9LGZwczp7dHlwZTpOdW1iZXJ9LHJlc29sdXRpb246e3R5cGU6TnVtYmVyfX0sSnQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY29tcHJlc3NWaWRlbzpZdH0pLEt0PXtzcmM6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3Quc3JjPWJ0KGUpfX19LFp0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldEltYWdlSW5mbzpLdH0pLFF0PXtzcmM6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3Quc3JjPWJ0KGUpfX19LGVuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldFZpZGVvSW5mbzpRdH0pLHRuPXt1cmxzOnt0eXBlOkFycmF5LHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3ZhciBuO2lmKHQudXJscz1lLm1hcChmdW5jdGlvbihlKXtpZigic3RyaW5nIj09dHlwZW9mIGUpcmV0dXJuIGJ0KGUpO249ITB9KSxuKXJldHVybiJ1cmwgaXMgbm90IHN0cmluZyJ9fSxjdXJyZW50Ont0eXBlOltTdHJpbmcsTnVtYmVyXSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXsibnVtYmVyIj09dHlwZW9mIGU/dC5jdXJyZW50PTA8ZSYmZTx0LnVybHMubGVuZ3RoP2U6MDoic3RyaW5nIj09dHlwZW9mIGUmJmUmJih0LmN1cnJlbnQ9YnQoZSkpfSxkZWZhdWx0OjB9fSxubj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxwcmV2aWV3SW1hZ2U6dG59KSxybj17ZmlsZVBhdGg6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuZmlsZVBhdGg9YnQoZSl9fX0sb249T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsc2F2ZUltYWdlVG9QaG90b3NBbGJ1bTpybn0pLGFuPXt1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxoZWFkZXI6e3R5cGU6T2JqZWN0LHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuaGVhZGVyPWV8fHt9fX19LHNuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGRvd25sb2FkRmlsZTphbn0pLGNuPXtPUFRJT05TOiJPUFRJT05TIixHRVQ6IkdFVCIsSEVBRDoiSEVBRCIsUE9TVDoiUE9TVCIsUFVUOiJQVVQiLERFTEVURToiREVMRVRFIixUUkFDRToiVFJBQ0UiLENPTk5FQ1Q6IkNPTk5FQ1QiLFBBVENIOiJQQVRDSCJ9LHVuPSJqc29uIixsbj17VEVYVDoidGV4dCIsQVJSQVlCVUZGRVI6ImFycmF5YnVmZmVyIn0sZG49ZW5jb2RlVVJJQ29tcG9uZW50O3ZhciBmbixwbj17bWV0aG9kOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPShlfHwiIikudG9VcHBlckNhc2UoKSx0Lm1ldGhvZD1PYmplY3QudmFsdWVzKGNuKS5pbmRleE9mKGUpPDA/Y24uR0VUOmV9fSxkYXRhOnt0eXBlOltPYmplY3QsU3RyaW5nLEFycmF5LEFycmF5QnVmZmVyXSx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmRhdGE9ZXx8IiJ9fSx1cmw6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QubWV0aG9kPT09Y24uR0VUJiZUKHQuZGF0YSkmJk9iamVjdC5rZXlzKHQuZGF0YSkubGVuZ3RoJiYodC51cmw9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnNwbGl0KCIjIikscj1uWzFdfHwiIixpPShuPW5bMF0uc3BsaXQoIj8iKSlbMV18fCIiO2U9blswXTt2YXIgbz1pLnNwbGl0KCImIikuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlfSk7Zm9yKHZhciBhIGluIGk9e30sby5mb3JFYWNoKGZ1bmN0aW9uKGUpe2U9ZS5zcGxpdCgiPSIpLGlbZVswXV09ZVsxXX0pLHQpaWYoayh0LGEpKXt2YXIgcz10W2FdO251bGw9PXM/cz0iIjpUKHMpJiYocz1KU09OLnN0cmluZ2lmeShzKSksaVtkbihhKV09ZG4ocyl9cmV0dXJuIGUrKChpPU9iamVjdC5rZXlzKGkpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZSsiPSIraVtlXX0pLmpvaW4oIiYiKSk/Ij8iK2k6IiIpKyhyPyIjIityOiIiKX0oZSx0LmRhdGEpKX19LGhlYWRlcjp7dHlwZTpPYmplY3QsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5oZWFkZXI9ZXx8e307dC5tZXRob2QhPT1jbi5HRVQmJihPYmplY3Qua2V5cyhuKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiJjb250ZW50LXR5cGUiPT09ZS50b0xvd2VyQ2FzZSgpfSl8fChuWyJDb250ZW50LVR5cGUiXT0iYXBwbGljYXRpb24vanNvbiIpKX19LGRhdGFUeXBlOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmRhdGFUeXBlPShlfHx1bikudG9Mb3dlckNhc2UoKX19LHJlc3BvbnNlVHlwZTp7dHlwZTpTdHJpbmcsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZT0oZXx8IiIpLnRvTG93ZXJDYXNlKCksdC5yZXNwb25zZVR5cGU9T2JqZWN0LnZhbHVlcyhsbikuaW5kZXhPZihlKTwwP2xuLlRFWFQ6ZX19LHdpdGhDcmVkZW50aWFsczp7dHlwZTpCb29sZWFufSx0aW1lb3V0Ont0eXBlOk51bWJlcn19LGhuPXtjZXJ0aWZpY2F0ZXM6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUpe2lmKGUuc29tZShmdW5jdGlvbihlKXtyZXR1cm4iU3RyaW5nIiE9PXAoZS5ob3N0KX0pKXJldHVybiLlj4LmlbDphY3nva7plJnor6/vvIzor7fnoa7orqTlkI7ph43or5UifX19LHZuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHJlcXVlc3Q6cG4sY29uZmlnTVRMUzpobn0pLGduPXtPUFRJT05TOiJPUFRJT05TIixHRVQ6IkdFVCIsSEVBRDoiSEVBRCIsUE9TVDoiUE9TVCIsUFVUOiJQVVQiLERFTEVURToiREVMRVRFIixUUkFDRToiVFJBQ0UiLENPTk5FQ1Q6IkNPTk5FQ1QifSxtbj17dXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0saGVhZGVyOnt0eXBlOk9iamVjdCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmhlYWRlcj1lfHx7fX19LG1ldGhvZDp7dHlwZTpTdHJpbmcsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZT0oZXx8IiIpLnRvVXBwZXJDYXNlKCksdC5tZXRob2Q9T2JqZWN0LnZhbHVlcyhnbikuaW5kZXhPZihlKTwwP2duLkdFVDplfX0scHJvdG9jb2xzOnt0eXBlOltBcnJheSxTdHJpbmddLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpeyJzdHJpbmciPT10eXBlb2YgZSYmKGU9W2VdKSx0LnByb3RvY29scz0oZXx8W10pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV9KX19fSx5bj17ZGF0YTp7dHlwZTpbU3RyaW5nLEFycmF5QnVmZmVyXX19LF9uPXtjb2RlOnt0eXBlOk51bWJlcn0scmVhc29uOnt0eXBlOlN0cmluZ319LGJuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNvbm5lY3RTb2NrZXQ6bW4sc2VuZFNvY2tldE1lc3NhZ2U6eW4sY2xvc2VTb2NrZXQ6X259KSx3bj17dXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZmlsZXM6e3R5cGU6QXJyYXl9LGZpbGVQYXRoOnt0eXBlOlN0cmluZyx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlJiYodC5maWxlUGF0aD1idChlKSl9fSxuYW1lOnt0eXBlOlN0cmluZ30saGVhZGVyOnt0eXBlOk9iamVjdCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmhlYWRlcj1lfHx7fX19LGZvcm1EYXRhOnt0eXBlOk9iamVjdCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt0LmZvcm1EYXRhPWV8fHt9fX19LGtuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHVwbG9hZEZpbGU6d259KSxTbj17T0FVVEg6Ik9BVVRIIixTSEFSRToiU0hBUkUiLFBBWU1FTlQ6IlBBWU1FTlQiLFBVU0g6IlBVU0gifSx4bj17c2VydmljZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7aWYoKGU9KGV8fCIiKS50b1VwcGVyQ2FzZSgpKSYmT2JqZWN0LnZhbHVlcyhTbikuaW5kZXhPZihlKTwwKXJldHVybiJzZXJ2aWNlIGVycm9yIn19fSxDbj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxnZXRQcm92aWRlcjp4bn0pLFRuPXtyb290Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24odCxlKXt2YXIgbj11Zy5zdWJQYWNrYWdlcztyZXR1cm4gQXJyYXkuaXNBcnJheShuKSYmMCE9PW4ubGVuZ3RoP24uZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5yb290PT09dH0pP3ZvaWQgMDoicm9vdCBgIit0KyJgIGlzIG5vdCBmb3VuZCI6Im5vIHN1YlBhY2thZ2VzIn19fSxPbj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxsb2FkU3ViUGFja2FnZTpUbn0pLEVuPXtVTklWRVJJRlk6InVuaXZlcmlmeSJ9LEFuPXtwcm92aWRlcjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsZGVmYXVsdDpFbi5VTklWRVJJRlksdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7aWYoT2JqZWN0LnZhbHVlcyhFbikuaW5kZXhPZihlKTwwKXJldHVybiJwcm92aWRlciBlcnJvciJ9fX0sSW49T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwscHJlTG9naW46QW59KTtmdW5jdGlvbiAkbihhKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgcj0oZT1odChlKSkuc3BsaXQoIj8iKVswXSxuPWxnLmZpbmQoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXRoLG49ZS5hbGlhcztyZXR1cm4gdD09PXJ8fG49PT1yfSk7aWYoIW4pcmV0dXJuInBhZ2UgYCIrZSsiYCBpcyBub3QgZm91bmQiO2lmKCJuYXZpZ2F0ZVRvIj09PWF8fCJyZWRpcmVjdFRvIj09PWEpe2lmKG4ubWV0YS5pc1RhYkJhcilyZXR1cm4iY2FuIG5vdCAiK2ErIiBhIHRhYmJhciBwYWdlIn1lbHNlIGlmKCJzd2l0Y2hUYWIiPT09YSYmIW4ubWV0YS5pc1RhYkJhcilyZXR1cm4iY2FuIG5vdCBzd2l0Y2ggdG8gbm8tdGFiQmFyIHBhZ2UiO2lmKCJzd2l0Y2hUYWIiIT09YSYmInByZWxvYWRQYWdlIiE9PWF8fCFuLm1ldGEuaXNUYWJCYXJ8fCJhcHBMYXVuY2giPT09dC5vcGVuVHlwZXx8KGU9ciksbi5tZXRhLmlzRW50cnkmJihlPWUucmVwbGFjZShuLmFsaWFzLCIvIikpLHQudXJsPWZ1bmN0aW9uKGUpe2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gZTt2YXIgdD1lLmluZGV4T2YoIj8iKTtpZigtMT09PXQpcmV0dXJuIGU7dmFyIG49ZS5zdWJzdHIodCsxKS50cmltKCkucmVwbGFjZSgvXihcP3wjfCYpLywiIik7aWYoIW4pcmV0dXJuIGU7ZT1lLnN1YnN0cigwLHQpO3ZhciBpPVtdO3JldHVybiBuLnNwbGl0KCImIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoL1wrL2csIiAiKS5zcGxpdCgiPSIpLG49dC5zaGlmdCgpLHI9MDx0Lmxlbmd0aD90LmpvaW4oIj0iKToiIjtpLnB1c2gobisiPSIrZW5jb2RlVVJJQ29tcG9uZW50KHIpKX0pLGkubGVuZ3RoP2UrIj8iK2kuam9pbigiJiIpOmV9KGUpLCJ1blByZWxvYWRQYWdlIiE9PWEpaWYoInByZWxvYWRQYWdlIiE9PWEpe2lmKGZuPT09ZSYmImFwcExhdW5jaCIhPT10Lm9wZW5UeXBlKXJldHVybiBmbisiIGxvY2tlZCI7dWcucmVhZHkmJiExIT09dWcuZW5hYmxlTmF2aWdhdG9yTG9jayYmKGZuPWUpfWVsc2V7aWYoIW4ubWV0YS5pc05WdWUpcmV0dXJuImNhbiBub3QgcHJlbG9hZCB2dWUgcGFnZSI7aWYobi5tZXRhLmlzVGFiQmFyKXt2YXIgaT1wZyghMCksbz0obi5hbGlhc3x8bi5wYXRoKS5zdWJzdHIoMSk7aWYoaS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnJvdXRlPT09b30pKXJldHVybiJ0YWJCYXIgcGFnZSBgIitvKyJgIGFscmVhZHkgZXhpc3RzIn19fX1mdW5jdGlvbiBQbihlLHQpe3JldHVybiB2b2lkIDA9PT10JiYodD17fSksT2JqZWN0LmFzc2lnbih7dXJsOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6JG4oZSl9LGJlZm9yZUFsbDpmdW5jdGlvbigpe2ZuPSIifX0sdCl9ZnVuY3Rpb24gTW4odCl7cmV0dXJue2FuaW1hdGlvblR5cGU6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtpZihlJiYtMT09PXQuaW5kZXhPZihlKSlyZXR1cm4iYCIrZSsiYCBpcyBub3Qgc3VwcG9ydGVkIGZvciBgYW5pbWF0aW9uVHlwZWAgKHN1cHBvcnRlZCB2YWx1ZXMgYXJlOiBgIit0LmpvaW4oImB8YCIpKyJgKSJ9fSxhbmltYXRpb25EdXJhdGlvbjp7dHlwZTpOdW1iZXJ9fX12YXIgam4sTG4sTm49UG4oInJlZGlyZWN0VG8iKSxCbj1QbigicmVMYXVuY2giKSxEbj1QbigibmF2aWdhdGVUbyIsTW4oWyJzbGlkZS1pbi1yaWdodCIsInNsaWRlLWluLWxlZnQiLCJzbGlkZS1pbi10b3AiLCJzbGlkZS1pbi1ib3R0b20iLCJmYWRlLWluIiwiem9vbS1vdXQiLCJ6b29tLWZhZGUtb3V0IiwicG9wLWluIiwibm9uZSJdKSksUm49UG4oInN3aXRjaFRhYiIpLEZuPU9iamVjdC5hc3NpZ24oe2RlbHRhOnt0eXBlOk51bWJlcix2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXtlPXBhcnNlSW50KGUpfHwxLHQuZGVsdGE9TWF0aC5taW4ocGcoKS5sZW5ndGgtMSxlKX19fSxNbihbInNsaWRlLW91dC1yaWdodCIsInNsaWRlLW91dC1sZWZ0Iiwic2xpZGUtb3V0LXRvcCIsInNsaWRlLW91dC1ib3R0b20iLCJmYWRlLW91dCIsInpvb20taW4iLCJ6b29tLWZhZGUtaW4iLCJwb3Atb3V0Iiwibm9uZSJdKSksem49e3VybDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOiRuKCJwcmVsb2FkUGFnZSIpfX0sVW49e3VybDp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOiRuKCJ1blByZWxvYWRQYWdlIil9fSxWbj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxyZWRpcmVjdFRvOk5uLHJlTGF1bmNoOkJuLG5hdmlnYXRlVG86RG4sc3dpdGNoVGFiOlJuLG5hdmlnYXRlQmFjazpGbixwcmVsb2FkUGFnZTp6bix1blByZWxvYWRQYWdlOlVufSkscW49e2tleTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9fSxXbj1be25hbWU6ImtleSIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9XSxIbj17a2V5Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMH0sZGF0YTp7cmVxdWlyZWQ6ITB9fSxHbj1be25hbWU6ImtleSIsdHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHtuYW1lOiJkYXRhIixyZXF1aXJlZDohMH1dLFhuPXFuLFluPVduLEpuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldFN0b3JhZ2U6cW4sZ2V0U3RvcmFnZVN5bmM6V24sc2V0U3RvcmFnZTpIbixzZXRTdG9yYWdlU3luYzpHbixyZW1vdmVTdG9yYWdlOlhuLHJlbW92ZVN0b3JhZ2VTeW5jOllufSksS249e2ZhbWlseTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LHNvdXJjZTp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITB9LGRlc2M6e3R5cGU6T2JqZWN0LHJlcXVpcmVkOiExfSxzdWNjZXNzOnt0eXBlOkZ1bmN0aW9uLHJlcXVpcmVkOiExfSxmYWlsOnt0eXBlOkZ1bmN0aW9uLHJlcXVpcmVkOiExfSxjb21wbGV0ZTp7dHlwZTpGdW5jdGlvbixyZXF1aXJlZDohMX19LFpuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGxvYWRGb250RmFjZTpLbn0pLFFuPVsiI2ZmZmZmZiIsIiMwMDAwMDAiXSxlcj17ZnJvbnRDb2xvcjp7dHlwZTpTdHJpbmcscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7aWYoLTE9PT1Rbi5pbmRleE9mKGUpKXJldHVybidpbnZhbGlkIGZyb250Q29sb3IgIicrZSsnIid9fSxiYWNrZ3JvdW5kQ29sb3I6e3R5cGU6U3RyaW5nLHJlcXVpcmVkOiEwfSxhbmltYXRpb246e3R5cGU6T2JqZWN0LGRlZmF1bHQ6ZnVuY3Rpb24oKXtyZXR1cm57ZHVyYXRpb246MCx0aW1pbmdGdW5jOiJsaW5lYXIifX0sdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pLHQuYW5pbWF0aW9uPXtkdXJhdGlvbjplLmR1cmF0aW9ufHwwLHRpbWluZ0Z1bmM6ZS50aW1pbmdGdW5jfHwibGluZWFyIn19fX0sdHI9e3RpdGxlOnt0eXBlOlN0cmluZyxyZXF1aXJlZDohMH19LG5yPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHNldE5hdmlnYXRpb25CYXJDb2xvcjplcixzZXROYXZpZ2F0aW9uQmFyVGl0bGU6dHJ9KSxycj17c2Nyb2xsVG9wOnt0eXBlOk51bWJlcn0sZHVyYXRpb246e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MzAwLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe3QuZHVyYXRpb249TWF0aC5tYXgoMCxlKX19fSxpcj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxwYWdlU2Nyb2xsVG86cnJ9KSxvcj17dGl0bGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGNvbnRlbnQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LHNob3dDYW5jZWw6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiEwfSxjYW5jZWxUZXh0Ont0eXBlOlN0cmluZyxkZWZhdWx0OmZ1bmN0aW9uKCl7cmV0dXJuIGF0KCJ1bmkuc2hvd01vZGFsLmNhbmNlbCIpfX0sY2FuY2VsQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiMwMDAifSxjb25maXJtVGV4dDp7dHlwZTpTdHJpbmcsZGVmYXVsdDpmdW5jdGlvbigpe3JldHVybiBhdCgidW5pLnNob3dNb2RhbC5jb25maXJtIil9fSxjb25maXJtQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiMwMDdhZmYifSx2aXNpYmxlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMH19LGFyPXt0aXRsZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0saWNvbjp7ZGVmYXVsdDoic3VjY2VzcyIsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7LTE9PT1bInN1Y2Nlc3MiLCJsb2FkaW5nIiwiZXJyb3IiLCJub25lIl0uaW5kZXhPZihlKSYmKHQuaWNvbj0ic3VjY2VzcyIpfX0saW1hZ2U6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiIsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7ZSYmKHQuaW1hZ2U9YnQoZSkpfX0sZHVyYXRpb246e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MTUwMH0sbWFzazp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LHZpc2libGU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiEwfX0sc3I9e3RpdGxlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxpY29uOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJsb2FkaW5nIn0sZHVyYXRpb246e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MWU4fSxtYXNrOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sdmlzaWJsZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITB9fSxjcj17aXRlbUxpc3Q6e3R5cGU6QXJyYXkscmVxdWlyZWQ6ITAsdmFsaWRhdG9yOmZ1bmN0aW9uKGUsdCl7aWYoIWUubGVuZ3RoKXJldHVybiJwYXJhbWV0ZXIuaXRlbUxpc3Qgc2hvdWxkIGhhdmUgYXQgbGVhc3QgMSBpdGVtIn19LGl0ZW1Db2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwMCJ9LHZpc2libGU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiEwfSxwb3BvdmVyOnt0eXBlOk9iamVjdH19LHVyPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHNob3dNb2RhbDpvcixzaG93VG9hc3Q6YXIsc2hvd0xvYWRpbmc6c3Isc2hvd0FjdGlvblNoZWV0OmNyfSksbHI9e3R5cGU6TnVtYmVyLHJlcXVpcmVkOiEwfSxkcj17aW5kZXg6bHIsdGV4dDp7dHlwZTpTdHJpbmd9LGljb25QYXRoOnt0eXBlOlN0cmluZ30sc2VsZWN0ZWRJY29uUGF0aDp7dHlwZTpTdHJpbmd9LHBhZ2VQYXRoOnt0eXBlOlN0cmluZ319LGZyPXtjb2xvcjp7dHlwZTpTdHJpbmd9LHNlbGVjdGVkQ29sb3I6e3R5cGU6U3RyaW5nfSxiYWNrZ3JvdW5kQ29sb3I6e3R5cGU6U3RyaW5nfSxiYWNrZ3JvdW5kSW1hZ2U6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2UmJiEvXihsaW5lYXJ8cmFkaWFsKS1ncmFkaWVudFwoLis/XCk7PyQvLnRlc3QoZSkmJih0LmJhY2tncm91bmRJbWFnZT1idChlKSl9fSxiYWNrZ3JvdW5kUmVwZWF0Ont0eXBlOlN0cmluZ30sYm9yZGVyU3R5bGU6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlLHQpe2UmJih0LmJvcmRlclN0eWxlPSJibGFjayI9PT1lPyJibGFjayI6IndoaXRlIil9fX0scHI9e2FuaW1hdGlvbjp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9fSxocj17YW5pbWF0aW9uOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX19LHZyPXtpbmRleDpscn0sZ3I9e2luZGV4OmxyfSxtcj17aW5kZXg6bHJ9LHlyPXtpbmRleDpscix0ZXh0Ont0eXBlOlN0cmluZyxyZXF1aXJlZDohMCx2YWxpZGF0b3I6ZnVuY3Rpb24oZSx0KXt2YXIgbjt2b2lkIDA9PT0obj1lKSYmKG49IiIpLDQ8PSgiIituKS5yZXBsYWNlKC9bXlx4MDAtXHhmZl0vZywiKioiKS5sZW5ndGgmJih0LnRleHQ9Ii4uLiIpfX19LF9yPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHNldFRhYkJhckl0ZW06ZHIsc2V0VGFiQmFyU3R5bGU6ZnIsaGlkZVRhYkJhcjpwcixzaG93VGFiQmFyOmhyLGhpZGVUYWJCYXJSZWREb3Q6dnIsc2hvd1RhYkJhclJlZERvdDpncixyZW1vdmVUYWJCYXJCYWRnZTptcixzZXRUYWJCYXJCYWRnZTp5cn0pLGJyPU9iamVjdC5jcmVhdGUobnVsbCksd3I9KGpuPXsiLi9iYXNlL2Jhc2U2NC5qcyI6dWUsIi4vYmFzZS9jYW4taS11c2UuanMiOmRlLCIuL2Jhc2UvZXZlbnQtYnVzLmpzIjpnZSwiLi9iYXNlL2ludGVyY2VwdG9yLmpzIjpfZSwiLi9iYXNlL3VweDJweC5qcyI6d2UsIi4vY29udGV4dC9jYW52YXMuanMiOkVlLCIuL2NvbnRleHQvY29udGV4dC5qcyI6amUsIi4vZGV2aWNlL2FkZC1waG9uZS1jb250YWN0LmpzIjpOZSwiLi9kZXZpY2UvbWFrZS1waG9uZS1jYWxsLmpzIjpEZSwiLi9kZXZpY2Uvc2Nhbi1jb2RlLmpzIjpGZSwiLi9kZXZpY2Uvc2V0LWNsaXBib2FyZC1kYXRhLmpzIjpwdCwiLi9maWxlL2ZpbGUuanMiOlR0LCIuL2ZpbGUvb3Blbi1kb2N1bWVudC5qcyI6RXQsIi4vbG9jYXRpb24vY2hvb3NlLWxvY2F0aW9uLmpzIjpJdCwiLi9sb2NhdGlvbi9nZXQtbG9jYXRpb24uanMiOk10LCIuL2xvY2F0aW9uL29wZW4tbG9jYXRpb24uanMiOkx0LCIuL21lZGlhL2Nob29zZS1maWxlLmpzIjpSdCwiLi9tZWRpYS9jaG9vc2UtaW1hZ2UuanMiOlZ0LCIuL21lZGlhL2Nob29zZS12aWRlby5qcyI6SHQsIi4vbWVkaWEvY29tcHJlc3MtaW1hZ2UuanMiOlh0LCIuL21lZGlhL2NvbXByZXNzLXZpZGVvLmpzIjpKdCwiLi9tZWRpYS9nZXQtaW1hZ2UtaW5mby5qcyI6WnQsIi4vbWVkaWEvZ2V0LXZpZGVvLWluZm8uanMiOmVuLCIuL21lZGlhL3ByZXZpZXctaW1hZ2UuanMiOm5uLCIuL21lZGlhL3NhdmUtaW1hZ2UtdG8tcGhvdG9zLWFsYnVtLmpzIjpvbiwiLi9uZXR3b3JrL2Rvd25sb2FkLWZpbGUuanMiOnNuLCIuL25ldHdvcmsvcmVxdWVzdC5qcyI6dm4sIi4vbmV0d29yay9zb2NrZXQuanMiOmJuLCIuL25ldHdvcmsvdXBsb2FkLWZpbGUuanMiOmtuLCIuL3BsdWdpbi9nZXQtcHJvdmlkZXIuanMiOkNuLCIuL3BsdWdpbi9sb2FkLXN1Yi1wYWNrYWdlLmpzIjpPbiwiLi9wbHVnaW4vcHJlLWxvZ2luLmpzIjpJbiwiLi9yb3V0ZS9yb3V0ZS5qcyI6Vm4sIi4vc3RvcmFnZS9zdG9yYWdlLmpzIjpKbiwiLi91aS9sb2FkLWZvbnQtZmFjZS5qcyI6Wm4sIi4vdWkvbmF2aWdhdGlvbi1iYXIuanMiOm5yLCIuL3VpL3BhZ2Utc2Nyb2xsLXRvLmpzIjppciwiLi91aS9wb3B1cC5qcyI6dXIsIi4vdWkvdGFiLWJhci5qcyI6X3J9LChMbj1mdW5jdGlvbihlKXtyZXR1cm4gam5bZV18fGZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrZSsiJy4iKX0oKX0pLmtleXM9ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmtleXMoam4pfSxMbik7ZnVuY3Rpb24ga3IoZSx0LG4pe3ZhciByPXRbZV0saT0hayhuLGUpLG89bltlXTtpZigtMTxmdW5jdGlvbihlLHQpe2lmKCFBcnJheS5pc0FycmF5KHQpKXJldHVybiBUcih0LGUpPzA6LTE7Zm9yKHZhciBuPTAscj10Lmxlbmd0aDtuPHI7bisrKWlmKFRyKHRbbl0sZSkpcmV0dXJuIG47cmV0dXJuLTF9KEJvb2xlYW4sci50eXBlKSYmaSYmIWsociwiZGVmYXVsdCIpJiYobz0hMSksdm9pZCAwPT09byYmayhyLCJkZWZhdWx0Iikpe3ZhciBhPXIuZGVmYXVsdDtvPUMoYSk/YSgpOmEsbltlXT1vfXJldHVybiBmdW5jdGlvbihlLHQsbixyLGkpe2lmKGUucmVxdWlyZWQmJnIpcmV0dXJuIk1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyIGAiK3QrImAiO2lmKG51bGw9PW4mJiFlLnJlcXVpcmVkKXt2YXIgbz1lLnZhbGlkYXRvcjtyZXR1cm4gbz9vKG4saSk6dm9pZCAwfXZhciBhPWUudHlwZSxzPSFhfHwhMD09PWEsYz1bXTtpZihhKXtBcnJheS5pc0FycmF5KGEpfHwoYT1bYV0pO2Zvcih2YXIgdT0wO3U8YS5sZW5ndGgmJiFzO3UrKyl7dmFyIGw9eHIobixhW3VdKTtjLnB1c2gobC5leHBlY3RlZFR5cGV8fCIiKSxzPWwudmFsaWR9fWlmKCFzKXJldHVybiBmdW5jdGlvbihlLHQsbil7dmFyIHI9InBhcmFtZXRlciBgIitlKyJgLiBFeHBlY3RlZCAiK24uam9pbigiLCAiKSxpPW5bMF0sbz1wKHQpLGE9T3IodCxpKSxzPU9yKHQsbyk7MT09PW4ubGVuZ3RoJiZBcihpKSYmIWZ1bmN0aW9uKCl7dmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO2Zvcig7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtyZXR1cm4gZS5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiJib29sZWFuIj09PWUudG9Mb3dlckNhc2UoKX0pfShpLG8pJiYocis9IiB3aXRoIHZhbHVlICIrYSk7cis9IiwgZ290ICIrbysiICIsQXIobykmJihyKz0id2l0aCB2YWx1ZSAiK3MrIi4iKTtyZXR1cm4gcn0odCxuLGMpO3ZhciBkPWUudmFsaWRhdG9yO2lmKGQpcmV0dXJuIGQobixpKX0ocixlLG8saSxuKX13ci5rZXlzKCkuZm9yRWFjaChmdW5jdGlvbihlKXtPYmplY3QuYXNzaWduKGJyLHdyKGUpKX0pO3ZhciBTcj0vXihTdHJpbmd8TnVtYmVyfEJvb2xlYW58RnVuY3Rpb258U3ltYm9sKSQvO2Z1bmN0aW9uIHhyKGUsdCl7dmFyIG4scj1Dcih0KTtpZihTci50ZXN0KHIpKXt2YXIgaT10eXBlb2YgZTsobj1pPT09ci50b0xvd2VyQ2FzZSgpKXx8Im9iamVjdCIhPT1pfHwobj1lIGluc3RhbmNlb2YgdCl9ZWxzZSBuPTA8PWUuYnl0ZUxlbmd0aHx8KCJPYmplY3QiPT09cj9UKGUpOiJBcnJheSI9PT1yP0FycmF5LmlzQXJyYXkoZSk6ZSBpbnN0YW5jZW9mIHR8fHAoZSk9PT1Dcih0KSk7cmV0dXJue3ZhbGlkOm4sZXhwZWN0ZWRUeXBlOnJ9fWZ1bmN0aW9uIENyKGUpe3ZhciB0PWUmJmUudG9TdHJpbmcoKS5tYXRjaCgvXlxzKmZ1bmN0aW9uIChcdyspLyk7cmV0dXJuIHQ/dFsxXToiIn1mdW5jdGlvbiBUcihlLHQpe3JldHVybiBDcihlKT09PUNyKHQpfWZ1bmN0aW9uIE9yKGUsdCl7cmV0dXJuIlN0cmluZyI9PT10PyciJytlKyciJzoiTnVtYmVyIj09PXQ/IiIrTnVtYmVyKGUpOiIiK2V9dmFyIEVyPVsic3RyaW5nIiwibnVtYmVyIiwiYm9vbGVhbiJdO2Z1bmN0aW9uIEFyKHQpe3JldHVybiBFci5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiB0LnRvTG93ZXJDYXNlKCk9PT1lfSl9ZnVuY3Rpb24gSXIoZSx0LG4pe3ZhciByPXQrIjpmYWlsICIrZTtpZigtMT09PW4pdGhyb3cgbmV3IEVycm9yKHIpO3JldHVybiJudW1iZXIiPT10eXBlb2YgbiYmQnIobix7ZXJyTXNnOnJ9KSwhMX12YXIgJHI9W3tuYW1lOiJjYWxsYmFjayIsdHlwZTpGdW5jdGlvbixyZXF1aXJlZDohMH1dLFByPVsiYmVmb3JlVmFsaWRhdGUiLCJiZWZvcmVBbGwiLCJiZWZvcmVTdWNjZXNzIl07ZnVuY3Rpb24gTXIoZSxuLHQpe3ZhciByPWJyW2VdO2lmKCFyJiZpZShlKSYmKHI9JHIpLHIpe2lmKEFycmF5LmlzQXJyYXkocikmJkFycmF5LmlzQXJyYXkobikpe3ZhciBpPU9iamVjdC5jcmVhdGUobnVsbCksbz1PYmplY3QuY3JlYXRlKG51bGwpLGE9bi5sZW5ndGg7ci5mb3JFYWNoKGZ1bmN0aW9uKGUsdCl7aVtlLm5hbWVdPWUsdDxhJiYob1tlLm5hbWVdPW5bdF0pfSkscj1pLG49b31pZihDKHIuYmVmb3JlVmFsaWRhdGUpKXt2YXIgcz1yLmJlZm9yZVZhbGlkYXRlKG4pO2lmKHMpcmV0dXJuIElyKHMsZSx0KX1mb3IodmFyIGM9T2JqZWN0LmtleXMociksdT0wO3U8Yy5sZW5ndGg7dSsrKWlmKC0xPT09UHIuaW5kZXhPZihjW3VdKSl7dmFyIGw9a3IoY1t1XSxyLG4pO2lmKGwpcmV0dXJuIElyKGwsZSx0KX19cmV0dXJuITB9dmFyIGpyPTEsTHI9e307ZnVuY3Rpb24gTnIoZSx0LG4pe3ZvaWQgMD09PXQmJih0PXt9KSx2b2lkIDA9PT1uJiYobj17fSk7dmFyIHI9ZnVuY3Rpb24oaSxvLGUpe2lmKHZvaWQgMD09PW8mJihvPXt9KSx2b2lkIDA9PT1lJiYoZT17fSksIVQobykpcmV0dXJue3BhcmFtczpvfTt2YXIgdD1hZShvPU9iamVjdC5hc3NpZ24oe30sbykpLGE9dC5zdWNjZXNzLHM9dC5mYWlsLGM9dC5jYW5jZWwsdT10LmNvbXBsZXRlLGw9QyhhKSxkPUMocyksZj1DKGMpLHA9Qyh1KTtpZighKGx8fGR8fGZ8fHApKXJldHVybntwYXJhbXM6b307dmFyIG49e307Zm9yKHZhciByIGluIGUpe3ZhciBoPWVbcl07QyhoKSYmKG5bcl09TihoKSl9dmFyIHY9bi5iZWZvcmVTdWNjZXNzLGc9bi5hZnRlclN1Y2Nlc3MsbT1uLmJlZm9yZUZhaWwseT1uLmFmdGVyRmFpbCxfPW4uYmVmb3JlQ2FuY2VsLGI9bi5hZnRlckNhbmNlbCx3PW4uYmVmb3JlQWxsLGs9bi5hZnRlckFsbCxTPWpyKysseD0iYXBpLiIraSsiLiIrUztyZXR1cm4gTHJbU109e25hbWU6eCxjYWxsYmFjazpmdW5jdGlvbihlKXtpZihlLmVyck1zZz1lLmVyck1zZ3x8aSsiOm9rIiwtMSE9PWUuZXJyTXNnLmluZGV4T2YoIjpvayIpKWUuZXJyTXNnPWkrIjpvayI7ZWxzZSBpZigtMSE9PWUuZXJyTXNnLmluZGV4T2YoIjpjYW5jZWwiKSllLmVyck1zZz1pKyI6Y2FuY2VsIjtlbHNlIGlmKC0xIT09ZS5lcnJNc2cuaW5kZXhPZigiOmZhaWwiKSl7dmFyIHQ9IiIsbj1lLmVyck1zZy5pbmRleE9mKCIgIik7LTE8biYmKHQ9ZS5lcnJNc2cuc3Vic3RyKG4pKSxlLmVyck1zZz1pKyI6ZmFpbCIrdH1DKHcpJiZ3KGUpO3ZhciByPWUuZXJyTXNnOzA9PT1yLmluZGV4T2YoaSsiOm9rIik/KEModikmJnYoZSxvKSxsJiZhKGUpLEMoZykmJmcoZSkpOjA9PT1yLmluZGV4T2YoaSsiOmNhbmNlbCIpPyhlLmVyck1zZz1lLmVyck1zZy5yZXBsYWNlKGkrIjpjYW5jZWwiLGkrIjpmYWlsIGNhbmNlbCIpLGQmJnMoZSksQyhfKSYmXyhlKSxmJiZjKGUpLEMoYikmJmIoZSkpOjA9PT1yLmluZGV4T2YoaSsiOmZhaWwiKSYmKEMobSkmJm0oZSksZCYmcyhlKSxDKHkpJiZ5KGUpKSxwJiZ1KGUpLEMoaykmJmsoZSl9fSx7cGFyYW1zOm8sY2FsbGJhY2tJZDpTfX0oZSx0LG4pLGk9ci5wYXJhbXMsbz1yLmNhbGxiYWNrSWQ7cmV0dXJuIFQoaSkmJiFNcihlLGksbyk/e3BhcmFtczppLGNhbGxiYWNrSWQ6ITF9OntwYXJhbXM6aSxjYWxsYmFja0lkOm99fWZ1bmN0aW9uIEJyKGUsdCxuKXtpZigibnVtYmVyIj09dHlwZW9mIGUpe3ZhciByPUxyW2VdO2lmKHIpcmV0dXJuIHIua2VlcEFsaXZlfHxkZWxldGUgTHJbZV0sci5jYWxsYmFjayh0LG4pfXJldHVybiB0fWZ1bmN0aW9uIERyKHQpe3JldHVybiBmdW5jdGlvbihlKXtjb25zb2xlLmVycm9yKCJBUEkgYCIrdCsiYCBpcyBub3QgeWV0IGltcGxlbWVudGVkIil9fXZhciBScj1bImdldFB1c2hDbGllbnRJZCIsIm9uUHVzaE1lc3NhZ2UiLCJvZmZQdXNoTWVzc2FnZSJdO2Z1bmN0aW9uIEZyKGMsdSxsKXtyZXR1cm4gdm9pZCAwPT09bCYmKGw9e30pLC0xPFJyLmluZGV4T2YoYyl8fCFDKHUpP3U6KGU9bCwodD1icltjXSkmJihDKHQuYmVmb3JlQWxsKSYmKGUuYmVmb3JlQWxsPXQuYmVmb3JlQWxsKSxDKHQuYmVmb3JlU3VjY2VzcykmJihlLmJlZm9yZVN1Y2Nlc3M9dC5iZWZvcmVTdWNjZXNzKSksZnVuY3Rpb24oKXtmb3IodmFyIGUsdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGg7bi0tOyl0W25dPWFyZ3VtZW50c1tuXTtpZihyZShjKSl7aWYoTXIoYyx0LC0xKSlyZXR1cm4gdS5hcHBseShudWxsLHQpfWVsc2UgaWYoaWUoYykpe2lmKE1yKGMsdCwtMSkpcmV0dXJuIHUoKGMuc3RhcnRzV2l0aCgib2ZmIik/ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4gaW4gTHIpe3ZhciByPUxyW25dO2lmKHIubmFtZS5zdGFydHNXaXRoKCJhcGkuIitlLnJlcGxhY2UoL15vZmYvLCJvbiIpKSYmci5jYWxsYmFjaz09PXQpcmV0dXJuIGRlbGV0ZSBMcltuXSxOdW1iZXIobil9cmV0dXJuImZhaWwifTpmdW5jdGlvbihlLHQpe3ZhciBuPWpyKysscj0iYXBpLiIrZSsiLiIrbjtyZXR1cm4gTHJbbl09e25hbWU6cixrZWVwQWxpdmU6ITAsY2FsbGJhY2s6dH0sbn0pKGMsdFswXSkpfWVsc2V7dmFyIHI9e307dC5sZW5ndGgmJihyPXRbMF0pO3ZhciBpLG89TnIoYyxyLGwpLGE9by5wYXJhbXMscz1vLmNhbGxiYWNrSWQ7aWYoITEhPT1zKXJldHVybihpPUMoYSk/dShzKTp1KGEscykpJiYoZT1jLC0xPT09ZWUuaW5kZXhPZihlKSkmJlQoaT1CcihzLGkpKSYmKGkuZXJyTXNnPWkuZXJyTXNnfHxjKyI6b2siKSxpfX0pO3ZhciBlLHR9ZnVuY3Rpb24genIoZSx0KXtyZXR1cm4gZSh0PXtleHBvcnRzOnt9fSx0LmV4cG9ydHMpLHQuZXhwb3J0c312YXIgVXI9enIoZnVuY3Rpb24oZSx0KXshZnVuY3Rpb24oKXtmb3IodmFyIG89IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGQ9bmV3IFVpbnQ4QXJyYXkoMjU2KSxlPTA7ZTxvLmxlbmd0aDtlKyspZFtvLmNoYXJDb2RlQXQoZSldPWU7dC5lbmNvZGU9ZnVuY3Rpb24oZSl7dmFyIHQsbj1uZXcgVWludDhBcnJheShlKSxyPW4ubGVuZ3RoLGk9IiI7Zm9yKHQ9MDt0PHI7dCs9MylpKz1vW25bdF0+PjJdLGkrPW9bKDMmblt0XSk8PDR8blt0KzFdPj40XSxpKz1vWygxNSZuW3QrMV0pPDwyfG5bdCsyXT4+Nl0saSs9b1s2MyZuW3QrMl1dO3JldHVybiByJTM9PTI/aT1pLnN1YnN0cmluZygwLGkubGVuZ3RoLTEpKyI9IjpyJTM9PTEmJihpPWkuc3Vic3RyaW5nKDAsaS5sZW5ndGgtMikrIj09IiksaX0sdC5kZWNvZGU9ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhPS43NSplLmxlbmd0aCxzPWUubGVuZ3RoLGM9MDsiPSI9PT1lW2UubGVuZ3RoLTFdJiYoYS0tLCI9Ij09PWVbZS5sZW5ndGgtMl0mJmEtLSk7dmFyIHU9bmV3IEFycmF5QnVmZmVyKGEpLGw9bmV3IFVpbnQ4QXJyYXkodSk7Zm9yKHQ9MDt0PHM7dCs9NCluPWRbZS5jaGFyQ29kZUF0KHQpXSxyPWRbZS5jaGFyQ29kZUF0KHQrMSldLGk9ZFtlLmNoYXJDb2RlQXQodCsyKV0sbz1kW2UuY2hhckNvZGVBdCh0KzMpXSxsW2MrK109bjw8MnxyPj40LGxbYysrXT0oMTUmcik8PDR8aT4+MixsW2MrK109KDMmaSk8PDZ8NjMmbztyZXR1cm4gdX19KCl9KSxWcj1Vci5lbmNvZGUscXI9VXIuZGVjb2RlO3ZhciBXcj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxiYXNlNjRUb0FycmF5QnVmZmVyOmZ1bmN0aW9uKGUpe3JldHVybiBxcihlKX0sYXJyYXlCdWZmZXJUb0Jhc2U2NDpmdW5jdGlvbihlKXtyZXR1cm4gVnIoZSl9fSksSHI9e307dmFyIEdyPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNhbklVc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGsoSHIsZSk/SHJbZV06ISFrKGF2LGUpfX0pLFhyPXtwcm9taXNlSW50ZXJjZXB0b3I6Sn0sWXI9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsaW50ZXJjZXB0b3JzOlhyLGFkZEludGVyY2VwdG9yOmZ1bmN0aW9uKGUsdCl7InN0cmluZyI9PXR5cGVvZiBlJiZUKHQpP3ooRltlXXx8KEZbZV09e30pLHQpOlQoZSkmJnooUixlKX0scmVtb3ZlSW50ZXJjZXB0b3I6ZnVuY3Rpb24oZSx0KXsic3RyaW5nIj09dHlwZW9mIGU/VCh0KT9VKEZbZV0sdCk6ZGVsZXRlIEZbZV06VChlKSYmVShSLGUpfX0pLEpyPSExLEtyPTAsWnI9MDtmdW5jdGlvbiBRcihlLHQpe3JldHVybiBlPU51bWJlcihlKSxpc05hTihlKT90OmV9dmFyIGVpPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHVweDJweDpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvO2lmKDA9PT1LciYmKG49ZGcuZ2V0U3lzdGVtSW5mb1N5bmMoKSxyPW4ucGxhdGZvcm0saT1uLnBpeGVsUmF0aW8sbz1uLndpbmRvd1dpZHRoLEtyPW8sWnI9aSxKcj0iaW9zIj09PXIpLDA9PT0oZT1OdW1iZXIoZSkpKXJldHVybiAwO3ZhciBhPXVnLmdsb2JhbFN0eWxlfHx1Zy53aW5kb3d8fHt9LHM9UXIoYS5ycHhDYWxjTWF4RGV2aWNlV2lkdGgsOTYwKSxjPVFyKGEucnB4Q2FsY0Jhc2VEZXZpY2VXaWR0aCwzNzUpLHU9UXIoYS5ycHhDYWxjSW5jbHVkZVdpZHRoLDc1MCksbD10fHxLcixkPWUvNzUwKihsPWU9PT11fHxsPD1zP2w6Yyk7cmV0dXJuIGQ8MCYmKGQ9LWQpLDA9PT0oZD1NYXRoLmZsb29yKGQrMWUtNCkpJiYoZD0xIT09WnImJkpyPy41OjEpLGU8MD8tZDpkfX0pO2Z1bmN0aW9uIHRpKGUsdCxuLHIpe2lnLnB1Ymxpc2hIYW5kbGVyKHQrIi1hdWRpby0iK2Use2F1ZGlvSWQ6ZSx0eXBlOm4sZGF0YTpyfSx0KX12YXIgbmk9ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWUsdGhpcy5wYWdlSWQ9dH07bmkucHJvdG90eXBlLnNldFNyYz1mdW5jdGlvbihlKXt0aSh0aGlzLmlkLHRoaXMucGFnZUlkLCJzZXRTcmMiLHtzcmM6ZX0pfSxuaS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RpKHRoaXMuaWQsdGhpcy5wYWdlSWQsInBsYXkiKX0sbmkucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGkodGhpcy5pZCx0aGlzLnBhZ2VJZCwicGF1c2UiKX0sbmkucHJvdG90eXBlLnNlZWs9ZnVuY3Rpb24oZSl7dGkodGhpcy5pZCx0aGlzLnBhZ2VJZCwic2VlayIse3Bvc2l0aW9uOmV9KX07dmFyIHJpPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNyZWF0ZUF1ZGlvQ29udGV4dDpmdW5jdGlvbihlLHQpe2lmKHQpcmV0dXJuIG5ldyBuaShlLHQuJHBhZ2UuaWQpO3ZhciBuPWZnKCk7aWYobi4kcm91dGUmJm4uJHJvdXRlLnBhcmFtcy5fX2lkX18pcmV0dXJuIG5ldyBuaShlLG4uJHJvdXRlLnBhcmFtcy5fX2lkX18pO2lnLmVtaXQoIm9uRXJyb3IiLCJjcmVhdGVBdWRpb0NvbnRleHQ6ZmFpbCIpfX0pLGlpPW5ldyB0ZztmdW5jdGlvbiBvaShlLHQsbil7cmV0dXJuIGVbdF0uYXBwbHkoZSxuKX1mdW5jdGlvbiBhaSgpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9QXJyYXkoZSk7ZS0tOyl0W2VdPWFyZ3VtZW50c1tlXTtyZXR1cm4gb2koaWksIiRvbiIsW10uY29uY2F0KHQpKX1mdW5jdGlvbiBzaSgpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9QXJyYXkoZSk7ZS0tOyl0W2VdPWFyZ3VtZW50c1tlXTtyZXR1cm4gb2koaWksIiRvZmYiLFtdLmNvbmNhdCh0KSl9ZnVuY3Rpb24gY2koKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PUFycmF5KGUpO2UtLTspdFtlXT1hcmd1bWVudHNbZV07cmV0dXJuIG9pKGlpLCIkb25jZSIsW10uY29uY2F0KHQpKX1mdW5jdGlvbiB1aSgpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9QXJyYXkoZSk7ZS0tOyl0W2VdPWFyZ3VtZW50c1tlXTtyZXR1cm4gb2koaWksIiRlbWl0IixbXS5jb25jYXQodCkpfXZhciBsaSxkaT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCwkb246YWksJG9mZjpzaSwkb25jZTpjaSwkZW1pdDp1aX0pO2Z1bmN0aW9uIGZpKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3JldHVybiBpZy5pbnZva2VDYWxsYmFja0hhbmRsZXIuYXBwbHkoaWcsZSl9ZnVuY3Rpb24gcGkoZSl7cmV0dXJuIGRnLnJlcXVpcmVOYXRpdmVQbHVnaW4oZSl9ZnVuY3Rpb24gaGkoZSl7Zm9yKHZhciB0PVtdLG49YXJndW1lbnRzLmxlbmd0aC0xOzA8bi0tOyl0W25dPWFyZ3VtZW50c1tuKzFdO3JldHVybiBpZy5lbWl0LmFwcGx5KGlnLFsiYXBpLiIrZV0uY29uY2F0KHQpKX12YXIgdmk9cmcubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlO2Z1bmN0aW9uIGdpKGUpe3ZpKGxpPWUpfWZ1bmN0aW9uIG1pKGUpe2lmKCFlKXt2YXIgdD1wZygpO2lmKCF0Lmxlbmd0aClyZXR1cm47aWYoIShlPXRbdC5sZW5ndGgtMV0uJHBhZ2UubWV0YS5zdGF0dXNCYXJTdHlsZSl8fGU9PT1saSlyZXR1cm59ZSE9PWxpJiYobGk9ZSxyZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoZSkpfWZ1bmN0aW9uIHlpKHQpe2lmKHZvaWQgMD09PXQmJih0PSIiKSwhdWcudGFiQmFyfHwhQXJyYXkuaXNBcnJheSh1Zy50YWJCYXIubGlzdCkpcmV0dXJuITE7dHJ5e2lmKCF0KXt2YXIgZT1wZygpO2lmKCFlLmxlbmd0aClyZXR1cm4hMTt2YXIgbj1lW2UubGVuZ3RoLTFdO3JldHVybiEhbiYmbi4kcGFnZS5tZXRhLmlzVGFiQmFyfS9eXC8vLnRlc3QodCl8fCh0PSIvIit0KTt2YXIgcj1sZy5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT10fSk7cmV0dXJuIHImJnIubWV0YS5pc1RhYkJhcn1jYXRjaChlKXt9cmV0dXJuITF9ZnVuY3Rpb24gX2koZSl7cmV0dXJuIHFyKGUpfWZ1bmN0aW9uIGJpKGUpe3JldHVybiBWcihlKX1mdW5jdGlvbiB3aShlLHQsbixyKXt2YXIgaT1lKHQpO3JldHVybiBpJiZpLmVyck1zZyYmKGkuZXJyTXNnPWkuZXJyTXNnLnJlcGxhY2UobixyKSksaX1mdW5jdGlvbiBraShlKXtyZXR1cm4gZT9lLiRnZXRBcHBXZWJ2aWV3KCk6U2koKX1mdW5jdGlvbiBTaSgpe3RyeXt2YXIgZT1wZygpO2lmKGUubGVuZ3RoKXJldHVybiBlW2UubGVuZ3RoLTFdLiRnZXRBcHBXZWJ2aWV3KCl9Y2F0Y2goZSl7fX1yZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGU9Z2k7dmFyIHhpPWZ1bmN0aW9uKGUsdCl7aWYoMD09PXQuaW5kZXhPZigiLi8iKSlyZXR1cm4geGkoZSx0LnN1YnN0cigyKSk7dmFyIG4scixpPXQuc3BsaXQoIi8iKTtmb3Iobj0wLHI9aS5sZW5ndGg7bjxyJiYiLi4iPT09aVtuXTtuKyspO2kuc3BsaWNlKDAsbiksdD1pLmpvaW4oIi8iKTt2YXIgbz0wPGUubGVuZ3RoP2Uuc3BsaXQoIi8iKTpbXTtyZXR1cm4gby5zcGxpY2Uoby5sZW5ndGgtbi0xLG4rMSksby5jb25jYXQoaSkuam9pbigiLyIpfSxDaT1mdW5jdGlvbihlKXtyZXR1cm4gcmcuaW8uY29udmVydExvY2FsRmlsZVN5c3RlbVVSTChlKS5yZXBsYWNlKC9eXC8/YXBwc1wvLywiL2FuZHJvaWRfYXNzZXQvYXBwcy8iKS5yZXBsYWNlKC9cLyQvLCIiKX07ZnVuY3Rpb24gVGkoZSl7aWYoMD09PWUuaW5kZXhPZigiLy8iKSlyZXR1cm4iaHR0cHM6IitlO2lmKC9eKFthLXotXSs6KT9cL1wvL2kudGVzdChlKXx8L15kYXRhOi4qLC4qLy50ZXN0KGUpKXJldHVybiBlO2lmKDA9PT1lLmluZGV4T2YoIl93d3ciKXx8MD09PWUuaW5kZXhPZigiX2RvYyIpfHwwPT09ZS5pbmRleE9mKCJfZG9jdW1lbnRzIil8fDA9PT1lLmluZGV4T2YoIl9kb3dubG9hZHMiKSlyZXR1cm4iZmlsZTovLyIrQ2koZSk7dmFyIHQ9ImZpbGU6Ly8iK0NpKCJfd3d3Iik7aWYoMD09PWUuaW5kZXhPZigiLyIpKXJldHVybiBlLnN0YXJ0c1dpdGgoIi9zdG9yYWdlLyIpfHxlLnN0YXJ0c1dpdGgoIi9zZGNhcmQvIil8fGUuaW5jbHVkZXMoIi9Db250YWluZXJzL0RhdGEvQXBwbGljYXRpb24vIik/ImZpbGU6Ly8iK2U6dCtlO2lmKDA9PT1lLmluZGV4T2YoIi4uLyIpfHwwPT09ZS5pbmRleE9mKCIuLyIpKXtpZigic3RyaW5nIj09dHlwZW9mIF9faWRfXylyZXR1cm4gdCt4aSgiLyIrX19pZF9fLGUpO3ZhciBuPXBnKCk7aWYobi5sZW5ndGgpcmV0dXJuIHQreGkoIi8iK25bbi5sZW5ndGgtMV0ucm91dGUsZSl9cmV0dXJuIGV9dmFyIE9pPTMuMTQxNTkyNjUzNTg5NzkzLEVpPTYzNzgyNDUsQWk9LjAwNjY5MzQyMTYyMjk2NTk0Mzt2YXIgSWk9ZnVuY3Rpb24oZSx0KXt2YXIgbj0yKmUtMTAwKzMqdCsuMip0KnQrLjEqZSp0Ky4yKk1hdGguc3FydChNYXRoLmFicyhlKSk7cmV0dXJuIG4rPTIqKDIwKk1hdGguc2luKDYqZSpPaSkrMjAqTWF0aC5zaW4oMiplKk9pKSkvMyxuKz0yKigyMCpNYXRoLnNpbih0Kk9pKSs0MCpNYXRoLnNpbih0LzMqT2kpKS8zLG4rPTIqKDE2MCpNYXRoLnNpbih0LzEyKk9pKSszMjAqTWF0aC5zaW4odCpPaS8zMCkpLzN9LCRpPWZ1bmN0aW9uKGUsdCl7dmFyIG49MzAwK2UrMip0Ky4xKmUqZSsuMSplKnQrLjEqTWF0aC5zcXJ0KE1hdGguYWJzKGUpKTtyZXR1cm4gbis9MiooMjAqTWF0aC5zaW4oNiplKk9pKSsyMCpNYXRoLnNpbigyKmUqT2kpKS8zLG4rPTIqKDIwKk1hdGguc2luKGUqT2kpKzQwKk1hdGguc2luKGUvMypPaSkpLzMsbis9MiooMTUwKk1hdGguc2luKGUvMTIqT2kpKzMwMCpNYXRoLnNpbihlLzMwKk9pKSkvM30sUGk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZTw3Mi4wMDR8fDEzNy44MzQ3PGV8fHQ8LjgyOTN8fDU1LjgyNzE8dHx8ITF9O2Z1bmN0aW9uIE1pKGUsbil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JnW2VdW25dKGZ1bmN0aW9uKGUpe2UmJihkZWxldGUgZS5jb2RlLGRlbGV0ZSBlLm1lc3NhZ2UpLGZpKHQsZSl9KX19ZnVuY3Rpb24gamkodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7ZT1lfHx7fSxmaSh0LE9iamVjdC5hc3NpZ24oe30sZSx7ZXJyTXNnOm4rIjpvayJ9KSl9fWZ1bmN0aW9uIExpKGEscyxjKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9KGU9ZXx8e30pLmNvZGU7dm9pZCAwPT09dCYmKHQ9MCk7dmFyIG49ZS5tZXNzYWdlLHI9e307Zm9yKHZhciBpIGluIGUpLTE9PT1bImNvZGUiLCJtZXNzYWdlIl0uaW5kZXhPZihpKSYmKHJbaV09ZVtpXSk7dmFyIG89cjtmaShhLE9iamVjdC5hc3NpZ24oe30se2Vyck1zZzpzKyI6ZmFpbCAiKyhufHxjfHwiIiksZXJyQ29kZTp0LGNvZGU6dH0sbykpfX1mdW5jdGlvbiBOaShuLHIsaSxvKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXsiZnVuY3Rpb24iPT10eXBlb2YgaSYmKGU9aShlKSkscmdbbl1bcl0oT2JqZWN0LmFzc2lnbihlLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KSxkZWxldGUgZS5jb2RlLGRlbGV0ZSBlLm1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIG8mJihlPW8oZSkpLGZpKHQsT2JqZWN0LmFzc2lnbih7fSxlLHtlcnJNc2c6cisiOm9rIn0pKX0sZmFpbDpMaSh0LHIpfSkpfX1mdW5jdGlvbiBCaShlKXt2YXIgdD1lLnNwbGl0KCIvIik7cmV0dXJuIHRbdC5sZW5ndGgtMV19dmFyIERpLFJpPSJwbGF5YmFjayIsRmk9e30semk9WyJwbGF5IiwiY2FucGxheSIsImVuZGVkIiwic3RvcCIsIndhaXRpbmciLCJzZWVraW5nIiwic2Vla2VkIiwicGF1c2UiXSxVaT1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT10JiYodD17fSksaGkoIm9uQXVkaW9TdGF0ZUNoYW5nZSIsT2JqZWN0LmFzc2lnbih7c3RhdGU6ZX0sdCkpfTt2YXIgVmk9bnVsbCxxaT0yNTAsV2k9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9e30pLGhpKCJvbkJhY2tncm91bmRBdWRpb1N0YXRlQ2hhbmdlIixPYmplY3QuYXNzaWduKHtzdGF0ZTplfSx0KSl9LEhpPVsicGxheSIsInBhdXNlIiwiZW5kZWQiLCJzdG9wIiwiY2FucGxheSJdO2Z1bmN0aW9uIEdpKCl7RGl8fCgoRGk9cmcuYXVkaW8uY3JlYXRlUGxheWVyKHthdXRvcGxheTohMCxiYWNrZ3JvdW5kQ29udHJvbDohMH0pKS5zcmM9RGkudGl0bGU9RGkuZXBuYW1lPURpLnNpbmdlcj1EaS5jb3ZlckltZ1VybD1EaS53ZWJVcmw9IiIsRGkuc3RhcnRUaW1lPTAsSGkuZm9yRWFjaChmdW5jdGlvbih0KXtEaS5hZGRFdmVudExpc3RlbmVyKHQsZnVuY3Rpb24oKXsicGxheSI9PT10PyhEaS5pc1N0b3BwZWQ9ITEsWGkoKSxXaSgidGltZVVwZGF0ZSIse30pLFZpPXNnKGZ1bmN0aW9uKCl7V2koInRpbWVVcGRhdGUiLHt9KX0scWkpKToic3RvcCI9PT10JiYoRGkuaXNTdG9wcGVkPSEwKSwicGF1c2UiIT09dCYmImVuZGVkIiE9PXQmJiJzdG9wIiE9PXR8fFhpKCk7dmFyIGU9Im9uTXVzaWMiKyh0WzBdLnRvVXBwZXJDYXNlKCkrdC5zdWJzdHIoMSkpO2hpKGUse2RhdGFVcmw6RGkuc3JjLGVyck1zZzplKyI6b2sifSksV2kodCx7ZGF0YVVybDpEaS5zcmN9KX0pfSksRGkuYWRkRXZlbnRMaXN0ZW5lcigid2FpdGluZyIsZnVuY3Rpb24oKXtYaSgpLFdpKCJ3YWl0aW5nIix7ZGF0YVVybDpEaS5zcmN9KX0pLERpLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihlKXtYaSgpLGhpKCJvbk11c2ljRXJyb3IiLHtkYXRhVXJsOkRpLnNyYyxlcnJNc2c6IkVycm9yOiIrZS5tZXNzYWdlfSksV2koImVycm9yIix7ZGF0YVVybDpEaS5zcmMsZXJyTXNnOmUubWVzc2FnZSxlcnJDb2RlOmUuY29kZX0pfSksRGkuYWRkRXZlbnRMaXN0ZW5lcigicHJldiIsZnVuY3Rpb24oKXtyZXR1cm4gaGkoIm9uQmFja2dyb3VuZEF1ZGlvUHJldiIpfSksRGkuYWRkRXZlbnRMaXN0ZW5lcigibmV4dCIsZnVuY3Rpb24oKXtyZXR1cm4gaGkoIm9uQmFja2dyb3VuZEF1ZGlvTmV4dCIpfSkpfWZ1bmN0aW9uIFhpKCl7bnVsbCE9PVZpJiZjZyhWaSl9ZnVuY3Rpb24gWWkobixlKXtHaSgpO3ZhciByPVsic3JjIiwic3RhcnRUaW1lIiwiY292ZXJJbWdVcmwiLCJ3ZWJVcmwiLCJzaW5nZXIiLCJlcG5hbWUiLCJ0aXRsZSJdO2lmKGUmJiJwbGF5YmFja1JhdGUiPT09ZSl7dmFyIHQ9bltlXTtEaS5wbGF5YmFja1JhdGUmJkRpLnBsYXliYWNrUmF0ZShwYXJzZUZsb2F0KHQpKX1lbHNle3ZhciBpPXt9O09iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoMDw9ci5pbmRleE9mKGUpKXt2YXIgdD1uW2VdO2U9PT1yWzBdJiZ0JiYodD1UaSh0KSksRGlbZV09aVtlXT10fX0pLERpLnNldFN0eWxlcyhpKX19ZnVuY3Rpb24gSmkoKXtyZXR1cm4gRGl9ZnVuY3Rpb24gS2koZSl7dmFyIHQ9ZS5vcGVyYXRpb25UeXBlLG49ZS5kYXRhVXJsLHI9ZS5wb3NpdGlvbixpPWUuYXBpO3ZvaWQgMD09PWkmJihpPSJvcGVyYXRlTXVzaWNQbGF5ZXIiKTt2YXIgbz1lLnRpdGxlLGE9ZS5jb3ZlckltZ1VybCxzPUppKCk7cmV0dXJuIDA8WyJyZXN1bWUiLCJwYXVzZSIsInN0b3AiXS5pbmRleE9mKHQpP3MmJnNbdF0oKToicGxheSI9PT10PyhZaSh7c3JjOm4sc3RhcnRUaW1lOnIsdGl0bGU6byxjb3ZlckltZ1VybDphfSkscy5wbGF5KCkpOiJzZWVrIj09PXQmJnMmJnMuc2Vla1RvKHIpLHtlcnJNc2c6aSsiOm9rIn19dmFyIFppPSJzdWNjZXNzIixRaT0iZmFpbCIsZW89W1ppLFFpLCJjb21wbGV0ZSJdO2Z1bmN0aW9uIHRvKGUsdCxuLHIpe2lmKGUpe2lmKHZvaWQgMD09PW4pcmV0dXJuIGVbdF0oKTt2YXIgaT1pbyhuLHIpWzFdO3JldHVybiBPYmplY3Qua2V5cyhpKS5sZW5ndGg/ZVt0XShvbyh0LGkpKTplW3RdKCl9fWZ1bmN0aW9uIG5vKGUsdCxuLHIpe2lmKGUpe3ZhciBpPWlvKG4sciksbz1pWzBdLGE9aVsxXTtyZXR1cm4gT2JqZWN0LmtleXMoYSkubGVuZ3RoP2VbdF0obyxvbyh0LGEpKTplW3RdKG8pfX1mdW5jdGlvbiBybyhlLHQpe3ZhciBuPWZ1bmN0aW9uIGUodCxuKXtpZighdHx8IW4pcmV0dXJuO2lmKG4uYXR0ciYmbi5hdHRyLmlkPT09dClyZXR1cm4gbjt2YXIgcj1uLmNoaWxkcmVuO2lmKCFyKXJldHVybjtmb3IodmFyIGk9MCxvPXIubGVuZ3RoO2k8bztpKyspe3ZhciBhPWUodCxyW2ldKTtpZihhKXJldHVybiBhfX0oZSx0LiRlbCk7cmV0dXJuIG58fGNvbnNvbGUuZXJyb3IoIkNhbiBub3QgZmluZCBgIitlKyJgIil9ZnVuY3Rpb24gaW8obixlKXt2b2lkIDA9PT1uJiYobj17fSk7dmFyIHI9T2JqZWN0LmNyZWF0ZShudWxsKSx0PWZ1bmN0aW9uKGUpe3ZhciB0PW5bZV07Qyh0KSYmKHJbZV09dCxkZWxldGUgbltlXSl9O3JldHVybiBlby5mb3JFYWNoKHQpLGUmJmUuZm9yRWFjaCh0KSxbbixyXX1mdW5jdGlvbiBvbyhpLG8pe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD1lLnR5cGU7ZGVsZXRlIGUudHlwZTt2YXIgbj1vW3RdO2lmKHQ9PT1aaT9lLmVyck1zZz1pKyI6b2siOnQ9PT1RaSYmKGUuZXJyTXNnPWkrIjpmYWlsIisoZS5tc2c/IiAiK2UubXNnOiIiKSksZGVsZXRlIGUuY29kZSxkZWxldGUgZS5tc2csQyhuKSYmbihlKSx0PT09Wml8fHQ9PT1RaSl7dmFyIHI9by5jb21wbGV0ZTtDKHIpJiZyKGUpfX19dmFyIGFvPXtnZXRDZW50ZXJMb2NhdGlvbjpmdW5jdGlvbihlLHQpe3JldHVybiB0byhlLCJnZXRDZW50ZXJMb2NhdGlvbiIsdCl9LG1vdmVUb0xvY2F0aW9uOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5vKGUsIm1vdmVUb0xvY2F0aW9uIix0KX0sdHJhbnNsYXRlTWFya2VyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5vKGUsInRyYW5zbGF0ZU1hcmtlciIsdCxbImFuaW1hdGlvbkVuZCJdKX0saW5jbHVkZVBvaW50czpmdW5jdGlvbihlLHQpe3JldHVybiBubyhlLCJpbmNsdWRlUG9pbnRzIix0KX0sZ2V0UmVnaW9uOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRvKGUsImdldFJlZ2lvbiIsdCl9LGdldFNjYWxlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRvKGUsImdldFNjYWxlIix0KX0sYWRkQ3VzdG9tTGF5ZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbm8oZSwiYWRkQ3VzdG9tTGF5ZXIiLHQpfSxyZW1vdmVDdXN0b21MYXllcjpmdW5jdGlvbihlLHQpe3JldHVybiBubyhlLCJyZW1vdmVDdXN0b21MYXllciIsdCl9LGFkZEdyb3VuZE92ZXJsYXk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbm8oZSwiYWRkR3JvdW5kT3ZlcmxheSIsdCl9LHJlbW92ZUdyb3VuZE92ZXJsYXk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbm8oZSwicmVtb3ZlR3JvdW5kT3ZlcmxheSIsdCl9LHVwZGF0ZUdyb3VuZE92ZXJsYXk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbm8oZSwidXBkYXRlR3JvdW5kT3ZlcmxheSIsdCl9LGluaXRNYXJrZXJDbHVzdGVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5vKGUsImluaXRNYXJrZXJDbHVzdGVyIix0KX0sYWRkTWFya2VyczpmdW5jdGlvbihlLHQpe3JldHVybiBubyhlLCJhZGRNYXJrZXJzIix0KX0scmVtb3ZlTWFya2VyczpmdW5jdGlvbihlLHQpe3JldHVybiBubyhlLCJyZW1vdmVNYXJrZXJzIix0KX0sbW92ZUFsb25nOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5vKGUsIm1vdmVBbG9uZyIsdCl9LHNldExvY01hcmtlckljb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbm8oZSwic2V0TG9jTWFya2VySWNvbiIsdCl9LG9wZW5NYXBBcHA6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbm8oZSwib3Blbk1hcEFwcCIsdCl9LG9uOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUub24odC5uYW1lLHQuY2FsbGJhY2spfX07dmFyIHNvPXtwbGF5OmZ1bmN0aW9uKGUpe3JldHVybiB0byhlLCJwbGF5Iil9LHBhdXNlOmZ1bmN0aW9uKGUpe3JldHVybiB0byhlLCJwYXVzZSIpfSxzZWVrOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5vKGUsInNlZWsiLHQucG9zaXRpb24pfSxzdG9wOmZ1bmN0aW9uKGUpe3JldHVybiB0byhlLCJzdG9wIil9LHNlbmREYW5tdTpmdW5jdGlvbihlLHQpe3JldHVybiBubyhlLCJzZW5kRGFubXUiLHQpfSxwbGF5YmFja1JhdGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbm8oZSwicGxheWJhY2tSYXRlIix0LnJhdGUpfSxyZXF1ZXN0RnVsbFNjcmVlbjpmdW5jdGlvbihlLHQpe3JldHVybiBubyhlLCJyZXF1ZXN0RnVsbFNjcmVlbiIsdCl9LGV4aXRGdWxsU2NyZWVuOmZ1bmN0aW9uKGUpe3JldHVybiB0byhlLCJleGl0RnVsbFNjcmVlbiIpfSxzaG93U3RhdHVzQmFyOmZ1bmN0aW9uKGUpe3JldHVybiB0byhlLCJzaG93U3RhdHVzQmFyIil9LGhpZGVTdGF0dXNCYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKGUsImhpZGVTdGF0dXNCYXIiKX19O3ZhciBjbz1mdW5jdGlvbihlLHQpe3RoaXMuaWQ9ZSx0aGlzLmN0eD10fTtmdW5jdGlvbiB1byhlLHQsbixyKXt2YXIgaT10LiRwYWdlLmlkO2lnLnB1Ymxpc2hIYW5kbGVyKGkrIi1saXZlcHVzaGVyLSIrZSx7bGl2ZVB1c2hlcklkOmUsdHlwZTpuLGRhdGE6cn0saSl9Y28ucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKGUpe3JldHVybiB0byh0aGlzLmN0eCwic3RhcnQiLGUpfSxjby5wcm90b3R5cGUuc3RvcD1mdW5jdGlvbihlKXtyZXR1cm4gdG8odGhpcy5jdHgsInN0b3AiLGUpfSxjby5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKHRoaXMuY3R4LCJwYXVzZSIsZSl9LGNvLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKHRoaXMuY3R4LCJyZXN1bWUiLGUpfSxjby5wcm90b3R5cGUuc3dpdGNoQ2FtZXJhPWZ1bmN0aW9uKGUpe3JldHVybiB0byh0aGlzLmN0eCwic3dpdGNoQ2FtZXJhIixlKX0sY28ucHJvdG90eXBlLnNuYXBzaG90PWZ1bmN0aW9uKGUpe3JldHVybiB0byh0aGlzLmN0eCwic25hcHNob3QiLGUpfSxjby5wcm90b3R5cGUudG9nZ2xlVG9yY2g9ZnVuY3Rpb24oZSl7cmV0dXJuIHRvKHRoaXMuY3R4LCJ0b2dnbGVUb3JjaCIsZSl9LGNvLnByb3RvdHlwZS5wbGF5QkdNPWZ1bmN0aW9uKGUpe3JldHVybiBubyh0aGlzLmN0eCwicGxheUJHTSIsZSl9LGNvLnByb3RvdHlwZS5zdG9wQkdNPWZ1bmN0aW9uKGUpe3JldHVybiB0byh0aGlzLmN0eCwic3RvcEJHTSIsZSl9LGNvLnByb3RvdHlwZS5wYXVzZUJHTT1mdW5jdGlvbihlKXtyZXR1cm4gdG8odGhpcy5jdHgsInBhdXNlQkdNIixlKX0sY28ucHJvdG90eXBlLnJlc3VtZUJHTT1mdW5jdGlvbihlKXtyZXR1cm4gdG8odGhpcy5jdHgsInJlc3VtZUJHTSIsZSl9LGNvLnByb3RvdHlwZS5zZXRCR01Wb2x1bWU9ZnVuY3Rpb24oZSl7cmV0dXJuIG5vKHRoaXMuY3R4LCJzZXRCR01Wb2x1bWUiLGUpfSxjby5wcm90b3R5cGUuc3RhcnRQcmV2aWV3PWZ1bmN0aW9uKGUpe3JldHVybiB0byh0aGlzLmN0eCwic3RhcnRQcmV2aWV3IixlKX0sY28ucHJvdG90eXBlLnN0b3BQcmV2aWV3PWZ1bmN0aW9uKGUpe3JldHVybiB0byh0aGlzLmN0eCwic3RvcFByZXZpZXciLGUpfSxpZy5zdWJzY3JpYmUoIm9uTGl2ZVB1c2hlck1ldGhvZENhbGxiYWNrIixmdW5jdGlvbihlKXt2YXIgdD1lLmNhbGxiYWNrSWQsbj1lLmRhdGE7TS5pbnZva2UodCxuKX0pO3ZhciBsbz17c3RhcnRQcmV2aWV3OiJwcmV2aWV3IixzdG9wUHJldmlldzoic3RvcCJ9LGZvPWZ1bmN0aW9uKGUsdCl7dGhpcy5pZD1lLHRoaXMucGFnZVZtPXR9O2ZvLnByb3RvdHlwZS5vbj1mdW5jdGlvbihlLHQpe3VvKHRoaXMuaWQsdGhpcy5wYWdlVm0sIm9uIix7bmFtZTplLGNhbGxiYWNrOnR9KX0sWyJzdGFydCIsInN0b3AiLCJwYXVzZSIsInJlc3VtZSIsInN3aXRjaENhbWVyYSIsInN0YXJ0UHJldmlldyIsInN0b3BQcmV2aWV3Iiwic25hcHNob3QiXS5mb3JFYWNoKGZ1bmN0aW9uKHIpe2ZvLnByb3RvdHlwZVtyXT1NLndhcnAoZnVuY3Rpb24oZSx0KXtlLmNhbGxiYWNrSWQ9dDt2YXIgbj1sb1tyXT9sb1tyXTpyO3VvKHRoaXMuaWQsdGhpcy5wYWdlVm0sbixlKX0pfSk7dmFyIHBvLGhvPTIwMCx2bz1bInVua25vd24iLCJub25lIiwiZXRoZXJuZXQiLCJ3aWZpIiwiMmciLCIzZyIsIjRnIiwiNWciXSxnbz0iX19VTklBUFBfTUFQIixtbz0iX2RvYy91bmlhcHBfdGVtcCIseW89bW8rIl8iK0RhdGUubm93KCksX289W107ZnVuY3Rpb24gYm8oZSx0KXtwbz1wb3x8cmcuYWNjZWxlcm9tZXRlci53YXRjaEFjY2VsZXJhdGlvbihmdW5jdGlvbih0KXtfby5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ZpKGUse3g6dC54QXhpcyx5OnQueUF4aXMsejp0LnpBeGlzfSl9KX0sZnVuY3Rpb24oZSl7cG89bnVsbCxmaSh0LHtlcnJNc2c6InN0YXJ0QWNjZWxlcm9tZXRlcjpmYWlsICIrZS5tZXNzYWdlfSl9LHtmcmVxdWVuY3k6aG99KSxvZyhmdW5jdGlvbigpe2ZpKHQse2Vyck1zZzoic3RhcnRBY2NlbGVyb21ldGVyOm9rIn0pfSxobyl9ZnVuY3Rpb24gd28oKXtyZXR1cm4gcG8mJihyZy5hY2NlbGVyb21ldGVyLmNsZWFyV2F0Y2gocG8pLHBvPW51bGwpLHt9fXZhciBrbz17bmFtZTp7Z2l2ZW5OYW1lOiJmaXJzdE5hbWUiLG1pZGRsZU5hbWU6Im1pZGRsZU5hbWUiLGZhbWlseU5hbWU6Imxhc3ROYW1lIn0sbmlja25hbWU6Im5pY2tOYW1lIixwaG90b3M6e3R5cGU6InVybCIsdmFsdWU6InBob3RvRmlsZVBhdGgifSxub3RlOiJyZW1hcmsiLHBob25lTnVtYmVyczpbe3R5cGU6Im1vYmlsZSIsdmFsdWU6Im1vYmlsZVBob25lTnVtYmVyIn0se3R5cGU6IndvcmsiLHZhbHVlOiJ3b3JrUGhvbmVOdW1iZXIifSx7dHlwZToiY29tcGFueSIsdmFsdWU6Imhvc3ROdW1iZXIifSx7dHlwZToiaG9tZSBmYXgiLHZhbHVlOiJob21lRmF4TnVtYmVyIn0se3R5cGU6IndvcmsgZmF4Iix2YWx1ZToid29ya0ZheE51bWJlciJ9XSxlbWFpbHM6W3t0eXBlOiJob21lIix2YWx1ZToiZW1haWwifV0sdXJsczpbe3R5cGU6Im90aGVyIix2YWx1ZToidXJsIn1dLG9yZ2FuaXphdGlvbnM6W3t0eXBlOiJjb21wYW55IixuYW1lOiJvcmdhbml6YXRpb24iLHRpdGxlOiJ0aXRsZSJ9XSxpbXM6W3t0eXBlOiJvdGhlciIsdmFsdWU6IndlQ2hhdE51bWJlciJ9XSxhZGRyZXNzZXM6W3t0eXBlOiJvdGhlciIscHJlZmVycmVkOiEwLGNvdW50cnk6ImFkZHJlc3NDb3VudHJ5IixyZWdpb246ImFkZHJlc3NTdGF0ZSIsbG9jYWxpdHk6ImFkZHJlc3NDaXR5IixzdHJlZXRBZGRyZXNzOiJhZGRyZXNzU3RyZWV0Iixwb3N0YWxDb2RlOiJhZGRyZXNzUG9zdGFsQ29kZSJ9LHt0eXBlOiJob21lIixjb3VudHJ5OiJob21lQWRkcmVzc0NvdW50cnkiLHJlZ2lvbjoiaG9tZUFkZHJlc3NTdGF0ZSIsbG9jYWxpdHk6ImhvbWVBZGRyZXNzQ2l0eSIsc3RyZWV0QWRkcmVzczoiaG9tZUFkZHJlc3NTdHJlZXQiLHBvc3RhbENvZGU6ImhvbWVBZGRyZXNzUG9zdGFsQ29kZSJ9LHt0eXBlOiJjb21wYW55Iixjb3VudHJ5OiJ3b3JrQWRkcmVzc0NvdW50cnkiLHJlZ2lvbjoid29ya0FkZHJlc3NTdGF0ZSIsbG9jYWxpdHk6IndvcmtBZGRyZXNzQ2l0eSIsc3RyZWV0QWRkcmVzczoid29ya0FkZHJlc3NTdHJlZXQiLHBvc3RhbENvZGU6IndvcmtBZGRyZXNzUG9zdGFsQ29kZSJ9XX0sU289WyJ0eXBlIiwicHJlZmVycmVkIl07dmFyIHhvPU1pKCJibHVldG9vdGgiLCJvbkJsdWV0b290aERldmljZUZvdW5kIiksQ289TWkoImJsdWV0b290aCIsIm9uQmx1ZXRvb3RoQWRhcHRlclN0YXRlQ2hhbmdlIiksVG89TWkoImJsdWV0b290aCIsIm9uQkxFQ29ubmVjdGlvblN0YXRlQ2hhbmdlIiksT289TWkoImJsdWV0b290aCIsIm9uQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZSIpO2Z1bmN0aW9uIEVvKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLmRldmljZUlkO3QmJihlLmRldmljZUlkPXQudG9VcHBlckNhc2UoKSk7dmFyIG49ZS5zZXJ2aWNlSWQ7cmV0dXJuIG4mJihlLnNlcnZpY2VJZD1uLnRvVXBwZXJDYXNlKCkpLGV9dmFyIEFvLElvPU5pKCJibHVldG9vdGgiLCJvcGVuQmx1ZXRvb3RoQWRhcHRlciIpLCRvPU5pKCJibHVldG9vdGgiLCJjbG9zZUJsdWV0b290aEFkYXB0ZXIiKSxQbz1OaSgiYmx1ZXRvb3RoIiwiZ2V0Qmx1ZXRvb3RoQWRhcHRlclN0YXRlIiksTW89TmkoImJsdWV0b290aCIsInN0YXJ0Qmx1ZXRvb3RoRGV2aWNlc0Rpc2NvdmVyeSIsRW8pLGpvPU5pKCJibHVldG9vdGgiLCJzdG9wQmx1ZXRvb3RoRGV2aWNlc0Rpc2NvdmVyeSIpLExvPU5pKCJibHVldG9vdGgiLCJnZXRCbHVldG9vdGhEZXZpY2VzIiksTm89TmkoImJsdWV0b290aCIsImdldENvbm5lY3RlZEJsdWV0b290aERldmljZXMiLEVvKSxCbz1OaSgiYmx1ZXRvb3RoIiwiY3JlYXRlQkxFQ29ubmVjdGlvbiIsRW8pLERvPU5pKCJibHVldG9vdGgiLCJjbG9zZUJMRUNvbm5lY3Rpb24iLEVvKSxSbz1OaSgiYmx1ZXRvb3RoIiwiZ2V0QkxFRGV2aWNlU2VydmljZXMiLEVvKSxGbz1OaSgiYmx1ZXRvb3RoIiwiZ2V0QkxFRGV2aWNlQ2hhcmFjdGVyaXN0aWNzIixFbyksem89TmkoImJsdWV0b290aCIsIm5vdGlmeUJMRUNoYXJhY3RlcmlzdGljVmFsdWVDaGFuZ2UiLEVvKSxVbz1OaSgiYmx1ZXRvb3RoIiwicmVhZEJMRUNoYXJhY3RlcmlzdGljVmFsdWUiLEVvKSxWbz1OaSgiYmx1ZXRvb3RoIiwid3JpdGVCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlIixFbykscW89TmkoImJsdWV0b290aCIsInNldEJMRU1UVSIsRW8pLFdvPU5pKCJibHVldG9vdGgiLCJnZXRCTEVEZXZpY2VSU1NJIixFbyk7dmFyIEhvPVtdO2Z1bmN0aW9uIEdvKGUsdCl7QW89QW98fHJnLm9yaWVudGF0aW9uLndhdGNoT3JpZW50YXRpb24oZnVuY3Rpb24odCl7SG8uZm9yRWFjaChmdW5jdGlvbihlKXtmaShlLHtkaXJlY3Rpb246dC5tYWduZXRpY0hlYWRpbmd9KX0pfSxmdW5jdGlvbihlKXtBbz1udWxsLGZpKHQse2Vyck1zZzoic3RhcnRDb21wYXNzOmZhaWwgIitlLm1lc3NhZ2V9KX0se2ZyZXF1ZW5jeTpob30pLG9nKGZ1bmN0aW9uKCl7ZmkodCx7ZXJyTXNnOiJzdGFydENvbXBhc3M6b2sifSl9LGhvKX1mdW5jdGlvbiBYbygpe3JldHVybiBBbyYmKHJnLm9yaWVudGF0aW9uLmNsZWFyV2F0Y2goQW8pLEFvPW51bGwpLHt9fXZhciBZbz1NaSgiaWJlYWNvbiIsIm9uQmVhY29uVXBkYXRlIiksSm89TWkoImliZWFjb24iLCJvbkJlYWNvblNlcnZpY2VDaGFuZ2UiKSxLbz1OaSgiaWJlYWNvbiIsImdldEJlYWNvbnMiKSxabz1OaSgiaWJlYWNvbiIsInN0YXJ0QmVhY29uRGlzY292ZXJ5IiksUW89TmkoImliZWFjb24iLCJzdG9wQmVhY29uRGlzY292ZXJ5Iik7dmFyIGVhPSJBbmRyb2lkIj09PXJnLm9zLm5hbWUmJnBhcnNlSW50KHJnLm9zLnZlcnNpb24pPDYsdGE9ZWE/InNsaWRlLWluLXJpZ2h0IjoicG9wLWluIixuYT0zMDAscmE9ZWE/InNsaWRlLW91dC1yaWdodCI6InBvcC1vdXQiLGlhPTUwLG9hPSJfd3d3L19fdW5pYXBwdmlldy5odG1sIixhYT0iZiIsc2E9ImkiLGNhPSJlIix1YT0idi1zaG93IixsYT0iYyIsZGE9InMiLGZhPSJzYyIscGE9e30saGE9IldFQl9JTlZPS0VfQVBQU0VSVklDRSI7ZnVuY3Rpb24gdmEoZSx0KXtpZihlPT09aGEpcmV0dXJuIGhpKGhhLHQuZGF0YSx0LndlYnZpZXdJZHMpLCEwO3ZhciBuPXBhW2VdO3JldHVybiEhbiYmKG4odCksbi5rZWVwQWxpdmV8fGRlbGV0ZSBwYVtlXSwhMCl9ZnVuY3Rpb24gZ2EoZSx0LG4pe2lmKHZvaWQgMD09PW4mJihuPSEwKSxwYVtlXSlyZXR1cm4gY29uc29sZS53YXJuKCInIitlKyInIHJlZ2lzdGVyZWQ6ICIrcGFbZV0udG9TdHJpbmcoKSk7dC5rZWVwQWxpdmU9ISFuLHBhW2VdPXR9dmFyIG1hPSJfX1VOSUFQUF9TQ0FOIix5YT0iX3d3dy9fX3VuaWFwcHNjYW4uaHRtbCIsX2E9InNjYW5Db2RlIjt2YXIgYmEsd2Esa2EsU2EseGEsQ2E9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsU0NBTl9JRDptYSxTQ0FOX1BBVEg6eWEsc2NhbkNvZGU6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLm9ubHlGcm9tQ2FtZXJhO3ZvaWQgMD09PW4mJihuPSExKTt2YXIgcj1lLnNjYW5UeXBlLGk9ZS5hdXRvRGVjb2RlQ2hhclNldCxvPXJnLmJhcmNvZGUsYT17cXJDb2RlOltvLlFSLG8uQVpURUMsby5NQVhJQ09ERV0sYmFyQ29kZTpbby5FQU4xMyxvLkVBTjgsby5VUENBLG8uVVBDRSxvLkNPREFCQVIsby5DT0RFMTI4LG8uQ09ERTM5LG8uQ09ERTkzLG8uSVRGLG8uUlNTMTQsby5SU1NFWFBBTkRFRF0sZGF0YW1hdHJpeDpbby5EQVRBTUFUUklYXSxwZGY0MTc6W28uUERGNDE3XX0scz17fTtzW28uUVJdPSJRUl9DT0RFIixzW28uRUFOMTNdPSJFQU5fMTMiLHNbby5FQU44XT0iRUFOXzgiLHNbby5EQVRBTUFUUklYXT0iREFUQV9NQVRSSVgiLHNbby5VUENBXT0iVVBDX0EiLHNbby5VUENFXT0iVVBDX0UiLHNbby5DT0RBQkFSXT0iQ09EQUJBUiIsc1tvLkNPREUzOV09IkNPREVfMzkiLHNbby5DT0RFOTNdPSJDT0RFXzkzIixzW28uQ09ERTEyOF09IkNPREVfMTI4IixzW28uSVRGXT0iQ09ERV8yNSIsc1tvLlBERjQxN109IlBERl80MTciLHNbby5BWlRFQ109IkFaVEVDIixzW28uUlNTMTRdPSJSU1NfMTQiLHNbby5SU1NFWFBBTkRFRF09IlJTU0VYUEFOREVEIjt2YXIgYyx1LGw9ImxpZ2h0IiE9PSgiVUlTdGF0dXNCYXJTdHlsZUJsYWNrVHJhbnNsdWNlbnQiPT09KGM9cmcubmF2aWdhdG9yLmdldFN0YXR1c0JhclN0eWxlKCkpfHwiVUlTdGF0dXNCYXJTdHlsZUJsYWNrT3BhcXVlIj09PWN8fCJudWxsIj09PWM/Yz0ibGlnaHQiOiJVSVN0YXR1c0JhclN0eWxlRGVmYXVsdCI9PT1jJiYoYz0iZGFyayIpLGMpLGQ9W107QXJyYXkuaXNBcnJheShyKSYmci5sZW5ndGgmJnIuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1hW2VdO3QmJihkPWQuY29uY2F0KHQpKX0pLGQubGVuZ3RofHwoZD1kLmNvbmNhdChhLnFyQ29kZSkuY29uY2F0KGEuYmFyQ29kZSkuY29uY2F0KGEuZGF0YW1hdHJpeCkuY29uY2F0KGEucGRmNDE3KSk7dmFyIGY9W107bnx8Zi5wdXNoKHtmbG9hdDoicmlnaHQiLHRleHQ6YXQoInVuaS5zY2FuQ29kZS5hbGJ1bSIpLGZvbnRTaXplOiIxN3B4Iix3aWR0aDoiNjBweCIsb25jbGljazpmdW5jdGlvbigpe3JnLmdhbGxlcnkucGljayhmdW5jdGlvbihlKXtvLnNjYW4oZSxmdW5jdGlvbihlLHQsbixyKXtsJiZyZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKSx1PXt0eXBlOmUsY29kZTp0LGNoYXJTZXQ6cn0scC5jbG9zZSgiYXV0byIpfSxmdW5jdGlvbigpe3JnLm5hdGl2ZVVJLnRvYXN0KGF0KCJ1bmkuc2NhbkNvZGUuZmFpbCIpKX0sZCxpKX0sZnVuY3Rpb24oZSl7ZS5jb2RlIT09KCJBbmRyb2lkIj09PXJnLm9zLm5hbWU/MTI6LTIpJiZyZy5uYXRpdmVVSS50b2FzdChhdCgidW5pLnNjYW5Db2RlLmZhaWwiKSl9LHttdWx0aXBsZTohMSxzeXN0ZW06ITEsZmlsZW5hbWU6eW8rIi9nYWxsZXJ5LyIscGVybWlzc2lvbkFsZXJ0OiEwfSl9fSk7dmFyIHA9cmcud2Vidmlldy5jcmVhdGUoeWEsbWEse3RpdGxlTlZpZXc6e2F1dG9CYWNrQnV0dG9uOiEwLHR5cGU6ImZsb2F0IixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkiLHRpdGxlQ29sb3I6IiNmZmZmZmYiLHRpdGxlVGV4dDphdCgidW5pLnNjYW5Db2RlLnRpdGxlIiksdGl0bGVTaXplOiIxN3B4IixidXR0b25zOmZ9LHBvcEdlc3R1cmU6ImNsb3NlIixiYWNrQnV0dG9uQXV0b0NvbnRyb2w6ImNsb3NlIn0se19fdW5pYXBwX3R5cGU6InNjYW4iLF9fdW5pYXBwX2Rhcms6bCxfX3VuaWFwcF9zY2FuX3R5cGU6ZCxfX3VuaWFwcF9hdXRvX2RlY29kZV9jaGFyX3NldDppLF9fdW5pYXBwX2xvY2FsZTpzdCgpLCJ1bmktYXBwIjoibm9uZSJ9KSxoPXJnLm5hdGl2ZVVJLnNob3dXYWl0aW5nKCk7cC5hZGRFdmVudExpc3RlbmVyKCJ0aXRsZVVwZGF0ZSIsZnVuY3Rpb24oKXtwLnNob3codGEsbmEsZnVuY3Rpb24oKXtoLmNsb3NlKCl9KX0pLHAuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLGZ1bmN0aW9uKCl7ZmkodCx1P3tyZXN1bHQ6dS5jb2RlLHNjYW5UeXBlOnNbdS50eXBlXXx8IiIsY2hhclNldDp1LmNoYXJTZXR8fCJ1dGY4IixwYXRoOiIiLGVyck1zZzoic2NhbkNvZGU6b2sifTp7ZXJyTXNnOiJzY2FuQ29kZTpmYWlsIGNhbmNlbCJ9KSx2YShfYSl9KSxsJiYocmcubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJsaWdodCIpLHAuYWRkRXZlbnRMaXN0ZW5lcigicG9wR2VzdHVyZSIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS50eXBlLG49ZS5yZXN1bHQ7InN0YXJ0Ij09PXQ/cmcubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJkYXJrIik6ImVuZCIhPT10fHxufHxyZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0Iil9KSksZ2EoX2EsZnVuY3Rpb24oZSl7ZSYmImNvZGUiaW4gZSYmKHU9ZSl9LCExKX19KTtmdW5jdGlvbiBUYSgpe3JldHVybiJvYmplY3QiPT10eXBlb2Ygd2luZG93JiYib2JqZWN0Ij09dHlwZW9mIG5hdmlnYXRvciYmIm9iamVjdCI9PXR5cGVvZiBkb2N1bWVudD8id2VidmlldyI6InY4In1mdW5jdGlvbiBPYSgpe3JldHVybiBiYS53ZWJ2aWV3LmN1cnJlbnRXZWJ2aWV3KCkuaWR9dmFyIEVhPXt9O2Z1bmN0aW9uIEFhKGUpe3ZhciB0PWUuZGF0YSYmZS5kYXRhLl9fbWVzc2FnZTtpZih0JiZ0Ll9fcGFnZSl7dmFyIG49dC5fX3BhZ2Uscj1FYVtuXTtyJiZyKHQpLHQua2VlcHx8ZGVsZXRlIEVhW25dfX12YXIgSWE9ZnVuY3Rpb24oZSl7dGhpcy53ZWJ2aWV3PWV9O2Z1bmN0aW9uICRhKGUpe3ZhciB0PWUuY29udGV4dDt2b2lkIDA9PT10JiYodD17fSk7dmFyIG49ZS51cmwscj1lLmRhdGE7dm9pZCAwPT09ciYmKHI9e30pO3ZhciBpPWUuc3R5bGU7dm9pZCAwPT09aSYmKGk9e30pO3ZhciBvPWUub25NZXNzYWdlLGE9ZS5vbkNsb3NlO2JhPXQucGx1c3x8cmcsd2E9dC53ZWV4fHwoIm9iamVjdCI9PXR5cGVvZiBuZz9uZzpudWxsKSxrYT10LkJyb2FkY2FzdENoYW5uZWx8fCgib2JqZWN0Ij09dHlwZW9mIEJyb2FkY2FzdENoYW5uZWw/QnJvYWRjYXN0Q2hhbm5lbDpudWxsKTt2YXIgcz0icGFnZSIrRGF0ZS5ub3coKTshMSE9PShpPU9iamVjdC5hc3NpZ24oe30saSkpLnRpdGxlTlZpZXcmJiJub25lIiE9PWkudGl0bGVOVmlldyYmKGkudGl0bGVOVmlldz1PYmplY3QuYXNzaWduKHthdXRvQmFja0J1dHRvbjohMCx0aXRsZVNpemU6IjE3cHgifSxpLnRpdGxlTlZpZXcpKTt2YXIgYz17dG9wOjAsYm90dG9tOjAsdXNpbmdDb21wb25lbnRzOnt9LHBvcEdlc3R1cmU6ImNsb3NlIixzY3JvbGxJbmRpY2F0b3I6Im5vbmUiLGFuaW1hdGlvblR5cGU6InBvcC1pbiIsYW5pbWF0aW9uRHVyYXRpb246MjAwLHVuaU5WaWV3OntwYXRoOigic3RyaW5nIj09dHlwZW9mIFZVRV9BUFBfVEVNUExBVEVfUEFUSD9WVUVfQVBQX1RFTVBMQVRFX1BBVEg6IiIpKyIvIituKyIuanMiLGRlZmF1bHRGb250U2l6ZToxNix2aWV3cG9ydDpiYS5zY3JlZW4ucmVzb2x1dGlvbldpZHRofX07aT1PYmplY3QuYXNzaWduKGMsaSk7dmFyIHUsbCxkPWJhLndlYnZpZXcuY3JlYXRlKCIiLHMsaSx7ZXh0cmFzOntmcm9tOk9hKCkscnVudGltZTpUYSgpLGRhdGE6T2JqZWN0LmFzc2lnbih7fSxyLHtkYXJrbW9kZTp1Zy5kYXJrbW9kZX0pLHVzZUdsb2JhbEV2ZW50OiFrYX19KTtyZXR1cm4gZC5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsYSksdT1zLGw9ZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oZS5kYXRhKSxlLmtlZXB8fGQuY2xvc2UoImF1dG8iKX0sInY4Ij09PVRhKCk/a2E/KFNhJiZTYS5jbG9zZSgpLChTYT1uZXcga2EoT2EoKSkpLm9ubWVzc2FnZT1BYSk6eGF8fCh4YT13YS5yZXF1aXJlTW9kdWxlKCJnbG9iYWxFdmVudCIpKS5hZGRFdmVudExpc3RlbmVyKCJwbHVzTWVzc2FnZSIsQWEpOndpbmRvdy5fX3BsdXNNZXNzYWdlPUFhLEVhW3VdPWwsZC5zaG93KGkuYW5pbWF0aW9uVHlwZSxpLmFuaW1hdGlvbkR1cmF0aW9uKSxuZXcgSWEoZCl9SWEucHJvdG90eXBlLnNlbmRNZXNzYWdlPWZ1bmN0aW9uKGUpe3ZhciB0PUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoe19fbWVzc2FnZTp7ZGF0YTplfX0pKSxuPXRoaXMud2Vidmlldy5pZDtrYT9uZXcga2EobikucG9zdE1lc3NhZ2UodCk6YmEud2Vidmlldy5wb3N0TWVzc2FnZVRvVW5pTlZpZXcodCxuKX0sSWEucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dGhpcy53ZWJ2aWV3LmNsb3NlKCl9O3ZhciBQYT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxzY2FuQ29kZTpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT0ibGlnaHQiIT09KCJVSVN0YXR1c0JhclN0eWxlQmxhY2tUcmFuc2x1Y2VudCI9PT0obj1yZy5uYXZpZ2F0b3IuZ2V0U3RhdHVzQmFyU3R5bGUoKSl8fCJVSVN0YXR1c0JhclN0eWxlQmxhY2tPcGFxdWUiPT09bnx8Im51bGwiPT09bj9uPSJsaWdodCI6IlVJU3RhdHVzQmFyU3R5bGVEZWZhdWx0Ij09PW4mJihuPSJkYXJrIiksbiksbz0kYSh7dXJsOiJfX3VuaWFwcHNjYW4iLGRhdGE6T2JqZWN0LmFzc2lnbih7fSxlLHttZXNzYWdlczp7ZmFpbDphdCgidW5pLnNjYW5Db2RlLmZhaWwiKSwiZmxhc2gub24iOmF0KCJ1bmkuc2NhbkNvZGUuZmxhc2gub24iKSwiZmxhc2gub2ZmIjphdCgidW5pLnNjYW5Db2RlLmZsYXNoLm9mZiIpfX0pLHN0eWxlOnthbmltYXRpb25UeXBlOmUuYW5pbWF0aW9uVHlwZXx8InBvcC1pbiIsdGl0bGVOVmlldzp7YXV0b0JhY2tCdXR0b246ITAsdHlwZToiZmxvYXQiLHRpdGxlVGV4dDplLnRpdGxlVGV4dHx8YXQoInVuaS5zY2FuQ29kZS50aXRsZSIpLHRpdGxlQ29sb3I6IiNmZmZmZmYiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSIsYnV0dG9uczplLm9ubHlGcm9tQ2FtZXJhP1tdOlt7dGV4dDplLmFsYnVtVGV4dHx8YXQoInVuaS5zY2FuQ29kZS5hbGJ1bSIpLGZvbnRTaXplOiIxN3B4Iix3aWR0aDoiNjBweCIsb25jbGljazpmdW5jdGlvbigpe28uc2VuZE1lc3NhZ2Uoe3R5cGU6ImdhbGxlcnkifSl9fV19LHBvcEdlc3R1cmU6ImNsb3NlIixiYWNrZ3JvdW5kOiIjMDAwMDAwIixiYWNrQnV0dG9uQXV0b0NvbnRyb2w6ImNsb3NlIn0sb25NZXNzYWdlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZXZlbnQsbj1lLmRldGFpbDsocj1uKS5lcnJNc2c9Im1hcmtlZCI9PT10PyJzY2FuQ29kZTpvayI6InNjYW5Db2RlOmZhaWwgIituLm1lc3NhZ2V9LG9uQ2xvc2U6ZnVuY3Rpb24oKXtpJiZyZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKSxmaSh0LHJ8fHtlcnJNc2c6InNjYW5Db2RlOmZhaWwgY2FuY2VsIn0pfX0pO2kmJihyZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0Iiksby53ZWJ2aWV3LmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudHlwZSxuPWUucmVzdWx0OyJzdGFydCI9PT10P3JnLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgiZGFyayIpOiJlbmQiIT09dHx8bnx8cmcubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJsaWdodCIpfSkpfX0pO2Z1bmN0aW9uIE1hKCl7aWYoImlvcyIhPT1yZy5vcy5uYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuITE7dmFyIGU9cGkoImZhY2VJRCIpO3JldHVybiEoIWV8fCFlLmlzU3VwcG9ydCgpKX1mdW5jdGlvbiBqYSgpe3JldHVybiEoIXJnLmZpbmdlcnByaW50fHwhcmcuZmluZ2VycHJpbnQuaXNTdXBwb3J0KCkpfWZ1bmN0aW9uIExhKCl7dmFyIGU9W107cmV0dXJuIGphKCkmJmUucHVzaCgiZmluZ2VyUHJpbnQiKSxNYSgpJiZlLnB1c2goImZhY2lhbCIpLHtzdXBwb3J0TW9kZTplLGVyck1zZzoiY2hlY2tJc1N1cHBvcnRTb3RlckF1dGhlbnRpY2F0aW9uOm9rIn19ZnVuY3Rpb24gTmEoZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUuY2hlY2tBdXRoTW9kZTtpZigiZmluZ2VyUHJpbnQiPT09dClyZXR1cm4gamEoKT97aXNFbnJvbGxlZDpyZy5maW5nZXJwcmludC5pc0tleWd1YXJkU2VjdXJlKCkmJnJnLmZpbmdlcnByaW50LmlzRW5yb2xsZWRGaW5nZXJwcmludHMoKSxlcnJNc2c6ImNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6b2sifTp7aXNFbnJvbGxlZDohMSxlcnJNc2c6ImNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6ZmFpbCBub3Qgc3VwcG9ydCJ9O2lmKCJmYWNpYWwiPT09dCl7aWYoTWEoKSl7dmFyIG49cGkoImZhY2VJRCIpO3JldHVybntpc0Vucm9sbGVkOm4mJm4uaXNLZXlndWFyZFNlY3VyZSgpJiZuLmlzRW5yb2xsZWRGYWNlSUQoKSxlcnJNc2c6ImNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6b2sifX1yZXR1cm57aXNFbnJvbGxlZDohMSxlcnJNc2c6ImNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6ZmFpbCBub3Qgc3VwcG9ydCJ9fXJldHVybntpc0Vucm9sbGVkOiExLGVyck1zZzoiY2hlY2tJc1NvdGVyRW5yb2xsZWRJbkRldmljZTpmYWlsIG5vdCBzdXBwb3J0In19ZnVuY3Rpb24gQmEoZSl7dmFyIHQ9ZS5idXR0b25zO3JldHVybiBBcnJheS5pc0FycmF5KHQpJiZ0LmZvckVhY2goZnVuY3Rpb24oZSx0KXt2YXIgcjtlLm9uY2xpY2s9KHI9dCxmdW5jdGlvbihlKXt2YXIgdD1wZygpO2lmKHQubGVuZ3RoKXtlLmluZGV4PXI7dmFyIG49dFt0Lmxlbmd0aC0xXTtuLiR2bSYmbi4kdm0uX19jYWxsX2hvb2smJm4uJHZtLl9fY2FsbF9ob29rKCJvbk5hdmlnYXRpb25CYXJCdXR0b25UYXAiLGUpfX0pfSksZX1mdW5jdGlvbiBEYShuLHIpe3ZhciBlPWZ1bmN0aW9uKGUpe2lmKGR0KCkpcmV0dXJuIGx0KGUsW1sidGl0bGVUZXh0Il0sWyJzZWFyY2hJbnB1dCIsInBsYWNlaG9sZGVyIl0sWyJidXR0b25zIiwidGV4dCJdXSl9KHIpO2lmKCFlKXJldHVybiByO3ZhciBpPWVbMF0sbz1lWzFdO3JldHVybihpfHxvKSYmZGcub25Mb2NhbGVDaGFuZ2UoZnVuY3Rpb24oKXt2YXIgZT1yZy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKG4rIiIpO2lmKGUpe3ZhciB0PXt9O2kmJih0LnRpdGxlVGV4dD1yLnRpdGxlVGV4dCksbyYmKHQuc2VhcmNoSW5wdXQ9e3BsYWNlaG9sZGVyOnIuc2VhcmNoSW5wdXQucGxhY2Vob2xkZXJ9KSxlLnNldFN0eWxlKHt0aXRsZU5WaWV3OnR9KX19KSxyfXZhciBSYT0vKFxkKyhcLlxkKyk/KVtyfHVdcHgvZztmdW5jdGlvbiBGYSh0KXt2YXIgbj17fSxlPUpTT04uc3RyaW5naWZ5KHQpO2lmKH5lLmluZGV4T2YoInVweCIpfHx+ZS5pbmRleE9mKCJycHgiKSl0cnl7bj1KU09OLnBhcnNlKGUucmVwbGFjZShSYSxmdW5jdGlvbihlLHQpe3JldHVybiBkZy51cHgycHgocGFyc2VJbnQodCl8fDApKyJweCJ9KSl9Y2F0Y2goZSl7bj10LGNvbnNvbGUuZXJyb3IoZSl9ZWxzZSBuPUpTT04ucGFyc2UoZSk7cmV0dXJuIG59dmFyIHphPVsibmF2aWdhdGlvbkJhckJhY2tncm91bmRDb2xvciIsIm5hdmlnYXRpb25CYXJUZXh0U3R5bGUiLCJuYXZpZ2F0aW9uQmFyVGl0bGVUZXh0IiwibmF2aWdhdGlvbkJhclNoYWRvdyIsIm5hdmlnYXRpb25TdHlsZSIsImRpc2FibGVTY3JvbGwiLCJiYWNrZ3JvdW5kQ29sb3IiLCJiYWNrZ3JvdW5kVGV4dFN0eWxlIiwiZW5hYmxlUHVsbERvd25SZWZyZXNoIiwib25SZWFjaEJvdHRvbURpc3RhbmNlIiwidXNpbmdDb21wb25lbnRzIiwidGl0bGVOVmlldyIsInB1bGxUb1JlZnJlc2giXTtmdW5jdGlvbiBVYShlLHQsbil7dm9pZCAwPT09biYmKG49e30pO3ZhciByPXtib3VuY2U6InZlcnRpY2FsIn07bi53aW5kb3c9RmEoT2JqZWN0LmFzc2lnbihKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHVnLndpbmRvd3x8e30pKSxuLndpbmRvd3x8e30pKTt2YXIgaT1EcyhuKTtPYmplY3Qua2V5cyhpLndpbmRvdykuZm9yRWFjaChmdW5jdGlvbihlKXstMT09PXphLmluZGV4T2YoZSkmJihyW2VdPWkud2luZG93W2VdKX0pO3ZhciBvPWkud2luZG93LmJhY2tncm91bmRDb2xvcjsoL14jW2EtejAtOV17Nn0kL2kudGVzdChvKXx8InRyYW5zcGFyZW50Ij09PW8pJiYoci5iYWNrZ3JvdW5kP289ci5iYWNrZ3JvdW5kOnIuYmFja2dyb3VuZD1vLHIuYmFja2dyb3VuZENvbG9yVG9wfHwoci5iYWNrZ3JvdW5kQ29sb3JUb3A9byksci5iYWNrZ3JvdW5kQ29sb3JCb3R0b218fChyLmJhY2tncm91bmRDb2xvckJvdHRvbT1vKSxyLmFuaW1hdGlvbkFscGhhQkdDb2xvcnx8KHIuYW5pbWF0aW9uQWxwaGFCR0NvbG9yPW8pLHZvaWQgMD09PXIud2Vidmlld0JHVHJhbnNwYXJlbnQmJihyLndlYnZpZXdCR1RyYW5zcGFyZW50PSEwKSk7dmFyIGE9ZnVuY3Rpb24oZSx0KXt2YXIgbj10LndpbmRvdyxyPW4udGl0bGVOVmlldztpZih0Lm1ldGEuc3RhdHVzQmFyU3R5bGU9IndoaXRlIj09PW4ubmF2aWdhdGlvbkJhclRleHRTdHlsZT8ibGlnaHQiOiJkYXJrIiwhMT09PXJ8fCJmYWxzZSI9PT1yfHwiY3VzdG9tIj09PW4ubmF2aWdhdGlvblN0eWxlJiYhVChyKXx8ImFsd2F5cyI9PT1uLnRyYW5zcGFyZW50VGl0bGUmJiFUKHIpKXJldHVybiExO3ZhciBpPW4udGl0bGVJbWFnZXx8IiIsbz1uLnRyYW5zcGFyZW50VGl0bGV8fCJub25lIixhPW4ubmF2aWdhdGlvbkJhckJhY2tncm91bmRDb2xvcixzPXthdXRvQmFja0J1dHRvbjohdC5tZXRhLmlzUXVpdCx0aXRsZVRleHQ6IiI9PT1pJiZuLm5hdmlnYXRpb25CYXJUaXRsZVRleHR8fCIiLHRpdGxlQ29sb3I6IndoaXRlIj09PW4ubmF2aWdhdGlvbkJhclRleHRTdHlsZT8iI2ZmZmZmZiI6IiMwMDAwMDAiLHR5cGU6e25vbmU6ImRlZmF1bHQiLGF1dG86InRyYW5zcGFyZW50IixhbHdheXM6ImZsb2F0In1bb10sYmFja2dyb3VuZENvbG9yOi9eI1thLXowLTldezZ9JC9pLnRlc3QoYSl8fCJ0cmFuc3BhcmVudCI9PT1hP2E6IiNmOGY4ZjgiLHRhZ3M6IiI9PT1pP1tdOlt7dGFnOiJpbWciLHNyYzppLHBvc2l0aW9uOntsZWZ0OiJhdXRvIix0b3A6ImF1dG8iLHdpZHRoOiJhdXRvIixoZWlnaHQ6IjI2cHgifX1dfTtyZXR1cm4gVChyKT9EYShlLE9iamVjdC5hc3NpZ24ocyxCYShyKSkpOkRhKGUscyl9KGUsaSk7YSYmKDE9PT1lJiZ1Zy5yZWFsRW50cnlQYWdlUGF0aCYmIWkubWV0YS5pc1F1aXQmJihhLmF1dG9CYWNrQnV0dG9uPSEwKSxyLnRpdGxlTlZpZXc9YSk7dmFyIHM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS53aW5kb3c7aWYodC5lbmFibGVQdWxsRG93blJlZnJlc2h8fHQucHVsbFRvUmVmcmVzaCYmdC5wdWxsVG9SZWZyZXNoLnN1cHBvcnQpe3ZhciBuPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIkFuZHJvaWQiPT09cmcub3MubmFtZT9PYmplY3QuYXNzaWduKG4se3N1cHBvcnQ6ITAsc3R5bGU6ImNpcmNsZSJ9KTpPYmplY3QuYXNzaWduKG4se3N1cHBvcnQ6ITAsc3R5bGU6ImRlZmF1bHQiLGhlaWdodDoiNTBweCIscmFuZ2U6IjIwMHB4Iixjb250ZW50ZG93bjp7Y2FwdGlvbjoiIn0sY29udGVudG92ZXI6e2NhcHRpb246IiJ9LGNvbnRlbnRyZWZyZXNoOntjYXB0aW9uOiIifX0pLHQuYmFja2dyb3VuZFRleHRTdHlsZSYmKG4uY29sb3I9dC5iYWNrZ3JvdW5kVGV4dFN0eWxlLG4uc25vd0NvbG9yPXQuYmFja2dyb3VuZFRleHRTdHlsZSksT2JqZWN0LmFzc2lnbihuLHQucHVsbFRvUmVmcmVzaHx8e30pLG59fShpKTtyZXR1cm4gcyYmKCJjaXJjbGUiPT09cy5zdHlsZSYmKHIuYm91bmNlPSJub25lIiksci5wdWxsVG9SZWZyZXNoPXMpLCJoaWRlIj09PXIucG9wR2VzdHVyZSYmZGVsZXRlIHIucG9wR2VzdHVyZSxpLm1ldGEuaXNRdWl0JiYoci5wb3BHZXN0dXJlPSJpT1MiPT09cmcub3MubmFtZT8iYXBwYmFjayI6Im5vbmUiKSx0JiZpLm1ldGEuaXNOVnVlJiYoci51bmlOVmlldz17cGF0aDp0LGRlZmF1bHRGb250U2l6ZTp1Zy5kZWZhdWx0Rm9udFNpemUsdmlld3BvcnQ6dWcudmlld3BvcnR9KSxuLm1ldGE9aS5tZXRhLHJ9ZnVuY3Rpb24gVmEoKXtkZy5uYXZpZ2F0ZUJhY2soe2Zyb206ImJhY2tidXR0b24ifSl9ZnVuY3Rpb24gcWEoKXtyZXR1cm4gcmcubmF2aWdhdG9yLmlzSW1tZXJzZWRTdGF0dXNiYXIoKT9NYXRoLnJvdW5kKCJpT1MiPT09cmcub3MubmFtZT9yZy5uYXZpZ2F0b3IuZ2V0U2FmZUFyZWFJbnNldHMoKS50b3A6cmcubmF2aWdhdG9yLmdldFN0YXR1c2JhckhlaWdodCgpKTowfWZ1bmN0aW9uIFdhKGUsdCxuKXtpZihlLnBhdGgpe3ZhciByPWUuc3R5bGV8fHt9LGk9Im5hdmlnYXRpb25CYXIiPT09ZS50eXBlLG89InBvcHVwIj09PWUudHlwZTtkZWxldGUgci50eXBlLG8mJiFlLmlkJiZjb25zb2xlLndhcm4oInN1Yk5WdWVbIitlLnBhdGgrIl0gaXMgbWlzc2luZyBpZCIpLHIudW5pTlZpZXc9e3BhdGg6ZS5wYXRoLnJlcGxhY2UoIi5udnVlIiwiLmpzIiksZGVmYXVsdEZvbnRTaXplOnVnLmRlZmF1bHRGb250U2l6ZSx2aWV3cG9ydDp1Zy52aWV3cG9ydH07dmFyIGEscz17X191bmlhcHBfaG9zdDp0LnBhdGgsX191bmlhcHBfb3JpZ2luOnIudW5pTlZpZXcucGF0aC5zcGxpdCgiPyIpWzBdLnJlcGxhY2UoIi5qcyIsIiIpLF9fdW5pYXBwX29yaWdpbl9pZDpuLmlkLF9fdW5pYXBwX29yaWdpbl90eXBlOm4uX191bmlhcHBfdHlwZX07aT8oci5wb3NpdGlvbj0iZG9jayIsci5kb2NrPSJ0b3AiLHIudG9wPTAsci53aWR0aD0iMTAwJSIsci5oZWlnaHQ9dHQrcWEoKSxkZWxldGUgci5sZWZ0LGRlbGV0ZSByLnJpZ2h0LGRlbGV0ZSByLmJvdHRvbSxkZWxldGUgci5tYXJnaW4pOm8mJihyLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYT15aSh0LnBhdGgpP3FzOm4scy5fX3VuaWFwcF9tYXNrPXIubWFza3x8InJnYmEoMCwwLDAsMC41KSIscy5fX3VuaWFwcF9tYXNrX2lkPWEuaWQpLGRlbGV0ZSByLm1hc2s7dmFyIGMsdT1yZy53ZWJ2aWV3LmNyZWF0ZSgiIixlLmlkLHIscyk7bz9mdW5jdGlvbihlLHQsbil7bi5wb3B1cFN1Yk5WdWVXZWJ2aWV3c3x8KG4ucG9wdXBTdWJOVnVlV2Vidmlld3M9e30pLG4ucG9wdXBTdWJOVnVlV2Vidmlld3NbZS5pZF09ZTt2YXIgcj1mdW5jdGlvbigpe24uc2V0U3R5bGUoe21hc2s6Im5vbmUifSksZS5oaWRlKCJhdXRvIil9O24uYWRkRXZlbnRMaXN0ZW5lcigibWFza0NsaWNrIixyKTt2YXIgaT0hMTtlLmFkZEV2ZW50TGlzdGVuZXIoInNob3ciLGZ1bmN0aW9uKCl7aXx8KHJnLmtleS5yZW1vdmVFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixWYSkscmcua2V5LmFkZEV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLHIpLGk9ITApfSksZS5hZGRFdmVudExpc3RlbmVyKCJoaWRlIixmdW5jdGlvbigpe2kmJihyZy5rZXkucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYmFja2J1dHRvbiIscikscmcua2V5LmFkZEV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLFZhKSxpPSExKX0pLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLGZ1bmN0aW9uKCl7ZGVsZXRlIG4ucG9wdXBTdWJOVnVlV2Vidmlld3NbZS5pZF0saSYmKHJnLmtleS5yZW1vdmVFdmVudExpc3RlbmVyKCJiYWNrYnV0dG9uIixyKSxyZy5rZXkuYWRkRXZlbnRMaXN0ZW5lcigiYmFja2J1dHRvbiIsVmEpLGk9ITEpfSl9KHUsMCxhKTooYz11LG4uYXBwZW5kKGMpKX19ZnVuY3Rpb24gSGEoaSl7dmFyIG4scixvLGU7aS5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLChuPWZ1bmN0aW9uKGUpe3ZhciB0PWUud2lkdGgsbj1lLmhlaWdodCxyPXtkZXZpY2VPcmllbnRhdGlvbjo5MD09PU1hdGguYWJzKHJnLm5hdmlnYXRvci5nZXRPcmllbnRhdGlvbigpKT8ibGFuZHNjYXBlIjoicG9ydHJhaXQiLHNpemU6e3dpbmRvd1dpZHRoOk1hdGguY2VpbCh0KSx3aW5kb3dIZWlnaHQ6TWF0aC5jZWlsKG4pfX07aGkoIm9uVmlld0RpZFJlc2l6ZSIsciksaWcuZW1pdCgib25SZXNpemUiLHIscGFyc2VJbnQoaS5pZCkpfSxyPTUwLChlPWZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLHQ9dGhpczthZyhvKSxvPW9nKGZ1bmN0aW9uKCl7cmV0dXJuIG4uYXBwbHkodCxlKX0scil9KS5jYW5jZWw9ZnVuY3Rpb24oKXthZyhvKX0sZSkpfXZhciBHYSxYYT0yLFlhPSJ2ZFN5bmMiLEphPSJ3ZWJ2aWV3UmVhZHkiLEthPSJ2ZFN5bmNDYWxsYmFjayIsWmE9Imludm9rZUFwaSIsUWE9IldFQl9JTlZPS0VfQVBQU0VSVklDRSIsZXM9IndlYnZpZXdJbnNlcnRlZCIsdHM9IndlYnZpZXdSZW1vdmVkIixucz0id2Vidmlld0lkIjtmdW5jdGlvbiBycyhlKXt2YXIgbDtlLmFkZEV2ZW50TGlzdGVuZXIoInBvcEdlc3R1cmUiLGZ1bmN0aW9uKGUpe2lmKCJzdGFydCI9PT1lLnR5cGUpe3ZhciB0PXBnKCksbj10W3QubGVuZ3RoLTJdO2w9bGk7dmFyIHI9biYmbi4kcGFnZS5tZXRhLnN0YXR1c0JhclN0eWxlO3ImJm1pKHIpfWVsc2UgaWYoImVuZCIhPT1lLnR5cGV8fGUucmVzdWx0KXtpZigiZW5kIj09PWUudHlwZSYmZS5yZXN1bHQpe3ZhciBpPXBnKCksbz1pLmxlbmd0aCxhPWlbaS5sZW5ndGgtMV07YSYmYS4kcmVtb3ZlKCksbWkoKSxhJiYxPT09byYmKHU9YSx1Zy5yZWFsRW50cnlQYWdlUGF0aCYmdS4kcGFnZS5yb3V0ZT09PXVnLmVudHJ5UGFnZVBhdGgpPyh1Zy5lbnRyeVBhZ2VQYXRoPXVnLnJlYWxFbnRyeVBhZ2VQYXRoLGRlbGV0ZSB1Zy5yZWFsRW50cnlQYWdlUGF0aCxkZy5yZUxhdW5jaCh7dXJsOihzPXVnLmVudHJ5UGFnZVBhdGgsYz1zLDA9PT1jLmluZGV4T2YoIi8iKT9zOiIvIitzKX0pKTppZy5lbWl0KCJvbkFwcFJvdXRlIix7dHlwZToibmF2aWdhdGVCYWNrIn0pfX1lbHNlIG1pKGwpO3ZhciBzLGMsdX0pfXZhciBpcz0yLG9zPXtwdWxsVG9SZWZyZXNoOiJvblB1bGxEb3duUmVmcmVzaCIsdGl0bGVOVmlld1NlYXJjaElucHV0Q2hhbmdlZDoib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDaGFuZ2VkIix0aXRsZU5WaWV3U2VhcmNoSW5wdXRDb25maXJtZWQ6Im9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q29uZmlybWVkIix0aXRsZU5WaWV3U2VhcmNoSW5wdXRDbGlja2VkOiJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENsaWNrZWQiLHRpdGxlTlZpZXdTZWFyY2hJbnB1dEZvY3VzQ2hhbmdlZDoib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRGb2N1c0NoYW5nZWQifTtmdW5jdGlvbiBhcyhlKXtHYT1lfWZ1bmN0aW9uIHNzKGUpe3JldHVybiBlfWZ1bmN0aW9uIGNzKGUsdCl7dmFyIG49dD9BKHQsc3MpOiIiO3JldHVybntwYXRoOmUuc3Vic3RyKDEpLHF1ZXJ5Om4/bi5zdWJzdHIoMSk6bn19ZnVuY3Rpb24gdXMoZSx0LG4scil7aWYodm9pZCAwPT09ciYmKHI9e30pLHQubWV0YS5pc05WdWUpe3ZhciBpPWZ1bmN0aW9uKCl7cmV0dXJuIFVhKG8sZSx0KX0sbz1pcysrLGE9aSgpO2EudW5pUGFnZVVybD1jcyhlLG4pLGEuaXNUYWI9ISF0Lm1ldGEuaXNUYWJCYXI7dmFyIHM9cmcud2Vidmlldy5jcmVhdGUoIiIsU3RyaW5nKG8pLGEsT2JqZWN0LmFzc2lnbih7bnZ1ZTohMH0scikpO3JldHVybiBScyhzLGkpLHN9cmV0dXJuIDI9PT1pcz9yZy53ZWJ2aWV3LmdldExhdW5jaFdlYnZpZXcoKTpHYX1mdW5jdGlvbiBscyhuLGUsdCxyKXtpZigiMSI9PT1uLmlkfHwhZS5tZXRhLmlzTlZ1ZSl7dmFyIGk9ZnVuY3Rpb24oKXtyZXR1cm4gVWEocGFyc2VJbnQobi5pZCksIiIsZSl9LG89aSgpO28udW5pUGFnZVVybD1jcyh0LHIpLGUubWV0YS5pc05WdWU/by5pc1RhYj0hIWUubWV0YS5pc1RhYkJhcjpvLmRlYnVnUmVmcmVzaD0oYT10LGM9ZSx1PShzPXIpP0Eocyxzcyk6IiIse2lzVGFiOmMubWV0YS5pc1RhYkJhcixhcmd1bWVudHM6SlNPTi5zdHJpbmdpZnkoe3BhdGg6YS5zdWJzdHIoMSkscXVlcnk6dT91LnN1YnN0cigxKTp1fSl9KSxScyhuLGkpLG4uc2V0U3R5bGUobyl9dmFyIGEscyxjLHUsbCxkLGYscCxoLHYsZyxtLHksXz1pZy5vbixiPWlnLmVtaXQ7cmV0dXJuIGQ9biwoZj0obD1lKS53aW5kb3cuc3ViTlZ1ZXMpJiZmLmxlbmd0aCYmZi5mb3JFYWNoKGZ1bmN0aW9uKGUpe1dhKGUsbCxkKX0pLE9iamVjdC5rZXlzKG9zKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe24uYWRkRXZlbnRMaXN0ZW5lcih0LGZ1bmN0aW9uKGUpe2Iob3NbdF0sZSxwYXJzZUludChuLmlkKSl9KX0pLChwPW4pLnBvcHVwU3ViTlZ1ZVdlYnZpZXdzJiZwLmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIixmdW5jdGlvbigpe09iamVjdC5rZXlzKHAucG9wdXBTdWJOVnVlV2Vidmlld3MpLmZvckVhY2goZnVuY3Rpb24oZSl7cC5wb3B1cFN1Yk5WdWVXZWJ2aWV3c1tlXS5jbG9zZSgibm9uZSIpfSl9KSxIYShuKSwiaU9TIj09PXJnLm9zLm5hbWUmJighbi5udnVlJiYoaD1uLHY9aWcuc3Vic2NyaWJlLGc9aWcudW5zdWJzY3JpYmUsbT1oLmlkLHk9ZnVuY3Rpb24oZSx0KXtpZihtPT09dCl7ZyhKYSx5KSx0PXBhcnNlSW50KHQpO3ZhciBuPXBnKCEwKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLiRwYWdlLmlkPT09dH0pO2lmKCFuKXJldHVybiBjb25zb2xlLmVycm9yKCJQYWdlWyIrdCsiXSBub3QgZm91bmQiKTtuLiR2bS5fJHZkLnJlc3RvcmUoKX19LGguYWRkRXZlbnRMaXN0ZW5lcigicmVjb3ZlcnkiLGZ1bmN0aW9uKGUpe3YoSmEseSl9KSkscnMobikpLF8obi5pZCsiLnN0YXJ0UHVsbERvd25SZWZyZXNoIixmdW5jdGlvbigpe24uYmVnaW5QdWxsVG9SZWZyZXNoKCl9KSxfKG4uaWQrIi5zdG9wUHVsbERvd25SZWZyZXNoIixmdW5jdGlvbigpe24uZW5kUHVsbFRvUmVmcmVzaCgpfSksbn12YXIgZHM9e307ZnVuY3Rpb24gZnMoZSx0KXsoZHNbZV18fChkc1tlXT1bXSkpLnB1c2godCl9dmFyIHBzPSExO2Z1bmN0aW9uIGhzKHQsZSxuKXtwcz17cGF0aDp0LG52dWU6bGcuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXRoPT09dH0pLm1ldGEuaXNOVnVlLG5hdmlnYXRlOmV9fWZ1bmN0aW9uIHZzKGUsdCxuKXtpZihuJiZ1Zy5zcGxhc2hzY3JlZW4mJnVnLnNwbGFzaHNjcmVlbi5hdXRvY2xvc2UmJiF1Zy5zcGxhc2hzY3JlZW4uYWx3YXlzU2hvd0JlZm9yZVJlbmRlciYmcmcubmF2aWdhdG9yLmNsb3NlU3BsYXNoc2NyZWVuKCksIW4mJnBzKXJldHVybiBjb25zb2xlLmVycm9yKCJXYWl0aW5nIHRvIG5hdmlnYXRlIHRvOiAiK3BzLnBhdGgrIiwgZG8gbm90IG9wZXJhdGUgY29udGludW91c2x5OiAiK2UrIi4iKTtpZigibmF0aXZlIj09PXVnLnJlbmRlcmVyKXJldHVybiAwPT09cGcoKS5sZW5ndGg/aHMoZSx0KTp0KCk7dmFyIHI9IUdhfHxHYSYmR2EuX191bmlhcHBfcm91dGUsaT1HYSYmIUdhLmxvYWRlZDtyfHxpP2hzKGUsdCk6dCgpLGkmJmZzKEdhLmlkLGdzKX1mdW5jdGlvbiBncygpe2lmKHBzKXt2YXIgZT1wcy5uYXZpZ2F0ZTtyZXR1cm4gcHM9ITEsZSgpfX1mdW5jdGlvbiBtcygpe2lmKCJuYXRpdmUiPT09dWcucmVuZGVyZXIpe2lmKCFwcylyZXR1cm47cmV0dXJuIHBzLm52dWU/Z3MoKTp2b2lkIDB9dmFyIGU9KEdhJiYhR2EuX191bmlhcHBfcm91dGV8fChHYT1yZy53ZWJ2aWV3LmNyZWF0ZShvYSxTdHJpbmcoaXMrKykse2NvbnRlbnRBZGp1c3Q6ITF9KSksR2EpO2lmKHBzKXJldHVybiBwcy5udnVlP2dzKCk6dm9pZChlLmxvYWRlZD9wcy5uYXZpZ2F0ZSgpOmZzKGUuaWQsZ3MpKX12YXIgeXM9T2JqZWN0LmNyZWF0ZShudWxsKTt2YXIgX3M9aChmdW5jdGlvbihlKXtyZXR1cm4geXNbZV0oKX0pO3ZhciBicz1bXTtmdW5jdGlvbiB3cyh0LGUpe3ZhciBuPSExLHI9dWcuc3ViUGFja2FnZXM7aWYoQXJyYXkuaXNBcnJheShyKSl7dmFyIGk9ci5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiAwPT09dC5pbmRleE9mKGUucm9vdCl9KTtpJiYobj0hMCxmdW5jdGlvbihlLHQpe2lmKC0xIT09YnMuaW5kZXhPZihlKSlyZXR1cm4gdCgpO1NzKFtlXSxmdW5jdGlvbigpe3QoKX0pfShpLnJvb3QsZSkpfW58fGUoKX12YXIga3M9ImFwcC1zdWItc2VydmljZS5qcyI7ZnVuY3Rpb24gU3MoZSx0KXt2YXIgbixyO249ZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGJzLnB1c2goZSksZSsiLyIra3N9KSxyPWZ1bmN0aW9uKGUpe3QmJnQoITApfSx1Zy5vblNlcnZpY2VSZWFkeShmdW5jdGlvbigpe25nLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5ldmFsSlNGaWxlcyhuLHIpfSl9dmFyIHhzPU9iamVjdC5hc3NpZ247dmFyIENzPXtwYXRoOiIiLHF1ZXJ5Ont9LHNjZW5lOjEwMDEscmVmZXJyZXJJbmZvOnthcHBJZDoiIixleHRyYURhdGE6e319fSxUcz17cGF0aDoiIixxdWVyeTp7fSxzY2VuZToxMDAxLHJlZmVycmVySW5mbzp7YXBwSWQ6IiIsZXh0cmFEYXRhOnt9fX07ZnVuY3Rpb24gT3MoKXtyZXR1cm4gQ3N9ZnVuY3Rpb24gRXMoKXt2YXIgZT1uZy5yZXF1aXJlTW9kdWxlKCJwbHVzIik7aWYoZS5nZXRSZWRpcmVjdEluZm8pe3ZhciB0PWUuZ2V0UmVkaXJlY3RJbmZvKCl8fHt9LG49dC5wYXRoLHI9dC5xdWVyeSxpPXQuZXh0cmFEYXRhLG89dC51c2VyQWN0aW9uLGE9e2FwcElkOnQuZnJvbUFwcGlkLGV4dHJhRGF0YTp7fX07cmV0dXJuIGkmJihhLmV4dHJhRGF0YT1pKSx7cGF0aDpufHwiIixxdWVyeTpyPyI/IityOiIiLHJlZmVycmVySW5mbzphLHVzZXJBY3Rpb246b319fXZhciBBcz0hMTtmdW5jdGlvbiBJcygpe2lmKCFBcyl7dmFyIGUsdDtpZihBcz0hMCxuZy5yZXF1aXJlTW9kdWxlKCJwbHVzIikuZ2V0UmVkaXJlY3RJbmZvKXt2YXIgbj1FcygpLHI9bi5wYXRoLGk9bi5xdWVyeSxvPW4ucmVmZXJyZXJJbmZvO3ImJihlPXIsdD1pKSx1Zy5yZWZlcnJlckluZm89b31lbHNle3ZhciBhPXJnLnJ1bnRpbWUuYXJndW1lbnRzO2lmKCFhKXJldHVybjt0cnl7dmFyIHM9SlNPTi5wYXJzZShhKTtlPXMucGF0aHx8cy5wYXRoTmFtZSx0PXMucXVlcnk/Ij8iK3MucXVlcnk6IiJ9Y2F0Y2goZSl7fX1pZihlJiZlIT09dWcuZW50cnlQYWdlUGF0aCl7dmFyIGM9Ii8iK2UsdT1sZy5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT1jfSk7dT8odS5tZXRhLmlzVGFiQmFyfHwodWcucmVhbEVudHJ5UGFnZVBhdGg9dWcucmVhbEVudHJ5UGFnZVBhdGh8fHVnLmVudHJ5UGFnZVBhdGgpLHVnLmVudHJ5UGFnZVBhdGg9ZSx1Zy5lbnRyeVBhZ2VRdWVyeT10KTpjb25zb2xlLmVycm9yKCJbdW5pLWFwcF0gIitlKyIgbm90IGZvdW5kLi4uIil9ZWxzZSB0JiYodWcuZW50cnlQYWdlUXVlcnk9dCl9fXZhciAkcz1bXTtmdW5jdGlvbiBQcyhlKXtyZXR1cm4gZT8kcy5zbGljZSgwKTokcy5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIWUuJHBhZ2UubWV0YS5pc1RhYkJhcnx8ZS4kcGFnZS5tZXRhLnZpc2libGV9KX12YXIgTXM9e307ZnVuY3Rpb24ganMoZSl7dmFyIHQ9ZS51cmwsbj1lLnBhdGgsaT1lLnF1ZXJ5LHI9ZS5vcGVuVHlwZSxvPWUud2VidmlldyxhPWUuZXZlbnRDaGFubmVsO2lmKG8mJklzKCksTXNbdF0mJihvPU1zW3RdKS5fX3BhZ2VfXyl7aWYoIVBzKCEwKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09by5fX3BhZ2VfX30pKXJldHVybiBhJiYoby5fX3BhZ2VfXy5ldmVudENoYW5uZWw9YSksJHMucHVzaChvLl9fcGFnZV9fKSxvO289bnVsbH12YXIgcz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGxnLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUucGF0aD09PW59KSkpOyJyZUxhdW5jaCI9PT1yfHwhdWcucmVhbEVudHJ5UGFnZVBhdGgmJjA9PT1QcygpLmxlbmd0aD9zLm1ldGEuaXNRdWl0PSEwOnMubWV0YS5pc1RhYkJhcnx8KHMubWV0YS5pc1F1aXQ9ITEpLG8/KG89cmcud2Vidmlldy5nZXRXZWJ2aWV3QnlJZChvLmlkKSkubnZ1ZT1zLm1ldGEuaXNOVnVlOm89dXMobixzLGkpLHMubWV0YS5pc1RhYkJhciYmKHMubWV0YS52aXNpYmxlPSEwKSxzLm1ldGEuaXNUYWJCYXImJnFzLmFwcGVuZChvKTt2YXIgYz0iMSI9PT1vLmlkJiZvLm52dWU7bHMobyxzLG4saSk7dmFyIHU9bi5zbGljZSgxKSxsPXtyb3V0ZTpvLl9fdW5pYXBwX3JvdXRlPXUsb3B0aW9uczpPYmplY3QuYXNzaWduKHt9LGl8fHt9KSwkZ2V0QXBwV2VidmlldzpmdW5jdGlvbigpe3JldHVybiByZy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKG8uaWQpfSxldmVudENoYW5uZWw6YSwkcGFnZTp7aWQ6cGFyc2VJbnQoby5pZCksbWV0YTpzLm1ldGEscGF0aDpuLHJvdXRlOnUsZnVsbFBhdGg6dCxvcGVuVHlwZTpyfSwkcmVtb3ZlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPSRzLmZpbmRJbmRleChmdW5jdGlvbihlKXtyZXR1cm4gZT09PXR9KTstMSE9PWUmJihvLm52dWV8fHRoaXMuJHZtLiRkZXN0cm95KCksJHMuc3BsaWNlKGUsMSkpfSxzZWxlY3RDb21wb25lbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuJHZtLnNlbGVjdENvbXBvbmVudChlKX0sc2VsZWN0QWxsQ29tcG9uZW50czpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy4kdm0uc2VsZWN0QWxsQ29tcG9uZW50cyhlKX19O2lmKCRzLnB1c2gobCksby5fX3ByZWxvYWRfXyYmKG8uX19wYWdlX189bCksYyYmKHVnLnNwbGFzaHNjcmVlbiYmdWcuc3BsYXNoc2NyZWVuLmF1dG9jbG9zZSYmIXVnLnNwbGFzaHNjcmVlbi5hbHdheXNTaG93QmVmb3JlUmVuZGVyJiZyZy5uYXZpZ2F0b3IuY2xvc2VTcGxhc2hzY3JlZW4oKSx1Zy5vblJlYWR5KGZ1bmN0aW9uKCl7bXMoKX0pKSwhby5udnVlKXt2YXIgZD1vLmlkO3RyeXt3cyh1LGZ1bmN0aW9uKCl7dmFyIGUsdCxuLHI7KGU9dSx0PWQsbj1pLHI9bCx5c1tlXXx8Y29uc29sZS5lcnJvcihlKyIgbm90IGZvdW5kIiksbmV3KF9zKGUpKSh7bXBUeXBlOiJwYWdlIixwYWdlSWQ6dCxwYWdlUGF0aDplLHBhZ2VRdWVyeTpuLHBhZ2VJbnN0YW5jZTpyfSkpLiRtb3VudCgpfSl9Y2F0Y2goZSl7Y29uc29sZS5lcnJvcihlKX19cmV0dXJuIG99dmFyIExzPSJhcGkub25UaGVtZUNoYW5nZSI7ZnVuY3Rpb24gTnMoZSl7dm9pZCAwPT09ZSYmKGU9ZnVuY3Rpb24oKXt9KSxpZy5vbihMcyxlKX1mdW5jdGlvbiBCcygpe2lmKHVnLmRhcmttb2RlKXt2YXIgdD0iZGFyayI9PT1yZy5uYXZpZ2F0b3IuZ2V0VUlTdHlsZSgpPyJsaWdodCI6ImRhcmsiO21pKHQpLFBzKCEwKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuJHBhZ2UubWV0YS5zdGF0dXNCYXJTdHlsZT10fSl9fWZ1bmN0aW9uIERzKGUpe2lmKHVnLmRhcmttb2RlKXt2YXIgdD1yZy5uYXZpZ2F0b3IuZ2V0VUlTdHlsZSgpLG49WHMoKTtyZXR1cm4gbiYmbi5ob3N0VGhlbWUmJih0PW4uaG9zdFRoZW1lKSxMKGUsdWcudGhlbWVDb25maWcsdCl9cmV0dXJuIGV9ZnVuY3Rpb24gUnMocixpKXtpZih1Zy5kYXJrbW9kZSl7dmFyIHQ9ZnVuY3Rpb24oKXt2YXIgZT1pKCksdD17YW5pbWF0aW9uQWxwaGFCR0NvbG9yOmUuYW5pbWF0aW9uQWxwaGFCR0NvbG9yLGJhY2tncm91bmQ6ZS5iYWNrZ3JvdW5kLGJhY2tncm91bmRDb2xvckJvdHRvbTplLmJhY2tncm91bmRDb2xvckJvdHRvbSxiYWNrZ3JvdW5kQ29sb3JUb3A6ZS5iYWNrZ3JvdW5kQ29sb3JUb3B9LG49ZS50aXRsZU5WaWV3O3ZvaWQgMCE9PW4mJih0LnRpdGxlTlZpZXc9Im9iamVjdCI9PXR5cGVvZiBuP3tiYWNrZ3JvdW5kQ29sb3I6bi5iYWNrZ3JvdW5kQ29sb3IsdGl0bGVDb2xvcjpuLnRpdGxlQ29sb3J9Om4pLHImJnIuc2V0U3R5bGUoZSl9O05zKHQpLHIuYWRkRXZlbnRMaXN0ZW5lcigiY2xvc2UiLGZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PShlPXQpJiYoZT1mdW5jdGlvbigpe30pLHZvaWQgaWcub2ZmKExzLGUpO3ZhciBlfSl9fXZhciBGcyx6cyxVcz0hMDt2YXIgVnM9W10scXM9e2lkOiIwIixpbml0OmZ1bmN0aW9uKGUsbil7ZSYmZS5saXN0Lmxlbmd0aCYmKEZzPWUpO3RyeXt6cz1waSgidW5pLXRhYnZpZXciKX1jYXRjaChlKXtjb25zb2xlLmxvZygndW5pLnJlcXVpcmVOYXRpdmVQbHVnaW4oInVuaS10YWJ2aWV3IikgZXJyb3IgJytlKX16cy5vbk1hc2tDbGljayhmdW5jdGlvbigpe1ZzLmZvckVhY2goZnVuY3Rpb24oZSl7ZSgpfSl9KSx6cyYmenMub25DbGljayhmdW5jdGlvbihlKXt2YXIgdD1lLmluZGV4O24oRnMubGlzdFt0XSx0KX0pLHpzJiZ6cy5vbk1pZEJ1dHRvbkNsaWNrKGZ1bmN0aW9uKCl7aGkoIm9uVGFiQmFyTWlkQnV0dG9uVGFwIix7fSl9KSxmdW5jdGlvbihyLGkpe2lmKHVnLmRhcmttb2RlKXt2YXIgZT1mdW5jdGlvbigpe3ZhciBlPURzKGkpLHQ9ZS5saXN0O3ZvaWQgMD09PXQmJih0PVtdKTt2YXIgbj17Y29sb3I6ZS5jb2xvcixzZWxlY3RlZENvbG9yOmUuc2VsZWN0ZWRDb2xvcixiYWNrZ3JvdW5kQ29sb3I6ZS5iYWNrZ3JvdW5kQ29sb3IsYm9yZGVyU3R5bGU6ZS5ib3JkZXJTdHlsZX07ciYmci5zZXRUYWJCYXJTdHlsZShuKSxyJiZyLnNldFRhYkJhckl0ZW1zKHtsaXN0OnQubWFwKGZ1bmN0aW9uKGUpe3JldHVybntpY29uUGF0aDplLmljb25QYXRoLHNlbGVjdGVkSWNvblBhdGg6ZS5zZWxlY3RlZEljb25QYXRoLHZpc2libGU6ZS52aXNpYmxlfX0pfSl9O2UoKSxOcyhlKX19KHpzLGUpfSxpbmRleE9mOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuY29uZmlnLG49dCYmdC5saXN0JiZ0Lmxpc3QubGVuZ3RoO2lmKG4pZm9yKHZhciByPTA7cjxuO3IrKylpZih0Lmxpc3Rbcl0ucGFnZVBhdGg9PT1lfHx0Lmxpc3Rbcl0ucGFnZVBhdGg9PT1lKyIuaHRtbCIpcmV0dXJuIHI7cmV0dXJuLTF9LHN3aXRjaFRhYjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmluZGV4T2YoZSk7cmV0dXJuIDA8PXQmJih6cyYmenMuc3dpdGNoU2VsZWN0KHtpbmRleDp0fSksITApfSxzZXRUYWJCYXJCYWRnZTpmdW5jdGlvbihlLHQsbil7enMmJigibm9uZSI9PT1lPyh6cy5oaWRlVGFiQmFyUmVkRG90KHtpbmRleDp0fSksenMucmVtb3ZlVGFiQmFyQmFkZ2Uoe2luZGV4OnR9KSk6InRleHQiPT09ZT96cy5zZXRUYWJCYXJCYWRnZSh7aW5kZXg6dCx0ZXh0Om59KToicmVkRG90Ij09PWUmJnpzLnNob3dUYWJCYXJSZWREb3Qoe2luZGV4OnR9KSl9LHNldFRhYkJhckl0ZW06ZnVuY3Rpb24oZSx0LG4scixpLG8pe3ZhciBhLHM9e2luZGV4OmV9O2lmKHZvaWQgMCE9PXQmJihzLnRleHQ9dCksbiYmKHMuaWNvblBhdGg9VGkobikpLHImJihzLnNlbGVjdGVkSWNvblBhdGg9VGkocikpLHZvaWQgMCE9PW8mJihzLmljb25mb250PW8pLHZvaWQgMCE9PWkpe3MudmlzaWJsZT1Gcy5saXN0W2VdLnZpc2libGU9aSxkZWxldGUgcy5pbmRleDt2YXIgYz1Gcy5saXN0Lm1hcChmdW5jdGlvbihlKXtyZXR1cm57dmlzaWJsZTplLnZpc2libGV9fSk7Y1tlXT1zLGE9e2xpc3Q6Y30senMmJnpzLnNldFRhYkJhckl0ZW1zKGEpfWVsc2UgenMmJnpzLnNldFRhYkJhckl0ZW0ocyl9LHNldFRhYkJhclN0eWxlOmZ1bmN0aW9uKGUpe3pzJiZ6cy5zZXRUYWJCYXJTdHlsZShlKX0saGlkZVRhYkJhcjpmdW5jdGlvbihlKXtVcz0hMSx6cyYmenMuaGlkZVRhYkJhcih7YW5pbWF0aW9uOmV9KX0sc2hvd1RhYkJhcjpmdW5jdGlvbihlKXtVcz0hMCx6cyYmenMuc2hvd1RhYkJhcih7YW5pbWF0aW9uOmV9KX0sYXBwZW5kOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXM7enMmJnpzLmFwcGVuZCh7aWQ6dC5pZH0sZnVuY3Rpb24oZSl7MCE9PWUuY29kZSYmb2coZnVuY3Rpb24oKXtuLmFwcGVuZCh0KX0sMjApfSl9LGdldCBjb25maWcoKXtyZXR1cm4gRnN8fHVnLnRhYkJhcn0sZ2V0IHZpc2libGUoKXtyZXR1cm4gVXN9LGdldCBoZWlnaHQoKXt2YXIgZT10aGlzLmNvbmZpZztyZXR1cm4oZSYmZS5oZWlnaHQ/cGFyc2VGbG9hdChlLmhlaWdodCk6NTApK3JnLm5hdmlnYXRvci5nZXRTYWZlQXJlYUluc2V0cygpLmRldmljZUJvdHRvbX0sZ2V0IGNvdmVyKCl7dmFyIGU9dGhpcy5jb25maWc7cmV0dXJuIGUmJjA8PVsiZXh0cmFsaWdodCIsImxpZ2h0IiwiZGFyayJdLmluZGV4T2YoZS5ibHVyRWZmZWN0KX0sc2V0U3R5bGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tYXNrO3pzLnNldE1hc2soe2NvbG9yOnR9KX0sYWRkRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihlLHQpe1ZzLnB1c2godCl9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj1Wcy5pbmRleE9mKHQpO1ZzLnNwbGljZShuLDEpfX07ZnVuY3Rpb24gV3MoKXt2YXIgZSx0LG4scixpPSJpb3MiPT09cmcub3MubmFtZS50b0xvd2VyQ2FzZSgpLG89KGU9cmcuc2NyZWVuLmdldEN1cnJlbnRTaXplKCksdD1lLnJlc29sdXRpb25XaWR0aCxuPWUucmVzb2x1dGlvbkhlaWdodCx7c2NyZWVuV2lkdGg6TWF0aC5yb3VuZCh0KSxzY3JlZW5IZWlnaHQ6TWF0aC5yb3VuZChuKX0pLGE9by5zY3JlZW5XaWR0aCxzPW8uc2NyZWVuSGVpZ2h0LGM9cWEoKSx1PXtoZWlnaHQ6MCxjb3ZlcjohMX0sbD1TaSgpO2lmKGwpe3ZhciBkPWwuZ2V0U3R5bGUoKTsoZD1kJiZkLnRpdGxlTlZpZXcpJiZkLnR5cGUmJiJub25lIiE9PWQudHlwZSYmKHUuaGVpZ2h0PSJ0cmFuc3BhcmVudCI9PT1kLnR5cGU/MDpjK3R0LHUuY292ZXI9InRyYW5zcGFyZW50Ij09PWQudHlwZXx8ImZsb2F0Ij09PWQudHlwZSkscj1sLmdldFNhZmVBcmVhSW5zZXRzKCl9ZWxzZSByPXJnLm5hdmlnYXRvci5nZXRTYWZlQXJlYUluc2V0cygpO3ZhciBmPXtoZWlnaHQ6MCxjb3ZlcjohMX07eWkoKSYmKGYuaGVpZ2h0PXFzLnZpc2libGU/cXMuaGVpZ2h0OjAsZi5jb3Zlcj1xcy5jb3Zlcik7dmFyIHA9dS5jb3Zlcj91LmhlaWdodDowLGg9Zi5jb3Zlcj9mLmhlaWdodDowLHY9cy11LmhlaWdodC1mLmhlaWdodCxnPXMtKHUuY292ZXI/MDp1LmhlaWdodCktKGYuY292ZXI/MDpmLmhlaWdodCksbT1hO2YuaGVpZ2h0JiYhZi5jb3Zlcnx8ci5ib3R0b218fCFyLmRldmljZUJvdHRvbXx8KHYtPXIuZGV2aWNlQm90dG9tLGctPXIuZGV2aWNlQm90dG9tKTt2YXIgeT17bGVmdDoocj1pP3I6e2xlZnQ6MCxyaWdodDowLHRvcDp1LmhlaWdodCYmIXUuY292ZXI/MDpjLGJvdHRvbTowfSkubGVmdCxyaWdodDptLXIucmlnaHQsdG9wOnIudG9wLGJvdHRvbTpnLXIuYm90dG9tLHdpZHRoOm0tci5sZWZ0LXIucmlnaHQsaGVpZ2h0Omctci50b3Atci5ib3R0b219O3JldHVybntwaXhlbFJhdGlvOnJnLnNjcmVlbi5zY2FsZSxzY3JlZW5XaWR0aDphLHNjcmVlbkhlaWdodDpzLHdpbmRvd1dpZHRoOm0sd2luZG93SGVpZ2h0OnYsc3RhdHVzQmFySGVpZ2h0OmMsc2FmZUFyZWE6eSxzYWZlQXJlYUluc2V0czp7dG9wOnIudG9wLHJpZ2h0OnIucmlnaHQsYm90dG9tOnIuYm90dG9tLGxlZnQ6ci5sZWZ0fSx3aW5kb3dUb3A6cCx3aW5kb3dCb3R0b206aCxzY3JlZW5Ub3A6cy12fX12YXIgSHM9e30sR3M9ITA7ZnVuY3Rpb24gWHMoKXtpZihHcyl7dmFyIGU9bmcucmVxdWlyZU1vZHVsZSgicGx1cyIpLmdldFN5c3RlbUluZm9TeW5jO2lmKCJzdHJpbmciPT10eXBlb2YoSHM9ZSgpKSl0cnl7SHM9SlNPTi5wYXJzZShIcyl9Y2F0Y2goZSl7fXJldHVybiBIc319ZnVuY3Rpb24gWXMoKXtYcygpO3ZhciBlPUhzLmRldmljZUJyYW5kO3ZvaWQgMD09PWUmJihlPSIiKTt2YXIgdD1Icy5kZXZpY2VNb2RlbCxuPUhzLm9zTmFtZSxyPUhzLm9zVmVyc2lvbixpPUhzLmRldmljZU9yaWVudGF0aW9uLG89SHMuZGV2aWNlVHlwZSxhPUhzLmRldmljZUlkLHM9ZS50b0xvd2VyQ2FzZSgpLGM9bi50b0xvd2VyQ2FzZSgpO3JldHVybnticmFuZDpzLGRldmljZUJyYW5kOnMsZGV2aWNlTW9kZWw6dCxkZXZpY2VQaXhlbFJhdGlvOnJnLnNjcmVlbi5zY2FsZSxkZXZpY2VJZDphLGRldmljZU9yaWVudGF0aW9uOmksZGV2aWNlVHlwZTpvLG1vZGVsOnQscGxhdGZvcm06YyxzeXN0ZW06KCJpb3MiPT09Yz8iaU9TIjoiQW5kcm9pZCIpKyIgIityfX1mdW5jdGlvbiBKcygpe1hzKCk7dmFyIGU9SHMuaG9zdFBhY2thZ2VOYW1lLHQ9SHMuaG9zdE5hbWUsbj1Icy5vc0xhbmd1YWdlLHI9SHMuaG9zdFZlcnNpb24saT1Icy5ob3N0TGFuZ3VhZ2Usbz1Icy5ob3N0VGhlbWU7cmV0dXJue2FwcElkOkhzLmFwcElkLGFwcE5hbWU6SHMuYXBwTmFtZSxhcHBWZXJzaW9uOkhzLmFwcFZlcnNpb24sYXBwVmVyc2lvbkNvZGU6SHMuYXBwVmVyc2lvbkNvZGUsYXBwV2d0VmVyc2lvbjpIcy5hcHBXZ3RWZXJzaW9uLGFwcExhbmd1YWdlOmRnJiZkZy5nZXRMb2NhbGU/ZGcuZ2V0TG9jYWxlKCk6aSxlbmFibGVEZWJ1ZzohMSxob3N0U0RLVmVyc2lvbjp2b2lkIDAsaG9zdFBhY2thZ2VOYW1lOmUsaG9zdE5hbWU6dCxob3N0VmVyc2lvbjpyLGhvc3RMYW5ndWFnZTppLGhvc3RUaGVtZTpvLGhvc3RGb250U2l6ZVNldHRpbmc6dm9pZCAwLGxhbmd1YWdlOm4sU0RLVmVyc2lvbjoiIix0aGVtZTpyZy5uYXZpZ2F0b3IuZ2V0VUlTdHlsZSgpLHZlcnNpb246cmcucnVudGltZS5pbm5lclZlcnNpb259fWZ1bmN0aW9uIEtzKCl7R3M9ITAsWHMoKSxHcz0hMTt2YXIgZT1XcygpLHQ9WXMoKSxuPUpzKCk7R3M9ITA7dmFyIHI9e2Vyck1zZzoiZ2V0U3lzdGVtSW5mbzpvayIsZm9udFNpemVTZXR0aW5nOm4uaG9zdEZvbnRTaXplU2V0dGluZyxvc05hbWU6SHMub3NOYW1lLnRvTG93ZXJDYXNlKCl9O0hzLmhvc3ROYW1lJiYoci5ob3N0U0RLVmVyc2lvbj1Icy51bmlSdW50aW1lVmVyc2lvbik7dmFyIGksbyxhPU9iamVjdC5hc3NpZ24oe30sSHMsZSx0LG4scik7cmV0dXJuIGRlbGV0ZSBhLnNjcmVlblRvcCxkZWxldGUgYS5lbmFibGVEZWJ1Zyx1Zy5kYXJrbW9kZXx8ZGVsZXRlIGEudGhlbWUsbz17fSxUKGk9YSkmJk9iamVjdC5rZXlzKGkpLnNvcnQoKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe29bZV09aVtlXX0pLE9iamVjdC5rZXlzKG8pP286aX1mdW5jdGlvbiBacygpe3ZhciBlPSgwLG5nLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRBcHBBdXRob3JpemVTZXR0aW5nKSgpO3RyeXsic3RyaW5nIj09dHlwZW9mIGUmJihlPUpTT04ucGFyc2UoZSkpfWNhdGNoKGUpe31mb3IodmFyIHQgaW4gZSl7aWYoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSx0KSkidW5kZWZpbmVkIj09PWVbdF0mJihlW3RdPXZvaWQgMCl9cmV0dXJuIGV9dmFyIFFzPSJ1bmlhcHBfc2F2ZSIsZWM9Il9kb2MvIitRcztmdW5jdGlvbiB0Yyh0LG4pe249bnx8ZnVuY3Rpb24oKXt9LHJnLmlvLnJlcXVlc3RGaWxlU3lzdGVtKHJnLmlvLlBSSVZBVEVfRE9DLGZ1bmN0aW9uKGUpe2Uucm9vdC5nZXREaXJlY3RvcnkoUXMse2NyZWF0ZTohMH0sdCxuKX0sbil9dmFyIG5jPTA7dmFyIHJjPU5pKCJpbyIsImdldEZpbGVJbmZvIik7dmFyIGljPSJjaG9vc2VMb2NhdGlvbiI7dmFyIG9jPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNob29zZUxvY2F0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIG49cmcubmF2aWdhdG9yLmdldFN0YXR1c0JhclN0eWxlKCkscj1yZy53ZWJ2aWV3LmNyZWF0ZSgiX3d3dy9fX3VuaWFwcGNob29zZWxvY2F0aW9uLmh0bWwiLGdvLHt0aXRsZU5WaWV3OnthdXRvQmFja0J1dHRvbjohMCxiYWNrZ3JvdW5kQ29sb3I6IiMwMDAwMDAiLHRpdGxlQ29sb3I6IiNmZmZmZmYiLHRpdGxlVGV4dDoi6YCJ5oup5L2N572uIix0aXRsZVNpemU6IjE3cHgiLGJ1dHRvbnM6W3tmbG9hdDoicmlnaHQiLHRleHQ6IuWujOaIkCIsZm9udFNpemU6IjE3cHgiLHdpZHRoOiI2MHB4IixvbmNsaWNrOmZ1bmN0aW9uKCl7ci5ldmFsSlMoIl9fY2hvb3NlTG9jYXRpb25Db25maXJtX18oKSIpfX1dfSxwb3BHZXN0dXJlOiJjbG9zZSIsc2Nyb2xsSW5kaWNhdG9yOiJub25lIn0se19fdW5pYXBwX3R5cGU6Im1hcCIsX191bmlhcHBfc3RhdHVzYmFyX3N0eWxlOm4sInVuaS1hcHAiOiJub25lIn0pOyJkYXJrIj09PW4mJihyZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0Iiksci5hZGRFdmVudExpc3RlbmVyKCJwb3BHZXN0dXJlIixmdW5jdGlvbihlKXt2YXIgdD1lLnR5cGUsbj1lLnJlc3VsdDsic3RhcnQiPT09dD9yZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKToiZW5kIiE9PXR8fG58fHJnLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgibGlnaHQiKX0pKTt2YXIgaSxvPTAsYT1mdW5jdGlvbigpezI9PSsrbyYmci5ldmFsSlMoIl9fY2hvb3NlTG9jYXRpb25fXygiK0pTT04uc3RyaW5naWZ5KGUpKyIpIil9O3IuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkIixhKSxyLnNob3coInNsaWRlLWluLWJvdHRvbSIsbmEsYSksci5hZGRFdmVudExpc3RlbmVyKCJjbG9zZSIsZnVuY3Rpb24oKXtpP2ZpKHQse25hbWU6aS5wb2luYW1lLGFkZHJlc3M6aS5wb2lhZGRyZXNzLGxhdGl0dWRlOmkubGF0bG5nLmxhdCxsb25naXR1ZGU6aS5sYXRsbmcubG5nLGVyck1zZzoiY2hvb3NlTG9jYXRpb246b2sifSk6KHZhKGljKSxmaSh0LHtlcnJNc2c6ImNob29zZUxvY2F0aW9uOmZhaWwgY2FuY2VsIn0pKX0pLGdhKGljLGZ1bmN0aW9uKGUpe2UmJiJsYXRsbmciaW4gZSYmKGk9ZSl9LCExKX19KTt2YXIgYWM9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY2hvb3NlTG9jYXRpb246ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9ImxpZ2h0IiE9PSgiVUlTdGF0dXNCYXJTdHlsZUJsYWNrVHJhbnNsdWNlbnQiPT09KG49cmcubmF2aWdhdG9yLmdldFN0YXR1c0JhclN0eWxlKCkpfHwiVUlTdGF0dXNCYXJTdHlsZUJsYWNrT3BhcXVlIj09PW58fCJudWxsIj09PW4/bj0ibGlnaHQiOiJVSVN0YXR1c0JhclN0eWxlRGVmYXVsdCI9PT1uJiYobj0iZGFyayIpLG4pLG89JGEoe3VybDoiX191bmlhcHBjaG9vc2Vsb2NhdGlvbiIsZGF0YTpPYmplY3QuYXNzaWduKHt9LGUse2xvY2FsZTpzdCgpfSksc3R5bGU6e2FuaW1hdGlvblR5cGU6ZS5hbmltYXRpb25UeXBlfHwic2xpZGUtaW4tYm90dG9tIix0aXRsZU5WaWV3OiExLHBvcEdlc3R1cmU6ImNsb3NlIixzY3JvbGxJbmRpY2F0b3I6Im5vbmUifSxvbk1lc3NhZ2U6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ldmVudCxuPWUuZGV0YWlsOyJzZWxlY3RlZCI9PT10JiYoKHI9bikuZXJyTXNnPSJjaG9vc2VMb2NhdGlvbjpvayIpfSxvbkNsb3NlOmZ1bmN0aW9uKCl7aSYmcmcubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJkYXJrIiksZmkodCxyfHx7ZXJyTXNnOiJjaG9vc2VMb2NhdGlvbjpmYWlsIGNhbmNlbCJ9KX19KTtpJiYocmcubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJsaWdodCIpLG8ud2Vidmlldy5hZGRFdmVudExpc3RlbmVyKCJwb3BHZXN0dXJlIixmdW5jdGlvbihlKXt2YXIgdD1lLnR5cGUsbj1lLnJlc3VsdDsic3RhcnQiPT09dD9yZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKToiZW5kIiE9PXR8fG58fHJnLm5hdmlnYXRvci5zZXRTdGF0dXNCYXJTdHlsZSgibGlnaHQiKX0pKX19KTtmdW5jdGlvbiBzYyhlLHQsbil7dmFyIHIsaT10LmNvb3JkcztlIT09dC5jb29yZHNUeXBlJiYoIndnczg0Ij09PWU/cj1mdW5jdGlvbihlLHQpe2lmKFBpKGU9K2UsdD0rdCkpcmV0dXJuW2UsdF07dmFyIG49SWkoZS0xMDUsdC0zNSkscj0kaShlLTEwNSx0LTM1KSxpPXQvMTgwKk9pLG89TWF0aC5zaW4oaSk7bz0xLUFpKm8qbzt2YXIgYT1NYXRoLnNxcnQobyk7cmV0dXJuIG49MTgwKm4vKEVpKigxLUFpKS8obyphKSpPaSksWzIqZS0oZSsocj0xODAqci8oRWkvYSpNYXRoLmNvcyhpKSpPaSkpKSwyKnQtKHQrbildfShpLmxvbmdpdHVkZSxpLmxhdGl0dWRlKToiZ2NqMDIiPT09ZSYmKHI9ZnVuY3Rpb24oZSx0KXtpZihQaShlPStlLHQ9K3QpKXJldHVybltlLHRdO3ZhciBuPUlpKGUtMTA1LHQtMzUpLHI9JGkoZS0xMDUsdC0zNSksaT10LzE4MCpPaSxvPU1hdGguc2luKGkpO289MS1BaSpvKm87dmFyIGE9TWF0aC5zcXJ0KG8pO3JldHVybiBuPTE4MCpuLyhFaSooMS1BaSkvKG8qYSkqT2kpLFtlKyhyPTE4MCpyLyhFaS9hKk1hdGguY29zKGkpKk9pKSksdCtuXX0oaS5sb25naXR1ZGUsaS5sYXRpdHVkZSkpLHImJihpLmxvbmdpdHVkZT1yWzBdLGkubGF0aXR1ZGU9clsxXSkpO2ZpKG4se3R5cGU6ZSxhbHRpdHVkZTppLmFsdGl0dWRlfHwwLGxhdGl0dWRlOmkubGF0aXR1ZGUsbG9uZ2l0dWRlOmkubG9uZ2l0dWRlLHNwZWVkOmkuc3BlZWQsYWNjdXJhY3k6aS5hY2N1cmFjeSxhZGRyZXNzOnQuYWRkcmVzcyxlcnJNc2c6ImdldExvY2F0aW9uOm9rIn0pfXZhciBjYz1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvcGVuTG9jYXRpb246ZnVuY3Rpb24oZSl7dmFyIHQ9cmcubmF2aWdhdG9yLmdldFN0YXR1c0JhclN0eWxlKCksbj1yZy53ZWJ2aWV3LmNyZWF0ZSgiX3d3dy9fX3VuaWFwcG9wZW5sb2NhdGlvbi5odG1sIixnbyx7dGl0bGVOVmlldzp7YXV0b0JhY2tCdXR0b246ITAsdGl0bGVDb2xvcjoiI2ZmZmZmZiIsdGl0bGVUZXh0OiIiLHRpdGxlU2l6ZToiMTdweCIsdHlwZToidHJhbnNwYXJlbnQifSxwb3BHZXN0dXJlOiJjbG9zZSIsc2Nyb2xsSW5kaWNhdG9yOiJub25lIn0se19fdW5pYXBwX3R5cGU6Im1hcCIsX191bmlhcHBfc3RhdHVzYmFyX3N0eWxlOnQsInVuaS1hcHAiOiJub25lIn0pO3JldHVybiJsaWdodCI9PT10JiYocmcubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKCJkYXJrIiksbi5hZGRFdmVudExpc3RlbmVyKCJwb3BHZXN0dXJlIixmdW5jdGlvbihlKXt2YXIgdD1lLnR5cGUsbj1lLnJlc3VsdDsic3RhcnQiPT09dD9yZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImxpZ2h0Iik6ImVuZCIhPT10fHxufHxyZy5uYXZpZ2F0b3Iuc2V0U3RhdHVzQmFyU3R5bGUoImRhcmsiKX0pKSxuLnNob3codGEsbmEsZnVuY3Rpb24oKXtuLmV2YWxKUygiX19vcGVuTG9jYXRpb25fXygiK0pTT04uc3RyaW5naWZ5KGUpKyIpIil9KSx7ZXJyTXNnOiJvcGVuTG9jYXRpb246b2sifX19KTt2YXIgdWM9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsb3BlbkxvY2F0aW9uOmZ1bmN0aW9uKGUsdCl7cmV0dXJuICRhKHt1cmw6Il9fdW5pYXBwb3BlbmxvY2F0aW9uIixkYXRhOk9iamVjdC5hc3NpZ24oe30sZSx7bG9jYWxlOnN0KCl9KSxzdHlsZTp7dGl0bGVOVmlldzp7dHlwZToidHJhbnNwYXJlbnQifSxwb3BHZXN0dXJlOiJjbG9zZSIsYmFja0J1dHRvbkF1dG9Db250cm9sOiJjbG9zZSJ9LG9uQ2xvc2U6ZnVuY3Rpb24oKXtmaSh0LHtlcnJNc2c6Im9wZW5Mb2NhdGlvbjpmYWlsIGNhbmNlbCJ9KX19KSx7ZXJyTXNnOiJvcGVuTG9jYXRpb246b2sifX19KTt2YXIgbGM9W10sZGM9W10sZmM9ITEscGM9MDt2YXIgaGMsdmMsZ2MsbWMseWM7dmFyIF9jLGJjLHdjPU5pKCJpbyIsImdldEltYWdlSW5mbyIsZnVuY3Rpb24oZSl7cmV0dXJuIGUuc2F2ZVBhdGg9ZS5maWxlbmFtZT15bysiL2Rvd25sb2FkLyIsZX0pLGtjPU5pKCJpbyIsImdldFZpZGVvSW5mbyIsZnVuY3Rpb24oZSl7cmV0dXJuIGUuZmlsZVBhdGg9ZS5zcmMsZX0sZnVuY3Rpb24oZSl7cmV0dXJue29yaWVudGF0aW9uOmUub3JpZW50YXRpb24sdHlwZTplLnR5cGUsZHVyYXRpb246ZS5kdXJhdGlvbixzaXplOmUuc2l6ZS8xMDI0LGhlaWdodDplLmhlaWdodCx3aWR0aDplLndpZHRoLGZwczplLmZwc3x8MzAsYml0cmF0ZTplLmJpdHJhdGV9fSk7dmFyIFNjPWZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09dCYmKHQ9e30pLGhpKCJvblJlY29yZGVyU3RhdGVDaGFuZ2UiLE9iamVjdC5hc3NpZ24oe3N0YXRlOmV9LHQpKX0seGM9e3N0YXJ0OmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5kdXJhdGlvbjt2b2lkIDA9PT1uJiYobj02ZTQpO3ZhciByPWUuc2FtcGxlUmF0ZSxpPShlLm51bWJlck9mQ2hhbm5lbHMsZS5lbmNvZGVCaXRSYXRlLGUuZm9ybWF0KTt2b2lkIDA9PT1pJiYoaT0ibXAzIik7ZS5mcmFtZVNpemU7dmFyIG89ZS5hdWRpb1NvdXJjZTtpZih2b2lkIDA9PT1vJiYobz0iYXV0byIpLF9jKXJldHVybiBTYygic3RhcnQiKTsoX2M9cmcuYXVkaW8uZ2V0UmVjb3JkZXIoKSkucmVjb3JkKHtmb3JtYXQ6aSxzYW1wbGVyYXRlOnIsZmlsZW5hbWU6eW8rIi9yZWNvcmRlci8ifSxmdW5jdGlvbihlKXtyZXR1cm4gU2MoInN0b3AiLHt0ZW1wRmlsZVBhdGg6ZX0pfSxmdW5jdGlvbihlKXtyZXR1cm4gU2MoImVycm9yIix7ZXJyTXNnOmUubWVzc2FnZX0pfSksYmM9b2coZnVuY3Rpb24oKXt4Yy5zdG9wKCl9LG4pLFNjKCJzdGFydCIpfSxzdG9wOmZ1bmN0aW9uKCl7X2MmJihfYy5zdG9wKCksX2M9ITEsYmMmJmFnKGJjKSl9LHBhdXNlOmZ1bmN0aW9uKCl7X2MmJlNjKCJlcnJvciIse2Vyck1zZzoiVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiBwYXVzZSJ9KX0scmVzdW1lOmZ1bmN0aW9uKCl7X2MmJlNjKCJlcnJvciIse2Vyck1zZzoiVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiByZXN1bWUifSl9fTt2YXIgQ2M9MCxUYz17fSxPYz1mdW5jdGlvbihlKXtoaSgib25Eb3dubG9hZFRhc2tTdGF0ZUNoYW5nZSIsZSl9O3ZhciBFYz0wLEFjPXt9LEljPWZ1bmN0aW9uKGUpe2hpKCJvblJlcXVlc3RUYXNrU3RhdGVDaGFuZ2UiLGUpLGRlbGV0ZSBBY1tFY119LCRjPWZ1bmN0aW9uKGUpe3ZhciB0PWVbIlNldC1Db29raWUiXXx8ZVsic2V0LWNvb2tpZSJdLG49W107aWYoIXQpcmV0dXJuW107IlsiPT09dFswXSYmIl0iPT09dFt0Lmxlbmd0aC0xXSYmKHQ9dC5zbGljZSgxLC0xKSk7Zm9yKHZhciByPXQuc3BsaXQoIjsiKSxpPTA7aTxyLmxlbmd0aDtpKyspLTEhPT1yW2ldLmluZGV4T2YoIkV4cGlyZXM9Iil8fC0xIT09cltpXS5pbmRleE9mKCJleHBpcmVzPSIpP24ucHVzaChyW2ldLnJlcGxhY2UoIiwiLCIiKSk6bi5wdXNoKHJbaV0pO3JldHVybiBuPW4uam9pbigiOyIpLnNwbGl0KCIsIil9O2Z1bmN0aW9uIFBjKGMsZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUudXJsLG49ZS5kYXRhLHI9ZS5oZWFkZXIsaT1lLm1ldGhvZDt2b2lkIDA9PT1pJiYoaT0iR0VUIik7dmFyIHU9ZS5yZXNwb25zZVR5cGUsbz1lLnNzbFZlcmlmeTt2b2lkIDA9PT1vJiYobz0hMCk7dmFyIGE9ZS5maXJzdElwdjQ7dm9pZCAwPT09YSYmKGE9ITEpO3ZhciBzPWUudGxzLGw9ZS50aW1lb3V0O3ZvaWQgMD09PWwmJihsPXVnLm5ldHdvcmtUaW1lb3V0JiZ1Zy5uZXR3b3JrVGltZW91dC5yZXF1ZXN0fHw2ZTQpO3ZhciBkLGYscD1waSgic3RyZWFtIiksaD17fSx2PSExO2Zvcih2YXIgZyBpbiByKWlmKHZ8fCJjb250ZW50LXR5cGUiIT09Zy50b0xvd2VyQ2FzZSgpKWhbZ109cltnXTtlbHNlIGlmKHY9ITAsaFsiQ29udGVudC1UeXBlIl09cltnXSwiR0VUIiE9PWkmJjA9PT1yW2ddLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiYic3RyaW5nIiE9dHlwZW9mIG4mJiEobiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSl7dmFyIG09W107Zm9yKHZhciB5IGluIG4payhuLHkpJiZtLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHkpKyI9IitlbmNvZGVVUklDb21wb25lbnQoblt5XSkpO249bS5qb2luKCImIil9dnx8IlBPU1QiIT09aXx8KGhbIkNvbnRlbnQtVHlwZSJdPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiKSxsJiYoZD1vZyhmdW5jdGlvbigpe2Y9ITAsSWMoe3JlcXVlc3RUYXNrSWQ6YyxzdGF0ZToiZmFpbCIsc3RhdHVzQ29kZTowLGVyck1zZzoidGltZW91dCJ9KX0sbCsyMDApKTt2YXIgXyxiPXttZXRob2Q6aSx1cmw6dC50cmltKCksaGVhZGVyczpoLHR5cGU6ImFycmF5YnVmZmVyIj09PXU/ImJhc2U2NCI6InRleHQiLHRpbWVvdXQ6bHx8NmU1LHNzbFZlcmlmeTohbyxmaXJzdElwdjQ6YSx0bHM6c307IkdFVCIhPT1pJiYoIltvYmplY3QgQXJyYXlCdWZmZXJdIj09PXRvU3RyaW5nLmNhbGwobik/Xz0hMDpiLmJvZHk9InN0cmluZyI9PXR5cGVvZiBuP246SlNPTi5zdHJpbmdpZnkobikpO3ZhciB3PWZ1bmN0aW9uKGUpe3ZhciB0PWUub2ssbj1lLnN0YXR1cyxyPWUuZGF0YSxpPWUuaGVhZGVycyxvPWUuZXJyb3JNc2c7aWYoIWYpe2QmJmFnKGQpO3ZhciBhPW47aWYoMDxhKUljKHtyZXF1ZXN0VGFza0lkOmMsc3RhdGU6InN1Y2Nlc3MiLGRhdGE6dCYmImFycmF5YnVmZmVyIj09PXU/X2kocik6cixzdGF0dXNDb2RlOmEsaGVhZGVyOmksY29va2llczokYyhpKX0pO2Vsc2V7dmFyIHM9ImFib3J0IHN0YXR1c0NvZGU6IithO28mJihzPXMrIiAiK28pLEljKHtyZXF1ZXN0VGFza0lkOmMsc3RhdGU6ImZhaWwiLHN0YXR1c0NvZGU6YSxlcnJNc2c6c30pfX19O3RyeXtfP3AuZmV0Y2hXaXRoQXJyYXlCdWZmZXIoeyJAdHlwZSI6ImJpbmFyeSIsYmFzZTY0OmJpKG4pfSxiLHcpOnAuZmV0Y2goYix3KSxBY1tjXT17YWJvcnQ6ZnVuY3Rpb24oKXtmPSEwLGQmJmFnKGQpLEljKHtyZXF1ZXN0VGFza0lkOmMsc3RhdGU6ImZhaWwiLHN0YXR1c0NvZGU6MCxlcnJNc2c6ImFib3J0In0pfX19Y2F0Y2goZSl7cmV0dXJue3JlcXVlc3RUYXNrSWQ6YyxlcnJNc2c6ImNyZWF0ZVJlcXVlc3RUYXNrOmZhaWwifX1yZXR1cm57cmVxdWVzdFRhc2tJZDpjLGVyck1zZzoiY3JlYXRlUmVxdWVzdFRhc2s6b2sifX12YXIgTWMsamM9e30sTGM9ZnVuY3Rpb24oZSl7aGkoIm9uU29ja2V0VGFza1N0YXRlQ2hhbmdlIixlKX07dmFyIE5jPWZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09dCYmKHQ9e30pO3ZhciBuPXQudXJsLHI9KHQuZGF0YSx0LmhlYWRlciksaT0odC5tZXRob2QsdC5wcm90b2NvbHMpLG89TWN8fCgoTWM9cGkoInVuaS13ZWJTb2NrZXQiKSkub25vcGVuKGZ1bmN0aW9uKGUpe0xjKHtzb2NrZXRUYXNrSWQ6ZS5pZCxzdGF0ZToib3BlbiJ9KX0pLE1jLm9ubWVzc2FnZShmdW5jdGlvbihlKXt2YXIgdD1lLmRhdGE7TGMoe3NvY2tldFRhc2tJZDplLmlkLHN0YXRlOiJtZXNzYWdlIixkYXRhOiJvYmplY3QiPT10eXBlb2YgdD9faSh0LmJhc2U2NCk6dH0pfSksTWMub25lcnJvcihmdW5jdGlvbihlKXtMYyh7c29ja2V0VGFza0lkOmUuaWQsc3RhdGU6ImVycm9yIixlcnJNc2c6ZS5kYXRhfSl9KSxNYy5vbmNsb3NlKGZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQsbj1lLmNvZGUscj1lLnJlYXNvbjtkZWxldGUgamNbdF0sTGMoe3NvY2tldFRhc2tJZDp0LHN0YXRlOiJjbG9zZSIsY29kZTpuLHJlYXNvbjpyfSl9KSxNYyk7cmV0dXJuIG8uV2ViU29ja2V0KHtpZDplLHVybDpuLHByb3RvY29sOkFycmF5LmlzQXJyYXkoaSk/aS5qb2luKCIsIik6aSxoZWFkZXI6cn0pLGpjW2VdPW8se3NvY2tldFRhc2tJZDplLGVyck1zZzoiY3JlYXRlU29ja2V0VGFzazpvayJ9fTt2YXIgQmM9MCxEYz17fSxSYz1mdW5jdGlvbihlKXtoaSgib25VcGxvYWRUYXNrU3RhdGVDaGFuZ2UiLGUpfTt2YXIgRmMsemM9e29hdXRoOmZ1bmN0aW9uKHQpe3JnLm9hdXRoLmdldFNlcnZpY2VzKGZ1bmN0aW9uKGUpe3ZhciBuPVtdO2UuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLmlkO24ucHVzaCh0KX0pLHQobnVsbCxuLGUpfSxmdW5jdGlvbihlKXt0KGUpfSl9LHNoYXJlOmZ1bmN0aW9uKHQpe3JnLnNoYXJlLmdldFNlcnZpY2VzKGZ1bmN0aW9uKGUpe3ZhciBuPVtdO2UuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLmlkO24ucHVzaCh0KX0pLHQobnVsbCxuLGUpfSxmdW5jdGlvbihlKXt0KGUpfSl9LHBheW1lbnQ6ZnVuY3Rpb24odCl7cmcucGF5bWVudC5nZXRDaGFubmVscyhmdW5jdGlvbihlKXt2YXIgbj1bXTtlLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5pZDtuLnB1c2godCl9KSx0KG51bGwsbixlKX0sZnVuY3Rpb24oZSl7dChlKX0pfSxwdXNoOmZ1bmN0aW9uKGUpe2lmKHZvaWQgMCE9PW5nfHx2b2lkIDAhPT1yZyl7dmFyIHQ9cmcucHVzaC5nZXRDbGllbnRJbmZvKCk7ZShudWxsLFt0LmlkXSxbdF0pfWVsc2UgZShudWxsLFtdKX19O2Z1bmN0aW9uIFVjKGkpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihuLHIpe3JnLm9hdXRoLmdldFNlcnZpY2VzKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5pZD09PWl9KTt0P24odCk6cihuZXcgRXJyb3IoInByb3ZpZGVyIG5vdCBmaW5kIikpfSxyKX0pfWZ1bmN0aW9uIFZjKG4scixlKXt2b2lkIDA9PT1lJiYoZT0hMCk7dmFyIGk9bi5wcm92aWRlcnx8IndlaXhpbiIsbz1LYyhyLCJsb2dpbiIsZSksYT0iYXBwbGUiPT09aSxzPWE/e3Njb3BlOiJlbWFpbCJ9Om4udW5pdmVyaWZ5U3R5bGU/e3VuaXZlcmlmeVN0eWxlOmZ1bmN0aW9uKGUscil7VChlKSYmVChlLmJ1dHRvbnMpJiYiQXJyYXkiPT09cChlLmJ1dHRvbnMubGlzdCkmJmUuYnV0dG9ucy5saXN0LmZvckVhY2goZnVuY3Rpb24odCxuKXtlLmJ1dHRvbnMubGlzdFtuXS5vbmNsaWNrPWZ1bmN0aW9uKCl7dmFyIGU9e2NvZGU6IjMwMDA4IixtZXNzYWdlOiLnlKjmiLfngrnlh7vkuoboh6rlrprkuYnmjInpkq4iLGluZGV4Om4scHJvdmlkZXI6dC5wcm92aWRlcn07VChGYyk/RmMuX3RyaWdnZXJVbml2ZXJpZnlCdXR0b25zQ2xpY2soZSk6SGMoKS50aGVuKGZ1bmN0aW9uKCl7cihlKX0pfX0pO3JldHVybiBlfShuLnVuaXZlcmlmeVN0eWxlLG8pfTp7fSxjPWU/Zmk6TS5pbnZva2U7VWMoaSkudGhlbihmdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7bi5vbmx5QXV0aG9yaXplJiYid2VpeGluIj09PWk/ZS5hdXRob3JpemUoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb2RlO2Mocix7Y29kZTp0LGF1dGhSZXN1bHQ6IiIsZXJyTXNnOiJsb2dpbjpvayJ9KX0sbyk6ZS5sb2dpbihmdW5jdGlvbihlKXt2YXIgdD1lLnRhcmdldC5hdXRoUmVzdWx0LG49ZS50YXJnZXQuYXBwbGVJbmZvO2Mocix7Y29kZTp0LmNvZGUsYXV0aFJlc3VsdDp0LGFwcGxlSW5mbzpuLGVyck1zZzoibG9naW46b2sifSl9LG8scyl9YXx8InVuaXZlcmlmeSI9PT1pP3QoKTplLmxvZ291dCh0LHQpfSkuY2F0Y2gobyl9ZnVuY3Rpb24gcWMoYSxzKXt2YXIgYz1hLnByb3ZpZGVyfHwid2VpeGluIixlPUxpKHMsIm9wZXJhdGVXWERhdGEiKTtVYyhjKS50aGVuKGZ1bmN0aW9uKG8pe28uZ2V0VXNlckluZm8oZnVuY3Rpb24oZSl7dmFyIHQ7aWYoIndlaXhpbiI9PT1jKXt2YXIgbj1vLnVzZXJJbmZvO3Q9e29wZW5JZDpuLm9wZW5pZCxuaWNrTmFtZTpuLm5pY2tuYW1lLGdlbmRlcjpuLnNleCxjaXR5Om4uY2l0eSxwcm92aW5jZTpuLnByb3ZpbmNlLGNvdW50cnk6bi5jb3VudHJ5LGF2YXRhclVybDpuLmhlYWRpbWd1cmwsdW5pb25JZDpuLnVuaW9uaWR9fWVsc2UgaWYoImFwcGxlIj09PWMpe3ZhciByPW8uYXBwbGVJbmZvO3Q9e29wZW5JZDpyLnVzZXIsZnVsbE5hbWU6ci5mdWxsTmFtZSxlbWFpbDpyLmVtYWlsLGF1dGhvcml6YXRpb25Db2RlOnIuYXV0aG9yaXphdGlvbkNvZGUsaWRlbnRpdHlUb2tlbjpyLmlkZW50aXR5VG9rZW4scmVhbFVzZXJTdGF0dXM6ci5yZWFsVXNlclN0YXR1c319ZWxzZSh0PW8udXNlckluZm8pLm9wZW5JZD10Lm9wZW5JZHx8dC5vcGVuaWR8fG8uYXV0aFJlc3VsdC5vcGVuaWQsdC5uaWNrTmFtZT10Lm5pY2tOYW1lfHx0Lm5pY2tuYW1lLHQuYXZhdGFyVXJsPXQuYXZhdGFyVXJsfHx0LmhlYWRpbWd1cmw7dmFyIGk9e2Vyck1zZzoib3BlcmF0ZVdYRGF0YTpvayJ9O2EuZGF0YSYmIndlYmFwaV9nZXR1c2VyaW5mbyI9PT1hLmRhdGEuYXBpX25hbWU/aS5kYXRhPXtkYXRhOkpTT04uc3RyaW5naWZ5KHQpLHJhd0RhdGE6IiIsc2lnbmF0dXJlOiIiLGVuY3J5cHRlZERhdGE6IiIsaXY6IiJ9OmkudXNlckluZm89dCxmaShzLGkpfSxlKX0pLmNhdGNoKGZ1bmN0aW9uKCl7Zmkocyx7ZXJyTXNnOiJvcGVyYXRlV1hEYXRhOmZhaWwg6K+35YWI6LCD55SoIHVuaS5sb2dpbiJ9KX0pfWZ1bmN0aW9uIFdjKGUsdCxuKXt2YXIgcj1KYyh0LCJwcmVMb2dpbiIsbiksaT1LYyh0LCJwcmVMb2dpbiIsbik7VWMoZS5wcm92aWRlcikudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gZS5wcmVMb2dpbihyLGkpfSkuY2F0Y2goaSl9ZnVuY3Rpb24gSGMoKXtyZXR1cm4gVWMoInVuaXZlcmlmeSIpLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xvc2VBdXRoVmlldygpfSl9ZnVuY3Rpb24gR2MoZSx0LG4pe3ZhciByPUpjKHQsImdldENoZWNrQm94U3RhdGUiLG4pLGk9S2ModCwiZ2V0Q2hlY2tCb3hTdGF0ZSIsbik7dHJ5e1VjKCJ1bml2ZXJpZnkiKS50aGVuKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0Q2hlY2tCb3hTdGF0ZSgpO3Ioe3N0YXRlOnR9KX0pfWNhdGNoKGUpe2koZSl9fXZhciBYYyxZYz1mdW5jdGlvbigpe3RoaXMucHJvdmlkZXI9InVuaXZlcmlmeSIsdGhpcy5ldmVudE5hbWU9ImFwaS51bml2ZXJpZnlCdXR0b25zQ2xpY2sifTtmdW5jdGlvbiBKYyh0LG4sZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSEwKSxlP2ppKHQsbik6ZnVuY3Rpb24oZSl7TS5pbnZva2UodCxPYmplY3QuYXNzaWduKHt9LGUse2Vyck1zZzpuKyI6b2sifSkpfX1mdW5jdGlvbiBLYyhyLGksZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSEwKSxlP0xpKHIsaSk6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb2RlO3ZvaWQgMD09PXQmJih0PTApO3ZhciBuPWUubWVzc2FnZTtNLmludm9rZShyLHtlcnJNc2c6aSsiOmZhaWwgIisobnx8IiIpLGVyckNvZGU6dCxjb2RlOnR9KX19WWMucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7SGMoKX0sWWMucHJvdG90eXBlLmxvZ2luPWZ1bmN0aW9uKGUpe3RoaXMuX3dhcnAoZnVuY3Rpb24oZSx0KXtyZXR1cm4gVmMoZSx0LCExKX0sZSl9LFljLnByb3RvdHlwZS5nZXRDaGVja0JveFN0YXRlPWZ1bmN0aW9uKGUpe3RoaXMuX3dhcnAoZnVuY3Rpb24oZSx0KXtyZXR1cm4gR2MoMCx0LCExKX0sZSl9LFljLnByb3RvdHlwZS5wcmVMb2dpbj1mdW5jdGlvbihlKXt0aGlzLl93YXJwKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIFdjKGUsdCwhMSl9LGUpfSxZYy5wcm90b3R5cGUub25CdXR0b25zQ2xpY2s9ZnVuY3Rpb24oZSl7aWcub24odGhpcy5ldmVudE5hbWUsZSl9LFljLnByb3RvdHlwZS5vZmZCdXR0b25zQ2xpY2s9ZnVuY3Rpb24oZSl7aWcub2ZmKHRoaXMuZXZlbnROYW1lLGUpfSxZYy5wcm90b3R5cGUuX3RyaWdnZXJVbml2ZXJpZnlCdXR0b25zQ2xpY2s9ZnVuY3Rpb24oZSl7aWcuZW1pdCh0aGlzLmV2ZW50TmFtZSxlKX0sWWMucHJvdG90eXBlLl93YXJwPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIE0ud2FycChlKSh0aGlzLl9nZXRPcHRpb25zKHQpKX07dmFyIFpjPSEoWWMucHJvdG90eXBlLl9nZXRPcHRpb25zPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT17fSksT2JqZWN0LmFzc2lnbih7fSxlLHtwcm92aWRlcjp0aGlzLnByb3ZpZGVyfSl9KSxRYz0hMTtmdW5jdGlvbiBldShlKXtyZXR1cm4gbmcucmVxdWlyZU1vZHVsZShlKX12YXIgdHU9ezA6e25hbWU6IndlYiIsdGl0bGU6IuWbvuaWhyJ9LDE6e25hbWU6InRleHQiLHRpdGxlOiLnuq/mloflrZcifSwyOntuYW1lOiJpbWFnZSIsdGl0bGU6Iue6r+WbvueJhyJ9LDM6e25hbWU6Im11c2ljIix0aXRsZToi6Z+z5LmQIn0sNDp7bmFtZToidmlkZW8iLHRpdGxlOiLop4bpopEifSw1OntuYW1lOiJtaW5pUHJvZ3JhbSIsdGl0bGU6IuWwj+eoi+W6jyJ9fSxudT1mdW5jdGlvbihlLHQsbil7ZS50eXBlPWUudHlwZXx8MDt2YXIgcj1lLnByb3ZpZGVyLGk9ZS50eXBlLG89ZS50aXRsZSxhPWUuc3VtbWFyeSxzPWUuaHJlZixjPWUuaW1hZ2VVcmwsdT1lLm1lZGlhVXJsLGw9ZS5zY2VuZSxkPWUubWluaVByb2dyYW0sZj1lLm9wZW5DdXN0b21lclNlcnZpY2VDaGF0LHA9ZS5jb3JwaWQsaD1lLmN1c3RvbWVyVXJsOyJzdHJpbmciPT10eXBlb2YgYyYmYyYmKGM9VGkoYykpO3ZhciB2PXR1W2krIiJdO2lmKHYpe3ZhciBnPXtwcm92aWRlcjpyLHR5cGU6di5uYW1lLHRpdGxlOm8sY29udGVudDphLGhyZWY6cyxwaWN0dXJlczpbY10sdGh1bWJzOltjXSxtZWRpYTp1LG1pbmlQcm9ncmFtOmQsZXh0cmE6e3NjZW5lOmx9LG9wZW5DdXN0b21lclNlcnZpY2VDaGF0OmYsY29ycGlkOnAsdXJsOmh9O3JldHVybiJ3ZWl4aW4iIT09cnx8MSE9PWkmJjIhPT1pfHxkZWxldGUgZy50aHVtYnMsZ31yZXR1cm4i5YiG5Lqr5Y+C5pWwIHR5cGUg5LiN5q2j56GuIn0scnU9ZnVuY3Rpb24oZSx0LG4scil7dm9pZCAwPT09ciYmKHI9InNoYXJlIik7dmFyIGk9TGkobixyKSxvPXQub3BlbkN1c3RvbWVyU2VydmljZUNoYXQ/Im9wZW5DdXN0b21lclNlcnZpY2VDaGF0Ijoic2VuZCI7dHJ5e2Vbb10odCxmdW5jdGlvbigpe2ZpKG4se2Vyck1zZzpyKyI6b2sifSl9LGkpfWNhdGNoKGUpe2koe21lc3NhZ2U6dC5wcm92aWRlcisiICIrbysiIOaWueazleiwg+eUqOWksei0pSJ9KX19O2Z1bmN0aW9uIGl1KG4scixpKXt2b2lkIDA9PT1pJiYoaT0ic2hhcmUiKSxuPW51KG4pO3ZhciBvPUxpKHIsaSk7aWYoInN0cmluZyI9PXR5cGVvZiBuKXJldHVybiBmaShyLHtlcnJNc2c6aSsiOmZhaWwgIitufSk7dmFyIGE9bi5wcm92aWRlcjtyZy5zaGFyZS5nZXRTZXJ2aWNlcyhmdW5jdGlvbihlKXt2YXIgdD1lLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaWQ9PT1hfSk7dD90LmF1dGhlbnRpY2F0ZWQ/cnUodCxuLHIpOnQuYXV0aG9yaXplKGZ1bmN0aW9uKCl7cmV0dXJuIHJ1KHQsbixyKX0sbyk6Zmkocix7ZXJyTXNnOmkrIjpmYWlsIHNlcnZpY2Ugbm90IGZvdW5kIn0pfSxvKX1mdW5jdGlvbiBvdShuKXtuLiRwcm9jZXNzZWQ9ITAsbi5wb3N0TWVzc2FnZT1mdW5jdGlvbihlKXtyZy53ZWJ2aWV3LnBvc3RNZXNzYWdlVG9VbmlOVmlldyh7dHlwZToiVW5pQXBwU3ViTlZ1ZSIsZGF0YTplfSxuLmlkKX07dmFyIHI9W107aWYobi5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7ci5wdXNoKGUpfSxuLiRjb25zdW1lTWVzc2FnZT1mdW5jdGlvbih0KXtyLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGUodCl9KX0sbi5fX3VuaWFwcF9tYXNrX2lkKXt2YXIgaT1uLl9fdW5pYXBwX21hc2ssbz0iMCI9PT1uLl9fdW5pYXBwX21hc2tfaWQ/e3NldFN0eWxlOmZ1bmN0aW9uKGUpe3ZhciB0PWUubWFzaztldSgidW5pLXRhYnZpZXciKS5zZXRNYXNrKHtjb2xvcjp0fSl9fTpyZy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKG4uX191bmlhcHBfbWFza19pZCksYT1uLnNob3cscz1uLmhpZGUsYz1uLmNsb3NlLHU9ZnVuY3Rpb24oKXtvLnNldFN0eWxlKHttYXNrOiJub25lIn0pfTtuLnNob3c9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIG8uc2V0U3R5bGUoe21hc2s6aX0pLGEuYXBwbHkobixlKX0sbi5oaWRlPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3JldHVybiB1KCkscy5hcHBseShuLGUpfSxuLmNsb3NlPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3JldHVybiB1KCkscj1bXSxjLmFwcGx5KG4sZSl9fX1mdW5jdGlvbiBhdShlKXt2YXIgdD1yZy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKGUpO2lmKG51bGw9PXQpdGhyb3cgbmV3IEVycm9yKCJVbmFibGUgdG8gZmluZCBTdWJOVnVlLCBpZD0iK2UpO3QmJiF0LiRwcm9jZXNzZWQmJm91KHQpO3ZhciBuPXQuc2V0U3R5bGUscj1yZy53ZWJ2aWV3LmdldFdlYnZpZXdCeUlkKHQuX191bmlhcHBfbWFza19pZCk7cmV0dXJuIHQuc2V0U3R5bGU9ZnVuY3Rpb24oZSl7ZSYmZS5tYXNrJiYociYmci5zZXRTdHlsZSh7bWFzazplLm1hc2t9KSxkZWxldGUgZS5tYXNrKSxuLmNhbGwodGhpcyxlKX0sdH12YXIgc3U9W107ZnVuY3Rpb24gY3UoZSx0LG4pe3JldHVybiBuZy5yZXF1aXJlTW9kdWxlKCJwbHVzIikuc2VuZE5hdGl2ZUV2ZW50KGUsdCxuKX1pZy5vbigiYXBpLnVuaU1QTmF0aXZlRXZlbnQiLGZ1bmN0aW9uKHQpe3N1LmZvckVhY2goZnVuY3Rpb24oZSl7ZmkoZSx0LmV2ZW50LHQuZGF0YSl9KX0pO3ZhciB1dT1jdTt2YXIgbHUsZHU9MSxmdT17fTtmdW5jdGlvbiBwdSgpe3JldHVybiBsdXx8KGx1PWRnLnJlcXVpcmVOYXRpdmVQbHVnaW4oIlVUUy1Qcm94eSIpKSxsdX1mdW5jdGlvbiBodShlLHQsbixyLGkpe2lmKCF0KXRocm93IG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShlKSk7aWYobCh0KSl0cnl7dD1KU09OLnBhcnNlKHQpfWNhdGNoKGUpe3Rocm93IG5ldyBFcnJvcigiSlNPTi5wYXJzZSgiK3QrIik6ICIrZSl9aWYodC5lcnJNc2cpdGhyb3cgbmV3IEVycm9yKHQuZXJyTXNnKTtpZihuJiYiaW50ZXJmYWNlIj09PW4udHlwZSYmIm51bWJlciI9PXR5cGVvZiB0LnBhcmFtcyl7aWYoIXQucGFyYW1zKXJldHVybiBudWxsO2lmKHQucGFyYW1zPT09ciYmaSlyZXR1cm4gaTtpZihTdVtuLm9wdGlvbnNdKXJldHVybiBuZXcod3UobSh7aW5zdGFuY2VJZDp0LnBhcmFtc30sU3Vbbi5vcHRpb25zXSkpKX1yZXR1cm4gdC5wYXJhbXN9ZnVuY3Rpb24gdnUoZSl7aWYoZS5lcnJNc2cpdGhyb3cgbmV3IEVycm9yKGUuZXJyTXNnKTtyZXR1cm4gZGVsZXRlIGUuZXJyTXNnLGh1KGUscHUoKS5pbnZva2VTeW5jKGUsZnVuY3Rpb24oKXt9KSl9ZnVuY3Rpb24gZ3UobixlLGksbyl7dmFyIHQ9ZS5tb2R1bGVOYW1lLHI9ZS5tb2R1bGVUeXBlLGE9ZS5wYWNrYWdlLHM9ZS5jbGFzcyxjPWUubmFtZSx1PWUubWV0aG9kLGw9ZS5jb21wYW5pb24sZD1lLnBhcmFtcyxmPWUucmV0dXJuLHA9ZS5lcnJNc2csaD1mdW5jdGlvbihlKXt2YXIgdD1lLmlkLG49ZS5uYW1lLHI9ZS5wYXJhbXMsaT1lLmtlZXBBbGl2ZSxvPWZ1W3RdO28/KG8uYXBwbHkodm9pZCAwLHIpLGl8fGRlbGV0ZSBmdVt0XSk6Y29uc29sZS5lcnJvcigiIithK3MrIi4iK2MrIiAiK24rIiBpcyBub3QgZm91bmQiKX0sdj1pP3ttb2R1bGVOYW1lOnQsbW9kdWxlVHlwZTpyLGlkOmksbmFtZTpjLG1ldGhvZDpkfTp7bW9kdWxlTmFtZTp0LG1vZHVsZVR5cGU6cixwYWNrYWdlOmEsY2xhc3M6cyxuYW1lOnV8fGMsY29tcGFuaW9uOmwsbWV0aG9kOmR9O3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtpZihwKXRocm93IG5ldyBFcnJvcihwKTt2YXIgcj1tKHt9LHYse3BhcmFtczplLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24gdChuKXtpZigiZnVuY3Rpb24iPT10eXBlb2Ygbil7dmFyIGU9T2JqZWN0LmtleXMoZnUpLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1W2VdPT09bn0pLHI9ZT9wYXJzZUludChlKTpkdSsrO3JldHVybiBmdVtyXT1uLHJ9cmV0dXJuIFQobikmJk9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oZSl7bltlXT10KG5bZV0pfSksbn0oZSl9KX0pO3JldHVybiBuP25ldyBQcm9taXNlKGZ1bmN0aW9uKHQsbil7cHUoKS5pbnZva2VBc3luYyhyLGZ1bmN0aW9uKGUpeyJyZXR1cm4iIT09ZS50eXBlP2goZSk6ZS5lcnJNc2c/bihlLmVyck1zZyk6dChlLnBhcmFtcyl9KX0pOmh1KHIscHUoKS5pbnZva2VTeW5jKHIsaCksZixpLG8pfX1mdW5jdGlvbiBtdShlLHQpe3JldHVybiB0Lm1haW4mJiF0Lm1ldGhvZCYmdm9pZCAwIT09cmcmJiJpT1MiPT09cmcub3MubmFtZSYmKHQubWV0aG9kPSJzXyIrdC5uYW1lKSxndShlLHQsMCl9dmFyIHl1PW11O2Z1bmN0aW9uIF91KGUsdCl7cmV0dXJuIGsodCxlKyJCeUpzIik/ZSsiQnlKcyI6ZX1mdW5jdGlvbiBidShlKXtyZXR1cm4gdm9pZCAwPT09ZX1mdW5jdGlvbiB3dShlKXt2YXIgbCxkPWUubW9kdWxlTmFtZSxmPWUubW9kdWxlVHlwZSx0PWUucGFja2FnZSxuPWUuY2xhc3MscD1lLm1ldGhvZHMsaD1lLnByb3BzLHY9ZS5lcnJNc2csZz17bW9kdWxlTmFtZTpkLG1vZHVsZVR5cGU6ZixwYWNrYWdlOnQsY2xhc3M6bixlcnJNc2c6dn0scj1bXSxzPXt9LGM9W107YnUoZS5pbnN0YW5jZUlkKT8ocj1lLmNvbnN0cnVjdG9yLnBhcmFtcyxzPWUuc3RhdGljTWV0aG9kcyxjPWUuc3RhdGljUHJvcHMpOmw9ZS5pbnN0YW5jZUlkLHZvaWQgMCE9PXJnJiYiaU9TIj09PXJnLm9zLm5hbWUmJnIuZmluZChmdW5jdGlvbihlKXtyZXR1cm4iVVRTQ2FsbGJhY2siPT09ZS50eXBlfHwwPGUudHlwZS5pbmRleE9mKCJKU09OT2JqZWN0Iil9KSYmci5wdXNoKHtuYW1lOiJfYnlKcyIsdHlwZToiYm9vbGVhbiJ9KTt2YXIgdT17fTtyZXR1cm4gbmV3IFByb3h5KGZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2lmKHYpdGhyb3cgbmV3IEVycm9yKHYpO3ZhciBjPXt9O2lmKGJ1KGwpJiYobD1ndSghMSxtKHtuYW1lOiJjb25zdHJ1Y3RvciIscGFyYW1zOnJ9LGcpLDApLmFwcGx5KG51bGwsZSkpLCFsKXRocm93IG5ldyBFcnJvcigibmV3ICIrbisiIGlzIGZhaWxlZCIpO3ZhciB1PW5ldyBQcm94eSh0aGlzLHtnZXQ6ZnVuY3Rpb24oZSx0KXtpZighY1t0XSlpZih0PV91KHQscCksayhwLHQpKXt2YXIgbj1wW3RdLHI9bi5hc3luYyxpPW4ucGFyYW1zLG89bi5yZXR1cm47Y1t0XT0oYT0hIXIscz1tKHtuYW1lOnQscGFyYW1zOmkscmV0dXJuOm99LGcpLGd1KGEscyxsLHUpKX1lbHNlIGlmKGguaW5jbHVkZXModCkpcmV0dXJuIHZ1KHttb2R1bGVOYW1lOmQsbW9kdWxlVHlwZTpmLGlkOmwsbmFtZTp0LGVyck1zZzp2fSk7dmFyIGEscztyZXR1cm4gY1t0XX19KTtyZXR1cm4gdX0se2dldDpmdW5jdGlvbihlLHQsbil7aWYodD1fdSh0LHMpLGsocyx0KSl7aWYoIXVbdF0pe3ZhciByPXNbdF0saT1yLmFzeW5jLG89ci5wYXJhbXMsYT1yLnJldHVybjt1W3RdPW11KCEhaSxtKHtuYW1lOnQsY29tcGFuaW9uOiEwLHBhcmFtczpvLHJldHVybjphfSxnKSl9cmV0dXJuIHVbdF19cmV0dXJuIGMuaW5jbHVkZXModCk/dnUobSh7bmFtZTp0LGNvbXBhbmlvbjohMH0sZykpOlJlZmxlY3QuZ2V0KGUsdCxuKX19KX1mdW5jdGlvbiBrdShlLHQsbil7cmV0dXJuIHZvaWQgMD09PXJnPyIiOiJBbmRyb2lkIj09PXJnLm9zLm5hbWU/dDoiaU9TIj09PXJnLm9zLm5hbWU/IlVUU1NESyIrKG4/Ik1vZHVsZXMiOiIiKSt5KGUpK3kodCk6IiJ9dmFyIFN1PXt9O3ZhciB4dT17fTtmdW5jdGlvbiBDdShlLHQsbil7ZVtlLl9fcHJlbG9hZF9fPyJoaWRlIjoiY2xvc2UiXSh0LG4pfWZ1bmN0aW9uIFR1KG4scixlLGksdCl7dm9pZCAwPT09dCYmKHQ9bi5udnVlPzA6MTAwKTt2YXIgbz0oZT12b2lkIDA9PT1lP25hOnBhcnNlSW50KGUpKXx8bmE7b2coZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbigpe2UuX2NhbGxlZHx8KGUuX2NhbGxlZD0hMCxpJiZpKCksbXMoKSl9LHQ9b2coZnVuY3Rpb24oKXtlKCl9LG8rMTUwKTtuLnNob3cocnx8dGEsbyxmdW5jdGlvbigpe2UuX2NhbGxlZHx8YWcodCksZSgpfSl9LHQpfXZhciBPdT0wO2Z1bmN0aW9uIEV1KHQsbixyKXt2YXIgaT1wZygpLG89aS5sZW5ndGgsYT1pW28tMV07MTx0JiZpLnNsaWNlKG8tdCxvLTEpLnJldmVyc2UoKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0N1KGUuJGdldEFwcFdlYnZpZXcoKSwibm9uZSIpfSk7dmFyIGU9ZnVuY3Rpb24oZSl7bj9DdShlLG4scnx8bmEpOiJyZWRpcmVjdCI9PT1hLiRwYWdlLm9wZW5UeXBlP0N1KGUscmEsbmEpOkN1KGUsImF1dG8iKSxpLnNsaWNlKG8tdCxvKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlLiRyZW1vdmUoKX0pLG1pKCksaWcuZW1pdCgib25BcHBSb3V0ZSIse3R5cGU6Im5hdmlnYXRlQmFjayJ9KX0scz1hLiRnZXRBcHBXZWJ2aWV3KCk7aWYoIWEuX191bmlhcHBfd2VidmlldylyZXR1cm4gZShzKTshZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNoaWxkcmVuKCk7aWYoIW58fCFuLmxlbmd0aClyZXR1cm4gdCgpO3ZhciByPW4uZmluZChmdW5jdGlvbihlKXtyZXR1cm4gMD09PWUuaWQuaW5kZXhPZihucyl9KXx8blswXTtyLmNhbkJhY2soZnVuY3Rpb24oZSl7ZS5jYW5CYWNrP3IuYmFjaygpOnQoKX0pfShzLGZ1bmN0aW9uKCl7ZShzKX0pfWZ1bmN0aW9uIEF1KGUpe3ZhciB0PWUuZnJvbTt2b2lkIDA9PT10JiYodD0ibmF2aWdhdGVCYWNrIik7dmFyIG49ZS5kZWx0YSxyPWUuYW5pbWF0aW9uVHlwZSxpPWUuYW5pbWF0aW9uRHVyYXRpb24sbz1wZygpLGE9b1tvLmxlbmd0aC0xXTtpZighKGEuJHZtJiZhLiR2bS4kb3B0aW9ucy5vbkJhY2tQcmVzcyYmYS4kdm0uX19jYWxsX2hvb2smJmEuJHZtLl9fY2FsbF9ob29rKCJvbkJhY2tQcmVzcyIse2Zyb206dH0pKSlyZXR1cm4gZGcuaGlkZVRvYXN0KCksZGcuaGlkZUxvYWRpbmcoKSxhLiRwYWdlLm1ldGEuaXNRdWl0P091P0RhdGUubm93KCktT3U8MmUzJiZyZy5ydW50aW1lLnF1aXQoKTooT3U9RGF0ZS5ub3coKSxyZy5uYXRpdmVVSS50b2FzdChhdCgidW5pLmFwcC5xdWl0IikpLG9nKGZ1bmN0aW9uKCl7T3U9bnVsbH0sMmUzKSk6MT09PWEuJHBhZ2UuaWQmJnVnLnJlYWxFbnRyeVBhZ2VQYXRoPyh1Zy5lbnRyeVBhZ2VQYXRoPXVnLnJlYWxFbnRyeVBhZ2VQYXRoLGRlbGV0ZSB1Zy5yZWFsRW50cnlQYWdlUGF0aCxkZy5yZUxhdW5jaCh7dXJsOiIvIit1Zy5lbnRyeVBhZ2VQYXRofSkpOkV1KG4scixpKSx7ZXJyTXNnOiJuYXZpZ2F0ZUJhY2s6b2sifX12YXIgSXU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3RoaXMuaWQ9ZSx0aGlzLmxpc3RlbmVyPXt9LHRoaXMuZW1pdENhY2hlPXt9LHQmJk9iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24oZSl7bi5vbihlLHRbZV0pfSl9O0l1LnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGgtMTswPG4tLTspdFtuXT1hcmd1bWVudHNbbisxXTt2YXIgcj10aGlzLmxpc3RlbmVyW2VdO2lmKCFyKXJldHVybih0aGlzLmVtaXRDYWNoZVtlXXx8KHRoaXMuZW1pdENhY2hlW2VdPVtdKSkucHVzaCh0KTtyLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5mbi5hcHBseShlLmZuLHQpfSksdGhpcy5saXN0ZW5lcltlXT1yLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4ib25jZSIhPT1lLnR5cGV9KX0sSXUucHJvdG90eXBlLm9uPWZ1bmN0aW9uKGUsdCl7dGhpcy5fYWRkTGlzdGVuZXIoZSwib24iLHQpLHRoaXMuX2NsZWFyQ2FjaGUoZSl9LEl1LnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKGUsdCl7dGhpcy5fYWRkTGlzdGVuZXIoZSwib25jZSIsdCksdGhpcy5fY2xlYXJDYWNoZShlKX0sSXUucHJvdG90eXBlLm9mZj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMubGlzdGVuZXJbZV07aWYobilpZih0KWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7KW5bcl0uZm49PT10JiYobi5zcGxpY2UociwxKSxyLS0pLHIrKztlbHNlIGRlbGV0ZSB0aGlzLmxpc3RlbmVyW2VdfSxJdS5wcm90b3R5cGUuX2NsZWFyQ2FjaGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5lbWl0Q2FjaGVbZV07aWYodClmb3IoOzA8dC5sZW5ndGg7KXRoaXMuZW1pdC5hcHBseSh0aGlzLFtlXS5jb25jYXQodC5zaGlmdCgpKSl9LEl1LnByb3RvdHlwZS5fYWRkTGlzdGVuZXI9ZnVuY3Rpb24oZSx0LG4peyh0aGlzLmxpc3RlbmVyW2VdfHwodGhpcy5saXN0ZW5lcltlXT1bXSkpLnB1c2goe2ZuOm4sdHlwZTp0fSl9O3ZhciAkdT0wO2Z1bmN0aW9uIFB1KGUsdCl7dmFyIG49ZS51cmwscj1lLnBhdGgsaT1lLnF1ZXJ5LG89ZS5ldmVudHMsYT1lLmFuaW1hdGlvblR5cGUscz1lLmFuaW1hdGlvbkR1cmF0aW9uO2lnLmVtaXQoIm9uQXBwUm91dGUiLHt0eXBlOiJuYXZpZ2F0ZVRvIixwYXRoOnJ9KTt2YXIgYz0odm9pZCAwPT09ITEmJiEwLG5ldyBJdSgrKyR1LG8pKTtUdShqcyh7dXJsOm4scGF0aDpyLHF1ZXJ5Omksb3BlblR5cGU6Im5hdmlnYXRlIixldmVudENoYW5uZWw6Y30pLGEscyxmdW5jdGlvbigpe2ZpKHQse2Vyck1zZzoibmF2aWdhdGVUbzpvayIsZXZlbnRDaGFubmVsOmN9KX0pLG1pKCl9ZnVuY3Rpb24gTXUoZSx0KXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9e30pLEFycmF5LmlzQXJyYXkoZVt0XSkmJmVbdF0ubGVuZ3RofWZ1bmN0aW9uIGp1KGUscil7dmFyIHQ9ZS51cmwsbj1lLnBhdGgsaT1lLnF1ZXJ5LG89ZS5leGlzdHMsYT1wZygpLHM9YS5sZW5ndGgtMTtpZigiYmFjayI9PT1vKXt2YXIgYz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9cGcoKSxuPXQubGVuZ3RoO24tLTspe3ZhciByPXRbbl07aWYoci4kcGFnZSYmci4kcGFnZS5mdWxsUGF0aD09PWUpcmV0dXJuIG59cmV0dXJuLTF9KHQpO2lmKC0xIT09Yyl7dmFyIHU9cy1jO2lmKDA8dSlyZXR1cm4gQXUoe2RlbHRhOnV9KSx2b2lkIGZpKHIse2Vyck1zZzoicmVkaXJlY3RUbzpvayJ9KX19dmFyIGw9YVtzXTtsJiZsLiRyZW1vdmUoKSxUdShqcyh7dXJsOnQscGF0aDpuLHF1ZXJ5Omksb3BlblR5cGU6InJlZGlyZWN0In0pLCJub25lIiwwLGZ1bmN0aW9uKCl7aWYobCl7dmFyIGU9bC4kZ2V0QXBwV2VidmlldygpO2UuX19wcmVsb2FkX18mJih0PWUsKG49T2JqZWN0LmtleXMoTXMpLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIE1zW2VdLmlkPT09dC5pZH0pKSYmZGVsZXRlIE1zW25dKSxlLmNsb3NlKCJub25lIil9dmFyIHQsbjtmaShyLHtlcnJNc2c6InJlZGlyZWN0VG86b2sifSl9KSxtaSgpfXZhciBMdSxOdSxCdSxEdT0iX19UWVBFIixSdT0idW5pLXN0b3JhZ2Uta2V5cyI7ZnVuY3Rpb24gRnUoZSl7dHJ5e3ZhciB0PSJzdHJpbmciPT10eXBlb2YgZT9KU09OLnBhcnNlKGUpOmUsbj10LnR5cGU7aWYoMDw9WyJvYmplY3QiLCJzdHJpbmciLCJudW1iZXIiLCJib29sZWFuIiwidW5kZWZpbmVkIl0uaW5kZXhPZihuKSl7dmFyIHI9T2JqZWN0LmtleXModCk7aWYoMj09PXIubGVuZ3RoJiYiZGF0YSJpbiB0KXtpZih0eXBlb2YgdC5kYXRhPT09bilyZXR1cm4gdC5kYXRhO2lmKCJvYmplY3QiPT09biYmL15cZHs0fS1cZHsyfS1cZHsyfVRcZHsyfVw6XGR7Mn1cOlxkezJ9XC5cZHszfVokLy50ZXN0KHQuZGF0YSkpcmV0dXJuIG5ldyBEYXRlKHQuZGF0YSl9ZWxzZSBpZigxPT09ci5sZW5ndGgpcmV0dXJuIiJ9fWNhdGNoKGUpe319ZnVuY3Rpb24genUoZSx0KXt2YXIgbj10O2lmKCJzdHJpbmciIT09ZXx8InN0cmluZyI9PT1lJiYneyJ0eXBlIjoidW5kZWZpbmVkIn0nPT09dCl0cnl7dmFyIHI9SlNPTi5wYXJzZSh0KSxpPUZ1KHIpO2lmKHZvaWQgMCE9PWkpbj1pO2Vsc2UgaWYoZSYmInN0cmluZyI9PXR5cGVvZihuPXIpKXt2YXIgbz10eXBlb2Yocj1KU09OLnBhcnNlKHIpKTsibnVtYmVyIj09PW8mJiJkYXRlIj09PWU/bj1uZXcgRGF0ZShyKTpvPT09KFsibnVsbCIsImFycmF5Il0uaW5kZXhPZihlKTwwP2U6Im9iamVjdCIpJiYobj1yKX19Y2F0Y2goZSl7fXJldHVybiBufWZ1bmN0aW9uIFV1KCl7Zm9yKHZhciBlPXJnLnN0b3JhZ2UubGVuZ3RofHxyZy5zdG9yYWdlLmdldExlbmd0aCgpfHwwLHQ9W10sbj0wLHI9MDtyPGU7cisrKXt2YXIgaT1yZy5zdG9yYWdlLmtleShyKTtpZihpIT09UnUmJihpLmluZGV4T2YoRHUpPDB8fGkuaW5kZXhPZihEdSkrRHUubGVuZ3RoIT09aS5sZW5ndGgpKXt2YXIgbz1yZy5zdG9yYWdlLmdldEl0ZW0oaSk7bis9aS5sZW5ndGgrby5sZW5ndGgsdC5wdXNoKGkpfX1yZXR1cm57a2V5czp0LGN1cnJlbnRTaXplOk1hdGguY2VpbCgyKm4vMTAyNCksbGltaXRTaXplOk51bWJlci5NQVhfVkFMVUUsZXJyTXNnOiJnZXRTdG9yYWdlSW5mbzpvayJ9fWZ1bmN0aW9uIFZ1KGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLnRpdGxlO3ZvaWQgMD09PXQmJih0PSIiKTt2YXIgbj1lLmljb247dm9pZCAwPT09biYmKG49InN1Y2Nlc3MiKTt2YXIgcj1lLmltYWdlO3ZvaWQgMD09PXImJihyPSIiKTt2YXIgaT1lLmR1cmF0aW9uO3ZvaWQgMD09PWkmJihpPTE1MDApO3ZhciBvPWUubWFzazt2b2lkIDA9PT1vJiYobz0hMSk7dmFyIGE9ZS5wb3NpdGlvbjt2b2lkIDA9PT1hJiYoYT0iIik7dmFyIHM9ZS50eXBlO3ZvaWQgMD09PXMmJihzPSJ0b2FzdCIpO3ZhciBjPWUuc3R5bGU7aWYocXUobnVsbCksTnU9cyxbInRvcCIsImNlbnRlciIsImJvdHRvbSJdLmluY2x1ZGVzKGEpKXJnLm5hdGl2ZVVJLnRvYXN0KHQse3ZlcnRpY2FsQWxpZ246YX0pLEx1PSEwO2Vsc2V7biYmIX5bInN1Y2Nlc3MiLCJsb2FkaW5nIiwiZXJyb3IiLCJub25lIl0uaW5kZXhPZihuKSYmKG49InN1Y2Nlc3MiKTt2YXIgdT17bW9kYWw6byxiYWNrOiJ0cmFuc21pdCIscGFkZGluZzoiMTBweCIsc2l6ZToiMTZweCJ9O3J8fG4mJiJub25lIiE9PW4/KHUud2lkdGg9IjE0MHB4Iix1LmhlaWdodD0iMTEycHgiKTp1LmxvYWRpbmc9e2Rpc3BsYXk6Im5vbmUifSxyP3UubG9hZGluZz17ZGlzcGxheToiYmxvY2siLGhlaWdodDoiNTVweCIsaWNvbjpyLGludGVydmFsOml9Oi0xIT09WyJzdWNjZXNzIiwiZXJyb3IiXS5pbmRleE9mKG4pJiYodS5sb2FkaW5nPXtkaXNwbGF5OiJibG9jayIsaGVpZ2h0OiI1NXB4IixpY29uOiJzdWNjZXNzIj09PW4/Il9fdW5pYXBwc3VjY2Vzcy5wbmciOiJfX3VuaWFwcGVycm9yLnBuZyIsaW50ZXJ2YWw6aX0pLEx1PXJnLm5hdGl2ZVVJLnNob3dXYWl0aW5nKHQsT2JqZWN0LmFzc2lnbih1LGMpKX1yZXR1cm4gQnU9b2coZnVuY3Rpb24oKXtxdShudWxsKX0saSkse2Vyck1zZzoic2hvd1RvYXN0Om9rIn19ZnVuY3Rpb24gcXUoZSl7aWYodm9pZCAwPT09ZSYmKGU9InRvYXN0IiksIWV8fGU9PT1OdSlyZXR1cm4gQnUmJihhZyhCdSksQnU9bnVsbCksITA9PT1MdT9yZy5uYXRpdmVVSS5jbG9zZVRvYXN0KCk6THUmJkx1LmNsb3NlJiZMdS5jbG9zZSgpLE51PUx1PW51bGwse2Vyck1zZzoiaGlkZTpvayJ9fXZhciBXdSxIdT17bGlnaHQ6e2l0ZW1Db2xvcjoiIzAwMDAwMCJ9LGRhcms6e2l0ZW1Db2xvcjoicmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpIn19O3ZhciBHdT17fTtmdW5jdGlvbiBYdShlKXt2YXIgbj1HdVtlXTtyZXR1cm4gbnx8KG49e2lkOjEsY2FsbGJhY2tzOk9iamVjdC5jcmVhdGUobnVsbCl9LEd1W2VdPW4pLHtnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG4uY2FsbGJhY2tzW2VdfSxwb3A6ZnVuY3Rpb24oZSl7dmFyIHQ9bi5jYWxsYmFja3NbZV07cmV0dXJuIHQmJmRlbGV0ZSBuLmNhbGxiYWNrc1tlXSx0fSxwdXNoOmZ1bmN0aW9uKGUpe3ZhciB0PW4uaWQrKztyZXR1cm4gbi5jYWxsYmFja3NbdF09ZSx0fX19dmFyIFl1PVh1KCJyZXF1ZXN0Q29tcG9uZW50SW5mbyIpO2Z1bmN0aW9uIEp1KG4pe3ZhciByPXt9O3JldHVybiBPYmplY3Qua2V5cyhufHx7fSkuZm9yRWFjaChmdW5jdGlvbihlKXtpZigwPT09ZS5pbmRleE9mKCJkYXRhIikpe3ZhciB0PWUucmVwbGFjZSgiZGF0YSIsIiIpO3Q9dC5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSt0LnNsaWNlKDEpLHJbdF09bltlXX19KSxyfWZ1bmN0aW9uIEt1KGUsdCxuKXt2YXIgcj1lLl8kd2VleC5yZXF1aXJlTW9kdWxlKCJkb20iKSxpPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl0uc2VsZWN0b3I7MD09PXIuaW5kZXhPZigiIyIpJiZ0LnB1c2goci5zdWJzdHJpbmcoMSkpfXJldHVybiB0fSh0KSxvPW5ldyBBcnJheShpLmxlbmd0aCk7IWZ1bmN0aW9uIGUodCxuLHIpe3ZhciBpPW4uY2hpbGRyZW47aWYoIUFycmF5LmlzQXJyYXkoaSkpcmV0dXJuITE7Zm9yKHZhciBvPTA7bzxpLmxlbmd0aDtvKyspe3ZhciBhPWlbb107aWYoYS5hdHRyKXt2YXIgcz10LmluZGV4T2YoYS5hdHRyLmlkKTtpZigwPD1zJiYocltzXT17aWQ6dFtzXSxyZWY6YS5yZWYsZGF0YXNldDpKdShhLmF0dHIpfSwxPT09dC5sZW5ndGgpKWJyZWFrfWEuY2hpbGRyZW4mJmUodCxhLHIpfX0oaSxlLiRlbCxvKSxmdW5jdGlvbiB0KG4scixpLG8sYSl7dmFyIHM9cltpXTtuLmdldENvbXBvbmVudFJlY3Qocy5yZWYsZnVuY3Rpb24oZSl7ZS5zaXplLmlkPXMuaWQsZS5zaXplLmRhdGFzZXQ9cy5kYXRhc2V0LG8ucHVzaChlLnNpemUpLChpKz0xKTxyLmxlbmd0aD90KG4scixpLG8sYSk6YShvKX0pfShyLG8sMCxbXSxmdW5jdGlvbihlKXtuKGUpfSl9ZnVuY3Rpb24gWnUoZSx0LG4scil7aWcucHVibGlzaEhhbmRsZXIodCx7dHlwZTpuLGRhdGE6cn0sZSl9aWcuc3Vic2NyaWJlKCJvbkFkTWV0aG9kQ2FsbGJhY2siLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jYWxsYmFja0lkOyFmdW5jdGlvbihlLG4sdCl7dmFyIHI9ZS5hZHBpZCxpPWUud2lkdGgsbz1yKyItIitpLGE9UXVbb107aWYoYSYmMDxhLmxlbmd0aClyZXR1cm4gbihhLnNwbGljZSgwLDEpWzBdKTtyZy5hZC5nZXRBZHMoZSxmdW5jdGlvbihlKXt2YXIgdD1lLmFkcztuKHQuc3BsaWNlKDAsMSlbMF0pLFF1W29dPWE/YS5jb25jYXQodCk6dH0sZnVuY3Rpb24oZSl7dCh7ZXJyQ29kZTplLmNvZGUsZXJyTXNnOmUubWVzc2FnZX0pfSl9KGUuZGF0YSxmdW5jdGlvbihlKXtadSh0LG4sInN1Y2Nlc3MiLGUpfSxmdW5jdGlvbihlKXtadSh0LG4sImZhaWwiLGUpfSl9KTt2YXIgUXU9e307dmFyIGVsPVsibG9hZCIsImNsb3NlIiwidmVyaWZ5IiwiZXJyb3IiLCJhZENsaWNrZWQiXSx0bD1bLTUwMDEsLTUwMDIsLTUwMDMsLTUwMDQsLTUwMDUsLTUwMDZdLG5sPXtjb2RlOi01MDA4LGVyck1zZzoi5bm/5ZGK5pWw5o2u5bey6L+H5pyf77yM6K+36YeN5paw5Yqg6L29In0scmw9ImNzaiIsaWw9ZnVuY3Rpb24oZSl7dmFyIGk9dGhpczt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49dGhpcy5fY2FsbGJhY2tzPXt9O2VsLmZvckVhY2goZnVuY3Rpb24odCl7blt0XT1bXTt2YXIgZT10WzBdLnRvVXBwZXJDYXNlKCkrdC5zdWJzdHIoMSk7aVsib24iK2VdPWZ1bmN0aW9uKGUpe25bdF0ucHVzaChlKX19KSx0aGlzLl9wcmVsb2FkPXZvaWQgMD09PWUucHJlbG9hZHx8ZS5wcmVsb2FkLHRoaXMuX2lzTG9hZD0hMSx0aGlzLl9pc0xvYWRpbmc9ITEsdGhpcy5fYWRFcnJvcj0iIix0aGlzLl9sb2FkUHJvbWlzZVJlc29sdmU9bnVsbCx0aGlzLl9sb2FkUHJvbWlzZVJlamVjdD1udWxsLHRoaXMuX2xhc3RMb2FkVGltZT0wO3ZhciB0PXRoaXMuX3Jld2FyZEFkPXJnLmFkLmNyZWF0ZVJld2FyZGVkVmlkZW9BZChlKTt0Lm9uTG9hZChmdW5jdGlvbihlKXtpLl9pc0xvYWQ9ITAsaS5faXNMb2FkaW5nPSExLGkuX2xhc3RMb2FkVGltZT1EYXRlLm5vdygpLGkuX2Rpc3BhdGNoRXZlbnQoImxvYWQiLHt9KSxudWxsIT1pLl9sb2FkUHJvbWlzZVJlc29sdmUmJihpLl9sb2FkUHJvbWlzZVJlc29sdmUoKSxpLl9sb2FkUHJvbWlzZVJlc29sdmU9bnVsbCl9KSx0Lm9uQ2xvc2UoZnVuY3Rpb24oZSl7aS5faXNMb2FkPSExLGkuX2lzTG9hZGluZz0hMSxpLl9wcmVsb2FkJiZpLl9sb2FkQWQoKSxpLl9kaXNwYXRjaEV2ZW50KCJjbG9zZSIse2lzRW5kZWQ6ZS5pc0VuZGVkfSl9KSx0Lm9uVmVyaWZ5JiZ0Lm9uVmVyaWZ5KGZ1bmN0aW9uKGUpe2kuX2Rpc3BhdGNoRXZlbnQoInZlcmlmeSIse2lzVmFsaWQ6ZS5pc1ZhbGlkfSl9KSx0Lm9uRXJyb3IoZnVuY3Rpb24oZSl7aS5faXNMb2FkaW5nPSExO3ZhciB0PWUuY29kZSxuPWUubWVzc2FnZSxyPXtjb2RlOnQsZXJyTXNnOm59O2kuX2FkRXJyb3I9biwtNTAwOD09PXQmJihpLl9pc0xvYWQ9ITEpLGkuX2Rpc3BhdGNoRXZlbnQoImVycm9yIixyKSwtNTAwNSE9PXQmJi0xIT09dGwuaW5kZXgodCl8fG51bGw9PWkuX2xvYWRQcm9taXNlUmVqZWN0fHwoaS5fbG9hZFByb21pc2VSZWplY3QociksaS5fbG9hZFByb21pc2VSZWplY3Q9bnVsbCl9KSx0Lm9uQWRDbGlja2VkKGZ1bmN0aW9uKGUpe2kuX2Rpc3BhdGNoRXZlbnQoImFkQ2xpY2tlZCIse30pfSksdGhpcy5fbG9hZEFkKCl9LG9sPXtpc0V4cGlyZWQ6e2NvbmZpZ3VyYWJsZTohMH19O29sLmlzRXhwaXJlZC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gMCE9PXRoaXMuX2xhc3RMb2FkVGltZSYmMThlNTxNYXRoLmFicyhEYXRlLm5vdygpLXRoaXMuX2xhc3RMb2FkVGltZSl9LGlsLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKCl7dmFyIG49dGhpcztyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSx0KXtuLl9sb2FkUHJvbWlzZVJlc29sdmU9ZSxuLl9sb2FkUHJvbWlzZVJlamVjdD10LG4uX2lzTG9hZGluZ3x8KG4uX2lzTG9hZD9lKCk6bi5fbG9hZEFkKCkpfSl9LGlsLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dmFyIG49dGhpcztyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSx0KXtpZighbi5faXNMb2FkaW5nKXtpZihuLmdldFByb3ZpZGVyKCk9PT1ybCYmbi5pc0V4cGlyZWQpcmV0dXJuIG4uX2lzTG9hZD0hMSxuLl9kaXNwYXRjaEV2ZW50KCJlcnJvciIsbmwpLHZvaWQgdChuZXcgRXJyb3IobmwuZXJyTXNnKSk7bi5faXNMb2FkPyhuLl9yZXdhcmRBZC5zaG93KCksZSgpKTp0KG5ldyBFcnJvcihuLl9hZEVycm9yKSl9fSl9LGlsLnByb3RvdHlwZS5nZXRQcm92aWRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZXdhcmRBZC5nZXRQcm92aWRlcigpfSxpbC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuX3Jld2FyZEFkLmRlc3Ryb3koKX0saWwucHJvdG90eXBlLl9sb2FkQWQ9ZnVuY3Rpb24oKXt0aGlzLl9pc0xvYWQ9ITEsdGhpcy5faXNMb2FkaW5nPSEwLHRoaXMuX3Jld2FyZEFkLmxvYWQoKX0saWwucHJvdG90eXBlLl9kaXNwYXRjaEV2ZW50PWZ1bmN0aW9uKGUsdCl7dGhpcy5fY2FsbGJhY2tzW2VdLmZvckVhY2goZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUodHx8e30pfSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGlsLnByb3RvdHlwZSxvbCk7dmFyIGFsPSJsb2FkIixzbD0iY2xvc2UiLGNsPSJlcnJvciIsdWw9ImFkQ2xpY2tlZCIsbGw9W2FsLHNsLGNsLHVsXSxkbD1mdW5jdGlvbihlLHQpe3ZhciByPXRoaXMsbj10aGlzLl9jYWxsYmFja3M9e307bGwuZm9yRWFjaChmdW5jdGlvbih0KXtuW3RdPVtdO3ZhciBlPXRbMF0udG9VcHBlckNhc2UoKSt0LnN1YnN0cigxKTtyWyJvbiIrZV09ZnVuY3Rpb24oZSl7blt0XS5wdXNoKGUpfX0pLHRoaXMuX3ByZWxvYWQ9dm9pZCAwIT09dC5wcmVsb2FkJiZ0LnByZWxvYWQsdGhpcy5faXNMb2FkZWQ9ITEsdGhpcy5faXNMb2FkaW5nPSExLHRoaXMuX2FkRXJyb3I9IiIsdGhpcy5fbG9hZFByb21pc2VSZXNvbHZlPW51bGwsdGhpcy5fbG9hZFByb21pc2VSZWplY3Q9bnVsbCx0aGlzLl9zaG93UHJvbWlzZVJlc29sdmU9bnVsbCx0aGlzLl9zaG93UHJvbWlzZVJlamVjdD1udWxsO3ZhciBpPXRoaXMuX2FkPWU7aS5vbkxvYWQoZnVuY3Rpb24oZSl7ci5faXNMb2FkZWQ9ITAsci5faXNMb2FkaW5nPSExLG51bGwhPXIuX2xvYWRQcm9taXNlUmVzb2x2ZSYmKHIuX2xvYWRQcm9taXNlUmVzb2x2ZSgpLHIuX2xvYWRQcm9taXNlUmVzb2x2ZT1udWxsKSxudWxsIT1yLl9zaG93UHJvbWlzZVJlc29sdmUmJihyLl9zaG93UHJvbWlzZVJlc29sdmUoKSxyLl9zaG93UHJvbWlzZVJlc29sdmU9bnVsbCxyLl9zaG93QWQoKSksci5fZGlzcGF0Y2hFdmVudChhbCx7fSl9KSxpLm9uQ2xvc2UoZnVuY3Rpb24oZSl7ci5faXNMb2FkZWQ9ITEsci5faXNMb2FkaW5nPSExLHIuX2Rpc3BhdGNoRXZlbnQoc2wse2lzRW5kZWQ6ZS5pc0VuZGVkfSksITA9PT1yLl9wcmVsb2FkJiZyLl9sb2FkQWQoKX0pLGkub25FcnJvcihmdW5jdGlvbihlKXtyLl9pc0xvYWRpbmc9ITE7dmFyIHQ9e2NvZGU6ZS5jb2RlLGVyckNvZGU6ZS5jb2RlLGVyck1zZzplLm1lc3NhZ2UsZGV0YWlsOmUuZGV0YWlsfTtyLl9hZEVycm9yPXQsci5fZGlzcGF0Y2hFdmVudChjbCx0KTt2YXIgbj1uZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoci5fYWRFcnJvcikpO24uY29kZT1lLmNvZGUsbi5lcnJNc2c9ZS5tZXNzYWdlLG4uZGV0YWlsPWUuZGV0YWlsLG51bGwhPXIuX2xvYWRQcm9taXNlUmVqZWN0JiYoci5fbG9hZFByb21pc2VSZWplY3Qobiksci5fbG9hZFByb21pc2VSZWplY3Q9bnVsbCksbnVsbCE9ci5fc2hvd1Byb21pc2VSZWplY3QmJihyLl9zaG93UHJvbWlzZVJlamVjdChuKSxyLl9zaG93UHJvbWlzZVJlamVjdD1udWxsKX0pLGkub25BZENsaWNrZWQmJmkub25BZENsaWNrZWQoZnVuY3Rpb24oZSl7ci5fZGlzcGF0Y2hFdmVudCh1bCx7fSl9KX07ZGwucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oKXt2YXIgbj10aGlzO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlLHQpe24uX2xvYWRQcm9taXNlUmVzb2x2ZT1lLG4uX2xvYWRQcm9taXNlUmVqZWN0PXQsbi5faXNMb2FkaW5nfHwobi5faXNMb2FkZWQ/ZSgpOm4uX2xvYWRBZCgpKX0pfSxkbC5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe3ZhciBuPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUsdCl7bi5fc2hvd1Byb21pc2VSZXNvbHZlPWUsbi5fc2hvd1Byb21pc2VSZWplY3Q9dCxuLl9pc0xvYWRpbmd8fChuLl9pc0xvYWRlZD8obi5fc2hvd0FkKCksZSgpKTpuLl9sb2FkQWQoKSl9KX0sZGwucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLl9hZC5kZXN0cm95KCl9LGRsLnByb3RvdHlwZS5nZXRQcm92aWRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hZC5nZXRQcm92aWRlcigpfSxkbC5wcm90b3R5cGUuX2xvYWRBZD1mdW5jdGlvbigpe3RoaXMuX2FkRXJyb3I9IiIsdGhpcy5faXNMb2FkZWQ9ITEsdGhpcy5faXNMb2FkaW5nPSEwLHRoaXMuX2FkLmxvYWQoKX0sZGwucHJvdG90eXBlLl9zaG93QWQ9ZnVuY3Rpb24oKXt0aGlzLl9hZC5zaG93KCl9LGRsLnByb3RvdHlwZS5fZGlzcGF0Y2hFdmVudD1mdW5jdGlvbihlLHQpe3RoaXMuX2NhbGxiYWNrc1tlXS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlKHR8fHt9KX0pfTt2YXIgZmw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2b2lkIDA9PT1lJiYoZT17fSksdC5jYWxsKHRoaXMscmcuYWQuY3JlYXRlRnVsbFNjcmVlblZpZGVvQWQoZSksZSl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSwoZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWV9KGRsKTt2YXIgcGw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2b2lkIDA9PT1lJiYoZT17fSksdC5jYWxsKHRoaXMscmcuYWQuY3JlYXRlSW50ZXJzdGl0aWFsQWQoZSksZSksdGhpcy5fbG9hZEFkKCl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSwoZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWV9KGRsKTt2YXIgaGw9e30sdmw9e307dmFyIGdsPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMscj10aGlzLl9jYWxsYmFja3M9e307bGwuZm9yRWFjaChmdW5jdGlvbih0KXtyW3RdPVtdO3ZhciBlPXRbMF0udG9VcHBlckNhc2UoKSt0LnN1YnN0cigxKTtuWyJvbiIrZV09ZnVuY3Rpb24oZSl7clt0XS5wdXNoKGUpfX0pLHRoaXMuX2FkPW51bGwsdGhpcy5fYWRFcnJvcj0iIix0aGlzLl9hZHBpZD1lLmFkcGlkLHRoaXMuX3Byb3ZpZGVyPWUucHJvdmlkZXIsdGhpcy5fdXNlckRhdGE9ZS51c2VyRGF0YXx8e30sdGhpcy5faXNMb2FkZWQ9ITEsdGhpcy5faXNMb2FkaW5nPSExLHRoaXMuX2xvYWRQcm9taXNlUmVzb2x2ZT1udWxsLHRoaXMuX2xvYWRQcm9taXNlUmVqZWN0PW51bGwsdGhpcy5fc2hvd1Byb21pc2VSZXNvbHZlPW51bGwsdGhpcy5fc2hvd1Byb21pc2VSZWplY3Q9bnVsbCxvZyhmdW5jdGlvbigpe24uX2luaXQoKX0pfTtnbC5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX2FkRXJyb3I9IiIsZnVuY3Rpb24oZSl7dmFyIHI9ZS5wcm92aWRlcjtpZihobFtyXXx8KGhsW3JdPXt9KSwib2JqZWN0IiE9dHlwZW9mIGhsW3JdLmluc3RhbmNlKWlmKHZsW3JdfHwodmxbcl09W10pLHZsW3JdLnB1c2goZSksITAhPT1obFtyXS5sb2FkaW5nKXtobFtyXS5sb2FkaW5nPSEwO3ZhciBpPXBpKHIpfHx7fSx0PWkuaW5pdHx8aS5pbml0U0RLO2lmKCF0KXJldHVybiB2bFtyXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuZmFpbCh7Y29kZTotMSxtZXNzYWdlOiJwcm92aWRlciBbIityKyJdIGludmFsaWQifSl9KSx2bFtyXS5sZW5ndGg9MCxobFtyXS5sb2FkaW5nPSExO2hsW3JdLnBsdWdpbj1pLGUuX19wbHVnaW49aSx0KGZ1bmN0aW9uKHQpe3ZhciBlPXQuY29kZSxuPSJCWE0tQUQiPT09cj8wPT09ZXx8MT09PWU6MD09PWU7bj9obFtyXS5pbnN0YW5jZT1pOmhsW3JdLmxvYWRpbmc9ITEsdmxbcl0uZm9yRWFjaChmdW5jdGlvbihlKXtuP2Uuc3VjY2VzcyhlLl9fcGx1Z2luKTplLmZhaWwodCl9KSx2bFtyXS5sZW5ndGg9MH0pfWVsc2UgZS5fX3BsdWdpbj1obFtyXS5wbHVnaW47ZWxzZSBlLnN1Y2Nlc3MoaGxbcl0uaW5zdGFuY2UpfSh7cHJvdmlkZXI6dGhpcy5fcHJvdmlkZXIsc3VjY2VzczpmdW5jdGlvbihlKXt0Ll9hZD1lLHQuX3VzZXJEYXRhJiZ0LmJpbmRVc2VyRGF0YSh0Ll91c2VyRGF0YSksdC5fbG9hZEFkKCl9LGZhaWw6ZnVuY3Rpb24oZSl7dC5fYWRFcnJvcj1lLHQuX2Rpc3BhdGNoRXZlbnQoY2wsZSl9fSl9LGdsLnByb3RvdHlwZS5nZXRQcm92aWRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm92aWRlcn0sZ2wucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oKXt2YXIgbj10aGlzO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlLHQpe24uX2xvYWRQcm9taXNlUmVzb2x2ZT1lLG4uX2xvYWRQcm9taXNlUmVqZWN0PXQsbi5faXNMb2FkaW5nfHwobi5fYWRFcnJvcj9uLl9pbml0KCk6bi5faXNMb2FkZWQ/ZSgpOm4uX2xvYWRBZCgpKX0pfSxnbC5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe3ZhciBuPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUsdCl7bi5fc2hvd1Byb21pc2VSZXNvbHZlPWUsbi5fc2hvd1Byb21pc2VSZWplY3Q9dCxuLl9pc0xvYWRpbmd8fChuLl9hZEVycm9yP24uX2luaXQoKTpuLl9pc0xvYWRlZD8obi5fc2hvd0FkKCksZSgpKTpuLl9sb2FkQWQoKSl9KX0sZ2wucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5fYWQmJnRoaXMuX2FkLmRlc3Ryb3kmJnRoaXMuX2FkLmRlc3Ryb3koe2FkcGlkOnRoaXMuX2FkcGlkfSl9LGdsLnByb3RvdHlwZS5iaW5kVXNlckRhdGE9ZnVuY3Rpb24oZSl7bnVsbCE9PXRoaXMuX2FkJiZ0aGlzLl9hZC5iaW5kVXNlckRhdGEmJnRoaXMuX2FkLmJpbmRVc2VyRGF0YShlKX0sZ2wucHJvdG90eXBlLl9sb2FkQWQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKG51bGwhPT10aGlzLl9hZCl7aWYoITA9PT10aGlzLl9pc0xvYWRpbmcpcmV0dXJuO3RoaXMuX2lzTG9hZGluZz0hMCx0aGlzLl9hZC5sb2FkRGF0YShPYmplY3QuYXNzaWduKHt9LHthZHBpZDp0aGlzLl9hZHBpZH0sdGhpcy5fdXNlckRhdGEpLGZ1bmN0aW9uKGUpe3QuX2lzTG9hZGVkPSEwLHQuX2lzTG9hZGluZz0hMSxudWxsIT10Ll9sb2FkUHJvbWlzZVJlc29sdmUmJih0Ll9sb2FkUHJvbWlzZVJlc29sdmUoKSx0Ll9sb2FkUHJvbWlzZVJlc29sdmU9bnVsbCksbnVsbCE9dC5fc2hvd1Byb21pc2VSZXNvbHZlJiYodC5fc2hvd1Byb21pc2VSZXNvbHZlKCksdC5fc2hvd1Byb21pc2VSZXNvbHZlPW51bGwsdC5fc2hvd0FkKCkpLHQuX2Rpc3BhdGNoRXZlbnQoYWwsZSl9LGZ1bmN0aW9uKGUpe3QuX2lzTG9hZGluZz0hMSxudWxsIT10Ll9zaG93UHJvbWlzZVJlamVjdCYmKHQuX3Nob3dQcm9taXNlUmVqZWN0KHQuX2NyZWF0ZUVycm9yKGUpKSx0Ll9zaG93UHJvbWlzZVJlamVjdD1udWxsKSx0Ll9kaXNwYXRjaEV2ZW50KGNsLGUpfSl9fSxnbC5wcm90b3R5cGUuX3Nob3dBZD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7bnVsbCE9PXRoaXMuX2FkJiYhMD09PXRoaXMuX2lzTG9hZGVkJiZ0aGlzLl9hZC5zaG93KHthZHBpZDp0aGlzLl9hZHBpZH0sZnVuY3Rpb24oZSl7dC5faXNMb2FkZWQ9ITF9LGZ1bmN0aW9uKGUpe3QuX2lzTG9hZGVkPSExLG51bGwhPXQuX3Nob3dQcm9taXNlUmVqZWN0JiYodC5fc2hvd1Byb21pc2VSZWplY3QodC5fY3JlYXRlRXJyb3IoZSkpLHQuX3Nob3dQcm9taXNlUmVqZWN0PW51bGwpLHQuX2Rpc3BhdGNoRXZlbnQoY2wsZSl9KX0sZ2wucHJvdG90eXBlLl9jcmVhdGVFcnJvcj1mdW5jdGlvbihlKXt2YXIgdD1uZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoZSkpO3JldHVybiB0LmNvZGU9ZS5jb2RlLHQuZXJyTXNnPWUubWVzc2FnZSx0fSxnbC5wcm90b3R5cGUuX2Rpc3BhdGNoRXZlbnQ9ZnVuY3Rpb24oZSx0KXt0aGlzLl9jYWxsYmFja3NbZV0uZm9yRWFjaChmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmZSh0fHx7fSl9KX07dmFyIG1sPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGluaXRVVFNQcm94eUNsYXNzOnd1LGluaXRVVFNQcm94eUZ1bmN0aW9uOnl1LGluaXRVVFNJbmRleENsYXNzTmFtZTpmdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT1yZz8iIjprdShlLCJpT1MiPT09cmcub3MubmFtZT8iSW5kZXhTd2lmdCI6IkluZGV4S3QiLHQpfSxpbml0VVRTQ2xhc3NOYW1lOmt1LGluaXRVVFNQYWNrYWdlTmFtZTpmdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDAhPT1yZyYmIkFuZHJvaWQiPT09cmcub3MubmFtZT8idXRzLnNkay4iKyh0PyJtb2R1bGVzLiI6IiIpK2U6IiJ9LHJlcXVpcmVVVFNQbHVnaW46ZnVuY3Rpb24oZSl7dmFyIHQ9eHVbZV07cmV0dXJuIHR8fGNvbnNvbGUuZXJyb3IoZSsiIGlzIG5vdCBmb3VuZCIpLHR9LHJlZ2lzdGVyVVRTUGx1Z2luOmZ1bmN0aW9uKGUsdCl7eHVbZV09dH0scmVnaXN0ZXJVVFNJbnRlcmZhY2U6ZnVuY3Rpb24oZSx0KXtTdVtlXT10fSxzdGFydFB1bGxEb3duUmVmcmVzaDpmdW5jdGlvbigpe3JldHVybiBXdSYmV3UuZW5kUHVsbFRvUmVmcmVzaCgpLChXdT1TaSgpKT8oV3UuYmVnaW5QdWxsVG9SZWZyZXNoKCkse2Vyck1zZzoic3RhcnRQdWxsRG93blJlZnJlc2g6b2sifSk6e2Vyck1zZzoic3RhcnRQdWxsRG93blJlZnJlc2g6ZmFpbCJ9fSxzdG9wUHVsbERvd25SZWZyZXNoOmZ1bmN0aW9uKCl7cmV0dXJuIFd1fHwoV3U9U2koKSksV3U/KFd1LmVuZFB1bGxUb1JlZnJlc2goKSxXdT1udWxsLHtlcnJNc2c6InN0b3BQdWxsRG93blJlZnJlc2g6b2sifSk6e2Vyck1zZzoic3RvcFB1bGxEb3duUmVmcmVzaDpmYWlsIn19LCRvbjphaSwkb2ZmOnNpLCRvbmNlOmNpLCRlbWl0OnVpLGNyZWF0ZUF1ZGlvSW5zdGFuY2U6ZnVuY3Rpb24oKXt2YXIgZT0iIitEYXRlLm5vdygpK01hdGgucmFuZG9tKCksdD1GaVtlXT1yZy5hdWRpby5jcmVhdGVQbGF5ZXIoIiIpO3JldHVybiB0LnNyYz0iIix0LnZvbHVtZT0xLHQuc3RhcnRUaW1lPTAsdC5zZXRTZXNzaW9uQ2F0ZWdvcnkoUmkpLHtlcnJNc2c6ImNyZWF0ZUF1ZGlvSW5zdGFuY2U6b2siLGF1ZGlvSWQ6ZX19LGRlc3Ryb3lBdWRpb0luc3RhbmNlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuYXVkaW9JZDtyZXR1cm4gRmlbdF0mJihGaVt0XS5jbG9zZSgpLGRlbGV0ZSBGaVt0XSkse2Vyck1zZzoiZGVzdHJveUF1ZGlvSW5zdGFuY2U6b2siLGF1ZGlvSWQ6dH19LHNldEF1ZGlvU3RhdGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hdWRpb0lkLG49ZS5zcmMscj1lLnN0YXJ0VGltZSxpPWUuYXV0b3BsYXk7dm9pZCAwPT09aSYmKGk9ITEpO3ZhciBvPWUubG9vcDt2b2lkIDA9PT1vJiYobz0hMSksZS5vYmV5TXV0ZVN3aXRjaDt2YXIgYT1lLnZvbHVtZSxzPWUuc2Vzc2lvbkNhdGVnb3J5O3ZvaWQgMD09PXMmJihzPVJpKTt2YXIgYyx1LGw9ZS5wbGF5YmFja1JhdGUsZD1GaVt0XTtpZihkKXt2YXIgZj17bG9vcDpvLGF1dG9wbGF5Oml9O2lmKG4pe3ZhciBwPVRpKG4pO2Quc3JjIT09cCYmKGQuc3JjPWYuc3JjPXApfXImJihkLnN0YXJ0VGltZT1mLnN0YXJ0VGltZT1yKSwibnVtYmVyIj09dHlwZW9mIGEmJihkLnZvbHVtZT1mLnZvbHVtZT1hKSxkLnNldFN0eWxlcyhmKSxzJiZkLnNldFNlc3Npb25DYXRlZ29yeShzKSxsJiZkLnBsYXliYWNrUmF0ZSYmZC5wbGF5YmFja1JhdGUobCksKHU9RmlbYz10XSkmJih1LmluaXRTdGF0ZUNoYWdlfHwodS5pbml0U3RhdGVDaGFnZT0hMCx1LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihlKXtVaSgiZXJyb3IiLHthdWRpb0lkOmMsZXJyTXNnOiJNZWRpYUVycm9yIixlcnJDb2RlOmUuY29kZX0pfSksemkuZm9yRWFjaChmdW5jdGlvbihlKXt1LmFkZEV2ZW50TGlzdGVuZXIoZSxmdW5jdGlvbigpeyJwbGF5Ij09PWU/dS5pc1N0b3BwZWQ9ITE6InN0b3AiPT09ZSYmKHUuaXNTdG9wcGVkPSEwKSxVaShlLHthdWRpb0lkOmN9KX0pfSkpKX1yZXR1cm57ZXJyTXNnOiJzZXRBdWRpb1N0YXRlOm9rIn19LGdldEF1ZGlvU3RhdGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hdWRpb0lkLG49RmlbdF07aWYoIW4pcmV0dXJue2Vyck1zZzoiZ2V0QXVkaW9TdGF0ZTpmYWlsIn07dmFyIHI9bi5zcmMsaT1uLnN0YXJ0VGltZSxvPW4udm9sdW1lO3JldHVybntlcnJNc2c6ImdldEF1ZGlvU3RhdGU6b2siLGR1cmF0aW9uOjFlMyoobi5nZXREdXJhdGlvbigpfHwwKSxjdXJyZW50VGltZTpuLmlzU3RvcHBlZD8wOjFlMypuLmdldFBvc2l0aW9uKCkscGF1c2VkOm4uaXNQYXVzZWQoKSxzcmM6cix2b2x1bWU6byxzdGFydFRpbWU6MWUzKmksYnVmZmVyZWQ6MWUzKm4uZ2V0QnVmZmVyZWQoKX19LG9wZXJhdGVBdWRpbzpmdW5jdGlvbihlKXt2YXIgdD1lLm9wZXJhdGlvblR5cGUsbj1lLmF1ZGlvSWQscj1lLmN1cnJlbnRUaW1lLGk9Rmlbbl0sbz1bInBsYXkiLCJwYXVzZSIsInN0b3AiXTtyZXR1cm4gMDw9by5pbmRleE9mKHQpP2lbdD09PW9bMF0mJmkuaXNQYXVzZWQoKT8icmVzdW1lIjp0XSgpOiJzZWVrIj09PXQmJmkuc2Vla1RvKHIvMWUzKSx7ZXJyTXNnOiJvcGVyYXRlQXVkaW86b2sifX0sZ2V0TXVzaWNQbGF5ZXJTdGF0ZTpmdW5jdGlvbigpe3ZhciBlPUppKCk7cmV0dXJuIGU/e2RhdGFVcmw6ZS5zcmMsZHVyYXRpb246ZS5nZXREdXJhdGlvbigpfHwwLGN1cnJlbnRQb3NpdGlvbjplLmdldFBvc2l0aW9uKCksc3RhdHVzOmUuaXNQYXVzZWQoKT8wOjEsZG93bmxvYWRQZXJjZW50Ok1hdGgucm91bmQoMTAwKmUuZ2V0QnVmZmVyZWQoKS9lLmdldER1cmF0aW9uKCkpLGVyck1zZzoiZ2V0TXVzaWNQbGF5ZXJTdGF0ZTpvayJ9OntzdGF0dXM6MixlcnJNc2c6ImdldE11c2ljUGxheWVyU3RhdGU6b2sifX0sb3BlcmF0ZU11c2ljUGxheWVyOktpLHNldEJhY2tncm91bmRBdWRpb1N0YXRlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFlpKGUsdCkse2Vyck1zZzoic2V0QmFja2dyb3VuZEF1ZGlvU3RhdGU6b2sifX0sb3BlcmF0ZUJhY2tncm91bmRBdWRpbzpmdW5jdGlvbihlKXt2YXIgdD1lLm9wZXJhdGlvblR5cGUsbj1lLnNyYyxyPWUuc3RhcnRUaW1lLGk9ZS5jdXJyZW50VGltZTtyZXR1cm4gS2koe29wZXJhdGlvblR5cGU6dCxkYXRhVXJsOm4scG9zaXRpb246cnx8aXx8MCxhcGk6Im9wZXJhdGVCYWNrZ3JvdW5kQXVkaW8ifSl9LGdldEJhY2tncm91bmRBdWRpb1N0YXRlOmZ1bmN0aW9uKCl7dmFyIGU9e2R1cmF0aW9uOjAsY3VycmVudFRpbWU6MCxwYXVzZWQ6ITEsc3JjOiIiLGJ1ZmZlcmVkOjAsdGl0bGU6IiIsZXBuYW1lOiIiLHNpbmdlcjoiIixjb3ZlckltZ1VybDoiIix3ZWJVcmw6IiIsc3RhcnRUaW1lOjAsZXJyTXNnOiJnZXRCYWNrZ3JvdW5kQXVkaW9TdGF0ZTpvayJ9LHQ9SmkoKTtpZih0KXt2YXIgbj17ZHVyYXRpb246dC5nZXREdXJhdGlvbigpfHwwLGN1cnJlbnRUaW1lOnQuaXNTdG9wcGVkPzA6dC5nZXRQb3NpdGlvbigpLHBhdXNlZDp0LmlzUGF1c2VkKCksc3JjOnQuc3JjLGJ1ZmZlcmVkOnQuZ2V0QnVmZmVyZWQoKSx0aXRsZTp0LnRpdGxlLGVwbmFtZTp0LmVwbmFtZSxzaW5nZXI6dC5zaW5nZXIsY292ZXJJbWdVcmw6dC5jb3ZlckltZ1VybCx3ZWJVcmw6dC53ZWJVcmwsc3RhcnRUaW1lOnQuc3RhcnRUaW1lfTtlPU9iamVjdC5hc3NpZ24oZSxuKX1yZXR1cm4gZX0sb3BlcmF0ZU1hcFBsYXllcjpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscyxjLHUsbDt0LiRwYWdlLm1ldGEuaXNOVnVlPyhjPWUsdT10LGw9cixhb1tuXShybyhjLHUpLGwpKTooaT1lLG89bixhPXIscz10LiRwYWdlLmlkLGlnLnB1Ymxpc2hIYW5kbGVyKHMrIi1tYXAtIitpLHttYXBJZDppLHR5cGU6byxkYXRhOmF9LHMpKX0sb3BlcmF0ZVZpZGVvUGxheWVyOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzLGMsdSxsO3QuJHBhZ2UubWV0YS5pc05WdWU/KGM9ZSx1PXQsbD1yLHNvW25dKHJvKGMsdSksbCkpOihpPWUsbz1uLGE9cixzPXQuJHBhZ2UuaWQsaWcucHVibGlzaEhhbmRsZXIocysiLXZpZGVvLSIraSx7dmlkZW9JZDppLHR5cGU6byxkYXRhOmF9LHMpKX0sTGl2ZVB1c2hlckNvbnRleHQ6Zm8sY3JlYXRlTGl2ZVB1c2hlckNvbnRleHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC4kcGFnZS5tZXRhLmlzTlZ1ZT9mdW5jdGlvbihlLHQpe2lmKCF0KXJldHVybiBjb25zb2xlLndhcm4oInVuaS5jcmVhdGVMaXZlUHVzaGVyQ29udGV4dDogMiBhcmd1bWVudHMgcmVxdWlyZWQsIGJ1dCBvbmx5IDEgcHJlc2VudCIpO3ZhciBuPXJvKGUsdCk7cmV0dXJuIG4/bmV3IGNvKGUsbik6Y29uc29sZS53YXJuKCJDYW4gbm90IGZpbmQgYCIrZSsiYCIpfShlLHQpOm5ldyBmbyhlLHQpfSxzdGFydEFjY2VsZXJvbWV0ZXI6Ym8sc3RvcEFjY2VsZXJvbWV0ZXI6d28sb25BY2NlbGVyb21ldGVyQ2hhbmdlOmZ1bmN0aW9uKGUpe19vLmxlbmd0aHx8Ym8oKSxfby5wdXNoKGUpfSxvZmZBY2NlbGVyb21ldGVyQ2hhbmdlOmZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PV9vLmluZGV4T2YoZSk7MDw9dCYmX28uc3BsaWNlKHQsMSl9X28ubGVuZ3RofHx3bygpfSxhZGRQaG9uZUNvbnRhY3Q6ZnVuY3Rpb24obixyKXtyZy5jb250YWN0cy5nZXRBZGRyZXNzQm9vayhyZy5jb250YWN0cy5BRERSRVNTQk9PS19QSE9ORSxmdW5jdGlvbihlKXshbi5waG90b0ZpbGVQYXRoJiYobi5waG90b0ZpbGVQYXRoPSIiKTt2YXIgdD1lLmNyZWF0ZSgpOyFmdW5jdGlvbiByKGksbyx0KXt2YXIgYT0wO3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3ZhciBlPXRbbl07Im9iamVjdCIhPXR5cGVvZiBlPy0xIT09U28uaW5kZXhPZihuKT9pW25dPXRbbl06dm9pZCAwIT09b1tlXT8oYSsrLGlbbl09b1tlXSk6ZGVsZXRlIGlbbl06ZSBpbnN0YW5jZW9mIEFycmF5PyhpW25dPVtdLGUuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD17fTtyKHQsbyxlKSYmaVtuXS5wdXNoKHQpfSksaVtuXS5sZW5ndGg/YSsrOmRlbGV0ZSBpW25dKTooaVtuXT17fSxyKGlbbl0sbyxlKT9hKys6ZGVsZXRlIGlbbl0pfSksYX0odCxuLGtvKSx0LnNhdmUoZnVuY3Rpb24oKXtmaShyLHtlcnJNc2c6ImFkZFBob25lQ29udGFjdDpvayJ9KX0sZnVuY3Rpb24oZSl7Zmkocix7ZXJyTXNnOiJhZGRQaG9uZUNvbnRhY3Q6ZmFpbCJ9KX0pfSxmdW5jdGlvbihlKXtmaShyLHtlcnJNc2c6ImFkZFBob25lQ29udGFjdDpmYWlsIn0pfSl9LG9uQmx1ZXRvb3RoRGV2aWNlRm91bmQ6eG8sb25CbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2U6Q28sb25CTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2U6VG8sb25CTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlOk9vLG9wZW5CbHVldG9vdGhBZGFwdGVyOklvLGNsb3NlQmx1ZXRvb3RoQWRhcHRlcjokbyxnZXRCbHVldG9vdGhBZGFwdGVyU3RhdGU6UG8sc3RhcnRCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5Ok1vLHN0b3BCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5OmpvLGdldEJsdWV0b290aERldmljZXM6TG8sZ2V0Q29ubmVjdGVkQmx1ZXRvb3RoRGV2aWNlczpObyxjcmVhdGVCTEVDb25uZWN0aW9uOkJvLGNsb3NlQkxFQ29ubmVjdGlvbjpEbyxnZXRCTEVEZXZpY2VTZXJ2aWNlczpSbyxnZXRCTEVEZXZpY2VDaGFyYWN0ZXJpc3RpY3M6Rm8sbm90aWZ5QkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZTp6byxyZWFkQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZTpVbyx3cml0ZUJMRUNoYXJhY3RlcmlzdGljVmFsdWU6Vm8sc2V0QkxFTVRVOnFvLGdldEJMRURldmljZVJTU0k6V28sZ2V0U2NyZWVuQnJpZ2h0bmVzczpmdW5jdGlvbigpe3JldHVybntlcnJNc2c6ImdldFNjcmVlbkJyaWdodG5lc3M6b2siLHZhbHVlOnJnLnNjcmVlbi5nZXRCcmlnaHRuZXNzKCExKX19LHNldFNjcmVlbkJyaWdodG5lc3M6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUudmFsdWU7cmV0dXJuIHJnLnNjcmVlbi5zZXRCcmlnaHRuZXNzKHQsITEpLHtlcnJNc2c6InNldFNjcmVlbkJyaWdodG5lc3M6b2sifX0sc2V0S2VlcFNjcmVlbk9uOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLmtlZXBTY3JlZW5PbjtyZXR1cm4gcmcuZGV2aWNlLnNldFdha2Vsb2NrKCEhdCkse2Vyck1zZzoic2V0S2VlcFNjcmVlbk9uOm9rIn19LGdldENsaXBib2FyZERhdGE6ZnVuY3Rpb24oZSx0KXtwaSgiY2xpcGJvYXJkIikuZ2V0U3RyaW5nKGZ1bmN0aW9uKGUpeyJzdWNjZXNzIj09PWUucmVzdWx0P2ZpKHQse2RhdGE6ZS5kYXRhLGVyck1zZzoiZ2V0Q2xpcGJvYXJkRGF0YTpvayJ9KTpmaSh0LHtkYXRhOmUucmVzdWx0LGVyck1zZzoiZ2V0Q2xpcGJvYXJkRGF0YTpmYWlsIn0pfSl9LHNldENsaXBib2FyZERhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kYXRhO3JldHVybiBwaSgiY2xpcGJvYXJkIikuc2V0U3RyaW5nKHQpLHtlcnJNc2c6InNldENsaXBib2FyZERhdGE6b2sifX0sc3RhcnRDb21wYXNzOkdvLHN0b3BDb21wYXNzOlhvLG9uQ29tcGFzc0NoYW5nZTpmdW5jdGlvbihlKXtIby5sZW5ndGh8fEdvKCksSG8ucHVzaChlKX0sb2ZmQ29tcGFzc0NoYW5nZTpmdW5jdGlvbihlKXtpZihlKXt2YXIgdD1Iby5pbmRleE9mKGUpOzA8PXQmJkhvLnNwbGljZSh0LDEpfUhvLmxlbmd0aHx8WG8oKX0sZ2V0TmV0d29ya1R5cGU6ZnVuY3Rpb24oKXtyZXR1cm57ZXJyTXNnOiJnZXROZXR3b3JrVHlwZTpvayIsbmV0d29ya1R5cGU6dm9bcmcubmV0d29ya2luZm8uZ2V0Q3VycmVudFR5cGUoKV18fCJ1bmtub3duIn19LG9uQmVhY29uVXBkYXRlOllvLG9uQmVhY29uU2VydmljZUNoYW5nZTpKbyxnZXRCZWFjb25zOktvLHN0YXJ0QmVhY29uRGlzY292ZXJ5OlpvLHN0b3BCZWFjb25EaXNjb3Zlcnk6UW8sbWFrZVBob25lQ2FsbDpmdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS5waG9uZU51bWJlcjtyZXR1cm4gcmcuZGV2aWNlLmRpYWwodCkse2Vyck1zZzoibWFrZVBob25lQ2FsbDpvayJ9fSxzY2FuQ29kZTpmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTt2YXIgbj0id2VleCIhPT11Zy5udnVlQ29tcGlsZXI/UGE6Q2E7cmV0dXJuIG4uc2NhbkNvZGUuYXBwbHkobixlKX0sY2hlY2tJc1N1cHBvcnRTb3RlckF1dGhlbnRpY2F0aW9uOkxhLGNoZWNrSXNTb3RlckVucm9sbGVkSW5EZXZpY2U6TmEsc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUucmVxdWVzdEF1dGhNb2RlcyxyPWUuY2hhbGxlbmdlO3ZvaWQgMD09PXImJihyPSExKTt2YXIgaT1lLmF1dGhDb250ZW50LG89TGEoKS5zdXBwb3J0TW9kZTtpZigwPT09by5sZW5ndGgpcmV0dXJue2F1dGhNb2RlOm9bMF18fCJmaW5nZXJQcmludCIsZXJyQ29kZTo5MDAwMSxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIG5vdCBzdXBwb3J0In07dmFyIGE9W107aWYobi5tYXAoZnVuY3Rpb24oZSx0KXstMTxvLmluZGV4T2YoZSkmJmEucHVzaChlKX0pLDA9PT1hLmxlbmd0aClyZXR1cm57YXV0aE1vZGU6YVswXXx8ImZpbmdlclByaW50IixlcnJDb2RlOjkwMDAzLGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwgbm8gY29ycmVzcG9uZGluZyBtb2RlIn07dmFyIHM9W107aWYoYS5tYXAoZnVuY3Rpb24oZSx0KXtOYSh7Y2hlY2tBdXRoTW9kZTplfSkuaXNFbnJvbGxlZCYmcy5wdXNoKGUpfSksMD09PXMubGVuZ3RoKXJldHVybnthdXRoTW9kZTphWzBdLGVyckNvZGU6OTAwMTEsZXJyTXNnOiJzdGFydFNvdGVyQXV0aGVudGljYXRpb246ZmFpbCBubyAiK2FbMF0rIiBlbnJvbGxlZCJ9O3ZhciBjPXNbMF07aWYoImZpbmdlclByaW50Ij09PWMpe3ZhciB1LGw9bnVsbCxkPWl8fGF0KCJ1bmkuc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uLmF1dGhDb250ZW50Iik7ImFuZHJvaWQiPT09cmcub3MubmFtZS50b0xvd2VyQ2FzZSgpJiYoKGw9cmcubmF0aXZlVUkuc2hvd1dhaXRpbmcoZCkpLm9uY2xvc2U9ZnVuY3Rpb24oKXtyZy5maW5nZXJwcmludC5jYW5jZWwoKX0pLHJnLmZpbmdlcnByaW50LmF1dGhlbnRpY2F0ZShmdW5jdGlvbigpe3JnLm5hdGl2ZVVJLmNsb3NlV2FpdGluZygpLGZpKHQse2F1dGhNb2RlOmMsZXJyQ29kZTowLGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOm9rIn0pfSxmdW5jdGlvbihlKXtzd2l0Y2goZS5jb2RlKXtjYXNlIGUuQVVUSEVOVElDQVRFX01JU01BVENIOmwmJihhZyh1KSxsLnNldFRpdGxlKGF0KCJ1bmkuc3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uLndhaXRpbmdDb250ZW50IikpLHU9b2coZnVuY3Rpb24oKXtsJiZsLnNldFRpdGxlKGQpfSwxZTMpKTticmVhaztjYXNlIGUuQVVUSEVOVElDQVRFX09WRVJMSU1JVDpyZy5uYXRpdmVVSS5jbG9zZVdhaXRpbmcoKSxmaSh0LHthdXRoTW9kZTpjLGVyckNvZGU6OTAwMTAsZXJyTXNnOiJzdGFydFNvdGVyQXV0aGVudGljYXRpb246ZmFpbCBhdXRoZW50aWNhdGUgZnJlZXplLiBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyIn0pO2JyZWFrO2Nhc2UgZS5DQU5DRUw6cmcubmF0aXZlVUkuY2xvc2VXYWl0aW5nKCksZmkodCx7YXV0aE1vZGU6YyxlcnJDb2RlOjkwMDA4LGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwgY2FuY2VsIn0pO2JyZWFrO2RlZmF1bHQ6cmcubmF0aXZlVUkuY2xvc2VXYWl0aW5nKCksZmkodCx7YXV0aE1vZGU6YyxlcnJDb2RlOjkwMDA3LGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwifSl9fSx7bWVzc2FnZTppfSl9ZWxzZSJmYWNpYWwiPT09YyYmcGkoImZhY2VJRCIpLmF1dGhlbnRpY2F0ZSh7bWVzc2FnZTppfSxmdW5jdGlvbihlKXtpZigic3VjY2VzcyI9PT1lLnR5cGUmJjA9PT1lLmNvZGUpZmkodCx7YXV0aE1vZGU6YyxlcnJDb2RlOjAsZXJyTXNnOiJzdGFydFNvdGVyQXV0aGVudGljYXRpb246b2sifSk7ZWxzZSBzd2l0Y2goZS5jb2RlKXtjYXNlIDQ6ZmkodCx7YXV0aE1vZGU6YyxlcnJDb2RlOjkwMDA5LGVyck1zZzoic3RhcnRTb3RlckF1dGhlbnRpY2F0aW9uOmZhaWwifSk7YnJlYWs7Y2FzZSA1OmZpKHQse2F1dGhNb2RlOmMsZXJyQ29kZTo5MDAxMCxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIGF1dGhlbnRpY2F0ZSBmcmVlemUuIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIifSk7YnJlYWs7Y2FzZSA2OmZpKHQse2F1dGhNb2RlOmMsZXJyQ29kZTo5MDAwOCxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIGNhbmNlbCJ9KTticmVhaztkZWZhdWx0OmZpKHQse2F1dGhNb2RlOmMsZXJyQ29kZTo5MDAwNyxlcnJNc2c6InN0YXJ0U290ZXJBdXRoZW50aWNhdGlvbjpmYWlsIn0pfX0pfSx3ZWV4R2V0U3lzdGVtSW5mb1N5bmM6WHMsZ2V0RGV2aWNlSW5mbzpZcyxnZXRBcHBCYXNlSW5mbzpKcyxnZXRTeXN0ZW1JbmZvU3luYzpmdW5jdGlvbigpe3JldHVybiB3aShLcyxPYmplY3QuY3JlYXRlKG51bGwpLCJnZXRTeXN0ZW1JbmZvIiwiZ2V0U3lzdGVtSW5mb1N5bmMiKX0sZ2V0U3lzdGVtSW5mbzpLcyx2aWJyYXRlTG9uZzpmdW5jdGlvbigpe3JldHVybiByZy5kZXZpY2UudmlicmF0ZSg0MDApLHtlcnJNc2c6InZpYnJhdGVMb25nOm9rIn19LHZpYnJhdGVTaG9ydDpmdW5jdGlvbigpe3JldHVybiByZy5kZXZpY2UudmlicmF0ZSgxNSkse2Vyck1zZzoidmlicmF0ZVNob3J0Om9rIn19LGdldFdpbmRvd0luZm86V3MsZ2V0U3lzdGVtU2V0dGluZzpmdW5jdGlvbigpe3ZhciBlPSgwLG5nLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRTeXN0ZW1TZXR0aW5nKSgpO3RyeXsic3RyaW5nIj09dHlwZW9mIGUmJihlPUpTT04ucGFyc2UoZSkpfWNhdGNoKGUpe31yZXR1cm4gZX0sZ2V0QXBwQXV0aG9yaXplU2V0dGluZzpacyxvcGVuQXBwQXV0aG9yaXplU2V0dGluZzpmdW5jdGlvbihlLHQpeygwLG5nLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5vcGVuQXBwQXV0aG9yaXplU2V0dGluZykoZnVuY3Rpb24oZSl7InN1Y2Nlc3MiPT09ZS50eXBlP2ZpKHQse2Vyck1zZzoiZ2V0Q2xpcGJvYXJkRGF0YTpvayJ9KTpmaSh0LHtlcnJNc2c6ImdldENsaXBib2FyZERhdGE6ZmFpbCJ9KX0pfSxzYXZlRmlsZTpmdW5jdGlvbihlLG4pe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdCxyPWUudGVtcEZpbGVQYXRoLGk9TGkobiwic2F2ZUZpbGUiKSxvPSIiK0RhdGUubm93KCkrbmMrKysoMTwodD1yLnNwbGl0KCIuIikpLmxlbmd0aD8iLiIrdFt0Lmxlbmd0aC0xXToiIik7cmcuaW8ucmVzb2x2ZUxvY2FsRmlsZVN5c3RlbVVSTChyLGZ1bmN0aW9uKHQpe3RjKGZ1bmN0aW9uKGUpe3QuY29weVRvKGUsbyxmdW5jdGlvbigpe2ZpKG4se2Vyck1zZzoic2F2ZUZpbGU6b2siLHNhdmVkRmlsZVBhdGg6ZWMrIi8iK299KX0saSl9LGkpfSxpKX0sZ2V0U2F2ZWRGaWxlTGlzdDpmdW5jdGlvbihlLGkpe3ZhciBvPUxpKGksImdldFNhdmVkRmlsZUxpc3QiKTt0YyhmdW5jdGlvbihlKXt2YXIgdD1lLmNyZWF0ZVJlYWRlcigpLHI9W107dC5yZWFkRW50cmllcyhmdW5jdGlvbihuKXtuJiZuLmxlbmd0aD9uLmZvckVhY2goZnVuY3Rpb24odCl7dC5nZXRNZXRhZGF0YShmdW5jdGlvbihlKXtyLnB1c2goe2ZpbGVQYXRoOnJnLmlvLmNvbnZlcnRBYnNvbHV0ZUZpbGVTeXN0ZW0odC5mdWxsUGF0aCksY3JlYXRlVGltZTplLm1vZGlmaWNhdGlvblRpbWUuZ2V0VGltZSgpLHNpemU6ZS5zaXplfSksci5sZW5ndGg9PT1uLmxlbmd0aCYmZmkoaSx7ZXJyTXNnOiJnZXRTYXZlZEZpbGVMaXN0Om9rIixmaWxlTGlzdDpyfSl9LG8sITEpfSk6ZmkoaSx7ZXJyTXNnOiJnZXRTYXZlZEZpbGVMaXN0Om9rIixmaWxlTGlzdDpyfSl9LG8pfSxvKX0sZ2V0RmlsZUluZm86cmMsZ2V0U2F2ZWRGaWxlSW5mbzpmdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLmZpbGVQYXRoLHI9TGkodCwiZ2V0U2F2ZWRGaWxlSW5mbyIpO3JnLmlvLnJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkwobixmdW5jdGlvbihlKXtlLmdldE1ldGFkYXRhKGZ1bmN0aW9uKGUpe2ZpKHQse2NyZWF0ZVRpbWU6ZS5tb2RpZmljYXRpb25UaW1lLmdldFRpbWUoKSxzaXplOmUuc2l6ZSxlcnJNc2c6ImdldFNhdmVkRmlsZUluZm86b2sifSl9LHIsITEpfSxyKX0scmVtb3ZlU2F2ZWRGaWxlOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUuZmlsZVBhdGgscj1MaSh0LCJyZW1vdmVTYXZlZEZpbGUiKTtyZy5pby5yZXNvbHZlTG9jYWxGaWxlU3lzdGVtVVJMKG4sZnVuY3Rpb24oZSl7ZS5yZW1vdmUoZnVuY3Rpb24oKXtmaSh0LHtlcnJNc2c6InJlbW92ZVNhdmVkRmlsZTpvayJ9KX0scil9LHIpfSxvcGVuRG9jdW1lbnQ6ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS5maWxlUGF0aCxyPShlLmZpbGVUeXBlLGppKHQsInNhdmVGaWxlIikpLGk9TGkodCwic2F2ZUZpbGUiKTtyZy5ydW50aW1lLm9wZW5Eb2N1bWVudChUaShuKSx2b2lkIDAscixpKX0sY2hvb3NlTG9jYXRpb246ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07dmFyIG49IndlZXgiIT09dWcubnZ1ZUNvbXBpbGVyP2FjOm9jO3JldHVybiBuLmNob29zZUxvY2F0aW9uLmFwcGx5KG4sZSl9LGdldExvY2F0aW9uOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUudHlwZTt2b2lkIDA9PT1uJiYobj0id2dzODQiKTt2YXIgcj1lLmdlb2NvZGU7dm9pZCAwPT09ciYmKHI9ITEpO3ZhciBpPWUuYWx0aXR1ZGU7dm9pZCAwPT09aSYmKGk9ITEpO3ZhciBvPWUuaXNIaWdoQWNjdXJhY3k7dm9pZCAwPT09byYmKG89ITEpO3ZhciBhPWUuaGlnaEFjY3VyYWN5RXhwaXJlVGltZSxzPUxpKHQsImdldExvY2F0aW9uIik7cmcuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKGZ1bmN0aW9uKGUpe3NjKG4sZSx0KX0sZnVuY3Rpb24oZSl7MTUwMSE9PWUuY29kZT9zKGUpOnNjKG4sZSx0KX0se2dlb2NvZGU6cixlbmFibGVIaWdoQWNjdXJhY3k6b3x8aSx0aW1lb3V0OmEsY29vcmRzVHlwZTpufSl9LG9wZW5Mb2NhdGlvbjpmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTt2YXIgbj0id2VleCIhPT11Zy5udnVlQ29tcGlsZXI/dWM6Y2M7cmV0dXJuIG4ub3BlbkxvY2F0aW9uLmFwcGx5KG4sZSl9LHN0YXJ0TG9jYXRpb25VcGRhdGU6ZnVuY3Rpb24oZSxuKXt2YXIgdD1lLnR5cGU7dm9pZCAwPT09dCYmKHQ9ImdjajAyIikscGM9cGN8fHJnLmdlb2xvY2F0aW9uLndhdGNoUG9zaXRpb24oZnVuY3Rpb24odCl7ZmM9ITAsbGMuZm9yRWFjaChmdW5jdGlvbihlKXtmaShlLHQuY29vcmRzKX0pfSxmdW5jdGlvbih0KXtmY3x8KGZpKG4se2Vyck1zZzoic3RhcnRMb2NhdGlvblVwZGF0ZTpmYWlsICIrdC5tZXNzYWdlfSksZmM9ITApLGRjLmZvckVhY2goZnVuY3Rpb24oZSl7ZmkoZSx7ZXJyTXNnOiJvbkxvY2F0aW9uQ2hhbmdlOmZhaWwgIit0Lm1lc3NhZ2V9KX0pfSx7Y29vcmRzVHlwZTp0fSksb2coZnVuY3Rpb24oKXtmaShuLHtlcnJNc2c6InN0YXJ0TG9jYXRpb25VcGRhdGU6b2sifSl9LDEwMCl9LHN0b3BMb2NhdGlvblVwZGF0ZTpmdW5jdGlvbigpe3JldHVybiAwIT09cGMmJihyZy5nZW9sb2NhdGlvbi5jbGVhcldhdGNoKHBjKSxmYz0hMSxwYz0wKSx7fX0sb25Mb2NhdGlvbkNoYW5nZTpmdW5jdGlvbihlKXtsYy5wdXNoKGUpfSxvZmZMb2NhdGlvbkNoYW5nZTpmdW5jdGlvbihlKXtpZihlKXt2YXIgdD1sYy5pbmRleE9mKGUpOzA8PXQmJmxjLnNwbGljZSh0LDEpfWVsc2UgbGM9W119LG9uTG9jYXRpb25DaGFuZ2VFcnJvcjpmdW5jdGlvbihlKXtkYy5wdXNoKGUpfSxvZmZMb2NhdGlvbkNoYW5nZUVycm9yOmZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PWRjLmluZGV4T2YoZSk7MDw9dCYmZGMuc3BsaWNlKHQsMSl9ZWxzZSBkYz1bXX0sc3RhcnRSZWNvcmQ6ZnVuY3Rpb24oZSx0KXtoYyYmaGMuc3RvcCgpLChoYz1yZy5hdWRpby5nZXRSZWNvcmRlcigpKS5yZWNvcmQoe2ZpbGVuYW1lOiJfZG9jL2F1ZGlvLyIsZm9ybWF0OiJhYWMifSxmdW5jdGlvbihlKXtmaSh0LHtlcnJNc2c6InN0YXJ0UmVjb3JkOm9rIix0ZW1wRmlsZVBhdGg6ZX0pfSxmdW5jdGlvbihlKXtmaSh0LHtlcnJNc2c6InN0YXJ0UmVjb3JkOmZhaWwifSl9KSx2Yz1vZyhmdW5jdGlvbigpe2hjLnN0b3AoKSxoYz0hMX0sMzZlNSl9LHN0b3BSZWNvcmQ6ZnVuY3Rpb24oKXtyZXR1cm4gaGM/KHZjJiZhZyh2YyksaGMuc3RvcCgpLHtlcnJNc2c6InN0b3BSZWNvcmQ6b2sifSk6e2Vyck1zZzoic3RvcFJlY29yZDpmYWlsIn19LHBsYXlWb2ljZTpmdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLmZpbGVQYXRoO2lmKGdjJiZtYz09PW4mJiJwYXVzZSI9PT15YylyZXR1cm4geWM9InBsYXkiLGdjLnBsYXkoZnVuY3Rpb24oZSl7eWM9bWM9Z2M9ITEsZmkodCx7ZXJyTXNnOiJwbGF5Vm9pY2U6b2sifSl9KSx7ZXJyTXNnOiJwbGF5Vm9pY2U6b2sifTtnYyYmZ2Muc3RvcCgpLG1jPW4seWM9InBsYXkiLChnYz1yZy5hdWRpby5jcmVhdGVQbGF5ZXIoVGkobikpKS5wbGF5KGZ1bmN0aW9uKGUpe3ljPW1jPWdjPSExLGZpKHQse2Vyck1zZzoicGxheVZvaWNlOm9rIn0pfSl9LHBhdXNlVm9pY2U6ZnVuY3Rpb24oKXtyZXR1cm4gZ2MmJiJwbGF5Ij09PXljJiYoZ2MucGF1c2UoKSx5Yz0icGF1c2UiKSx7ZXJyTXNnOiJwYXVzZVZvaWNlOm9rIn19LHN0b3BWb2ljZTpmdW5jdGlvbigpe3JldHVybiBnYyYmKGdjLnN0b3AoKSx5Yz1tYz1nYz0hMSkse2Vyck1zZzoic3RvcFZvaWNlOm9rIn19LGNob29zZUltYWdlOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUuY291bnQscj1lLnNpemVUeXBlLGk9ZS5zb3VyY2VUeXBlLG89ZS5jcm9wLGE9TGkodCwiY2hvb3NlSW1hZ2UiLCJjYW5jZWwiKTtmdW5jdGlvbiBzKHIpe3ZhciBpPVtdLG89W107UHJvbWlzZS5hbGwoci5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHI9ZSxuZXcgUHJvbWlzZShmdW5jdGlvbih0LG4pe3JnLmlvLnJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkwocixmdW5jdGlvbihlKXtlLmdldE1ldGFkYXRhKHQsbiwhMSl9LG4pfSk7dmFyIHJ9KSkudGhlbihmdW5jdGlvbihlKXtlLmZvckVhY2goZnVuY3Rpb24oZSx0KXt2YXIgbj1yW3RdO28ucHVzaChuKSxpLnB1c2goe3BhdGg6bixzaXplOmUuc2l6ZX0pfSksZmkodCx7ZXJyTXNnOiJjaG9vc2VJbWFnZTpvayIsdGVtcEZpbGVQYXRoczpvLHRlbXBGaWxlczppfSl9KS5jYXRjaChhKX1mdW5jdGlvbiBjKCl7cmcuY2FtZXJhLmdldENhbWVyYSgpLmNhcHR1cmVJbWFnZShmdW5jdGlvbihlKXtyZXR1cm4gcyhbZV0pfSxhLHtmaWxlbmFtZTp5bysiL2NhbWVyYS8iLHJlc29sdXRpb246ImhpZ2giLGNyb3A6byxzaXplVHlwZTpyfSl9ZnVuY3Rpb24gdSgpe3JnLmdhbGxlcnkucGljayhmdW5jdGlvbihlKXtyZXR1cm4gcyhlLmZpbGVzKX0sYSx7bWF4aW11bTpuLG11bHRpcGxlOiEwLHN5c3RlbTohMSxmaWxlbmFtZTp5bysiL2dhbGxlcnkvIixwZXJtaXNzaW9uQWxlcnQ6ITAsY3JvcDpvLHNpemVUeXBlOnJ9KX1pZigxPT09aS5sZW5ndGgpe2lmKGkuaW5jbHVkZXMoImFsYnVtIikpcmV0dXJuIHZvaWQgdSgpO2lmKGkuaW5jbHVkZXMoImNhbWVyYSIpKXJldHVybiB2b2lkIGMoKX1yZy5uYXRpdmVVSS5hY3Rpb25TaGVldCh7Y2FuY2VsOmF0KCJ1bmkuY2hvb3NlSW1hZ2UuY2FuY2VsIiksYnV0dG9uczpbe3RpdGxlOmF0KCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5jYW1lcmEiKX0se3RpdGxlOmF0KCJ1bmkuY2hvb3NlSW1hZ2Uuc291cmNlVHlwZS5hbGJ1bSIpfV19LGZ1bmN0aW9uKGUpe3N3aXRjaChlLmluZGV4KXtjYXNlIDE6YygpO2JyZWFrO2Nhc2UgMjp1KCk7YnJlYWs7ZGVmYXVsdDphKCl9fSl9LGNob29zZVZpZGVvOmZ1bmN0aW9uKGUscil7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUuc291cmNlVHlwZSxuPWUuY29tcHJlc3NlZCxpPWUubWF4RHVyYXRpb24sbz1lLmNhbWVyYSxhPUxpKHIsImNob29zZVZpZGVvIiwiY2FuY2VsIik7ZnVuY3Rpb24gcyhuKXt2b2lkIDA9PT1uJiYobj0iIikscmcuaW8uZ2V0VmlkZW9JbmZvKHtmaWxlUGF0aDpuLHN1Y2Nlc3M6ZnVuY3Rpb24oZSl7dmFyIHQ9e2Vyck1zZzoiY2hvb3NlVmlkZW86b2siLHRlbXBGaWxlUGF0aDpufTt0LnNpemU9ZS5zaXplLHQuZHVyYXRpb249ZS5kdXJhdGlvbix0LndpZHRoPWUud2lkdGgsdC5oZWlnaHQ9ZS5oZWlnaHQsZmkocix0KX0sZmFpbDphfSl9ZnVuY3Rpb24gYygpe3JnLmdhbGxlcnkucGljayhmdW5jdGlvbihlKXtyZXR1cm4gcyhlLmZpbGVzWzBdKX0sYSx7ZmlsdGVyOiJ2aWRlbyIsc3lzdGVtOiExLG11bHRpcGxlOiEwLG1heGltdW06MSxmaWxlbmFtZTp5bysiL2dhbGxlcnkvIixwZXJtaXNzaW9uQWxlcnQ6ITAsdmlkZW9Db21wcmVzczpufSl9ZnVuY3Rpb24gdSgpe3JnLmNhbWVyYS5nZXRDYW1lcmEoKS5zdGFydFZpZGVvQ2FwdHVyZShzLGEse2luZGV4OiJmcm9udCI9PT1vPzI6MSx2aWRlb01heGltdW1EdXJhdGlvbjppLGZpbGVuYW1lOnlvKyIvY2FtZXJhLyIsdmlkZW9Db21wcmVzczpufSl9aWYoMT09PXQubGVuZ3RoKXtpZih0LmluY2x1ZGVzKCJhbGJ1bSIpKXJldHVybiB2b2lkIGMoKTtpZih0LmluY2x1ZGVzKCJjYW1lcmEiKSlyZXR1cm4gdm9pZCB1KCl9cmcubmF0aXZlVUkuYWN0aW9uU2hlZXQoe2NhbmNlbDphdCgidW5pLmNob29zZVZpZGVvLmNhbmNlbCIpLGJ1dHRvbnM6W3t0aXRsZTphdCgidW5pLmNob29zZVZpZGVvLnNvdXJjZVR5cGUuY2FtZXJhIil9LHt0aXRsZTphdCgidW5pLmNob29zZVZpZGVvLnNvdXJjZVR5cGUuYWxidW0iKX1dfSxmdW5jdGlvbihlKXtzd2l0Y2goZS5pbmRleCl7Y2FzZSAxOnUoKTticmVhaztjYXNlIDI6YygpO2JyZWFrO2RlZmF1bHQ6YSgpfX0pfSxjb21wcmVzc0ltYWdlOmZ1bmN0aW9uKGUsdCl7dmFyIG49eW8rIi9jb21wcmVzc2VkLyIrRGF0ZS5ub3coKSsiXyIrQmkoZS5zcmMpLHI9TGkodCwiY29tcHJlc3NJbWFnZSIpLGk9ZS5jb21wcmVzc2VkV2lkdGgsbz1lLmNvbXByZXNzZWRIZWlnaHQ7Im51bWJlciI9PXR5cGVvZiBpJiYoZS53aWR0aD1pKyJweCIpLCJudW1iZXIiPT10eXBlb2YgbyYmKGUuaGVpZ2h0PW8rInB4IikscmcuemlwLmNvbXByZXNzSW1hZ2UoT2JqZWN0LmFzc2lnbih7fSxlLHtkc3Q6bn0pLGZ1bmN0aW9uKCl7ZmkodCx7ZXJyTXNnOiJjb21wcmVzc0ltYWdlOm9rIix0ZW1wRmlsZVBhdGg6bn0pfSxyKX0sY29tcHJlc3NWaWRlbzpmdW5jdGlvbihlLHQpe3ZhciBuPXlvKyIvY29tcHJlc3NlZC8iK0RhdGUubm93KCkrIl8iK0JpKGUuc3JjKSxyPWppKHQsImNvbXByZXNzVmlkZW8iKSxpPUxpKHQsImNvbXByZXNzVmlkZW8iKTtyZy56aXAuY29tcHJlc3NWaWRlbyhPYmplY3QuYXNzaWduKHt9LGUse2ZpbGVuYW1lOm59KSxyLGkpfSxnZXRJbWFnZUluZm86d2MsZ2V0VmlkZW9JbmZvOmtjLHByZXZpZXdJbWFnZVBsdXM6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUuY3VycmVudDt2b2lkIDA9PT10JiYodD0wKTt2YXIgbj1lLmJhY2tncm91bmQ7dm9pZCAwPT09biYmKG49IiMwMDAwMDAiKTt2YXIgcj1lLmluZGljYXRvcjt2b2lkIDA9PT1yJiYocj0ibnVtYmVyIik7dmFyIGk9ZS5sb29wO3ZvaWQgMD09PWkmJihpPSExKTt2YXIgbz1lLnVybHMsYT1lLmxvbmdQcmVzc0FjdGlvbnM7bz1vLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gVGkoZSl9KTt2YXIgcz1OdW1iZXIodCk7cmV0dXJuIHQ9aXNOYU4ocyk/KHQ9by5pbmRleE9mKFRpKHQpKSk8MD8wOnQ6cyxyZy5uYXRpdmVVSS5wcmV2aWV3SW1hZ2Uobyx7Y3VycmVudDp0LGJhY2tncm91bmQ6bixpbmRpY2F0b3I6cixsb29wOmksb25Mb25nUHJlc3M6ZnVuY3Rpb24odCl7dmFyIGU9W10sbj0iIixyPSIiLGk9YSYmYS5jYWxsYmFja0lkO2k/KGU9YS5pdGVtTGlzdD9hLml0ZW1MaXN0OltdLG49YS5pdGVtQ29sb3I/YS5pdGVtQ29sb3I6IiMwMDAwMDAiLHI9YS50aXRsZT9hLnRpdGxlOiIiKTooZT1bYXQoInVuaS5wcmV2aWV3SW1hZ2UuYnV0dG9uLnNhdmUiKV0sbj0iIzAwMDAwMCIscj0iIik7dmFyIG89e2J1dHRvbnM6ZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJue3RpdGxlOmUsY29sb3I6bn19KSxjYW5jZWw6YXQoInVuaS5wcmV2aWV3SW1hZ2UuY2FuY2VsIil9O3ImJihvLnRpdGxlPXIpLHJnLm5hdGl2ZVVJLmFjdGlvblNoZWV0KG8sZnVuY3Rpb24oZSl7aWYoMDxlLmluZGV4KXtpZihpKXJldHVybiB2b2lkIGhpKGEuY2FsbGJhY2tJZCx7ZXJyTXNnOiJzaG93QWN0aW9uU2hlZXQ6b2siLHRhcEluZGV4OmUuaW5kZXgtMSxpbmRleDp0LmluZGV4fSk7cmcuZ2FsbGVyeS5zYXZlKHQudXJsLGZ1bmN0aW9uKGUpe3JnLm5hdGl2ZVVJLnRvYXN0KGF0KCJ1bmkucHJldmlld0ltYWdlLnNhdmUuc3VjY2VzcyIpKX0sZnVuY3Rpb24oKXtyZy5uYXRpdmVVSS50b2FzdChhdCgidW5pLnByZXZpZXdJbWFnZS5zYXZlLmZhaWwiKSl9KX1lbHNlIGkmJmhpKGEuY2FsbGJhY2tJZCx7ZXJyTXNnOiJzaG93QWN0aW9uU2hlZXQ6ZmFpbCBjYW5jZWwifSl9KX19KSx7ZXJyTXNnOiJwcmV2aWV3SW1hZ2U6b2sifX0sY2xvc2VQcmV2aWV3SW1hZ2VQbHVzOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiByZy5uYXRpdmVVSS5jbG9zZVByZXZpZXdJbWFnZSgpLHtlcnJNc2c6ImNsb3NlUHJldmlld0ltYWdlUGx1czpvayJ9fWNhdGNoKGUpe3JldHVybntlcnJNc2c6ImNsb3NlUHJldmlld0ltYWdlUGx1czpmYWlsIn19fSxvcGVyYXRlUmVjb3JkZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLm9wZXJhdGlvblR5cGUscj17fTtmb3IodmFyIGkgaW4gZSktMT09PVsib3BlcmF0aW9uVHlwZSJdLmluZGV4T2YoaSkmJihyW2ldPWVbaV0pO3ZhciBvPXI7cmV0dXJuIHhjW25dKG8pLHtlcnJNc2c6Im9wZXJhdGVSZWNvcmRlcjpvayJ9fSxzYXZlSW1hZ2VUb1Bob3Rvc0FsYnVtOmZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUuZmlsZVBhdGgscj1qaSh0LCJzYXZlSW1hZ2VUb1Bob3Rvc0FsYnVtIiksaT1MaSh0LCJzYXZlSW1hZ2VUb1Bob3Rvc0FsYnVtIik7cmcuZ2FsbGVyeS5zYXZlKFRpKG4pLHIsaSl9LHNhdmVWaWRlb1RvUGhvdG9zQWxidW06ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS5maWxlUGF0aDtyZy5nYWxsZXJ5LnNhdmUoVGkobiksZnVuY3Rpb24oZSl7ZmkodCx7ZXJyTXNnOiJzYXZlVmlkZW9Ub1Bob3Rvc0FsYnVtOm9rIn0pfSxmdW5jdGlvbihlKXtmaSh0LHtlcnJNc2c6InNhdmVWaWRlb1RvUGhvdG9zQWxidW06ZmFpbCJ9KX0pfSxvcGVyYXRlRG93bmxvYWRUYXNrOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLmRvd25sb2FkVGFza0lkLG49ZS5vcGVyYXRpb25UeXBlLHI9VGNbdF07cmV0dXJuIHImJiJhYm9ydCI9PT1uPyhkZWxldGUgVGNbdF0sci5hYm9ydCgpLE9jKHtkb3dubG9hZFRhc2tJZDp0LHN0YXRlOiJmYWlsIixlcnJNc2c6ImFib3J0In0pLHtlcnJNc2c6Im9wZXJhdGVEb3dubG9hZFRhc2s6b2sifSk6e2Vyck1zZzoib3BlcmF0ZURvd25sb2FkVGFzazpmYWlsIn19LGNyZWF0ZURvd25sb2FkVGFzazpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24obixlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS51cmwscj1lLmhlYWRlcixpPWUudGltZW91dDtpPShpfHx1Zy5uZXR3b3JrVGltZW91dCYmdWcubmV0d29ya1RpbWVvdXQucmVxdWVzdHx8NmU0KS8xZTM7dmFyIG89cmcuZG93bmxvYWRlci5jcmVhdGVEb3dubG9hZCh0LHt0aW1lb3V0OmksZmlsZW5hbWU6eW8rIi9kb3dubG9hZC8iLHJldHJ5OjAscmV0cnlJbnRlcnZhbDowfSxmdW5jdGlvbihlLHQpe09jKHQ/e2Rvd25sb2FkVGFza0lkOm4sc3RhdGU6InN1Y2Nlc3MiLHRlbXBGaWxlUGF0aDplLmZpbGVuYW1lLHN0YXR1c0NvZGU6dH06e2Rvd25sb2FkVGFza0lkOm4sc3RhdGU6ImZhaWwiLHN0YXR1c0NvZGU6dH0pfSk7Zm9yKHZhciBhIGluIHIpayhyLGEpJiZvLnNldFJlcXVlc3RIZWFkZXIoYSxyW2FdKTtyZXR1cm4gby5hZGRFdmVudExpc3RlbmVyKCJzdGF0ZWNoYW5nZWQiLGZ1bmN0aW9uKGUsdCl7ZS5kb3dubG9hZGVkU2l6ZSYmZS50b3RhbFNpemUmJk9jKHtkb3dubG9hZFRhc2tJZDpuLHN0YXRlOiJwcm9ncmVzc1VwZGF0ZSIscHJvZ3Jlc3M6cGFyc2VJbnQoZS5kb3dubG9hZGVkU2l6ZS9lLnRvdGFsU2l6ZSoxMDApLHRvdGFsQnl0ZXNXcml0dGVuOmUuZG93bmxvYWRlZFNpemUsdG90YWxCeXRlc0V4cGVjdGVkVG9Xcml0ZTplLnRvdGFsU2l6ZX0pfSksKFRjW25dPW8pLnN0YXJ0KCkse2Rvd25sb2FkVGFza0lkOm4sZXJyTXNnOiJjcmVhdGVEb3dubG9hZFRhc2s6b2sifX0oKytDYyxlKX0sY3JlYXRlUmVxdWVzdFRhc2tCeUlkOlBjLGNyZWF0ZVJlcXVlc3RUYXNrOmZ1bmN0aW9uKGUpe3JldHVybiBQYygrK0VjLGUpfSxvcGVyYXRlUmVxdWVzdFRhc2s6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUucmVxdWVzdFRhc2tJZCxuPWUub3BlcmF0aW9uVHlwZSxyPUFjW3RdO3JldHVybiByJiYiYWJvcnQiPT09bj8oci5hYm9ydCgpLHtlcnJNc2c6Im9wZXJhdGVSZXF1ZXN0VGFzazpvayJ9KTp7ZXJyTXNnOiJvcGVyYXRlUmVxdWVzdFRhc2s6ZmFpbCJ9fSxjb25maWdNVExTOmZ1bmN0aW9uKGUsaSl7dmFyIHQ9ZS5jZXJ0aWZpY2F0ZXM7cGkoInN0cmVhbSIpLmNvbmZpZ01UTFModCxmdW5jdGlvbihlKXt2YXIgdD1lLnR5cGUsbj1lLmNvZGUscj1lLm1lc3NhZ2U7c3dpdGNoKHQpe2Nhc2Uic3VjY2VzcyI6ZmkoaSx7ZXJyTXNnOiJjb25maWdNVExTOm9rIixjb2RlOm59KTticmVhaztjYXNlImZhaWwiOmZpKGkse2Vyck1zZzoiY29uZmlnTVRMUzpmYWlsICIrcixjb2RlOm59KX19KX0sY3JlYXRlU29ja2V0VGFzazpmdW5jdGlvbihlKXtyZXR1cm4gTmMoU3RyaW5nKERhdGUubm93KCkpLGUpfSxvcGVyYXRlU29ja2V0VGFzazpmdW5jdGlvbihlKXt2YXIgdD1lLG49dC5vcGVyYXRpb25UeXBlLHI9dC5jb2RlLGk9dC5yZWFzb24sbz10LmRhdGEsYT10LnNvY2tldFRhc2tJZCxzPWpjW2FdO2lmKCFzKXJldHVybntlcnJNc2c6Im9wZXJhdGVTb2NrZXRUYXNrOmZhaWwifTtzd2l0Y2gobil7Y2FzZSJzZW5kIjpyZXR1cm4gbyYmcy5zZW5kKHtpZDphLGRhdGE6Im9iamVjdCI9PXR5cGVvZiBvP3siQHR5cGUiOiJiaW5hcnkiLGJhc2U2NDpiaShvKX06b30pLHtlcnJNc2c6Im9wZXJhdGVTb2NrZXRUYXNrOm9rIn07Y2FzZSJjbG9zZSI6cmV0dXJuIHMuY2xvc2Uoe2lkOmEsY29kZTpyLHJlYXNvbjppfSksZGVsZXRlIGpjW2FdLHtlcnJNc2c6Im9wZXJhdGVTb2NrZXRUYXNrOm9rIn19cmV0dXJue2Vyck1zZzoib3BlcmF0ZVNvY2tldFRhc2s6ZmFpbCJ9fSxvcGVyYXRlVXBsb2FkVGFzazpmdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS51cGxvYWRUYXNrSWQsbj1lLm9wZXJhdGlvblR5cGUscj1EY1t0XTtyZXR1cm4gciYmImFib3J0Ij09PW4/KGRlbGV0ZSBEY1t0XSxyLmFib3J0KCksUmMoe3VwbG9hZFRhc2tJZDp0LHN0YXRlOiJmYWlsIixlcnJNc2c6ImFib3J0In0pLHtlcnJNc2c6Im9wZXJhdGVVcGxvYWRUYXNrOm9rIn0pOntlcnJNc2c6Im9wZXJhdGVVcGxvYWRUYXNrOmZhaWwifX0sY3JlYXRlVXBsb2FkVGFzazpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24obixlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9ZS51cmwscj1lLmZpbGVQYXRoLGk9ZS5uYW1lLG89ZS5maWxlcyxhPWUuaGVhZGVyLHM9ZS5mb3JtRGF0YSxjPWUudGltZW91dDtjPShjfHx1Zy5uZXR3b3JrVGltZW91dCYmdWcubmV0d29ya1RpbWVvdXQudXBsb2FkRmlsZXx8NmU0KS8xZTM7dmFyIHU9cmcudXBsb2FkZXIuY3JlYXRlVXBsb2FkKHQse3RpbWVvdXQ6YyxyZXRyeTowLHJldHJ5SW50ZXJ2YWw6MH0sZnVuY3Rpb24oZSx0KXtSYyh0P3t1cGxvYWRUYXNrSWQ6bixzdGF0ZToic3VjY2VzcyIsZGF0YTplLnJlc3BvbnNlVGV4dCxzdGF0dXNDb2RlOnR9Ont1cGxvYWRUYXNrSWQ6bixzdGF0ZToiZmFpbCIsZGF0YToiIixzdGF0dXNDb2RlOnR9KSxkZWxldGUgRGNbbl19KTtmb3IodmFyIGwgaW4gYSlrKGEsbCkmJnUuc2V0UmVxdWVzdEhlYWRlcihsLFN0cmluZyhhW2xdKSk7Zm9yKHZhciBkIGluIHMpayhzLGQpJiZ1LmFkZERhdGEoZCxTdHJpbmcoc1tkXSkpO3JldHVybiBvJiZvLmxlbmd0aD9vLmZvckVhY2goZnVuY3Rpb24oZSl7dS5hZGRGaWxlKFRpKGUudXJpfHxlLmZpbGVQYXRoKSx7a2V5OmUubmFtZXx8ImZpbGUifSl9KTp1LmFkZEZpbGUoVGkocikse2tleTppfSksdS5hZGRFdmVudExpc3RlbmVyKCJzdGF0ZWNoYW5nZWQiLGZ1bmN0aW9uKGUsdCl7ZS51cGxvYWRlZFNpemUmJmUudG90YWxTaXplJiZSYyh7dXBsb2FkVGFza0lkOm4sc3RhdGU6InByb2dyZXNzVXBkYXRlIixwcm9ncmVzczpwYXJzZUludChlLnVwbG9hZGVkU2l6ZS9lLnRvdGFsU2l6ZSoxMDApLHRvdGFsQnl0ZXNTZW50OmUudXBsb2FkZWRTaXplLHRvdGFsQnl0ZXNFeHBlY3RlZFRvU2VuZDplLnRvdGFsU2l6ZX0pfSksKERjW25dPXUpLnN0YXJ0KCkse3VwbG9hZFRhc2tJZDpuLGVyck1zZzoiY3JlYXRlVXBsb2FkVGFzazpvayJ9fSgrK0JjLGUpfSxnZXRQcm92aWRlcjpmdW5jdGlvbihlLHIpe3ZhciBpPWUuc2VydmljZTt6Y1tpXT96Y1tpXShmdW5jdGlvbihlLHQsbil7ZmkocixlP3tlcnJNc2c6ImdldFByb3ZpZGVyOmZhaWwgIitlLm1lc3NhZ2V9OntlcnJNc2c6ImdldFByb3ZpZGVyOm9rIixzZXJ2aWNlOmkscHJvdmlkZXI6dCxwcm92aWRlcnM6bi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZS5zZXJ2aWNlUmVhZHkmJihlLmlzQXBwRXhpc3Q9ZS5zZXJ2aWNlUmVhZHkpLCJib29sZWFuIj09dHlwZW9mIGUubmF0aXZlQ2xpZW50JiYoZS5pc0FwcEV4aXN0PWUubmF0aXZlQ2xpZW50KSxlfSl9KX0pOmZpKHIse2Vyck1zZzoiZ2V0UHJvdmlkZXI6ZmFpbCBzZXJ2aWNlIG5vdCBmb3VuZCJ9KX0sbG9naW46VmMsZ2V0VXNlckluZm86cWMsZ2V0VXNlclByb2ZpbGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcWMoZSx0KX0sb3BlcmF0ZVdYRGF0YTpmdW5jdGlvbihlLHQpe3N3aXRjaChlLmRhdGEuYXBpX25hbWUpe2Nhc2Uid2ViYXBpX2dldHVzZXJpbmZvIjpxYyhlLHQpO2JyZWFrO2RlZmF1bHQ6cmV0dXJue2Vyck1zZzoib3BlcmF0ZVdYRGF0YTpmYWlsIn19fSxwcmVMb2dpbjpXYyxjbG9zZUF1dGhWaWV3OkhjLGdldENoZWNrQm94U3RhdGU6R2MsZ2V0VW5pdmVyaWZ5TWFuYWdlcjpmdW5jdGlvbigpe3JldHVybiBGY3x8KEZjPW5ldyBZYyl9LHJlcXVlc3RQYXltZW50OmZ1bmN0aW9uKG4scil7dmFyIGk9bi5wcm92aWRlcixvPUxpKHIsInJlcXVlc3RQYXltZW50Iik7cmcucGF5bWVudC5nZXRDaGFubmVscyhmdW5jdGlvbihlKXt2YXIgdD1lLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaWQ9PT1pfSk7dD9yZy5wYXltZW50LnJlcXVlc3QodCxuLm9yZGVySW5mbyxmdW5jdGlvbihlKXtlLmVyck1zZz0icmVxdWVzdFBheW1lbnQ6b2siLGZpKHIsZSl9LG8pOmZpKHIse2Vyck1zZzoicmVxdWVzdFBheW1lbnQ6ZmFpbCBzZXJ2aWNlIG5vdCBmb3VuZCJ9KX0sbyl9LHN1YnNjcmliZVB1c2g6ZnVuY3Rpb24oZSx0KXt2YXIgbj1yZy5wdXNoLmdldENsaWVudEluZm8oKTtyZXR1cm4gbj8oWmN8fChaYz0hMCxyZy5wdXNoLmFkZEV2ZW50TGlzdGVuZXIoInJlY2VpdmUiLGZ1bmN0aW9uKGUpe1hjJiYhUWMmJmhpKCJvblB1c2hNZXNzYWdlIix7bWVzc2FnZUlkOmUuX19VVUlEX18sZGF0YTplLnBheWxvYWQsZXJyTXNnOiJvblB1c2g6b2sifSl9KSksUWM9ITEsbi5lcnJNc2c9InN1YnNjcmliZVB1c2g6b2siLG4pOntlcnJNc2c6InN1YnNjcmliZVB1c2g6ZmFpbCDor7fnoa7kv53lvZPliY3ov5DooYznjq/looPlt7LljIXlkKsgcHVzaCDmqKHlnZcifX0sdW5zdWJzY3JpYmVQdXNoOmZ1bmN0aW9uKGUpe3JldHVybiBRYz0hMCx7ZXJyTXNnOiJ1bnN1YnNjcmliZVB1c2g6b2sifX0sb25QdXNoOmZ1bmN0aW9uKCl7cmV0dXJuIFpjP3JnLnB1c2guZ2V0Q2xpZW50SW5mbygpPyhYYz0hMCx7ZXJyTXNnOiJvblB1c2g6b2sifSk6e2Vyck1zZzoib25QdXNoOmZhaWwg6K+356Gu5L+d5b2T5YmN6L+Q6KGM546v5aKD5bey5YyF5ZCrIHB1c2gg5qih5Z2XIn06e2Vyck1zZzoib25QdXNoOmZhaWwg6K+35YWI6LCD55SoIHVuaS5zdWJzY3JpYmVQdXNoIn19LG9mZlB1c2g6ZnVuY3Rpb24oZSl7cmV0dXJuIFhjPSExLHtlcnJNc2c6Im9mZlB1c2g6b2sifX0sY3JlYXRlUHVzaE1lc3NhZ2U6ZnVuY3Rpb24oZSx0KXt2YXIgbj1acygpO2lmKCJhdXRob3JpemVkIiE9PW4ubm90aWZpY2F0aW9uQXV0aG9yaXplZClyZXR1cm4gZmkodCx7ZXJyTXNnOiJjcmVhdGVQdXNoTWVzc2FnZTpmYWlsIG5vdGlmaWNhdGlvbkF1dGhvcml6ZWQ6ICIrbi5ub3RpZmljYXRpb25BdXRob3JpemVkfSk7dmFyIHI9T2JqZWN0LmFzc2lnbih7fSxlKTtkZWxldGUgci5jb250ZW50LGRlbGV0ZSByLnBheWxvYWQscmcucHVzaC5jcmVhdGVNZXNzYWdlKGUuY29udGVudCxlLnBheWxvYWQsciksZmkodCx7ZXJyTXNnOiJjcmVhdGVQdXNoTWVzc2FnZTpvayJ9KX0scmVxdWlyZU5hdGl2ZVBsdWdpbjpldSxzaGFyZUFwcE1lc3NhZ2VEaXJlY3RseTpmdW5jdGlvbihlLHQpe3ZhciBuPWUudGl0bGUscj1lLnBhdGgsaT1lLmltYWdlVXJsLG89ZS51c2VEZWZhdWx0U25hcHNob3Q7bj1ufHx1Zy5hcHBuYW1lO3ZhciBhPWZ1bmN0aW9uKCl7aXUoe3Byb3ZpZGVyOiJ3ZWl4aW4iLHR5cGU6MCx0aXRsZTpuLGltYWdlVXJsOmksaHJlZjpyLHNjZW5lOiJXWFNjZW5lU2Vzc2lvbiJ9LHQsInNoYXJlQXBwTWVzc2FnZURpcmVjdGx5Iil9LHM9TGkodCwic2hhcmVBcHBNZXNzYWdlRGlyZWN0bHkiKTtpZihvKXt2YXIgYz1wZygpLHU9cmcud2Vidmlldy5nZXRXZWJ2aWV3QnlJZChjW2MubGVuZ3RoLTFdLl9fd3hXZWJ2aWV3SWRfXysiIik7aWYodSl7dmFyIGw9bmV3IHJnLm5hdGl2ZU9iai5CaXRtYXA7dS5kcmF3KGwsZnVuY3Rpb24oKXt2YXIgZT15bysiL3NoYXJlL3NuYXBzaG90LmpwZyI7bC5zYXZlKGUse292ZXJ3cml0ZTohMCxmb3JtYXQ6ImpwZyJ9LGZ1bmN0aW9uKCl7aT1lLGEoKX0scyl9LHMpfWVsc2UgYSgpfWVsc2UgYSgpfSxzaGFyZTppdSxzaGFyZVdpdGhTeXN0ZW06ZnVuY3Rpb24oZSx0LG4pe3ZvaWQgMD09PW4mJihuPSJzaGFyZVdpdGhTeXN0ZW0iKTt2YXIgcj1lLnR5cGUsaT1lLmltYWdlVXJsLG89ZS5zdW1tYXJ5LGE9ZS5ocmVmO3I9cnx8InRleHQiO3ZhciBzPUxpKHQsbik7WyJ0ZXh0IiwiaW1hZ2UiXS5pbmRleE9mKHIpPDAmJmZpKHQse2Vyck1zZzpuKyI6ZmFpbCDliIbkuqvlj4LmlbAgdHlwZSDkuI3mraPnoa4ifSksInN0cmluZyI9PXR5cGVvZiBpJiZpJiYoaT1UaShpKSkscmcuc2hhcmUuc2VuZFdpdGhTeXN0ZW0oe3R5cGU6cixwaWN0dXJlczppJiZbaV0sY29udGVudDpvLGhyZWY6YX0sZnVuY3Rpb24oZSl7ZmkodCx7ZXJyTXNnOm4rIjpvayJ9KX0scyl9LHJlc3RvcmVHbG9iYWw6ZnVuY3Rpb24oZSx0LG4scixpLG8pe3ZhciBhO3JnIT09dCYmKG5nPWUsYT0ocmc9dCkubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlLHZpPWEscmcubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlPWdpLG9nPW4sYWc9cixzZz1pLGNnPW8pLHVnLnNlcnZpY2VSZWFkeT0hMH0scmVxdWlyZUdsb2JhbDpmdW5jdGlvbigpe2Zvcih2YXIgZT1bIkFycmF5QnVmZmVyIiwiSW50OEFycmF5IiwiVWludDhBcnJheSIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiSW50MTZBcnJheSIsIlVpbnQxNkFycmF5IiwiSW50MzJBcnJheSIsIlVpbnQzMkFycmF5IiwiRmxvYXQzMkFycmF5IiwiRmxvYXQ2NEFycmF5IiwiQmlnSW50NjRBcnJheSIsIkJpZ1VpbnQ2NEFycmF5Il0sdD17fSxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07dFtyXT1nbG9iYWxbcl19cmV0dXJuIHR9LGdldFN1Yk5WdWVCeUlkOmF1LGdldEN1cnJlbnRTdWJOVnVlOmZ1bmN0aW9uKCl7cmV0dXJuIGF1KHJnLndlYnZpZXcuY3VycmVudFdlYnZpZXcoKS5pZCl9LG9uSG9zdEV2ZW50UmVjZWl2ZTpmdW5jdGlvbihlKXtzdS5wdXNoKGUpfSxvbk5hdGl2ZUV2ZW50UmVjZWl2ZTpmdW5jdGlvbihlKXtzdS5wdXNoKGUpfSxzZW5kTmF0aXZlRXZlbnQ6Y3UsbG9hZFN1YlBhY2thZ2U6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9ZS5yb290O2lmKC0xIT09YnMuaW5kZXhPZihpKSlyZXR1cm57ZXJyTXNnOiJsb2FkU3ViUGFja2FnZTpvayJ9O2JzLnB1c2goaSksbj1pKyIvYXBwLXN1Yi1zZXJ2aWNlLmpzIixyPWZ1bmN0aW9uKGUpe2ZpKHQse2Vyck1zZzoibG9hZFN1YlBhY2thZ2U6b2sifSl9LHVnLm9uU2VydmljZVJlYWR5KGZ1bmN0aW9uKCl7bmcucmVxdWlyZU1vZHVsZSgicGx1cyIpLmV2YWxKU0ZpbGVzKFtuXSxyKX0pfSxzZW5kSG9zdEV2ZW50OnV1LG5hdmlnYXRlVG9NaW5pUHJvZ3JhbTpmdW5jdGlvbihlLHQpe3V1KCJuYXZpZ2F0ZVRvVW5pTVAiLGUsZnVuY3Rpb24oZSl7aWYoZS5lcnJNc2cmJi0xPT09ZS5lcnJNc2cuaW5kZXhPZigiOm9rIikpcmV0dXJuIGZpKHQse2Vyck1zZzplLmVyck1zZ30pO2ZpKHQse2Vyck1zZzoibmF2aWdhdGVUb01pbmlQcm9ncmFtOm9rIn0pfSl9LGdldExhdW5jaE9wdGlvbnNTeW5jOmZ1bmN0aW9uKCl7cmV0dXJuIFRzfSxnZXRFbnRlck9wdGlvbnNTeW5jOmZ1bmN0aW9uKCl7cmV0dXJuIE9zKCl9LG5hdmlnYXRlQmFjazpBdSxuYXZpZ2F0ZVRvOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS51cmwscj1lLmV2ZW50cyxpPWUub3BlblR5cGUsbz1lLmFuaW1hdGlvblR5cGUsYT1lLmFuaW1hdGlvbkR1cmF0aW9uLHM9bi5zcGxpdCgiPyIpLGM9c1swXSx1PWxnLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUucGF0aD09PWN9KS53aW5kb3csbD11Zy53aW5kb3d8fHt9O298fChvPXUuYW5pbWF0aW9uVHlwZXx8bC5hbmltYXRpb25UeXBlfHx0YSksYXx8KGE9dS5hbmltYXRpb25EdXJhdGlvbnx8bC5hbmltYXRpb25EdXJhdGlvbnx8bmEpO3ZhciBkPUUoc1sxXXx8IiIpO3ZzKGMsZnVuY3Rpb24oKXtQdSh7dXJsOm4scGF0aDpjLHF1ZXJ5OmQsZXZlbnRzOnIsYW5pbWF0aW9uVHlwZTpvLGFuaW1hdGlvbkR1cmF0aW9uOmF9LHQpfSwiYXBwTGF1bmNoIj09PWkpfSxyZUxhdW5jaDpmdW5jdGlvbihlLGEpe3ZhciBzPWUudXJsLHQ9cy5zcGxpdCgiPyIpLGM9dFswXSx1PUUodFsxXXx8IiIpO3ZzKGMsZnVuY3Rpb24oKXt2YXIgZSx0LG4scixpLG87dD1hLG49KGU9e3VybDpzLHBhdGg6YyxxdWVyeTp1fSkudXJsLHI9ZS5wYXRoLGk9ZS5xdWVyeSxvPXBnKCEwKS5zbGljZSgwKSxsZy5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT1yfSkubWV0YS5pc1RhYkJhciYmcXMuc3dpdGNoVGFiKHIuc2xpY2UoMSkpLFR1KGpzKHt1cmw6bixwYXRoOnIscXVlcnk6aSxvcGVuVHlwZToicmVMYXVuY2gifSksIm5vbmUiLDAsZnVuY3Rpb24oKXtvLmZvckVhY2goZnVuY3Rpb24oZSl7ZS4kcmVtb3ZlKCksQ3UoZS4kZ2V0QXBwV2VidmlldygpLCJub25lIil9KSxmaSh0LHtlcnJNc2c6InJlTGF1bmNoOm9rIn0pfSksbWkoKX0pfSxyZWRpcmVjdFRvOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS51cmwscj1lLmV4aXN0cyxpPW4uc3BsaXQoIj8iKSxvPWlbMF0sYT1FKGlbMV18fCIiKTt2cyhvLGZ1bmN0aW9uKCl7anUoe3VybDpuLHBhdGg6byxxdWVyeTphLGV4aXN0czpyfSx0KX0pfSxzd2l0Y2hUYWI6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnVybCxyPWUuZnJvbSxpPWUub3BlblR5cGUsbz1uLnNwbGl0KCI/IiksYT1vWzBdLHM9RShvWzFdfHwiIik7dnMoYSxmdW5jdGlvbigpeyFmdW5jdGlvbihlLHQpe3ZhciBuPWUudXJsLHI9ZS5wYXRoLGk9ZS5xdWVyeTtlLmZyb20scXMuc3dpdGNoVGFiKHIuc2xpY2UoMSkpO3ZhciBvLGEscz1wZygpLGM9cy5sZW5ndGgsdT0hMSxsPSExO2lmKDE8PWMmJigobz1zW2MtMV0pLiRwYWdlLm1ldGEuaXNUYWJCYXI/dT0hMDoobD0hMCxzLnJldmVyc2UoKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuJHBhZ2UubWV0YS5pc1RhYkJhcnx8ZT09PW98fChlLiRyZW1vdmUoKSxDdShlLiRnZXRBcHBXZWJ2aWV3KCksIm5vbmUiKSl9KSxvLiRyZW1vdmUoKSxvZyhmdW5jdGlvbigpeyJyZWRpcmVjdCI9PT1vLiRwYWdlLm9wZW5UeXBlP0N1KG8uJGdldEFwcFdlYnZpZXcoKSxyYSxuYSk6Q3Uoby4kZ2V0QXBwV2VidmlldygpLCJhdXRvIil9LDEwMCkpKSxwZyghMCkuZm9yRWFjaChmdW5jdGlvbihlKXsiLyIrZS5yb3V0ZT09PXI/KGUuJHBhZ2UubWV0YS52aXNpYmxlfHwobD0hMCksZS4kcGFnZS5tZXRhLnZpc2libGU9ITAsYT1lKTplLiRwYWdlLm1ldGEuaXNUYWJCYXImJihlLiRwYWdlLm1ldGEudmlzaWJsZT0hMSl9KSxvPT09YSYmKHU9ITEpLG8mJnUmJm8uJHZtLl9fY2FsbF9ob29rKCJvbkhpZGUiKSwhYSlyZXR1cm4gVHUoanMoe3VybDpuLHBhdGg6cixxdWVyeTppLG9wZW5UeXBlOiJzd2l0Y2hUYWIifSksIm5vbmUiLDAsZnVuY3Rpb24oKXttaSgpLGZpKHQse2Vyck1zZzoic3dpdGNoVGFiOm9rIn0pfSw3MCk7dmFyIGQ9YS4kZ2V0QXBwV2VidmlldygpO2Quc2hvdygibm9uZSIpLGwmJiFkLl9fcHJlbG9hZF9fJiZhLiR2bS5fX2NhbGxfaG9vaygib25TaG93IiksbWkoKSxmaSh0LHtlcnJNc2c6InN3aXRjaFRhYjpvayJ9KX0oe3VybDpuLHBhdGg6YSxxdWVyeTpzLGZyb206cn0sdCl9LCJhcHBMYXVuY2giPT09aSl9LHVuUHJlbG9hZFBhZ2U6ZnVuY3Rpb24oZSl7dmFyIHQsbixyPWUudXJsLGk9KChuPU1zW3Q9cl0pJiYobi5fX3BhZ2VfXyYmUHMoITApLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1uLl9fcGFnZV9ffSk/bi5fX3ByZWxvYWRfXz0hMTpuLmNsb3NlKCJub25lIiksZGVsZXRlIE1zW3RdKSxuKTtyZXR1cm4gaT97aWQ6aS5pZCx1cmw6cixlcnJNc2c6InVuUHJlbG9hZFBhZ2U6b2sifTp7dXJsOnIsZXJyTXNnOiJ1blByZWxvYWRQYWdlOmZhaWwgbm90IGZvdW5kIn19LHByZWxvYWRQYWdlOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS51cmwscj1uLnNwbGl0KCI/Iik7ZmkodCx7aWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS51cmwsbj1lLnBhdGgscj1lLnF1ZXJ5O2lmKCFNc1t0XSl7dmFyIGk9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsZy5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT1ufSkpKTtNc1t0XT11cyhuLGkscix7X19wcmVsb2FkX186ITAsX19xdWVyeV9fOkpTT04uc3RyaW5naWZ5KHIpfSl9cmV0dXJuIE1zW3RdfSh7dXJsOm4scGF0aDpyWzBdLHF1ZXJ5OkUoclsxXXx8IiIpfSkuaWQsdXJsOm4sZXJyTXNnOiJwcmVsb2FkUGFnZTpvayJ9KX0sc2V0U3RvcmFnZTpmdW5jdGlvbihlLHQpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgbj1lLmtleSxyPWUuZGF0YSxpPShlLmlzU3luYyx0eXBlb2Ygciksbz0ic3RyaW5nIj09PWk/cjpKU09OLnN0cmluZ2lmeSh7dHlwZTppLGRhdGE6cn0pO3RyeXsic3RyaW5nIj09PWkmJnZvaWQgMCE9PUZ1KG8pP3JnLnN0b3JhZ2Uuc2V0SXRlbUFzeW5jKG4rRHUsaSxmdW5jdGlvbigpe30pOnJnLnN0b3JhZ2UucmVtb3ZlSXRlbUFzeW5jKG4rRHUsZnVuY3Rpb24oKXt9KSxyZy5zdG9yYWdlLnNldEl0ZW1Bc3luYyhuLG8sZnVuY3Rpb24oKXtmaSh0LHtlcnJNc2c6InNldFN0b3JhZ2U6b2sifSl9LGZ1bmN0aW9uKGUpe2ZpKHQse2Vyck1zZzoic2V0U3RvcmFnZTpmYWlsICIrZS5tZXNzYWdlfSl9KX1jYXRjaChlKXtmaSh0LHtlcnJNc2c6InNldFN0b3JhZ2U6ZmFpbCAiK2V9KX19LHNldFN0b3JhZ2VTeW5jOmZ1bmN0aW9uKGUsdCl7dmFyIG49dHlwZW9mIHQscj0ic3RyaW5nIj09PW4/dDpKU09OLnN0cmluZ2lmeSh7dHlwZTpuLGRhdGE6dH0pO3RyeXsic3RyaW5nIj09PW4mJnZvaWQgMCE9PUZ1KHIpP3JnLnN0b3JhZ2Uuc2V0SXRlbShlK0R1LG4pOnJnLnN0b3JhZ2UucmVtb3ZlSXRlbShlK0R1KSxyZy5zdG9yYWdlLnNldEl0ZW0oZSxyKX1jYXRjaChlKXt9fSxnZXRTdG9yYWdlOmZ1bmN0aW9uKGUscil7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUua2V5O3JnLnN0b3JhZ2UuZ2V0SXRlbUFzeW5jKHQsZnVuY3Rpb24obil7cmcuc3RvcmFnZS5nZXRJdGVtQXN5bmModCtEdSxmdW5jdGlvbihlKXt2YXIgdD0oZS5kYXRhfHwiIikudG9Mb3dlckNhc2UoKTtmaShyLHtkYXRhOnp1KHQsbi5kYXRhKSxlcnJNc2c6ImdldFN0b3JhZ2U6b2sifSl9LGZ1bmN0aW9uKCl7Zmkocix7ZGF0YTp6dSgiIixuLmRhdGEpLGVyck1zZzoiZ2V0U3RvcmFnZTpvayJ9KX0pfSxmdW5jdGlvbihlKXtmaShyLHtkYXRhOiIiLGVyck1zZzoiZ2V0U3RvcmFnZTpmYWlsICIrZS5tZXNzYWdlfSl9KX0sZ2V0U3RvcmFnZVN5bmM6ZnVuY3Rpb24oZSl7dmFyIHQ9cmcuc3RvcmFnZS5nZXRJdGVtKGUpLG49KHJnLnN0b3JhZ2UuZ2V0SXRlbShlK0R1KXx8IiIpLnRvTG93ZXJDYXNlKCk7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0PyIiOnp1KG4sdCl9LHJlbW92ZVN0b3JhZ2U6ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIG49ZS5rZXk7cmcuc3RvcmFnZS5yZW1vdmVJdGVtQXN5bmMobitEdSxmdW5jdGlvbigpe30pLHJnLnN0b3JhZ2UucmVtb3ZlSXRlbUFzeW5jKG4sZnVuY3Rpb24oZSl7ZmkodCx7ZXJyTXNnOiJyZW1vdmVTdG9yYWdlOm9rIn0pfSxmdW5jdGlvbihlKXtmaSh0LHtlcnJNc2c6InJlbW92ZVN0b3JhZ2U6ZmFpbCAiK2UubWVzc2FnZX0pfSl9LHJlbW92ZVN0b3JhZ2VTeW5jOmZ1bmN0aW9uKGUpe3JnLnN0b3JhZ2UucmVtb3ZlSXRlbShlK0R1KSxyZy5zdG9yYWdlLnJlbW92ZUl0ZW0oZSl9LGNsZWFyU3RvcmFnZTpmdW5jdGlvbihlLHQpe3JnLnN0b3JhZ2UuY2xlYXJBc3luYyhmdW5jdGlvbihlKXtmaSh0LHtlcnJNc2c6ImNsZWFyU3RvcmFnZTpvayJ9KX0sZnVuY3Rpb24oZSl7ZmkodCx7ZXJyTXNnOiJjbGVhclN0b3JhZ2U6ZmFpbCAiK2UubWVzc2FnZX0pfSl9LGNsZWFyU3RvcmFnZVN5bmM6ZnVuY3Rpb24oKXtyZy5zdG9yYWdlLmNsZWFyKCl9LGdldFN0b3JhZ2VJbmZvOlV1LGdldFN0b3JhZ2VJbmZvU3luYzpmdW5jdGlvbigpe3ZhciBlPVV1KCk7cmV0dXJuIGRlbGV0ZSBlLmVyck1zZyxlfSxzaG93S2V5Ym9hcmQ6ZnVuY3Rpb24oKXtyZXR1cm4gcmcua2V5LnNob3dTb2Z0S2V5Ym9yZCgpLHtlcnJNc2c6InNob3dLZXlib2FyZDpvayJ9fSxoaWRlS2V5Ym9hcmQ6ZnVuY3Rpb24oKXtyZXR1cm4gcmcua2V5LmhpZGVTb2Z0S2V5Ym9yZCgpLHtlcnJNc2c6ImhpZGVLZXlib2FyZDpvayJ9fSxzZXROYXZpZ2F0aW9uQmFyVGl0bGU6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PWUuX19wYWdlX18sbj1lLnRpdGxlO3ZvaWQgMD09PW4mJihuPSIiKTt2YXIgcj1raSh0KTtpZihyKXt2YXIgaT1yLmdldFN0eWxlKCk7cmV0dXJuIGkmJmkudGl0bGVOVmlldyYmci5zZXRTdHlsZSh7dGl0bGVOVmlldzp7dGl0bGVUZXh0Om59fSkse2Vyck1zZzoic2V0TmF2aWdhdGlvbkJhclRpdGxlOm9rIn19cmV0dXJue2Vyck1zZzoic2V0TmF2aWdhdGlvbkJhclRpdGxlOmZhaWwifX0sc2hvd05hdmlnYXRpb25CYXJMb2FkaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHJnLm5hdGl2ZVVJLnNob3dXYWl0aW5nKCIiLHttb2RhbDohMX0pLHtlcnJNc2c6InNob3dOYXZpZ2F0aW9uQmFyTG9hZGluZzpvayJ9fSxoaWRlTmF2aWdhdGlvbkJhckxvYWRpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gcmcubmF0aXZlVUkuY2xvc2VXYWl0aW5nKCkse2Vyck1zZzoiaGlkZU5hdmlnYXRpb25CYXJMb2FkaW5nOm9rIn19LHNldE5hdmlnYXRpb25CYXJDb2xvcjpmdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQsbixyPWUuX19wYWdlX18saT1lLmZyb250Q29sb3Isbz1lLmJhY2tncm91bmRDb2xvcixhPWtpKHIpO2lmKGEpe3ZhciBzPXt9O2kmJihzLnRpdGxlQ29sb3I9aSksbyYmKHMuYmFja2dyb3VuZENvbG9yPW8pO3ZhciBjPSIjMDAwMDAwIj09PWk/ImRhcmsiOiJsaWdodCI7cmcubmF2aWdhdG9yLnNldFN0YXR1c0JhclN0eWxlKGMpLHQ9Yywobj1wZygpKS5sZW5ndGgmJihuW24ubGVuZ3RoLTFdLiRwYWdlLm1ldGEuc3RhdHVzQmFyU3R5bGU9dCk7dmFyIHU9YS5nZXRTdHlsZSgpO3JldHVybiB1JiZ1LnRpdGxlTlZpZXcmJih1LnRpdGxlTlZpZXcuYXV0b0JhY2tCdXR0b24mJihzLmJhY2tCdXR0b249cy5iYWNrQnV0dG9ufHx7fSxzLmJhY2tCdXR0b24uY29sb3I9aSksYS5zZXRTdHlsZSh7dGl0bGVOVmlldzpzfSkpLHtlcnJNc2c6InNldE5hdmlnYXRpb25CYXJDb2xvcjpvayJ9fXJldHVybntlcnJNc2c6InNldE5hdmlnYXRpb25CYXJDb2xvcjpmYWlsIn19LHNob3dMb2FkaW5nOmZ1bmN0aW9uKGUpe3JldHVybiB3aShWdSxPYmplY3QuYXNzaWduKHt9LGUse3R5cGU6ImxvYWRpbmcifSksInNob3dUb2FzdCIsInNob3dMb2FkaW5nIil9LGhpZGVMb2FkaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHdpKHF1LCJsb2FkaW5nIiwiaGlkZSIsImhpZGVMb2FkaW5nIil9LHNob3dUb2FzdDpWdSxoaWRlVG9hc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gd2kocXUsInRvYXN0IiwiaGlkZSIsImhpZGVUb2FzdCIpfSxoaWRlOnF1LHNob3dNb2RhbDpmdW5jdGlvbihlLGkpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLnRpdGxlO3ZvaWQgMD09PXQmJih0PSIiKTt2YXIgbj1lLmNvbnRlbnQ7dm9pZCAwPT09biYmKG49IiIpO3ZhciBvPWUuc2hvd0NhbmNlbDt2b2lkIDA9PT1vJiYobz0hMCk7dmFyIHI9ZS5jYW5jZWxUZXh0LGE9KGUuY2FuY2VsQ29sb3IsZS5jb25maXJtVGV4dCkscz0oZS5jb25maXJtQ29sb3IsZS5lZGl0YWJsZSk7dm9pZCAwPT09cyYmKHM9ITEpO3ZhciBjPWUucGxhY2Vob2xkZXJUZXh0O3ZvaWQgMD09PWMmJihjPSIiKTt2YXIgdT1vP1tyLGFdOlthXSxsPXM/Yzp1O249bnx8IiAiLHJnLm5hdGl2ZVVJW3M/InByb21wdCI6ImNvbmZpcm0iXShuLGZ1bmN0aW9uKGUpe2lmKG8pe3ZhciB0PTE9PT1lLmluZGV4LG49e2Vyck1zZzoic2hvd01vZGFsOm9rIixjb25maXJtOnQsY2FuY2VsOjA9PT1lLmluZGV4fHwtMT09PWUuaW5kZXh9O3QmJnMmJihuLmNvbnRlbnQ9ZS52YWx1ZSksZmkoaSxuKX1lbHNle3ZhciByPXtlcnJNc2c6InNob3dNb2RhbDpvayIsY29uZmlybTowPT09ZS5pbmRleCxjYW5jZWw6ITF9O3MmJihyLmNvbnRlbnQ9ZS52YWx1ZSksZmkoaSxyKX19LHQsbCx1KX0sc2hvd0FjdGlvblNoZWV0OmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5pdGVtTGlzdDt2b2lkIDA9PT1uJiYobj1bXSk7dmFyIHI9ZS5pdGVtQ29sb3IsaT1lLnRpdGxlO3ZvaWQgMD09PWkmJihpPSIiKTt2YXIgbz1lLnBvcG92ZXI7IiMwMDAiPT09ciYmdWcuZGFya21vZGUmJihyPUh1W3JnLm5hdmlnYXRvci5nZXRVSVN0eWxlKCldLml0ZW1Db2xvcik7dmFyIGE9e2J1dHRvbnM6bi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJue3RpdGxlOmUsY29sb3I6cn19KX07aSYmKGEudGl0bGU9aSksYS5jYW5jZWw9YXQoInVuaS5zaG93QWN0aW9uU2hlZXQuY2FuY2VsIikscmcubmF0aXZlVUkuYWN0aW9uU2hlZXQoT2JqZWN0LmFzc2lnbihhLHtwb3BvdmVyOm99KSxmdW5jdGlvbihlKXswPGUuaW5kZXg/ZmkodCx7ZXJyTXNnOiJzaG93QWN0aW9uU2hlZXQ6b2siLHRhcEluZGV4OmUuaW5kZXgtMX0pOmZpKHQse2Vyck1zZzoic2hvd0FjdGlvblNoZWV0OmZhaWwgY2FuY2VsIn0pfSl9LHNldFRhYkJhckJhZGdlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuaW5kZXgsbj1lLnRleHQscj1lLnR5cGU7cmV0dXJuIHZvaWQgMD09PXImJihyPSJ0ZXh0IikscXMuc2V0VGFiQmFyQmFkZ2Uocix0LG4pLHtlcnJNc2c6InNldFRhYkJhckJhZGdlOm9rIn19LHNldFRhYkJhckl0ZW06ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5pbmRleCxuPWUudGV4dCxyPWUuaWNvblBhdGgsaT1lLnNlbGVjdGVkSWNvblBhdGgsbz1lLnBhZ2VQYXRoLGE9ZS52aXNpYmxlLHM9ZS5pY29uZm9udDtxcy5zZXRUYWJCYXJJdGVtKHQsbixyLGksYSxzKTt2YXIgYz1vJiZsZy5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhdGg9PT1vfSk7aWYoYyl7dmFyIHU9Yy5tZXRhO3UuaXNUYWJCYXI9ITAsdS50YWJCYXJJbmRleD10LHUuaXNRdWl0PSEwO3ZhciBsPXVnLnRhYkJhcjtsJiZsLmxpc3QmJmwubGlzdFt0XSYmKGwubGlzdFt0XS5wYWdlUGF0aD1vLnN0YXJ0c1dpdGgoIi8iKT9vLnN1YnN0cmluZygxKTpvKX1yZXR1cm57ZXJyTXNnOiJzZXRUYWJCYXJJdGVtOm9rIn19LHNldFRhYkJhclN0eWxlOmZ1bmN0aW9uKGUpe2lmKHZvaWQgMD09PWUmJihlPXt9KSwheWkoKSlyZXR1cm57ZXJyTXNnOiJzZXRUYWJCYXJTdHlsZTpmYWlsIG5vdCBUYWJCYXIgcGFnZSJ9O3ZhciB0PXtibGFjazoicmdiYSgwLDAsMCwwLjQpIix3aGl0ZToicmdiYSgyNTUsMjU1LDI1NSwwLjQpIn0sbj1lLmJvcmRlclN0eWxlO3JldHVybiBuIGluIHQmJihlLmJvcmRlclN0eWxlPXRbbl0pLHFzLnNldFRhYkJhclN0eWxlKGUpLHtlcnJNc2c6InNldFRhYkJhclN0eWxlOm9rIn19LGhpZGVUYWJCYXI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hbmltYXRpb247cmV0dXJuIHlpKCk/KHFzLmhpZGVUYWJCYXIodCkse2Vyck1zZzoiaGlkZVRhYkJhcjpvayJ9KTp7ZXJyTXNnOiJoaWRlVGFiQmFyOmZhaWwgbm90IFRhYkJhciBwYWdlIn19LHNob3dUYWJCYXI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hbmltYXRpb247cmV0dXJuIHlpKCk/KHFzLnNob3dUYWJCYXIodCkse2Vyck1zZzoic2hvd1RhYkJhcjpvayJ9KTp7ZXJyTXNnOiJzaG93VGFiQmFyOmZhaWwgbm90IFRhYkJhciBwYWdlIn19LHJlcXVlc3RDb21wb25lbnRJbmZvOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG87ZS4kcGFnZS5tZXRhLmlzTlZ1ZT9LdShlLHQsbik6KHI9ZSxpPXQsbz1uLGlnLnB1Ymxpc2hIYW5kbGVyKCJyZXF1ZXN0Q29tcG9uZW50SW5mbyIse3JlcUlkOll1LnB1c2gobykscmVxczppfSxyLiRwYWdlLmlkKSl9LGNyZWF0ZVJld2FyZGVkVmlkZW9BZDpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IGlsKGUpfSxjcmVhdGVGdWxsU2NyZWVuVmlkZW9BZDpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IGZsKGUpfSxjcmVhdGVJbnRlcnN0aXRpYWxBZDpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IHBsKGUpfSxjcmVhdGVJbnRlcmFjdGl2ZUFkOmZ1bmN0aW9uKGUpe3JldHVybiBlLnByb3ZpZGVyP2UuYWRwaWQ/bmV3IGdsKGUpOm5ldyBFcnJvcigiYWRwaWQgaW52YWxpZCIpOm5ldyBFcnJvcigicHJvdmlkZXIgaW52YWxpZCIpfX0pLHlsPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSxtbCxkaSk7ZnVuY3Rpb24gX2woZSl7Zm9yKHZhciB0PVtdLG49YXJndW1lbnRzLmxlbmd0aC0xOzA8bi0tOyl0W25dPWFyZ3VtZW50c1tuKzFdO3JldHVybiB5bFtlXS5hcHBseShudWxsLHQpfWZ1bmN0aW9uIGJsKGUsdCl7cmV0dXJuIGlnLm9uKCJhcGkuIitlLHQpfWZ1bmN0aW9uIHdsKGUpe3ZhciB0PXBnKCksbj10Lmxlbmd0aDtyZXR1cm4gbnx8aWcuZW1pdCgib25FcnJvciIsZSsiOmZhaWwiKSx0W24tMV0uJHZtfWZ1bmN0aW9uIGtsKCl7dmFyIGU9cGcoKSx0PWVbZS5sZW5ndGgtMV07cmV0dXJuIHQmJnQuJHBhZ2UuaWR9dmFyIFNsPVsiY2FucGxheSIsInBsYXkiLCJwYXVzZSIsInN0b3AiLCJlbmRlZCIsInRpbWVVcGRhdGUiLCJwcmV2IiwibmV4dCIsImVycm9yIiwid2FpdGluZyJdLHhsPXt9O1NsLmZvckVhY2goZnVuY3Rpb24oZSl7eGxbZV09W119KTt2YXIgQ2wsVGw9W3tuYW1lOiJkdXJhdGlvbiIscmVhZG9ubHk6ITB9LHtuYW1lOiJjdXJyZW50VGltZSIscmVhZG9ubHk6ITB9LHtuYW1lOiJwYXVzZWQiLHJlYWRvbmx5OiEwfSx7bmFtZToic3JjIixjYWNoZTohMH0se25hbWU6InN0YXJ0VGltZSIsZGVmYXVsdDowLGNhY2hlOiEwfSx7bmFtZToiYnVmZmVyZWQiLHJlYWRvbmx5OiEwfSx7bmFtZToidGl0bGUiLGNhY2hlOiEwfSx7bmFtZToiZXBuYW1lIixjYWNoZTohMH0se25hbWU6InNpbmdlciIsY2FjaGU6ITB9LHtuYW1lOiJjb3ZlckltZ1VybCIsY2FjaGU6ITB9LHtuYW1lOiJ3ZWJVcmwiLGNhY2hlOiEwfSx7bmFtZToicHJvdG9jb2wiLHJlYWRvbmx5OiEwLGRlZmF1bHQ6Imh0dHAifSx7bmFtZToicGxheWJhY2tSYXRlIixkZWZhdWx0OjEsY2FjaGU6ITB9XSxPbD1bInByZXYiLCJuZXh0Il0sRWw9ZnVuY3Rpb24oKXt2YXIgcj10aGlzO3RoaXMuX29wdGlvbnM9e30sYmwoIm9uQmFja2dyb3VuZEF1ZGlvU3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUuc3RhdGUsbj1lLmVyck1zZyxyPWUuZXJyQ29kZTt4bFt0XS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlKCJlcnJvciI9PT10P3tlcnJNc2c6bixlcnJDb2RlOnJ9Ont9KX0pfSksT2wuZm9yRWFjaChmdW5jdGlvbihlKXtibCgib25CYWNrZ3JvdW5kQXVkaW8iKyhlWzBdLnRvVXBwZXJDYXNlKCkrZS5zdWJzdHIoMSkpLGZ1bmN0aW9uKCl7eGxbZV0uZm9yRWFjaChmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZSYmZSh7fSl9KX0pfSksVGwuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgbj10Lm5hbWUsZT17Z2V0OmZ1bmN0aW9uKCl7dmFyIGU9dC5jYWNoZT90aGlzLl9vcHRpb25zOl9sKCJnZXRCYWNrZ3JvdW5kQXVkaW9TdGF0ZSIpO3JldHVybiBuIGluIGU/ZVtuXTp0LmRlZmF1bHR9fTt0LnJlYWRvbmx5fHwoZS5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5fb3B0aW9uc1tuXT1lLF9sKCJzZXRCYWNrZ3JvdW5kQXVkaW9TdGF0ZSIsT2JqZWN0LmFzc2lnbih7fSx0aGlzLl9vcHRpb25zLHthdWRpb0lkOnRoaXMuaWR9KSxuKX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLG4sZSl9KX07RWwucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLl9vcGVyYXRlKCJwbGF5Iil9LEVsLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMuX29wZXJhdGUoInBhdXNlIil9LEVsLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKCl7dGhpcy5fb3BlcmF0ZSgic3RvcCIpfSxFbC5wcm90b3R5cGUuc2Vlaz1mdW5jdGlvbihlKXt0aGlzLl9vcGVyYXRlKCJzZWVrIix7Y3VycmVudFRpbWU6ZX0pfSxFbC5wcm90b3R5cGUuX29wZXJhdGU9ZnVuY3Rpb24oZSx0KXtfbCgib3BlcmF0ZUJhY2tncm91bmRBdWRpbyIsT2JqZWN0LmFzc2lnbih7fSx0LHtvcGVyYXRpb25UeXBlOmV9KSl9LFNsLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9dFswXS50b1VwcGVyQ2FzZSgpK3Quc3Vic3RyKDEpO0VsLnByb3RvdHlwZVsib24iK2VdPWZ1bmN0aW9uKGUpe3hsW3RdLnB1c2goZSl9fSk7dmFyIEFsPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldEJhY2tncm91bmRBdWRpb01hbmFnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gQ2x8fChDbD1uZXcgRWwpfX0pLElsPXpyKGZ1bmN0aW9uKGUsdCl7dmFyIG49InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5JiYidW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQxNkFycmF5JiYidW5kZWZpbmVkIiE9dHlwZW9mIEludDMyQXJyYXk7dC5hc3NpZ249ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG4scj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7ci5sZW5ndGg7KXt2YXIgaT1yLnNoaWZ0KCk7aWYoaSl7aWYoIm9iamVjdCIhPXR5cGVvZiBpKXRocm93IG5ldyBUeXBlRXJyb3IoaSsibXVzdCBiZSBub24tb2JqZWN0Iik7Zm9yKHZhciBvIGluIGkpdD1pLG49byxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxuKSYmKGVbb109aVtvXSl9fXJldHVybiBlfSx0LnNocmlua0J1Zj1mdW5jdGlvbihlLHQpe3JldHVybiBlLmxlbmd0aD09PXQ/ZTplLnN1YmFycmF5P2Uuc3ViYXJyYXkoMCx0KTooZS5sZW5ndGg9dCxlKX07dmFyIHI9e2FycmF5U2V0OmZ1bmN0aW9uKGUsdCxuLHIsaSl7aWYodC5zdWJhcnJheSYmZS5zdWJhcnJheSllLnNldCh0LnN1YmFycmF5KG4sbityKSxpKTtlbHNlIGZvcih2YXIgbz0wO288cjtvKyspZVtpK29dPXRbbitvXX0sZmxhdHRlbkNodW5rczpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGE7Zm9yKHQ9cj0wLG49ZS5sZW5ndGg7dDxuO3QrKylyKz1lW3RdLmxlbmd0aDtmb3IoYT1uZXcgVWludDhBcnJheShyKSx0PWk9MCxuPWUubGVuZ3RoO3Q8bjt0Kyspbz1lW3RdLGEuc2V0KG8saSksaSs9by5sZW5ndGg7cmV0dXJuIGF9fSxpPXthcnJheVNldDpmdW5jdGlvbihlLHQsbixyLGkpe2Zvcih2YXIgbz0wO288cjtvKyspZVtpK29dPXRbbitvXX0sZmxhdHRlbkNodW5rczpmdW5jdGlvbihlKXtyZXR1cm5bXS5jb25jYXQuYXBwbHkoW10sZSl9fTt0LnNldFR5cGVkPWZ1bmN0aW9uKGUpe2U/KHQuQnVmOD1VaW50OEFycmF5LHQuQnVmMTY9VWludDE2QXJyYXksdC5CdWYzMj1JbnQzMkFycmF5LHQuYXNzaWduKHQscikpOih0LkJ1Zjg9QXJyYXksdC5CdWYxNj1BcnJheSx0LkJ1ZjMyPUFycmF5LHQuYXNzaWduKHQsaSkpfSx0LnNldFR5cGVkKG4pfSksJGw9KElsLmFzc2lnbixJbC5zaHJpbmtCdWYsSWwuc2V0VHlwZWQsSWwuQnVmOCxJbC5CdWYxNixJbC5CdWYzMiwwKSxQbD0xO2Z1bmN0aW9uIE1sKGUpe2Zvcih2YXIgdD1lLmxlbmd0aDswPD0tLXQ7KWVbdF09MH12YXIgamw9MCxMbD0yOSxObD0yNTYsQmw9TmwrMStMbCxEbD0zMCxSbD0xOSxGbD0yKkJsKzEsemw9MTUsVWw9MTYsVmw9NyxxbD0yNTYsV2w9MTYsSGw9MTcsR2w9MTgsWGw9WzAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDIsMiwyLDIsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsMF0sWWw9WzAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTNdLEpsPVswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMyw3XSxLbD1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0sWmw9bmV3IEFycmF5KDIqKEJsKzIpKTtNbChabCk7dmFyIFFsPW5ldyBBcnJheSgyKkRsKTtNbChRbCk7dmFyIGVkPW5ldyBBcnJheSg1MTIpO01sKGVkKTt2YXIgdGQ9bmV3IEFycmF5KDI1Nik7TWwodGQpO3ZhciBuZD1uZXcgQXJyYXkoTGwpO01sKG5kKTt2YXIgcmQsaWQsb2QsYWQ9bmV3IEFycmF5KERsKTtmdW5jdGlvbiBzZChlLHQsbixyLGkpe3RoaXMuc3RhdGljX3RyZWU9ZSx0aGlzLmV4dHJhX2JpdHM9dCx0aGlzLmV4dHJhX2Jhc2U9bix0aGlzLmVsZW1zPXIsdGhpcy5tYXhfbGVuZ3RoPWksdGhpcy5oYXNfc3RyZWU9ZSYmZS5sZW5ndGh9ZnVuY3Rpb24gY2QoZSx0KXt0aGlzLmR5bl90cmVlPWUsdGhpcy5tYXhfY29kZT0wLHRoaXMuc3RhdF9kZXNjPXR9ZnVuY3Rpb24gdWQoZSl7cmV0dXJuIGU8MjU2P2VkW2VdOmVkWzI1NisoZT4+PjcpXX1mdW5jdGlvbiBsZChlLHQpe2UucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPTI1NSZ0LGUucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPXQ+Pj44JjI1NX1mdW5jdGlvbiBkZChlLHQsbil7ZS5iaV92YWxpZD5VbC1uPyhlLmJpX2J1Znw9dDw8ZS5iaV92YWxpZCY2NTUzNSxsZChlLGUuYmlfYnVmKSxlLmJpX2J1Zj10Pj5VbC1lLmJpX3ZhbGlkLGUuYmlfdmFsaWQrPW4tVWwpOihlLmJpX2J1Znw9dDw8ZS5iaV92YWxpZCY2NTUzNSxlLmJpX3ZhbGlkKz1uKX1mdW5jdGlvbiBmZChlLHQsbil7ZGQoZSxuWzIqdF0sblsyKnQrMV0pfWZ1bmN0aW9uIHBkKGUsdCl7Zm9yKHZhciBuPTA7bnw9MSZlLGU+Pj49MSxuPDw9MSwwPC0tdDspO3JldHVybiBuPj4+MX1mdW5jdGlvbiBoZChlLHQsbil7dmFyIHIsaSxvPW5ldyBBcnJheSh6bCsxKSxhPTA7Zm9yKHI9MTtyPD16bDtyKyspb1tyXT1hPWErbltyLTFdPDwxO2ZvcihpPTA7aTw9dDtpKyspe3ZhciBzPWVbMippKzFdOzAhPT1zJiYoZVsyKmldPXBkKG9bc10rKyxzKSl9fWZ1bmN0aW9uIHZkKGUpe3ZhciB0O2Zvcih0PTA7dDxCbDt0KyspZS5keW5fbHRyZWVbMip0XT0wO2Zvcih0PTA7dDxEbDt0KyspZS5keW5fZHRyZWVbMip0XT0wO2Zvcih0PTA7dDxSbDt0KyspZS5ibF90cmVlWzIqdF09MDtlLmR5bl9sdHJlZVsyKnFsXT0xLGUub3B0X2xlbj1lLnN0YXRpY19sZW49MCxlLmxhc3RfbGl0PWUubWF0Y2hlcz0wfWZ1bmN0aW9uIGdkKGUpezg8ZS5iaV92YWxpZD9sZChlLGUuYmlfYnVmKTowPGUuYmlfdmFsaWQmJihlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT1lLmJpX2J1ZiksZS5iaV9idWY9MCxlLmJpX3ZhbGlkPTB9ZnVuY3Rpb24gbWQoZSx0LG4scil7dmFyIGk9Mip0LG89MipuO3JldHVybiBlW2ldPGVbb118fGVbaV09PT1lW29dJiZyW3RdPD1yW25dfWZ1bmN0aW9uIHlkKGUsdCxuKXtmb3IodmFyIHI9ZS5oZWFwW25dLGk9bjw8MTtpPD1lLmhlYXBfbGVuJiYoaTxlLmhlYXBfbGVuJiZtZCh0LGUuaGVhcFtpKzFdLGUuaGVhcFtpXSxlLmRlcHRoKSYmaSsrLCFtZCh0LHIsZS5oZWFwW2ldLGUuZGVwdGgpKTspZS5oZWFwW25dPWUuaGVhcFtpXSxuPWksaTw8PTE7ZS5oZWFwW25dPXJ9ZnVuY3Rpb24gX2QoZSx0LG4pe3ZhciByLGksbyxhLHM9MDtpZigwIT09ZS5sYXN0X2xpdClmb3IoO3I9ZS5wZW5kaW5nX2J1ZltlLmRfYnVmKzIqc108PDh8ZS5wZW5kaW5nX2J1ZltlLmRfYnVmKzIqcysxXSxpPWUucGVuZGluZ19idWZbZS5sX2J1ZitzXSxzKyssMD09PXI/ZmQoZSxpLHQpOihmZChlLChvPXRkW2ldKStObCsxLHQpLDAhPT0oYT1YbFtvXSkmJmRkKGUsaS09bmRbb10sYSksZmQoZSxvPXVkKC0tciksbiksMCE9PShhPVlsW29dKSYmZGQoZSxyLT1hZFtvXSxhKSksczxlLmxhc3RfbGl0Oyk7ZmQoZSxxbCx0KX1mdW5jdGlvbiBiZChlLHQpe3ZhciBuLHIsaSxvPXQuZHluX3RyZWUsYT10LnN0YXRfZGVzYy5zdGF0aWNfdHJlZSxzPXQuc3RhdF9kZXNjLmhhc19zdHJlZSxjPXQuc3RhdF9kZXNjLmVsZW1zLHU9LTE7Zm9yKGUuaGVhcF9sZW49MCxlLmhlYXBfbWF4PUZsLG49MDtuPGM7bisrKTAhPT1vWzIqbl0/KGUuaGVhcFsrK2UuaGVhcF9sZW5dPXU9bixlLmRlcHRoW25dPTApOm9bMipuKzFdPTA7Zm9yKDtlLmhlYXBfbGVuPDI7KW9bMiooaT1lLmhlYXBbKytlLmhlYXBfbGVuXT11PDI/Kyt1OjApXT0xLGUuZGVwdGhbaV09MCxlLm9wdF9sZW4tLSxzJiYoZS5zdGF0aWNfbGVuLT1hWzIqaSsxXSk7Zm9yKHQubWF4X2NvZGU9dSxuPWUuaGVhcF9sZW4+PjE7MTw9bjtuLS0peWQoZSxvLG4pO2ZvcihpPWM7bj1lLmhlYXBbMV0sZS5oZWFwWzFdPWUuaGVhcFtlLmhlYXBfbGVuLS1dLHlkKGUsbywxKSxyPWUuaGVhcFsxXSxlLmhlYXBbLS1lLmhlYXBfbWF4XT1uLGUuaGVhcFstLWUuaGVhcF9tYXhdPXIsb1syKmldPW9bMipuXStvWzIqcl0sZS5kZXB0aFtpXT0oZS5kZXB0aFtuXT49ZS5kZXB0aFtyXT9lLmRlcHRoW25dOmUuZGVwdGhbcl0pKzEsb1syKm4rMV09b1syKnIrMV09aSxlLmhlYXBbMV09aSsrLHlkKGUsbywxKSwyPD1lLmhlYXBfbGVuOyk7ZS5oZWFwWy0tZS5oZWFwX21heF09ZS5oZWFwWzFdLGZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYSxzLGM9dC5keW5fdHJlZSx1PXQubWF4X2NvZGUsbD10LnN0YXRfZGVzYy5zdGF0aWNfdHJlZSxkPXQuc3RhdF9kZXNjLmhhc19zdHJlZSxmPXQuc3RhdF9kZXNjLmV4dHJhX2JpdHMscD10LnN0YXRfZGVzYy5leHRyYV9iYXNlLGg9dC5zdGF0X2Rlc2MubWF4X2xlbmd0aCx2PTA7Zm9yKG89MDtvPD16bDtvKyspZS5ibF9jb3VudFtvXT0wO2ZvcihjWzIqZS5oZWFwW2UuaGVhcF9tYXhdKzFdPTAsbj1lLmhlYXBfbWF4KzE7bjxGbDtuKyspaDwobz1jWzIqY1syKihyPWUuaGVhcFtuXSkrMV0rMV0rMSkmJihvPWgsdisrKSxjWzIqcisxXT1vLHU8cnx8KGUuYmxfY291bnRbb10rKyxhPTAscDw9ciYmKGE9ZltyLXBdKSxzPWNbMipyXSxlLm9wdF9sZW4rPXMqKG8rYSksZCYmKGUuc3RhdGljX2xlbis9cyoobFsyKnIrMV0rYSkpKTtpZigwIT09dil7ZG97Zm9yKG89aC0xOzA9PT1lLmJsX2NvdW50W29dOylvLS07ZS5ibF9jb3VudFtvXS0tLGUuYmxfY291bnRbbysxXSs9MixlLmJsX2NvdW50W2hdLS0sdi09Mn13aGlsZSgwPHYpO2ZvcihvPWg7MCE9PW87by0tKWZvcihyPWUuYmxfY291bnRbb107MCE9PXI7KXU8KGk9ZS5oZWFwWy0tbl0pfHwoY1syKmkrMV0hPT1vJiYoZS5vcHRfbGVuKz0oby1jWzIqaSsxXSkqY1syKmldLGNbMippKzFdPW8pLHItLSl9fShlLHQpLGhkKG8sdSxlLmJsX2NvdW50KX1mdW5jdGlvbiB3ZChlLHQsbil7dmFyIHIsaSxvPS0xLGE9dFsxXSxzPTAsYz03LHU9NDtmb3IoMD09PWEmJihjPTEzOCx1PTMpLHRbMioobisxKSsxXT02NTUzNSxyPTA7cjw9bjtyKyspaT1hLGE9dFsyKihyKzEpKzFdLCsrczxjJiZpPT09YXx8KHM8dT9lLmJsX3RyZWVbMippXSs9czowIT09aT8oaSE9PW8mJmUuYmxfdHJlZVsyKmldKyssZS5ibF90cmVlWzIqV2xdKyspOnM8PTEwP2UuYmxfdHJlZVsyKkhsXSsrOmUuYmxfdHJlZVsyKkdsXSsrLG89aSwocz0wKT09PWE/KGM9MTM4LHU9Myk6aT09PWE/KGM9Nix1PTMpOihjPTcsdT00KSl9ZnVuY3Rpb24ga2QoZSx0LG4pe3ZhciByLGksbz0tMSxhPXRbMV0scz0wLGM9Nyx1PTQ7Zm9yKDA9PT1hJiYoYz0xMzgsdT0zKSxyPTA7cjw9bjtyKyspaWYoaT1hLGE9dFsyKihyKzEpKzFdLCEoKytzPGMmJmk9PT1hKSl7aWYoczx1KWZvcig7ZmQoZSxpLGUuYmxfdHJlZSksMCE9LS1zOyk7ZWxzZSAwIT09aT8oaSE9PW8mJihmZChlLGksZS5ibF90cmVlKSxzLS0pLGZkKGUsV2wsZS5ibF90cmVlKSxkZChlLHMtMywyKSk6czw9MTA/KGZkKGUsSGwsZS5ibF90cmVlKSxkZChlLHMtMywzKSk6KGZkKGUsR2wsZS5ibF90cmVlKSxkZChlLHMtMTEsNykpO289aSwocz0wKT09PWE/KGM9MTM4LHU9Myk6aT09PWE/KGM9Nix1PTMpOihjPTcsdT00KX19TWwoYWQpO3ZhciBTZD0hMTtmdW5jdGlvbiB4ZChlLHQsbixyKXt2YXIgaSxvLGEscztkZChlLChqbDw8MSkrKHI/MTowKSwzKSxvPXQsYT1uLHM9ITAsZ2QoaT1lKSxzJiYobGQoaSxhKSxsZChpLH5hKSksSWwuYXJyYXlTZXQoaS5wZW5kaW5nX2J1ZixpLndpbmRvdyxvLGEsaS5wZW5kaW5nKSxpLnBlbmRpbmcrPWF9dmFyIENkPXtfdHJfaW5pdDpmdW5jdGlvbihlKXtTZHx8KGZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaSxvPW5ldyBBcnJheSh6bCsxKTtmb3Iocj1uPTA7cjxMbC0xO3IrKylmb3IobmRbcl09bixlPTA7ZTwxPDxYbFtyXTtlKyspdGRbbisrXT1yO2Zvcih0ZFtuLTFdPXIscj1pPTA7cjwxNjtyKyspZm9yKGFkW3JdPWksZT0wO2U8MTw8WWxbcl07ZSsrKWVkW2krK109cjtmb3IoaT4+PTc7cjxEbDtyKyspZm9yKGFkW3JdPWk8PDcsZT0wO2U8MTw8WWxbcl0tNztlKyspZWRbMjU2K2krK109cjtmb3IodD0wO3Q8PXpsO3QrKylvW3RdPTA7Zm9yKGU9MDtlPD0xNDM7KVpsWzIqZSsxXT04LGUrKyxvWzhdKys7Zm9yKDtlPD0yNTU7KVpsWzIqZSsxXT05LGUrKyxvWzldKys7Zm9yKDtlPD0yNzk7KVpsWzIqZSsxXT03LGUrKyxvWzddKys7Zm9yKDtlPD0yODc7KVpsWzIqZSsxXT04LGUrKyxvWzhdKys7Zm9yKGhkKFpsLEJsKzEsbyksZT0wO2U8RGw7ZSsrKVFsWzIqZSsxXT01LFFsWzIqZV09cGQoZSw1KTtyZD1uZXcgc2QoWmwsWGwsTmwrMSxCbCx6bCksaWQ9bmV3IHNkKFFsLFlsLDAsRGwsemwpLG9kPW5ldyBzZChuZXcgQXJyYXkoMCksSmwsMCxSbCxWbCl9KCksU2Q9ITApLGUubF9kZXNjPW5ldyBjZChlLmR5bl9sdHJlZSxyZCksZS5kX2Rlc2M9bmV3IGNkKGUuZHluX2R0cmVlLGlkKSxlLmJsX2Rlc2M9bmV3IGNkKGUuYmxfdHJlZSxvZCksZS5iaV9idWY9MCxlLmJpX3ZhbGlkPTAsdmQoZSl9LF90cl9zdG9yZWRfYmxvY2s6eGQsX3RyX2ZsdXNoX2Jsb2NrOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYT0wOzA8ZS5sZXZlbD8oMj09PWUuc3RybS5kYXRhX3R5cGUmJihlLnN0cm0uZGF0YV90eXBlPWZ1bmN0aW9uKGUpe3ZhciB0LG49NDA5MzYyNDQ0Nztmb3IodD0wO3Q8PTMxO3QrKyxuPj4+PTEpaWYoMSZuJiYwIT09ZS5keW5fbHRyZWVbMip0XSlyZXR1cm4gJGw7aWYoMCE9PWUuZHluX2x0cmVlWzE4XXx8MCE9PWUuZHluX2x0cmVlWzIwXXx8MCE9PWUuZHluX2x0cmVlWzI2XSlyZXR1cm4gUGw7Zm9yKHQ9MzI7dDxObDt0KyspaWYoMCE9PWUuZHluX2x0cmVlWzIqdF0pcmV0dXJuIFBsO3JldHVybiAkbH0oZSkpLGJkKGUsZS5sX2Rlc2MpLGJkKGUsZS5kX2Rlc2MpLGE9ZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHdkKGUsZS5keW5fbHRyZWUsZS5sX2Rlc2MubWF4X2NvZGUpLHdkKGUsZS5keW5fZHRyZWUsZS5kX2Rlc2MubWF4X2NvZGUpLGJkKGUsZS5ibF9kZXNjKSx0PVJsLTE7Mzw9dCYmMD09PWUuYmxfdHJlZVsyKktsW3RdKzFdO3QtLSk7cmV0dXJuIGUub3B0X2xlbis9MyoodCsxKSs1KzUrNCx0fShlKSxpPWUub3B0X2xlbiszKzc+Pj4zLChvPWUuc3RhdGljX2xlbiszKzc+Pj4zKTw9aSYmKGk9bykpOmk9bz1uKzUsbis0PD1pJiYtMSE9PXQ/eGQoZSx0LG4scik6ND09PWUuc3RyYXRlZ3l8fG89PT1pPyhkZChlLDIrKHI/MTowKSwzKSxfZChlLFpsLFFsKSk6KGRkKGUsNCsocj8xOjApLDMpLGZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpO2ZvcihkZChlLHQtMjU3LDUpLGRkKGUsbi0xLDUpLGRkKGUsci00LDQpLGk9MDtpPHI7aSsrKWRkKGUsZS5ibF90cmVlWzIqS2xbaV0rMV0sMyk7a2QoZSxlLmR5bl9sdHJlZSx0LTEpLGtkKGUsZS5keW5fZHRyZWUsbi0xKX0oZSxlLmxfZGVzYy5tYXhfY29kZSsxLGUuZF9kZXNjLm1heF9jb2RlKzEsYSsxKSxfZChlLGUuZHluX2x0cmVlLGUuZHluX2R0cmVlKSksdmQoZSksciYmZ2QoZSl9LF90cl90YWxseTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGUucGVuZGluZ19idWZbZS5kX2J1ZisyKmUubGFzdF9saXRdPXQ+Pj44JjI1NSxlLnBlbmRpbmdfYnVmW2UuZF9idWYrMiplLmxhc3RfbGl0KzFdPTI1NSZ0LGUucGVuZGluZ19idWZbZS5sX2J1ZitlLmxhc3RfbGl0XT0yNTUmbixlLmxhc3RfbGl0KyssMD09PXQ/ZS5keW5fbHRyZWVbMipuXSsrOihlLm1hdGNoZXMrKyx0LS0sZS5keW5fbHRyZWVbMioodGRbbl0rTmwrMSldKyssZS5keW5fZHRyZWVbMip1ZCh0KV0rKyksZS5sYXN0X2xpdD09PWUubGl0X2J1ZnNpemUtMX0sX3RyX2FsaWduOmZ1bmN0aW9uKGUpe3ZhciB0O2RkKGUsMiwzKSxmZChlLHFsLFpsKSwxNj09PSh0PWUpLmJpX3ZhbGlkPyhsZCh0LHQuYmlfYnVmKSx0LmJpX2J1Zj0wLHQuYmlfdmFsaWQ9MCk6ODw9dC5iaV92YWxpZCYmKHQucGVuZGluZ19idWZbdC5wZW5kaW5nKytdPTI1NSZ0LmJpX2J1Zix0LmJpX2J1Zj4+PTgsdC5iaV92YWxpZC09OCl9fTt2YXIgVGQ9ZnVuY3Rpb24oZSx0LG4scil7Zm9yKHZhciBpPTY1NTM1JmV8MCxvPWU+Pj4xNiY2NTUzNXwwLGE9MDswIT09bjspe2ZvcihuLT1hPTJlMzxuPzJlMzpuO289bysoaT1pK3RbcisrXXwwKXwwLC0tYTspO2klPTY1NTIxLG8lPTY1NTIxfXJldHVybiBpfG88PDE2fDB9O3ZhciBPZD1mdW5jdGlvbigpe2Zvcih2YXIgZSx0PVtdLG49MDtuPDI1NjtuKyspe2U9bjtmb3IodmFyIHI9MDtyPDg7cisrKWU9MSZlPzM5ODgyOTIzODReZT4+PjE6ZT4+PjE7dFtuXT1lfXJldHVybiB0fSgpO3ZhciBFZCxBZD1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT1PZCxvPXIrbjtlXj0tMTtmb3IodmFyIGE9cjthPG87YSsrKWU9ZT4+PjheaVsyNTUmKGVedFthXSldO3JldHVybi0xXmV9LElkPXsyOiJuZWVkIGRpY3Rpb25hcnkiLDE6InN0cmVhbSBlbmQiLDA6IiIsIi0xIjoiZmlsZSBlcnJvciIsIi0yIjoic3RyZWFtIGVycm9yIiwiLTMiOiJkYXRhIGVycm9yIiwiLTQiOiJpbnN1ZmZpY2llbnQgbWVtb3J5IiwiLTUiOiJidWZmZXIgZXJyb3IiLCItNiI6ImluY29tcGF0aWJsZSB2ZXJzaW9uIn0sJGQ9MCxQZD00LE1kPTAsamQ9LTIsTGQ9LTEsTmQ9NCxCZD0yLERkPTgsUmQ9OSxGZD0yODYsemQ9MzAsVWQ9MTksVmQ9MipGZCsxLHFkPTE1LFdkPTMsSGQ9MjU4LEdkPUhkK1dkKzEsWGQ9NDIsWWQ9MTEzLEpkPTEsS2Q9MixaZD0zLFFkPTQ7ZnVuY3Rpb24gZWYoZSx0KXtyZXR1cm4gZS5tc2c9SWRbdF0sdH1mdW5jdGlvbiB0ZihlKXtyZXR1cm4oZTw8MSktKDQ8ZT85OjApfWZ1bmN0aW9uIG5mKGUpe2Zvcih2YXIgdD1lLmxlbmd0aDswPD0tLXQ7KWVbdF09MH1mdW5jdGlvbiByZihlKXt2YXIgdD1lLnN0YXRlLG49dC5wZW5kaW5nO24+ZS5hdmFpbF9vdXQmJihuPWUuYXZhaWxfb3V0KSwwIT09biYmKElsLmFycmF5U2V0KGUub3V0cHV0LHQucGVuZGluZ19idWYsdC5wZW5kaW5nX291dCxuLGUubmV4dF9vdXQpLGUubmV4dF9vdXQrPW4sdC5wZW5kaW5nX291dCs9bixlLnRvdGFsX291dCs9bixlLmF2YWlsX291dC09bix0LnBlbmRpbmctPW4sMD09PXQucGVuZGluZyYmKHQucGVuZGluZ19vdXQ9MCkpfWZ1bmN0aW9uIG9mKGUsdCl7Q2QuX3RyX2ZsdXNoX2Jsb2NrKGUsMDw9ZS5ibG9ja19zdGFydD9lLmJsb2NrX3N0YXJ0Oi0xLGUuc3Ryc3RhcnQtZS5ibG9ja19zdGFydCx0KSxlLmJsb2NrX3N0YXJ0PWUuc3Ryc3RhcnQscmYoZS5zdHJtKX1mdW5jdGlvbiBhZihlLHQpe2UucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPXR9ZnVuY3Rpb24gc2YoZSx0KXtlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT10Pj4+OCYyNTUsZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109MjU1JnR9ZnVuY3Rpb24gY2YoZSx0KXt2YXIgbixyLGk9ZS5tYXhfY2hhaW5fbGVuZ3RoLG89ZS5zdHJzdGFydCxhPWUucHJldl9sZW5ndGgscz1lLm5pY2VfbWF0Y2gsYz1lLnN0cnN0YXJ0PmUud19zaXplLUdkP2Uuc3Ryc3RhcnQtKGUud19zaXplLUdkKTowLHU9ZS53aW5kb3csbD1lLndfbWFzayxkPWUucHJldixmPWUuc3Ryc3RhcnQrSGQscD11W28rYS0xXSxoPXVbbythXTtlLnByZXZfbGVuZ3RoPj1lLmdvb2RfbWF0Y2gmJihpPj49Mikscz5lLmxvb2thaGVhZCYmKHM9ZS5sb29rYWhlYWQpO2Rve2lmKHVbKG49dCkrYV09PT1oJiZ1W24rYS0xXT09PXAmJnVbbl09PT11W29dJiZ1Wysrbl09PT11W28rMV0pe28rPTIsbisrO2Rve313aGlsZSh1Wysrb109PT11Wysrbl0mJnVbKytvXT09PXVbKytuXSYmdVsrK29dPT09dVsrK25dJiZ1Wysrb109PT11Wysrbl0mJnVbKytvXT09PXVbKytuXSYmdVsrK29dPT09dVsrK25dJiZ1Wysrb109PT11Wysrbl0mJnVbKytvXT09PXVbKytuXSYmbzxmKTtpZihyPUhkLShmLW8pLG89Zi1IZCxhPHIpe2lmKGUubWF0Y2hfc3RhcnQ9dCxzPD0oYT1yKSlicmVhaztwPXVbbythLTFdLGg9dVtvK2FdfX19d2hpbGUoKHQ9ZFt0JmxdKT5jJiYwIT0tLWkpO3JldHVybiBhPD1lLmxvb2thaGVhZD9hOmUubG9va2FoZWFkfWZ1bmN0aW9uIHVmKGUpe3ZhciB0LG4scixpLG8sYSxzLGMsdSxsLGQ9ZS53X3NpemU7ZG97aWYoaT1lLndpbmRvd19zaXplLWUubG9va2FoZWFkLWUuc3Ryc3RhcnQsZS5zdHJzdGFydD49ZCsoZC1HZCkpe2ZvcihJbC5hcnJheVNldChlLndpbmRvdyxlLndpbmRvdyxkLGQsMCksZS5tYXRjaF9zdGFydC09ZCxlLnN0cnN0YXJ0LT1kLGUuYmxvY2tfc3RhcnQtPWQsdD1uPWUuaGFzaF9zaXplO3I9ZS5oZWFkWy0tdF0sZS5oZWFkW3RdPWQ8PXI/ci1kOjAsLS1uOyk7Zm9yKHQ9bj1kO3I9ZS5wcmV2Wy0tdF0sZS5wcmV2W3RdPWQ8PXI/ci1kOjAsLS1uOyk7aSs9ZH1pZigwPT09ZS5zdHJtLmF2YWlsX2luKWJyZWFrO2lmKGE9ZS5zdHJtLHM9ZS53aW5kb3csYz1lLnN0cnN0YXJ0K2UubG9va2FoZWFkLHU9aSxsPXZvaWQgMCxsPWEuYXZhaWxfaW4sdTxsJiYobD11KSxuPTA9PT1sPzA6KGEuYXZhaWxfaW4tPWwsSWwuYXJyYXlTZXQocyxhLmlucHV0LGEubmV4dF9pbixsLGMpLDE9PT1hLnN0YXRlLndyYXA/YS5hZGxlcj1UZChhLmFkbGVyLHMsbCxjKToyPT09YS5zdGF0ZS53cmFwJiYoYS5hZGxlcj1BZChhLmFkbGVyLHMsbCxjKSksYS5uZXh0X2luKz1sLGEudG90YWxfaW4rPWwsbCksZS5sb29rYWhlYWQrPW4sZS5sb29rYWhlYWQrZS5pbnNlcnQ+PVdkKWZvcihvPWUuc3Ryc3RhcnQtZS5pbnNlcnQsZS5pbnNfaD1lLndpbmRvd1tvXSxlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbbysxXSkmZS5oYXNoX21hc2s7ZS5pbnNlcnQmJihlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbbytXZC0xXSkmZS5oYXNoX21hc2ssZS5wcmV2W28mZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09byxvKyssZS5pbnNlcnQtLSwhKGUubG9va2FoZWFkK2UuaW5zZXJ0PFdkKSk7KTt9d2hpbGUoZS5sb29rYWhlYWQ8R2QmJjAhPT1lLnN0cm0uYXZhaWxfaW4pfWZ1bmN0aW9uIGxmKGUsdCl7Zm9yKHZhciBuLHI7Oyl7aWYoZS5sb29rYWhlYWQ8R2Qpe2lmKHVmKGUpLGUubG9va2FoZWFkPEdkJiZ0PT09JGQpcmV0dXJuIEpkO2lmKDA9PT1lLmxvb2thaGVhZClicmVha31pZihuPTAsZS5sb29rYWhlYWQ+PVdkJiYoZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2Uuc3Ryc3RhcnQrV2QtMV0pJmUuaGFzaF9tYXNrLG49ZS5wcmV2W2Uuc3Ryc3RhcnQmZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09ZS5zdHJzdGFydCksMCE9PW4mJmUuc3Ryc3RhcnQtbjw9ZS53X3NpemUtR2QmJihlLm1hdGNoX2xlbmd0aD1jZihlLG4pKSxlLm1hdGNoX2xlbmd0aD49V2QpaWYocj1DZC5fdHJfdGFsbHkoZSxlLnN0cnN0YXJ0LWUubWF0Y2hfc3RhcnQsZS5tYXRjaF9sZW5ndGgtV2QpLGUubG9va2FoZWFkLT1lLm1hdGNoX2xlbmd0aCxlLm1hdGNoX2xlbmd0aDw9ZS5tYXhfbGF6eV9tYXRjaCYmZS5sb29rYWhlYWQ+PVdkKXtmb3IoZS5tYXRjaF9sZW5ndGgtLTtlLnN0cnN0YXJ0KyssZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2Uuc3Ryc3RhcnQrV2QtMV0pJmUuaGFzaF9tYXNrLG49ZS5wcmV2W2Uuc3Ryc3RhcnQmZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09ZS5zdHJzdGFydCwwIT0tLWUubWF0Y2hfbGVuZ3RoOyk7ZS5zdHJzdGFydCsrfWVsc2UgZS5zdHJzdGFydCs9ZS5tYXRjaF9sZW5ndGgsZS5tYXRjaF9sZW5ndGg9MCxlLmluc19oPWUud2luZG93W2Uuc3Ryc3RhcnRdLGUuaW5zX2g9KGUuaW5zX2g8PGUuaGFzaF9zaGlmdF5lLndpbmRvd1tlLnN0cnN0YXJ0KzFdKSZlLmhhc2hfbWFzaztlbHNlIHI9Q2QuX3RyX3RhbGx5KGUsMCxlLndpbmRvd1tlLnN0cnN0YXJ0XSksZS5sb29rYWhlYWQtLSxlLnN0cnN0YXJ0Kys7aWYociYmKG9mKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gSmR9cmV0dXJuIGUuaW5zZXJ0PWUuc3Ryc3RhcnQ8V2QtMT9lLnN0cnN0YXJ0OldkLTEsdD09PVBkPyhvZihlLCEwKSwwPT09ZS5zdHJtLmF2YWlsX291dD9aZDpRZCk6ZS5sYXN0X2xpdCYmKG9mKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KT9KZDpLZH1mdW5jdGlvbiBkZihlLHQpe2Zvcih2YXIgbixyLGk7Oyl7aWYoZS5sb29rYWhlYWQ8R2Qpe2lmKHVmKGUpLGUubG9va2FoZWFkPEdkJiZ0PT09JGQpcmV0dXJuIEpkO2lmKDA9PT1lLmxvb2thaGVhZClicmVha31pZihuPTAsZS5sb29rYWhlYWQ+PVdkJiYoZS5pbnNfaD0oZS5pbnNfaDw8ZS5oYXNoX3NoaWZ0XmUud2luZG93W2Uuc3Ryc3RhcnQrV2QtMV0pJmUuaGFzaF9tYXNrLG49ZS5wcmV2W2Uuc3Ryc3RhcnQmZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09ZS5zdHJzdGFydCksZS5wcmV2X2xlbmd0aD1lLm1hdGNoX2xlbmd0aCxlLnByZXZfbWF0Y2g9ZS5tYXRjaF9zdGFydCxlLm1hdGNoX2xlbmd0aD1XZC0xLDAhPT1uJiZlLnByZXZfbGVuZ3RoPGUubWF4X2xhenlfbWF0Y2gmJmUuc3Ryc3RhcnQtbjw9ZS53X3NpemUtR2QmJihlLm1hdGNoX2xlbmd0aD1jZihlLG4pLGUubWF0Y2hfbGVuZ3RoPD01JiYoMT09PWUuc3RyYXRlZ3l8fGUubWF0Y2hfbGVuZ3RoPT09V2QmJjQwOTY8ZS5zdHJzdGFydC1lLm1hdGNoX3N0YXJ0KSYmKGUubWF0Y2hfbGVuZ3RoPVdkLTEpKSxlLnByZXZfbGVuZ3RoPj1XZCYmZS5tYXRjaF9sZW5ndGg8PWUucHJldl9sZW5ndGgpe2ZvcihpPWUuc3Ryc3RhcnQrZS5sb29rYWhlYWQtV2Qscj1DZC5fdHJfdGFsbHkoZSxlLnN0cnN0YXJ0LTEtZS5wcmV2X21hdGNoLGUucHJldl9sZW5ndGgtV2QpLGUubG9va2FoZWFkLT1lLnByZXZfbGVuZ3RoLTEsZS5wcmV2X2xlbmd0aC09MjsrK2Uuc3Ryc3RhcnQ8PWkmJihlLmluc19oPShlLmluc19oPDxlLmhhc2hfc2hpZnReZS53aW5kb3dbZS5zdHJzdGFydCtXZC0xXSkmZS5oYXNoX21hc2ssbj1lLnByZXZbZS5zdHJzdGFydCZlLndfbWFza109ZS5oZWFkW2UuaW5zX2hdLGUuaGVhZFtlLmluc19oXT1lLnN0cnN0YXJ0KSwwIT0tLWUucHJldl9sZW5ndGg7KTtpZihlLm1hdGNoX2F2YWlsYWJsZT0wLGUubWF0Y2hfbGVuZ3RoPVdkLTEsZS5zdHJzdGFydCsrLHImJihvZihlLCExKSwwPT09ZS5zdHJtLmF2YWlsX291dCkpcmV0dXJuIEpkfWVsc2UgaWYoZS5tYXRjaF9hdmFpbGFibGUpe2lmKChyPUNkLl90cl90YWxseShlLDAsZS53aW5kb3dbZS5zdHJzdGFydC0xXSkpJiZvZihlLCExKSxlLnN0cnN0YXJ0KyssZS5sb29rYWhlYWQtLSwwPT09ZS5zdHJtLmF2YWlsX291dClyZXR1cm4gSmR9ZWxzZSBlLm1hdGNoX2F2YWlsYWJsZT0xLGUuc3Ryc3RhcnQrKyxlLmxvb2thaGVhZC0tfXJldHVybiBlLm1hdGNoX2F2YWlsYWJsZSYmKHI9Q2QuX3RyX3RhbGx5KGUsMCxlLndpbmRvd1tlLnN0cnN0YXJ0LTFdKSxlLm1hdGNoX2F2YWlsYWJsZT0wKSxlLmluc2VydD1lLnN0cnN0YXJ0PFdkLTE/ZS5zdHJzdGFydDpXZC0xLHQ9PT1QZD8ob2YoZSwhMCksMD09PWUuc3RybS5hdmFpbF9vdXQ/WmQ6UWQpOmUubGFzdF9saXQmJihvZihlLCExKSwwPT09ZS5zdHJtLmF2YWlsX291dCk/SmQ6S2R9ZnVuY3Rpb24gZmYoZSx0LG4scixpKXt0aGlzLmdvb2RfbGVuZ3RoPWUsdGhpcy5tYXhfbGF6eT10LHRoaXMubmljZV9sZW5ndGg9bix0aGlzLm1heF9jaGFpbj1yLHRoaXMuZnVuYz1pfWZ1bmN0aW9uIHBmKCl7dGhpcy5zdHJtPW51bGwsdGhpcy5zdGF0dXM9MCx0aGlzLnBlbmRpbmdfYnVmPW51bGwsdGhpcy5wZW5kaW5nX2J1Zl9zaXplPTAsdGhpcy5wZW5kaW5nX291dD0wLHRoaXMucGVuZGluZz0wLHRoaXMud3JhcD0wLHRoaXMuZ3poZWFkPW51bGwsdGhpcy5nemluZGV4PTAsdGhpcy5tZXRob2Q9RGQsdGhpcy5sYXN0X2ZsdXNoPS0xLHRoaXMud19zaXplPTAsdGhpcy53X2JpdHM9MCx0aGlzLndfbWFzaz0wLHRoaXMud2luZG93PW51bGwsdGhpcy53aW5kb3dfc2l6ZT0wLHRoaXMucHJldj1udWxsLHRoaXMuaGVhZD1udWxsLHRoaXMuaW5zX2g9MCx0aGlzLmhhc2hfc2l6ZT0wLHRoaXMuaGFzaF9iaXRzPTAsdGhpcy5oYXNoX21hc2s9MCx0aGlzLmhhc2hfc2hpZnQ9MCx0aGlzLmJsb2NrX3N0YXJ0PTAsdGhpcy5tYXRjaF9sZW5ndGg9MCx0aGlzLnByZXZfbWF0Y2g9MCx0aGlzLm1hdGNoX2F2YWlsYWJsZT0wLHRoaXMuc3Ryc3RhcnQ9MCx0aGlzLm1hdGNoX3N0YXJ0PTAsdGhpcy5sb29rYWhlYWQ9MCx0aGlzLnByZXZfbGVuZ3RoPTAsdGhpcy5tYXhfY2hhaW5fbGVuZ3RoPTAsdGhpcy5tYXhfbGF6eV9tYXRjaD0wLHRoaXMubGV2ZWw9MCx0aGlzLnN0cmF0ZWd5PTAsdGhpcy5nb29kX21hdGNoPTAsdGhpcy5uaWNlX21hdGNoPTAsdGhpcy5keW5fbHRyZWU9bmV3IElsLkJ1ZjE2KDIqVmQpLHRoaXMuZHluX2R0cmVlPW5ldyBJbC5CdWYxNigyKigyKnpkKzEpKSx0aGlzLmJsX3RyZWU9bmV3IElsLkJ1ZjE2KDIqKDIqVWQrMSkpLG5mKHRoaXMuZHluX2x0cmVlKSxuZih0aGlzLmR5bl9kdHJlZSksbmYodGhpcy5ibF90cmVlKSx0aGlzLmxfZGVzYz1udWxsLHRoaXMuZF9kZXNjPW51bGwsdGhpcy5ibF9kZXNjPW51bGwsdGhpcy5ibF9jb3VudD1uZXcgSWwuQnVmMTYocWQrMSksdGhpcy5oZWFwPW5ldyBJbC5CdWYxNigyKkZkKzEpLG5mKHRoaXMuaGVhcCksdGhpcy5oZWFwX2xlbj0wLHRoaXMuaGVhcF9tYXg9MCx0aGlzLmRlcHRoPW5ldyBJbC5CdWYxNigyKkZkKzEpLG5mKHRoaXMuZGVwdGgpLHRoaXMubF9idWY9MCx0aGlzLmxpdF9idWZzaXplPTAsdGhpcy5sYXN0X2xpdD0wLHRoaXMuZF9idWY9MCx0aGlzLm9wdF9sZW49MCx0aGlzLnN0YXRpY19sZW49MCx0aGlzLm1hdGNoZXM9MCx0aGlzLmluc2VydD0wLHRoaXMuYmlfYnVmPTAsdGhpcy5iaV92YWxpZD0wfWZ1bmN0aW9uIGhmKGUpe3ZhciB0O3JldHVybiBlJiZlLnN0YXRlPyhlLnRvdGFsX2luPWUudG90YWxfb3V0PTAsZS5kYXRhX3R5cGU9QmQsKHQ9ZS5zdGF0ZSkucGVuZGluZz0wLHQucGVuZGluZ19vdXQ9MCx0LndyYXA8MCYmKHQud3JhcD0tdC53cmFwKSx0LnN0YXR1cz10LndyYXA/WGQ6WWQsZS5hZGxlcj0yPT09dC53cmFwPzA6MSx0Lmxhc3RfZmx1c2g9JGQsQ2QuX3RyX2luaXQodCksTWQpOmVmKGUsamQpfWZ1bmN0aW9uIHZmKGUpe3ZhciB0LG49aGYoZSk7cmV0dXJuIG49PT1NZCYmKCh0PWUuc3RhdGUpLndpbmRvd19zaXplPTIqdC53X3NpemUsbmYodC5oZWFkKSx0Lm1heF9sYXp5X21hdGNoPUVkW3QubGV2ZWxdLm1heF9sYXp5LHQuZ29vZF9tYXRjaD1FZFt0LmxldmVsXS5nb29kX2xlbmd0aCx0Lm5pY2VfbWF0Y2g9RWRbdC5sZXZlbF0ubmljZV9sZW5ndGgsdC5tYXhfY2hhaW5fbGVuZ3RoPUVkW3QubGV2ZWxdLm1heF9jaGFpbix0LnN0cnN0YXJ0PTAsdC5ibG9ja19zdGFydD0wLHQubG9va2FoZWFkPTAsdC5pbnNlcnQ9MCx0Lm1hdGNoX2xlbmd0aD10LnByZXZfbGVuZ3RoPVdkLTEsdC5tYXRjaF9hdmFpbGFibGU9MCx0Lmluc19oPTApLG59ZnVuY3Rpb24gZ2YoZSx0LG4scixpLG8pe2lmKCFlKXJldHVybiBqZDt2YXIgYT0xO2lmKHQ9PT1MZCYmKHQ9NikscjwwPyhhPTAscj0tcik6MTU8ciYmKGE9MixyLT0xNiksaTwxfHxSZDxpfHxuIT09RGR8fHI8OHx8MTU8cnx8dDwwfHw5PHR8fG88MHx8TmQ8bylyZXR1cm4gZWYoZSxqZCk7OD09PXImJihyPTkpO3ZhciBzPW5ldyBwZjtyZXR1cm4oZS5zdGF0ZT1zKS5zdHJtPWUscy53cmFwPWEscy5nemhlYWQ9bnVsbCxzLndfYml0cz1yLHMud19zaXplPTE8PHMud19iaXRzLHMud19tYXNrPXMud19zaXplLTEscy5oYXNoX2JpdHM9aSs3LHMuaGFzaF9zaXplPTE8PHMuaGFzaF9iaXRzLHMuaGFzaF9tYXNrPXMuaGFzaF9zaXplLTEscy5oYXNoX3NoaWZ0PX5+KChzLmhhc2hfYml0cytXZC0xKS9XZCkscy53aW5kb3c9bmV3IElsLkJ1ZjgoMipzLndfc2l6ZSkscy5oZWFkPW5ldyBJbC5CdWYxNihzLmhhc2hfc2l6ZSkscy5wcmV2PW5ldyBJbC5CdWYxNihzLndfc2l6ZSkscy5saXRfYnVmc2l6ZT0xPDxpKzYscy5wZW5kaW5nX2J1Zl9zaXplPTQqcy5saXRfYnVmc2l6ZSxzLnBlbmRpbmdfYnVmPW5ldyBJbC5CdWY4KHMucGVuZGluZ19idWZfc2l6ZSkscy5kX2J1Zj0xKnMubGl0X2J1ZnNpemUscy5sX2J1Zj0zKnMubGl0X2J1ZnNpemUscy5sZXZlbD10LHMuc3RyYXRlZ3k9byxzLm1ldGhvZD1uLHZmKGUpfUVkPVtuZXcgZmYoMCwwLDAsMCxmdW5jdGlvbihlLHQpe3ZhciBuPTY1NTM1O2ZvcihuPmUucGVuZGluZ19idWZfc2l6ZS01JiYobj1lLnBlbmRpbmdfYnVmX3NpemUtNSk7Oyl7aWYoZS5sb29rYWhlYWQ8PTEpe2lmKHVmKGUpLDA9PT1lLmxvb2thaGVhZCYmdD09PSRkKXJldHVybiBKZDtpZigwPT09ZS5sb29rYWhlYWQpYnJlYWt9ZS5zdHJzdGFydCs9ZS5sb29rYWhlYWQsZS5sb29rYWhlYWQ9MDt2YXIgcj1lLmJsb2NrX3N0YXJ0K247aWYoKDA9PT1lLnN0cnN0YXJ0fHxlLnN0cnN0YXJ0Pj1yKSYmKGUubG9va2FoZWFkPWUuc3Ryc3RhcnQtcixlLnN0cnN0YXJ0PXIsb2YoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpKXJldHVybiBKZDtpZihlLnN0cnN0YXJ0LWUuYmxvY2tfc3RhcnQ+PWUud19zaXplLUdkJiYob2YoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpKXJldHVybiBKZH1yZXR1cm4gZS5pbnNlcnQ9MCx0PT09UGQ/KG9mKGUsITApLDA9PT1lLnN0cm0uYXZhaWxfb3V0P1pkOlFkKTooZS5zdHJzdGFydD5lLmJsb2NrX3N0YXJ0JiYob2YoZSwhMSksZS5zdHJtLmF2YWlsX291dCksSmQpfSksbmV3IGZmKDQsNCw4LDQsbGYpLG5ldyBmZig0LDUsMTYsOCxsZiksbmV3IGZmKDQsNiwzMiwzMixsZiksbmV3IGZmKDQsNCwxNiwxNixkZiksbmV3IGZmKDgsMTYsMzIsMzIsZGYpLG5ldyBmZig4LDE2LDEyOCwxMjgsZGYpLG5ldyBmZig4LDMyLDEyOCwyNTYsZGYpLG5ldyBmZigzMiwxMjgsMjU4LDEwMjQsZGYpLG5ldyBmZigzMiwyNTgsMjU4LDQwOTYsZGYpXTt2YXIgbWY9e2RlZmxhdGVJbml0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGdmKGUsdCxEZCwxNSw4LDApfSxkZWZsYXRlSW5pdDI6Z2YsZGVmbGF0ZVJlc2V0OnZmLGRlZmxhdGVSZXNldEtlZXA6aGYsZGVmbGF0ZVNldEhlYWRlcjpmdW5jdGlvbihlLHQpe3JldHVybiBlJiZlLnN0YXRlPzIhPT1lLnN0YXRlLndyYXA/amQ6KGUuc3RhdGUuZ3poZWFkPXQsTWQpOmpkfSxkZWZsYXRlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG87aWYoIWV8fCFlLnN0YXRlfHw1PHR8fHQ8MClyZXR1cm4gZT9lZihlLGpkKTpqZDtpZihyPWUuc3RhdGUsIWUub3V0cHV0fHwhZS5pbnB1dCYmMCE9PWUuYXZhaWxfaW58fDY2Nj09PXIuc3RhdHVzJiZ0IT09UGQpcmV0dXJuIGVmKGUsMD09PWUuYXZhaWxfb3V0Py01OmpkKTtpZihyLnN0cm09ZSxuPXIubGFzdF9mbHVzaCxyLmxhc3RfZmx1c2g9dCxyLnN0YXR1cz09PVhkKWlmKDI9PT1yLndyYXApZS5hZGxlcj0wLGFmKHIsMzEpLGFmKHIsMTM5KSxhZihyLDgpLHIuZ3poZWFkPyhhZihyLChyLmd6aGVhZC50ZXh0PzE6MCkrKHIuZ3poZWFkLmhjcmM/MjowKSsoci5nemhlYWQuZXh0cmE/NDowKSsoci5nemhlYWQubmFtZT84OjApKyhyLmd6aGVhZC5jb21tZW50PzE2OjApKSxhZihyLDI1NSZyLmd6aGVhZC50aW1lKSxhZihyLHIuZ3poZWFkLnRpbWU+PjgmMjU1KSxhZihyLHIuZ3poZWFkLnRpbWU+PjE2JjI1NSksYWYocixyLmd6aGVhZC50aW1lPj4yNCYyNTUpLGFmKHIsOT09PXIubGV2ZWw/MjoyPD1yLnN0cmF0ZWd5fHxyLmxldmVsPDI/NDowKSxhZihyLDI1NSZyLmd6aGVhZC5vcyksci5nemhlYWQuZXh0cmEmJnIuZ3poZWFkLmV4dHJhLmxlbmd0aCYmKGFmKHIsMjU1JnIuZ3poZWFkLmV4dHJhLmxlbmd0aCksYWYocixyLmd6aGVhZC5leHRyYS5sZW5ndGg+PjgmMjU1KSksci5nemhlYWQuaGNyYyYmKGUuYWRsZXI9QWQoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZywwKSksci5nemluZGV4PTAsci5zdGF0dXM9NjkpOihhZihyLDApLGFmKHIsMCksYWYociwwKSxhZihyLDApLGFmKHIsMCksYWYociw5PT09ci5sZXZlbD8yOjI8PXIuc3RyYXRlZ3l8fHIubGV2ZWw8Mj80OjApLGFmKHIsMyksci5zdGF0dXM9WWQpO2Vsc2V7dmFyIGE9RGQrKHIud19iaXRzLTg8PDQpPDw4O2F8PSgyPD1yLnN0cmF0ZWd5fHxyLmxldmVsPDI/MDpyLmxldmVsPDY/MTo2PT09ci5sZXZlbD8yOjMpPDw2LDAhPT1yLnN0cnN0YXJ0JiYoYXw9MzIpLGErPTMxLWElMzEsci5zdGF0dXM9WWQsc2YocixhKSwwIT09ci5zdHJzdGFydCYmKHNmKHIsZS5hZGxlcj4+PjE2KSxzZihyLDY1NTM1JmUuYWRsZXIpKSxlLmFkbGVyPTF9aWYoNjk9PT1yLnN0YXR1cylpZihyLmd6aGVhZC5leHRyYSl7Zm9yKGk9ci5wZW5kaW5nO3IuZ3ppbmRleDwoNjU1MzUmci5nemhlYWQuZXh0cmEubGVuZ3RoKSYmKHIucGVuZGluZyE9PXIucGVuZGluZ19idWZfc2l6ZXx8KHIuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5pJiYoZS5hZGxlcj1BZChlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLWksaSkpLHJmKGUpLGk9ci5wZW5kaW5nLHIucGVuZGluZyE9PXIucGVuZGluZ19idWZfc2l6ZSkpOylhZihyLDI1NSZyLmd6aGVhZC5leHRyYVtyLmd6aW5kZXhdKSxyLmd6aW5kZXgrKztyLmd6aGVhZC5oY3JjJiZyLnBlbmRpbmc+aSYmKGUuYWRsZXI9QWQoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZy1pLGkpKSxyLmd6aW5kZXg9PT1yLmd6aGVhZC5leHRyYS5sZW5ndGgmJihyLmd6aW5kZXg9MCxyLnN0YXR1cz03Myl9ZWxzZSByLnN0YXR1cz03MztpZig3Mz09PXIuc3RhdHVzKWlmKHIuZ3poZWFkLm5hbWUpe2k9ci5wZW5kaW5nO2Rve2lmKHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSYmKHIuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5pJiYoZS5hZGxlcj1BZChlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLWksaSkpLHJmKGUpLGk9ci5wZW5kaW5nLHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSkpe289MTticmVha31hZihyLG89ci5nemluZGV4PHIuZ3poZWFkLm5hbWUubGVuZ3RoPzI1NSZyLmd6aGVhZC5uYW1lLmNoYXJDb2RlQXQoci5nemluZGV4KyspOjApfXdoaWxlKDAhPT1vKTtyLmd6aGVhZC5oY3JjJiZyLnBlbmRpbmc+aSYmKGUuYWRsZXI9QWQoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZy1pLGkpKSwwPT09byYmKHIuZ3ppbmRleD0wLHIuc3RhdHVzPTkxKX1lbHNlIHIuc3RhdHVzPTkxO2lmKDkxPT09ci5zdGF0dXMpaWYoci5nemhlYWQuY29tbWVudCl7aT1yLnBlbmRpbmc7ZG97aWYoci5wZW5kaW5nPT09ci5wZW5kaW5nX2J1Zl9zaXplJiYoci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPmkmJihlLmFkbGVyPUFkKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctaSxpKSkscmYoZSksaT1yLnBlbmRpbmcsci5wZW5kaW5nPT09ci5wZW5kaW5nX2J1Zl9zaXplKSl7bz0xO2JyZWFrfWFmKHIsbz1yLmd6aW5kZXg8ci5nemhlYWQuY29tbWVudC5sZW5ndGg/MjU1JnIuZ3poZWFkLmNvbW1lbnQuY2hhckNvZGVBdChyLmd6aW5kZXgrKyk6MCl9d2hpbGUoMCE9PW8pO3IuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5pJiYoZS5hZGxlcj1BZChlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLWksaSkpLDA9PT1vJiYoci5zdGF0dXM9MTAzKX1lbHNlIHIuc3RhdHVzPTEwMztpZigxMDM9PT1yLnN0YXR1cyYmKHIuZ3poZWFkLmhjcmM/KHIucGVuZGluZysyPnIucGVuZGluZ19idWZfc2l6ZSYmcmYoZSksci5wZW5kaW5nKzI8PXIucGVuZGluZ19idWZfc2l6ZSYmKGFmKHIsMjU1JmUuYWRsZXIpLGFmKHIsZS5hZGxlcj4+OCYyNTUpLGUuYWRsZXI9MCxyLnN0YXR1cz1ZZCkpOnIuc3RhdHVzPVlkKSwwIT09ci5wZW5kaW5nKXtpZihyZihlKSwwPT09ZS5hdmFpbF9vdXQpcmV0dXJuIHIubGFzdF9mbHVzaD0tMSxNZH1lbHNlIGlmKDA9PT1lLmF2YWlsX2luJiZ0Zih0KTw9dGYobikmJnQhPT1QZClyZXR1cm4gZWYoZSwtNSk7aWYoNjY2PT09ci5zdGF0dXMmJjAhPT1lLmF2YWlsX2luKXJldHVybiBlZihlLC01KTtpZigwIT09ZS5hdmFpbF9pbnx8MCE9PXIubG9va2FoZWFkfHx0IT09JGQmJjY2NiE9PXIuc3RhdHVzKXt2YXIgcz0yPT09ci5zdHJhdGVneT9mdW5jdGlvbihlLHQpe2Zvcih2YXIgbjs7KXtpZigwPT09ZS5sb29rYWhlYWQmJih1ZihlKSwwPT09ZS5sb29rYWhlYWQpKXtpZih0PT09JGQpcmV0dXJuIEpkO2JyZWFrfWlmKGUubWF0Y2hfbGVuZ3RoPTAsbj1DZC5fdHJfdGFsbHkoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnRdKSxlLmxvb2thaGVhZC0tLGUuc3Ryc3RhcnQrKyxuJiYob2YoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpKXJldHVybiBKZH1yZXR1cm4gZS5pbnNlcnQ9MCx0PT09UGQ/KG9mKGUsITApLDA9PT1lLnN0cm0uYXZhaWxfb3V0P1pkOlFkKTplLmxhc3RfbGl0JiYob2YoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpP0pkOktkfShyLHQpOjM9PT1yLnN0cmF0ZWd5P2Z1bmN0aW9uKGUsdCl7Zm9yKHZhciBuLHIsaSxvLGE9ZS53aW5kb3c7Oyl7aWYoZS5sb29rYWhlYWQ8PUhkKXtpZih1ZihlKSxlLmxvb2thaGVhZDw9SGQmJnQ9PT0kZClyZXR1cm4gSmQ7aWYoMD09PWUubG9va2FoZWFkKWJyZWFrfWlmKGUubWF0Y2hfbGVuZ3RoPTAsZS5sb29rYWhlYWQ+PVdkJiYwPGUuc3Ryc3RhcnQmJihyPWFbaT1lLnN0cnN0YXJ0LTFdKT09PWFbKytpXSYmcj09PWFbKytpXSYmcj09PWFbKytpXSl7bz1lLnN0cnN0YXJ0K0hkO2Rve313aGlsZShyPT09YVsrK2ldJiZyPT09YVsrK2ldJiZyPT09YVsrK2ldJiZyPT09YVsrK2ldJiZyPT09YVsrK2ldJiZyPT09YVsrK2ldJiZyPT09YVsrK2ldJiZyPT09YVsrK2ldJiZpPG8pO2UubWF0Y2hfbGVuZ3RoPUhkLShvLWkpLGUubWF0Y2hfbGVuZ3RoPmUubG9va2FoZWFkJiYoZS5tYXRjaF9sZW5ndGg9ZS5sb29rYWhlYWQpfWlmKGUubWF0Y2hfbGVuZ3RoPj1XZD8obj1DZC5fdHJfdGFsbHkoZSwxLGUubWF0Y2hfbGVuZ3RoLVdkKSxlLmxvb2thaGVhZC09ZS5tYXRjaF9sZW5ndGgsZS5zdHJzdGFydCs9ZS5tYXRjaF9sZW5ndGgsZS5tYXRjaF9sZW5ndGg9MCk6KG49Q2QuX3RyX3RhbGx5KGUsMCxlLndpbmRvd1tlLnN0cnN0YXJ0XSksZS5sb29rYWhlYWQtLSxlLnN0cnN0YXJ0KyspLG4mJihvZihlLCExKSwwPT09ZS5zdHJtLmF2YWlsX291dCkpcmV0dXJuIEpkfXJldHVybiBlLmluc2VydD0wLHQ9PT1QZD8ob2YoZSwhMCksMD09PWUuc3RybS5hdmFpbF9vdXQ/WmQ6UWQpOmUubGFzdF9saXQmJihvZihlLCExKSwwPT09ZS5zdHJtLmF2YWlsX291dCk/SmQ6S2R9KHIsdCk6RWRbci5sZXZlbF0uZnVuYyhyLHQpO2lmKHMhPT1aZCYmcyE9PVFkfHwoci5zdGF0dXM9NjY2KSxzPT09SmR8fHM9PT1aZClyZXR1cm4gMD09PWUuYXZhaWxfb3V0JiYoci5sYXN0X2ZsdXNoPS0xKSxNZDtpZihzPT09S2QmJigxPT09dD9DZC5fdHJfYWxpZ24ocik6NSE9PXQmJihDZC5fdHJfc3RvcmVkX2Jsb2NrKHIsMCwwLCExKSwzPT09dCYmKG5mKHIuaGVhZCksMD09PXIubG9va2FoZWFkJiYoci5zdHJzdGFydD0wLHIuYmxvY2tfc3RhcnQ9MCxyLmluc2VydD0wKSkpLHJmKGUpLDA9PT1lLmF2YWlsX291dCkpcmV0dXJuIHIubGFzdF9mbHVzaD0tMSxNZH1yZXR1cm4gdCE9PVBkP01kOnIud3JhcDw9MD8xOigyPT09ci53cmFwPyhhZihyLDI1NSZlLmFkbGVyKSxhZihyLGUuYWRsZXI+PjgmMjU1KSxhZihyLGUuYWRsZXI+PjE2JjI1NSksYWYocixlLmFkbGVyPj4yNCYyNTUpLGFmKHIsMjU1JmUudG90YWxfaW4pLGFmKHIsZS50b3RhbF9pbj4+OCYyNTUpLGFmKHIsZS50b3RhbF9pbj4+MTYmMjU1KSxhZihyLGUudG90YWxfaW4+PjI0JjI1NSkpOihzZihyLGUuYWRsZXI+Pj4xNiksc2Yociw2NTUzNSZlLmFkbGVyKSkscmYoZSksMDxyLndyYXAmJihyLndyYXA9LXIud3JhcCksMCE9PXIucGVuZGluZz9NZDoxKX0sZGVmbGF0ZUVuZDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gZSYmZS5zdGF0ZT8odD1lLnN0YXRlLnN0YXR1cykhPT1YZCYmNjkhPT10JiY3MyE9PXQmJjkxIT09dCYmMTAzIT09dCYmdCE9PVlkJiY2NjYhPT10P2VmKGUsamQpOihlLnN0YXRlPW51bGwsdD09PVlkP2VmKGUsLTMpOk1kKTpqZH0sZGVmbGF0ZVNldERpY3Rpb25hcnk6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhLHMsYyx1LGw9dC5sZW5ndGg7aWYoIWV8fCFlLnN0YXRlKXJldHVybiBqZDtpZigyPT09KG89KG49ZS5zdGF0ZSkud3JhcCl8fDE9PT1vJiZuLnN0YXR1cyE9PVhkfHxuLmxvb2thaGVhZClyZXR1cm4gamQ7Zm9yKDE9PT1vJiYoZS5hZGxlcj1UZChlLmFkbGVyLHQsbCwwKSksbi53cmFwPTAsbD49bi53X3NpemUmJigwPT09byYmKG5mKG4uaGVhZCksbi5zdHJzdGFydD0wLG4uYmxvY2tfc3RhcnQ9MCxuLmluc2VydD0wKSx1PW5ldyBJbC5CdWY4KG4ud19zaXplKSxJbC5hcnJheVNldCh1LHQsbC1uLndfc2l6ZSxuLndfc2l6ZSwwKSx0PXUsbD1uLndfc2l6ZSksYT1lLmF2YWlsX2luLHM9ZS5uZXh0X2luLGM9ZS5pbnB1dCxlLmF2YWlsX2luPWwsZS5uZXh0X2luPTAsZS5pbnB1dD10LHVmKG4pO24ubG9va2FoZWFkPj1XZDspe2ZvcihyPW4uc3Ryc3RhcnQsaT1uLmxvb2thaGVhZC0oV2QtMSk7bi5pbnNfaD0obi5pbnNfaDw8bi5oYXNoX3NoaWZ0Xm4ud2luZG93W3IrV2QtMV0pJm4uaGFzaF9tYXNrLG4ucHJldltyJm4ud19tYXNrXT1uLmhlYWRbbi5pbnNfaF0sbi5oZWFkW24uaW5zX2hdPXIscisrLC0taTspO24uc3Ryc3RhcnQ9cixuLmxvb2thaGVhZD1XZC0xLHVmKG4pfXJldHVybiBuLnN0cnN0YXJ0Kz1uLmxvb2thaGVhZCxuLmJsb2NrX3N0YXJ0PW4uc3Ryc3RhcnQsbi5pbnNlcnQ9bi5sb29rYWhlYWQsbi5sb29rYWhlYWQ9MCxuLm1hdGNoX2xlbmd0aD1uLnByZXZfbGVuZ3RoPVdkLTEsbi5tYXRjaF9hdmFpbGFibGU9MCxlLm5leHRfaW49cyxlLmlucHV0PWMsZS5hdmFpbF9pbj1hLG4ud3JhcD1vLE1kfSxkZWZsYXRlSW5mbzoicGFrbyBkZWZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSJ9LHlmPSEwLF9mPSEwO3RyeXtTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsWzBdKX1jYXRjaChlKXt5Zj0hMX10cnl7U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLG5ldyBVaW50OEFycmF5KDEpKX1jYXRjaChlKXtfZj0hMX1mb3IodmFyIGJmPW5ldyBJbC5CdWY4KDI1Niksd2Y9MDt3ZjwyNTY7d2YrKyliZlt3Zl09MjUyPD13Zj82OjI0ODw9d2Y/NToyNDA8PXdmPzQ6MjI0PD13Zj8zOjE5Mjw9d2Y/MjoxO2JmWzI1NF09YmZbMjU0XT0xO2Z1bmN0aW9uIGtmKGUsdCl7aWYodDw2NTUzNCYmKGUuc3ViYXJyYXkmJl9mfHwhZS5zdWJhcnJheSYmeWYpKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsSWwuc2hyaW5rQnVmKGUsdCkpO2Zvcih2YXIgbj0iIixyPTA7cjx0O3IrKyluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbcl0pO3JldHVybiBufXZhciBTZj17c3RyaW5nMmJ1ZjpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGE9ZS5sZW5ndGgscz0wO2ZvcihpPTA7aTxhO2krKyk1NTI5Nj09KDY0NTEyJihuPWUuY2hhckNvZGVBdChpKSkpJiZpKzE8YSYmNTYzMjA9PSg2NDUxMiYocj1lLmNoYXJDb2RlQXQoaSsxKSkpJiYobj02NTUzNisobi01NTI5Njw8MTApKyhyLTU2MzIwKSxpKyspLHMrPW48MTI4PzE6bjwyMDQ4PzI6bjw2NTUzNj8zOjQ7Zm9yKHQ9bmV3IElsLkJ1ZjgocyksaT1vPTA7bzxzO2krKyk1NTI5Nj09KDY0NTEyJihuPWUuY2hhckNvZGVBdChpKSkpJiZpKzE8YSYmNTYzMjA9PSg2NDUxMiYocj1lLmNoYXJDb2RlQXQoaSsxKSkpJiYobj02NTUzNisobi01NTI5Njw8MTApKyhyLTU2MzIwKSxpKyspLG48MTI4P3RbbysrXT1uOihuPDIwNDg/dFtvKytdPTE5MnxuPj4+Njoobjw2NTUzNj90W28rK109MjI0fG4+Pj4xMjoodFtvKytdPTI0MHxuPj4+MTgsdFtvKytdPTEyOHxuPj4+MTImNjMpLHRbbysrXT0xMjh8bj4+PjYmNjMpLHRbbysrXT0xMjh8NjMmbik7cmV0dXJuIHR9LGJ1ZjJiaW5zdHJpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuIGtmKGUsZS5sZW5ndGgpfSxiaW5zdHJpbmcyYnVmOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1uZXcgSWwuQnVmOChlLmxlbmd0aCksbj0wLHI9dC5sZW5ndGg7bjxyO24rKyl0W25dPWUuY2hhckNvZGVBdChuKTtyZXR1cm4gdH0sYnVmMnN0cmluZzpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGE9dHx8ZS5sZW5ndGgscz1uZXcgQXJyYXkoMiphKTtmb3Iobj1yPTA7bjxhOylpZigoaT1lW24rK10pPDEyOClzW3IrK109aTtlbHNlIGlmKDQ8KG89YmZbaV0pKXNbcisrXT02NTUzMyxuKz1vLTE7ZWxzZXtmb3IoaSY9Mj09PW8/MzE6Mz09PW8/MTU6NzsxPG8mJm48YTspaT1pPDw2fDYzJmVbbisrXSxvLS07MTxvP3NbcisrXT02NTUzMzppPDY1NTM2P3NbcisrXT1pOihpLT02NTUzNixzW3IrK109NTUyOTZ8aT4+MTAmMTAyMyxzW3IrK109NTYzMjB8MTAyMyZpKX1yZXR1cm4ga2YocyxyKX0sdXRmOGJvcmRlcjpmdW5jdGlvbihlLHQpe3ZhciBuO2ZvcigodD10fHxlLmxlbmd0aCk+ZS5sZW5ndGgmJih0PWUubGVuZ3RoKSxuPXQtMTswPD1uJiYxMjg9PSgxOTImZVtuXSk7KW4tLTtyZXR1cm4gbjwwP3Q6MD09PW4/dDpuK2JmW2Vbbl1dPnQ/bjp0fX07dmFyIHhmPWZ1bmN0aW9uKCl7dGhpcy5pbnB1dD1udWxsLHRoaXMubmV4dF9pbj0wLHRoaXMuYXZhaWxfaW49MCx0aGlzLnRvdGFsX2luPTAsdGhpcy5vdXRwdXQ9bnVsbCx0aGlzLm5leHRfb3V0PTAsdGhpcy5hdmFpbF9vdXQ9MCx0aGlzLnRvdGFsX291dD0wLHRoaXMubXNnPSIiLHRoaXMuc3RhdGU9bnVsbCx0aGlzLmRhdGFfdHlwZT0yLHRoaXMuYWRsZXI9MH0sQ2Y9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxUZj0wLE9mPS0xLEVmPTAsQWY9ODtmdW5jdGlvbiBJZihlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBJZikpcmV0dXJuIG5ldyBJZihlKTt0aGlzLm9wdGlvbnM9SWwuYXNzaWduKHtsZXZlbDpPZixtZXRob2Q6QWYsY2h1bmtTaXplOjE2Mzg0LHdpbmRvd0JpdHM6MTUsbWVtTGV2ZWw6OCxzdHJhdGVneTpFZix0bzoiIn0sZXx8e30pO3ZhciB0PXRoaXMub3B0aW9uczt0LnJhdyYmMDx0LndpbmRvd0JpdHM/dC53aW5kb3dCaXRzPS10LndpbmRvd0JpdHM6dC5nemlwJiYwPHQud2luZG93Qml0cyYmdC53aW5kb3dCaXRzPDE2JiYodC53aW5kb3dCaXRzKz0xNiksdGhpcy5lcnI9MCx0aGlzLm1zZz0iIix0aGlzLmVuZGVkPSExLHRoaXMuY2h1bmtzPVtdLHRoaXMuc3RybT1uZXcgeGYsdGhpcy5zdHJtLmF2YWlsX291dD0wO3ZhciBuPW1mLmRlZmxhdGVJbml0Mih0aGlzLnN0cm0sdC5sZXZlbCx0Lm1ldGhvZCx0LndpbmRvd0JpdHMsdC5tZW1MZXZlbCx0LnN0cmF0ZWd5KTtpZihuIT09VGYpdGhyb3cgbmV3IEVycm9yKElkW25dKTtpZih0LmhlYWRlciYmbWYuZGVmbGF0ZVNldEhlYWRlcih0aGlzLnN0cm0sdC5oZWFkZXIpLHQuZGljdGlvbmFyeSl7dmFyIHI7aWYocj0ic3RyaW5nIj09dHlwZW9mIHQuZGljdGlvbmFyeT9TZi5zdHJpbmcyYnVmKHQuZGljdGlvbmFyeSk6IltvYmplY3QgQXJyYXlCdWZmZXJdIj09PUNmLmNhbGwodC5kaWN0aW9uYXJ5KT9uZXcgVWludDhBcnJheSh0LmRpY3Rpb25hcnkpOnQuZGljdGlvbmFyeSwobj1tZi5kZWZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0scikpIT09VGYpdGhyb3cgbmV3IEVycm9yKElkW25dKTt0aGlzLl9kaWN0X3NldD0hMH19ZnVuY3Rpb24gJGYoZSx0KXt2YXIgbj1uZXcgSWYodCk7aWYobi5wdXNoKGUsITApLG4uZXJyKXRocm93IG4ubXNnfHxJZFtuLmVycl07cmV0dXJuIG4ucmVzdWx0fUlmLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPXRoaXMuc3RybSxvPXRoaXMub3B0aW9ucy5jaHVua1NpemU7aWYodGhpcy5lbmRlZClyZXR1cm4hMTtyPXQ9PT1+fnQ/dDohMD09PXQ/NDowLCJzdHJpbmciPT10eXBlb2YgZT9pLmlucHV0PVNmLnN0cmluZzJidWYoZSk6IltvYmplY3QgQXJyYXlCdWZmZXJdIj09PUNmLmNhbGwoZSk/aS5pbnB1dD1uZXcgVWludDhBcnJheShlKTppLmlucHV0PWUsaS5uZXh0X2luPTAsaS5hdmFpbF9pbj1pLmlucHV0Lmxlbmd0aDtkb3tpZigwPT09aS5hdmFpbF9vdXQmJihpLm91dHB1dD1uZXcgSWwuQnVmOChvKSxpLm5leHRfb3V0PTAsaS5hdmFpbF9vdXQ9byksMSE9PShuPW1mLmRlZmxhdGUoaSxyKSkmJm4hPT1UZilyZXR1cm4gdGhpcy5vbkVuZChuKSwhKHRoaXMuZW5kZWQ9ITApOzAhPT1pLmF2YWlsX291dCYmKDAhPT1pLmF2YWlsX2lufHw0IT09ciYmMiE9PXIpfHwoInN0cmluZyI9PT10aGlzLm9wdGlvbnMudG8/dGhpcy5vbkRhdGEoU2YuYnVmMmJpbnN0cmluZyhJbC5zaHJpbmtCdWYoaS5vdXRwdXQsaS5uZXh0X291dCkpKTp0aGlzLm9uRGF0YShJbC5zaHJpbmtCdWYoaS5vdXRwdXQsaS5uZXh0X291dCkpKX13aGlsZSgoMDxpLmF2YWlsX2lufHwwPT09aS5hdmFpbF9vdXQpJiYxIT09bik7cmV0dXJuIDQ9PT1yPyhuPW1mLmRlZmxhdGVFbmQodGhpcy5zdHJtKSx0aGlzLm9uRW5kKG4pLHRoaXMuZW5kZWQ9ITAsbj09PVRmKToyIT09cnx8KHRoaXMub25FbmQoVGYpLCEoaS5hdmFpbF9vdXQ9MCkpfSxJZi5wcm90b3R5cGUub25EYXRhPWZ1bmN0aW9uKGUpe3RoaXMuY2h1bmtzLnB1c2goZSl9LElmLnByb3RvdHlwZS5vbkVuZD1mdW5jdGlvbihlKXtlPT09VGYmJigic3RyaW5nIj09PXRoaXMub3B0aW9ucy50bz90aGlzLnJlc3VsdD10aGlzLmNodW5rcy5qb2luKCIiKTp0aGlzLnJlc3VsdD1JbC5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKSksdGhpcy5jaHVua3M9W10sdGhpcy5lcnI9ZSx0aGlzLm1zZz10aGlzLnN0cm0ubXNnfTt2YXIgUGY9e0RlZmxhdGU6SWYsZGVmbGF0ZTokZixkZWZsYXRlUmF3OmZ1bmN0aW9uKGUsdCl7cmV0dXJuKHQ9dHx8e30pLnJhdz0hMCwkZihlLHQpfSxnemlwOmZ1bmN0aW9uKGUsdCl7cmV0dXJuKHQ9dHx8e30pLmd6aXA9ITAsJGYoZSx0KX19LE1mPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYSxzLGMsdSxsLGQsZixwLGgsdixnLG0seSxfLGIsdyxrLFMseCxDLFQ7bj1lLnN0YXRlLHI9ZS5uZXh0X2luLEM9ZS5pbnB1dCxpPXIrKGUuYXZhaWxfaW4tNSksbz1lLm5leHRfb3V0LFQ9ZS5vdXRwdXQsYT1vLSh0LWUuYXZhaWxfb3V0KSxzPW8rKGUuYXZhaWxfb3V0LTI1NyksYz1uLmRtYXgsdT1uLndzaXplLGw9bi53aGF2ZSxkPW4ud25leHQsZj1uLndpbmRvdyxwPW4uaG9sZCxoPW4uYml0cyx2PW4ubGVuY29kZSxnPW4uZGlzdGNvZGUsbT0oMTw8bi5sZW5iaXRzKS0xLHk9KDE8PG4uZGlzdGJpdHMpLTE7ZTpkb3toPDE1JiYocCs9Q1tyKytdPDxoLGgrPTgscCs9Q1tyKytdPDxoLGgrPTgpLF89dltwJm1dO3Q6Zm9yKDs7KXtpZihwPj4+PWI9Xz4+PjI0LGgtPWIsMD09PShiPV8+Pj4xNiYyNTUpKVRbbysrXT02NTUzNSZfO2Vsc2V7aWYoISgxNiZiKSl7aWYoMD09KDY0JmIpKXtfPXZbKDY1NTM1Jl8pKyhwJigxPDxiKS0xKV07Y29udGludWUgdH1pZigzMiZiKXtuLm1vZGU9MTI7YnJlYWsgZX1lLm1zZz0iaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIixuLm1vZGU9MzA7YnJlYWsgZX13PTY1NTM1Jl8sKGImPTE1KSYmKGg8YiYmKHArPUNbcisrXTw8aCxoKz04KSx3Kz1wJigxPDxiKS0xLHA+Pj49YixoLT1iKSxoPDE1JiYocCs9Q1tyKytdPDxoLGgrPTgscCs9Q1tyKytdPDxoLGgrPTgpLF89Z1twJnldO246Zm9yKDs7KXtpZihwPj4+PWI9Xz4+PjI0LGgtPWIsISgxNiYoYj1fPj4+MTYmMjU1KSkpe2lmKDA9PSg2NCZiKSl7Xz1nWyg2NTUzNSZfKSsocCYoMTw8YiktMSldO2NvbnRpbnVlIG59ZS5tc2c9ImludmFsaWQgZGlzdGFuY2UgY29kZSIsbi5tb2RlPTMwO2JyZWFrIGV9aWYoaz02NTUzNSZfLGg8KGImPTE1KSYmKHArPUNbcisrXTw8aCwoaCs9OCk8YiYmKHArPUNbcisrXTw8aCxoKz04KSksYzwoays9cCYoMTw8YiktMSkpe2UubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsbi5tb2RlPTMwO2JyZWFrIGV9aWYocD4+Pj1iLGgtPWIsKGI9by1hKTxrKXtpZihsPChiPWstYikmJm4uc2FuZSl7ZS5tc2c9ImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIixuLm1vZGU9MzA7YnJlYWsgZX1pZih4PWYsKFM9MCk9PT1kKXtpZihTKz11LWIsYjx3KXtmb3Iody09YjtUW28rK109ZltTKytdLC0tYjspO1M9by1rLHg9VH19ZWxzZSBpZihkPGIpe2lmKFMrPXUrZC1iLChiLT1kKTx3KXtmb3Iody09YjtUW28rK109ZltTKytdLC0tYjspO2lmKFM9MCxkPHcpe2Zvcih3LT1iPWQ7VFtvKytdPWZbUysrXSwtLWI7KTtTPW8tayx4PVR9fX1lbHNlIGlmKFMrPWQtYixiPHcpe2Zvcih3LT1iO1RbbysrXT1mW1MrK10sLS1iOyk7Uz1vLWsseD1UfWZvcig7Mjx3OylUW28rK109eFtTKytdLFRbbysrXT14W1MrK10sVFtvKytdPXhbUysrXSx3LT0zO3cmJihUW28rK109eFtTKytdLDE8dyYmKFRbbysrXT14W1MrK10pKX1lbHNle2ZvcihTPW8taztUW28rK109VFtTKytdLFRbbysrXT1UW1MrK10sVFtvKytdPVRbUysrXSwyPCh3LT0zKTspO3cmJihUW28rK109VFtTKytdLDE8dyYmKFRbbysrXT1UW1MrK10pKX1icmVha319YnJlYWt9fXdoaWxlKHI8aSYmbzxzKTtyLT13PWg+PjMscCY9KDE8PChoLT13PDwzKSktMSxlLm5leHRfaW49cixlLm5leHRfb3V0PW8sZS5hdmFpbF9pbj1yPGk/aS1yKzU6NS0oci1pKSxlLmF2YWlsX291dD1vPHM/cy1vKzI1NzoyNTctKG8tcyksbi5ob2xkPXAsbi5iaXRzPWh9LGpmPVszLDQsNSw2LDcsOCw5LDEwLDExLDEzLDE1LDE3LDE5LDIzLDI3LDMxLDM1LDQzLDUxLDU5LDY3LDgzLDk5LDExNSwxMzEsMTYzLDE5NSwyMjcsMjU4LDAsMF0sTGY9WzE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE3LDE3LDE3LDE3LDE4LDE4LDE4LDE4LDE5LDE5LDE5LDE5LDIwLDIwLDIwLDIwLDIxLDIxLDIxLDIxLDE2LDcyLDc4XSxOZj1bMSwyLDMsNCw1LDcsOSwxMywxNywyNSwzMyw0OSw2NSw5NywxMjksMTkzLDI1NywzODUsNTEzLDc2OSwxMDI1LDE1MzcsMjA0OSwzMDczLDQwOTcsNjE0NSw4MTkzLDEyMjg5LDE2Mzg1LDI0NTc3LDAsMF0sQmY9WzE2LDE2LDE2LDE2LDE3LDE3LDE4LDE4LDE5LDE5LDIwLDIwLDIxLDIxLDIyLDIyLDIzLDIzLDI0LDI0LDI1LDI1LDI2LDI2LDI3LDI3LDI4LDI4LDI5LDI5LDY0LDY0XSxEZj1mdW5jdGlvbihlLHQsbixyLGksbyxhLHMpe3ZhciBjLHUsbCxkLGYscCxoLHYsZyxtPXMuYml0cyx5PTAsXz0wLGI9MCx3PTAsaz0wLFM9MCx4PTAsQz0wLFQ9MCxPPTAsRT1udWxsLEE9MCxJPW5ldyBJbC5CdWYxNigxNiksJD1uZXcgSWwuQnVmMTYoMTYpLFA9bnVsbCxNPTA7Zm9yKHk9MDt5PD0xNTt5KyspSVt5XT0wO2ZvcihfPTA7XzxyO18rKylJW3RbbitfXV0rKztmb3Ioaz1tLHc9MTU7MTw9dyYmMD09PUlbd107dy0tKTtpZih3PGsmJihrPXcpLDA9PT13KXJldHVybiBpW28rK109MjA5NzE1MjAsaVtvKytdPTIwOTcxNTIwLHMuYml0cz0xLDA7Zm9yKGI9MTtiPHcmJjA9PT1JW2JdO2IrKyk7Zm9yKGs8YiYmKGs9YikseT1DPTE7eTw9MTU7eSsrKWlmKEM8PD0xLChDLT1JW3ldKTwwKXJldHVybi0xO2lmKDA8QyYmKDA9PT1lfHwxIT09dykpcmV0dXJuLTE7Zm9yKCRbMV09MCx5PTE7eTwxNTt5KyspJFt5KzFdPSRbeV0rSVt5XTtmb3IoXz0wO188cjtfKyspMCE9PXRbbitfXSYmKGFbJFt0W24rX11dKytdPV8pO2lmKDA9PT1lPyhFPVA9YSxwPTE5KToxPT09ZT8oRT1qZixBLT0yNTcsUD1MZixNLT0yNTcscD0yNTYpOihFPU5mLFA9QmYscD0tMSkseT1iLGY9byx4PV89Tz0wLGw9LTEsZD0oVD0xPDwoUz1rKSktMSwxPT09ZSYmODUyPFR8fDI9PT1lJiY1OTI8VClyZXR1cm4gMTtmb3IoOzspe2ZvcihoPXkteCxhW19dPHA/KHY9MCxnPWFbX10pOmFbX10+cD8odj1QW00rYVtfXV0sZz1FW0ErYVtfXV0pOih2PTk2LGc9MCksYz0xPDx5LXgsYj11PTE8PFM7aVtmKyhPPj54KSsodS09YyldPWg8PDI0fHY8PDE2fGd8MCwwIT09dTspO2ZvcihjPTE8PHktMTtPJmM7KWM+Pj0xO2lmKDAhPT1jPyhPJj1jLTEsTys9Yyk6Tz0wLF8rKywwPT0tLUlbeV0pe2lmKHk9PT13KWJyZWFrO3k9dFtuK2FbX11dfWlmKGs8eSYmKE8mZCkhPT1sKXtmb3IoMD09PXgmJih4PWspLGYrPWIsQz0xPDwoUz15LXgpO1MreDx3JiYhKChDLT1JW1MreF0pPD0wKTspUysrLEM8PD0xO2lmKFQrPTE8PFMsMT09PWUmJjg1MjxUfHwyPT09ZSYmNTkyPFQpcmV0dXJuIDE7aVtsPU8mZF09azw8MjR8Uzw8MTZ8Zi1vfDB9fXJldHVybiAwIT09TyYmKGlbZitPXT15LXg8PDI0fDY0PDwxNnwwKSxzLmJpdHM9aywwfSxSZj0xLEZmPTIsemY9MCxVZj0tMixWZj0xLHFmPTg1MixXZj01OTI7ZnVuY3Rpb24gSGYoZSl7cmV0dXJuKGU+Pj4yNCYyNTUpKyhlPj4+OCY2NTI4MCkrKCg2NTI4MCZlKTw8OCkrKCgyNTUmZSk8PDI0KX1mdW5jdGlvbiBHZigpe3RoaXMubW9kZT0wLHRoaXMubGFzdD0hMSx0aGlzLndyYXA9MCx0aGlzLmhhdmVkaWN0PSExLHRoaXMuZmxhZ3M9MCx0aGlzLmRtYXg9MCx0aGlzLmNoZWNrPTAsdGhpcy50b3RhbD0wLHRoaXMuaGVhZD1udWxsLHRoaXMud2JpdHM9MCx0aGlzLndzaXplPTAsdGhpcy53aGF2ZT0wLHRoaXMud25leHQ9MCx0aGlzLndpbmRvdz1udWxsLHRoaXMuaG9sZD0wLHRoaXMuYml0cz0wLHRoaXMubGVuZ3RoPTAsdGhpcy5vZmZzZXQ9MCx0aGlzLmV4dHJhPTAsdGhpcy5sZW5jb2RlPW51bGwsdGhpcy5kaXN0Y29kZT1udWxsLHRoaXMubGVuYml0cz0wLHRoaXMuZGlzdGJpdHM9MCx0aGlzLm5jb2RlPTAsdGhpcy5ubGVuPTAsdGhpcy5uZGlzdD0wLHRoaXMuaGF2ZT0wLHRoaXMubmV4dD1udWxsLHRoaXMubGVucz1uZXcgSWwuQnVmMTYoMzIwKSx0aGlzLndvcms9bmV3IElsLkJ1ZjE2KDI4OCksdGhpcy5sZW5keW49bnVsbCx0aGlzLmRpc3RkeW49bnVsbCx0aGlzLnNhbmU9MCx0aGlzLmJhY2s9MCx0aGlzLndhcz0wfWZ1bmN0aW9uIFhmKGUpe3ZhciB0O3JldHVybiBlJiZlLnN0YXRlPyh0PWUuc3RhdGUsZS50b3RhbF9pbj1lLnRvdGFsX291dD10LnRvdGFsPTAsZS5tc2c9IiIsdC53cmFwJiYoZS5hZGxlcj0xJnQud3JhcCksdC5tb2RlPVZmLHQubGFzdD0wLHQuaGF2ZWRpY3Q9MCx0LmRtYXg9MzI3NjgsdC5oZWFkPW51bGwsdC5ob2xkPTAsdC5iaXRzPTAsdC5sZW5jb2RlPXQubGVuZHluPW5ldyBJbC5CdWYzMihxZiksdC5kaXN0Y29kZT10LmRpc3RkeW49bmV3IElsLkJ1ZjMyKFdmKSx0LnNhbmU9MSx0LmJhY2s9LTEsemYpOlVmfWZ1bmN0aW9uIFlmKGUpe3ZhciB0O3JldHVybiBlJiZlLnN0YXRlPygodD1lLnN0YXRlKS53c2l6ZT0wLHQud2hhdmU9MCx0LnduZXh0PTAsWGYoZSkpOlVmfWZ1bmN0aW9uIEpmKGUsdCl7dmFyIG4scjtyZXR1cm4gZSYmZS5zdGF0ZT8ocj1lLnN0YXRlLHQ8MD8obj0wLHQ9LXQpOihuPTErKHQ+PjQpLHQ8NDgmJih0Jj0xNSkpLHQmJih0PDh8fDE1PHQpP1VmOihudWxsIT09ci53aW5kb3cmJnIud2JpdHMhPT10JiYoci53aW5kb3c9bnVsbCksci53cmFwPW4sci53Yml0cz10LFlmKGUpKSk6VWZ9ZnVuY3Rpb24gS2YoZSx0KXt2YXIgbixyO3JldHVybiBlPyhyPW5ldyBHZiwoZS5zdGF0ZT1yKS53aW5kb3c9bnVsbCwobj1KZihlLHQpKSE9PXpmJiYoZS5zdGF0ZT1udWxsKSxuKTpVZn12YXIgWmYsUWYsZXA9ITA7ZnVuY3Rpb24gdHAoZSl7aWYoZXApe3ZhciB0O2ZvcihaZj1uZXcgSWwuQnVmMzIoNTEyKSxRZj1uZXcgSWwuQnVmMzIoMzIpLHQ9MDt0PDE0NDspZS5sZW5zW3QrK109ODtmb3IoO3Q8MjU2OyllLmxlbnNbdCsrXT05O2Zvcig7dDwyODA7KWUubGVuc1t0KytdPTc7Zm9yKDt0PDI4ODspZS5sZW5zW3QrK109ODtmb3IoRGYoUmYsZS5sZW5zLDAsMjg4LFpmLDAsZS53b3JrLHtiaXRzOjl9KSx0PTA7dDwzMjspZS5sZW5zW3QrK109NTtEZihGZixlLmxlbnMsMCwzMixRZiwwLGUud29yayx7Yml0czo1fSksZXA9ITF9ZS5sZW5jb2RlPVpmLGUubGVuYml0cz05LGUuZGlzdGNvZGU9UWYsZS5kaXN0Yml0cz01fWZ1bmN0aW9uIG5wKGUsdCxuLHIpe3ZhciBpLG89ZS5zdGF0ZTtyZXR1cm4gbnVsbD09PW8ud2luZG93JiYoby53c2l6ZT0xPDxvLndiaXRzLG8ud25leHQ9MCxvLndoYXZlPTAsby53aW5kb3c9bmV3IElsLkJ1Zjgoby53c2l6ZSkpLHI+PW8ud3NpemU/KElsLmFycmF5U2V0KG8ud2luZG93LHQsbi1vLndzaXplLG8ud3NpemUsMCksby53bmV4dD0wLG8ud2hhdmU9by53c2l6ZSk6KHI8KGk9by53c2l6ZS1vLnduZXh0KSYmKGk9ciksSWwuYXJyYXlTZXQoby53aW5kb3csdCxuLXIsaSxvLnduZXh0KSwoci09aSk/KElsLmFycmF5U2V0KG8ud2luZG93LHQsbi1yLHIsMCksby53bmV4dD1yLG8ud2hhdmU9by53c2l6ZSk6KG8ud25leHQrPWksby53bmV4dD09PW8ud3NpemUmJihvLnduZXh0PTApLG8ud2hhdmU8by53c2l6ZSYmKG8ud2hhdmUrPWkpKSksMH12YXIgcnA9e2luZmxhdGVSZXNldDpZZixpbmZsYXRlUmVzZXQyOkpmLGluZmxhdGVSZXNldEtlZXA6WGYsaW5mbGF0ZUluaXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIEtmKGUsMTUpfSxpbmZsYXRlSW5pdDI6S2YsaW5mbGF0ZTpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscyxjLHUsbCxkLGYscCxoLHYsZyxtLHksXyxiLHcsayxTLHgsQyxUPTAsTz1uZXcgSWwuQnVmOCg0KSxFPVsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1XTtpZighZXx8IWUuc3RhdGV8fCFlLm91dHB1dHx8IWUuaW5wdXQmJjAhPT1lLmF2YWlsX2luKXJldHVybiBVZjsxMj09PShuPWUuc3RhdGUpLm1vZGUmJihuLm1vZGU9MTMpLGE9ZS5uZXh0X291dCxpPWUub3V0cHV0LGM9ZS5hdmFpbF9vdXQsbz1lLm5leHRfaW4scj1lLmlucHV0LHM9ZS5hdmFpbF9pbix1PW4uaG9sZCxsPW4uYml0cyxkPXMsZj1jLFM9emY7ZTpmb3IoOzspc3dpdGNoKG4ubW9kZSl7Y2FzZSBWZjppZigwPT09bi53cmFwKXtuLm1vZGU9MTM7YnJlYWt9Zm9yKDtsPDE2Oyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYoMiZuLndyYXAmJjM1NjE1PT09dSl7T1tuLmNoZWNrPTBdPTI1NSZ1LE9bMV09dT4+PjgmMjU1LG4uY2hlY2s9QWQobi5jaGVjayxPLDIsMCksbD11PTAsbi5tb2RlPTI7YnJlYWt9aWYobi5mbGFncz0wLG4uaGVhZCYmKG4uaGVhZC5kb25lPSExKSwhKDEmbi53cmFwKXx8KCgoMjU1JnUpPDw4KSsodT4+OCkpJTMxKXtlLm1zZz0iaW5jb3JyZWN0IGhlYWRlciBjaGVjayIsbi5tb2RlPTMwO2JyZWFrfWlmKDghPSgxNSZ1KSl7ZS5tc2c9InVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIixuLm1vZGU9MzA7YnJlYWt9aWYobC09NCxrPTgrKDE1Jih1Pj4+PTQpKSwwPT09bi53Yml0cyluLndiaXRzPWs7ZWxzZSBpZihrPm4ud2JpdHMpe2UubXNnPSJpbnZhbGlkIHdpbmRvdyBzaXplIixuLm1vZGU9MzA7YnJlYWt9bi5kbWF4PTE8PGssZS5hZGxlcj1uLmNoZWNrPTEsbi5tb2RlPTUxMiZ1PzEwOjEyLGw9dT0wO2JyZWFrO2Nhc2UgMjpmb3IoO2w8MTY7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1pZihuLmZsYWdzPXUsOCE9KDI1NSZuLmZsYWdzKSl7ZS5tc2c9InVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIixuLm1vZGU9MzA7YnJlYWt9aWYoNTczNDQmbi5mbGFncyl7ZS5tc2c9InVua25vd24gaGVhZGVyIGZsYWdzIHNldCIsbi5tb2RlPTMwO2JyZWFrfW4uaGVhZCYmKG4uaGVhZC50ZXh0PXU+PjgmMSksNTEyJm4uZmxhZ3MmJihPWzBdPTI1NSZ1LE9bMV09dT4+PjgmMjU1LG4uY2hlY2s9QWQobi5jaGVjayxPLDIsMCkpLGw9dT0wLG4ubW9kZT0zO2Nhc2UgMzpmb3IoO2w8MzI7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1uLmhlYWQmJihuLmhlYWQudGltZT11KSw1MTImbi5mbGFncyYmKE9bMF09MjU1JnUsT1sxXT11Pj4+OCYyNTUsT1syXT11Pj4+MTYmMjU1LE9bM109dT4+PjI0JjI1NSxuLmNoZWNrPUFkKG4uY2hlY2ssTyw0LDApKSxsPXU9MCxuLm1vZGU9NDtjYXNlIDQ6Zm9yKDtsPDE2Oyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9bi5oZWFkJiYobi5oZWFkLnhmbGFncz0yNTUmdSxuLmhlYWQub3M9dT4+OCksNTEyJm4uZmxhZ3MmJihPWzBdPTI1NSZ1LE9bMV09dT4+PjgmMjU1LG4uY2hlY2s9QWQobi5jaGVjayxPLDIsMCkpLGw9dT0wLG4ubW9kZT01O2Nhc2UgNTppZigxMDI0Jm4uZmxhZ3Mpe2Zvcig7bDwxNjspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fW4ubGVuZ3RoPXUsbi5oZWFkJiYobi5oZWFkLmV4dHJhX2xlbj11KSw1MTImbi5mbGFncyYmKE9bMF09MjU1JnUsT1sxXT11Pj4+OCYyNTUsbi5jaGVjaz1BZChuLmNoZWNrLE8sMiwwKSksbD11PTB9ZWxzZSBuLmhlYWQmJihuLmhlYWQuZXh0cmE9bnVsbCk7bi5tb2RlPTY7Y2FzZSA2OmlmKDEwMjQmbi5mbGFncyYmKHM8KHA9bi5sZW5ndGgpJiYocD1zKSxwJiYobi5oZWFkJiYoaz1uLmhlYWQuZXh0cmFfbGVuLW4ubGVuZ3RoLG4uaGVhZC5leHRyYXx8KG4uaGVhZC5leHRyYT1uZXcgQXJyYXkobi5oZWFkLmV4dHJhX2xlbikpLElsLmFycmF5U2V0KG4uaGVhZC5leHRyYSxyLG8scCxrKSksNTEyJm4uZmxhZ3MmJihuLmNoZWNrPUFkKG4uY2hlY2sscixwLG8pKSxzLT1wLG8rPXAsbi5sZW5ndGgtPXApLG4ubGVuZ3RoKSlicmVhayBlO24ubGVuZ3RoPTAsbi5tb2RlPTc7Y2FzZSA3OmlmKDIwNDgmbi5mbGFncyl7aWYoMD09PXMpYnJlYWsgZTtmb3IocD0wO2s9cltvK3ArK10sbi5oZWFkJiZrJiZuLmxlbmd0aDw2NTUzNiYmKG4uaGVhZC5uYW1lKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGspKSxrJiZwPHM7KTtpZig1MTImbi5mbGFncyYmKG4uY2hlY2s9QWQobi5jaGVjayxyLHAsbykpLHMtPXAsbys9cCxrKWJyZWFrIGV9ZWxzZSBuLmhlYWQmJihuLmhlYWQubmFtZT1udWxsKTtuLmxlbmd0aD0wLG4ubW9kZT04O2Nhc2UgODppZig0MDk2Jm4uZmxhZ3Mpe2lmKDA9PT1zKWJyZWFrIGU7Zm9yKHA9MDtrPXJbbytwKytdLG4uaGVhZCYmayYmbi5sZW5ndGg8NjU1MzYmJihuLmhlYWQuY29tbWVudCs9U3RyaW5nLmZyb21DaGFyQ29kZShrKSksayYmcDxzOyk7aWYoNTEyJm4uZmxhZ3MmJihuLmNoZWNrPUFkKG4uY2hlY2sscixwLG8pKSxzLT1wLG8rPXAsaylicmVhayBlfWVsc2Ugbi5oZWFkJiYobi5oZWFkLmNvbW1lbnQ9bnVsbCk7bi5tb2RlPTk7Y2FzZSA5OmlmKDUxMiZuLmZsYWdzKXtmb3IoO2w8MTY7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1pZih1IT09KDY1NTM1Jm4uY2hlY2spKXtlLm1zZz0iaGVhZGVyIGNyYyBtaXNtYXRjaCIsbi5tb2RlPTMwO2JyZWFrfWw9dT0wfW4uaGVhZCYmKG4uaGVhZC5oY3JjPW4uZmxhZ3M+PjkmMSxuLmhlYWQuZG9uZT0hMCksZS5hZGxlcj1uLmNoZWNrPTAsbi5tb2RlPTEyO2JyZWFrO2Nhc2UgMTA6Zm9yKDtsPDMyOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9ZS5hZGxlcj1uLmNoZWNrPUhmKHUpLGw9dT0wLG4ubW9kZT0xMTtjYXNlIDExOmlmKDA9PT1uLmhhdmVkaWN0KXJldHVybiBlLm5leHRfb3V0PWEsZS5hdmFpbF9vdXQ9YyxlLm5leHRfaW49byxlLmF2YWlsX2luPXMsbi5ob2xkPXUsbi5iaXRzPWwsMjtlLmFkbGVyPW4uY2hlY2s9MSxuLm1vZGU9MTI7Y2FzZSAxMjppZig1PT09dHx8Nj09PXQpYnJlYWsgZTtjYXNlIDEzOmlmKG4ubGFzdCl7dT4+Pj03JmwsbC09NyZsLG4ubW9kZT0yNzticmVha31mb3IoO2w8Mzspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fXN3aXRjaChuLmxhc3Q9MSZ1LGwtPTEsMyYodT4+Pj0xKSl7Y2FzZSAwOm4ubW9kZT0xNDticmVhaztjYXNlIDE6aWYodHAobiksbi5tb2RlPTIwLDY9PT10KXt1Pj4+PTIsbC09MjticmVhayBlfWJyZWFrO2Nhc2UgMjpuLm1vZGU9MTc7YnJlYWs7Y2FzZSAzOmUubXNnPSJpbnZhbGlkIGJsb2NrIHR5cGUiLG4ubW9kZT0zMH11Pj4+PTIsbC09MjticmVhaztjYXNlIDE0OmZvcih1Pj4+PTcmbCxsLT03Jmw7bDwzMjspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fWlmKCg2NTUzNSZ1KSE9KHU+Pj4xNl42NTUzNSkpe2UubXNnPSJpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzIixuLm1vZGU9MzA7YnJlYWt9aWYobi5sZW5ndGg9NjU1MzUmdSxsPXU9MCxuLm1vZGU9MTUsNj09PXQpYnJlYWsgZTtjYXNlIDE1Om4ubW9kZT0xNjtjYXNlIDE2OmlmKHA9bi5sZW5ndGgpe2lmKHM8cCYmKHA9cyksYzxwJiYocD1jKSwwPT09cClicmVhayBlO0lsLmFycmF5U2V0KGkscixvLHAsYSkscy09cCxvKz1wLGMtPXAsYSs9cCxuLmxlbmd0aC09cDticmVha31uLm1vZGU9MTI7YnJlYWs7Y2FzZSAxNzpmb3IoO2w8MTQ7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1pZihuLm5sZW49MjU3KygzMSZ1KSx1Pj4+PTUsbC09NSxuLm5kaXN0PTErKDMxJnUpLHU+Pj49NSxsLT01LG4ubmNvZGU9NCsoMTUmdSksdT4+Pj00LGwtPTQsMjg2PG4ubmxlbnx8MzA8bi5uZGlzdCl7ZS5tc2c9InRvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzIixuLm1vZGU9MzA7YnJlYWt9bi5oYXZlPTAsbi5tb2RlPTE4O2Nhc2UgMTg6Zm9yKDtuLmhhdmU8bi5uY29kZTspe2Zvcig7bDwzOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9bi5sZW5zW0Vbbi5oYXZlKytdXT03JnUsdT4+Pj0zLGwtPTN9Zm9yKDtuLmhhdmU8MTk7KW4ubGVuc1tFW24uaGF2ZSsrXV09MDtpZihuLmxlbmNvZGU9bi5sZW5keW4sbi5sZW5iaXRzPTcseD17Yml0czpuLmxlbmJpdHN9LFM9RGYoMCxuLmxlbnMsMCwxOSxuLmxlbmNvZGUsMCxuLndvcmsseCksbi5sZW5iaXRzPXguYml0cyxTKXtlLm1zZz0iaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0IixuLm1vZGU9MzA7YnJlYWt9bi5oYXZlPTAsbi5tb2RlPTE5O2Nhc2UgMTk6Zm9yKDtuLmhhdmU8bi5ubGVuK24ubmRpc3Q7KXtmb3IoO209KFQ9bi5sZW5jb2RlW3UmKDE8PG4ubGVuYml0cyktMV0pPj4+MTYmMjU1LHk9NjU1MzUmVCwhKChnPVQ+Pj4yNCk8PWwpOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYoeTwxNil1Pj4+PWcsbC09ZyxuLmxlbnNbbi5oYXZlKytdPXk7ZWxzZXtpZigxNj09PXkpe2ZvcihDPWcrMjtsPEM7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1pZih1Pj4+PWcsbC09ZywwPT09bi5oYXZlKXtlLm1zZz0iaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCIsbi5tb2RlPTMwO2JyZWFrfWs9bi5sZW5zW24uaGF2ZS0xXSxwPTMrKDMmdSksdT4+Pj0yLGwtPTJ9ZWxzZSBpZigxNz09PXkpe2ZvcihDPWcrMztsPEM7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1sLT1nLGs9MCxwPTMrKDcmKHU+Pj49ZykpLHU+Pj49MyxsLT0zfWVsc2V7Zm9yKEM9Zys3O2w8Qzspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fWwtPWcsaz0wLHA9MTErKDEyNyYodT4+Pj1nKSksdT4+Pj03LGwtPTd9aWYobi5oYXZlK3A+bi5ubGVuK24ubmRpc3Qpe2UubXNnPSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IixuLm1vZGU9MzA7YnJlYWt9Zm9yKDtwLS07KW4ubGVuc1tuLmhhdmUrK109a319aWYoMzA9PT1uLm1vZGUpYnJlYWs7aWYoMD09PW4ubGVuc1syNTZdKXtlLm1zZz0iaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrIixuLm1vZGU9MzA7YnJlYWt9aWYobi5sZW5iaXRzPTkseD17Yml0czpuLmxlbmJpdHN9LFM9RGYoUmYsbi5sZW5zLDAsbi5ubGVuLG4ubGVuY29kZSwwLG4ud29yayx4KSxuLmxlbmJpdHM9eC5iaXRzLFMpe2UubXNnPSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RocyBzZXQiLG4ubW9kZT0zMDticmVha31pZihuLmRpc3RiaXRzPTYsbi5kaXN0Y29kZT1uLmRpc3RkeW4seD17Yml0czpuLmRpc3RiaXRzfSxTPURmKEZmLG4ubGVucyxuLm5sZW4sbi5uZGlzdCxuLmRpc3Rjb2RlLDAsbi53b3JrLHgpLG4uZGlzdGJpdHM9eC5iaXRzLFMpe2UubXNnPSJpbnZhbGlkIGRpc3RhbmNlcyBzZXQiLG4ubW9kZT0zMDticmVha31pZihuLm1vZGU9MjAsNj09PXQpYnJlYWsgZTtjYXNlIDIwOm4ubW9kZT0yMTtjYXNlIDIxOmlmKDY8PXMmJjI1ODw9Yyl7ZS5uZXh0X291dD1hLGUuYXZhaWxfb3V0PWMsZS5uZXh0X2luPW8sZS5hdmFpbF9pbj1zLG4uaG9sZD11LG4uYml0cz1sLE1mKGUsZiksYT1lLm5leHRfb3V0LGk9ZS5vdXRwdXQsYz1lLmF2YWlsX291dCxvPWUubmV4dF9pbixyPWUuaW5wdXQscz1lLmF2YWlsX2luLHU9bi5ob2xkLGw9bi5iaXRzLDEyPT09bi5tb2RlJiYobi5iYWNrPS0xKTticmVha31mb3Iobi5iYWNrPTA7bT0oVD1uLmxlbmNvZGVbdSYoMTw8bi5sZW5iaXRzKS0xXSk+Pj4xNiYyNTUseT02NTUzNSZULCEoKGc9VD4+PjI0KTw9bCk7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1pZihtJiYwPT0oMjQwJm0pKXtmb3IoXz1nLGI9bSx3PXk7bT0oVD1uLmxlbmNvZGVbdysoKHUmKDE8PF8rYiktMSk+Pl8pXSk+Pj4xNiYyNTUseT02NTUzNSZULCEoXysoZz1UPj4+MjQpPD1sKTspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fXU+Pj49XyxsLT1fLG4uYmFjays9X31pZih1Pj4+PWcsbC09ZyxuLmJhY2srPWcsbi5sZW5ndGg9eSwwPT09bSl7bi5tb2RlPTI2O2JyZWFrfWlmKDMyJm0pe24uYmFjaz0tMSxuLm1vZGU9MTI7YnJlYWt9aWYoNjQmbSl7ZS5tc2c9ImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSIsbi5tb2RlPTMwO2JyZWFrfW4uZXh0cmE9MTUmbSxuLm1vZGU9MjI7Y2FzZSAyMjppZihuLmV4dHJhKXtmb3IoQz1uLmV4dHJhO2w8Qzspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fW4ubGVuZ3RoKz11JigxPDxuLmV4dHJhKS0xLHU+Pj49bi5leHRyYSxsLT1uLmV4dHJhLG4uYmFjays9bi5leHRyYX1uLndhcz1uLmxlbmd0aCxuLm1vZGU9MjM7Y2FzZSAyMzpmb3IoO209KFQ9bi5kaXN0Y29kZVt1JigxPDxuLmRpc3RiaXRzKS0xXSk+Pj4xNiYyNTUseT02NTUzNSZULCEoKGc9VD4+PjI0KTw9bCk7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH1pZigwPT0oMjQwJm0pKXtmb3IoXz1nLGI9bSx3PXk7bT0oVD1uLmRpc3Rjb2RlW3crKCh1JigxPDxfK2IpLTEpPj5fKV0pPj4+MTYmMjU1LHk9NjU1MzUmVCwhKF8rKGc9VD4+PjI0KTw9bCk7KXtpZigwPT09cylicmVhayBlO3MtLSx1Kz1yW28rK108PGwsbCs9OH11Pj4+PV8sbC09XyxuLmJhY2srPV99aWYodT4+Pj1nLGwtPWcsbi5iYWNrKz1nLDY0Jm0pe2UubXNnPSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiLG4ubW9kZT0zMDticmVha31uLm9mZnNldD15LG4uZXh0cmE9MTUmbSxuLm1vZGU9MjQ7Y2FzZSAyNDppZihuLmV4dHJhKXtmb3IoQz1uLmV4dHJhO2w8Qzspe2lmKDA9PT1zKWJyZWFrIGU7cy0tLHUrPXJbbysrXTw8bCxsKz04fW4ub2Zmc2V0Kz11JigxPDxuLmV4dHJhKS0xLHU+Pj49bi5leHRyYSxsLT1uLmV4dHJhLG4uYmFjays9bi5leHRyYX1pZihuLm9mZnNldD5uLmRtYXgpe2UubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsbi5tb2RlPTMwO2JyZWFrfW4ubW9kZT0yNTtjYXNlIDI1OmlmKDA9PT1jKWJyZWFrIGU7aWYocD1mLWMsbi5vZmZzZXQ+cCl7aWYoKHA9bi5vZmZzZXQtcCk+bi53aGF2ZSYmbi5zYW5lKXtlLm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLG4ubW9kZT0zMDticmVha31wPm4ud25leHQ/KHAtPW4ud25leHQsaD1uLndzaXplLXApOmg9bi53bmV4dC1wLHA+bi5sZW5ndGgmJihwPW4ubGVuZ3RoKSx2PW4ud2luZG93fWVsc2Ugdj1pLGg9YS1uLm9mZnNldCxwPW4ubGVuZ3RoO2ZvcihjPHAmJihwPWMpLGMtPXAsbi5sZW5ndGgtPXA7aVthKytdPXZbaCsrXSwtLXA7KTswPT09bi5sZW5ndGgmJihuLm1vZGU9MjEpO2JyZWFrO2Nhc2UgMjY6aWYoMD09PWMpYnJlYWsgZTtpW2ErK109bi5sZW5ndGgsYy0tLG4ubW9kZT0yMTticmVhaztjYXNlIDI3OmlmKG4ud3JhcCl7Zm9yKDtsPDMyOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdXw9cltvKytdPDxsLGwrPTh9aWYoZi09YyxlLnRvdGFsX291dCs9ZixuLnRvdGFsKz1mLGYmJihlLmFkbGVyPW4uY2hlY2s9bi5mbGFncz9BZChuLmNoZWNrLGksZixhLWYpOlRkKG4uY2hlY2ssaSxmLGEtZikpLGY9Yywobi5mbGFncz91OkhmKHUpKSE9PW4uY2hlY2spe2UubXNnPSJpbmNvcnJlY3QgZGF0YSBjaGVjayIsbi5tb2RlPTMwO2JyZWFrfWw9dT0wfW4ubW9kZT0yODtjYXNlIDI4OmlmKG4ud3JhcCYmbi5mbGFncyl7Zm9yKDtsPDMyOyl7aWYoMD09PXMpYnJlYWsgZTtzLS0sdSs9cltvKytdPDxsLGwrPTh9aWYodSE9PSg0Mjk0OTY3Mjk1Jm4udG90YWwpKXtlLm1zZz0iaW5jb3JyZWN0IGxlbmd0aCBjaGVjayIsbi5tb2RlPTMwO2JyZWFrfWw9dT0wfW4ubW9kZT0yOTtjYXNlIDI5OlM9MTticmVhayBlO2Nhc2UgMzA6Uz0tMzticmVhayBlO2Nhc2UgMzE6cmV0dXJuLTQ7Y2FzZSAzMjpkZWZhdWx0OnJldHVybiBVZn1yZXR1cm4gZS5uZXh0X291dD1hLGUuYXZhaWxfb3V0PWMsZS5uZXh0X2luPW8sZS5hdmFpbF9pbj1zLG4uaG9sZD11LG4uYml0cz1sLChuLndzaXplfHxmIT09ZS5hdmFpbF9vdXQmJm4ubW9kZTwzMCYmKG4ubW9kZTwyN3x8NCE9PXQpKSYmbnAoZSxlLm91dHB1dCxlLm5leHRfb3V0LGYtZS5hdmFpbF9vdXQpLGQtPWUuYXZhaWxfaW4sZi09ZS5hdmFpbF9vdXQsZS50b3RhbF9pbis9ZCxlLnRvdGFsX291dCs9ZixuLnRvdGFsKz1mLG4ud3JhcCYmZiYmKGUuYWRsZXI9bi5jaGVjaz1uLmZsYWdzP0FkKG4uY2hlY2ssaSxmLGUubmV4dF9vdXQtZik6VGQobi5jaGVjayxpLGYsZS5uZXh0X291dC1mKSksZS5kYXRhX3R5cGU9bi5iaXRzKyhuLmxhc3Q/NjQ6MCkrKDEyPT09bi5tb2RlPzEyODowKSsoMjA9PT1uLm1vZGV8fDE1PT09bi5tb2RlPzI1NjowKSwoMD09PWQmJjA9PT1mfHw0PT09dCkmJlM9PT16ZiYmKFM9LTUpLFN9LGluZmxhdGVFbmQ6ZnVuY3Rpb24oZSl7aWYoIWV8fCFlLnN0YXRlKXJldHVybiBVZjt2YXIgdD1lLnN0YXRlO3JldHVybiB0LndpbmRvdyYmKHQud2luZG93PW51bGwpLGUuc3RhdGU9bnVsbCx6Zn0saW5mbGF0ZUdldEhlYWRlcjpmdW5jdGlvbihlLHQpe3ZhciBuO3JldHVybiBlJiZlLnN0YXRlPzA9PSgyJihuPWUuc3RhdGUpLndyYXApP1VmOigobi5oZWFkPXQpLmRvbmU9ITEsemYpOlVmfSxpbmZsYXRlU2V0RGljdGlvbmFyeTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9dC5sZW5ndGg7cmV0dXJuIGUmJmUuc3RhdGU/MCE9PShuPWUuc3RhdGUpLndyYXAmJjExIT09bi5tb2RlP1VmOjExPT09bi5tb2RlJiZUZCgxLHQsciwwKSE9PW4uY2hlY2s/LTM6bnAoZSx0LHIscik/KG4ubW9kZT0zMSwtNCk6KG4uaGF2ZWRpY3Q9MSx6Zik6VWZ9LGluZmxhdGVJbmZvOiJwYWtvIGluZmxhdGUgKGZyb20gTm9kZWNhIHByb2plY3QpIn0saXA9e1pfTk9fRkxVU0g6MCxaX1BBUlRJQUxfRkxVU0g6MSxaX1NZTkNfRkxVU0g6MixaX0ZVTExfRkxVU0g6MyxaX0ZJTklTSDo0LFpfQkxPQ0s6NSxaX1RSRUVTOjYsWl9PSzowLFpfU1RSRUFNX0VORDoxLFpfTkVFRF9ESUNUOjIsWl9FUlJOTzotMSxaX1NUUkVBTV9FUlJPUjotMixaX0RBVEFfRVJST1I6LTMsWl9CVUZfRVJST1I6LTUsWl9OT19DT01QUkVTU0lPTjowLFpfQkVTVF9TUEVFRDoxLFpfQkVTVF9DT01QUkVTU0lPTjo5LFpfREVGQVVMVF9DT01QUkVTU0lPTjotMSxaX0ZJTFRFUkVEOjEsWl9IVUZGTUFOX09OTFk6MixaX1JMRTozLFpfRklYRUQ6NCxaX0RFRkFVTFRfU1RSQVRFR1k6MCxaX0JJTkFSWTowLFpfVEVYVDoxLFpfVU5LTk9XTjoyLFpfREVGTEFURUQ6OH07dmFyIG9wPWZ1bmN0aW9uKCl7dGhpcy50ZXh0PTAsdGhpcy50aW1lPTAsdGhpcy54ZmxhZ3M9MCx0aGlzLm9zPTAsdGhpcy5leHRyYT1udWxsLHRoaXMuZXh0cmFfbGVuPTAsdGhpcy5uYW1lPSIiLHRoaXMuY29tbWVudD0iIix0aGlzLmhjcmM9MCx0aGlzLmRvbmU9ITF9LGFwPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gc3AoZSl7aWYoISh0aGlzIGluc3RhbmNlb2Ygc3ApKXJldHVybiBuZXcgc3AoZSk7dGhpcy5vcHRpb25zPUlsLmFzc2lnbih7Y2h1bmtTaXplOjE2Mzg0LHdpbmRvd0JpdHM6MCx0bzoiIn0sZXx8e30pO3ZhciB0PXRoaXMub3B0aW9uczt0LnJhdyYmMDw9dC53aW5kb3dCaXRzJiZ0LndpbmRvd0JpdHM8MTYmJih0LndpbmRvd0JpdHM9LXQud2luZG93Qml0cywwPT09dC53aW5kb3dCaXRzJiYodC53aW5kb3dCaXRzPS0xNSkpLCEoMDw9dC53aW5kb3dCaXRzJiZ0LndpbmRvd0JpdHM8MTYpfHxlJiZlLndpbmRvd0JpdHN8fCh0LndpbmRvd0JpdHMrPTMyKSwxNTx0LndpbmRvd0JpdHMmJnQud2luZG93Qml0czw0OCYmMD09KDE1JnQud2luZG93Qml0cykmJih0LndpbmRvd0JpdHN8PTE1KSx0aGlzLmVycj0wLHRoaXMubXNnPSIiLHRoaXMuZW5kZWQ9ITEsdGhpcy5jaHVua3M9W10sdGhpcy5zdHJtPW5ldyB4Zix0aGlzLnN0cm0uYXZhaWxfb3V0PTA7dmFyIG49cnAuaW5mbGF0ZUluaXQyKHRoaXMuc3RybSx0LndpbmRvd0JpdHMpO2lmKG4hPT1pcC5aX09LKXRocm93IG5ldyBFcnJvcihJZFtuXSk7aWYodGhpcy5oZWFkZXI9bmV3IG9wLHJwLmluZmxhdGVHZXRIZWFkZXIodGhpcy5zdHJtLHRoaXMuaGVhZGVyKSx0LmRpY3Rpb25hcnkmJigic3RyaW5nIj09dHlwZW9mIHQuZGljdGlvbmFyeT90LmRpY3Rpb25hcnk9U2Yuc3RyaW5nMmJ1Zih0LmRpY3Rpb25hcnkpOiJbb2JqZWN0IEFycmF5QnVmZmVyXSI9PT1hcC5jYWxsKHQuZGljdGlvbmFyeSkmJih0LmRpY3Rpb25hcnk9bmV3IFVpbnQ4QXJyYXkodC5kaWN0aW9uYXJ5KSksdC5yYXcmJihuPXJwLmluZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSx0LmRpY3Rpb25hcnkpKSE9PWlwLlpfT0spKXRocm93IG5ldyBFcnJvcihJZFtuXSl9ZnVuY3Rpb24gY3AoZSx0KXt2YXIgbj1uZXcgc3AodCk7aWYobi5wdXNoKGUsITApLG4uZXJyKXRocm93IG4ubXNnfHxJZFtuLmVycl07cmV0dXJuIG4ucmVzdWx0fXNwLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYSxzPXRoaXMuc3RybSxjPXRoaXMub3B0aW9ucy5jaHVua1NpemUsdT10aGlzLm9wdGlvbnMuZGljdGlvbmFyeSxsPSExO2lmKHRoaXMuZW5kZWQpcmV0dXJuITE7cj10PT09fn50P3Q6ITA9PT10P2lwLlpfRklOSVNIOmlwLlpfTk9fRkxVU0gsInN0cmluZyI9PXR5cGVvZiBlP3MuaW5wdXQ9U2YuYmluc3RyaW5nMmJ1ZihlKToiW29iamVjdCBBcnJheUJ1ZmZlcl0iPT09YXAuY2FsbChlKT9zLmlucHV0PW5ldyBVaW50OEFycmF5KGUpOnMuaW5wdXQ9ZSxzLm5leHRfaW49MCxzLmF2YWlsX2luPXMuaW5wdXQubGVuZ3RoO2Rve2lmKDA9PT1zLmF2YWlsX291dCYmKHMub3V0cHV0PW5ldyBJbC5CdWY4KGMpLHMubmV4dF9vdXQ9MCxzLmF2YWlsX291dD1jKSwobj1ycC5pbmZsYXRlKHMsaXAuWl9OT19GTFVTSCkpPT09aXAuWl9ORUVEX0RJQ1QmJnUmJihuPXJwLmluZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSx1KSksbj09PWlwLlpfQlVGX0VSUk9SJiYhMD09PWwmJihuPWlwLlpfT0ssbD0hMSksbiE9PWlwLlpfU1RSRUFNX0VORCYmbiE9PWlwLlpfT0spcmV0dXJuIHRoaXMub25FbmQobiksISh0aGlzLmVuZGVkPSEwKTtzLm5leHRfb3V0JiYoMCE9PXMuYXZhaWxfb3V0JiZuIT09aXAuWl9TVFJFQU1fRU5EJiYoMCE9PXMuYXZhaWxfaW58fHIhPT1pcC5aX0ZJTklTSCYmciE9PWlwLlpfU1lOQ19GTFVTSCl8fCgic3RyaW5nIj09PXRoaXMub3B0aW9ucy50bz8oaT1TZi51dGY4Ym9yZGVyKHMub3V0cHV0LHMubmV4dF9vdXQpLG89cy5uZXh0X291dC1pLGE9U2YuYnVmMnN0cmluZyhzLm91dHB1dCxpKSxzLm5leHRfb3V0PW8scy5hdmFpbF9vdXQ9Yy1vLG8mJklsLmFycmF5U2V0KHMub3V0cHV0LHMub3V0cHV0LGksbywwKSx0aGlzLm9uRGF0YShhKSk6dGhpcy5vbkRhdGEoSWwuc2hyaW5rQnVmKHMub3V0cHV0LHMubmV4dF9vdXQpKSkpLDA9PT1zLmF2YWlsX2luJiYwPT09cy5hdmFpbF9vdXQmJihsPSEwKX13aGlsZSgoMDxzLmF2YWlsX2lufHwwPT09cy5hdmFpbF9vdXQpJiZuIT09aXAuWl9TVFJFQU1fRU5EKTtyZXR1cm4gbj09PWlwLlpfU1RSRUFNX0VORCYmKHI9aXAuWl9GSU5JU0gpLHI9PT1pcC5aX0ZJTklTSD8obj1ycC5pbmZsYXRlRW5kKHRoaXMuc3RybSksdGhpcy5vbkVuZChuKSx0aGlzLmVuZGVkPSEwLG49PT1pcC5aX09LKTpyIT09aXAuWl9TWU5DX0ZMVVNIfHwodGhpcy5vbkVuZChpcC5aX09LKSwhKHMuYXZhaWxfb3V0PTApKX0sc3AucHJvdG90eXBlLm9uRGF0YT1mdW5jdGlvbihlKXt0aGlzLmNodW5rcy5wdXNoKGUpfSxzcC5wcm90b3R5cGUub25FbmQ9ZnVuY3Rpb24oZSl7ZT09PWlwLlpfT0smJigic3RyaW5nIj09PXRoaXMub3B0aW9ucy50bz90aGlzLnJlc3VsdD10aGlzLmNodW5rcy5qb2luKCIiKTp0aGlzLnJlc3VsdD1JbC5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKSksdGhpcy5jaHVua3M9W10sdGhpcy5lcnI9ZSx0aGlzLm1zZz10aGlzLnN0cm0ubXNnfTt2YXIgdXA9e0luZmxhdGU6c3AsaW5mbGF0ZTpjcCxpbmZsYXRlUmF3OmZ1bmN0aW9uKGUsdCl7cmV0dXJuKHQ9dHx8e30pLnJhdz0hMCxjcChlLHQpfSx1bmd6aXA6Y3B9LGxwPXt9OygwLElsLmFzc2lnbikobHAsUGYsdXAsaXApO3ZhciBkcD1scCxmcD1YdSgiY2FudmFzRXZlbnQiKTtmdW5jdGlvbiBwcChlLHQsbixyKXtpZy5wdWJsaXNoSGFuZGxlcih0KyItY2FudmFzLSIrZSx7Y2FudmFzSWQ6ZSx0eXBlOm4sZGF0YTpyfSx0KX1pZy5zdWJzY3JpYmUoIm9uQ2FudmFzTWV0aG9kQ2FsbGJhY2siLGZ1bmN0aW9uKGUpe3ZhciB0PWUuY2FsbGJhY2tJZCxuPWUuZGF0YSxyPWZwLnBvcCh0KTtyJiZyKG4pfSk7dmFyIGhwPXthbGljZWJsdWU6IiNmMGY4ZmYiLGFudGlxdWV3aGl0ZToiI2ZhZWJkNyIsYXF1YToiIzAwZmZmZiIsYXF1YW1hcmluZToiIzdmZmZkNCIsYXp1cmU6IiNmMGZmZmYiLGJlaWdlOiIjZjVmNWRjIixiaXNxdWU6IiNmZmU0YzQiLGJsYWNrOiIjMDAwMDAwIixibGFuY2hlZGFsbW9uZDoiI2ZmZWJjZCIsYmx1ZToiIzAwMDBmZiIsYmx1ZXZpb2xldDoiIzhhMmJlMiIsYnJvd246IiNhNTJhMmEiLGJ1cmx5d29vZDoiI2RlYjg4NyIsY2FkZXRibHVlOiIjNWY5ZWEwIixjaGFydHJldXNlOiIjN2ZmZjAwIixjaG9jb2xhdGU6IiNkMjY5MWUiLGNvcmFsOiIjZmY3ZjUwIixjb3JuZmxvd2VyYmx1ZToiIzY0OTVlZCIsY29ybnNpbGs6IiNmZmY4ZGMiLGNyaW1zb246IiNkYzE0M2MiLGN5YW46IiMwMGZmZmYiLGRhcmtibHVlOiIjMDAwMDhiIixkYXJrY3lhbjoiIzAwOGI4YiIsZGFya2dvbGRlbnJvZDoiI2I4ODYwYiIsZGFya2dyYXk6IiNhOWE5YTkiLGRhcmtncmV5OiIjYTlhOWE5IixkYXJrZ3JlZW46IiMwMDY0MDAiLGRhcmtraGFraToiI2JkYjc2YiIsZGFya21hZ2VudGE6IiM4YjAwOGIiLGRhcmtvbGl2ZWdyZWVuOiIjNTU2YjJmIixkYXJrb3JhbmdlOiIjZmY4YzAwIixkYXJrb3JjaGlkOiIjOTkzMmNjIixkYXJrcmVkOiIjOGIwMDAwIixkYXJrc2FsbW9uOiIjZTk5NjdhIixkYXJrc2VhZ3JlZW46IiM4ZmJjOGYiLGRhcmtzbGF0ZWJsdWU6IiM0ODNkOGIiLGRhcmtzbGF0ZWdyYXk6IiMyZjRmNGYiLGRhcmtzbGF0ZWdyZXk6IiMyZjRmNGYiLGRhcmt0dXJxdW9pc2U6IiMwMGNlZDEiLGRhcmt2aW9sZXQ6IiM5NDAwZDMiLGRlZXBwaW5rOiIjZmYxNDkzIixkZWVwc2t5Ymx1ZToiIzAwYmZmZiIsZGltZ3JheToiIzY5Njk2OSIsZGltZ3JleToiIzY5Njk2OSIsZG9kZ2VyYmx1ZToiIzFlOTBmZiIsZmlyZWJyaWNrOiIjYjIyMjIyIixmbG9yYWx3aGl0ZToiI2ZmZmFmMCIsZm9yZXN0Z3JlZW46IiMyMjhiMjIiLGZ1Y2hzaWE6IiNmZjAwZmYiLGdhaW5zYm9ybzoiI2RjZGNkYyIsZ2hvc3R3aGl0ZToiI2Y4ZjhmZiIsZ29sZDoiI2ZmZDcwMCIsZ29sZGVucm9kOiIjZGFhNTIwIixncmF5OiIjODA4MDgwIixncmV5OiIjODA4MDgwIixncmVlbjoiIzAwODAwMCIsZ3JlZW55ZWxsb3c6IiNhZGZmMmYiLGhvbmV5ZGV3OiIjZjBmZmYwIixob3RwaW5rOiIjZmY2OWI0IixpbmRpYW5yZWQ6IiNjZDVjNWMiLGluZGlnbzoiIzRiMDA4MiIsaXZvcnk6IiNmZmZmZjAiLGtoYWtpOiIjZjBlNjhjIixsYXZlbmRlcjoiI2U2ZTZmYSIsbGF2ZW5kZXJibHVzaDoiI2ZmZjBmNSIsbGF3bmdyZWVuOiIjN2NmYzAwIixsZW1vbmNoaWZmb246IiNmZmZhY2QiLGxpZ2h0Ymx1ZToiI2FkZDhlNiIsbGlnaHRjb3JhbDoiI2YwODA4MCIsbGlnaHRjeWFuOiIjZTBmZmZmIixsaWdodGdvbGRlbnJvZHllbGxvdzoiI2ZhZmFkMiIsbGlnaHRncmF5OiIjZDNkM2QzIixsaWdodGdyZXk6IiNkM2QzZDMiLGxpZ2h0Z3JlZW46IiM5MGVlOTAiLGxpZ2h0cGluazoiI2ZmYjZjMSIsbGlnaHRzYWxtb246IiNmZmEwN2EiLGxpZ2h0c2VhZ3JlZW46IiMyMGIyYWEiLGxpZ2h0c2t5Ymx1ZToiIzg3Y2VmYSIsbGlnaHRzbGF0ZWdyYXk6IiM3Nzg4OTkiLGxpZ2h0c2xhdGVncmV5OiIjNzc4ODk5IixsaWdodHN0ZWVsYmx1ZToiI2IwYzRkZSIsbGlnaHR5ZWxsb3c6IiNmZmZmZTAiLGxpbWU6IiMwMGZmMDAiLGxpbWVncmVlbjoiIzMyY2QzMiIsbGluZW46IiNmYWYwZTYiLG1hZ2VudGE6IiNmZjAwZmYiLG1hcm9vbjoiIzgwMDAwMCIsbWVkaXVtYXF1YW1hcmluZToiIzY2Y2RhYSIsbWVkaXVtYmx1ZToiIzAwMDBjZCIsbWVkaXVtb3JjaGlkOiIjYmE1NWQzIixtZWRpdW1wdXJwbGU6IiM5MzcwZGIiLG1lZGl1bXNlYWdyZWVuOiIjM2NiMzcxIixtZWRpdW1zbGF0ZWJsdWU6IiM3YjY4ZWUiLG1lZGl1bXNwcmluZ2dyZWVuOiIjMDBmYTlhIixtZWRpdW10dXJxdW9pc2U6IiM0OGQxY2MiLG1lZGl1bXZpb2xldHJlZDoiI2M3MTU4NSIsbWlkbmlnaHRibHVlOiIjMTkxOTcwIixtaW50Y3JlYW06IiNmNWZmZmEiLG1pc3R5cm9zZToiI2ZmZTRlMSIsbW9jY2FzaW46IiNmZmU0YjUiLG5hdmFqb3doaXRlOiIjZmZkZWFkIixuYXZ5OiIjMDAwMDgwIixvbGRsYWNlOiIjZmRmNWU2IixvbGl2ZToiIzgwODAwMCIsb2xpdmVkcmFiOiIjNmI4ZTIzIixvcmFuZ2U6IiNmZmE1MDAiLG9yYW5nZXJlZDoiI2ZmNDUwMCIsb3JjaGlkOiIjZGE3MGQ2IixwYWxlZ29sZGVucm9kOiIjZWVlOGFhIixwYWxlZ3JlZW46IiM5OGZiOTgiLHBhbGV0dXJxdW9pc2U6IiNhZmVlZWUiLHBhbGV2aW9sZXRyZWQ6IiNkYjcwOTMiLHBhcGF5YXdoaXA6IiNmZmVmZDUiLHBlYWNocHVmZjoiI2ZmZGFiOSIscGVydToiI2NkODUzZiIscGluazoiI2ZmYzBjYiIscGx1bToiI2RkYTBkZCIscG93ZGVyYmx1ZToiI2IwZTBlNiIscHVycGxlOiIjODAwMDgwIixyZWJlY2NhcHVycGxlOiIjNjYzMzk5IixyZWQ6IiNmZjAwMDAiLHJvc3licm93bjoiI2JjOGY4ZiIscm95YWxibHVlOiIjNDE2OWUxIixzYWRkbGVicm93bjoiIzhiNDUxMyIsc2FsbW9uOiIjZmE4MDcyIixzYW5keWJyb3duOiIjZjRhNDYwIixzZWFncmVlbjoiIzJlOGI1NyIsc2Vhc2hlbGw6IiNmZmY1ZWUiLHNpZW5uYToiI2EwNTIyZCIsc2lsdmVyOiIjYzBjMGMwIixza3libHVlOiIjODdjZWViIixzbGF0ZWJsdWU6IiM2YTVhY2QiLHNsYXRlZ3JheToiIzcwODA5MCIsc2xhdGVncmV5OiIjNzA4MDkwIixzbm93OiIjZmZmYWZhIixzcHJpbmdncmVlbjoiIzAwZmY3ZiIsc3RlZWxibHVlOiIjNDY4MmI0Iix0YW46IiNkMmI0OGMiLHRlYWw6IiMwMDgwODAiLHRoaXN0bGU6IiNkOGJmZDgiLHRvbWF0bzoiI2ZmNjM0NyIsdHVycXVvaXNlOiIjNDBlMGQwIix2aW9sZXQ6IiNlZTgyZWUiLHdoZWF0OiIjZjVkZWIzIix3aGl0ZToiI2ZmZmZmZiIsd2hpdGVzbW9rZToiI2Y1ZjVmNSIseWVsbG93OiIjZmZmZjAwIix5ZWxsb3dncmVlbjoiIzlhY2QzMiIsdHJhbnNwYXJlbnQ6IiMwMDAwMDAwMCJ9O2Z1bmN0aW9uIHZwKGUpe3ZhciB0PW51bGw7aWYobnVsbCE9KHQ9L14jKFswLTl8QS1GfGEtZl17Nn0pJC8uZXhlYyhlPWV8fCIjMDAwMDAwIikpKXJldHVybltwYXJzZUludCh0WzFdLnNsaWNlKDAsMiksMTYpLHBhcnNlSW50KHRbMV0uc2xpY2UoMiw0KSwxNikscGFyc2VJbnQodFsxXS5zbGljZSg0KSwxNiksMjU1XTtpZihudWxsIT0odD0vXiMoWzAtOXxBLUZ8YS1mXXszfSkkLy5leGVjKGUpKSl7dmFyIG49dFsxXS5zbGljZSgwLDEpLHI9dFsxXS5zbGljZSgxLDIpLGk9dFsxXS5zbGljZSgyLDMpO3JldHVybltuPXBhcnNlSW50KG4rbiwxNikscj1wYXJzZUludChyK3IsMTYpLGk9cGFyc2VJbnQoaStpLDE2KSwyNTVdfWlmKG51bGwhPSh0PS9ecmdiXCgoLispXCkkLy5leGVjKGUpKSlyZXR1cm4gdFsxXS5zcGxpdCgiLCIpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5taW4oMjU1LHBhcnNlSW50KGUudHJpbSgpKSl9KS5jb25jYXQoMjU1KTtpZihudWxsIT0odD0vXnJnYmFcKCguKylcKSQvLmV4ZWMoZSkpKXJldHVybiB0WzFdLnNwbGl0KCIsIikubWFwKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIDM9PT10P01hdGguZmxvb3IoMjU1KnBhcnNlRmxvYXQoZS50cmltKCkpKTpNYXRoLm1pbigyNTUscGFyc2VJbnQoZS50cmltKCkpKX0pO3ZhciBvPWUudG9Mb3dlckNhc2UoKTtpZihrKGhwLG8pKXt0PS9eIyhbMC05fEEtRnxhLWZdezYsOH0pJC8uZXhlYyhocFtvXSk7dmFyIGE9cGFyc2VJbnQodFsxXS5zbGljZSgwLDIpLDE2KSxzPXBhcnNlSW50KHRbMV0uc2xpY2UoMiw0KSwxNiksYz1wYXJzZUludCh0WzFdLnNsaWNlKDQsNiksMTYpLHU9cGFyc2VJbnQodFsxXS5zbGljZSg2LDgpLDE2KTtyZXR1cm5bYSxzLGMsdT0wPD11P3U6MjU1XX1yZXR1cm4gY29uc29sZS5lcnJvcigidW5zdXBwb3J0ZWQgY29sb3I6IitlKSxbMCwwLDAsMjU1XX1mdW5jdGlvbiBncChlLHQpe3RoaXMudHlwZT0icGF0dGVybiIsdGhpcy5kYXRhPWUsdGhpcy5jb2xvclN0b3A9dH12YXIgbXA9ZnVuY3Rpb24oZSx0KXt0aGlzLnR5cGU9ZSx0aGlzLmRhdGE9dCx0aGlzLmNvbG9yU3RvcD1bXX07bXAucHJvdG90eXBlLmFkZENvbG9yU3RvcD1mdW5jdGlvbihlLHQpe3RoaXMuY29sb3JTdG9wLnB1c2goW2UsdnAodCldKX07ZnVuY3Rpb24geXAoZSl7dGhpcy53aWR0aD1lfXZhciBfcD1mdW5jdGlvbihlLHQpe3RoaXMuaWQ9ZSx0aGlzLnBhZ2VJZD10LHRoaXMuYWN0aW9ucz1bXSx0aGlzLnBhdGg9W10sdGhpcy5zdWJwYXRoPVtdLHRoaXMuY3VycmVudFRyYW5zZm9ybT1bXSx0aGlzLmN1cnJlbnRTdGVwQW5pbWF0ZXM9W10sdGhpcy5kcmF3aW5nU3RhdGU9W10sdGhpcy5zdGF0ZT17bGluZURhc2g6WzAsMF0sc2hhZG93T2Zmc2V0WDowLHNoYWRvd09mZnNldFk6MCxzaGFkb3dCbHVyOjAsc2hhZG93Q29sb3I6WzAsMCwwLDBdLGZvbnQ6IjEwcHggc2Fucy1zZXJpZiIsZm9udFNpemU6MTAsZm9udFdlaWdodDoibm9ybWFsIixmb250U3R5bGU6Im5vcm1hbCIsZm9udEZhbWlseToic2Fucy1zZXJpZiJ9fSxicD17bGluZURhc2hPZmZzZXQ6e2NvbmZpZ3VyYWJsZTohMH0sZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uOntjb25maWd1cmFibGU6ITB9LHNoYWRvd0JsdXI6e2NvbmZpZ3VyYWJsZTohMH0sc2hhZG93Q29sb3I6e2NvbmZpZ3VyYWJsZTohMH0sc2hhZG93T2Zmc2V0WDp7Y29uZmlndXJhYmxlOiEwfSxzaGFkb3dPZmZzZXRZOntjb25maWd1cmFibGU6ITB9LGZvbnQ6e2NvbmZpZ3VyYWJsZTohMH0sZmlsbFN0eWxlOntjb25maWd1cmFibGU6ITB9LHN0cm9rZVN0eWxlOntjb25maWd1cmFibGU6ITB9LGdsb2JhbEFscGhhOntjb25maWd1cmFibGU6ITB9LHRleHRBbGlnbjp7Y29uZmlndXJhYmxlOiEwfSxsaW5lQ2FwOntjb25maWd1cmFibGU6ITB9LGxpbmVKb2luOntjb25maWd1cmFibGU6ITB9LGxpbmVXaWR0aDp7Y29uZmlndXJhYmxlOiEwfSxtaXRlckxpbWl0Ontjb25maWd1cmFibGU6ITB9LHRleHRCYXNlbGluZTp7Y29uZmlndXJhYmxlOiEwfX07X3AucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1lJiYoZT0hMSk7dmFyIG4scj1bXS5jb25jYXQodGhpcy5hY3Rpb25zKTt0aGlzLmFjdGlvbnM9W10sdGhpcy5wYXRoPVtdLCJmdW5jdGlvbiI9PXR5cGVvZiB0JiYobj1mcC5wdXNoKHQpKSxwcCh0aGlzLmlkLHRoaXMucGFnZUlkLCJhY3Rpb25zQ2hhbmdlZCIse2FjdGlvbnM6cixyZXNlcnZlOmUsY2FsbGJhY2tJZDpufSl9LF9wLnByb3RvdHlwZS5jcmVhdGVMaW5lYXJHcmFkaWVudD1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbmV3IG1wKCJsaW5lYXIiLFtlLHQsbixyXSl9LF9wLnByb3RvdHlwZS5jcmVhdGVDaXJjdWxhckdyYWRpZW50PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbmV3IG1wKCJyYWRpYWwiLFtlLHQsbl0pfSxfcC5wcm90b3R5cGUuY3JlYXRlUGF0dGVybj1mdW5jdGlvbihlLHQpe2lmKHZvaWQgMD09PXQpY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIGV4ZWN1dGUgJ2NyZWF0ZVBhdHRlcm4nIG9uICdDYW52YXNDb250ZXh0JzogMiBhcmd1bWVudHMgcmVxdWlyZWQsIGJ1dCBvbmx5IDEgcHJlc2VudC4iKTtlbHNle2lmKCEoWyJyZXBlYXQiLCJyZXBlYXQteCIsInJlcGVhdC15Iiwibm8tcmVwZWF0Il0uaW5kZXhPZih0KTwwKSlyZXR1cm4gbmV3IGdwKGUsdCk7Y29uc29sZS5lcnJvcigiRmFpbGVkIHRvIGV4ZWN1dGUgJ2NyZWF0ZVBhdHRlcm4nIG9uICdDYW52YXNDb250ZXh0JzogVGhlIHByb3ZpZGVkIHR5cGUgKCciK3QrIicpIGlzIG5vdCBvbmUgb2YgJ3JlcGVhdCcsICduby1yZXBlYXQnLCAncmVwZWF0LXgnLCBvciAncmVwZWF0LXknLiIpfX0sX3AucHJvdG90eXBlLm1lYXN1cmVUZXh0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc3RhdGUuZm9udCxuPTAscj1yZy53ZWJ2aWV3LmFsbCgpLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0VVJMKCkuZW5kc1dpdGgoInd3dy9fX3VuaWFwcHZpZXcuaHRtbCIpfSk7cmV0dXJuIHImJihuPU51bWJlcihyLmV2YWxKU1N5bmMoIigiK2Z1bmN0aW9uKGUsdCl7dmFyIG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIikuZ2V0Q29udGV4dCgiMmQiKTtyZXR1cm4gbi5mb250PXQsbi5tZWFzdXJlVGV4dChlKS53aWR0aHx8MH0udG9TdHJpbmcoKSsiKSgiK0pTT04uc3RyaW5naWZ5KGUpKyIsIitKU09OLnN0cmluZ2lmeSh0KSsiKSIpKSksbmV3IHlwKG4pfSxfcC5wcm90b3R5cGUuc2F2ZT1mdW5jdGlvbigpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNhdmUiLGRhdGE6W119KSx0aGlzLmRyYXdpbmdTdGF0ZS5wdXNoKHRoaXMuc3RhdGUpfSxfcC5wcm90b3R5cGUucmVzdG9yZT1mdW5jdGlvbigpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InJlc3RvcmUiLGRhdGE6W119KSx0aGlzLnN0YXRlPXRoaXMuZHJhd2luZ1N0YXRlLnBvcCgpfHx7bGluZURhc2g6WzAsMF0sc2hhZG93T2Zmc2V0WDowLHNoYWRvd09mZnNldFk6MCxzaGFkb3dCbHVyOjAsc2hhZG93Q29sb3I6WzAsMCwwLDBdLGZvbnQ6IjEwcHggc2Fucy1zZXJpZiIsZm9udFNpemU6MTAsZm9udFdlaWdodDoibm9ybWFsIixmb250U3R5bGU6Im5vcm1hbCIsZm9udEZhbWlseToic2Fucy1zZXJpZiJ9fSxfcC5wcm90b3R5cGUuYmVnaW5QYXRoPWZ1bmN0aW9uKCl7dGhpcy5wYXRoPVtdLHRoaXMuc3VicGF0aD1bXSx0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJiZWdpblBhdGgiLGRhdGE6W119KX0sX3AucHJvdG90eXBlLm1vdmVUbz1mdW5jdGlvbihlLHQpe3RoaXMucGF0aC5wdXNoKHttZXRob2Q6Im1vdmVUbyIsZGF0YTpbZSx0XX0pLHRoaXMuc3VicGF0aD1bW2UsdF1dfSxfcC5wcm90b3R5cGUubGluZVRvPWZ1bmN0aW9uKGUsdCl7MD09PXRoaXMucGF0aC5sZW5ndGgmJjA9PT10aGlzLnN1YnBhdGgubGVuZ3RoP3RoaXMucGF0aC5wdXNoKHttZXRob2Q6Im1vdmVUbyIsZGF0YTpbZSx0XX0pOnRoaXMucGF0aC5wdXNoKHttZXRob2Q6ImxpbmVUbyIsZGF0YTpbZSx0XX0pLHRoaXMuc3VicGF0aC5wdXNoKFtlLHRdKX0sX3AucHJvdG90eXBlLnF1YWRyYXRpY0N1cnZlVG89ZnVuY3Rpb24oZSx0LG4scil7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoicXVhZHJhdGljQ3VydmVUbyIsZGF0YTpbZSx0LG4scl19KSx0aGlzLnN1YnBhdGgucHVzaChbbixyXSl9LF9wLnByb3RvdHlwZS5iZXppZXJDdXJ2ZVRvPWZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJiZXppZXJDdXJ2ZVRvIixkYXRhOltlLHQsbixyLGksb119KSx0aGlzLnN1YnBhdGgucHVzaChbaSxvXSl9LF9wLnByb3RvdHlwZS5hcmM9ZnVuY3Rpb24oZSx0LG4scixpLG8pe3ZvaWQgMD09PW8mJihvPSExKSx0aGlzLnBhdGgucHVzaCh7bWV0aG9kOiJhcmMiLGRhdGE6W2UsdCxuLHIsaSxvXX0pLHRoaXMuc3VicGF0aC5wdXNoKFtlLHRdKX0sX3AucHJvdG90eXBlLnJlY3Q9ZnVuY3Rpb24oZSx0LG4scil7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoicmVjdCIsZGF0YTpbZSx0LG4scl19KSx0aGlzLnN1YnBhdGg9W1tlLHRdXX0sX3AucHJvdG90eXBlLmFyY1RvPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoiYXJjVG8iLGRhdGE6W2UsdCxuLHIsaV19KSx0aGlzLnN1YnBhdGgucHVzaChbbixyXSl9LF9wLnByb3RvdHlwZS5jbGlwPWZ1bmN0aW9uKCl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoiY2xpcCIsZGF0YTpbXS5jb25jYXQodGhpcy5wYXRoKX0pfSxfcC5wcm90b3R5cGUuY2xvc2VQYXRoPWZ1bmN0aW9uKCl7dGhpcy5wYXRoLnB1c2goe21ldGhvZDoiY2xvc2VQYXRoIixkYXRhOltdfSksdGhpcy5zdWJwYXRoLmxlbmd0aCYmKHRoaXMuc3VicGF0aD1bdGhpcy5zdWJwYXRoLnNoaWZ0KCldKX0sX3AucHJvdG90eXBlLmNsZWFyQWN0aW9ucz1mdW5jdGlvbigpe3RoaXMuYWN0aW9ucz1bXSx0aGlzLnBhdGg9W10sdGhpcy5zdWJwYXRoPVtdfSxfcC5wcm90b3R5cGUuZ2V0QWN0aW9ucz1mdW5jdGlvbigpe3ZhciBlPVtdLmNvbmNhdCh0aGlzLmFjdGlvbnMpO3JldHVybiB0aGlzLmNsZWFyQWN0aW9ucygpLGV9LGJwLmxpbmVEYXNoT2Zmc2V0LnNldD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRMaW5lRGFzaE9mZnNldCIsZGF0YTpbZV19KX0sYnAuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uLnNldD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRHbG9iYWxDb21wb3NpdGVPcGVyYXRpb24iLGRhdGE6W2VdfSl9LGJwLnNoYWRvd0JsdXIuc2V0PWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldFNoYWRvd0JsdXIiLGRhdGE6W2VdfSl9LGJwLnNoYWRvd0NvbG9yLnNldD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRTaGFkb3dDb2xvciIsZGF0YTpbZV19KX0sYnAuc2hhZG93T2Zmc2V0WC5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0U2hhZG93T2Zmc2V0WCIsZGF0YTpbZV19KX0sYnAuc2hhZG93T2Zmc2V0WS5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0U2hhZG93T2Zmc2V0WSIsZGF0YTpbZV19KX0sYnAuZm9udC5zZXQ9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcyx0PSh0aGlzLnN0YXRlLmZvbnQ9ZSkubWF0Y2goL14oKFtcd1wtXStccykqKShcZCtyP3B4KShcLyhcZCtcLj9cZCoocj9weCk/KSk/XHMrKC4qKS8pO2lmKHQpe3ZhciByPXRbMV0udHJpbSgpLnNwbGl0KC9ccy8pLGk9cGFyc2VGbG9hdCh0WzNdKSxvPXRbN10sYT1bXTtyLmZvckVhY2goZnVuY3Rpb24oZSx0KXstMTxbIml0YWxpYyIsIm9ibGlxdWUiLCJub3JtYWwiXS5pbmRleE9mKGUpPyhhLnB1c2goe21ldGhvZDoic2V0Rm9udFN0eWxlIixkYXRhOltlXX0pLG4uc3RhdGUuZm9udFN0eWxlPWUpOi0xPFsiYm9sZCIsIm5vcm1hbCJdLmluZGV4T2YoZSk/KGEucHVzaCh7bWV0aG9kOiJzZXRGb250V2VpZ2h0IixkYXRhOltlXX0pLG4uc3RhdGUuZm9udFdlaWdodD1lKTowPT09dD8oYS5wdXNoKHttZXRob2Q6InNldEZvbnRTdHlsZSIsZGF0YTpbIm5vcm1hbCJdfSksbi5zdGF0ZS5mb250U3R5bGU9Im5vcm1hbCIpOjE9PT10JiZzKCl9KSwxPT09ci5sZW5ndGgmJnMoKSxyPWEubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLmRhdGFbMF19KS5qb2luKCIgIiksdGhpcy5zdGF0ZS5mb250U2l6ZT1pLHRoaXMuc3RhdGUuZm9udEZhbWlseT1vLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldEZvbnQiLGRhdGE6W3IrIiAiK2krInB4ICIrb119KX1lbHNlIGNvbnNvbGUud2FybigiRmFpbGVkIHRvIHNldCAnZm9udCcgb24gJ0NhbnZhc0NvbnRleHQnOiBpbnZhbGlkIGZvcm1hdC4iKTtmdW5jdGlvbiBzKCl7YS5wdXNoKHttZXRob2Q6InNldEZvbnRXZWlnaHQiLGRhdGE6WyJub3JtYWwiXX0pLG4uc3RhdGUuZm9udFdlaWdodD0ibm9ybWFsIn19LGJwLmZvbnQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdGUuZm9udH0sYnAuZmlsbFN0eWxlLnNldD1mdW5jdGlvbihlKXt0aGlzLnNldEZpbGxTdHlsZShlKX0sYnAuc3Ryb2tlU3R5bGUuc2V0PWZ1bmN0aW9uKGUpe3RoaXMuc2V0U3Ryb2tlU3R5bGUoZSl9LGJwLmdsb2JhbEFscGhhLnNldD1mdW5jdGlvbihlKXtlPU1hdGguZmxvb3IoMjU1KnBhcnNlRmxvYXQoZSkpLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldEdsb2JhbEFscGhhIixkYXRhOltlXX0pfSxicC50ZXh0QWxpZ24uc2V0PWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldFRleHRBbGlnbiIsZGF0YTpbZV19KX0sYnAubGluZUNhcC5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0TGluZUNhcCIsZGF0YTpbZV19KX0sYnAubGluZUpvaW4uc2V0PWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldExpbmVKb2luIixkYXRhOltlXX0pfSxicC5saW5lV2lkdGguc2V0PWZ1bmN0aW9uKGUpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6InNldExpbmVXaWR0aCIsZGF0YTpbZV19KX0sYnAubWl0ZXJMaW1pdC5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic2V0TWl0ZXJMaW1pdCIsZGF0YTpbZV19KX0sYnAudGV4dEJhc2VsaW5lLnNldD1mdW5jdGlvbihlKXt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOiJzZXRUZXh0QmFzZWxpbmUiLGRhdGE6W2VdfSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKF9wLnByb3RvdHlwZSxicCksWyJzY2FsZSIsInJvdGF0ZSIsInRyYW5zbGF0ZSIsInNldFRyYW5zZm9ybSIsInRyYW5zZm9ybSJdLmNvbmNhdChbImRyYXdJbWFnZSIsImZpbGxUZXh0IiwiZmlsbCIsInN0cm9rZSIsImZpbGxSZWN0Iiwic3Ryb2tlUmVjdCIsImNsZWFyUmVjdCIsInN0cm9rZVRleHQiXSkuZm9yRWFjaChmdW5jdGlvbihlKXtfcC5wcm90b3R5cGVbZV09ZnVuY3Rpb24oZCl7c3dpdGNoKGQpe2Nhc2UiZmlsbCI6Y2FzZSJzdHJva2UiOnJldHVybiBmdW5jdGlvbigpe3RoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6ZCsiUGF0aCIsZGF0YTpbXS5jb25jYXQodGhpcy5wYXRoKX0pfTtjYXNlImZpbGxSZWN0IjpyZXR1cm4gZnVuY3Rpb24oZSx0LG4scil7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoiZmlsbFBhdGgiLGRhdGE6W3ttZXRob2Q6InJlY3QiLGRhdGE6W2UsdCxuLHJdfV19KX07Y2FzZSJzdHJva2VSZWN0IjpyZXR1cm4gZnVuY3Rpb24oZSx0LG4scil7dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDoic3Ryb2tlUGF0aCIsZGF0YTpbe21ldGhvZDoicmVjdCIsZGF0YTpbZSx0LG4scl19XX0pfTtjYXNlImZpbGxUZXh0IjpjYXNlInN0cm9rZVRleHQiOnJldHVybiBmdW5jdGlvbihlLHQsbixyKXt2YXIgaT1bZS50b1N0cmluZygpLHQsbl07Im51bWJlciI9PXR5cGVvZiByJiZpLnB1c2gociksdGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpkLGRhdGE6aX0pfTtjYXNlImRyYXdJbWFnZSI6cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIsaSxvLGEscyxjKXt2YXIgdTtmdW5jdGlvbiBsKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZX12b2lkIDA9PT1jJiYobz10LGE9bixzPXIsYz1pLGk9cj1uPXQ9dm9pZCAwKSx1PWwodCkmJmwobikmJmwocikmJmwoaSk/W2UsbyxhLHMsYyx0LG4scixpXTpsKHMpJiZsKGMpP1tlLG8sYSxzLGNdOltlLG8sYV0sdGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDpkLGRhdGE6dX0pfTtkZWZhdWx0OnJldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOmQsZGF0YTplfSl9fX0oZSl9KSxbInNldEZpbGxTdHlsZSIsInNldFRleHRBbGlnbiIsInNldFN0cm9rZVN0eWxlIiwic2V0R2xvYmFsQWxwaGEiLCJzZXRTaGFkb3ciLCJzZXRGb250U2l6ZSIsInNldExpbmVDYXAiLCJzZXRMaW5lSm9pbiIsInNldExpbmVXaWR0aCIsInNldE1pdGVyTGltaXQiLCJzZXRUZXh0QmFzZWxpbmUiLCJzZXRMaW5lRGFzaCJdLmZvckVhY2goZnVuY3Rpb24oZSl7X3AucHJvdG90eXBlW2VdPWZ1bmN0aW9uKGkpe3N3aXRjaChpKXtjYXNlInNldEZpbGxTdHlsZSI6Y2FzZSJzZXRTdHJva2VTdHlsZSI6cmV0dXJuIGZ1bmN0aW9uKGUpeyJvYmplY3QiIT10eXBlb2YgZT90aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOmksZGF0YTpbIm5vcm1hbCIsdnAoZSldfSk6dGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDppLGRhdGE6W2UudHlwZSxlLmRhdGEsZS5jb2xvclN0b3BdfSl9O2Nhc2Uic2V0R2xvYmFsQWxwaGEiOnJldHVybiBmdW5jdGlvbihlKXtlPU1hdGguZmxvb3IoMjU1KnBhcnNlRmxvYXQoZSkpLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6aSxkYXRhOltlXX0pfTtjYXNlInNldFNoYWRvdyI6cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIpe3I9dnAociksdGhpcy5hY3Rpb25zLnB1c2goe21ldGhvZDppLGRhdGE6W2UsdCxuLHJdfSksdGhpcy5zdGF0ZS5zaGFkb3dCbHVyPW4sdGhpcy5zdGF0ZS5zaGFkb3dDb2xvcj1yLHRoaXMuc3RhdGUuc2hhZG93T2Zmc2V0WD1lLHRoaXMuc3RhdGUuc2hhZG93T2Zmc2V0WT10fTtjYXNlInNldExpbmVEYXNoIjpyZXR1cm4gZnVuY3Rpb24oZSx0KXtlPWV8fFswLDBdLHQ9dHx8MCx0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOmksZGF0YTpbZSx0XX0pLHRoaXMuc3RhdGUubGluZURhc2g9ZX07Y2FzZSJzZXRGb250U2l6ZSI6cmV0dXJuIGZ1bmN0aW9uKGUpe3RoaXMuc3RhdGUuZm9udD10aGlzLnN0YXRlLmZvbnQucmVwbGFjZSgvXGQrXC4/XGQqcHgvLGUrInB4IiksdGhpcy5zdGF0ZS5mb250U2l6ZT1lLHRoaXMuYWN0aW9ucy5wdXNoKHttZXRob2Q6aSxkYXRhOltlXX0pfTtkZWZhdWx0OnJldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTt0aGlzLmFjdGlvbnMucHVzaCh7bWV0aG9kOmksZGF0YTplfSl9fX0oZSl9KTt2YXIgd3A9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQ2FudmFzQ29udGV4dDpfcCxjcmVhdGVDYW52YXNDb250ZXh0OmZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4gbmV3IF9wKGUsdC4kcGFnZS5pZCk7dmFyIG49a2woKTtpZihuKXJldHVybiBuZXcgX3AoZSxuKTtpZy5lbWl0KCJvbkVycm9yIiwiY3JlYXRlQ2FudmFzQ29udGV4dDpmYWlsIil9LGNhbnZhc0dldEltYWdlRGF0YTpmdW5jdGlvbihlLG4pe3ZhciB0PWUuY2FudmFzSWQscj1lLngsaT1lLnksbz1lLndpZHRoLGE9ZS5oZWlnaHQscz1rbCgpO3M/cHAodCxzLCJnZXRJbWFnZURhdGEiLHt4OnIseTppLHdpZHRoOm8saGVpZ2h0OmEsY2FsbGJhY2tJZDpmcC5wdXNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0YTt0JiZ0Lmxlbmd0aCYmKGUuY29tcHJlc3NlZCYmKHQ9ZHAuaW5mbGF0ZVJhdyh0KSxkZWxldGUgZS5jb21wcmVzc2VkKSxlLmRhdGE9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHQpKSxmaShuLGUpfSl9KTpmaShuLHtlcnJNc2c6ImNhbnZhc0dldEltYWdlRGF0YTpmYWlsIn0pfSxjYW52YXNQdXRJbWFnZURhdGE6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNhbnZhc0lkLHI9ZS5kYXRhLGk9ZS54LG89ZS55LGE9ZS53aWR0aCxzPWUuaGVpZ2h0LGM9a2woKTtpZihjKXt2YXIgdSxsPWZwLnB1c2goZnVuY3Rpb24oZSl7ZmkodCxlKX0pOyJpT1MiIT09cmcub3MubmFtZXx8ImJvb2xlYW4iPT10eXBlb2YgX19XRUVYX0RFVlRPT0xfXz8ocj1kcC5kZWZsYXRlUmF3KHIse3RvOiJzdHJpbmcifSksdT0hMCk6cj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChyKSxwcChuLGMsInB1dEltYWdlRGF0YSIse2RhdGE6cix4OmkseTpvLHdpZHRoOmEsaGVpZ2h0OnMsY29tcHJlc3NlZDp1LGNhbGxiYWNrSWQ6bH0pfWVsc2UgZmkodCx7ZXJyTXNnOiJjYW52YXNQdXRJbWFnZURhdGE6ZmFpbCJ9KX0sY2FudmFzVG9UZW1wRmlsZVBhdGg6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLng7dm9pZCAwPT09biYmKG49MCk7dmFyIHI9ZS55O3ZvaWQgMD09PXImJihyPTApO3ZhciBpPWUud2lkdGgsbz1lLmhlaWdodCxhPWUuZGVzdFdpZHRoLHM9ZS5kZXN0SGVpZ2h0LGM9ZS5jYW52YXNJZCx1PWUuZmlsZVR5cGUsbD1lLnF1YWxpdHksZD1rbCgpO2lmKGQpe3ZhciBmPWZwLnB1c2goZnVuY3Rpb24oZSl7ZmkodCxlKX0pO3BwKGMsZCwidG9UZW1wRmlsZVBhdGgiLHt4Om4seTpyLHdpZHRoOmksaGVpZ2h0Om8sZGVzdFdpZHRoOmEsZGVzdEhlaWdodDpzLGZpbGVUeXBlOnUscXVhbGl0eTpsLGRpcm5hbWU6eW8rIi9jYW52YXMiLGNhbGxiYWNrSWQ6Zn0pfWVsc2UgZmkodCx7ZXJyTXNnOiJjYW52YXNUb1RlbXBGaWxlUGF0aDpmYWlsIn0pfX0pO2Z1bmN0aW9uIGtwKGUsdCxuLHIpe19sKCJvcGVyYXRlTWFwUGxheWVyIixlLHQsbixyKX1pZy5zdWJzY3JpYmUoIm9uTWFwTWV0aG9kQ2FsbGJhY2siLGZ1bmN0aW9uKGUpe3ZhciB0PWUuY2FsbGJhY2tJZCxuPWUuZGF0YTtNLmludm9rZSh0LG4pfSk7dmFyIFNwPWZ1bmN0aW9uKGUsdCl7dGhpcy5pZD1lLHRoaXMucGFnZVZtPXR9O1NwLnByb3RvdHlwZS5vbj1mdW5jdGlvbihlLHQpe2twKHRoaXMuaWQsdGhpcy5wYWdlVm0sIm9uIix7bmFtZTplLGNhbGxiYWNrOnR9KX0sU3AucHJvdG90eXBlLiRnZXRBcHBNYXA9ZnVuY3Rpb24oKXtyZXR1cm4gcmcubWFwcy5nZXRNYXBCeUlkKHRoaXMucGFnZVZtLiRwYWdlLmlkKyItbWFwLSIrdGhpcy5pZCl9LFsiZ2V0Q2VudGVyTG9jYXRpb24iLCJtb3ZlVG9Mb2NhdGlvbiIsImdldFNjYWxlIiwiZ2V0UmVnaW9uIiwiaW5jbHVkZVBvaW50cyIsInRyYW5zbGF0ZU1hcmtlciIsImFkZEN1c3RvbUxheWVyIiwicmVtb3ZlQ3VzdG9tTGF5ZXIiLCJhZGRHcm91bmRPdmVybGF5IiwicmVtb3ZlR3JvdW5kT3ZlcmxheSIsInVwZGF0ZUdyb3VuZE92ZXJsYXkiLCJpbml0TWFya2VyQ2x1c3RlciIsImFkZE1hcmtlcnMiLCJyZW1vdmVNYXJrZXJzIiwibW92ZUFsb25nIiwic2V0TG9jTWFya2VySWNvbiIsIm9wZW5NYXBBcHAiXS5mb3JFYWNoKGZ1bmN0aW9uKG4pe1NwLnByb3RvdHlwZVtuXT1NLndhcnAoZnVuY3Rpb24oZSx0KXtlLmNhbGxiYWNrSWQ9dCxrcCh0aGlzLmlkLHRoaXMucGFnZVZtLG4sZSl9KX0pO3ZhciB4cD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxNYXBDb250ZXh0OlNwLGNyZWF0ZU1hcENvbnRleHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IFNwKGUsdHx8d2woImNyZWF0ZU1hcENvbnRleHQiKSl9fSksQ3A9Wy41LC44LDEsMS4yNSwxLjUsMl07ZnVuY3Rpb24gVHAoZSx0LG4scil7X2woIm9wZXJhdGVWaWRlb1BsYXllciIsZSx0LG4scil9dmFyIE9wPWZ1bmN0aW9uKGUsdCl7dGhpcy5pZD1lLHRoaXMucGFnZVZtPXR9O09wLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7VHAodGhpcy5pZCx0aGlzLnBhZ2VWbSwicGxheSIpfSxPcC5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXtUcCh0aGlzLmlkLHRoaXMucGFnZVZtLCJwYXVzZSIpfSxPcC5wcm90b3R5cGUuc3RvcD1mdW5jdGlvbigpe1RwKHRoaXMuaWQsdGhpcy5wYWdlVm0sInN0b3AiKX0sT3AucHJvdG90eXBlLnNlZWs9ZnVuY3Rpb24oZSl7VHAodGhpcy5pZCx0aGlzLnBhZ2VWbSwic2VlayIse3Bvc2l0aW9uOmV9KX0sT3AucHJvdG90eXBlLnNlbmREYW5tdT1mdW5jdGlvbihlKXtUcCh0aGlzLmlkLHRoaXMucGFnZVZtLCJzZW5kRGFubXUiLGUpfSxPcC5wcm90b3R5cGUucGxheWJhY2tSYXRlPWZ1bmN0aW9uKGUpe35DcC5pbmRleE9mKGUpfHwoZT0xKSxUcCh0aGlzLmlkLHRoaXMucGFnZVZtLCJwbGF5YmFja1JhdGUiLHtyYXRlOmV9KX0sT3AucHJvdG90eXBlLnJlcXVlc3RGdWxsU2NyZWVuPWZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KSxUcCh0aGlzLmlkLHRoaXMucGFnZVZtLCJyZXF1ZXN0RnVsbFNjcmVlbiIsZSl9LE9wLnByb3RvdHlwZS5leGl0RnVsbFNjcmVlbj1mdW5jdGlvbigpe1RwKHRoaXMuaWQsdGhpcy5wYWdlVm0sImV4aXRGdWxsU2NyZWVuIil9LE9wLnByb3RvdHlwZS5zaG93U3RhdHVzQmFyPWZ1bmN0aW9uKCl7VHAodGhpcy5pZCx0aGlzLnBhZ2VWbSwic2hvd1N0YXR1c0JhciIpfSxPcC5wcm90b3R5cGUuaGlkZVN0YXR1c0Jhcj1mdW5jdGlvbigpe1RwKHRoaXMuaWQsdGhpcy5wYWdlVm0sImhpZGVTdGF0dXNCYXIiKX07dmFyIEVwPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLFZpZGVvQ29udGV4dDpPcCxjcmVhdGVWaWRlb0NvbnRleHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IE9wKGUsdHx8d2woImNyZWF0ZVZpZGVvQ29udGV4dCIpKX19KTtmdW5jdGlvbiBBcChlLHQsbixyKXtpZy5wdWJsaXNoSGFuZGxlcih0KyItZWRpdG9yLSIrZSx7Y29tcG9uZW50SWQ6ZSx0eXBlOm4sZGF0YTpyfSx0KX1pZy5zdWJzY3JpYmUoIm9uRWRpdG9yTWV0aG9kQ2FsbGJhY2siLGZ1bmN0aW9uKGUpe3ZhciB0PWUuY2FsbGJhY2tJZCxuPWUuZGF0YTtNLmludm9rZSh0LG4pfSk7dmFyIElwPWZ1bmN0aW9uKGUsdCl7dGhpcy5pZD1lLHRoaXMucGFnZUlkPXR9O0lwLnByb3RvdHlwZS5mb3JtYXQ9ZnVuY3Rpb24oZSx0KXtBcCh0aGlzLmlkLHRoaXMucGFnZUlkLCJmb3JtYXQiLHtvcHRpb25zOntuYW1lOmUsdmFsdWU6dH19KX0sWyJpbnNlcnREaXZpZGVyIiwiaW5zZXJ0SW1hZ2UiLCJpbnNlcnRUZXh0Iiwic2V0Q29udGVudHMiLCJnZXRDb250ZW50cyIsImNsZWFyIiwicmVtb3ZlRm9ybWF0IiwidW5kbyIsInJlZG8iLCJibHVyIiwiZ2V0U2VsZWN0aW9uVGV4dCIsInNjcm9sbEludG9WaWV3Il0uZm9yRWFjaChmdW5jdGlvbihuKXtJcC5wcm90b3R5cGVbbl09TS53YXJwKGZ1bmN0aW9uKGUsdCl7QXAodGhpcy5pZCx0aGlzLnBhZ2VJZCxuLHtvcHRpb25zOmUsY2FsbGJhY2tJZDp0fSl9KX0pO3ZhciAkcD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxFZGl0b3JDb250ZXh0OklwfSksUHA9WyJjYW5wbGF5IiwicGxheSIsInBhdXNlIiwic3RvcCIsImVuZGVkIiwidGltZVVwZGF0ZSIsImVycm9yIiwid2FpdGluZyIsInNlZWtpbmciLCJzZWVrZWQiXSxNcD1be25hbWU6InNyYyIsY2FjaGU6ITB9LHtuYW1lOiJzdGFydFRpbWUiLGRlZmF1bHQ6MCxjYWNoZTohMH0se25hbWU6ImF1dG9wbGF5IixkZWZhdWx0OiExLGNhY2hlOiEwfSx7bmFtZToibG9vcCIsZGVmYXVsdDohMSxjYWNoZTohMH0se25hbWU6Im9iZXlNdXRlU3dpdGNoIixkZWZhdWx0OiEwLHJlYWRvbmx5OiEwLGNhY2hlOiEwfSx7bmFtZToiZHVyYXRpb24iLHJlYWRvbmx5OiEwfSx7bmFtZToiY3VycmVudFRpbWUiLHJlYWRvbmx5OiEwfSx7bmFtZToicGF1c2VkIixyZWFkb25seTohMH0se25hbWU6ImJ1ZmZlcmVkIixyZWFkb25seTohMH0se25hbWU6InZvbHVtZSJ9LHtuYW1lOiJzZXNzaW9uQ2F0ZWdvcnkifSx7bmFtZToicGxheWJhY2tSYXRlIixjYWNoZTohMH1dLGpwPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dGhpcy5pZD1lLHRoaXMuX2NhbGxiYWNrcz17fSx0aGlzLl9vcHRpb25zPXt9LFBwLmZvckVhY2goZnVuY3Rpb24oZSl7dC5fY2FsbGJhY2tzW2UudG9Mb3dlckNhc2UoKV09W119KSxNcC5mb3JFYWNoKGZ1bmN0aW9uKG4pe3ZhciByPW4ubmFtZSxlPXtnZXQ6ZnVuY3Rpb24oKXt2YXIgZT1uLmNhY2hlP3RoaXMuX29wdGlvbnM6X2woImdldEF1ZGlvU3RhdGUiLHthdWRpb0lkOnRoaXMuaWR9KSx0PXIgaW4gZT9lW3JdOm4uZGVmYXVsdDtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQmJiJ2b2x1bWUiIT09cj90LzFlMzp0fX07bi5yZWFkb25seXx8KGUuc2V0PWZ1bmN0aW9uKGUpe3RoaXMuX29wdGlvbnNbcl09ZSxfbCgic2V0QXVkaW9TdGF0ZSIsT2JqZWN0LmFzc2lnbih7fSx0aGlzLl9vcHRpb25zLHthdWRpb0lkOnRoaXMuaWR9KSl9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLGUpfSl9O2Z1bmN0aW9uIExwKGUsdCxuLHIpe2UuX2NhbGxiYWNrc1t0XS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlKCJlcnJvciI9PT10P3tlcnJNc2c6bixlcnJDb2RlOnJ9Ont9KX0pfWpwLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dGhpcy5fb3BlcmF0ZSgicGxheSIpfSxqcC5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLl9vcGVyYXRlKCJwYXVzZSIpfSxqcC5wcm90b3R5cGUuc3RvcD1mdW5jdGlvbigpe3RoaXMuX29wZXJhdGUoInN0b3AiKX0sanAucHJvdG90eXBlLnNlZWs9ZnVuY3Rpb24oZSl7dGhpcy5fb3BlcmF0ZSgic2VlayIse2N1cnJlbnRUaW1lOjFlMyplfSl9LGpwLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7Y2codGhpcy5fX3RpbWluZyksX2woImRlc3Ryb3lBdWRpb0luc3RhbmNlIix7YXVkaW9JZDp0aGlzLmlkfSksZGVsZXRlIE5wW3RoaXMuaWRdfSxqcC5wcm90b3R5cGUuX29wZXJhdGU9ZnVuY3Rpb24oZSx0KXtfbCgib3BlcmF0ZUF1ZGlvIixPYmplY3QuYXNzaWduKHt9LHQse2F1ZGlvSWQ6dGhpcy5pZCxvcGVyYXRpb25UeXBlOmV9KSl9LFBwLmZvckVhY2goZnVuY3Rpb24ocil7dmFyIGU9clswXS50b1VwcGVyQ2FzZSgpK3Iuc3Vic3RyKDEpO3I9ci50b0xvd2VyQ2FzZSgpLGpwLnByb3RvdHlwZVsib24iK2VdPWZ1bmN0aW9uKGUpe3RoaXMuX2NhbGxiYWNrc1tyXS5wdXNoKGUpfSxqcC5wcm90b3R5cGVbIm9mZiIrZV09ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fY2FsbGJhY2tzW3JdLG49dC5pbmRleE9mKGUpOzA8PW4mJnQuc3BsaWNlKG4sMSl9fSksYmwoIm9uQXVkaW9TdGF0ZUNoYW5nZSIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdGF0ZSxuPWUuYXVkaW9JZCxyPWUuZXJyTXNnLGk9ZS5lcnJDb2RlLG89TnBbbl07aWYobylpZihMcChvLHQscixpKSwicGxheSI9PT10KXt2YXIgYT1vLmN1cnJlbnRUaW1lO0xwKG8sInRpbWV1cGRhdGUiKSxvLl9fdGltaW5nPXNnKGZ1bmN0aW9uKCl7by5jdXJyZW50VGltZSE9PWEmJkxwKG8sInRpbWV1cGRhdGUiKX0sMjAwKX1lbHNlInBhdXNlIiE9PXQmJiJzdG9wIiE9PXQmJiJlcnJvciIhPT10fHxjZyhvLl9fdGltaW5nKX0pO3ZhciBOcD1PYmplY3QuY3JlYXRlKG51bGwpO3ZhciBCcD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjcmVhdGVJbm5lckF1ZGlvQ29udGV4dDpmdW5jdGlvbigpe3ZhciBlPV9sKCJjcmVhdGVBdWRpb0luc3RhbmNlIikuYXVkaW9JZCx0PW5ldyBqcChlKTtyZXR1cm4gTnBbZV09dH19KSxEcD1bXTtibCgib25OZXR3b3JrU3RhdHVzQ2hhbmdlIixmdW5jdGlvbih0KXtEcC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ZpKGUsdCl9KX0pO3ZhciBScD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxvbk5ldHdvcmtTdGF0dXNDaGFuZ2U6ZnVuY3Rpb24oZSl7RHAucHVzaChlKX0sb2ZmTmV0d29ya1N0YXR1c0NoYW5nZTpmdW5jdGlvbihlKXtpZihlKXt2YXIgdD1EcC5pbmRleE9mKGUpOzA8PXQmJkRwLnNwbGljZSh0LDEpfX19KSxGcD1bXSx6cD1bXTtibChudCxmdW5jdGlvbih0KXtGcC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ZpKGUsdCl9KX0pLGJsKCJvblVJU3R5bGVDaGFuZ2UiLGZ1bmN0aW9uKHQpe3pwLmZvckVhY2goZnVuY3Rpb24oZSl7ZmkoZSx0KX0pfSk7dmFyIFVwPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLG9uVGhlbWVDaGFuZ2U6ZnVuY3Rpb24oZSl7RnAucHVzaChlKX0sb2ZmVGhlbWVDaGFuZ2U6ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9RnAuaW5kZXhPZihlKTswPD10JiZGcC5zcGxpY2UodCwxKX19LG9uVUlTdHlsZUNoYW5nZTpmdW5jdGlvbihlKXt6cC5wdXNoKGUpLGNvbnNvbGUud2FybignVGhlICJ1bmkub25VSVN0eWxlQ2hhbmdlIiBBUEkgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSAidW5pLm9uVGhlbWVDaGFuZ2UiLiBMZWFybiBtb3JlOiBodHRwczovL3VuaWFwcC5kY2xvdWQubmV0LmNuL2FwaS9zeXN0ZW0vdGhlbWUuJyl9fSksVnA9WHUoImdldFNlbGVjdGVkVGV4dFJhbmdlRXZlbnQiKTtpZy5zdWJzY3JpYmUoIm9uR2V0U2VsZWN0ZWRUZXh0UmFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUuY2FsbGJhY2tJZCxuPWUuZGF0YTtjb25zb2xlLmxvZygib25HZXRTZWxlY3RlZFRleHRSYW5nZSIpO3ZhciByPVZwLnBvcCh0KTtyJiZyKG4pfSk7dmFyIHFwLFdwPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldFNlbGVjdGVkVGV4dFJhbmdlOmZ1bmN0aW9uKGUsdCl7dmFyIG49a2woKTtpZy5wdWJsaXNoSGFuZGxlcigiZ2V0U2VsZWN0ZWRUZXh0UmFuZ2UiLHtwYWdlSWQ6bixjYWxsYmFja0lkOlZwLnB1c2goZnVuY3Rpb24oZSl7ZmkodCxlKX0pfSxuKX19KTtibCgib25LZXlib2FyZEhlaWdodENoYW5nZSIsZnVuY3Rpb24oZSl7cXAmJmZpKHFwLGUpfSk7dmFyIEhwPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLG9uS2V5Ym9hcmRIZWlnaHRDaGFuZ2U6ZnVuY3Rpb24oZSl7dmFyIHQ7dD1xcCxpZy5yZW1vdmVDYWxsYmFja0hhbmRsZXIodCkscXA9ZX0sb2ZmS2V5Ym9hcmRIZWlnaHRDaGFuZ2U6ZnVuY3Rpb24oKXtxcD1udWxsfX0pLEdwPSJsb25nUHJlc3NBY3Rpb25zQ2FsbGJhY2siLFhwPXt9O2JsKEdwLGZ1bmN0aW9uKGUpe3ZhciB0PWUuZXJyTXNnfHwiIjtuZXcgUmVnRXhwKCJcXDpcXHMqZmFpbCIpLnRlc3QodCk/WHAuZmFpbCYmWHAuZmFpbChlKTpYcC5zdWNjZXNzJiZYcC5zdWNjZXNzKGUpLFhwLmNvbXBsZXRlJiZYcC5jb21wbGV0ZShlKX0pO3ZhciBZcCxKcD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxwcmV2aWV3SW1hZ2U6ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXt9KSwoKFhwPWUubG9uZ1ByZXNzQWN0aW9uc3x8e30pLnN1Y2Nlc3N8fFhwLmZhaWx8fFhwLmNvbXBsZXRlKSYmKFhwLmNhbGxiYWNrSWQ9R3ApLF9sKCJwcmV2aWV3SW1hZ2VQbHVzIixlKX0sY2xvc2VQcmV2aWV3SW1hZ2U6ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXt9KSxfbCgiY2xvc2VQcmV2aWV3SW1hZ2VQbHVzIixlKX19KSxLcD17cGF1c2U6bnVsbCxyZXN1bWU6bnVsbCxzdGFydDpudWxsLHN0b3A6bnVsbCxlcnJvcjpudWxsfSxacD1mdW5jdGlvbigpe2JsKCJvblJlY29yZGVyU3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUuc3RhdGU7ZGVsZXRlIGUuc3RhdGUsZGVsZXRlIGUuZXJyTXNnLCJmdW5jdGlvbiI9PXR5cGVvZiBLcFt0XSYmS3BbdF0oZSl9KX07WnAucHJvdG90eXBlLm9uRXJyb3I9ZnVuY3Rpb24oZSl7S3AuZXJyb3I9ZX0sWnAucHJvdG90eXBlLm9uRnJhbWVSZWNvcmRlZD1mdW5jdGlvbihlKXt9LFpwLnByb3RvdHlwZS5vbkludGVycnVwdGlvbkJlZ2luPWZ1bmN0aW9uKGUpe30sWnAucHJvdG90eXBlLm9uSW50ZXJydXB0aW9uRW5kPWZ1bmN0aW9uKGUpe30sWnAucHJvdG90eXBlLm9uUGF1c2U9ZnVuY3Rpb24oZSl7S3AucGF1c2U9ZX0sWnAucHJvdG90eXBlLm9uUmVzdW1lPWZ1bmN0aW9uKGUpe0twLnJlc3VtZT1lfSxacC5wcm90b3R5cGUub25TdGFydD1mdW5jdGlvbihlKXtLcC5zdGFydD1lfSxacC5wcm90b3R5cGUub25TdG9wPWZ1bmN0aW9uKGUpe0twLnN0b3A9ZX0sWnAucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7X2woIm9wZXJhdGVSZWNvcmRlciIse29wZXJhdGlvblR5cGU6InBhdXNlIn0pfSxacC5wcm90b3R5cGUucmVzdW1lPWZ1bmN0aW9uKCl7X2woIm9wZXJhdGVSZWNvcmRlciIse29wZXJhdGlvblR5cGU6InJlc3VtZSJ9KX0sWnAucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKGUpe19sKCJvcGVyYXRlUmVjb3JkZXIiLE9iamVjdC5hc3NpZ24oe30sZSx7b3BlcmF0aW9uVHlwZToic3RhcnQifSkpfSxacC5wcm90b3R5cGUuc3RvcD1mdW5jdGlvbigpe19sKCJvcGVyYXRlUmVjb3JkZXIiLHtvcGVyYXRpb25UeXBlOiJzdG9wIn0pfTt2YXIgUXA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZ2V0UmVjb3JkZXJNYW5hZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIFlwfHwoWXA9bmV3IFpwKX19KSxlaD1mdW5jdGlvbihlLHQpe3RoaXMuaWQ9ZSx0aGlzLl9jYWxsYmFja0lkPXQsdGhpcy5fY2FsbGJhY2tzPVtdfTtlaC5wcm90b3R5cGUuYWJvcnQ9ZnVuY3Rpb24oKXtfbCgib3BlcmF0ZURvd25sb2FkVGFzayIse2Rvd25sb2FkVGFza0lkOnRoaXMuaWQsb3BlcmF0aW9uVHlwZToiYWJvcnQifSl9LGVoLnByb3RvdHlwZS5vblByb2dyZXNzVXBkYXRlPWZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBlJiZ0aGlzLl9jYWxsYmFja3MucHVzaChlKX0sZWgucHJvdG90eXBlLm9uSGVhZGVyc1JlY2VpdmVkPWZ1bmN0aW9uKCl7fSxlaC5wcm90b3R5cGUub2ZmUHJvZ3Jlc3NVcGRhdGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fY2FsbGJhY2tzLmluZGV4T2YoZSk7MDw9dCYmdGhpcy5fY2FsbGJhY2tzLnNwbGljZSh0LDEpfSxlaC5wcm90b3R5cGUub2ZmSGVhZGVyc1JlY2VpdmVkPWZ1bmN0aW9uKCl7fTt2YXIgdGg9T2JqZWN0LmNyZWF0ZShudWxsKTtibCgib25Eb3dubG9hZFRhc2tTdGF0ZUNoYW5nZSIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kb3dubG9hZFRhc2tJZCxuPWUuc3RhdGUscj1lLnRlbXBGaWxlUGF0aCxpPWUuc3RhdHVzQ29kZSxvPWUucHJvZ3Jlc3MsYT1lLnRvdGFsQnl0ZXNXcml0dGVuLHM9ZS50b3RhbEJ5dGVzRXhwZWN0ZWRUb1dyaXRlLGM9ZS5lcnJNc2csdT10aFt0XSxsPXUuX2NhbGxiYWNrSWQ7c3dpdGNoKG4pe2Nhc2UicHJvZ3Jlc3NVcGRhdGUiOnUuX2NhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Uoe3Byb2dyZXNzOm8sdG90YWxCeXRlc1dyaXR0ZW46YSx0b3RhbEJ5dGVzRXhwZWN0ZWRUb1dyaXRlOnN9KX0pO2JyZWFrO2Nhc2Uic3VjY2VzcyI6ZmkobCx7dGVtcEZpbGVQYXRoOnIsc3RhdHVzQ29kZTppLGVyck1zZzoicmVxdWVzdDpvayJ9KTtjYXNlImZhaWwiOmZpKGwse2Vyck1zZzoicmVxdWVzdDpmYWlsICIrY30pO2RlZmF1bHQ6b2coZnVuY3Rpb24oKXtkZWxldGUgdGhbdF19LDEwMCl9fSk7dmFyIG5oPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGRvd25sb2FkRmlsZTpmdW5jdGlvbihlLHQpe3ZhciBuPV9sKCJjcmVhdGVEb3dubG9hZFRhc2siLGUpLmRvd25sb2FkVGFza0lkLHI9bmV3IGVoKG4sdCk7cmV0dXJuIHRoW25dPXJ9fSkscmg9T2JqZWN0LmNyZWF0ZShudWxsKTtibCgib25SZXF1ZXN0VGFza1N0YXRlQ2hhbmdlIixmdW5jdGlvbihlKXt2YXIgdD1lLnJlcXVlc3RUYXNrSWQsbj1lLnN0YXRlLHI9ZS5kYXRhLGk9ZS5zdGF0dXNDb2RlLG89ZS5oZWFkZXIsYT1lLmVyck1zZyxzPWUuY29va2llcyxjPXJoW3RdfHx7fSx1PWMuYXJncyxsPWMuY2FsbGJhY2tJZDtpZihsKXN3aXRjaChkZWxldGUgcmhbdF0sbil7Y2FzZSJzdWNjZXNzIjpmaShsLGZ1bmN0aW9uKHIsZSl7aWYoInN0cmluZyI9PXR5cGVvZiByLmRhdGEmJjY1Mjc5PT09ci5kYXRhLmNoYXJDb2RlQXQoMCkmJihyLmRhdGE9ci5kYXRhLnN1YnN0cigxKSksci5zdGF0dXNDb2RlPXBhcnNlSW50KHIuc3RhdHVzQ29kZSwxMCksVChyLmhlYWRlcikmJihyLmhlYWRlcj1PYmplY3Qua2V5cyhyLmhlYWRlcikucmVkdWNlKGZ1bmN0aW9uKGUsdCl7dmFyIG49ci5oZWFkZXJbdF07cmV0dXJuIEFycmF5LmlzQXJyYXkobik/ZVt0XT1uLmpvaW4oIiwiKToic3RyaW5nIj09dHlwZW9mIG4mJihlW3RdPW4pLGV9LHt9KSksZS5kYXRhVHlwZSYmImpzb24iPT09ZS5kYXRhVHlwZS50b0xvd2VyQ2FzZSgpKXRyeXtyLmRhdGE9SlNPTi5wYXJzZShyLmRhdGEpfWNhdGNoKGUpe31yZXR1cm4gcn0oe2RhdGE6cixzdGF0dXNDb2RlOmksaGVhZGVyOm8sZXJyTXNnOiJyZXF1ZXN0Om9rIixjb29raWVzOnN9LHUpKTticmVhaztjYXNlImZhaWwiOmZpKGwse2Vyck1zZzoicmVxdWVzdDpmYWlsICIrYX0pfX0pO3ZhciBpaD1mdW5jdGlvbihlKXt0aGlzLmlkPWV9O2loLnByb3RvdHlwZS5hYm9ydD1mdW5jdGlvbigpe19sKCJvcGVyYXRlUmVxdWVzdFRhc2siLHtyZXF1ZXN0VGFza0lkOnRoaXMuaWQsb3BlcmF0aW9uVHlwZToiYWJvcnQifSl9LGloLnByb3RvdHlwZS5vZmZIZWFkZXJzUmVjZWl2ZWQ9ZnVuY3Rpb24oKXt9LGloLnByb3RvdHlwZS5vbkhlYWRlcnNSZWNlaXZlZD1mdW5jdGlvbigpe307dmFyIG9oPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHJlcXVlc3Q6ZnVuY3Rpb24oZSx0KXt2YXIgbjtmb3IodmFyIHIgaW4gZS5oZWFkZXIpaWYoImNvbnRlbnQtdHlwZSI9PT1yLnRvTG93ZXJDYXNlKCkpe249ZS5oZWFkZXJbcl07YnJlYWt9IkdFVCIhPT1lLm1ldGhvZCYmMD09PW4uaW5kZXhPZigiYXBwbGljYXRpb24vanNvbiIpJiZUKGUuZGF0YSkmJihlLmRhdGE9SlNPTi5zdHJpbmdpZnkoZS5kYXRhKSk7dmFyIGk9X2woImNyZWF0ZVJlcXVlc3RUYXNrIixlKS5yZXF1ZXN0VGFza0lkO3JldHVybiByaFtpXT17YXJnczplLGNhbGxiYWNrSWQ6dH0sbmV3IGloKGkpfX0pLGFoPWZ1bmN0aW9uKGUpe3RoaXMuaWQ9ZSx0aGlzLl9jYWxsYmFja3M9e29wZW46W10sY2xvc2U6W10sZXJyb3I6W10sbWVzc2FnZTpbXX0sdGhpcy5DTE9TRUQ9Myx0aGlzLkNMT1NJTkc9Mix0aGlzLkNPTk5FQ1RJTkc9MCx0aGlzLk9QRU49MSx0aGlzLnJlYWR5U3RhdGU9dGhpcy5DTE9TRUR9O2FoLnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKGUpe3RoaXMucmVhZHlTdGF0ZSE9PXRoaXMuT1BFTiYmdGhpcy5fY2FsbGJhY2soZSwic2VuZFNvY2tldE1lc3NhZ2U6ZmFpbCBXZWJTb2NrZXQgaXMgbm90IGNvbm5lY3RlZCIpO3ZhciB0PV9sKCJvcGVyYXRlU29ja2V0VGFzayIsT2JqZWN0LmFzc2lnbih7fSxlLHtvcGVyYXRpb25UeXBlOiJzZW5kIixzb2NrZXRUYXNrSWQ6dGhpcy5pZH0pKS5lcnJNc2c7dGhpcy5fY2FsbGJhY2soZSx0LnJlcGxhY2UoIm9wZXJhdGVTb2NrZXRUYXNrIiwic2VuZFNvY2tldE1lc3NhZ2UiKSl9LGFoLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbihlKXt0aGlzLnJlYWR5U3RhdGU9dGhpcy5DTE9TSU5HO3ZhciB0PV9sKCJvcGVyYXRlU29ja2V0VGFzayIsT2JqZWN0LmFzc2lnbih7fSxlLHtvcGVyYXRpb25UeXBlOiJjbG9zZSIsc29ja2V0VGFza0lkOnRoaXMuaWR9KSkuZXJyTXNnO3RoaXMuX2NhbGxiYWNrKGUsdC5yZXBsYWNlKCJvcGVyYXRlU29ja2V0VGFzayIsImNsb3NlU29ja2V0IikpfSxhaC5wcm90b3R5cGUub25PcGVuPWZ1bmN0aW9uKGUpe3RoaXMuX2NhbGxiYWNrcy5vcGVuLnB1c2goZSl9LGFoLnByb3RvdHlwZS5vbkNsb3NlPWZ1bmN0aW9uKGUpe3RoaXMuX2NhbGxiYWNrcy5jbG9zZS5wdXNoKGUpfSxhaC5wcm90b3R5cGUub25FcnJvcj1mdW5jdGlvbihlKXt0aGlzLl9jYWxsYmFja3MuZXJyb3IucHVzaChlKX0sYWgucHJvdG90eXBlLm9uTWVzc2FnZT1mdW5jdGlvbihlKXt0aGlzLl9jYWxsYmFja3MubWVzc2FnZS5wdXNoKGUpfSxhaC5wcm90b3R5cGUuX2NhbGxiYWNrPWZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciBuPWUuc3VjY2VzcyxyPWUuZmFpbCxpPWUuY29tcGxldGUsbz17ZXJyTXNnOnR9Oy86b2skLy50ZXN0KHQpPyJmdW5jdGlvbiI9PXR5cGVvZiBuJiZuKG8pOiJmdW5jdGlvbiI9PXR5cGVvZiByJiZyKG8pLCJmdW5jdGlvbiI9PXR5cGVvZiBpJiZpKG8pfTt2YXIgc2g9T2JqZWN0LmNyZWF0ZShudWxsKSxjaD1bXSx1aD1PYmplY3QuY3JlYXRlKG51bGwpO2JsKCJvblNvY2tldFRhc2tTdGF0ZUNoYW5nZSIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zb2NrZXRUYXNrSWQsbj1lLnN0YXRlLHI9ZS5kYXRhLGk9ZS5jb2RlLG89ZS5yZWFzb24sYT0oZS5lcnJNc2csc2hbdF0pO2lmKGEpe3ZhciBzPSJtZXNzYWdlIj09PW4/e2RhdGE6cn06ImNsb3NlIj09PW4/e2NvZGU6aSxyZWFzb246b306e307aWYoIm9wZW4iPT09biYmKGEucmVhZHlTdGF0ZT1hLk9QRU4pLGE9PT1jaFswXSYmdWhbbl0mJmZpKHVoW25dLHMpLCJlcnJvciI9PT1ufHwiY2xvc2UiPT09bil7YS5yZWFkeVN0YXRlPWEuQ0xPU0VELGRlbGV0ZSBzaFt0XTt2YXIgYz1jaC5pbmRleE9mKGEpOzA8PWMmJmNoLnNwbGljZShjLDEpfWEuX2NhbGxiYWNrc1tuXS5mb3JFYWNoKGZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlKHMpfSl9fSk7dmFyIGxoLGRoPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGNvbm5lY3RTb2NrZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj1fbCgiY3JlYXRlU29ja2V0VGFzayIsZSkuc29ja2V0VGFza0lkLHI9bmV3IGFoKG4pO3JldHVybiBzaFtuXT1yLGNoLnB1c2gociksb2coZnVuY3Rpb24oKXtmaSh0LHtlcnJNc2c6ImNvbm5lY3RTb2NrZXQ6b2sifSl9LDApLHJ9LHNlbmRTb2NrZXRNZXNzYWdlOmZ1bmN0aW9uKGUsdCl7dmFyIG49Y2hbMF07aWYobiYmbi5yZWFkeVN0YXRlPT09bi5PUEVOKXJldHVybiBfbCgib3BlcmF0ZVNvY2tldFRhc2siLE9iamVjdC5hc3NpZ24oe30sZSx7b3BlcmF0aW9uVHlwZToic2VuZCIsc29ja2V0VGFza0lkOm4uaWR9KSk7ZmkodCx7ZXJyTXNnOiJzZW5kU29ja2V0TWVzc2FnZTpmYWlsIFdlYlNvY2tldCBpcyBub3QgY29ubmVjdGVkIn0pfSxjbG9zZVNvY2tldDpmdW5jdGlvbihlLHQpe3ZhciBuPWNoWzBdO2lmKG4pcmV0dXJuIG4ucmVhZHlTdGF0ZT1uLkNMT1NJTkcsX2woIm9wZXJhdGVTb2NrZXRUYXNrIixPYmplY3QuYXNzaWduKHt9LGUse29wZXJhdGlvblR5cGU6ImNsb3NlIixzb2NrZXRUYXNrSWQ6bi5pZH0pKTtmaSh0LHtlcnJNc2c6ImNsb3NlU29ja2V0OmZhaWwgV2ViU29ja2V0IGlzIG5vdCBjb25uZWN0ZWQifSl9LG9uU29ja2V0T3BlbjpmdW5jdGlvbihlKXt1aC5vcGVuPWV9LG9uU29ja2V0RXJyb3I6ZnVuY3Rpb24oZSl7dWguZXJyb3I9ZX0sb25Tb2NrZXRNZXNzYWdlOmZ1bmN0aW9uKGUpe3VoLm1lc3NhZ2U9ZX0sb25Tb2NrZXRDbG9zZTpmdW5jdGlvbihlKXt1aC5jbG9zZT1lfX0pLGZoPWZ1bmN0aW9uKCl7fTtmaC5wcm90b3R5cGUub25DaGVja0ZvclVwZGF0ZT1mdW5jdGlvbigpe30sZmgucHJvdG90eXBlLm9uVXBkYXRlUmVhZHk9ZnVuY3Rpb24oKXt9LGZoLnByb3RvdHlwZS5vblVwZGF0ZUZhaWxlZD1mdW5jdGlvbigpe30sZmgucHJvdG90eXBlLmFwcGx5VXBkYXRlPWZ1bmN0aW9uKCl7fTt2YXIgcGg9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZ2V0VXBkYXRlTWFuYWdlcjpmdW5jdGlvbigpe3JldHVybiBsaHx8KGxoPW5ldyBmaCl9fSksaGg9ZnVuY3Rpb24oZSx0KXt0aGlzLmlkPWUsdGhpcy5fY2FsbGJhY2tJZD10LHRoaXMuX2NhbGxiYWNrcz1bXX07aGgucHJvdG90eXBlLmFib3J0PWZ1bmN0aW9uKCl7X2woIm9wZXJhdGVVcGxvYWRUYXNrIix7dXBsb2FkVGFza0lkOnRoaXMuaWQsb3BlcmF0aW9uVHlwZToiYWJvcnQifSl9LGhoLnByb3RvdHlwZS5vblByb2dyZXNzVXBkYXRlPWZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBlJiZ0aGlzLl9jYWxsYmFja3MucHVzaChlKX0saGgucHJvdG90eXBlLm9uSGVhZGVyc1JlY2VpdmVkPWZ1bmN0aW9uKCl7fSxoaC5wcm90b3R5cGUub2ZmUHJvZ3Jlc3NVcGRhdGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fY2FsbGJhY2tzLmluZGV4T2YoZSk7MDw9dCYmdGhpcy5fY2FsbGJhY2tzLnNwbGljZSh0LDEpfSxoaC5wcm90b3R5cGUub2ZmSGVhZGVyc1JlY2VpdmVkPWZ1bmN0aW9uKCl7fTt2YXIgdmg9T2JqZWN0LmNyZWF0ZShudWxsKTtibCgib25VcGxvYWRUYXNrU3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudXBsb2FkVGFza0lkLG49ZS5zdGF0ZSxyPWUuZGF0YSxpPWUuc3RhdHVzQ29kZSxvPWUucHJvZ3Jlc3MsYT1lLnRvdGFsQnl0ZXNTZW50LHM9ZS50b3RhbEJ5dGVzRXhwZWN0ZWRUb1NlbmQsYz1lLmVyck1zZyx1PXZoW3RdLGw9dS5fY2FsbGJhY2tJZDtzd2l0Y2gobil7Y2FzZSJwcm9ncmVzc1VwZGF0ZSI6dS5fY2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24oZSl7ZSh7cHJvZ3Jlc3M6byx0b3RhbEJ5dGVzU2VudDphLHRvdGFsQnl0ZXNFeHBlY3RlZFRvU2VuZDpzfSl9KTticmVhaztjYXNlInN1Y2Nlc3MiOmZpKGwse2RhdGE6cixzdGF0dXNDb2RlOmksZXJyTXNnOiJyZXF1ZXN0Om9rIn0pO2Nhc2UiZmFpbCI6ZmkobCx7ZXJyTXNnOiJyZXF1ZXN0OmZhaWwgIitjfSk7ZGVmYXVsdDpvZyhmdW5jdGlvbigpe2RlbGV0ZSB2aFt0XX0sMTAwKX19KTt2YXIgZ2gsbWgseWgsX2gsYmg9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsdXBsb2FkRmlsZTpmdW5jdGlvbihlLHQpe3ZhciBuPV9sKCJjcmVhdGVVcGxvYWRUYXNrIixlKS51cGxvYWRUYXNrSWQscj1uZXcgaGgobix0KTtyZXR1cm4gdmhbbl09cn19KTtmdW5jdGlvbiB3aChlKXt0cnl7cmV0dXJuIEpTT04ucGFyc2UoZSl9Y2F0Y2goZSl7fXJldHVybiBlfWZ1bmN0aW9uIGtoKHQpe2lmKCJlbmFibGVkIj09PXQudHlwZSl5aD0hMCxfaD10Lm9mZmxpbmU7ZWxzZSBpZigiY2xpZW50SWQiPT09dC50eXBlKWdoPXQuY2lkLG1oPXQuZXJyTXNnLHhoKGdoLHQuZXJyTXNnKTtlbHNlIGlmKCJwdXNoTXNnIj09PXQudHlwZSlmb3IodmFyIGU9e3R5cGU6InJlY2VpdmUiLGRhdGE6d2godC5tZXNzYWdlKX0sbj0wO248Q2gubGVuZ3RoO24rKyl7aWYoKDAsQ2hbbl0pKGUpLGUuc3RvcHBlZClicmVha31lbHNlImNsaWNrIj09PXQudHlwZSYmQ2guZm9yRWFjaChmdW5jdGlvbihlKXtlKHt0eXBlOiJjbGljayIsZGF0YTp3aCh0Lm1lc3NhZ2UpfSl9KX12YXIgU2g9W107ZnVuY3Rpb24geGgodCxuKXtTaC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UodCxuKX0pLFNoLmxlbmd0aD0wfXZhciBDaD1bXSxUaD0hMSxPaD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxpbnZva2VQdXNoQ2FsbGJhY2s6a2gsZ2V0UHVzaENsaWVudElkOmZ1bmN0aW9uKGUpe1QoZSl8fChlPXt9KTt2YXIgdD1hZShlKSxyPXQuc3VjY2VzcyxpPXQuZmFpbCxvPXQuY29tcGxldGUsYT1DKHIpLHM9QyhpKSxjPUMobyk7X2g/cmcucHVzaC5nZXRDbGllbnRJbmZvQXN5bmMoZnVuY3Rpb24oZSl7dmFyIHQ9e2Vyck1zZzoiZ2V0UHVzaENsaWVudElkOm9rIixjaWQ6ZS5jbGllbnRpZH07YSYmcih0KSxjJiZvKHQpfSxmdW5jdGlvbihlKXtlPXtlcnJNc2c6ImdldFB1c2hDbGllbnRJZDpmYWlsICIrZS5jb2RlKyI6ICIrZS5tZXNzYWdlfSxzJiZpKGUpLGMmJm8oZSl9KTpQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uKCl7dm9pZCAwPT09eWgmJih5aD0hMSxnaD0iIixtaD0idW5pUHVzaCBpcyBub3QgZW5hYmxlZCIpLFNoLnB1c2goZnVuY3Rpb24oZSx0KXt2YXIgbjtlPyhuPXtlcnJNc2c6ImdldFB1c2hDbGllbnRJZDpvayIsY2lkOmV9LGEmJnIobikpOihuPXtlcnJNc2c6ImdldFB1c2hDbGllbnRJZDpmYWlsIisodD8iICIrdDoiIil9LHMmJmkobikpLGMmJm8obil9KSx2b2lkIDAhPT1naCYmeGgoZ2gsbWgpfSl9LG9uUHVzaE1lc3NhZ2U6ZnVuY3Rpb24oZSl7LTE9PT1DaC5pbmRleE9mKGUpJiZDaC5wdXNoKGUpLFRofHwoVGg9ITAscmcucHVzaC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oZSl7a2goe3R5cGU6ImNsaWNrIixtZXNzYWdlOmV9KX0pLHJnLnB1c2guYWRkRXZlbnRMaXN0ZW5lcigicmVjZWl2ZSIsZnVuY3Rpb24oZSl7a2goe3R5cGU6InB1c2hNc2ciLG1lc3NhZ2U6ZX0pfSkpfSxvZmZQdXNoTWVzc2FnZTpmdW5jdGlvbihlKXtpZihlKXt2YXIgdD1DaC5pbmRleE9mKGUpOy0xPHQmJkNoLnNwbGljZSh0LDEpfWVsc2UgQ2gubGVuZ3RoPTB9fSksRWg9e2R1cmF0aW9uOjQwMCx0aW1pbmdGdW5jdGlvbjoibGluZWFyIixkZWxheTowLHRyYW5zZm9ybU9yaWdpbjoiNTAlIDUwJSAwIn0sQWg9ZnVuY3Rpb24oZSl7dGhpcy5hY3Rpb25zPVtdLHRoaXMuY3VycmVudFRyYW5zZm9ybT17fSx0aGlzLmN1cnJlbnRTdGVwQW5pbWF0ZXM9W10sdGhpcy5vcHRpb249T2JqZWN0LmFzc2lnbih7fSxFaCxlKX07QWgucHJvdG90eXBlLl9nZXRPcHRpb249ZnVuY3Rpb24oZSl7dmFyIHQ9e3RyYW5zaXRpb246T2JqZWN0LmFzc2lnbih7fSx0aGlzLm9wdGlvbixlKX07cmV0dXJuIHQudHJhbnNmb3JtT3JpZ2luPXQudHJhbnNpdGlvbi50cmFuc2Zvcm1PcmlnaW4sZGVsZXRlIHQudHJhbnNpdGlvbi50cmFuc2Zvcm1PcmlnaW4sdH0sQWgucHJvdG90eXBlLl9wdXNoQW5pbWF0ZXM9ZnVuY3Rpb24oZSx0KXt0aGlzLmN1cnJlbnRTdGVwQW5pbWF0ZXMucHVzaCh7dHlwZTplLGFyZ3M6dH0pfSxBaC5wcm90b3R5cGUuX2NvbnZlclR5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvW0EtWl0vZyxmdW5jdGlvbihlKXtyZXR1cm4iLSIrZS50b0xvd2VyQ2FzZSgpfSl9LEFoLnByb3RvdHlwZS5fZ2V0VmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlP2UrInB4IjplfSxBaC5wcm90b3R5cGUuZXhwb3J0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5hY3Rpb25zO3JldHVybiB0aGlzLmFjdGlvbnM9W10se2FjdGlvbnM6ZX19LEFoLnByb3RvdHlwZS5zdGVwPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIHRoaXMuY3VycmVudFN0ZXBBbmltYXRlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpeyJzdHlsZSIhPT1lLnR5cGU/dC5jdXJyZW50VHJhbnNmb3JtW2UudHlwZV09ZTp0LmN1cnJlbnRUcmFuc2Zvcm1bZS50eXBlKyIuIitlLmFyZ3NbMF1dPWV9KSx0aGlzLmFjdGlvbnMucHVzaCh7YW5pbWF0ZXM6T2JqZWN0LnZhbHVlcyh0aGlzLmN1cnJlbnRUcmFuc2Zvcm0pLG9wdGlvbjp0aGlzLl9nZXRPcHRpb24oZSl9KSx0aGlzLmN1cnJlbnRTdGVwQW5pbWF0ZXM9W10sdGhpc307dmFyIEloPVsib3BhY2l0eSIsImJhY2tncm91bmRDb2xvciJdLCRoPVsid2lkdGgiLCJoZWlnaHQiLCJsZWZ0IiwicmlnaHQiLCJ0b3AiLCJib3R0b20iXTtbIm1hdHJpeCIsIm1hdHJpeDNkIiwicm90YXRlIiwicm90YXRlM2QiLCJyb3RhdGVYIiwicm90YXRlWSIsInJvdGF0ZVoiLCJzY2FsZSIsInNjYWxlM2QiLCJzY2FsZVgiLCJzY2FsZVkiLCJzY2FsZVoiLCJza2V3Iiwic2tld1giLCJza2V3WSIsInRyYW5zbGF0ZSIsInRyYW5zbGF0ZTNkIiwidHJhbnNsYXRlWCIsInRyYW5zbGF0ZVkiLCJ0cmFuc2xhdGVaIl0uY29uY2F0KEloLCRoKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe0FoLnByb3RvdHlwZVtuXT1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtyZXR1cm4gSWguY29uY2F0KCRoKS5pbmNsdWRlcyhuKT90aGlzLl9wdXNoQW5pbWF0ZXMoInN0eWxlIixbdGhpcy5fY29udmVyVHlwZShuKSwkaC5pbmNsdWRlcyhuKT90aGlzLl9nZXRWYWx1ZShlWzBdKTplWzBdXSk6dGhpcy5fcHVzaEFuaW1hdGVzKG4sZSksdGhpc319KTt2YXIgUGg9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY3JlYXRlQW5pbWF0aW9uOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgQWgoZSl9fSksTWg9WHUoInJlcXVlc3RDb21wb25lbnRPYnNlcnZlciIpLGpoPXt0aHJlc2hvbGRzOlswXSxpbml0aWFsUmF0aW86MCxvYnNlcnZlQWxsOiExfSxMaD1mdW5jdGlvbihlLHQpe3RoaXMucGFnZUlkPWUuJHBhZ2UmJmUuJHBhZ2UuaWQsdGhpcy5jb21wb25lbnQ9ZS5fJGlkfHxlLHRoaXMub3B0aW9ucz1PYmplY3QuYXNzaWduKHt9LGpoLHQpfTtMaC5wcm90b3R5cGUuX21ha2VSb290TWFyZ2luPWZ1bmN0aW9uKHQpe3ZvaWQgMD09PXQmJih0PXt9KSx0aGlzLm9wdGlvbnMucm9vdE1hcmdpbj1bInRvcCIsInJpZ2h0IiwiYm90dG9tIiwibGVmdCJdLm1hcChmdW5jdGlvbihlKXtyZXR1cm4oTnVtYmVyKHRbZV0pfHwwKSsicHgifSkuam9pbigiICIpfSxMaC5wcm90b3R5cGUucmVsYXRpdmVUbz1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm9wdGlvbnMucmVsYXRpdmVUb1NlbGVjdG9yPWUsdGhpcy5fbWFrZVJvb3RNYXJnaW4odCksdGhpc30sTGgucHJvdG90eXBlLnJlbGF0aXZlVG9WaWV3cG9ydD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vcHRpb25zLnJlbGF0aXZlVG9TZWxlY3Rvcj1udWxsLHRoaXMuX21ha2VSb290TWFyZ2luKGUpLHRoaXN9LExoLnByb3RvdHlwZS5vYnNlcnZlPWZ1bmN0aW9uKGUsdCl7ImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0aGlzLm9wdGlvbnMuc2VsZWN0b3I9ZSx0aGlzLnJlcUlkPU1oLnB1c2godCksaWcucHVibGlzaEhhbmRsZXIoInJlcXVlc3RDb21wb25lbnRPYnNlcnZlciIse3JlcUlkOnRoaXMucmVxSWQsY29tcG9uZW50OnRoaXMuY29tcG9uZW50LG9wdGlvbnM6dGhpcy5vcHRpb25zfSwodGhpcy5jb21wb25lbnQsdGhpcy5wYWdlSWQpKSl9LExoLnByb3RvdHlwZS5kaXNjb25uZWN0PWZ1bmN0aW9uKCl7aWcucHVibGlzaEhhbmRsZXIoImRlc3Ryb3lDb21wb25lbnRPYnNlcnZlciIse3JlcUlkOnRoaXMucmVxSWR9LCh0aGlzLmNvbXBvbmVudCx0aGlzLnBhZ2VJZCkpfTt2YXIgTmg9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY3JlYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5faXNWdWV8fCh0PWUsZT1udWxsKSxuZXcgTGgoZXx8d2woImNyZWF0ZUludGVyc2VjdGlvbk9ic2VydmVyIiksdCl9fSksQmg9WHUoInJlcXVlc3RNZWRpYVF1ZXJ5T2JzZXJ2ZXIiKSxEaD1mdW5jdGlvbihlLHQpe3RoaXMucGFnZUlkPWUuJHBhZ2UmJmUuJHBhZ2UuaWQsdGhpcy5jb21wb25lbnQ9ZS5fJGlkfHxlLHRoaXMub3B0aW9ucz10fTtEaC5wcm90b3R5cGUub2JzZXJ2ZT1mdW5jdGlvbihlLHQpeyJmdW5jdGlvbiI9PXR5cGVvZiB0JiYodGhpcy5vcHRpb25zPWUsdGhpcy5yZXFJZD1CaC5wdXNoKHQpLGlnLnB1Ymxpc2hIYW5kbGVyKCJyZXF1ZXN0TWVkaWFRdWVyeU9ic2VydmVyIix7cmVxSWQ6dGhpcy5yZXFJZCxjb21wb25lbnQ6dGhpcy5jb21wb25lbnQsb3B0aW9uczp0aGlzLm9wdGlvbnN9LCh0aGlzLmNvbXBvbmVudCx0aGlzLnBhZ2VJZCkpKX0sRGgucHJvdG90eXBlLmRpc2Nvbm5lY3Q9ZnVuY3Rpb24oKXtpZy5wdWJsaXNoSGFuZGxlcigiZGVzdHJveU1lZGlhUXVlcnlPYnNlcnZlciIse3JlcUlkOnRoaXMucmVxSWR9LCh0aGlzLmNvbXBvbmVudCx0aGlzLnBhZ2VJZCkpfTt2YXIgUmg9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsY3JlYXRlTWVkaWFRdWVyeU9ic2VydmVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuX2lzVnVlfHwodD1lLGU9bnVsbCksbmV3IERoKGV8fHdsKCJjcmVhdGVNZWRpYVF1ZXJ5T2JzZXJ2ZXIiKSx0KX19KSxGaD17Y2FudmFzOl9wLG1hcDpTcCx2aWRlbzpPcCxlZGl0b3I6SXB9O2Z1bmN0aW9uIHpoKGUpe2lmKGUmJmUuY29udGV4dCl7dmFyIHQ9ZS5jb250ZXh0LG49dC5pZCxyPXQubmFtZSxpPXQucGFnZSxvPUZoW3JdO2UuY29udGV4dD1vJiZuZXcgbyhuLGkpfX12YXIgVWg9ZnVuY3Rpb24oZSx0LG4scil7dGhpcy5fc2VsZWN0b3JRdWVyeT1lLHRoaXMuX2NvbXBvbmVudD10LHRoaXMuX3NlbGVjdG9yPW4sdGhpcy5fc2luZ2xlPXJ9O1VoLnByb3RvdHlwZS5ib3VuZGluZ0NsaWVudFJlY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3NlbGVjdG9yUXVlcnkuX3B1c2godGhpcy5fc2VsZWN0b3IsdGhpcy5fY29tcG9uZW50LHRoaXMuX3NpbmdsZSx7aWQ6ITAsZGF0YXNldDohMCxyZWN0OiEwLHNpemU6ITB9LGUpLHRoaXMuX3NlbGVjdG9yUXVlcnl9LFVoLnByb3RvdHlwZS5maWVsZHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fc2VsZWN0b3JRdWVyeS5fcHVzaCh0aGlzLl9zZWxlY3Rvcix0aGlzLl9jb21wb25lbnQsdGhpcy5fc2luZ2xlLGUsdCksdGhpcy5fc2VsZWN0b3JRdWVyeX0sVWgucHJvdG90eXBlLnNjcm9sbE9mZnNldD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fc2VsZWN0b3JRdWVyeS5fcHVzaCh0aGlzLl9zZWxlY3Rvcix0aGlzLl9jb21wb25lbnQsdGhpcy5fc2luZ2xlLHtpZDohMCxkYXRhc2V0OiEwLHNjcm9sbE9mZnNldDohMH0sZSksdGhpcy5fc2VsZWN0b3JRdWVyeX0sVWgucHJvdG90eXBlLmNvbnRleHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3NlbGVjdG9yUXVlcnkuX3B1c2godGhpcy5fc2VsZWN0b3IsdGhpcy5fY29tcG9uZW50LHRoaXMuX3NpbmdsZSx7Y29udGV4dDohMH0sZSksdGhpcy5fc2VsZWN0b3JRdWVyeX07dmFyIFZoPWZ1bmN0aW9uKGUpe3RoaXMuX3BhZ2U9ZSx0aGlzLl9xdWV1ZT1bXSx0aGlzLl9xdWV1ZUNiPVtdLHRoaXMuX25vZGVzUmVmPW51bGx9O1ZoLnByb3RvdHlwZS5leGVjPWZ1bmN0aW9uKHQpe3ZhciBpPXRoaXM7cmV0dXJuIF9sKCJyZXF1ZXN0Q29tcG9uZW50SW5mbyIsdGhpcy5fcGFnZSx0aGlzLl9xdWV1ZSxmdW5jdGlvbihlKXt2YXIgcj1pLl9xdWV1ZUNiO2UuZm9yRWFjaChmdW5jdGlvbihlLHQpe0FycmF5LmlzQXJyYXkoZSk/ZS5mb3JFYWNoKHpoKTp6aChlKTt2YXIgbj1yW3RdO0MobikmJm4uY2FsbChpLGUpfSksQyh0KSYmdC5jYWxsKGksZSl9KSx0aGlzLl9ub2Rlc1JlZn0sVmgucHJvdG90eXBlLmluPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9jb21wb25lbnQ9ZS5fJGlkfHxlLHRoaXN9LFZoLnByb3RvdHlwZS5zZWxlY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX25vZGVzUmVmPW5ldyBVaCh0aGlzLHRoaXMuX2NvbXBvbmVudCxlLCEwKX0sVmgucHJvdG90eXBlLnNlbGVjdEFsbD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fbm9kZXNSZWY9bmV3IFVoKHRoaXMsdGhpcy5fY29tcG9uZW50LGUsITEpfSxWaC5wcm90b3R5cGUuc2VsZWN0Vmlld3BvcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9kZXNSZWY9bmV3IFVoKHRoaXMsMCwiIiwhMCl9LFZoLnByb3RvdHlwZS5fcHVzaD1mdW5jdGlvbihlLHQsbixyLGkpe3RoaXMuX3F1ZXVlLnB1c2goe2NvbXBvbmVudDp0LHNlbGVjdG9yOmUsc2luZ2xlOm4sZmllbGRzOnJ9KSx0aGlzLl9xdWV1ZUNiLnB1c2goaSl9O3ZhciBxaD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxjcmVhdGVTZWxlY3RvclF1ZXJ5OmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgVmgoZXx8d2woImNyZWF0ZVNlbGVjdG9yUXVlcnkiKSl9fSk7aWcuc3Vic2NyaWJlKCJvbkxvYWRGb250RmFjZUNhbGxiYWNrIixmdW5jdGlvbihlKXtmaShlLmNhbGxiYWNrSWQsZS5kYXRhKX0pO3ZhciBXaD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxsb2FkRm9udEZhY2U6ZnVuY3Rpb24oZSx0KXt2YXIgbj1rbCgpO2lmKCFuKXJldHVybntlcnJNc2c6ImxvYWRGb250RmFjZTpmYWlsIG5vdCBmb250IHBhZ2UifTtpZy5wdWJsaXNoSGFuZGxlcigibG9hZEZvbnRGYWNlIix7b3B0aW9uczplLGNhbGxiYWNrSWQ6dH0sbil9fSk7dmFyIEhoPVtdO3ZhciBHaD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxnZXRMb2NhbGU6ZnVuY3Rpb24oKXt2YXIgZT1mZyh7YWxsb3dEZWZhdWx0OiEwfSk7cmV0dXJuIGUmJmUuJHZtP2UuJHZtLiRsb2NhbGU6b3QuZ2V0TG9jYWxlKCl9LHNldExvY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gZmcoKS4kdm0uJGxvY2FsZSE9PXQmJihmZygpLiR2bS4kbG9jYWxlPXQscGcoKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lnLnB1Ymxpc2hIYW5kbGVyKCJzZXRMb2NhbGUiLHQsZS4kcGFnZS5pZCl9KSxuZy5yZXF1aXJlTW9kdWxlKCJwbHVzIikuc2V0TGFuZ3VhZ2UodCksSGguZm9yRWFjaChmdW5jdGlvbihlKXtmaShlLHtsb2NhbGU6dH0pfSksITApfSxvbkxvY2FsZUNoYW5nZTpmdW5jdGlvbihlKXtIaC5wdXNoKGUpfX0pO3ZhciBYaD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxwYWdlU2Nyb2xsVG86ZnVuY3Rpb24oZSl7dmFyIHQ9cGcoKTtyZXR1cm4gdC5sZW5ndGgmJmlnLnB1Ymxpc2hIYW5kbGVyKCJwYWdlU2Nyb2xsVG8iLGUsdFt0Lmxlbmd0aC0xXS4kcGFnZS5pZCkse319fSk7dmFyIFloPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHNldFBhZ2VNZXRhOmZ1bmN0aW9uKGUpe3ZhciB0PXBnKCk7cmV0dXJuIHQubGVuZ3RoJiZpZy5wdWJsaXNoSGFuZGxlcigic2V0UGFnZU1ldGEiLGUsdFt0Lmxlbmd0aC0xXS4kcGFnZS5pZCkse319fSk7ZnVuY3Rpb24gSmgoZSl7cmV0dXJuIF9sKCJzZXRUYWJCYXJCYWRnZSIse2luZGV4OmUuaW5kZXgsdHlwZToibm9uZSJ9KX12YXIgS2g9SmgsWmg9W107YmwoIm9uVGFiQmFyTWlkQnV0dG9uVGFwIixmdW5jdGlvbih0KXtaaC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ZpKGUsdCl9KX0pO3ZhciBRaD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxyZW1vdmVUYWJCYXJCYWRnZTpKaCxzaG93VGFiQmFyUmVkRG90OmZ1bmN0aW9uKGUpe3JldHVybiBfbCgic2V0VGFiQmFyQmFkZ2UiLHtpbmRleDplLmluZGV4LHR5cGU6InJlZERvdCJ9KX0saGlkZVRhYkJhclJlZERvdDpLaCxvblRhYkJhck1pZEJ1dHRvblRhcDpmdW5jdGlvbihlKXtaaC5wdXNoKGUpfX0pLGV2PVtdO2JsKCJvblZpZXdEaWRSZXNpemUiLGZ1bmN0aW9uKHQpe2V2LmZvckVhY2goZnVuY3Rpb24oZSl7ZmkoZSx0KX0pfSk7dmFyIHR2LG52LHJ2PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLG9uV2luZG93UmVzaXplOmZ1bmN0aW9uKGUpe2V2LnB1c2goZSl9LG9mZldpbmRvd1Jlc2l6ZTpmdW5jdGlvbihlKXtldi5zcGxpY2UoZXYuaW5kZXhPZihlKSwxKX19KSxpdj1PYmplY3QuY3JlYXRlKG51bGwpLG92PSh0dj17Ii4vYmFzZS9iYXNlNjQuanMiOldyLCIuL2Jhc2UvY2FuLWktdXNlLmpzIjpHciwiLi9iYXNlL2ludGVyY2VwdG9yLmpzIjpZciwiLi9iYXNlL3VweDJweC5qcyI6ZWksIi4vY29udGV4dC9hdWRpby5qcyI6cmksIi4vY29udGV4dC9iYWNrZ3JvdW5kLWF1ZGlvLmpzIjpBbCwiLi9jb250ZXh0L2NhbnZhcy5qcyI6d3AsIi4vY29udGV4dC9jcmVhdGUtbWFwLWNvbnRleHQuanMiOnhwLCIuL2NvbnRleHQvY3JlYXRlLXZpZGVvLWNvbnRleHQuanMiOkVwLCIuL2NvbnRleHQvZWRpdG9yLmpzIjokcCwiLi9jb250ZXh0L2lubmVyLWF1ZGlvLmpzIjpCcCwiLi9kZXZpY2UvbmV0d29yay5qcyI6UnAsIi4vZGV2aWNlL3RoZW1lLmpzIjpVcCwiLi9rZXlib2FyZC9nZXQtc2VsZWN0ZWQtdGV4dC1yYW5nZS5qcyI6V3AsIi4va2V5Ym9hcmQva2V5Ym9hcmQuanMiOkhwLCIuL21lZGlhL3ByZXZpZXctaW1hZ2UuanMiOkpwLCIuL21lZGlhL3JlY29yZGVyLmpzIjpRcCwiLi9uZXR3b3JrL2Rvd25sb2FkLWZpbGUuanMiOm5oLCIuL25ldHdvcmsvcmVxdWVzdC5qcyI6b2gsIi4vbmV0d29yay9zb2NrZXQuanMiOmRoLCIuL25ldHdvcmsvdXBkYXRlLmpzIjpwaCwiLi9uZXR3b3JrL3VwbG9hZC1maWxlLmpzIjpiaCwiLi9wbHVnaW4vcHVzaC5qcyI6T2gsIi4vdWkvY3JlYXRlLWFuaW1hdGlvbi5qcyI6UGgsIi4vdWkvY3JlYXRlLWludGVyc2VjdGlvbi1vYnNlcnZlci5qcyI6TmgsIi4vdWkvY3JlYXRlLW1lZGlhLXF1ZXJ5LW9ic2VydmVyLmpzIjpSaCwiLi91aS9jcmVhdGUtc2VsZWN0b3ItcXVlcnkuanMiOnFoLCIuL3VpL2xvYWQtZm9udC1mYWNlLmpzIjpXaCwiLi91aS9sb2NhbGUuanMiOkdoLCIuL3VpL3BhZ2Utc2Nyb2xsLXRvLmpzIjpYaCwiLi91aS9zZXQtcGFnZS1tZXRhLmpzIjpZaCwiLi91aS90YWItYmFyLmpzIjpRaCwiLi91aS93aW5kb3cuanMiOnJ2fSwobnY9ZnVuY3Rpb24oZSl7cmV0dXJuIHR2W2VdfHxmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGZpbmQgbW9kdWxlICciK2UrIicuIil9KCl9KS5rZXlzPWZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5rZXlzKHR2KX0sbnYpO292LmtleXMoKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe09iamVjdC5hc3NpZ24oaXYsb3YoZSkpfSk7dmFyIGF2PU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSxpdix5bCksc3Y9T2JqZWN0LmNyZWF0ZShudWxsKTt0LmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIGksbzthdltlXT9zdltlXT0obz1GcihpPWUsYXZbZV0pLG9lKGkpJiZDKG8pP2Z1bmN0aW9uKG4pe3ZvaWQgMD09PW4mJihuPXt9KTtmb3IodmFyIHI9W10sZT1hcmd1bWVudHMubGVuZ3RoLTE7MDxlLS07KXJbZV09YXJndW1lbnRzW2UrMV07cmV0dXJuIEMobi5zdWNjZXNzKXx8QyhuLmZhaWwpfHxDKG4uY29tcGxldGUpP0coaSxZLmFwcGx5KHZvaWQgMCxbaSxvLG5dLmNvbmNhdChyKSkpOkcoaSxuZXcgUHJvbWlzZShmdW5jdGlvbihlLHQpe1kuYXBwbHkodm9pZCAwLFtpLG8sT2JqZWN0LmFzc2lnbih7fSxuLHtzdWNjZXNzOmUsZmFpbDp0fSldLmNvbmNhdChyKSl9KS50aGVuKGZ1bmN0aW9uKGUpe3JldHVybltudWxsLGVdfSkuY2F0Y2goZnVuY3Rpb24oZSl7cmV0dXJuW2VdfSkpfTpvKTpzdltlXT1EcihlKX0pO3ZhciBjdj1PYmplY3QuY3JlYXRlKG51bGwpO2Z1bmN0aW9uIHV2KGUsdCxuKXtyZXR1cm4ib25FcnJvciIhPT10JiZjb25zb2xlLmRlYnVnKCJBcHDvvJoiK3QrIiBoYXZlIGJlZW4gaW52b2tlZCIrKG4/IiAiK0pTT04uc3RyaW5naWZ5KG4pOiIiKSksKGU9ZS4kdm18fGUpLl9fY2FsbF9ob29rJiZlLl9fY2FsbF9ob29rKHQsbil9ZnVuY3Rpb24gbHYoZSx0LG4pe3JldHVybiJvblBhZ2VTY3JvbGwiIT09dCYmY29uc29sZS5kZWJ1ZyhlLiRwYWdlLnJvdXRlKyJbIitlLiRwYWdlLmlkKyJd77yaIit0KyIgaGF2ZSBiZWVuIGludm9rZWQiKSxpPXQsbz1uLChyPShyPWUpLiR2bXx8cikuX19jYWxsX2hvb2smJnIuX19jYWxsX2hvb2soaSxvKTt2YXIgcixpLG99ZnVuY3Rpb24gZHYoZSx0KXt2YXIgbj1lLm5hbWUscj1lLmFyZzsicG9zdE1lc3NhZ2UiPT09bj9mdW5jdGlvbih0LGUpe3Q9cGFyc2VJbnQodCk7dmFyIG49cGcoITApLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuJHBhZ2UuaWQ9PT10fSk7aWYobiYmIW4uJHBhZ2UubWV0YS5pc05WdWUpe3ZhciByPW4uJHZtLl8kdmQuZWxlbWVudHMuZmluZChmdW5jdGlvbihlKXtyZXR1cm4id2ViLXZpZXciPT09ZS50eXBlJiZlLmV2ZW50cy5tZXNzYWdlfSk7aWYoIXIpcmV0dXJuO3IuZGlzcGF0Y2hFdmVudCgibWVzc2FnZSIse3R5cGU6Im1lc3NhZ2UiLHRhcmdldDpPYmplY3QuY3JlYXRlKG51bGwpLGN1cnJlbnRUYXJnZXQ6T2JqZWN0LmNyZWF0ZShudWxsKSx0aW1lU3RhbXA6RGF0ZS5ub3coKSxkZXRhaWw6e2RhdGE6W2VdfX0pfX0odFswXSxyKTpkZ1tuXShyKX1mdW5jdGlvbiBmdihlLHQpe3ZhciBuPXQuZ2V0QXBwLGk9dC5nZXRDdXJyZW50UGFnZXM7ZnVuY3Rpb24gcihlLHQpe3ZhciBuPWkoKTtuLmxlbmd0aCYmbHYobltuLmxlbmd0aC0xXSxlLHQpfWZ1bmN0aW9uIG8odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3IodCxlKX19dmFyIGE9e25hdmlnYXRlVG86ZnVuY3Rpb24oKXtyKCJvbkhpZGUiKX0sbmF2aWdhdGVCYWNrOmZ1bmN0aW9uKCl7cigib25TaG93Iil9fTtlKCJvbkVycm9yIixmdW5jdGlvbihlKXt1dihuKCksIm9uRXJyb3IiLGUpfSksZSgib25QYWdlTm90Rm91bmQiLGZ1bmN0aW9uKGUpe3V2KG4oKSwib25QYWdlTm90Rm91bmQiLGUpfSksZSgib25BcHBSb3V0ZSIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS50eXBlLG49YVt0XTtuJiZuKCl9KSxlKCJvbkFwcEVudGVyQmFja2dyb3VuZCIsZnVuY3Rpb24oKXt1dihuKCksIm9uSGlkZSIpLHIoIm9uSGlkZSIpfSksZSgib25BcHBFbnRlckZvcmVncm91bmQiLGZ1bmN0aW9uKGUpe3V2KG4oKSwib25TaG93IixlKSwwIT09aSgpLmxlbmd0aCYmcigib25TaG93Iil9KSxlKCJvblJlc2l6ZSIsZnVuY3Rpb24oZSx0KXt2YXIgbj1pKCkuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS4kcGFnZS5pZD09PXR9KTtuJiZsdihuLCJvblJlc2l6ZSIsZSl9KSxlKCJvblB1bGxEb3duUmVmcmVzaCIsZnVuY3Rpb24oZSx0KXt2YXIgbixyPWkoKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlLiRwYWdlLmlkPT09dH0pO3ImJihXdT0ibnVtYmVyIj09dHlwZW9mKG49dCk/cmcud2Vidmlldy5nZXRXZWJ2aWV3QnlJZChTdHJpbmcobikpOm4sbHYociwib25QdWxsRG93blJlZnJlc2giKSl9KSxlKCJvblRhYkl0ZW1UYXAiLG8oIm9uVGFiSXRlbVRhcCIpKSxlKCJvbk5hdmlnYXRpb25CYXJCdXR0b25UYXAiLG8oIm9uTmF2aWdhdGlvbkJhckJ1dHRvblRhcCIpKSxlKCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENoYW5nZWQiLG8oIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2hhbmdlZCIpKSxlKCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENvbmZpcm1lZCIsbygib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDb25maXJtZWQiKSksZSgib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDbGlja2VkIixvKCJvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENsaWNrZWQiKSksZSgib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRGb2N1c0NoYW5nZWQiLG8oIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Rm9jdXNDaGFuZ2VkIikpLGUoIm9uV2ViSW52b2tlQXBwU2VydmljZSIsZHYpfXQuZm9yRWFjaChmdW5jdGlvbihlKXthdltlXT9jdltlXT1GcihlLGF2W2VdKTpjdltlXT1EcihlKX0pO3ZhciBwdj0hMTtmdW5jdGlvbiBodihlLHQpe3ZhciBuPSIxIj09PXQ7aWYoIW58fCFwdil7aWYobj8ocHY9ITAsYXMocmcud2Vidmlldy5nZXRMYXVuY2hXZWJ2aWV3KCkpKTpHYXx8YXMocmcud2Vidmlldy5nZXRXZWJ2aWV3QnlJZCh0KSksR2EuaWQhPT10KXJldHVybiBjb25zb2xlLmVycm9yKCJ3ZWJ2aWV3UmVhZHlbIitHYS5pZCsiXVsiK3QrIl0gbm90IG1hdGNoIik7dmFyIHIsaTtpZihHYS5sb2FkZWQ9ITAsaT1kc1tyPXRdLEFycmF5LmlzQXJyYXkoaSkmJmkuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gZSgpfSksZGVsZXRlIGRzW3JdLG4pe3ZhciBvPSIvIit1Zy5lbnRyeVBhZ2VQYXRoLGE9bGcuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXRoPT09b30pO2lmKCFhLm1ldGEuaXNOVnVlKXt2YXIgcz1hLm1ldGEuaXNUYWJCYXI/InN3aXRjaFRhYiI6Im5hdmlnYXRlVG8iO3JldHVybiBkZ1tzXSh7dXJsOm8rKHVnLmVudHJ5UGFnZVF1ZXJ5fHwiIiksb3BlblR5cGU6ImFwcExhdW5jaCJ9KX19fX12YXIgdnY9T2JqZWN0LmNyZWF0ZShudWxsKTtmdW5jdGlvbiBndihlLHQpe3ZhciBuPWUuZGF0YSxyPShlLm9wdGlvbnMsdnZbdF0pO0FycmF5LmlzQXJyYXkocikmJnIuZm9yRWFjaChmdW5jdGlvbihlKXtlKG4pfSl9dmFyIG12LHl2PVtdO2Z1bmN0aW9uIF92KCl7Zm9yKHZhciBlPXl2LnNsaWNlKDApLHQ9eXYubGVuZ3RoPTA7dDxlLmxlbmd0aDt0KyspZVt0XSgpfWZ1bmN0aW9uIGJ2KGUpe3ZhciB0PWUuZGF0YSxuPXQubWV0aG9kLHI9dC5hcmdzO2RnW25dJiZkZ1tuXShyKX1mdW5jdGlvbiB3dihlLHQpe3ZhciBuPWUuY2lkLHI9ZS5tZXRob2QsaT1lLmFyZ3M7dD1wYXJzZUludCh0KTt2YXIgbz1wZyghMCkuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS4kcGFnZS5pZD09PXR9KTtpZighbylyZXR1cm4gY29uc29sZS5lcnJvcigiUGFnZVsiK3QrIl0gbm90IGZvdW5kIik7dmFyIGE9by4kdm0uXyR2ZC5nZXRWbShuKTtpZighYSlyZXR1cm4gY29uc29sZS5lcnJvcigidm1bIituKyJdIG5vdCBmb3VuZCIpO2Fbcl0mJmFbcl0oaSl9ZnVuY3Rpb24ga3YodCl7dD1wYXJzZUludCh0KTt2YXIgZT1wZyghMCkuZmluZChmdW5jdGlvbihlKXtyZXR1cm4gZS4kcGFnZS5pZD09PXR9KTtyZXR1cm4gZXx8Y29uc29sZS5lcnJvcigiUGFnZVsiK3QrIl0gbm90IGZvdW5kIil9ZnVuY3Rpb24gU3YoZSx0KXt2YXIgbj1rdih0KTtuJiYobi5fX3VuaWFwcF93ZWJ2aWV3PSEwKX1mdW5jdGlvbiB4dihlLHQpe3ZhciBuPWt2KHQpO24mJmRlbGV0ZSBuLl9fdW5pYXBwX3dlYnZpZXd9ZnVuY3Rpb24gQ3YoKXt2YXIgZT1pZy5vbixuPWlnLmVtaXQsdD1pZy5zdWJzY3JpYmUscj1pZy5wdWJsaXNoSGFuZGxlcixpPWlnLnN1YnNjcmliZUhhbmRsZXI7aWYoZnVuY3Rpb24oZSx0KXt0LmdldEFwcDt2YXIgaT10LmdldEN1cnJlbnRQYWdlcztmdW5jdGlvbiBuKHIpe3JldHVybiBmdW5jdGlvbihlLHQpe3Q9cGFyc2VJbnQodCk7dmFyIG49aSgpLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuJHBhZ2UuaWQ9PT10fSk7biYmbHYobixyLGUpfX12YXIgbz1YdSgicmVxdWVzdENvbXBvbmVudEluZm8iKSxhPVh1KCJyZXF1ZXN0Q29tcG9uZW50T2JzZXJ2ZXIiKSxzPVh1KCJyZXF1ZXN0TWVkaWFRdWVyeU9ic2VydmVyIik7ZSgib25QYWdlU2Nyb2xsIixuKCJvblBhZ2VTY3JvbGwiKSksZSgib25SZWFjaEJvdHRvbSIsbigib25SZWFjaEJvdHRvbSIpKSxlKCJvblJlcXVlc3RDb21wb25lbnRJbmZvIixmdW5jdGlvbihlKXt2YXIgdD1lLnJlcUlkLG49ZS5yZXMscj1vLnBvcCh0KTtyJiZyKG4pfSksZSgib25SZXF1ZXN0Q29tcG9uZW50T2JzZXJ2ZXIiLGZ1bmN0aW9uKGUpe3ZhciB0PWUucmVxSWQsbj1lLnJlcUVuZCxyPWUucmVzLGk9YS5nZXQodCk7aWYoaSl7aWYobilyZXR1cm4gdm9pZCBhLnBvcCh0KTtpKHIpfX0pLGUoIm9uUmVxdWVzdE1lZGlhUXVlcnlPYnNlcnZlciIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXFJZCxuPWUucmVxRW5kLHI9ZS5yZXMsaT1zLmdldCh0KTtpZihpKXtpZihuKXJldHVybiB2b2lkIHMucG9wKHQpO2kocil9fSl9KHQse2dldEFwcDpmZyxnZXRDdXJyZW50UGFnZXM6cGd9KSxnYSgic3Vic2NyaWJlSGFuZGxlciIsZnVuY3Rpb24oZSl7aShlLnR5cGUsZS5kYXRhLGUucGFnZUlkKX0pLCJuYXRpdmUiIT09dWcucmVuZGVyZXIpe3QoSmEsaHYpLHQoWWEsZ3YpLHQoS2EsX3YpO3ZhciBvPSIvIit1Zy5lbnRyeVBhZ2VQYXRoO2xnLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUucGF0aD09PW99KS5tZXRhLmlzTlZ1ZXx8cihKYSxPYmplY3QuY3JlYXRlKG51bGwpLFsxXSl9ZSgiYXBpLiIrUWEsZnVuY3Rpb24oZSx0KXtuKCJvbldlYkludm9rZUFwcFNlcnZpY2UiLGUsdCl9KSx0KCJvbld4c0ludm9rZUNhbGxNZXRob2QiLHd2KSx0KFphLGJ2KSx0KGVzLFN2KSx0KHRzLHh2KX12YXIgVHY9e2dsb2JhbERhdGE6e319O2Z1bmN0aW9uIE92KGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgdD1lLmFsbG93RGVmYXVsdDtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9ITEpLG12fHwodD9Udjp2b2lkIGNvbnNvbGUuZXJyb3IoIlt3YXJuXTogZ2V0QXBwKCkgZmFpbGVkLiBMZWFybiBtb3JlOiBodHRwczovL3VuaWFwcC5kY2xvdWQuaW8vY29sbG9jYXRpb24vZnJhbWUvd2luZG93P2lkPWdldGFwcC4iKSl9ZnVuY3Rpb24gRXYoKXt2YXIgZT1waSgiZ2xvYmFsRXZlbnQiKSxvPWlnLmVtaXQ7bmcuY29uZmlnLnByZWxvYWQ/cmcua2V5LmFkZEV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLFZhKTpyZy5nbG9iYWxFdmVudC5hZGRFdmVudExpc3RlbmVyKCJzcGxhc2hjbG9zZWQiLGZ1bmN0aW9uKCl7cmcua2V5LmFkZEV2ZW50TGlzdGVuZXIoImJhY2tidXR0b24iLFZhKX0pLHJnLmdsb2JhbEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInBhdXNlIixmdW5jdGlvbigpe28oIm9uQXBwRW50ZXJCYWNrZ3JvdW5kIil9KSxyZy5nbG9iYWxFdmVudC5hZGRFdmVudExpc3RlbmVyKCJyZXN1bWUiLGZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaT1FcygpO2kmJmkudXNlckFjdGlvbiYmKHQ9KGU9aSkucGF0aCxuPWUucXVlcnkscj1lLnJlZmVycmVySW5mbyx4cyhDcyx7cGF0aDp0LHF1ZXJ5Om4/RShuKTp7fSxyZWZlcnJlckluZm86cnx8e319KSksbygib25BcHBFbnRlckZvcmVncm91bmQiLE9zKCkpfSkscmcuZ2xvYmFsRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigibmV0Y2hhbmdlIixmdW5jdGlvbigpe3ZhciBlPXZvW3JnLm5ldHdvcmtpbmZvLmdldEN1cnJlbnRUeXBlKCldfHwidW5rbm93biI7aGkoIm9uTmV0d29ya1N0YXR1c0NoYW5nZSIse2lzQ29ubmVjdGVkOiJub25lIiE9PWUsbmV0d29ya1R5cGU6ZX0pfSk7dmFyIHQ9MDtyZy5nbG9iYWxFdmVudC5hZGRFdmVudExpc3RlbmVyKCJLZXlib2FyZEhlaWdodENoYW5nZSIsZnVuY3Rpb24oZSl7dCE9PWUuaGVpZ2h0JiZoaSgib25LZXlib2FyZEhlaWdodENoYW5nZSIse2hlaWdodDp0PWUuaGVpZ2h0fSl9KSxlLmFkZEV2ZW50TGlzdGVuZXIoInVpc3R5bGVjaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0LG49e3RoZW1lOmUudWlzdHlsZX07dXYobXYsbnQsbiksaGkobnQsbiksaWcucHVibGlzaEhhbmRsZXIobnQsbiwodD1QcygpKVt0Lmxlbmd0aC0xXS4kcGFnZS5pZCksaGkoIm9uVUlTdHlsZUNoYW5nZSIse3N0eWxlOmUudWlzdHlsZX0pLEJzKCl9KSxlLmFkZEV2ZW50TGlzdGVuZXIoInVuaU1QTmF0aXZlRXZlbnQiLGZ1bmN0aW9uKGUpe2hpKCJ1bmlNUE5hdGl2ZUV2ZW50IixlKX0pLHJnLmdsb2JhbEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInBsdXNNZXNzYWdlIixBdikscmcuZ2xvYmFsRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigiV2Vidmlld1Bvc3RNZXNzYWdlIixBdil9ZnVuY3Rpb24gQXYoZSl7ZS5kYXRhJiZlLmRhdGEudHlwZSYmdmEoZS5kYXRhLnR5cGUsZS5kYXRhLmFyZ3N8fHt9KX1mdW5jdGlvbiBJdihlKXt2YXIgdCxuLHIsaSxvPSh0PXtwYXRoOnVnLmVudHJ5UGFnZVBhdGgscXVlcnk6dWcuZW50cnlQYWdlUXVlcnkscmVmZXJyZXJJbmZvOnVnLnJlZmVycmVySW5mb30sbj10LnBhdGgscj10LnF1ZXJ5LGk9dC5yZWZlcnJlckluZm8seHMoVHMse3BhdGg6bixxdWVyeTpyP0Uocik6e30scmVmZXJyZXJJbmZvOml8fHt9LGNoYW5uZWw6cmcucnVudGltZS5jaGFubmVsLGxhdW5jaGVyOnJnLnJ1bnRpbWUubGF1bmNoZXJ9KSx4cyhDcyxUcyksVHMpO3V2KGUsIm9uTGF1bmNoIixvKSx1dihlLCJvblNob3ciLG8pO3ZhciBhPW5nLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRBcHBTdGF0ZTsyPT09KGEmJk51bWJlcihhKCkpKSYmdXYoZSwib25IaWRlIixvKX1mdW5jdGlvbiAkdigpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIDA9PT0oZT1lLnJlcGxhY2UoL1wvJC8sIiIpKS5pbmRleE9mKCJfIik/cmcuaW8uY29udmVydExvY2FsRmlsZVN5c3RlbVVSTChlKTplfXZhciB0PWUobW8pLG49ZSh5bykscj1uLnNwbGl0KCIvIik7ci5wb3AoKSxyPXIuam9pbigiLyIpLHJnLmlvLnJlc29sdmVMb2NhbEZpbGVTeXN0ZW1VUkwocmcuaW8uY29udmVydEFic29sdXRlRmlsZVN5c3RlbShyKSxmdW5jdGlvbihlKXtlLmNyZWF0ZVJlYWRlcigpLnJlYWRFbnRyaWVzKGZ1bmN0aW9uKGUpe2UmJmUubGVuZ3RoJiZlLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5pc0RpcmVjdG9yeSYmMD09PWUuZnVsbFBhdGguaW5kZXhPZih0KSYmMCE9PWUuZnVsbFBhdGguaW5kZXhPZihuKSYmZS5yZW1vdmVSZWN1cnNpdmVseSgpfSl9KX0pfWZ1bmN0aW9uIFB2KGUsdCl7dmFyIG4scixpLG87KG12PWUpLiR2bT1lLG49ZSxpPXQub2JzZXJ2YWJsZSh7bG9jYWxlOnJ8fG90LmdldExvY2FsZSgpfSksbz1bXSxuLiR3YXRjaExvY2FsZT1mdW5jdGlvbihlKXtvLnB1c2goZSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCIkbG9jYWxlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGkubG9jYWxlfSxzZXQ6ZnVuY3Rpb24odCl7aS5sb2NhbGU9dCxvLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGUodCl9KX19KSxPYmplY3QuYXNzaWduKG12LFR2KTt2YXIgYT1lLiRvcHRpb25zLmdsb2JhbERhdGF8fHt9O212Lmdsb2JhbERhdGE9T2JqZWN0LmFzc2lnbihhLG12Lmdsb2JhbERhdGEpLGZ2KGlnLm9uLHtnZXRBcHA6T3YsZ2V0Q3VycmVudFBhZ2VzOlBzfSksSXMoKSxmdW5jdGlvbigpe2lmKHVnLnRhYkJhciYmdWcudGFiQmFyLmxpc3QmJnVnLnRhYkJhci5saXN0Lmxlbmd0aCl7dWcudGFiQmFyLnNlbGVjdGVkPTA7dmFyIGU9dWcudGFiQmFyLmxpc3QuZmluZEluZGV4KGZ1bmN0aW9uKGUpe3JldHVybiBlLnBhZ2VQYXRoPT09dWcuZW50cnlQYWdlUGF0aH0pO3FzLmluaXQodWcudGFiQmFyLGZ1bmN0aW9uKGUsdCl7ZGcuc3dpdGNoVGFiKHt1cmw6Ii8iK2UucGFnZVBhdGgsb3BlblR5cGU6InN3aXRjaFRhYiIsZnJvbToidGFiQmFyIixzdWNjZXNzOmZ1bmN0aW9uKCl7aWcuZW1pdCgib25UYWJJdGVtVGFwIix7aW5kZXg6dCx0ZXh0OmUudGV4dCxwYWdlUGF0aDplLnBhZ2VQYXRofSl9fSl9KSwtMSE9PWUmJjAhPT0odWcudGFiQmFyLnNlbGVjdGVkPWUpJiZxcy5zd2l0Y2hUYWIodWcuZW50cnlQYWdlUGF0aCl9fSgpLEV2KCksQ3YoKSxJdihlKSxvZygkdiwxZTQpLHVnLnJlYWR5PSEwfXZhciBNdj1bInVuaS1hcHAiLCJ1bmktbGF5b3V0IiwidW5pLWNvbnRlbnQiLCJ1bmktbWFpbiIsInVuaS10b3Atd2luZG93IiwidW5pLWxlZnQtd2luZG93IiwidW5pLXJpZ2h0LXdpbmRvdyIsInVuaS10YWJiYXIiLCJ1bmktcGFnZSIsInVuaS1wYWdlLWhlYWQiLCJ1bmktcGFnZS13cmFwcGVyIiwidW5pLXBhZ2UtYm9keSIsInVuaS1wYWdlLXJlZnJlc2giLCJ1bmktYWN0aW9uc2hlZXQiLCJ1bmktbW9kYWwiLCJ1bmktdG9hc3QiLCJ1bmktcmVzaXplLXNlbnNvciIsInVuaS1zaGFkb3ctcm9vdCIsInVuaS1hZCIsInVuaS1hdWRpbyIsInVuaS1idXR0b24iLCJ1bmktY2FtZXJhIiwidW5pLWNhbnZhcyIsInVuaS1jaGVja2JveCIsInVuaS1jaGVja2JveC1ncm91cCIsInVuaS1jb3Zlci1pbWFnZSIsInVuaS1jb3Zlci12aWV3IiwidW5pLWVkaXRvciIsInVuaS1mb3JtIiwidW5pLWZ1bmN0aW9uYWwtcGFnZS1uYXZpZ2F0b3IiLCJ1bmktaWNvbiIsInVuaS1pbWFnZSIsInVuaS1pbnB1dCIsInVuaS1sYWJlbCIsInVuaS1saXZlLXBsYXllciIsInVuaS1saXZlLXB1c2hlciIsInVuaS1tYXAiLCJ1bmktbW92YWJsZS1hcmVhIiwidW5pLW1vdmFibGUtdmlldyIsInVuaS1uYXZpZ2F0b3IiLCJ1bmktb2ZmaWNpYWwtYWNjb3VudCIsInVuaS1vcGVuLWRhdGEiLCJ1bmktcGlja2VyIiwidW5pLXBpY2tlci12aWV3IiwidW5pLXBpY2tlci12aWV3LWNvbHVtbiIsInVuaS1wcm9ncmVzcyIsInVuaS1yYWRpbyIsInVuaS1yYWRpby1ncm91cCIsInVuaS1yaWNoLXRleHQiLCJ1bmktc2Nyb2xsLXZpZXciLCJ1bmktc2xpZGVyIiwidW5pLXN3aXBlciIsInVuaS1zd2lwZXItaXRlbSIsInVuaS1zd2l0Y2giLCJ1bmktdGV4dCIsInVuaS10ZXh0YXJlYSIsInVuaS12aWRlbyIsInVuaS12aWV3IiwidW5pLXdlYi12aWV3Il07ZnVuY3Rpb24ganYoZSl7aWYoMD09PWUuaW5kZXhPZigiIyIpKXt2YXIgdD1lLnN1YnN0cigxKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuISghZS5jb21wb25lbnRJbnN0YW5jZXx8ZS5jb21wb25lbnRJbnN0YW5jZS5pZCE9PXQpfHwhKCFlLmRhdGF8fCFlLmRhdGEuYXR0cnN8fGUuZGF0YS5hdHRycy5pZCE9PXQpfX1pZigwPT09ZS5pbmRleE9mKCIuIikpe3ZhciBuPWUuc3Vic3RyKDEpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5kYXRhJiZmdW5jdGlvbihlLHQsbil7dm9pZCAwPT09dCYmKHQ9IiIpO3ZvaWQgMD09PW4mJihuPSIiKTtpZih0KXJldHVybi0xIT09dC5zcGxpdChMdikuaW5kZXhPZihlKTtpZihuJiYic3RyaW5nIj09dHlwZW9mIG4pcmV0dXJuLTEhPT1uLnNwbGl0KEx2KS5pbmRleE9mKGUpfShuLGUuZGF0YS5zdGF0aWNDbGFzcyxlLmRhdGEuY2xhc3MpfX19dmFyIEx2PS9ccysvO2Z1bmN0aW9uIE52KGUpe2UucHJvdG90eXBlLmNyZWF0ZUludGVyc2VjdGlvbk9ic2VydmVyPWZ1bmN0aW9uKGUpe3JldHVybiBkZy5jcmVhdGVJbnRlcnNlY3Rpb25PYnNlcnZlcih0aGlzLGUpfSxlLnByb3RvdHlwZS5jcmVhdGVNZWRpYVF1ZXJ5T2JzZXJ2ZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIGRnLmNyZWF0ZU1lZGlhUXVlcnlPYnNlcnZlcih0aGlzLGUpfSxlLnByb3RvdHlwZS5zZWxlY3RDb21wb25lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uIGUodCxuKXtpZihuKHQuJHZub2RlfHx0Ll92bm9kZSkpcmV0dXJuIHQ7Zm9yKHZhciByPXQuJGNoaWxkcmVuLGk9MDtpPHIubGVuZ3RoO2krKyl7dmFyIG89ZShyW2ldLG4pO2lmKG8pcmV0dXJuIG99fSh0aGlzLGp2KGUpKX0sZS5wcm90b3R5cGUuc2VsZWN0QWxsQ29tcG9uZW50cz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24gZSh0LG4scil7bih0LiR2bm9kZXx8dC5fdm5vZGUpJiZyLnB1c2godCk7Zm9yKHZhciBpPXQuJGNoaWxkcmVuLG89MDtvPGkubGVuZ3RoO28rKyllKGlbb10sbixyKTtyZXR1cm4gcn0odGhpcyxqdihlKSxbXSl9fWZ1bmN0aW9uIEJ2KGUsdCxuKXtpZighZS4kcGFyZW50KXJldHVybiItMSI7dmFyIHI9ZS4kdm5vZGUsaT1yLmNvbnRleHQsbz1yLmRhdGEuYXR0cnMuX2k7cmV0dXJuIG4mJmsoci5kYXRhLCJrZXkiKSYmKG89bysiOyIrci5kYXRhLmtleSksaSYmaSE9PXQmJmkuXyRpZD9pLl8kaWQrIjsiK3QuXyRpZCsiLCIrbzp0Ll8kaWQrIiwiK299dmFyIER2LFJ2LEZ2PSJhbmRyb2lkIj09PXJnLm9zLm5hbWUudG9Mb3dlckNhc2UoKT8zMDA6NzAwLHp2PTA7ZnVuY3Rpb24gVXYoZSl7cmV0dXJuIGUucHJldmVudERlZmF1bHQ9ZixlLnN0b3BQcm9wYWdhdGlvbj1mLCh0PWUpLm1wPU9iamVjdC5hc3NpZ24oeyJAd2FybmluZyI6Im1wIGlzIGRlcHJlY2F0ZWQifSx0KSx0Ll9wcm9jZXNzZWQ9ITAsdDt2YXIgdH1ibCgib25LZXlib2FyZEhlaWdodENoYW5nZSIsZnVuY3Rpb24oZSl7aWYoMDwoenY9ZS5oZWlnaHQpKXt2YXIgdD1EdjtEdj1udWxsLHQmJnQoKX19KTt2YXIgVnY9e307VnZbMjBdPWZ1bmN0aW9uKGUscyl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0sbj1lWzFdLHI9ZVsyXTtuPVN0cmluZyhuKTt2YXIgaT1zLmVsZW1lbnRzLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2lkPT09dCYmZS5uaWQ9PT1ufSk7aWYoaSl7dmFyIG89ci50eXBlLGE9VXYocik7ImZvY3VzIj09PW98fCJibHVyIj09PW8/ZnVuY3Rpb24oZSx0KXtpZihEdj1udWxsLFJ2JiZhZyhSdiksImZvY3VzIj09PWUudHlwZSl7aWYoISgwPHp2KSlyZXR1cm4gUnY9b2coZnVuY3Rpb24oKXtlLmRldGFpbC5oZWlnaHQ9enYsdChlKX0sRnYpLER2PWZ1bmN0aW9uKCl7YWcoUnYpLGUuZGV0YWlsLmhlaWdodD16dix0KGUpfTtlLmRldGFpbC5oZWlnaHQ9enZ9dChlKX0oYSxmdW5jdGlvbihlKXtpLmRpc3BhdGNoRXZlbnQobyxlKX0pOmkuZGlzcGF0Y2hFdmVudChvLGEpfX0pfTt2YXIgcXY9ZnVuY3Rpb24oZSx0LG4scil7dGhpcy5wYWdlSWQ9ZSx0aGlzLnBhZ2VQYXRoPXQsdGhpcy5wYWdlUXVlcnk9bix0aGlzLnBhZ2VWbT1yLHRoaXMuYmF0Y2hEYXRhPVtdLHRoaXMudm1zPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5pbml0aWFsaXplZD0hMSx0aGlzLnBhZ2VDcmVhdGVEYXRhPSExLHRoaXMuZWxlbWVudHM9W10sdGhpcy5faW5pdCgpfTtmdW5jdGlvbiBXdihlLHQsbil7ZVt0XT1ufWZ1bmN0aW9uIEh2KGUsdCl7dmFyIG4scixpO2ZvcihyIGluIGUpaT1lW3JdLF8odFtyXSxpKXx8V3Yobnx8KG49T2JqZWN0LmNyZWF0ZShudWxsKSkscixpKTtyZXR1cm4gbn1mdW5jdGlvbiBHdihlLHQsbil7dmFyIHIsaSxvO2ZvcihyIGluIGUpaWYoaT1lW3JdLG89dFtyXSl7dmFyIGE9SHYoaSxvKTthJiZXdihuLHIsYSl9ZWxzZSBXdihuLHIsaSk7cmV0dXJuIG59ZnVuY3Rpb24gWHYobixyKXt2YXIgZT1yLiRvcHRpb25zLm1wT3B0aW9ucztyZXR1cm4gZSYmQXJyYXkuaXNBcnJheShlLmV4dGVybmFsQ2xhc3NlcykmJmUuZXh0ZXJuYWxDbGFzc2VzLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9cltnKGUpXTt0JiYobj1uLnJlcGxhY2UoZSx0KSl9KSxufWZ1bmN0aW9uIFl2KGUsdCxuKXtzd2l0Y2godCl7Y2FzZSBsYTpuPVh2KHRoaXMuXyRzdHJpbmdpZnlDbGFzcyhuKSx0aGlzKTticmVhaztjYXNlIGZhOm49WHYobix0aGlzKTticmVhaztjYXNlIGRhOm49dGhpcy5fJG5vcm1hbGl6ZVN0eWxlQmluZGluZyhuKTticmVhaztjYXNlIHNhOmNhc2UgdWE6Y2FzZSBjYTpuPW4/MTowO2JyZWFrO2Nhc2UgYWE6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5fJG5ld0RhdGFbZV18fCh0aGlzLl8kbmV3RGF0YVtlXT17fSkscj1uW2FhXXx8KG5bYWFdPVtdKTtpZih0LmZvckl0ZW1zKXJldHVybiB0LmZpbGwmJmZ1bmN0aW9uKGUsdCl7dmFyIG4scjtpZihBcnJheS5pc0FycmF5KGUpfHwic3RyaW5nIj09dHlwZW9mIGUpZm9yKG49MCxyPWUubGVuZ3RoO248cjtuKyspdFtuXT1uO2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBlKWZvcihuPTA7bjxlO24rKyl0W25dPW47ZWxzZSBpZihkKGUpKWZvcihuPTAscj1PYmplY3Qua2V5cyhlKS5sZW5ndGg7bjxyO24rKyl0W25dPW59KHQuZm9ySXRlbXMsciksdC5mb3JJdGVtczt2YXIgaT10LmZvckluZGV4LG89dC5rZXk7ayh0LCJrZXlJbmRleCIpPygib2JqZWN0IiE9dHlwZW9mIHJbaV0mJihyW2ldPXt9KSxyW2ldWyJrIit0LmtleUluZGV4XT1vKTpyW2ldPW87cmV0dXJuIG99LmNhbGwodGhpcyxlLG4pO2Nhc2UiaXMiOiJmdW5jdGlvbiI9PXR5cGVvZiBuJiYobj1uLm9wdGlvbnMpfXJldHVybih0aGlzLl8kbmV3RGF0YVtlXXx8KHRoaXMuXyRuZXdEYXRhW2VdPXt9KSlbdF09bn1xdi5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24oKXt2YXIgZSx0LG49dGhpcztlPXRoaXMucGFnZUlkLHQ9ZnVuY3Rpb24oZSl7dmFyIHI7cj1uLGUuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lWzBdLG49ZVsxXTtWdlt0XShuLHIpfSl9LCh2dltlXXx8KHZ2W2VdPVtdKSkucHVzaCh0KX0scXYucHJvdG90eXBlLmFkZE1vdW50ZWRWbT1mdW5jdGlvbihlKXtlLl8kbW91bnRlZCgpLHRoaXMuYWRkVmRTeW5jQ2FsbGJhY2soZnVuY3Rpb24oKXtlLl9fY2FsbF9ob29rKCJtb3VudGVkIil9KX0scXYucHJvdG90eXBlLmFkZFVwZGF0ZWRWbT1mdW5jdGlvbihlKXtlLl8kdXBkYXRlZCgpLHRoaXMuYWRkVmRTeW5jQ2FsbGJhY2soZnVuY3Rpb24oKXtlLl9fY2FsbF9ob29rKCJ1cGRhdGVkIil9KX0scXYucHJvdG90eXBlLmFkZFZkU3luY0NhbGxiYWNrPWZ1bmN0aW9uKGUpe0MoZSkmJnl2LnB1c2goZSl9LHF2LnByb3RvdHlwZS5nZXRWbT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy52bXNbZV19LHF2LnByb3RvdHlwZS5hZGRWbT1mdW5jdGlvbihlKXt2YXIgbj1lLl8kaWQsdD10aGlzLnZtc1tuXTtpZih0KXt2YXIgcj1Cdih0LHQuJHBhcmVudCxYYSk7dC5fJGlkPXIsdGhpcy52bXNbcl09dCx0aGlzLmVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jaWQ7ZS5jaWQ9dD09PW4/cjp0fSl9dGhpcy52bXNbbl09ZX0scXYucHJvdG90eXBlLnJlbW92ZVZtPWZ1bmN0aW9uKGUpe3ZhciB0PWUuXyRpZDtlPT09dGhpcy52bXNbdF0mJih0aGlzLmJhdGNoRGF0YT10aGlzLmJhdGNoRGF0YS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV1bMF0hPT10fSksZGVsZXRlIHRoaXMudm1zW3RdKX0scXYucHJvdG90eXBlLmFkZEVsZW1lbnQ9ZnVuY3Rpb24oZSl7LTE9PT10aGlzLmVsZW1lbnRzLmluZGV4T2YoZSkmJnRoaXMuZWxlbWVudHMucHVzaChlKX0scXYucHJvdG90eXBlLnJlbW92ZUVsZW1lbnQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5lbGVtZW50cy5pbmRleE9mKGUpOy0xIT09dCYmdGhpcy5lbGVtZW50cy5zcGxpY2UodCwxKX0scXYucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9W3Qsbl07ciYmaS5wdXNoKHIpLHRoaXMuYmF0Y2hEYXRhLnB1c2goW2UsaV0pfSxxdi5wcm90b3R5cGUuZmluZD1mdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLmJhdGNoRGF0YS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBlWzBdPT09dCYmZVsxXVswXT09PW59KX0scXYucHJvdG90eXBlLnNlbmRQYWdlQ3JlYXRlPWZ1bmN0aW9uKGUpe3RoaXMucGFnZUNyZWF0ZURhdGE9ZSxpZy5wdWJsaXNoSGFuZGxlcihZYSx7ZGF0YTpbWzIsZV1dLG9wdGlvbnM6e3RpbWVzdGFtcDpEYXRlLm5vdygpfX0sW3RoaXMucGFnZUlkXSl9LHF2LnByb3RvdHlwZS5mbHVzaD1mdW5jdGlvbigpe3RoaXMuaW5pdGlhbGl6ZWR8fCh0aGlzLmluaXRpYWxpemVkPSEwLHRoaXMuYmF0Y2hEYXRhLnB1c2goWzEwLFt0aGlzLnBhZ2VJZCx0aGlzLnBhZ2VQYXRoLHRoaXMucGFnZVF1ZXJ5XV0pKTt2YXIgZT10aGlzLmJhdGNoRGF0YS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuISg2PT09ZVswXSYmIU9iamVjdC5rZXlzKGVbMV1bMV0pLmxlbmd0aCl9KTt0aGlzLmJhdGNoRGF0YS5sZW5ndGg9MCxlLmxlbmd0aCYmaWcucHVibGlzaEhhbmRsZXIoWWEse2RhdGE6ZSxvcHRpb25zOnt0aW1lc3RhbXA6RGF0ZS5ub3coKX19LFt0aGlzLnBhZ2VJZF0pfSxxdi5wcm90b3R5cGUucmVzdG9yZVBhZ2VDcmVhdGU9ZnVuY3Rpb24oKXt0aGlzLmJhdGNoRGF0YS5wdXNoKFsyLHRoaXMucGFnZUNyZWF0ZURhdGFdKX0scXYucHJvdG90eXBlLnJlc3RvcmVNb3VudGVkRGF0YT1mdW5jdGlvbigpe3ZhciB0PXRoaXMsbj1mdW5jdGlvbihlKXtlLl8kaWQmJnQucHVzaCg0LGUuXyRpZCxlLl8kZGF0YSx2b2lkIDApLGUuJGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIG4oZSl9KX07bih0aGlzLnBhZ2VWbSl9LHF2LnByb3RvdHlwZS5yZXN0b3JlUGFnZUNyZWF0ZWQ9ZnVuY3Rpb24oKXt0aGlzLmJhdGNoRGF0YS5wdXNoKFsxMCxbdGhpcy5wYWdlSWQsdGhpcy5wYWdlUGF0aCx0aGlzLnBhZ2VRdWVyeV1dKX0scXYucHJvdG90eXBlLnJlc3RvcmU9ZnVuY3Rpb24oKXt0aGlzLmluaXRpYWxpemVkPSEwLHRoaXMuYmF0Y2hEYXRhLmxlbmd0aD0wLHRoaXMucmVzdG9yZVBhZ2VDcmVhdGUoKSx0aGlzLnJlc3RvcmVNb3VudGVkRGF0YSgpLHRoaXMucmVzdG9yZVBhZ2VDcmVhdGVkKCksdGhpcy5mbHVzaCgpfSxxdi5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBlO3RoaXMuYmF0Y2hEYXRhLmxlbmd0aD0wLHRoaXMudm1zPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5pbml0aWFsaXplZD0hMSx0aGlzLmVsZW1lbnRzLmxlbmd0aD0wLGU9dGhpcy5wYWdlSWQsZGVsZXRlIHZ2W2VdfTt2YXIgSnY9WyJvbkxhdW5jaCIsIm9uU2hvdyIsIm9uSGlkZSIsIm9uVW5pTlZpZXdNZXNzYWdlIiwib25QYWdlTm90Rm91bmQiLCJvblRoZW1lQ2hhbmdlIiwib25FcnJvciIsIm9uVW5oYW5kbGVkUmVqZWN0aW9uIiwib25Jbml0Iiwib25Mb2FkIiwib25SZWFkeSIsIm9uVW5sb2FkIiwib25QdWxsRG93blJlZnJlc2giLCJvblJlYWNoQm90dG9tIiwib25UYWJJdGVtVGFwIiwib25BZGRUb0Zhdm9yaXRlcyIsIm9uU2hhcmVUaW1lbGluZSIsIm9uU2hhcmVBcHBNZXNzYWdlIiwib25SZXNpemUiLCJvblBhZ2VTY3JvbGwiLCJvbk5hdmlnYXRpb25CYXJCdXR0b25UYXAiLCJvbkJhY2tQcmVzcyIsIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2hhbmdlZCIsIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q29uZmlybWVkIiwib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDbGlja2VkIiwib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRGb2N1c0NoYW5nZWQiLCJvblBhZ2VTaG93Iiwib25QYWdlSGlkZSIsIm9uUGFnZVJlc2l6ZSIsIm9uU2VydmljZUNyZWF0ZWQiLCJvblNlcnZpY2VBdHRhY2hlZCJdLEt2PVsiZGF0YSIsInByb3BlcnRpZXMiLCJvcHRpb25zIiwicmVsYXRpb25zIl07ZnVuY3Rpb24gWnYoaSxvKXt2YXIgZSx0O0t2LmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQsbixyO3Q9aSwobj1vKVtyPWVdJiZPYmplY3QuYXNzaWduKHRbcl18fCh0W3JdPXt9KSxuW3JdKX0pLG8uZXh0ZXJuYWxDbGFzc2VzJiYoZT1pLmV4dGVybmFsQ2xhc3Nlc3x8KGkuZXh0ZXJuYWxDbGFzc2VzPVtdKSx0PW8uZXh0ZXJuYWxDbGFzc2VzLGUucHVzaC5hcHBseShlLHQpKSxvLnBhdGgmJihpLnBhdGg9by5wYXRoKX1mdW5jdGlvbiBRdihnKXshZnVuY3Rpb24oZSl7dmFyIGk9ZS5leHRlbmQ7ZS5leHRlbmQ9ZnVuY3Rpb24odCl7dmFyIG49KHQ9dHx8e30pLm1ldGhvZHM7biYmT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbihlKXstMSE9PUp2LmluZGV4T2YoZSkmJih0W2VdPW5bZV0sZGVsZXRlIG5bZV0pfSk7dmFyIGU9dC5zZXR1cDtpZihlKXt2YXIgcj0iIjt0cnl7cj1lLnRvU3RyaW5nKCl9Y2F0Y2goZSl7fVsib25QYWdlU2Nyb2xsIiwib25SZWFjaEJvdHRvbSJdLmZvckVhY2goZnVuY3Rpb24oZSl7ci5pbmRleE9mKCJ1bmlBcHAuIitlKSYmIXRbZV0mJih0W2VdPVtmdW5jdGlvbigpe31dKX0pfXJldHVybiBpLmNhbGwodGhpcyx0KX07dmFyIHQ9ZS5jb25maWcub3B0aW9uTWVyZ2VTdHJhdGVnaWVzLG49dC5jcmVhdGVkO0p2LmZvckVhY2goZnVuY3Rpb24oZSl7dFtlXT1ufSksdC5tcE9wdGlvbnM9ZnVuY3Rpb24oZSx0KXtpZighZSlyZXR1cm4gdDt2YXIgbj1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBadihuLGUpLHQmJlp2KG4sdCksbn19KGcpLGcubWl4aW4oe2JlZm9yZUNyZWF0ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLiRvcHRpb25zO2Uuc3RvcmUmJiFnLnByb3RvdHlwZS4kc3RvcmUmJihnLnByb3RvdHlwZS4kc3RvcmU9ZS5zdG9yZSk7dmFyIG4scixpLG8sYSxzLGMsdSxsLGQsZj1lLnd4cztpZihmJiZPYmplY3Qua2V5cyhmKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RbZV09ZltlXX0pLCJwYWdlIj09PXRoaXMubXBUeXBlKXt2YXIgcD1mZygpO3AuJHZtJiZwLiR2bS4kaTE4biYmKHRoaXMuX2kxOG49cC4kdm0uJGkxOG4pLHRoaXMuJHNjb3BlPXRoaXMuJG9wdGlvbnMucGFnZUluc3RhbmNlLGRlbGV0ZSh0aGlzLiRzY29wZS4kdm09dGhpcykuJG9wdGlvbnMucGFnZUluc3RhbmNlO3ZhciBoPXRoaXMuJHNjb3BlLnJvdXRlLHY9dGhpcy4kc2NvcGUuJHBhZ2UuaWQ7dGhpcy5fJHZkLnNlbmRQYWdlQ3JlYXRlKFt2LGgsKG49dGhpcyxyPWgsaT0iLyIrcixvPWxnLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUucGF0aD09PWl9KSxhPU9iamVjdC5hc3NpZ24oe30sdWcud2luZG93LG8ud2luZG93KSxzPSEwPT09YS5kaXNhYmxlU2Nyb2xsPzE6MCxjPWsoYSwib25SZWFjaEJvdHRvbURpc3RhbmNlIik/cGFyc2VJbnQoYS5vblJlYWNoQm90dG9tRGlzdGFuY2UpOmlhLHU9TXUobi4kb3B0aW9ucywib25QYWdlU2Nyb2xsIik/MTowLGw9TXUobi4kb3B0aW9ucywib25SZWFjaEJvdHRvbSIpPzE6MCxkPXFhKCkse3ZlcnNpb246WGEsbG9jYWxlOm5nLnJlcXVpcmVNb2R1bGUoInBsdXMiKS5nZXRMYW5ndWFnZSgpLGRpc2FibGVTY3JvbGw6cyxvblBhZ2VTY3JvbGw6dSxvblBhZ2VSZWFjaEJvdHRvbTpsLG9uUmVhY2hCb3R0b21EaXN0YW5jZTpjLHN0YXR1c2JhckhlaWdodDpkLHdpbmRvd1RvcDphLnRpdGxlTlZpZXcmJiJmbG9hdCI9PT1hLnRpdGxlTlZpZXcudHlwZT9kK3R0OjAsd2luZG93Qm90dG9tOjA8PXFzLmluZGV4T2YocikmJnFzLmNvdmVyP3FzLmhlaWdodDowfSldKX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXsicGFnZSI9PT10aGlzLm1wVHlwZSYmKGx2KHRoaXMuJHNjb3BlLCJvbkxvYWQiLGZ1bmN0aW9uKG4pe3ZvaWQgMD09PW4mJihuPXt9KTt2YXIgcj17fTtyZXR1cm4gT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbih0KXt0cnl7clt0XT1PKG5bdF0pfWNhdGNoKGUpe3JbdF09blt0XX19KSxyfSh0aGlzLiRvcHRpb25zLnBhZ2VRdWVyeSkpLGx2KHRoaXMuJHNjb3BlLCJvblNob3ciKSl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXsicGFnZSI9PT10aGlzLm1wVHlwZSYmbHYodGhpcy4kc2NvcGUsIm9uVW5sb2FkIil9LG1vdW50ZWQ6ZnVuY3Rpb24oKXsicGFnZSI9PT10aGlzLm1wVHlwZSYmKGx2KHRoaXMuJHNjb3BlLCJvblJlYWR5IiksZnVuY3Rpb24oZSl7aWYodWcucHJlbG9hZFJ1bGUpe3ZhciB0PXVnLnByZWxvYWRSdWxlW2VdO3QmJkFycmF5LmlzQXJyYXkodC5wYWNrYWdlcykmJnQucGFja2FnZXMuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybi0xPT09YnMuaW5kZXhPZihlKX0pLmxlbmd0aCYmU3ModC5wYWNrYWdlcyl9fSh0aGlzLiRzY29wZS5yb3V0ZSkpfX0pfXZhciBlZz17aW5zdGFsbDpmdW5jdGlvbihvLGUpe3ZhciB0LG47IWZ1bmN0aW9uKG8pe28uY29uZmlnLmVycm9ySGFuZGxlcj1mdW5jdGlvbihlLHQsbil7dmFyIHI9cChlKTtvLnV0aWwud2FybigiRXJyb3IgaW4gIituKyc6ICInKygiRXJyb3IiPT09cj9lLnRvU3RyaW5nKCk6ZSkrJyInLHQpO3ZhciBpPSJmdW5jdGlvbiI9PXR5cGVvZiBmZyYmZmcoKTtpJiZNdShpLiRvcHRpb25zLCJvbkVycm9yIik/aS5fX2NhbGxfaG9vaygib25FcnJvciIsZSk6Y29uc29sZS5lcnJvcihlKX07dmFyIHQ9by5jb25maWcuaXNSZXNlcnZlZFRhZztvLmNvbmZpZy5pc1Jlc2VydmVkVGFnPWZ1bmN0aW9uKGUpe3JldHVybi0xIT09TXYuaW5kZXhPZihlKXx8dChlKX0sby5jb25maWcuaWdub3JlZEVsZW1lbnRzPU12O3ZhciBuPW8uY29uZmlnLmdldFRhZ05hbWVzcGFjZSxyPVsic3dpdGNoIiwiaW1hZ2UiLCJ0ZXh0IiwidmlldyJdO28uY29uZmlnLmdldFRhZ05hbWVzcGFjZT1mdW5jdGlvbihlKXtyZXR1cm4hfnIuaW5kZXhPZihlKSYmbihlKX19KG8pLCh0PW8pLnByb3RvdHlwZS5fJHM9WXYsdC5wcm90b3R5cGUuXyRzZXREYXRhPWZ1bmN0aW9uKGUsdCl7dGhpcy5fJHZkLnB1c2goZSx0aGlzLl8kaWQsdCw0PT09ZSYmdm9pZCAwKX0sdC5wcm90b3R5cGUuXyRtb3VudGVkPWZ1bmN0aW9uKCl7dGhpcy5fJHZkJiYoR3YodGhpcy5fJG5ld0RhdGEsdGhpcy5fJGRhdGEsdGhpcy5fJHZkTW91bnRlZERhdGEpLHRoaXMuXyRkYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5fJG5ld0RhdGEpKSwicGFnZSI9PT10aGlzLm1wVHlwZSYmdGhpcy5fJHZkLmZsdXNoKCkpfSx0LnByb3RvdHlwZS5fJHVwZGF0ZWQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuXyR2ZCYmKEd2KHRoaXMuXyRuZXdEYXRhLHRoaXMuXyRkYXRhLHRoaXMuXyR2ZFVwZGF0ZWREYXRhKSx0aGlzLl8kZGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuXyRuZXdEYXRhKSksdGhpcy5fJHZkLmluaXRpYWxpemVkJiZvZyhmdW5jdGlvbigpe2UuJG5leHRUaWNrKGUuXyR2ZC5mbHVzaC5iaW5kKGUuXyR2ZCkpfSwwKSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiXyR2ZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRyb290Ll8kdmRvbVN5bmN9fSksdC5taXhpbih7YmVmb3JlQ3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy4kb3B0aW9ucy5tcFR5cGUmJih0aGlzLm1wVHlwZT10aGlzLiRvcHRpb25zLm1wVHlwZSksImFwcCIhPT10aGlzLm1wVHlwZSYmKCJwYWdlIj09PXRoaXMubXBUeXBlJiYodGhpcy5fJHZkb21TeW5jPW5ldyBxdih0aGlzLiRvcHRpb25zLnBhZ2VJZCx0aGlzLiRvcHRpb25zLnBhZ2VQYXRoLHRoaXMuJG9wdGlvbnMucGFnZVF1ZXJ5LHRoaXMpKSx0aGlzLl8kdmQmJih0aGlzLl8kaWQ9QnYodGhpcyx0aGlzLiRwYXJlbnQsWGEpLHRoaXMuXyR2ZC5hZGRWbSh0aGlzKSx0aGlzLl8kdmRNb3VudGVkRGF0YT1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuXyRzZXREYXRhKDQsdGhpcy5fJHZkTW91bnRlZERhdGEpLHRoaXMuXyRkYXRhPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fJG5ld0RhdGE9T2JqZWN0LmNyZWF0ZShudWxsKSkpfSxiZWZvcmVVcGRhdGU6ZnVuY3Rpb24oKXtpZih0aGlzLl8kdmQpe3ZhciBlPXRoaXMuXyR2ZC5maW5kKDQsdGhpcy5fJGlkKTtlPyh0aGlzLl8kZGF0YT1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuXyR2ZFVwZGF0ZWREYXRhPWVbMV1bMV09T2JqZWN0LmNyZWF0ZShudWxsKSk6KHRoaXMuXyR2ZFVwZGF0ZWREYXRhPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fJHNldERhdGEoNix0aGlzLl8kdmRVcGRhdGVkRGF0YSkpLHRoaXMuXyRuZXdEYXRhPU9iamVjdC5jcmVhdGUobnVsbCl9fSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5fJHZkJiYodGhpcy5fJHZkLnJlbW92ZVZtKHRoaXMpLHRoaXMuXyR2ZG9tU3luYyYmdGhpcy5fJHZkb21TeW5jLmRlc3Ryb3koKSl9fSksUXYobyksTnYobyksKG49bykucHJvdG90eXBlLnVuaUlESGFzUm9sZT1mdW5jdGlvbihlKXtyZXR1cm4tMTxjKCkucm9sZS5pbmRleE9mKGUpfSxuLnByb3RvdHlwZS51bmlJREhhc1Blcm1pc3Npb249ZnVuY3Rpb24oZSl7dmFyIHQ9YygpLnBlcm1pc3Npb247cmV0dXJuIHRoaXMudW5pSURIYXNSb2xlKCJhZG1pbiIpfHwtMTx0LmluZGV4T2YoZSl9LG4ucHJvdG90eXBlLnVuaUlEVG9rZW5WYWxpZD1mdW5jdGlvbigpe3JldHVybiBjKCkudG9rZW5FeHBpcmVkPkRhdGUubm93KCl9LG8ucHJvdG90eXBlLmdldE9wZW5lckV2ZW50Q2hhbm5lbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRyb290LiRzY29wZS5ldmVudENoYW5uZWx8fCh0aGlzLiRyb290LiRzY29wZS5ldmVudENoYW5uZWw9bmV3IEl1KSx0aGlzLiRyb290LiRzY29wZS5ldmVudENoYW5uZWx9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLnByb3RvdHlwZSwiJHBhZ2UiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcm9vdC4kc2NvcGUuJHBhZ2V9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG8ucHJvdG90eXBlLCIkbXAiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57cGFnZTp0aGlzLiRyb290LiRzY29wZX19fSk7dmFyIHI9by5wcm90b3R5cGUuJG1vdW50O28ucHJvdG90eXBlLiRtb3VudD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7aWYoImFwcCI9PT10aGlzLm1wVHlwZSl7aWYodGhpcy4kb3B0aW9ucy5yZW5kZXI9ZnVuY3Rpb24oKXt9LG5nLmNvbmZpZy5wcmVsb2FkKXJldHVybiB2b2lkIG5nLnJlcXVpcmVNb2R1bGUoImdsb2JhbEV2ZW50IikuYWRkRXZlbnRMaXN0ZW5lcigibGF1bmNoQXBwIixmdW5jdGlvbigpe3JnLnVwZGF0ZUNvbmZpZ0luZm8mJnJnLnVwZGF0ZUNvbmZpZ0luZm8oKSxQdihuLG8pLHIuY2FsbChuLGUsdCl9KTtQdih0aGlzLG8pfXJldHVybiByLmNhbGwodGhpcyxlLHQpfSxvLnByb3RvdHlwZS4kbmV4dFRpY2s9ZnVuY3Rpb24odCl7dmFyIG49dGhpcyxyPXRoaXMuX3dhdGNoZXIsaT0iZnVuY3Rpb24iPT10eXBlb2YgdCxlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGUpe3ImJm4uXyRxdWV1ZS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiByPT09ZX0pP3l2LnB1c2goaT90LmJpbmQobik6ZSk6by5uZXh0VGljayhpP2Z1bmN0aW9uKCl7cmV0dXJuIHQuY2FsbChuKX06ZSksaSYmZSgpfSk7cmV0dXJuIGk/dm9pZCAwOmV9fX07cmV0dXJuIHN2Ll9fJHd4X189Y3YsaWcucHVibGlzaEhhbmRsZXI9ZnVuY3Rpb24oZSx0LG4pe3Q9SlNPTi5zdHJpbmdpZnkodCksQXJyYXkuaXNBcnJheShuKXx8KG49W25dKTt2YXIgcj0idHlwZW9mIFVuaVZpZXdKU0JyaWRnZSAhPT0gJ3VuZGVmaW5lZCcgJiYgVW5pVmlld0pTQnJpZGdlLnN1YnNjcmliZUhhbmRsZXIoXCIiK2UrJyIsJyt0KyIsX19QQUdFX0lEX18pIjtuLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9cmcud2Vidmlldy5nZXRXZWJ2aWV3QnlJZChTdHJpbmcoZSkpO3QmJnQuZXZhbEpTKHIucmVwbGFjZSgiX19QQUdFX0lEX18iLGUpKX0pfSxpZy5pbnZva2VDYWxsYmFja0hhbmRsZXI9QnIsaWcucmVtb3ZlQ2FsbGJhY2tIYW5kbGVyPWZ1bmN0aW9uKGUpe2RlbGV0ZSBMcltlXX0se19fdnVlUGx1Z2luOmVnLF9fZGVmaW5lUGFnZTpmdW5jdGlvbihlLHQpe3lzW2VdPXR9LF9fcmVnaXN0ZXJBcHA6UHYsX19yZWdpc3RlclBhZ2U6anMsdW5pOnN2LGdldEFwcDpPdixnZXRDdXJyZW50UGFnZXM6UHMsRXZlbnRDaGFubmVsOkl1fX0oKSxkZz10LnVuaSxmZz10LmdldEFwcCxwZz10LmdldEN1cnJlbnRQYWdlcztyZXR1cm4gdH1mdW5jdGlvbiBmYWNpYWxSZWNvZ25pdGlvblZlcmlmeShlKXtlLnJlZ2lzdGVyVVRTSW50ZXJmYWNlLGUuaW5pdFVUU1Byb3h5Q2xhc3M7dmFyIHQ9ZS5pbml0VVRTUHJveHlGdW5jdGlvbixuPWUuaW5pdFVUU1BhY2thZ2VOYW1lLHI9ZS5pbml0VVRTSW5kZXhDbGFzc05hbWUsaT0oZS5pbml0VVRTQ2xhc3NOYW1lLCJEQ2xvdWRVbmlGYWNpYWxSZWNvZ25pdGlvblZlcmlmeSIpLG89IkZhY2lhbFJlY29nbml0aW9uVmVyaWZ5KOWunuS6uuiupOivgSkiLGE9bihpLCEwKSxzPXIoaSwhMCk7ZS5zdGFydEZhY2lhbFJlY29nbml0aW9uVmVyaWZ5PXQoITEse21vZHVsZU5hbWU6byxtb2R1bGVUeXBlOiJidWlsdC1pbiIsZXJyTXNnOiIiLG1haW46ITAscGFja2FnZTphLGNsYXNzOnMsbmFtZToic3RhcnRGYWNpYWxSZWNvZ25pdGlvblZlcmlmeUJ5SnMiLHBhcmFtczpbe25hbWU6ImZhY2VTdHlsZSIsdHlwZToiVVRTU0RLTW9kdWxlc0RDbG91ZFVuaUZhY2lhbFJlY29nbml0aW9uVmVyaWZ5U3RhcnRGYWNpYWxSZWNvZ25pdGlvblZlcmlmeU9wdGlvbnNKU09OT2JqZWN0In1dLHJldHVybjoiIn0pLGUuZ2V0RmFjaWFsUmVjb2duaXRpb25NZXRhSW5mbz10KCExLHttb2R1bGVOYW1lOm8sbW9kdWxlVHlwZToiYnVpbHQtaW4iLGVyck1zZzoiIixtYWluOiEwLHBhY2thZ2U6YSxjbGFzczpzLG5hbWU6ImdldEZhY2lhbFJlY29nbml0aW9uTWV0YUluZm9CeUpzIixwYXJhbXM6W10scmV0dXJuOiIifSl9ZnVuY3Rpb24gaW5pdFVuaUV4dEFwaXMoZSl7ZmFjaWFsUmVjb2duaXRpb25WZXJpZnkoZSl9ZnVuY3Rpb24gaW5pdFNlcnZpY2VKU0JyaWRnZShlKXt2YXIgcj1uZXcgZTtVbmlTZXJ2aWNlSlNCcmlkZ2U9e29uOnIuJG9uLmJpbmQociksb2ZmOnIuJG9mZi5iaW5kKHIpLG9uY2U6ci4kb25jZS5iaW5kKHIpLGVtaXQ6ci4kZW1pdC5iaW5kKHIpLHN1YnNjcmliZTpmdW5jdGlvbihlLHQpe3JldHVybiByLiRvbigidmlldy4iK2UsdCl9LHVuc3Vic2NyaWJlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIuJG9mZigidmlldy4iK2UsdCl9LHN1YnNjcmliZUhhbmRsZXI6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiByLiRlbWl0KCJ2aWV3LiIrZSx0LG4pfX19ZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VDb250ZXh0JDEoZSl7dmFyIHQsbj1lLndlZXgscj1lLlZ1ZSxpPW5ldyBlLldlZXhQbHVzKG4pOyhVbmlTZXJ2aWNlSlNCcmlkZ2V8fGluaXRTZXJ2aWNlSlNCcmlkZ2UociksdW5pKXx8KHQ9Y3JlYXRlU2VydmljZUNvbnRleHQocixuLGksVW5pU2VydmljZUpTQnJpZGdlLGUpLF9fdnVlUGx1Z2luPXQuX192dWVQbHVnaW4sX19kZWZpbmVQYWdlPXQuX19kZWZpbmVQYWdlLF9fcmVnaXN0ZXJBcHA9dC5fX3JlZ2lzdGVyQXBwLF9fcmVnaXN0ZXJQYWdlPXQuX19yZWdpc3RlclBhZ2UsdW5pPXQudW5pLGdldEFwcD10LmdldEFwcCxnZXRDdXJyZW50UGFnZXM9dC5nZXRDdXJyZW50UGFnZXMsaW5pdFVuaUV4dEFwaXModW5pKSk7cmV0dXJue19fdnVlUGx1Z2luOl9fdnVlUGx1Z2luLF9fZGVmaW5lUGFnZTpfX2RlZmluZVBhZ2UsX19yZWdpc3RlckFwcDpfX3JlZ2lzdGVyQXBwLF9fcmVnaXN0ZXJQYWdlOl9fcmVnaXN0ZXJQYWdlLHBsdXM6aSx1bmk6dW5pLHd4OnVuaS5fXyR3eF9ffHx1bmksZ2V0QXBwOmdldEFwcCxnZXRDdXJyZW50UGFnZXM6Z2V0Q3VycmVudFBhZ2VzLFVuaVNlcnZpY2VKU0JyaWRnZTpVbmlTZXJ2aWNlSlNCcmlkZ2V9fWZ1bmN0aW9uIHN0eWxlTWl4aW4oZSl7ZS5wcm90b3R5cGUuX19tZXJnZV9zdHlsZT1mdW5jdGlvbihyLGUpe2lmKHZvaWQgMD09PXImJihyPXt9KSxyKXt2YXIgaT1lfHx0aGlzLiRvcHRpb25zLnN0eWxlO09iamVjdC5rZXlzKHIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9aVtlXTtpZih0KXt2YXIgbj1yW2VdO09iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIGE9bltlXSxzPXRbZV07Im9iamVjdCI9PXR5cGVvZiBhPygib2JqZWN0IiE9dHlwZW9mIHMmJihzPXRbZV09e30pLE9iamVjdC5rZXlzKGEpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ITA7aWYoc1tlXSlmb3IodmFyIG49YVtlXS5zbGljZSgxLDMpLHI9c1tlXS5zbGljZSgxLDMpLGk9MDtpPHIubGVuZ3RoO2krKyl7dmFyIG89bltpXS1yW2ldO2lmKDAhPT1vKXt0PTA8bzticmVha319dCYmKHNbZV09YVtlXSl9KSk6dFtlXT1hfSl9ZWxzZSBpW2VdPU9iamVjdC5hc3NpZ24oe30scltlXSl9KSxlfHwodGhpcy4kb3B0aW9ucy5zdHlsZT1pKX19fWZ1bmN0aW9uIGI2NERlY29kZVVuaWNvZGUoZSl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChhdG9iKGUpLnNwbGl0KCIiKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIiUiKygiMDAiK2UuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikpLnNsaWNlKC0yKX0pLmpvaW4oIiIpKX1mdW5jdGlvbiBnZXRDdXJyZW50VXNlckluZm8oKXt2YXIgZSx0PXRoaXMudW5pLmdldFN0b3JhZ2VTeW5jKCJ1bmlfaWRfdG9rZW4iKXx8IiIsbj10LnNwbGl0KCIuIik7aWYoIXR8fDMhPT1uLmxlbmd0aClyZXR1cm57dWlkOm51bGwscm9sZTpbXSxwZXJtaXNzaW9uOltdLHRva2VuRXhwaXJlZDowfTt0cnl7ZT1KU09OLnBhcnNlKGI2NERlY29kZVVuaWNvZGUoblsxXSkpfWNhdGNoKGUpe3Rocm93IG5ldyBFcnJvcigi6I635Y+W5b2T5YmN55So5oi35L+h5oGv5Ye66ZSZ77yM6K+m57uG6ZSZ6K+v5L+h5oGv5Li677yaIitlLm1lc3NhZ2UpfXJldHVybiBlLnRva2VuRXhwaXJlZD0xZTMqZS5leHAsZGVsZXRlIGUuZXhwLGRlbGV0ZSBlLmlhdCxlfWZ1bmN0aW9uIHVuaUlkTWl4aW4oZSxuKXtlLnByb3RvdHlwZS51bmlJREhhc1JvbGU9ZnVuY3Rpb24oZSl7cmV0dXJuLTE8Z2V0Q3VycmVudFVzZXJJbmZvLmJpbmQobikoKS5yb2xlLmluZGV4T2YoZSl9LGUucHJvdG90eXBlLnVuaUlESGFzUGVybWlzc2lvbj1mdW5jdGlvbihlKXt2YXIgdD1nZXRDdXJyZW50VXNlckluZm8uYmluZChuKSgpLnBlcm1pc3Npb247cmV0dXJuIHRoaXMudW5pSURIYXNSb2xlKCJhZG1pbiIpfHwtMTx0LmluZGV4T2YoZSl9LGUucHJvdG90eXBlLnVuaUlEVG9rZW5WYWxpZD1mdW5jdGlvbigpe3JldHVybiBnZXRDdXJyZW50VXNlckluZm8uYmluZChuKSgpLnRva2VuRXhwaXJlZD5EYXRlLm5vdygpfX1XZWV4SW5zdGFuY2UucHJvdG90eXBlLnJlcXVpcmVNb2R1bGU9ZnVuY3Rpb24obil7dmFyIHI9Z2V0SWQodGhpcyk7aWYociYmdGhpcy5kb2N1bWVudCYmdGhpcy5kb2N1bWVudC50YXNrQ2VudGVyKXtpZihpc1JlZ2lzdGVyZWRNb2R1bGUobikpe3ZhciBlPXt9LHQ9Z2V0TW9kdWxlRGVzY3JpcHRpb24obiksaT1mdW5jdGlvbih0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaGFuZGxlTW9kdWxlR2V0dGVyKG4sdCxtb2R1bGVHZXR0ZXIocixuLHQpKX0sc2V0OmZ1bmN0aW9uKGUpe3JldHVybiBtb2R1bGVTZXR0ZXIocixuLHQsZSl9fSl9O2Zvcih2YXIgbyBpbiB0KWkobyk7cmV0dXJuIGV9Y29uc29sZS53YXJuKCJbSlMgRnJhbWV3b3JrXSDlvZPliY3ov5DooYznmoTln7rluqfkuI3ljIXlkKvljp/nlJ/mj5Lku7ZbIituKyJd77yM6K+35ZyobWFuaWZlc3TkuK3phY3nva7or6Xmj5Lku7bvvIzph43mlrDliLbkvZzljIXmi6zor6Xljp/nlJ/mj5Lku7bnmoToh6rlrprkuYnov5DooYzln7rluqciKX1lbHNlIGNvbnNvbGUuZXJyb3IoJ1tKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byByZXF1aXJlTW9kdWxlKCInK24rJyIpLCBpbnN0YW5jZSAoJytyKyIpIGRvZXNuJ3QgZXhpc3QgYW55bW9yZS4iKX0sV2VleEluc3RhbmNlLnByb3RvdHlwZS5zdXBwb3J0cz1mdW5jdGlvbihlKXtpZigic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIG51bGw7dmFyIHQ9ZS5tYXRjaCgvXkAoXHcrKVwvKFtcdy1dKykoXC4oXHcrKSk/JC9pKTtpZih0KXt2YXIgbj10WzFdLHI9dFsyXSxpPXRbNF07c3dpdGNoKG4pe2Nhc2UibW9kdWxlIjpyZXR1cm4gaXNSZWdpc3RlcmVkTW9kdWxlKHIsaSk7Y2FzZSJjb21wb25lbnQiOnJldHVybiBpc1JlZ2lzdGVyZWRDb21wb25lbnQocil9fXJldHVybiBudWxsfSxXZWV4SW5zdGFuY2UucHJvdG90eXBlLmltcG9ydFNjcmlwdD1mdW5jdGlvbihlLHIpe3ZvaWQgMD09PXImJihyPXt9KTt2YXIgaT1nZXRJZCh0aGlzKSxvPWdldFRhc2tDZW50ZXIoaSk7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQsbil7byYmImZ1bmN0aW9uIj09dHlwZW9mIG8uc2VuZHx8bihuZXcgRXJyb3IoJ1tKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBpbXBvcnQgc2NyaXB0ICInK2UrJyIsIG5vIHRhc2tDZW50ZXIgKCcraSsiKSBtYXRjaGVkLiIpKTt0cnl7by5zZW5kKCJtb2R1bGUiLHttb2R1bGU6InNjcmlwdCIsbWV0aG9kOiJpbXBvcnRTY3JpcHQifSxbZSxyXSx7Y2FsbGJhY2s6W2Z1bmN0aW9uKGUpe3JldHVybiB0KGUpfSxmdW5jdGlvbihlKXtyZXR1cm4gbihlKX1dfSl9Y2F0Y2goZSl7bihlKX19KX07dmFyIGRlY29kZT1kZWNvZGVVUklDb21wb25lbnQ7ZnVuY3Rpb24gcGFyc2VRdWVyeShlKXt2YXIgaT17fTtyZXR1cm4oZT1lLnRyaW0oKS5yZXBsYWNlKC9eKFw/fCN8JikvLCIiKSkmJmUuc3BsaXQoIiYiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSgvXCsvZywiICIpLnNwbGl0KCI9Iiksbj1kZWNvZGUodC5zaGlmdCgpKSxyPTA8dC5sZW5ndGg/ZGVjb2RlKHQuam9pbigiPSIpKTpudWxsO3ZvaWQgMD09PWlbbl0/aVtuXT1yOkFycmF5LmlzQXJyYXkoaVtuXSk/aVtuXS5wdXNoKHIpOmlbbl09W2lbbl0scl19KSxpfXZhciBMSUZFQ1lDTEVfSE9PS1M9WyJvbkxhdW5jaCIsIm9uU2hvdyIsIm9uSGlkZSIsIm9uVW5pTlZpZXdNZXNzYWdlIiwib25QYWdlTm90Rm91bmQiLCJvblRoZW1lQ2hhbmdlIiwib25FcnJvciIsIm9uVW5oYW5kbGVkUmVqZWN0aW9uIiwib25Mb2FkIiwib25SZWFkeSIsIm9uVW5sb2FkIiwib25QdWxsRG93blJlZnJlc2giLCJvblJlYWNoQm90dG9tIiwib25UYWJJdGVtVGFwIiwib25BZGRUb0Zhdm9yaXRlcyIsIm9uU2hhcmVUaW1lbGluZSIsIm9uU2hhcmVBcHBNZXNzYWdlIiwib25SZXNpemUiLCJvblBhZ2VTY3JvbGwiLCJvbk5hdmlnYXRpb25CYXJCdXR0b25UYXAiLCJvbkJhY2tQcmVzcyIsIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2hhbmdlZCIsIm9uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q29uZmlybWVkIiwib25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDbGlja2VkIiwib25QYWdlU2hvdyIsIm9uUGFnZUhpZGUiLCJvblBhZ2VSZXNpemUiXTtmdW5jdGlvbiBwYXJzZVF1ZXJ5QnlCdW5kbGVVcmwoZSl7dmFyIHQ9e307aWYoZSYmInN0cmluZyI9PXR5cGVvZiBlKXt2YXIgbj1lLmluZGV4T2YoIj8iKTtpZigtMSE9PW4pe3ZhciByPWUuc3Vic3RyKG4rMSk7Ii5qcyI9PT1yLnN1YnN0cigtMykmJihyPXIuc3Vic3RyKDAsci5sZW5ndGgtMykpLHQ9cGFyc2VRdWVyeShyKX19cmV0dXJuIHR9dmFyIElOU1RBTkNFX0lEPSJbW0N1cnJlbnRJbnN0YW5jZUlkXV0iO2Z1bmN0aW9uIGdldElkJDEoZSl7cmV0dXJuIGVbSU5TVEFOQ0VfSURdfWZ1bmN0aW9uIGluaXRTY29wZSh0LGUpe3ZhciBuPWUuZ2V0Q3VycmVudFBhZ2VzKCkscj1uW24ubGVuZ3RoLTFdO2lmKHRoaXMuJG9wdGlvbnMucm91dGU9PT1yLnJvdXRlKXIuJHZtPXRoaXMscltJTlNUQU5DRV9JRF09Z2V0SWQkMSh0KTtlbHNlIGlmKHQuY29uZmlnLm9sZEluc3RhbmNlSWQpe3ZhciBpPWUuZ2V0Q3VycmVudFBhZ2VzKCEwKS5maW5kKGZ1bmN0aW9uKGUpe3JldHVybiBnZXRJZCQxKGUpPT09dC5jb25maWcub2xkSW5zdGFuY2VJZH0pO2kmJihpLiR2bT10aGlzKX10aGlzLiRzY29wZT1yfWZ1bmN0aW9uIGxpZmVjeWNsZU1peGluKHIsaSxvKXt2YXIgdD1yLmNvbmZpZy5vcHRpb25NZXJnZVN0cmF0ZWdpZXMsbj10LmNyZWF0ZWQ7TElGRUNZQ0xFX0hPT0tTLmZvckVhY2goZnVuY3Rpb24oZSl7dFtlXT1ufSk7dmFyIGE9cGFyc2VRdWVyeUJ5QnVuZGxlVXJsKGkuY29uZmlnLmJ1bmRsZVVybCk7ci5taXhpbih7YmVmb3JlQ3JlYXRlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl8kd2VleD1pO3RyeXt2YXIgdD1vLmdldEFwcCh7YWxsb3dEZWZhdWx0OiEwfSk7dCYmIXRoaXMuJHN0b3JlJiYodC4kc3RvcmV8fHQuJHZtJiZ0LiR2bS4kc3RvcmUpJiYodGhpcy4kc3RvcmU9dC4kc3RvcmV8fHQuJHZtLiRzdG9yZSl9Y2F0Y2goZSl7fXN3aXRjaCh0aGlzLiRvcHRpb25zLm1wVHlwZSl7Y2FzZSJhcHAiOmlmKHRoaXMubXBUeXBlPSJhcHAiLHRoaXMuJG9wdGlvbnMucmVuZGVyPWZ1bmN0aW9uKCl7fSxvLndlZXguY29uZmlnLnByZWxvYWQpby53ZWV4LnJlcXVpcmVNb2R1bGUoImdsb2JhbEV2ZW50IikuYWRkRXZlbnRMaXN0ZW5lcigibGF1bmNoQXBwIixmdW5jdGlvbigpe28ucGx1cy51cGRhdGVDb25maWdJbmZvJiZvLnBsdXMudXBkYXRlQ29uZmlnSW5mbygpLG8uX19yZWdpc3RlckFwcChlLHIpfSk7ZWxzZSBvLl9fcmVnaXN0ZXJBcHAodGhpcyxyKTticmVhaztjYXNlInBhZ2UiOnRoaXMubXBUeXBlPSJwYWdlIjt2YXIgbj1vLnBsdXMud2Vidmlldy5jdXJyZW50V2VidmlldygpO24uX19wcmVsb2FkX18/KG4uYWRkRXZlbnRMaXN0ZW5lcigic2hvdyIsZnVuY3Rpb24oKXshZS4kc2NvcGUmJmluaXRTY29wZS5jYWxsKGUsaSxvKSxlLl9fY2FsbF9ob29rKCJvblNob3ciKX0pLG4uYWRkRXZlbnRMaXN0ZW5lcigiaGlkZSIsZnVuY3Rpb24oKXtlLl9fY2FsbF9ob29rKCJvbkhpZGUiKX0pKTooMD09PW8uZ2V0Q3VycmVudFBhZ2VzKCkubGVuZ3RoJiZvLl9fcmVnaXN0ZXJQYWdlKHt1cmw6aS5jb25maWcuYnVuZGxlVXJsLHBhdGg6Ii8iK3RoaXMuJG9wdGlvbnMucm91dGUsd2VidmlldzpufSksaW5pdFNjb3BlLmNhbGwodGhpcyxpLG8pKX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXtpZigicGFnZSI9PT10aGlzLiRvcHRpb25zLm1wVHlwZSl7dmFyIGU9by5wbHVzLndlYnZpZXcuY3VycmVudFdlYnZpZXcoKTtpZihlLl9fcHJlbG9hZF9fKXt2YXIgdD1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksYSk7aWYoZS5fX3F1ZXJ5X18pdHJ5e09iamVjdC5hc3NpZ24odCxKU09OLnBhcnNlKGUuX19xdWVyeV9fKSl9Y2F0Y2goZSl7fXRoaXMuX19jYWxsX2hvb2soIm9uTG9hZCIsdCl9ZWxzZXt2YXIgbj1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobnVsbCksYSkscj1vLmdldEN1cnJlbnRQYWdlcygpO09iamVjdC5hc3NpZ24obixyW3IubGVuZ3RoLTFdLm9wdGlvbnMpLHRoaXMuX19jYWxsX2hvb2soIm9uTG9hZCIsbiksdGhpcy5fX2NhbGxfaG9vaygib25TaG93Iil9fX0sbW91bnRlZDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7InBhZ2UiPT09dGhpcy4kb3B0aW9ucy5tcFR5cGUmJih0aGlzLl9fY2FsbF9ob29rKCJvblJlYWR5IiksdGhpcy4kb3B0aW9ucy5vblBhZ2VTY3JvbGwmJnRoaXMuJGVsLmFkZEV2ZW50KCJzY3JvbGwiLGZ1bmN0aW9uKGUpe2Uuc2Nyb2xsVG9wPWUuZGV0YWlsLnNjcm9sbFRvcCx0Ll9fY2FsbF9ob29rKCJvblBhZ2VTY3JvbGwiLGUpfSksdGhpcy4kb3B0aW9ucy5vblJlYWNoQm90dG9tJiZ0aGlzLiRlbC5hZGRFdmVudCgic2Nyb2xsdG9sb3dlciIsZnVuY3Rpb24oZSl7dC5fX2NhbGxfaG9vaygib25SZWFjaEJvdHRvbSIsZSl9KSl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXsicGFnZSI9PT10aGlzLiRvcHRpb25zLm1wVHlwZSYmdGhpcy5fX2NhbGxfaG9vaygib25VbmxvYWQiKX19KX1mdW5jdGlvbiBicm9hZGNhc3QoZSx0KXtmb3IodmFyIG49W10scj1hcmd1bWVudHMubGVuZ3RoLTI7MDxyLS07KW5bcl09YXJndW1lbnRzW3IrMl07Zm9yKHZhciBpPXRoaXMuJGNoaWxkcmVuLG89aS5sZW5ndGgsYT0wO2E8bzthKyspe3ZhciBzPWlbYV0sYz1zLiRvcHRpb25zLm5hbWU7aWYofmUuaW5kZXhPZihjKSlyZXR1cm4gcy4kZW1pdC5hcHBseShzLFt0XS5jb25jYXQobikpLCExO2lmKCExPT09YnJvYWRjYXN0LmFwcGx5KHMsW2UsdF0uY29uY2F0KFtuXSkpKXJldHVybiExfX12YXIgZW1pdHRlcj17bWV0aG9kczp7JHRyaWdnZXI6ZnVuY3Rpb24oZSx0KXt0aGlzLiRlbWl0KGUscHJvY2Vzc0N1c3RvbUV2ZW50LmNhbGwodGhpcyxlLHQsdGhpcy4kZWwpKX0sJGRpc3BhdGNoOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPVtdLHI9YXJndW1lbnRzLmxlbmd0aC0yOzA8ci0tOyluW3JdPWFyZ3VtZW50c1tyKzJdOyJzdHJpbmciPT10eXBlb2YgZSYmKGU9W2VdKTtmb3IodmFyIGk9dGhpcy4kcGFyZW50fHx0aGlzLiRyb290LG89aS4kb3B0aW9ucy5uYW1lO2kmJighb3x8IX5lLmluZGV4T2YobykpOykoaT1pLiRwYXJlbnQpJiYobz1pLiRvcHRpb25zLm5hbWUpO2kmJmkuJGVtaXQuYXBwbHkoaSxbdF0uY29uY2F0KG4pKX0sJGJyb2FkY2FzdDpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bXSxyPWFyZ3VtZW50cy5sZW5ndGgtMjswPHItLTspbltyXT1hcmd1bWVudHNbcisyXTsic3RyaW5nIj09dHlwZW9mIGUmJihlPVtlXSksYnJvYWRjYXN0LmFwcGx5KHRoaXMsW2UsdF0uY29uY2F0KG4pKX19fSxsaXN0ZW5lcnM9e3Byb3BzOntpZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt2YXIgbj10aGlzO3RoaXMuX2FkZExpc3RlbmVycyh0aGlzLmlkKSx0aGlzLiR3YXRjaCgiaWQiLGZ1bmN0aW9uKGUsdCl7bi5fcmVtb3ZlTGlzdGVuZXJzKHQsITApLG4uX2FkZExpc3RlbmVycyhlLCEwKX0pfSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5fcmVtb3ZlTGlzdGVuZXJzKHRoaXMuaWQpfSxtZXRob2RzOntfYWRkTGlzdGVuZXJzOmZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcztpZighbnx8dCl7dmFyIGk9dGhpcy4kb3B0aW9ucy5saXN0ZW5lcnM7Ik9iamVjdCI9PT10eXBvZihpKSYmT2JqZWN0LmtleXMoaSkuZm9yRWFjaChmdW5jdGlvbihlKXtuPzAhPT1lLmluZGV4T2YoIkAiKSYmMCE9PWUuaW5kZXhPZigidW5pLSIpJiZyLl8kYnVzLiRvbigidW5pLSIrZSsiLSIrdCxyW2lbZV1dKTowPT09ZS5pbmRleE9mKCJAIik/ci4kb24oInVuaS0iK2Uuc3Vic3RyKDEpLHJbaVtlXV0pOjA9PT1lLmluZGV4T2YoInVuaS0iKT9yLl8kYnVzLiRvbihlLHJbaVtlXV0pOnQmJnIuXyRidXMuJG9uKCJ1bmktIitlKyItIityLiRwYWdlLmlkKyItIit0LHJbaVtlXV0pfSl9fSxfcmVtb3ZlTGlzdGVuZXJzOmZ1bmN0aW9uKHQsbil7dmFyIHI9dGhpcztpZighbnx8dCl7dmFyIGk9dGhpcy4kb3B0aW9ucy5saXN0ZW5lcnM7Ik9iamVjdCI9PT10eXBvZihpKSYmT2JqZWN0LmtleXMoaSkuZm9yRWFjaChmdW5jdGlvbihlKXtuPzAhPT1lLmluZGV4T2YoIkAiKSYmMCE9PWUuaW5kZXhPZigidW5pLSIpJiZyLl8kYnVzLiRvZmYoInVuaS0iK2UrIi0iK3QscltpW2VdXSk6MD09PWUuaW5kZXhPZigiQCIpP3IuJG9mZigidW5pLSIrZS5zdWJzdHIoMSkscltpW2VdXSk6MD09PWUuaW5kZXhPZigidW5pLSIpP3IuXyRidXMuJG9mZihlLHJbaVtlXV0pOnQmJnIuXyRidXMuJG9mZigidW5pLSIrZSsiLSIrci4kcGFnZS5pZCsiLSIrdCxyW2lbZV1dKX0pfX19fSxfYWREYXRhQ2FjaGU9e307ZnVuY3Rpb24gZ2V0QWREYXRhKGUsdCxuLHIsaSxvKXt2YXIgYT10KyItIituLHM9X2FkRGF0YUNhY2hlW2FdO3MmJjA8cy5sZW5ndGg/aShzLnNwbGljZSgwLDEpWzBdKTplLmFkLmdldEFkcyh7YWRwaWQ6dCxjb3VudDo1LHdpZHRoOm4sZXh0OntjaGFubmVsOnJ9fSxmdW5jdGlvbihlKXt2YXIgdD1lLmFkcztpKHQuc3BsaWNlKDAsMSlbMF0pLF9hZERhdGFDYWNoZVthXT1zP3MuY29uY2F0KHQpOnR9LGZ1bmN0aW9uKGUpe28oe2VyckNvZGU6ZS5jb2RlLGVyck1zZzplLm1lc3NhZ2V9KX0pfWZ1bmN0aW9uIGdldEFkKG4scil7cmV0dXJue25hbWU6IkFkIixpc1Jlc2VydmVkOiEwLG1peGluczpbZW1pdHRlcixsaXN0ZW5lcnNdLHByb3BzOnthZHBpZDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoiIn0sZGF0YTp7dHlwZTpPYmplY3R9LHdpZHRoOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxjaGFubmVsOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybnthZFdpZHRoOjAsYWREYXRhOnt9fX0sbW91bnRlZDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYodGhpcy5kYXRhKXRoaXMuX2ZpbGxEYXRhKHRoaXMuZGF0YSk7ZWxzZSBpZih0aGlzLmFkcGlkKXtpZih0aGlzLndpZHRoJiYwPHRoaXMud2lkdGgubGVuZ3RoKXt2YXIgZT1wYXJzZUZsb2F0KHRoaXMud2lkdGgpO3JldHVybi9cZCtbdXJdcHgkL2kudGVzdCh0aGlzLndpZHRoKT90aGlzLmFkV2lkdGg9dXB4MnB4KGUpOnRoaXMuYWRXaWR0aD1lLHZvaWQgdGhpcy5fbG9hZERhdGEoKX1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5yZXF1aXJlTW9kdWxlKCJkb20iKS5nZXRDb21wb25lbnRSZWN0KHQuJHJlZnMuYWQsZnVuY3Rpb24oZSl7dC5hZFdpZHRoPTA9PT1lLnNpemUud2lkdGg/LTE6ZS5zaXplLndpZHRoLHQuX2xvYWREYXRhKCl9KX0sNTApfX0sd2F0Y2g6e2FkcGlkOmZ1bmN0aW9uKGUpe2UmJnRoaXMuX2xvYWREYXRhKGUpfSxkYXRhOmZ1bmN0aW9uKGUpe2UmJnRoaXMuX2ZpbGxEYXRhKGUpfX0sbWV0aG9kczp7X29uZG93bmxvYWRjaGFuZ2U6ZnVuY3Rpb24oZSl7dGhpcy4kdHJpZ2dlcigiZG93bmxvYWRjaGFuZ2UiLGUuZGV0YWlsKX0sX29uZGlzbGlrZTpmdW5jdGlvbihlKXt0aGlzLiR0cmlnZ2VyKCJjbG9zZSIsZS5kZXRhaWwpfSxfbG9hZERhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztnZXRBZERhdGEoci5wbHVzfHxuZXcgci5XZWV4UGx1cyhyLndlZXgpLGV8fHRoaXMuYWRwaWQsdGhpcy5hZFdpZHRoLHRoaXMuY2hhbm5lbCxmdW5jdGlvbihlKXt0Ll9maWxsRGF0YShlKX0sZnVuY3Rpb24oZSl7dC4kdHJpZ2dlcigiZXJyb3IiLGUpfSl9LF9maWxsRGF0YTpmdW5jdGlvbihlKXt0aGlzLmFkRGF0YT1lLHRoaXMuJHRyaWdnZXIoImxvYWQiLHt9KX19LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD17fSxuPXRoaXMuJGxpc3RlbmVycztyZXR1cm4gbi5kb3dubG9hZGNoYW5nZSYmKHQuZG93bmxvYWRjaGFuZ2U9dGhpcy5fb25kb3dubG9hZGNoYW5nZSksbi5jbG9zZSYmKHQuZGlzbGlrZT10aGlzLl9vbmRpc2xpa2UpLGUoInUtYWQiLHRoaXMuX2coe3JlZjoiYWQiLGF0dHJzOntkYXRhOnRoaXMuYWREYXRhLHJlbmRlcmluZzohMH0sb246dH0sbiksW10sMSl9fX1mdW5jdGlvbiBpbml0JDMoZSx0LG4pe2UuY29tcG9uZW50KCJhZCIsZ2V0QWQodCxuKSl9dmFyIF9hZERhdGFDYWNoZSQxPXt9O2Z1bmN0aW9uIGdldEFkRGF0YSQxKGUsdCxuLHIsaSxvKXt2YXIgYT10KyItIituLHM9X2FkRGF0YUNhY2hlJDFbYV07cyYmMDxzLmxlbmd0aD9pKHMuc3BsaWNlKDAsMSlbMF0pOmUuYWQuZ2V0RHJhd0Fkcyh7YWRwaWQ6dCxjb3VudDozLHdpZHRoOm4saGVpZ2h0OnJ9LGZ1bmN0aW9uKGUpe3ZhciB0PWUuYWRzO2kodC5zcGxpY2UoMCwxKVswXSksX2FkRGF0YUNhY2hlJDFbYV09cz9zLmNvbmNhdCh0KTp0fSxmdW5jdGlvbihlKXtvKHtlcnJDb2RlOmUuY29kZSxlcnJNc2c6ZS5tZXNzYWdlfSl9KX1mdW5jdGlvbiBnZXRBZCQxKGUsbil7cmV0dXJue25hbWU6IkFkRHJhdyIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXIsbGlzdGVuZXJzXSxwcm9wczp7YWRwaWQ6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6IiJ9LGRhdGE6e3R5cGU6T2JqZWN0fSx3aWR0aDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57YWRXaWR0aDowLGFkSGVpZ2h0OjAsYWREYXRhOnt9fX0sbW91bnRlZDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5kYXRhP3RoaXMuX2ZpbGxEYXRhKHRoaXMuZGF0YSk6dGhpcy5hZHBpZCYmc2V0VGltZW91dChmdW5jdGlvbigpe2UucmVxdWlyZU1vZHVsZSgiZG9tIikuZ2V0Q29tcG9uZW50UmVjdCh0LiRyZWZzLmFkLGZ1bmN0aW9uKGUpe3QuYWRXaWR0aD0wPT09ZS5zaXplLndpZHRoPy0xOmUuc2l6ZS53aWR0aCx0LmFkSGVpZ2h0PTA9PT1lLnNpemUuaGVpZ2h0Py0xOmUuc2l6ZS5oZWlnaHQsdC5fbG9hZERhdGEoKX0pfSwxMDApfSx3YXRjaDp7YWRwaWQ6ZnVuY3Rpb24oZSl7ZSYmdGhpcy5fbG9hZERhdGEoZSl9LGRhdGE6ZnVuY3Rpb24oZSl7ZSYmdGhpcy5fZmlsbERhdGEoZSl9fSxiZWZvcmVEZXN0cm95OmZ1bmN0aW9uKCl7KG4ucGx1c3x8bmV3IG4uV2VleFBsdXMobi53ZWV4KSkuYWQucmVsZWFzZUFkRGF0YSh0aGlzLmFkRGF0YSl9LG1ldGhvZHM6e19vbmRpc2xpa2U6ZnVuY3Rpb24oZSl7dGhpcy4kdHJpZ2dlcigiY2xvc2UiLGUuZGV0YWlsKX0sX2xvYWREYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7Z2V0QWREYXRhJDEobi5wbHVzfHxuZXcgbi5XZWV4UGx1cyhuLndlZXgpLGV8fHRoaXMuYWRwaWQsdGhpcy5hZFdpZHRoLHRoaXMuYWRIZWlnaHQsZnVuY3Rpb24oZSl7dC5fZmlsbERhdGEoZSl9LGZ1bmN0aW9uKGUpe3QuJHRyaWdnZXIoImVycm9yIixlKX0pfSxfZmlsbERhdGE6ZnVuY3Rpb24oZSl7dGhpcy5hZERhdGE9ZSx0aGlzLiR0cmlnZ2VyKCJsb2FkIix7fSl9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9e30sbj10aGlzLiRsaXN0ZW5lcnM7cmV0dXJuIG4uY2xvc2UmJih0LmRpc2xpa2U9dGhpcy5fb25kaXNsaWtlKSxlKCJ1LWFkLWRyYXciLHRoaXMuX2coe3JlZjoiYWQiLGF0dHJzOntkYXRhOnRoaXMuYWREYXRhLHJlbmRlcmluZzohMH0sb246dH0sbiksW10sMSl9fX1mdW5jdGlvbiBpbml0JDQoZSx0LG4pe2UuY29tcG9uZW50KCJhZC1kcmF3IixnZXRBZCQxKHQsbikpfXZhciBPUEVOX1RZUEVTPVsiYWdyZWVQcml2YWN5IiwiZGlzYWdyZWVQcml2YWN5Il07ZnVuY3Rpb24gZ2V0QnV0dG9uKGUscil7cmV0dXJue25hbWU6IkJ1dHRvbiIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXIsbGlzdGVuZXJzXSxwcm9wczp7aG92ZXJDbGFzczp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiYnV0dG9uLWhvdmVyIn0sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxpZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sdHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiZGVmYXVsdCJ9LHNpemU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6ImRlZmF1bHQifSxwbGFpbjp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGxvYWRpbmc6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxob3ZlclN0b3BQcm9wYWdhdGlvbjp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9LGhvdmVyU3RhcnRUaW1lOnt0eXBlOk51bWJlcixkZWZhdWx0OjIwfSxob3ZlclN0YXlUaW1lOnt0eXBlOk51bWJlcixkZWZhdWx0OjcwfSxvcGVuVHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sZm9ybVR5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiIsdmFsaWRhdG9yOmZ1bmN0aW9uKGUpe3JldHVybn5bIiIsInN1Ym1pdCIsInJlc2V0Il0uaW5kZXhPZihlKX19fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue1RZUEVTOntkZWZhdWx0OiJkIixwcmltYXJ5OiJwIix3YXJuOiJ3In0sY2xpY2tGdW5jdGlvbjpudWxsfX0sbWV0aG9kczp7X29uQ2xpY2s6ZnVuY3Rpb24oZSx0KXtpZighdGhpcy5kaXNhYmxlZCYmKCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmNsaWNrRnVuY3Rpb24mJnRoaXMuY2xpY2tGdW5jdGlvbihlKSx0aGlzLmZvcm1UeXBlJiZ0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInN1Ym1pdCI9PT10aGlzLmZvcm1UeXBlPyJ1bmktZm9ybS1zdWJtaXQiOiJ1bmktZm9ybS1yZXNldCIse3R5cGU6dGhpcy5mb3JtVHlwZX0sdGhpcyksMDx0aGlzLm9wZW5UeXBlLmxlbmd0aCYmMDw9T1BFTl9UWVBFUy5pbmRleE9mKHRoaXMub3BlblR5cGUpKSl7dmFyIG49ci5wbHVzfHxuZXcgci5XZWV4UGx1cyhyLndlZXgpO3RoaXNbIl8iK3RoaXMub3BlblR5cGVdKG4pLHRoaXMuJHRyaWdnZXIodGhpcy5vcGVuVHlwZS50b0xvd2VyQ2FzZSgpLHt9KX19LF9hZ3JlZVByaXZhY3k6ZnVuY3Rpb24oZSl7ZS5ydW50aW1lLmFncmVlUHJpdmFjeSgpfSxfZGlzYWdyZWVQcml2YWN5OmZ1bmN0aW9uKGUpe2UucnVudGltZS5kaXNhZ3JlZVByaXZhY3koKX0sX2dldENsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0PSJ1Yi0iK3RoaXMuVFlQRVNbdGhpcy50eXBlXStlO3JldHVybiB0aGlzLmRpc2FibGVkJiYodCs9Ii1kIiksdGhpcy5wbGFpbiYmKHQrPSItcGxhaW4iKSwiLXQiPT09ZSYmIm1pbmkiPT09dGhpcy5zaXplJiYodCs9IiB1Yi1taW5pIiksdH0sX2dldEhvdmVyQ2xhc3M6ZnVuY3Rpb24oZSl7aWYodGhpcy5kaXNhYmxlZClyZXR1cm4iIjt2YXIgdD0idWItIit0aGlzLlRZUEVTW3RoaXMudHlwZV0rZSsiLWhvdmVyIjtyZXR1cm4gdGhpcy5wbGFpbiYmKHQrPSItcGxhaW4iKSx0fX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1BcnJheS5pc0FycmF5KHRoaXMuJHNsb3RzLmRlZmF1bHQpP3RoaXMuJHNsb3RzLmRlZmF1bHQ6W107cmV0dXJuIDE9PT1uLmxlbmd0aCYmblswXS50ZXh0JiYobj1lKCJ1LXRleHQiLHtzdGF0aWNDbGFzczpbInViLXQiXSxjbGFzczp0Ll9nZXRDbGFzcygiLXQiKX0sW3QuX3QoImRlZmF1bHQiKV0sMikpLHRoaXMuY2xpY2tGdW5jdGlvbj10LiRsaXN0ZW5lcnMuY2xpY2ssZGVsZXRlIHQuJGxpc3RlbmVycy5jbGljayxlKCJ2aWV3Iix0Ll9nKHtzdGF0aWNDbGFzczpbInViIl0sY2xhc3M6dC5fZ2V0Q2xhc3MoIiIpLGF0dHJzOntkYXRhVW5jVHlwZToidW5pLWJ1dHRvbiIsaG92ZXJDbGFzczp0Ll9nZXRIb3ZlckNsYXNzKCIiKSxob3ZlclN0YXJ0VGltZTp0LmhvdmVyU3RhcnRUaW1lLGhvdmVyU3RheVRpbWU6dC5ob3ZlclN0YXlUaW1lfSxvbjp7Y2xpY2s6dC5fb25DbGlja319LHQuJGxpc3RlbmVycyksW3QubG9hZGluZz9lKCJsb2FkaW5nLWluZGljYXRvciIse3N0YXRpY0NsYXNzOlsidWItbG9hZGluZyJdLGNsYXNzOlsidWItIit0LlRZUEVTW3QudHlwZV0rIi1sb2FkaW5nIl0sYXR0cnM6e2Fycm93OiJmYWxzZSIsYW5pbWF0aW5nOiJ0cnVlIn19KTp0Ll9lKCldLmNvbmNhdChuKSwxKX0sc3R5bGU6e3ViOntmbGV4RGlyZWN0aW9uOiJyb3ciLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciIscG9zaXRpb246InJlbGF0aXZlIixwYWRkaW5nTGVmdDoiNSIscGFkZGluZ1JpZ2h0OiI1IixvdmVyZmxvdzoiaGlkZGVuIixjb2xvcjoiIzAwMDAwMCIsYmFja2dyb3VuZENvbG9yOiIjZjhmOGY4Iixib3JkZXJSYWRpdXM6IjUiLGJvcmRlclN0eWxlOiJzb2xpZCIsYm9yZGVyV2lkdGg6IjEiLGJvcmRlckNvbG9yOiIjZGJkYmRiIn0sInViLXQiOntjb2xvcjoiIzAwMDAwMCIsZm9udFNpemU6IjE4Iix0ZXh0RGVjb3JhdGlvbjoibm9uZSIsbGluZUhlaWdodDoiNDYifSwidWItZCI6e2JhY2tncm91bmRDb2xvcjoiI2Y4ZjhmOCJ9LCJ1Yi1wIjp7YmFja2dyb3VuZENvbG9yOiIjMDA3YWZmIixib3JkZXJDb2xvcjoiIzAwNjJjYyJ9LCJ1Yi13Ijp7YmFja2dyb3VuZENvbG9yOiIjZTY0MzQwIixib3JkZXJDb2xvcjoiI2I4MzYzMyJ9LCJ1Yi1kLXQiOntjb2xvcjoiIzAwMDAwMCJ9LCJ1Yi1wLXQiOntjb2xvcjoiI2ZmZmZmZiJ9LCJ1Yi13LXQiOntjb2xvcjoiI2ZmZmZmZiJ9LCJ1Yi1kLWQiOntiYWNrZ3JvdW5kQ29sb3I6IiNmN2Y3ZjcifSwidWItcC1kIjp7YmFja2dyb3VuZENvbG9yOiIjNjNhY2ZjIixib3JkZXJDb2xvcjoiIzRmOGFjYSJ9LCJ1Yi13LWQiOntiYWNrZ3JvdW5kQ29sb3I6IiNlYzhiODkiLGJvcmRlckNvbG9yOiIjYmQ2ZjZlIn0sInViLWQtdC1kIjp7Y29sb3I6IiNjY2NjY2MifSwidWItcC10LWQiOntjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjYpIn0sInViLXctdC1kIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSJ9LCJ1Yi1kLXBsYWluIjp7Ym9yZGVyQ29sb3I6IiMzNTM1MzUiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi1wLXBsYWluIjp7Ym9yZGVyQ29sb3I6IiMwMDdhZmYiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi13LXBsYWluIjp7Ym9yZGVyQ29sb3I6IiNlNjQzNDAiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi1kLXQtcGxhaW4iOntjb2xvcjoiIzM1MzUzNSJ9LCJ1Yi1wLXQtcGxhaW4iOntjb2xvcjoiIzAwN2FmZiJ9LCJ1Yi13LXQtcGxhaW4iOntjb2xvcjoiI2U2NDM0MCJ9LCJ1Yi1kLWQtcGxhaW4iOntib3JkZXJDb2xvcjoiI2M2YzZjNiIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn0sInViLXAtZC1wbGFpbiI6e2JvcmRlckNvbG9yOiIjYzZjNmM2IixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifSwidWItdy1kLXBsYWluIjp7Ym9yZGVyQ29sb3I6IiNjNmM2YzYiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi1kLXQtZC1wbGFpbiI6e2NvbG9yOiJyZ2JhKDAsMCwwLDAuMikifSwidWItcC10LWQtcGxhaW4iOntjb2xvcjoicmdiYSgwLDAsMCwwLjIpIn0sInViLXctdC1kLXBsYWluIjp7Y29sb3I6InJnYmEoMCwwLDAsMC4yKSJ9LCJ1Yi1taW5pIjp7bGluZUhlaWdodDoiMzAiLGZvbnRTaXplOiIxMyIscGFkZGluZ1RvcDowLHBhZGRpbmdSaWdodDoiMTcuNSIscGFkZGluZ0JvdHRvbTowLHBhZGRpbmdMZWZ0OiIxNy41In0sInViLWxvYWRpbmciOnt3aWR0aDoiMTgiLGhlaWdodDoiMTgiLG1hcmdpblJpZ2h0OiIxMCJ9LCJ1Yi1kLWxvYWRpbmciOntjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjYpIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifSwidWItcC1sb2FkaW5nIjp7Y29sb3I6InJnYmEoMjU1LDI1NSwyNTUsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn0sInViLXctbG9hZGluZyI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi1kLWxvYWRpbmctcGxhaW4iOntjb2xvcjoiIzM1MzUzNSJ9LCJ1Yi1wLWxvYWRpbmctcGxhaW4iOntjb2xvcjoiIzAwN2FmZiIsYmFja2dyb3VuZENvbG9yOiIjMDA2MmNjIn0sInViLXctbG9hZGluZy1wbGFpbiI6e2NvbG9yOiIjZTY0MzQwIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifSwidWItZC1ob3ZlciI6e29wYWNpdHk6LjgsYmFja2dyb3VuZENvbG9yOiIjZGVkZWRlIn0sInViLXAtaG92ZXIiOntvcGFjaXR5Oi44LGJhY2tncm91bmRDb2xvcjoiIzAwNjJjYyJ9LCJ1Yi13LWhvdmVyIjp7b3BhY2l0eTouOCxiYWNrZ3JvdW5kQ29sb3I6IiNjZTNjMzkifSwidWItZC10LWhvdmVyIjp7Y29sb3I6InJnYmEoMCwwLDAsMC42KSJ9LCJ1Yi1wLXQtaG92ZXIiOntjb2xvcjoicmdiYSgyNTUsMjU1LDI1NSwwLjYpIn0sInViLXctdC1ob3ZlciI6e2NvbG9yOiJyZ2JhKDI1NSwyNTUsMjU1LDAuNikifSwidWItZC1ob3Zlci1wbGFpbiI6e2NvbG9yOiJyZ2JhKDUzLDUzLDUzLDAuNikiLGJvcmRlckNvbG9yOiJyZ2JhKDUzLDUzLDUzLDAuNikiLGJhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9LCJ1Yi1wLWhvdmVyLXBsYWluIjp7Y29sb3I6InJnYmEoMjYsMTczLDI1LDAuNikiLGJvcmRlckNvbG9yOiJyZ2JhKDAsMTIyLDI1NSwwLjYpIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMCwwLDAsMCkifSwidWItdy1ob3Zlci1wbGFpbiI6e2NvbG9yOiJyZ2JhKDIzMCw2Nyw2NCwwLjYpIixib3JkZXJDb2xvcjoicmdiYSgyMzAsNjcsNjQsMC42KSIsYmFja2dyb3VuZENvbG9yOiJyZ2JhKDAsMCwwLDApIn19LGxpc3RlbmVyczp7ImxhYmVsLWNsaWNrIjoiX29uQ2xpY2siLCJAbGFiZWwtY2xpY2siOiJfb25DbGljayJ9fX1mdW5jdGlvbiBpbml0JDUoZSx0LG4pe2UuY29tcG9uZW50KCJidXR0b24iLGdldEJ1dHRvbih0LG4pKX1mdW5jdGlvbiBnZXRDaGVja2JveEdyb3VwKGUpe3JldHVybntuYW1lOiJDaGVja2JveEdyb3VwIixpc1Jlc2VydmVkOiEwLG1peGluczpbZW1pdHRlcixsaXN0ZW5lcnNdLHByb3BzOntuYW1lOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntjaGVja2JveExpc3Q6W119fSxsaXN0ZW5lcnM6eyJAY2hlY2tib3gtY2hhbmdlIjoiX2NoYW5nZUhhbmRsZXIiLCJAY2hlY2tib3gtZ3JvdXAtdXBkYXRlIjoiX2NoZWNrYm94R3JvdXBVcGRhdGVIYW5kbGVyIn0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToiYWRkIix2bTp0aGlzfSl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInVuaS1mb3JtLWdyb3VwLXVwZGF0ZSIse3R5cGU6InJlbW92ZSIsdm06dGhpc30pfSxtZXRob2RzOntfY2hhbmdlSGFuZGxlcjpmdW5jdGlvbihlKXt2YXIgdD1bXTt0aGlzLmNoZWNrYm94TGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY2hlY2tib3hDaGVja2VkJiZ0LnB1c2goZS52YWx1ZSl9KSx0aGlzLiR0cmlnZ2VyKCJjaGFuZ2UiLHt2YWx1ZTp0fSl9LF9jaGVja2JveEdyb3VwVXBkYXRlSGFuZGxlcjpmdW5jdGlvbihlKXtpZigiYWRkIj09PWUudHlwZSl0aGlzLmNoZWNrYm94TGlzdC5wdXNoKGUudm0pO2Vsc2V7dmFyIHQ9dGhpcy5jaGVja2JveExpc3QuaW5kZXhPZihlLnZtKTt0aGlzLmNoZWNrYm94TGlzdC5zcGxpY2UodCwxKX19LF9nZXRGb3JtRGF0YTpmdW5jdGlvbigpe3ZhciBlPXt9O2lmKCIiIT09dGhpcy5uYW1lKXt2YXIgdD1bXTt0aGlzLmNoZWNrYm94TGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY2hlY2tib3hDaGVja2VkJiZ0LnB1c2goZS52YWx1ZSl9KSxlLnZhbHVlPXQsZS5rZXk9dGhpcy5uYW1lfXJldHVybiBlfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlKCJkaXYiLHRoaXMuX2coe3N0YXRpY0NsYXNzOlsidW5pLWNoZWNrYm94LWdyb3VwIl19LHRoaXMuJGxpc3RlbmVycyksW3RoaXMuX3QoImRlZmF1bHQiKV0sMil9LHN0eWxlOnt9fX1mdW5jdGlvbiBpbml0JDYoZSx0KXtlLmNvbXBvbmVudCgiY2hlY2tib3gtZ3JvdXAiLGdldENoZWNrYm94R3JvdXAodCkpfWZ1bmN0aW9uIGdldENoZWNrYm94KGUpe3JldHVybntuYW1lOiJDaGVja2JveCIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXIsbGlzdGVuZXJzXSxwcm9wczp7Y2hlY2tlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGlkOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxkaXNhYmxlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDA3YWZmIn0sdmFsdWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue2NoZWNrYm94Q2hlY2tlZDp0aGlzLmNoZWNrZWQsY2hlY2tib3hWYWx1ZTp0aGlzLnZhbHVlfX0sd2F0Y2g6e2NoZWNrZWQ6ZnVuY3Rpb24oZSl7dGhpcy5jaGVja2JveENoZWNrZWQ9ZX0sdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5jaGVja2JveFZhbHVlPWV9fSxsaXN0ZW5lcnM6eyJsYWJlbC1jbGljayI6Il9vbkNsaWNrIiwiQGxhYmVsLWNsaWNrIjoiX29uQ2xpY2sifSxjb21wdXRlZDp7Y2hlY2tib3hDb2xvcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpc2FibGVkPyIjYWRhZGFkIjp0aGlzLmNvbG9yfX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJDaGVja2JveEdyb3VwIiwidW5pLWNoZWNrYm94LWdyb3VwLXVwZGF0ZSIse3R5cGU6ImFkZCIsdm06dGhpc30pLHRoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToiYWRkIix2bTp0aGlzfSl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLiRkaXNwYXRjaCgiQ2hlY2tib3hHcm91cCIsInVuaS1jaGVja2JveC1ncm91cC11cGRhdGUiLHt0eXBlOiJyZW1vdmUiLHZtOnRoaXN9KSx0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInVuaS1mb3JtLWdyb3VwLXVwZGF0ZSIse3R5cGU6InJlbW92ZSIsdm06dGhpc30pfSxtZXRob2RzOntfb25DbGljazpmdW5jdGlvbihlKXt0aGlzLmRpc2FibGVkfHwodGhpcy5jaGVja2JveENoZWNrZWQ9IXRoaXMuY2hlY2tib3hDaGVja2VkLHRoaXMuJGRpc3BhdGNoKCJDaGVja2JveEdyb3VwIiwidW5pLWNoZWNrYm94LWNoYW5nZSIsZSkpfSxfcmVzZXRGb3JtRGF0YTpmdW5jdGlvbigpe3RoaXMuY2hlY2tib3hDaGVja2VkPSExfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIGUoImRpdiIsdC5fZyh7YXR0cnM6e2RhdGFVbmNUeXBlOiJ1bmktY2hlY2tib3gifSxvbjp7Y2xpY2s6dC5fb25DbGlja319LHQuJGxpc3RlbmVycyksW2UoImRpdiIse3N0YXRpY0NsYXNzOlsidW5pLWNoZWNrYm94Il19LFtlKCJkaXYiLHtzdGF0aWNDbGFzczpbInVuaS1jaGVja2JveC1pbnB1dCJdLGNsYXNzOlt0LmRpc2FibGVkPyJ1bmktY2hlY2tib3gtaW5wdXQtZGlzYWJsZWQiOiIiXX0sW3QuY2hlY2tib3hDaGVja2VkP2UoInUtdGV4dCIse3N0YXRpY0NsYXNzOlsidW5pLWljb24iXSxzdHlsZTp7Y29sb3I6dC5jaGVja2JveENvbG9yfX0sW3QuX3YodC5fcygi7qiIIikpXSk6dC5fZSgpXSksZSgidS10ZXh0Iix7c3RhdGljQ2xhc3M6WyJ1bmktc2xvdCJdfSxbdC5fdCgiZGVmYXVsdCIpXSwyKV0pXSl9LHN0eWxlOnsidW5pLWNoZWNrYm94Ijp7ZmxleERpcmVjdGlvbjoicm93IixhbGlnbkl0ZW1zOiJjZW50ZXIifSwidW5pLWNoZWNrYm94LWlucHV0Ijp7anVzdGlmeUNvbnRlbnQ6ImNlbnRlciIsYWxpZ25JdGVtczoiY2VudGVyIixwb3NpdGlvbjoicmVsYXRpdmUiLGJvcmRlcldpZHRoOiIxIixib3JkZXJDb2xvcjoiI2QxZDFkMSIsYm9yZGVyU3R5bGU6InNvbGlkIixiYWNrZ3JvdW5kQ29sb3I6IiNmZmZmZmYiLGJvcmRlclJhZGl1czoiMyIsd2lkdGg6IjIyIixoZWlnaHQ6IjIyIn0sInVuaS1pY29uIjp7Zm9udEZhbWlseToidW5pbmNvbXBvbmVudHMiLGZvbnRTaXplOiIxNiIsbWFyZ2luTGVmdDoiMiIsbWFyZ2luVG9wOiIyIixjb2xvcjoiIzAwN2FmZiJ9LCJ1bmktY2hlY2tib3gtaW5wdXQtZGlzYWJsZWQiOntiYWNrZ3JvdW5kQ29sb3I6IiNlMWUxZTEifSwidW5pLWNoZWNrYm94LWlucHV0LWRpc2FibGVkLWJlZm9yZSI6e2NvbG9yOiIjYWRhZGFkIn0sInVuaS1zbG90Ijp7Zm9udFNpemU6IjE2IixtYXJnaW5MZWZ0OiI1In0sInVuaS1jaGVja2JveC1ncm91cCI6e2Rpc3BsYXk6ImJsb2NrIn19fX1mdW5jdGlvbiBpbml0JDcoZSx0KXtlLmNvbXBvbmVudCgiY2hlY2tib3giLGdldENoZWNrYm94KHQpKX12YXIgTkFUSVZFX0NPTVBPTkVOVF9UWVBFUz1bInUtaW5wdXQiLCJ1LXRleHRhcmVhIl07ZnVuY3Rpb24gZ2V0Rm9ybShlKXt2YXIgaT1lLnJlcXVpcmVNb2R1bGUoInBsdXMiKTtyZXR1cm57bmFtZToiRm9ybSIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXIsbGlzdGVuZXJzXSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue2NoaWxkcmVuTGlzdDpbXX19LGxpc3RlbmVyczp7IkBmb3JtLXN1Ym1pdCI6Il9vblN1Ym1pdCIsIkBmb3JtLXJlc2V0IjoiX29uUmVzZXQiLCJAZm9ybS1ncm91cC11cGRhdGUiOiJfZm9ybUdyb3VwVXBkYXRlSGFuZGxlciJ9LG1ldGhvZHM6e19vblN1Ym1pdDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXROYXRpdmVGb3JtRGF0YSgpfHx7fTt0aGlzLmNoaWxkcmVuTGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuX2dldEZvcm1EYXRhJiZlLl9nZXRGb3JtRGF0YSgpLmtleSYmKHRbZS5fZ2V0Rm9ybURhdGEoKS5rZXldPWUuX2dldEZvcm1EYXRhKCkudmFsdWUpfSksdGhpcy4kdHJpZ2dlcigic3VibWl0Iix7dmFsdWU6dH0pfSxfb25SZXNldDpmdW5jdGlvbihlKXt0aGlzLiR0cmlnZ2VyKCJyZXNldCIse30pLHRoaXMuX2dldE5hdGl2ZUZvcm1EYXRhKCEwKSx0aGlzLmNoaWxkcmVuTGlzdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuX3Jlc2V0Rm9ybURhdGEmJmUuX3Jlc2V0Rm9ybURhdGEoKX0pfSxfZm9ybUdyb3VwVXBkYXRlSGFuZGxlcjpmdW5jdGlvbihlKXtpZigiYWRkIj09PWUudHlwZSl0aGlzLmNoaWxkcmVuTGlzdC5wdXNoKGUudm0pO2Vsc2V7dmFyIHQ9dGhpcy5jaGlsZHJlbkxpc3QuaW5kZXhPZihlLnZtKTt0aGlzLmNoaWxkcmVuTGlzdC5zcGxpY2UodCwxKX19LF9nZXROYXRpdmVGb3JtRGF0YTpmdW5jdGlvbihuKXt2YXIgcj17fTtyZXR1cm4gZnVuY3Rpb24gdChlKXtlLmZvckVhY2goZnVuY3Rpb24oZSl7MDw9TkFUSVZFX0NPTVBPTkVOVF9UWVBFUy5pbmRleE9mKGUudGFnKSYmZS5kYXRhLmF0dHJzJiZlLmRhdGEuYXR0cnMubmFtZSYmKG4/ZS5lbG0uc2V0VmFsdWUoIiIpOnJbZS5kYXRhLmF0dHJzLm5hbWVdPWkuZ2V0VmFsdWUoZS5lbG0ubm9kZUlkKSksZS5jaGlsZHJlbiYmdChlLmNoaWxkcmVuKX0pfSh0aGlzLiR2bm9kZS5jb21wb25lbnRPcHRpb25zLmNoaWxkcmVuKSxyfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlKCJ2aWV3Iix0aGlzLl9nKHt9LHRoaXMuJGxpc3RlbmVycyksW3RoaXMuX3QoImRlZmF1bHQiKV0sMil9fX1mdW5jdGlvbiBpbml0JDgoZSx0KXtlLmNvbXBvbmVudCgiZm9ybSIsZ2V0Rm9ybSh0KSl9dmFyIGljb25DaGFycz17c3VjY2Vzczoi7qiGIixpbmZvOiLuqIMiLHdhcm46Iu6oiyIsd2FpdGluZzoi7qiJIixzYWZlX3N1Y2Nlc3M6Iu6ohCIsc2FmZV93YXJuOiLuqIUiLHN1Y2Nlc3NfY2lyY2xlOiLuqIciLHN1Y2Nlc3Nfbm9fY2lyY2xlOiLuqIgiLHdhaXRpbmdfY2lyY2xlOiLuqIoiLGNpcmNsZToi7qiBIixkb3dubG9hZDoi7qiCIixpbmZvX2NpcmNsZToi7qiMIixjYW5jZWw6Iu6ojSIsc2VhcmNoOiLuqI4iLGNsZWFyOiLuqI8ifSxpY29uQ29sb3JzPXtzdWNjZXNzOiIjMDliYjA3IixpbmZvOiIjMTBhZWZmIix3YXJuOiIjZjc2MjYwIix3YWl0aW5nOiIjMTBhZWZmIixzYWZlX3N1Y2Nlc3M6IiMwOWJiMDciLHNhZmVfd2FybjoiI2ZmYmUwMCIsc3VjY2Vzc19jaXJjbGU6IiMwOWJiMDciLHN1Y2Nlc3Nfbm9fY2lyY2xlOiIjMDliYjA3Iix3YWl0aW5nX2NpcmNsZToiIzEwYWVmZiIsY2lyY2xlOiIjYzljOWM5Iixkb3dubG9hZDoiIzA5YmIwNyIsaW5mb19jaXJjbGU6IiMwOWJiMDciLGNhbmNlbDoiI2Y0MzUzMCIsc2VhcmNoOiIjYjJiMmIyIixjbGVhcjoiI2IyYjJiMiJ9O2Z1bmN0aW9uIGdldEljb24oZSl7cmV0dXJue25hbWU6Ikljb24iLGlzUmVzZXJ2ZWQ6ITAscHJvcHM6e3R5cGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LHNpemU6e3R5cGU6W1N0cmluZyxOdW1iZXJdLGRlZmF1bHQ6MjN9LGNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntpY29uQ2hhcnM6aWNvbkNoYXJzfX0sYmVmb3JlQ3JlYXRlOmZ1bmN0aW9uKCl7fSxjb21wdXRlZDp7c3R5bGVzOmZ1bmN0aW9uKCl7cmV0dXJue2NvbG9yOnRoaXMuY29sb3J8fGljb25Db2xvcnNbdGhpcy50eXBlXSxmb250U2l6ZTp0aGlzLnNpemV9fX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlKCJ1LXRleHQiLHRoaXMuX2coe3N0YXRpY0NsYXNzOlsidW5pLWljb24iXSxzdHlsZTp0aGlzLnN0eWxlc30sdGhpcy4kbGlzdGVuZXJzKSxbdGhpcy5pY29uQ2hhcnNbdGhpcy50eXBlXV0pfSxzdHlsZTp7InVuaS1pY29uIjp7Zm9udEZhbWlseToidW5pbmNvbXBvbmVudHMifX19fWZ1bmN0aW9uIGluaXQkOShlLHQpe2UuY29tcG9uZW50KCJpY29uIixnZXRJY29uKHQpKX1mdW5jdGlvbiBnZXRMYWJlbChlKXtyZXR1cm57bmFtZToiTGFiZWwiLGlzUmVzZXJ2ZWQ6ITAsbWl4aW5zOltlbWl0dGVyLGxpc3RlbmVyc10scHJvcHM6e2Zvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn19LG1ldGhvZHM6e19vbkNsaWNrOmZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0LmF0dHIuZGF0YVVuY1R5cGV8fCIiLG49L151bmktKGNoZWNrYm94fHJhZGlvfHN3aXRjaCktLy50ZXN0KHQpO258fChuPS9edW5pLShjaGVja2JveHxyYWRpb3xzd2l0Y2h8YnV0dG9uKSQvaS50ZXN0KHQpKSxufHwodGhpcy5mb3I/dGhpcy5fJGJ1cy4kZW1pdCgidW5pLWxhYmVsLWNsaWNrLSIrdGhpcy4kcGFnZS5pZCsiLSIrdGhpcy5mb3IsZSwhMCk6dGhpcy4kYnJvYWRjYXN0KFsiQ2hlY2tib3giLCJSYWRpbyIsIlN3aXRjaCIsIkJ1dHRvbiJdLCJ1bmktbGFiZWwtY2xpY2siLGUsITApKX19LHJlbmRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZSgiZGl2Iix0aGlzLl9nKHtvbjp7Y2xpY2s6dGhpcy5fb25DbGlja319LHRoaXMuJGxpc3RlbmVycyksW3RoaXMuX3QoImRlZmF1bHQiKV0sMil9fX1mdW5jdGlvbiBpbml0JDEwKGUsdCl7ZS5jb21wb25lbnQoImxhYmVsIixnZXRMYWJlbCh0KSl9ZnVuY3Rpb24gZ2V0TW92YWJsZUFyZWEoZSl7dmFyIHQ9ZS5yZXF1aXJlTW9kdWxlKCJkb20iKTtyZXR1cm57bmFtZToiTW92YWJsZUFyZWEiLGlzUmVzZXJ2ZWQ6ITAscHJvcHM6e3NjYWxlQXJlYTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITF9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3dpZHRoOjAsaGVpZ2h0OjAsaXRlbXM6W119fSxtZXRob2RzOntfcmVzaXplOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl9nZXRXSCgpLnRoZW4oZnVuY3Rpb24oKXtlLml0ZW1zLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5jb21wb25lbnRJbnN0YW5jZS5zZXRQYXJlbnQoKX0pfSl9LF9wYW5zdGFydDpmdW5jdGlvbihlKXt0aGlzLnRvdWNoSXRlbSYmdGhpcy50b3VjaEl0ZW0udG91Y2hzdGFydChlKX0sX3Bhbm1vdmU6ZnVuY3Rpb24oZSl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLnRvdWNoSXRlbSYmdGhpcy50b3VjaEl0ZW0udG91Y2htb3ZlKGUpfSxfcGFuZW5kOmZ1bmN0aW9uKGUpe3RoaXMudG91Y2hJdGVtJiYodGhpcy50b3VjaEl0ZW0udG91Y2hlbmQoZSksdGhpcy50b3VjaEl0ZW09bnVsbCl9LF9nZXRXSDpmdW5jdGlvbigpe3ZhciBvPXRoaXM7cmV0dXJuIHRoaXMuX2dldENvbXBvbmVudFNpemUodGhpcy4kcmVmcy5lbCkudGhlbihmdW5jdGlvbihlKXt2YXIgdD1lLndpZHRoLG49ZS5oZWlnaHQscj1lLnRvcCxpPWUubGVmdDtvLndpZHRoPXQsby5oZWlnaHQ9bixvLnRvcD1yLG8ubGVmdD1pfSl9LF9nZXRDb21wb25lbnRTaXplOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihuKXt0LmdldENvbXBvbmVudFJlY3QoZSxmdW5jdGlvbihlKXt2YXIgdD1lLnNpemU7bih0KX0pfSl9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5pdGVtcz1bXSx0aGlzLmdhcFY9e3g6bnVsbCx5Om51bGx9LHRoaXMucGluY2hTdGFydExlbj1udWxsfSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5fX2lzTW91bnRlZD0hMCxlLl9yZXNpemUoKX0sMjAwKX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1bXTsoQXJyYXkuaXNBcnJheSh0aGlzLiRzbG90cy5kZWZhdWx0KT9kZWVwQ2xvbmUodGhpcy4kc2xvdHMuZGVmYXVsdCxlKTpbXSkuZm9yRWFjaChmdW5jdGlvbihlKXtlLmNvbXBvbmVudE9wdGlvbnMmJiJtb3ZhYmxlLXZpZXciPT09ZS5jb21wb25lbnRPcHRpb25zLnRhZyYmbi5wdXNoKGUpfSksdGhpcy5pdGVtcz1uO3ZhciByPXt9O3JldHVyblsicGFuc3RhcnQiLCJwYW5tb3ZlIiwicGFuZW5kIl0uZm9yRWFjaChmdW5jdGlvbihlKXtyW2VdPXRbIl8iK2VdfSksZSgiZGl2Iix0aGlzLl9nKHtyZWY6ImVsIixvbjpyLHN0YXRpY0NsYXNzOlsidW5pLW1vdmFibGUtYXJlYSJdfSx0aGlzLiRsaXN0ZW5lcnMpLG4sMil9LHN0eWxlOnsidW5pLW1vdmFibGUtYXJlYSI6e292ZXJmbG93OiJoaWRkZW4iLHdpZHRoOiIxMHB4IixoZWlnaHQ6IjEwcHgifX19fWZ1bmN0aW9uIGluaXQkMTEoZSx0KXtlLmNvbXBvbmVudCgibW92YWJsZS1hcmVhIixnZXRNb3ZhYmxlQXJlYSh0KSl9dmFyIHRvdWNodHJhY2s9e21ldGhvZHM6e3RvdWNodHJhY2s6ZnVuY3Rpb24oaSl7dmFyIG89dGhpcyxhPTAscz0wLGM9MCx1PTAsbj1mdW5jdGlvbihlLHQsbixyKXtpZighMT09PW9baV0oe3RhcmdldDplLnRhcmdldCxjdXJyZW50VGFyZ2V0OmUuY3VycmVudFRhcmdldCxzdG9wUHJvcGFnYXRpb246ZS5zdG9wUHJvcGFnYXRpb24uYmluZChlKSx0b3VjaGVzOmUudG91Y2hlcyxjaGFuZ2VkVG91Y2hlczplLmNoYW5nZWRUb3VjaGVzLGRldGFpbDp7c3RhdGU6dCx4MDpuLHkwOnIsZHg6bi1hLGR5OnItcyxkZHg6bi1jLGRkeTpyLXUsdGltZVN0YW1wOmUudGltZVN0YW1wfHxEYXRlLm5vdygpfX0pKXJldHVybiExfSxyPW51bGw7dGhpcy5hZGRMaXN0ZW5lcigidG91Y2hzdGFydCIsZnVuY3Rpb24oZSl7aWYoIXIpcmV0dXJuIGE9Yz0ocj1lKS50b3VjaGVzWzBdLnBhZ2VYLHM9dT1lLnRvdWNoZXNbMF0ucGFnZVksbihlLCJzdGFydCIsYSxzKX0pLHRoaXMuYWRkTGlzdGVuZXIoInRvdWNobW92ZSIsZnVuY3Rpb24oZSl7aWYocil7dmFyIHQ9bihlLCJtb3ZlIixlLnRvdWNoZXNbMF0ucGFnZVgsZS50b3VjaGVzWzBdLnBhZ2VZKTtyZXR1cm4gYz1lLnRvdWNoZXNbMF0ucGFnZVgsdT1lLnRvdWNoZXNbMF0ucGFnZVksdH19KSx0aGlzLmFkZExpc3RlbmVyKCJ0b3VjaGVuZCIsZnVuY3Rpb24oZSl7aWYocilyZXR1cm4gcj1udWxsLG4oZSwiZW5kIixlLmNoYW5nZWRUb3VjaGVzWzBdLnBhZ2VYLGUuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVkpfSl9LHRvdWNoc3RhcnQ6ZnVuY3Rpb24oZSl7dGhpcy5jYWxsYmFjaygidG91Y2hzdGFydCIsZSl9LHRvdWNobW92ZTpmdW5jdGlvbihlKXt0aGlzLmNhbGxiYWNrKCJ0b3VjaG1vdmUiLGUpfSx0b3VjaGVuZDpmdW5jdGlvbihlKXt0aGlzLmNhbGxiYWNrKCJ0b3VjaGVuZCIsZSl9LGFkZExpc3RlbmVyOmZ1bmN0aW9uKGUsdCl7dGhpcy5fX2V2ZW50W2VdPWZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiB0JiYoZS50b3VjaGVzPWUuY2hhbmdlZFRvdWNoZXMsITE9PT10KGUpJiZlLnN0b3BQcm9wYWdhdGlvbigpKX19LGNhbGxiYWNrOmZ1bmN0aW9uKGUsdCl7dGhpcy5fX2V2ZW50W2VdJiZ0aGlzLl9fZXZlbnRbZV0odCl9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5fX2V2ZW50PXt9fX07ZnVuY3Rpb24gZShlLHQsbil7cmV0dXJuIHQtbjxlJiZlPHQrbn1mdW5jdGlvbiB0KHQsbil7cmV0dXJuIGUodCwwLG4pfWZ1bmN0aW9uIERlY2xpbmUoKXt9ZnVuY3Rpb24gRnJpY3Rpb24oZSx0KXt0aGlzLl9tPWUsdGhpcy5fZj0xZTMqdCx0aGlzLl9zdGFydFRpbWU9MCx0aGlzLl92PTB9ZnVuY3Rpb24gU3ByaW5nKGUsdCxuKXt0aGlzLl9tPWUsdGhpcy5faz10LHRoaXMuX2M9bix0aGlzLl9zb2x1dGlvbj1udWxsLHRoaXMuX2VuZFBvc2l0aW9uPTAsdGhpcy5fc3RhcnRUaW1lPTB9ZnVuY3Rpb24gU1REKGUsdCxuKXt0aGlzLl9zcHJpbmdYPW5ldyBTcHJpbmcoZSx0LG4pLHRoaXMuX3NwcmluZ1k9bmV3IFNwcmluZyhlLHQsbiksdGhpcy5fc3ByaW5nU2NhbGU9bmV3IFNwcmluZyhlLHQsbiksdGhpcy5fc3RhcnRUaW1lPTB9RGVjbGluZS5wcm90b3R5cGUueD1mdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5zcXJ0KGUpfSxGcmljdGlvbi5wcm90b3R5cGUuc2V0Vj1mdW5jdGlvbihlLHQpe3ZhciBuPU1hdGgucG93KE1hdGgucG93KGUsMikrTWF0aC5wb3codCwyKSwuNSk7dGhpcy5feF92PWUsdGhpcy5feV92PXQsdGhpcy5feF9hPS10aGlzLl9mKnRoaXMuX3hfdi9uLHRoaXMuX3lfYT0tdGhpcy5fZip0aGlzLl95X3Yvbix0aGlzLl90PU1hdGguYWJzKGUvdGhpcy5feF9hKXx8TWF0aC5hYnModC90aGlzLl95X2EpLHRoaXMuX2xhc3REdD1udWxsLHRoaXMuX3N0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKX0sRnJpY3Rpb24ucHJvdG90eXBlLnNldFM9ZnVuY3Rpb24oZSx0KXt0aGlzLl94X3M9ZSx0aGlzLl95X3M9dH0sRnJpY3Rpb24ucHJvdG90eXBlLnM9ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9KChuZXcgRGF0ZSkuZ2V0VGltZSgpLXRoaXMuX3N0YXJ0VGltZSkvMWUzKSxlPnRoaXMuX3QmJihlPXRoaXMuX3QsdGhpcy5fbGFzdER0PWUpO3ZhciB0PXRoaXMuX3hfdiplKy41KnRoaXMuX3hfYSpNYXRoLnBvdyhlLDIpK3RoaXMuX3hfcyxuPXRoaXMuX3lfdiplKy41KnRoaXMuX3lfYSpNYXRoLnBvdyhlLDIpK3RoaXMuX3lfcztyZXR1cm4oMDx0aGlzLl94X2EmJnQ8dGhpcy5fZW5kUG9zaXRpb25YfHx0aGlzLl94X2E8MCYmdD50aGlzLl9lbmRQb3NpdGlvblgpJiYodD10aGlzLl9lbmRQb3NpdGlvblgpLCgwPHRoaXMuX3lfYSYmbjx0aGlzLl9lbmRQb3NpdGlvbll8fHRoaXMuX3lfYTwwJiZuPnRoaXMuX2VuZFBvc2l0aW9uWSkmJihuPXRoaXMuX2VuZFBvc2l0aW9uWSkse3g6dCx5Om59fSxGcmljdGlvbi5wcm90b3R5cGUuZHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSgobmV3IERhdGUpLmdldFRpbWUoKS10aGlzLl9zdGFydFRpbWUpLzFlMyksZT50aGlzLl90JiYoZT10aGlzLl90KSx7ZHg6dGhpcy5feF92K3RoaXMuX3hfYSplLGR5OnRoaXMuX3lfdit0aGlzLl95X2EqZX19LEZyaWN0aW9uLnByb3RvdHlwZS5kZWx0YT1mdW5jdGlvbigpe3JldHVybnt4Oi0xLjUqTWF0aC5wb3codGhpcy5feF92LDIpL3RoaXMuX3hfYXx8MCx5Oi0xLjUqTWF0aC5wb3codGhpcy5feV92LDIpL3RoaXMuX3lfYXx8MH19LEZyaWN0aW9uLnByb3RvdHlwZS5kdD1mdW5jdGlvbigpe3JldHVybi10aGlzLl94X3YvdGhpcy5feF9hfSxGcmljdGlvbi5wcm90b3R5cGUuZG9uZT1mdW5jdGlvbigpe3ZhciB0PWUodGhpcy5zKCkueCx0aGlzLl9lbmRQb3NpdGlvblgpfHxlKHRoaXMucygpLnksdGhpcy5fZW5kUG9zaXRpb25ZKXx8dGhpcy5fbGFzdER0PT09dGhpcy5fdDtyZXR1cm4gdGhpcy5fbGFzdER0PW51bGwsdH0sRnJpY3Rpb24ucHJvdG90eXBlLnNldEVuZD1mdW5jdGlvbihlLHQpe3RoaXMuX2VuZFBvc2l0aW9uWD1lLHRoaXMuX2VuZFBvc2l0aW9uWT10fSxGcmljdGlvbi5wcm90b3R5cGUucmVjb25maWd1cmU9ZnVuY3Rpb24oZSx0KXt0aGlzLl9tPWUsdGhpcy5fZj0xZTMqdH0sU3ByaW5nLnByb3RvdHlwZS5fc29sdmU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9jLHI9dGhpcy5fbSxpPXRoaXMuX2ssbz1uKm4tNCpyKmk7aWYoMD09PW8pe3ZhciBhPS1uLygyKnIpLHM9ZSxjPXQvKGEqZSk7cmV0dXJue3g6ZnVuY3Rpb24oZSl7cmV0dXJuKHMrYyplKSpNYXRoLnBvdyhNYXRoLkUsYSplKX0sZHg6ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC5wb3coTWF0aC5FLGEqZSk7cmV0dXJuIGEqKHMrYyplKSp0K2MqdH19fWlmKDA8byl7dmFyIHU9KC1uLU1hdGguc3FydChvKSkvKDIqciksbD0oLW4rTWF0aC5zcXJ0KG8pKS8oMipyKSxkPSh0LXUqZSkvKGwtdSksZj1lLWQ7cmV0dXJue3g6ZnVuY3Rpb24oZSl7dmFyIHQsbjtyZXR1cm4gZT09PXRoaXMuX3QmJih0PXRoaXMuX3Bvd0VSMVQsbj10aGlzLl9wb3dFUjJUKSx0aGlzLl90PWUsdHx8KHQ9dGhpcy5fcG93RVIxVD1NYXRoLnBvdyhNYXRoLkUsdSplKSksbnx8KG49dGhpcy5fcG93RVIyVD1NYXRoLnBvdyhNYXRoLkUsbCplKSksZip0K2Qqbn0sZHg6ZnVuY3Rpb24oZSl7dmFyIHQsbjtyZXR1cm4gZT09PXRoaXMuX3QmJih0PXRoaXMuX3Bvd0VSMVQsbj10aGlzLl9wb3dFUjJUKSx0aGlzLl90PWUsdHx8KHQ9dGhpcy5fcG93RVIxVD1NYXRoLnBvdyhNYXRoLkUsdSplKSksbnx8KG49dGhpcy5fcG93RVIyVD1NYXRoLnBvdyhNYXRoLkUsbCplKSksZip1KnQrZCpsKm59fX12YXIgcD1NYXRoLnNxcnQoNCpyKmktbipuKS8oMipyKSxoPS1uLzIqcix2PWUsZz0odC1oKmUpL3A7cmV0dXJue3g6ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucG93KE1hdGguRSxoKmUpKih2Kk1hdGguY29zKHAqZSkrZypNYXRoLnNpbihwKmUpKX0sZHg6ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC5wb3coTWF0aC5FLGgqZSksbj1NYXRoLmNvcyhwKmUpLHI9TWF0aC5zaW4ocCplKTtyZXR1cm4gdCooZypwKm4tdipwKnIpK2gqdCooZypyK3Yqbil9fX0sU3ByaW5nLnByb3RvdHlwZS54PWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0oKG5ldyBEYXRlKS5nZXRUaW1lKCktdGhpcy5fc3RhcnRUaW1lKS8xZTMpLHRoaXMuX3NvbHV0aW9uP3RoaXMuX2VuZFBvc2l0aW9uK3RoaXMuX3NvbHV0aW9uLngoZSk6MH0sU3ByaW5nLnByb3RvdHlwZS5keD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9KChuZXcgRGF0ZSkuZ2V0VGltZSgpLXRoaXMuX3N0YXJ0VGltZSkvMWUzKSx0aGlzLl9zb2x1dGlvbj90aGlzLl9zb2x1dGlvbi5keChlKTowfSxTcHJpbmcucHJvdG90eXBlLnNldEVuZD1mdW5jdGlvbihlLG4scil7aWYocnx8KHI9KG5ldyBEYXRlKS5nZXRUaW1lKCkpLGUhPT10aGlzLl9lbmRQb3NpdGlvbnx8IXQobiwuMSkpe249bnx8MDt2YXIgaT10aGlzLl9lbmRQb3NpdGlvbjt0aGlzLl9zb2x1dGlvbiYmKHQobiwuMSkmJihuPXRoaXMuX3NvbHV0aW9uLmR4KChyLXRoaXMuX3N0YXJ0VGltZSkvMWUzKSksaT10aGlzLl9zb2x1dGlvbi54KChyLXRoaXMuX3N0YXJ0VGltZSkvMWUzKSx0KG4sLjEpJiYobj0wKSx0KGksLjEpJiYoaT0wKSxpKz10aGlzLl9lbmRQb3NpdGlvbiksdGhpcy5fc29sdXRpb24mJnQoaS1lLC4xKSYmdChuLC4xKXx8KHRoaXMuX2VuZFBvc2l0aW9uPWUsdGhpcy5fc29sdXRpb249dGhpcy5fc29sdmUoaS10aGlzLl9lbmRQb3NpdGlvbixuKSx0aGlzLl9zdGFydFRpbWU9cil9fSxTcHJpbmcucHJvdG90eXBlLnNuYXA9ZnVuY3Rpb24oZSl7dGhpcy5fc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuX2VuZFBvc2l0aW9uPWUsdGhpcy5fc29sdXRpb249e3g6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sZHg6ZnVuY3Rpb24oKXtyZXR1cm4gMH19fSxTcHJpbmcucHJvdG90eXBlLmRvbmU9ZnVuY3Rpb24obil7cmV0dXJuIG58fChuPShuZXcgRGF0ZSkuZ2V0VGltZSgpKSxlKHRoaXMueCgpLHRoaXMuX2VuZFBvc2l0aW9uLC4xKSYmdCh0aGlzLmR4KCksLjEpfSxTcHJpbmcucHJvdG90eXBlLnJlY29uZmlndXJlPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLl9tPWUsdGhpcy5faz10LHRoaXMuX2M9bix0aGlzLmRvbmUoKXx8KHRoaXMuX3NvbHV0aW9uPXRoaXMuX3NvbHZlKHRoaXMueCgpLXRoaXMuX2VuZFBvc2l0aW9uLHRoaXMuZHgoKSksdGhpcy5fc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKX0sU3ByaW5nLnByb3RvdHlwZS5zcHJpbmdDb25zdGFudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9rfSxTcHJpbmcucHJvdG90eXBlLmRhbXBpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY30sU3ByaW5nLnByb3RvdHlwZS5jb25maWd1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuW3tsYWJlbDoiU3ByaW5nIENvbnN0YW50IixyZWFkOnRoaXMuc3ByaW5nQ29uc3RhbnQuYmluZCh0aGlzKSx3cml0ZTpmdW5jdGlvbihlLHQpe2UucmVjb25maWd1cmUoMSx0LGUuZGFtcGluZygpKX0uYmluZCh0aGlzLHRoaXMpLG1pbjoxMDAsbWF4OjFlM30se2xhYmVsOiJEYW1waW5nIixyZWFkOnRoaXMuZGFtcGluZy5iaW5kKHRoaXMpLHdyaXRlOmZ1bmN0aW9uKGUsdCl7ZS5yZWNvbmZpZ3VyZSgxLGUuc3ByaW5nQ29uc3RhbnQoKSx0KX0uYmluZCh0aGlzLHRoaXMpLG1pbjoxLG1heDo1MDB9XX0sU1RELnByb3RvdHlwZS5zZXRFbmQ9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9KG5ldyBEYXRlKS5nZXRUaW1lKCk7dGhpcy5fc3ByaW5nWC5zZXRFbmQoZSxyLGkpLHRoaXMuX3NwcmluZ1kuc2V0RW5kKHQscixpKSx0aGlzLl9zcHJpbmdTY2FsZS5zZXRFbmQobixyLGkpLHRoaXMuX3N0YXJ0VGltZT1pfSxTVEQucHJvdG90eXBlLng9ZnVuY3Rpb24oKXt2YXIgZT0oKG5ldyBEYXRlKS5nZXRUaW1lKCktdGhpcy5fc3RhcnRUaW1lKS8xZTM7cmV0dXJue3g6dGhpcy5fc3ByaW5nWC54KGUpLHk6dGhpcy5fc3ByaW5nWS54KGUpLHNjYWxlOnRoaXMuX3NwcmluZ1NjYWxlLngoZSl9fSxTVEQucHJvdG90eXBlLmRvbmU9ZnVuY3Rpb24oKXt2YXIgZT0obmV3IERhdGUpLmdldFRpbWUoKTtyZXR1cm4gdGhpcy5fc3ByaW5nWC5kb25lKGUpJiZ0aGlzLl9zcHJpbmdZLmRvbmUoZSkmJnRoaXMuX3NwcmluZ1NjYWxlLmRvbmUoZSl9LFNURC5wcm90b3R5cGUucmVjb25maWd1cmU9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuX3NwcmluZ1gucmVjb25maWd1cmUoZSx0LG4pLHRoaXMuX3NwcmluZ1kucmVjb25maWd1cmUoZSx0LG4pLHRoaXMuX3NwcmluZ1NjYWxlLnJlY29uZmlndXJlKGUsdCxuKX07dmFyIHJlcXVlc3Rpbmc9ITE7ZnVuY3Rpb24gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUpe3JldHVybiBzZXRUaW1lb3V0KGUsMTYpfWZ1bmN0aW9uIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGUpe2NsZWFyVGltZW91dChlKX1mdW5jdGlvbiBfcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUpe3JlcXVlc3Rpbmd8fChyZXF1ZXN0aW5nPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe2UoKSxyZXF1ZXN0aW5nPSExfSkpfWZ1bmN0aW9uIHYoZSx0KXtyZXR1cm4rKCgxZTMqZS0xZTMqdCkvMWUzKS50b0ZpeGVkKDEpfWZ1bmN0aW9uIGcoYSxlLHQpe3ZhciBuPXtpZDowLGNhbmNlbGxlZDohMX07cmV0dXJuIGZ1bmN0aW9uIGUodCxuLHIsaSl7aWYoIXR8fCF0LmNhbmNlbGxlZCl7cihuKTt2YXIgbz1hLmRvbmUoKTtvfHx0LmNhbmNlbGxlZHx8KHQuaWQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUuYmluZChudWxsLHQsbixyLGkpKSksbyYmaSYmaShuKX19KG4sYSxlLHQpLHtjYW5jZWw6ZnVuY3Rpb24oZSl7ZSYmZS5pZCYmY2FuY2VsQW5pbWF0aW9uRnJhbWUoZS5pZCksZSYmKGUuY2FuY2VsbGVkPSEwKX0uYmluZChudWxsLG4pLG1vZGVsOmF9fWZ1bmN0aW9uIGdldE1vdmFibGVWaWV3KGUpe3ZhciB0PWUucmVxdWlyZU1vZHVsZSgiZG9tIikscz1lLnJlcXVpcmVNb2R1bGUoImFuaW1hdGlvbiIpO3JldHVybntuYW1lOiJNb3ZhYmxlVmlldyIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W3RvdWNodHJhY2ssZW1pdHRlcl0scHJvcHM6e2RpcmVjdGlvbjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoibm9uZSJ9LGluZXJ0aWE6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxvdXRPZkJvdW5kczp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LHg6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MH0seTp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfSxkYW1waW5nOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjIwfSxmcmljdGlvbjp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoyfSxkaXNhYmxlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LHNjYWxlOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sc2NhbGVNaW46e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6LjV9LHNjYWxlTWF4Ont0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjEwfSxzY2FsZVZhbHVlOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjF9LGFuaW1hdGlvbjp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITB9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3hTeW5jOnRoaXMuX2dldFB4KHRoaXMueCkseVN5bmM6dGhpcy5fZ2V0UHgodGhpcy55KSxzY2FsZVZhbHVlU3luYzp0aGlzLl9nZXRTY2FsZU51bWJlcih0aGlzLnNjYWxlVmFsdWUpLHdpZHRoOjAsaGVpZ2h0OjAsbWluWDowLG1pblk6MCxtYXhYOjAsbWF4WTowfX0sY29tcHV0ZWQ6e2RhbXBpbmdOdW1iZXI6ZnVuY3Rpb24oKXt2YXIgZT1OdW1iZXIodGhpcy5kYW1waW5nKTtyZXR1cm4gaXNOYU4oZSk/MjA6ZX0sZnJpY3Rpb25OdW1iZXI6ZnVuY3Rpb24oKXt2YXIgZT1OdW1iZXIodGhpcy5mcmljdGlvbik7cmV0dXJuIGlzTmFOKGUpfHxlPD0wPzI6ZX0sc2NhbGVNaW5OdW1iZXI6ZnVuY3Rpb24oKXt2YXIgZT1OdW1iZXIodGhpcy5zY2FsZU1pbik7cmV0dXJuIGlzTmFOKGUpPy41OmV9LHNjYWxlTWF4TnVtYmVyOmZ1bmN0aW9uKCl7dmFyIGU9TnVtYmVyKHRoaXMuc2NhbGVNYXgpO3JldHVybiBpc05hTihlKT8xMDplfSx4TW92ZTpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5kaXJlY3Rpb258fCJob3Jpem9udGFsIj09PXRoaXMuZGlyZWN0aW9ufSx5TW92ZTpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy5kaXJlY3Rpb258fCJ2ZXJ0aWNhbCI9PT10aGlzLmRpcmVjdGlvbn19LHdhdGNoOnt4OmZ1bmN0aW9uKGUpe3RoaXMueFN5bmM9dGhpcy5fZ2V0UHgoZSl9LHhTeW5jOmZ1bmN0aW9uKGUpe3RoaXMuX3NldFgoZSl9LHk6ZnVuY3Rpb24oZSl7dGhpcy55U3luYz10aGlzLl9nZXRQeChlKX0seVN5bmM6ZnVuY3Rpb24oZSl7dGhpcy5fc2V0WShlKX0sc2NhbGVWYWx1ZTpmdW5jdGlvbihlKXt0aGlzLl9zZXRTY2FsZVZhbHVlKHRoaXMuX2dldFNjYWxlTnVtYmVyKGUpKX0sc2NhbGVWYWx1ZVN5bmM6ZnVuY3Rpb24oZSl7dGhpcy5fc2V0U2NhbGVWYWx1ZShlKX0sc2NhbGVNaW5OdW1iZXI6ZnVuY3Rpb24oKXt0aGlzLl9zZXRTY2FsZU1pbk9yTWF4KCl9LHNjYWxlTWF4TnVtYmVyOmZ1bmN0aW9uKCl7dGhpcy5fc2V0U2NhbGVNaW5Pck1heCgpfX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX29mZnNldD17eDowLHk6MH0sdGhpcy5fc2NhbGVPZmZzZXQ9e3g6MCx5OjB9LHRoaXMuX3RyYW5zbGF0ZVg9MCx0aGlzLl90cmFuc2xhdGVZPTAsdGhpcy5fc2NhbGU9MSx0aGlzLl9vbGRTY2FsZT0xLHRoaXMuX1NURD1uZXcgU1REKDEsOSpNYXRoLnBvdyh0aGlzLmRhbXBpbmdOdW1iZXIsMikvNDAsdGhpcy5kYW1waW5nTnVtYmVyKSx0aGlzLl9mcmljdGlvbj1uZXcgRnJpY3Rpb24oMSx0aGlzLmZyaWN0aW9uTnVtYmVyKSx0aGlzLl9kZWNsaW5lWD1uZXcgRGVjbGluZSx0aGlzLl9kZWNsaW5lWT1uZXcgRGVjbGluZSx0aGlzLl9fdG91Y2hJbmZvPXtoaXN0b3J5WDpbMCwwXSxoaXN0b3J5WTpbMCwwXSxoaXN0b3J5VDpbMCwwXX0sdGhpcy5fcmVjdD17dG9wOjAsbGVmdDowLHdpZHRoOjAsaGVpZ2h0OjB9fSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLnRvdWNodHJhY2soIl9vblRyYWNrIiksc2V0VGltZW91dChmdW5jdGlvbigpe2UuX3VwZGF0ZVJlY3QoKS50aGVuKGZ1bmN0aW9uKCl7ZS5zZXRQYXJlbnQoKX0pfSwxMDApLHRoaXMuX2ZyaWN0aW9uLnJlY29uZmlndXJlKDEsdGhpcy5mcmljdGlvbk51bWJlciksdGhpcy5fU1RELnJlY29uZmlndXJlKDEsOSpNYXRoLnBvdyh0aGlzLmRhbXBpbmdOdW1iZXIsMikvNDAsdGhpcy5kYW1waW5nTnVtYmVyKX0sbWV0aG9kczp7X2dldFB4OmZ1bmN0aW9uKGUpe3JldHVybiBOdW1iZXIoZSl8fDB9LF9nZXRTY2FsZU51bWJlcjpmdW5jdGlvbihlKXtyZXR1cm4gZT1OdW1iZXIoZSksaXNOYU4oZSk/MTplfSxfc2V0WDpmdW5jdGlvbihlKXtpZih0aGlzLnhNb3ZlKXtpZihlK3RoaXMuX3NjYWxlT2Zmc2V0Lng9PT10aGlzLl90cmFuc2xhdGVYKXJldHVybiB0aGlzLl90cmFuc2xhdGVYO3RoaXMuX1NGQSYmdGhpcy5fU0ZBLmNhbmNlbCgpLHRoaXMuX2FuaW1hdGlvblRvKGUrdGhpcy5fc2NhbGVPZmZzZXQueCx0aGlzLnlTeW5jK3RoaXMuX3NjYWxlT2Zmc2V0LnksdGhpcy5fc2NhbGUpfXJldHVybiBlfSxfc2V0WTpmdW5jdGlvbihlKXtpZih0aGlzLnlNb3ZlKXtpZihlK3RoaXMuX3NjYWxlT2Zmc2V0Lnk9PT10aGlzLl90cmFuc2xhdGVZKXJldHVybiB0aGlzLl90cmFuc2xhdGVZO3RoaXMuX1NGQSYmdGhpcy5fU0ZBLmNhbmNlbCgpLHRoaXMuX2FuaW1hdGlvblRvKHRoaXMueFN5bmMrdGhpcy5fc2NhbGVPZmZzZXQueCxlK3RoaXMuX3NjYWxlT2Zmc2V0LnksdGhpcy5fc2NhbGUpfXJldHVybiBlfSxfc2V0U2NhbGVNaW5Pck1heDpmdW5jdGlvbigpe2lmKCF0aGlzLnNjYWxlKXJldHVybiExO3RoaXMuX3VwZGF0ZVNjYWxlKHRoaXMuX3NjYWxlLCEwKSx0aGlzLl91cGRhdGVPbGRTY2FsZSh0aGlzLl9zY2FsZSl9LF9zZXRTY2FsZVZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiEhdGhpcy5zY2FsZSYmKGU9dGhpcy5fYWRqdXN0U2NhbGUoZSksdGhpcy5fdXBkYXRlU2NhbGUoZSwhMCksdGhpcy5fdXBkYXRlT2xkU2NhbGUoZSksZSl9LF9faGFuZGxlVG91Y2hTdGFydDpmdW5jdGlvbigpe3RoaXMuX2lzU2NhbGluZ3x8dGhpcy5kaXNhYmxlZHx8KHRoaXMuX0ZBJiZ0aGlzLl9GQS5jYW5jZWwoKSx0aGlzLl9TRkEmJnRoaXMuX1NGQS5jYW5jZWwoKSx0aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlYPVswLDBdLHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVk9WzAsMF0sdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5VD1bMCwwXSx0aGlzLnhNb3ZlJiYodGhpcy5fX2Jhc2VYPXRoaXMuX3RyYW5zbGF0ZVgpLHRoaXMueU1vdmUmJih0aGlzLl9fYmFzZVk9dGhpcy5fdHJhbnNsYXRlWSksdGhpcy5fY2hlY2tDYW5Nb3ZlPW51bGwsdGhpcy5fZmlyc3RNb3ZlRGlyZWN0aW9uPW51bGwsdGhpcy5faXNUb3VjaGluZz0hMCl9LF9faGFuZGxlVG91Y2hNb3ZlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aWYoIXRoaXMuX2lzU2NhbGluZyYmIXRoaXMuZGlzYWJsZWQmJnRoaXMuX2lzVG91Y2hpbmcpe3ZhciBuPXRoaXMuX3RyYW5zbGF0ZVgscj10aGlzLl90cmFuc2xhdGVZO2lmKG51bGw9PT10aGlzLl9maXJzdE1vdmVEaXJlY3Rpb24mJih0aGlzLl9maXJzdE1vdmVEaXJlY3Rpb249MTxNYXRoLmFicyhlLmRldGFpbC5keC9lLmRldGFpbC5keSk/Imh0b3VjaG1vdmUiOiJ2dG91Y2htb3ZlIiksdGhpcy54TW92ZSYmKG49ZS5kZXRhaWwuZHgrdGhpcy5fX2Jhc2VYLHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVguc2hpZnQoKSx0aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlYLnB1c2gobiksdGhpcy55TW92ZXx8bnVsbCE9PXRoaXMuX2NoZWNrQ2FuTW92ZXx8KHRoaXMuX2NoZWNrQ2FuTW92ZT1NYXRoLmFicyhlLmRldGFpbC5keC9lLmRldGFpbC5keSk8MSkpLHRoaXMueU1vdmUmJihyPWUuZGV0YWlsLmR5K3RoaXMuX19iYXNlWSx0aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlZLnNoaWZ0KCksdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5WS5wdXNoKHIpLHRoaXMueE1vdmV8fG51bGwhPT10aGlzLl9jaGVja0Nhbk1vdmV8fCh0aGlzLl9jaGVja0Nhbk1vdmU9TWF0aC5hYnMoZS5kZXRhaWwuZHkvZS5kZXRhaWwuZHgpPDEpKSx0aGlzLl9fdG91Y2hJbmZvLmhpc3RvcnlULnNoaWZ0KCksdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5VC5wdXNoKGUuZGV0YWlsLnRpbWVTdGFtcCksIXRoaXMuX2NoZWNrQ2FuTW92ZSl7dmFyIGk9InRvdWNoIjtuPHRoaXMubWluWD90aGlzLm91dE9mQm91bmRzPyhpPSJ0b3VjaC1vdXQtb2YtYm91bmRzIixuPXRoaXMubWluWC10aGlzLl9kZWNsaW5lWC54KHRoaXMubWluWC1uKSk6bj10aGlzLm1pblg6bj50aGlzLm1heFgmJih0aGlzLm91dE9mQm91bmRzPyhpPSJ0b3VjaC1vdXQtb2YtYm91bmRzIixuPXRoaXMubWF4WCt0aGlzLl9kZWNsaW5lWC54KG4tdGhpcy5tYXhYKSk6bj10aGlzLm1heFgpLHI8dGhpcy5taW5ZP3RoaXMub3V0T2ZCb3VuZHM/KGk9InRvdWNoLW91dC1vZi1ib3VuZHMiLHI9dGhpcy5taW5ZLXRoaXMuX2RlY2xpbmVZLngodGhpcy5taW5ZLXIpKTpyPXRoaXMubWluWTpyPnRoaXMubWF4WSYmKHRoaXMub3V0T2ZCb3VuZHM/KGk9InRvdWNoLW91dC1vZi1ib3VuZHMiLHI9dGhpcy5tYXhZK3RoaXMuX2RlY2xpbmVZLngoci10aGlzLm1heFkpKTpyPXRoaXMubWF4WSksX3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3QuX3NldFRyYW5zZm9ybShuLHIsdC5fc2NhbGUsaSl9KX19fSxfX2hhbmRsZVRvdWNoRW5kOmZ1bmN0aW9uKCl7dmFyIHI9dGhpcztpZighdGhpcy5faXNTY2FsaW5nJiYhdGhpcy5kaXNhYmxlZCYmdGhpcy5faXNUb3VjaGluZyYmKHRoaXMuX2lzVG91Y2hpbmc9ITEsIXRoaXMuX2NoZWNrQ2FuTW92ZSYmIXRoaXMuX3JldmlzZSgib3V0LW9mLWJvdW5kcyIpJiZ0aGlzLmluZXJ0aWEpKXt2YXIgZT0xZTMqKHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVhbMV0tdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5WFswXSkvKHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVRbMV0tdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5VFswXSksdD0xZTMqKHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVlbMV0tdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5WVswXSkvKHRoaXMuX190b3VjaEluZm8uaGlzdG9yeVRbMV0tdGhpcy5fX3RvdWNoSW5mby5oaXN0b3J5VFswXSk7dGhpcy5fZnJpY3Rpb24uc2V0VihlLHQpLHRoaXMuX2ZyaWN0aW9uLnNldFModGhpcy5fdHJhbnNsYXRlWCx0aGlzLl90cmFuc2xhdGVZKTt2YXIgbj10aGlzLl9mcmljdGlvbi5kZWx0YSgpLngsaT10aGlzLl9mcmljdGlvbi5kZWx0YSgpLnksbz1uK3RoaXMuX3RyYW5zbGF0ZVgsYT1pK3RoaXMuX3RyYW5zbGF0ZVk7bzx0aGlzLm1pblg/KG89dGhpcy5taW5YLGE9dGhpcy5fdHJhbnNsYXRlWSsodGhpcy5taW5YLXRoaXMuX3RyYW5zbGF0ZVgpKmkvbik6bz50aGlzLm1heFgmJihvPXRoaXMubWF4WCxhPXRoaXMuX3RyYW5zbGF0ZVkrKHRoaXMubWF4WC10aGlzLl90cmFuc2xhdGVYKSppL24pLGE8dGhpcy5taW5ZPyhhPXRoaXMubWluWSxvPXRoaXMuX3RyYW5zbGF0ZVgrKHRoaXMubWluWS10aGlzLl90cmFuc2xhdGVZKSpuL2kpOmE+dGhpcy5tYXhZJiYoYT10aGlzLm1heFksbz10aGlzLl90cmFuc2xhdGVYKyh0aGlzLm1heFktdGhpcy5fdHJhbnNsYXRlWSkqbi9pKSx0aGlzLl9mcmljdGlvbi5zZXRFbmQobyxhKSx0aGlzLl9GQT1nKHRoaXMuX2ZyaWN0aW9uLGZ1bmN0aW9uKCl7dmFyIGU9ci5fZnJpY3Rpb24ucygpLHQ9ZS54LG49ZS55O3IuX3NldFRyYW5zZm9ybSh0LG4sci5fc2NhbGUsImZyaWN0aW9uIil9LGZ1bmN0aW9uKCl7ci5fRkEuY2FuY2VsKCl9KX19LF9vblRyYWNrOmZ1bmN0aW9uKGUpe3N3aXRjaChlLmRldGFpbC5zdGF0ZSl7Y2FzZSJzdGFydCI6dGhpcy5fX2hhbmRsZVRvdWNoU3RhcnQoKTticmVhaztjYXNlIm1vdmUiOnRoaXMuX19oYW5kbGVUb3VjaE1vdmUoZSk7YnJlYWs7Y2FzZSJlbmQiOnRoaXMuX19oYW5kbGVUb3VjaEVuZCgpfX0sX2dldExpbWl0WFk6ZnVuY3Rpb24oZSx0KXt2YXIgbj0hMTtyZXR1cm4gZT50aGlzLm1heFg/KGU9dGhpcy5tYXhYLG49ITApOmU8dGhpcy5taW5YJiYoZT10aGlzLm1pblgsbj0hMCksdD50aGlzLm1heFk/KHQ9dGhpcy5tYXhZLG49ITApOnQ8dGhpcy5taW5ZJiYodD10aGlzLm1pblksbj0hMCkse3g6ZSx5OnQsb3V0T2ZCb3VuZHM6bn19LHNldFBhcmVudDpmdW5jdGlvbigpe2lmKHRoaXMuJHBhcmVudC5fX2lzTW91bnRlZCl7dGhpcy5fRkEmJnRoaXMuX0ZBLmNhbmNlbCgpLHRoaXMuX1NGQSYmdGhpcy5fU0ZBLmNhbmNlbCgpO3ZhciBlPXRoaXMuc2NhbGU/dGhpcy5zY2FsZVZhbHVlU3luYzoxO3RoaXMuX3VwZGF0ZU9mZnNldCgpLHRoaXMuX3VwZGF0ZVdIKGUpLHRoaXMuX3VwZGF0ZUJvdW5kYXJ5KCksdGhpcy5fdHJhbnNsYXRlWD10aGlzLnhTeW5jK3RoaXMuX3NjYWxlT2Zmc2V0LngsdGhpcy5fdHJhbnNsYXRlWT10aGlzLnlTeW5jK3RoaXMuX3NjYWxlT2Zmc2V0Lnk7dmFyIHQ9dGhpcy5fZ2V0TGltaXRYWSh0aGlzLl90cmFuc2xhdGVYLHRoaXMuX3RyYW5zbGF0ZVkpLG49dC54LHI9dC55O3RoaXMuX3NldFRyYW5zZm9ybShuLHIsZSwiIiwhMCksdGhpcy5fdXBkYXRlT2xkU2NhbGUoZSl9fSxfdXBkYXRlT2Zmc2V0OmZ1bmN0aW9uKCl7dGhpcy5fb2Zmc2V0Lng9dGhpcy5fcmVjdC5sZWZ0LXRoaXMuJHBhcmVudC5sZWZ0LHRoaXMuX29mZnNldC55PXRoaXMuX3JlY3QudG9wLXRoaXMuJHBhcmVudC50b3B9LF91cGRhdGVXSDpmdW5jdGlvbihlKXtlPWV8fHRoaXMuX3NjYWxlLGU9dGhpcy5fYWRqdXN0U2NhbGUoZSk7dmFyIHQ9dGhpcy5fcmVjdDt0aGlzLmhlaWdodD10LmhlaWdodC90aGlzLl9zY2FsZSx0aGlzLndpZHRoPXQud2lkdGgvdGhpcy5fc2NhbGU7dmFyIG49dGhpcy5oZWlnaHQqZSxyPXRoaXMud2lkdGgqZTt0aGlzLl9zY2FsZU9mZnNldC54PShyLXRoaXMud2lkdGgpLzIsdGhpcy5fc2NhbGVPZmZzZXQueT0obi10aGlzLmhlaWdodCkvMn0sX3VwZGF0ZUJvdW5kYXJ5OmZ1bmN0aW9uKCl7dmFyIGU9MC10aGlzLl9vZmZzZXQueCt0aGlzLl9zY2FsZU9mZnNldC54LHQ9dGhpcy4kcGFyZW50LndpZHRoLXRoaXMud2lkdGgtdGhpcy5fb2Zmc2V0LngtdGhpcy5fc2NhbGVPZmZzZXQueDt0aGlzLm1pblg9TWF0aC5taW4oZSx0KSx0aGlzLm1heFg9TWF0aC5tYXgoZSx0KTt2YXIgbj0wLXRoaXMuX29mZnNldC55K3RoaXMuX3NjYWxlT2Zmc2V0Lnkscj10aGlzLiRwYXJlbnQuaGVpZ2h0LXRoaXMuaGVpZ2h0LXRoaXMuX29mZnNldC55LXRoaXMuX3NjYWxlT2Zmc2V0Lnk7dGhpcy5taW5ZPU1hdGgubWluKG4sciksdGhpcy5tYXhZPU1hdGgubWF4KG4scil9LF9iZWdpblNjYWxlOmZ1bmN0aW9uKCl7dGhpcy5faXNTY2FsaW5nPSEwfSxfZW5kU2NhbGU6ZnVuY3Rpb24oKXt0aGlzLl9pc1NjYWxpbmc9ITEsdGhpcy5fdXBkYXRlT2xkU2NhbGUodGhpcy5fc2NhbGUpfSxfc2V0U2NhbGU6ZnVuY3Rpb24oZSl7dGhpcy5zY2FsZSYmKGU9dGhpcy5fYWRqdXN0U2NhbGUoZSksZT10aGlzLl9vbGRTY2FsZSplLHRoaXMuX2JlZ2luU2NhbGUoKSx0aGlzLl91cGRhdGVTY2FsZShlKSl9LF91cGRhdGVTY2FsZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7aWYodGhpcy5zY2FsZSl7ZT10aGlzLl9hZGp1c3RTY2FsZShlKSx0aGlzLl91cGRhdGVXSChlKSx0aGlzLl91cGRhdGVCb3VuZGFyeSgpO3ZhciByPXRoaXMuX2dldExpbWl0WFkodGhpcy5fdHJhbnNsYXRlWCx0aGlzLl90cmFuc2xhdGVZKSxpPXIueCxvPXIueTt0P3RoaXMuX2FuaW1hdGlvblRvKGksbyxlLCIiLCEwLCEwKTpfcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7bi5fc2V0VHJhbnNmb3JtKGksbyxlLCIiLCEwLCEwKX0pfX0sX3VwZGF0ZU9sZFNjYWxlOmZ1bmN0aW9uKGUpe3RoaXMuX29sZFNjYWxlPWV9LF9hZGp1c3RTY2FsZTpmdW5jdGlvbihlKXtyZXR1cm4gZT1NYXRoLm1heCguNSx0aGlzLnNjYWxlTWluTnVtYmVyLGUpLGU9TWF0aC5taW4oMTAsdGhpcy5zY2FsZU1heE51bWJlcixlKX0sX2FuaW1hdGlvblRvOmZ1bmN0aW9uKGUsdCxuLGksbyxhKXt2YXIgcz10aGlzO3RoaXMuX0ZBJiZ0aGlzLl9GQS5jYW5jZWwoKSx0aGlzLl9TRkEmJnRoaXMuX1NGQS5jYW5jZWwoKSx0aGlzLnhNb3ZlfHwoZT10aGlzLl90cmFuc2xhdGVYKSx0aGlzLnlNb3ZlfHwodD10aGlzLl90cmFuc2xhdGVZKSx0aGlzLnNjYWxlfHwobj10aGlzLl9zY2FsZSk7dmFyIHI9dGhpcy5fZ2V0TGltaXRYWShlLHQpO2U9ci54LHQ9ci55LHRoaXMuYW5pbWF0aW9uPyh0aGlzLl9TVEQuX3NwcmluZ1guX3NvbHV0aW9uPW51bGwsdGhpcy5fU1RELl9zcHJpbmdZLl9zb2x1dGlvbj1udWxsLHRoaXMuX1NURC5fc3ByaW5nU2NhbGUuX3NvbHV0aW9uPW51bGwsdGhpcy5fU1RELl9zcHJpbmdYLl9lbmRQb3NpdGlvbj10aGlzLl90cmFuc2xhdGVYLHRoaXMuX1NURC5fc3ByaW5nWS5fZW5kUG9zaXRpb249dGhpcy5fdHJhbnNsYXRlWSx0aGlzLl9TVEQuX3NwcmluZ1NjYWxlLl9lbmRQb3NpdGlvbj10aGlzLl9zY2FsZSx0aGlzLl9TVEQuc2V0RW5kKGUsdCxuLDEpLHRoaXMuX1NGQT1nKHRoaXMuX1NURCxmdW5jdGlvbigpe3ZhciBlPXMuX1NURC54KCksdD1lLngsbj1lLnkscj1lLnNjYWxlO3MuX3NldFRyYW5zZm9ybSh0LG4scixpLG8sYSl9LGZ1bmN0aW9uKCl7cy5fU0ZBLmNhbmNlbCgpfSkpOnRoaXMuX3NldFRyYW5zZm9ybShlLHQsbixpLG8sYSl9LF9yZXZpc2U6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZ2V0TGltaXRYWSh0aGlzLl90cmFuc2xhdGVYLHRoaXMuX3RyYW5zbGF0ZVkpLG49dC54LHI9dC55LGk9dC5vdXRPZkJvdW5kcztyZXR1cm4gaSYmdGhpcy5fYW5pbWF0aW9uVG8obixyLHRoaXMuX3NjYWxlLGUpLGl9LF9zZXRUcmFuc2Zvcm06ZnVuY3Rpb24oZSx0LG4scixpLG8pe3ZvaWQgMD09PXImJihyPSIiKSxudWxsIT09ZSYmIk5hTiIhPT1lLnRvU3RyaW5nKCkmJiJudW1iZXIiPT10eXBlb2YgZXx8KGU9dGhpcy5fdHJhbnNsYXRlWHx8MCksbnVsbCE9PXQmJiJOYU4iIT09dC50b1N0cmluZygpJiYibnVtYmVyIj09dHlwZW9mIHR8fCh0PXRoaXMuX3RyYW5zbGF0ZVl8fDApLGU9TnVtYmVyKGUudG9GaXhlZCgxKSksdD1OdW1iZXIodC50b0ZpeGVkKDEpKSxuPU51bWJlcihuLnRvRml4ZWQoMSkpLHRoaXMuX3RyYW5zbGF0ZVg9PT1lJiZ0aGlzLl90cmFuc2xhdGVZPT09dHx8aXx8dGhpcy4kdHJpZ2dlcigiY2hhbmdlIix7eDp2KGUsdGhpcy5fc2NhbGVPZmZzZXQueCkseTp2KHQsdGhpcy5fc2NhbGVPZmZzZXQueSksc291cmNlOnJ9KSx0aGlzLnNjYWxlfHwobj10aGlzLl9zY2FsZSksbj0rKG49dGhpcy5fYWRqdXN0U2NhbGUobikpLnRvRml4ZWQoMyksbyYmbiE9PXRoaXMuX3NjYWxlJiZ0aGlzLiR0cmlnZ2VyKCJzY2FsZSIse3g6ZSx5OnQsc2NhbGU6bn0pO3ZhciBhPSJ0cmFuc2xhdGUoIitlKyJweCwgIit0KyJweCkgc2NhbGUoIituKyIpIjtzLnRyYW5zaXRpb24odGhpcy4kcmVmcy5lbCx7c3R5bGVzOnt0cmFuc2Zvcm06YX0sZHVyYXRpb246MCxkZWxheTowfSksdGhpcy5fdHJhbnNsYXRlWD1lLHRoaXMuX3RyYW5zbGF0ZVk9dCx0aGlzLl9zY2FsZT1ufSxfdG91Y2hzdGFydDpmdW5jdGlvbigpe3RoaXMuJHBhcmVudC50b3VjaEl0ZW09dGhpc30sX2dldENvbXBvbmVudFNpemU6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKG4pe3QuZ2V0Q29tcG9uZW50UmVjdChlLGZ1bmN0aW9uKGUpe3ZhciB0PWUuc2l6ZTtuKHQpfSl9KX0sX3VwZGF0ZVJlY3Q6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiB0aGlzLl9nZXRDb21wb25lbnRTaXplKHRoaXMuJHJlZnMuZWwpLnRoZW4oZnVuY3Rpb24oZSl7dC5fcmVjdD1lfSl9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9e3RvdWNoc3RhcnQ6dGhpcy5fdG91Y2hzdGFydH07cmV0dXJuIGUoImRpdiIsdGhpcy5fZyh7cmVmOiJlbCIsb246dCxzdGF0aWNDbGFzczpbInVuaS1tb3ZhYmxlLXZpZXciXSxzdGF0aWNTdHlsZTp7dHJhbnNmb3JtT3JpZ2luOiJjZW50ZXIifSxhdHRyczp7cHJldmVudEdlc3R1cmU6ITB9fSx0aGlzLiRsaXN0ZW5lcnMpLHRoaXMuJHNsb3RzLmRlZmF1bHQsMil9LHN0eWxlOnsidW5pLW1vdmFibGUtdmlldyI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOiIwcHgiLGxlZnQ6IjBweCIsd2lkdGg6IjEwcHgiLGhlaWdodDoiMTBweCJ9fX19ZnVuY3Rpb24gaW5pdCQxMihlLHQpe2UuY29tcG9uZW50KCJtb3ZhYmxlLXZpZXciLGdldE1vdmFibGVWaWV3KHQpKX12YXIgT1BFTl9UWVBFUyQxPXtuYXZpZ2F0ZToibmF2aWdhdGVUbyIscmVkaXJlY3Q6InJlZGlyZWN0VG8iLHN3aXRjaFRhYjoic3dpdGNoVGFiIixyZUxhdW5jaDoicmVMYXVuY2giLG5hdmlnYXRlQmFjazoibmF2aWdhdGVCYWNrIn0sQU5JTUFUSU9OX1RZUEVfSU49WyJzbGlkZS1pbi1yaWdodCIsInNsaWRlLWluLWxlZnQiLCJzbGlkZS1pbi10b3AiLCJzbGlkZS1pbi1ib3R0b20iLCJmYWRlLWluIiwiem9vbS1vdXQiLCJ6b29tLWZhZGUtb3V0IiwicG9wLWluIiwibm9uZSJdLEFOSU1BVElPTl9UWVBFX09VVD1bInNsaWRlLW91dC1yaWdodCIsInNsaWRlLW91dC1sZWZ0Iiwic2xpZGUtb3V0LXRvcCIsInNsaWRlLW91dC1ib3R0b20iLCJmYWRlLW91dCIsInpvb20taW4iLCJ6b29tLWZhZGUtaW4iLCJwb3Atb3V0Iiwibm9uZSJdLHBsdXNfLEJyb2FkY2FzdENoYW5uZWxfLGNoYW5uZWw7ZnVuY3Rpb24gZ2V0TmF2aWdhdG9yKGUsdCl7cmV0dXJue25hbWU6Ik5hdmlnYXRvciIsaXNSZXNlcnZlZDohMCxwcm9wczp7dXJsOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxvcGVuVHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoibmF2aWdhdGUiLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm4hIU9QRU5fVFlQRVMkMVtlXX19LGRlbHRhOnt0eXBlOk51bWJlcixkZWZhdWx0OjF9LGFuaW1hdGlvblR5cGU6e3R5cGU6U3RyaW5nLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm4hZXx8fkFOSU1BVElPTl9UWVBFX0lOLmNvbmNhdChBTklNQVRJT05fVFlQRV9PVVQpLmluZGV4T2YoZSl9fSxhbmltYXRpb25EdXJhdGlvbjp7dHlwZTpbU3RyaW5nLE51bWJlcl0sZGVmYXVsdDozMDB9LGhvdmVyQ2xhc3M6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6Im5hdmlnYXRvci1ob3ZlciJ9LGhvdmVyU3RvcFByb3BhZ2F0aW9uOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0saG92ZXJTdGFydFRpbWU6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6NTB9LGhvdmVyU3RheVRpbWU6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6NjAwfX0sbWV0aG9kczp7X2NsaWNrOmZ1bmN0aW9uKCl7aWYoIm5hdmlnYXRlQmFjayI9PT10aGlzLm9wZW5UeXBlfHx0aGlzLnVybCl7dmFyIGU9cGFyc2VJbnQodGhpcy5hbmltYXRpb25EdXJhdGlvbik7c3dpdGNoKHRoaXMub3BlblR5cGUpe2Nhc2UibmF2aWdhdGUiOnQubmF2aWdhdGVUbyh7dXJsOnRoaXMudXJsLGFuaW1hdGlvblR5cGU6dGhpcy5hbmltYXRpb25UeXBlfHwicG9wLWluIixhbmltYXRpb25EdXJhdGlvbjplfSk7YnJlYWs7Y2FzZSJyZWRpcmVjdCI6dC5yZWRpcmVjdFRvKHt1cmw6dGhpcy51cmx9KTticmVhaztjYXNlInN3aXRjaFRhYiI6dC5zd2l0Y2hUYWIoe3VybDp0aGlzLnVybH0pO2JyZWFrO2Nhc2UicmVMYXVuY2giOnQucmVMYXVuY2goe3VybDp0aGlzLnVybH0pO2JyZWFrO2Nhc2UibmF2aWdhdGVCYWNrIjp0Lm5hdmlnYXRlQmFjayh7ZGVsdGE6dGhpcy5kZWx0YSxhbmltYXRpb25UeXBlOnRoaXMuYW5pbWF0aW9uVHlwZXx8InBvcC1vdXQiLGFuaW1hdGlvbkR1cmF0aW9uOmV9KX19ZWxzZSBjb25zb2xlLmVycm9yKCI8bmF2aWdhdG9yLz4gc2hvdWxkIGhhdmUgdXJsIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIG5hdmlnYXRlVG8sIHJlZGlyZWN0VG8sIHJlTGF1bmNoIG9yIHN3aXRjaFRhYiIpfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlKCJ2aWV3Iix0aGlzLl9nKHthdHRyczp7aG92ZXJDbGFzczp0aGlzLmhvdmVyQ2xhc3MsaG92ZXJTdG9wUHJvcGFnYXRpb246dGhpcy5ob3ZlclN0b3BQcm9wYWdhdGlvbixob3ZlclN0YXJ0VGltZTp0aGlzLmhvdmVyU3RhcnRUaW1lLGhvdmVyU3RheVRpbWU6dGhpcy5ob3ZlclN0YXlUaW1lfSxvbjp7Y2xpY2s6dGhpcy5fY2xpY2t9fSx0aGlzLiRsaXN0ZW5lcnMpLFt0aGlzLl90KCJkZWZhdWx0IildLDIpfSxzdHlsZTp7Im5hdmlnYXRvci1ob3ZlciI6e2JhY2tncm91bmRDb2xvcjoicmdiYSgwLDAsMCwwLjEpIixvcGFjaXR5Oi43fX19fWZ1bmN0aW9uIGluaXQkMTMoZSx0LG4pe2UuY29tcG9uZW50KCJuYXZpZ2F0b3IiLGdldE5hdmlnYXRvcih0LG4udW5pKSl9ZnVuY3Rpb24gZ2V0UnVudGltZSgpe3JldHVybiJvYmplY3QiPT10eXBlb2Ygd2luZG93JiYib2JqZWN0Ij09dHlwZW9mIG5hdmlnYXRvciYmIm9iamVjdCI9PXR5cGVvZiBkb2N1bWVudD8id2VidmlldyI6InY4In1mdW5jdGlvbiBnZXRQYWdlSWQoKXtyZXR1cm4gcGx1c18ud2Vidmlldy5jdXJyZW50V2VidmlldygpLmlkfXZhciBjYWxsYmFja3M9e307ZnVuY3Rpb24gb25QbHVzTWVzc2FnZShlKXt2YXIgdD1lLmRhdGEmJmUuZGF0YS5fX21lc3NhZ2U7aWYodCYmdC5fX3BhZ2Upe3ZhciBuPXQuX19wYWdlLHI9Y2FsbGJhY2tzW25dO3ImJnIodCksdC5rZWVwfHxkZWxldGUgY2FsbGJhY2tzW25dfX1mdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKGUsdCl7InY4Ij09PWdldFJ1bnRpbWUoKT8oY2hhbm5lbCYmY2hhbm5lbC5jbG9zZSgpLChjaGFubmVsPW5ldyBCcm9hZGNhc3RDaGFubmVsXyhnZXRQYWdlSWQoKSkpLm9ubWVzc2FnZT1vblBsdXNNZXNzYWdlKTp3aW5kb3cuX19wbHVzTWVzc2FnZT1vblBsdXNNZXNzYWdlLGNhbGxiYWNrc1tlXT10fXZhciBQYWdlPWZ1bmN0aW9uKGUpe3RoaXMud2Vidmlldz1lfTtmdW5jdGlvbiBzaG93UGFnZShlKXt2YXIgdD1lLmNvbnRleHQ7dm9pZCAwPT09dCYmKHQ9e30pO3ZhciBuPWUudXJsLHI9ZS5kYXRhO3ZvaWQgMD09PXImJihyPXt9KTt2YXIgaT1lLnN0eWxlO3ZvaWQgMD09PWkmJihpPXt9KTt2YXIgbz1lLm9uTWVzc2FnZSxhPWUub25DbG9zZTtwbHVzXz10LnBsdXN8fHBsdXMsQnJvYWRjYXN0Q2hhbm5lbF89dC5Ccm9hZGNhc3RDaGFubmVsfHxCcm9hZGNhc3RDaGFubmVsO3ZhciBzPSJwYWdlIitEYXRlLm5vdygpOyExIT09KGk9T2JqZWN0LmFzc2lnbih7fSxpKSkudGl0bGVOVmlldyYmIm5vbmUiIT09aS50aXRsZU5WaWV3JiYoaS50aXRsZU5WaWV3PU9iamVjdC5hc3NpZ24oe2F1dG9CYWNrQnV0dG9uOiEwLHRpdGxlU2l6ZToiMTdweCJ9LGkudGl0bGVOVmlldykpO3ZhciBjPXt0b3A6MCxib3R0b206MCx1c2luZ0NvbXBvbmVudHM6e30scG9wR2VzdHVyZToiY2xvc2UiLHNjcm9sbEluZGljYXRvcjoibm9uZSIsYW5pbWF0aW9uVHlwZToicG9wLWluIixhbmltYXRpb25EdXJhdGlvbjoyMDAsdW5pTlZpZXc6e3BhdGg6KCJvYmplY3QiPT10eXBlb2YgcHJvY2VzcyYmcHJvY2Vzcy5lbnYmJnByb2Nlc3MuZW52LlZVRV9BUFBfVEVNUExBVEVfUEFUSHx8IiIpKyIvIituKyIuanMiLGRlZmF1bHRGb250U2l6ZToxNix2aWV3cG9ydDpwbHVzXy5zY3JlZW4ucmVzb2x1dGlvbldpZHRofX07aT1PYmplY3QuYXNzaWduKGMsaSk7dmFyIHU9cGx1c18ud2Vidmlldy5jcmVhdGUoIiIscyxpLHtleHRyYXM6e2Zyb206Z2V0UGFnZUlkKCkscnVudGltZTpnZXRSdW50aW1lKCksZGF0YTpyfX0pO3JldHVybiB1LmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIixhKSxhZGRFdmVudExpc3RlbmVyKHMsZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oZS5kYXRhKSxlLmtlZXB8fHUuY2xvc2UoImF1dG8iKX0pLHUuc2hvdyhpLmFuaW1hdGlvblR5cGUsaS5hbmltYXRpb25EdXJhdGlvbiksbmV3IFBhZ2UodSl9ZnVuY3Rpb24gZ2V0UGlja2VyKGUsdCl7dmFyIG89e1NFTEVDVE9SOiJzZWxlY3RvciIsTVVMVElTRUxFQ1RPUjoibXVsdGlTZWxlY3RvciIsVElNRToidGltZSIsREFURToiZGF0ZSJ9LGE9e1lFQVI6InllYXIiLE1PTlRIOiJtb250aCIsREFZOiJkYXkifSxyPVsicmFuZ2UiLCJyYW5nZUtleSIsInZhbHVlIiwibW9kZSIsImZpZWxkcyIsInN0YXJ0IiwiZW5kIiwiZGlzYWJsZWQiXTtmdW5jdGlvbiBzKGUpe3JldHVybiA5PGU/ZToiMCIrZX1mdW5jdGlvbiBjKGUsdCl7dmFyIG49bmV3IERhdGU7cmV0dXJuIGU9U3RyaW5nKGV8fCIiKSx0PT09by5USU1FPzI9PT0oZT1lLnNwbGl0KCI6IikpLmxlbmd0aCYmbi5zZXRIb3VycyhwYXJzZUludChlWzBdKSxwYXJzZUludChlWzFdKSk6Mz09PShlPWUuc3BsaXQoIi0iKSkubGVuZ3RoJiZuLnNldEZ1bGxZZWFyKHBhcnNlSW50KGVbMF0pLHBhcnNlSW50KGVbMV0tMSkscGFyc2VJbnQoZVsyXSkpLG59cmV0dXJue25hbWU6IlBpY2tlciIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXJdLHByb3BzOntyYW5nZTp7dHlwZTpBcnJheSxkZWZhdWx0OmZ1bmN0aW9uKCl7cmV0dXJuW119fSxyYW5nZUtleTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sdmFsdWU6e3R5cGU6W051bWJlcixTdHJpbmcsQXJyYXldLGRlZmF1bHQ6MH0sbW9kZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDpvLlNFTEVDVE9SLHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm4gMDw9T2JqZWN0LnZhbHVlcyhvKS5pbmRleE9mKGUpfX0sZmllbGRzOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxzdGFydDp7dHlwZTpbU3RyaW5nLE51bWJlcl0sZGVmYXVsdDpmdW5jdGlvbigpe2lmKHRoaXMubW9kZT09PW8uVElNRSlyZXR1cm4iMDA6MDAiO2lmKHRoaXMubW9kZT09PW8uREFURSl7dmFyIGU9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLTEwMDtzd2l0Y2godGhpcy5maWVsZHMpe2Nhc2UgYS5ZRUFSOnJldHVybiBlO2Nhc2UgYS5NT05USDpyZXR1cm4gZSsiLTAxIjtkZWZhdWx0OnJldHVybiBlKyItMDEtMDEifX1yZXR1cm4iIn19LGVuZDp7dHlwZTpbU3RyaW5nLE51bWJlcl0sZGVmYXVsdDpmdW5jdGlvbigpe2lmKHRoaXMubW9kZT09PW8uVElNRSlyZXR1cm4iMjM6NTkiO2lmKHRoaXMubW9kZT09PW8uREFURSl7dmFyIGU9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpKzEwMDtzd2l0Y2godGhpcy5maWVsZHMpe2Nhc2UgYS5ZRUFSOnJldHVybiBlO2Nhc2UgYS5NT05USDpyZXR1cm4gZSsiLTEyIjtkZWZhdWx0OnJldHVybiBlKyItMTItMzEifX1yZXR1cm4iIn19LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX19LGNvbXB1dGVkOnthdHRyczpmdW5jdGlvbigpe3ZhciB0PXRoaXMsbj17fTtyZXR1cm4gci5mb3JFYWNoKGZ1bmN0aW9uKGUpe25bZV09dC4kcHJvcHNbZV19KSxufX0sbWV0aG9kczp7X3Nob3c6ZnVuY3Rpb24oKXt0aGlzLl9zaG93UGlja2VyKE9iamVjdC5hc3NpZ24oe30sdGhpcy5hdHRycykpfSxfc2hvd1BpY2tlcjpmdW5jdGlvbihuKXt2YXIgcj10aGlzLGU9dC5wbHVzfHxuZXcgdC5XZWV4UGx1cyh0LndlZXgpO2lmKGUua2V5LmhpZGVTb2Z0S2V5Ym9yZCgpLHRoaXMubW9kZSE9PW8uVElNRSYmdGhpcy5tb2RlIT09by5EQVRFfHxuLmZpZWxkcyl7bi5maWVsZHM9T2JqZWN0LnZhbHVlcyhhKS5pbmNsdWRlcyhuLmZpZWxkcyk/bi5maWVsZHM6YS5EQVk7dmFyIGk9e2V2ZW50OiJjYW5jZWwifTt0aGlzLnBhZ2U9c2hvd1BhZ2Uoe2NvbnRleHQ6T2JqZWN0LmFzc2lnbih7fSx0LHtwbHVzOmV9KSx1cmw6Il9fdW5pYXBwcGlja2VyIixkYXRhOm4sc3R5bGU6e3RpdGxlTlZpZXc6ITEsYW5pbWF0aW9uVHlwZToibm9uZSIsYW5pbWF0aW9uRHVyYXRpb246MCxiYWNrZ3JvdW5kOiJyZ2JhKDAsMCwwLDApIixwb3BHZXN0dXJlOiJub25lIn0sb25NZXNzYWdlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZXZlbnQ7aWYoImNyZWF0ZWQiIT09dClyZXR1cm4iY29sdW1uY2hhbmdlIj09PXQ/KGRlbGV0ZSBlLmV2ZW50LHZvaWQgci4kdHJpZ2dlcih0LGUpKTp2b2lkKGk9ZSk7ci5fdXBkYXRlUGlja2VyKG4pfSxvbkNsb3NlOmZ1bmN0aW9uKCl7ci5wYWdlPW51bGw7dmFyIGU9aS5ldmVudDtkZWxldGUgaS5ldmVudCxyLiR0cmlnZ2VyKGUsaSl9fSl9ZWxzZSBlLm5hdGl2ZVVJW3RoaXMubW9kZT09PW8uVElNRT8icGlja1RpbWUiOiJwaWNrRGF0ZSJdKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0ZTtyLiR0cmlnZ2VyKCJjaGFuZ2UiLHt2YWx1ZTpyLm1vZGU9PT1vLlRJTUU/cyh0LmdldEhvdXJzKCkpKyI6IitzKHQuZ2V0TWludXRlcygpKTp0LmdldEZ1bGxZZWFyKCkrIi0iK3ModC5nZXRNb250aCgpKzEpKyItIitzKHQuZ2V0RGF0ZSgpKX0pfSxmdW5jdGlvbigpe3IuJHRyaWdnZXIoImNhbmNlbCIse30pfSx0aGlzLm1vZGU9PT1vLlRJTUU/e3RpbWU6Yyh0aGlzLnZhbHVlLG8uVElNRSl9OntkYXRlOmModGhpcy52YWx1ZSxvLkRBVEUpLG1pbkRhdGU6Yyh0aGlzLnN0YXJ0LG8uREFURSksbWF4RGF0ZTpjKHRoaXMuZW5kLG8uREFURSl9KX0sX3VwZGF0ZVBpY2tlcjpmdW5jdGlvbihlKXt0aGlzLnBhZ2UmJnRoaXMucGFnZS5zZW5kTWVzc2FnZShlKX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuJHdhdGNoKCJhdHRycyIsZnVuY3Rpb24oZSl7dC5fdXBkYXRlUGlja2VyKGUpfSx7ZGVlcDohMH0pfSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIHRoaXMuZGlzYWJsZWR8fCh0LmNsaWNrPXRoaXMuX3Nob3cpLGUoImRpdiIsdGhpcy5fZyh7b246dH0sdGhpcy4kbGlzdGVuZXIpLHRoaXMuJHNsb3RzLmRlZmF1bHQsMil9fX1mdW5jdGlvbiBpbml0JDE0KGUsdCxuKXtlLmNvbXBvbmVudCgicGlja2VyIixnZXRQaWNrZXIodCxuKSl9UGFnZS5wcm90b3R5cGUuc2VuZE1lc3NhZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh7X19tZXNzYWdlOntkYXRhOmV9fSkpO25ldyBCcm9hZGNhc3RDaGFubmVsXyh0aGlzLndlYnZpZXcuaWQpLnBvc3RNZXNzYWdlKHQpfSxQYWdlLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe3RoaXMud2Vidmlldy5jbG9zZSgpfTt2YXIgUFJJTUFSWV9DT0xPUj0iIzAwN0FGRiIsQkFDS0dST1VORF9DT0xPUj0iI0VCRUJFQiIsQU5JTUFURV9JTlRFUlZBTF9ERUZBVUxUPTMwLEZPTlRfU0laRT0xNixTVFJPS0VfV0lEVEg9NjtmdW5jdGlvbiBnZXRQcm9ncmVzcyhlLG4pe3JldHVybntuYW1lOiJQcm9ncmVzcyIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXJdLHByb3BzOntwZXJjZW50Ont0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OjB9LHNob3dJbmZvOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sYm9yZGVyUmFkaXVzOnt0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OjB9LGZvbnRTaXplOnt0eXBlOltTdHJpbmcsTnVtYmVyXSxkZWZhdWx0OkZPTlRfU0laRX0sc3Ryb2tlV2lkdGg6e3R5cGU6W1N0cmluZyxOdW1iZXJdLGRlZmF1bHQ6U1RST0tFX1dJRFRIfSxhY3RpdmU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxhY3RpdmVDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDpQUklNQVJZX0NPTE9SfSxhY3RpdmVNb2RlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJiYWNrd2FyZHMifSxiYWNrZ3JvdW5kQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6QkFDS0dST1VORF9DT0xPUn0sZHVyYXRpb246e3R5cGU6W1N0cmluZyxOdW1iZXJdLGRlZmF1bHQ6QU5JTUFURV9JTlRFUlZBTF9ERUZBVUxUfX0sZGF0YTpmdW5jdGlvbigpe3JldHVybnt3aWR0aDowLGN1clBlcmNlbnQ6MH19LGNvbXB1dGVkOntiYXJTdHlsZTpmdW5jdGlvbigpe3JldHVybntoZWlnaHQ6dGhpcy5zdHJva2VXaWR0aCxib3JkZXJSYWRpdXM6dGhpcy5ib3JkZXJSYWRpdXMsYmFja2dyb3VuZENvbG9yOnRoaXMuYmFja2dyb3VuZENvbG9yfX0saW5uZXJCYXJTdHlsZTpmdW5jdGlvbigpe3JldHVybnt3aWR0aDp0aGlzLmFjdGl2ZVdpZHRoLGhlaWdodDp0aGlzLnN0cm9rZVdpZHRoLGJhY2tncm91bmRDb2xvcjp0aGlzLmFjdGl2ZUNvbG9yfX0sYWN0aXZlV2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdXJQZXJjZW50KnRoaXMud2lkdGgvMTAwfSxmaW5hbFBlcmNlbnQ6ZnVuY3Rpb24oKXt2YXIgZT1wYXJzZUZsb2F0KHRoaXMucGVyY2VudCwxMCk7cmV0dXJuIDEwMDxlJiYoZT0xMDApLGU8MCYmKGU9MCksZX19LHdhdGNoOntmaW5hbFBlcmNlbnQ6ZnVuY3Rpb24oZSx0KXt0aGlzLl90aW1lcklkJiZuLmNsZWFySW50ZXJ2YWwodGhpcy5fdGltZXJJZCksdGhpcy5fbGFzdFBlcmNlbnQ9dHx8MCx0aGlzLl9hbmltYXRlKCl9fSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5yZXF1aXJlTW9kdWxlKCJkb20iKS5nZXRDb21wb25lbnRSZWN0KHQuJHJlZnMucHJvZ3Jlc3MsZnVuY3Rpb24oZSl7dC53aWR0aD1lLnNpemUud2lkdGgsdC5fYW5pbWF0ZSgpfSl9LDUwKX0sbWV0aG9kczp7X2FuaW1hdGU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5maW5hbFBlcmNlbnQ7aWYoIXRoaXMuYWN0aXZlKXJldHVybiB0aGlzLmN1clBlcmNlbnQ9dDt0aGlzLmN1clBlcmNlbnQ9ImZvcndhcmRzIj09PXRoaXMuYWN0aXZlTW9kZT90aGlzLl9sYXN0UGVyY2VudDowLHRoaXMuX3RpbWVySWQ9bi5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3Q8PWUuY3VyUGVyY2VudCsxPyhlLmN1clBlcmNlbnQ9dCxuLmNsZWFySW50ZXJ2YWwoZS5fdGltZXJJZCksZS4kdHJpZ2dlcigiYWN0aXZlZW5kIix7Y3VyUGVyY2VudDplLmN1clBlcmNlbnR9KSk6KytlLmN1clBlcmNlbnR9LHRoaXMuZHVyYXRpb24pfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlKCJkaXYiLHRoaXMuX2coe3JlZjoicHJvZ3Jlc3MiLHN0YXRpY0NsYXNzOlsidW5pLXByb2dyZXNzIl19LHRoaXMuJGxpc3RlbmVycyksW2UoImRpdiIse3N0YXRpY0NsYXNzOlsidW5pLXByb2dyZXNzLWJhciJdLHN0eWxlOnRoaXMuYmFyU3R5bGV9LFtlKCJkaXYiLHtzdGF0aWNDbGFzczpbInVuaS1wcm9ncmVzcy1pbm5lci1iYXIiXSxzdHlsZTp0aGlzLmlubmVyQmFyU3R5bGV9KV0pLHRoaXMuc2hvd0luZm8/W2UoInUtdGV4dCIse3N0YXRpY0NsYXNzOlsidW5pLXByb2dyZXNzLWluZm8iXSxzdHlsZTp7Zm9udFNpemU6dGhpcy5mb250U2l6ZX19LFt0aGlzLmN1clBlcmNlbnQrIiUiXSldOnRoaXMuX2UoKV0sMil9LHN0eWxlOnsidW5pLXByb2dyZXNzIjp7ZmxleDoxLGZsZXhEaXJlY3Rpb246InJvdyIsYWxpZ25JdGVtczoiY2VudGVyIn0sInVuaS1wcm9ncmVzcy1iYXIiOntmbGV4OjF9LCJ1bmktcHJvZ3Jlc3MtaW5uZXItYmFyIjp7cG9zaXRpb246ImFic29sdXRlIn0sInVuaS1wcm9ncmVzcy1pbmZvIjp7bWFyZ2luTGVmdDoiMTVweCJ9fX19ZnVuY3Rpb24gaW5pdCQxNShlLHQsbil7ZS5jb21wb25lbnQoInByb2dyZXNzIixnZXRQcm9ncmVzcyh0LG4pKX1mdW5jdGlvbiBnZXRSYWRpb0dyb3VwKGUpe3JldHVybntuYW1lOiJSYWRpb0dyb3VwIixpc1Jlc2VydmVkOiEwLG1peGluczpbZW1pdHRlcixsaXN0ZW5lcnNdLHByb3BzOntuYW1lOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntyYWRpb0xpc3Q6W119fSxsaXN0ZW5lcnM6eyJAcmFkaW8tY2hhbmdlIjoiX2NoYW5nZUhhbmRsZXIiLCJAcmFkaW8tZ3JvdXAtdXBkYXRlIjoiX3JhZGlvR3JvdXBVcGRhdGVIYW5kbGVyIn0sbW91bnRlZDpmdW5jdGlvbigpe3RoaXMuX3Jlc2V0UmFkaW9Hcm91cFZhbHVlKHRoaXMucmFkaW9MaXN0Lmxlbmd0aC0xKX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToiYWRkIix2bTp0aGlzfSl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInVuaS1mb3JtLWdyb3VwLXVwZGF0ZSIse3R5cGU6InJlbW92ZSIsdm06dGhpc30pfSxtZXRob2RzOntfY2hhbmdlSGFuZGxlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMucmFkaW9MaXN0LmluZGV4T2YodCk7dGhpcy5fcmVzZXRSYWRpb0dyb3VwVmFsdWUobiwhMCksdGhpcy4kdHJpZ2dlcigiY2hhbmdlIix7dmFsdWU6dC5yYWRpb1ZhbHVlfSl9LF9yYWRpb0dyb3VwVXBkYXRlSGFuZGxlcjpmdW5jdGlvbihlKXtpZigiYWRkIj09PWUudHlwZSl0aGlzLnJhZGlvTGlzdC5wdXNoKGUudm0pO2Vsc2V7dmFyIHQ9dGhpcy5yYWRpb0xpc3QuaW5kZXhPZihlLnZtKTt0aGlzLnJhZGlvTGlzdC5zcGxpY2UodCwxKX19LF9yZXNldFJhZGlvR3JvdXBWYWx1ZTpmdW5jdGlvbih0LHIpe3ZhciBpPXRoaXM7dGhpcy5yYWRpb0xpc3QuZm9yRWFjaChmdW5jdGlvbihlLG4pe24hPT10JiYocj9pLnJhZGlvTGlzdFtuXS5yYWRpb0NoZWNrZWQ9ITE6aS5yYWRpb0xpc3QuZm9yRWFjaChmdW5jdGlvbihlLHQpe3Q8PW58fGkucmFkaW9MaXN0W3RdLnJhZGlvQ2hlY2tlZCYmKGkucmFkaW9MaXN0W25dLnJhZGlvQ2hlY2tlZD0hMSl9KSl9KX0sX2dldEZvcm1EYXRhOmZ1bmN0aW9uKCl7dmFyIGU9e307aWYoIiIhPT10aGlzLm5hbWUpe3ZhciB0PSIiO3RoaXMucmFkaW9MaXN0LmZvckVhY2goZnVuY3Rpb24oZSl7ZS5yYWRpb0NoZWNrZWQmJih0PWUudmFsdWUpfSksZS52YWx1ZT10LGUua2V5PXRoaXMubmFtZX1yZXR1cm4gZX19LHJlbmRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZSgiZGl2Iix0aGlzLl9nKHt9LHRoaXMuJGxpc3RlbmVycyksW3RoaXMuX3QoImRlZmF1bHQiKV0sMil9fX1mdW5jdGlvbiBpbml0JDE2KGUsdCl7ZS5jb21wb25lbnQoInJhZGlvLWdyb3VwIixnZXRSYWRpb0dyb3VwKHQpKX1mdW5jdGlvbiBnZXRSYWRpbyhlKXtyZXR1cm57bmFtZToiUmFkaW8iLGlzUmVzZXJ2ZWQ6ITAsbWl4aW5zOltlbWl0dGVyLGxpc3RlbmVyc10scHJvcHM6e2NoZWNrZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxpZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxjb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwN0FGRiJ9LHZhbHVlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntyYWRpb0NoZWNrZWQ6dGhpcy5jaGVja2VkLHJhZGlvVmFsdWU6dGhpcy52YWx1ZX19LGxpc3RlbmVyczp7ImxhYmVsLWNsaWNrIjoiX29uQ2xpY2siLCJAbGFiZWwtY2xpY2siOiJfb25DbGljayJ9LGNvbXB1dGVkOntjaGVja2VkU3R5bGU6ZnVuY3Rpb24oKXtyZXR1cm57YmFja2dyb3VuZENvbG9yOnRoaXMuY29sb3IsYm9yZGVyQ29sb3I6dGhpcy5jb2xvcn19LHVuY2hlY2tlZFN0eWxlOmZ1bmN0aW9uKCl7cmV0dXJue2JvcmRlckNvbG9yOiIjZDFkMWQxIn19fSx3YXRjaDp7Y2hlY2tlZDpmdW5jdGlvbihlKXt0aGlzLnJhZGlvQ2hlY2tlZD1lfSx2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnJhZGlvVmFsdWU9ZX19LGJlZm9yZUNyZWF0ZTpmdW5jdGlvbigpe30sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJSYWRpb0dyb3VwIiwidW5pLXJhZGlvLWdyb3VwLXVwZGF0ZSIse3R5cGU6ImFkZCIsdm06dGhpc30pLHRoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToiYWRkIix2bTp0aGlzfSl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLiRkaXNwYXRjaCgiUmFkaW9Hcm91cCIsInVuaS1yYWRpby1ncm91cC11cGRhdGUiLHt0eXBlOiJyZW1vdmUiLHZtOnRoaXN9KSx0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInVuaS1mb3JtLWdyb3VwLXVwZGF0ZSIse3R5cGU6InJlbW92ZSIsdm06dGhpc30pfSxtZXRob2RzOntfb25DbGljazpmdW5jdGlvbihlKXt0aGlzLmRpc2FibGVkfHx0aGlzLnJhZGlvQ2hlY2tlZHx8KHRoaXMucmFkaW9DaGVja2VkPSEwLHRoaXMuJGRpc3BhdGNoKCJSYWRpb0dyb3VwIiwidW5pLXJhZGlvLWNoYW5nZSIsZSx0aGlzKSl9LF9yZXNldEZvcm1EYXRhOmZ1bmN0aW9uKCl7dGhpcy5yYWRpb0NoZWNrZWQ9ITF9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gZSgiZGl2Iix0Ll9nKHtzdGF0aWNDbGFzczpbInVuaS1yYWRpbyJdLGF0dHJzOntkYXRhVW5jVHlwZToidW5pLXJhZGlvIn0sb246e2NsaWNrOnQuX29uQ2xpY2t9fSx0LiRsaXN0ZW5lcnMpLFtlKCJkaXYiLHtzdGF0aWNDbGFzczpbInVuaS1yYWRpby1pbnB1dCJdLHN0eWxlOnQucmFkaW9DaGVja2VkP3QuY2hlY2tlZFN0eWxlOnQudW5jaGVja2VkU3R5bGV9LFt0LnJhZGlvQ2hlY2tlZD9lKCJ1LXRleHQiLHtzdGF0aWNDbGFzczpbInVuaS1yYWRpby1pbnB1dC1pY29uIl19LFt0Ll92KHQuX3MoIu6oiCIpKV0pOnQuX2UoKV0sMSksZSgidS10ZXh0Iix7c3RhdGljQ2xhc3M6WyJ1bmktdGV4dCJdfSxbdC5fdCgiZGVmYXVsdCIpXSwyKV0sMSl9LHN0eWxlOnsidW5pLXJhZGlvIjp7YWxpZ25JdGVtczoiY2VudGVyIixmbGV4RGlyZWN0aW9uOiJyb3cifSwidW5pLXJhZGlvLWlucHV0Ijp7cG9zaXRpb246InJlbGF0aXZlIixhbGlnbkl0ZW1zOiJjZW50ZXIiLGp1c3RpZnlDb250ZW50OiJjZW50ZXIiLG1hcmdpblJpZ2h0OiI1IixiYWNrZ3JvdW5kQ29sb3I6IiNmZmZmZmYiLGJvcmRlclN0eWxlOiJzb2xpZCIsYm9yZGVyV2lkdGg6IjEiLGJvcmRlckNvbG9yOiIjZDFkMWQxIixib3JkZXJSYWRpdXM6NTAsd2lkdGg6IjIyIixoZWlnaHQ6IjIyIixvdXRsaW5lOjB9LCJ1bmktcmFkaW8taW5wdXQtaWNvbiI6e2ZvbnRGYW1pbHk6InVuaW5jb21wb25lbnRzIixmb250U2l6ZToiMTQiLGNvbG9yOiIjZmZmZmZmIn0sInVuaS1yYWRpby1pbnB1dC1kaXNhYmxlZCI6e2JhY2tncm91bmRDb2xvcjoiI2UxZTFlMSIsYm9yZGVyQ29sb3I6IiNkMWQxZDEiLGNvbG9yOiIjYWRhZGFkIn19fX1mdW5jdGlvbiBpbml0JDE3KGUsdCl7ZS5jb21wb25lbnQoInJhZGlvIixnZXRSYWRpbyh0KSl9ZnVuY3Rpb24gbm9ybWFsaXplTm9kZXMoZSx0LG4pe3ZhciBjPVsic3BhbiIsImEiLCJpbWFnZSIsImltZyJdO2Z1bmN0aW9uIGEoZSl7cmV0dXJuIGUuX19ibG9jaz0hMCxlfWZ1bmN0aW9uIHIobyl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHI9byxpPXQsIShuPWUpLnN0eWxlLmZvbnRTaXplJiYobi5zdHlsZS5mb250U2l6ZT1pLmRlZmF1bHRGb250U2l6ZSpyKSxhKHMobikpO3ZhciBuLHIsaX19ZnVuY3Rpb24gcyhlKXtyZXR1cm4hZS5zdHlsZS5mb250V2VpZ2h0JiYoZS5zdHlsZS5mb250V2VpZ2h0PSJib2xkIiksZX12YXIgdT17YmxvY2txdW90ZTphLGJyOmZ1bmN0aW9uKGUpe3JldHVybiBlLl9fdmFsdWU9IiAiLGEoZSl9LGRpdjphLGRsOmEsaDE6cigyKSxoMjpyKDEuNSksaDM6cigxLjE3KSxoNDpyKDEpLGg1OnIoLjgzKSxoNjpyKC42NyksaHI6YSxvbDphLHA6YSxzdHJvbmc6cyx0YWJsZTphLHRib2R5OmEsdGZvb3Q6YSx0aGVhZDphLHVsOmF9LGw9LyYoYW1wfGd0fGx0fG5ic3B8cXVvdHxhcG9zKTsvZyxkPXthbXA6IiYiLGd0OiI+IixsdDoiPCIsbmJzcDoiICIscXVvdDonIicsYXBvczoiJyJ9O3ZhciBmLHA9e19fYmxvY2s6ITAsX19icmVhazohMCxjaGlsZHJlbjpbXX07ZnVuY3Rpb24gaSh0LGUsbil7dmFyIHI9KHQubmFtZXx8IiIpLnRvTG93ZXJDYXNlKCksaT1yLG89dVtyXTstMT09PWMuaW5kZXhPZihyKSYmKHI9InNwYW4iKSwiaW1nIj09PXImJihyPSJpbWFnZSIpO3ZhciBhPXt0eXBlOnIsX190eXBlOmksYXR0cjpPYmplY3QuY3JlYXRlKG51bGwpfTtpZigoInRleHQiPT09dC50eXBlfHx0LnRleHQpJiYoYS5fX3ZhbHVlPWEuYXR0ci52YWx1ZT0odC50ZXh0fHwiIikudHJpbSgpLnJlcGxhY2UobCxmdW5jdGlvbihlLHQpe3JldHVybiBkW3RdfSkpLHQuYXR0cnMmJk9iamVjdC5rZXlzKHQuYXR0cnMpLmZvckVhY2goZnVuY3Rpb24oZSl7ImNsYXNzIiE9PWUmJiJzdHlsZSIhPT1lJiYoYS5hdHRyW2VdPXQuYXR0cnNbZV0pfSksYS5zdHlsZT1ub3JtYWxpemVVbml0KGZ1bmN0aW9uKGUsdCl7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtpZihlLmF0dHJzKXt2YXIgcj0oZS5hdHRycy5jbGFzc3x8IiIpLnNwbGl0KCIgIiksaT10LiRvcHRpb25zLnN0eWxlfHx7fTtyLmZvckVhY2goZnVuY3Rpb24oZSl7ZSYmaVtlXSYmT2JqZWN0LmFzc2lnbihuLGlbZV0pfSksT2JqZWN0LmFzc2lnbihuLHBhcnNlU3R5bGVUZXh0KGUuYXR0cnMuc3R5bGV8fCIiKSl9aWYoImltZyI9PT1lLm5hbWV8fCJpbWFnZSI9PT1lLm5hbWUpe3ZhciBvPWUuYXR0cnM7bi53aWR0aD1uLndpZHRofHxvLndpZHRoLG4uaGVpZ2h0PW4uaGVpZ2h0fHxvLmhlaWdodH1yZXR1cm4gbn0odCxlKSksbyYmbyhhLG4pLChwLl9fYmxvY2t8fGEuX19ibG9jaykmJiFmKXt2YXIgcz17dHlwZToic3BhbiIsX190eXBlOiJicmVhayIsYXR0cjp7dmFsdWU6IlxuIn19O3AuY2hpbGRyZW4ucHVzaChzKSxmPVtwLHNdfXJldHVybigocD1hKS5fX3ZhbHVlfHwiaW1hZ2UiPT09cC50eXBlJiZwLmF0dHIuc3JjKSYmKGY9bnVsbCksYS5jaGlsZHJlbj1oKHQuY2hpbGRyZW4sZSxuKSwocD1hKS5fX2Jsb2NrJiZwLnN0eWxlLmhlaWdodCYmIS9eMChweCk/JC8udGVzdChwLnN0eWxlLmhlaWdodCkmJihmPW51bGwpLGF9ZnVuY3Rpb24gaChlLHQsbil7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGkoZSx0LG4pfSk6W119dmFyIG89aChlLHQsbik7aWYoZil7dmFyIHY9ZlswXSxnPWZbMV0sbT12LmNoaWxkcmVuLHk9bS5pbmRleE9mKGcpO20uc3BsaWNlKHksMSl9cmV0dXJuIG99ZnVuY3Rpb24gZ2V0UmljaFRleHQoZSl7cmV0dXJue25hbWU6IlJpY2hUZXh0Iixpc1Jlc2VydmVkOiEwLHByb3BzOntub2Rlczp7dHlwZTpbQXJyYXksU3RyaW5nXSxkZWZhdWx0OmZ1bmN0aW9uKCl7cmV0dXJuW119fX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PW5vcm1hbGl6ZU5vZGVzKHRoaXMubm9kZXN8fFtdLHRoaXMuJHZub2RlLmNvbnRleHQse2RlZmF1bHRGb250U2l6ZToxNn0pO3JldHVybiBlKCJ1LXJpY2gtdGV4dCIsdGhpcy5fZyh7YXR0cnM6e3ZhbHVlOnR9fSx0aGlzLiRsaXN0ZW5lcnMpKX19fWZ1bmN0aW9uIGluaXQkMTgoZSx0KXtlLmNvbXBvbmVudCgicmljaC10ZXh0IixnZXRSaWNoVGV4dCh0KSl9ZnVuY3Rpb24gZ2V0U3dpcGVySXRlbShlKXtyZXR1cm57bmFtZToiU3dpcGVySXRlbSIsaXNSZXNlcnZlZDohMCxwcm9wczp7aXRlbUlkOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0scmVuZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlKCJkaXYiLHRoaXMuX2coe3N0YXRpY0NsYXNzOlsidW5pLXN3aXBlci1pdGVtIl0sc3RhdGljU3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDowLHRvcDowLHJpZ2h0OjAsYm90dG9tOjAsb3ZlcmZsb3c6ImhpZGRlbiJ9fSx0aGlzLiRsaXN0ZW5lcnMpLHRoaXMuX3QoImRlZmF1bHQiKSwyKX19fWZ1bmN0aW9uIGluaXQkMTkoZSx0KXtlLmNvbXBvbmVudCgic3dpcGVyLWl0ZW0iLGdldFN3aXBlckl0ZW0odCkpfWZ1bmN0aW9uIGdldFN3aXBlcihyKXt2YXIgdD1yLnJlcXVpcmVNb2R1bGUoImRvbSIpO3JldHVybntuYW1lOiJTd2lwZXIiLGlzUmVzZXJ2ZWQ6ITAsbWl4aW5zOltlbWl0dGVyXSxwcm9wczp7aW5kaWNhdG9yRG90czp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LHZlcnRpY2FsOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sYXV0b3BsYXk6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxjaXJjdWxhcjp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGludGVydmFsOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjVlM30sZHVyYXRpb246e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6NTAwfSxjdXJyZW50Ont0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LGluZGljYXRvckNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJyZ2JhKDAsMCwwLC4zKSJ9LGluZGljYXRvckFjdGl2ZUNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDAwMDAwIn0scHJldmlvdXNNYXJnaW46e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LG5leHRNYXJnaW46e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LGN1cnJlbnRJdGVtSWQ6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LHNraXBIaWRkZW5JdGVtTGF5b3V0Ont0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sZGlzcGxheU11bHRpcGxlSXRlbXM6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MX0sZGlzYWJsZVRvdWNoOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX19LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57Y3VycmVudFN5bmM6dGhpcy5jdXJyZW50LGN1cnJlbnRDaGFuZ2VTb3VyY2U6ImF1dG9wbGF5In19LHdhdGNoOntjdXJyZW50OmZ1bmN0aW9uKCl7dGhpcy5fY3VycmVudENoZWNrKCl9LGN1cnJlbnRJdGVtSWQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJyZW50Q2hlY2soKX0sY3VycmVudFN5bmM6ZnVuY3Rpb24oKXt0aGlzLiR0cmlnZ2VyKCJjaGFuZ2UiLHRoaXMuX2dldERldGFpbCgpKX19LG1ldGhvZHM6e29uQ2hhbmdlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZGV0YWlsOyJzdHJpbmciPT10eXBlb2YgdC5zb3VyY2UmJih0aGlzLmN1cnJlbnRDaGFuZ2VTb3VyY2U9dC5zb3VyY2UpLHRoaXMuY3VycmVudFN5bmM9dC5pbmRleCx0aGlzLl9sYXN0T2Zmc2V0UmF0aW89MH0sb25TY3JvbGw6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy52ZXJ0aWNhbD9lLmRldGFpbC5vZmZzZXRZUmF0aW86ZS5kZXRhaWwub2Zmc2V0WFJhdGlvO2lmKChlLmRyYWd8fGUuZGV0YWlsLmRyYWcpJiYodGhpcy5jdXJyZW50Q2hhbmdlU291cmNlPSJ0b3VjaCIpLDA9PT10KXt2YXIgbj1NYXRoLmFicyh0aGlzLl9sYXN0T2Zmc2V0UmF0aW8pO2lmKDE9PT1uKXJldHVybjsuNTxuJiYodD0xKX10aGlzLl9sYXN0T2Zmc2V0UmF0aW89dCx0aGlzLiR0cmlnZ2VyKCJ0cmFuc2l0aW9uIix7ZHg6dGhpcy52ZXJ0aWNhbD8wOi10aGlzLl93aWR0aCp0LGR5OnRoaXMudmVydGljYWw/LXRoaXMuX2hlaWdodCp0OjB9KX0sb25TY3JvbGxFbmQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPWZ1bmN0aW9uKCl7dC4kdHJpZ2dlcigiYW5pbWF0aW9uZmluaXNoIix0Ll9nZXREZXRhaWwoKSksdC5jdXJyZW50Q2hhbmdlU291cmNlPSJhdXRvcGxheSJ9OyJpT1MiPT09ci5jb25maWcuZW52LnBsYXRmb3JtP3NldFRpbWVvdXQobiw1MCk6bigpfSxfZ2V0RGV0YWlsOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5jdXJyZW50U3luYyx0PXRoaXMuaXRlbXNbZV18fHt9O3JldHVybntjdXJyZW50OmUsY3VycmVudEl0ZW1JZDp0LmNvbXBvbmVudEluc3RhbmNlJiZ0LmNvbXBvbmVudEluc3RhbmNlLml0ZW1JZHx8IiIsc291cmNlOnRoaXMuY3VycmVudENoYW5nZVNvdXJjZX19LF9jdXJyZW50Q2hlY2s6ZnVuY3Rpb24oKXt2YXIgZT0tMTtpZih0aGlzLmN1cnJlbnRJdGVtSWQpZm9yKHZhciB0PTAsbj10aGlzLml0ZW1zO3Q8bi5sZW5ndGg7dCsrKXt2YXIgcj1uW3RdLmNvbXBvbmVudEluc3RhbmNlO2lmKHImJnIuaXRlbUlkPT09dGhpcy5jdXJyZW50SXRlbUlkKXtlPXQ7YnJlYWt9fWU8MCYmKGU9TWF0aC5yb3VuZCh0aGlzLmN1cnJlbnQpfHwwKSxlPWU8MD8wOmUsdGhpcy5jdXJyZW50U3luYyE9PWUmJih0aGlzLmN1cnJlbnRDaGFuZ2VTb3VyY2U9IiIsdGhpcy5jdXJyZW50U3luYz1lKX0sX2dldFdIOmZ1bmN0aW9uKCl7dmFyIHI9dGhpczt0aGlzLl9nZXRDb21wb25lbnRTaXplKHRoaXMuJHJlZnMuZWwpLnRoZW4oZnVuY3Rpb24oZSl7dmFyIHQ9ZS53aWR0aCxuPWUuaGVpZ2h0O2UudG9wLGUubGVmdDtyLl93aWR0aD10LHIuX2hlaWdodD1ufSl9LF9nZXRDb21wb25lbnRTaXplOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihuKXt0LmdldENvbXBvbmVudFJlY3QoZSxmdW5jdGlvbihlKXt2YXIgdD1lLnNpemU7bih0KX0pfSl9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5pdGVtcz1bXSx0aGlzLl93aWR0aD10aGlzLmhlaWdodD0wfSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl9jdXJyZW50Q2hlY2soKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5fZ2V0V0goKX0sMTAwKX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PVtdOyhBcnJheS5pc0FycmF5KHRoaXMuJHNsb3RzLmRlZmF1bHQpP2RlZXBDbG9uZSh0aGlzLiRzbG90cy5kZWZhdWx0LGUpOltdKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY29tcG9uZW50T3B0aW9ucyYmInN3aXBlci1pdGVtIj09PWUuY29tcG9uZW50T3B0aW9ucy50YWcmJnQucHVzaChlKX0pLHRoaXMuaXRlbXM9dDt2YXIgbj17fSxyPXRoaXMuJGxpc3RlbmVycztyZXR1cm4oci5jaGFuZ2V8fHIuYW5pbWF0aW9uZmluaXNofHxyLnRyYW5zaXRpb24pJiYobi5zY3JvbGw9dGhpcy5vblNjcm9sbCxuLnNjcm9sbGVuZD10aGlzLm9uU2Nyb2xsRW5kKSxyLmNoYW5nZSYmKG4uY2hhbmdlPXRoaXMub25DaGFuZ2UpLGUoImRpdiIsdGhpcy5fZyh7cmVmOiJlbCIsc3RhdGljQ2xhc3M6WyJ1bmktc3dpcGVyIl19LHIpLFtlKCJzbGlkZXIiLHtzdGF0aWNDbGFzczpbInVuaS1zd2lwZXItc2xpZGVyIl0sYXR0cnM6e2F1dG9QbGF5OnRoaXMuYXV0b3BsYXksaW50ZXJ2YWw6dGhpcy5pbnRlcnZhbCxpbmRleDp0aGlzLmN1cnJlbnRTeW5jLGtlZXBJbmRleDohMCxzaG93SW5kaWNhdG9yczp0aGlzLmluZGljYXRvckRvdHMsaW5maW5pdGU6dGhpcy5jaXJjdWxhcix2ZXJ0aWNhbDp0aGlzLnZlcnRpY2FsLHNjcm9sbGFibGU6IXRoaXMuZGlzYWJsZVRvdWNofSxvbjpufSx0LmNvbmNhdChbZSgiaW5kaWNhdG9yIix7c3RhdGljQ2xhc3M6WyJ1bmktc3dpcGVyLWRvdHMiXSxzdHlsZTp7aXRlbUNvbG9yOnRoaXMuaW5kaWNhdG9yQ29sb3IsaXRlbVNlbGVjdGVkQ29sb3I6dGhpcy5pbmRpY2F0b3JBY3RpdmVDb2xvcixpdGVtU2l6ZTo4LG9wYWNpdHk6dGhpcy5pbmRpY2F0b3JEb3RzPzE6MH19KV0pLDIpXSl9LHN0eWxlOnsidW5pLXN3aXBlciI6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsaGVpZ2h0OiIxNTBweCJ9LCJ1bmktc3dpcGVyLXNsaWRlciI6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDowLHRvcDowLHJpZ2h0OjAsYm90dG9tOjB9LCJ1bmktc3dpcGVyLWRvdHMiOntwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6MCxyaWdodDowLGJvdHRvbToiMTAiLGhlaWdodDoiMTAifX19fWZ1bmN0aW9uIGluaXQkMjAoZSx0KXtlLmNvbXBvbmVudCgic3dpcGVyIixnZXRTd2lwZXIodCkpfWZ1bmN0aW9uIGdldFN3aXRjaChlKXtyZXR1cm57bmFtZToiU3dpdGNoIixpc1Jlc2VydmVkOiEwLG1peGluczpbZW1pdHRlcixsaXN0ZW5lcnNdLHByb3BzOntuYW1lOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifSxpZDp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sdHlwZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoic3dpdGNoIn0sY2hlY2tlZDp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9LGRpc2FibGVkOnt0eXBlOltCb29sZWFuLFN0cmluZ10sZGVmYXVsdDohMX0sY29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiMwMDdhZmYifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntzd2l0Y2hDaGVja2VkOnRoaXMuY2hlY2tlZH19LHdhdGNoOntjaGVja2VkOmZ1bmN0aW9uKGUpe3RoaXMuc3dpdGNoQ2hlY2tlZD1lfX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToiYWRkIix2bTp0aGlzfSl9LGJlZm9yZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLiRkaXNwYXRjaCgiRm9ybSIsInVuaS1mb3JtLWdyb3VwLXVwZGF0ZSIse3R5cGU6InJlbW92ZSIsdm06dGhpc30pfSxtZXRob2RzOntfb25DbGljazpmdW5jdGlvbihlLHQpe3RoaXMuZGlzYWJsZWR8fCh0aGlzLnN3aXRjaENoZWNrZWQ9ZS5kZXRhaWw/ZS5kZXRhaWwudmFsdWU6IXRoaXMuc3dpdGNoQ2hlY2tlZCx0aGlzLiR0cmlnZ2VyKCJjaGFuZ2UiLHt2YWx1ZTp0aGlzLnN3aXRjaENoZWNrZWR9KSl9LF9yZXNldEZvcm1EYXRhOmZ1bmN0aW9uKCl7dGhpcy5zd2l0Y2hDaGVja2VkPSExfSxfZ2V0Rm9ybURhdGE6ZnVuY3Rpb24oKXt2YXIgZT17fTtyZXR1cm4iIiE9PXRoaXMubmFtZSYmKGUudmFsdWU9dGhpcy5zd2l0Y2hDaGVja2VkLGUua2V5PXRoaXMubmFtZSksZX19LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49dGhpcy4kbGlzdGVuZXJzO3JldHVybiBlKCJkaXYiLHQuX2coe3N0eWxlOntwYWRkaW5nUmlnaHQ6NX19LG4pLFsic3dpdGNoIj09PXQudHlwZT9lKCJkYy1zd2l0Y2giLHthdHRyczp7ZGF0YVVuY1R5cGU6InVuaS1zd2l0Y2giLGNvbG9yOnQuY29sb3IsY2hlY2tlZDp0LnN3aXRjaENoZWNrZWQsZGlzYWJsZWQ6dC5kaXNhYmxlZH0sc3R5bGU6e3dpZHRoOjUyLGhlaWdodDozMn0sb246e2NoYW5nZTp0Ll9vbkNsaWNrfX0pOnQuX2UoKSwiY2hlY2tib3giPT09dC50eXBlP2UoImNoZWNrYm94Iix7YXR0cnM6e2RhdGFVbmNUeXBlOiJ1bmktc3dpdGNoIixjaGVja2VkOnQuc3dpdGNoQ2hlY2tlZCxkaXNhYmxlZDp0LmRpc2FibGVkfSxzdHlsZTp7Y29sb3I6dC5jb2xvcn0sb246e2NsaWNrOnQuX29uQ2xpY2t9fSk6dC5fZSgpXSwxKX0sbGlzdGVuZXJzOnsibGFiZWwtY2xpY2siOiJfb25DbGljayIsIkBsYWJlbC1jbGljayI6Il9vbkNsaWNrIn19fWZ1bmN0aW9uIGluaXQkMjEoZSx0KXtlLmNvbXBvbmVudCgic3dpdGNoIixnZXRTd2l0Y2godCkpfWZ1bmN0aW9uIGdldFNsaWRlcihlKXtyZXR1cm57bmFtZToiVVNsaWRlciIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXIsbGlzdGVuZXJzXSxwcm9wczp7bmFtZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sbWluOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LG1heDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDoxMDB9LHZhbHVlOnt0eXBlOltOdW1iZXIsU3RyaW5nXSxkZWZhdWx0OjB9LHN0ZXA6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MX0sZGlzYWJsZWQ6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxjb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiI2U5ZTllOSJ9LGJhY2tncm91bmRDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiI2U5ZTllOSJ9LGFjdGl2ZUNvbG9yOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIjMDA3YWZmIn0sc2VsZWN0ZWRDb2xvcjp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIzAwN2FmZiJ9LGJsb2NrQ29sb3I6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiNmZmZmZmYifSxibG9ja1NpemU6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6Mjh9LHNob3dWYWx1ZTp7dHlwZTpbQm9vbGVhbixTdHJpbmddLGRlZmF1bHQ6ITF9fSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3NsaWRlcldpZHRoOjAsc2xpZGVyVmFsdWU6TnVtYmVyKHRoaXMudmFsdWUpfX0sY29tcHV0ZWQ6e3NsaWRlclRodW1iT2Zmc2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE51bWJlcih0aGlzLmJsb2NrU2l6ZSkvMn0sdHJhY2tUYXBTdHlsZTpmdW5jdGlvbigpe3JldHVybntwYWRkaW5nVG9wOnRoaXMuc2xpZGVyVGh1bWJPZmZzZXQscGFkZGluZ0JvdHRvbTp0aGlzLnNsaWRlclRodW1iT2Zmc2V0fX0sdHJhY2tTdHlsZTpmdW5jdGlvbigpe3JldHVybntiYWNrZ3JvdW5kQ29sb3I6dGhpcy5fZ2V0QmdDb2xvcigpLG1hcmdpbkxlZnQ6dGhpcy5zbGlkZXJUaHVtYk9mZnNldCxtYXJnaW5SaWdodDp0aGlzLnNsaWRlclRodW1iT2Zmc2V0fX0sdHJhY2tBY3RpdmVTdHlsZTpmdW5jdGlvbigpe3JldHVybntiYWNrZ3JvdW5kQ29sb3I6dGhpcy5fZ2V0QWN0aXZlQ29sb3IoKSx3aWR0aDp0aGlzLnRodW1iVmFsdWUrInB4In19LHRodW1iU3R5bGU6ZnVuY3Rpb24oKXtyZXR1cm57d2lkdGg6dGhpcy5ibG9ja1NpemUrInB4IixoZWlnaHQ6dGhpcy5ibG9ja1NpemUrInB4IixsZWZ0OnRoaXMudGh1bWJWYWx1ZSsicHgiLGJhY2tncm91bmRDb2xvcjp0aGlzLmJsb2NrQ29sb3J9fSx0aHVtYlZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuc2xpZGVyVmFsdWUtTnVtYmVyKHRoaXMubWluKSkvKE51bWJlcih0aGlzLm1heCktTnVtYmVyKHRoaXMubWluKSkqdGhpcy5zbGlkZXJXaWR0aH19LHdhdGNoOnt2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnNsaWRlclZhbHVlPU51bWJlcihlKX19LG1vdW50ZWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX3gwPTAsdGhpcy5feDE9MCx0aGlzLiRldmVudE9sZD1udWxsLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnJlcXVpcmVNb2R1bGUoImRvbSIpLmdldENvbXBvbmVudFJlY3QodC4kcmVmc1sic2xpZGVyLXRyYWNrIl0sZnVuY3Rpb24oZSl7dC5zbGlkZXJXaWR0aD1lLnNpemUud2lkdGh9KX0sNTApfSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy4kZGlzcGF0Y2goIkZvcm0iLCJ1bmktZm9ybS1ncm91cC11cGRhdGUiLHt0eXBlOiJhZGQiLHZtOnRoaXN9KX0sYmVmb3JlRGVzdHJveTpmdW5jdGlvbigpe3RoaXMuJGRpc3BhdGNoKCJGb3JtIiwidW5pLWZvcm0tZ3JvdXAtdXBkYXRlIix7dHlwZToicmVtb3ZlIix2bTp0aGlzfSl9LG1ldGhvZHM6e19oYW5kbGVTdGFydDpmdW5jdGlvbihlKXtpZigxPT09ZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGgmJiF0aGlzLl8kZXZlbnRPbGQpe3ZhciB0PSh0aGlzLl8kZXZlbnRPbGQ9ZSkuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVg7dGhpcy5feDA9dGhpcy5feDE9dCx0aGlzLl9vblRyYWNrKCJzdGFydCIsdCl9fSxfaGFuZGxlTW92ZTpmdW5jdGlvbihlKXtpZigxPT09ZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGgmJnRoaXMuXyRldmVudE9sZCl7dmFyIHQ9ZS5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWDt0aGlzLl9vblRyYWNrKCJtb3ZlIix0KSx0aGlzLl94MT10fX0sX2hhbmRsZUVuZDpmdW5jdGlvbihlKXtpZigxPT09ZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGgmJnRoaXMuXyRldmVudE9sZCl7dmFyIHQ9ZS5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWDt0aGlzLl8kZXZlbnRPbGQ9bnVsbCx0aGlzLl9vblRyYWNrKCJlbmQiLHQpfX0sX29uVHJhY2s6ZnVuY3Rpb24oZSx0KXt0aGlzLmRpc2FibGVkfHwoIm1vdmUiPT09ZT8odGhpcy5fb25Vc2VyQ2hhbmdlZFZhbHVlKHt4OnR9KSx0aGlzLiR0cmlnZ2VyKCJjaGFuZ2luZyIse3ZhbHVlOnRoaXMuc2xpZGVyVmFsdWV9KSk6ImVuZCI9PT1lJiYodGhpcy5fb25Vc2VyQ2hhbmdlZFZhbHVlKHt4OnR9KSx0aGlzLiR0cmlnZ2VyKCJjaGFuZ2UiLHt2YWx1ZTp0aGlzLnNsaWRlclZhbHVlfSkpKX0sX29uVXNlckNoYW5nZWRWYWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1lLngtdGhpcy5ibG9ja1NpemUvMjt0PDAmJih0PTApLHQ+dGhpcy5zbGlkZXJXaWR0aCYmKHQ9dGhpcy5zbGlkZXJXaWR0aCk7dmFyIG49TnVtYmVyKHRoaXMubWluKSxyPU51bWJlcih0aGlzLm1heCksaT1OdW1iZXIodGhpcy5zdGVwKSxvPXQvdGhpcy5zbGlkZXJXaWR0aCooci1uKTswPGkmJmk8byYmbyVpL2khPTAmJihvLT1vJWkpLHRoaXMuc2xpZGVyVmFsdWU9cGFyc2VJbnQobytuKX0sX2dldEJnQ29sb3I6ZnVuY3Rpb24oKXtyZXR1cm4iI2U5ZTllOSIhPT10aGlzLmJhY2tncm91bmRDb2xvcj90aGlzLmJhY2tncm91bmRDb2xvcjoiIzAwN2FmZiIhPT10aGlzLmNvbG9yP3RoaXMuY29sb3I6IiMwMDdhZmYifSxfZ2V0QWN0aXZlQ29sb3I6ZnVuY3Rpb24oKXtyZXR1cm4iIzAwN2FmZiIhPT10aGlzLmFjdGl2ZUNvbG9yP3RoaXMuYWN0aXZlQ29sb3I6IiNlOWU5ZTkiIT09dGhpcy5zZWxlY3RlZENvbG9yP3RoaXMuc2VsZWN0ZWRDb2xvcjoiI2U5ZTllOSJ9LF9yZXNldEZvcm1EYXRhOmZ1bmN0aW9uKCl7dGhpcy5zbGlkZXJWYWx1ZT10aGlzLm1pbn0sX2dldEZvcm1EYXRhOmZ1bmN0aW9uKCl7dmFyIGU9e307cmV0dXJuIiIhPT10aGlzLm5hbWUmJihlLnZhbHVlPXRoaXMuc2xpZGVyVmFsdWUsZS5rZXk9dGhpcy5uYW1lKSxlfX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIGUoImRpdiIsdC5fZyh7c3RhdGljQ2xhc3M6WyJ1bmktc2xpZGVyIl19LHQuJGxpc3RlbmVycyksW2UoImRpdiIse3N0YXRpY0NsYXNzOlsidW5pLXNsaWRlci13cmFwcGVyIl19LFtlKCJkaXYiLHtzdGF0aWNDbGFzczpbInVuaS1zbGlkZXItdGFwLWFyZWEiXSxvbjp7dG91Y2hzdGFydDp0Ll9oYW5kbGVTdGFydCx0b3VjaG1vdmU6dC5faGFuZGxlTW92ZSx0b3VjaGVuZDp0Ll9oYW5kbGVFbmR9LHN0eWxlOnQudHJhY2tUYXBTdHlsZX0sW2UoImRpdiIse3JlZjoic2xpZGVyLXRyYWNrIixzdGF0aWNDbGFzczpbInVuaS1zbGlkZXItaGFuZGxlLXdyYXBwZXIiXSxzdHlsZTp0LnRyYWNrU3R5bGV9LFtlKCJkaXYiLHtzdGF0aWNDbGFzczpbInVuaS1zbGlkZXItdHJhY2siXSxzdHlsZTp0LnRyYWNrQWN0aXZlU3R5bGV9KV0pLGUoImRpdiIse3JlZjoidW5pLXNsaWRlci1oYW5kbGUiLHN0YXRpY0NsYXNzOlsidW5pLXNsaWRlci10aHVtYiJdLHN0eWxlOnQudGh1bWJTdHlsZX0pXSksdC5zaG93VmFsdWU/ZSgidS10ZXh0Iix7c3RhdGljQ2xhc3M6WyJ1bmktc2xpZGVyLXZhbHVlIl19LFt0Ll92KHQuX3ModC5zbGlkZXJWYWx1ZSkpXSk6dC5fZSgpXSldKX0sc3R5bGU6eyJ1bmktc2xpZGVyIjp7ZmxleDoxLGZsZXhEaXJlY3Rpb246ImNvbHVtbiJ9LCJ1bmktc2xpZGVyLXdyYXBwZXIiOntmbGV4RGlyZWN0aW9uOiJyb3ciLGFsaWduSXRlbXM6ImNlbnRlciIsanVzdGlmeUNvbnRlbnQ6ImNlbnRlciJ9LCJ1bmktc2xpZGVyLXRhcC1hcmVhIjp7cG9zaXRpb246InJlbGF0aXZlIixmbGV4OjEsZmxleERpcmVjdGlvbjoicm93IixhbGlnbkl0ZW1zOiJjZW50ZXIiLHBhZGRpbmdUb3A6IjE0IixwYWRkaW5nQm90dG9tOiIxNCJ9LCJ1bmktc2xpZGVyLWhhbmRsZS13cmFwcGVyIjp7cG9zaXRpb246InJlbGF0aXZlIixmbGV4OjEsaGVpZ2h0OiIyIixtYXJnaW5SaWdodDoiMTQiLG1hcmdpbkxlZnQ6IjE0Iixib3JkZXJSYWRpdXM6IjUiLGJhY2tncm91bmRDb2xvcjoiI2U5ZTllOSJ9LCJ1bmktc2xpZGVyLXRyYWNrIjp7aGVpZ2h0OiIyIixib3JkZXJSYWRpdXM6IjYiLGJhY2tncm91bmRDb2xvcjoiIzAwN2FmZiJ9LCJ1bmktc2xpZGVyLXRodW1iIjp7cG9zaXRpb246ImFic29sdXRlIix0b3A6IjEiLHdpZHRoOiIyOCIsaGVpZ2h0OiIyOCIsYm9yZGVyUmFkaXVzOjUwLGJveFNoYWRvdzoiMCAwIDRweCAjZWJlYmViIn0sInVuaS1zbGlkZXItdmFsdWUiOntjb2xvcjoiIzg4ODg4OCIsZm9udFNpemU6IjE2Iix3aWR0aDoiMzAifX19fWZ1bmN0aW9uIGluaXQkMjIoZSx0KXtlLmNvbXBvbmVudCgidS1zbGlkZXIiLGdldFNsaWRlcih0KSl9ZnVuY3Rpb24gZ2V0UGlja2VyVmlldyhlKXtyZXR1cm57bmFtZToiUGlja2VyVmlldyIsaXNSZXNlcnZlZDohMCxtaXhpbnM6W2VtaXR0ZXJdLHByb3BzOnt2YWx1ZTp7dHlwZTpBcnJheSxkZWZhdWx0OmZ1bmN0aW9uKCl7cmV0dXJuW119LHZhbGlkYXRvcjpmdW5jdGlvbihlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKSYmZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlfSkubGVuZ3RoPT09ZS5sZW5ndGh9fSxoZWlnaHQ6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6MH0saW5kaWNhdG9yU3R5bGU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6IiJ9LG1hc2tUb3BTdHlsZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDoiIn0sbWFza0JvdHRvbVN0eWxlOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sZGF0YTpmdW5jdGlvbigpe3JldHVybnttYXNrVG9wU3R5bGVTeW5jOnRoaXMuZ2V0U3R5bGUodGhpcy5tYXNrVG9wU3R5bGUpLG1hc2tCb3R0b21TdHlsZVN5bmM6dGhpcy5nZXRTdHlsZSh0aGlzLm1hc2tCb3R0b21TdHlsZSksaW5kaWNhdG9yU3R5bGVTeW5jOnRoaXMuZ2V0U3R5bGUodGhpcy5pbmRpY2F0b3JTdHlsZSksdmFsdWVTeW5jOltdLmNvbmNhdCh0aGlzLnZhbHVlKX19LHdhdGNoOnt2YWx1ZTpmdW5jdGlvbihlKXt2YXIgbj10aGlzO3RoaXMudmFsdWVTeW5jLmxlbmd0aD1lLmxlbmd0aCxlLmZvckVhY2goZnVuY3Rpb24oZSx0KXtlIT09bi52YWx1ZVN5bmNbdF0mJihuLnZhbHVlU3luY1t0XT1lLG4uaXRlbXNbdF0uY29tcG9uZW50SW5zdGFuY2Uuc2V0Q3VycmVudChlKSl9KX0sbWFza1RvcFN0eWxlOmZ1bmN0aW9uKGUpe3RoaXMubWFza1RvcFN0eWxlU3luYz10aGlzLmdldFN0eWxlKGUpfSxtYXNrQm90dG9tU3R5bGU6ZnVuY3Rpb24oZSl7dGhpcy5tYXNrQm90dG9tU3R5bGVTeW5jPXRoaXMuZ2V0U3R5bGUoZSl9LGluZGljYXRvclN0eWxlOmZ1bmN0aW9uKGUpe3RoaXMuaW5kaWNhdG9yU3R5bGVTeW5jPXRoaXMuZ2V0U3R5bGUoZSl9fSxtZXRob2RzOntnZXRTdHlsZTpmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwic3RyaW5nIj09dHlwZW9mIGU/cGFyc2VTdHlsZVRleHQoZSk6ZSl9LGdldEl0ZW1JbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5pdGVtcy5pbmRleE9mKGUpfSxnZXRJdGVtVmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudmFsdWVTeW5jW3RoaXMuZ2V0SXRlbUluZGV4KGUuJHZub2RlKV18fDB9LHNldEl0ZW1WYWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZ2V0SXRlbUluZGV4KGUuJHZub2RlKTt0aGlzLnZhbHVlU3luY1tuXT10O3ZhciByPVtdLmNvbmNhdCh0aGlzLnZhbHVlU3luYyk7dGhpcy4kZW1pdCgidXBkYXRlOnZhbHVlIixyKSx0aGlzLiR0cmlnZ2VyKCJjaGFuZ2UiLHt2YWx1ZTpyfSl9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5pdGVtcz1bXX0scmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PVtdO3JldHVybihBcnJheS5pc0FycmF5KHRoaXMuJHNsb3RzLmRlZmF1bHQpP2RlZXBDbG9uZSh0aGlzLiRzbG90cy5kZWZhdWx0LGUpOltdKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuY29tcG9uZW50T3B0aW9ucyYmInBpY2tlci12aWV3LWNvbHVtbiI9PT1lLmNvbXBvbmVudE9wdGlvbnMudGFnJiZ0LnB1c2goZSl9KSx0aGlzLml0ZW1zPXQsZSgiZGl2Iix0aGlzLl9nKHtzdGF0aWNDbGFzczpbInVuaS1waWNrZXItdmlldyJdLGF0dHJzOntwcmV2ZW50R2VzdHVyZTohMH19LHRoaXMuJGxpc3RlbmVycyksW2UoImRpdiIse3N0YXRpY0NsYXNzOlsidW5pLXBpY2tlci12aWV3LXdyYXBwZXIiXX0sdCldLDIpfSxzdHlsZTp7InVuaS1waWNrZXItdmlldyI6e3Bvc2l0aW9uOiJyZWxhdGl2ZSJ9LCJ1bmktcGlja2VyLXZpZXctd3JhcHBlciI6e2Rpc3BsYXk6ImZsZXgiLGZsZXhEaXJlY3Rpb246InJvdyIscG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAscmlnaHQ6MCxib3R0b206MCxvdmVyZmxvdzoiaGlkZGVuIn19fX1mdW5jdGlvbiBpbml0JDIzKGUsdCl7ZS5jb21wb25lbnQoInBpY2tlci12aWV3IixnZXRQaWNrZXJWaWV3KHQpKX1mdW5jdGlvbiBnZXRIZWlnaHQoZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciB0PShlLmhlaWdodHx8ZS5saW5lSGVpZ2h0fHwiIikubWF0Y2goLygtP1tcZFwuXSspcHgvKSxuPTA7cmV0dXJuIHQmJihuPXBhcnNlRmxvYXQodFsxXSkpLG59ZnVuY3Rpb24gZ2V0UGlja2VyVmlld0NvbHVtbihlKXt2YXIgcj1lLnJlcXVpcmVNb2R1bGUoImRvbSIpLG89ImFuZHJvaWQiPT09ZS5jb25maWcuZW52LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCk7cmV0dXJue25hbWU6IlBpY2tlclZpZXdDb2x1bW4iLGlzUmVzZXJ2ZWQ6ITAscHJvcHM6e2xlbmd0aDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDowfX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntpbmRpY2F0b3JIZWlnaHQ6Z2V0SGVpZ2h0KHRoaXMuJHBhcmVudC5pbmRpY2F0b3JTdHlsZVN5bmMpLGhlaWdodDpwYXJzZUZsb2F0KHRoaXMuJHBhcmVudC5oZWlnaHQpLGN1cnJlbnQ6dGhpcy4kcGFyZW50LmdldEl0ZW1WYWx1ZSh0aGlzKX19LHdhdGNoOntjdXJyZW50OmZ1bmN0aW9uKGUpe3RoaXMuX2lzTW91bnRlZCYmdGhpcy4kcGFyZW50LnNldEl0ZW1WYWx1ZSh0aGlzLGUpfSxsZW5ndGg6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnNldEN1cnJlbnQoZS5jdXJyZW50LCEwLCEwKX0sMTUwKX19LG1vdW50ZWQ6ZnVuY3Rpb24oKXt0aGlzLmNoZWNrTW91bnRlZCgpfSxtZXRob2RzOntjaGVja01vdW50ZWQ6ZnVuY3Rpb24oKXt2YXIgbixyLGk9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7UHJvbWlzZS5hbGwoW2kuX2dldENvbXBvbmVudFNpemUoaS4kcmVmcy5lbCkudGhlbihmdW5jdGlvbihlKXt2YXIgdD1lLmhlaWdodDtuPWkuaGVpZ2h0PXR9KSxvJiZpLmxlbmd0aD9pLl9nZXRDb21wb25lbnRTaXplKGkuJHJlZnMuaXRlbSkudGhlbihmdW5jdGlvbihlKXt2YXIgdD1lLmhlaWdodDtyPWkuaW5kaWNhdG9ySGVpZ2h0PXQvaS5sZW5ndGh9KTppLl9nZXRDb21wb25lbnRTaXplKGkuJHJlZnMuaW5kaWNhdG9yKS50aGVuKGZ1bmN0aW9uKGUpe3ZhciB0PWUuaGVpZ2h0O3I9aS5pbmRpY2F0b3JIZWlnaHQ9dH0pXSkudGhlbihmdW5jdGlvbigpe24mJnI/c2V0VGltZW91dChmdW5jdGlvbigpe2kuc2V0Q3VycmVudChpLmN1cnJlbnQsITEsITApLGkuX2lzTW91bnRlZD0hMH0sNTApOmkuY2hlY2tNb3VudGVkKCl9KX0sNTApfSxvblNjcm9sbGVuZDpmdW5jdGlvbihlKXtpZighKERhdGUubm93KCktdGhpcy5zY3JvbGxUb0VsZW1lbnRUaW1lPDM0MCkpe3ZhciB0PWUuZGV0YWlsLmNvbnRlbnRPZmZzZXQueSxuPU1hdGgucm91bmQodC90aGlzLmluZGljYXRvckhlaWdodCk7dCV0aGlzLmluZGljYXRvckhlaWdodD90aGlzLnNldEN1cnJlbnQobiwhMCwhMCk6dGhpcy5jdXJyZW50PW59fSxzZXRDdXJyZW50OmZ1bmN0aW9uKGUsdCxuKXt2b2lkIDA9PT10JiYodD0hMCksKHRoaXMuY3VycmVudCE9PWV8fG4pJiYoci5zY3JvbGxUb0VsZW1lbnQodGhpcy4kcmVmcy5jb250ZW50LHtvZmZzZXQ6ZSp0aGlzLmluZGljYXRvckhlaWdodCxhbmltYXRlZDp0fSksdGhpcy5jdXJyZW50PWUsdCYmKHRoaXMuc2Nyb2xsVG9FbGVtZW50VGltZT1EYXRlLm5vdygpKSl9LF9nZXRDb21wb25lbnRTaXplOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihuKXtyLmdldENvbXBvbmVudFJlY3QoZSxmdW5jdGlvbihlKXt2YXIgdD1lLnNpemU7bih0KX0pfSl9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy4kc2xvdHMuZGVmYXVsdCxuPSh0aGlzLmhlaWdodC10aGlzLmluZGljYXRvckhlaWdodCkvMixyPXRoaXMuaGVpZ2h0LW4rInB4IjtuKz0icHgiO3ZhciBpPXtzaG93U2Nyb2xsYmFyOiExLHNjcm9sbFRvQmVnaW46ITEsZGVjZWxlcmF0aW9uUmF0ZTouMyxzY3JvbGxZOiEwfTtyZXR1cm4gb3x8KGkuc2Nyb2xsVG9wPXRoaXMuY3VycmVudCp0aGlzLmluZGljYXRvckhlaWdodCksZSgiZGl2Iix0aGlzLl9nKHtyZWY6ImVsIixzdGF0aWNDbGFzczpbInVuaS1waWNrZXItdmlldy1jb2x1bW4iXX0sdGhpcy4kbGlzdGVuZXJzKSxbZSgic2Nyb2xsLXZpZXciLHtzdGF0aWNDbGFzczpbInVuaS1waWNrZXItdmlldy1ncm91cCJdLGF0dHJzOmksb246e3Njcm9sbGVuZDp0aGlzLm9uU2Nyb2xsZW5kfSxzdHlsZTp7ZmxleERpcmVjdGlvbjoiY29sdW1uIn19LFtlKCJkaXYiLHtyZWY6ImNvbnRlbnQiLHN0YXRpY0NsYXNzOlsidW5pLXBpY2tlci12aWV3LWNvbnRlbnQiXSxzdHlsZTp7ZmxleERpcmVjdGlvbjoiY29sdW1uIixwYWRkaW5nVG9wOm4scGFkZGluZ0JvdHRvbTpufX0sbz9bZSgiZGl2Iix7cmVmOiJpdGVtIixzdHlsZTp7ZmxleERpcmVjdGlvbjoiY29sdW1uIn19LHQpXTp0KV0pLGUoInUtc2NhbGFibGUiLHtzdGF0aWNDbGFzczpbInVuaS1waWNrZXItdmlldy1tYXNrIl19LFtlKCJ1LXNjYWxhYmxlIix7c3RhdGljQ2xhc3M6WyJ1bmktcGlja2VyLXZpZXctbWFzayIsInVuaS1waWNrZXItdmlldy1tYXNrLXRvcCJdLHN0eWxlOk9iamVjdC5hc3NpZ24oe30sdGhpcy4kcGFyZW50Lm1hc2tUb3BTdHlsZVN5bmMse2JvdHRvbTpyfSl9KSxlKCJ1LXNjYWxhYmxlIix7c3RhdGljQ2xhc3M6WyJ1bmktcGlja2VyLXZpZXctbWFzayIsInVuaS1waWNrZXItdmlldy1tYXNrLWJvdHRvbSJdLHN0eWxlOk9iamVjdC5hc3NpZ24oe30sdGhpcy4kcGFyZW50Lm1hc2tCb3R0b21TdHlsZVN5bmMse3RvcDpyfSl9KV0pLGUoInUtc2NhbGFibGUiLHtyZWY6ImluZGljYXRvciIsc3RhdGljQ2xhc3M6WyJ1bmktcGlja2VyLXZpZXctaW5kaWNhdG9yIl0sc3R5bGU6T2JqZWN0LmFzc2lnbih7fSx0aGlzLiRwYXJlbnQuaW5kaWNhdG9yU3R5bGVTeW5jLHt0b3A6bn0pfSldLDIpfSxzdHlsZTp7InVuaS1waWNrZXItdmlldy1jb2x1bW4iOntmbGV4OjEscG9zaXRpb246InJlbGF0aXZlIixhbGlnbkl0ZW1zOiJzdHJldGNoIixvdmVyZmxvdzoiaGlkZGVuIn0sInVuaS1waWNrZXItdmlldy1tYXNrIjp7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAscmlnaHQ6MCxib3R0b206MCxwb2ludGVyRXZlbnRzOiJub25lIn0sInVuaS1waWNrZXItdmlldy1tYXNrLXRvcCI6e2JvdHRvbTowLGJhY2tncm91bmRJbWFnZToibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSxyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpLHJnYmEoMjU1LCAyNTUsIDI1NSwgMC42KSkifSwidW5pLXBpY2tlci12aWV3LW1hc2stYm90dG9tIjp7dG9wOjAsYmFja2dyb3VuZEltYWdlOiJsaW5lYXItZ3JhZGllbnQodG8gdG9wLHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45NSkscmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpKSJ9LCJ1bmktcGlja2VyLXZpZXctZ3JvdXAiOntwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxyaWdodDowLGJvdHRvbTowfSwidW5pLXBpY2tlci12aWV3LWNvbnRlbnQiOntwYWRkaW5nVG9wOjAscGFkZGluZ1JpZ2h0OjAscGFkZGluZ0JvdHRvbTowLHBhZGRpbmdMZWZ0OjB9LCJ1bmktcGlja2VyLXZpZXctaW5kaWNhdG9yIjp7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OjAscmlnaHQ6MCx0b3A6MCxoZWlnaHQ6IjM0cHgiLHBvaW50ZXJFdmVudHM6Im5vbmUiLGJvcmRlckNvbG9yOiIjZTVlNWU1Iixib3JkZXJUb3BXaWR0aDoiMXB4Iixib3JkZXJCb3R0b21XaWR0aDoiMXB4In19fX1mdW5jdGlvbiBpbml0JDI0KGUsdCl7ZS5jb21wb25lbnQoInBpY2tlci12aWV3LWNvbHVtbiIsZ2V0UGlja2VyVmlld0NvbHVtbih0KSl9dmFyIGluaXRDb21wb25lbnRzPVtpbml0JDMsaW5pdCQ0LGluaXQkNSxpbml0JDYsaW5pdCQ3LGluaXQkOCxpbml0JDksaW5pdCQxMCxpbml0JDExLGluaXQkMTIsaW5pdCQxMyxpbml0JDE0LGluaXQkMTUsaW5pdCQxNixpbml0JDE3LGluaXQkMTgsaW5pdCQxOSxpbml0JDIwLGluaXQkMjEsaW5pdCQyMixpbml0JDIzLGluaXQkMjRdLHVuaUFwcD17aW5zdGFsbDpmdW5jdGlvbihvLGEpe28uY29uZmlnLmVycm9ySGFuZGxlcj1mdW5jdGlvbihlLHQsbil7dmFyIHI9dG9SYXdUeXBlKGUpO28udXRpbC53YXJuKCJFcnJvciBpbiAiK24rJzogIicrKCJFcnJvciI9PT1yP2UudG9TdHJpbmcoKTplKSsnIicsdCk7dmFyIGk9ImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0QXBwJiZhLmdldEFwcCgpO2kmJmhhc0xpZmVjeWNsZUhvb2soaS4kb3B0aW9ucywib25FcnJvciIpP2kuX19jYWxsX2hvb2soIm9uRXJyb3IiLGUpOmNvbnNvbGUuZXJyb3IoZSl9LG8ucHJvdG90eXBlLl8kYnVzPW5ldyBvLG8ucHJvdG90eXBlLmdldE9wZW5lckV2ZW50Q2hhbm5lbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRyb290LiRzY29wZS5ldmVudENoYW5uZWx8fCh0aGlzLiRyb290LiRzY29wZS5ldmVudENoYW5uZWw9bmV3IGEuRXZlbnRDaGFubmVsKSx0aGlzLiRyb290LiRzY29wZS5ldmVudENoYW5uZWx9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLnByb3RvdHlwZSwiJHBhZ2UiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy4kc2NvcGUmJnRoaXMuJHJvb3QmJnRoaXMuJHJvb3QuJHNjb3BlJiYodGhpcy4kc2NvcGU9dGhpcy4kcm9vdC4kc2NvcGUpLHRoaXMuJHNjb3BlLiRwYWdlfX0pLHN0eWxlTWl4aW4obyksdW5pSWRNaXhpbihvLGEpLGxpZmVjeWNsZU1peGluKG8sYS53ZWV4LGEpLCJ3ZWV4IiE9PWEuX191bmlDb25maWcubnZ1ZUNvbXBpbGVyJiZpbml0Q29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UobyxhLndlZXgsYSl9KX19O2Z1bmN0aW9uIHZ1ZUZhY3RvcnkoZSx0KXt2YXIgbT1PYmplY3QuZnJlZXplKHt9KTtmdW5jdGlvbiBqKGUpe3JldHVybiBudWxsPT1lfWZ1bmN0aW9uIEwoZSl7cmV0dXJuIG51bGwhPWV9ZnVuY3Rpb24gTihlKXtyZXR1cm4hMD09PWV9ZnVuY3Rpb24gYyhlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZXx8InN5bWJvbCI9PXR5cGVvZiBlfHwiYm9vbGVhbiI9PXR5cGVvZiBlfWZ1bmN0aW9uIHkoZSl7cmV0dXJuIG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV9dmFyIG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBkKGUpe3JldHVybiBuLmNhbGwoZSkuc2xpY2UoOCwtMSl9ZnVuY3Rpb24gdShlKXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PW4uY2FsbChlKX1mdW5jdGlvbiBpKGUpe3JldHVybiJbb2JqZWN0IFJlZ0V4cF0iPT09bi5jYWxsKGUpfWZ1bmN0aW9uIG8oZSl7dmFyIHQ9cGFyc2VGbG9hdChTdHJpbmcoZSkpO3JldHVybiAwPD10JiZNYXRoLmZsb29yKHQpPT09dCYmaXNGaW5pdGUoZSl9ZnVuY3Rpb24gXyhlKXtyZXR1cm4gTChlKSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudGhlbiYmImZ1bmN0aW9uIj09dHlwZW9mIGUuY2F0Y2h9ZnVuY3Rpb24gcihlKXtyZXR1cm4gbnVsbD09ZT8iIjpBcnJheS5pc0FycmF5KGUpfHx1KGUpJiZlLnRvU3RyaW5nPT09bj9KU09OLnN0cmluZ2lmeShlLG51bGwsMik6U3RyaW5nKGUpfWZ1bmN0aW9uIGEoZSl7dmFyIHQ9cGFyc2VGbG9hdChlKTtyZXR1cm4gaXNOYU4odCk/ZTp0fWZ1bmN0aW9uIHMoZSx0KXtmb3IodmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPWUuc3BsaXQoIiwiKSxpPTA7aTxyLmxlbmd0aDtpKyspbltyW2ldXT0hMDtyZXR1cm4gdD9mdW5jdGlvbihlKXtyZXR1cm4gbltlLnRvTG93ZXJDYXNlKCldfTpmdW5jdGlvbihlKXtyZXR1cm4gbltlXX19dmFyIGw9cygic2xvdCxjb21wb25lbnQiLCEwKSxmPXMoImtleSxyZWYsc2xvdCxzbG90LXNjb3BlLGlzIik7ZnVuY3Rpb24gYihlLHQpe2lmKGUubGVuZ3RoKXt2YXIgbj1lLmluZGV4T2YodCk7aWYoLTE8bilyZXR1cm4gZS5zcGxpY2UobiwxKX19dmFyIHA9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiB3KGUsdCl7cmV0dXJuIHAuY2FsbChlLHQpfWZ1bmN0aW9uIGgodCl7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV18fChuW2VdPXQoZSkpfX12YXIgdj0vLShcdykvZyxnPWgoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSh2LGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/dC50b1VwcGVyQ2FzZSgpOiIifSl9KSxrPWgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKX0pLFM9L1xCKFtBLVpdKS9nLHg9aChmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKFMsIi0kMSIpLnRvTG93ZXJDYXNlKCl9KTt2YXIgQz1GdW5jdGlvbi5wcm90b3R5cGUuYmluZD9mdW5jdGlvbihlLHQpe3JldHVybiBlLmJpbmQodCl9OmZ1bmN0aW9uKG4scil7ZnVuY3Rpb24gZShlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoO3JldHVybiB0PzE8dD9uLmFwcGx5KHIsYXJndW1lbnRzKTpuLmNhbGwocixlKTpuLmNhbGwocil9cmV0dXJuIGUuX2xlbmd0aD1uLmxlbmd0aCxlfTtmdW5jdGlvbiBUKGUsdCl7dD10fHwwO2Zvcih2YXIgbj1lLmxlbmd0aC10LHI9bmV3IEFycmF5KG4pO24tLTspcltuXT1lW24rdF07cmV0dXJuIHJ9ZnVuY3Rpb24gTyhlLHQpe2Zvcih2YXIgbiBpbiB0KWVbbl09dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBFKGUpe2Zvcih2YXIgdD17fSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXSYmTyh0LGVbbl0pO3JldHVybiB0fWZ1bmN0aW9uIEEoZSx0LG4pe312YXIgST1mdW5jdGlvbihlLHQsbil7cmV0dXJuITF9LCQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9O2Z1bmN0aW9uIFAodCxuKXtpZih0PT09bilyZXR1cm4hMDt2YXIgZT15KHQpLHI9eShuKTtpZighZXx8IXIpcmV0dXJuIWUmJiFyJiZTdHJpbmcodCk9PT1TdHJpbmcobik7dHJ5e3ZhciBpPUFycmF5LmlzQXJyYXkodCksbz1BcnJheS5pc0FycmF5KG4pO2lmKGkmJm8pcmV0dXJuIHQubGVuZ3RoPT09bi5sZW5ndGgmJnQuZXZlcnkoZnVuY3Rpb24oZSx0KXtyZXR1cm4gUChlLG5bdF0pfSk7aWYodCBpbnN0YW5jZW9mIERhdGUmJm4gaW5zdGFuY2VvZiBEYXRlKXJldHVybiB0LmdldFRpbWUoKT09PW4uZ2V0VGltZSgpO2lmKGl8fG8pcmV0dXJuITE7dmFyIGE9T2JqZWN0LmtleXModCkscz1PYmplY3Qua2V5cyhuKTtyZXR1cm4gYS5sZW5ndGg9PT1zLmxlbmd0aCYmYS5ldmVyeShmdW5jdGlvbihlKXtyZXR1cm4gUCh0W2VdLG5bZV0pfSl9Y2F0Y2goZSl7cmV0dXJuITF9fWZ1bmN0aW9uIE0oZSx0KXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylpZihQKGVbbl0sdCkpcmV0dXJuIG47cmV0dXJuLTF9ZnVuY3Rpb24gQihlKXt2YXIgdD0hMTtyZXR1cm4gZnVuY3Rpb24oKXt0fHwodD0hMCxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fXZhciBEPSJkYXRhLXNlcnZlci1yZW5kZXJlZCIsUj1bImNvbXBvbmVudCIsImRpcmVjdGl2ZSIsImZpbHRlciJdLEY9WyJiZWZvcmVDcmVhdGUiLCJjcmVhdGVkIiwiYmVmb3JlTW91bnQiLCJtb3VudGVkIiwiYmVmb3JlVXBkYXRlIiwidXBkYXRlZCIsImJlZm9yZURlc3Ryb3kiLCJkZXN0cm95ZWQiLCJhY3RpdmF0ZWQiLCJkZWFjdGl2YXRlZCIsImVycm9yQ2FwdHVyZWQiLCJzZXJ2ZXJQcmVmZXRjaCJdLHo9e29wdGlvbk1lcmdlU3RyYXRlZ2llczpPYmplY3QuY3JlYXRlKG51bGwpLHNpbGVudDohMSxwcm9kdWN0aW9uVGlwOiEwLGRldnRvb2xzOiEwLHBlcmZvcm1hbmNlOiExLGVycm9ySGFuZGxlcjpudWxsLHdhcm5IYW5kbGVyOm51bGwsaWdub3JlZEVsZW1lbnRzOltdLGtleUNvZGVzOk9iamVjdC5jcmVhdGUobnVsbCksaXNSZXNlcnZlZFRhZzpJLGlzUmVzZXJ2ZWRBdHRyOkksaXNVbmtub3duRWxlbWVudDpJLGdldFRhZ05hbWVzcGFjZTpBLHBhcnNlUGxhdGZvcm1UYWdOYW1lOiQsbXVzdFVzZVByb3A6SSxhc3luYzohMCxfbGlmZWN5Y2xlSG9va3M6Rn0sVT0vYS16QS1aXHUwMEI3XHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMzdEXHUwMzdGLVx1MUZGRlx1MjAwQy1cdTIwMERcdTIwM0YtXHUyMDQwXHUyMDcwLVx1MjE4Rlx1MkMwMC1cdTJGRUZcdTMwMDEtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRkQvO2Z1bmN0aW9uIFYoZSl7dmFyIHQ9KGUrIiIpLmNoYXJDb2RlQXQoMCk7cmV0dXJuIDM2PT09dHx8OTU9PT10fWZ1bmN0aW9uIHEoZSx0LG4scil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEhcix3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KX12YXIgVz1uZXcgUmVnRXhwKCJbXiIrVS5zb3VyY2UrIi4kX1xcZF0iKTt2YXIgSCxHPSJfX3Byb3RvX18iaW57fSxYPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93LFk9InVuZGVmaW5lZCIhPXR5cGVvZiBXWEVudmlyb25tZW50JiYhIVdYRW52aXJvbm1lbnQucGxhdGZvcm0sSj1ZJiZXWEVudmlyb25tZW50LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCksSz1YJiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLFo9SyYmL21zaWV8dHJpZGVudC8udGVzdChLKSxRPShLJiZLLmluZGV4T2YoIm1zaWUgOS4wIiksSyYmMDxLLmluZGV4T2YoImVkZ2UvIikpLGVlPShLJiZLLmluZGV4T2YoImFuZHJvaWQiKSxLJiYvaXBob25lfGlwYWR8aXBvZHxpb3MvLnRlc3QoSyksSyYmL2Nocm9tZVwvXGQrLy50ZXN0KEspLEsmJi9waGFudG9tanMvLnRlc3QoSyksSyYmSy5tYXRjaCgvZmlyZWZveFwvKFxkKykvKSx7fS53YXRjaCk7aWYoWCl0cnl7dmFyIHRlPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0ZSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe319KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdC1wYXNzaXZlIixudWxsLHRlKX1jYXRjaChlKXt9dmFyIG5lPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PUgmJihIPSFYJiYhWSYmdm9pZCAwIT09Z2xvYmFsJiYoZ2xvYmFsLnByb2Nlc3MmJiJzZXJ2ZXIiPT09Z2xvYmFsLnByb2Nlc3MuZW52LlZVRV9FTlYpKSxIfSxyZT1YJiZ3aW5kb3cuX19WVUVfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztmdW5jdGlvbiBpZShlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYmL25hdGl2ZSBjb2RlLy50ZXN0KGUudG9TdHJpbmcoKSl9dmFyIG9lLGFlPSJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZpZShTeW1ib2wpJiYidW5kZWZpbmVkIiE9dHlwZW9mIFJlZmxlY3QmJmllKFJlZmxlY3Qub3duS2V5cyk7b2U9InVuZGVmaW5lZCIhPXR5cGVvZiBTZXQmJmllKFNldCk/U2V0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3RoaXMuc2V0PU9iamVjdC5jcmVhdGUobnVsbCl9cmV0dXJuIGUucHJvdG90eXBlLmhhcz1mdW5jdGlvbihlKXtyZXR1cm4hMD09PXRoaXMuc2V0W2VdfSxlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oZSl7dGhpcy5zZXRbZV09ITB9LGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5zZXQ9T2JqZWN0LmNyZWF0ZShudWxsKX0sZX0oKTt2YXIgc2U9QSxjZT1BLHVlPUEsbGU9QSxkZT0idW5kZWZpbmVkIiE9dHlwZW9mIGNvbnNvbGUsZmU9Lyg/Ol58Wy1fXSkoXHcpL2c7c2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10P3VlKHQpOiIiO3oud2FybkhhbmRsZXI/ei53YXJuSGFuZGxlci5jYWxsKG51bGwsZSx0LG4pOmRlJiYhei5zaWxlbnQmJmNvbnNvbGUuZXJyb3IoIltWdWUgd2Fybl06ICIrZStuKX0sY2U9ZnVuY3Rpb24oZSx0KXtkZSYmIXouc2lsZW50JiZjb25zb2xlLndhcm4oIltWdWUgdGlwXTogIitlKyh0P3VlKHQpOiIiKSl9LGxlPWZ1bmN0aW9uKGUsdCl7aWYoZS4kcm9vdD09PWUpcmV0dXJuIGUuJG9wdGlvbnMmJmUuJG9wdGlvbnMuX19maWxlPyJhdCAiK2UuJG9wdGlvbnMuX19maWxlKyI6MSI6IjxSb290PiI7dmFyIG49ImZ1bmN0aW9uIj09dHlwZW9mIGUmJm51bGwhPWUuY2lkP2Uub3B0aW9uczplLl9pc1Z1ZT9lLiRvcHRpb25zfHxlLmNvbnN0cnVjdG9yLm9wdGlvbnM6ZSxyPW4ubmFtZXx8bi5fY29tcG9uZW50VGFnLGk9bi5fX2ZpbGU7aWYoIXImJmkpe3ZhciBvPWkubWF0Y2goLyhbXi9cXF0rKVwudnVlJC8pO3I9byYmb1sxXX1yZXR1cm4ocj8iPCIrci5yZXBsYWNlKGZlLGZ1bmN0aW9uKGUpe3JldHVybiBlLnRvVXBwZXJDYXNlKCl9KS5yZXBsYWNlKC9bLV9dL2csIiIpKyI+IjoiPEFub255bW91cz4iKSsoaSYmITEhPT10PyIgYXQgIitpKyI6MSI6IiIpfTt1ZT1mdW5jdGlvbihlKXtpZihlLl9pc1Z1ZSYmZS4kcGFyZW50KXtmb3IodmFyIHQ9W10sbj0wO2U7KXtpZigwPHQubGVuZ3RoKXt2YXIgcj10W3QubGVuZ3RoLTFdO2lmKHIuY29uc3RydWN0b3I9PT1lLmNvbnN0cnVjdG9yKXtuKyssZT1lLiRwYXJlbnQ7Y29udGludWV9MDxuJiYodFt0Lmxlbmd0aC0xXT1bcixuXSxuPTApfXQucHVzaChlKSxlPWUuJHBhcmVudH1yZXR1cm4iXG5cbmZvdW5kIGluXG5cbiIrdC5tYXAoZnVuY3Rpb24oZSx0KXtyZXR1cm4iIisoMD09PXQ/Ii0tLVx4M2UgIjpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0iIjt0Oyl0JTI9PTEmJihuKz1lKSwxPHQmJihlKz1lKSx0Pj49MTtyZXR1cm4gbn0oIuOAgCIsMysxKnQpKSsoQXJyYXkuaXNBcnJheShlKT9sZShlWzBdKSsiLi4uICgiK2VbMV0rIiByZWN1cnNpdmUgY2FsbHMpIjpsZShlKSl9KS5qb2luKCJcbiIpfXJldHVybiJcblxuKGZvdW5kICIrbGUoZSkrIikifTt2YXIgcGU9MCxoZT1mdW5jdGlvbigpe3RoaXMuaWQ9dm9pZCAwIT09dD90LnVpZCsrOnBlKyssdGhpcy5zdWJzPVtdfTtmdW5jdGlvbiB2ZShlKXtoZS5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2sucHVzaChlKSxoZS5TaGFyZWRPYmplY3QudGFyZ2V0PWV9ZnVuY3Rpb24gZ2UoKXtoZS5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2sucG9wKCksaGUuU2hhcmVkT2JqZWN0LnRhcmdldD1oZS5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2tbaGUuU2hhcmVkT2JqZWN0LnRhcmdldFN0YWNrLmxlbmd0aC0xXX1oZS5wcm90b3R5cGUuYWRkU3ViPWZ1bmN0aW9uKGUpe3RoaXMuc3Vicy5wdXNoKGUpfSxoZS5wcm90b3R5cGUucmVtb3ZlU3ViPWZ1bmN0aW9uKGUpe2IodGhpcy5zdWJzLGUpfSxoZS5wcm90b3R5cGUuZGVwZW5kPWZ1bmN0aW9uKCl7aGUuU2hhcmVkT2JqZWN0LnRhcmdldCYmaGUuU2hhcmVkT2JqZWN0LnRhcmdldC5hZGREZXAodGhpcyl9LGhlLnByb3RvdHlwZS5ub3RpZnk9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnN1YnMuc2xpY2UoKTt6LmFzeW5jfHxlLnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5pZC10LmlkfSk7Zm9yKHZhciB0PTAsbj1lLmxlbmd0aDt0PG47dCsrKWVbdF0udXBkYXRlKCl9LGhlLlNoYXJlZE9iamVjdD12b2lkIDAhPT10P3Q6e30saGUuU2hhcmVkT2JqZWN0LnRhcmdldD1udWxsLGhlLlNoYXJlZE9iamVjdC50YXJnZXRTdGFjaz1bXTt2YXIgbWU9ZnVuY3Rpb24oZSx0LG4scixpLG8sYSxzKXt0aGlzLnRhZz1lLHRoaXMuZGF0YT10LHRoaXMuY2hpbGRyZW49bix0aGlzLnRleHQ9cix0aGlzLmVsbT1pLHRoaXMubnM9dm9pZCAwLHRoaXMuY29udGV4dD1vLHRoaXMuZm5Db250ZXh0PXZvaWQgMCx0aGlzLmZuT3B0aW9ucz12b2lkIDAsdGhpcy5mblNjb3BlSWQ9dm9pZCAwLHRoaXMua2V5PXQmJnQua2V5LHRoaXMuY29tcG9uZW50T3B0aW9ucz1hLHRoaXMuY29tcG9uZW50SW5zdGFuY2U9dm9pZCAwLHRoaXMucGFyZW50PXZvaWQgMCx0aGlzLnJhdz0hMSx0aGlzLmlzU3RhdGljPSExLHRoaXMuaXNSb290SW5zZXJ0PSEwLHRoaXMuaXNDb21tZW50PSExLHRoaXMuaXNDbG9uZWQ9ITEsdGhpcy5pc09uY2U9ITEsdGhpcy5hc3luY0ZhY3Rvcnk9cyx0aGlzLmFzeW5jTWV0YT12b2lkIDAsdGhpcy5pc0FzeW5jUGxhY2Vob2xkZXI9ITF9LHllPXtjaGlsZDp7Y29uZmlndXJhYmxlOiEwfX07eWUuY2hpbGQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcG9uZW50SW5zdGFuY2V9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG1lLnByb3RvdHlwZSx5ZSk7dmFyIF9lPWZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPSIiKTt2YXIgdD1uZXcgbWU7cmV0dXJuIHQudGV4dD1lLHQuaXNDb21tZW50PSEwLHR9O2Z1bmN0aW9uIGJlKGUpe3JldHVybiBuZXcgbWUodm9pZCAwLHZvaWQgMCx2b2lkIDAsU3RyaW5nKGUpKX1mdW5jdGlvbiB3ZShlKXt2YXIgdD1uZXcgbWUoZS50YWcsZS5kYXRhLGUuY2hpbGRyZW4mJmUuY2hpbGRyZW4uc2xpY2UoKSxlLnRleHQsZS5lbG0sZS5jb250ZXh0LGUuY29tcG9uZW50T3B0aW9ucyxlLmFzeW5jRmFjdG9yeSk7cmV0dXJuIHQubnM9ZS5ucyx0LmlzU3RhdGljPWUuaXNTdGF0aWMsdC5rZXk9ZS5rZXksdC5pc0NvbW1lbnQ9ZS5pc0NvbW1lbnQsdC5mbkNvbnRleHQ9ZS5mbkNvbnRleHQsdC5mbk9wdGlvbnM9ZS5mbk9wdGlvbnMsdC5mblNjb3BlSWQ9ZS5mblNjb3BlSWQsdC5hc3luY01ldGE9ZS5hc3luY01ldGEsdC5pc0Nsb25lZD0hMCx0fXZhciBrZT1BcnJheS5wcm90b3R5cGUsU2U9T2JqZWN0LmNyZWF0ZShrZSk7WyJwdXNoIiwicG9wIiwic2hpZnQiLCJ1bnNoaWZ0Iiwic3BsaWNlIiwic29ydCIsInJldmVyc2UiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBzPWtlW2FdO3EoU2UsYSxmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMsdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGg7bi0tOyl0W25dPWVbbl07dmFyIHIsaT1zLmFwcGx5KHRoaXMsdCksbz10aGlzLl9fb2JfXztzd2l0Y2goYSl7Y2FzZSJwdXNoIjpjYXNlInVuc2hpZnQiOnI9dDticmVhaztjYXNlInNwbGljZSI6cj10LnNsaWNlKDIpfXJldHVybiByJiZvLm9ic2VydmVBcnJheShyKSxvLmRlcC5ub3RpZnkoKSxpfSl9KTt2YXIgeGU9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoU2UpLENlPSEwO2Z1bmN0aW9uIFRlKGUpe0NlPWV9dmFyIE9lPWZ1bmN0aW9uKGUpe3ZhciB0O3RoaXMudmFsdWU9ZSx0aGlzLmRlcD1uZXcgaGUsdGhpcy52bUNvdW50PTAscShlLCJfX29iX18iLHRoaXMpLEFycmF5LmlzQXJyYXkoZSk/KEc/KHQ9U2UsZS5fX3Byb3RvX189dCk6ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj0wLGk9bi5sZW5ndGg7cjxpO3IrKyl7dmFyIG89bltyXTtxKGUsbyx0W29dKX19KGUsU2UseGUpLHRoaXMub2JzZXJ2ZUFycmF5KGUpKTp0aGlzLndhbGsoZSl9O2Z1bmN0aW9uIEVlKGUsdCl7dmFyIG47aWYoeShlKSYmIShlIGluc3RhbmNlb2YgbWUpKXJldHVybiB3KGUsIl9fb2JfXyIpJiZlLl9fb2JfXyBpbnN0YW5jZW9mIE9lP249ZS5fX29iX186Q2UmJiFuZSgpJiYoQXJyYXkuaXNBcnJheShlKXx8dShlKSkmJk9iamVjdC5pc0V4dGVuc2libGUoZSkmJiFlLl9pc1Z1ZSYmKG49bmV3IE9lKGUpKSx0JiZuJiZuLnZtQ291bnQrKyxufWZ1bmN0aW9uIEFlKG4sZSxyLGksbyl7dmFyIGE9bmV3IGhlLHQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpO2lmKCF0fHwhMSE9PXQuY29uZmlndXJhYmxlKXt2YXIgcz10JiZ0LmdldCxjPXQmJnQuc2V0O3MmJiFjfHwyIT09YXJndW1lbnRzLmxlbmd0aHx8KHI9bltlXSk7dmFyIHU9IW8mJkVlKHIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3ZhciBlPXM/cy5jYWxsKG4pOnI7cmV0dXJuIGhlLlNoYXJlZE9iamVjdC50YXJnZXQmJihhLmRlcGVuZCgpLHUmJih1LmRlcC5kZXBlbmQoKSxBcnJheS5pc0FycmF5KGUpJiZmdW5jdGlvbiBlKHQpe2Zvcih2YXIgbj12b2lkIDAscj0wLGk9dC5sZW5ndGg7cjxpO3IrKykobj10W3JdKSYmbi5fX29iX18mJm4uX19vYl9fLmRlcC5kZXBlbmQoKSxBcnJheS5pc0FycmF5KG4pJiZlKG4pfShlKSkpLGV9LHNldDpmdW5jdGlvbihlKXt2YXIgdD1zP3MuY2FsbChuKTpyO2U9PT10fHxlIT1lJiZ0IT10fHwoaSYmaSgpLHMmJiFjfHwoYz9jLmNhbGwobixlKTpyPWUsdT0hbyYmRWUoZSksYS5ub3RpZnkoKSkpfX0pfX1mdW5jdGlvbiBJZShlLHQsbil7aWYoKGooZSl8fGMoZSkpJiZzZSgiQ2Fubm90IHNldCByZWFjdGl2ZSBwcm9wZXJ0eSBvbiB1bmRlZmluZWQsIG51bGwsIG9yIHByaW1pdGl2ZSB2YWx1ZTogIitlKSxBcnJheS5pc0FycmF5KGUpJiZvKHQpKXJldHVybiBlLmxlbmd0aD1NYXRoLm1heChlLmxlbmd0aCx0KSxlLnNwbGljZSh0LDEsbiksbjtpZih0IGluIGUmJiEodCBpbiBPYmplY3QucHJvdG90eXBlKSlyZXR1cm4gZVt0XT1uO3ZhciByPWUuX19vYl9fO3JldHVybiBlLl9pc1Z1ZXx8ciYmci52bUNvdW50PyhzZSgiQXZvaWQgYWRkaW5nIHJlYWN0aXZlIHByb3BlcnRpZXMgdG8gYSBWdWUgaW5zdGFuY2Ugb3IgaXRzIHJvb3QgJGRhdGEgYXQgcnVudGltZSAtIGRlY2xhcmUgaXQgdXBmcm9udCBpbiB0aGUgZGF0YSBvcHRpb24uIiksbik6cj8oQWUoci52YWx1ZSx0LG4pLHIuZGVwLm5vdGlmeSgpLG4pOmVbdF09bn1mdW5jdGlvbiAkZShlLHQpe2lmKChqKGUpfHxjKGUpKSYmc2UoIkNhbm5vdCBkZWxldGUgcmVhY3RpdmUgcHJvcGVydHkgb24gdW5kZWZpbmVkLCBudWxsLCBvciBwcmltaXRpdmUgdmFsdWU6ICIrZSksQXJyYXkuaXNBcnJheShlKSYmbyh0KSllLnNwbGljZSh0LDEpO2Vsc2V7dmFyIG49ZS5fX29iX187ZS5faXNWdWV8fG4mJm4udm1Db3VudD9zZSgiQXZvaWQgZGVsZXRpbmcgcHJvcGVydGllcyBvbiBhIFZ1ZSBpbnN0YW5jZSBvciBpdHMgcm9vdCAkZGF0YSAtIGp1c3Qgc2V0IGl0IHRvIG51bGwuIik6dyhlLHQpJiYoZGVsZXRlIGVbdF0sbiYmbi5kZXAubm90aWZ5KCkpfX1PZS5wcm90b3R5cGUud2Fsaz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7bisrKUFlKGUsdFtuXSl9LE9lLnByb3RvdHlwZS5vYnNlcnZlQXJyYXk9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj1lLmxlbmd0aDt0PG47dCsrKUVlKGVbdF0pfTt2YXIgUGU9ei5vcHRpb25NZXJnZVN0cmF0ZWdpZXM7ZnVuY3Rpb24gTWUoZSx0KXtpZighdClyZXR1cm4gZTtmb3IodmFyIG4scixpLG89YWU/UmVmbGVjdC5vd25LZXlzKHQpOk9iamVjdC5rZXlzKHQpLGE9MDthPG8ubGVuZ3RoO2ErKykiX19vYl9fIiE9PShuPW9bYV0pJiYocj1lW25dLGk9dFtuXSx3KGUsbik/ciE9PWkmJnUocikmJnUoaSkmJk1lKHIsaSk6SWUoZSxuLGkpKTtyZXR1cm4gZX1mdW5jdGlvbiBqZShuLHIsaSl7cmV0dXJuIGk/ZnVuY3Rpb24oKXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmNhbGwoaSxpKTpyLHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5jYWxsKGksaSk6bjtyZXR1cm4gZT9NZShlLHQpOnR9OnI/bj9mdW5jdGlvbigpe3JldHVybiBNZSgiZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmNhbGwodGhpcyx0aGlzKTpyLCJmdW5jdGlvbiI9PXR5cGVvZiBuP24uY2FsbCh0aGlzLHRoaXMpOm4pfTpyOm59ZnVuY3Rpb24gTGUoZSx0KXt2YXIgbj10P2U/ZS5jb25jYXQodCk6QXJyYXkuaXNBcnJheSh0KT90Olt0XTplO3JldHVybiBuP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspLTE9PT10LmluZGV4T2YoZVtuXSkmJnQucHVzaChlW25dKTtyZXR1cm4gdH0obik6bn1mdW5jdGlvbiBOZShlLHQsbixyKXt2YXIgaT1PYmplY3QuY3JlYXRlKGV8fG51bGwpO3JldHVybiB0PyhSZShyLHQsbiksTyhpLHQpKTppfVBlLmVsPVBlLnByb3BzRGF0YT1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbnx8c2UoJ29wdGlvbiAiJytyKyciIGNhbiBvbmx5IGJlIHVzZWQgZHVyaW5nIGluc3RhbmNlIGNyZWF0aW9uIHdpdGggdGhlIGBuZXdgIGtleXdvcmQuJyksQmUoZSx0KX0sUGUuZGF0YT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4/amUoZSx0LG4pOnQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0PyhzZSgnVGhlICJkYXRhIiBvcHRpb24gc2hvdWxkIGJlIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgcGVyLWluc3RhbmNlIHZhbHVlIGluIGNvbXBvbmVudCBkZWZpbml0aW9ucy4nLG4pLGUpOmplKGUsdCl9LEYuZm9yRWFjaChmdW5jdGlvbihlKXtQZVtlXT1MZX0pLFIuZm9yRWFjaChmdW5jdGlvbihlKXtQZVtlKyJzIl09TmV9KSxQZS53YXRjaD1mdW5jdGlvbihlLHQsbixyKXtpZihlPT09ZWUmJihlPXZvaWQgMCksdD09PWVlJiYodD12b2lkIDApLCF0KXJldHVybiBPYmplY3QuY3JlYXRlKGV8fG51bGwpO2lmKFJlKHIsdCxuKSwhZSlyZXR1cm4gdDt2YXIgaT17fTtmb3IodmFyIG8gaW4gTyhpLGUpLHQpe3ZhciBhPWlbb10scz10W29dO2EmJiFBcnJheS5pc0FycmF5KGEpJiYoYT1bYV0pLGlbb109YT9hLmNvbmNhdChzKTpBcnJheS5pc0FycmF5KHMpP3M6W3NdfXJldHVybiBpfSxQZS5wcm9wcz1QZS5tZXRob2RzPVBlLmluamVjdD1QZS5jb21wdXRlZD1mdW5jdGlvbihlLHQsbixyKXtpZih0JiZSZShyLHQsbiksIWUpcmV0dXJuIHQ7dmFyIGk9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gTyhpLGUpLHQmJk8oaSx0KSxpfSxQZS5wcm92aWRlPWplO3ZhciBCZT1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT10P2U6dH07ZnVuY3Rpb24gRGUoZSl7bmV3IFJlZ0V4cCgiXlthLXpBLVpdW1xcLVxcLjAtOV8iK1Uuc291cmNlKyJdKiQiKS50ZXN0KGUpfHxzZSgnSW52YWxpZCBjb21wb25lbnQgbmFtZTogIicrZSsnIi4gQ29tcG9uZW50IG5hbWVzIHNob3VsZCBjb25mb3JtIHRvIHZhbGlkIGN1c3RvbSBlbGVtZW50IG5hbWUgaW4gaHRtbDUgc3BlY2lmaWNhdGlvbi4nKSwobChlKXx8ei5pc1Jlc2VydmVkVGFnKGUpKSYmc2UoIkRvIG5vdCB1c2UgYnVpbHQtaW4gb3IgcmVzZXJ2ZWQgSFRNTCBlbGVtZW50cyBhcyBjb21wb25lbnQgaWQ6ICIrZSl9ZnVuY3Rpb24gUmUoZSx0LG4pe3UodCl8fHNlKCdJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gIicrZSsnIjogZXhwZWN0ZWQgYW4gT2JqZWN0LCBidXQgZ290ICcrZCh0KSsiLiIsbil9ZnVuY3Rpb24gRmUobixyLGkpe2lmKGZ1bmN0aW9uKGUpe2Zvcih2YXIgdCBpbiBlLmNvbXBvbmVudHMpRGUodCl9KHIpLCJmdW5jdGlvbiI9PXR5cGVvZiByJiYocj1yLm9wdGlvbnMpLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5wcm9wcztpZihuKXt2YXIgcixpLG89e307aWYoQXJyYXkuaXNBcnJheShuKSlmb3Iocj1uLmxlbmd0aDtyLS07KSJzdHJpbmciPT10eXBlb2YoaT1uW3JdKT9vW2coaSldPXt0eXBlOm51bGx9OnNlKCJwcm9wcyBtdXN0IGJlIHN0cmluZ3Mgd2hlbiB1c2luZyBhcnJheSBzeW50YXguIik7ZWxzZSBpZih1KG4pKWZvcih2YXIgYSBpbiBuKWk9blthXSxvW2coYSldPXUoaSk/aTp7dHlwZTppfTtlbHNlIHNlKCdJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gInByb3BzIjogZXhwZWN0ZWQgYW4gQXJyYXkgb3IgYW4gT2JqZWN0LCBidXQgZ290ICcrZChuKSsiLiIsdCk7ZS5wcm9wcz1vfX0ocixpKSxmdW5jdGlvbihlLHQpe3ZhciBuPWUuaW5qZWN0O2lmKG4pe3ZhciByPWUuaW5qZWN0PXt9O2lmKEFycmF5LmlzQXJyYXkobikpZm9yKHZhciBpPTA7aTxuLmxlbmd0aDtpKyspcltuW2ldXT17ZnJvbTpuW2ldfTtlbHNlIGlmKHUobikpZm9yKHZhciBvIGluIG4pe3ZhciBhPW5bb107cltvXT11KGEpP08oe2Zyb206b30sYSk6e2Zyb206YX19ZWxzZSBzZSgnSW52YWxpZCB2YWx1ZSBmb3Igb3B0aW9uICJpbmplY3QiOiBleHBlY3RlZCBhbiBBcnJheSBvciBhbiBPYmplY3QsIGJ1dCBnb3QgJytkKG4pKyIuIix0KX19KHIsaSksZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kaXJlY3RpdmVzO2lmKHQpZm9yKHZhciBuIGluIHQpe3ZhciByPXRbbl07ImZ1bmN0aW9uIj09dHlwZW9mIHImJih0W25dPXtiaW5kOnIsdXBkYXRlOnJ9KX19KHIpLCFyLl9iYXNlJiYoci5leHRlbmRzJiYobj1GZShuLHIuZXh0ZW5kcyxpKSksci5taXhpbnMpKWZvcih2YXIgZT0wLHQ9ci5taXhpbnMubGVuZ3RoO2U8dDtlKyspbj1GZShuLHIubWl4aW5zW2VdLGkpO3ZhciBvLGE9e307Zm9yKG8gaW4gbilzKG8pO2ZvcihvIGluIHIpdyhuLG8pfHxzKG8pO2Z1bmN0aW9uIHMoZSl7dmFyIHQ9UGVbZV18fEJlO2FbZV09dChuW2VdLHJbZV0saSxlKX1yZXR1cm4gYX1mdW5jdGlvbiB6ZShlLHQsbixyKXtpZigic3RyaW5nIj09dHlwZW9mIG4pe3ZhciBpPWVbdF07aWYodyhpLG4pKXJldHVybiBpW25dO3ZhciBvPWcobik7aWYodyhpLG8pKXJldHVybiBpW29dO3ZhciBhPWsobyk7aWYodyhpLGEpKXJldHVybiBpW2FdO3ZhciBzPWlbbl18fGlbb118fGlbYV07cmV0dXJuIHImJiFzJiZzZSgiRmFpbGVkIHRvIHJlc29sdmUgIit0LnNsaWNlKDAsLTEpKyI6ICIrbixlKSxzfX1mdW5jdGlvbiBVZShlLHQsbixyKXt2YXIgaT10W2VdLG89IXcobixlKSxhPW5bZV0scz1HZShCb29sZWFuLGkudHlwZSk7aWYoLTE8cylpZihvJiYhdyhpLCJkZWZhdWx0IikpYT0hMTtlbHNlIGlmKCIiPT09YXx8YT09PXgoZSkpe3ZhciBjPUdlKFN0cmluZyxpLnR5cGUpOyhjPDB8fHM8YykmJihhPSEwKX1pZih2b2lkIDA9PT1hKXthPWZ1bmN0aW9uKGUsdCxuKXtpZighdyh0LCJkZWZhdWx0IikpcmV0dXJuO3ZhciByPXQuZGVmYXVsdDt5KHIpJiZzZSgnSW52YWxpZCBkZWZhdWx0IHZhbHVlIGZvciBwcm9wICInK24rJyI6IFByb3BzIHdpdGggdHlwZSBPYmplY3QvQXJyYXkgbXVzdCB1c2UgYSBmYWN0b3J5IGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4nLGUpO2lmKGUmJmUuJG9wdGlvbnMucHJvcHNEYXRhJiZ2b2lkIDA9PT1lLiRvcHRpb25zLnByb3BzRGF0YVtuXSYmdm9pZCAwIT09ZS5fcHJvcHNbbl0pcmV0dXJuIGUuX3Byb3BzW25dO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiByJiYiRnVuY3Rpb24iIT09V2UodC50eXBlKT9yLmNhbGwoZSk6cn0ocixpLGUpO3ZhciB1PUNlO1RlKCEwKSxFZShhKSxUZSh1KX1yZXR1cm4gZnVuY3Rpb24oZSx0LG4scixpKXtpZihlLnJlcXVpcmVkJiZpKXJldHVybiBzZSgnTWlzc2luZyByZXF1aXJlZCBwcm9wOiAiJyt0KyciJyxyKTtpZihudWxsPT1uJiYhZS5yZXF1aXJlZClyZXR1cm47dmFyIG89ZS50eXBlLGE9IW98fCEwPT09byxzPVtdO2lmKG8pe0FycmF5LmlzQXJyYXkobyl8fChvPVtvXSk7Zm9yKHZhciBjPTA7YzxvLmxlbmd0aCYmIWE7YysrKXt2YXIgdT1xZShuLG9bY10pO3MucHVzaCh1LmV4cGVjdGVkVHlwZXx8IiIpLGE9dS52YWxpZH19aWYoIWEpcmV0dXJuIHNlKGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0nSW52YWxpZCBwcm9wOiB0eXBlIGNoZWNrIGZhaWxlZCBmb3IgcHJvcCAiJytlKyciLiBFeHBlY3RlZCAnK24ubWFwKGspLmpvaW4oIiwgIiksaT1uWzBdLG89ZCh0KSxhPVhlKHQsaSkscz1YZSh0LG8pOzE9PT1uLmxlbmd0aCYmWWUoaSkmJiFmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cyx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtmb3IoO24tLTspdFtuXT1lW25dO3JldHVybiB0LnNvbWUoZnVuY3Rpb24oZSl7cmV0dXJuImJvb2xlYW4iPT09ZS50b0xvd2VyQ2FzZSgpfSl9KGksbykmJihyKz0iIHdpdGggdmFsdWUgIithKTtyKz0iLCBnb3QgIitvKyIgIixZZShvKSYmKHIrPSJ3aXRoIHZhbHVlICIrcysiLiIpO3JldHVybiByfSh0LG4scykscik7dmFyIGw9ZS52YWxpZGF0b3I7bCYmKGwobil8fHNlKCdJbnZhbGlkIHByb3A6IGN1c3RvbSB2YWxpZGF0b3IgY2hlY2sgZmFpbGVkIGZvciBwcm9wICInK3QrJyIuJyxyKSl9KGksZSxhLHIsbyksYX12YXIgVmU9L14oU3RyaW5nfE51bWJlcnxCb29sZWFufEZ1bmN0aW9ufFN5bWJvbCkkLztmdW5jdGlvbiBxZShlLHQpe3ZhciBuLHI9V2UodCk7aWYoVmUudGVzdChyKSl7dmFyIGk9dHlwZW9mIGU7KG49aT09PXIudG9Mb3dlckNhc2UoKSl8fCJvYmplY3QiIT09aXx8KG49ZSBpbnN0YW5jZW9mIHQpfWVsc2Ugbj0iT2JqZWN0Ij09PXI/dShlKToiQXJyYXkiPT09cj9BcnJheS5pc0FycmF5KGUpOmUgaW5zdGFuY2VvZiB0O3JldHVybnt2YWxpZDpuLGV4cGVjdGVkVHlwZTpyfX1mdW5jdGlvbiBXZShlKXt2YXIgdD1lJiZlLnRvU3RyaW5nKCkubWF0Y2goL15ccypmdW5jdGlvbiAoXHcrKS8pO3JldHVybiB0P3RbMV06IiJ9ZnVuY3Rpb24gSGUoZSx0KXtyZXR1cm4gV2UoZSk9PT1XZSh0KX1mdW5jdGlvbiBHZShlLHQpe2lmKCFBcnJheS5pc0FycmF5KHQpKXJldHVybiBIZSh0LGUpPzA6LTE7Zm9yKHZhciBuPTAscj10Lmxlbmd0aDtuPHI7bisrKWlmKEhlKHRbbl0sZSkpcmV0dXJuIG47cmV0dXJuLTF9ZnVuY3Rpb24gWGUoZSx0KXtyZXR1cm4iU3RyaW5nIj09PXQ/JyInK2UrJyInOiJOdW1iZXIiPT09dD8iIitOdW1iZXIoZSk6IiIrZX1mdW5jdGlvbiBZZSh0KXtyZXR1cm5bInN0cmluZyIsIm51bWJlciIsImJvb2xlYW4iXS5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiB0LnRvTG93ZXJDYXNlKCk9PT1lfSl9ZnVuY3Rpb24gSmUoZSx0LG4pe3ZlKCk7dHJ5e2lmKHQpZm9yKHZhciByPXQ7cj1yLiRwYXJlbnQ7KXt2YXIgaT1yLiRvcHRpb25zLmVycm9yQ2FwdHVyZWQ7aWYoaSlmb3IodmFyIG89MDtvPGkubGVuZ3RoO28rKyl0cnl7aWYoITE9PT1pW29dLmNhbGwocixlLHQsbikpcmV0dXJufWNhdGNoKGUpe1plKGUsciwiZXJyb3JDYXB0dXJlZCBob29rIil9fVplKGUsdCxuKX1maW5hbGx5e2dlKCl9fWZ1bmN0aW9uIEtlKGUsdCxuLHIsaSl7dmFyIG87dHJ5eyhvPW4/ZS5hcHBseSh0LG4pOmUuY2FsbCh0KSkmJiFvLl9pc1Z1ZSYmXyhvKSYmIW8uX2hhbmRsZWQmJihvLmNhdGNoKGZ1bmN0aW9uKGUpe3JldHVybiBKZShlLHIsaSsiIChQcm9taXNlL2FzeW5jKSIpfSksby5faGFuZGxlZD0hMCl9Y2F0Y2goZSl7SmUoZSxyLGkpfXJldHVybiBvfWZ1bmN0aW9uIFplKHQsZSxuKXtpZih6LmVycm9ySGFuZGxlcil0cnl7cmV0dXJuIHouZXJyb3JIYW5kbGVyLmNhbGwobnVsbCx0LGUsbil9Y2F0Y2goZSl7ZSE9PXQmJlFlKGUsbnVsbCwiY29uZmlnLmVycm9ySGFuZGxlciIpfVFlKHQsZSxuKX1mdW5jdGlvbiBRZShlLHQsbil7aWYoc2UoIkVycm9yIGluICIrbisnOiAiJytlLnRvU3RyaW5nKCkrJyInLHQpLCFYJiYhWXx8InVuZGVmaW5lZCI9PXR5cGVvZiBjb25zb2xlKXRocm93IGU7Y29uc29sZS5lcnJvcihlKX12YXIgZXQ9W10sdHQ9ITE7ZnVuY3Rpb24gbnQoKXt0dD0hMTtmb3IodmFyIGU9ZXQuc2xpY2UoMCksdD1ldC5sZW5ndGg9MDt0PGUubGVuZ3RoO3QrKyllW3RdKCl9dmFyIHJ0LGl0PWZ1bmN0aW9uKCl7c2V0VGltZW91dChudCwwKX07ZnVuY3Rpb24gb3QoZSx0KXt2YXIgbjtpZihldC5wdXNoKGZ1bmN0aW9uKCl7aWYoZSl0cnl7ZS5jYWxsKHQpfWNhdGNoKGUpe0plKGUsdCwibmV4dFRpY2siKX1lbHNlIG4mJm4odCl9KSx0dHx8KHR0PSEwLGl0KCkpLCFlJiYidW5kZWZpbmVkIiE9dHlwZW9mIFByb21pc2UpcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUpe249ZX0pfXZhciBhdD1zKCJJbmZpbml0eSx1bmRlZmluZWQsTmFOLGlzRmluaXRlLGlzTmFOLHBhcnNlRmxvYXQscGFyc2VJbnQsZGVjb2RlVVJJLGRlY29kZVVSSUNvbXBvbmVudCxlbmNvZGVVUkksZW5jb2RlVVJJQ29tcG9uZW50LE1hdGgsTnVtYmVyLERhdGUsQXJyYXksT2JqZWN0LEJvb2xlYW4sU3RyaW5nLFJlZ0V4cCxNYXAsU2V0LEpTT04sSW50bCxyZXF1aXJlIiksc3Q9ZnVuY3Rpb24oZSx0KXtzZSgnUHJvcGVydHkgb3IgbWV0aG9kICInK3QrJyIgaXMgbm90IGRlZmluZWQgb24gdGhlIGluc3RhbmNlIGJ1dCByZWZlcmVuY2VkIGR1cmluZyByZW5kZXIuIE1ha2Ugc3VyZSB0aGF0IHRoaXMgcHJvcGVydHkgaXMgcmVhY3RpdmUsIGVpdGhlciBpbiB0aGUgZGF0YSBvcHRpb24sIG9yIGZvciBjbGFzcy1iYXNlZCBjb21wb25lbnRzLCBieSBpbml0aWFsaXppbmcgdGhlIHByb3BlcnR5LiBTZWU6IGh0dHBzOi8vdnVlanMub3JnL3YyL2d1aWRlL3JlYWN0aXZpdHkuaHRtbCNEZWNsYXJpbmctUmVhY3RpdmUtUHJvcGVydGllcy4nLGUpfSxjdD1mdW5jdGlvbihlLHQpe3NlKCdQcm9wZXJ0eSAiJyt0KyciIG11c3QgYmUgYWNjZXNzZWQgd2l0aCAiJGRhdGEuJyt0KyciIGJlY2F1c2UgcHJvcGVydGllcyBzdGFydGluZyB3aXRoICIkIiBvciAiXyIgYXJlIG5vdCBwcm94aWVkIGluIHRoZSBWdWUgaW5zdGFuY2UgdG8gcHJldmVudCBjb25mbGljdHMgd2l0aCBWdWUgaW50ZXJuYWxzLiBTZWU6IGh0dHBzOi8vdnVlanMub3JnL3YyL2FwaS8jZGF0YScsZSl9LHV0PSJ1bmRlZmluZWQiIT10eXBlb2YgUHJveHkmJmllKFByb3h5KTtpZih1dCl7dmFyIGx0PXMoInN0b3AscHJldmVudCxzZWxmLGN0cmwsc2hpZnQsYWx0LG1ldGEsZXhhY3QiKTt6LmtleUNvZGVzPW5ldyBQcm94eSh6LmtleUNvZGVzLHtzZXQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBsdCh0KT8oc2UoIkF2b2lkIG92ZXJ3cml0aW5nIGJ1aWx0LWluIG1vZGlmaWVyIGluIGNvbmZpZy5rZXlDb2RlczogLiIrdCksITEpOihlW3RdPW4sITApfX0pfXZhciBkdD17aGFzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dCBpbiBlLHI9YXQodCl8fCJzdHJpbmciPT10eXBlb2YgdCYmIl8iPT09dC5jaGFyQXQoMCkmJiEodCBpbiBlLiRkYXRhKTtyZXR1cm4gbnx8cnx8KHQgaW4gZS4kZGF0YT9jdChlLHQpOnN0KGUsdCkpLG58fCFyfX0sZnQ9e2dldDpmdW5jdGlvbihlLHQpe3JldHVybiJzdHJpbmciIT10eXBlb2YgdHx8dCBpbiBlfHwodCBpbiBlLiRkYXRhP2N0KGUsdCk6c3QoZSx0KSksZVt0XX19O3J0PWZ1bmN0aW9uKGUpe2lmKHV0KXt2YXIgdD1lLiRvcHRpb25zLG49dC5yZW5kZXImJnQucmVuZGVyLl93aXRoU3RyaXBwZWQ/ZnQ6ZHQ7ZS5fcmVuZGVyUHJveHk9bmV3IFByb3h5KGUsbil9ZWxzZSBlLl9yZW5kZXJQcm94eT1lfTt2YXIgcHQsaHQsdnQ9bmV3IG9lO2Z1bmN0aW9uIGd0KGUpeyFmdW5jdGlvbiBlKHQsbil7dmFyIHIsaTt2YXIgbz1BcnJheS5pc0FycmF5KHQpO2lmKCFvJiYheSh0KXx8T2JqZWN0LmlzRnJvemVuKHQpfHx0IGluc3RhbmNlb2YgbWUpcmV0dXJuO2lmKHQuX19vYl9fKXt2YXIgYT10Ll9fb2JfXy5kZXAuaWQ7aWYobi5oYXMoYSkpcmV0dXJuO24uYWRkKGEpfWlmKG8pZm9yKHI9dC5sZW5ndGg7ci0tOyllKHRbcl0sbik7ZWxzZSBmb3IoaT1PYmplY3Qua2V5cyh0KSxyPWkubGVuZ3RoO3ItLTspZSh0W2lbcl1dLG4pfShlLHZ0KSx2dC5jbGVhcigpfXZhciBtdD1YJiZ3aW5kb3cucGVyZm9ybWFuY2U7bXQmJm10Lm1hcmsmJm10Lm1lYXN1cmUmJm10LmNsZWFyTWFya3MmJm10LmNsZWFyTWVhc3VyZXMmJihwdD1mdW5jdGlvbihlKXtyZXR1cm4gbXQubWFyayhlKX0saHQ9ZnVuY3Rpb24oZSx0LG4pe210Lm1lYXN1cmUoZSx0LG4pLG10LmNsZWFyTWFya3ModCksbXQuY2xlYXJNYXJrcyhuKX0pO3ZhciB5dD1oKGZ1bmN0aW9uKGUpe3ZhciB0PSImIj09PWUuY2hhckF0KDApLG49In4iPT09KGU9dD9lLnNsaWNlKDEpOmUpLmNoYXJBdCgwKSxyPSIhIj09PShlPW4/ZS5zbGljZSgxKTplKS5jaGFyQXQoMCk7cmV0dXJue25hbWU6ZT1yP2Uuc2xpY2UoMSk6ZSxvbmNlOm4sY2FwdHVyZTpyLHBhc3NpdmU6dH19KTtmdW5jdGlvbiBfdChlLGkpe2Z1bmN0aW9uIG8oKXt2YXIgZT1hcmd1bWVudHMsdD1vLmZucztpZighQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gS2UodCxudWxsLGFyZ3VtZW50cyxpLCJ2LW9uIGhhbmRsZXIiKTtmb3IodmFyIG49dC5zbGljZSgpLHI9MDtyPG4ubGVuZ3RoO3IrKylLZShuW3JdLG51bGwsZSxpLCJ2LW9uIGhhbmRsZXIiKX1yZXR1cm4gby5mbnM9ZSxvfWZ1bmN0aW9uIGJ0KGUsdCxuLHIsaSxvKXt2YXIgYSxzLGMsdTtmb3IoYSBpbiBlKXM9ZVthXSxjPXRbYV0sdT15dChhKSxqKHMpP3NlKCdJbnZhbGlkIGhhbmRsZXIgZm9yIGV2ZW50ICInK3UubmFtZSsnIjogZ290ICcrU3RyaW5nKHMpLG8pOmooYyk/KGoocy5mbnMpJiYocz1lW2FdPV90KHMsbykpLE4odS5vbmNlKSYmKHM9ZVthXT1pKHUubmFtZSxzLHUuY2FwdHVyZSkpLG4odS5uYW1lLHMsdS5jYXB0dXJlLHUucGFzc2l2ZSx1LnBhcmFtcykpOnMhPT1jJiYoYy5mbnM9cyxlW2FdPWMpO2ZvcihhIGluIHQpaihlW2FdKSYmcigodT15dChhKSkubmFtZSx0W2FdLHUuY2FwdHVyZSl9ZnVuY3Rpb24gd3QoZSx0LG4pe3ZhciByO2UgaW5zdGFuY2VvZiBtZSYmKGU9ZS5kYXRhLmhvb2t8fChlLmRhdGEuaG9vaz17fSkpO3ZhciBpPWVbdF07ZnVuY3Rpb24gbygpe24uYXBwbHkodGhpcyxhcmd1bWVudHMpLGIoci5mbnMsbyl9aihpKT9yPV90KFtvXSk6TChpLmZucykmJk4oaS5tZXJnZWQpPyhyPWkpLmZucy5wdXNoKG8pOnI9X3QoW2ksb10pLHIubWVyZ2VkPSEwLGVbdF09cn1mdW5jdGlvbiBrdChlLHQsbixyKXt2YXIgaT10Lm9wdGlvbnMubXBPcHRpb25zJiZ0Lm9wdGlvbnMubXBPcHRpb25zLnByb3BlcnRpZXM7aWYoaihpKSlyZXR1cm4gbjt2YXIgbz10Lm9wdGlvbnMubXBPcHRpb25zLmV4dGVybmFsQ2xhc3Nlc3x8W10sYT1lLmF0dHJzLHM9ZS5wcm9wcztpZihMKGEpfHxMKHMpKWZvcih2YXIgYyBpbiBpKXt2YXIgdT14KGMpOyhTdChuLHMsYyx1LCEwKXx8U3QobixhLGMsdSwhMSkpJiZuW2NdJiYtMSE9PW8uaW5kZXhPZih1KSYmcltnKG5bY10pXSYmKG5bY109cltnKG5bY10pXSl9cmV0dXJuIG59ZnVuY3Rpb24gU3QoZSx0LG4scixpKXtpZihMKHQpKXtpZih3KHQsbikpcmV0dXJuIGVbbl09dFtuXSxpfHxkZWxldGUgdFtuXSwhMDtpZih3KHQscikpcmV0dXJuIGVbbl09dFtyXSxpfHxkZWxldGUgdFtyXSwhMH1yZXR1cm4hMX1mdW5jdGlvbiB4dChlKXtyZXR1cm4gYyhlKT9bYmUoZSldOkFycmF5LmlzQXJyYXkoZSk/ZnVuY3Rpb24gZSh0LG4pe3ZhciByPVtdO3ZhciBpLG8sYSxzO2ZvcihpPTA7aTx0Lmxlbmd0aDtpKyspaihvPXRbaV0pfHwiYm9vbGVhbiI9PXR5cGVvZiBvfHwoYT1yLmxlbmd0aC0xLHM9clthXSxBcnJheS5pc0FycmF5KG8pPzA8by5sZW5ndGgmJihDdCgobz1lKG8sKG58fCIiKSsiXyIraSkpWzBdKSYmQ3QocykmJihyW2FdPWJlKHMudGV4dCtvWzBdLnRleHQpLG8uc2hpZnQoKSksci5wdXNoLmFwcGx5KHIsbykpOmMobyk/Q3Qocyk/clthXT1iZShzLnRleHQrbyk6IiIhPT1vJiZyLnB1c2goYmUobykpOkN0KG8pJiZDdChzKT9yW2FdPWJlKHMudGV4dCtvLnRleHQpOihOKHQuX2lzVkxpc3QpJiZMKG8udGFnKSYmaihvLmtleSkmJkwobikmJihvLmtleT0iX192bGlzdCIrbisiXyIraSsiX18iKSxyLnB1c2gobykpKTtyZXR1cm4gcn0oZSk6dm9pZCAwfWZ1bmN0aW9uIEN0KGUpe3JldHVybiBMKGUpJiZMKGUudGV4dCkmJiExPT09ZS5pc0NvbW1lbnR9ZnVuY3Rpb24gVHQoZSx0KXtpZihlKXtmb3IodmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPWFlP1JlZmxlY3Qub3duS2V5cyhlKTpPYmplY3Qua2V5cyhlKSxpPTA7aTxyLmxlbmd0aDtpKyspe3ZhciBvPXJbaV07aWYoIl9fb2JfXyIhPT1vKXtmb3IodmFyIGE9ZVtvXS5mcm9tLHM9dDtzOyl7aWYocy5fcHJvdmlkZWQmJncocy5fcHJvdmlkZWQsYSkpe25bb109cy5fcHJvdmlkZWRbYV07YnJlYWt9cz1zLiRwYXJlbnR9aWYoIXMpaWYoImRlZmF1bHQiaW4gZVtvXSl7dmFyIGM9ZVtvXS5kZWZhdWx0O25bb109ImZ1bmN0aW9uIj09dHlwZW9mIGM/Yy5jYWxsKHQpOmN9ZWxzZSBzZSgnSW5qZWN0aW9uICInK28rJyIgbm90IGZvdW5kJyx0KX19cmV0dXJuIG59fWZ1bmN0aW9uIE90KGUsdCl7aWYoIWV8fCFlLmxlbmd0aClyZXR1cm57fTtmb3IodmFyIG49e30scj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyl7dmFyIG89ZVtyXSxhPW8uZGF0YTtpZihhJiZhLmF0dHJzJiZhLmF0dHJzLnNsb3QmJmRlbGV0ZSBhLmF0dHJzLnNsb3Qsby5jb250ZXh0IT09dCYmby5mbkNvbnRleHQhPT10fHwhYXx8bnVsbD09YS5zbG90KShuLmRlZmF1bHR8fChuLmRlZmF1bHQ9W10pKS5wdXNoKG8pO2Vsc2V7dmFyIHM9YS5zbG90LGM9bltzXXx8KG5bc109W10pOyJ0ZW1wbGF0ZSI9PT1vLnRhZz9jLnB1c2guYXBwbHkoYyxvLmNoaWxkcmVufHxbXSk6Yy5wdXNoKG8pfX1mb3IodmFyIHUgaW4gbiluW3VdLmV2ZXJ5KEV0KSYmZGVsZXRlIG5bdV07cmV0dXJuIG59ZnVuY3Rpb24gRXQoZSl7cmV0dXJuIGUuaXNDb21tZW50JiYhZS5hc3luY0ZhY3Rvcnl8fCIgIj09PWUudGV4dH1mdW5jdGlvbiBBdChlLHQsbil7dmFyIHIsaT0wPE9iamVjdC5rZXlzKHQpLmxlbmd0aCxvPWU/ISFlLiRzdGFibGU6IWksYT1lJiZlLiRrZXk7aWYoZSl7aWYoZS5fbm9ybWFsaXplZClyZXR1cm4gZS5fbm9ybWFsaXplZDtpZihvJiZuJiZuIT09bSYmYT09PW4uJGtleSYmIWkmJiFuLiRoYXNOb3JtYWwpcmV0dXJuIG47Zm9yKHZhciBzIGluIHI9e30sZSllW3NdJiYiJCIhPT1zWzBdJiYocltzXT1JdCh0LHMsZVtzXSkpfWVsc2Ugcj17fTtmb3IodmFyIGMgaW4gdCljIGluIHJ8fChyW2NdPSR0KHQsYykpO3JldHVybiBlJiZPYmplY3QuaXNFeHRlbnNpYmxlKGUpJiYoZS5fbm9ybWFsaXplZD1yKSxxKHIsIiRzdGFibGUiLG8pLHEociwiJGtleSIsYSkscShyLCIkaGFzTm9ybWFsIixpKSxyfWZ1bmN0aW9uIEl0KGUsdCxuKXt2YXIgcj1mdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg/bi5hcHBseShudWxsLGFyZ3VtZW50cyk6bih7fSk7cmV0dXJuKGU9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYhQXJyYXkuaXNBcnJheShlKT9bZV06eHQoZSkpJiYoMD09PWUubGVuZ3RofHwxPT09ZS5sZW5ndGgmJmVbMF0uaXNDb21tZW50KT92b2lkIDA6ZX07cmV0dXJuIG4ucHJveHkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2dldDpyLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSkscn1mdW5jdGlvbiAkdChlLHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlW3RdfX1mdW5jdGlvbiBQdChlLHQpe3ZhciBuLHIsaSxvLGE7aWYoQXJyYXkuaXNBcnJheShlKXx8InN0cmluZyI9PXR5cGVvZiBlKWZvcihuPW5ldyBBcnJheShlLmxlbmd0aCkscj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyluW3JdPXQoZVtyXSxyLHIscik7ZWxzZSBpZigibnVtYmVyIj09dHlwZW9mIGUpZm9yKG49bmV3IEFycmF5KGUpLHI9MDtyPGU7cisrKW5bcl09dChyKzEscixyLHIpO2Vsc2UgaWYoeShlKSlpZihhZSYmZVtTeW1ib2wuaXRlcmF0b3JdKXtuPVtdO3ZhciBzPWVbU3ltYm9sLml0ZXJhdG9yXSgpLGM9cy5uZXh0KCk7Zm9yKHI9MDshYy5kb25lOyluLnB1c2godChjLnZhbHVlLG4ubGVuZ3RoLHIscisrKSksYz1zLm5leHQoKX1lbHNlIGZvcihvPU9iamVjdC5rZXlzKGUpLG49bmV3IEFycmF5KG8ubGVuZ3RoKSxyPTAsaT1vLmxlbmd0aDtyPGk7cisrKWE9b1tyXSxuW3JdPXQoZVthXSxhLHIscik7cmV0dXJuIEwobil8fChuPVtdKSxuLl9pc1ZMaXN0PSEwLG59ZnVuY3Rpb24gTXQoZSx0LG4scil7dmFyIGksbz10aGlzLiRzY29wZWRTbG90c1tlXTtvPyhuPW58fHt9LHImJih5KHIpfHxzZSgic2xvdCB2LWJpbmQgd2l0aG91dCBhcmd1bWVudCBleHBlY3RzIGFuIE9iamVjdCIsdGhpcyksbj1PKE8oe30sciksbikpLGk9byhuLHRoaXMsbi5faSl8fHQpOmk9dGhpcy4kc2xvdHNbZV18fHQ7dmFyIGE9biYmbi5zbG90O3JldHVybiBhP3RoaXMuJGNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIix7c2xvdDphfSxpKTppfWZ1bmN0aW9uIGp0KGUpe3JldHVybiB6ZSh0aGlzLiRvcHRpb25zLCJmaWx0ZXJzIixlLCEwKXx8JH1mdW5jdGlvbiBMdChlLHQpe3JldHVybiBBcnJheS5pc0FycmF5KGUpPy0xPT09ZS5pbmRleE9mKHQpOmUhPT10fWZ1bmN0aW9uIE50KGUsdCxuLHIsaSl7dmFyIG89ei5rZXlDb2Rlc1t0XXx8bjtyZXR1cm4gaSYmciYmIXoua2V5Q29kZXNbdF0/THQoaSxyKTpvP0x0KG8sZSk6cj94KHIpIT09dDp2b2lkIDB9ZnVuY3Rpb24gQnQoaSxvLGEscyxjKXtpZihhKWlmKHkoYSkpe3ZhciB1O0FycmF5LmlzQXJyYXkoYSkmJihhPUUoYSkpO3ZhciBlPWZ1bmN0aW9uKHQpe2lmKCJjbGFzcyI9PT10fHwic3R5bGUiPT09dHx8Zih0KSl1PWk7ZWxzZXt2YXIgZT1pLmF0dHJzJiZpLmF0dHJzLnR5cGU7dT1zfHx6Lm11c3RVc2VQcm9wKG8sZSx0KT9pLmRvbVByb3BzfHwoaS5kb21Qcm9wcz17fSk6aS5hdHRyc3x8KGkuYXR0cnM9e30pfXZhciBuPWcodCkscj14KHQpO24gaW4gdXx8ciBpbiB1fHwodVt0XT1hW3RdLGMmJigoaS5vbnx8KGkub249e30pKVsidXBkYXRlOiIrdF09ZnVuY3Rpb24oZSl7YVt0XT1lfSkpfTtmb3IodmFyIHQgaW4gYSllKHQpfWVsc2Ugc2UoInYtYmluZCB3aXRob3V0IGFyZ3VtZW50IGV4cGVjdHMgYW4gT2JqZWN0IG9yIEFycmF5IHZhbHVlIix0aGlzKTtyZXR1cm4gaX1mdW5jdGlvbiBEdChlLHQpe3ZhciBuPXRoaXMuX3N0YXRpY1RyZWVzfHwodGhpcy5fc3RhdGljVHJlZXM9W10pLHI9bltlXTtyZXR1cm4gciYmIXR8fEZ0KHI9bltlXT10aGlzLiRvcHRpb25zLnN0YXRpY1JlbmRlckZuc1tlXS5jYWxsKHRoaXMuX3JlbmRlclByb3h5LG51bGwsdGhpcyksIl9fc3RhdGljX18iK2UsITEpLHJ9ZnVuY3Rpb24gUnQoZSx0LG4pe3JldHVybiBGdChlLCJfX29uY2VfXyIrdCsobj8iXyIrbjoiIiksITApLGV9ZnVuY3Rpb24gRnQoZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspZVtyXSYmInN0cmluZyIhPXR5cGVvZiBlW3JdJiZ6dChlW3JdLHQrIl8iK3Isbik7ZWxzZSB6dChlLHQsbil9ZnVuY3Rpb24genQoZSx0LG4pe2UuaXNTdGF0aWM9ITAsZS5rZXk9dCxlLmlzT25jZT1ufWZ1bmN0aW9uIFV0KGUsdCl7aWYodClpZih1KHQpKXt2YXIgbj1lLm9uPWUub24/Tyh7fSxlLm9uKTp7fTtmb3IodmFyIHIgaW4gdCl7dmFyIGk9bltyXSxvPXRbcl07bltyXT1pP1tdLmNvbmNhdChpLG8pOm99fWVsc2Ugc2UoInYtb24gd2l0aG91dCBhcmd1bWVudCBleHBlY3RzIGFuIE9iamVjdCB2YWx1ZSIsdGhpcyk7cmV0dXJuIGV9ZnVuY3Rpb24gVnQoZSx0LG4scil7dD10fHx7JHN0YWJsZTohbn07Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07QXJyYXkuaXNBcnJheShvKT9WdChvLHQsbik6byYmKG8ucHJveHkmJihvLmZuLnByb3h5PSEwKSx0W28ua2V5XT1vLmZuKX1yZXR1cm4gciYmKHQuJGtleT1yKSx0fWZ1bmN0aW9uIHF0KGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKz0yKXt2YXIgcj10W25dOyJzdHJpbmciPT10eXBlb2YgciYmcj9lW3Rbbl1dPXRbbisxXToiIiE9PXImJm51bGwhPT1yJiZzZSgiSW52YWxpZCB2YWx1ZSBmb3IgZHluYW1pYyBkaXJlY3RpdmUgYXJndW1lbnQgKGV4cGVjdGVkIHN0cmluZyBvciBudWxsKTogIityLHRoaXMpfXJldHVybiBlfWZ1bmN0aW9uIFd0KGUsdCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlP3QrZTplfWZ1bmN0aW9uIEh0KGUpe2UuX289UnQsZS5fbj1hLGUuX3M9cixlLl9sPVB0LGUuX3Q9TXQsZS5fcT1QLGUuX2k9TSxlLl9tPUR0LGUuX2Y9anQsZS5faz1OdCxlLl9iPUJ0LGUuX3Y9YmUsZS5fZT1fZSxlLl91PVZ0LGUuX2c9VXQsZS5fZD1xdCxlLl9wPVd0fWZ1bmN0aW9uIEd0KGUsdCxuLG8scil7dmFyIGEsaT10aGlzLHM9ci5vcHRpb25zO3cobywiX3VpZCIpPyhhPU9iamVjdC5jcmVhdGUobykpLl9vcmlnaW5hbD1vOm89KGE9bykuX29yaWdpbmFsO3ZhciBjPU4ocy5fY29tcGlsZWQpLHU9IWM7dGhpcy5kYXRhPWUsdGhpcy5wcm9wcz10LHRoaXMuY2hpbGRyZW49bix0aGlzLnBhcmVudD1vLHRoaXMubGlzdGVuZXJzPWUub258fG0sdGhpcy5pbmplY3Rpb25zPVR0KHMuaW5qZWN0LG8pLHRoaXMuc2xvdHM9ZnVuY3Rpb24oKXtyZXR1cm4gaS4kc2xvdHN8fEF0KGUuc2NvcGVkU2xvdHMsaS4kc2xvdHM9T3QobixvKSksaS4kc2xvdHN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJzY29wZWRTbG90cyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEF0KGUuc2NvcGVkU2xvdHMsdGhpcy5zbG90cygpKX19KSxjJiYodGhpcy4kb3B0aW9ucz1zLHRoaXMuJHNsb3RzPXRoaXMuc2xvdHMoKSx0aGlzLiRzY29wZWRTbG90cz1BdChlLnNjb3BlZFNsb3RzLHRoaXMuJHNsb3RzKSkscy5fc2NvcGVJZD90aGlzLl9jPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPW5uKGEsZSx0LG4scix1KTtyZXR1cm4gaSYmIUFycmF5LmlzQXJyYXkoaSkmJihpLmZuU2NvcGVJZD1zLl9zY29wZUlkLGkuZm5Db250ZXh0PW8pLGl9OnRoaXMuX2M9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIG5uKGEsZSx0LG4scix1KX19ZnVuY3Rpb24gWHQoZSx0LG4scixpKXt2YXIgbz13ZShlKTtyZXR1cm4gby5mbkNvbnRleHQ9bixvLmZuT3B0aW9ucz1yLChvLmRldnRvb2xzTWV0YT1vLmRldnRvb2xzTWV0YXx8e30pLnJlbmRlckNvbnRleHQ9aSx0LnNsb3QmJigoby5kYXRhfHwoby5kYXRhPXt9KSkuc2xvdD10LnNsb3QpLG99ZnVuY3Rpb24gWXQoZSx0KXtmb3IodmFyIG4gaW4gdCllW2cobildPXRbbl19SHQoR3QucHJvdG90eXBlKTt2YXIgSnQ9e2luaXQ6ZnVuY3Rpb24oZSx0KXtpZihlLmNvbXBvbmVudEluc3RhbmNlJiYhZS5jb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQmJmUuZGF0YS5rZWVwQWxpdmUpe3ZhciBuPWU7SnQucHJlcGF0Y2gobixuKX1lbHNleyhlLmNvbXBvbmVudEluc3RhbmNlPWZ1bmN0aW9uKGUsdCl7dmFyIG49e19pc0NvbXBvbmVudDohMCxfcGFyZW50Vm5vZGU6ZSxwYXJlbnQ6dH0scj1lLmRhdGEuaW5saW5lVGVtcGxhdGU7TChyKSYmKG4ucmVuZGVyPXIucmVuZGVyLG4uc3RhdGljUmVuZGVyRm5zPXIuc3RhdGljUmVuZGVyRm5zKTtyZXR1cm4gbmV3IGUuY29tcG9uZW50T3B0aW9ucy5DdG9yKG4pfShlLGRuKSkuJG1vdW50KHQ/ZS5lbG06dm9pZCAwLHQpfX0scHJlcGF0Y2g6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmNvbXBvbmVudE9wdGlvbnM7IWZ1bmN0aW9uKGUsdCxuLHIsaSl7Zm49ITA7dmFyIG89ci5kYXRhLnNjb3BlZFNsb3RzLGE9ZS4kc2NvcGVkU2xvdHMscz0hIShvJiYhby4kc3RhYmxlfHxhIT09bSYmIWEuJHN0YWJsZXx8byYmZS4kc2NvcGVkU2xvdHMuJGtleSE9PW8uJGtleSksYz0hIShpfHxlLiRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbnx8cyk7ZS4kb3B0aW9ucy5fcGFyZW50Vm5vZGU9cixlLiR2bm9kZT1yLGUuX3Zub2RlJiYoZS5fdm5vZGUucGFyZW50PXIpO2lmKGUuJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuPWksZS4kYXR0cnM9ci5kYXRhLmF0dHJzfHxtLGUuJGxpc3RlbmVycz1ufHxtLHQmJmUuJG9wdGlvbnMucHJvcHMpe1RlKCExKTtmb3IodmFyIHU9ZS5fcHJvcHMsbD1lLiRvcHRpb25zLl9wcm9wS2V5c3x8W10sZD0wO2Q8bC5sZW5ndGg7ZCsrKXt2YXIgZj1sW2RdLHA9ZS4kb3B0aW9ucy5wcm9wczt1W2ZdPVVlKGYscCx0LGUpfVRlKCEwKSxlLiRvcHRpb25zLnByb3BzRGF0YT10fWUuXyR1cGRhdGVQcm9wZXJ0aWVzJiZlLl8kdXBkYXRlUHJvcGVydGllcyhlKSxuPW58fG07dmFyIGg9ZS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO2UuJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycz1uLGxuKGUsbixoKSxjJiYoZS4kc2xvdHM9T3QoaSxyLmNvbnRleHQpLGUuJGZvcmNlVXBkYXRlKCkpO2ZuPSExfSh0LmNvbXBvbmVudEluc3RhbmNlPWUuY29tcG9uZW50SW5zdGFuY2Usbi5wcm9wc0RhdGEsbi5saXN0ZW5lcnMsdCxuLmNoaWxkcmVuKX0saW5zZXJ0OmZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5jb250ZXh0LHI9ZS5jb21wb25lbnRJbnN0YW5jZTtyLl9pc01vdW50ZWR8fChyLl9pc01vdW50ZWQ9ITAsci5fJHZkPyh2bihyLCJvblNlcnZpY2VDcmVhdGVkIiksdm4ociwib25TZXJ2aWNlQXR0YWNoZWQiKSxyLl8kdmQuYWRkTW91bnRlZFZtKHIpKTp2bihyLCJtb3VudGVkIikpLGUuZGF0YS5rZWVwQWxpdmUmJihuLl9pc01vdW50ZWQ/KCh0PXIpLl9pbmFjdGl2ZT0hMSx5bi5wdXNoKHQpKTpobihyLCEwKSl9LGRlc3Ryb3k6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb21wb25lbnRJbnN0YW5jZTt0Ll9pc0Rlc3Ryb3llZHx8KGUuZGF0YS5rZWVwQWxpdmU/ZnVuY3Rpb24gZSh0LG4pe2lmKG4mJih0Ll9kaXJlY3RJbmFjdGl2ZT0hMCxwbih0KSkpcmV0dXJuO2lmKCF0Ll9pbmFjdGl2ZSl7dC5faW5hY3RpdmU9ITA7Zm9yKHZhciByPTA7cjx0LiRjaGlsZHJlbi5sZW5ndGg7cisrKWUodC4kY2hpbGRyZW5bcl0pO3ZuKHQsImRlYWN0aXZhdGVkIil9fSh0LCEwKTp0LiRkZXN0cm95KCkpfX0sS3Q9T2JqZWN0LmtleXMoSnQpO2Z1bmN0aW9uIFp0KGUsdCxuLHIsaSl7aWYoIWooZSkpe3ZhciBvPW4uJG9wdGlvbnMuX2Jhc2U7aWYoeShlKSYmKGU9by5leHRlbmQoZSkpLCJmdW5jdGlvbiI9PXR5cGVvZiBlKXt2YXIgYSxzLGMsdSxsLGQsZjtpZihqKGUuY2lkKSYmdm9pZCAwPT09KGU9ZnVuY3Rpb24odCxuKXtpZihOKHQuZXJyb3IpJiZMKHQuZXJyb3JDb21wKSlyZXR1cm4gdC5lcnJvckNvbXA7aWYoTCh0LnJlc29sdmVkKSlyZXR1cm4gdC5yZXNvbHZlZDt2YXIgZT1vbjtlJiZMKHQub3duZXJzKSYmLTE9PT10Lm93bmVycy5pbmRleE9mKGUpJiZ0Lm93bmVycy5wdXNoKGUpO2lmKE4odC5sb2FkaW5nKSYmTCh0LmxvYWRpbmdDb21wKSlyZXR1cm4gdC5sb2FkaW5nQ29tcDtpZihlJiYhTCh0Lm93bmVycykpe3ZhciByPXQub3duZXJzPVtlXSxpPSEwLG89bnVsbCxhPW51bGw7ZS4kb24oImhvb2s6ZGVzdHJveWVkIixmdW5jdGlvbigpe3JldHVybiBiKHIsZSl9KTt2YXIgcz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPXIubGVuZ3RoO3Q8bjt0Kyspclt0XS4kZm9yY2VVcGRhdGUoKTtlJiYoci5sZW5ndGg9MCxudWxsIT09byYmKGNsZWFyVGltZW91dChvKSxvPW51bGwpLG51bGwhPT1hJiYoY2xlYXJUaW1lb3V0KGEpLGE9bnVsbCkpfSxjPUIoZnVuY3Rpb24oZSl7dC5yZXNvbHZlZD1hbihlLG4pLGk/ci5sZW5ndGg9MDpzKCEwKX0pLHU9QihmdW5jdGlvbihlKXtzZSgiRmFpbGVkIHRvIHJlc29sdmUgYXN5bmMgY29tcG9uZW50OiAiK1N0cmluZyh0KSsoZT8iXG5SZWFzb246ICIrZToiIikpLEwodC5lcnJvckNvbXApJiYodC5lcnJvcj0hMCxzKCEwKSl9KSxsPXQoYyx1KTtyZXR1cm4geShsKSYmKF8obCk/aih0LnJlc29sdmVkKSYmbC50aGVuKGMsdSk6XyhsLmNvbXBvbmVudCkmJihsLmNvbXBvbmVudC50aGVuKGMsdSksTChsLmVycm9yKSYmKHQuZXJyb3JDb21wPWFuKGwuZXJyb3IsbikpLEwobC5sb2FkaW5nKSYmKHQubG9hZGluZ0NvbXA9YW4obC5sb2FkaW5nLG4pLDA9PT1sLmRlbGF5P3QubG9hZGluZz0hMDpvPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtvPW51bGwsaih0LnJlc29sdmVkKSYmaih0LmVycm9yKSYmKHQubG9hZGluZz0hMCxzKCExKSl9LGwuZGVsYXl8fDIwMCkpLEwobC50aW1lb3V0KSYmKGE9c2V0VGltZW91dChmdW5jdGlvbigpe2E9bnVsbCxqKHQucmVzb2x2ZWQpJiZ1KCJ0aW1lb3V0ICgiK2wudGltZW91dCsibXMpIil9LGwudGltZW91dCkpKSksaT0hMSx0LmxvYWRpbmc/dC5sb2FkaW5nQ29tcDp0LnJlc29sdmVkfX0oYT1lLG8pKSlyZXR1cm4gcz1hLGM9dCx1PW4sbD1yLGQ9aSwoZj1fZSgpKS5hc3luY0ZhY3Rvcnk9cyxmLmFzeW5jTWV0YT17ZGF0YTpjLGNvbnRleHQ6dSxjaGlsZHJlbjpsLHRhZzpkfSxmO3Q9dHx8e30sV24oZSksTCh0Lm1vZGVsKSYmZnVuY3Rpb24oZSx0KXt2YXIgbj1lLm1vZGVsJiZlLm1vZGVsLnByb3B8fCJ2YWx1ZSIscj1lLm1vZGVsJiZlLm1vZGVsLmV2ZW50fHwiaW5wdXQiOyh0LmF0dHJzfHwodC5hdHRycz17fSkpW25dPXQubW9kZWwudmFsdWU7dmFyIGk9dC5vbnx8KHQub249e30pLG89aVtyXSxhPXQubW9kZWwuY2FsbGJhY2s7TChvKT8oQXJyYXkuaXNBcnJheShvKT8tMT09PW8uaW5kZXhPZihhKTpvIT09YSkmJihpW3JdPVthXS5jb25jYXQobykpOmlbcl09YX0oZS5vcHRpb25zLHQpO3ZhciBwPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXQub3B0aW9ucy5wcm9wcztpZihqKGkpKXJldHVybiBrdChlLHQse30scik7dmFyIG89e30sYT1lLmF0dHJzLHM9ZS5wcm9wcztpZihMKGEpfHxMKHMpKWZvcih2YXIgYyBpbiBpKXt2YXIgdT14KGMpLGw9Yy50b0xvd2VyQ2FzZSgpO2MhPT1sJiZhJiZ3KGEsbCkmJmNlKCdQcm9wICInK2wrJyIgaXMgcGFzc2VkIHRvIGNvbXBvbmVudCAnK2xlKG58fHQpKycsIGJ1dCB0aGUgZGVjbGFyZWQgcHJvcCBuYW1lIGlzICInK2MrJyIuIE5vdGUgdGhhdCBIVE1MIGF0dHJpYnV0ZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUgYW5kIGNhbWVsQ2FzZWQgcHJvcHMgbmVlZCB0byB1c2UgdGhlaXIga2ViYWItY2FzZSBlcXVpdmFsZW50cyB3aGVuIHVzaW5nIGluLURPTSB0ZW1wbGF0ZXMuIFlvdSBzaG91bGQgcHJvYmFibHkgdXNlICInK3UrJyIgaW5zdGVhZCBvZiAiJytjKyciLicpLFN0KG8scyxjLHUsITApfHxTdChvLGEsYyx1LCExKX1yZXR1cm4ga3QoZSx0LG8scil9KHQsZSxpLG4pO2lmKE4oZS5vcHRpb25zLmZ1bmN0aW9uYWwpKXJldHVybiBmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvPWUub3B0aW9ucyxhPXt9LHM9by5wcm9wcztpZihMKHMpKWZvcih2YXIgYyBpbiBzKWFbY109VWUoYyxzLHR8fG0pO2Vsc2UgTChuLmF0dHJzKSYmWXQoYSxuLmF0dHJzKSxMKG4ucHJvcHMpJiZZdChhLG4ucHJvcHMpO3ZhciB1PW5ldyBHdChuLGEsaSxyLGUpLGw9by5yZW5kZXIuY2FsbChudWxsLHUuX2MsdSk7aWYobCBpbnN0YW5jZW9mIG1lKXJldHVybiBYdChsLG4sdS5wYXJlbnQsbyx1KTtpZihBcnJheS5pc0FycmF5KGwpKXtmb3IodmFyIGQ9eHQobCl8fFtdLGY9bmV3IEFycmF5KGQubGVuZ3RoKSxwPTA7cDxkLmxlbmd0aDtwKyspZltwXT1YdChkW3BdLG4sdS5wYXJlbnQsbyx1KTtyZXR1cm4gZn19KGUscCx0LG4scik7dmFyIGg9dC5vbjtpZih0Lm9uPXQubmF0aXZlT24sTihlLm9wdGlvbnMuYWJzdHJhY3QpKXt2YXIgdj10LnNsb3Q7dD17fSx2JiYodC5zbG90PXYpfSFmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5ob29rfHwoZS5ob29rPXt9KSxuPTA7bjxLdC5sZW5ndGg7bisrKXt2YXIgcj1LdFtuXSxpPXRbcl0sbz1KdFtyXTtpPT09b3x8aSYmaS5fbWVyZ2VkfHwodFtyXT1pP1F0KG8saSk6byl9fSh0KTt2YXIgZz1lLm9wdGlvbnMubmFtZXx8aTtyZXR1cm4gbmV3IG1lKCJ2dWUtY29tcG9uZW50LSIrZS5jaWQrKGc/Ii0iK2c6IiIpLHQsdm9pZCAwLHZvaWQgMCx2b2lkIDAsbix7Q3RvcjplLHByb3BzRGF0YTpwLGxpc3RlbmVyczpoLHRhZzppLGNoaWxkcmVuOnJ9LGEpfXNlKCJJbnZhbGlkIENvbXBvbmVudCBkZWZpbml0aW9uOiAiK1N0cmluZyhlKSxuKX19ZnVuY3Rpb24gUXQobixyKXt2YXIgZT1mdW5jdGlvbihlLHQpe24oZSx0KSxyKGUsdCl9O3JldHVybiBlLl9tZXJnZWQ9ITAsZX12YXIgZW49MSx0bj0yO2Z1bmN0aW9uIG5uKGUsdCxuLHIsaSxvKXtyZXR1cm4oQXJyYXkuaXNBcnJheShuKXx8YyhuKSkmJihpPXIscj1uLG49dm9pZCAwKSxOKG8pJiYoaT10biksZnVuY3Rpb24oZSx0LG4scixpKXtpZihMKG4pJiZMKG4uX19vYl9fKSlyZXR1cm4gc2UoIkF2b2lkIHVzaW5nIG9ic2VydmVkIGRhdGEgb2JqZWN0IGFzIHZub2RlIGRhdGE6ICIrSlNPTi5zdHJpbmdpZnkobikrIlxuQWx3YXlzIGNyZWF0ZSBmcmVzaCB2bm9kZSBkYXRhIG9iamVjdHMgaW4gZWFjaCByZW5kZXIhIixlKSxfZSgpO0wobikmJkwobi5pcykmJih0PW4uaXMpO2lmKCF0KXJldHVybiBfZSgpO0wobikmJkwobi5rZXkpJiYhYyhuLmtleSkmJnNlKCJBdm9pZCB1c2luZyBub24tcHJpbWl0aXZlIHZhbHVlIGFzIGtleSwgdXNlIHN0cmluZy9udW1iZXIgdmFsdWUgaW5zdGVhZC4iLGUpO0FycmF5LmlzQXJyYXkocikmJiJmdW5jdGlvbiI9PXR5cGVvZiByWzBdJiYoKG49bnx8e30pLnNjb3BlZFNsb3RzPXtkZWZhdWx0OnJbMF19LHIubGVuZ3RoPTApO2k9PT10bj9yPXh0KHIpOmk9PT1lbiYmKHI9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspaWYoQXJyYXkuaXNBcnJheShlW3RdKSlyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSxlKTtyZXR1cm4gZX0ocikpO3ZhciBvLGE7aWYoInN0cmluZyI9PXR5cGVvZiB0KXt2YXIgczthPWUuJHZub2RlJiZlLiR2bm9kZS5uc3x8ei5nZXRUYWdOYW1lc3BhY2UodCksei5pc1Jlc2VydmVkVGFnKHQpPyhMKG4pJiZMKG4ubmF0aXZlT24pJiZzZSgiVGhlIC5uYXRpdmUgbW9kaWZpZXIgZm9yIHYtb24gaXMgb25seSB2YWxpZCBvbiBjb21wb25lbnRzIGJ1dCBpdCB3YXMgdXNlZCBvbiA8Iit0KyI+LiIsZSksbz1uZXcgbWUoei5wYXJzZVBsYXRmb3JtVGFnTmFtZSh0KSxuLHIsdm9pZCAwLHZvaWQgMCxlKSk6bz1uJiZuLnByZXx8IUwocz16ZShlLiRvcHRpb25zLCJjb21wb25lbnRzIix0KSk/bmV3IG1lKHQsbixyLHZvaWQgMCx2b2lkIDAsZSk6WnQocyxuLGUscix0KX1lbHNlIG89WnQodCxuLGUscik7cmV0dXJuIEFycmF5LmlzQXJyYXkobyk/bzpMKG8pPyhMKGEpJiZmdW5jdGlvbiBlKHQsbixyKXt0Lm5zPW47ImZvcmVpZ25PYmplY3QiPT09dC50YWcmJihyPSEobj12b2lkIDApKTtpZihMKHQuY2hpbGRyZW4pKWZvcih2YXIgaT0wLG89dC5jaGlsZHJlbi5sZW5ndGg7aTxvO2krKyl7dmFyIGE9dC5jaGlsZHJlbltpXTtMKGEudGFnKSYmKGooYS5ucyl8fE4ocikmJiJzdmciIT09YS50YWcpJiZlKGEsbixyKX19KG8sYSksTChuKSYmZnVuY3Rpb24oZSl7eShlLnN0eWxlKSYmZ3QoZS5zdHlsZSk7eShlLmNsYXNzKSYmZ3QoZS5jbGFzcyl9KG4pLG8pOl9lKCl9KGUsdCxuLHIsaSl9dmFyIHJuLG9uPW51bGw7ZnVuY3Rpb24gYW4oZSx0KXtyZXR1cm4oZS5fX2VzTW9kdWxlfHxhZSYmIk1vZHVsZSI9PT1lW1N5bWJvbC50b1N0cmluZ1RhZ10pJiYoZT1lLmRlZmF1bHQpLHkoZSk/dC5leHRlbmQoZSk6ZX1mdW5jdGlvbiBzbihlLHQpe3JuLiRvbihlLHQpfWZ1bmN0aW9uIGNuKGUsdCl7cm4uJG9mZihlLHQpfWZ1bmN0aW9uIHVuKHQsbil7dmFyIHI9cm47cmV0dXJuIGZ1bmN0aW9uIGUoKXtudWxsIT09bi5hcHBseShudWxsLGFyZ3VtZW50cykmJnIuJG9mZih0LGUpfX1mdW5jdGlvbiBsbihlLHQsbil7YnQodCxufHx7fSxzbixjbix1bixybj1lKSxybj12b2lkIDB9dmFyIGRuPW51bGwsZm49ITE7ZnVuY3Rpb24gcG4oZSl7Zm9yKDtlJiYoZT1lLiRwYXJlbnQpOylpZihlLl9pbmFjdGl2ZSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBobihlLHQpe2lmKHQpe2lmKGUuX2RpcmVjdEluYWN0aXZlPSExLHBuKGUpKXJldHVybn1lbHNlIGlmKGUuX2RpcmVjdEluYWN0aXZlKXJldHVybjtpZihlLl9pbmFjdGl2ZXx8bnVsbD09PWUuX2luYWN0aXZlKXtlLl9pbmFjdGl2ZT0hMTtmb3IodmFyIG49MDtuPGUuJGNoaWxkcmVuLmxlbmd0aDtuKyspaG4oZS4kY2hpbGRyZW5bbl0pO3ZuKGUsImFjdGl2YXRlZCIpfX1mdW5jdGlvbiB2bihlLHQpe3ZlKCk7dmFyIG49ZS4kb3B0aW9uc1t0XSxyPXQrIiBob29rIjtpZihuKWZvcih2YXIgaT0wLG89bi5sZW5ndGg7aTxvO2krKylLZShuW2ldLGUsbnVsbCxlLHIpO2UuX2hhc0hvb2tFdmVudCYmZS4kZW1pdCgiaG9vazoiK3QpLGdlKCl9dmFyIGduPTEwMCxtbj1bXSx5bj1bXSxfbj17fSxibj17fSx3bj0hMSxrbj0hMSxTbj0wO3ZhciB4bj1EYXRlLm5vdztpZihYJiYhWil7dmFyIENuPXdpbmRvdy5wZXJmb3JtYW5jZTtDbiYmImZ1bmN0aW9uIj09dHlwZW9mIENuLm5vdyYmeG4oKT5kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKS50aW1lU3RhbXAmJih4bj1mdW5jdGlvbigpe3JldHVybiBDbi5ub3coKX0pfWZ1bmN0aW9uIFRuKCl7dmFyIGUsdDtmb3IoeG4oKSxrbj0hMCxtbi5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuaWQtdC5pZH0pLFNuPTA7U248bW4ubGVuZ3RoO1NuKyspaWYoKGU9bW5bU25dKS5iZWZvcmUmJmUuYmVmb3JlKCksdD1lLmlkLF9uW3RdPW51bGwsZS5ydW4oKSxudWxsIT1fblt0XSYmKGJuW3RdPShiblt0XXx8MCkrMSxiblt0XT5nbikpe3NlKCJZb3UgbWF5IGhhdmUgYW4gaW5maW5pdGUgdXBkYXRlIGxvb3AgIisoZS51c2VyPydpbiB3YXRjaGVyIHdpdGggZXhwcmVzc2lvbiAiJytlLmV4cHJlc3Npb24rJyInOiJpbiBhIGNvbXBvbmVudCByZW5kZXIgZnVuY3Rpb24uIiksZS52bSk7YnJlYWt9dmFyIG49eW4uc2xpY2UoKSxyPW1uLnNsaWNlKCk7U249bW4ubGVuZ3RoPXluLmxlbmd0aD0wLF9uPXt9LHduPWtuPSEoYm49e30pLGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0uX2luYWN0aXZlPSEwLGhuKGVbdF0sITApfShuKSxmdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aDtmb3IoO3QtLTspe3ZhciBuPWVbdF0scj1uLnZtO3IuX3dhdGNoZXI9PT1uJiZyLl9pc01vdW50ZWQmJiFyLl9pc0Rlc3Ryb3llZCYmKHIuXyR2ZD9yLl8kdmQuYWRkVXBkYXRlZFZtKHIpOnZuKHIsInVwZGF0ZWQiKSl9fShyKSxyZSYmei5kZXZ0b29scyYmcmUuZW1pdCgiZmx1c2giKX12YXIgT249MCxFbj1mdW5jdGlvbihlLHQsbixyLGkpe3RoaXMudm09ZSxpJiYoZS5fd2F0Y2hlcj10aGlzKSxlLl93YXRjaGVycy5wdXNoKHRoaXMpLHI/KHRoaXMuZGVlcD0hIXIuZGVlcCx0aGlzLnVzZXI9ISFyLnVzZXIsdGhpcy5sYXp5PSEhci5sYXp5LHRoaXMuc3luYz0hIXIuc3luYyx0aGlzLmJlZm9yZT1yLmJlZm9yZSk6dGhpcy5kZWVwPXRoaXMudXNlcj10aGlzLmxhenk9dGhpcy5zeW5jPSExLHRoaXMuY2I9bix0aGlzLmlkPSsrT24sdGhpcy5hY3RpdmU9ITAsdGhpcy5kaXJ0eT10aGlzLmxhenksdGhpcy5kZXBzPVtdLHRoaXMubmV3RGVwcz1bXSx0aGlzLmRlcElkcz1uZXcgb2UsdGhpcy5uZXdEZXBJZHM9bmV3IG9lLHRoaXMuZXhwcmVzc2lvbj10LnRvU3RyaW5nKCksImZ1bmN0aW9uIj09dHlwZW9mIHQ/dGhpcy5nZXR0ZXI9dDoodGhpcy5nZXR0ZXI9ZnVuY3Rpb24oZSl7aWYoIVcudGVzdChlKSl7dmFyIG49ZS5zcGxpdCgiLiIpO3JldHVybiBmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PG4ubGVuZ3RoO3QrKyl7aWYoIWUpcmV0dXJuO2U9ZVtuW3RdXX1yZXR1cm4gZX19fSh0KSx0aGlzLmdldHRlcnx8KHRoaXMuZ2V0dGVyPUEsc2UoJ0ZhaWxlZCB3YXRjaGluZyBwYXRoOiAiJyt0KyciIFdhdGNoZXIgb25seSBhY2NlcHRzIHNpbXBsZSBkb3QtZGVsaW1pdGVkIHBhdGhzLiBGb3IgZnVsbCBjb250cm9sLCB1c2UgYSBmdW5jdGlvbiBpbnN0ZWFkLicsZSkpKSx0aGlzLnZhbHVlPXRoaXMubGF6eT92b2lkIDA6dGhpcy5nZXQoKX07RW4ucHJvdG90eXBlLmdldD1mdW5jdGlvbigpe3ZhciBlO3ZlKHRoaXMpO3ZhciB0PXRoaXMudm07dHJ5e2U9dGhpcy5nZXR0ZXIuY2FsbCh0LHQpfWNhdGNoKGUpe2lmKCF0aGlzLnVzZXIpdGhyb3cgZTtKZShlLHQsJ2dldHRlciBmb3Igd2F0Y2hlciAiJyt0aGlzLmV4cHJlc3Npb24rJyInKX1maW5hbGx5e3RoaXMuZGVlcCYmZ3QoZSksZ2UoKSx0aGlzLmNsZWFudXBEZXBzKCl9cmV0dXJuIGV9LEVuLnByb3RvdHlwZS5hZGREZXA9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5pZDt0aGlzLm5ld0RlcElkcy5oYXModCl8fCh0aGlzLm5ld0RlcElkcy5hZGQodCksdGhpcy5uZXdEZXBzLnB1c2goZSksdGhpcy5kZXBJZHMuaGFzKHQpfHxlLmFkZFN1Yih0aGlzKSl9LEVuLnByb3RvdHlwZS5jbGVhbnVwRGVwcz1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLmRlcHMubGVuZ3RoO2UtLTspe3ZhciB0PXRoaXMuZGVwc1tlXTt0aGlzLm5ld0RlcElkcy5oYXModC5pZCl8fHQucmVtb3ZlU3ViKHRoaXMpfXZhciBuPXRoaXMuZGVwSWRzO3RoaXMuZGVwSWRzPXRoaXMubmV3RGVwSWRzLHRoaXMubmV3RGVwSWRzPW4sdGhpcy5uZXdEZXBJZHMuY2xlYXIoKSxuPXRoaXMuZGVwcyx0aGlzLmRlcHM9dGhpcy5uZXdEZXBzLHRoaXMubmV3RGVwcz1uLHRoaXMubmV3RGVwcy5sZW5ndGg9MH0sRW4ucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMubGF6eT90aGlzLmRpcnR5PSEwOnRoaXMuc3luYz90aGlzLnJ1bigpOmZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQ7aWYobnVsbD09X25bdF0pe2lmKF9uW3RdPSEwLGtuKXtmb3IodmFyIG49bW4ubGVuZ3RoLTE7U248biYmbW5bbl0uaWQ+ZS5pZDspbi0tO21uLnNwbGljZShuKzEsMCxlKX1lbHNlIG1uLnB1c2goZSk7aWYoIXduKXtpZih3bj0hMCwhei5hc3luYylyZXR1cm4gVG4oKTtvdChUbil9fX0odGhpcyl9LEVuLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXtpZih0aGlzLmFjdGl2ZSl7dmFyIGU9dGhpcy5nZXQoKTtpZihlIT09dGhpcy52YWx1ZXx8eShlKXx8dGhpcy5kZWVwKXt2YXIgdD10aGlzLnZhbHVlO2lmKHRoaXMudmFsdWU9ZSx0aGlzLnVzZXIpdHJ5e3RoaXMuY2IuY2FsbCh0aGlzLnZtLGUsdCl9Y2F0Y2goZSl7SmUoZSx0aGlzLnZtLCdjYWxsYmFjayBmb3Igd2F0Y2hlciAiJyt0aGlzLmV4cHJlc3Npb24rJyInKX1lbHNlIHRoaXMuY2IuY2FsbCh0aGlzLnZtLGUsdCl9fX0sRW4ucHJvdG90eXBlLmV2YWx1YXRlPWZ1bmN0aW9uKCl7dGhpcy52YWx1ZT10aGlzLmdldCgpLHRoaXMuZGlydHk9ITF9LEVuLnByb3RvdHlwZS5kZXBlbmQ9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5kZXBzLmxlbmd0aDtlLS07KXRoaXMuZGVwc1tlXS5kZXBlbmQoKX0sRW4ucHJvdG90eXBlLnRlYXJkb3duPWZ1bmN0aW9uKCl7aWYodGhpcy5hY3RpdmUpe3RoaXMudm0uX2lzQmVpbmdEZXN0cm95ZWR8fGIodGhpcy52bS5fd2F0Y2hlcnMsdGhpcyk7Zm9yKHZhciBlPXRoaXMuZGVwcy5sZW5ndGg7ZS0tOyl0aGlzLmRlcHNbZV0ucmVtb3ZlU3ViKHRoaXMpO3RoaXMuYWN0aXZlPSExfX07dmFyIEFuPXtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6QSxzZXQ6QX07ZnVuY3Rpb24gSW4oZSx0LG4pe0FuLmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzW3RdW25dfSxBbi5zZXQ9ZnVuY3Rpb24oZSl7dGhpc1t0XVtuXT1lfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxuLEFuKX1mdW5jdGlvbiAkbihlKXtlLl93YXRjaGVycz1bXTt2YXIgdD1lLiRvcHRpb25zO3QucHJvcHMmJmZ1bmN0aW9uKHIsaSl7dmFyIG89ci4kb3B0aW9ucy5wcm9wc0RhdGF8fHt9LGE9ci5fcHJvcHM9e30scz1yLiRvcHRpb25zLl9wcm9wS2V5cz1bXSxjPSFyLiRwYXJlbnQ7Y3x8VGUoITEpO3ZhciBlPWZ1bmN0aW9uKGUpe3MucHVzaChlKTt2YXIgdD1VZShlLGksbyxyKSxuPXgoZSk7KGYobil8fHouaXNSZXNlcnZlZEF0dHIobikpJiZzZSgnIicrbisnIiBpcyBhIHJlc2VydmVkIGF0dHJpYnV0ZSBhbmQgY2Fubm90IGJlIHVzZWQgYXMgY29tcG9uZW50IHByb3AuJyxyKSxBZShhLGUsdCxmdW5jdGlvbigpe2N8fGZufHxzZSgiQXZvaWQgbXV0YXRpbmcgYSBwcm9wIGRpcmVjdGx5IHNpbmNlIHRoZSB2YWx1ZSB3aWxsIGJlIG92ZXJ3cml0dGVuIHdoZW5ldmVyIHRoZSBwYXJlbnQgY29tcG9uZW50IHJlLXJlbmRlcnMuIEluc3RlYWQsIHVzZSBhIGRhdGEgb3IgY29tcHV0ZWQgcHJvcGVydHkgYmFzZWQgb24gdGhlIHByb3AncyB2YWx1ZS4gUHJvcCBiZWluZyBtdXRhdGVkOiBcIiIrZSsnIicscil9KSxlIGluIHJ8fEluKHIsIl9wcm9wcyIsZSl9O2Zvcih2YXIgdCBpbiBpKWUodCk7VGUoITApfShlLHQucHJvcHMpLHQubWV0aG9kcyYmZnVuY3Rpb24oZSx0KXt2YXIgbj1lLiRvcHRpb25zLnByb3BzO2Zvcih2YXIgciBpbiB0KSJmdW5jdGlvbiIhPXR5cGVvZiB0W3JdJiZzZSgnTWV0aG9kICInK3IrJyIgaGFzIHR5cGUgIicrdHlwZW9mIHRbcl0rJyIgaW4gdGhlIGNvbXBvbmVudCBkZWZpbml0aW9uLiBEaWQgeW91IHJlZmVyZW5jZSB0aGUgZnVuY3Rpb24gY29ycmVjdGx5PycsZSksbiYmdyhuLHIpJiZzZSgnTWV0aG9kICInK3IrJyIgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkIGFzIGEgcHJvcC4nLGUpLHIgaW4gZSYmVihyKSYmc2UoJ01ldGhvZCAiJytyKyciIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIFZ1ZSBpbnN0YW5jZSBtZXRob2QuIEF2b2lkIGRlZmluaW5nIGNvbXBvbmVudCBtZXRob2RzIHRoYXQgc3RhcnQgd2l0aCBfIG9yICQuJyksZVtyXT0iZnVuY3Rpb24iIT10eXBlb2YgdFtyXT9BOkModFtyXSxlKX0oZSx0Lm1ldGhvZHMpLHQuZGF0YT9mdW5jdGlvbihlKXt2YXIgdD1lLiRvcHRpb25zLmRhdGE7dSh0PWUuX2RhdGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24oZSx0KXt2ZSgpO3RyeXtyZXR1cm4gZS5jYWxsKHQsdCl9Y2F0Y2goZSl7cmV0dXJuIEplKGUsdCwiZGF0YSgpIikse319ZmluYWxseXtnZSgpfX0odCxlKTp0fHx7fSl8fCh0PXt9LHNlKCJkYXRhIGZ1bmN0aW9ucyBzaG91bGQgcmV0dXJuIGFuIG9iamVjdDpcbmh0dHBzOi8vdnVlanMub3JnL3YyL2d1aWRlL2NvbXBvbmVudHMuaHRtbCNkYXRhLU11c3QtQmUtYS1GdW5jdGlvbiIsZSkpO3ZhciBuPU9iamVjdC5rZXlzKHQpLHI9ZS4kb3B0aW9ucy5wcm9wcyxpPWUuJG9wdGlvbnMubWV0aG9kcyxvPW4ubGVuZ3RoO2Zvcig7by0tOyl7dmFyIGE9bltvXTtpJiZ3KGksYSkmJnNlKCdNZXRob2QgIicrYSsnIiBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQgYXMgYSBkYXRhIHByb3BlcnR5LicsZSksciYmdyhyLGEpP3NlKCdUaGUgZGF0YSBwcm9wZXJ0eSAiJythKyciIGlzIGFscmVhZHkgZGVjbGFyZWQgYXMgYSBwcm9wLiBVc2UgcHJvcCBkZWZhdWx0IHZhbHVlIGluc3RlYWQuJyxlKTpWKGEpfHxJbihlLCJfZGF0YSIsYSl9RWUodCwhMCl9KGUpOkVlKGUuX2RhdGE9e30sITApLHQuY29tcHV0ZWQmJmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5fY29tcHV0ZWRXYXRjaGVycz1PYmplY3QuY3JlYXRlKG51bGwpLHI9bmUoKTtmb3IodmFyIGkgaW4gdCl7dmFyIG89dFtpXSxhPSJmdW5jdGlvbiI9PXR5cGVvZiBvP286by5nZXQ7bnVsbD09YSYmc2UoJ0dldHRlciBpcyBtaXNzaW5nIGZvciBjb21wdXRlZCBwcm9wZXJ0eSAiJytpKyciLicsZSkscnx8KG5baV09bmV3IEVuKGUsYXx8QSxBLFBuKSksaSBpbiBlP2kgaW4gZS4kZGF0YT9zZSgnVGhlIGNvbXB1dGVkIHByb3BlcnR5ICInK2krJyIgaXMgYWxyZWFkeSBkZWZpbmVkIGluIGRhdGEuJyxlKTplLiRvcHRpb25zLnByb3BzJiZpIGluIGUuJG9wdGlvbnMucHJvcHMmJnNlKCdUaGUgY29tcHV0ZWQgcHJvcGVydHkgIicraSsnIiBpcyBhbHJlYWR5IGRlZmluZWQgYXMgYSBwcm9wLicsZSk6TW4oZSxpLG8pfX0oZSx0LmNvbXB1dGVkKSx0LndhdGNoJiZ0LndhdGNoIT09ZWUmJmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIHQpe3ZhciByPXRbbl07aWYoQXJyYXkuaXNBcnJheShyKSlmb3IodmFyIGk9MDtpPHIubGVuZ3RoO2krKylObihlLG4scltpXSk7ZWxzZSBObihlLG4scil9fShlLHQud2F0Y2gpfXZhciBQbj17bGF6eTohMH07ZnVuY3Rpb24gTW4oZSx0LG4pe3ZhciByPSFuZSgpOyJmdW5jdGlvbiI9PXR5cGVvZiBuPyhBbi5nZXQ9cj9qbih0KTpMbihuKSxBbi5zZXQ9QSk6KEFuLmdldD1uLmdldD9yJiYhMSE9PW4uY2FjaGU/am4odCk6TG4obi5nZXQpOkEsQW4uc2V0PW4uc2V0fHxBKSxBbi5zZXQ9PT1BJiYoQW4uc2V0PWZ1bmN0aW9uKCl7c2UoJ0NvbXB1dGVkIHByb3BlcnR5ICInK3QrJyIgd2FzIGFzc2lnbmVkIHRvIGJ1dCBpdCBoYXMgbm8gc2V0dGVyLicsdGhpcyl9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LEFuKX1mdW5jdGlvbiBqbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9jb21wdXRlZFdhdGNoZXJzJiZ0aGlzLl9jb21wdXRlZFdhdGNoZXJzW3RdO2lmKGUpcmV0dXJuIGUuZGlydHkmJmUuZXZhbHVhdGUoKSxoZS5TaGFyZWRPYmplY3QudGFyZ2V0JiZlLmRlcGVuZCgpLGUudmFsdWV9fWZ1bmN0aW9uIExuKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmNhbGwodGhpcyx0aGlzKX19ZnVuY3Rpb24gTm4oZSx0LG4scil7cmV0dXJuIHUobikmJihuPShyPW4pLmhhbmRsZXIpLCJzdHJpbmciPT10eXBlb2YgbiYmKG49ZVtuXSksZS4kd2F0Y2godCxuLHIpfXZhciBCbixEbixSbixGbix6bixVbixWbixxbj0wO2Z1bmN0aW9uIFduKGUpe3ZhciB0PWUub3B0aW9ucztpZihlLnN1cGVyKXt2YXIgbj1XbihlLnN1cGVyKTtpZihuIT09ZS5zdXBlck9wdGlvbnMpe2Uuc3VwZXJPcHRpb25zPW47dmFyIHI9ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLm9wdGlvbnMscj1lLnNlYWxlZE9wdGlvbnM7Zm9yKHZhciBpIGluIG4pbltpXSE9PXJbaV0mJih0fHwodD17fSksdFtpXT1uW2ldKTtyZXR1cm4gdH0oZSk7ciYmTyhlLmV4dGVuZE9wdGlvbnMsciksKHQ9ZS5vcHRpb25zPUZlKG4sZS5leHRlbmRPcHRpb25zKSkubmFtZSYmKHQuY29tcG9uZW50c1t0Lm5hbWVdPWUpfX1yZXR1cm4gdH1mdW5jdGlvbiBIbihlKXt0aGlzIGluc3RhbmNlb2YgSG58fHNlKCJWdWUgaXMgYSBjb25zdHJ1Y3RvciBhbmQgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHRoZSBgbmV3YCBrZXl3b3JkIiksdGhpcy5faW5pdChlKX1mdW5jdGlvbiBHbihlKXtlLmNpZD0wO3ZhciBhPTE7ZS5leHRlbmQ9ZnVuY3Rpb24oZSl7ZT1lfHx7fTt2YXIgdD10aGlzLG49dC5jaWQscj1lLl9DdG9yfHwoZS5fQ3Rvcj17fSk7aWYocltuXSlyZXR1cm4gcltuXTt2YXIgaT1lLm5hbWV8fHQub3B0aW9ucy5uYW1lO2kmJkRlKGkpO3ZhciBvPWZ1bmN0aW9uKGUpe3RoaXMuX2luaXQoZSl9O3JldHVybigoby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPW8pLmNpZD1hKyssby5vcHRpb25zPUZlKHQub3B0aW9ucyxlKSxvLnN1cGVyPXQsby5vcHRpb25zLnByb3BzJiZmdW5jdGlvbihlKXt2YXIgdD1lLm9wdGlvbnMucHJvcHM7Zm9yKHZhciBuIGluIHQpSW4oZS5wcm90b3R5cGUsIl9wcm9wcyIsbil9KG8pLG8ub3B0aW9ucy5jb21wdXRlZCYmZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vcHRpb25zLmNvbXB1dGVkO2Zvcih2YXIgbiBpbiB0KU1uKGUucHJvdG90eXBlLG4sdFtuXSl9KG8pLG8uZXh0ZW5kPXQuZXh0ZW5kLG8ubWl4aW49dC5taXhpbixvLnVzZT10LnVzZSxSLmZvckVhY2goZnVuY3Rpb24oZSl7b1tlXT10W2VdfSksaSYmKG8ub3B0aW9ucy5jb21wb25lbnRzW2ldPW8pLG8uc3VwZXJPcHRpb25zPXQub3B0aW9ucyxvLmV4dGVuZE9wdGlvbnM9ZSxvLnNlYWxlZE9wdGlvbnM9Tyh7fSxvLm9wdGlvbnMpLHJbbl09b319ZnVuY3Rpb24gWG4oZSl7cmV0dXJuIGUmJihlLkN0b3Iub3B0aW9ucy5uYW1lfHxlLnRhZyl9ZnVuY3Rpb24gWW4oZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT8tMTxlLmluZGV4T2YodCk6InN0cmluZyI9PXR5cGVvZiBlPy0xPGUuc3BsaXQoIiwiKS5pbmRleE9mKHQpOiEhaShlKSYmZS50ZXN0KHQpfWZ1bmN0aW9uIEpuKGUsdCl7dmFyIG49ZS5jYWNoZSxyPWUua2V5cyxpPWUuX3Zub2RlO2Zvcih2YXIgbyBpbiBuKXt2YXIgYT1uW29dO2lmKGEpe3ZhciBzPVhuKGEuY29tcG9uZW50T3B0aW9ucyk7cyYmIXQocykmJktuKG4sbyxyLGkpfX19ZnVuY3Rpb24gS24oZSx0LG4scil7dmFyIGk9ZVt0XTshaXx8ciYmaS50YWc9PT1yLnRhZ3x8aS5jb21wb25lbnRJbnN0YW5jZS4kZGVzdHJveSgpLGVbdF09bnVsbCxiKG4sdCl9SG4ucHJvdG90eXBlLl9pbml0PWZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG8sYSxzPXRoaXM7cy5fdWlkPXFuKyssei5wZXJmb3JtYW5jZSYmcHQmJih0PSJ2dWUtcGVyZi1zdGFydDoiK3MuX3VpZCxuPSJ2dWUtcGVyZi1lbmQ6IitzLl91aWQscHQodCkpLHMuX2lzVnVlPSEwLGUmJmUuX2lzQ29tcG9uZW50P2Z1bmN0aW9uKGUsdCl7dmFyIG49ZS4kb3B0aW9ucz1PYmplY3QuY3JlYXRlKGUuY29uc3RydWN0b3Iub3B0aW9ucykscj10Ll9wYXJlbnRWbm9kZTtuLnBhcmVudD10LnBhcmVudDt2YXIgaT0obi5fcGFyZW50Vm5vZGU9cikuY29tcG9uZW50T3B0aW9ucztuLnByb3BzRGF0YT1pLnByb3BzRGF0YSxuLl9wYXJlbnRMaXN0ZW5lcnM9aS5saXN0ZW5lcnMsbi5fcmVuZGVyQ2hpbGRyZW49aS5jaGlsZHJlbixuLl9jb21wb25lbnRUYWc9aS50YWcsdC5yZW5kZXImJihuLnJlbmRlcj10LnJlbmRlcixuLnN0YXRpY1JlbmRlckZucz10LnN0YXRpY1JlbmRlckZucyl9KHMsZSk6cy4kb3B0aW9ucz1GZShXbihzLmNvbnN0cnVjdG9yKSxlfHx7fSxzKSxydChzKSxmdW5jdGlvbihlKXt2YXIgdD1lLiRvcHRpb25zLG49dC5wYXJlbnQ7aWYobiYmIXQuYWJzdHJhY3Qpe2Zvcig7bi4kb3B0aW9ucy5hYnN0cmFjdCYmbi4kcGFyZW50OyluPW4uJHBhcmVudDtuLiRjaGlsZHJlbi5wdXNoKGUpfWUuJHBhcmVudD1uLGUuJHJvb3Q9bj9uLiRyb290OmUsZS4kY2hpbGRyZW49W10sZS4kcmVmcz17fSxlLl93YXRjaGVyPW51bGwsZS5faW5hY3RpdmU9bnVsbCxlLl9kaXJlY3RJbmFjdGl2ZT0hMSxlLl9pc01vdW50ZWQ9ITEsZS5faXNEZXN0cm95ZWQ9ITEsZS5faXNCZWluZ0Rlc3Ryb3llZD0hMX0ocy5fc2VsZj1zKSxmdW5jdGlvbihlKXtlLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSxlLl9oYXNIb29rRXZlbnQ9ITE7dmFyIHQ9ZS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO3QmJmxuKGUsdCl9KHMpLGZ1bmN0aW9uKGkpe2kuX3Zub2RlPW51bGwsaS5fc3RhdGljVHJlZXM9bnVsbDt2YXIgZT1pLiRvcHRpb25zLHQ9aS4kdm5vZGU9ZS5fcGFyZW50Vm5vZGUsbj10JiZ0LmNvbnRleHQ7aS4kc2xvdHM9T3QoZS5fcmVuZGVyQ2hpbGRyZW4sbiksaS4kc2NvcGVkU2xvdHM9bSxpLl9jPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBubihpLGUsdCxuLHIsITEpfSxpLiRjcmVhdGVFbGVtZW50PWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBubihpLGUsdCxuLHIsITApfTt2YXIgcj10JiZ0LmRhdGE7QWUoaSwiJGF0dHJzIixyJiZyLmF0dHJzfHxtLGZ1bmN0aW9uKCl7IWZuJiZzZSgiJGF0dHJzIGlzIHJlYWRvbmx5LiIsaSl9LCEwKSxBZShpLCIkbGlzdGVuZXJzIixlLl9wYXJlbnRMaXN0ZW5lcnN8fG0sZnVuY3Rpb24oKXshZm4mJnNlKCIkbGlzdGVuZXJzIGlzIHJlYWRvbmx5LiIsaSl9LCEwKX0ocyksdm4ocywiYmVmb3JlQ3JlYXRlIiksKGk9VHQoKHI9cykuJG9wdGlvbnMuaW5qZWN0LHIpKSYmKFRlKCExKSxPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0FlKHIsZSxpW2VdLGZ1bmN0aW9uKCl7c2UoJ0F2b2lkIG11dGF0aW5nIGFuIGluamVjdGVkIHZhbHVlIGRpcmVjdGx5IHNpbmNlIHRoZSBjaGFuZ2VzIHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2hlbmV2ZXIgdGhlIHByb3ZpZGVkIGNvbXBvbmVudCByZS1yZW5kZXJzLiBpbmplY3Rpb24gYmVpbmcgbXV0YXRlZDogIicrZSsnIicscil9KX0pLFRlKCEwKSksJG4ocyksKGE9KG89cykuJG9wdGlvbnMucHJvdmlkZSkmJihvLl9wcm92aWRlZD0iZnVuY3Rpb24iPT10eXBlb2YgYT9hLmNhbGwobyk6YSksdm4ocywiY3JlYXRlZCIpLHoucGVyZm9ybWFuY2UmJnB0JiYocy5fbmFtZT1sZShzLCExKSxwdChuKSxodCgidnVlICIrcy5fbmFtZSsiIGluaXQiLHQsbikpLHMuJG9wdGlvbnMuZWwmJnMuJG1vdW50KHMuJG9wdGlvbnMuZWwpfSxCbj1IbixSbj17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb3BzfX0sKERuPXtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YX19KS5zZXQ9ZnVuY3Rpb24oKXtzZSgiQXZvaWQgcmVwbGFjaW5nIGluc3RhbmNlIHJvb3QgJGRhdGEuIFVzZSBuZXN0ZWQgZGF0YSBwcm9wZXJ0aWVzIGluc3RlYWQuIix0aGlzKX0sUm4uc2V0PWZ1bmN0aW9uKCl7c2UoIiRwcm9wcyBpcyByZWFkb25seS4iLHRoaXMpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQm4ucHJvdG90eXBlLCIkZGF0YSIsRG4pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCbi5wcm90b3R5cGUsIiRwcm9wcyIsUm4pLEJuLnByb3RvdHlwZS4kc2V0PUllLEJuLnByb3RvdHlwZS4kZGVsZXRlPSRlLEJuLnByb3RvdHlwZS4kd2F0Y2g9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXM7aWYodSh0KSlyZXR1cm4gTm4ocixlLHQsbik7KG49bnx8e30pLnVzZXI9ITA7dmFyIGk9bmV3IEVuKHIsZSx0LG4pO2lmKG4uaW1tZWRpYXRlKXRyeXt0LmNhbGwocixpLnZhbHVlKX1jYXRjaChlKXtKZShlLHIsJ2NhbGxiYWNrIGZvciBpbW1lZGlhdGUgd2F0Y2hlciAiJytpLmV4cHJlc3Npb24rJyInKX1yZXR1cm4gZnVuY3Rpb24oKXtpLnRlYXJkb3duKCl9fSx6bj0vXmhvb2s6LywoRm49SG4pLnByb3RvdHlwZS4kb249ZnVuY3Rpb24oZSx0KXtpZihBcnJheS5pc0FycmF5KGUpKWZvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyl0aGlzLiRvbihlW25dLHQpO2Vsc2UodGhpcy5fZXZlbnRzW2VdfHwodGhpcy5fZXZlbnRzW2VdPVtdKSkucHVzaCh0KSx6bi50ZXN0KGUpJiYodGhpcy5faGFzSG9va0V2ZW50PSEwKTtyZXR1cm4gdGhpc30sRm4ucHJvdG90eXBlLiRvbmNlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztmdW5jdGlvbiByKCl7bi4kb2ZmKGUsciksdC5hcHBseShuLGFyZ3VtZW50cyl9cmV0dXJuIHIuZm49dCxuLiRvbihlLHIpLG59LEZuLnByb3RvdHlwZS4kb2ZmPWZ1bmN0aW9uKGUsdCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXM7aWYoQXJyYXkuaXNBcnJheShlKSl7Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKXRoaXMuJG9mZihlW25dLHQpO3JldHVybiB0aGlzfXZhciBpLG89dGhpcy5fZXZlbnRzW2VdO2lmKCFvKXJldHVybiB0aGlzO2lmKCF0KXJldHVybiB0aGlzLl9ldmVudHNbZV09bnVsbCx0aGlzO2Zvcih2YXIgYT1vLmxlbmd0aDthLS07KWlmKChpPW9bYV0pPT09dHx8aS5mbj09PXQpe28uc3BsaWNlKGEsMSk7YnJlYWt9cmV0dXJuIHRoaXN9LEZuLnByb3RvdHlwZS4kZW1pdD1mdW5jdGlvbihlKXt2YXIgdD1lLnRvTG93ZXJDYXNlKCk7dCE9PWUmJnRoaXMuX2V2ZW50c1t0XSYmY2UoJ0V2ZW50ICInK3QrJyIgaXMgZW1pdHRlZCBpbiBjb21wb25lbnQgJytsZSh0aGlzKSsnIGJ1dCB0aGUgaGFuZGxlciBpcyByZWdpc3RlcmVkIGZvciAiJytlKyciLiBOb3RlIHRoYXQgSFRNTCBhdHRyaWJ1dGVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIGFuZCB5b3UgY2Fubm90IHVzZSB2LW9uIHRvIGxpc3RlbiB0byBjYW1lbENhc2UgZXZlbnRzIHdoZW4gdXNpbmcgaW4tRE9NIHRlbXBsYXRlcy4gWW91IHNob3VsZCBwcm9iYWJseSB1c2UgIicreChlKSsnIiBpbnN0ZWFkIG9mICInK2UrJyIuJyk7dmFyIG49dGhpcy5fZXZlbnRzW2VdO2lmKG4pe249MTxuLmxlbmd0aD9UKG4pOm47Zm9yKHZhciByPVQoYXJndW1lbnRzLDEpLGk9J2V2ZW50IGhhbmRsZXIgZm9yICInK2UrJyInLG89MCxhPW4ubGVuZ3RoO288YTtvKyspS2UobltvXSx0aGlzLHIsdGhpcyxpKX1yZXR1cm4gdGhpc30sKFVuPUhuKS5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9dGhpcyxpPXIuJGVsLG89ci5fdm5vZGUsYT0obj1kbixkbj1yLGZ1bmN0aW9uKCl7ZG49bn0pO3IuX3Zub2RlPWUsci4kZWw9bz9yLl9fcGF0Y2hfXyhvLGUpOnIuX19wYXRjaF9fKHIuJGVsLGUsdCwhMSksYSgpLGkmJihpLl9fdnVlX189bnVsbCksci4kZWwmJihyLiRlbC5fX3Z1ZV9fPXIpLHIuJHZub2RlJiZyLiRwYXJlbnQmJnIuJHZub2RlPT09ci4kcGFyZW50Ll92bm9kZSYmKHIuJHBhcmVudC4kZWw9ci4kZWwpfSxVbi5wcm90b3R5cGUuJGZvcmNlVXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fd2F0Y2hlciYmdGhpcy5fd2F0Y2hlci51cGRhdGUoKX0sVW4ucHJvdG90eXBlLiRkZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZighZS5faXNCZWluZ0Rlc3Ryb3llZCl7dm4oZSwiYmVmb3JlRGVzdHJveSIpLGUuX2lzQmVpbmdEZXN0cm95ZWQ9ITA7dmFyIHQ9ZS4kcGFyZW50OyF0fHx0Ll9pc0JlaW5nRGVzdHJveWVkfHxlLiRvcHRpb25zLmFic3RyYWN0fHxiKHQuJGNoaWxkcmVuLGUpLGUuX3dhdGNoZXImJmUuX3dhdGNoZXIudGVhcmRvd24oKTtmb3IodmFyIG49ZS5fd2F0Y2hlcnMubGVuZ3RoO24tLTspZS5fd2F0Y2hlcnNbbl0udGVhcmRvd24oKTtlLl9kYXRhLl9fb2JfXyYmZS5fZGF0YS5fX29iX18udm1Db3VudC0tLGUuX2lzRGVzdHJveWVkPSEwLGUuX19wYXRjaF9fKGUuX3Zub2RlLG51bGwpLHZuKGUsImRlc3Ryb3llZCIpLGUuJG9mZigpLGUuJGVsJiYoZS4kZWwuX192dWVfXz1udWxsKSxlLiR2bm9kZSYmKGUuJHZub2RlLnBhcmVudD1udWxsKX19LEh0KChWbj1IbikucHJvdG90eXBlKSxWbi5wcm90b3R5cGUuJG5leHRUaWNrPWZ1bmN0aW9uKGUpe3JldHVybiBvdChlLHRoaXMpfSxWbi5wcm90b3R5cGUuX3JlbmRlcj1mdW5jdGlvbigpe3ZhciB0LG49dGhpcyxlPW4uJG9wdGlvbnMscj1lLnJlbmRlcixpPWUuX3BhcmVudFZub2RlO2kmJihuLiRzY29wZWRTbG90cz1BdChpLmRhdGEuc2NvcGVkU2xvdHMsbi4kc2xvdHMsbi4kc2NvcGVkU2xvdHMpKSxuLiR2bm9kZT1pO3RyeXtvbj1uLHQ9ci5jYWxsKG4uX3JlbmRlclByb3h5LG4uJGNyZWF0ZUVsZW1lbnQpfWNhdGNoKGUpe2lmKEplKGUsbiwicmVuZGVyIiksbi4kb3B0aW9ucy5yZW5kZXJFcnJvcil0cnl7dD1uLiRvcHRpb25zLnJlbmRlckVycm9yLmNhbGwobi5fcmVuZGVyUHJveHksbi4kY3JlYXRlRWxlbWVudCxlKX1jYXRjaChlKXtKZShlLG4sInJlbmRlckVycm9yIiksdD1uLl92bm9kZX1lbHNlIHQ9bi5fdm5vZGV9ZmluYWxseXtvbj1udWxsfXJldHVybiBBcnJheS5pc0FycmF5KHQpJiYxPT09dC5sZW5ndGgmJih0PXRbMF0pLHQgaW5zdGFuY2VvZiBtZXx8KEFycmF5LmlzQXJyYXkodCkmJnNlKCJNdWx0aXBsZSByb290IG5vZGVzIHJldHVybmVkIGZyb20gcmVuZGVyIGZ1bmN0aW9uLiBSZW5kZXIgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhIHNpbmdsZSByb290IG5vZGUuIixuKSx0PV9lKCkpLHQucGFyZW50PWksdH07dmFyIFpuLFFuLGVyLHRyPVtTdHJpbmcsUmVnRXhwLEFycmF5XSxucj17S2VlcEFsaXZlOntuYW1lOiJrZWVwLWFsaXZlIixhYnN0cmFjdDohMCxwcm9wczp7aW5jbHVkZTp0cixleGNsdWRlOnRyLG1heDpbU3RyaW5nLE51bWJlcl19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLmNhY2hlPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5rZXlzPVtdfSxkZXN0cm95ZWQ6ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdGhpcy5jYWNoZSlLbih0aGlzLmNhY2hlLGUsdGhpcy5rZXlzKX0sbW91bnRlZDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy4kd2F0Y2goImluY2x1ZGUiLGZ1bmN0aW9uKHQpe0puKGUsZnVuY3Rpb24oZSl7cmV0dXJuIFluKHQsZSl9KX0pLHRoaXMuJHdhdGNoKCJleGNsdWRlIixmdW5jdGlvbih0KXtKbihlLGZ1bmN0aW9uKGUpe3JldHVybiFZbih0LGUpfSl9KX0scmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kc2xvdHMuZGVmYXVsdCx0PWZ1bmN0aW9uKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciBuPWVbdF07aWYoTChuKSYmKEwobi5jb21wb25lbnRPcHRpb25zKXx8KHI9bikuaXNDb21tZW50JiZyLmFzeW5jRmFjdG9yeSkpcmV0dXJuIG59dmFyIHJ9KGUpLG49dCYmdC5jb21wb25lbnRPcHRpb25zO2lmKG4pe3ZhciByPVhuKG4pLGk9dGhpcy5pbmNsdWRlLG89dGhpcy5leGNsdWRlO2lmKGkmJighcnx8IVluKGkscikpfHxvJiZyJiZZbihvLHIpKXJldHVybiB0O3ZhciBhPXRoaXMuY2FjaGUscz10aGlzLmtleXMsYz1udWxsPT10LmtleT9uLkN0b3IuY2lkKyhuLnRhZz8iOjoiK24udGFnOiIiKTp0LmtleTthW2NdPyh0LmNvbXBvbmVudEluc3RhbmNlPWFbY10uY29tcG9uZW50SW5zdGFuY2UsYihzLGMpLHMucHVzaChjKSk6KGFbY109dCxzLnB1c2goYyksdGhpcy5tYXgmJnMubGVuZ3RoPnBhcnNlSW50KHRoaXMubWF4KSYmS24oYSxzWzBdLHMsdGhpcy5fdm5vZGUpKSx0LmRhdGEua2VlcEFsaXZlPSEwfXJldHVybiB0fHxlJiZlWzBdfX19O1puPUhuLGVyPXtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gen0sc2V0OmZ1bmN0aW9uKCl7c2UoIkRvIG5vdCByZXBsYWNlIHRoZSBWdWUuY29uZmlnIG9iamVjdCwgc2V0IGluZGl2aWR1YWwgZmllbGRzIGluc3RlYWQuIil9fSxPYmplY3QuZGVmaW5lUHJvcGVydHkoWm4sImNvbmZpZyIsZXIpLFpuLnV0aWw9e3dhcm46c2UsZXh0ZW5kOk8sbWVyZ2VPcHRpb25zOkZlLGRlZmluZVJlYWN0aXZlOkFlfSxabi5zZXQ9SWUsWm4uZGVsZXRlPSRlLFpuLm5leHRUaWNrPW90LFpuLm9ic2VydmFibGU9ZnVuY3Rpb24oZSl7cmV0dXJuIEVlKGUpLGV9LFpuLm9wdGlvbnM9T2JqZWN0LmNyZWF0ZShudWxsKSxSLmZvckVhY2goZnVuY3Rpb24oZSl7Wm4ub3B0aW9uc1tlKyJzIl09T2JqZWN0LmNyZWF0ZShudWxsKX0pLE8oKFpuLm9wdGlvbnMuX2Jhc2U9Wm4pLm9wdGlvbnMuY29tcG9uZW50cyxuciksWm4udXNlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2luc3RhbGxlZFBsdWdpbnN8fCh0aGlzLl9pbnN0YWxsZWRQbHVnaW5zPVtdKTtpZigtMTx0LmluZGV4T2YoZSkpcmV0dXJuIHRoaXM7dmFyIG49VChhcmd1bWVudHMsMSk7cmV0dXJuIG4udW5zaGlmdCh0aGlzKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5pbnN0YWxsP2UuaW5zdGFsbC5hcHBseShlLG4pOiJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLmFwcGx5KG51bGwsbiksdC5wdXNoKGUpLHRoaXN9LFpuLm1peGluPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9wdGlvbnM9RmUodGhpcy5vcHRpb25zLGUpLHRoaXN9LEduKFpuKSxRbj1abixSLmZvckVhY2goZnVuY3Rpb24obil7UW5bbl09ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD8oImNvbXBvbmVudCI9PT1uJiZEZShlKSwiY29tcG9uZW50Ij09PW4mJnUodCkmJih0Lm5hbWU9dC5uYW1lfHxlLHQ9dGhpcy5vcHRpb25zLl9iYXNlLmV4dGVuZCh0KSksImRpcmVjdGl2ZSI9PT1uJiYiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQ9e2JpbmQ6dCx1cGRhdGU6dH0pLHRoaXMub3B0aW9uc1tuKyJzIl1bZV09dCk6dGhpcy5vcHRpb25zW24rInMiXVtlXX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoSG4ucHJvdG90eXBlLCIkaXNTZXJ2ZXIiLHtnZXQ6bmV9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoSG4ucHJvdG90eXBlLCIkc3NyQ29udGV4dCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiR2bm9kZSYmdGhpcy4kdm5vZGUuc3NyQ29udGV4dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoSG4sIkZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0Iix7dmFsdWU6R3R9KSxIbi52ZXJzaW9uPSIyLjYuMTEiO3ZhciBycj0xO2Z1bmN0aW9uIGlyKCl7cmV0dXJuKHJyKyspLnRvU3RyaW5nKCl9dmFyIG9yPWZ1bmN0aW9uKCl7dGhpcy5ub2RlSWQ9aXIoKSx0aGlzLnJlZj10aGlzLm5vZGVJZCx0aGlzLmNoaWxkcmVuPVtdLHRoaXMucHVyZUNoaWxkcmVuPVtdLHRoaXMucGFyZW50Tm9kZT1udWxsLHRoaXMubmV4dFNpYmxpbmc9bnVsbCx0aGlzLnByZXZpb3VzU2libGluZz1udWxsfTtvci5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuXyR2ZCYmdGhpcy5fJHZkLnJlbW92ZUVsZW1lbnQodGhpcyksdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuZGVzdHJveSgpfSl9O3ZhciBhcj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3QuY2FsbCh0aGlzKSx0aGlzLm5vZGVUeXBlPTgsdGhpcy5ub2RlSWQ9aXIoKSx0aGlzLnJlZj10aGlzLm5vZGVJZCx0aGlzLnR5cGU9ImNvbW1lbnQiLHRoaXMudmFsdWU9ZSx0aGlzLmNoaWxkcmVuPVtdLHRoaXMucHVyZUNoaWxkcmVuPVtdfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksKChlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSkuY29uc3RydWN0b3I9ZSkucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIlx4M2MhLS0gIit0aGlzLnZhbHVlKyIgLS1ceDNlIn0sZX0ob3IpO2Z1bmN0aW9uIHNyKGUsdCxuKXt2YXIgcj1lLmRvY3VtZW50RWxlbWVudDtpZighKDA8ci5wdXJlQ2hpbGRyZW4ubGVuZ3RoJiYxPT09dC5ub2RlVHlwZXx8dC5wYXJlbnROb2RlKSl7dmFyIGk9ci5jaGlsZHJlbixvPWkuaW5kZXhPZihuKTtvPDA/aS5wdXNoKHQpOmkuc3BsaWNlKG8sMCx0KSwxPT09dC5ub2RlVHlwZT8oImJvZHkiPT09dC5yb2xlPyh0LmRvY0lkPWUuaWQsdC5vd25lckRvY3VtZW50PWUsdC5wYXJlbnROb2RlPXIpOih0LmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5wYXJlbnROb2RlPXR9KSxjcihlLHQpLHQuZG9jSWQ9ZS5pZCx0Lm93bmVyRG9jdW1lbnQ9ZSksdXIodCxyKSxyLnB1cmVDaGlsZHJlbi5wdXNoKHQpKTp0LnBhcmVudE5vZGU9cn19ZnVuY3Rpb24gY3IoZSx0KXt0LnJvbGU9ImJvZHkiLHQuZGVwdGg9MSx0LnJlZj0iX3Jvb3QiLGUuYm9keT10fWZ1bmN0aW9uIHVyKHQsZSl7KHQucGFyZW50Tm9kZT1lKS5kb2NJZCYmKHQuZG9jSWQ9ZS5kb2NJZCx0Lm93bmVyRG9jdW1lbnQ9ZS5vd25lckRvY3VtZW50LHQuZGVwdGg9ZS5kZXB0aCsxKSx0LmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oZSl7dXIoZSx0KX0pfWZ1bmN0aW9uIGxyKGUpe2Zvcig7ZTspe2lmKDE9PT1lLm5vZGVUeXBlKXJldHVybiBlO2U9ZS5uZXh0U2libGluZ319ZnVuY3Rpb24gZHIoZSl7Zm9yKDtlOyl7aWYoMT09PWUubm9kZVR5cGUpcmV0dXJuIGU7ZT1lLnByZXZpb3VzU2libGluZ319ZnVuY3Rpb24gZnIoZSx0LG4scil7bjwwJiYobj0wKTt2YXIgaT10W24tMV0sbz10W25dO3JldHVybiB0LnNwbGljZShuLDAsZSksciYmKGkmJihpLm5leHRTaWJsaW5nPWUpLGUucHJldmlvdXNTaWJsaW5nPWksKGUubmV4dFNpYmxpbmc9bykmJihvLnByZXZpb3VzU2libGluZz1lKSksbn1mdW5jdGlvbiBwcihlLHQsbixyKXt2YXIgaT10LmluZGV4T2YoZSk7aWYoaTwwKXJldHVybi0xO2lmKHIpe3ZhciBvPXRbaS0xXSxhPXRbaSsxXTtvJiYoby5uZXh0U2libGluZz1hKSxhJiYoYS5wcmV2aW91c1NpYmxpbmc9byl9dC5zcGxpY2UoaSwxKTt2YXIgcz1uO2k8PW4mJihzPW4tMSk7dmFyIGM9dFtzLTFdLHU9dFtzXTtyZXR1cm4gdC5zcGxpY2UocywwLGUpLHImJihjJiYoYy5uZXh0U2libGluZz1lKSxlLnByZXZpb3VzU2libGluZz1jLChlLm5leHRTaWJsaW5nPXUpJiYodS5wcmV2aW91c1NpYmxpbmc9ZSkpLGk9PT1zPy0xOm59ZnVuY3Rpb24gaHIoZSx0LG4pe3ZhciByPXQuaW5kZXhPZihlKTtpZighKHI8MCkpe2lmKG4pe3ZhciBpPXRbci0xXSxvPXRbcisxXTtpJiYoaS5uZXh0U2libGluZz1vKSxvJiYoby5wcmV2aW91c1NpYmxpbmc9aSl9dC5zcGxpY2UociwxKX19dmFyIHZyPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dm9pZCAwPT09ZSYmKGU9InZpZXciKSx0LmNhbGwodGhpcyksdGhpcy5ub2RlVHlwZT0xLHRoaXMubm9kZUlkPWlyKCksdGhpcy5yZWY9dGhpcy5ub2RlSWQsdGhpcy50eXBlPWUsdGhpcy5hdHRyPXt9LHRoaXMuZXZlbnRzPXt9LHRoaXMuY2hpbGRyZW49W10sdGhpcy5wdXJlQ2hpbGRyZW49W119cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSwoKGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1lKS5wcm90b3R5cGUuc2V0QXR0cmlidXRlPWZ1bmN0aW9uKGUsdCl7ImNpZCI9PT1lP3RoaXMuY2lkPXQ6Im5pZCI9PT1lJiYodGhpcy5uaWQ9dCl9LGUucHJvdG90eXBlLmRpc3BhdGNoRXZlbnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmV2ZW50c1tlXTtuJiZuLmZvckVhY2goZnVuY3Rpb24oZSl7ZSh0KX0pfSxlLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7aWYoIiI9PT10aGlzLmNpZHx8IiI9PT10aGlzLm5pZClyZXR1cm4gY29uc29sZS5lcnJvcigiY2lkPSIrdGhpcy5jaWQrIixuaWQ9Iit0aGlzLm5pZCsiIGFkZEV2ZW50TGlzdGVuZXIoIitlKyIpIG5vdCBmb3VuZCIpOyh0aGlzLmV2ZW50c1tlXXx8KHRoaXMuZXZlbnRzW2VdPVtdKSkucHVzaCh0KSx0aGlzLl8kdmQuYWRkRWxlbWVudCh0aGlzKX0sZS5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7aWYoIiI9PT10aGlzLmNpZHx8IiI9PT10aGlzLm5pZClyZXR1cm4gY29uc29sZS5lcnJvcigiY2lkPSIrdGhpcy5jaWQrIixuaWQ9Iit0aGlzLm5pZCsiIHJlbW92ZUV2ZW50TGlzdGVuZXIoIitlKyIpIG5vdCBmb3VuZCIpO3ZhciByPSExO2lmKHRoaXMuZXZlbnRzW2VdKXt2YXIgaT10aGlzLmV2ZW50c1tlXS5pbmRleE9mKHQpOy0xIT09aSYmKHRoaXMuZXZlbnRzW2VdLnNwbGljZShpLDEpLHI9ITApfXJ8fGNvbnNvbGUuZXJyb3IoImNpZD0iK3RoaXMuY2lkKyIsbmlkPSIrdGhpcy5uaWQrIiByZW1vdmVFdmVudExpc3RlbmVyKCIrZSsiKSBoYW5kbGVyIG5vdCBmb3VuZCIpLE9iamVjdC5rZXlzKHRoaXMuZXZlbnRzKS5ldmVyeShmdW5jdGlvbihlKXtyZXR1cm4gMD09PW4uZXZlbnRzW2VdLmxlbmd0aH0pJiZ0aGlzLl8kdmQucmVtb3ZlRWxlbWVudCh0aGlzKX0sZS5wcm90b3R5cGUuYXBwZW5kQ2hpbGQ9ZnVuY3Rpb24oZSl7ZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUhPT10aGlzfHwoZS5wYXJlbnROb2RlPyhwcihlLHRoaXMuY2hpbGRyZW4sdGhpcy5jaGlsZHJlbi5sZW5ndGgsITApLDE9PT1lLm5vZGVUeXBlJiZwcihlLHRoaXMucHVyZUNoaWxkcmVuLHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCkpOih1cihlLHRoaXMpLGZyKGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmxlbmd0aCwhMCksMT09PWUubm9kZVR5cGUmJmZyKGUsdGhpcy5wdXJlQ2hpbGRyZW4sdGhpcy5wdXJlQ2hpbGRyZW4ubGVuZ3RoKSkpfSxlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmU9ZnVuY3Rpb24oZSx0KXtpZighKGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlIT09dGhpc3x8ZT09PXR8fGUubmV4dFNpYmxpbmcmJmUubmV4dFNpYmxpbmc9PT10KSlpZihlLnBhcmVudE5vZGUpe2lmKHByKGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmluZGV4T2YodCksITApLDE9PT1lLm5vZGVUeXBlKXt2YXIgbj1scih0KTtwcihlLHRoaXMucHVyZUNoaWxkcmVuLG4/dGhpcy5wdXJlQ2hpbGRyZW4uaW5kZXhPZihuKTp0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgpfX1lbHNlIGlmKHVyKGUsdGhpcyksZnIoZSx0aGlzLmNoaWxkcmVuLHRoaXMuY2hpbGRyZW4uaW5kZXhPZih0KSwhMCksMT09PWUubm9kZVR5cGUpe3ZhciByPWxyKHQpO2ZyKGUsdGhpcy5wdXJlQ2hpbGRyZW4scj90aGlzLnB1cmVDaGlsZHJlbi5pbmRleE9mKHIpOnRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCl9fSxlLnByb3RvdHlwZS5pbnNlcnRBZnRlcj1mdW5jdGlvbihlLHQpe2UucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlIT09dGhpc3x8ZT09PXR8fGUucHJldmlvdXNTaWJsaW5nJiZlLnByZXZpb3VzU2libGluZz09PXR8fChlLnBhcmVudE5vZGU/KHByKGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmluZGV4T2YodCkrMSwhMCksMT09PWUubm9kZVR5cGUmJnByKGUsdGhpcy5wdXJlQ2hpbGRyZW4sdGhpcy5wdXJlQ2hpbGRyZW4uaW5kZXhPZihkcih0KSkrMSkpOih1cihlLHRoaXMpLGZyKGUsdGhpcy5jaGlsZHJlbix0aGlzLmNoaWxkcmVuLmluZGV4T2YodCkrMSwhMCksMT09PWUubm9kZVR5cGUmJmZyKGUsdGhpcy5wdXJlQ2hpbGRyZW4sdGhpcy5wdXJlQ2hpbGRyZW4uaW5kZXhPZihkcih0KSkrMSkpKX0sZS5wcm90b3R5cGUucmVtb3ZlQ2hpbGQ9ZnVuY3Rpb24oZSx0KXtlLnBhcmVudE5vZGUmJihocihlLHRoaXMuY2hpbGRyZW4sITApLDE9PT1lLm5vZGVUeXBlJiZocihlLHRoaXMucHVyZUNoaWxkcmVuKSksdHx8ZS5kZXN0cm95KCl9LGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuZGVzdHJveSgpfSksdGhpcy5jaGlsZHJlbi5sZW5ndGg9MCx0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGg9MH0sZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iPCIrdGhpcy50eXBlKyIgYXR0cj0iK0pTT04uc3RyaW5naWZ5KHRoaXMuYXR0cikrIiBzdHlsZT0iK0pTT04uc3RyaW5naWZ5KHRoaXMudG9TdHlsZSgpKSsiPiIrdGhpcy5wdXJlQ2hpbGRyZW4ubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRvU3RyaW5nKCl9KS5qb2luKCIiKSsiPC8iK3RoaXMudHlwZSsiPiJ9LGV9KG9yKSxncj1mdW5jdGlvbihlLHQpe3RoaXMuaWQ9ZT9lLnRvU3RyaW5nKCk6IiIsdGhpcy5VUkw9dCx0aGlzLmNyZWF0ZURvY3VtZW50RWxlbWVudCgpfTtnci5wcm90b3R5cGUuY3JlYXRlRG9jdW1lbnRFbGVtZW50PWZ1bmN0aW9uKCl7dmFyIG49dGhpcztpZighdGhpcy5kb2N1bWVudEVsZW1lbnQpe3ZhciBlPW5ldyB2cigiZG9jdW1lbnQiKTtlLmRvY0lkPXRoaXMuaWQsZS5vd25lckRvY3VtZW50PXRoaXMsZS5yb2xlPSJkb2N1bWVudEVsZW1lbnQiLGUuZGVwdGg9MCxlLnJlZj0iX2RvY3VtZW50RWxlbWVudCIsdGhpcy5kb2N1bWVudEVsZW1lbnQ9ZSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiYXBwZW5kQ2hpbGQiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpmdW5jdGlvbihlKXtzcihuLGUpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJpbnNlcnRCZWZvcmUiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpmdW5jdGlvbihlLHQpe3NyKG4sZSx0KX19KX1yZXR1cm4gdGhpcy5kb2N1bWVudEVsZW1lbnR9LGdyLnByb3RvdHlwZS5jcmVhdGVCb2R5PWZ1bmN0aW9uKGUpe3RoaXMuYm9keXx8Y3IodGhpcyxuZXcgdnIoZSkpO3JldHVybiB0aGlzLmJvZHl9LGdyLnByb3RvdHlwZS5jcmVhdGVFbGVtZW50PWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdnIoZSl9LGdyLnByb3RvdHlwZS5jcmVhdGVDb21tZW50PWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgYXIoZSl9LGdyLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7fTt2YXIgbXI9cygic3R5bGUsY2xhc3MiKSx5cj0ocygiaW5wdXQsdGV4dGFyZWEsb3B0aW9uLHNlbGVjdCxwcm9ncmVzcyIpLHMoImNvbnRlbnRlZGl0YWJsZSxkcmFnZ2FibGUsc3BlbGxjaGVjayIpLHMoImV2ZW50cyxjYXJldCx0eXBpbmcscGxhaW50ZXh0LW9ubHkiKSxzKCJhbGxvd2Z1bGxzY3JlZW4sYXN5bmMsYXV0b2ZvY3VzLGF1dG9wbGF5LGNoZWNrZWQsY29tcGFjdCxjb250cm9scyxkZWNsYXJlLGRlZmF1bHQsZGVmYXVsdGNoZWNrZWQsZGVmYXVsdG11dGVkLGRlZmF1bHRzZWxlY3RlZCxkZWZlcixkaXNhYmxlZCxlbmFibGVkLGZvcm1ub3ZhbGlkYXRlLGhpZGRlbixpbmRldGVybWluYXRlLGluZXJ0LGlzbWFwLGl0ZW1zY29wZSxsb29wLG11bHRpcGxlLG11dGVkLG5vaHJlZixub3Jlc2l6ZSxub3NoYWRlLG5vdmFsaWRhdGUsbm93cmFwLG9wZW4scGF1c2VvbmV4aXQscmVhZG9ubHkscmVxdWlyZWQscmV2ZXJzZWQsc2NvcGVkLHNlYW1sZXNzLHNlbGVjdGVkLHNvcnRhYmxlLHRyYW5zbGF0ZSx0cnVlc3BlZWQsdHlwZW11c3RtYXRjaCx2aXNpYmxlIikscygiaHRtbCxib2R5LGJhc2UsaGVhZCxsaW5rLG1ldGEsc3R5bGUsdGl0bGUsYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGZvb3RlcixoZWFkZXIsaDEsaDIsaDMsaDQsaDUsaDYsaGdyb3VwLG5hdixzZWN0aW9uLGRpdixkZCxkbCxkdCxmaWdjYXB0aW9uLGZpZ3VyZSxwaWN0dXJlLGhyLGltZyxsaSxtYWluLG9sLHAscHJlLHVsLGEsYixhYmJyLGJkaSxiZG8sYnIsY2l0ZSxjb2RlLGRhdGEsZGZuLGVtLGksa2JkLG1hcmsscSxycCxydCxydGMscnVieSxzLHNhbXAsc21hbGwsc3BhbixzdHJvbmcsc3ViLHN1cCx0aW1lLHUsdmFyLHdicixhcmVhLGF1ZGlvLG1hcCx0cmFjayx2aWRlbyxlbWJlZCxvYmplY3QscGFyYW0sc291cmNlLGNhbnZhcyxzY3JpcHQsbm9zY3JpcHQsZGVsLGlucyxjYXB0aW9uLGNvbCxjb2xncm91cCx0YWJsZSx0aGVhZCx0Ym9keSx0ZCx0aCx0cixidXR0b24sZGF0YWxpc3QsZmllbGRzZXQsZm9ybSxpbnB1dCxsYWJlbCxsZWdlbmQsbWV0ZXIsb3B0Z3JvdXAsb3B0aW9uLG91dHB1dCxwcm9ncmVzcyxzZWxlY3QsdGV4dGFyZWEsZGV0YWlscyxkaWFsb2csbWVudSxtZW51aXRlbSxzdW1tYXJ5LGNvbnRlbnQsZWxlbWVudCxzaGFkb3csdGVtcGxhdGUsYmxvY2txdW90ZSxpZnJhbWUsdGZvb3QiKSk7dmFyIF9yPU9iamVjdC5mcmVlemUoe2NyZWF0ZUVsZW1lbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyB2cihlKX0sY3JlYXRlRWxlbWVudE5TOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyB2cihlKyI6Iit0KX0sY3JlYXRlVGV4dE5vZGU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHZyKCJ0ZXh0Iil9LGNyZWF0ZUNvbW1lbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBhcihlKX0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKGUsdCxuKXtlLmluc2VydEJlZm9yZSh0LG4pfSxyZW1vdmVDaGlsZDpmdW5jdGlvbihlLHQpe2UucmVtb3ZlQ2hpbGQodCl9LGFwcGVuZENoaWxkOmZ1bmN0aW9uKGUsdCl7ZS5hcHBlbmRDaGlsZCh0KX0scGFyZW50Tm9kZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXJlbnROb2RlfSxuZXh0U2libGluZzpmdW5jdGlvbihlKXtyZXR1cm4gZS5uZXh0U2libGluZ30sdGFnTmFtZTpmdW5jdGlvbihlKXtyZXR1cm4gZS50eXBlfSxzZXRUZXh0Q29udGVudDpmdW5jdGlvbigpe30sc2V0U3R5bGVTY29wZTpmdW5jdGlvbigpe319KSxicj17Y3JlYXRlOmZ1bmN0aW9uKGUsdCl7d3IodCl9LHVwZGF0ZTpmdW5jdGlvbihlLHQpe2UuZGF0YS5yZWYhPT10LmRhdGEucmVmJiYod3IoZSwhMCksd3IodCkpfSxkZXN0cm95OmZ1bmN0aW9uKGUpe3dyKGUsITApfX07ZnVuY3Rpb24gd3IoZSx0KXt2YXIgbj1lLmRhdGEucmVmO2lmKEwobikpe3ZhciByPWUuY29udGV4dCxpPWUuY29tcG9uZW50SW5zdGFuY2V8fGUuZWxtLG89ci4kcmVmczt0P0FycmF5LmlzQXJyYXkob1tuXSk/YihvW25dLGkpOm9bbl09PT1pJiYob1tuXT12b2lkIDApOmUuZGF0YS5yZWZJbkZvcj9BcnJheS5pc0FycmF5KG9bbl0pP29bbl0uaW5kZXhPZihpKTwwJiZvW25dLnB1c2goaSk6b1tuXT1baV06b1tuXT1pfX1zKCJodG1sLGJvZHksYmFzZSxoZWFkLGxpbmssbWV0YSxzdHlsZSx0aXRsZSxhZGRyZXNzLGFydGljbGUsYXNpZGUsZm9vdGVyLGhlYWRlcixoMSxoMixoMyxoNCxoNSxoNixoZ3JvdXAsbmF2LHNlY3Rpb24sZGl2LGRkLGRsLGR0LGZpZ2NhcHRpb24sZmlndXJlLHBpY3R1cmUsaHIsaW1nLGxpLG1haW4sb2wscCxwcmUsdWwsYSxiLGFiYnIsYmRpLGJkbyxicixjaXRlLGNvZGUsZGF0YSxkZm4sZW0saSxrYmQsbWFyayxxLHJwLHJ0LHJ0YyxydWJ5LHMsc2FtcCxzbWFsbCxzcGFuLHN0cm9uZyxzdWIsc3VwLHRpbWUsdSx2YXIsd2JyLGFyZWEsYXVkaW8sbWFwLHRyYWNrLHZpZGVvLGVtYmVkLG9iamVjdCxwYXJhbSxzb3VyY2UsY2FudmFzLHNjcmlwdCxub3NjcmlwdCxkZWwsaW5zLGNhcHRpb24sY29sLGNvbGdyb3VwLHRhYmxlLHRoZWFkLHRib2R5LHRkLHRoLHRyLGJ1dHRvbixkYXRhbGlzdCxmaWVsZHNldCxmb3JtLGlucHV0LGxhYmVsLGxlZ2VuZCxtZXRlcixvcHRncm91cCxvcHRpb24sb3V0cHV0LHByb2dyZXNzLHNlbGVjdCx0ZXh0YXJlYSxkZXRhaWxzLGRpYWxvZyxtZW51LG1lbnVpdGVtLHN1bW1hcnksY29udGVudCxlbGVtZW50LHNoYWRvdyx0ZW1wbGF0ZSxibG9ja3F1b3RlLGlmcmFtZSx0Zm9vdCIpLHMoInN2ZyxhbmltYXRlLGNpcmNsZSxjbGlwcGF0aCxjdXJzb3IsZGVmcyxkZXNjLGVsbGlwc2UsZmlsdGVyLGZvbnQtZmFjZSxmb3JlaWduT2JqZWN0LGcsZ2x5cGgsaW1hZ2UsbGluZSxtYXJrZXIsbWFzayxtaXNzaW5nLWdseXBoLHBhdGgscGF0dGVybixwb2x5Z29uLHBvbHlsaW5lLHJlY3Qsc3dpdGNoLHN5bWJvbCx0ZXh0LHRleHRwYXRoLHRzcGFuLHVzZSx2aWV3IiwhMCk7dmFyIGtyPXMoInRleHQsbnVtYmVyLHBhc3N3b3JkLHNlYXJjaCxlbWFpbCx0ZWwsdXJsIiksU3I9bmV3IG1lKCIiLHt9LFtdKSx4cj1bImNyZWF0ZSIsImFjdGl2YXRlIiwidXBkYXRlIiwicmVtb3ZlIiwiZGVzdHJveSJdO2Z1bmN0aW9uIENyKGUsdCl7cmV0dXJuIGUua2V5PT09dC5rZXkmJihlLnRhZz09PXQudGFnJiZlLmlzQ29tbWVudD09PXQuaXNDb21tZW50JiZMKGUuZGF0YSk9PT1MKHQuZGF0YSkmJmZ1bmN0aW9uKGUsdCl7aWYoImlucHV0IiE9PWUudGFnKXJldHVybiEwO3ZhciBuLHI9TChuPWUuZGF0YSkmJkwobj1uLmF0dHJzKSYmbi50eXBlLGk9TChuPXQuZGF0YSkmJkwobj1uLmF0dHJzKSYmbi50eXBlO3JldHVybiByPT09aXx8a3IocikmJmtyKGkpfShlLHQpfHxOKGUuaXNBc3luY1BsYWNlaG9sZGVyKSYmZS5hc3luY0ZhY3Rvcnk9PT10LmFzeW5jRmFjdG9yeSYmaih0LmFzeW5jRmFjdG9yeS5lcnJvcikpfWZ1bmN0aW9uIFRyKGUsdCxuKXt2YXIgcixpLG89e307Zm9yKHI9dDtyPD1uOysrcilMKGk9ZVtyXS5rZXkpJiYob1tpXT1yKTtyZXR1cm4gb312YXIgT3I9e2NyZWF0ZTpFcix1cGRhdGU6RXIsZGVzdHJveTpmdW5jdGlvbihlKXtFcihlLFNyKX19O2Z1bmN0aW9uIEVyKGUsdCl7KGUuZGF0YS5kaXJlY3RpdmVzfHx0LmRhdGEuZGlyZWN0aXZlcykmJmZ1bmN0aW9uKHQsbil7dmFyIGUscixpLG89dD09PVNyLGE9bj09PVNyLHM9SXIodC5kYXRhLmRpcmVjdGl2ZXMsdC5jb250ZXh0KSxjPUlyKG4uZGF0YS5kaXJlY3RpdmVzLG4uY29udGV4dCksdT1bXSxsPVtdO2ZvcihlIGluIGMpcj1zW2VdLGk9Y1tlXSxyPyhpLm9sZFZhbHVlPXIudmFsdWUsaS5vbGRBcmc9ci5hcmcsJHIoaSwidXBkYXRlIixuLHQpLGkuZGVmJiZpLmRlZi5jb21wb25lbnRVcGRhdGVkJiZsLnB1c2goaSkpOigkcihpLCJiaW5kIixuLHQpLGkuZGVmJiZpLmRlZi5pbnNlcnRlZCYmdS5wdXNoKGkpKTtpZih1Lmxlbmd0aCl7dmFyIGQ9ZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPHUubGVuZ3RoO2UrKykkcih1W2VdLCJpbnNlcnRlZCIsbix0KX07bz93dChuLCJpbnNlcnQiLGQpOmQoKX1sLmxlbmd0aCYmd3QobiwicG9zdHBhdGNoIixmdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8bC5sZW5ndGg7ZSsrKSRyKGxbZV0sImNvbXBvbmVudFVwZGF0ZWQiLG4sdCl9KTtpZighbylmb3IoZSBpbiBzKWNbZV18fCRyKHNbZV0sInVuYmluZCIsdCx0LGEpfShlLHQpfXZhciBBcj1PYmplY3QuY3JlYXRlKG51bGwpO2Z1bmN0aW9uIElyKGUsdCl7dmFyIG4scixpLG89T2JqZWN0LmNyZWF0ZShudWxsKTtpZighZSlyZXR1cm4gbztmb3Iobj0wO248ZS5sZW5ndGg7bisrKShyPWVbbl0pLm1vZGlmaWVyc3x8KHIubW9kaWZpZXJzPUFyKSwob1soaT1yLGkucmF3TmFtZXx8aS5uYW1lKyIuIitPYmplY3Qua2V5cyhpLm1vZGlmaWVyc3x8e30pLmpvaW4oIi4iKSldPXIpLmRlZj16ZSh0LiRvcHRpb25zLCJkaXJlY3RpdmVzIixyLm5hbWUsITApO3JldHVybiBvfWZ1bmN0aW9uICRyKHQsbixyLGUsaSl7dmFyIG89dC5kZWYmJnQuZGVmW25dO2lmKG8pdHJ5e28oci5lbG0sdCxyLGUsaSl9Y2F0Y2goZSl7SmUoZSxyLmNvbnRleHQsImRpcmVjdGl2ZSAiK3QubmFtZSsiICIrbisiIGhvb2siKX19ZnVuY3Rpb24gUHIoZSxuKXtpZighaihlLmRhdGEud3hzUHJvcHMpfHwhaihuLmRhdGEud3hzUHJvcHMpKXt2YXIgcj1lLiR3eHNXYXRjaGVzLHQ9T2JqZWN0LmtleXMobi5kYXRhLnd4c1Byb3BzKTtpZihyfHx0Lmxlbmd0aCl7cnx8KHI9e30pO3ZhciBpPW4uZGF0YS53eHNQcm9wcztuLiR3eHNXYXRjaGVzPXt9LE9iamVjdC5rZXlzKGkpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9aVtlXTtuLiR3eHNXYXRjaGVzW2VdPXJbZV18fG4uY29udGV4dC4kd2F0Y2godCxmdW5jdGlvbigpe3RoaXMuJGZvcmNlVXBkYXRlKCl9LHtpbW1lZGlhdGU6ITAsZGVlcDohMH0pfSksT2JqZWN0LmtleXMocikuZm9yRWFjaChmdW5jdGlvbihlKXtuLiR3eHNXYXRjaGVzW2VdfHwocltlXSgpLGRlbGV0ZSByW2VdKX0pfX19ZnVuY3Rpb24gTXIoZSx0KXt2YXIgbj10LmRhdGEuYXR0cnM7aWYoIWoobikmJiFqKG4uX2kpKXt2YXIgcixpLG89dC5lbG07by5kYXRhc2V0PU9iamVjdC5hc3NpZ24oby5kYXRhc2V0fHx7fSwocj1uLGk9T2JqZWN0LmNyZWF0ZShudWxsKSxPYmplY3Qua2V5cyhyKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKDA9PT10LmluZGV4T2YoImRhdGEtIikpe3ZhciBuPWcodC5yZXBsYWNlKCJkYXRhLSIsIiIpKTt0cnl7aVtuXT1KU09OLnBhcnNlKHJbdF0pfWNhdGNoKGUpe2lbbl09clt0XX19fSksaSkpfX12YXIganIsTHI9Il9fciIsTnI9Il9fYyI7ZnVuY3Rpb24gQnIodCxuLHIpe3ZhciBpPWpyO3JldHVybiBmdW5jdGlvbiBlKCl7bnVsbCE9PW4uYXBwbHkobnVsbCxhcmd1bWVudHMpJiZScih0LGUscixpKX19ZnVuY3Rpb24gRHIoZSx0KXtqci5hZGRFdmVudExpc3RlbmVyKGUsdCl9ZnVuY3Rpb24gUnIoZSx0LG4scil7dCYmKHJ8fGpyKS5yZW1vdmVFdmVudExpc3RlbmVyKGUsdC5fd3JhcHBlcnx8dCl9ZnVuY3Rpb24gRnIoZSx0KXtpZighaihlLmRhdGEub24pfHwhaih0LmRhdGEub24pKXt2YXIgbj10LmRhdGEub258fHt9LHI9ZS5kYXRhLm9ufHx7fTsoanI9dC5lbG0pLl8kdmQ9dC5jb250ZXh0Ll8kdmQ7Zm9yKHZhciBpPXQuY29udGV4dCxvPSh0LmRhdGEuYXR0cnN8fHt9KS5faSxhPXQucGFyZW50O2EmJmEuY29tcG9uZW50SW5zdGFuY2U7KXt2YXIgcz1hLmNvbXBvbmVudEluc3RhbmNlLiRhdHRycyYmYS5jb21wb25lbnRJbnN0YW5jZS4kYXR0cnMuX2k7TChzKSYmKG89InItIitzKSxhPWEucGFyZW50fWpyLnNldEF0dHJpYnV0ZSgibmlkIixTdHJpbmcobykpLGpyLnNldEF0dHJpYnV0ZSgiY2lkIixpLl8kaWQpLGZ1bmN0aW9uKGUpe0woZVtMcl0pJiYoZS5pbnB1dD1bXS5jb25jYXQoZVtMcl0sZS5pbnB1dHx8W10pLGRlbGV0ZSBlW0xyXSk7TChlW05yXSkmJihlLmNoYW5nZT1bXS5jb25jYXQoZVtOcl0sZS5jaGFuZ2V8fFtdKSxkZWxldGUgZVtOcl0pfShuKSxidChuLHIsRHIsUnIsQnIsdC5jb250ZXh0KSxqcj12b2lkIDB9fXZhciB6cj1mdW5jdGlvbihlKXt2YXIgcix0LGc9e30sbj1lLm1vZHVsZXMsbT1lLm5vZGVPcHM7Zm9yKHI9MDtyPHhyLmxlbmd0aDsrK3IpZm9yKGdbeHJbcl1dPVtdLHQ9MDt0PG4ubGVuZ3RoOysrdClMKG5bdF1beHJbcl1dKSYmZ1t4cltyXV0ucHVzaChuW3RdW3hyW3JdXSk7ZnVuY3Rpb24gbyhlKXt2YXIgdD1tLnBhcmVudE5vZGUoZSk7TCh0KSYmbS5yZW1vdmVDaGlsZCh0LGUpfWZ1bmN0aW9uIHkodCxlKXtyZXR1cm4hZSYmIXQubnMmJiEoei5pZ25vcmVkRWxlbWVudHMubGVuZ3RoJiZ6Lmlnbm9yZWRFbGVtZW50cy5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiBpKGUpP2UudGVzdCh0LnRhZyk6ZT09PXQudGFnfSkpJiZ6LmlzVW5rbm93bkVsZW1lbnQodC50YWcpfXZhciBsPTA7ZnVuY3Rpb24gXyhlLHQsbixyLGksbyxhKXtpZihMKGUuZWxtKSYmTChvKSYmKGU9b1thXT13ZShlKSksZS5pc1Jvb3RJbnNlcnQ9IWksIWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPWUuZGF0YTtpZihMKGkpKXt2YXIgbz1MKGUuY29tcG9uZW50SW5zdGFuY2UpJiZpLmtlZXBBbGl2ZTtpZihMKGk9aS5ob29rKSYmTChpPWkuaW5pdCkmJmkoZSwhMSksTChlLmNvbXBvbmVudEluc3RhbmNlKSlyZXR1cm4gYihlLHQpLGQobixlLmVsbSxyKSxOKG8pJiZmdW5jdGlvbihlLHQsbixyKXtmb3IodmFyIGksbz1lO28uY29tcG9uZW50SW5zdGFuY2U7KWlmKG89by5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUsTChpPW8uZGF0YSkmJkwoaT1pLnRyYW5zaXRpb24pKXtmb3IoaT0wO2k8Zy5hY3RpdmF0ZS5sZW5ndGg7KytpKWcuYWN0aXZhdGVbaV0oU3Isbyk7dC5wdXNoKG8pO2JyZWFrfWQobixlLmVsbSxyKX0oZSx0LG4sciksITB9fShlLHQsbixyKSl7dmFyIHM9ZS5kYXRhLGM9ZS5jaGlsZHJlbix1PWUudGFnO0wodSk/KHMmJnMucHJlJiZsKysseShlLGwpJiZzZSgiVW5rbm93biBjdXN0b20gZWxlbWVudDogPCIrdSsnPiAtIGRpZCB5b3UgcmVnaXN0ZXIgdGhlIGNvbXBvbmVudCBjb3JyZWN0bHk/IEZvciByZWN1cnNpdmUgY29tcG9uZW50cywgbWFrZSBzdXJlIHRvIHByb3ZpZGUgdGhlICJuYW1lIiBvcHRpb24uJyxlLmNvbnRleHQpLGUuZWxtPWUubnM/bS5jcmVhdGVFbGVtZW50TlMoZS5ucyx1KTptLmNyZWF0ZUVsZW1lbnQodSxlKSxmKGUpLHcoZSxjLHQpLEwocykmJlMoZSx0KSxkKG4sZS5lbG0scikscyYmcy5wcmUmJmwtLSk6KE4oZS5pc0NvbW1lbnQpP2UuZWxtPW0uY3JlYXRlQ29tbWVudChlLnRleHQpOmUuZWxtPW0uY3JlYXRlVGV4dE5vZGUoZS50ZXh0KSxkKG4sZS5lbG0scikpfX1mdW5jdGlvbiBiKGUsdCl7TChlLmRhdGEucGVuZGluZ0luc2VydCkmJih0LnB1c2guYXBwbHkodCxlLmRhdGEucGVuZGluZ0luc2VydCksZS5kYXRhLnBlbmRpbmdJbnNlcnQ9bnVsbCksZS5lbG09ZS5jb21wb25lbnRJbnN0YW5jZS4kZWwsayhlKT8oUyhlLHQpLGYoZSkpOih3cihlKSx0LnB1c2goZSkpfWZ1bmN0aW9uIGQoZSx0LG4pe0woZSkmJihMKG4pP20ucGFyZW50Tm9kZShuKT09PWUmJm0uaW5zZXJ0QmVmb3JlKGUsdCxuKTptLmFwcGVuZENoaWxkKGUsdCkpfWZ1bmN0aW9uIHcoZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkodCkpe08odCk7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDsrK3IpXyh0W3JdLG4sZS5lbG0sbnVsbCwhMCx0LHIpfWVsc2UgYyhlLnRleHQpJiZtLmFwcGVuZENoaWxkKGUuZWxtLG0uY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGUudGV4dCkpKX1mdW5jdGlvbiBrKGUpe2Zvcig7ZS5jb21wb25lbnRJbnN0YW5jZTspZT1lLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTtyZXR1cm4gTChlLnRhZyl9ZnVuY3Rpb24gUyhlLHQpe2Zvcih2YXIgbj0wO248Zy5jcmVhdGUubGVuZ3RoOysrbilnLmNyZWF0ZVtuXShTcixlKTtMKHI9ZS5kYXRhLmhvb2spJiYoTChyLmNyZWF0ZSkmJnIuY3JlYXRlKFNyLGUpLEwoci5pbnNlcnQpJiZ0LnB1c2goZSkpfWZ1bmN0aW9uIGYoZSl7dmFyIHQ7aWYoTCh0PWUuZm5TY29wZUlkKSltLnNldFN0eWxlU2NvcGUoZS5lbG0sdCk7ZWxzZSBmb3IodmFyIG49ZTtuOylMKHQ9bi5jb250ZXh0KSYmTCh0PXQuJG9wdGlvbnMuX3Njb3BlSWQpJiZtLnNldFN0eWxlU2NvcGUoZS5lbG0sdCksbj1uLnBhcmVudDtMKHQ9ZG4pJiZ0IT09ZS5jb250ZXh0JiZ0IT09ZS5mbkNvbnRleHQmJkwodD10LiRvcHRpb25zLl9zY29wZUlkKSYmbS5zZXRTdHlsZVNjb3BlKGUuZWxtLHQpfWZ1bmN0aW9uIHgoZSx0LG4scixpLG8pe2Zvcig7cjw9aTsrK3IpXyhuW3JdLG8sZSx0LCExLG4scil9ZnVuY3Rpb24gQyhlKXt2YXIgdCxuLHI9ZS5kYXRhO2lmKEwocikpZm9yKEwodD1yLmhvb2spJiZMKHQ9dC5kZXN0cm95KSYmdChlKSx0PTA7dDxnLmRlc3Ryb3kubGVuZ3RoOysrdClnLmRlc3Ryb3lbdF0oZSk7aWYoTCh0PWUuY2hpbGRyZW4pKWZvcihuPTA7bjxlLmNoaWxkcmVuLmxlbmd0aDsrK24pQyhlLmNoaWxkcmVuW25dKX1mdW5jdGlvbiBUKGUsdCxuKXtmb3IoO3Q8PW47Kyt0KXt2YXIgcj1lW3RdO0wocikmJihMKHIudGFnKT8oYShyKSxDKHIpKTpvKHIuZWxtKSl9fWZ1bmN0aW9uIGEoZSx0KXtpZihMKHQpfHxMKGUuZGF0YSkpe3ZhciBuLHIsaT1nLnJlbW92ZS5sZW5ndGgrMTtpZihMKHQpP3QubGlzdGVuZXJzKz1pOnQ9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKCl7MD09LS1uLmxpc3RlbmVycyYmbyhlKX1yZXR1cm4gbi5saXN0ZW5lcnM9dCxufShlLmVsbSxpKSxMKG49ZS5jb21wb25lbnRJbnN0YW5jZSkmJkwobj1uLl92bm9kZSkmJkwobi5kYXRhKSlhKG4sdCk7ZWxzZSBpZihMKHI9ZS5jaGlsZHJlbikpZm9yKG49MDtuPHIubGVuZ3RoO24rKylyW25dLnRhZyYmYShyW25dKTtmb3Iobj0wO248Zy5yZW1vdmUubGVuZ3RoOysrbilnLnJlbW92ZVtuXShlLHQpO0wobj1lLmRhdGEuaG9vaykmJkwobj1uLnJlbW92ZSk/bihlLHQpOnQoKX1lbHNlIG8oZS5lbG0pfWZ1bmN0aW9uIE8oZSl7Zm9yKHZhciB0PXt9LG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXSxpPXIua2V5O0woaSkmJih0W2ldP3NlKCJEdXBsaWNhdGUga2V5cyBkZXRlY3RlZDogJyIraSsiJy4gVGhpcyBtYXkgY2F1c2UgYW4gdXBkYXRlIGVycm9yLiIsci5jb250ZXh0KTp0W2ldPSEwKX19ZnVuY3Rpb24gRShlLHQsbixyKXtmb3IodmFyIGk9bjtpPHI7aSsrKXt2YXIgbz10W2ldO2lmKEwobykmJkNyKGUsbykpcmV0dXJuIGl9fWZ1bmN0aW9uIEEoZSx0LG4scixpLG8pe2lmKGUhPT10KXtMKHQuZWxtKSYmTChyKSYmKHQ9cltpXT13ZSh0KSk7dmFyIGE9dC5lbG09ZS5lbG07aWYoTihlLmlzQXN5bmNQbGFjZWhvbGRlcikpTCh0LmFzeW5jRmFjdG9yeS5yZXNvbHZlZCk/TShlLmVsbSx0LG4pOnQuaXNBc3luY1BsYWNlaG9sZGVyPSEwO2Vsc2UgaWYoTih0LmlzU3RhdGljKSYmTihlLmlzU3RhdGljKSYmdC5rZXk9PT1lLmtleSYmKE4odC5pc0Nsb25lZCl8fE4odC5pc09uY2UpKSl0LmNvbXBvbmVudEluc3RhbmNlPWUuY29tcG9uZW50SW5zdGFuY2U7ZWxzZXt2YXIgcyxjPXQuZGF0YTtMKGMpJiZMKHM9Yy5ob29rKSYmTChzPXMucHJlcGF0Y2gpJiZzKGUsdCk7dmFyIHU9ZS5jaGlsZHJlbixsPXQuY2hpbGRyZW47aWYoTChjKSYmayh0KSl7Zm9yKHM9MDtzPGcudXBkYXRlLmxlbmd0aDsrK3MpZy51cGRhdGVbc10oZSx0KTtMKHM9Yy5ob29rKSYmTChzPXMudXBkYXRlKSYmcyhlLHQpfWoodC50ZXh0KT9MKHUpJiZMKGwpP3UhPT1sJiZmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvLGEscyxjPTAsdT0wLGw9dC5sZW5ndGgtMSxkPXRbMF0sZj10W2xdLHA9bi5sZW5ndGgtMSxoPW5bMF0sdj1uW3BdLGc9IWk7Zm9yKE8obik7Yzw9bCYmdTw9cDspaihkKT9kPXRbKytjXTpqKGYpP2Y9dFstLWxdOkNyKGQsaCk/KEEoZCxoLHIsbix1KSxkPXRbKytjXSxoPW5bKyt1XSk6Q3IoZix2KT8oQShmLHYscixuLHApLGY9dFstLWxdLHY9blstLXBdKTpDcihkLHYpPyhBKGQsdixyLG4scCksZyYmbS5pbnNlcnRCZWZvcmUoZSxkLmVsbSxtLm5leHRTaWJsaW5nKGYuZWxtKSksZD10WysrY10sdj1uWy0tcF0pOihDcihmLGgpPyhBKGYsaCxyLG4sdSksZyYmbS5pbnNlcnRCZWZvcmUoZSxmLmVsbSxkLmVsbSksZj10Wy0tbF0pOihqKG8pJiYobz1Ucih0LGMsbCkpLGooYT1MKGgua2V5KT9vW2gua2V5XTpFKGgsdCxjLGwpKT9fKGgscixlLGQuZWxtLCExLG4sdSk6Q3Iocz10W2FdLGgpPyhBKHMsaCxyLG4sdSksdFthXT12b2lkIDAsZyYmbS5pbnNlcnRCZWZvcmUoZSxzLmVsbSxkLmVsbSkpOl8oaCxyLGUsZC5lbG0sITEsbix1KSksaD1uWysrdV0pO2w8Yz94KGUsaihuW3ArMV0pP251bGw6bltwKzFdLmVsbSxuLHUscCxyKTpwPHUmJlQodCxjLGwpfShhLHUsbCxuLG8pOkwobCk/KE8obCksTChlLnRleHQpJiZtLnNldFRleHRDb250ZW50KGEsIiIpLHgoYSxudWxsLGwsMCxsLmxlbmd0aC0xLG4pKTpMKHUpP1QodSwwLHUubGVuZ3RoLTEpOkwoZS50ZXh0KSYmbS5zZXRUZXh0Q29udGVudChhLCIiKTplLnRleHQhPT10LnRleHQmJm0uc2V0VGV4dENvbnRlbnQoYSx0LnRleHQpLEwoYykmJkwocz1jLmhvb2spJiZMKHM9cy5wb3N0cGF0Y2gpJiZzKGUsdCl9fX1mdW5jdGlvbiBJKGUsdCxuKXtpZihOKG4pJiZMKGUucGFyZW50KSllLnBhcmVudC5kYXRhLnBlbmRpbmdJbnNlcnQ9dDtlbHNlIGZvcih2YXIgcj0wO3I8dC5sZW5ndGg7KytyKXRbcl0uZGF0YS5ob29rLmluc2VydCh0W3JdKX12YXIgJD0hMSxQPXMoImF0dHJzLGNsYXNzLHN0YXRpY0NsYXNzLHN0YXRpY1N0eWxlLGtleSIpO2Z1bmN0aW9uIE0oZSx0LG4scil7dmFyIGksbyxhLHMsYz10LnRhZyx1PXQuZGF0YSxsPXQuY2hpbGRyZW47aWYocj1yfHx1JiZ1LnByZSx0LmVsbT1lLE4odC5pc0NvbW1lbnQpJiZMKHQuYXN5bmNGYWN0b3J5KSlyZXR1cm4gdC5pc0FzeW5jUGxhY2Vob2xkZXI9ITA7aWYobz1lLHM9ciwhKEwoKGE9dCkudGFnKT8wPT09YS50YWcuaW5kZXhPZigidnVlLWNvbXBvbmVudCIpfHwheShhLHMpJiZhLnRhZy50b0xvd2VyQ2FzZSgpPT09KG8udGFnTmFtZSYmby50YWdOYW1lLnRvTG93ZXJDYXNlKCkpOm8ubm9kZVR5cGU9PT0oYS5pc0NvbW1lbnQ/ODozKSkpcmV0dXJuITE7aWYoTCh1KSYmKEwoaT11Lmhvb2spJiZMKGk9aS5pbml0KSYmaSh0LCEwKSxMKGk9dC5jb21wb25lbnRJbnN0YW5jZSkpKXJldHVybiBiKHQsbiksITA7aWYoTChjKSl7aWYoTChsKSlpZihlLmhhc0NoaWxkTm9kZXMoKSlpZihMKGk9dSkmJkwoaT1pLmRvbVByb3BzKSYmTChpPWkuaW5uZXJIVE1MKSl7aWYoaSE9PWUuaW5uZXJIVE1MKXJldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgY29uc29sZXx8JHx8KCQ9ITAsY29uc29sZS53YXJuKCJQYXJlbnQ6ICIsZSksY29uc29sZS53YXJuKCJzZXJ2ZXIgaW5uZXJIVE1MOiAiLGkpLGNvbnNvbGUud2FybigiY2xpZW50IGlubmVySFRNTDogIixlLmlubmVySFRNTCkpLCExfWVsc2V7Zm9yKHZhciBkPSEwLGY9ZS5maXJzdENoaWxkLHA9MDtwPGwubGVuZ3RoO3ArKyl7aWYoIWZ8fCFNKGYsbFtwXSxuLHIpKXtkPSExO2JyZWFrfWY9Zi5uZXh0U2libGluZ31pZighZHx8ZilyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIGNvbnNvbGV8fCR8fCgkPSEwLGNvbnNvbGUud2FybigiUGFyZW50OiAiLGUpLGNvbnNvbGUud2FybigiTWlzbWF0Y2hpbmcgY2hpbGROb2RlcyB2cy4gVk5vZGVzOiAiLGUuY2hpbGROb2RlcyxsKSksITF9ZWxzZSB3KHQsbCxuKTtpZihMKHUpKXt2YXIgaD0hMTtmb3IodmFyIHYgaW4gdSlpZighUCh2KSl7aD0hMCxTKHQsbik7YnJlYWt9IWgmJnUuY2xhc3MmJmd0KHUuY2xhc3MpfX1lbHNlIGUuZGF0YSE9PXQudGV4dCYmKGUuZGF0YT10LnRleHQpO3JldHVybiEwfXJldHVybiBmdW5jdGlvbihlLHQsbixyKXtpZighaih0KSl7dmFyIGksbz0hMSxhPVtdO2lmKGooZSkpbz0hMCxfKHQsYSk7ZWxzZXt2YXIgcz1MKGUubm9kZVR5cGUpO2lmKCFzJiZDcihlLHQpKUEoZSx0LGEsbnVsbCxudWxsLHIpO2Vsc2V7aWYocyl7aWYoMT09PWUubm9kZVR5cGUmJmUuaGFzQXR0cmlidXRlKEQpJiYoZS5yZW1vdmVBdHRyaWJ1dGUoRCksbj0hMCksTihuKSl7aWYoTShlLHQsYSkpcmV0dXJuIEkodCxhLCEwKSxlO3NlKCJUaGUgY2xpZW50LXNpZGUgcmVuZGVyZWQgdmlydHVhbCBET00gdHJlZSBpcyBub3QgbWF0Y2hpbmcgc2VydmVyLXJlbmRlcmVkIGNvbnRlbnQuIFRoaXMgaXMgbGlrZWx5IGNhdXNlZCBieSBpbmNvcnJlY3QgSFRNTCBtYXJrdXAsIGZvciBleGFtcGxlIG5lc3RpbmcgYmxvY2stbGV2ZWwgZWxlbWVudHMgaW5zaWRlIDxwPiwgb3IgbWlzc2luZyA8dGJvZHk+LiBCYWlsaW5nIGh5ZHJhdGlvbiBhbmQgcGVyZm9ybWluZyBmdWxsIGNsaWVudC1zaWRlIHJlbmRlci4iKX1pPWUsZT1uZXcgbWUobS50YWdOYW1lKGkpLnRvTG93ZXJDYXNlKCkse30sW10sdm9pZCAwLGkpfXZhciBjPWUuZWxtLHU9bS5wYXJlbnROb2RlKGMpO2lmKF8odCxhLGMuX2xlYXZlQ2I/bnVsbDp1LG0ubmV4dFNpYmxpbmcoYykpLEwodC5wYXJlbnQpKWZvcih2YXIgbD10LnBhcmVudCxkPWsodCk7bDspe2Zvcih2YXIgZj0wO2Y8Zy5kZXN0cm95Lmxlbmd0aDsrK2YpZy5kZXN0cm95W2ZdKGwpO2lmKGwuZWxtPXQuZWxtLGQpe2Zvcih2YXIgcD0wO3A8Zy5jcmVhdGUubGVuZ3RoOysrcClnLmNyZWF0ZVtwXShTcixsKTt2YXIgaD1sLmRhdGEuaG9vay5pbnNlcnQ7aWYoaC5tZXJnZWQpZm9yKHZhciB2PTE7djxoLmZucy5sZW5ndGg7disrKWguZm5zW3ZdKCl9ZWxzZSB3cihsKTtsPWwucGFyZW50fUwodSk/VChbZV0sMCwwKTpMKGUudGFnKSYmQyhlKX19cmV0dXJuIEkodCxhLG8pLHQuZWxtfUwoZSkmJkMoZSl9fSh7bm9kZU9wczpfcixtb2R1bGVzOlt7Y3JlYXRlOlByLHVwZGF0ZTpQcn0se2NyZWF0ZTpNcix1cGRhdGU6TXJ9LHtjcmVhdGU6RnIsdXBkYXRlOkZyfV0uY29uY2F0KFticixPcl0pfSksVXI9e21vZGVsOnt9LHNob3c6e319O2Z1bmN0aW9uIFZyKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPSIiLHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspTCh0PVZyKGVbcl0pKSYmIiIhPT10JiYobiYmKG4rPSIgIiksbis9dCk7cmV0dXJuIG59KGUpOnkoZSk/ZnVuY3Rpb24oZSl7dmFyIHQ9IiI7Zm9yKHZhciBuIGluIGUpZVtuXSYmKHQmJih0Kz0iICIpLHQrPW4pO3JldHVybiB0fShlKToic3RyaW5nIj09dHlwZW9mIGU/ZToiIn12YXIgcXI9aChmdW5jdGlvbihlKXt2YXIgbj17fSxyPS86KC4rKS87cmV0dXJuIGUuc3BsaXQoLzsoPyFbXihdKlwpKS9nKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PWUuc3BsaXQocik7MTx0Lmxlbmd0aCYmKG5bdFswXS50cmltKCldPXRbMV0udHJpbSgpKX19KSxufSk7ZnVuY3Rpb24gV3IoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/RShlKToic3RyaW5nIj09dHlwZW9mIGU/cXIoZSk6ZX1mdW5jdGlvbiBIcihlLHQpe3ZlKCk7dmFyIG4scj10aGlzLiRvcHRpb25zW2VdLGk9ZSsiIGhvb2siO2lmKHIpZm9yKHZhciBvPTAsYT1yLmxlbmd0aDtvPGE7bysrKW49S2UocltvXSx0aGlzLHQ/W3RdOm51bGwsdGhpcyxpKTtyZXR1cm4gdGhpcy5faGFzSG9va0V2ZW50JiZ0aGlzLiRlbWl0KCJob29rOiIrZSx0KSxnZSgpLG59dmFyIEdyPXtpbnN0YWxsOmZ1bmN0aW9uKGUpe2UucHJvdG90eXBlLl8kcXVldWU9bW4sZS5wcm90b3R5cGUuX19jYWxsX2hvb2s9SHIsZS5wcm90b3R5cGUuXyRzdHJpbmdpZnlDbGFzcz1WcixlLnByb3RvdHlwZS5fJG5vcm1hbGl6ZVN0eWxlQmluZGluZz1Xcn19O0huLmNvbmZpZy5tdXN0VXNlUHJvcD1mdW5jdGlvbigpe3JldHVybiExfSxIbi5jb25maWcuaXNSZXNlcnZlZFRhZz15cixIbi5jb25maWcuaXNSZXNlcnZlZEF0dHI9bXIsSG4uY29uZmlnLmdldFRhZ05hbWVzcGFjZT1mdW5jdGlvbigpe30sSG4uY29uZmlnLmlzVW5rbm93bkVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sTyhIbi5vcHRpb25zLmRpcmVjdGl2ZXMsVXIpLE8oSG4ub3B0aW9ucy5jb21wb25lbnRzLHt9KSxIbi5wcm90b3R5cGUuX19wYXRjaF9fPXpyLEhuLnByb3RvdHlwZS4kbW91bnQ9ZnVuY3Rpb24oZSx0KXtpZigicGFnZSI9PT10aGlzLiRvcHRpb25zLm1wVHlwZSl7dmFyIG49bmV3IGdyKHRoaXMuJG9wdGlvbnMucGFnZUlkLHRoaXMuJG9wdGlvbnMucGFnZVBhdGgpOyhlPW4uY3JlYXRlQ29tbWVudCgicm9vdCIpKS5oYXNBdHRyaWJ1dGU9ZS5yZW1vdmVBdHRyaWJ1dGU9ZnVuY3Rpb24oKXt9LG4uZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKGUpfXJldHVybiByPWUsYT10LChvPXRoaXMpLiRlbD1yLG8uJG9wdGlvbnMucmVuZGVyfHwoby4kb3B0aW9ucy5yZW5kZXI9X2Usby4kb3B0aW9ucy50ZW1wbGF0ZSYmIiMiIT09by4kb3B0aW9ucy50ZW1wbGF0ZS5jaGFyQXQoMCl8fG8uJG9wdGlvbnMuZWx8fHI/c2UoIllvdSBhcmUgdXNpbmcgdGhlIHJ1bnRpbWUtb25seSBidWlsZCBvZiBWdWUgd2hlcmUgdGhlIHRlbXBsYXRlIGNvbXBpbGVyIGlzIG5vdCBhdmFpbGFibGUuIEVpdGhlciBwcmUtY29tcGlsZSB0aGUgdGVtcGxhdGVzIGludG8gcmVuZGVyIGZ1bmN0aW9ucywgb3IgdXNlIHRoZSBjb21waWxlci1pbmNsdWRlZCBidWlsZC4iLG8pOnNlKCJGYWlsZWQgdG8gbW91bnQgY29tcG9uZW50OiB0ZW1wbGF0ZSBvciByZW5kZXIgZnVuY3Rpb24gbm90IGRlZmluZWQuIixvKSksdm4obywiYmVmb3JlTW91bnQiKSxpPXoucGVyZm9ybWFuY2UmJnB0P2Z1bmN0aW9uKCl7dmFyIGU9by5fbmFtZSx0PW8uX3VpZCxuPSJ2dWUtcGVyZi1zdGFydDoiK3Qscj0idnVlLXBlcmYtZW5kOiIrdDtwdChuKTt2YXIgaT1vLl9yZW5kZXIoKTtwdChyKSxodCgidnVlICIrZSsiIHJlbmRlciIsbixyKSxwdChuKSxvLl91cGRhdGUoaSxhKSxwdChyKSxodCgidnVlICIrZSsiIHBhdGNoIixuLHIpfTpmdW5jdGlvbigpe28uX3VwZGF0ZShvLl9yZW5kZXIoKSxhKX0sbmV3IEVuKG8saSxBLHtiZWZvcmU6ZnVuY3Rpb24oKXtvLl9pc01vdW50ZWQmJiFvLl9pc0Rlc3Ryb3llZCYmdm4obywiYmVmb3JlVXBkYXRlIil9fSwhMCksYT0hMSxudWxsPT1vLiR2bm9kZSYmKG8uX2lzTW91bnRlZD0hMCxvLl8kdmQ/KHZuKG8sIm9uU2VydmljZUNyZWF0ZWQiKSx2bihvLCJvblNlcnZpY2VBdHRhY2hlZCIpLG8uXyR2ZC5hZGRNb3VudGVkVm0obykpOnZuKG8sIm1vdW50ZWQiKSksbzt2YXIgbyxyLGEsaX0sSG4udXNlKEdyKSxlLlZ1ZT1Ibn12YXIgaXNGaXJzdD0hMCxmcmFtZXdvcmtzLHJ1bnRpbWVDb25maWc7ZnVuY3Rpb24gaW5pdCQyKGUpe2lmKGUuX191bmlDb25maWcpe3ZhciB0PWUud2VleDtpc0ZpcnN0JiYoZ2xvYmFsLldYRW52aXJvbm1lbnQuZGV2aWNlV2lkdGg9dC5jb25maWcuZW52LmRldmljZVdpZHRoKTt2YXIgbj1lLl9fdW5pQ29uZmlnLHI9IndlZXgiPT09bi5udnVlQ29tcGlsZXI7dC5kb2N1bWVudC5fXyRhdXRvbWF0b3JfXz0hIW4uYXV0b21hdG9yLHQuZG9jdW1lbnQuX18kY29tcGlsZXJfXz1yPyJ3ZWV4IjoidW5pLWFwcCIsdC5kb2N1bWVudC5fXyRzdHlsZUNvbXBpbGVyX189IndlZXgiPT09bi5udnVlU3R5bGVDb21waWxlcj8id2VleCI6InVuaS1hcHAiLGdsb2JhbC5XWEVudmlyb25tZW50LmR5bmFtaWNScHg9ISghbi53aW5kb3d8fCFuLndpbmRvdy5keW5hbWljUnB4KTt2YXIgaT0ibmF0aXZlIiE9PW4ucmVuZGVyZXImJi0xIT09dC5jb25maWcuYnVuZGxlVXJsLmluZGV4T2YoImFwcC1zZXJ2aWNlLmpzIik7aWYoaSl7dmFyIG89e307dnVlRmFjdG9yeShvLGUuU2hhcmVkT2JqZWN0KSxlLlZ1ZT1vLlZ1ZX1pZihPYmplY3QuYXNzaWduKGUsY3JlYXRlSW5zdGFuY2VDb250ZXh0JDEoZSkpLGkmJmUuVnVlLnVzZShlLl9fdnVlUGx1Z2luKSxkZWxldGUgZS5fX3Z1ZVBsdWdpbiwhcil7dmFyIGE9ZS5wbHVzO2lmKCJpb3MiPT09Z2xvYmFsLldYRW52aXJvbm1lbnQucGxhdGZvcm0udG9Mb3dlckNhc2UoKSl7dmFyIHM9YS5zY3JlZW47Z2xvYmFsLldYRW52aXJvbm1lbnQuZGV2aWNlV2lkdGg9cy53aWR0aCxnbG9iYWwuV1hFbnZpcm9ubWVudC5kZXZpY2VIZWlnaHQ9cy5oZWlnaHR9dmFyIGM9Z2xvYmFsLldYRW52aXJvbm1lbnQsdT1jLnNjYWxlLGw9Yy5kZXZpY2VXaWR0aCxkPWMucGxhdGZvcm0sZj1NYXRoLmNlaWwobC91KSxwPXQucmVxdWlyZU1vZHVsZSgibWV0YSIpO2lmKCIxIj09PXQuY29uZmlnLnBsdXNfd2ViX2lkKXt2YXIgaD10LnJlcXVpcmVNb2R1bGUoInBsdXMiKTtoLnNldERlZmF1bHRGb250U2l6ZSYmaC5zZXREZWZhdWx0Rm9udFNpemUoMTYpfSJpb3MiPT09ZC50b0xvd2VyQ2FzZSgpJiZwLnNldFZpZXdwb3J0KHt3aWR0aDpmLHJvdW5kT2ZmRGV2aWF0aW9uOiExfSl9aXx8ZS5WdWUudXNlKHVuaUFwcCxlKX19ZnVuY3Rpb24gZ2V0SlNGTVZlcnNpb24oKXtyZXR1cm4iMC4yOS42In1mdW5jdGlvbiBjcmVhdGVTZXJ2aWNlcyhpLG8sYSl7dmFyIHM9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gcy5zZXJ2aWNlPU9iamVjdC5jcmVhdGUobnVsbCksc2VydmljZXMuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLm5hbWUsbj1lLm9wdGlvbnMuY3JlYXRlO2lmKG4pdHJ5e3ZhciByPW4oaSxvLGEpO09iamVjdC5hc3NpZ24ocy5zZXJ2aWNlLHIpLE9iamVjdC5hc3NpZ24ocyxyLmluc3RhbmNlKX1jYXRjaChlKXtjb25zb2xlLmVycm9yKCJbSlMgUnVudGltZV0gRmFpbGVkIHRvIGNyZWF0ZSBzZXJ2aWNlICIrdCsiLiIpfX0pLGRlbGV0ZSBzLnNlcnZpY2UuaW5zdGFuY2UsT2JqZWN0LmZyZWV6ZShzLnNlcnZpY2UpLHN9dmFyIGluc3RhbmNlVHlwZU1hcD17fTtmdW5jdGlvbiBnZXRGcmFtZXdvcmtUeXBlKGUpe3JldHVybiBpbnN0YW5jZVR5cGVNYXBbZV19dmFyIFNoYXJlZE9iamVjdD17dWlkOjB9O2Z1bmN0aW9uIGNyZWF0ZUluc3RhbmNlQ29udGV4dChlLHQsbil7dm9pZCAwPT09dCYmKHQ9e30pO3ZhciByPW5ldyBXZWV4SW5zdGFuY2UoZSx0LG4pO2luc3RhbmNlVHlwZU1hcFtlXT0iVnVlIjt2YXIgaT1ydW50aW1lQ29uZmlnLmZyYW1ld29ya3MuVnVlO2lmKCFpKXJldHVybiBuZXcgRXJyb3IoJ1tKUyBGcmFtZXdvcmtdIEludmFsaWQgYnVuZGxlIHR5cGUgIlZ1ZSIuJyk7dmFyIG89Y3JlYXRlU2VydmljZXMoZSx7d2VleDpyLGNvbmZpZzp0LGNyZWF0ZWQ6RGF0ZS5ub3coKSxmcmFtZXdvcms6IlZ1ZSIsYnVuZGxlVHlwZToiVnVlIn0scnVudGltZUNvbmZpZyk7T2JqZWN0LmZyZWV6ZShvKTt2YXIgYT1PYmplY3QuY3JlYXRlKG51bGwpO09iamVjdC5hc3NpZ24oYSxvLHtTaGFyZWRPYmplY3Q6U2hhcmVkT2JqZWN0LHdlZXg6cixnZXRKU0ZNVmVyc2lvbjpnZXRKU0ZNVmVyc2lvbixyZXF1aXJlTW9kdWxlOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3JldHVybiByLnJlcXVpcmVNb2R1bGUuYXBwbHkocixlKX0sX19XRUVYX0NBTExfSkFWQVNDUklQVF9fOnJlY2VpdmVUYXNrcyxzZXJ2aWNlczpvfSksT2JqZWN0LmZyZWV6ZShhKTt2YXIgcz1PYmplY3QuYXNzaWduKHt9LGEpO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBpLmNyZWF0ZUluc3RhbmNlQ29udGV4dCYmT2JqZWN0LmFzc2lnbihzLGkuY3JlYXRlSW5zdGFuY2VDb250ZXh0KGUsYSxuKSksaW5pdCQyKHMpLE9iamVjdC5mcmVlemUocyksc31mdW5jdGlvbiBjcmVhdGVJbnN0YW5jZShlLHQsbixyKXtpZihpbnN0YW5jZVR5cGVNYXBbZV0pcmV0dXJuIG5ldyBFcnJvcignVGhlIGluc3RhbmNlIGlkICInK2UrJyIgaGFzIGFscmVhZHkgYmVlbiB1c2VkIScpO3ZhciBpPSJWdWUiO2luc3RhbmNlVHlwZU1hcFtlXT1pLChuPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobnx8e30pKSkuZW52PUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZ2xvYmFsLldYRW52aXJvbm1lbnR8fHt9KSksbi5idW5kbGVUeXBlPWk7dmFyIG89cnVudGltZUNvbmZpZy5mcmFtZXdvcmtzLlZ1ZTtpZighbylyZXR1cm4gbmV3IEVycm9yKCdbSlMgRnJhbWV3b3JrXSBJbnZhbGlkIGJ1bmRsZSB0eXBlICJWdWUiLicpO3ZhciBhPWNyZWF0ZUluc3RhbmNlQ29udGV4dChlLG4scik7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG8uY3JlYXRlSW5zdGFuY2UpcmV0dXJuIG8uY3JlYXRlSW5zdGFuY2UoZSx0LG4scixhKTtydW5JbkNvbnRleHQodCxhKX1mdW5jdGlvbiBydW5JbkNvbnRleHQoZSx0KXt2YXIgbj1bXSxyPVtdO2Zvcih2YXIgaSBpbiB0KW4ucHVzaChpKSxyLnB1c2godFtpXSk7dmFyIG89IlxuICAgIChmdW5jdGlvbiAoZ2xvYmFsKSB7XG4gICAgICAiK2UrIlxuICAgIH0pKE9iamVjdC5jcmVhdGUodGhpcykpXG4gICI7cmV0dXJuKG5ldyhGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseShGdW5jdGlvbixbbnVsbF0uY29uY2F0KG4sW29dKSkpKS5hcHBseSh2b2lkIDAscil9ZnVuY3Rpb24gZ2V0Um9vdChlKXt2YXIgdD1nZXREb2MoZSk7dHJ5e2lmKHQmJnQuYm9keSlyZXR1cm4gdC5ib2R5LnRvSlNPTigpfWNhdGNoKGUpe3JldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIltKUyBGcmFtZXdvcmtdIEZhaWxlZCB0byBnZXQgdGhlIHZpcnR1YWwgZG9tIHRyZWUuIil9fXZhciBtZXRob2RzPXtjcmVhdGVJbnN0YW5jZTpjcmVhdGVJbnN0YW5jZSxjcmVhdGVJbnN0YW5jZUNvbnRleHQ6Y3JlYXRlSW5zdGFuY2VDb250ZXh0LGdldFJvb3Q6Z2V0Um9vdCxnZXRKU0ZNVmVyc2lvbjpnZXRKU0ZNVmVyc2lvbixnZXREb2N1bWVudDpnZXREb2MscmVnaXN0ZXJTZXJ2aWNlOnJlZ2lzdGVyLHVucmVnaXN0ZXJTZXJ2aWNlOnVucmVnaXN0ZXIsY2FsbEpTOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZnJhbWV3b3Jrc1tnZXRGcmFtZXdvcmtUeXBlKGUpXTtyZXR1cm4gbiYmImZ1bmN0aW9uIj09dHlwZW9mIG4ucmVjZWl2ZVRhc2tzP24ucmVjZWl2ZVRhc2tzKGUsdCk6cmVjZWl2ZVRhc2tzKGUsdCl9fTtmdW5jdGlvbiBnZW5JbnN0YW5jZShzKXttZXRob2RzW3NdPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3ZhciBuLHI9ZVswXSxpPWdldEZyYW1ld29ya1R5cGUocik7aWYoaSYmZnJhbWV3b3Jrc1tpXSl7dmFyIG89KG49ZnJhbWV3b3Jrc1tpXSlbc10uYXBwbHkobixlKSxhPXtmcmFtZXdvcms6aX07cmV0dXJuInJlZnJlc2hJbnN0YW5jZSI9PT1zP3NlcnZpY2VzLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vcHRpb25zLnJlZnJlc2g7dCYmdChyLHtpbmZvOmEscnVudGltZTpydW50aW1lQ29uZmlnfSl9KToiZGVzdHJveUluc3RhbmNlIj09PXMmJihzZXJ2aWNlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUub3B0aW9ucy5kZXN0cm95O3QmJnQocix7aW5mbzphLHJ1bnRpbWU6cnVudGltZUNvbmZpZ30pfSksZGVsZXRlIGluc3RhbmNlVHlwZU1hcFtyXSksb319fWZ1bmN0aW9uIGFkYXB0TWV0aG9kKGksbyl7bWV0aG9kc1tpXT1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtmb3IodmFyIG4gaW4iZnVuY3Rpb24iPT10eXBlb2YgbyYmby5hcHBseSh2b2lkIDAsZSkscnVudGltZUNvbmZpZy5mcmFtZXdvcmtzKXt2YXIgcj1ydW50aW1lQ29uZmlnLmZyYW1ld29ya3Nbbl07ciYmcltpXSYmcltpXS5hcHBseShyLGUpfX19ZnVuY3Rpb24gaW5pdCQkMShlKXtmb3IodmFyIHQgaW4gZnJhbWV3b3Jrcz0ocnVudGltZUNvbmZpZz1lfHx7fSkuZnJhbWV3b3Jrc3x8e30saW5pdCQxKCksZnJhbWV3b3Jrcyl7dmFyIG49ZnJhbWV3b3Jrc1t0XTtpZigiZnVuY3Rpb24iPT10eXBlb2Ygbi5pbml0KXRyeXtuLmluaXQoZSl9Y2F0Y2goZSl7fX1yZXR1cm4gYWRhcHRNZXRob2QoInJlZ2lzdGVyQ29tcG9uZW50cyIscmVnaXN0ZXJDb21wb25lbnRzKSxhZGFwdE1ldGhvZCgicmVnaXN0ZXJNb2R1bGVzIixyZWdpc3Rlck1vZHVsZXMpLGFkYXB0TWV0aG9kKCJyZWdpc3Rlck1ldGhvZHMiKSxbImRlc3Ryb3lJbnN0YW5jZSIsInJlZnJlc2hJbnN0YW5jZSJdLmZvckVhY2goZ2VuSW5zdGFuY2UpLG1ldGhvZHN9dmFyIGNvbmZpZz17RG9jdW1lbnQ6RG9jdW1lbnQsRWxlbWVudDpFbGVtZW50LENvbW1lbnQ6Q29tbWVudCxMaXN0ZW5lcjpMaXN0ZW5lcixUYXNrQ2VudGVyOlRhc2tDZW50ZXIsc2VuZFRhc2tzOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBjYWxsTmF0aXZlP2NhbGxOYXRpdmUuYXBwbHkodm9pZCAwLGUpOihnbG9iYWwuY2FsbE5hdGl2ZXx8ZnVuY3Rpb24oKXt9KS5hcHBseSh2b2lkIDAsZSl9fTtmdW5jdGlvbiBmcmVlemVQcm90b3R5cGUoKXtPYmplY3QuZnJlZXplKGNvbmZpZy5Db21tZW50KSxPYmplY3QuZnJlZXplKGNvbmZpZy5MaXN0ZW5lciksT2JqZWN0LmZyZWV6ZShjb25maWcuRG9jdW1lbnQucHJvdG90eXBlKSxPYmplY3QuZnJlZXplKGNvbmZpZy5Db21tZW50LnByb3RvdHlwZSksT2JqZWN0LmZyZWV6ZShjb25maWcuTGlzdGVuZXIucHJvdG90eXBlKX1Eb2N1bWVudC5oYW5kbGVyPWNvbmZpZy5zZW5kVGFza3M7dmFyIHJ1bnRpbWU9e3NlcnZpY2U6e3JlZ2lzdGVyOnJlZ2lzdGVyLHVucmVnaXN0ZXI6dW5yZWdpc3RlcixoYXM6aGFzfSxmcmVlemVQcm90b3R5cGU6ZnJlZXplUHJvdG90eXBlLGluaXQ6aW5pdCQkMSxjb25maWc6Y29uZmlnfTtmdW5jdGlvbiBNZXNzYWdlRXZlbnQoZSx0KXt2b2lkIDA9PT10JiYodD17fSksdGhpcy50eXBlPWV8fCJtZXNzYWdlIix0aGlzLmRhdGE9dC5kYXRhfHxudWxsLHRoaXMub3JpZ2luPXQub3JpZ2lufHwiIix0aGlzLnNvdXJjZT10LnNvdXJjZXx8bnVsbCx0aGlzLnBvcnRzPXQucG9ydHN8fFtdLHRoaXMudGFyZ2V0PW51bGwsdGhpcy50aW1lU3RhbXA9RGF0ZS5ub3coKX12YXIgY2hhbm5lbHM9e30saW5zdGFuY2VzPXt9O2Z1bmN0aW9uIEJyb2FkY2FzdENoYW5uZWwkMSgpe31Ccm9hZGNhc3RDaGFubmVsJDEucHJvdG90eXBlLnBvc3RNZXNzYWdlPWZ1bmN0aW9uKGUpe2lmKHRoaXMuX2Nsb3NlZCl0aHJvdyBuZXcgRXJyb3IoJ0Jyb2FkY2FzdENoYW5uZWwgIicrdGhpcy5uYW1lKyciIGlzIGNsb3NlZC4nKTt2YXIgdD1jaGFubmVsc1t0aGlzLm5hbWVdO2lmKHQmJnQubGVuZ3RoKWZvcih2YXIgbj0wO248dC5sZW5ndGg7KytuKXt2YXIgcj10W25dO3IuX2Nsb3NlZHx8cj09PXRoaXN8fCJmdW5jdGlvbiI9PXR5cGVvZiByLm9ubWVzc2FnZSYmci5vbm1lc3NhZ2UobmV3IE1lc3NhZ2VFdmVudCgibWVzc2FnZSIse2RhdGE6ZX0pKX19LEJyb2FkY2FzdENoYW5uZWwkMS5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKCF0aGlzLl9jbG9zZWQmJih0aGlzLl9jbG9zZWQ9ITAsY2hhbm5lbHNbdGhpcy5uYW1lXSkpe3ZhciBlPWNoYW5uZWxzW3RoaXMubmFtZV0uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlIT09dH0pO2UubGVuZ3RoP2NoYW5uZWxzW3RoaXMubmFtZV09ZTpkZWxldGUgY2hhbm5lbHNbdGhpcy5uYW1lXX19O3ZhciBCcm9hZGNhc3RDaGFubmVsJDI9e2NyZWF0ZTpmdW5jdGlvbih0LGUsbil7aWYoaW5zdGFuY2VzW3RdPVtdLCJmdW5jdGlvbiI9PXR5cGVvZiBnbG9iYWwuQnJvYWRjYXN0Q2hhbm5lbClyZXR1cm57fTt2YXIgcj17QnJvYWRjYXN0Q2hhbm5lbDpmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibmFtZSIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiExLHZhbHVlOlN0cmluZyhlKX0pLHRoaXMuX2Nsb3NlZD0hMSx0aGlzLm9ubWVzc2FnZT1udWxsLGNoYW5uZWxzW3RoaXMubmFtZV18fChjaGFubmVsc1t0aGlzLm5hbWVdPVtdKSxjaGFubmVsc1t0aGlzLm5hbWVdLnB1c2godGhpcyksaW5zdGFuY2VzW3RdLnB1c2godGhpcyl9fTtyZXR1cm4gci5Ccm9hZGNhc3RDaGFubmVsLnByb3RvdHlwZT1Ccm9hZGNhc3RDaGFubmVsJDEucHJvdG90eXBlLHtpbnN0YW5jZTpyfX0sZGVzdHJveTpmdW5jdGlvbihlLHQpe2luc3RhbmNlc1tlXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNsb3NlKCl9KSxkZWxldGUgaW5zdGFuY2VzW2VdfX0sc2VydmljZXMkMT17QnJvYWRjYXN0Q2hhbm5lbDpCcm9hZGNhc3RDaGFubmVsJDJ9LHFaYixyWmIsdFpiLHVaYjtmdW5jdGlvbiBzZXR1cChlKXt2YXIgdD1ydW50aW1lLmluaXQsbj1ydW50aW1lLmNvbmZpZztuLmZyYW1ld29ya3M9ZTt2YXIgcj1zdWJ2ZXJzaW9uLm5hdGl2ZSxpPXN1YnZlcnNpb24udHJhbnNmb3JtZXI7Zm9yKHZhciBvIGluIHNlcnZpY2VzJDEpcnVudGltZS5zZXJ2aWNlLnJlZ2lzdGVyKG8sc2VydmljZXMkMVtvXSk7cnVudGltZS5mcmVlemVQcm90b3R5cGUoKSxnbG9iYWwuZnJhbWV3b3JrVmVyc2lvbj1yLGdsb2JhbC50cmFuc2Zvcm1lclZlcnNpb249aTt2YXIgYT10KG4pLHM9ZnVuY3Rpb24ocil7Z2xvYmFsW3JdPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO3ZhciBuPWFbcl0uYXBwbHkoYSxlKTtyZXR1cm4gbiBpbnN0YW5jZW9mIEVycm9yJiZjb25zb2xlLmVycm9yKG4udG9TdHJpbmcoKSksbn19O2Zvcih2YXIgYyBpbiBhKXMoYyl9ZnVuY3Rpb24gdW53cmFwRXhwb3J0cyhlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwiZGVmYXVsdCIpP2UuZGVmYXVsdDplfWZ1bmN0aW9uIGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGUsdCl7cmV0dXJuIGUodD17ZXhwb3J0czp7fX0sdC5leHBvcnRzKSx0LmV4cG9ydHN9QXJyYXkuZnJvbXx8KEFycmF5LmZyb209KHFaYj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLHJaYj1mdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZXx8IltvYmplY3QgRnVuY3Rpb25dIj09PXFaYi5jYWxsKGUpfSx0WmI9TWF0aC5wb3coMiw1MyktMSx1WmI9ZnVuY3Rpb24oZSl7dmFyIHQsbj0odD1OdW1iZXIoZSksaXNOYU4odCk/MDowIT09dCYmaXNGaW5pdGUodCk/KDA8dD8xOi0xKSpNYXRoLmZsb29yKE1hdGguYWJzKHQpKTp0KTtyZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgobiwwKSx0WmIpfSxmdW5jdGlvbihlKXt2YXIgdD1PYmplY3QoZSk7aWYobnVsbD09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcnJheS5mcm9tIHJlcXVpcmVzIGFuIGFycmF5LWxpa2Ugb2JqZWN0IC0gbm90IG51bGwgb3IgdW5kZWZpbmVkIik7dmFyIG4scj0xPGFyZ3VtZW50cy5sZW5ndGg/YXJndW1lbnRzWzFdOnZvaWQgMDtpZih2b2lkIDAhPT1yKXtpZighclpiKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFycmF5LmZyb206IHdoZW4gcHJvdmlkZWQsIHRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uIik7Mjxhcmd1bWVudHMubGVuZ3RoJiYobj1hcmd1bWVudHNbMl0pfWZvcih2YXIgaSxvPXVaYih0Lmxlbmd0aCksYT1yWmIodGhpcyk/T2JqZWN0KG5ldyB0aGlzKG8pKTpuZXcgQXJyYXkobykscz0wO3M8bzspaT10W3NdLGFbc109cj92b2lkIDA9PT1uP3IoaSxzKTpyLmNhbGwobixpLHMpOmkscys9MTtyZXR1cm4gYS5sZW5ndGg9byxhfSkpO3ZhciBfZ2xvYmFsPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZXhwb3J0cz0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93Lk1hdGg9PU1hdGg/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZiYmc2VsZi5NYXRoPT1NYXRoP3NlbGY6RnVuY3Rpb24oInJldHVybiB0aGlzIikoKTsibnVtYmVyIj09dHlwZW9mIF9fZyYmKF9fZz10KX0pLF9jb3JlPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZXhwb3J0cz17dmVyc2lvbjoiMi41LjcifTsibnVtYmVyIj09dHlwZW9mIF9fZSYmKF9fZT10KX0pLF9jb3JlXzE9X2NvcmUudmVyc2lvbixfaXNPYmplY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlP251bGwhPT1lOiJmdW5jdGlvbiI9PXR5cGVvZiBlfSxfYW5PYmplY3Q9ZnVuY3Rpb24oZSl7aWYoIV9pc09iamVjdChlKSl0aHJvdyBUeXBlRXJyb3IoZSsiIGlzIG5vdCBhbiBvYmplY3QhIik7cmV0dXJuIGV9LF9mYWlscz1mdW5jdGlvbihlKXt0cnl7cmV0dXJuISFlKCl9Y2F0Y2goZSl7cmV0dXJuITB9fSxfZGVzY3JpcHRvcnM9IV9mYWlscyhmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSksZG9jdW1lbnQkMT1fZ2xvYmFsLmRvY3VtZW50LGlzPV9pc09iamVjdChkb2N1bWVudCQxKSYmX2lzT2JqZWN0KGRvY3VtZW50JDEuY3JlYXRlRWxlbWVudCksX2RvbUNyZWF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gaXM/ZG9jdW1lbnQkMS5jcmVhdGVFbGVtZW50KGUpOnt9fSxfaWU4RG9tRGVmaW5lPSFfZGVzY3JpcHRvcnMmJiFfZmFpbHMoZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KF9kb21DcmVhdGUoImRpdiIpLCJhIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSkuYX0pLF90b1ByaW1pdGl2ZT1mdW5jdGlvbihlLHQpe2lmKCFfaXNPYmplY3QoZSkpcmV0dXJuIGU7dmFyIG4scjtpZih0JiYiZnVuY3Rpb24iPT10eXBlb2Yobj1lLnRvU3RyaW5nKSYmIV9pc09iamVjdChyPW4uY2FsbChlKSkpcmV0dXJuIHI7aWYoImZ1bmN0aW9uIj09dHlwZW9mKG49ZS52YWx1ZU9mKSYmIV9pc09iamVjdChyPW4uY2FsbChlKSkpcmV0dXJuIHI7aWYoIXQmJiJmdW5jdGlvbiI9PXR5cGVvZihuPWUudG9TdHJpbmcpJiYhX2lzT2JqZWN0KHI9bi5jYWxsKGUpKSlyZXR1cm4gcjt0aHJvdyBUeXBlRXJyb3IoIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZSIpfSxkUD1PYmplY3QuZGVmaW5lUHJvcGVydHksZj1fZGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnR5OmZ1bmN0aW9uKGUsdCxuKXtpZihfYW5PYmplY3QoZSksdD1fdG9QcmltaXRpdmUodCwhMCksX2FuT2JqZWN0KG4pLF9pZThEb21EZWZpbmUpdHJ5e3JldHVybiBkUChlLHQsbil9Y2F0Y2goZSl7fWlmKCJnZXQiaW4gbnx8InNldCJpbiBuKXRocm93IFR5cGVFcnJvcigiQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhIik7cmV0dXJuInZhbHVlImluIG4mJihlW3RdPW4udmFsdWUpLGV9LF9vYmplY3REcD17ZjpmfSxfcHJvcGVydHlEZXNjPWZ1bmN0aW9uKGUsdCl7cmV0dXJue2VudW1lcmFibGU6ISgxJmUpLGNvbmZpZ3VyYWJsZTohKDImZSksd3JpdGFibGU6ISg0JmUpLHZhbHVlOnR9fSxfaGlkZT1fZGVzY3JpcHRvcnM/ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBfb2JqZWN0RHAuZihlLHQsX3Byb3BlcnR5RGVzYygxLG4pKX06ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlW3RdPW4sZX0saGFzT3duUHJvcGVydHk9e30uaGFzT3duUHJvcGVydHksX2hhcz1mdW5jdGlvbihlLHQpe3JldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCl9LGlkPTAscHg9TWF0aC5yYW5kb20oKSxfdWlkPWZ1bmN0aW9uKGUpe3JldHVybiJTeW1ib2woIi5jb25jYXQodm9pZCAwPT09ZT8iIjplLCIpXyIsKCsraWQrcHgpLnRvU3RyaW5nKDM2KSl9LF9yZWRlZmluZT1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihlKXt2YXIgbz1fdWlkKCJzcmMiKSx0PSJ0b1N0cmluZyIsbj1GdW5jdGlvblt0XSxhPSgiIituKS5zcGxpdCh0KTtfY29yZS5pbnNwZWN0U291cmNlPWZ1bmN0aW9uKGUpe3JldHVybiBuLmNhbGwoZSl9LChlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9ImZ1bmN0aW9uIj09dHlwZW9mIG47aSYmKF9oYXMobiwibmFtZSIpfHxfaGlkZShuLCJuYW1lIix0KSksZVt0XSE9PW4mJihpJiYoX2hhcyhuLG8pfHxfaGlkZShuLG8sZVt0XT8iIitlW3RdOmEuam9pbihTdHJpbmcodCkpKSksZT09PV9nbG9iYWw/ZVt0XT1uOnI/ZVt0XT9lW3RdPW46X2hpZGUoZSx0LG4pOihkZWxldGUgZVt0XSxfaGlkZShlLHQsbikpKX0pKEZ1bmN0aW9uLnByb3RvdHlwZSx0LGZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMmJnRoaXNbb118fG4uY2FsbCh0aGlzKX0pfSksX2FGdW5jdGlvbj1mdW5jdGlvbihlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBUeXBlRXJyb3IoZSsiIGlzIG5vdCBhIGZ1bmN0aW9uISIpO3JldHVybiBlfSxfY3R4PWZ1bmN0aW9uKHIsaSxlKXtpZihfYUZ1bmN0aW9uKHIpLHZvaWQgMD09PWkpcmV0dXJuIHI7c3dpdGNoKGUpe2Nhc2UgMTpyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHIuY2FsbChpLGUpfTtjYXNlIDI6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIuY2FsbChpLGUsdCl9O2Nhc2UgMzpyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe3JldHVybiByLmNhbGwoaSxlLHQsbil9fXJldHVybiBmdW5jdGlvbigpe3JldHVybiByLmFwcGx5KGksYXJndW1lbnRzKX19LFBST1RPVFlQRT0icHJvdG90eXBlIiwkZXhwb3J0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzPWUmJGV4cG9ydC5GLGM9ZSYkZXhwb3J0LkcsdT1lJiRleHBvcnQuUyxsPWUmJGV4cG9ydC5QLGQ9ZSYkZXhwb3J0LkIsZj1jP19nbG9iYWw6dT9fZ2xvYmFsW3RdfHwoX2dsb2JhbFt0XT17fSk6KF9nbG9iYWxbdF18fHt9KVtQUk9UT1RZUEVdLHA9Yz9fY29yZTpfY29yZVt0XXx8KF9jb3JlW3RdPXt9KSxoPXBbUFJPVE9UWVBFXXx8KHBbUFJPVE9UWVBFXT17fSk7Zm9yKHIgaW4gYyYmKG49dCksbilvPSgoaT0hcyYmZiYmdm9pZCAwIT09ZltyXSk/ZjpuKVtyXSxhPWQmJmk/X2N0eChvLF9nbG9iYWwpOmwmJiJmdW5jdGlvbiI9PXR5cGVvZiBvP19jdHgoRnVuY3Rpb24uY2FsbCxvKTpvLGYmJl9yZWRlZmluZShmLHIsbyxlJiRleHBvcnQuVSkscFtyXSE9byYmX2hpZGUocCxyLGEpLGwmJmhbcl0hPW8mJihoW3JdPW8pfTtfZ2xvYmFsLmNvcmU9X2NvcmUsJGV4cG9ydC5GPTEsJGV4cG9ydC5HPTIsJGV4cG9ydC5TPTQsJGV4cG9ydC5QPTgsJGV4cG9ydC5CPTE2LCRleHBvcnQuVz0zMiwkZXhwb3J0LlU9NjQsJGV4cG9ydC5SPTEyODt2YXIgX2V4cG9ydD0kZXhwb3J0LHRvU3RyaW5nJDE9e30udG9TdHJpbmcsX2NvZj1mdW5jdGlvbihlKXtyZXR1cm4gdG9TdHJpbmckMS5jYWxsKGUpLnNsaWNlKDgsLTEpfSxfaW9iamVjdD1PYmplY3QoInoiKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKT9PYmplY3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIlN0cmluZyI9PV9jb2YoZSk/ZS5zcGxpdCgiIik6T2JqZWN0KGUpfSxfZGVmaW5lZD1mdW5jdGlvbihlKXtpZihudWxsPT1lKXRocm93IFR5cGVFcnJvcigiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gICIrZSk7cmV0dXJuIGV9LF90b0lvYmplY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIF9pb2JqZWN0KF9kZWZpbmVkKGUpKX0sY2VpbD1NYXRoLmNlaWwsZmxvb3I9TWF0aC5mbG9vcixfdG9JbnRlZ2VyPWZ1bmN0aW9uKGUpe3JldHVybiBpc05hTihlPStlKT8wOigwPGU/Zmxvb3I6Y2VpbCkoZSl9LG1pbj1NYXRoLm1pbixfdG9MZW5ndGg9ZnVuY3Rpb24oZSl7cmV0dXJuIDA8ZT9taW4oX3RvSW50ZWdlcihlKSw5MDA3MTk5MjU0NzQwOTkxKTowfSxtYXg9TWF0aC5tYXgsbWluJDE9TWF0aC5taW4sX3RvQWJzb2x1dGVJbmRleD1mdW5jdGlvbihlLHQpe3JldHVybihlPV90b0ludGVnZXIoZSkpPDA/bWF4KGUrdCwwKTptaW4kMShlLHQpfSxfYXJyYXlJbmNsdWRlcz1mdW5jdGlvbihzKXtyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk9X3RvSW9iamVjdChlKSxvPV90b0xlbmd0aChpLmxlbmd0aCksYT1fdG9BYnNvbHV0ZUluZGV4KG4sbyk7aWYocyYmdCE9dCl7Zm9yKDthPG87KWlmKChyPWlbYSsrXSkhPXIpcmV0dXJuITB9ZWxzZSBmb3IoO2E8bzthKyspaWYoKHN8fGEgaW4gaSkmJmlbYV09PT10KXJldHVybiBzfHxhfHwwO3JldHVybiFzJiYtMX19LF9saWJyYXJ5PSExLF9zaGFyZWQ9Y3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24oZSl7dmFyIHQ9Il9fY29yZS1qc19zaGFyZWRfXyIsbj1fZ2xvYmFsW3RdfHwoX2dsb2JhbFt0XT17fSk7KGUuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiBuW2VdfHwobltlXT12b2lkIDAhPT10P3Q6e30pfSkoInZlcnNpb25zIixbXSkucHVzaCh7dmVyc2lvbjpfY29yZS52ZXJzaW9uLG1vZGU6X2xpYnJhcnk/InB1cmUiOiJnbG9iYWwiLGNvcHlyaWdodDoiwqkgMjAxOCBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KSJ9KX0pLHNoYXJlZCQyPV9zaGFyZWQoImtleXMiKSxfc2hhcmVkS2V5PWZ1bmN0aW9uKGUpe3JldHVybiBzaGFyZWQkMltlXXx8KHNoYXJlZCQyW2VdPV91aWQoZSkpfSxhcnJheUluZGV4T2Y9X2FycmF5SW5jbHVkZXMoITEpLElFX1BST1RPPV9zaGFyZWRLZXkoIklFX1BST1RPIiksX29iamVjdEtleXNJbnRlcm5hbD1mdW5jdGlvbihlLHQpe3ZhciBuLHI9X3RvSW9iamVjdChlKSxpPTAsbz1bXTtmb3IobiBpbiByKW4hPUlFX1BST1RPJiZfaGFzKHIsbikmJm8ucHVzaChuKTtmb3IoO3QubGVuZ3RoPmk7KV9oYXMocixuPXRbaSsrXSkmJih+YXJyYXlJbmRleE9mKG8sbil8fG8ucHVzaChuKSk7cmV0dXJuIG99LF9lbnVtQnVnS2V5cz0iY29uc3RydWN0b3IsaGFzT3duUHJvcGVydHksaXNQcm90b3R5cGVPZixwcm9wZXJ0eUlzRW51bWVyYWJsZSx0b0xvY2FsZVN0cmluZyx0b1N0cmluZyx2YWx1ZU9mIi5zcGxpdCgiLCIpLF9vYmplY3RLZXlzPU9iamVjdC5rZXlzfHxmdW5jdGlvbihlKXtyZXR1cm4gX29iamVjdEtleXNJbnRlcm5hbChlLF9lbnVtQnVnS2V5cyl9LGYkMT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLF9vYmplY3RHb3BzPXtmOmYkMX0sZiQyPXt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLF9vYmplY3RQaWU9e2Y6ZiQyfSxfdG9PYmplY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdChfZGVmaW5lZChlKSl9LCRhc3NpZ249T2JqZWN0LmFzc2lnbixfb2JqZWN0QXNzaWduPSEkYXNzaWdufHxfZmFpbHMoZnVuY3Rpb24oKXt2YXIgZT17fSx0PXt9LG49U3ltYm9sKCkscj0iYWJjZGVmZ2hpamtsbW5vcHFyc3QiO3JldHVybiBlW25dPTcsci5zcGxpdCgiIikuZm9yRWFjaChmdW5jdGlvbihlKXt0W2VdPWV9KSw3IT0kYXNzaWduKHt9LGUpW25dfHxPYmplY3Qua2V5cygkYXNzaWduKHt9LHQpKS5qb2luKCIiKSE9cn0pP2Z1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPWFyZ3VtZW50cyxyPV90b09iamVjdChlKSxpPWFyZ3VtZW50cy5sZW5ndGgsbz0xLGE9X29iamVjdEdvcHMuZixzPV9vYmplY3RQaWUuZjtvPGk7KWZvcih2YXIgYyx1PV9pb2JqZWN0KG5bbysrXSksbD1hP19vYmplY3RLZXlzKHUpLmNvbmNhdChhKHUpKTpfb2JqZWN0S2V5cyh1KSxkPWwubGVuZ3RoLGY9MDtmPGQ7KXMuY2FsbCh1LGM9bFtmKytdKSYmKHJbY109dVtjXSk7cmV0dXJuIHJ9OiRhc3NpZ247X2V4cG9ydChfZXhwb3J0LlMrX2V4cG9ydC5GLCJPYmplY3QiLHthc3NpZ246X29iamVjdEFzc2lnbn0pO3ZhciBhc3NpZ249X2NvcmUuT2JqZWN0LmFzc2lnbjtPYmplY3Quc2V0UHJvdG90eXBlT2Z8fChPYmplY3Quc2V0UHJvdG90eXBlT2Y9ZnVuY3Rpb24odCxuKXt2YXIgcjtmdW5jdGlvbiBpKGUsdCl7cmV0dXJuIHIuY2FsbChlLHQpLGV9dHJ5eyhyPXQuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQucHJvdG90eXBlLG4pLnNldCkuY2FsbCh7fSxudWxsKX1jYXRjaChlKXtpZih0LnByb3RvdHlwZSE9PXt9W25dKXJldHVybjtyPWZ1bmN0aW9uKGUpe3RoaXNbbl09ZX0saS5wb2x5ZmlsbD1pKGkoe30sbnVsbCksdC5wcm90b3R5cGUpaW5zdGFuY2VvZiB0fXJldHVybiBpfShPYmplY3QsIl9fcHJvdG9fXyIpKTt2YXIgV1hFbnZpcm9ubWVudCQxPWdsb2JhbC5XWEVudmlyb25tZW50O3ZvaWQgMD09PVdYRW52aXJvbm1lbnQkMXx8ImlPUyIhPT1XWEVudmlyb25tZW50JDEucGxhdGZvcm18fFdYRW52aXJvbm1lbnQkMS5fX2VuYWJsZV9uYXRpdmVfcHJvbWlzZV9ffHwoZ2xvYmFsLlByb21pc2U9dm9pZCAwKTt2YXIgX3drcz1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihlKXt2YXIgdD1fc2hhcmVkKCJ3a3MiKSxuPV9nbG9iYWwuU3ltYm9sLHI9ImZ1bmN0aW9uIj09dHlwZW9mIG47KGUuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gdFtlXXx8KHRbZV09ciYmbltlXXx8KHI/bjpfdWlkKSgiU3ltYm9sLiIrZSkpfSkuc3RvcmU9dH0pLFRBRz1fd2tzKCJ0b1N0cmluZ1RhZyIpLEFSRz0iQXJndW1lbnRzIj09X2NvZihmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpLHRyeUdldD1mdW5jdGlvbihlLHQpe3RyeXtyZXR1cm4gZVt0XX1jYXRjaChlKXt9fSxfY2xhc3NvZj1mdW5jdGlvbihlKXt2YXIgdCxuLHI7cmV0dXJuIHZvaWQgMD09PWU/IlVuZGVmaW5lZCI6bnVsbD09PWU/Ik51bGwiOiJzdHJpbmciPT10eXBlb2Yobj10cnlHZXQodD1PYmplY3QoZSksVEFHKSk/bjpBUkc/X2NvZih0KToiT2JqZWN0Ij09KHI9X2NvZih0KSkmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LmNhbGxlZT8iQXJndW1lbnRzIjpyfSx0ZXN0PXt9O3Rlc3RbX3drcygidG9TdHJpbmdUYWciKV09InoiLHRlc3QrIiIhPSJbb2JqZWN0IHpdIiYmX3JlZGVmaW5lKE9iamVjdC5wcm90b3R5cGUsInRvU3RyaW5nIixmdW5jdGlvbigpe3JldHVybiJbb2JqZWN0ICIrX2NsYXNzb2YodGhpcykrIl0ifSwhMCk7dmFyIF9zdHJpbmdBdD1mdW5jdGlvbihzKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9U3RyaW5nKF9kZWZpbmVkKGUpKSxvPV90b0ludGVnZXIodCksYT1pLmxlbmd0aDtyZXR1cm4gbzwwfHxhPD1vP3M/IiI6dm9pZCAwOihuPWkuY2hhckNvZGVBdChvKSk8NTUyOTZ8fDU2MzE5PG58fG8rMT09PWF8fChyPWkuY2hhckNvZGVBdChvKzEpKTw1NjMyMHx8NTczNDM8cj9zP2kuY2hhckF0KG8pOm46cz9pLnNsaWNlKG8sbysyKTpyLTU2MzIwKyhuLTU1Mjk2PDwxMCkrNjU1MzZ9fSxfaXRlcmF0b3JzPXt9LF9vYmplY3REcHM9X2Rlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzOmZ1bmN0aW9uKGUsdCl7X2FuT2JqZWN0KGUpO2Zvcih2YXIgbixyPV9vYmplY3RLZXlzKHQpLGk9ci5sZW5ndGgsbz0wO288aTspX29iamVjdERwLmYoZSxuPXJbbysrXSx0W25dKTtyZXR1cm4gZX0sZG9jdW1lbnQkMj1fZ2xvYmFsLmRvY3VtZW50LF9odG1sPWRvY3VtZW50JDImJmRvY3VtZW50JDIuZG9jdW1lbnRFbGVtZW50LElFX1BST1RPJDE9X3NoYXJlZEtleSgiSUVfUFJPVE8iKSxFbXB0eT1mdW5jdGlvbigpe30sUFJPVE9UWVBFJDE9InByb3RvdHlwZSIsY3JlYXRlRGljdD1mdW5jdGlvbigpe3ZhciBlLHQ9X2RvbUNyZWF0ZSgiaWZyYW1lIiksbj1fZW51bUJ1Z0tleXMubGVuZ3RoO2Zvcih0LnN0eWxlLmRpc3BsYXk9Im5vbmUiLF9odG1sLmFwcGVuZENoaWxkKHQpLHQuc3JjPSJqYXZhc2NyaXB0OiIsKGU9dC5jb250ZW50V2luZG93LmRvY3VtZW50KS5vcGVuKCksZS53cml0ZSgiPHNjcmlwdD5kb2N1bWVudC5GPU9iamVjdDxcL3NjcmlwdD4iKSxlLmNsb3NlKCksY3JlYXRlRGljdD1lLkY7bi0tOylkZWxldGUgY3JlYXRlRGljdFtQUk9UT1RZUEUkMV1bX2VudW1CdWdLZXlzW25dXTtyZXR1cm4gY3JlYXRlRGljdCgpfSxfb2JqZWN0Q3JlYXRlPU9iamVjdC5jcmVhdGV8fGZ1bmN0aW9uKGUsdCl7dmFyIG47cmV0dXJuIG51bGwhPT1lPyhFbXB0eVtQUk9UT1RZUEUkMV09X2FuT2JqZWN0KGUpLG49bmV3IEVtcHR5LEVtcHR5W1BST1RPVFlQRSQxXT1udWxsLG5bSUVfUFJPVE8kMV09ZSk6bj1jcmVhdGVEaWN0KCksdm9pZCAwPT09dD9uOl9vYmplY3REcHMobix0KX0sZGVmPV9vYmplY3REcC5mLFRBRyQxPV93a3MoInRvU3RyaW5nVGFnIiksX3NldFRvU3RyaW5nVGFnPWZ1bmN0aW9uKGUsdCxuKXtlJiYhX2hhcyhlPW4/ZTplLnByb3RvdHlwZSxUQUckMSkmJmRlZihlLFRBRyQxLHtjb25maWd1cmFibGU6ITAsdmFsdWU6dH0pfSxJdGVyYXRvclByb3RvdHlwZT17fTtfaGlkZShJdGVyYXRvclByb3RvdHlwZSxfd2tzKCJpdGVyYXRvciIpLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KTt2YXIgX2l0ZXJDcmVhdGU9ZnVuY3Rpb24oZSx0LG4pe2UucHJvdG90eXBlPV9vYmplY3RDcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUse25leHQ6X3Byb3BlcnR5RGVzYygxLG4pfSksX3NldFRvU3RyaW5nVGFnKGUsdCsiIEl0ZXJhdG9yIil9LElFX1BST1RPJDI9X3NoYXJlZEtleSgiSUVfUFJPVE8iKSxPYmplY3RQcm90bz1PYmplY3QucHJvdG90eXBlLF9vYmplY3RHcG89T2JqZWN0LmdldFByb3RvdHlwZU9mfHxmdW5jdGlvbihlKXtyZXR1cm4gZT1fdG9PYmplY3QoZSksX2hhcyhlLElFX1BST1RPJDIpP2VbSUVfUFJPVE8kMl06ImZ1bmN0aW9uIj09dHlwZW9mIGUuY29uc3RydWN0b3ImJmUgaW5zdGFuY2VvZiBlLmNvbnN0cnVjdG9yP2UuY29uc3RydWN0b3IucHJvdG90eXBlOmUgaW5zdGFuY2VvZiBPYmplY3Q/T2JqZWN0UHJvdG86bnVsbH0sSVRFUkFUT1I9X3drcygiaXRlcmF0b3IiKSxCVUdHWT0hKFtdLmtleXMmJiJuZXh0ImluW10ua2V5cygpKSxGRl9JVEVSQVRPUj0iQEBpdGVyYXRvciIsS0VZUz0ia2V5cyIsVkFMVUVTPSJ2YWx1ZXMiLHJldHVyblRoaXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sX2l0ZXJEZWZpbmU9ZnVuY3Rpb24oZSx0LG4scixpLG8sYSl7X2l0ZXJDcmVhdGUobix0LHIpO3ZhciBzLGMsdSxsPWZ1bmN0aW9uKGUpe2lmKCFCVUdHWSYmZSBpbiBoKXJldHVybiBoW2VdO3N3aXRjaChlKXtjYXNlIEtFWVM6Y2FzZSBWQUxVRVM6cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMsZSl9fXJldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzLGUpfX0sZD10KyIgSXRlcmF0b3IiLGY9aT09VkFMVUVTLHA9ITEsaD1lLnByb3RvdHlwZSx2PWhbSVRFUkFUT1JdfHxoW0ZGX0lURVJBVE9SXXx8aSYmaFtpXSxnPXZ8fGwoaSksbT1pP2Y/bCgiZW50cmllcyIpOmc6dm9pZCAwLHk9IkFycmF5Ij09dCYmaC5lbnRyaWVzfHx2O2lmKHkmJih1PV9vYmplY3RHcG8oeS5jYWxsKG5ldyBlKSkpIT09T2JqZWN0LnByb3RvdHlwZSYmdS5uZXh0JiYoX3NldFRvU3RyaW5nVGFnKHUsZCwhMCksX2xpYnJhcnl8fCJmdW5jdGlvbiI9PXR5cGVvZiB1W0lURVJBVE9SXXx8X2hpZGUodSxJVEVSQVRPUixyZXR1cm5UaGlzKSksZiYmdiYmdi5uYW1lIT09VkFMVUVTJiYocD0hMCxnPWZ1bmN0aW9uKCl7cmV0dXJuIHYuY2FsbCh0aGlzKX0pLF9saWJyYXJ5JiYhYXx8IUJVR0dZJiYhcCYmaFtJVEVSQVRPUl18fF9oaWRlKGgsSVRFUkFUT1IsZyksX2l0ZXJhdG9yc1t0XT1nLF9pdGVyYXRvcnNbZF09cmV0dXJuVGhpcyxpKWlmKHM9e3ZhbHVlczpmP2c6bChWQUxVRVMpLGtleXM6bz9nOmwoS0VZUyksZW50cmllczptfSxhKWZvcihjIGluIHMpYyBpbiBofHxfcmVkZWZpbmUoaCxjLHNbY10pO2Vsc2UgX2V4cG9ydChfZXhwb3J0LlArX2V4cG9ydC5GKihCVUdHWXx8cCksdCxzKTtyZXR1cm4gc30sJGF0PV9zdHJpbmdBdCghMCk7X2l0ZXJEZWZpbmUoU3RyaW5nLCJTdHJpbmciLGZ1bmN0aW9uKGUpe3RoaXMuX3Q9U3RyaW5nKGUpLHRoaXMuX2k9MH0sZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXMuX3Qsbj10aGlzLl9pO3JldHVybiBuPj10Lmxlbmd0aD97dmFsdWU6dm9pZCAwLGRvbmU6ITB9OihlPSRhdCh0LG4pLHRoaXMuX2krPWUubGVuZ3RoLHt2YWx1ZTplLGRvbmU6ITF9KX0pO3ZhciBVTlNDT1BBQkxFUz1fd2tzKCJ1bnNjb3BhYmxlcyIpLEFycmF5UHJvdG89QXJyYXkucHJvdG90eXBlO251bGw9PUFycmF5UHJvdG9bVU5TQ09QQUJMRVNdJiZfaGlkZShBcnJheVByb3RvLFVOU0NPUEFCTEVTLHt9KTt2YXIgX2FkZFRvVW5zY29wYWJsZXM9ZnVuY3Rpb24oZSl7QXJyYXlQcm90b1tVTlNDT1BBQkxFU11bZV09ITB9LF9pdGVyU3RlcD1mdW5jdGlvbihlLHQpe3JldHVybnt2YWx1ZTp0LGRvbmU6ISFlfX0sZXM2X2FycmF5X2l0ZXJhdG9yPV9pdGVyRGVmaW5lKEFycmF5LCJBcnJheSIsZnVuY3Rpb24oZSx0KXt0aGlzLl90PV90b0lvYmplY3QoZSksdGhpcy5faT0wLHRoaXMuX2s9dH0sZnVuY3Rpb24oKXt2YXIgZT10aGlzLl90LHQ9dGhpcy5fayxuPXRoaXMuX2krKztyZXR1cm4hZXx8bj49ZS5sZW5ndGg/KHRoaXMuX3Q9dm9pZCAwLF9pdGVyU3RlcCgxKSk6X2l0ZXJTdGVwKDAsImtleXMiPT10P246InZhbHVlcyI9PXQ/ZVtuXTpbbixlW25dXSl9LCJ2YWx1ZXMiKTtfaXRlcmF0b3JzLkFyZ3VtZW50cz1faXRlcmF0b3JzLkFycmF5LF9hZGRUb1Vuc2NvcGFibGVzKCJrZXlzIiksX2FkZFRvVW5zY29wYWJsZXMoInZhbHVlcyIpLF9hZGRUb1Vuc2NvcGFibGVzKCJlbnRyaWVzIik7Zm9yKHZhciBJVEVSQVRPUiQxPV93a3MoIml0ZXJhdG9yIiksVE9fU1RSSU5HX1RBRz1fd2tzKCJ0b1N0cmluZ1RhZyIpLEFycmF5VmFsdWVzPV9pdGVyYXRvcnMuQXJyYXksRE9NSXRlcmFibGVzPXtDU1NSdWxlTGlzdDohMCxDU1NTdHlsZURlY2xhcmF0aW9uOiExLENTU1ZhbHVlTGlzdDohMSxDbGllbnRSZWN0TGlzdDohMSxET01SZWN0TGlzdDohMSxET01TdHJpbmdMaXN0OiExLERPTVRva2VuTGlzdDohMCxEYXRhVHJhbnNmZXJJdGVtTGlzdDohMSxGaWxlTGlzdDohMSxIVE1MQWxsQ29sbGVjdGlvbjohMSxIVE1MQ29sbGVjdGlvbjohMSxIVE1MRm9ybUVsZW1lbnQ6ITEsSFRNTFNlbGVjdEVsZW1lbnQ6ITEsTWVkaWFMaXN0OiEwLE1pbWVUeXBlQXJyYXk6ITEsTmFtZWROb2RlTWFwOiExLE5vZGVMaXN0OiEwLFBhaW50UmVxdWVzdExpc3Q6ITEsUGx1Z2luOiExLFBsdWdpbkFycmF5OiExLFNWR0xlbmd0aExpc3Q6ITEsU1ZHTnVtYmVyTGlzdDohMSxTVkdQYXRoU2VnTGlzdDohMSxTVkdQb2ludExpc3Q6ITEsU1ZHU3RyaW5nTGlzdDohMSxTVkdUcmFuc2Zvcm1MaXN0OiExLFNvdXJjZUJ1ZmZlckxpc3Q6ITEsU3R5bGVTaGVldExpc3Q6ITAsVGV4dFRyYWNrQ3VlTGlzdDohMSxUZXh0VHJhY2tMaXN0OiExLFRvdWNoTGlzdDohMX0sY29sbGVjdGlvbnM9X29iamVjdEtleXMoRE9NSXRlcmFibGVzKSxpPTA7aTxjb2xsZWN0aW9ucy5sZW5ndGg7aSsrKXt2YXIgTkFNRT1jb2xsZWN0aW9uc1tpXSxleHBsaWNpdD1ET01JdGVyYWJsZXNbTkFNRV0sQ29sbGVjdGlvbj1fZ2xvYmFsW05BTUVdLHByb3RvPUNvbGxlY3Rpb24mJkNvbGxlY3Rpb24ucHJvdG90eXBlLGtleTtpZihwcm90byYmKHByb3RvW0lURVJBVE9SJDFdfHxfaGlkZShwcm90byxJVEVSQVRPUiQxLEFycmF5VmFsdWVzKSxwcm90b1tUT19TVFJJTkdfVEFHXXx8X2hpZGUocHJvdG8sVE9fU1RSSU5HX1RBRyxOQU1FKSxfaXRlcmF0b3JzW05BTUVdPUFycmF5VmFsdWVzLGV4cGxpY2l0KSlmb3Ioa2V5IGluIGVzNl9hcnJheV9pdGVyYXRvcilwcm90b1trZXldfHxfcmVkZWZpbmUocHJvdG8sa2V5LGVzNl9hcnJheV9pdGVyYXRvcltrZXldLCEwKX12YXIgX2FuSW5zdGFuY2U9ZnVuY3Rpb24oZSx0LG4scil7aWYoIShlIGluc3RhbmNlb2YgdCl8fHZvaWQgMCE9PXImJnIgaW4gZSl0aHJvdyBUeXBlRXJyb3IobisiOiBpbmNvcnJlY3QgaW52b2NhdGlvbiEiKTtyZXR1cm4gZX0sX2l0ZXJDYWxsPWZ1bmN0aW9uKHQsZSxuLHIpe3RyeXtyZXR1cm4gcj9lKF9hbk9iamVjdChuKVswXSxuWzFdKTplKG4pfWNhdGNoKGUpe3ZhciBpPXQucmV0dXJuO3Rocm93IHZvaWQgMCE9PWkmJl9hbk9iamVjdChpLmNhbGwodCkpLGV9fSxJVEVSQVRPUiQyPV93a3MoIml0ZXJhdG9yIiksQXJyYXlQcm90byQxPUFycmF5LnByb3RvdHlwZSxfaXNBcnJheUl0ZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMCE9PWUmJihfaXRlcmF0b3JzLkFycmF5PT09ZXx8QXJyYXlQcm90byQxW0lURVJBVE9SJDJdPT09ZSl9LElURVJBVE9SJDM9X3drcygiaXRlcmF0b3IiKSxjb3JlX2dldEl0ZXJhdG9yTWV0aG9kPV9jb3JlLmdldEl0ZXJhdG9yTWV0aG9kPWZ1bmN0aW9uKGUpe2lmKG51bGwhPWUpcmV0dXJuIGVbSVRFUkFUT1IkM118fGVbIkBAaXRlcmF0b3IiXXx8X2l0ZXJhdG9yc1tfY2xhc3NvZihlKV19LF9mb3JPZj1jcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbihlKXt2YXIgZj17fSxwPXt9LHQ9ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG8sYSxzLGMsdT1pP2Z1bmN0aW9uKCl7cmV0dXJuIGV9OmNvcmVfZ2V0SXRlcmF0b3JNZXRob2QoZSksbD1fY3R4KG4scix0PzI6MSksZD0wO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB1KXRocm93IFR5cGVFcnJvcihlKyIgaXMgbm90IGl0ZXJhYmxlISIpO2lmKF9pc0FycmF5SXRlcih1KSl7Zm9yKG89X3RvTGVuZ3RoKGUubGVuZ3RoKTtkPG87ZCsrKWlmKChjPXQ/bChfYW5PYmplY3QoYT1lW2RdKVswXSxhWzFdKTpsKGVbZF0pKT09PWZ8fGM9PT1wKXJldHVybiBjfWVsc2UgZm9yKHM9dS5jYWxsKGUpOyEoYT1zLm5leHQoKSkuZG9uZTspaWYoKGM9X2l0ZXJDYWxsKHMsbCxhLnZhbHVlLHQpKT09PWZ8fGM9PT1wKXJldHVybiBjfTt0LkJSRUFLPWYsdC5SRVRVUk49cH0pLFNQRUNJRVM9X3drcygic3BlY2llcyIpLF9zcGVjaWVzQ29uc3RydWN0b3I9ZnVuY3Rpb24oZSx0KXt2YXIgbixyPV9hbk9iamVjdChlKS5jb25zdHJ1Y3RvcjtyZXR1cm4gdm9pZCAwPT09cnx8bnVsbD09KG49X2FuT2JqZWN0KHIpW1NQRUNJRVNdKT90Ol9hRnVuY3Rpb24obil9LF9pbnZva2U9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXZvaWQgMD09PW47c3dpdGNoKHQubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHI/ZSgpOmUuY2FsbChuKTtjYXNlIDE6cmV0dXJuIHI/ZSh0WzBdKTplLmNhbGwobix0WzBdKTtjYXNlIDI6cmV0dXJuIHI/ZSh0WzBdLHRbMV0pOmUuY2FsbChuLHRbMF0sdFsxXSk7Y2FzZSAzOnJldHVybiByP2UodFswXSx0WzFdLHRbMl0pOmUuY2FsbChuLHRbMF0sdFsxXSx0WzJdKTtjYXNlIDQ6cmV0dXJuIHI/ZSh0WzBdLHRbMV0sdFsyXSx0WzNdKTplLmNhbGwobix0WzBdLHRbMV0sdFsyXSx0WzNdKX1yZXR1cm4gZS5hcHBseShuLHQpfSxwcm9jZXNzJDI9X2dsb2JhbC5wcm9jZXNzLHNldFRhc2s9X2dsb2JhbC5zZXRJbW1lZGlhdGUsY2xlYXJUYXNrPV9nbG9iYWwuY2xlYXJJbW1lZGlhdGUsTWVzc2FnZUNoYW5uZWw9X2dsb2JhbC5NZXNzYWdlQ2hhbm5lbCxEaXNwYXRjaD1fZ2xvYmFsLkRpc3BhdGNoLGNvdW50ZXI9MCxxdWV1ZT17fSxPTlJFQURZU1RBVEVDSEFOR0U9Im9ucmVhZHlzdGF0ZWNoYW5nZSIsZGVmZXIsY2hhbm5lbCQxLHBvcnQscnVuPWZ1bmN0aW9uKCl7dmFyIGU9K3RoaXM7aWYocXVldWUuaGFzT3duUHJvcGVydHkoZSkpe3ZhciB0PXF1ZXVlW2VdO2RlbGV0ZSBxdWV1ZVtlXSx0KCl9fSxsaXN0ZW5lcj1mdW5jdGlvbihlKXtydW4uY2FsbChlLmRhdGEpfTtzZXRUYXNrJiZjbGVhclRhc2t8fChzZXRUYXNrPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1hcmd1bWVudHMsbj1bXSxyPTE7YXJndW1lbnRzLmxlbmd0aD5yOyluLnB1c2godFtyKytdKTtyZXR1cm4gcXVldWVbKytjb3VudGVyXT1mdW5jdGlvbigpe19pbnZva2UoImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpGdW5jdGlvbihlKSxuKX0sZGVmZXIoY291bnRlciksY291bnRlcn0sY2xlYXJUYXNrPWZ1bmN0aW9uKGUpe2RlbGV0ZSBxdWV1ZVtlXX0sInByb2Nlc3MiPT1fY29mKHByb2Nlc3MkMik/ZGVmZXI9ZnVuY3Rpb24oZSl7cHJvY2VzcyQyLm5leHRUaWNrKF9jdHgocnVuLGUsMSkpfTpEaXNwYXRjaCYmRGlzcGF0Y2gubm93P2RlZmVyPWZ1bmN0aW9uKGUpe0Rpc3BhdGNoLm5vdyhfY3R4KHJ1bixlLDEpKX06TWVzc2FnZUNoYW5uZWw/KGNoYW5uZWwkMT1uZXcgTWVzc2FnZUNoYW5uZWwscG9ydD1jaGFubmVsJDEucG9ydDIsY2hhbm5lbCQxLnBvcnQxLm9ubWVzc2FnZT1saXN0ZW5lcixkZWZlcj1fY3R4KHBvcnQucG9zdE1lc3NhZ2UscG9ydCwxKSk6X2dsb2JhbC5hZGRFdmVudExpc3RlbmVyJiYiZnVuY3Rpb24iPT10eXBlb2YgcG9zdE1lc3NhZ2UmJiFfZ2xvYmFsLmltcG9ydFNjcmlwdHM/KGRlZmVyPWZ1bmN0aW9uKGUpe19nbG9iYWwucG9zdE1lc3NhZ2UoZSsiIiwiKiIpfSxfZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGxpc3RlbmVyLCExKSk6ZGVmZXI9T05SRUFEWVNUQVRFQ0hBTkdFIGluIF9kb21DcmVhdGUoInNjcmlwdCIpP2Z1bmN0aW9uKGUpe19odG1sLmFwcGVuZENoaWxkKF9kb21DcmVhdGUoInNjcmlwdCIpKVtPTlJFQURZU1RBVEVDSEFOR0VdPWZ1bmN0aW9uKCl7X2h0bWwucmVtb3ZlQ2hpbGQodGhpcykscnVuLmNhbGwoZSl9fTpmdW5jdGlvbihlKXtzZXRUaW1lb3V0KF9jdHgocnVuLGUsMSksMCl9KTt2YXIgX3Rhc2s9e3NldDpzZXRUYXNrLGNsZWFyOmNsZWFyVGFza30sbWFjcm90YXNrPV90YXNrLnNldCxPYnNlcnZlcj1fZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXJ8fF9nbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcixwcm9jZXNzJDM9X2dsb2JhbC5wcm9jZXNzLFByb21pc2UkMT1fZ2xvYmFsLlByb21pc2UsaXNOb2RlJDE9InByb2Nlc3MiPT1fY29mKHByb2Nlc3MkMyksX21pY3JvdGFzaz1mdW5jdGlvbigpe3ZhciBuLHIsaSxlPWZ1bmN0aW9uKCl7dmFyIGUsdDtmb3IoaXNOb2RlJDEmJihlPXByb2Nlc3MkMy5kb21haW4pJiZlLmV4aXQoKTtuOyl7dD1uLmZuLG49bi5uZXh0O3RyeXt0KCl9Y2F0Y2goZSl7dGhyb3cgbj9pKCk6cj12b2lkIDAsZX19cj12b2lkIDAsZSYmZS5lbnRlcigpfTtpZihpc05vZGUkMSlpPWZ1bmN0aW9uKCl7cHJvY2VzcyQzLm5leHRUaWNrKGUpfTtlbHNlIGlmKCFPYnNlcnZlcnx8X2dsb2JhbC5uYXZpZ2F0b3ImJl9nbG9iYWwubmF2aWdhdG9yLnN0YW5kYWxvbmUpaWYoUHJvbWlzZSQxJiZQcm9taXNlJDEucmVzb2x2ZSl7dmFyIHQ9UHJvbWlzZSQxLnJlc29sdmUodm9pZCAwKTtpPWZ1bmN0aW9uKCl7dC50aGVuKGUpfX1lbHNlIGk9ZnVuY3Rpb24oKXttYWNyb3Rhc2suY2FsbChfZ2xvYmFsLGUpfTtlbHNle3ZhciBvPSEwLGE9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiIpO25ldyBPYnNlcnZlcihlKS5vYnNlcnZlKGEse2NoYXJhY3RlckRhdGE6ITB9KSxpPWZ1bmN0aW9uKCl7YS5kYXRhPW89IW99fXJldHVybiBmdW5jdGlvbihlKXt2YXIgdD17Zm46ZSxuZXh0OnZvaWQgMH07ciYmKHIubmV4dD10KSxufHwobj10LGkoKSkscj10fX07ZnVuY3Rpb24gUHJvbWlzZUNhcGFiaWxpdHkoZSl7dmFyIG4scjt0aGlzLnByb21pc2U9bmV3IGUoZnVuY3Rpb24oZSx0KXtpZih2b2lkIDAhPT1ufHx2b2lkIDAhPT1yKXRocm93IFR5cGVFcnJvcigiQmFkIFByb21pc2UgY29uc3RydWN0b3IiKTtuPWUscj10fSksdGhpcy5yZXNvbHZlPV9hRnVuY3Rpb24obiksdGhpcy5yZWplY3Q9X2FGdW5jdGlvbihyKX12YXIgZiQzPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoZSl9LF9uZXdQcm9taXNlQ2FwYWJpbGl0eT17ZjpmJDN9LF9wZXJmb3JtPWZ1bmN0aW9uKGUpe3RyeXtyZXR1cm57ZTohMSx2OmUoKX19Y2F0Y2goZSl7cmV0dXJue2U6ITAsdjplfX19LG5hdmlnYXRvciQxPV9nbG9iYWwubmF2aWdhdG9yLF91c2VyQWdlbnQ9bmF2aWdhdG9yJDEmJm5hdmlnYXRvciQxLnVzZXJBZ2VudHx8IiIsX3Byb21pc2VSZXNvbHZlPWZ1bmN0aW9uKGUsdCl7aWYoX2FuT2JqZWN0KGUpLF9pc09iamVjdCh0KSYmdC5jb25zdHJ1Y3Rvcj09PWUpcmV0dXJuIHQ7dmFyIG49X25ld1Byb21pc2VDYXBhYmlsaXR5LmYoZSk7cmV0dXJuKDAsbi5yZXNvbHZlKSh0KSxuLnByb21pc2V9LF9yZWRlZmluZUFsbD1mdW5jdGlvbihlLHQsbil7Zm9yKHZhciByIGluIHQpX3JlZGVmaW5lKGUscix0W3JdLG4pO3JldHVybiBlfSxTUEVDSUVTJDE9X3drcygic3BlY2llcyIpLF9zZXRTcGVjaWVzPWZ1bmN0aW9uKGUpe3ZhciB0PV9nbG9iYWxbZV07X2Rlc2NyaXB0b3JzJiZ0JiYhdFtTUEVDSUVTJDFdJiZfb2JqZWN0RHAuZih0LFNQRUNJRVMkMSx7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzfX0pfSxJVEVSQVRPUiQ0PV93a3MoIml0ZXJhdG9yIiksU0FGRV9DTE9TSU5HPSExO3RyeXt2YXIgcml0ZXI9WzddW0lURVJBVE9SJDRdKCk7cml0ZXIucmV0dXJuPWZ1bmN0aW9uKCl7U0FGRV9DTE9TSU5HPSEwfX1jYXRjaChlKXt9dmFyIF9pdGVyRGV0ZWN0PWZ1bmN0aW9uKGUsdCl7aWYoIXQmJiFTQUZFX0NMT1NJTkcpcmV0dXJuITE7dmFyIG49ITE7dHJ5e3ZhciByPVs3XSxpPXJbSVRFUkFUT1IkNF0oKTtpLm5leHQ9ZnVuY3Rpb24oKXtyZXR1cm57ZG9uZTpuPSEwfX0scltJVEVSQVRPUiQ0XT1mdW5jdGlvbigpe3JldHVybiBpfSxlKHIpfWNhdGNoKGUpe31yZXR1cm4gbn0sdGFzaz1fdGFzay5zZXQsbWljcm90YXNrPV9taWNyb3Rhc2soKSxQUk9NSVNFPSJQcm9taXNlIixUeXBlRXJyb3IkMT1fZ2xvYmFsLlR5cGVFcnJvcixwcm9jZXNzJDE9X2dsb2JhbC5wcm9jZXNzLHZlcnNpb25zPXByb2Nlc3MkMSYmcHJvY2VzcyQxLnZlcnNpb25zLHY4PXZlcnNpb25zJiZ2ZXJzaW9ucy52OHx8IiIsJFByb21pc2U9X2dsb2JhbFtQUk9NSVNFXSxpc05vZGU9InByb2Nlc3MiPT1fY2xhc3NvZihwcm9jZXNzJDEpLGVtcHR5PWZ1bmN0aW9uKCl7fSxJbnRlcm5hbCxuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHksT3duUHJvbWlzZUNhcGFiaWxpdHksV3JhcHBlcixuZXdQcm9taXNlQ2FwYWJpbGl0eT1uZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHk9X25ld1Byb21pc2VDYXBhYmlsaXR5LmYsVVNFX05BVElWRT0hIWZ1bmN0aW9uKCl7dHJ5e3ZhciBlPSRQcm9taXNlLnJlc29sdmUoMSksdD0oZS5jb25zdHJ1Y3Rvcj17fSlbX3drcygic3BlY2llcyIpXT1mdW5jdGlvbihlKXtlKGVtcHR5LGVtcHR5KX07cmV0dXJuKGlzTm9kZXx8ImZ1bmN0aW9uIj09dHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCkmJmUudGhlbihlbXB0eSlpbnN0YW5jZW9mIHQmJjAhPT12OC5pbmRleE9mKCI2LjYiKSYmLTE9PT1fdXNlckFnZW50LmluZGV4T2YoIkNocm9tZS82NiIpfWNhdGNoKGUpe319KCksaXNUaGVuYWJsZT1mdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4hKCFfaXNPYmplY3QoZSl8fCJmdW5jdGlvbiIhPXR5cGVvZih0PWUudGhlbikpJiZ0fSxub3RpZnk9ZnVuY3Rpb24obCxuKXtpZighbC5fbil7bC5fbj0hMDt2YXIgcj1sLl9jO21pY3JvdGFzayhmdW5jdGlvbigpe2Zvcih2YXIgYz1sLl92LHU9MT09bC5fcyxlPTAsdD1mdW5jdGlvbihlKXt2YXIgdCxuLHIsaT11P2Uub2s6ZS5mYWlsLG89ZS5yZXNvbHZlLGE9ZS5yZWplY3Qscz1lLmRvbWFpbjt0cnl7aT8odXx8KDI9PWwuX2gmJm9uSGFuZGxlVW5oYW5kbGVkKGwpLGwuX2g9MSksITA9PT1pP3Q9YzoocyYmcy5lbnRlcigpLHQ9aShjKSxzJiYocy5leGl0KCkscj0hMCkpLHQ9PT1lLnByb21pc2U/YShUeXBlRXJyb3IkMSgiUHJvbWlzZS1jaGFpbiBjeWNsZSIpKToobj1pc1RoZW5hYmxlKHQpKT9uLmNhbGwodCxvLGEpOm8odCkpOmEoYyl9Y2F0Y2goZSl7cyYmIXImJnMuZXhpdCgpLGEoZSl9fTtyLmxlbmd0aD5lOyl0KHJbZSsrXSk7bC5fYz1bXSxsLl9uPSExLG4mJiFsLl9oJiZvblVuaGFuZGxlZChsKX0pfX0sb25VbmhhbmRsZWQ9ZnVuY3Rpb24obyl7dGFzay5jYWxsKF9nbG9iYWwsZnVuY3Rpb24oKXt2YXIgZSx0LG4scj1vLl92LGk9aXNVbmhhbmRsZWQobyk7aWYoaSYmKGU9X3BlcmZvcm0oZnVuY3Rpb24oKXtpc05vZGU/cHJvY2VzcyQxLmVtaXQoInVuaGFuZGxlZFJlamVjdGlvbiIscixvKToodD1fZ2xvYmFsLm9udW5oYW5kbGVkcmVqZWN0aW9uKT90KHtwcm9taXNlOm8scmVhc29uOnJ9KToobj1fZ2xvYmFsLmNvbnNvbGUpJiZuLmVycm9yJiZuLmVycm9yKCJVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24iLHIpfSksby5faD1pc05vZGV8fGlzVW5oYW5kbGVkKG8pPzI6MSksby5fYT12b2lkIDAsaSYmZS5lKXRocm93IGUudn0pfSxpc1VuaGFuZGxlZD1mdW5jdGlvbihlKXtyZXR1cm4gMSE9PWUuX2gmJjA9PT0oZS5fYXx8ZS5fYykubGVuZ3RofSxvbkhhbmRsZVVuaGFuZGxlZD1mdW5jdGlvbih0KXt0YXNrLmNhbGwoX2dsb2JhbCxmdW5jdGlvbigpe3ZhciBlO2lzTm9kZT9wcm9jZXNzJDEuZW1pdCgicmVqZWN0aW9uSGFuZGxlZCIsdCk6KGU9X2dsb2JhbC5vbnJlamVjdGlvbmhhbmRsZWQpJiZlKHtwcm9taXNlOnQscmVhc29uOnQuX3Z9KX0pfSwkcmVqZWN0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dC5fZHx8KHQuX2Q9ITAsKHQ9dC5fd3x8dCkuX3Y9ZSx0Ll9zPTIsdC5fYXx8KHQuX2E9dC5fYy5zbGljZSgpKSxub3RpZnkodCwhMCkpfSwkcmVzb2x2ZT1mdW5jdGlvbihlKXt2YXIgbixyPXRoaXM7aWYoIXIuX2Qpe3IuX2Q9ITAscj1yLl93fHxyO3RyeXtpZihyPT09ZSl0aHJvdyBUeXBlRXJyb3IkMSgiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGYiKTsobj1pc1RoZW5hYmxlKGUpKT9taWNyb3Rhc2soZnVuY3Rpb24oKXt2YXIgdD17X3c6cixfZDohMX07dHJ5e24uY2FsbChlLF9jdHgoJHJlc29sdmUsdCwxKSxfY3R4KCRyZWplY3QsdCwxKSl9Y2F0Y2goZSl7JHJlamVjdC5jYWxsKHQsZSl9fSk6KHIuX3Y9ZSxyLl9zPTEsbm90aWZ5KHIsITEpKX1jYXRjaChlKXskcmVqZWN0LmNhbGwoe193OnIsX2Q6ITF9LGUpfX19O1VTRV9OQVRJVkV8fCgkUHJvbWlzZT1mdW5jdGlvbihlKXtfYW5JbnN0YW5jZSh0aGlzLCRQcm9taXNlLFBST01JU0UsIl9oIiksX2FGdW5jdGlvbihlKSxJbnRlcm5hbC5jYWxsKHRoaXMpO3RyeXtlKF9jdHgoJHJlc29sdmUsdGhpcywxKSxfY3R4KCRyZWplY3QsdGhpcywxKSl9Y2F0Y2goZSl7JHJlamVjdC5jYWxsKHRoaXMsZSl9fSxJbnRlcm5hbD1mdW5jdGlvbihlKXt0aGlzLl9jPVtdLHRoaXMuX2E9dm9pZCAwLHRoaXMuX3M9MCx0aGlzLl9kPSExLHRoaXMuX3Y9dm9pZCAwLHRoaXMuX2g9MCx0aGlzLl9uPSExfSxJbnRlcm5hbC5wcm90b3R5cGU9X3JlZGVmaW5lQWxsKCRQcm9taXNlLnByb3RvdHlwZSx7dGhlbjpmdW5jdGlvbihlLHQpe3ZhciBuPW5ld1Byb21pc2VDYXBhYmlsaXR5KF9zcGVjaWVzQ29uc3RydWN0b3IodGhpcywkUHJvbWlzZSkpO3JldHVybiBuLm9rPSJmdW5jdGlvbiIhPXR5cGVvZiBlfHxlLG4uZmFpbD0iZnVuY3Rpb24iPT10eXBlb2YgdCYmdCxuLmRvbWFpbj1pc05vZGU/cHJvY2VzcyQxLmRvbWFpbjp2b2lkIDAsdGhpcy5fYy5wdXNoKG4pLHRoaXMuX2EmJnRoaXMuX2EucHVzaChuKSx0aGlzLl9zJiZub3RpZnkodGhpcywhMSksbi5wcm9taXNlfSxjYXRjaDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50aGVuKHZvaWQgMCxlKX19KSxPd25Qcm9taXNlQ2FwYWJpbGl0eT1mdW5jdGlvbigpe3ZhciBlPW5ldyBJbnRlcm5hbDt0aGlzLnByb21pc2U9ZSx0aGlzLnJlc29sdmU9X2N0eCgkcmVzb2x2ZSxlLDEpLHRoaXMucmVqZWN0PV9jdHgoJHJlamVjdCxlLDEpfSxfbmV3UHJvbWlzZUNhcGFiaWxpdHkuZj1uZXdQcm9taXNlQ2FwYWJpbGl0eT1mdW5jdGlvbihlKXtyZXR1cm4gZT09PSRQcm9taXNlfHxlPT09V3JhcHBlcj9uZXcgT3duUHJvbWlzZUNhcGFiaWxpdHkoZSk6bmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5KGUpfSksX2V4cG9ydChfZXhwb3J0LkcrX2V4cG9ydC5XK19leHBvcnQuRiohVVNFX05BVElWRSx7UHJvbWlzZTokUHJvbWlzZX0pLF9zZXRUb1N0cmluZ1RhZygkUHJvbWlzZSxQUk9NSVNFKSxfc2V0U3BlY2llcyhQUk9NSVNFKSxXcmFwcGVyPV9jb3JlW1BST01JU0VdLF9leHBvcnQoX2V4cG9ydC5TK19leHBvcnQuRiohVVNFX05BVElWRSxQUk9NSVNFLHtyZWplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3UHJvbWlzZUNhcGFiaWxpdHkodGhpcyk7cmV0dXJuKDAsdC5yZWplY3QpKGUpLHQucHJvbWlzZX19KSxfZXhwb3J0KF9leHBvcnQuUytfZXhwb3J0LkYqKF9saWJyYXJ5fHwhVVNFX05BVElWRSksUFJPTUlTRSx7cmVzb2x2ZTpmdW5jdGlvbihlKXtyZXR1cm4gX3Byb21pc2VSZXNvbHZlKF9saWJyYXJ5JiZ0aGlzPT09V3JhcHBlcj8kUHJvbWlzZTp0aGlzLGUpfX0pLF9leHBvcnQoX2V4cG9ydC5TK19leHBvcnQuRiohKFVTRV9OQVRJVkUmJl9pdGVyRGV0ZWN0KGZ1bmN0aW9uKGUpeyRQcm9taXNlLmFsbChlKS5jYXRjaChlbXB0eSl9KSksUFJPTUlTRSx7YWxsOmZ1bmN0aW9uKGUpe3ZhciBhPXRoaXMsdD1uZXdQcm9taXNlQ2FwYWJpbGl0eShhKSxzPXQucmVzb2x2ZSxjPXQucmVqZWN0LG49X3BlcmZvcm0oZnVuY3Rpb24oKXt2YXIgcj1bXSxpPTAsbz0xO19mb3JPZihlLCExLGZ1bmN0aW9uKGUpe3ZhciB0PWkrKyxuPSExO3IucHVzaCh2b2lkIDApLG8rKyxhLnJlc29sdmUoZSkudGhlbihmdW5jdGlvbihlKXtufHwobj0hMCxyW3RdPWUsLS1vfHxzKHIpKX0sYyl9KSwtLW98fHMocil9KTtyZXR1cm4gbi5lJiZjKG4udiksdC5wcm9taXNlfSxyYWNlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1uZXdQcm9taXNlQ2FwYWJpbGl0eSh0KSxyPW4ucmVqZWN0LGk9X3BlcmZvcm0oZnVuY3Rpb24oKXtfZm9yT2YoZSwhMSxmdW5jdGlvbihlKXt0LnJlc29sdmUoZSkudGhlbihuLnJlc29sdmUscil9KX0pO3JldHVybiBpLmUmJnIoaS52KSxuLnByb21pc2V9fSk7dmFyICRpbmNsdWRlcz1fYXJyYXlJbmNsdWRlcyghMCk7X2V4cG9ydChfZXhwb3J0LlAsIkFycmF5Iix7aW5jbHVkZXM6ZnVuY3Rpb24oZSl7cmV0dXJuICRpbmNsdWRlcyh0aGlzLGUsMTxhcmd1bWVudHMubGVuZ3RoP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pLF9hZGRUb1Vuc2NvcGFibGVzKCJpbmNsdWRlcyIpO3ZhciBpc0VudW09X29iamVjdFBpZS5mLF9vYmplY3RUb0FycmF5PWZ1bmN0aW9uKHMpe3JldHVybiBmdW5jdGlvbihlKXtmb3IodmFyIHQsbj1fdG9Jb2JqZWN0KGUpLHI9X29iamVjdEtleXMobiksaT1yLmxlbmd0aCxvPTAsYT1bXTtvPGk7KWlzRW51bS5jYWxsKG4sdD1yW28rK10pJiZhLnB1c2gocz9bdCxuW3RdXTpuW3RdKTtyZXR1cm4gYX19LCR2YWx1ZXM9X29iamVjdFRvQXJyYXkoITEpO19leHBvcnQoX2V4cG9ydC5TLCJPYmplY3QiLHt2YWx1ZXM6ZnVuY3Rpb24oZSl7cmV0dXJuICR2YWx1ZXMoZSl9fSk7dmFyIG9yaWdpbmFsQ29uc29sZT1nbG9iYWwuY29uc29sZTtmdW5jdGlvbiBzZXROYXRpdmVDb25zb2xlKCl7aWYoZ2VuZXJhdGVMZXZlbE1hcCgpLGdsb2JhbC5XWEVudmlyb25tZW50JiYiV2ViIiE9PWdsb2JhbC5XWEVudmlyb25tZW50LnBsYXRmb3JtKWdsb2JhbC5jb25zb2xlPXtkZWJ1ZzpmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtjaGVja0xldmVsKCJkZWJ1ZyIpJiZnbG9iYWwubmF0aXZlTG9nLmFwcGx5KGdsb2JhbCxmb3JtYXQoZSkuY29uY2F0KFsiX19ERUJVRyJdKSl9LGxvZzpmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtjaGVja0xldmVsKCJsb2ciKSYmZ2xvYmFsLm5hdGl2ZUxvZy5hcHBseShnbG9iYWwsZm9ybWF0KGUpLmNvbmNhdChbIl9fTE9HIl0pKX0saW5mbzpmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtjaGVja0xldmVsKCJpbmZvIikmJmdsb2JhbC5uYXRpdmVMb2cuYXBwbHkoZ2xvYmFsLGZvcm1hdChlKS5jb25jYXQoWyJfX0lORk8iXSkpfSx3YXJuOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2NoZWNrTGV2ZWwoIndhcm4iKSYmZ2xvYmFsLm5hdGl2ZUxvZy5hcHBseShnbG9iYWwsZm9ybWF0KGUpLmNvbmNhdChbIl9fV0FSTiJdKSl9LGVycm9yOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2NoZWNrTGV2ZWwoImVycm9yIikmJmdsb2JhbC5uYXRpdmVMb2cuYXBwbHkoZ2xvYmFsLGZvcm1hdChlKS5jb25jYXQoWyJfX0VSUk9SIl0pKX19O2Vsc2V7dmFyIGU9Y29uc29sZS5kZWJ1Zyx0PWNvbnNvbGUubG9nLG49Y29uc29sZS5pbmZvLHI9Y29uc29sZS53YXJuLGk9Y29uc29sZS5lcnJvcjtjb25zb2xlLl9fb3JpX189e2RlYnVnOmUsbG9nOnQsaW5mbzpuLHdhcm46cixlcnJvcjppfSxjb25zb2xlLmRlYnVnPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2NoZWNrTGV2ZWwoImRlYnVnIikmJmNvbnNvbGUuX19vcmlfXy5kZWJ1Zy5hcHBseShjb25zb2xlLGUpfSxjb25zb2xlLmxvZz1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PWFyZ3VtZW50cy5sZW5ndGg7dC0tOyllW3RdPWFyZ3VtZW50c1t0XTtjaGVja0xldmVsKCJsb2ciKSYmY29uc29sZS5fX29yaV9fLmxvZy5hcHBseShjb25zb2xlLGUpfSxjb25zb2xlLmluZm89ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07Y2hlY2tMZXZlbCgiaW5mbyIpJiZjb25zb2xlLl9fb3JpX18uaW5mby5hcHBseShjb25zb2xlLGUpfSxjb25zb2xlLndhcm49ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07Y2hlY2tMZXZlbCgid2FybiIpJiZjb25zb2xlLl9fb3JpX18ud2Fybi5hcHBseShjb25zb2xlLGUpfSxjb25zb2xlLmVycm9yPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9YXJndW1lbnRzLmxlbmd0aDt0LS07KWVbdF09YXJndW1lbnRzW3RdO2NoZWNrTGV2ZWwoImVycm9yIikmJmNvbnNvbGUuX19vcmlfXy5lcnJvci5hcHBseShjb25zb2xlLGUpfX19ZnVuY3Rpb24gZm9ybWF0KGUpe3JldHVybiBlLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZT0iW29iamVjdCBvYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS50b0xvd2VyQ2FzZSgpP0pTT04uc3RyaW5naWZ5KGUpOlN0cmluZyhlKX0pfXZhciBvcmlnaW5hbFNldFRpbWVvdXQ9Z2xvYmFsLnNldFRpbWVvdXQsc2V0VGltZW91dE5hdGl2ZT1nbG9iYWwuc2V0VGltZW91dE5hdGl2ZTtmdW5jdGlvbiBzZXROYXRpdmVUaW1lcigpe2lmKHZvaWQgMD09PXNldFRpbWVvdXQmJiJmdW5jdGlvbiI9PXR5cGVvZiBzZXRUaW1lb3V0TmF0aXZlKXt2YXIgbj17fSxyPTA7Z2xvYmFsLnNldFRpbWVvdXQ9ZnVuY3Rpb24oZSx0KXtuWysrcl09ZSxzZXRUaW1lb3V0TmF0aXZlKHIudG9TdHJpbmcoKSx0KX0sZ2xvYmFsLnNldFRpbWVvdXRDYWxsYmFjaz1mdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgbltlXSYmKG5bZV0oKSxkZWxldGUgbltlXSl9fX1zZXROYXRpdmVUaW1lcigpLCJ1bmRlZmluZWQiPT10eXBlb2YgV1hFbnZpcm9ubWVudHx8V1hFbnZpcm9ubWVudC5fX2VuYWJsZV9uYXRpdmVfcHJvbWlzZV9fO3ZhciBmYWN0b3J5PWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKGUpe2UuZXhwb3J0cz1mdW5jdGlvbihlLGEsdCl7dmFyIF89T2JqZWN0LmZyZWV6ZSh7fSk7ZnVuY3Rpb24gRShlKXtyZXR1cm4gbnVsbD09ZX1mdW5jdGlvbiBBKGUpe3JldHVybiBudWxsIT1lfWZ1bmN0aW9uIEkoZSl7cmV0dXJuITA9PT1lfWZ1bmN0aW9uICQoZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlfHwibnVtYmVyIj09dHlwZW9mIGV8fCJzeW1ib2wiPT10eXBlb2YgZXx8ImJvb2xlYW4iPT10eXBlb2YgZX1mdW5jdGlvbiBiKGUpe3JldHVybiBudWxsIT09ZSYmIm9iamVjdCI9PXR5cGVvZiBlfXZhciByPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gZChlKXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PXIuY2FsbChlKX1mdW5jdGlvbiBpKGUpe3ZhciB0PXBhcnNlRmxvYXQoU3RyaW5nKGUpKTtyZXR1cm4gMDw9dCYmTWF0aC5mbG9vcih0KT09PXQmJmlzRmluaXRlKGUpfWZ1bmN0aW9uIHcoZSl7cmV0dXJuIEEoZSkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnRoZW4mJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNhdGNofWZ1bmN0aW9uIG4oZSl7cmV0dXJuIG51bGw9PWU/IiI6QXJyYXkuaXNBcnJheShlKXx8ZChlKSYmZS50b1N0cmluZz09PXI/SlNPTi5zdHJpbmdpZnkoZSxudWxsLDIpOlN0cmluZyhlKX1mdW5jdGlvbiBvKGUpe3ZhciB0PXBhcnNlRmxvYXQoZSk7cmV0dXJuIGlzTmFOKHQpP2U6dH1mdW5jdGlvbiBzKGUsdCl7Zm9yKHZhciBuPU9iamVjdC5jcmVhdGUobnVsbCkscj1lLnNwbGl0KCIsIiksaT0wO2k8ci5sZW5ndGg7aSsrKW5bcltpXV09ITA7cmV0dXJuIHQ/ZnVuY3Rpb24oZSl7cmV0dXJuIG5bZS50b0xvd2VyQ2FzZSgpXX06ZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV19fXMoInNsb3QsY29tcG9uZW50IiwhMCk7dmFyIGw9cygia2V5LHJlZixzbG90LHNsb3Qtc2NvcGUsaXMiKTtmdW5jdGlvbiBrKGUsdCl7aWYoZS5sZW5ndGgpe3ZhciBuPWUuaW5kZXhPZih0KTtpZigtMTxuKXJldHVybiBlLnNwbGljZShuLDEpfX12YXIgYz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIGYoZSx0KXtyZXR1cm4gYy5jYWxsKGUsdCl9ZnVuY3Rpb24gdSh0KXt2YXIgbj1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbltlXXx8KG5bZV09dChlKSl9fXZhciBwPS8tKFx3KS9nLGg9dShmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKHAsZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD90LnRvVXBwZXJDYXNlKCk6IiJ9KX0pLHY9dShmdW5jdGlvbihlKXtyZXR1cm4gZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnNsaWNlKDEpfSksZz0vXEIoW0EtWl0pL2csUz11KGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoZywiLSQxIikudG9Mb3dlckNhc2UoKX0pO3ZhciBtPUZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kP2Z1bmN0aW9uKGUsdCl7cmV0dXJuIGUuYmluZCh0KX06ZnVuY3Rpb24obixyKXtmdW5jdGlvbiBlKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIHQ/MTx0P24uYXBwbHkocixhcmd1bWVudHMpOm4uY2FsbChyLGUpOm4uY2FsbChyKX1yZXR1cm4gZS5fbGVuZ3RoPW4ubGVuZ3RoLGV9O2Z1bmN0aW9uIHkoZSx0KXt0PXR8fDA7Zm9yKHZhciBuPWUubGVuZ3RoLXQscj1uZXcgQXJyYXkobik7bi0tOylyW25dPWVbbit0XTtyZXR1cm4gcn1mdW5jdGlvbiBOKGUsdCl7Zm9yKHZhciBuIGluIHQpZVtuXT10W25dO3JldHVybiBlfWZ1bmN0aW9uIHgoZSl7Zm9yKHZhciB0PXt9LG49MDtuPGUubGVuZ3RoO24rKyllW25dJiZOKHQsZVtuXSk7cmV0dXJuIHR9ZnVuY3Rpb24gQihlLHQsbil7fXZhciBDPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4hMX0sVD1mdW5jdGlvbihlKXtyZXR1cm4gZX07ZnVuY3Rpb24gTyh0LG4pe2lmKHQ9PT1uKXJldHVybiEwO3ZhciBlPWIodCkscj1iKG4pO2lmKCFlfHwhcilyZXR1cm4hZSYmIXImJlN0cmluZyh0KT09PVN0cmluZyhuKTt0cnl7dmFyIGk9QXJyYXkuaXNBcnJheSh0KSxvPUFycmF5LmlzQXJyYXkobik7aWYoaSYmbylyZXR1cm4gdC5sZW5ndGg9PT1uLmxlbmd0aCYmdC5ldmVyeShmdW5jdGlvbihlLHQpe3JldHVybiBPKGUsblt0XSl9KTtpZih0IGluc3RhbmNlb2YgRGF0ZSYmbiBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIHQuZ2V0VGltZSgpPT09bi5nZXRUaW1lKCk7aWYoaXx8bylyZXR1cm4hMTt2YXIgYT1PYmplY3Qua2V5cyh0KSxzPU9iamVjdC5rZXlzKG4pO3JldHVybiBhLmxlbmd0aD09PXMubGVuZ3RoJiZhLmV2ZXJ5KGZ1bmN0aW9uKGUpe3JldHVybiBPKHRbZV0sbltlXSl9KX1jYXRjaChlKXtyZXR1cm4hMX19ZnVuY3Rpb24gUChlLHQpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKWlmKE8oZVtuXSx0KSlyZXR1cm4gbjtyZXR1cm4tMX1mdW5jdGlvbiBEKGUpe3ZhciB0PSExO3JldHVybiBmdW5jdGlvbigpe3R8fCh0PSEwLGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX19dmFyIE09ImRhdGEtc2VydmVyLXJlbmRlcmVkIixqPVsiY29tcG9uZW50IiwiZGlyZWN0aXZlIiwiZmlsdGVyIl0sTD1bImJlZm9yZUNyZWF0ZSIsImNyZWF0ZWQiLCJiZWZvcmVNb3VudCIsIm1vdW50ZWQiLCJiZWZvcmVVcGRhdGUiLCJ1cGRhdGVkIiwiYmVmb3JlRGVzdHJveSIsImRlc3Ryb3llZCIsImFjdGl2YXRlZCIsImRlYWN0aXZhdGVkIiwiZXJyb3JDYXB0dXJlZCIsInNlcnZlclByZWZldGNoIl0sUj17b3B0aW9uTWVyZ2VTdHJhdGVnaWVzOk9iamVjdC5jcmVhdGUobnVsbCksc2lsZW50OiExLHByb2R1Y3Rpb25UaXA6ITEsZGV2dG9vbHM6ITEscGVyZm9ybWFuY2U6ITEsZXJyb3JIYW5kbGVyOm51bGwsd2FybkhhbmRsZXI6bnVsbCxpZ25vcmVkRWxlbWVudHM6W10sa2V5Q29kZXM6T2JqZWN0LmNyZWF0ZShudWxsKSxpc1Jlc2VydmVkVGFnOkMsaXNSZXNlcnZlZEF0dHI6Qyxpc1Vua25vd25FbGVtZW50OkMsZ2V0VGFnTmFtZXNwYWNlOkIscGFyc2VQbGF0Zm9ybVRhZ05hbWU6VCxtdXN0VXNlUHJvcDpDLGFzeW5jOiEwLF9saWZlY3ljbGVIb29rczpMfTtmdW5jdGlvbiBGKGUsdCxuLHIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse3ZhbHVlOm4sZW51bWVyYWJsZTohIXIsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9dmFyIHo9bmV3IFJlZ0V4cCgiW14iKy9hLXpBLVpcdTAwQjdcdTAwQzAtXHUwMEQ2XHUwMEQ4LVx1MDBGNlx1MDBGOC1cdTAzN0RcdTAzN0YtXHUxRkZGXHUyMDBDLVx1MjAwRFx1MjAzRi1cdTIwNDBcdTIwNzAtXHUyMThGXHUyQzAwLVx1MkZFRlx1MzAwMS1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZGRC8uc291cmNlKyIuJF9cXGRdIik7dmFyIFUsVj0iX19wcm90b19fImlue30scT0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyxXPSJ1bmRlZmluZWQiIT10eXBlb2YgV1hFbnZpcm9ubWVudCYmISFXWEVudmlyb25tZW50LnBsYXRmb3JtLEg9VyYmV1hFbnZpcm9ubWVudC5wbGF0Zm9ybS50b0xvd2VyQ2FzZSgpLEc9cSYmd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSxYPUcmJi9tc2llfHRyaWRlbnQvLnRlc3QoRyksWT1HJiYwPEcuaW5kZXhPZigibXNpZSA5LjAiKSxKPUcmJjA8Ry5pbmRleE9mKCJlZGdlLyIpLEs9KEcmJkcuaW5kZXhPZigiYW5kcm9pZCIpLEcmJi9pcGhvbmV8aXBhZHxpcG9kfGlvcy8udGVzdChHKSxHJiYvY2hyb21lXC9cZCsvLnRlc3QoRyksRyYmL3BoYW50b21qcy8udGVzdChHKSxHJiZHLm1hdGNoKC9maXJlZm94XC8oXGQrKS8pLHt9LndhdGNoKTtpZihxKXRyeXt2YXIgWj17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoWiwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe319KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdC1wYXNzaXZlIixudWxsLFopfWNhdGNoKGUpe312YXIgUT1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT1VJiYoVT0hcSYmIVcmJnZvaWQgMCE9PWdsb2JhbCYmKGdsb2JhbC5wcm9jZXNzJiYic2VydmVyIj09PWdsb2JhbC5wcm9jZXNzLmVudi5WVUVfRU5WKSksVX0sZWU9cSYmd2luZG93Ll9fVlVFX0RFVlRPT0xTX0dMT0JBTF9IT09LX187ZnVuY3Rpb24gdGUoZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUmJi9uYXRpdmUgY29kZS8udGVzdChlLnRvU3RyaW5nKCkpfXZhciBuZSxyZT0idW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmdGUoU3ltYm9sKSYmInVuZGVmaW5lZCIhPXR5cGVvZiBSZWZsZWN0JiZ0ZShSZWZsZWN0Lm93bktleXMpO25lPSJ1bmRlZmluZWQiIT10eXBlb2YgU2V0JiZ0ZShTZXQpP1NldDpmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt0aGlzLnNldD1PYmplY3QuY3JlYXRlKG51bGwpfXJldHVybiBlLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24oZSl7cmV0dXJuITA9PT10aGlzLnNldFtlXX0sZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGUpe3RoaXMuc2V0W2VdPSEwfSxlLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuc2V0PU9iamVjdC5jcmVhdGUobnVsbCl9LGV9KCk7dmFyIGllPUIsb2U9MCxhZT1mdW5jdGlvbigpe3RoaXMuaWQ9dm9pZCAwIT09dD90LnVpZCsrOm9lKyssdGhpcy5zdWJzPVtdfTtmdW5jdGlvbiBzZShlKXthZS5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2sucHVzaChlKSxhZS5TaGFyZWRPYmplY3QudGFyZ2V0PWV9ZnVuY3Rpb24gY2UoKXthZS5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2sucG9wKCksYWUuU2hhcmVkT2JqZWN0LnRhcmdldD1hZS5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2tbYWUuU2hhcmVkT2JqZWN0LnRhcmdldFN0YWNrLmxlbmd0aC0xXX1hZS5wcm90b3R5cGUuYWRkU3ViPWZ1bmN0aW9uKGUpe3RoaXMuc3Vicy5wdXNoKGUpfSxhZS5wcm90b3R5cGUucmVtb3ZlU3ViPWZ1bmN0aW9uKGUpe2sodGhpcy5zdWJzLGUpfSxhZS5wcm90b3R5cGUuZGVwZW5kPWZ1bmN0aW9uKCl7YWUuU2hhcmVkT2JqZWN0LnRhcmdldCYmYWUuU2hhcmVkT2JqZWN0LnRhcmdldC5hZGREZXAodGhpcyl9LGFlLnByb3RvdHlwZS5ub3RpZnk9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5zdWJzLnNsaWNlKCksdD0wLG49ZS5sZW5ndGg7dDxuO3QrKyllW3RdLnVwZGF0ZSgpfSxhZS5TaGFyZWRPYmplY3Q9dm9pZCAwIT09dD90Ont9LGFlLlNoYXJlZE9iamVjdC50YXJnZXQ9bnVsbCxhZS5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2s9W107dmFyIHVlPWZ1bmN0aW9uKGUsdCxuLHIsaSxvLGEscyl7dCYmQXJyYXkuaXNBcnJheSh0LmNsYXNzKSYmKHQuY2xhc3M9dC5jbGFzcy5zbGljZSgwKSksdGhpcy50YWc9ZSx0aGlzLmRhdGE9dCx0aGlzLmNoaWxkcmVuPW4sdGhpcy50ZXh0PXIsdGhpcy5lbG09aSx0aGlzLm5zPXZvaWQgMCx0aGlzLmNvbnRleHQ9byx0aGlzLmZuQ29udGV4dD12b2lkIDAsdGhpcy5mbk9wdGlvbnM9dm9pZCAwLHRoaXMuZm5TY29wZUlkPXZvaWQgMCx0aGlzLmtleT10JiZ0LmtleSx0aGlzLmNvbXBvbmVudE9wdGlvbnM9YSx0aGlzLmNvbXBvbmVudEluc3RhbmNlPXZvaWQgMCx0aGlzLnBhcmVudD12b2lkIDAsdGhpcy5yYXc9ITEsdGhpcy5pc1N0YXRpYz0hMSx0aGlzLmlzUm9vdEluc2VydD0hMCx0aGlzLmlzQ29tbWVudD0hMSx0aGlzLmlzQ2xvbmVkPSExLHRoaXMuaXNPbmNlPSExLHRoaXMuYXN5bmNGYWN0b3J5PXMsdGhpcy5hc3luY01ldGE9dm9pZCAwLHRoaXMuaXNBc3luY1BsYWNlaG9sZGVyPSExfSxsZT17Y2hpbGQ6e2NvbmZpZ3VyYWJsZTohMH19O2xlLmNoaWxkLmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbXBvbmVudEluc3RhbmNlfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh1ZS5wcm90b3R5cGUsbGUpO3ZhciBkZT1mdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT0iIik7dmFyIHQ9bmV3IHVlO3JldHVybiB0LnRleHQ9ZSx0LmlzQ29tbWVudD0hMCx0fTtmdW5jdGlvbiBmZShlKXtyZXR1cm4gbmV3IHVlKHZvaWQgMCx2b2lkIDAsdm9pZCAwLFN0cmluZyhlKSl9ZnVuY3Rpb24gcGUoZSl7dmFyIHQ9bmV3IHVlKGUudGFnLGUuZGF0YSxlLmNoaWxkcmVuJiZlLmNoaWxkcmVuLnNsaWNlKCksZS50ZXh0LGUuZWxtLGUuY29udGV4dCxlLmNvbXBvbmVudE9wdGlvbnMsZS5hc3luY0ZhY3RvcnkpO3JldHVybiB0Lm5zPWUubnMsdC5pc1N0YXRpYz1lLmlzU3RhdGljLHQua2V5PWUua2V5LHQuaXNDb21tZW50PWUuaXNDb21tZW50LHQuZm5Db250ZXh0PWUuZm5Db250ZXh0LHQuZm5PcHRpb25zPWUuZm5PcHRpb25zLHQuZm5TY29wZUlkPWUuZm5TY29wZUlkLHQuYXN5bmNNZXRhPWUuYXN5bmNNZXRhLHQuaXNDbG9uZWQ9ITAsdH12YXIgaGU9QXJyYXkucHJvdG90eXBlLHZlPU9iamVjdC5jcmVhdGUoaGUpO1sicHVzaCIsInBvcCIsInNoaWZ0IiwidW5zaGlmdCIsInNwbGljZSIsInNvcnQiLCJyZXZlcnNlIl0uZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgcz1oZVthXTtGKHZlLGEsZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoO24tLTspdFtuXT1lW25dO3ZhciByLGk9cy5hcHBseSh0aGlzLHQpLG89dGhpcy5fX29iX187c3dpdGNoKGEpe2Nhc2UicHVzaCI6Y2FzZSJ1bnNoaWZ0IjpyPXQ7YnJlYWs7Y2FzZSJzcGxpY2UiOnI9dC5zbGljZSgyKX1yZXR1cm4gciYmby5vYnNlcnZlQXJyYXkociksby5kZXAubm90aWZ5KCksaX0pfSk7dmFyIGdlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZlKSxtZT0hMDtmdW5jdGlvbiB5ZShlKXttZT1lfXZhciBfZT1mdW5jdGlvbihlKXt2YXIgdDt0aGlzLnZhbHVlPWUsdGhpcy5kZXA9bmV3IGFlLHRoaXMudm1Db3VudD0wLEYoZSwiX19vYl9fIix0aGlzKSxBcnJheS5pc0FycmF5KGUpPyhWPyh0PXZlLGUuX19wcm90b19fPXQpOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9MCxpPW4ubGVuZ3RoO3I8aTtyKyspe3ZhciBvPW5bcl07RihlLG8sdFtvXSl9fShlLHZlLGdlKSx0aGlzLm9ic2VydmVBcnJheShlKSk6dGhpcy53YWxrKGUpfTtmdW5jdGlvbiBiZShlLHQpe3ZhciBuO2lmKGIoZSkmJiEoZSBpbnN0YW5jZW9mIHVlKSlyZXR1cm4gZihlLCJfX29iX18iKSYmZS5fX29iX18gaW5zdGFuY2VvZiBfZT9uPWUuX19vYl9fOm1lJiYhUSgpJiYoQXJyYXkuaXNBcnJheShlKXx8ZChlKSkmJk9iamVjdC5pc0V4dGVuc2libGUoZSkmJiFlLl9pc1Z1ZSYmKG49bmV3IF9lKGUpKSx0JiZuJiZuLnZtQ291bnQrKyxufWZ1bmN0aW9uIHdlKG4sZSxyLHQsaSl7dmFyIG89bmV3IGFlLGE9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpO2lmKCFhfHwhMSE9PWEuY29uZmlndXJhYmxlKXt2YXIgcz1hJiZhLmdldCxjPWEmJmEuc2V0O3MmJiFjfHwyIT09YXJndW1lbnRzLmxlbmd0aHx8KHI9bltlXSk7dmFyIHU9IWkmJmJlKHIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3ZhciBlPXM/cy5jYWxsKG4pOnI7cmV0dXJuIGFlLlNoYXJlZE9iamVjdC50YXJnZXQmJihvLmRlcGVuZCgpLHUmJih1LmRlcC5kZXBlbmQoKSxBcnJheS5pc0FycmF5KGUpJiZmdW5jdGlvbiBlKHQpe2Zvcih2YXIgbj12b2lkIDAscj0wLGk9dC5sZW5ndGg7cjxpO3IrKykobj10W3JdKSYmbi5fX29iX18mJm4uX19vYl9fLmRlcC5kZXBlbmQoKSxBcnJheS5pc0FycmF5KG4pJiZlKG4pfShlKSkpLGV9LHNldDpmdW5jdGlvbihlKXt2YXIgdD1zP3MuY2FsbChuKTpyO2U9PT10fHxlIT1lJiZ0IT10fHxzJiYhY3x8KGM/Yy5jYWxsKG4sZSk6cj1lLHU9IWkmJmJlKGUpLG8ubm90aWZ5KCkpfX0pfX1mdW5jdGlvbiBrZShlLHQsbil7aWYoQXJyYXkuaXNBcnJheShlKSYmaSh0KSlyZXR1cm4gZS5sZW5ndGg9TWF0aC5tYXgoZS5sZW5ndGgsdCksZS5zcGxpY2UodCwxLG4pLG47aWYodCBpbiBlJiYhKHQgaW4gT2JqZWN0LnByb3RvdHlwZSkpcmV0dXJuIGVbdF09bjt2YXIgcj1lLl9fb2JfXztyZXR1cm4gZS5faXNWdWV8fHImJnIudm1Db3VudD9uOnI/KHdlKHIudmFsdWUsdCxuKSxyLmRlcC5ub3RpZnkoKSxuKTplW3RdPW59ZnVuY3Rpb24gU2UoZSx0KXtpZihBcnJheS5pc0FycmF5KGUpJiZpKHQpKWUuc3BsaWNlKHQsMSk7ZWxzZXt2YXIgbj1lLl9fb2JfXztlLl9pc1Z1ZXx8biYmbi52bUNvdW50fHxmKGUsdCkmJihkZWxldGUgZVt0XSxuJiZuLmRlcC5ub3RpZnkoKSl9fV9lLnByb3RvdHlwZS53YWxrPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDtuKyspd2UoZSx0W25dKX0sX2UucHJvdG90eXBlLm9ic2VydmVBcnJheT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspYmUoZVt0XSl9O3ZhciB4ZT1SLm9wdGlvbk1lcmdlU3RyYXRlZ2llcztmdW5jdGlvbiBDZShlLHQpe2lmKCF0KXJldHVybiBlO2Zvcih2YXIgbixyLGksbz1yZT9SZWZsZWN0Lm93bktleXModCk6T2JqZWN0LmtleXModCksYT0wO2E8by5sZW5ndGg7YSsrKSJfX29iX18iIT09KG49b1thXSkmJihyPWVbbl0saT10W25dLGYoZSxuKT9yIT09aSYmZChyKSYmZChpKSYmQ2UocixpKTprZShlLG4saSkpO3JldHVybiBlfWZ1bmN0aW9uIFRlKG4scixpKXtyZXR1cm4gaT9mdW5jdGlvbigpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiByP3IuY2FsbChpLGkpOnIsdD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmNhbGwoaSxpKTpuO3JldHVybiBlP0NlKGUsdCk6dH06cj9uP2Z1bmN0aW9uKCl7cmV0dXJuIENlKCJmdW5jdGlvbiI9PXR5cGVvZiByP3IuY2FsbCh0aGlzLHRoaXMpOnIsImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5jYWxsKHRoaXMsdGhpcyk6bil9OnI6bn1mdW5jdGlvbiBPZShlLHQpe3ZhciBuPXQ/ZT9lLmNvbmNhdCh0KTpBcnJheS5pc0FycmF5KHQpP3Q6W3RdOmU7cmV0dXJuIG4/ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoO24rKyktMT09PXQuaW5kZXhPZihlW25dKSYmdC5wdXNoKGVbbl0pO3JldHVybiB0fShuKTpufWZ1bmN0aW9uIEVlKGUsdCxuLHIpe3ZhciBpPU9iamVjdC5jcmVhdGUoZXx8bnVsbCk7cmV0dXJuIHQ/TihpLHQpOml9eGUuZGF0YT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4/VGUoZSx0LG4pOnQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6VGUoZSx0KX0sTC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3hlW2VdPU9lfSksai5mb3JFYWNoKGZ1bmN0aW9uKGUpe3hlW2UrInMiXT1FZX0pLHhlLndhdGNoPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9PT1LJiYoZT12b2lkIDApLHQ9PT1LJiYodD12b2lkIDApLCF0KXJldHVybiBPYmplY3QuY3JlYXRlKGV8fG51bGwpO2lmKCFlKXJldHVybiB0O3ZhciBpPXt9O2Zvcih2YXIgbyBpbiBOKGksZSksdCl7dmFyIGE9aVtvXSxzPXRbb107YSYmIUFycmF5LmlzQXJyYXkoYSkmJihhPVthXSksaVtvXT1hP2EuY29uY2F0KHMpOkFycmF5LmlzQXJyYXkocyk/czpbc119cmV0dXJuIGl9LHhlLnByb3BzPXhlLm1ldGhvZHM9eGUuaW5qZWN0PXhlLmNvbXB1dGVkPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKCFlKXJldHVybiB0O3ZhciBpPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIE4oaSxlKSx0JiZOKGksdCksaX0seGUucHJvdmlkZT1UZTt2YXIgQWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dD9lOnR9O2Z1bmN0aW9uIEllKG4scixpKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgciYmKHI9ci5vcHRpb25zKSxmdW5jdGlvbihlLHQpe3ZhciBuPWUucHJvcHM7aWYobil7dmFyIHIsaSxvPXt9O2lmKEFycmF5LmlzQXJyYXkobikpZm9yKHI9bi5sZW5ndGg7ci0tOykic3RyaW5nIj09dHlwZW9mKGk9bltyXSkmJihvW2goaSldPXt0eXBlOm51bGx9KTtlbHNlIGlmKGQobikpZm9yKHZhciBhIGluIG4paT1uW2FdLG9baChhKV09ZChpKT9pOnt0eXBlOml9O2UucHJvcHM9b319KHIpLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5pbmplY3Q7aWYobil7dmFyIHI9ZS5pbmplY3Q9e307aWYoQXJyYXkuaXNBcnJheShuKSlmb3IodmFyIGk9MDtpPG4ubGVuZ3RoO2krKylyW25baV1dPXtmcm9tOm5baV19O2Vsc2UgaWYoZChuKSlmb3IodmFyIG8gaW4gbil7dmFyIGE9bltvXTtyW29dPWQoYSk/Tih7ZnJvbTpvfSxhKTp7ZnJvbTphfX19fShyKSxmdW5jdGlvbihlKXt2YXIgdD1lLmRpcmVjdGl2ZXM7aWYodClmb3IodmFyIG4gaW4gdCl7dmFyIHI9dFtuXTsiZnVuY3Rpb24iPT10eXBlb2YgciYmKHRbbl09e2JpbmQ6cix1cGRhdGU6cn0pfX0ociksIXIuX2Jhc2UmJihyLmV4dGVuZHMmJihuPUllKG4sci5leHRlbmRzLGkpKSxyLm1peGlucykpZm9yKHZhciBlPTAsdD1yLm1peGlucy5sZW5ndGg7ZTx0O2UrKyluPUllKG4sci5taXhpbnNbZV0saSk7dmFyIG8sYT17fTtmb3IobyBpbiBuKXMobyk7Zm9yKG8gaW4gcilmKG4sbyl8fHMobyk7ZnVuY3Rpb24gcyhlKXt2YXIgdD14ZVtlXXx8QWU7YVtlXT10KG5bZV0scltlXSxpLGUpfXJldHVybiBhfWZ1bmN0aW9uICRlKGUsdCxuLHIpe2lmKCJzdHJpbmciPT10eXBlb2Ygbil7dmFyIGk9ZVt0XTtpZihmKGksbikpcmV0dXJuIGlbbl07dmFyIG89aChuKTtpZihmKGksbykpcmV0dXJuIGlbb107dmFyIGE9dihvKTtyZXR1cm4gZihpLGEpP2lbYV06aVtuXXx8aVtvXXx8aVthXX19ZnVuY3Rpb24gUGUoZSx0LG4scil7dmFyIGk9dFtlXSxvPSFmKG4sZSksYT1uW2VdLHM9TGUoQm9vbGVhbixpLnR5cGUpO2lmKC0xPHMpaWYobyYmIWYoaSwiZGVmYXVsdCIpKWE9ITE7ZWxzZSBpZigiIj09PWF8fGE9PT1TKGUpKXt2YXIgYz1MZShTdHJpbmcsaS50eXBlKTsoYzwwfHxzPGMpJiYoYT0hMCl9aWYodm9pZCAwPT09YSl7YT1mdW5jdGlvbihlLHQsbil7aWYoIWYodCwiZGVmYXVsdCIpKXJldHVybjt2YXIgcj10LmRlZmF1bHQ7aWYoZSYmZS4kb3B0aW9ucy5wcm9wc0RhdGEmJnZvaWQgMD09PWUuJG9wdGlvbnMucHJvcHNEYXRhW25dJiZ2b2lkIDAhPT1lLl9wcm9wc1tuXSlyZXR1cm4gZS5fcHJvcHNbbl07cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHImJiJGdW5jdGlvbiIhPT1NZSh0LnR5cGUpP3IuY2FsbChlKTpyfShyLGksZSk7dmFyIHU9bWU7eWUoITApLGJlKGEpLHllKHUpfXJldHVybiBhfWZ1bmN0aW9uIE1lKGUpe3ZhciB0PWUmJmUudG9TdHJpbmcoKS5tYXRjaCgvXlxzKmZ1bmN0aW9uIChcdyspLyk7cmV0dXJuIHQ/dFsxXToiIn1mdW5jdGlvbiBqZShlLHQpe3JldHVybiBNZShlKT09PU1lKHQpfWZ1bmN0aW9uIExlKGUsdCl7aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIGplKHQsZSk/MDotMTtmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjtuKyspaWYoamUodFtuXSxlKSlyZXR1cm4gbjtyZXR1cm4tMX1mdW5jdGlvbiBOZShlLHQsbil7c2UoKTt0cnl7aWYodClmb3IodmFyIHI9dDtyPXIuJHBhcmVudDspe3ZhciBpPXIuJG9wdGlvbnMuZXJyb3JDYXB0dXJlZDtpZihpKWZvcih2YXIgbz0wO288aS5sZW5ndGg7bysrKXRyeXtpZighMT09PWlbb10uY2FsbChyLGUsdCxuKSlyZXR1cm59Y2F0Y2goZSl7RGUoZSxyLCJlcnJvckNhcHR1cmVkIGhvb2siKX19RGUoZSx0LG4pfWZpbmFsbHl7Y2UoKX19ZnVuY3Rpb24gQmUoZSx0LG4scixpKXt2YXIgbzt0cnl7KG89bj9lLmFwcGx5KHQsbik6ZS5jYWxsKHQpKSYmIW8uX2lzVnVlJiZ3KG8pJiYhby5faGFuZGxlZCYmKG8uY2F0Y2goZnVuY3Rpb24oZSl7cmV0dXJuIE5lKGUscixpKyIgKFByb21pc2UvYXN5bmMpIil9KSxvLl9oYW5kbGVkPSEwKX1jYXRjaChlKXtOZShlLHIsaSl9cmV0dXJuIG99ZnVuY3Rpb24gRGUodCxlLG4pe2lmKFIuZXJyb3JIYW5kbGVyKXRyeXtyZXR1cm4gUi5lcnJvckhhbmRsZXIuY2FsbChudWxsLHQsZSxuKX1jYXRjaChlKXtlIT09dCYmUmUoZSxudWxsLCJjb25maWcuZXJyb3JIYW5kbGVyIil9UmUodCxlLG4pfWZ1bmN0aW9uIFJlKGUsdCxuKXtpZighcSYmIVd8fCJ1bmRlZmluZWQiPT10eXBlb2YgY29uc29sZSl0aHJvdyBlO2NvbnNvbGUuZXJyb3IoZSl9dmFyIEZlPVtdLHplPSExO2Z1bmN0aW9uIFVlKCl7emU9ITE7Zm9yKHZhciBlPUZlLnNsaWNlKDApLHQ9RmUubGVuZ3RoPTA7dDxlLmxlbmd0aDt0KyspZVt0XSgpfXZhciBWZT1mdW5jdGlvbigpe3NldFRpbWVvdXQoVWUsMCl9O2Z1bmN0aW9uIHFlKGUsdCl7dmFyIG47aWYoRmUucHVzaChmdW5jdGlvbigpe2lmKGUpdHJ5e2UuY2FsbCh0KX1jYXRjaChlKXtOZShlLHQsIm5leHRUaWNrIil9ZWxzZSBuJiZuKHQpfSksemV8fCh6ZT0hMCxWZSgpKSwhZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBQcm9taXNlKXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlKXtuPWV9KX12YXIgV2U9bmV3IG5lO2Z1bmN0aW9uIEhlKGUpeyFmdW5jdGlvbiBlKHQsbil7dmFyIHIsaTt2YXIgbz1BcnJheS5pc0FycmF5KHQpO2lmKCFvJiYhYih0KXx8T2JqZWN0LmlzRnJvemVuKHQpfHx0IGluc3RhbmNlb2YgdWUpcmV0dXJuO2lmKHQuX19vYl9fKXt2YXIgYT10Ll9fb2JfXy5kZXAuaWQ7aWYobi5oYXMoYSkpcmV0dXJuO24uYWRkKGEpfWlmKG8pZm9yKHI9dC5sZW5ndGg7ci0tOyllKHRbcl0sbik7ZWxzZSBmb3IoaT1PYmplY3Qua2V5cyh0KSxyPWkubGVuZ3RoO3ItLTspZSh0W2lbcl1dLG4pfShlLFdlKSxXZS5jbGVhcigpfXZhciBHZT11KGZ1bmN0aW9uKGUpe3ZhciB0PSImIj09PWUuY2hhckF0KDApLG49In4iPT09KGU9dD9lLnNsaWNlKDEpOmUpLmNoYXJBdCgwKSxyPSIhIj09PShlPW4/ZS5zbGljZSgxKTplKS5jaGFyQXQoMCk7cmV0dXJue25hbWU6ZT1yP2Uuc2xpY2UoMSk6ZSxvbmNlOm4sY2FwdHVyZTpyLHBhc3NpdmU6dH19KTtmdW5jdGlvbiBYZShlLGkpe2Z1bmN0aW9uIG8oKXt2YXIgZT1hcmd1bWVudHMsdD1vLmZucztpZighQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gQmUodCxudWxsLGFyZ3VtZW50cyxpLCJ2LW9uIGhhbmRsZXIiKTtmb3IodmFyIG49dC5zbGljZSgpLHI9MDtyPG4ubGVuZ3RoO3IrKylCZShuW3JdLG51bGwsZSxpLCJ2LW9uIGhhbmRsZXIiKX1yZXR1cm4gby5mbnM9ZSxvfWZ1bmN0aW9uIFllKGUsdCxuLHIsaSxvKXt2YXIgYSxzLGMsdSxsO2ZvcihhIGluIGUpcz1jPWVbYV0sdT10W2FdLGw9R2UoYSksZChzKSYmKGM9cy5oYW5kbGVyLGwucGFyYW1zPXMucGFyYW1zKSxFKGMpfHwoRSh1KT8oRShjLmZucykmJihjPWVbYV09WGUoYyxvKSksSShsLm9uY2UpJiYoYz1lW2FdPWkobC5uYW1lLGMsbC5jYXB0dXJlKSksbihsLm5hbWUsYyxsLmNhcHR1cmUsbC5wYXNzaXZlLGwucGFyYW1zKSk6YyE9PXUmJih1LmZucz1jLGVbYV09dSkpO2ZvcihhIGluIHQpRShlW2FdKSYmcigobD1HZShhKSkubmFtZSx0W2FdLGwuY2FwdHVyZSl9ZnVuY3Rpb24gSmUoZSx0LG4pe3ZhciByO2UgaW5zdGFuY2VvZiB1ZSYmKGU9ZS5kYXRhLmhvb2t8fChlLmRhdGEuaG9vaz17fSkpO3ZhciBpPWVbdF07ZnVuY3Rpb24gbygpe24uYXBwbHkodGhpcyxhcmd1bWVudHMpLGsoci5mbnMsbyl9RShpKT9yPVhlKFtvXSk6QShpLmZucykmJkkoaS5tZXJnZWQpPyhyPWkpLmZucy5wdXNoKG8pOnI9WGUoW2ksb10pLHIubWVyZ2VkPSEwLGVbdF09cn1mdW5jdGlvbiBLZShlLHQsbixyLGkpe2lmKEEodCkpe2lmKGYodCxuKSlyZXR1cm4gZVtuXT10W25dLGl8fGRlbGV0ZSB0W25dLCEwO2lmKGYodCxyKSlyZXR1cm4gZVtuXT10W3JdLGl8fGRlbGV0ZSB0W3JdLCEwfXJldHVybiExfWZ1bmN0aW9uIFplKGUpe3JldHVybiAkKGUpP1tmZShlKV06QXJyYXkuaXNBcnJheShlKT9mdW5jdGlvbiBlKHQsbil7dmFyIHI9W107dmFyIGksbyxhLHM7Zm9yKGk9MDtpPHQubGVuZ3RoO2krKylFKG89dFtpXSl8fCJib29sZWFuIj09dHlwZW9mIG98fChhPXIubGVuZ3RoLTEscz1yW2FdLEFycmF5LmlzQXJyYXkobyk/MDxvLmxlbmd0aCYmKFFlKChvPWUobywobnx8IiIpKyJfIitpKSlbMF0pJiZRZShzKSYmKHJbYV09ZmUocy50ZXh0K29bMF0udGV4dCksby5zaGlmdCgpKSxyLnB1c2guYXBwbHkocixvKSk6JChvKT9RZShzKT9yW2FdPWZlKHMudGV4dCtvKToiIiE9PW8mJnIucHVzaChmZShvKSk6UWUobykmJlFlKHMpP3JbYV09ZmUocy50ZXh0K28udGV4dCk6KEkodC5faXNWTGlzdCkmJkEoby50YWcpJiZFKG8ua2V5KSYmQShuKSYmKG8ua2V5PSJfX3ZsaXN0IituKyJfIitpKyJfXyIpLHIucHVzaChvKSkpO3JldHVybiByfShlKTp2b2lkIDB9ZnVuY3Rpb24gUWUoZSl7cmV0dXJuIEEoZSkmJkEoZS50ZXh0KSYmITE9PT1lLmlzQ29tbWVudH1mdW5jdGlvbiBldChlKXt2YXIgdD1lLiRvcHRpb25zLnByb3ZpZGU7dCYmKGUuX3Byb3ZpZGVkPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3QuY2FsbChlKTp0KX1mdW5jdGlvbiB0dCh0KXt2YXIgbj1udCh0LiRvcHRpb25zLmluamVjdCx0KTtuJiYoeWUoITEpLE9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oZSl7d2UodCxlLG5bZV0pfSkseWUoITApKX1mdW5jdGlvbiBudChlLHQpe2lmKGUpe2Zvcih2YXIgbj1PYmplY3QuY3JlYXRlKG51bGwpLHI9cmU/UmVmbGVjdC5vd25LZXlzKGUpOk9iamVjdC5rZXlzKGUpLGk9MDtpPHIubGVuZ3RoO2krKyl7dmFyIG89cltpXTtpZigiX19vYl9fIiE9PW8pe2Zvcih2YXIgYT1lW29dLmZyb20scz10O3M7KXtpZihzLl9wcm92aWRlZCYmZihzLl9wcm92aWRlZCxhKSl7bltvXT1zLl9wcm92aWRlZFthXTticmVha31zPXMuJHBhcmVudH1pZighcyYmImRlZmF1bHQiaW4gZVtvXSl7dmFyIGM9ZVtvXS5kZWZhdWx0O25bb109ImZ1bmN0aW9uIj09dHlwZW9mIGM/Yy5jYWxsKHQpOmN9fX1yZXR1cm4gbn19ZnVuY3Rpb24gcnQoZSx0KXtpZighZXx8IWUubGVuZ3RoKXJldHVybnt9O2Zvcih2YXIgbj17fSxyPTAsaT1lLmxlbmd0aDtyPGk7cisrKXt2YXIgbz1lW3JdLGE9by5kYXRhO2lmKGEmJmEuYXR0cnMmJmEuYXR0cnMuc2xvdCYmZGVsZXRlIGEuYXR0cnMuc2xvdCxvLmNvbnRleHQhPT10JiZvLmZuQ29udGV4dCE9PXR8fCFhfHxudWxsPT1hLnNsb3Qpby5hc3luY01ldGEmJm8uYXN5bmNNZXRhLmRhdGEmJiJwYWdlIj09PW8uYXN5bmNNZXRhLmRhdGEuc2xvdD8obi5wYWdlfHwobi5wYWdlPVtdKSkucHVzaChvKToobi5kZWZhdWx0fHwobi5kZWZhdWx0PVtdKSkucHVzaChvKTtlbHNle3ZhciBzPWEuc2xvdCxjPW5bc118fChuW3NdPVtdKTsidGVtcGxhdGUiPT09by50YWc/Yy5wdXNoLmFwcGx5KGMsby5jaGlsZHJlbnx8W10pOmMucHVzaChvKX19Zm9yKHZhciB1IGluIG4pblt1XS5ldmVyeShpdCkmJmRlbGV0ZSBuW3VdO3JldHVybiBufWZ1bmN0aW9uIGl0KGUpe3JldHVybiBlLmlzQ29tbWVudCYmIWUuYXN5bmNGYWN0b3J5fHwiICI9PT1lLnRleHR9ZnVuY3Rpb24gb3QoZSx0LG4pe3ZhciByLGk9MDxPYmplY3Qua2V5cyh0KS5sZW5ndGgsbz1lPyEhZS4kc3RhYmxlOiFpLGE9ZSYmZS4ka2V5O2lmKGUpe2lmKGUuX25vcm1hbGl6ZWQpcmV0dXJuIGUuX25vcm1hbGl6ZWQ7aWYobyYmbiYmbiE9PV8mJmE9PT1uLiRrZXkmJiFpJiYhbi4kaGFzTm9ybWFsKXJldHVybiBuO2Zvcih2YXIgcyBpbiByPXt9LGUpZVtzXSYmIiQiIT09c1swXSYmKHJbc109YXQodCxzLGVbc10pKX1lbHNlIHI9e307Zm9yKHZhciBjIGluIHQpYyBpbiByfHwocltjXT1zdCh0LGMpKTtyZXR1cm4gZSYmT2JqZWN0LmlzRXh0ZW5zaWJsZShlKSYmKGUuX25vcm1hbGl6ZWQ9ciksRihyLCIkc3RhYmxlIixvKSxGKHIsIiRrZXkiLGEpLEYociwiJGhhc05vcm1hbCIsaSkscn1mdW5jdGlvbiBhdChlLHQsbil7dmFyIHI9ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoP24uYXBwbHkobnVsbCxhcmd1bWVudHMpOm4oe30pO3JldHVybihlPWUmJiJvYmplY3QiPT10eXBlb2YgZSYmIUFycmF5LmlzQXJyYXkoZSk/W2VdOlplKGUpKSYmKDA9PT1lLmxlbmd0aHx8MT09PWUubGVuZ3RoJiZlWzBdLmlzQ29tbWVudCk/dm9pZCAwOmV9O3JldHVybiBuLnByb3h5JiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtnZXQ6cixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHJ9ZnVuY3Rpb24gc3QoZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZVt0XX19ZnVuY3Rpb24gY3QoZSx0KXt2YXIgbixyLGksbyxhO2lmKEFycmF5LmlzQXJyYXkoZSl8fCJzdHJpbmciPT10eXBlb2YgZSlmb3Iobj1uZXcgQXJyYXkoZS5sZW5ndGgpLHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspbltyXT10KGVbcl0scik7ZWxzZSBpZigibnVtYmVyIj09dHlwZW9mIGUpZm9yKG49bmV3IEFycmF5KGUpLHI9MDtyPGU7cisrKW5bcl09dChyKzEscik7ZWxzZSBpZihiKGUpKWlmKHJlJiZlW1N5bWJvbC5pdGVyYXRvcl0pe249W107Zm9yKHZhciBzPWVbU3ltYm9sLml0ZXJhdG9yXSgpLGM9cy5uZXh0KCk7IWMuZG9uZTspbi5wdXNoKHQoYy52YWx1ZSxuLmxlbmd0aCkpLGM9cy5uZXh0KCl9ZWxzZSBmb3Iobz1PYmplY3Qua2V5cyhlKSxuPW5ldyBBcnJheShvLmxlbmd0aCkscj0wLGk9by5sZW5ndGg7cjxpO3IrKylhPW9bcl0sbltyXT10KGVbYV0sYSxyKTtyZXR1cm4gQShuKXx8KG49W10pLG4uX2lzVkxpc3Q9ITAsbn1mdW5jdGlvbiB1dChlLHQsbixyKXt2YXIgaSxvPXRoaXMuJHNjb3BlZFNsb3RzW2VdO28/KG49bnx8e30sciYmKG49TihOKHt9LHIpLG4pKSxpPW8obil8fHQpOmk9dGhpcy4kc2xvdHNbZV18fHQ7dmFyIGE9biYmbi5zbG90O3JldHVybiBhP3RoaXMuJGNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIix7c2xvdDphfSxpKTppfWZ1bmN0aW9uIGx0KGUpe3JldHVybiAkZSh0aGlzLiRvcHRpb25zLCJmaWx0ZXJzIixlKXx8VH1mdW5jdGlvbiBkdChlLHQpe3JldHVybiBBcnJheS5pc0FycmF5KGUpPy0xPT09ZS5pbmRleE9mKHQpOmUhPT10fWZ1bmN0aW9uIGZ0KGUsdCxuLHIsaSl7dmFyIG89Ui5rZXlDb2Rlc1t0XXx8bjtyZXR1cm4gaSYmciYmIVIua2V5Q29kZXNbdF0/ZHQoaSxyKTpvP2R0KG8sZSk6cj9TKHIpIT09dDp2b2lkIDB9ZnVuY3Rpb24gcHQoaSxvLGEscyxjKXtpZihhKWlmKGIoYSkpe3ZhciB1O0FycmF5LmlzQXJyYXkoYSkmJihhPXgoYSkpO3ZhciBlPWZ1bmN0aW9uKHQpe2lmKCJjbGFzcyI9PT10fHwic3R5bGUiPT09dHx8bCh0KSl1PWk7ZWxzZXt2YXIgZT1pLmF0dHJzJiZpLmF0dHJzLnR5cGU7dT1zfHxSLm11c3RVc2VQcm9wKG8sZSx0KT9pLmRvbVByb3BzfHwoaS5kb21Qcm9wcz17fSk6aS5hdHRyc3x8KGkuYXR0cnM9e30pfXZhciBuPWgodCkscj1TKHQpO24gaW4gdXx8ciBpbiB1fHwodVt0XT1hW3RdLGMmJigoaS5vbnx8KGkub249e30pKVsidXBkYXRlOiIrdF09ZnVuY3Rpb24oZSl7YVt0XT1lfSkpfTtmb3IodmFyIHQgaW4gYSllKHQpfWVsc2U7cmV0dXJuIGl9ZnVuY3Rpb24gaHQoZSx0KXt2YXIgbj10aGlzLl9zdGF0aWNUcmVlc3x8KHRoaXMuX3N0YXRpY1RyZWVzPVtdKSxyPW5bZV07cmV0dXJuIHImJiF0fHxndChyPW5bZV09dGhpcy4kb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnNbZV0uY2FsbCh0aGlzLl9yZW5kZXJQcm94eSxudWxsLHRoaXMpLCJfX3N0YXRpY19fIitlLCExKSxyfWZ1bmN0aW9uIHZ0KGUsdCxuKXtyZXR1cm4gZ3QoZSwiX19vbmNlX18iK3QrKG4/Il8iK246IiIpLCEwKSxlfWZ1bmN0aW9uIGd0KGUsdCxuKXtpZihBcnJheS5pc0FycmF5KGUpKWZvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKWVbcl0mJiJzdHJpbmciIT10eXBlb2YgZVtyXSYmbXQoZVtyXSx0KyJfIityLG4pO2Vsc2UgbXQoZSx0LG4pfWZ1bmN0aW9uIG10KGUsdCxuKXtlLmlzU3RhdGljPSEwLGUua2V5PXQsZS5pc09uY2U9bn1mdW5jdGlvbiB5dChlLHQpe2lmKHQpaWYoZCh0KSl7dmFyIG49ZS5vbj1lLm9uP04oe30sZS5vbik6e307Zm9yKHZhciByIGluIHQpe3ZhciBpPW5bcl0sbz10W3JdO25bcl09aT9bXS5jb25jYXQoaSxvKTpvfX1lbHNlO3JldHVybiBlfWZ1bmN0aW9uIF90KGUsdCxuLHIpe3Q9dHx8eyRzdGFibGU6IW59O2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldO0FycmF5LmlzQXJyYXkobyk/X3Qobyx0LG4pOm8mJihvLnByb3h5JiYoby5mbi5wcm94eT0hMCksdFtvLmtleV09by5mbil9cmV0dXJuIHImJih0LiRrZXk9ciksdH1mdW5jdGlvbiBidChlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bis9Mil7dmFyIHI9dFtuXTsic3RyaW5nIj09dHlwZW9mIHImJnImJihlW3Rbbl1dPXRbbisxXSl9cmV0dXJuIGV9ZnVuY3Rpb24gd3QoZSx0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/dCtlOmV9ZnVuY3Rpb24ga3QoZSl7ZS5fbz12dCxlLl9uPW8sZS5fcz1uLGUuX2w9Y3QsZS5fdD11dCxlLl9xPU8sZS5faT1QLGUuX209aHQsZS5fZj1sdCxlLl9rPWZ0LGUuX2I9cHQsZS5fdj1mZSxlLl9lPWRlLGUuX3U9X3QsZS5fZz15dCxlLl9kPWJ0LGUuX3A9d3R9ZnVuY3Rpb24gU3QoZSx0LG4sbyxyKXt2YXIgYSxpPXRoaXMscz1yLm9wdGlvbnM7ZihvLCJfdWlkIik/KGE9T2JqZWN0LmNyZWF0ZShvKSkuX29yaWdpbmFsPW86bz0oYT1vKS5fb3JpZ2luYWw7dmFyIGM9SShzLl9jb21waWxlZCksdT0hYzt0aGlzLmRhdGE9ZSx0aGlzLnByb3BzPXQsdGhpcy5jaGlsZHJlbj1uLHRoaXMucGFyZW50PW8sdGhpcy5saXN0ZW5lcnM9ZS5vbnx8Xyx0aGlzLmluamVjdGlvbnM9bnQocy5pbmplY3QsbyksdGhpcy5zbG90cz1mdW5jdGlvbigpe3JldHVybiBpLiRzbG90c3x8b3QoZS5zY29wZWRTbG90cyxpLiRzbG90cz1ydChuLG8pKSxpLiRzbG90c30sT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInNjb3BlZFNsb3RzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb3QoZS5zY29wZWRTbG90cyx0aGlzLnNsb3RzKCkpfX0pLGMmJih0aGlzLiRvcHRpb25zPXMsdGhpcy4kc2xvdHM9dGhpcy5zbG90cygpLHRoaXMuJHNjb3BlZFNsb3RzPW90KGUuc2NvcGVkU2xvdHMsdGhpcy4kc2xvdHMpKSxzLl9zY29wZUlkP3RoaXMuX2M9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9VnQoYSxlLHQsbixyLHUpO3JldHVybiBpJiYhQXJyYXkuaXNBcnJheShpKSYmKGkuZm5TY29wZUlkPXMuX3Njb3BlSWQsaS5mbkNvbnRleHQ9byksaX06dGhpcy5fYz1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gVnQoYSxlLHQsbixyLHUpfX1mdW5jdGlvbiB4dChlLHQsbixyLGkpe3ZhciBvPXBlKGUpO3JldHVybiBvLmZuQ29udGV4dD1uLG8uZm5PcHRpb25zPXIsdC5zbG90JiYoKG8uZGF0YXx8KG8uZGF0YT17fSkpLnNsb3Q9dC5zbG90KSxvfWZ1bmN0aW9uIEN0KGUsdCl7Zm9yKHZhciBuIGluIHQpZVtoKG4pXT10W25dfWt0KFN0LnByb3RvdHlwZSk7dmFyIFR0PSJAaW5SZWN5Y2xlTGlzdCI7ZnVuY3Rpb24gT3QoZSx0LG4scil7aWYoYSYmYS50YXNrQ2VudGVyKXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBhLnRhc2tDZW50ZXIucmVnaXN0ZXJIb29rP2EudGFza0NlbnRlci5yZWdpc3Rlckhvb2soZSx0LG4scik6dm9pZCAwfWZ1bmN0aW9uIEV0KGUsbix0KXtpZihiKG4pKWlmKHQpZS4kcmVmcz17fTtlbHNle3ZhciByPWUuJHJlZnN8fHt9O09iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9bltlXTtyW2VdPTE9PT10Lmxlbmd0aD90WzBdOnR9KSxlLiRyZWZzPXJ9fWZ1bmN0aW9uIEF0KGUsbixyLHQpe2lmKGIocikpe3ZhciBpPWUuJHJlZnN8fHt9O3Q/T2JqZWN0LmtleXMocikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1yW2VdO2lbZV0mJigxPT09dC5sZW5ndGgmJkFycmF5LmlzQXJyYXkoaVtlXSk/ZGVsZXRlIGlbZV1bbl06ZGVsZXRlIGlbZV0pfSk6KE9iamVjdC5rZXlzKHIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9cltlXTsxPT09dC5sZW5ndGg/KEFycmF5LmlzQXJyYXkoaVtlXSl8fChpW2VdPVtdKSxpW2VdW25dPXRbMF0pOmlbZV09dH0pLGUuJHJlZnM9aSl9fXZhciBJdD0wO2Z1bmN0aW9uICR0KGUpe3ZhciB0PWUuJG9wdGlvbnMuZGF0YSxuPWUuJG9wdGlvbnMuY29tcHV0ZWR8fHt9LHI9ZS5fZGF0YT9PYmplY3QuYXNzaWduKHt9LGUuX2RhdGEpOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3duKHQsZSk6dHx8e30saT17fTtmb3IodmFyIG8gaW4gbilpW29dPWVbb107cmV0dXJuIE9iamVjdC5hc3NpZ24oe30scixpKX1mdW5jdGlvbiBQdChlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHI9dGhpcyx0PWUuY29tcG9uZW50SWQ7RihyLCJfdm1UZW1wbGF0ZSIsZS52bVRlbXBsYXRlKSxyLl91aWQ9dHx8InZpcnR1YWwtY29tcG9uZW50LSIrSXQrKyxyLl9pc1Z1ZT0hMCxlJiZlLl9pc0NvbXBvbmVudD9MbihyLGUpOnIuJG9wdGlvbnM9SWUoTm4oci5jb25zdHJ1Y3RvciksZXx8e30sciksbm4oKHIuX3JlbmRlclByb3h5PXIpLl9zZWxmPXIpLEp0KHIpLHF0KHIpLGFuKHIsImJlZm9yZUNyZWF0ZSIpLHR0KHIpLGJuKHIpLGV0KHIpLGFuKHIsImNyZWF0ZWQiKSxPdCh0LCJsaWZlY3ljbGUiLCJhdHRhY2giLGZ1bmN0aW9uKGUpe0V0KHIsZSYmZS5yZWZzKSxhbihyLCJiZWZvcmVNb3VudCIpLG5ldyBtbihyLGZ1bmN0aW9uKCl7cmV0dXJuICR0KHIpfSxmdW5jdGlvbigpe3JldHVybiByLl91cGRhdGUoci5fdm5vZGUsITEpfSksci5faXNNb3VudGVkPSEwLGFuKHIsIm1vdW50ZWQiKX0pLE90KHQsImxpZmVjeWNsZSIsInVwZGF0ZSIsZnVuY3Rpb24oZSl7RXQocixlJiZlLnJlZnMpLHIuX3VwZGF0ZShyLl92bm9kZSwhMSl9KSxPdCh0LCJsaWZlY3ljbGUiLCJzeW5jU3RhdGUiLGZ1bmN0aW9uKGUsdCl7aWYoZCh0KSlmb3IodmFyIG4gaW4gdClyW25dPXRbbl07cmV0dXJuICR0KHIpfSksT3QodCwibGlmZWN5Y2xlIiwiZGV0YWNoIixmdW5jdGlvbihlKXtFdChyLGUmJmUucmVmcywhMCksci4kZGVzdHJveSgpLHIuX3ZtVGVtcGxhdGUmJihyLl92bVRlbXBsYXRlLnJlbW92ZVZpcnR1YWxDb21wb25lbnQoci5fdWlkKSxkZWxldGUgci5fdm1UZW1wbGF0ZSl9KX1mdW5jdGlvbiBNdChlKXt2YXIgdD10aGlzLG49dC4kb3B0aW9ucy5jb21wb25lbnRJZDsodC5faXNNb3VudGVkJiZhbih0LCJiZWZvcmVVcGRhdGUiKSx0Ll92bm9kZT1lLHQuX2lzTW91bnRlZCYmbikmJmZ1bmN0aW9uKGUsdCxuKXtpZihhJiZhLnRhc2tDZW50ZXIpImZ1bmN0aW9uIj09dHlwZW9mIGEudGFza0NlbnRlci51cGRhdGVEYXRhJiZhLnRhc2tDZW50ZXIudXBkYXRlRGF0YShlLHQsbil9KG4sJHQodCksZnVuY3Rpb24oKXthbih0LCJ1cGRhdGVkIil9KX1mdW5jdGlvbiBqdChlKXt2b2lkIDA9PT1lJiYoZT17fSk7dmFyIHQ9dGhpczt0Ll91aWQ9InZpcnR1YWwtY29tcG9uZW50LXRlbXBsYXRlLSIrSXQrKyx0Ll9pc1Z1ZT0hMCxlJiZlLl9pc0NvbXBvbmVudD9Mbih0LGUpOnQuJG9wdGlvbnM9SWUoTm4odC5jb25zdHJ1Y3RvciksZXx8e30sdCksSnQodC5fc2VsZj10KSxxdCh0KSxibih0KSx0aGlzLnJlZ2lzdGVyVmlydHVhbENvbXBvbmVudCgpfWZ1bmN0aW9uIEx0KGUpe3ZhciB0LG4saSxvO2RlbGV0ZSBlLmRhdGEuYXR0cnNbVHRdLG49KHQ9ZSkuY29tcG9uZW50T3B0aW9ucy5DdG9yLGk9bi5leHRlbmQoe30pLG89aS5wcm90b3R5cGUuJGVtaXQsaS5wcm90b3R5cGUuX2luaXQ9UHQsaS5wcm90b3R5cGUuX3VwZGF0ZT1NdCxpLnByb3RvdHlwZS4kZW1pdD1mdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMsdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGg7bi0tOyl0W25dPWVbbl07dmFyIHI9dGhpcy5fdWlkLGk9dGhpcy5fdm1UZW1wbGF0ZTtyZXR1cm4gciYmaSYmKHQucHVzaChyKSxvLmFwcGx5KGksdCkpLG8uYXBwbHkodGhpcyx0KX0sdC5jb21wb25lbnRPcHRpb25zLkN0b3I9bi5leHRlbmQoe21ldGhvZHM6e3JlZ2lzdGVyVmlydHVhbENvbXBvbmVudDpmdW5jdGlvbigpe3ZhciByPXRoaXM7RihyLCJfdmlydHVhbENvbXBvbmVudHMiLHt9KSxPdChTdHJpbmcoci5fdWlkKSwibGlmZWN5Y2xlIiwiY3JlYXRlIixmdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBpKHt2bVRlbXBsYXRlOnIsY29tcG9uZW50SWQ6ZSxwcm9wc0RhdGE6dH0pO3JldHVybiBuLl91aWQ9ZSxyLl92aXJ0dWFsQ29tcG9uZW50cyYmKHIuX3ZpcnR1YWxDb21wb25lbnRzW2VdPW4pLCR0KG4pfSl9LHJlbW92ZVZpcnR1YWxDb21wb25lbnQ6ZnVuY3Rpb24oZSl7ZGVsZXRlIHRoaXMuX3ZpcnR1YWxDb21wb25lbnRzW2VdfX0sZGVzdHJveWVkOmZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXMuX3ZpcnR1YWxDb21wb25lbnRzfX0pLHQuY29tcG9uZW50T3B0aW9ucy5DdG9yLnByb3RvdHlwZS5faW5pdD1qdCx0LmNvbXBvbmVudE9wdGlvbnMuQ3Rvci5wcm90b3R5cGUuX3VwZGF0ZT1CO3ZhciByPVJ0KGUpLGE9ci4kb3B0aW9uc1siQHJlbmRlciJdO2lmKGEpdHJ5e3JldHVybiBhLmNhbGwocil9Y2F0Y2goZSl7TmUoZSxyLCJAcmVuZGVyIil9fXZhciBOdD17aW5pdDpmdW5jdGlvbihlLHQsbixyKXtpZihlLmNvbXBvbmVudEluc3RhbmNlJiYhZS5jb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQmJmUuZGF0YS5rZWVwQWxpdmUpe3ZhciBpPWU7TnQucHJlcGF0Y2goaSxpKX1lbHNleyhlLmNvbXBvbmVudEluc3RhbmNlPVJ0KGUsdG4sbixyKSkuJG1vdW50KHQ/ZS5lbG06dm9pZCAwLHQpfX0scHJlcGF0Y2g6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmNvbXBvbmVudE9wdGlvbnM7IWZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG89ci5kYXRhLnNjb3BlZFNsb3RzLGE9ZS4kc2NvcGVkU2xvdHMscz0hIShvJiYhby4kc3RhYmxlfHxhIT09XyYmIWEuJHN0YWJsZXx8byYmZS4kc2NvcGVkU2xvdHMuJGtleSE9PW8uJGtleSksYz0hIShpfHxlLiRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbnx8cyk7ZS4kb3B0aW9ucy5fcGFyZW50Vm5vZGU9cixlLiR2bm9kZT1yLGUuX3Zub2RlJiYoZS5fdm5vZGUucGFyZW50PXIpO2lmKGUuJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuPWksZS4kYXR0cnM9ci5kYXRhLmF0dHJzfHxfLGUuJGxpc3RlbmVycz1ufHxfLHQmJmUuJG9wdGlvbnMucHJvcHMpe3llKCExKTtmb3IodmFyIHU9ZS5fcHJvcHMsbD1lLiRvcHRpb25zLl9wcm9wS2V5c3x8W10sZD0wO2Q8bC5sZW5ndGg7ZCsrKXt2YXIgZj1sW2RdLHA9ZS4kb3B0aW9ucy5wcm9wczt1W2ZdPVBlKGYscCx0LGUpfXllKCEwKSxlLiRvcHRpb25zLnByb3BzRGF0YT10fW49bnx8Xzt2YXIgaD1lLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7ZS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzPW4sZW4oZSxuLGgpLGMmJihlLiRzbG90cz1ydChpLHIuY29udGV4dCksZS4kZm9yY2VVcGRhdGUoKSl9KHQuY29tcG9uZW50SW5zdGFuY2U9ZS5jb21wb25lbnRJbnN0YW5jZSxuLnByb3BzRGF0YSxuLmxpc3RlbmVycyx0LG4uY2hpbGRyZW4pfSxpbnNlcnQ6ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLmNvbnRleHQscj1lLmNvbXBvbmVudEluc3RhbmNlO3IuX2lzTW91bnRlZHx8KHIuX2lzTW91bnRlZD0hMCxhbihyLCJtb3VudGVkIikpLGUuZGF0YS5rZWVwQWxpdmUmJihuLl9pc01vdW50ZWQ/KCh0PXIpLl9pbmFjdGl2ZT0hMSxjbi5wdXNoKHQpKTpvbihyLCEwKSl9LGRlc3Ryb3k6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb21wb25lbnRJbnN0YW5jZTt0Ll9pc0Rlc3Ryb3llZHx8KGUuZGF0YS5rZWVwQWxpdmU/ZnVuY3Rpb24gZSh0LG4pe2lmKG4mJih0Ll9kaXJlY3RJbmFjdGl2ZT0hMCxybih0KSkpcmV0dXJuO2lmKCF0Ll9pbmFjdGl2ZSl7dC5faW5hY3RpdmU9ITA7Zm9yKHZhciByPTA7cjx0LiRjaGlsZHJlbi5sZW5ndGg7cisrKWUodC4kY2hpbGRyZW5bcl0pO2FuKHQsImRlYWN0aXZhdGVkIil9fSh0LCEwKTp0LiRkZXN0cm95KCkpfX0sQnQ9T2JqZWN0LmtleXMoTnQpO2Z1bmN0aW9uIER0KGUsdCxuLHIsaSl7aWYoIUUoZSkpe3ZhciBvPW4uJG9wdGlvbnMuX2Jhc2U7aWYoYihlKSYmKGU9by5leHRlbmQoZSkpLCJmdW5jdGlvbiI9PXR5cGVvZiBlKXt2YXIgYSxzLGMsdSxsLGQsZjtpZihFKGUuY2lkKSYmdm9pZCAwPT09KGU9ZnVuY3Rpb24odCxuKXtpZihJKHQuZXJyb3IpJiZBKHQuZXJyb3JDb21wKSlyZXR1cm4gdC5lcnJvckNvbXA7aWYoQSh0LnJlc29sdmVkKSlyZXR1cm4gdC5yZXNvbHZlZDt2YXIgZT1IdDtlJiZBKHQub3duZXJzKSYmLTE9PT10Lm93bmVycy5pbmRleE9mKGUpJiZ0Lm93bmVycy5wdXNoKGUpO2lmKEkodC5sb2FkaW5nKSYmQSh0LmxvYWRpbmdDb21wKSlyZXR1cm4gdC5sb2FkaW5nQ29tcDtpZihlJiYhQSh0Lm93bmVycykpe3ZhciByPXQub3duZXJzPVtlXSxpPSEwLG89bnVsbCxhPW51bGw7ZS4kb24oImhvb2s6ZGVzdHJveWVkIixmdW5jdGlvbigpe3JldHVybiBrKHIsZSl9KTt2YXIgcz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPXIubGVuZ3RoO3Q8bjt0Kyspclt0XS4kZm9yY2VVcGRhdGUoKTtlJiYoci5sZW5ndGg9MCxudWxsIT09byYmKGNsZWFyVGltZW91dChvKSxvPW51bGwpLG51bGwhPT1hJiYoY2xlYXJUaW1lb3V0KGEpLGE9bnVsbCkpfSxjPUQoZnVuY3Rpb24oZSl7dC5yZXNvbHZlZD1HdChlLG4pLGk/ci5sZW5ndGg9MDpzKCEwKX0pLHU9RChmdW5jdGlvbihlKXtBKHQuZXJyb3JDb21wKSYmKHQuZXJyb3I9ITAscyghMCkpfSksbD10KGMsdSk7cmV0dXJuIGIobCkmJih3KGwpP0UodC5yZXNvbHZlZCkmJmwudGhlbihjLHUpOncobC5jb21wb25lbnQpJiYobC5jb21wb25lbnQudGhlbihjLHUpLEEobC5lcnJvcikmJih0LmVycm9yQ29tcD1HdChsLmVycm9yLG4pKSxBKGwubG9hZGluZykmJih0LmxvYWRpbmdDb21wPUd0KGwubG9hZGluZyxuKSwwPT09bC5kZWxheT90LmxvYWRpbmc9ITA6bz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bz1udWxsLEUodC5yZXNvbHZlZCkmJkUodC5lcnJvcikmJih0LmxvYWRpbmc9ITAscyghMSkpfSxsLmRlbGF5fHwyMDApKSxBKGwudGltZW91dCkmJihhPXNldFRpbWVvdXQoZnVuY3Rpb24oKXthPW51bGwsRSh0LnJlc29sdmVkKSYmdShudWxsKX0sbC50aW1lb3V0KSkpKSxpPSExLHQubG9hZGluZz90LmxvYWRpbmdDb21wOnQucmVzb2x2ZWR9fShhPWUsbykpKXJldHVybiBzPWEsYz10LHU9bixsPXIsZD1pLChmPWRlKCkpLmFzeW5jRmFjdG9yeT1zLGYuYXN5bmNNZXRhPXtkYXRhOmMsY29udGV4dDp1LGNoaWxkcmVuOmwsdGFnOmR9LGY7dD10fHx7fSxObihlKSxBKHQubW9kZWwpJiZmdW5jdGlvbihlLHQpe3ZhciBuPWUubW9kZWwmJmUubW9kZWwucHJvcHx8InZhbHVlIixyPWUubW9kZWwmJmUubW9kZWwuZXZlbnR8fCJpbnB1dCI7KHQuYXR0cnN8fCh0LmF0dHJzPXt9KSlbbl09dC5tb2RlbC52YWx1ZTt2YXIgaT10Lm9ufHwodC5vbj17fSksbz1pW3JdLGE9dC5tb2RlbC5jYWxsYmFjaztBKG8pPyhBcnJheS5pc0FycmF5KG8pPy0xPT09by5pbmRleE9mKGEpOm8hPT1hKSYmKGlbcl09W2FdLmNvbmNhdChvKSk6aVtyXT1hfShlLm9wdGlvbnMsdCk7dmFyIHA9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXQub3B0aW9ucy5wcm9wcztpZighRShyKSl7dmFyIGk9e30sbz1lLmF0dHJzLGE9ZS5wcm9wcztpZihBKG8pfHxBKGEpKWZvcih2YXIgcyBpbiByKXt2YXIgYz1TKHMpO0tlKGksYSxzLGMsITApfHxLZShpLG8scyxjLCExKX1yZXR1cm4gaX19KHQsZSk7aWYoSShlLm9wdGlvbnMuZnVuY3Rpb25hbCkpcmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG89ZS5vcHRpb25zLGE9e30scz1vLnByb3BzO2lmKEEocykpZm9yKHZhciBjIGluIHMpYVtjXT1QZShjLHMsdHx8Xyk7ZWxzZSBBKG4uYXR0cnMpJiZDdChhLG4uYXR0cnMpLEEobi5wcm9wcykmJkN0KGEsbi5wcm9wcyk7dmFyIHU9bmV3IFN0KG4sYSxpLHIsZSksbD1vLnJlbmRlci5jYWxsKG51bGwsdS5fYyx1KTtpZihsIGluc3RhbmNlb2YgdWUpcmV0dXJuIHh0KGwsbix1LnBhcmVudCxvKTtpZihBcnJheS5pc0FycmF5KGwpKXtmb3IodmFyIGQ9WmUobCl8fFtdLGY9bmV3IEFycmF5KGQubGVuZ3RoKSxwPTA7cDxkLmxlbmd0aDtwKyspZltwXT14dChkW3BdLG4sdS5wYXJlbnQsbyk7cmV0dXJuIGZ9fShlLHAsdCxuLHIpO3ZhciBoPXQub247aWYodC5vbj10Lm5hdGl2ZU9uLEkoZS5vcHRpb25zLmFic3RyYWN0KSl7dmFyIHY9dC5zbG90O3Q9e30sdiYmKHQuc2xvdD12KX0hZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUuaG9va3x8KGUuaG9vaz17fSksbj0wO248QnQubGVuZ3RoO24rKyl7dmFyIHI9QnRbbl0saT10W3JdLG89TnRbcl07aT09PW98fGkmJmkuX21lcmdlZHx8KHRbcl09aT9GdChvLGkpOm8pfX0odCk7dmFyIGcsbT1lLm9wdGlvbnMubmFtZXx8aSx5PW5ldyB1ZSgidnVlLWNvbXBvbmVudC0iK2UuY2lkKyhtPyItIittOiIiKSx0LHZvaWQgMCx2b2lkIDAsdm9pZCAwLG4se0N0b3I6ZSxwcm9wc0RhdGE6cCxsaXN0ZW5lcnM6aCx0YWc6aSxjaGlsZHJlbjpyfSxhKTtyZXR1cm4oZz15KS5kYXRhLmF0dHJzJiZUdCBpbiBnLmRhdGEuYXR0cnM/THQoeSk6eX19fWZ1bmN0aW9uIFJ0KGUsdCxuLHIpe3ZhciBpPXtfaXNDb21wb25lbnQ6ITAsX3BhcmVudFZub2RlOmUscGFyZW50OnQsX3BhcmVudEVsbTpufHxudWxsLF9yZWZFbG06cnx8bnVsbH0sbz1lLmRhdGEuaW5saW5lVGVtcGxhdGU7cmV0dXJuIEEobykmJihpLnJlbmRlcj1vLnJlbmRlcixpLnN0YXRpY1JlbmRlckZucz1vLnN0YXRpY1JlbmRlckZucyksbmV3IGUuY29tcG9uZW50T3B0aW9ucy5DdG9yKGkpfWZ1bmN0aW9uIEZ0KG4scil7dmFyIGU9ZnVuY3Rpb24oZSx0KXtuKGUsdCkscihlLHQpfTtyZXR1cm4gZS5fbWVyZ2VkPSEwLGV9dmFyIHp0PTEsVXQ9MjtmdW5jdGlvbiBWdChlLHQsbixyLGksbyl7cmV0dXJuKEFycmF5LmlzQXJyYXkobil8fCQobikpJiYoaT1yLHI9bixuPXZvaWQgMCksSShvKSYmKGk9VXQpLGZ1bmN0aW9uKGUsdCxuLHIsaSl7aWYoQShuKSYmQShuLl9fb2JfXykpcmV0dXJuIGRlKCk7QShuKSYmQShuLmlzKSYmKHQ9bi5pcyk7aWYoIXQpcmV0dXJuIGRlKCk7QXJyYXkuaXNBcnJheShyKSYmImZ1bmN0aW9uIj09dHlwZW9mIHJbMF0mJigobj1ufHx7fSkuc2NvcGVkU2xvdHM9e2RlZmF1bHQ6clswXX0sci5sZW5ndGg9MCk7aT09PVV0P3I9WmUocik6aT09PXp0JiYocj1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKylpZihBcnJheS5pc0FycmF5KGVbdF0pKXJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGUpO3JldHVybiBlfShyKSk7dmFyIG8sYTtpZigic3RyaW5nIj09dHlwZW9mIHQpe3ZhciBzO2E9ZS4kdm5vZGUmJmUuJHZub2RlLm5zfHxSLmdldFRhZ05hbWVzcGFjZSh0KSxvPVIuaXNSZXNlcnZlZFRhZyh0KT9uZXcgdWUoUi5wYXJzZVBsYXRmb3JtVGFnTmFtZSh0KSxuLHIsdm9pZCAwLHZvaWQgMCxlKTpuJiZuLnByZXx8IUEocz0kZShlLiRvcHRpb25zLCJjb21wb25lbnRzIix0KSk/bmV3IHVlKHQsbixyLHZvaWQgMCx2b2lkIDAsZSk6RHQocyxuLGUscix0KX1lbHNlIG89RHQodCxuLGUscik7cmV0dXJuIEFycmF5LmlzQXJyYXkobyk/bzpBKG8pPyhBKGEpJiZmdW5jdGlvbiBlKHQsbixyKXt0Lm5zPW47ImZvcmVpZ25PYmplY3QiPT09dC50YWcmJihyPSEobj12b2lkIDApKTtpZihBKHQuY2hpbGRyZW4pKWZvcih2YXIgaT0wLG89dC5jaGlsZHJlbi5sZW5ndGg7aTxvO2krKyl7dmFyIGE9dC5jaGlsZHJlbltpXTtBKGEudGFnKSYmKEUoYS5ucyl8fEkocikmJiJzdmciIT09YS50YWcpJiZlKGEsbixyKX19KG8sYSksQShuKSYmZnVuY3Rpb24oZSl7YihlLnN0eWxlKSYmSGUoZS5zdHlsZSk7YihlLmNsYXNzKSYmSGUoZS5jbGFzcyl9KG4pLG8pOmRlKCl9KGUsdCxuLHIsaSl9ZnVuY3Rpb24gcXQoaSl7aS5fdm5vZGU9bnVsbCxpLl9zdGF0aWNUcmVlcz1udWxsO3ZhciBlPWkuJG9wdGlvbnMsdD1pLiR2bm9kZT1lLl9wYXJlbnRWbm9kZSxuPXQmJnQuY29udGV4dDtpLiRzbG90cz1ydChlLl9yZW5kZXJDaGlsZHJlbixuKSxpLiRzY29wZWRTbG90cz1fLGkuX2M9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIFZ0KGksZSx0LG4sciwhMSl9LGkuJGNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIFZ0KGksZSx0LG4sciwhMCl9O3ZhciByPXQmJnQuZGF0YTt3ZShpLCIkYXR0cnMiLHImJnIuYXR0cnN8fF8sbnVsbCwhMCksd2UoaSwiJGxpc3RlbmVycyIsZS5fcGFyZW50TGlzdGVuZXJzfHxfLG51bGwsITApfXZhciBXdCxIdD1udWxsO2Z1bmN0aW9uIEd0KGUsdCl7cmV0dXJuKGUuX19lc01vZHVsZXx8cmUmJiJNb2R1bGUiPT09ZVtTeW1ib2wudG9TdHJpbmdUYWddKSYmKGU9ZS5kZWZhdWx0KSxiKGUpP3QuZXh0ZW5kKGUpOmV9ZnVuY3Rpb24gWHQoZSl7cmV0dXJuIGUuaXNDb21tZW50JiZlLmFzeW5jRmFjdG9yeX1mdW5jdGlvbiBZdChlKXtpZihBcnJheS5pc0FycmF5KGUpKWZvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKXt2YXIgbj1lW3RdO2lmKEEobikmJihBKG4uY29tcG9uZW50T3B0aW9ucyl8fFh0KG4pKSlyZXR1cm4gbn19ZnVuY3Rpb24gSnQoZSl7ZS5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksZS5faGFzSG9va0V2ZW50PSExO3ZhciB0PWUuJG9wdGlvbnMuX3BhcmVudExpc3RlbmVyczt0JiZlbihlLHQpfWZ1bmN0aW9uIEt0KGUsdCl7V3QuJG9uKGUsdCl9ZnVuY3Rpb24gWnQoZSx0KXtXdC4kb2ZmKGUsdCl9ZnVuY3Rpb24gUXQodCxuKXt2YXIgcj1XdDtyZXR1cm4gZnVuY3Rpb24gZSgpe251bGwhPT1uLmFwcGx5KG51bGwsYXJndW1lbnRzKSYmci4kb2ZmKHQsZSl9fWZ1bmN0aW9uIGVuKGUsdCxuKXtZZSh0LG58fHt9LEt0LFp0LFF0LFd0PWUpLFd0PXZvaWQgMH12YXIgdG49bnVsbDtmdW5jdGlvbiBubihlKXt2YXIgdD1lLiRvcHRpb25zLG49dC5wYXJlbnQ7aWYobiYmIXQuYWJzdHJhY3Qpe2Zvcig7bi4kb3B0aW9ucy5hYnN0cmFjdCYmbi4kcGFyZW50OyluPW4uJHBhcmVudDtuLiRjaGlsZHJlbi5wdXNoKGUpfWUuJHBhcmVudD1uLGUuJHJvb3Q9bj9uLiRyb290OmUsZS4kY2hpbGRyZW49W10sZS4kcmVmcz17fSxlLl93YXRjaGVyPW51bGwsZS5faW5hY3RpdmU9bnVsbCxlLl9kaXJlY3RJbmFjdGl2ZT0hMSxlLl9pc01vdW50ZWQ9ITEsZS5faXNEZXN0cm95ZWQ9ITEsZS5faXNCZWluZ0Rlc3Ryb3llZD0hMX1mdW5jdGlvbiBybihlKXtmb3IoO2UmJihlPWUuJHBhcmVudCk7KWlmKGUuX2luYWN0aXZlKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIG9uKGUsdCl7aWYodCl7aWYoZS5fZGlyZWN0SW5hY3RpdmU9ITEscm4oZSkpcmV0dXJufWVsc2UgaWYoZS5fZGlyZWN0SW5hY3RpdmUpcmV0dXJuO2lmKGUuX2luYWN0aXZlfHxudWxsPT09ZS5faW5hY3RpdmUpe2UuX2luYWN0aXZlPSExO2Zvcih2YXIgbj0wO248ZS4kY2hpbGRyZW4ubGVuZ3RoO24rKylvbihlLiRjaGlsZHJlbltuXSk7YW4oZSwiYWN0aXZhdGVkIil9fWZ1bmN0aW9uIGFuKGUsdCl7c2UoKTt2YXIgbj1lLiRvcHRpb25zW3RdLHI9dCsiIGhvb2siO2lmKG4pZm9yKHZhciBpPTAsbz1uLmxlbmd0aDtpPG87aSsrKUJlKG5baV0sZSxudWxsLGUscik7ZS5faGFzSG9va0V2ZW50JiZlLiRlbWl0KCJob29rOiIrdCksY2UoKX12YXIgc249W10sY249W10sdW49e30sbG49ITEsZG49ITEsZm49MDt2YXIgcG49RGF0ZS5ub3c7aWYocSYmIVgpe3ZhciBobj13aW5kb3cucGVyZm9ybWFuY2U7aG4mJiJmdW5jdGlvbiI9PXR5cGVvZiBobi5ub3cmJnBuKCk+YS5jcmVhdGVFdmVudCgiRXZlbnQiKS50aW1lU3RhbXAmJihwbj1mdW5jdGlvbigpe3JldHVybiBobi5ub3coKX0pfWZ1bmN0aW9uIHZuKCl7dmFyIGUsdDtmb3IocG4oKSxkbj0hMCxzbi5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuaWQtdC5pZH0pLGZuPTA7Zm48c24ubGVuZ3RoO2ZuKyspKGU9c25bZm5dKS5iZWZvcmUmJmUuYmVmb3JlKCksdD1lLmlkLHVuW3RdPW51bGwsZS5ydW4oKTt2YXIgbj1jbi5zbGljZSgpLHI9c24uc2xpY2UoKTtmbj1zbi5sZW5ndGg9Y24ubGVuZ3RoPTAsbG49ZG49ISh1bj17fSksZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspZVt0XS5faW5hY3RpdmU9ITAsb24oZVt0XSwhMCl9KG4pLGZ1bmN0aW9uKGUpe3ZhciB0PWUubGVuZ3RoO2Zvcig7dC0tOyl7dmFyIG49ZVt0XSxyPW4udm07ci5fd2F0Y2hlcj09PW4mJnIuX2lzTW91bnRlZCYmIXIuX2lzRGVzdHJveWVkJiZhbihyLCJ1cGRhdGVkIil9fShyKSxlZSYmUi5kZXZ0b29scyYmZWUuZW1pdCgiZmx1c2giKX12YXIgZ249MCxtbj1mdW5jdGlvbihlLHQsbixyLGkpe3RoaXMudm09ZSxpJiYoZS5fd2F0Y2hlcj10aGlzKSxlLl93YXRjaGVycy5wdXNoKHRoaXMpLHI/KHRoaXMuZGVlcD0hIXIuZGVlcCx0aGlzLnVzZXI9ISFyLnVzZXIsdGhpcy5sYXp5PSEhci5sYXp5LHRoaXMuc3luYz0hIXIuc3luYyx0aGlzLmJlZm9yZT1yLmJlZm9yZSk6dGhpcy5kZWVwPXRoaXMudXNlcj10aGlzLmxhenk9dGhpcy5zeW5jPSExLHRoaXMuY2I9bix0aGlzLmlkPSsrZ24sdGhpcy5hY3RpdmU9ITAsdGhpcy5kaXJ0eT10aGlzLmxhenksdGhpcy5kZXBzPVtdLHRoaXMubmV3RGVwcz1bXSx0aGlzLmRlcElkcz1uZXcgbmUsdGhpcy5uZXdEZXBJZHM9bmV3IG5lLHRoaXMuZXhwcmVzc2lvbj0iIiwiZnVuY3Rpb24iPT10eXBlb2YgdD90aGlzLmdldHRlcj10Oih0aGlzLmdldHRlcj1mdW5jdGlvbihlKXtpZighei50ZXN0KGUpKXt2YXIgbj1lLnNwbGl0KCIuIik7cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8bi5sZW5ndGg7dCsrKXtpZighZSlyZXR1cm47ZT1lW25bdF1dfXJldHVybiBlfX19KHQpLHRoaXMuZ2V0dGVyfHwodGhpcy5nZXR0ZXI9QikpLHRoaXMudmFsdWU9dGhpcy5sYXp5P3ZvaWQgMDp0aGlzLmdldCgpfTttbi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKCl7dmFyIGU7c2UodGhpcyk7dmFyIHQ9dGhpcy52bTt0cnl7ZT10aGlzLmdldHRlci5jYWxsKHQsdCl9Y2F0Y2goZSl7aWYoIXRoaXMudXNlcil0aHJvdyBlO05lKGUsdCwnZ2V0dGVyIGZvciB3YXRjaGVyICInK3RoaXMuZXhwcmVzc2lvbisnIicpfWZpbmFsbHl7dGhpcy5kZWVwJiZIZShlKSxjZSgpLHRoaXMuY2xlYW51cERlcHMoKX1yZXR1cm4gZX0sbW4ucHJvdG90eXBlLmFkZERlcD1mdW5jdGlvbihlKXt2YXIgdD1lLmlkO3RoaXMubmV3RGVwSWRzLmhhcyh0KXx8KHRoaXMubmV3RGVwSWRzLmFkZCh0KSx0aGlzLm5ld0RlcHMucHVzaChlKSx0aGlzLmRlcElkcy5oYXModCl8fGUuYWRkU3ViKHRoaXMpKX0sbW4ucHJvdG90eXBlLmNsZWFudXBEZXBzPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuZGVwcy5sZW5ndGg7ZS0tOyl7dmFyIHQ9dGhpcy5kZXBzW2VdO3RoaXMubmV3RGVwSWRzLmhhcyh0LmlkKXx8dC5yZW1vdmVTdWIodGhpcyl9dmFyIG49dGhpcy5kZXBJZHM7dGhpcy5kZXBJZHM9dGhpcy5uZXdEZXBJZHMsdGhpcy5uZXdEZXBJZHM9bix0aGlzLm5ld0RlcElkcy5jbGVhcigpLG49dGhpcy5kZXBzLHRoaXMuZGVwcz10aGlzLm5ld0RlcHMsdGhpcy5uZXdEZXBzPW4sdGhpcy5uZXdEZXBzLmxlbmd0aD0wfSxtbi5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5sYXp5P3RoaXMuZGlydHk9ITA6dGhpcy5zeW5jP3RoaXMucnVuKCk6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5pZDtpZihudWxsPT11blt0XSl7aWYodW5bdF09ITAsZG4pe2Zvcih2YXIgbj1zbi5sZW5ndGgtMTtmbjxuJiZzbltuXS5pZD5lLmlkOyluLS07c24uc3BsaWNlKG4rMSwwLGUpfWVsc2Ugc24ucHVzaChlKTtsbnx8KGxuPSEwLHFlKHZuKSl9fSh0aGlzKX0sbW4ucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe2lmKHRoaXMuYWN0aXZlKXt2YXIgZT10aGlzLmdldCgpO2lmKGUhPT10aGlzLnZhbHVlfHxiKGUpfHx0aGlzLmRlZXApe3ZhciB0PXRoaXMudmFsdWU7aWYodGhpcy52YWx1ZT1lLHRoaXMudXNlcil0cnl7dGhpcy5jYi5jYWxsKHRoaXMudm0sZSx0KX1jYXRjaChlKXtOZShlLHRoaXMudm0sJ2NhbGxiYWNrIGZvciB3YXRjaGVyICInK3RoaXMuZXhwcmVzc2lvbisnIicpfWVsc2UgdGhpcy5jYi5jYWxsKHRoaXMudm0sZSx0KX19fSxtbi5wcm90b3R5cGUuZXZhbHVhdGU9ZnVuY3Rpb24oKXt0aGlzLnZhbHVlPXRoaXMuZ2V0KCksdGhpcy5kaXJ0eT0hMX0sbW4ucHJvdG90eXBlLmRlcGVuZD1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLmRlcHMubGVuZ3RoO2UtLTspdGhpcy5kZXBzW2VdLmRlcGVuZCgpfSxtbi5wcm90b3R5cGUudGVhcmRvd249ZnVuY3Rpb24oKXtpZih0aGlzLmFjdGl2ZSl7dGhpcy52bS5faXNCZWluZ0Rlc3Ryb3llZHx8ayh0aGlzLnZtLl93YXRjaGVycyx0aGlzKTtmb3IodmFyIGU9dGhpcy5kZXBzLmxlbmd0aDtlLS07KXRoaXMuZGVwc1tlXS5yZW1vdmVTdWIodGhpcyk7dGhpcy5hY3RpdmU9ITF9fTt2YXIgeW49e2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpCLHNldDpCfTtmdW5jdGlvbiBfbihlLHQsbil7eW4uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbdF1bbl19LHluLnNldD1mdW5jdGlvbihlKXt0aGlzW3RdW25dPWV9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4seW4pfWZ1bmN0aW9uIGJuKGUpe2UuX3dhdGNoZXJzPVtdO3ZhciB0PWUuJG9wdGlvbnM7dC5wcm9wcyYmZnVuY3Rpb24obixyKXt2YXIgaT1uLiRvcHRpb25zLnByb3BzRGF0YXx8e30sbz1uLl9wcm9wcz17fSxhPW4uJG9wdGlvbnMuX3Byb3BLZXlzPVtdO24uJHBhcmVudCYmeWUoITEpO3ZhciBlPWZ1bmN0aW9uKGUpe2EucHVzaChlKTt2YXIgdD1QZShlLHIsaSxuKTt3ZShvLGUsdCksZSBpbiBufHxfbihuLCJfcHJvcHMiLGUpfTtmb3IodmFyIHQgaW4gcillKHQpO3llKCEwKX0oZSx0LnByb3BzKSx0Lm1ldGhvZHMmJmZ1bmN0aW9uKGUsdCl7ZS4kb3B0aW9ucy5wcm9wcztmb3IodmFyIG4gaW4gdCllW25dPSJmdW5jdGlvbiIhPXR5cGVvZiB0W25dP0I6bSh0W25dLGUpfShlLHQubWV0aG9kcyksdC5kYXRhP2Z1bmN0aW9uKGUpe3ZhciB0PWUuJG9wdGlvbnMuZGF0YTtkKHQ9ZS5fZGF0YT0iZnVuY3Rpb24iPT10eXBlb2YgdD93bih0LGUpOnR8fHt9KXx8KHQ9e30pO3ZhciBuPU9iamVjdC5rZXlzKHQpLHI9ZS4kb3B0aW9ucy5wcm9wcyxpPShlLiRvcHRpb25zLm1ldGhvZHMsbi5sZW5ndGgpO2Zvcig7aS0tOyl7dmFyIG89bltpXTtyJiZmKHIsbyl8fCh2b2lkIDAsMzYhPT0oYT0obysiIikuY2hhckNvZGVBdCgwKSkmJjk1IT09YSYmX24oZSwiX2RhdGEiLG8pKX12YXIgYTtiZSh0LCEwKX0oZSk6YmUoZS5fZGF0YT17fSwhMCksdC5jb21wdXRlZCYmZnVuY3Rpb24oZSx0KXt2YXIgbj1lLl9jb21wdXRlZFdhdGNoZXJzPU9iamVjdC5jcmVhdGUobnVsbCkscj1RKCk7Zm9yKHZhciBpIGluIHQpe3ZhciBvPXRbaV0sYT0iZnVuY3Rpb24iPT10eXBlb2Ygbz9vOm8uZ2V0O3J8fChuW2ldPW5ldyBtbihlLGF8fEIsQixrbikpLGkgaW4gZXx8U24oZSxpLG8pfX0oZSx0LmNvbXB1dGVkKSx0LndhdGNoJiZ0LndhdGNoIT09SyYmZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4gaW4gdCl7dmFyIHI9dFtuXTtpZihBcnJheS5pc0FycmF5KHIpKWZvcih2YXIgaT0wO2k8ci5sZW5ndGg7aSsrKVRuKGUsbixyW2ldKTtlbHNlIFRuKGUsbixyKX19KGUsdC53YXRjaCl9ZnVuY3Rpb24gd24oZSx0KXtzZSgpO3RyeXtyZXR1cm4gZS5jYWxsKHQsdCl9Y2F0Y2goZSl7cmV0dXJuIE5lKGUsdCwiZGF0YSgpIikse319ZmluYWxseXtjZSgpfX12YXIga249e2xhenk6ITB9O2Z1bmN0aW9uIFNuKGUsdCxuKXt2YXIgcj0hUSgpOyJmdW5jdGlvbiI9PXR5cGVvZiBuPyh5bi5nZXQ9cj94bih0KTpDbihuKSx5bi5zZXQ9Qik6KHluLmdldD1uLmdldD9yJiYhMSE9PW4uY2FjaGU/eG4odCk6Q24obi5nZXQpOkIseW4uc2V0PW4uc2V0fHxCKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHluKX1mdW5jdGlvbiB4bih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9jb21wdXRlZFdhdGNoZXJzJiZ0aGlzLl9jb21wdXRlZFdhdGNoZXJzW3RdO2lmKGUpcmV0dXJuIGUuZGlydHkmJmUuZXZhbHVhdGUoKSxhZS5TaGFyZWRPYmplY3QudGFyZ2V0JiZlLmRlcGVuZCgpLGUudmFsdWV9fWZ1bmN0aW9uIENuKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmNhbGwodGhpcyx0aGlzKX19ZnVuY3Rpb24gVG4oZSx0LG4scil7cmV0dXJuIGQobikmJihuPShyPW4pLmhhbmRsZXIpLCJzdHJpbmciPT10eXBlb2YgbiYmKG49ZVtuXSksZS4kd2F0Y2godCxuLHIpfXZhciBPbixFbixBbixJbiwkbixQbixNbixqbj0wO2Z1bmN0aW9uIExuKGUsdCl7dmFyIG49ZS4kb3B0aW9ucz1PYmplY3QuY3JlYXRlKGUuY29uc3RydWN0b3Iub3B0aW9ucykscj10Ll9wYXJlbnRWbm9kZTtuLnBhcmVudD10LnBhcmVudCxuLl9wYXJlbnRWbm9kZT1yLG4uX3BhcmVudEVsbT10Ll9wYXJlbnRFbG0sbi5fcmVmRWxtPXQuX3JlZkVsbTt2YXIgaT1yLmNvbXBvbmVudE9wdGlvbnM7bi5wcm9wc0RhdGE9aS5wcm9wc0RhdGEsbi5fcGFyZW50TGlzdGVuZXJzPWkubGlzdGVuZXJzLG4uX3JlbmRlckNoaWxkcmVuPWkuY2hpbGRyZW4sbi5fY29tcG9uZW50VGFnPWkudGFnLHQucmVuZGVyJiYobi5yZW5kZXI9dC5yZW5kZXIsbi5zdGF0aWNSZW5kZXJGbnM9dC5zdGF0aWNSZW5kZXJGbnMpfWZ1bmN0aW9uIE5uKGUpe3ZhciB0PWUub3B0aW9ucztpZihlLnN1cGVyKXt2YXIgbj1ObihlLnN1cGVyKTtpZihuIT09ZS5zdXBlck9wdGlvbnMpe2Uuc3VwZXJPcHRpb25zPW47dmFyIHI9ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLm9wdGlvbnMscj1lLnNlYWxlZE9wdGlvbnM7Zm9yKHZhciBpIGluIG4pbltpXSE9PXJbaV0mJih0fHwodD17fSksdFtpXT1uW2ldKTtyZXR1cm4gdH0oZSk7ciYmTihlLmV4dGVuZE9wdGlvbnMsciksKHQ9ZS5vcHRpb25zPUllKG4sZS5leHRlbmRPcHRpb25zKSkubmFtZSYmKHQuY29tcG9uZW50c1t0Lm5hbWVdPWUpfX1yZXR1cm4gdH1mdW5jdGlvbiBCbihlKXt0aGlzLl9pbml0KGUpfWZ1bmN0aW9uIERuKGUpe2UuY2lkPTA7dmFyIGE9MTtlLmV4dGVuZD1mdW5jdGlvbihlKXtlPWV8fHt9O3ZhciB0PXRoaXMsbj10LmNpZCxyPWUuX0N0b3J8fChlLl9DdG9yPXt9KTtpZihyW25dKXJldHVybiByW25dO3ZhciBpPWUubmFtZXx8dC5vcHRpb25zLm5hbWUsbz1mdW5jdGlvbihlKXt0aGlzLl9pbml0KGUpfTtyZXR1cm4oKG8ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1vKS5jaWQ9YSsrLG8ub3B0aW9ucz1JZSh0Lm9wdGlvbnMsZSksby5zdXBlcj10LG8ub3B0aW9ucy5wcm9wcyYmZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vcHRpb25zLnByb3BzO2Zvcih2YXIgbiBpbiB0KV9uKGUucHJvdG90eXBlLCJfcHJvcHMiLG4pfShvKSxvLm9wdGlvbnMuY29tcHV0ZWQmJmZ1bmN0aW9uKGUpe3ZhciB0PWUub3B0aW9ucy5jb21wdXRlZDtmb3IodmFyIG4gaW4gdClTbihlLnByb3RvdHlwZSxuLHRbbl0pfShvKSxvLmV4dGVuZD10LmV4dGVuZCxvLm1peGluPXQubWl4aW4sby51c2U9dC51c2Usai5mb3JFYWNoKGZ1bmN0aW9uKGUpe29bZV09dFtlXX0pLGkmJihvLm9wdGlvbnMuY29tcG9uZW50c1tpXT1vKSxvLnN1cGVyT3B0aW9ucz10Lm9wdGlvbnMsby5leHRlbmRPcHRpb25zPWUsby5zZWFsZWRPcHRpb25zPU4oe30sby5vcHRpb25zKSxyW25dPW99fWZ1bmN0aW9uIFJuKGUpe3JldHVybiBlJiYoZS5DdG9yLm9wdGlvbnMubmFtZXx8ZS50YWcpfWZ1bmN0aW9uIEZuKGUsdCl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/LTE8ZS5pbmRleE9mKHQpOiJzdHJpbmciPT10eXBlb2YgZT8tMTxlLnNwbGl0KCIsIikuaW5kZXhPZih0KToobj1lLCJbb2JqZWN0IFJlZ0V4cF0iPT09ci5jYWxsKG4pJiZlLnRlc3QodCkpO3ZhciBufWZ1bmN0aW9uIHpuKGUsdCl7dmFyIG49ZS5jYWNoZSxyPWUua2V5cyxpPWUuX3Zub2RlO2Zvcih2YXIgbyBpbiBuKXt2YXIgYT1uW29dO2lmKGEpe3ZhciBzPVJuKGEuY29tcG9uZW50T3B0aW9ucyk7cyYmIXQocykmJlVuKG4sbyxyLGkpfX19ZnVuY3Rpb24gVW4oZSx0LG4scil7dmFyIGk9ZVt0XTshaXx8ciYmaS50YWc9PT1yLnRhZ3x8aS5jb21wb25lbnRJbnN0YW5jZS4kZGVzdHJveSgpLGVbdF09bnVsbCxrKG4sdCl9Qm4ucHJvdG90eXBlLl9pbml0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dC5fdWlkPWpuKyssdC5faXNWdWU9ITAsZSYmZS5faXNDb21wb25lbnQ/TG4odCxlKTp0LiRvcHRpb25zPUllKE5uKHQuY29uc3RydWN0b3IpLGV8fHt9LHQpLG5uKCh0Ll9yZW5kZXJQcm94eT10KS5fc2VsZj10KSxKdCh0KSxxdCh0KSxhbih0LCJiZWZvcmVDcmVhdGUiKSwibXAtdG91dGlhbyIhPT10Lm1wSG9zdCYmdHQodCksYm4odCksIm1wLXRvdXRpYW8iIT09dC5tcEhvc3QmJmV0KHQpLCJtcC10b3V0aWFvIiE9PXQubXBIb3N0JiZhbih0LCJjcmVhdGVkIiksdC4kb3B0aW9ucy5lbCYmdC4kbW91bnQodC4kb3B0aW9ucy5lbCl9LE9uPUJuLEVuPXtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YX19LEFuPXtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvcHN9fSxPYmplY3QuZGVmaW5lUHJvcGVydHkoT24ucHJvdG90eXBlLCIkZGF0YSIsRW4pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPbi5wcm90b3R5cGUsIiRwcm9wcyIsQW4pLE9uLnByb3RvdHlwZS4kc2V0PWtlLE9uLnByb3RvdHlwZS4kZGVsZXRlPVNlLE9uLnByb3RvdHlwZS4kd2F0Y2g9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXM7aWYoZCh0KSlyZXR1cm4gVG4ocixlLHQsbik7KG49bnx8e30pLnVzZXI9ITA7dmFyIGk9bmV3IG1uKHIsZSx0LG4pO2lmKG4uaW1tZWRpYXRlKXRyeXt0LmNhbGwocixpLnZhbHVlKX1jYXRjaChlKXtOZShlLHIsJ2NhbGxiYWNrIGZvciBpbW1lZGlhdGUgd2F0Y2hlciAiJytpLmV4cHJlc3Npb24rJyInKX1yZXR1cm4gZnVuY3Rpb24oKXtpLnRlYXJkb3duKCl9fSwkbj0vXmhvb2s6LywoSW49Qm4pLnByb3RvdHlwZS4kb249ZnVuY3Rpb24oZSx0KXtpZihBcnJheS5pc0FycmF5KGUpKWZvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyl0aGlzLiRvbihlW25dLHQpO2Vsc2UodGhpcy5fZXZlbnRzW2VdfHwodGhpcy5fZXZlbnRzW2VdPVtdKSkucHVzaCh0KSwkbi50ZXN0KGUpJiYodGhpcy5faGFzSG9va0V2ZW50PSEwKTtyZXR1cm4gdGhpc30sSW4ucHJvdG90eXBlLiRvbmNlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztmdW5jdGlvbiByKCl7bi4kb2ZmKGUsciksdC5hcHBseShuLGFyZ3VtZW50cyl9cmV0dXJuIHIuZm49dCxuLiRvbihlLHIpLG59LEluLnByb3RvdHlwZS4kb2ZmPWZ1bmN0aW9uKGUsdCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXM7aWYoQXJyYXkuaXNBcnJheShlKSl7Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKXRoaXMuJG9mZihlW25dLHQpO3JldHVybiB0aGlzfXZhciBpLG89dGhpcy5fZXZlbnRzW2VdO2lmKCFvKXJldHVybiB0aGlzO2lmKCF0KXJldHVybiB0aGlzLl9ldmVudHNbZV09bnVsbCx0aGlzO2Zvcih2YXIgYT1vLmxlbmd0aDthLS07KWlmKChpPW9bYV0pPT09dHx8aS5mbj09PXQpe28uc3BsaWNlKGEsMSk7YnJlYWt9cmV0dXJuIHRoaXN9LEluLnByb3RvdHlwZS4kZW1pdD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9ldmVudHNbZV07aWYodCl7dD0xPHQubGVuZ3RoP3kodCk6dDtmb3IodmFyIG49eShhcmd1bWVudHMsMSkscj0nZXZlbnQgaGFuZGxlciBmb3IgIicrZSsnIicsaT0wLG89dC5sZW5ndGg7aTxvO2krKylCZSh0W2ldLHRoaXMsbix0aGlzLHIpfXJldHVybiB0aGlzfSwoUG49Qm4pLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj10aGlzLGk9ci4kZWwsbz1yLl92bm9kZSxhPShuPXRuLHRuPXIsZnVuY3Rpb24oKXt0bj1ufSk7ci5fdm5vZGU9ZSxvP3IuJGVsPXIuX19wYXRjaF9fKG8sZSk6KHIuJGVsPXIuX19wYXRjaF9fKHIuJGVsLGUsdCwhMSxyLiRvcHRpb25zLl9wYXJlbnRFbG0sci4kb3B0aW9ucy5fcmVmRWxtKSxyLiRvcHRpb25zLl9wYXJlbnRFbG09ci4kb3B0aW9ucy5fcmVmRWxtPW51bGwpLGEoKSxpJiYoaS5fX3Z1ZV9fPW51bGwpLHIuJGVsJiYoci4kZWwuX192dWVfXz1yKSxyLiR2bm9kZSYmci4kcGFyZW50JiZyLiR2bm9kZT09PXIuJHBhcmVudC5fdm5vZGUmJihyLiRwYXJlbnQuJGVsPXIuJGVsKX0sUG4ucHJvdG90eXBlLiRmb3JjZVVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuX3dhdGNoZXImJnRoaXMuX3dhdGNoZXIudXBkYXRlKCl9LFBuLnByb3RvdHlwZS4kZGVzdHJveT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYoIWUuX2lzQmVpbmdEZXN0cm95ZWQpe2FuKGUsImJlZm9yZURlc3Ryb3kiKSxlLl9pc0JlaW5nRGVzdHJveWVkPSEwO3ZhciB0PWUuJHBhcmVudDshdHx8dC5faXNCZWluZ0Rlc3Ryb3llZHx8ZS4kb3B0aW9ucy5hYnN0cmFjdHx8ayh0LiRjaGlsZHJlbixlKSxlLl93YXRjaGVyJiZlLl93YXRjaGVyLnRlYXJkb3duKCk7Zm9yKHZhciBuPWUuX3dhdGNoZXJzLmxlbmd0aDtuLS07KWUuX3dhdGNoZXJzW25dLnRlYXJkb3duKCk7ZS5fZGF0YS5fX29iX18mJmUuX2RhdGEuX19vYl9fLnZtQ291bnQtLSxlLl9pc0Rlc3Ryb3llZD0hMCxlLl9fcGF0Y2hfXyhlLl92bm9kZSxudWxsKSxhbihlLCJkZXN0cm95ZWQiKSxlLiRvZmYoKSxlLiRlbCYmKGUuJGVsLl9fdnVlX189bnVsbCksZS4kdm5vZGUmJihlLiR2bm9kZS5wYXJlbnQ9bnVsbCl9fSxrdCgoTW49Qm4pLnByb3RvdHlwZSksTW4ucHJvdG90eXBlLiRuZXh0VGljaz1mdW5jdGlvbihlKXtyZXR1cm4gcWUoZSx0aGlzKX0sTW4ucHJvdG90eXBlLl9yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdCxuPXRoaXMsZT1uLiRvcHRpb25zLHI9ZS5yZW5kZXIsaT1lLl9wYXJlbnRWbm9kZTtpJiYobi4kc2NvcGVkU2xvdHM9b3QoaS5kYXRhLnNjb3BlZFNsb3RzLG4uJHNsb3RzLG4uJHNjb3BlZFNsb3RzKSksbi4kdm5vZGU9aTt0cnl7SHQ9bix0PXIuY2FsbChuLl9yZW5kZXJQcm94eSxuLiRjcmVhdGVFbGVtZW50KX1jYXRjaChlKXtOZShlLG4sInJlbmRlciIpLHQ9bi5fdm5vZGV9ZmluYWxseXtIdD1udWxsfXJldHVybiBBcnJheS5pc0FycmF5KHQpJiYxPT09dC5sZW5ndGgmJih0PXRbMF0pLHQgaW5zdGFuY2VvZiB1ZXx8KHQ9ZGUoKSksdC5wYXJlbnQ9aSx0fTt2YXIgVm4scW4sV24sSG49W1N0cmluZyxSZWdFeHAsQXJyYXldLEduPXtLZWVwQWxpdmU6e25hbWU6ImtlZXAtYWxpdmUiLGFic3RyYWN0OiEwLHByb3BzOntpbmNsdWRlOkhuLGV4Y2x1ZGU6SG4sbWF4OltTdHJpbmcsTnVtYmVyXX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuY2FjaGU9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLmtleXM9W119LGRlc3Ryb3llZDpmdW5jdGlvbigpe2Zvcih2YXIgZSBpbiB0aGlzLmNhY2hlKVVuKHRoaXMuY2FjaGUsZSx0aGlzLmtleXMpfSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLiR3YXRjaCgiaW5jbHVkZSIsZnVuY3Rpb24odCl7em4oZSxmdW5jdGlvbihlKXtyZXR1cm4gRm4odCxlKX0pfSksdGhpcy4kd2F0Y2goImV4Y2x1ZGUiLGZ1bmN0aW9uKHQpe3puKGUsZnVuY3Rpb24oZSl7cmV0dXJuIUZuKHQsZSl9KX0pfSxyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRzbG90cy5kZWZhdWx0LHQ9WXQoZSksbj10JiZ0LmNvbXBvbmVudE9wdGlvbnM7aWYobil7dmFyIHI9Um4obiksaT10aGlzLmluY2x1ZGUsbz10aGlzLmV4Y2x1ZGU7aWYoaSYmKCFyfHwhRm4oaSxyKSl8fG8mJnImJkZuKG8scikpcmV0dXJuIHQ7dmFyIGE9dGhpcy5jYWNoZSxzPXRoaXMua2V5cyxjPW51bGw9PXQua2V5P24uQ3Rvci5jaWQrKG4udGFnPyI6OiIrbi50YWc6IiIpOnQua2V5O2FbY10/KHQuY29tcG9uZW50SW5zdGFuY2U9YVtjXS5jb21wb25lbnRJbnN0YW5jZSxrKHMsYykscy5wdXNoKGMpKTooYVtjXT10LHMucHVzaChjKSx0aGlzLm1heCYmcy5sZW5ndGg+cGFyc2VJbnQodGhpcy5tYXgpJiZVbihhLHNbMF0scyx0aGlzLl92bm9kZSkpLHQuZGF0YS5rZWVwQWxpdmU9ITB9cmV0dXJuIHR8fGUmJmVbMF19fX07Vm49Qm4sV249e2dldDpmdW5jdGlvbigpe3JldHVybiBSfX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KFZuLCJjb25maWciLFduKSxWbi51dGlsPXt3YXJuOmllLGV4dGVuZDpOLG1lcmdlT3B0aW9uczpJZSxkZWZpbmVSZWFjdGl2ZTp3ZX0sVm4uc2V0PWtlLFZuLmRlbGV0ZT1TZSxWbi5uZXh0VGljaz1xZSxWbi5vYnNlcnZhYmxlPWZ1bmN0aW9uKGUpe3JldHVybiBiZShlKSxlfSxWbi5vcHRpb25zPU9iamVjdC5jcmVhdGUobnVsbCksai5mb3JFYWNoKGZ1bmN0aW9uKGUpe1ZuLm9wdGlvbnNbZSsicyJdPU9iamVjdC5jcmVhdGUobnVsbCl9KSxOKChWbi5vcHRpb25zLl9iYXNlPVZuKS5vcHRpb25zLmNvbXBvbmVudHMsR24pLFZuLnVzZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9pbnN0YWxsZWRQbHVnaW5zfHwodGhpcy5faW5zdGFsbGVkUGx1Z2lucz1bXSk7aWYoLTE8dC5pbmRleE9mKGUpKXJldHVybiB0aGlzO3ZhciBuPXkoYXJndW1lbnRzLDEpO3JldHVybiBuLnVuc2hpZnQodGhpcyksImZ1bmN0aW9uIj09dHlwZW9mIGUuaW5zdGFsbD9lLmluc3RhbGwuYXBwbHkoZSxuKToiZnVuY3Rpb24iPT10eXBlb2YgZSYmZS5hcHBseShudWxsLG4pLHQucHVzaChlKSx0aGlzfSxWbi5taXhpbj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vcHRpb25zPUllKHRoaXMub3B0aW9ucyxlKSx0aGlzfSxEbihWbikscW49Vm4sai5mb3JFYWNoKGZ1bmN0aW9uKG4pe3FuW25dPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/KCJjb21wb25lbnQiPT09biYmZCh0KSYmKHQubmFtZT10Lm5hbWV8fGUsdD10aGlzLm9wdGlvbnMuX2Jhc2UuZXh0ZW5kKHQpKSwiZGlyZWN0aXZlIj09PW4mJiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYodD17YmluZDp0LHVwZGF0ZTp0fSksdGhpcy5vcHRpb25zW24rInMiXVtlXT10KTp0aGlzLm9wdGlvbnNbbisicyJdW2VdfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCbi5wcm90b3R5cGUsIiRpc1NlcnZlciIse2dldDpRfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEJuLnByb3RvdHlwZSwiJHNzckNvbnRleHQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdm5vZGUmJnRoaXMuJHZub2RlLnNzckNvbnRleHR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEJuLCJGdW5jdGlvbmFsUmVuZGVyQ29udGV4dCIse3ZhbHVlOlN0fSksQm4udmVyc2lvbj0iMi42LjEwIjt2YXIgWG49MTtmdW5jdGlvbiBZbihlKXt0aGlzLmluc3RhbmNlSWQ9IiIsdGhpcy5ub2RlSWQ9WG4rKyx0aGlzLnBhcmVudE5vZGU9bnVsbCx0aGlzLm5vZGVUeXBlPTMsdGhpcy50ZXh0PWV9ZnVuY3Rpb24gSm4oZSl7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChlKX12YXIgS249T2JqZWN0LmZyZWV6ZSh7bmFtZXNwYWNlTWFwOnt9LGNyZWF0ZUVsZW1lbnQ6Sm4sY3JlYXRlRWxlbWVudE5TOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGEuY3JlYXRlRWxlbWVudChlKyI6Iit0KX0sY3JlYXRlVGV4dE5vZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBZbihlKX0sY3JlYXRlQ29tbWVudDpmdW5jdGlvbihlKXtyZXR1cm4gYS5jcmVhdGVDb21tZW50KGUpfSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24oZSx0LG4pe2lmKDMhPT10Lm5vZGVUeXBlKWUuaW5zZXJ0QmVmb3JlKHQsbik7ZWxzZXt2YXIgcj0id2VleCI9PT1hLl9fJGNvbXBpbGVyX18/InRleHQiOiJ1LXRleHQiO2lmKGUudHlwZT09PXIpZS5zZXRBdHRyKCJ2YWx1ZSIsdC50ZXh0KSx0LnBhcmVudE5vZGU9ZTtlbHNle3ZhciBpPUpuKHIpO2kuc2V0QXR0cigidmFsdWUiLHQudGV4dCksZS5pbnNlcnRCZWZvcmUoaSxuKX19fSxyZW1vdmVDaGlsZDpmdW5jdGlvbihlLHQpezMhPT10Lm5vZGVUeXBlP2UucmVtb3ZlQ2hpbGQodCk6ZS5zZXRBdHRyKCJ2YWx1ZSIsIiIpfSxhcHBlbmRDaGlsZDpmdW5jdGlvbihlLHQpe2lmKDMhPT10Lm5vZGVUeXBlKWUuYXBwZW5kQ2hpbGQodCk7ZWxzZXt2YXIgbj0id2VleCI9PT1hLl9fJGNvbXBpbGVyX18/InRleHQiOiJ1LXRleHQiO2lmKGUudHlwZT09PW4pZS5zZXRBdHRyKCJ2YWx1ZSIsdC50ZXh0KSx0LnBhcmVudE5vZGU9ZTtlbHNle3ZhciByPUpuKG4pO3Iuc2V0QXR0cigidmFsdWUiLHQudGV4dCksZS5hcHBlbmRDaGlsZChyKX19fSxwYXJlbnROb2RlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnBhcmVudE5vZGV9LG5leHRTaWJsaW5nOmZ1bmN0aW9uKGUpe3JldHVybiBlLm5leHRTaWJsaW5nfSx0YWdOYW1lOmZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGV9LHNldFRleHRDb250ZW50OmZ1bmN0aW9uKGUsdCl7ZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUuc2V0QXR0cigidmFsdWUiLHQpfSxzZXRBdHRyaWJ1dGU6ZnVuY3Rpb24oZSx0LG4pe2Uuc2V0QXR0cih0LG4pfSxzZXRTdHlsZVNjb3BlOmZ1bmN0aW9uKGUsdCl7ZS5zZXRBdHRyKCJAc3R5bGVTY29wZSIsdCl9fSksWm49e2NyZWF0ZTpmdW5jdGlvbihlLHQpe1FuKHQpfSx1cGRhdGU6ZnVuY3Rpb24oZSx0KXtlLmRhdGEucmVmIT09dC5kYXRhLnJlZiYmKFFuKGUsITApLFFuKHQpKX0sZGVzdHJveTpmdW5jdGlvbihlKXtRbihlLCEwKX19O2Z1bmN0aW9uIFFuKGUsdCl7dmFyIG49ZS5kYXRhLnJlZjtpZihBKG4pKXt2YXIgcj1lLmNvbnRleHQsaT1lLmNvbXBvbmVudEluc3RhbmNlfHxlLmVsbSxvPXIuJHJlZnM7dD9BcnJheS5pc0FycmF5KG9bbl0pP2sob1tuXSxpKTpvW25dPT09aSYmKG9bbl09dm9pZCAwKTplLmRhdGEucmVmSW5Gb3I/QXJyYXkuaXNBcnJheShvW25dKT9vW25dLmluZGV4T2YoaSk8MCYmb1tuXS5wdXNoKGkpOm9bbl09W2ldOm9bbl09aX19cygiaHRtbCxib2R5LGJhc2UsaGVhZCxsaW5rLG1ldGEsc3R5bGUsdGl0bGUsYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGZvb3RlcixoZWFkZXIsaDEsaDIsaDMsaDQsaDUsaDYsaGdyb3VwLG5hdixzZWN0aW9uLGRpdixkZCxkbCxkdCxmaWdjYXB0aW9uLGZpZ3VyZSxwaWN0dXJlLGhyLGltZyxsaSxtYWluLG9sLHAscHJlLHVsLGEsYixhYmJyLGJkaSxiZG8sYnIsY2l0ZSxjb2RlLGRhdGEsZGZuLGVtLGksa2JkLG1hcmsscSxycCxydCxydGMscnVieSxzLHNhbXAsc21hbGwsc3BhbixzdHJvbmcsc3ViLHN1cCx0aW1lLHUsdmFyLHdicixhcmVhLGF1ZGlvLG1hcCx0cmFjayx2aWRlbyxlbWJlZCxvYmplY3QscGFyYW0sc291cmNlLGNhbnZhcyxzY3JpcHQsbm9zY3JpcHQsZGVsLGlucyxjYXB0aW9uLGNvbCxjb2xncm91cCx0YWJsZSx0aGVhZCx0Ym9keSx0ZCx0aCx0cixidXR0b24sZGF0YWxpc3QsZmllbGRzZXQsZm9ybSxpbnB1dCxsYWJlbCxsZWdlbmQsbWV0ZXIsb3B0Z3JvdXAsb3B0aW9uLG91dHB1dCxwcm9ncmVzcyxzZWxlY3QsdGV4dGFyZWEsZGV0YWlscyxkaWFsb2csbWVudSxtZW51aXRlbSxzdW1tYXJ5LGNvbnRlbnQsZWxlbWVudCxzaGFkb3csdGVtcGxhdGUsYmxvY2txdW90ZSxpZnJhbWUsdGZvb3QiKSxzKCJzdmcsYW5pbWF0ZSxjaXJjbGUsY2xpcHBhdGgsY3Vyc29yLGRlZnMsZGVzYyxlbGxpcHNlLGZpbHRlcixmb250LWZhY2UsZm9yZWlnbk9iamVjdCxnLGdseXBoLGltYWdlLGxpbmUsbWFya2VyLG1hc2ssbWlzc2luZy1nbHlwaCxwYXRoLHBhdHRlcm4scG9seWdvbixwb2x5bGluZSxyZWN0LHN3aXRjaCxzeW1ib2wsdGV4dCx0ZXh0cGF0aCx0c3Bhbix1c2UsdmlldyIsITApO3ZhciBlcj1zKCJ0ZXh0LG51bWJlcixwYXNzd29yZCxzZWFyY2gsZW1haWwsdGVsLHVybCIpLHRyPW5ldyB1ZSgiIix7fSxbXSksbnI9WyJjcmVhdGUiLCJhY3RpdmF0ZSIsInVwZGF0ZSIsInJlbW92ZSIsImRlc3Ryb3kiXTtmdW5jdGlvbiBycihlLHQpe3JldHVybiBlLmtleT09PXQua2V5JiYoZS50YWc9PT10LnRhZyYmZS5pc0NvbW1lbnQ9PT10LmlzQ29tbWVudCYmQShlLmRhdGEpPT09QSh0LmRhdGEpJiZmdW5jdGlvbihlLHQpe2lmKCJpbnB1dCIhPT1lLnRhZylyZXR1cm4hMDt2YXIgbixyPUEobj1lLmRhdGEpJiZBKG49bi5hdHRycykmJm4udHlwZSxpPUEobj10LmRhdGEpJiZBKG49bi5hdHRycykmJm4udHlwZTtyZXR1cm4gcj09PWl8fGVyKHIpJiZlcihpKX0oZSx0KXx8SShlLmlzQXN5bmNQbGFjZWhvbGRlcikmJmUuYXN5bmNGYWN0b3J5PT09dC5hc3luY0ZhY3RvcnkmJkUodC5hc3luY0ZhY3RvcnkuZXJyb3IpKX1mdW5jdGlvbiBpcihlLHQsbil7dmFyIHIsaSxvPXt9O2ZvcihyPXQ7cjw9bjsrK3IpQShpPWVbcl0ua2V5KSYmKG9baV09cik7cmV0dXJuIG99dmFyIG9yPXtjcmVhdGU6YXIsdXBkYXRlOmFyLGRlc3Ryb3k6ZnVuY3Rpb24oZSl7YXIoZSx0cil9fTtmdW5jdGlvbiBhcihlLHQpeyhlLmRhdGEuZGlyZWN0aXZlc3x8dC5kYXRhLmRpcmVjdGl2ZXMpJiZmdW5jdGlvbih0LG4pe3ZhciBlLHIsaSxvPXQ9PT10cixhPW49PT10cixzPWNyKHQuZGF0YS5kaXJlY3RpdmVzLHQuY29udGV4dCksYz1jcihuLmRhdGEuZGlyZWN0aXZlcyxuLmNvbnRleHQpLHU9W10sbD1bXTtmb3IoZSBpbiBjKXI9c1tlXSxpPWNbZV0scj8oaS5vbGRWYWx1ZT1yLnZhbHVlLGkub2xkQXJnPXIuYXJnLHVyKGksInVwZGF0ZSIsbix0KSxpLmRlZiYmaS5kZWYuY29tcG9uZW50VXBkYXRlZCYmbC5wdXNoKGkpKToodXIoaSwiYmluZCIsbix0KSxpLmRlZiYmaS5kZWYuaW5zZXJ0ZWQmJnUucHVzaChpKSk7aWYodS5sZW5ndGgpe3ZhciBkPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTx1Lmxlbmd0aDtlKyspdXIodVtlXSwiaW5zZXJ0ZWQiLG4sdCl9O28/SmUobiwiaW5zZXJ0IixkKTpkKCl9bC5sZW5ndGgmJkplKG4sInBvc3RwYXRjaCIsZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPGwubGVuZ3RoO2UrKyl1cihsW2VdLCJjb21wb25lbnRVcGRhdGVkIixuLHQpfSk7aWYoIW8pZm9yKGUgaW4gcyljW2VdfHx1cihzW2VdLCJ1bmJpbmQiLHQsdCxhKX0oZSx0KX12YXIgc3I9T2JqZWN0LmNyZWF0ZShudWxsKTtmdW5jdGlvbiBjcihlLHQpe3ZhciBuLHIsaSxvPU9iamVjdC5jcmVhdGUobnVsbCk7aWYoIWUpcmV0dXJuIG87Zm9yKG49MDtuPGUubGVuZ3RoO24rKykocj1lW25dKS5tb2RpZmllcnN8fChyLm1vZGlmaWVycz1zciksKG9bKGk9cixpLnJhd05hbWV8fGkubmFtZSsiLiIrT2JqZWN0LmtleXMoaS5tb2RpZmllcnN8fHt9KS5qb2luKCIuIikpXT1yKS5kZWY9JGUodC4kb3B0aW9ucywiZGlyZWN0aXZlcyIsci5uYW1lKTtyZXR1cm4gb31mdW5jdGlvbiB1cih0LG4scixlLGkpe3ZhciBvPXQuZGVmJiZ0LmRlZltuXTtpZihvKXRyeXtvKHIuZWxtLHQscixlLGkpfWNhdGNoKGUpe05lKGUsci5jb250ZXh0LCJkaXJlY3RpdmUgIit0Lm5hbWUrIiAiK24rIiBob29rIil9fXZhciBscj1bWm4sb3JdLGRyPXUoZnVuY3Rpb24oZSl7dmFyIG49e30scj0vOiguKykvO3JldHVybiBlLnNwbGl0KC87KD8hW14oXSpcKSkvZykuZm9yRWFjaChmdW5jdGlvbihlKXtpZihlKXt2YXIgdD1lLnNwbGl0KHIpOzE8dC5sZW5ndGgmJihuW3RbMF0udHJpbSgpXT10WzFdLnRyaW0oKSl9fSksbn0pO2Z1bmN0aW9uIGZyKGUpe3ZhciB0PXByKGUuc3R5bGUpO3JldHVybiBlLnN0YXRpY1N0eWxlP04oZS5zdGF0aWNTdHlsZSx0KTp0fWZ1bmN0aW9uIHByKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP3goZSk6InN0cmluZyI9PXR5cGVvZiBlP2RyKGUpOmV9dmFyIGhyPXt2aWV3OntjbGFzczpbImhvdmVyQ2xhc3MiXSxzdHlsZTpbXX0sYnV0dG9uOntjbGFzczpbImhvdmVyQ2xhc3MiXSxzdHlsZTpbXX0sbmF2aWdhdG9yOntjbGFzczpbImhvdmVyQ2xhc3MiXSxzdHlsZTpbXX0sInUtaW5wdXQiOntjbGFzczpbInBsYWNlaG9sZGVyQ2xhc3MiXSxzdHlsZTpbInBsYWNlaG9sZGVyU3R5bGUiXX0sInUtdGV4dGFyZWEiOntjbGFzczpbInBsYWNlaG9sZGVyQ2xhc3MiXSxzdHlsZTpbInBsYWNlaG9sZGVyU3R5bGUiXX0sInBpY2tlci12aWV3Ijp7Y2xhc3M6WyJpbmRpY2F0b3JDbGFzcyIsIm1hc2tDbGFzcyJdLHN0eWxlOlsiaW5kaWNhdG9yU3R5bGUiLCJtYXNrU3R5bGUiXX19O2Z1bmN0aW9uIHZyKGUsdCxuLHIpe2lmKCF0KXJldHVybiB0O3ZhciBpPWhyW24udHlwZV07aWYoaSl7aWYoLTEhPT1pLmNsYXNzLmluZGV4T2YoZSkpcmV0dXJuIHIuJG9wdGlvbnMuc3R5bGUmJnIuJG9wdGlvbnMuc3R5bGVbdF18fHt9O2lmKC0xIT09aS5zdHlsZS5pbmRleE9mKGUpKXJldHVybiBwcih0KX1yZXR1cm4gdH1mdW5jdGlvbiBncihlLHQpe2lmKGUuZGF0YS5hdHRyc3x8dC5kYXRhLmF0dHJzKXt2YXIgbixyLGk9dC5lbG0sbz1lLmRhdGEuYXR0cnN8fHt9LGE9dC5kYXRhLmF0dHJzfHx7fTthLl9fb2JfXyYmKGE9dC5kYXRhLmF0dHJzPU4oe30sYSkpO3ZhciBzPSJmdW5jdGlvbiI9PXR5cGVvZiBpLnNldEF0dHJzLGM9e307Zm9yKG4gaW4gYSlyPWFbbl0sb1tuXSE9PXImJihzP2Nbbl09cjppLnNldEF0dHIobix2cihuLHIsaSx0LmNvbnRleHQpKSk7Zm9yKG4gaW4gbyludWxsPT1hW25dJiYocz9jW25dPXZvaWQgMDppLnNldEF0dHIobikpO3MmJmkuc2V0QXR0cnMoZnVuY3Rpb24obyxlLHQpe3ZhciBhPWhyW2UudHlwZV07aWYoIWEpcmV0dXJuIG87dmFyIHM9dC4kb3B0aW9ucy5zdHlsZXx8e30sYz1zWyJAVkVSU0lPTiJdfHwxO3JldHVybiBPYmplY3Qua2V5cyhvKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PW9bZV07aWYoLTEhPT1hLmNsYXNzLmluZGV4T2YoZSkpaWYoYzwyfHwhKCIuIit0IGluIHMpKW9bZV09c1t0XXx8e307ZWxzZXt2YXIgbj0oc1siLiIrdF18fHt9KVsiIl18fHt9LHI9e307Zm9yKHZhciBpIGluIG4pcltpXT1uW2ldWzBdO29bZV09cn1lbHNlLTEhPT1hLnN0eWxlLmluZGV4T2YoZSkmJihvW2VdPXByKHQpKX0pLG99KGMsaSx0LmNvbnRleHQpKX19dmFyIG1yPXtjcmVhdGU6Z3IsdXBkYXRlOmdyfTtmdW5jdGlvbiB5cihlKXtmb3IodmFyIHQ9X3IoZSksbj1lLHI9ZTtBKHIuY29tcG9uZW50SW5zdGFuY2UpOykocj1yLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSkmJnIuZGF0YSYmKHQ9TihfcihyKSx0KSk7Zm9yKDtBKG49bi5wYXJlbnQpOyluJiZuLmRhdGEmJih0PU4odCxfcihuKSkpO3JldHVybiB0fWZ1bmN0aW9uIF9yKGUpe3ZhciB0LG4scixpLG89ZS5kYXRhO3JldHVybiBFKG8uc3RhdGljQ2xhc3MpJiZFKG8uY2xhc3MpP3t9Oih0PWZ1bmN0aW9uKGUpe3ZhciB0PVtdLG49ZS5zdGF0aWNDbGFzcyxyPWUuY2xhc3M7biYmdC5wdXNoLmFwcGx5KHQsbik7QXJyYXkuaXNBcnJheShyKT90LnB1c2guYXBwbHkodCxyKTpiKHIpP3QucHVzaC5hcHBseSh0LE9iamVjdC5rZXlzKHIpLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gcltlXX0pKToic3RyaW5nIj09dHlwZW9mIHImJnQucHVzaC5hcHBseSh0LHIudHJpbSgpLnNwbGl0KC9ccysvKSk7cmV0dXJuIHR9KG8pLG49ZS5jb250ZXh0LHI9bi4kb3B0aW9ucy5zdHlsZXx8e30saT17fSx0LmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9cltlXTtOKGksdCl9KSxpKX1mdW5jdGlvbiBicihlLHQsbixyKXt2YXIgaSxvLGE9e307Zm9yKG8gaW4gbilFKHRbb10pJiYoYVtyKG8pXT0iIik7Zm9yKG8gaW4gdCkoaT10W29dKSE9PW5bb10mJihhW3IobyldPWkpO2Uuc2V0U3R5bGVzKGEpfWZ1bmN0aW9uIHdyKGUsdCxuKXt2YXIgcj10JiZ0LmNvbnRleHQuJG9wdGlvbnMuc3R5bGU7ciYmIWUuaW5jbHVkZXMocikmJihuP2UudW5zaGlmdChyKTplLnB1c2gocikpfWZ1bmN0aW9uIGtyKGUpe2Zvcih2YXIgdD1lLmRhdGEsbj1lLHI9ZTtBKHIuY29tcG9uZW50SW5zdGFuY2UpOykocj1yLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSkmJnIuZGF0YSYmKHQ9U3Ioci5kYXRhLHQpKTtmb3IoO0Eobj1uLnBhcmVudCk7KW4mJm4uZGF0YSYmKHQ9U3IodCxuLmRhdGEpKTtyZXR1cm4gZnVuY3Rpb24oZSx0KXtpZihBKGUpfHxBKHQpKXJldHVybiB4cihDcihlKSxDcih0KSk7cmV0dXJuIiJ9KHQuc3RhdGljQ2xhc3MsdC5jbGFzcyl9ZnVuY3Rpb24gU3IoZSx0KXtyZXR1cm57c3RhdGljQ2xhc3M6eHIoQ3IoZS5zdGF0aWNDbGFzcyksQ3IodC5zdGF0aWNDbGFzcykpLGNsYXNzOkEoZS5jbGFzcyk/W2UuY2xhc3MsdC5jbGFzc106dC5jbGFzc319ZnVuY3Rpb24geHIoZSx0KXtyZXR1cm4gZT90P2UrIiAiK3Q6ZTp0fHwiIn1mdW5jdGlvbiBDcihlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9mdW5jdGlvbihlKXtmb3IodmFyIHQsbj0iIixyPTAsaT1lLmxlbmd0aDtyPGk7cisrKUEodD1DcihlW3JdKSkmJiIiIT09dCYmKG4mJihuKz0iICIpLG4rPXQpO3JldHVybiBufShlKTpiKGUpP2Z1bmN0aW9uKGUpe3ZhciB0PSIiO2Zvcih2YXIgbiBpbiBlKWVbbl0mJih0JiYodCs9IiAiKSx0Kz1uKTtyZXR1cm4gdH0oZSk6InN0cmluZyI9PXR5cGVvZiBlP2U6IiJ9ZnVuY3Rpb24gVHIoZSx0KXt2YXIgbj10LmRhdGEscj1lLmRhdGE7aWYoIShFKG4uc3RhdGljQ2xhc3MpJiZFKG4uY2xhc3MpJiYoRShyKXx8RShyLnN0YXRpY0NsYXNzKSYmRShyLmNsYXNzKSkpKXt2YXIgaT0id2VleCI9PT1hLl9fJHN0eWxlQ29tcGlsZXJfXztpZihhLl9fJGF1dG9tYXRvcl9ffHwhaSl7aXx8dC5lbG0uc2V0U3R5bGVzaGVldCYmdC5lbG0uc2V0U3R5bGVzaGVldChmdW5jdGlvbihlKXt2YXIgdD1bXSxuPWUscj1lO2Zvcih3cih0LGUpO0Eoci5jb21wb25lbnRJbnN0YW5jZSk7KXdyKHQscj1yLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSwhMCk7Zm9yKDtBKG49bi5wYXJlbnQpOyl3cih0LG4pO3JldHVybiB0fSh0KSk7dmFyIG89a3IodCk7dC5lbG0uc2V0Q2xhc3NMaXN0JiZ0LmVsbS5zZXRDbGFzc0xpc3Qoby5zcGxpdCgiICIpKX1pJiZicih0LmVsbSx5cih0KSx5cihlKSxPcil9fWZ1bmN0aW9uIE9yKGUpe3JldHVybiBlfXZhciBFcixBcixJcj17Y3JlYXRlOlRyLHVwZGF0ZTpUcn07ZnVuY3Rpb24gJHIoZSx0LG4scixpKXtpZihuKWNvbnNvbGUubG9nKCJXZWV4IGRvIG5vdCBzdXBwb3J0IGV2ZW50IGluIGJ1YmJsZSBwaGFzZS4iKTtlbHNle2lmKEFyJiZBci5fdmlydHVhbENvbXBvbmVudHMpe0VyLl9jb250ZXh0PUFyO3ZhciBvPXQ7dD1mdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMsdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGg7bi0tOyl0W25dPWVbbl07dmFyIHI9KHRbMF18fHt9KS5jb21wb25lbnRJZCxpPXRoaXMuX2NvbnRleHQ7ciYmdGhpcy5fY29udGV4dCYmKGk9KHRoaXMuX2NvbnRleHQuX3ZpcnR1YWxDb21wb25lbnRzfHx7fSlbcl18fGkpO3RyeXshZnVuY3Rpb24oZSx0LG4pe3ZvaWQgMD09PW4mJihuPW51bGwpO3ZhciByPWUuZm5zO2lmKCFBcnJheS5pc0FycmF5KHIpKXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiByP3IuYXBwbHkobix0KTplLmFwcGx5KG4sdCk7Zm9yKHZhciBpPXIuc2xpY2UoKSxvPTA7bzxpLmxlbmd0aDtvKyspaVtvXS5hcHBseShuLHQpfShvLHQsaSl9Y2F0Y2goZSl7TmUoZSxpLCJGYWlsZWQgdG8gaW52b2tlIHZpcnR1YWwgY29tcG9uZW50IGhhbmRsZXIgKCIrcisiKSIpfX19RXIuYWRkRXZlbnQoZSx0LGkpfX1mdW5jdGlvbiBQcihlLHQsbixyKXsocnx8RXIpLnJlbW92ZUV2ZW50KGUpfWZ1bmN0aW9uIE1yKGUsdCl7aWYoZS5kYXRhLm9ufHx0LmRhdGEub24pe3ZhciBuPXQuZGF0YS5vbnx8e30scj1lLmRhdGEub258fHt9O0VyPXQuZWxtLEFyPXQuY29udGV4dCxZZShuLHIsJHIsUHIsdC5jb250ZXh0KSxBcj1Fcj12b2lkIDB9fXZhciBqcj17Y3JlYXRlOk1yLHVwZGF0ZTpNcn0sTHI9dShoKTtmdW5jdGlvbiBOcihlLHQpe3ZhciBuPXQuZGF0YSxyPWUuZGF0YTtpZighKEUobi5zdGF0aWNTdHlsZSkmJkUobi5zdHlsZSkmJkUoci5zdGF0aWNTdHlsZSkmJkUoci5zdHlsZSkpKXt2YXIgaT10LmVsbSxvPXIuc3RhdGljU3R5bGUsYT1yLm5vcm1hbGl6ZWRTdHlsZXx8ci5zdHlsZXx8e30scz1vfHxhLGM9cHIodC5kYXRhLnN0eWxlKXx8e307dC5kYXRhLm5vcm1hbGl6ZWRTdHlsZT1BKGMuX19vYl9fKT9OKHt9LGMpOmMsYnIoaSxmdW5jdGlvbihlLHQpe3ZhciBuLHI9e307aWYodClmb3IodmFyIGk9ZTtpLmNvbXBvbmVudEluc3RhbmNlOykoaT1pLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSkmJmkuZGF0YSYmKG49ZnIoaS5kYXRhKSkmJk4ocixuKTsobj1mcihlLmRhdGEpKSYmTihyLG4pO2Zvcih2YXIgbz1lO289by5wYXJlbnQ7KW8uZGF0YSYmKG49ZnIoby5kYXRhKSkmJk4ocixuKTtyZXR1cm4gcn0odCwhMCkscyxMcil9fXZhciBCcj17Y3JlYXRlOk5yLHVwZGF0ZTpOcn07ZnVuY3Rpb24gRHIoZSl7aWYoZSl7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXt2YXIgdD17fTtyZXR1cm4hMSE9PWUuY3NzJiZOKHQsUnIoZS5uYW1lfHwidiIpKSxOKHQsZSksdH1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/UnIoZSk6dm9pZCAwfX12YXIgUnI9dShmdW5jdGlvbihlKXtyZXR1cm57ZW50ZXJDbGFzczplKyItZW50ZXIiLGVudGVyVG9DbGFzczplKyItZW50ZXItdG8iLGVudGVyQWN0aXZlQ2xhc3M6ZSsiLWVudGVyLWFjdGl2ZSIsbGVhdmVDbGFzczplKyItbGVhdmUiLGxlYXZlVG9DbGFzczplKyItbGVhdmUtdG8iLGxlYXZlQWN0aXZlQ2xhc3M6ZSsiLWxlYXZlLWFjdGl2ZSJ9fSk7cSYmIVkmJih2b2lkIDA9PT13aW5kb3cub250cmFuc2l0aW9uZW5kJiZ3aW5kb3cub253ZWJraXR0cmFuc2l0aW9uZW5kLHZvaWQgMD09PXdpbmRvdy5vbmFuaW1hdGlvbmVuZCYmd2luZG93Lm9ud2Via2l0YW5pbWF0aW9uZW5kKTtxJiZ3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lJiZ3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KTtmdW5jdGlvbiBGcihlLG4pe3ZhciByPW4uZWxtO3IuX2xlYXZlQ2ImJihyLl9sZWF2ZUNiLmNhbmNlbGxlZD0hMCxyLl9sZWF2ZUNiKCkpO3ZhciB0PURyKG4uZGF0YS50cmFuc2l0aW9uKTtpZih0JiYhci5fZW50ZXJDYil7Zm9yKHZhciBpPXQuZW50ZXJDbGFzcyxvPXQuZW50ZXJUb0NsYXNzLGE9dC5lbnRlckFjdGl2ZUNsYXNzLHM9dC5hcHBlYXJDbGFzcyxjPXQuYXBwZWFyVG9DbGFzcyx1PXQuYXBwZWFyQWN0aXZlQ2xhc3MsbD10LmJlZm9yZUVudGVyLGQ9dC5lbnRlcixmPXQuYWZ0ZXJFbnRlcixwPXQuZW50ZXJDYW5jZWxsZWQsaD10LmJlZm9yZUFwcGVhcix2PXQuYXBwZWFyLGc9dC5hZnRlckFwcGVhcixtPXQuYXBwZWFyQ2FuY2VsbGVkLHk9dG4sXz10bi4kdm5vZGU7XyYmXy5wYXJlbnQ7KXk9KF89Xy5wYXJlbnQpLmNvbnRleHQ7dmFyIGI9IXkuX2lzTW91bnRlZHx8IW4uaXNSb290SW5zZXJ0O2lmKCFifHx2fHwiIj09PXYpe3ZhciB3PWI/czppLGs9Yj9jOm8sUz1iP3U6YSx4PWImJmh8fGwsQz1iJiYiZnVuY3Rpb24iPT10eXBlb2Ygdj92OmQsVD1iJiZnfHxmLE89YiYmbXx8cCxFPUMmJjE8KEMuX2xlbmd0aHx8Qy5sZW5ndGgpLEE9bi5jb250ZXh0LiRvcHRpb25zLnN0eWxlfHx7fSxJPUFbd10sJD1BWyJAVFJBTlNJVElPTiJdJiZBWyJAVFJBTlNJVElPTiJdW1NdfHx7fSxQPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG89e30sYT10W25dLHM9dFtyXSxjPXRbaV07aWYoYSlmb3IodmFyIHUgaW4gYSlvW3VdPWUuc3R5bGVbdV07aWYoYylmb3IodmFyIGwgaW4gYykwIT09bC5pbmRleE9mKCJ0cmFuc2l0aW9uIikmJihvW2xdPWNbbF0pO3MmJk4obyxzKTtyZXR1cm4gb30ocixBLHcsayxTKSxNPTA8T2JqZWN0LmtleXMoUCkubGVuZ3RoLGo9ci5fZW50ZXJDYj1EKGZ1bmN0aW9uKCl7ai5jYW5jZWxsZWQ/TyYmTyhyKTpUJiZUKHIpLHIuX2VudGVyQ2I9bnVsbH0pO2lmKHNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgZT1yLnBhcmVudE5vZGUsdD1lJiZlLl9wZW5kaW5nJiZlLl9wZW5kaW5nW24ua2V5XTsodCYmdC5jb250ZXh0PT09bi5jb250ZXh0JiZ0LnRhZz09PW4udGFnJiZ0LmVsbS5fbGVhdmVDYiYmdC5lbG0uX2xlYXZlQ2IoKSxDJiZDKHIsaiksTSk/bi5jb250ZXh0LiRyZXF1aXJlV2VleE1vZHVsZSgiYW5pbWF0aW9uIikudHJhbnNpdGlvbihyLnJlZix7c3R5bGVzOlAsZHVyYXRpb246JC5kdXJhdGlvbnx8MCxkZWxheTokLmRlbGF5fHwwLHRpbWluZ0Z1bmN0aW9uOiQudGltaW5nRnVuY3Rpb258fCJsaW5lYXIifSxFP0I6aik6RXx8aigpfSwxNikseCYmeChyKSxJKWlmKCJmdW5jdGlvbiI9PXR5cGVvZiByLnNldFN0eWxlcylyLnNldFN0eWxlcyhJKTtlbHNlIGZvcih2YXIgTCBpbiBJKXIuc2V0U3R5bGUoTCxJW0xdKTtNfHxFfHxqKCl9fX12YXIgenI9ZnVuY3Rpb24oZSl7dmFyIHIsdCx5PXt9LG49ZS5tb2R1bGVzLF89ZS5ub2RlT3BzO2ZvcihyPTA7cjxuci5sZW5ndGg7KytyKWZvcih5W25yW3JdXT1bXSx0PTA7dDxuLmxlbmd0aDsrK3QpQShuW3RdW25yW3JdXSkmJnlbbnJbcl1dLnB1c2goblt0XVtucltyXV0pO2Z1bmN0aW9uIG8oZSl7dmFyIHQ9Xy5wYXJlbnROb2RlKGUpO0EodCkmJl8ucmVtb3ZlQ2hpbGQodCxlKX1mdW5jdGlvbiBiKGUsdCxuLHIsaSxvLGEpe2lmKEEoZS5lbG0pJiZBKG8pJiYoZT1vW2FdPXBlKGUpKSxlLmlzUm9vdEluc2VydD0haSwhZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9ZS5kYXRhO2lmKEEoaSkpe3ZhciBvPUEoZS5jb21wb25lbnRJbnN0YW5jZSkmJmkua2VlcEFsaXZlO2lmKEEoaT1pLmhvb2spJiZBKGk9aS5pbml0KSYmaShlLCExLG4sciksQShlLmNvbXBvbmVudEluc3RhbmNlKSlyZXR1cm4gcChlLHQpLGQobixlLmVsbSxyKSxJKG8pJiZmdW5jdGlvbihlLHQsbixyKXtmb3IodmFyIGksbz1lO28uY29tcG9uZW50SW5zdGFuY2U7KWlmKG89by5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUsQShpPW8uZGF0YSkmJkEoaT1pLnRyYW5zaXRpb24pKXtmb3IoaT0wO2k8eS5hY3RpdmF0ZS5sZW5ndGg7KytpKXkuYWN0aXZhdGVbaV0odHIsbyk7dC5wdXNoKG8pO2JyZWFrfWQobixlLmVsbSxyKX0oZSx0LG4sciksITB9fShlLHQsbixyKSl7dmFyIHM9ZS5kYXRhLGM9ZS5jaGlsZHJlbix1PWUudGFnO2lmKEEodSkpe2UuZWxtPWUubnM/Xy5jcmVhdGVFbGVtZW50TlMoZS5ucyx1KTpfLmNyZWF0ZUVsZW1lbnQodSxlKSxmKGUpO3ZhciBsPUEocykmJkkocy5hcHBlbmRBc1RyZWUpO2x8fChBKHMpJiZ2KGUsdCksZChuLGUuZWxtLHIpKSxoKGUsYyx0KSxsJiYoQShzKSYmdihlLHQpLGQobixlLmVsbSxyKSl9ZWxzZSBJKGUuaXNDb21tZW50KT9lLmVsbT1fLmNyZWF0ZUNvbW1lbnQoZS50ZXh0KTplLmVsbT1fLmNyZWF0ZVRleHROb2RlKGUudGV4dCksZChuLGUuZWxtLHIpfX1mdW5jdGlvbiBwKGUsdCl7QShlLmRhdGEucGVuZGluZ0luc2VydCkmJih0LnB1c2guYXBwbHkodCxlLmRhdGEucGVuZGluZ0luc2VydCksZS5kYXRhLnBlbmRpbmdJbnNlcnQ9bnVsbCksZS5lbG09ZS5jb21wb25lbnRJbnN0YW5jZS4kZWwsdyhlKT8odihlLHQpLGYoZSkpOihRbihlKSx0LnB1c2goZSkpfWZ1bmN0aW9uIGQoZSx0LG4pe0EoZSkmJihBKG4pP18ucGFyZW50Tm9kZShuKT09PWUmJl8uaW5zZXJ0QmVmb3JlKGUsdCxuKTpfLmFwcGVuZENoaWxkKGUsdCkpfWZ1bmN0aW9uIGgoZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKHZhciByPTA7cjx0Lmxlbmd0aDsrK3IpYih0W3JdLG4sZS5lbG0sbnVsbCwhMCx0LHIpO2Vsc2UgJChlLnRleHQpJiZfLmFwcGVuZENoaWxkKGUuZWxtLF8uY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGUudGV4dCkpKX1mdW5jdGlvbiB3KGUpe2Zvcig7ZS5jb21wb25lbnRJbnN0YW5jZTspZT1lLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTtyZXR1cm4gQShlLnRhZyl9ZnVuY3Rpb24gdihlLHQpe2Zvcih2YXIgbj0wO248eS5jcmVhdGUubGVuZ3RoOysrbil5LmNyZWF0ZVtuXSh0cixlKTtBKHI9ZS5kYXRhLmhvb2spJiYoQShyLmNyZWF0ZSkmJnIuY3JlYXRlKHRyLGUpLEEoci5pbnNlcnQpJiZ0LnB1c2goZSkpfWZ1bmN0aW9uIGYoZSl7dmFyIHQ7aWYoQSh0PWUuZm5TY29wZUlkKSlfLnNldFN0eWxlU2NvcGUoZS5lbG0sdCk7ZWxzZSBmb3IodmFyIG49ZTtuOylBKHQ9bi5jb250ZXh0KSYmQSh0PXQuJG9wdGlvbnMuX3Njb3BlSWQpJiZfLnNldFN0eWxlU2NvcGUoZS5lbG0sdCksbj1uLnBhcmVudDtBKHQ9dG4pJiZ0IT09ZS5jb250ZXh0JiZ0IT09ZS5mbkNvbnRleHQmJkEodD10LiRvcHRpb25zLl9zY29wZUlkKSYmXy5zZXRTdHlsZVNjb3BlKGUuZWxtLHQpfWZ1bmN0aW9uIG0oZSx0LG4scixpLG8pe2Zvcig7cjw9aTsrK3IpYihuW3JdLG8sZSx0LCExLG4scil9ZnVuY3Rpb24gayhlKXt2YXIgdCxuLHI9ZS5kYXRhO2lmKEEocikpZm9yKEEodD1yLmhvb2spJiZBKHQ9dC5kZXN0cm95KSYmdChlKSx0PTA7dDx5LmRlc3Ryb3kubGVuZ3RoOysrdCl5LmRlc3Ryb3lbdF0oZSk7aWYoQSh0PWUuY2hpbGRyZW4pKWZvcihuPTA7bjxlLmNoaWxkcmVuLmxlbmd0aDsrK24payhlLmNoaWxkcmVuW25dKX1mdW5jdGlvbiBTKGUsdCxuLHIpe2Zvcig7bjw9cjsrK24pe3ZhciBpPXRbbl07QShpKSYmKEEoaS50YWcpPyhhKGkpLGsoaSkpOm8oaS5lbG0pKX19ZnVuY3Rpb24gYShlLHQpe2lmKEEodCl8fEEoZS5kYXRhKSl7dmFyIG4scj15LnJlbW92ZS5sZW5ndGgrMTtmb3IoQSh0KT90Lmxpc3RlbmVycys9cjp0PWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbigpezA9PS0tbi5saXN0ZW5lcnMmJm8oZSl9cmV0dXJuIG4ubGlzdGVuZXJzPXQsbn0oZS5lbG0sciksQShuPWUuY29tcG9uZW50SW5zdGFuY2UpJiZBKG49bi5fdm5vZGUpJiZBKG4uZGF0YSkmJmEobix0KSxuPTA7bjx5LnJlbW92ZS5sZW5ndGg7KytuKXkucmVtb3ZlW25dKGUsdCk7QShuPWUuZGF0YS5ob29rKSYmQShuPW4ucmVtb3ZlKT9uKGUsdCk6dCgpfWVsc2UgbyhlLmVsbSl9ZnVuY3Rpb24geChlLHQsbixyKXtmb3IodmFyIGk9bjtpPHI7aSsrKXt2YXIgbz10W2ldO2lmKEEobykmJnJyKGUsbykpcmV0dXJuIGl9fWZ1bmN0aW9uIEMoZSx0LG4scixpLG8pe2lmKGUhPT10KXtBKHQuZWxtKSYmQShyKSYmKHQ9cltpXT1wZSh0KSk7dmFyIGE9dC5lbG09ZS5lbG07aWYoSShlLmlzQXN5bmNQbGFjZWhvbGRlcikpQSh0LmFzeW5jRmFjdG9yeS5yZXNvbHZlZCk/TyhlLmVsbSx0LG4pOnQuaXNBc3luY1BsYWNlaG9sZGVyPSEwO2Vsc2UgaWYoSSh0LmlzU3RhdGljKSYmSShlLmlzU3RhdGljKSYmdC5rZXk9PT1lLmtleSYmKEkodC5pc0Nsb25lZCl8fEkodC5pc09uY2UpKSl0LmNvbXBvbmVudEluc3RhbmNlPWUuY29tcG9uZW50SW5zdGFuY2U7ZWxzZXt2YXIgcyxjPXQuZGF0YTtBKGMpJiZBKHM9Yy5ob29rKSYmQShzPXMucHJlcGF0Y2gpJiZzKGUsdCk7dmFyIHU9ZS5jaGlsZHJlbixsPXQuY2hpbGRyZW47aWYoQShjKSYmdyh0KSl7Zm9yKHM9MDtzPHkudXBkYXRlLmxlbmd0aDsrK3MpeS51cGRhdGVbc10oZSx0KTtBKHM9Yy5ob29rKSYmQShzPXMudXBkYXRlKSYmcyhlLHQpfUUodC50ZXh0KT9BKHUpJiZBKGwpP3UhPT1sJiZmdW5jdGlvbihlLHQsbixyLGkpe2Zvcih2YXIgbyxhLHMsYz0wLHU9MCxsPXQubGVuZ3RoLTEsZD10WzBdLGY9dFtsXSxwPW4ubGVuZ3RoLTEsaD1uWzBdLHY9bltwXSxnPSFpO2M8PWwmJnU8PXA7KUUoZCk/ZD10WysrY106RShmKT9mPXRbLS1sXTpycihkLGgpPyhDKGQsaCxyLG4sdSksZD10WysrY10saD1uWysrdV0pOnJyKGYsdik/KEMoZix2LHIsbixwKSxmPXRbLS1sXSx2PW5bLS1wXSk6cnIoZCx2KT8oQyhkLHYscixuLHApLGcmJl8uaW5zZXJ0QmVmb3JlKGUsZC5lbG0sXy5uZXh0U2libGluZyhmLmVsbSkpLGQ9dFsrK2NdLHY9blstLXBdKToocnIoZixoKT8oQyhmLGgscixuLHUpLGcmJl8uaW5zZXJ0QmVmb3JlKGUsZi5lbG0sZC5lbG0pLGY9dFstLWxdKTooRShvKSYmKG89aXIodCxjLGwpKSxFKGE9QShoLmtleSk/b1toLmtleV06eChoLHQsYyxsKSk/YihoLHIsZSxkLmVsbSwhMSxuLHUpOnJyKHM9dFthXSxoKT8oQyhzLGgscixuLHUpLHRbYV09dm9pZCAwLGcmJl8uaW5zZXJ0QmVmb3JlKGUscy5lbG0sZC5lbG0pKTpiKGgscixlLGQuZWxtLCExLG4sdSkpLGg9blsrK3VdKTtsPGM/bShlLEUobltwKzFdKT9udWxsOm5bcCsxXS5lbG0sbix1LHAscik6cDx1JiZTKDAsdCxjLGwpfShhLHUsbCxuLG8pOkEobCk/KEEoZS50ZXh0KSYmXy5zZXRUZXh0Q29udGVudChhLCIiKSxtKGEsbnVsbCxsLDAsbC5sZW5ndGgtMSxuKSk6QSh1KT9TKDAsdSwwLHUubGVuZ3RoLTEpOkEoZS50ZXh0KSYmXy5zZXRUZXh0Q29udGVudChhLCIiKTplLnRleHQhPT10LnRleHQmJl8uc2V0VGV4dENvbnRlbnQoYSx0LnRleHQpLEEoYykmJkEocz1jLmhvb2spJiZBKHM9cy5wb3N0cGF0Y2gpJiZzKGUsdCl9fX1mdW5jdGlvbiBUKGUsdCxuKXtpZihJKG4pJiZBKGUucGFyZW50KSllLnBhcmVudC5kYXRhLnBlbmRpbmdJbnNlcnQ9dDtlbHNlIGZvcih2YXIgcj0wO3I8dC5sZW5ndGg7KytyKXRbcl0uZGF0YS5ob29rLmluc2VydCh0W3JdKX12YXIgZz1zKCJhdHRycyxjbGFzcyxzdGF0aWNDbGFzcyxzdGF0aWNTdHlsZSxrZXkiKTtmdW5jdGlvbiBPKGUsdCxuLHIpe3ZhciBpLG89dC50YWcsYT10LmRhdGEscz10LmNoaWxkcmVuO2lmKHI9cnx8YSYmYS5wcmUsdC5lbG09ZSxJKHQuaXNDb21tZW50KSYmQSh0LmFzeW5jRmFjdG9yeSkpcmV0dXJuIHQuaXNBc3luY1BsYWNlaG9sZGVyPSEwO2lmKEEoYSkmJihBKGk9YS5ob29rKSYmQShpPWkuaW5pdCkmJmkodCwhMCksQShpPXQuY29tcG9uZW50SW5zdGFuY2UpKSlyZXR1cm4gcCh0LG4pLCEwO2lmKEEobykpe2lmKEEocykpaWYoZS5oYXNDaGlsZE5vZGVzKCkpaWYoQShpPWEpJiZBKGk9aS5kb21Qcm9wcykmJkEoaT1pLmlubmVySFRNTCkpe2lmKGkhPT1lLmlubmVySFRNTClyZXR1cm4hMX1lbHNle2Zvcih2YXIgYz0hMCx1PWUuZmlyc3RDaGlsZCxsPTA7bDxzLmxlbmd0aDtsKyspe2lmKCF1fHwhTyh1LHNbbF0sbixyKSl7Yz0hMTticmVha311PXUubmV4dFNpYmxpbmd9aWYoIWN8fHUpcmV0dXJuITF9ZWxzZSBoKHQscyxuKTtpZihBKGEpKXt2YXIgZD0hMTtmb3IodmFyIGYgaW4gYSlpZighZyhmKSl7ZD0hMCx2KHQsbik7YnJlYWt9IWQmJmEuY2xhc3MmJkhlKGEuY2xhc3MpfX1lbHNlIGUuZGF0YSE9PXQudGV4dCYmKGUuZGF0YT10LnRleHQpO3JldHVybiEwfXJldHVybiBmdW5jdGlvbihlLHQsbixyLGksbyl7aWYoIUUodCkpe3ZhciBhLHM9ITEsYz1bXTtpZihFKGUpKXM9ITAsYih0LGMsaSxvKTtlbHNle3ZhciB1PUEoZS5ub2RlVHlwZSk7aWYoIXUmJnJyKGUsdCkpQyhlLHQsYyxudWxsLG51bGwscik7ZWxzZXtpZih1KXtpZigxPT09ZS5ub2RlVHlwZSYmZS5oYXNBdHRyaWJ1dGUoTSkmJihlLnJlbW92ZUF0dHJpYnV0ZShNKSxuPSEwKSxJKG4pJiZPKGUsdCxjKSlyZXR1cm4gVCh0LGMsITApLGU7YT1lLGU9bmV3IHVlKF8udGFnTmFtZShhKS50b0xvd2VyQ2FzZSgpLHt9LFtdLHZvaWQgMCxhKX12YXIgbD1lLmVsbSxkPV8ucGFyZW50Tm9kZShsKTtpZihiKHQsYyxsLl9sZWF2ZUNiP251bGw6ZCxfLm5leHRTaWJsaW5nKGwpKSxBKHQucGFyZW50KSlmb3IodmFyIGY9dC5wYXJlbnQscD13KHQpO2Y7KXtmb3IodmFyIGg9MDtoPHkuZGVzdHJveS5sZW5ndGg7KytoKXkuZGVzdHJveVtoXShmKTtpZihmLmVsbT10LmVsbSxwKXtmb3IodmFyIHY9MDt2PHkuY3JlYXRlLmxlbmd0aDsrK3YpeS5jcmVhdGVbdl0odHIsZik7dmFyIGc9Zi5kYXRhLmhvb2suaW5zZXJ0O2lmKGcubWVyZ2VkKWZvcih2YXIgbT0xO208Zy5mbnMubGVuZ3RoO20rKylnLmZuc1ttXSgpfWVsc2UgUW4oZik7Zj1mLnBhcmVudH1BKGQpP1MoMCxbZV0sMCwwKTpBKGUudGFnKSYmayhlKX19cmV0dXJuIFQodCxjLHMpLHQuZWxtfUEoZSkmJmsoZSl9fSh7bm9kZU9wczpLbixtb2R1bGVzOlttcixJcixqcixCcix7Y3JlYXRlOkZyLGFjdGl2YXRlOkZyLHJlbW92ZTpmdW5jdGlvbihuLGUpe3ZhciByPW4uZWxtO3IuX2VudGVyQ2ImJihyLl9lbnRlckNiLmNhbmNlbGxlZD0hMCxyLl9lbnRlckNiKCkpO3ZhciB0PURyKG4uZGF0YS50cmFuc2l0aW9uKTtpZighdClyZXR1cm4gZSgpO2lmKHIuX2xlYXZlQ2IpcmV0dXJuO3ZhciBpPXQubGVhdmVDbGFzcyxvPXQubGVhdmVUb0NsYXNzLGE9dC5sZWF2ZUFjdGl2ZUNsYXNzLHM9dC5iZWZvcmVMZWF2ZSxjPXQubGVhdmUsdT10LmFmdGVyTGVhdmUsbD10LmxlYXZlQ2FuY2VsbGVkLGQ9dC5kZWxheUxlYXZlLGY9YyYmMTwoYy5fbGVuZ3RofHxjLmxlbmd0aCkscD1uLmNvbnRleHQuJG9wdGlvbnMuc3R5bGV8fHt9LGg9cFtpXSx2PXBbb118fHBbYV0sZz1wWyJAVFJBTlNJVElPTiJdJiZwWyJAVFJBTlNJVElPTiJdW2FdfHx7fSxtPXIuX2xlYXZlQ2I9RChmdW5jdGlvbigpe3IucGFyZW50Tm9kZSYmci5wYXJlbnROb2RlLl9wZW5kaW5nJiYoci5wYXJlbnROb2RlLl9wZW5kaW5nW24ua2V5XT1udWxsKSxtLmNhbmNlbGxlZD9sJiZsKHIpOihlKCksdSYmdShyKSksci5fbGVhdmVDYj1udWxsfSk7ZD9kKHkpOnkoKTtmdW5jdGlvbiB5KCl7dmFyIGU9bi5jb250ZXh0LiRyZXF1aXJlV2VleE1vZHVsZSgiYW5pbWF0aW9uIik7ZnVuY3Rpb24gdCgpe2UudHJhbnNpdGlvbihyLnJlZix7c3R5bGVzOnYsZHVyYXRpb246Zy5kdXJhdGlvbnx8MCxkZWxheTpnLmRlbGF5fHwwLHRpbWluZ0Z1bmN0aW9uOmcudGltaW5nRnVuY3Rpb258fCJsaW5lYXIifSxmP0I6bSl9bS5jYW5jZWxsZWR8fChuLmRhdGEuc2hvd3x8KChyLnBhcmVudE5vZGUuX3BlbmRpbmd8fChyLnBhcmVudE5vZGUuX3BlbmRpbmc9e30pKVtuLmtleV09bikscyYmcyhyKSxoP2UudHJhbnNpdGlvbihyLnJlZix7c3R5bGVzOmh9LHQpOnQoKSxjJiZjKHIsbSksdnx8Znx8bSgpKX19fV0uY29uY2F0KGxyKSxMT05HX0xJU1RfVEhSRVNIT0xEOjEwfSksVXI9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmUpO2Z1bmN0aW9uIFZyKGUscil7dmFyIGk9ZS4kZWw7cmV0dXJuIGkmJiJmdW5jdGlvbiI9PXR5cGVvZiBpW3JdP2Z1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cyx0PVtdLG49YXJndW1lbnRzLmxlbmd0aDtuLS07KXRbbl09ZVtuXTtyZXR1cm4gaVtyXS5hcHBseShpLHQpfTooaWUoIkNhbid0IGZpbmQgY29tcG9uZW50IG1ldGhvZCBcIiIrcisnIiBvbiAnK2kudHlwZSksQil9ZnVuY3Rpb24gcXIoZSxuKXtBcnJheS5pc0FycmF5KG4pJiYoIWZ1bmN0aW9uKGYsbil7Zm9yKHZhciBlPWZ1bmN0aW9uKGUsdCl7dmFyIGQ9VXJbZV07RihuLGQsZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLHQ9W10sbj1hcmd1bWVudHMubGVuZ3RoO24tLTspdFtuXT1lW25dO3ZhciByPXRoaXMubGVuZ3RoLGk9dmVbZF07ImZ1bmN0aW9uIj09dHlwZW9mIGkmJmkuYXBwbHkodGhpcyx0KTt2YXIgbz1WcihmLCJyZW1vdmVEYXRhIiksYT1WcihmLCJpbnNlcnRSYW5nZSIpLHM9VnIoZiwic2V0TGlzdERhdGEiKTtzd2l0Y2goZCl7Y2FzZSJwdXNoIjphKHIsdCk7YnJlYWs7Y2FzZSJwb3AiOm8oci0xLDEpO2JyZWFrO2Nhc2Uic2hpZnQiOm8oMCwxKTticmVhaztjYXNlInVuc2hpZnQiOmEoMCx0KTticmVhaztjYXNlInNwbGljZSI6dmFyIGM9dFswXSx1PXRbMV0sbD10LnNsaWNlKDIpOzA8dSYmbyhjLHUpLDA8bC5sZW5ndGgmJmEoYyxsKTticmVhaztjYXNlInNvcnQiOmNhc2UicmV2ZXJzZSI6cyh0aGlzLnNsaWNlKCkpfX0pfSx0PTAscj1Vci5sZW5ndGg7dDxyO3QrKyllKHQpfShlLG4pLG4uZm9yRWFjaChmdW5jdGlvbih0KXtkKHQpJiYhZih0LCJbW1dhdGNoZWRdXSIpJiYoRih0LCJbW1dhdGNoZWRdXSIsITApLGUuJHdhdGNoKGZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHQpdFtlXX0sZnVuY3Rpb24oKXtWcihlLCJ1cGRhdGVEYXRhIikobi5pbmRleE9mKHQpLHQpfSx7ZGVlcDohMH0pKX0pKX12YXIgV3I9e25hbWU6InJlY3ljbGUtbGlzdCIsbWV0aG9kczp7Y2xvc2VzdDpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PWFyZ3VtZW50cyxuPVtdLHI9YXJndW1lbnRzLmxlbmd0aDtyLS07KW5bcl09dFtyXTtyZXR1cm4oZT10aGlzLiRlbCkuY2xvc2VzdC5hcHBseShlLG4pfSxxdWVyeUVsZW1lbnQ6ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD1hcmd1bWVudHMsbj1bXSxyPWFyZ3VtZW50cy5sZW5ndGg7ci0tOyluW3JdPXRbcl07cmV0dXJuKGU9dGhpcy4kZWwpLnF1ZXJ5RWxlbWVudC5hcHBseShlLG4pfSxxdWVyeUVsZW1lbnRBbGw6ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD1hcmd1bWVudHMsbj1bXSxyPWFyZ3VtZW50cy5sZW5ndGg7ci0tOyluW3JdPXRbcl07cmV0dXJuKGU9dGhpcy4kZWwpLnF1ZXJ5RWxlbWVudEFsbC5hcHBseShlLG4pfSxzY3JvbGxUb0VsZW1lbnQ6ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD1hcmd1bWVudHMsbj1bXSxyPWFyZ3VtZW50cy5sZW5ndGg7ci0tOyluW3JdPXRbcl07cmV0dXJuKGU9dGhpcy4kZWwpLnNjcm9sbFRvRWxlbWVudC5hcHBseShlLG4pfSxyZXNldExvYWRtb3JlOmZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9YXJndW1lbnRzLG49W10scj1hcmd1bWVudHMubGVuZ3RoO3ItLTspbltyXT10W3JdO3JldHVybihlPXRoaXMuJGVsKS5yZXNldExvYWRtb3JlLmFwcGx5KGUsbil9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZih0aGlzLl92bm9kZSYmdGhpcy4kb3B0aW9uc1siW1tVc2VDYWNoZV1dIl0pcmV0dXJuIEYodGhpcy4kb3B0aW9ucywiW1tVc2VDYWNoZV1dIiwhMSksdGhpcy5fdm5vZGU7dmFyIG49dGhpcy4kb3B0aW9ucy5wYXJlbnQscj10aGlzLiRhdHRycy5iaW5kaW5nRXhwcmVzc2lvbjtyZXR1cm4gbiYmciYmKG4uJHdhdGNoKHIsZnVuY3Rpb24oKXtyZXR1cm4gRih0LiRvcHRpb25zLCJbW1VzZUNhY2hlXV0iLCEwKX0se2RlZXA6ITAsaW1tZWRpYXRlOiEwfSkscXIodGhpcyx0aGlzLiRhdHRycy5saXN0RGF0YSksbi4kd2F0Y2gocixmdW5jdGlvbihlKXtxcih0LGUpfSkpLHRoaXMuX2V2ZW50cy5fYXR0YWNoX3Nsb3Q9ZnVuY3Rpb24oZSl7QXQodC4kcGFyZW50fHx0LGUucG9zaXRpb24sZS5yZWZzKX0sdGhpcy5fZXZlbnRzLl9kZXRhY2hfc2xvdD1mdW5jdGlvbihlKXtBdCh0LiRwYXJlbnR8fHQsZS5wb3NpdGlvbixlLnJlZnMsITApfSxlKCJ3ZWV4OnJlY3ljbGUtbGlzdCIse29uOnRoaXMuX2V2ZW50c30sdGhpcy4kc2xvdHMuZGVmYXVsdCl9LHJlbmRlckVycm9yOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUoInRleHQiLHtzdHlsZTp7Zm9udFNpemU6IjM2cHgiLGNvbG9yOiIjRkYwMDAwIn0sdmFsdWU6dC50b1N0cmluZygpfSl9fSxIcj17bmFtZTpTdHJpbmcsYXBwZWFyOkJvb2xlYW4sY3NzOkJvb2xlYW4sbW9kZTpTdHJpbmcsdHlwZTpTdHJpbmcsZW50ZXJDbGFzczpTdHJpbmcsbGVhdmVDbGFzczpTdHJpbmcsZW50ZXJUb0NsYXNzOlN0cmluZyxsZWF2ZVRvQ2xhc3M6U3RyaW5nLGVudGVyQWN0aXZlQ2xhc3M6U3RyaW5nLGxlYXZlQWN0aXZlQ2xhc3M6U3RyaW5nLGFwcGVhckNsYXNzOlN0cmluZyxhcHBlYXJBY3RpdmVDbGFzczpTdHJpbmcsYXBwZWFyVG9DbGFzczpTdHJpbmcsZHVyYXRpb246W051bWJlcixTdHJpbmcsT2JqZWN0XX07ZnVuY3Rpb24gR3IoZSl7dmFyIHQ9ZSYmZS5jb21wb25lbnRPcHRpb25zO3JldHVybiB0JiZ0LkN0b3Iub3B0aW9ucy5hYnN0cmFjdD9HcihZdCh0LmNoaWxkcmVuKSk6ZX1mdW5jdGlvbiBYcihlKXt2YXIgdD17fSxuPWUuJG9wdGlvbnM7Zm9yKHZhciByIGluIG4ucHJvcHNEYXRhKXRbcl09ZVtyXTt2YXIgaT1uLl9wYXJlbnRMaXN0ZW5lcnM7Zm9yKHZhciBvIGluIGkpdFtoKG8pXT1pW29dO3JldHVybiB0fWZ1bmN0aW9uIFlyKGUsdCl7aWYoL1xkLWtlZXAtYWxpdmUkLy50ZXN0KHQudGFnKSlyZXR1cm4gZSgia2VlcC1hbGl2ZSIse3Byb3BzOnQuY29tcG9uZW50T3B0aW9ucy5wcm9wc0RhdGF9KX12YXIgSnI9ZnVuY3Rpb24oZSl7cmV0dXJuIGUudGFnfHxYdChlKX0sS3I9ZnVuY3Rpb24oZSl7cmV0dXJuInNob3ciPT09ZS5uYW1lfSxacj17bmFtZToidHJhbnNpdGlvbiIscHJvcHM6SHIsYWJzdHJhY3Q6ITAscmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj10aGlzLiRzbG90cy5kZWZhdWx0O2lmKG4mJihuPW4uZmlsdGVyKEpyKSkubGVuZ3RoKXt2YXIgcj10aGlzLm1vZGUsaT1uWzBdO2lmKGZ1bmN0aW9uKGUpe2Zvcig7ZT1lLnBhcmVudDspaWYoZS5kYXRhLnRyYW5zaXRpb24pcmV0dXJuITB9KHRoaXMuJHZub2RlKSlyZXR1cm4gaTt2YXIgbz1HcihpKTtpZighbylyZXR1cm4gaTtpZih0aGlzLl9sZWF2aW5nKXJldHVybiBZcihlLGkpO3ZhciBhPSJfX3RyYW5zaXRpb24tIit0aGlzLl91aWQrIi0iO28ua2V5PW51bGw9PW8ua2V5P28uaXNDb21tZW50P2ErImNvbW1lbnQiOmErby50YWc6JChvLmtleSk/MD09PVN0cmluZyhvLmtleSkuaW5kZXhPZihhKT9vLmtleTphK28ua2V5Om8ua2V5O3ZhciBzLGMsdT0oby5kYXRhfHwoby5kYXRhPXt9KSkudHJhbnNpdGlvbj1Ycih0aGlzKSxsPXRoaXMuX3Zub2RlLGQ9R3IobCk7aWYoby5kYXRhLmRpcmVjdGl2ZXMmJm8uZGF0YS5kaXJlY3RpdmVzLnNvbWUoS3IpJiYoby5kYXRhLnNob3c9ITApLGQmJmQuZGF0YSYmKHM9bywoYz1kKS5rZXkhPT1zLmtleXx8Yy50YWchPT1zLnRhZykmJiFYdChkKSYmKCFkLmNvbXBvbmVudEluc3RhbmNlfHwhZC5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUuaXNDb21tZW50KSl7dmFyIGY9ZC5kYXRhLnRyYW5zaXRpb249Tih7fSx1KTtpZigib3V0LWluIj09PXIpcmV0dXJuIHRoaXMuX2xlYXZpbmc9ITAsSmUoZiwiYWZ0ZXJMZWF2ZSIsZnVuY3Rpb24oKXt0Ll9sZWF2aW5nPSExLHQuJGZvcmNlVXBkYXRlKCl9KSxZcihlLGkpO2lmKCJpbi1vdXQiPT09cil7aWYoWHQobykpcmV0dXJuIGw7dmFyIHAsaD1mdW5jdGlvbigpe3AoKX07SmUodSwiYWZ0ZXJFbnRlciIsaCksSmUodSwiZW50ZXJDYW5jZWxsZWQiLGgpLEplKGYsImRlbGF5TGVhdmUiLGZ1bmN0aW9uKGUpe3A9ZX0pfX1yZXR1cm4gaX19fSxRcj1OKHt0YWc6U3RyaW5nLG1vdmVDbGFzczpTdHJpbmd9LEhyKTtkZWxldGUgUXIubW9kZTt2YXIgZWk9e1JlY3ljbGVMaXN0OldyLFRyYW5zaXRpb246WnIsVHJhbnNpdGlvbkdyb3VwOntwcm9wczpRcixjcmVhdGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kcmVxdWlyZVdlZXhNb2R1bGUoImRvbSIpO3RoaXMuZ2V0UG9zaXRpb249ZnVuY3Rpb24ocil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQsbil7ZS5nZXRDb21wb25lbnRSZWN0KHIucmVmLGZ1bmN0aW9uKGUpe2UucmVzdWx0P3QoZS5zaXplKTpuKG5ldyBFcnJvcigiZmFpbGVkIHRvIGdldCByZWN0IGZvciBlbGVtZW50OiAiK3IudGFnKSl9KX0pfTt2YXIgcj10aGlzLiRyZXF1aXJlV2VleE1vZHVsZSgiYW5pbWF0aW9uIik7dGhpcy5hbmltYXRlPWZ1bmN0aW9uKHQsbil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUpe3IudHJhbnNpdGlvbih0LnJlZixuLGUpfSl9fSxyZW5kZXI6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMudGFnfHx0aGlzLiR2bm9kZS5kYXRhLnRhZ3x8InNwYW4iLG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPXRoaXMucHJldkNoaWxkcmVuPXRoaXMuY2hpbGRyZW4saT10aGlzLiRzbG90cy5kZWZhdWx0fHxbXSxvPXRoaXMuY2hpbGRyZW49W10sYT1Ycih0aGlzKSxzPTA7czxpLmxlbmd0aDtzKyspe3ZhciBjPWlbc107Yy50YWcmJm51bGwhPWMua2V5JiYwIT09U3RyaW5nKGMua2V5KS5pbmRleE9mKCJfX3ZsaXN0IikmJihvLnB1c2goYyksKChuW2Mua2V5XT1jKS5kYXRhfHwoYy5kYXRhPXt9KSkudHJhbnNpdGlvbj1hKX1pZihyKXt2YXIgdT1bXSxsPVtdO3IuZm9yRWFjaChmdW5jdGlvbihlKXtlLmRhdGEudHJhbnNpdGlvbj1hLG5bZS5rZXldP3UucHVzaChlKTpsLnB1c2goZSl9KSx0aGlzLmtlcHQ9ZSh0LG51bGwsdSksdGhpcy5yZW1vdmVkPWx9cmV0dXJuIGUodCxudWxsLG8pfSxiZWZvcmVVcGRhdGU6ZnVuY3Rpb24oKXt0aGlzLl9fcGF0Y2hfXyh0aGlzLl92bm9kZSx0aGlzLmtlcHQsITEsITApLHRoaXMuX3Zub2RlPXRoaXMua2VwdH0sdXBkYXRlZDpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJldkNoaWxkcmVuLHQ9dGhpcy5tb3ZlQ2xhc3N8fCh0aGlzLm5hbWV8fCJ2IikrIi1tb3ZlIjtlLmxlbmd0aCYmdGhpcy5nZXRNb3ZlRGF0YShlWzBdLmNvbnRleHQsdCl9LG1ldGhvZHM6e2dldE1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS4kb3B0aW9ucy5zdHlsZXx8e307cmV0dXJuIG5bIkBUUkFOU0lUSU9OIl0mJm5bIkBUUkFOU0lUSU9OIl1bdF19fX19LHRpPXMoInRlbXBsYXRlLHNjcmlwdCxzdHlsZSxlbGVtZW50LGNvbnRlbnQsc2xvdCxsaW5rLG1ldGEsc3ZnLHZpZXcsYSxkaXYsaW1nLGltYWdlLHRleHQsdS10ZXh0LHNwYW4saW5wdXQsdGV4dGFyZWEsc3Bpbm5lcixzZWxlY3Qsc2xpZGVyLHNsaWRlci1uZWlnaGJvcixpbmRpY2F0b3IsY2FudmFzLGxpc3QsY2VsbCxoZWFkZXIsbG9hZGluZyxsb2FkaW5nLWluZGljYXRvcixyZWZyZXNoLHNjcm9sbGFibGUsc2Nyb2xsZXIsdmlkZW8sd2ViLGVtYmVkLHRhYmJhcix0YWJoZWFkZXIsZGF0ZXBpY2tlcix0aW1lcGlja2VyLG1hcnF1ZWUsY291bnRkb3duIiwhMCksbmk9KHMoIndlYixzcGlubmVyLHN3aXRjaCx2aWRlbyx0ZXh0YXJlYSxjYW52YXMsaW5kaWNhdG9yLG1hcnF1ZWUsY291bnRkb3duIiwhMCkscygicmljaHRleHQsdHJhbnNpdGlvbix0cmFuc2l0aW9uLWdyb3VwLHJlY3ljbGUtbGlzdCIsITApKTtzKCJlbWJlZCxpbWcsaW1hZ2UsaW5wdXQsbGluayxtZXRhIiwhMCk7Qm4uY29uZmlnLm11c3RVc2VQcm9wPWZ1bmN0aW9uKCl7cmV0dXJuITF9LEJuLmNvbmZpZy5pc1Jlc2VydmVkVGFnPXRpLEJuLmNvbmZpZy5pc1J1bnRpbWVDb21wb25lbnQ9bmksQm4uY29uZmlnLmlzVW5rbm93bkVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sQm4ub3B0aW9ucy5kaXJlY3RpdmVzPXt9LEJuLm9wdGlvbnMuY29tcG9uZW50cz1laSxCbi5wcm90b3R5cGUuX19wYXRjaF9fPXpyLEJuLnByb3RvdHlwZS4kbW91bnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbj10aGlzLHI9ZSYmKG89dGhpcy4kZG9jdW1lbnQsKGE9by5jcmVhdGVDb21tZW50KCJyb290IikpLmhhc0F0dHJpYnV0ZT1hLnJlbW92ZUF0dHJpYnV0ZT1CLG8uZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKGEpLGEpLGk9dCxuLiRlbD1yLG4uJG9wdGlvbnMucmVuZGVyfHwobi4kb3B0aW9ucy5yZW5kZXI9ZGUpLGFuKG4sImJlZm9yZU1vdW50IiksbmV3IG1uKG4sZnVuY3Rpb24oKXtuLl91cGRhdGUobi5fcmVuZGVyKCksaSl9LEIse2JlZm9yZTpmdW5jdGlvbigpe24uX2lzTW91bnRlZCYmIW4uX2lzRGVzdHJveWVkJiZhbihuLCJiZWZvcmVVcGRhdGUiKX19LCEwKSxpPSExLG51bGw9PW4uJHZub2RlJiYobi5faXNNb3VudGVkPSEwLGFuKG4sIm1vdW50ZWQiKSksbjt2YXIgbixyLGksbyxhfSxCbi5wcm90b3R5cGUuX19jYWxsX2hvb2s9ZnVuY3Rpb24oZSx0KXtzZSgpO3ZhciBuLHI9dGhpcy4kb3B0aW9uc1tlXSxpPWUrIiBob29rIjtpZihyKWZvcih2YXIgbz0wLGE9ci5sZW5ndGg7bzxhO28rKyluPUJlKHJbb10sdGhpcyx0P1t0XTpudWxsLHRoaXMsaSk7cmV0dXJuIHRoaXMuX2hhc0hvb2tFdmVudCYmdGhpcy4kZW1pdCgiaG9vazoiK2UsdCksY2UoKSxufSxlLlZ1ZT1Cbn19KTt1bndyYXBFeHBvcnRzKGZhY3RvcnkpO3ZhciB3ZWV4VnVlRnJhbWV3b3JrPWNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uKGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBkPXt9O3QuY3JlYXRlSW5zdGFuY2VDb250ZXh0PWZ1bmN0aW9uKGUsdCxuKXt2b2lkIDA9PT1uJiYobj17fSk7dmFyIHIsaSxvLGEscz10LndlZXgsYz0oZFtlXT17aW5zdGFuY2VJZDplLGNvbmZpZzpzLmNvbmZpZyxkb2N1bWVudDpzLmRvY3VtZW50LGRhdGE6bn0pLlZ1ZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9e307ZmFjdG9yeShyLHQuZG9jdW1lbnQsbik7dmFyIGk9ci5WdWUsbz1kW2VdLGE9L153ZWV4Oi9pLHM9aS5jb25maWcuaXNSZXNlcnZlZFRhZ3x8ZnVuY3Rpb24oKXtyZXR1cm4hMX0sYz1pLmNvbmZpZy5pc1J1bnRpbWVDb21wb25lbnR8fGZ1bmN0aW9uKCl7cmV0dXJuITF9O3JldHVybiBpLmNvbmZpZy5pc1Jlc2VydmVkVGFnPWZ1bmN0aW9uKGUpe3JldHVybiFjKGUpJiZ0LnN1cHBvcnRzKCJAY29tcG9uZW50LyIrZSl8fHMoZSl8fGEudGVzdChlKX0saS5jb25maWcucGFyc2VQbGF0Zm9ybVRhZ05hbWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShhLCIiKX0saS5wcm90b3R5cGUuJGluc3RhbmNlSWQ9ZSxpLnByb3RvdHlwZS4kZG9jdW1lbnQ9by5kb2N1bWVudCxpLnByb3RvdHlwZS4kcmVxdWlyZVdlZXhNb2R1bGU9dC5yZXF1aXJlTW9kdWxlLGkubWl4aW4oe2JlZm9yZUNyZWF0ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuJG9wdGlvbnM7aWYoZS5lbCl7dmFyIHQ9ZS5kYXRhLG49KCJmdW5jdGlvbiI9PXR5cGVvZiB0P3QoKTp0KXx8e307ZS5kYXRhPU9iamVjdC5hc3NpZ24obixvLmRhdGEpLG8uYXBwPXRoaXN9fSxtb3VudGVkOmZ1bmN0aW9uKCl7aWYodGhpcy4kb3B0aW9ucy5lbCYmdC5kb2N1bWVudCYmby5hcHA9PT10aGlzKXRyeXt0LmRvY3VtZW50LnRhc2tDZW50ZXIuc2VuZCgiZG9tIix7YWN0aW9uOiJjcmVhdGVGaW5pc2gifSxbXSl9Y2F0Y2goZSl7fX19KSxpLnByb3RvdHlwZS4kZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7aWYoby5hcHAgaW5zdGFuY2VvZiBpKXJldHVybiBvLmNvbmZpZ30saX0oZSxzLHQuU2hhcmVkT2JqZWN0KSx1PShyPWUsaT1zLnJlcXVpcmVNb2R1bGUsbz1kW3JdLGE9aSgidGltZXIiKSx7c2V0VGltZW91dDpmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMsdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGg7bi0tOyl0W25dPWVbbl07aWYoYS5zZXRUaW1lb3V0KXt2YXIgcj1vLmRvY3VtZW50LnRhc2tDZW50ZXIuY2FsbGJhY2tNYW5hZ2VyLmxhc3RDYWxsYmFja0lkO3JldHVybiBhLnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0WzBdLmFwcGx5KHQsdC5zbGljZSgyKSl9LHRbMV0pLChyKzEpLnRvU3RyaW5nKCl9fSxzZXRJbnRlcnZhbDpmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMsdD1bXSxuPWFyZ3VtZW50cy5sZW5ndGg7bi0tOyl0W25dPWVbbl07aWYoYS5zZXRJbnRlcnZhbCl7dmFyIHI9by5kb2N1bWVudC50YXNrQ2VudGVyLmNhbGxiYWNrTWFuYWdlci5sYXN0Q2FsbGJhY2tJZDtyZXR1cm4gYS5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RbMF0uYXBwbHkodCx0LnNsaWNlKDIpKX0sdFsxXSksKHIrMSkudG9TdHJpbmcoKX19LGNsZWFyVGltZW91dDpmdW5jdGlvbihlKXthLmNsZWFyVGltZW91dCYmYS5jbGVhclRpbWVvdXQoZSl9LGNsZWFySW50ZXJ2YWw6ZnVuY3Rpb24oZSl7YS5jbGVhckludGVydmFsJiZhLmNsZWFySW50ZXJ2YWwoZSl9fSksbD1PYmplY3QuYXNzaWduKHtWdWU6Y30sdSk7cmV0dXJuIE9iamVjdC5mcmVlemUobCksbH0sdC5kZXN0cm95SW5zdGFuY2U9ZnVuY3Rpb24oZSl7dmFyIHQ9ZFtlXTtpZih0JiZ0LmFwcCBpbnN0YW5jZW9mIHQuVnVlKXt0cnl7dC5hcHAuJGRlc3Ryb3koKSx0LmRvY3VtZW50LmRlc3Ryb3koKX1jYXRjaChlKXt9ZGVsZXRlIHQuZG9jdW1lbnQsZGVsZXRlIHQuYXBwfWRlbGV0ZSBkW2VdfSx0LnJlZnJlc2hJbnN0YW5jZT1mdW5jdGlvbihlLHQpe3ZhciBuPWRbZV07aWYoIShuJiZuLmFwcCBpbnN0YW5jZW9mIG4uVnVlKSlyZXR1cm4gbmV3IEVycm9yKCJyZWZyZXNoSW5zdGFuY2U6IGluc3RhbmNlICIrZSsiIG5vdCBmb3VuZCEiKTtpZihuLlZ1ZSYmbi5WdWUuc2V0KWZvcih2YXIgciBpbiB0KW4uVnVlLnNldChuLmFwcCxyLHRbcl0pO24uZG9jdW1lbnQudGFza0NlbnRlci5zZW5kKCJkb20iLHthY3Rpb246InJlZnJlc2hGaW5pc2gifSxbXSl9fSksaW5kZXg9dW53cmFwRXhwb3J0cyh3ZWV4VnVlRnJhbWV3b3JrKSx3ZWV4VnVlRnJhbWV3b3JrXzE9d2VleFZ1ZUZyYW1ld29yay5jcmVhdGVJbnN0YW5jZUNvbnRleHQsd2VleFZ1ZUZyYW1ld29ya18yPXdlZXhWdWVGcmFtZXdvcmsuZGVzdHJveUluc3RhbmNlLHdlZXhWdWVGcmFtZXdvcmtfMz13ZWV4VnVlRnJhbWV3b3JrLnJlZnJlc2hJbnN0YW5jZSxWdWU9T2JqZWN0LmZyZWV6ZSh7ZGVmYXVsdDppbmRleCxfX21vZHVsZUV4cG9ydHM6d2VleFZ1ZUZyYW1ld29yayxjcmVhdGVJbnN0YW5jZUNvbnRleHQ6d2VleFZ1ZUZyYW1ld29ya18xLGRlc3Ryb3lJbnN0YW5jZTp3ZWV4VnVlRnJhbWV3b3JrXzIscmVmcmVzaEluc3RhbmNlOndlZXhWdWVGcmFtZXdvcmtfM30pO3NldE5hdGl2ZUNvbnNvbGUoKSxzZXR1cCh7VnVlOlZ1ZX0pfSk7Cg==