Skip to content

Instantly share code, notes, and snippets.

@Jverma
Created July 19, 2015 16:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Jverma/cfd0f79d733f866f6584 to your computer and use it in GitHub Desktop.
Save Jverma/cfd0f79d733f866f6584 to your computer and use it in GitHub Desktop.
HighChart - line chart of the tweet sentiment score time series

Interactive line chart showing the time series of the total sentiment scores of the tweets realted to a topic extracted using search API. Sentiment on a day is the average of the sentiment scores of all the tweets realted to the given topic extracted that day.

<!doctype HTML>
<meta charset = 'utf-8'>
<html>
<head>
<script src='data:application/javascript;base64,LyohIGpRdWVyeSB2MS45LjEgfCAoYykgMjAwNSwgMjAxMiBqUXVlcnkgRm91bmRhdGlvbiwgSW5jLiB8IGpxdWVyeS5vcmcvbGljZW5zZQovL0Agc291cmNlTWFwcGluZ1VSTD1qcXVlcnkubWluLm1hcAoqLyhmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT10eXBlb2YgdCxvPWUuZG9jdW1lbnQsYT1lLmxvY2F0aW9uLHM9ZS5qUXVlcnksdT1lLiQsbD17fSxjPVtdLHA9IjEuOS4xIixmPWMuY29uY2F0LGQ9Yy5wdXNoLGg9Yy5zbGljZSxnPWMuaW5kZXhPZixtPWwudG9TdHJpbmcseT1sLmhhc093blByb3BlcnR5LHY9cC50cmltLGI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IGIuZm4uaW5pdChlLHQscil9LHg9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2Usdz0vXFMrL2csVD0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2csTj0vXig/Oig8W1x3XFddKz4pW14+XSp8IyhbXHctXSopKSQvLEM9L148KFx3KylccypcLz8+KD86PFwvXDE+fCkkLyxrPS9eW1xdLDp7fVxzXSokLyxFPS8oPzpefDp8LCkoPzpccypcWykrL2csUz0vXFwoPzpbIlxcXC9iZm5ydF18dVtcZGEtZkEtRl17NH0pL2csQT0vIlteIlxcXHJcbl0qInx0cnVlfGZhbHNlfG51bGx8LT8oPzpcZCtcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvZyxqPS9eLW1zLS8sRD0vLShbXGRhLXpdKS9naSxMPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQudG9VcHBlckNhc2UoKX0sSD1mdW5jdGlvbihlKXsoby5hZGRFdmVudExpc3RlbmVyfHwibG9hZCI9PT1lLnR5cGV8fCJjb21wbGV0ZSI9PT1vLnJlYWR5U3RhdGUpJiYocSgpLGIucmVhZHkoKSl9LHE9ZnVuY3Rpb24oKXtvLmFkZEV2ZW50TGlzdGVuZXI/KG8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsSCwhMSksZS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixILCExKSk6KG8uZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsSCksZS5kZXRhY2hFdmVudCgib25sb2FkIixIKSl9O2IuZm49Yi5wcm90b3R5cGU9e2pxdWVyeTpwLGNvbnN0cnVjdG9yOmIsaW5pdDpmdW5jdGlvbihlLG4scil7dmFyIGksYTtpZighZSlyZXR1cm4gdGhpcztpZigic3RyaW5nIj09dHlwZW9mIGUpe2lmKGk9IjwiPT09ZS5jaGFyQXQoMCkmJiI+Ij09PWUuY2hhckF0KGUubGVuZ3RoLTEpJiZlLmxlbmd0aD49Mz9bbnVsbCxlLG51bGxdOk4uZXhlYyhlKSwhaXx8IWlbMV0mJm4pcmV0dXJuIW58fG4uanF1ZXJ5PyhufHxyKS5maW5kKGUpOnRoaXMuY29uc3RydWN0b3IobikuZmluZChlKTtpZihpWzFdKXtpZihuPW4gaW5zdGFuY2VvZiBiP25bMF06bixiLm1lcmdlKHRoaXMsYi5wYXJzZUhUTUwoaVsxXSxuJiZuLm5vZGVUeXBlP24ub3duZXJEb2N1bWVudHx8bjpvLCEwKSksQy50ZXN0KGlbMV0pJiZiLmlzUGxhaW5PYmplY3QobikpZm9yKGkgaW4gbiliLmlzRnVuY3Rpb24odGhpc1tpXSk/dGhpc1tpXShuW2ldKTp0aGlzLmF0dHIoaSxuW2ldKTtyZXR1cm4gdGhpc31pZihhPW8uZ2V0RWxlbWVudEJ5SWQoaVsyXSksYSYmYS5wYXJlbnROb2RlKXtpZihhLmlkIT09aVsyXSlyZXR1cm4gci5maW5kKGUpO3RoaXMubGVuZ3RoPTEsdGhpc1swXT1hfXJldHVybiB0aGlzLmNvbnRleHQ9byx0aGlzLnNlbGVjdG9yPWUsdGhpc31yZXR1cm4gZS5ub2RlVHlwZT8odGhpcy5jb250ZXh0PXRoaXNbMF09ZSx0aGlzLmxlbmd0aD0xLHRoaXMpOmIuaXNGdW5jdGlvbihlKT9yLnJlYWR5KGUpOihlLnNlbGVjdG9yIT09dCYmKHRoaXMuc2VsZWN0b3I9ZS5zZWxlY3Rvcix0aGlzLmNvbnRleHQ9ZS5jb250ZXh0KSxiLm1ha2VBcnJheShlLHRoaXMpKX0sc2VsZWN0b3I6IiIsbGVuZ3RoOjAsc2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aH0sdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBoLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT90aGlzLnRvQXJyYXkoKTowPmU/dGhpc1t0aGlzLmxlbmd0aCtlXTp0aGlzW2VdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9Yi5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksZSk7cmV0dXJuIHQucHJldk9iamVjdD10aGlzLHQuY29udGV4dD10aGlzLmNvbnRleHQsdH0sZWFjaDpmdW5jdGlvbihlLHQpe3JldHVybiBiLmVhY2godGhpcyxlLHQpfSxyZWFkeTpmdW5jdGlvbihlKXtyZXR1cm4gYi5yZWFkeS5wcm9taXNlKCkuZG9uZShlKSx0aGlzfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhoLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGVxOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMubGVuZ3RoLG49K2UrKDA+ZT90OjApO3JldHVybiB0aGlzLnB1c2hTdGFjayhuPj0wJiZ0Pm4/W3RoaXNbbl1dOltdKX0sbWFwOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhiLm1hcCh0aGlzLGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuY2FsbCh0LG4sdCl9KSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IobnVsbCl9LHB1c2g6ZCxzb3J0OltdLnNvcnQsc3BsaWNlOltdLnNwbGljZX0sYi5mbi5pbml0LnByb3RvdHlwZT1iLmZuLGIuZXh0ZW5kPWIuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGUsbixyLGksbyxhLHM9YXJndW1lbnRzWzBdfHx7fSx1PTEsbD1hcmd1bWVudHMubGVuZ3RoLGM9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIHMmJihjPXMscz1hcmd1bWVudHNbMV18fHt9LHU9MiksIm9iamVjdCI9PXR5cGVvZiBzfHxiLmlzRnVuY3Rpb24ocyl8fChzPXt9KSxsPT09dSYmKHM9dGhpcywtLXUpO2w+dTt1KyspaWYobnVsbCE9KG89YXJndW1lbnRzW3VdKSlmb3IoaSBpbiBvKWU9c1tpXSxyPW9baV0scyE9PXImJihjJiZyJiYoYi5pc1BsYWluT2JqZWN0KHIpfHwobj1iLmlzQXJyYXkocikpKT8obj8obj0hMSxhPWUmJmIuaXNBcnJheShlKT9lOltdKTphPWUmJmIuaXNQbGFpbk9iamVjdChlKT9lOnt9LHNbaV09Yi5leHRlbmQoYyxhLHIpKTpyIT09dCYmKHNbaV09cikpO3JldHVybiBzfSxiLmV4dGVuZCh7bm9Db25mbGljdDpmdW5jdGlvbih0KXtyZXR1cm4gZS4kPT09YiYmKGUuJD11KSx0JiZlLmpRdWVyeT09PWImJihlLmpRdWVyeT1zKSxifSxpc1JlYWR5OiExLHJlYWR5V2FpdDoxLGhvbGRSZWFkeTpmdW5jdGlvbihlKXtlP2IucmVhZHlXYWl0Kys6Yi5yZWFkeSghMCl9LHJlYWR5OmZ1bmN0aW9uKGUpe2lmKGU9PT0hMD8hLS1iLnJlYWR5V2FpdDohYi5pc1JlYWR5KXtpZighby5ib2R5KXJldHVybiBzZXRUaW1lb3V0KGIucmVhZHkpO2IuaXNSZWFkeT0hMCxlIT09ITAmJi0tYi5yZWFkeVdhaXQ+MHx8KG4ucmVzb2x2ZVdpdGgobyxbYl0pLGIuZm4udHJpZ2dlciYmYihvKS50cmlnZ2VyKCJyZWFkeSIpLm9mZigicmVhZHkiKSl9fSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PT1iLnR5cGUoZSl9LGlzQXJyYXk6QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oZSl7cmV0dXJuImFycmF5Ij09PWIudHlwZShlKX0saXNXaW5kb3c6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUmJmU9PWUud2luZG93fSxpc051bWVyaWM6ZnVuY3Rpb24oZSl7cmV0dXJuIWlzTmFOKHBhcnNlRmxvYXQoZSkpJiZpc0Zpbml0ZShlKX0sdHlwZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT9lKyIiOiJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGU/bFttLmNhbGwoZSldfHwib2JqZWN0Ijp0eXBlb2YgZX0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihlKXtpZighZXx8Im9iamVjdCIhPT1iLnR5cGUoZSl8fGUubm9kZVR5cGV8fGIuaXNXaW5kb3coZSkpcmV0dXJuITE7dHJ5e2lmKGUuY29uc3RydWN0b3ImJiF5LmNhbGwoZSwiY29uc3RydWN0b3IiKSYmIXkuY2FsbChlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExfWNhdGNoKG4pe3JldHVybiExfXZhciByO2ZvcihyIGluIGUpO3JldHVybiByPT09dHx8eS5jYWxsKGUscil9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQgaW4gZSlyZXR1cm4hMTtyZXR1cm4hMH0sZXJyb3I6ZnVuY3Rpb24oZSl7dGhyb3cgRXJyb3IoZSl9LHBhcnNlSFRNTDpmdW5jdGlvbihlLHQsbil7aWYoIWV8fCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gbnVsbDsiYm9vbGVhbiI9PXR5cGVvZiB0JiYobj10LHQ9ITEpLHQ9dHx8bzt2YXIgcj1DLmV4ZWMoZSksaT0hbiYmW107cmV0dXJuIHI/W3QuY3JlYXRlRWxlbWVudChyWzFdKV06KHI9Yi5idWlsZEZyYWdtZW50KFtlXSx0LGkpLGkmJmIoaSkucmVtb3ZlKCksYi5tZXJnZShbXSxyLmNoaWxkTm9kZXMpKX0scGFyc2VKU09OOmZ1bmN0aW9uKG4pe3JldHVybiBlLkpTT04mJmUuSlNPTi5wYXJzZT9lLkpTT04ucGFyc2Uobik6bnVsbD09PW4/bjoic3RyaW5nIj09dHlwZW9mIG4mJihuPWIudHJpbShuKSxuJiZrLnRlc3Qobi5yZXBsYWNlKFMsIkAiKS5yZXBsYWNlKEEsIl0iKS5yZXBsYWNlKEUsIiIpKSk/RnVuY3Rpb24oInJldHVybiAiK24pKCk6KGIuZXJyb3IoIkludmFsaWQgSlNPTjogIituKSx0KX0scGFyc2VYTUw6ZnVuY3Rpb24obil7dmFyIHIsaTtpZighbnx8InN0cmluZyIhPXR5cGVvZiBuKXJldHVybiBudWxsO3RyeXtlLkRPTVBhcnNlcj8oaT1uZXcgRE9NUGFyc2VyLHI9aS5wYXJzZUZyb21TdHJpbmcobiwidGV4dC94bWwiKSk6KHI9bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxyLmFzeW5jPSJmYWxzZSIsci5sb2FkWE1MKG4pKX1jYXRjaChvKXtyPXR9cmV0dXJuIHImJnIuZG9jdW1lbnRFbGVtZW50JiYhci5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGh8fGIuZXJyb3IoIkludmFsaWQgWE1MOiAiK24pLHJ9LG5vb3A6ZnVuY3Rpb24oKXt9LGdsb2JhbEV2YWw6ZnVuY3Rpb24odCl7dCYmYi50cmltKHQpJiYoZS5leGVjU2NyaXB0fHxmdW5jdGlvbih0KXtlLmV2YWwuY2FsbChlLHQpfSkodCl9LGNhbWVsQ2FzZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGosIm1zLSIpLnJlcGxhY2UoRCxMKX0sbm9kZU5hbWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09dC50b0xvd2VyQ2FzZSgpfSxlYWNoOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPTAsbz1lLmxlbmd0aCxhPU0oZSk7aWYobil7aWYoYSl7Zm9yKDtvPmk7aSsrKWlmKHI9dC5hcHBseShlW2ldLG4pLHI9PT0hMSlicmVha31lbHNlIGZvcihpIGluIGUpaWYocj10LmFwcGx5KGVbaV0sbikscj09PSExKWJyZWFrfWVsc2UgaWYoYSl7Zm9yKDtvPmk7aSsrKWlmKHI9dC5jYWxsKGVbaV0saSxlW2ldKSxyPT09ITEpYnJlYWt9ZWxzZSBmb3IoaSBpbiBlKWlmKHI9dC5jYWxsKGVbaV0saSxlW2ldKSxyPT09ITEpYnJlYWs7cmV0dXJuIGV9LHRyaW06diYmIXYuY2FsbCgiXHVmZWZmXHUwMGEwIik/ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6di5jYWxsKGUpfTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT8iIjooZSsiIikucmVwbGFjZShULCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGUsdCl7dmFyIG49dHx8W107cmV0dXJuIG51bGwhPWUmJihNKE9iamVjdChlKSk/Yi5tZXJnZShuLCJzdHJpbmciPT10eXBlb2YgZT9bZV06ZSk6ZC5jYWxsKG4sZSkpLG59LGluQXJyYXk6ZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKHQpe2lmKGcpcmV0dXJuIGcuY2FsbCh0LGUsbik7Zm9yKHI9dC5sZW5ndGgsbj1uPzA+bj9NYXRoLm1heCgwLHIrbik6bjowO3I+bjtuKyspaWYobiBpbiB0JiZ0W25dPT09ZSlyZXR1cm4gbn1yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oZSxuKXt2YXIgcj1uLmxlbmd0aCxpPWUubGVuZ3RoLG89MDtpZigibnVtYmVyIj09dHlwZW9mIHIpZm9yKDtyPm87bysrKWVbaSsrXT1uW29dO2Vsc2Ugd2hpbGUobltvXSE9PXQpZVtpKytdPW5bbysrXTtyZXR1cm4gZS5sZW5ndGg9aSxlfSxncmVwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPVtdLG89MCxhPWUubGVuZ3RoO2ZvcihuPSEhbjthPm87bysrKXI9ISF0KGVbb10sbyksbiE9PXImJmkucHVzaChlW29dKTtyZXR1cm4gaX0sbWFwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPTAsbz1lLmxlbmd0aCxhPU0oZSkscz1bXTtpZihhKWZvcig7bz5pO2krKylyPXQoZVtpXSxpLG4pLG51bGwhPXImJihzW3MubGVuZ3RoXT1yKTtlbHNlIGZvcihpIGluIGUpcj10KGVbaV0saSxuKSxudWxsIT1yJiYoc1tzLmxlbmd0aF09cik7cmV0dXJuIGYuYXBwbHkoW10scyl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihlLG4pe3ZhciByLGksbztyZXR1cm4ic3RyaW5nIj09dHlwZW9mIG4mJihvPWVbbl0sbj1lLGU9byksYi5pc0Z1bmN0aW9uKGUpPyhyPWguY2FsbChhcmd1bWVudHMsMiksaT1mdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KG58fHRoaXMsci5jb25jYXQoaC5jYWxsKGFyZ3VtZW50cykpKX0saS5ndWlkPWUuZ3VpZD1lLmd1aWR8fGIuZ3VpZCsrLGkpOnR9LGFjY2VzczpmdW5jdGlvbihlLG4scixpLG8sYSxzKXt2YXIgdT0wLGw9ZS5sZW5ndGgsYz1udWxsPT1yO2lmKCJvYmplY3QiPT09Yi50eXBlKHIpKXtvPSEwO2Zvcih1IGluIHIpYi5hY2Nlc3MoZSxuLHUsclt1XSwhMCxhLHMpfWVsc2UgaWYoaSE9PXQmJihvPSEwLGIuaXNGdW5jdGlvbihpKXx8KHM9ITApLGMmJihzPyhuLmNhbGwoZSxpKSxuPW51bGwpOihjPW4sbj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGMuY2FsbChiKGUpLG4pfSkpLG4pKWZvcig7bD51O3UrKyluKGVbdV0scixzP2k6aS5jYWxsKGVbdV0sdSxuKGVbdV0scikpKTtyZXR1cm4gbz9lOmM/bi5jYWxsKGUpOmw/bihlWzBdLHIpOmF9LG5vdzpmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfX0pLGIucmVhZHkucHJvbWlzZT1mdW5jdGlvbih0KXtpZighbilpZihuPWIuRGVmZXJyZWQoKSwiY29tcGxldGUiPT09by5yZWFkeVN0YXRlKXNldFRpbWVvdXQoYi5yZWFkeSk7ZWxzZSBpZihvLmFkZEV2ZW50TGlzdGVuZXIpby5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixILCExKSxlLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLEgsITEpO2Vsc2V7by5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixIKSxlLmF0dGFjaEV2ZW50KCJvbmxvYWQiLEgpO3ZhciByPSExO3RyeXtyPW51bGw9PWUuZnJhbWVFbGVtZW50JiZvLmRvY3VtZW50RWxlbWVudH1jYXRjaChpKXt9ciYmci5kb1Njcm9sbCYmZnVuY3Rpb24gYSgpe2lmKCFiLmlzUmVhZHkpe3RyeXtyLmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goZSl7cmV0dXJuIHNldFRpbWVvdXQoYSw1MCl9cSgpLGIucmVhZHkoKX19KCl9cmV0dXJuIG4ucHJvbWlzZSh0KX0sYi5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGUsdCl7bFsiW29iamVjdCAiK3QrIl0iXT10LnRvTG93ZXJDYXNlKCl9KTtmdW5jdGlvbiBNKGUpe3ZhciB0PWUubGVuZ3RoLG49Yi50eXBlKGUpO3JldHVybiBiLmlzV2luZG93KGUpPyExOjE9PT1lLm5vZGVUeXBlJiZ0PyEwOiJhcnJheSI9PT1ufHwiZnVuY3Rpb24iIT09biYmKDA9PT10fHwibnVtYmVyIj09dHlwZW9mIHQmJnQ+MCYmdC0xIGluIGUpfXI9YihvKTt2YXIgXz17fTtmdW5jdGlvbiBGKGUpe3ZhciB0PV9bZV09e307cmV0dXJuIGIuZWFjaChlLm1hdGNoKHcpfHxbXSxmdW5jdGlvbihlLG4pe3Rbbl09ITB9KSx0fWIuQ2FsbGJhY2tzPWZ1bmN0aW9uKGUpe2U9InN0cmluZyI9PXR5cGVvZiBlP19bZV18fEYoZSk6Yi5leHRlbmQoe30sZSk7dmFyIG4scixpLG8sYSxzLHU9W10sbD0hZS5vbmNlJiZbXSxjPWZ1bmN0aW9uKHQpe2ZvcihyPWUubWVtb3J5JiZ0LGk9ITAsYT1zfHwwLHM9MCxvPXUubGVuZ3RoLG49ITA7dSYmbz5hO2ErKylpZih1W2FdLmFwcGx5KHRbMF0sdFsxXSk9PT0hMSYmZS5zdG9wT25GYWxzZSl7cj0hMTticmVha31uPSExLHUmJihsP2wubGVuZ3RoJiZjKGwuc2hpZnQoKSk6cj91PVtdOnAuZGlzYWJsZSgpKX0scD17YWRkOmZ1bmN0aW9uKCl7aWYodSl7dmFyIHQ9dS5sZW5ndGg7KGZ1bmN0aW9uIGkodCl7Yi5lYWNoKHQsZnVuY3Rpb24odCxuKXt2YXIgcj1iLnR5cGUobik7ImZ1bmN0aW9uIj09PXI/ZS51bmlxdWUmJnAuaGFzKG4pfHx1LnB1c2gobik6biYmbi5sZW5ndGgmJiJzdHJpbmciIT09ciYmaShuKX0pfSkoYXJndW1lbnRzKSxuP289dS5sZW5ndGg6ciYmKHM9dCxjKHIpKX1yZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIHUmJmIuZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oZSx0KXt2YXIgcjt3aGlsZSgocj1iLmluQXJyYXkodCx1LHIpKT4tMSl1LnNwbGljZShyLDEpLG4mJihvPj1yJiZvLS0sYT49ciYmYS0tKX0pLHRoaXN9LGhhczpmdW5jdGlvbihlKXtyZXR1cm4gZT9iLmluQXJyYXkoZSx1KT4tMTohKCF1fHwhdS5sZW5ndGgpfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiB1PVtdLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdT1sPXI9dCx0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiF1fSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIGw9dCxyfHxwLmRpc2FibGUoKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hbH0sZmlyZVdpdGg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD10fHxbXSx0PVtlLHQuc2xpY2U/dC5zbGljZSgpOnRdLCF1fHxpJiYhbHx8KG4/bC5wdXNoKHQpOmModCkpLHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtyZXR1cm4gcC5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyksdGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWl9fTtyZXR1cm4gcH0sYi5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKGUpe3ZhciB0PVtbInJlc29sdmUiLCJkb25lIixiLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwicmVzb2x2ZWQiXSxbInJlamVjdCIsImZhaWwiLGIuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZWplY3RlZCJdLFsibm90aWZ5IiwicHJvZ3Jlc3MiLGIuQ2FsbGJhY2tzKCJtZW1vcnkiKV1dLG49InBlbmRpbmciLHI9e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIG59LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBpLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sdGhlbjpmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cztyZXR1cm4gYi5EZWZlcnJlZChmdW5jdGlvbihuKXtiLmVhY2godCxmdW5jdGlvbih0LG8pe3ZhciBhPW9bMF0scz1iLmlzRnVuY3Rpb24oZVt0XSkmJmVbdF07aVtvWzFdXShmdW5jdGlvbigpe3ZhciBlPXMmJnMuYXBwbHkodGhpcyxhcmd1bWVudHMpO2UmJmIuaXNGdW5jdGlvbihlLnByb21pc2UpP2UucHJvbWlzZSgpLmRvbmUobi5yZXNvbHZlKS5mYWlsKG4ucmVqZWN0KS5wcm9ncmVzcyhuLm5vdGlmeSk6blthKyJXaXRoIl0odGhpcz09PXI/bi5wcm9taXNlKCk6dGhpcyxzP1tlXTphcmd1bWVudHMpfSl9KSxlPW51bGx9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWU/Yi5leHRlbmQoZSxyKTpyfX0saT17fTtyZXR1cm4gci5waXBlPXIudGhlbixiLmVhY2godCxmdW5jdGlvbihlLG8pe3ZhciBhPW9bMl0scz1vWzNdO3Jbb1sxXV09YS5hZGQscyYmYS5hZGQoZnVuY3Rpb24oKXtuPXN9LHRbMV5lXVsyXS5kaXNhYmxlLHRbMl1bMl0ubG9jayksaVtvWzBdXT1mdW5jdGlvbigpe3JldHVybiBpW29bMF0rIldpdGgiXSh0aGlzPT09aT9yOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxpW29bMF0rIldpdGgiXT1hLmZpcmVXaXRofSksci5wcm9taXNlKGkpLGUmJmUuY2FsbChpLGkpLGl9LHdoZW46ZnVuY3Rpb24oZSl7dmFyIHQ9MCxuPWguY2FsbChhcmd1bWVudHMpLHI9bi5sZW5ndGgsaT0xIT09cnx8ZSYmYi5pc0Z1bmN0aW9uKGUucHJvbWlzZSk/cjowLG89MT09PWk/ZTpiLkRlZmVycmVkKCksYT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKHIpe3RbZV09dGhpcyxuW2VdPWFyZ3VtZW50cy5sZW5ndGg+MT9oLmNhbGwoYXJndW1lbnRzKTpyLG49PT1zP28ubm90aWZ5V2l0aCh0LG4pOi0taXx8by5yZXNvbHZlV2l0aCh0LG4pfX0scyx1LGw7aWYocj4xKWZvcihzPUFycmF5KHIpLHU9QXJyYXkociksbD1BcnJheShyKTtyPnQ7dCsrKW5bdF0mJmIuaXNGdW5jdGlvbihuW3RdLnByb21pc2UpP25bdF0ucHJvbWlzZSgpLmRvbmUoYSh0LGwsbikpLmZhaWwoby5yZWplY3QpLnByb2dyZXNzKGEodCx1LHMpKTotLWk7cmV0dXJuIGl8fG8ucmVzb2x2ZVdpdGgobCxuKSxvLnByb21pc2UoKX19KSxiLnN1cHBvcnQ9ZnVuY3Rpb24oKXt2YXIgdCxuLHIsYSxzLHUsbCxjLHAsZixkPW8uY3JlYXRlRWxlbWVudCgiZGl2Iik7aWYoZC5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKSxkLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixuPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSxyPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSwhbnx8IXJ8fCFuLmxlbmd0aClyZXR1cm57fTtzPW8uY3JlYXRlRWxlbWVudCgic2VsZWN0IiksbD1zLmFwcGVuZENoaWxkKG8uY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKVswXSxyLnN0eWxlLmNzc1RleHQ9InRvcDoxcHg7ZmxvYXQ6bGVmdDtvcGFjaXR5Oi41Iix0PXtnZXRTZXRBdHRyaWJ1dGU6InQiIT09ZC5jbGFzc05hbWUsbGVhZGluZ1doaXRlc3BhY2U6Mz09PWQuZmlyc3RDaGlsZC5ub2RlVHlwZSx0Ym9keTohZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsaHRtbFNlcmlhbGl6ZTohIWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKS5sZW5ndGgsc3R5bGU6L3RvcC8udGVzdChyLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksaHJlZk5vcm1hbGl6ZWQ6Ii9hIj09PXIuZ2V0QXR0cmlidXRlKCJocmVmIiksb3BhY2l0eTovXjAuNS8udGVzdChyLnN0eWxlLm9wYWNpdHkpLGNzc0Zsb2F0OiEhci5zdHlsZS5jc3NGbG9hdCxjaGVja09uOiEhYS52YWx1ZSxvcHRTZWxlY3RlZDpsLnNlbGVjdGVkLGVuY3R5cGU6ISFvLmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLGh0bWw1Q2xvbmU6Ijw6bmF2PjwvOm5hdj4iIT09by5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCxib3hNb2RlbDoiQ1NTMUNvbXBhdCI9PT1vLmNvbXBhdE1vZGUsZGVsZXRlRXhwYW5kbzohMCxub0Nsb25lRXZlbnQ6ITAsaW5saW5lQmxvY2tOZWVkc0xheW91dDohMSxzaHJpbmtXcmFwQmxvY2tzOiExLHJlbGlhYmxlTWFyZ2luUmlnaHQ6ITAsYm94U2l6aW5nUmVsaWFibGU6ITAscGl4ZWxQb3NpdGlvbjohMX0sYS5jaGVja2VkPSEwLHQubm9DbG9uZUNoZWNrZWQ9YS5jbG9uZU5vZGUoITApLmNoZWNrZWQscy5kaXNhYmxlZD0hMCx0Lm9wdERpc2FibGVkPSFsLmRpc2FibGVkO3RyeXtkZWxldGUgZC50ZXN0fWNhdGNoKGgpe3QuZGVsZXRlRXhwYW5kbz0hMX1hPW8uY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxhLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSx0LmlucHV0PSIiPT09YS5nZXRBdHRyaWJ1dGUoInZhbHVlIiksYS52YWx1ZT0idCIsYS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLHQucmFkaW9WYWx1ZT0idCI9PT1hLnZhbHVlLGEuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwidCIpLGEuc2V0QXR0cmlidXRlKCJuYW1lIiwidCIpLHU9by5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksdS5hcHBlbmRDaGlsZChhKSx0LmFwcGVuZENoZWNrZWQ9YS5jaGVja2VkLHQuY2hlY2tDbG9uZT11LmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCxkLmF0dGFjaEV2ZW50JiYoZC5hdHRhY2hFdmVudCgib25jbGljayIsZnVuY3Rpb24oKXt0Lm5vQ2xvbmVFdmVudD0hMX0pLGQuY2xvbmVOb2RlKCEwKS5jbGljaygpKTtmb3IoZiBpbntzdWJtaXQ6ITAsY2hhbmdlOiEwLGZvY3VzaW46ITB9KWQuc2V0QXR0cmlidXRlKGM9Im9uIitmLCJ0IiksdFtmKyJCdWJibGVzIl09YyBpbiBlfHxkLmF0dHJpYnV0ZXNbY10uZXhwYW5kbz09PSExO3JldHVybiBkLnN0eWxlLmJhY2tncm91bmRDbGlwPSJjb250ZW50LWJveCIsZC5jbG9uZU5vZGUoITApLnN0eWxlLmJhY2tncm91bmRDbGlwPSIiLHQuY2xlYXJDbG9uZVN0eWxlPSJjb250ZW50LWJveCI9PT1kLnN0eWxlLmJhY2tncm91bmRDbGlwLGIoZnVuY3Rpb24oKXt2YXIgbixyLGEscz0icGFkZGluZzowO21hcmdpbjowO2JvcmRlcjowO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7LXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94OyIsdT1vLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07dSYmKG49by5jcmVhdGVFbGVtZW50KCJkaXYiKSxuLnN0eWxlLmNzc1RleHQ9ImJvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDotOTk5OXB4O21hcmdpbi10b3A6MXB4Iix1LmFwcGVuZENoaWxkKG4pLmFwcGVuZENoaWxkKGQpLGQuaW5uZXJIVE1MPSI8dGFibGU+PHRyPjx0ZD48L3RkPjx0ZD50PC90ZD48L3RyPjwvdGFibGU+IixhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIiksYVswXS5zdHlsZS5jc3NUZXh0PSJwYWRkaW5nOjA7bWFyZ2luOjA7Ym9yZGVyOjA7ZGlzcGxheTpub25lIixwPTA9PT1hWzBdLm9mZnNldEhlaWdodCxhWzBdLnN0eWxlLmRpc3BsYXk9IiIsYVsxXS5zdHlsZS5kaXNwbGF5PSJub25lIix0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cz1wJiYwPT09YVswXS5vZmZzZXRIZWlnaHQsZC5pbm5lckhUTUw9IiIsZC5zdHlsZS5jc3NUZXh0PSJib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzoxcHg7Ym9yZGVyOjFweDtkaXNwbGF5OmJsb2NrO3dpZHRoOjRweDttYXJnaW4tdG9wOjElO3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxJTsiLHQuYm94U2l6aW5nPTQ9PT1kLm9mZnNldFdpZHRoLHQuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQ9MSE9PXUub2Zmc2V0VG9wLGUuZ2V0Q29tcHV0ZWRTdHlsZSYmKHQucGl4ZWxQb3NpdGlvbj0iMSUiIT09KGUuZ2V0Q29tcHV0ZWRTdHlsZShkLG51bGwpfHx7fSkudG9wLHQuYm94U2l6aW5nUmVsaWFibGU9IjRweCI9PT0oZS5nZXRDb21wdXRlZFN0eWxlKGQsbnVsbCl8fHt3aWR0aDoiNHB4In0pLndpZHRoLHI9ZC5hcHBlbmRDaGlsZChvLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxyLnN0eWxlLmNzc1RleHQ9ZC5zdHlsZS5jc3NUZXh0PXMsci5zdHlsZS5tYXJnaW5SaWdodD1yLnN0eWxlLndpZHRoPSIwIixkLnN0eWxlLndpZHRoPSIxcHgiLHQucmVsaWFibGVNYXJnaW5SaWdodD0hcGFyc2VGbG9hdCgoZS5nZXRDb21wdXRlZFN0eWxlKHIsbnVsbCl8fHt9KS5tYXJnaW5SaWdodCkpLHR5cGVvZiBkLnN0eWxlLnpvb20hPT1pJiYoZC5pbm5lckhUTUw9IiIsZC5zdHlsZS5jc3NUZXh0PXMrIndpZHRoOjFweDtwYWRkaW5nOjFweDtkaXNwbGF5OmlubGluZTt6b29tOjEiLHQuaW5saW5lQmxvY2tOZWVkc0xheW91dD0zPT09ZC5vZmZzZXRXaWR0aCxkLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixkLmlubmVySFRNTD0iPGRpdj48L2Rpdj4iLGQuZmlyc3RDaGlsZC5zdHlsZS53aWR0aD0iNXB4Iix0LnNocmlua1dyYXBCbG9ja3M9MyE9PWQub2Zmc2V0V2lkdGgsdC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0JiYodS5zdHlsZS56b29tPTEpKSx1LnJlbW92ZUNoaWxkKG4pLG49ZD1hPXI9bnVsbCl9KSxuPXM9dT1sPXI9YT1udWxsLHR9KCk7dmFyIE89Lyg/Olx7W1xzXFNdKlx9fFxbW1xzXFNdKlxdKSQvLEI9LyhbQS1aXSkvZztmdW5jdGlvbiBQKGUsbixyLGkpe2lmKGIuYWNjZXB0RGF0YShlKSl7dmFyIG8sYSxzPWIuZXhwYW5kbyx1PSJzdHJpbmciPT10eXBlb2YgbixsPWUubm9kZVR5cGUscD1sP2IuY2FjaGU6ZSxmPWw/ZVtzXTplW3NdJiZzO2lmKGYmJnBbZl0mJihpfHxwW2ZdLmRhdGEpfHwhdXx8ciE9PXQpcmV0dXJuIGZ8fChsP2Vbc109Zj1jLnBvcCgpfHxiLmd1aWQrKzpmPXMpLHBbZl18fChwW2ZdPXt9LGx8fChwW2ZdLnRvSlNPTj1iLm5vb3ApKSwoIm9iamVjdCI9PXR5cGVvZiBufHwiZnVuY3Rpb24iPT10eXBlb2YgbikmJihpP3BbZl09Yi5leHRlbmQocFtmXSxuKTpwW2ZdLmRhdGE9Yi5leHRlbmQocFtmXS5kYXRhLG4pKSxvPXBbZl0saXx8KG8uZGF0YXx8KG8uZGF0YT17fSksbz1vLmRhdGEpLHIhPT10JiYob1tiLmNhbWVsQ2FzZShuKV09ciksdT8oYT1vW25dLG51bGw9PWEmJihhPW9bYi5jYW1lbENhc2UobildKSk6YT1vLGF9fWZ1bmN0aW9uIFIoZSx0LG4pe2lmKGIuYWNjZXB0RGF0YShlKSl7dmFyIHIsaSxvLGE9ZS5ub2RlVHlwZSxzPWE/Yi5jYWNoZTplLHU9YT9lW2IuZXhwYW5kb106Yi5leHBhbmRvO2lmKHNbdV0pe2lmKHQmJihvPW4/c1t1XTpzW3VdLmRhdGEpKXtiLmlzQXJyYXkodCk/dD10LmNvbmNhdChiLm1hcCh0LGIuY2FtZWxDYXNlKSk6dCBpbiBvP3Q9W3RdOih0PWIuY2FtZWxDYXNlKHQpLHQ9dCBpbiBvP1t0XTp0LnNwbGl0KCIgIikpO2ZvcihyPTAsaT10Lmxlbmd0aDtpPnI7cisrKWRlbGV0ZSBvW3Rbcl1dO2lmKCEobj8kOmIuaXNFbXB0eU9iamVjdCkobykpcmV0dXJufShufHwoZGVsZXRlIHNbdV0uZGF0YSwkKHNbdV0pKSkmJihhP2IuY2xlYW5EYXRhKFtlXSwhMCk6Yi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG98fHMhPXMud2luZG93P2RlbGV0ZSBzW3VdOnNbdV09bnVsbCl9fX1iLmV4dGVuZCh7Y2FjaGU6e30sZXhwYW5kbzoialF1ZXJ5IisocCtNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKC9cRC9nLCIiKSxub0RhdGE6e2VtYmVkOiEwLG9iamVjdDoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIixhcHBsZXQ6ITB9LGhhc0RhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZS5ub2RlVHlwZT9iLmNhY2hlW2VbYi5leHBhbmRvXV06ZVtiLmV4cGFuZG9dLCEhZSYmISQoZSl9LGRhdGE6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBQKGUsdCxuKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe3JldHVybiBSKGUsdCl9LF9kYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gUChlLHQsbiwhMCl9LF9yZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFIoZSx0LCEwKX0sYWNjZXB0RGF0YTpmdW5jdGlvbihlKXtpZihlLm5vZGVUeXBlJiYxIT09ZS5ub2RlVHlwZSYmOSE9PWUubm9kZVR5cGUpcmV0dXJuITE7dmFyIHQ9ZS5ub2RlTmFtZSYmYi5ub0RhdGFbZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXTtyZXR1cm4hdHx8dCE9PSEwJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3NpZCIpPT09dH19KSxiLmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihlLG4pe3ZhciByLGksbz10aGlzWzBdLGE9MCxzPW51bGw7aWYoZT09PXQpe2lmKHRoaXMubGVuZ3RoJiYocz1iLmRhdGEobyksMT09PW8ubm9kZVR5cGUmJiFiLl9kYXRhKG8sInBhcnNlZEF0dHJzIikpKXtmb3Iocj1vLmF0dHJpYnV0ZXM7ci5sZW5ndGg+YTthKyspaT1yW2FdLm5hbWUsaS5pbmRleE9mKCJkYXRhLSIpfHwoaT1iLmNhbWVsQ2FzZShpLnNsaWNlKDUpKSxXKG8saSxzW2ldKSk7Yi5fZGF0YShvLCJwYXJzZWRBdHRycyIsITApfXJldHVybiBzfXJldHVybiJvYmplY3QiPT10eXBlb2YgZT90aGlzLmVhY2goZnVuY3Rpb24oKXtiLmRhdGEodGhpcyxlKX0pOmIuYWNjZXNzKHRoaXMsZnVuY3Rpb24obil7cmV0dXJuIG49PT10P28/VyhvLGUsYi5kYXRhKG8sZSkpOm51bGw6KHRoaXMuZWFjaChmdW5jdGlvbigpe2IuZGF0YSh0aGlzLGUsbil9KSx0KX0sbnVsbCxuLGFyZ3VtZW50cy5sZW5ndGg+MSxudWxsLCEwKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yi5yZW1vdmVEYXRhKHRoaXMsZSl9KX19KTtmdW5jdGlvbiBXKGUsbixyKXtpZihyPT09dCYmMT09PWUubm9kZVR5cGUpe3ZhciBpPSJkYXRhLSIrbi5yZXBsYWNlKEIsIi0kMSIpLnRvTG93ZXJDYXNlKCk7aWYocj1lLmdldEF0dHJpYnV0ZShpKSwic3RyaW5nIj09dHlwZW9mIHIpe3RyeXtyPSJ0cnVlIj09PXI/ITA6ImZhbHNlIj09PXI/ITE6Im51bGwiPT09cj9udWxsOityKyIiPT09cj8rcjpPLnRlc3Qocik/Yi5wYXJzZUpTT04ocik6cn1jYXRjaChvKXt9Yi5kYXRhKGUsbixyKX1lbHNlIHI9dH1yZXR1cm4gcn1mdW5jdGlvbiAkKGUpe3ZhciB0O2Zvcih0IGluIGUpaWYoKCJkYXRhIiE9PXR8fCFiLmlzRW1wdHlPYmplY3QoZVt0XSkpJiYidG9KU09OIiE9PXQpcmV0dXJuITE7cmV0dXJuITB9Yi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGUsbixyKXt2YXIgaTtyZXR1cm4gZT8obj0obnx8ImZ4IikrInF1ZXVlIixpPWIuX2RhdGEoZSxuKSxyJiYoIWl8fGIuaXNBcnJheShyKT9pPWIuX2RhdGEoZSxuLGIubWFrZUFycmF5KHIpKTppLnB1c2gocikpLGl8fFtdKTp0fSxkZXF1ZXVlOmZ1bmN0aW9uKGUsdCl7dD10fHwiZngiO3ZhciBuPWIucXVldWUoZSx0KSxyPW4ubGVuZ3RoLGk9bi5zaGlmdCgpLG89Yi5fcXVldWVIb29rcyhlLHQpLGE9ZnVuY3Rpb24oKXtiLmRlcXVldWUoZSx0KX07ImlucHJvZ3Jlc3MiPT09aSYmKGk9bi5zaGlmdCgpLHItLSksby5jdXI9aSxpJiYoImZ4Ij09PXQmJm4udW5zaGlmdCgiaW5wcm9ncmVzcyIpLGRlbGV0ZSBvLnN0b3AsaS5jYWxsKGUsYSxvKSksIXImJm8mJm8uZW1wdHkuZmlyZSgpfSxfcXVldWVIb29rczpmdW5jdGlvbihlLHQpe3ZhciBuPXQrInF1ZXVlSG9va3MiO3JldHVybiBiLl9kYXRhKGUsbil8fGIuX2RhdGEoZSxuLHtlbXB0eTpiLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24oKXtiLl9yZW1vdmVEYXRhKGUsdCsicXVldWUiKSxiLl9yZW1vdmVEYXRhKGUsbil9KX0pfX0pLGIuZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihlLG4pe3ZhciByPTI7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBlJiYobj1lLGU9ImZ4IixyLS0pLHI+YXJndW1lbnRzLmxlbmd0aD9iLnF1ZXVlKHRoaXNbMF0sZSk6bj09PXQ/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1iLnF1ZXVlKHRoaXMsZSxuKTtiLl9xdWV1ZUhvb2tzKHRoaXMsZSksImZ4Ij09PWUmJiJpbnByb2dyZXNzIiE9PXRbMF0mJmIuZGVxdWV1ZSh0aGlzLGUpfSl9LGRlcXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2IuZGVxdWV1ZSh0aGlzLGUpfSl9LGRlbGF5OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9Yi5meD9iLmZ4LnNwZWVkc1tlXXx8ZTplLHQ9dHx8ImZ4Iix0aGlzLnF1ZXVlKHQsZnVuY3Rpb24odCxuKXt2YXIgcj1zZXRUaW1lb3V0KHQsZSk7bi5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHIpfX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnF1ZXVlKGV8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGUsbil7dmFyIHIsaT0xLG89Yi5EZWZlcnJlZCgpLGE9dGhpcyxzPXRoaXMubGVuZ3RoLHU9ZnVuY3Rpb24oKXstLWl8fG8ucmVzb2x2ZVdpdGgoYSxbYV0pfTsic3RyaW5nIiE9dHlwZW9mIGUmJihuPWUsZT10KSxlPWV8fCJmeCI7d2hpbGUocy0tKXI9Yi5fZGF0YShhW3NdLGUrInF1ZXVlSG9va3MiKSxyJiZyLmVtcHR5JiYoaSsrLHIuZW1wdHkuYWRkKHUpKTtyZXR1cm4gdSgpLG8ucHJvbWlzZShuKX19KTt2YXIgSSx6LFg9L1tcdFxyXG5dL2csVT0vXHIvZyxWPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbnxvYmplY3QpJC9pLFk9L14oPzphfGFyZWEpJC9pLEo9L14oPzpjaGVja2VkfHNlbGVjdGVkfGF1dG9mb2N1c3xhdXRvcGxheXxhc3luY3xjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCkkL2ksRz0vXig/OmNoZWNrZWR8c2VsZWN0ZWQpJC9pLFE9Yi5zdXBwb3J0LmdldFNldEF0dHJpYnV0ZSxLPWIuc3VwcG9ydC5pbnB1dDtiLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihlLHQpe3JldHVybiBiLmFjY2Vzcyh0aGlzLGIuYXR0cixlLHQsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yi5yZW1vdmVBdHRyKHRoaXMsZSl9KX0scHJvcDpmdW5jdGlvbihlLHQpe3JldHVybiBiLmFjY2Vzcyh0aGlzLGIucHJvcCxlLHQsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihlKXtyZXR1cm4gZT1iLnByb3BGaXhbZV18fGUsdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dHJ5e3RoaXNbZV09dCxkZWxldGUgdGhpc1tlXX1jYXRjaChuKXt9fSl9LGFkZENsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG8sYT0wLHM9dGhpcy5sZW5ndGgsdT0ic3RyaW5nIj09dHlwZW9mIGUmJmU7aWYoYi5pc0Z1bmN0aW9uKGUpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24odCl7Yih0aGlzKS5hZGRDbGFzcyhlLmNhbGwodGhpcyx0LHRoaXMuY2xhc3NOYW1lKSl9KTtpZih1KWZvcih0PShlfHwiIikubWF0Y2godyl8fFtdO3M+YTthKyspaWYobj10aGlzW2FdLHI9MT09PW4ubm9kZVR5cGUmJihuLmNsYXNzTmFtZT8oIiAiK24uY2xhc3NOYW1lKyIgIikucmVwbGFjZShYLCIgIik6IiAiKSl7bz0wO3doaWxlKGk9dFtvKytdKTA+ci5pbmRleE9mKCIgIitpKyIgIikmJihyKz1pKyIgIik7bi5jbGFzc05hbWU9Yi50cmltKHIpfXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGE9MCxzPXRoaXMubGVuZ3RoLHU9MD09PWFyZ3VtZW50cy5sZW5ndGh8fCJzdHJpbmciPT10eXBlb2YgZSYmZTtpZihiLmlzRnVuY3Rpb24oZSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbih0KXtiKHRoaXMpLnJlbW92ZUNsYXNzKGUuY2FsbCh0aGlzLHQsdGhpcy5jbGFzc05hbWUpKX0pO2lmKHUpZm9yKHQ9KGV8fCIiKS5tYXRjaCh3KXx8W107cz5hO2ErKylpZihuPXRoaXNbYV0scj0xPT09bi5ub2RlVHlwZSYmKG4uY2xhc3NOYW1lPygiICIrbi5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKFgsIiAiKToiIikpe289MDt3aGlsZShpPXRbbysrXSl3aGlsZShyLmluZGV4T2YoIiAiK2krIiAiKT49MClyPXIucmVwbGFjZSgiICIraSsiICIsIiAiKTtuLmNsYXNzTmFtZT1lP2IudHJpbShyKToiIn1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10eXBlb2YgZSxyPSJib29sZWFuIj09dHlwZW9mIHQ7cmV0dXJuIGIuaXNGdW5jdGlvbihlKT90aGlzLmVhY2goZnVuY3Rpb24obil7Yih0aGlzKS50b2dnbGVDbGFzcyhlLmNhbGwodGhpcyxuLHRoaXMuY2xhc3NOYW1lLHQpLHQpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoInN0cmluZyI9PT1uKXt2YXIgbyxhPTAscz1iKHRoaXMpLHU9dCxsPWUubWF0Y2godyl8fFtdO3doaWxlKG89bFthKytdKXU9cj91OiFzLmhhc0NsYXNzKG8pLHNbdT8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKG8pfWVsc2Uobj09PWl8fCJib29sZWFuIj09PW4pJiYodGhpcy5jbGFzc05hbWUmJmIuX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIsdGhpcy5jbGFzc05hbWUpLHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lfHxlPT09ITE/IiI6Yi5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKX0pfSxoYXNDbGFzczpmdW5jdGlvbihlKXt2YXIgdD0iICIrZSsiICIsbj0wLHI9dGhpcy5sZW5ndGg7Zm9yKDtyPm47bisrKWlmKDE9PT10aGlzW25dLm5vZGVUeXBlJiYoIiAiK3RoaXNbbl0uY2xhc3NOYW1lKyIgIikucmVwbGFjZShYLCIgIikuaW5kZXhPZih0KT49MClyZXR1cm4hMDtyZXR1cm4hMX0sdmFsOmZ1bmN0aW9uKGUpe3ZhciBuLHIsaSxvPXRoaXNbMF07e2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGk9Yi5pc0Z1bmN0aW9uKGUpLHRoaXMuZWFjaChmdW5jdGlvbihuKXt2YXIgbyxhPWIodGhpcyk7MT09PXRoaXMubm9kZVR5cGUmJihvPWk/ZS5jYWxsKHRoaXMsbixhLnZhbCgpKTplLG51bGw9PW8/bz0iIjoibnVtYmVyIj09dHlwZW9mIG8/bys9IiI6Yi5pc0FycmF5KG8pJiYobz1iLm1hcChvLGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lPyIiOmUrIiJ9KSkscj1iLnZhbEhvb2tzW3RoaXMudHlwZV18fGIudmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxyJiYic2V0ImluIHImJnIuc2V0KHRoaXMsbywidmFsdWUiKSE9PXR8fCh0aGlzLnZhbHVlPW8pKX0pO2lmKG8pcmV0dXJuIHI9Yi52YWxIb29rc1tvLnR5cGVdfHxiLnZhbEhvb2tzW28ubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0sciYmImdldCJpbiByJiYobj1yLmdldChvLCJ2YWx1ZSIpKSE9PXQ/bjoobj1vLnZhbHVlLCJzdHJpbmciPT10eXBlb2Ygbj9uLnJlcGxhY2UoVSwiIik6bnVsbD09bj8iIjpuKX19fSksYi5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihlKXt2YXIgdD1lLmF0dHJpYnV0ZXMudmFsdWU7cmV0dXJuIXR8fHQuc3BlY2lmaWVkP2UudmFsdWU6ZS50ZXh0fX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQsbixyPWUub3B0aW9ucyxpPWUuc2VsZWN0ZWRJbmRleCxvPSJzZWxlY3Qtb25lIj09PWUudHlwZXx8MD5pLGE9bz9udWxsOltdLHM9bz9pKzE6ci5sZW5ndGgsdT0wPmk/czpvP2k6MDtmb3IoO3M+dTt1KyspaWYobj1yW3VdLCEoIW4uc2VsZWN0ZWQmJnUhPT1pfHwoYi5zdXBwb3J0Lm9wdERpc2FibGVkP24uZGlzYWJsZWQ6bnVsbCE9PW4uZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpKXx8bi5wYXJlbnROb2RlLmRpc2FibGVkJiZiLm5vZGVOYW1lKG4ucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2lmKHQ9YihuKS52YWwoKSxvKXJldHVybiB0O2EucHVzaCh0KX1yZXR1cm4gYX0sc2V0OmZ1bmN0aW9uKGUsdCl7dmFyIG49Yi5tYWtlQXJyYXkodCk7cmV0dXJuIGIoZSkuZmluZCgib3B0aW9uIikuZWFjaChmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWQ9Yi5pbkFycmF5KGIodGhpcykudmFsKCksbik+PTB9KSxuLmxlbmd0aHx8KGUuc2VsZWN0ZWRJbmRleD0tMSksbn19fSxhdHRyOmZ1bmN0aW9uKGUsbixyKXt2YXIgbyxhLHMsdT1lLm5vZGVUeXBlO2lmKGUmJjMhPT11JiY4IT09dSYmMiE9PXUpcmV0dXJuIHR5cGVvZiBlLmdldEF0dHJpYnV0ZT09PWk/Yi5wcm9wKGUsbixyKTooYT0xIT09dXx8IWIuaXNYTUxEb2MoZSksYSYmKG49bi50b0xvd2VyQ2FzZSgpLG89Yi5hdHRySG9va3Nbbl18fChKLnRlc3Qobik/ejpJKSkscj09PXQ/byYmYSYmImdldCJpbiBvJiZudWxsIT09KHM9by5nZXQoZSxuKSk/czoodHlwZW9mIGUuZ2V0QXR0cmlidXRlIT09aSYmKHM9ZS5nZXRBdHRyaWJ1dGUobikpLG51bGw9PXM/dDpzKTpudWxsIT09cj9vJiZhJiYic2V0ImluIG8mJihzPW8uc2V0KGUscixuKSkhPT10P3M6KGUuc2V0QXR0cmlidXRlKG4scisiIikscik6KGIucmVtb3ZlQXR0cihlLG4pLHQpKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT0wLG89dCYmdC5tYXRjaCh3KTtpZihvJiYxPT09ZS5ub2RlVHlwZSl3aGlsZShuPW9baSsrXSlyPWIucHJvcEZpeFtuXXx8bixKLnRlc3Qobik/IVEmJkcudGVzdChuKT9lW2IuY2FtZWxDYXNlKCJkZWZhdWx0LSIrbildPWVbcl09ITE6ZVtyXT0hMTpiLmF0dHIoZSxuLCIiKSxlLnJlbW92ZUF0dHJpYnV0ZShRP246cil9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGUsdCl7aWYoIWIuc3VwcG9ydC5yYWRpb1ZhbHVlJiYicmFkaW8iPT09dCYmYi5ub2RlTmFtZShlLCJpbnB1dCIpKXt2YXIgbj1lLnZhbHVlO3JldHVybiBlLnNldEF0dHJpYnV0ZSgidHlwZSIsdCksbiYmKGUudmFsdWU9biksdH19fX0scHJvcEZpeDp7dGFiaW5kZXg6InRhYkluZGV4IixyZWFkb25seToicmVhZE9ubHkiLCJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIscm93c3Bhbjoicm93U3BhbiIsY29sc3BhbjoiY29sU3BhbiIsdXNlbWFwOiJ1c2VNYXAiLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsY29udGVudGVkaXRhYmxlOiJjb250ZW50RWRpdGFibGUifSxwcm9wOmZ1bmN0aW9uKGUsbixyKXt2YXIgaSxvLGEscz1lLm5vZGVUeXBlO2lmKGUmJjMhPT1zJiY4IT09cyYmMiE9PXMpcmV0dXJuIGE9MSE9PXN8fCFiLmlzWE1MRG9jKGUpLGEmJihuPWIucHJvcEZpeFtuXXx8bixvPWIucHJvcEhvb2tzW25dKSxyIT09dD9vJiYic2V0ImluIG8mJihpPW8uc2V0KGUscixuKSkhPT10P2k6ZVtuXT1yOm8mJiJnZXQiaW4gbyYmbnVsbCE9PShpPW8uZ2V0KGUsbikpP2k6ZVtuXX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciBuPWUuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKTtyZXR1cm4gbiYmbi5zcGVjaWZpZWQ/cGFyc2VJbnQobi52YWx1ZSwxMCk6Vi50ZXN0KGUubm9kZU5hbWUpfHxZLnRlc3QoZS5ub2RlTmFtZSkmJmUuaHJlZj8wOnR9fX19KSx6PXtnZXQ6ZnVuY3Rpb24oZSxuKXt2YXIgcj1iLnByb3AoZSxuKSxpPSJib29sZWFuIj09dHlwZW9mIHImJmUuZ2V0QXR0cmlidXRlKG4pLG89ImJvb2xlYW4iPT10eXBlb2Ygcj9LJiZRP251bGwhPWk6Ry50ZXN0KG4pP2VbYi5jYW1lbENhc2UoImRlZmF1bHQtIituKV06ISFpOmUuZ2V0QXR0cmlidXRlTm9kZShuKTtyZXR1cm4gbyYmby52YWx1ZSE9PSExP24udG9Mb3dlckNhc2UoKTp0fSxzZXQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0PT09ITE/Yi5yZW1vdmVBdHRyKGUsbik6SyYmUXx8IUcudGVzdChuKT9lLnNldEF0dHJpYnV0ZSghUSYmYi5wcm9wRml4W25dfHxuLG4pOmVbYi5jYW1lbENhc2UoImRlZmF1bHQtIituKV09ZVtuXT0hMCxufX0sSyYmUXx8KGIuYXR0ckhvb2tzLnZhbHVlPXtnZXQ6ZnVuY3Rpb24oZSxuKXt2YXIgcj1lLmdldEF0dHJpYnV0ZU5vZGUobik7cmV0dXJuIGIubm9kZU5hbWUoZSwiaW5wdXQiKT9lLmRlZmF1bHRWYWx1ZTpyJiZyLnNwZWNpZmllZD9yLnZhbHVlOnR9LHNldDpmdW5jdGlvbihlLG4scil7cmV0dXJuIGIubm9kZU5hbWUoZSwiaW5wdXQiKT8oZS5kZWZhdWx0VmFsdWU9bix0KTpJJiZJLnNldChlLG4scil9fSksUXx8KEk9Yi52YWxIb29rcy5idXR0b249e2dldDpmdW5jdGlvbihlLG4pe3ZhciByPWUuZ2V0QXR0cmlidXRlTm9kZShuKTtyZXR1cm4gciYmKCJpZCI9PT1ufHwibmFtZSI9PT1ufHwiY29vcmRzIj09PW4/IiIhPT1yLnZhbHVlOnIuc3BlY2lmaWVkKT9yLnZhbHVlOnR9LHNldDpmdW5jdGlvbihlLG4scil7dmFyIGk9ZS5nZXRBdHRyaWJ1dGVOb2RlKHIpO3JldHVybiBpfHxlLnNldEF0dHJpYnV0ZU5vZGUoaT1lLm93bmVyRG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKHIpKSxpLnZhbHVlPW4rPSIiLCJ2YWx1ZSI9PT1yfHxuPT09ZS5nZXRBdHRyaWJ1dGUocik/bjp0fX0sYi5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtnZXQ6SS5nZXQsc2V0OmZ1bmN0aW9uKGUsdCxuKXtJLnNldChlLCIiPT09dD8hMTp0LG4pfX0sYi5lYWNoKFsid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihlLG4pe2IuYXR0ckhvb2tzW25dPWIuZXh0ZW5kKGIuYXR0ckhvb2tzW25dLHtzZXQ6ZnVuY3Rpb24oZSxyKXtyZXR1cm4iIj09PXI/KGUuc2V0QXR0cmlidXRlKG4sImF1dG8iKSxyKTp0fX0pfSkpLGIuc3VwcG9ydC5ocmVmTm9ybWFsaXplZHx8KGIuZWFjaChbImhyZWYiLCJzcmMiLCJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGUsbil7Yi5hdHRySG9va3Nbbl09Yi5leHRlbmQoYi5hdHRySG9va3Nbbl0se2dldDpmdW5jdGlvbihlKXt2YXIgcj1lLmdldEF0dHJpYnV0ZShuLDIpO3JldHVybiBudWxsPT1yP3Q6cn19KX0pLGIuZWFjaChbImhyZWYiLCJzcmMiXSxmdW5jdGlvbihlLHQpe2IucHJvcEhvb2tzW3RdPXtnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlKHQsNCl9fX0pKSxiLnN1cHBvcnQuc3R5bGV8fChiLmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1bmN0aW9uKGUpe3JldHVybiBlLnN0eWxlLmNzc1RleHR8fHR9LHNldDpmdW5jdGlvbihlLHQpe3JldHVybiBlLnN0eWxlLmNzc1RleHQ9dCsiIn19KSxiLnN1cHBvcnQub3B0U2VsZWN0ZWR8fChiLnByb3BIb29rcy5zZWxlY3RlZD1iLmV4dGVuZChiLnByb3BIb29rcy5zZWxlY3RlZCx7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmKHQuc2VsZWN0ZWRJbmRleCx0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KSxudWxsfX0pKSxiLnN1cHBvcnQuZW5jdHlwZXx8KGIucHJvcEZpeC5lbmN0eXBlPSJlbmNvZGluZyIpLGIuc3VwcG9ydC5jaGVja09ufHxiLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtiLnZhbEhvb2tzW3RoaXNdPXtnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PT1lLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmUudmFsdWV9fX0pLGIuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe2IudmFsSG9va3NbdGhpc109Yi5leHRlbmQoYi52YWxIb29rc1t0aGlzXSx7c2V0OmZ1bmN0aW9uKGUsbil7cmV0dXJuIGIuaXNBcnJheShuKT9lLmNoZWNrZWQ9Yi5pbkFycmF5KGIoZSkudmFsKCksbik+PTA6dH19KX0pO3ZhciBaPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhKSQvaSxldD0vXmtleS8sdHQ9L14oPzptb3VzZXxjb250ZXh0bWVudSl8Y2xpY2svLG50PS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxydD0vXihbXi5dKikoPzpcLiguKyl8KSQvO2Z1bmN0aW9uIGl0KCl7cmV0dXJuITB9ZnVuY3Rpb24gb3QoKXtyZXR1cm4hMX1iLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGUsbixyLG8sYSl7dmFyIHMsdSxsLGMscCxmLGQsaCxnLG0seSx2PWIuX2RhdGEoZSk7aWYodil7ci5oYW5kbGVyJiYoYz1yLHI9Yy5oYW5kbGVyLGE9Yy5zZWxlY3Rvciksci5ndWlkfHwoci5ndWlkPWIuZ3VpZCsrKSwodT12LmV2ZW50cyl8fCh1PXYuZXZlbnRzPXt9KSwoZj12LmhhbmRsZSl8fChmPXYuaGFuZGxlPWZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgYj09PWl8fGUmJmIuZXZlbnQudHJpZ2dlcmVkPT09ZS50eXBlP3Q6Yi5ldmVudC5kaXNwYXRjaC5hcHBseShmLmVsZW0sYXJndW1lbnRzKX0sZi5lbGVtPWUpLG49KG58fCIiKS5tYXRjaCh3KXx8WyIiXSxsPW4ubGVuZ3RoO3doaWxlKGwtLSlzPXJ0LmV4ZWMobltsXSl8fFtdLGc9eT1zWzFdLG09KHNbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxwPWIuZXZlbnQuc3BlY2lhbFtnXXx8e30sZz0oYT9wLmRlbGVnYXRlVHlwZTpwLmJpbmRUeXBlKXx8ZyxwPWIuZXZlbnQuc3BlY2lhbFtnXXx8e30sZD1iLmV4dGVuZCh7dHlwZTpnLG9yaWdUeXBlOnksZGF0YTpvLGhhbmRsZXI6cixndWlkOnIuZ3VpZCxzZWxlY3RvcjphLG5lZWRzQ29udGV4dDphJiZiLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoYSksbmFtZXNwYWNlOm0uam9pbigiLiIpfSxjKSwoaD11W2ddKXx8KGg9dVtnXT1bXSxoLmRlbGVnYXRlQ291bnQ9MCxwLnNldHVwJiZwLnNldHVwLmNhbGwoZSxvLG0sZikhPT0hMXx8KGUuYWRkRXZlbnRMaXN0ZW5lcj9lLmFkZEV2ZW50TGlzdGVuZXIoZyxmLCExKTplLmF0dGFjaEV2ZW50JiZlLmF0dGFjaEV2ZW50KCJvbiIrZyxmKSkpLHAuYWRkJiYocC5hZGQuY2FsbChlLGQpLGQuaGFuZGxlci5ndWlkfHwoZC5oYW5kbGVyLmd1aWQ9ci5ndWlkKSksYT9oLnNwbGljZShoLmRlbGVnYXRlQ291bnQrKywwLGQpOmgucHVzaChkKSxiLmV2ZW50Lmdsb2JhbFtnXT0hMDtlPW51bGx9fSxyZW1vdmU6ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsdSxsLGMscCxmLGQsaCxnLG09Yi5oYXNEYXRhKGUpJiZiLl9kYXRhKGUpO2lmKG0mJihjPW0uZXZlbnRzKSl7dD0odHx8IiIpLm1hdGNoKHcpfHxbIiJdLGw9dC5sZW5ndGg7d2hpbGUobC0tKWlmKHM9cnQuZXhlYyh0W2xdKXx8W10sZD1nPXNbMV0saD0oc1syXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLGQpe3A9Yi5ldmVudC5zcGVjaWFsW2RdfHx7fSxkPShyP3AuZGVsZWdhdGVUeXBlOnAuYmluZFR5cGUpfHxkLGY9Y1tkXXx8W10scz1zWzJdJiZSZWdFeHAoIihefFxcLikiK2guam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIiksdT1vPWYubGVuZ3RoO3doaWxlKG8tLSlhPWZbb10sIWkmJmchPT1hLm9yaWdUeXBlfHxuJiZuLmd1aWQhPT1hLmd1aWR8fHMmJiFzLnRlc3QoYS5uYW1lc3BhY2UpfHxyJiZyIT09YS5zZWxlY3RvciYmKCIqKiIhPT1yfHwhYS5zZWxlY3Rvcil8fChmLnNwbGljZShvLDEpLGEuc2VsZWN0b3ImJmYuZGVsZWdhdGVDb3VudC0tLHAucmVtb3ZlJiZwLnJlbW92ZS5jYWxsKGUsYSkpO3UmJiFmLmxlbmd0aCYmKHAudGVhcmRvd24mJnAudGVhcmRvd24uY2FsbChlLGgsbS5oYW5kbGUpIT09ITF8fGIucmVtb3ZlRXZlbnQoZSxkLG0uaGFuZGxlKSxkZWxldGUgY1tkXSl9ZWxzZSBmb3IoZCBpbiBjKWIuZXZlbnQucmVtb3ZlKGUsZCt0W2xdLG4sciwhMCk7Yi5pc0VtcHR5T2JqZWN0KGMpJiYoZGVsZXRlIG0uaGFuZGxlLGIuX3JlbW92ZURhdGEoZSwiZXZlbnRzIikpfX0sdHJpZ2dlcjpmdW5jdGlvbihuLHIsaSxhKXt2YXIgcyx1LGwsYyxwLGYsZCxoPVtpfHxvXSxnPXkuY2FsbChuLCJ0eXBlIik/bi50eXBlOm4sbT15LmNhbGwobiwibmFtZXNwYWNlIik/bi5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihsPWY9aT1pfHxvLDMhPT1pLm5vZGVUeXBlJiY4IT09aS5ub2RlVHlwZSYmIW50LnRlc3QoZytiLmV2ZW50LnRyaWdnZXJlZCkmJihnLmluZGV4T2YoIi4iKT49MCYmKG09Zy5zcGxpdCgiLiIpLGc9bS5zaGlmdCgpLG0uc29ydCgpKSx1PTA+Zy5pbmRleE9mKCI6IikmJiJvbiIrZyxuPW5bYi5leHBhbmRvXT9uOm5ldyBiLkV2ZW50KGcsIm9iamVjdCI9PXR5cGVvZiBuJiZuKSxuLmlzVHJpZ2dlcj0hMCxuLm5hbWVzcGFjZT1tLmpvaW4oIi4iKSxuLm5hbWVzcGFjZV9yZT1uLm5hbWVzcGFjZT9SZWdFeHAoIihefFxcLikiK20uam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxuLnJlc3VsdD10LG4udGFyZ2V0fHwobi50YXJnZXQ9aSkscj1udWxsPT1yP1tuXTpiLm1ha2VBcnJheShyLFtuXSkscD1iLmV2ZW50LnNwZWNpYWxbZ118fHt9LGF8fCFwLnRyaWdnZXJ8fHAudHJpZ2dlci5hcHBseShpLHIpIT09ITEpKXtpZighYSYmIXAubm9CdWJibGUmJiFiLmlzV2luZG93KGkpKXtmb3IoYz1wLmRlbGVnYXRlVHlwZXx8ZyxudC50ZXN0KGMrZyl8fChsPWwucGFyZW50Tm9kZSk7bDtsPWwucGFyZW50Tm9kZSloLnB1c2gobCksZj1sO2Y9PT0oaS5vd25lckRvY3VtZW50fHxvKSYmaC5wdXNoKGYuZGVmYXVsdFZpZXd8fGYucGFyZW50V2luZG93fHxlKX1kPTA7d2hpbGUoKGw9aFtkKytdKSYmIW4uaXNQcm9wYWdhdGlvblN0b3BwZWQoKSluLnR5cGU9ZD4xP2M6cC5iaW5kVHlwZXx8ZyxzPShiLl9kYXRhKGwsImV2ZW50cyIpfHx7fSlbbi50eXBlXSYmYi5fZGF0YShsLCJoYW5kbGUiKSxzJiZzLmFwcGx5KGwscikscz11JiZsW3VdLHMmJmIuYWNjZXB0RGF0YShsKSYmcy5hcHBseSYmcy5hcHBseShsLHIpPT09ITEmJm4ucHJldmVudERlZmF1bHQoKTtpZihuLnR5cGU9ZywhKGF8fG4uaXNEZWZhdWx0UHJldmVudGVkKCl8fHAuX2RlZmF1bHQmJnAuX2RlZmF1bHQuYXBwbHkoaS5vd25lckRvY3VtZW50LHIpIT09ITF8fCJjbGljayI9PT1nJiZiLm5vZGVOYW1lKGksImEiKXx8IWIuYWNjZXB0RGF0YShpKXx8IXV8fCFpW2ddfHxiLmlzV2luZG93KGkpKSl7Zj1pW3VdLGYmJihpW3VdPW51bGwpLGIuZXZlbnQudHJpZ2dlcmVkPWc7dHJ5e2lbZ10oKX1jYXRjaCh2KXt9Yi5ldmVudC50cmlnZ2VyZWQ9dCxmJiYoaVt1XT1mKX1yZXR1cm4gbi5yZXN1bHR9fSxkaXNwYXRjaDpmdW5jdGlvbihlKXtlPWIuZXZlbnQuZml4KGUpO3ZhciBuLHIsaSxvLGEscz1bXSx1PWguY2FsbChhcmd1bWVudHMpLGw9KGIuX2RhdGEodGhpcywiZXZlbnRzIil8fHt9KVtlLnR5cGVdfHxbXSxjPWIuZXZlbnQuc3BlY2lhbFtlLnR5cGVdfHx7fTtpZih1WzBdPWUsZS5kZWxlZ2F0ZVRhcmdldD10aGlzLCFjLnByZURpc3BhdGNofHxjLnByZURpc3BhdGNoLmNhbGwodGhpcyxlKSE9PSExKXtzPWIuZXZlbnQuaGFuZGxlcnMuY2FsbCh0aGlzLGUsbCksbj0wO3doaWxlKChvPXNbbisrXSkmJiFlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpe2UuY3VycmVudFRhcmdldD1vLmVsZW0sYT0wO3doaWxlKChpPW8uaGFuZGxlcnNbYSsrXSkmJiFlLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpKCFlLm5hbWVzcGFjZV9yZXx8ZS5uYW1lc3BhY2VfcmUudGVzdChpLm5hbWVzcGFjZSkpJiYoZS5oYW5kbGVPYmo9aSxlLmRhdGE9aS5kYXRhLHI9KChiLmV2ZW50LnNwZWNpYWxbaS5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fGkuaGFuZGxlcikuYXBwbHkoby5lbGVtLHUpLHIhPT10JiYoZS5yZXN1bHQ9cik9PT0hMSYmKGUucHJldmVudERlZmF1bHQoKSxlLnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGMucG9zdERpc3BhdGNoJiZjLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsZSksZS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihlLG4pe3ZhciByLGksbyxhLHM9W10sdT1uLmRlbGVnYXRlQ291bnQsbD1lLnRhcmdldDtpZih1JiZsLm5vZGVUeXBlJiYoIWUuYnV0dG9ufHwiY2xpY2siIT09ZS50eXBlKSlmb3IoO2whPXRoaXM7bD1sLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWwubm9kZVR5cGUmJihsLmRpc2FibGVkIT09ITB8fCJjbGljayIhPT1lLnR5cGUpKXtmb3Iobz1bXSxhPTA7dT5hO2ErKylpPW5bYV0scj1pLnNlbGVjdG9yKyIgIixvW3JdPT09dCYmKG9bcl09aS5uZWVkc0NvbnRleHQ/YihyLHRoaXMpLmluZGV4KGwpPj0wOmIuZmluZChyLHRoaXMsbnVsbCxbbF0pLmxlbmd0aCksb1tyXSYmby5wdXNoKGkpO28ubGVuZ3RoJiZzLnB1c2goe2VsZW06bCxoYW5kbGVyczpvfSl9cmV0dXJuIG4ubGVuZ3RoPnUmJnMucHVzaCh7ZWxlbTp0aGlzLGhhbmRsZXJzOm4uc2xpY2UodSl9KSxzfSxmaXg6ZnVuY3Rpb24oZSl7aWYoZVtiLmV4cGFuZG9dKXJldHVybiBlO3ZhciB0LG4scixpPWUudHlwZSxhPWUscz10aGlzLmZpeEhvb2tzW2ldO3N8fCh0aGlzLmZpeEhvb2tzW2ldPXM9dHQudGVzdChpKT90aGlzLm1vdXNlSG9va3M6ZXQudGVzdChpKT90aGlzLmtleUhvb2tzOnt9KSxyPXMucHJvcHM/dGhpcy5wcm9wcy5jb25jYXQocy5wcm9wcyk6dGhpcy5wcm9wcyxlPW5ldyBiLkV2ZW50KGEpLHQ9ci5sZW5ndGg7d2hpbGUodC0tKW49clt0XSxlW25dPWFbbl07cmV0dXJuIGUudGFyZ2V0fHwoZS50YXJnZXQ9YS5zcmNFbGVtZW50fHxvKSwzPT09ZS50YXJnZXQubm9kZVR5cGUmJihlLnRhcmdldD1lLnRhcmdldC5wYXJlbnROb2RlKSxlLm1ldGFLZXk9ISFlLm1ldGFLZXkscy5maWx0ZXI/cy5maWx0ZXIoZSxhKTplfSxwcm9wczoiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbnVsbD09ZS53aGljaCYmKGUud2hpY2g9bnVsbCE9dC5jaGFyQ29kZT90LmNoYXJDb2RlOnQua2V5Q29kZSksZX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGUsbil7dmFyIHIsaSxhLHM9bi5idXR0b24sdT1uLmZyb21FbGVtZW50O3JldHVybiBudWxsPT1lLnBhZ2VYJiZudWxsIT1uLmNsaWVudFgmJihpPWUudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fG8sYT1pLmRvY3VtZW50RWxlbWVudCxyPWkuYm9keSxlLnBhZ2VYPW4uY2xpZW50WCsoYSYmYS5zY3JvbGxMZWZ0fHxyJiZyLnNjcm9sbExlZnR8fDApLShhJiZhLmNsaWVudExlZnR8fHImJnIuY2xpZW50TGVmdHx8MCksZS5wYWdlWT1uLmNsaWVudFkrKGEmJmEuc2Nyb2xsVG9wfHxyJiZyLnNjcm9sbFRvcHx8MCktKGEmJmEuY2xpZW50VG9wfHxyJiZyLmNsaWVudFRvcHx8MCkpLCFlLnJlbGF0ZWRUYXJnZXQmJnUmJihlLnJlbGF0ZWRUYXJnZXQ9dT09PWUudGFyZ2V0P24udG9FbGVtZW50OnUpLGUud2hpY2h8fHM9PT10fHwoZS53aGljaD0xJnM/MToyJnM/Mzo0JnM/MjowKSxlfX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGNsaWNrOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIGIubm9kZU5hbWUodGhpcywiaW5wdXQiKSYmImNoZWNrYm94Ij09PXRoaXMudHlwZSYmdGhpcy5jbGljaz8odGhpcy5jbGljaygpLCExKTp0fX0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzIT09by5hY3RpdmVFbGVtZW50JiZ0aGlzLmZvY3VzKXRyeXtyZXR1cm4gdGhpcy5mb2N1cygpLCExfWNhdGNoKGUpe319LGRlbGVnYXRlVHlwZToiZm9jdXNpbiJ9LGJsdXI6e3RyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcz09PW8uYWN0aXZlRWxlbWVudCYmdGhpcy5ibHVyPyh0aGlzLmJsdXIoKSwhMSk6dH0sZGVsZWdhdGVUeXBlOiJmb2N1c291dCJ9LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKGUpe2UucmVzdWx0IT09dCYmKGUub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1lLnJlc3VsdCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9Yi5leHRlbmQobmV3IGIuRXZlbnQsbix7dHlwZTplLGlzU2ltdWxhdGVkOiEwLG9yaWdpbmFsRXZlbnQ6e319KTtyP2IuZXZlbnQudHJpZ2dlcihpLG51bGwsdCk6Yi5ldmVudC5kaXNwYXRjaC5jYWxsKHQsaSksaS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmbi5wcmV2ZW50RGVmYXVsdCgpfX0sYi5yZW1vdmVFdmVudD1vLnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oZSx0LG4pe2UucmVtb3ZlRXZlbnRMaXN0ZW5lciYmZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiwhMSl9OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0ib24iK3Q7ZS5kZXRhY2hFdmVudCYmKHR5cGVvZiBlW3JdPT09aSYmKGVbcl09bnVsbCksZS5kZXRhY2hFdmVudChyLG4pKX0sYi5FdmVudD1mdW5jdGlvbihlLG4pe3JldHVybiB0aGlzIGluc3RhbmNlb2YgYi5FdmVudD8oZSYmZS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9ZSx0aGlzLnR5cGU9ZS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWUuZGVmYXVsdFByZXZlbnRlZHx8ZS5yZXR1cm5WYWx1ZT09PSExfHxlLmdldFByZXZlbnREZWZhdWx0JiZlLmdldFByZXZlbnREZWZhdWx0KCk/aXQ6b3QpOnRoaXMudHlwZT1lLG4mJmIuZXh0ZW5kKHRoaXMsbiksdGhpcy50aW1lU3RhbXA9ZSYmZS50aW1lU3RhbXB8fGIubm93KCksdGhpc1tiLmV4cGFuZG9dPSEwLHQpOm5ldyBiLkV2ZW50KGUsbil9LGIuRXZlbnQucHJvdG90eXBlPXtpc0RlZmF1bHRQcmV2ZW50ZWQ6b3QsaXNQcm9wYWdhdGlvblN0b3BwZWQ6b3QsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6b3QscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9aXQsZSYmKGUucHJldmVudERlZmF1bHQ/ZS5wcmV2ZW50RGVmYXVsdCgpOmUucmV0dXJuVmFsdWU9ITEpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1pdCxlJiYoZS5zdG9wUHJvcGFnYXRpb24mJmUuc3RvcFByb3BhZ2F0aW9uKCksZS5jYW5jZWxCdWJibGU9ITApfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPWl0LHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9fSxiLmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSxmdW5jdGlvbihlLHQpe2IuZXZlbnQuc3BlY2lhbFtlXT17ZGVsZWdhdGVUeXBlOnQsYmluZFR5cGU6dCxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIG4scj10aGlzLGk9ZS5yZWxhdGVkVGFyZ2V0LG89ZS5oYW5kbGVPYmo7CnJldHVybighaXx8aSE9PXImJiFiLmNvbnRhaW5zKHIsaSkpJiYoZS50eXBlPW8ub3JpZ1R5cGUsbj1vLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudHlwZT10KSxufX19KSxiLnN1cHBvcnQuc3VibWl0QnViYmxlc3x8KGIuZXZlbnQuc3BlY2lhbC5zdWJtaXQ9e3NldHVwOmZ1bmN0aW9uKCl7cmV0dXJuIGIubm9kZU5hbWUodGhpcywiZm9ybSIpPyExOihiLmV2ZW50LmFkZCh0aGlzLCJjbGljay5fc3VibWl0IGtleXByZXNzLl9zdWJtaXQiLGZ1bmN0aW9uKGUpe3ZhciBuPWUudGFyZ2V0LHI9Yi5ub2RlTmFtZShuLCJpbnB1dCIpfHxiLm5vZGVOYW1lKG4sImJ1dHRvbiIpP24uZm9ybTp0O3ImJiFiLl9kYXRhKHIsInN1Ym1pdEJ1YmJsZXMiKSYmKGIuZXZlbnQuYWRkKHIsInN1Ym1pdC5fc3VibWl0IixmdW5jdGlvbihlKXtlLl9zdWJtaXRfYnViYmxlPSEwfSksYi5fZGF0YShyLCJzdWJtaXRCdWJibGVzIiwhMCkpfSksdCl9LHBvc3REaXNwYXRjaDpmdW5jdGlvbihlKXtlLl9zdWJtaXRfYnViYmxlJiYoZGVsZXRlIGUuX3N1Ym1pdF9idWJibGUsdGhpcy5wYXJlbnROb2RlJiYhZS5pc1RyaWdnZXImJmIuZXZlbnQuc2ltdWxhdGUoInN1Ym1pdCIsdGhpcy5wYXJlbnROb2RlLGUsITApKX0sdGVhcmRvd246ZnVuY3Rpb24oKXtyZXR1cm4gYi5ub2RlTmFtZSh0aGlzLCJmb3JtIik/ITE6KGIuZXZlbnQucmVtb3ZlKHRoaXMsIi5fc3VibWl0IiksdCl9fSksYi5zdXBwb3J0LmNoYW5nZUJ1YmJsZXN8fChiLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBaLnRlc3QodGhpcy5ub2RlTmFtZSk/KCgiY2hlY2tib3giPT09dGhpcy50eXBlfHwicmFkaW8iPT09dGhpcy50eXBlKSYmKGIuZXZlbnQuYWRkKHRoaXMsInByb3BlcnR5Y2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGUpeyJjaGVja2VkIj09PWUub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5hbWUmJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITApfSksYi5ldmVudC5hZGQodGhpcywiY2xpY2suX2NoYW5nZSIsZnVuY3Rpb24oZSl7dGhpcy5fanVzdF9jaGFuZ2VkJiYhZS5pc1RyaWdnZXImJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITEpLGIuZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcyxlLCEwKX0pKSwhMSk6KGIuZXZlbnQuYWRkKHRoaXMsImJlZm9yZWFjdGl2YXRlLl9jaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0O1oudGVzdCh0Lm5vZGVOYW1lKSYmIWIuX2RhdGEodCwiY2hhbmdlQnViYmxlcyIpJiYoYi5ldmVudC5hZGQodCwiY2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGUpeyF0aGlzLnBhcmVudE5vZGV8fGUuaXNTaW11bGF0ZWR8fGUuaXNUcmlnZ2VyfHxiLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMucGFyZW50Tm9kZSxlLCEwKX0pLGIuX2RhdGEodCwiY2hhbmdlQnViYmxlcyIsITApKX0pLHQpfSxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIG49ZS50YXJnZXQ7cmV0dXJuIHRoaXMhPT1ufHxlLmlzU2ltdWxhdGVkfHxlLmlzVHJpZ2dlcnx8InJhZGlvIiE9PW4udHlwZSYmImNoZWNrYm94IiE9PW4udHlwZT9lLmhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0fSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBiLmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpLCFaLnRlc3QodGhpcy5ub2RlTmFtZSl9fSksYi5zdXBwb3J0LmZvY3VzaW5CdWJibGVzfHxiLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGUsdCl7dmFyIG49MCxyPWZ1bmN0aW9uKGUpe2IuZXZlbnQuc2ltdWxhdGUodCxlLnRhcmdldCxiLmV2ZW50LmZpeChlKSwhMCl9O2IuZXZlbnQuc3BlY2lhbFt0XT17c2V0dXA6ZnVuY3Rpb24oKXswPT09bisrJiZvLmFkZEV2ZW50TGlzdGVuZXIoZSxyLCEwKX0sdGVhcmRvd246ZnVuY3Rpb24oKXswPT09LS1uJiZvLnJlbW92ZUV2ZW50TGlzdGVuZXIoZSxyLCEwKX19fSksYi5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGUsbixyLGksbyl7dmFyIGEscztpZigib2JqZWN0Ij09dHlwZW9mIGUpeyJzdHJpbmciIT10eXBlb2YgbiYmKHI9cnx8bixuPXQpO2ZvcihhIGluIGUpdGhpcy5vbihhLG4scixlW2FdLG8pO3JldHVybiB0aGlzfWlmKG51bGw9PXImJm51bGw9PWk/KGk9bixyPW49dCk6bnVsbD09aSYmKCJzdHJpbmciPT10eXBlb2Ygbj8oaT1yLHI9dCk6KGk9cixyPW4sbj10KSksaT09PSExKWk9b3Q7ZWxzZSBpZighaSlyZXR1cm4gdGhpcztyZXR1cm4gMT09PW8mJihzPWksaT1mdW5jdGlvbihlKXtyZXR1cm4gYigpLm9mZihlKSxzLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0saS5ndWlkPXMuZ3VpZHx8KHMuZ3VpZD1iLmd1aWQrKykpLHRoaXMuZWFjaChmdW5jdGlvbigpe2IuZXZlbnQuYWRkKHRoaXMsZSxpLHIsbil9KX0sb25lOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLm9uKGUsdCxuLHIsMSl9LG9mZjpmdW5jdGlvbihlLG4scil7dmFyIGksbztpZihlJiZlLnByZXZlbnREZWZhdWx0JiZlLmhhbmRsZU9iailyZXR1cm4gaT1lLmhhbmRsZU9iaixiKGUuZGVsZWdhdGVUYXJnZXQpLm9mZihpLm5hbWVzcGFjZT9pLm9yaWdUeXBlKyIuIitpLm5hbWVzcGFjZTppLm9yaWdUeXBlLGkuc2VsZWN0b3IsaS5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgZSl7Zm9yKG8gaW4gZSl0aGlzLm9mZihvLG4sZVtvXSk7cmV0dXJuIHRoaXN9cmV0dXJuKG49PT0hMXx8ImZ1bmN0aW9uIj09dHlwZW9mIG4pJiYocj1uLG49dCkscj09PSExJiYocj1vdCksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yi5ldmVudC5yZW1vdmUodGhpcyxlLHIsbil9KX0sYmluZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub24oZSxudWxsLHQsbil9LHVuYmluZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm9mZihlLG51bGwsdCl9LGRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLm9uKHQsZSxuLHIpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYoZSwiKioiKTp0aGlzLm9mZih0LGV8fCIqKiIsbil9LHRyaWdnZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yi5ldmVudC50cmlnZ2VyKGUsdCx0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihlLG4pe3ZhciByPXRoaXNbMF07cmV0dXJuIHI/Yi5ldmVudC50cmlnZ2VyKGUsbixyLCEwKTp0fX0pLGZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYSxzLHUsbCxjLHAsZixkLGgsZyxtLHksdix4PSJzaXp6bGUiKy1uZXcgRGF0ZSx3PWUuZG9jdW1lbnQsVD17fSxOPTAsQz0wLGs9aXQoKSxFPWl0KCksUz1pdCgpLEE9dHlwZW9mIHQsaj0xPDwzMSxEPVtdLEw9RC5wb3AsSD1ELnB1c2gscT1ELnNsaWNlLE09RC5pbmRleE9mfHxmdW5jdGlvbihlKXt2YXIgdD0wLG49dGhpcy5sZW5ndGg7Zm9yKDtuPnQ7dCsrKWlmKHRoaXNbdF09PT1lKXJldHVybiB0O3JldHVybi0xfSxfPSJbXFx4MjBcXHRcXHJcXG5cXGZdIixGPSIoPzpcXFxcLnxbXFx3LV18W15cXHgwMC1cXHhhMF0pKyIsTz1GLnJlcGxhY2UoInciLCJ3IyIpLEI9IihbKl4kfCF+XT89KSIsUD0iXFxbIitfKyIqKCIrRisiKSIrXysiKig/OiIrQitfKyIqKD86KFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcM3woIitPKyIpfCl8KSIrXysiKlxcXSIsUj0iOigiK0YrIikoPzpcXCgoKFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcM3woKD86XFxcXC58W15cXFxcKClbXFxdXXwiK1AucmVwbGFjZSgzLDgpKyIpKil8LiopXFwpfCkiLFc9UmVnRXhwKCJeIitfKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK18rIiskIiwiZyIpLCQ9UmVnRXhwKCJeIitfKyIqLCIrXysiKiIpLEk9UmVnRXhwKCJeIitfKyIqKFtcXHgyMFxcdFxcclxcblxcZj4rfl0pIitfKyIqIiksej1SZWdFeHAoUiksWD1SZWdFeHAoIl4iK08rIiQiKSxVPXtJRDpSZWdFeHAoIl4jKCIrRisiKSIpLENMQVNTOlJlZ0V4cCgiXlxcLigiK0YrIikiKSxOQU1FOlJlZ0V4cCgiXlxcW25hbWU9WydcIl0/KCIrRisiKVsnXCJdP1xcXSIpLFRBRzpSZWdFeHAoIl4oIitGLnJlcGxhY2UoInciLCJ3KiIpKyIpIiksQVRUUjpSZWdFeHAoIl4iK1ApLFBTRVVETzpSZWdFeHAoIl4iK1IpLENISUxEOlJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIitfKyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIitfKyIqKD86KFsrLV18KSIrXysiKihcXGQrKXwpKSIrXysiKlxcKXwpIiwiaSIpLG5lZWRzQ29udGV4dDpSZWdFeHAoIl4iK18rIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrXysiKigoPzotXFxkKT9cXGQqKSIrXysiKlxcKXwpKD89W14tXXwkKSIsImkiKX0sVj0vW1x4MjBcdFxyXG5cZl0qWyt+XS8sWT0vXltee10rXHtccypcW25hdGl2ZSBjb2RlLyxKPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sRz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFE9L15oXGQkL2ksSz0vJ3xcXC9nLFo9L1w9W1x4MjBcdFxyXG5cZl0qKFteJyJcXV0qKVtceDIwXHRcclxuXGZdKlxdL2csZXQ9L1xcKFtcZGEtZkEtRl17MSw2fVtceDIwXHRcclxuXGZdP3wuKS9nLHR0PWZ1bmN0aW9uKGUsdCl7dmFyIG49IjB4Iit0LTY1NTM2O3JldHVybiBuIT09bj90OjA+bj9TdHJpbmcuZnJvbUNoYXJDb2RlKG4rNjU1MzYpOlN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8bj4+MTAsNTYzMjB8MTAyMyZuKX07dHJ5e3EuY2FsbCh3LmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzLDApWzBdLm5vZGVUeXBlfWNhdGNoKG50KXtxPWZ1bmN0aW9uKGUpe3ZhciB0LG49W107d2hpbGUodD10aGlzW2UrK10pbi5wdXNoKHQpO3JldHVybiBufX1mdW5jdGlvbiBydChlKXtyZXR1cm4gWS50ZXN0KGUrIiIpfWZ1bmN0aW9uIGl0KCl7dmFyIGUsdD1bXTtyZXR1cm4gZT1mdW5jdGlvbihuLHIpe3JldHVybiB0LnB1c2gobis9IiAiKT5pLmNhY2hlTGVuZ3RoJiZkZWxldGUgZVt0LnNoaWZ0KCldLGVbbl09cn19ZnVuY3Rpb24gb3QoZSl7cmV0dXJuIGVbeF09ITAsZX1mdW5jdGlvbiBhdChlKXt2YXIgdD1wLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RyeXtyZXR1cm4gZSh0KX1jYXRjaChuKXtyZXR1cm4hMX1maW5hbGx5e3Q9bnVsbH19ZnVuY3Rpb24gc3QoZSx0LG4scil7dmFyIGksbyxhLHMsdSxsLGYsZyxtLHY7aWYoKHQ/dC5vd25lckRvY3VtZW50fHx0OncpIT09cCYmYyh0KSx0PXR8fHAsbj1ufHxbXSwhZXx8InN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBuO2lmKDEhPT0ocz10Lm5vZGVUeXBlKSYmOSE9PXMpcmV0dXJuW107aWYoIWQmJiFyKXtpZihpPUouZXhlYyhlKSlpZihhPWlbMV0pe2lmKDk9PT1zKXtpZihvPXQuZ2V0RWxlbWVudEJ5SWQoYSksIW98fCFvLnBhcmVudE5vZGUpcmV0dXJuIG47aWYoby5pZD09PWEpcmV0dXJuIG4ucHVzaChvKSxufWVsc2UgaWYodC5vd25lckRvY3VtZW50JiYobz10Lm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSkpJiZ5KHQsbykmJm8uaWQ9PT1hKXJldHVybiBuLnB1c2gobyksbn1lbHNle2lmKGlbMl0pcmV0dXJuIEguYXBwbHkobixxLmNhbGwodC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSwwKSksbjtpZigoYT1pWzNdKSYmVC5nZXRCeUNsYXNzTmFtZSYmdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBILmFwcGx5KG4scS5jYWxsKHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhKSwwKSksbn1pZihULnFzYSYmIWgudGVzdChlKSl7aWYoZj0hMCxnPXgsbT10LHY9OT09PXMmJmUsMT09PXMmJiJvYmplY3QiIT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXtsPWZ0KGUpLChmPXQuZ2V0QXR0cmlidXRlKCJpZCIpKT9nPWYucmVwbGFjZShLLCJcXCQmIik6dC5zZXRBdHRyaWJ1dGUoImlkIixnKSxnPSJbaWQ9JyIrZysiJ10gIix1PWwubGVuZ3RoO3doaWxlKHUtLSlsW3VdPWcrZHQobFt1XSk7bT1WLnRlc3QoZSkmJnQucGFyZW50Tm9kZXx8dCx2PWwuam9pbigiLCIpfWlmKHYpdHJ5e3JldHVybiBILmFwcGx5KG4scS5jYWxsKG0ucXVlcnlTZWxlY3RvckFsbCh2KSwwKSksbn1jYXRjaChiKXt9ZmluYWxseXtmfHx0LnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiB3dChlLnJlcGxhY2UoVywiJDEiKSx0LG4scil9YT1zdC5pc1hNTD1mdW5jdGlvbihlKXt2YXIgdD1lJiYoZS5vd25lckRvY3VtZW50fHxlKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIHQ/IkhUTUwiIT09dC5ub2RlTmFtZTohMX0sYz1zdC5zZXREb2N1bWVudD1mdW5jdGlvbihlKXt2YXIgbj1lP2Uub3duZXJEb2N1bWVudHx8ZTp3O3JldHVybiBuIT09cCYmOT09PW4ubm9kZVR5cGUmJm4uZG9jdW1lbnRFbGVtZW50PyhwPW4sZj1uLmRvY3VtZW50RWxlbWVudCxkPWEobiksVC50YWdOYW1lTm9Db21tZW50cz1hdChmdW5jdGlvbihlKXtyZXR1cm4gZS5hcHBlbmRDaGlsZChuLmNyZWF0ZUNvbW1lbnQoIiIpKSwhZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLFQuYXR0cmlidXRlcz1hdChmdW5jdGlvbihlKXtlLmlubmVySFRNTD0iPHNlbGVjdD48L3NlbGVjdD4iO3ZhciB0PXR5cGVvZiBlLmxhc3RDaGlsZC5nZXRBdHRyaWJ1dGUoIm11bHRpcGxlIik7cmV0dXJuImJvb2xlYW4iIT09dCYmInN0cmluZyIhPT10fSksVC5nZXRCeUNsYXNzTmFtZT1hdChmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxkaXYgY2xhc3M9J2hpZGRlbiBlJz48L2Rpdj48ZGl2IGNsYXNzPSdoaWRkZW4nPjwvZGl2PiIsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGg/KGUubGFzdENoaWxkLmNsYXNzTmFtZT0iZSIsMj09PWUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aCk6ITF9KSxULmdldEJ5TmFtZT1hdChmdW5jdGlvbihlKXtlLmlkPXgrMCxlLmlubmVySFRNTD0iPGEgbmFtZT0nIit4KyInPjwvYT48ZGl2IG5hbWU9JyIreCsiJz48L2Rpdj4iLGYuaW5zZXJ0QmVmb3JlKGUsZi5maXJzdENoaWxkKTt2YXIgdD1uLmdldEVsZW1lbnRzQnlOYW1lJiZuLmdldEVsZW1lbnRzQnlOYW1lKHgpLmxlbmd0aD09PTIrbi5nZXRFbGVtZW50c0J5TmFtZSh4KzApLmxlbmd0aDtyZXR1cm4gVC5nZXRJZE5vdE5hbWU9IW4uZ2V0RWxlbWVudEJ5SWQoeCksZi5yZW1vdmVDaGlsZChlKSx0fSksaS5hdHRySGFuZGxlPWF0KGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsZS5maXJzdENoaWxkJiZ0eXBlb2YgZS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSE9PUEmJiIjIj09PWUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKX0pP3t9OntocmVmOmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSgiaHJlZiIsMil9LHR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlKCJ0eXBlIil9fSxULmdldElkTm90TmFtZT8oaS5maW5kLklEPWZ1bmN0aW9uKGUsdCl7aWYodHlwZW9mIHQuZ2V0RWxlbWVudEJ5SWQhPT1BJiYhZCl7dmFyIG49dC5nZXRFbGVtZW50QnlJZChlKTtyZXR1cm4gbiYmbi5wYXJlbnROb2RlP1tuXTpbXX19LGkuZmlsdGVyLklEPWZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZShldCx0dCk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSgiaWQiKT09PXR9fSk6KGkuZmluZC5JRD1mdW5jdGlvbihlLG4pe2lmKHR5cGVvZiBuLmdldEVsZW1lbnRCeUlkIT09QSYmIWQpe3ZhciByPW4uZ2V0RWxlbWVudEJ5SWQoZSk7cmV0dXJuIHI/ci5pZD09PWV8fHR5cGVvZiByLmdldEF0dHJpYnV0ZU5vZGUhPT1BJiZyLmdldEF0dHJpYnV0ZU5vZGUoImlkIikudmFsdWU9PT1lP1tyXTp0OltdfX0saS5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKGV0LHR0KTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49dHlwZW9mIGUuZ2V0QXR0cmlidXRlTm9kZSE9PUEmJmUuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gbiYmbi52YWx1ZT09PXR9fSksaS5maW5kLlRBRz1ULnRhZ05hbWVOb0NvbW1lbnRzP2Z1bmN0aW9uKGUsbil7cmV0dXJuIHR5cGVvZiBuLmdldEVsZW1lbnRzQnlUYWdOYW1lIT09QT9uLmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpOnR9OmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPTAsbz10LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpO2lmKCIqIj09PWUpe3doaWxlKG49b1tpKytdKTE9PT1uLm5vZGVUeXBlJiZyLnB1c2gobik7cmV0dXJuIHJ9cmV0dXJuIG99LGkuZmluZC5OQU1FPVQuZ2V0QnlOYW1lJiZmdW5jdGlvbihlLG4pe3JldHVybiB0eXBlb2Ygbi5nZXRFbGVtZW50c0J5TmFtZSE9PUE/bi5nZXRFbGVtZW50c0J5TmFtZShuYW1lKTp0fSxpLmZpbmQuQ0xBU1M9VC5nZXRCeUNsYXNzTmFtZSYmZnVuY3Rpb24oZSxuKXtyZXR1cm4gdHlwZW9mIG4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT09PUF8fGQ/dDpuLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZSl9LGc9W10saD1bIjpmb2N1cyJdLChULnFzYT1ydChuLnF1ZXJ5U2VsZWN0b3JBbGwpKSYmKGF0KGZ1bmN0aW9uKGUpe2UuaW5uZXJIVE1MPSI8c2VsZWN0PjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IixlLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fGgucHVzaCgiXFxbIitfKyIqKD86Y2hlY2tlZHxkaXNhYmxlZHxpc21hcHxtdWx0aXBsZXxyZWFkb25seXxzZWxlY3RlZHx2YWx1ZSkiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxoLnB1c2goIjpjaGVja2VkIil9KSxhdChmdW5jdGlvbihlKXtlLmlubmVySFRNTD0iPGlucHV0IHR5cGU9J2hpZGRlbicgaT0nJy8+IixlLnF1ZXJ5U2VsZWN0b3JBbGwoIltpXj0nJ10iKS5sZW5ndGgmJmgucHVzaCgiWypeJF09IitfKyIqKD86XCJcInwnJykiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RofHxoLnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksZS5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4IiksaC5wdXNoKCIsLio6Iil9KSksKFQubWF0Y2hlc1NlbGVjdG9yPXJ0KG09Zi5tYXRjaGVzU2VsZWN0b3J8fGYubW96TWF0Y2hlc1NlbGVjdG9yfHxmLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8Zi5vTWF0Y2hlc1NlbGVjdG9yfHxmLm1zTWF0Y2hlc1NlbGVjdG9yKSkmJmF0KGZ1bmN0aW9uKGUpe1QuZGlzY29ubmVjdGVkTWF0Y2g9bS5jYWxsKGUsImRpdiIpLG0uY2FsbChlLCJbcyE9JyddOngiKSxnLnB1c2goIiE9IixSKX0pLGg9UmVnRXhwKGguam9pbigifCIpKSxnPVJlZ0V4cChnLmpvaW4oInwiKSkseT1ydChmLmNvbnRhaW5zKXx8Zi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9mdW5jdGlvbihlLHQpe3ZhciBuPTk9PT1lLm5vZGVUeXBlP2UuZG9jdW1lbnRFbGVtZW50OmUscj10JiZ0LnBhcmVudE5vZGU7cmV0dXJuIGU9PT1yfHwhKCFyfHwxIT09ci5ub2RlVHlwZXx8IShuLmNvbnRhaW5zP24uY29udGFpbnMocik6ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmMTYmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihyKSkpfTpmdW5jdGlvbihlLHQpe2lmKHQpd2hpbGUodD10LnBhcmVudE5vZGUpaWYodD09PWUpcmV0dXJuITA7cmV0dXJuITF9LHY9Zi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9mdW5jdGlvbihlLHQpe3ZhciByO3JldHVybiBlPT09dD8odT0hMCwwKToocj10LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpKT8xJnJ8fGUucGFyZW50Tm9kZSYmMTE9PT1lLnBhcmVudE5vZGUubm9kZVR5cGU/ZT09PW58fHkodyxlKT8tMTp0PT09bnx8eSh3LHQpPzE6MDo0JnI/LTE6MTplLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uPy0xOjF9OmZ1bmN0aW9uKGUsdCl7dmFyIHIsaT0wLG89ZS5wYXJlbnROb2RlLGE9dC5wYXJlbnROb2RlLHM9W2VdLGw9W3RdO2lmKGU9PT10KXJldHVybiB1PSEwLDA7aWYoIW98fCFhKXJldHVybiBlPT09bj8tMTp0PT09bj8xOm8/LTE6YT8xOjA7aWYobz09PWEpcmV0dXJuIHV0KGUsdCk7cj1lO3doaWxlKHI9ci5wYXJlbnROb2RlKXMudW5zaGlmdChyKTtyPXQ7d2hpbGUocj1yLnBhcmVudE5vZGUpbC51bnNoaWZ0KHIpO3doaWxlKHNbaV09PT1sW2ldKWkrKztyZXR1cm4gaT91dChzW2ldLGxbaV0pOnNbaV09PT13Py0xOmxbaV09PT13PzE6MH0sdT0hMSxbMCwwXS5zb3J0KHYpLFQuZGV0ZWN0RHVwbGljYXRlcz11LHApOnB9LHN0Lm1hdGNoZXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gc3QoZSxudWxsLG51bGwsdCl9LHN0Lm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihlLHQpe2lmKChlLm93bmVyRG9jdW1lbnR8fGUpIT09cCYmYyhlKSx0PXQucmVwbGFjZShaLCI9JyQxJ10iKSwhKCFULm1hdGNoZXNTZWxlY3Rvcnx8ZHx8ZyYmZy50ZXN0KHQpfHxoLnRlc3QodCkpKXRyeXt2YXIgbj1tLmNhbGwoZSx0KTtpZihufHxULmRpc2Nvbm5lY3RlZE1hdGNofHxlLmRvY3VtZW50JiYxMSE9PWUuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIG59Y2F0Y2gocil7fXJldHVybiBzdCh0LHAsbnVsbCxbZV0pLmxlbmd0aD4wfSxzdC5jb250YWlucz1mdW5jdGlvbihlLHQpe3JldHVybihlLm93bmVyRG9jdW1lbnR8fGUpIT09cCYmYyhlKSx5KGUsdCl9LHN0LmF0dHI9ZnVuY3Rpb24oZSx0KXt2YXIgbjtyZXR1cm4oZS5vd25lckRvY3VtZW50fHxlKSE9PXAmJmMoZSksZHx8KHQ9dC50b0xvd2VyQ2FzZSgpKSwobj1pLmF0dHJIYW5kbGVbdF0pP24oZSk6ZHx8VC5hdHRyaWJ1dGVzP2UuZ2V0QXR0cmlidXRlKHQpOigobj1lLmdldEF0dHJpYnV0ZU5vZGUodCkpfHxlLmdldEF0dHJpYnV0ZSh0KSkmJmVbdF09PT0hMD90Om4mJm4uc3BlY2lmaWVkP24udmFsdWU6bnVsbH0sc3QuZXJyb3I9ZnVuY3Rpb24oZSl7dGhyb3cgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrZSl9LHN0LnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj1bXSxyPTEsaT0wO2lmKHU9IVQuZGV0ZWN0RHVwbGljYXRlcyxlLnNvcnQodiksdSl7Zm9yKDt0PWVbcl07cisrKXQ9PT1lW3ItMV0mJihpPW4ucHVzaChyKSk7d2hpbGUoaS0tKWUuc3BsaWNlKG5baV0sMSl9cmV0dXJuIGV9O2Z1bmN0aW9uIHV0KGUsdCl7dmFyIG49dCYmZSxyPW4mJih+dC5zb3VyY2VJbmRleHx8aiktKH5lLnNvdXJjZUluZGV4fHxqKTtpZihyKXJldHVybiByO2lmKG4pd2hpbGUobj1uLm5leHRTaWJsaW5nKWlmKG49PT10KXJldHVybi0xO3JldHVybiBlPzE6LTF9ZnVuY3Rpb24gbHQoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09biYmdC50eXBlPT09ZX19ZnVuY3Rpb24gY3QoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oImlucHV0Ij09PW58fCJidXR0b24iPT09bikmJnQudHlwZT09PWV9fWZ1bmN0aW9uIHB0KGUpe3JldHVybiBvdChmdW5jdGlvbih0KXtyZXR1cm4gdD0rdCxvdChmdW5jdGlvbihuLHIpe3ZhciBpLG89ZShbXSxuLmxlbmd0aCx0KSxhPW8ubGVuZ3RoO3doaWxlKGEtLSluW2k9b1thXV0mJihuW2ldPSEocltpXT1uW2ldKSl9KX0pfW89c3QuZ2V0VGV4dD1mdW5jdGlvbihlKXt2YXIgdCxuPSIiLHI9MCxpPWUubm9kZVR5cGU7aWYoaSl7aWYoMT09PWl8fDk9PT1pfHwxMT09PWkpe2lmKCJzdHJpbmciPT10eXBlb2YgZS50ZXh0Q29udGVudClyZXR1cm4gZS50ZXh0Q29udGVudDtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpbis9byhlKX1lbHNlIGlmKDM9PT1pfHw0PT09aSlyZXR1cm4gZS5ub2RlVmFsdWV9ZWxzZSBmb3IoO3Q9ZVtyXTtyKyspbis9byh0KTtyZXR1cm4gbn0saT1zdC5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpvdCxtYXRjaDpVLGZpbmQ6e30scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS5yZXBsYWNlKGV0LHR0KSxlWzNdPShlWzRdfHxlWzVdfHwiIikucmVwbGFjZShldCx0dCksIn49Ij09PWVbMl0mJihlWzNdPSIgIitlWzNdKyIgIiksZS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT1lWzFdLnNsaWNlKDAsMyk/KGVbM118fHN0LmVycm9yKGVbMF0pLGVbNF09KyhlWzRdP2VbNV0rKGVbNl18fDEpOjIqKCJldmVuIj09PWVbM118fCJvZGQiPT09ZVszXSkpLGVbNV09KyhlWzddK2VbOF18fCJvZGQiPT09ZVszXSkpOmVbM10mJnN0LmVycm9yKGVbMF0pLGV9LFBTRVVETzpmdW5jdGlvbihlKXt2YXIgdCxuPSFlWzVdJiZlWzJdO3JldHVybiBVLkNISUxELnRlc3QoZVswXSk/bnVsbDooZVs0XT9lWzJdPWVbNF06biYmei50ZXN0KG4pJiYodD1mdChuLCEwKSkmJih0PW4uaW5kZXhPZigiKSIsbi5sZW5ndGgtdCktbi5sZW5ndGgpJiYoZVswXT1lWzBdLnNsaWNlKDAsdCksZVsyXT1uLnNsaWNlKDAsdCkpLGUuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihlKXtyZXR1cm4iKiI9PT1lP2Z1bmN0aW9uKCl7cmV0dXJuITB9OihlPWUucmVwbGFjZShldCx0dCkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbih0KXtyZXR1cm4gdC5ub2RlTmFtZSYmdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ZX0pfSxDTEFTUzpmdW5jdGlvbihlKXt2YXIgdD1rW2UrIiAiXTtyZXR1cm4gdHx8KHQ9UmVnRXhwKCIoXnwiK18rIikiK2UrIigiK18rInwkKSIpKSYmayhlLGZ1bmN0aW9uKGUpe3JldHVybiB0LnRlc3QoZS5jbGFzc05hbWV8fHR5cGVvZiBlLmdldEF0dHJpYnV0ZSE9PUEmJmUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKHIpe3ZhciBpPXN0LmF0dHIocixlKTtyZXR1cm4gbnVsbD09aT8iIT0iPT09dDp0PyhpKz0iIiwiPSI9PT10P2k9PT1uOiIhPSI9PT10P2khPT1uOiJePSI9PT10P24mJjA9PT1pLmluZGV4T2Yobik6Iio9Ij09PXQ/biYmaS5pbmRleE9mKG4pPi0xOiIkPSI9PT10P24mJmkuc2xpY2UoLW4ubGVuZ3RoKT09PW46In49Ij09PXQ/KCIgIitpKyIgIikuaW5kZXhPZihuKT4tMToifD0iPT09dD9pPT09bnx8aS5zbGljZSgwLG4ubGVuZ3RoKzEpPT09bisiLSI6ITEpOiEwfX0sQ0hJTEQ6ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbz0ibnRoIiE9PWUuc2xpY2UoMCwzKSxhPSJsYXN0IiE9PWUuc2xpY2UoLTQpLHM9Im9mLXR5cGUiPT09dDtyZXR1cm4gMT09PXImJjA9PT1pP2Z1bmN0aW9uKGUpe3JldHVybiEhZS5wYXJlbnROb2RlfTpmdW5jdGlvbih0LG4sdSl7dmFyIGwsYyxwLGYsZCxoLGc9byE9PWE/Im5leHRTaWJsaW5nIjoicHJldmlvdXNTaWJsaW5nIixtPXQucGFyZW50Tm9kZSx5PXMmJnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSx2PSF1JiYhcztpZihtKXtpZihvKXt3aGlsZShnKXtwPXQ7d2hpbGUocD1wW2ddKWlmKHM/cC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09eToxPT09cC5ub2RlVHlwZSlyZXR1cm4hMTtoPWc9Im9ubHkiPT09ZSYmIWgmJiJuZXh0U2libGluZyJ9cmV0dXJuITB9aWYoaD1bYT9tLmZpcnN0Q2hpbGQ6bS5sYXN0Q2hpbGRdLGEmJnYpe2M9bVt4XXx8KG1beF09e30pLGw9Y1tlXXx8W10sZD1sWzBdPT09TiYmbFsxXSxmPWxbMF09PT1OJiZsWzJdLHA9ZCYmbS5jaGlsZE5vZGVzW2RdO3doaWxlKHA9KytkJiZwJiZwW2ddfHwoZj1kPTApfHxoLnBvcCgpKWlmKDE9PT1wLm5vZGVUeXBlJiYrK2YmJnA9PT10KXtjW2VdPVtOLGQsZl07YnJlYWt9fWVsc2UgaWYodiYmKGw9KHRbeF18fCh0W3hdPXt9KSlbZV0pJiZsWzBdPT09TilmPWxbMV07ZWxzZSB3aGlsZShwPSsrZCYmcCYmcFtnXXx8KGY9ZD0wKXx8aC5wb3AoKSlpZigocz9wLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT15OjE9PT1wLm5vZGVUeXBlKSYmKytmJiYodiYmKChwW3hdfHwocFt4XT17fSkpW2VdPVtOLGZdKSxwPT09dCkpYnJlYWs7cmV0dXJuIGYtPWksZj09PXJ8fDA9PT1mJXImJmYvcj49MH19fSxQU0VVRE86ZnVuY3Rpb24oZSx0KXt2YXIgbixyPWkucHNldWRvc1tlXXx8aS5zZXRGaWx0ZXJzW2UudG9Mb3dlckNhc2UoKV18fHN0LmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrZSk7cmV0dXJuIHJbeF0/cih0KTpyLmxlbmd0aD4xPyhuPVtlLGUsIiIsdF0saS5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/b3QoZnVuY3Rpb24oZSxuKXt2YXIgaSxvPXIoZSx0KSxhPW8ubGVuZ3RoO3doaWxlKGEtLSlpPU0uY2FsbChlLG9bYV0pLGVbaV09IShuW2ldPW9bYV0pfSk6ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZSwwLG4pfSk6cn19LHBzZXVkb3M6e25vdDpvdChmdW5jdGlvbihlKXt2YXIgdD1bXSxuPVtdLHI9cyhlLnJlcGxhY2UoVywiJDEiKSk7cmV0dXJuIHJbeF0/b3QoZnVuY3Rpb24oZSx0LG4saSl7dmFyIG8sYT1yKGUsbnVsbCxpLFtdKSxzPWUubGVuZ3RoO3doaWxlKHMtLSkobz1hW3NdKSYmKGVbc109ISh0W3NdPW8pKX0pOmZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gdFswXT1lLHIodCxudWxsLG8sbiksIW4ucG9wKCl9fSksaGFzOm90KGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gc3QoZSx0KS5sZW5ndGg+MH19KSxjb250YWluczpvdChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuKHQudGV4dENvbnRlbnR8fHQuaW5uZXJUZXh0fHxvKHQpKS5pbmRleE9mKGUpPi0xfX0pLGxhbmc6b3QoZnVuY3Rpb24oZSl7cmV0dXJuIFgudGVzdChlfHwiIil8fHN0LmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK2UpLGU9ZS5yZXBsYWNlKGV0LHR0KS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKHQpe3ZhciBuO2RvIGlmKG49ZD90LmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8dC5nZXRBdHRyaWJ1dGUoImxhbmciKTp0LmxhbmcpcmV0dXJuIG49bi50b0xvd2VyQ2FzZSgpLG49PT1lfHwwPT09bi5pbmRleE9mKGUrIi0iKTt3aGlsZSgodD10LnBhcmVudE5vZGUpJiYxPT09dC5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKHQpe3ZhciBuPWUubG9jYXRpb24mJmUubG9jYXRpb24uaGFzaDtyZXR1cm4gbiYmbi5zbGljZSgxKT09PXQuaWR9LHJvb3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1mfSxmb2N1czpmdW5jdGlvbihlKXtyZXR1cm4gZT09PXAuYWN0aXZlRWxlbWVudCYmKCFwLmhhc0ZvY3VzfHxwLmhhc0ZvY3VzKCkpJiYhIShlLnR5cGV8fGUuaHJlZnx8fmUudGFiSW5kZXgpfSxlbmFibGVkOmZ1bmN0aW9uKGUpe3JldHVybiBlLmRpc2FibGVkPT09ITF9LGRpc2FibGVkOmZ1bmN0aW9uKGUpe3JldHVybiBlLmRpc2FibGVkPT09ITB9LGNoZWNrZWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT10JiYhIWUuY2hlY2tlZHx8Im9wdGlvbiI9PT10JiYhIWUuc2VsZWN0ZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKGUpe3JldHVybiBlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LGUuc2VsZWN0ZWQ9PT0hMH0sZW1wdHk6ZnVuY3Rpb24oZSl7Zm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKWlmKGUubm9kZU5hbWU+IkAifHwzPT09ZS5ub2RlVHlwZXx8ND09PWUubm9kZVR5cGUpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbihlKXtyZXR1cm4haS5wc2V1ZG9zLmVtcHR5KGUpfSxoZWFkZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIFEudGVzdChlLm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIEcudGVzdChlLm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09dCYmImJ1dHRvbiI9PT1lLnR5cGV8fCJidXR0b24iPT09dH0sdGV4dDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4iaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT1lLnR5cGUmJihudWxsPT0odD1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8dC50b0xvd2VyQ2FzZSgpPT09ZS50eXBlKX0sZmlyc3Q6cHQoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0OnB0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuW3QtMV19KSxlcTpwdChmdW5jdGlvbihlLHQsbil7cmV0dXJuWzA+bj9uK3Q6bl19KSxldmVuOnB0KGZ1bmN0aW9uKGUsdCl7dmFyIG49MDtmb3IoO3Q+bjtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLG9kZDpwdChmdW5jdGlvbihlLHQpe3ZhciBuPTE7Zm9yKDt0Pm47bis9MillLnB1c2gobik7cmV0dXJuIGV9KSxsdDpwdChmdW5jdGlvbihlLHQsbil7dmFyIHI9MD5uP24rdDpuO2Zvcig7LS1yPj0wOyllLnB1c2gocik7cmV0dXJuIGV9KSxndDpwdChmdW5jdGlvbihlLHQsbil7dmFyIHI9MD5uP24rdDpuO2Zvcig7dD4rK3I7KWUucHVzaChyKTtyZXR1cm4gZX0pfX07Zm9yKG4gaW57cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0paS5wc2V1ZG9zW25dPWx0KG4pO2ZvcihuIGlue3N1Ym1pdDohMCxyZXNldDohMH0paS5wc2V1ZG9zW25dPWN0KG4pO2Z1bmN0aW9uIGZ0KGUsdCl7dmFyIG4scixvLGEscyx1LGwsYz1FW2UrIiAiXTtpZihjKXJldHVybiB0PzA6Yy5zbGljZSgwKTtzPWUsdT1bXSxsPWkucHJlRmlsdGVyO3doaWxlKHMpeyghbnx8KHI9JC5leGVjKHMpKSkmJihyJiYocz1zLnNsaWNlKHJbMF0ubGVuZ3RoKXx8cyksdS5wdXNoKG89W10pKSxuPSExLChyPUkuZXhlYyhzKSkmJihuPXIuc2hpZnQoKSxvLnB1c2goe3ZhbHVlOm4sdHlwZTpyWzBdLnJlcGxhY2UoVywiICIpfSkscz1zLnNsaWNlKG4ubGVuZ3RoKSk7Zm9yKGEgaW4gaS5maWx0ZXIpIShyPVVbYV0uZXhlYyhzKSl8fGxbYV0mJiEocj1sW2FdKHIpKXx8KG49ci5zaGlmdCgpLG8ucHVzaCh7dmFsdWU6bix0eXBlOmEsbWF0Y2hlczpyfSkscz1zLnNsaWNlKG4ubGVuZ3RoKSk7aWYoIW4pYnJlYWt9cmV0dXJuIHQ/cy5sZW5ndGg6cz9zdC5lcnJvcihlKTpFKGUsdSkuc2xpY2UoMCl9ZnVuY3Rpb24gZHQoZSl7dmFyIHQ9MCxuPWUubGVuZ3RoLHI9IiI7Zm9yKDtuPnQ7dCsrKXIrPWVbdF0udmFsdWU7cmV0dXJuIHJ9ZnVuY3Rpb24gaHQoZSx0LG4pe3ZhciBpPXQuZGlyLG89biYmInBhcmVudE5vZGUiPT09aSxhPUMrKztyZXR1cm4gdC5maXJzdD9mdW5jdGlvbih0LG4scil7d2hpbGUodD10W2ldKWlmKDE9PT10Lm5vZGVUeXBlfHxvKXJldHVybiBlKHQsbixyKX06ZnVuY3Rpb24odCxuLHMpe3ZhciB1LGwsYyxwPU4rIiAiK2E7aWYocyl7d2hpbGUodD10W2ldKWlmKCgxPT09dC5ub2RlVHlwZXx8bykmJmUodCxuLHMpKXJldHVybiEwfWVsc2Ugd2hpbGUodD10W2ldKWlmKDE9PT10Lm5vZGVUeXBlfHxvKWlmKGM9dFt4XXx8KHRbeF09e30pLChsPWNbaV0pJiZsWzBdPT09cCl7aWYoKHU9bFsxXSk9PT0hMHx8dT09PXIpcmV0dXJuIHU9PT0hMH1lbHNlIGlmKGw9Y1tpXT1bcF0sbFsxXT1lKHQsbixzKXx8cixsWzFdPT09ITApcmV0dXJuITB9fWZ1bmN0aW9uIGd0KGUpe3JldHVybiBlLmxlbmd0aD4xP2Z1bmN0aW9uKHQsbixyKXt2YXIgaT1lLmxlbmd0aDt3aGlsZShpLS0paWYoIWVbaV0odCxuLHIpKXJldHVybiExO3JldHVybiEwfTplWzBdfWZ1bmN0aW9uIG10KGUsdCxuLHIsaSl7dmFyIG8sYT1bXSxzPTAsdT1lLmxlbmd0aCxsPW51bGwhPXQ7Zm9yKDt1PnM7cysrKShvPWVbc10pJiYoIW58fG4obyxyLGkpKSYmKGEucHVzaChvKSxsJiZ0LnB1c2gocykpO3JldHVybiBhfWZ1bmN0aW9uIHl0KGUsdCxuLHIsaSxvKXtyZXR1cm4gciYmIXJbeF0mJihyPXl0KHIpKSxpJiYhaVt4XSYmKGk9eXQoaSxvKSksb3QoZnVuY3Rpb24obyxhLHMsdSl7dmFyIGwsYyxwLGY9W10sZD1bXSxoPWEubGVuZ3RoLGc9b3x8eHQodHx8IioiLHMubm9kZVR5cGU/W3NdOnMsW10pLG09IWV8fCFvJiZ0P2c6bXQoZyxmLGUscyx1KSx5PW4/aXx8KG8/ZTpofHxyKT9bXTphOm07aWYobiYmbihtLHkscyx1KSxyKXtsPW10KHksZCkscihsLFtdLHMsdSksYz1sLmxlbmd0aDt3aGlsZShjLS0pKHA9bFtjXSkmJih5W2RbY11dPSEobVtkW2NdXT1wKSl9aWYobyl7aWYoaXx8ZSl7aWYoaSl7bD1bXSxjPXkubGVuZ3RoO3doaWxlKGMtLSkocD15W2NdKSYmbC5wdXNoKG1bY109cCk7aShudWxsLHk9W10sbCx1KX1jPXkubGVuZ3RoO3doaWxlKGMtLSkocD15W2NdKSYmKGw9aT9NLmNhbGwobyxwKTpmW2NdKT4tMSYmKG9bbF09IShhW2xdPXApKX19ZWxzZSB5PW10KHk9PT1hP3kuc3BsaWNlKGgseS5sZW5ndGgpOnkpLGk/aShudWxsLGEseSx1KTpILmFwcGx5KGEseSl9KX1mdW5jdGlvbiB2dChlKXt2YXIgdCxuLHIsbz1lLmxlbmd0aCxhPWkucmVsYXRpdmVbZVswXS50eXBlXSxzPWF8fGkucmVsYXRpdmVbIiAiXSx1PWE/MTowLGM9aHQoZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10fSxzLCEwKSxwPWh0KGZ1bmN0aW9uKGUpe3JldHVybiBNLmNhbGwodCxlKT4tMX0scywhMCksZj1bZnVuY3Rpb24oZSxuLHIpe3JldHVybiFhJiYocnx8biE9PWwpfHwoKHQ9bikubm9kZVR5cGU/YyhlLG4scik6cChlLG4scikpfV07Zm9yKDtvPnU7dSsrKWlmKG49aS5yZWxhdGl2ZVtlW3VdLnR5cGVdKWY9W2h0KGd0KGYpLG4pXTtlbHNle2lmKG49aS5maWx0ZXJbZVt1XS50eXBlXS5hcHBseShudWxsLGVbdV0ubWF0Y2hlcyksblt4XSl7Zm9yKHI9Kyt1O28+cjtyKyspaWYoaS5yZWxhdGl2ZVtlW3JdLnR5cGVdKWJyZWFrO3JldHVybiB5dCh1PjEmJmd0KGYpLHU+MSYmZHQoZS5zbGljZSgwLHUtMSkpLnJlcGxhY2UoVywiJDEiKSxuLHI+dSYmdnQoZS5zbGljZSh1LHIpKSxvPnImJnZ0KGU9ZS5zbGljZShyKSksbz5yJiZkdChlKSl9Zi5wdXNoKG4pfXJldHVybiBndChmKX1mdW5jdGlvbiBidChlLHQpe3ZhciBuPTAsbz10Lmxlbmd0aD4wLGE9ZS5sZW5ndGg+MCxzPWZ1bmN0aW9uKHMsdSxjLGYsZCl7dmFyIGgsZyxtLHk9W10sdj0wLGI9IjAiLHg9cyYmW10sdz1udWxsIT1kLFQ9bCxDPXN8fGEmJmkuZmluZC5UQUcoIioiLGQmJnUucGFyZW50Tm9kZXx8dSksaz1OKz1udWxsPT1UPzE6TWF0aC5yYW5kb20oKXx8LjE7Zm9yKHcmJihsPXUhPT1wJiZ1LHI9bik7bnVsbCE9KGg9Q1tiXSk7YisrKXtpZihhJiZoKXtnPTA7d2hpbGUobT1lW2crK10paWYobShoLHUsYykpe2YucHVzaChoKTticmVha313JiYoTj1rLHI9KytuKX1vJiYoKGg9IW0mJmgpJiZ2LS0scyYmeC5wdXNoKGgpKX1pZih2Kz1iLG8mJmIhPT12KXtnPTA7d2hpbGUobT10W2crK10pbSh4LHksdSxjKTtpZihzKXtpZih2PjApd2hpbGUoYi0tKXhbYl18fHlbYl18fCh5W2JdPUwuY2FsbChmKSk7eT1tdCh5KX1ILmFwcGx5KGYseSksdyYmIXMmJnkubGVuZ3RoPjAmJnYrdC5sZW5ndGg+MSYmc3QudW5pcXVlU29ydChmKX1yZXR1cm4gdyYmKE49ayxsPVQpLHh9O3JldHVybiBvP290KHMpOnN9cz1zdC5jb21waWxlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPVtdLG89U1tlKyIgIl07aWYoIW8pe3R8fCh0PWZ0KGUpKSxuPXQubGVuZ3RoO3doaWxlKG4tLSlvPXZ0KHRbbl0pLG9beF0/ci5wdXNoKG8pOmkucHVzaChvKTtvPVMoZSxidChpLHIpKX1yZXR1cm4gb307ZnVuY3Rpb24geHQoZSx0LG4pe3ZhciByPTAsaT10Lmxlbmd0aDtmb3IoO2k+cjtyKyspc3QoZSx0W3JdLG4pO3JldHVybiBufWZ1bmN0aW9uIHd0KGUsdCxuLHIpe3ZhciBvLGEsdSxsLGMscD1mdChlKTtpZighciYmMT09PXAubGVuZ3RoKXtpZihhPXBbMF09cFswXS5zbGljZSgwKSxhLmxlbmd0aD4yJiYiSUQiPT09KHU9YVswXSkudHlwZSYmOT09PXQubm9kZVR5cGUmJiFkJiZpLnJlbGF0aXZlW2FbMV0udHlwZV0pe2lmKHQ9aS5maW5kLklEKHUubWF0Y2hlc1swXS5yZXBsYWNlKGV0LHR0KSx0KVswXSwhdClyZXR1cm4gbjtlPWUuc2xpY2UoYS5zaGlmdCgpLnZhbHVlLmxlbmd0aCl9bz1VLm5lZWRzQ29udGV4dC50ZXN0KGUpPzA6YS5sZW5ndGg7d2hpbGUoby0tKXtpZih1PWFbb10saS5yZWxhdGl2ZVtsPXUudHlwZV0pYnJlYWs7aWYoKGM9aS5maW5kW2xdKSYmKHI9Yyh1Lm1hdGNoZXNbMF0ucmVwbGFjZShldCx0dCksVi50ZXN0KGFbMF0udHlwZSkmJnQucGFyZW50Tm9kZXx8dCkpKXtpZihhLnNwbGljZShvLDEpLGU9ci5sZW5ndGgmJmR0KGEpLCFlKXJldHVybiBILmFwcGx5KG4scS5jYWxsKHIsMCkpLG47YnJlYWt9fX1yZXR1cm4gcyhlLHApKHIsdCxkLG4sVi50ZXN0KGUpKSxufWkucHNldWRvcy5udGg9aS5wc2V1ZG9zLmVxO2Z1bmN0aW9uIFR0KCl7fWkuZmlsdGVycz1UdC5wcm90b3R5cGU9aS5wc2V1ZG9zLGkuc2V0RmlsdGVycz1uZXcgVHQsYygpLHN0LmF0dHI9Yi5hdHRyLGIuZmluZD1zdCxiLmV4cHI9c3Quc2VsZWN0b3JzLGIuZXhwclsiOiJdPWIuZXhwci5wc2V1ZG9zLGIudW5pcXVlPXN0LnVuaXF1ZVNvcnQsYi50ZXh0PXN0LmdldFRleHQsYi5pc1hNTERvYz1zdC5pc1hNTCxiLmNvbnRhaW5zPXN0LmNvbnRhaW5zfShlKTt2YXIgYXQ9L1VudGlsJC8sc3Q9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sdXQ9L14uW146I1xbXC4sXSokLyxsdD1iLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LGN0PXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2IuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpPXRoaXMubGVuZ3RoO2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gcj10aGlzLHRoaXMucHVzaFN0YWNrKGIoZSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHQ9MDtpPnQ7dCsrKWlmKGIuY29udGFpbnMoclt0XSx0aGlzKSlyZXR1cm4hMH0pKTtmb3Iobj1bXSx0PTA7aT50O3QrKyliLmZpbmQoZSx0aGlzW3RdLG4pO3JldHVybiBuPXRoaXMucHVzaFN0YWNrKGk+MT9iLnVuaXF1ZShuKTpuKSxuLnNlbGVjdG9yPSh0aGlzLnNlbGVjdG9yP3RoaXMuc2VsZWN0b3IrIiAiOiIiKStlLG59LGhhczpmdW5jdGlvbihlKXt2YXIgdCxuPWIoZSx0aGlzKSxyPW4ubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih0PTA7cj50O3QrKylpZihiLmNvbnRhaW5zKHRoaXMsblt0XSkpcmV0dXJuITB9KX0sbm90OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhmdCh0aGlzLGUsITEpKX0sZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhmdCh0aGlzLGUsITApKX0saXM6ZnVuY3Rpb24oZSl7cmV0dXJuISFlJiYoInN0cmluZyI9PXR5cGVvZiBlP2x0LnRlc3QoZSk/YihlLHRoaXMuY29udGV4dCkuaW5kZXgodGhpc1swXSk+PTA6Yi5maWx0ZXIoZSx0aGlzKS5sZW5ndGg+MDp0aGlzLmZpbHRlcihlKS5sZW5ndGg+MCl9LGNsb3Nlc3Q6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTAsaT10aGlzLmxlbmd0aCxvPVtdLGE9bHQudGVzdChlKXx8InN0cmluZyIhPXR5cGVvZiBlP2IoZSx0fHx0aGlzLmNvbnRleHQpOjA7Zm9yKDtpPnI7cisrKXtuPXRoaXNbcl07d2hpbGUobiYmbi5vd25lckRvY3VtZW50JiZuIT09dCYmMTEhPT1uLm5vZGVUeXBlKXtpZihhP2EuaW5kZXgobik+LTE6Yi5maW5kLm1hdGNoZXNTZWxlY3RvcihuLGUpKXtvLnB1c2gobik7YnJlYWt9bj1uLnBhcmVudE5vZGV9fXJldHVybiB0aGlzLnB1c2hTdGFjayhvLmxlbmd0aD4xP2IudW5pcXVlKG8pOm8pfSxpbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gZT8ic3RyaW5nIj09dHlwZW9mIGU/Yi5pbkFycmF5KHRoaXNbMF0sYihlKSk6Yi5pbkFycmF5KGUuanF1ZXJ5P2VbMF06ZSx0aGlzKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihlLHQpe3ZhciBuPSJzdHJpbmciPT10eXBlb2YgZT9iKGUsdCk6Yi5tYWtlQXJyYXkoZSYmZS5ub2RlVHlwZT9bZV06ZSkscj1iLm1lcmdlKHRoaXMuZ2V0KCksbik7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGIudW5pcXVlKHIpKX0sYWRkQmFjazpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09ZT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSl9fSksYi5mbi5hbmRTZWxmPWIuZm4uYWRkQmFjaztmdW5jdGlvbiBwdChlLHQpe2RvIGU9ZVt0XTt3aGlsZShlJiYxIT09ZS5ub2RlVHlwZSk7cmV0dXJuIGV9Yi5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiYxMSE9PXQubm9kZVR5cGU/dDpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiBiLmRpcihlLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGIuZGlyKGUsInBhcmVudE5vZGUiLG4pfSxuZXh0OmZ1bmN0aW9uKGUpe3JldHVybiBwdChlLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGUpe3JldHVybiBwdChlLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihlKXtyZXR1cm4gYi5kaXIoZSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihlKXtyZXR1cm4gYi5kaXIoZSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGIuZGlyKGUsIm5leHRTaWJsaW5nIixuKX0scHJldlVudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gYi5kaXIoZSwicHJldmlvdXNTaWJsaW5nIixuKX0sc2libGluZ3M6ZnVuY3Rpb24oZSl7cmV0dXJuIGIuc2libGluZygoZS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxlKX0sY2hpbGRyZW46ZnVuY3Rpb24oZSl7cmV0dXJuIGIuc2libGluZyhlLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihlKXtyZXR1cm4gYi5ub2RlTmFtZShlLCJpZnJhbWUiKT9lLmNvbnRlbnREb2N1bWVudHx8ZS5jb250ZW50V2luZG93LmRvY3VtZW50OmIubWVyZ2UoW10sZS5jaGlsZE5vZGVzKX19LGZ1bmN0aW9uKGUsdCl7Yi5mbltlXT1mdW5jdGlvbihuLHIpe3ZhciBpPWIubWFwKHRoaXMsdCxuKTtyZXR1cm4gYXQudGVzdChlKXx8KHI9biksciYmInN0cmluZyI9PXR5cGVvZiByJiYoaT1iLmZpbHRlcihyLGkpKSxpPXRoaXMubGVuZ3RoPjEmJiFjdFtlXT9iLnVuaXF1ZShpKTppLHRoaXMubGVuZ3RoPjEmJnN0LnRlc3QoZSkmJihpPWkucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhpKX19KSxiLmV4dGVuZCh7ZmlsdGVyOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbiYmKGU9Ijpub3QoIitlKyIpIiksMT09PXQubGVuZ3RoP2IuZmluZC5tYXRjaGVzU2VsZWN0b3IodFswXSxlKT9bdFswXV06W106Yi5maW5kLm1hdGNoZXMoZSx0KX0sZGlyOmZ1bmN0aW9uKGUsbixyKXt2YXIgaT1bXSxvPWVbbl07d2hpbGUobyYmOSE9PW8ubm9kZVR5cGUmJihyPT09dHx8MSE9PW8ubm9kZVR5cGV8fCFiKG8pLmlzKHIpKSkxPT09by5ub2RlVHlwZSYmaS5wdXNoKG8pLG89b1tuXTtyZXR1cm4gaX0sc2libGluZzpmdW5jdGlvbihlLHQpe3ZhciBuPVtdO2Zvcig7ZTtlPWUubmV4dFNpYmxpbmcpMT09PWUubm9kZVR5cGUmJmUhPT10JiZuLnB1c2goZSk7cmV0dXJuIG59fSk7ZnVuY3Rpb24gZnQoZSx0LG4pe2lmKHQ9dHx8MCxiLmlzRnVuY3Rpb24odCkpcmV0dXJuIGIuZ3JlcChlLGZ1bmN0aW9uKGUscil7dmFyIGk9ISF0LmNhbGwoZSxyLGUpO3JldHVybiBpPT09bn0pO2lmKHQubm9kZVR5cGUpcmV0dXJuIGIuZ3JlcChlLGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dD09PW59KTtpZigic3RyaW5nIj09dHlwZW9mIHQpe3ZhciByPWIuZ3JlcChlLGZ1bmN0aW9uKGUpe3JldHVybiAxPT09ZS5ub2RlVHlwZX0pO2lmKHV0LnRlc3QodCkpcmV0dXJuIGIuZmlsdGVyKHQsciwhbik7dD1iLmZpbHRlcih0LHIpfXJldHVybiBiLmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4gYi5pbkFycmF5KGUsdCk+PTA9PT1ufSl9ZnVuY3Rpb24gZHQoZSl7dmFyIHQ9aHQuc3BsaXQoInwiKSxuPWUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2lmKG4uY3JlYXRlRWxlbWVudCl3aGlsZSh0Lmxlbmd0aCluLmNyZWF0ZUVsZW1lbnQodC5wb3AoKSk7cmV0dXJuIG59dmFyIGh0PSJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98YmRpfGNhbnZhc3xkYXRhfGRhdGFsaXN0fGRldGFpbHN8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfGhlYWRlcnxoZ3JvdXB8bWFya3xtZXRlcnxuYXZ8b3V0cHV0fHByb2dyZXNzfHNlY3Rpb258c3VtbWFyeXx0aW1lfHZpZGVvIixndD0vIGpRdWVyeVxkKz0iKD86bnVsbHxcZCspIi9nLG10PVJlZ0V4cCgiPCg/OiIraHQrIilbXFxzLz5dIiwiaSIpLHl0PS9eXHMrLyx2dD0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2dpLGJ0PS88KFtcdzpdKykvLHh0PS88dGJvZHkvaSx3dD0vPHwmIz9cdys7LyxUdD0vPCg/OnNjcmlwdHxzdHlsZXxsaW5rKS9pLE50PS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pLEN0PS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLGt0PS9eJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSxFdD0vXnRydWVcLyguKikvLFN0PS9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZyxBdD17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLHBhcmFtOlsxLCI8b2JqZWN0PiIsIjwvb2JqZWN0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6Yi5zdXBwb3J0Lmh0bWxTZXJpYWxpemU/WzAsIiIsIiJdOlsxLCJYPGRpdj4iLCI8L2Rpdj4iXX0sanQ9ZHQobyksRHQ9anQuYXBwZW5kQ2hpbGQoby5jcmVhdGVFbGVtZW50KCJkaXYiKSk7QXQub3B0Z3JvdXA9QXQub3B0aW9uLEF0LnRib2R5PUF0LnRmb290PUF0LmNvbGdyb3VwPUF0LmNhcHRpb249QXQudGhlYWQsQXQudGg9QXQudGQsYi5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGIuYWNjZXNzKHRoaXMsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10P2IudGV4dCh0aGlzKTp0aGlzLmVtcHR5KCkuYXBwZW5kKCh0aGlzWzBdJiZ0aGlzWzBdLm93bmVyRG9jdW1lbnR8fG8pLmNyZWF0ZVRleHROb2RlKGUpKX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSx3cmFwQWxsOmZ1bmN0aW9uKGUpe2lmKGIuaXNGdW5jdGlvbihlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe2IodGhpcykud3JhcEFsbChlLmNhbGwodGhpcyx0KSl9KTtpZih0aGlzWzBdKXt2YXIgdD1iKGUsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCk7dGhpc1swXS5wYXJlbnROb2RlJiZ0Lmluc2VydEJlZm9yZSh0aGlzWzBdKSx0Lm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXM7d2hpbGUoZS5maXJzdENoaWxkJiYxPT09ZS5maXJzdENoaWxkLm5vZGVUeXBlKWU9ZS5maXJzdENoaWxkO3JldHVybiBlfSkuYXBwZW5kKHRoaXMpfXJldHVybiB0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGIuaXNGdW5jdGlvbihlKT90aGlzLmVhY2goZnVuY3Rpb24odCl7Yih0aGlzKS53cmFwSW5uZXIoZS5jYWxsKHRoaXMsdCkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9Yih0aGlzKSxuPXQuY29udGVudHMoKTtuLmxlbmd0aD9uLndyYXBBbGwoZSk6dC5hcHBlbmQoZSl9KX0sd3JhcDpmdW5jdGlvbihlKXt2YXIgdD1iLmlzRnVuY3Rpb24oZSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihuKXtiKHRoaXMpLndyYXBBbGwodD9lLmNhbGwodGhpcyxuKTplKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7Yi5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fGIodGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITAsZnVuY3Rpb24oZSl7KDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKSYmdGhpcy5hcHBlbmRDaGlsZChlKX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCEwLGZ1bmN0aW9uKGUpeygxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSkmJnRoaXMuaW5zZXJ0QmVmb3JlKGUsdGhpcy5maXJzdENoaWxkKX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcy5uZXh0U2libGluZyl9KX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wO2Zvcig7bnVsbCE9KG49dGhpc1tyXSk7cisrKSghZXx8Yi5maWx0ZXIoZSxbbl0pLmxlbmd0aD4wKSYmKHR8fDEhPT1uLm5vZGVUeXBlfHxiLmNsZWFuRGF0YShPdChuKSksbi5wYXJlbnROb2RlJiYodCYmYi5jb250YWlucyhuLm93bmVyRG9jdW1lbnQsbikmJk10KE90KG4sInNjcmlwdCIpKSxuLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobikpKTtyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXt2YXIgZSx0PTA7Zm9yKDtudWxsIT0oZT10aGlzW3RdKTt0KyspezE9PT1lLm5vZGVUeXBlJiZiLmNsZWFuRGF0YShPdChlLCExKSk7d2hpbGUoZS5maXJzdENoaWxkKWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKTtlLm9wdGlvbnMmJmIubm9kZU5hbWUoZSwic2VsZWN0IikmJihlLm9wdGlvbnMubGVuZ3RoPTApfXJldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihlLHQpe3JldHVybiBlPW51bGw9PWU/ITE6ZSx0PW51bGw9PXQ/ZTp0LHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGIuY2xvbmUodGhpcyxlLHQpfSl9LGh0bWw6ZnVuY3Rpb24oZSl7cmV0dXJuIGIuYWNjZXNzKHRoaXMsZnVuY3Rpb24oZSl7dmFyIG49dGhpc1swXXx8e30scj0wLGk9dGhpcy5sZW5ndGg7aWYoZT09PXQpcmV0dXJuIDE9PT1uLm5vZGVUeXBlP24uaW5uZXJIVE1MLnJlcGxhY2UoZ3QsIiIpOnQ7aWYoISgic3RyaW5nIiE9dHlwZW9mIGV8fFR0LnRlc3QoZSl8fCFiLnN1cHBvcnQuaHRtbFNlcmlhbGl6ZSYmbXQudGVzdChlKXx8IWIuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSYmeXQudGVzdChlKXx8QXRbKGJ0LmV4ZWMoZSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKSl7ZT1lLnJlcGxhY2UodnQsIjwkMT48LyQyPiIpO3RyeXtmb3IoO2k+cjtyKyspbj10aGlzW3JdfHx7fSwxPT09bi5ub2RlVHlwZSYmKGIuY2xlYW5EYXRhKE90KG4sITEpKSxuLmlubmVySFRNTD1lKTtuPTB9Y2F0Y2gobyl7fX1uJiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGUpfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKGUpe3ZhciB0PWIuaXNGdW5jdGlvbihlKTtyZXR1cm4gdHx8InN0cmluZyI9PXR5cGVvZiBlfHwoZT1iKGUpLm5vdCh0aGlzKS5kZXRhY2goKSksdGhpcy5kb21NYW5pcChbZV0sITAsZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5uZXh0U2libGluZyxuPXRoaXMucGFyZW50Tm9kZTtuJiYoYih0aGlzKS5yZW1vdmUoKSxuLmluc2VydEJlZm9yZShlLHQpKX0pfSxkZXRhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVtb3ZlKGUsITApfSxkb21NYW5pcDpmdW5jdGlvbihlLG4scil7ZT1mLmFwcGx5KFtdLGUpO3ZhciBpLG8sYSxzLHUsbCxjPTAscD10aGlzLmxlbmd0aCxkPXRoaXMsaD1wLTEsZz1lWzBdLG09Yi5pc0Z1bmN0aW9uKGcpO2lmKG18fCEoMT49cHx8InN0cmluZyIhPXR5cGVvZiBnfHxiLnN1cHBvcnQuY2hlY2tDbG9uZSkmJkN0LnRlc3QoZykpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKXt2YXIgbz1kLmVxKGkpO20mJihlWzBdPWcuY2FsbCh0aGlzLGksbj9vLmh0bWwoKTp0KSksby5kb21NYW5pcChlLG4scil9KTtpZihwJiYobD1iLmJ1aWxkRnJhZ21lbnQoZSx0aGlzWzBdLm93bmVyRG9jdW1lbnQsITEsdGhpcyksaT1sLmZpcnN0Q2hpbGQsMT09PWwuY2hpbGROb2Rlcy5sZW5ndGgmJihsPWkpLGkpKXtmb3Iobj1uJiZiLm5vZGVOYW1lKGksInRyIikscz1iLm1hcChPdChsLCJzY3JpcHQiKSxIdCksYT1zLmxlbmd0aDtwPmM7YysrKW89bCxjIT09aCYmKG89Yi5jbG9uZShvLCEwLCEwKSxhJiZiLm1lcmdlKHMsT3Qobywic2NyaXB0IikpKSxyLmNhbGwobiYmYi5ub2RlTmFtZSh0aGlzW2NdLCJ0YWJsZSIpP0x0KHRoaXNbY10sInRib2R5Iik6dGhpc1tjXSxvLGMpO2lmKGEpZm9yKHU9c1tzLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LGIubWFwKHMscXQpLGM9MDthPmM7YysrKW89c1tjXSxrdC50ZXN0KG8udHlwZXx8IiIpJiYhYi5fZGF0YShvLCJnbG9iYWxFdmFsIikmJmIuY29udGFpbnModSxvKSYmKG8uc3JjP2IuYWpheCh7dXJsOm8uc3JjLHR5cGU6IkdFVCIsZGF0YVR5cGU6InNjcmlwdCIsYXN5bmM6ITEsZ2xvYmFsOiExLCJ0aHJvd3MiOiEwfSk6Yi5nbG9iYWxFdmFsKChvLnRleHR8fG8udGV4dENvbnRlbnR8fG8uaW5uZXJIVE1MfHwiIikucmVwbGFjZShTdCwiIikpKTtsPWk9bnVsbH1yZXR1cm4gdGhpc319KTtmdW5jdGlvbiBMdChlLHQpe3JldHVybiBlLmdldEVsZW1lbnRzQnlUYWdOYW1lKHQpWzBdfHxlLmFwcGVuZENoaWxkKGUub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KHQpKX1mdW5jdGlvbiBIdChlKXt2YXIgdD1lLmdldEF0dHJpYnV0ZU5vZGUoInR5cGUiKTtyZXR1cm4gZS50eXBlPSh0JiZ0LnNwZWNpZmllZCkrIi8iK2UudHlwZSxlfWZ1bmN0aW9uIHF0KGUpe3ZhciB0PUV0LmV4ZWMoZS50eXBlKTtyZXR1cm4gdD9lLnR5cGU9dFsxXTplLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpLGV9ZnVuY3Rpb24gTXQoZSx0KXt2YXIgbixyPTA7Zm9yKDtudWxsIT0obj1lW3JdKTtyKyspYi5fZGF0YShuLCJnbG9iYWxFdmFsIiwhdHx8Yi5fZGF0YSh0W3JdLCJnbG9iYWxFdmFsIikpfWZ1bmN0aW9uIF90KGUsdCl7aWYoMT09PXQubm9kZVR5cGUmJmIuaGFzRGF0YShlKSl7dmFyIG4scixpLG89Yi5fZGF0YShlKSxhPWIuX2RhdGEodCxvKSxzPW8uZXZlbnRzO2lmKHMpe2RlbGV0ZSBhLmhhbmRsZSxhLmV2ZW50cz17fTtmb3IobiBpbiBzKWZvcihyPTAsaT1zW25dLmxlbmd0aDtpPnI7cisrKWIuZXZlbnQuYWRkKHQsbixzW25dW3JdKX1hLmRhdGEmJihhLmRhdGE9Yi5leHRlbmQoe30sYS5kYXRhKSl9fWZ1bmN0aW9uIEZ0KGUsdCl7dmFyIG4scixpO2lmKDE9PT10Lm5vZGVUeXBlKXtpZihuPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwhYi5zdXBwb3J0Lm5vQ2xvbmVFdmVudCYmdFtiLmV4cGFuZG9dKXtpPWIuX2RhdGEodCk7Zm9yKHIgaW4gaS5ldmVudHMpYi5yZW1vdmVFdmVudCh0LHIsaS5oYW5kbGUpO3QucmVtb3ZlQXR0cmlidXRlKGIuZXhwYW5kbyl9InNjcmlwdCI9PT1uJiZ0LnRleHQhPT1lLnRleHQ/KEh0KHQpLnRleHQ9ZS50ZXh0LHF0KHQpKToib2JqZWN0Ij09PW4/KHQucGFyZW50Tm9kZSYmKHQub3V0ZXJIVE1MPWUub3V0ZXJIVE1MKSxiLnN1cHBvcnQuaHRtbDVDbG9uZSYmZS5pbm5lckhUTUwmJiFiLnRyaW0odC5pbm5lckhUTUwpJiYodC5pbm5lckhUTUw9ZS5pbm5lckhUTUwpKToiaW5wdXQiPT09biYmTnQudGVzdChlLnR5cGUpPyh0LmRlZmF1bHRDaGVja2VkPXQuY2hlY2tlZD1lLmNoZWNrZWQsdC52YWx1ZSE9PWUudmFsdWUmJih0LnZhbHVlPWUudmFsdWUpKToib3B0aW9uIj09PW4/dC5kZWZhdWx0U2VsZWN0ZWQ9dC5zZWxlY3RlZD1lLmRlZmF1bHRTZWxlY3RlZDooImlucHV0Ij09PW58fCJ0ZXh0YXJlYSI9PT1uKSYmKHQuZGVmYXVsdFZhbHVlPWUuZGVmYXVsdFZhbHVlKX19Yi5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oZSx0KXtiLmZuW2VdPWZ1bmN0aW9uKGUpe3ZhciBuLHI9MCxpPVtdLG89YihlKSxhPW8ubGVuZ3RoLTE7Zm9yKDthPj1yO3IrKyluPXI9PT1hP3RoaXM6dGhpcy5jbG9uZSghMCksYihvW3JdKVt0XShuKSxkLmFwcGx5KGksbi5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGkpfX0pO2Z1bmN0aW9uIE90KGUsbil7dmFyIHIsbyxhPTAscz10eXBlb2YgZS5nZXRFbGVtZW50c0J5VGFnTmFtZSE9PWk/ZS5nZXRFbGVtZW50c0J5VGFnTmFtZShufHwiKiIpOnR5cGVvZiBlLnF1ZXJ5U2VsZWN0b3JBbGwhPT1pP2UucXVlcnlTZWxlY3RvckFsbChufHwiKiIpOnQ7aWYoIXMpZm9yKHM9W10scj1lLmNoaWxkTm9kZXN8fGU7bnVsbCE9KG89clthXSk7YSsrKSFufHxiLm5vZGVOYW1lKG8sbik/cy5wdXNoKG8pOmIubWVyZ2UocyxPdChvLG4pKTtyZXR1cm4gbj09PXR8fG4mJmIubm9kZU5hbWUoZSxuKT9iLm1lcmdlKFtlXSxzKTpzfWZ1bmN0aW9uIEJ0KGUpe050LnRlc3QoZS50eXBlKSYmKGUuZGVmYXVsdENoZWNrZWQ9ZS5jaGVja2VkKX1iLmV4dGVuZCh7Y2xvbmU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHMsdT1iLmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKTtpZihiLnN1cHBvcnQuaHRtbDVDbG9uZXx8Yi5pc1hNTERvYyhlKXx8IW10LnRlc3QoIjwiK2Uubm9kZU5hbWUrIj4iKT9vPWUuY2xvbmVOb2RlKCEwKTooRHQuaW5uZXJIVE1MPWUub3V0ZXJIVE1MLER0LnJlbW92ZUNoaWxkKG89RHQuZmlyc3RDaGlsZCkpLCEoYi5zdXBwb3J0Lm5vQ2xvbmVFdmVudCYmYi5zdXBwb3J0Lm5vQ2xvbmVDaGVja2VkfHwxIT09ZS5ub2RlVHlwZSYmMTEhPT1lLm5vZGVUeXBlfHxiLmlzWE1MRG9jKGUpKSlmb3Iocj1PdChvKSxzPU90KGUpLGE9MDtudWxsIT0oaT1zW2FdKTsrK2EpclthXSYmRnQoaSxyW2FdKTtpZih0KWlmKG4pZm9yKHM9c3x8T3QoZSkscj1yfHxPdChvKSxhPTA7bnVsbCE9KGk9c1thXSk7YSsrKV90KGksclthXSk7ZWxzZSBfdChlLG8pO3JldHVybiByPU90KG8sInNjcmlwdCIpLHIubGVuZ3RoPjAmJk10KHIsIXUmJk90KGUsInNjcmlwdCIpKSxyPXM9aT1udWxsLG99LGJ1aWxkRnJhZ21lbnQ6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHMsdSxsLGMscD1lLmxlbmd0aCxmPWR0KHQpLGQ9W10saD0wO2Zvcig7cD5oO2grKylpZihvPWVbaF0sb3x8MD09PW8paWYoIm9iamVjdCI9PT1iLnR5cGUobykpYi5tZXJnZShkLG8ubm9kZVR5cGU/W29dOm8pO2Vsc2UgaWYod3QudGVzdChvKSl7cz1zfHxmLmFwcGVuZENoaWxkKHQuY3JlYXRlRWxlbWVudCgiZGl2IikpLHU9KGJ0LmV4ZWMobyl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksYz1BdFt1XXx8QXQuX2RlZmF1bHQscy5pbm5lckhUTUw9Y1sxXStvLnJlcGxhY2UodnQsIjwkMT48LyQyPiIpK2NbMl0saT1jWzBdO3doaWxlKGktLSlzPXMubGFzdENoaWxkO2lmKCFiLnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2UmJnl0LnRlc3QobykmJmQucHVzaCh0LmNyZWF0ZVRleHROb2RlKHl0LmV4ZWMobylbMF0pKSwhYi5zdXBwb3J0LnRib2R5KXtvPSJ0YWJsZSIhPT11fHx4dC50ZXN0KG8pPyI8dGFibGU+IiE9PWNbMV18fHh0LnRlc3Qobyk/MDpzOnMuZmlyc3RDaGlsZCxpPW8mJm8uY2hpbGROb2Rlcy5sZW5ndGg7d2hpbGUoaS0tKWIubm9kZU5hbWUobD1vLmNoaWxkTm9kZXNbaV0sInRib2R5IikmJiFsLmNoaWxkTm9kZXMubGVuZ3RoJiZvLnJlbW92ZUNoaWxkKGwpCn1iLm1lcmdlKGQscy5jaGlsZE5vZGVzKSxzLnRleHRDb250ZW50PSIiO3doaWxlKHMuZmlyc3RDaGlsZClzLnJlbW92ZUNoaWxkKHMuZmlyc3RDaGlsZCk7cz1mLmxhc3RDaGlsZH1lbHNlIGQucHVzaCh0LmNyZWF0ZVRleHROb2RlKG8pKTtzJiZmLnJlbW92ZUNoaWxkKHMpLGIuc3VwcG9ydC5hcHBlbmRDaGVja2VkfHxiLmdyZXAoT3QoZCwiaW5wdXQiKSxCdCksaD0wO3doaWxlKG89ZFtoKytdKWlmKCghcnx8LTE9PT1iLmluQXJyYXkobyxyKSkmJihhPWIuY29udGFpbnMoby5vd25lckRvY3VtZW50LG8pLHM9T3QoZi5hcHBlbmRDaGlsZChvKSwic2NyaXB0IiksYSYmTXQocyksbikpe2k9MDt3aGlsZShvPXNbaSsrXSlrdC50ZXN0KG8udHlwZXx8IiIpJiZuLnB1c2gobyl9cmV0dXJuIHM9bnVsbCxmfSxjbGVhbkRhdGE6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLG8sYSxzPTAsdT1iLmV4cGFuZG8sbD1iLmNhY2hlLHA9Yi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8sZj1iLmV2ZW50LnNwZWNpYWw7Zm9yKDtudWxsIT0obj1lW3NdKTtzKyspaWYoKHR8fGIuYWNjZXB0RGF0YShuKSkmJihvPW5bdV0sYT1vJiZsW29dKSl7aWYoYS5ldmVudHMpZm9yKHIgaW4gYS5ldmVudHMpZltyXT9iLmV2ZW50LnJlbW92ZShuLHIpOmIucmVtb3ZlRXZlbnQobixyLGEuaGFuZGxlKTtsW29dJiYoZGVsZXRlIGxbb10scD9kZWxldGUgblt1XTp0eXBlb2Ygbi5yZW1vdmVBdHRyaWJ1dGUhPT1pP24ucmVtb3ZlQXR0cmlidXRlKHUpOm5bdV09bnVsbCxjLnB1c2gobykpfX19KTt2YXIgUHQsUnQsV3QsJHQ9L2FscGhhXChbXildKlwpL2ksSXQ9L29wYWNpdHlccyo9XHMqKFteKV0qKS8senQ9L14odG9wfHJpZ2h0fGJvdHRvbXxsZWZ0KSQvLFh0PS9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxVdD0vXm1hcmdpbi8sVnQ9UmVnRXhwKCJeKCIreCsiKSguKikkIiwiaSIpLFl0PVJlZ0V4cCgiXigiK3grIikoPyFweClbYS16JV0rJCIsImkiKSxKdD1SZWdFeHAoIl4oWystXSk9KCIreCsiKSIsImkiKSxHdD17Qk9EWToiYmxvY2sifSxRdD17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sS3Q9e2xldHRlclNwYWNpbmc6MCxmb250V2VpZ2h0OjQwMH0sWnQ9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxlbj1bIldlYmtpdCIsIk8iLCJNb3oiLCJtcyJdO2Z1bmN0aW9uIHRuKGUsdCl7aWYodCBpbiBlKXJldHVybiB0O3ZhciBuPXQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKSxyPXQsaT1lbi5sZW5ndGg7d2hpbGUoaS0tKWlmKHQ9ZW5baV0rbix0IGluIGUpcmV0dXJuIHQ7cmV0dXJuIHJ9ZnVuY3Rpb24gbm4oZSx0KXtyZXR1cm4gZT10fHxlLCJub25lIj09PWIuY3NzKGUsImRpc3BsYXkiKXx8IWIuY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfWZ1bmN0aW9uIHJuKGUsdCl7dmFyIG4scixpLG89W10sYT0wLHM9ZS5sZW5ndGg7Zm9yKDtzPmE7YSsrKXI9ZVthXSxyLnN0eWxlJiYob1thXT1iLl9kYXRhKHIsIm9sZGRpc3BsYXkiKSxuPXIuc3R5bGUuZGlzcGxheSx0PyhvW2FdfHwibm9uZSIhPT1ufHwoci5zdHlsZS5kaXNwbGF5PSIiKSwiIj09PXIuc3R5bGUuZGlzcGxheSYmbm4ocikmJihvW2FdPWIuX2RhdGEociwib2xkZGlzcGxheSIsdW4oci5ub2RlTmFtZSkpKSk6b1thXXx8KGk9bm4ociksKG4mJiJub25lIiE9PW58fCFpKSYmYi5fZGF0YShyLCJvbGRkaXNwbGF5IixpP246Yi5jc3MociwiZGlzcGxheSIpKSkpO2ZvcihhPTA7cz5hO2ErKylyPWVbYV0sci5zdHlsZSYmKHQmJiJub25lIiE9PXIuc3R5bGUuZGlzcGxheSYmIiIhPT1yLnN0eWxlLmRpc3BsYXl8fChyLnN0eWxlLmRpc3BsYXk9dD9vW2FdfHwiIjoibm9uZSIpKTtyZXR1cm4gZX1iLmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKGUsbil7cmV0dXJuIGIuYWNjZXNzKHRoaXMsZnVuY3Rpb24oZSxuLHIpe3ZhciBpLG8sYT17fSxzPTA7aWYoYi5pc0FycmF5KG4pKXtmb3Iobz1SdChlKSxpPW4ubGVuZ3RoO2k+cztzKyspYVtuW3NdXT1iLmNzcyhlLG5bc10sITEsbyk7cmV0dXJuIGF9cmV0dXJuIHIhPT10P2Iuc3R5bGUoZSxuLHIpOmIuY3NzKGUsbil9LGUsbixhcmd1bWVudHMubGVuZ3RoPjEpfSxzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIHJuKHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIHJuKHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ImJvb2xlYW4iPT10eXBlb2YgZTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7KHQ/ZTpubih0aGlzKSk/Yih0aGlzKS5zaG93KCk6Yih0aGlzKS5oaWRlKCl9KX19KSxiLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihlLHQpe2lmKHQpe3ZhciBuPVd0KGUsIm9wYWNpdHkiKTtyZXR1cm4iIj09PW4/IjEiOm59fX19LGNzc051bWJlcjp7Y29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZm9udFdlaWdodDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnsiZmxvYXQiOmIuc3VwcG9ydC5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oZSxuLHIsaSl7aWYoZSYmMyE9PWUubm9kZVR5cGUmJjghPT1lLm5vZGVUeXBlJiZlLnN0eWxlKXt2YXIgbyxhLHMsdT1iLmNhbWVsQ2FzZShuKSxsPWUuc3R5bGU7aWYobj1iLmNzc1Byb3BzW3VdfHwoYi5jc3NQcm9wc1t1XT10bihsLHUpKSxzPWIuY3NzSG9va3Nbbl18fGIuY3NzSG9va3NbdV0scj09PXQpcmV0dXJuIHMmJiJnZXQiaW4gcyYmKG89cy5nZXQoZSwhMSxpKSkhPT10P286bFtuXTtpZihhPXR5cGVvZiByLCJzdHJpbmciPT09YSYmKG89SnQuZXhlYyhyKSkmJihyPShvWzFdKzEpKm9bMl0rcGFyc2VGbG9hdChiLmNzcyhlLG4pKSxhPSJudW1iZXIiKSwhKG51bGw9PXJ8fCJudW1iZXIiPT09YSYmaXNOYU4ocil8fCgibnVtYmVyIiE9PWF8fGIuY3NzTnVtYmVyW3VdfHwocis9InB4IiksYi5zdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZXx8IiIhPT1yfHwwIT09bi5pbmRleE9mKCJiYWNrZ3JvdW5kIil8fChsW25dPSJpbmhlcml0IikscyYmInNldCJpbiBzJiYocj1zLnNldChlLHIsaSkpPT09dCkpKXRyeXtsW25dPXJ9Y2F0Y2goYyl7fX19LGNzczpmdW5jdGlvbihlLG4scixpKXt2YXIgbyxhLHMsdT1iLmNhbWVsQ2FzZShuKTtyZXR1cm4gbj1iLmNzc1Byb3BzW3VdfHwoYi5jc3NQcm9wc1t1XT10bihlLnN0eWxlLHUpKSxzPWIuY3NzSG9va3Nbbl18fGIuY3NzSG9va3NbdV0scyYmImdldCJpbiBzJiYoYT1zLmdldChlLCEwLHIpKSxhPT09dCYmKGE9V3QoZSxuLGkpKSwibm9ybWFsIj09PWEmJm4gaW4gS3QmJihhPUt0W25dKSwiIj09PXJ8fHI/KG89cGFyc2VGbG9hdChhKSxyPT09ITB8fGIuaXNOdW1lcmljKG8pP298fDA6YSk6YX0sc3dhcDpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGE9e307Zm9yKG8gaW4gdClhW29dPWUuc3R5bGVbb10sZS5zdHlsZVtvXT10W29dO2k9bi5hcHBseShlLHJ8fFtdKTtmb3IobyBpbiB0KWUuc3R5bGVbb109YVtvXTtyZXR1cm4gaX19KSxlLmdldENvbXB1dGVkU3R5bGU/KFJ0PWZ1bmN0aW9uKHQpe3JldHVybiBlLmdldENvbXB1dGVkU3R5bGUodCxudWxsKX0sV3Q9ZnVuY3Rpb24oZSxuLHIpe3ZhciBpLG8sYSxzPXJ8fFJ0KGUpLHU9cz9zLmdldFByb3BlcnR5VmFsdWUobil8fHNbbl06dCxsPWUuc3R5bGU7cmV0dXJuIHMmJigiIiE9PXV8fGIuY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfHwodT1iLnN0eWxlKGUsbikpLFl0LnRlc3QodSkmJlV0LnRlc3QobikmJihpPWwud2lkdGgsbz1sLm1pbldpZHRoLGE9bC5tYXhXaWR0aCxsLm1pbldpZHRoPWwubWF4V2lkdGg9bC53aWR0aD11LHU9cy53aWR0aCxsLndpZHRoPWksbC5taW5XaWR0aD1vLGwubWF4V2lkdGg9YSkpLHV9KTpvLmRvY3VtZW50RWxlbWVudC5jdXJyZW50U3R5bGUmJihSdD1mdW5jdGlvbihlKXtyZXR1cm4gZS5jdXJyZW50U3R5bGV9LFd0PWZ1bmN0aW9uKGUsbixyKXt2YXIgaSxvLGEscz1yfHxSdChlKSx1PXM/c1tuXTp0LGw9ZS5zdHlsZTtyZXR1cm4gbnVsbD09dSYmbCYmbFtuXSYmKHU9bFtuXSksWXQudGVzdCh1KSYmIXp0LnRlc3QobikmJihpPWwubGVmdCxvPWUucnVudGltZVN0eWxlLGE9byYmby5sZWZ0LGEmJihvLmxlZnQ9ZS5jdXJyZW50U3R5bGUubGVmdCksbC5sZWZ0PSJmb250U2l6ZSI9PT1uPyIxZW0iOnUsdT1sLnBpeGVsTGVmdCsicHgiLGwubGVmdD1pLGEmJihvLmxlZnQ9YSkpLCIiPT09dT8iYXV0byI6dX0pO2Z1bmN0aW9uIG9uKGUsdCxuKXt2YXIgcj1WdC5leGVjKHQpO3JldHVybiByP01hdGgubWF4KDAsclsxXS0obnx8MCkpKyhyWzJdfHwicHgiKTp0fWZ1bmN0aW9uIGFuKGUsdCxuLHIsaSl7dmFyIG89bj09PShyPyJib3JkZXIiOiJjb250ZW50Iik/NDoid2lkdGgiPT09dD8xOjAsYT0wO2Zvcig7ND5vO28rPTIpIm1hcmdpbiI9PT1uJiYoYSs9Yi5jc3MoZSxuK1p0W29dLCEwLGkpKSxyPygiY29udGVudCI9PT1uJiYoYS09Yi5jc3MoZSwicGFkZGluZyIrWnRbb10sITAsaSkpLCJtYXJnaW4iIT09biYmKGEtPWIuY3NzKGUsImJvcmRlciIrWnRbb10rIldpZHRoIiwhMCxpKSkpOihhKz1iLmNzcyhlLCJwYWRkaW5nIitadFtvXSwhMCxpKSwicGFkZGluZyIhPT1uJiYoYSs9Yi5jc3MoZSwiYm9yZGVyIitadFtvXSsiV2lkdGgiLCEwLGkpKSk7cmV0dXJuIGF9ZnVuY3Rpb24gc24oZSx0LG4pe3ZhciByPSEwLGk9IndpZHRoIj09PXQ/ZS5vZmZzZXRXaWR0aDplLm9mZnNldEhlaWdodCxvPVJ0KGUpLGE9Yi5zdXBwb3J0LmJveFNpemluZyYmImJvcmRlci1ib3giPT09Yi5jc3MoZSwiYm94U2l6aW5nIiwhMSxvKTtpZigwPj1pfHxudWxsPT1pKXtpZihpPVd0KGUsdCxvKSwoMD5pfHxudWxsPT1pKSYmKGk9ZS5zdHlsZVt0XSksWXQudGVzdChpKSlyZXR1cm4gaTtyPWEmJihiLnN1cHBvcnQuYm94U2l6aW5nUmVsaWFibGV8fGk9PT1lLnN0eWxlW3RdKSxpPXBhcnNlRmxvYXQoaSl8fDB9cmV0dXJuIGkrYW4oZSx0LG58fChhPyJib3JkZXIiOiJjb250ZW50IikscixvKSsicHgifWZ1bmN0aW9uIHVuKGUpe3ZhciB0PW8sbj1HdFtlXTtyZXR1cm4gbnx8KG49bG4oZSx0KSwibm9uZSIhPT1uJiZufHwoUHQ9KFB0fHxiKCI8aWZyYW1lIGZyYW1lYm9yZGVyPScwJyB3aWR0aD0nMCcgaGVpZ2h0PScwJy8+IikuY3NzKCJjc3NUZXh0IiwiZGlzcGxheTpibG9jayAhaW1wb3J0YW50IikpLmFwcGVuZFRvKHQuZG9jdW1lbnRFbGVtZW50KSx0PShQdFswXS5jb250ZW50V2luZG93fHxQdFswXS5jb250ZW50RG9jdW1lbnQpLmRvY3VtZW50LHQud3JpdGUoIjwhZG9jdHlwZSBodG1sPjxodG1sPjxib2R5PiIpLHQuY2xvc2UoKSxuPWxuKGUsdCksUHQuZGV0YWNoKCkpLEd0W2VdPW4pLG59ZnVuY3Rpb24gbG4oZSx0KXt2YXIgbj1iKHQuY3JlYXRlRWxlbWVudChlKSkuYXBwZW5kVG8odC5ib2R5KSxyPWIuY3NzKG5bMF0sImRpc3BsYXkiKTtyZXR1cm4gbi5yZW1vdmUoKSxyfWIuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oZSxuKXtiLmNzc0hvb2tzW25dPXtnZXQ6ZnVuY3Rpb24oZSxyLGkpe3JldHVybiByPzA9PT1lLm9mZnNldFdpZHRoJiZYdC50ZXN0KGIuY3NzKGUsImRpc3BsYXkiKSk/Yi5zd2FwKGUsUXQsZnVuY3Rpb24oKXtyZXR1cm4gc24oZSxuLGkpfSk6c24oZSxuLGkpOnR9LHNldDpmdW5jdGlvbihlLHQscil7dmFyIGk9ciYmUnQoZSk7cmV0dXJuIG9uKGUsdCxyP2FuKGUsbixyLGIuc3VwcG9ydC5ib3hTaXppbmcmJiJib3JkZXItYm94Ij09PWIuY3NzKGUsImJveFNpemluZyIsITEsaSksaSk6MCl9fX0pLGIuc3VwcG9ydC5vcGFjaXR5fHwoYi5jc3NIb29rcy5vcGFjaXR5PXtnZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gSXQudGVzdCgodCYmZS5jdXJyZW50U3R5bGU/ZS5jdXJyZW50U3R5bGUuZmlsdGVyOmUuc3R5bGUuZmlsdGVyKXx8IiIpPy4wMSpwYXJzZUZsb2F0KFJlZ0V4cC4kMSkrIiI6dD8iMSI6IiJ9LHNldDpmdW5jdGlvbihlLHQpe3ZhciBuPWUuc3R5bGUscj1lLmN1cnJlbnRTdHlsZSxpPWIuaXNOdW1lcmljKHQpPyJhbHBoYShvcGFjaXR5PSIrMTAwKnQrIikiOiIiLG89ciYmci5maWx0ZXJ8fG4uZmlsdGVyfHwiIjtuLnpvb209MSwodD49MXx8IiI9PT10KSYmIiI9PT1iLnRyaW0oby5yZXBsYWNlKCR0LCIiKSkmJm4ucmVtb3ZlQXR0cmlidXRlJiYobi5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpLCIiPT09dHx8ciYmIXIuZmlsdGVyKXx8KG4uZmlsdGVyPSR0LnRlc3Qobyk/by5yZXBsYWNlKCR0LGkpOm8rIiAiK2kpfX0pLGIoZnVuY3Rpb24oKXtiLnN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodHx8KGIuY3NzSG9va3MubWFyZ2luUmlnaHQ9e2dldDpmdW5jdGlvbihlLG4pe3JldHVybiBuP2Iuc3dhcChlLHtkaXNwbGF5OiJpbmxpbmUtYmxvY2sifSxXdCxbZSwibWFyZ2luUmlnaHQiXSk6dH19KSwhYi5zdXBwb3J0LnBpeGVsUG9zaXRpb24mJmIuZm4ucG9zaXRpb24mJmIuZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihlLG4pe2IuY3NzSG9va3Nbbl09e2dldDpmdW5jdGlvbihlLHIpe3JldHVybiByPyhyPVd0KGUsbiksWXQudGVzdChyKT9iKGUpLnBvc2l0aW9uKClbbl0rInB4IjpyKTp0fX19KX0pLGIuZXhwciYmYi5leHByLmZpbHRlcnMmJihiLmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oZSl7cmV0dXJuIDA+PWUub2Zmc2V0V2lkdGgmJjA+PWUub2Zmc2V0SGVpZ2h0fHwhYi5zdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyYmIm5vbmUiPT09KGUuc3R5bGUmJmUuc3R5bGUuZGlzcGxheXx8Yi5jc3MoZSwiZGlzcGxheSIpKX0sYi5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihlKXtyZXR1cm4hYi5leHByLmZpbHRlcnMuaGlkZGVuKGUpfSksYi5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oZSx0KXtiLmNzc0hvb2tzW2UrdF09e2V4cGFuZDpmdW5jdGlvbihuKXt2YXIgcj0wLGk9e30sbz0ic3RyaW5nIj09dHlwZW9mIG4/bi5zcGxpdCgiICIpOltuXTtmb3IoOzQ+cjtyKyspaVtlK1p0W3JdK3RdPW9bcl18fG9bci0yXXx8b1swXTtyZXR1cm4gaX19LFV0LnRlc3QoZSl8fChiLmNzc0hvb2tzW2UrdF0uc2V0PW9uKX0pO3ZhciBjbj0vJTIwL2cscG49L1xbXF0kLyxmbj0vXHI/XG4vZyxkbj0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksaG49L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2IuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gYi5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPWIucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBlP2IubWFrZUFycmF5KGUpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgZT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIWIodGhpcykuaXMoIjpkaXNhYmxlZCIpJiZobi50ZXN0KHRoaXMubm9kZU5hbWUpJiYhZG4udGVzdChlKSYmKHRoaXMuY2hlY2tlZHx8IU50LnRlc3QoZSkpfSkubWFwKGZ1bmN0aW9uKGUsdCl7dmFyIG49Yih0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09bj9udWxsOmIuaXNBcnJheShuKT9iLm1hcChuLGZ1bmN0aW9uKGUpe3JldHVybntuYW1lOnQubmFtZSx2YWx1ZTplLnJlcGxhY2UoZm4sIlxyXG4iKX19KTp7bmFtZTp0Lm5hbWUsdmFsdWU6bi5yZXBsYWNlKGZuLCJcclxuIil9fSkuZ2V0KCl9fSksYi5wYXJhbT1mdW5jdGlvbihlLG4pe3ZhciByLGk9W10sbz1mdW5jdGlvbihlLHQpe3Q9Yi5pc0Z1bmN0aW9uKHQpP3QoKTpudWxsPT10PyIiOnQsaVtpLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGUpKyI9IitlbmNvZGVVUklDb21wb25lbnQodCl9O2lmKG49PT10JiYobj1iLmFqYXhTZXR0aW5ncyYmYi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLGIuaXNBcnJheShlKXx8ZS5qcXVlcnkmJiFiLmlzUGxhaW5PYmplY3QoZSkpYi5lYWNoKGUsZnVuY3Rpb24oKXtvKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKHIgaW4gZSlnbihyLGVbcl0sbixvKTtyZXR1cm4gaS5qb2luKCImIikucmVwbGFjZShjbiwiKyIpfTtmdW5jdGlvbiBnbihlLHQsbixyKXt2YXIgaTtpZihiLmlzQXJyYXkodCkpYi5lYWNoKHQsZnVuY3Rpb24odCxpKXtufHxwbi50ZXN0KGUpP3IoZSxpKTpnbihlKyJbIisoIm9iamVjdCI9PXR5cGVvZiBpP3Q6IiIpKyJdIixpLG4scil9KTtlbHNlIGlmKG58fCJvYmplY3QiIT09Yi50eXBlKHQpKXIoZSx0KTtlbHNlIGZvcihpIGluIHQpZ24oZSsiWyIraSsiXSIsdFtpXSxuLHIpfWIuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe2IuZm5bdF09ZnVuY3Rpb24oZSxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24odCxudWxsLGUsbik6dGhpcy50cmlnZ2VyKHQpfX0pLGIuZm4uaG92ZXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGUpLm1vdXNlbGVhdmUodHx8ZSl9O3ZhciBtbix5bix2bj1iLm5vdygpLGJuPS9cPy8seG49LyMuKiQvLHduPS8oWz8mXSlfPVteJl0qLyxUbj0vXiguKj8pOlsgXHRdKihbXlxyXG5dKilccj8kL2dtLE5uPS9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLENuPS9eKD86R0VUfEhFQUQpJC8sa249L15cL1wvLyxFbj0vXihbXHcuKy1dKzopKD86XC9cLyhbXlwvPyM6XSopKD86OihcZCspfCl8KS8sU249Yi5mbi5sb2FkLEFuPXt9LGpuPXt9LERuPSIqLyIuY29uY2F0KCIqIik7dHJ5e3luPWEuaHJlZn1jYXRjaChMbil7eW49by5jcmVhdGVFbGVtZW50KCJhIikseW4uaHJlZj0iIix5bj15bi5ocmVmfW1uPUVuLmV4ZWMoeW4udG9Mb3dlckNhc2UoKSl8fFtdO2Z1bmN0aW9uIEhuKGUpe3JldHVybiBmdW5jdGlvbih0LG4peyJzdHJpbmciIT10eXBlb2YgdCYmKG49dCx0PSIqIik7dmFyIHIsaT0wLG89dC50b0xvd2VyQ2FzZSgpLm1hdGNoKHcpfHxbXTtpZihiLmlzRnVuY3Rpb24obikpd2hpbGUocj1vW2krK10pIisiPT09clswXT8ocj1yLnNsaWNlKDEpfHwiKiIsKGVbcl09ZVtyXXx8W10pLnVuc2hpZnQobikpOihlW3JdPWVbcl18fFtdKS5wdXNoKG4pfX1mdW5jdGlvbiBxbihlLG4scixpKXt2YXIgbz17fSxhPWU9PT1qbjtmdW5jdGlvbiBzKHUpe3ZhciBsO3JldHVybiBvW3VdPSEwLGIuZWFjaChlW3VdfHxbXSxmdW5jdGlvbihlLHUpe3ZhciBjPXUobixyLGkpO3JldHVybiJzdHJpbmciIT10eXBlb2YgY3x8YXx8b1tjXT9hPyEobD1jKTp0OihuLmRhdGFUeXBlcy51bnNoaWZ0KGMpLHMoYyksITEpfSksbH1yZXR1cm4gcyhuLmRhdGFUeXBlc1swXSl8fCFvWyIqIl0mJnMoIioiKX1mdW5jdGlvbiBNbihlLG4pe3ZhciByLGksbz1iLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGkgaW4gbiluW2ldIT09dCYmKChvW2ldP2U6cnx8KHI9e30pKVtpXT1uW2ldKTtyZXR1cm4gciYmYi5leHRlbmQoITAsZSxyKSxlfWIuZm4ubG9hZD1mdW5jdGlvbihlLG4scil7aWYoInN0cmluZyIhPXR5cGVvZiBlJiZTbilyZXR1cm4gU24uYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBpLG8sYSxzPXRoaXMsdT1lLmluZGV4T2YoIiAiKTtyZXR1cm4gdT49MCYmKGk9ZS5zbGljZSh1LGUubGVuZ3RoKSxlPWUuc2xpY2UoMCx1KSksYi5pc0Z1bmN0aW9uKG4pPyhyPW4sbj10KTpuJiYib2JqZWN0Ij09dHlwZW9mIG4mJihhPSJQT1NUIikscy5sZW5ndGg+MCYmYi5hamF4KHt1cmw6ZSx0eXBlOmEsZGF0YVR5cGU6Imh0bWwiLGRhdGE6bn0pLmRvbmUoZnVuY3Rpb24oZSl7bz1hcmd1bWVudHMscy5odG1sKGk/YigiPGRpdj4iKS5hcHBlbmQoYi5wYXJzZUhUTUwoZSkpLmZpbmQoaSk6ZSl9KS5jb21wbGV0ZShyJiZmdW5jdGlvbihlLHQpe3MuZWFjaChyLG98fFtlLnJlc3BvbnNlVGV4dCx0LGVdKX0pLHRoaXN9LGIuZWFjaChbImFqYXhTdGFydCIsImFqYXhTdG9wIiwiYWpheENvbXBsZXRlIiwiYWpheEVycm9yIiwiYWpheFN1Y2Nlc3MiLCJhamF4U2VuZCJdLGZ1bmN0aW9uKGUsdCl7Yi5mblt0XT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vbih0LGUpfX0pLGIuZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihlLG4pe2Jbbl09ZnVuY3Rpb24oZSxyLGksbyl7cmV0dXJuIGIuaXNGdW5jdGlvbihyKSYmKG89b3x8aSxpPXIscj10KSxiLmFqYXgoe3VybDplLHR5cGU6bixkYXRhVHlwZTpvLGRhdGE6cixzdWNjZXNzOml9KX19KSxiLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6eW4sdHlwZToiR0VUIixpc0xvY2FsOk5uLnRlc3QobW5bMV0pLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6RG4sdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjplLlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpiLnBhcnNlSlNPTiwidGV4dCB4bWwiOmIucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihlLHQpe3JldHVybiB0P01uKE1uKGUsYi5hamF4U2V0dGluZ3MpLHQpOk1uKGIuYWpheFNldHRpbmdzLGUpfSxhamF4UHJlZmlsdGVyOkhuKEFuKSxhamF4VHJhbnNwb3J0OkhuKGpuKSxhamF4OmZ1bmN0aW9uKGUsbil7Im9iamVjdCI9PXR5cGVvZiBlJiYobj1lLGU9dCksbj1ufHx7fTt2YXIgcixpLG8sYSxzLHUsbCxjLHA9Yi5hamF4U2V0dXAoe30sbiksZj1wLmNvbnRleHR8fHAsZD1wLmNvbnRleHQmJihmLm5vZGVUeXBlfHxmLmpxdWVyeSk/YihmKTpiLmV2ZW50LGg9Yi5EZWZlcnJlZCgpLGc9Yi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksbT1wLnN0YXR1c0NvZGV8fHt9LHk9e30sdj17fSx4PTAsVD0iY2FuY2VsZWQiLE49e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihlKXt2YXIgdDtpZigyPT09eCl7aWYoIWMpe2M9e307d2hpbGUodD1Ubi5leGVjKGEpKWNbdFsxXS50b0xvd2VyQ2FzZSgpXT10WzJdfXQ9Y1tlLnRvTG93ZXJDYXNlKCldfXJldHVybiBudWxsPT10P251bGw6dH0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIDI9PT14P2E6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihlLHQpe3ZhciBuPWUudG9Mb3dlckNhc2UoKTtyZXR1cm4geHx8KGU9dltuXT12W25dfHxlLHlbZV09dCksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihlKXtyZXR1cm4geHx8KHAubWltZVR5cGU9ZSksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbihlKXt2YXIgdDtpZihlKWlmKDI+eClmb3IodCBpbiBlKW1bdF09W21bdF0sZVt0XV07ZWxzZSBOLmFsd2F5cyhlW04uc3RhdHVzXSk7cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGUpe3ZhciB0PWV8fFQ7cmV0dXJuIGwmJmwuYWJvcnQodCksaygwLHQpLHRoaXN9fTtpZihoLnByb21pc2UoTikuY29tcGxldGU9Zy5hZGQsTi5zdWNjZXNzPU4uZG9uZSxOLmVycm9yPU4uZmFpbCxwLnVybD0oKGV8fHAudXJsfHx5bikrIiIpLnJlcGxhY2UoeG4sIiIpLnJlcGxhY2Uoa24sbW5bMV0rIi8vIikscC50eXBlPW4ubWV0aG9kfHxuLnR5cGV8fHAubWV0aG9kfHxwLnR5cGUscC5kYXRhVHlwZXM9Yi50cmltKHAuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaCh3KXx8WyIiXSxudWxsPT1wLmNyb3NzRG9tYWluJiYocj1Fbi5leGVjKHAudXJsLnRvTG93ZXJDYXNlKCkpLHAuY3Jvc3NEb21haW49ISghcnx8clsxXT09PW1uWzFdJiZyWzJdPT09bW5bMl0mJihyWzNdfHwoImh0dHA6Ij09PXJbMV0/ODA6NDQzKSk9PShtblszXXx8KCJodHRwOiI9PT1tblsxXT84MDo0NDMpKSkpLHAuZGF0YSYmcC5wcm9jZXNzRGF0YSYmInN0cmluZyIhPXR5cGVvZiBwLmRhdGEmJihwLmRhdGE9Yi5wYXJhbShwLmRhdGEscC50cmFkaXRpb25hbCkpLHFuKEFuLHAsbixOKSwyPT09eClyZXR1cm4gTjt1PXAuZ2xvYmFsLHUmJjA9PT1iLmFjdGl2ZSsrJiZiLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLHAudHlwZT1wLnR5cGUudG9VcHBlckNhc2UoKSxwLmhhc0NvbnRlbnQ9IUNuLnRlc3QocC50eXBlKSxvPXAudXJsLHAuaGFzQ29udGVudHx8KHAuZGF0YSYmKG89cC51cmwrPShibi50ZXN0KG8pPyImIjoiPyIpK3AuZGF0YSxkZWxldGUgcC5kYXRhKSxwLmNhY2hlPT09ITEmJihwLnVybD13bi50ZXN0KG8pP28ucmVwbGFjZSh3biwiJDFfPSIrdm4rKyk6bysoYm4udGVzdChvKT8iJiI6Ij8iKSsiXz0iK3ZuKyspKSxwLmlmTW9kaWZpZWQmJihiLmxhc3RNb2RpZmllZFtvXSYmTi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsYi5sYXN0TW9kaWZpZWRbb10pLGIuZXRhZ1tvXSYmTi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixiLmV0YWdbb10pKSwocC5kYXRhJiZwLmhhc0NvbnRlbnQmJnAuY29udGVudFR5cGUhPT0hMXx8bi5jb250ZW50VHlwZSkmJk4uc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixwLmNvbnRlbnRUeXBlKSxOLnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIscC5kYXRhVHlwZXNbMF0mJnAuYWNjZXB0c1twLmRhdGFUeXBlc1swXV0/cC5hY2NlcHRzW3AuZGF0YVR5cGVzWzBdXSsoIioiIT09cC5kYXRhVHlwZXNbMF0/IiwgIitEbisiOyBxPTAuMDEiOiIiKTpwLmFjY2VwdHNbIioiXSk7Zm9yKGkgaW4gcC5oZWFkZXJzKU4uc2V0UmVxdWVzdEhlYWRlcihpLHAuaGVhZGVyc1tpXSk7aWYocC5iZWZvcmVTZW5kJiYocC5iZWZvcmVTZW5kLmNhbGwoZixOLHApPT09ITF8fDI9PT14KSlyZXR1cm4gTi5hYm9ydCgpO1Q9ImFib3J0Ijtmb3IoaSBpbntzdWNjZXNzOjEsZXJyb3I6MSxjb21wbGV0ZToxfSlOW2ldKHBbaV0pO2lmKGw9cW4oam4scCxuLE4pKXtOLnJlYWR5U3RhdGU9MSx1JiZkLnRyaWdnZXIoImFqYXhTZW5kIixbTixwXSkscC5hc3luYyYmcC50aW1lb3V0PjAmJihzPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtOLmFib3J0KCJ0aW1lb3V0Iil9LHAudGltZW91dCkpO3RyeXt4PTEsbC5zZW5kKHksayl9Y2F0Y2goQyl7aWYoISgyPngpKXRocm93IEM7aygtMSxDKX19ZWxzZSBrKC0xLCJObyBUcmFuc3BvcnQiKTtmdW5jdGlvbiBrKGUsbixyLGkpe3ZhciBjLHksdix3LFQsQz1uOzIhPT14JiYoeD0yLHMmJmNsZWFyVGltZW91dChzKSxsPXQsYT1pfHwiIixOLnJlYWR5U3RhdGU9ZT4wPzQ6MCxyJiYodz1fbihwLE4scikpLGU+PTIwMCYmMzAwPmV8fDMwND09PWU/KHAuaWZNb2RpZmllZCYmKFQ9Ti5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLFQmJihiLmxhc3RNb2RpZmllZFtvXT1UKSxUPU4uZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSxUJiYoYi5ldGFnW29dPVQpKSwyMDQ9PT1lPyhjPSEwLEM9Im5vY29udGVudCIpOjMwND09PWU/KGM9ITAsQz0ibm90bW9kaWZpZWQiKTooYz1GbihwLHcpLEM9Yy5zdGF0ZSx5PWMuZGF0YSx2PWMuZXJyb3IsYz0hdikpOih2PUMsKGV8fCFDKSYmKEM9ImVycm9yIiwwPmUmJihlPTApKSksTi5zdGF0dXM9ZSxOLnN0YXR1c1RleHQ9KG58fEMpKyIiLGM/aC5yZXNvbHZlV2l0aChmLFt5LEMsTl0pOmgucmVqZWN0V2l0aChmLFtOLEMsdl0pLE4uc3RhdHVzQ29kZShtKSxtPXQsdSYmZC50cmlnZ2VyKGM/ImFqYXhTdWNjZXNzIjoiYWpheEVycm9yIixbTixwLGM/eTp2XSksZy5maXJlV2l0aChmLFtOLENdKSx1JiYoZC50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFtOLHBdKSwtLWIuYWN0aXZlfHxiLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpKX1yZXR1cm4gTn0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGUsbil7cmV0dXJuIGIuZ2V0KGUsdCxuLCJzY3JpcHQiKX0sZ2V0SlNPTjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGIuZ2V0KGUsdCxuLCJqc29uIil9fSk7ZnVuY3Rpb24gX24oZSxuLHIpe3ZhciBpLG8sYSxzLHU9ZS5jb250ZW50cyxsPWUuZGF0YVR5cGVzLGM9ZS5yZXNwb25zZUZpZWxkcztmb3IocyBpbiBjKXMgaW4gciYmKG5bY1tzXV09cltzXSk7d2hpbGUoIioiPT09bFswXSlsLnNoaWZ0KCksbz09PXQmJihvPWUubWltZVR5cGV8fG4uZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihvKWZvcihzIGluIHUpaWYodVtzXSYmdVtzXS50ZXN0KG8pKXtsLnVuc2hpZnQocyk7YnJlYWt9aWYobFswXWluIHIpYT1sWzBdO2Vsc2V7Zm9yKHMgaW4gcil7aWYoIWxbMF18fGUuY29udmVydGVyc1tzKyIgIitsWzBdXSl7YT1zO2JyZWFrfWl8fChpPXMpfWE9YXx8aX1yZXR1cm4gYT8oYSE9PWxbMF0mJmwudW5zaGlmdChhKSxyW2FdKTp0fWZ1bmN0aW9uIEZuKGUsdCl7dmFyIG4scixpLG8sYT17fSxzPTAsdT1lLmRhdGFUeXBlcy5zbGljZSgpLGw9dVswXTtpZihlLmRhdGFGaWx0ZXImJih0PWUuZGF0YUZpbHRlcih0LGUuZGF0YVR5cGUpKSx1WzFdKWZvcihpIGluIGUuY29udmVydGVycylhW2kudG9Mb3dlckNhc2UoKV09ZS5jb252ZXJ0ZXJzW2ldO2Zvcig7cj11Wysrc107KWlmKCIqIiE9PXIpe2lmKCIqIiE9PWwmJmwhPT1yKXtpZihpPWFbbCsiICIrcl18fGFbIiogIityXSwhaSlmb3IobiBpbiBhKWlmKG89bi5zcGxpdCgiICIpLG9bMV09PT1yJiYoaT1hW2wrIiAiK29bMF1dfHxhWyIqICIrb1swXV0pKXtpPT09ITA/aT1hW25dOmFbbl0hPT0hMCYmKHI9b1swXSx1LnNwbGljZShzLS0sMCxyKSk7YnJlYWt9aWYoaSE9PSEwKWlmKGkmJmVbInRocm93cyJdKXQ9aSh0KTtlbHNlIHRyeXt0PWkodCl9Y2F0Y2goYyl7cmV0dXJue3N0YXRlOiJwYXJzZXJlcnJvciIsZXJyb3I6aT9jOiJObyBjb252ZXJzaW9uIGZyb20gIitsKyIgdG8gIityfX19bD1yfXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTp0fX1iLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6Lyg/OmphdmF8ZWNtYSlzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGUpe3JldHVybiBiLmdsb2JhbEV2YWwoZSksZX19fSksYi5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGUpe2UuY2FjaGU9PT10JiYoZS5jYWNoZT0hMSksZS5jcm9zc0RvbWFpbiYmKGUudHlwZT0iR0VUIixlLmdsb2JhbD0hMSl9KSxiLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24oZSl7aWYoZS5jcm9zc0RvbWFpbil7dmFyIG4scj1vLmhlYWR8fGIoImhlYWQiKVswXXx8by5kb2N1bWVudEVsZW1lbnQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24odCxpKXtuPW8uY3JlYXRlRWxlbWVudCgic2NyaXB0Iiksbi5hc3luYz0hMCxlLnNjcmlwdENoYXJzZXQmJihuLmNoYXJzZXQ9ZS5zY3JpcHRDaGFyc2V0KSxuLnNyYz1lLnVybCxuLm9ubG9hZD1uLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihlLHQpeyh0fHwhbi5yZWFkeVN0YXRlfHwvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KG4ucmVhZHlTdGF0ZSkpJiYobi5vbmxvYWQ9bi5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxuLnBhcmVudE5vZGUmJm4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKSxuPW51bGwsdHx8aSgyMDAsInN1Y2Nlc3MiKSl9LHIuaW5zZXJ0QmVmb3JlKG4sci5maXJzdENoaWxkKX0sYWJvcnQ6ZnVuY3Rpb24oKXtuJiZuLm9ubG9hZCh0LCEwKX19fX0pO3ZhciBPbj1bXSxCbj0vKD0pXD8oPz0mfCQpfFw/XD8vO2IuYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXt2YXIgZT1Pbi5wb3AoKXx8Yi5leHBhbmRvKyJfIit2bisrO3JldHVybiB0aGlzW2VdPSEwLGV9fSksYi5hamF4UHJlZmlsdGVyKCJqc29uIGpzb25wIixmdW5jdGlvbihuLHIsaSl7dmFyIG8sYSxzLHU9bi5qc29ucCE9PSExJiYoQm4udGVzdChuLnVybCk/InVybCI6InN0cmluZyI9PXR5cGVvZiBuLmRhdGEmJiEobi5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiZCbi50ZXN0KG4uZGF0YSkmJiJkYXRhIik7cmV0dXJuIHV8fCJqc29ucCI9PT1uLmRhdGFUeXBlc1swXT8obz1uLmpzb25wQ2FsbGJhY2s9Yi5pc0Z1bmN0aW9uKG4uanNvbnBDYWxsYmFjayk/bi5qc29ucENhbGxiYWNrKCk6bi5qc29ucENhbGxiYWNrLHU/blt1XT1uW3VdLnJlcGxhY2UoQm4sIiQxIitvKTpuLmpzb25wIT09ITEmJihuLnVybCs9KGJuLnRlc3Qobi51cmwpPyImIjoiPyIpK24uanNvbnArIj0iK28pLG4uY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiBzfHxiLmVycm9yKG8rIiB3YXMgbm90IGNhbGxlZCIpLHNbMF19LG4uZGF0YVR5cGVzWzBdPSJqc29uIixhPWVbb10sZVtvXT1mdW5jdGlvbigpe3M9YXJndW1lbnRzfSxpLmFsd2F5cyhmdW5jdGlvbigpe2Vbb109YSxuW29dJiYobi5qc29ucENhbGxiYWNrPXIuanNvbnBDYWxsYmFjayxPbi5wdXNoKG8pKSxzJiZiLmlzRnVuY3Rpb24oYSkmJmEoc1swXSkscz1hPXR9KSwic2NyaXB0Iik6dH0pO3ZhciBQbixSbixXbj0wLCRuPWUuQWN0aXZlWE9iamVjdCYmZnVuY3Rpb24oKXt2YXIgZTtmb3IoZSBpbiBQbilQbltlXSh0LCEwKX07ZnVuY3Rpb24gSW4oKXt0cnl7cmV0dXJuIG5ldyBlLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKHQpe319ZnVuY3Rpb24gem4oKXt0cnl7cmV0dXJuIG5ldyBlLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2godCl7fX1iLmFqYXhTZXR0aW5ncy54aHI9ZS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNMb2NhbCYmSW4oKXx8em4oKX06SW4sUm49Yi5hamF4U2V0dGluZ3MueGhyKCksYi5zdXBwb3J0LmNvcnM9ISFSbiYmIndpdGhDcmVkZW50aWFscyJpbiBSbixSbj1iLnN1cHBvcnQuYWpheD0hIVJuLFJuJiZiLmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24obil7aWYoIW4uY3Jvc3NEb21haW58fGIuc3VwcG9ydC5jb3JzKXt2YXIgcjtyZXR1cm57c2VuZDpmdW5jdGlvbihpLG8pe3ZhciBhLHMsdT1uLnhocigpO2lmKG4udXNlcm5hbWU/dS5vcGVuKG4udHlwZSxuLnVybCxuLmFzeW5jLG4udXNlcm5hbWUsbi5wYXNzd29yZCk6dS5vcGVuKG4udHlwZSxuLnVybCxuLmFzeW5jKSxuLnhockZpZWxkcylmb3IocyBpbiBuLnhockZpZWxkcyl1W3NdPW4ueGhyRmllbGRzW3NdO24ubWltZVR5cGUmJnUub3ZlcnJpZGVNaW1lVHlwZSYmdS5vdmVycmlkZU1pbWVUeXBlKG4ubWltZVR5cGUpLG4uY3Jvc3NEb21haW58fGlbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGlbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTt0cnl7Zm9yKHMgaW4gaSl1LnNldFJlcXVlc3RIZWFkZXIocyxpW3NdKX1jYXRjaChsKXt9dS5zZW5kKG4uaGFzQ29udGVudCYmbi5kYXRhfHxudWxsKSxyPWZ1bmN0aW9uKGUsaSl7dmFyIHMsbCxjLHA7dHJ5e2lmKHImJihpfHw0PT09dS5yZWFkeVN0YXRlKSlpZihyPXQsYSYmKHUub25yZWFkeXN0YXRlY2hhbmdlPWIubm9vcCwkbiYmZGVsZXRlIFBuW2FdKSxpKTQhPT11LnJlYWR5U3RhdGUmJnUuYWJvcnQoKTtlbHNle3A9e30scz11LnN0YXR1cyxsPXUuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCksInN0cmluZyI9PXR5cGVvZiB1LnJlc3BvbnNlVGV4dCYmKHAudGV4dD11LnJlc3BvbnNlVGV4dCk7dHJ5e2M9dS5zdGF0dXNUZXh0fWNhdGNoKGYpe2M9IiJ9c3x8IW4uaXNMb2NhbHx8bi5jcm9zc0RvbWFpbj8xMjIzPT09cyYmKHM9MjA0KTpzPXAudGV4dD8yMDA6NDA0fX1jYXRjaChkKXtpfHxvKC0xLGQpfXAmJm8ocyxjLHAsbCl9LG4uYXN5bmM/ND09PXUucmVhZHlTdGF0ZT9zZXRUaW1lb3V0KHIpOihhPSsrV24sJG4mJihQbnx8KFBuPXt9LGIoZSkudW5sb2FkKCRuKSksUG5bYV09ciksdS5vbnJlYWR5c3RhdGVjaGFuZ2U9cik6cigpfSxhYm9ydDpmdW5jdGlvbigpe3ImJnIodCwhMCl9fX19KTt2YXIgWG4sVW4sVm49L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLFluPVJlZ0V4cCgiXig/OihbKy1dKT18KSgiK3grIikoW2EteiVdKikkIiwiaSIpLEpuPS9xdWV1ZUhvb2tzJC8sR249W25yXSxRbj17IioiOltmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT10aGlzLmNyZWF0ZVR3ZWVuKGUsdCksbz1Zbi5leGVjKHQpLGE9aS5jdXIoKSxzPSthfHwwLHU9MSxsPTIwO2lmKG8pe2lmKG49K29bMl0scj1vWzNdfHwoYi5jc3NOdW1iZXJbZV0/IiI6InB4IiksInB4IiE9PXImJnMpe3M9Yi5jc3MoaS5lbGVtLGUsITApfHxufHwxO2RvIHU9dXx8Ii41IixzLz11LGIuc3R5bGUoaS5lbGVtLGUscytyKTt3aGlsZSh1IT09KHU9aS5jdXIoKS9hKSYmMSE9PXUmJi0tbCl9aS51bml0PXIsaS5zdGFydD1zLGkuZW5kPW9bMV0/cysob1sxXSsxKSpuOm59cmV0dXJuIGl9XX07ZnVuY3Rpb24gS24oKXtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe1huPXR9KSxYbj1iLm5vdygpfWZ1bmN0aW9uIFpuKGUsdCl7Yi5lYWNoKHQsZnVuY3Rpb24odCxuKXt2YXIgcj0oUW5bdF18fFtdKS5jb25jYXQoUW5bIioiXSksaT0wLG89ci5sZW5ndGg7Zm9yKDtvPmk7aSsrKWlmKHJbaV0uY2FsbChlLHQsbikpcmV0dXJufSl9ZnVuY3Rpb24gZXIoZSx0LG4pe3ZhciByLGksbz0wLGE9R24ubGVuZ3RoLHM9Yi5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSB1LmVsZW19KSx1PWZ1bmN0aW9uKCl7aWYoaSlyZXR1cm4hMTt2YXIgdD1Ybnx8S24oKSxuPU1hdGgubWF4KDAsbC5zdGFydFRpbWUrbC5kdXJhdGlvbi10KSxyPW4vbC5kdXJhdGlvbnx8MCxvPTEtcixhPTAsdT1sLnR3ZWVucy5sZW5ndGg7Zm9yKDt1PmE7YSsrKWwudHdlZW5zW2FdLnJ1bihvKTtyZXR1cm4gcy5ub3RpZnlXaXRoKGUsW2wsbyxuXSksMT5vJiZ1P246KHMucmVzb2x2ZVdpdGgoZSxbbF0pLCExKX0sbD1zLnByb21pc2Uoe2VsZW06ZSxwcm9wczpiLmV4dGVuZCh7fSx0KSxvcHRzOmIuZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9fSxuKSxvcmlnaW5hbFByb3BlcnRpZXM6dCxvcmlnaW5hbE9wdGlvbnM6bixzdGFydFRpbWU6WG58fEtuKCksZHVyYXRpb246bi5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24odCxuKXt2YXIgcj1iLlR3ZWVuKGUsbC5vcHRzLHQsbixsLm9wdHMuc3BlY2lhbEVhc2luZ1t0XXx8bC5vcHRzLmVhc2luZyk7cmV0dXJuIGwudHdlZW5zLnB1c2gocikscn0sc3RvcDpmdW5jdGlvbih0KXt2YXIgbj0wLHI9dD9sLnR3ZWVucy5sZW5ndGg6MDtpZihpKXJldHVybiB0aGlzO2ZvcihpPSEwO3I+bjtuKyspbC50d2VlbnNbbl0ucnVuKDEpO3JldHVybiB0P3MucmVzb2x2ZVdpdGgoZSxbbCx0XSk6cy5yZWplY3RXaXRoKGUsW2wsdF0pLHRoaXN9fSksYz1sLnByb3BzO2Zvcih0cihjLGwub3B0cy5zcGVjaWFsRWFzaW5nKTthPm87bysrKWlmKHI9R25bb10uY2FsbChsLGUsYyxsLm9wdHMpKXJldHVybiByO3JldHVybiBabihsLGMpLGIuaXNGdW5jdGlvbihsLm9wdHMuc3RhcnQpJiZsLm9wdHMuc3RhcnQuY2FsbChlLGwpLGIuZngudGltZXIoYi5leHRlbmQodSx7ZWxlbTplLGFuaW06bCxxdWV1ZTpsLm9wdHMucXVldWV9KSksbC5wcm9ncmVzcyhsLm9wdHMucHJvZ3Jlc3MpLmRvbmUobC5vcHRzLmRvbmUsbC5vcHRzLmNvbXBsZXRlKS5mYWlsKGwub3B0cy5mYWlsKS5hbHdheXMobC5vcHRzLmFsd2F5cyl9ZnVuY3Rpb24gdHIoZSx0KXt2YXIgbixyLGksbyxhO2ZvcihpIGluIGUpaWYocj1iLmNhbWVsQ2FzZShpKSxvPXRbcl0sbj1lW2ldLGIuaXNBcnJheShuKSYmKG89blsxXSxuPWVbaV09blswXSksaSE9PXImJihlW3JdPW4sZGVsZXRlIGVbaV0pLGE9Yi5jc3NIb29rc1tyXSxhJiYiZXhwYW5kImluIGEpe249YS5leHBhbmQobiksZGVsZXRlIGVbcl07Zm9yKGkgaW4gbilpIGluIGV8fChlW2ldPW5baV0sdFtpXT1vKX1lbHNlIHRbcl09b31iLkFuaW1hdGlvbj1iLmV4dGVuZChlcix7dHdlZW5lcjpmdW5jdGlvbihlLHQpe2IuaXNGdW5jdGlvbihlKT8odD1lLGU9WyIqIl0pOmU9ZS5zcGxpdCgiICIpO3ZhciBuLHI9MCxpPWUubGVuZ3RoO2Zvcig7aT5yO3IrKyluPWVbcl0sUW5bbl09UW5bbl18fFtdLFFuW25dLnVuc2hpZnQodCl9LHByZWZpbHRlcjpmdW5jdGlvbihlLHQpe3Q/R24udW5zaGlmdChlKTpHbi5wdXNoKGUpfX0pO2Z1bmN0aW9uIG5yKGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbCxjLHAsZj10aGlzLGQ9ZS5zdHlsZSxoPXt9LGc9W10sbT1lLm5vZGVUeXBlJiZubihlKTtuLnF1ZXVlfHwoYz1iLl9xdWV1ZUhvb2tzKGUsImZ4IiksbnVsbD09Yy51bnF1ZXVlZCYmKGMudW5xdWV1ZWQ9MCxwPWMuZW1wdHkuZmlyZSxjLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXtjLnVucXVldWVkfHxwKCl9KSxjLnVucXVldWVkKyssZi5hbHdheXMoZnVuY3Rpb24oKXtmLmFsd2F5cyhmdW5jdGlvbigpe2MudW5xdWV1ZWQtLSxiLnF1ZXVlKGUsImZ4IikubGVuZ3RofHxjLmVtcHR5LmZpcmUoKX0pfSkpLDE9PT1lLm5vZGVUeXBlJiYoImhlaWdodCJpbiB0fHwid2lkdGgiaW4gdCkmJihuLm92ZXJmbG93PVtkLm92ZXJmbG93LGQub3ZlcmZsb3dYLGQub3ZlcmZsb3dZXSwiaW5saW5lIj09PWIuY3NzKGUsImRpc3BsYXkiKSYmIm5vbmUiPT09Yi5jc3MoZSwiZmxvYXQiKSYmKGIuc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0JiYiaW5saW5lIiE9PXVuKGUubm9kZU5hbWUpP2Quem9vbT0xOmQuZGlzcGxheT0iaW5saW5lLWJsb2NrIikpLG4ub3ZlcmZsb3cmJihkLm92ZXJmbG93PSJoaWRkZW4iLGIuc3VwcG9ydC5zaHJpbmtXcmFwQmxvY2tzfHxmLmFsd2F5cyhmdW5jdGlvbigpe2Qub3ZlcmZsb3c9bi5vdmVyZmxvd1swXSxkLm92ZXJmbG93WD1uLm92ZXJmbG93WzFdLGQub3ZlcmZsb3dZPW4ub3ZlcmZsb3dbMl19KSk7Zm9yKGkgaW4gdClpZihhPXRbaV0sVm4uZXhlYyhhKSl7aWYoZGVsZXRlIHRbaV0sdT11fHwidG9nZ2xlIj09PWEsYT09PShtPyJoaWRlIjoic2hvdyIpKWNvbnRpbnVlO2cucHVzaChpKX1pZihvPWcubGVuZ3RoKXtzPWIuX2RhdGEoZSwiZnhzaG93Iil8fGIuX2RhdGEoZSwiZnhzaG93Iix7fSksImhpZGRlbiJpbiBzJiYobT1zLmhpZGRlbiksdSYmKHMuaGlkZGVuPSFtKSxtP2IoZSkuc2hvdygpOmYuZG9uZShmdW5jdGlvbigpe2IoZSkuaGlkZSgpfSksZi5kb25lKGZ1bmN0aW9uKCl7dmFyIHQ7Yi5fcmVtb3ZlRGF0YShlLCJmeHNob3ciKTtmb3IodCBpbiBoKWIuc3R5bGUoZSx0LGhbdF0pfSk7Zm9yKGk9MDtvPmk7aSsrKXI9Z1tpXSxsPWYuY3JlYXRlVHdlZW4ocixtP3Nbcl06MCksaFtyXT1zW3JdfHxiLnN0eWxlKGUsciksciBpbiBzfHwoc1tyXT1sLnN0YXJ0LG0mJihsLmVuZD1sLnN0YXJ0LGwuc3RhcnQ9IndpZHRoIj09PXJ8fCJoZWlnaHQiPT09cj8xOjApKX19ZnVuY3Rpb24gcnIoZSx0LG4scixpKXtyZXR1cm4gbmV3IHJyLnByb3RvdHlwZS5pbml0KGUsdCxuLHIsaSl9Yi5Ud2Vlbj1ycixyci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnJyLGluaXQ6ZnVuY3Rpb24oZSx0LG4scixpLG8pe3RoaXMuZWxlbT1lLHRoaXMucHJvcD1uLHRoaXMuZWFzaW5nPWl8fCJzd2luZyIsdGhpcy5vcHRpb25zPXQsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPXIsdGhpcy51bml0PW98fChiLmNzc051bWJlcltuXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIGU9cnIucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIGUmJmUuZ2V0P2UuZ2V0KHRoaXMpOnJyLnByb3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbihlKXt2YXIgdCxuPXJyLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLnBvcz10PXRoaXMub3B0aW9ucy5kdXJhdGlvbj9iLmVhc2luZ1t0aGlzLmVhc2luZ10oZSx0aGlzLm9wdGlvbnMuZHVyYXRpb24qZSwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTplLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSp0K3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLG4mJm4uc2V0P24uc2V0KHRoaXMpOnJyLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LHJyLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT1yci5wcm90b3R5cGUscnIucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiBudWxsPT1lLmVsZW1bZS5wcm9wXXx8ZS5lbGVtLnN0eWxlJiZudWxsIT1lLmVsZW0uc3R5bGVbZS5wcm9wXT8odD1iLmNzcyhlLmVsZW0sZS5wcm9wLCIiKSx0JiYiYXV0byIhPT10P3Q6MCk6ZS5lbGVtW2UucHJvcF19LHNldDpmdW5jdGlvbihlKXtiLmZ4LnN0ZXBbZS5wcm9wXT9iLmZ4LnN0ZXBbZS5wcm9wXShlKTplLmVsZW0uc3R5bGUmJihudWxsIT1lLmVsZW0uc3R5bGVbYi5jc3NQcm9wc1tlLnByb3BdXXx8Yi5jc3NIb29rc1tlLnByb3BdKT9iLnN0eWxlKGUuZWxlbSxlLnByb3AsZS5ub3crZS51bml0KTplLmVsZW1bZS5wcm9wXT1lLm5vd319fSxyci5wcm9wSG9va3Muc2Nyb2xsVG9wPXJyLnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oZSl7ZS5lbGVtLm5vZGVUeXBlJiZlLmVsZW0ucGFyZW50Tm9kZSYmKGUuZWxlbVtlLnByb3BdPWUubm93KX19LGIuZWFjaChbInRvZ2dsZSIsInNob3ciLCJoaWRlIl0sZnVuY3Rpb24oZSx0KXt2YXIgbj1iLmZuW3RdO2IuZm5bdF09ZnVuY3Rpb24oZSxyLGkpe3JldHVybiBudWxsPT1lfHwiYm9vbGVhbiI9PXR5cGVvZiBlP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOnRoaXMuYW5pbWF0ZShpcih0LCEwKSxlLHIsaSl9fSksYi5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5maWx0ZXIobm4pLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6dH0sZSxuLHIpfSxhbmltYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPWIuaXNFbXB0eU9iamVjdChlKSxvPWIuc3BlZWQodCxuLHIpLGE9ZnVuY3Rpb24oKXt2YXIgdD1lcih0aGlzLGIuZXh0ZW5kKHt9LGUpLG8pO2EuZmluaXNoPWZ1bmN0aW9uKCl7dC5zdG9wKCEwKX0sKGl8fGIuX2RhdGEodGhpcywiZmluaXNoIikpJiZ0LnN0b3AoITApfTtyZXR1cm4gYS5maW5pc2g9YSxpfHxvLnF1ZXVlPT09ITE/dGhpcy5lYWNoKGEpOnRoaXMucXVldWUoby5xdWV1ZSxhKX0sc3RvcDpmdW5jdGlvbihlLG4scil7dmFyIGk9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdG9wO2RlbGV0ZSBlLnN0b3AsdChyKX07cmV0dXJuInN0cmluZyIhPXR5cGVvZiBlJiYocj1uLG49ZSxlPXQpLG4mJmUhPT0hMSYmdGhpcy5xdWV1ZShlfHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD0hMCxuPW51bGwhPWUmJmUrInF1ZXVlSG9va3MiLG89Yi50aW1lcnMsYT1iLl9kYXRhKHRoaXMpO2lmKG4pYVtuXSYmYVtuXS5zdG9wJiZpKGFbbl0pO2Vsc2UgZm9yKG4gaW4gYSlhW25dJiZhW25dLnN0b3AmJkpuLnRlc3QobikmJmkoYVtuXSk7Zm9yKG49by5sZW5ndGg7bi0tOylvW25dLmVsZW0hPT10aGlzfHxudWxsIT1lJiZvW25dLnF1ZXVlIT09ZXx8KG9bbl0uYW5pbS5zdG9wKHIpLHQ9ITEsby5zcGxpY2UobiwxKSk7KHR8fCFyKSYmYi5kZXF1ZXVlKHRoaXMsZSl9KX0sZmluaXNoOmZ1bmN0aW9uKGUpe3JldHVybiBlIT09ITEmJihlPWV8fCJmeCIpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0LG49Yi5fZGF0YSh0aGlzKSxyPW5bZSsicXVldWUiXSxpPW5bZSsicXVldWVIb29rcyJdLG89Yi50aW1lcnMsYT1yP3IubGVuZ3RoOjA7Zm9yKG4uZmluaXNoPSEwLGIucXVldWUodGhpcyxlLFtdKSxpJiZpLmN1ciYmaS5jdXIuZmluaXNoJiZpLmN1ci5maW5pc2guY2FsbCh0aGlzKSx0PW8ubGVuZ3RoO3QtLTspb1t0XS5lbGVtPT09dGhpcyYmb1t0XS5xdWV1ZT09PWUmJihvW3RdLmFuaW0uc3RvcCghMCksby5zcGxpY2UodCwxKSk7Zm9yKHQ9MDthPnQ7dCsrKXJbdF0mJnJbdF0uZmluaXNoJiZyW3RdLmZpbmlzaC5jYWxsKHRoaXMpO2RlbGV0ZSBuLmZpbmlzaH0pfX0pO2Z1bmN0aW9uIGlyKGUsdCl7dmFyIG4scj17aGVpZ2h0OmV9LGk9MDtmb3IodD10PzE6MDs0Pmk7aSs9Mi10KW49WnRbaV0sclsibWFyZ2luIituXT1yWyJwYWRkaW5nIituXT1lO3JldHVybiB0JiYoci5vcGFjaXR5PXIud2lkdGg9ZSkscn1iLmVhY2goe3NsaWRlRG93bjppcigic2hvdyIpLHNsaWRlVXA6aXIoImhpZGUiKSxzbGlkZVRvZ2dsZTppcigidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihlLHQpe2IuZm5bZV09ZnVuY3Rpb24oZSxuLHIpe3JldHVybiB0aGlzLmFuaW1hdGUodCxlLG4scil9fSksYi5zcGVlZD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZSYmIm9iamVjdCI9PXR5cGVvZiBlP2IuZXh0ZW5kKHt9LGUpOntjb21wbGV0ZTpufHwhbiYmdHx8Yi5pc0Z1bmN0aW9uKGUpJiZlLGR1cmF0aW9uOmUsZWFzaW5nOm4mJnR8fHQmJiFiLmlzRnVuY3Rpb24odCkmJnR9O3JldHVybiByLmR1cmF0aW9uPWIuZngub2ZmPzA6Im51bWJlciI9PXR5cGVvZiByLmR1cmF0aW9uP3IuZHVyYXRpb246ci5kdXJhdGlvbiBpbiBiLmZ4LnNwZWVkcz9iLmZ4LnNwZWVkc1tyLmR1cmF0aW9uXTpiLmZ4LnNwZWVkcy5fZGVmYXVsdCwobnVsbD09ci5xdWV1ZXx8ci5xdWV1ZT09PSEwKSYmKHIucXVldWU9ImZ4Iiksci5vbGQ9ci5jb21wbGV0ZSxyLmNvbXBsZXRlPWZ1bmN0aW9uKCl7Yi5pc0Z1bmN0aW9uKHIub2xkKSYmci5vbGQuY2FsbCh0aGlzKSxyLnF1ZXVlJiZiLmRlcXVldWUodGhpcyxyLnF1ZXVlKX0scn0sYi5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihlKXtyZXR1cm4gZX0sc3dpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuLjUtTWF0aC5jb3MoZSpNYXRoLlBJKS8yfX0sYi50aW1lcnM9W10sYi5meD1yci5wcm90b3R5cGUuaW5pdCxiLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgZSxuPWIudGltZXJzLHI9MDtmb3IoWG49Yi5ub3coKTtuLmxlbmd0aD5yO3IrKyllPW5bcl0sZSgpfHxuW3JdIT09ZXx8bi5zcGxpY2Uoci0tLDEpO24ubGVuZ3RofHxiLmZ4LnN0b3AoKSxYbj10fSxiLmZ4LnRpbWVyPWZ1bmN0aW9uKGUpe2UoKSYmYi50aW1lcnMucHVzaChlKSYmYi5meC5zdGFydCgpfSxiLmZ4LmludGVydmFsPTEzLGIuZnguc3RhcnQ9ZnVuY3Rpb24oKXtVbnx8KFVuPXNldEludGVydmFsKGIuZngudGljayxiLmZ4LmludGVydmFsKSl9LGIuZnguc3RvcD1mdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoVW4pLFVuPW51bGx9LGIuZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LGIuZnguc3RlcD17fSxiLmV4cHImJmIuZXhwci5maWx0ZXJzJiYoYi5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGIuZ3JlcChiLnRpbWVycyxmdW5jdGlvbih0KXtyZXR1cm4gZT09PXQuZWxlbX0pLmxlbmd0aH0pLGIuZm4ub2Zmc2V0PWZ1bmN0aW9uKGUpe2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGU9PT10P3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKHQpe2Iub2Zmc2V0LnNldE9mZnNldCh0aGlzLGUsdCl9KTt2YXIgbixyLG89e3RvcDowLGxlZnQ6MH0sYT10aGlzWzBdLHM9YSYmYS5vd25lckRvY3VtZW50O2lmKHMpcmV0dXJuIG49cy5kb2N1bWVudEVsZW1lbnQsYi5jb250YWlucyhuLGEpPyh0eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QhPT1pJiYobz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSxyPW9yKHMpLHt0b3A6by50b3ArKHIucGFnZVlPZmZzZXR8fG4uc2Nyb2xsVG9wKS0obi5jbGllbnRUb3B8fDApLGxlZnQ6by5sZWZ0KyhyLnBhZ2VYT2Zmc2V0fHxuLnNjcm9sbExlZnQpLShuLmNsaWVudExlZnR8fDApfSk6b30sYi5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihlLHQsbil7dmFyIHI9Yi5jc3MoZSwicG9zaXRpb24iKTsic3RhdGljIj09PXImJihlLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpO3ZhciBpPWIoZSksbz1pLm9mZnNldCgpLGE9Yi5jc3MoZSwidG9wIikscz1iLmNzcyhlLCJsZWZ0IiksdT0oImFic29sdXRlIj09PXJ8fCJmaXhlZCI9PT1yKSYmYi5pbkFycmF5KCJhdXRvIixbYSxzXSk+LTEsbD17fSxjPXt9LHAsZjt1PyhjPWkucG9zaXRpb24oKSxwPWMudG9wLGY9Yy5sZWZ0KToocD1wYXJzZUZsb2F0KGEpfHwwLGY9cGFyc2VGbG9hdChzKXx8MCksYi5pc0Z1bmN0aW9uKHQpJiYodD10LmNhbGwoZSxuLG8pKSxudWxsIT10LnRvcCYmKGwudG9wPXQudG9wLW8udG9wK3ApLG51bGwhPXQubGVmdCYmKGwubGVmdD10LmxlZnQtby5sZWZ0K2YpLCJ1c2luZyJpbiB0P3QudXNpbmcuY2FsbChlLGwpOmkuY3NzKGwpfX0sYi5mbi5leHRlbmQoe3Bvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGUsdCxuPXt0b3A6MCxsZWZ0OjB9LHI9dGhpc1swXTtyZXR1cm4iZml4ZWQiPT09Yi5jc3MociwicG9zaXRpb24iKT90PXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk6KGU9dGhpcy5vZmZzZXRQYXJlbnQoKSx0PXRoaXMub2Zmc2V0KCksYi5ub2RlTmFtZShlWzBdLCJodG1sIil8fChuPWUub2Zmc2V0KCkpLG4udG9wKz1iLmNzcyhlWzBdLCJib3JkZXJUb3BXaWR0aCIsITApLG4ubGVmdCs9Yi5jc3MoZVswXSwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpLHt0b3A6dC50b3Atbi50b3AtYi5jc3MociwibWFyZ2luVG9wIiwhMCksbGVmdDp0LmxlZnQtbi5sZWZ0LWIuY3NzKHIsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9mZnNldFBhcmVudHx8by5kb2N1bWVudEVsZW1lbnQ7d2hpbGUoZSYmIWIubm9kZU5hbWUoZSwiaHRtbCIpJiYic3RhdGljIj09PWIuY3NzKGUsInBvc2l0aW9uIikpZT1lLm9mZnNldFBhcmVudDtyZXR1cm4gZXx8by5kb2N1bWVudEVsZW1lbnR9KX19KSxiLmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24oZSxuKXt2YXIgcj0vWS8udGVzdChuKTtiLmZuW2VdPWZ1bmN0aW9uKGkpe3JldHVybiBiLmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGUsaSxvKXt2YXIgYT1vcihlKTtyZXR1cm4gbz09PXQ/YT9uIGluIGE/YVtuXTphLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtpXTplW2ldOihhP2Euc2Nyb2xsVG8ocj9iKGEpLnNjcm9sbExlZnQoKTpvLHI/bzpiKGEpLnNjcm9sbFRvcCgpKTplW2ldPW8sdCl9LGUsaSxhcmd1bWVudHMubGVuZ3RoLG51bGwpfX0pO2Z1bmN0aW9uIG9yKGUpe3JldHVybiBiLmlzV2luZG93KGUpP2U6OT09PWUubm9kZVR5cGU/ZS5kZWZhdWx0Vmlld3x8ZS5wYXJlbnRXaW5kb3c6ITF9Yi5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24oZSxuKXtiLmVhY2goe3BhZGRpbmc6ImlubmVyIitlLGNvbnRlbnQ6biwiIjoib3V0ZXIiK2V9LGZ1bmN0aW9uKHIsaSl7Yi5mbltpXT1mdW5jdGlvbihpLG8pe3ZhciBhPWFyZ3VtZW50cy5sZW5ndGgmJihyfHwiYm9vbGVhbiIhPXR5cGVvZiBpKSxzPXJ8fChpPT09ITB8fG89PT0hMD8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuIGIuYWNjZXNzKHRoaXMsZnVuY3Rpb24obixyLGkpe3ZhciBvO3JldHVybiBiLmlzV2luZG93KG4pP24uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2VdOjk9PT1uLm5vZGVUeXBlPyhvPW4uZG9jdW1lbnRFbGVtZW50LE1hdGgubWF4KG4uYm9keVsic2Nyb2xsIitlXSxvWyJzY3JvbGwiK2VdLG4uYm9keVsib2Zmc2V0IitlXSxvWyJvZmZzZXQiK2VdLG9bImNsaWVudCIrZV0pKTppPT09dD9iLmNzcyhuLHIscyk6Yi5zdHlsZShuLHIsaSxzKX0sbixhP2k6dCxhLG51bGwpfX0pfSksZS5qUXVlcnk9ZS4kPWIsImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lLmFtZC5qUXVlcnkmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiBifSl9KSh3aW5kb3cpOw==' type='text/javascript'></script>
<script src='data:application/javascript;base64,LyoKIEhpZ2hjaGFydHMgSlMgdjMuMC4xICgyMDEzLTA0LTA5KQoKIChjKSAyMDA5LTIwMTMgVG9yc3RlaW4gSMO4bnNpCgogTGljZW5zZTogd3d3LmhpZ2hjaGFydHMuY29tL2xpY2Vuc2UKKi8KKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdihhLGIpe3ZhciBjO2F8fChhPXt9KTtmb3IoYyBpbiBiKWFbY109YltjXTtyZXR1cm4gYX1mdW5jdGlvbiB5KCl7dmFyIGEsYj1hcmd1bWVudHMubGVuZ3RoLGM9e30sZD1mdW5jdGlvbihhLGIpe3ZhciBjLGg7Zm9yKGggaW4gYiliLmhhc093blByb3BlcnR5KGgpJiYoYz1iW2hdLHR5cGVvZiBhIT09Im9iamVjdCImJihhPXt9KSxhW2hdPWMmJnR5cGVvZiBjPT09Im9iamVjdCImJk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChjKSE9PSJbb2JqZWN0IEFycmF5XSImJnR5cGVvZiBjLm5vZGVUeXBlIT09Im51bWJlciI/ZChhW2hdfHx7fSxjKTpiW2hdKTtyZXR1cm4gYX07Zm9yKGE9MDthPGI7YSsrKWM9ZChjLGFyZ3VtZW50c1thXSk7cmV0dXJuIGN9ZnVuY3Rpb24gdShhLGIpe3JldHVybiBwYXJzZUludChhLGJ8fDEwKX1mdW5jdGlvbiBmYShhKXtyZXR1cm4gdHlwZW9mIGE9PT0ic3RyaW5nIn1mdW5jdGlvbiBWKGEpe3JldHVybiB0eXBlb2YgYT09PQoib2JqZWN0In1mdW5jdGlvbiBCYShhKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpPT09IltvYmplY3QgQXJyYXldIn1mdW5jdGlvbiBDYShhKXtyZXR1cm4gdHlwZW9mIGE9PT0ibnVtYmVyIn1mdW5jdGlvbiBrYShhKXtyZXR1cm4gSS5sb2coYSkvSS5MTjEwfWZ1bmN0aW9uIGRhKGEpe3JldHVybiBJLnBvdygxMCxhKX1mdW5jdGlvbiBnYShhLGIpe2Zvcih2YXIgYz1hLmxlbmd0aDtjLS07KWlmKGFbY109PT1iKXthLnNwbGljZShjLDEpO2JyZWFrfX1mdW5jdGlvbiByKGEpe3JldHVybiBhIT09eCYmYSE9PW51bGx9ZnVuY3Rpb24gQShhLGIsYyl7dmFyIGQsZTtpZihmYShiKSlyKGMpP2Euc2V0QXR0cmlidXRlKGIsYyk6YSYmYS5nZXRBdHRyaWJ1dGUmJihlPWEuZ2V0QXR0cmlidXRlKGIpKTtlbHNlIGlmKHIoYikmJlYoYikpZm9yKGQgaW4gYilhLnNldEF0dHJpYnV0ZShkLGJbZF0pO3JldHVybiBlfWZ1bmN0aW9uIGhhKGEpe3JldHVybiBCYShhKT8KYTpbYV19ZnVuY3Rpb24gbygpe3ZhciBhPWFyZ3VtZW50cyxiLGMsZD1hLmxlbmd0aDtmb3IoYj0wO2I8ZDtiKyspaWYoYz1hW2JdLHR5cGVvZiBjIT09InVuZGVmaW5lZCImJmMhPT1udWxsKXJldHVybiBjfWZ1bmN0aW9uIEwoYSxiKXtpZihEYSYmYiYmYi5vcGFjaXR5IT09eCliLmZpbHRlcj0iYWxwaGEob3BhY2l0eT0iK2Iub3BhY2l0eSoxMDArIikiO3YoYS5zdHlsZSxiKX1mdW5jdGlvbiBVKGEsYixjLGQsZSl7YT16LmNyZWF0ZUVsZW1lbnQoYSk7YiYmdihhLGIpO2UmJkwoYSx7cGFkZGluZzowLGJvcmRlcjpTLG1hcmdpbjowfSk7YyYmTChhLGMpO2QmJmQuYXBwZW5kQ2hpbGQoYSk7cmV0dXJuIGF9ZnVuY3Rpb24gZWEoYSxiKXt2YXIgYz1mdW5jdGlvbigpe307Yy5wcm90b3R5cGU9bmV3IGE7dihjLnByb3RvdHlwZSxiKTtyZXR1cm4gY31mdW5jdGlvbiBOYShhLGIsYyxkKXt2YXIgZT1OLmxhbmcsZj1iPT09LTE/KChhfHwwKS50b1N0cmluZygpLnNwbGl0KCIuIilbMV18fAoiIikubGVuZ3RoOmlzTmFOKGI9UShiKSk/MjpiLGI9Yz09PXZvaWQgMD9lLmRlY2ltYWxQb2ludDpjLGQ9ZD09PXZvaWQgMD9lLnRob3VzYW5kc1NlcDpkLGU9YTwwPyItIjoiIixjPVN0cmluZyh1KGE9USgrYXx8MCkudG9GaXhlZChmKSkpLGc9Yy5sZW5ndGg+Mz9jLmxlbmd0aCUzOjA7cmV0dXJuIGUrKGc/Yy5zdWJzdHIoMCxnKStkOiIiKStjLnN1YnN0cihnKS5yZXBsYWNlKC8oXGR7M30pKD89XGQpL2csIiQxIitkKSsoZj9iK1EoYS1jKS50b0ZpeGVkKGYpLnNsaWNlKDIpOiIiKX1mdW5jdGlvbiB1YShhLGIpe3JldHVybiBBcnJheSgoYnx8MikrMS1TdHJpbmcoYSkubGVuZ3RoKS5qb2luKDApK2F9ZnVuY3Rpb24gRWEoYSxiKXtmb3IodmFyIGM9InsiLGQ9ITEsZSxmLGcsaCxpLGo9W107KGM9YS5pbmRleE9mKGMpKSE9PS0xOyl7ZT1hLnNsaWNlKDAsYyk7aWYoZCl7Zj1lLnNwbGl0KCI6Iik7Zz1mLnNoaWZ0KCkuc3BsaXQoIi4iKTtpPWcubGVuZ3RoO2U9Yjtmb3IoaD0wO2g8Cmk7aCsrKWU9ZVtnW2hdXTtpZihmLmxlbmd0aClmPWYuam9pbigiOiIpLGc9L1wuKFswLTldKS8saD1OLmxhbmcsaT12b2lkIDAsL2YkLy50ZXN0KGYpPyhpPShpPWYubWF0Y2goZykpP2lbMV06LTEsZT1OYShlLGksaC5kZWNpbWFsUG9pbnQsZi5pbmRleE9mKCIsIik+LTE/aC50aG91c2FuZHNTZXA6IiIpKTplPVVhKGYsZSl9ai5wdXNoKGUpO2E9YS5zbGljZShjKzEpO2M9KGQ9IWQpPyJ9IjoieyJ9ai5wdXNoKGEpO3JldHVybiBqLmpvaW4oIiIpfWZ1bmN0aW9uIGliKGEsYixjLGQpe3ZhciBlLGM9byhjLDEpO2U9YS9jO2J8fChiPVsxLDIsMi41LDUsMTBdLGQmJmQuYWxsb3dEZWNpbWFscz09PSExJiYoYz09PTE/Yj1bMSwyLDUsMTBdOmM8PTAuMSYmKGI9WzEvY10pKSk7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylpZihhPWJbZF0sZTw9KGJbZF0rKGJbZCsxXXx8YltkXSkpLzIpYnJlYWs7YSo9YztyZXR1cm4gYX1mdW5jdGlvbiB5YihhLGIpe3ZhciBjPWJ8fFtbemIsWzEsMiw1LAoxMCwyMCwyNSw1MCwxMDAsMjAwLDUwMF1dLFtqYixbMSwyLDUsMTAsMTUsMzBdXSxbVmEsWzEsMiw1LDEwLDE1LDMwXV0sW09hLFsxLDIsMyw0LDYsOCwxMl1dLFtvYSxbMSwyXV0sW1dhLFsxLDJdXSxbUGEsWzEsMiwzLDQsNl1dLFt2YSxudWxsXV0sZD1jW2MubGVuZ3RoLTFdLGU9RVtkWzBdXSxmPWRbMV0sZztmb3IoZz0wO2c8Yy5sZW5ndGg7ZysrKWlmKGQ9Y1tnXSxlPUVbZFswXV0sZj1kWzFdLGNbZysxXSYmYTw9KGUqZltmLmxlbmd0aC0xXStFW2NbZysxXVswXV0pLzIpYnJlYWs7ZT09PUVbdmFdJiZhPDUqZSYmKGY9WzEsMiw1XSk7ZT09PUVbdmFdJiZhPDUqZSYmKGY9WzEsMiw1XSk7Yz1pYihhL2UsZik7cmV0dXJue3VuaXRSYW5nZTplLGNvdW50OmMsdW5pdE5hbWU6ZFswXX19ZnVuY3Rpb24gQWIoYSxiLGMsZCl7dmFyIGU9W10sZj17fSxnPU4uZ2xvYmFsLnVzZVVUQyxoLGk9bmV3IERhdGUoYiksaj1hLnVuaXRSYW5nZSxrPWEuY291bnQ7aWYocihiKSl7aj49RVtqYl0mJgooaS5zZXRNaWxsaXNlY29uZHMoMCksaS5zZXRTZWNvbmRzKGo+PUVbVmFdPzA6aypUKGkuZ2V0U2Vjb25kcygpL2spKSk7aWYoaj49RVtWYV0paVtCYl0oaj49RVtPYV0/MDprKlQoaVtrYl0oKS9rKSk7aWYoaj49RVtPYV0paVtDYl0oaj49RVtvYV0/MDprKlQoaVtsYl0oKS9rKSk7aWYoaj49RVtvYV0paVttYl0oaj49RVtQYV0/MTprKlQoaVtRYV0oKS9rKSk7aj49RVtQYV0mJihpW0RiXShqPj1FW3ZhXT8wOmsqVChpW1hhXSgpL2spKSxoPWlbWWFdKCkpO2o+PUVbdmFdJiYoaC09aCVrLGlbRWJdKGgpKTtpZihqPT09RVtXYV0paVttYl0oaVtRYV0oKS1pW25iXSgpK28oZCwxKSk7Yj0xO2g9aVtZYV0oKTtmb3IodmFyIGQ9aS5nZXRUaW1lKCksbT1pW1hhXSgpLGw9aVtRYV0oKSxpPWc/MDooODY0RTUraS5nZXRUaW1lem9uZU9mZnNldCgpKjZFNCklODY0RTU7ZDxjOyllLnB1c2goZCksaj09PUVbdmFdP2Q9WmEoaCtiKmssMCk6aj09PUVbUGFdP2Q9WmEoaCxtK2Iqayk6IWcmJihqPT09CkVbb2FdfHxqPT09RVtXYV0pP2Q9WmEoaCxtLGwrYiprKihqPT09RVtvYV0/MTo3KSk6KGo8PUVbT2FdJiZkJUVbb2FdPT09aSYmKGZbZF09b2EpLGQrPWoqayksYisrO2UucHVzaChkKX1lLmluZm89dihhLHtoaWdoZXJSYW5rczpmLHRvdGFsUmFuZ2U6aiprfSk7cmV0dXJuIGV9ZnVuY3Rpb24gRmIoKXt0aGlzLnN5bWJvbD10aGlzLmNvbG9yPTB9ZnVuY3Rpb24gR2IoYSxiKXt2YXIgYz1hLmxlbmd0aCxkLGU7Zm9yKGU9MDtlPGM7ZSsrKWFbZV0uc3NfaT1lO2Euc29ydChmdW5jdGlvbihhLGMpe2Q9YihhLGMpO3JldHVybiBkPT09MD9hLnNzX2ktYy5zc19pOmR9KTtmb3IoZT0wO2U8YztlKyspZGVsZXRlIGFbZV0uc3NfaX1mdW5jdGlvbiBGYShhKXtmb3IodmFyIGI9YS5sZW5ndGgsYz1hWzBdO2ItLTspYVtiXTxjJiYoYz1hW2JdKTtyZXR1cm4gY31mdW5jdGlvbiBwYShhKXtmb3IodmFyIGI9YS5sZW5ndGgsYz1hWzBdO2ItLTspYVtiXT5jJiYoYz1hW2JdKTtyZXR1cm4gY31mdW5jdGlvbiBHYShhLApiKXtmb3IodmFyIGMgaW4gYSlhW2NdJiZhW2NdIT09YiYmYVtjXS5kZXN0cm95JiZhW2NdLmRlc3Ryb3koKSxkZWxldGUgYVtjXX1mdW5jdGlvbiBSYShhKXskYXx8KCRhPVUod2EpKTthJiYkYS5hcHBlbmRDaGlsZChhKTskYS5pbm5lckhUTUw9IiJ9ZnVuY3Rpb24gcWEoYSxiKXt2YXIgYz0iSGlnaGNoYXJ0cyBlcnJvciAjIithKyI6IHd3dy5oaWdoY2hhcnRzLmNvbS9lcnJvcnMvIithO2lmKGIpdGhyb3cgYztlbHNlIE8uY29uc29sZSYmY29uc29sZS5sb2coYyl9ZnVuY3Rpb24gaWEoYSl7cmV0dXJuIHBhcnNlRmxvYXQoYS50b1ByZWNpc2lvbigxNCkpfWZ1bmN0aW9uIEhhKGEsYil7eGE9byhhLGIuYW5pbWF0aW9uKX1mdW5jdGlvbiBIYigpe3ZhciBhPU4uZ2xvYmFsLnVzZVVUQyxiPWE/ImdldFVUQyI6ImdldCIsYz1hPyJzZXRVVEMiOiJzZXQiO1phPWE/RGF0ZS5VVEM6ZnVuY3Rpb24oYSxiLGMsZyxoLGkpe3JldHVybihuZXcgRGF0ZShhLGIsbyhjLDEpLG8oZywwKSxvKGgsCjApLG8oaSwwKSkpLmdldFRpbWUoKX07a2I9YisiTWludXRlcyI7bGI9YisiSG91cnMiO25iPWIrIkRheSI7UWE9YisiRGF0ZSI7WGE9YisiTW9udGgiO1lhPWIrIkZ1bGxZZWFyIjtCYj1jKyJNaW51dGVzIjtDYj1jKyJIb3VycyI7bWI9YysiRGF0ZSI7RGI9YysiTW9udGgiO0ViPWMrIkZ1bGxZZWFyIn1mdW5jdGlvbiByYSgpe31mdW5jdGlvbiBJYShhLGIsYyxkKXt0aGlzLmF4aXM9YTt0aGlzLnBvcz1iO3RoaXMudHlwZT1jfHwiIjt0aGlzLmlzTmV3PSEwOyFjJiYhZCYmdGhpcy5hZGRMYWJlbCgpfWZ1bmN0aW9uIG9iKGEsYil7dGhpcy5heGlzPWE7aWYoYil0aGlzLm9wdGlvbnM9Yix0aGlzLmlkPWIuaWR9ZnVuY3Rpb24gSWIoYSxiLGMsZCxlLGYpe3ZhciBnPWEuY2hhcnQuaW52ZXJ0ZWQ7dGhpcy5heGlzPWE7dGhpcy5pc05lZ2F0aXZlPWM7dGhpcy5vcHRpb25zPWI7dGhpcy54PWQ7dGhpcy5zdGFjaz1lO3RoaXMucGVyY2VudD1mPT09InBlcmNlbnQiO3RoaXMuYWxpZ25PcHRpb25zPQp7YWxpZ246Yi5hbGlnbnx8KGc/Yz8ibGVmdCI6InJpZ2h0IjoiY2VudGVyIiksdmVydGljYWxBbGlnbjpiLnZlcnRpY2FsQWxpZ258fChnPyJtaWRkbGUiOmM/ImJvdHRvbSI6InRvcCIpLHk6byhiLnksZz80OmM/MTQ6LTYpLHg6byhiLngsZz9jPy02OjY6MCl9O3RoaXMudGV4dEFsaWduPWIudGV4dEFsaWdufHwoZz9jPyJyaWdodCI6ImxlZnQiOiJjZW50ZXIiKX1mdW5jdGlvbiBhYigpe3RoaXMuaW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gcGIoKXt0aGlzLmluaXQuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIHFiKGEsYil7dGhpcy5pbml0KGEsYil9ZnVuY3Rpb24gcmIoYSxiKXt0aGlzLmluaXQoYSxiKX1mdW5jdGlvbiBzYigpe3RoaXMuaW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dmFyIHgsej1kb2N1bWVudCxPPXdpbmRvdyxJPU1hdGgsdD1JLnJvdW5kLFQ9SS5mbG9vcixqYT1JLmNlaWwscT1JLm1heCxLPUkubWluLFE9SS5hYnMsWT1JLmNvcywKY2E9SS5zaW4sSmE9SS5QSSxiYj1KYSoyLzM2MCx5YT1uYXZpZ2F0b3IudXNlckFnZW50LEpiPU8ub3BlcmEsRGE9L21zaWUvaS50ZXN0KHlhKSYmIUpiLGNiPXouZG9jdW1lbnRNb2RlPT09OCxkYj0vQXBwbGVXZWJLaXQvLnRlc3QoeWEpLGViPS9GaXJlZm94Ly50ZXN0KHlhKSxLYj0vKE1vYmlsZXxBbmRyb2lkfFdpbmRvd3MgUGhvbmUpLy50ZXN0KHlhKSxzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLFo9ISF6LmNyZWF0ZUVsZW1lbnROUyYmISF6LmNyZWF0ZUVsZW1lbnROUyhzYSwic3ZnIikuY3JlYXRlU1ZHUmVjdCxSYj1lYiYmcGFyc2VJbnQoeWEuc3BsaXQoIkZpcmVmb3gvIilbMV0sMTApPDQsJD0hWiYmIURhJiYhIXouY3JlYXRlRWxlbWVudCgiY2FudmFzIikuZ2V0Q29udGV4dCxTYSxmYj16LmRvY3VtZW50RWxlbWVudC5vbnRvdWNoc3RhcnQhPT14LExiPXt9LHRiPTAsJGEsTixVYSx4YSx1YixFLHRhPWZ1bmN0aW9uKCl7fSx6YT1bXSx3YT0iZGl2IixTPSJub25lIiwKTWI9InJnYmEoMTkyLDE5MiwxOTIsIisoWj8xLjBFLTQ6MC4wMDIpKyIpIix6Yj0ibWlsbGlzZWNvbmQiLGpiPSJzZWNvbmQiLFZhPSJtaW51dGUiLE9hPSJob3VyIixvYT0iZGF5IixXYT0id2VlayIsUGE9Im1vbnRoIix2YT0ieWVhciIsTmI9InN0cm9rZS13aWR0aCIsWmEsa2IsbGIsbmIsUWEsWGEsWWEsQmIsQ2IsbWIsRGIsRWIsYWE9e307Ty5IaWdoY2hhcnRzPU8uSGlnaGNoYXJ0cz9xYSgxNiwhMCk6e307VWE9ZnVuY3Rpb24oYSxiLGMpe2lmKCFyKGIpfHxpc05hTihiKSlyZXR1cm4iSW52YWxpZCBkYXRlIjt2YXIgYT1vKGEsIiVZLSVtLSVkICVIOiVNOiVTIiksZD1uZXcgRGF0ZShiKSxlLGY9ZFtsYl0oKSxnPWRbbmJdKCksaD1kW1FhXSgpLGk9ZFtYYV0oKSxqPWRbWWFdKCksaz1OLmxhbmcsbT1rLndlZWtkYXlzLGQ9dih7YTptW2ddLnN1YnN0cigwLDMpLEE6bVtnXSxkOnVhKGgpLGU6aCxiOmsuc2hvcnRNb250aHNbaV0sQjprLm1vbnRoc1tpXSxtOnVhKGkrMSkseTpqLnRvU3RyaW5nKCkuc3Vic3RyKDIsCjIpLFk6aixIOnVhKGYpLEk6dWEoZiUxMnx8MTIpLGw6ZiUxMnx8MTIsTTp1YShkW2tiXSgpKSxwOmY8MTI/IkFNIjoiUE0iLFA6ZjwxMj8iYW0iOiJwbSIsUzp1YShkLmdldFNlY29uZHMoKSksTDp1YSh0KGIlMUUzKSwzKX0sSGlnaGNoYXJ0cy5kYXRlRm9ybWF0cyk7Zm9yKGUgaW4gZClmb3IoO2EuaW5kZXhPZigiJSIrZSkhPT0tMTspYT1hLnJlcGxhY2UoIiUiK2UsdHlwZW9mIGRbZV09PT0iZnVuY3Rpb24iP2RbZV0oYik6ZFtlXSk7cmV0dXJuIGM/YS5zdWJzdHIoMCwxKS50b1VwcGVyQ2FzZSgpK2Euc3Vic3RyKDEpOmF9O0ZiLnByb3RvdHlwZT17d3JhcENvbG9yOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29sb3I+PWEpdGhpcy5jb2xvcj0wfSx3cmFwU3ltYm9sOmZ1bmN0aW9uKGEpe2lmKHRoaXMuc3ltYm9sPj1hKXRoaXMuc3ltYm9sPTB9fTtFPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPTAsYj1hcmd1bWVudHMsYz1iLmxlbmd0aCxkPXt9O2E8YzthKyspZFtiW2ErK11dPWJbYV07cmV0dXJuIGR9KHpiLAoxLGpiLDFFMyxWYSw2RTQsT2EsMzZFNSxvYSw4NjRFNSxXYSw2MDQ4RTUsUGEsMjY3ODRFNSx2YSwzMTU1Njk1MkUzKTt1Yj17aW5pdDpmdW5jdGlvbihhLGIsYyl7dmFyIGI9Ynx8IiIsZD1hLnNoaWZ0LGU9Yi5pbmRleE9mKCJDIik+LTEsZj1lPzc6MyxnLGI9Yi5zcGxpdCgiICIpLGM9W10uY29uY2F0KGMpLGgsaSxqPWZ1bmN0aW9uKGEpe2ZvcihnPWEubGVuZ3RoO2ctLTspYVtnXT09PSJNIiYmYS5zcGxpY2UoZysxLDAsYVtnKzFdLGFbZysyXSxhW2crMV0sYVtnKzJdKX07ZSYmKGooYiksaihjKSk7YS5pc0FyZWEmJihoPWIuc3BsaWNlKGIubGVuZ3RoLTYsNiksaT1jLnNwbGljZShjLmxlbmd0aC02LDYpKTtpZihkPD1jLmxlbmd0aC9mKWZvcig7ZC0tOyljPVtdLmNvbmNhdChjKS5zcGxpY2UoMCxmKS5jb25jYXQoYyk7YS5zaGlmdD0wO2lmKGIubGVuZ3RoKWZvcihhPWMubGVuZ3RoO2IubGVuZ3RoPGE7KWQ9W10uY29uY2F0KGIpLnNwbGljZShiLmxlbmd0aC1mLGYpLGUmJihkW2YtCjZdPWRbZi0yXSxkW2YtNV09ZFtmLTFdKSxiPWIuY29uY2F0KGQpO2gmJihiPWIuY29uY2F0KGgpLGM9Yy5jb25jYXQoaSkpO3JldHVybltiLGNdfSxzdGVwOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPVtdLGY9YS5sZW5ndGg7aWYoYz09PTEpZT1kO2Vsc2UgaWYoZj09PWIubGVuZ3RoJiZjPDEpZm9yKDtmLS07KWQ9cGFyc2VGbG9hdChhW2ZdKSxlW2ZdPWlzTmFOKGQpP2FbZl06YypwYXJzZUZsb2F0KGJbZl0tZCkrZDtlbHNlIGU9YjtyZXR1cm4gZX19OyhmdW5jdGlvbihhKXtPLkhpZ2hjaGFydHNBZGFwdGVyPU8uSGlnaGNoYXJ0c0FkYXB0ZXJ8fGEmJntpbml0OmZ1bmN0aW9uKGIpe3ZhciBjPWEuZngsZD1jLnN0ZXAsZSxmPWEuVHdlZW4sZz1mJiZmLnByb3BIb29rczthLmV4dGVuZChhLmVhc2luZyx7ZWFzZU91dFF1YWQ6ZnVuY3Rpb24oYSxiLGMsZCxlKXtyZXR1cm4tZCooYi89ZSkqKGItMikrY319KTthLmVhY2goWyJjdXIiLCJfZGVmYXVsdCIsIndpZHRoIiwiaGVpZ2h0IiwKIm9wYWNpdHkiXSxmdW5jdGlvbihhLGIpe3ZhciBlPWQsayxtO2I9PT0iY3VyIj9lPWMucHJvdG90eXBlOmI9PT0iX2RlZmF1bHQiJiZmJiYoZT1nW2JdLGI9InNldCIpOyhrPWVbYl0pJiYoZVtiXT1mdW5jdGlvbihjKXtjPWE/Yzp0aGlzO209Yy5lbGVtO3JldHVybiBtLmF0dHI/bS5hdHRyKGMucHJvcCxiPT09ImN1ciI/eDpjLm5vdyk6ay5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KX0pO2U9ZnVuY3Rpb24oYSl7dmFyIGM9YS5lbGVtLGQ7aWYoIWEuc3RhcnRlZClkPWIuaW5pdChjLGMuZCxjLnRvRCksYS5zdGFydD1kWzBdLGEuZW5kPWRbMV0sYS5zdGFydGVkPSEwO2MuYXR0cigiZCIsYi5zdGVwKGEuc3RhcnQsYS5lbmQsYS5wb3MsYy50b0QpKX07Zj9nLmQ9e3NldDplfTpkLmQ9ZTt0aGlzLmVhY2g9QXJyYXkucHJvdG90eXBlLmZvckVhY2g/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGIpfTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0KMCxkPWEubGVuZ3RoO2M8ZDtjKyspaWYoYi5jYWxsKGFbY10sYVtjXSxjLGEpPT09ITEpcmV0dXJuIGN9O2EuZm4uaGlnaGNoYXJ0cz1mdW5jdGlvbigpe3ZhciBhPSJDaGFydCIsYj1hcmd1bWVudHMsYyxkO2ZhKGJbMF0pJiYoYT1iWzBdLGI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYiwxKSk7Yz1iWzBdO2lmKGMhPT14KWMuY2hhcnQ9Yy5jaGFydHx8e30sYy5jaGFydC5yZW5kZXJUbz10aGlzWzBdLG5ldyBIaWdoY2hhcnRzW2FdKGMsYlsxXSksZD10aGlzO2M9PT14JiYoZD16YVtBKHRoaXNbMF0sImRhdGEtaGlnaGNoYXJ0cy1jaGFydCIpXSk7cmV0dXJuIGR9fSxnZXRTY3JpcHQ6YS5nZXRTY3JpcHQsaW5BcnJheTphLmluQXJyYXksYWRhcHRlclJ1bjpmdW5jdGlvbihiLGMpe3JldHVybiBhKGIpW2NdKCl9LGdyZXA6YS5ncmVwLG1hcDpmdW5jdGlvbihhLGMpe2Zvcih2YXIgZD1bXSxlPTAsZj1hLmxlbmd0aDtlPGY7ZSsrKWRbZV09Yy5jYWxsKGFbZV0sYVtlXSxlLGEpOwpyZXR1cm4gZH0sb2Zmc2V0OmZ1bmN0aW9uKGIpe3JldHVybiBhKGIpLm9mZnNldCgpfSxhZGRFdmVudDpmdW5jdGlvbihiLGMsZCl7YShiKS5iaW5kKGMsZCl9LHJlbW92ZUV2ZW50OmZ1bmN0aW9uKGIsYyxkKXt2YXIgZT16LnJlbW92ZUV2ZW50TGlzdGVuZXI/InJlbW92ZUV2ZW50TGlzdGVuZXIiOiJkZXRhY2hFdmVudCI7eltlXSYmYiYmIWJbZV0mJihiW2VdPWZ1bmN0aW9uKCl7fSk7YShiKS51bmJpbmQoYyxkKX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGIsYyxkLGUpe3ZhciBmPWEuRXZlbnQoYyksZz0iZGV0YWNoZWQiK2MsaDshRGEmJmQmJihkZWxldGUgZC5sYXllclgsZGVsZXRlIGQubGF5ZXJZKTt2KGYsZCk7YltjXSYmKGJbZ109YltjXSxiW2NdPW51bGwpO2EuZWFjaChbInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIl0sZnVuY3Rpb24oYSxiKXt2YXIgYz1mW2JdO2ZbYl09ZnVuY3Rpb24oKXt0cnl7Yy5jYWxsKGYpfWNhdGNoKGEpe2I9PT0icHJldmVudERlZmF1bHQiJiYKKGg9ITApfX19KTthKGIpLnRyaWdnZXIoZik7YltnXSYmKGJbY109YltnXSxiW2ddPW51bGwpO2UmJiFmLmlzRGVmYXVsdFByZXZlbnRlZCgpJiYhaCYmZShmKX0sd2FzaE1vdXNlRXZlbnQ6ZnVuY3Rpb24oYSl7dmFyIGM9YS5vcmlnaW5hbEV2ZW50fHxhO2lmKGMucGFnZVg9PT14KWMucGFnZVg9YS5wYWdlWCxjLnBhZ2VZPWEucGFnZVk7cmV0dXJuIGN9LGFuaW1hdGU6ZnVuY3Rpb24oYixjLGQpe3ZhciBlPWEoYik7aWYoYy5kKWIudG9EPWMuZCxjLmQ9MTtlLnN0b3AoKTtjLm9wYWNpdHkhPT14JiZiLmF0dHImJihjLm9wYWNpdHkrPSJweCIpO2UuYW5pbWF0ZShjLGQpfSxzdG9wOmZ1bmN0aW9uKGIpe2EoYikuc3RvcCgpfX19KShPLmpRdWVyeSk7dmFyIFc9Ty5IaWdoY2hhcnRzQWRhcHRlcixNPVd8fHt9O1cmJlcuaW5pdC5jYWxsKFcsdWIpO3ZhciBnYj1NLmFkYXB0ZXJSdW4sU2I9TS5nZXRTY3JpcHQsbGE9TS5pbkFycmF5LG49TS5lYWNoLE9iPU0uZ3JlcCxUYj1NLm9mZnNldCwKS2E9TS5tYXAsSj1NLmFkZEV2ZW50LGJhPU0ucmVtb3ZlRXZlbnQsRD1NLmZpcmVFdmVudCxQYj1NLndhc2hNb3VzZUV2ZW50LHZiPU0uYW5pbWF0ZSxUYT1NLnN0b3AsTT17ZW5hYmxlZDohMCxhbGlnbjoiY2VudGVyIix4OjAseToxNSxzdHlsZTp7Y29sb3I6IiM2NjYiLGN1cnNvcjoiZGVmYXVsdCIsZm9udFNpemU6IjExcHgiLGxpbmVIZWlnaHQ6IjE0cHgifX07Tj17Y29sb3JzOiIjMmY3ZWQ4LCMwZDIzM2EsIzhiYmMyMSwjOTEwMDAwLCMxYWFkY2UsIzQ5Mjk3MCwjZjI4ZjQzLCM3N2ExZTUsI2M0MjUyNSwjYTZjOTZhIi5zcGxpdCgiLCIpLHN5bWJvbHM6WyJjaXJjbGUiLCJkaWFtb25kIiwic3F1YXJlIiwidHJpYW5nbGUiLCJ0cmlhbmdsZS1kb3duIl0sbGFuZzp7bG9hZGluZzoiTG9hZGluZy4uLiIsbW9udGhzOiJKYW51YXJ5LEZlYnJ1YXJ5LE1hcmNoLEFwcmlsLE1heSxKdW5lLEp1bHksQXVndXN0LFNlcHRlbWJlcixPY3RvYmVyLE5vdmVtYmVyLERlY2VtYmVyIi5zcGxpdCgiLCIpLApzaG9ydE1vbnRoczoiSmFuLEZlYixNYXIsQXByLE1heSxKdW4sSnVsLEF1ZyxTZXAsT2N0LE5vdixEZWMiLnNwbGl0KCIsIiksd2Vla2RheXM6IlN1bmRheSxNb25kYXksVHVlc2RheSxXZWRuZXNkYXksVGh1cnNkYXksRnJpZGF5LFNhdHVyZGF5Ii5zcGxpdCgiLCIpLGRlY2ltYWxQb2ludDoiLiIsbnVtZXJpY1N5bWJvbHM6ImssTSxHLFQsUCxFIi5zcGxpdCgiLCIpLHJlc2V0Wm9vbToiUmVzZXQgem9vbSIscmVzZXRab29tVGl0bGU6IlJlc2V0IHpvb20gbGV2ZWwgMToxIix0aG91c2FuZHNTZXA6IiwifSxnbG9iYWw6e3VzZVVUQzohMCxjYW52YXNUb29sc1VSTDoiaHR0cDovL2NvZGUuaGlnaGNoYXJ0cy5jb20vMy4wLjEvbW9kdWxlcy9jYW52YXMtdG9vbHMuanMiLFZNTFJhZGlhbEdyYWRpZW50VVJMOiJodHRwOi8vY29kZS5oaWdoY2hhcnRzLmNvbS8zLjAuMS9nZngvdm1sLXJhZGlhbC1ncmFkaWVudC5wbmcifSxjaGFydDp7Ym9yZGVyQ29sb3I6IiM0NTcyQTciLGJvcmRlclJhZGl1czo1LApkZWZhdWx0U2VyaWVzVHlwZToibGluZSIsaWdub3JlSGlkZGVuU2VyaWVzOiEwLHNwYWNpbmdUb3A6MTAsc3BhY2luZ1JpZ2h0OjEwLHNwYWNpbmdCb3R0b206MTUsc3BhY2luZ0xlZnQ6MTAsc3R5bGU6e2ZvbnRGYW1pbHk6JyJMdWNpZGEgR3JhbmRlIiwgIkx1Y2lkYSBTYW5zIFVuaWNvZGUiLCBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmJyxmb250U2l6ZToiMTJweCJ9LGJhY2tncm91bmRDb2xvcjoiI0ZGRkZGRiIscGxvdEJvcmRlckNvbG9yOiIjQzBDMEMwIixyZXNldFpvb21CdXR0b246e3RoZW1lOnt6SW5kZXg6MjB9LHBvc2l0aW9uOnthbGlnbjoicmlnaHQiLHg6LTEwLHk6MTB9fX0sdGl0bGU6e3RleHQ6IkNoYXJ0IHRpdGxlIixhbGlnbjoiY2VudGVyIix5OjE1LHN0eWxlOntjb2xvcjoiIzI3NGI2ZCIsZm9udFNpemU6IjE2cHgifX0sc3VidGl0bGU6e3RleHQ6IiIsYWxpZ246ImNlbnRlciIseTozMCxzdHlsZTp7Y29sb3I6IiM0ZDc1OWUifX0scGxvdE9wdGlvbnM6e2xpbmU6e2FsbG93UG9pbnRTZWxlY3Q6ITEsCnNob3dDaGVja2JveDohMSxhbmltYXRpb246e2R1cmF0aW9uOjFFM30sZXZlbnRzOnt9LGxpbmVXaWR0aDoyLG1hcmtlcjp7ZW5hYmxlZDohMCxsaW5lV2lkdGg6MCxyYWRpdXM6NCxsaW5lQ29sb3I6IiNGRkZGRkYiLHN0YXRlczp7aG92ZXI6e2VuYWJsZWQ6ITB9LHNlbGVjdDp7ZmlsbENvbG9yOiIjRkZGRkZGIixsaW5lQ29sb3I6IiMwMDAwMDAiLGxpbmVXaWR0aDoyfX19LHBvaW50OntldmVudHM6e319LGRhdGFMYWJlbHM6eShNLHtlbmFibGVkOiExLGZvcm1hdHRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnl9LHZlcnRpY2FsQWxpZ246ImJvdHRvbSIseTowfSksY3JvcFRocmVzaG9sZDozMDAscG9pbnRSYW5nZTowLHNob3dJbkxlZ2VuZDohMCxzdGF0ZXM6e2hvdmVyOnttYXJrZXI6e319LHNlbGVjdDp7bWFya2VyOnt9fX0sc3RpY2t5VHJhY2tpbmc6ITB9fSxsYWJlbHM6e3N0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGNvbG9yOiIjM0U1NzZGIn19LGxlZ2VuZDp7ZW5hYmxlZDohMCwKYWxpZ246ImNlbnRlciIsbGF5b3V0OiJob3Jpem9udGFsIixsYWJlbEZvcm1hdHRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWV9LGJvcmRlcldpZHRoOjEsYm9yZGVyQ29sb3I6IiM5MDkwOTAiLGJvcmRlclJhZGl1czo1LG5hdmlnYXRpb246e2FjdGl2ZUNvbG9yOiIjMjc0YjZkIixpbmFjdGl2ZUNvbG9yOiIjQ0NDIn0sc2hhZG93OiExLGl0ZW1TdHlsZTp7Y3Vyc29yOiJwb2ludGVyIixjb2xvcjoiIzI3NGI2ZCIsZm9udFNpemU6IjEycHgifSxpdGVtSG92ZXJTdHlsZTp7Y29sb3I6IiMwMDAifSxpdGVtSGlkZGVuU3R5bGU6e2NvbG9yOiIjQ0NDIn0saXRlbUNoZWNrYm94U3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsd2lkdGg6IjEzcHgiLGhlaWdodDoiMTNweCJ9LHN5bWJvbFdpZHRoOjE2LHN5bWJvbFBhZGRpbmc6NSx2ZXJ0aWNhbEFsaWduOiJib3R0b20iLHg6MCx5OjAsdGl0bGU6e3N0eWxlOntmb250V2VpZ2h0OiJib2xkIn19fSxsb2FkaW5nOntsYWJlbFN0eWxlOntmb250V2VpZ2h0OiJib2xkIiwKcG9zaXRpb246InJlbGF0aXZlIix0b3A6IjFlbSJ9LHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGJhY2tncm91bmRDb2xvcjoid2hpdGUiLG9wYWNpdHk6MC41LHRleHRBbGlnbjoiY2VudGVyIn19LHRvb2x0aXA6e2VuYWJsZWQ6ITAsYW5pbWF0aW9uOlosYmFja2dyb3VuZENvbG9yOiJyZ2JhKDI1NSwgMjU1LCAyNTUsIC44NSkiLGJvcmRlcldpZHRoOjEsYm9yZGVyUmFkaXVzOjMsZGF0ZVRpbWVMYWJlbEZvcm1hdHM6e21pbGxpc2Vjb25kOiIlQSwgJWIgJWUsICVIOiVNOiVTLiVMIixzZWNvbmQ6IiVBLCAlYiAlZSwgJUg6JU06JVMiLG1pbnV0ZToiJUEsICViICVlLCAlSDolTSIsaG91cjoiJUEsICViICVlLCAlSDolTSIsZGF5OiIlQSwgJWIgJWUsICVZIix3ZWVrOiJXZWVrIGZyb20gJUEsICViICVlLCAlWSIsbW9udGg6IiVCICVZIix5ZWFyOiIlWSJ9LGhlYWRlckZvcm1hdDonPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTBweCI+e3BvaW50LmtleX08L3NwYW4+PGJyLz4nLApwb2ludEZvcm1hdDonPHNwYW4gc3R5bGU9ImNvbG9yOntzZXJpZXMuY29sb3J9Ij57c2VyaWVzLm5hbWV9PC9zcGFuPjogPGI+e3BvaW50Lnl9PC9iPjxici8+JyxzaGFkb3c6ITAsc25hcDpLYj8yNToxMCxzdHlsZTp7Y29sb3I6IiMzMzMzMzMiLGN1cnNvcjoiZGVmYXVsdCIsZm9udFNpemU6IjEycHgiLHBhZGRpbmc6IjhweCIsd2hpdGVTcGFjZToibm93cmFwIn19LGNyZWRpdHM6e2VuYWJsZWQ6ITAsdGV4dDoiSGlnaGNoYXJ0cy5jb20iLGhyZWY6Imh0dHA6Ly93d3cuaGlnaGNoYXJ0cy5jb20iLHBvc2l0aW9uOnthbGlnbjoicmlnaHQiLHg6LTEwLHZlcnRpY2FsQWxpZ246ImJvdHRvbSIseTotNX0sc3R5bGU6e2N1cnNvcjoicG9pbnRlciIsY29sb3I6IiM5MDkwOTAiLGZvbnRTaXplOiI5cHgifX19O3ZhciBYPU4ucGxvdE9wdGlvbnMsVz1YLmxpbmU7SGIoKTt2YXIgbWE9ZnVuY3Rpb24oYSl7dmFyIGI9W10sYyxkOyhmdW5jdGlvbihhKXthJiZhLnN0b3BzP2Q9S2EoYS5zdG9wcywKZnVuY3Rpb24oYSl7cmV0dXJuIG1hKGFbMV0pfSk6KGM9L3JnYmFcKFxzKihbMC05XXsxLDN9KVxzKixccyooWzAtOV17MSwzfSlccyosXHMqKFswLTldezEsM30pXHMqLFxzKihbMC05XT8oPzpcLlswLTldKyk/KVxzKlwpLy5leGVjKGEpKT9iPVt1KGNbMV0pLHUoY1syXSksdShjWzNdKSxwYXJzZUZsb2F0KGNbNF0sMTApXTooYz0vIyhbYS1mQS1GMC05XXsyfSkoW2EtZkEtRjAtOV17Mn0pKFthLWZBLUYwLTldezJ9KS8uZXhlYyhhKSk/Yj1bdShjWzFdLDE2KSx1KGNbMl0sMTYpLHUoY1szXSwxNiksMV06KGM9L3JnYlwoXHMqKFswLTldezEsM30pXHMqLFxzKihbMC05XXsxLDN9KVxzKixccyooWzAtOV17MSwzfSlccypcKS8uZXhlYyhhKSkmJihiPVt1KGNbMV0pLHUoY1syXSksdShjWzNdKSwxXSl9KShhKTtyZXR1cm57Z2V0OmZ1bmN0aW9uKGMpe3ZhciBmO2Q/KGY9eShhKSxmLnN0b3BzPVtdLmNvbmNhdChmLnN0b3BzKSxuKGQsZnVuY3Rpb24oYSxiKXtmLnN0b3BzW2JdPVtmLnN0b3BzW2JdWzBdLAphLmdldChjKV19KSk6Zj1iJiYhaXNOYU4oYlswXSk/Yz09PSJyZ2IiPyJyZ2IoIitiWzBdKyIsIitiWzFdKyIsIitiWzJdKyIpIjpjPT09ImEiP2JbM106InJnYmEoIitiLmpvaW4oIiwiKSsiKSI6YTtyZXR1cm4gZn0sYnJpZ2h0ZW46ZnVuY3Rpb24oYSl7aWYoZCluKGQsZnVuY3Rpb24oYil7Yi5icmlnaHRlbihhKX0pO2Vsc2UgaWYoQ2EoYSkmJmEhPT0wKXt2YXIgYztmb3IoYz0wO2M8MztjKyspYltjXSs9dShhKjI1NSksYltjXTwwJiYoYltjXT0wKSxiW2NdPjI1NSYmKGJbY109MjU1KX1yZXR1cm4gdGhpc30scmdiYTpiLHNldE9wYWNpdHk6ZnVuY3Rpb24oYSl7YlszXT1hO3JldHVybiB0aGlzfX19O3JhLnByb3RvdHlwZT17aW5pdDpmdW5jdGlvbihhLGIpe3RoaXMuZWxlbWVudD1iPT09InNwYW4iP1UoYik6ei5jcmVhdGVFbGVtZW50TlMoc2EsYik7dGhpcy5yZW5kZXJlcj1hO3RoaXMuYXR0clNldHRlcnM9e319LG9wYWNpdHk6MSxhbmltYXRlOmZ1bmN0aW9uKGEsYixjKXtiPQpvKGIseGEsITApO1RhKHRoaXMpO2lmKGIpe2I9eShiKTtpZihjKWIuY29tcGxldGU9Yzt2Yih0aGlzLGEsYil9ZWxzZSB0aGlzLmF0dHIoYSksYyYmYygpfSxhdHRyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGYsZz10aGlzLmVsZW1lbnQsaD1nLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksaT10aGlzLnJlbmRlcmVyLGosaz10aGlzLmF0dHJTZXR0ZXJzLG09dGhpcy5zaGFkb3dzLGwscCxzPXRoaXM7ZmEoYSkmJnIoYikmJihjPWEsYT17fSxhW2NdPWIpO2lmKGZhKGEpKWM9YSxoPT09ImNpcmNsZSI/Yz17eDoiY3giLHk6ImN5In1bY118fGM6Yz09PSJzdHJva2VXaWR0aCImJihjPSJzdHJva2Utd2lkdGgiKSxzPUEoZyxjKXx8dGhpc1tjXXx8MCxjIT09ImQiJiZjIT09InZpc2liaWxpdHkiJiYocz1wYXJzZUZsb2F0KHMpKTtlbHNle2ZvcihjIGluIGEpaWYoaj0hMSxkPWFbY10sZT1rW2NdJiZrW2NdLmNhbGwodGhpcyxkLGMpLGUhPT0hMSl7ZSE9PXgmJihkPWUpO2lmKGM9PT0iZCIpZCYmCmQuam9pbiYmKGQ9ZC5qb2luKCIgIikpLC8oTmFOfCB7Mn18XiQpLy50ZXN0KGQpJiYoZD0iTSAwIDAiKTtlbHNlIGlmKGM9PT0ieCImJmg9PT0idGV4dCIpZm9yKGU9MDtlPGcuY2hpbGROb2Rlcy5sZW5ndGg7ZSsrKWY9Zy5jaGlsZE5vZGVzW2VdLEEoZiwieCIpPT09QShnLCJ4IikmJkEoZiwieCIsZCk7ZWxzZSBpZih0aGlzLnJvdGF0aW9uJiYoYz09PSJ4Inx8Yz09PSJ5IikpcD0hMDtlbHNlIGlmKGM9PT0iZmlsbCIpZD1pLmNvbG9yKGQsZyxjKTtlbHNlIGlmKGg9PT0iY2lyY2xlIiYmKGM9PT0ieCJ8fGM9PT0ieSIpKWM9e3g6ImN4Iix5OiJjeSJ9W2NdfHxjO2Vsc2UgaWYoaD09PSJyZWN0IiYmYz09PSJyIilBKGcse3J4OmQscnk6ZH0pLGo9ITA7ZWxzZSBpZihjPT09InRyYW5zbGF0ZVgifHxjPT09InRyYW5zbGF0ZVkifHxjPT09InJvdGF0aW9uInx8Yz09PSJ2ZXJ0aWNhbEFsaWduInx8Yz09PSJzY2FsZVgifHxjPT09InNjYWxlWSIpaj1wPSEwO2Vsc2UgaWYoYz09PSJzdHJva2UiKWQ9CmkuY29sb3IoZCxnLGMpO2Vsc2UgaWYoYz09PSJkYXNoc3R5bGUiKWlmKGM9InN0cm9rZS1kYXNoYXJyYXkiLGQ9ZCYmZC50b0xvd2VyQ2FzZSgpLGQ9PT0ic29saWQiKWQ9UztlbHNle2lmKGQpe2Q9ZC5yZXBsYWNlKCJzaG9ydGRhc2hkb3Rkb3QiLCIzLDEsMSwxLDEsMSwiKS5yZXBsYWNlKCJzaG9ydGRhc2hkb3QiLCIzLDEsMSwxIikucmVwbGFjZSgic2hvcnRkb3QiLCIxLDEsIikucmVwbGFjZSgic2hvcnRkYXNoIiwiMywxLCIpLnJlcGxhY2UoImxvbmdkYXNoIiwiOCwzLCIpLnJlcGxhY2UoL2RvdC9nLCIxLDMsIikucmVwbGFjZSgiZGFzaCIsIjQsMywiKS5yZXBsYWNlKC8sJC8sIiIpLnNwbGl0KCIsIik7Zm9yKGU9ZC5sZW5ndGg7ZS0tOylkW2VdPXUoZFtlXSkqYVsic3Ryb2tlLXdpZHRoIl07ZD1kLmpvaW4oIiwiKX19ZWxzZSBpZihjPT09IndpZHRoIilkPXUoZCk7ZWxzZSBpZihjPT09ImFsaWduIiljPSJ0ZXh0LWFuY2hvciIsZD17bGVmdDoic3RhcnQiLGNlbnRlcjoibWlkZGxlIiwKcmlnaHQ6ImVuZCJ9W2RdO2Vsc2UgaWYoYz09PSJ0aXRsZSIpZT1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0aXRsZSIpWzBdLGV8fChlPXouY3JlYXRlRWxlbWVudE5TKHNhLCJ0aXRsZSIpLGcuYXBwZW5kQ2hpbGQoZSkpLGUudGV4dENvbnRlbnQ9ZDtjPT09InN0cm9rZVdpZHRoIiYmKGM9InN0cm9rZS13aWR0aCIpO2lmKGM9PT0ic3Ryb2tlLXdpZHRoInx8Yz09PSJzdHJva2UiKXt0aGlzW2NdPWQ7aWYodGhpcy5zdHJva2UmJnRoaXNbInN0cm9rZS13aWR0aCJdKUEoZywic3Ryb2tlIix0aGlzLnN0cm9rZSksQShnLCJzdHJva2Utd2lkdGgiLHRoaXNbInN0cm9rZS13aWR0aCJdKSx0aGlzLmhhc1N0cm9rZT0hMDtlbHNlIGlmKGM9PT0ic3Ryb2tlLXdpZHRoIiYmZD09PTAmJnRoaXMuaGFzU3Ryb2tlKWcucmVtb3ZlQXR0cmlidXRlKCJzdHJva2UiKSx0aGlzLmhhc1N0cm9rZT0hMTtqPSEwfXRoaXMuc3ltYm9sTmFtZSYmL14oeHx5fHdpZHRofGhlaWdodHxyfHN0YXJ0fGVuZHxpbm5lclJ8YW5jaG9yWHxhbmNob3JZKS8udGVzdChjKSYmCihsfHwodGhpcy5zeW1ib2xBdHRyKGEpLGw9ITApLGo9ITApO2lmKG0mJi9eKHdpZHRofGhlaWdodHx2aXNpYmlsaXR5fHh8eXxkfHRyYW5zZm9ybSkkLy50ZXN0KGMpKWZvcihlPW0ubGVuZ3RoO2UtLTspQShtW2VdLGMsYz09PSJoZWlnaHQiP3EoZC0obVtlXS5jdXRIZWlnaHR8fDApLDApOmQpO2lmKChjPT09IndpZHRoInx8Yz09PSJoZWlnaHQiKSYmaD09PSJyZWN0IiYmZDwwKWQ9MDt0aGlzW2NdPWQ7Yz09PSJ0ZXh0Ij8oZCE9PXRoaXMudGV4dFN0ciYmZGVsZXRlIHRoaXMuYkJveCx0aGlzLnRleHRTdHI9ZCx0aGlzLmFkZGVkJiZpLmJ1aWxkVGV4dCh0aGlzKSk6anx8QShnLGMsZCl9cCYmdGhpcy51cGRhdGVUcmFuc2Zvcm0oKX1yZXR1cm4gc30sYWRkQ2xhc3M6ZnVuY3Rpb24oYSl7QSh0aGlzLmVsZW1lbnQsImNsYXNzIixBKHRoaXMuZWxlbWVudCwiY2xhc3MiKSsiICIrYSk7cmV0dXJuIHRoaXN9LHN5bWJvbEF0dHI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztuKCJ4LHkscixzdGFydCxlbmQsd2lkdGgsaGVpZ2h0LGlubmVyUixhbmNob3JYLGFuY2hvclkiLnNwbGl0KCIsIiksCmZ1bmN0aW9uKGMpe2JbY109byhhW2NdLGJbY10pfSk7Yi5hdHRyKHtkOmIucmVuZGVyZXIuc3ltYm9sc1tiLnN5bWJvbE5hbWVdKGIueCxiLnksYi53aWR0aCxiLmhlaWdodCxiKX0pfSxjbGlwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmF0dHIoImNsaXAtcGF0aCIsYT8idXJsKCIrdGhpcy5yZW5kZXJlci51cmwrIiMiK2EuaWQrIikiOlMpfSxjcmlzcDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGc9e30saD17fSxpLGE9YXx8dGhpcy5zdHJva2VXaWR0aHx8dGhpcy5hdHRyJiZ0aGlzLmF0dHIoInN0cm9rZS13aWR0aCIpfHwwO2k9dChhKSUyLzI7aC54PVQoYnx8dGhpcy54fHwwKStpO2gueT1UKGN8fHRoaXMueXx8MCkraTtoLndpZHRoPVQoKGR8fHRoaXMud2lkdGh8fDApLTIqaSk7aC5oZWlnaHQ9VCgoZXx8dGhpcy5oZWlnaHR8fDApLTIqaSk7aC5zdHJva2VXaWR0aD1hO2ZvcihmIGluIGgpdGhpc1tmXSE9PWhbZl0mJih0aGlzW2ZdPWdbZl09aFtmXSk7cmV0dXJuIGd9LApjc3M6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lbGVtZW50LGI9YSYmYS53aWR0aCYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09InRleHQiLGMsZD0iIixlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIi0iK2IudG9Mb3dlckNhc2UoKX07aWYoYSYmYS5jb2xvcilhLmZpbGw9YS5jb2xvcjt0aGlzLnN0eWxlcz1hPXYodGhpcy5zdHlsZXMsYSk7JCYmYiYmZGVsZXRlIGEud2lkdGg7aWYoRGEmJiFaKWImJmRlbGV0ZSBhLndpZHRoLEwodGhpcy5lbGVtZW50LGEpO2Vsc2V7Zm9yKGMgaW4gYSlkKz1jLnJlcGxhY2UoLyhbQS1aXSkvZyxlKSsiOiIrYVtjXSsiOyI7dGhpcy5hdHRyKHtzdHlsZTpkfSl9YiYmdGhpcy5hZGRlZCYmdGhpcy5yZW5kZXJlci5idWlsZFRleHQodGhpcyk7cmV0dXJuIHRoaXN9LG9uOmZ1bmN0aW9uKGEsYil7aWYoZmImJmE9PT0iY2xpY2siKXRoaXMuZWxlbWVudC5vbnRvdWNoc3RhcnQ9ZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpO2IoKX07dGhpcy5lbGVtZW50WyJvbiIrCmFdPWI7cmV0dXJuIHRoaXN9LHNldFJhZGlhbFJlZmVyZW5jZTpmdW5jdGlvbihhKXt0aGlzLmVsZW1lbnQucmFkaWFsUmVmZXJlbmNlPWE7cmV0dXJuIHRoaXN9LHRyYW5zbGF0ZTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmF0dHIoe3RyYW5zbGF0ZVg6YSx0cmFuc2xhdGVZOmJ9KX0saW52ZXJ0OmZ1bmN0aW9uKCl7dGhpcy5pbnZlcnRlZD0hMDt0aGlzLnVwZGF0ZVRyYW5zZm9ybSgpO3JldHVybiB0aGlzfSxodG1sQ3NzOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZWxlbWVudDtpZihiPWEmJmIudGFnTmFtZT09PSJTUEFOIiYmYS53aWR0aClkZWxldGUgYS53aWR0aCx0aGlzLnRleHRXaWR0aD1iLHRoaXMudXBkYXRlVHJhbnNmb3JtKCk7dGhpcy5zdHlsZXM9dih0aGlzLnN0eWxlcyxhKTtMKHRoaXMuZWxlbWVudCxhKTtyZXR1cm4gdGhpc30saHRtbEdldEJCb3g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVsZW1lbnQsYj10aGlzLmJCb3g7aWYoIWIpe2lmKGEubm9kZU5hbWU9PT0KInRleHQiKWEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiPXRoaXMuYkJveD17eDphLm9mZnNldExlZnQseTphLm9mZnNldFRvcCx3aWR0aDphLm9mZnNldFdpZHRoLGhlaWdodDphLm9mZnNldEhlaWdodH19cmV0dXJuIGJ9LGh0bWxVcGRhdGVUcmFuc2Zvcm06ZnVuY3Rpb24oKXtpZih0aGlzLmFkZGVkKXt2YXIgYT10aGlzLnJlbmRlcmVyLGI9dGhpcy5lbGVtZW50LGM9dGhpcy50cmFuc2xhdGVYfHwwLGQ9dGhpcy50cmFuc2xhdGVZfHwwLGU9dGhpcy54fHwwLGY9dGhpcy55fHwwLGc9dGhpcy50ZXh0QWxpZ258fCJsZWZ0IixoPXtsZWZ0OjAsY2VudGVyOjAuNSxyaWdodDoxfVtnXSxpPWcmJmchPT0ibGVmdCIsaj10aGlzLnNoYWRvd3M7aWYoY3x8ZClMKGIse21hcmdpbkxlZnQ6YyxtYXJnaW5Ub3A6ZH0pLGomJm4oaixmdW5jdGlvbihhKXtMKGEse21hcmdpbkxlZnQ6YysxLG1hcmdpblRvcDpkKzF9KX0pO3RoaXMuaW52ZXJ0ZWQmJm4oYi5jaGlsZE5vZGVzLGZ1bmN0aW9uKGMpe2EuaW52ZXJ0Q2hpbGQoYywKYil9KTtpZihiLnRhZ05hbWU9PT0iU1BBTiIpe3ZhciBrLG0saj10aGlzLnJvdGF0aW9uLGwscD0wLHM9MSxwPTAsd2I7bD11KHRoaXMudGV4dFdpZHRoKTt2YXIgQj10aGlzLnhDb3JyfHwwLHc9dGhpcy55Q29ycnx8MCxHPVtqLGcsYi5pbm5lckhUTUwsdGhpcy50ZXh0V2lkdGhdLmpvaW4oIiwiKTtrPXt9O2lmKEchPT10aGlzLmNUVCl7aWYocihqKSlhLmlzU1ZHPyhCPURhPyItbXMtdHJhbnNmb3JtIjpkYj8iLXdlYmtpdC10cmFuc2Zvcm0iOmViPyJNb3pUcmFuc2Zvcm0iOkpiPyItby10cmFuc2Zvcm0iOiIiLGtbQl09ay50cmFuc2Zvcm09InJvdGF0ZSgiK2orImRlZykiKToocD1qKmJiLHM9WShwKSxwPWNhKHApLGsuZmlsdGVyPWo/WyJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuTWF0cml4KE0xMT0iLHMsIiwgTTEyPSIsLXAsIiwgTTIxPSIscCwiLCBNMjI9IixzLCIsIHNpemluZ01ldGhvZD0nYXV0byBleHBhbmQnKSJdLmpvaW4oIiIpOlMpLEwoYixrKTtrPQpvKHRoaXMuZWxlbVdpZHRoLGIub2Zmc2V0V2lkdGgpO209byh0aGlzLmVsZW1IZWlnaHQsYi5vZmZzZXRIZWlnaHQpO2lmKGs+bCYmL1sgXC1dLy50ZXN0KGIudGV4dENvbnRlbnR8fGIuaW5uZXJUZXh0KSlMKGIse3dpZHRoOmwrInB4IixkaXNwbGF5OiJibG9jayIsd2hpdGVTcGFjZToibm9ybWFsIn0pLGs9bDtsPWEuZm9udE1ldHJpY3MoYi5zdHlsZS5mb250U2l6ZSkuYjtCPXM8MCYmLWs7dz1wPDAmJi1tO3diPXMqcDwwO0IrPXAqbCood2I/MS1oOmgpO3ctPXMqbCooaj93Yj9oOjEtaDoxKTtpJiYoQi09aypoKihzPDA/LTE6MSksaiYmKHctPW0qaCoocDwwPy0xOjEpKSxMKGIse3RleHRBbGlnbjpnfSkpO3RoaXMueENvcnI9Qjt0aGlzLnlDb3JyPXd9TChiLHtsZWZ0OmUrQisicHgiLHRvcDpmK3crInB4In0pO2lmKGRiKW09Yi5vZmZzZXRIZWlnaHQ7dGhpcy5jVFQ9R319ZWxzZSB0aGlzLmFsaWduT25BZGQ9ITB9LHVwZGF0ZVRyYW5zZm9ybTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudHJhbnNsYXRlWHx8CjAsYj10aGlzLnRyYW5zbGF0ZVl8fDAsYz10aGlzLnNjYWxlWCxkPXRoaXMuc2NhbGVZLGU9dGhpcy5pbnZlcnRlZCxmPXRoaXMucm90YXRpb24sZz1bXTtlJiYoYSs9dGhpcy5hdHRyKCJ3aWR0aCIpLGIrPXRoaXMuYXR0cigiaGVpZ2h0IikpOyhhfHxiKSYmZy5wdXNoKCJ0cmFuc2xhdGUoIithKyIsIitiKyIpIik7ZT9nLnB1c2goInJvdGF0ZSg5MCkgc2NhbGUoLTEsMSkiKTpmJiZnLnB1c2goInJvdGF0ZSgiK2YrIiAiKyh0aGlzLnh8fDApKyIgIisodGhpcy55fHwwKSsiKSIpOyhyKGMpfHxyKGQpKSYmZy5wdXNoKCJzY2FsZSgiK28oYywxKSsiICIrbyhkLDEpKyIpIik7Zy5sZW5ndGgmJkEodGhpcy5lbGVtZW50LCJ0cmFuc2Zvcm0iLGcuam9pbigiICIpKX0sdG9Gcm9udDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZWxlbWVudDthLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoYSk7cmV0dXJuIHRoaXN9LGFsaWduOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoPXt9O2U9dGhpcy5yZW5kZXJlcjsKZj1lLmFsaWduZWRPYmplY3RzO2lmKGEpe2lmKHRoaXMuYWxpZ25PcHRpb25zPWEsdGhpcy5hbGlnbkJ5VHJhbnNsYXRlPWIsIWN8fGZhKGMpKXRoaXMuYWxpZ25Ubz1kPWN8fCJyZW5kZXJlciIsZ2EoZix0aGlzKSxmLnB1c2godGhpcyksYz1udWxsfWVsc2UgYT10aGlzLmFsaWduT3B0aW9ucyxiPXRoaXMuYWxpZ25CeVRyYW5zbGF0ZSxkPXRoaXMuYWxpZ25UbztjPW8oYyxlW2RdLGUpO2Q9YS5hbGlnbjtlPWEudmVydGljYWxBbGlnbjtmPShjLnh8fDApKyhhLnh8fDApO2c9KGMueXx8MCkrKGEueXx8MCk7aWYoZD09PSJyaWdodCJ8fGQ9PT0iY2VudGVyIilmKz0oYy53aWR0aC0oYS53aWR0aHx8MCkpL3tyaWdodDoxLGNlbnRlcjoyfVtkXTtoW2I/InRyYW5zbGF0ZVgiOiJ4Il09dChmKTtpZihlPT09ImJvdHRvbSJ8fGU9PT0ibWlkZGxlIilnKz0oYy5oZWlnaHQtKGEuaGVpZ2h0fHwwKSkvKHtib3R0b206MSxtaWRkbGU6Mn1bZV18fDEpO2hbYj8idHJhbnNsYXRlWSI6InkiXT10KGcpOwp0aGlzW3RoaXMucGxhY2VkPyJhbmltYXRlIjoiYXR0ciJdKGgpO3RoaXMucGxhY2VkPSEwO3RoaXMuYWxpZ25BdHRyPWg7cmV0dXJuIHRoaXN9LGdldEJCb3g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmJCb3gsYj10aGlzLnJlbmRlcmVyLGMsZD10aGlzLnJvdGF0aW9uO2M9dGhpcy5lbGVtZW50O3ZhciBlPXRoaXMuc3R5bGVzLGY9ZCpiYjtpZighYSl7aWYoYy5uYW1lc3BhY2VVUkk9PT1zYXx8Yi5mb3JFeHBvcnQpe3RyeXthPWMuZ2V0QkJveD92KHt9LGMuZ2V0QkJveCgpKTp7d2lkdGg6Yy5vZmZzZXRXaWR0aCxoZWlnaHQ6Yy5vZmZzZXRIZWlnaHR9fWNhdGNoKGcpe31pZighYXx8YS53aWR0aDwwKWE9e3dpZHRoOjAsaGVpZ2h0OjB9fWVsc2UgYT10aGlzLmh0bWxHZXRCQm94KCk7aWYoYi5pc1NWRyl7Yj1hLndpZHRoO2M9YS5oZWlnaHQ7aWYoRGEmJmUmJmUuZm9udFNpemU9PT0iMTFweCImJmMudG9QcmVjaXNpb24oMyk9PT0iMjIuNyIpYS5oZWlnaHQ9Yz0xNDtpZihkKWEud2lkdGg9ClEoYypjYShmKSkrUShiKlkoZikpLGEuaGVpZ2h0PVEoYypZKGYpKStRKGIqY2EoZikpfXRoaXMuYkJveD1hfXJldHVybiBhfSxzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXR0cih7dmlzaWJpbGl0eToidmlzaWJsZSJ9KX0saGlkZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF0dHIoe3Zpc2liaWxpdHk6ImhpZGRlbiJ9KX0sZmFkZU91dDpmdW5jdGlvbihhKXt2YXIgYj10aGlzO2IuYW5pbWF0ZSh7b3BhY2l0eTowfSx7ZHVyYXRpb246YXx8MTUwLGNvbXBsZXRlOmZ1bmN0aW9uKCl7Yi5oaWRlKCl9fSl9LGFkZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnJlbmRlcmVyLGM9YXx8YixkPWMuZWxlbWVudHx8Yi5ib3gsZT1kLmNoaWxkTm9kZXMsZj10aGlzLmVsZW1lbnQsZz1BKGYsInpJbmRleCIpLGg7aWYoYSl0aGlzLnBhcmVudEdyb3VwPWE7dGhpcy5wYXJlbnRJbnZlcnRlZD1hJiZhLmludmVydGVkO3RoaXMudGV4dFN0ciE9PXZvaWQgMCYmYi5idWlsZFRleHQodGhpcyk7aWYoZyljLmhhbmRsZVo9CiEwLGc9dShnKTtpZihjLmhhbmRsZVopZm9yKGM9MDtjPGUubGVuZ3RoO2MrKylpZihhPWVbY10sYj1BKGEsInpJbmRleCIpLGEhPT1mJiYodShiKT5nfHwhcihnKSYmcihiKSkpe2QuaW5zZXJ0QmVmb3JlKGYsYSk7aD0hMDticmVha31ofHxkLmFwcGVuZENoaWxkKGYpO3RoaXMuYWRkZWQ9ITA7RCh0aGlzLCJhZGQiKTtyZXR1cm4gdGhpc30sc2FmZVJlbW92ZUNoaWxkOmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtiJiZiLnJlbW92ZUNoaWxkKGEpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiPWEuZWxlbWVudHx8e30sYz1hLnNoYWRvd3MsZCxlO2Iub25jbGljaz1iLm9ubW91c2VvdXQ9Yi5vbm1vdXNlb3Zlcj1iLm9ubW91c2Vtb3ZlPWIucG9pbnQ9bnVsbDtUYShhKTtpZihhLmNsaXBQYXRoKWEuY2xpcFBhdGg9YS5jbGlwUGF0aC5kZXN0cm95KCk7aWYoYS5zdG9wcyl7Zm9yKGU9MDtlPGEuc3RvcHMubGVuZ3RoO2UrKylhLnN0b3BzW2VdPWEuc3RvcHNbZV0uZGVzdHJveSgpOwphLnN0b3BzPW51bGx9YS5zYWZlUmVtb3ZlQ2hpbGQoYik7YyYmbihjLGZ1bmN0aW9uKGIpe2Euc2FmZVJlbW92ZUNoaWxkKGIpfSk7YS5hbGlnblRvJiZnYShhLnJlbmRlcmVyLmFsaWduZWRPYmplY3RzLGEpO2ZvcihkIGluIGEpZGVsZXRlIGFbZF07cmV0dXJuIG51bGx9LHNoYWRvdzpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9W10sZSxmLGc9dGhpcy5lbGVtZW50LGgsaSxqLGs7aWYoYSl7aT1vKGEud2lkdGgsMyk7aj0oYS5vcGFjaXR5fHwwLjE1KS9pO2s9dGhpcy5wYXJlbnRJbnZlcnRlZD8iKC0xLC0xKSI6IigiK28oYS5vZmZzZXRYLDEpKyIsICIrbyhhLm9mZnNldFksMSkrIikiO2ZvcihlPTE7ZTw9aTtlKyspe2Y9Zy5jbG9uZU5vZGUoMCk7aD1pKjIrMS0yKmU7QShmLHtpc1NoYWRvdzoidHJ1ZSIsc3Ryb2tlOmEuY29sb3J8fCJibGFjayIsInN0cm9rZS1vcGFjaXR5IjpqKmUsInN0cm9rZS13aWR0aCI6aCx0cmFuc2Zvcm06InRyYW5zbGF0ZSIrayxmaWxsOlN9KTtpZihjKUEoZiwKImhlaWdodCIscShBKGYsImhlaWdodCIpLWgsMCkpLGYuY3V0SGVpZ2h0PWg7Yj9iLmVsZW1lbnQuYXBwZW5kQ2hpbGQoZik6Zy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShmLGcpO2QucHVzaChmKX10aGlzLnNoYWRvd3M9ZH1yZXR1cm4gdGhpc319O3ZhciBBYT1mdW5jdGlvbigpe3RoaXMuaW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O0FhLnByb3RvdHlwZT17RWxlbWVudDpyYSxpbml0OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWxvY2F0aW9uLGY7Zj10aGlzLmNyZWF0ZUVsZW1lbnQoInN2ZyIpLmF0dHIoe3htbG5zOnNhLHZlcnNpb246IjEuMSJ9KTthLmFwcGVuZENoaWxkKGYuZWxlbWVudCk7dGhpcy5pc1NWRz0hMDt0aGlzLmJveD1mLmVsZW1lbnQ7dGhpcy5ib3hXcmFwcGVyPWY7dGhpcy5hbGlnbmVkT2JqZWN0cz1bXTt0aGlzLnVybD0oZWJ8fGRiKSYmei5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYmFzZSIpLmxlbmd0aD9lLmhyZWYucmVwbGFjZSgvIy4qPyQvLCIiKS5yZXBsYWNlKC8oW1woJ1wpXSkvZywKIlxcJDEiKS5yZXBsYWNlKC8gL2csIiUyMCIpOiIiO3RoaXMuY3JlYXRlRWxlbWVudCgiZGVzYyIpLmFkZCgpLmVsZW1lbnQuYXBwZW5kQ2hpbGQoei5jcmVhdGVUZXh0Tm9kZSgiQ3JlYXRlZCB3aXRoIEhpZ2hjaGFydHMgMy4wLjEiKSk7dGhpcy5kZWZzPXRoaXMuY3JlYXRlRWxlbWVudCgiZGVmcyIpLmFkZCgpO3RoaXMuZm9yRXhwb3J0PWQ7dGhpcy5ncmFkaWVudHM9e307dGhpcy5zZXRTaXplKGIsYywhMSk7dmFyIGc7aWYoZWImJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXRoaXMuc3ViUGl4ZWxGaXg9Yj1mdW5jdGlvbigpe0woYSx7bGVmdDowLHRvcDowfSk7Zz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO0woYSx7bGVmdDpqYShnLmxlZnQpLWcubGVmdCsicHgiLHRvcDpqYShnLnRvcCktZy50b3ArInB4In0pfSxiKCksSihPLCJyZXNpemUiLGIpfSxpc0hpZGRlbjpmdW5jdGlvbigpe3JldHVybiF0aGlzLmJveFdyYXBwZXIuZ2V0QkJveCgpLndpZHRofSxkZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZGVmczt0aGlzLmJveD1udWxsO3RoaXMuYm94V3JhcHBlcj10aGlzLmJveFdyYXBwZXIuZGVzdHJveSgpO0dhKHRoaXMuZ3JhZGllbnRzfHx7fSk7dGhpcy5ncmFkaWVudHM9bnVsbDtpZihhKXRoaXMuZGVmcz1hLmRlc3Ryb3koKTt0aGlzLnN1YlBpeGVsRml4JiZiYShPLCJyZXNpemUiLHRoaXMuc3ViUGl4ZWxGaXgpO3JldHVybiB0aGlzLmFsaWduZWRPYmplY3RzPW51bGx9LGNyZWF0ZUVsZW1lbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IHRoaXMuRWxlbWVudDtiLmluaXQodGhpcyxhKTtyZXR1cm4gYn0sZHJhdzpmdW5jdGlvbigpe30sYnVpbGRUZXh0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1hLmVsZW1lbnQsYz10aGlzLGQ9Yy5mb3JFeHBvcnQsZT1vKGEudGV4dFN0ciwiIikudG9TdHJpbmcoKS5yZXBsYWNlKC88KGJ8c3Ryb25nKT4vZywnPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OmJvbGQiPicpLnJlcGxhY2UoLzwoaXxlbSk+L2csJzxzcGFuIHN0eWxlPSJmb250LXN0eWxlOml0YWxpYyI+JykucmVwbGFjZSgvPGEvZywKIjxzcGFuIikucmVwbGFjZSgvPFwvKGJ8c3Ryb25nfGl8ZW18YSk+L2csIjwvc3Bhbj4iKS5zcGxpdCgvPGJyLio/Pi9nKSxmPWIuY2hpbGROb2RlcyxnPS9zdHlsZT0iKFteIl0rKSIvLGg9L2hyZWY9IihbXiJdKykiLyxpPUEoYiwieCIpLGo9YS5zdHlsZXMsaz1qJiZqLndpZHRoJiZ1KGoud2lkdGgpLG09aiYmai5saW5lSGVpZ2h0LGw9Zi5sZW5ndGg7bC0tOyliLnJlbW92ZUNoaWxkKGZbbF0pO2smJiFhLmFkZGVkJiZ0aGlzLmJveC5hcHBlbmRDaGlsZChiKTtlW2UubGVuZ3RoLTFdPT09IiImJmUucG9wKCk7bihlLGZ1bmN0aW9uKGUsZil7dmFyIGwsbz0wLGU9ZS5yZXBsYWNlKC88c3Bhbi9nLCJ8fHw8c3BhbiIpLnJlcGxhY2UoLzxcL3NwYW4+L2csIjwvc3Bhbj58fHwiKTtsPWUuc3BsaXQoInx8fCIpO24obCxmdW5jdGlvbihlKXtpZihlIT09IiJ8fGwubGVuZ3RoPT09MSl7dmFyIHA9e30sbj16LmNyZWF0ZUVsZW1lbnROUyhzYSwidHNwYW4iKSxxO2cudGVzdChlKSYmKHE9CmUubWF0Y2goZylbMV0ucmVwbGFjZSgvKDt8IHxeKWNvbG9yKFsgOl0pLywiJDFmaWxsJDIiKSxBKG4sInN0eWxlIixxKSk7aC50ZXN0KGUpJiYhZCYmKEEobiwib25jbGljayIsJ2xvY2F0aW9uLmhyZWY9IicrZS5tYXRjaChoKVsxXSsnIicpLEwobix7Y3Vyc29yOiJwb2ludGVyIn0pKTtlPShlLnJlcGxhY2UoLzwoLnxcbikqPz4vZywiIil8fCIgIikucmVwbGFjZSgvJmx0Oy9nLCI8IikucmVwbGFjZSgvJmd0Oy9nLCI+Iik7bi5hcHBlbmRDaGlsZCh6LmNyZWF0ZVRleHROb2RlKGUpKTtvP3AuZHg9MDpwLng9aTtBKG4scCk7IW8mJmYmJighWiYmZCYmTChuLHtkaXNwbGF5OiJibG9jayJ9KSxBKG4sImR5IixtfHxjLmZvbnRNZXRyaWNzKC9weCQvLnRlc3Qobi5zdHlsZS5mb250U2l6ZSk/bi5zdHlsZS5mb250U2l6ZTpqLmZvbnRTaXplKS5oLGRiJiZuLm9mZnNldEhlaWdodCkpO2IuYXBwZW5kQ2hpbGQobik7bysrO2lmKGspZm9yKHZhciBlPWUucmVwbGFjZSgvKFteXF5dKS0vZywKIiQxLSAiKS5zcGxpdCgiICIpLHIsdD1bXTtlLmxlbmd0aHx8dC5sZW5ndGg7KWRlbGV0ZSBhLmJCb3gscj1hLmdldEJCb3goKS53aWR0aCxwPXI+aywhcHx8ZS5sZW5ndGg9PT0xPyhlPXQsdD1bXSxlLmxlbmd0aCYmKG49ei5jcmVhdGVFbGVtZW50TlMoc2EsInRzcGFuIiksQShuLHtkeTptfHwxNix4Oml9KSxxJiZBKG4sInN0eWxlIixxKSxiLmFwcGVuZENoaWxkKG4pLHI+ayYmKGs9cikpKToobi5yZW1vdmVDaGlsZChuLmZpcnN0Q2hpbGQpLHQudW5zaGlmdChlLnBvcCgpKSksZS5sZW5ndGgmJm4uYXBwZW5kQ2hpbGQoei5jcmVhdGVUZXh0Tm9kZShlLmpvaW4oIiAiKS5yZXBsYWNlKC8tIC9nLCItIikpKX19KX0pfSxidXR0b246ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIGg9dGhpcy5sYWJlbChhLGIsYyxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsImJ1dHRvbiIpLGk9MCxqLGssbSxsLHAsYT17eDE6MCx5MTowLHgyOjAseTI6MX0sZT15KHsic3Ryb2tlLXdpZHRoIjoxLApzdHJva2U6IiNDQ0NDQ0MiLGZpbGw6e2xpbmVhckdyYWRpZW50OmEsc3RvcHM6W1swLCIjRkVGRUZFIl0sWzEsIiNGNkY2RjYiXV19LHI6MixwYWRkaW5nOjUsc3R5bGU6e2NvbG9yOiJibGFjayJ9fSxlKTttPWUuc3R5bGU7ZGVsZXRlIGUuc3R5bGU7Zj15KGUse3N0cm9rZToiIzY4QSIsZmlsbDp7bGluZWFyR3JhZGllbnQ6YSxzdG9wczpbWzAsIiNGRkYiXSxbMSwiI0FDRiJdXX19LGYpO2w9Zi5zdHlsZTtkZWxldGUgZi5zdHlsZTtnPXkoZSx7c3Ryb2tlOiIjNjhBIixmaWxsOntsaW5lYXJHcmFkaWVudDphLHN0b3BzOltbMCwiIzlCRCJdLFsxLCIjQ0RGIl1dfX0sZyk7cD1nLnN0eWxlO2RlbGV0ZSBnLnN0eWxlO0ooaC5lbGVtZW50LCJtb3VzZWVudGVyIixmdW5jdGlvbigpe2guYXR0cihmKS5jc3MobCl9KTtKKGguZWxlbWVudCwibW91c2VsZWF2ZSIsZnVuY3Rpb24oKXtqPVtlLGYsZ11baV07az1bbSxsLHBdW2ldO2guYXR0cihqKS5jc3Moayl9KTtoLnNldFN0YXRlPWZ1bmN0aW9uKGEpeyhpPQphKT9hPT09MiYmaC5hdHRyKGcpLmNzcyhwKTpoLmF0dHIoZSkuY3NzKG0pfTtyZXR1cm4gaC5vbigiY2xpY2siLGZ1bmN0aW9uKCl7ZC5jYWxsKGgpfSkuYXR0cihlKS5jc3Modih7Y3Vyc29yOiJkZWZhdWx0In0sbSkpfSxjcmlzcExpbmU6ZnVuY3Rpb24oYSxiKXthWzFdPT09YVs0XSYmKGFbMV09YVs0XT10KGFbMV0pLWIlMi8yKTthWzJdPT09YVs1XSYmKGFbMl09YVs1XT10KGFbMl0pK2IlMi8yKTtyZXR1cm4gYX0scGF0aDpmdW5jdGlvbihhKXt2YXIgYj17ZmlsbDpTfTtCYShhKT9iLmQ9YTpWKGEpJiZ2KGIsYSk7cmV0dXJuIHRoaXMuY3JlYXRlRWxlbWVudCgicGF0aCIpLmF0dHIoYil9LGNpcmNsZTpmdW5jdGlvbihhLGIsYyl7YT1WKGEpP2E6e3g6YSx5OmIscjpjfTtyZXR1cm4gdGhpcy5jcmVhdGVFbGVtZW50KCJjaXJjbGUiKS5hdHRyKGEpfSxhcmM6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2lmKFYoYSkpYj1hLnksYz1hLnIsZD1hLmlubmVyUixlPWEuc3RhcnQsZj1hLmVuZCwKYT1hLng7cmV0dXJuIHRoaXMuc3ltYm9sKCJhcmMiLGF8fDAsYnx8MCxjfHwwLGN8fDAse2lubmVyUjpkfHwwLHN0YXJ0OmV8fDAsZW5kOmZ8fDB9KX0scmVjdDpmdW5jdGlvbihhLGIsYyxkLGUsZil7ZT1WKGEpP2EucjplO2U9dGhpcy5jcmVhdGVFbGVtZW50KCJyZWN0IikuYXR0cih7cng6ZSxyeTplLGZpbGw6U30pO3JldHVybiBlLmF0dHIoVihhKT9hOmUuY3Jpc3AoZixhLGIscShjLDApLHEoZCwwKSkpfSxzZXRTaXplOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLmFsaWduZWRPYmplY3RzLGU9ZC5sZW5ndGg7dGhpcy53aWR0aD1hO3RoaXMuaGVpZ2h0PWI7Zm9yKHRoaXMuYm94V3JhcHBlcltvKGMsITApPyJhbmltYXRlIjoiYXR0ciJdKHt3aWR0aDphLGhlaWdodDpifSk7ZS0tOylkW2VdLmFsaWduKCl9LGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jcmVhdGVFbGVtZW50KCJnIik7cmV0dXJuIHIoYSk/Yi5hdHRyKHsiY2xhc3MiOiJoaWdoY2hhcnRzLSIrYX0pOmJ9LGltYWdlOmZ1bmN0aW9uKGEsCmIsYyxkLGUpe3ZhciBmPXtwcmVzZXJ2ZUFzcGVjdFJhdGlvOlN9O2FyZ3VtZW50cy5sZW5ndGg+MSYmdihmLHt4OmIseTpjLHdpZHRoOmQsaGVpZ2h0OmV9KTtmPXRoaXMuY3JlYXRlRWxlbWVudCgiaW1hZ2UiKS5hdHRyKGYpO2YuZWxlbWVudC5zZXRBdHRyaWJ1dGVOUz9mLmVsZW1lbnQuc2V0QXR0cmlidXRlTlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLCJocmVmIixhKTpmLmVsZW1lbnQuc2V0QXR0cmlidXRlKCJoYy1zdmctaHJlZiIsYSk7cmV0dXJuIGZ9LHN5bWJvbDpmdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGcsaD10aGlzLnN5bWJvbHNbYV0saD1oJiZoKHQoYiksdChjKSxkLGUsZiksaT0vXnVybFwoKC4qPylcKSQvLGosaztpZihoKWc9dGhpcy5wYXRoKGgpLHYoZyx7c3ltYm9sTmFtZTphLHg6Yix5OmMsd2lkdGg6ZCxoZWlnaHQ6ZX0pLGYmJnYoZyxmKTtlbHNlIGlmKGkudGVzdChhKSlrPWZ1bmN0aW9uKGEsYil7YS5lbGVtZW50JiYoYS5hdHRyKHt3aWR0aDpiWzBdLApoZWlnaHQ6YlsxXX0pLGEuYWxpZ25CeVRyYW5zbGF0ZXx8YS50cmFuc2xhdGUodCgoZC1iWzBdKS8yKSx0KChlLWJbMV0pLzIpKSl9LGo9YS5tYXRjaChpKVsxXSxhPUxiW2pdLGc9dGhpcy5pbWFnZShqKS5hdHRyKHt4OmIseTpjfSksZy5pc0ltZz0hMCxhP2soZyxhKTooZy5hdHRyKHt3aWR0aDowLGhlaWdodDowfSksVSgiaW1nIix7b25sb2FkOmZ1bmN0aW9uKCl7ayhnLExiW2pdPVt0aGlzLndpZHRoLHRoaXMuaGVpZ2h0XSl9LHNyYzpqfSkpO3JldHVybiBnfSxzeW1ib2xzOntjaXJjbGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9MC4xNjYqYztyZXR1cm5bIk0iLGErYy8yLGIsIkMiLGErYytlLGIsYStjK2UsYitkLGErYy8yLGIrZCwiQyIsYS1lLGIrZCxhLWUsYixhK2MvMixiLCJaIl19LHNxdWFyZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm5bIk0iLGEsYiwiTCIsYStjLGIsYStjLGIrZCxhLGIrZCwiWiJdfSx0cmlhbmdsZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm5bIk0iLAphK2MvMixiLCJMIixhK2MsYitkLGEsYitkLCJaIl19LCJ0cmlhbmdsZS1kb3duIjpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm5bIk0iLGEsYiwiTCIsYStjLGIsYStjLzIsYitkLCJaIl19LGRpYW1vbmQ6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuWyJNIixhK2MvMixiLCJMIixhK2MsYitkLzIsYStjLzIsYitkLGEsYitkLzIsIloiXX0sYXJjOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9ZS5zdGFydCxjPWUucnx8Y3x8ZCxnPWUuZW5kLTAuMDAxLGQ9ZS5pbm5lclIsaD1lLm9wZW4saT1ZKGYpLGo9Y2EoZiksaz1ZKGcpLGc9Y2EoZyksZT1lLmVuZC1mPEphPzA6MTtyZXR1cm5bIk0iLGErYyppLGIrYypqLCJBIixjLGMsMCxlLDEsYStjKmssYitjKmcsaD8iTSI6IkwiLGErZCprLGIrZCpnLCJBIixkLGQsMCxlLDAsYStkKmksYitkKmosaD8iIjoiWiJdfX0sY2xpcFJlY3Q6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ImhpZ2hjaGFydHMtIit0YisrLGY9dGhpcy5jcmVhdGVFbGVtZW50KCJjbGlwUGF0aCIpLmF0dHIoe2lkOmV9KS5hZGQodGhpcy5kZWZzKSwKYT10aGlzLnJlY3QoYSxiLGMsZCwwKS5hZGQoZik7YS5pZD1lO2EuY2xpcFBhdGg9ZjtyZXR1cm4gYX0sY29sb3I6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMsZSxmPS9ecmdiYS8sZyxoLGksaixrLG0sbCxwPVtdO2EmJmEubGluZWFyR3JhZGllbnQ/Zz0ibGluZWFyR3JhZGllbnQiOmEmJmEucmFkaWFsR3JhZGllbnQmJihnPSJyYWRpYWxHcmFkaWVudCIpO2lmKGcpe2M9YVtnXTtoPWQuZ3JhZGllbnRzO2o9YS5zdG9wcztiPWIucmFkaWFsUmVmZXJlbmNlO0JhKGMpJiYoYVtnXT1jPXt4MTpjWzBdLHkxOmNbMV0seDI6Y1syXSx5MjpjWzNdLGdyYWRpZW50VW5pdHM6InVzZXJTcGFjZU9uVXNlIn0pO2c9PT0icmFkaWFsR3JhZGllbnQiJiZiJiYhcihjLmdyYWRpZW50VW5pdHMpJiYoYz15KGMse2N4OmJbMF0tYlsyXS8yK2MuY3gqYlsyXSxjeTpiWzFdLWJbMl0vMitjLmN5KmJbMl0scjpjLnIqYlsyXSxncmFkaWVudFVuaXRzOiJ1c2VyU3BhY2VPblVzZSJ9KSk7Zm9yKGwgaW4gYylsIT09CiJpZCImJnAucHVzaChsLGNbbF0pO2ZvcihsIGluIGopcC5wdXNoKGpbbF0pO3A9cC5qb2luKCIsIik7aFtwXT9hPWhbcF0uaWQ6KGMuaWQ9YT0iaGlnaGNoYXJ0cy0iK3RiKyssaFtwXT1pPWQuY3JlYXRlRWxlbWVudChnKS5hdHRyKGMpLmFkZChkLmRlZnMpLGkuc3RvcHM9W10sbihqLGZ1bmN0aW9uKGEpe2YudGVzdChhWzFdKT8oZT1tYShhWzFdKSxrPWUuZ2V0KCJyZ2IiKSxtPWUuZ2V0KCJhIikpOihrPWFbMV0sbT0xKTthPWQuY3JlYXRlRWxlbWVudCgic3RvcCIpLmF0dHIoe29mZnNldDphWzBdLCJzdG9wLWNvbG9yIjprLCJzdG9wLW9wYWNpdHkiOm19KS5hZGQoaSk7aS5zdG9wcy5wdXNoKGEpfSkpO3JldHVybiJ1cmwoIitkLnVybCsiIyIrYSsiKSJ9ZWxzZSByZXR1cm4gZi50ZXN0KGEpPyhlPW1hKGEpLEEoYixjKyItb3BhY2l0eSIsZS5nZXQoImEiKSksZS5nZXQoInJnYiIpKTooYi5yZW1vdmVBdHRyaWJ1dGUoYysiLW9wYWNpdHkiKSxhKX0sdGV4dDpmdW5jdGlvbihhLApiLGMsZCl7dmFyIGU9Ti5jaGFydC5zdHlsZSxmPSR8fCFaJiZ0aGlzLmZvckV4cG9ydDtpZihkJiYhdGhpcy5mb3JFeHBvcnQpcmV0dXJuIHRoaXMuaHRtbChhLGIsYyk7Yj10KG8oYiwwKSk7Yz10KG8oYywwKSk7YT10aGlzLmNyZWF0ZUVsZW1lbnQoInRleHQiKS5hdHRyKHt4OmIseTpjLHRleHQ6YX0pLmNzcyh7Zm9udEZhbWlseTplLmZvbnRGYW1pbHksZm9udFNpemU6ZS5mb250U2l6ZX0pO2YmJmEuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUifSk7YS54PWI7YS55PWM7cmV0dXJuIGF9LGh0bWw6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPU4uY2hhcnQuc3R5bGUsZT10aGlzLmNyZWF0ZUVsZW1lbnQoInNwYW4iKSxmPWUuYXR0clNldHRlcnMsZz1lLmVsZW1lbnQsaD1lLnJlbmRlcmVyO2YudGV4dD1mdW5jdGlvbihhKXthIT09Zy5pbm5lckhUTUwmJmRlbGV0ZSB0aGlzLmJCb3g7Zy5pbm5lckhUTUw9YTtyZXR1cm4hMX07Zi54PWYueT1mLmFsaWduPWZ1bmN0aW9uKGEsYil7Yj09PSJhbGlnbiImJgooYj0idGV4dEFsaWduIik7ZVtiXT1hO2UuaHRtbFVwZGF0ZVRyYW5zZm9ybSgpO3JldHVybiExfTtlLmF0dHIoe3RleHQ6YSx4OnQoYikseTp0KGMpfSkuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHdoaXRlU3BhY2U6Im5vd3JhcCIsZm9udEZhbWlseTpkLmZvbnRGYW1pbHksZm9udFNpemU6ZC5mb250U2l6ZX0pO2UuY3NzPWUuaHRtbENzcztpZihoLmlzU1ZHKWUuYWRkPWZ1bmN0aW9uKGEpe3ZhciBiLGM9aC5ib3gucGFyZW50Tm9kZSxkPVtdO2lmKGEpe2lmKGI9YS5kaXYsIWIpe2Zvcig7YTspZC5wdXNoKGEpLGE9YS5wYXJlbnRHcm91cDtuKGQucmV2ZXJzZSgpLGZ1bmN0aW9uKGEpe3ZhciBkO2I9YS5kaXY9YS5kaXZ8fFUod2Ese2NsYXNzTmFtZTpBKGEuZWxlbWVudCwiY2xhc3MiKX0se3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDooYS50cmFuc2xhdGVYfHwwKSsicHgiLHRvcDooYS50cmFuc2xhdGVZfHwwKSsicHgifSxifHxjKTtkPWIuc3R5bGU7dihhLmF0dHJTZXR0ZXJzLAp7dHJhbnNsYXRlWDpmdW5jdGlvbihhKXtkLmxlZnQ9YSsicHgifSx0cmFuc2xhdGVZOmZ1bmN0aW9uKGEpe2QudG9wPWErInB4In0sdmlzaWJpbGl0eTpmdW5jdGlvbihhLGIpe2RbYl09YX19KX0pfX1lbHNlIGI9YztiLmFwcGVuZENoaWxkKGcpO2UuYWRkZWQ9ITA7ZS5hbGlnbk9uQWRkJiZlLmh0bWxVcGRhdGVUcmFuc2Zvcm0oKTtyZXR1cm4gZX07cmV0dXJuIGV9LGZvbnRNZXRyaWNzOmZ1bmN0aW9uKGEpe3ZhciBhPXUoYXx8MTEpLGE9YTwyND9hKzQ6dChhKjEuMiksYj10KGEqMC44KTtyZXR1cm57aDphLGI6Yn19LGxhYmVsOmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpKXtmdW5jdGlvbiBqKCl7dmFyIGEsYjthPW8uZWxlbWVudC5zdHlsZTt3PShMYT09PXZvaWQgMHx8eGI9PT12b2lkIDB8fHMuc3R5bGVzLnRleHRBbGlnbikmJm8uZ2V0QkJveCgpO3Mud2lkdGg9KExhfHx3LndpZHRofHwwKSsyKnEraGI7cy5oZWlnaHQ9KHhifHx3LmhlaWdodHx8MCkrMipxO0E9cStwLmZvbnRNZXRyaWNzKGEmJgphLmZvbnRTaXplKS5iO2lmKHope2lmKCFCKWE9dCgtRypxKSxiPWg/LUE6MCxzLmJveD1CPWQ/cC5zeW1ib2woZCxhLGIscy53aWR0aCxzLmhlaWdodCk6cC5yZWN0KGEsYixzLndpZHRoLHMuaGVpZ2h0LDAsdVtOYl0pLEIuYWRkKHMpO0IuaXNJbWd8fEIuYXR0cih5KHt3aWR0aDpzLndpZHRoLGhlaWdodDpzLmhlaWdodH0sdSkpO3U9bnVsbH19ZnVuY3Rpb24gaygpe3ZhciBhPXMuc3R5bGVzLGE9YSYmYS50ZXh0QWxpZ24sYj1oYitxKigxLUcpLGM7Yz1oPzA6QTtpZihyKExhKSYmKGE9PT0iY2VudGVyInx8YT09PSJyaWdodCIpKWIrPXtjZW50ZXI6MC41LHJpZ2h0OjF9W2FdKihMYS13LndpZHRoKTsoYiE9PW8ueHx8YyE9PW8ueSkmJm8uYXR0cih7eDpiLHk6Y30pO28ueD1iO28ueT1jfWZ1bmN0aW9uIG0oYSxiKXtCP0IuYXR0cihhLGIpOnVbYV09Yn1mdW5jdGlvbiBsKCl7by5hZGQocyk7cy5hdHRyKHt0ZXh0OmEseDpiLHk6Y30pO0ImJnIoZSkmJnMuYXR0cih7YW5jaG9yWDplLAphbmNob3JZOmZ9KX12YXIgcD10aGlzLHM9cC5nKGkpLG89cC50ZXh0KCIiLDAsMCxnKS5hdHRyKHt6SW5kZXg6MX0pLEIsdyxHPTAscT0zLGhiPTAsTGEseGIsUCxILEM9MCx1PXt9LEEsZz1zLmF0dHJTZXR0ZXJzLHo7SihzLCJhZGQiLGwpO2cud2lkdGg9ZnVuY3Rpb24oYSl7TGE9YTtyZXR1cm4hMX07Zy5oZWlnaHQ9ZnVuY3Rpb24oYSl7eGI9YTtyZXR1cm4hMX07Zy5wYWRkaW5nPWZ1bmN0aW9uKGEpe3IoYSkmJmEhPT1xJiYocT1hLGsoKSk7cmV0dXJuITF9O2cucGFkZGluZ0xlZnQ9ZnVuY3Rpb24oYSl7cihhKSYmYSE9PWhiJiYoaGI9YSxrKCkpO3JldHVybiExfTtnLmFsaWduPWZ1bmN0aW9uKGEpe0c9e2xlZnQ6MCxjZW50ZXI6MC41LHJpZ2h0OjF9W2FdO3JldHVybiExfTtnLnRleHQ9ZnVuY3Rpb24oYSxiKXtvLmF0dHIoYixhKTtqKCk7aygpO3JldHVybiExfTtnW05iXT1mdW5jdGlvbihhLGIpe3o9ITA7Qz1hJTIvMjttKGIsYSk7cmV0dXJuITF9O2cuc3Ryb2tlPWcuZmlsbD0KZy5yPWZ1bmN0aW9uKGEsYil7Yj09PSJmaWxsIiYmKHo9ITApO20oYixhKTtyZXR1cm4hMX07Zy5hbmNob3JYPWZ1bmN0aW9uKGEsYil7ZT1hO20oYixhK0MtUCk7cmV0dXJuITF9O2cuYW5jaG9yWT1mdW5jdGlvbihhLGIpe2Y9YTttKGIsYS1IKTtyZXR1cm4hMX07Zy54PWZ1bmN0aW9uKGEpe3MueD1hO2EtPUcqKChMYXx8dy53aWR0aCkrcSk7UD10KGEpO3MuYXR0cigidHJhbnNsYXRlWCIsUCk7cmV0dXJuITF9O2cueT1mdW5jdGlvbihhKXtIPXMueT10KGEpO3MuYXR0cigidHJhbnNsYXRlWSIsSCk7cmV0dXJuITF9O3ZhciBFPXMuY3NzO3JldHVybiB2KHMse2NzczpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj17fSxhPXkoYSk7bigiZm9udFNpemUsZm9udFdlaWdodCxmb250RmFtaWx5LGNvbG9yLGxpbmVIZWlnaHQsd2lkdGgiLnNwbGl0KCIsIiksZnVuY3Rpb24oYyl7YVtjXSE9PXgmJihiW2NdPWFbY10sZGVsZXRlIGFbY10pfSk7by5jc3MoYil9cmV0dXJuIEUuY2FsbChzLGEpfSwKZ2V0QkJveDpmdW5jdGlvbigpe3JldHVybnt3aWR0aDp3LndpZHRoKzIqcSxoZWlnaHQ6dy5oZWlnaHQrMipxLHg6dy54LXEseTp3LnktcX19LHNoYWRvdzpmdW5jdGlvbihhKXtCJiZCLnNoYWRvdyhhKTtyZXR1cm4gc30sZGVzdHJveTpmdW5jdGlvbigpe2JhKHMsImFkZCIsbCk7YmEocy5lbGVtZW50LCJtb3VzZWVudGVyIik7YmEocy5lbGVtZW50LCJtb3VzZWxlYXZlIik7byYmKG89by5kZXN0cm95KCkpO0ImJihCPUIuZGVzdHJveSgpKTtyYS5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHMpO3M9cD1qPWs9bT1sPW51bGx9fSl9fTtTYT1BYTt2YXIgRjtpZighWiYmISQpe0hpZ2hjaGFydHMuVk1MRWxlbWVudD1GPXtpbml0OmZ1bmN0aW9uKGEsYil7dmFyIGM9WyI8IixiLCcgZmlsbGVkPSJmIiBzdHJva2VkPSJmIiddLGQ9WyJwb3NpdGlvbjogIiwiYWJzb2x1dGUiLCI7Il0sZT1iPT09d2E7KGI9PT0ic2hhcGUifHxlKSYmZC5wdXNoKCJsZWZ0OjA7dG9wOjA7d2lkdGg6MXB4O2hlaWdodDoxcHg7Iik7CmQucHVzaCgidmlzaWJpbGl0eTogIixlPyJoaWRkZW4iOiJ2aXNpYmxlIik7Yy5wdXNoKCcgc3R5bGU9IicsZC5qb2luKCIiKSwnIi8+Jyk7aWYoYiljPWV8fGI9PT0ic3BhbiJ8fGI9PT0iaW1nIj9jLmpvaW4oIiIpOmEucHJlcFZNTChjKSx0aGlzLmVsZW1lbnQ9VShjKTt0aGlzLnJlbmRlcmVyPWE7dGhpcy5hdHRyU2V0dGVycz17fX0sYWRkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucmVuZGVyZXIsYz10aGlzLmVsZW1lbnQsZD1iLmJveCxkPWE/YS5lbGVtZW50fHxhOmQ7YSYmYS5pbnZlcnRlZCYmYi5pbnZlcnRDaGlsZChjLGQpO2QuYXBwZW5kQ2hpbGQoYyk7dGhpcy5hZGRlZD0hMDt0aGlzLmFsaWduT25BZGQmJiF0aGlzLmRlZmVyVXBkYXRlVHJhbnNmb3JtJiZ0aGlzLnVwZGF0ZVRyYW5zZm9ybSgpO0QodGhpcywiYWRkIik7cmV0dXJuIHRoaXN9LHVwZGF0ZVRyYW5zZm9ybTpyYS5wcm90b3R5cGUuaHRtbFVwZGF0ZVRyYW5zZm9ybSxhdHRyOmZ1bmN0aW9uKGEsYil7dmFyIGMsCmQsZSxmPXRoaXMuZWxlbWVudHx8e30sZz1mLnN0eWxlLGg9Zi5ub2RlTmFtZSxpPXRoaXMucmVuZGVyZXIsaj10aGlzLnN5bWJvbE5hbWUsayxtPXRoaXMuc2hhZG93cyxsLHA9dGhpcy5hdHRyU2V0dGVycyxzPXRoaXM7ZmEoYSkmJnIoYikmJihjPWEsYT17fSxhW2NdPWIpO2lmKGZhKGEpKWM9YSxzPWM9PT0ic3Ryb2tlV2lkdGgifHxjPT09InN0cm9rZS13aWR0aCI/dGhpcy5zdHJva2V3ZWlnaHQ6dGhpc1tjXTtlbHNlIGZvcihjIGluIGEpaWYoZD1hW2NdLGw9ITEsZT1wW2NdJiZwW2NdLmNhbGwodGhpcyxkLGMpLGUhPT0hMSYmZCE9PW51bGwpe2UhPT14JiYoZD1lKTtpZihqJiYvXih4fHl8cnxzdGFydHxlbmR8d2lkdGh8aGVpZ2h0fGlubmVyUnxhbmNob3JYfGFuY2hvclkpLy50ZXN0KGMpKWt8fCh0aGlzLnN5bWJvbEF0dHIoYSksaz0hMCksbD0hMDtlbHNlIGlmKGM9PT0iZCIpe2Q9ZHx8W107dGhpcy5kPWQuam9pbigiICIpO2U9ZC5sZW5ndGg7bD1bXTtmb3IodmFyIG87ZS0tOylpZihDYShkW2VdKSlsW2VdPQp0KGRbZV0qMTApLTU7ZWxzZSBpZihkW2VdPT09IloiKWxbZV09IngiO2Vsc2UgaWYobFtlXT1kW2VdLGQuaXNBcmMmJihkW2VdPT09IndhInx8ZFtlXT09PSJhdCIpKW89ZFtlXT09PSJ3YSI/MTotMSxsW2UrNV09PT1sW2UrN10mJihsW2UrN10tPW8pLGxbZSs2XT09PWxbZSs4XSYmKGxbZSs4XS09byk7ZD1sLmpvaW4oIiAiKXx8IngiO2YucGF0aD1kO2lmKG0pZm9yKGU9bS5sZW5ndGg7ZS0tOyltW2VdLnBhdGg9bVtlXS5jdXRPZmY/dGhpcy5jdXRPZmZQYXRoKGQsbVtlXS5jdXRPZmYpOmQ7bD0hMH1lbHNlIGlmKGM9PT0idmlzaWJpbGl0eSIpe2lmKG0pZm9yKGU9bS5sZW5ndGg7ZS0tOyltW2VdLnN0eWxlW2NdPWQ7aD09PSJESVYiJiYoZD1kPT09ImhpZGRlbiI/Ii05OTllbSI6MCxjYnx8KGdbY109ZD8idmlzaWJsZSI6ImhpZGRlbiIpLGM9InRvcCIpO2dbY109ZDtsPSEwfWVsc2UgaWYoYz09PSJ6SW5kZXgiKWQmJihnW2NdPWQpLGw9ITA7ZWxzZSBpZihsYShjLFsieCIsInkiLAoid2lkdGgiLCJoZWlnaHQiXSkhPT0tMSl0aGlzW2NdPWQsYz09PSJ4Inx8Yz09PSJ5Ij9jPXt4OiJsZWZ0Iix5OiJ0b3AifVtjXTpkPXEoMCxkKSx0aGlzLnVwZGF0ZUNsaXBwaW5nPyh0aGlzW2NdPWQsdGhpcy51cGRhdGVDbGlwcGluZygpKTpnW2NdPWQsbD0hMDtlbHNlIGlmKGM9PT0iY2xhc3MiJiZoPT09IkRJViIpZi5jbGFzc05hbWU9ZDtlbHNlIGlmKGM9PT0ic3Ryb2tlIilkPWkuY29sb3IoZCxmLGMpLGM9InN0cm9rZWNvbG9yIjtlbHNlIGlmKGM9PT0ic3Ryb2tlLXdpZHRoInx8Yz09PSJzdHJva2VXaWR0aCIpZi5zdHJva2VkPWQ/ITA6ITEsYz0ic3Ryb2tld2VpZ2h0Iix0aGlzW2NdPWQsQ2EoZCkmJihkKz0icHgiKTtlbHNlIGlmKGM9PT0iZGFzaHN0eWxlIikoZi5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3Ryb2tlIilbMF18fFUoaS5wcmVwVk1MKFsiPHN0cm9rZS8+Il0pLG51bGwsbnVsbCxmKSlbY109ZHx8InNvbGlkIix0aGlzLmRhc2hzdHlsZT1kLGw9ITA7ZWxzZSBpZihjPT09CiJmaWxsIilpZihoPT09IlNQQU4iKWcuY29sb3I9ZDtlbHNle2lmKGghPT0iSU1HIilmLmZpbGxlZD1kIT09Uz8hMDohMSxkPWkuY29sb3IoZCxmLGMsdGhpcyksYz0iZmlsbGNvbG9yIn1lbHNlIGlmKGM9PT0ib3BhY2l0eSIpbD0hMDtlbHNlIGlmKGg9PT0ic2hhcGUiJiZjPT09InJvdGF0aW9uIil0aGlzW2NdPWQsZi5zdHlsZS5sZWZ0PS10KGNhKGQqYmIpKzEpKyJweCIsZi5zdHlsZS50b3A9dChZKGQqYmIpKSsicHgiO2Vsc2UgaWYoYz09PSJ0cmFuc2xhdGVYInx8Yz09PSJ0cmFuc2xhdGVZInx8Yz09PSJyb3RhdGlvbiIpdGhpc1tjXT1kLHRoaXMudXBkYXRlVHJhbnNmb3JtKCksbD0hMDtlbHNlIGlmKGM9PT0idGV4dCIpdGhpcy5iQm94PW51bGwsZi5pbm5lckhUTUw9ZCxsPSEwO2x8fChjYj9mW2NdPWQ6QShmLGMsZCkpfXJldHVybiBzfSxjbGlwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYzthPyhjPWEubWVtYmVycyxnYShjLGIpLGMucHVzaChiKSxiLmRlc3Ryb3lDbGlwPQpmdW5jdGlvbigpe2dhKGMsYil9LGE9YS5nZXRDU1MoYikpOihiLmRlc3Ryb3lDbGlwJiZiLmRlc3Ryb3lDbGlwKCksYT17Y2xpcDpjYj8iaW5oZXJpdCI6InJlY3QoYXV0bykifSk7cmV0dXJuIGIuY3NzKGEpfSxjc3M6cmEucHJvdG90eXBlLmh0bWxDc3Msc2FmZVJlbW92ZUNoaWxkOmZ1bmN0aW9uKGEpe2EucGFyZW50Tm9kZSYmUmEoYSl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmRlc3Ryb3lDbGlwJiZ0aGlzLmRlc3Ryb3lDbGlwKCk7cmV0dXJuIHJhLnByb3RvdHlwZS5kZXN0cm95LmFwcGx5KHRoaXMpfSxvbjpmdW5jdGlvbihhLGIpe3RoaXMuZWxlbWVudFsib24iK2FdPWZ1bmN0aW9uKCl7dmFyIGE9Ty5ldmVudDthLnRhcmdldD1hLnNyY0VsZW1lbnQ7YihhKX07cmV0dXJuIHRoaXN9LGN1dE9mZlBhdGg6ZnVuY3Rpb24oYSxiKXt2YXIgYyxhPWEuc3BsaXQoL1sgLF0vKTtjPWEubGVuZ3RoO2lmKGM9PT05fHxjPT09MTEpYVtjLTRdPWFbYy0yXT11KGFbYy0yXSktMTAqYjsKcmV0dXJuIGEuam9pbigiICIpfSxzaGFkb3c6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPVtdLGUsZj10aGlzLmVsZW1lbnQsZz10aGlzLnJlbmRlcmVyLGgsaT1mLnN0eWxlLGosaz1mLnBhdGgsbSxsLHAscztrJiZ0eXBlb2Ygay52YWx1ZSE9PSJzdHJpbmciJiYoaz0ieCIpO2w9aztpZihhKXtwPW8oYS53aWR0aCwzKTtzPShhLm9wYWNpdHl8fDAuMTUpL3A7Zm9yKGU9MTtlPD0zO2UrKyl7bT1wKjIrMS0yKmU7YyYmKGw9dGhpcy5jdXRPZmZQYXRoKGsudmFsdWUsbSswLjUpKTtqPVsnPHNoYXBlIGlzU2hhZG93PSJ0cnVlIiBzdHJva2V3ZWlnaHQ9IicsbSwnIiBmaWxsZWQ9ImZhbHNlIiBwYXRoPSInLGwsJyIgY29vcmRzaXplPSIxMCAxMCIgc3R5bGU9IicsZi5zdHlsZS5jc3NUZXh0LCciIC8+J107aD1VKGcucHJlcFZNTChqKSxudWxsLHtsZWZ0OnUoaS5sZWZ0KStvKGEub2Zmc2V0WCwxKSx0b3A6dShpLnRvcCkrbyhhLm9mZnNldFksMSl9KTtpZihjKWguY3V0T2ZmPW0rMTtqPVsnPHN0cm9rZSBjb2xvcj0iJywKYS5jb2xvcnx8ImJsYWNrIiwnIiBvcGFjaXR5PSInLHMqZSwnIi8+J107VShnLnByZXBWTUwoaiksbnVsbCxudWxsLGgpO2I/Yi5lbGVtZW50LmFwcGVuZENoaWxkKGgpOmYucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxmKTtkLnB1c2goaCl9dGhpcy5zaGFkb3dzPWR9cmV0dXJuIHRoaXN9fTtGPWVhKHJhLEYpO3ZhciBuYT17RWxlbWVudDpGLGlzSUU4OnlhLmluZGV4T2YoIk1TSUUgOC4wIik+LTEsaW5pdDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTt0aGlzLmFsaWduZWRPYmplY3RzPVtdO2Q9dGhpcy5jcmVhdGVFbGVtZW50KHdhKTtlPWQuZWxlbWVudDtlLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSI7YS5hcHBlbmRDaGlsZChkLmVsZW1lbnQpO3RoaXMuaXNWTUw9ITA7dGhpcy5ib3g9ZTt0aGlzLmJveFdyYXBwZXI9ZDt0aGlzLnNldFNpemUoYixjLCExKTtpZighei5uYW1lc3BhY2VzLmhjdil6Lm5hbWVzcGFjZXMuYWRkKCJoY3YiLCJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnZtbCIpLAp6LmNyZWF0ZVN0eWxlU2hlZXQoKS5jc3NUZXh0PSJoY3ZcXDpmaWxsLCBoY3ZcXDpwYXRoLCBoY3ZcXDpzaGFwZSwgaGN2XFw6c3Ryb2tleyBiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyB9ICJ9LGlzSGlkZGVuOmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuYm94Lm9mZnNldFdpZHRofSxjbGlwUmVjdDpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT10aGlzLmNyZWF0ZUVsZW1lbnQoKSxmPVYoYSk7cmV0dXJuIHYoZSx7bWVtYmVyczpbXSxsZWZ0OmY/YS54OmEsdG9wOmY/YS55OmIsd2lkdGg6Zj9hLndpZHRoOmMsaGVpZ2h0OmY/YS5oZWlnaHQ6ZCxnZXRDU1M6ZnVuY3Rpb24oYSl7dmFyIGI9YS5lbGVtZW50LGM9Yi5ub2RlTmFtZSxhPWEuaW52ZXJ0ZWQsZD10aGlzLnRvcC0oYz09PSJzaGFwZSI/Yi5vZmZzZXRUb3A6MCksZT10aGlzLmxlZnQsYj1lK3RoaXMud2lkdGgsZj1kK3RoaXMuaGVpZ2h0LGQ9e2NsaXA6InJlY3QoIit0KGE/ZTpkKSsKInB4LCIrdChhP2Y6YikrInB4LCIrdChhP2I6ZikrInB4LCIrdChhP2Q6ZSkrInB4KSJ9OyFhJiZjYiYmYz09PSJESVYiJiZ2KGQse3dpZHRoOmIrInB4IixoZWlnaHQ6ZisicHgifSk7cmV0dXJuIGR9LHVwZGF0ZUNsaXBwaW5nOmZ1bmN0aW9uKCl7bihlLm1lbWJlcnMsZnVuY3Rpb24oYSl7YS5jc3MoZS5nZXRDU1MoYSkpfSl9fSl9LGNvbG9yOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXMsZixnPS9ecmdiYS8saCxpLGo9UzthJiZhLmxpbmVhckdyYWRpZW50P2k9ImdyYWRpZW50IjphJiZhLnJhZGlhbEdyYWRpZW50JiYoaT0icGF0dGVybiIpO2lmKGkpe3ZhciBrLG0sbD1hLmxpbmVhckdyYWRpZW50fHxhLnJhZGlhbEdyYWRpZW50LHAscyxvLEIsdyxxPSIiLGE9YS5zdG9wcyxyLHQ9W10seD1mdW5jdGlvbigpe2g9Wyc8ZmlsbCBjb2xvcnM9IicrdC5qb2luKCIsIikrJyIgb3BhY2l0eT0iJyxvLCciIG86b3BhY2l0eTI9IicscywnIiB0eXBlPSInLGksJyIgJyxxLCdmb2N1cz0iMTAwJSIgbWV0aG9kPSJhbnkiIC8+J107ClUoZS5wcmVwVk1MKGgpLG51bGwsbnVsbCxiKX07cD1hWzBdO3I9YVthLmxlbmd0aC0xXTtwWzBdPjAmJmEudW5zaGlmdChbMCxwWzFdXSk7clswXTwxJiZhLnB1c2goWzEsclsxXV0pO24oYSxmdW5jdGlvbihhLGIpe2cudGVzdChhWzFdKT8oZj1tYShhWzFdKSxrPWYuZ2V0KCJyZ2IiKSxtPWYuZ2V0KCJhIikpOihrPWFbMV0sbT0xKTt0LnB1c2goYVswXSoxMDArIiUgIitrKTtiPyhvPW0sQj1rKToocz1tLHc9ayl9KTtpZihjPT09ImZpbGwiKWlmKGk9PT0iZ3JhZGllbnQiKWM9bC54MXx8bFswXXx8MCxhPWwueTF8fGxbMV18fDAscD1sLngyfHxsWzJdfHwwLGw9bC55Mnx8bFszXXx8MCxxPSdhbmdsZT0iJysoOTAtSS5hdGFuKChsLWEpLyhwLWMpKSoxODAvSmEpKyciJyx4KCk7ZWxzZXt2YXIgaj1sLnIsdj1qKjIsUD1qKjIsSD1sLmN4LEM9bC5jeSx5PWIucmFkaWFsUmVmZXJlbmNlLHUsaj1mdW5jdGlvbigpe3kmJih1PWQuZ2V0QkJveCgpLEgrPSh5WzBdLXUueCkvdS53aWR0aC0KMC41LEMrPSh5WzFdLXUueSkvdS5oZWlnaHQtMC41LHYqPXlbMl0vdS53aWR0aCxQKj15WzJdL3UuaGVpZ2h0KTtxPSdzcmM9IicrTi5nbG9iYWwuVk1MUmFkaWFsR3JhZGllbnRVUkwrJyIgc2l6ZT0iJyt2KyIsIitQKyciIG9yaWdpbj0iMC41LDAuNSIgcG9zaXRpb249IicrSCsiLCIrQysnIiBjb2xvcjI9IicrdysnIiAnO3goKX07ZC5hZGRlZD9qKCk6SihkLCJhZGQiLGopO2o9Qn1lbHNlIGo9a31lbHNlIGlmKGcudGVzdChhKSYmYi50YWdOYW1lIT09IklNRyIpZj1tYShhKSxoPVsiPCIsYywnIG9wYWNpdHk9IicsZi5nZXQoImEiKSwnIi8+J10sVSh0aGlzLnByZXBWTUwoaCksbnVsbCxudWxsLGIpLGo9Zi5nZXQoInJnYiIpO2Vsc2V7aj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGMpO2lmKGoubGVuZ3RoKWpbMF0ub3BhY2l0eT0xLGpbMF0udHlwZT0ic29saWQiO2o9YX1yZXR1cm4gan0scHJlcFZNTDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmlzSUU4LGE9YS5qb2luKCIiKTtiPwooYT1hLnJlcGxhY2UoIi8+IiwnIHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnZtbCIgLz4nKSxhPWEuaW5kZXhPZignc3R5bGU9IicpPT09LTE/YS5yZXBsYWNlKCIvPiIsJyBzdHlsZT0iZGlzcGxheTppbmxpbmUtYmxvY2s7YmVoYXZpb3I6dXJsKCNkZWZhdWx0I1ZNTCk7IiAvPicpOmEucmVwbGFjZSgnc3R5bGU9IicsJ3N0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jaztiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKTsnKSk6YT1hLnJlcGxhY2UoIjwiLCI8aGN2OiIpO3JldHVybiBhfSx0ZXh0OkFhLnByb3RvdHlwZS5odG1sLHBhdGg6ZnVuY3Rpb24oYSl7dmFyIGI9e2Nvb3Jkc2l6ZToiMTAgMTAifTtCYShhKT9iLmQ9YTpWKGEpJiZ2KGIsYSk7cmV0dXJuIHRoaXMuY3JlYXRlRWxlbWVudCgic2hhcGUiKS5hdHRyKGIpfSxjaXJjbGU6ZnVuY3Rpb24oYSxiLGMpe2lmKFYoYSkpYz1hLnIsYj1hLnksYT1hLng7cmV0dXJuIHRoaXMuc3ltYm9sKCJjaXJjbGUiKS5hdHRyKHt4OmEtCmMseTpiLWMsd2lkdGg6MipjLGhlaWdodDoyKmN9KX0sZzpmdW5jdGlvbihhKXt2YXIgYjthJiYoYj17Y2xhc3NOYW1lOiJoaWdoY2hhcnRzLSIrYSwiY2xhc3MiOiJoaWdoY2hhcnRzLSIrYX0pO3JldHVybiB0aGlzLmNyZWF0ZUVsZW1lbnQod2EpLmF0dHIoYil9LGltYWdlOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9dGhpcy5jcmVhdGVFbGVtZW50KCJpbWciKS5hdHRyKHtzcmM6YX0pO2FyZ3VtZW50cy5sZW5ndGg+MSYmZi5hdHRyKHt4OmIseTpjLHdpZHRoOmQsaGVpZ2h0OmV9KTtyZXR1cm4gZn0scmVjdDpmdW5jdGlvbihhLGIsYyxkLGUsZil7aWYoVihhKSliPWEueSxjPWEud2lkdGgsZD1hLmhlaWdodCxmPWEuc3Ryb2tlV2lkdGgsYT1hLng7dmFyIGc9dGhpcy5zeW1ib2woInJlY3QiKTtnLnI9ZTtyZXR1cm4gZy5hdHRyKGcuY3Jpc3AoZixhLGIscShjLDApLHEoZCwwKSkpfSxpbnZlcnRDaGlsZDpmdW5jdGlvbihhLGIpe3ZhciBjPWIuc3R5bGU7TChhLHtmbGlwOiJ4IiwKbGVmdDp1KGMud2lkdGgpLTEsdG9wOnUoYy5oZWlnaHQpLTEscm90YXRpb246LTkwfSl9LHN5bWJvbHM6e2FyYzpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWUuc3RhcnQsZz1lLmVuZCxoPWUucnx8Y3x8ZCxjPWUuaW5uZXJSLGQ9WShmKSxpPWNhKGYpLGo9WShnKSxrPWNhKGcpO2lmKGctZj09PTApcmV0dXJuWyJ4Il07Zj1bIndhIixhLWgsYi1oLGEraCxiK2gsYStoKmQsYitoKmksYStoKmosYitoKmtdO2Uub3BlbiYmIWMmJmYucHVzaCgiZSIsIk0iLGEsYik7Zi5wdXNoKCJhdCIsYS1jLGItYyxhK2MsYitjLGErYypqLGIrYyprLGErYypkLGIrYyppLCJ4IiwiZSIpO2YuaXNBcmM9ITA7cmV0dXJuIGZ9LGNpcmNsZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm5bIndhIixhLGIsYStjLGIrZCxhK2MsYitkLzIsYStjLGIrZC8yLCJlIl19LHJlY3Q6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hK2MsZz1iK2QsaDshcihlKXx8IWUucj9mPUFhLnByb3RvdHlwZS5zeW1ib2xzLnNxdWFyZS5hcHBseSgwLAphcmd1bWVudHMpOihoPUsoZS5yLGMsZCksZj1bIk0iLGEraCxiLCJMIixmLWgsYiwid2EiLGYtMipoLGIsZixiKzIqaCxmLWgsYixmLGIraCwiTCIsZixnLWgsIndhIixmLTIqaCxnLTIqaCxmLGcsZixnLWgsZi1oLGcsIkwiLGEraCxnLCJ3YSIsYSxnLTIqaCxhKzIqaCxnLGEraCxnLGEsZy1oLCJMIixhLGIraCwid2EiLGEsYixhKzIqaCxiKzIqaCxhLGIraCxhK2gsYiwieCIsImUiXSk7cmV0dXJuIGZ9fX07SGlnaGNoYXJ0cy5WTUxSZW5kZXJlcj1GPWZ1bmN0aW9uKCl7dGhpcy5pbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX07Ri5wcm90b3R5cGU9eShBYS5wcm90b3R5cGUsbmEpO1NhPUZ9dmFyIFFiO2lmKCQpSGlnaGNoYXJ0cy5DYW5WR1JlbmRlcmVyPUY9ZnVuY3Rpb24oKXtzYT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCJ9LEYucHJvdG90eXBlLnN5bWJvbHM9e30sUWI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dmFyIGE9Yi5sZW5ndGgsZDtmb3IoZD0wO2Q8YTtkKyspYltkXSgpOwpiPVtdfXZhciBiPVtdO3JldHVybntwdXNoOmZ1bmN0aW9uKGMsZCl7Yi5sZW5ndGg9PT0wJiZTYihkLGEpO2IucHVzaChjKX19fSgpLFNhPUY7SWEucHJvdG90eXBlPXthZGRMYWJlbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYXhpcyxiPWEub3B0aW9ucyxjPWEuY2hhcnQsZD1hLmhvcml6LGU9YS5jYXRlZ29yaWVzLGY9YS5zZXJpZXNbMF0mJmEuc2VyaWVzWzBdLm5hbWVzLGc9dGhpcy5wb3MsaD1iLmxhYmVscyxpPWEudGlja1Bvc2l0aW9ucyxkPWQmJmUmJiFoLnN0ZXAmJiFoLnN0YWdnZXJMaW5lcyYmIWgucm90YXRpb24mJmMucGxvdFdpZHRoL2kubGVuZ3RofHwhZCYmKGMub3B0aW9uc01hcmdpbkxlZnR8fGMucGxvdFdpZHRoLzIpLGo9Zz09PWlbMF0saz1nPT09aVtpLmxlbmd0aC0xXSxmPWU/byhlW2ddLGYmJmZbZ10sZyk6ZyxlPXRoaXMubGFiZWwsaT1pLmluZm8sbTthLmlzRGF0ZXRpbWVBeGlzJiZpJiYobT1iLmRhdGVUaW1lTGFiZWxGb3JtYXRzW2kuaGlnaGVyUmFua3NbZ118fAppLnVuaXROYW1lXSk7dGhpcy5pc0ZpcnN0PWo7dGhpcy5pc0xhc3Q9aztiPWEubGFiZWxGb3JtYXR0ZXIuY2FsbCh7YXhpczphLGNoYXJ0OmMsaXNGaXJzdDpqLGlzTGFzdDprLGRhdGVUaW1lTGFiZWxGb3JtYXQ6bSx2YWx1ZTphLmlzTG9nP2lhKGRhKGYpKTpmfSk7Zz1kJiZ7d2lkdGg6cSgxLHQoZC0yKihoLnBhZGRpbmd8fDEwKSkpKyJweCJ9O2c9dihnLGguc3R5bGUpO2lmKHIoZSkpZSYmZS5hdHRyKHt0ZXh0OmJ9KS5jc3MoZyk7ZWxzZXtkPXthbGlnbjpoLmFsaWdufTtpZihDYShoLnJvdGF0aW9uKSlkLnJvdGF0aW9uPWgucm90YXRpb247dGhpcy5sYWJlbD1yKGIpJiZoLmVuYWJsZWQ/Yy5yZW5kZXJlci50ZXh0KGIsMCwwLGgudXNlSFRNTCkuYXR0cihkKS5jc3MoZykuYWRkKGEubGFiZWxHcm91cCk6bnVsbH19LGdldExhYmVsU2l6ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMubGFiZWwsYj10aGlzLmF4aXM7cmV0dXJuIGE/KHRoaXMubGFiZWxCQm94PWEuZ2V0QkJveCgpKVtiLmhvcml6PwoiaGVpZ2h0Ijoid2lkdGgiXTowfSxnZXRMYWJlbFNpZGVzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5heGlzLm9wdGlvbnMubGFiZWxzLGI9dGhpcy5sYWJlbEJCb3gud2lkdGgsYT1iKntsZWZ0OjAsY2VudGVyOjAuNSxyaWdodDoxfVthLmFsaWduXS1hLng7cmV0dXJuWy1hLGItYV19LGhhbmRsZU92ZXJmbG93OmZ1bmN0aW9uKGEsYil7dmFyIGM9ITAsZD10aGlzLmF4aXMsZT1kLmNoYXJ0LGY9dGhpcy5pc0ZpcnN0LGc9dGhpcy5pc0xhc3QsaD1iLngsaT1kLnJldmVyc2VkLGo9ZC50aWNrUG9zaXRpb25zO2lmKGZ8fGcpe3ZhciBrPXRoaXMuZ2V0TGFiZWxTaWRlcygpLG09a1swXSxrPWtbMV0sZT1lLnBsb3RMZWZ0LGw9ZStkLmxlbixqPShkPWQudGlja3NbalthKyhmPzE6LTEpXV0pJiZkLmxhYmVsLnh5JiZkLmxhYmVsLnh5LngrZC5nZXRMYWJlbFNpZGVzKClbZj8wOjFdO2YmJiFpfHxnJiZpP2grbTxlJiYoaD1lLW0sZCYmaCtrPmomJihjPSExKSk6aCtrPmwmJihoPWwtayxkJiYKaCttPGomJihjPSExKSk7Yi54PWh9cmV0dXJuIGN9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXMuYXhpcyxmPWUuY2hhcnQsZz1kJiZmLm9sZENoYXJ0SGVpZ2h0fHxmLmNoYXJ0SGVpZ2h0O3JldHVybnt4OmE/ZS50cmFuc2xhdGUoYitjLG51bGwsbnVsbCxkKStlLnRyYW5zQjplLmxlZnQrZS5vZmZzZXQrKGUub3Bwb3NpdGU/KGQmJmYub2xkQ2hhcnRXaWR0aHx8Zi5jaGFydFdpZHRoKS1lLnJpZ2h0LWUubGVmdDowKSx5OmE/Zy1lLmJvdHRvbStlLm9mZnNldC0oZS5vcHBvc2l0ZT9lLmhlaWdodDowKTpnLWUudHJhbnNsYXRlKGIrYyxudWxsLG51bGwsZCktZS50cmFuc0J9fSxnZXRMYWJlbFBvc2l0aW9uOmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCl7dmFyIGk9dGhpcy5heGlzLGo9aS50cmFuc0Esaz1pLnJldmVyc2VkLGk9aS5zdGFnZ2VyTGluZXMsYT1hK2UueC0oZiYmZD9mKmoqKGs/LTE6MSk6MCksYj1iK2UueS0oZiYmIWQ/ZipqKihrPzE6LTEpOgowKTtyKGUueSl8fChiKz11KGMuc3R5bGVzLmxpbmVIZWlnaHQpKjAuOS1jLmdldEJCb3goKS5oZWlnaHQvMik7aSYmKGIrPWcvKGh8fDEpJWkqMTYpO3JldHVybnt4OmEseTpifX0sZ2V0TWFya1BhdGg6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3JldHVybiBmLmNyaXNwTGluZShbIk0iLGEsYiwiTCIsYSsoZT8wOi1jKSxiKyhlP2M6MCldLGQpfSxyZW5kZXI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuYXhpcyxlPWQub3B0aW9ucyxmPWQuY2hhcnQucmVuZGVyZXIsZz1kLmhvcml6LGg9dGhpcy50eXBlLGk9dGhpcy5sYWJlbCxqPXRoaXMucG9zLGs9ZS5sYWJlbHMsbT10aGlzLmdyaWRMaW5lLGw9aD9oKyJHcmlkIjoiZ3JpZCIscD1oP2grIlRpY2siOiJ0aWNrIixzPWVbbCsiTGluZVdpZHRoIl0sbj1lW2wrIkxpbmVDb2xvciJdLEI9ZVtsKyJMaW5lRGFzaFN0eWxlIl0sdz1lW3ArIkxlbmd0aCJdLGw9ZVtwKyJXaWR0aCJdfHwwLHE9ZVtwKyJDb2xvciJdLHI9ZVtwKyJQb3NpdGlvbiJdLApwPXRoaXMubWFyayx0PWsuc3RlcCx2PSEwLHU9ZC50aWNrbWFya09mZnNldCxQPXRoaXMuZ2V0UG9zaXRpb24oZyxqLHUsYiksSD1QLngsUD1QLnksQz1nJiZIPT09ZC5wb3N8fCFnJiZQPT09ZC5wb3MrZC5sZW4/LTE6MSx5PWQuc3RhZ2dlckxpbmVzO3RoaXMuaXNBY3RpdmU9ITA7aWYocyl7aj1kLmdldFBsb3RMaW5lUGF0aChqK3UscypDLGIsITApO2lmKG09PT14KXttPXtzdHJva2U6biwic3Ryb2tlLXdpZHRoIjpzfTtpZihCKW0uZGFzaHN0eWxlPUI7aWYoIWgpbS56SW5kZXg9MTtpZihiKW0ub3BhY2l0eT0wO3RoaXMuZ3JpZExpbmU9bT1zP2YucGF0aChqKS5hdHRyKG0pLmFkZChkLmdyaWRHcm91cCk6bnVsbH1pZighYiYmbSYmailtW3RoaXMuaXNOZXc/ImF0dHIiOiJhbmltYXRlIl0oe2Q6aixvcGFjaXR5OmN9KX1pZihsJiZ3KXI9PT0iaW5zaWRlIiYmKHc9LXcpLGQub3Bwb3NpdGUmJih3PS13KSxiPXRoaXMuZ2V0TWFya1BhdGgoSCxQLHcsbCpDLGcsZikscD9wLmFuaW1hdGUoe2Q6YiwKb3BhY2l0eTpjfSk6dGhpcy5tYXJrPWYucGF0aChiKS5hdHRyKHtzdHJva2U6cSwic3Ryb2tlLXdpZHRoIjpsLG9wYWNpdHk6Y30pLmFkZChkLmF4aXNHcm91cCk7aWYoaSYmIWlzTmFOKEgpKWkueHk9UD10aGlzLmdldExhYmVsUG9zaXRpb24oSCxQLGksZyxrLHUsYSx0KSx0aGlzLmlzRmlyc3QmJiFvKGUuc2hvd0ZpcnN0TGFiZWwsMSl8fHRoaXMuaXNMYXN0JiYhbyhlLnNob3dMYXN0TGFiZWwsMSk/dj0hMToheSYmZyYmay5vdmVyZmxvdz09PSJqdXN0aWZ5IiYmIXRoaXMuaGFuZGxlT3ZlcmZsb3coYSxQKSYmKHY9ITEpLHQmJmEldCYmKHY9ITEpLHYmJiFpc05hTihQLnkpPyhQLm9wYWNpdHk9YyxpW3RoaXMuaXNOZXc/ImF0dHIiOiJhbmltYXRlIl0oUCksdGhpcy5pc05ldz0hMSk6aS5hdHRyKCJ5IiwtOTk5OSl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXtHYSh0aGlzLHRoaXMuYXhpcyl9fTtvYi5wcm90b3R5cGU9e3JlbmRlcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1hLmF4aXMsCmM9Yi5ob3JpeixkPShiLnBvaW50UmFuZ2V8fDApLzIsZT1hLm9wdGlvbnMsZj1lLmxhYmVsLGc9YS5sYWJlbCxoPWUud2lkdGgsaT1lLnRvLGo9ZS5mcm9tLGs9cihqKSYmcihpKSxtPWUudmFsdWUsbD1lLmRhc2hTdHlsZSxwPWEuc3ZnRWxlbSxzPVtdLG4sQj1lLmNvbG9yLHc9ZS56SW5kZXgsRz1lLmV2ZW50cyx0PWIuY2hhcnQucmVuZGVyZXI7Yi5pc0xvZyYmKGo9a2EoaiksaT1rYShpKSxtPWthKG0pKTtpZihoKXtpZihzPWIuZ2V0UGxvdExpbmVQYXRoKG0saCksZD17c3Ryb2tlOkIsInN0cm9rZS13aWR0aCI6aH0sbClkLmRhc2hzdHlsZT1sfWVsc2UgaWYoayl7aWYoaj1xKGosYi5taW4tZCksaT1LKGksYi5tYXgrZCkscz1iLmdldFBsb3RCYW5kUGF0aChqLGksZSksZD17ZmlsbDpCfSxlLmJvcmRlcldpZHRoKWQuc3Ryb2tlPWUuYm9yZGVyQ29sb3IsZFsic3Ryb2tlLXdpZHRoIl09ZS5ib3JkZXJXaWR0aH1lbHNlIHJldHVybjtpZihyKHcpKWQuekluZGV4PXc7aWYocClzPwpwLmFuaW1hdGUoe2Q6c30sbnVsbCxwLm9uR2V0UGF0aCk6KHAuaGlkZSgpLHAub25HZXRQYXRoPWZ1bmN0aW9uKCl7cC5zaG93KCl9KTtlbHNlIGlmKHMmJnMubGVuZ3RoJiYoYS5zdmdFbGVtPXA9dC5wYXRoKHMpLmF0dHIoZCkuYWRkKCksRykpZm9yKG4gaW4gZT1mdW5jdGlvbihiKXtwLm9uKGIsZnVuY3Rpb24oYyl7R1tiXS5hcHBseShhLFtjXSl9KX0sRyllKG4pO2lmKGYmJnIoZi50ZXh0KSYmcyYmcy5sZW5ndGgmJmIud2lkdGg+MCYmYi5oZWlnaHQ+MCl7Zj15KHthbGlnbjpjJiZrJiYiY2VudGVyIix4OmM/IWsmJjQ6MTAsdmVydGljYWxBbGlnbjohYyYmayYmIm1pZGRsZSIseTpjP2s/MTY6MTA6az82Oi00LHJvdGF0aW9uOmMmJiFrJiY5MH0sZik7aWYoIWcpYS5sYWJlbD1nPXQudGV4dChmLnRleHQsMCwwKS5hdHRyKHthbGlnbjpmLnRleHRBbGlnbnx8Zi5hbGlnbixyb3RhdGlvbjpmLnJvdGF0aW9uLHpJbmRleDp3fSkuY3NzKGYuc3R5bGUpLmFkZCgpO2I9W3NbMV0sc1s0XSwKbyhzWzZdLHNbMV0pXTtzPVtzWzJdLHNbNV0sbyhzWzddLHNbMl0pXTtjPUZhKGIpO2s9RmEocyk7Zy5hbGlnbihmLCExLHt4OmMseTprLHdpZHRoOnBhKGIpLWMsaGVpZ2h0OnBhKHMpLWt9KTtnLnNob3coKX1lbHNlIGcmJmcuaGlkZSgpO3JldHVybiBhfSxkZXN0cm95OmZ1bmN0aW9uKCl7Z2EodGhpcy5heGlzLnBsb3RMaW5lc0FuZEJhbmRzLHRoaXMpO0dhKHRoaXMsdGhpcy5heGlzKX19O0liLnByb3RvdHlwZT17ZGVzdHJveTpmdW5jdGlvbigpe0dhKHRoaXMsdGhpcy5heGlzKX0sc2V0VG90YWw6ZnVuY3Rpb24oYSl7dGhpcy5jdW09dGhpcy50b3RhbD1hfSxyZW5kZXI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLGM9Yi5mb3JtYXR0ZXIuY2FsbCh0aGlzKTt0aGlzLmxhYmVsP3RoaXMubGFiZWwuYXR0cih7dGV4dDpjLHZpc2liaWxpdHk6ImhpZGRlbiJ9KTp0aGlzLmxhYmVsPXRoaXMuYXhpcy5jaGFydC5yZW5kZXJlci50ZXh0KGMsMCwwLGIudXNlSFRNTCkuY3NzKGIuc3R5bGUpLmF0dHIoe2FsaWduOnRoaXMudGV4dEFsaWduLApyb3RhdGlvbjpiLnJvdGF0aW9uLHZpc2liaWxpdHk6ImhpZGRlbiJ9KS5hZGQoYSl9LHNldE9mZnNldDpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuYXhpcyxkPWMuY2hhcnQsZT1kLmludmVydGVkLGY9dGhpcy5pc05lZ2F0aXZlLGc9Yy50cmFuc2xhdGUodGhpcy5wZXJjZW50PzEwMDp0aGlzLnRvdGFsLDAsMCwwLDEpLGM9Yy50cmFuc2xhdGUoMCksYz1RKGctYyksaD1kLnhBeGlzWzBdLnRyYW5zbGF0ZSh0aGlzLngpK2EsaT1kLnBsb3RIZWlnaHQsZj17eDplP2Y/ZzpnLWM6aCx5OmU/aS1oLWI6Zj9pLWctYzppLWcsd2lkdGg6ZT9jOmIsaGVpZ2h0OmU/YjpjfTtpZihlPXRoaXMubGFiZWwpZS5hbGlnbih0aGlzLmFsaWduT3B0aW9ucyxudWxsLGYpLGY9ZS5hbGlnbkF0dHIsZS5hdHRyKHt2aXNpYmlsaXR5OnRoaXMub3B0aW9ucy5jcm9wPT09ITF8fGQuaXNJbnNpZGVQbG90KGYueCxmLnkpP1o/ImluaGVyaXQiOiJ2aXNpYmxlIjoiaGlkZGVuIn0pfX07YWIucHJvdG90eXBlPXtkZWZhdWx0T3B0aW9uczp7ZGF0ZVRpbWVMYWJlbEZvcm1hdHM6e21pbGxpc2Vjb25kOiIlSDolTTolUy4lTCIsCnNlY29uZDoiJUg6JU06JVMiLG1pbnV0ZToiJUg6JU0iLGhvdXI6IiVIOiVNIixkYXk6IiVlLiAlYiIsd2VlazoiJWUuICViIixtb250aDoiJWIgJyV5Iix5ZWFyOiIlWSJ9LGVuZE9uVGljazohMSxncmlkTGluZUNvbG9yOiIjQzBDMEMwIixsYWJlbHM6TSxsaW5lQ29sb3I6IiNDMEQwRTAiLGxpbmVXaWR0aDoxLG1pblBhZGRpbmc6MC4wMSxtYXhQYWRkaW5nOjAuMDEsbWlub3JHcmlkTGluZUNvbG9yOiIjRTBFMEUwIixtaW5vckdyaWRMaW5lV2lkdGg6MSxtaW5vclRpY2tDb2xvcjoiI0EwQTBBMCIsbWlub3JUaWNrTGVuZ3RoOjIsbWlub3JUaWNrUG9zaXRpb246Im91dHNpZGUiLHN0YXJ0T2ZXZWVrOjEsc3RhcnRPblRpY2s6ITEsdGlja0NvbG9yOiIjQzBEMEUwIix0aWNrTGVuZ3RoOjUsdGlja21hcmtQbGFjZW1lbnQ6ImJldHdlZW4iLHRpY2tQaXhlbEludGVydmFsOjEwMCx0aWNrUG9zaXRpb246Im91dHNpZGUiLHRpY2tXaWR0aDoxLHRpdGxlOnthbGlnbjoibWlkZGxlIixzdHlsZTp7Y29sb3I6IiM0ZDc1OWUiLApmb250V2VpZ2h0OiJib2xkIn19LHR5cGU6ImxpbmVhciJ9LGRlZmF1bHRZQXhpc09wdGlvbnM6e2VuZE9uVGljazohMCxncmlkTGluZVdpZHRoOjEsdGlja1BpeGVsSW50ZXJ2YWw6NzIsc2hvd0xhc3RMYWJlbDohMCxsYWJlbHM6e2FsaWduOiJyaWdodCIseDotOCx5OjN9LGxpbmVXaWR0aDowLG1heFBhZGRpbmc6MC4wNSxtaW5QYWRkaW5nOjAuMDUsc3RhcnRPblRpY2s6ITAsdGlja1dpZHRoOjAsdGl0bGU6e3JvdGF0aW9uOjI3MCx0ZXh0OiJWYWx1ZXMifSxzdGFja0xhYmVsczp7ZW5hYmxlZDohMSxmb3JtYXR0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b3RhbH0sc3R5bGU6TS5zdHlsZX19LGRlZmF1bHRMZWZ0QXhpc09wdGlvbnM6e2xhYmVsczp7YWxpZ246InJpZ2h0Iix4Oi04LHk6bnVsbH0sdGl0bGU6e3JvdGF0aW9uOjI3MH19LGRlZmF1bHRSaWdodEF4aXNPcHRpb25zOntsYWJlbHM6e2FsaWduOiJsZWZ0Iix4OjgseTpudWxsfSx0aXRsZTp7cm90YXRpb246OTB9fSwKZGVmYXVsdEJvdHRvbUF4aXNPcHRpb25zOntsYWJlbHM6e2FsaWduOiJjZW50ZXIiLHg6MCx5OjE0fSx0aXRsZTp7cm90YXRpb246MH19LGRlZmF1bHRUb3BBeGlzT3B0aW9uczp7bGFiZWxzOnthbGlnbjoiY2VudGVyIix4OjAseTotNX0sdGl0bGU6e3JvdGF0aW9uOjB9fSxpbml0OmZ1bmN0aW9uKGEsYil7dmFyIGM9Yi5pc1g7dGhpcy5ob3Jpej1hLmludmVydGVkPyFjOmM7dGhpcy54T3JZPSh0aGlzLmlzWEF4aXM9Yyk/IngiOiJ5Ijt0aGlzLm9wcG9zaXRlPWIub3Bwb3NpdGU7dGhpcy5zaWRlPXRoaXMuaG9yaXo/dGhpcy5vcHBvc2l0ZT8wOjI6dGhpcy5vcHBvc2l0ZT8xOjM7dGhpcy5zZXRPcHRpb25zKGIpO3ZhciBkPXRoaXMub3B0aW9ucyxlPWQudHlwZTt0aGlzLmxhYmVsRm9ybWF0dGVyPWQubGFiZWxzLmZvcm1hdHRlcnx8dGhpcy5kZWZhdWx0TGFiZWxGb3JtYXR0ZXI7dGhpcy5zdGFnZ2VyTGluZXM9dGhpcy5ob3JpeiYmZC5sYWJlbHMuc3RhZ2dlckxpbmVzO3RoaXMudXNlck9wdGlvbnM9CmI7dGhpcy5taW5QaXhlbFBhZGRpbmc9MDt0aGlzLmNoYXJ0PWE7dGhpcy5yZXZlcnNlZD1kLnJldmVyc2VkO3RoaXMuem9vbUVuYWJsZWQ9ZC56b29tRW5hYmxlZCE9PSExO3RoaXMuY2F0ZWdvcmllcz1kLmNhdGVnb3JpZXN8fGU9PT0iY2F0ZWdvcnkiO3RoaXMuaXNMb2c9ZT09PSJsb2dhcml0aG1pYyI7dGhpcy5pc0RhdGV0aW1lQXhpcz1lPT09ImRhdGV0aW1lIjt0aGlzLmlzTGlua2VkPXIoZC5saW5rZWRUbyk7dGhpcy50aWNrbWFya09mZnNldD10aGlzLmNhdGVnb3JpZXMmJmQudGlja21hcmtQbGFjZW1lbnQ9PT0iYmV0d2VlbiI/MC41OjA7dGhpcy50aWNrcz17fTt0aGlzLm1pbm9yVGlja3M9e307dGhpcy5wbG90TGluZXNBbmRCYW5kcz1bXTt0aGlzLmFsdGVybmF0ZUJhbmRzPXt9O3RoaXMubGVuPTA7dGhpcy5taW5SYW5nZT10aGlzLnVzZXJNaW5SYW5nZT1kLm1pblJhbmdlfHxkLm1heFpvb207dGhpcy5yYW5nZT1kLnJhbmdlO3RoaXMub2Zmc2V0PWQub2Zmc2V0fHwwOwp0aGlzLnN0YWNrcz17fTt0aGlzLl9zdGFja3NUb3VjaGVkPTA7dGhpcy5taW49dGhpcy5tYXg9bnVsbDt2YXIgZixkPXRoaXMub3B0aW9ucy5ldmVudHM7bGEodGhpcyxhLmF4ZXMpPT09LTEmJihhLmF4ZXMucHVzaCh0aGlzKSxhW2M/InhBeGlzIjoieUF4aXMiXS5wdXNoKHRoaXMpKTt0aGlzLnNlcmllcz10aGlzLnNlcmllc3x8W107aWYoYS5pbnZlcnRlZCYmYyYmdGhpcy5yZXZlcnNlZD09PXgpdGhpcy5yZXZlcnNlZD0hMDt0aGlzLnJlbW92ZVBsb3RMaW5lPXRoaXMucmVtb3ZlUGxvdEJhbmQ9dGhpcy5yZW1vdmVQbG90QmFuZE9yTGluZTtmb3IoZiBpbiBkKUoodGhpcyxmLGRbZl0pO2lmKHRoaXMuaXNMb2cpdGhpcy52YWwybGluPWthLHRoaXMubGluMnZhbD1kYX0sc2V0T3B0aW9uczpmdW5jdGlvbihhKXt0aGlzLm9wdGlvbnM9eSh0aGlzLmRlZmF1bHRPcHRpb25zLHRoaXMuaXNYQXhpcz97fTp0aGlzLmRlZmF1bHRZQXhpc09wdGlvbnMsW3RoaXMuZGVmYXVsdFRvcEF4aXNPcHRpb25zLAp0aGlzLmRlZmF1bHRSaWdodEF4aXNPcHRpb25zLHRoaXMuZGVmYXVsdEJvdHRvbUF4aXNPcHRpb25zLHRoaXMuZGVmYXVsdExlZnRBeGlzT3B0aW9uc11bdGhpcy5zaWRlXSx5KE5bdGhpcy5pc1hBeGlzPyJ4QXhpcyI6InlBeGlzIl0sYSkpfSx1cGRhdGU6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmNoYXJ0LGE9Yy5vcHRpb25zW3RoaXMueE9yWSsiQXhpcyJdW3RoaXMub3B0aW9ucy5pbmRleF09eSh0aGlzLnVzZXJPcHRpb25zLGEpO3RoaXMuZGVzdHJveSgpO3RoaXMuX2FkZGVkUGxvdExCPSExO3RoaXMuaW5pdChjLGEpO2MuaXNEaXJ0eUJveD0hMDtvKGIsITApJiZjLnJlZHJhdygpfSxyZW1vdmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jaGFydCxjPXRoaXMueE9yWSsiQXhpcyI7bih0aGlzLnNlcmllcyxmdW5jdGlvbihhKXthLnJlbW92ZSghMSl9KTtnYShiLmF4ZXMsdGhpcyk7Z2EoYltjXSx0aGlzKTtiLm9wdGlvbnNbY10uc3BsaWNlKHRoaXMub3B0aW9ucy5pbmRleCwKMSk7dGhpcy5kZXN0cm95KCk7Yi5pc0RpcnR5Qm94PSEwO28oYSwhMCkmJmIucmVkcmF3KCl9LGRlZmF1bHRMYWJlbEZvcm1hdHRlcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYXhpcyxiPXRoaXMudmFsdWUsYz1hLmNhdGVnb3JpZXMsZD10aGlzLmRhdGVUaW1lTGFiZWxGb3JtYXQsZT1OLmxhbmcubnVtZXJpY1N5bWJvbHMsZj1lJiZlLmxlbmd0aCxnLGg9YS5vcHRpb25zLmxhYmVscy5mb3JtYXQsYT1hLmlzTG9nP2I6YS50aWNrSW50ZXJ2YWw7aWYoaClnPUVhKGgsdGhpcyk7ZWxzZSBpZihjKWc9YjtlbHNlIGlmKGQpZz1VYShkLGIpO2Vsc2UgaWYoZiYmYT49MUUzKWZvcig7Zi0tJiZnPT09eDspYz1NYXRoLnBvdygxRTMsZisxKSxhPj1jJiZlW2ZdIT09bnVsbCYmKGc9TmEoYi9jLC0xKStlW2ZdKTtnPT09eCYmKGc9Yj49MUUzP05hKGIsMCk6TmEoYiwtMSkpO3JldHVybiBnfSxnZXRTZXJpZXNFeHRyZW1lczpmdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1hLmNoYXJ0LGM9YS5zdGFja3MsCmQ9W10sZT1bXSxmPWEuX3N0YWNrc1RvdWNoZWQrPTEsZyxoO2EuaGFzVmlzaWJsZVNlcmllcz0hMTthLmRhdGFNaW49YS5kYXRhTWF4PW51bGw7bihhLnNlcmllcyxmdW5jdGlvbihnKXtpZihnLnZpc2libGV8fCFiLm9wdGlvbnMuY2hhcnQuaWdub3JlSGlkZGVuU2VyaWVzKXt2YXIgaj1nLm9wdGlvbnMsayxtLGwscCxzLG4sQix3LEcsdD1qLnRocmVzaG9sZCx2LHU9W10seT0wO2EuaGFzVmlzaWJsZVNlcmllcz0hMDtpZihhLmlzTG9nJiZ0PD0wKXQ9ai50aHJlc2hvbGQ9bnVsbDtpZihhLmlzWEF4aXMpe2lmKGo9Zy54RGF0YSxqLmxlbmd0aClhLmRhdGFNaW49SyhvKGEuZGF0YU1pbixqWzBdKSxGYShqKSksYS5kYXRhTWF4PXEobyhhLmRhdGFNYXgsalswXSkscGEoaikpfWVsc2V7dmFyIFAsSCxDLEE9Zy5jcm9wcGVkLHo9Zy54QXhpcy5nZXRFeHRyZW1lcygpLEU9ISFnLm1vZGlmeVZhbHVlO2s9ai5zdGFja2luZzthLnVzZVBlcmNlbnRhZ2U9az09PSJwZXJjZW50IjtpZihrKXM9Cmouc3RhY2sscD1nLnR5cGUrbyhzLCIiKSxuPSItIitwLGcuc3RhY2tLZXk9cCxtPWRbcF18fFtdLGRbcF09bSxsPWVbbl18fFtdLGVbbl09bDtpZihhLnVzZVBlcmNlbnRhZ2UpYS5kYXRhTWluPTAsYS5kYXRhTWF4PTk5O2o9Zy5wcm9jZXNzZWRYRGF0YTtCPWcucHJvY2Vzc2VkWURhdGE7dj1CLmxlbmd0aDtmb3IoaD0wO2g8djtoKyspe3c9altoXTtHPUJbaF07aWYoaylIPShQPUc8dCk/bDptLEM9UD9uOnAscihIW3ddKT8oSFt3XT1pYShIW3ddK0cpLEc9W0csSFt3XV0pOkhbd109RyxjW0NdfHwoY1tDXT17fSksY1tDXVt3XXx8KGNbQ11bd109bmV3IEliKGEsYS5vcHRpb25zLnN0YWNrTGFiZWxzLFAsdyxzLGspKSxjW0NdW3ddLnNldFRvdGFsKEhbd10pLGNbQ11bd10udG91Y2hlZD1mO2lmKEchPT1udWxsJiZHIT09eCYmKCFhLmlzTG9nfHxHLmxlbmd0aHx8Rz4wKSlpZihFJiYoRz1nLm1vZGlmeVZhbHVlKEcpKSxnLmdldEV4dHJlbWVzRnJvbUFsbHx8QXx8KGpbaCsxXXx8dyk+PQp6Lm1pbiYmKGpbaC0xXXx8dyk8PXoubWF4KWlmKHc9Ry5sZW5ndGgpZm9yKDt3LS07KUdbd10hPT1udWxsJiYodVt5KytdPUdbd10pO2Vsc2UgdVt5KytdPUd9aWYoIWEudXNlUGVyY2VudGFnZSYmdS5sZW5ndGgpZy5kYXRhTWluPWs9RmEodSksZy5kYXRhTWF4PWc9cGEodSksYS5kYXRhTWluPUsobyhhLmRhdGFNaW4sayksayksYS5kYXRhTWF4PXEobyhhLmRhdGFNYXgsZyksZyk7aWYocih0KSlpZihhLmRhdGFNaW4+PXQpYS5kYXRhTWluPXQsYS5pZ25vcmVNaW5QYWRkaW5nPSEwO2Vsc2UgaWYoYS5kYXRhTWF4PHQpYS5kYXRhTWF4PXQsYS5pZ25vcmVNYXhQYWRkaW5nPSEwfX19KTtmb3IoZyBpbiBjKWZvcihoIGluIGNbZ10pY1tnXVtoXS50b3VjaGVkPGYmJihjW2ddW2hdLmRlc3Ryb3koKSxkZWxldGUgY1tnXVtoXSl9LHRyYW5zbGF0ZTpmdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc9dGhpcy5sZW4saD0xLGk9MCxqPWQ/dGhpcy5vbGRUcmFuc0E6dGhpcy50cmFuc0EsZD0KZD90aGlzLm9sZE1pbjp0aGlzLm1pbixrPXRoaXMubWluUGl4ZWxQYWRkaW5nLGU9KHRoaXMub3B0aW9ucy5vcmRpbmFsfHx0aGlzLmlzTG9nJiZlKSYmdGhpcy5saW4ydmFsO2lmKCFqKWo9dGhpcy50cmFuc0E7YyYmKGgqPS0xLGk9Zyk7dGhpcy5yZXZlcnNlZCYmKGgqPS0xLGktPWgqZyk7Yj8oYT1hKmgraSxhLT1rLGE9YS9qK2QsZSYmKGE9dGhpcy5saW4ydmFsKGEpKSk6KGUmJihhPXRoaXMudmFsMmxpbihhKSksYT1oKihhLWQpKmoraStoKmsrKGY/aip0aGlzLnBvaW50UmFuZ2UvMjowKSk7cmV0dXJuIGF9LHRvUGl4ZWxzOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMudHJhbnNsYXRlKGEsITEsIXRoaXMuaG9yaXosbnVsbCwhMCkrKGI/MDp0aGlzLnBvcyl9LHRvVmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy50cmFuc2xhdGUoYS0oYj8wOnRoaXMucG9zKSwhMCwhdGhpcy5ob3JpeixudWxsLCEwKX0sZ2V0UGxvdExpbmVQYXRoOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPQp0aGlzLmNoYXJ0LGY9dGhpcy5sZWZ0LGc9dGhpcy50b3AsaCxpLGosYT10aGlzLnRyYW5zbGF0ZShhLG51bGwsbnVsbCxjKSxrPWMmJmUub2xkQ2hhcnRIZWlnaHR8fGUuY2hhcnRIZWlnaHQsbT1jJiZlLm9sZENoYXJ0V2lkdGh8fGUuY2hhcnRXaWR0aCxsO2g9dGhpcy50cmFuc0I7Yz1pPXQoYStoKTtoPWo9dChrLWEtaCk7aWYoaXNOYU4oYSkpbD0hMDtlbHNlIGlmKHRoaXMuaG9yaXope2lmKGg9ZyxqPWstdGhpcy5ib3R0b20sYzxmfHxjPmYrdGhpcy53aWR0aClsPSEwfWVsc2UgaWYoYz1mLGk9bS10aGlzLnJpZ2h0LGg8Z3x8aD5nK3RoaXMuaGVpZ2h0KWw9ITA7cmV0dXJuIGwmJiFkP251bGw6ZS5yZW5kZXJlci5jcmlzcExpbmUoWyJNIixjLGgsIkwiLGksal0sYnx8MCl9LGdldFBsb3RCYW5kUGF0aDpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuZ2V0UGxvdExpbmVQYXRoKGIpLGQ9dGhpcy5nZXRQbG90TGluZVBhdGgoYSk7ZCYmYz9kLnB1c2goY1s0XSxjWzVdLGNbMV0sY1syXSk6CmQ9bnVsbDtyZXR1cm4gZH0sZ2V0TGluZWFyVGlja1Bvc2l0aW9uczpmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkLGI9aWEoVChiL2EpKmEpLGM9aWEoamEoYy9hKSphKSxlPVtdO2I8PWM7KXtlLnB1c2goYik7Yj1pYShiK2EpO2lmKGI9PT1kKWJyZWFrO2Q9Yn1yZXR1cm4gZX0sZ2V0TG9nVGlja1Bvc2l0aW9uczpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT10aGlzLm9wdGlvbnMsZj10aGlzLmxlbixnPVtdO2lmKCFkKXRoaXMuX21pbm9yQXV0b0ludGVydmFsPW51bGw7aWYoYT49MC41KWE9dChhKSxnPXRoaXMuZ2V0TGluZWFyVGlja1Bvc2l0aW9ucyhhLGIsYyk7ZWxzZSBpZihhPj0wLjA4KWZvcih2YXIgZj1UKGIpLGgsaSxqLGssbSxlPWE+MC4zP1sxLDIsNF06YT4wLjE1P1sxLDIsNCw2LDhdOlsxLDIsMyw0LDUsNiw3LDgsOV07ZjxjKzEmJiFtO2YrKyl7aT1lLmxlbmd0aDtmb3IoaD0wO2g8aSYmIW07aCsrKWo9a2EoZGEoZikqZVtoXSksaj5iJiYoIWR8fGs8PWMpJiZnLnB1c2goayksCms+YyYmKG09ITApLGs9an1lbHNlIGlmKGI9ZGEoYiksYz1kYShjKSxhPWVbZD8ibWlub3JUaWNrSW50ZXJ2YWwiOiJ0aWNrSW50ZXJ2YWwiXSxhPW8oYT09PSJhdXRvIj9udWxsOmEsdGhpcy5fbWlub3JBdXRvSW50ZXJ2YWwsKGMtYikqKGUudGlja1BpeGVsSW50ZXJ2YWwvKGQ/NToxKSkvKChkP2YvdGhpcy50aWNrUG9zaXRpb25zLmxlbmd0aDpmKXx8MSkpLGE9aWIoYSxudWxsLEkucG93KDEwLFQoSS5sb2coYSkvSS5MTjEwKSkpLGc9S2EodGhpcy5nZXRMaW5lYXJUaWNrUG9zaXRpb25zKGEsYixjKSxrYSksIWQpdGhpcy5fbWlub3JBdXRvSW50ZXJ2YWw9YS81O2lmKCFkKXRoaXMudGlja0ludGVydmFsPWE7cmV0dXJuIGd9LGdldE1pbm9yVGlja1Bvc2l0aW9uczpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucyxiPXRoaXMudGlja1Bvc2l0aW9ucyxjPXRoaXMubWlub3JUaWNrSW50ZXJ2YWwsZD1bXSxlO2lmKHRoaXMuaXNMb2cpe2U9Yi5sZW5ndGg7Zm9yKGE9MTthPGU7YSsrKWQ9CmQuY29uY2F0KHRoaXMuZ2V0TG9nVGlja1Bvc2l0aW9ucyhjLGJbYS0xXSxiW2FdLCEwKSl9ZWxzZSBpZih0aGlzLmlzRGF0ZXRpbWVBeGlzJiZhLm1pbm9yVGlja0ludGVydmFsPT09ImF1dG8iKWQ9ZC5jb25jYXQoQWIoeWIoYyksdGhpcy5taW4sdGhpcy5tYXgsYS5zdGFydE9mV2VlaykpLGRbMF08dGhpcy5taW4mJmQuc2hpZnQoKTtlbHNlIGZvcihiPXRoaXMubWluKyhiWzBdLXRoaXMubWluKSVjO2I8PXRoaXMubWF4O2IrPWMpZC5wdXNoKGIpO3JldHVybiBkfSxhZGp1c3RGb3JNaW5SYW5nZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucyxiPXRoaXMubWluLGM9dGhpcy5tYXgsZCxlPXRoaXMuZGF0YU1heC10aGlzLmRhdGFNaW4+PXRoaXMubWluUmFuZ2UsZixnLGgsaSxqO2lmKHRoaXMuaXNYQXhpcyYmdGhpcy5taW5SYW5nZT09PXgmJiF0aGlzLmlzTG9nKXIoYS5taW4pfHxyKGEubWF4KT90aGlzLm1pblJhbmdlPW51bGw6KG4odGhpcy5zZXJpZXMsZnVuY3Rpb24oYSl7aT0KYS54RGF0YTtmb3IoZz1qPWEueEluY3JlbWVudD8xOmkubGVuZ3RoLTE7Zz4wO2ctLSlpZihoPWlbZ10taVtnLTFdLGY9PT14fHxoPGYpZj1ofSksdGhpcy5taW5SYW5nZT1LKGYqNSx0aGlzLmRhdGFNYXgtdGhpcy5kYXRhTWluKSk7aWYoYy1iPHRoaXMubWluUmFuZ2Upe3ZhciBrPXRoaXMubWluUmFuZ2U7ZD0oay1jK2IpLzI7ZD1bYi1kLG8oYS5taW4sYi1kKV07aWYoZSlkWzJdPXRoaXMuZGF0YU1pbjtiPXBhKGQpO2M9W2IrayxvKGEubWF4LGIrayldO2lmKGUpY1syXT10aGlzLmRhdGFNYXg7Yz1GYShjKTtjLWI8ayYmKGRbMF09Yy1rLGRbMV09byhhLm1pbixjLWspLGI9cGEoZCkpfXRoaXMubWluPWI7dGhpcy5tYXg9Y30sc2V0QXhpc1RyYW5zbGF0aW9uOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubWF4LXRoaXMubWluLGM9MCxkLGU9MCxmPTAsZz10aGlzLmxpbmtlZFBhcmVudCxoPXRoaXMudHJhbnNBO2lmKHRoaXMuaXNYQXhpcylnPyhlPWcubWluUG9pbnRPZmZzZXQsZj1nLnBvaW50UmFuZ2VQYWRkaW5nKToKbih0aGlzLnNlcmllcyxmdW5jdGlvbihhKXt2YXIgZz1hLnBvaW50UmFuZ2UsaD1hLm9wdGlvbnMucG9pbnRQbGFjZW1lbnQsbT1hLmNsb3Nlc3RQb2ludFJhbmdlO2c+YiYmKGc9MCk7Yz1xKGMsZyk7ZT1xKGUsaD8wOmcvMik7Zj1xKGYsaD09PSJvbiI/MDpnKTshYS5ub1NoYXJlZFRvb2x0aXAmJnIobSkmJihkPXIoZCk/SyhkLG0pOm0pfSksZz10aGlzLm9yZGluYWxTbG9wZT90aGlzLm9yZGluYWxTbG9wZS9kOjEsdGhpcy5taW5Qb2ludE9mZnNldD1lKj1nLHRoaXMucG9pbnRSYW5nZVBhZGRpbmc9Zio9Zyx0aGlzLnBvaW50UmFuZ2U9SyhjLGIpLHRoaXMuY2xvc2VzdFBvaW50UmFuZ2U9ZDtpZihhKXRoaXMub2xkVHJhbnNBPWg7dGhpcy50cmFuc2xhdGlvblNsb3BlPXRoaXMudHJhbnNBPWg9dGhpcy5sZW4vKGIrZnx8MSk7dGhpcy50cmFuc0I9dGhpcy5ob3Jpej90aGlzLmxlZnQ6dGhpcy5ib3R0b207dGhpcy5taW5QaXhlbFBhZGRpbmc9aCplfSxzZXRUaWNrUG9zaXRpb25zOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLGM9Yi5jaGFydCxkPWIub3B0aW9ucyxlPWIuaXNMb2csZj1iLmlzRGF0ZXRpbWVBeGlzLGc9Yi5pc1hBeGlzLGg9Yi5pc0xpbmtlZCxpPWIub3B0aW9ucy50aWNrUG9zaXRpb25lcixqPWQubWF4UGFkZGluZyxrPWQubWluUGFkZGluZyxtPWQudGlja0ludGVydmFsLGw9ZC5taW5UaWNrSW50ZXJ2YWwscD1kLnRpY2tQaXhlbEludGVydmFsLHM9Yi5jYXRlZ29yaWVzO2g/KGIubGlua2VkUGFyZW50PWNbZz8ieEF4aXMiOiJ5QXhpcyJdW2QubGlua2VkVG9dLGM9Yi5saW5rZWRQYXJlbnQuZ2V0RXh0cmVtZXMoKSxiLm1pbj1vKGMubWluLGMuZGF0YU1pbiksYi5tYXg9byhjLm1heCxjLmRhdGFNYXgpLGQudHlwZSE9PWIubGlua2VkUGFyZW50Lm9wdGlvbnMudHlwZSYmcWEoMTEsMSkpOihiLm1pbj1vKGIudXNlck1pbixkLm1pbixiLmRhdGFNaW4pLGIubWF4PW8oYi51c2VyTWF4LGQubWF4LGIuZGF0YU1heCkpO2lmKGUpIWEmJksoYi5taW4sbyhiLmRhdGFNaW4sYi5taW4pKTw9CjAmJnFhKDEwLDEpLGIubWluPWlhKGthKGIubWluKSksYi5tYXg9aWEoa2EoYi5tYXgpKTtpZihiLnJhbmdlJiYoYi51c2VyTWluPWIubWluPXEoYi5taW4sYi5tYXgtYi5yYW5nZSksYi51c2VyTWF4PWIubWF4LGEpKWIucmFuZ2U9bnVsbDtiLmJlZm9yZVBhZGRpbmcmJmIuYmVmb3JlUGFkZGluZygpO2IuYWRqdXN0Rm9yTWluUmFuZ2UoKTtpZighcyYmIWIudXNlUGVyY2VudGFnZSYmIWgmJnIoYi5taW4pJiZyKGIubWF4KSYmKGM9Yi5tYXgtYi5taW4pKXtpZighcihkLm1pbikmJiFyKGIudXNlck1pbikmJmsmJihiLmRhdGFNaW48MHx8IWIuaWdub3JlTWluUGFkZGluZykpYi5taW4tPWMqaztpZighcihkLm1heCkmJiFyKGIudXNlck1heCkmJmomJihiLmRhdGFNYXg+MHx8IWIuaWdub3JlTWF4UGFkZGluZykpYi5tYXgrPWMqan1iLnRpY2tJbnRlcnZhbD1iLm1pbj09PWIubWF4fHxiLm1pbj09PXZvaWQgMHx8Yi5tYXg9PT12b2lkIDA/MTpoJiYhbSYmcD09PWIubGlua2VkUGFyZW50Lm9wdGlvbnMudGlja1BpeGVsSW50ZXJ2YWw/CmIubGlua2VkUGFyZW50LnRpY2tJbnRlcnZhbDpvKG0scz8xOihiLm1heC1iLm1pbikqcC8oYi5sZW58fDEpKTtnJiYhYSYmbihiLnNlcmllcyxmdW5jdGlvbihhKXthLnByb2Nlc3NEYXRhKGIubWluIT09Yi5vbGRNaW58fGIubWF4IT09Yi5vbGRNYXgpfSk7Yi5zZXRBeGlzVHJhbnNsYXRpb24oITApO2IuYmVmb3JlU2V0VGlja1Bvc2l0aW9ucyYmYi5iZWZvcmVTZXRUaWNrUG9zaXRpb25zKCk7aWYoYi5wb3N0UHJvY2Vzc1RpY2tJbnRlcnZhbCliLnRpY2tJbnRlcnZhbD1iLnBvc3RQcm9jZXNzVGlja0ludGVydmFsKGIudGlja0ludGVydmFsKTtpZighbSYmYi50aWNrSW50ZXJ2YWw8bCliLnRpY2tJbnRlcnZhbD1sO2lmKCFmJiYhZSYmKGE9SS5wb3coMTAsVChJLmxvZyhiLnRpY2tJbnRlcnZhbCkvSS5MTjEwKSksIW0pKWIudGlja0ludGVydmFsPWliKGIudGlja0ludGVydmFsLG51bGwsYSxkKTtiLm1pbm9yVGlja0ludGVydmFsPWQubWlub3JUaWNrSW50ZXJ2YWw9PT0iYXV0byImJgpiLnRpY2tJbnRlcnZhbD9iLnRpY2tJbnRlcnZhbC81OmQubWlub3JUaWNrSW50ZXJ2YWw7Yi50aWNrUG9zaXRpb25zPWk9ZC50aWNrUG9zaXRpb25zP1tdLmNvbmNhdChkLnRpY2tQb3NpdGlvbnMpOmkmJmkuYXBwbHkoYixbYi5taW4sYi5tYXhdKTtpZighaSlpPWY/KGIuZ2V0Tm9uTGluZWFyVGltZVRpY2tzfHxBYikoeWIoYi50aWNrSW50ZXJ2YWwsZC51bml0cyksYi5taW4sYi5tYXgsZC5zdGFydE9mV2VlayxiLm9yZGluYWxQb3NpdGlvbnMsYi5jbG9zZXN0UG9pbnRSYW5nZSwhMCk6ZT9iLmdldExvZ1RpY2tQb3NpdGlvbnMoYi50aWNrSW50ZXJ2YWwsYi5taW4sYi5tYXgpOmIuZ2V0TGluZWFyVGlja1Bvc2l0aW9ucyhiLnRpY2tJbnRlcnZhbCxiLm1pbixiLm1heCksYi50aWNrUG9zaXRpb25zPWk7aWYoIWgpZT1pWzBdLGY9aVtpLmxlbmd0aC0xXSxoPWIubWluUG9pbnRPZmZzZXR8fDAsZC5zdGFydE9uVGljaz9iLm1pbj1lOmIubWluLWg+ZSYmaS5zaGlmdCgpLGQuZW5kT25UaWNrPwpiLm1heD1mOmIubWF4K2g8ZiYmaS5wb3AoKSxpLmxlbmd0aD09PTEmJihiLm1pbi09MC4wMDEsYi5tYXgrPTAuMDAxKX0sc2V0TWF4VGlja3M6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNoYXJ0LGI9YS5tYXhUaWNrc3x8e30sYz10aGlzLnRpY2tQb3NpdGlvbnMsZD10aGlzLl9tYXhUaWNrc0tleT1bdGhpcy54T3JZLHRoaXMucG9zLHRoaXMubGVuXS5qb2luKCItIik7aWYoIXRoaXMuaXNMaW5rZWQmJiF0aGlzLmlzRGF0ZXRpbWVBeGlzJiZjJiZjLmxlbmd0aD4oYltkXXx8MCkmJnRoaXMub3B0aW9ucy5hbGlnblRpY2tzIT09ITEpYltkXT1jLmxlbmd0aDthLm1heFRpY2tzPWJ9LGFkanVzdFRpY2tBbW91bnQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9tYXhUaWNrc0tleSxiPXRoaXMudGlja1Bvc2l0aW9ucyxjPXRoaXMuY2hhcnQubWF4VGlja3M7aWYoYyYmY1thXSYmIXRoaXMuaXNEYXRldGltZUF4aXMmJiF0aGlzLmNhdGVnb3JpZXMmJiF0aGlzLmlzTGlua2VkJiZ0aGlzLm9wdGlvbnMuYWxpZ25UaWNrcyE9PQohMSl7dmFyIGQ9dGhpcy50aWNrQW1vdW50LGU9Yi5sZW5ndGg7dGhpcy50aWNrQW1vdW50PWE9Y1thXTtpZihlPGEpe2Zvcig7Yi5sZW5ndGg8YTspYi5wdXNoKGlhKGJbYi5sZW5ndGgtMV0rdGhpcy50aWNrSW50ZXJ2YWwpKTt0aGlzLnRyYW5zQSo9KGUtMSkvKGEtMSk7dGhpcy5tYXg9YltiLmxlbmd0aC0xXX1pZihyKGQpJiZhIT09ZCl0aGlzLmlzRGlydHk9ITB9fSxzZXRTY2FsZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc3RhY2tzLGIsYyxkLGU7dGhpcy5vbGRNaW49dGhpcy5taW47dGhpcy5vbGRNYXg9dGhpcy5tYXg7dGhpcy5vbGRBeGlzTGVuZ3RoPXRoaXMubGVuO3RoaXMuc2V0QXhpc1NpemUoKTtlPXRoaXMubGVuIT09dGhpcy5vbGRBeGlzTGVuZ3RoO24odGhpcy5zZXJpZXMsZnVuY3Rpb24oYSl7aWYoYS5pc0RpcnR5RGF0YXx8YS5pc0RpcnR5fHxhLnhBeGlzLmlzRGlydHkpZD0hMH0pO2lmKGV8fGR8fHRoaXMuaXNMaW5rZWR8fHRoaXMuZm9yY2VSZWRyYXd8fHRoaXMudXNlck1pbiE9PQp0aGlzLm9sZFVzZXJNaW58fHRoaXMudXNlck1heCE9PXRoaXMub2xkVXNlck1heClpZih0aGlzLmZvcmNlUmVkcmF3PSExLHRoaXMuZ2V0U2VyaWVzRXh0cmVtZXMoKSx0aGlzLnNldFRpY2tQb3NpdGlvbnMoKSx0aGlzLm9sZFVzZXJNaW49dGhpcy51c2VyTWluLHRoaXMub2xkVXNlck1heD10aGlzLnVzZXJNYXgsIXRoaXMuaXNEaXJ0eSl0aGlzLmlzRGlydHk9ZXx8dGhpcy5taW4hPT10aGlzLm9sZE1pbnx8dGhpcy5tYXghPT10aGlzLm9sZE1heDtpZighdGhpcy5pc1hBeGlzKWZvcihiIGluIGEpZm9yKGMgaW4gYVtiXSlhW2JdW2NdLmN1bT1hW2JdW2NdLnRvdGFsO3RoaXMuc2V0TWF4VGlja3MoKX0sc2V0RXh0cmVtZXM6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj10aGlzLGc9Zi5jaGFydCxjPW8oYywhMCksZT12KGUse21pbjphLG1heDpifSk7RChmLCJzZXRFeHRyZW1lcyIsZSxmdW5jdGlvbigpe2YudXNlck1pbj1hO2YudXNlck1heD1iO2YuaXNEaXJ0eUV4dHJlbWVzPSEwOwpjJiZnLnJlZHJhdyhkKX0pfSx6b29tOmZ1bmN0aW9uKGEsYil7dGhpcy5hbGxvd1pvb21PdXRzaWRlfHwoYTw9dGhpcy5kYXRhTWluJiYoYT14KSxiPj10aGlzLmRhdGFNYXgmJihiPXgpKTt0aGlzLmRpc3BsYXlCdG49YSE9PXh8fGIhPT14O3RoaXMuc2V0RXh0cmVtZXMoYSxiLCExLHgse3RyaWdnZXI6Inpvb20ifSk7cmV0dXJuITB9LHNldEF4aXNTaXplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5jaGFydCxiPXRoaXMub3B0aW9ucyxjPWIub2Zmc2V0TGVmdHx8MCxkPWIub2Zmc2V0UmlnaHR8fDAsZT10aGlzLmhvcml6LGYsZzt0aGlzLmxlZnQ9Zz1vKGIubGVmdCxhLnBsb3RMZWZ0K2MpO3RoaXMudG9wPWY9byhiLnRvcCxhLnBsb3RUb3ApO3RoaXMud2lkdGg9Yz1vKGIud2lkdGgsYS5wbG90V2lkdGgtYytkKTt0aGlzLmhlaWdodD1iPW8oYi5oZWlnaHQsYS5wbG90SGVpZ2h0KTt0aGlzLmJvdHRvbT1hLmNoYXJ0SGVpZ2h0LWItZjt0aGlzLnJpZ2h0PWEuY2hhcnRXaWR0aC1jLWc7CnRoaXMubGVuPXEoZT9jOmIsMCk7dGhpcy5wb3M9ZT9nOmZ9LGdldEV4dHJlbWVzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5pc0xvZztyZXR1cm57bWluOmE/aWEoZGEodGhpcy5taW4pKTp0aGlzLm1pbixtYXg6YT9pYShkYSh0aGlzLm1heCkpOnRoaXMubWF4LGRhdGFNaW46dGhpcy5kYXRhTWluLGRhdGFNYXg6dGhpcy5kYXRhTWF4LHVzZXJNaW46dGhpcy51c2VyTWluLHVzZXJNYXg6dGhpcy51c2VyTWF4fX0sZ2V0VGhyZXNob2xkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuaXNMb2csYz1iP2RhKHRoaXMubWluKTp0aGlzLm1pbixiPWI/ZGEodGhpcy5tYXgpOnRoaXMubWF4O2M+YXx8YT09PW51bGw/YT1jOmI8YSYmKGE9Yik7cmV0dXJuIHRoaXMudHJhbnNsYXRlKGEsMCwxLDAsMSl9LGFkZFBsb3RCYW5kOmZ1bmN0aW9uKGEpe3RoaXMuYWRkUGxvdEJhbmRPckxpbmUoYSwicGxvdEJhbmRzIil9LGFkZFBsb3RMaW5lOmZ1bmN0aW9uKGEpe3RoaXMuYWRkUGxvdEJhbmRPckxpbmUoYSwKInBsb3RMaW5lcyIpfSxhZGRQbG90QmFuZE9yTGluZTpmdW5jdGlvbihhLGIpe3ZhciBjPShuZXcgb2IodGhpcyxhKSkucmVuZGVyKCksZD10aGlzLnVzZXJPcHRpb25zO2ImJihkW2JdPWRbYl18fFtdLGRbYl0ucHVzaChhKSk7dGhpcy5wbG90TGluZXNBbmRCYW5kcy5wdXNoKGMpO3JldHVybiBjfSxnZXRPZmZzZXQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9YS5jaGFydCxjPWIucmVuZGVyZXIsZD1hLm9wdGlvbnMsZT1hLnRpY2tQb3NpdGlvbnMsZj1hLnRpY2tzLGc9YS5ob3JpeixoPWEuc2lkZSxpPWIuaW52ZXJ0ZWQ/WzEsMCwzLDJdW2hdOmgsaixrPTAsbSxsPTAscD1kLnRpdGxlLHM9ZC5sYWJlbHMsdD0wLEI9Yi5heGlzT2Zmc2V0LHc9Yi5jbGlwT2Zmc2V0LEc9Wy0xLDEsMSwtMV1baF0sdjthLmhhc0RhdGE9Yj1hLmhhc1Zpc2libGVTZXJpZXN8fHIoYS5taW4pJiZyKGEubWF4KSYmISFlO2Euc2hvd0F4aXM9aj1ifHxvKGQuc2hvd0VtcHR5LCEwKTtpZighYS5heGlzR3JvdXApYS5ncmlkR3JvdXA9CmMuZygiZ3JpZCIpLmF0dHIoe3pJbmRleDpkLmdyaWRaSW5kZXh8fDF9KS5hZGQoKSxhLmF4aXNHcm91cD1jLmcoImF4aXMiKS5hdHRyKHt6SW5kZXg6ZC56SW5kZXh8fDJ9KS5hZGQoKSxhLmxhYmVsR3JvdXA9Yy5nKCJheGlzLWxhYmVscyIpLmF0dHIoe3pJbmRleDpzLnpJbmRleHx8N30pLmFkZCgpO2lmKGJ8fGEuaXNMaW5rZWQpbihlLGZ1bmN0aW9uKGIpe2ZbYl0/ZltiXS5hZGRMYWJlbCgpOmZbYl09bmV3IElhKGEsYil9KSxuKGUsZnVuY3Rpb24oYSl7aWYoaD09PTB8fGg9PT0yfHx7MToibGVmdCIsMzoicmlnaHQifVtoXT09PXMuYWxpZ24pdD1xKGZbYV0uZ2V0TGFiZWxTaXplKCksdCl9KSxhLnN0YWdnZXJMaW5lcyYmKHQrPShhLnN0YWdnZXJMaW5lcy0xKSoxNik7ZWxzZSBmb3IodiBpbiBmKWZbdl0uZGVzdHJveSgpLGRlbGV0ZSBmW3ZdO2lmKHAmJnAudGV4dCYmcC5lbmFibGVkIT09ITEpe2lmKCFhLmF4aXNUaXRsZSlhLmF4aXNUaXRsZT1jLnRleHQocC50ZXh0LDAsMCwKcC51c2VIVE1MKS5hdHRyKHt6SW5kZXg6Nyxyb3RhdGlvbjpwLnJvdGF0aW9ufHwwLGFsaWduOnAudGV4dEFsaWdufHx7bG93OiJsZWZ0IixtaWRkbGU6ImNlbnRlciIsaGlnaDoicmlnaHQifVtwLmFsaWduXX0pLmNzcyhwLnN0eWxlKS5hZGQoYS5heGlzR3JvdXApLGEuYXhpc1RpdGxlLmlzTmV3PSEwO2lmKGopaz1hLmF4aXNUaXRsZS5nZXRCQm94KClbZz8iaGVpZ2h0Ijoid2lkdGgiXSxsPW8ocC5tYXJnaW4sZz81OjEwKSxtPXAub2Zmc2V0O2EuYXhpc1RpdGxlW2o/InNob3ciOiJoaWRlIl0oKX1hLm9mZnNldD1HKm8oZC5vZmZzZXQsQltoXSk7YS5heGlzVGl0bGVNYXJnaW49byhtLHQrbCsoaCE9PTImJnQmJkcqZC5sYWJlbHNbZz8ieSI6IngiXSkpO0JbaF09cShCW2hdLGEuYXhpc1RpdGxlTWFyZ2luK2srRyphLm9mZnNldCk7d1tpXT1xKHdbaV0sZC5saW5lV2lkdGgpfSxnZXRMaW5lUGF0aDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNoYXJ0LGM9dGhpcy5vcHBvc2l0ZSxkPQp0aGlzLm9mZnNldCxlPXRoaXMuaG9yaXosZj10aGlzLmxlZnQrKGM/dGhpcy53aWR0aDowKStkO3RoaXMubGluZVRvcD1kPWIuY2hhcnRIZWlnaHQtdGhpcy5ib3R0b20tKGM/dGhpcy5oZWlnaHQ6MCkrZDtjfHwoYSo9LTEpO3JldHVybiBiLnJlbmRlcmVyLmNyaXNwTGluZShbIk0iLGU/dGhpcy5sZWZ0OmYsZT9kOnRoaXMudG9wLCJMIixlP2IuY2hhcnRXaWR0aC10aGlzLnJpZ2h0OmYsZT9kOmIuY2hhcnRIZWlnaHQtdGhpcy5ib3R0b21dLGEpfSxnZXRUaXRsZVBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ob3JpeixiPXRoaXMubGVmdCxjPXRoaXMudG9wLGQ9dGhpcy5sZW4sZT10aGlzLm9wdGlvbnMudGl0bGUsZj1hP2I6YyxnPXRoaXMub3Bwb3NpdGUsaD10aGlzLm9mZnNldCxpPXUoZS5zdHlsZS5mb250U2l6ZXx8MTIpLGQ9e2xvdzpmKyhhPzA6ZCksbWlkZGxlOmYrZC8yLGhpZ2g6ZisoYT9kOjApfVtlLmFsaWduXSxiPShhP2MrdGhpcy5oZWlnaHQ6YikrKGE/MToKLTEpKihnPy0xOjEpKnRoaXMuYXhpc1RpdGxlTWFyZ2luKyh0aGlzLnNpZGU9PT0yP2k6MCk7cmV0dXJue3g6YT9kOmIrKGc/dGhpcy53aWR0aDowKStoKyhlLnh8fDApLHk6YT9iLShnP3RoaXMuaGVpZ2h0OjApK2g6ZCsoZS55fHwwKX19LHJlbmRlcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1hLmNoYXJ0LGM9Yi5yZW5kZXJlcixkPWEub3B0aW9ucyxlPWEuaXNMb2csZj1hLmlzTGlua2VkLGc9YS50aWNrUG9zaXRpb25zLGg9YS5heGlzVGl0bGUsaT1hLnN0YWNrcyxqPWEudGlja3Msaz1hLm1pbm9yVGlja3MsbT1hLmFsdGVybmF0ZUJhbmRzLGw9ZC5zdGFja0xhYmVscyxwPWQuYWx0ZXJuYXRlR3JpZENvbG9yLHM9YS50aWNrbWFya09mZnNldCxvPWQubGluZVdpZHRoLEIsdz1iLmhhc1JlbmRlcmVkJiZyKGEub2xkTWluKSYmIWlzTmFOKGEub2xkTWluKTtCPWEuaGFzRGF0YTt2YXIgcT1hLnNob3dBeGlzLHQsdjtuKFtqLGssbV0sZnVuY3Rpb24oYSl7Zm9yKHZhciBiIGluIGEpYVtiXS5pc0FjdGl2ZT0KITF9KTtpZihCfHxmKWlmKGEubWlub3JUaWNrSW50ZXJ2YWwmJiFhLmNhdGVnb3JpZXMmJm4oYS5nZXRNaW5vclRpY2tQb3NpdGlvbnMoKSxmdW5jdGlvbihiKXtrW2JdfHwoa1tiXT1uZXcgSWEoYSxiLCJtaW5vciIpKTt3JiZrW2JdLmlzTmV3JiZrW2JdLnJlbmRlcihudWxsLCEwKTtrW2JdLnJlbmRlcihudWxsLCExLDEpfSksZy5sZW5ndGgmJihuKGcuc2xpY2UoMSkuY29uY2F0KFtnWzBdXSksZnVuY3Rpb24oYixjKXtjPWM9PT1nLmxlbmd0aC0xPzA6YysxO2lmKCFmfHxiPj1hLm1pbiYmYjw9YS5tYXgpaltiXXx8KGpbYl09bmV3IElhKGEsYikpLHcmJmpbYl0uaXNOZXcmJmpbYl0ucmVuZGVyKGMsITApLGpbYl0ucmVuZGVyKGMsITEsMSl9KSxzJiZhLm1pbj09PTAmJihqWy0xXXx8KGpbLTFdPW5ldyBJYShhLC0xLG51bGwsITApKSxqWy0xXS5yZW5kZXIoLTEpKSkscCYmbihnLGZ1bmN0aW9uKGIsYyl7aWYoYyUyPT09MCYmYjxhLm1heCltW2JdfHwobVtiXT1uZXcgb2IoYSkpLAp0PWIrcyx2PWdbYysxXSE9PXg/Z1tjKzFdK3M6YS5tYXgsbVtiXS5vcHRpb25zPXtmcm9tOmU/ZGEodCk6dCx0bzplP2RhKHYpOnYsY29sb3I6cH0sbVtiXS5yZW5kZXIoKSxtW2JdLmlzQWN0aXZlPSEwfSksIWEuX2FkZGVkUGxvdExCKW4oKGQucGxvdExpbmVzfHxbXSkuY29uY2F0KGQucGxvdEJhbmRzfHxbXSksZnVuY3Rpb24oYil7YS5hZGRQbG90QmFuZE9yTGluZShiKX0pLGEuX2FkZGVkUGxvdExCPSEwO24oW2osayxtXSxmdW5jdGlvbihhKXt2YXIgYyxkLGU9W10sZj14YT94YS5kdXJhdGlvbnx8NTAwOjAsZz1mdW5jdGlvbigpe2ZvcihkPWUubGVuZ3RoO2QtLTspYVtlW2RdXSYmIWFbZVtkXV0uaXNBY3RpdmUmJihhW2VbZF1dLmRlc3Ryb3koKSxkZWxldGUgYVtlW2RdXSl9O2ZvcihjIGluIGEpaWYoIWFbY10uaXNBY3RpdmUpYVtjXS5yZW5kZXIoYywhMSwwKSxhW2NdLmlzQWN0aXZlPSExLGUucHVzaChjKTthPT09bXx8IWIuaGFzUmVuZGVyZWR8fCFmP2coKTpmJiZzZXRUaW1lb3V0KGcsCmYpfSk7aWYobylCPWEuZ2V0TGluZVBhdGgobyksYS5heGlzTGluZT9hLmF4aXNMaW5lLmFuaW1hdGUoe2Q6Qn0pOmEuYXhpc0xpbmU9Yy5wYXRoKEIpLmF0dHIoe3N0cm9rZTpkLmxpbmVDb2xvciwic3Ryb2tlLXdpZHRoIjpvLHpJbmRleDo3fSkuYWRkKGEuYXhpc0dyb3VwKSxhLmF4aXNMaW5lW3E/InNob3ciOiJoaWRlIl0oKTtpZihoJiZxKWhbaC5pc05ldz8iYXR0ciI6ImFuaW1hdGUiXShhLmdldFRpdGxlUG9zaXRpb24oKSksaC5pc05ldz0hMTtpZihsJiZsLmVuYWJsZWQpe3ZhciB1LHksZD1hLnN0YWNrVG90YWxHcm91cDtpZighZClhLnN0YWNrVG90YWxHcm91cD1kPWMuZygic3RhY2stbGFiZWxzIikuYXR0cih7dmlzaWJpbGl0eToidmlzaWJsZSIsekluZGV4OjZ9KS5hZGQoKTtkLnRyYW5zbGF0ZShiLnBsb3RMZWZ0LGIucGxvdFRvcCk7Zm9yKHUgaW4gaSlmb3IoeSBpbiBjPWlbdV0sYyljW3ldLnJlbmRlcihkKX1hLmlzRGlydHk9ITF9LHJlbW92ZVBsb3RCYW5kT3JMaW5lOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KdGhpcy5wbG90TGluZXNBbmRCYW5kcyxjPWIubGVuZ3RoO2MtLTspYltjXS5pZD09PWEmJmJbY10uZGVzdHJveSgpfSxzZXRUaXRsZTpmdW5jdGlvbihhLGIpe3RoaXMudXBkYXRlKHt0aXRsZTphfSxiKX0scmVkcmF3OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5jaGFydC5wb2ludGVyO2EucmVzZXQmJmEucmVzZXQoITApO3RoaXMucmVuZGVyKCk7bih0aGlzLnBsb3RMaW5lc0FuZEJhbmRzLGZ1bmN0aW9uKGEpe2EucmVuZGVyKCl9KTtuKHRoaXMuc2VyaWVzLGZ1bmN0aW9uKGEpe2EuaXNEaXJ0eT0hMH0pfSxzZXRDYXRlZ29yaWVzOmZ1bmN0aW9uKGEsYil7dGhpcy51cGRhdGUoe2NhdGVnb3JpZXM6YX0sYil9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9YS5zdGFja3MsYztiYShhKTtmb3IoYyBpbiBiKUdhKGJbY10pLGJbY109bnVsbDtuKFthLnRpY2tzLGEubWlub3JUaWNrcyxhLmFsdGVybmF0ZUJhbmRzLGEucGxvdExpbmVzQW5kQmFuZHNdLGZ1bmN0aW9uKGEpe0dhKGEpfSk7Cm4oInN0YWNrVG90YWxHcm91cCxheGlzTGluZSxheGlzR3JvdXAsZ3JpZEdyb3VwLGxhYmVsR3JvdXAsYXhpc1RpdGxlIi5zcGxpdCgiLCIpLGZ1bmN0aW9uKGIpe2FbYl0mJihhW2JdPWFbYl0uZGVzdHJveSgpKX0pfX07cGIucHJvdG90eXBlPXtpbml0OmZ1bmN0aW9uKGEsYil7dmFyIGM9Yi5ib3JkZXJXaWR0aCxkPWIuc3R5bGUsZT11KGQucGFkZGluZyk7dGhpcy5jaGFydD1hO3RoaXMub3B0aW9ucz1iO3RoaXMuY3Jvc3NoYWlycz1bXTt0aGlzLm5vdz17eDowLHk6MH07dGhpcy5pc0hpZGRlbj0hMDt0aGlzLmxhYmVsPWEucmVuZGVyZXIubGFiZWwoIiIsMCwwLGIuc2hhcGUsbnVsbCxudWxsLGIudXNlSFRNTCxudWxsLCJ0b29sdGlwIikuYXR0cih7cGFkZGluZzplLGZpbGw6Yi5iYWNrZ3JvdW5kQ29sb3IsInN0cm9rZS13aWR0aCI6YyxyOmIuYm9yZGVyUmFkaXVzLHpJbmRleDo4fSkuY3NzKGQpLmNzcyh7cGFkZGluZzowfSkuaGlkZSgpLmFkZCgpOyR8fHRoaXMubGFiZWwuc2hhZG93KGIuc2hhZG93KTsKdGhpcy5zaGFyZWQ9Yi5zaGFyZWR9LGRlc3Ryb3k6ZnVuY3Rpb24oKXtuKHRoaXMuY3Jvc3NoYWlycyxmdW5jdGlvbihhKXthJiZhLmRlc3Ryb3koKX0pO2lmKHRoaXMubGFiZWwpdGhpcy5sYWJlbD10aGlzLmxhYmVsLmRlc3Ryb3koKX0sbW92ZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT10aGlzLGY9ZS5ub3csZz1lLm9wdGlvbnMuYW5pbWF0aW9uIT09ITEmJiFlLmlzSGlkZGVuO3YoZix7eDpnPygyKmYueCthKS8zOmEseTpnPyhmLnkrYikvMjpiLGFuY2hvclg6Zz8oMipmLmFuY2hvclgrYykvMzpjLGFuY2hvclk6Zz8oZi5hbmNob3JZK2QpLzI6ZH0pO2UubGFiZWwuYXR0cihmKTtpZihnJiYoUShhLWYueCk+MXx8UShiLWYueSk+MSkpY2xlYXJUaW1lb3V0KHRoaXMudG9vbHRpcFRpbWVvdXQpLHRoaXMudG9vbHRpcFRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe2UmJmUubW92ZShhLGIsYyxkKX0sMzIpfSxoaWRlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiO2lmKCF0aGlzLmlzSGlkZGVuKWI9CnRoaXMuY2hhcnQuaG92ZXJQb2ludHMsdGhpcy5oaWRlVGltZXI9c2V0VGltZW91dChmdW5jdGlvbigpe2EubGFiZWwuZmFkZU91dCgpO2EuaXNIaWRkZW49ITB9LG8odGhpcy5vcHRpb25zLmhpZGVEZWxheSw1MDApKSxiJiZuKGIsZnVuY3Rpb24oYSl7YS5zZXRTdGF0ZSgpfSksdGhpcy5jaGFydC5ob3ZlclBvaW50cz1udWxsfSxoaWRlQ3Jvc3NoYWlyczpmdW5jdGlvbigpe24odGhpcy5jcm9zc2hhaXJzLGZ1bmN0aW9uKGEpe2EmJmEuaGlkZSgpfSl9LGdldEFuY2hvcjpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9dGhpcy5jaGFydCxlPWQuaW52ZXJ0ZWQsZj1kLnBsb3RUb3AsZz0wLGg9MCxpLGE9aGEoYSk7Yz1hWzBdLnRvb2x0aXBQb3M7dGhpcy5mb2xsb3dQb2ludGVyJiZiJiYoYi5jaGFydFg9PT14JiYoYj1kLnBvaW50ZXIubm9ybWFsaXplKGIpKSxjPVtiLmNoYXJ0WC1kLnBsb3RMZWZ0LGIuY2hhcnRZLWZdKTtjfHwobihhLGZ1bmN0aW9uKGEpe2k9YS5zZXJpZXMueUF4aXM7Zys9CmEucGxvdFg7aCs9KGEucGxvdExvdz8oYS5wbG90TG93K2EucGxvdEhpZ2gpLzI6YS5wbG90WSkrKCFlJiZpP2kudG9wLWY6MCl9KSxnLz1hLmxlbmd0aCxoLz1hLmxlbmd0aCxjPVtlP2QucGxvdFdpZHRoLWg6Zyx0aGlzLnNoYXJlZCYmIWUmJmEubGVuZ3RoPjEmJmI/Yi5jaGFydFktZjplP2QucGxvdEhlaWdodC1nOmhdKTtyZXR1cm4gS2EoYyx0KX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuY2hhcnQsZT1kLnBsb3RMZWZ0LGY9ZC5wbG90VG9wLGc9ZC5wbG90V2lkdGgsaD1kLnBsb3RIZWlnaHQsaT1vKHRoaXMub3B0aW9ucy5kaXN0YW5jZSwxMiksaj1jLnBsb3RYLGM9Yy5wbG90WSxkPWorZSsoZC5pbnZlcnRlZD9pOi1hLWkpLGs9Yy1iK2YrMTUsbTtkPDcmJihkPWUrcShqLDApK2kpO2QrYT5lK2cmJihkLT1kK2EtKGUrZyksaz1jLWIrZi1pLG09ITApO2s8Zis1JiYoaz1mKzUsbSYmYz49ayYmYzw9aytiJiYoaz1jK2YraSkpO2srYj5mK2gmJihrPQpxKGYsZitoLWItaSkpO3JldHVybnt4OmQseTprfX0sZGVmYXVsdEZvcm1hdHRlcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBvaW50c3x8aGEodGhpcyksYz1iWzBdLnNlcmllcyxkO2Q9W2MudG9vbHRpcEhlYWRlckZvcm1hdHRlcihiWzBdKV07bihiLGZ1bmN0aW9uKGEpe2M9YS5zZXJpZXM7ZC5wdXNoKGMudG9vbHRpcEZvcm1hdHRlciYmYy50b29sdGlwRm9ybWF0dGVyKGEpfHxhLnBvaW50LnRvb2x0aXBGb3JtYXR0ZXIoYy50b29sdGlwT3B0aW9ucy5wb2ludEZvcm1hdCkpfSk7ZC5wdXNoKGEub3B0aW9ucy5mb290ZXJGb3JtYXR8fCIiKTtyZXR1cm4gZC5qb2luKCIiKX0scmVmcmVzaDpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuY2hhcnQsZD10aGlzLmxhYmVsLGU9dGhpcy5vcHRpb25zLGYsZyxoLGk9e30saixrPVtdO2o9ZS5mb3JtYXR0ZXJ8fHRoaXMuZGVmYXVsdEZvcm1hdHRlcjt2YXIgaT1jLmhvdmVyUG9pbnRzLG0sbD1lLmNyb3NzaGFpcnM7aD10aGlzLnNoYXJlZDsKY2xlYXJUaW1lb3V0KHRoaXMuaGlkZVRpbWVyKTt0aGlzLmZvbGxvd1BvaW50ZXI9aGEoYSlbMF0uc2VyaWVzLnRvb2x0aXBPcHRpb25zLmZvbGxvd1BvaW50ZXI7Zz10aGlzLmdldEFuY2hvcihhLGIpO2Y9Z1swXTtnPWdbMV07aCYmKCFhLnNlcmllc3x8IWEuc2VyaWVzLm5vU2hhcmVkVG9vbHRpcCk/KGMuaG92ZXJQb2ludHM9YSxpJiZuKGksZnVuY3Rpb24oYSl7YS5zZXRTdGF0ZSgpfSksbihhLGZ1bmN0aW9uKGEpe2Euc2V0U3RhdGUoImhvdmVyIik7ay5wdXNoKGEuZ2V0TGFiZWxDb25maWcoKSl9KSxpPXt4OmFbMF0uY2F0ZWdvcnkseTphWzBdLnl9LGkucG9pbnRzPWssYT1hWzBdKTppPWEuZ2V0TGFiZWxDb25maWcoKTtqPWouY2FsbChpLHRoaXMpO2k9YS5zZXJpZXM7aD1ofHwhaS5pc0NhcnRlc2lhbnx8aS50b29sdGlwT3V0c2lkZVBsb3R8fGMuaXNJbnNpZGVQbG90KGYsZyk7aj09PSExfHwhaD90aGlzLmhpZGUoKToodGhpcy5pc0hpZGRlbiYmKFRhKGQpLGQuYXR0cigib3BhY2l0eSIsCjEpLnNob3coKSksZC5hdHRyKHt0ZXh0Omp9KSxtPWUuYm9yZGVyQ29sb3J8fGEuY29sb3J8fGkuY29sb3J8fCIjNjA2MDYwIixkLmF0dHIoe3N0cm9rZTptfSksdGhpcy51cGRhdGVQb3NpdGlvbih7cGxvdFg6ZixwbG90WTpnfSksdGhpcy5pc0hpZGRlbj0hMSk7aWYobCl7bD1oYShsKTtmb3IoZD1sLmxlbmd0aDtkLS07KWlmKGU9YS5zZXJpZXNbZD8ieUF4aXMiOiJ4QXhpcyJdLGxbZF0mJmUpaWYoaD1kP28oYS5zdGFja1ksYS55KTphLngsZS5pc0xvZyYmKGg9a2EoaCkpLGU9ZS5nZXRQbG90TGluZVBhdGgoaCwxKSx0aGlzLmNyb3NzaGFpcnNbZF0pdGhpcy5jcm9zc2hhaXJzW2RdLmF0dHIoe2Q6ZSx2aXNpYmlsaXR5OiJ2aXNpYmxlIn0pO2Vsc2V7aD17InN0cm9rZS13aWR0aCI6bFtkXS53aWR0aHx8MSxzdHJva2U6bFtkXS5jb2xvcnx8IiNDMEMwQzAiLHpJbmRleDpsW2RdLnpJbmRleHx8Mn07aWYobFtkXS5kYXNoU3R5bGUpaC5kYXNoc3R5bGU9bFtkXS5kYXNoU3R5bGU7dGhpcy5jcm9zc2hhaXJzW2RdPQpjLnJlbmRlcmVyLnBhdGgoZSkuYXR0cihoKS5hZGQoKX19RChjLCJ0b29sdGlwUmVmcmVzaCIse3RleHQ6aix4OmYrYy5wbG90TGVmdCx5OmcrYy5wbG90VG9wLGJvcmRlckNvbG9yOm19KX0sdXBkYXRlUG9zaXRpb246ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jaGFydCxjPXRoaXMubGFiZWwsYz0odGhpcy5vcHRpb25zLnBvc2l0aW9uZXJ8fHRoaXMuZ2V0UG9zaXRpb24pLmNhbGwodGhpcyxjLndpZHRoLGMuaGVpZ2h0LGEpO3RoaXMubW92ZSh0KGMueCksdChjLnkpLGEucGxvdFgrYi5wbG90TGVmdCxhLnBsb3RZK2IucGxvdFRvcCl9fTtxYi5wcm90b3R5cGU9e2luaXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz0kPyIiOmIuY2hhcnQuem9vbVR5cGUsZD1hLmludmVydGVkLGU7dGhpcy5vcHRpb25zPWI7dGhpcy5jaGFydD1hO3RoaXMuem9vbVg9ZT0veC8udGVzdChjKTt0aGlzLnpvb21ZPWM9L3kvLnRlc3QoYyk7dGhpcy56b29tSG9yPWUmJiFkfHxjJiZkO3RoaXMuem9vbVZlcnQ9YyYmCiFkfHxlJiZkO3RoaXMucGluY2hEb3duPVtdO3RoaXMubGFzdFZhbGlkVG91Y2g9e307aWYoYi50b29sdGlwLmVuYWJsZWQpYS50b29sdGlwPW5ldyBwYihhLGIudG9vbHRpcCk7dGhpcy5zZXRET01FdmVudHMoKX0sbm9ybWFsaXplOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxhPWF8fE8uZXZlbnQ7aWYoIWEudGFyZ2V0KWEudGFyZ2V0PWEuc3JjRWxlbWVudDthPVBiKGEpO2Q9YS50b3VjaGVzP2EudG91Y2hlcy5pdGVtKDApOmE7dGhpcy5jaGFydFBvc2l0aW9uPWI9VGIodGhpcy5jaGFydC5jb250YWluZXIpO2QucGFnZVg9PT14PyhjPWEueCxiPWEueSk6KGM9ZC5wYWdlWC1iLmxlZnQsYj1kLnBhZ2VZLWIudG9wKTtyZXR1cm4gdihhLHtjaGFydFg6dChjKSxjaGFydFk6dChiKX0pfSxnZXRDb29yZGluYXRlczpmdW5jdGlvbihhKXt2YXIgYj17eEF4aXM6W10seUF4aXM6W119O24odGhpcy5jaGFydC5heGVzLGZ1bmN0aW9uKGMpe2JbYy5pc1hBeGlzPyJ4QXhpcyI6InlBeGlzIl0ucHVzaCh7YXhpczpjLAp2YWx1ZTpjLnRvVmFsdWUoYVtjLmhvcml6PyJjaGFydFgiOiJjaGFydFkiXSl9KX0pO3JldHVybiBifSxnZXRJbmRleDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNoYXJ0O3JldHVybiBiLmludmVydGVkP2IucGxvdEhlaWdodCtiLnBsb3RUb3AtYS5jaGFydFk6YS5jaGFydFgtYi5wbG90TGVmdH0scnVuUG9pbnRBY3Rpb25zOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY2hhcnQsYz1iLnNlcmllcyxkPWIudG9vbHRpcCxlLGY9Yi5ob3ZlclBvaW50LGc9Yi5ob3ZlclNlcmllcyxoLGksaj1iLmNoYXJ0V2lkdGgsaz10aGlzLmdldEluZGV4KGEpO2lmKGQmJnRoaXMub3B0aW9ucy50b29sdGlwLnNoYXJlZCYmKCFnfHwhZy5ub1NoYXJlZFRvb2x0aXApKXtlPVtdO2g9Yy5sZW5ndGg7Zm9yKGk9MDtpPGg7aSsrKWlmKGNbaV0udmlzaWJsZSYmY1tpXS5vcHRpb25zLmVuYWJsZU1vdXNlVHJhY2tpbmchPT0hMSYmIWNbaV0ubm9TaGFyZWRUb29sdGlwJiZjW2ldLnRvb2x0aXBQb2ludHMubGVuZ3RoJiYKKGI9Y1tpXS50b29sdGlwUG9pbnRzW2tdLGIuc2VyaWVzKSliLl9kaXN0PVEoay1iLmNsaWVudFgpLGo9SyhqLGIuX2Rpc3QpLGUucHVzaChiKTtmb3IoaD1lLmxlbmd0aDtoLS07KWVbaF0uX2Rpc3Q+aiYmZS5zcGxpY2UoaCwxKTtpZihlLmxlbmd0aCYmZVswXS5jbGllbnRYIT09dGhpcy5ob3ZlclgpZC5yZWZyZXNoKGUsYSksdGhpcy5ob3Zlclg9ZVswXS5jbGllbnRYfWlmKGcmJmcudHJhY2tlcil7aWYoKGI9Zy50b29sdGlwUG9pbnRzW2tdKSYmYiE9PWYpYi5vbk1vdXNlT3ZlcihhKX1lbHNlIGQmJmQuZm9sbG93UG9pbnRlciYmIWQuaXNIaWRkZW4mJihhPWQuZ2V0QW5jaG9yKFt7fV0sYSksZC51cGRhdGVQb3NpdGlvbih7cGxvdFg6YVswXSxwbG90WTphWzFdfSkpfSxyZXNldDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNoYXJ0LGM9Yi5ob3ZlclNlcmllcyxkPWIuaG92ZXJQb2ludCxlPWIudG9vbHRpcCxiPWUmJmUuc2hhcmVkP2IuaG92ZXJQb2ludHM6ZDsoYT1hJiZlJiZiKSYmCmhhKGIpWzBdLnBsb3RYPT09eCYmKGE9ITEpO2lmKGEpZS5yZWZyZXNoKGIpO2Vsc2V7aWYoZClkLm9uTW91c2VPdXQoKTtpZihjKWMub25Nb3VzZU91dCgpO2UmJihlLmhpZGUoKSxlLmhpZGVDcm9zc2hhaXJzKCkpO3RoaXMuaG92ZXJYPW51bGx9fSxzY2FsZUdyb3VwczpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuY2hhcnQ7bihjLnNlcmllcyxmdW5jdGlvbihkKXtkLnhBeGlzLnpvb21FbmFibGVkJiYoZC5ncm91cC5hdHRyKGEpLGQubWFya2VyR3JvdXAmJihkLm1hcmtlckdyb3VwLmF0dHIoYSksZC5tYXJrZXJHcm91cC5jbGlwKGI/Yy5jbGlwUmVjdDpudWxsKSksZC5kYXRhTGFiZWxzR3JvdXAmJmQuZGF0YUxhYmVsc0dyb3VwLmF0dHIoYSkpfSk7Yy5jbGlwUmVjdC5hdHRyKGJ8fGMuY2xpcEJveCl9LHBpbmNoVHJhbnNsYXRlRGlyZWN0aW9uOmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBoPXRoaXMuY2hhcnQsaT1hPyJ4IjoieSIsaj1hPyJYIjoiWSIsaz0iY2hhcnQiKwpqLG09YT8id2lkdGgiOiJoZWlnaHQiLGw9aFsicGxvdCIrKGE/IkxlZnQiOiJUb3AiKV0scCxzLG89MSxuPWguaW52ZXJ0ZWQsdz1oLmJvdW5kc1thPyJoIjoidiJdLHE9Yi5sZW5ndGg9PT0xLHQ9YlswXVtrXSxyPWNbMF1ba10sdj0hcSYmYlsxXVtrXSx1PSFxJiZjWzFdW2tdLHgsYz1mdW5jdGlvbigpeyFxJiZRKHQtdik+MjAmJihvPVEoci11KS9RKHQtdikpO3M9KGwtcikvbyt0O3A9aFsicGxvdCIrKGE/IldpZHRoIjoiSGVpZ2h0IildL299O2MoKTtiPXM7Yjx3Lm1pbj8oYj13Lm1pbix4PSEwKTpiK3A+dy5tYXgmJihiPXcubWF4LXAseD0hMCk7eD8oci09MC44KihyLWdbaV1bMF0pLHF8fCh1LT0wLjgqKHUtZ1tpXVsxXSkpLGMoKSk6Z1tpXT1bcix1XTtufHwoZltpXT1zLWwsZlttXT1wKTtmPW4/MS9vOm87ZVttXT1wO2VbaV09YjtkW24/YT8ic2NhbGVZIjoic2NhbGVYIjoic2NhbGUiK2pdPW87ZFsidHJhbnNsYXRlIitqXT1mKmwrKHItZip0KX0scGluY2g6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMsYz1iLmNoYXJ0LGQ9Yi5waW5jaERvd24sZT1jLnRvb2x0aXAub3B0aW9ucy5mb2xsb3dUb3VjaE1vdmUsZj1hLnRvdWNoZXMsZz1mLmxlbmd0aCxoPWIubGFzdFZhbGlkVG91Y2gsaT1iLnpvb21Ib3J8fGIucGluY2hIb3Isaj1iLnpvb21WZXJ0fHxiLnBpbmNoVmVydCxrPWl8fGosbT1iLnNlbGVjdGlvbk1hcmtlcixsPXt9LHA9e307YS50eXBlPT09InRvdWNoc3RhcnQiJiZlJiYoYi5pbkNsYXNzKGEudGFyZ2V0LCJoaWdoY2hhcnRzLXRyYWNrZXIiKT8oIWMucnVuVHJhY2tlckNsaWNrfHxnPjEpJiZhLnByZXZlbnREZWZhdWx0KCk6KCFjLnJ1bkNoYXJ0Q2xpY2t8fGc+MSkmJmEucHJldmVudERlZmF1bHQoKSk7S2EoZixmdW5jdGlvbihhKXtyZXR1cm4gYi5ub3JtYWxpemUoYSl9KTtpZihhLnR5cGU9PT0idG91Y2hzdGFydCIpbihmLGZ1bmN0aW9uKGEsYil7ZFtiXT17Y2hhcnRYOmEuY2hhcnRYLGNoYXJ0WTphLmNoYXJ0WX19KSxoLng9W2RbMF0uY2hhcnRYLGRbMV0mJgpkWzFdLmNoYXJ0WF0saC55PVtkWzBdLmNoYXJ0WSxkWzFdJiZkWzFdLmNoYXJ0WV0sbihjLmF4ZXMsZnVuY3Rpb24oYSl7aWYoYS56b29tRW5hYmxlZCl7dmFyIGI9Yy5ib3VuZHNbYS5ob3Jpej8iaCI6InYiXSxkPWEubWluUGl4ZWxQYWRkaW5nLGU9YS50b1BpeGVscyhhLmRhdGFNaW4pLGY9YS50b1BpeGVscyhhLmRhdGFNYXgpLGc9SyhlLGYpLGU9cShlLGYpO2IubWluPUsoYS5wb3MsZy1kKTtiLm1heD1xKGEucG9zK2EubGVuLGUrZCl9fSk7ZWxzZSBpZihkLmxlbmd0aCl7aWYoIW0pYi5zZWxlY3Rpb25NYXJrZXI9bT12KHtkZXN0cm95OnRhfSxjLnBsb3RCb3gpO2kmJmIucGluY2hUcmFuc2xhdGVEaXJlY3Rpb24oITAsZCxmLGwsbSxwLGgpO2omJmIucGluY2hUcmFuc2xhdGVEaXJlY3Rpb24oITEsZCxmLGwsbSxwLGgpO2IuaGFzUGluY2hlZD1rO2Iuc2NhbGVHcm91cHMobCxwKTshayYmZSYmZz09PTEmJnRoaXMucnVuUG9pbnRBY3Rpb25zKGIubm9ybWFsaXplKGEpKX19LGRyYWdTdGFydDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5jaGFydDtiLm1vdXNlSXNEb3duPWEudHlwZTtiLmNhbmNlbENsaWNrPSExO2IubW91c2VEb3duWD10aGlzLm1vdXNlRG93blg9YS5jaGFydFg7dGhpcy5tb3VzZURvd25ZPWEuY2hhcnRZfSxkcmFnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY2hhcnQsYz1iLm9wdGlvbnMuY2hhcnQsZD1hLmNoYXJ0WCxhPWEuY2hhcnRZLGU9dGhpcy56b29tSG9yLGY9dGhpcy56b29tVmVydCxnPWIucGxvdExlZnQsaD1iLnBsb3RUb3AsaT1iLnBsb3RXaWR0aCxqPWIucGxvdEhlaWdodCxrLG09dGhpcy5tb3VzZURvd25YLGw9dGhpcy5tb3VzZURvd25ZO2Q8Zz9kPWc6ZD5nK2kmJihkPWcraSk7YTxoP2E9aDphPmgraiYmKGE9aCtqKTt0aGlzLmhhc0RyYWdnZWQ9TWF0aC5zcXJ0KE1hdGgucG93KG0tZCwyKStNYXRoLnBvdyhsLWEsMikpO2lmKHRoaXMuaGFzRHJhZ2dlZD4xMCl7az1iLmlzSW5zaWRlUGxvdChtLWcsbC1oKTtpZihiLmhhc0NhcnRlc2lhblNlcmllcyYmKHRoaXMuem9vbVh8fAp0aGlzLnpvb21ZKSYmayYmIXRoaXMuc2VsZWN0aW9uTWFya2VyKXRoaXMuc2VsZWN0aW9uTWFya2VyPWIucmVuZGVyZXIucmVjdChnLGgsZT8xOmksZj8xOmosMCkuYXR0cih7ZmlsbDpjLnNlbGVjdGlvbk1hcmtlckZpbGx8fCJyZ2JhKDY5LDExNCwxNjcsMC4yNSkiLHpJbmRleDo3fSkuYWRkKCk7dGhpcy5zZWxlY3Rpb25NYXJrZXImJmUmJihlPWQtbSx0aGlzLnNlbGVjdGlvbk1hcmtlci5hdHRyKHt3aWR0aDpRKGUpLHg6KGU+MD8wOmUpK219KSk7dGhpcy5zZWxlY3Rpb25NYXJrZXImJmYmJihlPWEtbCx0aGlzLnNlbGVjdGlvbk1hcmtlci5hdHRyKHtoZWlnaHQ6UShlKSx5OihlPjA/MDplKStsfSkpO2smJiF0aGlzLnNlbGVjdGlvbk1hcmtlciYmYy5wYW5uaW5nJiZiLnBhbihkKX19LGRyb3A6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jaGFydCxjPXRoaXMuaGFzUGluY2hlZDtpZih0aGlzLnNlbGVjdGlvbk1hcmtlcil7dmFyIGQ9e3hBeGlzOltdLHlBeGlzOltdLG9yaWdpbmFsRXZlbnQ6YS5vcmlnaW5hbEV2ZW50fHwKYX0sZT10aGlzLnNlbGVjdGlvbk1hcmtlcixmPWUueCxnPWUueSxoO2lmKHRoaXMuaGFzRHJhZ2dlZHx8YyluKGIuYXhlcyxmdW5jdGlvbihhKXtpZihhLnpvb21FbmFibGVkKXt2YXIgYj1hLmhvcml6LGM9YS5taW5QaXhlbFBhZGRpbmcsbT1hLnRvVmFsdWUoKGI/ZjpnKStjKSxiPWEudG9WYWx1ZSgoYj9mK2Uud2lkdGg6ZytlLmhlaWdodCktYyk7IWlzTmFOKG0pJiYhaXNOYU4oYikmJihkW2EueE9yWSsiQXhpcyJdLnB1c2goe2F4aXM6YSxtaW46SyhtLGIpLG1heDpxKG0sYil9KSxoPSEwKX19KSxoJiZEKGIsInNlbGVjdGlvbiIsZCxmdW5jdGlvbihhKXtiLnpvb20odihhLGM/e2FuaW1hdGlvbjohMX06bnVsbCkpfSk7dGhpcy5zZWxlY3Rpb25NYXJrZXI9dGhpcy5zZWxlY3Rpb25NYXJrZXIuZGVzdHJveSgpO2MmJnRoaXMuc2NhbGVHcm91cHMoe3RyYW5zbGF0ZVg6Yi5wbG90TGVmdCx0cmFuc2xhdGVZOmIucGxvdFRvcCxzY2FsZVg6MSxzY2FsZVk6MX0pfWlmKGIpTChiLmNvbnRhaW5lciwKe2N1cnNvcjpiLl9jdXJzb3J9KSxiLmNhbmNlbENsaWNrPXRoaXMuaGFzRHJhZ2dlZCxiLm1vdXNlSXNEb3duPXRoaXMuaGFzRHJhZ2dlZD10aGlzLmhhc1BpbmNoZWQ9ITEsdGhpcy5waW5jaERvd249W119LG9uQ29udGFpbmVyTW91c2VEb3duOmZ1bmN0aW9uKGEpe2E9dGhpcy5ub3JtYWxpemUoYSk7YS5wcmV2ZW50RGVmYXVsdCYmYS5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuZHJhZ1N0YXJ0KGEpfSxvbkRvY3VtZW50TW91c2VVcDpmdW5jdGlvbihhKXt0aGlzLmRyb3AoYSl9LG9uRG9jdW1lbnRNb3VzZU1vdmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jaGFydCxjPXRoaXMuY2hhcnRQb3NpdGlvbixkPWIuaG92ZXJTZXJpZXMsYT1QYihhKTtjJiZkJiZkLmlzQ2FydGVzaWFuJiYhYi5pc0luc2lkZVBsb3QoYS5wYWdlWC1jLmxlZnQtYi5wbG90TGVmdCxhLnBhZ2VZLWMudG9wLWIucGxvdFRvcCkmJnRoaXMucmVzZXQoKX0sb25Db250YWluZXJNb3VzZUxlYXZlOmZ1bmN0aW9uKCl7dGhpcy5yZXNldCgpOwp0aGlzLmNoYXJ0UG9zaXRpb249bnVsbH0sb25Db250YWluZXJNb3VzZU1vdmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jaGFydCxhPXRoaXMubm9ybWFsaXplKGEpO2EucmV0dXJuVmFsdWU9ITE7Yi5tb3VzZUlzRG93bj09PSJtb3VzZWRvd24iJiZ0aGlzLmRyYWcoYSk7Yi5pc0luc2lkZVBsb3QoYS5jaGFydFgtYi5wbG90TGVmdCxhLmNoYXJ0WS1iLnBsb3RUb3ApJiZ0aGlzLnJ1blBvaW50QWN0aW9ucyhhKX0saW5DbGFzczpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYzthOyl7aWYoYz1BKGEsImNsYXNzIikpaWYoYy5pbmRleE9mKGIpIT09LTEpcmV0dXJuITA7ZWxzZSBpZihjLmluZGV4T2YoImhpZ2hjaGFydHMtY29udGFpbmVyIikhPT0tMSlyZXR1cm4hMTthPWEucGFyZW50Tm9kZX19LG9uVHJhY2tlck1vdXNlT3V0OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY2hhcnQuaG92ZXJTZXJpZXM7aWYoYiYmIWIub3B0aW9ucy5zdGlja3lUcmFja2luZyYmIXRoaXMuaW5DbGFzcyhhLnRvRWxlbWVudHx8CmEucmVsYXRlZFRhcmdldCwiaGlnaGNoYXJ0cy10b29sdGlwIikpYi5vbk1vdXNlT3V0KCl9LG9uQ29udGFpbmVyQ2xpY2s6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jaGFydCxjPWIuaG92ZXJQb2ludCxkPWIucGxvdExlZnQsZT1iLnBsb3RUb3AsZj1iLmludmVydGVkLGcsaCxpLGE9dGhpcy5ub3JtYWxpemUoYSk7YS5jYW5jZWxCdWJibGU9ITA7aWYoIWIuY2FuY2VsQ2xpY2spYyYmdGhpcy5pbkNsYXNzKGEudGFyZ2V0LCJoaWdoY2hhcnRzLXRyYWNrZXIiKT8oZz10aGlzLmNoYXJ0UG9zaXRpb24saD1jLnBsb3RYLGk9Yy5wbG90WSx2KGMse3BhZ2VYOmcubGVmdCtkKyhmP2IucGxvdFdpZHRoLWk6aCkscGFnZVk6Zy50b3ArZSsoZj9iLnBsb3RIZWlnaHQtaDppKX0pLEQoYy5zZXJpZXMsImNsaWNrIix2KGEse3BvaW50OmN9KSksYy5maXJlUG9pbnRFdmVudCgiY2xpY2siLGEpKToodihhLHRoaXMuZ2V0Q29vcmRpbmF0ZXMoYSkpLGIuaXNJbnNpZGVQbG90KGEuY2hhcnRYLWQsYS5jaGFydFktCmUpJiZEKGIsImNsaWNrIixhKSl9LG9uQ29udGFpbmVyVG91Y2hTdGFydDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNoYXJ0O2EudG91Y2hlcy5sZW5ndGg9PT0xPyhhPXRoaXMubm9ybWFsaXplKGEpLGIuaXNJbnNpZGVQbG90KGEuY2hhcnRYLWIucGxvdExlZnQsYS5jaGFydFktYi5wbG90VG9wKSYmKHRoaXMucnVuUG9pbnRBY3Rpb25zKGEpLHRoaXMucGluY2goYSkpKTphLnRvdWNoZXMubGVuZ3RoPT09MiYmdGhpcy5waW5jaChhKX0sb25Db250YWluZXJUb3VjaE1vdmU6ZnVuY3Rpb24oYSl7KGEudG91Y2hlcy5sZW5ndGg9PT0xfHxhLnRvdWNoZXMubGVuZ3RoPT09MikmJnRoaXMucGluY2goYSl9LG9uRG9jdW1lbnRUb3VjaEVuZDpmdW5jdGlvbihhKXt0aGlzLmRyb3AoYSl9LHNldERPTUV2ZW50czpmdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1hLmNoYXJ0LmNvbnRhaW5lcixjO3RoaXMuX2V2ZW50cz1jPVtbYiwib25tb3VzZWRvd24iLCJvbkNvbnRhaW5lck1vdXNlRG93biJdLApbYiwib25tb3VzZW1vdmUiLCJvbkNvbnRhaW5lck1vdXNlTW92ZSJdLFtiLCJvbmNsaWNrIiwib25Db250YWluZXJDbGljayJdLFtiLCJtb3VzZWxlYXZlIiwib25Db250YWluZXJNb3VzZUxlYXZlIl0sW3osIm1vdXNlbW92ZSIsIm9uRG9jdW1lbnRNb3VzZU1vdmUiXSxbeiwibW91c2V1cCIsIm9uRG9jdW1lbnRNb3VzZVVwIl1dO2ZiJiZjLnB1c2goW2IsIm9udG91Y2hzdGFydCIsIm9uQ29udGFpbmVyVG91Y2hTdGFydCJdLFtiLCJvbnRvdWNobW92ZSIsIm9uQ29udGFpbmVyVG91Y2hNb3ZlIl0sW3osInRvdWNoZW5kIiwib25Eb2N1bWVudFRvdWNoRW5kIl0pO24oYyxmdW5jdGlvbihiKXthWyJfIitiWzJdXT1mdW5jdGlvbihjKXthW2JbMl1dKGMpfTtiWzFdLmluZGV4T2YoIm9uIik9PT0wP2JbMF1bYlsxXV09YVsiXyIrYlsyXV06SihiWzBdLGJbMV0sYVsiXyIrYlsyXV0pfSl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgYT10aGlzO24oYS5fZXZlbnRzLGZ1bmN0aW9uKGIpe2JbMV0uaW5kZXhPZigib24iKT09PQowP2JbMF1bYlsxXV09bnVsbDpiYShiWzBdLGJbMV0sYVsiXyIrYlsyXV0pfSk7ZGVsZXRlIGEuX2V2ZW50cztjbGVhckludGVydmFsKGEudG9vbHRpcFRpbWVvdXQpfX07cmIucHJvdG90eXBlPXtpbml0OmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcyxkPWIuaXRlbVN0eWxlLGU9byhiLnBhZGRpbmcsOCksZj1iLml0ZW1NYXJnaW5Ub3B8fDA7dGhpcy5vcHRpb25zPWI7aWYoYi5lbmFibGVkKWMuYmFzZWxpbmU9dShkLmZvbnRTaXplKSszK2YsYy5pdGVtU3R5bGU9ZCxjLml0ZW1IaWRkZW5TdHlsZT15KGQsYi5pdGVtSGlkZGVuU3R5bGUpLGMuaXRlbU1hcmdpblRvcD1mLGMucGFkZGluZz1lLGMuaW5pdGlhbEl0ZW1YPWUsYy5pbml0aWFsSXRlbVk9ZS01LGMubWF4SXRlbVdpZHRoPTAsYy5jaGFydD1hLGMuaXRlbUhlaWdodD0wLGMubGFzdExpbmVIZWlnaHQ9MCxjLnJlbmRlcigpLEooYy5jaGFydCwiZW5kUmVzaXplIixmdW5jdGlvbigpe2MucG9zaXRpb25DaGVja2JveGVzKCl9KX0sCmNvbG9yaXplSXRlbTpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMub3B0aW9ucyxkPWEubGVnZW5kSXRlbSxlPWEubGVnZW5kTGluZSxmPWEubGVnZW5kU3ltYm9sLGc9dGhpcy5pdGVtSGlkZGVuU3R5bGUuY29sb3IsYz1iP2MuaXRlbVN0eWxlLmNvbG9yOmcsaD1iP2EuY29sb3I6ZyxnPWEub3B0aW9ucyYmYS5vcHRpb25zLm1hcmtlcixpPXtzdHJva2U6aCxmaWxsOmh9LGo7ZCYmZC5jc3Moe2ZpbGw6Yyxjb2xvcjpjfSk7ZSYmZS5hdHRyKHtzdHJva2U6aH0pO2lmKGYpe2lmKGcpZm9yKGogaW4gZz1hLmNvbnZlcnRBdHRyaWJzKGcpLGcpZD1nW2pdLGQhPT14JiYoaVtqXT1kKTtmLmF0dHIoaSl9fSxwb3NpdGlvbkl0ZW06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLGM9Yi5zeW1ib2xQYWRkaW5nLGI9IWIucnRsLGQ9YS5fbGVnZW5kSXRlbVBvcyxlPWRbMF0sZD1kWzFdLGY9YS5jaGVja2JveDthLmxlZ2VuZEdyb3VwJiZhLmxlZ2VuZEdyb3VwLnRyYW5zbGF0ZShiP2U6dGhpcy5sZWdlbmRXaWR0aC0KZS0yKmMtNCxkKTtpZihmKWYueD1lLGYueT1kfSxkZXN0cm95SXRlbTpmdW5jdGlvbihhKXt2YXIgYj1hLmNoZWNrYm94O24oWyJsZWdlbmRJdGVtIiwibGVnZW5kTGluZSIsImxlZ2VuZFN5bWJvbCIsImxlZ2VuZEdyb3VwIl0sZnVuY3Rpb24oYil7YVtiXSYmYVtiXS5kZXN0cm95KCl9KTtiJiZSYShhLmNoZWNrYm94KX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ3JvdXAsYj10aGlzLmJveDtpZihiKXRoaXMuYm94PWIuZGVzdHJveSgpO2lmKGEpdGhpcy5ncm91cD1hLmRlc3Ryb3koKX0scG9zaXRpb25DaGVja2JveGVzOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ3JvdXAuYWxpZ25BdHRyLGMsZD10aGlzLmNsaXBIZWlnaHR8fHRoaXMubGVnZW5kSGVpZ2h0O2lmKGIpYz1iLnRyYW5zbGF0ZVksbih0aGlzLmFsbEl0ZW1zLGZ1bmN0aW9uKGUpe3ZhciBmPWUuY2hlY2tib3gsZztmJiYoZz1jK2YueSsoYXx8MCkrMyxMKGYse2xlZnQ6Yi50cmFuc2xhdGVYK2UubGVnZW5kSXRlbVdpZHRoKwpmLngtMjArInB4Iix0b3A6ZysicHgiLGRpc3BsYXk6Zz5jLTYmJmc8YytkLTY/IiI6U30pKX0pfSxyZW5kZXJUaXRsZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGFkZGluZyxiPXRoaXMub3B0aW9ucy50aXRsZSxjPTA7aWYoYi50ZXh0KXtpZighdGhpcy50aXRsZSl0aGlzLnRpdGxlPXRoaXMuY2hhcnQucmVuZGVyZXIubGFiZWwoYi50ZXh0LGEtMyxhLTQsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLCJsZWdlbmQtdGl0bGUiKS5hdHRyKHt6SW5kZXg6MX0pLmNzcyhiLnN0eWxlKS5hZGQodGhpcy5ncm91cCk7Yz10aGlzLnRpdGxlLmdldEJCb3goKS5oZWlnaHQ7dGhpcy5jb250ZW50R3JvdXAuYXR0cih7dHJhbnNsYXRlWTpjfSl9dGhpcy50aXRsZUhlaWdodD1jfSxyZW5kZXJJdGVtOmZ1bmN0aW9uKGEpe3ZhciB3O3ZhciBiPXRoaXMsYz1iLmNoYXJ0LGQ9Yy5yZW5kZXJlcixlPWIub3B0aW9ucyxmPWUubGF5b3V0PT09Imhvcml6b250YWwiLGc9ZS5zeW1ib2xXaWR0aCxoPWUuc3ltYm9sUGFkZGluZywKaT1iLml0ZW1TdHlsZSxqPWIuaXRlbUhpZGRlblN0eWxlLGs9Yi5wYWRkaW5nLG09IWUucnRsLGw9ZS53aWR0aCxwPWUuaXRlbU1hcmdpbkJvdHRvbXx8MCxzPWIuaXRlbU1hcmdpblRvcCxvPWIuaW5pdGlhbEl0ZW1YLG49YS5sZWdlbmRJdGVtLHQ9YS5zZXJpZXN8fGEscj10Lm9wdGlvbnMsdj1yLnNob3dDaGVja2JveCx1PWUudXNlSFRNTDtpZighbiYmKGEubGVnZW5kR3JvdXA9ZC5nKCJsZWdlbmQtaXRlbSIpLmF0dHIoe3pJbmRleDoxfSkuYWRkKGIuc2Nyb2xsR3JvdXApLHQuZHJhd0xlZ2VuZFN5bWJvbChiLGEpLGEubGVnZW5kSXRlbT1uPWQudGV4dChlLmxhYmVsRm9ybWF0P0VhKGUubGFiZWxGb3JtYXQsYSk6ZS5sYWJlbEZvcm1hdHRlci5jYWxsKGEpLG0/ZytoOi1oLGIuYmFzZWxpbmUsdSkuY3NzKHkoYS52aXNpYmxlP2k6aikpLmF0dHIoe2FsaWduOm0/ImxlZnQiOiJyaWdodCIsekluZGV4OjJ9KS5hZGQoYS5sZWdlbmRHcm91cCksKHU/bjphLmxlZ2VuZEdyb3VwKS5vbigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXthLnNldFN0YXRlKCJob3ZlciIpO24uY3NzKGIub3B0aW9ucy5pdGVtSG92ZXJTdHlsZSl9KS5vbigibW91c2VvdXQiLGZ1bmN0aW9uKCl7bi5jc3MoYS52aXNpYmxlP2k6aik7YS5zZXRTdGF0ZSgpfSkub24oImNsaWNrIixmdW5jdGlvbihiKXt2YXIgYz1mdW5jdGlvbigpe2Euc2V0VmlzaWJsZSgpfSxiPXticm93c2VyRXZlbnQ6Yn07YS5maXJlUG9pbnRFdmVudD9hLmZpcmVQb2ludEV2ZW50KCJsZWdlbmRJdGVtQ2xpY2siLGIsYyk6RChhLCJsZWdlbmRJdGVtQ2xpY2siLGIsYyl9KSxiLmNvbG9yaXplSXRlbShhLGEudmlzaWJsZSksciYmdikpYS5jaGVja2JveD1VKCJpbnB1dCIse3R5cGU6ImNoZWNrYm94IixjaGVja2VkOmEuc2VsZWN0ZWQsZGVmYXVsdENoZWNrZWQ6YS5zZWxlY3RlZH0sZS5pdGVtQ2hlY2tib3hTdHlsZSxjLmNvbnRhaW5lciksSihhLmNoZWNrYm94LCJjbGljayIsZnVuY3Rpb24oYil7RChhLCJjaGVja2JveENsaWNrIix7Y2hlY2tlZDpiLnRhcmdldC5jaGVja2VkfSwKZnVuY3Rpb24oKXthLnNlbGVjdCgpfSl9KTtkPW4uZ2V0QkJveCgpO3c9YS5sZWdlbmRJdGVtV2lkdGg9ZS5pdGVtV2lkdGh8fGcraCtkLndpZHRoK2srKHY/MjA6MCksZT13O2IuaXRlbUhlaWdodD1nPWQuaGVpZ2h0O2lmKGYmJmIuaXRlbVgtbytlPihsfHxjLmNoYXJ0V2lkdGgtMiprLW8pKWIuaXRlbVg9byxiLml0ZW1ZKz1zK2IubGFzdExpbmVIZWlnaHQrcCxiLmxhc3RMaW5lSGVpZ2h0PTA7Yi5tYXhJdGVtV2lkdGg9cShiLm1heEl0ZW1XaWR0aCxlKTtiLmxhc3RJdGVtWT1zK2IuaXRlbVkrcDtiLmxhc3RMaW5lSGVpZ2h0PXEoZyxiLmxhc3RMaW5lSGVpZ2h0KTthLl9sZWdlbmRJdGVtUG9zPVtiLml0ZW1YLGIuaXRlbVldO2Y/Yi5pdGVtWCs9ZTooYi5pdGVtWSs9cytnK3AsYi5sYXN0TGluZUhlaWdodD1nKTtiLm9mZnNldFdpZHRoPWx8fHEoZj9iLml0ZW1YLW86ZSxiLm9mZnNldFdpZHRoKX0scmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiPWEuY2hhcnQsYz1iLnJlbmRlcmVyLApkPWEuZ3JvdXAsZSxmLGcsaCxpPWEuYm94LGo9YS5vcHRpb25zLGs9YS5wYWRkaW5nLG09ai5ib3JkZXJXaWR0aCxsPWouYmFja2dyb3VuZENvbG9yO2EuaXRlbVg9YS5pbml0aWFsSXRlbVg7YS5pdGVtWT1hLmluaXRpYWxJdGVtWTthLm9mZnNldFdpZHRoPTA7YS5sYXN0SXRlbVk9MDtpZighZClhLmdyb3VwPWQ9Yy5nKCJsZWdlbmQiKS5hdHRyKHt6SW5kZXg6N30pLmFkZCgpLGEuY29udGVudEdyb3VwPWMuZygpLmF0dHIoe3pJbmRleDoxfSkuYWRkKGQpLGEuc2Nyb2xsR3JvdXA9Yy5nKCkuYWRkKGEuY29udGVudEdyb3VwKSxhLmNsaXBSZWN0PWMuY2xpcFJlY3QoMCwwLDk5OTksYi5jaGFydEhlaWdodCksYS5jb250ZW50R3JvdXAuY2xpcChhLmNsaXBSZWN0KTthLnJlbmRlclRpdGxlKCk7ZT1bXTtuKGIuc2VyaWVzLGZ1bmN0aW9uKGEpe3ZhciBiPWEub3B0aW9ucztiLnNob3dJbkxlZ2VuZCYmIXIoYi5saW5rZWRUbykmJihlPWUuY29uY2F0KGEubGVnZW5kSXRlbXN8fChiLmxlZ2VuZFR5cGU9PT0KInBvaW50Ij9hLmRhdGE6YSkpKX0pO0diKGUsZnVuY3Rpb24oYSxiKXtyZXR1cm4oYS5vcHRpb25zJiZhLm9wdGlvbnMubGVnZW5kSW5kZXh8fDApLShiLm9wdGlvbnMmJmIub3B0aW9ucy5sZWdlbmRJbmRleHx8MCl9KTtqLnJldmVyc2VkJiZlLnJldmVyc2UoKTthLmFsbEl0ZW1zPWU7YS5kaXNwbGF5PWY9ISFlLmxlbmd0aDtuKGUsZnVuY3Rpb24oYil7YS5yZW5kZXJJdGVtKGIpfSk7Zz1qLndpZHRofHxhLm9mZnNldFdpZHRoO2g9YS5sYXN0SXRlbVkrYS5sYXN0TGluZUhlaWdodCthLnRpdGxlSGVpZ2h0O2g9YS5oYW5kbGVPdmVyZmxvdyhoKTtpZihtfHxsKXtnKz1rO2grPWs7aWYoaSl7aWYoZz4wJiZoPjApaVtpLmlzTmV3PyJhdHRyIjoiYW5pbWF0ZSJdKGkuY3Jpc3AobnVsbCxudWxsLG51bGwsZyxoKSksaS5pc05ldz0hMX1lbHNlIGEuYm94PWk9Yy5yZWN0KDAsMCxnLGgsai5ib3JkZXJSYWRpdXMsbXx8MCkuYXR0cih7c3Ryb2tlOmouYm9yZGVyQ29sb3IsInN0cm9rZS13aWR0aCI6bXx8CjAsZmlsbDpsfHxTfSkuYWRkKGQpLnNoYWRvdyhqLnNoYWRvdyksaS5pc05ldz0hMDtpW2Y/InNob3ciOiJoaWRlIl0oKX1hLmxlZ2VuZFdpZHRoPWc7YS5sZWdlbmRIZWlnaHQ9aDtuKGUsZnVuY3Rpb24oYil7YS5wb3NpdGlvbkl0ZW0oYil9KTtmJiZkLmFsaWduKHYoe3dpZHRoOmcsaGVpZ2h0Omh9LGopLCEwLCJzcGFjaW5nQm94Iik7Yi5pc1Jlc2l6aW5nfHx0aGlzLnBvc2l0aW9uQ2hlY2tib3hlcygpfSxoYW5kbGVPdmVyZmxvdzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLGM9dGhpcy5jaGFydCxkPWMucmVuZGVyZXIsZT10aGlzLm9wdGlvbnMsZj1lLnksZj1jLnNwYWNpbmdCb3guaGVpZ2h0KyhlLnZlcnRpY2FsQWxpZ249PT0idG9wIj8tZjpmKS10aGlzLnBhZGRpbmcsZz1lLm1heEhlaWdodCxoPXRoaXMuY2xpcFJlY3QsaT1lLm5hdmlnYXRpb24saj1vKGkuYW5pbWF0aW9uLCEwKSxrPWkuYXJyb3dTaXplfHwxMixtPXRoaXMubmF2O2UubGF5b3V0PT09Imhvcml6b250YWwiJiYKKGYvPTIpO2cmJihmPUsoZixnKSk7aWYoYT5mJiYhZS51c2VIVE1MKXt0aGlzLmNsaXBIZWlnaHQ9Yz1mLTIwLXRoaXMudGl0bGVIZWlnaHQ7dGhpcy5wYWdlQ291bnQ9amEoYS9jKTt0aGlzLmN1cnJlbnRQYWdlPW8odGhpcy5jdXJyZW50UGFnZSwxKTt0aGlzLmZ1bGxIZWlnaHQ9YTtoLmF0dHIoe2hlaWdodDpjfSk7aWYoIW0pdGhpcy5uYXY9bT1kLmcoKS5hdHRyKHt6SW5kZXg6MX0pLmFkZCh0aGlzLmdyb3VwKSx0aGlzLnVwPWQuc3ltYm9sKCJ0cmlhbmdsZSIsMCwwLGssaykub24oImNsaWNrIixmdW5jdGlvbigpe2Iuc2Nyb2xsKC0xLGopfSkuYWRkKG0pLHRoaXMucGFnZXI9ZC50ZXh0KCIiLDE1LDEwKS5jc3MoaS5zdHlsZSkuYWRkKG0pLHRoaXMuZG93bj1kLnN5bWJvbCgidHJpYW5nbGUtZG93biIsMCwwLGssaykub24oImNsaWNrIixmdW5jdGlvbigpe2Iuc2Nyb2xsKDEsail9KS5hZGQobSk7Yi5zY3JvbGwoMCk7YT1mfWVsc2UgaWYobSloLmF0dHIoe2hlaWdodDpjLmNoYXJ0SGVpZ2h0fSksCm0uaGlkZSgpLHRoaXMuc2Nyb2xsR3JvdXAuYXR0cih7dHJhbnNsYXRlWToxfSksdGhpcy5jbGlwSGVpZ2h0PTA7cmV0dXJuIGF9LHNjcm9sbDpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMucGFnZUNvdW50LGQ9dGhpcy5jdXJyZW50UGFnZSthLGU9dGhpcy5jbGlwSGVpZ2h0LGY9dGhpcy5vcHRpb25zLm5hdmlnYXRpb24sZz1mLmFjdGl2ZUNvbG9yLGg9Zi5pbmFjdGl2ZUNvbG9yLGY9dGhpcy5wYWdlcixpPXRoaXMucGFkZGluZztkPmMmJihkPWMpO2lmKGQ+MCliIT09eCYmSGEoYix0aGlzLmNoYXJ0KSx0aGlzLm5hdi5hdHRyKHt0cmFuc2xhdGVYOmksdHJhbnNsYXRlWTplKzcrdGhpcy50aXRsZUhlaWdodCx2aXNpYmlsaXR5OiJ2aXNpYmxlIn0pLHRoaXMudXAuYXR0cih7ZmlsbDpkPT09MT9oOmd9KS5jc3Moe2N1cnNvcjpkPT09MT8iZGVmYXVsdCI6InBvaW50ZXIifSksZi5hdHRyKHt0ZXh0OmQrIi8iK3RoaXMucGFnZUNvdW50fSksdGhpcy5kb3duLmF0dHIoe3g6MTgrdGhpcy5wYWdlci5nZXRCQm94KCkud2lkdGgsCmZpbGw6ZD09PWM/aDpnfSkuY3NzKHtjdXJzb3I6ZD09PWM/ImRlZmF1bHQiOiJwb2ludGVyIn0pLGU9LUsoZSooZC0xKSx0aGlzLmZ1bGxIZWlnaHQtZStpKSsxLHRoaXMuc2Nyb2xsR3JvdXAuYW5pbWF0ZSh7dHJhbnNsYXRlWTplfSksZi5hdHRyKHt0ZXh0OmQrIi8iK2N9KSx0aGlzLmN1cnJlbnRQYWdlPWQsdGhpcy5wb3NpdGlvbkNoZWNrYm94ZXMoZSl9fTtzYi5wcm90b3R5cGU9e2luaXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPWEuc2VyaWVzO2Euc2VyaWVzPW51bGw7Yz15KE4sYSk7Yy5zZXJpZXM9YS5zZXJpZXM9ZDt2YXIgZD1jLmNoYXJ0LGU9ZC5tYXJnaW4sZT1WKGUpP2U6W2UsZSxlLGVdO3RoaXMub3B0aW9uc01hcmdpblRvcD1vKGQubWFyZ2luVG9wLGVbMF0pO3RoaXMub3B0aW9uc01hcmdpblJpZ2h0PW8oZC5tYXJnaW5SaWdodCxlWzFdKTt0aGlzLm9wdGlvbnNNYXJnaW5Cb3R0b209byhkLm1hcmdpbkJvdHRvbSxlWzJdKTt0aGlzLm9wdGlvbnNNYXJnaW5MZWZ0PQpvKGQubWFyZ2luTGVmdCxlWzNdKTt0aGlzLnJ1bkNoYXJ0Q2xpY2s9KGU9ZC5ldmVudHMpJiYhIWUuY2xpY2s7dGhpcy5ib3VuZHM9e2g6e30sdjp7fX07dGhpcy5jYWxsYmFjaz1iO3RoaXMuaXNSZXNpemluZz0wO3RoaXMub3B0aW9ucz1jO3RoaXMuYXhlcz1bXTt0aGlzLnNlcmllcz1bXTt0aGlzLmhhc0NhcnRlc2lhblNlcmllcz1kLnNob3dBeGVzO3ZhciBmPXRoaXMsZztmLmluZGV4PXphLmxlbmd0aDt6YS5wdXNoKGYpO2QucmVmbG93IT09ITEmJkooZiwibG9hZCIsZnVuY3Rpb24oKXtmLmluaXRSZWZsb3coKX0pO2lmKGUpZm9yKGcgaW4gZSlKKGYsZyxlW2ddKTtmLnhBeGlzPVtdO2YueUF4aXM9W107Zi5hbmltYXRpb249JD8hMTpvKGQuYW5pbWF0aW9uLCEwKTtmLnBvaW50Q291bnQ9MDtmLmNvdW50ZXJzPW5ldyBGYjtmLmZpcnN0UmVuZGVyKCl9LGluaXRTZXJpZXM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNoYXJ0OyhiPWFhW2EudHlwZXx8Yi50eXBlfHwKYi5kZWZhdWx0U2VyaWVzVHlwZV0pfHxxYSgxNywhMCk7Yj1uZXcgYjtiLmluaXQodGhpcyxhKTtyZXR1cm4gYn0sYWRkU2VyaWVzOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPXRoaXM7YSYmKGI9byhiLCEwKSxEKGUsImFkZFNlcmllcyIse29wdGlvbnM6YX0sZnVuY3Rpb24oKXtkPWUuaW5pdFNlcmllcyhhKTtlLmlzRGlydHlMZWdlbmQ9ITA7YiYmZS5yZWRyYXcoYyl9KSk7cmV0dXJuIGR9LGFkZEF4aXM6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGI9Yj8ieEF4aXMiOiJ5QXhpcyIsZT10aGlzLm9wdGlvbnM7bmV3IGFiKHRoaXMseShhLHtpbmRleDp0aGlzW2JdLmxlbmd0aH0pKTtlW2JdPWhhKGVbYl18fHt9KTtlW2JdLnB1c2goYSk7byhjLCEwKSYmdGhpcy5yZWRyYXcoZCl9LGlzSW5zaWRlUGxvdDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9Yz9iOmEsYT1jP2E6YjtyZXR1cm4gZD49MCYmZDw9dGhpcy5wbG90V2lkdGgmJmE+PTAmJmE8PXRoaXMucGxvdEhlaWdodH0sYWRqdXN0VGlja0Ftb3VudHM6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuY2hhcnQuYWxpZ25UaWNrcyE9PQohMSYmbih0aGlzLmF4ZXMsZnVuY3Rpb24oYSl7YS5hZGp1c3RUaWNrQW1vdW50KCl9KTt0aGlzLm1heFRpY2tzPW51bGx9LHJlZHJhdzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmF4ZXMsYz10aGlzLnNlcmllcyxkPXRoaXMucG9pbnRlcixlPXRoaXMubGVnZW5kLGY9dGhpcy5pc0RpcnR5TGVnZW5kLGcsaD10aGlzLmlzRGlydHlCb3gsaT1jLmxlbmd0aCxqPWksaz10aGlzLnJlbmRlcmVyLG09ay5pc0hpZGRlbigpLGw9W107SGEoYSx0aGlzKTtmb3IobSYmdGhpcy5jbG9uZVJlbmRlclRvKCk7ai0tOylpZihhPWNbal0sYS5pc0RpcnR5JiZhLm9wdGlvbnMuc3RhY2tpbmcpe2c9ITA7YnJlYWt9aWYoZylmb3Ioaj1pO2otLTspaWYoYT1jW2pdLGEub3B0aW9ucy5zdGFja2luZylhLmlzRGlydHk9ITA7bihjLGZ1bmN0aW9uKGEpe2EuaXNEaXJ0eSYmYS5vcHRpb25zLmxlZ2VuZFR5cGU9PT0icG9pbnQiJiYoZj0hMCl9KTtpZihmJiZlLm9wdGlvbnMuZW5hYmxlZCllLnJlbmRlcigpLHRoaXMuaXNEaXJ0eUxlZ2VuZD0KITE7aWYodGhpcy5oYXNDYXJ0ZXNpYW5TZXJpZXMpe2lmKCF0aGlzLmlzUmVzaXppbmcpdGhpcy5tYXhUaWNrcz1udWxsLG4oYixmdW5jdGlvbihhKXthLnNldFNjYWxlKCl9KTt0aGlzLmFkanVzdFRpY2tBbW91bnRzKCk7dGhpcy5nZXRNYXJnaW5zKCk7bihiLGZ1bmN0aW9uKGEpe2lmKGEuaXNEaXJ0eUV4dHJlbWVzKWEuaXNEaXJ0eUV4dHJlbWVzPSExLGwucHVzaChmdW5jdGlvbigpe0QoYSwiYWZ0ZXJTZXRFeHRyZW1lcyIsYS5nZXRFeHRyZW1lcygpKX0pO2lmKGEuaXNEaXJ0eXx8aHx8ZylhLnJlZHJhdygpLGg9ITB9KX1oJiZ0aGlzLmRyYXdDaGFydEJveCgpO24oYyxmdW5jdGlvbihhKXthLmlzRGlydHkmJmEudmlzaWJsZSYmKCFhLmlzQ2FydGVzaWFufHxhLnhBeGlzKSYmYS5yZWRyYXcoKX0pO2QmJmQucmVzZXQmJmQucmVzZXQoITApO2suZHJhdygpO0QodGhpcywicmVkcmF3Iik7bSYmdGhpcy5jbG9uZVJlbmRlclRvKCEwKTtuKGwsZnVuY3Rpb24oYSl7YS5jYWxsKCl9KX0sCnNob3dMb2FkaW5nOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucyxjPXRoaXMubG9hZGluZ0RpdixkPWIubG9hZGluZztpZighYyl0aGlzLmxvYWRpbmdEaXY9Yz1VKHdhLHtjbGFzc05hbWU6ImhpZ2hjaGFydHMtbG9hZGluZyJ9LHYoZC5zdHlsZSx7ekluZGV4OjEwLGRpc3BsYXk6U30pLHRoaXMuY29udGFpbmVyKSx0aGlzLmxvYWRpbmdTcGFuPVUoInNwYW4iLG51bGwsZC5sYWJlbFN0eWxlLGMpO3RoaXMubG9hZGluZ1NwYW4uaW5uZXJIVE1MPWF8fGIubGFuZy5sb2FkaW5nO2lmKCF0aGlzLmxvYWRpbmdTaG93bilMKGMse29wYWNpdHk6MCxkaXNwbGF5OiIiLGxlZnQ6dGhpcy5wbG90TGVmdCsicHgiLHRvcDp0aGlzLnBsb3RUb3ArInB4Iix3aWR0aDp0aGlzLnBsb3RXaWR0aCsicHgiLGhlaWdodDp0aGlzLnBsb3RIZWlnaHQrInB4In0pLHZiKGMse29wYWNpdHk6ZC5zdHlsZS5vcGFjaXR5fSx7ZHVyYXRpb246ZC5zaG93RHVyYXRpb258fDB9KSx0aGlzLmxvYWRpbmdTaG93bj0KITB9LGhpZGVMb2FkaW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcHRpb25zLGI9dGhpcy5sb2FkaW5nRGl2O2ImJnZiKGIse29wYWNpdHk6MH0se2R1cmF0aW9uOmEubG9hZGluZy5oaWRlRHVyYXRpb258fDEwMCxjb21wbGV0ZTpmdW5jdGlvbigpe0woYix7ZGlzcGxheTpTfSl9fSk7dGhpcy5sb2FkaW5nU2hvd249ITF9LGdldDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmF4ZXMsYz10aGlzLnNlcmllcyxkLGU7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylpZihiW2RdLm9wdGlvbnMuaWQ9PT1hKXJldHVybiBiW2RdO2ZvcihkPTA7ZDxjLmxlbmd0aDtkKyspaWYoY1tkXS5vcHRpb25zLmlkPT09YSlyZXR1cm4gY1tkXTtmb3IoZD0wO2Q8Yy5sZW5ndGg7ZCsrKXtlPWNbZF0ucG9pbnRzfHxbXTtmb3IoYj0wO2I8ZS5sZW5ndGg7YisrKWlmKGVbYl0uaWQ9PT1hKXJldHVybiBlW2JdfXJldHVybiBudWxsfSxnZXRBeGVzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiPXRoaXMub3B0aW9ucyxjPQpiLnhBeGlzPWhhKGIueEF4aXN8fHt9KSxiPWIueUF4aXM9aGEoYi55QXhpc3x8e30pO24oYyxmdW5jdGlvbihhLGIpe2EuaW5kZXg9YjthLmlzWD0hMH0pO24oYixmdW5jdGlvbihhLGIpe2EuaW5kZXg9Yn0pO2M9Yy5jb25jYXQoYik7bihjLGZ1bmN0aW9uKGIpe25ldyBhYihhLGIpfSk7YS5hZGp1c3RUaWNrQW1vdW50cygpfSxnZXRTZWxlY3RlZFBvaW50czpmdW5jdGlvbigpe3ZhciBhPVtdO24odGhpcy5zZXJpZXMsZnVuY3Rpb24oYil7YT1hLmNvbmNhdChPYihiLnBvaW50c3x8W10sZnVuY3Rpb24oYSl7cmV0dXJuIGEuc2VsZWN0ZWR9KSl9KTtyZXR1cm4gYX0sZ2V0U2VsZWN0ZWRTZXJpZXM6ZnVuY3Rpb24oKXtyZXR1cm4gT2IodGhpcy5zZXJpZXMsZnVuY3Rpb24oYSl7cmV0dXJuIGEuc2VsZWN0ZWR9KX0sc2hvd1Jlc2V0Wm9vbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1OLmxhbmcsYz1hLm9wdGlvbnMuY2hhcnQucmVzZXRab29tQnV0dG9uLGQ9Yy50aGVtZSxlPWQuc3RhdGVzLApmPWMucmVsYXRpdmVUbz09PSJjaGFydCI/bnVsbDoicGxvdEJveCI7dGhpcy5yZXNldFpvb21CdXR0b249YS5yZW5kZXJlci5idXR0b24oYi5yZXNldFpvb20sbnVsbCxudWxsLGZ1bmN0aW9uKCl7YS56b29tT3V0KCl9LGQsZSYmZS5ob3ZlcikuYXR0cih7YWxpZ246Yy5wb3NpdGlvbi5hbGlnbix0aXRsZTpiLnJlc2V0Wm9vbVRpdGxlfSkuYWRkKCkuYWxpZ24oYy5wb3NpdGlvbiwhMSxmKX0sem9vbU91dDpmdW5jdGlvbigpe3ZhciBhPXRoaXM7RChhLCJzZWxlY3Rpb24iLHtyZXNldFNlbGVjdGlvbjohMH0sZnVuY3Rpb24oKXthLnpvb20oKX0pfSx6b29tOmZ1bmN0aW9uKGEpe3ZhciBiLGM9dGhpcy5wb2ludGVyLGQ9ITEsZTshYXx8YS5yZXNldFNlbGVjdGlvbj9uKHRoaXMuYXhlcyxmdW5jdGlvbihhKXtiPWEuem9vbSgpfSk6bihhLnhBeGlzLmNvbmNhdChhLnlBeGlzKSxmdW5jdGlvbihhKXt2YXIgZT1hLmF4aXMsaD1lLmlzWEF4aXM7aWYoY1toPyJ6b29tWCI6Inpvb21ZIl18fApjW2g/InBpbmNoWCI6InBpbmNoWSJdKWI9ZS56b29tKGEubWluLGEubWF4KSxlLmRpc3BsYXlCdG4mJihkPSEwKX0pO2U9dGhpcy5yZXNldFpvb21CdXR0b247aWYoZCYmIWUpdGhpcy5zaG93UmVzZXRab29tKCk7ZWxzZSBpZighZCYmVihlKSl0aGlzLnJlc2V0Wm9vbUJ1dHRvbj1lLmRlc3Ryb3koKTtiJiZ0aGlzLnJlZHJhdyhvKHRoaXMub3B0aW9ucy5jaGFydC5hbmltYXRpb24sYSYmYS5hbmltYXRpb24sdGhpcy5wb2ludENvdW50PDEwMCkpfSxwYW46ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy54QXhpc1swXSxjPXRoaXMubW91c2VEb3duWCxkPWIucG9pbnRSYW5nZS8yLGU9Yi5nZXRFeHRyZW1lcygpLGY9Yi50cmFuc2xhdGUoYy1hLCEwKStkLGM9Yi50cmFuc2xhdGUoYyt0aGlzLnBsb3RXaWR0aC1hLCEwKS1kOyhkPXRoaXMuaG92ZXJQb2ludHMpJiZuKGQsZnVuY3Rpb24oYSl7YS5zZXRTdGF0ZSgpfSk7Yi5zZXJpZXMubGVuZ3RoJiZmPksoZS5kYXRhTWluLGUubWluKSYmYzwKcShlLmRhdGFNYXgsZS5tYXgpJiZiLnNldEV4dHJlbWVzKGYsYywhMCwhMSx7dHJpZ2dlcjoicGFuIn0pO3RoaXMubW91c2VEb3duWD1hO0wodGhpcy5jb250YWluZXIse2N1cnNvcjoibW92ZSJ9KX0sc2V0VGl0bGU6ZnVuY3Rpb24oYSxiKXt2YXIgZjt2YXIgYz10aGlzLGQ9Yy5vcHRpb25zLGU7ZT1kLnRpdGxlPXkoZC50aXRsZSxhKTtmPWQuc3VidGl0bGU9eShkLnN1YnRpdGxlLGIpLGQ9ZjtuKFtbInRpdGxlIixhLGVdLFsic3VidGl0bGUiLGIsZF1dLGZ1bmN0aW9uKGEpe3ZhciBiPWFbMF0sZD1jW2JdLGU9YVsxXSxhPWFbMl07ZCYmZSYmKGNbYl09ZD1kLmRlc3Ryb3koKSk7YSYmYS50ZXh0JiYhZCYmKGNbYl09Yy5yZW5kZXJlci50ZXh0KGEudGV4dCwwLDAsYS51c2VIVE1MKS5hdHRyKHthbGlnbjphLmFsaWduLCJjbGFzcyI6ImhpZ2hjaGFydHMtIitiLHpJbmRleDphLnpJbmRleHx8NH0pLmNzcyhhLnN0eWxlKS5hZGQoKS5hbGlnbihhLCExLCJzcGFjaW5nQm94IikpfSl9LApnZXRDaGFydFNpemU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnMuY2hhcnQsYj10aGlzLnJlbmRlclRvQ2xvbmV8fHRoaXMucmVuZGVyVG87dGhpcy5jb250YWluZXJXaWR0aD1nYihiLCJ3aWR0aCIpO3RoaXMuY29udGFpbmVySGVpZ2h0PWdiKGIsImhlaWdodCIpO3RoaXMuY2hhcnRXaWR0aD1xKDAsYS53aWR0aHx8dGhpcy5jb250YWluZXJXaWR0aHx8NjAwKTt0aGlzLmNoYXJ0SGVpZ2h0PXEoMCxvKGEuaGVpZ2h0LHRoaXMuY29udGFpbmVySGVpZ2h0PjE5P3RoaXMuY29udGFpbmVySGVpZ2h0OjQwMCkpfSxjbG9uZVJlbmRlclRvOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMucmVuZGVyVG9DbG9uZSxjPXRoaXMuY29udGFpbmVyO2E/YiYmKHRoaXMucmVuZGVyVG8uYXBwZW5kQ2hpbGQoYyksUmEoYiksZGVsZXRlIHRoaXMucmVuZGVyVG9DbG9uZSk6KGMmJnRoaXMucmVuZGVyVG8ucmVtb3ZlQ2hpbGQoYyksdGhpcy5yZW5kZXJUb0Nsb25lPWI9dGhpcy5yZW5kZXJUby5jbG9uZU5vZGUoMCksCkwoYix7cG9zaXRpb246ImFic29sdXRlIix0b3A6Ii05OTk5cHgiLGRpc3BsYXk6ImJsb2NrIn0pLHouYm9keS5hcHBlbmRDaGlsZChiKSxjJiZiLmFwcGVuZENoaWxkKGMpKX0sZ2V0Q29udGFpbmVyOmZ1bmN0aW9uKCl7dmFyIGEsYj10aGlzLm9wdGlvbnMuY2hhcnQsYyxkLGU7dGhpcy5yZW5kZXJUbz1hPWIucmVuZGVyVG87ZT0iaGlnaGNoYXJ0cy0iK3RiKys7aWYoZmEoYSkpdGhpcy5yZW5kZXJUbz1hPXouZ2V0RWxlbWVudEJ5SWQoYSk7YXx8cWEoMTMsITApO2M9dShBKGEsImRhdGEtaGlnaGNoYXJ0cy1jaGFydCIpKTshaXNOYU4oYykmJnphW2NdJiZ6YVtjXS5kZXN0cm95KCk7QShhLCJkYXRhLWhpZ2hjaGFydHMtY2hhcnQiLHRoaXMuaW5kZXgpO2EuaW5uZXJIVE1MPSIiO2Eub2Zmc2V0V2lkdGh8fHRoaXMuY2xvbmVSZW5kZXJUbygpO3RoaXMuZ2V0Q2hhcnRTaXplKCk7Yz10aGlzLmNoYXJ0V2lkdGg7ZD10aGlzLmNoYXJ0SGVpZ2h0O3RoaXMuY29udGFpbmVyPWE9VSh3YSwKe2NsYXNzTmFtZToiaGlnaGNoYXJ0cy1jb250YWluZXIiKyhiLmNsYXNzTmFtZT8iICIrYi5jbGFzc05hbWU6IiIpLGlkOmV9LHYoe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsb3ZlcmZsb3c6ImhpZGRlbiIsd2lkdGg6YysicHgiLGhlaWdodDpkKyJweCIsdGV4dEFsaWduOiJsZWZ0IixsaW5lSGVpZ2h0OiJub3JtYWwiLHpJbmRleDowfSxiLnN0eWxlKSx0aGlzLnJlbmRlclRvQ2xvbmV8fGEpO3RoaXMuX2N1cnNvcj1hLnN0eWxlLmN1cnNvcjt0aGlzLnJlbmRlcmVyPWIuZm9yRXhwb3J0P25ldyBBYShhLGMsZCwhMCk6bmV3IFNhKGEsYyxkKTskJiZ0aGlzLnJlbmRlcmVyLmNyZWF0ZSh0aGlzLGEsYyxkKX0sZ2V0TWFyZ2luczpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucy5jaGFydCxiPWEuc3BhY2luZ1RvcCxjPWEuc3BhY2luZ1JpZ2h0LGQ9YS5zcGFjaW5nQm90dG9tLGE9YS5zcGFjaW5nTGVmdCxlLGY9dGhpcy5sZWdlbmQsZz10aGlzLm9wdGlvbnNNYXJnaW5Ub3AsaD10aGlzLm9wdGlvbnNNYXJnaW5MZWZ0LAppPXRoaXMub3B0aW9uc01hcmdpblJpZ2h0LGo9dGhpcy5vcHRpb25zTWFyZ2luQm90dG9tLGs9dGhpcy5vcHRpb25zLnRpdGxlLG09dGhpcy5vcHRpb25zLnN1YnRpdGxlLGw9dGhpcy5vcHRpb25zLmxlZ2VuZCxwPW8obC5tYXJnaW4sMTApLHM9bC54LHQ9bC55LEI9bC5hbGlnbix3PWwudmVydGljYWxBbGlnbjt0aGlzLnJlc2V0TWFyZ2lucygpO2U9dGhpcy5heGlzT2Zmc2V0O2lmKCh0aGlzLnRpdGxlfHx0aGlzLnN1YnRpdGxlKSYmIXIodGhpcy5vcHRpb25zTWFyZ2luVG9wKSlpZihtPXEodGhpcy50aXRsZSYmIWsuZmxvYXRpbmcmJiFrLnZlcnRpY2FsQWxpZ24mJmsueXx8MCx0aGlzLnN1YnRpdGxlJiYhbS5mbG9hdGluZyYmIW0udmVydGljYWxBbGlnbiYmbS55fHwwKSl0aGlzLnBsb3RUb3A9cSh0aGlzLnBsb3RUb3AsbStvKGsubWFyZ2luLDE1KStiKTtpZihmLmRpc3BsYXkmJiFsLmZsb2F0aW5nKWlmKEI9PT0icmlnaHQiKXtpZighcihpKSl0aGlzLm1hcmdpblJpZ2h0PXEodGhpcy5tYXJnaW5SaWdodCwKZi5sZWdlbmRXaWR0aC1zK3ArYyl9ZWxzZSBpZihCPT09ImxlZnQiKXtpZighcihoKSl0aGlzLnBsb3RMZWZ0PXEodGhpcy5wbG90TGVmdCxmLmxlZ2VuZFdpZHRoK3MrcCthKX1lbHNlIGlmKHc9PT0idG9wIil7aWYoIXIoZykpdGhpcy5wbG90VG9wPXEodGhpcy5wbG90VG9wLGYubGVnZW5kSGVpZ2h0K3QrcCtiKX1lbHNlIGlmKHc9PT0iYm90dG9tIiYmIXIoaikpdGhpcy5tYXJnaW5Cb3R0b209cSh0aGlzLm1hcmdpbkJvdHRvbSxmLmxlZ2VuZEhlaWdodC10K3ArZCk7dGhpcy5leHRyYUJvdHRvbU1hcmdpbiYmKHRoaXMubWFyZ2luQm90dG9tKz10aGlzLmV4dHJhQm90dG9tTWFyZ2luKTt0aGlzLmV4dHJhVG9wTWFyZ2luJiYodGhpcy5wbG90VG9wKz10aGlzLmV4dHJhVG9wTWFyZ2luKTt0aGlzLmhhc0NhcnRlc2lhblNlcmllcyYmbih0aGlzLmF4ZXMsZnVuY3Rpb24oYSl7YS5nZXRPZmZzZXQoKX0pO3IoaCl8fCh0aGlzLnBsb3RMZWZ0Kz1lWzNdKTtyKGcpfHwodGhpcy5wbG90VG9wKz0KZVswXSk7cihqKXx8KHRoaXMubWFyZ2luQm90dG9tKz1lWzJdKTtyKGkpfHwodGhpcy5tYXJnaW5SaWdodCs9ZVsxXSk7dGhpcy5zZXRDaGFydFNpemUoKX0saW5pdFJlZmxvdzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7dmFyIGc9Yy53aWR0aHx8Z2IoZCwid2lkdGgiKSxoPWMuaGVpZ2h0fHxnYihkLCJoZWlnaHQiKSxhPWE/YS50YXJnZXQ6TztpZighYi5oYXNVc2VyU2l6ZSYmZyYmaCYmKGE9PT1PfHxhPT09eikpe2lmKGchPT1iLmNvbnRhaW5lcldpZHRofHxoIT09Yi5jb250YWluZXJIZWlnaHQpY2xlYXJUaW1lb3V0KGUpLGIucmVmbG93VGltZW91dD1lPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtpZihiLmNvbnRhaW5lciliLnNldFNpemUoZyxoLCExKSxiLmhhc1VzZXJTaXplPW51bGx9LDEwMCk7Yi5jb250YWluZXJXaWR0aD1nO2IuY29udGFpbmVySGVpZ2h0PWh9fXZhciBiPXRoaXMsYz1iLm9wdGlvbnMuY2hhcnQsZD1iLnJlbmRlclRvLGU7SihPLCJyZXNpemUiLGEpO0ooYiwKImRlc3Ryb3kiLGZ1bmN0aW9uKCl7YmEoTywicmVzaXplIixhKX0pfSxzZXRTaXplOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLGUsZixnO2QuaXNSZXNpemluZys9MTtnPWZ1bmN0aW9uKCl7ZCYmRChkLCJlbmRSZXNpemUiLG51bGwsZnVuY3Rpb24oKXtkLmlzUmVzaXppbmctPTF9KX07SGEoYyxkKTtkLm9sZENoYXJ0SGVpZ2h0PWQuY2hhcnRIZWlnaHQ7ZC5vbGRDaGFydFdpZHRoPWQuY2hhcnRXaWR0aDtpZihyKGEpKWQuY2hhcnRXaWR0aD1lPXEoMCx0KGEpKSxkLmhhc1VzZXJTaXplPSEhZTtpZihyKGIpKWQuY2hhcnRIZWlnaHQ9Zj1xKDAsdChiKSk7TChkLmNvbnRhaW5lcix7d2lkdGg6ZSsicHgiLGhlaWdodDpmKyJweCJ9KTtkLnNldENoYXJ0U2l6ZSghMCk7ZC5yZW5kZXJlci5zZXRTaXplKGUsZixjKTtkLm1heFRpY2tzPW51bGw7bihkLmF4ZXMsZnVuY3Rpb24oYSl7YS5pc0RpcnR5PSEwO2Euc2V0U2NhbGUoKX0pO24oZC5zZXJpZXMsZnVuY3Rpb24oYSl7YS5pc0RpcnR5PQohMH0pO2QuaXNEaXJ0eUxlZ2VuZD0hMDtkLmlzRGlydHlCb3g9ITA7ZC5nZXRNYXJnaW5zKCk7ZC5yZWRyYXcoYyk7ZC5vbGRDaGFydEhlaWdodD1udWxsO0QoZCwicmVzaXplIik7eGE9PT0hMT9nKCk6c2V0VGltZW91dChnLHhhJiZ4YS5kdXJhdGlvbnx8NTAwKX0sc2V0Q2hhcnRTaXplOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuaW52ZXJ0ZWQsYz10aGlzLnJlbmRlcmVyLGQ9dGhpcy5jaGFydFdpZHRoLGU9dGhpcy5jaGFydEhlaWdodCxmPXRoaXMub3B0aW9ucy5jaGFydCxnPWYuc3BhY2luZ1RvcCxoPWYuc3BhY2luZ1JpZ2h0LGk9Zi5zcGFjaW5nQm90dG9tLGo9Zi5zcGFjaW5nTGVmdCxrPXRoaXMuY2xpcE9mZnNldCxtLGwscCxvO3RoaXMucGxvdExlZnQ9bT10KHRoaXMucGxvdExlZnQpO3RoaXMucGxvdFRvcD1sPXQodGhpcy5wbG90VG9wKTt0aGlzLnBsb3RXaWR0aD1wPXEoMCx0KGQtbS10aGlzLm1hcmdpblJpZ2h0KSk7dGhpcy5wbG90SGVpZ2h0PW89cSgwLHQoZS1sLXRoaXMubWFyZ2luQm90dG9tKSk7CnRoaXMucGxvdFNpemVYPWI/bzpwO3RoaXMucGxvdFNpemVZPWI/cDpvO3RoaXMucGxvdEJvcmRlcldpZHRoPWI9Zi5wbG90Qm9yZGVyV2lkdGh8fDA7dGhpcy5zcGFjaW5nQm94PWMuc3BhY2luZ0JveD17eDpqLHk6Zyx3aWR0aDpkLWotaCxoZWlnaHQ6ZS1nLWl9O3RoaXMucGxvdEJveD1jLnBsb3RCb3g9e3g6bSx5Omwsd2lkdGg6cCxoZWlnaHQ6b307Yz1qYShxKGIsa1szXSkvMik7ZD1qYShxKGIsa1swXSkvMik7dGhpcy5jbGlwQm94PXt4OmMseTpkLHdpZHRoOlQodGhpcy5wbG90U2l6ZVgtcShiLGtbMV0pLzItYyksaGVpZ2h0OlQodGhpcy5wbG90U2l6ZVktcShiLGtbMl0pLzItZCl9O2F8fG4odGhpcy5heGVzLGZ1bmN0aW9uKGEpe2Euc2V0QXhpc1NpemUoKTthLnNldEF4aXNUcmFuc2xhdGlvbigpfSl9LHJlc2V0TWFyZ2luczpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucy5jaGFydCxiPWEuc3BhY2luZ1JpZ2h0LGM9YS5zcGFjaW5nQm90dG9tLGQ9YS5zcGFjaW5nTGVmdDsKdGhpcy5wbG90VG9wPW8odGhpcy5vcHRpb25zTWFyZ2luVG9wLGEuc3BhY2luZ1RvcCk7dGhpcy5tYXJnaW5SaWdodD1vKHRoaXMub3B0aW9uc01hcmdpblJpZ2h0LGIpO3RoaXMubWFyZ2luQm90dG9tPW8odGhpcy5vcHRpb25zTWFyZ2luQm90dG9tLGMpO3RoaXMucGxvdExlZnQ9byh0aGlzLm9wdGlvbnNNYXJnaW5MZWZ0LGQpO3RoaXMuYXhpc09mZnNldD1bMCwwLDAsMF07dGhpcy5jbGlwT2Zmc2V0PVswLDAsMCwwXX0sZHJhd0NoYXJ0Qm94OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcHRpb25zLmNoYXJ0LGI9dGhpcy5yZW5kZXJlcixjPXRoaXMuY2hhcnRXaWR0aCxkPXRoaXMuY2hhcnRIZWlnaHQsZT10aGlzLmNoYXJ0QmFja2dyb3VuZCxmPXRoaXMucGxvdEJhY2tncm91bmQsZz10aGlzLnBsb3RCb3JkZXIsaD10aGlzLnBsb3RCR0ltYWdlLGk9YS5ib3JkZXJXaWR0aHx8MCxqPWEuYmFja2dyb3VuZENvbG9yLGs9YS5wbG90QmFja2dyb3VuZENvbG9yLG09YS5wbG90QmFja2dyb3VuZEltYWdlLApsPWEucGxvdEJvcmRlcldpZHRofHwwLHAsbz10aGlzLnBsb3RMZWZ0LG49dGhpcy5wbG90VG9wLHQ9dGhpcy5wbG90V2lkdGgscT10aGlzLnBsb3RIZWlnaHQscj10aGlzLnBsb3RCb3gsdj10aGlzLmNsaXBSZWN0LHU9dGhpcy5jbGlwQm94O3A9aSsoYS5zaGFkb3c/ODowKTtpZihpfHxqKWlmKGUpZS5hbmltYXRlKGUuY3Jpc3AobnVsbCxudWxsLG51bGwsYy1wLGQtcCkpO2Vsc2V7ZT17ZmlsbDpqfHxTfTtpZihpKWUuc3Ryb2tlPWEuYm9yZGVyQ29sb3IsZVsic3Ryb2tlLXdpZHRoIl09aTt0aGlzLmNoYXJ0QmFja2dyb3VuZD1iLnJlY3QocC8yLHAvMixjLXAsZC1wLGEuYm9yZGVyUmFkaXVzLGkpLmF0dHIoZSkuYWRkKCkuc2hhZG93KGEuc2hhZG93KX1pZihrKWY/Zi5hbmltYXRlKHIpOnRoaXMucGxvdEJhY2tncm91bmQ9Yi5yZWN0KG8sbix0LHEsMCkuYXR0cih7ZmlsbDprfSkuYWRkKCkuc2hhZG93KGEucGxvdFNoYWRvdyk7aWYobSloP2guYW5pbWF0ZShyKTp0aGlzLnBsb3RCR0ltYWdlPQpiLmltYWdlKG0sbyxuLHQscSkuYWRkKCk7dj92LmFuaW1hdGUoe3dpZHRoOnUud2lkdGgsaGVpZ2h0OnUuaGVpZ2h0fSk6dGhpcy5jbGlwUmVjdD1iLmNsaXBSZWN0KHUpO2lmKGwpZz9nLmFuaW1hdGUoZy5jcmlzcChudWxsLG8sbix0LHEpKTp0aGlzLnBsb3RCb3JkZXI9Yi5yZWN0KG8sbix0LHEsMCxsKS5hdHRyKHtzdHJva2U6YS5wbG90Qm9yZGVyQ29sb3IsInN0cm9rZS13aWR0aCI6bCx6SW5kZXg6MX0pLmFkZCgpO3RoaXMuaXNEaXJ0eUJveD0hMX0scHJvcEZyb21TZXJpZXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9YS5vcHRpb25zLmNoYXJ0LGMsZD1hLm9wdGlvbnMuc2VyaWVzLGUsZjtuKFsiaW52ZXJ0ZWQiLCJhbmd1bGFyIiwicG9sYXIiXSxmdW5jdGlvbihnKXtjPWFhW2IudHlwZXx8Yi5kZWZhdWx0U2VyaWVzVHlwZV07Zj1hW2ddfHxiW2ddfHxjJiZjLnByb3RvdHlwZVtnXTtmb3IoZT1kJiZkLmxlbmd0aDshZiYmZS0tOykoYz1hYVtkW2VdLnR5cGVdKSYmYy5wcm90b3R5cGVbZ10mJgooZj0hMCk7YVtnXT1mfSl9LHJlbmRlcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1hLmF4ZXMsYz1hLnJlbmRlcmVyLGQ9YS5vcHRpb25zLGU9ZC5sYWJlbHMsZj1kLmNyZWRpdHMsZzthLnNldFRpdGxlKCk7YS5sZWdlbmQ9bmV3IHJiKGEsZC5sZWdlbmQpO24oYixmdW5jdGlvbihhKXthLnNldFNjYWxlKCl9KTthLmdldE1hcmdpbnMoKTthLm1heFRpY2tzPW51bGw7bihiLGZ1bmN0aW9uKGEpe2Euc2V0VGlja1Bvc2l0aW9ucyghMCk7YS5zZXRNYXhUaWNrcygpfSk7YS5hZGp1c3RUaWNrQW1vdW50cygpO2EuZ2V0TWFyZ2lucygpO2EuZHJhd0NoYXJ0Qm94KCk7YS5oYXNDYXJ0ZXNpYW5TZXJpZXMmJm4oYixmdW5jdGlvbihhKXthLnJlbmRlcigpfSk7aWYoIWEuc2VyaWVzR3JvdXApYS5zZXJpZXNHcm91cD1jLmcoInNlcmllcy1ncm91cCIpLmF0dHIoe3pJbmRleDozfSkuYWRkKCk7bihhLnNlcmllcyxmdW5jdGlvbihhKXthLnRyYW5zbGF0ZSgpO2Euc2V0VG9vbHRpcFBvaW50cygpOwphLnJlbmRlcigpfSk7ZS5pdGVtcyYmbihlLml0ZW1zLGZ1bmN0aW9uKGIpe3ZhciBkPXYoZS5zdHlsZSxiLnN0eWxlKSxmPXUoZC5sZWZ0KSthLnBsb3RMZWZ0LGc9dShkLnRvcCkrYS5wbG90VG9wKzEyO2RlbGV0ZSBkLmxlZnQ7ZGVsZXRlIGQudG9wO2MudGV4dChiLmh0bWwsZixnKS5hdHRyKHt6SW5kZXg6Mn0pLmNzcyhkKS5hZGQoKX0pO2lmKGYuZW5hYmxlZCYmIWEuY3JlZGl0cylnPWYuaHJlZixhLmNyZWRpdHM9Yy50ZXh0KGYudGV4dCwwLDApLm9uKCJjbGljayIsZnVuY3Rpb24oKXtpZihnKWxvY2F0aW9uLmhyZWY9Z30pLmF0dHIoe2FsaWduOmYucG9zaXRpb24uYWxpZ24sekluZGV4Ojh9KS5jc3MoZi5zdHlsZSkuYWRkKCkuYWxpZ24oZi5wb3NpdGlvbik7YS5oYXNSZW5kZXJlZD0hMH0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1hLmF4ZXMsYz1hLnNlcmllcyxkPWEuY29udGFpbmVyLGUsZj1kJiZkLnBhcmVudE5vZGU7RChhLCJkZXN0cm95Iik7emFbYS5pbmRleF09Cng7YS5yZW5kZXJUby5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtaGlnaGNoYXJ0cy1jaGFydCIpO2JhKGEpO2ZvcihlPWIubGVuZ3RoO2UtLTspYltlXT1iW2VdLmRlc3Ryb3koKTtmb3IoZT1jLmxlbmd0aDtlLS07KWNbZV09Y1tlXS5kZXN0cm95KCk7bigidGl0bGUsc3VidGl0bGUsY2hhcnRCYWNrZ3JvdW5kLHBsb3RCYWNrZ3JvdW5kLHBsb3RCR0ltYWdlLHBsb3RCb3JkZXIsc2VyaWVzR3JvdXAsY2xpcFJlY3QsY3JlZGl0cyxwb2ludGVyLHNjcm9sbGVyLHJhbmdlU2VsZWN0b3IsbGVnZW5kLHJlc2V0Wm9vbUJ1dHRvbix0b29sdGlwLHJlbmRlcmVyIi5zcGxpdCgiLCIpLGZ1bmN0aW9uKGIpe3ZhciBjPWFbYl07YyYmYy5kZXN0cm95JiYoYVtiXT1jLmRlc3Ryb3koKSl9KTtpZihkKWQuaW5uZXJIVE1MPSIiLGJhKGQpLGYmJlJhKGQpO2ZvcihlIGluIGEpZGVsZXRlIGFbZV19LGlzUmVhZHlUb1JlbmRlcjpmdW5jdGlvbigpe3ZhciBhPXRoaXM7cmV0dXJuIVomJk89PU8udG9wJiZ6LnJlYWR5U3RhdGUhPT0KImNvbXBsZXRlInx8JCYmIU8uY2Fudmc/KCQ/UWIucHVzaChmdW5jdGlvbigpe2EuZmlyc3RSZW5kZXIoKX0sYS5vcHRpb25zLmdsb2JhbC5jYW52YXNUb29sc1VSTCk6ei5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixmdW5jdGlvbigpe3ouZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsYS5maXJzdFJlbmRlcik7ei5yZWFkeVN0YXRlPT09ImNvbXBsZXRlIiYmYS5maXJzdFJlbmRlcigpfSksITEpOiEwfSxmaXJzdFJlbmRlcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1hLm9wdGlvbnMsYz1hLmNhbGxiYWNrO2lmKGEuaXNSZWFkeVRvUmVuZGVyKCkpYS5nZXRDb250YWluZXIoKSxEKGEsImluaXQiKSxhLnJlc2V0TWFyZ2lucygpLGEuc2V0Q2hhcnRTaXplKCksYS5wcm9wRnJvbVNlcmllcygpLGEuZ2V0QXhlcygpLG4oYi5zZXJpZXN8fFtdLGZ1bmN0aW9uKGIpe2EuaW5pdFNlcmllcyhiKX0pLEQoYSwiYmVmb3JlUmVuZGVyIiksYS5wb2ludGVyPW5ldyBxYihhLApiKSxhLnJlbmRlcigpLGEucmVuZGVyZXIuZHJhdygpLGMmJmMuYXBwbHkoYSxbYV0pLG4oYS5jYWxsYmFja3MsZnVuY3Rpb24oYil7Yi5hcHBseShhLFthXSl9KSxhLmNsb25lUmVuZGVyVG8oITApLEQoYSwibG9hZCIpfX07c2IucHJvdG90eXBlLmNhbGxiYWNrcz1bXTt2YXIgTWE9ZnVuY3Rpb24oKXt9O01hLnByb3RvdHlwZT17aW5pdDpmdW5jdGlvbihhLGIsYyl7dGhpcy5zZXJpZXM9YTt0aGlzLmFwcGx5T3B0aW9ucyhiLGMpO3RoaXMucG9pbnRBdHRyPXt9O2lmKGEub3B0aW9ucy5jb2xvckJ5UG9pbnQmJihiPWEub3B0aW9ucy5jb2xvcnN8fGEuY2hhcnQub3B0aW9ucy5jb2xvcnMsdGhpcy5jb2xvcj10aGlzLmNvbG9yfHxiW2EuY29sb3JDb3VudGVyKytdLGEuY29sb3JDb3VudGVyPT09Yi5sZW5ndGgpKWEuY29sb3JDb3VudGVyPTA7YS5jaGFydC5wb2ludENvdW50Kys7cmV0dXJuIHRoaXN9LGFwcGx5T3B0aW9uczpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuc2VyaWVzLGQ9CmMucG9pbnRWYWxLZXksYT1NYS5wcm90b3R5cGUub3B0aW9uc1RvT2JqZWN0LmNhbGwodGhpcyxhKTt2KHRoaXMsYSk7dGhpcy5vcHRpb25zPXRoaXMub3B0aW9ucz92KHRoaXMub3B0aW9ucyxhKTphO2lmKGQpdGhpcy55PXRoaXNbZF07aWYodGhpcy54PT09eCYmYyl0aGlzLng9Yj09PXg/Yy5hdXRvSW5jcmVtZW50KCk6YjtyZXR1cm4gdGhpc30sb3B0aW9uc1RvT2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBiLGM9dGhpcy5zZXJpZXMsZD1jLnBvaW50QXJyYXlNYXB8fFsieSJdLGU9ZC5sZW5ndGgsZj0wLGc9MDtpZih0eXBlb2YgYT09PSJudW1iZXIifHxhPT09bnVsbCliPXt5OmF9O2Vsc2UgaWYoQmEoYSkpe2I9e307aWYoYS5sZW5ndGg+ZSl7Yz10eXBlb2YgYVswXTtpZihjPT09InN0cmluZyIpYi5uYW1lPWFbMF07ZWxzZSBpZihjPT09Im51bWJlciIpYi54PWFbMF07ZisrfWZvcig7ZzxlOyliW2RbZysrXV09YVtmKytdfWVsc2UgaWYodHlwZW9mIGE9PT0ib2JqZWN0Iil7Yj1hOwppZihhLmRhdGFMYWJlbHMpYy5faGFzUG9pbnRMYWJlbHM9ITA7aWYoYS5tYXJrZXIpYy5faGFzUG9pbnRNYXJrZXJzPSEwfXJldHVybiBifSxkZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZXJpZXMuY2hhcnQsYj1hLmhvdmVyUG9pbnRzLGM7YS5wb2ludENvdW50LS07aWYoYiYmKHRoaXMuc2V0U3RhdGUoKSxnYShiLHRoaXMpLCFiLmxlbmd0aCkpYS5ob3ZlclBvaW50cz1udWxsO2lmKHRoaXM9PT1hLmhvdmVyUG9pbnQpdGhpcy5vbk1vdXNlT3V0KCk7aWYodGhpcy5ncmFwaGljfHx0aGlzLmRhdGFMYWJlbCliYSh0aGlzKSx0aGlzLmRlc3Ryb3lFbGVtZW50cygpO3RoaXMubGVnZW5kSXRlbSYmYS5sZWdlbmQuZGVzdHJveUl0ZW0odGhpcyk7Zm9yKGMgaW4gdGhpcyl0aGlzW2NdPW51bGx9LGRlc3Ryb3lFbGVtZW50czpmdW5jdGlvbigpe2Zvcih2YXIgYT0iZ3JhcGhpYyxkYXRhTGFiZWwsZGF0YUxhYmVsVXBwZXIsZ3JvdXAsY29ubmVjdG9yLHNoYWRvd0dyb3VwIi5zcGxpdCgiLCIpLApiLGM9NjtjLS07KWI9YVtjXSx0aGlzW2JdJiYodGhpc1tiXT10aGlzW2JdLmRlc3Ryb3koKSl9LGdldExhYmVsQ29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue3g6dGhpcy5jYXRlZ29yeSx5OnRoaXMueSxrZXk6dGhpcy5uYW1lfHx0aGlzLmNhdGVnb3J5LHNlcmllczp0aGlzLnNlcmllcyxwb2ludDp0aGlzLHBlcmNlbnRhZ2U6dGhpcy5wZXJjZW50YWdlLHRvdGFsOnRoaXMudG90YWx8fHRoaXMuc3RhY2tUb3RhbH19LHNlbGVjdDpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMsZD1jLnNlcmllcyxlPWQuY2hhcnQsYT1vKGEsIWMuc2VsZWN0ZWQpO2MuZmlyZVBvaW50RXZlbnQoYT8ic2VsZWN0IjoidW5zZWxlY3QiLHthY2N1bXVsYXRlOmJ9LGZ1bmN0aW9uKCl7Yy5zZWxlY3RlZD1jLm9wdGlvbnMuc2VsZWN0ZWQ9YTtkLm9wdGlvbnMuZGF0YVtsYShjLGQuZGF0YSldPWMub3B0aW9ucztjLnNldFN0YXRlKGEmJiJzZWxlY3QiKTtifHxuKGUuZ2V0U2VsZWN0ZWRQb2ludHMoKSxmdW5jdGlvbihhKXtpZihhLnNlbGVjdGVkJiYKYSE9PWMpYS5zZWxlY3RlZD1hLm9wdGlvbnMuc2VsZWN0ZWQ9ITEsZC5vcHRpb25zLmRhdGFbbGEoYSxkLmRhdGEpXT1hLm9wdGlvbnMsYS5zZXRTdGF0ZSgiIiksYS5maXJlUG9pbnRFdmVudCgidW5zZWxlY3QiKX0pfSl9LG9uTW91c2VPdmVyOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuc2VyaWVzLGM9Yi5jaGFydCxkPWMudG9vbHRpcCxlPWMuaG92ZXJQb2ludDtpZihlJiZlIT09dGhpcyllLm9uTW91c2VPdXQoKTt0aGlzLmZpcmVQb2ludEV2ZW50KCJtb3VzZU92ZXIiKTtkJiYoIWQuc2hhcmVkfHxiLm5vU2hhcmVkVG9vbHRpcCkmJmQucmVmcmVzaCh0aGlzLGEpO3RoaXMuc2V0U3RhdGUoImhvdmVyIik7Yy5ob3ZlclBvaW50PXRoaXN9LG9uTW91c2VPdXQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnNlcmllcy5jaGFydCxiPWEuaG92ZXJQb2ludHM7aWYoIWJ8fGxhKHRoaXMsYik9PT0tMSl0aGlzLmZpcmVQb2ludEV2ZW50KCJtb3VzZU91dCIpLHRoaXMuc2V0U3RhdGUoKSxhLmhvdmVyUG9pbnQ9Cm51bGx9LHRvb2x0aXBGb3JtYXR0ZXI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5zZXJpZXMsYz1iLnRvb2x0aXBPcHRpb25zLGQ9byhjLnZhbHVlRGVjaW1hbHMsIiIpLGU9Yy52YWx1ZVByZWZpeHx8IiIsZj1jLnZhbHVlU3VmZml4fHwiIjtuKGIucG9pbnRBcnJheU1hcHx8WyJ5Il0sZnVuY3Rpb24oYil7Yj0ie3BvaW50LiIrYjtpZihlfHxmKWE9YS5yZXBsYWNlKGIrIn0iLGUrYisifSIrZik7YT1hLnJlcGxhY2UoYisifSIsYisiOiwuIitkKyJmfSIpfSk7cmV0dXJuIEVhKGEse3BvaW50OnRoaXMsc2VyaWVzOnRoaXMuc2VyaWVzfSl9LHVwZGF0ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcyxlPWQuc2VyaWVzLGY9ZC5ncmFwaGljLGcsaD1lLmRhdGEsaT1lLmNoYXJ0LGI9byhiLCEwKTtkLmZpcmVQb2ludEV2ZW50KCJ1cGRhdGUiLHtvcHRpb25zOmF9LGZ1bmN0aW9uKCl7ZC5hcHBseU9wdGlvbnMoYSk7VihhKSYmKGUuZ2V0QXR0cmlicygpLGYmJmYuYXR0cihkLnBvaW50QXR0cltlLnN0YXRlXSkpOwpnPWxhKGQsaCk7ZS54RGF0YVtnXT1kLng7ZS55RGF0YVtnXT1lLnRvWURhdGE/ZS50b1lEYXRhKGQpOmQueTtlLnpEYXRhW2ddPWQuejtlLm9wdGlvbnMuZGF0YVtnXT1kLm9wdGlvbnM7ZS5pc0RpcnR5PSEwO2UuaXNEaXJ0eURhdGE9ITA7YiYmaS5yZWRyYXcoYyl9KX0scmVtb3ZlOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcyxkPWMuc2VyaWVzLGU9ZC5jaGFydCxmLGc9ZC5kYXRhO0hhKGIsZSk7YT1vKGEsITApO2MuZmlyZVBvaW50RXZlbnQoInJlbW92ZSIsbnVsbCxmdW5jdGlvbigpe2Y9bGEoYyxnKTtnLnNwbGljZShmLDEpO2Qub3B0aW9ucy5kYXRhLnNwbGljZShmLDEpO2QueERhdGEuc3BsaWNlKGYsMSk7ZC55RGF0YS5zcGxpY2UoZiwxKTtkLnpEYXRhLnNwbGljZShmLDEpO2MuZGVzdHJveSgpO2QuaXNEaXJ0eT0hMDtkLmlzRGlydHlEYXRhPSEwO2EmJmUucmVkcmF3KCl9KX0sZmlyZVBvaW50RXZlbnQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMsZT10aGlzLnNlcmllcy5vcHRpb25zOwooZS5wb2ludC5ldmVudHNbYV18fGQub3B0aW9ucyYmZC5vcHRpb25zLmV2ZW50cyYmZC5vcHRpb25zLmV2ZW50c1thXSkmJnRoaXMuaW1wb3J0RXZlbnRzKCk7YT09PSJjbGljayImJmUuYWxsb3dQb2ludFNlbGVjdCYmKGM9ZnVuY3Rpb24oYSl7ZC5zZWxlY3QobnVsbCxhLmN0cmxLZXl8fGEubWV0YUtleXx8YS5zaGlmdEtleSl9KTtEKHRoaXMsYSxiLGMpfSxpbXBvcnRFdmVudHM6ZnVuY3Rpb24oKXtpZighdGhpcy5oYXNJbXBvcnRlZEV2ZW50cyl7dmFyIGE9eSh0aGlzLnNlcmllcy5vcHRpb25zLnBvaW50LHRoaXMub3B0aW9ucykuZXZlbnRzLGI7dGhpcy5ldmVudHM9YTtmb3IoYiBpbiBhKUoodGhpcyxiLGFbYl0pO3RoaXMuaGFzSW1wb3J0ZWRFdmVudHM9ITB9fSxzZXRTdGF0ZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsb3RYLGM9dGhpcy5wbG90WSxkPXRoaXMuc2VyaWVzLGU9ZC5vcHRpb25zLnN0YXRlcyxmPVhbZC50eXBlXS5tYXJrZXImJmQub3B0aW9ucy5tYXJrZXIsCmc9ZiYmIWYuZW5hYmxlZCxoPWYmJmYuc3RhdGVzW2FdLGk9aCYmaC5lbmFibGVkPT09ITEsaj1kLnN0YXRlTWFya2VyR3JhcGhpYyxrPXRoaXMubWFya2VyfHx7fSxtPWQuY2hhcnQsbD10aGlzLnBvaW50QXR0cixhPWF8fCIiO2lmKCEoYT09PXRoaXMuc3RhdGV8fHRoaXMuc2VsZWN0ZWQmJmEhPT0ic2VsZWN0Inx8ZVthXSYmZVthXS5lbmFibGVkPT09ITF8fGEmJihpfHxnJiYhaC5lbmFibGVkKSkpe2lmKHRoaXMuZ3JhcGhpYyllPWYmJnRoaXMuZ3JhcGhpYy5zeW1ib2xOYW1lJiZsW2FdLnIsdGhpcy5ncmFwaGljLmF0dHIoeShsW2FdLGU/e3g6Yi1lLHk6Yy1lLHdpZHRoOjIqZSxoZWlnaHQ6MiplfTp7fSkpO2Vsc2V7aWYoYSYmaCllPWgucmFkaXVzLGs9ay5zeW1ib2x8fGQuc3ltYm9sLGomJmouY3VycmVudFN5bWJvbCE9PWsmJihqPWouZGVzdHJveSgpKSxqP2ouYXR0cih7eDpiLWUseTpjLWV9KTooZC5zdGF0ZU1hcmtlckdyYXBoaWM9aj1tLnJlbmRlcmVyLnN5bWJvbChrLApiLWUsYy1lLDIqZSwyKmUpLmF0dHIobFthXSkuYWRkKGQubWFya2VyR3JvdXApLGouY3VycmVudFN5bWJvbD1rKTtpZihqKWpbYSYmbS5pc0luc2lkZVBsb3QoYixjKT8ic2hvdyI6ImhpZGUiXSgpfXRoaXMuc3RhdGU9YX19fTt2YXIgUj1mdW5jdGlvbigpe307Ui5wcm90b3R5cGU9e2lzQ2FydGVzaWFuOiEwLHR5cGU6ImxpbmUiLHBvaW50Q2xhc3M6TWEsc29ydGVkOiEwLHJlcXVpcmVTb3J0aW5nOiEwLHBvaW50QXR0clRvT3B0aW9uczp7c3Ryb2tlOiJsaW5lQ29sb3IiLCJzdHJva2Utd2lkdGgiOiJsaW5lV2lkdGgiLGZpbGw6ImZpbGxDb2xvciIscjoicmFkaXVzIn0sY29sb3JDb3VudGVyOjAsaW5pdDpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZT1hLnNlcmllczt0aGlzLmNoYXJ0PWE7dGhpcy5vcHRpb25zPWI9dGhpcy5zZXRPcHRpb25zKGIpO3RoaXMuYmluZEF4ZXMoKTt2KHRoaXMse25hbWU6Yi5uYW1lLHN0YXRlOiIiLHBvaW50QXR0cjp7fSx2aXNpYmxlOmIudmlzaWJsZSE9PQohMSxzZWxlY3RlZDpiLnNlbGVjdGVkPT09ITB9KTtpZigkKWIuYW5pbWF0aW9uPSExO2Q9Yi5ldmVudHM7Zm9yKGMgaW4gZClKKHRoaXMsYyxkW2NdKTtpZihkJiZkLmNsaWNrfHxiLnBvaW50JiZiLnBvaW50LmV2ZW50cyYmYi5wb2ludC5ldmVudHMuY2xpY2t8fGIuYWxsb3dQb2ludFNlbGVjdClhLnJ1blRyYWNrZXJDbGljaz0hMDt0aGlzLmdldENvbG9yKCk7dGhpcy5nZXRTeW1ib2woKTt0aGlzLnNldERhdGEoYi5kYXRhLCExKTtpZih0aGlzLmlzQ2FydGVzaWFuKWEuaGFzQ2FydGVzaWFuU2VyaWVzPSEwO2UucHVzaCh0aGlzKTt0aGlzLl9pPWUubGVuZ3RoLTE7R2IoZSxmdW5jdGlvbihhLGIpe3JldHVybiBvKGEub3B0aW9ucy5pbmRleCxhLl9pKS1vKGIub3B0aW9ucy5pbmRleCxhLl9pKX0pO24oZSxmdW5jdGlvbihhLGIpe2EuaW5kZXg9YjthLm5hbWU9YS5uYW1lfHwiU2VyaWVzICIrKGIrMSl9KTtjPWIubGlua2VkVG87dGhpcy5saW5rZWRTZXJpZXM9W107aWYoZmEoYykmJgooYz1jPT09IjpwcmV2aW91cyI/ZVt0aGlzLmluZGV4LTFdOmEuZ2V0KGMpKSljLmxpbmtlZFNlcmllcy5wdXNoKHRoaXMpLHRoaXMubGlua2VkUGFyZW50PWN9LGJpbmRBeGVzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiPWEub3B0aW9ucyxjPWEuY2hhcnQsZDthLmlzQ2FydGVzaWFuJiZuKFsieEF4aXMiLCJ5QXhpcyJdLGZ1bmN0aW9uKGUpe24oY1tlXSxmdW5jdGlvbihjKXtkPWMub3B0aW9ucztpZihiW2VdPT09ZC5pbmRleHx8YltlXSE9PXgmJmJbZV09PT1kLmlkfHxiW2VdPT09eCYmZC5pbmRleD09PTApYy5zZXJpZXMucHVzaChhKSxhW2VdPWMsYy5pc0RpcnR5PSEwfSk7YVtlXXx8cWEoMTcsITApfSl9LGF1dG9JbmNyZW1lbnQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnMsYj10aGlzLnhJbmNyZW1lbnQsYj1vKGIsYS5wb2ludFN0YXJ0LDApO3RoaXMucG9pbnRJbnRlcnZhbD1vKHRoaXMucG9pbnRJbnRlcnZhbCxhLnBvaW50SW50ZXJ2YWwsMSk7dGhpcy54SW5jcmVtZW50PQpiK3RoaXMucG9pbnRJbnRlcnZhbDtyZXR1cm4gYn0sZ2V0U2VnbWVudHM6ZnVuY3Rpb24oKXt2YXIgYT0tMSxiPVtdLGMsZD10aGlzLnBvaW50cyxlPWQubGVuZ3RoO2lmKGUpaWYodGhpcy5vcHRpb25zLmNvbm5lY3ROdWxscyl7Zm9yKGM9ZTtjLS07KWRbY10ueT09PW51bGwmJmQuc3BsaWNlKGMsMSk7ZC5sZW5ndGgmJihiPVtkXSl9ZWxzZSBuKGQsZnVuY3Rpb24oYyxnKXtjLnk9PT1udWxsPyhnPmErMSYmYi5wdXNoKGQuc2xpY2UoYSsxLGcpKSxhPWcpOmc9PT1lLTEmJmIucHVzaChkLnNsaWNlKGErMSxnKzEpKX0pO3RoaXMuc2VnbWVudHM9Yn0sc2V0T3B0aW9uczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNoYXJ0Lm9wdGlvbnMsYz1iLnBsb3RPcHRpb25zLGQ9Y1t0aGlzLnR5cGVdO3RoaXMudXNlck9wdGlvbnM9YTthPXkoZCxjLnNlcmllcyxhKTt0aGlzLnRvb2x0aXBPcHRpb25zPXkoYi50b29sdGlwLGEudG9vbHRpcCk7ZC5tYXJrZXI9PT1udWxsJiZkZWxldGUgYS5tYXJrZXI7CnJldHVybiBhfSxnZXRDb2xvcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucyxiPXRoaXMudXNlck9wdGlvbnMsYz10aGlzLmNoYXJ0Lm9wdGlvbnMuY29sb3JzLGQ9dGhpcy5jaGFydC5jb3VudGVycyxlO2U9YS5jb2xvcnx8WFt0aGlzLnR5cGVdLmNvbG9yO2lmKCFlJiYhYS5jb2xvckJ5UG9pbnQpcihiLl9jb2xvckluZGV4KT9hPWIuX2NvbG9ySW5kZXg6KGIuX2NvbG9ySW5kZXg9ZC5jb2xvcixhPWQuY29sb3IrKyksZT1jW2FdO3RoaXMuY29sb3I9ZTtkLndyYXBDb2xvcihjLmxlbmd0aCl9LGdldFN5bWJvbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMudXNlck9wdGlvbnMsYj10aGlzLm9wdGlvbnMubWFya2VyLGM9dGhpcy5jaGFydCxkPWMub3B0aW9ucy5zeW1ib2xzLGM9Yy5jb3VudGVyczt0aGlzLnN5bWJvbD1iLnN5bWJvbDtpZighdGhpcy5zeW1ib2wpcihhLl9zeW1ib2xJbmRleCk/YT1hLl9zeW1ib2xJbmRleDooYS5fc3ltYm9sSW5kZXg9Yy5zeW1ib2wsYT1jLnN5bWJvbCsrKSwKdGhpcy5zeW1ib2w9ZFthXTtpZigvXnVybC8udGVzdCh0aGlzLnN5bWJvbCkpYi5yYWRpdXM9MDtjLndyYXBTeW1ib2woZC5sZW5ndGgpfSxkcmF3TGVnZW5kU3ltYm9sOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucyxjPWIubWFya2VyLGQ9YS5vcHRpb25zLnN5bWJvbFdpZHRoLGU9dGhpcy5jaGFydC5yZW5kZXJlcixmPXRoaXMubGVnZW5kR3JvdXAsYT1hLmJhc2VsaW5lLGc7aWYoYi5saW5lV2lkdGgpe2c9eyJzdHJva2Utd2lkdGgiOmIubGluZVdpZHRofTtpZihiLmRhc2hTdHlsZSlnLmRhc2hzdHlsZT1iLmRhc2hTdHlsZTt0aGlzLmxlZ2VuZExpbmU9ZS5wYXRoKFsiTSIsMCxhLTQsIkwiLGQsYS00XSkuYXR0cihnKS5hZGQoZil9aWYoYyYmYy5lbmFibGVkKWI9Yy5yYWRpdXMsdGhpcy5sZWdlbmRTeW1ib2w9ZS5zeW1ib2wodGhpcy5zeW1ib2wsZC8yLWIsYS00LWIsMipiLDIqYikuYWRkKGYpfSxhZGRQb2ludDpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT10aGlzLm9wdGlvbnMsCmY9dGhpcy5kYXRhLGc9dGhpcy5ncmFwaCxoPXRoaXMuYXJlYSxpPXRoaXMuY2hhcnQsaj10aGlzLnhEYXRhLGs9dGhpcy55RGF0YSxtPXRoaXMuekRhdGEsbD10aGlzLm5hbWVzLHA9ZyYmZy5zaGlmdHx8MCxuPWUuZGF0YTtIYShkLGkpO2lmKGcmJmMpZy5zaGlmdD1wKzE7aWYoaCl7aWYoYyloLnNoaWZ0PXArMTtoLmlzQXJlYT0hMH1iPW8oYiwhMCk7ZD17c2VyaWVzOnRoaXN9O3RoaXMucG9pbnRDbGFzcy5wcm90b3R5cGUuYXBwbHlPcHRpb25zLmFwcGx5KGQsW2FdKTtqLnB1c2goZC54KTtrLnB1c2godGhpcy50b1lEYXRhP3RoaXMudG9ZRGF0YShkKTpkLnkpO20ucHVzaChkLnopO2lmKGwpbFtkLnhdPWQubmFtZTtuLnB1c2goYSk7ZS5sZWdlbmRUeXBlPT09InBvaW50IiYmdGhpcy5nZW5lcmF0ZVBvaW50cygpO2MmJihmWzBdJiZmWzBdLnJlbW92ZT9mWzBdLnJlbW92ZSghMSk6KGYuc2hpZnQoKSxqLnNoaWZ0KCksay5zaGlmdCgpLG0uc2hpZnQoKSxuLnNoaWZ0KCkpKTt0aGlzLmdldEF0dHJpYnMoKTsKdGhpcy5pc0RpcnR5RGF0YT10aGlzLmlzRGlydHk9ITA7YiYmaS5yZWRyYXcoKX0sc2V0RGF0YTpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMucG9pbnRzLGQ9dGhpcy5vcHRpb25zLGU9dGhpcy5jaGFydCxmPW51bGwsZz10aGlzLnhBeGlzLGg9ZyYmZy5jYXRlZ29yaWVzJiYhZy5jYXRlZ29yaWVzLmxlbmd0aD9bXTpudWxsLGk7dGhpcy54SW5jcmVtZW50PW51bGw7dGhpcy5wb2ludFJhbmdlPWcmJmcuY2F0ZWdvcmllcz8xOmQucG9pbnRSYW5nZTt0aGlzLmNvbG9yQ291bnRlcj0wO3ZhciBqPVtdLGs9W10sbT1bXSxsPWE/YS5sZW5ndGg6W10scD0oaT10aGlzLnBvaW50QXJyYXlNYXApJiZpLmxlbmd0aCxuPSEhdGhpcy50b1lEYXRhO2lmKGw+KGQudHVyYm9UaHJlc2hvbGR8fDFFMykpe2ZvcihpPTA7Zj09PW51bGwmJmk8bDspZj1hW2ldLGkrKztpZihDYShmKSl7Zj1vKGQucG9pbnRTdGFydCwwKTtkPW8oZC5wb2ludEludGVydmFsLDEpO2ZvcihpPTA7aTxsO2krKylqW2ldPWYsCmtbaV09YVtpXSxmKz1kO3RoaXMueEluY3JlbWVudD1mfWVsc2UgaWYoQmEoZikpaWYocClmb3IoaT0wO2k8bDtpKyspZD1hW2ldLGpbaV09ZFswXSxrW2ldPWQuc2xpY2UoMSxwKzEpO2Vsc2UgZm9yKGk9MDtpPGw7aSsrKWQ9YVtpXSxqW2ldPWRbMF0sa1tpXT1kWzFdfWVsc2UgZm9yKGk9MDtpPGw7aSsrKWlmKGFbaV0hPT14JiYoZD17c2VyaWVzOnRoaXN9LHRoaXMucG9pbnRDbGFzcy5wcm90b3R5cGUuYXBwbHlPcHRpb25zLmFwcGx5KGQsW2FbaV1dKSxqW2ldPWQueCxrW2ldPW4/dGhpcy50b1lEYXRhKGQpOmQueSxtW2ldPWQueixoJiZkLm5hbWUpKWhbaV09ZC5uYW1lO3RoaXMucmVxdWlyZVNvcnRpbmcmJmoubGVuZ3RoPjEmJmpbMV08alswXSYmcWEoMTUpO2ZhKGtbMF0pJiZxYSgxNCwhMCk7dGhpcy5kYXRhPVtdO3RoaXMub3B0aW9ucy5kYXRhPWE7dGhpcy54RGF0YT1qO3RoaXMueURhdGE9azt0aGlzLnpEYXRhPW07dGhpcy5uYW1lcz1oO2ZvcihpPWMmJmMubGVuZ3RofHwKMDtpLS07KWNbaV0mJmNbaV0uZGVzdHJveSYmY1tpXS5kZXN0cm95KCk7aWYoZylnLm1pblJhbmdlPWcudXNlck1pblJhbmdlO3RoaXMuaXNEaXJ0eT10aGlzLmlzRGlydHlEYXRhPWUuaXNEaXJ0eUJveD0hMDtvKGIsITApJiZlLnJlZHJhdyghMSl9LHJlbW92ZTpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMsZD1jLmNoYXJ0LGE9byhhLCEwKTtpZighYy5pc1JlbW92aW5nKWMuaXNSZW1vdmluZz0hMCxEKGMsInJlbW92ZSIsbnVsbCxmdW5jdGlvbigpe2MuZGVzdHJveSgpO2QuaXNEaXJ0eUxlZ2VuZD1kLmlzRGlydHlCb3g9ITA7YSYmZC5yZWRyYXcoYil9KTtjLmlzUmVtb3Zpbmc9ITF9LHByb2Nlc3NEYXRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueERhdGEsYz10aGlzLnlEYXRhLGQ9Yi5sZW5ndGgsZT0wLGY9ZCxnLGgsaT10aGlzLnhBeGlzLGo9dGhpcy5vcHRpb25zLGs9ai5jcm9wVGhyZXNob2xkLG09dGhpcy5pc0NhcnRlc2lhbjtpZihtJiYhdGhpcy5pc0RpcnR5JiYhaS5pc0RpcnR5JiYKIXRoaXMueUF4aXMuaXNEaXJ0eSYmIWEpcmV0dXJuITE7aWYobSYmdGhpcy5zb3J0ZWQmJigha3x8ZD5rfHx0aGlzLmZvcmNlQ3JvcCkpaWYoYT1pLmdldEV4dHJlbWVzKCksaT1hLm1pbixrPWEubWF4LGJbZC0xXTxpfHxiWzBdPmspYj1bXSxjPVtdO2Vsc2UgaWYoYlswXTxpfHxiW2QtMV0+ayl7Zm9yKGE9MDthPGQ7YSsrKWlmKGJbYV0+PWkpe2U9cSgwLGEtMSk7YnJlYWt9Zm9yKDthPGQ7YSsrKWlmKGJbYV0+ayl7Zj1hKzE7YnJlYWt9Yj1iLnNsaWNlKGUsZik7Yz1jLnNsaWNlKGUsZik7Zz0hMH1mb3IoYT1iLmxlbmd0aC0xO2E+MDthLS0paWYoZD1iW2FdLWJbYS0xXSxkPjAmJihoPT09eHx8ZDxoKSloPWQ7dGhpcy5jcm9wcGVkPWc7dGhpcy5jcm9wU3RhcnQ9ZTt0aGlzLnByb2Nlc3NlZFhEYXRhPWI7dGhpcy5wcm9jZXNzZWRZRGF0YT1jO2lmKGoucG9pbnRSYW5nZT09PW51bGwpdGhpcy5wb2ludFJhbmdlPWh8fDE7dGhpcy5jbG9zZXN0UG9pbnRSYW5nZT1ofSxnZW5lcmF0ZVBvaW50czpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLm9wdGlvbnMuZGF0YSxiPXRoaXMuZGF0YSxjLGQ9dGhpcy5wcm9jZXNzZWRYRGF0YSxlPXRoaXMucHJvY2Vzc2VkWURhdGEsZj10aGlzLnBvaW50Q2xhc3MsZz1kLmxlbmd0aCxoPXRoaXMuY3JvcFN0YXJ0fHwwLGksaj10aGlzLmhhc0dyb3VwZWREYXRhLGssbT1bXSxsO2lmKCFiJiYhailiPVtdLGIubGVuZ3RoPWEubGVuZ3RoLGI9dGhpcy5kYXRhPWI7Zm9yKGw9MDtsPGc7bCsrKWk9aCtsLGo/bVtsXT0obmV3IGYpLmluaXQodGhpcyxbZFtsXV0uY29uY2F0KGhhKGVbbF0pKSk6KGJbaV0/az1iW2ldOmFbaV0hPT14JiYoYltpXT1rPShuZXcgZikuaW5pdCh0aGlzLGFbaV0sZFtsXSkpLG1bbF09ayk7aWYoYiYmKGchPT0oYz1iLmxlbmd0aCl8fGopKWZvcihsPTA7bDxjO2wrKylpZihsPT09aCYmIWomJihsKz1nKSxiW2xdKWJbbF0uZGVzdHJveUVsZW1lbnRzKCksYltsXS5wbG90WD14O3RoaXMuZGF0YT1iO3RoaXMucG9pbnRzPW19LHRyYW5zbGF0ZTpmdW5jdGlvbigpe3RoaXMucHJvY2Vzc2VkWERhdGF8fAp0aGlzLnByb2Nlc3NEYXRhKCk7dGhpcy5nZW5lcmF0ZVBvaW50cygpO2Zvcih2YXIgYT10aGlzLm9wdGlvbnMsYj1hLnN0YWNraW5nLGM9dGhpcy54QXhpcyxkPWMuY2F0ZWdvcmllcyxlPXRoaXMueUF4aXMsZj10aGlzLnBvaW50cyxnPWYubGVuZ3RoLGg9ISF0aGlzLm1vZGlmeVZhbHVlLGksaj1lLnNlcmllcyxrPWoubGVuZ3RoLG09YS5wb2ludFBsYWNlbWVudD09PSJiZXR3ZWVuIixhPWEudGhyZXNob2xkO2stLTspaWYoaltrXS52aXNpYmxlKXtqW2tdPT09dGhpcyYmKGk9ITApO2JyZWFrfWZvcihrPTA7azxnO2srKyl7dmFyIGo9ZltrXSxsPWoueCxwPWoueSxuPWoubG93LHE9ZS5zdGFja3NbKHA8YT8iLSI6IiIpK3RoaXMuc3RhY2tLZXldO2lmKGUuaXNMb2cmJnA8PTApai55PXA9bnVsbDtqLnBsb3RYPWMudHJhbnNsYXRlKGwsMCwwLDAsMSxtKTtpZihiJiZ0aGlzLnZpc2libGUmJnEmJnFbbF0pbj1xW2xdLHE9bi50b3RhbCxuLmN1bT1uPW4uY3VtLXAscD1uK3AsaSYmKG49Cm8oYSxlLm1pbikpLGUuaXNMb2cmJm48PTAmJihuPW51bGwpLGI9PT0icGVyY2VudCImJihuPXE/bioxMDAvcTowLHA9cT9wKjEwMC9xOjApLGoucGVyY2VudGFnZT1xP2oueSoxMDAvcTowLGoudG90YWw9ai5zdGFja1RvdGFsPXEsai5zdGFja1k9cDtqLnlCb3R0b209cihuKT9lLnRyYW5zbGF0ZShuLDAsMSwwLDEpOm51bGw7aCYmKHA9dGhpcy5tb2RpZnlWYWx1ZShwLGopKTtqLnBsb3RZPXR5cGVvZiBwPT09Im51bWJlciImJnAhPT1JbmZpbml0eT90KGUudHJhbnNsYXRlKHAsMCwxLDAsMSkqMTApLzEwOng7ai5jbGllbnRYPW0/Yy50cmFuc2xhdGUobCwwLDAsMCwxKTpqLnBsb3RYO2oubmVnYXRpdmU9ai55PChhfHwwKTtqLmNhdGVnb3J5PWQmJmRbai54XSE9PXg/ZFtqLnhdOmoueH10aGlzLmdldFNlZ21lbnRzKCl9LHNldFRvb2x0aXBQb2ludHM6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYyxkLGU9KGM9dGhpcy54QXhpcyk/Yy50b29sdGlwTGVufHxjLmxlbjp0aGlzLmNoYXJ0LnBsb3RTaXplWCwKZixnLGg9W107aWYodGhpcy5vcHRpb25zLmVuYWJsZU1vdXNlVHJhY2tpbmchPT0hMSl7aWYoYSl0aGlzLnRvb2x0aXBQb2ludHM9bnVsbDtuKHRoaXMuc2VnbWVudHN8fHRoaXMucG9pbnRzLGZ1bmN0aW9uKGEpe2I9Yi5jb25jYXQoYSl9KTtjJiZjLnJldmVyc2VkJiYoYj1iLnJldmVyc2UoKSk7YT1iLmxlbmd0aDtmb3IoZz0wO2c8YTtnKyspe2Y9YltnXTtjPWJbZy0xXT9kKzE6MDtmb3IoZD1iW2crMV0/cSgwLFQoKGYuY2xpZW50WCsoYltnKzFdP2JbZysxXS5jbGllbnRYOmUpKS8yKSk6ZTtjPj0wJiZjPD1kOyloW2MrK109Zn10aGlzLnRvb2x0aXBQb2ludHM9aH19LHRvb2x0aXBIZWFkZXJGb3JtYXR0ZXI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy50b29sdGlwT3B0aW9ucyxjPWIueERhdGVGb3JtYXQsZD10aGlzLnhBeGlzLGU9ZCYmZC5vcHRpb25zLnR5cGU9PT0iZGF0ZXRpbWUiLGY9Yi5oZWFkZXJGb3JtYXQsZztpZihlJiYhYylmb3IoZyBpbiBFKWlmKEVbZ10+PWQuY2xvc2VzdFBvaW50UmFuZ2Upe2M9CmIuZGF0ZVRpbWVMYWJlbEZvcm1hdHNbZ107YnJlYWt9ZSYmYyYmQ2EoYS5rZXkpJiYoZj1mLnJlcGxhY2UoIntwb2ludC5rZXl9Iiwie3BvaW50LmtleToiK2MrIn0iKSk7cmV0dXJuIEVhKGYse3BvaW50OmEsc2VyaWVzOnRoaXN9KX0sb25Nb3VzZU92ZXI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNoYXJ0LGI9YS5ob3ZlclNlcmllcztpZihiJiZiIT09dGhpcyliLm9uTW91c2VPdXQoKTt0aGlzLm9wdGlvbnMuZXZlbnRzLm1vdXNlT3ZlciYmRCh0aGlzLCJtb3VzZU92ZXIiKTt0aGlzLnNldFN0YXRlKCJob3ZlciIpO2EuaG92ZXJTZXJpZXM9dGhpc30sb25Nb3VzZU91dDpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucyxiPXRoaXMuY2hhcnQsYz1iLnRvb2x0aXAsZD1iLmhvdmVyUG9pbnQ7aWYoZClkLm9uTW91c2VPdXQoKTt0aGlzJiZhLmV2ZW50cy5tb3VzZU91dCYmRCh0aGlzLCJtb3VzZU91dCIpO2MmJiFhLnN0aWNreVRyYWNraW5nJiYoIWMuc2hhcmVkfHx0aGlzLm5vU2hhcmVkVG9vbHRpcCkmJgpjLmhpZGUoKTt0aGlzLnNldFN0YXRlKCk7Yi5ob3ZlclNlcmllcz1udWxsfSxhbmltYXRlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYz1iLmNoYXJ0LGQ9Yy5yZW5kZXJlcixlO2U9Yi5vcHRpb25zLmFuaW1hdGlvbjt2YXIgZj1jLmNsaXBCb3gsZz1jLmludmVydGVkLGg7aWYoZSYmIVYoZSkpZT1YW2IudHlwZV0uYW5pbWF0aW9uO2g9Il9zaGFyZWRDbGlwIitlLmR1cmF0aW9uK2UuZWFzaW5nO2lmKGEpYT1jW2hdLGU9Y1toKyJtIl0sYXx8KGNbaF09YT1kLmNsaXBSZWN0KHYoZix7d2lkdGg6MH0pKSxjW2grIm0iXT1lPWQuY2xpcFJlY3QoLTk5LGc/LWMucGxvdExlZnQ6LWMucGxvdFRvcCw5OSxnP2MuY2hhcnRXaWR0aDpjLmNoYXJ0SGVpZ2h0KSksYi5ncm91cC5jbGlwKGEpLGIubWFya2VyR3JvdXAuY2xpcChlKSxiLnNoYXJlZENsaXBLZXk9aDtlbHNle2lmKGE9Y1toXSlhLmFuaW1hdGUoe3dpZHRoOmMucGxvdFNpemVYfSxlKSxjW2grIm0iXS5hbmltYXRlKHt3aWR0aDpjLnBsb3RTaXplWCsKOTl9LGUpO2IuYW5pbWF0ZT1udWxsO2IuYW5pbWF0aW9uVGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yi5hZnRlckFuaW1hdGUoKX0sZS5kdXJhdGlvbil9fSxhZnRlckFuaW1hdGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNoYXJ0LGI9dGhpcy5zaGFyZWRDbGlwS2V5LGM9dGhpcy5ncm91cDtjJiZ0aGlzLm9wdGlvbnMuY2xpcCE9PSExJiYoYy5jbGlwKGEuY2xpcFJlY3QpLHRoaXMubWFya2VyR3JvdXAuY2xpcCgpKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YiYmYVtiXSYmKGFbYl09YVtiXS5kZXN0cm95KCksYVtiKyJtIl09YVtiKyJtIl0uZGVzdHJveSgpKX0sMTAwKX0sZHJhd1BvaW50czpmdW5jdGlvbigpe3ZhciBhLGI9dGhpcy5wb2ludHMsYz10aGlzLmNoYXJ0LGQsZSxmLGcsaCxpLGosayxtPXRoaXMub3B0aW9ucy5tYXJrZXIsbCxuPXRoaXMubWFya2VyR3JvdXA7aWYobS5lbmFibGVkfHx0aGlzLl9oYXNQb2ludE1hcmtlcnMpZm9yKGY9Yi5sZW5ndGg7Zi0tOylpZihnPQpiW2ZdLGQ9Zy5wbG90WCxlPWcucGxvdFksaz1nLmdyYXBoaWMsaT1nLm1hcmtlcnx8e30sYT1tLmVuYWJsZWQmJmkuZW5hYmxlZD09PXh8fGkuZW5hYmxlZCxsPWMuaXNJbnNpZGVQbG90KGQsZSxjLmludmVydGVkKSxhJiZlIT09eCYmIWlzTmFOKGUpJiZnLnkhPT1udWxsKWlmKGE9Zy5wb2ludEF0dHJbZy5zZWxlY3RlZD8ic2VsZWN0IjoiIl0saD1hLnIsaT1vKGkuc3ltYm9sLHRoaXMuc3ltYm9sKSxqPWkuaW5kZXhPZigidXJsIik9PT0wLGspay5hdHRyKHt2aXNpYmlsaXR5Omw/Wj8iaW5oZXJpdCI6InZpc2libGUiOiJoaWRkZW4ifSkuYW5pbWF0ZSh2KHt4OmQtaCx5OmUtaH0say5zeW1ib2xOYW1lP3t3aWR0aDoyKmgsaGVpZ2h0OjIqaH06e30pKTtlbHNle2lmKGwmJihoPjB8fGopKWcuZ3JhcGhpYz1jLnJlbmRlcmVyLnN5bWJvbChpLGQtaCxlLWgsMipoLDIqaCkuYXR0cihhKS5hZGQobil9ZWxzZSBpZihrKWcuZ3JhcGhpYz1rLmRlc3Ryb3koKX0sY29udmVydEF0dHJpYnM6ZnVuY3Rpb24oYSwKYixjLGQpe3ZhciBlPXRoaXMucG9pbnRBdHRyVG9PcHRpb25zLGYsZyxoPXt9LGE9YXx8e30sYj1ifHx7fSxjPWN8fHt9LGQ9ZHx8e307Zm9yKGYgaW4gZSlnPWVbZl0saFtmXT1vKGFbZ10sYltmXSxjW2ZdLGRbZl0pO3JldHVybiBofSxnZXRBdHRyaWJzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiPWEub3B0aW9ucyxjPVhbYS50eXBlXS5tYXJrZXI/Yi5tYXJrZXI6YixkPWMuc3RhdGVzLGU9ZC5ob3ZlcixmLGc9YS5jb2xvcixoPXtzdHJva2U6ZyxmaWxsOmd9LGk9YS5wb2ludHN8fFtdLGo9W10sayxtPWEucG9pbnRBdHRyVG9PcHRpb25zLGw9Yi5uZWdhdGl2ZUNvbG9yLHA7Yi5tYXJrZXI/KGUucmFkaXVzPWUucmFkaXVzfHxjLnJhZGl1cysyLGUubGluZVdpZHRoPWUubGluZVdpZHRofHxjLmxpbmVXaWR0aCsxKTplLmNvbG9yPWUuY29sb3J8fG1hKGUuY29sb3J8fGcpLmJyaWdodGVuKGUuYnJpZ2h0bmVzcykuZ2V0KCk7alsiIl09YS5jb252ZXJ0QXR0cmlicyhjLGgpO24oWyJob3ZlciIsCiJzZWxlY3QiXSxmdW5jdGlvbihiKXtqW2JdPWEuY29udmVydEF0dHJpYnMoZFtiXSxqWyIiXSl9KTthLnBvaW50QXR0cj1qO2ZvcihnPWkubGVuZ3RoO2ctLTspe2g9aVtnXTtpZigoYz1oLm9wdGlvbnMmJmgub3B0aW9ucy5tYXJrZXJ8fGgub3B0aW9ucykmJmMuZW5hYmxlZD09PSExKWMucmFkaXVzPTA7aWYoaC5uZWdhdGl2ZSYmbCloLmNvbG9yPWguZmlsbENvbG9yPWw7Zj1iLmNvbG9yQnlQb2ludHx8aC5jb2xvcjtpZihoLm9wdGlvbnMpZm9yKHAgaW4gbSlyKGNbbVtwXV0pJiYoZj0hMCk7aWYoZil7Yz1jfHx7fTtrPVtdO2Q9Yy5zdGF0ZXN8fHt9O2Y9ZC5ob3Zlcj1kLmhvdmVyfHx7fTtpZighYi5tYXJrZXIpZi5jb2xvcj1tYShmLmNvbG9yfHxoLmNvbG9yKS5icmlnaHRlbihmLmJyaWdodG5lc3N8fGUuYnJpZ2h0bmVzcykuZ2V0KCk7a1siIl09YS5jb252ZXJ0QXR0cmlicyh2KHtjb2xvcjpoLmNvbG9yfSxjKSxqWyIiXSk7ay5ob3Zlcj1hLmNvbnZlcnRBdHRyaWJzKGQuaG92ZXIsCmouaG92ZXIsa1siIl0pO2suc2VsZWN0PWEuY29udmVydEF0dHJpYnMoZC5zZWxlY3Qsai5zZWxlY3Qsa1siIl0pO2lmKGgubmVnYXRpdmUmJmIubWFya2VyKWtbIiJdLmZpbGw9ay5ob3Zlci5maWxsPWsuc2VsZWN0LmZpbGw9YS5jb252ZXJ0QXR0cmlicyh7ZmlsbENvbG9yOmx9KS5maWxsfWVsc2Ugaz1qO2gucG9pbnRBdHRyPWt9fSx1cGRhdGU6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmNoYXJ0LGQ9dGhpcy50eXBlLGE9eSh0aGlzLnVzZXJPcHRpb25zLHthbmltYXRpb246ITEsaW5kZXg6dGhpcy5pbmRleCxwb2ludFN0YXJ0OnRoaXMueERhdGFbMF19LGEpO3RoaXMucmVtb3ZlKCExKTt2KHRoaXMsYWFbYS50eXBlfHxkXS5wcm90b3R5cGUpO3RoaXMuaW5pdChjLGEpO28oYiwhMCkmJmMucmVkcmF3KCExKX0sZGVzdHJveTpmdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1hLmNoYXJ0LGM9L0FwcGxlV2ViS2l0XC81MzMvLnRlc3QoeWEpLGQsZSxmPWEuZGF0YXx8W10sZyxoLGk7RChhLAoiZGVzdHJveSIpO2JhKGEpO24oWyJ4QXhpcyIsInlBeGlzIl0sZnVuY3Rpb24oYil7aWYoaT1hW2JdKWdhKGkuc2VyaWVzLGEpLGkuaXNEaXJ0eT1pLmZvcmNlUmVkcmF3PSEwfSk7YS5sZWdlbmRJdGVtJiZhLmNoYXJ0LmxlZ2VuZC5kZXN0cm95SXRlbShhKTtmb3IoZT1mLmxlbmd0aDtlLS07KShnPWZbZV0pJiZnLmRlc3Ryb3kmJmcuZGVzdHJveSgpO2EucG9pbnRzPW51bGw7Y2xlYXJUaW1lb3V0KGEuYW5pbWF0aW9uVGltZW91dCk7bigiYXJlYSxncmFwaCxkYXRhTGFiZWxzR3JvdXAsZ3JvdXAsbWFya2VyR3JvdXAsdHJhY2tlcixncmFwaE5lZyxhcmVhTmVnLHBvc0NsaXAsbmVnQ2xpcCIuc3BsaXQoIiwiKSxmdW5jdGlvbihiKXthW2JdJiYoZD1jJiZiPT09Imdyb3VwIj8iaGlkZSI6ImRlc3Ryb3kiLGFbYl1bZF0oKSl9KTtpZihiLmhvdmVyU2VyaWVzPT09YSliLmhvdmVyU2VyaWVzPW51bGw7Z2EoYi5zZXJpZXMsYSk7Zm9yKGggaW4gYSlkZWxldGUgYVtoXX0sZHJhd0RhdGFMYWJlbHM6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcyxiPWEub3B0aW9ucy5kYXRhTGFiZWxzLGM9YS5wb2ludHMsZCxlLGYsZztpZihiLmVuYWJsZWR8fGEuX2hhc1BvaW50TGFiZWxzKWEuZGxQcm9jZXNzT3B0aW9ucyYmYS5kbFByb2Nlc3NPcHRpb25zKGIpLGc9YS5wbG90R3JvdXAoImRhdGFMYWJlbHNHcm91cCIsImRhdGEtbGFiZWxzIixhLnZpc2libGU/InZpc2libGUiOiJoaWRkZW4iLGIuekluZGV4fHw2KSxlPWIsbihjLGZ1bmN0aW9uKGMpe3ZhciBpLGo9Yy5kYXRhTGFiZWwsayxtLGw9Yy5jb25uZWN0b3Isbj0hMDtkPWMub3B0aW9ucyYmYy5vcHRpb25zLmRhdGFMYWJlbHM7aT1lLmVuYWJsZWR8fGQmJmQuZW5hYmxlZDtpZihqJiYhaSljLmRhdGFMYWJlbD1qLmRlc3Ryb3koKTtlbHNlIGlmKGkpe2k9Yi5yb3RhdGlvbjtiPXkoZSxkKTtrPWMuZ2V0TGFiZWxDb25maWcoKTtmPWIuZm9ybWF0P0VhKGIuZm9ybWF0LGspOmIuZm9ybWF0dGVyLmNhbGwoayxiKTtiLnN0eWxlLmNvbG9yPW8oYi5jb2xvcixiLnN0eWxlLmNvbG9yLAphLmNvbG9yLCJibGFjayIpO2lmKGopaWYocihmKSlqLmF0dHIoe3RleHQ6Zn0pLG49ITE7ZWxzZXtpZihjLmRhdGFMYWJlbD1qPWouZGVzdHJveSgpLGwpYy5jb25uZWN0b3I9bC5kZXN0cm95KCl9ZWxzZSBpZihyKGYpKXtqPXtmaWxsOmIuYmFja2dyb3VuZENvbG9yLHN0cm9rZTpiLmJvcmRlckNvbG9yLCJzdHJva2Utd2lkdGgiOmIuYm9yZGVyV2lkdGgscjpiLmJvcmRlclJhZGl1c3x8MCxyb3RhdGlvbjppLHBhZGRpbmc6Yi5wYWRkaW5nLHpJbmRleDoxfTtmb3IobSBpbiBqKWpbbV09PT14JiZkZWxldGUgalttXTtqPWMuZGF0YUxhYmVsPWEuY2hhcnQucmVuZGVyZXJbaT8idGV4dCI6ImxhYmVsIl0oZiwwLC05OTksbnVsbCxudWxsLG51bGwsYi51c2VIVE1MKS5hdHRyKGopLmNzcyhiLnN0eWxlKS5hZGQoZykuc2hhZG93KGIuc2hhZG93KX1qJiZhLmFsaWduRGF0YUxhYmVsKGMsaixiLG51bGwsbil9fSl9LGFsaWduRGF0YUxhYmVsOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9CnRoaXMuY2hhcnQsZz1mLmludmVydGVkLGg9byhhLnBsb3RYLC05OTkpLGE9byhhLnBsb3RZLC05OTkpLGk9Yi5nZXRCQm94KCksZD12KHt4Omc/Zi5wbG90V2lkdGgtYTpoLHk6dChnP2YucGxvdEhlaWdodC1oOmEpLHdpZHRoOjAsaGVpZ2h0OjB9LGQpO3YoYyx7d2lkdGg6aS53aWR0aCxoZWlnaHQ6aS5oZWlnaHR9KTtjLnJvdGF0aW9uPyhkPXthbGlnbjpjLmFsaWduLHg6ZC54K2MueCtkLndpZHRoLzIseTpkLnkrYy55K2QuaGVpZ2h0LzJ9LGJbZT8iYXR0ciI6ImFuaW1hdGUiXShkKSk6Yi5hbGlnbihjLG51bGwsZCk7Yi5hdHRyKHt2aXNpYmlsaXR5OmMuY3JvcD09PSExfHxmLmlzSW5zaWRlUGxvdChoLGEsZyk/Zi5yZW5kZXJlci5pc1NWRz8iaW5oZXJpdCI6InZpc2libGUiOiJoaWRkZW4ifSl9LGdldFNlZ21lbnRQYXRoOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYz1bXSxkPWIub3B0aW9ucy5zdGVwO24oYSxmdW5jdGlvbihlLGYpe3ZhciBnPWUucGxvdFgsaD1lLnBsb3RZLAppO2IuZ2V0UG9pbnRTcGxpbmU/Yy5wdXNoLmFwcGx5KGMsYi5nZXRQb2ludFNwbGluZShhLGUsZikpOihjLnB1c2goZj8iTCI6Ik0iKSxkJiZmJiYoaT1hW2YtMV0sZD09PSJyaWdodCI/Yy5wdXNoKGkucGxvdFgsaCk6ZD09PSJjZW50ZXIiP2MucHVzaCgoaS5wbG90WCtnKS8yLGkucGxvdFksKGkucGxvdFgrZykvMixoKTpjLnB1c2goZyxpLnBsb3RZKSksYy5wdXNoKGUucGxvdFgsZS5wbG90WSkpfSk7cmV0dXJuIGN9LGdldEdyYXBoUGF0aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1bXSxjLGQ9W107bihhLnNlZ21lbnRzLGZ1bmN0aW9uKGUpe2M9YS5nZXRTZWdtZW50UGF0aChlKTtlLmxlbmd0aD4xP2I9Yi5jb25jYXQoYyk6ZC5wdXNoKGVbMF0pfSk7YS5zaW5nbGVQb2ludHM9ZDtyZXR1cm4gYS5ncmFwaFBhdGg9Yn0sZHJhd0dyYXBoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiPXRoaXMub3B0aW9ucyxjPVtbImdyYXBoIixiLmxpbmVDb2xvcnx8dGhpcy5jb2xvcl1dLGQ9Yi5saW5lV2lkdGgsCmU9Yi5kYXNoU3R5bGUsZj10aGlzLmdldEdyYXBoUGF0aCgpLGc9Yi5uZWdhdGl2ZUNvbG9yO2cmJmMucHVzaChbImdyYXBoTmVnIixnXSk7bihjLGZ1bmN0aW9uKGMsZyl7dmFyIGo9Y1swXSxrPWFbal07aWYoaylUYShrKSxrLmFuaW1hdGUoe2Q6Zn0pO2Vsc2UgaWYoZCYmZi5sZW5ndGgpe2s9e3N0cm9rZTpjWzFdLCJzdHJva2Utd2lkdGgiOmQsekluZGV4OjF9O2lmKGUpay5kYXNoc3R5bGU9ZTthW2pdPWEuY2hhcnQucmVuZGVyZXIucGF0aChmKS5hdHRyKGspLmFkZChhLmdyb3VwKS5zaGFkb3coIWcmJmIuc2hhZG93KX19KX0sY2xpcE5lZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucyxiPXRoaXMuY2hhcnQsYz1iLnJlbmRlcmVyLGQ9YS5uZWdhdGl2ZUNvbG9yLGUsZj10aGlzLnBvc0NsaXAsZz10aGlzLm5lZ0NsaXA7ZT1iLmNoYXJ0V2lkdGg7dmFyIGg9Yi5jaGFydEhlaWdodCxpPXEoZSxoKTtpZihkJiZ0aGlzLmdyYXBoKWQ9amEodGhpcy55QXhpcy5sZW4tdGhpcy55QXhpcy50cmFuc2xhdGUoYS50aHJlc2hvbGR8fAowKSksYT17eDowLHk6MCx3aWR0aDppLGhlaWdodDpkfSxpPXt4OjAseTpkLHdpZHRoOmksaGVpZ2h0OmktZH0sYi5pbnZlcnRlZCYmYy5pc1ZNTCYmKGE9e3g6Yi5wbG90V2lkdGgtZC1iLnBsb3RMZWZ0LHk6MCx3aWR0aDplLGhlaWdodDpofSxpPXt4OmQrYi5wbG90TGVmdC1lLHk6MCx3aWR0aDpiLnBsb3RMZWZ0K2QsaGVpZ2h0OmV9KSx0aGlzLnlBeGlzLnJldmVyc2VkPyhiPWksZT1hKTooYj1hLGU9aSksZj8oZi5hbmltYXRlKGIpLGcuYW5pbWF0ZShlKSk6KHRoaXMucG9zQ2xpcD1mPWMuY2xpcFJlY3QoYiksdGhpcy5ncmFwaC5jbGlwKGYpLHRoaXMubmVnQ2xpcD1nPWMuY2xpcFJlY3QoZSksdGhpcy5ncmFwaE5lZy5jbGlwKGcpLHRoaXMuYXJlYSYmKHRoaXMuYXJlYS5jbGlwKGYpLHRoaXMuYXJlYU5lZy5jbGlwKGcpKSl9LGludmVydEdyb3VwczpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt2YXIgYT17d2lkdGg6Yi55QXhpcy5sZW4saGVpZ2h0OmIueEF4aXMubGVufTtuKFsiZ3JvdXAiLAoibWFya2VyR3JvdXAiXSxmdW5jdGlvbihjKXtiW2NdJiZiW2NdLmF0dHIoYSkuaW52ZXJ0KCl9KX12YXIgYj10aGlzLGM9Yi5jaGFydDtKKGMsInJlc2l6ZSIsYSk7SihiLCJkZXN0cm95IixmdW5jdGlvbigpe2JhKGMsInJlc2l6ZSIsYSl9KTthKCk7Yi5pbnZlcnRHcm91cHM9YX0scGxvdEdyb3VwOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9dGhpc1thXSxnPSFmLGg9dGhpcy5jaGFydCxpPXRoaXMueEF4aXMsaj10aGlzLnlBeGlzO2cmJih0aGlzW2FdPWY9aC5yZW5kZXJlci5nKGIpLmF0dHIoe3Zpc2liaWxpdHk6Yyx6SW5kZXg6ZHx8MC4xfSkuYWRkKGUpKTtmW2c/ImF0dHIiOiJhbmltYXRlIl0oe3RyYW5zbGF0ZVg6aT9pLmxlZnQ6aC5wbG90TGVmdCx0cmFuc2xhdGVZOmo/ai50b3A6aC5wbG90VG9wLHNjYWxlWDoxLHNjYWxlWToxfSk7cmV0dXJuIGZ9LHJlbmRlcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY2hhcnQsYixjPXRoaXMub3B0aW9ucyxkPWMuYW5pbWF0aW9uJiYKISF0aGlzLmFuaW1hdGUmJmEucmVuZGVyZXIuaXNTVkcsZT10aGlzLnZpc2libGU/InZpc2libGUiOiJoaWRkZW4iLGY9Yy56SW5kZXgsZz10aGlzLmhhc1JlbmRlcmVkLGg9YS5zZXJpZXNHcm91cDtiPXRoaXMucGxvdEdyb3VwKCJncm91cCIsInNlcmllcyIsZSxmLGgpO3RoaXMubWFya2VyR3JvdXA9dGhpcy5wbG90R3JvdXAoIm1hcmtlckdyb3VwIiwibWFya2VycyIsZSxmLGgpO2QmJnRoaXMuYW5pbWF0ZSghMCk7dGhpcy5nZXRBdHRyaWJzKCk7Yi5pbnZlcnRlZD1hLmludmVydGVkO3RoaXMuZHJhd0dyYXBoJiYodGhpcy5kcmF3R3JhcGgoKSx0aGlzLmNsaXBOZWcoKSk7dGhpcy5kcmF3RGF0YUxhYmVscygpO3RoaXMuZHJhd1BvaW50cygpO3RoaXMub3B0aW9ucy5lbmFibGVNb3VzZVRyYWNraW5nIT09ITEmJnRoaXMuZHJhd1RyYWNrZXIoKTthLmludmVydGVkJiZ0aGlzLmludmVydEdyb3VwcygpO2MuY2xpcCE9PSExJiYhdGhpcy5zaGFyZWRDbGlwS2V5JiYhZyYmYi5jbGlwKGEuY2xpcFJlY3QpOwpkP3RoaXMuYW5pbWF0ZSgpOmd8fHRoaXMuYWZ0ZXJBbmltYXRlKCk7dGhpcy5pc0RpcnR5PXRoaXMuaXNEaXJ0eURhdGE9ITE7dGhpcy5oYXNSZW5kZXJlZD0hMH0scmVkcmF3OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5jaGFydCxiPXRoaXMuaXNEaXJ0eURhdGEsYz10aGlzLmdyb3VwLGQ9dGhpcy54QXhpcyxlPXRoaXMueUF4aXM7YyYmKGEuaW52ZXJ0ZWQmJmMuYXR0cih7d2lkdGg6YS5wbG90V2lkdGgsaGVpZ2h0OmEucGxvdEhlaWdodH0pLGMuYW5pbWF0ZSh7dHJhbnNsYXRlWDpvKGQmJmQubGVmdCxhLnBsb3RMZWZ0KSx0cmFuc2xhdGVZOm8oZSYmZS50b3AsYS5wbG90VG9wKX0pKTt0aGlzLnRyYW5zbGF0ZSgpO3RoaXMuc2V0VG9vbHRpcFBvaW50cyghMCk7dGhpcy5yZW5kZXIoKTtiJiZEKHRoaXMsInVwZGF0ZWREYXRhIil9LHNldFN0YXRlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucyxjPXRoaXMuZ3JhcGgsZD10aGlzLmdyYXBoTmVnLGU9Yi5zdGF0ZXMsYj1iLmxpbmVXaWR0aCwKYT1hfHwiIjtpZih0aGlzLnN0YXRlIT09YSl0aGlzLnN0YXRlPWEsZVthXSYmZVthXS5lbmFibGVkPT09ITF8fChhJiYoYj1lW2FdLmxpbmVXaWR0aHx8YisxKSxjJiYhYy5kYXNoc3R5bGUmJihhPXsic3Ryb2tlLXdpZHRoIjpifSxjLmF0dHIoYSksZCYmZC5hdHRyKGEpKSl9LHNldFZpc2libGU6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLGQ9Yy5jaGFydCxlPWMubGVnZW5kSXRlbSxmLGc9ZC5vcHRpb25zLmNoYXJ0Lmlnbm9yZUhpZGRlblNlcmllcyxoPWMudmlzaWJsZTtmPShjLnZpc2libGU9YT1jLnVzZXJPcHRpb25zLnZpc2libGU9YT09PXg/IWg6YSk/InNob3ciOiJoaWRlIjtuKFsiZ3JvdXAiLCJkYXRhTGFiZWxzR3JvdXAiLCJtYXJrZXJHcm91cCIsInRyYWNrZXIiXSxmdW5jdGlvbihhKXtpZihjW2FdKWNbYV1bZl0oKX0pO2lmKGQuaG92ZXJTZXJpZXM9PT1jKWMub25Nb3VzZU91dCgpO2UmJmQubGVnZW5kLmNvbG9yaXplSXRlbShjLGEpO2MuaXNEaXJ0eT0hMDtjLm9wdGlvbnMuc3RhY2tpbmcmJgpuKGQuc2VyaWVzLGZ1bmN0aW9uKGEpe2lmKGEub3B0aW9ucy5zdGFja2luZyYmYS52aXNpYmxlKWEuaXNEaXJ0eT0hMH0pO24oYy5saW5rZWRTZXJpZXMsZnVuY3Rpb24oYil7Yi5zZXRWaXNpYmxlKGEsITEpfSk7aWYoZylkLmlzRGlydHlCb3g9ITA7YiE9PSExJiZkLnJlZHJhdygpO0QoYyxmKX0sc2hvdzpmdW5jdGlvbigpe3RoaXMuc2V0VmlzaWJsZSghMCl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLnNldFZpc2libGUoITEpfSxzZWxlY3Q6ZnVuY3Rpb24oYSl7dGhpcy5zZWxlY3RlZD1hPWE9PT14PyF0aGlzLnNlbGVjdGVkOmE7aWYodGhpcy5jaGVja2JveCl0aGlzLmNoZWNrYm94LmNoZWNrZWQ9YTtEKHRoaXMsYT8ic2VsZWN0IjoidW5zZWxlY3QiKX0sZHJhd1RyYWNrZXI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9YS5vcHRpb25zLGM9Yi50cmFja0J5QXJlYSxkPVtdLmNvbmNhdChjP2EuYXJlYVBhdGg6YS5ncmFwaFBhdGgpLGU9ZC5sZW5ndGgsZj1hLmNoYXJ0LGc9Zi5wb2ludGVyLApoPWYucmVuZGVyZXIsaT1mLm9wdGlvbnMudG9vbHRpcC5zbmFwLGo9YS50cmFja2VyLGs9Yi5jdXJzb3Isaz1rJiZ7Y3Vyc29yOmt9LG09YS5zaW5nbGVQb2ludHMsbCxuPWZ1bmN0aW9uKCl7aWYoZi5ob3ZlclNlcmllcyE9PWEpYS5vbk1vdXNlT3ZlcigpfTtpZihlJiYhYylmb3IobD1lKzE7bC0tOylkW2xdPT09Ik0iJiZkLnNwbGljZShsKzEsMCxkW2wrMV0taSxkW2wrMl0sIkwiKSwobCYmZFtsXT09PSJNInx8bD09PWUpJiZkLnNwbGljZShsLDAsIkwiLGRbbC0yXStpLGRbbC0xXSk7Zm9yKGw9MDtsPG0ubGVuZ3RoO2wrKyllPW1bbF0sZC5wdXNoKCJNIixlLnBsb3RYLWksZS5wbG90WSwiTCIsZS5wbG90WCtpLGUucGxvdFkpO2lmKGopai5hdHRyKHtkOmR9KTtlbHNlIGlmKGEudHJhY2tlcj1qPWgucGF0aChkKS5hdHRyKHsiY2xhc3MiOiJoaWdoY2hhcnRzLXRyYWNrZXIiLCJzdHJva2UtbGluZWpvaW4iOiJyb3VuZCIsdmlzaWJpbGl0eTphLnZpc2libGU/InZpc2libGUiOiJoaWRkZW4iLApzdHJva2U6TWIsZmlsbDpjP01iOlMsInN0cm9rZS13aWR0aCI6Yi5saW5lV2lkdGgrKGM/MDoyKmkpLHpJbmRleDoyfSkuYWRkQ2xhc3MoImhpZ2hjaGFydHMtdHJhY2tlciIpLm9uKCJtb3VzZW92ZXIiLG4pLm9uKCJtb3VzZW91dCIsZnVuY3Rpb24oYSl7Zy5vblRyYWNrZXJNb3VzZU91dChhKX0pLmNzcyhrKS5hZGQoYS5tYXJrZXJHcm91cCksZmIpai5vbigidG91Y2hzdGFydCIsbil9fTtNPWVhKFIpO2FhLmxpbmU9TTtYLmFyZWE9eShXLHt0aHJlc2hvbGQ6MH0pO009ZWEoUix7dHlwZToiYXJlYSIsZ2V0U2VnbWVudHM6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiPVtdLGM9W10sZD10aGlzLnhBeGlzLGU9dGhpcy55QXhpcyxmPWUuc3RhY2tzW3RoaXMuc3RhY2tLZXldLGc9e30saCxpLGo9dGhpcy5wb2ludHMsayxtO2lmKHRoaXMub3B0aW9ucy5zdGFja2luZyYmIXRoaXMuY3JvcHBlZCl7Zm9yKGs9MDtrPGoubGVuZ3RoO2srKylnW2pba10ueF09altrXTtmb3IobSBpbiBmKWMucHVzaCgrbSk7CmMuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLWJ9KTtuKGMsZnVuY3Rpb24oYSl7Z1thXT9iLnB1c2goZ1thXSk6KGg9ZC50cmFuc2xhdGUoYSksaT1lLnRvUGl4ZWxzKGZbYV0uY3VtLCEwKSxiLnB1c2goe3k6bnVsbCxwbG90WDpoLGNsaWVudFg6aCxwbG90WTppLHlCb3R0b206aSxvbk1vdXNlT3Zlcjp0YX0pKX0pO2IubGVuZ3RoJiZhLnB1c2goYil9ZWxzZSBSLnByb3RvdHlwZS5nZXRTZWdtZW50cy5jYWxsKHRoaXMpLGE9dGhpcy5zZWdtZW50czt0aGlzLnNlZ21lbnRzPWF9LGdldFNlZ21lbnRQYXRoOmZ1bmN0aW9uKGEpe3ZhciBiPVIucHJvdG90eXBlLmdldFNlZ21lbnRQYXRoLmNhbGwodGhpcyxhKSxjPVtdLmNvbmNhdChiKSxkLGU9dGhpcy5vcHRpb25zO2IubGVuZ3RoPT09MyYmYy5wdXNoKCJMIixiWzFdLGJbMl0pO2lmKGUuc3RhY2tpbmcmJiF0aGlzLmNsb3NlZFN0YWNrcylmb3IoZD1hLmxlbmd0aC0xO2Q+PTA7ZC0tKWQ8YS5sZW5ndGgtMSYmZS5zdGVwJiZjLnB1c2goYVtkKwoxXS5wbG90WCxhW2RdLnlCb3R0b20pLGMucHVzaChhW2RdLnBsb3RYLGFbZF0ueUJvdHRvbSk7ZWxzZSB0aGlzLmNsb3NlU2VnbWVudChjLGEpO3RoaXMuYXJlYVBhdGg9dGhpcy5hcmVhUGF0aC5jb25jYXQoYyk7cmV0dXJuIGJ9LGNsb3NlU2VnbWVudDpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMueUF4aXMuZ2V0VGhyZXNob2xkKHRoaXMub3B0aW9ucy50aHJlc2hvbGQpO2EucHVzaCgiTCIsYltiLmxlbmd0aC0xXS5wbG90WCxjLCJMIixiWzBdLnBsb3RYLGMpfSxkcmF3R3JhcGg6ZnVuY3Rpb24oKXt0aGlzLmFyZWFQYXRoPVtdO1IucHJvdG90eXBlLmRyYXdHcmFwaC5hcHBseSh0aGlzKTt2YXIgYT10aGlzLGI9dGhpcy5hcmVhUGF0aCxjPXRoaXMub3B0aW9ucyxkPVtbImFyZWEiLHRoaXMuY29sb3IsYy5maWxsQ29sb3JdXTtjLm5lZ2F0aXZlQ29sb3ImJmQucHVzaChbImFyZWFOZWciLGMubmVnYXRpdmVDb2xvcixjLm5lZ2F0aXZlRmlsbENvbG9yXSk7bihkLGZ1bmN0aW9uKGQpe3ZhciBmPQpkWzBdLGc9YVtmXTtnP2cuYW5pbWF0ZSh7ZDpifSk6YVtmXT1hLmNoYXJ0LnJlbmRlcmVyLnBhdGgoYikuYXR0cih7ZmlsbDpvKGRbMl0sbWEoZFsxXSkuc2V0T3BhY2l0eShjLmZpbGxPcGFjaXR5fHwwLjc1KS5nZXQoKSksekluZGV4OjB9KS5hZGQoYS5ncm91cCl9KX0sZHJhd0xlZ2VuZFN5bWJvbDpmdW5jdGlvbihhLGIpe2IubGVnZW5kU3ltYm9sPXRoaXMuY2hhcnQucmVuZGVyZXIucmVjdCgwLGEuYmFzZWxpbmUtMTEsYS5vcHRpb25zLnN5bWJvbFdpZHRoLDEyLDIpLmF0dHIoe3pJbmRleDozfSkuYWRkKGIubGVnZW5kR3JvdXApfX0pO2FhLmFyZWE9TTtYLnNwbGluZT15KFcpO0Y9ZWEoUix7dHlwZToic3BsaW5lIixnZXRQb2ludFNwbGluZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9Yi5wbG90WCxlPWIucGxvdFksZj1hW2MtMV0sZz1hW2MrMV0saCxpLGosaztpZihmJiZnKXthPWYucGxvdFk7aj1nLnBsb3RYO3ZhciBnPWcucGxvdFksbTtoPSgxLjUqZCtmLnBsb3RYKS8yLjU7Cmk9KDEuNSplK2EpLzIuNTtqPSgxLjUqZCtqKS8yLjU7az0oMS41KmUrZykvMi41O209KGstaSkqKGotZCkvKGotaCkrZS1rO2krPW07ays9bTtpPmEmJmk+ZT8oaT1xKGEsZSksaz0yKmUtaSk6aTxhJiZpPGUmJihpPUsoYSxlKSxrPTIqZS1pKTtrPmcmJms+ZT8oaz1xKGcsZSksaT0yKmUtayk6azxnJiZrPGUmJihrPUsoZyxlKSxpPTIqZS1rKTtiLnJpZ2h0Q29udFg9ajtiLnJpZ2h0Q29udFk9a31jPyhiPVsiQyIsZi5yaWdodENvbnRYfHxmLnBsb3RYLGYucmlnaHRDb250WXx8Zi5wbG90WSxofHxkLGl8fGUsZCxlXSxmLnJpZ2h0Q29udFg9Zi5yaWdodENvbnRZPW51bGwpOmI9WyJNIixkLGVdO3JldHVybiBifX0pO2FhLnNwbGluZT1GO1guYXJlYXNwbGluZT15KFguYXJlYSk7bmE9TS5wcm90b3R5cGU7Rj1lYShGLHt0eXBlOiJhcmVhc3BsaW5lIixjbG9zZWRTdGFja3M6ITAsZ2V0U2VnbWVudFBhdGg6bmEuZ2V0U2VnbWVudFBhdGgsY2xvc2VTZWdtZW50Om5hLmNsb3NlU2VnbWVudCwKZHJhd0dyYXBoOm5hLmRyYXdHcmFwaH0pO2FhLmFyZWFzcGxpbmU9RjtYLmNvbHVtbj15KFcse2JvcmRlckNvbG9yOiIjRkZGRkZGIixib3JkZXJXaWR0aDoxLGJvcmRlclJhZGl1czowLGdyb3VwUGFkZGluZzowLjIsbWFya2VyOm51bGwscG9pbnRQYWRkaW5nOjAuMSxtaW5Qb2ludExlbmd0aDowLGNyb3BUaHJlc2hvbGQ6NTAscG9pbnRSYW5nZTpudWxsLHN0YXRlczp7aG92ZXI6e2JyaWdodG5lc3M6MC4xLHNoYWRvdzohMX0sc2VsZWN0Ontjb2xvcjoiI0MwQzBDMCIsYm9yZGVyQ29sb3I6IiMwMDAwMDAiLHNoYWRvdzohMX19LGRhdGFMYWJlbHM6e2FsaWduOm51bGwsdmVydGljYWxBbGlnbjpudWxsLHk6bnVsbH0sc3RpY2t5VHJhY2tpbmc6ITEsdGhyZXNob2xkOjB9KTtGPWVhKFIse3R5cGU6ImNvbHVtbiIsdG9vbHRpcE91dHNpZGVQbG90OiEwLHJlcXVpcmVTb3J0aW5nOiExLHBvaW50QXR0clRvT3B0aW9uczp7c3Ryb2tlOiJib3JkZXJDb2xvciIsInN0cm9rZS13aWR0aCI6ImJvcmRlcldpZHRoIiwKZmlsbDoiY29sb3IiLHI6ImJvcmRlclJhZGl1cyJ9LHRyYWNrZXJHcm91cHM6WyJncm91cCIsImRhdGFMYWJlbHNHcm91cCJdLGluaXQ6ZnVuY3Rpb24oKXtSLnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgYT10aGlzLGI9YS5jaGFydDtiLmhhc1JlbmRlcmVkJiZuKGIuc2VyaWVzLGZ1bmN0aW9uKGIpe2lmKGIudHlwZT09PWEudHlwZSliLmlzRGlydHk9ITB9KX0sZ2V0Q29sdW1uTWV0cmljczpmdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1hLmNoYXJ0LGM9YS5vcHRpb25zLGQ9dGhpcy54QXhpcyxlPWQucmV2ZXJzZWQsZixnPXt9LGgsaT0wO2MuZ3JvdXBpbmc9PT0hMT9pPTE6bihiLnNlcmllcyxmdW5jdGlvbihiKXt2YXIgYz1iLm9wdGlvbnM7aWYoYi50eXBlPT09YS50eXBlJiZiLnZpc2libGUmJmEub3B0aW9ucy5ncm91cD09PWMuZ3JvdXApYy5zdGFja2luZz8oZj1iLnN0YWNrS2V5LGdbZl09PT14JiYoZ1tmXT1pKyspLGg9Z1tmXSk6Yy5ncm91cGluZyE9PQohMSYmKGg9aSsrKSxiLmNvbHVtbkluZGV4PWh9KTt2YXIgYj1LKFEoZC50cmFuc0EpKihkLm9yZGluYWxTbG9wZXx8Yy5wb2ludFJhbmdlfHxkLmNsb3Nlc3RQb2ludFJhbmdlfHwxKSxkLmxlbiksZD1iKmMuZ3JvdXBQYWRkaW5nLGo9KGItMipkKS9pLGs9Yy5wb2ludFdpZHRoLGM9cihrKT8oai1rKS8yOmoqYy5wb2ludFBhZGRpbmcsaz1vKGssai0yKmMpO3JldHVybiBhLmNvbHVtbk1ldHJpY3M9e3dpZHRoOmssb2Zmc2V0OmMrKGQrKChlP2ktKGEuY29sdW1uSW5kZXh8fDApOmEuY29sdW1uSW5kZXgpfHwwKSpqLWIvMikqKGU/LTE6MSl9fSx0cmFuc2xhdGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9YS5jaGFydCxjPWEub3B0aW9ucyxkPWMuc3RhY2tpbmcsZT1jLmJvcmRlcldpZHRoLGY9YS55QXhpcyxnPWEudHJhbnNsYXRlZFRocmVzaG9sZD1mLmdldFRocmVzaG9sZChjLnRocmVzaG9sZCksaD1vKGMubWluUG9pbnRMZW5ndGgsNSksYz1hLmdldENvbHVtbk1ldHJpY3MoKSwKaT1jLndpZHRoLGo9amEocShpLDErMiplKSksaz1jLm9mZnNldDtSLnByb3RvdHlwZS50cmFuc2xhdGUuYXBwbHkoYSk7bihhLnBvaW50cyxmdW5jdGlvbihjKXt2YXIgbD1LKHEoLTk5OSxjLnBsb3RZKSxmLmxlbis5OTkpLG49byhjLnlCb3R0b20sZykscz1jLnBsb3RYK2ssdD1qYShLKGwsbikpLGw9amEocShsLG4pLXQpLHI9Zi5zdGFja3NbKGMueTwwPyItIjoiIikrYS5zdGFja0tleV07ZCYmYS52aXNpYmxlJiZyJiZyW2MueF0mJnJbYy54XS5zZXRPZmZzZXQoayxqKTtRKGwpPGgmJmgmJihsPWgsdD1RKHQtZyk+aD9uLWg6Zy0oZi50cmFuc2xhdGUoYy55LDAsMSwwLDEpPD1nP2g6MCkpO2MuYmFyWD1zO2MucG9pbnRXaWR0aD1pO2Muc2hhcGVUeXBlPSJyZWN0IjtjLnNoYXBlQXJncz1jPWIucmVuZGVyZXIuRWxlbWVudC5wcm90b3R5cGUuY3Jpc3AuY2FsbCgwLGUscyx0LGosbCk7ZSUyJiYoYy55LT0xLGMuaGVpZ2h0Kz0xKX0pfSxnZXRTeW1ib2w6dGEsZHJhd0xlZ2VuZFN5bWJvbDpNLnByb3RvdHlwZS5kcmF3TGVnZW5kU3ltYm9sLApkcmF3R3JhcGg6dGEsZHJhd1BvaW50czpmdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1hLm9wdGlvbnMsYz1hLmNoYXJ0LnJlbmRlcmVyLGQ7bihhLnBvaW50cyxmdW5jdGlvbihlKXt2YXIgZj1lLnBsb3RZLGc9ZS5ncmFwaGljO2lmKGYhPT14JiYhaXNOYU4oZikmJmUueSE9PW51bGwpZD1lLnNoYXBlQXJncyxnPyhUYShnKSxnLmFuaW1hdGUoeShkKSkpOmUuZ3JhcGhpYz1jW2Uuc2hhcGVUeXBlXShkKS5hdHRyKGUucG9pbnRBdHRyW2Uuc2VsZWN0ZWQ/InNlbGVjdCI6IiJdKS5hZGQoYS5ncm91cCkuc2hhZG93KGIuc2hhZG93LG51bGwsYi5zdGFja2luZyYmIWIuYm9yZGVyUmFkaXVzKTtlbHNlIGlmKGcpZS5ncmFwaGljPWcuZGVzdHJveSgpfSl9LGRyYXdUcmFja2VyOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiPWEuY2hhcnQucG9pbnRlcixjPWEub3B0aW9ucy5jdXJzb3IsZD1jJiZ7Y3Vyc29yOmN9LGU9ZnVuY3Rpb24oYil7dmFyIGM9Yi50YXJnZXQsZDtmb3IoYS5vbk1vdXNlT3ZlcigpO2MmJgohZDspZD1jLnBvaW50LGM9Yy5wYXJlbnROb2RlO2lmKGQhPT14KWQub25Nb3VzZU92ZXIoYil9O24oYS5wb2ludHMsZnVuY3Rpb24oYSl7aWYoYS5ncmFwaGljKWEuZ3JhcGhpYy5lbGVtZW50LnBvaW50PWE7aWYoYS5kYXRhTGFiZWwpYS5kYXRhTGFiZWwuZWxlbWVudC5wb2ludD1hfSk7YS5faGFzVHJhY2tpbmc/YS5faGFzVHJhY2tpbmc9ITA6bihhLnRyYWNrZXJHcm91cHMsZnVuY3Rpb24oYyl7aWYoYVtjXSYmKGFbY10uYWRkQ2xhc3MoImhpZ2hjaGFydHMtdHJhY2tlciIpLm9uKCJtb3VzZW92ZXIiLGUpLm9uKCJtb3VzZW91dCIsZnVuY3Rpb24oYSl7Yi5vblRyYWNrZXJNb3VzZU91dChhKX0pLmNzcyhkKSxmYikpYVtjXS5vbigidG91Y2hzdGFydCIsZSl9KX0sYWxpZ25EYXRhTGFiZWw6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj10aGlzLmNoYXJ0LGc9Zi5pbnZlcnRlZCxoPWEuZGxCb3h8fGEuc2hhcGVBcmdzLGk9YS5iZWxvd3x8YS5wbG90WT5vKHRoaXMudHJhbnNsYXRlZFRocmVzaG9sZCwKZi5wbG90U2l6ZVkpLGo9byhjLmluc2lkZSwhIXRoaXMub3B0aW9ucy5zdGFja2luZyk7aWYoaCYmKGQ9eShoKSxnJiYoZD17eDpmLnBsb3RXaWR0aC1kLnktZC5oZWlnaHQseTpmLnBsb3RIZWlnaHQtZC54LWQud2lkdGgsd2lkdGg6ZC5oZWlnaHQsaGVpZ2h0OmQud2lkdGh9KSwhaikpZz8oZC54Kz1pPzA6ZC53aWR0aCxkLndpZHRoPTApOihkLnkrPWk/ZC5oZWlnaHQ6MCxkLmhlaWdodD0wKTtjLmFsaWduPW8oYy5hbGlnbiwhZ3x8aj8iY2VudGVyIjppPyJyaWdodCI6ImxlZnQiKTtjLnZlcnRpY2FsQWxpZ249byhjLnZlcnRpY2FsQWxpZ24sZ3x8aj8ibWlkZGxlIjppPyJ0b3AiOiJib3R0b20iKTtSLnByb3RvdHlwZS5hbGlnbkRhdGFMYWJlbC5jYWxsKHRoaXMsYSxiLGMsZCxlKX0sYW5pbWF0ZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnlBeGlzLGM9dGhpcy5vcHRpb25zLGQ9dGhpcy5jaGFydC5pbnZlcnRlZCxlPXt9O2lmKFopYT8oZS5zY2FsZVk9MC4wMDEsYT1LKGIucG9zKwpiLmxlbixxKGIucG9zLGIudG9QaXhlbHMoYy50aHJlc2hvbGQpKSksZD9lLnRyYW5zbGF0ZVg9YS1iLmxlbjplLnRyYW5zbGF0ZVk9YSx0aGlzLmdyb3VwLmF0dHIoZSkpOihlLnNjYWxlWT0xLGVbZD8idHJhbnNsYXRlWCI6InRyYW5zbGF0ZVkiXT1iLnBvcyx0aGlzLmdyb3VwLmFuaW1hdGUoZSx0aGlzLm9wdGlvbnMuYW5pbWF0aW9uKSx0aGlzLmFuaW1hdGU9bnVsbCl9LHJlbW92ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1hLmNoYXJ0O2IuaGFzUmVuZGVyZWQmJm4oYi5zZXJpZXMsZnVuY3Rpb24oYil7aWYoYi50eXBlPT09YS50eXBlKWIuaXNEaXJ0eT0hMH0pO1IucHJvdG90eXBlLnJlbW92ZS5hcHBseShhLGFyZ3VtZW50cyl9fSk7YWEuY29sdW1uPUY7WC5iYXI9eShYLmNvbHVtbik7bmE9ZWEoRix7dHlwZToiYmFyIixpbnZlcnRlZDohMH0pO2FhLmJhcj1uYTtYLnNjYXR0ZXI9eShXLHtsaW5lV2lkdGg6MCx0b29sdGlwOntoZWFkZXJGb3JtYXQ6JzxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEwcHg7IGNvbG9yOntzZXJpZXMuY29sb3J9Ij57c2VyaWVzLm5hbWV9PC9zcGFuPjxici8+JywKcG9pbnRGb3JtYXQ6Ing6IDxiPntwb2ludC54fTwvYj48YnIvPnk6IDxiPntwb2ludC55fTwvYj48YnIvPiIsZm9sbG93UG9pbnRlcjohMH0sc3RpY2t5VHJhY2tpbmc6ITF9KTtuYT1lYShSLHt0eXBlOiJzY2F0dGVyIixzb3J0ZWQ6ITEscmVxdWlyZVNvcnRpbmc6ITEsbm9TaGFyZWRUb29sdGlwOiEwLHRyYWNrZXJHcm91cHM6WyJtYXJrZXJHcm91cCJdLGRyYXdUcmFja2VyOkYucHJvdG90eXBlLmRyYXdUcmFja2VyLHNldFRvb2x0aXBQb2ludHM6dGF9KTthYS5zY2F0dGVyPW5hO1gucGllPXkoVyx7Ym9yZGVyQ29sb3I6IiNGRkZGRkYiLGJvcmRlcldpZHRoOjEsY2VudGVyOltudWxsLG51bGxdLGNsaXA6ITEsY29sb3JCeVBvaW50OiEwLGRhdGFMYWJlbHM6e2Rpc3RhbmNlOjMwLGVuYWJsZWQ6ITAsZm9ybWF0dGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucG9pbnQubmFtZX19LGlnbm9yZUhpZGRlblBvaW50OiEwLGxlZ2VuZFR5cGU6InBvaW50IixtYXJrZXI6bnVsbCxzaXplOm51bGwsCnNob3dJbkxlZ2VuZDohMSxzbGljZWRPZmZzZXQ6MTAsc3RhdGVzOntob3Zlcjp7YnJpZ2h0bmVzczowLjEsc2hhZG93OiExfX0sc3RpY2t5VHJhY2tpbmc6ITEsdG9vbHRpcDp7Zm9sbG93UG9pbnRlcjohMH19KTtXPXt0eXBlOiJwaWUiLGlzQ2FydGVzaWFuOiExLHBvaW50Q2xhc3M6ZWEoTWEse2luaXQ6ZnVuY3Rpb24oKXtNYS5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGE9dGhpcyxiO2lmKGEueTwwKWEueT1udWxsO3YoYSx7dmlzaWJsZTphLnZpc2libGUhPT0hMSxuYW1lOm8oYS5uYW1lLCJTbGljZSIpfSk7Yj1mdW5jdGlvbigpe2Euc2xpY2UoKX07SihhLCJzZWxlY3QiLGIpO0ooYSwidW5zZWxlY3QiLGIpO3JldHVybiBhfSxzZXRWaXNpYmxlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYz1iLnNlcmllcyxkPWMuY2hhcnQsZTtiLnZpc2libGU9Yi5vcHRpb25zLnZpc2libGU9YT1hPT09eD8hYi52aXNpYmxlOmE7Yy5vcHRpb25zLmRhdGFbbGEoYiwKYy5kYXRhKV09Yi5vcHRpb25zO2U9YT8ic2hvdyI6ImhpZGUiO24oWyJncmFwaGljIiwiZGF0YUxhYmVsIiwiY29ubmVjdG9yIiwic2hhZG93R3JvdXAiXSxmdW5jdGlvbihhKXtpZihiW2FdKWJbYV1bZV0oKX0pO2IubGVnZW5kSXRlbSYmZC5sZWdlbmQuY29sb3JpemVJdGVtKGIsYSk7aWYoIWMuaXNEaXJ0eSYmYy5vcHRpb25zLmlnbm9yZUhpZGRlblBvaW50KWMuaXNEaXJ0eT0hMCxkLnJlZHJhdygpfSxzbGljZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5zZXJpZXM7SGEoYyxkLmNoYXJ0KTtvKGIsITApO3RoaXMuc2xpY2VkPXRoaXMub3B0aW9ucy5zbGljZWQ9YT1yKGEpP2E6IXRoaXMuc2xpY2VkO2Qub3B0aW9ucy5kYXRhW2xhKHRoaXMsZC5kYXRhKV09dGhpcy5vcHRpb25zO2E9YT90aGlzLnNsaWNlZFRyYW5zbGF0aW9uOnt0cmFuc2xhdGVYOjAsdHJhbnNsYXRlWTowfTt0aGlzLmdyYXBoaWMuYW5pbWF0ZShhKTt0aGlzLnNoYWRvd0dyb3VwJiZ0aGlzLnNoYWRvd0dyb3VwLmFuaW1hdGUoYSl9fSksCnJlcXVpcmVTb3J0aW5nOiExLG5vU2hhcmVkVG9vbHRpcDohMCx0cmFja2VyR3JvdXBzOlsiZ3JvdXAiLCJkYXRhTGFiZWxzR3JvdXAiXSxwb2ludEF0dHJUb09wdGlvbnM6e3N0cm9rZToiYm9yZGVyQ29sb3IiLCJzdHJva2Utd2lkdGgiOiJib3JkZXJXaWR0aCIsZmlsbDoiY29sb3IifSxnZXRDb2xvcjp0YSxhbmltYXRlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYz1iLnBvaW50cyxkPWIuc3RhcnRBbmdsZVJhZDtpZighYSluKGMsZnVuY3Rpb24oYSl7dmFyIGM9YS5ncmFwaGljLGE9YS5zaGFwZUFyZ3M7YyYmKGMuYXR0cih7cjpiLmNlbnRlclszXS8yLHN0YXJ0OmQsZW5kOmR9KSxjLmFuaW1hdGUoe3I6YS5yLHN0YXJ0OmEuc3RhcnQsZW5kOmEuZW5kfSxiLm9wdGlvbnMuYW5pbWF0aW9uKSl9KSxiLmFuaW1hdGU9bnVsbH0sc2V0RGF0YTpmdW5jdGlvbihhLGIpe1IucHJvdG90eXBlLnNldERhdGEuY2FsbCh0aGlzLGEsITEpO3RoaXMucHJvY2Vzc0RhdGEoKTt0aGlzLmdlbmVyYXRlUG9pbnRzKCk7Cm8oYiwhMCkmJnRoaXMuY2hhcnQucmVkcmF3KCl9LGdldENlbnRlcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucyxiPXRoaXMuY2hhcnQsYz0yKihhLnNsaWNlZE9mZnNldHx8MCksZCxlPWIucGxvdFdpZHRoLTIqYyxmPWIucGxvdEhlaWdodC0yKmMsYj1hLmNlbnRlcixhPVtvKGJbMF0sIjUwJSIpLG8oYlsxXSwiNTAlIiksYS5zaXplfHwiMTAwJSIsYS5pbm5lclNpemV8fDBdLGc9SyhlLGYpLGg7cmV0dXJuIEthKGEsZnVuY3Rpb24oYSxiKXtoPS8lJC8udGVzdChhKTtkPWI8Mnx8Yj09PTImJmg7cmV0dXJuKGg/W2UsZixnLGddW2JdKnUoYSkvMTAwOmEpKyhkP2M6MCl9KX0sdHJhbnNsYXRlOmZ1bmN0aW9uKGEpe3RoaXMuZ2VuZXJhdGVQb2ludHMoKTt2YXIgYj0wLGM9MCxkPXRoaXMub3B0aW9ucyxlPWQuc2xpY2VkT2Zmc2V0LGY9ZStkLmJvcmRlcldpZHRoLGcsaCxpLGo9dGhpcy5zdGFydEFuZ2xlUmFkPUphLzE4MCooKGQuc3RhcnRBbmdsZXx8MCklMzYwLTkwKSxrPQp0aGlzLnBvaW50cyxtPTIqSmEsbD1kLmRhdGFMYWJlbHMuZGlzdGFuY2Usbj1kLmlnbm9yZUhpZGRlblBvaW50LG8scT1rLmxlbmd0aCxyO2lmKCFhKXRoaXMuY2VudGVyPWE9dGhpcy5nZXRDZW50ZXIoKTt0aGlzLmdldFg9ZnVuY3Rpb24oYixjKXtpPUkuYXNpbigoYi1hWzFdKS8oYVsyXS8yK2wpKTtyZXR1cm4gYVswXSsoYz8tMToxKSpZKGkpKihhWzJdLzIrbCl9O2ZvcihvPTA7bzxxO28rKylyPWtbb10sYis9biYmIXIudmlzaWJsZT8wOnIueTtmb3Iobz0wO288cTtvKyspe3I9a1tvXTtkPWI/ci55L2I6MDtnPXQoKGorYyptKSoxRTMpLzFFMztpZighbnx8ci52aXNpYmxlKWMrPWQ7aD10KChqK2MqbSkqMUUzKS8xRTM7ci5zaGFwZVR5cGU9ImFyYyI7ci5zaGFwZUFyZ3M9e3g6YVswXSx5OmFbMV0scjphWzJdLzIsaW5uZXJSOmFbM10vMixzdGFydDpnLGVuZDpofTtpPShoK2cpLzI7aT4wLjc1Km0mJihpLT0yKkphKTtyLnNsaWNlZFRyYW5zbGF0aW9uPXt0cmFuc2xhdGVYOnQoWShpKSoKZSksdHJhbnNsYXRlWTp0KGNhKGkpKmUpfTtnPVkoaSkqYVsyXS8yO2g9Y2EoaSkqYVsyXS8yO3IudG9vbHRpcFBvcz1bYVswXStnKjAuNyxhWzFdK2gqMC43XTtyLmhhbGY9aTxtLzQ/MDoxO3IuYW5nbGU9aTtmPUsoZixsLzIpO3IubGFiZWxQb3M9W2FbMF0rZytZKGkpKmwsYVsxXStoK2NhKGkpKmwsYVswXStnK1koaSkqZixhWzFdK2grY2EoaSkqZixhWzBdK2csYVsxXStoLGw8MD8iY2VudGVyIjpyLmhhbGY/InJpZ2h0IjoibGVmdCIsaV07ci5wZXJjZW50YWdlPWQqMTAwO3IudG90YWw9Yn10aGlzLnNldFRvb2x0aXBQb2ludHMoKX0sZHJhd0dyYXBoOm51bGwsZHJhd1BvaW50czpmdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1hLmNoYXJ0LnJlbmRlcmVyLGMsZCxlPWEub3B0aW9ucy5zaGFkb3csZixnO2lmKGUmJiFhLnNoYWRvd0dyb3VwKWEuc2hhZG93R3JvdXA9Yi5nKCJzaGFkb3ciKS5hZGQoYS5ncm91cCk7bihhLnBvaW50cyxmdW5jdGlvbihoKXtkPWguZ3JhcGhpYztnPWguc2hhcGVBcmdzOwpmPWguc2hhZG93R3JvdXA7aWYoZSYmIWYpZj1oLnNoYWRvd0dyb3VwPWIuZygic2hhZG93IikuYWRkKGEuc2hhZG93R3JvdXApO2M9aC5zbGljZWQ/aC5zbGljZWRUcmFuc2xhdGlvbjp7dHJhbnNsYXRlWDowLHRyYW5zbGF0ZVk6MH07ZiYmZi5hdHRyKGMpO2Q/ZC5hbmltYXRlKHYoZyxjKSk6aC5ncmFwaGljPWQ9Yi5hcmMoZykuc2V0UmFkaWFsUmVmZXJlbmNlKGEuY2VudGVyKS5hdHRyKGgucG9pbnRBdHRyW2guc2VsZWN0ZWQ/InNlbGVjdCI6IiJdKS5hdHRyKHsic3Ryb2tlLWxpbmVqb2luIjoicm91bmQifSkuYXR0cihjKS5hZGQoYS5ncm91cCkuc2hhZG93KGUsZik7aC52aXNpYmxlPT09ITEmJmguc2V0VmlzaWJsZSghMSl9KX0sZHJhd0RhdGFMYWJlbHM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9YS5kYXRhLGMsZD1hLmNoYXJ0LGU9YS5vcHRpb25zLmRhdGFMYWJlbHMsZj1vKGUuY29ubmVjdG9yUGFkZGluZywxMCksZz1vKGUuY29ubmVjdG9yV2lkdGgsMSksaD1kLnBsb3RXaWR0aCwKZD1kLnBsb3RIZWlnaHQsaSxqLGs9byhlLnNvZnRDb25uZWN0b3IsITApLG09ZS5kaXN0YW5jZSxsPWEuY2VudGVyLHA9bFsyXS8yLHM9bFsxXSxyPW0+MCx2LHcsdSx4LHk9W1tdLFtdXSxBLHosRSxILEMsRD1bMCwwLDAsMF0sSz1mdW5jdGlvbihhLGIpe3JldHVybiBiLnktYS55fSxNPWZ1bmN0aW9uKGEsYil7YS5zb3J0KGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuYW5nbGUhPT12b2lkIDAmJihjLmFuZ2xlLWEuYW5nbGUpKmJ9KX07aWYoZS5lbmFibGVkfHxhLl9oYXNQb2ludExhYmVscyl7Ui5wcm90b3R5cGUuZHJhd0RhdGFMYWJlbHMuYXBwbHkoYSk7bihiLGZ1bmN0aW9uKGEpe2EuZGF0YUxhYmVsJiZ5W2EuaGFsZl0ucHVzaChhKX0pO2ZvcihIPTA7IXgmJmJbSF07KXg9YltIXSYmYltIXS5kYXRhTGFiZWwmJihiW0hdLmRhdGFMYWJlbC5nZXRCQm94KCkuaGVpZ2h0fHwyMSksSCsrO2ZvcihIPTI7SC0tOyl7dmFyIGI9W10sTD1bXSxJPXlbSF0sSj1JLmxlbmd0aCxGO00oSSxILQowLjUpO2lmKG0+MCl7Zm9yKEM9cy1wLW07Qzw9cytwK207Qys9eCliLnB1c2goQyk7dz1iLmxlbmd0aDtpZihKPncpe2M9W10uY29uY2F0KEkpO2Muc29ydChLKTtmb3IoQz1KO0MtLTspY1tDXS5yYW5rPUM7Zm9yKEM9SjtDLS07KUlbQ10ucmFuaz49dyYmSS5zcGxpY2UoQywxKTtKPUkubGVuZ3RofWZvcihDPTA7QzxKO0MrKyl7Yz1JW0NdO3U9Yy5sYWJlbFBvcztjPTk5OTk7dmFyIE8sTjtmb3IoTj0wO048dztOKyspTz1RKGJbTl0tdVsxXSksTzxjJiYoYz1PLEY9Tik7aWYoRjxDJiZiW0NdIT09bnVsbClGPUM7ZWxzZSBmb3IodzxKLUMrRiYmYltDXSE9PW51bGwmJihGPXctSitDKTtiW0ZdPT09bnVsbDspRisrO0wucHVzaCh7aTpGLHk6YltGXX0pO2JbRl09bnVsbH1MLnNvcnQoSyl9Zm9yKEM9MDtDPEo7QysrKXtjPUlbQ107dT1jLmxhYmVsUG9zO3Y9Yy5kYXRhTGFiZWw7RT1jLnZpc2libGU9PT0hMT8iaGlkZGVuIjoidmlzaWJsZSI7Yz11WzFdO2lmKG0+MCl7aWYodz1MLnBvcCgpLApGPXcuaSx6PXcueSxjPnomJmJbRisxXSE9PW51bGx8fGM8eiYmYltGLTFdIT09bnVsbCl6PWN9ZWxzZSB6PWM7QT1lLmp1c3RpZnk/bFswXSsoSD8tMToxKSoocCttKTphLmdldFgoRj09PTB8fEY9PT1iLmxlbmd0aC0xP2M6eixIKTt2Ll9hdHRyPXt2aXNpYmlsaXR5OkUsYWxpZ246dVs2XX07di5fcG9zPXt4OkErZS54Kyh7bGVmdDpmLHJpZ2h0Oi1mfVt1WzZdXXx8MCkseTp6K2UueS0xMH07di5jb25uWD1BO3YuY29ublk9ejtpZih0aGlzLm9wdGlvbnMuc2l6ZT09PW51bGwpdz12LndpZHRoLEEtdzxmP0RbM109cSh0KHctQStmKSxEWzNdKTpBK3c+aC1mJiYoRFsxXT1xKHQoQSt3LWgrZiksRFsxXSkpLHoteC8yPDA/RFswXT1xKHQoLXoreC8yKSxEWzBdKTp6K3gvMj5kJiYoRFsyXT1xKHQoeit4LzItZCksRFsyXSkpfX1pZihwYShEKT09PTB8fHRoaXMudmVyaWZ5RGF0YUxhYmVsT3ZlcmZsb3coRCkpdGhpcy5wbGFjZURhdGFMYWJlbHMoKSxyJiZnJiZuKHRoaXMucG9pbnRzLGZ1bmN0aW9uKGIpe2k9CmIuY29ubmVjdG9yO3U9Yi5sYWJlbFBvcztpZigodj1iLmRhdGFMYWJlbCkmJnYuX3BvcylBPXYuY29ublgsej12LmNvbm5ZLGo9az9bIk0iLEErKHVbNl09PT0ibGVmdCI/NTotNSkseiwiQyIsQSx6LDIqdVsyXS11WzRdLDIqdVszXS11WzVdLHVbMl0sdVszXSwiTCIsdVs0XSx1WzVdXTpbIk0iLEErKHVbNl09PT0ibGVmdCI/NTotNSkseiwiTCIsdVsyXSx1WzNdLCJMIix1WzRdLHVbNV1dLGk/KGkuYW5pbWF0ZSh7ZDpqfSksaS5hdHRyKCJ2aXNpYmlsaXR5IixFKSk6Yi5jb25uZWN0b3I9aT1hLmNoYXJ0LnJlbmRlcmVyLnBhdGgoaikuYXR0cih7InN0cm9rZS13aWR0aCI6ZyxzdHJva2U6ZS5jb25uZWN0b3JDb2xvcnx8Yi5jb2xvcnx8IiM2MDYwNjAiLHZpc2liaWxpdHk6RX0pLmFkZChhLmdyb3VwKTtlbHNlIGlmKGkpYi5jb25uZWN0b3I9aS5kZXN0cm95KCl9KX19LHZlcmlmeURhdGFMYWJlbE92ZXJmbG93OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY2VudGVyLGM9dGhpcy5vcHRpb25zLApkPWMuY2VudGVyLGU9Yz1jLm1pblNpemV8fDgwLGY7ZFswXSE9PW51bGw/ZT1xKGJbMl0tcShhWzFdLGFbM10pLGMpOihlPXEoYlsyXS1hWzFdLWFbM10sYyksYlswXSs9KGFbM10tYVsxXSkvMik7ZFsxXSE9PW51bGw/ZT1xKEsoZSxiWzJdLXEoYVswXSxhWzJdKSksYyk6KGU9cShLKGUsYlsyXS1hWzBdLWFbMl0pLGMpLGJbMV0rPShhWzBdLWFbMl0pLzIpO2U8YlsyXT8oYlsyXT1lLHRoaXMudHJhbnNsYXRlKGIpLG4odGhpcy5wb2ludHMsZnVuY3Rpb24oYSl7aWYoYS5kYXRhTGFiZWwpYS5kYXRhTGFiZWwuX3Bvcz1udWxsfSksdGhpcy5kcmF3RGF0YUxhYmVscygpKTpmPSEwO3JldHVybiBmfSxwbGFjZURhdGFMYWJlbHM6ZnVuY3Rpb24oKXtuKHRoaXMucG9pbnRzLGZ1bmN0aW9uKGEpe3ZhciBhPWEuZGF0YUxhYmVsLGI7aWYoYSkoYj1hLl9wb3MpPyhhLmF0dHIoYS5fYXR0ciksYVthLm1vdmVkPyJhbmltYXRlIjoiYXR0ciJdKGIpLGEubW92ZWQ9ITApOmEmJmEuYXR0cih7eTotOTk5fSl9KX0sCmFsaWduRGF0YUxhYmVsOnRhLGRyYXdUcmFja2VyOkYucHJvdG90eXBlLmRyYXdUcmFja2VyLGRyYXdMZWdlbmRTeW1ib2w6TS5wcm90b3R5cGUuZHJhd0xlZ2VuZFN5bWJvbCxnZXRTeW1ib2w6dGF9O1c9ZWEoUixXKTthYS5waWU9Vzt2KEhpZ2hjaGFydHMse0F4aXM6YWIsQ2hhcnQ6c2IsQ29sb3I6bWEsTGVnZW5kOnJiLFBvaW50ZXI6cWIsUG9pbnQ6TWEsVGljazpJYSxUb29sdGlwOnBiLFJlbmRlcmVyOlNhLFNlcmllczpSLFNWR0VsZW1lbnQ6cmEsU1ZHUmVuZGVyZXI6QWEsYXJyYXlNaW46RmEsYXJyYXlNYXg6cGEsY2hhcnRzOnphLGRhdGVGb3JtYXQ6VWEsZm9ybWF0OkVhLHBhdGhBbmltOnViLGdldE9wdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm4gTn0saGFzQmlkaUJ1ZzpSYixpc1RvdWNoRGV2aWNlOktiLG51bWJlckZvcm1hdDpOYSxzZXJpZXNUeXBlczphYSxzZXRPcHRpb25zOmZ1bmN0aW9uKGEpe049eShOLGEpO0hiKCk7cmV0dXJuIE59LGFkZEV2ZW50OkoscmVtb3ZlRXZlbnQ6YmEsCmNyZWF0ZUVsZW1lbnQ6VSxkaXNjYXJkRWxlbWVudDpSYSxjc3M6TCxlYWNoOm4sZXh0ZW5kOnYsbWFwOkthLG1lcmdlOnkscGljazpvLHNwbGF0OmhhLGV4dGVuZENsYXNzOmVhLHBJbnQ6dSx3cmFwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hW2JdO2FbYl09ZnVuY3Rpb24oKXt2YXIgYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO2EudW5zaGlmdChkKTtyZXR1cm4gYy5hcHBseSh0aGlzLGEpfX0sc3ZnOlosY2FudmFzOiQsdm1sOiFaJiYhJCxwcm9kdWN0OiJIaWdoY2hhcnRzIix2ZXJzaW9uOiIzLjAuMSJ9KX0pKCk7Cg==' type='text/javascript'></script>
<script src='data:application/javascript;base64,LyoKIEhpZ2hjaGFydHMgSlMgdjMuMC4xICgyMDEzLTA0LTA5KQoKIChjKSAyMDA5LTIwMTMgVG9yc3RlaW4gSMO4bnNpCgogTGljZW5zZTogd3d3LmhpZ2hjaGFydHMuY29tL2xpY2Vuc2UKKi8KKGZ1bmN0aW9uKG0sRil7ZnVuY3Rpb24gSyhhLGIsYyl7dGhpcy5pbml0LmNhbGwodGhpcyxhLGIsYyl9ZnVuY3Rpb24gTChhLGIsYyl7YS5jYWxsKHRoaXMsYixjKTtpZih0aGlzLmNoYXJ0LnBvbGFyKXRoaXMuY2xvc2VTZWdtZW50PWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMueEF4aXMuY2VudGVyO2EucHVzaCgiTCIsY1swXSxjWzFdKX0sdGhpcy5jbG9zZWRTdGFja3M9ITB9ZnVuY3Rpb24gTShhLGIpe3ZhciBjPXRoaXMuY2hhcnQsZD10aGlzLm9wdGlvbnMuYW5pbWF0aW9uLGU9dGhpcy5ncm91cCxnPXRoaXMubWFya2VyR3JvdXAsZj10aGlzLnhBeGlzLmNlbnRlcixrPWMucGxvdExlZnQsbD1jLnBsb3RUb3A7aWYoYy5wb2xhcil7aWYoYy5yZW5kZXJlci5pc1NWRylpZihkPT09ITAmJihkPXt9KSxiKXtpZihjPXt0cmFuc2xhdGVYOmZbMF0rayx0cmFuc2xhdGVZOmZbMV0rbCxzY2FsZVg6MC4wMDEsc2NhbGVZOjAuMDAxfSxlLmF0dHIoYyksZylnLmF0dHJTZXR0ZXJzPWUuYXR0clNldHRlcnMsCmcuYXR0cihjKX1lbHNlIGM9e3RyYW5zbGF0ZVg6ayx0cmFuc2xhdGVZOmwsc2NhbGVYOjEsc2NhbGVZOjF9LGUuYW5pbWF0ZShjLGQpLGcmJmcuYW5pbWF0ZShjLGQpLHRoaXMuYW5pbWF0ZT1udWxsfWVsc2UgYS5jYWxsKHRoaXMsYil9dmFyIFE9bS5hcnJheU1pbixSPW0uYXJyYXlNYXgscz1tLmVhY2gsSD1tLmV4dGVuZCxwPW0ubWVyZ2UsUz1tLm1hcCxyPW0ucGljayx1PW0ucEludCxuPW0uZ2V0T3B0aW9ucygpLnBsb3RPcHRpb25zLGg9bS5zZXJpZXNUeXBlcyxBPW0uZXh0ZW5kQ2xhc3MsTj1tLnNwbGF0LG89bS53cmFwLE89bS5BeGlzLEI9bS5UaWNrLHo9bS5TZXJpZXMscT1oLmNvbHVtbi5wcm90b3R5cGUsdj1NYXRoLEk9di5yb3VuZCxDPXYuZmxvb3IsSj12LmNlaWwsVD12Lm1pbixVPXYubWF4LHc9ZnVuY3Rpb24oKXt9O0goSy5wcm90b3R5cGUse2luaXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMsZT1kLmRlZmF1bHRPcHRpb25zO2QuY2hhcnQ9YjtpZihiLmFuZ3VsYXIpZS5iYWNrZ3JvdW5kPQp7fTtkLm9wdGlvbnM9YT1wKGUsYSk7KGE9YS5iYWNrZ3JvdW5kKSYmcyhbXS5jb25jYXQoTihhKSkucmV2ZXJzZSgpLGZ1bmN0aW9uKGEpe3ZhciBiPWEuYmFja2dyb3VuZENvbG9yLGE9cChkLmRlZmF1bHRCYWNrZ3JvdW5kT3B0aW9ucyxhKTtpZihiKWEuYmFja2dyb3VuZENvbG9yPWI7YS5jb2xvcj1hLmJhY2tncm91bmRDb2xvcjtjLm9wdGlvbnMucGxvdEJhbmRzLnVuc2hpZnQoYSl9KX0sZGVmYXVsdE9wdGlvbnM6e2NlbnRlcjpbIjUwJSIsIjUwJSJdLHNpemU6Ijg1JSIsc3RhcnRBbmdsZTowfSxkZWZhdWx0QmFja2dyb3VuZE9wdGlvbnM6e3NoYXBlOiJjaXJjbGUiLGJvcmRlcldpZHRoOjEsYm9yZGVyQ29sb3I6InNpbHZlciIsYmFja2dyb3VuZENvbG9yOntsaW5lYXJHcmFkaWVudDp7eDE6MCx5MTowLHgyOjAseTI6MX0sc3RvcHM6W1swLCIjRkZGIl0sWzEsIiNEREQiXV19LGZyb206TnVtYmVyLk1JTl9WQUxVRSxpbm5lclJhZGl1czowLHRvOk51bWJlci5NQVhfVkFMVUUsCm91dGVyUmFkaXVzOiIxMDUlIn19KTt2YXIgRz1PLnByb3RvdHlwZSxCPUIucHJvdG90eXBlLFY9e2dldE9mZnNldDp3LHJlZHJhdzpmdW5jdGlvbigpe3RoaXMuaXNEaXJ0eT0hMX0scmVuZGVyOmZ1bmN0aW9uKCl7dGhpcy5pc0RpcnR5PSExfSxzZXRTY2FsZTp3LHNldENhdGVnb3JpZXM6dyxzZXRUaXRsZTp3fSxQPXtpc1JhZGlhbDohMCxkZWZhdWx0UmFkaWFsR2F1Z2VPcHRpb25zOntsYWJlbHM6e2FsaWduOiJjZW50ZXIiLHg6MCx5Om51bGx9LG1pbm9yR3JpZExpbmVXaWR0aDowLG1pbm9yVGlja0ludGVydmFsOiJhdXRvIixtaW5vclRpY2tMZW5ndGg6MTAsbWlub3JUaWNrUG9zaXRpb246Imluc2lkZSIsbWlub3JUaWNrV2lkdGg6MSxwbG90QmFuZHM6W10sdGlja0xlbmd0aDoxMCx0aWNrUG9zaXRpb246Imluc2lkZSIsdGlja1dpZHRoOjIsdGl0bGU6e3JvdGF0aW9uOjB9LHpJbmRleDoyfSxkZWZhdWx0UmFkaWFsWE9wdGlvbnM6e2dyaWRMaW5lV2lkdGg6MSxsYWJlbHM6e2FsaWduOm51bGwsCmRpc3RhbmNlOjE1LHg6MCx5Om51bGx9LG1heFBhZGRpbmc6MCxtaW5QYWRkaW5nOjAscGxvdEJhbmRzOltdLHNob3dMYXN0TGFiZWw6ITEsdGlja0xlbmd0aDowfSxkZWZhdWx0UmFkaWFsWU9wdGlvbnM6e2dyaWRMaW5lSW50ZXJwb2xhdGlvbjoiY2lyY2xlIixsYWJlbHM6e2FsaWduOiJyaWdodCIseDotMyx5Oi0yfSxwbG90QmFuZHM6W10sc2hvd0xhc3RMYWJlbDohMSx0aXRsZTp7eDo0LHRleHQ6bnVsbCxyb3RhdGlvbjo5MH19LHNldE9wdGlvbnM6ZnVuY3Rpb24oYSl7dGhpcy5vcHRpb25zPXAodGhpcy5kZWZhdWx0T3B0aW9ucyx0aGlzLmRlZmF1bHRSYWRpYWxPcHRpb25zLGEpfSxnZXRPZmZzZXQ6ZnVuY3Rpb24oKXtHLmdldE9mZnNldC5jYWxsKHRoaXMpO3RoaXMuY2hhcnQuYXhpc09mZnNldFt0aGlzLnNpZGVdPTA7dGhpcy5jZW50ZXI9dGhpcy5wYW5lLmNlbnRlcj1oLnBpZS5wcm90b3R5cGUuZ2V0Q2VudGVyLmNhbGwodGhpcy5wYW5lKX0sZ2V0TGluZVBhdGg6ZnVuY3Rpb24oYSwKYil7dmFyIGM9dGhpcy5jZW50ZXIsYj1yKGIsY1syXS8yLXRoaXMub2Zmc2V0KTtyZXR1cm4gdGhpcy5jaGFydC5yZW5kZXJlci5zeW1ib2xzLmFyYyh0aGlzLmxlZnQrY1swXSx0aGlzLnRvcCtjWzFdLGIsYix7c3RhcnQ6dGhpcy5zdGFydEFuZ2xlUmFkLGVuZDp0aGlzLmVuZEFuZ2xlUmFkLG9wZW46ITAsaW5uZXJSOjB9KX0sc2V0QXhpc1RyYW5zbGF0aW9uOmZ1bmN0aW9uKCl7Ry5zZXRBeGlzVHJhbnNsYXRpb24uY2FsbCh0aGlzKTtpZih0aGlzLmNlbnRlciYmKHRoaXMudHJhbnNBPXRoaXMuaXNDaXJjdWxhcj8odGhpcy5lbmRBbmdsZVJhZC10aGlzLnN0YXJ0QW5nbGVSYWQpLyh0aGlzLm1heC10aGlzLm1pbnx8MSk6dGhpcy5jZW50ZXJbMl0vMi8odGhpcy5tYXgtdGhpcy5taW58fDEpLHRoaXMuaXNYQXhpcykpdGhpcy5taW5QaXhlbFBhZGRpbmc9dGhpcy50cmFuc0EqdGhpcy5taW5Qb2ludE9mZnNldCsodGhpcy5yZXZlcnNlZD8odGhpcy5lbmRBbmdsZVJhZC10aGlzLnN0YXJ0QW5nbGVSYWQpLwo0OjApfSxiZWZvcmVTZXRUaWNrUG9zaXRpb25zOmZ1bmN0aW9uKCl7dGhpcy5hdXRvQ29ubmVjdCYmKHRoaXMubWF4Kz10aGlzLmNhdGVnb3JpZXMmJjF8fHRoaXMucG9pbnRSYW5nZXx8dGhpcy5jbG9zZXN0UG9pbnRSYW5nZSl9LHNldEF4aXNTaXplOmZ1bmN0aW9uKCl7Ry5zZXRBeGlzU2l6ZS5jYWxsKHRoaXMpO2lmKHRoaXMuY2VudGVyKXRoaXMubGVuPXRoaXMud2lkdGg9dGhpcy5oZWlnaHQ9dGhpcy5pc0NpcmN1bGFyP3RoaXMuY2VudGVyWzJdKih0aGlzLmVuZEFuZ2xlUmFkLXRoaXMuc3RhcnRBbmdsZVJhZCkvMjp0aGlzLmNlbnRlclsyXS8yfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLmlzQ2lyY3VsYXIpYj10aGlzLnRyYW5zbGF0ZShhKSxhPXRoaXMubWluO3JldHVybiB0aGlzLnBvc3RUcmFuc2xhdGUodGhpcy50cmFuc2xhdGUoYSkscihiLHRoaXMuY2VudGVyWzJdLzIpLXRoaXMub2Zmc2V0KX0scG9zdFRyYW5zbGF0ZTpmdW5jdGlvbihhLGIpe3ZhciBjPQp0aGlzLmNoYXJ0LGQ9dGhpcy5jZW50ZXIsYT10aGlzLnN0YXJ0QW5nbGVSYWQrYTtyZXR1cm57eDpjLnBsb3RMZWZ0K2RbMF0rTWF0aC5jb3MoYSkqYix5OmMucGxvdFRvcCtkWzFdK01hdGguc2luKGEpKmJ9fSxnZXRQbG90QmFuZFBhdGg6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuY2VudGVyLGU9dGhpcy5zdGFydEFuZ2xlUmFkLGc9ZFsyXS8yLGY9W3IoYy5vdXRlclJhZGl1cywiMTAwJSIpLGMuaW5uZXJSYWRpdXMscihjLnRoaWNrbmVzcywxMCldLGs9LyUkLyxsLGo9dGhpcy5pc0NpcmN1bGFyO3RoaXMub3B0aW9ucy5ncmlkTGluZUludGVycG9sYXRpb249PT0icG9seWdvbiI/ZD10aGlzLmdldFBsb3RMaW5lUGF0aChhKS5jb25jYXQodGhpcy5nZXRQbG90TGluZVBhdGgoYiwhMCkpOihqfHwoZlswXT10aGlzLnRyYW5zbGF0ZShhKSxmWzFdPXRoaXMudHJhbnNsYXRlKGIpKSxmPVMoZixmdW5jdGlvbihhKXtrLnRlc3QoYSkmJihhPXUoYSwxMCkqZy8xMDApO3JldHVybiBhfSksCmMuc2hhcGU9PT0iY2lyY2xlInx8IWo/KGE9LU1hdGguUEkvMixiPU1hdGguUEkqMS41LGw9ITApOihhPWUrdGhpcy50cmFuc2xhdGUoYSksYj1lK3RoaXMudHJhbnNsYXRlKGIpKSxkPXRoaXMuY2hhcnQucmVuZGVyZXIuc3ltYm9scy5hcmModGhpcy5sZWZ0K2RbMF0sdGhpcy50b3ArZFsxXSxmWzBdLGZbMF0se3N0YXJ0OmEsZW5kOmIsaW5uZXJSOnIoZlsxXSxmWzBdLWZbMl0pLG9wZW46bH0pKTtyZXR1cm4gZH0sZ2V0UGxvdExpbmVQYXRoOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5jZW50ZXIsZD10aGlzLmNoYXJ0LGU9dGhpcy5nZXRQb3NpdGlvbihhKSxnLGYsazt0aGlzLmlzQ2lyY3VsYXI/az1bIk0iLGNbMF0rZC5wbG90TGVmdCxjWzFdK2QucGxvdFRvcCwiTCIsZS54LGUueV06dGhpcy5vcHRpb25zLmdyaWRMaW5lSW50ZXJwb2xhdGlvbj09PSJjaXJjbGUiPyhhPXRoaXMudHJhbnNsYXRlKGEpKSYmKGs9dGhpcy5nZXRMaW5lUGF0aCgwLGEpKTooZz1kLnhBeGlzWzBdLAprPVtdLGE9dGhpcy50cmFuc2xhdGUoYSksYz1nLnRpY2tQb3NpdGlvbnMsZy5hdXRvQ29ubmVjdCYmKGM9Yy5jb25jYXQoW2NbMF1dKSksYiYmKGM9W10uY29uY2F0KGMpLnJldmVyc2UoKSkscyhjLGZ1bmN0aW9uKGMsYil7Zj1nLmdldFBvc2l0aW9uKGMsYSk7ay5wdXNoKGI/IkwiOiJNIixmLngsZi55KX0pKTtyZXR1cm4ga30sZ2V0VGl0bGVQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY2VudGVyLGI9dGhpcy5jaGFydCxjPXRoaXMub3B0aW9ucy50aXRsZTtyZXR1cm57eDpiLnBsb3RMZWZ0K2FbMF0rKGMueHx8MCkseTpiLnBsb3RUb3ArYVsxXS17aGlnaDowLjUsbWlkZGxlOjAuMjUsbG93OjB9W2MuYWxpZ25dKmFbMl0rKGMueXx8MCl9fX07byhHLCJpbml0IixmdW5jdGlvbihhLGIsYyl7dmFyIGk7dmFyIGQ9Yi5hbmd1bGFyLGU9Yi5wb2xhcixnPWMuaXNYLGY9ZCYmZyxrLGw7bD1iLm9wdGlvbnM7dmFyIGo9Yy5wYW5lfHwwO2lmKGQpe2lmKEgodGhpcyxmP1Y6UCksCms9IWcpdGhpcy5kZWZhdWx0UmFkaWFsT3B0aW9ucz10aGlzLmRlZmF1bHRSYWRpYWxHYXVnZU9wdGlvbnN9ZWxzZSBpZihlKUgodGhpcyxQKSx0aGlzLmRlZmF1bHRSYWRpYWxPcHRpb25zPShrPWcpP3RoaXMuZGVmYXVsdFJhZGlhbFhPcHRpb25zOnAodGhpcy5kZWZhdWx0WUF4aXNPcHRpb25zLHRoaXMuZGVmYXVsdFJhZGlhbFlPcHRpb25zKTthLmNhbGwodGhpcyxiLGMpO2lmKCFmJiYoZHx8ZSkpe2E9dGhpcy5vcHRpb25zO2lmKCFiLnBhbmVzKWIucGFuZXM9W107dGhpcy5wYW5lPShpPWIucGFuZXNbal09Yi5wYW5lc1tqXXx8bmV3IEsoTihsLnBhbmUpW2pdLGIsdGhpcyksaj1pKTtqPWoub3B0aW9ucztiLmludmVydGVkPSExO2wuY2hhcnQuem9vbVR5cGU9bnVsbDt0aGlzLnN0YXJ0QW5nbGVSYWQ9Yj0oai5zdGFydEFuZ2xlLTkwKSpNYXRoLlBJLzE4MDt0aGlzLmVuZEFuZ2xlUmFkPWw9KHIoai5lbmRBbmdsZSxqLnN0YXJ0QW5nbGUrMzYwKS05MCkqTWF0aC5QSS8xODA7dGhpcy5vZmZzZXQ9CmEub2Zmc2V0fHwwO2lmKCh0aGlzLmlzQ2lyY3VsYXI9aykmJmMubWF4PT09RiYmbC1iPT09MipNYXRoLlBJKXRoaXMuYXV0b0Nvbm5lY3Q9ITB9fSk7byhCLCJnZXRQb3NpdGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZz10aGlzLmF4aXM7cmV0dXJuIGcuZ2V0UG9zaXRpb24/Zy5nZXRQb3NpdGlvbihjKTphLmNhbGwodGhpcyxiLGMsZCxlKX0pO28oQiwiZ2V0TGFiZWxQb3NpdGlvbiIsZnVuY3Rpb24oYSxiLGMsZCxlLGcsZixrLGwpe3ZhciBqPXRoaXMuYXhpcyxpPWcueSxoPWcuYWxpZ24seT0oai50cmFuc2xhdGUodGhpcy5wb3MpK2ouc3RhcnRBbmdsZVJhZCtNYXRoLlBJLzIpL01hdGguUEkqMTgwO2ouaXNSYWRpYWw/KGE9ai5nZXRQb3NpdGlvbih0aGlzLnBvcyxqLmNlbnRlclsyXS8yK3IoZy5kaXN0YW5jZSwtMjUpKSxnLnJvdGF0aW9uPT09ImF1dG8iP2QuYXR0cih7cm90YXRpb246eX0pOmk9PT1udWxsJiYoaT11KGQuc3R5bGVzLmxpbmVIZWlnaHQpKjAuOS1kLmdldEJCb3goKS5oZWlnaHQvCjIpLGg9PT1udWxsJiYoaD1qLmlzQ2lyY3VsYXI/eT4yMCYmeTwxNjA/ImxlZnQiOnk+MjAwJiZ5PDM0MD8icmlnaHQiOiJjZW50ZXIiOiJjZW50ZXIiLGQuYXR0cih7YWxpZ246aH0pKSxhLngrPWcueCxhLnkrPWkpOmE9YS5jYWxsKHRoaXMsYixjLGQsZSxnLGYsayxsKTtyZXR1cm4gYX0pO28oQiwiZ2V0TWFya1BhdGgiLGZ1bmN0aW9uKGEsYixjLGQsZSxnLGYpe3ZhciBrPXRoaXMuYXhpcztrLmlzUmFkaWFsPyhhPWsuZ2V0UG9zaXRpb24odGhpcy5wb3Msay5jZW50ZXJbMl0vMitkKSxiPVsiTSIsYixjLCJMIixhLngsYS55XSk6Yj1hLmNhbGwodGhpcyxiLGMsZCxlLGcsZik7cmV0dXJuIGJ9KTtuLmFyZWFyYW5nZT1wKG4uYXJlYSx7bGluZVdpZHRoOjEsbWFya2VyOm51bGwsdGhyZXNob2xkOm51bGwsdG9vbHRpcDp7cG9pbnRGb3JtYXQ6JzxzcGFuIHN0eWxlPSJjb2xvcjp7c2VyaWVzLmNvbG9yfSI+e3Nlcmllcy5uYW1lfTwvc3Bhbj46IDxiPntwb2ludC5sb3d9PC9iPiAtIDxiPntwb2ludC5oaWdofTwvYj48YnIvPid9LAp0cmFja0J5QXJlYTohMCxkYXRhTGFiZWxzOnt2ZXJ0aWNhbEFsaWduOm51bGwseExvdzowLHhIaWdoOjAseUxvdzowLHlIaWdoOjB9fSk7aC5hcmVhcmFuZ2U9bS5leHRlbmRDbGFzcyhoLmFyZWEse3R5cGU6ImFyZWFyYW5nZSIscG9pbnRBcnJheU1hcDpbImxvdyIsImhpZ2giXSx0b1lEYXRhOmZ1bmN0aW9uKGEpe3JldHVyblthLmxvdyxhLmhpZ2hdfSxwb2ludFZhbEtleToibG93Iix0cmFuc2xhdGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnlBeGlzO2guYXJlYS5wcm90b3R5cGUudHJhbnNsYXRlLmFwcGx5KHRoaXMpO3ModGhpcy5wb2ludHMsZnVuY3Rpb24oYil7aWYoYi55IT09bnVsbCliLnBsb3RMb3c9Yi5wbG90WSxiLnBsb3RIaWdoPWEudHJhbnNsYXRlKGIuaGlnaCwwLDEsMCwxKX0pfSxnZXRTZWdtZW50UGF0aDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPWEubGVuZ3RoLGQ9ei5wcm90b3R5cGUuZ2V0U2VnbWVudFBhdGgsZSxnO2c9dGhpcy5vcHRpb25zO2Zvcih2YXIgZj0KZy5zdGVwO2MtLTspZT1hW2NdLGIucHVzaCh7cGxvdFg6ZS5wbG90WCxwbG90WTplLnBsb3RIaWdofSk7YT1kLmNhbGwodGhpcyxhKTtpZihmKWY9PT0hMCYmKGY9ImxlZnQiKSxnLnN0ZXA9e2xlZnQ6InJpZ2h0IixjZW50ZXI6ImNlbnRlciIscmlnaHQ6ImxlZnQifVtmXTtiPWQuY2FsbCh0aGlzLGIpO2cuc3RlcD1mO2c9W10uY29uY2F0KGEsYik7YlswXT0iTCI7dGhpcy5hcmVhUGF0aD10aGlzLmFyZWFQYXRoLmNvbmNhdChhLGIpO3JldHVybiBnfSxkcmF3RGF0YUxhYmVsczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZGF0YSxiPWEubGVuZ3RoLGMsZD1bXSxlPXoucHJvdG90eXBlLGc9dGhpcy5vcHRpb25zLmRhdGFMYWJlbHMsZixrPXRoaXMuY2hhcnQuaW52ZXJ0ZWQ7aWYoZy5lbmFibGVkfHx0aGlzLl9oYXNQb2ludExhYmVscyl7Zm9yKGM9YjtjLS07KWY9YVtjXSxmLnk9Zi5oaWdoLGYucGxvdFk9Zi5wbG90SGlnaCxkW2NdPWYuZGF0YUxhYmVsLGYuZGF0YUxhYmVsPWYuZGF0YUxhYmVsVXBwZXIsCmYuYmVsb3c9ITEsaz8oZy5hbGlnbj0ibGVmdCIsZy54PWcueEhpZ2gpOmcueT1nLnlIaWdoO2UuZHJhd0RhdGFMYWJlbHMuYXBwbHkodGhpcyxhcmd1bWVudHMpO2ZvcihjPWI7Yy0tOylmPWFbY10sZi5kYXRhTGFiZWxVcHBlcj1mLmRhdGFMYWJlbCxmLmRhdGFMYWJlbD1kW2NdLGYueT1mLmxvdyxmLnBsb3RZPWYucGxvdExvdyxmLmJlbG93PSEwLGs/KGcuYWxpZ249InJpZ2h0IixnLng9Zy54TG93KTpnLnk9Zy55TG93O2UuZHJhd0RhdGFMYWJlbHMuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0sYWxpZ25EYXRhTGFiZWw6aC5jb2x1bW4ucHJvdG90eXBlLmFsaWduRGF0YUxhYmVsLGdldFN5bWJvbDpoLmNvbHVtbi5wcm90b3R5cGUuZ2V0U3ltYm9sLGRyYXdQb2ludHM6d30pO24uYXJlYXNwbGluZXJhbmdlPXAobi5hcmVhcmFuZ2UpO2guYXJlYXNwbGluZXJhbmdlPUEoaC5hcmVhcmFuZ2Use3R5cGU6ImFyZWFzcGxpbmVyYW5nZSIsZ2V0UG9pbnRTcGxpbmU6aC5zcGxpbmUucHJvdG90eXBlLmdldFBvaW50U3BsaW5lfSk7Cm4uY29sdW1ucmFuZ2U9cChuLmNvbHVtbixuLmFyZWFyYW5nZSx7bGluZVdpZHRoOjEscG9pbnRSYW5nZTpudWxsfSk7aC5jb2x1bW5yYW5nZT1BKGguYXJlYXJhbmdlLHt0eXBlOiJjb2x1bW5yYW5nZSIsdHJhbnNsYXRlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy55QXhpcyxiO3EudHJhbnNsYXRlLmFwcGx5KHRoaXMpO3ModGhpcy5wb2ludHMsZnVuY3Rpb24oYyl7dmFyIGQ9Yy5zaGFwZUFyZ3M7Yy5wbG90SGlnaD1iPWEudHJhbnNsYXRlKGMuaGlnaCwwLDEsMCwxKTtjLnBsb3RMb3c9Yy5wbG90WTtkLnk9YjtkLmhlaWdodD1jLnBsb3RZLWJ9KX0sdHJhY2tlckdyb3VwczpbImdyb3VwIiwiZGF0YUxhYmVscyJdLGRyYXdHcmFwaDp3LHBvaW50QXR0clRvT3B0aW9uczpxLnBvaW50QXR0clRvT3B0aW9ucyxkcmF3UG9pbnRzOnEuZHJhd1BvaW50cyxkcmF3VHJhY2tlcjpxLmRyYXdUcmFja2VyLGFuaW1hdGU6cS5hbmltYXRlLGdldENvbHVtbk1ldHJpY3M6cS5nZXRDb2x1bW5NZXRyaWNzfSk7Cm4uZ2F1Z2U9cChuLmxpbmUse2RhdGFMYWJlbHM6e2VuYWJsZWQ6ITAseToxNSxib3JkZXJXaWR0aDoxLGJvcmRlckNvbG9yOiJzaWx2ZXIiLGJvcmRlclJhZGl1czozLHN0eWxlOntmb250V2VpZ2h0OiJib2xkIn0sdmVydGljYWxBbGlnbjoidG9wIix6SW5kZXg6Mn0sZGlhbDp7fSxwaXZvdDp7fSx0b29sdGlwOntoZWFkZXJGb3JtYXQ6IiJ9LHNob3dJbkxlZ2VuZDohMX0pO0I9e3R5cGU6ImdhdWdlIixwb2ludENsYXNzOm0uZXh0ZW5kQ2xhc3MobS5Qb2ludCx7c2V0U3RhdGU6ZnVuY3Rpb24oYSl7dGhpcy5zdGF0ZT1hfX0pLGFuZ3VsYXI6ITAsZHJhd0dyYXBoOncsdHJhY2tlckdyb3VwczpbImdyb3VwIiwiZGF0YUxhYmVscyJdLHRyYW5zbGF0ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMueUF4aXMsYj10aGlzLm9wdGlvbnMsYz1hLmNlbnRlcjt0aGlzLmdlbmVyYXRlUG9pbnRzKCk7cyh0aGlzLnBvaW50cyxmdW5jdGlvbihkKXt2YXIgZT1wKGIuZGlhbCxkLmRpYWwpLGc9dShyKGUucmFkaXVzLAo4MCkpKmNbMl0vMjAwLGY9dShyKGUuYmFzZUxlbmd0aCw3MCkpKmcvMTAwLGs9dShyKGUucmVhckxlbmd0aCwxMCkpKmcvMTAwLGw9ZS5iYXNlV2lkdGh8fDMsaj1lLnRvcFdpZHRofHwxLGk9YS5zdGFydEFuZ2xlUmFkK2EudHJhbnNsYXRlKGQueSxudWxsLG51bGwsbnVsbCwhMCk7Yi53cmFwPT09ITEmJihpPU1hdGgubWF4KGEuc3RhcnRBbmdsZVJhZCxNYXRoLm1pbihhLmVuZEFuZ2xlUmFkLGkpKSk7aT1pKjE4MC9NYXRoLlBJO2Quc2hhcGVUeXBlPSJwYXRoIjtkLnNoYXBlQXJncz17ZDplLnBhdGh8fFsiTSIsLWssLWwvMiwiTCIsZiwtbC8yLGcsLWovMixnLGovMixmLGwvMiwtayxsLzIsInoiXSx0cmFuc2xhdGVYOmNbMF0sdHJhbnNsYXRlWTpjWzFdLHJvdGF0aW9uOml9O2QucGxvdFg9Y1swXTtkLnBsb3RZPWNbMV19KX0sZHJhd1BvaW50czpmdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1hLnlBeGlzLmNlbnRlcixjPWEucGl2b3QsZD1hLm9wdGlvbnMsZT1kLnBpdm90LGc9YS5jaGFydC5yZW5kZXJlcjsKcyhhLnBvaW50cyxmdW5jdGlvbihjKXt2YXIgYj1jLmdyYXBoaWMsZT1jLnNoYXBlQXJncyxqPWUuZCxpPXAoZC5kaWFsLGMuZGlhbCk7Yj8oYi5hbmltYXRlKGUpLGUuZD1qKTpjLmdyYXBoaWM9Z1tjLnNoYXBlVHlwZV0oZSkuYXR0cih7c3Ryb2tlOmkuYm9yZGVyQ29sb3J8fCJub25lIiwic3Ryb2tlLXdpZHRoIjppLmJvcmRlcldpZHRofHwwLGZpbGw6aS5iYWNrZ3JvdW5kQ29sb3J8fCJibGFjayIscm90YXRpb246ZS5yb3RhdGlvbn0pLmFkZChhLmdyb3VwKX0pO2M/Yy5hbmltYXRlKHt0cmFuc2xhdGVYOmJbMF0sdHJhbnNsYXRlWTpiWzFdfSk6YS5waXZvdD1nLmNpcmNsZSgwLDAscihlLnJhZGl1cyw1KSkuYXR0cih7InN0cm9rZS13aWR0aCI6ZS5ib3JkZXJXaWR0aHx8MCxzdHJva2U6ZS5ib3JkZXJDb2xvcnx8InNpbHZlciIsZmlsbDplLmJhY2tncm91bmRDb2xvcnx8ImJsYWNrIn0pLnRyYW5zbGF0ZShiWzBdLGJbMV0pLmFkZChhLmdyb3VwKX0sYW5pbWF0ZTpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcztpZighYSlzKGIucG9pbnRzLGZ1bmN0aW9uKGEpe3ZhciBkPWEuZ3JhcGhpYztkJiYoZC5hdHRyKHtyb3RhdGlvbjpiLnlBeGlzLnN0YXJ0QW5nbGVSYWQqMTgwL01hdGguUEl9KSxkLmFuaW1hdGUoe3JvdGF0aW9uOmEuc2hhcGVBcmdzLnJvdGF0aW9ufSxiLm9wdGlvbnMuYW5pbWF0aW9uKSl9KSxiLmFuaW1hdGU9bnVsbH0scmVuZGVyOmZ1bmN0aW9uKCl7dGhpcy5ncm91cD10aGlzLnBsb3RHcm91cCgiZ3JvdXAiLCJzZXJpZXMiLHRoaXMudmlzaWJsZT8idmlzaWJsZSI6ImhpZGRlbiIsdGhpcy5vcHRpb25zLnpJbmRleCx0aGlzLmNoYXJ0LnNlcmllc0dyb3VwKTtoLnBpZS5wcm90b3R5cGUucmVuZGVyLmNhbGwodGhpcyk7dGhpcy5ncm91cC5jbGlwKHRoaXMuY2hhcnQuY2xpcFJlY3QpfSxzZXREYXRhOmgucGllLnByb3RvdHlwZS5zZXREYXRhLGRyYXdUcmFja2VyOmguY29sdW1uLnByb3RvdHlwZS5kcmF3VHJhY2tlcn07aC5nYXVnZT1tLmV4dGVuZENsYXNzKGgubGluZSwKQik7bi5ib3hwbG90PXAobi5jb2x1bW4se2ZpbGxDb2xvcjoiI0ZGRkZGRiIsbGluZVdpZHRoOjEsbWVkaWFuV2lkdGg6MixzdGF0ZXM6e2hvdmVyOnticmlnaHRuZXNzOi0wLjN9fSx0aHJlc2hvbGQ6bnVsbCx0b29sdGlwOntwb2ludEZvcm1hdDonPHNwYW4gc3R5bGU9ImNvbG9yOntzZXJpZXMuY29sb3J9O2ZvbnQtd2VpZ2h0OmJvbGQiPntzZXJpZXMubmFtZX08L3NwYW4+PGJyLz5NaW5pbXVtOiB7cG9pbnQubG93fTxici8+TG93ZXIgcXVhcnRpbGU6IHtwb2ludC5xMX08YnIvPk1lZGlhbjoge3BvaW50Lm1lZGlhbn08YnIvPkhpZ2hlciBxdWFydGlsZToge3BvaW50LnEzfTxici8+TWF4aW11bToge3BvaW50LmhpZ2h9PGJyLz4nfSx3aGlza2VyTGVuZ3RoOiI1MCUiLHdoaXNrZXJXaWR0aDoyfSk7aC5ib3hwbG90PUEoaC5jb2x1bW4se3R5cGU6ImJveHBsb3QiLHBvaW50QXJyYXlNYXA6WyJsb3ciLCJxMSIsIm1lZGlhbiIsInEzIiwiaGlnaCJdLHRvWURhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuW2EubG93LAphLnExLGEubWVkaWFuLGEucTMsYS5oaWdoXX0scG9pbnRWYWxLZXk6ImhpZ2giLHBvaW50QXR0clRvT3B0aW9uczp7ZmlsbDoiZmlsbENvbG9yIixzdHJva2U6ImNvbG9yIiwic3Ryb2tlLXdpZHRoIjoibGluZVdpZHRoIn0sZHJhd0RhdGFMYWJlbHM6dyx0cmFuc2xhdGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnlBeGlzLGI9dGhpcy5wb2ludEFycmF5TWFwO2guY29sdW1uLnByb3RvdHlwZS50cmFuc2xhdGUuYXBwbHkodGhpcyk7cyh0aGlzLnBvaW50cyxmdW5jdGlvbihjKXtzKGIsZnVuY3Rpb24oYil7Y1tiXSE9PW51bGwmJihjW2IrIlBsb3QiXT1hLnRyYW5zbGF0ZShjW2JdLDAsMSwwLDEpKX0pfSl9LGRyYXdQb2ludHM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9YS5wb2ludHMsYz1hLm9wdGlvbnMsZD1hLmNoYXJ0LnJlbmRlcmVyLGUsZyxmLGssbCxqLGksaCx5LG0sdCxuLHIseCxvLHAsdixxLHcsdSxCLEEsej1hLmRvUXVhcnRpbGVzIT09ITEsRD1wYXJzZUludChhLm9wdGlvbnMud2hpc2tlckxlbmd0aCwKMTApLzEwMDtzKGIsZnVuY3Rpb24oYil7eT1iLmdyYXBoaWM7Qj1iLnNoYXBlQXJnczt0PXt9O3g9e307cD17fTtBPWIuY29sb3J8fGEuY29sb3I7aWYoYi5wbG90WSE9PUYpaWYoZT1iLnBvaW50QXR0cltiLnNlbGVjdGVkPyJzZWxlY3RlZCI6IiJdLHY9Qi53aWR0aCxxPUMoQi54KSx3PXErdix1PUkodi8yKSxnPUMoej9iLnExUGxvdDpiLmxvd1Bsb3QpLGY9Qyh6P2IucTNQbG90OmIubG93UGxvdCksaz1DKGIuaGlnaFBsb3QpLGw9QyhiLmxvd1Bsb3QpLHQuc3Ryb2tlPWIuc3RlbUNvbG9yfHxjLnN0ZW1Db2xvcnx8QSx0WyJzdHJva2Utd2lkdGgiXT1iLnN0ZW1XaWR0aHx8Yy5zdGVtV2lkdGh8fGMubGluZVdpZHRoLHQuZGFzaHN0eWxlPWIuc3RlbURhc2hTdHlsZXx8Yy5zdGVtRGFzaFN0eWxlLHguc3Ryb2tlPWIud2hpc2tlckNvbG9yfHxjLndoaXNrZXJDb2xvcnx8QSx4WyJzdHJva2Utd2lkdGgiXT1iLndoaXNrZXJXaWR0aHx8Yy53aGlza2VyV2lkdGh8fGMubGluZVdpZHRoLApwLnN0cm9rZT1iLm1lZGlhbkNvbG9yfHxjLm1lZGlhbkNvbG9yfHxBLHBbInN0cm9rZS13aWR0aCJdPWIubWVkaWFuV2lkdGh8fGMubWVkaWFuV2lkdGh8fGMubGluZVdpZHRoLGk9dFsic3Ryb2tlLXdpZHRoIl0lMi8yLGg9cSt1K2ksbT1bIk0iLGgsZiwiTCIsaCxrLCJNIixoLGcsIkwiLGgsbCwieiJdLHomJihpPWVbInN0cm9rZS13aWR0aCJdJTIvMixoPUMoaCkraSxnPUMoZykraSxmPUMoZikraSxxKz1pLHcrPWksbj1bIk0iLHEsZiwiTCIscSxnLCJMIix3LGcsIkwiLHcsZiwiTCIscSxmLCJ6Il0pLEQmJihpPXhbInN0cm9rZS13aWR0aCJdJTIvMixrKz1pLGwrPWkscj1bIk0iLGgtdSpELGssIkwiLGgrdSpELGssIk0iLGgtdSpELGwsIkwiLGgrdSpELGxdKSxpPXBbInN0cm9rZS13aWR0aCJdJTIvMixqPUkoYi5tZWRpYW5QbG90KStpLG89WyJNIixxLGosIkwiLHcsaiwieiJdLHkpYi5zdGVtLmFuaW1hdGUoe2Q6bX0pLEQmJmIud2hpc2tlcnMuYW5pbWF0ZSh7ZDpyfSkseiYmCmIuYm94LmFuaW1hdGUoe2Q6bn0pLGIubWVkaWFuU2hhcGUuYW5pbWF0ZSh7ZDpvfSk7ZWxzZXtiLmdyYXBoaWM9eT1kLmcoKS5hZGQoYS5ncm91cCk7Yi5zdGVtPWQucGF0aChtKS5hdHRyKHQpLmFkZCh5KTtpZihEKWIud2hpc2tlcnM9ZC5wYXRoKHIpLmF0dHIoeCkuYWRkKHkpO2lmKHopYi5ib3g9ZC5wYXRoKG4pLmF0dHIoZSkuYWRkKHkpO2IubWVkaWFuU2hhcGU9ZC5wYXRoKG8pLmF0dHIocCkuYWRkKHkpfX0pfX0pO24uZXJyb3JiYXI9cChuLmJveHBsb3Qse2NvbG9yOiIjMDAwMDAwIixncm91cGluZzohMSxsaW5rZWRUbzoiOnByZXZpb3VzIix0b29sdGlwOntwb2ludEZvcm1hdDpuLmFyZWFyYW5nZS50b29sdGlwLnBvaW50Rm9ybWF0fSx3aGlza2VyV2lkdGg6bnVsbH0pO2guZXJyb3JiYXI9QShoLmJveHBsb3Qse3R5cGU6ImVycm9yYmFyIixwb2ludEFycmF5TWFwOlsibG93IiwiaGlnaCJdLHRvWURhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuW2EubG93LGEuaGlnaF19LHBvaW50VmFsS2V5OiJoaWdoIiwKZG9RdWFydGlsZXM6ITEsZ2V0Q29sdW1uTWV0cmljczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxpbmtlZFBhcmVudCYmdGhpcy5saW5rZWRQYXJlbnQuY29sdW1uTWV0cmljc3x8aC5jb2x1bW4ucHJvdG90eXBlLmdldENvbHVtbk1ldHJpY3MuY2FsbCh0aGlzKX19KTtvKEcsImdldFNlcmllc0V4dHJlbWVzIixmdW5jdGlvbihhLGIpe2EuY2FsbCh0aGlzLGIpO2lmKCF0aGlzLmlzWEF4aXMpe3ZhciBjPXRoaXMsZD1bXSxlPSEwO3MoYy5zZXJpZXMsZnVuY3Rpb24oYSl7aWYoYS52aXNpYmxlJiZhLnN0YWNrS2V5JiYhKGEudHlwZSE9PSJ3YXRlcmZhbGwifHxIaWdoY2hhcnRzQWRhcHRlci5pbkFycmF5KGEuc3RhY2tLZXkpIT09LTEpKXtpZihlKWMuZGF0YU1pbj1jLmRhdGFNYXg9bnVsbCxlPSExO3ZhciBiPWEucHJvY2Vzc2VkWURhdGEsaz1iLmxlbmd0aCxoPWJbMF0saj1iWzBdLGk9YS5vcHRpb25zLnRocmVzaG9sZCxtPWMuc3RhY2tzLG49YS5zdGFja0tleSxwPSItIituLHQsCm8scSx4O2Zvcih4PTA7eDxrO3grKyl7cT1iW3hdPGk/cDpuO3Q9bVtxXVt4XS50b3RhbDtpZih4PmkpdCs9byxtW3FdW3hdLnNldFRvdGFsKHQpLG1bcV1beF0uX2N1bT1udWxsO3Q8aCYmKGg9dCk7dD5qJiYoaj10KTtvPXR9YS5kYXRhTWluPWg7YS5kYXRhTWF4PWo7Yy5kYXRhTWluPVQocihjLmRhdGFNaW4saCksaCxpKTtjLmRhdGFNYXg9VShyKGMuZGF0YU1heCxqKSxqLGkpO2QucHVzaChhLnN0YWNrS2V5KTtpZih0eXBlb2YgaT09PSJudW1iZXIiKWlmKGMuZGF0YU1pbj49aSljLmRhdGFNaW49aSxjLmlnbm9yZU1pblBhZGRpbmc9ITA7ZWxzZSBpZihjLmRhdGFNYXg8aSljLmRhdGFNYXg9aSxjLmlnbm9yZU1heFBhZGRpbmc9ITB9fSl9fSk7bi53YXRlcmZhbGw9cChuLmNvbHVtbix7bGluZVdpZHRoOjEsbGluZUNvbG9yOiIjMzMzIixkYXNoU3R5bGU6ImRvdCIsYm9yZGVyQ29sb3I6IiMzMzMifSk7aC53YXRlcmZhbGw9QShoLmNvbHVtbix7dHlwZToid2F0ZXJmYWxsIix1cENvbG9yUHJvcDoiZmlsbCIsCnBvaW50QXJyYXlNYXA6WyJ5IiwibG93Il0scG9pbnRWYWxLZXk6InkiLGluaXQ6ZnVuY3Rpb24oYSxiKXtiLnN0YWNraW5nPSEwO2guY29sdW1uLnByb3RvdHlwZS5pbml0LmNhbGwodGhpcyxhLGIpfSx0cmFuc2xhdGU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnlBeGlzLGIsYyxkLGUsZyxmLGssbCxqLGksbSxuLG89dGhpcy5vcHRpb25zLmJvcmRlcldpZHRoJTIvMjtoLmNvbHVtbi5wcm90b3R5cGUudHJhbnNsYXRlLmFwcGx5KHRoaXMpO2Q9dGhpcy5wb2ludHM7aj1rPWRbMF07Zj1sPWRbMF0ueTtmb3IoYz0xLGI9ZC5sZW5ndGg7YzxiO2MrKyllPWRbY10sZz1lLnNoYXBlQXJncyxpPXRoaXMuZ2V0U3RhY2soYyksbT10aGlzLmdldFN0YWNrKGMtMSksbj10aGlzLmdldFN0YWNrWShtKSxqPT09bnVsbCYmKGo9ZSxsPTApLGUueSYmIWUuaXNTdW0mJiFlLmlzSW50ZXJtZWRpYXRlU3VtJiYoZis9ZS55LGwrPWUueSksZS5pc1N1bXx8ZS5pc0ludGVybWVkaWF0ZVN1bT8oZS5pc0ludGVybWVkaWF0ZVN1bT8KKGk9dGhpcy5nZXRTdW1FZGdlcyhqLGRbYy0xXSksZS55PWwsaj1udWxsKTooaT10aGlzLmdldFN1bUVkZ2VzKGssZFtjLTFdKSxlLnk9ZiksZy55PWUucGxvdFk9aVsxXSxnLmhlaWdodD1pWzBdLWlbMV0pOmUueTwwPyhtPWkuX2N1bT09PW51bGw/bS50b3RhbDppLl9jdW0saS5fY3VtPW0rZS55LGU9SihhLnRyYW5zbGF0ZShtLDAsMSkpLW8saT1hLnRyYW5zbGF0ZShpLl9jdW0sMCwxKSxnLnk9ZSxnLmhlaWdodD1KKGktZSkpOmcuaGVpZ2h0PUMobi1nLnkpfSxwcm9jZXNzRGF0YTpmdW5jdGlvbihhKXt6LnByb3RvdHlwZS5wcm9jZXNzRGF0YS5jYWxsKHRoaXMsYSk7dmFyIGE9dGhpcy55RGF0YSxiPWEubGVuZ3RoLGMsZDtmb3IoZD0wO2Q8YjtkKyspYz1hW2RdLGMhPT1udWxsJiZ0eXBlb2YgYyE9PSJudW1iZXIiJiYoYVtkXT1jPT09InN1bSI/bnVsbDpjPT09ImludGVybWVkaWF0ZVN1bSI/bnVsbDpjWzBdKX0sdG9ZRGF0YTpmdW5jdGlvbihhKXtpZihhLmlzU3VtKXJldHVybiJzdW0iOwplbHNlIGlmKGEuaXNJbnRlcm1lZGlhdGVTdW0pcmV0dXJuImludGVybWVkaWF0ZVN1bSI7cmV0dXJuW2EueV19LGdldEF0dHJpYnM6ZnVuY3Rpb24oKXtoLmNvbHVtbi5wcm90b3R5cGUuZ2V0QXR0cmlicy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGE9dGhpcy5vcHRpb25zLGI9YS5zdGF0ZXMsYz1hLnVwQ29sb3J8fHRoaXMuY29sb3IsYT1tLkNvbG9yKGMpLmJyaWdodGVuKDAuMSkuZ2V0KCksZD1wKHRoaXMucG9pbnRBdHRyKSxlPXRoaXMudXBDb2xvclByb3A7ZFsiIl1bZV09YztkLmhvdmVyW2VdPWIuaG92ZXIudXBDb2xvcnx8YTtkLnNlbGVjdFtlXT1iLnNlbGVjdC51cENvbG9yfHxjO3ModGhpcy5wb2ludHMsZnVuY3Rpb24oYSl7aWYoYS55PjAmJiFhLmNvbG9yKWEucG9pbnRBdHRyPWQsYS5jb2xvcj1jfSl9LGdldEdyYXBoUGF0aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZGF0YSxiPWEubGVuZ3RoLGM9SSh0aGlzLm9wdGlvbnMubGluZVdpZHRoK3RoaXMub3B0aW9ucy5ib3JkZXJXaWR0aCklCjIvMixkPVtdLGUsZyxmO2ZvcihmPTE7ZjxiO2YrKylnPWFbZl0uc2hhcGVBcmdzLGU9YVtmLTFdLnNoYXBlQXJncyxnPVsiTSIsZS54K2Uud2lkdGgsZS55K2MsIkwiLGcueCxlLnkrY10sYVtmLTFdLnk8MCYmKGdbMl0rPWUuaGVpZ2h0LGdbNV0rPWUuaGVpZ2h0KSxkPWQuY29uY2F0KGcpO3JldHVybiBkfSxnZXRTdGFjazpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnlBeGlzLnN0YWNrcyxjPXRoaXMuc3RhY2tLZXk7dGhpcy5wcm9jZXNzZWRZRGF0YVthXTx0aGlzLm9wdGlvbnMudGhyZXNob2xkJiYoYz0iLSIrYyk7cmV0dXJuIGJbY11bYV19LGdldFN0YWNrWTpmdW5jdGlvbihhKXtyZXR1cm4gSih0aGlzLnlBeGlzLnRyYW5zbGF0ZShhLnRvdGFsLG51bGwsITApKX0sZ2V0U3VtRWRnZXM6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU7ZD10aGlzLm9wdGlvbnMudGhyZXNob2xkO2M9YS55Pj1kP2Euc2hhcGVBcmdzLnkrYS5zaGFwZUFyZ3MuaGVpZ2h0OmEuc2hhcGVBcmdzLnk7ZD1iLnk+PQpkP2Iuc2hhcGVBcmdzLnk6Yi5zaGFwZUFyZ3MueStiLnNoYXBlQXJncy5oZWlnaHQ7ZD5jJiYoZT1jLGM9ZCxkPWUpO3JldHVybltjLGRdfSxkcmF3R3JhcGg6ei5wcm90b3R5cGUuZHJhd0dyYXBofSk7bi5idWJibGU9cChuLnNjYXR0ZXIse2RhdGFMYWJlbHM6e2luc2lkZTohMCxzdHlsZTp7Y29sb3I6IndoaXRlIix0ZXh0U2hhZG93OiIwcHggMHB4IDNweCBibGFjayJ9LHZlcnRpY2FsQWxpZ246Im1pZGRsZSJ9LG1hcmtlcjp7bGluZUNvbG9yOm51bGwsbGluZVdpZHRoOjF9LG1pblNpemU6OCxtYXhTaXplOiIyMCUiLHRvb2x0aXA6e3BvaW50Rm9ybWF0OiIoe3BvaW50Lnh9LCB7cG9pbnQueX0pLCBTaXplOiB7cG9pbnQuen0ifSx6VGhyZXNob2xkOjB9KTtoLmJ1YmJsZT1BKGguc2NhdHRlcix7dHlwZToiYnViYmxlIixwb2ludEFycmF5TWFwOlsieSIsInoiXSx0cmFja2VyR3JvdXBzOlsiZ3JvdXAiLCJkYXRhTGFiZWxzR3JvdXAiXSxwb2ludEF0dHJUb09wdGlvbnM6e3N0cm9rZToibGluZUNvbG9yIiwKInN0cm9rZS13aWR0aCI6ImxpbmVXaWR0aCIsZmlsbDoiZmlsbENvbG9yIn0sYXBwbHlPcGFjaXR5OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5tYXJrZXIsYz1yKGIuZmlsbE9wYWNpdHksMC41KSxhPWF8fGIuZmlsbENvbG9yfHx0aGlzLmNvbG9yO2MhPT0xJiYoYT1tLkNvbG9yKGEpLnNldE9wYWNpdHkoYykuZ2V0KCJyZ2JhIikpO3JldHVybiBhfSxjb252ZXJ0QXR0cmliczpmdW5jdGlvbigpe3ZhciBhPXoucHJvdG90eXBlLmNvbnZlcnRBdHRyaWJzLmFwcGx5KHRoaXMsYXJndW1lbnRzKTthLmZpbGw9dGhpcy5hcHBseU9wYWNpdHkoYS5maWxsKTtyZXR1cm4gYX0sZ2V0UmFkaWk6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZyxmLGs9dGhpcy56RGF0YSxoPVtdO2ZvcihnPTAsZT1rLmxlbmd0aDtnPGU7ZysrKWY9Yi1hLGY9Zj4wPyhrW2ddLWEpLyhiLWEpOjAuNSxoLnB1c2godi5yb3VuZChjK2YqKGQtYykpLzIpO3RoaXMucmFkaWk9aH0sYW5pbWF0ZTpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5vcHRpb25zLmFuaW1hdGlvbjtpZighYSlzKHRoaXMucG9pbnRzLGZ1bmN0aW9uKGEpe3ZhciBkPWEuZ3JhcGhpYyxhPWEuc2hhcGVBcmdzO2QmJmEmJihkLmF0dHIoInIiLDEpLGQuYW5pbWF0ZSh7cjphLnJ9LGIpKX0pLHRoaXMuYW5pbWF0ZT1udWxsfSx0cmFuc2xhdGU6ZnVuY3Rpb24oKXt2YXIgYSxiPXRoaXMuZGF0YSxjLGQsZT10aGlzLnJhZGlpO2guc2NhdHRlci5wcm90b3R5cGUudHJhbnNsYXRlLmNhbGwodGhpcyk7Zm9yKGE9Yi5sZW5ndGg7YS0tOyljPWJbYV0sZD1lW2FdLGMubmVnYXRpdmU9Yy56PCh0aGlzLm9wdGlvbnMuelRocmVzaG9sZHx8MCksZD49dGhpcy5taW5QeFNpemUvMj8oYy5zaGFwZVR5cGU9ImNpcmNsZSIsYy5zaGFwZUFyZ3M9e3g6Yy5wbG90WCx5OmMucGxvdFkscjpkfSxjLmRsQm94PXt4OmMucGxvdFgtZCx5OmMucGxvdFktZCx3aWR0aDoyKmQsaGVpZ2h0OjIqZH0pOmMuc2hhcGVBcmdzPWMucGxvdFk9Yy5kbEJveD1GfSxkcmF3TGVnZW5kU3ltYm9sOmZ1bmN0aW9uKGEsCmIpe3ZhciBjPXUoYS5pdGVtU3R5bGUuZm9udFNpemUpLzI7Yi5sZWdlbmRTeW1ib2w9dGhpcy5jaGFydC5yZW5kZXJlci5jaXJjbGUoYyxhLmJhc2VsaW5lLWMsYykuYXR0cih7ekluZGV4OjN9KS5hZGQoYi5sZWdlbmRHcm91cCl9LGRyYXdQb2ludHM6aC5jb2x1bW4ucHJvdG90eXBlLmRyYXdQb2ludHMsYWxpZ25EYXRhTGFiZWw6aC5jb2x1bW4ucHJvdG90eXBlLmFsaWduRGF0YUxhYmVsfSk7Ty5wcm90b3R5cGUuYmVmb3JlUGFkZGluZz1mdW5jdGlvbigpe3ZhciBhPXRoaXMubGVuLGI9dGhpcy5jaGFydCxjPTAsZD1hLGU9dGhpcy5pc1hBeGlzLGc9ZT8ieERhdGEiOiJ5RGF0YSIsZj10aGlzLm1pbixrPXt9LGg9di5taW4oYi5wbG90V2lkdGgsYi5wbG90SGVpZ2h0KSxqPU51bWJlci5NQVhfVkFMVUUsaT0tTnVtYmVyLk1BWF9WQUxVRSxtPXRoaXMubWF4LWYsbj1hL20sbz1bXTt0aGlzLmFsbG93Wm9vbU91dHNpZGU9ITA7dGhpcy50aWNrUG9zaXRpb25zJiYocyh0aGlzLnNlcmllcywKZnVuY3Rpb24oYSl7dmFyIGI9YS5vcHRpb25zO2lmKGEudHlwZT09PSJidWJibGUiJiZhLnZpc2libGUmJihvLnB1c2goYSksZSkpcyhbIm1pblNpemUiLCJtYXhTaXplIl0sZnVuY3Rpb24oYSl7dmFyIGM9YlthXSxkPS8lJC8udGVzdChjKSxjPXUoYyk7a1thXT1kP2gqYy8xMDA6Y30pLGEubWluUHhTaXplPWsubWluU2l6ZSxhPWEuekRhdGEsaj12Lm1pbihqLHYubWF4KFEoYSksYi5kaXNwbGF5TmVnYXRpdmU9PT0hMT9iLnpUaHJlc2hvbGQ6LU51bWJlci5NQVhfVkFMVUUpKSxpPXYubWF4KGksUihhKSl9KSxzKG8sZnVuY3Rpb24oYSl7dmFyIGI9YVtnXSxoPWIubGVuZ3RoLGw7ZSYmYS5nZXRSYWRpaShqLGksay5taW5TaXplLGsubWF4U2l6ZSk7aWYobT4wKWZvcig7aC0tOylsPWEucmFkaWlbaF0sYz1NYXRoLm1pbigoYltoXS1mKSpuLWwsYyksZD1NYXRoLm1heCgoYltoXS1mKSpuK2wsZCl9KSxtPjAmJnIodGhpcy5vcHRpb25zLm1pbix0aGlzLnVzZXJNaW4pPT09RiYmcih0aGlzLm9wdGlvbnMubWF4LAp0aGlzLnVzZXJNYXgpPT09RiYmKGQtPWEsbio9KGErYy1kKS9hLHRoaXMubWluKz1jL24sdGhpcy5tYXgrPWQvbikpfTt2YXIgRT16LnByb3RvdHlwZSxuPW0uUG9pbnRlci5wcm90b3R5cGU7RS50b1hZPWZ1bmN0aW9uKGEpe3ZhciBiLGM9dGhpcy5jaGFydDtiPWEucGxvdFg7dmFyIGQ9YS5wbG90WTthLnJlY3RQbG90WD1iO2EucmVjdFBsb3RZPWQ7YS5jbGllbnRYPWIvTWF0aC5QSSoxODA7Yj10aGlzLnhBeGlzLnBvc3RUcmFuc2xhdGUoYS5wbG90WCx0aGlzLnlBeGlzLmxlbi1kKTthLnBsb3RYPWEucG9sYXJQbG90WD1iLngtYy5wbG90TGVmdDthLnBsb3RZPWEucG9sYXJQbG90WT1iLnktYy5wbG90VG9wfTtvKGguYXJlYS5wcm90b3R5cGUsImluaXQiLEwpO28oaC5hcmVhc3BsaW5lLnByb3RvdHlwZSwiaW5pdCIsTCk7byhoLnNwbGluZS5wcm90b3R5cGUsImdldFBvaW50U3BsaW5lIixmdW5jdGlvbihhLGIsYyxkKXt2YXIgZSxnLGYsaCxsLGosaTtpZih0aGlzLmNoYXJ0LnBvbGFyKXtlPQpjLnBsb3RYO2c9Yy5wbG90WTthPWJbZC0xXTtmPWJbZCsxXTt0aGlzLmNvbm5lY3RFbmRzJiYoYXx8KGE9YltiLmxlbmd0aC0yXSksZnx8KGY9YlsxXSkpO2lmKGEmJmYpaD1hLnBsb3RYLGw9YS5wbG90WSxiPWYucGxvdFgsaj1mLnBsb3RZLGg9KDEuNSplK2gpLzIuNSxsPSgxLjUqZytsKS8yLjUsZj0oMS41KmUrYikvMi41LGk9KDEuNSpnK2opLzIuNSxiPU1hdGguc3FydChNYXRoLnBvdyhoLWUsMikrTWF0aC5wb3cobC1nLDIpKSxqPU1hdGguc3FydChNYXRoLnBvdyhmLWUsMikrTWF0aC5wb3coaS1nLDIpKSxoPU1hdGguYXRhbjIobC1nLGgtZSksbD1NYXRoLmF0YW4yKGktZyxmLWUpLGk9TWF0aC5QSS8yKyhoK2wpLzIsTWF0aC5hYnMoaC1pKT5NYXRoLlBJLzImJihpLT1NYXRoLlBJKSxoPWUrTWF0aC5jb3MoaSkqYixsPWcrTWF0aC5zaW4oaSkqYixmPWUrTWF0aC5jb3MoTWF0aC5QSStpKSpqLGk9ZytNYXRoLnNpbihNYXRoLlBJK2kpKmosYy5yaWdodENvbnRYPWYsYy5yaWdodENvbnRZPQppO2Q/KGM9WyJDIixhLnJpZ2h0Q29udFh8fGEucGxvdFgsYS5yaWdodENvbnRZfHxhLnBsb3RZLGh8fGUsbHx8ZyxlLGddLGEucmlnaHRDb250WD1hLnJpZ2h0Q29udFk9bnVsbCk6Yz1bIk0iLGUsZ119ZWxzZSBjPWEuY2FsbCh0aGlzLGIsYyxkKTtyZXR1cm4gY30pO28oRSwidHJhbnNsYXRlIixmdW5jdGlvbihhKXthLmNhbGwodGhpcyk7aWYodGhpcy5jaGFydC5wb2xhciYmIXRoaXMucHJldmVudFBvc3RUcmFuc2xhdGUpZm9yKHZhciBhPXRoaXMucG9pbnRzLGI9YS5sZW5ndGg7Yi0tOyl0aGlzLnRvWFkoYVtiXSl9KTtvKEUsImdldFNlZ21lbnRQYXRoIixmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMucG9pbnRzO2lmKHRoaXMuY2hhcnQucG9sYXImJnRoaXMub3B0aW9ucy5jb25uZWN0RW5kcyE9PSExJiZiW2IubGVuZ3RoLTFdPT09Y1tjLmxlbmd0aC0xXSYmY1swXS55IT09bnVsbCl0aGlzLmNvbm5lY3RFbmRzPSEwLGI9W10uY29uY2F0KGIsW2NbMF1dKTtyZXR1cm4gYS5jYWxsKHRoaXMsCmIpfSk7byhFLCJhbmltYXRlIixNKTtvKHEsImFuaW1hdGUiLE0pO28oRSwic2V0VG9vbHRpcFBvaW50cyIsZnVuY3Rpb24oYSxiKXt0aGlzLmNoYXJ0LnBvbGFyJiZIKHRoaXMueEF4aXMse3Rvb2x0aXBMZW46MzYwfSk7cmV0dXJuIGEuY2FsbCh0aGlzLGIpfSk7byhxLCJ0cmFuc2xhdGUiLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueEF4aXMsYz10aGlzLnlBeGlzLmxlbixkPWIuY2VudGVyLGU9Yi5zdGFydEFuZ2xlUmFkLGc9dGhpcy5jaGFydC5yZW5kZXJlcixmLGg7dGhpcy5wcmV2ZW50UG9zdFRyYW5zbGF0ZT0hMDthLmNhbGwodGhpcyk7aWYoYi5pc1JhZGlhbCl7Yj10aGlzLnBvaW50cztmb3IoaD1iLmxlbmd0aDtoLS07KWY9YltoXSxhPWYuYmFyWCtlLGYuc2hhcGVUeXBlPSJwYXRoIixmLnNoYXBlQXJncz17ZDpnLnN5bWJvbHMuYXJjKGRbMF0sZFsxXSxjLWYucGxvdFksbnVsbCx7c3RhcnQ6YSxlbmQ6YStmLnBvaW50V2lkdGgsaW5uZXJSOmMtcihmLnlCb3R0b20sYyl9KX0sCnRoaXMudG9YWShmKX19KTtvKHEsImFsaWduRGF0YUxhYmVsIixmdW5jdGlvbihhLGIsYyxkLGUsZyl7aWYodGhpcy5jaGFydC5wb2xhcil7YT1iLnJlY3RQbG90WC9NYXRoLlBJKjE4MDtpZihkLmFsaWduPT09bnVsbClkLmFsaWduPWE+MjAmJmE8MTYwPyJsZWZ0IjphPjIwMCYmYTwzNDA/InJpZ2h0IjoiY2VudGVyIjtpZihkLnZlcnRpY2FsQWxpZ249PT1udWxsKWQudmVydGljYWxBbGlnbj1hPDQ1fHxhPjMxNT8iYm90dG9tIjphPjEzNSYmYTwyMjU/InRvcCI6Im1pZGRsZSI7RS5hbGlnbkRhdGFMYWJlbC5jYWxsKHRoaXMsYixjLGQsZSxnKX1lbHNlIGEuY2FsbCh0aGlzLGIsYyxkLGUsZyl9KTtvKG4sImdldEluZGV4IixmdW5jdGlvbihhLGIpe3ZhciBjLGQ9dGhpcy5jaGFydCxlO2QucG9sYXI/KGU9ZC54QXhpc1swXS5jZW50ZXIsYz1iLmNoYXJ0WC1lWzBdLWQucGxvdExlZnQsZD1iLmNoYXJ0WS1lWzFdLWQucGxvdFRvcCxjPTE4MC1NYXRoLnJvdW5kKE1hdGguYXRhbjIoYywKZCkvTWF0aC5QSSoxODApKTpjPWEuY2FsbCh0aGlzLGIpO3JldHVybiBjfSk7byhuLCJnZXRDb29yZGluYXRlcyIsZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmNoYXJ0LGQ9e3hBeGlzOltdLHlBeGlzOltdfTtjLnBvbGFyP3MoYy5heGVzLGZ1bmN0aW9uKGEpe3ZhciBnPWEuaXNYQXhpcyxmPWEuY2VudGVyLGg9Yi5jaGFydFgtZlswXS1jLnBsb3RMZWZ0LGY9Yi5jaGFydFktZlsxXS1jLnBsb3RUb3A7ZFtnPyJ4QXhpcyI6InlBeGlzIl0ucHVzaCh7YXhpczphLHZhbHVlOmEudHJhbnNsYXRlKGc/TWF0aC5QSS1NYXRoLmF0YW4yKGgsZik6TWF0aC5zcXJ0KE1hdGgucG93KGgsMikrTWF0aC5wb3coZiwyKSksITApfSl9KTpkPWEuY2FsbCh0aGlzLGIpO3JldHVybiBkfSl9KShIaWdoY2hhcnRzKTsK' type='text/javascript'></script>
<script src='data:application/javascript;base64,LyoKIEhpZ2hjaGFydHMgSlMgdjMuMC4yICgyMDEzLTA2LTA1KQogRXhwb3J0aW5nIG1vZHVsZQoKIChjKSAyMDEwLTIwMTMgVG9yc3RlaW4gSMO4bnNpCgogTGljZW5zZTogd3d3LmhpZ2hjaGFydHMuY29tL2xpY2Vuc2UKKi8KKGZ1bmN0aW9uKGUpe3ZhciB5PWUuQ2hhcnQsdj1lLmFkZEV2ZW50LEI9ZS5yZW1vdmVFdmVudCxtPWUuY3JlYXRlRWxlbWVudCxqPWUuZGlzY2FyZEVsZW1lbnQsdD1lLmNzcyxrPWUubWVyZ2Uscj1lLmVhY2gscD1lLmV4dGVuZCxDPU1hdGgubWF4LGk9ZG9jdW1lbnQsej13aW5kb3csRD1lLmlzVG91Y2hEZXZpY2UsRT1lLlJlbmRlcmVyLnByb3RvdHlwZS5zeW1ib2xzLHM9ZS5nZXRPcHRpb25zKCksdztwKHMubGFuZyx7cHJpbnRDaGFydDoiUHJpbnQgY2hhcnQiLGRvd25sb2FkUE5HOiJEb3dubG9hZCBQTkcgaW1hZ2UiLGRvd25sb2FkSlBFRzoiRG93bmxvYWQgSlBFRyBpbWFnZSIsZG93bmxvYWRQREY6IkRvd25sb2FkIFBERiBkb2N1bWVudCIsZG93bmxvYWRTVkc6IkRvd25sb2FkIFNWRyB2ZWN0b3IgaW1hZ2UiLGNvbnRleHRCdXR0b25UaXRsZToiQ2hhcnQgY29udGV4dCBtZW51In0pO3MubmF2aWdhdGlvbj17bWVudVN0eWxlOntib3JkZXI6IjFweCBzb2xpZCAjQTBBMEEwIiwKYmFja2dyb3VuZDoiI0ZGRkZGRiIscGFkZGluZzoiNXB4IDAifSxtZW51SXRlbVN0eWxlOntwYWRkaW5nOiIwIDEwcHgiLGJhY2tncm91bmQ6Im5vbmUiLGNvbG9yOiIjMzAzMDMwIixmb250U2l6ZTpEPyIxNHB4IjoiMTFweCJ9LG1lbnVJdGVtSG92ZXJTdHlsZTp7YmFja2dyb3VuZDoiIzQ1NzJBNSIsY29sb3I6IiNGRkZGRkYifSxidXR0b25PcHRpb25zOntzeW1ib2xGaWxsOiIjRTBFMEUwIixzeW1ib2xTaXplOjE0LHN5bWJvbFN0cm9rZToiIzY2NiIsc3ltYm9sU3Ryb2tlV2lkdGg6MyxzeW1ib2xYOjEyLjUsc3ltYm9sWToxMC41LGFsaWduOiJyaWdodCIsYnV0dG9uU3BhY2luZzozLGhlaWdodDoyMix0aGVtZTp7ZmlsbDoid2hpdGUiLHN0cm9rZToibm9uZSJ9LHZlcnRpY2FsQWxpZ246InRvcCIsd2lkdGg6MjR9fTtzLmV4cG9ydGluZz17dHlwZToiaW1hZ2UvcG5nIix1cmw6Imh0dHA6Ly9leHBvcnQuaGlnaGNoYXJ0cy5jb20vIixidXR0b25zOntjb250ZXh0QnV0dG9uOntzeW1ib2w6Im1lbnUiLApfdGl0bGVLZXk6ImNvbnRleHRCdXR0b25UaXRsZSIsbWVudUl0ZW1zOlt7dGV4dEtleToicHJpbnRDaGFydCIsb25jbGljazpmdW5jdGlvbigpe3RoaXMucHJpbnQoKX19LHtzZXBhcmF0b3I6ITB9LHt0ZXh0S2V5OiJkb3dubG9hZFBORyIsb25jbGljazpmdW5jdGlvbigpe3RoaXMuZXhwb3J0Q2hhcnQoKX19LHt0ZXh0S2V5OiJkb3dubG9hZEpQRUciLG9uY2xpY2s6ZnVuY3Rpb24oKXt0aGlzLmV4cG9ydENoYXJ0KHt0eXBlOiJpbWFnZS9qcGVnIn0pfX0se3RleHRLZXk6ImRvd25sb2FkUERGIixvbmNsaWNrOmZ1bmN0aW9uKCl7dGhpcy5leHBvcnRDaGFydCh7dHlwZToiYXBwbGljYXRpb24vcGRmIn0pfX0se3RleHRLZXk6ImRvd25sb2FkU1ZHIixvbmNsaWNrOmZ1bmN0aW9uKCl7dGhpcy5leHBvcnRDaGFydCh7dHlwZToiaW1hZ2Uvc3ZnK3htbCJ9KX19XX19fTtlLnBvc3Q9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkO2Q9bSgiZm9ybSIse21ldGhvZDoicG9zdCIsYWN0aW9uOmEsZW5jdHlwZToibXVsdGlwYXJ0L2Zvcm0tZGF0YSJ9LAp7ZGlzcGxheToibm9uZSJ9LGkuYm9keSk7Zm9yKGMgaW4gYiltKCJpbnB1dCIse3R5cGU6ImhpZGRlbiIsbmFtZTpjLHZhbHVlOmJbY119LG51bGwsZCk7ZC5zdWJtaXQoKTtqKGQpfTtwKHkucHJvdG90eXBlLHtnZXRTVkc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjLGQseCxnLGY9ayhiLm9wdGlvbnMsYSk7aWYoIWkuY3JlYXRlRWxlbWVudE5TKWkuY3JlYXRlRWxlbWVudE5TPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGkuY3JlYXRlRWxlbWVudChiKX07YT1tKCJkaXYiLG51bGwse3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOiItOTk5OWVtIix3aWR0aDpiLmNoYXJ0V2lkdGgrInB4IixoZWlnaHQ6Yi5jaGFydEhlaWdodCsicHgifSxpLmJvZHkpO2Q9Yi5yZW5kZXJUby5zdHlsZS53aWR0aDtnPWIucmVuZGVyVG8uc3R5bGUuaGVpZ2h0O2Q9Zi5leHBvcnRpbmcuc291cmNlV2lkdGh8fGYuY2hhcnQud2lkdGh8fC9weCQvLnRlc3QoZCkmJnBhcnNlSW50KGQsMTApfHw2MDA7Zz1mLmV4cG9ydGluZy5zb3VyY2VIZWlnaHR8fApmLmNoYXJ0LmhlaWdodHx8L3B4JC8udGVzdChnKSYmcGFyc2VJbnQoZywxMCl8fDQwMDtwKGYuY2hhcnQse2FuaW1hdGlvbjohMSxyZW5kZXJUbzphLGZvckV4cG9ydDohMCx3aWR0aDpkLGhlaWdodDpnfSk7Zi5leHBvcnRpbmcuZW5hYmxlZD0hMTtmLnNlcmllcz1bXTtyKGIuc2VyaWVzLGZ1bmN0aW9uKGEpe3g9ayhhLm9wdGlvbnMse2FuaW1hdGlvbjohMSxzaG93Q2hlY2tib3g6ITEsdmlzaWJsZTphLnZpc2libGV9KTt4LmlzSW50ZXJuYWx8fGYuc2VyaWVzLnB1c2goeCl9KTtjPW5ldyBlLkNoYXJ0KGYsYi5jYWxsYmFjayk7cihbInhBeGlzIiwieUF4aXMiXSxmdW5jdGlvbihhKXtyKGJbYV0sZnVuY3Rpb24oYixkKXt2YXIgZj1jW2FdW2RdLGU9Yi5nZXRFeHRyZW1lcygpLGc9ZS51c2VyTWluLGU9ZS51c2VyTWF4OyhnIT09dm9pZCAwfHxlIT09dm9pZCAwKSYmZi5zZXRFeHRyZW1lcyhnLGUsITAsITEpfSl9KTtkPWMuY29udGFpbmVyLmlubmVySFRNTDtmPW51bGw7Yy5kZXN0cm95KCk7CmooYSk7ZD1kLnJlcGxhY2UoL3pJbmRleD0iW14iXSsiL2csIiIpLnJlcGxhY2UoL2lzU2hhZG93PSJbXiJdKyIvZywiIikucmVwbGFjZSgvc3ltYm9sTmFtZT0iW14iXSsiL2csIiIpLnJlcGxhY2UoL2pRdWVyeVswLTldKz0iW14iXSsiL2csIiIpLnJlcGxhY2UoL3VybFwoW14jXSsjL2csInVybCgjIikucmVwbGFjZSgvPHN2ZyAvLCc8c3ZnIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiAnKS5yZXBsYWNlKC8gaHJlZj0vZywiIHhsaW5rOmhyZWY9IikucmVwbGFjZSgvXG4vLCIgIikucmVwbGFjZSgvPFwvc3ZnPi4qPyQvLCI8L3N2Zz4iKS5yZXBsYWNlKC8mbmJzcDsvZywiwqAiKS5yZXBsYWNlKC8mc2h5Oy9nLCLCrSIpLnJlcGxhY2UoLzxJTUcgL2csIjxpbWFnZSAiKS5yZXBsYWNlKC9oZWlnaHQ9KFteIiBdKykvZywnaGVpZ2h0PSIkMSInKS5yZXBsYWNlKC93aWR0aD0oW14iIF0rKS9nLCd3aWR0aD0iJDEiJykucmVwbGFjZSgvaGMtc3ZnLWhyZWY9IihbXiJdKykiPi9nLAoneGxpbms6aHJlZj0iJDEiLz4nKS5yZXBsYWNlKC9pZD0oW14iID5dKykvZywnaWQ9IiQxIicpLnJlcGxhY2UoL2NsYXNzPShbXiIgPl0rKS9nLCdjbGFzcz0iJDEiJykucmVwbGFjZSgvIHRyYW5zZm9ybSAvZywiICIpLnJlcGxhY2UoLzoocGF0aHxyZWN0KS9nLCIkMSIpLnJlcGxhY2UoL3N0eWxlPSIoW14iXSspIi9nLGZ1bmN0aW9uKGEpe3JldHVybiBhLnRvTG93ZXJDYXNlKCl9KTtkPWQucmVwbGFjZSgvKHVybFwoI2hpZ2hjaGFydHMtWzAtOV0rKSZxdW90Oy9nLCIkMSIpLnJlcGxhY2UoLyZxdW90Oy9nLCInIik7ZC5tYXRjaCgvIHhtbG5zPSIvZykubGVuZ3RoPT09MiYmKGQ9ZC5yZXBsYWNlKC94bWxucz0iW14iXSsiLywiIikpO3JldHVybiBkfSxleHBvcnRDaGFydDpmdW5jdGlvbihhLGIpe3ZhciBhPWF8fHt9LGM9dGhpcy5vcHRpb25zLmV4cG9ydGluZyxjPXRoaXMuZ2V0U1ZHKGsoe2NoYXJ0Ontib3JkZXJSYWRpdXM6MH19LGMuY2hhcnRPcHRpb25zLGIse2V4cG9ydGluZzp7c291cmNlV2lkdGg6YS5zb3VyY2VXaWR0aHx8CmMuc291cmNlV2lkdGgsc291cmNlSGVpZ2h0OmEuc291cmNlSGVpZ2h0fHxjLnNvdXJjZUhlaWdodH19KSksYT1rKHRoaXMub3B0aW9ucy5leHBvcnRpbmcsYSk7ZS5wb3N0KGEudXJsLHtmaWxlbmFtZTphLmZpbGVuYW1lfHwiY2hhcnQiLHR5cGU6YS50eXBlLHdpZHRoOmEud2lkdGh8fDAsc2NhbGU6YS5zY2FsZXx8Mixzdmc6Y30pfSxwcmludDpmdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1hLmNvbnRhaW5lcixjPVtdLGQ9Yi5wYXJlbnROb2RlLGU9aS5ib2R5LGc9ZS5jaGlsZE5vZGVzO2lmKCFhLmlzUHJpbnRpbmcpYS5pc1ByaW50aW5nPSEwLHIoZyxmdW5jdGlvbihhLGIpe2lmKGEubm9kZVR5cGU9PT0xKWNbYl09YS5zdHlsZS5kaXNwbGF5LGEuc3R5bGUuZGlzcGxheT0ibm9uZSJ9KSxlLmFwcGVuZENoaWxkKGIpLHouZm9jdXMoKSx6LnByaW50KCksc2V0VGltZW91dChmdW5jdGlvbigpe2QuYXBwZW5kQ2hpbGQoYik7cihnLGZ1bmN0aW9uKGEsYil7aWYoYS5ub2RlVHlwZT09PQoxKWEuc3R5bGUuZGlzcGxheT1jW2JdfSk7YS5pc1ByaW50aW5nPSExfSwxRTMpfSxjb250ZXh0TWVudTpmdW5jdGlvbihhLGIsYyxkLGUsZyxmKXt2YXIgaD10aGlzLHE9aC5vcHRpb25zLm5hdmlnYXRpb24sbj1xLm1lbnVJdGVtU3R5bGUsbz1oLmNoYXJ0V2lkdGgsaT1oLmNoYXJ0SGVpZ2h0LEE9ImNhY2hlLSIrYSxsPWhbQV0saz1DKGUsZyksdSxqLHM7aWYoIWwpaFtBXT1sPW0oImRpdiIse2NsYXNzTmFtZToiaGlnaGNoYXJ0cy0iK2F9LHtwb3NpdGlvbjoiYWJzb2x1dGUiLHpJbmRleDoxRTMscGFkZGluZzprKyJweCJ9LGguY29udGFpbmVyKSx1PW0oImRpdiIsbnVsbCxwKHtNb3pCb3hTaGFkb3c6IjNweCAzcHggMTBweCAjODg4IixXZWJraXRCb3hTaGFkb3c6IjNweCAzcHggMTBweCAjODg4Iixib3hTaGFkb3c6IjNweCAzcHggMTBweCAjODg4In0scS5tZW51U3R5bGUpLGwpLGo9ZnVuY3Rpb24oKXt0KGwse2Rpc3BsYXk6Im5vbmUifSk7ZiYmZi5zZXRTdGF0ZSgwKTtoLm9wZW5NZW51PQohMX0sdihsLCJtb3VzZWxlYXZlIixmdW5jdGlvbigpe3M9c2V0VGltZW91dChqLDUwMCl9KSx2KGwsIm1vdXNlZW50ZXIiLGZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHMpfSkscihiLGZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBiPWEuc2VwYXJhdG9yP20oImhyIixudWxsLG51bGwsdSk6bSgiZGl2Iix7b25tb3VzZW92ZXI6ZnVuY3Rpb24oKXt0KHRoaXMscS5tZW51SXRlbUhvdmVyU3R5bGUpfSxvbm1vdXNlb3V0OmZ1bmN0aW9uKCl7dCh0aGlzLG4pfSxvbmNsaWNrOmZ1bmN0aW9uKCl7aigpO2Eub25jbGljay5hcHBseShoLGFyZ3VtZW50cyl9LGlubmVySFRNTDphLnRleHR8fGgub3B0aW9ucy5sYW5nW2EudGV4dEtleV19LHAoe2N1cnNvcjoicG9pbnRlciJ9LG4pLHUpO2guZXhwb3J0RGl2RWxlbWVudHMucHVzaChiKX19KSxoLmV4cG9ydERpdkVsZW1lbnRzLnB1c2godSxsKSxoLmV4cG9ydE1lbnVXaWR0aD1sLm9mZnNldFdpZHRoLGguZXhwb3J0TWVudUhlaWdodD1sLm9mZnNldEhlaWdodDsKYT17ZGlzcGxheToiYmxvY2sifTtjK2guZXhwb3J0TWVudVdpZHRoPm8/YS5yaWdodD1vLWMtZS1rKyJweCI6YS5sZWZ0PWMtaysicHgiO2QrZytoLmV4cG9ydE1lbnVIZWlnaHQ+aT9hLmJvdHRvbT1pLWQtaysicHgiOmEudG9wPWQrZy1rKyJweCI7dChsLGEpO2gub3Blbk1lbnU9ITB9LGFkZEJ1dHRvbjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLGM9Yi5yZW5kZXJlcixhPWsoYi5vcHRpb25zLm5hdmlnYXRpb24uYnV0dG9uT3B0aW9ucyxhKSxkPWEub25jbGljayxpPWEubWVudUl0ZW1zLGcsZixoPXtzdHJva2U6YS5zeW1ib2xTdHJva2UsZmlsbDphLnN5bWJvbEZpbGx9LHE9YS5zeW1ib2xTaXplfHwxMjtpZighYi5idG5Db3VudCliLmJ0bkNvdW50PTA7Yi5idG5Db3VudCsrO2lmKCFiLmV4cG9ydERpdkVsZW1lbnRzKWIuZXhwb3J0RGl2RWxlbWVudHM9W10sYi5leHBvcnRTVkdFbGVtZW50cz1bXTtpZihhLmVuYWJsZWQhPT0hMSl7dmFyIG49YS50aGVtZSxvPW4uc3RhdGVzLG09Cm8mJm8uaG92ZXIsbz1vJiZvLnNlbGVjdCxqO2RlbGV0ZSBuLnN0YXRlcztkP2o9ZnVuY3Rpb24oKXtkLmFwcGx5KGIsYXJndW1lbnRzKX06aSYmKGo9ZnVuY3Rpb24oKXtiLmNvbnRleHRNZW51KCJjb250ZXh0bWVudSIsaSxmLnRyYW5zbGF0ZVgsZi50cmFuc2xhdGVZLGYud2lkdGgsZi5oZWlnaHQsZik7Zi5zZXRTdGF0ZSgyKX0pO2EudGV4dCYmYS5zeW1ib2w/bi5wYWRkaW5nTGVmdD1lLnBpY2sobi5wYWRkaW5nTGVmdCwyNSk6YS50ZXh0fHxwKG4se3dpZHRoOmEud2lkdGgsaGVpZ2h0OmEuaGVpZ2h0LHBhZGRpbmc6MH0pO2Y9Yy5idXR0b24oYS50ZXh0LDAsMCxqLG4sbSxvKS5hdHRyKHt0aXRsZTpiLm9wdGlvbnMubGFuZ1thLl90aXRsZUtleV0sInN0cm9rZS1saW5lY2FwIjoicm91bmQifSk7YS5zeW1ib2wmJihnPWMuc3ltYm9sKGEuc3ltYm9sLGEuc3ltYm9sWC1xLzIsYS5zeW1ib2xZLXEvMixxLHEpLmF0dHIocChoLHsic3Ryb2tlLXdpZHRoIjphLnN5bWJvbFN0cm9rZVdpZHRofHwKMSx6SW5kZXg6MX0pKS5hZGQoZikpO2YuYWRkKCkuYWxpZ24ocChhLHt3aWR0aDpmLndpZHRoLHg6ZS5waWNrKGEueCx3KX0pLCEwLCJzcGFjaW5nQm94Iik7dys9KGYud2lkdGgrYS5idXR0b25TcGFjaW5nKSooYS5hbGlnbj09PSJyaWdodCI/LTE6MSk7Yi5leHBvcnRTVkdFbGVtZW50cy5wdXNoKGYsZyl9fSxkZXN0cm95RXhwb3J0OmZ1bmN0aW9uKGEpe3ZhciBhPWEudGFyZ2V0LGIsYztmb3IoYj0wO2I8YS5leHBvcnRTVkdFbGVtZW50cy5sZW5ndGg7YisrKWlmKGM9YS5leHBvcnRTVkdFbGVtZW50c1tiXSljLm9uY2xpY2s9Yy5vbnRvdWNoc3RhcnQ9bnVsbCxhLmV4cG9ydFNWR0VsZW1lbnRzW2JdPWMuZGVzdHJveSgpO2ZvcihiPTA7YjxhLmV4cG9ydERpdkVsZW1lbnRzLmxlbmd0aDtiKyspYz1hLmV4cG9ydERpdkVsZW1lbnRzW2JdLEIoYywibW91c2VsZWF2ZSIpLGEuZXhwb3J0RGl2RWxlbWVudHNbYl09Yy5vbm1vdXNlb3V0PWMub25tb3VzZW92ZXI9Yy5vbnRvdWNoc3RhcnQ9CmMub25jbGljaz1udWxsLGooYyl9fSk7RS5tZW51PWZ1bmN0aW9uKGEsYixjLGQpe3JldHVyblsiTSIsYSxiKzIuNSwiTCIsYStjLGIrMi41LCJNIixhLGIrZC8yKzAuNSwiTCIsYStjLGIrZC8yKzAuNSwiTSIsYSxiK2QtMS41LCJMIixhK2MsYitkLTEuNV19O3kucHJvdG90eXBlLmNhbGxiYWNrcy5wdXNoKGZ1bmN0aW9uKGEpe3ZhciBiLGM9YS5vcHRpb25zLmV4cG9ydGluZyxkPWMuYnV0dG9uczt3PTA7aWYoYy5lbmFibGVkIT09ITEpe2ZvcihiIGluIGQpYS5hZGRCdXR0b24oZFtiXSk7dihhLCJkZXN0cm95IixhLmRlc3Ryb3lFeHBvcnQpfX0pfSkoSGlnaGNoYXJ0cyk7Cg==' type='text/javascript'></script>
<style>
.rChart {
display: block;
margin-left: auto;
margin-right: auto;
width: 800px;
height: 400px;
}
</style>
</head>
<body >
<div id = 'inline' class = 'rChart highcharts'></div>
<script type='text/javascript'>
(function($){
$(function () {
var chart = new Highcharts.Chart({
"dom": "inline",
"width": 800,
"height": 400,
"credits": {
"href": null,
"text": null
},
"exporting": {
"enabled": false
},
"title": {
"text": null
},
"yAxis": [
{
"title": {
"text": "sentiment"
}
}
],
"series": [
{
"data": [
[
"10-28",
0.488351
],
[
"10-29",
0.242057
],
[
"10-30",
0.572354
],
[
"10-31",
0.460457
],
[
"11-01",
0.51457
],
[
"11-02",
0.585608
],
[
"11-03",
0.556138
],
[
"11-04",
0.605876
],
[
"11-05",
0.402929
],
[
"11-06",
0.380404
],
[
"11-07",
0.23
],
[
"11-08",
0.879
],
[
"11-09",
0.5321
],
[
"11-10",
0.3345
],
[
"11-11",
0.45321
],
[
"11-12",
0.61
],
[
"11-13",
0.3508
],
[
"11-14",
0.3908
],
[
"11-15",
0.7654
],
[
"11-16",
0.4321
],
[
"11-17",
0.3428
],
[
"11-18",
0.5674
],
[
"11-19",
0.2386
],
[
"11-20",
0.62
],
[
"11-21",
0.394
],
[
"11-22",
0.532
],
[
"11-23",
0.6038
],
[
"11-24",
0.3456
],
[
"11-25",
0.624
],
[
"11-26",
0.254
],
[
"11-27",
0.189
],
[
"11-28",
0.694
],
[
"11-29",
0.297
],
[
"11-30",
0.642
]
],
"type": "line",
"marker": {
"radius": 3
}
}
],
"legend": {
"enabled": false
},
"xAxis": [
{
"title": {
"text": "Date"
},
"categories": [ "10-28", "10-29", "10-30", "10-31", "11-01", "11-02", "11-03", "11-04", "11-05", "11-06", "11-07", "11-08", "11-09", "11-10", "11-11", "11-12", "11-13", "11-14", "11-15", "11-16", "11-17", "11-18", "11-19", "11-20", "11-21", "11-22", "11-23", "11-24", "11-25", "11-26", "11-27", "11-28", "11-29", "11-30" ]
}
],
"subtitle": {
"text": null
},
"id": "inline",
"chart": {
"renderTo": "inline"
}
});
});
})(jQuery);
</script>
<script></script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment