gl-draw 0.17.0-beta.37 → 0.17.0-beta.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -51,7 +51,7 @@ const H = (l) => {
51
51
  new z(l[d].array, l[d].itemSize)
52
52
  );
53
53
  }), b;
54
- }, M = "dmFyIGx4PU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxoeD1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgdXg9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIGxvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIG1mPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksZ2Y9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt2YXIgRWM9KEosaik9PihqPVN5bWJvbFtKXSk/ajpTeW1ib2wuZm9yKCJTeW1ib2wuIitKKSxmeD1KPT57dGhyb3cgVHlwZUVycm9yKEopfSx6aT1NYXRoLnBvdyx5Zj0oSixqLG10KT0+aiBpbiBKP2x4KEosaix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bXR9KTpKW2pdPW10LFV0PShKLGopPT57Zm9yKHZhciBtdCBpbiBqfHwoaj17fSkpbWYuY2FsbChqLG10KSYmeWYoSixtdCxqW210XSk7aWYobG8pZm9yKHZhciBtdCBvZiBsbyhqKSlnZi5jYWxsKGosbXQpJiZ5ZihKLG10LGpbbXRdKTtyZXR1cm4gSn0sS2U9KEosaik9Pmh4KEosdXgoaikpO3ZhciB4Zj0oSixqKT0+e3ZhciBtdD17fTtmb3IodmFyIFR0IGluIEopbWYuY2FsbChKLFR0KSYmai5pbmRleE9mKFR0KTwwJiYobXRbVHRdPUpbVHRdKTtpZihKIT1udWxsJiZsbylmb3IodmFyIFR0IG9mIGxvKEopKWouaW5kZXhPZihUdCk8MCYmZ2YuY2FsbChKLFR0KSYmKG10W1R0XT1KW1R0XSk7cmV0dXJuIG10fTt2YXIgZHg9ZnVuY3Rpb24oSixqKXt0aGlzWzBdPUosdGhpc1sxXT1qfTt2YXIgd2Y9Sj0+e3ZhciBqPUpbRWMoImFzeW5jSXRlcmF0b3IiKV0sbXQ9ITEsVHQscG49e307cmV0dXJuIGo9PW51bGw/KGo9SltFYygiaXRlcmF0b3IiKV0oKSxUdD1QZT0+cG5bUGVdPSRuPT5qW1BlXSgkbikpOihqPWouY2FsbChKKSxUdD1QZT0+cG5bUGVdPSRuPT57aWYobXQpe2lmKG10PSExLFBlPT09InRocm93Iil0aHJvdyAkbjtyZXR1cm4gJG59cmV0dXJuIG10PSEwLHtkb25lOiExLHZhbHVlOm5ldyBkeChuZXcgUHJvbWlzZShCYz0+e3ZhciBobz1qW1BlXSgkbik7aG8gaW5zdGFuY2VvZiBPYmplY3R8fGZ4KCJPYmplY3QgZXhwZWN0ZWQiKSxCYyhobyl9KSwxKX19KSxwbltFYygiaXRlcmF0b3IiKV09KCk9PnBuLFR0KCJuZXh0IiksInRocm93ImluIGo/VHQoInRocm93Iik6cG4udGhyb3c9UGU9Pnt0aHJvdyBQZX0sInJldHVybiJpbiBqJiZUdCgicmV0dXJuIikscG59OyhmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjsvKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IDIwMTAtMjAyNSBUaHJlZS5qcyBBdXRob3JzCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKICovY29uc3QgSj0iMTgyIixGYz0iIixmZT0ic3JnYiIsSWM9InNyZ2ItbGluZWFyIixrYz0ibGluZWFyIix1bz0ic3JnYiI7ZnVuY3Rpb24gYmYoaSl7Zm9yKGxldCB0PWkubGVuZ3RoLTE7dD49MDstLXQpaWYoaVt0XT49NjU1MzUpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gTmMoaSl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsaSl9Y29uc3QgUmM9e307ZnVuY3Rpb24gYnQoLi4uaSl7Y29uc3QgdD0iVEhSRUUuIitpLnNoaWZ0KCk7Y29uc29sZS53YXJuKHQsLi4uaSl9ZnVuY3Rpb24geW4oLi4uaSl7Y29uc3QgdD0iVEhSRUUuIitpLnNoaWZ0KCk7Y29uc29sZS5lcnJvcih0LC4uLmkpfWZ1bmN0aW9uIExjKC4uLmkpe2NvbnN0IHQ9aS5qb2luKCIgIik7dCBpbiBSY3x8KFJjW3RdPSEwLGJ0KC4uLmkpKX1jbGFzcyBnc3thZGRFdmVudExpc3RlbmVyKHQsZSl7dGhpcy5fbGlzdGVuZXJzPT09dm9pZCAwJiYodGhpcy5fbGlzdGVuZXJzPXt9KTtjb25zdCBuPXRoaXMuX2xpc3RlbmVycztuW3RdPT09dm9pZCAwJiYoblt0XT1bXSksblt0XS5pbmRleE9mKGUpPT09LTEmJm5bdF0ucHVzaChlKX1oYXNFdmVudExpc3RlbmVyKHQsZSl7Y29uc3Qgbj10aGlzLl9saXN0ZW5lcnM7cmV0dXJuIG49PT12b2lkIDA/ITE6blt0XSE9PXZvaWQgMCYmblt0XS5pbmRleE9mKGUpIT09LTF9cmVtb3ZlRXZlbnRMaXN0ZW5lcih0LGUpe2NvbnN0IG49dGhpcy5fbGlzdGVuZXJzO2lmKG49PT12b2lkIDApcmV0dXJuO2NvbnN0IHM9blt0XTtpZihzIT09dm9pZCAwKXtjb25zdCByPXMuaW5kZXhPZihlKTtyIT09LTEmJnMuc3BsaWNlKHIsMSl9fWRpc3BhdGNoRXZlbnQodCl7Y29uc3QgZT10aGlzLl9saXN0ZW5lcnM7aWYoZT09PXZvaWQgMClyZXR1cm47Y29uc3Qgbj1lW3QudHlwZV07aWYobiE9PXZvaWQgMCl7dC50YXJnZXQ9dGhpcztjb25zdCBzPW4uc2xpY2UoMCk7Zm9yKGxldCByPTAsbz1zLmxlbmd0aDtyPG87cisrKXNbcl0uY2FsbCh0aGlzLHQpO3QudGFyZ2V0PW51bGx9fX1jb25zdCBQdD1bIjAwIiwiMDEiLCIwMiIsIjAzIiwiMDQiLCIwNSIsIjA2IiwiMDciLCIwOCIsIjA5IiwiMGEiLCIwYiIsIjBjIiwiMGQiLCIwZSIsIjBmIiwiMTAiLCIxMSIsIjEyIiwiMTMiLCIxNCIsIjE1IiwiMTYiLCIxNyIsIjE4IiwiMTkiLCIxYSIsIjFiIiwiMWMiLCIxZCIsIjFlIiwiMWYiLCIyMCIsIjIxIiwiMjIiLCIyMyIsIjI0IiwiMjUiLCIyNiIsIjI3IiwiMjgiLCIyOSIsIjJhIiwiMmIiLCIyYyIsIjJkIiwiMmUiLCIyZiIsIjMwIiwiMzEiLCIzMiIsIjMzIiwiMzQiLCIzNSIsIjM2IiwiMzciLCIzOCIsIjM5IiwiM2EiLCIzYiIsIjNjIiwiM2QiLCIzZSIsIjNmIiwiNDAiLCI0MSIsIjQyIiwiNDMiLCI0NCIsIjQ1IiwiNDYiLCI0NyIsIjQ4IiwiNDkiLCI0YSIsIjRiIiwiNGMiLCI0ZCIsIjRlIiwiNGYiLCI1MCIsIjUxIiwiNTIiLCI1MyIsIjU0IiwiNTUiLCI1NiIsIjU3IiwiNTgiLCI1OSIsIjVhIiwiNWIiLCI1YyIsIjVkIiwiNWUiLCI1ZiIsIjYwIiwiNjEiLCI2MiIsIjYzIiwiNjQiLCI2NSIsIjY2IiwiNjciLCI2OCIsIjY5IiwiNmEiLCI2YiIsIjZjIiwiNmQiLCI2ZSIsIjZmIiwiNzAiLCI3MSIsIjcyIiwiNzMiLCI3NCIsIjc1IiwiNzYiLCI3NyIsIjc4IiwiNzkiLCI3YSIsIjdiIiwiN2MiLCI3ZCIsIjdlIiwiN2YiLCI4MCIsIjgxIiwiODIiLCI4MyIsIjg0IiwiODUiLCI4NiIsIjg3IiwiODgiLCI4OSIsIjhhIiwiOGIiLCI4YyIsIjhkIiwiOGUiLCI4ZiIsIjkwIiwiOTEiLCI5MiIsIjkzIiwiOTQiLCI5NSIsIjk2IiwiOTciLCI5OCIsIjk5IiwiOWEiLCI5YiIsIjljIiwiOWQiLCI5ZSIsIjlmIiwiYTAiLCJhMSIsImEyIiwiYTMiLCJhNCIsImE1IiwiYTYiLCJhNyIsImE4IiwiYTkiLCJhYSIsImFiIiwiYWMiLCJhZCIsImFlIiwiYWYiLCJiMCIsImIxIiwiYjIiLCJiMyIsImI0IiwiYjUiLCJiNiIsImI3IiwiYjgiLCJiOSIsImJhIiwiYmIiLCJiYyIsImJkIiwiYmUiLCJiZiIsImMwIiwiYzEiLCJjMiIsImMzIiwiYzQiLCJjNSIsImM2IiwiYzciLCJjOCIsImM5IiwiY2EiLCJjYiIsImNjIiwiY2QiLCJjZSIsImNmIiwiZDAiLCJkMSIsImQyIiwiZDMiLCJkNCIsImQ1IiwiZDYiLCJkNyIsImQ4IiwiZDkiLCJkYSIsImRiIiwiZGMiLCJkZCIsImRlIiwiZGYiLCJlMCIsImUxIiwiZTIiLCJlMyIsImU0IiwiZTUiLCJlNiIsImU3IiwiZTgiLCJlOSIsImVhIiwiZWIiLCJlYyIsImVkIiwiZWUiLCJlZiIsImYwIiwiZjEiLCJmMiIsImYzIiwiZjQiLCJmNSIsImY2IiwiZjciLCJmOCIsImY5IiwiZmEiLCJmYiIsImZjIiwiZmQiLCJmZSIsImZmIl07bGV0IE9jPTEyMzQ1Njc7Y29uc3QgRGM9TWF0aC5QSS8xODAsJGM9MTgwL01hdGguUEk7ZnVuY3Rpb24gbW4oKXtjb25zdCBpPU1hdGgucmFuZG9tKCkqNDI5NDk2NzI5NXwwLHQ9TWF0aC5yYW5kb20oKSo0Mjk0OTY3Mjk1fDAsZT1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MCxuPU1hdGgucmFuZG9tKCkqNDI5NDk2NzI5NXwwO3JldHVybihQdFtpJjI1NV0rUHRbaT4+OCYyNTVdK1B0W2k+PjE2JjI1NV0rUHRbaT4+MjQmMjU1XSsiLSIrUHRbdCYyNTVdK1B0W3Q+PjgmMjU1XSsiLSIrUHRbdD4+MTYmMTV8NjRdK1B0W3Q+PjI0JjI1NV0rIi0iK1B0W2UmNjN8MTI4XStQdFtlPj44JjI1NV0rIi0iK1B0W2U+PjE2JjI1NV0rUHRbZT4+MjQmMjU1XStQdFtuJjI1NV0rUHRbbj4+OCYyNTVdK1B0W24+PjE2JjI1NV0rUHRbbj4+MjQmMjU1XSkudG9Mb3dlckNhc2UoKX1mdW5jdGlvbiBaKGksdCxlKXtyZXR1cm4gTWF0aC5tYXgodCxNYXRoLm1pbihlLGkpKX1mdW5jdGlvbiBmbyhpLHQpe3JldHVybihpJXQrdCkldH1mdW5jdGlvbiBNZihpLHQsZSxuLHMpe3JldHVybiBuKyhpLXQpKihzLW4pLyhlLXQpfWZ1bmN0aW9uIEFmKGksdCxlKXtyZXR1cm4gaSE9PXQ/KGUtaSkvKHQtaSk6MH1mdW5jdGlvbiBUaShpLHQsZSl7cmV0dXJuKDEtZSkqaStlKnR9ZnVuY3Rpb24gU2YoaSx0LGUsbil7cmV0dXJuIFRpKGksdCwxLU1hdGguZXhwKC1lKm4pKX1mdW5jdGlvbiB2ZihpLHQ9MSl7cmV0dXJuIHQtTWF0aC5hYnMoZm8oaSx0KjIpLXQpfWZ1bmN0aW9uIF9mKGksdCxlKXtyZXR1cm4gaTw9dD8wOmk+PWU/MTooaT0oaS10KS8oZS10KSxpKmkqKDMtMippKSl9ZnVuY3Rpb24gemYoaSx0LGUpe3JldHVybiBpPD10PzA6aT49ZT8xOihpPShpLXQpLyhlLXQpLGkqaSppKihpKihpKjYtMTUpKzEwKSl9ZnVuY3Rpb24gVGYoaSx0KXtyZXR1cm4gaStNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKHQtaSsxKSl9ZnVuY3Rpb24gUGYoaSx0KXtyZXR1cm4gaStNYXRoLnJhbmRvbSgpKih0LWkpfWZ1bmN0aW9uIENmKGkpe3JldHVybiBpKiguNS1NYXRoLnJhbmRvbSgpKX1mdW5jdGlvbiBFZihpKXtpIT09dm9pZCAwJiYoT2M9aSk7bGV0IHQ9T2MrPTE4MzE1NjU4MTM7cmV0dXJuIHQ9TWF0aC5pbXVsKHRedD4+PjE1LHR8MSksdF49dCtNYXRoLmltdWwodF50Pj4+Nyx0fDYxKSwoKHRedD4+PjE0KT4+PjApLzQyOTQ5NjcyOTZ9ZnVuY3Rpb24gQmYoaSl7cmV0dXJuIGkqRGN9ZnVuY3Rpb24gRmYoaSl7cmV0dXJuIGkqJGN9ZnVuY3Rpb24gSWYoaSl7cmV0dXJuKGkmaS0xKT09PTAmJmkhPT0wfWZ1bmN0aW9uIGtmKGkpe3JldHVybiBNYXRoLnBvdygyLE1hdGguY2VpbChNYXRoLmxvZyhpKS9NYXRoLkxOMikpfWZ1bmN0aW9uIE5mKGkpe3JldHVybiBNYXRoLnBvdygyLE1hdGguZmxvb3IoTWF0aC5sb2coaSkvTWF0aC5MTjIpKX1mdW5jdGlvbiBSZihpLHQsZSxuLHMpe2NvbnN0IHI9TWF0aC5jb3Msbz1NYXRoLnNpbixhPXIoZS8yKSxjPW8oZS8yKSxsPXIoKHQrbikvMiksaD1vKCh0K24pLzIpLHU9cigodC1uKS8yKSxmPW8oKHQtbikvMiksZD1yKChuLXQpLzIpLHA9bygobi10KS8yKTtzd2l0Y2gocyl7Y2FzZSJYWVgiOmkuc2V0KGEqaCxjKnUsYypmLGEqbCk7YnJlYWs7Y2FzZSJZWlkiOmkuc2V0KGMqZixhKmgsYyp1LGEqbCk7YnJlYWs7Y2FzZSJaWFoiOmkuc2V0KGMqdSxjKmYsYSpoLGEqbCk7YnJlYWs7Y2FzZSJYWlgiOmkuc2V0KGEqaCxjKnAsYypkLGEqbCk7YnJlYWs7Y2FzZSJZWFkiOmkuc2V0KGMqZCxhKmgsYypwLGEqbCk7YnJlYWs7Y2FzZSJaWVoiOmkuc2V0KGMqcCxjKmQsYSpoLGEqbCk7YnJlYWs7ZGVmYXVsdDpidCgiTWF0aFV0aWxzOiAuc2V0UXVhdGVybmlvbkZyb21Qcm9wZXJFdWxlcigpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrcyl9fWZ1bmN0aW9uIFZuKGksdCl7c3dpdGNoKHQuY29uc3RydWN0b3Ipe2Nhc2UgRmxvYXQzMkFycmF5OnJldHVybiBpO2Nhc2UgVWludDMyQXJyYXk6cmV0dXJuIGkvNDI5NDk2NzI5NTtjYXNlIFVpbnQxNkFycmF5OnJldHVybiBpLzY1NTM1O2Nhc2UgVWludDhBcnJheTpyZXR1cm4gaS8yNTU7Y2FzZSBJbnQzMkFycmF5OnJldHVybiBNYXRoLm1heChpLzIxNDc0ODM2NDcsLTEpO2Nhc2UgSW50MTZBcnJheTpyZXR1cm4gTWF0aC5tYXgoaS8zMjc2NywtMSk7Y2FzZSBJbnQ4QXJyYXk6cmV0dXJuIE1hdGgubWF4KGkvMTI3LC0xKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb21wb25lbnQgdHlwZS4iKX19ZnVuY3Rpb24ga3QoaSx0KXtzd2l0Y2godC5jb25zdHJ1Y3Rvcil7Y2FzZSBGbG9hdDMyQXJyYXk6cmV0dXJuIGk7Y2FzZSBVaW50MzJBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChpKjQyOTQ5NjcyOTUpO2Nhc2UgVWludDE2QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSo2NTUzNSk7Y2FzZSBVaW50OEFycmF5OnJldHVybiBNYXRoLnJvdW5kKGkqMjU1KTtjYXNlIEludDMyQXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSoyMTQ3NDgzNjQ3KTtjYXNlIEludDE2QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSozMjc2Nyk7Y2FzZSBJbnQ4QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSoxMjcpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCB0eXBlLiIpfX1jb25zdCBWYz17REVHMlJBRDpEYyxSQUQyREVHOiRjLGdlbmVyYXRlVVVJRDptbixjbGFtcDpaLGV1Y2xpZGVhbk1vZHVsbzpmbyxtYXBMaW5lYXI6TWYsaW52ZXJzZUxlcnA6QWYsbGVycDpUaSxkYW1wOlNmLHBpbmdwb25nOnZmLHNtb290aHN0ZXA6X2Ysc21vb3RoZXJzdGVwOnpmLHJhbmRJbnQ6VGYscmFuZEZsb2F0OlBmLHJhbmRGbG9hdFNwcmVhZDpDZixzZWVkZWRSYW5kb206RWYsZGVnVG9SYWQ6QmYscmFkVG9EZWc6RmYsaXNQb3dlck9mVHdvOklmLGNlaWxQb3dlck9mVHdvOmtmLGZsb29yUG93ZXJPZlR3bzpOZixzZXRRdWF0ZXJuaW9uRnJvbVByb3BlckV1bGVyOlJmLG5vcm1hbGl6ZTprdCxkZW5vcm1hbGl6ZTpWbn07Y2xhc3Mga3tjb25zdHJ1Y3Rvcih0PTAsZT0wKXtrLnByb3RvdHlwZS5pc1ZlY3RvcjI9ITAsdGhpcy54PXQsdGhpcy55PWV9Z2V0IHdpZHRoKCl7cmV0dXJuIHRoaXMueH1zZXQgd2lkdGgodCl7dGhpcy54PXR9Z2V0IGhlaWdodCgpe3JldHVybiB0aGlzLnl9c2V0IGhlaWdodCh0KXt0aGlzLnk9dH1zZXQodCxlKXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PWUsdGhpc31zZXRTY2FsYXIodCl7cmV0dXJuIHRoaXMueD10LHRoaXMueT10LHRoaXN9c2V0WCh0KXtyZXR1cm4gdGhpcy54PXQsdGhpc31zZXRZKHQpe3JldHVybiB0aGlzLnk9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9cmV0dXJuIHRoaXN9Z2V0Q29tcG9uZW50KHQpe3N3aXRjaCh0KXtjYXNlIDA6cmV0dXJuIHRoaXMueDtjYXNlIDE6cmV0dXJuIHRoaXMueTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55KX1jb3B5KHQpe3JldHVybiB0aGlzLng9dC54LHRoaXMueT10LnksdGhpc31hZGQodCl7cmV0dXJuIHRoaXMueCs9dC54LHRoaXMueSs9dC55LHRoaXN9YWRkU2NhbGFyKHQpe3JldHVybiB0aGlzLngrPXQsdGhpcy55Kz10LHRoaXN9YWRkVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54K2UueCx0aGlzLnk9dC55K2UueSx0aGlzfWFkZFNjYWxlZFZlY3Rvcih0LGUpe3JldHVybiB0aGlzLngrPXQueCplLHRoaXMueSs9dC55KmUsdGhpc31zdWIodCl7cmV0dXJuIHRoaXMueC09dC54LHRoaXMueS09dC55LHRoaXN9c3ViU2NhbGFyKHQpe3JldHVybiB0aGlzLngtPXQsdGhpcy55LT10LHRoaXN9c3ViVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54LWUueCx0aGlzLnk9dC55LWUueSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXN9ZGl2aWRlKHQpe3JldHVybiB0aGlzLngvPXQueCx0aGlzLnkvPXQueSx0aGlzfWRpdmlkZVNjYWxhcih0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhcigxL3QpfWFwcGx5TWF0cml4Myh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxzPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1zWzBdKmUrc1szXSpuK3NbNl0sdGhpcy55PXNbMV0qZStzWzRdKm4rc1s3XSx0aGlzfW1pbih0KXtyZXR1cm4gdGhpcy54PU1hdGgubWluKHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1pbih0aGlzLnksdC55KSx0aGlzfW1heCh0KXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1heCh0aGlzLnksdC55KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1aKHRoaXMueCx0LngsZS54KSx0aGlzLnk9Wih0aGlzLnksdC55LGUueSksdGhpc31jbGFtcFNjYWxhcih0LGUpe3JldHVybiB0aGlzLng9Wih0aGlzLngsdCxlKSx0aGlzLnk9Wih0aGlzLnksdCxlKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgbj10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihufHwxKS5tdWx0aXBseVNjYWxhcihaKG4sdCxlKSl9Zmxvb3IoKXtyZXR1cm4gdGhpcy54PU1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXN9cm91bmQoKXtyZXR1cm4gdGhpcy54PU1hdGgucm91bmQodGhpcy54KSx0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXN9bmVnYXRlKCl7cmV0dXJuIHRoaXMueD0tdGhpcy54LHRoaXMueT0tdGhpcy55LHRoaXN9ZG90KHQpe3JldHVybiB0aGlzLngqdC54K3RoaXMueSp0Lnl9Y3Jvc3ModCl7cmV0dXJuIHRoaXMueCp0LnktdGhpcy55KnQueH1sZW5ndGhTcSgpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnl9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkpfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSl9bm9ybWFsaXplKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfWFuZ2xlKCl7cmV0dXJuIE1hdGguYXRhbjIoLXRoaXMueSwtdGhpcy54KStNYXRoLlBJfWFuZ2xlVG8odCl7Y29uc3QgZT1NYXRoLnNxcnQodGhpcy5sZW5ndGhTcSgpKnQubGVuZ3RoU3EoKSk7aWYoZT09PTApcmV0dXJuIE1hdGguUEkvMjtjb25zdCBuPXRoaXMuZG90KHQpL2U7cmV0dXJuIE1hdGguYWNvcyhaKG4sLTEsMSkpfWRpc3RhbmNlVG8odCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKHQpKX1kaXN0YW5jZVRvU3F1YXJlZCh0KXtjb25zdCBlPXRoaXMueC10Lngsbj10aGlzLnktdC55O3JldHVybiBlKmUrbipufW1hbmhhdHRhbkRpc3RhbmNlVG8odCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC10LngpK01hdGguYWJzKHRoaXMueS10LnkpfXNldExlbmd0aCh0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0KX1sZXJwKHQsZSl7cmV0dXJuIHRoaXMueCs9KHQueC10aGlzLngpKmUsdGhpcy55Kz0odC55LXRoaXMueSkqZSx0aGlzfWxlcnBWZWN0b3JzKHQsZSxuKXtyZXR1cm4gdGhpcy54PXQueCsoZS54LXQueCkqbix0aGlzLnk9dC55KyhlLnktdC55KSpuLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lng9PT10aGlzLngmJnQueT09PXRoaXMueX1mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLng9dFtlXSx0aGlzLnk9dFtlKzFdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy54LHRbZSsxXT10aGlzLnksdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzfXJvdGF0ZUFyb3VuZCh0LGUpe2NvbnN0IG49TWF0aC5jb3MoZSkscz1NYXRoLnNpbihlKSxyPXRoaXMueC10Lngsbz10aGlzLnktdC55O3JldHVybiB0aGlzLng9cipuLW8qcyt0LngsdGhpcy55PXIqcytvKm4rdC55LHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXN9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy54LHlpZWxkIHRoaXMueX19Y2xhc3MgUGl7Y29uc3RydWN0b3IodD0wLGU9MCxuPTAscz0xKXt0aGlzLmlzUXVhdGVybmlvbj0hMCx0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl93PXN9c3RhdGljIHNsZXJwRmxhdCh0LGUsbixzLHIsbyxhKXtsZXQgYz1uW3MrMF0sbD1uW3MrMV0saD1uW3MrMl0sdT1uW3MrM10sZj1yW28rMF0sZD1yW28rMV0scD1yW28rMl0seT1yW28rM107aWYoYTw9MCl7dFtlKzBdPWMsdFtlKzFdPWwsdFtlKzJdPWgsdFtlKzNdPXU7cmV0dXJufWlmKGE+PTEpe3RbZSswXT1mLHRbZSsxXT1kLHRbZSsyXT1wLHRbZSszXT15O3JldHVybn1pZih1IT09eXx8YyE9PWZ8fGwhPT1kfHxoIT09cCl7bGV0IGc9YypmK2wqZCtoKnArdSp5O2c8MCYmKGY9LWYsZD0tZCxwPS1wLHk9LXksZz0tZyk7bGV0IHc9MS1hO2lmKGc8Ljk5OTUpe2NvbnN0IGI9TWF0aC5hY29zKGcpLHg9TWF0aC5zaW4oYik7dz1NYXRoLnNpbih3KmIpL3gsYT1NYXRoLnNpbihhKmIpL3gsYz1jKncrZiphLGw9bCp3K2QqYSxoPWgqdytwKmEsdT11KncreSphfWVsc2V7Yz1jKncrZiphLGw9bCp3K2QqYSxoPWgqdytwKmEsdT11KncreSphO2NvbnN0IGI9MS9NYXRoLnNxcnQoYypjK2wqbCtoKmgrdSp1KTtjKj1iLGwqPWIsaCo9Yix1Kj1ifX10W2VdPWMsdFtlKzFdPWwsdFtlKzJdPWgsdFtlKzNdPXV9c3RhdGljIG11bHRpcGx5UXVhdGVybmlvbnNGbGF0KHQsZSxuLHMscixvKXtjb25zdCBhPW5bc10sYz1uW3MrMV0sbD1uW3MrMl0saD1uW3MrM10sdT1yW29dLGY9cltvKzFdLGQ9cltvKzJdLHA9cltvKzNdO3JldHVybiB0W2VdPWEqcCtoKnUrYypkLWwqZix0W2UrMV09YypwK2gqZitsKnUtYSpkLHRbZSsyXT1sKnAraCpkK2EqZi1jKnUsdFtlKzNdPWgqcC1hKnUtYypmLWwqZCx0fWdldCB4KCl7cmV0dXJuIHRoaXMuX3h9c2V0IHgodCl7dGhpcy5feD10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeSgpe3JldHVybiB0aGlzLl95fXNldCB5KHQpe3RoaXMuX3k9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHooKXtyZXR1cm4gdGhpcy5fen1zZXQgeih0KXt0aGlzLl96PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB3KCl7cmV0dXJuIHRoaXMuX3d9c2V0IHcodCl7dGhpcy5fdz10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1zZXQodCxlLG4scyl7cmV0dXJuIHRoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1uLHRoaXMuX3c9cyx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLl94LHRoaXMuX3ksdGhpcy5feix0aGlzLl93KX1jb3B5KHQpe3JldHVybiB0aGlzLl94PXQueCx0aGlzLl95PXQueSx0aGlzLl96PXQueix0aGlzLl93PXQudyx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tRXVsZXIodCxlPSEwKXtjb25zdCBuPXQuX3gscz10Ll95LHI9dC5feixvPXQuX29yZGVyLGE9TWF0aC5jb3MsYz1NYXRoLnNpbixsPWEobi8yKSxoPWEocy8yKSx1PWEoci8yKSxmPWMobi8yKSxkPWMocy8yKSxwPWMoci8yKTtzd2l0Y2gobyl7Y2FzZSJYWVoiOnRoaXMuX3g9ZipoKnUrbCpkKnAsdGhpcy5feT1sKmQqdS1mKmgqcCx0aGlzLl96PWwqaCpwK2YqZCp1LHRoaXMuX3c9bCpoKnUtZipkKnA7YnJlYWs7Y2FzZSJZWFoiOnRoaXMuX3g9ZipoKnUrbCpkKnAsdGhpcy5feT1sKmQqdS1mKmgqcCx0aGlzLl96PWwqaCpwLWYqZCp1LHRoaXMuX3c9bCpoKnUrZipkKnA7YnJlYWs7Y2FzZSJaWFkiOnRoaXMuX3g9ZipoKnUtbCpkKnAsdGhpcy5feT1sKmQqdStmKmgqcCx0aGlzLl96PWwqaCpwK2YqZCp1LHRoaXMuX3c9bCpoKnUtZipkKnA7YnJlYWs7Y2FzZSJaWVgiOnRoaXMuX3g9ZipoKnUtbCpkKnAsdGhpcy5feT1sKmQqdStmKmgqcCx0aGlzLl96PWwqaCpwLWYqZCp1LHRoaXMuX3c9bCpoKnUrZipkKnA7YnJlYWs7Y2FzZSJZWlgiOnRoaXMuX3g9ZipoKnUrbCpkKnAsdGhpcy5feT1sKmQqdStmKmgqcCx0aGlzLl96PWwqaCpwLWYqZCp1LHRoaXMuX3c9bCpoKnUtZipkKnA7YnJlYWs7Y2FzZSJYWlkiOnRoaXMuX3g9ZipoKnUtbCpkKnAsdGhpcy5feT1sKmQqdS1mKmgqcCx0aGlzLl96PWwqaCpwK2YqZCp1LHRoaXMuX3c9bCpoKnUrZipkKnA7YnJlYWs7ZGVmYXVsdDpidCgiUXVhdGVybmlvbjogLnNldEZyb21FdWxlcigpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrbyl9cmV0dXJuIGU9PT0hMCYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbUF4aXNBbmdsZSh0LGUpe2NvbnN0IG49ZS8yLHM9TWF0aC5zaW4obik7cmV0dXJuIHRoaXMuX3g9dC54KnMsdGhpcy5feT10Lnkqcyx0aGlzLl96PXQueipzLHRoaXMuX3c9TWF0aC5jb3MobiksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVJvdGF0aW9uTWF0cml4KHQpe2NvbnN0IGU9dC5lbGVtZW50cyxuPWVbMF0scz1lWzRdLHI9ZVs4XSxvPWVbMV0sYT1lWzVdLGM9ZVs5XSxsPWVbMl0saD1lWzZdLHU9ZVsxMF0sZj1uK2ErdTtpZihmPjApe2NvbnN0IGQ9LjUvTWF0aC5zcXJ0KGYrMSk7dGhpcy5fdz0uMjUvZCx0aGlzLl94PShoLWMpKmQsdGhpcy5feT0oci1sKSpkLHRoaXMuX3o9KG8tcykqZH1lbHNlIGlmKG4+YSYmbj51KXtjb25zdCBkPTIqTWF0aC5zcXJ0KDErbi1hLXUpO3RoaXMuX3c9KGgtYykvZCx0aGlzLl94PS4yNSpkLHRoaXMuX3k9KHMrbykvZCx0aGlzLl96PShyK2wpL2R9ZWxzZSBpZihhPnUpe2NvbnN0IGQ9MipNYXRoLnNxcnQoMSthLW4tdSk7dGhpcy5fdz0oci1sKS9kLHRoaXMuX3g9KHMrbykvZCx0aGlzLl95PS4yNSpkLHRoaXMuX3o9KGMraCkvZH1lbHNle2NvbnN0IGQ9MipNYXRoLnNxcnQoMSt1LW4tYSk7dGhpcy5fdz0oby1zKS9kLHRoaXMuX3g9KHIrbCkvZCx0aGlzLl95PShjK2gpL2QsdGhpcy5fej0uMjUqZH1yZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVVuaXRWZWN0b3JzKHQsZSl7bGV0IG49dC5kb3QoZSkrMTtyZXR1cm4gbjwxZS04PyhuPTAsTWF0aC5hYnModC54KT5NYXRoLmFicyh0LnopPyh0aGlzLl94PS10LnksdGhpcy5feT10LngsdGhpcy5fej0wLHRoaXMuX3c9bik6KHRoaXMuX3g9MCx0aGlzLl95PS10LnosdGhpcy5fej10LnksdGhpcy5fdz1uKSk6KHRoaXMuX3g9dC55KmUuei10LnoqZS55LHRoaXMuX3k9dC56KmUueC10LngqZS56LHRoaXMuX3o9dC54KmUueS10LnkqZS54LHRoaXMuX3c9biksdGhpcy5ub3JtYWxpemUoKX1hbmdsZVRvKHQpe3JldHVybiAyKk1hdGguYWNvcyhNYXRoLmFicyhaKHRoaXMuZG90KHQpLC0xLDEpKSl9cm90YXRlVG93YXJkcyh0LGUpe2NvbnN0IG49dGhpcy5hbmdsZVRvKHQpO2lmKG49PT0wKXJldHVybiB0aGlzO2NvbnN0IHM9TWF0aC5taW4oMSxlL24pO3JldHVybiB0aGlzLnNsZXJwKHQscyksdGhpc31pZGVudGl0eSgpe3JldHVybiB0aGlzLnNldCgwLDAsMCwxKX1pbnZlcnQoKXtyZXR1cm4gdGhpcy5jb25qdWdhdGUoKX1jb25qdWdhdGUoKXtyZXR1cm4gdGhpcy5feCo9LTEsdGhpcy5feSo9LTEsdGhpcy5feio9LTEsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9ZG90KHQpe3JldHVybiB0aGlzLl94KnQuX3grdGhpcy5feSp0Ll95K3RoaXMuX3oqdC5feit0aGlzLl93KnQuX3d9bGVuZ3RoU3EoKXtyZXR1cm4gdGhpcy5feCp0aGlzLl94K3RoaXMuX3kqdGhpcy5feSt0aGlzLl96KnRoaXMuX3ordGhpcy5fdyp0aGlzLl93fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy5feCp0aGlzLl94K3RoaXMuX3kqdGhpcy5feSt0aGlzLl96KnRoaXMuX3ordGhpcy5fdyp0aGlzLl93KX1ub3JtYWxpemUoKXtsZXQgdD10aGlzLmxlbmd0aCgpO3JldHVybiB0PT09MD8odGhpcy5feD0wLHRoaXMuX3k9MCx0aGlzLl96PTAsdGhpcy5fdz0xKToodD0xL3QsdGhpcy5feD10aGlzLl94KnQsdGhpcy5feT10aGlzLl95KnQsdGhpcy5fej10aGlzLl96KnQsdGhpcy5fdz10aGlzLl93KnQpLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnModGhpcyx0KX1wcmVtdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHQsdGhpcyl9bXVsdGlwbHlRdWF0ZXJuaW9ucyh0LGUpe2NvbnN0IG49dC5feCxzPXQuX3kscj10Ll96LG89dC5fdyxhPWUuX3gsYz1lLl95LGw9ZS5feixoPWUuX3c7cmV0dXJuIHRoaXMuX3g9bipoK28qYStzKmwtcipjLHRoaXMuX3k9cypoK28qYytyKmEtbipsLHRoaXMuX3o9cipoK28qbCtuKmMtcyphLHRoaXMuX3c9bypoLW4qYS1zKmMtcipsLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNsZXJwKHQsZSl7aWYoZTw9MClyZXR1cm4gdGhpcztpZihlPj0xKXJldHVybiB0aGlzLmNvcHkodCk7bGV0IG49dC5feCxzPXQuX3kscj10Ll96LG89dC5fdyxhPXRoaXMuZG90KHQpO2E8MCYmKG49LW4scz0tcyxyPS1yLG89LW8sYT0tYSk7bGV0IGM9MS1lO2lmKGE8Ljk5OTUpe2NvbnN0IGw9TWF0aC5hY29zKGEpLGg9TWF0aC5zaW4obCk7Yz1NYXRoLnNpbihjKmwpL2gsZT1NYXRoLnNpbihlKmwpL2gsdGhpcy5feD10aGlzLl94KmMrbiplLHRoaXMuX3k9dGhpcy5feSpjK3MqZSx0aGlzLl96PXRoaXMuX3oqYytyKmUsdGhpcy5fdz10aGlzLl93KmMrbyplLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1lbHNlIHRoaXMuX3g9dGhpcy5feCpjK24qZSx0aGlzLl95PXRoaXMuX3kqYytzKmUsdGhpcy5fej10aGlzLl96KmMrciplLHRoaXMuX3c9dGhpcy5fdypjK28qZSx0aGlzLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzfXNsZXJwUXVhdGVybmlvbnModCxlLG4pe3JldHVybiB0aGlzLmNvcHkodCkuc2xlcnAoZSxuKX1yYW5kb20oKXtjb25zdCB0PTIqTWF0aC5QSSpNYXRoLnJhbmRvbSgpLGU9MipNYXRoLlBJKk1hdGgucmFuZG9tKCksbj1NYXRoLnJhbmRvbSgpLHM9TWF0aC5zcXJ0KDEtbikscj1NYXRoLnNxcnQobik7cmV0dXJuIHRoaXMuc2V0KHMqTWF0aC5zaW4odCkscypNYXRoLmNvcyh0KSxyKk1hdGguc2luKGUpLHIqTWF0aC5jb3MoZSkpfWVxdWFscyh0KXtyZXR1cm4gdC5feD09PXRoaXMuX3gmJnQuX3k9PT10aGlzLl95JiZ0Ll96PT09dGhpcy5feiYmdC5fdz09PXRoaXMuX3d9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy5feD10W2VdLHRoaXMuX3k9dFtlKzFdLHRoaXMuX3o9dFtlKzJdLHRoaXMuX3c9dFtlKzNdLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMuX3gsdFtlKzFdPXRoaXMuX3ksdFtlKzJdPXRoaXMuX3osdFtlKzNdPXRoaXMuX3csdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMuX3g9dC5nZXRYKGUpLHRoaXMuX3k9dC5nZXRZKGUpLHRoaXMuX3o9dC5nZXRaKGUpLHRoaXMuX3c9dC5nZXRXKGUpLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvSlNPTigpe3JldHVybiB0aGlzLnRvQXJyYXkoKX1fb25DaGFuZ2UodCl7cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2s9dCx0aGlzfV9vbkNoYW5nZUNhbGxiYWNrKCl7fSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMuX3gseWllbGQgdGhpcy5feSx5aWVsZCB0aGlzLl96LHlpZWxkIHRoaXMuX3d9fWNsYXNzIFB7Y29uc3RydWN0b3IodD0wLGU9MCxuPTApe1AucHJvdG90eXBlLmlzVmVjdG9yMz0hMCx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bn1zZXQodCxlLG4pe3JldHVybiBuPT09dm9pZCAwJiYobj10aGlzLnopLHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzLno9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRaKHQpe3JldHVybiB0aGlzLno9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7Y2FzZSAyOnJldHVybiB0aGlzLno7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnopfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzLno9dC56LHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzLnorPXQueix0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzLnorPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXMuej10LnorZS56LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzLnorPXQueiplLHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzLnotPXQueix0aGlzfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzLnotPXQsdGhpc31zdWJWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngtZS54LHRoaXMueT10LnktZS55LHRoaXMuej10LnotZS56LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXMueio9dC56LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpcy56Kj10LHRoaXN9bXVsdGlwbHlWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngqZS54LHRoaXMueT10LnkqZS55LHRoaXMuej10LnoqZS56LHRoaXN9YXBwbHlFdWxlcih0KXtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oVWMuc2V0RnJvbUV1bGVyKHQpKX1hcHBseUF4aXNBbmdsZSh0LGUpe3JldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbihVYy5zZXRGcm9tQXhpc0FuZ2xlKHQsZSkpfWFwcGx5TWF0cml4Myh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxzPXRoaXMueixyPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1yWzBdKmUrclszXSpuK3JbNl0qcyx0aGlzLnk9clsxXSplK3JbNF0qbityWzddKnMsdGhpcy56PXJbMl0qZStyWzVdKm4rcls4XSpzLHRoaXN9YXBwbHlOb3JtYWxNYXRyaXgodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXgzKHQpLm5vcm1hbGl6ZSgpfWFwcGx5TWF0cml4NCh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxzPXRoaXMueixyPXQuZWxlbWVudHMsbz0xLyhyWzNdKmUrcls3XSpuK3JbMTFdKnMrclsxNV0pO3JldHVybiB0aGlzLng9KHJbMF0qZStyWzRdKm4rcls4XSpzK3JbMTJdKSpvLHRoaXMueT0oclsxXSplK3JbNV0qbityWzldKnMrclsxM10pKm8sdGhpcy56PShyWzJdKmUrcls2XSpuK3JbMTBdKnMrclsxNF0pKm8sdGhpc31hcHBseVF1YXRlcm5pb24odCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscz10aGlzLnoscj10Lngsbz10LnksYT10LnosYz10LncsbD0yKihvKnMtYSpuKSxoPTIqKGEqZS1yKnMpLHU9MioocipuLW8qZSk7cmV0dXJuIHRoaXMueD1lK2MqbCtvKnUtYSpoLHRoaXMueT1uK2MqaCthKmwtcip1LHRoaXMuej1zK2MqdStyKmgtbypsLHRoaXN9cHJvamVjdCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZEludmVyc2UpLmFwcGx5TWF0cml4NCh0LnByb2plY3Rpb25NYXRyaXgpfXVucHJvamVjdCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQodC5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSkuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpfXRyYW5zZm9ybURpcmVjdGlvbih0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxzPXRoaXMueixyPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1yWzBdKmUrcls0XSpuK3JbOF0qcyx0aGlzLnk9clsxXSplK3JbNV0qbityWzldKnMsdGhpcy56PXJbMl0qZStyWzZdKm4rclsxMF0qcyx0aGlzLm5vcm1hbGl6ZSgpfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpcy56Lz10LnosdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpcy56PU1hdGgubWluKHRoaXMueix0LnopLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1heCh0aGlzLnosdC56KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1aKHRoaXMueCx0LngsZS54KSx0aGlzLnk9Wih0aGlzLnksdC55LGUueSksdGhpcy56PVoodGhpcy56LHQueixlLnopLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PVoodGhpcy54LHQsZSksdGhpcy55PVoodGhpcy55LHQsZSksdGhpcy56PVoodGhpcy56LHQsZSksdGhpc31jbGFtcExlbmd0aCh0LGUpe2NvbnN0IG49dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIobnx8MSkubXVsdGlwbHlTY2FsYXIoWihuLHQsZSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXMuej1NYXRoLnRydW5jKHRoaXMueiksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueSt0aGlzLnoqdC56fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnopfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXMueis9KHQuei10aGlzLnopKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUsbil7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKm4sdGhpcy55PXQueSsoZS55LXQueSkqbix0aGlzLno9dC56KyhlLnotdC56KSpuLHRoaXN9Y3Jvc3ModCl7cmV0dXJuIHRoaXMuY3Jvc3NWZWN0b3JzKHRoaXMsdCl9Y3Jvc3NWZWN0b3JzKHQsZSl7Y29uc3Qgbj10Lngscz10Lnkscj10Lnosbz1lLngsYT1lLnksYz1lLno7cmV0dXJuIHRoaXMueD1zKmMtciphLHRoaXMueT1yKm8tbipjLHRoaXMuej1uKmEtcypvLHRoaXN9cHJvamVjdE9uVmVjdG9yKHQpe2NvbnN0IGU9dC5sZW5ndGhTcSgpO2lmKGU9PT0wKXJldHVybiB0aGlzLnNldCgwLDAsMCk7Y29uc3Qgbj10LmRvdCh0aGlzKS9lO3JldHVybiB0aGlzLmNvcHkodCkubXVsdGlwbHlTY2FsYXIobil9cHJvamVjdE9uUGxhbmUodCl7cmV0dXJuIHBvLmNvcHkodGhpcykucHJvamVjdE9uVmVjdG9yKHQpLHRoaXMuc3ViKHBvKX1yZWZsZWN0KHQpe3JldHVybiB0aGlzLnN1Yihwby5jb3B5KHQpLm11bHRpcGx5U2NhbGFyKDIqdGhpcy5kb3QodCkpKX1hbmdsZVRvKHQpe2NvbnN0IGU9TWF0aC5zcXJ0KHRoaXMubGVuZ3RoU3EoKSp0Lmxlbmd0aFNxKCkpO2lmKGU9PT0wKXJldHVybiBNYXRoLlBJLzI7Y29uc3Qgbj10aGlzLmRvdCh0KS9lO3JldHVybiBNYXRoLmFjb3MoWihuLC0xLDEpKX1kaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZCh0KSl9ZGlzdGFuY2VUb1NxdWFyZWQodCl7Y29uc3QgZT10aGlzLngtdC54LG49dGhpcy55LXQueSxzPXRoaXMuei10Lno7cmV0dXJuIGUqZStuKm4rcypzfW1hbmhhdHRhbkRpc3RhbmNlVG8odCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC10LngpK01hdGguYWJzKHRoaXMueS10LnkpK01hdGguYWJzKHRoaXMuei10LnopfXNldEZyb21TcGhlcmljYWwodCl7cmV0dXJuIHRoaXMuc2V0RnJvbVNwaGVyaWNhbENvb3Jkcyh0LnJhZGl1cyx0LnBoaSx0LnRoZXRhKX1zZXRGcm9tU3BoZXJpY2FsQ29vcmRzKHQsZSxuKXtjb25zdCBzPU1hdGguc2luKGUpKnQ7cmV0dXJuIHRoaXMueD1zKk1hdGguc2luKG4pLHRoaXMueT1NYXRoLmNvcyhlKSp0LHRoaXMuej1zKk1hdGguY29zKG4pLHRoaXN9c2V0RnJvbUN5bGluZHJpY2FsKHQpe3JldHVybiB0aGlzLnNldEZyb21DeWxpbmRyaWNhbENvb3Jkcyh0LnJhZGl1cyx0LnRoZXRhLHQueSl9c2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzKHQsZSxuKXtyZXR1cm4gdGhpcy54PXQqTWF0aC5zaW4oZSksdGhpcy55PW4sdGhpcy56PXQqTWF0aC5jb3MoZSksdGhpc31zZXRGcm9tTWF0cml4UG9zaXRpb24odCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9ZVsxMl0sdGhpcy55PWVbMTNdLHRoaXMuej1lWzE0XSx0aGlzfXNldEZyb21NYXRyaXhTY2FsZSh0KXtjb25zdCBlPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDApLmxlbmd0aCgpLG49dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMSkubGVuZ3RoKCkscz10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4odCwyKS5sZW5ndGgoKTtyZXR1cm4gdGhpcy54PWUsdGhpcy55PW4sdGhpcy56PXMsdGhpc31zZXRGcm9tTWF0cml4Q29sdW1uKHQsZSl7cmV0dXJuIHRoaXMuZnJvbUFycmF5KHQuZWxlbWVudHMsZSo0KX1zZXRGcm9tTWF0cml4M0NvbHVtbih0LGUpe3JldHVybiB0aGlzLmZyb21BcnJheSh0LmVsZW1lbnRzLGUqMyl9c2V0RnJvbUV1bGVyKHQpe3JldHVybiB0aGlzLng9dC5feCx0aGlzLnk9dC5feSx0aGlzLno9dC5feix0aGlzfXNldEZyb21Db2xvcih0KXtyZXR1cm4gdGhpcy54PXQucix0aGlzLnk9dC5nLHRoaXMuej10LmIsdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55JiZ0Lno9PT10aGlzLnp9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzLno9dFtlKzJdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy54LHRbZSsxXT10aGlzLnksdFtlKzJdPXRoaXMueix0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXMuej10LmdldFooZSksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpcy56PU1hdGgucmFuZG9tKCksdGhpc31yYW5kb21EaXJlY3Rpb24oKXtjb25zdCB0PU1hdGgucmFuZG9tKCkqTWF0aC5QSSoyLGU9TWF0aC5yYW5kb20oKSoyLTEsbj1NYXRoLnNxcnQoMS1lKmUpO3JldHVybiB0aGlzLng9bipNYXRoLmNvcyh0KSx0aGlzLnk9ZSx0aGlzLno9bipNYXRoLnNpbih0KSx0aGlzfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMueCx5aWVsZCB0aGlzLnkseWllbGQgdGhpcy56fX1jb25zdCBwbz1uZXcgUCxVYz1uZXcgUGk7Y2xhc3MgTWV7Y29uc3RydWN0b3IodCxlLG4scyxyLG8sYSxjLGwpe01lLnByb3RvdHlwZS5pc01hdHJpeDM9ITAsdGhpcy5lbGVtZW50cz1bMSwwLDAsMCwxLDAsMCwwLDFdLHQhPT12b2lkIDAmJnRoaXMuc2V0KHQsZSxuLHMscixvLGEsYyxsKX1zZXQodCxlLG4scyxyLG8sYSxjLGwpe2NvbnN0IGg9dGhpcy5lbGVtZW50cztyZXR1cm4gaFswXT10LGhbMV09cyxoWzJdPWEsaFszXT1lLGhbNF09cixoWzVdPWMsaFs2XT1uLGhbN109byxoWzhdPWwsdGhpc31pZGVudGl0eSgpe3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDEsMCwwLDAsMSksdGhpc31jb3B5KHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7cmV0dXJuIGVbMF09blswXSxlWzFdPW5bMV0sZVsyXT1uWzJdLGVbM109blszXSxlWzRdPW5bNF0sZVs1XT1uWzVdLGVbNl09bls2XSxlWzddPW5bN10sZVs4XT1uWzhdLHRoaXN9ZXh0cmFjdEJhc2lzKHQsZSxuKXtyZXR1cm4gdC5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDApLGUuc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywxKSxuLnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMiksdGhpc31zZXRGcm9tTWF0cml4NCh0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMuc2V0KGVbMF0sZVs0XSxlWzhdLGVbMV0sZVs1XSxlWzldLGVbMl0sZVs2XSxlWzEwXSksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0LHRoaXMpfW11bHRpcGx5TWF0cmljZXModCxlKXtjb25zdCBuPXQuZWxlbWVudHMscz1lLmVsZW1lbnRzLHI9dGhpcy5lbGVtZW50cyxvPW5bMF0sYT1uWzNdLGM9bls2XSxsPW5bMV0saD1uWzRdLHU9bls3XSxmPW5bMl0sZD1uWzVdLHA9bls4XSx5PXNbMF0sZz1zWzNdLHc9c1s2XSxiPXNbMV0seD1zWzRdLG09c1s3XSxNPXNbMl0sUz1zWzVdLEE9c1s4XTtyZXR1cm4gclswXT1vKnkrYSpiK2MqTSxyWzNdPW8qZythKngrYypTLHJbNl09byp3K2EqbStjKkEsclsxXT1sKnkraCpiK3UqTSxyWzRdPWwqZytoKngrdSpTLHJbN109bCp3K2gqbSt1KkEsclsyXT1mKnkrZCpiK3AqTSxyWzVdPWYqZytkKngrcCpTLHJbOF09Zip3K2QqbStwKkEsdGhpc31tdWx0aXBseVNjYWxhcih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIGVbMF0qPXQsZVszXSo9dCxlWzZdKj10LGVbMV0qPXQsZVs0XSo9dCxlWzddKj10LGVbMl0qPXQsZVs1XSo9dCxlWzhdKj10LHRoaXN9ZGV0ZXJtaW5hbnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFsxXSxzPXRbMl0scj10WzNdLG89dFs0XSxhPXRbNV0sYz10WzZdLGw9dFs3XSxoPXRbOF07cmV0dXJuIGUqbypoLWUqYSpsLW4qcipoK24qYSpjK3MqcipsLXMqbypjfWludmVydCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzFdLHM9dFsyXSxyPXRbM10sbz10WzRdLGE9dFs1XSxjPXRbNl0sbD10WzddLGg9dFs4XSx1PWgqby1hKmwsZj1hKmMtaCpyLGQ9bCpyLW8qYyxwPWUqdStuKmYrcypkO2lmKHA9PT0wKXJldHVybiB0aGlzLnNldCgwLDAsMCwwLDAsMCwwLDAsMCk7Y29uc3QgeT0xL3A7cmV0dXJuIHRbMF09dSp5LHRbMV09KHMqbC1oKm4pKnksdFsyXT0oYSpuLXMqbykqeSx0WzNdPWYqeSx0WzRdPShoKmUtcypjKSp5LHRbNV09KHMqci1hKmUpKnksdFs2XT1kKnksdFs3XT0obipjLWwqZSkqeSx0WzhdPShvKmUtbipyKSp5LHRoaXN9dHJhbnNwb3NlKCl7bGV0IHQ7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiB0PWVbMV0sZVsxXT1lWzNdLGVbM109dCx0PWVbMl0sZVsyXT1lWzZdLGVbNl09dCx0PWVbNV0sZVs1XT1lWzddLGVbN109dCx0aGlzfWdldE5vcm1hbE1hdHJpeCh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4NCh0KS5pbnZlcnQoKS50cmFuc3Bvc2UoKX10cmFuc3Bvc2VJbnRvQXJyYXkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzNdLHRbMl09ZVs2XSx0WzNdPWVbMV0sdFs0XT1lWzRdLHRbNV09ZVs3XSx0WzZdPWVbMl0sdFs3XT1lWzVdLHRbOF09ZVs4XSx0aGlzfXNldFV2VHJhbnNmb3JtKHQsZSxuLHMscixvLGEpe2NvbnN0IGM9TWF0aC5jb3MociksbD1NYXRoLnNpbihyKTtyZXR1cm4gdGhpcy5zZXQobipjLG4qbCwtbiooYypvK2wqYSkrbyt0LC1zKmwscypjLC1zKigtbCpvK2MqYSkrYStlLDAsMCwxKSx0aGlzfXNjYWxlKHQsZSl7cmV0dXJuIHRoaXMucHJlbXVsdGlwbHkoeW8ubWFrZVNjYWxlKHQsZSkpLHRoaXN9cm90YXRlKHQpe3JldHVybiB0aGlzLnByZW11bHRpcGx5KHlvLm1ha2VSb3RhdGlvbigtdCkpLHRoaXN9dHJhbnNsYXRlKHQsZSl7cmV0dXJuIHRoaXMucHJlbXVsdGlwbHkoeW8ubWFrZVRyYW5zbGF0aW9uKHQsZSkpLHRoaXN9bWFrZVRyYW5zbGF0aW9uKHQsZSl7cmV0dXJuIHQuaXNWZWN0b3IyP3RoaXMuc2V0KDEsMCx0LngsMCwxLHQueSwwLDAsMSk6dGhpcy5zZXQoMSwwLHQsMCwxLGUsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoZSwtbiwwLG4sZSwwLDAsMCwxKSx0aGlzfW1ha2VTY2FsZSh0LGUpe3JldHVybiB0aGlzLnNldCh0LDAsMCwwLGUsMCwwLDAsMSksdGhpc31lcXVhbHModCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztmb3IobGV0IHM9MDtzPDk7cysrKWlmKGVbc10hPT1uW3NdKXJldHVybiExO3JldHVybiEwfWZyb21BcnJheSh0LGU9MCl7Zm9yKGxldCBuPTA7bjw5O24rKyl0aGlzLmVsZW1lbnRzW25dPXRbbitlXTtyZXR1cm4gdGhpc310b0FycmF5KHQ9W10sZT0wKXtjb25zdCBuPXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbZV09blswXSx0W2UrMV09blsxXSx0W2UrMl09blsyXSx0W2UrM109blszXSx0W2UrNF09bls0XSx0W2UrNV09bls1XSx0W2UrNl09bls2XSx0W2UrN109bls3XSx0W2UrOF09bls4XSx0fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfX1jb25zdCB5bz1uZXcgTWUscWM9bmV3IE1lKCkuc2V0KC40MTIzOTA4LC4zNTc1ODQzLC4xODA0ODA4LC4yMTI2MzksLjcxNTE2ODcsLjA3MjE5MjMsLjAxOTMzMDgsLjExOTE5NDgsLjk1MDUzMjIpLFhjPW5ldyBNZSgpLnNldCgzLjI0MDk2OTksLTEuNTM3MzgzMiwtLjQ5ODYxMDgsLS45NjkyNDM2LDEuODc1OTY3NSwuMDQxNTU1MSwuMDU1NjMwMSwtLjIwMzk3NywxLjA1Njk3MTUpO2Z1bmN0aW9uIExmKCl7Y29uc3QgaT17ZW5hYmxlZDohMCx3b3JraW5nQ29sb3JTcGFjZTpJYyxzcGFjZXM6e30sY29udmVydDpmdW5jdGlvbihzLHIsbyl7cmV0dXJuIHRoaXMuZW5hYmxlZD09PSExfHxyPT09b3x8IXJ8fCFvfHwodGhpcy5zcGFjZXNbcl0udHJhbnNmZXI9PT11byYmKHMucj1DZShzLnIpLHMuZz1DZShzLmcpLHMuYj1DZShzLmIpKSx0aGlzLnNwYWNlc1tyXS5wcmltYXJpZXMhPT10aGlzLnNwYWNlc1tvXS5wcmltYXJpZXMmJihzLmFwcGx5TWF0cml4Myh0aGlzLnNwYWNlc1tyXS50b1hZWikscy5hcHBseU1hdHJpeDModGhpcy5zcGFjZXNbb10uZnJvbVhZWikpLHRoaXMuc3BhY2VzW29dLnRyYW5zZmVyPT09dW8mJihzLnI9VW4ocy5yKSxzLmc9VW4ocy5nKSxzLmI9VW4ocy5iKSkpLHN9LHdvcmtpbmdUb0NvbG9yU3BhY2U6ZnVuY3Rpb24ocyxyKXtyZXR1cm4gdGhpcy5jb252ZXJ0KHMsdGhpcy53b3JraW5nQ29sb3JTcGFjZSxyKX0sY29sb3JTcGFjZVRvV29ya2luZzpmdW5jdGlvbihzLHIpe3JldHVybiB0aGlzLmNvbnZlcnQocyxyLHRoaXMud29ya2luZ0NvbG9yU3BhY2UpfSxnZXRQcmltYXJpZXM6ZnVuY3Rpb24ocyl7cmV0dXJuIHRoaXMuc3BhY2VzW3NdLnByaW1hcmllc30sZ2V0VHJhbnNmZXI6ZnVuY3Rpb24ocyl7cmV0dXJuIHM9PT1GYz9rYzp0aGlzLnNwYWNlc1tzXS50cmFuc2Zlcn0sZ2V0VG9uZU1hcHBpbmdNb2RlOmZ1bmN0aW9uKHMpe3JldHVybiB0aGlzLnNwYWNlc1tzXS5vdXRwdXRDb2xvclNwYWNlQ29uZmlnLnRvbmVNYXBwaW5nTW9kZXx8InN0YW5kYXJkIn0sZ2V0THVtaW5hbmNlQ29lZmZpY2llbnRzOmZ1bmN0aW9uKHMscj10aGlzLndvcmtpbmdDb2xvclNwYWNlKXtyZXR1cm4gcy5mcm9tQXJyYXkodGhpcy5zcGFjZXNbcl0ubHVtaW5hbmNlQ29lZmZpY2llbnRzKX0sZGVmaW5lOmZ1bmN0aW9uKHMpe09iamVjdC5hc3NpZ24odGhpcy5zcGFjZXMscyl9LF9nZXRNYXRyaXg6ZnVuY3Rpb24ocyxyLG8pe3JldHVybiBzLmNvcHkodGhpcy5zcGFjZXNbcl0udG9YWVopLm11bHRpcGx5KHRoaXMuc3BhY2VzW29dLmZyb21YWVopfSxfZ2V0RHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U6ZnVuY3Rpb24ocyl7cmV0dXJuIHRoaXMuc3BhY2VzW3NdLm91dHB1dENvbG9yU3BhY2VDb25maWcuZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2V9LF9nZXRVbnBhY2tDb2xvclNwYWNlOmZ1bmN0aW9uKHM9dGhpcy53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIHRoaXMuc3BhY2VzW3NdLndvcmtpbmdDb2xvclNwYWNlQ29uZmlnLnVucGFja0NvbG9yU3BhY2V9LGZyb21Xb3JraW5nQ29sb3JTcGFjZTpmdW5jdGlvbihzLHIpe3JldHVybiBMYygiQ29sb3JNYW5hZ2VtZW50OiAuZnJvbVdvcmtpbmdDb2xvclNwYWNlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAud29ya2luZ1RvQ29sb3JTcGFjZSgpLiIpLGkud29ya2luZ1RvQ29sb3JTcGFjZShzLHIpfSx0b1dvcmtpbmdDb2xvclNwYWNlOmZ1bmN0aW9uKHMscil7cmV0dXJuIExjKCJDb2xvck1hbmFnZW1lbnQ6IC50b1dvcmtpbmdDb2xvclNwYWNlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuY29sb3JTcGFjZVRvV29ya2luZygpLiIpLGkuY29sb3JTcGFjZVRvV29ya2luZyhzLHIpfX0sdD1bLjY0LC4zMywuMywuNiwuMTUsLjA2XSxlPVsuMjEyNiwuNzE1MiwuMDcyMl0sbj1bLjMxMjcsLjMyOV07cmV0dXJuIGkuZGVmaW5lKHtbSWNdOntwcmltYXJpZXM6dCx3aGl0ZVBvaW50Om4sdHJhbnNmZXI6a2MsdG9YWVo6cWMsZnJvbVhZWjpYYyxsdW1pbmFuY2VDb2VmZmljaWVudHM6ZSx3b3JraW5nQ29sb3JTcGFjZUNvbmZpZzp7dW5wYWNrQ29sb3JTcGFjZTpmZX0sb3V0cHV0Q29sb3JTcGFjZUNvbmZpZzp7ZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U6ZmV9fSxbZmVdOntwcmltYXJpZXM6dCx3aGl0ZVBvaW50Om4sdHJhbnNmZXI6dW8sdG9YWVo6cWMsZnJvbVhZWjpYYyxsdW1pbmFuY2VDb2VmZmljaWVudHM6ZSxvdXRwdXRDb2xvclNwYWNlQ29uZmlnOntkcmF3aW5nQnVmZmVyQ29sb3JTcGFjZTpmZX19fSksaX1jb25zdCBkZT1MZigpO2Z1bmN0aW9uIENlKGkpe3JldHVybiBpPC4wNDA0NT9pKi4wNzczOTkzODA4Ok1hdGgucG93KGkqLjk0Nzg2NzI5ODYrLjA1MjEzMjcwMTQsMi40KX1mdW5jdGlvbiBVbihpKXtyZXR1cm4gaTwuMDAzMTMwOD9pKjEyLjkyOjEuMDU1Kk1hdGgucG93KGksLjQxNjY2KS0uMDU1fWxldCBxbjtjbGFzcyBPZntzdGF0aWMgZ2V0RGF0YVVSTCh0LGU9ImltYWdlL3BuZyIpe2lmKC9eZGF0YTovaS50ZXN0KHQuc3JjKXx8dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50PT0idW5kZWZpbmVkIilyZXR1cm4gdC5zcmM7bGV0IG47aWYodCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KW49dDtlbHNle3FuPT09dm9pZCAwJiYocW49TmMoImNhbnZhcyIpKSxxbi53aWR0aD10LndpZHRoLHFuLmhlaWdodD10LmhlaWdodDtjb25zdCBzPXFuLmdldENvbnRleHQoIjJkIik7dCBpbnN0YW5jZW9mIEltYWdlRGF0YT9zLnB1dEltYWdlRGF0YSh0LDAsMCk6cy5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCksbj1xbn1yZXR1cm4gbi50b0RhdGFVUkwoZSl9c3RhdGljIHNSR0JUb0xpbmVhcih0KXtpZih0eXBlb2YgSFRNTEltYWdlRWxlbWVudCE9InVuZGVmaW5lZCImJnQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHx0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQhPSJ1bmRlZmluZWQiJiZ0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnR8fHR5cGVvZiBJbWFnZUJpdG1hcCE9InVuZGVmaW5lZCImJnQgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCl7Y29uc3QgZT1OYygiY2FudmFzIik7ZS53aWR0aD10LndpZHRoLGUuaGVpZ2h0PXQuaGVpZ2h0O2NvbnN0IG49ZS5nZXRDb250ZXh0KCIyZCIpO24uZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpO2NvbnN0IHM9bi5nZXRJbWFnZURhdGEoMCwwLHQud2lkdGgsdC5oZWlnaHQpLHI9cy5kYXRhO2ZvcihsZXQgbz0wO288ci5sZW5ndGg7bysrKXJbb109Q2UocltvXS8yNTUpKjI1NTtyZXR1cm4gbi5wdXRJbWFnZURhdGEocywwLDApLGV9ZWxzZSBpZih0LmRhdGEpe2NvbnN0IGU9dC5kYXRhLnNsaWNlKDApO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWUgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxlIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXk/ZVtuXT1NYXRoLmZsb29yKENlKGVbbl0vMjU1KSoyNTUpOmVbbl09Q2UoZVtuXSk7cmV0dXJue2RhdGE6ZSx3aWR0aDp0LndpZHRoLGhlaWdodDp0LmhlaWdodH19ZWxzZSByZXR1cm4gYnQoIkltYWdlVXRpbHMuc1JHQlRvTGluZWFyKCk6IFVuc3VwcG9ydGVkIGltYWdlIHR5cGUuIE5vIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24gYXBwbGllZC4iKSx0fX1sZXQgRGY9MDtjbGFzcyAkZntjb25zdHJ1Y3Rvcih0PW51bGwpe3RoaXMuaXNTb3VyY2U9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6RGYrK30pLHRoaXMudXVpZD1tbigpLHRoaXMuZGF0YT10LHRoaXMuZGF0YVJlYWR5PSEwLHRoaXMudmVyc2lvbj0wfWdldFNpemUodCl7Y29uc3QgZT10aGlzLmRhdGE7cmV0dXJuIHR5cGVvZiBIVE1MVmlkZW9FbGVtZW50IT0idW5kZWZpbmVkIiYmZSBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQ/dC5zZXQoZS52aWRlb1dpZHRoLGUudmlkZW9IZWlnaHQsMCk6dHlwZW9mIFZpZGVvRnJhbWUhPSJ1bmRlZmluZWQiJiZlIGluc3RhbmNlb2YgVmlkZW9GcmFtZT90LnNldChlLmRpc3BsYXlIZWlnaHQsZS5kaXNwbGF5V2lkdGgsMCk6ZSE9PW51bGw/dC5zZXQoZS53aWR0aCxlLmhlaWdodCxlLmRlcHRofHwwKTp0LnNldCgwLDAsMCksdH1zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK310b0pTT04odCl7Y29uc3QgZT10PT09dm9pZCAwfHx0eXBlb2YgdD09InN0cmluZyI7aWYoIWUmJnQuaW1hZ2VzW3RoaXMudXVpZF0hPT12b2lkIDApcmV0dXJuIHQuaW1hZ2VzW3RoaXMudXVpZF07Y29uc3Qgbj17dXVpZDp0aGlzLnV1aWQsdXJsOiIifSxzPXRoaXMuZGF0YTtpZihzIT09bnVsbCl7bGV0IHI7aWYoQXJyYXkuaXNBcnJheShzKSl7cj1bXTtmb3IobGV0IG89MCxhPXMubGVuZ3RoO288YTtvKyspc1tvXS5pc0RhdGFUZXh0dXJlP3IucHVzaChtbyhzW29dLmltYWdlKSk6ci5wdXNoKG1vKHNbb10pKX1lbHNlIHI9bW8ocyk7bi51cmw9cn1yZXR1cm4gZXx8KHQuaW1hZ2VzW3RoaXMudXVpZF09biksbn19ZnVuY3Rpb24gbW8oaSl7cmV0dXJuIHR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50IT0idW5kZWZpbmVkIiYmaSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCE9InVuZGVmaW5lZCImJmkgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8dHlwZW9mIEltYWdlQml0bWFwIT0idW5kZWZpbmVkIiYmaSBpbnN0YW5jZW9mIEltYWdlQml0bWFwP09mLmdldERhdGFVUkwoaSk6aS5kYXRhP3tkYXRhOkFycmF5LmZyb20oaS5kYXRhKSx3aWR0aDppLndpZHRoLGhlaWdodDppLmhlaWdodCx0eXBlOmkuZGF0YS5jb25zdHJ1Y3Rvci5uYW1lfTooYnQoIlRleHR1cmU6IFVuYWJsZSB0byBzZXJpYWxpemUgVGV4dHVyZS4iKSx7fSl9bGV0IFZmPTA7Y29uc3QgZ289bmV3IFA7Y2xhc3MgZ24gZXh0ZW5kcyBnc3tjb25zdHJ1Y3Rvcih0PWduLkRFRkFVTFRfSU1BR0UsZT1nbi5ERUZBVUxUX01BUFBJTkcsbj0xMDAxLHM9MTAwMSxyPTEwMDYsbz0xMDA4LGE9MTAyMyxjPTEwMDksbD1nbi5ERUZBVUxUX0FOSVNPVFJPUFksaD1GYyl7c3VwZXIoKSx0aGlzLmlzVGV4dHVyZT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpWZisrfSksdGhpcy51dWlkPW1uKCksdGhpcy5uYW1lPSIiLHRoaXMuc291cmNlPW5ldyAkZih0KSx0aGlzLm1pcG1hcHM9W10sdGhpcy5tYXBwaW5nPWUsdGhpcy5jaGFubmVsPTAsdGhpcy53cmFwUz1uLHRoaXMud3JhcFQ9cyx0aGlzLm1hZ0ZpbHRlcj1yLHRoaXMubWluRmlsdGVyPW8sdGhpcy5hbmlzb3Ryb3B5PWwsdGhpcy5mb3JtYXQ9YSx0aGlzLmludGVybmFsRm9ybWF0PW51bGwsdGhpcy50eXBlPWMsdGhpcy5vZmZzZXQ9bmV3IGsoMCwwKSx0aGlzLnJlcGVhdD1uZXcgaygxLDEpLHRoaXMuY2VudGVyPW5ldyBrKDAsMCksdGhpcy5yb3RhdGlvbj0wLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMCx0aGlzLm1hdHJpeD1uZXcgTWUsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITAsdGhpcy5wcmVtdWx0aXBseUFscGhhPSExLHRoaXMuZmxpcFk9ITAsdGhpcy51bnBhY2tBbGlnbm1lbnQ9NCx0aGlzLmNvbG9yU3BhY2U9aCx0aGlzLnVzZXJEYXRhPXt9LHRoaXMudXBkYXRlUmFuZ2VzPVtdLHRoaXMudmVyc2lvbj0wLHRoaXMub25VcGRhdGU9bnVsbCx0aGlzLnJlbmRlclRhcmdldD1udWxsLHRoaXMuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPSExLHRoaXMuaXNBcnJheVRleHR1cmU9ISEodCYmdC5kZXB0aCYmdC5kZXB0aD4xKSx0aGlzLnBtcmVtVmVyc2lvbj0wfWdldCB3aWR0aCgpe3JldHVybiB0aGlzLnNvdXJjZS5nZXRTaXplKGdvKS54fWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy5zb3VyY2UuZ2V0U2l6ZShnbykueX1nZXQgZGVwdGgoKXtyZXR1cm4gdGhpcy5zb3VyY2UuZ2V0U2l6ZShnbykuen1nZXQgaW1hZ2UoKXtyZXR1cm4gdGhpcy5zb3VyY2UuZGF0YX1zZXQgaW1hZ2UodD1udWxsKXt0aGlzLnNvdXJjZS5kYXRhPXR9dXBkYXRlTWF0cml4KCl7dGhpcy5tYXRyaXguc2V0VXZUcmFuc2Zvcm0odGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55LHRoaXMucmVwZWF0LngsdGhpcy5yZXBlYXQueSx0aGlzLnJvdGF0aW9uLHRoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueSl9YWRkVXBkYXRlUmFuZ2UodCxlKXt0aGlzLnVwZGF0ZVJhbmdlcy5wdXNoKHtzdGFydDp0LGNvdW50OmV9KX1jbGVhclVwZGF0ZVJhbmdlcygpe3RoaXMudXBkYXRlUmFuZ2VzLmxlbmd0aD0wfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLm5hbWU9dC5uYW1lLHRoaXMuc291cmNlPXQuc291cmNlLHRoaXMubWlwbWFwcz10Lm1pcG1hcHMuc2xpY2UoMCksdGhpcy5tYXBwaW5nPXQubWFwcGluZyx0aGlzLmNoYW5uZWw9dC5jaGFubmVsLHRoaXMud3JhcFM9dC53cmFwUyx0aGlzLndyYXBUPXQud3JhcFQsdGhpcy5tYWdGaWx0ZXI9dC5tYWdGaWx0ZXIsdGhpcy5taW5GaWx0ZXI9dC5taW5GaWx0ZXIsdGhpcy5hbmlzb3Ryb3B5PXQuYW5pc290cm9weSx0aGlzLmZvcm1hdD10LmZvcm1hdCx0aGlzLmludGVybmFsRm9ybWF0PXQuaW50ZXJuYWxGb3JtYXQsdGhpcy50eXBlPXQudHlwZSx0aGlzLm9mZnNldC5jb3B5KHQub2Zmc2V0KSx0aGlzLnJlcGVhdC5jb3B5KHQucmVwZWF0KSx0aGlzLmNlbnRlci5jb3B5KHQuY2VudGVyKSx0aGlzLnJvdGF0aW9uPXQucm90YXRpb24sdGhpcy5tYXRyaXhBdXRvVXBkYXRlPXQubWF0cml4QXV0b1VwZGF0ZSx0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSx0aGlzLmdlbmVyYXRlTWlwbWFwcz10LmdlbmVyYXRlTWlwbWFwcyx0aGlzLnByZW11bHRpcGx5QWxwaGE9dC5wcmVtdWx0aXBseUFscGhhLHRoaXMuZmxpcFk9dC5mbGlwWSx0aGlzLnVucGFja0FsaWdubWVudD10LnVucGFja0FsaWdubWVudCx0aGlzLmNvbG9yU3BhY2U9dC5jb2xvclNwYWNlLHRoaXMucmVuZGVyVGFyZ2V0PXQucmVuZGVyVGFyZ2V0LHRoaXMuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPXQuaXNSZW5kZXJUYXJnZXRUZXh0dXJlLHRoaXMuaXNBcnJheVRleHR1cmU9dC5pc0FycmF5VGV4dHVyZSx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLHRoaXMubmVlZHNVcGRhdGU9ITAsdGhpc31zZXRWYWx1ZXModCl7Zm9yKGNvbnN0IGUgaW4gdCl7Y29uc3Qgbj10W2VdO2lmKG49PT12b2lkIDApe2J0KGBUZXh0dXJlLnNldFZhbHVlcygpOiBwYXJhbWV0ZXIgJyR7ZX0nIGhhcyB2YWx1ZSBvZiB1bmRlZmluZWQuYCk7Y29udGludWV9Y29uc3Qgcz10aGlzW2VdO2lmKHM9PT12b2lkIDApe2J0KGBUZXh0dXJlLnNldFZhbHVlcygpOiBwcm9wZXJ0eSAnJHtlfScgZG9lcyBub3QgZXhpc3QuYCk7Y29udGludWV9cyYmbiYmcy5pc1ZlY3RvcjImJm4uaXNWZWN0b3IyfHxzJiZuJiZzLmlzVmVjdG9yMyYmbi5pc1ZlY3RvcjN8fHMmJm4mJnMuaXNNYXRyaXgzJiZuLmlzTWF0cml4Mz9zLmNvcHkobik6dGhpc1tlXT1ufX10b0pTT04odCl7Y29uc3QgZT10PT09dm9pZCAwfHx0eXBlb2YgdD09InN0cmluZyI7aWYoIWUmJnQudGV4dHVyZXNbdGhpcy51dWlkXSE9PXZvaWQgMClyZXR1cm4gdC50ZXh0dXJlc1t0aGlzLnV1aWRdO2NvbnN0IG49e21ldGFkYXRhOnt2ZXJzaW9uOjQuNyx0eXBlOiJUZXh0dXJlIixnZW5lcmF0b3I6IlRleHR1cmUudG9KU09OIn0sdXVpZDp0aGlzLnV1aWQsbmFtZTp0aGlzLm5hbWUsaW1hZ2U6dGhpcy5zb3VyY2UudG9KU09OKHQpLnV1aWQsbWFwcGluZzp0aGlzLm1hcHBpbmcsY2hhbm5lbDp0aGlzLmNoYW5uZWwscmVwZWF0Olt0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnldLG9mZnNldDpbdGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55XSxjZW50ZXI6W3RoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueV0scm90YXRpb246dGhpcy5yb3RhdGlvbix3cmFwOlt0aGlzLndyYXBTLHRoaXMud3JhcFRdLGZvcm1hdDp0aGlzLmZvcm1hdCxpbnRlcm5hbEZvcm1hdDp0aGlzLmludGVybmFsRm9ybWF0LHR5cGU6dGhpcy50eXBlLGNvbG9yU3BhY2U6dGhpcy5jb2xvclNwYWNlLG1pbkZpbHRlcjp0aGlzLm1pbkZpbHRlcixtYWdGaWx0ZXI6dGhpcy5tYWdGaWx0ZXIsYW5pc290cm9weTp0aGlzLmFuaXNvdHJvcHksZmxpcFk6dGhpcy5mbGlwWSxnZW5lcmF0ZU1pcG1hcHM6dGhpcy5nZW5lcmF0ZU1pcG1hcHMscHJlbXVsdGlwbHlBbHBoYTp0aGlzLnByZW11bHRpcGx5QWxwaGEsdW5wYWNrQWxpZ25tZW50OnRoaXMudW5wYWNrQWxpZ25tZW50fTtyZXR1cm4gT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJihuLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLGV8fCh0LnRleHR1cmVzW3RoaXMudXVpZF09biksbn1kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXRyYW5zZm9ybVV2KHQpe2lmKHRoaXMubWFwcGluZyE9PTMwMClyZXR1cm4gdDtpZih0LmFwcGx5TWF0cml4Myh0aGlzLm1hdHJpeCksdC54PDB8fHQueD4xKXN3aXRjaCh0aGlzLndyYXBTKXtjYXNlIDFlMzp0Lng9dC54LU1hdGguZmxvb3IodC54KTticmVhaztjYXNlIDEwMDE6dC54PXQueDwwPzA6MTticmVhaztjYXNlIDEwMDI6TWF0aC5hYnMoTWF0aC5mbG9vcih0LngpJTIpPT09MT90Lng9TWF0aC5jZWlsKHQueCktdC54OnQueD10LngtTWF0aC5mbG9vcih0LngpO2JyZWFrfWlmKHQueTwwfHx0Lnk+MSlzd2l0Y2godGhpcy53cmFwVCl7Y2FzZSAxZTM6dC55PXQueS1NYXRoLmZsb29yKHQueSk7YnJlYWs7Y2FzZSAxMDAxOnQueT10Lnk8MD8wOjE7YnJlYWs7Y2FzZSAxMDAyOk1hdGguYWJzKE1hdGguZmxvb3IodC55KSUyKT09PTE/dC55PU1hdGguY2VpbCh0LnkpLXQueTp0Lnk9dC55LU1hdGguZmxvb3IodC55KTticmVha31yZXR1cm4gdGhpcy5mbGlwWSYmKHQueT0xLXQueSksdH1zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiYodGhpcy52ZXJzaW9uKyssdGhpcy5zb3VyY2UubmVlZHNVcGRhdGU9ITApfXNldCBuZWVkc1BNUkVNVXBkYXRlKHQpe3Q9PT0hMCYmdGhpcy5wbXJlbVZlcnNpb24rK319Z24uREVGQVVMVF9JTUFHRT1udWxsLGduLkRFRkFVTFRfTUFQUElORz0zMDAsZ24uREVGQVVMVF9BTklTT1RST1BZPTE7Y2xhc3MgaWV7Y29uc3RydWN0b3IodD0wLGU9MCxuPTAscz0xKXtpZS5wcm90b3R5cGUuaXNWZWN0b3I0PSEwLHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXMudz1zfWdldCB3aWR0aCgpe3JldHVybiB0aGlzLnp9c2V0IHdpZHRoKHQpe3RoaXMuej10fWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy53fXNldCBoZWlnaHQodCl7dGhpcy53PXR9c2V0KHQsZSxuLHMpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bix0aGlzLnc9cyx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpcy56PXQsdGhpcy53PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Wih0KXtyZXR1cm4gdGhpcy56PXQsdGhpc31zZXRXKHQpe3JldHVybiB0aGlzLnc9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztjYXNlIDM6dGhpcy53PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2Nhc2UgMzpyZXR1cm4gdGhpcy53O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56LHRoaXMudyl9Y29weSh0KXtyZXR1cm4gdGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXMuej10LnosdGhpcy53PXQudyE9PXZvaWQgMD90Lnc6MSx0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpcy56Kz10LnosdGhpcy53Kz10LncsdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpcy56Kz10LHRoaXMudys9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpcy56PXQueitlLnosdGhpcy53PXQudytlLncsdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXMueis9dC56KmUsdGhpcy53Kz10LncqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpcy56LT10LnosdGhpcy53LT10LncsdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpcy56LT10LHRoaXMudy09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpcy56PXQuei1lLnosdGhpcy53PXQudy1lLncsdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpcy56Kj10LnosdGhpcy53Kj10LncsdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzLnoqPXQsdGhpcy53Kj10LHRoaXN9YXBwbHlNYXRyaXg0KHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LHM9dGhpcy56LHI9dGhpcy53LG89dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PW9bMF0qZStvWzRdKm4rb1s4XSpzK29bMTJdKnIsdGhpcy55PW9bMV0qZStvWzVdKm4rb1s5XSpzK29bMTNdKnIsdGhpcy56PW9bMl0qZStvWzZdKm4rb1sxMF0qcytvWzE0XSpyLHRoaXMudz1vWzNdKmUrb1s3XSpuK29bMTFdKnMrb1sxNV0qcix0aGlzfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpcy56Lz10LnosdGhpcy53Lz10LncsdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1zZXRBeGlzQW5nbGVGcm9tUXVhdGVybmlvbih0KXt0aGlzLnc9MipNYXRoLmFjb3ModC53KTtjb25zdCBlPU1hdGguc3FydCgxLXQudyp0LncpO3JldHVybiBlPDFlLTQ/KHRoaXMueD0xLHRoaXMueT0wLHRoaXMuej0wKToodGhpcy54PXQueC9lLHRoaXMueT10LnkvZSx0aGlzLno9dC56L2UpLHRoaXN9c2V0QXhpc0FuZ2xlRnJvbVJvdGF0aW9uTWF0cml4KHQpe2xldCBlLG4scyxyO2NvbnN0IGM9dC5lbGVtZW50cyxsPWNbMF0saD1jWzRdLHU9Y1s4XSxmPWNbMV0sZD1jWzVdLHA9Y1s5XSx5PWNbMl0sZz1jWzZdLHc9Y1sxMF07aWYoTWF0aC5hYnMoaC1mKTwuMDEmJk1hdGguYWJzKHUteSk8LjAxJiZNYXRoLmFicyhwLWcpPC4wMSl7aWYoTWF0aC5hYnMoaCtmKTwuMSYmTWF0aC5hYnModSt5KTwuMSYmTWF0aC5hYnMocCtnKTwuMSYmTWF0aC5hYnMobCtkK3ctMyk8LjEpcmV0dXJuIHRoaXMuc2V0KDEsMCwwLDApLHRoaXM7ZT1NYXRoLlBJO2NvbnN0IHg9KGwrMSkvMixtPShkKzEpLzIsTT0odysxKS8yLFM9KGgrZikvNCxBPSh1K3kpLzQsdj0ocCtnKS80O3JldHVybiB4Pm0mJng+TT94PC4wMT8obj0wLHM9LjcwNzEwNjc4MSxyPS43MDcxMDY3ODEpOihuPU1hdGguc3FydCh4KSxzPVMvbixyPUEvbik6bT5NP208LjAxPyhuPS43MDcxMDY3ODEscz0wLHI9LjcwNzEwNjc4MSk6KHM9TWF0aC5zcXJ0KG0pLG49Uy9zLHI9di9zKTpNPC4wMT8obj0uNzA3MTA2NzgxLHM9LjcwNzEwNjc4MSxyPTApOihyPU1hdGguc3FydChNKSxuPUEvcixzPXYvciksdGhpcy5zZXQobixzLHIsZSksdGhpc31sZXQgYj1NYXRoLnNxcnQoKGctcCkqKGctcCkrKHUteSkqKHUteSkrKGYtaCkqKGYtaCkpO3JldHVybiBNYXRoLmFicyhiKTwuMDAxJiYoYj0xKSx0aGlzLng9KGctcCkvYix0aGlzLnk9KHUteSkvYix0aGlzLno9KGYtaCkvYix0aGlzLnc9TWF0aC5hY29zKChsK2Qrdy0xKS8yKSx0aGlzfXNldEZyb21NYXRyaXhQb3NpdGlvbih0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1lWzEyXSx0aGlzLnk9ZVsxM10sdGhpcy56PWVbMTRdLHRoaXMudz1lWzE1XSx0aGlzfW1pbih0KXtyZXR1cm4gdGhpcy54PU1hdGgubWluKHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1pbih0aGlzLnksdC55KSx0aGlzLno9TWF0aC5taW4odGhpcy56LHQueiksdGhpcy53PU1hdGgubWluKHRoaXMudyx0LncpLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1heCh0aGlzLnosdC56KSx0aGlzLnc9TWF0aC5tYXgodGhpcy53LHQudyksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9Wih0aGlzLngsdC54LGUueCksdGhpcy55PVoodGhpcy55LHQueSxlLnkpLHRoaXMuej1aKHRoaXMueix0LnosZS56KSx0aGlzLnc9Wih0aGlzLncsdC53LGUudyksdGhpc31jbGFtcFNjYWxhcih0LGUpe3JldHVybiB0aGlzLng9Wih0aGlzLngsdCxlKSx0aGlzLnk9Wih0aGlzLnksdCxlKSx0aGlzLno9Wih0aGlzLnosdCxlKSx0aGlzLnc9Wih0aGlzLncsdCxlKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgbj10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihufHwxKS5tdWx0aXBseVNjYWxhcihaKG4sdCxlKSl9Zmxvb3IoKXtyZXR1cm4gdGhpcy54PU1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpLHRoaXMuej1NYXRoLmZsb29yKHRoaXMueiksdGhpcy53PU1hdGguZmxvb3IodGhpcy53KSx0aGlzfWNlaWwoKXtyZXR1cm4gdGhpcy54PU1hdGguY2VpbCh0aGlzLngpLHRoaXMueT1NYXRoLmNlaWwodGhpcy55KSx0aGlzLno9TWF0aC5jZWlsKHRoaXMueiksdGhpcy53PU1hdGguY2VpbCh0aGlzLncpLHRoaXN9cm91bmQoKXtyZXR1cm4gdGhpcy54PU1hdGgucm91bmQodGhpcy54KSx0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpLHRoaXMuej1NYXRoLnJvdW5kKHRoaXMueiksdGhpcy53PU1hdGgucm91bmQodGhpcy53KSx0aGlzfXJvdW5kVG9aZXJvKCl7cmV0dXJuIHRoaXMueD1NYXRoLnRydW5jKHRoaXMueCksdGhpcy55PU1hdGgudHJ1bmModGhpcy55KSx0aGlzLno9TWF0aC50cnVuYyh0aGlzLnopLHRoaXMudz1NYXRoLnRydW5jKHRoaXMudyksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpcy53PS10aGlzLncsdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueSt0aGlzLnoqdC56K3RoaXMudyp0Lnd9bGVuZ3RoU3EoKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMud31sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56K3RoaXMudyp0aGlzLncpfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KStNYXRoLmFicyh0aGlzLncpfW5vcm1hbGl6ZSgpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX1zZXRMZW5ndGgodCl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodCl9bGVycCh0LGUpe3JldHVybiB0aGlzLngrPSh0LngtdGhpcy54KSplLHRoaXMueSs9KHQueS10aGlzLnkpKmUsdGhpcy56Kz0odC56LXRoaXMueikqZSx0aGlzLncrPSh0LnctdGhpcy53KSplLHRoaXN9bGVycFZlY3RvcnModCxlLG4pe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSpuLHRoaXMueT10LnkrKGUueS10LnkpKm4sdGhpcy56PXQueisoZS56LXQueikqbix0aGlzLnc9dC53KyhlLnctdC53KSpuLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lng9PT10aGlzLngmJnQueT09PXRoaXMueSYmdC56PT09dGhpcy56JiZ0Lnc9PT10aGlzLnd9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzLno9dFtlKzJdLHRoaXMudz10W2UrM10sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0W2UrMl09dGhpcy56LHRbZSszXT10aGlzLncsdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzLno9dC5nZXRaKGUpLHRoaXMudz10LmdldFcoZSksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpcy56PU1hdGgucmFuZG9tKCksdGhpcy53PU1hdGgucmFuZG9tKCksdGhpc30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLngseWllbGQgdGhpcy55LHlpZWxkIHRoaXMueix5aWVsZCB0aGlzLnd9fWNsYXNzIGd0e2NvbnN0cnVjdG9yKHQ9bmV3IFAoMS8wLDEvMCwxLzApLGU9bmV3IFAoLTEvMCwtMS8wLC0xLzApKXt0aGlzLmlzQm94Mz0hMCx0aGlzLm1pbj10LHRoaXMubWF4PWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMubWluLmNvcHkodCksdGhpcy5tYXguY29weShlKSx0aGlzfXNldEZyb21BcnJheSh0KXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrPTMpdGhpcy5leHBhbmRCeVBvaW50KHBlLmZyb21BcnJheSh0LGUpKTtyZXR1cm4gdGhpc31zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAsbj10LmNvdW50O2U8bjtlKyspdGhpcy5leHBhbmRCeVBvaW50KHBlLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSk7cmV0dXJuIHRoaXN9c2V0RnJvbVBvaW50cyh0KXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl0aGlzLmV4cGFuZEJ5UG9pbnQodFtlXSk7cmV0dXJuIHRoaXN9c2V0RnJvbUNlbnRlckFuZFNpemUodCxlKXtjb25zdCBuPXBlLmNvcHkoZSkubXVsdGlwbHlTY2FsYXIoLjUpO3JldHVybiB0aGlzLm1pbi5jb3B5KHQpLnN1YihuKSx0aGlzLm1heC5jb3B5KHQpLmFkZChuKSx0aGlzfXNldEZyb21PYmplY3QodCxlPSExKXtyZXR1cm4gdGhpcy5tYWtlRW1wdHkoKSx0aGlzLmV4cGFuZEJ5T2JqZWN0KHQsZSl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMubWluLmNvcHkodC5taW4pLHRoaXMubWF4LmNvcHkodC5tYXgpLHRoaXN9bWFrZUVtcHR5KCl7cmV0dXJuIHRoaXMubWluLng9dGhpcy5taW4ueT10aGlzLm1pbi56PTEvMCx0aGlzLm1heC54PXRoaXMubWF4Lnk9dGhpcy5tYXguej0tMS8wLHRoaXN9aXNFbXB0eSgpe3JldHVybiB0aGlzLm1heC54PHRoaXMubWluLnh8fHRoaXMubWF4Lnk8dGhpcy5taW4ueXx8dGhpcy5tYXguejx0aGlzLm1pbi56fWdldENlbnRlcih0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5zZXQoMCwwLDApOnQuYWRkVmVjdG9ycyh0aGlzLm1pbix0aGlzLm1heCkubXVsdGlwbHlTY2FsYXIoLjUpfWdldFNpemUodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3Quc2V0KDAsMCwwKTp0LnN1YlZlY3RvcnModGhpcy5tYXgsdGhpcy5taW4pfWV4cGFuZEJ5UG9pbnQodCl7cmV0dXJuIHRoaXMubWluLm1pbih0KSx0aGlzLm1heC5tYXgodCksdGhpc31leHBhbmRCeVZlY3Rvcih0KXtyZXR1cm4gdGhpcy5taW4uc3ViKHQpLHRoaXMubWF4LmFkZCh0KSx0aGlzfWV4cGFuZEJ5U2NhbGFyKHQpe3JldHVybiB0aGlzLm1pbi5hZGRTY2FsYXIoLXQpLHRoaXMubWF4LmFkZFNjYWxhcih0KSx0aGlzfWV4cGFuZEJ5T2JqZWN0KHQsZT0hMSl7dC51cGRhdGVXb3JsZE1hdHJpeCghMSwhMSk7Y29uc3Qgbj10Lmdlb21ldHJ5O2lmKG4hPT12b2lkIDApe2NvbnN0IHI9bi5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7aWYoZT09PSEwJiZyIT09dm9pZCAwJiZ0LmlzSW5zdGFuY2VkTWVzaCE9PSEwKWZvcihsZXQgbz0wLGE9ci5jb3VudDtvPGE7bysrKXQuaXNNZXNoPT09ITA/dC5nZXRWZXJ0ZXhQb3NpdGlvbihvLHBlKTpwZS5mcm9tQnVmZmVyQXR0cmlidXRlKHIsbykscGUuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpLHRoaXMuZXhwYW5kQnlQb2ludChwZSk7ZWxzZSB0LmJvdW5kaW5nQm94IT09dm9pZCAwPyh0LmJvdW5kaW5nQm94PT09bnVsbCYmdC5jb21wdXRlQm91bmRpbmdCb3goKSx4cy5jb3B5KHQuYm91bmRpbmdCb3gpKToobi5ib3VuZGluZ0JveD09PW51bGwmJm4uY29tcHV0ZUJvdW5kaW5nQm94KCkseHMuY29weShuLmJvdW5kaW5nQm94KSkseHMuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpLHRoaXMudW5pb24oeHMpfWNvbnN0IHM9dC5jaGlsZHJlbjtmb3IobGV0IHI9MCxvPXMubGVuZ3RoO3I8bztyKyspdGhpcy5leHBhbmRCeU9iamVjdChzW3JdLGUpO3JldHVybiB0aGlzfWNvbnRhaW5zUG9pbnQodCl7cmV0dXJuIHQueD49dGhpcy5taW4ueCYmdC54PD10aGlzLm1heC54JiZ0Lnk+PXRoaXMubWluLnkmJnQueTw9dGhpcy5tYXgueSYmdC56Pj10aGlzLm1pbi56JiZ0Lno8PXRoaXMubWF4Lnp9Y29udGFpbnNCb3godCl7cmV0dXJuIHRoaXMubWluLng8PXQubWluLngmJnQubWF4Lng8PXRoaXMubWF4LngmJnRoaXMubWluLnk8PXQubWluLnkmJnQubWF4Lnk8PXRoaXMubWF4LnkmJnRoaXMubWluLno8PXQubWluLnomJnQubWF4Lno8PXRoaXMubWF4Lnp9Z2V0UGFyYW1ldGVyKHQsZSl7cmV0dXJuIGUuc2V0KCh0LngtdGhpcy5taW4ueCkvKHRoaXMubWF4LngtdGhpcy5taW4ueCksKHQueS10aGlzLm1pbi55KS8odGhpcy5tYXgueS10aGlzLm1pbi55KSwodC56LXRoaXMubWluLnopLyh0aGlzLm1heC56LXRoaXMubWluLnopKX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0Lm1heC54Pj10aGlzLm1pbi54JiZ0Lm1pbi54PD10aGlzLm1heC54JiZ0Lm1heC55Pj10aGlzLm1pbi55JiZ0Lm1pbi55PD10aGlzLm1heC55JiZ0Lm1heC56Pj10aGlzLm1pbi56JiZ0Lm1pbi56PD10aGlzLm1heC56fWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHRoaXMuY2xhbXBQb2ludCh0LmNlbnRlcixwZSkscGUuZGlzdGFuY2VUb1NxdWFyZWQodC5jZW50ZXIpPD10LnJhZGl1cyp0LnJhZGl1c31pbnRlcnNlY3RzUGxhbmUodCl7bGV0IGUsbjtyZXR1cm4gdC5ub3JtYWwueD4wPyhlPXQubm9ybWFsLngqdGhpcy5taW4ueCxuPXQubm9ybWFsLngqdGhpcy5tYXgueCk6KGU9dC5ub3JtYWwueCp0aGlzLm1heC54LG49dC5ub3JtYWwueCp0aGlzLm1pbi54KSx0Lm5vcm1hbC55PjA/KGUrPXQubm9ybWFsLnkqdGhpcy5taW4ueSxuKz10Lm5vcm1hbC55KnRoaXMubWF4LnkpOihlKz10Lm5vcm1hbC55KnRoaXMubWF4Lnksbis9dC5ub3JtYWwueSp0aGlzLm1pbi55KSx0Lm5vcm1hbC56PjA/KGUrPXQubm9ybWFsLnoqdGhpcy5taW4ueixuKz10Lm5vcm1hbC56KnRoaXMubWF4LnopOihlKz10Lm5vcm1hbC56KnRoaXMubWF4Lnosbis9dC5ub3JtYWwueip0aGlzLm1pbi56KSxlPD0tdC5jb25zdGFudCYmbj49LXQuY29uc3RhbnR9aW50ZXJzZWN0c1RyaWFuZ2xlKHQpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiExO3RoaXMuZ2V0Q2VudGVyKENpKSx3cy5zdWJWZWN0b3JzKHRoaXMubWF4LENpKSxYbi5zdWJWZWN0b3JzKHQuYSxDaSksWm4uc3ViVmVjdG9ycyh0LmIsQ2kpLEduLnN1YlZlY3RvcnModC5jLENpKSx0bi5zdWJWZWN0b3JzKFpuLFhuKSxlbi5zdWJWZWN0b3JzKEduLFpuKSx4bi5zdWJWZWN0b3JzKFhuLEduKTtsZXQgZT1bMCwtdG4ueix0bi55LDAsLWVuLnosZW4ueSwwLC14bi56LHhuLnksdG4ueiwwLC10bi54LGVuLnosMCwtZW4ueCx4bi56LDAsLXhuLngsLXRuLnksdG4ueCwwLC1lbi55LGVuLngsMCwteG4ueSx4bi54LDBdO3JldHVybiF4byhlLFhuLFpuLEduLHdzKXx8KGU9WzEsMCwwLDAsMSwwLDAsMCwxXSwheG8oZSxYbixabixHbix3cykpPyExOihicy5jcm9zc1ZlY3RvcnModG4sZW4pLGU9W2JzLngsYnMueSxicy56XSx4byhlLFhuLFpuLEduLHdzKSl9Y2xhbXBQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodCkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdGhpcy5jbGFtcFBvaW50KHQscGUpLmRpc3RhbmNlVG8odCl9Z2V0Qm91bmRpbmdTcGhlcmUodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3QubWFrZUVtcHR5KCk6KHRoaXMuZ2V0Q2VudGVyKHQuY2VudGVyKSx0LnJhZGl1cz10aGlzLmdldFNpemUocGUpLmxlbmd0aCgpKi41KSx0fWludGVyc2VjdCh0KXtyZXR1cm4gdGhpcy5taW4ubWF4KHQubWluKSx0aGlzLm1heC5taW4odC5tYXgpLHRoaXMuaXNFbXB0eSgpJiZ0aGlzLm1ha2VFbXB0eSgpLHRoaXN9dW5pb24odCl7cmV0dXJuIHRoaXMubWluLm1pbih0Lm1pbiksdGhpcy5tYXgubWF4KHQubWF4KSx0aGlzfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dGhpczooRWVbMF0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksRWVbMV0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksRWVbMl0uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksRWVbM10uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksRWVbNF0uc2V0KHRoaXMubWF4LngsdGhpcy5taW4ueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksRWVbNV0uc2V0KHRoaXMubWF4LngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksRWVbNl0uc2V0KHRoaXMubWF4LngsdGhpcy5tYXgueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksRWVbN10uc2V0KHRoaXMubWF4LngsdGhpcy5tYXgueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksdGhpcy5zZXRGcm9tUG9pbnRzKEVlKSx0aGlzKX10cmFuc2xhdGUodCl7cmV0dXJuIHRoaXMubWluLmFkZCh0KSx0aGlzLm1heC5hZGQodCksdGhpc31lcXVhbHModCl7cmV0dXJuIHQubWluLmVxdWFscyh0aGlzLm1pbikmJnQubWF4LmVxdWFscyh0aGlzLm1heCl9dG9KU09OKCl7cmV0dXJue21pbjp0aGlzLm1pbi50b0FycmF5KCksbWF4OnRoaXMubWF4LnRvQXJyYXkoKX19ZnJvbUpTT04odCl7cmV0dXJuIHRoaXMubWluLmZyb21BcnJheSh0Lm1pbiksdGhpcy5tYXguZnJvbUFycmF5KHQubWF4KSx0aGlzfX1jb25zdCBFZT1bbmV3IFAsbmV3IFAsbmV3IFAsbmV3IFAsbmV3IFAsbmV3IFAsbmV3IFAsbmV3IFBdLHBlPW5ldyBQLHhzPW5ldyBndCxYbj1uZXcgUCxabj1uZXcgUCxHbj1uZXcgUCx0bj1uZXcgUCxlbj1uZXcgUCx4bj1uZXcgUCxDaT1uZXcgUCx3cz1uZXcgUCxicz1uZXcgUCx3bj1uZXcgUDtmdW5jdGlvbiB4byhpLHQsZSxuLHMpe2ZvcihsZXQgcj0wLG89aS5sZW5ndGgtMztyPD1vO3IrPTMpe3duLmZyb21BcnJheShpLHIpO2NvbnN0IGE9cy54Kk1hdGguYWJzKHduLngpK3MueSpNYXRoLmFicyh3bi55KStzLnoqTWF0aC5hYnMod24ueiksYz10LmRvdCh3biksbD1lLmRvdCh3biksaD1uLmRvdCh3bik7aWYoTWF0aC5tYXgoLU1hdGgubWF4KGMsbCxoKSxNYXRoLm1pbihjLGwsaCkpPmEpcmV0dXJuITF9cmV0dXJuITB9Y29uc3QgVWY9bmV3IGd0LEVpPW5ldyBQLHdvPW5ldyBQO2NsYXNzIFpje2NvbnN0cnVjdG9yKHQ9bmV3IFAsZT0tMSl7dGhpcy5pc1NwaGVyZT0hMCx0aGlzLmNlbnRlcj10LHRoaXMucmFkaXVzPWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodCksdGhpcy5yYWRpdXM9ZSx0aGlzfXNldEZyb21Qb2ludHModCxlKXtjb25zdCBuPXRoaXMuY2VudGVyO2UhPT12b2lkIDA/bi5jb3B5KGUpOlVmLnNldEZyb21Qb2ludHModCkuZ2V0Q2VudGVyKG4pO2xldCBzPTA7Zm9yKGxldCByPTAsbz10Lmxlbmd0aDtyPG87cisrKXM9TWF0aC5tYXgocyxuLmRpc3RhbmNlVG9TcXVhcmVkKHRbcl0pKTtyZXR1cm4gdGhpcy5yYWRpdXM9TWF0aC5zcXJ0KHMpLHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5jZW50ZXIuY29weSh0LmNlbnRlciksdGhpcy5yYWRpdXM9dC5yYWRpdXMsdGhpc31pc0VtcHR5KCl7cmV0dXJuIHRoaXMucmFkaXVzPDB9bWFrZUVtcHR5KCl7cmV0dXJuIHRoaXMuY2VudGVyLnNldCgwLDAsMCksdGhpcy5yYWRpdXM9LTEsdGhpc31jb250YWluc1BvaW50KHQpe3JldHVybiB0LmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuY2VudGVyKTw9dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXN9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiB0LmRpc3RhbmNlVG8odGhpcy5jZW50ZXIpLXRoaXMucmFkaXVzfWludGVyc2VjdHNTcGhlcmUodCl7Y29uc3QgZT10aGlzLnJhZGl1cyt0LnJhZGl1cztyZXR1cm4gdC5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD1lKmV9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzU3BoZXJlKHRoaXMpfWludGVyc2VjdHNQbGFuZSh0KXtyZXR1cm4gTWF0aC5hYnModC5kaXN0YW5jZVRvUG9pbnQodGhpcy5jZW50ZXIpKTw9dGhpcy5yYWRpdXN9Y2xhbXBQb2ludCh0LGUpe2NvbnN0IG49dGhpcy5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQodCk7cmV0dXJuIGUuY29weSh0KSxuPnRoaXMucmFkaXVzKnRoaXMucmFkaXVzJiYoZS5zdWIodGhpcy5jZW50ZXIpLm5vcm1hbGl6ZSgpLGUubXVsdGlwbHlTY2FsYXIodGhpcy5yYWRpdXMpLmFkZCh0aGlzLmNlbnRlcikpLGV9Z2V0Qm91bmRpbmdCb3godCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpPyh0Lm1ha2VFbXB0eSgpLHQpOih0LnNldCh0aGlzLmNlbnRlcix0aGlzLmNlbnRlciksdC5leHBhbmRCeVNjYWxhcih0aGlzLnJhZGl1cyksdCl9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLmNlbnRlci5hcHBseU1hdHJpeDQodCksdGhpcy5yYWRpdXM9dGhpcy5yYWRpdXMqdC5nZXRNYXhTY2FsZU9uQXhpcygpLHRoaXN9dHJhbnNsYXRlKHQpe3JldHVybiB0aGlzLmNlbnRlci5hZGQodCksdGhpc31leHBhbmRCeVBvaW50KHQpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiB0aGlzLmNlbnRlci5jb3B5KHQpLHRoaXMucmFkaXVzPTAsdGhpcztFaS5zdWJWZWN0b3JzKHQsdGhpcy5jZW50ZXIpO2NvbnN0IGU9RWkubGVuZ3RoU3EoKTtpZihlPnRoaXMucmFkaXVzKnRoaXMucmFkaXVzKXtjb25zdCBuPU1hdGguc3FydChlKSxzPShuLXRoaXMucmFkaXVzKSouNTt0aGlzLmNlbnRlci5hZGRTY2FsZWRWZWN0b3IoRWkscy9uKSx0aGlzLnJhZGl1cys9c31yZXR1cm4gdGhpc311bmlvbih0KXtyZXR1cm4gdC5pc0VtcHR5KCk/dGhpczp0aGlzLmlzRW1wdHkoKT8odGhpcy5jb3B5KHQpLHRoaXMpOih0aGlzLmNlbnRlci5lcXVhbHModC5jZW50ZXIpPT09ITA/dGhpcy5yYWRpdXM9TWF0aC5tYXgodGhpcy5yYWRpdXMsdC5yYWRpdXMpOih3by5zdWJWZWN0b3JzKHQuY2VudGVyLHRoaXMuY2VudGVyKS5zZXRMZW5ndGgodC5yYWRpdXMpLHRoaXMuZXhwYW5kQnlQb2ludChFaS5jb3B5KHQuY2VudGVyKS5hZGQod28pKSx0aGlzLmV4cGFuZEJ5UG9pbnQoRWkuY29weSh0LmNlbnRlcikuc3ViKHdvKSkpLHRoaXMpfWVxdWFscyh0KXtyZXR1cm4gdC5jZW50ZXIuZXF1YWxzKHRoaXMuY2VudGVyKSYmdC5yYWRpdXM9PT10aGlzLnJhZGl1c31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9dG9KU09OKCl7cmV0dXJue3JhZGl1czp0aGlzLnJhZGl1cyxjZW50ZXI6dGhpcy5jZW50ZXIudG9BcnJheSgpfX1mcm9tSlNPTih0KXtyZXR1cm4gdGhpcy5yYWRpdXM9dC5yYWRpdXMsdGhpcy5jZW50ZXIuZnJvbUFycmF5KHQuY2VudGVyKSx0aGlzfX1jb25zdCBCZT1uZXcgUCxibz1uZXcgUCxNcz1uZXcgUCxubj1uZXcgUCxNbz1uZXcgUCxBcz1uZXcgUCxBbz1uZXcgUDtjbGFzcyBTb3tjb25zdHJ1Y3Rvcih0PW5ldyBQLGU9bmV3IFAoMCwwLC0xKSl7dGhpcy5vcmlnaW49dCx0aGlzLmRpcmVjdGlvbj1lfXNldCh0LGUpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHQpLHRoaXMuZGlyZWN0aW9uLmNvcHkoZSksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHQub3JpZ2luKSx0aGlzLmRpcmVjdGlvbi5jb3B5KHQuZGlyZWN0aW9uKSx0aGlzfWF0KHQsZSl7cmV0dXJuIGUuY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLHQpfWxvb2tBdCh0KXtyZXR1cm4gdGhpcy5kaXJlY3Rpb24uY29weSh0KS5zdWIodGhpcy5vcmlnaW4pLm5vcm1hbGl6ZSgpLHRoaXN9cmVjYXN0KHQpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHRoaXMuYXQodCxCZSkpLHRoaXN9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUpe2Uuc3ViVmVjdG9ycyh0LHRoaXMub3JpZ2luKTtjb25zdCBuPWUuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gbjwwP2UuY29weSh0aGlzLm9yaWdpbik6ZS5jb3B5KHRoaXMub3JpZ2luKS5hZGRTY2FsZWRWZWN0b3IodGhpcy5kaXJlY3Rpb24sbil9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVNxVG9Qb2ludCh0KSl9ZGlzdGFuY2VTcVRvUG9pbnQodCl7Y29uc3QgZT1CZS5zdWJWZWN0b3JzKHQsdGhpcy5vcmlnaW4pLmRvdCh0aGlzLmRpcmVjdGlvbik7cmV0dXJuIGU8MD90aGlzLm9yaWdpbi5kaXN0YW5jZVRvU3F1YXJlZCh0KTooQmUuY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLGUpLEJlLmRpc3RhbmNlVG9TcXVhcmVkKHQpKX1kaXN0YW5jZVNxVG9TZWdtZW50KHQsZSxuLHMpe2JvLmNvcHkodCkuYWRkKGUpLm11bHRpcGx5U2NhbGFyKC41KSxNcy5jb3B5KGUpLnN1Yih0KS5ub3JtYWxpemUoKSxubi5jb3B5KHRoaXMub3JpZ2luKS5zdWIoYm8pO2NvbnN0IHI9dC5kaXN0YW5jZVRvKGUpKi41LG89LXRoaXMuZGlyZWN0aW9uLmRvdChNcyksYT1ubi5kb3QodGhpcy5kaXJlY3Rpb24pLGM9LW5uLmRvdChNcyksbD1ubi5sZW5ndGhTcSgpLGg9TWF0aC5hYnMoMS1vKm8pO2xldCB1LGYsZCxwO2lmKGg+MClpZih1PW8qYy1hLGY9byphLWMscD1yKmgsdT49MClpZihmPj0tcClpZihmPD1wKXtjb25zdCB5PTEvaDt1Kj15LGYqPXksZD11Kih1K28qZisyKmEpK2YqKG8qdStmKzIqYykrbH1lbHNlIGY9cix1PU1hdGgubWF4KDAsLShvKmYrYSkpLGQ9LXUqdStmKihmKzIqYykrbDtlbHNlIGY9LXIsdT1NYXRoLm1heCgwLC0obypmK2EpKSxkPS11KnUrZiooZisyKmMpK2w7ZWxzZSBmPD0tcD8odT1NYXRoLm1heCgwLC0oLW8qcithKSksZj11PjA/LXI6TWF0aC5taW4oTWF0aC5tYXgoLXIsLWMpLHIpLGQ9LXUqdStmKihmKzIqYykrbCk6Zjw9cD8odT0wLGY9TWF0aC5taW4oTWF0aC5tYXgoLXIsLWMpLHIpLGQ9ZiooZisyKmMpK2wpOih1PU1hdGgubWF4KDAsLShvKnIrYSkpLGY9dT4wP3I6TWF0aC5taW4oTWF0aC5tYXgoLXIsLWMpLHIpLGQ9LXUqdStmKihmKzIqYykrbCk7ZWxzZSBmPW8+MD8tcjpyLHU9TWF0aC5tYXgoMCwtKG8qZithKSksZD0tdSp1K2YqKGYrMipjKStsO3JldHVybiBuJiZuLmNvcHkodGhpcy5vcmlnaW4pLmFkZFNjYWxlZFZlY3Rvcih0aGlzLmRpcmVjdGlvbix1KSxzJiZzLmNvcHkoYm8pLmFkZFNjYWxlZFZlY3RvcihNcyxmKSxkfWludGVyc2VjdFNwaGVyZSh0LGUpe0JlLnN1YlZlY3RvcnModC5jZW50ZXIsdGhpcy5vcmlnaW4pO2NvbnN0IG49QmUuZG90KHRoaXMuZGlyZWN0aW9uKSxzPUJlLmRvdChCZSktbipuLHI9dC5yYWRpdXMqdC5yYWRpdXM7aWYocz5yKXJldHVybiBudWxsO2NvbnN0IG89TWF0aC5zcXJ0KHItcyksYT1uLW8sYz1uK287cmV0dXJuIGM8MD9udWxsOmE8MD90aGlzLmF0KGMsZSk6dGhpcy5hdChhLGUpfWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHQucmFkaXVzPDA/ITE6dGhpcy5kaXN0YW5jZVNxVG9Qb2ludCh0LmNlbnRlcik8PXQucmFkaXVzKnQucmFkaXVzfWRpc3RhbmNlVG9QbGFuZSh0KXtjb25zdCBlPXQubm9ybWFsLmRvdCh0aGlzLmRpcmVjdGlvbik7aWYoZT09PTApcmV0dXJuIHQuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKT09PTA/MDpudWxsO2NvbnN0IG49LSh0aGlzLm9yaWdpbi5kb3QodC5ub3JtYWwpK3QuY29uc3RhbnQpL2U7cmV0dXJuIG4+PTA/bjpudWxsfWludGVyc2VjdFBsYW5lKHQsZSl7Y29uc3Qgbj10aGlzLmRpc3RhbmNlVG9QbGFuZSh0KTtyZXR1cm4gbj09PW51bGw/bnVsbDp0aGlzLmF0KG4sZSl9aW50ZXJzZWN0c1BsYW5lKHQpe2NvbnN0IGU9dC5kaXN0YW5jZVRvUG9pbnQodGhpcy5vcmlnaW4pO3JldHVybiBlPT09MHx8dC5ub3JtYWwuZG90KHRoaXMuZGlyZWN0aW9uKSplPDB9aW50ZXJzZWN0Qm94KHQsZSl7bGV0IG4scyxyLG8sYSxjO2NvbnN0IGw9MS90aGlzLmRpcmVjdGlvbi54LGg9MS90aGlzLmRpcmVjdGlvbi55LHU9MS90aGlzLmRpcmVjdGlvbi56LGY9dGhpcy5vcmlnaW47cmV0dXJuIGw+PTA/KG49KHQubWluLngtZi54KSpsLHM9KHQubWF4LngtZi54KSpsKToobj0odC5tYXgueC1mLngpKmwscz0odC5taW4ueC1mLngpKmwpLGg+PTA/KHI9KHQubWluLnktZi55KSpoLG89KHQubWF4LnktZi55KSpoKToocj0odC5tYXgueS1mLnkpKmgsbz0odC5taW4ueS1mLnkpKmgpLG4+b3x8cj5zfHwoKHI+bnx8aXNOYU4obikpJiYobj1yKSwobzxzfHxpc05hTihzKSkmJihzPW8pLHU+PTA/KGE9KHQubWluLnotZi56KSp1LGM9KHQubWF4LnotZi56KSp1KTooYT0odC5tYXguei1mLnopKnUsYz0odC5taW4uei1mLnopKnUpLG4+Y3x8YT5zKXx8KChhPm58fG4hPT1uKSYmKG49YSksKGM8c3x8cyE9PXMpJiYocz1jKSxzPDApP251bGw6dGhpcy5hdChuPj0wP246cyxlKX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0aGlzLmludGVyc2VjdEJveCh0LEJlKSE9PW51bGx9aW50ZXJzZWN0VHJpYW5nbGUodCxlLG4scyxyKXtNby5zdWJWZWN0b3JzKGUsdCksQXMuc3ViVmVjdG9ycyhuLHQpLEFvLmNyb3NzVmVjdG9ycyhNbyxBcyk7bGV0IG89dGhpcy5kaXJlY3Rpb24uZG90KEFvKSxhO2lmKG8+MCl7aWYocylyZXR1cm4gbnVsbDthPTF9ZWxzZSBpZihvPDApYT0tMSxvPS1vO2Vsc2UgcmV0dXJuIG51bGw7bm4uc3ViVmVjdG9ycyh0aGlzLm9yaWdpbix0KTtjb25zdCBjPWEqdGhpcy5kaXJlY3Rpb24uZG90KEFzLmNyb3NzVmVjdG9ycyhubixBcykpO2lmKGM8MClyZXR1cm4gbnVsbDtjb25zdCBsPWEqdGhpcy5kaXJlY3Rpb24uZG90KE1vLmNyb3NzKG5uKSk7aWYobDwwfHxjK2w+bylyZXR1cm4gbnVsbDtjb25zdCBoPS1hKm5uLmRvdChBbyk7cmV0dXJuIGg8MD9udWxsOnRoaXMuYXQoaC9vLHIpfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5vcmlnaW4uYXBwbHlNYXRyaXg0KHQpLHRoaXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5vcmlnaW4uZXF1YWxzKHRoaXMub3JpZ2luKSYmdC5kaXJlY3Rpb24uZXF1YWxzKHRoaXMuZGlyZWN0aW9uKX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWNsYXNzIHN0e2NvbnN0cnVjdG9yKHQsZSxuLHMscixvLGEsYyxsLGgsdSxmLGQscCx5LGcpe3N0LnByb3RvdHlwZS5pc01hdHJpeDQ9ITAsdGhpcy5lbGVtZW50cz1bMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMV0sdCE9PXZvaWQgMCYmdGhpcy5zZXQodCxlLG4scyxyLG8sYSxjLGwsaCx1LGYsZCxwLHksZyl9c2V0KHQsZSxuLHMscixvLGEsYyxsLGgsdSxmLGQscCx5LGcpe2NvbnN0IHc9dGhpcy5lbGVtZW50cztyZXR1cm4gd1swXT10LHdbNF09ZSx3WzhdPW4sd1sxMl09cyx3WzFdPXIsd1s1XT1vLHdbOV09YSx3WzEzXT1jLHdbMl09bCx3WzZdPWgsd1sxMF09dSx3WzE0XT1mLHdbM109ZCx3WzddPXAsd1sxMV09eSx3WzE1XT1nLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMSksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgc3QoKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9Y29weSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO3JldHVybiBlWzBdPW5bMF0sZVsxXT1uWzFdLGVbMl09blsyXSxlWzNdPW5bM10sZVs0XT1uWzRdLGVbNV09bls1XSxlWzZdPW5bNl0sZVs3XT1uWzddLGVbOF09bls4XSxlWzldPW5bOV0sZVsxMF09blsxMF0sZVsxMV09blsxMV0sZVsxMl09blsxMl0sZVsxM109blsxM10sZVsxNF09blsxNF0sZVsxNV09blsxNV0sdGhpc31jb3B5UG9zaXRpb24odCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztyZXR1cm4gZVsxMl09blsxMl0sZVsxM109blsxM10sZVsxNF09blsxNF0sdGhpc31zZXRGcm9tTWF0cml4Myh0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMuc2V0KGVbMF0sZVszXSxlWzZdLDAsZVsxXSxlWzRdLGVbN10sMCxlWzJdLGVbNV0sZVs4XSwwLDAsMCwwLDEpLHRoaXN9ZXh0cmFjdEJhc2lzKHQsZSxuKXtyZXR1cm4gdGhpcy5kZXRlcm1pbmFudCgpPT09MD8odC5zZXQoMSwwLDApLGUuc2V0KDAsMSwwKSxuLnNldCgwLDAsMSksdGhpcyk6KHQuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDApLGUuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDEpLG4uc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDIpLHRoaXMpfW1ha2VCYXNpcyh0LGUsbil7cmV0dXJuIHRoaXMuc2V0KHQueCxlLngsbi54LDAsdC55LGUueSxuLnksMCx0LnosZS56LG4ueiwwLDAsMCwwLDEpLHRoaXN9ZXh0cmFjdFJvdGF0aW9uKHQpe2lmKHQuZGV0ZXJtaW5hbnQoKT09PTApcmV0dXJuIHRoaXMuaWRlbnRpdHkoKTtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzLHM9MS9Xbi5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMCkubGVuZ3RoKCkscj0xL1duLnNldEZyb21NYXRyaXhDb2x1bW4odCwxKS5sZW5ndGgoKSxvPTEvV24uc2V0RnJvbU1hdHJpeENvbHVtbih0LDIpLmxlbmd0aCgpO3JldHVybiBlWzBdPW5bMF0qcyxlWzFdPW5bMV0qcyxlWzJdPW5bMl0qcyxlWzNdPTAsZVs0XT1uWzRdKnIsZVs1XT1uWzVdKnIsZVs2XT1uWzZdKnIsZVs3XT0wLGVbOF09bls4XSpvLGVbOV09bls5XSpvLGVbMTBdPW5bMTBdKm8sZVsxMV09MCxlWzEyXT0wLGVbMTNdPTAsZVsxNF09MCxlWzE1XT0xLHRoaXN9bWFrZVJvdGF0aW9uRnJvbUV1bGVyKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQueCxzPXQueSxyPXQueixvPU1hdGguY29zKG4pLGE9TWF0aC5zaW4obiksYz1NYXRoLmNvcyhzKSxsPU1hdGguc2luKHMpLGg9TWF0aC5jb3MociksdT1NYXRoLnNpbihyKTtpZih0Lm9yZGVyPT09IlhZWiIpe2NvbnN0IGY9bypoLGQ9byp1LHA9YSpoLHk9YSp1O2VbMF09YypoLGVbNF09LWMqdSxlWzhdPWwsZVsxXT1kK3AqbCxlWzVdPWYteSpsLGVbOV09LWEqYyxlWzJdPXktZipsLGVbNl09cCtkKmwsZVsxMF09bypjfWVsc2UgaWYodC5vcmRlcj09PSJZWFoiKXtjb25zdCBmPWMqaCxkPWMqdSxwPWwqaCx5PWwqdTtlWzBdPWYreSphLGVbNF09cCphLWQsZVs4XT1vKmwsZVsxXT1vKnUsZVs1XT1vKmgsZVs5XT0tYSxlWzJdPWQqYS1wLGVbNl09eStmKmEsZVsxMF09bypjfWVsc2UgaWYodC5vcmRlcj09PSJaWFkiKXtjb25zdCBmPWMqaCxkPWMqdSxwPWwqaCx5PWwqdTtlWzBdPWYteSphLGVbNF09LW8qdSxlWzhdPXArZCphLGVbMV09ZCtwKmEsZVs1XT1vKmgsZVs5XT15LWYqYSxlWzJdPS1vKmwsZVs2XT1hLGVbMTBdPW8qY31lbHNlIGlmKHQub3JkZXI9PT0iWllYIil7Y29uc3QgZj1vKmgsZD1vKnUscD1hKmgseT1hKnU7ZVswXT1jKmgsZVs0XT1wKmwtZCxlWzhdPWYqbCt5LGVbMV09Yyp1LGVbNV09eSpsK2YsZVs5XT1kKmwtcCxlWzJdPS1sLGVbNl09YSpjLGVbMTBdPW8qY31lbHNlIGlmKHQub3JkZXI9PT0iWVpYIil7Y29uc3QgZj1vKmMsZD1vKmwscD1hKmMseT1hKmw7ZVswXT1jKmgsZVs0XT15LWYqdSxlWzhdPXAqdStkLGVbMV09dSxlWzVdPW8qaCxlWzldPS1hKmgsZVsyXT0tbCpoLGVbNl09ZCp1K3AsZVsxMF09Zi15KnV9ZWxzZSBpZih0Lm9yZGVyPT09IlhaWSIpe2NvbnN0IGY9bypjLGQ9bypsLHA9YSpjLHk9YSpsO2VbMF09YypoLGVbNF09LXUsZVs4XT1sKmgsZVsxXT1mKnUreSxlWzVdPW8qaCxlWzldPWQqdS1wLGVbMl09cCp1LWQsZVs2XT1hKmgsZVsxMF09eSp1K2Z9cmV0dXJuIGVbM109MCxlWzddPTAsZVsxMV09MCxlWzEyXT0wLGVbMTNdPTAsZVsxNF09MCxlWzE1XT0xLHRoaXN9bWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24odCl7cmV0dXJuIHRoaXMuY29tcG9zZShxZix0LFhmKX1sb29rQXQodCxlLG4pe2NvbnN0IHM9dGhpcy5lbGVtZW50cztyZXR1cm4gSHQuc3ViVmVjdG9ycyh0LGUpLEh0Lmxlbmd0aFNxKCk9PT0wJiYoSHQuej0xKSxIdC5ub3JtYWxpemUoKSxzbi5jcm9zc1ZlY3RvcnMobixIdCksc24ubGVuZ3RoU3EoKT09PTAmJihNYXRoLmFicyhuLnopPT09MT9IdC54Kz0xZS00Okh0LnorPTFlLTQsSHQubm9ybWFsaXplKCksc24uY3Jvc3NWZWN0b3JzKG4sSHQpKSxzbi5ub3JtYWxpemUoKSxTcy5jcm9zc1ZlY3RvcnMoSHQsc24pLHNbMF09c24ueCxzWzRdPVNzLngsc1s4XT1IdC54LHNbMV09c24ueSxzWzVdPVNzLnksc1s5XT1IdC55LHNbMl09c24ueixzWzZdPVNzLnosc1sxMF09SHQueix0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModGhpcyx0KX1wcmVtdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHQsdGhpcyl9bXVsdGlwbHlNYXRyaWNlcyh0LGUpe2NvbnN0IG49dC5lbGVtZW50cyxzPWUuZWxlbWVudHMscj10aGlzLmVsZW1lbnRzLG89blswXSxhPW5bNF0sYz1uWzhdLGw9blsxMl0saD1uWzFdLHU9bls1XSxmPW5bOV0sZD1uWzEzXSxwPW5bMl0seT1uWzZdLGc9blsxMF0sdz1uWzE0XSxiPW5bM10seD1uWzddLG09blsxMV0sTT1uWzE1XSxTPXNbMF0sQT1zWzRdLHY9c1s4XSxfPXNbMTJdLFQ9c1sxXSx6PXNbNV0sQz1zWzldLEU9c1sxM10sRj1zWzJdLEI9c1s2XSxJPXNbMTBdLFI9c1sxNF0sVj1zWzNdLFU9c1s3XSxLPXNbMTFdLGN0PXNbMTVdO3JldHVybiByWzBdPW8qUythKlQrYypGK2wqVixyWzRdPW8qQSthKnorYypCK2wqVSxyWzhdPW8qdithKkMrYypJK2wqSyxyWzEyXT1vKl8rYSpFK2MqUitsKmN0LHJbMV09aCpTK3UqVCtmKkYrZCpWLHJbNV09aCpBK3UqeitmKkIrZCpVLHJbOV09aCp2K3UqQytmKkkrZCpLLHJbMTNdPWgqXyt1KkUrZipSK2QqY3QsclsyXT1wKlMreSpUK2cqRit3KlYscls2XT1wKkEreSp6K2cqQit3KlUsclsxMF09cCp2K3kqQytnKkkrdypLLHJbMTRdPXAqXyt5KkUrZypSK3cqY3QsclszXT1iKlMreCpUK20qRitNKlYscls3XT1iKkEreCp6K20qQitNKlUsclsxMV09Yip2K3gqQyttKkkrTSpLLHJbMTVdPWIqXyt4KkUrbSpSK00qY3QsdGhpc31tdWx0aXBseVNjYWxhcih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIGVbMF0qPXQsZVs0XSo9dCxlWzhdKj10LGVbMTJdKj10LGVbMV0qPXQsZVs1XSo9dCxlWzldKj10LGVbMTNdKj10LGVbMl0qPXQsZVs2XSo9dCxlWzEwXSo9dCxlWzE0XSo9dCxlWzNdKj10LGVbN10qPXQsZVsxMV0qPXQsZVsxNV0qPXQsdGhpc31kZXRlcm1pbmFudCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzRdLHM9dFs4XSxyPXRbMTJdLG89dFsxXSxhPXRbNV0sYz10WzldLGw9dFsxM10saD10WzJdLHU9dFs2XSxmPXRbMTBdLGQ9dFsxNF0scD10WzNdLHk9dFs3XSxnPXRbMTFdLHc9dFsxNV0sYj1jKmQtbCpmLHg9YSpkLWwqdSxtPWEqZi1jKnUsTT1vKmQtbCpoLFM9bypmLWMqaCxBPW8qdS1hKmg7cmV0dXJuIGUqKHkqYi1nKngrdyptKS1uKihwKmItZypNK3cqUykrcyoocCp4LXkqTSt3KkEpLXIqKHAqbS15KlMrZypBKX10cmFuc3Bvc2UoKXtjb25zdCB0PXRoaXMuZWxlbWVudHM7bGV0IGU7cmV0dXJuIGU9dFsxXSx0WzFdPXRbNF0sdFs0XT1lLGU9dFsyXSx0WzJdPXRbOF0sdFs4XT1lLGU9dFs2XSx0WzZdPXRbOV0sdFs5XT1lLGU9dFszXSx0WzNdPXRbMTJdLHRbMTJdPWUsZT10WzddLHRbN109dFsxM10sdFsxM109ZSxlPXRbMTFdLHRbMTFdPXRbMTRdLHRbMTRdPWUsdGhpc31zZXRQb3NpdGlvbih0LGUsbil7Y29uc3Qgcz10aGlzLmVsZW1lbnRzO3JldHVybiB0LmlzVmVjdG9yMz8oc1sxMl09dC54LHNbMTNdPXQueSxzWzE0XT10LnopOihzWzEyXT10LHNbMTNdPWUsc1sxNF09biksdGhpc31pbnZlcnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFsxXSxzPXRbMl0scj10WzNdLG89dFs0XSxhPXRbNV0sYz10WzZdLGw9dFs3XSxoPXRbOF0sdT10WzldLGY9dFsxMF0sZD10WzExXSxwPXRbMTJdLHk9dFsxM10sZz10WzE0XSx3PXRbMTVdLGI9dSpnKmwteSpmKmwreSpjKmQtYSpnKmQtdSpjKncrYSpmKncseD1wKmYqbC1oKmcqbC1wKmMqZCtvKmcqZCtoKmMqdy1vKmYqdyxtPWgqeSpsLXAqdSpsK3AqYSpkLW8qeSpkLWgqYSp3K28qdSp3LE09cCp1KmMtaCp5KmMtcCphKmYrbyp5KmYraCphKmctbyp1KmcsUz1lKmIrbip4K3MqbStyKk07aWYoUz09PTApcmV0dXJuIHRoaXMuc2V0KDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDApO2NvbnN0IEE9MS9TO3JldHVybiB0WzBdPWIqQSx0WzFdPSh5KmYqci11Kmcqci15KnMqZCtuKmcqZCt1KnMqdy1uKmYqdykqQSx0WzJdPShhKmcqci15KmMqcit5KnMqbC1uKmcqbC1hKnMqdytuKmMqdykqQSx0WzNdPSh1KmMqci1hKmYqci11KnMqbCtuKmYqbCthKnMqZC1uKmMqZCkqQSx0WzRdPXgqQSx0WzVdPShoKmcqci1wKmYqcitwKnMqZC1lKmcqZC1oKnMqdytlKmYqdykqQSx0WzZdPShwKmMqci1vKmcqci1wKnMqbCtlKmcqbCtvKnMqdy1lKmMqdykqQSx0WzddPShvKmYqci1oKmMqcitoKnMqbC1lKmYqbC1vKnMqZCtlKmMqZCkqQSx0WzhdPW0qQSx0WzldPShwKnUqci1oKnkqci1wKm4qZCtlKnkqZCtoKm4qdy1lKnUqdykqQSx0WzEwXT0obyp5KnItcCphKnIrcCpuKmwtZSp5KmwtbypuKncrZSphKncpKkEsdFsxMV09KGgqYSpyLW8qdSpyLWgqbipsK2UqdSpsK28qbipkLWUqYSpkKSpBLHRbMTJdPU0qQSx0WzEzXT0oaCp5KnMtcCp1KnMrcCpuKmYtZSp5KmYtaCpuKmcrZSp1KmcpKkEsdFsxNF09KHAqYSpzLW8qeSpzLXAqbipjK2UqeSpjK28qbipnLWUqYSpnKSpBLHRbMTVdPShvKnUqcy1oKmEqcytoKm4qYy1lKnUqYy1vKm4qZitlKmEqZikqQSx0aGlzfXNjYWxlKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQueCxzPXQueSxyPXQuejtyZXR1cm4gZVswXSo9bixlWzRdKj1zLGVbOF0qPXIsZVsxXSo9bixlWzVdKj1zLGVbOV0qPXIsZVsyXSo9bixlWzZdKj1zLGVbMTBdKj1yLGVbM10qPW4sZVs3XSo9cyxlWzExXSo9cix0aGlzfWdldE1heFNjYWxlT25BeGlzKCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSp0WzBdK3RbMV0qdFsxXSt0WzJdKnRbMl0sbj10WzRdKnRbNF0rdFs1XSp0WzVdK3RbNl0qdFs2XSxzPXRbOF0qdFs4XSt0WzldKnRbOV0rdFsxMF0qdFsxMF07cmV0dXJuIE1hdGguc3FydChNYXRoLm1heChlLG4scykpfW1ha2VUcmFuc2xhdGlvbih0LGUsbil7cmV0dXJuIHQuaXNWZWN0b3IzP3RoaXMuc2V0KDEsMCwwLHQueCwwLDEsMCx0LnksMCwwLDEsdC56LDAsMCwwLDEpOnRoaXMuc2V0KDEsMCwwLHQsMCwxLDAsZSwwLDAsMSxuLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWCh0KXtjb25zdCBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KDEsMCwwLDAsMCxlLC1uLDAsMCxuLGUsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvblkodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldChlLDAsbiwwLDAsMSwwLDAsLW4sMCxlLDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25aKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoZSwtbiwwLDAsbixlLDAsMCwwLDAsMSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uQXhpcyh0LGUpe2NvbnN0IG49TWF0aC5jb3MoZSkscz1NYXRoLnNpbihlKSxyPTEtbixvPXQueCxhPXQueSxjPXQueixsPXIqbyxoPXIqYTtyZXR1cm4gdGhpcy5zZXQobCpvK24sbCphLXMqYyxsKmMrcyphLDAsbCphK3MqYyxoKmErbixoKmMtcypvLDAsbCpjLXMqYSxoKmMrcypvLHIqYypjK24sMCwwLDAsMCwxKSx0aGlzfW1ha2VTY2FsZSh0LGUsbil7cmV0dXJuIHRoaXMuc2V0KHQsMCwwLDAsMCxlLDAsMCwwLDAsbiwwLDAsMCwwLDEpLHRoaXN9bWFrZVNoZWFyKHQsZSxuLHMscixvKXtyZXR1cm4gdGhpcy5zZXQoMSxuLHIsMCx0LDEsbywwLGUscywxLDAsMCwwLDAsMSksdGhpc31jb21wb3NlKHQsZSxuKXtjb25zdCBzPXRoaXMuZWxlbWVudHMscj1lLl94LG89ZS5feSxhPWUuX3osYz1lLl93LGw9cityLGg9bytvLHU9YSthLGY9cipsLGQ9cipoLHA9cip1LHk9bypoLGc9byp1LHc9YSp1LGI9YypsLHg9YypoLG09Yyp1LE09bi54LFM9bi55LEE9bi56O3JldHVybiBzWzBdPSgxLSh5K3cpKSpNLHNbMV09KGQrbSkqTSxzWzJdPShwLXgpKk0sc1szXT0wLHNbNF09KGQtbSkqUyxzWzVdPSgxLShmK3cpKSpTLHNbNl09KGcrYikqUyxzWzddPTAsc1s4XT0ocCt4KSpBLHNbOV09KGctYikqQSxzWzEwXT0oMS0oZit5KSkqQSxzWzExXT0wLHNbMTJdPXQueCxzWzEzXT10Lnksc1sxNF09dC56LHNbMTVdPTEsdGhpc31kZWNvbXBvc2UodCxlLG4pe2NvbnN0IHM9dGhpcy5lbGVtZW50cztpZih0Lng9c1sxMl0sdC55PXNbMTNdLHQuej1zWzE0XSx0aGlzLmRldGVybWluYW50KCk9PT0wKXJldHVybiBuLnNldCgxLDEsMSksZS5pZGVudGl0eSgpLHRoaXM7bGV0IHI9V24uc2V0KHNbMF0sc1sxXSxzWzJdKS5sZW5ndGgoKTtjb25zdCBvPVduLnNldChzWzRdLHNbNV0sc1s2XSkubGVuZ3RoKCksYT1Xbi5zZXQoc1s4XSxzWzldLHNbMTBdKS5sZW5ndGgoKTt0aGlzLmRldGVybWluYW50KCk8MCYmKHI9LXIpLHllLmNvcHkodGhpcyk7Y29uc3QgbD0xL3IsaD0xL28sdT0xL2E7cmV0dXJuIHllLmVsZW1lbnRzWzBdKj1sLHllLmVsZW1lbnRzWzFdKj1sLHllLmVsZW1lbnRzWzJdKj1sLHllLmVsZW1lbnRzWzRdKj1oLHllLmVsZW1lbnRzWzVdKj1oLHllLmVsZW1lbnRzWzZdKj1oLHllLmVsZW1lbnRzWzhdKj11LHllLmVsZW1lbnRzWzldKj11LHllLmVsZW1lbnRzWzEwXSo9dSxlLnNldEZyb21Sb3RhdGlvbk1hdHJpeCh5ZSksbi54PXIsbi55PW8sbi56PWEsdGhpc31tYWtlUGVyc3BlY3RpdmUodCxlLG4scyxyLG8sYT0yZTMsYz0hMSl7Y29uc3QgbD10aGlzLmVsZW1lbnRzLGg9MipyLyhlLXQpLHU9MipyLyhuLXMpLGY9KGUrdCkvKGUtdCksZD0obitzKS8obi1zKTtsZXQgcCx5O2lmKGMpcD1yLyhvLXIpLHk9bypyLyhvLXIpO2Vsc2UgaWYoYT09PTJlMylwPS0obytyKS8oby1yKSx5PS0yKm8qci8oby1yKTtlbHNlIGlmKGE9PT0yMDAxKXA9LW8vKG8tcikseT0tbypyLyhvLXIpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5NYXRyaXg0Lm1ha2VQZXJzcGVjdGl2ZSgpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAiK2EpO3JldHVybiBsWzBdPWgsbFs0XT0wLGxbOF09ZixsWzEyXT0wLGxbMV09MCxsWzVdPXUsbFs5XT1kLGxbMTNdPTAsbFsyXT0wLGxbNl09MCxsWzEwXT1wLGxbMTRdPXksbFszXT0wLGxbN109MCxsWzExXT0tMSxsWzE1XT0wLHRoaXN9bWFrZU9ydGhvZ3JhcGhpYyh0LGUsbixzLHIsbyxhPTJlMyxjPSExKXtjb25zdCBsPXRoaXMuZWxlbWVudHMsaD0yLyhlLXQpLHU9Mi8obi1zKSxmPS0oZSt0KS8oZS10KSxkPS0obitzKS8obi1zKTtsZXQgcCx5O2lmKGMpcD0xLyhvLXIpLHk9by8oby1yKTtlbHNlIGlmKGE9PT0yZTMpcD0tMi8oby1yKSx5PS0obytyKS8oby1yKTtlbHNlIGlmKGE9PT0yMDAxKXA9LTEvKG8tcikseT0tci8oby1yKTtlbHNlIHRocm93IG5ldyBFcnJvcigiVEhSRUUuTWF0cml4NC5tYWtlT3J0aG9ncmFwaGljKCk6IEludmFsaWQgY29vcmRpbmF0ZSBzeXN0ZW06ICIrYSk7cmV0dXJuIGxbMF09aCxsWzRdPTAsbFs4XT0wLGxbMTJdPWYsbFsxXT0wLGxbNV09dSxsWzldPTAsbFsxM109ZCxsWzJdPTAsbFs2XT0wLGxbMTBdPXAsbFsxNF09eSxsWzNdPTAsbFs3XT0wLGxbMTFdPTAsbFsxNV09MSx0aGlzfWVxdWFscyh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO2ZvcihsZXQgcz0wO3M8MTY7cysrKWlmKGVbc10hPT1uW3NdKXJldHVybiExO3JldHVybiEwfWZyb21BcnJheSh0LGU9MCl7Zm9yKGxldCBuPTA7bjwxNjtuKyspdGhpcy5lbGVtZW50c1tuXT10W24rZV07cmV0dXJuIHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7Y29uc3Qgbj10aGlzLmVsZW1lbnRzO3JldHVybiB0W2VdPW5bMF0sdFtlKzFdPW5bMV0sdFtlKzJdPW5bMl0sdFtlKzNdPW5bM10sdFtlKzRdPW5bNF0sdFtlKzVdPW5bNV0sdFtlKzZdPW5bNl0sdFtlKzddPW5bN10sdFtlKzhdPW5bOF0sdFtlKzldPW5bOV0sdFtlKzEwXT1uWzEwXSx0W2UrMTFdPW5bMTFdLHRbZSsxMl09blsxMl0sdFtlKzEzXT1uWzEzXSx0W2UrMTRdPW5bMTRdLHRbZSsxNV09blsxNV0sdH19Y29uc3QgV249bmV3IFAseWU9bmV3IHN0LHFmPW5ldyBQKDAsMCwwKSxYZj1uZXcgUCgxLDEsMSksc249bmV3IFAsU3M9bmV3IFAsSHQ9bmV3IFAsR2M9bmV3IHN0LFdjPW5ldyBQaTtjbGFzcyBCaXtjb25zdHJ1Y3Rvcih0PTAsZT0wLG49MCxzPUJpLkRFRkFVTFRfT1JERVIpe3RoaXMuaXNFdWxlcj0hMCx0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl9vcmRlcj1zfWdldCB4KCl7cmV0dXJuIHRoaXMuX3h9c2V0IHgodCl7dGhpcy5feD10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeSgpe3JldHVybiB0aGlzLl95fXNldCB5KHQpe3RoaXMuX3k9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHooKXtyZXR1cm4gdGhpcy5fen1zZXQgeih0KXt0aGlzLl96PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCBvcmRlcigpe3JldHVybiB0aGlzLl9vcmRlcn1zZXQgb3JkZXIodCl7dGhpcy5fb3JkZXI9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9c2V0KHQsZSxuLHM9dGhpcy5fb3JkZXIpe3JldHVybiB0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl9vcmRlcj1zLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsdGhpcy5feSx0aGlzLl96LHRoaXMuX29yZGVyKX1jb3B5KHQpe3JldHVybiB0aGlzLl94PXQuX3gsdGhpcy5feT10Ll95LHRoaXMuX3o9dC5feix0aGlzLl9vcmRlcj10Ll9vcmRlcix0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUm90YXRpb25NYXRyaXgodCxlPXRoaXMuX29yZGVyLG49ITApe2NvbnN0IHM9dC5lbGVtZW50cyxyPXNbMF0sbz1zWzRdLGE9c1s4XSxjPXNbMV0sbD1zWzVdLGg9c1s5XSx1PXNbMl0sZj1zWzZdLGQ9c1sxMF07c3dpdGNoKGUpe2Nhc2UiWFlaIjp0aGlzLl95PU1hdGguYXNpbihaKGEsLTEsMSkpLE1hdGguYWJzKGEpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoLWgsZCksdGhpcy5fej1NYXRoLmF0YW4yKC1vLHIpKToodGhpcy5feD1NYXRoLmF0YW4yKGYsbCksdGhpcy5fej0wKTticmVhaztjYXNlIllYWiI6dGhpcy5feD1NYXRoLmFzaW4oLVooaCwtMSwxKSksTWF0aC5hYnMoaCk8Ljk5OTk5OTk/KHRoaXMuX3k9TWF0aC5hdGFuMihhLGQpLHRoaXMuX3o9TWF0aC5hdGFuMihjLGwpKToodGhpcy5feT1NYXRoLmF0YW4yKC11LHIpLHRoaXMuX3o9MCk7YnJlYWs7Y2FzZSJaWFkiOnRoaXMuX3g9TWF0aC5hc2luKFooZiwtMSwxKSksTWF0aC5hYnMoZik8Ljk5OTk5OTk/KHRoaXMuX3k9TWF0aC5hdGFuMigtdSxkKSx0aGlzLl96PU1hdGguYXRhbjIoLW8sbCkpOih0aGlzLl95PTAsdGhpcy5fej1NYXRoLmF0YW4yKGMscikpO2JyZWFrO2Nhc2UiWllYIjp0aGlzLl95PU1hdGguYXNpbigtWih1LC0xLDEpKSxNYXRoLmFicyh1KTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKGYsZCksdGhpcy5fej1NYXRoLmF0YW4yKGMscikpOih0aGlzLl94PTAsdGhpcy5fej1NYXRoLmF0YW4yKC1vLGwpKTticmVhaztjYXNlIllaWCI6dGhpcy5fej1NYXRoLmFzaW4oWihjLC0xLDEpKSxNYXRoLmFicyhjKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKC1oLGwpLHRoaXMuX3k9TWF0aC5hdGFuMigtdSxyKSk6KHRoaXMuX3g9MCx0aGlzLl95PU1hdGguYXRhbjIoYSxkKSk7YnJlYWs7Y2FzZSJYWlkiOnRoaXMuX3o9TWF0aC5hc2luKC1aKG8sLTEsMSkpLE1hdGguYWJzKG8pPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoZixsKSx0aGlzLl95PU1hdGguYXRhbjIoYSxyKSk6KHRoaXMuX3g9TWF0aC5hdGFuMigtaCxkKSx0aGlzLl95PTApO2JyZWFrO2RlZmF1bHQ6YnQoIkV1bGVyOiAuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCkgZW5jb3VudGVyZWQgYW4gdW5rbm93biBvcmRlcjogIitlKX1yZXR1cm4gdGhpcy5fb3JkZXI9ZSxuPT09ITAmJnRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21RdWF0ZXJuaW9uKHQsZSxuKXtyZXR1cm4gR2MubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24odCksdGhpcy5zZXRGcm9tUm90YXRpb25NYXRyaXgoR2MsZSxuKX1zZXRGcm9tVmVjdG9yMyh0LGU9dGhpcy5fb3JkZXIpe3JldHVybiB0aGlzLnNldCh0LngsdC55LHQueixlKX1yZW9yZGVyKHQpe3JldHVybiBXYy5zZXRGcm9tRXVsZXIodGhpcyksdGhpcy5zZXRGcm9tUXVhdGVybmlvbihXYyx0KX1lcXVhbHModCl7cmV0dXJuIHQuX3g9PT10aGlzLl94JiZ0Ll95PT09dGhpcy5feSYmdC5fej09PXRoaXMuX3omJnQuX29yZGVyPT09dGhpcy5fb3JkZXJ9ZnJvbUFycmF5KHQpe3JldHVybiB0aGlzLl94PXRbMF0sdGhpcy5feT10WzFdLHRoaXMuX3o9dFsyXSx0WzNdIT09dm9pZCAwJiYodGhpcy5fb3JkZXI9dFszXSksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy5feCx0W2UrMV09dGhpcy5feSx0W2UrMl09dGhpcy5feix0W2UrM109dGhpcy5fb3JkZXIsdH1fb25DaGFuZ2UodCl7cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2s9dCx0aGlzfV9vbkNoYW5nZUNhbGxiYWNrKCl7fSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMuX3gseWllbGQgdGhpcy5feSx5aWVsZCB0aGlzLl96LHlpZWxkIHRoaXMuX29yZGVyfX1CaS5ERUZBVUxUX09SREVSPSJYWVoiO2NsYXNzIFpme2NvbnN0cnVjdG9yKCl7dGhpcy5tYXNrPTF9c2V0KHQpe3RoaXMubWFzaz0oMTw8dHwwKT4+PjB9ZW5hYmxlKHQpe3RoaXMubWFza3w9MTw8dHwwfWVuYWJsZUFsbCgpe3RoaXMubWFzaz0tMX10b2dnbGUodCl7dGhpcy5tYXNrXj0xPDx0fDB9ZGlzYWJsZSh0KXt0aGlzLm1hc2smPX4oMTw8dHwwKX1kaXNhYmxlQWxsKCl7dGhpcy5tYXNrPTB9dGVzdCh0KXtyZXR1cm4odGhpcy5tYXNrJnQubWFzaykhPT0wfWlzRW5hYmxlZCh0KXtyZXR1cm4odGhpcy5tYXNrJigxPDx0fDApKSE9PTB9fWxldCBHZj0wO2NvbnN0IEhjPW5ldyBQLEhuPW5ldyBQaSxGZT1uZXcgc3QsdnM9bmV3IFAsRmk9bmV3IFAsV2Y9bmV3IFAsSGY9bmV3IFBpLEpjPW5ldyBQKDEsMCwwKSxZYz1uZXcgUCgwLDEsMCksamM9bmV3IFAoMCwwLDEpLFFjPXt0eXBlOiJhZGRlZCJ9LEpmPXt0eXBlOiJyZW1vdmVkIn0sSm49e3R5cGU6ImNoaWxkYWRkZWQiLGNoaWxkOm51bGx9LHZvPXt0eXBlOiJjaGlsZHJlbW92ZWQiLGNoaWxkOm51bGx9O2NsYXNzIEllIGV4dGVuZHMgZ3N7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNPYmplY3QzRD0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpHZisrfSksdGhpcy51dWlkPW1uKCksdGhpcy5uYW1lPSIiLHRoaXMudHlwZT0iT2JqZWN0M0QiLHRoaXMucGFyZW50PW51bGwsdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnVwPUllLkRFRkFVTFRfVVAuY2xvbmUoKTtjb25zdCB0PW5ldyBQLGU9bmV3IEJpLG49bmV3IFBpLHM9bmV3IFAoMSwxLDEpO2Z1bmN0aW9uIHIoKXtuLnNldEZyb21FdWxlcihlLCExKX1mdW5jdGlvbiBvKCl7ZS5zZXRGcm9tUXVhdGVybmlvbihuLHZvaWQgMCwhMSl9ZS5fb25DaGFuZ2Uociksbi5fb25DaGFuZ2UobyksT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7cG9zaXRpb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOnR9LHJvdGF0aW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTplfSxxdWF0ZXJuaW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpufSxzY2FsZTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6c30sbW9kZWxWaWV3TWF0cml4Ont2YWx1ZTpuZXcgc3R9LG5vcm1hbE1hdHJpeDp7dmFsdWU6bmV3IE1lfX0pLHRoaXMubWF0cml4PW5ldyBzdCx0aGlzLm1hdHJpeFdvcmxkPW5ldyBzdCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9SWUuREVGQVVMVF9NQVRSSVhfQVVUT19VUERBVEUsdGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9SWUuREVGQVVMVF9NQVRSSVhfV09STERfQVVUT19VUERBVEUsdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExLHRoaXMubGF5ZXJzPW5ldyBaZix0aGlzLnZpc2libGU9ITAsdGhpcy5jYXN0U2hhZG93PSExLHRoaXMucmVjZWl2ZVNoYWRvdz0hMSx0aGlzLmZydXN0dW1DdWxsZWQ9ITAsdGhpcy5yZW5kZXJPcmRlcj0wLHRoaXMuYW5pbWF0aW9ucz1bXSx0aGlzLmN1c3RvbURlcHRoTWF0ZXJpYWw9dm9pZCAwLHRoaXMuY3VzdG9tRGlzdGFuY2VNYXRlcmlhbD12b2lkIDAsdGhpcy51c2VyRGF0YT17fX1vbkJlZm9yZVNoYWRvdygpe31vbkFmdGVyU2hhZG93KCl7fW9uQmVmb3JlUmVuZGVyKCl7fW9uQWZ0ZXJSZW5kZXIoKXt9YXBwbHlNYXRyaXg0KHQpe3RoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSx0aGlzLm1hdHJpeC5wcmVtdWx0aXBseSh0KSx0aGlzLm1hdHJpeC5kZWNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSl9YXBwbHlRdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkodCksdGhpc31zZXRSb3RhdGlvbkZyb21BeGlzQW5nbGUodCxlKXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSh0LGUpfXNldFJvdGF0aW9uRnJvbUV1bGVyKHQpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tRXVsZXIodCwhMCl9c2V0Um90YXRpb25Gcm9tTWF0cml4KHQpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgodCl9c2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbih0KXt0aGlzLnF1YXRlcm5pb24uY29weSh0KX1yb3RhdGVPbkF4aXModCxlKXtyZXR1cm4gSG4uc2V0RnJvbUF4aXNBbmdsZSh0LGUpLHRoaXMucXVhdGVybmlvbi5tdWx0aXBseShIbiksdGhpc31yb3RhdGVPbldvcmxkQXhpcyh0LGUpe3JldHVybiBIbi5zZXRGcm9tQXhpc0FuZ2xlKHQsZSksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KEhuKSx0aGlzfXJvdGF0ZVgodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKEpjLHQpfXJvdGF0ZVkodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKFljLHQpfXJvdGF0ZVoodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKGpjLHQpfXRyYW5zbGF0ZU9uQXhpcyh0LGUpe3JldHVybiBIYy5jb3B5KHQpLmFwcGx5UXVhdGVybmlvbih0aGlzLnF1YXRlcm5pb24pLHRoaXMucG9zaXRpb24uYWRkKEhjLm11bHRpcGx5U2NhbGFyKGUpKSx0aGlzfXRyYW5zbGF0ZVgodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKEpjLHQpfXRyYW5zbGF0ZVkodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKFljLHQpfXRyYW5zbGF0ZVoodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKGpjLHQpfWxvY2FsVG9Xb3JsZCh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdC5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCl9d29ybGRUb0xvY2FsKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0LmFwcGx5TWF0cml4NChGZS5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpKX1sb29rQXQodCxlLG4pe3QuaXNWZWN0b3IzP3ZzLmNvcHkodCk6dnMuc2V0KHQsZSxuKTtjb25zdCBzPXRoaXMucGFyZW50O3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLEZpLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKSx0aGlzLmlzQ2FtZXJhfHx0aGlzLmlzTGlnaHQ/RmUubG9va0F0KEZpLHZzLHRoaXMudXApOkZlLmxvb2tBdCh2cyxGaSx0aGlzLnVwKSx0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KEZlKSxzJiYoRmUuZXh0cmFjdFJvdGF0aW9uKHMubWF0cml4V29ybGQpLEhuLnNldEZyb21Sb3RhdGlvbk1hdHJpeChGZSksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KEhuLmludmVydCgpKSl9YWRkKHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl7Zm9yKGxldCBlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0aGlzLmFkZChhcmd1bWVudHNbZV0pO3JldHVybiB0aGlzfXJldHVybiB0PT09dGhpcz8oeW4oIk9iamVjdDNELmFkZDogb2JqZWN0IGNhbid0IGJlIGFkZGVkIGFzIGEgY2hpbGQgb2YgaXRzZWxmLiIsdCksdGhpcyk6KHQmJnQuaXNPYmplY3QzRD8odC5yZW1vdmVGcm9tUGFyZW50KCksdC5wYXJlbnQ9dGhpcyx0aGlzLmNoaWxkcmVuLnB1c2godCksdC5kaXNwYXRjaEV2ZW50KFFjKSxKbi5jaGlsZD10LHRoaXMuZGlzcGF0Y2hFdmVudChKbiksSm4uY2hpbGQ9bnVsbCk6eW4oIk9iamVjdDNELmFkZDogb2JqZWN0IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5PYmplY3QzRC4iLHQpLHRoaXMpfXJlbW92ZSh0KXtpZihhcmd1bWVudHMubGVuZ3RoPjEpe2ZvcihsZXQgbj0wO248YXJndW1lbnRzLmxlbmd0aDtuKyspdGhpcy5yZW1vdmUoYXJndW1lbnRzW25dKTtyZXR1cm4gdGhpc31jb25zdCBlPXRoaXMuY2hpbGRyZW4uaW5kZXhPZih0KTtyZXR1cm4gZSE9PS0xJiYodC5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuLnNwbGljZShlLDEpLHQuZGlzcGF0Y2hFdmVudChKZiksdm8uY2hpbGQ9dCx0aGlzLmRpc3BhdGNoRXZlbnQodm8pLHZvLmNoaWxkPW51bGwpLHRoaXN9cmVtb3ZlRnJvbVBhcmVudCgpe2NvbnN0IHQ9dGhpcy5wYXJlbnQ7cmV0dXJuIHQhPT1udWxsJiZ0LnJlbW92ZSh0aGlzKSx0aGlzfWNsZWFyKCl7cmV0dXJuIHRoaXMucmVtb3ZlKC4uLnRoaXMuY2hpbGRyZW4pfWF0dGFjaCh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksRmUuY29weSh0aGlzLm1hdHJpeFdvcmxkKS5pbnZlcnQoKSx0LnBhcmVudCE9PW51bGwmJih0LnBhcmVudC51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksRmUubXVsdGlwbHkodC5wYXJlbnQubWF0cml4V29ybGQpKSx0LmFwcGx5TWF0cml4NChGZSksdC5yZW1vdmVGcm9tUGFyZW50KCksdC5wYXJlbnQ9dGhpcyx0aGlzLmNoaWxkcmVuLnB1c2godCksdC51cGRhdGVXb3JsZE1hdHJpeCghMSwhMCksdC5kaXNwYXRjaEV2ZW50KFFjKSxKbi5jaGlsZD10LHRoaXMuZGlzcGF0Y2hFdmVudChKbiksSm4uY2hpbGQ9bnVsbCx0aGlzfWdldE9iamVjdEJ5SWQodCl7cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgiaWQiLHQpfWdldE9iamVjdEJ5TmFtZSh0KXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJuYW1lIix0KX1nZXRPYmplY3RCeVByb3BlcnR5KHQsZSl7aWYodGhpc1t0XT09PWUpcmV0dXJuIHRoaXM7Zm9yKGxldCBuPTAscz10aGlzLmNoaWxkcmVuLmxlbmd0aDtuPHM7bisrKXtjb25zdCBvPXRoaXMuY2hpbGRyZW5bbl0uZ2V0T2JqZWN0QnlQcm9wZXJ0eSh0LGUpO2lmKG8hPT12b2lkIDApcmV0dXJuIG99fWdldE9iamVjdHNCeVByb3BlcnR5KHQsZSxuPVtdKXt0aGlzW3RdPT09ZSYmbi5wdXNoKHRoaXMpO2NvbnN0IHM9dGhpcy5jaGlsZHJlbjtmb3IobGV0IHI9MCxvPXMubGVuZ3RoO3I8bztyKyspc1tyXS5nZXRPYmplY3RzQnlQcm9wZXJ0eSh0LGUsbik7cmV0dXJuIG59Z2V0V29ybGRQb3NpdGlvbih0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCl9Z2V0V29ybGRRdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShGaSx0LFdmKSx0fWdldFdvcmxkU2NhbGUodCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKEZpLEhmLHQpLHR9Z2V0V29ybGREaXJlY3Rpb24odCl7dGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSk7Y29uc3QgZT10aGlzLm1hdHJpeFdvcmxkLmVsZW1lbnRzO3JldHVybiB0LnNldChlWzhdLGVbOV0sZVsxMF0pLm5vcm1hbGl6ZSgpfXJheWNhc3QoKXt9dHJhdmVyc2UodCl7dCh0aGlzKTtjb25zdCBlPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBuPTAscz1lLmxlbmd0aDtuPHM7bisrKWVbbl0udHJhdmVyc2UodCl9dHJhdmVyc2VWaXNpYmxlKHQpe2lmKHRoaXMudmlzaWJsZT09PSExKXJldHVybjt0KHRoaXMpO2NvbnN0IGU9dGhpcy5jaGlsZHJlbjtmb3IobGV0IG49MCxzPWUubGVuZ3RoO248cztuKyspZVtuXS50cmF2ZXJzZVZpc2libGUodCl9dHJhdmVyc2VBbmNlc3RvcnModCl7Y29uc3QgZT10aGlzLnBhcmVudDtlIT09bnVsbCYmKHQoZSksZS50cmF2ZXJzZUFuY2VzdG9ycyh0KSl9dXBkYXRlTWF0cml4KCl7dGhpcy5tYXRyaXguY29tcG9zZSh0aGlzLnBvc2l0aW9uLHRoaXMucXVhdGVybmlvbix0aGlzLnNjYWxlKSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9dXBkYXRlTWF0cml4V29ybGQodCl7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpLCh0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGV8fHQpJiYodGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9PT0hMCYmKHRoaXMucGFyZW50PT09bnVsbD90aGlzLm1hdHJpeFdvcmxkLmNvcHkodGhpcy5tYXRyaXgpOnRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyh0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeCkpLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMSx0PSEwKTtjb25zdCBlPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBuPTAscz1lLmxlbmd0aDtuPHM7bisrKWVbbl0udXBkYXRlTWF0cml4V29ybGQodCl9dXBkYXRlV29ybGRNYXRyaXgodCxlKXtjb25zdCBuPXRoaXMucGFyZW50O2lmKHQ9PT0hMCYmbiE9PW51bGwmJm4udXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSx0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT09PSEwJiYodGhpcy5wYXJlbnQ9PT1udWxsP3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KSksZT09PSEwKXtjb25zdCBzPXRoaXMuY2hpbGRyZW47Zm9yKGxldCByPTAsbz1zLmxlbmd0aDtyPG87cisrKXNbcl0udXBkYXRlV29ybGRNYXRyaXgoITEsITApfX10b0pTT04odCl7Y29uc3QgZT10PT09dm9pZCAwfHx0eXBlb2YgdD09InN0cmluZyIsbj17fTtlJiYodD17Z2VvbWV0cmllczp7fSxtYXRlcmlhbHM6e30sdGV4dHVyZXM6e30saW1hZ2VzOnt9LHNoYXBlczp7fSxza2VsZXRvbnM6e30sYW5pbWF0aW9uczp7fSxub2Rlczp7fX0sbi5tZXRhZGF0YT17dmVyc2lvbjo0LjcsdHlwZToiT2JqZWN0IixnZW5lcmF0b3I6Ik9iamVjdDNELnRvSlNPTiJ9KTtjb25zdCBzPXt9O3MudXVpZD10aGlzLnV1aWQscy50eXBlPXRoaXMudHlwZSx0aGlzLm5hbWUhPT0iIiYmKHMubmFtZT10aGlzLm5hbWUpLHRoaXMuY2FzdFNoYWRvdz09PSEwJiYocy5jYXN0U2hhZG93PSEwKSx0aGlzLnJlY2VpdmVTaGFkb3c9PT0hMCYmKHMucmVjZWl2ZVNoYWRvdz0hMCksdGhpcy52aXNpYmxlPT09ITEmJihzLnZpc2libGU9ITEpLHRoaXMuZnJ1c3R1bUN1bGxlZD09PSExJiYocy5mcnVzdHVtQ3VsbGVkPSExKSx0aGlzLnJlbmRlck9yZGVyIT09MCYmKHMucmVuZGVyT3JkZXI9dGhpcy5yZW5kZXJPcmRlciksT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJihzLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLHMubGF5ZXJzPXRoaXMubGF5ZXJzLm1hc2sscy5tYXRyaXg9dGhpcy5tYXRyaXgudG9BcnJheSgpLHMudXA9dGhpcy51cC50b0FycmF5KCksdGhpcy5tYXRyaXhBdXRvVXBkYXRlPT09ITEmJihzLm1hdHJpeEF1dG9VcGRhdGU9ITEpLHRoaXMuaXNJbnN0YW5jZWRNZXNoJiYocy50eXBlPSJJbnN0YW5jZWRNZXNoIixzLmNvdW50PXRoaXMuY291bnQscy5pbnN0YW5jZU1hdHJpeD10aGlzLmluc3RhbmNlTWF0cml4LnRvSlNPTigpLHRoaXMuaW5zdGFuY2VDb2xvciE9PW51bGwmJihzLmluc3RhbmNlQ29sb3I9dGhpcy5pbnN0YW5jZUNvbG9yLnRvSlNPTigpKSksdGhpcy5pc0JhdGNoZWRNZXNoJiYocy50eXBlPSJCYXRjaGVkTWVzaCIscy5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkPXRoaXMucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZCxzLnNvcnRPYmplY3RzPXRoaXMuc29ydE9iamVjdHMscy5kcmF3UmFuZ2VzPXRoaXMuX2RyYXdSYW5nZXMscy5yZXNlcnZlZFJhbmdlcz10aGlzLl9yZXNlcnZlZFJhbmdlcyxzLmdlb21ldHJ5SW5mbz10aGlzLl9nZW9tZXRyeUluZm8ubWFwKGE9PktlKFV0KHt9LGEpLHtib3VuZGluZ0JveDphLmJvdW5kaW5nQm94P2EuYm91bmRpbmdCb3gudG9KU09OKCk6dm9pZCAwLGJvdW5kaW5nU3BoZXJlOmEuYm91bmRpbmdTcGhlcmU/YS5ib3VuZGluZ1NwaGVyZS50b0pTT04oKTp2b2lkIDB9KSkscy5pbnN0YW5jZUluZm89dGhpcy5faW5zdGFuY2VJbmZvLm1hcChhPT5VdCh7fSxhKSkscy5hdmFpbGFibGVJbnN0YW5jZUlkcz10aGlzLl9hdmFpbGFibGVJbnN0YW5jZUlkcy5zbGljZSgpLHMuYXZhaWxhYmxlR2VvbWV0cnlJZHM9dGhpcy5fYXZhaWxhYmxlR2VvbWV0cnlJZHMuc2xpY2UoKSxzLm5leHRJbmRleFN0YXJ0PXRoaXMuX25leHRJbmRleFN0YXJ0LHMubmV4dFZlcnRleFN0YXJ0PXRoaXMuX25leHRWZXJ0ZXhTdGFydCxzLmdlb21ldHJ5Q291bnQ9dGhpcy5fZ2VvbWV0cnlDb3VudCxzLm1heEluc3RhbmNlQ291bnQ9dGhpcy5fbWF4SW5zdGFuY2VDb3VudCxzLm1heFZlcnRleENvdW50PXRoaXMuX21heFZlcnRleENvdW50LHMubWF4SW5kZXhDb3VudD10aGlzLl9tYXhJbmRleENvdW50LHMuZ2VvbWV0cnlJbml0aWFsaXplZD10aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkLHMubWF0cmljZXNUZXh0dXJlPXRoaXMuX21hdHJpY2VzVGV4dHVyZS50b0pTT04odCkscy5pbmRpcmVjdFRleHR1cmU9dGhpcy5faW5kaXJlY3RUZXh0dXJlLnRvSlNPTih0KSx0aGlzLl9jb2xvcnNUZXh0dXJlIT09bnVsbCYmKHMuY29sb3JzVGV4dHVyZT10aGlzLl9jb2xvcnNUZXh0dXJlLnRvSlNPTih0KSksdGhpcy5ib3VuZGluZ1NwaGVyZSE9PW51bGwmJihzLmJvdW5kaW5nU3BoZXJlPXRoaXMuYm91bmRpbmdTcGhlcmUudG9KU09OKCkpLHRoaXMuYm91bmRpbmdCb3ghPT1udWxsJiYocy5ib3VuZGluZ0JveD10aGlzLmJvdW5kaW5nQm94LnRvSlNPTigpKSk7ZnVuY3Rpb24gcihhLGMpe3JldHVybiBhW2MudXVpZF09PT12b2lkIDAmJihhW2MudXVpZF09Yy50b0pTT04odCkpLGMudXVpZH1pZih0aGlzLmlzU2NlbmUpdGhpcy5iYWNrZ3JvdW5kJiYodGhpcy5iYWNrZ3JvdW5kLmlzQ29sb3I/cy5iYWNrZ3JvdW5kPXRoaXMuYmFja2dyb3VuZC50b0pTT04oKTp0aGlzLmJhY2tncm91bmQuaXNUZXh0dXJlJiYocy5iYWNrZ3JvdW5kPXRoaXMuYmFja2dyb3VuZC50b0pTT04odCkudXVpZCkpLHRoaXMuZW52aXJvbm1lbnQmJnRoaXMuZW52aXJvbm1lbnQuaXNUZXh0dXJlJiZ0aGlzLmVudmlyb25tZW50LmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSE9PSEwJiYocy5lbnZpcm9ubWVudD10aGlzLmVudmlyb25tZW50LnRvSlNPTih0KS51dWlkKTtlbHNlIGlmKHRoaXMuaXNNZXNofHx0aGlzLmlzTGluZXx8dGhpcy5pc1BvaW50cyl7cy5nZW9tZXRyeT1yKHQuZ2VvbWV0cmllcyx0aGlzLmdlb21ldHJ5KTtjb25zdCBhPXRoaXMuZ2VvbWV0cnkucGFyYW1ldGVycztpZihhIT09dm9pZCAwJiZhLnNoYXBlcyE9PXZvaWQgMCl7Y29uc3QgYz1hLnNoYXBlcztpZihBcnJheS5pc0FycmF5KGMpKWZvcihsZXQgbD0wLGg9Yy5sZW5ndGg7bDxoO2wrKyl7Y29uc3QgdT1jW2xdO3IodC5zaGFwZXMsdSl9ZWxzZSByKHQuc2hhcGVzLGMpfX1pZih0aGlzLmlzU2tpbm5lZE1lc2gmJihzLmJpbmRNb2RlPXRoaXMuYmluZE1vZGUscy5iaW5kTWF0cml4PXRoaXMuYmluZE1hdHJpeC50b0FycmF5KCksdGhpcy5za2VsZXRvbiE9PXZvaWQgMCYmKHIodC5za2VsZXRvbnMsdGhpcy5za2VsZXRvbikscy5za2VsZXRvbj10aGlzLnNrZWxldG9uLnV1aWQpKSx0aGlzLm1hdGVyaWFsIT09dm9pZCAwKWlmKEFycmF5LmlzQXJyYXkodGhpcy5tYXRlcmlhbCkpe2NvbnN0IGE9W107Zm9yKGxldCBjPTAsbD10aGlzLm1hdGVyaWFsLmxlbmd0aDtjPGw7YysrKWEucHVzaChyKHQubWF0ZXJpYWxzLHRoaXMubWF0ZXJpYWxbY10pKTtzLm1hdGVyaWFsPWF9ZWxzZSBzLm1hdGVyaWFsPXIodC5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbCk7aWYodGhpcy5jaGlsZHJlbi5sZW5ndGg+MCl7cy5jaGlsZHJlbj1bXTtmb3IobGV0IGE9MDthPHRoaXMuY2hpbGRyZW4ubGVuZ3RoO2ErKylzLmNoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlblthXS50b0pTT04odCkub2JqZWN0KX1pZih0aGlzLmFuaW1hdGlvbnMubGVuZ3RoPjApe3MuYW5pbWF0aW9ucz1bXTtmb3IobGV0IGE9MDthPHRoaXMuYW5pbWF0aW9ucy5sZW5ndGg7YSsrKXtjb25zdCBjPXRoaXMuYW5pbWF0aW9uc1thXTtzLmFuaW1hdGlvbnMucHVzaChyKHQuYW5pbWF0aW9ucyxjKSl9fWlmKGUpe2NvbnN0IGE9byh0Lmdlb21ldHJpZXMpLGM9byh0Lm1hdGVyaWFscyksbD1vKHQudGV4dHVyZXMpLGg9byh0LmltYWdlcyksdT1vKHQuc2hhcGVzKSxmPW8odC5za2VsZXRvbnMpLGQ9byh0LmFuaW1hdGlvbnMpLHA9byh0Lm5vZGVzKTthLmxlbmd0aD4wJiYobi5nZW9tZXRyaWVzPWEpLGMubGVuZ3RoPjAmJihuLm1hdGVyaWFscz1jKSxsLmxlbmd0aD4wJiYobi50ZXh0dXJlcz1sKSxoLmxlbmd0aD4wJiYobi5pbWFnZXM9aCksdS5sZW5ndGg+MCYmKG4uc2hhcGVzPXUpLGYubGVuZ3RoPjAmJihuLnNrZWxldG9ucz1mKSxkLmxlbmd0aD4wJiYobi5hbmltYXRpb25zPWQpLHAubGVuZ3RoPjAmJihuLm5vZGVzPXApfXJldHVybiBuLm9iamVjdD1zLG47ZnVuY3Rpb24gbyhhKXtjb25zdCBjPVtdO2Zvcihjb25zdCBsIGluIGEpe2NvbnN0IGg9YVtsXTtkZWxldGUgaC5tZXRhZGF0YSxjLnB1c2goaCl9cmV0dXJuIGN9fWNsb25lKHQpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyx0KX1jb3B5KHQsZT0hMCl7aWYodGhpcy5uYW1lPXQubmFtZSx0aGlzLnVwLmNvcHkodC51cCksdGhpcy5wb3NpdGlvbi5jb3B5KHQucG9zaXRpb24pLHRoaXMucm90YXRpb24ub3JkZXI9dC5yb3RhdGlvbi5vcmRlcix0aGlzLnF1YXRlcm5pb24uY29weSh0LnF1YXRlcm5pb24pLHRoaXMuc2NhbGUuY29weSh0LnNjYWxlKSx0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSx0aGlzLm1hdHJpeFdvcmxkLmNvcHkodC5tYXRyaXhXb3JsZCksdGhpcy5tYXRyaXhBdXRvVXBkYXRlPXQubWF0cml4QXV0b1VwZGF0ZSx0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT10Lm1hdHJpeFdvcmxkQXV0b1VwZGF0ZSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9dC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlLHRoaXMubGF5ZXJzLm1hc2s9dC5sYXllcnMubWFzayx0aGlzLnZpc2libGU9dC52aXNpYmxlLHRoaXMuY2FzdFNoYWRvdz10LmNhc3RTaGFkb3csdGhpcy5yZWNlaXZlU2hhZG93PXQucmVjZWl2ZVNoYWRvdyx0aGlzLmZydXN0dW1DdWxsZWQ9dC5mcnVzdHVtQ3VsbGVkLHRoaXMucmVuZGVyT3JkZXI9dC5yZW5kZXJPcmRlcix0aGlzLmFuaW1hdGlvbnM9dC5hbmltYXRpb25zLnNsaWNlKCksdGhpcy51c2VyRGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHQudXNlckRhdGEpKSxlPT09ITApZm9yKGxldCBuPTA7bjx0LmNoaWxkcmVuLmxlbmd0aDtuKyspe2NvbnN0IHM9dC5jaGlsZHJlbltuXTt0aGlzLmFkZChzLmNsb25lKCkpfXJldHVybiB0aGlzfX1JZS5ERUZBVUxUX1VQPW5ldyBQKDAsMSwwKSxJZS5ERUZBVUxUX01BVFJJWF9BVVRPX1VQREFURT0hMCxJZS5ERUZBVUxUX01BVFJJWF9XT1JMRF9BVVRPX1VQREFURT0hMDtjb25zdCBtZT1uZXcgUCxrZT1uZXcgUCxfbz1uZXcgUCxOZT1uZXcgUCxZbj1uZXcgUCxqbj1uZXcgUCxLYz1uZXcgUCx6bz1uZXcgUCxUbz1uZXcgUCxQbz1uZXcgUCxDbz1uZXcgaWUsRW89bmV3IGllLEJvPW5ldyBpZTtjbGFzcyBldHtjb25zdHJ1Y3Rvcih0PW5ldyBQLGU9bmV3IFAsbj1uZXcgUCl7dGhpcy5hPXQsdGhpcy5iPWUsdGhpcy5jPW59c3RhdGljIGdldE5vcm1hbCh0LGUsbixzKXtzLnN1YlZlY3RvcnMobixlKSxtZS5zdWJWZWN0b3JzKHQsZSkscy5jcm9zcyhtZSk7Y29uc3Qgcj1zLmxlbmd0aFNxKCk7cmV0dXJuIHI+MD9zLm11bHRpcGx5U2NhbGFyKDEvTWF0aC5zcXJ0KHIpKTpzLnNldCgwLDAsMCl9c3RhdGljIGdldEJhcnljb29yZCh0LGUsbixzLHIpe21lLnN1YlZlY3RvcnMocyxlKSxrZS5zdWJWZWN0b3JzKG4sZSksX28uc3ViVmVjdG9ycyh0LGUpO2NvbnN0IG89bWUuZG90KG1lKSxhPW1lLmRvdChrZSksYz1tZS5kb3QoX28pLGw9a2UuZG90KGtlKSxoPWtlLmRvdChfbyksdT1vKmwtYSphO2lmKHU9PT0wKXJldHVybiByLnNldCgwLDAsMCksbnVsbDtjb25zdCBmPTEvdSxkPShsKmMtYSpoKSpmLHA9KG8qaC1hKmMpKmY7cmV0dXJuIHIuc2V0KDEtZC1wLHAsZCl9c3RhdGljIGNvbnRhaW5zUG9pbnQodCxlLG4scyl7cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKHQsZSxuLHMsTmUpPT09bnVsbD8hMTpOZS54Pj0wJiZOZS55Pj0wJiZOZS54K05lLnk8PTF9c3RhdGljIGdldEludGVycG9sYXRpb24odCxlLG4scyxyLG8sYSxjKXtyZXR1cm4gdGhpcy5nZXRCYXJ5Y29vcmQodCxlLG4scyxOZSk9PT1udWxsPyhjLng9MCxjLnk9MCwieiJpbiBjJiYoYy56PTApLCJ3ImluIGMmJihjLnc9MCksbnVsbCk6KGMuc2V0U2NhbGFyKDApLGMuYWRkU2NhbGVkVmVjdG9yKHIsTmUueCksYy5hZGRTY2FsZWRWZWN0b3IobyxOZS55KSxjLmFkZFNjYWxlZFZlY3RvcihhLE5lLnopLGMpfXN0YXRpYyBnZXRJbnRlcnBvbGF0ZWRBdHRyaWJ1dGUodCxlLG4scyxyLG8pe3JldHVybiBDby5zZXRTY2FsYXIoMCksRW8uc2V0U2NhbGFyKDApLEJvLnNldFNjYWxhcigwKSxDby5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSksRW8uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LG4pLEJvLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxzKSxvLnNldFNjYWxhcigwKSxvLmFkZFNjYWxlZFZlY3RvcihDbyxyLngpLG8uYWRkU2NhbGVkVmVjdG9yKEVvLHIueSksby5hZGRTY2FsZWRWZWN0b3IoQm8sci56KSxvfXN0YXRpYyBpc0Zyb250RmFjaW5nKHQsZSxuLHMpe3JldHVybiBtZS5zdWJWZWN0b3JzKG4sZSksa2Uuc3ViVmVjdG9ycyh0LGUpLG1lLmNyb3NzKGtlKS5kb3Qocyk8MH1zZXQodCxlLG4pe3JldHVybiB0aGlzLmEuY29weSh0KSx0aGlzLmIuY29weShlKSx0aGlzLmMuY29weShuKSx0aGlzfXNldEZyb21Qb2ludHNBbmRJbmRpY2VzKHQsZSxuLHMpe3JldHVybiB0aGlzLmEuY29weSh0W2VdKSx0aGlzLmIuY29weSh0W25dKSx0aGlzLmMuY29weSh0W3NdKSx0aGlzfXNldEZyb21BdHRyaWJ1dGVBbmRJbmRpY2VzKHQsZSxuLHMpe3JldHVybiB0aGlzLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpLHRoaXMuYi5mcm9tQnVmZmVyQXR0cmlidXRlKHQsbiksdGhpcy5jLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxzKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLmEuY29weSh0LmEpLHRoaXMuYi5jb3B5KHQuYiksdGhpcy5jLmNvcHkodC5jKSx0aGlzfWdldEFyZWEoKXtyZXR1cm4gbWUuc3ViVmVjdG9ycyh0aGlzLmMsdGhpcy5iKSxrZS5zdWJWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLG1lLmNyb3NzKGtlKS5sZW5ndGgoKSouNX1nZXRNaWRwb2ludCh0KXtyZXR1cm4gdC5hZGRWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLmFkZCh0aGlzLmMpLm11bHRpcGx5U2NhbGFyKDEvMyl9Z2V0Tm9ybWFsKHQpe3JldHVybiBldC5nZXROb3JtYWwodGhpcy5hLHRoaXMuYix0aGlzLmMsdCl9Z2V0UGxhbmUodCl7cmV0dXJuIHQuc2V0RnJvbUNvcGxhbmFyUG9pbnRzKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX1nZXRCYXJ5Y29vcmQodCxlKXtyZXR1cm4gZXQuZ2V0QmFyeWNvb3JkKHQsdGhpcy5hLHRoaXMuYix0aGlzLmMsZSl9Z2V0SW50ZXJwb2xhdGlvbih0LGUsbixzLHIpe3JldHVybiBldC5nZXRJbnRlcnBvbGF0aW9uKHQsdGhpcy5hLHRoaXMuYix0aGlzLmMsZSxuLHMscil9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gZXQuY29udGFpbnNQb2ludCh0LHRoaXMuYSx0aGlzLmIsdGhpcy5jKX1pc0Zyb250RmFjaW5nKHQpe3JldHVybiBldC5pc0Zyb250RmFjaW5nKHRoaXMuYSx0aGlzLmIsdGhpcy5jLHQpfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQuaW50ZXJzZWN0c1RyaWFuZ2xlKHRoaXMpfWNsb3Nlc3RQb2ludFRvUG9pbnQodCxlKXtjb25zdCBuPXRoaXMuYSxzPXRoaXMuYixyPXRoaXMuYztsZXQgbyxhO1luLnN1YlZlY3RvcnMocyxuKSxqbi5zdWJWZWN0b3JzKHIsbiksem8uc3ViVmVjdG9ycyh0LG4pO2NvbnN0IGM9WW4uZG90KHpvKSxsPWpuLmRvdCh6byk7aWYoYzw9MCYmbDw9MClyZXR1cm4gZS5jb3B5KG4pO1RvLnN1YlZlY3RvcnModCxzKTtjb25zdCBoPVluLmRvdChUbyksdT1qbi5kb3QoVG8pO2lmKGg+PTAmJnU8PWgpcmV0dXJuIGUuY29weShzKTtjb25zdCBmPWMqdS1oKmw7aWYoZjw9MCYmYz49MCYmaDw9MClyZXR1cm4gbz1jLyhjLWgpLGUuY29weShuKS5hZGRTY2FsZWRWZWN0b3IoWW4sbyk7UG8uc3ViVmVjdG9ycyh0LHIpO2NvbnN0IGQ9WW4uZG90KFBvKSxwPWpuLmRvdChQbyk7aWYocD49MCYmZDw9cClyZXR1cm4gZS5jb3B5KHIpO2NvbnN0IHk9ZCpsLWMqcDtpZih5PD0wJiZsPj0wJiZwPD0wKXJldHVybiBhPWwvKGwtcCksZS5jb3B5KG4pLmFkZFNjYWxlZFZlY3RvcihqbixhKTtjb25zdCBnPWgqcC1kKnU7aWYoZzw9MCYmdS1oPj0wJiZkLXA+PTApcmV0dXJuIEtjLnN1YlZlY3RvcnMocixzKSxhPSh1LWgpLyh1LWgrKGQtcCkpLGUuY29weShzKS5hZGRTY2FsZWRWZWN0b3IoS2MsYSk7Y29uc3Qgdz0xLyhnK3krZik7cmV0dXJuIG89eSp3LGE9Zip3LGUuY29weShuKS5hZGRTY2FsZWRWZWN0b3IoWW4sbykuYWRkU2NhbGVkVmVjdG9yKGpuLGEpfWVxdWFscyh0KXtyZXR1cm4gdC5hLmVxdWFscyh0aGlzLmEpJiZ0LmIuZXF1YWxzKHRoaXMuYikmJnQuYy5lcXVhbHModGhpcy5jKX19Y29uc3QgdGw9e2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LGRhcmtzbGF0ZWdyZXk6MzEwMDQ5NSxkYXJrdHVycXVvaXNlOjUyOTQ1LGRhcmt2aW9sZXQ6OTY5OTUzOSxkZWVwcGluazoxNjcxNjk0NyxkZWVwc2t5Ymx1ZTo0OTE1MSxkaW1ncmF5OjY5MDgyNjUsZGltZ3JleTo2OTA4MjY1LGRvZGdlcmJsdWU6MjAwMzE5OSxmaXJlYnJpY2s6MTE2NzQxNDYsZmxvcmFsd2hpdGU6MTY3NzU5MjAsZm9yZXN0Z3JlZW46MjI2Mzg0MixmdWNoc2lhOjE2NzExOTM1LGdhaW5zYm9ybzoxNDQ3NDQ2MCxnaG9zdHdoaXRlOjE2MzE2NjcxLGdvbGQ6MTY3NjY3MjAsZ29sZGVucm9kOjE0MzI5MTIwLGdyYXk6ODQyMTUwNCxncmVlbjozMjc2OCxncmVlbnllbGxvdzoxMTQwMzA1NSxncmV5Ojg0MjE1MDQsaG9uZXlkZXc6MTU3OTQxNjAsaG90cGluazoxNjczODc0MCxpbmRpYW5yZWQ6MTM0NTg1MjQsaW5kaWdvOjQ5MTUzMzAsaXZvcnk6MTY3NzcyMDAsa2hha2k6MTU3ODc2NjAsbGF2ZW5kZXI6MTUxMzI0MTAsbGF2ZW5kZXJibHVzaDoxNjc3MzM2NSxsYXduZ3JlZW46ODE5MDk3NixsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LHJlYmVjY2FwdXJwbGU6NjY5Nzg4MSxyZWQ6MTY3MTE2ODAscm9zeWJyb3duOjEyMzU3NTE5LHJveWFsYmx1ZTo0Mjg2OTQ1LHNhZGRsZWJyb3duOjkxMjcxODcsc2FsbW9uOjE2NDE2ODgyLHNhbmR5YnJvd246MTYwMzI4NjQsc2VhZ3JlZW46MzA1MDMyNyxzZWFzaGVsbDoxNjc3NDYzOCxzaWVubmE6MTA1MDY3OTcsc2lsdmVyOjEyNjMyMjU2LHNreWJsdWU6ODkwMDMzMSxzbGF0ZWJsdWU6Njk3MDA2MSxzbGF0ZWdyYXk6NzM3Mjk0NCxzbGF0ZWdyZXk6NzM3Mjk0NCxzbm93OjE2Nzc1OTMwLHNwcmluZ2dyZWVuOjY1NDA3LHN0ZWVsYmx1ZTo0NjIwOTgwLHRhbjoxMzgwODc4MCx0ZWFsOjMyODk2LHRoaXN0bGU6MTQyMDQ4ODgsdG9tYXRvOjE2NzM3MDk1LHR1cnF1b2lzZTo0MjUxODU2LHZpb2xldDoxNTYzMTA4Nix3aGVhdDoxNjExMzMzMSx3aGl0ZToxNjc3NzIxNSx3aGl0ZXNtb2tlOjE2MTE5Mjg1LHllbGxvdzoxNjc3Njk2MCx5ZWxsb3dncmVlbjoxMDE0NTA3NH0scm49e2g6MCxzOjAsbDowfSxfcz17aDowLHM6MCxsOjB9O2Z1bmN0aW9uIEZvKGksdCxlKXtyZXR1cm4gZTwwJiYoZSs9MSksZT4xJiYoZS09MSksZTwxLzY/aSsodC1pKSo2KmU6ZTwxLzI/dDplPDIvMz9pKyh0LWkpKjYqKDIvMy1lKTppfWxldCB6cz1jbGFzc3tjb25zdHJ1Y3Rvcih0LGUsbil7cmV0dXJuIHRoaXMuaXNDb2xvcj0hMCx0aGlzLnI9MSx0aGlzLmc9MSx0aGlzLmI9MSx0aGlzLnNldCh0LGUsbil9c2V0KHQsZSxuKXtpZihlPT09dm9pZCAwJiZuPT09dm9pZCAwKXtjb25zdCBzPXQ7cyYmcy5pc0NvbG9yP3RoaXMuY29weShzKTp0eXBlb2Ygcz09Im51bWJlciI/dGhpcy5zZXRIZXgocyk6dHlwZW9mIHM9PSJzdHJpbmciJiZ0aGlzLnNldFN0eWxlKHMpfWVsc2UgdGhpcy5zZXRSR0IodCxlLG4pO3JldHVybiB0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy5yPXQsdGhpcy5nPXQsdGhpcy5iPXQsdGhpc31zZXRIZXgodCxlPWZlKXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLHRoaXMucj0odD4+MTYmMjU1KS8yNTUsdGhpcy5nPSh0Pj44JjI1NSkvMjU1LHRoaXMuYj0odCYyNTUpLzI1NSxkZS5jb2xvclNwYWNlVG9Xb3JraW5nKHRoaXMsZSksdGhpc31zZXRSR0IodCxlLG4scz1kZS53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIHRoaXMucj10LHRoaXMuZz1lLHRoaXMuYj1uLGRlLmNvbG9yU3BhY2VUb1dvcmtpbmcodGhpcyxzKSx0aGlzfXNldEhTTCh0LGUsbixzPWRlLndvcmtpbmdDb2xvclNwYWNlKXtpZih0PWZvKHQsMSksZT1aKGUsMCwxKSxuPVoobiwwLDEpLGU9PT0wKXRoaXMucj10aGlzLmc9dGhpcy5iPW47ZWxzZXtjb25zdCByPW48PS41P24qKDErZSk6bitlLW4qZSxvPTIqbi1yO3RoaXMucj1GbyhvLHIsdCsxLzMpLHRoaXMuZz1GbyhvLHIsdCksdGhpcy5iPUZvKG8scix0LTEvMyl9cmV0dXJuIGRlLmNvbG9yU3BhY2VUb1dvcmtpbmcodGhpcyxzKSx0aGlzfXNldFN0eWxlKHQsZT1mZSl7ZnVuY3Rpb24gbihyKXtyIT09dm9pZCAwJiZwYXJzZUZsb2F0KHIpPDEmJmJ0KCJDb2xvcjogQWxwaGEgY29tcG9uZW50IG9mICIrdCsiIHdpbGwgYmUgaWdub3JlZC4iKX1sZXQgcztpZihzPS9eKFx3KylcKChbXlwpXSopXCkvLmV4ZWModCkpe2xldCByO2NvbnN0IG89c1sxXSxhPXNbMl07c3dpdGNoKG8pe2Nhc2UicmdiIjpjYXNlInJnYmEiOmlmKHI9L15ccyooXGQrKVxzKixccyooXGQrKVxzKixccyooXGQrKVxzKig/OixccyooXGQqXC4/XGQrKVxzKik/JC8uZXhlYyhhKSlyZXR1cm4gbihyWzRdKSx0aGlzLnNldFJHQihNYXRoLm1pbigyNTUscGFyc2VJbnQoclsxXSwxMCkpLzI1NSxNYXRoLm1pbigyNTUscGFyc2VJbnQoclsyXSwxMCkpLzI1NSxNYXRoLm1pbigyNTUscGFyc2VJbnQoclszXSwxMCkpLzI1NSxlKTtpZihyPS9eXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqLFxzKihcZCspXCVccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMoYSkpcmV0dXJuIG4ocls0XSksdGhpcy5zZXRSR0IoTWF0aC5taW4oMTAwLHBhcnNlSW50KHJbMV0sMTApKS8xMDAsTWF0aC5taW4oMTAwLHBhcnNlSW50KHJbMl0sMTApKS8xMDAsTWF0aC5taW4oMTAwLHBhcnNlSW50KHJbM10sMTApKS8xMDAsZSk7YnJlYWs7Y2FzZSJoc2wiOmNhc2UiaHNsYSI6aWYocj0vXlxzKihcZCpcLj9cZCspXHMqLFxzKihcZCpcLj9cZCspXCVccyosXHMqKFxkKlwuP1xkKylcJVxzKig/OixccyooXGQqXC4/XGQrKVxzKik/JC8uZXhlYyhhKSlyZXR1cm4gbihyWzRdKSx0aGlzLnNldEhTTChwYXJzZUZsb2F0KHJbMV0pLzM2MCxwYXJzZUZsb2F0KHJbMl0pLzEwMCxwYXJzZUZsb2F0KHJbM10pLzEwMCxlKTticmVhaztkZWZhdWx0OmJ0KCJDb2xvcjogVW5rbm93biBjb2xvciBtb2RlbCAiK3QpfX1lbHNlIGlmKHM9L15cIyhbQS1GYS1mXGRdKykkLy5leGVjKHQpKXtjb25zdCByPXNbMV0sbz1yLmxlbmd0aDtpZihvPT09MylyZXR1cm4gdGhpcy5zZXRSR0IocGFyc2VJbnQoci5jaGFyQXQoMCksMTYpLzE1LHBhcnNlSW50KHIuY2hhckF0KDEpLDE2KS8xNSxwYXJzZUludChyLmNoYXJBdCgyKSwxNikvMTUsZSk7aWYobz09PTYpcmV0dXJuIHRoaXMuc2V0SGV4KHBhcnNlSW50KHIsMTYpLGUpO2J0KCJDb2xvcjogSW52YWxpZCBoZXggY29sb3IgIit0KX1lbHNlIGlmKHQmJnQubGVuZ3RoPjApcmV0dXJuIHRoaXMuc2V0Q29sb3JOYW1lKHQsZSk7cmV0dXJuIHRoaXN9c2V0Q29sb3JOYW1lKHQsZT1mZSl7Y29uc3Qgbj10bFt0LnRvTG93ZXJDYXNlKCldO3JldHVybiBuIT09dm9pZCAwP3RoaXMuc2V0SGV4KG4sZSk6YnQoIkNvbG9yOiBVbmtub3duIGNvbG9yICIrdCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnIsdGhpcy5nLHRoaXMuYil9Y29weSh0KXtyZXR1cm4gdGhpcy5yPXQucix0aGlzLmc9dC5nLHRoaXMuYj10LmIsdGhpc31jb3B5U1JHQlRvTGluZWFyKHQpe3JldHVybiB0aGlzLnI9Q2UodC5yKSx0aGlzLmc9Q2UodC5nKSx0aGlzLmI9Q2UodC5iKSx0aGlzfWNvcHlMaW5lYXJUb1NSR0IodCl7cmV0dXJuIHRoaXMucj1Vbih0LnIpLHRoaXMuZz1Vbih0LmcpLHRoaXMuYj1Vbih0LmIpLHRoaXN9Y29udmVydFNSR0JUb0xpbmVhcigpe3JldHVybiB0aGlzLmNvcHlTUkdCVG9MaW5lYXIodGhpcyksdGhpc31jb252ZXJ0TGluZWFyVG9TUkdCKCl7cmV0dXJuIHRoaXMuY29weUxpbmVhclRvU1JHQih0aGlzKSx0aGlzfWdldEhleCh0PWZlKXtyZXR1cm4gZGUud29ya2luZ1RvQ29sb3JTcGFjZShDdC5jb3B5KHRoaXMpLHQpLE1hdGgucm91bmQoWihDdC5yKjI1NSwwLDI1NSkpKjY1NTM2K01hdGgucm91bmQoWihDdC5nKjI1NSwwLDI1NSkpKjI1NitNYXRoLnJvdW5kKFooQ3QuYioyNTUsMCwyNTUpKX1nZXRIZXhTdHJpbmcodD1mZSl7cmV0dXJuKCIwMDAwMDAiK3RoaXMuZ2V0SGV4KHQpLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTYpfWdldEhTTCh0LGU9ZGUud29ya2luZ0NvbG9yU3BhY2Upe2RlLndvcmtpbmdUb0NvbG9yU3BhY2UoQ3QuY29weSh0aGlzKSxlKTtjb25zdCBuPUN0LnIscz1DdC5nLHI9Q3QuYixvPU1hdGgubWF4KG4scyxyKSxhPU1hdGgubWluKG4scyxyKTtsZXQgYyxsO2NvbnN0IGg9KGErbykvMjtpZihhPT09byljPTAsbD0wO2Vsc2V7Y29uc3QgdT1vLWE7c3dpdGNoKGw9aDw9LjU/dS8obythKTp1LygyLW8tYSksbyl7Y2FzZSBuOmM9KHMtcikvdSsoczxyPzY6MCk7YnJlYWs7Y2FzZSBzOmM9KHItbikvdSsyO2JyZWFrO2Nhc2UgcjpjPShuLXMpL3UrNDticmVha31jLz02fXJldHVybiB0Lmg9Yyx0LnM9bCx0Lmw9aCx0fWdldFJHQih0LGU9ZGUud29ya2luZ0NvbG9yU3BhY2Upe3JldHVybiBkZS53b3JraW5nVG9Db2xvclNwYWNlKEN0LmNvcHkodGhpcyksZSksdC5yPUN0LnIsdC5nPUN0LmcsdC5iPUN0LmIsdH1nZXRTdHlsZSh0PWZlKXtkZS53b3JraW5nVG9Db2xvclNwYWNlKEN0LmNvcHkodGhpcyksdCk7Y29uc3QgZT1DdC5yLG49Q3QuZyxzPUN0LmI7cmV0dXJuIHQhPT1mZT9gY29sb3IoJHt0fSAke2UudG9GaXhlZCgzKX0gJHtuLnRvRml4ZWQoMyl9ICR7cy50b0ZpeGVkKDMpfSlgOmByZ2IoJHtNYXRoLnJvdW5kKGUqMjU1KX0sJHtNYXRoLnJvdW5kKG4qMjU1KX0sJHtNYXRoLnJvdW5kKHMqMjU1KX0pYH1vZmZzZXRIU0wodCxlLG4pe3JldHVybiB0aGlzLmdldEhTTChybiksdGhpcy5zZXRIU0wocm4uaCt0LHJuLnMrZSxybi5sK24pfWFkZCh0KXtyZXR1cm4gdGhpcy5yKz10LnIsdGhpcy5nKz10LmcsdGhpcy5iKz10LmIsdGhpc31hZGRDb2xvcnModCxlKXtyZXR1cm4gdGhpcy5yPXQucitlLnIsdGhpcy5nPXQuZytlLmcsdGhpcy5iPXQuYitlLmIsdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMucis9dCx0aGlzLmcrPXQsdGhpcy5iKz10LHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLnI9TWF0aC5tYXgoMCx0aGlzLnItdC5yKSx0aGlzLmc9TWF0aC5tYXgoMCx0aGlzLmctdC5nKSx0aGlzLmI9TWF0aC5tYXgoMCx0aGlzLmItdC5iKSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLnIqPXQucix0aGlzLmcqPXQuZyx0aGlzLmIqPXQuYix0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLnIqPXQsdGhpcy5nKj10LHRoaXMuYio9dCx0aGlzfWxlcnAodCxlKXtyZXR1cm4gdGhpcy5yKz0odC5yLXRoaXMucikqZSx0aGlzLmcrPSh0LmctdGhpcy5nKSplLHRoaXMuYis9KHQuYi10aGlzLmIpKmUsdGhpc31sZXJwQ29sb3JzKHQsZSxuKXtyZXR1cm4gdGhpcy5yPXQucisoZS5yLXQucikqbix0aGlzLmc9dC5nKyhlLmctdC5nKSpuLHRoaXMuYj10LmIrKGUuYi10LmIpKm4sdGhpc31sZXJwSFNMKHQsZSl7dGhpcy5nZXRIU0wocm4pLHQuZ2V0SFNMKF9zKTtjb25zdCBuPVRpKHJuLmgsX3MuaCxlKSxzPVRpKHJuLnMsX3MucyxlKSxyPVRpKHJuLmwsX3MubCxlKTtyZXR1cm4gdGhpcy5zZXRIU0wobixzLHIpLHRoaXN9c2V0RnJvbVZlY3RvcjModCl7cmV0dXJuIHRoaXMucj10LngsdGhpcy5nPXQueSx0aGlzLmI9dC56LHRoaXN9YXBwbHlNYXRyaXgzKHQpe2NvbnN0IGU9dGhpcy5yLG49dGhpcy5nLHM9dGhpcy5iLHI9dC5lbGVtZW50cztyZXR1cm4gdGhpcy5yPXJbMF0qZStyWzNdKm4rcls2XSpzLHRoaXMuZz1yWzFdKmUrcls0XSpuK3JbN10qcyx0aGlzLmI9clsyXSplK3JbNV0qbityWzhdKnMsdGhpc31lcXVhbHModCl7cmV0dXJuIHQucj09PXRoaXMuciYmdC5nPT09dGhpcy5nJiZ0LmI9PT10aGlzLmJ9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy5yPXRbZV0sdGhpcy5nPXRbZSsxXSx0aGlzLmI9dFtlKzJdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy5yLHRbZSsxXT10aGlzLmcsdFtlKzJdPXRoaXMuYix0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy5yPXQuZ2V0WChlKSx0aGlzLmc9dC5nZXRZKGUpLHRoaXMuYj10LmdldFooZSksdGhpc310b0pTT04oKXtyZXR1cm4gdGhpcy5nZXRIZXgoKX0qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLnIseWllbGQgdGhpcy5nLHlpZWxkIHRoaXMuYn19O2NvbnN0IEN0PW5ldyB6czt6cy5OQU1FUz10bDtsZXQgWWY9MDtjbGFzcyBqZiBleHRlbmRzIGdze2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzTWF0ZXJpYWw9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6WWYrK30pLHRoaXMudXVpZD1tbigpLHRoaXMubmFtZT0iIix0aGlzLnR5cGU9Ik1hdGVyaWFsIix0aGlzLmJsZW5kaW5nPTEsdGhpcy5zaWRlPTAsdGhpcy52ZXJ0ZXhDb2xvcnM9ITEsdGhpcy5vcGFjaXR5PTEsdGhpcy50cmFuc3BhcmVudD0hMSx0aGlzLmFscGhhSGFzaD0hMSx0aGlzLmJsZW5kU3JjPTIwNCx0aGlzLmJsZW5kRHN0PTIwNSx0aGlzLmJsZW5kRXF1YXRpb249MTAwLHRoaXMuYmxlbmRTcmNBbHBoYT1udWxsLHRoaXMuYmxlbmREc3RBbHBoYT1udWxsLHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhPW51bGwsdGhpcy5ibGVuZENvbG9yPW5ldyB6cygwLDAsMCksdGhpcy5ibGVuZEFscGhhPTAsdGhpcy5kZXB0aEZ1bmM9Myx0aGlzLmRlcHRoVGVzdD0hMCx0aGlzLmRlcHRoV3JpdGU9ITAsdGhpcy5zdGVuY2lsV3JpdGVNYXNrPTI1NSx0aGlzLnN0ZW5jaWxGdW5jPTUxOSx0aGlzLnN0ZW5jaWxSZWY9MCx0aGlzLnN0ZW5jaWxGdW5jTWFzaz0yNTUsdGhpcy5zdGVuY2lsRmFpbD03NjgwLHRoaXMuc3RlbmNpbFpGYWlsPTc2ODAsdGhpcy5zdGVuY2lsWlBhc3M9NzY4MCx0aGlzLnN0ZW5jaWxXcml0ZT0hMSx0aGlzLmNsaXBwaW5nUGxhbmVzPW51bGwsdGhpcy5jbGlwSW50ZXJzZWN0aW9uPSExLHRoaXMuY2xpcFNoYWRvd3M9ITEsdGhpcy5zaGFkb3dTaWRlPW51bGwsdGhpcy5jb2xvcldyaXRlPSEwLHRoaXMucHJlY2lzaW9uPW51bGwsdGhpcy5wb2x5Z29uT2Zmc2V0PSExLHRoaXMucG9seWdvbk9mZnNldEZhY3Rvcj0wLHRoaXMucG9seWdvbk9mZnNldFVuaXRzPTAsdGhpcy5kaXRoZXJpbmc9ITEsdGhpcy5hbHBoYVRvQ292ZXJhZ2U9ITEsdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE9ITEsdGhpcy5mb3JjZVNpbmdsZVBhc3M9ITEsdGhpcy5hbGxvd092ZXJyaWRlPSEwLHRoaXMudmlzaWJsZT0hMCx0aGlzLnRvbmVNYXBwZWQ9ITAsdGhpcy51c2VyRGF0YT17fSx0aGlzLnZlcnNpb249MCx0aGlzLl9hbHBoYVRlc3Q9MH1nZXQgYWxwaGFUZXN0KCl7cmV0dXJuIHRoaXMuX2FscGhhVGVzdH1zZXQgYWxwaGFUZXN0KHQpe3RoaXMuX2FscGhhVGVzdD4wIT10PjAmJnRoaXMudmVyc2lvbisrLHRoaXMuX2FscGhhVGVzdD10fW9uQmVmb3JlUmVuZGVyKCl7fW9uQmVmb3JlQ29tcGlsZSgpe31jdXN0b21Qcm9ncmFtQ2FjaGVLZXkoKXtyZXR1cm4gdGhpcy5vbkJlZm9yZUNvbXBpbGUudG9TdHJpbmcoKX1zZXRWYWx1ZXModCl7aWYodCE9PXZvaWQgMClmb3IoY29uc3QgZSBpbiB0KXtjb25zdCBuPXRbZV07aWYobj09PXZvaWQgMCl7YnQoYE1hdGVyaWFsOiBwYXJhbWV0ZXIgJyR7ZX0nIGhhcyB2YWx1ZSBvZiB1bmRlZmluZWQuYCk7Y29udGludWV9Y29uc3Qgcz10aGlzW2VdO2lmKHM9PT12b2lkIDApe2J0KGBNYXRlcmlhbDogJyR7ZX0nIGlzIG5vdCBhIHByb3BlcnR5IG9mIFRIUkVFLiR7dGhpcy50eXBlfS5gKTtjb250aW51ZX1zJiZzLmlzQ29sb3I/cy5zZXQobik6cyYmcy5pc1ZlY3RvcjMmJm4mJm4uaXNWZWN0b3IzP3MuY29weShuKTp0aGlzW2VdPW59fXRvSlNPTih0KXtjb25zdCBlPXQ9PT12b2lkIDB8fHR5cGVvZiB0PT0ic3RyaW5nIjtlJiYodD17dGV4dHVyZXM6e30saW1hZ2VzOnt9fSk7Y29uc3Qgbj17bWV0YWRhdGE6e3ZlcnNpb246NC43LHR5cGU6Ik1hdGVyaWFsIixnZW5lcmF0b3I6Ik1hdGVyaWFsLnRvSlNPTiJ9fTtuLnV1aWQ9dGhpcy51dWlkLG4udHlwZT10aGlzLnR5cGUsdGhpcy5uYW1lIT09IiImJihuLm5hbWU9dGhpcy5uYW1lKSx0aGlzLmNvbG9yJiZ0aGlzLmNvbG9yLmlzQ29sb3ImJihuLmNvbG9yPXRoaXMuY29sb3IuZ2V0SGV4KCkpLHRoaXMucm91Z2huZXNzIT09dm9pZCAwJiYobi5yb3VnaG5lc3M9dGhpcy5yb3VnaG5lc3MpLHRoaXMubWV0YWxuZXNzIT09dm9pZCAwJiYobi5tZXRhbG5lc3M9dGhpcy5tZXRhbG5lc3MpLHRoaXMuc2hlZW4hPT12b2lkIDAmJihuLnNoZWVuPXRoaXMuc2hlZW4pLHRoaXMuc2hlZW5Db2xvciYmdGhpcy5zaGVlbkNvbG9yLmlzQ29sb3ImJihuLnNoZWVuQ29sb3I9dGhpcy5zaGVlbkNvbG9yLmdldEhleCgpKSx0aGlzLnNoZWVuUm91Z2huZXNzIT09dm9pZCAwJiYobi5zaGVlblJvdWdobmVzcz10aGlzLnNoZWVuUm91Z2huZXNzKSx0aGlzLmVtaXNzaXZlJiZ0aGlzLmVtaXNzaXZlLmlzQ29sb3ImJihuLmVtaXNzaXZlPXRoaXMuZW1pc3NpdmUuZ2V0SGV4KCkpLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkhPT12b2lkIDAmJnRoaXMuZW1pc3NpdmVJbnRlbnNpdHkhPT0xJiYobi5lbWlzc2l2ZUludGVuc2l0eT10aGlzLmVtaXNzaXZlSW50ZW5zaXR5KSx0aGlzLnNwZWN1bGFyJiZ0aGlzLnNwZWN1bGFyLmlzQ29sb3ImJihuLnNwZWN1bGFyPXRoaXMuc3BlY3VsYXIuZ2V0SGV4KCkpLHRoaXMuc3BlY3VsYXJJbnRlbnNpdHkhPT12b2lkIDAmJihuLnNwZWN1bGFySW50ZW5zaXR5PXRoaXMuc3BlY3VsYXJJbnRlbnNpdHkpLHRoaXMuc3BlY3VsYXJDb2xvciYmdGhpcy5zcGVjdWxhckNvbG9yLmlzQ29sb3ImJihuLnNwZWN1bGFyQ29sb3I9dGhpcy5zcGVjdWxhckNvbG9yLmdldEhleCgpKSx0aGlzLnNoaW5pbmVzcyE9PXZvaWQgMCYmKG4uc2hpbmluZXNzPXRoaXMuc2hpbmluZXNzKSx0aGlzLmNsZWFyY29hdCE9PXZvaWQgMCYmKG4uY2xlYXJjb2F0PXRoaXMuY2xlYXJjb2F0KSx0aGlzLmNsZWFyY29hdFJvdWdobmVzcyE9PXZvaWQgMCYmKG4uY2xlYXJjb2F0Um91Z2huZXNzPXRoaXMuY2xlYXJjb2F0Um91Z2huZXNzKSx0aGlzLmNsZWFyY29hdE1hcCYmdGhpcy5jbGVhcmNvYXRNYXAuaXNUZXh0dXJlJiYobi5jbGVhcmNvYXRNYXA9dGhpcy5jbGVhcmNvYXRNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwJiZ0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcC5pc1RleHR1cmUmJihuLmNsZWFyY29hdFJvdWdobmVzc01hcD10aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcC50b0pTT04odCkudXVpZCksdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAmJnRoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwLmlzVGV4dHVyZSYmKG4uY2xlYXJjb2F0Tm9ybWFsTWFwPXRoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwLnRvSlNPTih0KS51dWlkLG4uY2xlYXJjb2F0Tm9ybWFsU2NhbGU9dGhpcy5jbGVhcmNvYXROb3JtYWxTY2FsZS50b0FycmF5KCkpLHRoaXMuc2hlZW5Db2xvck1hcCYmdGhpcy5zaGVlbkNvbG9yTWFwLmlzVGV4dHVyZSYmKG4uc2hlZW5Db2xvck1hcD10aGlzLnNoZWVuQ29sb3JNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuc2hlZW5Sb3VnaG5lc3NNYXAmJnRoaXMuc2hlZW5Sb3VnaG5lc3NNYXAuaXNUZXh0dXJlJiYobi5zaGVlblJvdWdobmVzc01hcD10aGlzLnNoZWVuUm91Z2huZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmRpc3BlcnNpb24hPT12b2lkIDAmJihuLmRpc3BlcnNpb249dGhpcy5kaXNwZXJzaW9uKSx0aGlzLmlyaWRlc2NlbmNlIT09dm9pZCAwJiYobi5pcmlkZXNjZW5jZT10aGlzLmlyaWRlc2NlbmNlKSx0aGlzLmlyaWRlc2NlbmNlSU9SIT09dm9pZCAwJiYobi5pcmlkZXNjZW5jZUlPUj10aGlzLmlyaWRlc2NlbmNlSU9SKSx0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2UhPT12b2lkIDAmJihuLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2U9dGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlKSx0aGlzLmlyaWRlc2NlbmNlTWFwJiZ0aGlzLmlyaWRlc2NlbmNlTWFwLmlzVGV4dHVyZSYmKG4uaXJpZGVzY2VuY2VNYXA9dGhpcy5pcmlkZXNjZW5jZU1hcC50b0pTT04odCkudXVpZCksdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCYmdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcC5pc1RleHR1cmUmJihuLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwPXRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuYW5pc290cm9weSE9PXZvaWQgMCYmKG4uYW5pc290cm9weT10aGlzLmFuaXNvdHJvcHkpLHRoaXMuYW5pc290cm9weVJvdGF0aW9uIT09dm9pZCAwJiYobi5hbmlzb3Ryb3B5Um90YXRpb249dGhpcy5hbmlzb3Ryb3B5Um90YXRpb24pLHRoaXMuYW5pc290cm9weU1hcCYmdGhpcy5hbmlzb3Ryb3B5TWFwLmlzVGV4dHVyZSYmKG4uYW5pc290cm9weU1hcD10aGlzLmFuaXNvdHJvcHlNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubWFwJiZ0aGlzLm1hcC5pc1RleHR1cmUmJihuLm1hcD10aGlzLm1hcC50b0pTT04odCkudXVpZCksdGhpcy5tYXRjYXAmJnRoaXMubWF0Y2FwLmlzVGV4dHVyZSYmKG4ubWF0Y2FwPXRoaXMubWF0Y2FwLnRvSlNPTih0KS51dWlkKSx0aGlzLmFscGhhTWFwJiZ0aGlzLmFscGhhTWFwLmlzVGV4dHVyZSYmKG4uYWxwaGFNYXA9dGhpcy5hbHBoYU1hcC50b0pTT04odCkudXVpZCksdGhpcy5saWdodE1hcCYmdGhpcy5saWdodE1hcC5pc1RleHR1cmUmJihuLmxpZ2h0TWFwPXRoaXMubGlnaHRNYXAudG9KU09OKHQpLnV1aWQsbi5saWdodE1hcEludGVuc2l0eT10aGlzLmxpZ2h0TWFwSW50ZW5zaXR5KSx0aGlzLmFvTWFwJiZ0aGlzLmFvTWFwLmlzVGV4dHVyZSYmKG4uYW9NYXA9dGhpcy5hb01hcC50b0pTT04odCkudXVpZCxuLmFvTWFwSW50ZW5zaXR5PXRoaXMuYW9NYXBJbnRlbnNpdHkpLHRoaXMuYnVtcE1hcCYmdGhpcy5idW1wTWFwLmlzVGV4dHVyZSYmKG4uYnVtcE1hcD10aGlzLmJ1bXBNYXAudG9KU09OKHQpLnV1aWQsbi5idW1wU2NhbGU9dGhpcy5idW1wU2NhbGUpLHRoaXMubm9ybWFsTWFwJiZ0aGlzLm5vcm1hbE1hcC5pc1RleHR1cmUmJihuLm5vcm1hbE1hcD10aGlzLm5vcm1hbE1hcC50b0pTT04odCkudXVpZCxuLm5vcm1hbE1hcFR5cGU9dGhpcy5ub3JtYWxNYXBUeXBlLG4ubm9ybWFsU2NhbGU9dGhpcy5ub3JtYWxTY2FsZS50b0FycmF5KCkpLHRoaXMuZGlzcGxhY2VtZW50TWFwJiZ0aGlzLmRpc3BsYWNlbWVudE1hcC5pc1RleHR1cmUmJihuLmRpc3BsYWNlbWVudE1hcD10aGlzLmRpc3BsYWNlbWVudE1hcC50b0pTT04odCkudXVpZCxuLmRpc3BsYWNlbWVudFNjYWxlPXRoaXMuZGlzcGxhY2VtZW50U2NhbGUsbi5kaXNwbGFjZW1lbnRCaWFzPXRoaXMuZGlzcGxhY2VtZW50QmlhcyksdGhpcy5yb3VnaG5lc3NNYXAmJnRoaXMucm91Z2huZXNzTWFwLmlzVGV4dHVyZSYmKG4ucm91Z2huZXNzTWFwPXRoaXMucm91Z2huZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLm1ldGFsbmVzc01hcCYmdGhpcy5tZXRhbG5lc3NNYXAuaXNUZXh0dXJlJiYobi5tZXRhbG5lc3NNYXA9dGhpcy5tZXRhbG5lc3NNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuZW1pc3NpdmVNYXAmJnRoaXMuZW1pc3NpdmVNYXAuaXNUZXh0dXJlJiYobi5lbWlzc2l2ZU1hcD10aGlzLmVtaXNzaXZlTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnNwZWN1bGFyTWFwJiZ0aGlzLnNwZWN1bGFyTWFwLmlzVGV4dHVyZSYmKG4uc3BlY3VsYXJNYXA9dGhpcy5zcGVjdWxhck1hcC50b0pTT04odCkudXVpZCksdGhpcy5zcGVjdWxhckludGVuc2l0eU1hcCYmdGhpcy5zcGVjdWxhckludGVuc2l0eU1hcC5pc1RleHR1cmUmJihuLnNwZWN1bGFySW50ZW5zaXR5TWFwPXRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuc3BlY3VsYXJDb2xvck1hcCYmdGhpcy5zcGVjdWxhckNvbG9yTWFwLmlzVGV4dHVyZSYmKG4uc3BlY3VsYXJDb2xvck1hcD10aGlzLnNwZWN1bGFyQ29sb3JNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuZW52TWFwJiZ0aGlzLmVudk1hcC5pc1RleHR1cmUmJihuLmVudk1hcD10aGlzLmVudk1hcC50b0pTT04odCkudXVpZCx0aGlzLmNvbWJpbmUhPT12b2lkIDAmJihuLmNvbWJpbmU9dGhpcy5jb21iaW5lKSksdGhpcy5lbnZNYXBSb3RhdGlvbiE9PXZvaWQgMCYmKG4uZW52TWFwUm90YXRpb249dGhpcy5lbnZNYXBSb3RhdGlvbi50b0FycmF5KCkpLHRoaXMuZW52TWFwSW50ZW5zaXR5IT09dm9pZCAwJiYobi5lbnZNYXBJbnRlbnNpdHk9dGhpcy5lbnZNYXBJbnRlbnNpdHkpLHRoaXMucmVmbGVjdGl2aXR5IT09dm9pZCAwJiYobi5yZWZsZWN0aXZpdHk9dGhpcy5yZWZsZWN0aXZpdHkpLHRoaXMucmVmcmFjdGlvblJhdGlvIT09dm9pZCAwJiYobi5yZWZyYWN0aW9uUmF0aW89dGhpcy5yZWZyYWN0aW9uUmF0aW8pLHRoaXMuZ3JhZGllbnRNYXAmJnRoaXMuZ3JhZGllbnRNYXAuaXNUZXh0dXJlJiYobi5ncmFkaWVudE1hcD10aGlzLmdyYWRpZW50TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnRyYW5zbWlzc2lvbiE9PXZvaWQgMCYmKG4udHJhbnNtaXNzaW9uPXRoaXMudHJhbnNtaXNzaW9uKSx0aGlzLnRyYW5zbWlzc2lvbk1hcCYmdGhpcy50cmFuc21pc3Npb25NYXAuaXNUZXh0dXJlJiYobi50cmFuc21pc3Npb25NYXA9dGhpcy50cmFuc21pc3Npb25NYXAudG9KU09OKHQpLnV1aWQpLHRoaXMudGhpY2tuZXNzIT09dm9pZCAwJiYobi50aGlja25lc3M9dGhpcy50aGlja25lc3MpLHRoaXMudGhpY2tuZXNzTWFwJiZ0aGlzLnRoaWNrbmVzc01hcC5pc1RleHR1cmUmJihuLnRoaWNrbmVzc01hcD10aGlzLnRoaWNrbmVzc01hcC50b0pTT04odCkudXVpZCksdGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlIT09dm9pZCAwJiZ0aGlzLmF0dGVudWF0aW9uRGlzdGFuY2UhPT0xLzAmJihuLmF0dGVudWF0aW9uRGlzdGFuY2U9dGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlKSx0aGlzLmF0dGVudWF0aW9uQ29sb3IhPT12b2lkIDAmJihuLmF0dGVudWF0aW9uQ29sb3I9dGhpcy5hdHRlbnVhdGlvbkNvbG9yLmdldEhleCgpKSx0aGlzLnNpemUhPT12b2lkIDAmJihuLnNpemU9dGhpcy5zaXplKSx0aGlzLnNoYWRvd1NpZGUhPT1udWxsJiYobi5zaGFkb3dTaWRlPXRoaXMuc2hhZG93U2lkZSksdGhpcy5zaXplQXR0ZW51YXRpb24hPT12b2lkIDAmJihuLnNpemVBdHRlbnVhdGlvbj10aGlzLnNpemVBdHRlbnVhdGlvbiksdGhpcy5ibGVuZGluZyE9PTEmJihuLmJsZW5kaW5nPXRoaXMuYmxlbmRpbmcpLHRoaXMuc2lkZSE9PTAmJihuLnNpZGU9dGhpcy5zaWRlKSx0aGlzLnZlcnRleENvbG9ycz09PSEwJiYobi52ZXJ0ZXhDb2xvcnM9ITApLHRoaXMub3BhY2l0eTwxJiYobi5vcGFjaXR5PXRoaXMub3BhY2l0eSksdGhpcy50cmFuc3BhcmVudD09PSEwJiYobi50cmFuc3BhcmVudD0hMCksdGhpcy5ibGVuZFNyYyE9PTIwNCYmKG4uYmxlbmRTcmM9dGhpcy5ibGVuZFNyYyksdGhpcy5ibGVuZERzdCE9PTIwNSYmKG4uYmxlbmREc3Q9dGhpcy5ibGVuZERzdCksdGhpcy5ibGVuZEVxdWF0aW9uIT09MTAwJiYobi5ibGVuZEVxdWF0aW9uPXRoaXMuYmxlbmRFcXVhdGlvbiksdGhpcy5ibGVuZFNyY0FscGhhIT09bnVsbCYmKG4uYmxlbmRTcmNBbHBoYT10aGlzLmJsZW5kU3JjQWxwaGEpLHRoaXMuYmxlbmREc3RBbHBoYSE9PW51bGwmJihuLmJsZW5kRHN0QWxwaGE9dGhpcy5ibGVuZERzdEFscGhhKSx0aGlzLmJsZW5kRXF1YXRpb25BbHBoYSE9PW51bGwmJihuLmJsZW5kRXF1YXRpb25BbHBoYT10aGlzLmJsZW5kRXF1YXRpb25BbHBoYSksdGhpcy5ibGVuZENvbG9yJiZ0aGlzLmJsZW5kQ29sb3IuaXNDb2xvciYmKG4uYmxlbmRDb2xvcj10aGlzLmJsZW5kQ29sb3IuZ2V0SGV4KCkpLHRoaXMuYmxlbmRBbHBoYSE9PTAmJihuLmJsZW5kQWxwaGE9dGhpcy5ibGVuZEFscGhhKSx0aGlzLmRlcHRoRnVuYyE9PTMmJihuLmRlcHRoRnVuYz10aGlzLmRlcHRoRnVuYyksdGhpcy5kZXB0aFRlc3Q9PT0hMSYmKG4uZGVwdGhUZXN0PXRoaXMuZGVwdGhUZXN0KSx0aGlzLmRlcHRoV3JpdGU9PT0hMSYmKG4uZGVwdGhXcml0ZT10aGlzLmRlcHRoV3JpdGUpLHRoaXMuY29sb3JXcml0ZT09PSExJiYobi5jb2xvcldyaXRlPXRoaXMuY29sb3JXcml0ZSksdGhpcy5zdGVuY2lsV3JpdGVNYXNrIT09MjU1JiYobi5zdGVuY2lsV3JpdGVNYXNrPXRoaXMuc3RlbmNpbFdyaXRlTWFzayksdGhpcy5zdGVuY2lsRnVuYyE9PTUxOSYmKG4uc3RlbmNpbEZ1bmM9dGhpcy5zdGVuY2lsRnVuYyksdGhpcy5zdGVuY2lsUmVmIT09MCYmKG4uc3RlbmNpbFJlZj10aGlzLnN0ZW5jaWxSZWYpLHRoaXMuc3RlbmNpbEZ1bmNNYXNrIT09MjU1JiYobi5zdGVuY2lsRnVuY01hc2s9dGhpcy5zdGVuY2lsRnVuY01hc2spLHRoaXMuc3RlbmNpbEZhaWwhPT03NjgwJiYobi5zdGVuY2lsRmFpbD10aGlzLnN0ZW5jaWxGYWlsKSx0aGlzLnN0ZW5jaWxaRmFpbCE9PTc2ODAmJihuLnN0ZW5jaWxaRmFpbD10aGlzLnN0ZW5jaWxaRmFpbCksdGhpcy5zdGVuY2lsWlBhc3MhPT03NjgwJiYobi5zdGVuY2lsWlBhc3M9dGhpcy5zdGVuY2lsWlBhc3MpLHRoaXMuc3RlbmNpbFdyaXRlPT09ITAmJihuLnN0ZW5jaWxXcml0ZT10aGlzLnN0ZW5jaWxXcml0ZSksdGhpcy5yb3RhdGlvbiE9PXZvaWQgMCYmdGhpcy5yb3RhdGlvbiE9PTAmJihuLnJvdGF0aW9uPXRoaXMucm90YXRpb24pLHRoaXMucG9seWdvbk9mZnNldD09PSEwJiYobi5wb2x5Z29uT2Zmc2V0PSEwKSx0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IhPT0wJiYobi5wb2x5Z29uT2Zmc2V0RmFjdG9yPXRoaXMucG9seWdvbk9mZnNldEZhY3RvciksdGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMhPT0wJiYobi5wb2x5Z29uT2Zmc2V0VW5pdHM9dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMpLHRoaXMubGluZXdpZHRoIT09dm9pZCAwJiZ0aGlzLmxpbmV3aWR0aCE9PTEmJihuLmxpbmV3aWR0aD10aGlzLmxpbmV3aWR0aCksdGhpcy5kYXNoU2l6ZSE9PXZvaWQgMCYmKG4uZGFzaFNpemU9dGhpcy5kYXNoU2l6ZSksdGhpcy5nYXBTaXplIT09dm9pZCAwJiYobi5nYXBTaXplPXRoaXMuZ2FwU2l6ZSksdGhpcy5zY2FsZSE9PXZvaWQgMCYmKG4uc2NhbGU9dGhpcy5zY2FsZSksdGhpcy5kaXRoZXJpbmc9PT0hMCYmKG4uZGl0aGVyaW5nPSEwKSx0aGlzLmFscGhhVGVzdD4wJiYobi5hbHBoYVRlc3Q9dGhpcy5hbHBoYVRlc3QpLHRoaXMuYWxwaGFIYXNoPT09ITAmJihuLmFscGhhSGFzaD0hMCksdGhpcy5hbHBoYVRvQ292ZXJhZ2U9PT0hMCYmKG4uYWxwaGFUb0NvdmVyYWdlPSEwKSx0aGlzLnByZW11bHRpcGxpZWRBbHBoYT09PSEwJiYobi5wcmVtdWx0aXBsaWVkQWxwaGE9ITApLHRoaXMuZm9yY2VTaW5nbGVQYXNzPT09ITAmJihuLmZvcmNlU2luZ2xlUGFzcz0hMCksdGhpcy5hbGxvd092ZXJyaWRlPT09ITEmJihuLmFsbG93T3ZlcnJpZGU9ITEpLHRoaXMud2lyZWZyYW1lPT09ITAmJihuLndpcmVmcmFtZT0hMCksdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg+MSYmKG4ud2lyZWZyYW1lTGluZXdpZHRoPXRoaXMud2lyZWZyYW1lTGluZXdpZHRoKSx0aGlzLndpcmVmcmFtZUxpbmVjYXAhPT0icm91bmQiJiYobi53aXJlZnJhbWVMaW5lY2FwPXRoaXMud2lyZWZyYW1lTGluZWNhcCksdGhpcy53aXJlZnJhbWVMaW5lam9pbiE9PSJyb3VuZCImJihuLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWpvaW4pLHRoaXMuZmxhdFNoYWRpbmc9PT0hMCYmKG4uZmxhdFNoYWRpbmc9ITApLHRoaXMudmlzaWJsZT09PSExJiYobi52aXNpYmxlPSExKSx0aGlzLnRvbmVNYXBwZWQ9PT0hMSYmKG4udG9uZU1hcHBlZD0hMSksdGhpcy5mb2c9PT0hMSYmKG4uZm9nPSExKSxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKG4udXNlckRhdGE9dGhpcy51c2VyRGF0YSk7ZnVuY3Rpb24gcyhyKXtjb25zdCBvPVtdO2Zvcihjb25zdCBhIGluIHIpe2NvbnN0IGM9clthXTtkZWxldGUgYy5tZXRhZGF0YSxvLnB1c2goYyl9cmV0dXJuIG99aWYoZSl7Y29uc3Qgcj1zKHQudGV4dHVyZXMpLG89cyh0LmltYWdlcyk7ci5sZW5ndGg+MCYmKG4udGV4dHVyZXM9ciksby5sZW5ndGg+MCYmKG4uaW1hZ2VzPW8pfXJldHVybiBufWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3RoaXMubmFtZT10Lm5hbWUsdGhpcy5ibGVuZGluZz10LmJsZW5kaW5nLHRoaXMuc2lkZT10LnNpZGUsdGhpcy52ZXJ0ZXhDb2xvcnM9dC52ZXJ0ZXhDb2xvcnMsdGhpcy5vcGFjaXR5PXQub3BhY2l0eSx0aGlzLnRyYW5zcGFyZW50PXQudHJhbnNwYXJlbnQsdGhpcy5ibGVuZFNyYz10LmJsZW5kU3JjLHRoaXMuYmxlbmREc3Q9dC5ibGVuZERzdCx0aGlzLmJsZW5kRXF1YXRpb249dC5ibGVuZEVxdWF0aW9uLHRoaXMuYmxlbmRTcmNBbHBoYT10LmJsZW5kU3JjQWxwaGEsdGhpcy5ibGVuZERzdEFscGhhPXQuYmxlbmREc3RBbHBoYSx0aGlzLmJsZW5kRXF1YXRpb25BbHBoYT10LmJsZW5kRXF1YXRpb25BbHBoYSx0aGlzLmJsZW5kQ29sb3IuY29weSh0LmJsZW5kQ29sb3IpLHRoaXMuYmxlbmRBbHBoYT10LmJsZW5kQWxwaGEsdGhpcy5kZXB0aEZ1bmM9dC5kZXB0aEZ1bmMsdGhpcy5kZXB0aFRlc3Q9dC5kZXB0aFRlc3QsdGhpcy5kZXB0aFdyaXRlPXQuZGVwdGhXcml0ZSx0aGlzLnN0ZW5jaWxXcml0ZU1hc2s9dC5zdGVuY2lsV3JpdGVNYXNrLHRoaXMuc3RlbmNpbEZ1bmM9dC5zdGVuY2lsRnVuYyx0aGlzLnN0ZW5jaWxSZWY9dC5zdGVuY2lsUmVmLHRoaXMuc3RlbmNpbEZ1bmNNYXNrPXQuc3RlbmNpbEZ1bmNNYXNrLHRoaXMuc3RlbmNpbEZhaWw9dC5zdGVuY2lsRmFpbCx0aGlzLnN0ZW5jaWxaRmFpbD10LnN0ZW5jaWxaRmFpbCx0aGlzLnN0ZW5jaWxaUGFzcz10LnN0ZW5jaWxaUGFzcyx0aGlzLnN0ZW5jaWxXcml0ZT10LnN0ZW5jaWxXcml0ZTtjb25zdCBlPXQuY2xpcHBpbmdQbGFuZXM7bGV0IG49bnVsbDtpZihlIT09bnVsbCl7Y29uc3Qgcz1lLmxlbmd0aDtuPW5ldyBBcnJheShzKTtmb3IobGV0IHI9MDtyIT09czsrK3IpbltyXT1lW3JdLmNsb25lKCl9cmV0dXJuIHRoaXMuY2xpcHBpbmdQbGFuZXM9bix0aGlzLmNsaXBJbnRlcnNlY3Rpb249dC5jbGlwSW50ZXJzZWN0aW9uLHRoaXMuY2xpcFNoYWRvd3M9dC5jbGlwU2hhZG93cyx0aGlzLnNoYWRvd1NpZGU9dC5zaGFkb3dTaWRlLHRoaXMuY29sb3JXcml0ZT10LmNvbG9yV3JpdGUsdGhpcy5wcmVjaXNpb249dC5wcmVjaXNpb24sdGhpcy5wb2x5Z29uT2Zmc2V0PXQucG9seWdvbk9mZnNldCx0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I9dC5wb2x5Z29uT2Zmc2V0RmFjdG9yLHRoaXMucG9seWdvbk9mZnNldFVuaXRzPXQucG9seWdvbk9mZnNldFVuaXRzLHRoaXMuZGl0aGVyaW5nPXQuZGl0aGVyaW5nLHRoaXMuYWxwaGFUZXN0PXQuYWxwaGFUZXN0LHRoaXMuYWxwaGFIYXNoPXQuYWxwaGFIYXNoLHRoaXMuYWxwaGFUb0NvdmVyYWdlPXQuYWxwaGFUb0NvdmVyYWdlLHRoaXMucHJlbXVsdGlwbGllZEFscGhhPXQucHJlbXVsdGlwbGllZEFscGhhLHRoaXMuZm9yY2VTaW5nbGVQYXNzPXQuZm9yY2VTaW5nbGVQYXNzLHRoaXMuYWxsb3dPdmVycmlkZT10LmFsbG93T3ZlcnJpZGUsdGhpcy52aXNpYmxlPXQudmlzaWJsZSx0aGlzLnRvbmVNYXBwZWQ9dC50b25lTWFwcGVkLHRoaXMudXNlckRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0LnVzZXJEYXRhKSksdGhpc31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXNldCBuZWVkc1VwZGF0ZSh0KXt0PT09ITAmJnRoaXMudmVyc2lvbisrfX1jbGFzcyBRZiBleHRlbmRzIGpme2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5pc01lc2hCYXNpY01hdGVyaWFsPSEwLHRoaXMudHlwZT0iTWVzaEJhc2ljTWF0ZXJpYWwiLHRoaXMuY29sb3I9bmV3IHpzKDE2Nzc3MjE1KSx0aGlzLm1hcD1udWxsLHRoaXMubGlnaHRNYXA9bnVsbCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTEsdGhpcy5hb01hcD1udWxsLHRoaXMuYW9NYXBJbnRlbnNpdHk9MSx0aGlzLnNwZWN1bGFyTWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuZW52TWFwPW51bGwsdGhpcy5lbnZNYXBSb3RhdGlvbj1uZXcgQmksdGhpcy5jb21iaW5lPTAsdGhpcy5yZWZsZWN0aXZpdHk9MSx0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTgsdGhpcy53aXJlZnJhbWU9ITEsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MSx0aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIix0aGlzLndpcmVmcmFtZUxpbmVqb2luPSJyb3VuZCIsdGhpcy5mb2c9ITAsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5tYXA9dC5tYXAsdGhpcy5saWdodE1hcD10LmxpZ2h0TWFwLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9dC5saWdodE1hcEludGVuc2l0eSx0aGlzLmFvTWFwPXQuYW9NYXAsdGhpcy5hb01hcEludGVuc2l0eT10LmFvTWFwSW50ZW5zaXR5LHRoaXMuc3BlY3VsYXJNYXA9dC5zcGVjdWxhck1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5lbnZNYXA9dC5lbnZNYXAsdGhpcy5lbnZNYXBSb3RhdGlvbi5jb3B5KHQuZW52TWFwUm90YXRpb24pLHRoaXMuY29tYmluZT10LmNvbWJpbmUsdGhpcy5yZWZsZWN0aXZpdHk9dC5yZWZsZWN0aXZpdHksdGhpcy5yZWZyYWN0aW9uUmF0aW89dC5yZWZyYWN0aW9uUmF0aW8sdGhpcy53aXJlZnJhbWU9dC53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9dC53aXJlZnJhbWVMaW5ld2lkdGgsdGhpcy53aXJlZnJhbWVMaW5lY2FwPXQud2lyZWZyYW1lTGluZWNhcCx0aGlzLndpcmVmcmFtZUxpbmVqb2luPXQud2lyZWZyYW1lTGluZWpvaW4sdGhpcy5mb2c9dC5mb2csdGhpc319Y29uc3QgcHQ9bmV3IFAsVHM9bmV3IGs7bGV0IEtmPTA7Y2xhc3MgeHR7Y29uc3RydWN0b3IodCxlLG49ITEpe2lmKEFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4iKTt0aGlzLmlzQnVmZmVyQXR0cmlidXRlPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOktmKyt9KSx0aGlzLm5hbWU9IiIsdGhpcy5hcnJheT10LHRoaXMuaXRlbVNpemU9ZSx0aGlzLmNvdW50PXQhPT12b2lkIDA/dC5sZW5ndGgvZTowLHRoaXMubm9ybWFsaXplZD1uLHRoaXMudXNhZ2U9MzUwNDQsdGhpcy51cGRhdGVSYW5nZXM9W10sdGhpcy5ncHVUeXBlPTEwMTUsdGhpcy52ZXJzaW9uPTB9b25VcGxvYWRDYWxsYmFjaygpe31zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK31zZXRVc2FnZSh0KXtyZXR1cm4gdGhpcy51c2FnZT10LHRoaXN9YWRkVXBkYXRlUmFuZ2UodCxlKXt0aGlzLnVwZGF0ZVJhbmdlcy5wdXNoKHtzdGFydDp0LGNvdW50OmV9KX1jbGVhclVwZGF0ZVJhbmdlcygpe3RoaXMudXBkYXRlUmFuZ2VzLmxlbmd0aD0wfWNvcHkodCl7cmV0dXJuIHRoaXMubmFtZT10Lm5hbWUsdGhpcy5hcnJheT1uZXcgdC5hcnJheS5jb25zdHJ1Y3Rvcih0LmFycmF5KSx0aGlzLml0ZW1TaXplPXQuaXRlbVNpemUsdGhpcy5jb3VudD10LmNvdW50LHRoaXMubm9ybWFsaXplZD10Lm5vcm1hbGl6ZWQsdGhpcy51c2FnZT10LnVzYWdlLHRoaXMuZ3B1VHlwZT10LmdwdVR5cGUsdGhpc31jb3B5QXQodCxlLG4pe3QqPXRoaXMuaXRlbVNpemUsbio9ZS5pdGVtU2l6ZTtmb3IobGV0IHM9MCxyPXRoaXMuaXRlbVNpemU7czxyO3MrKyl0aGlzLmFycmF5W3Qrc109ZS5hcnJheVtuK3NdO3JldHVybiB0aGlzfWNvcHlBcnJheSh0KXtyZXR1cm4gdGhpcy5hcnJheS5zZXQodCksdGhpc31hcHBseU1hdHJpeDModCl7aWYodGhpcy5pdGVtU2l6ZT09PTIpZm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspVHMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLFRzLmFwcGx5TWF0cml4Myh0KSx0aGlzLnNldFhZKGUsVHMueCxUcy55KTtlbHNlIGlmKHRoaXMuaXRlbVNpemU9PT0zKWZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKXB0LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxwdC5hcHBseU1hdHJpeDModCksdGhpcy5zZXRYWVooZSxwdC54LHB0LnkscHQueik7cmV0dXJuIHRoaXN9YXBwbHlNYXRyaXg0KHQpe2ZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKXB0LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxwdC5hcHBseU1hdHJpeDQodCksdGhpcy5zZXRYWVooZSxwdC54LHB0LnkscHQueik7cmV0dXJuIHRoaXN9YXBwbHlOb3JtYWxNYXRyaXgodCl7Zm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspcHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLHB0LmFwcGx5Tm9ybWFsTWF0cml4KHQpLHRoaXMuc2V0WFlaKGUscHQueCxwdC55LHB0LnopO3JldHVybiB0aGlzfXRyYW5zZm9ybURpcmVjdGlvbih0KXtmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKylwdC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSkscHQudHJhbnNmb3JtRGlyZWN0aW9uKHQpLHRoaXMuc2V0WFlaKGUscHQueCxwdC55LHB0LnopO3JldHVybiB0aGlzfXNldCh0LGU9MCl7cmV0dXJuIHRoaXMuYXJyYXkuc2V0KHQsZSksdGhpc31nZXRDb21wb25lbnQodCxlKXtsZXQgbj10aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZStlXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYobj1WbihuLHRoaXMuYXJyYXkpKSxufXNldENvbXBvbmVudCh0LGUsbil7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKG49a3Qobix0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrZV09bix0aGlzfWdldFgodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemVdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPVZuKGUsdGhpcy5hcnJheSkpLGV9c2V0WCh0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPWt0KGUsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplXT1lLHRoaXN9Z2V0WSh0KXtsZXQgZT10aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsxXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1WbihlLHRoaXMuYXJyYXkpKSxlfXNldFkodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1rdChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsxXT1lLHRoaXN9Z2V0Wih0KXtsZXQgZT10aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsyXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1WbihlLHRoaXMuYXJyYXkpKSxlfXNldFoodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1rdChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsyXT1lLHRoaXN9Z2V0Vyh0KXtsZXQgZT10aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSszXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1WbihlLHRoaXMuYXJyYXkpKSxlfXNldFcodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1rdChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSszXT1lLHRoaXN9c2V0WFkodCxlLG4pe3JldHVybiB0Kj10aGlzLml0ZW1TaXplLHRoaXMubm9ybWFsaXplZCYmKGU9a3QoZSx0aGlzLmFycmF5KSxuPWt0KG4sdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCswXT1lLHRoaXMuYXJyYXlbdCsxXT1uLHRoaXN9c2V0WFlaKHQsZSxuLHMpe3JldHVybiB0Kj10aGlzLml0ZW1TaXplLHRoaXMubm9ybWFsaXplZCYmKGU9a3QoZSx0aGlzLmFycmF5KSxuPWt0KG4sdGhpcy5hcnJheSkscz1rdChzLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QrMF09ZSx0aGlzLmFycmF5W3QrMV09bix0aGlzLmFycmF5W3QrMl09cyx0aGlzfXNldFhZWlcodCxlLG4scyxyKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQmJihlPWt0KGUsdGhpcy5hcnJheSksbj1rdChuLHRoaXMuYXJyYXkpLHM9a3Qocyx0aGlzLmFycmF5KSxyPWt0KHIsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCswXT1lLHRoaXMuYXJyYXlbdCsxXT1uLHRoaXMuYXJyYXlbdCsyXT1zLHRoaXMuYXJyYXlbdCszXT1yLHRoaXN9b25VcGxvYWQodCl7cmV0dXJuIHRoaXMub25VcGxvYWRDYWxsYmFjaz10LHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5hcnJheSx0aGlzLml0ZW1TaXplKS5jb3B5KHRoaXMpfXRvSlNPTigpe2NvbnN0IHQ9e2l0ZW1TaXplOnRoaXMuaXRlbVNpemUsdHlwZTp0aGlzLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsYXJyYXk6QXJyYXkuZnJvbSh0aGlzLmFycmF5KSxub3JtYWxpemVkOnRoaXMubm9ybWFsaXplZH07cmV0dXJuIHRoaXMubmFtZSE9PSIiJiYodC5uYW1lPXRoaXMubmFtZSksdGhpcy51c2FnZSE9PTM1MDQ0JiYodC51c2FnZT10aGlzLnVzYWdlKSx0fX1jbGFzcyB0ZCBleHRlbmRzIHh0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgVWludDE2QXJyYXkodCksZSxuKX19Y2xhc3MgZWQgZXh0ZW5kcyB4dHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IFVpbnQzMkFycmF5KHQpLGUsbil9fWNsYXNzIFJlIGV4dGVuZHMgeHR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBGbG9hdDMyQXJyYXkodCksZSxuKX19bGV0IG5kPTA7Y29uc3Qgc2U9bmV3IHN0LElvPW5ldyBJZSxRbj1uZXcgUCxKdD1uZXcgZ3QsSWk9bmV3IGd0LE10PW5ldyBQO2NsYXNzIEFlIGV4dGVuZHMgZ3N7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNCdWZmZXJHZW9tZXRyeT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpuZCsrfSksdGhpcy51dWlkPW1uKCksdGhpcy5uYW1lPSIiLHRoaXMudHlwZT0iQnVmZmVyR2VvbWV0cnkiLHRoaXMuaW5kZXg9bnVsbCx0aGlzLmluZGlyZWN0PW51bGwsdGhpcy5pbmRpcmVjdE9mZnNldD0wLHRoaXMuYXR0cmlidXRlcz17fSx0aGlzLm1vcnBoQXR0cmlidXRlcz17fSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPSExLHRoaXMuZ3JvdXBzPVtdLHRoaXMuYm91bmRpbmdCb3g9bnVsbCx0aGlzLmJvdW5kaW5nU3BoZXJlPW51bGwsdGhpcy5kcmF3UmFuZ2U9e3N0YXJ0OjAsY291bnQ6MS8wfSx0aGlzLnVzZXJEYXRhPXt9fWdldEluZGV4KCl7cmV0dXJuIHRoaXMuaW5kZXh9c2V0SW5kZXgodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dGhpcy5pbmRleD1uZXcoYmYodCk/ZWQ6dGQpKHQsMSk6dGhpcy5pbmRleD10LHRoaXN9c2V0SW5kaXJlY3QodCxlPTApe3JldHVybiB0aGlzLmluZGlyZWN0PXQsdGhpcy5pbmRpcmVjdE9mZnNldD1lLHRoaXN9Z2V0SW5kaXJlY3QoKXtyZXR1cm4gdGhpcy5pbmRpcmVjdH1nZXRBdHRyaWJ1dGUodCl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1t0XX1zZXRBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW3RdPWUsdGhpc31kZWxldGVBdHRyaWJ1dGUodCl7cmV0dXJuIGRlbGV0ZSB0aGlzLmF0dHJpYnV0ZXNbdF0sdGhpc31oYXNBdHRyaWJ1dGUodCl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1t0XSE9PXZvaWQgMH1hZGRHcm91cCh0LGUsbj0wKXt0aGlzLmdyb3Vwcy5wdXNoKHtzdGFydDp0LGNvdW50OmUsbWF0ZXJpYWxJbmRleDpufSl9Y2xlYXJHcm91cHMoKXt0aGlzLmdyb3Vwcz1bXX1zZXREcmF3UmFuZ2UodCxlKXt0aGlzLmRyYXdSYW5nZS5zdGFydD10LHRoaXMuZHJhd1JhbmdlLmNvdW50PWV9YXBwbHlNYXRyaXg0KHQpe2NvbnN0IGU9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uO2UhPT12b2lkIDAmJihlLmFwcGx5TWF0cml4NCh0KSxlLm5lZWRzVXBkYXRlPSEwKTtjb25zdCBuPXRoaXMuYXR0cmlidXRlcy5ub3JtYWw7aWYobiE9PXZvaWQgMCl7Y29uc3Qgcj1uZXcgTWUoKS5nZXROb3JtYWxNYXRyaXgodCk7bi5hcHBseU5vcm1hbE1hdHJpeChyKSxuLm5lZWRzVXBkYXRlPSEwfWNvbnN0IHM9dGhpcy5hdHRyaWJ1dGVzLnRhbmdlbnQ7cmV0dXJuIHMhPT12b2lkIDAmJihzLnRyYW5zZm9ybURpcmVjdGlvbih0KSxzLm5lZWRzVXBkYXRlPSEwKSx0aGlzLmJvdW5kaW5nQm94IT09bnVsbCYmdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKSx0aGlzLmJvdW5kaW5nU3BoZXJlIT09bnVsbCYmdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSx0aGlzfWFwcGx5UXVhdGVybmlvbih0KXtyZXR1cm4gc2UubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24odCksdGhpcy5hcHBseU1hdHJpeDQoc2UpLHRoaXN9cm90YXRlWCh0KXtyZXR1cm4gc2UubWFrZVJvdGF0aW9uWCh0KSx0aGlzLmFwcGx5TWF0cml4NChzZSksdGhpc31yb3RhdGVZKHQpe3JldHVybiBzZS5tYWtlUm90YXRpb25ZKHQpLHRoaXMuYXBwbHlNYXRyaXg0KHNlKSx0aGlzfXJvdGF0ZVoodCl7cmV0dXJuIHNlLm1ha2VSb3RhdGlvbloodCksdGhpcy5hcHBseU1hdHJpeDQoc2UpLHRoaXN9dHJhbnNsYXRlKHQsZSxuKXtyZXR1cm4gc2UubWFrZVRyYW5zbGF0aW9uKHQsZSxuKSx0aGlzLmFwcGx5TWF0cml4NChzZSksdGhpc31zY2FsZSh0LGUsbil7cmV0dXJuIHNlLm1ha2VTY2FsZSh0LGUsbiksdGhpcy5hcHBseU1hdHJpeDQoc2UpLHRoaXN9bG9va0F0KHQpe3JldHVybiBJby5sb29rQXQodCksSW8udXBkYXRlTWF0cml4KCksdGhpcy5hcHBseU1hdHJpeDQoSW8ubWF0cml4KSx0aGlzfWNlbnRlcigpe3JldHVybiB0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpLHRoaXMuYm91bmRpbmdCb3guZ2V0Q2VudGVyKFFuKS5uZWdhdGUoKSx0aGlzLnRyYW5zbGF0ZShRbi54LFFuLnksUW4ueiksdGhpc31zZXRGcm9tUG9pbnRzKHQpe2NvbnN0IGU9dGhpcy5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7aWYoZT09PXZvaWQgMCl7Y29uc3Qgbj1bXTtmb3IobGV0IHM9MCxyPXQubGVuZ3RoO3M8cjtzKyspe2NvbnN0IG89dFtzXTtuLnB1c2goby54LG8ueSxvLnp8fDApfXRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFJlKG4sMykpfWVsc2V7Y29uc3Qgbj1NYXRoLm1pbih0Lmxlbmd0aCxlLmNvdW50KTtmb3IobGV0IHM9MDtzPG47cysrKXtjb25zdCByPXRbc107ZS5zZXRYWVoocyxyLngsci55LHIuenx8MCl9dC5sZW5ndGg+ZS5jb3VudCYmYnQoIkJ1ZmZlckdlb21ldHJ5OiBCdWZmZXIgc2l6ZSB0b28gc21hbGwgZm9yIHBvaW50cyBkYXRhLiBVc2UgLmRpc3Bvc2UoKSBhbmQgY3JlYXRlIGEgbmV3IGdlb21ldHJ5LiIpLGUubmVlZHNVcGRhdGU9ITB9cmV0dXJuIHRoaXN9Y29tcHV0ZUJvdW5kaW5nQm94KCl7dGhpcy5ib3VuZGluZ0JveD09PW51bGwmJih0aGlzLmJvdW5kaW5nQm94PW5ldyBndCk7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24sZT10aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtpZih0JiZ0LmlzR0xCdWZmZXJBdHRyaWJ1dGUpe3luKCJCdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTogR0xCdWZmZXJBdHRyaWJ1dGUgcmVxdWlyZXMgYSBtYW51YWwgYm91bmRpbmcgYm94LiIsdGhpcyksdGhpcy5ib3VuZGluZ0JveC5zZXQobmV3IFAoLTEvMCwtMS8wLC0xLzApLG5ldyBQKDEvMCwxLzAsMS8wKSk7cmV0dXJufWlmKHQhPT12b2lkIDApe2lmKHRoaXMuYm91bmRpbmdCb3guc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSh0KSxlKWZvcihsZXQgbj0wLHM9ZS5sZW5ndGg7bjxzO24rKyl7Y29uc3Qgcj1lW25dO0p0LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUociksdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT8oTXQuYWRkVmVjdG9ycyh0aGlzLmJvdW5kaW5nQm94Lm1pbixKdC5taW4pLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChNdCksTXQuYWRkVmVjdG9ycyh0aGlzLmJvdW5kaW5nQm94Lm1heCxKdC5tYXgpLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChNdCkpOih0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoSnQubWluKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoSnQubWF4KSl9fWVsc2UgdGhpcy5ib3VuZGluZ0JveC5tYWtlRW1wdHkoKTsoaXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueCl8fGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLnkpfHxpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi56KSkmJnluKCdCdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTogQ29tcHV0ZWQgbWluL21heCBoYXZlIE5hTiB2YWx1ZXMuIFRoZSAicG9zaXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsdGhpcyl9Y29tcHV0ZUJvdW5kaW5nU3BoZXJlKCl7dGhpcy5ib3VuZGluZ1NwaGVyZT09PW51bGwmJih0aGlzLmJvdW5kaW5nU3BoZXJlPW5ldyBaYyk7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24sZT10aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtpZih0JiZ0LmlzR0xCdWZmZXJBdHRyaWJ1dGUpe3luKCJCdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogR0xCdWZmZXJBdHRyaWJ1dGUgcmVxdWlyZXMgYSBtYW51YWwgYm91bmRpbmcgc3BoZXJlLiIsdGhpcyksdGhpcy5ib3VuZGluZ1NwaGVyZS5zZXQobmV3IFAsMS8wKTtyZXR1cm59aWYodCl7Y29uc3Qgbj10aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlcjtpZihKdC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHQpLGUpZm9yKGxldCByPTAsbz1lLmxlbmd0aDtyPG87cisrKXtjb25zdCBhPWVbcl07SWkuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShhKSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPyhNdC5hZGRWZWN0b3JzKEp0Lm1pbixJaS5taW4pLEp0LmV4cGFuZEJ5UG9pbnQoTXQpLE10LmFkZFZlY3RvcnMoSnQubWF4LElpLm1heCksSnQuZXhwYW5kQnlQb2ludChNdCkpOihKdC5leHBhbmRCeVBvaW50KElpLm1pbiksSnQuZXhwYW5kQnlQb2ludChJaS5tYXgpKX1KdC5nZXRDZW50ZXIobik7bGV0IHM9MDtmb3IobGV0IHI9MCxvPXQuY291bnQ7cjxvO3IrKylNdC5mcm9tQnVmZmVyQXR0cmlidXRlKHQscikscz1NYXRoLm1heChzLG4uZGlzdGFuY2VUb1NxdWFyZWQoTXQpKTtpZihlKWZvcihsZXQgcj0wLG89ZS5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT1lW3JdLGM9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZTtmb3IobGV0IGw9MCxoPWEuY291bnQ7bDxoO2wrKylNdC5mcm9tQnVmZmVyQXR0cmlidXRlKGEsbCksYyYmKFFuLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxsKSxNdC5hZGQoUW4pKSxzPU1hdGgubWF4KHMsbi5kaXN0YW5jZVRvU3F1YXJlZChNdCkpfXRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzPU1hdGguc3FydChzKSxpc05hTih0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cykmJnluKCdCdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogQ29tcHV0ZWQgcmFkaXVzIGlzIE5hTi4gVGhlICJwb3NpdGlvbiIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJyx0aGlzKX19Y29tcHV0ZVRhbmdlbnRzKCl7Y29uc3QgdD10aGlzLmluZGV4LGU9dGhpcy5hdHRyaWJ1dGVzO2lmKHQ9PT1udWxsfHxlLnBvc2l0aW9uPT09dm9pZCAwfHxlLm5vcm1hbD09PXZvaWQgMHx8ZS51dj09PXZvaWQgMCl7eW4oIkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgZmFpbGVkLiBNaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZXMgKGluZGV4LCBwb3NpdGlvbiwgbm9ybWFsIG9yIHV2KSIpO3JldHVybn1jb25zdCBuPWUucG9zaXRpb24scz1lLm5vcm1hbCxyPWUudXY7dGhpcy5oYXNBdHRyaWJ1dGUoInRhbmdlbnQiKT09PSExJiZ0aGlzLnNldEF0dHJpYnV0ZSgidGFuZ2VudCIsbmV3IHh0KG5ldyBGbG9hdDMyQXJyYXkoNCpuLmNvdW50KSw0KSk7Y29uc3Qgbz10aGlzLmdldEF0dHJpYnV0ZSgidGFuZ2VudCIpLGE9W10sYz1bXTtmb3IobGV0IHY9MDt2PG4uY291bnQ7disrKWFbdl09bmV3IFAsY1t2XT1uZXcgUDtjb25zdCBsPW5ldyBQLGg9bmV3IFAsdT1uZXcgUCxmPW5ldyBrLGQ9bmV3IGsscD1uZXcgayx5PW5ldyBQLGc9bmV3IFA7ZnVuY3Rpb24gdyh2LF8sVCl7bC5mcm9tQnVmZmVyQXR0cmlidXRlKG4sdiksaC5mcm9tQnVmZmVyQXR0cmlidXRlKG4sXyksdS5mcm9tQnVmZmVyQXR0cmlidXRlKG4sVCksZi5mcm9tQnVmZmVyQXR0cmlidXRlKHIsdiksZC5mcm9tQnVmZmVyQXR0cmlidXRlKHIsXykscC5mcm9tQnVmZmVyQXR0cmlidXRlKHIsVCksaC5zdWIobCksdS5zdWIobCksZC5zdWIoZikscC5zdWIoZik7Y29uc3Qgej0xLyhkLngqcC55LXAueCpkLnkpO2lzRmluaXRlKHopJiYoeS5jb3B5KGgpLm11bHRpcGx5U2NhbGFyKHAueSkuYWRkU2NhbGVkVmVjdG9yKHUsLWQueSkubXVsdGlwbHlTY2FsYXIoeiksZy5jb3B5KHUpLm11bHRpcGx5U2NhbGFyKGQueCkuYWRkU2NhbGVkVmVjdG9yKGgsLXAueCkubXVsdGlwbHlTY2FsYXIoeiksYVt2XS5hZGQoeSksYVtfXS5hZGQoeSksYVtUXS5hZGQoeSksY1t2XS5hZGQoZyksY1tfXS5hZGQoZyksY1tUXS5hZGQoZykpfWxldCBiPXRoaXMuZ3JvdXBzO2IubGVuZ3RoPT09MCYmKGI9W3tzdGFydDowLGNvdW50OnQuY291bnR9XSk7Zm9yKGxldCB2PTAsXz1iLmxlbmd0aDt2PF87Kyt2KXtjb25zdCBUPWJbdl0sej1ULnN0YXJ0LEM9VC5jb3VudDtmb3IobGV0IEU9eixGPXorQztFPEY7RSs9Myl3KHQuZ2V0WChFKzApLHQuZ2V0WChFKzEpLHQuZ2V0WChFKzIpKX1jb25zdCB4PW5ldyBQLG09bmV3IFAsTT1uZXcgUCxTPW5ldyBQO2Z1bmN0aW9uIEEodil7TS5mcm9tQnVmZmVyQXR0cmlidXRlKHMsdiksUy5jb3B5KE0pO2NvbnN0IF89YVt2XTt4LmNvcHkoXykseC5zdWIoTS5tdWx0aXBseVNjYWxhcihNLmRvdChfKSkpLm5vcm1hbGl6ZSgpLG0uY3Jvc3NWZWN0b3JzKFMsXyk7Y29uc3Qgej1tLmRvdChjW3ZdKTwwPy0xOjE7by5zZXRYWVpXKHYseC54LHgueSx4Lnoseil9Zm9yKGxldCB2PTAsXz1iLmxlbmd0aDt2PF87Kyt2KXtjb25zdCBUPWJbdl0sej1ULnN0YXJ0LEM9VC5jb3VudDtmb3IobGV0IEU9eixGPXorQztFPEY7RSs9MylBKHQuZ2V0WChFKzApKSxBKHQuZ2V0WChFKzEpKSxBKHQuZ2V0WChFKzIpKX19Y29tcHV0ZVZlcnRleE5vcm1hbHMoKXtjb25zdCB0PXRoaXMuaW5kZXgsZT10aGlzLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtpZihlIT09dm9pZCAwKXtsZXQgbj10aGlzLmdldEF0dHJpYnV0ZSgibm9ybWFsIik7aWYobj09PXZvaWQgMCluPW5ldyB4dChuZXcgRmxvYXQzMkFycmF5KGUuY291bnQqMyksMyksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbik7ZWxzZSBmb3IobGV0IGY9MCxkPW4uY291bnQ7ZjxkO2YrKyluLnNldFhZWihmLDAsMCwwKTtjb25zdCBzPW5ldyBQLHI9bmV3IFAsbz1uZXcgUCxhPW5ldyBQLGM9bmV3IFAsbD1uZXcgUCxoPW5ldyBQLHU9bmV3IFA7aWYodClmb3IobGV0IGY9MCxkPXQuY291bnQ7ZjxkO2YrPTMpe2NvbnN0IHA9dC5nZXRYKGYrMCkseT10LmdldFgoZisxKSxnPXQuZ2V0WChmKzIpO3MuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHApLHIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHkpLG8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLGcpLGguc3ViVmVjdG9ycyhvLHIpLHUuc3ViVmVjdG9ycyhzLHIpLGguY3Jvc3ModSksYS5mcm9tQnVmZmVyQXR0cmlidXRlKG4scCksYy5mcm9tQnVmZmVyQXR0cmlidXRlKG4seSksbC5mcm9tQnVmZmVyQXR0cmlidXRlKG4sZyksYS5hZGQoaCksYy5hZGQoaCksbC5hZGQoaCksbi5zZXRYWVoocCxhLngsYS55LGEueiksbi5zZXRYWVooeSxjLngsYy55LGMueiksbi5zZXRYWVooZyxsLngsbC55LGwueil9ZWxzZSBmb3IobGV0IGY9MCxkPWUuY291bnQ7ZjxkO2YrPTMpcy5mcm9tQnVmZmVyQXR0cmlidXRlKGUsZiswKSxyLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxmKzEpLG8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLGYrMiksaC5zdWJWZWN0b3JzKG8sciksdS5zdWJWZWN0b3JzKHMsciksaC5jcm9zcyh1KSxuLnNldFhZWihmKzAsaC54LGgueSxoLnopLG4uc2V0WFlaKGYrMSxoLngsaC55LGgueiksbi5zZXRYWVooZisyLGgueCxoLnksaC56KTt0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKSxuLm5lZWRzVXBkYXRlPSEwfX1ub3JtYWxpemVOb3JtYWxzKCl7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMubm9ybWFsO2ZvcihsZXQgZT0wLG49dC5jb3VudDtlPG47ZSsrKU10LmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSxNdC5ub3JtYWxpemUoKSx0LnNldFhZWihlLE10LngsTXQueSxNdC56KX10b05vbkluZGV4ZWQoKXtmdW5jdGlvbiB0KGEsYyl7Y29uc3QgbD1hLmFycmF5LGg9YS5pdGVtU2l6ZSx1PWEubm9ybWFsaXplZCxmPW5ldyBsLmNvbnN0cnVjdG9yKGMubGVuZ3RoKmgpO2xldCBkPTAscD0wO2ZvcihsZXQgeT0wLGc9Yy5sZW5ndGg7eTxnO3krKyl7YS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlP2Q9Y1t5XSphLmRhdGEuc3RyaWRlK2Eub2Zmc2V0OmQ9Y1t5XSpoO2ZvcihsZXQgdz0wO3c8aDt3KyspZltwKytdPWxbZCsrXX1yZXR1cm4gbmV3IHh0KGYsaCx1KX1pZih0aGlzLmluZGV4PT09bnVsbClyZXR1cm4gYnQoIkJ1ZmZlckdlb21ldHJ5LnRvTm9uSW5kZXhlZCgpOiBCdWZmZXJHZW9tZXRyeSBpcyBhbHJlYWR5IG5vbi1pbmRleGVkLiIpLHRoaXM7Y29uc3QgZT1uZXcgQWUsbj10aGlzLmluZGV4LmFycmF5LHM9dGhpcy5hdHRyaWJ1dGVzO2Zvcihjb25zdCBhIGluIHMpe2NvbnN0IGM9c1thXSxsPXQoYyxuKTtlLnNldEF0dHJpYnV0ZShhLGwpfWNvbnN0IHI9dGhpcy5tb3JwaEF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGEgaW4gcil7Y29uc3QgYz1bXSxsPXJbYV07Zm9yKGxldCBoPTAsdT1sLmxlbmd0aDtoPHU7aCsrKXtjb25zdCBmPWxbaF0sZD10KGYsbik7Yy5wdXNoKGQpfWUubW9ycGhBdHRyaWJ1dGVzW2FdPWN9ZS5tb3JwaFRhcmdldHNSZWxhdGl2ZT10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO2NvbnN0IG89dGhpcy5ncm91cHM7Zm9yKGxldCBhPTAsYz1vLmxlbmd0aDthPGM7YSsrKXtjb25zdCBsPW9bYV07ZS5hZGRHcm91cChsLnN0YXJ0LGwuY291bnQsbC5tYXRlcmlhbEluZGV4KX1yZXR1cm4gZX10b0pTT04oKXtjb25zdCB0PXttZXRhZGF0YTp7dmVyc2lvbjo0LjcsdHlwZToiQnVmZmVyR2VvbWV0cnkiLGdlbmVyYXRvcjoiQnVmZmVyR2VvbWV0cnkudG9KU09OIn19O2lmKHQudXVpZD10aGlzLnV1aWQsdC50eXBlPXRoaXMudHlwZSx0aGlzLm5hbWUhPT0iIiYmKHQubmFtZT10aGlzLm5hbWUpLE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aD4wJiYodC51c2VyRGF0YT10aGlzLnVzZXJEYXRhKSx0aGlzLnBhcmFtZXRlcnMhPT12b2lkIDApe2NvbnN0IGM9dGhpcy5wYXJhbWV0ZXJzO2Zvcihjb25zdCBsIGluIGMpY1tsXSE9PXZvaWQgMCYmKHRbbF09Y1tsXSk7cmV0dXJuIHR9dC5kYXRhPXthdHRyaWJ1dGVzOnt9fTtjb25zdCBlPXRoaXMuaW5kZXg7ZSE9PW51bGwmJih0LmRhdGEuaW5kZXg9e3R5cGU6ZS5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLGFycmF5OkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUuYXJyYXkpfSk7Y29uc3Qgbj10aGlzLmF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGMgaW4gbil7Y29uc3QgbD1uW2NdO3QuZGF0YS5hdHRyaWJ1dGVzW2NdPWwudG9KU09OKHQuZGF0YSl9Y29uc3Qgcz17fTtsZXQgcj0hMTtmb3IoY29uc3QgYyBpbiB0aGlzLm1vcnBoQXR0cmlidXRlcyl7Y29uc3QgbD10aGlzLm1vcnBoQXR0cmlidXRlc1tjXSxoPVtdO2ZvcihsZXQgdT0wLGY9bC5sZW5ndGg7dTxmO3UrKyl7Y29uc3QgZD1sW3VdO2gucHVzaChkLnRvSlNPTih0LmRhdGEpKX1oLmxlbmd0aD4wJiYoc1tjXT1oLHI9ITApfXImJih0LmRhdGEubW9ycGhBdHRyaWJ1dGVzPXMsdC5kYXRhLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPXRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmUpO2NvbnN0IG89dGhpcy5ncm91cHM7by5sZW5ndGg+MCYmKHQuZGF0YS5ncm91cHM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvKSkpO2NvbnN0IGE9dGhpcy5ib3VuZGluZ1NwaGVyZTtyZXR1cm4gYSE9PW51bGwmJih0LmRhdGEuYm91bmRpbmdTcGhlcmU9YS50b0pTT04oKSksdH1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9Y29weSh0KXt0aGlzLmluZGV4PW51bGwsdGhpcy5hdHRyaWJ1dGVzPXt9LHRoaXMubW9ycGhBdHRyaWJ1dGVzPXt9LHRoaXMuZ3JvdXBzPVtdLHRoaXMuYm91bmRpbmdCb3g9bnVsbCx0aGlzLmJvdW5kaW5nU3BoZXJlPW51bGw7Y29uc3QgZT17fTt0aGlzLm5hbWU9dC5uYW1lO2NvbnN0IG49dC5pbmRleDtuIT09bnVsbCYmdGhpcy5zZXRJbmRleChuLmNsb25lKCkpO2NvbnN0IHM9dC5hdHRyaWJ1dGVzO2Zvcihjb25zdCBsIGluIHMpe2NvbnN0IGg9c1tsXTt0aGlzLnNldEF0dHJpYnV0ZShsLGguY2xvbmUoZSkpfWNvbnN0IHI9dC5tb3JwaEF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGwgaW4gcil7Y29uc3QgaD1bXSx1PXJbbF07Zm9yKGxldCBmPTAsZD11Lmxlbmd0aDtmPGQ7ZisrKWgucHVzaCh1W2ZdLmNsb25lKGUpKTt0aGlzLm1vcnBoQXR0cmlidXRlc1tsXT1ofXRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU9dC5tb3JwaFRhcmdldHNSZWxhdGl2ZTtjb25zdCBvPXQuZ3JvdXBzO2ZvcihsZXQgbD0wLGg9by5sZW5ndGg7bDxoO2wrKyl7Y29uc3QgdT1vW2xdO3RoaXMuYWRkR3JvdXAodS5zdGFydCx1LmNvdW50LHUubWF0ZXJpYWxJbmRleCl9Y29uc3QgYT10LmJvdW5kaW5nQm94O2EhPT1udWxsJiYodGhpcy5ib3VuZGluZ0JveD1hLmNsb25lKCkpO2NvbnN0IGM9dC5ib3VuZGluZ1NwaGVyZTtyZXR1cm4gYyE9PW51bGwmJih0aGlzLmJvdW5kaW5nU3BoZXJlPWMuY2xvbmUoKSksdGhpcy5kcmF3UmFuZ2Uuc3RhcnQ9dC5kcmF3UmFuZ2Uuc3RhcnQsdGhpcy5kcmF3UmFuZ2UuY291bnQ9dC5kcmF3UmFuZ2UuY291bnQsdGhpcy51c2VyRGF0YT10LnVzZXJEYXRhLHRoaXN9ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19Y29uc3QgZWw9bmV3IHN0LGJuPW5ldyBTbyxQcz1uZXcgWmMsbmw9bmV3IFAsQ3M9bmV3IFAsRXM9bmV3IFAsQnM9bmV3IFAsa289bmV3IFAsRnM9bmV3IFAsaWw9bmV3IFAsSXM9bmV3IFA7Y2xhc3MgaWQgZXh0ZW5kcyBJZXtjb25zdHJ1Y3Rvcih0PW5ldyBBZSxlPW5ldyBRZil7c3VwZXIoKSx0aGlzLmlzTWVzaD0hMCx0aGlzLnR5cGU9Ik1lc2giLHRoaXMuZ2VvbWV0cnk9dCx0aGlzLm1hdGVyaWFsPWUsdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9dm9pZCAwLHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPXZvaWQgMCx0aGlzLmNvdW50PTEsdGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX1jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyE9PXZvaWQgMCYmKHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPXQubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnNsaWNlKCkpLHQubW9ycGhUYXJnZXREaWN0aW9uYXJ5IT09dm9pZCAwJiYodGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9T2JqZWN0LmFzc2lnbih7fSx0Lm1vcnBoVGFyZ2V0RGljdGlvbmFyeSkpLHRoaXMubWF0ZXJpYWw9QXJyYXkuaXNBcnJheSh0Lm1hdGVyaWFsKT90Lm1hdGVyaWFsLnNsaWNlKCk6dC5tYXRlcmlhbCx0aGlzLmdlb21ldHJ5PXQuZ2VvbWV0cnksdGhpc311cGRhdGVNb3JwaFRhcmdldHMoKXtjb25zdCBlPXRoaXMuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLG49T2JqZWN0LmtleXMoZSk7aWYobi5sZW5ndGg+MCl7Y29uc3Qgcz1lW25bMF1dO2lmKHMhPT12b2lkIDApe3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPVtdLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PXt9O2ZvcihsZXQgcj0wLG89cy5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT1zW3JdLm5hbWV8fFN0cmluZyhyKTt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKDApLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5W2FdPXJ9fX19Z2V0VmVydGV4UG9zaXRpb24odCxlKXtjb25zdCBuPXRoaXMuZ2VvbWV0cnkscz1uLmF0dHJpYnV0ZXMucG9zaXRpb24scj1uLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbixvPW4ubW9ycGhUYXJnZXRzUmVsYXRpdmU7ZS5mcm9tQnVmZmVyQXR0cmlidXRlKHMsdCk7Y29uc3QgYT10aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcztpZihyJiZhKXtGcy5zZXQoMCwwLDApO2ZvcihsZXQgYz0wLGw9ci5sZW5ndGg7YzxsO2MrKyl7Y29uc3QgaD1hW2NdLHU9cltjXTtoIT09MCYmKGtvLmZyb21CdWZmZXJBdHRyaWJ1dGUodSx0KSxvP0ZzLmFkZFNjYWxlZFZlY3RvcihrbyxoKTpGcy5hZGRTY2FsZWRWZWN0b3Ioa28uc3ViKGUpLGgpKX1lLmFkZChGcyl9cmV0dXJuIGV9cmF5Y2FzdCh0LGUpe2NvbnN0IG49dGhpcy5nZW9tZXRyeSxzPXRoaXMubWF0ZXJpYWwscj10aGlzLm1hdHJpeFdvcmxkO3MhPT12b2lkIDAmJihuLmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmbi5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxQcy5jb3B5KG4uYm91bmRpbmdTcGhlcmUpLFBzLmFwcGx5TWF0cml4NChyKSxibi5jb3B5KHQucmF5KS5yZWNhc3QodC5uZWFyKSwhKFBzLmNvbnRhaW5zUG9pbnQoYm4ub3JpZ2luKT09PSExJiYoYm4uaW50ZXJzZWN0U3BoZXJlKFBzLG5sKT09PW51bGx8fGJuLm9yaWdpbi5kaXN0YW5jZVRvU3F1YXJlZChubCk+emkodC5mYXItdC5uZWFyLDIpKSkmJihlbC5jb3B5KHIpLmludmVydCgpLGJuLmNvcHkodC5yYXkpLmFwcGx5TWF0cml4NChlbCksIShuLmJvdW5kaW5nQm94IT09bnVsbCYmYm4uaW50ZXJzZWN0c0JveChuLmJvdW5kaW5nQm94KT09PSExKSYmdGhpcy5fY29tcHV0ZUludGVyc2VjdGlvbnModCxlLGJuKSkpfV9jb21wdXRlSW50ZXJzZWN0aW9ucyh0LGUsbil7bGV0IHM7Y29uc3Qgcj10aGlzLmdlb21ldHJ5LG89dGhpcy5tYXRlcmlhbCxhPXIuaW5kZXgsYz1yLmF0dHJpYnV0ZXMucG9zaXRpb24sbD1yLmF0dHJpYnV0ZXMudXYsaD1yLmF0dHJpYnV0ZXMudXYxLHU9ci5hdHRyaWJ1dGVzLm5vcm1hbCxmPXIuZ3JvdXBzLGQ9ci5kcmF3UmFuZ2U7aWYoYSE9PW51bGwpaWYoQXJyYXkuaXNBcnJheShvKSlmb3IobGV0IHA9MCx5PWYubGVuZ3RoO3A8eTtwKyspe2NvbnN0IGc9ZltwXSx3PW9bZy5tYXRlcmlhbEluZGV4XSxiPU1hdGgubWF4KGcuc3RhcnQsZC5zdGFydCkseD1NYXRoLm1pbihhLmNvdW50LE1hdGgubWluKGcuc3RhcnQrZy5jb3VudCxkLnN0YXJ0K2QuY291bnQpKTtmb3IobGV0IG09YixNPXg7bTxNO20rPTMpe2NvbnN0IFM9YS5nZXRYKG0pLEE9YS5nZXRYKG0rMSksdj1hLmdldFgobSsyKTtzPWtzKHRoaXMsdyx0LG4sbCxoLHUsUyxBLHYpLHMmJihzLmZhY2VJbmRleD1NYXRoLmZsb29yKG0vMykscy5mYWNlLm1hdGVyaWFsSW5kZXg9Zy5tYXRlcmlhbEluZGV4LGUucHVzaChzKSl9fWVsc2V7Y29uc3QgcD1NYXRoLm1heCgwLGQuc3RhcnQpLHk9TWF0aC5taW4oYS5jb3VudCxkLnN0YXJ0K2QuY291bnQpO2ZvcihsZXQgZz1wLHc9eTtnPHc7Zys9Myl7Y29uc3QgYj1hLmdldFgoZykseD1hLmdldFgoZysxKSxtPWEuZ2V0WChnKzIpO3M9a3ModGhpcyxvLHQsbixsLGgsdSxiLHgsbSkscyYmKHMuZmFjZUluZGV4PU1hdGguZmxvb3IoZy8zKSxlLnB1c2gocykpfX1lbHNlIGlmKGMhPT12b2lkIDApaWYoQXJyYXkuaXNBcnJheShvKSlmb3IobGV0IHA9MCx5PWYubGVuZ3RoO3A8eTtwKyspe2NvbnN0IGc9ZltwXSx3PW9bZy5tYXRlcmlhbEluZGV4XSxiPU1hdGgubWF4KGcuc3RhcnQsZC5zdGFydCkseD1NYXRoLm1pbihjLmNvdW50LE1hdGgubWluKGcuc3RhcnQrZy5jb3VudCxkLnN0YXJ0K2QuY291bnQpKTtmb3IobGV0IG09YixNPXg7bTxNO20rPTMpe2NvbnN0IFM9bSxBPW0rMSx2PW0rMjtzPWtzKHRoaXMsdyx0LG4sbCxoLHUsUyxBLHYpLHMmJihzLmZhY2VJbmRleD1NYXRoLmZsb29yKG0vMykscy5mYWNlLm1hdGVyaWFsSW5kZXg9Zy5tYXRlcmlhbEluZGV4LGUucHVzaChzKSl9fWVsc2V7Y29uc3QgcD1NYXRoLm1heCgwLGQuc3RhcnQpLHk9TWF0aC5taW4oYy5jb3VudCxkLnN0YXJ0K2QuY291bnQpO2ZvcihsZXQgZz1wLHc9eTtnPHc7Zys9Myl7Y29uc3QgYj1nLHg9ZysxLG09ZysyO3M9a3ModGhpcyxvLHQsbixsLGgsdSxiLHgsbSkscyYmKHMuZmFjZUluZGV4PU1hdGguZmxvb3IoZy8zKSxlLnB1c2gocykpfX19fWZ1bmN0aW9uIHNkKGksdCxlLG4scyxyLG8sYSl7bGV0IGM7aWYodC5zaWRlPT09MT9jPW4uaW50ZXJzZWN0VHJpYW5nbGUobyxyLHMsITAsYSk6Yz1uLmludGVyc2VjdFRyaWFuZ2xlKHMscixvLHQuc2lkZT09PTAsYSksYz09PW51bGwpcmV0dXJuIG51bGw7SXMuY29weShhKSxJcy5hcHBseU1hdHJpeDQoaS5tYXRyaXhXb3JsZCk7Y29uc3QgbD1lLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhJcyk7cmV0dXJuIGw8ZS5uZWFyfHxsPmUuZmFyP251bGw6e2Rpc3RhbmNlOmwscG9pbnQ6SXMuY2xvbmUoKSxvYmplY3Q6aX19ZnVuY3Rpb24ga3MoaSx0LGUsbixzLHIsbyxhLGMsbCl7aS5nZXRWZXJ0ZXhQb3NpdGlvbihhLENzKSxpLmdldFZlcnRleFBvc2l0aW9uKGMsRXMpLGkuZ2V0VmVydGV4UG9zaXRpb24obCxCcyk7Y29uc3QgaD1zZChpLHQsZSxuLENzLEVzLEJzLGlsKTtpZihoKXtjb25zdCB1PW5ldyBQO2V0LmdldEJhcnljb29yZChpbCxDcyxFcyxCcyx1KSxzJiYoaC51dj1ldC5nZXRJbnRlcnBvbGF0ZWRBdHRyaWJ1dGUocyxhLGMsbCx1LG5ldyBrKSksciYmKGgudXYxPWV0LmdldEludGVycG9sYXRlZEF0dHJpYnV0ZShyLGEsYyxsLHUsbmV3IGspKSxvJiYoaC5ub3JtYWw9ZXQuZ2V0SW50ZXJwb2xhdGVkQXR0cmlidXRlKG8sYSxjLGwsdSxuZXcgUCksaC5ub3JtYWwuZG90KG4uZGlyZWN0aW9uKT4wJiZoLm5vcm1hbC5tdWx0aXBseVNjYWxhcigtMSkpO2NvbnN0IGY9e2EsYjpjLGM6bCxub3JtYWw6bmV3IFAsbWF0ZXJpYWxJbmRleDowfTtldC5nZXROb3JtYWwoQ3MsRXMsQnMsZi5ub3JtYWwpLGguZmFjZT1mLGguYmFyeWNvb3JkPXV9cmV0dXJuIGh9Y29uc3QgTm89bmV3IFAscmQ9bmV3IFAsb2Q9bmV3IE1lO2NsYXNzIFJve2NvbnN0cnVjdG9yKHQ9bmV3IFAoMSwwLDApLGU9MCl7dGhpcy5pc1BsYW5lPSEwLHRoaXMubm9ybWFsPXQsdGhpcy5jb25zdGFudD1lfXNldCh0LGUpe3JldHVybiB0aGlzLm5vcm1hbC5jb3B5KHQpLHRoaXMuY29uc3RhbnQ9ZSx0aGlzfXNldENvbXBvbmVudHModCxlLG4scyl7cmV0dXJuIHRoaXMubm9ybWFsLnNldCh0LGUsbiksdGhpcy5jb25zdGFudD1zLHRoaXN9c2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWwuY29weSh0KSx0aGlzLmNvbnN0YW50PS1lLmRvdCh0aGlzLm5vcm1hbCksdGhpc31zZXRGcm9tQ29wbGFuYXJQb2ludHModCxlLG4pe2NvbnN0IHM9Tm8uc3ViVmVjdG9ycyhuLGUpLmNyb3NzKHJkLnN1YlZlY3RvcnModCxlKSkubm9ybWFsaXplKCk7cmV0dXJuIHRoaXMuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQocyx0KSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMubm9ybWFsLmNvcHkodC5ub3JtYWwpLHRoaXMuY29uc3RhbnQ9dC5jb25zdGFudCx0aGlzfW5vcm1hbGl6ZSgpe2NvbnN0IHQ9MS90aGlzLm5vcm1hbC5sZW5ndGgoKTtyZXR1cm4gdGhpcy5ub3JtYWwubXVsdGlwbHlTY2FsYXIodCksdGhpcy5jb25zdGFudCo9dCx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLmNvbnN0YW50Kj0tMSx0aGlzLm5vcm1hbC5uZWdhdGUoKSx0aGlzfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdGhpcy5ub3JtYWwuZG90KHQpK3RoaXMuY29uc3RhbnR9ZGlzdGFuY2VUb1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQodC5jZW50ZXIpLXQucmFkaXVzfXByb2plY3RQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodCkuYWRkU2NhbGVkVmVjdG9yKHRoaXMubm9ybWFsLC10aGlzLmRpc3RhbmNlVG9Qb2ludCh0KSl9aW50ZXJzZWN0TGluZSh0LGUpe2NvbnN0IG49dC5kZWx0YShObykscz10aGlzLm5vcm1hbC5kb3Qobik7aWYocz09PTApcmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KHQuc3RhcnQpPT09MD9lLmNvcHkodC5zdGFydCk6bnVsbDtjb25zdCByPS0odC5zdGFydC5kb3QodGhpcy5ub3JtYWwpK3RoaXMuY29uc3RhbnQpL3M7cmV0dXJuIHI8MHx8cj4xP251bGw6ZS5jb3B5KHQuc3RhcnQpLmFkZFNjYWxlZFZlY3RvcihuLHIpfWludGVyc2VjdHNMaW5lKHQpe2NvbnN0IGU9dGhpcy5kaXN0YW5jZVRvUG9pbnQodC5zdGFydCksbj10aGlzLmRpc3RhbmNlVG9Qb2ludCh0LmVuZCk7cmV0dXJuIGU8MCYmbj4wfHxuPDAmJmU+MH1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1jb3BsYW5hclBvaW50KHQpe3JldHVybiB0LmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmNvbnN0YW50KX1hcHBseU1hdHJpeDQodCxlKXtjb25zdCBuPWV8fG9kLmdldE5vcm1hbE1hdHJpeCh0KSxzPXRoaXMuY29wbGFuYXJQb2ludChObykuYXBwbHlNYXRyaXg0KHQpLHI9dGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKG4pLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzLmNvbnN0YW50PS1zLmRvdChyKSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5jb25zdGFudC09dC5kb3QodGhpcy5ub3JtYWwpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm5vcm1hbC5lcXVhbHModGhpcy5ub3JtYWwpJiZ0LmNvbnN0YW50PT09dGhpcy5jb25zdGFudH1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWNsYXNzIFNle2NvbnN0cnVjdG9yKCl7dGhpcy50eXBlPSJDdXJ2ZSIsdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9MjAwLHRoaXMubmVlZHNVcGRhdGU9ITEsdGhpcy5jYWNoZUFyY0xlbmd0aHM9bnVsbH1nZXRQb2ludCgpe2J0KCJDdXJ2ZTogLmdldFBvaW50KCkgbm90IGltcGxlbWVudGVkLiIpfWdldFBvaW50QXQodCxlKXtjb25zdCBuPXRoaXMuZ2V0VXRvVG1hcHBpbmcodCk7cmV0dXJuIHRoaXMuZ2V0UG9pbnQobixlKX1nZXRQb2ludHModD01KXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248PXQ7bisrKWUucHVzaCh0aGlzLmdldFBvaW50KG4vdCkpO3JldHVybiBlfWdldFNwYWNlZFBvaW50cyh0PTUpe2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjw9dDtuKyspZS5wdXNoKHRoaXMuZ2V0UG9pbnRBdChuL3QpKTtyZXR1cm4gZX1nZXRMZW5ndGgoKXtjb25zdCB0PXRoaXMuZ2V0TGVuZ3RocygpO3JldHVybiB0W3QubGVuZ3RoLTFdfWdldExlbmd0aHModD10aGlzLmFyY0xlbmd0aERpdmlzaW9ucyl7aWYodGhpcy5jYWNoZUFyY0xlbmd0aHMmJnRoaXMuY2FjaGVBcmNMZW5ndGhzLmxlbmd0aD09PXQrMSYmIXRoaXMubmVlZHNVcGRhdGUpcmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzO3RoaXMubmVlZHNVcGRhdGU9ITE7Y29uc3QgZT1bXTtsZXQgbixzPXRoaXMuZ2V0UG9pbnQoMCkscj0wO2UucHVzaCgwKTtmb3IobGV0IG89MTtvPD10O28rKyluPXRoaXMuZ2V0UG9pbnQoby90KSxyKz1uLmRpc3RhbmNlVG8ocyksZS5wdXNoKHIpLHM9bjtyZXR1cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM9ZSxlfXVwZGF0ZUFyY0xlbmd0aHMoKXt0aGlzLm5lZWRzVXBkYXRlPSEwLHRoaXMuZ2V0TGVuZ3RocygpfWdldFV0b1RtYXBwaW5nKHQsZT1udWxsKXtjb25zdCBuPXRoaXMuZ2V0TGVuZ3RocygpO2xldCBzPTA7Y29uc3Qgcj1uLmxlbmd0aDtsZXQgbztlP289ZTpvPXQqbltyLTFdO2xldCBhPTAsYz1yLTEsbDtmb3IoO2E8PWM7KWlmKHM9TWF0aC5mbG9vcihhKyhjLWEpLzIpLGw9bltzXS1vLGw8MClhPXMrMTtlbHNlIGlmKGw+MCljPXMtMTtlbHNle2M9czticmVha31pZihzPWMsbltzXT09PW8pcmV0dXJuIHMvKHItMSk7Y29uc3QgaD1uW3NdLGY9bltzKzFdLWgsZD0oby1oKS9mO3JldHVybihzK2QpLyhyLTEpfWdldFRhbmdlbnQodCxlKXtsZXQgcz10LTFlLTQscj10KzFlLTQ7czwwJiYocz0wKSxyPjEmJihyPTEpO2NvbnN0IG89dGhpcy5nZXRQb2ludChzKSxhPXRoaXMuZ2V0UG9pbnQociksYz1lfHwoby5pc1ZlY3RvcjI/bmV3IGs6bmV3IFApO3JldHVybiBjLmNvcHkoYSkuc3ViKG8pLm5vcm1hbGl6ZSgpLGN9Z2V0VGFuZ2VudEF0KHQsZSl7Y29uc3Qgbj10aGlzLmdldFV0b1RtYXBwaW5nKHQpO3JldHVybiB0aGlzLmdldFRhbmdlbnQobixlKX1jb21wdXRlRnJlbmV0RnJhbWVzKHQsZT0hMSl7Y29uc3Qgbj1uZXcgUCxzPVtdLHI9W10sbz1bXSxhPW5ldyBQLGM9bmV3IHN0O2ZvcihsZXQgZD0wO2Q8PXQ7ZCsrKXtjb25zdCBwPWQvdDtzW2RdPXRoaXMuZ2V0VGFuZ2VudEF0KHAsbmV3IFApfXJbMF09bmV3IFAsb1swXT1uZXcgUDtsZXQgbD1OdW1iZXIuTUFYX1ZBTFVFO2NvbnN0IGg9TWF0aC5hYnMoc1swXS54KSx1PU1hdGguYWJzKHNbMF0ueSksZj1NYXRoLmFicyhzWzBdLnopO2g8PWwmJihsPWgsbi5zZXQoMSwwLDApKSx1PD1sJiYobD11LG4uc2V0KDAsMSwwKSksZjw9bCYmbi5zZXQoMCwwLDEpLGEuY3Jvc3NWZWN0b3JzKHNbMF0sbikubm9ybWFsaXplKCksclswXS5jcm9zc1ZlY3RvcnMoc1swXSxhKSxvWzBdLmNyb3NzVmVjdG9ycyhzWzBdLHJbMF0pO2ZvcihsZXQgZD0xO2Q8PXQ7ZCsrKXtpZihyW2RdPXJbZC0xXS5jbG9uZSgpLG9bZF09b1tkLTFdLmNsb25lKCksYS5jcm9zc1ZlY3RvcnMoc1tkLTFdLHNbZF0pLGEubGVuZ3RoKCk+TnVtYmVyLkVQU0lMT04pe2Eubm9ybWFsaXplKCk7Y29uc3QgcD1NYXRoLmFjb3MoWihzW2QtMV0uZG90KHNbZF0pLC0xLDEpKTtyW2RdLmFwcGx5TWF0cml4NChjLm1ha2VSb3RhdGlvbkF4aXMoYSxwKSl9b1tkXS5jcm9zc1ZlY3RvcnMoc1tkXSxyW2RdKX1pZihlPT09ITApe2xldCBkPU1hdGguYWNvcyhaKHJbMF0uZG90KHJbdF0pLC0xLDEpKTtkLz10LHNbMF0uZG90KGEuY3Jvc3NWZWN0b3JzKHJbMF0sclt0XSkpPjAmJihkPS1kKTtmb3IobGV0IHA9MTtwPD10O3ArKylyW3BdLmFwcGx5TWF0cml4NChjLm1ha2VSb3RhdGlvbkF4aXMoc1twXSxkKnApKSxvW3BdLmNyb3NzVmVjdG9ycyhzW3BdLHJbcF0pfXJldHVybnt0YW5nZW50czpzLG5vcm1hbHM6cixiaW5vcm1hbHM6b319Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPXQuYXJjTGVuZ3RoRGl2aXNpb25zLHRoaXN9dG9KU09OKCl7Y29uc3QgdD17bWV0YWRhdGE6e3ZlcnNpb246NC43LHR5cGU6IkN1cnZlIixnZW5lcmF0b3I6IkN1cnZlLnRvSlNPTiJ9fTtyZXR1cm4gdC5hcmNMZW5ndGhEaXZpc2lvbnM9dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMsdC50eXBlPXRoaXMudHlwZSx0fWZyb21KU09OKHQpe3JldHVybiB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucz10LmFyY0xlbmd0aERpdmlzaW9ucyx0aGlzfX1jbGFzcyBOcyBleHRlbmRzIFNle2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0xLHM9MSxyPTAsbz1NYXRoLlBJKjIsYT0hMSxjPTApe3N1cGVyKCksdGhpcy5pc0VsbGlwc2VDdXJ2ZT0hMCx0aGlzLnR5cGU9IkVsbGlwc2VDdXJ2ZSIsdGhpcy5hWD10LHRoaXMuYVk9ZSx0aGlzLnhSYWRpdXM9bix0aGlzLnlSYWRpdXM9cyx0aGlzLmFTdGFydEFuZ2xlPXIsdGhpcy5hRW5kQW5nbGU9byx0aGlzLmFDbG9ja3dpc2U9YSx0aGlzLmFSb3RhdGlvbj1jfWdldFBvaW50KHQsZT1uZXcgayl7Y29uc3Qgbj1lLHM9TWF0aC5QSSoyO2xldCByPXRoaXMuYUVuZEFuZ2xlLXRoaXMuYVN0YXJ0QW5nbGU7Y29uc3Qgbz1NYXRoLmFicyhyKTxOdW1iZXIuRVBTSUxPTjtmb3IoO3I8MDspcis9cztmb3IoO3I+czspci09cztyPE51bWJlci5FUFNJTE9OJiYobz9yPTA6cj1zKSx0aGlzLmFDbG9ja3dpc2U9PT0hMCYmIW8mJihyPT09cz9yPS1zOnI9ci1zKTtjb25zdCBhPXRoaXMuYVN0YXJ0QW5nbGUrdCpyO2xldCBjPXRoaXMuYVgrdGhpcy54UmFkaXVzKk1hdGguY29zKGEpLGw9dGhpcy5hWSt0aGlzLnlSYWRpdXMqTWF0aC5zaW4oYSk7aWYodGhpcy5hUm90YXRpb24hPT0wKXtjb25zdCBoPU1hdGguY29zKHRoaXMuYVJvdGF0aW9uKSx1PU1hdGguc2luKHRoaXMuYVJvdGF0aW9uKSxmPWMtdGhpcy5hWCxkPWwtdGhpcy5hWTtjPWYqaC1kKnUrdGhpcy5hWCxsPWYqdStkKmgrdGhpcy5hWX1yZXR1cm4gbi5zZXQoYyxsKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuYVg9dC5hWCx0aGlzLmFZPXQuYVksdGhpcy54UmFkaXVzPXQueFJhZGl1cyx0aGlzLnlSYWRpdXM9dC55UmFkaXVzLHRoaXMuYVN0YXJ0QW5nbGU9dC5hU3RhcnRBbmdsZSx0aGlzLmFFbmRBbmdsZT10LmFFbmRBbmdsZSx0aGlzLmFDbG9ja3dpc2U9dC5hQ2xvY2t3aXNlLHRoaXMuYVJvdGF0aW9uPXQuYVJvdGF0aW9uLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC5hWD10aGlzLmFYLHQuYVk9dGhpcy5hWSx0LnhSYWRpdXM9dGhpcy54UmFkaXVzLHQueVJhZGl1cz10aGlzLnlSYWRpdXMsdC5hU3RhcnRBbmdsZT10aGlzLmFTdGFydEFuZ2xlLHQuYUVuZEFuZ2xlPXRoaXMuYUVuZEFuZ2xlLHQuYUNsb2Nrd2lzZT10aGlzLmFDbG9ja3dpc2UsdC5hUm90YXRpb249dGhpcy5hUm90YXRpb24sdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy5hWD10LmFYLHRoaXMuYVk9dC5hWSx0aGlzLnhSYWRpdXM9dC54UmFkaXVzLHRoaXMueVJhZGl1cz10LnlSYWRpdXMsdGhpcy5hU3RhcnRBbmdsZT10LmFTdGFydEFuZ2xlLHRoaXMuYUVuZEFuZ2xlPXQuYUVuZEFuZ2xlLHRoaXMuYUNsb2Nrd2lzZT10LmFDbG9ja3dpc2UsdGhpcy5hUm90YXRpb249dC5hUm90YXRpb24sdGhpc319Y2xhc3Mgc2wgZXh0ZW5kcyBOc3tjb25zdHJ1Y3Rvcih0LGUsbixzLHIsbyl7c3VwZXIodCxlLG4sbixzLHIsbyksdGhpcy5pc0FyY0N1cnZlPSEwLHRoaXMudHlwZT0iQXJjQ3VydmUifX1mdW5jdGlvbiBMbygpe2xldCBpPTAsdD0wLGU9MCxuPTA7ZnVuY3Rpb24gcyhyLG8sYSxjKXtpPXIsdD1hLGU9LTMqciszKm8tMiphLWMsbj0yKnItMipvK2ErY31yZXR1cm57aW5pdENhdG11bGxSb206ZnVuY3Rpb24ocixvLGEsYyxsKXtzKG8sYSxsKihhLXIpLGwqKGMtbykpfSxpbml0Tm9udW5pZm9ybUNhdG11bGxSb206ZnVuY3Rpb24ocixvLGEsYyxsLGgsdSl7bGV0IGY9KG8tcikvbC0oYS1yKS8obCtoKSsoYS1vKS9oLGQ9KGEtbykvaC0oYy1vKS8oaCt1KSsoYy1hKS91O2YqPWgsZCo9aCxzKG8sYSxmLGQpfSxjYWxjOmZ1bmN0aW9uKHIpe2NvbnN0IG89cipyLGE9bypyO3JldHVybiBpK3QqcitlKm8rbiphfX19Y29uc3QgUnM9bmV3IFAsT289bmV3IExvLERvPW5ldyBMbywkbz1uZXcgTG87Y2xhc3MgcmwgZXh0ZW5kcyBTZXtjb25zdHJ1Y3Rvcih0PVtdLGU9ITEsbj0iY2VudHJpcGV0YWwiLHM9LjUpe3N1cGVyKCksdGhpcy5pc0NhdG11bGxSb21DdXJ2ZTM9ITAsdGhpcy50eXBlPSJDYXRtdWxsUm9tQ3VydmUzIix0aGlzLnBvaW50cz10LHRoaXMuY2xvc2VkPWUsdGhpcy5jdXJ2ZVR5cGU9bix0aGlzLnRlbnNpb249c31nZXRQb2ludCh0LGU9bmV3IFApe2NvbnN0IG49ZSxzPXRoaXMucG9pbnRzLHI9cy5sZW5ndGgsbz0oci0odGhpcy5jbG9zZWQ/MDoxKSkqdDtsZXQgYT1NYXRoLmZsb29yKG8pLGM9by1hO3RoaXMuY2xvc2VkP2ErPWE+MD8wOihNYXRoLmZsb29yKE1hdGguYWJzKGEpL3IpKzEpKnI6Yz09PTAmJmE9PT1yLTEmJihhPXItMixjPTEpO2xldCBsLGg7dGhpcy5jbG9zZWR8fGE+MD9sPXNbKGEtMSklcl06KFJzLnN1YlZlY3RvcnMoc1swXSxzWzFdKS5hZGQoc1swXSksbD1Scyk7Y29uc3QgdT1zW2Elcl0sZj1zWyhhKzEpJXJdO2lmKHRoaXMuY2xvc2VkfHxhKzI8cj9oPXNbKGErMiklcl06KFJzLnN1YlZlY3RvcnMoc1tyLTFdLHNbci0yXSkuYWRkKHNbci0xXSksaD1ScyksdGhpcy5jdXJ2ZVR5cGU9PT0iY2VudHJpcGV0YWwifHx0aGlzLmN1cnZlVHlwZT09PSJjaG9yZGFsIil7Y29uc3QgZD10aGlzLmN1cnZlVHlwZT09PSJjaG9yZGFsIj8uNTouMjU7bGV0IHA9TWF0aC5wb3cobC5kaXN0YW5jZVRvU3F1YXJlZCh1KSxkKSx5PU1hdGgucG93KHUuZGlzdGFuY2VUb1NxdWFyZWQoZiksZCksZz1NYXRoLnBvdyhmLmRpc3RhbmNlVG9TcXVhcmVkKGgpLGQpO3k8MWUtNCYmKHk9MSkscDwxZS00JiYocD15KSxnPDFlLTQmJihnPXkpLE9vLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShsLngsdS54LGYueCxoLngscCx5LGcpLERvLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShsLnksdS55LGYueSxoLnkscCx5LGcpLCRvLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShsLnosdS56LGYueixoLnoscCx5LGcpfWVsc2UgdGhpcy5jdXJ2ZVR5cGU9PT0iY2F0bXVsbHJvbSImJihPby5pbml0Q2F0bXVsbFJvbShsLngsdS54LGYueCxoLngsdGhpcy50ZW5zaW9uKSxEby5pbml0Q2F0bXVsbFJvbShsLnksdS55LGYueSxoLnksdGhpcy50ZW5zaW9uKSwkby5pbml0Q2F0bXVsbFJvbShsLnosdS56LGYueixoLnosdGhpcy50ZW5zaW9uKSk7cmV0dXJuIG4uc2V0KE9vLmNhbGMoYyksRG8uY2FsYyhjKSwkby5jYWxjKGMpKSxufWNvcHkodCl7c3VwZXIuY29weSh0KSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IGU9MCxuPXQucG9pbnRzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQucG9pbnRzW2VdO3RoaXMucG9pbnRzLnB1c2gocy5jbG9uZSgpKX1yZXR1cm4gdGhpcy5jbG9zZWQ9dC5jbG9zZWQsdGhpcy5jdXJ2ZVR5cGU9dC5jdXJ2ZVR5cGUsdGhpcy50ZW5zaW9uPXQudGVuc2lvbix0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC5wb2ludHM9W107Zm9yKGxldCBlPTAsbj10aGlzLnBvaW50cy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10aGlzLnBvaW50c1tlXTt0LnBvaW50cy5wdXNoKHMudG9BcnJheSgpKX1yZXR1cm4gdC5jbG9zZWQ9dGhpcy5jbG9zZWQsdC5jdXJ2ZVR5cGU9dGhpcy5jdXJ2ZVR5cGUsdC50ZW5zaW9uPXRoaXMudGVuc2lvbix0fWZyb21KU09OKHQpe3N1cGVyLmZyb21KU09OKHQpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dC5wb2ludHMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dC5wb2ludHNbZV07dGhpcy5wb2ludHMucHVzaChuZXcgUCgpLmZyb21BcnJheShzKSl9cmV0dXJuIHRoaXMuY2xvc2VkPXQuY2xvc2VkLHRoaXMuY3VydmVUeXBlPXQuY3VydmVUeXBlLHRoaXMudGVuc2lvbj10LnRlbnNpb24sdGhpc319ZnVuY3Rpb24gb2woaSx0LGUsbixzKXtjb25zdCByPShuLXQpKi41LG89KHMtZSkqLjUsYT1pKmksYz1pKmE7cmV0dXJuKDIqZS0yKm4rcitvKSpjKygtMyplKzMqbi0yKnItbykqYStyKmkrZX1mdW5jdGlvbiBhZChpLHQpe2NvbnN0IGU9MS1pO3JldHVybiBlKmUqdH1mdW5jdGlvbiBjZChpLHQpe3JldHVybiAyKigxLWkpKmkqdH1mdW5jdGlvbiBsZChpLHQpe3JldHVybiBpKmkqdH1mdW5jdGlvbiBraShpLHQsZSxuKXtyZXR1cm4gYWQoaSx0KStjZChpLGUpK2xkKGksbil9ZnVuY3Rpb24gaGQoaSx0KXtjb25zdCBlPTEtaTtyZXR1cm4gZSplKmUqdH1mdW5jdGlvbiB1ZChpLHQpe2NvbnN0IGU9MS1pO3JldHVybiAzKmUqZSppKnR9ZnVuY3Rpb24gZmQoaSx0KXtyZXR1cm4gMyooMS1pKSppKmkqdH1mdW5jdGlvbiBkZChpLHQpe3JldHVybiBpKmkqaSp0fWZ1bmN0aW9uIE5pKGksdCxlLG4scyl7cmV0dXJuIGhkKGksdCkrdWQoaSxlKStmZChpLG4pK2RkKGkscyl9Y2xhc3MgVm8gZXh0ZW5kcyBTZXtjb25zdHJ1Y3Rvcih0PW5ldyBrLGU9bmV3IGssbj1uZXcgayxzPW5ldyBrKXtzdXBlcigpLHRoaXMuaXNDdWJpY0JlemllckN1cnZlPSEwLHRoaXMudHlwZT0iQ3ViaWNCZXppZXJDdXJ2ZSIsdGhpcy52MD10LHRoaXMudjE9ZSx0aGlzLnYyPW4sdGhpcy52Mz1zfWdldFBvaW50KHQsZT1uZXcgayl7Y29uc3Qgbj1lLHM9dGhpcy52MCxyPXRoaXMudjEsbz10aGlzLnYyLGE9dGhpcy52MztyZXR1cm4gbi5zZXQoTmkodCxzLngsci54LG8ueCxhLngpLE5pKHQscy55LHIueSxvLnksYS55KSksbn1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXMudjMuY29weSh0LnYzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHQudjM9dGhpcy52My50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpcy52My5mcm9tQXJyYXkodC52MyksdGhpc319Y2xhc3MgYWwgZXh0ZW5kcyBTZXtjb25zdHJ1Y3Rvcih0PW5ldyBQLGU9bmV3IFAsbj1uZXcgUCxzPW5ldyBQKXtzdXBlcigpLHRoaXMuaXNDdWJpY0JlemllckN1cnZlMz0hMCx0aGlzLnR5cGU9IkN1YmljQmV6aWVyQ3VydmUzIix0aGlzLnYwPXQsdGhpcy52MT1lLHRoaXMudjI9bix0aGlzLnYzPXN9Z2V0UG9pbnQodCxlPW5ldyBQKXtjb25zdCBuPWUscz10aGlzLnYwLHI9dGhpcy52MSxvPXRoaXMudjIsYT10aGlzLnYzO3JldHVybiBuLnNldChOaSh0LHMueCxyLngsby54LGEueCksTmkodCxzLnksci55LG8ueSxhLnkpLE5pKHQscy56LHIueixvLnosYS56KSksbn1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXMudjMuY29weSh0LnYzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHQudjM9dGhpcy52My50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpcy52My5mcm9tQXJyYXkodC52MyksdGhpc319Y2xhc3MgVW8gZXh0ZW5kcyBTZXtjb25zdHJ1Y3Rvcih0PW5ldyBrLGU9bmV3IGspe3N1cGVyKCksdGhpcy5pc0xpbmVDdXJ2ZT0hMCx0aGlzLnR5cGU9IkxpbmVDdXJ2ZSIsdGhpcy52MT10LHRoaXMudjI9ZX1nZXRQb2ludCh0LGU9bmV3IGspe2NvbnN0IG49ZTtyZXR1cm4gdD09PTE/bi5jb3B5KHRoaXMudjIpOihuLmNvcHkodGhpcy52Mikuc3ViKHRoaXMudjEpLG4ubXVsdGlwbHlTY2FsYXIodCkuYWRkKHRoaXMudjEpKSxufWdldFBvaW50QXQodCxlKXtyZXR1cm4gdGhpcy5nZXRQb2ludCh0LGUpfWdldFRhbmdlbnQodCxlPW5ldyBrKXtyZXR1cm4gZS5zdWJWZWN0b3JzKHRoaXMudjIsdGhpcy52MSkubm9ybWFsaXplKCl9Z2V0VGFuZ2VudEF0KHQsZSl7cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudCh0LGUpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzfX1jbGFzcyBjbCBleHRlbmRzIFNle2NvbnN0cnVjdG9yKHQ9bmV3IFAsZT1uZXcgUCl7c3VwZXIoKSx0aGlzLmlzTGluZUN1cnZlMz0hMCx0aGlzLnR5cGU9IkxpbmVDdXJ2ZTMiLHRoaXMudjE9dCx0aGlzLnYyPWV9Z2V0UG9pbnQodCxlPW5ldyBQKXtjb25zdCBuPWU7cmV0dXJuIHQ9PT0xP24uY29weSh0aGlzLnYyKToobi5jb3B5KHRoaXMudjIpLnN1Yih0aGlzLnYxKSxuLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLnYxKSksbn1nZXRQb2ludEF0KHQsZSl7cmV0dXJuIHRoaXMuZ2V0UG9pbnQodCxlKX1nZXRUYW5nZW50KHQsZT1uZXcgUCl7cmV0dXJuIGUuc3ViVmVjdG9ycyh0aGlzLnYyLHRoaXMudjEpLm5vcm1hbGl6ZSgpfWdldFRhbmdlbnRBdCh0LGUpe3JldHVybiB0aGlzLmdldFRhbmdlbnQodCxlKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYxPXRoaXMudjEudG9BcnJheSgpLHQudjI9dGhpcy52Mi50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpc319Y2xhc3MgcW8gZXh0ZW5kcyBTZXtjb25zdHJ1Y3Rvcih0PW5ldyBrLGU9bmV3IGssbj1uZXcgayl7c3VwZXIoKSx0aGlzLmlzUXVhZHJhdGljQmV6aWVyQ3VydmU9ITAsdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZSIsdGhpcy52MD10LHRoaXMudjE9ZSx0aGlzLnYyPW59Z2V0UG9pbnQodCxlPW5ldyBrKXtjb25zdCBuPWUscz10aGlzLnYwLHI9dGhpcy52MSxvPXRoaXMudjI7cmV0dXJuIG4uc2V0KGtpKHQscy54LHIueCxvLngpLGtpKHQscy55LHIueSxvLnkpKSxufWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MC5jb3B5KHQudjApLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYwPXRoaXMudjAudG9BcnJheSgpLHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYwLmZyb21BcnJheSh0LnYwKSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzfX1jbGFzcyBsbCBleHRlbmRzIFNle2NvbnN0cnVjdG9yKHQ9bmV3IFAsZT1uZXcgUCxuPW5ldyBQKXtzdXBlcigpLHRoaXMuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZTM9ITAsdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZTMiLHRoaXMudjA9dCx0aGlzLnYxPWUsdGhpcy52Mj1ufWdldFBvaW50KHQsZT1uZXcgUCl7Y29uc3Qgbj1lLHM9dGhpcy52MCxyPXRoaXMudjEsbz10aGlzLnYyO3JldHVybiBuLnNldChraSh0LHMueCxyLngsby54KSxraSh0LHMueSxyLnksby55KSxraSh0LHMueixyLnosby56KSksbn1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC52MD10aGlzLnYwLnRvQXJyYXkoKSx0LnYxPXRoaXMudjEudG9BcnJheSgpLHQudjI9dGhpcy52Mi50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpc319Y2xhc3MgWG8gZXh0ZW5kcyBTZXtjb25zdHJ1Y3Rvcih0PVtdKXtzdXBlcigpLHRoaXMuaXNTcGxpbmVDdXJ2ZT0hMCx0aGlzLnR5cGU9IlNwbGluZUN1cnZlIix0aGlzLnBvaW50cz10fWdldFBvaW50KHQsZT1uZXcgayl7Y29uc3Qgbj1lLHM9dGhpcy5wb2ludHMscj0ocy5sZW5ndGgtMSkqdCxvPU1hdGguZmxvb3IociksYT1yLW8sYz1zW289PT0wP286by0xXSxsPXNbb10saD1zW28+cy5sZW5ndGgtMj9zLmxlbmd0aC0xOm8rMV0sdT1zW28+cy5sZW5ndGgtMz9zLmxlbmd0aC0xOm8rMl07cmV0dXJuIG4uc2V0KG9sKGEsYy54LGwueCxoLngsdS54KSxvbChhLGMueSxsLnksaC55LHUueSkpLG59Y29weSh0KXtzdXBlci5jb3B5KHQpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dC5wb2ludHMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dC5wb2ludHNbZV07dGhpcy5wb2ludHMucHVzaChzLmNsb25lKCkpfXJldHVybiB0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC5wb2ludHM9W107Zm9yKGxldCBlPTAsbj10aGlzLnBvaW50cy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10aGlzLnBvaW50c1tlXTt0LnBvaW50cy5wdXNoKHMudG9BcnJheSgpKX1yZXR1cm4gdH1mcm9tSlNPTih0KXtzdXBlci5mcm9tSlNPTih0KSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IGU9MCxuPXQucG9pbnRzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQucG9pbnRzW2VdO3RoaXMucG9pbnRzLnB1c2gobmV3IGsoKS5mcm9tQXJyYXkocykpfXJldHVybiB0aGlzfX12YXIgaGw9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQXJjQ3VydmU6c2wsQ2F0bXVsbFJvbUN1cnZlMzpybCxDdWJpY0JlemllckN1cnZlOlZvLEN1YmljQmV6aWVyQ3VydmUzOmFsLEVsbGlwc2VDdXJ2ZTpOcyxMaW5lQ3VydmU6VW8sTGluZUN1cnZlMzpjbCxRdWFkcmF0aWNCZXppZXJDdXJ2ZTpxbyxRdWFkcmF0aWNCZXppZXJDdXJ2ZTM6bGwsU3BsaW5lQ3VydmU6WG99KTtjbGFzcyBwZCBleHRlbmRzIFNle2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLnR5cGU9IkN1cnZlUGF0aCIsdGhpcy5jdXJ2ZXM9W10sdGhpcy5hdXRvQ2xvc2U9ITF9YWRkKHQpe3RoaXMuY3VydmVzLnB1c2godCl9Y2xvc2VQYXRoKCl7Y29uc3QgdD10aGlzLmN1cnZlc1swXS5nZXRQb2ludCgwKSxlPXRoaXMuY3VydmVzW3RoaXMuY3VydmVzLmxlbmd0aC0xXS5nZXRQb2ludCgxKTtpZighdC5lcXVhbHMoZSkpe2NvbnN0IG49dC5pc1ZlY3RvcjI9PT0hMD8iTGluZUN1cnZlIjoiTGluZUN1cnZlMyI7dGhpcy5jdXJ2ZXMucHVzaChuZXcgaGxbbl0oZSx0KSl9cmV0dXJuIHRoaXN9Z2V0UG9pbnQodCxlKXtjb25zdCBuPXQqdGhpcy5nZXRMZW5ndGgoKSxzPXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7bGV0IHI9MDtmb3IoO3I8cy5sZW5ndGg7KXtpZihzW3JdPj1uKXtjb25zdCBvPXNbcl0tbixhPXRoaXMuY3VydmVzW3JdLGM9YS5nZXRMZW5ndGgoKSxsPWM9PT0wPzA6MS1vL2M7cmV0dXJuIGEuZ2V0UG9pbnRBdChsLGUpfXIrK31yZXR1cm4gbnVsbH1nZXRMZW5ndGgoKXtjb25zdCB0PXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7cmV0dXJuIHRbdC5sZW5ndGgtMV19dXBkYXRlQXJjTGVuZ3Rocygpe3RoaXMubmVlZHNVcGRhdGU9ITAsdGhpcy5jYWNoZUxlbmd0aHM9bnVsbCx0aGlzLmdldEN1cnZlTGVuZ3RocygpfWdldEN1cnZlTGVuZ3Rocygpe2lmKHRoaXMuY2FjaGVMZW5ndGhzJiZ0aGlzLmNhY2hlTGVuZ3Rocy5sZW5ndGg9PT10aGlzLmN1cnZlcy5sZW5ndGgpcmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzO2NvbnN0IHQ9W107bGV0IGU9MDtmb3IobGV0IG49MCxzPXRoaXMuY3VydmVzLmxlbmd0aDtuPHM7bisrKWUrPXRoaXMuY3VydmVzW25dLmdldExlbmd0aCgpLHQucHVzaChlKTtyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM9dCx0fWdldFNwYWNlZFBvaW50cyh0PTQwKXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248PXQ7bisrKWUucHVzaCh0aGlzLmdldFBvaW50KG4vdCkpO3JldHVybiB0aGlzLmF1dG9DbG9zZSYmZS5wdXNoKGVbMF0pLGV9Z2V0UG9pbnRzKHQ9MTIpe2NvbnN0IGU9W107bGV0IG47Zm9yKGxldCBzPTAscj10aGlzLmN1cnZlcztzPHIubGVuZ3RoO3MrKyl7Y29uc3Qgbz1yW3NdLGE9by5pc0VsbGlwc2VDdXJ2ZT90KjI6by5pc0xpbmVDdXJ2ZXx8by5pc0xpbmVDdXJ2ZTM/MTpvLmlzU3BsaW5lQ3VydmU/dCpvLnBvaW50cy5sZW5ndGg6dCxjPW8uZ2V0UG9pbnRzKGEpO2ZvcihsZXQgbD0wO2w8Yy5sZW5ndGg7bCsrKXtjb25zdCBoPWNbbF07biYmbi5lcXVhbHMoaCl8fChlLnB1c2goaCksbj1oKX19cmV0dXJuIHRoaXMuYXV0b0Nsb3NlJiZlLmxlbmd0aD4xJiYhZVtlLmxlbmd0aC0xXS5lcXVhbHMoZVswXSkmJmUucHVzaChlWzBdKSxlfWNvcHkodCl7c3VwZXIuY29weSh0KSx0aGlzLmN1cnZlcz1bXTtmb3IobGV0IGU9MCxuPXQuY3VydmVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQuY3VydmVzW2VdO3RoaXMuY3VydmVzLnB1c2gocy5jbG9uZSgpKX1yZXR1cm4gdGhpcy5hdXRvQ2xvc2U9dC5hdXRvQ2xvc2UsdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QuYXV0b0Nsb3NlPXRoaXMuYXV0b0Nsb3NlLHQuY3VydmVzPVtdO2ZvcihsZXQgZT0wLG49dGhpcy5jdXJ2ZXMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dGhpcy5jdXJ2ZXNbZV07dC5jdXJ2ZXMucHVzaChzLnRvSlNPTigpKX1yZXR1cm4gdH1mcm9tSlNPTih0KXtzdXBlci5mcm9tSlNPTih0KSx0aGlzLmF1dG9DbG9zZT10LmF1dG9DbG9zZSx0aGlzLmN1cnZlcz1bXTtmb3IobGV0IGU9MCxuPXQuY3VydmVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQuY3VydmVzW2VdO3RoaXMuY3VydmVzLnB1c2gobmV3IGhsW3MudHlwZV0oKS5mcm9tSlNPTihzKSl9cmV0dXJuIHRoaXN9fWxldCB1bD1jbGFzcyBleHRlbmRzIHBke2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy50eXBlPSJQYXRoIix0aGlzLmN1cnJlbnRQb2ludD1uZXcgayx0JiZ0aGlzLnNldEZyb21Qb2ludHModCl9c2V0RnJvbVBvaW50cyh0KXt0aGlzLm1vdmVUbyh0WzBdLngsdFswXS55KTtmb3IobGV0IGU9MSxuPXQubGVuZ3RoO2U8bjtlKyspdGhpcy5saW5lVG8odFtlXS54LHRbZV0ueSk7cmV0dXJuIHRoaXN9bW92ZVRvKHQsZSl7cmV0dXJuIHRoaXMuY3VycmVudFBvaW50LnNldCh0LGUpLHRoaXN9bGluZVRvKHQsZSl7Y29uc3Qgbj1uZXcgVW8odGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgayh0LGUpKTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChuKSx0aGlzLmN1cnJlbnRQb2ludC5zZXQodCxlKSx0aGlzfXF1YWRyYXRpY0N1cnZlVG8odCxlLG4scyl7Y29uc3Qgcj1uZXcgcW8odGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgayh0LGUpLG5ldyBrKG4scykpO3JldHVybiB0aGlzLmN1cnZlcy5wdXNoKHIpLHRoaXMuY3VycmVudFBvaW50LnNldChuLHMpLHRoaXN9YmV6aWVyQ3VydmVUbyh0LGUsbixzLHIsbyl7Y29uc3QgYT1uZXcgVm8odGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgayh0LGUpLG5ldyBrKG4scyksbmV3IGsocixvKSk7cmV0dXJuIHRoaXMuY3VydmVzLnB1c2goYSksdGhpcy5jdXJyZW50UG9pbnQuc2V0KHIsbyksdGhpc31zcGxpbmVUaHJ1KHQpe2NvbnN0IGU9W3RoaXMuY3VycmVudFBvaW50LmNsb25lKCldLmNvbmNhdCh0KSxuPW5ldyBYbyhlKTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChuKSx0aGlzLmN1cnJlbnRQb2ludC5jb3B5KHRbdC5sZW5ndGgtMV0pLHRoaXN9YXJjKHQsZSxuLHMscixvKXtjb25zdCBhPXRoaXMuY3VycmVudFBvaW50LngsYz10aGlzLmN1cnJlbnRQb2ludC55O3JldHVybiB0aGlzLmFic2FyYyh0K2EsZStjLG4scyxyLG8pLHRoaXN9YWJzYXJjKHQsZSxuLHMscixvKXtyZXR1cm4gdGhpcy5hYnNlbGxpcHNlKHQsZSxuLG4scyxyLG8pLHRoaXN9ZWxsaXBzZSh0LGUsbixzLHIsbyxhLGMpe2NvbnN0IGw9dGhpcy5jdXJyZW50UG9pbnQueCxoPXRoaXMuY3VycmVudFBvaW50Lnk7cmV0dXJuIHRoaXMuYWJzZWxsaXBzZSh0K2wsZStoLG4scyxyLG8sYSxjKSx0aGlzfWFic2VsbGlwc2UodCxlLG4scyxyLG8sYSxjKXtjb25zdCBsPW5ldyBOcyh0LGUsbixzLHIsbyxhLGMpO2lmKHRoaXMuY3VydmVzLmxlbmd0aD4wKXtjb25zdCB1PWwuZ2V0UG9pbnQoMCk7dS5lcXVhbHModGhpcy5jdXJyZW50UG9pbnQpfHx0aGlzLmxpbmVUbyh1LngsdS55KX10aGlzLmN1cnZlcy5wdXNoKGwpO2NvbnN0IGg9bC5nZXRQb2ludCgxKTtyZXR1cm4gdGhpcy5jdXJyZW50UG9pbnQuY29weShoKSx0aGlzfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jdXJyZW50UG9pbnQuY29weSh0LmN1cnJlbnRQb2ludCksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LmN1cnJlbnRQb2ludD10aGlzLmN1cnJlbnRQb2ludC50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy5jdXJyZW50UG9pbnQuZnJvbUFycmF5KHQuY3VycmVudFBvaW50KSx0aGlzfX07Y2xhc3MgZmwgZXh0ZW5kcyB1bHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLnV1aWQ9bW4oKSx0aGlzLnR5cGU9IlNoYXBlIix0aGlzLmhvbGVzPVtdfWdldFBvaW50c0hvbGVzKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuPTAscz10aGlzLmhvbGVzLmxlbmd0aDtuPHM7bisrKWVbbl09dGhpcy5ob2xlc1tuXS5nZXRQb2ludHModCk7cmV0dXJuIGV9ZXh0cmFjdFBvaW50cyh0KXtyZXR1cm57c2hhcGU6dGhpcy5nZXRQb2ludHModCksaG9sZXM6dGhpcy5nZXRQb2ludHNIb2xlcyh0KX19Y29weSh0KXtzdXBlci5jb3B5KHQpLHRoaXMuaG9sZXM9W107Zm9yKGxldCBlPTAsbj10LmhvbGVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQuaG9sZXNbZV07dGhpcy5ob2xlcy5wdXNoKHMuY2xvbmUoKSl9cmV0dXJuIHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTt0LnV1aWQ9dGhpcy51dWlkLHQuaG9sZXM9W107Zm9yKGxldCBlPTAsbj10aGlzLmhvbGVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXRoaXMuaG9sZXNbZV07dC5ob2xlcy5wdXNoKHMudG9KU09OKCkpfXJldHVybiB0fWZyb21KU09OKHQpe3N1cGVyLmZyb21KU09OKHQpLHRoaXMudXVpZD10LnV1aWQsdGhpcy5ob2xlcz1bXTtmb3IobGV0IGU9MCxuPXQuaG9sZXMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dC5ob2xlc1tlXTt0aGlzLmhvbGVzLnB1c2gobmV3IHVsKCkuZnJvbUpTT04ocykpfXJldHVybiB0aGlzfX1mdW5jdGlvbiB5ZChpLHQsZT0yKXtjb25zdCBuPXQmJnQubGVuZ3RoLHM9bj90WzBdKmU6aS5sZW5ndGg7bGV0IHI9ZGwoaSwwLHMsZSwhMCk7Y29uc3Qgbz1bXTtpZighcnx8ci5uZXh0PT09ci5wcmV2KXJldHVybiBvO2xldCBhLGMsbDtpZihuJiYocj1iZChpLHQscixlKSksaS5sZW5ndGg+ODAqZSl7YT1pWzBdLGM9aVsxXTtsZXQgaD1hLHU9Yztmb3IobGV0IGY9ZTtmPHM7Zis9ZSl7Y29uc3QgZD1pW2ZdLHA9aVtmKzFdO2Q8YSYmKGE9ZCkscDxjJiYoYz1wKSxkPmgmJihoPWQpLHA+dSYmKHU9cCl9bD1NYXRoLm1heChoLWEsdS1jKSxsPWwhPT0wPzMyNzY3L2w6MH1yZXR1cm4gUmkocixvLGUsYSxjLGwsMCksb31mdW5jdGlvbiBkbChpLHQsZSxuLHMpe2xldCByO2lmKHM9PT1CZChpLHQsZSxuKT4wKWZvcihsZXQgbz10O288ZTtvKz1uKXI9Z2woby9ufDAsaVtvXSxpW28rMV0scik7ZWxzZSBmb3IobGV0IG89ZS1uO28+PXQ7by09bilyPWdsKG8vbnwwLGlbb10saVtvKzFdLHIpO3JldHVybiByJiZLbihyLHIubmV4dCkmJihEaShyKSxyPXIubmV4dCkscn1mdW5jdGlvbiBNbihpLHQpe2lmKCFpKXJldHVybiBpO3R8fCh0PWkpO2xldCBlPWksbjtkbyBpZihuPSExLCFlLnN0ZWluZXImJihLbihlLGUubmV4dCl8fHJ0KGUucHJldixlLGUubmV4dCk9PT0wKSl7aWYoRGkoZSksZT10PWUucHJldixlPT09ZS5uZXh0KWJyZWFrO249ITB9ZWxzZSBlPWUubmV4dDt3aGlsZShufHxlIT09dCk7cmV0dXJuIHR9ZnVuY3Rpb24gUmkoaSx0LGUsbixzLHIsbyl7aWYoIWkpcmV0dXJuOyFvJiZyJiZfZChpLG4scyxyKTtsZXQgYT1pO2Zvcig7aS5wcmV2IT09aS5uZXh0Oyl7Y29uc3QgYz1pLnByZXYsbD1pLm5leHQ7aWYocj9nZChpLG4scyxyKTptZChpKSl7dC5wdXNoKGMuaSxpLmksbC5pKSxEaShpKSxpPWwubmV4dCxhPWwubmV4dDtjb250aW51ZX1pZihpPWwsaT09PWEpe28/bz09PTE/KGk9eGQoTW4oaSksdCksUmkoaSx0LGUsbixzLHIsMikpOm89PT0yJiZ3ZChpLHQsZSxuLHMscik6UmkoTW4oaSksdCxlLG4scyxyLDEpO2JyZWFrfX19ZnVuY3Rpb24gbWQoaSl7Y29uc3QgdD1pLnByZXYsZT1pLG49aS5uZXh0O2lmKHJ0KHQsZSxuKT49MClyZXR1cm4hMTtjb25zdCBzPXQueCxyPWUueCxvPW4ueCxhPXQueSxjPWUueSxsPW4ueSxoPU1hdGgubWluKHMscixvKSx1PU1hdGgubWluKGEsYyxsKSxmPU1hdGgubWF4KHMscixvKSxkPU1hdGgubWF4KGEsYyxsKTtsZXQgcD1uLm5leHQ7Zm9yKDtwIT09dDspe2lmKHAueD49aCYmcC54PD1mJiZwLnk+PXUmJnAueTw9ZCYmTGkocyxhLHIsYyxvLGwscC54LHAueSkmJnJ0KHAucHJldixwLHAubmV4dCk+PTApcmV0dXJuITE7cD1wLm5leHR9cmV0dXJuITB9ZnVuY3Rpb24gZ2QoaSx0LGUsbil7Y29uc3Qgcz1pLnByZXYscj1pLG89aS5uZXh0O2lmKHJ0KHMscixvKT49MClyZXR1cm4hMTtjb25zdCBhPXMueCxjPXIueCxsPW8ueCxoPXMueSx1PXIueSxmPW8ueSxkPU1hdGgubWluKGEsYyxsKSxwPU1hdGgubWluKGgsdSxmKSx5PU1hdGgubWF4KGEsYyxsKSxnPU1hdGgubWF4KGgsdSxmKSx3PVpvKGQscCx0LGUsbiksYj1abyh5LGcsdCxlLG4pO2xldCB4PWkucHJldlosbT1pLm5leHRaO2Zvcig7eCYmeC56Pj13JiZtJiZtLno8PWI7KXtpZih4Lng+PWQmJngueDw9eSYmeC55Pj1wJiZ4Lnk8PWcmJnghPT1zJiZ4IT09byYmTGkoYSxoLGMsdSxsLGYseC54LHgueSkmJnJ0KHgucHJldix4LHgubmV4dCk+PTB8fCh4PXgucHJldlosbS54Pj1kJiZtLng8PXkmJm0ueT49cCYmbS55PD1nJiZtIT09cyYmbSE9PW8mJkxpKGEsaCxjLHUsbCxmLG0ueCxtLnkpJiZydChtLnByZXYsbSxtLm5leHQpPj0wKSlyZXR1cm4hMTttPW0ubmV4dFp9Zm9yKDt4JiZ4Lno+PXc7KXtpZih4Lng+PWQmJngueDw9eSYmeC55Pj1wJiZ4Lnk8PWcmJnghPT1zJiZ4IT09byYmTGkoYSxoLGMsdSxsLGYseC54LHgueSkmJnJ0KHgucHJldix4LHgubmV4dCk+PTApcmV0dXJuITE7eD14LnByZXZafWZvcig7bSYmbS56PD1iOyl7aWYobS54Pj1kJiZtLng8PXkmJm0ueT49cCYmbS55PD1nJiZtIT09cyYmbSE9PW8mJkxpKGEsaCxjLHUsbCxmLG0ueCxtLnkpJiZydChtLnByZXYsbSxtLm5leHQpPj0wKXJldHVybiExO209bS5uZXh0Wn1yZXR1cm4hMH1mdW5jdGlvbiB4ZChpLHQpe2xldCBlPWk7ZG97Y29uc3Qgbj1lLnByZXYscz1lLm5leHQubmV4dDshS24obixzKSYmeWwobixlLGUubmV4dCxzKSYmT2kobixzKSYmT2kocyxuKSYmKHQucHVzaChuLmksZS5pLHMuaSksRGkoZSksRGkoZS5uZXh0KSxlPWk9cyksZT1lLm5leHR9d2hpbGUoZSE9PWkpO3JldHVybiBNbihlKX1mdW5jdGlvbiB3ZChpLHQsZSxuLHMscil7bGV0IG89aTtkb3tsZXQgYT1vLm5leHQubmV4dDtmb3IoO2EhPT1vLnByZXY7KXtpZihvLmkhPT1hLmkmJlBkKG8sYSkpe2xldCBjPW1sKG8sYSk7bz1NbihvLG8ubmV4dCksYz1NbihjLGMubmV4dCksUmkobyx0LGUsbixzLHIsMCksUmkoYyx0LGUsbixzLHIsMCk7cmV0dXJufWE9YS5uZXh0fW89by5uZXh0fXdoaWxlKG8hPT1pKX1mdW5jdGlvbiBiZChpLHQsZSxuKXtjb25zdCBzPVtdO2ZvcihsZXQgcj0wLG89dC5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT10W3JdKm4sYz1yPG8tMT90W3IrMV0qbjppLmxlbmd0aCxsPWRsKGksYSxjLG4sITEpO2w9PT1sLm5leHQmJihsLnN0ZWluZXI9ITApLHMucHVzaChUZChsKSl9cy5zb3J0KE1kKTtmb3IobGV0IHI9MDtyPHMubGVuZ3RoO3IrKyllPUFkKHNbcl0sZSk7cmV0dXJuIGV9ZnVuY3Rpb24gTWQoaSx0KXtsZXQgZT1pLngtdC54O2lmKGU9PT0wJiYoZT1pLnktdC55LGU9PT0wKSl7Y29uc3Qgbj0oaS5uZXh0LnktaS55KS8oaS5uZXh0LngtaS54KSxzPSh0Lm5leHQueS10LnkpLyh0Lm5leHQueC10LngpO2U9bi1zfXJldHVybiBlfWZ1bmN0aW9uIEFkKGksdCl7Y29uc3QgZT1TZChpLHQpO2lmKCFlKXJldHVybiB0O2NvbnN0IG49bWwoZSxpKTtyZXR1cm4gTW4obixuLm5leHQpLE1uKGUsZS5uZXh0KX1mdW5jdGlvbiBTZChpLHQpe2xldCBlPXQ7Y29uc3Qgbj1pLngscz1pLnk7bGV0IHI9LTEvMCxvO2lmKEtuKGksZSkpcmV0dXJuIGU7ZG97aWYoS24oaSxlLm5leHQpKXJldHVybiBlLm5leHQ7aWYoczw9ZS55JiZzPj1lLm5leHQueSYmZS5uZXh0LnkhPT1lLnkpe2NvbnN0IHU9ZS54KyhzLWUueSkqKGUubmV4dC54LWUueCkvKGUubmV4dC55LWUueSk7aWYodTw9biYmdT5yJiYocj11LG89ZS54PGUubmV4dC54P2U6ZS5uZXh0LHU9PT1uKSlyZXR1cm4gb31lPWUubmV4dH13aGlsZShlIT09dCk7aWYoIW8pcmV0dXJuIG51bGw7Y29uc3QgYT1vLGM9by54LGw9by55O2xldCBoPTEvMDtlPW87ZG97aWYobj49ZS54JiZlLng+PWMmJm4hPT1lLngmJnBsKHM8bD9uOnIscyxjLGwsczxsP3I6bixzLGUueCxlLnkpKXtjb25zdCB1PU1hdGguYWJzKHMtZS55KS8obi1lLngpO09pKGUsaSkmJih1PGh8fHU9PT1oJiYoZS54Pm8ueHx8ZS54PT09by54JiZ2ZChvLGUpKSkmJihvPWUsaD11KX1lPWUubmV4dH13aGlsZShlIT09YSk7cmV0dXJuIG99ZnVuY3Rpb24gdmQoaSx0KXtyZXR1cm4gcnQoaS5wcmV2LGksdC5wcmV2KTwwJiZydCh0Lm5leHQsaSxpLm5leHQpPDB9ZnVuY3Rpb24gX2QoaSx0LGUsbil7bGV0IHM9aTtkbyBzLno9PT0wJiYocy56PVpvKHMueCxzLnksdCxlLG4pKSxzLnByZXZaPXMucHJldixzLm5leHRaPXMubmV4dCxzPXMubmV4dDt3aGlsZShzIT09aSk7cy5wcmV2Wi5uZXh0Wj1udWxsLHMucHJldlo9bnVsbCx6ZChzKX1mdW5jdGlvbiB6ZChpKXtsZXQgdCxlPTE7ZG97bGV0IG49aSxzO2k9bnVsbDtsZXQgcj1udWxsO2Zvcih0PTA7bjspe3QrKztsZXQgbz1uLGE9MDtmb3IobGV0IGw9MDtsPGUmJihhKyssbz1vLm5leHRaLCEhbyk7bCsrKTtsZXQgYz1lO2Zvcig7YT4wfHxjPjAmJm87KWEhPT0wJiYoYz09PTB8fCFvfHxuLno8PW8ueik/KHM9bixuPW4ubmV4dFosYS0tKToocz1vLG89by5uZXh0WixjLS0pLHI/ci5uZXh0Wj1zOmk9cyxzLnByZXZaPXIscj1zO249b31yLm5leHRaPW51bGwsZSo9Mn13aGlsZSh0PjEpO3JldHVybiBpfWZ1bmN0aW9uIFpvKGksdCxlLG4scyl7cmV0dXJuIGk9KGktZSkqc3wwLHQ9KHQtbikqc3wwLGk9KGl8aTw8OCkmMTY3MTE5MzUsaT0oaXxpPDw0KSYyNTI2NDUxMzUsaT0oaXxpPDwyKSY4NTg5OTM0NTksaT0oaXxpPDwxKSYxNDMxNjU1NzY1LHQ9KHR8dDw8OCkmMTY3MTE5MzUsdD0odHx0PDw0KSYyNTI2NDUxMzUsdD0odHx0PDwyKSY4NTg5OTM0NTksdD0odHx0PDwxKSYxNDMxNjU1NzY1LGl8dDw8MX1mdW5jdGlvbiBUZChpKXtsZXQgdD1pLGU9aTtkbyh0Lng8ZS54fHx0Lng9PT1lLngmJnQueTxlLnkpJiYoZT10KSx0PXQubmV4dDt3aGlsZSh0IT09aSk7cmV0dXJuIGV9ZnVuY3Rpb24gcGwoaSx0LGUsbixzLHIsbyxhKXtyZXR1cm4ocy1vKSoodC1hKT49KGktbykqKHItYSkmJihpLW8pKihuLWEpPj0oZS1vKSoodC1hKSYmKGUtbykqKHItYSk+PShzLW8pKihuLWEpfWZ1bmN0aW9uIExpKGksdCxlLG4scyxyLG8sYSl7cmV0dXJuIShpPT09byYmdD09PWEpJiZwbChpLHQsZSxuLHMscixvLGEpfWZ1bmN0aW9uIFBkKGksdCl7cmV0dXJuIGkubmV4dC5pIT09dC5pJiZpLnByZXYuaSE9PXQuaSYmIUNkKGksdCkmJihPaShpLHQpJiZPaSh0LGkpJiZFZChpLHQpJiYocnQoaS5wcmV2LGksdC5wcmV2KXx8cnQoaSx0LnByZXYsdCkpfHxLbihpLHQpJiZydChpLnByZXYsaSxpLm5leHQpPjAmJnJ0KHQucHJldix0LHQubmV4dCk+MCl9ZnVuY3Rpb24gcnQoaSx0LGUpe3JldHVybih0LnktaS55KSooZS54LXQueCktKHQueC1pLngpKihlLnktdC55KX1mdW5jdGlvbiBLbihpLHQpe3JldHVybiBpLng9PT10LngmJmkueT09PXQueX1mdW5jdGlvbiB5bChpLHQsZSxuKXtjb25zdCBzPU9zKHJ0KGksdCxlKSkscj1PcyhydChpLHQsbikpLG89T3MocnQoZSxuLGkpKSxhPU9zKHJ0KGUsbix0KSk7cmV0dXJuISEocyE9PXImJm8hPT1hfHxzPT09MCYmTHMoaSxlLHQpfHxyPT09MCYmTHMoaSxuLHQpfHxvPT09MCYmTHMoZSxpLG4pfHxhPT09MCYmTHMoZSx0LG4pKX1mdW5jdGlvbiBMcyhpLHQsZSl7cmV0dXJuIHQueDw9TWF0aC5tYXgoaS54LGUueCkmJnQueD49TWF0aC5taW4oaS54LGUueCkmJnQueTw9TWF0aC5tYXgoaS55LGUueSkmJnQueT49TWF0aC5taW4oaS55LGUueSl9ZnVuY3Rpb24gT3MoaSl7cmV0dXJuIGk+MD8xOmk8MD8tMTowfWZ1bmN0aW9uIENkKGksdCl7bGV0IGU9aTtkb3tpZihlLmkhPT1pLmkmJmUubmV4dC5pIT09aS5pJiZlLmkhPT10LmkmJmUubmV4dC5pIT09dC5pJiZ5bChlLGUubmV4dCxpLHQpKXJldHVybiEwO2U9ZS5uZXh0fXdoaWxlKGUhPT1pKTtyZXR1cm4hMX1mdW5jdGlvbiBPaShpLHQpe3JldHVybiBydChpLnByZXYsaSxpLm5leHQpPDA/cnQoaSx0LGkubmV4dCk+PTAmJnJ0KGksaS5wcmV2LHQpPj0wOnJ0KGksdCxpLnByZXYpPDB8fHJ0KGksaS5uZXh0LHQpPDB9ZnVuY3Rpb24gRWQoaSx0KXtsZXQgZT1pLG49ITE7Y29uc3Qgcz0oaS54K3QueCkvMixyPShpLnkrdC55KS8yO2RvIGUueT5yIT1lLm5leHQueT5yJiZlLm5leHQueSE9PWUueSYmczwoZS5uZXh0LngtZS54KSooci1lLnkpLyhlLm5leHQueS1lLnkpK2UueCYmKG49IW4pLGU9ZS5uZXh0O3doaWxlKGUhPT1pKTtyZXR1cm4gbn1mdW5jdGlvbiBtbChpLHQpe2NvbnN0IGU9R28oaS5pLGkueCxpLnkpLG49R28odC5pLHQueCx0LnkpLHM9aS5uZXh0LHI9dC5wcmV2O3JldHVybiBpLm5leHQ9dCx0LnByZXY9aSxlLm5leHQ9cyxzLnByZXY9ZSxuLm5leHQ9ZSxlLnByZXY9bixyLm5leHQ9bixuLnByZXY9cixufWZ1bmN0aW9uIGdsKGksdCxlLG4pe2NvbnN0IHM9R28oaSx0LGUpO3JldHVybiBuPyhzLm5leHQ9bi5uZXh0LHMucHJldj1uLG4ubmV4dC5wcmV2PXMsbi5uZXh0PXMpOihzLnByZXY9cyxzLm5leHQ9cyksc31mdW5jdGlvbiBEaShpKXtpLm5leHQucHJldj1pLnByZXYsaS5wcmV2Lm5leHQ9aS5uZXh0LGkucHJldlomJihpLnByZXZaLm5leHRaPWkubmV4dFopLGkubmV4dFomJihpLm5leHRaLnByZXZaPWkucHJldlopfWZ1bmN0aW9uIEdvKGksdCxlKXtyZXR1cm57aSx4OnQseTplLHByZXY6bnVsbCxuZXh0Om51bGwsejowLHByZXZaOm51bGwsbmV4dFo6bnVsbCxzdGVpbmVyOiExfX1mdW5jdGlvbiBCZChpLHQsZSxuKXtsZXQgcz0wO2ZvcihsZXQgcj10LG89ZS1uO3I8ZTtyKz1uKXMrPShpW29dLWlbcl0pKihpW3IrMV0raVtvKzFdKSxvPXI7cmV0dXJuIHN9Y2xhc3MgRmR7c3RhdGljIHRyaWFuZ3VsYXRlKHQsZSxuPTIpe3JldHVybiB5ZCh0LGUsbil9fWNsYXNzIHRpe3N0YXRpYyBhcmVhKHQpe2NvbnN0IGU9dC5sZW5ndGg7bGV0IG49MDtmb3IobGV0IHM9ZS0xLHI9MDtyPGU7cz1yKyspbis9dFtzXS54KnRbcl0ueS10W3JdLngqdFtzXS55O3JldHVybiBuKi41fXN0YXRpYyBpc0Nsb2NrV2lzZSh0KXtyZXR1cm4gdGkuYXJlYSh0KTwwfXN0YXRpYyB0cmlhbmd1bGF0ZVNoYXBlKHQsZSl7Y29uc3Qgbj1bXSxzPVtdLHI9W107eGwodCksd2wobix0KTtsZXQgbz10Lmxlbmd0aDtlLmZvckVhY2goeGwpO2ZvcihsZXQgYz0wO2M8ZS5sZW5ndGg7YysrKXMucHVzaChvKSxvKz1lW2NdLmxlbmd0aCx3bChuLGVbY10pO2NvbnN0IGE9RmQudHJpYW5ndWxhdGUobixzKTtmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrPTMpci5wdXNoKGEuc2xpY2UoYyxjKzMpKTtyZXR1cm4gcn19ZnVuY3Rpb24geGwoaSl7Y29uc3QgdD1pLmxlbmd0aDt0PjImJmlbdC0xXS5lcXVhbHMoaVswXSkmJmkucG9wKCl9ZnVuY3Rpb24gd2woaSx0KXtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKylpLnB1c2godFtlXS54KSxpLnB1c2godFtlXS55KX1jbGFzcyBXbyBleHRlbmRzIEFle2NvbnN0cnVjdG9yKHQ9MSxlPTEsbj0xLHM9MSl7c3VwZXIoKSx0aGlzLnR5cGU9IlBsYW5lR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17d2lkdGg6dCxoZWlnaHQ6ZSx3aWR0aFNlZ21lbnRzOm4saGVpZ2h0U2VnbWVudHM6c307Y29uc3Qgcj10LzIsbz1lLzIsYT1NYXRoLmZsb29yKG4pLGM9TWF0aC5mbG9vcihzKSxsPWErMSxoPWMrMSx1PXQvYSxmPWUvYyxkPVtdLHA9W10seT1bXSxnPVtdO2ZvcihsZXQgdz0wO3c8aDt3Kyspe2NvbnN0IGI9dypmLW87Zm9yKGxldCB4PTA7eDxsO3grKyl7Y29uc3QgbT14KnUtcjtwLnB1c2gobSwtYiwwKSx5LnB1c2goMCwwLDEpLGcucHVzaCh4L2EpLGcucHVzaCgxLXcvYyl9fWZvcihsZXQgdz0wO3c8Yzt3KyspZm9yKGxldCBiPTA7YjxhO2IrKyl7Y29uc3QgeD1iK2wqdyxtPWIrbCoodysxKSxNPWIrMStsKih3KzEpLFM9YisxK2wqdztkLnB1c2goeCxtLFMpLGQucHVzaChtLE0sUyl9dGhpcy5zZXRJbmRleChkKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBSZShwLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgUmUoeSwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgUmUoZywyKSl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnBhcmFtZXRlcnM9T2JqZWN0LmFzc2lnbih7fSx0LnBhcmFtZXRlcnMpLHRoaXN9c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgV28odC53aWR0aCx0LmhlaWdodCx0LndpZHRoU2VnbWVudHMsdC5oZWlnaHRTZWdtZW50cyl9fWNvbnN0IGJsPW5ldyBQLERzPW5ldyBQLGVpPW5ldyBQLG5pPW5ldyBQLEhvPW5ldyBQLElkPW5ldyBQLGtkPW5ldyBQO2NsYXNzIHJle2NvbnN0cnVjdG9yKHQ9bmV3IFAsZT1uZXcgUCl7dGhpcy5zdGFydD10LHRoaXMuZW5kPWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMuc3RhcnQuY29weSh0KSx0aGlzLmVuZC5jb3B5KGUpLHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5zdGFydC5jb3B5KHQuc3RhcnQpLHRoaXMuZW5kLmNvcHkodC5lbmQpLHRoaXN9Z2V0Q2VudGVyKHQpe3JldHVybiB0LmFkZFZlY3RvcnModGhpcy5zdGFydCx0aGlzLmVuZCkubXVsdGlwbHlTY2FsYXIoLjUpfWRlbHRhKHQpe3JldHVybiB0LnN1YlZlY3RvcnModGhpcy5lbmQsdGhpcy5zdGFydCl9ZGlzdGFuY2VTcSgpe3JldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuZW5kKX1kaXN0YW5jZSgpe3JldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG8odGhpcy5lbmQpfWF0KHQsZSl7cmV0dXJuIHRoaXMuZGVsdGEoZSkubXVsdGlwbHlTY2FsYXIodCkuYWRkKHRoaXMuc3RhcnQpfWNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIodCxlKXtibC5zdWJWZWN0b3JzKHQsdGhpcy5zdGFydCksRHMuc3ViVmVjdG9ycyh0aGlzLmVuZCx0aGlzLnN0YXJ0KTtjb25zdCBuPURzLmRvdChEcyk7bGV0IHI9RHMuZG90KGJsKS9uO3JldHVybiBlJiYocj1aKHIsMCwxKSkscn1jbG9zZXN0UG9pbnRUb1BvaW50KHQsZSxuKXtjb25zdCBzPXRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlcih0LGUpO3JldHVybiB0aGlzLmRlbHRhKG4pLm11bHRpcGx5U2NhbGFyKHMpLmFkZCh0aGlzLnN0YXJ0KX1kaXN0YW5jZVNxVG9MaW5lMyh0LGU9SWQsbj1rZCl7Y29uc3Qgcz0xMDAwMDAwMDAwMDAwMDAwMWUtMzI7bGV0IHIsbztjb25zdCBhPXRoaXMuc3RhcnQsYz10LnN0YXJ0LGw9dGhpcy5lbmQsaD10LmVuZDtlaS5zdWJWZWN0b3JzKGwsYSksbmkuc3ViVmVjdG9ycyhoLGMpLEhvLnN1YlZlY3RvcnMoYSxjKTtjb25zdCB1PWVpLmRvdChlaSksZj1uaS5kb3QobmkpLGQ9bmkuZG90KEhvKTtpZih1PD1zJiZmPD1zKXJldHVybiBlLmNvcHkoYSksbi5jb3B5KGMpLGUuc3ViKG4pLGUuZG90KGUpO2lmKHU8PXMpcj0wLG89ZC9mLG89WihvLDAsMSk7ZWxzZXtjb25zdCBwPWVpLmRvdChIbyk7aWYoZjw9cylvPTAscj1aKC1wL3UsMCwxKTtlbHNle2NvbnN0IHk9ZWkuZG90KG5pKSxnPXUqZi15Knk7ZyE9PTA/cj1aKCh5KmQtcCpmKS9nLDAsMSk6cj0wLG89KHkqcitkKS9mLG88MD8obz0wLHI9WigtcC91LDAsMSkpOm8+MSYmKG89MSxyPVooKHktcCkvdSwwLDEpKX19cmV0dXJuIGUuY29weShhKS5hZGQoZWkubXVsdGlwbHlTY2FsYXIocikpLG4uY29weShjKS5hZGQobmkubXVsdGlwbHlTY2FsYXIobykpLGUuc3ViKG4pLGUuZG90KGUpfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5zdGFydC5hcHBseU1hdHJpeDQodCksdGhpcy5lbmQuYXBwbHlNYXRyaXg0KHQpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0LnN0YXJ0LmVxdWFscyh0aGlzLnN0YXJ0KSYmdC5lbmQuZXF1YWxzKHRoaXMuZW5kKX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fXR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX18hPSJ1bmRlZmluZWQiJiZfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInJlZ2lzdGVyIix7ZGV0YWlsOntyZXZpc2lvbjpKfX0pKSx0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmKHdpbmRvdy5fX1RIUkVFX18/YnQoIldBUk5JTkc6IE11bHRpcGxlIGluc3RhbmNlcyBvZiBUaHJlZS5qcyBiZWluZyBpbXBvcnRlZC4iKTp3aW5kb3cuX19USFJFRV9fPUopO2NvbnN0IEFuPW5ldyBNYXAsTmQ9KGk9e30pPT4oe2dlbmVyYXRlVG9wVVYodCxlLG4scyxyKXtjb25zdCBvPWVbbiozXSxhPWVbbiozKzFdLGM9ZVtzKjNdLGw9ZVtzKjMrMV0saD1lW3IqM10sdT1lW3IqMysxXTtsZXQgZjtpZihBbi5oYXModCkpZj1Bbi5nZXQodCk7ZWxzZXtsZXQgZz1pLmJveDM7aWYoIWcpe2c9bmV3IGd0O2NvbnN0IHg9dC5wYXJhbWV0ZXJzLnNoYXBlcy5nZXRQb2ludHMoKS5tYXAobT0+W20ueCxtLnksMF0pLmZsYXQoKTtnLnNldEZyb21BcnJheSh4KX1jb25zdCB3PWcuZ2V0U2l6ZShuZXcgUCk7aS5zcGxpdCYmKHcueS89aS5zcGxpdCksZj17Ym94Omcsc2l6ZTp3fSxBbi5zZXQodCxmKX1jb25zdHtib3g6ZCxzaXplOnB9PWYseT1pLnNwbGl0PzEtaS5zcGxpdDowO3JldHVybltuZXcgaygoby1kLm1pbi54KS9wLngsKGEtZC5taW4ueSkvcC55K3kpLG5ldyBrKChjLWQubWluLngpL3AueCwobC1kLm1pbi55KS9wLnkreSksbmV3IGsoKGgtZC5taW4ueCkvcC54LCh1LWQubWluLnkpL3AueSt5KV19LGdlbmVyYXRlU2lkZVdhbGxVVih0LGUsbixzLHIsbyl7Y29uc3QgYT1lW24qM10sYz1lW24qMysxXSxsPWVbbiozKzJdLGg9ZVtzKjNdLHU9ZVtzKjMrMV0sZj1lW3MqMysyXSxkPWVbciozXSxwPWVbciozKzFdLHk9ZVtyKjMrMl0sZz1lW28qM10sdz1lW28qMysxXSxiPWVbbyozKzJdO2xldCB4O2lmKEFuLmhhcyhlKSl4PUFuLmdldChlKTtlbHNle2NvbnN0IFM9bmV3IGd0O1Muc2V0RnJvbUFycmF5KGUpO2NvbnN0IEE9Uy5nZXRTaXplKG5ldyBQKTtpLnNwbGl0JiYoQS56Lz0xLWkuc3BsaXQpLGkuc2lkZVJlcGVhdCYmKEEuei89aS5zaWRlUmVwZWF0KSx4PXtib3g6UyxzaXplOkF9LEFuLnNldChlLHgpfWNvbnN0e2JveDptLHNpemU6TX09eDtyZXR1cm4gTWF0aC5hYnMoYy11KTxNYXRoLmFicyhhLWgpP1tuZXcgaygoYS1tLm1pbi54KS9NLngsKGwtbS5taW4ueikvTS56KSxuZXcgaygoaC1tLm1pbi54KS9NLngsKGYtbS5taW4ueikvTS56KSxuZXcgaygoZC1tLm1pbi54KS9NLngsKHktbS5taW4ueikvTS56KSxuZXcgaygoZy1tLm1pbi54KS9NLngsKGItbS5taW4ueikvTS56KV06W25ldyBrKChjLW0ubWluLnkpL00ueSwobC1tLm1pbi56KS9NLnopLG5ldyBrKCh1LW0ubWluLnkpL00ueSwoZi1tLm1pbi56KS9NLnopLG5ldyBrKChwLW0ubWluLnkpL00ueSwoeS1tLm1pbi56KS9NLnopLG5ldyBrKCh3LW0ubWluLnkpL00ueSwoYi1tLm1pbi56KS9NLnopXX19KSxSZD0oKT0+e0FuLmNsZWFyKCl9LExkPXtBcmNDdXJ2ZTpzbCxDYXRtdWxsUm9tQ3VydmUzOnJsLEN1YmljQmV6aWVyQ3VydmU6Vm8sQ3ViaWNCZXppZXJDdXJ2ZTM6YWwsRWxsaXBzZUN1cnZlOk5zLExpbmVDdXJ2ZTpVbyxMaW5lQ3VydmUzOmNsLFF1YWRyYXRpY0JlemllckN1cnZlOnFvLFF1YWRyYXRpY0JlemllckN1cnZlMzpsbCxTcGxpbmVDdXJ2ZTpYb307Y2xhc3MgaWkgZXh0ZW5kcyBBZXtjb25zdHJ1Y3Rvcih0PW5ldyBmbChbbmV3IGsoLjUsLjUpLG5ldyBrKC0uNSwuNSksbmV3IGsoLS41LC0uNSksbmV3IGsoLjUsLS41KV0pLGU9e30pe3N1cGVyKCksdGhpcy50eXBlPSJFeHRydWRlR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17c2hhcGVzOnQsb3B0aW9uczplfSx0PUFycmF5LmlzQXJyYXkodCk/dDpbdF07Y29uc3Qgbj10aGlzLHM9W10scj1bXTtmb3IobGV0IGE9MCxjPXQubGVuZ3RoO2E8YzthKyspe2NvbnN0IGw9dFthXTtvKGwpfXRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFJlKHMsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IFJlKHIsMikpLHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtmdW5jdGlvbiBvKGEpe3ZhciBhZixjZixsZjtjb25zdCBjPVtdLGw9ZS5jdXJ2ZVNlZ21lbnRzIT09dm9pZCAwP2UuY3VydmVTZWdtZW50czoxMixoPWUuc3RlcHMhPT12b2lkIDA/ZS5zdGVwczoxLHU9ZS5kZXB0aCE9PXZvaWQgMD9lLmRlcHRoOjE7bGV0IGY9ZS5iZXZlbEVuYWJsZWQhPT12b2lkIDA/ZS5iZXZlbEVuYWJsZWQ6ITAsZD1lLmJldmVsVGhpY2tuZXNzIT09dm9pZCAwP2UuYmV2ZWxUaGlja25lc3M6LjIscD1lLmJldmVsU2l6ZSE9PXZvaWQgMD9lLmJldmVsU2l6ZTpkLS4xLHk9ZS5iZXZlbE9mZnNldCE9PXZvaWQgMD9lLmJldmVsT2Zmc2V0OjAsZz1lLmJldmVsU2VnbWVudHMhPT12b2lkIDA/ZS5iZXZlbFNlZ21lbnRzOjM7Y29uc3Qgdz1lLmV4dHJ1ZGVQYXRoLGI9ZS5VVkdlbmVyYXRvciE9PXZvaWQgMD9lLlVWR2VuZXJhdG9yOk9kLHg9KGFmPWUuaGFzVG9wKSE9bnVsbD9hZjohMCxtPShjZj1lLmhhc0JvdHRvbSkhPW51bGw/Y2Y6ITAsTT0obGY9ZS5oYXNTaWRlKSE9bnVsbD9sZjohMDtsZXQgUyxBPSExLHYsXyxULHo7dyYmKFM9dy5nZXRTcGFjZWRQb2ludHMoaCksQT0hMCxmPSExLHY9dy5jb21wdXRlRnJlbmV0RnJhbWVzKGgsITEpLF89bmV3IFAsVD1uZXcgUCx6PW5ldyBQKSxmfHwoZz0wLGQ9MCxwPTAseT0wKTtjb25zdCBDPWEuZXh0cmFjdFBvaW50cyhsKTtsZXQgRT1DLnNoYXBlO2NvbnN0IEY9Qy5ob2xlcztpZighdGkuaXNDbG9ja1dpc2UoRSkpe0U9RS5yZXZlcnNlKCk7Zm9yKGxldCBOPTAsTD1GLmxlbmd0aDtOPEw7TisrKXtjb25zdCBPPUZbTl07dGkuaXNDbG9ja1dpc2UoTykmJihGW05dPU8ucmV2ZXJzZSgpKX19ZnVuY3Rpb24gSShOKXtjb25zdCBPPTEwMDAwMDAwMDAwMDAwMDAxZS0zNjtsZXQgJD1OWzBdO2ZvcihsZXQgRD0xO0Q8PU4ubGVuZ3RoO0QrKyl7Y29uc3QgWT1EJU4ubGVuZ3RoLFc9TltZXSxpdD1XLngtJC54LGx0PVcueS0kLnksd3Q9aXQqaXQrbHQqbHQsZWU9TWF0aC5tYXgoTWF0aC5hYnMoVy54KSxNYXRoLmFicyhXLnkpLE1hdGguYWJzKCQueCksTWF0aC5hYnMoJC55KSksRG49TyplZSplZTtpZih3dDw9RG4pe04uc3BsaWNlKFksMSksRC0tO2NvbnRpbnVlfSQ9V319SShFKSxGLmZvckVhY2goSSk7Y29uc3QgUj1GLmxlbmd0aCxWPUU7Zm9yKGxldCBOPTA7TjxSO04rKyl7Y29uc3QgTD1GW05dO0U9RS5jb25jYXQoTCl9ZnVuY3Rpb24gVShOLEwsTyl7cmV0dXJuIEx8fGVycm9yKCJFeHRydWRlR2VvbWV0cnk6IHZlYyBkb2VzIG5vdCBleGlzdCIpLE4uY2xvbmUoKS5hZGRTY2FsZWRWZWN0b3IoTCxPKX1jb25zdCBLPUUubGVuZ3RoO2Z1bmN0aW9uIGN0KE4sTCxPKXtsZXQgJCxELFk7Y29uc3QgVz1OLngtTC54LGl0PU4ueS1MLnksbHQ9Ty54LU4ueCx3dD1PLnktTi55LGVlPVcqVytpdCppdCxEbj1XKnd0LWl0Kmx0O2lmKE1hdGguYWJzKERuKT5OdW1iZXIuRVBTSUxPTil7Y29uc3QgbmU9TWF0aC5zcXJ0KGVlKSxoZj1NYXRoLnNxcnQobHQqbHQrd3Qqd3QpLHVmPUwueC1pdC9uZSxmZj1MLnkrVy9uZSxheD1PLngtd3QvaGYsY3g9Ty55K2x0L2hmLGRmPSgoYXgtdWYpKnd0LShjeC1mZikqbHQpLyhXKnd0LWl0Kmx0KTskPXVmK1cqZGYtTi54LEQ9ZmYraXQqZGYtTi55O2NvbnN0IHBmPSQqJCtEKkQ7aWYocGY8PTIpcmV0dXJuIG5ldyBrKCQsRCk7WT1NYXRoLnNxcnQocGYvMil9ZWxzZXtsZXQgbmU9ITE7Vz5OdW1iZXIuRVBTSUxPTj9sdD5OdW1iZXIuRVBTSUxPTiYmKG5lPSEwKTpXPC1OdW1iZXIuRVBTSUxPTj9sdDwtTnVtYmVyLkVQU0lMT04mJihuZT0hMCk6TWF0aC5zaWduKGl0KT09PU1hdGguc2lnbih3dCkmJihuZT0hMCksbmU/KCQ9LWl0LEQ9VyxZPU1hdGguc3FydChlZSkpOigkPVcsRD1pdCxZPU1hdGguc3FydChlZS8yKSl9cmV0dXJuIG5ldyBrKCQvWSxEL1kpfWNvbnN0IEZ0PVtdO2ZvcihsZXQgTj0wLEw9Vi5sZW5ndGgsTz1MLTEsJD1OKzE7TjxMO04rKyxPKyssJCsrKU89PT1MJiYoTz0wKSwkPT09TCYmKCQ9MCksRnRbTl09Y3QoVltOXSxWW09dLFZbJF0pO2NvbnN0IEl0PVtdO2xldCBXdCx2dD1GdC5jb25jYXQoKTtmb3IobGV0IE49MCxMPVI7TjxMO04rKyl7Y29uc3QgTz1GW05dO1d0PVtdO2ZvcihsZXQgJD0wLEQ9Ty5sZW5ndGgsWT1ELTEsVz0kKzE7JDxEOyQrKyxZKyssVysrKVk9PT1EJiYoWT0wKSxXPT09RCYmKFc9MCksV3RbJF09Y3QoT1skXSxPW1ldLE9bV10pO0l0LnB1c2goV3QpLHZ0PXZ0LmNvbmNhdChXdCl9bGV0IFllO2lmKGc9PT0wKVllPXRpLnRyaWFuZ3VsYXRlU2hhcGUoVixGKTtlbHNle2NvbnN0IE49W10sTD1bXTtmb3IobGV0IE89MDtPPGc7TysrKXtjb25zdCAkPU8vZyxEPWQqTWF0aC5jb3MoJCpNYXRoLlBJLzIpLFk9cCpNYXRoLnNpbigkKk1hdGguUEkvMikreTtmb3IobGV0IFc9MCxpdD1WLmxlbmd0aDtXPGl0O1crKyl7Y29uc3QgbHQ9VShWW1ddLEZ0W1ddLFkpO3RlKGx0LngsbHQueSwtRCksJD09PTAmJk4ucHVzaChsdCl9Zm9yKGxldCBXPTAsaXQ9UjtXPGl0O1crKyl7Y29uc3QgbHQ9RltXXTtXdD1JdFtXXTtjb25zdCB3dD1bXTtmb3IobGV0IGVlPTAsRG49bHQubGVuZ3RoO2VlPERuO2VlKyspe2NvbnN0IG5lPVUobHRbZWVdLFd0W2VlXSxZKTt0ZShuZS54LG5lLnksLUQpLCQ9PT0wJiZ3dC5wdXNoKG5lKX0kPT09MCYmTC5wdXNoKHd0KX19WWU9dGkudHJpYW5ndWxhdGVTaGFwZShOLEwpfWNvbnN0IF9pPVllLmxlbmd0aCxvbz1wK3k7Zm9yKGxldCBOPTA7TjxLO04rKyl7Y29uc3QgTD1mP1UoRVtOXSx2dFtOXSxvbyk6RVtOXTtBPyhULmNvcHkodi5ub3JtYWxzWzBdKS5tdWx0aXBseVNjYWxhcihMLngpLF8uY29weSh2LmJpbm9ybWFsc1swXSkubXVsdGlwbHlTY2FsYXIoTC55KSx6LmNvcHkoU1swXSkuYWRkKFQpLmFkZChfKSx0ZSh6Lngsei55LHoueikpOnRlKEwueCxMLnksMCl9Zm9yKGxldCBOPTE7Tjw9aDtOKyspZm9yKGxldCBMPTA7TDxLO0wrKyl7Y29uc3QgTz1mP1UoRVtMXSx2dFtMXSxvbyk6RVtMXTtBPyhULmNvcHkodi5ub3JtYWxzW05dKS5tdWx0aXBseVNjYWxhcihPLngpLF8uY29weSh2LmJpbm9ybWFsc1tOXSkubXVsdGlwbHlTY2FsYXIoTy55KSx6LmNvcHkoU1tOXSkuYWRkKFQpLmFkZChfKSx0ZSh6Lngsei55LHoueikpOnRlKE8ueCxPLnksdS9oKk4pfWZvcihsZXQgTj1nLTE7Tj49MDtOLS0pe2NvbnN0IEw9Ti9nLE89ZCpNYXRoLmNvcyhMKk1hdGguUEkvMiksJD1wKk1hdGguc2luKEwqTWF0aC5QSS8yKSt5O2ZvcihsZXQgRD0wLFk9Vi5sZW5ndGg7RDxZO0QrKyl7Y29uc3QgVz1VKFZbRF0sRnRbRF0sJCk7dGUoVy54LFcueSx1K08pfWZvcihsZXQgRD0wLFk9Ri5sZW5ndGg7RDxZO0QrKyl7Y29uc3QgVz1GW0RdO1d0PUl0W0RdO2ZvcihsZXQgaXQ9MCxsdD1XLmxlbmd0aDtpdDxsdDtpdCsrKXtjb25zdCB3dD1VKFdbaXRdLFd0W2l0XSwkKTtBP3RlKHd0Lngsd3QueStTW2gtMV0ueSxTW2gtMV0ueCtPKTp0ZSh3dC54LHd0LnksdStPKX19fVBjKCksTSYmQ2MoKTtmdW5jdGlvbiBQYygpe2NvbnN0IE49cy5sZW5ndGgvMztpZihmKXtsZXQgTD0wLE89SypMO2lmKG0pZm9yKGxldCAkPTA7JDxfaTskKyspe2NvbnN0IEQ9WWVbJF07Y28oRFsyXStPLERbMV0rTyxEWzBdK08pfWlmKEw9aCtnKjIsTz1LKkwseClmb3IobGV0ICQ9MDskPF9pOyQrKyl7Y29uc3QgRD1ZZVskXTtjbyhEWzBdK08sRFsxXStPLERbMl0rTyl9fWVsc2V7aWYobSlmb3IobGV0IEw9MDtMPF9pO0wrKyl7Y29uc3QgTz1ZZVtMXTtjbyhPWzJdLE9bMV0sT1swXSl9aWYoeClmb3IobGV0IEw9MDtMPF9pO0wrKyl7Y29uc3QgTz1ZZVtMXTtjbyhPWzBdK0sqaCxPWzFdK0sqaCxPWzJdK0sqaCl9fW4uYWRkR3JvdXAoTixzLmxlbmd0aC8zLU4sMCl9ZnVuY3Rpb24gQ2MoKXtjb25zdCBOPXMubGVuZ3RoLzM7bGV0IEw9MDthbyhWLEwpLEwrPVYubGVuZ3RoO2ZvcihsZXQgTz0wLCQ9Ri5sZW5ndGg7TzwkO08rKyl7Y29uc3QgRD1GW09dO2FvKEQsTCksTCs9RC5sZW5ndGh9bi5hZGRHcm91cChOLHMubGVuZ3RoLzMtTiwxKX1mdW5jdGlvbiBhbyhOLEwpe2xldCBPPU4ubGVuZ3RoO2Zvcig7LS1PPj0wOyl7Y29uc3QgJD1PO2xldCBEPU8tMTtEPDAmJihEPU4ubGVuZ3RoLTEpO2ZvcihsZXQgWT0wLFc9aCtnKjI7WTxXO1krKyl7Y29uc3QgaXQ9SypZLGx0PUsqKFkrMSksd3Q9TCskK2l0LGVlPUwrRCtpdCxEbj1MK0QrbHQsbmU9TCskK2x0O294KHd0LGVlLERuLG5lKX19fWZ1bmN0aW9uIHRlKE4sTCxPKXtjLnB1c2goTiksYy5wdXNoKEwpLGMucHVzaChPKX1mdW5jdGlvbiBjbyhOLEwsTyl7amUoTiksamUoTCksamUoTyk7Y29uc3QgJD1zLmxlbmd0aC8zLEQ9Yi5nZW5lcmF0ZVRvcFVWKG4scywkLTMsJC0yLCQtMSk7UWUoRFswXSksUWUoRFsxXSksUWUoRFsyXSl9ZnVuY3Rpb24gb3goTixMLE8sJCl7amUoTiksamUoTCksamUoJCksamUoTCksamUoTyksamUoJCk7Y29uc3QgRD1zLmxlbmd0aC8zLFk9Yi5nZW5lcmF0ZVNpZGVXYWxsVVYobixzLEQtNixELTMsRC0yLEQtMSk7UWUoWVswXSksUWUoWVsxXSksUWUoWVszXSksUWUoWVsxXSksUWUoWVsyXSksUWUoWVszXSl9ZnVuY3Rpb24gamUoTil7cy5wdXNoKGNbTiozKzBdKSxzLnB1c2goY1tOKjMrMV0pLHMucHVzaChjW04qMysyXSl9ZnVuY3Rpb24gUWUoTil7ci5wdXNoKE4ueCksci5wdXNoKE4ueSl9fX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LHQucGFyYW1ldGVycyksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpLGU9dGhpcy5wYXJhbWV0ZXJzLnNoYXBlcyxuPXRoaXMucGFyYW1ldGVycy5vcHRpb25zO3JldHVybiBEZChlLG4sdCl9c3RhdGljIGZyb21KU09OKHQsZSl7Y29uc3Qgbj1bXTtmb3IobGV0IHI9MCxvPXQuc2hhcGVzLmxlbmd0aDtyPG87cisrKXtjb25zdCBhPWVbdC5zaGFwZXNbcl1dO24ucHVzaChhKX1jb25zdCBzPXQub3B0aW9ucy5leHRydWRlUGF0aDtyZXR1cm4gcyE9PXZvaWQgMCYmKHQub3B0aW9ucy5leHRydWRlUGF0aD1uZXcgTGRbcy50eXBlXSgpLmZyb21KU09OKHMpKSxuZXcgaWkobix0Lm9wdGlvbnMpfX1jb25zdCBPZD17Z2VuZXJhdGVUb3BVVjpmdW5jdGlvbihpLHQsZSxuLHMpe2NvbnN0IHI9dFtlKjNdLG89dFtlKjMrMV0sYT10W24qM10sYz10W24qMysxXSxsPXRbcyozXSxoPXRbcyozKzFdO3JldHVybltuZXcgayhyLG8pLG5ldyBrKGEsYyksbmV3IGsobCxoKV19LGdlbmVyYXRlU2lkZVdhbGxVVjpmdW5jdGlvbihpLHQsZSxuLHMscil7Y29uc3Qgbz10W2UqM10sYT10W2UqMysxXSxjPXRbZSozKzJdLGw9dFtuKjNdLGg9dFtuKjMrMV0sdT10W24qMysyXSxmPXRbcyozXSxkPXRbcyozKzFdLHA9dFtzKjMrMl0seT10W3IqM10sZz10W3IqMysxXSx3PXRbciozKzJdO3JldHVybiBNYXRoLmFicyhhLWgpPE1hdGguYWJzKG8tbCk/W25ldyBrKG8sMS1jKSxuZXcgayhsLDEtdSksbmV3IGsoZiwxLXApLG5ldyBrKHksMS13KV06W25ldyBrKGEsMS1jKSxuZXcgayhoLDEtdSksbmV3IGsoZCwxLXApLG5ldyBrKGcsMS13KV19fTtmdW5jdGlvbiBEZChpLHQsZSl7aWYoZS5zaGFwZXM9W10sQXJyYXkuaXNBcnJheShpKSlmb3IobGV0IG49MCxzPWkubGVuZ3RoO248cztuKyspe2NvbnN0IHI9aVtuXTtlLnNoYXBlcy5wdXNoKHIudXVpZCl9ZWxzZSBlLnNoYXBlcy5wdXNoKGkudXVpZCk7cmV0dXJuIGUub3B0aW9ucz1PYmplY3QuYXNzaWduKHt9LHQpLHQuZXh0cnVkZVBhdGghPT12b2lkIDAmJihlLm9wdGlvbnMuZXh0cnVkZVBhdGg9dC5leHRydWRlUGF0aC50b0pTT04oKSksZX1jb25zdCBNbD0wLCRkPTEsVmQ9MixBbD0yLEpvPTEuMjUsU2w9MSxOdD02KjQrNCs0LEF0PU50LzQsdmw9NjU1MzUsVWQ9TWF0aC5wb3coMiwtMjQpLFlvPVN5bWJvbCgiU0tJUF9HRU5FUkFUSU9OIik7ZnVuY3Rpb24gcWQoaSl7cmV0dXJuIGkuaW5kZXg/aS5pbmRleC5jb3VudDppLmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnR9ZnVuY3Rpb24gU24oaSl7cmV0dXJuIHFkKGkpLzN9ZnVuY3Rpb24gWGQoaSx0PUFycmF5QnVmZmVyKXtyZXR1cm4gaT42NTUzNT9uZXcgVWludDMyQXJyYXkobmV3IHQoNCppKSk6bmV3IFVpbnQxNkFycmF5KG5ldyB0KDIqaSkpfWZ1bmN0aW9uIFpkKGksdCl7aWYoIWkuaW5kZXgpe2NvbnN0IGU9aS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50LG49dC51c2VTaGFyZWRBcnJheUJ1ZmZlcj9TaGFyZWRBcnJheUJ1ZmZlcjpBcnJheUJ1ZmZlcixzPVhkKGUsbik7aS5zZXRJbmRleChuZXcgeHQocywxKSk7Zm9yKGxldCByPTA7cjxlO3IrKylzW3JdPXJ9fWZ1bmN0aW9uIF9sKGksdCl7Y29uc3QgZT1TbihpKSxuPXR8fGkuZHJhd1JhbmdlLHM9bi5zdGFydC8zLHI9KG4uc3RhcnQrbi5jb3VudCkvMyxvPU1hdGgubWF4KDAscyksYT1NYXRoLm1pbihlLHIpLW87cmV0dXJuW3tvZmZzZXQ6TWF0aC5mbG9vcihvKSxjb3VudDpNYXRoLmZsb29yKGEpfV19ZnVuY3Rpb24gemwoaSx0KXtpZighaS5ncm91cHN8fCFpLmdyb3Vwcy5sZW5ndGgpcmV0dXJuIF9sKGksdCk7Y29uc3QgZT1bXSxuPXR8fGkuZHJhd1JhbmdlLHM9bi5zdGFydC8zLHI9KG4uc3RhcnQrbi5jb3VudCkvMyxvPVNuKGkpLGE9W107Zm9yKGNvbnN0IGggb2YgaS5ncm91cHMpe2NvbnN0e3N0YXJ0OnUsY291bnQ6Zn09aCxkPXUvMyxwPWlzRmluaXRlKGYpP2Y6byozLXUseT0odStwKS8zO2Q8ciYmeT5zJiYoYS5wdXNoKHtwb3M6TWF0aC5tYXgocyxkKSxpc1N0YXJ0OiEwfSksYS5wdXNoKHtwb3M6TWF0aC5taW4ocix5KSxpc1N0YXJ0OiExfSkpfWEuc29ydCgoaCx1KT0+aC5wb3MhPT11LnBvcz9oLnBvcy11LnBvczpoLnR5cGU9PT0iZW5kIj8tMToxKTtsZXQgYz0wLGw9bnVsbDtmb3IoY29uc3QgaCBvZiBhKXtjb25zdCB1PWgucG9zO2MhPT0wJiZ1IT09bCYmZS5wdXNoKHtvZmZzZXQ6bCxjb3VudDp1LWx9KSxjKz1oLmlzU3RhcnQ/MTotMSxsPXV9cmV0dXJuIGV9ZnVuY3Rpb24gam8oaSx0LGUsbixzKXtsZXQgcj0xLzAsbz0xLzAsYT0xLzAsYz0tMS8wLGw9LTEvMCxoPS0xLzAsdT0xLzAsZj0xLzAsZD0xLzAscD0tMS8wLHk9LTEvMCxnPS0xLzA7Y29uc3Qgdz1pLm9mZnNldHx8MDtmb3IobGV0IGI9KHQtdykqNix4PSh0K2UtdykqNjtiPHg7Yis9Nil7Y29uc3QgbT1pW2IrMF0sTT1pW2IrMV0sUz1tLU0sQT1tK007UzxyJiYocj1TKSxBPmMmJihjPUEpLG08dSYmKHU9bSksbT5wJiYocD1tKTtjb25zdCB2PWlbYisyXSxfPWlbYiszXSxUPXYtXyx6PXYrXztUPG8mJihvPVQpLHo+bCYmKGw9eiksdjxmJiYoZj12KSx2PnkmJih5PXYpO2NvbnN0IEM9aVtiKzRdLEU9aVtiKzVdLEY9Qy1FLEI9QytFO0Y8YSYmKGE9RiksQj5oJiYoaD1CKSxDPGQmJihkPUMpLEM+ZyYmKGc9Qyl9blswXT1yLG5bMV09byxuWzJdPWEsblszXT1jLG5bNF09bCxuWzVdPWgsc1swXT11LHNbMV09ZixzWzJdPWQsc1szXT1wLHNbNF09eSxzWzVdPWd9ZnVuY3Rpb24gVGwoaSx0LGU9bnVsbCxuPW51bGwscz1udWxsKXtjb25zdCByPWkuYXR0cmlidXRlcy5wb3NpdGlvbixvPWkuaW5kZXg/aS5pbmRleC5hcnJheTpudWxsLGE9ci5ub3JtYWxpemVkO2lmKHM9PT1udWxsKXM9bmV3IEZsb2F0MzJBcnJheShlKjYpLHMub2Zmc2V0PXQ7ZWxzZSBpZih0PDB8fGUrdD5zLmxlbmd0aC82KXRocm93IG5ldyBFcnJvcigiTWVzaEJWSDogY29tcHV0ZSB0cmlhbmdsZSBib3VuZHMgcmFuZ2UgaXMgaW52YWxpZC4iKTtjb25zdCBjPXIuYXJyYXksbD1yLm9mZnNldHx8MDtsZXQgaD0zO3IuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSYmKGg9ci5kYXRhLnN0cmlkZSk7Y29uc3QgdT1bImdldFgiLCJnZXRZIiwiZ2V0WiJdLGY9cy5vZmZzZXQ7Zm9yKGxldCBkPXQscD10K2U7ZDxwO2QrKyl7Y29uc3QgZz0obj9uW2RdOmQpKjMsdz0oZC1mKSo2O2xldCBiPWcrMCx4PWcrMSxtPWcrMjtvJiYoYj1vW2JdLHg9b1t4XSxtPW9bbV0pLGF8fChiPWIqaCtsLHg9eCpoK2wsbT1tKmgrbCk7Zm9yKGxldCBNPTA7TTwzO00rKyl7bGV0IFMsQSx2O2E/KFM9clt1W01dXShiKSxBPXJbdVtNXV0oeCksdj1yW3VbTV1dKG0pKTooUz1jW2IrTV0sQT1jW3grTV0sdj1jW20rTV0pO2xldCBfPVM7QTxfJiYoXz1BKSx2PF8mJihfPXYpO2xldCBUPVM7QT5UJiYoVD1BKSx2PlQmJihUPXYpO2NvbnN0IHo9KFQtXykvMixDPU0qMjtzW3crQyswXT1fK3osc1t3K0MrMV09eisoTWF0aC5hYnMoXykreikqVWR9fXJldHVybiBzfWZ1bmN0aW9uIGh0KGksdCxlKXtyZXR1cm4gZS5taW4ueD10W2ldLGUubWluLnk9dFtpKzFdLGUubWluLno9dFtpKzJdLGUubWF4Lng9dFtpKzNdLGUubWF4Lnk9dFtpKzRdLGUubWF4Lno9dFtpKzVdLGV9ZnVuY3Rpb24gUGwoaSl7bGV0IHQ9LTEsZT0tMS8wO2ZvcihsZXQgbj0wO248MztuKyspe2NvbnN0IHM9aVtuKzNdLWlbbl07cz5lJiYoZT1zLHQ9bil9cmV0dXJuIHR9ZnVuY3Rpb24gQ2woaSx0KXt0LnNldChpKX1mdW5jdGlvbiBFbChpLHQsZSl7bGV0IG4scztmb3IobGV0IHI9MDtyPDM7cisrKXtjb25zdCBvPXIrMztuPWlbcl0scz10W3JdLGVbcl09bjxzP246cyxuPWlbb10scz10W29dLGVbb109bj5zP246c319ZnVuY3Rpb24gJHMoaSx0LGUpe2ZvcihsZXQgbj0wO248MztuKyspe2NvbnN0IHM9dFtpKzIqbl0scj10W2krMipuKzFdLG89cy1yLGE9cytyO288ZVtuXSYmKGVbbl09byksYT5lW24rM10mJihlW24rM109YSl9fWZ1bmN0aW9uICRpKGkpe2NvbnN0IHQ9aVszXS1pWzBdLGU9aVs0XS1pWzFdLG49aVs1XS1pWzJdO3JldHVybiAyKih0KmUrZSpuK24qdCl9Y29uc3QgTGU9MzIsR2Q9KGksdCk9PmkuY2FuZGlkYXRlLXQuY2FuZGlkYXRlLG9uPW5ldyBBcnJheShMZSkuZmlsbCgpLm1hcCgoKT0+KHtjb3VudDowLGJvdW5kczpuZXcgRmxvYXQzMkFycmF5KDYpLHJpZ2h0Q2FjaGVCb3VuZHM6bmV3IEZsb2F0MzJBcnJheSg2KSxsZWZ0Q2FjaGVCb3VuZHM6bmV3IEZsb2F0MzJBcnJheSg2KSxjYW5kaWRhdGU6MH0pKSxWcz1uZXcgRmxvYXQzMkFycmF5KDYpO2Z1bmN0aW9uIFdkKGksdCxlLG4scyxyKXtsZXQgbz0tMSxhPTA7aWYocj09PU1sKW89UGwodCksbyE9PS0xJiYoYT0odFtvXSt0W28rM10pLzIpO2Vsc2UgaWYocj09PSRkKW89UGwoaSksbyE9PS0xJiYoYT1IZChlLG4scyxvKSk7ZWxzZSBpZihyPT09VmQpe2NvbnN0IGM9JGkoaSk7bGV0IGw9Sm8qcztjb25zdCBoPWUub2Zmc2V0fHwwLHU9KG4taCkqNixmPShuK3MtaCkqNjtmb3IobGV0IGQ9MDtkPDM7ZCsrKXtjb25zdCBwPXRbZF0sdz0odFtkKzNdLXApL0xlO2lmKHM8TGUvNCl7Y29uc3QgYj1bLi4ub25dO2IubGVuZ3RoPXM7bGV0IHg9MDtmb3IobGV0IE09dTtNPGY7TSs9Nix4Kyspe2NvbnN0IFM9Ylt4XTtTLmNhbmRpZGF0ZT1lW00rMipkXSxTLmNvdW50PTA7Y29uc3R7Ym91bmRzOkEsbGVmdENhY2hlQm91bmRzOnYscmlnaHRDYWNoZUJvdW5kczpffT1TO2ZvcihsZXQgVD0wO1Q8MztUKyspX1tUXT0xLzAsX1tUKzNdPS0xLzAsdltUXT0xLzAsdltUKzNdPS0xLzAsQVtUXT0xLzAsQVtUKzNdPS0xLzA7JHMoTSxlLEEpfWIuc29ydChHZCk7bGV0IG09cztmb3IobGV0IE09MDtNPG07TSsrKXtjb25zdCBTPWJbTV07Zm9yKDtNKzE8bSYmYltNKzFdLmNhbmRpZGF0ZT09PVMuY2FuZGlkYXRlOyliLnNwbGljZShNKzEsMSksbS0tfWZvcihsZXQgTT11O008ZjtNKz02KXtjb25zdCBTPWVbTSsyKmRdO2ZvcihsZXQgQT0wO0E8bTtBKyspe2NvbnN0IHY9YltBXTtTPj12LmNhbmRpZGF0ZT8kcyhNLGUsdi5yaWdodENhY2hlQm91bmRzKTooJHMoTSxlLHYubGVmdENhY2hlQm91bmRzKSx2LmNvdW50KyspfX1mb3IobGV0IE09MDtNPG07TSsrKXtjb25zdCBTPWJbTV0sQT1TLmNvdW50LHY9cy1TLmNvdW50LF89Uy5sZWZ0Q2FjaGVCb3VuZHMsVD1TLnJpZ2h0Q2FjaGVCb3VuZHM7bGV0IHo9MDtBIT09MCYmKHo9JGkoXykvYyk7bGV0IEM9MDt2IT09MCYmKEM9JGkoVCkvYyk7Y29uc3QgRT1TbCtKbyooeipBK0Mqdik7RTxsJiYobz1kLGw9RSxhPVMuY2FuZGlkYXRlKX19ZWxzZXtmb3IobGV0IG09MDttPExlO20rKyl7Y29uc3QgTT1vblttXTtNLmNvdW50PTAsTS5jYW5kaWRhdGU9cCt3K20qdztjb25zdCBTPU0uYm91bmRzO2ZvcihsZXQgQT0wO0E8MztBKyspU1tBXT0xLzAsU1tBKzNdPS0xLzB9Zm9yKGxldCBtPXU7bTxmO20rPTYpe2xldCBBPX5+KChlW20rMipkXS1wKS93KTtBPj1MZSYmKEE9TGUtMSk7Y29uc3Qgdj1vbltBXTt2LmNvdW50KyssJHMobSxlLHYuYm91bmRzKX1jb25zdCBiPW9uW0xlLTFdO0NsKGIuYm91bmRzLGIucmlnaHRDYWNoZUJvdW5kcyk7Zm9yKGxldCBtPUxlLTI7bT49MDttLS0pe2NvbnN0IE09b25bbV0sUz1vblttKzFdO0VsKE0uYm91bmRzLFMucmlnaHRDYWNoZUJvdW5kcyxNLnJpZ2h0Q2FjaGVCb3VuZHMpfWxldCB4PTA7Zm9yKGxldCBtPTA7bTxMZS0xO20rKyl7Y29uc3QgTT1vblttXSxTPU0uY291bnQsQT1NLmJvdW5kcyxfPW9uW20rMV0ucmlnaHRDYWNoZUJvdW5kcztTIT09MCYmKHg9PT0wP0NsKEEsVnMpOkVsKEEsVnMsVnMpKSx4Kz1TO2xldCBUPTAsej0wO3ghPT0wJiYoVD0kaShWcykvYyk7Y29uc3QgQz1zLXg7QyE9PTAmJih6PSRpKF8pL2MpO2NvbnN0IEU9U2wrSm8qKFQqeCt6KkMpO0U8bCYmKG89ZCxsPUUsYT1NLmNhbmRpZGF0ZSl9fX19ZWxzZSBjb25zb2xlLndhcm4oYE1lc2hCVkg6IEludmFsaWQgYnVpbGQgc3RyYXRlZ3kgdmFsdWUgJHtyfSB1c2VkLmApO3JldHVybntheGlzOm8scG9zOmF9fWZ1bmN0aW9uIEhkKGksdCxlLG4pe2xldCBzPTA7Y29uc3Qgcj1pLm9mZnNldDtmb3IobGV0IG89dCxhPXQrZTtvPGE7bysrKXMrPWlbKG8tcikqNituKjJdO3JldHVybiBzL2V9Y2xhc3MgUW97Y29uc3RydWN0b3IoKXt0aGlzLmJvdW5kaW5nRGF0YT1uZXcgRmxvYXQzMkFycmF5KDYpfX1mdW5jdGlvbiBKZChpLHQsZSxuLHMscil7bGV0IG89bixhPW4rcy0xO2NvbnN0IGM9ci5wb3MsbD1yLmF4aXMqMixoPWUub2Zmc2V0fHwwO2Zvcig7Oyl7Zm9yKDtvPD1hJiZlWyhvLWgpKjYrbF08YzspbysrO2Zvcig7bzw9YSYmZVsoYS1oKSo2K2xdPj1jOylhLS07aWYobzxhKXtmb3IobGV0IHU9MDt1PDM7dSsrKXtsZXQgZj10W28qMyt1XTt0W28qMyt1XT10W2EqMyt1XSx0W2EqMyt1XT1mfWZvcihsZXQgdT0wO3U8Njt1Kyspe2NvbnN0IGY9by1oLGQ9YS1oLHA9ZVtmKjYrdV07ZVtmKjYrdV09ZVtkKjYrdV0sZVtkKjYrdV09cH1vKyssYS0tfWVsc2UgcmV0dXJuIG99fWZ1bmN0aW9uIFlkKGksdCxlLG4scyxyKXtsZXQgbz1uLGE9bitzLTE7Y29uc3QgYz1yLnBvcyxsPXIuYXhpcyoyLGg9ZS5vZmZzZXR8fDA7Zm9yKDs7KXtmb3IoO288PWEmJmVbKG8taCkqNitsXTxjOylvKys7Zm9yKDtvPD1hJiZlWyhhLWgpKjYrbF0+PWM7KWEtLTtpZihvPGEpe2xldCB1PWlbb107aVtvXT1pW2FdLGlbYV09dTtmb3IobGV0IGY9MDtmPDY7ZisrKXtjb25zdCBkPW8taCxwPWEtaCx5PWVbZCo2K2ZdO2VbZCo2K2ZdPWVbcCo2K2ZdLGVbcCo2K2ZdPXl9bysrLGEtLX1lbHNlIHJldHVybiBvfX1sZXQgQmwsVXMsS28sRmw7Y29uc3QgamQ9TWF0aC5wb3coMiwzMik7ZnVuY3Rpb24gdGEoaSl7cmV0dXJuImNvdW50ImluIGk/MToxK3RhKGkubGVmdCkrdGEoaS5yaWdodCl9ZnVuY3Rpb24gUWQoaSx0LGUpe3JldHVybiBCbD1uZXcgRmxvYXQzMkFycmF5KGUpLFVzPW5ldyBVaW50MzJBcnJheShlKSxLbz1uZXcgVWludDE2QXJyYXkoZSksRmw9bmV3IFVpbnQ4QXJyYXkoZSksZWEoaSx0KX1mdW5jdGlvbiBlYShpLHQpe2NvbnN0IGU9aS80LG49aS8yLHM9ImNvdW50ImluIHQscj10LmJvdW5kaW5nRGF0YTtmb3IobGV0IG89MDtvPDY7bysrKUJsW2Urb109cltvXTtpZihzKXJldHVybiB0LmJ1ZmZlcj8oRmwuc2V0KG5ldyBVaW50OEFycmF5KHQuYnVmZmVyKSxpKSxpK3QuYnVmZmVyLmJ5dGVMZW5ndGgpOihVc1tlKzZdPXQub2Zmc2V0LEtvW24rMTRdPXQuY291bnQsS29bbisxNV09dmwsaStOdCk7e2NvbnN0e2xlZnQ6byxyaWdodDphLHNwbGl0QXhpczpjfT10LGw9aStOdDtsZXQgaD1lYShsLG8pO2NvbnN0IHU9aS9OdCxkPWgvTnQtdTtpZihkPmpkKXRocm93IG5ldyBFcnJvcigiTWVzaEJWSDogQ2Fubm90IHN0b3JlIHJlbGF0aXZlIGNoaWxkIG5vZGUgb2Zmc2V0IGdyZWF0ZXIgdGhhbiAzMiBiaXRzLiIpO3JldHVybiBVc1tlKzZdPWQsVXNbZSs3XT1jLGVhKGgsYSl9fWZ1bmN0aW9uIEtkKGksdCxlKXtjb25zdCBzPShpLmluZGV4P2kuaW5kZXguY291bnQ6aS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50KS8zPnppKDIsMTYpLHI9ZS5yZWR1Y2UoKGgsdSk9PmgrdS5jb3VudCwwKSxvPXM/NDoyLGE9dD9uZXcgU2hhcmVkQXJyYXlCdWZmZXIocipvKTpuZXcgQXJyYXlCdWZmZXIocipvKSxjPXM/bmV3IFVpbnQzMkFycmF5KGEpOm5ldyBVaW50MTZBcnJheShhKTtsZXQgbD0wO2ZvcihsZXQgaD0wO2g8ZS5sZW5ndGg7aCsrKXtjb25zdHtvZmZzZXQ6dSxjb3VudDpmfT1lW2hdO2ZvcihsZXQgZD0wO2Q8ZjtkKyspY1tsK2RdPXUrZDtsKz1mfXJldHVybiBjfWZ1bmN0aW9uIHQwKGksdCxlLG4scyl7Y29uc3R7bWF4RGVwdGg6cix2ZXJib3NlOm8sbWF4TGVhZlRyaXM6YSxzdHJhdGVneTpjLG9uUHJvZ3Jlc3M6bCxpbmRpcmVjdDpofT1zLHU9aS5faW5kaXJlY3RCdWZmZXIsZj1pLmdlb21ldHJ5LGQ9Zi5pbmRleD9mLmluZGV4LmFycmF5Om51bGwscD1oP1lkOkpkLHk9U24oZiksZz1uZXcgRmxvYXQzMkFycmF5KDYpO2xldCB3PSExO2NvbnN0IGI9bmV3IFFvO3JldHVybiBqbyh0LGUsbixiLmJvdW5kaW5nRGF0YSxnKSxtKGIsZSxuLGcpLGI7ZnVuY3Rpb24geChNKXtsJiZsKE0veSl9ZnVuY3Rpb24gbShNLFMsQSx2PW51bGwsXz0wKXtpZighdyYmXz49ciYmKHc9ITAsbyYmKGNvbnNvbGUud2FybihgTWVzaEJWSDogTWF4IGRlcHRoIG9mICR7cn0gcmVhY2hlZCB3aGVuIGdlbmVyYXRpbmcgQlZILiBDb25zaWRlciBpbmNyZWFzaW5nIG1heERlcHRoLmApLGNvbnNvbGUud2FybihmKSkpLEE8PWF8fF8+PXIpcmV0dXJuIHgoUytBKSxNLm9mZnNldD1TLE0uY291bnQ9QSxNO2NvbnN0IFQ9V2QoTS5ib3VuZGluZ0RhdGEsdix0LFMsQSxjKTtpZihULmF4aXM9PT0tMSlyZXR1cm4geChTK0EpLE0ub2Zmc2V0PVMsTS5jb3VudD1BLE07Y29uc3Qgej1wKHUsZCx0LFMsQSxUKTtpZih6PT09U3x8ej09PVMrQSl4KFMrQSksTS5vZmZzZXQ9UyxNLmNvdW50PUE7ZWxzZXtNLnNwbGl0QXhpcz1ULmF4aXM7Y29uc3QgQz1uZXcgUW8sRT1TLEY9ei1TO00ubGVmdD1DLGpvKHQsRSxGLEMuYm91bmRpbmdEYXRhLGcpLG0oQyxFLEYsZyxfKzEpO2NvbnN0IEI9bmV3IFFvLEk9eixSPUEtRjtNLnJpZ2h0PUIsam8odCxJLFIsQi5ib3VuZGluZ0RhdGEsZyksbShCLEksUixnLF8rMSl9cmV0dXJuIE19fWZ1bmN0aW9uIGUwKGksdCl7Y29uc3QgZT10LnVzZVNoYXJlZEFycmF5QnVmZmVyP1NoYXJlZEFycmF5QnVmZmVyOkFycmF5QnVmZmVyLG49aS5nZW9tZXRyeTtsZXQgcyxyO2lmKHQuaW5kaXJlY3Qpe2NvbnN0IG89emwobix0LnJhbmdlKSxhPUtkKG4sdC51c2VTaGFyZWRBcnJheUJ1ZmZlcixvKTtpLl9pbmRpcmVjdEJ1ZmZlcj1hLHM9VGwobiwwLGEubGVuZ3RoLGEpLHI9W3tvZmZzZXQ6MCxjb3VudDphLmxlbmd0aH1dfWVsc2V7WmQobix0KTtjb25zdCBvPV9sKG4sdC5yYW5nZSlbMF07cz1UbChuLG8ub2Zmc2V0LG8uY291bnQpLHI9emwobix0LnJhbmdlKX1pLl9yb290cz1yLm1hcChvPT57Y29uc3QgYT10MChpLHMsby5vZmZzZXQsby5jb3VudCx0KSxjPXRhKGEpLGw9bmV3IGUoTnQqYyk7cmV0dXJuIFFkKDAsYSxsKSxsfSl9Y2xhc3MgT2V7Y29uc3RydWN0b3IoKXt0aGlzLm1pbj0xLzAsdGhpcy5tYXg9LTEvMH1zZXRGcm9tUG9pbnRzRmllbGQodCxlKXtsZXQgbj0xLzAscz0tMS8wO2ZvcihsZXQgcj0wLG89dC5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYz10W3JdW2VdO249YzxuP2M6bixzPWM+cz9jOnN9dGhpcy5taW49bix0aGlzLm1heD1zfXNldEZyb21Qb2ludHModCxlKXtsZXQgbj0xLzAscz0tMS8wO2ZvcihsZXQgcj0wLG89ZS5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT1lW3JdLGM9dC5kb3QoYSk7bj1jPG4/YzpuLHM9Yz5zP2M6c310aGlzLm1pbj1uLHRoaXMubWF4PXN9aXNTZXBhcmF0ZWQodCl7cmV0dXJuIHRoaXMubWluPnQubWF4fHx0Lm1pbj50aGlzLm1heH19T2UucHJvdG90eXBlLnNldEZyb21Cb3g9ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBQO3JldHVybiBmdW5jdGlvbihlLG4pe2NvbnN0IHM9bi5taW4scj1uLm1heDtsZXQgbz0xLzAsYT0tMS8wO2ZvcihsZXQgYz0wO2M8PTE7YysrKWZvcihsZXQgbD0wO2w8PTE7bCsrKWZvcihsZXQgaD0wO2g8PTE7aCsrKXtpLng9cy54KmMrci54KigxLWMpLGkueT1zLnkqbCtyLnkqKDEtbCksaS56PXMueipoK3IueiooMS1oKTtjb25zdCB1PWUuZG90KGkpO289TWF0aC5taW4odSxvKSxhPU1hdGgubWF4KHUsYSl9dGhpcy5taW49byx0aGlzLm1heD1hfX0oKTtjb25zdCBuMD1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IFAsdD1uZXcgUCxlPW5ldyBQO3JldHVybiBmdW5jdGlvbihzLHIsbyl7Y29uc3QgYT1zLnN0YXJ0LGM9aSxsPXIuc3RhcnQsaD10O2Uuc3ViVmVjdG9ycyhhLGwpLGkuc3ViVmVjdG9ycyhzLmVuZCxzLnN0YXJ0KSx0LnN1YlZlY3RvcnMoci5lbmQsci5zdGFydCk7Y29uc3QgdT1lLmRvdChoKSxmPWguZG90KGMpLGQ9aC5kb3QoaCkscD1lLmRvdChjKSxnPWMuZG90KGMpKmQtZipmO2xldCB3LGI7ZyE9PTA/dz0odSpmLXAqZCkvZzp3PTAsYj0odSt3KmYpL2Qsby54PXcsby55PWJ9fSgpLG5hPWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgayx0PW5ldyBQLGU9bmV3IFA7cmV0dXJuIGZ1bmN0aW9uKHMscixvLGEpe24wKHMscixpKTtsZXQgYz1pLngsbD1pLnk7aWYoYz49MCYmYzw9MSYmbD49MCYmbDw9MSl7cy5hdChjLG8pLHIuYXQobCxhKTtyZXR1cm59ZWxzZSBpZihjPj0wJiZjPD0xKXtsPDA/ci5hdCgwLGEpOnIuYXQoMSxhKSxzLmNsb3Nlc3RQb2ludFRvUG9pbnQoYSwhMCxvKTtyZXR1cm59ZWxzZSBpZihsPj0wJiZsPD0xKXtjPDA/cy5hdCgwLG8pOnMuYXQoMSxvKSxyLmNsb3Nlc3RQb2ludFRvUG9pbnQobywhMCxhKTtyZXR1cm59ZWxzZXtsZXQgaDtjPDA/aD1zLnN0YXJ0Omg9cy5lbmQ7bGV0IHU7bDwwP3U9ci5zdGFydDp1PXIuZW5kO2NvbnN0IGY9dCxkPWU7aWYocy5jbG9zZXN0UG9pbnRUb1BvaW50KHUsITAsdCksci5jbG9zZXN0UG9pbnRUb1BvaW50KGgsITAsZSksZi5kaXN0YW5jZVRvU3F1YXJlZCh1KTw9ZC5kaXN0YW5jZVRvU3F1YXJlZChoKSl7by5jb3B5KGYpLGEuY29weSh1KTtyZXR1cm59ZWxzZXtvLmNvcHkoaCksYS5jb3B5KGQpO3JldHVybn19fX0oKSxpMD1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IFAsdD1uZXcgUCxlPW5ldyBSbyxuPW5ldyByZTtyZXR1cm4gZnVuY3Rpb24ocixvKXtjb25zdHtyYWRpdXM6YSxjZW50ZXI6Y309cix7YTpsLGI6aCxjOnV9PW87aWYobi5zdGFydD1sLG4uZW5kPWgsbi5jbG9zZXN0UG9pbnRUb1BvaW50KGMsITAsaSkuZGlzdGFuY2VUbyhjKTw9YXx8KG4uc3RhcnQ9bCxuLmVuZD11LG4uY2xvc2VzdFBvaW50VG9Qb2ludChjLCEwLGkpLmRpc3RhbmNlVG8oYyk8PWEpfHwobi5zdGFydD1oLG4uZW5kPXUsbi5jbG9zZXN0UG9pbnRUb1BvaW50KGMsITAsaSkuZGlzdGFuY2VUbyhjKTw9YSkpcmV0dXJuITA7Y29uc3QgeT1vLmdldFBsYW5lKGUpO2lmKE1hdGguYWJzKHkuZGlzdGFuY2VUb1BvaW50KGMpKTw9YSl7Y29uc3Qgdz15LnByb2plY3RQb2ludChjLHQpO2lmKG8uY29udGFpbnNQb2ludCh3KSlyZXR1cm4hMH1yZXR1cm4hMX19KCksczA9WyJ4IiwieSIsInoiXSxEZT0xZS0xNSxJbD1EZSpEZTtmdW5jdGlvbiBvZShpKXtyZXR1cm4gTWF0aC5hYnMoaSk8RGV9Y2xhc3MgYWUgZXh0ZW5kcyBldHtjb25zdHJ1Y3RvciguLi50KXtzdXBlciguLi50KSx0aGlzLmlzRXh0ZW5kZWRUcmlhbmdsZT0hMCx0aGlzLnNhdEF4ZXM9bmV3IEFycmF5KDQpLmZpbGwoKS5tYXAoKCk9Pm5ldyBQKSx0aGlzLnNhdEJvdW5kcz1uZXcgQXJyYXkoNCkuZmlsbCgpLm1hcCgoKT0+bmV3IE9lKSx0aGlzLnBvaW50cz1bdGhpcy5hLHRoaXMuYix0aGlzLmNdLHRoaXMucGxhbmU9bmV3IFJvLHRoaXMuaXNEZWdlbmVyYXRlSW50b1NlZ21lbnQ9ITEsdGhpcy5pc0RlZ2VuZXJhdGVJbnRvUG9pbnQ9ITEsdGhpcy5kZWdlbmVyYXRlU2VnbWVudD1uZXcgcmUsdGhpcy5uZWVkc1VwZGF0ZT0hMH1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiBpMCh0LHRoaXMpfXVwZGF0ZSgpe2NvbnN0IHQ9dGhpcy5hLGU9dGhpcy5iLG49dGhpcy5jLHM9dGhpcy5wb2ludHMscj10aGlzLnNhdEF4ZXMsbz10aGlzLnNhdEJvdW5kcyxhPXJbMF0sYz1vWzBdO3RoaXMuZ2V0Tm9ybWFsKGEpLGMuc2V0RnJvbVBvaW50cyhhLHMpO2NvbnN0IGw9clsxXSxoPW9bMV07bC5zdWJWZWN0b3JzKHQsZSksaC5zZXRGcm9tUG9pbnRzKGwscyk7Y29uc3QgdT1yWzJdLGY9b1syXTt1LnN1YlZlY3RvcnMoZSxuKSxmLnNldEZyb21Qb2ludHModSxzKTtjb25zdCBkPXJbM10scD1vWzNdO2Quc3ViVmVjdG9ycyhuLHQpLHAuc2V0RnJvbVBvaW50cyhkLHMpO2NvbnN0IHk9bC5sZW5ndGgoKSxnPXUubGVuZ3RoKCksdz1kLmxlbmd0aCgpO3RoaXMuaXNEZWdlbmVyYXRlSW50b1BvaW50PSExLHRoaXMuaXNEZWdlbmVyYXRlSW50b1NlZ21lbnQ9ITEseTxEZT9nPERlfHx3PERlP3RoaXMuaXNEZWdlbmVyYXRlSW50b1BvaW50PSEwOih0aGlzLmlzRGVnZW5lcmF0ZUludG9TZWdtZW50PSEwLHRoaXMuZGVnZW5lcmF0ZVNlZ21lbnQuc3RhcnQuY29weSh0KSx0aGlzLmRlZ2VuZXJhdGVTZWdtZW50LmVuZC5jb3B5KG4pKTpnPERlP3c8RGU/dGhpcy5pc0RlZ2VuZXJhdGVJbnRvUG9pbnQ9ITA6KHRoaXMuaXNEZWdlbmVyYXRlSW50b1NlZ21lbnQ9ITAsdGhpcy5kZWdlbmVyYXRlU2VnbWVudC5zdGFydC5jb3B5KGUpLHRoaXMuZGVnZW5lcmF0ZVNlZ21lbnQuZW5kLmNvcHkodCkpOnc8RGUmJih0aGlzLmlzRGVnZW5lcmF0ZUludG9TZWdtZW50PSEwLHRoaXMuZGVnZW5lcmF0ZVNlZ21lbnQuc3RhcnQuY29weShuKSx0aGlzLmRlZ2VuZXJhdGVTZWdtZW50LmVuZC5jb3B5KGUpKSx0aGlzLnBsYW5lLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KGEsdCksdGhpcy5uZWVkc1VwZGF0ZT0hMX19YWUucHJvdG90eXBlLmNsb3Nlc3RQb2ludFRvU2VnbWVudD1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IFAsdD1uZXcgUCxlPW5ldyByZTtyZXR1cm4gZnVuY3Rpb24ocyxyPW51bGwsbz1udWxsKXtjb25zdHtzdGFydDphLGVuZDpjfT1zLGw9dGhpcy5wb2ludHM7bGV0IGgsdT0xLzA7Zm9yKGxldCBmPTA7ZjwzO2YrKyl7Y29uc3QgZD0oZisxKSUzO2Uuc3RhcnQuY29weShsW2ZdKSxlLmVuZC5jb3B5KGxbZF0pLG5hKGUscyxpLHQpLGg9aS5kaXN0YW5jZVRvU3F1YXJlZCh0KSxoPHUmJih1PWgsciYmci5jb3B5KGkpLG8mJm8uY29weSh0KSl9cmV0dXJuIHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChhLGkpLGg9YS5kaXN0YW5jZVRvU3F1YXJlZChpKSxoPHUmJih1PWgsciYmci5jb3B5KGkpLG8mJm8uY29weShhKSksdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KGMsaSksaD1jLmRpc3RhbmNlVG9TcXVhcmVkKGkpLGg8dSYmKHU9aCxyJiZyLmNvcHkoaSksbyYmby5jb3B5KGMpKSxNYXRoLnNxcnQodSl9fSgpLGFlLnByb3RvdHlwZS5pbnRlcnNlY3RzVHJpYW5nbGU9ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBhZSx0PW5ldyBPZSxlPW5ldyBPZSxuPW5ldyBQLHM9bmV3IFAscj1uZXcgUCxvPW5ldyBQLGE9bmV3IHJlLGM9bmV3IHJlLGw9bmV3IFAsaD1uZXcgayx1PW5ldyBrO2Z1bmN0aW9uIGYoeCxtLE0sUyl7Y29uc3QgQT1uOyF4LmlzRGVnZW5lcmF0ZUludG9Qb2ludCYmIXguaXNEZWdlbmVyYXRlSW50b1NlZ21lbnQ/QS5jb3B5KHgucGxhbmUubm9ybWFsKTpBLmNvcHkobS5wbGFuZS5ub3JtYWwpO2NvbnN0IHY9eC5zYXRCb3VuZHMsXz14LnNhdEF4ZXM7Zm9yKGxldCBDPTE7Qzw0O0MrKyl7Y29uc3QgRT12W0NdLEY9X1tDXTtpZih0LnNldEZyb21Qb2ludHMoRixtLnBvaW50cyksRS5pc1NlcGFyYXRlZCh0KXx8KG8uY29weShBKS5jcm9zcyhGKSx0LnNldEZyb21Qb2ludHMobyx4LnBvaW50cyksZS5zZXRGcm9tUG9pbnRzKG8sbS5wb2ludHMpLHQuaXNTZXBhcmF0ZWQoZSkpKXJldHVybiExfWNvbnN0IFQ9bS5zYXRCb3VuZHMsej1tLnNhdEF4ZXM7Zm9yKGxldCBDPTE7Qzw0O0MrKyl7Y29uc3QgRT1UW0NdLEY9eltDXTtpZih0LnNldEZyb21Qb2ludHMoRix4LnBvaW50cyksRS5pc1NlcGFyYXRlZCh0KXx8KG8uY3Jvc3NWZWN0b3JzKEEsRiksdC5zZXRGcm9tUG9pbnRzKG8seC5wb2ludHMpLGUuc2V0RnJvbVBvaW50cyhvLG0ucG9pbnRzKSx0LmlzU2VwYXJhdGVkKGUpKSlyZXR1cm4hMX1yZXR1cm4gTSYmKFN8fGNvbnNvbGUud2FybigiRXh0ZW5kZWRUcmlhbmdsZS5pbnRlcnNlY3RzVHJpYW5nbGU6IFRyaWFuZ2xlcyBhcmUgY29wbGFuYXIgd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBhbiBvdXRwdXQgZWRnZS4gU2V0dGluZyBlZGdlIHRvIDAsIDAsIDAuIiksTS5zdGFydC5zZXQoMCwwLDApLE0uZW5kLnNldCgwLDAsMCkpLCEwfWZ1bmN0aW9uIGQoeCxtLE0sUyxBLHYsXyxULHosQyxFKXtsZXQgRj1fLyhfLVQpO0MueD1TKyhBLVMpKkYsRS5zdGFydC5zdWJWZWN0b3JzKG0seCkubXVsdGlwbHlTY2FsYXIoRikuYWRkKHgpLEY9Xy8oXy16KSxDLnk9Uysodi1TKSpGLEUuZW5kLnN1YlZlY3RvcnMoTSx4KS5tdWx0aXBseVNjYWxhcihGKS5hZGQoeCl9ZnVuY3Rpb24gcCh4LG0sTSxTLEEsdixfLFQseixDLEUpe2lmKEE+MClkKHguYyx4LmEseC5iLFMsbSxNLHosXyxULEMsRSk7ZWxzZSBpZih2PjApZCh4LmIseC5hLHguYyxNLG0sUyxULF8seixDLEUpO2Vsc2UgaWYoVCp6PjB8fF8hPTApZCh4LmEseC5iLHguYyxtLE0sUyxfLFQseixDLEUpO2Vsc2UgaWYoVCE9MClkKHguYix4LmEseC5jLE0sbSxTLFQsXyx6LEMsRSk7ZWxzZSBpZih6IT0wKWQoeC5jLHguYSx4LmIsUyxtLE0seixfLFQsQyxFKTtlbHNlIHJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIHkoeCxtLE0sUyl7Y29uc3QgQT1tLmRlZ2VuZXJhdGVTZWdtZW50LHY9eC5wbGFuZS5kaXN0YW5jZVRvUG9pbnQoQS5zdGFydCksXz14LnBsYW5lLmRpc3RhbmNlVG9Qb2ludChBLmVuZCk7cmV0dXJuIG9lKHYpP29lKF8pP2YoeCxtLE0sUyk6KE0mJihNLnN0YXJ0LmNvcHkoQS5zdGFydCksTS5lbmQuY29weShBLnN0YXJ0KSkseC5jb250YWluc1BvaW50KEEuc3RhcnQpKTpvZShfKT8oTSYmKE0uc3RhcnQuY29weShBLmVuZCksTS5lbmQuY29weShBLmVuZCkpLHguY29udGFpbnNQb2ludChBLmVuZCkpOngucGxhbmUuaW50ZXJzZWN0TGluZShBLG4pIT1udWxsPyhNJiYoTS5zdGFydC5jb3B5KG4pLE0uZW5kLmNvcHkobikpLHguY29udGFpbnNQb2ludChuKSk6ITF9ZnVuY3Rpb24gZyh4LG0sTSl7Y29uc3QgUz1tLmE7cmV0dXJuIG9lKHgucGxhbmUuZGlzdGFuY2VUb1BvaW50KFMpKSYmeC5jb250YWluc1BvaW50KFMpPyhNJiYoTS5zdGFydC5jb3B5KFMpLE0uZW5kLmNvcHkoUykpLCEwKTohMX1mdW5jdGlvbiB3KHgsbSxNKXtjb25zdCBTPXguZGVnZW5lcmF0ZVNlZ21lbnQsQT1tLmE7cmV0dXJuIFMuY2xvc2VzdFBvaW50VG9Qb2ludChBLCEwLG4pLEEuZGlzdGFuY2VUb1NxdWFyZWQobik8SWw/KE0mJihNLnN0YXJ0LmNvcHkoQSksTS5lbmQuY29weShBKSksITApOiExfWZ1bmN0aW9uIGIoeCxtLE0sUyl7aWYoeC5pc0RlZ2VuZXJhdGVJbnRvU2VnbWVudClpZihtLmlzRGVnZW5lcmF0ZUludG9TZWdtZW50KXtjb25zdCBBPXguZGVnZW5lcmF0ZVNlZ21lbnQsdj1tLmRlZ2VuZXJhdGVTZWdtZW50LF89cyxUPXI7QS5kZWx0YShfKSx2LmRlbHRhKFQpO2NvbnN0IHo9bi5zdWJWZWN0b3JzKHYuc3RhcnQsQS5zdGFydCksQz1fLngqVC55LV8ueSpULng7aWYob2UoQykpcmV0dXJuITE7Y29uc3QgRT0oei54KlQueS16LnkqVC54KS9DLEY9LShfLngqei55LV8ueSp6LngpL0M7aWYoRTwwfHxFPjF8fEY8MHx8Rj4xKXJldHVybiExO2NvbnN0IEI9QS5zdGFydC56K18ueipFLEk9di5zdGFydC56K1QueipGO3JldHVybiBvZShCLUkpPyhNJiYoTS5zdGFydC5jb3B5KEEuc3RhcnQpLmFkZFNjYWxlZFZlY3RvcihfLEUpLE0uZW5kLmNvcHkoQS5zdGFydCkuYWRkU2NhbGVkVmVjdG9yKF8sRSkpLCEwKTohMX1lbHNlIHJldHVybiBtLmlzRGVnZW5lcmF0ZUludG9Qb2ludD93KHgsbSxNKTp5KG0seCxNLFMpO2Vsc2V7aWYoeC5pc0RlZ2VuZXJhdGVJbnRvUG9pbnQpcmV0dXJuIG0uaXNEZWdlbmVyYXRlSW50b1BvaW50P20uYS5kaXN0YW5jZVRvU3F1YXJlZCh4LmEpPElsPyhNJiYoTS5zdGFydC5jb3B5KHguYSksTS5lbmQuY29weSh4LmEpKSwhMCk6ITE6bS5pc0RlZ2VuZXJhdGVJbnRvU2VnbWVudD93KG0seCxNKTpnKG0seCxNKTtpZihtLmlzRGVnZW5lcmF0ZUludG9Qb2ludClyZXR1cm4gZyh4LG0sTSk7aWYobS5pc0RlZ2VuZXJhdGVJbnRvU2VnbWVudClyZXR1cm4geSh4LG0sTSxTKX19cmV0dXJuIGZ1bmN0aW9uKG0sTT1udWxsLFM9ITEpe3RoaXMubmVlZHNVcGRhdGUmJnRoaXMudXBkYXRlKCksbS5pc0V4dGVuZGVkVHJpYW5nbGU/bS5uZWVkc1VwZGF0ZSYmbS51cGRhdGUoKTooaS5jb3B5KG0pLGkudXBkYXRlKCksbT1pKTtjb25zdCBBPWIodGhpcyxtLE0sUyk7aWYoQSE9PXZvaWQgMClyZXR1cm4gQTtjb25zdCB2PXRoaXMucGxhbmUsXz1tLnBsYW5lO2xldCBUPV8uZGlzdGFuY2VUb1BvaW50KHRoaXMuYSksej1fLmRpc3RhbmNlVG9Qb2ludCh0aGlzLmIpLEM9Xy5kaXN0YW5jZVRvUG9pbnQodGhpcy5jKTtvZShUKSYmKFQ9MCksb2UoeikmJih6PTApLG9lKEMpJiYoQz0wKTtjb25zdCBFPVQqeixGPVQqQztpZihFPjAmJkY+MClyZXR1cm4hMTtsZXQgQj12LmRpc3RhbmNlVG9Qb2ludChtLmEpLEk9di5kaXN0YW5jZVRvUG9pbnQobS5iKSxSPXYuZGlzdGFuY2VUb1BvaW50KG0uYyk7b2UoQikmJihCPTApLG9lKEkpJiYoST0wKSxvZShSKSYmKFI9MCk7Y29uc3QgVj1CKkksVT1CKlI7aWYoVj4wJiZVPjApcmV0dXJuITE7cy5jb3B5KHYubm9ybWFsKSxyLmNvcHkoXy5ub3JtYWwpO2NvbnN0IEs9cy5jcm9zcyhyKTtsZXQgY3Q9MCxGdD1NYXRoLmFicyhLLngpO2NvbnN0IEl0PU1hdGguYWJzKEsueSk7SXQ+RnQmJihGdD1JdCxjdD0xKSxNYXRoLmFicyhLLnopPkZ0JiYoY3Q9Mik7Y29uc3QgdnQ9czBbY3RdLFllPXRoaXMuYVt2dF0sX2k9dGhpcy5iW3Z0XSxvbz10aGlzLmNbdnRdLFBjPW0uYVt2dF0sQ2M9bS5iW3Z0XSxhbz1tLmNbdnRdO2lmKHAodGhpcyxZZSxfaSxvbyxFLEYsVCx6LEMsaCxhKSlyZXR1cm4gZih0aGlzLG0sTSxTKTtpZihwKG0sUGMsQ2MsYW8sVixVLEIsSSxSLHUsYykpcmV0dXJuIGYodGhpcyxtLE0sUyk7aWYoaC55PGgueCl7Y29uc3QgdGU9aC55O2gueT1oLngsaC54PXRlLGwuY29weShhLnN0YXJ0KSxhLnN0YXJ0LmNvcHkoYS5lbmQpLGEuZW5kLmNvcHkobCl9aWYodS55PHUueCl7Y29uc3QgdGU9dS55O3UueT11LngsdS54PXRlLGwuY29weShjLnN0YXJ0KSxjLnN0YXJ0LmNvcHkoYy5lbmQpLGMuZW5kLmNvcHkobCl9cmV0dXJuIGgueTx1Lnh8fHUueTxoLng/ITE6KE0mJih1Lng+aC54P00uc3RhcnQuY29weShjLnN0YXJ0KTpNLnN0YXJ0LmNvcHkoYS5zdGFydCksdS55PGgueT9NLmVuZC5jb3B5KGMuZW5kKTpNLmVuZC5jb3B5KGEuZW5kKSksITApfX0oKSxhZS5wcm90b3R5cGUuZGlzdGFuY2VUb1BvaW50PWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgUDtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChlLGkpLGUuZGlzdGFuY2VUbyhpKX19KCksYWUucHJvdG90eXBlLmRpc3RhbmNlVG9UcmlhbmdsZT1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IFAsdD1uZXcgUCxlPVsiYSIsImIiLCJjIl0sbj1uZXcgcmUscz1uZXcgcmU7cmV0dXJuIGZ1bmN0aW9uKG8sYT1udWxsLGM9bnVsbCl7Y29uc3QgbD1hfHxjP246bnVsbDtpZih0aGlzLmludGVyc2VjdHNUcmlhbmdsZShvLGwpKXJldHVybihhfHxjKSYmKGEmJmwuZ2V0Q2VudGVyKGEpLGMmJmwuZ2V0Q2VudGVyKGMpKSwwO2xldCBoPTEvMDtmb3IobGV0IHU9MDt1PDM7dSsrKXtsZXQgZjtjb25zdCBkPWVbdV0scD1vW2RdO3RoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChwLGkpLGY9cC5kaXN0YW5jZVRvU3F1YXJlZChpKSxmPGgmJihoPWYsYSYmYS5jb3B5KGkpLGMmJmMuY29weShwKSk7Y29uc3QgeT10aGlzW2RdO28uY2xvc2VzdFBvaW50VG9Qb2ludCh5LGkpLGY9eS5kaXN0YW5jZVRvU3F1YXJlZChpKSxmPGgmJihoPWYsYSYmYS5jb3B5KHkpLGMmJmMuY29weShpKSl9Zm9yKGxldCB1PTA7dTwzO3UrKyl7Y29uc3QgZj1lW3VdLGQ9ZVsodSsxKSUzXTtuLnNldCh0aGlzW2ZdLHRoaXNbZF0pO2ZvcihsZXQgcD0wO3A8MztwKyspe2NvbnN0IHk9ZVtwXSxnPWVbKHArMSklM107cy5zZXQob1t5XSxvW2ddKSxuYShuLHMsaSx0KTtjb25zdCB3PWkuZGlzdGFuY2VUb1NxdWFyZWQodCk7dzxoJiYoaD13LGEmJmEuY29weShpKSxjJiZjLmNvcHkodCkpfX1yZXR1cm4gTWF0aC5zcXJ0KGgpfX0oKTtjbGFzcyBSdHtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5pc09yaWVudGVkQm94PSEwLHRoaXMubWluPW5ldyBQLHRoaXMubWF4PW5ldyBQLHRoaXMubWF0cml4PW5ldyBzdCx0aGlzLmludk1hdHJpeD1uZXcgc3QsdGhpcy5wb2ludHM9bmV3IEFycmF5KDgpLmZpbGwoKS5tYXAoKCk9Pm5ldyBQKSx0aGlzLnNhdEF4ZXM9bmV3IEFycmF5KDMpLmZpbGwoKS5tYXAoKCk9Pm5ldyBQKSx0aGlzLnNhdEJvdW5kcz1uZXcgQXJyYXkoMykuZmlsbCgpLm1hcCgoKT0+bmV3IE9lKSx0aGlzLmFsaWduZWRTYXRCb3VuZHM9bmV3IEFycmF5KDMpLmZpbGwoKS5tYXAoKCk9Pm5ldyBPZSksdGhpcy5uZWVkc1VwZGF0ZT0hMSx0JiZ0aGlzLm1pbi5jb3B5KHQpLGUmJnRoaXMubWF4LmNvcHkoZSksbiYmdGhpcy5tYXRyaXguY29weShuKX1zZXQodCxlLG4pe3RoaXMubWluLmNvcHkodCksdGhpcy5tYXguY29weShlKSx0aGlzLm1hdHJpeC5jb3B5KG4pLHRoaXMubmVlZHNVcGRhdGU9ITB9Y29weSh0KXt0aGlzLm1pbi5jb3B5KHQubWluKSx0aGlzLm1heC5jb3B5KHQubWF4KSx0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSx0aGlzLm5lZWRzVXBkYXRlPSEwfX1SdC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7Y29uc3QgdD10aGlzLm1hdHJpeCxlPXRoaXMubWluLG49dGhpcy5tYXgscz10aGlzLnBvaW50cztmb3IobGV0IGw9MDtsPD0xO2wrKylmb3IobGV0IGg9MDtoPD0xO2grKylmb3IobGV0IHU9MDt1PD0xO3UrKyl7Y29uc3QgZj0xKmx8MipofDQqdSxkPXNbZl07ZC54PWw/bi54OmUueCxkLnk9aD9uLnk6ZS55LGQuej11P24uejplLnosZC5hcHBseU1hdHJpeDQodCl9Y29uc3Qgcj10aGlzLnNhdEJvdW5kcyxvPXRoaXMuc2F0QXhlcyxhPXNbMF07Zm9yKGxldCBsPTA7bDwzO2wrKyl7Y29uc3QgaD1vW2xdLHU9cltsXSxmPTE8PGwsZD1zW2ZdO2guc3ViVmVjdG9ycyhhLGQpLHUuc2V0RnJvbVBvaW50cyhoLHMpfWNvbnN0IGM9dGhpcy5hbGlnbmVkU2F0Qm91bmRzO2NbMF0uc2V0RnJvbVBvaW50c0ZpZWxkKHMsIngiKSxjWzFdLnNldEZyb21Qb2ludHNGaWVsZChzLCJ5IiksY1syXS5zZXRGcm9tUG9pbnRzRmllbGQocywieiIpLHRoaXMuaW52TWF0cml4LmNvcHkodGhpcy5tYXRyaXgpLmludmVydCgpLHRoaXMubmVlZHNVcGRhdGU9ITF9fSgpLFJ0LnByb3RvdHlwZS5pbnRlcnNlY3RzQm94PWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgT2U7cmV0dXJuIGZ1bmN0aW9uKGUpe3RoaXMubmVlZHNVcGRhdGUmJnRoaXMudXBkYXRlKCk7Y29uc3Qgbj1lLm1pbixzPWUubWF4LHI9dGhpcy5zYXRCb3VuZHMsbz10aGlzLnNhdEF4ZXMsYT10aGlzLmFsaWduZWRTYXRCb3VuZHM7aWYoaS5taW49bi54LGkubWF4PXMueCxhWzBdLmlzU2VwYXJhdGVkKGkpfHwoaS5taW49bi55LGkubWF4PXMueSxhWzFdLmlzU2VwYXJhdGVkKGkpKXx8KGkubWluPW4ueixpLm1heD1zLnosYVsyXS5pc1NlcGFyYXRlZChpKSkpcmV0dXJuITE7Zm9yKGxldCBjPTA7YzwzO2MrKyl7Y29uc3QgbD1vW2NdLGg9cltjXTtpZihpLnNldEZyb21Cb3gobCxlKSxoLmlzU2VwYXJhdGVkKGkpKXJldHVybiExfXJldHVybiEwfX0oKSxSdC5wcm90b3R5cGUuaW50ZXJzZWN0c1RyaWFuZ2xlPWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgYWUsdD1uZXcgQXJyYXkoMyksZT1uZXcgT2Usbj1uZXcgT2Uscz1uZXcgUDtyZXR1cm4gZnVuY3Rpb24obyl7dGhpcy5uZWVkc1VwZGF0ZSYmdGhpcy51cGRhdGUoKSxvLmlzRXh0ZW5kZWRUcmlhbmdsZT9vLm5lZWRzVXBkYXRlJiZvLnVwZGF0ZSgpOihpLmNvcHkobyksaS51cGRhdGUoKSxvPWkpO2NvbnN0IGE9dGhpcy5zYXRCb3VuZHMsYz10aGlzLnNhdEF4ZXM7dFswXT1vLmEsdFsxXT1vLmIsdFsyXT1vLmM7Zm9yKGxldCBmPTA7ZjwzO2YrKyl7Y29uc3QgZD1hW2ZdLHA9Y1tmXTtpZihlLnNldEZyb21Qb2ludHMocCx0KSxkLmlzU2VwYXJhdGVkKGUpKXJldHVybiExfWNvbnN0IGw9by5zYXRCb3VuZHMsaD1vLnNhdEF4ZXMsdT10aGlzLnBvaW50cztmb3IobGV0IGY9MDtmPDM7ZisrKXtjb25zdCBkPWxbZl0scD1oW2ZdO2lmKGUuc2V0RnJvbVBvaW50cyhwLHUpLGQuaXNTZXBhcmF0ZWQoZSkpcmV0dXJuITF9Zm9yKGxldCBmPTA7ZjwzO2YrKyl7Y29uc3QgZD1jW2ZdO2ZvcihsZXQgcD0wO3A8NDtwKyspe2NvbnN0IHk9aFtwXTtpZihzLmNyb3NzVmVjdG9ycyhkLHkpLGUuc2V0RnJvbVBvaW50cyhzLHQpLG4uc2V0RnJvbVBvaW50cyhzLHUpLGUuaXNTZXBhcmF0ZWQobikpcmV0dXJuITF9fXJldHVybiEwfX0oKSxSdC5wcm90b3R5cGUuY2xvc2VzdFBvaW50VG9Qb2ludD1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpLGUuY29weSh0KS5hcHBseU1hdHJpeDQodGhpcy5pbnZNYXRyaXgpLmNsYW1wKHRoaXMubWluLHRoaXMubWF4KS5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXgpLGV9fSgpLFJ0LnByb3RvdHlwZS5kaXN0YW5jZVRvUG9pbnQ9ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBQO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KGUsaSksZS5kaXN0YW5jZVRvKGkpfX0oKSxSdC5wcm90b3R5cGUuZGlzdGFuY2VUb0JveD1mdW5jdGlvbigpe2NvbnN0IGk9WyJ4IiwieSIsInoiXSx0PW5ldyBBcnJheSgxMikuZmlsbCgpLm1hcCgoKT0+bmV3IHJlKSxlPW5ldyBBcnJheSgxMikuZmlsbCgpLm1hcCgoKT0+bmV3IHJlKSxuPW5ldyBQLHM9bmV3IFA7cmV0dXJuIGZ1bmN0aW9uKG8sYT0wLGM9bnVsbCxsPW51bGwpe2lmKHRoaXMubmVlZHNVcGRhdGUmJnRoaXMudXBkYXRlKCksdGhpcy5pbnRlcnNlY3RzQm94KG8pKXJldHVybihjfHxsKSYmKG8uZ2V0Q2VudGVyKHMpLHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChzLG4pLG8uY2xvc2VzdFBvaW50VG9Qb2ludChuLHMpLGMmJmMuY29weShuKSxsJiZsLmNvcHkocykpLDA7Y29uc3QgaD1hKmEsdT1vLm1pbixmPW8ubWF4LGQ9dGhpcy5wb2ludHM7bGV0IHA9MS8wO2ZvcihsZXQgZz0wO2c8ODtnKyspe2NvbnN0IHc9ZFtnXTtzLmNvcHkodykuY2xhbXAodSxmKTtjb25zdCBiPXcuZGlzdGFuY2VUb1NxdWFyZWQocyk7aWYoYjxwJiYocD1iLGMmJmMuY29weSh3KSxsJiZsLmNvcHkocyksYjxoKSlyZXR1cm4gTWF0aC5zcXJ0KGIpfWxldCB5PTA7Zm9yKGxldCBnPTA7ZzwzO2crKylmb3IobGV0IHc9MDt3PD0xO3crKylmb3IobGV0IGI9MDtiPD0xO2IrKyl7Y29uc3QgeD0oZysxKSUzLG09KGcrMiklMyxNPXc8PHh8Yjw8bSxTPTE8PGd8dzw8eHxiPDxtLEE9ZFtNXSx2PWRbU107dFt5XS5zZXQoQSx2KTtjb25zdCBUPWlbZ10sej1pW3hdLEM9aVttXSxFPWVbeV0sRj1FLnN0YXJ0LEI9RS5lbmQ7RltUXT11W1RdLEZbel09dz91W3pdOmZbel0sRltDXT1iP3VbQ106Zlt6XSxCW1RdPWZbVF0sQlt6XT13P3Vbel06Zlt6XSxCW0NdPWI/dVtDXTpmW3pdLHkrK31mb3IobGV0IGc9MDtnPD0xO2crKylmb3IobGV0IHc9MDt3PD0xO3crKylmb3IobGV0IGI9MDtiPD0xO2IrKyl7cy54PWc/Zi54OnUueCxzLnk9dz9mLnk6dS55LHMuej1iP2Yuejp1LnosdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KHMsbik7Y29uc3QgeD1zLmRpc3RhbmNlVG9TcXVhcmVkKG4pO2lmKHg8cCYmKHA9eCxjJiZjLmNvcHkobiksbCYmbC5jb3B5KHMpLHg8aCkpcmV0dXJuIE1hdGguc3FydCh4KX1mb3IobGV0IGc9MDtnPDEyO2crKyl7Y29uc3Qgdz10W2ddO2ZvcihsZXQgYj0wO2I8MTI7YisrKXtjb25zdCB4PWVbYl07bmEodyx4LG4scyk7Y29uc3QgbT1uLmRpc3RhbmNlVG9TcXVhcmVkKHMpO2lmKG08cCYmKHA9bSxjJiZjLmNvcHkobiksbCYmbC5jb3B5KHMpLG08aCkpcmV0dXJuIE1hdGguc3FydChtKX19cmV0dXJuIE1hdGguc3FydChwKX19KCk7Y2xhc3MgaWF7Y29uc3RydWN0b3IodCl7dGhpcy5fZ2V0TmV3UHJpbWl0aXZlPXQsdGhpcy5fcHJpbWl0aXZlcz1bXX1nZXRQcmltaXRpdmUoKXtjb25zdCB0PXRoaXMuX3ByaW1pdGl2ZXM7cmV0dXJuIHQubGVuZ3RoPT09MD90aGlzLl9nZXROZXdQcmltaXRpdmUoKTp0LnBvcCgpfXJlbGVhc2VQcmltaXRpdmUodCl7dGhpcy5fcHJpbWl0aXZlcy5wdXNoKHQpfX1jbGFzcyByMCBleHRlbmRzIGlhe2NvbnN0cnVjdG9yKCl7c3VwZXIoKCk9Pm5ldyBhZSl9fWNvbnN0IGNlPW5ldyByMDtmdW5jdGlvbiBTdChpLHQpe3JldHVybiB0W2krMTVdPT09dmx9ZnVuY3Rpb24gWXQoaSx0KXtyZXR1cm4gdFtpKzZdfWZ1bmN0aW9uIGxlKGksdCl7cmV0dXJuIHRbaSsxNF19ZnVuY3Rpb24gX3QoaSl7cmV0dXJuIGkrQXR9ZnVuY3Rpb24genQoaSx0KXtjb25zdCBlPXRbaSs2XTtyZXR1cm4gaStlKkF0fWZ1bmN0aW9uIHNhKGksdCl7cmV0dXJuIHRbaSs3XX1mdW5jdGlvbiBDeChpKXtyZXR1cm4gaX1jbGFzcyBvMHtjb25zdHJ1Y3Rvcigpe3RoaXMuZmxvYXQzMkFycmF5PW51bGwsdGhpcy51aW50MTZBcnJheT1udWxsLHRoaXMudWludDMyQXJyYXk9bnVsbDtjb25zdCB0PVtdO2xldCBlPW51bGw7dGhpcy5zZXRCdWZmZXI9bj0+e2UmJnQucHVzaChlKSxlPW4sdGhpcy5mbG9hdDMyQXJyYXk9bmV3IEZsb2F0MzJBcnJheShuKSx0aGlzLnVpbnQxNkFycmF5PW5ldyBVaW50MTZBcnJheShuKSx0aGlzLnVpbnQzMkFycmF5PW5ldyBVaW50MzJBcnJheShuKX0sdGhpcy5jbGVhckJ1ZmZlcj0oKT0+e2U9bnVsbCx0aGlzLmZsb2F0MzJBcnJheT1udWxsLHRoaXMudWludDE2QXJyYXk9bnVsbCx0aGlzLnVpbnQzMkFycmF5PW51bGwsdC5sZW5ndGghPT0wJiZ0aGlzLnNldEJ1ZmZlcih0LnBvcCgpKX19fWNvbnN0IG50PW5ldyBvMDtsZXQgYW4sc2k7Y29uc3Qgcmk9W10scXM9bmV3IGlhKCgpPT5uZXcgZ3QpO2Z1bmN0aW9uIGEwKGksdCxlLG4scyxyKXthbj1xcy5nZXRQcmltaXRpdmUoKSxzaT1xcy5nZXRQcmltaXRpdmUoKSxyaS5wdXNoKGFuLHNpKSxudC5zZXRCdWZmZXIoaS5fcm9vdHNbdF0pO2NvbnN0IG89cmEoMCxpLmdlb21ldHJ5LGUsbixzLHIpO250LmNsZWFyQnVmZmVyKCkscXMucmVsZWFzZVByaW1pdGl2ZShhbikscXMucmVsZWFzZVByaW1pdGl2ZShzaSkscmkucG9wKCkscmkucG9wKCk7Y29uc3QgYT1yaS5sZW5ndGg7cmV0dXJuIGE+MCYmKHNpPXJpW2EtMV0sYW49cmlbYS0yXSksb31mdW5jdGlvbiByYShpLHQsZSxuLHM9bnVsbCxyPTAsbz0wKXtjb25zdHtmbG9hdDMyQXJyYXk6YSx1aW50MTZBcnJheTpjLHVpbnQzMkFycmF5Omx9PW50O2xldCBoPWkqMjtpZihTdChoLGMpKXtjb25zdCBmPVl0KGksbCksZD1sZShoLGMpO3JldHVybiBodChpLGEsYW4pLG4oZixkLCExLG8scitpL0F0LGFuKX1lbHNle2xldCBUPWZ1bmN0aW9uKEMpe2NvbnN0e3VpbnQxNkFycmF5OkUsdWludDMyQXJyYXk6Rn09bnQ7bGV0IEI9QyoyO2Zvcig7IVN0KEIsRSk7KUM9X3QoQyksQj1DKjI7cmV0dXJuIFl0KEMsRil9LHo9ZnVuY3Rpb24oQyl7Y29uc3R7dWludDE2QXJyYXk6RSx1aW50MzJBcnJheTpGfT1udDtsZXQgQj1DKjI7Zm9yKDshU3QoQixFKTspQz16dChDLEYpLEI9QyoyO3JldHVybiBZdChDLEYpK2xlKEIsRSl9O2NvbnN0IGY9X3QoaSksZD16dChpLGwpO2xldCBwPWYseT1kLGcsdyxiLHg7aWYocyYmKGI9YW4seD1zaSxodChwLGEsYiksaHQoeSxhLHgpLGc9cyhiKSx3PXMoeCksdzxnKSl7cD1kLHk9Zjtjb25zdCBDPWc7Zz13LHc9QyxiPXh9Ynx8KGI9YW4saHQocCxhLGIpKTtjb25zdCBtPVN0KHAqMixjKSxNPWUoYixtLGcsbysxLHIrcC9BdCk7bGV0IFM7aWYoTT09PUFsKXtjb25zdCBDPVQocCksRj16KHApLUM7Uz1uKEMsRiwhMCxvKzEscitwL0F0LGIpfWVsc2UgUz1NJiZyYShwLHQsZSxuLHMscixvKzEpO2lmKFMpcmV0dXJuITA7eD1zaSxodCh5LGEseCk7Y29uc3QgQT1TdCh5KjIsYyksdj1lKHgsQSx3LG8rMSxyK3kvQXQpO2xldCBfO2lmKHY9PT1BbCl7Y29uc3QgQz1UKHkpLEY9eih5KS1DO189bihDLEYsITAsbysxLHIreS9BdCx4KX1lbHNlIF89diYmcmEoeSx0LGUsbixzLHIsbysxKTtyZXR1cm4hIV99fWNvbnN0IFZpPW5ldyBQLG9hPW5ldyBQO2Z1bmN0aW9uIGMwKGksdCxlPXt9LG49MCxzPTEvMCl7Y29uc3Qgcj1uKm4sbz1zKnM7bGV0IGE9MS8wLGM9bnVsbDtpZihpLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjpoPT4oVmkuY29weSh0KS5jbGFtcChoLm1pbixoLm1heCksVmkuZGlzdGFuY2VUb1NxdWFyZWQodCkpLGludGVyc2VjdHNCb3VuZHM6KGgsdSxmKT0+ZjxhJiZmPG8saW50ZXJzZWN0c1RyaWFuZ2xlOihoLHUpPT57aC5jbG9zZXN0UG9pbnRUb1BvaW50KHQsVmkpO2NvbnN0IGY9dC5kaXN0YW5jZVRvU3F1YXJlZChWaSk7cmV0dXJuIGY8YSYmKG9hLmNvcHkoVmkpLGE9ZixjPXUpLGY8cn19KSxhPT09MS8wKXJldHVybiBudWxsO2NvbnN0IGw9TWF0aC5zcXJ0KGEpO3JldHVybiBlLnBvaW50P2UucG9pbnQuY29weShvYSk6ZS5wb2ludD1vYS5jbG9uZSgpLGUuZGlzdGFuY2U9bCxlLmZhY2VJbmRleD1jLGV9Y29uc3QgWHM9cGFyc2VJbnQoSik+PTE2OSxsMD1wYXJzZUludChKKTw9MTYxLHZuPW5ldyBQLF9uPW5ldyBQLHpuPW5ldyBQLFpzPW5ldyBrLEdzPW5ldyBrLFdzPW5ldyBrLGtsPW5ldyBQLE5sPW5ldyBQLFJsPW5ldyBQLFVpPW5ldyBQO2Z1bmN0aW9uIGgwKGksdCxlLG4scyxyLG8sYSl7bGV0IGM7aWYocj09PTE/Yz1pLmludGVyc2VjdFRyaWFuZ2xlKG4sZSx0LCEwLHMpOmM9aS5pbnRlcnNlY3RUcmlhbmdsZSh0LGUsbixyIT09MixzKSxjPT09bnVsbClyZXR1cm4gbnVsbDtjb25zdCBsPWkub3JpZ2luLmRpc3RhbmNlVG8ocyk7cmV0dXJuIGw8b3x8bD5hP251bGw6e2Rpc3RhbmNlOmwscG9pbnQ6cy5jbG9uZSgpfX1mdW5jdGlvbiBMbChpLHQsZSxuLHMscixvLGEsYyxsLGgpe3ZuLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxyKSxfbi5mcm9tQnVmZmVyQXR0cmlidXRlKHQsbyksem4uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGEpO2NvbnN0IHU9aDAoaSx2bixfbix6bixVaSxjLGwsaCk7aWYodSl7aWYobil7WnMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLHIpLEdzLmZyb21CdWZmZXJBdHRyaWJ1dGUobixvKSxXcy5mcm9tQnVmZmVyQXR0cmlidXRlKG4sYSksdS51dj1uZXcgaztjb25zdCBkPWV0LmdldEludGVycG9sYXRpb24oVWksdm4sX24sem4sWnMsR3MsV3MsdS51dik7WHN8fCh1LnV2PWQpfWlmKHMpe1pzLmZyb21CdWZmZXJBdHRyaWJ1dGUocyxyKSxHcy5mcm9tQnVmZmVyQXR0cmlidXRlKHMsbyksV3MuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLGEpLHUudXYxPW5ldyBrO2NvbnN0IGQ9ZXQuZ2V0SW50ZXJwb2xhdGlvbihVaSx2bixfbix6bixacyxHcyxXcyx1LnV2MSk7WHN8fCh1LnV2MT1kKSxsMCYmKHUudXYyPXUudXYxKX1pZihlKXtrbC5mcm9tQnVmZmVyQXR0cmlidXRlKGUsciksTmwuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLG8pLFJsLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxhKSx1Lm5vcm1hbD1uZXcgUDtjb25zdCBkPWV0LmdldEludGVycG9sYXRpb24oVWksdm4sX24sem4sa2wsTmwsUmwsdS5ub3JtYWwpO3Uubm9ybWFsLmRvdChpLmRpcmVjdGlvbik+MCYmdS5ub3JtYWwubXVsdGlwbHlTY2FsYXIoLTEpLFhzfHwodS5ub3JtYWw9ZCl9Y29uc3QgZj17YTpyLGI6byxjOmEsbm9ybWFsOm5ldyBQLG1hdGVyaWFsSW5kZXg6MH07aWYoZXQuZ2V0Tm9ybWFsKHZuLF9uLHpuLGYubm9ybWFsKSx1LmZhY2U9Zix1LmZhY2VJbmRleD1yLFhzKXtjb25zdCBkPW5ldyBQO2V0LmdldEJhcnljb29yZChVaSx2bixfbix6bixkKSx1LmJhcnljb29yZD1kfX1yZXR1cm4gdX1mdW5jdGlvbiBPbChpKXtyZXR1cm4gaSYmaS5pc01hdGVyaWFsP2kuc2lkZTppfWZ1bmN0aW9uIEhzKGksdCxlLG4scyxyLG8pe2NvbnN0IGE9biozO2xldCBjPWErMCxsPWErMSxoPWErMjtjb25zdHtpbmRleDp1LGdyb3VwczpmfT1pO2kuaW5kZXgmJihjPXUuZ2V0WChjKSxsPXUuZ2V0WChsKSxoPXUuZ2V0WChoKSk7Y29uc3R7cG9zaXRpb246ZCxub3JtYWw6cCx1djp5LHV2MTpnfT1pLmF0dHJpYnV0ZXM7aWYoQXJyYXkuaXNBcnJheSh0KSl7Y29uc3Qgdz1uKjM7Zm9yKGxldCBiPTAseD1mLmxlbmd0aDtiPHg7YisrKXtjb25zdHtzdGFydDptLGNvdW50Ok0sbWF0ZXJpYWxJbmRleDpTfT1mW2JdO2lmKHc+PW0mJnc8bStNKXtjb25zdCBBPU9sKHRbU10pLHY9TGwoZSxkLHAseSxnLGMsbCxoLEEscixvKTtpZih2KWlmKHYuZmFjZUluZGV4PW4sdi5mYWNlLm1hdGVyaWFsSW5kZXg9UyxzKXMucHVzaCh2KTtlbHNlIHJldHVybiB2fX19ZWxzZXtjb25zdCB3PU9sKHQpLGI9TGwoZSxkLHAseSxnLGMsbCxoLHcscixvKTtpZihiKWlmKGIuZmFjZUluZGV4PW4sYi5mYWNlLm1hdGVyaWFsSW5kZXg9MCxzKXMucHVzaChiKTtlbHNlIHJldHVybiBifXJldHVybiBudWxsfWZ1bmN0aW9uIHl0KGksdCxlLG4pe2NvbnN0IHM9aS5hLHI9aS5iLG89aS5jO2xldCBhPXQsYz10KzEsbD10KzI7ZSYmKGE9ZS5nZXRYKGEpLGM9ZS5nZXRYKGMpLGw9ZS5nZXRYKGwpKSxzLng9bi5nZXRYKGEpLHMueT1uLmdldFkoYSkscy56PW4uZ2V0WihhKSxyLng9bi5nZXRYKGMpLHIueT1uLmdldFkoYyksci56PW4uZ2V0WihjKSxvLng9bi5nZXRYKGwpLG8ueT1uLmdldFkobCksby56PW4uZ2V0WihsKX1mdW5jdGlvbiB1MChpLHQsZSxuLHMscixvLGEpe2NvbnN0e2dlb21ldHJ5OmMsX2luZGlyZWN0QnVmZmVyOmx9PWk7Zm9yKGxldCBoPW4sdT1uK3M7aDx1O2grKylIcyhjLHQsZSxoLHIsbyxhKX1mdW5jdGlvbiBmMChpLHQsZSxuLHMscixvKXtjb25zdHtnZW9tZXRyeTphLF9pbmRpcmVjdEJ1ZmZlcjpjfT1pO2xldCBsPTEvMCxoPW51bGw7Zm9yKGxldCB1PW4sZj1uK3M7dTxmO3UrKyl7bGV0IGQ7ZD1IcyhhLHQsZSx1LG51bGwscixvKSxkJiZkLmRpc3RhbmNlPGwmJihoPWQsbD1kLmRpc3RhbmNlKX1yZXR1cm4gaH1mdW5jdGlvbiBkMChpLHQsZSxuLHMscixvKXtjb25zdHtnZW9tZXRyeTphfT1lLHtpbmRleDpjfT1hLGw9YS5hdHRyaWJ1dGVzLnBvc2l0aW9uO2ZvcihsZXQgaD1pLHU9dCtpO2g8dTtoKyspe2xldCBmO2lmKGY9aCx5dChvLGYqMyxjLGwpLG8ubmVlZHNVcGRhdGU9ITAsbihvLGYscyxyKSlyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBwMChpLHQ9bnVsbCl7dCYmQXJyYXkuaXNBcnJheSh0KSYmKHQ9bmV3IFNldCh0KSk7Y29uc3QgZT1pLmdlb21ldHJ5LG49ZS5pbmRleD9lLmluZGV4LmFycmF5Om51bGwscz1lLmF0dHJpYnV0ZXMucG9zaXRpb247bGV0IHIsbyxhLGMsbD0wO2NvbnN0IGg9aS5fcm9vdHM7Zm9yKGxldCBmPTAsZD1oLmxlbmd0aDtmPGQ7ZisrKXI9aFtmXSxvPW5ldyBVaW50MzJBcnJheShyKSxhPW5ldyBVaW50MTZBcnJheShyKSxjPW5ldyBGbG9hdDMyQXJyYXkociksdSgwLGwpLGwrPXIuYnl0ZUxlbmd0aDtmdW5jdGlvbiB1KGYsZCxwPSExKXtjb25zdCB5PWYqMjtpZihTdCh5LGEpKXtjb25zdCBnPW9bZis2XSx3PWFbeSsxNF07bGV0IGI9MS8wLHg9MS8wLG09MS8wLE09LTEvMCxTPS0xLzAsQT0tMS8wO2ZvcihsZXQgdj0zKmcsXz0zKihnK3cpO3Y8Xzt2Kyspe2xldCBUPW5bdl07Y29uc3Qgej1zLmdldFgoVCksQz1zLmdldFkoVCksRT1zLmdldFooVCk7ejxiJiYoYj16KSx6Pk0mJihNPXopLEM8eCYmKHg9QyksQz5TJiYoUz1DKSxFPG0mJihtPUUpLEU+QSYmKEE9RSl9cmV0dXJuIGNbZiswXSE9PWJ8fGNbZisxXSE9PXh8fGNbZisyXSE9PW18fGNbZiszXSE9PU18fGNbZis0XSE9PVN8fGNbZis1XSE9PUE/KGNbZiswXT1iLGNbZisxXT14LGNbZisyXT1tLGNbZiszXT1NLGNbZis0XT1TLGNbZis1XT1BLCEwKTohMX1lbHNle2NvbnN0IGc9X3QoZiksdz16dChmLG8pO2xldCBiPXAseD0hMSxtPSExO2lmKHQpe2lmKCFiKXtjb25zdCBUPWcvQXQrZC9OdCx6PXcvQXQrZC9OdDt4PXQuaGFzKFQpLG09dC5oYXMoeiksYj0heCYmIW19fWVsc2UgeD0hMCxtPSEwO2NvbnN0IE09Ynx8eCxTPWJ8fG07bGV0IEE9ITE7TSYmKEE9dShnLGQsYikpO2xldCB2PSExO1MmJih2PXUodyxkLGIpKTtjb25zdCBfPUF8fHY7aWYoXylmb3IobGV0IFQ9MDtUPDM7VCsrKXtjb25zdCB6PWcrVCxDPXcrVCxFPWNbel0sRj1jW3orM10sQj1jW0NdLEk9Y1tDKzNdO2NbZitUXT1FPEI/RTpCLGNbZitUKzNdPUY+ST9GOkl9cmV0dXJuIF99fX1mdW5jdGlvbiBjbihpLHQsZSxuLHMpe2xldCByLG8sYSxjLGwsaDtjb25zdCB1PTEvZS5kaXJlY3Rpb24ueCxmPTEvZS5kaXJlY3Rpb24ueSxkPTEvZS5kaXJlY3Rpb24ueixwPWUub3JpZ2luLngseT1lLm9yaWdpbi55LGc9ZS5vcmlnaW4uejtsZXQgdz10W2ldLGI9dFtpKzNdLHg9dFtpKzFdLG09dFtpKzMrMV0sTT10W2krMl0sUz10W2krMysyXTtyZXR1cm4gdT49MD8ocj0ody1wKSp1LG89KGItcCkqdSk6KHI9KGItcCkqdSxvPSh3LXApKnUpLGY+PTA/KGE9KHgteSkqZixjPShtLXkpKmYpOihhPShtLXkpKmYsYz0oeC15KSpmKSxyPmN8fGE+b3x8KChhPnJ8fGlzTmFOKHIpKSYmKHI9YSksKGM8b3x8aXNOYU4obykpJiYobz1jKSxkPj0wPyhsPShNLWcpKmQsaD0oUy1nKSpkKToobD0oUy1nKSpkLGg9KE0tZykqZCkscj5ofHxsPm8pPyExOigobD5yfHxyIT09cikmJihyPWwpLChoPG98fG8hPT1vKSYmKG89aCkscjw9cyYmbz49bil9ZnVuY3Rpb24geTAoaSx0LGUsbixzLHIsbyxhKXtjb25zdHtnZW9tZXRyeTpjLF9pbmRpcmVjdEJ1ZmZlcjpsfT1pO2ZvcihsZXQgaD1uLHU9bitzO2g8dTtoKyspe2xldCBmPWw/bFtoXTpoO0hzKGMsdCxlLGYscixvLGEpfX1mdW5jdGlvbiBtMChpLHQsZSxuLHMscixvKXtjb25zdHtnZW9tZXRyeTphLF9pbmRpcmVjdEJ1ZmZlcjpjfT1pO2xldCBsPTEvMCxoPW51bGw7Zm9yKGxldCB1PW4sZj1uK3M7dTxmO3UrKyl7bGV0IGQ7ZD1IcyhhLHQsZSxjP2NbdV06dSxudWxsLHIsbyksZCYmZC5kaXN0YW5jZTxsJiYoaD1kLGw9ZC5kaXN0YW5jZSl9cmV0dXJuIGh9ZnVuY3Rpb24gZzAoaSx0LGUsbixzLHIsbyl7Y29uc3R7Z2VvbWV0cnk6YX09ZSx7aW5kZXg6Y309YSxsPWEuYXR0cmlidXRlcy5wb3NpdGlvbjtmb3IobGV0IGg9aSx1PXQraTtoPHU7aCsrKXtsZXQgZjtpZihmPWUucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoaCkseXQobyxmKjMsYyxsKSxvLm5lZWRzVXBkYXRlPSEwLG4obyxmLHMscikpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24geDAoaSx0LGUsbixzLHIsbyl7bnQuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKSxhYSgwLGksZSxuLHMscixvKSxudC5jbGVhckJ1ZmZlcigpfWZ1bmN0aW9uIGFhKGksdCxlLG4scyxyLG8pe2NvbnN0e2Zsb2F0MzJBcnJheTphLHVpbnQxNkFycmF5OmMsdWludDMyQXJyYXk6bH09bnQsaD1pKjI7aWYoU3QoaCxjKSl7Y29uc3QgZj1ZdChpLGwpLGQ9bGUoaCxjKTt1MCh0LGUsbixmLGQscyxyLG8pfWVsc2V7Y29uc3QgZj1fdChpKTtjbihmLGEsbixyLG8pJiZhYShmLHQsZSxuLHMscixvKTtjb25zdCBkPXp0KGksbCk7Y24oZCxhLG4scixvKSYmYWEoZCx0LGUsbixzLHIsbyl9fWNvbnN0IHcwPVsieCIsInkiLCJ6Il07ZnVuY3Rpb24gYjAoaSx0LGUsbixzLHIpe250LnNldEJ1ZmZlcihpLl9yb290c1t0XSk7Y29uc3Qgbz1jYSgwLGksZSxuLHMscik7cmV0dXJuIG50LmNsZWFyQnVmZmVyKCksb31mdW5jdGlvbiBjYShpLHQsZSxuLHMscil7Y29uc3R7ZmxvYXQzMkFycmF5Om8sdWludDE2QXJyYXk6YSx1aW50MzJBcnJheTpjfT1udDtsZXQgbD1pKjI7aWYoU3QobCxhKSl7Y29uc3QgdT1ZdChpLGMpLGY9bGUobCxhKTtyZXR1cm4gZjAodCxlLG4sdSxmLHMscil9ZWxzZXtjb25zdCB1PXNhKGksYyksZj13MFt1XSxwPW4uZGlyZWN0aW9uW2ZdPj0wO2xldCB5LGc7cD8oeT1fdChpKSxnPXp0KGksYykpOih5PXp0KGksYyksZz1fdChpKSk7Y29uc3QgYj1jbih5LG8sbixzLHIpP2NhKHksdCxlLG4scyxyKTpudWxsO2lmKGIpe2NvbnN0IE09Yi5wb2ludFtmXTtpZihwP008PW9bZyt1XTpNPj1vW2crdSszXSlyZXR1cm4gYn1jb25zdCBtPWNuKGcsbyxuLHMscik/Y2EoZyx0LGUsbixzLHIpOm51bGw7cmV0dXJuIGImJm0/Yi5kaXN0YW5jZTw9bS5kaXN0YW5jZT9iOm06Ynx8bXx8bnVsbH19Y29uc3QgSnM9bmV3IGd0LG9pPW5ldyBhZSxhaT1uZXcgYWUscWk9bmV3IHN0LERsPW5ldyBSdCxZcz1uZXcgUnQ7ZnVuY3Rpb24gTTAoaSx0LGUsbil7bnQuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKTtjb25zdCBzPWxhKDAsaSxlLG4pO3JldHVybiBudC5jbGVhckJ1ZmZlcigpLHN9ZnVuY3Rpb24gbGEoaSx0LGUsbixzPW51bGwpe2NvbnN0e2Zsb2F0MzJBcnJheTpyLHVpbnQxNkFycmF5Om8sdWludDMyQXJyYXk6YX09bnQ7bGV0IGM9aSoyO2lmKHM9PT1udWxsJiYoZS5ib3VuZGluZ0JveHx8ZS5jb21wdXRlQm91bmRpbmdCb3goKSxEbC5zZXQoZS5ib3VuZGluZ0JveC5taW4sZS5ib3VuZGluZ0JveC5tYXgsbikscz1EbCksU3QoYyxvKSl7Y29uc3QgaD10Lmdlb21ldHJ5LHU9aC5pbmRleCxmPWguYXR0cmlidXRlcy5wb3NpdGlvbixkPWUuaW5kZXgscD1lLmF0dHJpYnV0ZXMucG9zaXRpb24seT1ZdChpLGEpLGc9bGUoYyxvKTtpZihxaS5jb3B5KG4pLmludmVydCgpLGUuYm91bmRzVHJlZSlyZXR1cm4gaHQoaSxyLFlzKSxZcy5tYXRyaXguY29weShxaSksWXMubmVlZHNVcGRhdGU9ITAsZS5ib3VuZHNUcmVlLnNoYXBlY2FzdCh7aW50ZXJzZWN0c0JvdW5kczpiPT5Zcy5pbnRlcnNlY3RzQm94KGIpLGludGVyc2VjdHNUcmlhbmdsZTpiPT57Yi5hLmFwcGx5TWF0cml4NChuKSxiLmIuYXBwbHlNYXRyaXg0KG4pLGIuYy5hcHBseU1hdHJpeDQobiksYi5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHg9eSozLG09KGcreSkqMzt4PG07eCs9MylpZih5dChhaSx4LHUsZiksYWkubmVlZHNVcGRhdGU9ITAsYi5pbnRlcnNlY3RzVHJpYW5nbGUoYWkpKXJldHVybiEwO3JldHVybiExfX0pO3tjb25zdCB3PVNuKGUpO2ZvcihsZXQgYj15KjMseD0oZyt5KSozO2I8eDtiKz0zKXt5dChvaSxiLHUsZiksb2kuYS5hcHBseU1hdHJpeDQocWkpLG9pLmIuYXBwbHlNYXRyaXg0KHFpKSxvaS5jLmFwcGx5TWF0cml4NChxaSksb2kubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBtPTAsTT13KjM7bTxNO20rPTMpaWYoeXQoYWksbSxkLHApLGFpLm5lZWRzVXBkYXRlPSEwLG9pLmludGVyc2VjdHNUcmlhbmdsZShhaSkpcmV0dXJuITB9fX1lbHNle2NvbnN0IGg9X3QoaSksdT16dChpLGEpO3JldHVybiBodChoLHIsSnMpLCEhKHMuaW50ZXJzZWN0c0JveChKcykmJmxhKGgsdCxlLG4scyl8fChodCh1LHIsSnMpLHMuaW50ZXJzZWN0c0JveChKcykmJmxhKHUsdCxlLG4scykpKX19Y29uc3QganM9bmV3IHN0LGhhPW5ldyBSdCxYaT1uZXcgUnQsQTA9bmV3IFAsUzA9bmV3IFAsdjA9bmV3IFAsXzA9bmV3IFA7ZnVuY3Rpb24gejAoaSx0LGUsbj17fSxzPXt9LHI9MCxvPTEvMCl7dC5ib3VuZGluZ0JveHx8dC5jb21wdXRlQm91bmRpbmdCb3goKSxoYS5zZXQodC5ib3VuZGluZ0JveC5taW4sdC5ib3VuZGluZ0JveC5tYXgsZSksaGEubmVlZHNVcGRhdGU9ITA7Y29uc3QgYT1pLmdlb21ldHJ5LGM9YS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGw9YS5pbmRleCxoPXQuYXR0cmlidXRlcy5wb3NpdGlvbix1PXQuaW5kZXgsZj1jZS5nZXRQcmltaXRpdmUoKSxkPWNlLmdldFByaW1pdGl2ZSgpO2xldCBwPUEwLHk9UzAsZz1udWxsLHc9bnVsbDtzJiYoZz12MCx3PV8wKTtsZXQgYj0xLzAseD1udWxsLG09bnVsbDtyZXR1cm4ganMuY29weShlKS5pbnZlcnQoKSxYaS5tYXRyaXguY29weShqcyksaS5zaGFwZWNhc3Qoe2JvdW5kc1RyYXZlcnNlT3JkZXI6TT0+aGEuZGlzdGFuY2VUb0JveChNKSxpbnRlcnNlY3RzQm91bmRzOihNLFMsQSk9PkE8YiYmQTxvPyhTJiYoWGkubWluLmNvcHkoTS5taW4pLFhpLm1heC5jb3B5KE0ubWF4KSxYaS5uZWVkc1VwZGF0ZT0hMCksITApOiExLGludGVyc2VjdHNSYW5nZTooTSxTKT0+e2lmKHQuYm91bmRzVHJlZSlyZXR1cm4gdC5ib3VuZHNUcmVlLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjp2PT5YaS5kaXN0YW5jZVRvQm94KHYpLGludGVyc2VjdHNCb3VuZHM6KHYsXyxUKT0+VDxiJiZUPG8saW50ZXJzZWN0c1JhbmdlOih2LF8pPT57Zm9yKGxldCBUPXYsej12K187VDx6O1QrKyl7eXQoZCwzKlQsdSxoKSxkLmEuYXBwbHlNYXRyaXg0KGUpLGQuYi5hcHBseU1hdHJpeDQoZSksZC5jLmFwcGx5TWF0cml4NChlKSxkLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgQz1NLEU9TStTO0M8RTtDKyspe3l0KGYsMypDLGwsYyksZi5uZWVkc1VwZGF0ZT0hMDtjb25zdCBGPWYuZGlzdGFuY2VUb1RyaWFuZ2xlKGQscCxnKTtpZihGPGImJih5LmNvcHkocCksdyYmdy5jb3B5KGcpLGI9Rix4PUMsbT1UKSxGPHIpcmV0dXJuITB9fX19KTt7Y29uc3QgQT1Tbih0KTtmb3IobGV0IHY9MCxfPUE7djxfO3YrKyl7eXQoZCwzKnYsdSxoKSxkLmEuYXBwbHlNYXRyaXg0KGUpLGQuYi5hcHBseU1hdHJpeDQoZSksZC5jLmFwcGx5TWF0cml4NChlKSxkLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgVD1NLHo9TStTO1Q8ejtUKyspe3l0KGYsMypULGwsYyksZi5uZWVkc1VwZGF0ZT0hMDtjb25zdCBDPWYuZGlzdGFuY2VUb1RyaWFuZ2xlKGQscCxnKTtpZihDPGImJih5LmNvcHkocCksdyYmdy5jb3B5KGcpLGI9Qyx4PVQsbT12KSxDPHIpcmV0dXJuITB9fX19fSksY2UucmVsZWFzZVByaW1pdGl2ZShmKSxjZS5yZWxlYXNlUHJpbWl0aXZlKGQpLGI9PT0xLzA/bnVsbDoobi5wb2ludD9uLnBvaW50LmNvcHkoeSk6bi5wb2ludD15LmNsb25lKCksbi5kaXN0YW5jZT1iLG4uZmFjZUluZGV4PXgscyYmKHMucG9pbnQ/cy5wb2ludC5jb3B5KHcpOnMucG9pbnQ9dy5jbG9uZSgpLHMucG9pbnQuYXBwbHlNYXRyaXg0KGpzKSx5LmFwcGx5TWF0cml4NChqcykscy5kaXN0YW5jZT15LnN1YihzLnBvaW50KS5sZW5ndGgoKSxzLmZhY2VJbmRleD1tKSxuKX1mdW5jdGlvbiBUMChpLHQ9bnVsbCl7dCYmQXJyYXkuaXNBcnJheSh0KSYmKHQ9bmV3IFNldCh0KSk7Y29uc3QgZT1pLmdlb21ldHJ5LG49ZS5pbmRleD9lLmluZGV4LmFycmF5Om51bGwscz1lLmF0dHJpYnV0ZXMucG9zaXRpb247bGV0IHIsbyxhLGMsbD0wO2NvbnN0IGg9aS5fcm9vdHM7Zm9yKGxldCBmPTAsZD1oLmxlbmd0aDtmPGQ7ZisrKXI9aFtmXSxvPW5ldyBVaW50MzJBcnJheShyKSxhPW5ldyBVaW50MTZBcnJheShyKSxjPW5ldyBGbG9hdDMyQXJyYXkociksdSgwLGwpLGwrPXIuYnl0ZUxlbmd0aDtmdW5jdGlvbiB1KGYsZCxwPSExKXtjb25zdCB5PWYqMjtpZihTdCh5LGEpKXtjb25zdCBnPW9bZis2XSx3PWFbeSsxNF07bGV0IGI9MS8wLHg9MS8wLG09MS8wLE09LTEvMCxTPS0xLzAsQT0tMS8wO2ZvcihsZXQgdj1nLF89Zyt3O3Y8Xzt2Kyspe2NvbnN0IFQ9MyppLnJlc29sdmVUcmlhbmdsZUluZGV4KHYpO2ZvcihsZXQgej0wO3o8Mzt6Kyspe2xldCBDPVQrejtDPW4/bltDXTpDO2NvbnN0IEU9cy5nZXRYKEMpLEY9cy5nZXRZKEMpLEI9cy5nZXRaKEMpO0U8YiYmKGI9RSksRT5NJiYoTT1FKSxGPHgmJih4PUYpLEY+UyYmKFM9RiksQjxtJiYobT1CKSxCPkEmJihBPUIpfX1yZXR1cm4gY1tmKzBdIT09Ynx8Y1tmKzFdIT09eHx8Y1tmKzJdIT09bXx8Y1tmKzNdIT09TXx8Y1tmKzRdIT09U3x8Y1tmKzVdIT09QT8oY1tmKzBdPWIsY1tmKzFdPXgsY1tmKzJdPW0sY1tmKzNdPU0sY1tmKzRdPVMsY1tmKzVdPUEsITApOiExfWVsc2V7Y29uc3QgZz1fdChmKSx3PXp0KGYsbyk7bGV0IGI9cCx4PSExLG09ITE7aWYodCl7aWYoIWIpe2NvbnN0IFQ9Zy9BdCtkL050LHo9dy9BdCtkL050O3g9dC5oYXMoVCksbT10Lmhhcyh6KSxiPSF4JiYhbX19ZWxzZSB4PSEwLG09ITA7Y29uc3QgTT1ifHx4LFM9Ynx8bTtsZXQgQT0hMTtNJiYoQT11KGcsZCxiKSk7bGV0IHY9ITE7UyYmKHY9dSh3LGQsYikpO2NvbnN0IF89QXx8djtpZihfKWZvcihsZXQgVD0wO1Q8MztUKyspe2NvbnN0IHo9ZytULEM9dytULEU9Y1t6XSxGPWNbeiszXSxCPWNbQ10sST1jW0MrM107Y1tmK1RdPUU8Qj9FOkIsY1tmK1QrM109Rj5JP0Y6SX1yZXR1cm4gX319fWZ1bmN0aW9uIFAwKGksdCxlLG4scyxyLG8pe250LnNldEJ1ZmZlcihpLl9yb290c1t0XSksdWEoMCxpLGUsbixzLHIsbyksbnQuY2xlYXJCdWZmZXIoKX1mdW5jdGlvbiB1YShpLHQsZSxuLHMscixvKXtjb25zdHtmbG9hdDMyQXJyYXk6YSx1aW50MTZBcnJheTpjLHVpbnQzMkFycmF5Omx9PW50LGg9aSoyO2lmKFN0KGgsYykpe2NvbnN0IGY9WXQoaSxsKSxkPWxlKGgsYyk7eTAodCxlLG4sZixkLHMscixvKX1lbHNle2NvbnN0IGY9X3QoaSk7Y24oZixhLG4scixvKSYmdWEoZix0LGUsbixzLHIsbyk7Y29uc3QgZD16dChpLGwpO2NuKGQsYSxuLHIsbykmJnVhKGQsdCxlLG4scyxyLG8pfX1jb25zdCBDMD1bIngiLCJ5IiwieiJdO2Z1bmN0aW9uIEUwKGksdCxlLG4scyxyKXtudC5zZXRCdWZmZXIoaS5fcm9vdHNbdF0pO2NvbnN0IG89ZmEoMCxpLGUsbixzLHIpO3JldHVybiBudC5jbGVhckJ1ZmZlcigpLG99ZnVuY3Rpb24gZmEoaSx0LGUsbixzLHIpe2NvbnN0e2Zsb2F0MzJBcnJheTpvLHVpbnQxNkFycmF5OmEsdWludDMyQXJyYXk6Y309bnQ7bGV0IGw9aSoyO2lmKFN0KGwsYSkpe2NvbnN0IHU9WXQoaSxjKSxmPWxlKGwsYSk7cmV0dXJuIG0wKHQsZSxuLHUsZixzLHIpfWVsc2V7Y29uc3QgdT1zYShpLGMpLGY9QzBbdV0scD1uLmRpcmVjdGlvbltmXT49MDtsZXQgeSxnO3A/KHk9X3QoaSksZz16dChpLGMpKTooeT16dChpLGMpLGc9X3QoaSkpO2NvbnN0IGI9Y24oeSxvLG4scyxyKT9mYSh5LHQsZSxuLHMscik6bnVsbDtpZihiKXtjb25zdCBNPWIucG9pbnRbZl07aWYocD9NPD1vW2crdV06TT49b1tnK3UrM10pcmV0dXJuIGJ9Y29uc3QgbT1jbihnLG8sbixzLHIpP2ZhKGcsdCxlLG4scyxyKTpudWxsO3JldHVybiBiJiZtP2IuZGlzdGFuY2U8PW0uZGlzdGFuY2U/YjptOmJ8fG18fG51bGx9fWNvbnN0IFFzPW5ldyBndCxjaT1uZXcgYWUsbGk9bmV3IGFlLFppPW5ldyBzdCwkbD1uZXcgUnQsS3M9bmV3IFJ0O2Z1bmN0aW9uIEIwKGksdCxlLG4pe250LnNldEJ1ZmZlcihpLl9yb290c1t0XSk7Y29uc3Qgcz1kYSgwLGksZSxuKTtyZXR1cm4gbnQuY2xlYXJCdWZmZXIoKSxzfWZ1bmN0aW9uIGRhKGksdCxlLG4scz1udWxsKXtjb25zdHtmbG9hdDMyQXJyYXk6cix1aW50MTZBcnJheTpvLHVpbnQzMkFycmF5OmF9PW50O2xldCBjPWkqMjtpZihzPT09bnVsbCYmKGUuYm91bmRpbmdCb3h8fGUuY29tcHV0ZUJvdW5kaW5nQm94KCksJGwuc2V0KGUuYm91bmRpbmdCb3gubWluLGUuYm91bmRpbmdCb3gubWF4LG4pLHM9JGwpLFN0KGMsbykpe2NvbnN0IGg9dC5nZW9tZXRyeSx1PWguaW5kZXgsZj1oLmF0dHJpYnV0ZXMucG9zaXRpb24sZD1lLmluZGV4LHA9ZS5hdHRyaWJ1dGVzLnBvc2l0aW9uLHk9WXQoaSxhKSxnPWxlKGMsbyk7aWYoWmkuY29weShuKS5pbnZlcnQoKSxlLmJvdW5kc1RyZWUpcmV0dXJuIGh0KGkscixLcyksS3MubWF0cml4LmNvcHkoWmkpLEtzLm5lZWRzVXBkYXRlPSEwLGUuYm91bmRzVHJlZS5zaGFwZWNhc3Qoe2ludGVyc2VjdHNCb3VuZHM6Yj0+S3MuaW50ZXJzZWN0c0JveChiKSxpbnRlcnNlY3RzVHJpYW5nbGU6Yj0+e2IuYS5hcHBseU1hdHJpeDQobiksYi5iLmFwcGx5TWF0cml4NChuKSxiLmMuYXBwbHlNYXRyaXg0KG4pLGIubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCB4PXksbT1nK3k7eDxtO3grKylpZih5dChsaSwzKnQucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoeCksdSxmKSxsaS5uZWVkc1VwZGF0ZT0hMCxiLmludGVyc2VjdHNUcmlhbmdsZShsaSkpcmV0dXJuITA7cmV0dXJuITF9fSk7e2NvbnN0IHc9U24oZSk7Zm9yKGxldCBiPXkseD1nK3k7Yjx4O2IrKyl7Y29uc3QgbT10LnJlc29sdmVUcmlhbmdsZUluZGV4KGIpO3l0KGNpLDMqbSx1LGYpLGNpLmEuYXBwbHlNYXRyaXg0KFppKSxjaS5iLmFwcGx5TWF0cml4NChaaSksY2kuYy5hcHBseU1hdHJpeDQoWmkpLGNpLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgTT0wLFM9dyozO008UztNKz0zKWlmKHl0KGxpLE0sZCxwKSxsaS5uZWVkc1VwZGF0ZT0hMCxjaS5pbnRlcnNlY3RzVHJpYW5nbGUobGkpKXJldHVybiEwfX19ZWxzZXtjb25zdCBoPV90KGkpLHU9enQoaSxhKTtyZXR1cm4gaHQoaCxyLFFzKSwhIShzLmludGVyc2VjdHNCb3goUXMpJiZkYShoLHQsZSxuLHMpfHwoaHQodSxyLFFzKSxzLmludGVyc2VjdHNCb3goUXMpJiZkYSh1LHQsZSxuLHMpKSl9fWNvbnN0IHRyPW5ldyBzdCxwYT1uZXcgUnQsR2k9bmV3IFJ0LEYwPW5ldyBQLEkwPW5ldyBQLGswPW5ldyBQLE4wPW5ldyBQO2Z1bmN0aW9uIFIwKGksdCxlLG49e30scz17fSxyPTAsbz0xLzApe3QuYm91bmRpbmdCb3h8fHQuY29tcHV0ZUJvdW5kaW5nQm94KCkscGEuc2V0KHQuYm91bmRpbmdCb3gubWluLHQuYm91bmRpbmdCb3gubWF4LGUpLHBhLm5lZWRzVXBkYXRlPSEwO2NvbnN0IGE9aS5nZW9tZXRyeSxjPWEuYXR0cmlidXRlcy5wb3NpdGlvbixsPWEuaW5kZXgsaD10LmF0dHJpYnV0ZXMucG9zaXRpb24sdT10LmluZGV4LGY9Y2UuZ2V0UHJpbWl0aXZlKCksZD1jZS5nZXRQcmltaXRpdmUoKTtsZXQgcD1GMCx5PUkwLGc9bnVsbCx3PW51bGw7cyYmKGc9azAsdz1OMCk7bGV0IGI9MS8wLHg9bnVsbCxtPW51bGw7cmV0dXJuIHRyLmNvcHkoZSkuaW52ZXJ0KCksR2kubWF0cml4LmNvcHkodHIpLGkuc2hhcGVjYXN0KHtib3VuZHNUcmF2ZXJzZU9yZGVyOk09PnBhLmRpc3RhbmNlVG9Cb3goTSksaW50ZXJzZWN0c0JvdW5kczooTSxTLEEpPT5BPGImJkE8bz8oUyYmKEdpLm1pbi5jb3B5KE0ubWluKSxHaS5tYXguY29weShNLm1heCksR2kubmVlZHNVcGRhdGU9ITApLCEwKTohMSxpbnRlcnNlY3RzUmFuZ2U6KE0sUyk9PntpZih0LmJvdW5kc1RyZWUpe2NvbnN0IEE9dC5ib3VuZHNUcmVlO3JldHVybiBBLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjp2PT5HaS5kaXN0YW5jZVRvQm94KHYpLGludGVyc2VjdHNCb3VuZHM6KHYsXyxUKT0+VDxiJiZUPG8saW50ZXJzZWN0c1JhbmdlOih2LF8pPT57Zm9yKGxldCBUPXYsej12K187VDx6O1QrKyl7Y29uc3QgQz1BLnJlc29sdmVUcmlhbmdsZUluZGV4KFQpO3l0KGQsMypDLHUsaCksZC5hLmFwcGx5TWF0cml4NChlKSxkLmIuYXBwbHlNYXRyaXg0KGUpLGQuYy5hcHBseU1hdHJpeDQoZSksZC5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IEU9TSxGPU0rUztFPEY7RSsrKXtjb25zdCBCPWkucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoRSk7eXQoZiwzKkIsbCxjKSxmLm5lZWRzVXBkYXRlPSEwO2NvbnN0IEk9Zi5kaXN0YW5jZVRvVHJpYW5nbGUoZCxwLGcpO2lmKEk8YiYmKHkuY29weShwKSx3JiZ3LmNvcHkoZyksYj1JLHg9RSxtPVQpLEk8cilyZXR1cm4hMH19fX0pfWVsc2V7Y29uc3QgQT1Tbih0KTtmb3IobGV0IHY9MCxfPUE7djxfO3YrKyl7eXQoZCwzKnYsdSxoKSxkLmEuYXBwbHlNYXRyaXg0KGUpLGQuYi5hcHBseU1hdHJpeDQoZSksZC5jLmFwcGx5TWF0cml4NChlKSxkLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgVD1NLHo9TStTO1Q8ejtUKyspe2NvbnN0IEM9aS5yZXNvbHZlVHJpYW5nbGVJbmRleChUKTt5dChmLDMqQyxsLGMpLGYubmVlZHNVcGRhdGU9ITA7Y29uc3QgRT1mLmRpc3RhbmNlVG9UcmlhbmdsZShkLHAsZyk7aWYoRTxiJiYoeS5jb3B5KHApLHcmJncuY29weShnKSxiPUUseD1ULG09diksRTxyKXJldHVybiEwfX19fX0pLGNlLnJlbGVhc2VQcmltaXRpdmUoZiksY2UucmVsZWFzZVByaW1pdGl2ZShkKSxiPT09MS8wP251bGw6KG4ucG9pbnQ/bi5wb2ludC5jb3B5KHkpOm4ucG9pbnQ9eS5jbG9uZSgpLG4uZGlzdGFuY2U9YixuLmZhY2VJbmRleD14LHMmJihzLnBvaW50P3MucG9pbnQuY29weSh3KTpzLnBvaW50PXcuY2xvbmUoKSxzLnBvaW50LmFwcGx5TWF0cml4NCh0cikseS5hcHBseU1hdHJpeDQodHIpLHMuZGlzdGFuY2U9eS5zdWIocy5wb2ludCkubGVuZ3RoKCkscy5mYWNlSW5kZXg9bSksbil9ZnVuY3Rpb24gTDAoKXtyZXR1cm4gdHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyIT0idW5kZWZpbmVkIn1jb25zdCBXaT1uZXcgbnQuY29uc3RydWN0b3IsZXI9bmV3IG50LmNvbnN0cnVjdG9yLGxuPW5ldyBpYSgoKT0+bmV3IGd0KSxoaT1uZXcgZ3QsdWk9bmV3IGd0LHlhPW5ldyBndCxtYT1uZXcgZ3Q7bGV0IGdhPSExO2Z1bmN0aW9uIE8wKGksdCxlLG4pe2lmKGdhKXRocm93IG5ldyBFcnJvcigiTWVzaEJWSDogUmVjdXJzaXZlIGNhbGxzIHRvIGJ2aGNhc3Qgbm90IHN1cHBvcnRlZC4iKTtnYT0hMDtjb25zdCBzPWkuX3Jvb3RzLHI9dC5fcm9vdHM7bGV0IG8sYT0wLGM9MDtjb25zdCBsPW5ldyBzdCgpLmNvcHkoZSkuaW52ZXJ0KCk7Zm9yKGxldCBoPTAsdT1zLmxlbmd0aDtoPHU7aCsrKXtXaS5zZXRCdWZmZXIoc1toXSksYz0wO2NvbnN0IGY9bG4uZ2V0UHJpbWl0aXZlKCk7aHQoMCxXaS5mbG9hdDMyQXJyYXksZiksZi5hcHBseU1hdHJpeDQobCk7Zm9yKGxldCBkPTAscD1yLmxlbmd0aDtkPHAmJihlci5zZXRCdWZmZXIocltkXSksbz1nZSgwLDAsZSxsLG4sYSxjLDAsMCxmKSxlci5jbGVhckJ1ZmZlcigpLGMrPXJbZF0uYnl0ZUxlbmd0aC9OdCwhbyk7ZCsrKTtpZihsbi5yZWxlYXNlUHJpbWl0aXZlKGYpLFdpLmNsZWFyQnVmZmVyKCksYSs9c1toXS5ieXRlTGVuZ3RoL050LG8pYnJlYWt9cmV0dXJuIGdhPSExLG99ZnVuY3Rpb24gZ2UoaSx0LGUsbixzLHI9MCxvPTAsYT0wLGM9MCxsPW51bGwsaD0hMSl7bGV0IHUsZjtoPyh1PWVyLGY9V2kpOih1PVdpLGY9ZXIpO2NvbnN0IGQ9dS5mbG9hdDMyQXJyYXkscD11LnVpbnQzMkFycmF5LHk9dS51aW50MTZBcnJheSxnPWYuZmxvYXQzMkFycmF5LHc9Zi51aW50MzJBcnJheSxiPWYudWludDE2QXJyYXkseD1pKjIsbT10KjIsTT1TdCh4LHkpLFM9U3QobSxiKTtsZXQgQT0hMTtpZihTJiZNKWg/QT1zKFl0KHQsdyksbGUodCoyLGIpLFl0KGkscCksbGUoaSoyLHkpLGMsbyt0L0F0LGEscitpL0F0KTpBPXMoWXQoaSxwKSxsZShpKjIseSksWXQodCx3KSxsZSh0KjIsYiksYSxyK2kvQXQsYyxvK3QvQXQpO2Vsc2UgaWYoUyl7Y29uc3Qgdj1sbi5nZXRQcmltaXRpdmUoKTtodCh0LGcsdiksdi5hcHBseU1hdHJpeDQoZSk7Y29uc3QgXz1fdChpKSxUPXp0KGkscCk7aHQoXyxkLGhpKSxodChULGQsdWkpO2NvbnN0IHo9di5pbnRlcnNlY3RzQm94KGhpKSxDPXYuaW50ZXJzZWN0c0JveCh1aSk7QT16JiZnZSh0LF8sbixlLHMsbyxyLGMsYSsxLHYsIWgpfHxDJiZnZSh0LFQsbixlLHMsbyxyLGMsYSsxLHYsIWgpLGxuLnJlbGVhc2VQcmltaXRpdmUodil9ZWxzZXtjb25zdCB2PV90KHQpLF89enQodCx3KTtodCh2LGcseWEpLGh0KF8sZyxtYSk7Y29uc3QgVD1sLmludGVyc2VjdHNCb3goeWEpLHo9bC5pbnRlcnNlY3RzQm94KG1hKTtpZihUJiZ6KUE9Z2UoaSx2LGUsbixzLHIsbyxhLGMrMSxsLGgpfHxnZShpLF8sZSxuLHMscixvLGEsYysxLGwsaCk7ZWxzZSBpZihUKWlmKE0pQT1nZShpLHYsZSxuLHMscixvLGEsYysxLGwsaCk7ZWxzZXtjb25zdCBDPWxuLmdldFByaW1pdGl2ZSgpO0MuY29weSh5YSkuYXBwbHlNYXRyaXg0KGUpO2NvbnN0IEU9X3QoaSksRj16dChpLHApO2h0KEUsZCxoaSksaHQoRixkLHVpKTtjb25zdCBCPUMuaW50ZXJzZWN0c0JveChoaSksST1DLmludGVyc2VjdHNCb3godWkpO0E9QiYmZ2UodixFLG4sZSxzLG8scixjLGErMSxDLCFoKXx8SSYmZ2UodixGLG4sZSxzLG8scixjLGErMSxDLCFoKSxsbi5yZWxlYXNlUHJpbWl0aXZlKEMpfWVsc2UgaWYoeilpZihNKUE9Z2UoaSxfLGUsbixzLHIsbyxhLGMrMSxsLGgpO2Vsc2V7Y29uc3QgQz1sbi5nZXRQcmltaXRpdmUoKTtDLmNvcHkobWEpLmFwcGx5TWF0cml4NChlKTtjb25zdCBFPV90KGkpLEY9enQoaSxwKTtodChFLGQsaGkpLGh0KEYsZCx1aSk7Y29uc3QgQj1DLmludGVyc2VjdHNCb3goaGkpLEk9Qy5pbnRlcnNlY3RzQm94KHVpKTtBPUImJmdlKF8sRSxuLGUscyxvLHIsYyxhKzEsQywhaCl8fEkmJmdlKF8sRixuLGUscyxvLHIsYyxhKzEsQywhaCksbG4ucmVsZWFzZVByaW1pdGl2ZShDKX19cmV0dXJuIEF9Y29uc3QgbnI9bmV3IFJ0LFZsPW5ldyBndCxEMD17c3RyYXRlZ3k6TWwsbWF4RGVwdGg6NDAsbWF4TGVhZlRyaXM6MTAsdXNlU2hhcmVkQXJyYXlCdWZmZXI6ITEsc2V0Qm91bmRpbmdCb3g6ITAsb25Qcm9ncmVzczpudWxsLGluZGlyZWN0OiExLHZlcmJvc2U6ITAscmFuZ2U6bnVsbH07Y2xhc3MgeGF7c3RhdGljIHNlcmlhbGl6ZSh0LGU9e30pe2U9VXQoe2Nsb25lQnVmZmVyczohMH0sZSk7Y29uc3Qgbj10Lmdlb21ldHJ5LHM9dC5fcm9vdHMscj10Ll9pbmRpcmVjdEJ1ZmZlcixvPW4uZ2V0SW5kZXgoKSxhPXt2ZXJzaW9uOjEscm9vdHM6bnVsbCxpbmRleDpudWxsLGluZGlyZWN0QnVmZmVyOm51bGx9O3JldHVybiBlLmNsb25lQnVmZmVycz8oYS5yb290cz1zLm1hcChjPT5jLnNsaWNlKCkpLGEuaW5kZXg9bz9vLmFycmF5LnNsaWNlKCk6bnVsbCxhLmluZGlyZWN0QnVmZmVyPXI/ci5zbGljZSgpOm51bGwpOihhLnJvb3RzPXMsYS5pbmRleD1vP28uYXJyYXk6bnVsbCxhLmluZGlyZWN0QnVmZmVyPXIpLGF9c3RhdGljIGRlc2VyaWFsaXplKHQsZSxuPXt9KXtuPVV0KHtzZXRJbmRleDohMCxpbmRpcmVjdDohIXQuaW5kaXJlY3RCdWZmZXJ9LG4pO2NvbnN0e2luZGV4OnMscm9vdHM6cixpbmRpcmVjdEJ1ZmZlcjpvfT10O3QudmVyc2lvbnx8KGNvbnNvbGUud2FybigiTWVzaEJWSC5kZXNlcmlhbGl6ZTogU2VyaWFsaXphdGlvbiBmb3JtYXQgaGFzIGJlZW4gY2hhbmdlZCBhbmQgd2lsbCBiZSBmaXhlZCB1cC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gcmVnZW5lcmF0ZSBhbnkgc3RvcmVkIHNlcmlhbGl6ZWQgZGF0YS4iKSxjKHIpKTtjb25zdCBhPW5ldyB4YShlLEtlKFV0KHt9LG4pLHtbWW9dOiEwfSkpO2lmKGEuX3Jvb3RzPXIsYS5faW5kaXJlY3RCdWZmZXI9b3x8bnVsbCxuLnNldEluZGV4KXtjb25zdCBsPWUuZ2V0SW5kZXgoKTtpZihsPT09bnVsbCl7Y29uc3QgaD1uZXcgeHQodC5pbmRleCwxLCExKTtlLnNldEluZGV4KGgpfWVsc2UgbC5hcnJheSE9PXMmJihsLmFycmF5LnNldChzKSxsLm5lZWRzVXBkYXRlPSEwKX1yZXR1cm4gYTtmdW5jdGlvbiBjKGwpe2ZvcihsZXQgaD0wO2g8bC5sZW5ndGg7aCsrKXtjb25zdCB1PWxbaF0sZj1uZXcgVWludDMyQXJyYXkodSksZD1uZXcgVWludDE2QXJyYXkodSk7Zm9yKGxldCBwPTAseT11LmJ5dGVMZW5ndGgvTnQ7cDx5O3ArKyl7Y29uc3QgZz1BdCpwLHc9MipnO1N0KHcsZCl8fChmW2crNl09ZltnKzZdL0F0LXApfX19fWdldCBpbmRpcmVjdCgpe3JldHVybiEhdGhpcy5faW5kaXJlY3RCdWZmZXJ9Y29uc3RydWN0b3IodCxlPXt9KXtpZih0LmlzQnVmZmVyR2VvbWV0cnkpe2lmKHQuaW5kZXgmJnQuaW5kZXguaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSl0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoZSBpbmRleCBhdHRyaWJ1dGUuIil9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IE9ubHkgQnVmZmVyR2VvbWV0cmllcyBhcmUgc3VwcG9ydGVkLiIpO2lmKGU9T2JqZWN0LmFzc2lnbihLZShVdCh7fSxEMCkse1tZb106ITF9KSxlKSxlLnVzZVNoYXJlZEFycmF5QnVmZmVyJiYhTDAoKSl0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IFNoYXJlZEFycmF5QnVmZmVyIGlzIG5vdCBhdmFpbGFibGUuIik7dGhpcy5nZW9tZXRyeT10LHRoaXMuX3Jvb3RzPW51bGwsdGhpcy5faW5kaXJlY3RCdWZmZXI9bnVsbCxlW1lvXXx8KGUwKHRoaXMsZSksIXQuYm91bmRpbmdCb3gmJmUuc2V0Qm91bmRpbmdCb3gmJih0LmJvdW5kaW5nQm94PXRoaXMuZ2V0Qm91bmRpbmdCb3gobmV3IGd0KSkpLHRoaXMucmVzb2x2ZVRyaWFuZ2xlSW5kZXg9ZS5pbmRpcmVjdD9uPT50aGlzLl9pbmRpcmVjdEJ1ZmZlcltuXTpuPT5ufXNoaWZ0VHJpYW5nbGVPZmZzZXRzKHQpe2NvbnN0IGU9dGhpcy5faW5kaXJlY3RCdWZmZXI7aWYoZSlmb3IobGV0IG49MCxzPWUubGVuZ3RoO248cztuKyspZVtuXSs9dDtlbHNle2NvbnN0IG49dGhpcy5fcm9vdHM7Zm9yKGxldCBzPTA7czxuLmxlbmd0aDtzKyspe2NvbnN0IHI9bltzXSxvPW5ldyBVaW50MzJBcnJheShyKSxhPW5ldyBVaW50MTZBcnJheShyKSxjPXIuYnl0ZUxlbmd0aC9OdDtmb3IobGV0IGw9MDtsPGM7bCsrKXtjb25zdCBoPUF0KmwsdT0yKmg7U3QodSxhKSYmKG9baCs2XSs9dCl9fX19cmVmaXQodD1udWxsKXtyZXR1cm4odGhpcy5pbmRpcmVjdD9UMDpwMCkodGhpcyx0KX10cmF2ZXJzZSh0LGU9MCl7Y29uc3Qgbj10aGlzLl9yb290c1tlXSxzPW5ldyBVaW50MzJBcnJheShuKSxyPW5ldyBVaW50MTZBcnJheShuKTtvKDApO2Z1bmN0aW9uIG8oYSxjPTApe2NvbnN0IGw9YSoyLGg9U3QobCxyKTtpZihoKXtjb25zdCB1PXNbYSs2XSxmPXJbbCsxNF07dChjLGgsbmV3IEZsb2F0MzJBcnJheShuLGEqNCw2KSx1LGYpfWVsc2V7Y29uc3QgdT1fdChhKSxmPXp0KGEscyksZD1zYShhLHMpO3QoYyxoLG5ldyBGbG9hdDMyQXJyYXkobixhKjQsNiksZCl8fChvKHUsYysxKSxvKGYsYysxKSl9fX1yYXljYXN0KHQsZT0wLG49MCxzPTEvMCl7Y29uc3Qgcj10aGlzLl9yb290cyxvPVtdLGE9dGhpcy5pbmRpcmVjdD9QMDp4MDtmb3IobGV0IGM9MCxsPXIubGVuZ3RoO2M8bDtjKyspYSh0aGlzLGMsZSx0LG8sbixzKTtyZXR1cm4gb31yYXljYXN0Rmlyc3QodCxlPTAsbj0wLHM9MS8wKXtjb25zdCByPXRoaXMuX3Jvb3RzO2xldCBvPW51bGw7Y29uc3QgYT10aGlzLmluZGlyZWN0P0UwOmIwO2ZvcihsZXQgYz0wLGw9ci5sZW5ndGg7YzxsO2MrKyl7Y29uc3QgaD1hKHRoaXMsYyxlLHQsbixzKTtoIT1udWxsJiYobz09bnVsbHx8aC5kaXN0YW5jZTxvLmRpc3RhbmNlKSYmKG89aCl9cmV0dXJuIG99aW50ZXJzZWN0c0dlb21ldHJ5KHQsZSl7bGV0IG49ITE7Y29uc3Qgcz10aGlzLl9yb290cyxyPXRoaXMuaW5kaXJlY3Q/QjA6TTA7Zm9yKGxldCBvPTAsYT1zLmxlbmd0aDtvPGEmJihuPXIodGhpcyxvLHQsZSksIW4pO28rKyk7cmV0dXJuIG59c2hhcGVjYXN0KHQpe2NvbnN0IGU9Y2UuZ2V0UHJpbWl0aXZlKCksbj10aGlzLmluZGlyZWN0P2cwOmQwO2xldHtib3VuZHNUcmF2ZXJzZU9yZGVyOnMsaW50ZXJzZWN0c0JvdW5kczpyLGludGVyc2VjdHNSYW5nZTpvLGludGVyc2VjdHNUcmlhbmdsZTphfT10O2lmKG8mJmEpe2NvbnN0IHU9bztvPShmLGQscCx5LGcpPT51KGYsZCxwLHksZyk/ITA6bihmLGQsdGhpcyxhLHAseSxlKX1lbHNlIG98fChhP289KHUsZixkLHApPT5uKHUsZix0aGlzLGEsZCxwLGUpOm89KHUsZixkKT0+ZCk7bGV0IGM9ITEsbD0wO2NvbnN0IGg9dGhpcy5fcm9vdHM7Zm9yKGxldCB1PTAsZj1oLmxlbmd0aDt1PGY7dSsrKXtjb25zdCBkPWhbdV07aWYoYz1hMCh0aGlzLHUscixvLHMsbCksYylicmVhaztsKz1kLmJ5dGVMZW5ndGgvTnR9cmV0dXJuIGNlLnJlbGVhc2VQcmltaXRpdmUoZSksY31idmhjYXN0KHQsZSxuKXtsZXR7aW50ZXJzZWN0c1JhbmdlczpzLGludGVyc2VjdHNUcmlhbmdsZXM6cn09bjtjb25zdCBvPWNlLmdldFByaW1pdGl2ZSgpLGE9dGhpcy5nZW9tZXRyeS5pbmRleCxjPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbixsPXRoaXMuaW5kaXJlY3Q/cD0+e2NvbnN0IHk9dGhpcy5yZXNvbHZlVHJpYW5nbGVJbmRleChwKTt5dChvLHkqMyxhLGMpfTpwPT57eXQobyxwKjMsYSxjKX0saD1jZS5nZXRQcmltaXRpdmUoKSx1PXQuZ2VvbWV0cnkuaW5kZXgsZj10Lmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24sZD10LmluZGlyZWN0P3A9Pntjb25zdCB5PXQucmVzb2x2ZVRyaWFuZ2xlSW5kZXgocCk7eXQoaCx5KjMsdSxmKX06cD0+e3l0KGgscCozLHUsZil9O2lmKHIpe2NvbnN0IHA9KHksZyx3LGIseCxtLE0sUyk9Pntmb3IobGV0IEE9dyx2PXcrYjtBPHY7QSsrKXtkKEEpLGguYS5hcHBseU1hdHJpeDQoZSksaC5iLmFwcGx5TWF0cml4NChlKSxoLmMuYXBwbHlNYXRyaXg0KGUpLGgubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBfPXksVD15K2c7XzxUO18rKylpZihsKF8pLG8ubmVlZHNVcGRhdGU9ITAscihvLGgsXyxBLHgsbSxNLFMpKXJldHVybiEwfXJldHVybiExfTtpZihzKXtjb25zdCB5PXM7cz1mdW5jdGlvbihnLHcsYix4LG0sTSxTLEEpe3JldHVybiB5KGcsdyxiLHgsbSxNLFMsQSk/ITA6cChnLHcsYix4LG0sTSxTLEEpfX1lbHNlIHM9cH1yZXR1cm4gTzAodGhpcyx0LGUscyl9aW50ZXJzZWN0c0JveCh0LGUpe3JldHVybiBuci5zZXQodC5taW4sdC5tYXgsZSksbnIubmVlZHNVcGRhdGU9ITAsdGhpcy5zaGFwZWNhc3Qoe2ludGVyc2VjdHNCb3VuZHM6bj0+bnIuaW50ZXJzZWN0c0JveChuKSxpbnRlcnNlY3RzVHJpYW5nbGU6bj0+bnIuaW50ZXJzZWN0c1RyaWFuZ2xlKG4pfSl9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5zaGFwZWNhc3Qoe2ludGVyc2VjdHNCb3VuZHM6ZT0+dC5pbnRlcnNlY3RzQm94KGUpLGludGVyc2VjdHNUcmlhbmdsZTplPT5lLmludGVyc2VjdHNTcGhlcmUodCl9KX1jbG9zZXN0UG9pbnRUb0dlb21ldHJ5KHQsZSxuPXt9LHM9e30scj0wLG89MS8wKXtyZXR1cm4odGhpcy5pbmRpcmVjdD9SMDp6MCkodGhpcyx0LGUsbixzLHIsbyl9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGU9e30sbj0wLHM9MS8wKXtyZXR1cm4gYzAodGhpcyx0LGUsbixzKX1nZXRCb3VuZGluZ0JveCh0KXtyZXR1cm4gdC5tYWtlRW1wdHkoKSx0aGlzLl9yb290cy5mb3JFYWNoKG49PntodCgwLG5ldyBGbG9hdDMyQXJyYXkobiksVmwpLHQudW5pb24oVmwpfSksdH19Y29uc3QgVWw9MWUtNiwkMD1VbCouNSxxbD1NYXRoLnBvdygxMCwtTWF0aC5sb2cxMChVbCkpLFYwPSQwKnFsO2Z1bmN0aW9uIHZlKGkpe3JldHVybn5+KGkqcWwrVjApfWZ1bmN0aW9uIFUwKGkpe3JldHVybmAke3ZlKGkueCl9LCR7dmUoaS55KX1gfWZ1bmN0aW9uIFhsKGkpe3JldHVybmAke3ZlKGkueCl9LCR7dmUoaS55KX0sJHt2ZShpLnopfWB9ZnVuY3Rpb24gcTAoaSl7cmV0dXJuYCR7dmUoaS54KX0sJHt2ZShpLnkpfSwke3ZlKGkueil9LCR7dmUoaS53KX1gfWZ1bmN0aW9uIFgwKGksdCxlKXtlLmRpcmVjdGlvbi5zdWJWZWN0b3JzKHQsaSkubm9ybWFsaXplKCk7Y29uc3Qgbj1pLmRvdChlLmRpcmVjdGlvbik7cmV0dXJuIGUub3JpZ2luLmNvcHkoaSkuYWRkU2NhbGVkVmVjdG9yKGUuZGlyZWN0aW9uLC1uKSxlfWZ1bmN0aW9uIFpsKCl7cmV0dXJuIHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciE9InVuZGVmaW5lZCJ9ZnVuY3Rpb24gWjAoaSl7aWYoaS5idWZmZXIgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcilyZXR1cm4gaTtjb25zdCB0PWkuY29uc3RydWN0b3IsZT1pLmJ1ZmZlcixuPW5ldyBTaGFyZWRBcnJheUJ1ZmZlcihlLmJ5dGVMZW5ndGgpLHM9bmV3IFVpbnQ4QXJyYXkoZSk7cmV0dXJuIG5ldyBVaW50OEFycmF5KG4pLnNldChzLDApLG5ldyB0KG4pfWZ1bmN0aW9uIEcwKGksdD1BcnJheUJ1ZmZlcil7cmV0dXJuIGk+NjU1MzU/bmV3IFVpbnQzMkFycmF5KG5ldyB0KDQqaSkpOm5ldyBVaW50MTZBcnJheShuZXcgdCgyKmkpKX1mdW5jdGlvbiBXMChpLHQpe2lmKCFpLmluZGV4KXtjb25zdCBlPWkuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudCxuPXQudXNlU2hhcmVkQXJyYXlCdWZmZXI/U2hhcmVkQXJyYXlCdWZmZXI6QXJyYXlCdWZmZXIscz1HMChlLG4pO2kuc2V0SW5kZXgobmV3IHh0KHMsMSkpO2ZvcihsZXQgcj0wO3I8ZTtyKyspc1tyXT1yfX1mdW5jdGlvbiBIMChpKXtyZXR1cm4gaS5pbmRleD9pLmluZGV4LmNvdW50OmkuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudH1mdW5jdGlvbiB3YShpKXtyZXR1cm4gSDAoaSkvM31jb25zdCBKMD0xZS04LFkwPW5ldyBQO2Z1bmN0aW9uIGowKGkpe3JldHVybn5+KGkvMyl9ZnVuY3Rpb24gUTAoaSl7cmV0dXJuIGklM31mdW5jdGlvbiBHbChpLHQpe3JldHVybiBpLnN0YXJ0LXQuc3RhcnR9ZnVuY3Rpb24gV2woaSx0KXtyZXR1cm4gWTAuc3ViVmVjdG9ycyh0LGkub3JpZ2luKS5kb3QoaS5kaXJlY3Rpb24pfWZ1bmN0aW9uIEswKGksdCxlLG49SjApe2kuc29ydChHbCksdC5zb3J0KEdsKTtmb3IobGV0IGE9MDthPGkubGVuZ3RoO2ErKyl7Y29uc3QgYz1pW2FdO2ZvcihsZXQgbD0wO2w8dC5sZW5ndGg7bCsrKXtjb25zdCBoPXRbbF07aWYoIShoLnN0YXJ0PmMuZW5kKSl7aWYoYy5lbmQ8aC5zdGFydHx8aC5lbmQ8Yy5zdGFydCljb250aW51ZTtpZihjLnN0YXJ0PD1oLnN0YXJ0JiZjLmVuZD49aC5lbmQpcihoLmVuZCxjLmVuZCl8fGkuc3BsaWNlKGErMSwwLHtzdGFydDpoLmVuZCxlbmQ6Yy5lbmQsaW5kZXg6Yy5pbmRleH0pLGMuZW5kPWguc3RhcnQsaC5zdGFydD0wLGguZW5kPTA7ZWxzZSBpZihjLnN0YXJ0Pj1oLnN0YXJ0JiZjLmVuZDw9aC5lbmQpcihjLmVuZCxoLmVuZCl8fHQuc3BsaWNlKGwrMSwwLHtzdGFydDpjLmVuZCxlbmQ6aC5lbmQsaW5kZXg6aC5pbmRleH0pLGguZW5kPWMuc3RhcnQsYy5zdGFydD0wLGMuZW5kPTA7ZWxzZSBpZihjLnN0YXJ0PD1oLnN0YXJ0JiZjLmVuZDw9aC5lbmQpe2NvbnN0IHU9Yy5lbmQ7Yy5lbmQ9aC5zdGFydCxoLnN0YXJ0PXV9ZWxzZSBpZihjLnN0YXJ0Pj1oLnN0YXJ0JiZjLmVuZD49aC5lbmQpe2NvbnN0IHU9aC5lbmQ7aC5lbmQ9Yy5zdGFydCxjLnN0YXJ0PXV9ZWxzZSB0aHJvdyBuZXcgRXJyb3J9aWYoZS5oYXMoYy5pbmRleCl8fGUuc2V0KGMuaW5kZXgsW10pLGUuaGFzKGguaW5kZXgpfHxlLnNldChoLmluZGV4LFtdKSxlLmdldChjLmluZGV4KS5wdXNoKGguaW5kZXgpLGUuZ2V0KGguaW5kZXgpLnB1c2goYy5pbmRleCksbyhoKSYmKHQuc3BsaWNlKGwsMSksbC0tKSxvKGMpKXtpLnNwbGljZShhLDEpLGEtLTticmVha319fXMoaSkscyh0KTtmdW5jdGlvbiBzKGEpe2ZvcihsZXQgYz0wO2M8YS5sZW5ndGg7YysrKW8oYVtjXSkmJihhLnNwbGljZShjLDEpLGMtLSl9ZnVuY3Rpb24gcihhLGMpe3JldHVybiBNYXRoLmFicyhjLWEpPG59ZnVuY3Rpb24gbyhhKXtyZXR1cm4gTWF0aC5hYnMoYS5lbmQtYS5zdGFydCk8bn19Y29uc3QgSGw9MWUtNSxKbD0xZS00O2NsYXNzIHRwe2NvbnN0cnVjdG9yKCl7dGhpcy5fcmF5cz1bXX1hZGRSYXkodCl7dGhpcy5fcmF5cy5wdXNoKHQpfWZpbmRDbG9zZXN0UmF5KHQpe2NvbnN0IGU9dGhpcy5fcmF5cyxuPXQuY2xvbmUoKTtuLmRpcmVjdGlvbi5tdWx0aXBseVNjYWxhcigtMSk7bGV0IHM9MS8wLHI9bnVsbDtmb3IobGV0IGM9MCxsPWUubGVuZ3RoO2M8bDtjKyspe2NvbnN0IGg9ZVtjXTtpZihvKGgsdCkmJm8oaCxuKSljb250aW51ZTtjb25zdCB1PWEoaCx0KSxmPWEoaCxuKSxkPU1hdGgubWluKHUsZik7ZDxzJiYocz1kLHI9aCl9cmV0dXJuIHI7ZnVuY3Rpb24gbyhjLGwpe2NvbnN0IGg9Yy5vcmlnaW4uZGlzdGFuY2VUbyhsLm9yaWdpbik+SGw7cmV0dXJuIGMuZGlyZWN0aW9uLmFuZ2xlVG8obC5kaXJlY3Rpb24pPkpsfHxofWZ1bmN0aW9uIGEoYyxsKXtjb25zdCBoPWMub3JpZ2luLmRpc3RhbmNlVG8obC5vcmlnaW4pLHU9Yy5kaXJlY3Rpb24uYW5nbGVUbyhsLmRpcmVjdGlvbik7cmV0dXJuIGgvSGwrdS9KbH19fWNvbnN0IGJhPW5ldyBQLE1hPW5ldyBQLGlyPW5ldyBTbztmdW5jdGlvbiBlcChpLHQsZSl7Y29uc3Qgbj1pLmF0dHJpYnV0ZXMscz1pLmluZGV4LHI9bi5wb3NpdGlvbixvPW5ldyBNYXAsYT1uZXcgTWFwLGM9QXJyYXkuZnJvbSh0KSxsPW5ldyB0cDtmb3IobGV0IGg9MCx1PWMubGVuZ3RoO2g8dTtoKyspe2NvbnN0IGY9Y1toXSxkPWowKGYpLHA9UTAoZik7bGV0IHk9MypkK3AsZz0zKmQrKHArMSklMztzJiYoeT1zLmdldFgoeSksZz1zLmdldFgoZykpLGJhLmZyb21CdWZmZXJBdHRyaWJ1dGUocix5KSxNYS5mcm9tQnVmZmVyQXR0cmlidXRlKHIsZyksWDAoYmEsTWEsaXIpO2xldCB3LGI9bC5maW5kQ2xvc2VzdFJheShpcik7Yj09PW51bGwmJihiPWlyLmNsb25lKCksbC5hZGRSYXkoYikpLGEuaGFzKGIpfHxhLnNldChiLHtmb3J3YXJkOltdLHJldmVyc2U6W10scmF5OmJ9KSx3PWEuZ2V0KGIpO2xldCB4PVdsKGIsYmEpLG09V2woYixNYSk7eD5tJiYoW3gsbV09W20seF0pLGlyLmRpcmVjdGlvbi5kb3QoYi5kaXJlY3Rpb24pPDA/dy5yZXZlcnNlLnB1c2goe3N0YXJ0OngsZW5kOm0saW5kZXg6Zn0pOncuZm9yd2FyZC5wdXNoKHtzdGFydDp4LGVuZDptLGluZGV4OmZ9KX1yZXR1cm4gYS5mb3JFYWNoKCh7Zm9yd2FyZDpoLHJldmVyc2U6dX0sZik9PntLMChoLHUsbyxlKSxoLmxlbmd0aD09PTAmJnUubGVuZ3RoPT09MCYmYS5kZWxldGUoZil9KSx7ZGlzam9pbnRDb25uZWN0aXZpdHlNYXA6byxmcmFnbWVudE1hcDphfX1jb25zdCBucD1uZXcgayxBYT1uZXcgUCxpcD1uZXcgaWUsU2E9WyIiLCIiLCIiXTtjbGFzcyBzcHtjb25zdHJ1Y3Rvcih0PW51bGwpe3RoaXMuZGF0YT1udWxsLHRoaXMuZGlzam9pbnRDb25uZWN0aW9ucz1udWxsLHRoaXMudW5tYXRjaGVkRGlzam9pbnRFZGdlcz1udWxsLHRoaXMudW5tYXRjaGVkRWRnZXM9LTEsdGhpcy5tYXRjaGVkRWRnZXM9LTEsdGhpcy51c2VEcmF3UmFuZ2U9ITAsdGhpcy51c2VBbGxBdHRyaWJ1dGVzPSExLHRoaXMubWF0Y2hEaXNqb2ludEVkZ2VzPSExLHRoaXMuZGVnZW5lcmF0ZUVwc2lsb249MWUtOCx0JiZ0aGlzLnVwZGF0ZUZyb20odCl9Z2V0U2libGluZ1RyaWFuZ2xlSW5kZXgodCxlKXtjb25zdCBuPXRoaXMuZGF0YVt0KjMrZV07cmV0dXJuIG49PT0tMT8tMTp+fihuLzMpfWdldFNpYmxpbmdFZGdlSW5kZXgodCxlKXtjb25zdCBuPXRoaXMuZGF0YVt0KjMrZV07cmV0dXJuIG49PT0tMT8tMTpuJTN9Z2V0RGlzam9pbnRTaWJsaW5nVHJpYW5nbGVJbmRpY2VzKHQsZSl7Y29uc3Qgbj10KjMrZSxzPXRoaXMuZGlzam9pbnRDb25uZWN0aW9ucy5nZXQobik7cmV0dXJuIHM/cy5tYXAocj0+fn4oci8zKSk6W119Z2V0RGlzam9pbnRTaWJsaW5nRWRnZUluZGljZXModCxlKXtjb25zdCBuPXQqMytlLHM9dGhpcy5kaXNqb2ludENvbm5lY3Rpb25zLmdldChuKTtyZXR1cm4gcz9zLm1hcChyPT5yJTMpOltdfWlzRnVsbHlDb25uZWN0ZWQoKXtyZXR1cm4gdGhpcy51bm1hdGNoZWRFZGdlcz09PTB9dXBkYXRlRnJvbSh0KXtjb25zdHt1c2VBbGxBdHRyaWJ1dGVzOmUsdXNlRHJhd1JhbmdlOm4sbWF0Y2hEaXNqb2ludEVkZ2VzOnMsZGVnZW5lcmF0ZUVwc2lsb246cn09dGhpcyxvPWU/eDpiLGE9bmV3IE1hcCx7YXR0cmlidXRlczpjfT10LGw9ZT9PYmplY3Qua2V5cyhjKTpudWxsLGg9dC5pbmRleCx1PWMucG9zaXRpb247bGV0IGY9d2EodCk7Y29uc3QgZD1mO2xldCBwPTA7biYmKHA9dC5kcmF3UmFuZ2Uuc3RhcnQsdC5kcmF3UmFuZ2UuY291bnQhPT0xLzAmJihmPX5+KHQuZHJhd1JhbmdlLmNvdW50LzMpKSk7bGV0IHk9dGhpcy5kYXRhOygheXx8eS5sZW5ndGg8MypkKSYmKHk9bmV3IEludDMyQXJyYXkoMypkKSkseS5maWxsKC0xKTtsZXQgZz0wLHc9bmV3IFNldDtmb3IobGV0IG09cCxNPWYqMytwO208TTttKz0zKXtjb25zdCBTPW07Zm9yKGxldCBBPTA7QTwzO0ErKyl7bGV0IHY9UytBO2gmJih2PWguZ2V0WCh2KSksU2FbQV09byh2KX1mb3IobGV0IEE9MDtBPDM7QSsrKXtjb25zdCB2PShBKzEpJTMsXz1TYVtBXSxUPVNhW3ZdLHo9YCR7VH1fJHtffWA7aWYoYS5oYXMoeikpe2NvbnN0IEM9UytBLEU9YS5nZXQoeik7eVtDXT1FLHlbRV09QyxhLmRlbGV0ZSh6KSxnKz0yLHcuZGVsZXRlKEUpfWVsc2V7Y29uc3QgQz1gJHtffV8ke1R9YCxFPVMrQTthLnNldChDLEUpLHcuYWRkKEUpfX19aWYocyl7Y29uc3R7ZnJhZ21lbnRNYXA6bSxkaXNqb2ludENvbm5lY3Rpdml0eU1hcDpNfT1lcCh0LHcscik7dy5jbGVhcigpLG0uZm9yRWFjaCgoe2ZvcndhcmQ6UyxyZXZlcnNlOkF9KT0+e1MuZm9yRWFjaCgoe2luZGV4OnZ9KT0+dy5hZGQodikpLEEuZm9yRWFjaCgoe2luZGV4OnZ9KT0+dy5hZGQodikpfSksdGhpcy51bm1hdGNoZWREaXNqb2ludEVkZ2VzPW0sdGhpcy5kaXNqb2ludENvbm5lY3Rpb25zPU0sZz1mKjMtdy5zaXplfXRoaXMubWF0Y2hlZEVkZ2VzPWcsdGhpcy51bm1hdGNoZWRFZGdlcz13LnNpemUsdGhpcy5kYXRhPXk7ZnVuY3Rpb24gYihtKXtyZXR1cm4gQWEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh1LG0pLFhsKEFhKX1mdW5jdGlvbiB4KG0pe2xldCBNPSIiO2ZvcihsZXQgUz0wLEE9bC5sZW5ndGg7UzxBO1MrKyl7Y29uc3Qgdj1jW2xbU11dO2xldCBfO3N3aXRjaCh2Lml0ZW1TaXplKXtjYXNlIDE6Xz12ZSh2LmdldFgobSkpO2JyZWFrO2Nhc2UgMjpfPVUwKG5wLmZyb21CdWZmZXJBdHRyaWJ1dGUodixtKSk7YnJlYWs7Y2FzZSAzOl89WGwoQWEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh2LG0pKTticmVhaztjYXNlIDQ6Xz1xMChpcC5mcm9tQnVmZmVyQXR0cmlidXRlKHYsbSkpO2JyZWFrfU0hPT0iIiYmKE0rPSJ8IiksTSs9X31yZXR1cm4gTX19fWNsYXNzIHNyIGV4dGVuZHMgaWR7Y29uc3RydWN0b3IoLi4udCl7c3VwZXIoLi4udCksdGhpcy5pc0JydXNoPSEwLHRoaXMuX3ByZXZpb3VzTWF0cml4PW5ldyBzdCx0aGlzLl9wcmV2aW91c01hdHJpeC5lbGVtZW50cy5maWxsKDApfW1hcmtVcGRhdGVkKCl7dGhpcy5fcHJldmlvdXNNYXRyaXguY29weSh0aGlzLm1hdHJpeCl9aXNEaXJ0eSgpe2NvbnN0e21hdHJpeDp0LF9wcmV2aW91c01hdHJpeDplfT10aGlzLG49dC5lbGVtZW50cyxzPWUuZWxlbWVudHM7Zm9yKGxldCByPTA7cjwxNjtyKyspaWYobltyXSE9PXNbcl0pcmV0dXJuITA7cmV0dXJuITF9cHJlcGFyZUdlb21ldHJ5KCl7Y29uc3QgdD10aGlzLmdlb21ldHJ5LGU9dC5hdHRyaWJ1dGVzLG49WmwoKTtpZihuKWZvcihjb25zdCBzIGluIGUpe2NvbnN0IHI9ZVtzXTtpZihyLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpdGhyb3cgbmV3IEVycm9yKCJCcnVzaDogSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkLiIpO3IuYXJyYXk9WjAoci5hcnJheSl9aWYodC5ib3VuZHNUcmVlfHwoVzAodCx7dXNlU2hhcmVkQXJyYXlCdWZmZXI6bn0pLHQuYm91bmRzVHJlZT1uZXcgeGEodCx7bWF4TGVhZlRyaXM6MyxpbmRpcmVjdDohMCx1c2VTaGFyZWRBcnJheUJ1ZmZlcjpufSkpLHQuaGFsZkVkZ2VzfHwodC5oYWxmRWRnZXM9bmV3IHNwKHQpKSwhdC5ncm91cEluZGljZXMpe2NvbnN0IHM9d2EodCkscj1uZXcgVWludDE2QXJyYXkocyksbz10Lmdyb3Vwcztmb3IobGV0IGE9MCxjPW8ubGVuZ3RoO2E8YzthKyspe2NvbnN0e3N0YXJ0OmwsY291bnQ6aH09b1thXTtmb3IobGV0IHU9bC8zLGY9KGwraCkvMzt1PGY7dSsrKXJbdV09YX10Lmdyb3VwSW5kaWNlcz1yfX1kaXNwb3NlQ2FjaGVEYXRhKCl7Y29uc3R7Z2VvbWV0cnk6dH09dGhpczt0LmhhbGZFZGdlcz1udWxsLHQuYm91bmRzVHJlZT1udWxsLHQuZ3JvdXBJbmRpY2VzPW51bGx9fWNvbnN0IHJwPTFlLTE0LHZhPW5ldyBQLFlsPW5ldyBQLGpsPW5ldyBQO2Z1bmN0aW9uIGhuKGksdD1ycCl7dmEuc3ViVmVjdG9ycyhpLmIsaS5hKSxZbC5zdWJWZWN0b3JzKGkuYyxpLmEpLGpsLnN1YlZlY3RvcnMoaS5iLGkuYyk7Y29uc3QgZT12YS5hbmdsZVRvKFlsKSxuPXZhLmFuZ2xlVG8oamwpLHM9TWF0aC5QSS1lLW47cmV0dXJuIE1hdGguYWJzKGUpPHR8fE1hdGguYWJzKG4pPHR8fE1hdGguYWJzKHMpPHR8fGkuYS5kaXN0YW5jZVRvU3F1YXJlZChpLmIpPHR8fGkuYS5kaXN0YW5jZVRvU3F1YXJlZChpLmMpPHR8fGkuYi5kaXN0YW5jZVRvU3F1YXJlZChpLmMpPHR9Y29uc3QgX2E9MWUtMTAsSGk9MWUtMTAsb3A9MWUtMTAsJGU9bmV3IHJlLGR0PW5ldyByZSxWZT1uZXcgUCx6YT1uZXcgUCxRbD1uZXcgUCxycj1uZXcgUm8sVGE9bmV3IGFlO2NsYXNzIGFwe2NvbnN0cnVjdG9yKCl7dGhpcy5fcG9vbD1bXSx0aGlzLl9pbmRleD0wfWdldFRyaWFuZ2xlKCl7cmV0dXJuIHRoaXMuX2luZGV4Pj10aGlzLl9wb29sLmxlbmd0aCYmdGhpcy5fcG9vbC5wdXNoKG5ldyBldCksdGhpcy5fcG9vbFt0aGlzLl9pbmRleCsrXX1jbGVhcigpe3RoaXMuX2luZGV4PTB9cmVzZXQoKXt0aGlzLl9wb29sLmxlbmd0aD0wLHRoaXMuX2luZGV4PTB9fWNsYXNzIGNwe2NvbnN0cnVjdG9yKCl7dGhpcy50cmlhbmdsZVBvb2w9bmV3IGFwLHRoaXMudHJpYW5nbGVzPVtdLHRoaXMubm9ybWFsPW5ldyBQLHRoaXMuY29wbGFuYXJUcmlhbmdsZVVzZWQ9ITF9aW5pdGlhbGl6ZSh0KXt0aGlzLnJlc2V0KCk7Y29uc3R7dHJpYW5nbGVzOmUsdHJpYW5nbGVQb29sOm4sbm9ybWFsOnN9PXRoaXM7aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IobGV0IHI9MCxvPXQubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9dFtyXTtpZihyPT09MClhLmdldE5vcm1hbChzKTtlbHNlIGlmKE1hdGguYWJzKDEtYS5nZXROb3JtYWwoVmUpLmRvdChzKSk+X2EpdGhyb3cgbmV3IEVycm9yKCJUcmlhbmdsZSBTcGxpdHRlcjogQ2Fubm90IGluaXRpYWxpemUgd2l0aCB0cmlhbmdsZXMgdGhhdCBoYXZlIGRpZmZlcmVudCBub3JtYWxzLiIpO2NvbnN0IGM9bi5nZXRUcmlhbmdsZSgpO2MuY29weShhKSxlLnB1c2goYyl9ZWxzZXt0LmdldE5vcm1hbChzKTtjb25zdCByPW4uZ2V0VHJpYW5nbGUoKTtyLmNvcHkodCksZS5wdXNoKHIpfX1zcGxpdEJ5VHJpYW5nbGUodCl7Y29uc3R7bm9ybWFsOmUsdHJpYW5nbGVzOm59PXRoaXM7aWYodC5nZXROb3JtYWwoemEpLm5vcm1hbGl6ZSgpLE1hdGguYWJzKDEtTWF0aC5hYnMoemEuZG90KGUpKSk8b3Ape3RoaXMuY29wbGFuYXJUcmlhbmdsZVVzZWQ9ITA7Zm9yKGxldCByPTAsbz1uLmxlbmd0aDtyPG87cisrKXtjb25zdCBhPW5bcl07YS5jb3BsYW5hckNvdW50PTB9Y29uc3Qgcz1bdC5hLHQuYix0LmNdO2ZvcihsZXQgcj0wO3I8MztyKyspe2NvbnN0IG89KHIrMSklMyxhPXNbcl0sYz1zW29dO1ZlLnN1YlZlY3RvcnMoYyxhKS5ub3JtYWxpemUoKSxRbC5jcm9zc1ZlY3RvcnMoemEsVmUpLHJyLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KFFsLGEpLHRoaXMuc3BsaXRCeVBsYW5lKHJyLHQpfX1lbHNlIHQuZ2V0UGxhbmUocnIpLHRoaXMuc3BsaXRCeVBsYW5lKHJyLHQpfXNwbGl0QnlQbGFuZSh0LGUpe2NvbnN0e3RyaWFuZ2xlczpuLHRyaWFuZ2xlUG9vbDpzfT10aGlzO1RhLmNvcHkoZSksVGEubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCByPTAsbz1uLmxlbmd0aDtyPG87cisrKXtjb25zdCBhPW5bcl07aWYoIVRhLmludGVyc2VjdHNUcmlhbmdsZShhLCRlLCEwKSljb250aW51ZTtjb25zdHthOmMsYjpsLGM6aH09YTtsZXQgdT0wLGY9LTEsZD0hMSxwPVtdLHk9W107Y29uc3QgZz1bYyxsLGhdO2ZvcihsZXQgdz0wO3c8Mzt3Kyspe2NvbnN0IGI9KHcrMSklMzskZS5zdGFydC5jb3B5KGdbd10pLCRlLmVuZC5jb3B5KGdbYl0pO2NvbnN0IHg9dC5kaXN0YW5jZVRvUG9pbnQoJGUuc3RhcnQpLG09dC5kaXN0YW5jZVRvUG9pbnQoJGUuZW5kKTtpZihNYXRoLmFicyh4KTxIaSYmTWF0aC5hYnMobSk8SGkpe2Q9ITA7YnJlYWt9aWYoeD4wP3AucHVzaCh3KTp5LnB1c2godyksTWF0aC5hYnMoeCk8SGkpY29udGludWU7bGV0IE09ISF0LmludGVyc2VjdExpbmUoJGUsVmUpOyFNJiZNYXRoLmFicyhtKTxIaSYmKFZlLmNvcHkoJGUuZW5kKSxNPSEwKSxNJiYhKFZlLmRpc3RhbmNlVG8oJGUuc3RhcnQpPF9hKSYmKFZlLmRpc3RhbmNlVG8oJGUuZW5kKTxfYSYmKGY9dyksdT09PTA/ZHQuc3RhcnQuY29weShWZSk6ZHQuZW5kLmNvcHkoVmUpLHUrKyl9aWYoIWQmJnU9PT0yJiZkdC5kaXN0YW5jZSgpPkhpKWlmKGYhPT0tMSl7Zj0oZisxKSUzO2xldCB3PTA7dz09PWYmJih3PSh3KzEpJTMpO2xldCBiPXcrMTtiPT09ZiYmKGI9KGIrMSklMyk7Y29uc3QgeD1zLmdldFRyaWFuZ2xlKCk7eC5hLmNvcHkoZ1tiXSkseC5iLmNvcHkoZHQuZW5kKSx4LmMuY29weShkdC5zdGFydCksaG4oeCl8fG4ucHVzaCh4KSxhLmEuY29weShnW3ddKSxhLmIuY29weShkdC5zdGFydCksYS5jLmNvcHkoZHQuZW5kKSxobihhKSYmKG4uc3BsaWNlKHIsMSksci0tLG8tLSl9ZWxzZXtjb25zdCB3PXAubGVuZ3RoPj0yP3lbMF06cFswXTtpZih3PT09MCl7bGV0IFM9ZHQuc3RhcnQ7ZHQuc3RhcnQ9ZHQuZW5kLGR0LmVuZD1TfWNvbnN0IGI9KHcrMSklMyx4PSh3KzIpJTMsbT1zLmdldFRyaWFuZ2xlKCksTT1zLmdldFRyaWFuZ2xlKCk7Z1tiXS5kaXN0YW5jZVRvU3F1YXJlZChkdC5zdGFydCk8Z1t4XS5kaXN0YW5jZVRvU3F1YXJlZChkdC5lbmQpPyhtLmEuY29weShnW2JdKSxtLmIuY29weShkdC5zdGFydCksbS5jLmNvcHkoZHQuZW5kKSxNLmEuY29weShnW2JdKSxNLmIuY29weShnW3hdKSxNLmMuY29weShkdC5zdGFydCkpOihtLmEuY29weShnW3hdKSxtLmIuY29weShkdC5zdGFydCksbS5jLmNvcHkoZHQuZW5kKSxNLmEuY29weShnW2JdKSxNLmIuY29weShnW3hdKSxNLmMuY29weShkdC5lbmQpKSxhLmEuY29weShnW3ddKSxhLmIuY29weShkdC5lbmQpLGEuYy5jb3B5KGR0LnN0YXJ0KSxobihtKXx8bi5wdXNoKG0pLGhuKE0pfHxuLnB1c2goTSksaG4oYSkmJihuLnNwbGljZShyLDEpLHItLSxvLS0pfWVsc2UgdT09PTMmJmNvbnNvbGUud2FybigiVHJpYW5nbGVDbGlwcGVyOiBDb3BsYW5hciBjbGlwIG5vdCBoYW5kbGVkIil9fXJlc2V0KCl7dGhpcy50cmlhbmdsZXMubGVuZ3RoPTAsdGhpcy50cmlhbmdsZVBvb2wuY2xlYXIoKSx0aGlzLmNvcGxhbmFyVHJpYW5nbGVVc2VkPSExfX1mdW5jdGlvbiBscChpKXtyZXR1cm4gaT1+fmksaSs0LWklNH1jbGFzcyBLbHtjb25zdHJ1Y3Rvcih0LGU9NTAwKXt0aGlzLmV4cGFuc2lvbkZhY3Rvcj0xLjUsdGhpcy50eXBlPXQsdGhpcy5sZW5ndGg9MCx0aGlzLmFycmF5PW51bGwsdGhpcy5zZXRTaXplKGUpfXNldFR5cGUodCl7aWYodGhpcy5sZW5ndGghPT0wKXRocm93IG5ldyBFcnJvcigiVHlwZUJhY2tlZEFycmF5OiBDYW5ub3QgY2hhbmdlIHRoZSB0eXBlIHdoaWxlIHRoZXJlIGlzIHVzZWQgZGF0YSBpbiB0aGUgYnVmZmVyLiIpO2NvbnN0IGU9dGhpcy5hcnJheS5idWZmZXI7dGhpcy5hcnJheT1uZXcgdChlKSx0aGlzLnR5cGU9dH1zZXRTaXplKHQpe2lmKHRoaXMuYXJyYXkmJnQ9PT10aGlzLmFycmF5Lmxlbmd0aClyZXR1cm47Y29uc3QgZT10aGlzLnR5cGUsbj1abCgpP1NoYXJlZEFycmF5QnVmZmVyOkFycmF5QnVmZmVyLHM9bmV3IGUobmV3IG4obHAodCplLkJZVEVTX1BFUl9FTEVNRU5UKSkpO3RoaXMuYXJyYXkmJnMuc2V0KHRoaXMuYXJyYXksMCksdGhpcy5hcnJheT1zfWV4cGFuZCgpe2NvbnN0e2FycmF5OnQsZXhwYW5zaW9uRmFjdG9yOmV9PXRoaXM7dGhpcy5zZXRTaXplKHQubGVuZ3RoKmUpfXB1c2goLi4udCl7bGV0e2FycmF5OmUsbGVuZ3RoOm59PXRoaXM7bit0Lmxlbmd0aD5lLmxlbmd0aCYmKHRoaXMuZXhwYW5kKCksZT10aGlzLmFycmF5KTtmb3IobGV0IHM9MCxyPXQubGVuZ3RoO3M8cjtzKyspZVtuK3NdPXRbc107dGhpcy5sZW5ndGgrPXQubGVuZ3RofWNsZWFyKCl7dGhpcy5sZW5ndGg9MH19Y2xhc3MgaHB7Y29uc3RydWN0b3IoKXt0aGlzLmdyb3VwQXR0cmlidXRlcz1be31dLHRoaXMuZ3JvdXBDb3VudD0wfWdldFR5cGUodCl7cmV0dXJuIHRoaXMuZ3JvdXBBdHRyaWJ1dGVzWzBdW3RdLnR5cGV9Z2V0SXRlbVNpemUodCl7cmV0dXJuIHRoaXMuZ3JvdXBBdHRyaWJ1dGVzWzBdW3RdLml0ZW1TaXplfWdldE5vcm1hbGl6ZWQodCl7cmV0dXJuIHRoaXMuZ3JvdXBBdHRyaWJ1dGVzWzBdW3RdLm5vcm1hbGl6ZWR9Z2V0Q291bnQodCl7aWYodGhpcy5ncm91cENvdW50PD10KXJldHVybiAwO2NvbnN0IGU9dGhpcy5nZXRHcm91cEF0dHJBcnJheSgicG9zaXRpb24iLHQpO3JldHVybiBlLmxlbmd0aC9lLml0ZW1TaXplfWdldFRvdGFsTGVuZ3RoKHQpe2NvbnN0e2dyb3VwQ291bnQ6ZSxncm91cEF0dHJpYnV0ZXM6bn09dGhpcztsZXQgcz0wO2ZvcihsZXQgcj0wO3I8ZTtyKyspe2NvbnN0IG89bltyXTtzKz1vW3RdLmxlbmd0aH1yZXR1cm4gc31nZXRHcm91cEF0dHJTZXQodD0wKXtjb25zdHtncm91cEF0dHJpYnV0ZXM6ZX09dGhpcztpZihlW3RdKXJldHVybiB0aGlzLmdyb3VwQ291bnQ9TWF0aC5tYXgodGhpcy5ncm91cENvdW50LHQrMSksZVt0XTtjb25zdCBuPWVbMF07Zm9yKHRoaXMuZ3JvdXBDb3VudD1NYXRoLm1heCh0aGlzLmdyb3VwQ291bnQsdCsxKTt0Pj1lLmxlbmd0aDspe2NvbnN0IHM9e307ZS5wdXNoKHMpO2Zvcihjb25zdCByIGluIG4pe2NvbnN0IG89bltyXSxhPW5ldyBLbChvLnR5cGUpO2EuaXRlbVNpemU9by5pdGVtU2l6ZSxhLm5vcm1hbGl6ZWQ9by5ub3JtYWxpemVkLHNbcl09YX19cmV0dXJuIGVbdF19Z2V0R3JvdXBBdHRyQXJyYXkodCxlPTApe2NvbnN0e2dyb3VwQXR0cmlidXRlczpufT10aGlzO2lmKCFuWzBdW3RdKXRocm93IG5ldyBFcnJvcihgVHlwZWRBdHRyaWJ1dGVEYXRhOiBBdHRyaWJ1dGUgd2l0aCAiJHt0fSIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkYCk7cmV0dXJuIHRoaXMuZ2V0R3JvdXBBdHRyU2V0KGUpW3RdfWluaXRpYWxpemVBcnJheSh0LGUsbixzKXtjb25zdHtncm91cEF0dHJpYnV0ZXM6cn09dGhpcyxhPXJbMF1bdF07aWYoYSl7aWYoYS50eXBlIT09ZSlmb3IobGV0IGM9MCxsPXIubGVuZ3RoO2M8bDtjKyspe2NvbnN0IGg9cltjXVt0XTtoLnNldFR5cGUoZSksaC5pdGVtU2l6ZT1uLGgubm9ybWFsaXplZD1zfX1lbHNlIGZvcihsZXQgYz0wLGw9ci5sZW5ndGg7YzxsO2MrKyl7Y29uc3QgaD1uZXcgS2woZSk7aC5pdGVtU2l6ZT1uLGgubm9ybWFsaXplZD1zLHJbY11bdF09aH19Y2xlYXIoKXt0aGlzLmdyb3VwQ291bnQ9MDtjb25zdHtncm91cEF0dHJpYnV0ZXM6dH09dGhpczt0LmZvckVhY2goZT0+e2Zvcihjb25zdCBuIGluIGUpZVtuXS5jbGVhcigpfSl9ZGVsZXRlKHQpe3RoaXMuZ3JvdXBBdHRyaWJ1dGVzLmZvckVhY2goZT0+e2RlbGV0ZSBlW3RdfSl9cmVzZXQoKXt0aGlzLmdyb3VwQXR0cmlidXRlcz1bXSx0aGlzLmdyb3VwQ291bnQ9MH19Y2xhc3MgdGh7Y29uc3RydWN0b3IoKXt0aGlzLmludGVyc2VjdGlvblNldD17fSx0aGlzLmlkcz1bXX1hZGQodCxlKXtjb25zdHtpbnRlcnNlY3Rpb25TZXQ6bixpZHM6c309dGhpcztuW3RdfHwoblt0XT1bXSxzLnB1c2godCkpLG5bdF0ucHVzaChlKX19Y29uc3QgdXA9MCxmcD0xLGRwPTIsZWg9MyxwcD00LG5oPTUsaWg9NixoZT1uZXcgU28sc2g9bmV3IHN0LEx0PW5ldyBldCxVZT1uZXcgUCxyaD1uZXcgaWUsb2g9bmV3IGllLGFoPW5ldyBpZSxQYT1uZXcgaWUsb3I9bmV3IGllLGFyPW5ldyBpZSxjaD1uZXcgcmUsQ2E9bmV3IFAsRWE9MWUtOCx5cD0xZS0xNSxUbj0tMSxQbj0xLGNyPS0yLGxyPTIsSmk9MCxDbj0xLEJhPTIsbXA9MWUtMTQ7bGV0IGhyPW51bGw7ZnVuY3Rpb24gbGgoaSl7aHI9aX1mdW5jdGlvbiBoaChpLHQpe2kuZ2V0TWlkcG9pbnQoaGUub3JpZ2luKSxpLmdldE5vcm1hbChoZS5kaXJlY3Rpb24pO2NvbnN0IGU9dC5yYXljYXN0Rmlyc3QoaGUsMik7cmV0dXJuISEoZSYmaGUuZGlyZWN0aW9uLmRvdChlLmZhY2Uubm9ybWFsKT4wKT9UbjpQbn1mdW5jdGlvbiBncChpLHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gTWF0aC5yYW5kb20oKS0uNX1pLmdldE5vcm1hbChDYSksaGUuZGlyZWN0aW9uLmNvcHkoQ2EpLGkuZ2V0TWlkcG9pbnQoaGUub3JpZ2luKTtjb25zdCBuPTM7bGV0IHM9MCxyPTEvMDtmb3IobGV0IG89MDtvPG47bysrKXtoZS5kaXJlY3Rpb24ueCs9ZSgpKkVhLGhlLmRpcmVjdGlvbi55Kz1lKCkqRWEsaGUuZGlyZWN0aW9uLnorPWUoKSpFYSxoZS5kaXJlY3Rpb24ubXVsdGlwbHlTY2FsYXIoLTEpO2NvbnN0IGE9dC5yYXljYXN0Rmlyc3QoaGUsMik7aWYoISEoYSYmaGUuZGlyZWN0aW9uLmRvdChhLmZhY2Uubm9ybWFsKT4wKSYmcysrLGEhPT1udWxsJiYocj1NYXRoLm1pbihyLGEuZGlzdGFuY2UpKSxyPD15cClyZXR1cm4gYS5mYWNlLm5vcm1hbC5kb3QoQ2EpPjA/bHI6Y3I7aWYocy9uPi41fHwoby1zKzEpL24+LjUpYnJlYWt9cmV0dXJuIHMvbj4uNT9UbjpQbn1mdW5jdGlvbiB4cChpLHQpe2NvbnN0IGU9bmV3IHRoLG49bmV3IHRoO3JldHVybiBzaC5jb3B5KGkubWF0cml4V29ybGQpLmludmVydCgpLm11bHRpcGx5KHQubWF0cml4V29ybGQpLGkuZ2VvbWV0cnkuYm91bmRzVHJlZS5idmhjYXN0KHQuZ2VvbWV0cnkuYm91bmRzVHJlZSxzaCx7aW50ZXJzZWN0c1RyaWFuZ2xlcyhzLHIsbyxhKXtpZighaG4ocykmJiFobihyKSl7bGV0IGM9cy5pbnRlcnNlY3RzVHJpYW5nbGUocixjaCwhMCk7aWYoIWMpe2NvbnN0IGw9cy5wbGFuZSxoPXIucGxhbmUsdT1sLm5vcm1hbCxmPWgubm9ybWFsO3UuZG90KGYpPT09MSYmTWF0aC5hYnMobC5jb25zdGFudC1oLmNvbnN0YW50KTxtcCYmKGM9ITApfWlmKGMpe2xldCBsPWkuZ2VvbWV0cnkuYm91bmRzVHJlZS5yZXNvbHZlVHJpYW5nbGVJbmRleChvKSxoPXQuZ2VvbWV0cnkuYm91bmRzVHJlZS5yZXNvbHZlVHJpYW5nbGVJbmRleChhKTtlLmFkZChsLGgpLG4uYWRkKGgsbCksaHImJihoci5hZGRFZGdlKGNoKSxoci5hZGRJbnRlcnNlY3RpbmdUcmlhbmdsZXMobyxzLGEscikpfX1yZXR1cm4hMX19KSx7YUludGVyc2VjdGlvbnM6ZSxiSW50ZXJzZWN0aW9uczpufX1mdW5jdGlvbiB3cChpLHQsZSxuLHMscixvPSExKXtjb25zdCBhPWUuYXR0cmlidXRlcyxjPWUuaW5kZXgsbD1pKjMsaD1jLmdldFgobCswKSx1PWMuZ2V0WChsKzEpLGY9Yy5nZXRYKGwrMik7Zm9yKGNvbnN0IGQgaW4gcil7Y29uc3QgcD1hW2RdLHk9cltkXTtpZighKGQgaW4gYSkpdGhyb3cgbmV3IEVycm9yKGBDU0cgT3BlcmF0aW9uczogQXR0cmlidXRlICR7ZH0gbm90IGF2YWlsYWJsZSBvbiBnZW9tZXRyeS5gKTtjb25zdCBnPXAuaXRlbVNpemU7ZD09PSJwb3NpdGlvbiI/KEx0LmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLGgpLmFwcGx5TWF0cml4NChuKSxMdC5iLmZyb21CdWZmZXJBdHRyaWJ1dGUocCx1KS5hcHBseU1hdHJpeDQobiksTHQuYy5mcm9tQnVmZmVyQXR0cmlidXRlKHAsZikuYXBwbHlNYXRyaXg0KG4pLEZhKEx0LmEsTHQuYixMdC5jLHQsMyx5LG8pKTpkPT09Im5vcm1hbCI/KEx0LmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLGgpLmFwcGx5Tm9ybWFsTWF0cml4KHMpLEx0LmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLHUpLmFwcGx5Tm9ybWFsTWF0cml4KHMpLEx0LmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLGYpLmFwcGx5Tm9ybWFsTWF0cml4KHMpLG8mJihMdC5hLm11bHRpcGx5U2NhbGFyKC0xKSxMdC5iLm11bHRpcGx5U2NhbGFyKC0xKSxMdC5jLm11bHRpcGx5U2NhbGFyKC0xKSksRmEoTHQuYSxMdC5iLEx0LmMsdCwzLHksbywhMCkpOihyaC5mcm9tQnVmZmVyQXR0cmlidXRlKHAsaCksb2guZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLHUpLGFoLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxmKSxGYShyaCxvaCxhaCx0LGcseSxvKSl9fWZ1bmN0aW9uIGJwKGksdCxlLG4scyxyLG8sYT0hMSl7SWEoaSxuLHMscixvLGEpLElhKGE/ZTp0LG4scyxyLG8sYSksSWEoYT90OmUsbixzLHIsbyxhKX1mdW5jdGlvbiB1aChpLHQsZT0hMSl7c3dpdGNoKGkpe2Nhc2UgdXA6aWYodD09PVBufHx0PT09bHImJiFlKXJldHVybiBDbjticmVhaztjYXNlIGZwOmlmKGUpe2lmKHQ9PT1UbilyZXR1cm4gSml9ZWxzZSBpZih0PT09UG58fHQ9PT1jcilyZXR1cm4gQ247YnJlYWs7Y2FzZSBkcDppZihlKXtpZih0PT09UG58fHQ9PT1jcilyZXR1cm4gQ259ZWxzZSBpZih0PT09VG4pcmV0dXJuIEppO2JyZWFrO2Nhc2UgcHA6aWYodD09PVRuKXJldHVybiBKaTtpZih0PT09UG4pcmV0dXJuIENuO2JyZWFrO2Nhc2UgZWg6aWYodD09PVRufHx0PT09bHImJiFlKXJldHVybiBDbjticmVhaztjYXNlIG5oOmlmKCFlJiYodD09PVBufHx0PT09Y3IpKXJldHVybiBDbjticmVhaztjYXNlIGloOmlmKCFlJiYodD09PVRufHx0PT09bHIpKXJldHVybiBDbjticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIENTRyBvcGVyYXRpb24gZW51bSAiJHtpfSIuYCl9cmV0dXJuIEJhfWZ1bmN0aW9uIEZhKGksdCxlLG4scyxyLG89ITEsYT0hMSl7Y29uc3QgYz1sPT57ci5wdXNoKGwueCkscz4xJiZyLnB1c2gobC55KSxzPjImJnIucHVzaChsLnopLHM+MyYmci5wdXNoKGwudyl9O1BhLnNldCgwLDAsMCwwKS5hZGRTY2FsZWRWZWN0b3IoaSxuLmEueCkuYWRkU2NhbGVkVmVjdG9yKHQsbi5hLnkpLmFkZFNjYWxlZFZlY3RvcihlLG4uYS56KSxvci5zZXQoMCwwLDAsMCkuYWRkU2NhbGVkVmVjdG9yKGksbi5iLngpLmFkZFNjYWxlZFZlY3Rvcih0LG4uYi55KS5hZGRTY2FsZWRWZWN0b3IoZSxuLmIueiksYXIuc2V0KDAsMCwwLDApLmFkZFNjYWxlZFZlY3RvcihpLG4uYy54KS5hZGRTY2FsZWRWZWN0b3IodCxuLmMueSkuYWRkU2NhbGVkVmVjdG9yKGUsbi5jLnopLGEmJihQYS5ub3JtYWxpemUoKSxvci5ub3JtYWxpemUoKSxhci5ub3JtYWxpemUoKSksYyhQYSksbz8oYyhhciksYyhvcikpOihjKG9yKSxjKGFyKSl9ZnVuY3Rpb24gSWEoaSx0LGUsbixzLHI9ITEpe2Zvcihjb25zdCBvIGluIHMpe2NvbnN0IGE9dFtvXSxjPXNbb107aWYoIShvIGluIHQpKXRocm93IG5ldyBFcnJvcihgQ1NHIE9wZXJhdGlvbnM6IEF0dHJpYnV0ZSAke299IG5vIGF2YWlsYWJsZSBvbiBnZW9tZXRyeS5gKTtjb25zdCBsPWEuaXRlbVNpemU7bz09PSJwb3NpdGlvbiI/KFVlLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxpKS5hcHBseU1hdHJpeDQoZSksYy5wdXNoKFVlLngsVWUueSxVZS56KSk6bz09PSJub3JtYWwiPyhVZS5mcm9tQnVmZmVyQXR0cmlidXRlKGEsaSkuYXBwbHlOb3JtYWxNYXRyaXgobiksciYmVWUubXVsdGlwbHlTY2FsYXIoLTEpLGMucHVzaChVZS54LFVlLnksVWUueikpOihjLnB1c2goYS5nZXRYKGkpKSxsPjEmJmMucHVzaChhLmdldFkoaSkpLGw+MiYmYy5wdXNoKGEuZ2V0WihpKSksbD4zJiZjLnB1c2goYS5nZXRXKGkpKSl9fWNsYXNzIE1we2NvbnN0cnVjdG9yKHQpe3RoaXMudHJpYW5nbGU9bmV3IGV0KCkuY29weSh0KSx0aGlzLmludGVyc2VjdHM9e319YWRkVHJpYW5nbGUodCxlKXt0aGlzLmludGVyc2VjdHNbdF09bmV3IGV0KCkuY29weShlKX1nZXRJbnRlcnNlY3RBcnJheSgpe2NvbnN0IHQ9W10se2ludGVyc2VjdHM6ZX09dGhpcztmb3IoY29uc3QgbiBpbiBlKXQucHVzaChlW25dKTtyZXR1cm4gdH19Y2xhc3MgZmh7Y29uc3RydWN0b3IoKXt0aGlzLmRhdGE9e319YWRkVHJpYW5nbGVJbnRlcnNlY3Rpb24odCxlLG4scyl7Y29uc3R7ZGF0YTpyfT10aGlzO3JbdF18fChyW3RdPW5ldyBNcChlKSksclt0XS5hZGRUcmlhbmdsZShuLHMpfWdldFRyaWFuZ2xlc0FzQXJyYXkodD1udWxsKXtjb25zdHtkYXRhOmV9PXRoaXMsbj1bXTtpZih0IT09bnVsbCl0IGluIGUmJm4ucHVzaChlW3RdLnRyaWFuZ2xlKTtlbHNlIGZvcihjb25zdCBzIGluIGUpbi5wdXNoKGVbc10udHJpYW5nbGUpO3JldHVybiBufWdldFRyaWFuZ2xlSW5kaWNlcygpe3JldHVybiBPYmplY3Qua2V5cyh0aGlzLmRhdGEpLm1hcCh0PT5wYXJzZUludCh0KSl9Z2V0SW50ZXJzZWN0aW9uSW5kaWNlcyh0KXtjb25zdHtkYXRhOmV9PXRoaXM7cmV0dXJuIGVbdF0/T2JqZWN0LmtleXMoZVt0XS5pbnRlcnNlY3RzKS5tYXAobj0+cGFyc2VJbnQobikpOltdfWdldEludGVyc2VjdGlvbnNBc0FycmF5KHQ9bnVsbCxlPW51bGwpe2NvbnN0e2RhdGE6bn09dGhpcyxzPW5ldyBTZXQscj1bXSxvPWE9PntpZihuW2FdKWlmKGUhPT1udWxsKW5bYV0uaW50ZXJzZWN0c1tlXSYmci5wdXNoKG5bYV0uaW50ZXJzZWN0c1tlXSk7ZWxzZXtjb25zdCBjPW5bYV0uaW50ZXJzZWN0cztmb3IoY29uc3QgbCBpbiBjKXMuaGFzKGwpfHwocy5hZGQobCksci5wdXNoKGNbbF0pKX19O2lmKHQhPT1udWxsKW8odCk7ZWxzZSBmb3IoY29uc3QgYSBpbiBuKW8oYSk7cmV0dXJuIHJ9cmVzZXQoKXt0aGlzLmRhdGE9e319fWNsYXNzIEFwe2NvbnN0cnVjdG9yKCl7dGhpcy5lbmFibGVkPSExLHRoaXMudHJpYW5nbGVJbnRlcnNlY3RzQT1uZXcgZmgsdGhpcy50cmlhbmdsZUludGVyc2VjdHNCPW5ldyBmaCx0aGlzLmludGVyc2VjdGlvbkVkZ2VzPVtdfWFkZEludGVyc2VjdGluZ1RyaWFuZ2xlcyh0LGUsbixzKXtjb25zdHt0cmlhbmdsZUludGVyc2VjdHNBOnIsdHJpYW5nbGVJbnRlcnNlY3RzQjpvfT10aGlzO3IuYWRkVHJpYW5nbGVJbnRlcnNlY3Rpb24odCxlLG4scyksby5hZGRUcmlhbmdsZUludGVyc2VjdGlvbihuLHMsdCxlKX1hZGRFZGdlKHQpe3RoaXMuaW50ZXJzZWN0aW9uRWRnZXMucHVzaCh0LmNsb25lKCkpfXJlc2V0KCl7dGhpcy50cmlhbmdsZUludGVyc2VjdHNBLnJlc2V0KCksdGhpcy50cmlhbmdsZUludGVyc2VjdHNCLnJlc2V0KCksdGhpcy5pbnRlcnNlY3Rpb25FZGdlcz1bXX1pbml0KCl7dGhpcy5lbmFibGVkJiYodGhpcy5yZXNldCgpLGxoKHRoaXMpKX1jb21wbGV0ZSgpe3RoaXMuZW5hYmxlZCYmbGgobnVsbCl9fWNvbnN0IHVuPW5ldyBzdCx1cj1uZXcgTWUsRW49bmV3IGV0LGZyPW5ldyBldCxmbj1uZXcgZXQsZHI9bmV3IGV0LHhlPVtdLEJuPVtdO2Z1bmN0aW9uIFNwKGkpe2Zvcihjb25zdCB0IG9mIGkpcmV0dXJuIHR9ZnVuY3Rpb24gdnAoaSx0LGUsbixzLHI9e30pe2NvbnN0e3VzZUdyb3VwczpvPSEwfT1yLHthSW50ZXJzZWN0aW9uczphLGJJbnRlcnNlY3Rpb25zOmN9PXhwKGksdCksbD1bXTtsZXQgaD1udWxsLHU7cmV0dXJuIHU9bz8wOi0xLGRoKGksdCxhLGUsITEsbixzLHUpLHBoKGksdCxhLGUsITEscyx1KSxlLmZpbmRJbmRleChkPT5kIT09aWgmJmQhPT1uaCkhPT0tMSYmKHU9bz9pLmdlb21ldHJ5Lmdyb3Vwcy5sZW5ndGh8fDE6LTEsZGgodCxpLGMsZSwhMCxuLHMsdSkscGgodCxpLGMsZSwhMCxzLHUpKSx4ZS5sZW5ndGg9MCxCbi5sZW5ndGg9MCx7Z3JvdXBzOmwsbWF0ZXJpYWxzOmh9fWZ1bmN0aW9uIGRoKGksdCxlLG4scyxyLG8sYT0wKXtjb25zdCBjPWkubWF0cml4V29ybGQuZGV0ZXJtaW5hbnQoKTwwO3VuLmNvcHkodC5tYXRyaXhXb3JsZCkuaW52ZXJ0KCkubXVsdGlwbHkoaS5tYXRyaXhXb3JsZCksdXIuZ2V0Tm9ybWFsTWF0cml4KGkubWF0cml4V29ybGQpLm11bHRpcGx5U2NhbGFyKGM/LTE6MSk7Y29uc3QgbD1pLmdlb21ldHJ5Lmdyb3VwSW5kaWNlcyxoPWkuZ2VvbWV0cnkuaW5kZXgsdT1pLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24sZj10Lmdlb21ldHJ5LmJvdW5kc1RyZWUsZD10Lmdlb21ldHJ5LmluZGV4LHA9dC5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLHk9ZS5pZHMsZz1lLmludGVyc2VjdGlvblNldDtmb3IobGV0IHc9MCxiPXkubGVuZ3RoO3c8Yjt3Kyspe2NvbnN0IHg9eVt3XSxtPWE9PT0tMT8wOmxbeF0rYSxNPTMqeCxTPWguZ2V0WChNKzApLEE9aC5nZXRYKE0rMSksdj1oLmdldFgoTSsyKTtFbi5hLmZyb21CdWZmZXJBdHRyaWJ1dGUodSxTKS5hcHBseU1hdHJpeDQodW4pLEVuLmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh1LEEpLmFwcGx5TWF0cml4NCh1biksRW4uYy5mcm9tQnVmZmVyQXR0cmlidXRlKHUsdikuYXBwbHlNYXRyaXg0KHVuKSxyLnJlc2V0KCksci5pbml0aWFsaXplKEVuKTtjb25zdCBfPWdbeF07Zm9yKGxldCB6PTAsQz1fLmxlbmd0aDt6PEM7eisrKXtjb25zdCBFPTMqX1t6XSxGPWQuZ2V0WChFKzApLEI9ZC5nZXRYKEUrMSksST1kLmdldFgoRSsyKTtmci5hLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxGKSxmci5iLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxCKSxmci5jLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxJKSxyLnNwbGl0QnlUcmlhbmdsZShmcil9Y29uc3QgVD1yLnRyaWFuZ2xlcztmb3IobGV0IHo9MCxDPVQubGVuZ3RoO3o8Qzt6Kyspe2NvbnN0IEU9VFt6XSxGPXIuY29wbGFuYXJUcmlhbmdsZVVzZWQ/Z3AoRSxmKTpoaChFLGYpO3hlLmxlbmd0aD0wLEJuLmxlbmd0aD0wO2ZvcihsZXQgQj0wLEk9bi5sZW5ndGg7QjxJO0IrKyl7Y29uc3QgUj11aChuW0JdLEYscyk7UiE9PUJhJiYoQm4ucHVzaChSKSx4ZS5wdXNoKG9bQl0uZ2V0R3JvdXBBdHRyU2V0KG0pKSl9aWYoeGUubGVuZ3RoIT09MCl7RW4uZ2V0QmFyeWNvb3JkKEUuYSxkci5hKSxFbi5nZXRCYXJ5Y29vcmQoRS5iLGRyLmIpLEVuLmdldEJhcnljb29yZChFLmMsZHIuYyk7Zm9yKGxldCBCPTAsST14ZS5sZW5ndGg7QjxJO0IrKyl7Y29uc3QgUj14ZVtCXSxVPUJuW0JdPT09Smk7d3AoeCxkcixpLmdlb21ldHJ5LGkubWF0cml4V29ybGQsdXIsUixjIT09VSl9fX19cmV0dXJuIHkubGVuZ3RofWZ1bmN0aW9uIHBoKGksdCxlLG4scyxyLG89MCl7Y29uc3QgYT1pLm1hdHJpeFdvcmxkLmRldGVybWluYW50KCk8MDt1bi5jb3B5KHQubWF0cml4V29ybGQpLmludmVydCgpLm11bHRpcGx5KGkubWF0cml4V29ybGQpLHVyLmdldE5vcm1hbE1hdHJpeChpLm1hdHJpeFdvcmxkKS5tdWx0aXBseVNjYWxhcihhPy0xOjEpO2NvbnN0IGM9dC5nZW9tZXRyeS5ib3VuZHNUcmVlLGw9aS5nZW9tZXRyeS5ncm91cEluZGljZXMsaD1pLmdlb21ldHJ5LmluZGV4LHU9aS5nZW9tZXRyeS5hdHRyaWJ1dGVzLGY9dS5wb3NpdGlvbixkPVtdLHA9aS5nZW9tZXRyeS5oYWxmRWRnZXMseT1uZXcgU2V0LGc9d2EoaS5nZW9tZXRyeSk7Zm9yKGxldCB3PTAsYj1nO3c8Yjt3KyspdyBpbiBlLmludGVyc2VjdGlvblNldHx8eS5hZGQodyk7Zm9yKDt5LnNpemU+MDspe2NvbnN0IHc9U3AoeSk7eS5kZWxldGUodyksZC5wdXNoKHcpO2NvbnN0IGI9Myp3LHg9aC5nZXRYKGIrMCksbT1oLmdldFgoYisxKSxNPWguZ2V0WChiKzIpO2ZuLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLHgpLmFwcGx5TWF0cml4NCh1biksZm4uYi5mcm9tQnVmZmVyQXR0cmlidXRlKGYsbSkuYXBwbHlNYXRyaXg0KHVuKSxmbi5jLmZyb21CdWZmZXJBdHRyaWJ1dGUoZixNKS5hcHBseU1hdHJpeDQodW4pO2NvbnN0IFM9aGgoZm4sYyk7Qm4ubGVuZ3RoPTAseGUubGVuZ3RoPTA7Zm9yKGxldCBBPTAsdj1uLmxlbmd0aDtBPHY7QSsrKXtjb25zdCBfPXVoKG5bQV0sUyxzKTtfIT09QmEmJihCbi5wdXNoKF8pLHhlLnB1c2gocltBXSkpfWZvcig7ZC5sZW5ndGg+MDspe2NvbnN0IEE9ZC5wb3AoKTtmb3IobGV0IHY9MDt2PDM7disrKXtjb25zdCBfPXAuZ2V0U2libGluZ1RyaWFuZ2xlSW5kZXgoQSx2KTtfIT09LTEmJnkuaGFzKF8pJiYoZC5wdXNoKF8pLHkuZGVsZXRlKF8pKX1pZih4ZS5sZW5ndGghPT0wKXtjb25zdCB2PTMqQSxfPWguZ2V0WCh2KzApLFQ9aC5nZXRYKHYrMSksej1oLmdldFgodisyKSxDPW89PT0tMT8wOmxbQV0rbztpZihmbi5hLmZyb21CdWZmZXJBdHRyaWJ1dGUoZixfKSxmbi5iLmZyb21CdWZmZXJBdHRyaWJ1dGUoZixUKSxmbi5jLmZyb21CdWZmZXJBdHRyaWJ1dGUoZix6KSwhaG4oZm4pKWZvcihsZXQgRT0wLEY9eGUubGVuZ3RoO0U8RjtFKyspe2NvbnN0IEI9Qm5bRV0sST14ZVtFXS5nZXRHcm91cEF0dHJTZXQoQyksUj1CPT09Smk7YnAoXyxULHosdSxpLm1hdHJpeFdvcmxkLHVyLEksUiE9PWEpfX19fX1mdW5jdGlvbiBfcChpKXtmb3IobGV0IHQ9MDt0PGkubGVuZ3RoLTE7dCsrKXtjb25zdCBlPWlbdF0sbj1pW3QrMV07aWYoZS5tYXRlcmlhbEluZGV4PT09bi5tYXRlcmlhbEluZGV4KXtjb25zdCBzPWUuc3RhcnQscj1uLnN0YXJ0K24uY291bnQ7bi5zdGFydD1zLG4uY291bnQ9ci1zLGkuc3BsaWNlKHQsMSksdC0tfX19ZnVuY3Rpb24genAoaSx0LGUsbil7ZS5jbGVhcigpO2NvbnN0IHM9aS5hdHRyaWJ1dGVzO2ZvcihsZXQgcj0wLG89bi5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT1uW3JdLGM9c1thXTtlLmluaXRpYWxpemVBcnJheShhLGMuYXJyYXkuY29uc3RydWN0b3IsYy5pdGVtU2l6ZSxjLm5vcm1hbGl6ZWQpfWZvcihjb25zdCByIGluIGUuYXR0cmlidXRlcyluLmluY2x1ZGVzKHIpfHxlLmRlbGV0ZShyKTtmb3IoY29uc3QgciBpbiB0LmF0dHJpYnV0ZXMpbi5pbmNsdWRlcyhyKXx8KHQuZGVsZXRlQXR0cmlidXRlKHIpLHQuZGlzcG9zZSgpKX1mdW5jdGlvbiBUcChpLHQsZSl7bGV0IG49ITEscz0tMTtjb25zdCByPWkuYXR0cmlidXRlcyxvPXQuZ3JvdXBBdHRyaWJ1dGVzWzBdO2Zvcihjb25zdCBjIGluIG8pe2NvbnN0IGw9dC5nZXRUb3RhbExlbmd0aChjKSxoPXQuZ2V0VHlwZShjKSx1PXQuZ2V0SXRlbVNpemUoYyksZj10LmdldE5vcm1hbGl6ZWQoYyk7bGV0IGQ9cltjXTsoIWR8fGQuYXJyYXkubGVuZ3RoPGwpJiYoZD1uZXcgeHQobmV3IGgobCksdSxmKSxpLnNldEF0dHJpYnV0ZShjLGQpLG49ITApO2xldCBwPTA7Zm9yKGxldCB5PTAsZz1NYXRoLm1pbihlLmxlbmd0aCx0Lmdyb3VwQ291bnQpO3k8Zzt5Kyspe2NvbnN0IHc9ZVt5XS5pbmRleCx7YXJyYXk6Yix0eXBlOngsbGVuZ3RoOm19PXQuZ3JvdXBBdHRyaWJ1dGVzW3ddW2NdLE09bmV3IHgoYi5idWZmZXIsMCxtKTtkLmFycmF5LnNldChNLHApLHArPU0ubGVuZ3RofWQubmVlZHNVcGRhdGU9ITAscz1sL2QuaXRlbVNpemV9aWYoaS5pbmRleCl7Y29uc3QgYz1pLmluZGV4LmFycmF5O2lmKGMubGVuZ3RoPHMpaS5pbmRleD1udWxsLG49ITA7ZWxzZSBmb3IobGV0IGw9MCxoPWMubGVuZ3RoO2w8aDtsKyspY1tsXT1sfWxldCBhPTA7aS5jbGVhckdyb3VwcygpO2ZvcihsZXQgYz0wLGw9TWF0aC5taW4oZS5sZW5ndGgsdC5ncm91cENvdW50KTtjPGw7YysrKXtjb25zdHtpbmRleDpoLG1hdGVyaWFsSW5kZXg6dX09ZVtjXSxmPXQuZ2V0Q291bnQoaCk7ZiE9PTAmJihpLmFkZEdyb3VwKGEsZix1KSxhKz1mKX1pLnNldERyYXdSYW5nZSgwLHMpLGkuYm91bmRzVHJlZT1udWxsLG4mJmkuZGlzcG9zZSgpfWZ1bmN0aW9uIHloKGksdCl7bGV0IGU9dDtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KXx8KGU9W10saS5mb3JFYWNoKG49PntlW24ubWF0ZXJpYWxJbmRleF09dH0pKSxlfWNsYXNzIFBwe2NvbnN0cnVjdG9yKCl7dGhpcy50cmlhbmdsZVNwbGl0dGVyPW5ldyBjcCx0aGlzLmF0dHJpYnV0ZURhdGE9W10sdGhpcy5hdHRyaWJ1dGVzPVsicG9zaXRpb24iLCJ1diIsIm5vcm1hbCJdLHRoaXMudXNlR3JvdXBzPSEwLHRoaXMuY29uc29saWRhdGVHcm91cHM9ITAsdGhpcy5kZWJ1Zz1uZXcgQXB9Z2V0R3JvdXBSYW5nZXModCl7cmV0dXJuIXRoaXMudXNlR3JvdXBzfHx0Lmdyb3Vwcy5sZW5ndGg9PT0wP1t7c3RhcnQ6MCxjb3VudDoxLzAsbWF0ZXJpYWxJbmRleDowfV06dC5ncm91cHMubWFwKGU9PlV0KHt9LGUpKX1ldmFsdWF0ZSh0LGUsbixzPW5ldyBzcil7bGV0IHI9ITA7aWYoQXJyYXkuaXNBcnJheShuKXx8KG49W25dKSxBcnJheS5pc0FycmF5KHMpfHwocz1bc10scj0hMSkscy5sZW5ndGghPT1uLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkV2YWx1YXRvcjogb3BlcmF0aW9ucyBhbmQgdGFyZ2V0IGFycmF5IHBhc3NlZCBhcyBkaWZmZXJlbnQgc2l6ZXMuIik7dC5wcmVwYXJlR2VvbWV0cnkoKSxlLnByZXBhcmVHZW9tZXRyeSgpO2NvbnN0e3RyaWFuZ2xlU3BsaXR0ZXI6byxhdHRyaWJ1dGVEYXRhOmEsYXR0cmlidXRlczpjLHVzZUdyb3VwczpsLGNvbnNvbGlkYXRlR3JvdXBzOmgsZGVidWc6dX09dGhpcztmb3IoO2EubGVuZ3RoPHMubGVuZ3RoOylhLnB1c2gobmV3IGhwKTtzLmZvckVhY2goKHcsYik9Pnt6cCh0Lmdlb21ldHJ5LHcuZ2VvbWV0cnksYVtiXSxjKX0pLHUuaW5pdCgpLHZwKHQsZSxuLG8sYSx7dXNlR3JvdXBzOmx9KSx1LmNvbXBsZXRlKCk7Y29uc3QgZj10aGlzLmdldEdyb3VwUmFuZ2VzKHQuZ2VvbWV0cnkpLGQ9eWgoZix0Lm1hdGVyaWFsKSxwPXRoaXMuZ2V0R3JvdXBSYW5nZXMoZS5nZW9tZXRyeSkseT15aChwLGUubWF0ZXJpYWwpO3AuZm9yRWFjaCh3PT53Lm1hdGVyaWFsSW5kZXgrPWQubGVuZ3RoKTtsZXQgZz1bLi4uZiwuLi5wXS5tYXAoKHcsYik9PktlKFV0KHt9LHcpLHtpbmRleDpifSkpO2lmKGwpe2NvbnN0IHc9Wy4uLmQsLi4ueV07aCYmKGc9Zy5tYXAoeD0+e2NvbnN0IG09d1t4Lm1hdGVyaWFsSW5kZXhdO3JldHVybiB4Lm1hdGVyaWFsSW5kZXg9dy5pbmRleE9mKG0pLHh9KS5zb3J0KCh4LG0pPT54Lm1hdGVyaWFsSW5kZXgtbS5tYXRlcmlhbEluZGV4KSk7Y29uc3QgYj1bXTtmb3IobGV0IHg9MCxtPXcubGVuZ3RoO3g8bTt4Kyspe2xldCBNPSExO2ZvcihsZXQgUz0wLEE9Zy5sZW5ndGg7UzxBO1MrKyl7Y29uc3Qgdj1nW1NdO3YubWF0ZXJpYWxJbmRleD09PXgmJihNPSEwLHYubWF0ZXJpYWxJbmRleD1iLmxlbmd0aCl9TSYmYi5wdXNoKHdbeF0pfXMuZm9yRWFjaCh4PT57eC5tYXRlcmlhbD1ifSl9ZWxzZSBnPVt7c3RhcnQ6MCxjb3VudDoxLzAsaW5kZXg6MCxtYXRlcmlhbEluZGV4OjB9XSxzLmZvckVhY2godz0+e3cubWF0ZXJpYWw9ZFswXX0pO3JldHVybiBzLmZvckVhY2goKHcsYik9Pntjb25zdCB4PXcuZ2VvbWV0cnk7VHAoeCxhW2JdLGcpLGgmJl9wKHguZ3JvdXBzKX0pLHI/czpzWzBdfWV2YWx1YXRlSGllcmFyY2h5KHQsZT1uZXcgc3Ipe3QudXBkYXRlTWF0cml4V29ybGQoITApO2NvbnN0IG49KHIsbyk9Pntjb25zdCBhPXIuY2hpbGRyZW47Zm9yKGxldCBjPTAsbD1hLmxlbmd0aDtjPGw7YysrKXtjb25zdCBoPWFbY107aC5pc09wZXJhdGlvbkdyb3VwP24oaCxvKTpvKGgpfX0scz1yPT57Y29uc3Qgbz1yLmNoaWxkcmVuO2xldCBhPSExO2ZvcihsZXQgbD0wLGg9by5sZW5ndGg7bDxoO2wrKyl7Y29uc3QgdT1vW2xdO2E9cyh1KXx8YX1jb25zdCBjPXIuaXNEaXJ0eSgpO2lmKGMmJnIubWFya1VwZGF0ZWQoKSxhJiYhci5pc09wZXJhdGlvbkdyb3VwKXtsZXQgbDtyZXR1cm4gbihyLGg9PntsP2w9dGhpcy5ldmFsdWF0ZShsLGgsaC5vcGVyYXRpb24pOmw9dGhpcy5ldmFsdWF0ZShyLGgsaC5vcGVyYXRpb24pfSksci5fY2FjaGVkR2VvbWV0cnk9bC5nZW9tZXRyeSxyLl9jYWNoZWRNYXRlcmlhbHM9bC5tYXRlcmlhbCwhMH1lbHNlIHJldHVybiBhfHxjfTtyZXR1cm4gcyh0KSxlLmdlb21ldHJ5PXQuX2NhY2hlZEdlb21ldHJ5LGUubWF0ZXJpYWw9dC5fY2FjaGVkTWF0ZXJpYWxzLGV9cmVzZXQoKXt0aGlzLnRyaWFuZ2xlU3BsaXR0ZXIucmVzZXQoKX19ZnVuY3Rpb24gbWgoaSl7bGV0IHQsZSxuLHM9LTEscj0wO2ZvcihsZXQgbD0wO2w8aS5sZW5ndGg7KytsKXtjb25zdCBoPWlbbF07aWYodD09PXZvaWQgMCYmKHQ9aC5hcnJheS5jb25zdHJ1Y3RvciksdCE9PWguYXJyYXkuY29uc3RydWN0b3IpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUF0dHJpYnV0ZXMoKSBmYWlsZWQuIEJ1ZmZlckF0dHJpYnV0ZS5hcnJheSBtdXN0IGJlIG9mIGNvbnNpc3RlbnQgYXJyYXkgdHlwZXMgYWNyb3NzIG1hdGNoaW5nIGF0dHJpYnV0ZXMuIiksbnVsbDtpZihlPT09dm9pZCAwJiYoZT1oLml0ZW1TaXplKSxlIT09aC5pdGVtU2l6ZSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlQXR0cmlidXRlcygpIGZhaWxlZC4gQnVmZmVyQXR0cmlidXRlLml0ZW1TaXplIG11c3QgYmUgY29uc2lzdGVudCBhY3Jvc3MgbWF0Y2hpbmcgYXR0cmlidXRlcy4iKSxudWxsO2lmKG49PT12b2lkIDAmJihuPWgubm9ybWFsaXplZCksbiE9PWgubm9ybWFsaXplZClyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlQXR0cmlidXRlcygpIGZhaWxlZC4gQnVmZmVyQXR0cmlidXRlLm5vcm1hbGl6ZWQgbXVzdCBiZSBjb25zaXN0ZW50IGFjcm9zcyBtYXRjaGluZyBhdHRyaWJ1dGVzLiIpLG51bGw7aWYocz09PS0xJiYocz1oLmdwdVR5cGUpLHMhPT1oLmdwdVR5cGUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUF0dHJpYnV0ZXMoKSBmYWlsZWQuIEJ1ZmZlckF0dHJpYnV0ZS5ncHVUeXBlIG11c3QgYmUgY29uc2lzdGVudCBhY3Jvc3MgbWF0Y2hpbmcgYXR0cmlidXRlcy4iKSxudWxsO3IrPWguY291bnQqZX1jb25zdCBvPW5ldyB0KHIpLGE9bmV3IHh0KG8sZSxuKTtsZXQgYz0wO2ZvcihsZXQgbD0wO2w8aS5sZW5ndGg7KytsKXtjb25zdCBoPWlbbF07aWYoaC5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKXtjb25zdCB1PWMvZTtmb3IobGV0IGY9MCxkPWguY291bnQ7ZjxkO2YrKylmb3IobGV0IHA9MDtwPGU7cCsrKXtjb25zdCB5PWguZ2V0Q29tcG9uZW50KGYscCk7YS5zZXRDb21wb25lbnQoZit1LHAseSl9fWVsc2Ugby5zZXQoaC5hcnJheSxjKTtjKz1oLmNvdW50KmV9cmV0dXJuIHMhPT12b2lkIDAmJihhLmdwdVR5cGU9cyksYX1mdW5jdGlvbiBDcChpKXtpZihpLmdyb3Vwcy5sZW5ndGg9PT0wKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHMubWVyZ2VHcm91cHMoKTogTm8gZ3JvdXBzIGFyZSBkZWZpbmVkLiBOb3RoaW5nIHRvIG1lcmdlLiIpLGk7bGV0IHQ9aS5ncm91cHM7aWYodD10LnNvcnQoKG8sYSk9Pm8ubWF0ZXJpYWxJbmRleCE9PWEubWF0ZXJpYWxJbmRleD9vLm1hdGVyaWFsSW5kZXgtYS5tYXRlcmlhbEluZGV4Om8uc3RhcnQtYS5zdGFydCksaS5nZXRJbmRleCgpPT09bnVsbCl7Y29uc3Qgbz1pLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKSxhPVtdO2ZvcihsZXQgYz0wO2M8by5jb3VudDtjKz0zKWEucHVzaChjLGMrMSxjKzIpO2kuc2V0SW5kZXgoYSl9Y29uc3QgZT1pLmdldEluZGV4KCksbj1bXTtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7Y29uc3QgYT10W29dLGM9YS5zdGFydCxsPWMrYS5jb3VudDtmb3IobGV0IGg9YztoPGw7aCsrKW4ucHVzaChlLmdldFgoaCkpfWkuZGlzcG9zZSgpLGkuc2V0SW5kZXgobik7bGV0IHM9MDtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7Y29uc3QgYT10W29dO2Euc3RhcnQ9cyxzKz1hLmNvdW50fWxldCByPXRbMF07aS5ncm91cHM9W3JdO2ZvcihsZXQgbz0xO288dC5sZW5ndGg7bysrKXtjb25zdCBhPXRbb107ci5tYXRlcmlhbEluZGV4PT09YS5tYXRlcmlhbEluZGV4P3IuY291bnQrPWEuY291bnQ6KHI9YSxpLmdyb3Vwcy5wdXNoKHIpKX1yZXR1cm4gaX1mdW5jdGlvbiBnaChpLHQ9MCl7Y29uc3QgZT1pWzBdLmluZGV4IT09bnVsbCxuPW5ldyBTZXQoT2JqZWN0LmtleXMoaVswXS5hdHRyaWJ1dGVzKSkscz1uZXcgU2V0KE9iamVjdC5rZXlzKGlbMF0ubW9ycGhBdHRyaWJ1dGVzKSkscj17fSxvPXt9LGE9aVswXS5tb3JwaFRhcmdldHNSZWxhdGl2ZSxjPW5ldyBBZTtsZXQgbD0wO2ZvcihsZXQgaD0wO2g8aS5sZW5ndGg7KytoKXtjb25zdCB1PWlbaF07bGV0IGY9MDtpZihlIT09KHUuaW5kZXghPT1udWxsKSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIraCsiLiBBbGwgZ2VvbWV0cmllcyBtdXN0IGhhdmUgY29tcGF0aWJsZSBhdHRyaWJ1dGVzOyBtYWtlIHN1cmUgaW5kZXggYXR0cmlidXRlIGV4aXN0cyBhbW9uZyBhbGwgZ2VvbWV0cmllcywgb3IgaW4gbm9uZSBvZiB0aGVtLiIpLG51bGw7Zm9yKGNvbnN0IGQgaW4gdS5hdHRyaWJ1dGVzKXtpZighbi5oYXMoZCkpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2l0aCBnZW9tZXRyeSBhdCBpbmRleCAiK2grJy4gQWxsIGdlb21ldHJpZXMgbXVzdCBoYXZlIGNvbXBhdGlibGUgYXR0cmlidXRlczsgbWFrZSBzdXJlICInK2QrJyIgYXR0cmlidXRlIGV4aXN0cyBhbW9uZyBhbGwgZ2VvbWV0cmllcywgb3IgaW4gbm9uZSBvZiB0aGVtLicpLG51bGw7cltkXT09PXZvaWQgMCYmKHJbZF09W10pLHJbZF0ucHVzaCh1LmF0dHJpYnV0ZXNbZF0pLGYrK31pZihmIT09bi5zaXplKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdpdGggZ2VvbWV0cnkgYXQgaW5kZXggIitoKyIuIE1ha2Ugc3VyZSBhbGwgZ2VvbWV0cmllcyBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBhdHRyaWJ1dGVzLiIpLG51bGw7aWYoYSE9PXUubW9ycGhUYXJnZXRzUmVsYXRpdmUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2l0aCBnZW9tZXRyeSBhdCBpbmRleCAiK2grIi4gLm1vcnBoVGFyZ2V0c1JlbGF0aXZlIG11c3QgYmUgY29uc2lzdGVudCB0aHJvdWdob3V0IGFsbCBnZW9tZXRyaWVzLiIpLG51bGw7Zm9yKGNvbnN0IGQgaW4gdS5tb3JwaEF0dHJpYnV0ZXMpe2lmKCFzLmhhcyhkKSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIraCsiLiAgLm1vcnBoQXR0cmlidXRlcyBtdXN0IGJlIGNvbnNpc3RlbnQgdGhyb3VnaG91dCBhbGwgZ2VvbWV0cmllcy4iKSxudWxsO29bZF09PT12b2lkIDAmJihvW2RdPVtdKSxvW2RdLnB1c2godS5tb3JwaEF0dHJpYnV0ZXNbZF0pfWlmKHQpe2xldCBkO2lmKGUpZD11LmluZGV4LmNvdW50O2Vsc2UgaWYodS5hdHRyaWJ1dGVzLnBvc2l0aW9uIT09dm9pZCAwKWQ9dS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50O2Vsc2UgcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2l0aCBnZW9tZXRyeSBhdCBpbmRleCAiK2grIi4gVGhlIGdlb21ldHJ5IG11c3QgaGF2ZSBlaXRoZXIgYW4gaW5kZXggb3IgYSBwb3NpdGlvbiBhdHRyaWJ1dGUiKSxudWxsO2lmKHQ9PT0xKWMuYWRkR3JvdXAobCxkLGgpO2Vsc2UgaWYodD09PTImJnUuZ3JvdXBzLmxlbmd0aD4wKWZvcihsZXQgcCBvZiB1Lmdyb3Vwcyl7bGV0IHk9cC5tYXRlcmlhbEluZGV4O2MuYWRkR3JvdXAobCtwLnN0YXJ0LE1hdGgubWluKHAuY291bnQsZCkseSl9bCs9ZH19aWYoZSl7bGV0IGg9MDtjb25zdCB1PVtdO2ZvcihsZXQgZj0wO2Y8aS5sZW5ndGg7KytmKXtjb25zdCBkPWlbZl0uaW5kZXg7Zm9yKGxldCBwPTA7cDxkLmNvdW50OysrcCl1LnB1c2goZC5nZXRYKHApK2gpO2grPWlbZl0uYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudH1jLnNldEluZGV4KHUpfWZvcihjb25zdCBoIGluIHIpe2NvbnN0IHU9bWgocltoXSk7aWYoIXUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2hpbGUgdHJ5aW5nIHRvIG1lcmdlIHRoZSAiK2grIiBhdHRyaWJ1dGUuIiksbnVsbDtjLnNldEF0dHJpYnV0ZShoLHUpfWZvcihjb25zdCBoIGluIG8pe2NvbnN0IHU9b1toXVswXS5sZW5ndGg7aWYodT09PTApYnJlYWs7Yy5tb3JwaEF0dHJpYnV0ZXM9Yy5tb3JwaEF0dHJpYnV0ZXN8fHt9LGMubW9ycGhBdHRyaWJ1dGVzW2hdPVtdO2ZvcihsZXQgZj0wO2Y8dTsrK2Ype2NvbnN0IGQ9W107Zm9yKGxldCB5PTA7eTxvW2hdLmxlbmd0aDsrK3kpZC5wdXNoKG9baF1beV1bZl0pO2NvbnN0IHA9bWgoZCk7aWYoIXApcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2hpbGUgdHJ5aW5nIHRvIG1lcmdlIHRoZSAiK2grIiBtb3JwaEF0dHJpYnV0ZS4iKSxudWxsO2MubW9ycGhBdHRyaWJ1dGVzW2hdLnB1c2gocCl9fXJldHVybiB0PT09Mj9DcChjKTpjfWNsYXNzIEVwIGV4dGVuZHMgaWl7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0LGUpO2NvbnN0IG49bmV3IHNyKG5ldyBpaSh0LEtlKFV0KHt9LGUpLHtoYXNUb3A6ITAsaGFzU2lkZTohMCxoYXNCb3R0b206ITF9KSkpO24udXBkYXRlTWF0cml4V29ybGQoKTtjb25zdCBzPW5ldyBndCgpLnNldEZyb21PYmplY3Qobikscj1uZXcgUDtzLmdldFNpemUocik7Y29uc3Qgbz1uZXcgUChzLm1pbi54K3IueC8yLHMubWluLnkrci55LzIsMCk7bGV0IGE9ZS50b3BTZWdtZW50cyxjPWUuYm94MztpZihjKXtjPWMudW5pb24ocyk7Y29uc3Qgdz1uZXcgUDtjLmdldFNpemUodyk7Y29uc3QgYj1NYXRoLm1heChyLngvdy54LHIueS93LnkpO2E9TWF0aC5jZWlsKGUudG9wU2VnbWVudHMqYil9aWYoYTw0KXJldHVybiB0aGlzO2NvbnN0IGw9bmV3IFdvKHIueCxyLnksYSxhKSxoPW5ldyBzcihsKTtoLnBvc2l0aW9uLnNldChvLngsby55LG8ueiksaC51cGRhdGVNYXRyaXhXb3JsZCgpO2NvbnN0IGY9bmV3IFBwKCkuZXZhbHVhdGUoaCxuLGVoKSxkPWYuZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLHA9bmV3IFJlKGQuY291bnQqMiwyKTtmb3IobGV0IHc9MDt3PGQuY291bnQ7dysrKXtjb25zdCBiPWQuZ2V0Wih3KTtkLnNldFoodyxlLmRlcHRoK2IpfWlmKGMpe2NvbnN0IHc9Yy5taW4sYj1jLm1heCx4PW5ldyBQKCkuc3ViVmVjdG9ycyhiLHcpO2ZvcihsZXQgbT0wO208ZC5jb3VudDttKyspe2NvbnN0IE09ZC5nZXRYKG0pLFM9ZC5nZXRZKG0pLEE9KE0tdy54KS94Lngsdj0oUy13LnkpL3gueTtwLnNldFhZKG0sQSx2KX1mLmdlb21ldHJ5LnNldEF0dHJpYnV0ZSgidXYiLHApfWQubmVlZHNVcGRhdGU9ITA7Y29uc3QgeT1uZXcgaWkodCxLZShVdCh7fSxlKSx7aGFzVG9wOiExfSkpLGc9Z2goW2YuZ2VvbWV0cnkseV0sMik7dGhpcy5jb3B5KGcudG9Ob25JbmRleGVkKCkpfX12YXIgQnA9aT0+e2NvbnN0e3NwbGl0OnQsZGVwdGg6ZSxwb2ludHM6bixib3gzOnMsaGFzVG9wOnIsaGFzQm90dG9tOm8saGFzU2lkZTphLHNpZGVSZXBlYXQ6Yyx0b3BTZWdtZW50czpsfT1pLGg9bD9FcDppaSx1PW5ldyBoKG5ldyBmbChuKSx7ZGVwdGg6ZSxiZXZlbEVuYWJsZWQ6ITEsYm94MzpzLFVWR2VuZXJhdG9yOk5kKHtzcGxpdDp0LGJveDM6cyxzaWRlUmVwZWF0OmN9KSxoYXNUb3A6cixoYXNCb3R0b206byxoYXNTaWRlOmEsdG9wU2VnbWVudHM6bH0pO3JldHVybiBSZCgpLHV9O2Z1bmN0aW9uIHByKGksdCl7cmV0dXJuIGk9PW51bGx8fHQ9PW51bGw/TmFOOmk8dD8tMTppPnQ/MTppPj10PzA6TmFOfWZ1bmN0aW9uIEZwKGksdCl7cmV0dXJuIGk9PW51bGx8fHQ9PW51bGw/TmFOOnQ8aT8tMTp0Pmk/MTp0Pj1pPzA6TmFOfWZ1bmN0aW9uIHhoKGkpe2xldCB0LGUsbjtpLmxlbmd0aCE9PTI/KHQ9cHIsZT0oYSxjKT0+cHIoaShhKSxjKSxuPShhLGMpPT5pKGEpLWMpOih0PWk9PT1wcnx8aT09PUZwP2k6SXAsZT1pLG49aSk7ZnVuY3Rpb24gcyhhLGMsbD0wLGg9YS5sZW5ndGgpe2lmKGw8aCl7aWYodChjLGMpIT09MClyZXR1cm4gaDtkb3tjb25zdCB1PWwraD4+PjE7ZShhW3VdLGMpPDA/bD11KzE6aD11fXdoaWxlKGw8aCl9cmV0dXJuIGx9ZnVuY3Rpb24gcihhLGMsbD0wLGg9YS5sZW5ndGgpe2lmKGw8aCl7aWYodChjLGMpIT09MClyZXR1cm4gaDtkb3tjb25zdCB1PWwraD4+PjE7ZShhW3VdLGMpPD0wP2w9dSsxOmg9dX13aGlsZShsPGgpfXJldHVybiBsfWZ1bmN0aW9uIG8oYSxjLGw9MCxoPWEubGVuZ3RoKXtjb25zdCB1PXMoYSxjLGwsaC0xKTtyZXR1cm4gdT5sJiZuKGFbdS0xXSxjKT4tbihhW3VdLGMpP3UtMTp1fXJldHVybntsZWZ0OnMsY2VudGVyOm8scmlnaHQ6cn19ZnVuY3Rpb24gSXAoKXtyZXR1cm4gMH1mdW5jdGlvbiBrcChpKXtyZXR1cm4gaT09PW51bGw/TmFOOitpfWNvbnN0IE5wPXhoKHByKS5yaWdodDt4aChrcCkuY2VudGVyO2Z1bmN0aW9uIHlyKGksdCl7bGV0IGUsbjtpZih0PT09dm9pZCAwKWZvcihjb25zdCBzIG9mIGkpcyE9bnVsbCYmKGU9PT12b2lkIDA/cz49cyYmKGU9bj1zKTooZT5zJiYoZT1zKSxuPHMmJihuPXMpKSk7ZWxzZXtsZXQgcz0tMTtmb3IobGV0IHIgb2YgaSkocj10KHIsKytzLGkpKSE9bnVsbCYmKGU9PT12b2lkIDA/cj49ciYmKGU9bj1yKTooZT5yJiYoZT1yKSxuPHImJihuPXIpKSl9cmV0dXJuW2Usbl19Y2xhc3MgcWV7Y29uc3RydWN0b3IoKXt0aGlzLl9wYXJ0aWFscz1uZXcgRmxvYXQ2NEFycmF5KDMyKSx0aGlzLl9uPTB9YWRkKHQpe2NvbnN0IGU9dGhpcy5fcGFydGlhbHM7bGV0IG49MDtmb3IobGV0IHM9MDtzPHRoaXMuX24mJnM8MzI7cysrKXtjb25zdCByPWVbc10sbz10K3IsYT1NYXRoLmFicyh0KTxNYXRoLmFicyhyKT90LShvLXIpOnItKG8tdCk7YSYmKGVbbisrXT1hKSx0PW99cmV0dXJuIGVbbl09dCx0aGlzLl9uPW4rMSx0aGlzfXZhbHVlT2YoKXtjb25zdCB0PXRoaXMuX3BhcnRpYWxzO2xldCBlPXRoaXMuX24sbixzLHIsbz0wO2lmKGU+MCl7Zm9yKG89dFstLWVdO2U+MCYmKG49byxzPXRbLS1lXSxvPW4rcyxyPXMtKG8tbiksIXIpOyk7ZT4wJiYocjwwJiZ0W2UtMV08MHx8cj4wJiZ0W2UtMV0+MCkmJihzPXIqMixuPW8rcyxzPT1uLW8mJihvPW4pKX1yZXR1cm4gb319Y29uc3QgUnA9TWF0aC5zcXJ0KDUwKSxMcD1NYXRoLnNxcnQoMTApLE9wPU1hdGguc3FydCgyKTtmdW5jdGlvbiBtcihpLHQsZSl7Y29uc3Qgbj0odC1pKS9NYXRoLm1heCgwLGUpLHM9TWF0aC5mbG9vcihNYXRoLmxvZzEwKG4pKSxyPW4vTWF0aC5wb3coMTAscyksbz1yPj1ScD8xMDpyPj1McD81OnI+PU9wPzI6MTtsZXQgYSxjLGw7cmV0dXJuIHM8MD8obD1NYXRoLnBvdygxMCwtcykvbyxhPU1hdGgucm91bmQoaSpsKSxjPU1hdGgucm91bmQodCpsKSxhL2w8aSYmKythLGMvbD50JiYtLWMsbD0tbCk6KGw9TWF0aC5wb3coMTAscykqbyxhPU1hdGgucm91bmQoaS9sKSxjPU1hdGgucm91bmQodC9sKSxhKmw8aSYmKythLGMqbD50JiYtLWMpLGM8YSYmLjU8PWUmJmU8Mj9tcihpLHQsZSoyKTpbYSxjLGxdfWZ1bmN0aW9uIERwKGksdCxlKXtpZih0PSt0LGk9K2ksZT0rZSwhKGU+MCkpcmV0dXJuW107aWYoaT09PXQpcmV0dXJuW2ldO2NvbnN0IG49dDxpLFtzLHIsb109bj9tcih0LGksZSk6bXIoaSx0LGUpO2lmKCEocj49cykpcmV0dXJuW107Y29uc3QgYT1yLXMrMSxjPW5ldyBBcnJheShhKTtpZihuKWlmKG88MClmb3IobGV0IGw9MDtsPGE7KytsKWNbbF09KHItbCkvLW87ZWxzZSBmb3IobGV0IGw9MDtsPGE7KytsKWNbbF09KHItbCkqbztlbHNlIGlmKG88MClmb3IobGV0IGw9MDtsPGE7KytsKWNbbF09KHMrbCkvLW87ZWxzZSBmb3IobGV0IGw9MDtsPGE7KytsKWNbbF09KHMrbCkqbztyZXR1cm4gY31mdW5jdGlvbiBrYShpLHQsZSl7cmV0dXJuIHQ9K3QsaT0raSxlPStlLG1yKGksdCxlKVsyXX1mdW5jdGlvbiAkcChpLHQsZSl7dD0rdCxpPStpLGU9K2U7Y29uc3Qgbj10PGkscz1uP2thKHQsaSxlKTprYShpLHQsZSk7cmV0dXJuKG4/LTE6MSkqKHM8MD8xLy1zOnMpfWZ1bmN0aW9uIFZwKGksdCl7bGV0IGU9MCxuPTA7aWYodD09PXZvaWQgMClmb3IobGV0IHMgb2YgaSlzIT1udWxsJiYocz0rcyk+PXMmJigrK2Usbis9cyk7ZWxzZXtsZXQgcz0tMTtmb3IobGV0IHIgb2YgaSkocj10KHIsKytzLGkpKSE9bnVsbCYmKHI9K3IpPj1yJiYoKytlLG4rPXIpfWlmKGUpcmV0dXJuIG4vZX1mdW5jdGlvbipVcChpKXtmb3IoY29uc3QgdCBvZiBpKXlpZWxkKndmKHQpfWZ1bmN0aW9uIFlpKGkpe3JldHVybiBBcnJheS5mcm9tKFVwKGkpKX12YXIgUT0xZS02LGdyPTFlLTEyLEg9TWF0aC5QSSxxdD1ILzIseHI9SC80LFh0PUgqMix1dD0xODAvSCxYPUgvMTgwLHR0PU1hdGguYWJzLE5hPU1hdGguYXRhbix1ZT1NYXRoLmF0YW4yLEc9TWF0aC5jb3MscXA9TWF0aC5leHAsUmE9TWF0aC5oeXBvdCxYcD1NYXRoLmxvZyxxPU1hdGguc2luLFpwPU1hdGguc2lnbnx8ZnVuY3Rpb24oaSl7cmV0dXJuIGk+MD8xOmk8MD8tMTowfSxYZT1NYXRoLnNxcnQsR3A9TWF0aC50YW47ZnVuY3Rpb24gV3AoaSl7cmV0dXJuIGk+MT8wOmk8LTE/SDpNYXRoLmFjb3MoaSl9ZnVuY3Rpb24gWmUoaSl7cmV0dXJuIGk+MT9xdDppPC0xPy1xdDpNYXRoLmFzaW4oaSl9ZnVuY3Rpb24gd2goaSl7cmV0dXJuKGk9cShpLzIpKSppfWZ1bmN0aW9uIEV0KCl7fWZ1bmN0aW9uIHdyKGksdCl7aSYmTWguaGFzT3duUHJvcGVydHkoaS50eXBlKSYmTWhbaS50eXBlXShpLHQpfXZhciBiaD17RmVhdHVyZTpmdW5jdGlvbihpLHQpe3dyKGkuZ2VvbWV0cnksdCl9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuZmVhdHVyZXMsbj0tMSxzPWUubGVuZ3RoOysrbjxzOyl3cihlW25dLmdlb21ldHJ5LHQpfX0sTWg9e1NwaGVyZTpmdW5jdGlvbihpLHQpe3Quc3BoZXJlKCl9LFBvaW50OmZ1bmN0aW9uKGksdCl7aT1pLmNvb3JkaW5hdGVzLHQucG9pbnQoaVswXSxpWzFdLGlbMl0pfSxNdWx0aVBvaW50OmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuY29vcmRpbmF0ZXMsbj0tMSxzPWUubGVuZ3RoOysrbjxzOylpPWVbbl0sdC5wb2ludChpWzBdLGlbMV0saVsyXSl9LExpbmVTdHJpbmc6ZnVuY3Rpb24oaSx0KXtMYShpLmNvb3JkaW5hdGVzLHQsMCl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmNvb3JkaW5hdGVzLG49LTEscz1lLmxlbmd0aDsrK248czspTGEoZVtuXSx0LDApfSxQb2x5Z29uOmZ1bmN0aW9uKGksdCl7QWgoaS5jb29yZGluYXRlcyx0KX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuY29vcmRpbmF0ZXMsbj0tMSxzPWUubGVuZ3RoOysrbjxzOylBaChlW25dLHQpfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5nZW9tZXRyaWVzLG49LTEscz1lLmxlbmd0aDsrK248czspd3IoZVtuXSx0KX19O2Z1bmN0aW9uIExhKGksdCxlKXt2YXIgbj0tMSxzPWkubGVuZ3RoLWUscjtmb3IodC5saW5lU3RhcnQoKTsrK248czspcj1pW25dLHQucG9pbnQoclswXSxyWzFdLHJbMl0pO3QubGluZUVuZCgpfWZ1bmN0aW9uIEFoKGksdCl7dmFyIGU9LTEsbj1pLmxlbmd0aDtmb3IodC5wb2x5Z29uU3RhcnQoKTsrK2U8bjspTGEoaVtlXSx0LDEpO3QucG9seWdvbkVuZCgpfWZ1bmN0aW9uIGJyKGksdCl7aSYmYmguaGFzT3duUHJvcGVydHkoaS50eXBlKT9iaFtpLnR5cGVdKGksdCk6d3IoaSx0KX12YXIgTXI9bmV3IHFlLFNoPW5ldyBxZSx2aCxfaCxPYSxEYSwkYSxHZT17cG9pbnQ6RXQsbGluZVN0YXJ0OkV0LGxpbmVFbmQ6RXQscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7TXI9bmV3IHFlLEdlLmxpbmVTdGFydD1IcCxHZS5saW5lRW5kPUpwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIGk9K01yO1NoLmFkZChpPDA/WHQraTppKSx0aGlzLmxpbmVTdGFydD10aGlzLmxpbmVFbmQ9dGhpcy5wb2ludD1FdH0sc3BoZXJlOmZ1bmN0aW9uKCl7U2guYWRkKFh0KX19O2Z1bmN0aW9uIEhwKCl7R2UucG9pbnQ9WXB9ZnVuY3Rpb24gSnAoKXt6aCh2aCxfaCl9ZnVuY3Rpb24gWXAoaSx0KXtHZS5wb2ludD16aCx2aD1pLF9oPXQsaSo9WCx0Kj1YLE9hPWksRGE9Ryh0PXQvMit4ciksJGE9cSh0KX1mdW5jdGlvbiB6aChpLHQpe2kqPVgsdCo9WCx0PXQvMit4cjt2YXIgZT1pLU9hLG49ZT49MD8xOi0xLHM9biplLHI9Ryh0KSxvPXEodCksYT0kYSpvLGM9RGEqcithKkcocyksbD1hKm4qcShzKTtNci5hZGQodWUobCxjKSksT2E9aSxEYT1yLCRhPW99ZnVuY3Rpb24gQXIoaSl7cmV0dXJuW3VlKGlbMV0saVswXSksWmUoaVsyXSldfWZ1bmN0aW9uIEZuKGkpe3ZhciB0PWlbMF0sZT1pWzFdLG49RyhlKTtyZXR1cm5bbipHKHQpLG4qcSh0KSxxKGUpXX1mdW5jdGlvbiBTcihpLHQpe3JldHVybiBpWzBdKnRbMF0raVsxXSp0WzFdK2lbMl0qdFsyXX1mdW5jdGlvbiBmaShpLHQpe3JldHVybltpWzFdKnRbMl0taVsyXSp0WzFdLGlbMl0qdFswXS1pWzBdKnRbMl0saVswXSp0WzFdLWlbMV0qdFswXV19ZnVuY3Rpb24gVmEoaSx0KXtpWzBdKz10WzBdLGlbMV0rPXRbMV0saVsyXSs9dFsyXX1mdW5jdGlvbiB2cihpLHQpe3JldHVybltpWzBdKnQsaVsxXSp0LGlbMl0qdF19ZnVuY3Rpb24gX3IoaSl7dmFyIHQ9WGUoaVswXSppWzBdK2lbMV0qaVsxXStpWzJdKmlbMl0pO2lbMF0vPXQsaVsxXS89dCxpWzJdLz10fXZhciBvdCxadCxmdCxqdCxJbixUaCxQaCxkaSxqaSxkbixXZSxIZT17cG9pbnQ6VWEsbGluZVN0YXJ0OkVoLGxpbmVFbmQ6QmgscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7SGUucG9pbnQ9RmgsSGUubGluZVN0YXJ0PWpwLEhlLmxpbmVFbmQ9UXAsamk9bmV3IHFlLEdlLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7R2UucG9seWdvbkVuZCgpLEhlLnBvaW50PVVhLEhlLmxpbmVTdGFydD1FaCxIZS5saW5lRW5kPUJoLE1yPDA/KG90PS0oZnQ9MTgwKSxadD0tKGp0PTkwKSk6amk+UT9qdD05MDpqaTwtUSYmKFp0PS05MCksV2VbMF09b3QsV2VbMV09ZnR9LHNwaGVyZTpmdW5jdGlvbigpe290PS0oZnQ9MTgwKSxadD0tKGp0PTkwKX19O2Z1bmN0aW9uIFVhKGksdCl7ZG4ucHVzaChXZT1bb3Q9aSxmdD1pXSksdDxadCYmKFp0PXQpLHQ+anQmJihqdD10KX1mdW5jdGlvbiBDaChpLHQpe3ZhciBlPUZuKFtpKlgsdCpYXSk7aWYoZGkpe3ZhciBuPWZpKGRpLGUpLHM9W25bMV0sLW5bMF0sMF0scj1maShzLG4pO19yKHIpLHI9QXIocik7dmFyIG89aS1JbixhPW8+MD8xOi0xLGM9clswXSp1dCphLGwsaD10dChvKT4xODA7aF4oYSpJbjxjJiZjPGEqaSk/KGw9clsxXSp1dCxsPmp0JiYoanQ9bCkpOihjPShjKzM2MCklMzYwLTE4MCxoXihhKkluPGMmJmM8YSppKT8obD0tclsxXSp1dCxsPFp0JiYoWnQ9bCkpOih0PFp0JiYoWnQ9dCksdD5qdCYmKGp0PXQpKSksaD9pPEluP1F0KG90LGkpPlF0KG90LGZ0KSYmKGZ0PWkpOlF0KGksZnQpPlF0KG90LGZ0KSYmKG90PWkpOmZ0Pj1vdD8oaTxvdCYmKG90PWkpLGk+ZnQmJihmdD1pKSk6aT5Jbj9RdChvdCxpKT5RdChvdCxmdCkmJihmdD1pKTpRdChpLGZ0KT5RdChvdCxmdCkmJihvdD1pKX1lbHNlIGRuLnB1c2goV2U9W290PWksZnQ9aV0pO3Q8WnQmJihadD10KSx0Pmp0JiYoanQ9dCksZGk9ZSxJbj1pfWZ1bmN0aW9uIEVoKCl7SGUucG9pbnQ9Q2h9ZnVuY3Rpb24gQmgoKXtXZVswXT1vdCxXZVsxXT1mdCxIZS5wb2ludD1VYSxkaT1udWxsfWZ1bmN0aW9uIEZoKGksdCl7aWYoZGkpe3ZhciBlPWktSW47amkuYWRkKHR0KGUpPjE4MD9lKyhlPjA/MzYwOi0zNjApOmUpfWVsc2UgVGg9aSxQaD10O0dlLnBvaW50KGksdCksQ2goaSx0KX1mdW5jdGlvbiBqcCgpe0dlLmxpbmVTdGFydCgpfWZ1bmN0aW9uIFFwKCl7RmgoVGgsUGgpLEdlLmxpbmVFbmQoKSx0dChqaSk+USYmKG90PS0oZnQ9MTgwKSksV2VbMF09b3QsV2VbMV09ZnQsZGk9bnVsbH1mdW5jdGlvbiBRdChpLHQpe3JldHVybih0LT1pKTwwP3QrMzYwOnR9ZnVuY3Rpb24gS3AoaSx0KXtyZXR1cm4gaVswXS10WzBdfWZ1bmN0aW9uIEloKGksdCl7cmV0dXJuIGlbMF08PWlbMV0/aVswXTw9dCYmdDw9aVsxXTp0PGlbMF18fGlbMV08dH1mdW5jdGlvbiBraChpKXt2YXIgdCxlLG4scyxyLG8sYTtpZihqdD1mdD0tKG90PVp0PTEvMCksZG49W10sYnIoaSxIZSksZT1kbi5sZW5ndGgpe2Zvcihkbi5zb3J0KEtwKSx0PTEsbj1kblswXSxyPVtuXTt0PGU7Kyt0KXM9ZG5bdF0sSWgobixzWzBdKXx8SWgobixzWzFdKT8oUXQoblswXSxzWzFdKT5RdChuWzBdLG5bMV0pJiYoblsxXT1zWzFdKSxRdChzWzBdLG5bMV0pPlF0KG5bMF0sblsxXSkmJihuWzBdPXNbMF0pKTpyLnB1c2gobj1zKTtmb3Iobz0tMS8wLGU9ci5sZW5ndGgtMSx0PTAsbj1yW2VdO3Q8PWU7bj1zLCsrdClzPXJbdF0sKGE9UXQoblsxXSxzWzBdKSk+byYmKG89YSxvdD1zWzBdLGZ0PW5bMV0pfXJldHVybiBkbj1XZT1udWxsLG90PT09MS8wfHxadD09PTEvMD9bW05hTixOYU5dLFtOYU4sTmFOXV06W1tvdCxadF0sW2Z0LGp0XV19dmFyIFFpLHpyLFRyLFByLENyLEVyLEJyLEZyLHFhLFhhLFphLE5oLFJoLE90LER0LCR0LHdlPXtzcGhlcmU6RXQscG9pbnQ6R2EsbGluZVN0YXJ0OkxoLGxpbmVFbmQ6T2gscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7d2UubGluZVN0YXJ0PW55LHdlLmxpbmVFbmQ9aXl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt3ZS5saW5lU3RhcnQ9TGgsd2UubGluZUVuZD1PaH19O2Z1bmN0aW9uIEdhKGksdCl7aSo9WCx0Kj1YO3ZhciBlPUcodCk7S2koZSpHKGkpLGUqcShpKSxxKHQpKX1mdW5jdGlvbiBLaShpLHQsZSl7KytRaSxUcis9KGktVHIpL1FpLFByKz0odC1QcikvUWksQ3IrPShlLUNyKS9RaX1mdW5jdGlvbiBMaCgpe3dlLnBvaW50PXR5fWZ1bmN0aW9uIHR5KGksdCl7aSo9WCx0Kj1YO3ZhciBlPUcodCk7T3Q9ZSpHKGkpLER0PWUqcShpKSwkdD1xKHQpLHdlLnBvaW50PWV5LEtpKE90LER0LCR0KX1mdW5jdGlvbiBleShpLHQpe2kqPVgsdCo9WDt2YXIgZT1HKHQpLG49ZSpHKGkpLHM9ZSpxKGkpLHI9cSh0KSxvPXVlKFhlKChvPUR0KnItJHQqcykqbysobz0kdCpuLU90KnIpKm8rKG89T3Qqcy1EdCpuKSpvKSxPdCpuK0R0KnMrJHQqcik7enIrPW8sRXIrPW8qKE90KyhPdD1uKSksQnIrPW8qKER0KyhEdD1zKSksRnIrPW8qKCR0KygkdD1yKSksS2koT3QsRHQsJHQpfWZ1bmN0aW9uIE9oKCl7d2UucG9pbnQ9R2F9ZnVuY3Rpb24gbnkoKXt3ZS5wb2ludD1zeX1mdW5jdGlvbiBpeSgpe0RoKE5oLFJoKSx3ZS5wb2ludD1HYX1mdW5jdGlvbiBzeShpLHQpe05oPWksUmg9dCxpKj1YLHQqPVgsd2UucG9pbnQ9RGg7dmFyIGU9Ryh0KTtPdD1lKkcoaSksRHQ9ZSpxKGkpLCR0PXEodCksS2koT3QsRHQsJHQpfWZ1bmN0aW9uIERoKGksdCl7aSo9WCx0Kj1YO3ZhciBlPUcodCksbj1lKkcoaSkscz1lKnEoaSkscj1xKHQpLG89RHQqci0kdCpzLGE9JHQqbi1PdCpyLGM9T3Qqcy1EdCpuLGw9UmEobyxhLGMpLGg9WmUobCksdT1sJiYtaC9sO3FhLmFkZCh1Km8pLFhhLmFkZCh1KmEpLFphLmFkZCh1KmMpLHpyKz1oLEVyKz1oKihPdCsoT3Q9bikpLEJyKz1oKihEdCsoRHQ9cykpLEZyKz1oKigkdCsoJHQ9cikpLEtpKE90LER0LCR0KX1mdW5jdGlvbiAkaChpKXtRaT16cj1Ucj1Qcj1Dcj1Fcj1Ccj1Gcj0wLHFhPW5ldyBxZSxYYT1uZXcgcWUsWmE9bmV3IHFlLGJyKGksd2UpO3ZhciB0PStxYSxlPStYYSxuPStaYSxzPVJhKHQsZSxuKTtyZXR1cm4gczxnciYmKHQ9RXIsZT1CcixuPUZyLHpyPFEmJih0PVRyLGU9UHIsbj1Dcikscz1SYSh0LGUsbiksczxncik/W05hTixOYU5dOlt1ZShlLHQpKnV0LFplKG4vcykqdXRdfWZ1bmN0aW9uIFdhKGksdCl7ZnVuY3Rpb24gZShuLHMpe3JldHVybiBuPWkobixzKSx0KG5bMF0sblsxXSl9cmV0dXJuIGkuaW52ZXJ0JiZ0LmludmVydCYmKGUuaW52ZXJ0PWZ1bmN0aW9uKG4scyl7cmV0dXJuIG49dC5pbnZlcnQobixzKSxuJiZpLmludmVydChuWzBdLG5bMV0pfSksZX1mdW5jdGlvbiBIYShpLHQpe3JldHVybiB0dChpKT5IJiYoaS09TWF0aC5yb3VuZChpL1h0KSpYdCksW2ksdF19SGEuaW52ZXJ0PUhhO2Z1bmN0aW9uIFZoKGksdCxlKXtyZXR1cm4oaSU9WHQpP3R8fGU/V2EocWgoaSksWGgodCxlKSk6cWgoaSk6dHx8ZT9YaCh0LGUpOkhhfWZ1bmN0aW9uIFVoKGkpe3JldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiB0Kz1pLHR0KHQpPkgmJih0LT1NYXRoLnJvdW5kKHQvWHQpKlh0KSxbdCxlXX19ZnVuY3Rpb24gcWgoaSl7dmFyIHQ9VWgoaSk7cmV0dXJuIHQuaW52ZXJ0PVVoKC1pKSx0fWZ1bmN0aW9uIFhoKGksdCl7dmFyIGU9RyhpKSxuPXEoaSkscz1HKHQpLHI9cSh0KTtmdW5jdGlvbiBvKGEsYyl7dmFyIGw9RyhjKSxoPUcoYSkqbCx1PXEoYSkqbCxmPXEoYyksZD1mKmUraCpuO3JldHVyblt1ZSh1KnMtZCpyLGgqZS1mKm4pLFplKGQqcyt1KnIpXX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24oYSxjKXt2YXIgbD1HKGMpLGg9RyhhKSpsLHU9cShhKSpsLGY9cShjKSxkPWYqcy11KnI7cmV0dXJuW3VlKHUqcytmKnIsaCplK2QqbiksWmUoZCplLWgqbildfSxvfWZ1bmN0aW9uIFpoKGkpe2k9VmgoaVswXSpYLGlbMV0qWCxpLmxlbmd0aD4yP2lbMl0qWDowKTtmdW5jdGlvbiB0KGUpe3JldHVybiBlPWkoZVswXSpYLGVbMV0qWCksZVswXSo9dXQsZVsxXSo9dXQsZX1yZXR1cm4gdC5pbnZlcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9aS5pbnZlcnQoZVswXSpYLGVbMV0qWCksZVswXSo9dXQsZVsxXSo9dXQsZX0sdH1mdW5jdGlvbiByeShpLHQsZSxuLHMscil7aWYoZSl7dmFyIG89Ryh0KSxhPXEodCksYz1uKmU7cz09bnVsbD8ocz10K24qWHQscj10LWMvMik6KHM9R2gobyxzKSxyPUdoKG8sciksKG4+MD9zPHI6cz5yKSYmKHMrPW4qWHQpKTtmb3IodmFyIGwsaD1zO24+MD9oPnI6aDxyO2gtPWMpbD1BcihbbywtYSpHKGgpLC1hKnEoaCldKSxpLnBvaW50KGxbMF0sbFsxXSl9fWZ1bmN0aW9uIEdoKGksdCl7dD1Gbih0KSx0WzBdLT1pLF9yKHQpO3ZhciBlPVdwKC10WzFdKTtyZXR1cm4oKC10WzJdPDA/LWU6ZSkrWHQtUSklWHR9ZnVuY3Rpb24gV2goKXt2YXIgaT1bXSx0O3JldHVybntwb2ludDpmdW5jdGlvbihlLG4scyl7dC5wdXNoKFtlLG4sc10pfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtpLnB1c2godD1bXSl9LGxpbmVFbmQ6RXQscmVqb2luOmZ1bmN0aW9uKCl7aS5sZW5ndGg+MSYmaS5wdXNoKGkucG9wKCkuY29uY2F0KGkuc2hpZnQoKSkpfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgZT1pO3JldHVybiBpPVtdLHQ9bnVsbCxlfX19ZnVuY3Rpb24gSXIoaSx0KXtyZXR1cm4gdHQoaVswXS10WzBdKTxRJiZ0dChpWzFdLXRbMV0pPFF9ZnVuY3Rpb24ga3IoaSx0LGUsbil7dGhpcy54PWksdGhpcy56PXQsdGhpcy5vPWUsdGhpcy5lPW4sdGhpcy52PSExLHRoaXMubj10aGlzLnA9bnVsbH1mdW5jdGlvbiBIaChpLHQsZSxuLHMpe3ZhciByPVtdLG89W10sYSxjO2lmKGkuZm9yRWFjaChmdW5jdGlvbihwKXtpZighKCh5PXAubGVuZ3RoLTEpPD0wKSl7dmFyIHksZz1wWzBdLHc9cFt5XSxiO2lmKElyKGcsdykpe2lmKCFnWzJdJiYhd1syXSl7Zm9yKHMubGluZVN0YXJ0KCksYT0wO2E8eTsrK2Epcy5wb2ludCgoZz1wW2FdKVswXSxnWzFdKTtzLmxpbmVFbmQoKTtyZXR1cm59d1swXSs9MipRfXIucHVzaChiPW5ldyBrcihnLHAsbnVsbCwhMCkpLG8ucHVzaChiLm89bmV3IGtyKGcsbnVsbCxiLCExKSksci5wdXNoKGI9bmV3IGtyKHcscCxudWxsLCExKSksby5wdXNoKGIubz1uZXcga3IodyxudWxsLGIsITApKX19KSwhIXIubGVuZ3RoKXtmb3Ioby5zb3J0KHQpLEpoKHIpLEpoKG8pLGE9MCxjPW8ubGVuZ3RoO2E8YzsrK2Epb1thXS5lPWU9IWU7Zm9yKHZhciBsPXJbMF0saCx1Ozspe2Zvcih2YXIgZj1sLGQ9ITA7Zi52OylpZigoZj1mLm4pPT09bClyZXR1cm47aD1mLnoscy5saW5lU3RhcnQoKTtkb3tpZihmLnY9Zi5vLnY9ITAsZi5lKXtpZihkKWZvcihhPTAsYz1oLmxlbmd0aDthPGM7KythKXMucG9pbnQoKHU9aFthXSlbMF0sdVsxXSk7ZWxzZSBuKGYueCxmLm4ueCwxLHMpO2Y9Zi5ufWVsc2V7aWYoZClmb3IoaD1mLnAueixhPWgubGVuZ3RoLTE7YT49MDstLWEpcy5wb2ludCgodT1oW2FdKVswXSx1WzFdKTtlbHNlIG4oZi54LGYucC54LC0xLHMpO2Y9Zi5wfWY9Zi5vLGg9Zi56LGQ9IWR9d2hpbGUoIWYudik7cy5saW5lRW5kKCl9fX1mdW5jdGlvbiBKaChpKXtpZih0PWkubGVuZ3RoKXtmb3IodmFyIHQsZT0wLG49aVswXSxzOysrZTx0OyluLm49cz1pW2VdLHMucD1uLG49cztuLm49cz1pWzBdLHMucD1ufX1mdW5jdGlvbiBKYShpKXtyZXR1cm4gdHQoaVswXSk8PUg/aVswXTpacChpWzBdKSooKHR0KGlbMF0pK0gpJVh0LUgpfWZ1bmN0aW9uIFloKGksdCl7dmFyIGU9SmEodCksbj10WzFdLHM9cShuKSxyPVtxKGUpLC1HKGUpLDBdLG89MCxhPTAsYz1uZXcgcWU7cz09PTE/bj1xdCtROnM9PT0tMSYmKG49LXF0LVEpO2Zvcih2YXIgbD0wLGg9aS5sZW5ndGg7bDxoOysrbClpZihmPSh1PWlbbF0pLmxlbmd0aClmb3IodmFyIHUsZixkPXVbZi0xXSxwPUphKGQpLHk9ZFsxXS8yK3hyLGc9cSh5KSx3PUcoeSksYj0wO2I8ZjsrK2IscD1tLGc9Uyx3PUEsZD14KXt2YXIgeD11W2JdLG09SmEoeCksTT14WzFdLzIreHIsUz1xKE0pLEE9RyhNKSx2PW0tcCxfPXY+PTA/MTotMSxUPV8qdix6PVQ+SCxDPWcqUztpZihjLmFkZCh1ZShDKl8qcShUKSx3KkErQypHKFQpKSksbys9ej92K18qWHQ6dix6XnA+PWVebT49ZSl7dmFyIEU9ZmkoRm4oZCksRm4oeCkpO19yKEUpO3ZhciBGPWZpKHIsRSk7X3IoRik7dmFyIEI9KHpedj49MD8tMToxKSpaZShGWzJdKTsobj5CfHxuPT09QiYmKEVbMF18fEVbMV0pKSYmKGErPXpedj49MD8xOi0xKX19cmV0dXJuKG88LVF8fG88USYmYzwtZ3IpXmEmMX1mdW5jdGlvbiBqaChpLHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24ocyl7dmFyIHI9dChzKSxvPVdoKCksYT10KG8pLGM9ITEsbCxoLHUsZj17cG9pbnQ6ZCxsaW5lU3RhcnQ6eSxsaW5lRW5kOmcscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Zi5wb2ludD13LGYubGluZVN0YXJ0PWIsZi5saW5lRW5kPXgsaD1bXSxsPVtdfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7Zi5wb2ludD1kLGYubGluZVN0YXJ0PXksZi5saW5lRW5kPWcsaD1ZaShoKTt2YXIgbT1ZaChsLG4pO2gubGVuZ3RoPyhjfHwocy5wb2x5Z29uU3RhcnQoKSxjPSEwKSxIaChoLGF5LG0sZSxzKSk6bSYmKGN8fChzLnBvbHlnb25TdGFydCgpLGM9ITApLHMubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxzKSxzLmxpbmVFbmQoKSksYyYmKHMucG9seWdvbkVuZCgpLGM9ITEpLGg9bD1udWxsfSxzcGhlcmU6ZnVuY3Rpb24oKXtzLnBvbHlnb25TdGFydCgpLHMubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxzKSxzLmxpbmVFbmQoKSxzLnBvbHlnb25FbmQoKX19O2Z1bmN0aW9uIGQobSxNKXtpKG0sTSkmJnMucG9pbnQobSxNKX1mdW5jdGlvbiBwKG0sTSl7ci5wb2ludChtLE0pfWZ1bmN0aW9uIHkoKXtmLnBvaW50PXAsci5saW5lU3RhcnQoKX1mdW5jdGlvbiBnKCl7Zi5wb2ludD1kLHIubGluZUVuZCgpfWZ1bmN0aW9uIHcobSxNKXt1LnB1c2goW20sTV0pLGEucG9pbnQobSxNKX1mdW5jdGlvbiBiKCl7YS5saW5lU3RhcnQoKSx1PVtdfWZ1bmN0aW9uIHgoKXt3KHVbMF1bMF0sdVswXVsxXSksYS5saW5lRW5kKCk7dmFyIG09YS5jbGVhbigpLE09by5yZXN1bHQoKSxTLEE9TS5sZW5ndGgsdixfLFQ7aWYodS5wb3AoKSxsLnB1c2godSksdT1udWxsLCEhQSl7aWYobSYxKXtpZihfPU1bMF0sKHY9Xy5sZW5ndGgtMSk+MCl7Zm9yKGN8fChzLnBvbHlnb25TdGFydCgpLGM9ITApLHMubGluZVN0YXJ0KCksUz0wO1M8djsrK1Mpcy5wb2ludCgoVD1fW1NdKVswXSxUWzFdKTtzLmxpbmVFbmQoKX1yZXR1cm59QT4xJiZtJjImJk0ucHVzaChNLnBvcCgpLmNvbmNhdChNLnNoaWZ0KCkpKSxoLnB1c2goTS5maWx0ZXIob3kpKX19cmV0dXJuIGZ9fWZ1bmN0aW9uIG95KGkpe3JldHVybiBpLmxlbmd0aD4xfWZ1bmN0aW9uIGF5KGksdCl7cmV0dXJuKChpPWkueClbMF08MD9pWzFdLXF0LVE6cXQtaVsxXSktKCh0PXQueClbMF08MD90WzFdLXF0LVE6cXQtdFsxXSl9dmFyIFFoPWpoKGZ1bmN0aW9uKCl7cmV0dXJuITB9LGN5LGh5LFstSCwtcXRdKTtmdW5jdGlvbiBjeShpKXt2YXIgdD1OYU4sZT1OYU4sbj1OYU4scztyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7aS5saW5lU3RhcnQoKSxzPTF9LHBvaW50OmZ1bmN0aW9uKHIsbyl7dmFyIGE9cj4wP0g6LUgsYz10dChyLXQpO3R0KGMtSCk8UT8oaS5wb2ludCh0LGU9KGUrbykvMj4wP3F0Oi1xdCksaS5wb2ludChuLGUpLGkubGluZUVuZCgpLGkubGluZVN0YXJ0KCksaS5wb2ludChhLGUpLGkucG9pbnQocixlKSxzPTApOm4hPT1hJiZjPj1IJiYodHQodC1uKTxRJiYodC09bipRKSx0dChyLWEpPFEmJihyLT1hKlEpLGU9bHkodCxlLHIsbyksaS5wb2ludChuLGUpLGkubGluZUVuZCgpLGkubGluZVN0YXJ0KCksaS5wb2ludChhLGUpLHM9MCksaS5wb2ludCh0PXIsZT1vKSxuPWF9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtpLmxpbmVFbmQoKSx0PWU9TmFOfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiAyLXN9fX1mdW5jdGlvbiBseShpLHQsZSxuKXt2YXIgcyxyLG89cShpLWUpO3JldHVybiB0dChvKT5RP05hKChxKHQpKihyPUcobikpKnEoZSktcShuKSoocz1HKHQpKSpxKGkpKS8ocypyKm8pKToodCtuKS8yfWZ1bmN0aW9uIGh5KGksdCxlLG4pe3ZhciBzO2lmKGk9PW51bGwpcz1lKnF0LG4ucG9pbnQoLUgscyksbi5wb2ludCgwLHMpLG4ucG9pbnQoSCxzKSxuLnBvaW50KEgsMCksbi5wb2ludChILC1zKSxuLnBvaW50KDAsLXMpLG4ucG9pbnQoLUgsLXMpLG4ucG9pbnQoLUgsMCksbi5wb2ludCgtSCxzKTtlbHNlIGlmKHR0KGlbMF0tdFswXSk+USl7dmFyIHI9aVswXTx0WzBdP0g6LUg7cz1lKnIvMixuLnBvaW50KC1yLHMpLG4ucG9pbnQoMCxzKSxuLnBvaW50KHIscyl9ZWxzZSBuLnBvaW50KHRbMF0sdFsxXSl9ZnVuY3Rpb24gdXkoaSl7dmFyIHQ9RyhpKSxlPTIqWCxuPXQ+MCxzPXR0KHQpPlE7ZnVuY3Rpb24gcihoLHUsZixkKXtyeShkLGksZSxmLGgsdSl9ZnVuY3Rpb24gbyhoLHUpe3JldHVybiBHKGgpKkcodSk+dH1mdW5jdGlvbiBhKGgpe3ZhciB1LGYsZCxwLHk7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe3A9ZD0hMSx5PTF9LHBvaW50OmZ1bmN0aW9uKGcsdyl7dmFyIGI9W2csd10seCxtPW8oZyx3KSxNPW4/bT8wOmwoZyx3KTptP2woZysoZzwwP0g6LUgpLHcpOjA7aWYoIXUmJihwPWQ9bSkmJmgubGluZVN0YXJ0KCksbSE9PWQmJih4PWModSxiKSwoIXh8fElyKHUseCl8fElyKGIseCkpJiYoYlsyXT0xKSksbSE9PWQpeT0wLG0/KGgubGluZVN0YXJ0KCkseD1jKGIsdSksaC5wb2ludCh4WzBdLHhbMV0pKTooeD1jKHUsYiksaC5wb2ludCh4WzBdLHhbMV0sMiksaC5saW5lRW5kKCkpLHU9eDtlbHNlIGlmKHMmJnUmJm5ebSl7dmFyIFM7IShNJmYpJiYoUz1jKGIsdSwhMCkpJiYoeT0wLG4/KGgubGluZVN0YXJ0KCksaC5wb2ludChTWzBdWzBdLFNbMF1bMV0pLGgucG9pbnQoU1sxXVswXSxTWzFdWzFdKSxoLmxpbmVFbmQoKSk6KGgucG9pbnQoU1sxXVswXSxTWzFdWzFdKSxoLmxpbmVFbmQoKSxoLmxpbmVTdGFydCgpLGgucG9pbnQoU1swXVswXSxTWzBdWzFdLDMpKSl9bSYmKCF1fHwhSXIodSxiKSkmJmgucG9pbnQoYlswXSxiWzFdKSx1PWIsZD1tLGY9TX0sbGluZUVuZDpmdW5jdGlvbigpe2QmJmgubGluZUVuZCgpLHU9bnVsbH0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4geXwocCYmZCk8PDF9fX1mdW5jdGlvbiBjKGgsdSxmKXt2YXIgZD1GbihoKSxwPUZuKHUpLHk9WzEsMCwwXSxnPWZpKGQscCksdz1TcihnLGcpLGI9Z1swXSx4PXctYipiO2lmKCF4KXJldHVybiFmJiZoO3ZhciBtPXQqdy94LE09LXQqYi94LFM9ZmkoeSxnKSxBPXZyKHksbSksdj12cihnLE0pO1ZhKEEsdik7dmFyIF89UyxUPVNyKEEsXyksej1TcihfLF8pLEM9VCpULXoqKFNyKEEsQSktMSk7aWYoIShDPDApKXt2YXIgRT1YZShDKSxGPXZyKF8sKC1ULUUpL3opO2lmKFZhKEYsQSksRj1BcihGKSwhZilyZXR1cm4gRjt2YXIgQj1oWzBdLEk9dVswXSxSPWhbMV0sVj11WzFdLFU7STxCJiYoVT1CLEI9SSxJPVUpO3ZhciBLPUktQixjdD10dChLLUgpPFEsRnQ9Y3R8fEs8UTtpZighY3QmJlY8UiYmKFU9UixSPVYsVj1VKSxGdD9jdD9SK1Y+MF5GWzFdPCh0dChGWzBdLUIpPFE/UjpWKTpSPD1GWzFdJiZGWzFdPD1WOks+SF4oQjw9RlswXSYmRlswXTw9SSkpe3ZhciBJdD12cihfLCgtVCtFKS96KTtyZXR1cm4gVmEoSXQsQSksW0YsQXIoSXQpXX19fWZ1bmN0aW9uIGwoaCx1KXt2YXIgZj1uP2k6SC1pLGQ9MDtyZXR1cm4gaDwtZj9kfD0xOmg+ZiYmKGR8PTIpLHU8LWY/ZHw9NDp1PmYmJihkfD04KSxkfXJldHVybiBqaChvLGEscixuP1swLC1pXTpbLUgsaS1IXSl9ZnVuY3Rpb24gZnkoaSx0LGUsbixzLHIpe3ZhciBvPWlbMF0sYT1pWzFdLGM9dFswXSxsPXRbMV0saD0wLHU9MSxmPWMtbyxkPWwtYSxwO2lmKHA9ZS1vLCEoIWYmJnA+MCkpe2lmKHAvPWYsZjwwKXtpZihwPGgpcmV0dXJuO3A8dSYmKHU9cCl9ZWxzZSBpZihmPjApe2lmKHA+dSlyZXR1cm47cD5oJiYoaD1wKX1pZihwPXMtbywhKCFmJiZwPDApKXtpZihwLz1mLGY8MCl7aWYocD51KXJldHVybjtwPmgmJihoPXApfWVsc2UgaWYoZj4wKXtpZihwPGgpcmV0dXJuO3A8dSYmKHU9cCl9aWYocD1uLWEsISghZCYmcD4wKSl7aWYocC89ZCxkPDApe2lmKHA8aClyZXR1cm47cDx1JiYodT1wKX1lbHNlIGlmKGQ+MCl7aWYocD51KXJldHVybjtwPmgmJihoPXApfWlmKHA9ci1hLCEoIWQmJnA8MCkpe2lmKHAvPWQsZDwwKXtpZihwPnUpcmV0dXJuO3A+aCYmKGg9cCl9ZWxzZSBpZihkPjApe2lmKHA8aClyZXR1cm47cDx1JiYodT1wKX1yZXR1cm4gaD4wJiYoaVswXT1vK2gqZixpWzFdPWEraCpkKSx1PDEmJih0WzBdPW8rdSpmLHRbMV09YSt1KmQpLCEwfX19fX12YXIgdHM9MWU5LE5yPS10cztmdW5jdGlvbiBkeShpLHQsZSxuKXtmdW5jdGlvbiBzKGwsaCl7cmV0dXJuIGk8PWwmJmw8PWUmJnQ8PWgmJmg8PW59ZnVuY3Rpb24gcihsLGgsdSxmKXt2YXIgZD0wLHA9MDtpZihsPT1udWxsfHwoZD1vKGwsdSkpIT09KHA9byhoLHUpKXx8YyhsLGgpPDBedT4wKWRvIGYucG9pbnQoZD09PTB8fGQ9PT0zP2k6ZSxkPjE/bjp0KTt3aGlsZSgoZD0oZCt1KzQpJTQpIT09cCk7ZWxzZSBmLnBvaW50KGhbMF0saFsxXSl9ZnVuY3Rpb24gbyhsLGgpe3JldHVybiB0dChsWzBdLWkpPFE/aD4wPzA6Mzp0dChsWzBdLWUpPFE/aD4wPzI6MTp0dChsWzFdLXQpPFE/aD4wPzE6MDpoPjA/MzoyfWZ1bmN0aW9uIGEobCxoKXtyZXR1cm4gYyhsLngsaC54KX1mdW5jdGlvbiBjKGwsaCl7dmFyIHU9byhsLDEpLGY9byhoLDEpO3JldHVybiB1IT09Zj91LWY6dT09PTA/aFsxXS1sWzFdOnU9PT0xP2xbMF0taFswXTp1PT09Mj9sWzFdLWhbMV06aFswXS1sWzBdfXJldHVybiBmdW5jdGlvbihsKXt2YXIgaD1sLHU9V2goKSxmLGQscCx5LGcsdyxiLHgsbSxNLFMsQT17cG9pbnQ6dixsaW5lU3RhcnQ6QyxsaW5lRW5kOkUscG9seWdvblN0YXJ0OlQscG9seWdvbkVuZDp6fTtmdW5jdGlvbiB2KEIsSSl7cyhCLEkpJiZoLnBvaW50KEIsSSl9ZnVuY3Rpb24gXygpe2Zvcih2YXIgQj0wLEk9MCxSPWQubGVuZ3RoO0k8UjsrK0kpZm9yKHZhciBWPWRbSV0sVT0xLEs9Vi5sZW5ndGgsY3Q9VlswXSxGdCxJdCxXdD1jdFswXSx2dD1jdFsxXTtVPEs7KytVKUZ0PVd0LEl0PXZ0LGN0PVZbVV0sV3Q9Y3RbMF0sdnQ9Y3RbMV0sSXQ8PW4/dnQ+biYmKFd0LUZ0KSoobi1JdCk+KHZ0LUl0KSooaS1GdCkmJisrQjp2dDw9biYmKFd0LUZ0KSoobi1JdCk8KHZ0LUl0KSooaS1GdCkmJi0tQjtyZXR1cm4gQn1mdW5jdGlvbiBUKCl7aD11LGY9W10sZD1bXSxTPSEwfWZ1bmN0aW9uIHooKXt2YXIgQj1fKCksST1TJiZCLFI9KGY9WWkoZikpLmxlbmd0aDsoSXx8UikmJihsLnBvbHlnb25TdGFydCgpLEkmJihsLmxpbmVTdGFydCgpLHIobnVsbCxudWxsLDEsbCksbC5saW5lRW5kKCkpLFImJkhoKGYsYSxCLHIsbCksbC5wb2x5Z29uRW5kKCkpLGg9bCxmPWQ9cD1udWxsfWZ1bmN0aW9uIEMoKXtBLnBvaW50PUYsZCYmZC5wdXNoKHA9W10pLE09ITAsbT0hMSxiPXg9TmFOfWZ1bmN0aW9uIEUoKXtmJiYoRih5LGcpLHcmJm0mJnUucmVqb2luKCksZi5wdXNoKHUucmVzdWx0KCkpKSxBLnBvaW50PXYsbSYmaC5saW5lRW5kKCl9ZnVuY3Rpb24gRihCLEkpe3ZhciBSPXMoQixJKTtpZihkJiZwLnB1c2goW0IsSV0pLE0peT1CLGc9SSx3PVIsTT0hMSxSJiYoaC5saW5lU3RhcnQoKSxoLnBvaW50KEIsSSkpO2Vsc2UgaWYoUiYmbSloLnBvaW50KEIsSSk7ZWxzZXt2YXIgVj1bYj1NYXRoLm1heChOcixNYXRoLm1pbih0cyxiKSkseD1NYXRoLm1heChOcixNYXRoLm1pbih0cyx4KSldLFU9W0I9TWF0aC5tYXgoTnIsTWF0aC5taW4odHMsQikpLEk9TWF0aC5tYXgoTnIsTWF0aC5taW4odHMsSSkpXTtmeShWLFUsaSx0LGUsbik/KG18fChoLmxpbmVTdGFydCgpLGgucG9pbnQoVlswXSxWWzFdKSksaC5wb2ludChVWzBdLFVbMV0pLFJ8fGgubGluZUVuZCgpLFM9ITEpOlImJihoLmxpbmVTdGFydCgpLGgucG9pbnQoQixJKSxTPSExKX1iPUIseD1JLG09Un1yZXR1cm4gQX19dmFyIFlhLGphLFJyLExyLHBpPXtzcGhlcmU6RXQscG9pbnQ6RXQsbGluZVN0YXJ0OnB5LGxpbmVFbmQ6RXQscG9seWdvblN0YXJ0OkV0LHBvbHlnb25FbmQ6RXR9O2Z1bmN0aW9uIHB5KCl7cGkucG9pbnQ9bXkscGkubGluZUVuZD15eX1mdW5jdGlvbiB5eSgpe3BpLnBvaW50PXBpLmxpbmVFbmQ9RXR9ZnVuY3Rpb24gbXkoaSx0KXtpKj1YLHQqPVgsamE9aSxScj1xKHQpLExyPUcodCkscGkucG9pbnQ9Z3l9ZnVuY3Rpb24gZ3koaSx0KXtpKj1YLHQqPVg7dmFyIGU9cSh0KSxuPUcodCkscz10dChpLWphKSxyPUcocyksbz1xKHMpLGE9bipvLGM9THIqZS1ScipuKnIsbD1SciplK0xyKm4qcjtZYS5hZGQodWUoWGUoYSphK2MqYyksbCkpLGphPWksUnI9ZSxMcj1ufWZ1bmN0aW9uIHh5KGkpe3JldHVybiBZYT1uZXcgcWUsYnIoaSxwaSksK1lhfXZhciBRYT1bbnVsbCxudWxsXSx3eT17dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6UWF9O2Z1bmN0aW9uIHlpKGksdCl7cmV0dXJuIFFhWzBdPWksUWFbMV09dCx4eSh3eSl9dmFyIEtoPXtGZWF0dXJlOmZ1bmN0aW9uKGksdCl7cmV0dXJuIE9yKGkuZ2VvbWV0cnksdCl9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuZmVhdHVyZXMsbj0tMSxzPWUubGVuZ3RoOysrbjxzOylpZihPcihlW25dLmdlb21ldHJ5LHQpKXJldHVybiEwO3JldHVybiExfX0sdHU9e1NwaGVyZTpmdW5jdGlvbigpe3JldHVybiEwfSxQb2ludDpmdW5jdGlvbihpLHQpe3JldHVybiBldShpLmNvb3JkaW5hdGVzLHQpfSxNdWx0aVBvaW50OmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuY29vcmRpbmF0ZXMsbj0tMSxzPWUubGVuZ3RoOysrbjxzOylpZihldShlW25dLHQpKXJldHVybiEwO3JldHVybiExfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKGksdCl7cmV0dXJuIG51KGkuY29vcmRpbmF0ZXMsdCl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmNvb3JkaW5hdGVzLG49LTEscz1lLmxlbmd0aDsrK248czspaWYobnUoZVtuXSx0KSlyZXR1cm4hMDtyZXR1cm4hMX0sUG9seWdvbjpmdW5jdGlvbihpLHQpe3JldHVybiBpdShpLmNvb3JkaW5hdGVzLHQpfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5jb29yZGluYXRlcyxuPS0xLHM9ZS5sZW5ndGg7KytuPHM7KWlmKGl1KGVbbl0sdCkpcmV0dXJuITA7cmV0dXJuITF9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmdlb21ldHJpZXMsbj0tMSxzPWUubGVuZ3RoOysrbjxzOylpZihPcihlW25dLHQpKXJldHVybiEwO3JldHVybiExfX07ZnVuY3Rpb24gT3IoaSx0KXtyZXR1cm4gaSYmdHUuaGFzT3duUHJvcGVydHkoaS50eXBlKT90dVtpLnR5cGVdKGksdCk6ITF9ZnVuY3Rpb24gZXUoaSx0KXtyZXR1cm4geWkoaSx0KT09PTB9ZnVuY3Rpb24gbnUoaSx0KXtmb3IodmFyIGUsbixzLHI9MCxvPWkubGVuZ3RoO3I8bztyKyspe2lmKG49eWkoaVtyXSx0KSxuPT09MHx8cj4wJiYocz15aShpW3JdLGlbci0xXSkscz4wJiZlPD1zJiZuPD1zJiYoZStuLXMpKigxLU1hdGgucG93KChlLW4pL3MsMikpPGdyKnMpKXJldHVybiEwO2U9bn1yZXR1cm4hMX1mdW5jdGlvbiBpdShpLHQpe3JldHVybiEhWWgoaS5tYXAoYnkpLHN1KHQpKX1mdW5jdGlvbiBieShpKXtyZXR1cm4gaT1pLm1hcChzdSksaS5wb3AoKSxpfWZ1bmN0aW9uIHN1KGkpe3JldHVybltpWzBdKlgsaVsxXSpYXX1mdW5jdGlvbiBNeShpLHQpe3JldHVybihpJiZLaC5oYXNPd25Qcm9wZXJ0eShpLnR5cGUpP0toW2kudHlwZV06T3IpKGksdCl9ZnVuY3Rpb24gQXkoaSx0KXt2YXIgZT1pWzBdKlgsbj1pWzFdKlgscz10WzBdKlgscj10WzFdKlgsbz1HKG4pLGE9cShuKSxjPUcociksbD1xKHIpLGg9bypHKGUpLHU9bypxKGUpLGY9YypHKHMpLGQ9YypxKHMpLHA9MipaZShYZSh3aChyLW4pK28qYyp3aChzLWUpKSkseT1xKHApLGc9cD9mdW5jdGlvbih3KXt2YXIgYj1xKHcqPXApL3kseD1xKHAtdykveSxtPXgqaCtiKmYsTT14KnUrYipkLFM9eCphK2IqbDtyZXR1cm5bdWUoTSxtKSp1dCx1ZShTLFhlKG0qbStNKk0pKSp1dF19OmZ1bmN0aW9uKCl7cmV0dXJuW2UqdXQsbip1dF19O3JldHVybiBnLmRpc3RhbmNlPXAsZ312YXIgcnU9aT0+aSxtaT0xLzAsRHI9bWksZXM9LW1pLCRyPWVzLG91PXtwb2ludDpTeSxsaW5lU3RhcnQ6RXQsbGluZUVuZDpFdCxwb2x5Z29uU3RhcnQ6RXQscG9seWdvbkVuZDpFdCxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgaT1bW21pLERyXSxbZXMsJHJdXTtyZXR1cm4gZXM9JHI9LShEcj1taT0xLzApLGl9fTtmdW5jdGlvbiBTeShpLHQpe2k8bWkmJihtaT1pKSxpPmVzJiYoZXM9aSksdDxEciYmKERyPXQpLHQ+JHImJigkcj10KX1mdW5jdGlvbiBLYShpKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9bmV3IHRjO2Zvcih2YXIgbiBpbiBpKWVbbl09aVtuXTtyZXR1cm4gZS5zdHJlYW09dCxlfX1mdW5jdGlvbiB0Yygpe310Yy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnRjLHBvaW50OmZ1bmN0aW9uKGksdCl7dGhpcy5zdHJlYW0ucG9pbnQoaSx0KX0sc3BoZXJlOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25FbmQoKX19O2Z1bmN0aW9uIGVjKGksdCxlKXt2YXIgbj1pLmNsaXBFeHRlbnQmJmkuY2xpcEV4dGVudCgpO3JldHVybiBpLnNjYWxlKDE1MCkudHJhbnNsYXRlKFswLDBdKSxuIT1udWxsJiZpLmNsaXBFeHRlbnQobnVsbCksYnIoZSxpLnN0cmVhbShvdSkpLHQob3UucmVzdWx0KCkpLG4hPW51bGwmJmkuY2xpcEV4dGVudChuKSxpfWZ1bmN0aW9uIGF1KGksdCxlKXtyZXR1cm4gZWMoaSxmdW5jdGlvbihuKXt2YXIgcz10WzFdWzBdLXRbMF1bMF0scj10WzFdWzFdLXRbMF1bMV0sbz1NYXRoLm1pbihzLyhuWzFdWzBdLW5bMF1bMF0pLHIvKG5bMV1bMV0tblswXVsxXSkpLGE9K3RbMF1bMF0rKHMtbyooblsxXVswXStuWzBdWzBdKSkvMixjPSt0WzBdWzFdKyhyLW8qKG5bMV1bMV0rblswXVsxXSkpLzI7aS5zY2FsZSgxNTAqbykudHJhbnNsYXRlKFthLGNdKX0sZSl9ZnVuY3Rpb24gdnkoaSx0LGUpe3JldHVybiBhdShpLFtbMCwwXSx0XSxlKX1mdW5jdGlvbiBfeShpLHQsZSl7cmV0dXJuIGVjKGksZnVuY3Rpb24obil7dmFyIHM9K3Qscj1zLyhuWzFdWzBdLW5bMF1bMF0pLG89KHMtciooblsxXVswXStuWzBdWzBdKSkvMixhPS1yKm5bMF1bMV07aS5zY2FsZSgxNTAqcikudHJhbnNsYXRlKFtvLGFdKX0sZSl9ZnVuY3Rpb24genkoaSx0LGUpe3JldHVybiBlYyhpLGZ1bmN0aW9uKG4pe3ZhciBzPSt0LHI9cy8oblsxXVsxXS1uWzBdWzFdKSxvPS1yKm5bMF1bMF0sYT0ocy1yKihuWzFdWzFdK25bMF1bMV0pKS8yO2kuc2NhbGUoMTUwKnIpLnRyYW5zbGF0ZShbbyxhXSl9LGUpfXZhciBjdT0xNixUeT1HKDMwKlgpO2Z1bmN0aW9uIGx1KGksdCl7cmV0dXJuK3Q/Q3koaSx0KTpQeShpKX1mdW5jdGlvbiBQeShpKXtyZXR1cm4gS2Eoe3BvaW50OmZ1bmN0aW9uKHQsZSl7dD1pKHQsZSksdGhpcy5zdHJlYW0ucG9pbnQodFswXSx0WzFdKX19KX1mdW5jdGlvbiBDeShpLHQpe2Z1bmN0aW9uIGUobixzLHIsbyxhLGMsbCxoLHUsZixkLHAseSxnKXt2YXIgdz1sLW4sYj1oLXMseD13KncrYipiO2lmKHg+NCp0JiZ5LS0pe3ZhciBtPW8rZixNPWErZCxTPWMrcCxBPVhlKG0qbStNKk0rUypTKSx2PVplKFMvPUEpLF89dHQodHQoUyktMSk8UXx8dHQoci11KTxRPyhyK3UpLzI6dWUoTSxtKSxUPWkoXyx2KSx6PVRbMF0sQz1UWzFdLEU9ei1uLEY9Qy1zLEI9YipFLXcqRjsoQipCL3g+dHx8dHQoKHcqRStiKkYpL3gtLjUpPi4zfHxvKmYrYSpkK2MqcDxUeSkmJihlKG4scyxyLG8sYSxjLHosQyxfLG0vPUEsTS89QSxTLHksZyksZy5wb2ludCh6LEMpLGUoeixDLF8sbSxNLFMsbCxoLHUsZixkLHAseSxnKSl9fXJldHVybiBmdW5jdGlvbihuKXt2YXIgcyxyLG8sYSxjLGwsaCx1LGYsZCxwLHksZz17cG9pbnQ6dyxsaW5lU3RhcnQ6YixsaW5lRW5kOm0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7bi5wb2x5Z29uU3RhcnQoKSxnLmxpbmVTdGFydD1NfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7bi5wb2x5Z29uRW5kKCksZy5saW5lU3RhcnQ9Yn19O2Z1bmN0aW9uIHcodixfKXt2PWkodixfKSxuLnBvaW50KHZbMF0sdlsxXSl9ZnVuY3Rpb24gYigpe3U9TmFOLGcucG9pbnQ9eCxuLmxpbmVTdGFydCgpfWZ1bmN0aW9uIHgodixfKXt2YXIgVD1GbihbdixfXSksej1pKHYsXyk7ZSh1LGYsaCxkLHAseSx1PXpbMF0sZj16WzFdLGg9dixkPVRbMF0scD1UWzFdLHk9VFsyXSxjdSxuKSxuLnBvaW50KHUsZil9ZnVuY3Rpb24gbSgpe2cucG9pbnQ9dyxuLmxpbmVFbmQoKX1mdW5jdGlvbiBNKCl7YigpLGcucG9pbnQ9UyxnLmxpbmVFbmQ9QX1mdW5jdGlvbiBTKHYsXyl7eChzPXYsXykscj11LG89ZixhPWQsYz1wLGw9eSxnLnBvaW50PXh9ZnVuY3Rpb24gQSgpe2UodSxmLGgsZCxwLHkscixvLHMsYSxjLGwsY3UsbiksZy5saW5lRW5kPW0sbSgpfXJldHVybiBnfX12YXIgRXk9S2Eoe3BvaW50OmZ1bmN0aW9uKGksdCl7dGhpcy5zdHJlYW0ucG9pbnQoaSpYLHQqWCl9fSk7ZnVuY3Rpb24gQnkoaSl7cmV0dXJuIEthKHtwb2ludDpmdW5jdGlvbih0LGUpe3ZhciBuPWkodCxlKTtyZXR1cm4gdGhpcy5zdHJlYW0ucG9pbnQoblswXSxuWzFdKX19KX1mdW5jdGlvbiBGeShpLHQsZSxuLHMpe2Z1bmN0aW9uIHIobyxhKXtyZXR1cm4gbyo9bixhKj1zLFt0K2kqbyxlLWkqYV19cmV0dXJuIHIuaW52ZXJ0PWZ1bmN0aW9uKG8sYSl7cmV0dXJuWyhvLXQpL2kqbiwoZS1hKS9pKnNdfSxyfWZ1bmN0aW9uIGh1KGksdCxlLG4scyxyKXtpZighcilyZXR1cm4gRnkoaSx0LGUsbixzKTt2YXIgbz1HKHIpLGE9cShyKSxjPW8qaSxsPWEqaSxoPW8vaSx1PWEvaSxmPShhKmUtbyp0KS9pLGQ9KGEqdCtvKmUpL2k7ZnVuY3Rpb24gcCh5LGcpe3JldHVybiB5Kj1uLGcqPXMsW2MqeS1sKmcrdCxlLWwqeS1jKmddfXJldHVybiBwLmludmVydD1mdW5jdGlvbih5LGcpe3JldHVybltuKihoKnktdSpnK2YpLHMqKGQtdSp5LWgqZyldfSxwfWZ1bmN0aW9uIFZyKGkpe3JldHVybiBJeShmdW5jdGlvbigpe3JldHVybiBpfSkoKX1mdW5jdGlvbiBJeShpKXt2YXIgdCxlPTE1MCxuPTQ4MCxzPTI1MCxyPTAsbz0wLGE9MCxjPTAsbD0wLGgsdT0wLGY9MSxkPTEscD1udWxsLHk9UWgsZz1udWxsLHcsYix4LG09cnUsTT0uNSxTLEEsdixfLFQ7ZnVuY3Rpb24geihCKXtyZXR1cm4gdihCWzBdKlgsQlsxXSpYKX1mdW5jdGlvbiBDKEIpe3JldHVybiBCPXYuaW52ZXJ0KEJbMF0sQlsxXSksQiYmW0JbMF0qdXQsQlsxXSp1dF19ei5zdHJlYW09ZnVuY3Rpb24oQil7cmV0dXJuIF8mJlQ9PT1CP186Xz1FeShCeShoKSh5KFMobShUPUIpKSkpKX0sei5wcmVjbGlwPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PUIscD12b2lkIDAsRigpKTp5fSx6LnBvc3RjbGlwPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPUIsZz13PWI9eD1udWxsLEYoKSk6bX0sei5jbGlwQW5nbGU9ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9K0I/dXkocD1CKlgpOihwPW51bGwsUWgpLEYoKSk6cCp1dH0sei5jbGlwRXh0ZW50PWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPUI9PW51bGw/KGc9dz1iPXg9bnVsbCxydSk6ZHkoZz0rQlswXVswXSx3PStCWzBdWzFdLGI9K0JbMV1bMF0seD0rQlsxXVsxXSksRigpKTpnPT1udWxsP251bGw6W1tnLHddLFtiLHhdXX0sei5zY2FsZT1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rQixFKCkpOmV9LHoudHJhbnNsYXRlPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPStCWzBdLHM9K0JbMV0sRSgpKTpbbixzXX0sei5jZW50ZXI9ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9QlswXSUzNjAqWCxvPUJbMV0lMzYwKlgsRSgpKTpbcip1dCxvKnV0XX0sei5yb3RhdGU9ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9QlswXSUzNjAqWCxjPUJbMV0lMzYwKlgsbD1CLmxlbmd0aD4yP0JbMl0lMzYwKlg6MCxFKCkpOlthKnV0LGMqdXQsbCp1dF19LHouYW5nbGU9ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9QiUzNjAqWCxFKCkpOnUqdXR9LHoucmVmbGVjdFg9ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9Qj8tMToxLEUoKSk6ZjwwfSx6LnJlZmxlY3RZPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPUI/LTE6MSxFKCkpOmQ8MH0sei5wcmVjaXNpb249ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KFM9bHUoQSxNPUIqQiksRigpKTpYZShNKX0sei5maXRFeHRlbnQ9ZnVuY3Rpb24oQixJKXtyZXR1cm4gYXUoeixCLEkpfSx6LmZpdFNpemU9ZnVuY3Rpb24oQixJKXtyZXR1cm4gdnkoeixCLEkpfSx6LmZpdFdpZHRoPWZ1bmN0aW9uKEIsSSl7cmV0dXJuIF95KHosQixJKX0sei5maXRIZWlnaHQ9ZnVuY3Rpb24oQixJKXtyZXR1cm4genkoeixCLEkpfTtmdW5jdGlvbiBFKCl7dmFyIEI9aHUoZSwwLDAsZixkLHUpLmFwcGx5KG51bGwsdChyLG8pKSxJPWh1KGUsbi1CWzBdLHMtQlsxXSxmLGQsdSk7cmV0dXJuIGg9VmgoYSxjLGwpLEE9V2EodCxJKSx2PVdhKGgsQSksUz1sdShBLE0pLEYoKX1mdW5jdGlvbiBGKCl7cmV0dXJuIF89VD1udWxsLHp9cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyksei5pbnZlcnQ9dC5pbnZlcnQmJkMsRSgpfX1mdW5jdGlvbiBreShpKXtyZXR1cm4gZnVuY3Rpb24odCxlKXt2YXIgbj1YZSh0KnQrZSplKSxzPWkobikscj1xKHMpLG89RyhzKTtyZXR1cm5bdWUodCpyLG4qbyksWmUobiYmZSpyL24pXX19ZnVuY3Rpb24gbmMoaSx0KXtyZXR1cm5baSxYcChHcCgocXQrdCkvMikpXX1uYy5pbnZlcnQ9ZnVuY3Rpb24oaSx0KXtyZXR1cm5baSwyKk5hKHFwKHQpKS1xdF19O2Z1bmN0aW9uIE55KCl7cmV0dXJuIFJ5KG5jKS5zY2FsZSg5NjEvWHQpfWZ1bmN0aW9uIFJ5KGkpe3ZhciB0PVZyKGkpLGU9dC5jZW50ZXIsbj10LnNjYWxlLHM9dC50cmFuc2xhdGUscj10LmNsaXBFeHRlbnQsbz1udWxsLGEsYyxsO3Quc2NhbGU9ZnVuY3Rpb24odSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG4odSksaCgpKTpuKCl9LHQudHJhbnNsYXRlPWZ1bmN0aW9uKHUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzKHUpLGgoKSk6cygpfSx0LmNlbnRlcj1mdW5jdGlvbih1KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZSh1KSxoKCkpOmUoKX0sdC5jbGlwRXh0ZW50PWZ1bmN0aW9uKHUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PT1udWxsP289YT1jPWw9bnVsbDoobz0rdVswXVswXSxhPSt1WzBdWzFdLGM9K3VbMV1bMF0sbD0rdVsxXVsxXSksaCgpKTpvPT1udWxsP251bGw6W1tvLGFdLFtjLGxdXX07ZnVuY3Rpb24gaCgpe3ZhciB1PUgqbigpLGY9dChaaCh0LnJvdGF0ZSgpKS5pbnZlcnQoWzAsMF0pKTtyZXR1cm4gcihvPT1udWxsP1tbZlswXS11LGZbMV0tdV0sW2ZbMF0rdSxmWzFdK3VdXTppPT09bmM/W1tNYXRoLm1heChmWzBdLXUsbyksYV0sW01hdGgubWluKGZbMF0rdSxjKSxsXV06W1tvLE1hdGgubWF4KGZbMV0tdSxhKV0sW2MsTWF0aC5taW4oZlsxXSt1LGwpXV0pfXJldHVybiBoKCl9ZnVuY3Rpb24gaWMoaSx0KXtyZXR1cm5baSx0XX1pYy5pbnZlcnQ9aWM7ZnVuY3Rpb24gTHkoKXtyZXR1cm4gVnIoaWMpLnNjYWxlKDE1Mi42Myl9ZnVuY3Rpb24gdXUoaSx0KXt2YXIgZT1HKHQpLG49MStHKGkpKmU7cmV0dXJuW2UqcShpKS9uLHEodCkvbl19dXUuaW52ZXJ0PWt5KGZ1bmN0aW9uKGkpe3JldHVybiAyKk5hKGkpfSk7ZnVuY3Rpb24gT3koKXtyZXR1cm4gVnIodXUpLnNjYWxlKDI1MCkuY2xpcEFuZ2xlKDE0Mil9dmFyIFVyPU1hdGguYWJzLGdpPU1hdGguY29zLF9lPU1hdGguc2luLG5zPTFlLTYscXI9TWF0aC5QSSxzYz1xci8yO2Z1bmN0aW9uIER5KGkpe3JldHVybiBpP2kvTWF0aC5zaW4oaSk6MX1mdW5jdGlvbiByYyhpKXtyZXR1cm4gaT4xPzA6aTwtMT9xcjpNYXRoLmFjb3MoaSl9ZnVuY3Rpb24gZnUoaSl7cmV0dXJuIGk+MD9NYXRoLnNxcnQoaSk6MH1mdW5jdGlvbiBkdShpLHQpe3ZhciBlPWdpKHQpLG49RHkocmMoZSpnaShpLz0yKSkpO3JldHVyblsyKmUqX2UoaSkqbixfZSh0KSpuXX1kdS5pbnZlcnQ9ZnVuY3Rpb24oaSx0KXtpZighKGkqaSs0KnQqdD5xcipxcitucykpe3ZhciBlPWksbj10LHM9MjU7ZG97dmFyIHI9X2UoZSksbz1fZShlLzIpLGE9Z2koZS8yKSxjPV9lKG4pLGw9Z2kobiksaD1fZSgyKm4pLHU9YypjLGY9bCpsLGQ9bypvLHA9MS1mKmEqYSx5PXA/cmMobCphKSpmdShnPTEvcCk6Zz0wLGcsdz0yKnkqbCpvLWksYj15KmMtdCx4PWcqKGYqZCt5KmwqYSp1KSxtPWcqKC41KnIqaC15KjIqYypvKSxNPWcqLjI1KihoKm8teSpjKmYqciksUz1nKih1KmEreSpkKmwpLEE9bSpNLVMqeDtpZighQSlicmVhazt2YXIgdj0oYiptLXcqUykvQSxfPSh3Kk0tYip4KS9BO2UtPXYsbi09X313aGlsZSgoVXIodik+bnN8fFVyKF8pPm5zKSYmLS1zPjApO3JldHVybltlLG5dfX07ZnVuY3Rpb24gcHUoaSx0KXt2YXIgZT1kdShpLHQpO3JldHVyblsoZVswXStpL3NjKS8yLChlWzFdK3QpLzJdfXB1LmludmVydD1mdW5jdGlvbihpLHQpe3ZhciBlPWksbj10LHM9MjU7ZG97dmFyIHI9Z2kobiksbz1fZShuKSxhPV9lKDIqbiksYz1vKm8sbD1yKnIsaD1fZShlKSx1PWdpKGUvMiksZj1fZShlLzIpLGQ9ZipmLHA9MS1sKnUqdSx5PXA/cmMocip1KSpmdShnPTEvcCk6Zz0wLGcsdz0uNSooMip5KnIqZitlL3NjKS1pLGI9LjUqKHkqbytuKS10LHg9LjUqZyoobCpkK3kqcip1KmMpKy41L3NjLG09ZyooaCphLzQteSpvKmYpLE09LjEyNSpnKihhKmYteSpvKmwqaCksUz0uNSpnKihjKnUreSpkKnIpKy41LEE9bSpNLVMqeCx2PShiKm0tdypTKS9BLF89KHcqTS1iKngpL0E7ZS09dixuLT1ffXdoaWxlKChVcih2KT5uc3x8VXIoXyk+bnMpJiYtLXM+MCk7cmV0dXJuW2Usbl19O2Z1bmN0aW9uICR5KCl7cmV0dXJuIFZyKHB1KS5zY2FsZSgxNTguODM3KX1jb25zdCBWeT17bWVyY2F0b3I6TnksZXF1aXJlY3Rhbmd1bGFyOkx5LHdpbmtlbDM6JHl9LG9jPXt9LGlzPWk9Pnt2YXIgbixzLHI7Y29uc3QgdD1KU09OLnN0cmluZ2lmeShpKTtpZihvY1t0XSlyZXR1cm4gb2NbdF07Y29uc3QgZT1WeVsobj1pLnByb2plY3Rpb25UeXBlKSE9bnVsbD9uOiJtZXJjYXRvciJdKCkuY2VudGVyKGkuY2VudGVyKS5zY2FsZShpLnNjYWxlKS50cmFuc2xhdGUoKHM9aS50cmFuc2xhdGUpIT1udWxsP3M6WzAsMF0pLnByZWNpc2lvbigocj1pLnByZWNpc2lvbikhPW51bGw/cjouMSk7cmV0dXJuIGkucm90YXRlJiZlLnJvdGF0ZShpLnJvdGF0ZSksb2NbdF09ZSxlfSxrbj17YTo2Mzc4MTM3LGI6NjM1Njc1MjMxNDI0NTE3OWUtOSxmOjEvMjk4LjI1NzIyMzU2M307ZnVuY3Rpb24geXUoaSx0LGU9MCxuPTEva24uYSxzPSExKXtjb25zdCByPVZjLmRlZ1RvUmFkKGkpLG89VmMuZGVnVG9SYWQodCksYT1NYXRoLmNvcyhvKSxjPU1hdGguc2luKG8pLGw9TWF0aC5jb3MociksaD1NYXRoLnNpbihyKTtsZXQgdSxmLGQ7aWYocyl7Y29uc3QgeT0oa24uYStlKSpuO3U9eSphKmwsZj15KmMsZD15KmEqaH1lbHNle2NvbnN0IHA9a24uYSx5PWtuLmIsZz1wKnAsdz15KnksYj0oZy13KS9nLHg9cC9NYXRoLnNxcnQoMS1iKmMqYyksbT0oeCtlKSphKmwqbixNPSh4K2UpKmEqaCpuLFM9KHgqKDEtYikrZSkqYypuO3U9bSxmPVMsZD1NfXJldHVybiBuZXcgUCh1LGYsZCl9Y29uc3QgWHI9KGksdCk9PmkubWFwKChbZSxuXSk9PntsZXQgcztpZih0KXtjb25zdFtyLG9dPXQoW2Usbl0pO3M9bmV3IGsociwtbyl9ZWxzZSBzPW5ldyBrKGUsbik7cmV0dXJuIHN9KSxzcz0oe2Nvb3JkaW5hdGVzOmksbGVuZ3Roczp0LG1ldGFMZW5ndGg6ZSxkaW1lbnNpb246bj0yfSk9Pntjb25zdCBzPVtdLHI9W107aWYoaSYmdCYmaSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSl7bGV0IG89MDtzLmxlbmd0aD10Lmxlbmd0aDtmb3IobGV0IGE9MDthPHQubGVuZ3RoO2ErKyl7Y29uc3QgYz10W2FdLGw9bmV3IEFycmF5KGMpO2ZvcihsZXQgaD0wO2g8YztoKyspbFtoXT1BcnJheS5mcm9tKGkuc3ViYXJyYXkobyxvK24pKSxvKz1uO3NbYV09bH1pZihlKXtjb25zdCBhPShpLmxlbmd0aC1vKS9lO3IubGVuZ3RoPWE7Zm9yKGxldCBjPTA7YzxhO2MrKylyW2NdPUFycmF5LmZyb20oaS5zdWJhcnJheShvLG8rZSkpLG8rPWV9fXJldHVybntjb29yZGluYXRlc0FycjpzLG1ldGFBcnJheTpyfX07dmFyIHJzPShpLHQpPT57Y29uc3QgZT1naChpLHQhPW51bGw/dDowKSxuPXt9LHM9W10scj1PYmplY3Qua2V5cyhlLmF0dHJpYnV0ZXMpO3JldHVybiBlLmluZGV4JiZyLnB1c2goImluZGV4Iiksci5mb3JFYWNoKG89Pntjb25zdCBhPW89PT0iaW5kZXgiP2UuaW5kZXg6ZS5hdHRyaWJ1dGVzW29dO25bb109e2FycmF5OmEuYXJyYXksaXRlbVNpemU6YS5pdGVtU2l6ZX0scy5wdXNoKGEuYXJyYXkuYnVmZmVyKX0pLHQmJihuLmdyb3Vwcz1lLmdyb3VwcyksZS5kaXNwb3NlKCksaS5mb3JFYWNoKG89PntvLmRpc3Bvc2UoKX0pLHttZXNzYWdlOm4sdHJhbnNmZXI6c319LGFjPShpLHQ9MzAwLGUpPT57Y29uc3Qgbj1bXSxzPVtdO3JldHVybiBpLmZvckVhY2goKHIsbyk9PntsZXQgYT0hMTtmb3IobGV0IGM9MTtjPHIubGVuZ3RoO2MrKylpZihNYXRoLmFicyhyW2NdLngtcltjLTFdLngpPnQpe2E9ITA7YnJlYWt9aWYoYSl7Y29uc3QgYz1bXSxsPVtdO3IuZm9yRWFjaChoPT57aC54PDA/Yy5wdXNoKGgpOmwucHVzaChoKX0pLG4ucHVzaChjLGwpLGUmJnMucHVzaChlW29dLGVbb10pfWVsc2Ugbi5wdXNoKHIpLGUmJnMucHVzaChlW29dKX0pLHtzcGxpdFBvbHlnb25zOm4sc3BsaXRNZXRhOnN9fTtmdW5jdGlvbiBVeShpLHQsZT0wKXtjb25zdFtuLHMscixvXT1pO2xldCBhPTEvMCxjPTEvMCxsPS0xLzAsaD0tMS8wO2ZvcihsZXQgdT0wO3U8PWU7dSsrKXtjb25zdCBmPWUmJnUvZTtYcihbW24rZiooci1uKSxzXSxbbitmKihyLW4pLG9dLFtuLHMrZiooby1zKV0sW3IscytmKihvLXMpXV0sdCkuZm9yRWFjaChkPT57YT1NYXRoLm1pbihhLGQueCksYz1NYXRoLm1pbihjLGQueSksbD1NYXRoLm1heChsLGQueCksaD1NYXRoLm1heChoLGQueSl9KX1yZXR1cm5bW2EsY10sW2wsaF1dfWNvbnN0IHF5PSh7Y29vcmRpbmF0ZXM6aSxsZW5ndGhzOnQsbWV0YUxlbmd0aDplLHNwbGl0Om4sYmJveDpzLHByb2plY3Rpb246cix1c2VHcm91cHM6byxoYXNUb3A6YSxoYXNCb3R0b206YyxoYXNTaWRlOmwsc3BsaXRQb2x5Z29uczpoLHRvcFNlZ21lbnRzOnV9KT0+e2NvbnN0IGY9ciYmaXMocikse2Nvb3JkaW5hdGVzQXJyOmQsbWV0YUFycmF5OnB9PXNzKHtjb29yZGluYXRlczppLGxlbmd0aHM6dCxtZXRhTGVuZ3RoOmV9KTtsZXQgeT1kLm1hcCh4PT5Ycih4LGYpKSxnPXA7aWYoaCl7Y29uc3QgeD1hYyh5LGgscCk7eT14LnNwbGl0UG9seWdvbnMsZz14LnNwbGl0TWV0YX1sZXQgdztpZihzKXtjb25zdCB4PXNbMF09PT0tMTgwJiZzWzJdPT09MTgwJiYocj09bnVsbD92b2lkIDA6ci5yb3RhdGUpLFttLE1dPVV5KHMseD9pcyhLZShVdCh7fSxyKSx7cm90YXRlOnZvaWQgMH0pKTpmLChyPT1udWxsP3ZvaWQgMDpyLnByb2plY3Rpb25UeXBlKT09PSJ3aW5rZWwzIj8xMDowKTt3PW5ldyBndChuZXcgUChtWzBdLG1bMV0sMCksbmV3IFAoTVswXSxNWzFdLDApKX1jb25zdCBiPXkubWFwKCh4LG0pPT57Y29uc3QgTT1nW21dWzBdLFM9Z1ttXVsxXXx8MCxBPWdbbV1bMl18fDEsdj1CcCh7cG9pbnRzOngsc3BsaXQ6bixzaWRlUmVwZWF0OkEsZGVwdGg6TSxoYXNUb3A6YSxoYXNCb3R0b206YyxoYXNTaWRlOmwsYm94Mzp3LHRvcFNlZ21lbnRzOnV9KTtpZihTKXtjb25zdCBfPXYuYXR0cmlidXRlcy5wb3NpdGlvbjtmb3IobGV0IFQ9MDtUPF8uY291bnQ7VCsrKV8uc2V0WihULF8uZ2V0WihUKStTKTtfLm5lZWRzVXBkYXRlPSEwfXJldHVybiB2fSk7cmV0dXJuIHJzKGIsbyl9O2NsYXNzIFh5IGV4dGVuZHMgQWV7Y29uc3RydWN0b3IodD1bXSxlPSJub25lIixuKXtzdXBlcigpLHRoaXMudHlwZT0iTWVzaExpbmVHZW9tZXRyeSIsdGhpcy5wb2ludENvdW50PTAsdGhpcy5fcG9pbnRzPVtdLHRoaXMuc2hhcGU9Im5vbmUiLHRoaXMuc2hhcGVGdW5jdGlvbj1zPT4xLHRoaXMubWF0cml4V29ybGQ9bmV3IHN0LHRoaXMuc2hhcGU9ZSxuJiYodGhpcy5zaGFwZUZ1bmN0aW9uPW4pLHQubGVuZ3RoPjAmJnRoaXMuc2V0UG9pbnRzKHQpfWNvbnZlcnRUb1ZlY3RvcjNBcnJheSh0KXtpZih0eXBlb2YgdFswXT09Im51bWJlciIpe2NvbnN0IGU9W10sbj10O2ZvcihsZXQgcz0wO3M8bi5sZW5ndGg7cys9MyllLnB1c2gobmV3IFAobltzXSxuW3MrMV0sbltzKzJdKSk7cmV0dXJuIGV9ZWxzZSByZXR1cm4gdC5tYXAoZT0+e2lmKGUgaW5zdGFuY2VvZiBrKXJldHVybiBuZXcgUChlLngsZS55LDApO2lmKGUgaW5zdGFuY2VvZiBQKXJldHVybiBlO2lmKEFycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoPT09MilyZXR1cm4gbmV3IFAoZVswXSxlWzFdLDApO2lmKEFycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoPT09MylyZXR1cm4gbmV3IFAoZVswXSxlWzFdLGVbMl0pfSkuZmlsdGVyKEJvb2xlYW4pfXNldE1hdHJpeFdvcmxkKHQpe3RoaXMubWF0cml4V29ybGQ9dH1zZXRQb2ludHModCxlKXshdHx8dC5sZW5ndGg9PT0wfHwodGhpcy5fcG9pbnRzPXRoaXMuY29udmVydFRvVmVjdG9yM0FycmF5KHQpLHRoaXMucG9pbnRDb3VudD10aGlzLl9wb2ludHMubGVuZ3RoLGUmJih0aGlzLnNoYXBlRnVuY3Rpb249ZSx0aGlzLnNoYXBlPSJjdXN0b20iKSx0aGlzLmluaXRpYWxpemVHZW9tZXRyeSgpLHRoaXMudXBkYXRlR2VvbWV0cnkoKSl9aW5pdGlhbGl6ZUdlb21ldHJ5KCl7Y29uc3QgdD1uZXcgeHQobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvaW50Q291bnQqNiksMyksZT1uZXcgeHQobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvaW50Q291bnQqNiksMyksbj1uZXcgeHQobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvaW50Q291bnQqNiksMykscz1uZXcgeHQobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvaW50Q291bnQqMiksMSkscj1uZXcgeHQobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvaW50Q291bnQqMiksMSksbz1uZXcgeHQobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvaW50Q291bnQqMiksMSksYT1uZXcgeHQobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvaW50Q291bnQqNCksMiksYz1uZXcgeHQobmV3IFVpbnQxNkFycmF5KCh0aGlzLnBvaW50Q291bnQtMSkqNiksMSk7dGhpcy5zaGFwZT09PSJ0YXBlciImJih0aGlzLnNoYXBlRnVuY3Rpb249bD0+MSpNYXRoLnBvdyg0KmwqKDEtbCksMSkpO2ZvcihsZXQgbD0wLGg9MCx1PTA7bDx0aGlzLnBvaW50Q291bnQ7bCs9MSxoKz0yLHUrPTYpe3Muc2V0WChoLGwvdGhpcy5wb2ludENvdW50KSxzLnNldFgoaCsxLGwvdGhpcy5wb2ludENvdW50KSxyLnNldFgoaCwxKSxyLnNldFgoaCsxLC0xKTtjb25zdCBmPXRoaXMuc2hhcGU9PT0ibm9uZSI/MTp0aGlzLnNoYXBlRnVuY3Rpb24obC8odGhpcy5wb2ludENvdW50LTEpKTtvLnNldFgoaCxmKSxvLnNldFgoaCsxLGYpO2NvbnN0IGQ9bC8odGhpcy5wb2ludENvdW50LTEpO2lmKGEuc2V0WFkoaCxkLDApLGEuc2V0WFkoaCsxLGQsMSksbDx0aGlzLnBvaW50Q291bnQtMSl7Y29uc3QgcD1sKjI7Yy5zZXRYKHUrMCxwKzApLGMuc2V0WCh1KzEscCsxKSxjLnNldFgodSsyLHArMiksYy5zZXRYKHUrMyxwKzIpLGMuc2V0WCh1KzQscCsxKSxjLnNldFgodSs1LHArMyl9fXRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsdCksdGhpcy5zZXRBdHRyaWJ1dGUoInByZXZpb3VzIixlKSx0aGlzLnNldEF0dHJpYnV0ZSgibmV4dCIsbiksdGhpcy5zZXRBdHRyaWJ1dGUoImNvdW50ZXJzIixzKSx0aGlzLnNldEF0dHJpYnV0ZSgic2lkZSIsciksdGhpcy5zZXRBdHRyaWJ1dGUoIndpZHRoIixvKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLGEpLHRoaXMuc2V0SW5kZXgoYyl9dXBkYXRlR2VvbWV0cnkoKXtpZighdGhpcy5fcG9pbnRzWzBdKXJldHVybjtjb25zdCB0PXRoaXMuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLGU9dGhpcy5nZXRBdHRyaWJ1dGUoInByZXZpb3VzIiksbj10aGlzLmdldEF0dHJpYnV0ZSgibmV4dCIpO2xldCBzPTAscj0wLG89MDtjb25zdCBhPXRoaXMuX3BvaW50c1swXTtlLnNldFhZWihyLGEueCxhLnksYS56KSxyKz0xLGUuc2V0WFlaKHIsYS54LGEueSxhLnopLHIrPTE7Zm9yKGxldCBsPTA7bDx0aGlzLnBvaW50Q291bnQ7bCsrKXtjb25zdCBoPXRoaXMuX3BvaW50c1tsXTt0LnNldFhZWihzLGgueCxoLnksaC56KSxzKz0xLHQuc2V0WFlaKHMsaC54LGgueSxoLnopLHMrPTEsbDx0aGlzLnBvaW50Q291bnQtMSYmKGUuc2V0WFlaKHIsaC54LGgueSxoLnopLHIrPTEsZS5zZXRYWVoocixoLngsaC55LGgueikscis9MSksbD4wJiZsKzE8PXRoaXMucG9pbnRDb3VudCYmKG4uc2V0WFlaKG8saC54LGgueSxoLnopLG8rPTEsbi5zZXRYWVoobyxoLngsaC55LGgueiksbys9MSl9Y29uc3QgYz10aGlzLl9wb2ludHNbdGhpcy5wb2ludENvdW50LTFdO24uc2V0WFlaKG8sYy54LGMueSxjLnopLG8rPTEsbi5zZXRYWVoobyxjLngsYy55LGMueiksbys9MSx0Lm5lZWRzVXBkYXRlPSEwLGUubmVlZHNVcGRhdGU9ITAsbi5uZWVkc1VwZGF0ZT0hMCx0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCl9Z2V0IHBvaW50cygpe3JldHVybiB0aGlzLl9wb2ludHN9c2V0IHBvaW50cyh0KXt0aGlzLnNldFBvaW50cyh0KX11cGRhdGVQb2ludHModCxlKXtjb25zdCBuPXRoaXMuY29udmVydFRvVmVjdG9yM0FycmF5KHQpO2lmKG4ubGVuZ3RoIT09dGhpcy5wb2ludENvdW50KXtjb25zb2xlLndhcm4oIk1lc2hMaW5lR2VvbWV0cnk6IENhbm5vdCB1cGRhdGUgcG9pbnRzIHdpdGggZGlmZmVyZW50IGxlbmd0aC4gVXNlIHNldFBvaW50cygpIGluc3RlYWQuIik7cmV0dXJufXRoaXMuX3BvaW50cz1uLGUmJih0aGlzLnNoYXBlRnVuY3Rpb249ZSx0aGlzLnNoYXBlPSJjdXN0b20iLHRoaXMuaW5pdGlhbGl6ZUdlb21ldHJ5KCkpLHRoaXMudXBkYXRlR2VvbWV0cnkoKX1zZXRTaGFwZSh0LGUpe3RoaXMuc2hhcGU9dCxlJiYodGhpcy5zaGFwZUZ1bmN0aW9uPWUpLHRoaXMuX3BvaW50cy5sZW5ndGg+MCYmKHRoaXMuaW5pdGlhbGl6ZUdlb21ldHJ5KCksdGhpcy51cGRhdGVHZW9tZXRyeSgpKX19dmFyIG11PWk9Pntjb25zdHtzZXRQb2ludFdpZHRoOnQsbm9kZXM6ZX09aSxuPW5ldyBYeTtyZXR1cm4gbi5zZXRQb2ludHMoZSx0KSxufTtjb25zdCBaeT0oe2Nvb3JkaW5hdGVzOmksbGVuZ3Roczp0LG1ldGFMZW5ndGg6ZSxwcm9qZWN0aW9uOm4sdXNlR3JvdXBzOnMsc3BsaXRQb2x5Z29uczpyfSk9Pntjb25zdCBvPW4mJmlzKG4pLHtjb29yZGluYXRlc0FycjphLG1ldGFBcnJheTpjfT1zcyh7Y29vcmRpbmF0ZXM6aSxsZW5ndGhzOnQsbWV0YUxlbmd0aDplfSk7bGV0IGw9YS5tYXAoZj0+WHIoZixvKSksaD1jO2lmKHIpe2NvbnN0IGY9YWMobCxyLGgpO2w9Zi5zcGxpdFBvbHlnb25zLGg9Zi5zcGxpdE1ldGF9Y29uc3QgdT1sLm1hcCgoZixkKT0+e2NvbnN0IHA9aFtkXVswXXx8MTtyZXR1cm4gbXUoe25vZGVzOmYsc2V0UG9pbnRXaWR0aDooKT0+cH0pfSk7cmV0dXJuIHJzKHUscyl9O3ZhciBHeT1pPT57Y29uc3R7cG9pbnRzOnR9PWksZT10LnJlZHVjZSgocyxyLG8pPT4obzx0Lmxlbmd0aC0xJiZzLnB1c2gocix0W28rMV0pLHMpLFtdKTtyZXR1cm4gbmV3IEFlKCkuc2V0RnJvbVBvaW50cyhlKX07Y29uc3QgV3k9KHtjb29yZGluYXRlczppLGxlbmd0aHM6dCxtZXRhTGVuZ3RoOmUscHJvamVjdGlvbjpuLHVzZUdyb3VwczpzLHNwbGl0UG9seWdvbnM6cn0pPT57Y29uc3Qgbz1uJiZpcyhuKSx7Y29vcmRpbmF0ZXNBcnI6YSxtZXRhQXJyYXk6Y309c3Moe2Nvb3JkaW5hdGVzOmksbGVuZ3Roczp0LG1ldGFMZW5ndGg6ZX0pO2xldCBsPWEubWFwKHU9PlhyKHUsbykpO3ImJihsPWFjKGwscixjKS5zcGxpdFBvbHlnb25zKTtjb25zdCBoPWwubWFwKCh1LGYpPT5HeSh7cG9pbnRzOnUubWFwKGQ9Pm5ldyBQKGQueCxkLnksMCkpfSkpO3JldHVybiBycyhoLHMpfTtmdW5jdGlvbiBIeShpLHQsZT0yKXtjb25zdCBuPXQmJnQubGVuZ3RoLHM9bj90WzBdKmU6aS5sZW5ndGg7bGV0IHI9Z3UoaSwwLHMsZSwhMCk7Y29uc3Qgbz1bXTtpZighcnx8ci5uZXh0PT09ci5wcmV2KXJldHVybiBvO2xldCBhLGMsbDtpZihuJiYocj1LeShpLHQscixlKSksaS5sZW5ndGg+ODAqZSl7YT1pWzBdLGM9aVsxXTtsZXQgaD1hLHU9Yztmb3IobGV0IGY9ZTtmPHM7Zis9ZSl7Y29uc3QgZD1pW2ZdLHA9aVtmKzFdO2Q8YSYmKGE9ZCkscDxjJiYoYz1wKSxkPmgmJihoPWQpLHA+dSYmKHU9cCl9bD1NYXRoLm1heChoLWEsdS1jKSxsPWwhPT0wPzMyNzY3L2w6MH1yZXR1cm4gb3MocixvLGUsYSxjLGwsMCksb31mdW5jdGlvbiBndShpLHQsZSxuLHMpe2xldCByO2lmKHM9PT1obShpLHQsZSxuKT4wKWZvcihsZXQgbz10O288ZTtvKz1uKXI9TXUoby9ufDAsaVtvXSxpW28rMV0scik7ZWxzZSBmb3IobGV0IG89ZS1uO28+PXQ7by09bilyPU11KG8vbnwwLGlbb10saVtvKzFdLHIpO3JldHVybiByJiZ4aShyLHIubmV4dCkmJihscyhyKSxyPXIubmV4dCkscn1mdW5jdGlvbiBObihpLHQpe2lmKCFpKXJldHVybiBpO3R8fCh0PWkpO2xldCBlPWksbjtkbyBpZihuPSExLCFlLnN0ZWluZXImJih4aShlLGUubmV4dCl8fGF0KGUucHJldixlLGUubmV4dCk9PT0wKSl7aWYobHMoZSksZT10PWUucHJldixlPT09ZS5uZXh0KWJyZWFrO249ITB9ZWxzZSBlPWUubmV4dDt3aGlsZShufHxlIT09dCk7cmV0dXJuIHR9ZnVuY3Rpb24gb3MoaSx0LGUsbixzLHIsbyl7aWYoIWkpcmV0dXJuOyFvJiZyJiZzbShpLG4scyxyKTtsZXQgYT1pO2Zvcig7aS5wcmV2IT09aS5uZXh0Oyl7Y29uc3QgYz1pLnByZXYsbD1pLm5leHQ7aWYocj9ZeShpLG4scyxyKTpKeShpKSl7dC5wdXNoKGMuaSxpLmksbC5pKSxscyhpKSxpPWwubmV4dCxhPWwubmV4dDtjb250aW51ZX1pZihpPWwsaT09PWEpe28/bz09PTE/KGk9ankoTm4oaSksdCksb3MoaSx0LGUsbixzLHIsMikpOm89PT0yJiZReShpLHQsZSxuLHMscik6b3MoTm4oaSksdCxlLG4scyxyLDEpO2JyZWFrfX19ZnVuY3Rpb24gSnkoaSl7Y29uc3QgdD1pLnByZXYsZT1pLG49aS5uZXh0O2lmKGF0KHQsZSxuKT49MClyZXR1cm4hMTtjb25zdCBzPXQueCxyPWUueCxvPW4ueCxhPXQueSxjPWUueSxsPW4ueSxoPU1hdGgubWluKHMscixvKSx1PU1hdGgubWluKGEsYyxsKSxmPU1hdGgubWF4KHMscixvKSxkPU1hdGgubWF4KGEsYyxsKTtsZXQgcD1uLm5leHQ7Zm9yKDtwIT09dDspe2lmKHAueD49aCYmcC54PD1mJiZwLnk+PXUmJnAueTw9ZCYmYXMocyxhLHIsYyxvLGwscC54LHAueSkmJmF0KHAucHJldixwLHAubmV4dCk+PTApcmV0dXJuITE7cD1wLm5leHR9cmV0dXJuITB9ZnVuY3Rpb24gWXkoaSx0LGUsbil7Y29uc3Qgcz1pLnByZXYscj1pLG89aS5uZXh0O2lmKGF0KHMscixvKT49MClyZXR1cm4hMTtjb25zdCBhPXMueCxjPXIueCxsPW8ueCxoPXMueSx1PXIueSxmPW8ueSxkPU1hdGgubWluKGEsYyxsKSxwPU1hdGgubWluKGgsdSxmKSx5PU1hdGgubWF4KGEsYyxsKSxnPU1hdGgubWF4KGgsdSxmKSx3PWNjKGQscCx0LGUsbiksYj1jYyh5LGcsdCxlLG4pO2xldCB4PWkucHJldlosbT1pLm5leHRaO2Zvcig7eCYmeC56Pj13JiZtJiZtLno8PWI7KXtpZih4Lng+PWQmJngueDw9eSYmeC55Pj1wJiZ4Lnk8PWcmJnghPT1zJiZ4IT09byYmYXMoYSxoLGMsdSxsLGYseC54LHgueSkmJmF0KHgucHJldix4LHgubmV4dCk+PTB8fCh4PXgucHJldlosbS54Pj1kJiZtLng8PXkmJm0ueT49cCYmbS55PD1nJiZtIT09cyYmbSE9PW8mJmFzKGEsaCxjLHUsbCxmLG0ueCxtLnkpJiZhdChtLnByZXYsbSxtLm5leHQpPj0wKSlyZXR1cm4hMTttPW0ubmV4dFp9Zm9yKDt4JiZ4Lno+PXc7KXtpZih4Lng+PWQmJngueDw9eSYmeC55Pj1wJiZ4Lnk8PWcmJnghPT1zJiZ4IT09byYmYXMoYSxoLGMsdSxsLGYseC54LHgueSkmJmF0KHgucHJldix4LHgubmV4dCk+PTApcmV0dXJuITE7eD14LnByZXZafWZvcig7bSYmbS56PD1iOyl7aWYobS54Pj1kJiZtLng8PXkmJm0ueT49cCYmbS55PD1nJiZtIT09cyYmbSE9PW8mJmFzKGEsaCxjLHUsbCxmLG0ueCxtLnkpJiZhdChtLnByZXYsbSxtLm5leHQpPj0wKXJldHVybiExO209bS5uZXh0Wn1yZXR1cm4hMH1mdW5jdGlvbiBqeShpLHQpe2xldCBlPWk7ZG97Y29uc3Qgbj1lLnByZXYscz1lLm5leHQubmV4dDsheGkobixzKSYmd3UobixlLGUubmV4dCxzKSYmY3MobixzKSYmY3MocyxuKSYmKHQucHVzaChuLmksZS5pLHMuaSksbHMoZSksbHMoZS5uZXh0KSxlPWk9cyksZT1lLm5leHR9d2hpbGUoZSE9PWkpO3JldHVybiBObihlKX1mdW5jdGlvbiBReShpLHQsZSxuLHMscil7bGV0IG89aTtkb3tsZXQgYT1vLm5leHQubmV4dDtmb3IoO2EhPT1vLnByZXY7KXtpZihvLmkhPT1hLmkmJmFtKG8sYSkpe2xldCBjPWJ1KG8sYSk7bz1ObihvLG8ubmV4dCksYz1ObihjLGMubmV4dCksb3Mobyx0LGUsbixzLHIsMCksb3MoYyx0LGUsbixzLHIsMCk7cmV0dXJufWE9YS5uZXh0fW89by5uZXh0fXdoaWxlKG8hPT1pKX1mdW5jdGlvbiBLeShpLHQsZSxuKXtjb25zdCBzPVtdO2ZvcihsZXQgcj0wLG89dC5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT10W3JdKm4sYz1yPG8tMT90W3IrMV0qbjppLmxlbmd0aCxsPWd1KGksYSxjLG4sITEpO2w9PT1sLm5leHQmJihsLnN0ZWluZXI9ITApLHMucHVzaChvbShsKSl9cy5zb3J0KHRtKTtmb3IobGV0IHI9MDtyPHMubGVuZ3RoO3IrKyllPWVtKHNbcl0sZSk7cmV0dXJuIGV9ZnVuY3Rpb24gdG0oaSx0KXtsZXQgZT1pLngtdC54O2lmKGU9PT0wJiYoZT1pLnktdC55LGU9PT0wKSl7Y29uc3Qgbj0oaS5uZXh0LnktaS55KS8oaS5uZXh0LngtaS54KSxzPSh0Lm5leHQueS10LnkpLyh0Lm5leHQueC10LngpO2U9bi1zfXJldHVybiBlfWZ1bmN0aW9uIGVtKGksdCl7Y29uc3QgZT1ubShpLHQpO2lmKCFlKXJldHVybiB0O2NvbnN0IG49YnUoZSxpKTtyZXR1cm4gTm4obixuLm5leHQpLE5uKGUsZS5uZXh0KX1mdW5jdGlvbiBubShpLHQpe2xldCBlPXQ7Y29uc3Qgbj1pLngscz1pLnk7bGV0IHI9LTEvMCxvO2lmKHhpKGksZSkpcmV0dXJuIGU7ZG97aWYoeGkoaSxlLm5leHQpKXJldHVybiBlLm5leHQ7aWYoczw9ZS55JiZzPj1lLm5leHQueSYmZS5uZXh0LnkhPT1lLnkpe2NvbnN0IHU9ZS54KyhzLWUueSkqKGUubmV4dC54LWUueCkvKGUubmV4dC55LWUueSk7aWYodTw9biYmdT5yJiYocj11LG89ZS54PGUubmV4dC54P2U6ZS5uZXh0LHU9PT1uKSlyZXR1cm4gb31lPWUubmV4dH13aGlsZShlIT09dCk7aWYoIW8pcmV0dXJuIG51bGw7Y29uc3QgYT1vLGM9by54LGw9by55O2xldCBoPTEvMDtlPW87ZG97aWYobj49ZS54JiZlLng+PWMmJm4hPT1lLngmJnh1KHM8bD9uOnIscyxjLGwsczxsP3I6bixzLGUueCxlLnkpKXtjb25zdCB1PU1hdGguYWJzKHMtZS55KS8obi1lLngpO2NzKGUsaSkmJih1PGh8fHU9PT1oJiYoZS54Pm8ueHx8ZS54PT09by54JiZpbShvLGUpKSkmJihvPWUsaD11KX1lPWUubmV4dH13aGlsZShlIT09YSk7cmV0dXJuIG99ZnVuY3Rpb24gaW0oaSx0KXtyZXR1cm4gYXQoaS5wcmV2LGksdC5wcmV2KTwwJiZhdCh0Lm5leHQsaSxpLm5leHQpPDB9ZnVuY3Rpb24gc20oaSx0LGUsbil7bGV0IHM9aTtkbyBzLno9PT0wJiYocy56PWNjKHMueCxzLnksdCxlLG4pKSxzLnByZXZaPXMucHJldixzLm5leHRaPXMubmV4dCxzPXMubmV4dDt3aGlsZShzIT09aSk7cy5wcmV2Wi5uZXh0Wj1udWxsLHMucHJldlo9bnVsbCxybShzKX1mdW5jdGlvbiBybShpKXtsZXQgdCxlPTE7ZG97bGV0IG49aSxzO2k9bnVsbDtsZXQgcj1udWxsO2Zvcih0PTA7bjspe3QrKztsZXQgbz1uLGE9MDtmb3IobGV0IGw9MDtsPGUmJihhKyssbz1vLm5leHRaLCEhbyk7bCsrKTtsZXQgYz1lO2Zvcig7YT4wfHxjPjAmJm87KWEhPT0wJiYoYz09PTB8fCFvfHxuLno8PW8ueik/KHM9bixuPW4ubmV4dFosYS0tKToocz1vLG89by5uZXh0WixjLS0pLHI/ci5uZXh0Wj1zOmk9cyxzLnByZXZaPXIscj1zO249b31yLm5leHRaPW51bGwsZSo9Mn13aGlsZSh0PjEpO3JldHVybiBpfWZ1bmN0aW9uIGNjKGksdCxlLG4scyl7cmV0dXJuIGk9KGktZSkqc3wwLHQ9KHQtbikqc3wwLGk9KGl8aTw8OCkmMTY3MTE5MzUsaT0oaXxpPDw0KSYyNTI2NDUxMzUsaT0oaXxpPDwyKSY4NTg5OTM0NTksaT0oaXxpPDwxKSYxNDMxNjU1NzY1LHQ9KHR8dDw8OCkmMTY3MTE5MzUsdD0odHx0PDw0KSYyNTI2NDUxMzUsdD0odHx0PDwyKSY4NTg5OTM0NTksdD0odHx0PDwxKSYxNDMxNjU1NzY1LGl8dDw8MX1mdW5jdGlvbiBvbShpKXtsZXQgdD1pLGU9aTtkbyh0Lng8ZS54fHx0Lng9PT1lLngmJnQueTxlLnkpJiYoZT10KSx0PXQubmV4dDt3aGlsZSh0IT09aSk7cmV0dXJuIGV9ZnVuY3Rpb24geHUoaSx0LGUsbixzLHIsbyxhKXtyZXR1cm4ocy1vKSoodC1hKT49KGktbykqKHItYSkmJihpLW8pKihuLWEpPj0oZS1vKSoodC1hKSYmKGUtbykqKHItYSk+PShzLW8pKihuLWEpfWZ1bmN0aW9uIGFzKGksdCxlLG4scyxyLG8sYSl7cmV0dXJuIShpPT09byYmdD09PWEpJiZ4dShpLHQsZSxuLHMscixvLGEpfWZ1bmN0aW9uIGFtKGksdCl7cmV0dXJuIGkubmV4dC5pIT09dC5pJiZpLnByZXYuaSE9PXQuaSYmIWNtKGksdCkmJihjcyhpLHQpJiZjcyh0LGkpJiZsbShpLHQpJiYoYXQoaS5wcmV2LGksdC5wcmV2KXx8YXQoaSx0LnByZXYsdCkpfHx4aShpLHQpJiZhdChpLnByZXYsaSxpLm5leHQpPjAmJmF0KHQucHJldix0LHQubmV4dCk+MCl9ZnVuY3Rpb24gYXQoaSx0LGUpe3JldHVybih0LnktaS55KSooZS54LXQueCktKHQueC1pLngpKihlLnktdC55KX1mdW5jdGlvbiB4aShpLHQpe3JldHVybiBpLng9PT10LngmJmkueT09PXQueX1mdW5jdGlvbiB3dShpLHQsZSxuKXtjb25zdCBzPUdyKGF0KGksdCxlKSkscj1HcihhdChpLHQsbikpLG89R3IoYXQoZSxuLGkpKSxhPUdyKGF0KGUsbix0KSk7cmV0dXJuISEocyE9PXImJm8hPT1hfHxzPT09MCYmWnIoaSxlLHQpfHxyPT09MCYmWnIoaSxuLHQpfHxvPT09MCYmWnIoZSxpLG4pfHxhPT09MCYmWnIoZSx0LG4pKX1mdW5jdGlvbiBacihpLHQsZSl7cmV0dXJuIHQueDw9TWF0aC5tYXgoaS54LGUueCkmJnQueD49TWF0aC5taW4oaS54LGUueCkmJnQueTw9TWF0aC5tYXgoaS55LGUueSkmJnQueT49TWF0aC5taW4oaS55LGUueSl9ZnVuY3Rpb24gR3IoaSl7cmV0dXJuIGk+MD8xOmk8MD8tMTowfWZ1bmN0aW9uIGNtKGksdCl7bGV0IGU9aTtkb3tpZihlLmkhPT1pLmkmJmUubmV4dC5pIT09aS5pJiZlLmkhPT10LmkmJmUubmV4dC5pIT09dC5pJiZ3dShlLGUubmV4dCxpLHQpKXJldHVybiEwO2U9ZS5uZXh0fXdoaWxlKGUhPT1pKTtyZXR1cm4hMX1mdW5jdGlvbiBjcyhpLHQpe3JldHVybiBhdChpLnByZXYsaSxpLm5leHQpPDA/YXQoaSx0LGkubmV4dCk+PTAmJmF0KGksaS5wcmV2LHQpPj0wOmF0KGksdCxpLnByZXYpPDB8fGF0KGksaS5uZXh0LHQpPDB9ZnVuY3Rpb24gbG0oaSx0KXtsZXQgZT1pLG49ITE7Y29uc3Qgcz0oaS54K3QueCkvMixyPShpLnkrdC55KS8yO2RvIGUueT5yIT1lLm5leHQueT5yJiZlLm5leHQueSE9PWUueSYmczwoZS5uZXh0LngtZS54KSooci1lLnkpLyhlLm5leHQueS1lLnkpK2UueCYmKG49IW4pLGU9ZS5uZXh0O3doaWxlKGUhPT1pKTtyZXR1cm4gbn1mdW5jdGlvbiBidShpLHQpe2NvbnN0IGU9bGMoaS5pLGkueCxpLnkpLG49bGModC5pLHQueCx0LnkpLHM9aS5uZXh0LHI9dC5wcmV2O3JldHVybiBpLm5leHQ9dCx0LnByZXY9aSxlLm5leHQ9cyxzLnByZXY9ZSxuLm5leHQ9ZSxlLnByZXY9bixyLm5leHQ9bixuLnByZXY9cixufWZ1bmN0aW9uIE11KGksdCxlLG4pe2NvbnN0IHM9bGMoaSx0LGUpO3JldHVybiBuPyhzLm5leHQ9bi5uZXh0LHMucHJldj1uLG4ubmV4dC5wcmV2PXMsbi5uZXh0PXMpOihzLnByZXY9cyxzLm5leHQ9cyksc31mdW5jdGlvbiBscyhpKXtpLm5leHQucHJldj1pLnByZXYsaS5wcmV2Lm5leHQ9aS5uZXh0LGkucHJldlomJihpLnByZXZaLm5leHRaPWkubmV4dFopLGkubmV4dFomJihpLm5leHRaLnByZXZaPWkucHJldlopfWZ1bmN0aW9uIGxjKGksdCxlKXtyZXR1cm57aSx4OnQseTplLHByZXY6bnVsbCxuZXh0Om51bGwsejowLHByZXZaOm51bGwsbmV4dFo6bnVsbCxzdGVpbmVyOiExfX1mdW5jdGlvbiBobShpLHQsZSxuKXtsZXQgcz0wO2ZvcihsZXQgcj10LG89ZS1uO3I8ZTtyKz1uKXMrPShpW29dLWlbcl0pKihpW3IrMV0raVtvKzFdKSxvPXI7cmV0dXJuIHN9ZnVuY3Rpb24gQXUoaSl7Y29uc3QgdD1bXSxlPVtdLG49aVswXVswXS5sZW5ndGg7bGV0IHM9MCxyPTA7Zm9yKGNvbnN0IG8gb2YgaSl7Zm9yKGNvbnN0IGEgb2Ygbylmb3IobGV0IGM9MDtjPG47YysrKXQucHVzaChhW2NdKTtyJiYocys9cixlLnB1c2gocykpLHI9by5sZW5ndGh9cmV0dXJue3ZlcnRpY2VzOnQsaG9sZXM6ZSxkaW1lbnNpb25zOm59fWZ1bmN0aW9uIHVtKGkpe2lmKCFpKXRocm93IG5ldyBFcnJvcigiY29vcmQgaXMgcmVxdWlyZWQiKTtpZighQXJyYXkuaXNBcnJheShpKSl7aWYoaS50eXBlPT09IkZlYXR1cmUiJiZpLmdlb21ldHJ5IT09bnVsbCYmaS5nZW9tZXRyeS50eXBlPT09IlBvaW50IilyZXR1cm5bLi4uaS5nZW9tZXRyeS5jb29yZGluYXRlc107aWYoaS50eXBlPT09IlBvaW50IilyZXR1cm5bLi4uaS5jb29yZGluYXRlc119aWYoQXJyYXkuaXNBcnJheShpKSYmaS5sZW5ndGg+PTImJiFBcnJheS5pc0FycmF5KGlbMF0pJiYhQXJyYXkuaXNBcnJheShpWzFdKSlyZXR1cm5bLi4uaV07dGhyb3cgbmV3IEVycm9yKCJjb29yZCBtdXN0IGJlIEdlb0pTT04gUG9pbnQgb3IgYW4gQXJyYXkgb2YgbnVtYmVycyIpfWZ1bmN0aW9uIGZtKGkpe2lmKEFycmF5LmlzQXJyYXkoaSkpcmV0dXJuIGk7aWYoaS50eXBlPT09IkZlYXR1cmUiKXtpZihpLmdlb21ldHJ5IT09bnVsbClyZXR1cm4gaS5nZW9tZXRyeS5jb29yZGluYXRlc31lbHNlIGlmKGkuY29vcmRpbmF0ZXMpcmV0dXJuIGkuY29vcmRpbmF0ZXM7dGhyb3cgbmV3IEVycm9yKCJjb29yZHMgbXVzdCBiZSBHZW9KU09OIEZlYXR1cmUsIEdlb21ldHJ5IE9iamVjdCBvciBhbiBBcnJheSIpfWZ1bmN0aW9uIGRtKGkpe3JldHVybiBpLnR5cGU9PT0iRmVhdHVyZSI/aS5nZW9tZXRyeTppfWZ1bmN0aW9uIHBtKGkpe2NvbnN0IHQ9Zm0oaSk7bGV0IGU9MCxuPTEscyxyO2Zvcig7bjx0Lmxlbmd0aDspcz1yfHx0WzBdLHI9dFtuXSxlKz0oclswXS1zWzBdKSooclsxXStzWzFdKSxuKys7cmV0dXJuIGU+MH12YXIgeW09cG07Y29uc3QgSmU9MTExMDIyMzAyNDYyNTE1NjVlLTMyLEJ0PTEzNDIxNzcyOSxtbT0oMys4KkplKSpKZTtmdW5jdGlvbiBoYyhpLHQsZSxuLHMpe2xldCByLG8sYSxjLGw9dFswXSxoPW5bMF0sdT0wLGY9MDtoPmw9PWg+LWw/KHI9bCxsPXRbKyt1XSk6KHI9aCxoPW5bKytmXSk7bGV0IGQ9MDtpZih1PGkmJmY8ZSlmb3IoaD5sPT1oPi1sPyhvPWwrcixhPXItKG8tbCksbD10WysrdV0pOihvPWgrcixhPXItKG8taCksaD1uWysrZl0pLHI9byxhIT09MCYmKHNbZCsrXT1hKTt1PGkmJmY8ZTspaD5sPT1oPi1sPyhvPXIrbCxjPW8tcixhPXItKG8tYykrKGwtYyksbD10WysrdV0pOihvPXIraCxjPW8tcixhPXItKG8tYykrKGgtYyksaD1uWysrZl0pLHI9byxhIT09MCYmKHNbZCsrXT1hKTtmb3IoO3U8aTspbz1yK2wsYz1vLXIsYT1yLShvLWMpKyhsLWMpLGw9dFsrK3VdLHI9byxhIT09MCYmKHNbZCsrXT1hKTtmb3IoO2Y8ZTspbz1yK2gsYz1vLXIsYT1yLShvLWMpKyhoLWMpLGg9blsrK2ZdLHI9byxhIT09MCYmKHNbZCsrXT1hKTtyZXR1cm4ociE9PTB8fGQ9PT0wKSYmKHNbZCsrXT1yKSxkfWZ1bmN0aW9uIGdtKGksdCl7bGV0IGU9dFswXTtmb3IobGV0IG49MTtuPGk7bisrKWUrPXRbbl07cmV0dXJuIGV9ZnVuY3Rpb24gaHMoaSl7cmV0dXJuIG5ldyBGbG9hdDY0QXJyYXkoaSl9Y29uc3QgeG09KDMrMTYqSmUpKkplLHdtPSgyKzEyKkplKSpKZSxibT0oOSs2NCpKZSkqSmUqSmUsd2k9aHMoNCksU3U9aHMoOCksdnU9aHMoMTIpLF91PWhzKDE2KSxWdD1ocyg0KTtmdW5jdGlvbiBNbShpLHQsZSxuLHMscixvKXtsZXQgYSxjLGwsaCx1LGYsZCxwLHksZyx3LGIseCxtLE0sUyxBLHY7Y29uc3QgXz1pLXMsVD1lLXMsej10LXIsQz1uLXI7bT1fKkMsZj1CdCpfLGQ9Zi0oZi1fKSxwPV8tZCxmPUJ0KkMseT1mLShmLUMpLGc9Qy15LE09cCpnLShtLWQqeS1wKnktZCpnKSxTPXoqVCxmPUJ0KnosZD1mLShmLXopLHA9ei1kLGY9QnQqVCx5PWYtKGYtVCksZz1ULXksQT1wKmctKFMtZCp5LXAqeS1kKmcpLHc9TS1BLHU9TS13LHdpWzBdPU0tKHcrdSkrKHUtQSksYj1tK3csdT1iLW0seD1tLShiLXUpKyh3LXUpLHc9eC1TLHU9eC13LHdpWzFdPXgtKHcrdSkrKHUtUyksdj1iK3csdT12LWIsd2lbMl09Yi0odi11KSsody11KSx3aVszXT12O2xldCBFPWdtKDQsd2kpLEY9d20qbztpZihFPj1GfHwtRT49Rnx8KHU9aS1fLGE9aS0oXyt1KSsodS1zKSx1PWUtVCxsPWUtKFQrdSkrKHUtcyksdT10LXosYz10LSh6K3UpKyh1LXIpLHU9bi1DLGg9bi0oQyt1KSsodS1yKSxhPT09MCYmYz09PTAmJmw9PT0wJiZoPT09MCl8fChGPWJtKm8rbW0qTWF0aC5hYnMoRSksRSs9XypoK0MqYS0oeipsK1QqYyksRT49Rnx8LUU+PUYpKXJldHVybiBFO209YSpDLGY9QnQqYSxkPWYtKGYtYSkscD1hLWQsZj1CdCpDLHk9Zi0oZi1DKSxnPUMteSxNPXAqZy0obS1kKnktcCp5LWQqZyksUz1jKlQsZj1CdCpjLGQ9Zi0oZi1jKSxwPWMtZCxmPUJ0KlQseT1mLShmLVQpLGc9VC15LEE9cCpnLShTLWQqeS1wKnktZCpnKSx3PU0tQSx1PU0tdyxWdFswXT1NLSh3K3UpKyh1LUEpLGI9bSt3LHU9Yi1tLHg9bS0oYi11KSsody11KSx3PXgtUyx1PXgtdyxWdFsxXT14LSh3K3UpKyh1LVMpLHY9Yit3LHU9di1iLFZ0WzJdPWItKHYtdSkrKHctdSksVnRbM109djtjb25zdCBCPWhjKDQsd2ksNCxWdCxTdSk7bT1fKmgsZj1CdCpfLGQ9Zi0oZi1fKSxwPV8tZCxmPUJ0KmgseT1mLShmLWgpLGc9aC15LE09cCpnLShtLWQqeS1wKnktZCpnKSxTPXoqbCxmPUJ0KnosZD1mLShmLXopLHA9ei1kLGY9QnQqbCx5PWYtKGYtbCksZz1sLXksQT1wKmctKFMtZCp5LXAqeS1kKmcpLHc9TS1BLHU9TS13LFZ0WzBdPU0tKHcrdSkrKHUtQSksYj1tK3csdT1iLW0seD1tLShiLXUpKyh3LXUpLHc9eC1TLHU9eC13LFZ0WzFdPXgtKHcrdSkrKHUtUyksdj1iK3csdT12LWIsVnRbMl09Yi0odi11KSsody11KSxWdFszXT12O2NvbnN0IEk9aGMoQixTdSw0LFZ0LHZ1KTttPWEqaCxmPUJ0KmEsZD1mLShmLWEpLHA9YS1kLGY9QnQqaCx5PWYtKGYtaCksZz1oLXksTT1wKmctKG0tZCp5LXAqeS1kKmcpLFM9YypsLGY9QnQqYyxkPWYtKGYtYykscD1jLWQsZj1CdCpsLHk9Zi0oZi1sKSxnPWwteSxBPXAqZy0oUy1kKnktcCp5LWQqZyksdz1NLUEsdT1NLXcsVnRbMF09TS0odyt1KSsodS1BKSxiPW0rdyx1PWItbSx4PW0tKGItdSkrKHctdSksdz14LVMsdT14LXcsVnRbMV09eC0odyt1KSsodS1TKSx2PWIrdyx1PXYtYixWdFsyXT1iLSh2LXUpKyh3LXUpLFZ0WzNdPXY7Y29uc3QgUj1oYyhJLHZ1LDQsVnQsX3UpO3JldHVybiBfdVtSLTFdfWZ1bmN0aW9uIFdyKGksdCxlLG4scyxyKXtjb25zdCBvPSh0LXIpKihlLXMpLGE9KGktcykqKG4tciksYz1vLWEsbD1NYXRoLmFicyhvK2EpO3JldHVybiBNYXRoLmFicyhjKT49eG0qbD9jOi1NbShpLHQsZSxuLHMscixsKX1jb25zdCB6dT1NYXRoLnBvdygyLC01MiksSHI9bmV3IFVpbnQzMkFycmF5KDUxMik7Y2xhc3MgdXN7c3RhdGljIGZyb20odCxlPXptLG49VG0pe2NvbnN0IHM9dC5sZW5ndGgscj1uZXcgRmxvYXQ2NEFycmF5KHMqMik7Zm9yKGxldCBvPTA7bzxzO28rKyl7Y29uc3QgYT10W29dO3JbMipvXT1lKGEpLHJbMipvKzFdPW4oYSl9cmV0dXJuIG5ldyB1cyhyKX1jb25zdHJ1Y3Rvcih0KXtjb25zdCBlPXQubGVuZ3RoPj4xO2lmKGU+MCYmdHlwZW9mIHRbMF0hPSJudW1iZXIiKXRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgY29vcmRzIHRvIGNvbnRhaW4gbnVtYmVycy4iKTt0aGlzLmNvb3Jkcz10O2NvbnN0IG49TWF0aC5tYXgoMiplLTUsMCk7dGhpcy5fdHJpYW5nbGVzPW5ldyBVaW50MzJBcnJheShuKjMpLHRoaXMuX2hhbGZlZGdlcz1uZXcgSW50MzJBcnJheShuKjMpLHRoaXMuX2hhc2hTaXplPU1hdGguY2VpbChNYXRoLnNxcnQoZSkpLHRoaXMuX2h1bGxQcmV2PW5ldyBVaW50MzJBcnJheShlKSx0aGlzLl9odWxsTmV4dD1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5faHVsbFRyaT1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5faHVsbEhhc2g9bmV3IEludDMyQXJyYXkodGhpcy5faGFzaFNpemUpLHRoaXMuX2lkcz1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5fZGlzdHM9bmV3IEZsb2F0NjRBcnJheShlKSx0aGlzLnVwZGF0ZSgpfXVwZGF0ZSgpe2NvbnN0e2Nvb3Jkczp0LF9odWxsUHJldjplLF9odWxsTmV4dDpuLF9odWxsVHJpOnMsX2h1bGxIYXNoOnJ9PXRoaXMsbz10Lmxlbmd0aD4+MTtsZXQgYT0xLzAsYz0xLzAsbD0tMS8wLGg9LTEvMDtmb3IobGV0IF89MDtfPG87XysrKXtjb25zdCBUPXRbMipfXSx6PXRbMipfKzFdO1Q8YSYmKGE9VCksejxjJiYoYz16KSxUPmwmJihsPVQpLHo+aCYmKGg9eiksdGhpcy5faWRzW19dPV99Y29uc3QgdT0oYStsKS8yLGY9KGMraCkvMjtsZXQgZCxwLHk7Zm9yKGxldCBfPTAsVD0xLzA7XzxvO18rKyl7Y29uc3Qgej11Yyh1LGYsdFsyKl9dLHRbMipfKzFdKTt6PFQmJihkPV8sVD16KX1jb25zdCBnPXRbMipkXSx3PXRbMipkKzFdO2ZvcihsZXQgXz0wLFQ9MS8wO188bztfKyspe2lmKF89PT1kKWNvbnRpbnVlO2NvbnN0IHo9dWMoZyx3LHRbMipfXSx0WzIqXysxXSk7ejxUJiZ6PjAmJihwPV8sVD16KX1sZXQgYj10WzIqcF0seD10WzIqcCsxXSxtPTEvMDtmb3IobGV0IF89MDtfPG87XysrKXtpZihfPT09ZHx8Xz09PXApY29udGludWU7Y29uc3QgVD12bShnLHcsYix4LHRbMipfXSx0WzIqXysxXSk7VDxtJiYoeT1fLG09VCl9bGV0IE09dFsyKnldLFM9dFsyKnkrMV07aWYobT09PTEvMCl7Zm9yKGxldCB6PTA7ejxvO3orKyl0aGlzLl9kaXN0c1t6XT10WzIqel0tdFswXXx8dFsyKnorMV0tdFsxXTtiaSh0aGlzLl9pZHMsdGhpcy5fZGlzdHMsMCxvLTEpO2NvbnN0IF89bmV3IFVpbnQzMkFycmF5KG8pO2xldCBUPTA7Zm9yKGxldCB6PTAsQz0tMS8wO3o8bzt6Kyspe2NvbnN0IEU9dGhpcy5faWRzW3pdLEY9dGhpcy5fZGlzdHNbRV07Rj5DJiYoX1tUKytdPUUsQz1GKX10aGlzLmh1bGw9Xy5zdWJhcnJheSgwLFQpLHRoaXMudHJpYW5nbGVzPW5ldyBVaW50MzJBcnJheSgwKSx0aGlzLmhhbGZlZGdlcz1uZXcgVWludDMyQXJyYXkoMCk7cmV0dXJufWlmKFdyKGcsdyxiLHgsTSxTKTwwKXtjb25zdCBfPXAsVD1iLHo9eDtwPXksYj1NLHg9Uyx5PV8sTT1ULFM9en1jb25zdCBBPV9tKGcsdyxiLHgsTSxTKTt0aGlzLl9jeD1BLngsdGhpcy5fY3k9QS55O2ZvcihsZXQgXz0wO188bztfKyspdGhpcy5fZGlzdHNbX109dWModFsyKl9dLHRbMipfKzFdLEEueCxBLnkpO2JpKHRoaXMuX2lkcyx0aGlzLl9kaXN0cywwLG8tMSksdGhpcy5faHVsbFN0YXJ0PWQ7bGV0IHY9MztuW2RdPWVbeV09cCxuW3BdPWVbZF09eSxuW3ldPWVbcF09ZCxzW2RdPTAsc1twXT0xLHNbeV09MixyLmZpbGwoLTEpLHJbdGhpcy5faGFzaEtleShnLHcpXT1kLHJbdGhpcy5faGFzaEtleShiLHgpXT1wLHJbdGhpcy5faGFzaEtleShNLFMpXT15LHRoaXMudHJpYW5nbGVzTGVuPTAsdGhpcy5fYWRkVHJpYW5nbGUoZCxwLHksLTEsLTEsLTEpO2ZvcihsZXQgXz0wLFQsejtfPHRoaXMuX2lkcy5sZW5ndGg7XysrKXtjb25zdCBDPXRoaXMuX2lkc1tfXSxFPXRbMipDXSxGPXRbMipDKzFdO2lmKF8+MCYmTWF0aC5hYnMoRS1UKTw9enUmJk1hdGguYWJzKEYteik8PXp1fHwoVD1FLHo9RixDPT09ZHx8Qz09PXB8fEM9PT15KSljb250aW51ZTtsZXQgQj0wO2ZvcihsZXQgSz0wLGN0PXRoaXMuX2hhc2hLZXkoRSxGKTtLPHRoaXMuX2hhc2hTaXplJiYoQj1yWyhjdCtLKSV0aGlzLl9oYXNoU2l6ZV0sIShCIT09LTEmJkIhPT1uW0JdKSk7SysrKTtCPWVbQl07bGV0IEk9QixSO2Zvcig7Uj1uW0ldLFdyKEUsRix0WzIqSV0sdFsyKkkrMV0sdFsyKlJdLHRbMipSKzFdKT49MDspaWYoST1SLEk9PT1CKXtJPS0xO2JyZWFrfWlmKEk9PT0tMSljb250aW51ZTtsZXQgVj10aGlzLl9hZGRUcmlhbmdsZShJLEMsbltJXSwtMSwtMSxzW0ldKTtzW0NdPXRoaXMuX2xlZ2FsaXplKFYrMiksc1tJXT1WLHYrKztsZXQgVT1uW0ldO2Zvcig7Uj1uW1VdLFdyKEUsRix0WzIqVV0sdFsyKlUrMV0sdFsyKlJdLHRbMipSKzFdKTwwOylWPXRoaXMuX2FkZFRyaWFuZ2xlKFUsQyxSLHNbQ10sLTEsc1tVXSksc1tDXT10aGlzLl9sZWdhbGl6ZShWKzIpLG5bVV09VSx2LS0sVT1SO2lmKEk9PT1CKWZvcig7Uj1lW0ldLFdyKEUsRix0WzIqUl0sdFsyKlIrMV0sdFsyKkldLHRbMipJKzFdKTwwOylWPXRoaXMuX2FkZFRyaWFuZ2xlKFIsQyxJLC0xLHNbSV0sc1tSXSksdGhpcy5fbGVnYWxpemUoVisyKSxzW1JdPVYsbltJXT1JLHYtLSxJPVI7dGhpcy5faHVsbFN0YXJ0PWVbQ109SSxuW0ldPWVbVV09QyxuW0NdPVUsclt0aGlzLl9oYXNoS2V5KEUsRildPUMsclt0aGlzLl9oYXNoS2V5KHRbMipJXSx0WzIqSSsxXSldPUl9dGhpcy5odWxsPW5ldyBVaW50MzJBcnJheSh2KTtmb3IobGV0IF89MCxUPXRoaXMuX2h1bGxTdGFydDtfPHY7XysrKXRoaXMuaHVsbFtfXT1ULFQ9bltUXTt0aGlzLnRyaWFuZ2xlcz10aGlzLl90cmlhbmdsZXMuc3ViYXJyYXkoMCx0aGlzLnRyaWFuZ2xlc0xlbiksdGhpcy5oYWxmZWRnZXM9dGhpcy5faGFsZmVkZ2VzLnN1YmFycmF5KDAsdGhpcy50cmlhbmdsZXNMZW4pfV9oYXNoS2V5KHQsZSl7cmV0dXJuIE1hdGguZmxvb3IoQW0odC10aGlzLl9jeCxlLXRoaXMuX2N5KSp0aGlzLl9oYXNoU2l6ZSkldGhpcy5faGFzaFNpemV9X2xlZ2FsaXplKHQpe2NvbnN0e190cmlhbmdsZXM6ZSxfaGFsZmVkZ2VzOm4sY29vcmRzOnN9PXRoaXM7bGV0IHI9MCxvPTA7Zm9yKDs7KXtjb25zdCBhPW5bdF0sYz10LXQlMztpZihvPWMrKHQrMiklMyxhPT09LTEpe2lmKHI9PT0wKWJyZWFrO3Q9SHJbLS1yXTtjb250aW51ZX1jb25zdCBsPWEtYSUzLGg9YysodCsxKSUzLHU9bCsoYSsyKSUzLGY9ZVtvXSxkPWVbdF0scD1lW2hdLHk9ZVt1XTtpZihTbShzWzIqZl0sc1syKmYrMV0sc1syKmRdLHNbMipkKzFdLHNbMipwXSxzWzIqcCsxXSxzWzIqeV0sc1syKnkrMV0pKXtlW3RdPXksZVthXT1mO2NvbnN0IHc9blt1XTtpZih3PT09LTEpe2xldCB4PXRoaXMuX2h1bGxTdGFydDtkb3tpZih0aGlzLl9odWxsVHJpW3hdPT09dSl7dGhpcy5faHVsbFRyaVt4XT10O2JyZWFrfXg9dGhpcy5faHVsbFByZXZbeF19d2hpbGUoeCE9PXRoaXMuX2h1bGxTdGFydCl9dGhpcy5fbGluayh0LHcpLHRoaXMuX2xpbmsoYSxuW29dKSx0aGlzLl9saW5rKG8sdSk7Y29uc3QgYj1sKyhhKzEpJTM7cjxIci5sZW5ndGgmJihIcltyKytdPWIpfWVsc2V7aWYocj09PTApYnJlYWs7dD1IclstLXJdfX1yZXR1cm4gb31fbGluayh0LGUpe3RoaXMuX2hhbGZlZGdlc1t0XT1lLGUhPT0tMSYmKHRoaXMuX2hhbGZlZGdlc1tlXT10KX1fYWRkVHJpYW5nbGUodCxlLG4scyxyLG8pe2NvbnN0IGE9dGhpcy50cmlhbmdsZXNMZW47cmV0dXJuIHRoaXMuX3RyaWFuZ2xlc1thXT10LHRoaXMuX3RyaWFuZ2xlc1thKzFdPWUsdGhpcy5fdHJpYW5nbGVzW2ErMl09bix0aGlzLl9saW5rKGEscyksdGhpcy5fbGluayhhKzEsciksdGhpcy5fbGluayhhKzIsbyksdGhpcy50cmlhbmdsZXNMZW4rPTMsYX19ZnVuY3Rpb24gQW0oaSx0KXtjb25zdCBlPWkvKE1hdGguYWJzKGkpK01hdGguYWJzKHQpKTtyZXR1cm4odD4wPzMtZToxK2UpLzR9ZnVuY3Rpb24gdWMoaSx0LGUsbil7Y29uc3Qgcz1pLWUscj10LW47cmV0dXJuIHMqcytyKnJ9ZnVuY3Rpb24gU20oaSx0LGUsbixzLHIsbyxhKXtjb25zdCBjPWktbyxsPXQtYSxoPWUtbyx1PW4tYSxmPXMtbyxkPXItYSxwPWMqYytsKmwseT1oKmgrdSp1LGc9ZipmK2QqZDtyZXR1cm4gYyoodSpnLXkqZCktbCooaCpnLXkqZikrcCooaCpkLXUqZik8MH1mdW5jdGlvbiB2bShpLHQsZSxuLHMscil7Y29uc3Qgbz1lLWksYT1uLXQsYz1zLWksbD1yLXQsaD1vKm8rYSphLHU9YypjK2wqbCxmPS41LyhvKmwtYSpjKSxkPShsKmgtYSp1KSpmLHA9KG8qdS1jKmgpKmY7cmV0dXJuIGQqZCtwKnB9ZnVuY3Rpb24gX20oaSx0LGUsbixzLHIpe2NvbnN0IG89ZS1pLGE9bi10LGM9cy1pLGw9ci10LGg9bypvK2EqYSx1PWMqYytsKmwsZj0uNS8obypsLWEqYyksZD1pKyhsKmgtYSp1KSpmLHA9dCsobyp1LWMqaCkqZjtyZXR1cm57eDpkLHk6cH19ZnVuY3Rpb24gYmkoaSx0LGUsbil7aWYobi1lPD0yMClmb3IobGV0IHM9ZSsxO3M8PW47cysrKXtjb25zdCByPWlbc10sbz10W3JdO2xldCBhPXMtMTtmb3IoO2E+PWUmJnRbaVthXV0+bzspaVthKzFdPWlbYS0tXTtpW2ErMV09cn1lbHNle2NvbnN0IHM9ZStuPj4xO2xldCByPWUrMSxvPW47ZnMoaSxzLHIpLHRbaVtlXV0+dFtpW25dXSYmZnMoaSxlLG4pLHRbaVtyXV0+dFtpW25dXSYmZnMoaSxyLG4pLHRbaVtlXV0+dFtpW3JdXSYmZnMoaSxlLHIpO2NvbnN0IGE9aVtyXSxjPXRbYV07Zm9yKDs7KXtkbyByKys7d2hpbGUodFtpW3JdXTxjKTtkbyBvLS07d2hpbGUodFtpW29dXT5jKTtpZihvPHIpYnJlYWs7ZnMoaSxyLG8pfWlbZSsxXT1pW29dLGlbb109YSxuLXIrMT49by1lPyhiaShpLHQscixuKSxiaShpLHQsZSxvLTEpKTooYmkoaSx0LGUsby0xKSxiaShpLHQscixuKSl9fWZ1bmN0aW9uIGZzKGksdCxlKXtjb25zdCBuPWlbdF07aVt0XT1pW2VdLGlbZV09bn1mdW5jdGlvbiB6bShpKXtyZXR1cm4gaVswXX1mdW5jdGlvbiBUbShpKXtyZXR1cm4gaVsxXX1mdW5jdGlvbiBQbShpLHQpe3ZhciBlPTAsbj0wLHM9MCxyPTAsbz0wLGE9MCxjPTAsbD0wLGg9bnVsbCx1PW51bGwsZj1pWzBdLGQ9aVsxXSxwPXQubGVuZ3RoO2ZvcihlO2U8cDtlKyspe249MDt2YXIgeT10W2VdLmxlbmd0aC0xLGc9dFtlXTtpZihoPWdbMF0saFswXSE9PWdbeV1bMF0mJmhbMV0hPT1nW3ldWzFdKXRocm93IG5ldyBFcnJvcigiRmlyc3QgYW5kIGxhc3QgY29vcmRpbmF0ZXMgaW4gYSByaW5nIG11c3QgYmUgdGhlIHNhbWUiKTtmb3Iobz1oWzBdLWYsYT1oWzFdLWQsbjtuPHk7bisrKXtpZih1PWdbbisxXSxsPXVbMV0tZCxhPDAmJmw8MHx8YT4wJiZsPjApe2g9dSxhPWwsbz1oWzBdLWY7Y29udGludWV9aWYoYz11WzBdLWlbMF0sbD4wJiZhPD0wKXtpZihyPW8qbC1jKmEscj4wKXM9cysxO2Vsc2UgaWYocj09PTApcmV0dXJuIDB9ZWxzZSBpZihhPjAmJmw8PTApe2lmKHI9bypsLWMqYSxyPDApcz1zKzE7ZWxzZSBpZihyPT09MClyZXR1cm4gMH1lbHNlIGlmKGw9PT0wJiZhPDApe2lmKHI9bypsLWMqYSxyPT09MClyZXR1cm4gMH1lbHNlIGlmKGE9PT0wJiZsPDApe2lmKHI9bypsLWMqYSxyPT09MClyZXR1cm4gMH1lbHNlIGlmKGE9PT0wJiZsPT09MCl7aWYoYzw9MCYmbz49MClyZXR1cm4gMDtpZihvPD0wJiZjPj0wKXJldHVybiAwfWg9dSxhPWwsbz1jfX1yZXR1cm4gcyUyIT09MH1mdW5jdGlvbiBDbShpLHQsZT17fSl7aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJwb2ludCBpcyByZXF1aXJlZCIpO2lmKCF0KXRocm93IG5ldyBFcnJvcigicG9seWdvbiBpcyByZXF1aXJlZCIpO2NvbnN0IG49dW0oaSkscz1kbSh0KSxyPXMudHlwZSxvPXQuYmJveDtsZXQgYT1zLmNvb3JkaW5hdGVzO2lmKG8mJkVtKG4sbyk9PT0hMSlyZXR1cm4hMTtyPT09IlBvbHlnb24iJiYoYT1bYV0pO2xldCBjPSExO2Zvcih2YXIgbD0wO2w8YS5sZW5ndGg7KytsKXtjb25zdCBoPVBtKG4sYVtsXSk7aWYoaD09PTApcmV0dXJuIWUuaWdub3JlQm91bmRhcnk7aCYmKGM9ITApfXJldHVybiBjfWZ1bmN0aW9uIEVtKGksdCl7cmV0dXJuIHRbMF08PWlbMF0mJnRbMV08PWlbMV0mJnRbMl0+PWlbMF0mJnRbM10+PWlbMV19dmFyIEJtPUNtO2NvbnN0IFR1PTFlLTY7Y2xhc3MgUm57Y29uc3RydWN0b3IoKXt0aGlzLl94MD10aGlzLl95MD10aGlzLl94MT10aGlzLl95MT1udWxsLHRoaXMuXz0iIn1tb3ZlVG8odCxlKXt0aGlzLl8rPWBNJHt0aGlzLl94MD10aGlzLl94MT0rdH0sJHt0aGlzLl95MD10aGlzLl95MT0rZX1gfWNsb3NlUGF0aCgpe3RoaXMuX3gxIT09bnVsbCYmKHRoaXMuX3gxPXRoaXMuX3gwLHRoaXMuX3kxPXRoaXMuX3kwLHRoaXMuXys9IloiKX1saW5lVG8odCxlKXt0aGlzLl8rPWBMJHt0aGlzLl94MT0rdH0sJHt0aGlzLl95MT0rZX1gfWFyYyh0LGUsbil7dD0rdCxlPStlLG49K247Y29uc3Qgcz10K24scj1lO2lmKG48MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1cyIpO3RoaXMuX3gxPT09bnVsbD90aGlzLl8rPWBNJHtzfSwke3J9YDooTWF0aC5hYnModGhpcy5feDEtcyk+VHV8fE1hdGguYWJzKHRoaXMuX3kxLXIpPlR1KSYmKHRoaXMuXys9IkwiK3MrIiwiK3IpLG4mJih0aGlzLl8rPWBBJHtufSwke259LDAsMSwxLCR7dC1ufSwke2V9QSR7bn0sJHtufSwwLDEsMSwke3RoaXMuX3gxPXN9LCR7dGhpcy5feTE9cn1gKX1yZWN0KHQsZSxuLHMpe3RoaXMuXys9YE0ke3RoaXMuX3gwPXRoaXMuX3gxPSt0fSwke3RoaXMuX3kwPXRoaXMuX3kxPStlfWgkeytufXYkeytzfWgkey1ufVpgfXZhbHVlKCl7cmV0dXJuIHRoaXMuX3x8bnVsbH19Y2xhc3MgZmN7Y29uc3RydWN0b3IoKXt0aGlzLl89W119bW92ZVRvKHQsZSl7dGhpcy5fLnB1c2goW3QsZV0pfWNsb3NlUGF0aCgpe3RoaXMuXy5wdXNoKHRoaXMuX1swXS5zbGljZSgpKX1saW5lVG8odCxlKXt0aGlzLl8ucHVzaChbdCxlXSl9dmFsdWUoKXtyZXR1cm4gdGhpcy5fLmxlbmd0aD90aGlzLl86bnVsbH19Y2xhc3MgRm17Y29uc3RydWN0b3IodCxbZSxuLHMscl09WzAsMCw5NjAsNTAwXSl7aWYoISgocz0rcyk+PShlPStlKSl8fCEoKHI9K3IpPj0obj0rbikpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBib3VuZHMiKTt0aGlzLmRlbGF1bmF5PXQsdGhpcy5fY2lyY3VtY2VudGVycz1uZXcgRmxvYXQ2NEFycmF5KHQucG9pbnRzLmxlbmd0aCoyKSx0aGlzLnZlY3RvcnM9bmV3IEZsb2F0NjRBcnJheSh0LnBvaW50cy5sZW5ndGgqMiksdGhpcy54bWF4PXMsdGhpcy54bWluPWUsdGhpcy55bWF4PXIsdGhpcy55bWluPW4sdGhpcy5faW5pdCgpfXVwZGF0ZSgpe3JldHVybiB0aGlzLmRlbGF1bmF5LnVwZGF0ZSgpLHRoaXMuX2luaXQoKSx0aGlzfV9pbml0KCl7Y29uc3R7ZGVsYXVuYXk6e3BvaW50czp0LGh1bGw6ZSx0cmlhbmdsZXM6bn0sdmVjdG9yczpzfT10aGlzLHI9dGhpcy5jaXJjdW1jZW50ZXJzPXRoaXMuX2NpcmN1bWNlbnRlcnMuc3ViYXJyYXkoMCxuLmxlbmd0aC8zKjIpO2ZvcihsZXQgZD0wLHA9MCx5PW4ubGVuZ3RoLGcsdztkPHk7ZCs9MyxwKz0yKXtjb25zdCBiPW5bZF0qMix4PW5bZCsxXSoyLG09bltkKzJdKjIsTT10W2JdLFM9dFtiKzFdLEE9dFt4XSx2PXRbeCsxXSxfPXRbbV0sVD10W20rMV0sej1BLU0sQz12LVMsRT1fLU0sRj1ULVMsQj0oeipGLUMqRSkqMjtpZihNYXRoLmFicyhCKTwxZS05KXtsZXQgST0xZTk7Y29uc3QgUj1uWzBdKjI7SSo9TWF0aC5zaWduKCh0W1JdLU0pKkYtKHRbUisxXS1TKSpFKSxnPShNK18pLzItSSpGLHc9KFMrVCkvMitJKkV9ZWxzZXtjb25zdCBJPTEvQixSPXoqeitDKkMsVj1FKkUrRipGO2c9TSsoRipSLUMqVikqSSx3PVMrKHoqVi1FKlIpKkl9cltwXT1nLHJbcCsxXT13fWxldCBvPWVbZS5sZW5ndGgtMV0sYSxjPW8qNCxsLGg9dFsyKm9dLHUsZj10WzIqbysxXTtzLmZpbGwoMCk7Zm9yKGxldCBkPTA7ZDxlLmxlbmd0aDsrK2Qpbz1lW2RdLGE9YyxsPWgsdT1mLGM9byo0LGg9dFsyKm9dLGY9dFsyKm8rMV0sc1thKzJdPXNbY109dS1mLHNbYSszXT1zW2MrMV09aC1sfXJlbmRlcih0KXtjb25zdCBlPXQ9PW51bGw/dD1uZXcgUm46dm9pZCAwLHtkZWxhdW5heTp7aGFsZmVkZ2VzOm4saW5lZGdlczpzLGh1bGw6cn0sY2lyY3VtY2VudGVyczpvLHZlY3RvcnM6YX09dGhpcztpZihyLmxlbmd0aDw9MSlyZXR1cm4gbnVsbDtmb3IobGV0IGg9MCx1PW4ubGVuZ3RoO2g8dTsrK2gpe2NvbnN0IGY9bltoXTtpZihmPGgpY29udGludWU7Y29uc3QgZD1NYXRoLmZsb29yKGgvMykqMixwPU1hdGguZmxvb3IoZi8zKSoyLHk9b1tkXSxnPW9bZCsxXSx3PW9bcF0sYj1vW3ArMV07dGhpcy5fcmVuZGVyU2VnbWVudCh5LGcsdyxiLHQpfWxldCBjLGw9cltyLmxlbmd0aC0xXTtmb3IobGV0IGg9MDtoPHIubGVuZ3RoOysraCl7Yz1sLGw9cltoXTtjb25zdCB1PU1hdGguZmxvb3Ioc1tsXS8zKSoyLGY9b1t1XSxkPW9bdSsxXSxwPWMqNCx5PXRoaXMuX3Byb2plY3QoZixkLGFbcCsyXSxhW3ArM10pO3kmJnRoaXMuX3JlbmRlclNlZ21lbnQoZixkLHlbMF0seVsxXSx0KX1yZXR1cm4gZSYmZS52YWx1ZSgpfXJlbmRlckJvdW5kcyh0KXtjb25zdCBlPXQ9PW51bGw/dD1uZXcgUm46dm9pZCAwO3JldHVybiB0LnJlY3QodGhpcy54bWluLHRoaXMueW1pbix0aGlzLnhtYXgtdGhpcy54bWluLHRoaXMueW1heC10aGlzLnltaW4pLGUmJmUudmFsdWUoKX1yZW5kZXJDZWxsKHQsZSl7Y29uc3Qgbj1lPT1udWxsP2U9bmV3IFJuOnZvaWQgMCxzPXRoaXMuX2NsaXAodCk7aWYocz09PW51bGx8fCFzLmxlbmd0aClyZXR1cm47ZS5tb3ZlVG8oc1swXSxzWzFdKTtsZXQgcj1zLmxlbmd0aDtmb3IoO3NbMF09PT1zW3ItMl0mJnNbMV09PT1zW3ItMV0mJnI+MTspci09Mjtmb3IobGV0IG89MjtvPHI7bys9Mikoc1tvXSE9PXNbby0yXXx8c1tvKzFdIT09c1tvLTFdKSYmZS5saW5lVG8oc1tvXSxzW28rMV0pO3JldHVybiBlLmNsb3NlUGF0aCgpLG4mJm4udmFsdWUoKX0qY2VsbFBvbHlnb25zKCl7Y29uc3R7ZGVsYXVuYXk6e3BvaW50czp0fX09dGhpcztmb3IobGV0IGU9MCxuPXQubGVuZ3RoLzI7ZTxuOysrZSl7Y29uc3Qgcz10aGlzLmNlbGxQb2x5Z29uKGUpO3MmJihzLmluZGV4PWUseWllbGQgcyl9fWNlbGxQb2x5Z29uKHQpe2NvbnN0IGU9bmV3IGZjO3JldHVybiB0aGlzLnJlbmRlckNlbGwodCxlKSxlLnZhbHVlKCl9X3JlbmRlclNlZ21lbnQodCxlLG4scyxyKXtsZXQgbztjb25zdCBhPXRoaXMuX3JlZ2lvbmNvZGUodCxlKSxjPXRoaXMuX3JlZ2lvbmNvZGUobixzKTthPT09MCYmYz09PTA/KHIubW92ZVRvKHQsZSksci5saW5lVG8obixzKSk6KG89dGhpcy5fY2xpcFNlZ21lbnQodCxlLG4scyxhLGMpKSYmKHIubW92ZVRvKG9bMF0sb1sxXSksci5saW5lVG8ob1syXSxvWzNdKSl9Y29udGFpbnModCxlLG4pe3JldHVybiBlPStlLGUhPT1lfHwobj0rbixuIT09bik/ITE6dGhpcy5kZWxhdW5heS5fc3RlcCh0LGUsbik9PT10fSpuZWlnaGJvcnModCl7Y29uc3QgZT10aGlzLl9jbGlwKHQpO2lmKGUpZm9yKGNvbnN0IG4gb2YgdGhpcy5kZWxhdW5heS5uZWlnaGJvcnModCkpe2NvbnN0IHM9dGhpcy5fY2xpcChuKTtpZihzKXt0OmZvcihsZXQgcj0wLG89ZS5sZW5ndGg7cjxvO3IrPTIpZm9yKGxldCBhPTAsYz1zLmxlbmd0aDthPGM7YSs9MilpZihlW3JdPT1zW2FdJiZlW3IrMV09PXNbYSsxXSYmZVsocisyKSVvXT09c1soYStjLTIpJWNdJiZlWyhyKzMpJW9dPT1zWyhhK2MtMSklY10pe3lpZWxkIG47YnJlYWsgdH19fX1fY2VsbCh0KXtjb25zdHtjaXJjdW1jZW50ZXJzOmUsZGVsYXVuYXk6e2luZWRnZXM6bixoYWxmZWRnZXM6cyx0cmlhbmdsZXM6cn19PXRoaXMsbz1uW3RdO2lmKG89PT0tMSlyZXR1cm4gbnVsbDtjb25zdCBhPVtdO2xldCBjPW87ZG97Y29uc3QgbD1NYXRoLmZsb29yKGMvMyk7aWYoYS5wdXNoKGVbbCoyXSxlW2wqMisxXSksYz1jJTM9PT0yP2MtMjpjKzEscltjXSE9PXQpYnJlYWs7Yz1zW2NdfXdoaWxlKGMhPT1vJiZjIT09LTEpO3JldHVybiBhfV9jbGlwKHQpe2lmKHQ9PT0wJiZ0aGlzLmRlbGF1bmF5Lmh1bGwubGVuZ3RoPT09MSlyZXR1cm5bdGhpcy54bWF4LHRoaXMueW1pbix0aGlzLnhtYXgsdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1pbl07Y29uc3QgZT10aGlzLl9jZWxsKHQpO2lmKGU9PT1udWxsKXJldHVybiBudWxsO2NvbnN0e3ZlY3RvcnM6bn09dGhpcyxzPXQqNDtyZXR1cm4gbltzXXx8bltzKzFdP3RoaXMuX2NsaXBJbmZpbml0ZSh0LGUsbltzXSxuW3MrMV0sbltzKzJdLG5bcyszXSk6dGhpcy5fY2xpcEZpbml0ZSh0LGUpfV9jbGlwRmluaXRlKHQsZSl7Y29uc3Qgbj1lLmxlbmd0aDtsZXQgcz1udWxsLHIsbyxhPWVbbi0yXSxjPWVbbi0xXSxsLGg9dGhpcy5fcmVnaW9uY29kZShhLGMpLHUsZj0wO2ZvcihsZXQgZD0wO2Q8bjtkKz0yKWlmKHI9YSxvPWMsYT1lW2RdLGM9ZVtkKzFdLGw9aCxoPXRoaXMuX3JlZ2lvbmNvZGUoYSxjKSxsPT09MCYmaD09PTApdT1mLGY9MCxzP3MucHVzaChhLGMpOnM9W2EsY107ZWxzZXtsZXQgcCx5LGcsdyxiO2lmKGw9PT0wKXtpZigocD10aGlzLl9jbGlwU2VnbWVudChyLG8sYSxjLGwsaCkpPT09bnVsbCljb250aW51ZTtbeSxnLHcsYl09cH1lbHNle2lmKChwPXRoaXMuX2NsaXBTZWdtZW50KGEsYyxyLG8saCxsKSk9PT1udWxsKWNvbnRpbnVlO1t3LGIseSxnXT1wLHU9ZixmPXRoaXMuX2VkZ2Vjb2RlKHksZyksdSYmZiYmdGhpcy5fZWRnZSh0LHUsZixzLHMubGVuZ3RoKSxzP3MucHVzaCh5LGcpOnM9W3ksZ119dT1mLGY9dGhpcy5fZWRnZWNvZGUodyxiKSx1JiZmJiZ0aGlzLl9lZGdlKHQsdSxmLHMscy5sZW5ndGgpLHM/cy5wdXNoKHcsYik6cz1bdyxiXX1pZihzKXU9ZixmPXRoaXMuX2VkZ2Vjb2RlKHNbMF0sc1sxXSksdSYmZiYmdGhpcy5fZWRnZSh0LHUsZixzLHMubGVuZ3RoKTtlbHNlIGlmKHRoaXMuY29udGFpbnModCwodGhpcy54bWluK3RoaXMueG1heCkvMiwodGhpcy55bWluK3RoaXMueW1heCkvMikpcmV0dXJuW3RoaXMueG1heCx0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltaW5dO3JldHVybiBzfV9jbGlwU2VnbWVudCh0LGUsbixzLHIsbyl7Zm9yKDs7KXtpZihyPT09MCYmbz09PTApcmV0dXJuW3QsZSxuLHNdO2lmKHImbylyZXR1cm4gbnVsbDtsZXQgYSxjLGw9cnx8bztsJjg/KGE9dCsobi10KSoodGhpcy55bWF4LWUpLyhzLWUpLGM9dGhpcy55bWF4KTpsJjQ/KGE9dCsobi10KSoodGhpcy55bWluLWUpLyhzLWUpLGM9dGhpcy55bWluKTpsJjI/KGM9ZSsocy1lKSoodGhpcy54bWF4LXQpLyhuLXQpLGE9dGhpcy54bWF4KTooYz1lKyhzLWUpKih0aGlzLnhtaW4tdCkvKG4tdCksYT10aGlzLnhtaW4pLHI/KHQ9YSxlPWMscj10aGlzLl9yZWdpb25jb2RlKHQsZSkpOihuPWEscz1jLG89dGhpcy5fcmVnaW9uY29kZShuLHMpKX19X2NsaXBJbmZpbml0ZSh0LGUsbixzLHIsbyl7bGV0IGE9QXJyYXkuZnJvbShlKSxjO2lmKChjPXRoaXMuX3Byb2plY3QoYVswXSxhWzFdLG4scykpJiZhLnVuc2hpZnQoY1swXSxjWzFdKSwoYz10aGlzLl9wcm9qZWN0KGFbYS5sZW5ndGgtMl0sYVthLmxlbmd0aC0xXSxyLG8pKSYmYS5wdXNoKGNbMF0sY1sxXSksYT10aGlzLl9jbGlwRmluaXRlKHQsYSkpZm9yKGxldCBsPTAsaD1hLmxlbmd0aCx1LGY9dGhpcy5fZWRnZWNvZGUoYVtoLTJdLGFbaC0xXSk7bDxoO2wrPTIpdT1mLGY9dGhpcy5fZWRnZWNvZGUoYVtsXSxhW2wrMV0pLHUmJmYmJihsPXRoaXMuX2VkZ2UodCx1LGYsYSxsKSxoPWEubGVuZ3RoKTtlbHNlIHRoaXMuY29udGFpbnModCwodGhpcy54bWluK3RoaXMueG1heCkvMiwodGhpcy55bWluK3RoaXMueW1heCkvMikmJihhPVt0aGlzLnhtaW4sdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWF4XSk7cmV0dXJuIGF9X2VkZ2UodCxlLG4scyxyKXtmb3IoO2UhPT1uOyl7bGV0IG8sYTtzd2l0Y2goZSl7Y2FzZSA1OmU9NDtjb250aW51ZTtjYXNlIDQ6ZT02LG89dGhpcy54bWF4LGE9dGhpcy55bWluO2JyZWFrO2Nhc2UgNjplPTI7Y29udGludWU7Y2FzZSAyOmU9MTAsbz10aGlzLnhtYXgsYT10aGlzLnltYXg7YnJlYWs7Y2FzZSAxMDplPTg7Y29udGludWU7Y2FzZSA4OmU9OSxvPXRoaXMueG1pbixhPXRoaXMueW1heDticmVhaztjYXNlIDk6ZT0xO2NvbnRpbnVlO2Nhc2UgMTplPTUsbz10aGlzLnhtaW4sYT10aGlzLnltaW47YnJlYWt9KHNbcl0hPT1vfHxzW3IrMV0hPT1hKSYmdGhpcy5jb250YWlucyh0LG8sYSkmJihzLnNwbGljZShyLDAsbyxhKSxyKz0yKX1pZihzLmxlbmd0aD40KWZvcihsZXQgbz0wO288cy5sZW5ndGg7bys9Mil7Y29uc3QgYT0obysyKSVzLmxlbmd0aCxjPShvKzQpJXMubGVuZ3RoOyhzW29dPT09c1thXSYmc1thXT09PXNbY118fHNbbysxXT09PXNbYSsxXSYmc1thKzFdPT09c1tjKzFdKSYmKHMuc3BsaWNlKGEsMiksby09Mil9cmV0dXJuIHJ9X3Byb2plY3QodCxlLG4scyl7bGV0IHI9MS8wLG8sYSxjO2lmKHM8MCl7aWYoZTw9dGhpcy55bWluKXJldHVybiBudWxsOyhvPSh0aGlzLnltaW4tZSkvcyk8ciYmKGM9dGhpcy55bWluLGE9dCsocj1vKSpuKX1lbHNlIGlmKHM+MCl7aWYoZT49dGhpcy55bWF4KXJldHVybiBudWxsOyhvPSh0aGlzLnltYXgtZSkvcyk8ciYmKGM9dGhpcy55bWF4LGE9dCsocj1vKSpuKX1pZihuPjApe2lmKHQ+PXRoaXMueG1heClyZXR1cm4gbnVsbDsobz0odGhpcy54bWF4LXQpL24pPHImJihhPXRoaXMueG1heCxjPWUrKHI9bykqcyl9ZWxzZSBpZihuPDApe2lmKHQ8PXRoaXMueG1pbilyZXR1cm4gbnVsbDsobz0odGhpcy54bWluLXQpL24pPHImJihhPXRoaXMueG1pbixjPWUrKHI9bykqcyl9cmV0dXJuW2EsY119X2VkZ2Vjb2RlKHQsZSl7cmV0dXJuKHQ9PT10aGlzLnhtaW4/MTp0PT09dGhpcy54bWF4PzI6MCl8KGU9PT10aGlzLnltaW4/NDplPT09dGhpcy55bWF4Pzg6MCl9X3JlZ2lvbmNvZGUodCxlKXtyZXR1cm4odDx0aGlzLnhtaW4/MTp0PnRoaXMueG1heD8yOjApfChlPHRoaXMueW1pbj80OmU+dGhpcy55bWF4Pzg6MCl9fWNvbnN0IEltPTIqTWF0aC5QSSxNaT1NYXRoLnBvdztmdW5jdGlvbiBrbShpKXtyZXR1cm4gaVswXX1mdW5jdGlvbiBObShpKXtyZXR1cm4gaVsxXX1mdW5jdGlvbiBSbShpKXtjb25zdHt0cmlhbmdsZXM6dCxjb29yZHM6ZX09aTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rPTMpe2NvbnN0IHM9Mip0W25dLHI9Mip0W24rMV0sbz0yKnRbbisyXTtpZigoZVtvXS1lW3NdKSooZVtyKzFdLWVbcysxXSktKGVbcl0tZVtzXSkqKGVbbysxXS1lW3MrMV0pPjFlLTEwKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIExtKGksdCxlKXtyZXR1cm5baStNYXRoLnNpbihpK3QpKmUsdCtNYXRoLmNvcyhpLXQpKmVdfWNsYXNzIGRje3N0YXRpYyBmcm9tKHQsZT1rbSxuPU5tLHMpe3JldHVybiBuZXcgZGMoImxlbmd0aCJpbiB0P09tKHQsZSxuLHMpOkZsb2F0NjRBcnJheS5mcm9tKERtKHQsZSxuLHMpKSl9Y29uc3RydWN0b3IodCl7dGhpcy5fZGVsYXVuYXRvcj1uZXcgdXModCksdGhpcy5pbmVkZ2VzPW5ldyBJbnQzMkFycmF5KHQubGVuZ3RoLzIpLHRoaXMuX2h1bGxJbmRleD1uZXcgSW50MzJBcnJheSh0Lmxlbmd0aC8yKSx0aGlzLnBvaW50cz10aGlzLl9kZWxhdW5hdG9yLmNvb3Jkcyx0aGlzLl9pbml0KCl9dXBkYXRlKCl7cmV0dXJuIHRoaXMuX2RlbGF1bmF0b3IudXBkYXRlKCksdGhpcy5faW5pdCgpLHRoaXN9X2luaXQoKXtjb25zdCB0PXRoaXMuX2RlbGF1bmF0b3IsZT10aGlzLnBvaW50cztpZih0Lmh1bGwmJnQuaHVsbC5sZW5ndGg+MiYmUm0odCkpe3RoaXMuY29sbGluZWFyPUludDMyQXJyYXkuZnJvbSh7bGVuZ3RoOmUubGVuZ3RoLzJ9LChmLGQpPT5kKS5zb3J0KChmLGQpPT5lWzIqZl0tZVsyKmRdfHxlWzIqZisxXS1lWzIqZCsxXSk7Y29uc3QgYz10aGlzLmNvbGxpbmVhclswXSxsPXRoaXMuY29sbGluZWFyW3RoaXMuY29sbGluZWFyLmxlbmd0aC0xXSxoPVtlWzIqY10sZVsyKmMrMV0sZVsyKmxdLGVbMipsKzFdXSx1PTFlLTgqTWF0aC5oeXBvdChoWzNdLWhbMV0saFsyXS1oWzBdKTtmb3IobGV0IGY9MCxkPWUubGVuZ3RoLzI7ZjxkOysrZil7Y29uc3QgcD1MbShlWzIqZl0sZVsyKmYrMV0sdSk7ZVsyKmZdPXBbMF0sZVsyKmYrMV09cFsxXX10aGlzLl9kZWxhdW5hdG9yPW5ldyB1cyhlKX1lbHNlIGRlbGV0ZSB0aGlzLmNvbGxpbmVhcjtjb25zdCBuPXRoaXMuaGFsZmVkZ2VzPXRoaXMuX2RlbGF1bmF0b3IuaGFsZmVkZ2VzLHM9dGhpcy5odWxsPXRoaXMuX2RlbGF1bmF0b3IuaHVsbCxyPXRoaXMudHJpYW5nbGVzPXRoaXMuX2RlbGF1bmF0b3IudHJpYW5nbGVzLG89dGhpcy5pbmVkZ2VzLmZpbGwoLTEpLGE9dGhpcy5faHVsbEluZGV4LmZpbGwoLTEpO2ZvcihsZXQgYz0wLGw9bi5sZW5ndGg7YzxsOysrYyl7Y29uc3QgaD1yW2MlMz09PTI/Yy0yOmMrMV07KG5bY109PT0tMXx8b1toXT09PS0xKSYmKG9baF09Yyl9Zm9yKGxldCBjPTAsbD1zLmxlbmd0aDtjPGw7KytjKWFbc1tjXV09YztzLmxlbmd0aDw9MiYmcy5sZW5ndGg+MCYmKHRoaXMudHJpYW5nbGVzPW5ldyBJbnQzMkFycmF5KDMpLmZpbGwoLTEpLHRoaXMuaGFsZmVkZ2VzPW5ldyBJbnQzMkFycmF5KDMpLmZpbGwoLTEpLHRoaXMudHJpYW5nbGVzWzBdPXNbMF0sb1tzWzBdXT0xLHMubGVuZ3RoPT09MiYmKG9bc1sxXV09MCx0aGlzLnRyaWFuZ2xlc1sxXT1zWzFdLHRoaXMudHJpYW5nbGVzWzJdPXNbMV0pKX12b3Jvbm9pKHQpe3JldHVybiBuZXcgRm0odGhpcyx0KX0qbmVpZ2hib3JzKHQpe2NvbnN0e2luZWRnZXM6ZSxodWxsOm4sX2h1bGxJbmRleDpzLGhhbGZlZGdlczpyLHRyaWFuZ2xlczpvLGNvbGxpbmVhcjphfT10aGlzO2lmKGEpe2NvbnN0IHU9YS5pbmRleE9mKHQpO3U+MCYmKHlpZWxkIGFbdS0xXSksdTxhLmxlbmd0aC0xJiYoeWllbGQgYVt1KzFdKTtyZXR1cm59Y29uc3QgYz1lW3RdO2lmKGM9PT0tMSlyZXR1cm47bGV0IGw9YyxoPS0xO2Rve2lmKHlpZWxkIGg9b1tsXSxsPWwlMz09PTI/bC0yOmwrMSxvW2xdIT09dClyZXR1cm47aWYobD1yW2xdLGw9PT0tMSl7Y29uc3QgdT1uWyhzW3RdKzEpJW4ubGVuZ3RoXTt1IT09aCYmKHlpZWxkIHUpO3JldHVybn19d2hpbGUobCE9PWMpfWZpbmQodCxlLG49MCl7aWYodD0rdCx0IT09dHx8KGU9K2UsZSE9PWUpKXJldHVybi0xO2NvbnN0IHM9bjtsZXQgcjtmb3IoOyhyPXRoaXMuX3N0ZXAobix0LGUpKT49MCYmciE9PW4mJnIhPT1zOyluPXI7cmV0dXJuIHJ9X3N0ZXAodCxlLG4pe2NvbnN0e2luZWRnZXM6cyxodWxsOnIsX2h1bGxJbmRleDpvLGhhbGZlZGdlczphLHRyaWFuZ2xlczpjLHBvaW50czpsfT10aGlzO2lmKHNbdF09PT0tMXx8IWwubGVuZ3RoKXJldHVybih0KzEpJShsLmxlbmd0aD4+MSk7bGV0IGg9dCx1PU1pKGUtbFt0KjJdLDIpK01pKG4tbFt0KjIrMV0sMik7Y29uc3QgZj1zW3RdO2xldCBkPWY7ZG97bGV0IHA9Y1tkXTtjb25zdCB5PU1pKGUtbFtwKjJdLDIpK01pKG4tbFtwKjIrMV0sMik7aWYoeTx1JiYodT15LGg9cCksZD1kJTM9PT0yP2QtMjpkKzEsY1tkXSE9PXQpYnJlYWs7aWYoZD1hW2RdLGQ9PT0tMSl7aWYoZD1yWyhvW3RdKzEpJXIubGVuZ3RoXSxkIT09cCYmTWkoZS1sW2QqMl0sMikrTWkobi1sW2QqMisxXSwyKTx1KXJldHVybiBkO2JyZWFrfX13aGlsZShkIT09Zik7cmV0dXJuIGh9cmVuZGVyKHQpe2NvbnN0IGU9dD09bnVsbD90PW5ldyBSbjp2b2lkIDAse3BvaW50czpuLGhhbGZlZGdlczpzLHRyaWFuZ2xlczpyfT10aGlzO2ZvcihsZXQgbz0wLGE9cy5sZW5ndGg7bzxhOysrbyl7Y29uc3QgYz1zW29dO2lmKGM8byljb250aW51ZTtjb25zdCBsPXJbb10qMixoPXJbY10qMjt0Lm1vdmVUbyhuW2xdLG5bbCsxXSksdC5saW5lVG8obltoXSxuW2grMV0pfXJldHVybiB0aGlzLnJlbmRlckh1bGwodCksZSYmZS52YWx1ZSgpfXJlbmRlclBvaW50cyh0LGUpe2U9PT12b2lkIDAmJighdHx8dHlwZW9mIHQubW92ZVRvIT0iZnVuY3Rpb24iKSYmKGU9dCx0PW51bGwpLGU9ZT09bnVsbD8yOitlO2NvbnN0IG49dD09bnVsbD90PW5ldyBSbjp2b2lkIDAse3BvaW50czpzfT10aGlzO2ZvcihsZXQgcj0wLG89cy5sZW5ndGg7cjxvO3IrPTIpe2NvbnN0IGE9c1tyXSxjPXNbcisxXTt0Lm1vdmVUbyhhK2UsYyksdC5hcmMoYSxjLGUsMCxJbSl9cmV0dXJuIG4mJm4udmFsdWUoKX1yZW5kZXJIdWxsKHQpe2NvbnN0IGU9dD09bnVsbD90PW5ldyBSbjp2b2lkIDAse2h1bGw6bixwb2ludHM6c309dGhpcyxyPW5bMF0qMixvPW4ubGVuZ3RoO3QubW92ZVRvKHNbcl0sc1tyKzFdKTtmb3IobGV0IGE9MTthPG87KythKXtjb25zdCBjPTIqblthXTt0LmxpbmVUbyhzW2NdLHNbYysxXSl9cmV0dXJuIHQuY2xvc2VQYXRoKCksZSYmZS52YWx1ZSgpfWh1bGxQb2x5Z29uKCl7Y29uc3QgdD1uZXcgZmM7cmV0dXJuIHRoaXMucmVuZGVySHVsbCh0KSx0LnZhbHVlKCl9cmVuZGVyVHJpYW5nbGUodCxlKXtjb25zdCBuPWU9PW51bGw/ZT1uZXcgUm46dm9pZCAwLHtwb2ludHM6cyx0cmlhbmdsZXM6cn09dGhpcyxvPXJbdCo9M10qMixhPXJbdCsxXSoyLGM9clt0KzJdKjI7cmV0dXJuIGUubW92ZVRvKHNbb10sc1tvKzFdKSxlLmxpbmVUbyhzW2FdLHNbYSsxXSksZS5saW5lVG8oc1tjXSxzW2MrMV0pLGUuY2xvc2VQYXRoKCksbiYmbi52YWx1ZSgpfSp0cmlhbmdsZVBvbHlnb25zKCl7Y29uc3R7dHJpYW5nbGVzOnR9PXRoaXM7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aC8zO2U8bjsrK2UpeWllbGQgdGhpcy50cmlhbmdsZVBvbHlnb24oZSl9dHJpYW5nbGVQb2x5Z29uKHQpe2NvbnN0IGU9bmV3IGZjO3JldHVybiB0aGlzLnJlbmRlclRyaWFuZ2xlKHQsZSksZS52YWx1ZSgpfX1mdW5jdGlvbiBPbShpLHQsZSxuKXtjb25zdCBzPWkubGVuZ3RoLHI9bmV3IEZsb2F0NjRBcnJheShzKjIpO2ZvcihsZXQgbz0wO288czsrK28pe2NvbnN0IGE9aVtvXTtyW28qMl09dC5jYWxsKG4sYSxvLGkpLHJbbyoyKzFdPWUuY2FsbChuLGEsbyxpKX1yZXR1cm4gcn1mdW5jdGlvbipEbShpLHQsZSxuKXtsZXQgcz0wO2Zvcihjb25zdCByIG9mIGkpeWllbGQgdC5jYWxsKG4scixzLGkpLHlpZWxkIGUuY2FsbChuLHIscyxpKSwrK3N9Y29uc3QgcGM9TWF0aC5QSSxQdT1wYy8yLEN1PTE4MC9wYyxFdT1wYy8xODAsJG09TWF0aC5hdGFuMixCdT1NYXRoLmNvcyxWbT1NYXRoLm1heCxVbT1NYXRoLm1pbixGdT1NYXRoLnNpbixxbT1NYXRoLnNpZ258fGZ1bmN0aW9uKGkpe3JldHVybiBpPjA/MTppPDA/LTE6MH0sSXU9TWF0aC5zcXJ0O2Z1bmN0aW9uIFhtKGkpe3JldHVybiBpPjE/UHU6aTwtMT8tUHU6TWF0aC5hc2luKGkpfWZ1bmN0aW9uIGt1KGksdCl7cmV0dXJuIGlbMF0qdFswXStpWzFdKnRbMV0raVsyXSp0WzJdfWZ1bmN0aW9uIEt0KGksdCl7cmV0dXJuW2lbMV0qdFsyXS1pWzJdKnRbMV0saVsyXSp0WzBdLWlbMF0qdFsyXSxpWzBdKnRbMV0taVsxXSp0WzBdXX1mdW5jdGlvbiBKcihpLHQpe3JldHVybltpWzBdK3RbMF0saVsxXSt0WzFdLGlbMl0rdFsyXV19ZnVuY3Rpb24gWXIoaSl7dmFyIHQ9SXUoaVswXSppWzBdK2lbMV0qaVsxXStpWzJdKmlbMl0pO3JldHVybltpWzBdL3QsaVsxXS90LGlbMl0vdF19ZnVuY3Rpb24geWMoaSl7cmV0dXJuWyRtKGlbMV0saVswXSkqQ3UsWG0oVm0oLTEsVW0oMSxpWzJdKSkpKkN1XX1mdW5jdGlvbiB6ZShpKXtjb25zdCB0PWlbMF0qRXUsZT1pWzFdKkV1LG49QnUoZSk7cmV0dXJuW24qQnUodCksbipGdSh0KSxGdShlKV19ZnVuY3Rpb24gbWMoaSl7cmV0dXJuIGk9aS5tYXAodD0+emUodCkpLGt1KGlbMF0sS3QoaVsyXSxpWzFdKSl9ZnVuY3Rpb24gWm0oaSl7Y29uc3QgdD1XbShpKSxlPUptKHQpLG49SG0oZSxpKSxzPWptKGUsaS5sZW5ndGgpLHI9R20ocyxpKSxvPVltKGUsaSkse3BvbHlnb25zOmEsY2VudGVyczpjfT1RbShvLGUsaSksbD1LbShhKSxoPWVnKGUsaSksdT10ZyhuLGUpO3JldHVybntkZWxhdW5heTp0LGVkZ2VzOm4sdHJpYW5nbGVzOmUsY2VudGVyczpjLG5laWdoYm9yczpzLHBvbHlnb25zOmEsbWVzaDpsLGh1bGw6aCx1cnF1aGFydDp1LGZpbmQ6cn19ZnVuY3Rpb24gR20oaSx0KXtmdW5jdGlvbiBlKG4scyl7bGV0IHI9blswXS1zWzBdLG89blsxXS1zWzFdLGE9blsyXS1zWzJdO3JldHVybiByKnIrbypvK2EqYX1yZXR1cm4gZnVuY3Rpb24ocyxyLG8pe289PT12b2lkIDAmJihvPTApO2xldCBhLGMsbD1vO2NvbnN0IGg9emUoW3Mscl0pO2RvIGE9byxvPW51bGwsYz1lKGgsemUodFthXSkpLGlbYV0uZm9yRWFjaCh1PT57bGV0IGY9ZShoLHplKHRbdV0pKTtpZihmPGMpe2M9ZixvPXUsbD11O3JldHVybn19KTt3aGlsZShvIT09bnVsbCk7cmV0dXJuIGx9fWZ1bmN0aW9uIFdtKGkpe2lmKGkubGVuZ3RoPDIpcmV0dXJue307bGV0IHQ9MDtmb3IoO2lzTmFOKGlbdF1bMF0raVt0XVsxXSkmJnQrKzxpLmxlbmd0aDspO2NvbnN0IGU9WmgoaVt0XSksbj1PeSgpLnRyYW5zbGF0ZShbMCwwXSkuc2NhbGUoMSkucm90YXRlKGUuaW52ZXJ0KFsxODAsMF0pKTtpPWkubWFwKG4pO2NvbnN0IHM9W107bGV0IHI9MTtmb3IobGV0IHU9MCxmPWkubGVuZ3RoO3U8Zjt1Kyspe2xldCBkPXppKGlbdV1bMF0sMikremkoaVt1XVsxXSwyKTshaXNGaW5pdGUoZCl8fGQ+MWUzMj9zLnB1c2godSk6ZD5yJiYocj1kKX1jb25zdCBvPTFlNipJdShyKTtzLmZvckVhY2godT0+aVt1XT1bbywwXSksaS5wdXNoKFswLG9dKSxpLnB1c2goWy1vLDBdKSxpLnB1c2goWzAsLW9dKTtjb25zdCBhPWRjLmZyb20oaSk7YS5wcm9qZWN0aW9uPW47Y29uc3R7dHJpYW5nbGVzOmMsaGFsZmVkZ2VzOmwsaW5lZGdlczpofT1hO2ZvcihsZXQgdT0wLGY9bC5sZW5ndGg7dTxmO3UrKylpZihsW3VdPDApe2NvbnN0IGQ9dSUzPT0yP3UtMjp1KzEscD11JTM9PTA/dSsyOnUtMSx5PWxbZF0sZz1sW3BdO2xbeV09ZyxsW2ddPXksbFtkXT1sW3BdPS0xLGNbdV09Y1tkXT1jW3BdPXQsaFtjW3ldXT15JTM9PTA/eSsyOnktMSxoW2NbZ11dPWclMz09MD9nKzI6Zy0xLHUrPTItdSUzfWVsc2UgY1t1XT5pLmxlbmd0aC0zLTEmJihjW3VdPXQpO3JldHVybiBhfWZ1bmN0aW9uIEhtKGksdCl7Y29uc3QgZT1uZXcgU2V0O3JldHVybiB0Lmxlbmd0aD09PTI/W1swLDFdXTooaS5mb3JFYWNoKG49PntpZihuWzBdIT09blsxXSYmIShtYyhuLm1hcChzPT50W3NdKSk8MCkpZm9yKGxldCBzPTAscjtzPDM7cysrKXI9KHMrMSklMyxlLmFkZCh5cihbbltzXSxuW3JdXSkuam9pbigiLSIpKX0pLEFycmF5LmZyb20oZSxuPT5uLnNwbGl0KCItIikubWFwKE51bWJlcikpKX1mdW5jdGlvbiBKbShpKXtjb25zdHt0cmlhbmdsZXM6dH09aTtpZighdClyZXR1cm5bXTtjb25zdCBlPVtdO2ZvcihsZXQgbj0wLHM9dC5sZW5ndGgvMztuPHM7bisrKXtjb25zdCByPXRbMypuXSxvPXRbMypuKzFdLGE9dFszKm4rMl07ciE9PW8mJm8hPT1hJiZlLnB1c2goW3IsYSxvXSl9cmV0dXJuIGV9ZnVuY3Rpb24gWW0oaSx0KXtyZXR1cm4gaS5tYXAoZT0+e2NvbnN0IG49ZS5tYXAocj0+dFtyXSkubWFwKHplKSxzPUpyKEpyKEt0KG5bMV0sblswXSksS3QoblsyXSxuWzFdKSksS3QoblswXSxuWzJdKSk7cmV0dXJuIHljKFlyKHMpKX0pfWZ1bmN0aW9uIGptKGksdCl7Y29uc3QgZT1bXTtyZXR1cm4gaS5mb3JFYWNoKG49Pntmb3IobGV0IHM9MDtzPDM7cysrKXtjb25zdCByPW5bc10sbz1uWyhzKzEpJTNdO2Vbcl09ZVtyXXx8W10sZVtyXS5wdXNoKG8pfX0pLGkubGVuZ3RoPT09MCYmKHQ9PT0yPyhlWzBdPVsxXSxlWzFdPVswXSk6dD09PTEmJihlWzBdPVtdKSksZX1mdW5jdGlvbiBRbShpLHQsZSl7Y29uc3Qgbj1bXSxzPWkuc2xpY2UoKTtpZih0Lmxlbmd0aD09PTApe2lmKGUubGVuZ3RoPDIpcmV0dXJue3BvbHlnb25zOm4sY2VudGVyczpzfTtpZihlLmxlbmd0aD09PTIpe2NvbnN0IGE9emUoZVswXSksYz16ZShlWzFdKSxsPVlyKEpyKGEsYykpLGg9WXIoS3QoYSxjKSksdT1LdChsLGgpLGY9W2wsS3QobCx1KSxLdChLdChsLHUpLHUpLEt0KEt0KEt0KGwsdSksdSksdSldLm1hcCh5YykubWFwKG8pO3JldHVybiBuLnB1c2goZiksbi5wdXNoKGYuc2xpY2UoKS5yZXZlcnNlKCkpLHtwb2x5Z29uczpuLGNlbnRlcnM6c319fXQuZm9yRWFjaCgoYSxjKT0+e2ZvcihsZXQgbD0wO2w8MztsKyspe2NvbnN0IGg9YVtsXSx1PWFbKGwrMSklM10sZj1hWyhsKzIpJTNdO25baF09bltoXXx8W10sbltoXS5wdXNoKFt1LGYsYyxbaCx1LGZdXSl9fSk7Y29uc3Qgcj1uLm1hcChhPT57Y29uc3QgYz1bYVswXVsyXV07bGV0IGw9YVswXVsxXTtmb3IobGV0IGg9MTtoPGEubGVuZ3RoO2grKylmb3IobGV0IHU9MDt1PGEubGVuZ3RoO3UrKylpZihhW3VdWzBdPT1sKXtsPWFbdV1bMV0sYy5wdXNoKGFbdV1bMl0pO2JyZWFrfWlmKGMubGVuZ3RoPjIpcmV0dXJuIGM7aWYoYy5sZW5ndGg9PTIpe2NvbnN0IGg9TnUoZVthWzBdWzNdWzBdXSxlW2FbMF1bM11bMV1dLHNbY1swXV0pLHU9TnUoZVthWzBdWzNdWzJdXSxlW2FbMF1bM11bMF1dLHNbY1swXV0pLGY9byhoKSxkPW8odSk7cmV0dXJuW2NbMF0sZCxjWzFdLGZdfX0pO2Z1bmN0aW9uIG8oYSl7bGV0IGM9LTE7cmV0dXJuIHMuc2xpY2UodC5sZW5ndGgsMS8wKS5mb3JFYWNoKChsLGgpPT57bFswXT09PWFbMF0mJmxbMV09PT1hWzFdJiYoYz1oK3QubGVuZ3RoKX0pLGM8MCYmKGM9cy5sZW5ndGgscy5wdXNoKGEpKSxjfXJldHVybntwb2x5Z29uczpyLGNlbnRlcnM6c319ZnVuY3Rpb24gTnUoaSx0LGUpe2k9emUoaSksdD16ZSh0KSxlPXplKGUpO2NvbnN0IG49cW0oa3UoS3QodCxpKSxlKSk7cmV0dXJuIHljKFlyKEpyKGksdCkpLm1hcChzPT5uKnMpKX1mdW5jdGlvbiBLbShpKXtjb25zdCB0PVtdO3JldHVybiBpLmZvckVhY2goZT0+e2lmKCFlKXJldHVybjtsZXQgbj1lW2UubGVuZ3RoLTFdO2ZvcihsZXQgcyBvZiBlKXM+biYmdC5wdXNoKFtuLHNdKSxuPXN9KSx0fWZ1bmN0aW9uIHRnKGksdCl7cmV0dXJuIGZ1bmN0aW9uKGUpe2NvbnN0IG49bmV3IE1hcCxzPW5ldyBNYXA7cmV0dXJuIGkuZm9yRWFjaCgocixvKT0+e2NvbnN0IGE9ci5qb2luKCItIik7bi5zZXQoYSxlW29dKSxzLnNldChhLCEwKX0pLHQuZm9yRWFjaChyPT57bGV0IG89MCxhPS0xO2ZvcihsZXQgYz0wO2M8MztjKyspe2xldCBsPXlyKFtyW2NdLHJbKGMrMSklM11dKS5qb2luKCItIik7bi5nZXQobCk+byYmKG89bi5nZXQobCksYT1sKX1zLnNldChhLCExKX0pLGkubWFwKHI9PnMuZ2V0KHIuam9pbigiLSIpKSl9fWZ1bmN0aW9uIGVnKGksdCl7Y29uc3QgZT1uZXcgU2V0LG49W107aS5tYXAoYT0+e2lmKCEobWMoYS5tYXAoYz0+dFtjPnQubGVuZ3RoPzA6Y10pKT4xZS0xMikpZm9yKGxldCBjPTA7YzwzO2MrKyl7bGV0IGw9W2FbY10sYVsoYysxKSUzXV0saD1gJHtsWzBdfS0ke2xbMV19YDtlLmhhcyhoKT9lLmRlbGV0ZShoKTplLmFkZChgJHtsWzFdfS0ke2xbMF19YCl9fSk7Y29uc3Qgcz1uZXcgTWFwO2xldCByO2lmKGUuZm9yRWFjaChhPT57YT1hLnNwbGl0KCItIikubWFwKE51bWJlcikscy5zZXQoYVswXSxhWzFdKSxyPWFbMF19KSxyPT09dm9pZCAwKXJldHVybiBuO2xldCBvPXI7ZG97bi5wdXNoKG8pO2xldCBhPXMuZ2V0KG8pO3Muc2V0KG8sLTEpLG89YX13aGlsZShvPi0xJiZvIT09cik7cmV0dXJuIG59ZnVuY3Rpb24gbmcoaSl7Y29uc3QgdD1mdW5jdGlvbihlKXtpZih0LmRlbGF1bmF5PW51bGwsdC5fZGF0YT1lLHR5cGVvZiB0Ll9kYXRhPT0ib2JqZWN0IiYmdC5fZGF0YS50eXBlPT09IkZlYXR1cmVDb2xsZWN0aW9uIiYmKHQuX2RhdGE9dC5fZGF0YS5mZWF0dXJlcyksdHlwZW9mIHQuX2RhdGE9PSJvYmplY3QiKXtjb25zdCBuPXQuX2RhdGEubWFwKHM9Plt0Ll92eChzKSx0Ll92eShzKSxzXSkuZmlsdGVyKHM9PmlzRmluaXRlKHNbMF0rc1sxXSkpO3QucG9pbnRzPW4ubWFwKHM9PltzWzBdLHNbMV1dKSx0LnZhbGlkPW4ubWFwKHM9PnNbMl0pLHQuZGVsYXVuYXk9Wm0odC5wb2ludHMpfXJldHVybiB0fTtyZXR1cm4gdC5fdng9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIGU9PSJvYmplY3QiJiYidHlwZSJpbiBlKXJldHVybiAkaChlKVswXTtpZigwIGluIGUpcmV0dXJuIGVbMF19LHQuX3Z5PWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlPT0ib2JqZWN0IiYmInR5cGUiaW4gZSlyZXR1cm4gJGgoZSlbMV07aWYoMSBpbiBlKXJldHVybiBlWzFdfSx0Lng9ZnVuY3Rpb24oZSl7cmV0dXJuIGU/KHQuX3Z4PWUsdCk6dC5fdnh9LHQueT1mdW5jdGlvbihlKXtyZXR1cm4gZT8odC5fdnk9ZSx0KTp0Ll92eX0sdC5wb2x5Z29ucz1mdW5jdGlvbihlKXtpZihlIT09dm9pZCAwJiZ0KGUpLCF0LmRlbGF1bmF5KXJldHVybiExO2NvbnN0IG49e3R5cGU6IkZlYXR1cmVDb2xsZWN0aW9uIixmZWF0dXJlczpbXX07cmV0dXJuIHQudmFsaWQubGVuZ3RoPT09MHx8KHQuZGVsYXVuYXkucG9seWdvbnMuZm9yRWFjaCgocyxyKT0+bi5mZWF0dXJlcy5wdXNoKHt0eXBlOiJGZWF0dXJlIixnZW9tZXRyeTpzP3t0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbWy4uLnMsc1swXV0ubWFwKG89PnQuZGVsYXVuYXkuY2VudGVyc1tvXSldfTpudWxsLHByb3BlcnRpZXM6e3NpdGU6dC52YWxpZFtyXSxzaXRlY29vcmRpbmF0ZXM6dC5wb2ludHNbcl0sbmVpZ2hib3Vyczp0LmRlbGF1bmF5Lm5laWdoYm9yc1tyXX19KSksdC52YWxpZC5sZW5ndGg9PT0xJiZuLmZlYXR1cmVzLnB1c2goe3R5cGU6IkZlYXR1cmUiLGdlb21ldHJ5Ont0eXBlOiJTcGhlcmUifSxwcm9wZXJ0aWVzOntzaXRlOnQudmFsaWRbMF0sc2l0ZWNvb3JkaW5hdGVzOnQucG9pbnRzWzBdLG5laWdoYm91cnM6W119fSkpLG59LHQudHJpYW5nbGVzPWZ1bmN0aW9uKGUpe3JldHVybiBlIT09dm9pZCAwJiZ0KGUpLHQuZGVsYXVuYXk/e3R5cGU6IkZlYXR1cmVDb2xsZWN0aW9uIixmZWF0dXJlczp0LmRlbGF1bmF5LnRyaWFuZ2xlcy5tYXAoKG4scyk9PihuPW4ubWFwKHI9PnQucG9pbnRzW3JdKSxuLmNlbnRlcj10LmRlbGF1bmF5LmNlbnRlcnNbc10sbikpLmZpbHRlcihuPT5tYyhuKT4wKS5tYXAobj0+KHt0eXBlOiJGZWF0dXJlIixwcm9wZXJ0aWVzOntjaXJjdW1jZW50ZXI6bi5jZW50ZXJ9LGdlb21ldHJ5Ont0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbWy4uLm4sblswXV1dfX0pKX06ITF9LHQubGlua3M9ZnVuY3Rpb24oZSl7aWYoZSE9PXZvaWQgMCYmdChlKSwhdC5kZWxhdW5heSlyZXR1cm4hMTtjb25zdCBuPXQuZGVsYXVuYXkuZWRnZXMubWFwKHI9PnlpKHQucG9pbnRzW3JbMF1dLHQucG9pbnRzW3JbMV1dKSkscz10LmRlbGF1bmF5LnVycXVoYXJ0KG4pO3JldHVybnt0eXBlOiJGZWF0dXJlQ29sbGVjdGlvbiIsZmVhdHVyZXM6dC5kZWxhdW5heS5lZGdlcy5tYXAoKHIsbyk9Pih7dHlwZToiRmVhdHVyZSIscHJvcGVydGllczp7c291cmNlOnQudmFsaWRbclswXV0sdGFyZ2V0OnQudmFsaWRbclsxXV0sbGVuZ3RoOm5bb10sdXJxdWhhcnQ6ISFzW29dfSxnZW9tZXRyeTp7dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6W3QucG9pbnRzW3JbMF1dLHQucG9pbnRzW3JbMV1dXX19KSl9fSx0Lm1lc2g9ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT12b2lkIDAmJnQoZSksdC5kZWxhdW5heT97dHlwZToiTXVsdGlMaW5lU3RyaW5nIixjb29yZGluYXRlczp0LmRlbGF1bmF5LmVkZ2VzLm1hcChuPT5bdC5wb2ludHNbblswXV0sdC5wb2ludHNbblsxXV1dKX06ITF9LHQuY2VsbE1lc2g9ZnVuY3Rpb24oZSl7aWYoZSE9PXZvaWQgMCYmdChlKSwhdC5kZWxhdW5heSlyZXR1cm4hMTtjb25zdHtjZW50ZXJzOm4scG9seWdvbnM6c309dC5kZWxhdW5heSxyPVtdO2Zvcihjb25zdCBvIG9mIHMpaWYobylmb3IobGV0IGE9by5sZW5ndGgsYz1vW2EtMV0sbD1vWzBdLGg9MDtoPGE7Yz1sLGw9b1srK2hdKWw+YyYmci5wdXNoKFtuW2NdLG5bbF1dKTtyZXR1cm57dHlwZToiTXVsdGlMaW5lU3RyaW5nIixjb29yZGluYXRlczpyfX0sdC5fZm91bmQ9dm9pZCAwLHQuZmluZD1mdW5jdGlvbihlLG4scyl7aWYodC5fZm91bmQ9dC5kZWxhdW5heS5maW5kKGUsbix0Ll9mb3VuZCksIXN8fHlpKFtlLG5dLHQucG9pbnRzW3QuX2ZvdW5kXSk8cylyZXR1cm4gdC5fZm91bmR9LHQuaHVsbD1mdW5jdGlvbihlKXtlIT09dm9pZCAwJiZ0KGUpO2NvbnN0IG49dC5kZWxhdW5heS5odWxsLHM9dC5wb2ludHM7cmV0dXJuIG4ubGVuZ3RoPT09MD9udWxsOnt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbWy4uLm4ubWFwKHI9PnNbcl0pLHNbblswXV1dXX19LGk/dChpKTp0fWZ1bmN0aW9uIGlnKGksdCl7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMDpicmVhaztjYXNlIDE6dGhpcy5yYW5nZShpKTticmVhaztkZWZhdWx0OnRoaXMucmFuZ2UodCkuZG9tYWluKGkpO2JyZWFrfXJldHVybiB0aGlzfWZ1bmN0aW9uIGdjKGksdCxlKXtpLnByb3RvdHlwZT10LnByb3RvdHlwZT1lLGUuY29uc3RydWN0b3I9aX1mdW5jdGlvbiBSdShpLHQpe3ZhciBlPU9iamVjdC5jcmVhdGUoaS5wcm90b3R5cGUpO2Zvcih2YXIgbiBpbiB0KWVbbl09dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBkcygpe312YXIgcHM9LjcsanI9MS9wcyxBaT0iXFxzKihbKy1dP1xcZCspXFxzKiIseXM9IlxccyooWystXT8oPzpcXGQqXFwuKT9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLFRlPSJcXHMqKFsrLV0/KD86XFxkKlxcLik/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiIsc2c9L14jKFswLTlhLWZdezMsOH0pJC8scmc9bmV3IFJlZ0V4cChgXnJnYlxcKCR7QWl9LCR7QWl9LCR7QWl9XFwpJGApLG9nPW5ldyBSZWdFeHAoYF5yZ2JcXCgke1RlfSwke1RlfSwke1RlfVxcKSRgKSxhZz1uZXcgUmVnRXhwKGBecmdiYVxcKCR7QWl9LCR7QWl9LCR7QWl9LCR7eXN9XFwpJGApLGNnPW5ldyBSZWdFeHAoYF5yZ2JhXFwoJHtUZX0sJHtUZX0sJHtUZX0sJHt5c31cXCkkYCksbGc9bmV3IFJlZ0V4cChgXmhzbFxcKCR7eXN9LCR7VGV9LCR7VGV9XFwpJGApLGhnPW5ldyBSZWdFeHAoYF5oc2xhXFwoJHt5c30sJHtUZX0sJHtUZX0sJHt5c31cXCkkYCksTHU9e2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LGRhcmtzbGF0ZWdyZXk6MzEwMDQ5NSxkYXJrdHVycXVvaXNlOjUyOTQ1LGRhcmt2aW9sZXQ6OTY5OTUzOSxkZWVwcGluazoxNjcxNjk0NyxkZWVwc2t5Ymx1ZTo0OTE1MSxkaW1ncmF5OjY5MDgyNjUsZGltZ3JleTo2OTA4MjY1LGRvZGdlcmJsdWU6MjAwMzE5OSxmaXJlYnJpY2s6MTE2NzQxNDYsZmxvcmFsd2hpdGU6MTY3NzU5MjAsZm9yZXN0Z3JlZW46MjI2Mzg0MixmdWNoc2lhOjE2NzExOTM1LGdhaW5zYm9ybzoxNDQ3NDQ2MCxnaG9zdHdoaXRlOjE2MzE2NjcxLGdvbGQ6MTY3NjY3MjAsZ29sZGVucm9kOjE0MzI5MTIwLGdyYXk6ODQyMTUwNCxncmVlbjozMjc2OCxncmVlbnllbGxvdzoxMTQwMzA1NSxncmV5Ojg0MjE1MDQsaG9uZXlkZXc6MTU3OTQxNjAsaG90cGluazoxNjczODc0MCxpbmRpYW5yZWQ6MTM0NTg1MjQsaW5kaWdvOjQ5MTUzMzAsaXZvcnk6MTY3NzcyMDAsa2hha2k6MTU3ODc2NjAsbGF2ZW5kZXI6MTUxMzI0MTAsbGF2ZW5kZXJibHVzaDoxNjc3MzM2NSxsYXduZ3JlZW46ODE5MDk3NixsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LHJlYmVjY2FwdXJwbGU6NjY5Nzg4MSxyZWQ6MTY3MTE2ODAscm9zeWJyb3duOjEyMzU3NTE5LHJveWFsYmx1ZTo0Mjg2OTQ1LHNhZGRsZWJyb3duOjkxMjcxODcsc2FsbW9uOjE2NDE2ODgyLHNhbmR5YnJvd246MTYwMzI4NjQsc2VhZ3JlZW46MzA1MDMyNyxzZWFzaGVsbDoxNjc3NDYzOCxzaWVubmE6MTA1MDY3OTcsc2lsdmVyOjEyNjMyMjU2LHNreWJsdWU6ODkwMDMzMSxzbGF0ZWJsdWU6Njk3MDA2MSxzbGF0ZWdyYXk6NzM3Mjk0NCxzbGF0ZWdyZXk6NzM3Mjk0NCxzbm93OjE2Nzc1OTMwLHNwcmluZ2dyZWVuOjY1NDA3LHN0ZWVsYmx1ZTo0NjIwOTgwLHRhbjoxMzgwODc4MCx0ZWFsOjMyODk2LHRoaXN0bGU6MTQyMDQ4ODgsdG9tYXRvOjE2NzM3MDk1LHR1cnF1b2lzZTo0MjUxODU2LHZpb2xldDoxNTYzMTA4Nix3aGVhdDoxNjExMzMzMSx3aGl0ZToxNjc3NzIxNSx3aGl0ZXNtb2tlOjE2MTE5Mjg1LHllbGxvdzoxNjc3Njk2MCx5ZWxsb3dncmVlbjoxMDE0NTA3NH07Z2MoZHMsbXMse2NvcHkoaSl7cmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IHRoaXMuY29uc3RydWN0b3IsdGhpcyxpKX0sZGlzcGxheWFibGUoKXtyZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpfSxoZXg6T3UsZm9ybWF0SGV4Ok91LGZvcm1hdEhleDg6dWcsZm9ybWF0SHNsOmZnLGZvcm1hdFJnYjpEdSx0b1N0cmluZzpEdX0pO2Z1bmN0aW9uIE91KCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4KCl9ZnVuY3Rpb24gdWcoKXtyZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXg4KCl9ZnVuY3Rpb24gZmcoKXtyZXR1cm4gWHUodGhpcykuZm9ybWF0SHNsKCl9ZnVuY3Rpb24gRHUoKXtyZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRSZ2IoKX1mdW5jdGlvbiBtcyhpKXt2YXIgdCxlO3JldHVybiBpPShpKyIiKS50cmltKCkudG9Mb3dlckNhc2UoKSwodD1zZy5leGVjKGkpKT8oZT10WzFdLmxlbmd0aCx0PXBhcnNlSW50KHRbMV0sMTYpLGU9PT02PyR1KHQpOmU9PT0zP25ldyBHdCh0Pj44JjE1fHQ+PjQmMjQwLHQ+PjQmMTV8dCYyNDAsKHQmMTUpPDw0fHQmMTUsMSk6ZT09PTg/UXIodD4+MjQmMjU1LHQ+PjE2JjI1NSx0Pj44JjI1NSwodCYyNTUpLzI1NSk6ZT09PTQ/UXIodD4+MTImMTV8dD4+OCYyNDAsdD4+OCYxNXx0Pj40JjI0MCx0Pj40JjE1fHQmMjQwLCgodCYxNSk8PDR8dCYxNSkvMjU1KTpudWxsKToodD1yZy5leGVjKGkpKT9uZXcgR3QodFsxXSx0WzJdLHRbM10sMSk6KHQ9b2cuZXhlYyhpKSk/bmV3IEd0KHRbMV0qMjU1LzEwMCx0WzJdKjI1NS8xMDAsdFszXSoyNTUvMTAwLDEpOih0PWFnLmV4ZWMoaSkpP1FyKHRbMV0sdFsyXSx0WzNdLHRbNF0pOih0PWNnLmV4ZWMoaSkpP1FyKHRbMV0qMjU1LzEwMCx0WzJdKjI1NS8xMDAsdFszXSoyNTUvMTAwLHRbNF0pOih0PWxnLmV4ZWMoaSkpP3F1KHRbMV0sdFsyXS8xMDAsdFszXS8xMDAsMSk6KHQ9aGcuZXhlYyhpKSk/cXUodFsxXSx0WzJdLzEwMCx0WzNdLzEwMCx0WzRdKTpMdS5oYXNPd25Qcm9wZXJ0eShpKT8kdShMdVtpXSk6aT09PSJ0cmFuc3BhcmVudCI/bmV3IEd0KE5hTixOYU4sTmFOLDApOm51bGx9ZnVuY3Rpb24gJHUoaSl7cmV0dXJuIG5ldyBHdChpPj4xNiYyNTUsaT4+OCYyNTUsaSYyNTUsMSl9ZnVuY3Rpb24gUXIoaSx0LGUsbil7cmV0dXJuIG48PTAmJihpPXQ9ZT1OYU4pLG5ldyBHdChpLHQsZSxuKX1mdW5jdGlvbiBkZyhpKXtyZXR1cm4gaSBpbnN0YW5jZW9mIGRzfHwoaT1tcyhpKSksaT8oaT1pLnJnYigpLG5ldyBHdChpLnIsaS5nLGkuYixpLm9wYWNpdHkpKTpuZXcgR3R9ZnVuY3Rpb24geGMoaSx0LGUsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0xP2RnKGkpOm5ldyBHdChpLHQsZSxuPT1udWxsPzE6bil9ZnVuY3Rpb24gR3QoaSx0LGUsbil7dGhpcy5yPStpLHRoaXMuZz0rdCx0aGlzLmI9K2UsdGhpcy5vcGFjaXR5PStufWdjKEd0LHhjLFJ1KGRzLHticmlnaHRlcihpKXtyZXR1cm4gaT1pPT1udWxsP2pyOk1hdGgucG93KGpyLGkpLG5ldyBHdCh0aGlzLnIqaSx0aGlzLmcqaSx0aGlzLmIqaSx0aGlzLm9wYWNpdHkpfSxkYXJrZXIoaSl7cmV0dXJuIGk9aT09bnVsbD9wczpNYXRoLnBvdyhwcyxpKSxuZXcgR3QodGhpcy5yKmksdGhpcy5nKmksdGhpcy5iKmksdGhpcy5vcGFjaXR5KX0scmdiKCl7cmV0dXJuIHRoaXN9LGNsYW1wKCl7cmV0dXJuIG5ldyBHdChMbih0aGlzLnIpLExuKHRoaXMuZyksTG4odGhpcy5iKSxLcih0aGlzLm9wYWNpdHkpKX0sZGlzcGxheWFibGUoKXtyZXR1cm4tLjU8PXRoaXMuciYmdGhpcy5yPDI1NS41JiYtLjU8PXRoaXMuZyYmdGhpcy5nPDI1NS41JiYtLjU8PXRoaXMuYiYmdGhpcy5iPDI1NS41JiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0saGV4OlZ1LGZvcm1hdEhleDpWdSxmb3JtYXRIZXg4OnBnLGZvcm1hdFJnYjpVdSx0b1N0cmluZzpVdX0pKTtmdW5jdGlvbiBWdSgpe3JldHVybmAjJHtPbih0aGlzLnIpfSR7T24odGhpcy5nKX0ke09uKHRoaXMuYil9YH1mdW5jdGlvbiBwZygpe3JldHVybmAjJHtPbih0aGlzLnIpfSR7T24odGhpcy5nKX0ke09uKHRoaXMuYil9JHtPbigoaXNOYU4odGhpcy5vcGFjaXR5KT8xOnRoaXMub3BhY2l0eSkqMjU1KX1gfWZ1bmN0aW9uIFV1KCl7Y29uc3QgaT1Lcih0aGlzLm9wYWNpdHkpO3JldHVybmAke2k9PT0xPyJyZ2IoIjoicmdiYSgifSR7TG4odGhpcy5yKX0sICR7TG4odGhpcy5nKX0sICR7TG4odGhpcy5iKX0ke2k9PT0xPyIpIjpgLCAke2l9KWB9YH1mdW5jdGlvbiBLcihpKXtyZXR1cm4gaXNOYU4oaSk/MTpNYXRoLm1heCgwLE1hdGgubWluKDEsaSkpfWZ1bmN0aW9uIExuKGkpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKGkpfHwwKSl9ZnVuY3Rpb24gT24oaSl7cmV0dXJuIGk9TG4oaSksKGk8MTY/IjAiOiIiKStpLnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBxdShpLHQsZSxuKXtyZXR1cm4gbjw9MD9pPXQ9ZT1OYU46ZTw9MHx8ZT49MT9pPXQ9TmFOOnQ8PTAmJihpPU5hTiksbmV3IGJlKGksdCxlLG4pfWZ1bmN0aW9uIFh1KGkpe2lmKGkgaW5zdGFuY2VvZiBiZSlyZXR1cm4gbmV3IGJlKGkuaCxpLnMsaS5sLGkub3BhY2l0eSk7aWYoaSBpbnN0YW5jZW9mIGRzfHwoaT1tcyhpKSksIWkpcmV0dXJuIG5ldyBiZTtpZihpIGluc3RhbmNlb2YgYmUpcmV0dXJuIGk7aT1pLnJnYigpO3ZhciB0PWkuci8yNTUsZT1pLmcvMjU1LG49aS5iLzI1NSxzPU1hdGgubWluKHQsZSxuKSxyPU1hdGgubWF4KHQsZSxuKSxvPU5hTixhPXItcyxjPShyK3MpLzI7cmV0dXJuIGE/KHQ9PT1yP289KGUtbikvYSsoZTxuKSo2OmU9PT1yP289KG4tdCkvYSsyOm89KHQtZSkvYSs0LGEvPWM8LjU/citzOjItci1zLG8qPTYwKTphPWM+MCYmYzwxPzA6byxuZXcgYmUobyxhLGMsaS5vcGFjaXR5KX1mdW5jdGlvbiB5ZyhpLHQsZSxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTE/WHUoaSk6bmV3IGJlKGksdCxlLG49PW51bGw/MTpuKX1mdW5jdGlvbiBiZShpLHQsZSxuKXt0aGlzLmg9K2ksdGhpcy5zPSt0LHRoaXMubD0rZSx0aGlzLm9wYWNpdHk9K259Z2MoYmUseWcsUnUoZHMse2JyaWdodGVyKGkpe3JldHVybiBpPWk9PW51bGw/anI6TWF0aC5wb3coanIsaSksbmV3IGJlKHRoaXMuaCx0aGlzLnMsdGhpcy5sKmksdGhpcy5vcGFjaXR5KX0sZGFya2VyKGkpe3JldHVybiBpPWk9PW51bGw/cHM6TWF0aC5wb3cocHMsaSksbmV3IGJlKHRoaXMuaCx0aGlzLnMsdGhpcy5sKmksdGhpcy5vcGFjaXR5KX0scmdiKCl7dmFyIGk9dGhpcy5oJTM2MCsodGhpcy5oPDApKjM2MCx0PWlzTmFOKGkpfHxpc05hTih0aGlzLnMpPzA6dGhpcy5zLGU9dGhpcy5sLG49ZSsoZTwuNT9lOjEtZSkqdCxzPTIqZS1uO3JldHVybiBuZXcgR3Qod2MoaT49MjQwP2ktMjQwOmkrMTIwLHMsbiksd2MoaSxzLG4pLHdjKGk8MTIwP2krMjQwOmktMTIwLHMsbiksdGhpcy5vcGFjaXR5KX0sY2xhbXAoKXtyZXR1cm4gbmV3IGJlKFp1KHRoaXMuaCksdG8odGhpcy5zKSx0byh0aGlzLmwpLEtyKHRoaXMub3BhY2l0eSkpfSxkaXNwbGF5YWJsZSgpe3JldHVybigwPD10aGlzLnMmJnRoaXMuczw9MXx8aXNOYU4odGhpcy5zKSkmJjA8PXRoaXMubCYmdGhpcy5sPD0xJiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0sZm9ybWF0SHNsKCl7Y29uc3QgaT1Lcih0aGlzLm9wYWNpdHkpO3JldHVybmAke2k9PT0xPyJoc2woIjoiaHNsYSgifSR7WnUodGhpcy5oKX0sICR7dG8odGhpcy5zKSoxMDB9JSwgJHt0byh0aGlzLmwpKjEwMH0lJHtpPT09MT8iKSI6YCwgJHtpfSlgfWB9fSkpO2Z1bmN0aW9uIFp1KGkpe3JldHVybiBpPShpfHwwKSUzNjAsaTwwP2krMzYwOml9ZnVuY3Rpb24gdG8oaSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oMSxpfHwwKSl9ZnVuY3Rpb24gd2MoaSx0LGUpe3JldHVybihpPDYwP3QrKGUtdCkqaS82MDppPDE4MD9lOmk8MjQwP3QrKGUtdCkqKDI0MC1pKS82MDp0KSoyNTV9dmFyIGJjPWk9PigpPT5pO2Z1bmN0aW9uIG1nKGksdCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBpK2UqdH19ZnVuY3Rpb24gZ2coaSx0LGUpe3JldHVybiBpPU1hdGgucG93KGksZSksdD1NYXRoLnBvdyh0LGUpLWksZT0xL2UsZnVuY3Rpb24obil7cmV0dXJuIE1hdGgucG93KGkrbip0LGUpfX1mdW5jdGlvbiB4ZyhpKXtyZXR1cm4oaT0raSk9PTE/R3U6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS10P2dnKHQsZSxpKTpiYyhpc05hTih0KT9lOnQpfX1mdW5jdGlvbiBHdShpLHQpe3ZhciBlPXQtaTtyZXR1cm4gZT9tZyhpLGUpOmJjKGlzTmFOKGkpP3Q6aSl9dmFyIFd1PWZ1bmN0aW9uIGkodCl7dmFyIGU9eGcodCk7ZnVuY3Rpb24gbihzLHIpe3ZhciBvPWUoKHM9eGMocykpLnIsKHI9eGMocikpLnIpLGE9ZShzLmcsci5nKSxjPWUocy5iLHIuYiksbD1HdShzLm9wYWNpdHksci5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24oaCl7cmV0dXJuIHMucj1vKGgpLHMuZz1hKGgpLHMuYj1jKGgpLHMub3BhY2l0eT1sKGgpLHMrIiJ9fXJldHVybiBuLmdhbW1hPWksbn0oMSk7ZnVuY3Rpb24gd2coaSx0KXt0fHwodD1bXSk7dmFyIGU9aT9NYXRoLm1pbih0Lmxlbmd0aCxpLmxlbmd0aCk6MCxuPXQuc2xpY2UoKSxzO3JldHVybiBmdW5jdGlvbihyKXtmb3Iocz0wO3M8ZTsrK3MpbltzXT1pW3NdKigxLXIpK3Rbc10qcjtyZXR1cm4gbn19ZnVuY3Rpb24gYmcoaSl7cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhpKSYmIShpIGluc3RhbmNlb2YgRGF0YVZpZXcpfWZ1bmN0aW9uIE1nKGksdCl7dmFyIGU9dD90Lmxlbmd0aDowLG49aT9NYXRoLm1pbihlLGkubGVuZ3RoKTowLHM9bmV3IEFycmF5KG4pLHI9bmV3IEFycmF5KGUpLG87Zm9yKG89MDtvPG47KytvKXNbb109U2MoaVtvXSx0W29dKTtmb3IoO288ZTsrK28pcltvXT10W29dO3JldHVybiBmdW5jdGlvbihhKXtmb3Iobz0wO288bjsrK28pcltvXT1zW29dKGEpO3JldHVybiByfX1mdW5jdGlvbiBBZyhpLHQpe3ZhciBlPW5ldyBEYXRlO3JldHVybiBpPStpLHQ9K3QsZnVuY3Rpb24obil7cmV0dXJuIGUuc2V0VGltZShpKigxLW4pK3QqbiksZX19ZnVuY3Rpb24gZW8oaSx0KXtyZXR1cm4gaT0raSx0PSt0LGZ1bmN0aW9uKGUpe3JldHVybiBpKigxLWUpK3QqZX19ZnVuY3Rpb24gU2coaSx0KXt2YXIgZT17fSxuPXt9LHM7KGk9PT1udWxsfHx0eXBlb2YgaSE9Im9iamVjdCIpJiYoaT17fSksKHQ9PT1udWxsfHx0eXBlb2YgdCE9Im9iamVjdCIpJiYodD17fSk7Zm9yKHMgaW4gdClzIGluIGk/ZVtzXT1TYyhpW3NdLHRbc10pOm5bc109dFtzXTtyZXR1cm4gZnVuY3Rpb24ocil7Zm9yKHMgaW4gZSluW3NdPWVbc10ocik7cmV0dXJuIG59fXZhciBNYz0vWy0rXT8oPzpcZCtcLj9cZCp8XC4/XGQrKSg/OltlRV1bLStdP1xkKyk/L2csQWM9bmV3IFJlZ0V4cChNYy5zb3VyY2UsImciKTtmdW5jdGlvbiB2ZyhpKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gaX19ZnVuY3Rpb24gX2coaSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBpKHQpKyIifX1mdW5jdGlvbiB6ZyhpLHQpe3ZhciBlPU1jLmxhc3RJbmRleD1BYy5sYXN0SW5kZXg9MCxuLHMscixvPS0xLGE9W10sYz1bXTtmb3IoaT1pKyIiLHQ9dCsiIjsobj1NYy5leGVjKGkpKSYmKHM9QWMuZXhlYyh0KSk7KShyPXMuaW5kZXgpPmUmJihyPXQuc2xpY2UoZSxyKSxhW29dP2Fbb10rPXI6YVsrK29dPXIpLChuPW5bMF0pPT09KHM9c1swXSk/YVtvXT9hW29dKz1zOmFbKytvXT1zOihhWysrb109bnVsbCxjLnB1c2goe2k6byx4OmVvKG4scyl9KSksZT1BYy5sYXN0SW5kZXg7cmV0dXJuIGU8dC5sZW5ndGgmJihyPXQuc2xpY2UoZSksYVtvXT9hW29dKz1yOmFbKytvXT1yKSxhLmxlbmd0aDwyP2NbMF0/X2coY1swXS54KTp2Zyh0KToodD1jLmxlbmd0aCxmdW5jdGlvbihsKXtmb3IodmFyIGg9MCx1O2g8dDsrK2gpYVsodT1jW2hdKS5pXT11LngobCk7cmV0dXJuIGEuam9pbigiIil9KX1mdW5jdGlvbiBTYyhpLHQpe3ZhciBlPXR5cGVvZiB0LG47cmV0dXJuIHQ9PW51bGx8fGU9PT0iYm9vbGVhbiI/YmModCk6KGU9PT0ibnVtYmVyIj9lbzplPT09InN0cmluZyI/KG49bXModCkpPyh0PW4sV3UpOnpnOnQgaW5zdGFuY2VvZiBtcz9XdTp0IGluc3RhbmNlb2YgRGF0ZT9BZzpiZyh0KT93ZzpBcnJheS5pc0FycmF5KHQpP01nOnR5cGVvZiB0LnZhbHVlT2YhPSJmdW5jdGlvbiImJnR5cGVvZiB0LnRvU3RyaW5nIT0iZnVuY3Rpb24ifHxpc05hTih0KT9TZzplbykoaSx0KX1mdW5jdGlvbiBUZyhpLHQpe3JldHVybiBpPStpLHQ9K3QsZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucm91bmQoaSooMS1lKSt0KmUpfX1mdW5jdGlvbiBQZyhpKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gaX19ZnVuY3Rpb24gQ2coaSl7cmV0dXJuK2l9dmFyIEh1PVswLDFdO2Z1bmN0aW9uIFNpKGkpe3JldHVybiBpfWZ1bmN0aW9uIHZjKGksdCl7cmV0dXJuKHQtPWk9K2kpP2Z1bmN0aW9uKGUpe3JldHVybihlLWkpL3R9OlBnKGlzTmFOKHQpP05hTjouNSl9ZnVuY3Rpb24gRWcoaSx0KXt2YXIgZTtyZXR1cm4gaT50JiYoZT1pLGk9dCx0PWUpLGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLm1heChpLE1hdGgubWluKHQsbikpfX1mdW5jdGlvbiBCZyhpLHQsZSl7dmFyIG49aVswXSxzPWlbMV0scj10WzBdLG89dFsxXTtyZXR1cm4gczxuPyhuPXZjKHMsbikscj1lKG8scikpOihuPXZjKG4scykscj1lKHIsbykpLGZ1bmN0aW9uKGEpe3JldHVybiByKG4oYSkpfX1mdW5jdGlvbiBGZyhpLHQsZSl7dmFyIG49TWF0aC5taW4oaS5sZW5ndGgsdC5sZW5ndGgpLTEscz1uZXcgQXJyYXkobikscj1uZXcgQXJyYXkobiksbz0tMTtmb3IoaVtuXTxpWzBdJiYoaT1pLnNsaWNlKCkucmV2ZXJzZSgpLHQ9dC5zbGljZSgpLnJldmVyc2UoKSk7KytvPG47KXNbb109dmMoaVtvXSxpW28rMV0pLHJbb109ZSh0W29dLHRbbysxXSk7cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBjPU5wKGksYSwxLG4pLTE7cmV0dXJuIHJbY10oc1tjXShhKSl9fWZ1bmN0aW9uIElnKGksdCl7cmV0dXJuIHQuZG9tYWluKGkuZG9tYWluKCkpLnJhbmdlKGkucmFuZ2UoKSkuaW50ZXJwb2xhdGUoaS5pbnRlcnBvbGF0ZSgpKS5jbGFtcChpLmNsYW1wKCkpLnVua25vd24oaS51bmtub3duKCkpfWZ1bmN0aW9uIGtnKCl7dmFyIGk9SHUsdD1IdSxlPVNjLG4scyxyLG89U2ksYSxjLGw7ZnVuY3Rpb24gaCgpe3ZhciBmPU1hdGgubWluKGkubGVuZ3RoLHQubGVuZ3RoKTtyZXR1cm4gbyE9PVNpJiYobz1FZyhpWzBdLGlbZi0xXSkpLGE9Zj4yP0ZnOkJnLGM9bD1udWxsLHV9ZnVuY3Rpb24gdShmKXtyZXR1cm4gZj09bnVsbHx8aXNOYU4oZj0rZik/cjooY3x8KGM9YShpLm1hcChuKSx0LGUpKSkobihvKGYpKSl9cmV0dXJuIHUuaW52ZXJ0PWZ1bmN0aW9uKGYpe3JldHVybiBvKHMoKGx8fChsPWEodCxpLm1hcChuKSxlbykpKShmKSkpfSx1LmRvbWFpbj1mdW5jdGlvbihmKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1BcnJheS5mcm9tKGYsQ2cpLGgoKSk6aS5zbGljZSgpfSx1LnJhbmdlPWZ1bmN0aW9uKGYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PUFycmF5LmZyb20oZiksaCgpKTp0LnNsaWNlKCl9LHUucmFuZ2VSb3VuZD1mdW5jdGlvbihmKXtyZXR1cm4gdD1BcnJheS5mcm9tKGYpLGU9VGcsaCgpfSx1LmNsYW1wPWZ1bmN0aW9uKGYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWY/ITA6U2ksaCgpKTpvIT09U2l9LHUuaW50ZXJwb2xhdGU9ZnVuY3Rpb24oZil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ZixoKCkpOmV9LHUudW5rbm93bj1mdW5jdGlvbihmKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1mLHUpOnJ9LGZ1bmN0aW9uKGYsZCl7cmV0dXJuIG49ZixzPWQsaCgpfX1mdW5jdGlvbiBOZygpe3JldHVybiBrZygpKFNpLFNpKX1mdW5jdGlvbiBSZyhpKXtyZXR1cm4gTWF0aC5hYnMoaT1NYXRoLnJvdW5kKGkpKT49MWUyMT9pLnRvTG9jYWxlU3RyaW5nKCJlbiIpLnJlcGxhY2UoLywvZywiIik6aS50b1N0cmluZygxMCl9ZnVuY3Rpb24gbm8oaSx0KXtpZigoZT0oaT10P2kudG9FeHBvbmVudGlhbCh0LTEpOmkudG9FeHBvbmVudGlhbCgpKS5pbmRleE9mKCJlIikpPDApcmV0dXJuIG51bGw7dmFyIGUsbj1pLnNsaWNlKDAsZSk7cmV0dXJuW24ubGVuZ3RoPjE/blswXStuLnNsaWNlKDIpOm4sK2kuc2xpY2UoZSsxKV19ZnVuY3Rpb24gdmkoaSl7cmV0dXJuIGk9bm8oTWF0aC5hYnMoaSkpLGk/aVsxXTpOYU59ZnVuY3Rpb24gTGcoaSx0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtmb3IodmFyIHM9ZS5sZW5ndGgscj1bXSxvPTAsYT1pWzBdLGM9MDtzPjAmJmE+MCYmKGMrYSsxPm4mJihhPU1hdGgubWF4KDEsbi1jKSksci5wdXNoKGUuc3Vic3RyaW5nKHMtPWEscythKSksISgoYys9YSsxKT5uKSk7KWE9aVtvPShvKzEpJWkubGVuZ3RoXTtyZXR1cm4gci5yZXZlcnNlKCkuam9pbih0KX19ZnVuY3Rpb24gT2coaSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0LnJlcGxhY2UoL1swLTldL2csZnVuY3Rpb24oZSl7cmV0dXJuIGlbK2VdfSl9fXZhciBEZz0vXig/OiguKT8oWzw+PV5dKSk/KFsrXC0oIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KH4pPyhbYS16JV0pPyQvaTtmdW5jdGlvbiBpbyhpKXtpZighKHQ9RGcuZXhlYyhpKSkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvcm1hdDogIitpKTt2YXIgdDtyZXR1cm4gbmV3IF9jKHtmaWxsOnRbMV0sYWxpZ246dFsyXSxzaWduOnRbM10sc3ltYm9sOnRbNF0semVybzp0WzVdLHdpZHRoOnRbNl0sY29tbWE6dFs3XSxwcmVjaXNpb246dFs4XSYmdFs4XS5zbGljZSgxKSx0cmltOnRbOV0sdHlwZTp0WzEwXX0pfWlvLnByb3RvdHlwZT1fYy5wcm90b3R5cGU7ZnVuY3Rpb24gX2MoaSl7dGhpcy5maWxsPWkuZmlsbD09PXZvaWQgMD8iICI6aS5maWxsKyIiLHRoaXMuYWxpZ249aS5hbGlnbj09PXZvaWQgMD8iPiI6aS5hbGlnbisiIix0aGlzLnNpZ249aS5zaWduPT09dm9pZCAwPyItIjppLnNpZ24rIiIsdGhpcy5zeW1ib2w9aS5zeW1ib2w9PT12b2lkIDA/IiI6aS5zeW1ib2wrIiIsdGhpcy56ZXJvPSEhaS56ZXJvLHRoaXMud2lkdGg9aS53aWR0aD09PXZvaWQgMD92b2lkIDA6K2kud2lkdGgsdGhpcy5jb21tYT0hIWkuY29tbWEsdGhpcy5wcmVjaXNpb249aS5wcmVjaXNpb249PT12b2lkIDA/dm9pZCAwOitpLnByZWNpc2lvbix0aGlzLnRyaW09ISFpLnRyaW0sdGhpcy50eXBlPWkudHlwZT09PXZvaWQgMD8iIjppLnR5cGUrIiJ9X2MucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsbCt0aGlzLmFsaWduK3RoaXMuc2lnbit0aGlzLnN5bWJvbCsodGhpcy56ZXJvPyIwIjoiIikrKHRoaXMud2lkdGg9PT12b2lkIDA/IiI6TWF0aC5tYXgoMSx0aGlzLndpZHRofDApKSsodGhpcy5jb21tYT8iLCI6IiIpKyh0aGlzLnByZWNpc2lvbj09PXZvaWQgMD8iIjoiLiIrTWF0aC5tYXgoMCx0aGlzLnByZWNpc2lvbnwwKSkrKHRoaXMudHJpbT8ifiI6IiIpK3RoaXMudHlwZX07ZnVuY3Rpb24gJGcoaSl7dDpmb3IodmFyIHQ9aS5sZW5ndGgsZT0xLG49LTEscztlPHQ7KytlKXN3aXRjaChpW2VdKXtjYXNlIi4iOm49cz1lO2JyZWFrO2Nhc2UiMCI6bj09PTAmJihuPWUpLHM9ZTticmVhaztkZWZhdWx0OmlmKCEraVtlXSlicmVhayB0O24+MCYmKG49MCk7YnJlYWt9cmV0dXJuIG4+MD9pLnNsaWNlKDAsbikraS5zbGljZShzKzEpOml9dmFyIEp1O2Z1bmN0aW9uIFZnKGksdCl7dmFyIGU9bm8oaSx0KTtpZighZSlyZXR1cm4gaSsiIjt2YXIgbj1lWzBdLHM9ZVsxXSxyPXMtKEp1PU1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihzLzMpKSkqMykrMSxvPW4ubGVuZ3RoO3JldHVybiByPT09bz9uOnI+bz9uK25ldyBBcnJheShyLW8rMSkuam9pbigiMCIpOnI+MD9uLnNsaWNlKDAscikrIi4iK24uc2xpY2Uocik6IjAuIituZXcgQXJyYXkoMS1yKS5qb2luKCIwIikrbm8oaSxNYXRoLm1heCgwLHQrci0xKSlbMF19ZnVuY3Rpb24gWXUoaSx0KXt2YXIgZT1ubyhpLHQpO2lmKCFlKXJldHVybiBpKyIiO3ZhciBuPWVbMF0scz1lWzFdO3JldHVybiBzPDA/IjAuIituZXcgQXJyYXkoLXMpLmpvaW4oIjAiKStuOm4ubGVuZ3RoPnMrMT9uLnNsaWNlKDAscysxKSsiLiIrbi5zbGljZShzKzEpOm4rbmV3IEFycmF5KHMtbi5sZW5ndGgrMikuam9pbigiMCIpfXZhciBqdT17IiUiOihpLHQpPT4oaSoxMDApLnRvRml4ZWQodCksYjppPT5NYXRoLnJvdW5kKGkpLnRvU3RyaW5nKDIpLGM6aT0+aSsiIixkOlJnLGU6KGksdCk9PmkudG9FeHBvbmVudGlhbCh0KSxmOihpLHQpPT5pLnRvRml4ZWQodCksZzooaSx0KT0+aS50b1ByZWNpc2lvbih0KSxvOmk9Pk1hdGgucm91bmQoaSkudG9TdHJpbmcoOCkscDooaSx0KT0+WXUoaSoxMDAsdCkscjpZdSxzOlZnLFg6aT0+TWF0aC5yb3VuZChpKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSx4Omk9Pk1hdGgucm91bmQoaSkudG9TdHJpbmcoMTYpfTtmdW5jdGlvbiBRdShpKXtyZXR1cm4gaX12YXIgS3U9QXJyYXkucHJvdG90eXBlLm1hcCx0Zj1bInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIsK1IiwibSIsIiIsImsiLCJNIiwiRyIsIlQiLCJQIiwiRSIsIloiLCJZIl07ZnVuY3Rpb24gVWcoaSl7dmFyIHQ9aS5ncm91cGluZz09PXZvaWQgMHx8aS50aG91c2FuZHM9PT12b2lkIDA/UXU6TGcoS3UuY2FsbChpLmdyb3VwaW5nLE51bWJlciksaS50aG91c2FuZHMrIiIpLGU9aS5jdXJyZW5jeT09PXZvaWQgMD8iIjppLmN1cnJlbmN5WzBdKyIiLG49aS5jdXJyZW5jeT09PXZvaWQgMD8iIjppLmN1cnJlbmN5WzFdKyIiLHM9aS5kZWNpbWFsPT09dm9pZCAwPyIuIjppLmRlY2ltYWwrIiIscj1pLm51bWVyYWxzPT09dm9pZCAwP1F1Ok9nKEt1LmNhbGwoaS5udW1lcmFscyxTdHJpbmcpKSxvPWkucGVyY2VudD09PXZvaWQgMD8iJSI6aS5wZXJjZW50KyIiLGE9aS5taW51cz09PXZvaWQgMD8i4oiSIjppLm1pbnVzKyIiLGM9aS5uYW49PT12b2lkIDA/Ik5hTiI6aS5uYW4rIiI7ZnVuY3Rpb24gbCh1KXt1PWlvKHUpO3ZhciBmPXUuZmlsbCxkPXUuYWxpZ24scD11LnNpZ24seT11LnN5bWJvbCxnPXUuemVybyx3PXUud2lkdGgsYj11LmNvbW1hLHg9dS5wcmVjaXNpb24sbT11LnRyaW0sTT11LnR5cGU7TT09PSJuIj8oYj0hMCxNPSJnIik6anVbTV18fCh4PT09dm9pZCAwJiYoeD0xMiksbT0hMCxNPSJnIiksKGd8fGY9PT0iMCImJmQ9PT0iPSIpJiYoZz0hMCxmPSIwIixkPSI9Iik7dmFyIFM9eT09PSIkIj9lOnk9PT0iIyImJi9bYm94WF0vLnRlc3QoTSk/IjAiK00udG9Mb3dlckNhc2UoKToiIixBPXk9PT0iJCI/bjovWyVwXS8udGVzdChNKT9vOiIiLHY9anVbTV0sXz0vW2RlZmdwcnMlXS8udGVzdChNKTt4PXg9PT12b2lkIDA/NjovW2dwcnNdLy50ZXN0KE0pP01hdGgubWF4KDEsTWF0aC5taW4oMjEseCkpOk1hdGgubWF4KDAsTWF0aC5taW4oMjAseCkpO2Z1bmN0aW9uIFQoeil7dmFyIEM9UyxFPUEsRixCLEk7aWYoTT09PSJjIilFPXYoeikrRSx6PSIiO2Vsc2V7ej0rejt2YXIgUj16PDB8fDEvejwwO2lmKHo9aXNOYU4oeik/Yzp2KE1hdGguYWJzKHopLHgpLG0mJih6PSRnKHopKSxSJiYrej09MCYmcCE9PSIrIiYmKFI9ITEpLEM9KFI/cD09PSIoIj9wOmE6cD09PSItInx8cD09PSIoIj8iIjpwKStDLEU9KE09PT0icyI/dGZbOCtKdS8zXToiIikrRSsoUiYmcD09PSIoIj8iKSI6IiIpLF8pe2ZvcihGPS0xLEI9ei5sZW5ndGg7KytGPEI7KWlmKEk9ei5jaGFyQ29kZUF0KEYpLDQ4Pkl8fEk+NTcpe0U9KEk9PT00Nj9zK3ouc2xpY2UoRisxKTp6LnNsaWNlKEYpKStFLHo9ei5zbGljZSgwLEYpO2JyZWFrfX19YiYmIWcmJih6PXQoeiwxLzApKTt2YXIgVj1DLmxlbmd0aCt6Lmxlbmd0aCtFLmxlbmd0aCxVPVY8dz9uZXcgQXJyYXkody1WKzEpLmpvaW4oZik6IiI7c3dpdGNoKGImJmcmJih6PXQoVSt6LFUubGVuZ3RoP3ctRS5sZW5ndGg6MS8wKSxVPSIiKSxkKXtjYXNlIjwiOno9Qyt6K0UrVTticmVhaztjYXNlIj0iOno9QytVK3orRTticmVhaztjYXNlIl4iOno9VS5zbGljZSgwLFY9VS5sZW5ndGg+PjEpK0MreitFK1Uuc2xpY2UoVik7YnJlYWs7ZGVmYXVsdDp6PVUrQyt6K0U7YnJlYWt9cmV0dXJuIHIoeil9cmV0dXJuIFQudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdSsiIn0sVH1mdW5jdGlvbiBoKHUsZil7dmFyIGQ9bCgodT1pbyh1KSx1LnR5cGU9ImYiLHUpKSxwPU1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcih2aShmKS8zKSkpKjMseT1NYXRoLnBvdygxMCwtcCksZz10Zls4K3AvM107cmV0dXJuIGZ1bmN0aW9uKHcpe3JldHVybiBkKHkqdykrZ319cmV0dXJue2Zvcm1hdDpsLGZvcm1hdFByZWZpeDpofX12YXIgc28sZWYsbmY7cWcoe3Rob3VzYW5kczoiLCIsZ3JvdXBpbmc6WzNdLGN1cnJlbmN5OlsiJCIsIiJdfSk7ZnVuY3Rpb24gcWcoaSl7cmV0dXJuIHNvPVVnKGkpLGVmPXNvLmZvcm1hdCxuZj1zby5mb3JtYXRQcmVmaXgsc299ZnVuY3Rpb24gWGcoaSl7cmV0dXJuIE1hdGgubWF4KDAsLXZpKE1hdGguYWJzKGkpKSl9ZnVuY3Rpb24gWmcoaSx0KXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IodmkodCkvMykpKSozLXZpKE1hdGguYWJzKGkpKSl9ZnVuY3Rpb24gR2coaSx0KXtyZXR1cm4gaT1NYXRoLmFicyhpKSx0PU1hdGguYWJzKHQpLWksTWF0aC5tYXgoMCx2aSh0KS12aShpKSkrMX1mdW5jdGlvbiBXZyhpLHQsZSxuKXt2YXIgcz0kcChpLHQsZSkscjtzd2l0Y2gobj1pbyhuPT1udWxsPyIsZiI6biksbi50eXBlKXtjYXNlInMiOnt2YXIgbz1NYXRoLm1heChNYXRoLmFicyhpKSxNYXRoLmFicyh0KSk7cmV0dXJuIG4ucHJlY2lzaW9uPT1udWxsJiYhaXNOYU4ocj1aZyhzLG8pKSYmKG4ucHJlY2lzaW9uPXIpLG5mKG4sbyl9Y2FzZSIiOmNhc2UiZSI6Y2FzZSJnIjpjYXNlInAiOmNhc2UiciI6e24ucHJlY2lzaW9uPT1udWxsJiYhaXNOYU4ocj1HZyhzLE1hdGgubWF4KE1hdGguYWJzKGkpLE1hdGguYWJzKHQpKSkpJiYobi5wcmVjaXNpb249ci0obi50eXBlPT09ImUiKSk7YnJlYWt9Y2FzZSJmIjpjYXNlIiUiOntuLnByZWNpc2lvbj09bnVsbCYmIWlzTmFOKHI9WGcocykpJiYobi5wcmVjaXNpb249ci0obi50eXBlPT09IiUiKSoyKTticmVha319cmV0dXJuIGVmKG4pfWZ1bmN0aW9uIEhnKGkpe3ZhciB0PWkuZG9tYWluO3JldHVybiBpLnRpY2tzPWZ1bmN0aW9uKGUpe3ZhciBuPXQoKTtyZXR1cm4gRHAoblswXSxuW24ubGVuZ3RoLTFdLGU9PW51bGw/MTA6ZSl9LGkudGlja0Zvcm1hdD1mdW5jdGlvbihlLG4pe3ZhciBzPXQoKTtyZXR1cm4gV2coc1swXSxzW3MubGVuZ3RoLTFdLGU9PW51bGw/MTA6ZSxuKX0saS5uaWNlPWZ1bmN0aW9uKGUpe2U9PW51bGwmJihlPTEwKTt2YXIgbj10KCkscz0wLHI9bi5sZW5ndGgtMSxvPW5bc10sYT1uW3JdLGMsbCxoPTEwO2ZvcihhPG8mJihsPW8sbz1hLGE9bCxsPXMscz1yLHI9bCk7aC0tID4wOyl7aWYobD1rYShvLGEsZSksbD09PWMpcmV0dXJuIG5bc109byxuW3JdPWEsdChuKTtpZihsPjApbz1NYXRoLmZsb29yKG8vbCkqbCxhPU1hdGguY2VpbChhL2wpKmw7ZWxzZSBpZihsPDApbz1NYXRoLmNlaWwobypsKS9sLGE9TWF0aC5mbG9vcihhKmwpL2w7ZWxzZSBicmVhaztjPWx9cmV0dXJuIGl9LGl9ZnVuY3Rpb24gemMoKXt2YXIgaT1OZygpO3JldHVybiBpLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gSWcoaSx6YygpKX0saWcuYXBwbHkoaSxhcmd1bWVudHMpLEhnKGkpfWZ1bmN0aW9uIEpnKGksdCl7cmV0dXJuIGkubWFwKGU9Pntjb25zdCBuPVtdO2xldCBzO3JldHVybiBlLmZvckVhY2gocj0+e2lmKHMpe2NvbnN0IG89eWkocixzKSoxODAvTWF0aC5QSTtpZihvPnQpe2NvbnN0IGE9QXkocyxyKSxjPTEvTWF0aC5jZWlsKG8vdCk7bGV0IGw9Yztmb3IoO2w8MTspbi5wdXNoKGEobCkpLGwrPWN9fW4ucHVzaChzPXIpfSksbn0pfWZ1bmN0aW9uIFlnKGkse21pbkxuZzp0LG1heExuZzplLG1pbkxhdDpuLG1heExhdDpzfT17fSl7Y29uc3Qgcj1NYXRoLnJvdW5kKHppKDM2MC9pLDIpL01hdGguUEkpLG89KDErTWF0aC5zcXJ0KDUpKS8yLGE9ZD0+ZC9vKjM2MCUzNjAtMTgwLGM9ZD0+TWF0aC5hY29zKDIqZC9yLTEpL01hdGguUEkqMTgwLTkwLGw9ZD0+ciooTWF0aC5jb3MoKGQrOTApKk1hdGguUEkvMTgwKSsxKS8yLGg9W3MhPT12b2lkIDA/TWF0aC5jZWlsKGwocykpOjAsbiE9PXZvaWQgMD9NYXRoLmZsb29yKGwobikpOnItMV0sdT10PT09dm9pZCAwJiZlPT09dm9pZCAwPygpPT4hMDp0PT09dm9pZCAwP2Q9PmQ8PWU6ZT09PXZvaWQgMD9kPT5kPj10OmU+PXQ/ZD0+ZD49dCYmZDw9ZTpkPT5kPj10fHxkPD1lLGY9W107Zm9yKGxldCBkPWhbMF07ZDw9aFsxXTtkKyspe2NvbnN0IHA9YShkKTt1KHApJiZmLnB1c2goW3AsYyhkKV0pfXJldHVybiBmfWZ1bmN0aW9uIFRjKGksdCxlPSExKXtyZXR1cm4gZT9NeSh0LGkpOkJtKGksdCl9ZnVuY3Rpb24gamcoaSx0KXtjb25zdCBlPXt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczppfSxbW24sc10sW3Isb11dPWtoKGUpO2lmKE1hdGgubWluKE1hdGguYWJzKHItbiksTWF0aC5hYnMoby1zKSk8dClyZXR1cm5bXTtjb25zdCBhPW4+cnx8bz49ODl8fHM8PS04OTtyZXR1cm4gWWcodCx7bWluTG5nOm4sbWF4TG5nOnIsbWluTGF0OnMsbWF4TGF0Om99KS5maWx0ZXIoYz0+VGMoYyxlLGEpKX1mdW5jdGlvbiBRZyhpLHtyZXNvbHV0aW9uOnQ9MS8wLGJib3g6ZSxwcm9qZWN0aW9uOm59PXt9KXtjb25zdCBzPUpnKGksdCkscj1ZaShzKSxvPWpnKGksdCksYT1bLi4uciwuLi5vXSxjPXt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczppfSxbW2wsaF0sW3UsZl1dPWtoKGMpLGQ9bD51fHxmPj04OXx8aDw9LTg5O2xldCBwPVtdO2lmKGQpe2NvbnN0IE09bmcoYSkudHJpYW5nbGVzKCksUz1uZXcgTWFwKGEubWFwKChbQSx2XSxfKT0+W2Ake0F9LSR7dn1gLF9dKSk7TS5mZWF0dXJlcy5mb3JFYWNoKEE9Pntjb25zdCB2PUEuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0uc2xpY2UoMCwzKS5yZXZlcnNlKCksXz1bXTtpZih2LmZvckVhY2goKFtULHpdKT0+e2NvbnN0IEM9YCR7VH0tJHt6fWA7Uy5oYXMoQykmJl8ucHVzaChTLmdldChDKSl9KSxfLmxlbmd0aD09PTMpe2lmKF8uc29tZShUPT5UPHIubGVuZ3RoKSl7Y29uc3QgVD1BLnByb3BlcnRpZXMuY2lyY3VtY2VudGVyO2lmKCFUYyhULGMsZCkpcmV0dXJufXAucHVzaCguLi5fKX19KX1lbHNlIGlmKG8ubGVuZ3RoKXtjb25zdCBNPXVzLmZyb20oYSk7Zm9yKGxldCBTPTAsQT1NLnRyaWFuZ2xlcy5sZW5ndGg7UzxBO1MrPTMpe2NvbnN0IHY9WzIsMSwwXS5tYXAoVD0+TS50cmlhbmdsZXNbUytUXSksXz12Lm1hcChUPT5hW1RdKTtpZih2LnNvbWUoVD0+VDxyLmxlbmd0aCkpe2NvbnN0IFQ9WzAsMV0ubWFwKHo9PlZwKF8sQz0+Q1t6XSkpO2lmKCFUYyhULGMsZCkpY29udGludWV9cC5wdXNoKC4uLnYpfX1lbHNle2NvbnN0e3ZlcnRpY2VzOk0saG9sZXM6Uz1bXX09QXUocyk7cD1IeShNLFMsMil9bGV0IHk9ZT9bZVswXSxlWzJdXTp5cihhLE09Pk1bMF0pLGc9ZT9bZVsxXSxlWzNdXTp5cihhLE09Pk1bMV0pO2lmKG4pe2NvbnN0W00sU109bihbeVswXSxnWzBdXSksW0Esdl09bihbeVsxXSxnWzFdXSk7eT1bTSxBXSxnPVstUywtdl19Y29uc3Qgdz16Yyh5LFswLDFdKSxiPXpjKGcsWzAsMV0pLHg9YS5tYXAoKFtNLFNdKT0+e2lmKG4pe2NvbnN0W0Esdl09bihbTSxTXSk7cmV0dXJuW3coQSksYigtdildfWVsc2UgcmV0dXJuW3coTSksYihTKV19KTtyZXR1cm57Y29udG91cjpzLHRyaWFuZ2xlczp7cG9pbnRzOmEsaW5kaWNlczpwLHV2czp4fX19Y29uc3Qgc2Y9bmV3IEFlKCkuc2V0QXR0cmlidXRlPyJzZXRBdHRyaWJ1dGUiOiJhZGRBdHRyaWJ1dGUiO2Z1bmN0aW9uIHJvKGksdCxlKXtjb25zdCBuPWkubWFwKHM9PnMubWFwKChbcixvXSk9PntpZihlPT09ImNlc2l1bSIpe2NvbnN0IGE9MS9rbi5hLGM9dC9hLGw9TWF0aC5tYXgoMCxjLWtuLmEpLGg9eXUocixvLGwsYSwhMSk7cmV0dXJuW2gueCxoLnksaC56XX1pZihlPT09InNwaGVyZSIpe2NvbnN0IGE9eXUocixvLHQta24uYSwxLCEwKTtyZXR1cm5bYS54LGEueSxhLnpdfWlmKHR5cGVvZiBlPT0iZnVuY3Rpb24iKXtjb25zdFthLGNdPWUoW3Isb10pO3JldHVyblthLC1jLHRdfXJldHVybltyLG8sdF19KSk7cmV0dXJuIEF1KG4pfWZ1bmN0aW9uIEtnKGksdCxlLG4pe2NvbnN0e3ZlcnRpY2VzOnMsaG9sZXM6cn09cm8oaSx0LG4pLHt2ZXJ0aWNlczpvfT1ybyhpLGUsbiksYT1ZaShbbyxzXSksYz1NYXRoLnJvdW5kKG8ubGVuZ3RoLzMpLGw9bmV3IFNldChyKTtsZXQgaD0wO2NvbnN0IHU9W107Zm9yKGxldCBkPTA7ZDxjO2QrKyl7bGV0IHA9ZCsxO2lmKHA9PT1jKXA9aDtlbHNlIGlmKGwuaGFzKHApKXtjb25zdCB5PXA7cD1oLGg9eX11LnB1c2goZCxkK2MscCtjKSx1LnB1c2gocCtjLHAsZCl9Y29uc3QgZj1bXTtmb3IobGV0IGQ9MTtkPj0wO2QtLSlmb3IobGV0IHA9MDtwPGM7cCs9MSlmLnB1c2gocC8oYy0xKSxkKTtyZXR1cm57aW5kaWNlczp1LHZlcnRpY2VzOmEsdXZzOmYsdG9wVmVydHM6b319ZnVuY3Rpb24gcmYoaSx0LGUsbixzKXtyZXR1cm57aW5kaWNlczpuP2kuaW5kaWNlczppLmluZGljZXMuc2xpY2UoKS5yZXZlcnNlKCksdmVydGljZXM6cm8oW2kucG9pbnRzXSx0LHMpLnZlcnRpY2VzLHV2czplfX1jb25zdCBvZj0oe3BvbHlnb25HZW9Kc29uOmksc3RhcnRIZWlnaHQ6dCxlbmRIZWlnaHQ6ZSxjdXJ2YXR1cmVSZXNvbHV0aW9uOm49MSxoYXNTaWRlOnM9ITAsaGFzQm90dG9tOnI9ITEsaGFzVG9wOm89ITEscHJvamVjdGlvbjphPSJzcGhlcmUiLGJib3g6Y30pPT57aS5mb3JFYWNoKHc9Pnt5bSh3KXx8dy5yZXZlcnNlKCl9KTtjb25zdCBsPXR5cGVvZiBhPT0iZnVuY3Rpb24iP2E6dm9pZCAwLHtjb250b3VyOmgsdHJpYW5nbGVzOnV9PVFnKGkse3Jlc29sdXRpb246bixiYm94OmMscHJvamVjdGlvbjpsfSk7bGV0IGY9e30sZDtzJiYoZj1LZyhoLHQhPW51bGw/dDplLGUhPW51bGw/ZTp0LGEpLGQ9Zi50b3BWZXJ0cyk7bGV0IHA9W107KHJ8fG8pJiYocD1ZaSh1LnV2cykpO2xldCB5PXt9O3ImJih5PXJmKHUsdCxwLCExLGEpKTtsZXQgZz17fTtyZXR1cm4gbyYmKGc9cmYodSxlLHAsITAsYSkpLHtjb250b3VyOmgsdHJpYW5nbGVzOnUsc2lkZVRvcnNvOmYsYm90dG9tQ2FwOnksdG9wQ2FwOmcsdG9wVmVydHM6ZH19O2NsYXNzIHR4IGV4dGVuZHMgQWV7Y29uc3RydWN0b3IodCxlPXt9KXtzdXBlcigpLHRoaXMudHlwZT0iUG9seWdvbkJ1ZmZlckdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9VXQoe3BvbHlnb25HZW9Kc29uOnQsc3RhcnRIZWlnaHQ6MCxlbmRIZWlnaHQ6MSxoYXNUb3A6ITAsdG9wRmlyc3Q6ITEsaGFzQm90dG9tOiEwLGhhc1NpZGU6ITAsY3VydmF0dXJlUmVzb2x1dGlvbjoxLHByb2plY3Rpb246InNwaGVyZSIsdXNlckRhdGFSc29PZmZzZXQ6MH0sZSk7Y29uc3R7ZW5kSGVpZ2h0Om4saGFzVG9wOnMsdG9wRmlyc3Q6cixoYXNCb3R0b206byxoYXNTaWRlOmEsdXNlckRhdGFSc29PZmZzZXQ6Yyxwcm9qZWN0aW9uOmx9PXRoaXMucGFyYW1ldGVycyx7Y29udG91cjpoLHNpZGVUb3Jzbzp1LHRvcFZlcnRzOmYsYm90dG9tQ2FwOmQsdG9wQ2FwOnB9PW9mKFV0KHt9LHRoaXMucGFyYW1ldGVycykpO2xldCB5PVtdLGc9W10sdz1bXSxiPTA7Y29uc3QgeD1tPT57Y29uc3QgTT1NYXRoLnJvdW5kKHkubGVuZ3RoLzMpLFM9dy5sZW5ndGg7eT15LmNvbmNhdChtLnZlcnRpY2VzKSxnPWcuY29uY2F0KG0udXZzKSx3PXcuY29uY2F0KE0/bS5pbmRpY2VzLm1hcChBPT5BK00pOm0uaW5kaWNlcyksdGhpcy5hZGRHcm91cChTLHcubGVuZ3RoLVMsYisrKX07cyYmciYmeChwKSxhJiYoeCh1KSx0aGlzLnVzZXJEYXRhLnRvcFZlcnRzPWM/cm8oaCxuK2MsbCkudmVydGljZXM6ZiksbyYmeChkKSxzJiYhciYmeChwKSx0aGlzLnNldEluZGV4KHcpLHRoaXNbc2ZdKCJwb3NpdGlvbiIsbmV3IFJlKHksMykpLHRoaXNbc2ZdKCJ1diIsbmV3IFJlKGcsMikpLHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKX19dmFyIGV4PWk9Pntjb25zdCBhPWkse2Nvb3JkaW5hdGU6dCxzdGFydEhlaWdodDplLGhlaWdodDpufT1hLHM9eGYoYSxbImNvb3JkaW5hdGUiLCJzdGFydEhlaWdodCIsImhlaWdodCJdKTtsZXQgcj1lfHwwO3JldHVybiB0eXBlb2YgZSE9InVuZGVmaW5lZCImJnR5cGVvZiBuIT0idW5kZWZpbmVkIiYmKHI9ZStuKSxuZXcgdHgoW3RdLEtlKFV0KHt9LHMpLHtzdGFydEhlaWdodDplLGVuZEhlaWdodDpyfSkpfTtjb25zdCBueD0oe2Nvb3JkaW5hdGVzOmksbGVuZ3Roczp0LG1ldGFMZW5ndGg6ZSx1c2VHcm91cHM6bixoYXNUb3A6cyx0b3BGaXJzdDpyLGhhc0JvdHRvbTpvLGhhc1NpZGU6YSxwcm9qZWN0aW9uOmMsY3VydmF0dXJlUmVzb2x1dGlvbjpsLGJib3g6aH0pPT57bGV0IHU7YyYmdHlwZW9mIGM9PSJvYmplY3QiP3U9aXMoYyk6dT1jfHwic3BoZXJlIjtjb25zdHtjb29yZGluYXRlc0FycjpmLG1ldGFBcnJheTpkfT1zcyh7Y29vcmRpbmF0ZXM6aSxsZW5ndGhzOnQsbWV0YUxlbmd0aDplfSkscD1mLm1hcCgoeSxnKT0+e2NvbnN0IHc9ZFtnXVswXSxiPWRbZ11bMV18fDA7cmV0dXJuIGV4KHtjb29yZGluYXRlOnkscHJvamVjdGlvbjp1LHN0YXJ0SGVpZ2h0OmIsaGVpZ2h0OncsaGFzVG9wOnMhPW51bGw/czohMCx0b3BGaXJzdDpyIT1udWxsP3I6ITEsaGFzQm90dG9tOm8hPW51bGw/bzohMCxoYXNTaWRlOmEhPW51bGw/YTohMCxjdXJ2YXR1cmVSZXNvbHV0aW9uOmwhPW51bGw/bDoxLGJib3g6aH0pfSk7cmV0dXJuIHJzKHAsbil9LGl4PSh7Y29vcmRpbmF0ZXM6aSxsZW5ndGhzOnQsbWV0YUxlbmd0aDplLHVzZUdyb3VwczpuLHByb2plY3Rpb246cz0ic3BoZXJlIn0pPT57Y29uc3R7Y29vcmRpbmF0ZXNBcnI6cixtZXRhQXJyYXk6b309c3Moe2Nvb3JkaW5hdGVzOmksbGVuZ3Roczp0LG1ldGFMZW5ndGg6ZX0pLGM9ci5tYXAoKGwsaCk9Pntjb25zdCB1PW9baF1bMV18fDA7cmV0dXJuIG9mKHtwb2x5Z29uR2VvSnNvbjpbbF0sc3RhcnRIZWlnaHQ6dSxwcm9qZWN0aW9uOnN9KS50b3BWZXJ0c30pLm1hcCgobCxoKT0+e2NvbnN0IHU9b1toXVswXTtyZXR1cm4gbXUoe25vZGVzOmwsc2V0UG9pbnRXaWR0aDooKT0+dX0pfSk7cmV0dXJuIHJzKGMsbil9O3ZhciBzeD0oaSx0LGUpPT5uZXcgUHJvbWlzZSgobixzKT0+e3ZhciByPWM9Pnt0cnl7YShlLm5leHQoYykpfWNhdGNoKGwpe3MobCl9fSxvPWM9Pnt0cnl7YShlLnRocm93KGMpKX1jYXRjaChsKXtzKGwpfX0sYT1jPT5jLmRvbmU/bihjLnZhbHVlKTpQcm9taXNlLnJlc29sdmUoYy52YWx1ZSkudGhlbihyLG8pO2EoKGU9ZS5hcHBseShpLHQpKS5uZXh0KCkpfSk7ZnVuY3Rpb24gcngoaSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGkpLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTppW2VdLGVudW1lcmFibGU6ITB9KX0se30pfShpPT57Y29uc3QgdD17cnVuKGUsbil7Y29uc3Qgcz1uZXcgRnVuY3Rpb24oInJldHVybiAoIitlKyIpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7Iik7cmV0dXJuIHMuYXBwbHkocyxuKX0sbWV0aG9kcygpe3JldHVybiBPYmplY3Qua2V5cyh0KX19O2FkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGU9PnN4KHZvaWQgMCxbZV0sZnVuY3Rpb24qKHtkYXRhOm59KXt0cnl7Y29uc3Qgcz10W24ubWV0aG9kXTtpZihzKXtjb25zdCByPXlpZWxkIHMuYXBwbHkocyxuLnBhcmFtcyk7ci50cmFuc2ZlciYmci5tZXNzYWdlP3Bvc3RNZXNzYWdlKHtpZDpuLmlkLHJlc3VsdDpyLm1lc3NhZ2UsZXJyb3I6bnVsbH0sci50cmFuc2Zlcik6cG9zdE1lc3NhZ2Uoe2lkOm4uaWQscmVzdWx0OnIsZXJyb3I6bnVsbH0pfWVsc2UgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIG1ldGhvZCAiJytuLm1ldGhvZCsnIicpfWNhdGNoKHMpe3Bvc3RNZXNzYWdlKHtpZDpuLmlkLHJlc3VsdDpudWxsLGVycm9yOnJ4KHMpfSl9fSkpLE9iamVjdC5rZXlzKGkpLmZvckVhY2goZT0+e3RbZV09aVtlXX0pLHBvc3RNZXNzYWdlKCJyZWFkeSIpfSkoe2V4dHJ1ZGVQb2x5Z29uOnF5LGxpbmU6WnksbGluZTI6V3ksY29uaWNQb2x5Z29uOm54LGNvbmljTGluZTppeH0pfSkoKTsK", t = (l) => Uint8Array.from(atob(l), (b) => b.charCodeAt(0)), C = typeof window != "undefined" && window.Blob && new Blob([t(M)], { type: "text/javascript;charset=utf-8" });
54
+ }, M = "dmFyIGx4PU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxoeD1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgdXg9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIGxvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIG1mPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksZ2Y9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt2YXIgRWM9KEosaik9PihqPVN5bWJvbFtKXSk/ajpTeW1ib2wuZm9yKCJTeW1ib2wuIitKKSxmeD1KPT57dGhyb3cgVHlwZUVycm9yKEopfSx6aT1NYXRoLnBvdyx5Zj0oSixqLG10KT0+aiBpbiBKP2x4KEosaix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bXR9KTpKW2pdPW10LFV0PShKLGopPT57Zm9yKHZhciBtdCBpbiBqfHwoaj17fSkpbWYuY2FsbChqLG10KSYmeWYoSixtdCxqW210XSk7aWYobG8pZm9yKHZhciBtdCBvZiBsbyhqKSlnZi5jYWxsKGosbXQpJiZ5ZihKLG10LGpbbXRdKTtyZXR1cm4gSn0sS2U9KEosaik9Pmh4KEosdXgoaikpO3ZhciB4Zj0oSixqKT0+e3ZhciBtdD17fTtmb3IodmFyIFR0IGluIEopbWYuY2FsbChKLFR0KSYmai5pbmRleE9mKFR0KTwwJiYobXRbVHRdPUpbVHRdKTtpZihKIT1udWxsJiZsbylmb3IodmFyIFR0IG9mIGxvKEopKWouaW5kZXhPZihUdCk8MCYmZ2YuY2FsbChKLFR0KSYmKG10W1R0XT1KW1R0XSk7cmV0dXJuIG10fTt2YXIgZHg9ZnVuY3Rpb24oSixqKXt0aGlzWzBdPUosdGhpc1sxXT1qfTt2YXIgd2Y9Sj0+e3ZhciBqPUpbRWMoImFzeW5jSXRlcmF0b3IiKV0sbXQ9ITEsVHQscG49e307cmV0dXJuIGo9PW51bGw/KGo9SltFYygiaXRlcmF0b3IiKV0oKSxUdD1QZT0+cG5bUGVdPSRuPT5qW1BlXSgkbikpOihqPWouY2FsbChKKSxUdD1QZT0+cG5bUGVdPSRuPT57aWYobXQpe2lmKG10PSExLFBlPT09InRocm93Iil0aHJvdyAkbjtyZXR1cm4gJG59cmV0dXJuIG10PSEwLHtkb25lOiExLHZhbHVlOm5ldyBkeChuZXcgUHJvbWlzZShCYz0+e3ZhciBobz1qW1BlXSgkbik7aG8gaW5zdGFuY2VvZiBPYmplY3R8fGZ4KCJPYmplY3QgZXhwZWN0ZWQiKSxCYyhobyl9KSwxKX19KSxwbltFYygiaXRlcmF0b3IiKV09KCk9PnBuLFR0KCJuZXh0IiksInRocm93ImluIGo/VHQoInRocm93Iik6cG4udGhyb3c9UGU9Pnt0aHJvdyBQZX0sInJldHVybiJpbiBqJiZUdCgicmV0dXJuIikscG59OyhmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjsvKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IDIwMTAtMjAyNSBUaHJlZS5qcyBBdXRob3JzCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKICovY29uc3QgSj0iMTgyIixGYz0iIixmZT0ic3JnYiIsSWM9InNyZ2ItbGluZWFyIixrYz0ibGluZWFyIix1bz0ic3JnYiI7ZnVuY3Rpb24gYmYoaSl7Zm9yKGxldCB0PWkubGVuZ3RoLTE7dD49MDstLXQpaWYoaVt0XT49NjU1MzUpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gTmMoaSl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsaSl9Y29uc3QgUmM9e307ZnVuY3Rpb24gYnQoLi4uaSl7Y29uc3QgdD0iVEhSRUUuIitpLnNoaWZ0KCk7Y29uc29sZS53YXJuKHQsLi4uaSl9ZnVuY3Rpb24geW4oLi4uaSl7Y29uc3QgdD0iVEhSRUUuIitpLnNoaWZ0KCk7Y29uc29sZS5lcnJvcih0LC4uLmkpfWZ1bmN0aW9uIExjKC4uLmkpe2NvbnN0IHQ9aS5qb2luKCIgIik7dCBpbiBSY3x8KFJjW3RdPSEwLGJ0KC4uLmkpKX1jbGFzcyBnc3thZGRFdmVudExpc3RlbmVyKHQsZSl7dGhpcy5fbGlzdGVuZXJzPT09dm9pZCAwJiYodGhpcy5fbGlzdGVuZXJzPXt9KTtjb25zdCBuPXRoaXMuX2xpc3RlbmVycztuW3RdPT09dm9pZCAwJiYoblt0XT1bXSksblt0XS5pbmRleE9mKGUpPT09LTEmJm5bdF0ucHVzaChlKX1oYXNFdmVudExpc3RlbmVyKHQsZSl7Y29uc3Qgbj10aGlzLl9saXN0ZW5lcnM7cmV0dXJuIG49PT12b2lkIDA/ITE6blt0XSE9PXZvaWQgMCYmblt0XS5pbmRleE9mKGUpIT09LTF9cmVtb3ZlRXZlbnRMaXN0ZW5lcih0LGUpe2NvbnN0IG49dGhpcy5fbGlzdGVuZXJzO2lmKG49PT12b2lkIDApcmV0dXJuO2NvbnN0IHM9blt0XTtpZihzIT09dm9pZCAwKXtjb25zdCByPXMuaW5kZXhPZihlKTtyIT09LTEmJnMuc3BsaWNlKHIsMSl9fWRpc3BhdGNoRXZlbnQodCl7Y29uc3QgZT10aGlzLl9saXN0ZW5lcnM7aWYoZT09PXZvaWQgMClyZXR1cm47Y29uc3Qgbj1lW3QudHlwZV07aWYobiE9PXZvaWQgMCl7dC50YXJnZXQ9dGhpcztjb25zdCBzPW4uc2xpY2UoMCk7Zm9yKGxldCByPTAsbz1zLmxlbmd0aDtyPG87cisrKXNbcl0uY2FsbCh0aGlzLHQpO3QudGFyZ2V0PW51bGx9fX1jb25zdCBQdD1bIjAwIiwiMDEiLCIwMiIsIjAzIiwiMDQiLCIwNSIsIjA2IiwiMDciLCIwOCIsIjA5IiwiMGEiLCIwYiIsIjBjIiwiMGQiLCIwZSIsIjBmIiwiMTAiLCIxMSIsIjEyIiwiMTMiLCIxNCIsIjE1IiwiMTYiLCIxNyIsIjE4IiwiMTkiLCIxYSIsIjFiIiwiMWMiLCIxZCIsIjFlIiwiMWYiLCIyMCIsIjIxIiwiMjIiLCIyMyIsIjI0IiwiMjUiLCIyNiIsIjI3IiwiMjgiLCIyOSIsIjJhIiwiMmIiLCIyYyIsIjJkIiwiMmUiLCIyZiIsIjMwIiwiMzEiLCIzMiIsIjMzIiwiMzQiLCIzNSIsIjM2IiwiMzciLCIzOCIsIjM5IiwiM2EiLCIzYiIsIjNjIiwiM2QiLCIzZSIsIjNmIiwiNDAiLCI0MSIsIjQyIiwiNDMiLCI0NCIsIjQ1IiwiNDYiLCI0NyIsIjQ4IiwiNDkiLCI0YSIsIjRiIiwiNGMiLCI0ZCIsIjRlIiwiNGYiLCI1MCIsIjUxIiwiNTIiLCI1MyIsIjU0IiwiNTUiLCI1NiIsIjU3IiwiNTgiLCI1OSIsIjVhIiwiNWIiLCI1YyIsIjVkIiwiNWUiLCI1ZiIsIjYwIiwiNjEiLCI2MiIsIjYzIiwiNjQiLCI2NSIsIjY2IiwiNjciLCI2OCIsIjY5IiwiNmEiLCI2YiIsIjZjIiwiNmQiLCI2ZSIsIjZmIiwiNzAiLCI3MSIsIjcyIiwiNzMiLCI3NCIsIjc1IiwiNzYiLCI3NyIsIjc4IiwiNzkiLCI3YSIsIjdiIiwiN2MiLCI3ZCIsIjdlIiwiN2YiLCI4MCIsIjgxIiwiODIiLCI4MyIsIjg0IiwiODUiLCI4NiIsIjg3IiwiODgiLCI4OSIsIjhhIiwiOGIiLCI4YyIsIjhkIiwiOGUiLCI4ZiIsIjkwIiwiOTEiLCI5MiIsIjkzIiwiOTQiLCI5NSIsIjk2IiwiOTciLCI5OCIsIjk5IiwiOWEiLCI5YiIsIjljIiwiOWQiLCI5ZSIsIjlmIiwiYTAiLCJhMSIsImEyIiwiYTMiLCJhNCIsImE1IiwiYTYiLCJhNyIsImE4IiwiYTkiLCJhYSIsImFiIiwiYWMiLCJhZCIsImFlIiwiYWYiLCJiMCIsImIxIiwiYjIiLCJiMyIsImI0IiwiYjUiLCJiNiIsImI3IiwiYjgiLCJiOSIsImJhIiwiYmIiLCJiYyIsImJkIiwiYmUiLCJiZiIsImMwIiwiYzEiLCJjMiIsImMzIiwiYzQiLCJjNSIsImM2IiwiYzciLCJjOCIsImM5IiwiY2EiLCJjYiIsImNjIiwiY2QiLCJjZSIsImNmIiwiZDAiLCJkMSIsImQyIiwiZDMiLCJkNCIsImQ1IiwiZDYiLCJkNyIsImQ4IiwiZDkiLCJkYSIsImRiIiwiZGMiLCJkZCIsImRlIiwiZGYiLCJlMCIsImUxIiwiZTIiLCJlMyIsImU0IiwiZTUiLCJlNiIsImU3IiwiZTgiLCJlOSIsImVhIiwiZWIiLCJlYyIsImVkIiwiZWUiLCJlZiIsImYwIiwiZjEiLCJmMiIsImYzIiwiZjQiLCJmNSIsImY2IiwiZjciLCJmOCIsImY5IiwiZmEiLCJmYiIsImZjIiwiZmQiLCJmZSIsImZmIl07bGV0IE9jPTEyMzQ1Njc7Y29uc3QgRGM9TWF0aC5QSS8xODAsJGM9MTgwL01hdGguUEk7ZnVuY3Rpb24gbW4oKXtjb25zdCBpPU1hdGgucmFuZG9tKCkqNDI5NDk2NzI5NXwwLHQ9TWF0aC5yYW5kb20oKSo0Mjk0OTY3Mjk1fDAsZT1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MCxuPU1hdGgucmFuZG9tKCkqNDI5NDk2NzI5NXwwO3JldHVybihQdFtpJjI1NV0rUHRbaT4+OCYyNTVdK1B0W2k+PjE2JjI1NV0rUHRbaT4+MjQmMjU1XSsiLSIrUHRbdCYyNTVdK1B0W3Q+PjgmMjU1XSsiLSIrUHRbdD4+MTYmMTV8NjRdK1B0W3Q+PjI0JjI1NV0rIi0iK1B0W2UmNjN8MTI4XStQdFtlPj44JjI1NV0rIi0iK1B0W2U+PjE2JjI1NV0rUHRbZT4+MjQmMjU1XStQdFtuJjI1NV0rUHRbbj4+OCYyNTVdK1B0W24+PjE2JjI1NV0rUHRbbj4+MjQmMjU1XSkudG9Mb3dlckNhc2UoKX1mdW5jdGlvbiBaKGksdCxlKXtyZXR1cm4gTWF0aC5tYXgodCxNYXRoLm1pbihlLGkpKX1mdW5jdGlvbiBmbyhpLHQpe3JldHVybihpJXQrdCkldH1mdW5jdGlvbiBNZihpLHQsZSxuLHMpe3JldHVybiBuKyhpLXQpKihzLW4pLyhlLXQpfWZ1bmN0aW9uIEFmKGksdCxlKXtyZXR1cm4gaSE9PXQ/KGUtaSkvKHQtaSk6MH1mdW5jdGlvbiBUaShpLHQsZSl7cmV0dXJuKDEtZSkqaStlKnR9ZnVuY3Rpb24gU2YoaSx0LGUsbil7cmV0dXJuIFRpKGksdCwxLU1hdGguZXhwKC1lKm4pKX1mdW5jdGlvbiB2ZihpLHQ9MSl7cmV0dXJuIHQtTWF0aC5hYnMoZm8oaSx0KjIpLXQpfWZ1bmN0aW9uIF9mKGksdCxlKXtyZXR1cm4gaTw9dD8wOmk+PWU/MTooaT0oaS10KS8oZS10KSxpKmkqKDMtMippKSl9ZnVuY3Rpb24gemYoaSx0LGUpe3JldHVybiBpPD10PzA6aT49ZT8xOihpPShpLXQpLyhlLXQpLGkqaSppKihpKihpKjYtMTUpKzEwKSl9ZnVuY3Rpb24gVGYoaSx0KXtyZXR1cm4gaStNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKHQtaSsxKSl9ZnVuY3Rpb24gUGYoaSx0KXtyZXR1cm4gaStNYXRoLnJhbmRvbSgpKih0LWkpfWZ1bmN0aW9uIENmKGkpe3JldHVybiBpKiguNS1NYXRoLnJhbmRvbSgpKX1mdW5jdGlvbiBFZihpKXtpIT09dm9pZCAwJiYoT2M9aSk7bGV0IHQ9T2MrPTE4MzE1NjU4MTM7cmV0dXJuIHQ9TWF0aC5pbXVsKHRedD4+PjE1LHR8MSksdF49dCtNYXRoLmltdWwodF50Pj4+Nyx0fDYxKSwoKHRedD4+PjE0KT4+PjApLzQyOTQ5NjcyOTZ9ZnVuY3Rpb24gQmYoaSl7cmV0dXJuIGkqRGN9ZnVuY3Rpb24gRmYoaSl7cmV0dXJuIGkqJGN9ZnVuY3Rpb24gSWYoaSl7cmV0dXJuKGkmaS0xKT09PTAmJmkhPT0wfWZ1bmN0aW9uIGtmKGkpe3JldHVybiBNYXRoLnBvdygyLE1hdGguY2VpbChNYXRoLmxvZyhpKS9NYXRoLkxOMikpfWZ1bmN0aW9uIE5mKGkpe3JldHVybiBNYXRoLnBvdygyLE1hdGguZmxvb3IoTWF0aC5sb2coaSkvTWF0aC5MTjIpKX1mdW5jdGlvbiBSZihpLHQsZSxuLHMpe2NvbnN0IHI9TWF0aC5jb3Msbz1NYXRoLnNpbixhPXIoZS8yKSxjPW8oZS8yKSxsPXIoKHQrbikvMiksaD1vKCh0K24pLzIpLHU9cigodC1uKS8yKSxmPW8oKHQtbikvMiksZD1yKChuLXQpLzIpLHA9bygobi10KS8yKTtzd2l0Y2gocyl7Y2FzZSJYWVgiOmkuc2V0KGEqaCxjKnUsYypmLGEqbCk7YnJlYWs7Y2FzZSJZWlkiOmkuc2V0KGMqZixhKmgsYyp1LGEqbCk7YnJlYWs7Y2FzZSJaWFoiOmkuc2V0KGMqdSxjKmYsYSpoLGEqbCk7YnJlYWs7Y2FzZSJYWlgiOmkuc2V0KGEqaCxjKnAsYypkLGEqbCk7YnJlYWs7Y2FzZSJZWFkiOmkuc2V0KGMqZCxhKmgsYypwLGEqbCk7YnJlYWs7Y2FzZSJaWVoiOmkuc2V0KGMqcCxjKmQsYSpoLGEqbCk7YnJlYWs7ZGVmYXVsdDpidCgiTWF0aFV0aWxzOiAuc2V0UXVhdGVybmlvbkZyb21Qcm9wZXJFdWxlcigpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrcyl9fWZ1bmN0aW9uIFZuKGksdCl7c3dpdGNoKHQuY29uc3RydWN0b3Ipe2Nhc2UgRmxvYXQzMkFycmF5OnJldHVybiBpO2Nhc2UgVWludDMyQXJyYXk6cmV0dXJuIGkvNDI5NDk2NzI5NTtjYXNlIFVpbnQxNkFycmF5OnJldHVybiBpLzY1NTM1O2Nhc2UgVWludDhBcnJheTpyZXR1cm4gaS8yNTU7Y2FzZSBJbnQzMkFycmF5OnJldHVybiBNYXRoLm1heChpLzIxNDc0ODM2NDcsLTEpO2Nhc2UgSW50MTZBcnJheTpyZXR1cm4gTWF0aC5tYXgoaS8zMjc2NywtMSk7Y2FzZSBJbnQ4QXJyYXk6cmV0dXJuIE1hdGgubWF4KGkvMTI3LC0xKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb21wb25lbnQgdHlwZS4iKX19ZnVuY3Rpb24ga3QoaSx0KXtzd2l0Y2godC5jb25zdHJ1Y3Rvcil7Y2FzZSBGbG9hdDMyQXJyYXk6cmV0dXJuIGk7Y2FzZSBVaW50MzJBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChpKjQyOTQ5NjcyOTUpO2Nhc2UgVWludDE2QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSo2NTUzNSk7Y2FzZSBVaW50OEFycmF5OnJldHVybiBNYXRoLnJvdW5kKGkqMjU1KTtjYXNlIEludDMyQXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSoyMTQ3NDgzNjQ3KTtjYXNlIEludDE2QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSozMjc2Nyk7Y2FzZSBJbnQ4QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoaSoxMjcpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCB0eXBlLiIpfX1jb25zdCBWYz17REVHMlJBRDpEYyxSQUQyREVHOiRjLGdlbmVyYXRlVVVJRDptbixjbGFtcDpaLGV1Y2xpZGVhbk1vZHVsbzpmbyxtYXBMaW5lYXI6TWYsaW52ZXJzZUxlcnA6QWYsbGVycDpUaSxkYW1wOlNmLHBpbmdwb25nOnZmLHNtb290aHN0ZXA6X2Ysc21vb3RoZXJzdGVwOnpmLHJhbmRJbnQ6VGYscmFuZEZsb2F0OlBmLHJhbmRGbG9hdFNwcmVhZDpDZixzZWVkZWRSYW5kb206RWYsZGVnVG9SYWQ6QmYscmFkVG9EZWc6RmYsaXNQb3dlck9mVHdvOklmLGNlaWxQb3dlck9mVHdvOmtmLGZsb29yUG93ZXJPZlR3bzpOZixzZXRRdWF0ZXJuaW9uRnJvbVByb3BlckV1bGVyOlJmLG5vcm1hbGl6ZTprdCxkZW5vcm1hbGl6ZTpWbn07Y2xhc3Mga3tjb25zdHJ1Y3Rvcih0PTAsZT0wKXtrLnByb3RvdHlwZS5pc1ZlY3RvcjI9ITAsdGhpcy54PXQsdGhpcy55PWV9Z2V0IHdpZHRoKCl7cmV0dXJuIHRoaXMueH1zZXQgd2lkdGgodCl7dGhpcy54PXR9Z2V0IGhlaWdodCgpe3JldHVybiB0aGlzLnl9c2V0IGhlaWdodCh0KXt0aGlzLnk9dH1zZXQodCxlKXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PWUsdGhpc31zZXRTY2FsYXIodCl7cmV0dXJuIHRoaXMueD10LHRoaXMueT10LHRoaXN9c2V0WCh0KXtyZXR1cm4gdGhpcy54PXQsdGhpc31zZXRZKHQpe3JldHVybiB0aGlzLnk9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9cmV0dXJuIHRoaXN9Z2V0Q29tcG9uZW50KHQpe3N3aXRjaCh0KXtjYXNlIDA6cmV0dXJuIHRoaXMueDtjYXNlIDE6cmV0dXJuIHRoaXMueTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55KX1jb3B5KHQpe3JldHVybiB0aGlzLng9dC54LHRoaXMueT10LnksdGhpc31hZGQodCl7cmV0dXJuIHRoaXMueCs9dC54LHRoaXMueSs9dC55LHRoaXN9YWRkU2NhbGFyKHQpe3JldHVybiB0aGlzLngrPXQsdGhpcy55Kz10LHRoaXN9YWRkVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54K2UueCx0aGlzLnk9dC55K2UueSx0aGlzfWFkZFNjYWxlZFZlY3Rvcih0LGUpe3JldHVybiB0aGlzLngrPXQueCplLHRoaXMueSs9dC55KmUsdGhpc31zdWIodCl7cmV0dXJuIHRoaXMueC09dC54LHRoaXMueS09dC55LHRoaXN9c3ViU2NhbGFyKHQpe3JldHVybiB0aGlzLngtPXQsdGhpcy55LT10LHRoaXN9c3ViVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54LWUueCx0aGlzLnk9dC55LWUueSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXN9ZGl2aWRlKHQpe3JldHVybiB0aGlzLngvPXQueCx0aGlzLnkvPXQueSx0aGlzfWRpdmlkZVNjYWxhcih0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhcigxL3QpfWFwcGx5TWF0cml4Myh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxzPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1zWzBdKmUrc1szXSpuK3NbNl0sdGhpcy55PXNbMV0qZStzWzRdKm4rc1s3XSx0aGlzfW1pbih0KXtyZXR1cm4gdGhpcy54PU1hdGgubWluKHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1pbih0aGlzLnksdC55KSx0aGlzfW1heCh0KXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1heCh0aGlzLnksdC55KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1aKHRoaXMueCx0LngsZS54KSx0aGlzLnk9Wih0aGlzLnksdC55LGUueSksdGhpc31jbGFtcFNjYWxhcih0LGUpe3JldHVybiB0aGlzLng9Wih0aGlzLngsdCxlKSx0aGlzLnk9Wih0aGlzLnksdCxlKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgbj10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihufHwxKS5tdWx0aXBseVNjYWxhcihaKG4sdCxlKSl9Zmxvb3IoKXtyZXR1cm4gdGhpcy54PU1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXN9cm91bmQoKXtyZXR1cm4gdGhpcy54PU1hdGgucm91bmQodGhpcy54KSx0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXN9bmVnYXRlKCl7cmV0dXJuIHRoaXMueD0tdGhpcy54LHRoaXMueT0tdGhpcy55LHRoaXN9ZG90KHQpe3JldHVybiB0aGlzLngqdC54K3RoaXMueSp0Lnl9Y3Jvc3ModCl7cmV0dXJuIHRoaXMueCp0LnktdGhpcy55KnQueH1sZW5ndGhTcSgpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnl9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkpfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSl9bm9ybWFsaXplKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfWFuZ2xlKCl7cmV0dXJuIE1hdGguYXRhbjIoLXRoaXMueSwtdGhpcy54KStNYXRoLlBJfWFuZ2xlVG8odCl7Y29uc3QgZT1NYXRoLnNxcnQodGhpcy5sZW5ndGhTcSgpKnQubGVuZ3RoU3EoKSk7aWYoZT09PTApcmV0dXJuIE1hdGguUEkvMjtjb25zdCBuPXRoaXMuZG90KHQpL2U7cmV0dXJuIE1hdGguYWNvcyhaKG4sLTEsMSkpfWRpc3RhbmNlVG8odCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKHQpKX1kaXN0YW5jZVRvU3F1YXJlZCh0KXtjb25zdCBlPXRoaXMueC10Lngsbj10aGlzLnktdC55O3JldHVybiBlKmUrbipufW1hbmhhdHRhbkRpc3RhbmNlVG8odCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC10LngpK01hdGguYWJzKHRoaXMueS10LnkpfXNldExlbmd0aCh0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0KX1sZXJwKHQsZSl7cmV0dXJuIHRoaXMueCs9KHQueC10aGlzLngpKmUsdGhpcy55Kz0odC55LXRoaXMueSkqZSx0aGlzfWxlcnBWZWN0b3JzKHQsZSxuKXtyZXR1cm4gdGhpcy54PXQueCsoZS54LXQueCkqbix0aGlzLnk9dC55KyhlLnktdC55KSpuLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lng9PT10aGlzLngmJnQueT09PXRoaXMueX1mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLng9dFtlXSx0aGlzLnk9dFtlKzFdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy54LHRbZSsxXT10aGlzLnksdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzfXJvdGF0ZUFyb3VuZCh0LGUpe2NvbnN0IG49TWF0aC5jb3MoZSkscz1NYXRoLnNpbihlKSxyPXRoaXMueC10Lngsbz10aGlzLnktdC55O3JldHVybiB0aGlzLng9cipuLW8qcyt0LngsdGhpcy55PXIqcytvKm4rdC55LHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXN9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy54LHlpZWxkIHRoaXMueX19Y2xhc3MgUGl7Y29uc3RydWN0b3IodD0wLGU9MCxuPTAscz0xKXt0aGlzLmlzUXVhdGVybmlvbj0hMCx0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl93PXN9c3RhdGljIHNsZXJwRmxhdCh0LGUsbixzLHIsbyxhKXtsZXQgYz1uW3MrMF0sbD1uW3MrMV0saD1uW3MrMl0sdT1uW3MrM10sZj1yW28rMF0sZD1yW28rMV0scD1yW28rMl0seT1yW28rM107aWYoYTw9MCl7dFtlKzBdPWMsdFtlKzFdPWwsdFtlKzJdPWgsdFtlKzNdPXU7cmV0dXJufWlmKGE+PTEpe3RbZSswXT1mLHRbZSsxXT1kLHRbZSsyXT1wLHRbZSszXT15O3JldHVybn1pZih1IT09eXx8YyE9PWZ8fGwhPT1kfHxoIT09cCl7bGV0IGc9YypmK2wqZCtoKnArdSp5O2c8MCYmKGY9LWYsZD0tZCxwPS1wLHk9LXksZz0tZyk7bGV0IHc9MS1hO2lmKGc8Ljk5OTUpe2NvbnN0IGI9TWF0aC5hY29zKGcpLHg9TWF0aC5zaW4oYik7dz1NYXRoLnNpbih3KmIpL3gsYT1NYXRoLnNpbihhKmIpL3gsYz1jKncrZiphLGw9bCp3K2QqYSxoPWgqdytwKmEsdT11KncreSphfWVsc2V7Yz1jKncrZiphLGw9bCp3K2QqYSxoPWgqdytwKmEsdT11KncreSphO2NvbnN0IGI9MS9NYXRoLnNxcnQoYypjK2wqbCtoKmgrdSp1KTtjKj1iLGwqPWIsaCo9Yix1Kj1ifX10W2VdPWMsdFtlKzFdPWwsdFtlKzJdPWgsdFtlKzNdPXV9c3RhdGljIG11bHRpcGx5UXVhdGVybmlvbnNGbGF0KHQsZSxuLHMscixvKXtjb25zdCBhPW5bc10sYz1uW3MrMV0sbD1uW3MrMl0saD1uW3MrM10sdT1yW29dLGY9cltvKzFdLGQ9cltvKzJdLHA9cltvKzNdO3JldHVybiB0W2VdPWEqcCtoKnUrYypkLWwqZix0W2UrMV09YypwK2gqZitsKnUtYSpkLHRbZSsyXT1sKnAraCpkK2EqZi1jKnUsdFtlKzNdPWgqcC1hKnUtYypmLWwqZCx0fWdldCB4KCl7cmV0dXJuIHRoaXMuX3h9c2V0IHgodCl7dGhpcy5feD10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeSgpe3JldHVybiB0aGlzLl95fXNldCB5KHQpe3RoaXMuX3k9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHooKXtyZXR1cm4gdGhpcy5fen1zZXQgeih0KXt0aGlzLl96PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB3KCl7cmV0dXJuIHRoaXMuX3d9c2V0IHcodCl7dGhpcy5fdz10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1zZXQodCxlLG4scyl7cmV0dXJuIHRoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1uLHRoaXMuX3c9cyx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLl94LHRoaXMuX3ksdGhpcy5feix0aGlzLl93KX1jb3B5KHQpe3JldHVybiB0aGlzLl94PXQueCx0aGlzLl95PXQueSx0aGlzLl96PXQueix0aGlzLl93PXQudyx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tRXVsZXIodCxlPSEwKXtjb25zdCBuPXQuX3gscz10Ll95LHI9dC5feixvPXQuX29yZGVyLGE9TWF0aC5jb3MsYz1NYXRoLnNpbixsPWEobi8yKSxoPWEocy8yKSx1PWEoci8yKSxmPWMobi8yKSxkPWMocy8yKSxwPWMoci8yKTtzd2l0Y2gobyl7Y2FzZSJYWVoiOnRoaXMuX3g9ZipoKnUrbCpkKnAsdGhpcy5feT1sKmQqdS1mKmgqcCx0aGlzLl96PWwqaCpwK2YqZCp1LHRoaXMuX3c9bCpoKnUtZipkKnA7YnJlYWs7Y2FzZSJZWFoiOnRoaXMuX3g9ZipoKnUrbCpkKnAsdGhpcy5feT1sKmQqdS1mKmgqcCx0aGlzLl96PWwqaCpwLWYqZCp1LHRoaXMuX3c9bCpoKnUrZipkKnA7YnJlYWs7Y2FzZSJaWFkiOnRoaXMuX3g9ZipoKnUtbCpkKnAsdGhpcy5feT1sKmQqdStmKmgqcCx0aGlzLl96PWwqaCpwK2YqZCp1LHRoaXMuX3c9bCpoKnUtZipkKnA7YnJlYWs7Y2FzZSJaWVgiOnRoaXMuX3g9ZipoKnUtbCpkKnAsdGhpcy5feT1sKmQqdStmKmgqcCx0aGlzLl96PWwqaCpwLWYqZCp1LHRoaXMuX3c9bCpoKnUrZipkKnA7YnJlYWs7Y2FzZSJZWlgiOnRoaXMuX3g9ZipoKnUrbCpkKnAsdGhpcy5feT1sKmQqdStmKmgqcCx0aGlzLl96PWwqaCpwLWYqZCp1LHRoaXMuX3c9bCpoKnUtZipkKnA7YnJlYWs7Y2FzZSJYWlkiOnRoaXMuX3g9ZipoKnUtbCpkKnAsdGhpcy5feT1sKmQqdS1mKmgqcCx0aGlzLl96PWwqaCpwK2YqZCp1LHRoaXMuX3c9bCpoKnUrZipkKnA7YnJlYWs7ZGVmYXVsdDpidCgiUXVhdGVybmlvbjogLnNldEZyb21FdWxlcigpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrbyl9cmV0dXJuIGU9PT0hMCYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbUF4aXNBbmdsZSh0LGUpe2NvbnN0IG49ZS8yLHM9TWF0aC5zaW4obik7cmV0dXJuIHRoaXMuX3g9dC54KnMsdGhpcy5feT10Lnkqcyx0aGlzLl96PXQueipzLHRoaXMuX3c9TWF0aC5jb3MobiksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVJvdGF0aW9uTWF0cml4KHQpe2NvbnN0IGU9dC5lbGVtZW50cyxuPWVbMF0scz1lWzRdLHI9ZVs4XSxvPWVbMV0sYT1lWzVdLGM9ZVs5XSxsPWVbMl0saD1lWzZdLHU9ZVsxMF0sZj1uK2ErdTtpZihmPjApe2NvbnN0IGQ9LjUvTWF0aC5zcXJ0KGYrMSk7dGhpcy5fdz0uMjUvZCx0aGlzLl94PShoLWMpKmQsdGhpcy5feT0oci1sKSpkLHRoaXMuX3o9KG8tcykqZH1lbHNlIGlmKG4+YSYmbj51KXtjb25zdCBkPTIqTWF0aC5zcXJ0KDErbi1hLXUpO3RoaXMuX3c9KGgtYykvZCx0aGlzLl94PS4yNSpkLHRoaXMuX3k9KHMrbykvZCx0aGlzLl96PShyK2wpL2R9ZWxzZSBpZihhPnUpe2NvbnN0IGQ9MipNYXRoLnNxcnQoMSthLW4tdSk7dGhpcy5fdz0oci1sKS9kLHRoaXMuX3g9KHMrbykvZCx0aGlzLl95PS4yNSpkLHRoaXMuX3o9KGMraCkvZH1lbHNle2NvbnN0IGQ9MipNYXRoLnNxcnQoMSt1LW4tYSk7dGhpcy5fdz0oby1zKS9kLHRoaXMuX3g9KHIrbCkvZCx0aGlzLl95PShjK2gpL2QsdGhpcy5fej0uMjUqZH1yZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVVuaXRWZWN0b3JzKHQsZSl7bGV0IG49dC5kb3QoZSkrMTtyZXR1cm4gbjwxZS04PyhuPTAsTWF0aC5hYnModC54KT5NYXRoLmFicyh0LnopPyh0aGlzLl94PS10LnksdGhpcy5feT10LngsdGhpcy5fej0wLHRoaXMuX3c9bik6KHRoaXMuX3g9MCx0aGlzLl95PS10LnosdGhpcy5fej10LnksdGhpcy5fdz1uKSk6KHRoaXMuX3g9dC55KmUuei10LnoqZS55LHRoaXMuX3k9dC56KmUueC10LngqZS56LHRoaXMuX3o9dC54KmUueS10LnkqZS54LHRoaXMuX3c9biksdGhpcy5ub3JtYWxpemUoKX1hbmdsZVRvKHQpe3JldHVybiAyKk1hdGguYWNvcyhNYXRoLmFicyhaKHRoaXMuZG90KHQpLC0xLDEpKSl9cm90YXRlVG93YXJkcyh0LGUpe2NvbnN0IG49dGhpcy5hbmdsZVRvKHQpO2lmKG49PT0wKXJldHVybiB0aGlzO2NvbnN0IHM9TWF0aC5taW4oMSxlL24pO3JldHVybiB0aGlzLnNsZXJwKHQscyksdGhpc31pZGVudGl0eSgpe3JldHVybiB0aGlzLnNldCgwLDAsMCwxKX1pbnZlcnQoKXtyZXR1cm4gdGhpcy5jb25qdWdhdGUoKX1jb25qdWdhdGUoKXtyZXR1cm4gdGhpcy5feCo9LTEsdGhpcy5feSo9LTEsdGhpcy5feio9LTEsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9ZG90KHQpe3JldHVybiB0aGlzLl94KnQuX3grdGhpcy5feSp0Ll95K3RoaXMuX3oqdC5feit0aGlzLl93KnQuX3d9bGVuZ3RoU3EoKXtyZXR1cm4gdGhpcy5feCp0aGlzLl94K3RoaXMuX3kqdGhpcy5feSt0aGlzLl96KnRoaXMuX3ordGhpcy5fdyp0aGlzLl93fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy5feCp0aGlzLl94K3RoaXMuX3kqdGhpcy5feSt0aGlzLl96KnRoaXMuX3ordGhpcy5fdyp0aGlzLl93KX1ub3JtYWxpemUoKXtsZXQgdD10aGlzLmxlbmd0aCgpO3JldHVybiB0PT09MD8odGhpcy5feD0wLHRoaXMuX3k9MCx0aGlzLl96PTAsdGhpcy5fdz0xKToodD0xL3QsdGhpcy5feD10aGlzLl94KnQsdGhpcy5feT10aGlzLl95KnQsdGhpcy5fej10aGlzLl96KnQsdGhpcy5fdz10aGlzLl93KnQpLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnModGhpcyx0KX1wcmVtdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHQsdGhpcyl9bXVsdGlwbHlRdWF0ZXJuaW9ucyh0LGUpe2NvbnN0IG49dC5feCxzPXQuX3kscj10Ll96LG89dC5fdyxhPWUuX3gsYz1lLl95LGw9ZS5feixoPWUuX3c7cmV0dXJuIHRoaXMuX3g9bipoK28qYStzKmwtcipjLHRoaXMuX3k9cypoK28qYytyKmEtbipsLHRoaXMuX3o9cipoK28qbCtuKmMtcyphLHRoaXMuX3c9bypoLW4qYS1zKmMtcipsLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNsZXJwKHQsZSl7aWYoZTw9MClyZXR1cm4gdGhpcztpZihlPj0xKXJldHVybiB0aGlzLmNvcHkodCk7bGV0IG49dC5feCxzPXQuX3kscj10Ll96LG89dC5fdyxhPXRoaXMuZG90KHQpO2E8MCYmKG49LW4scz0tcyxyPS1yLG89LW8sYT0tYSk7bGV0IGM9MS1lO2lmKGE8Ljk5OTUpe2NvbnN0IGw9TWF0aC5hY29zKGEpLGg9TWF0aC5zaW4obCk7Yz1NYXRoLnNpbihjKmwpL2gsZT1NYXRoLnNpbihlKmwpL2gsdGhpcy5feD10aGlzLl94KmMrbiplLHRoaXMuX3k9dGhpcy5feSpjK3MqZSx0aGlzLl96PXRoaXMuX3oqYytyKmUsdGhpcy5fdz10aGlzLl93KmMrbyplLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1lbHNlIHRoaXMuX3g9dGhpcy5feCpjK24qZSx0aGlzLl95PXRoaXMuX3kqYytzKmUsdGhpcy5fej10aGlzLl96KmMrciplLHRoaXMuX3c9dGhpcy5fdypjK28qZSx0aGlzLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzfXNsZXJwUXVhdGVybmlvbnModCxlLG4pe3JldHVybiB0aGlzLmNvcHkodCkuc2xlcnAoZSxuKX1yYW5kb20oKXtjb25zdCB0PTIqTWF0aC5QSSpNYXRoLnJhbmRvbSgpLGU9MipNYXRoLlBJKk1hdGgucmFuZG9tKCksbj1NYXRoLnJhbmRvbSgpLHM9TWF0aC5zcXJ0KDEtbikscj1NYXRoLnNxcnQobik7cmV0dXJuIHRoaXMuc2V0KHMqTWF0aC5zaW4odCkscypNYXRoLmNvcyh0KSxyKk1hdGguc2luKGUpLHIqTWF0aC5jb3MoZSkpfWVxdWFscyh0KXtyZXR1cm4gdC5feD09PXRoaXMuX3gmJnQuX3k9PT10aGlzLl95JiZ0Ll96PT09dGhpcy5feiYmdC5fdz09PXRoaXMuX3d9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy5feD10W2VdLHRoaXMuX3k9dFtlKzFdLHRoaXMuX3o9dFtlKzJdLHRoaXMuX3c9dFtlKzNdLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMuX3gsdFtlKzFdPXRoaXMuX3ksdFtlKzJdPXRoaXMuX3osdFtlKzNdPXRoaXMuX3csdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMuX3g9dC5nZXRYKGUpLHRoaXMuX3k9dC5nZXRZKGUpLHRoaXMuX3o9dC5nZXRaKGUpLHRoaXMuX3c9dC5nZXRXKGUpLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvSlNPTigpe3JldHVybiB0aGlzLnRvQXJyYXkoKX1fb25DaGFuZ2UodCl7cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2s9dCx0aGlzfV9vbkNoYW5nZUNhbGxiYWNrKCl7fSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMuX3gseWllbGQgdGhpcy5feSx5aWVsZCB0aGlzLl96LHlpZWxkIHRoaXMuX3d9fWNsYXNzIFB7Y29uc3RydWN0b3IodD0wLGU9MCxuPTApe1AucHJvdG90eXBlLmlzVmVjdG9yMz0hMCx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bn1zZXQodCxlLG4pe3JldHVybiBuPT09dm9pZCAwJiYobj10aGlzLnopLHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzLno9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRaKHQpe3JldHVybiB0aGlzLno9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7Y2FzZSAyOnJldHVybiB0aGlzLno7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnopfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzLno9dC56LHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzLnorPXQueix0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzLnorPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXMuej10LnorZS56LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzLnorPXQueiplLHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzLnotPXQueix0aGlzfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzLnotPXQsdGhpc31zdWJWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngtZS54LHRoaXMueT10LnktZS55LHRoaXMuej10LnotZS56LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXMueio9dC56LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpcy56Kj10LHRoaXN9bXVsdGlwbHlWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngqZS54LHRoaXMueT10LnkqZS55LHRoaXMuej10LnoqZS56LHRoaXN9YXBwbHlFdWxlcih0KXtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oVWMuc2V0RnJvbUV1bGVyKHQpKX1hcHBseUF4aXNBbmdsZSh0LGUpe3JldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbihVYy5zZXRGcm9tQXhpc0FuZ2xlKHQsZSkpfWFwcGx5TWF0cml4Myh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxzPXRoaXMueixyPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1yWzBdKmUrclszXSpuK3JbNl0qcyx0aGlzLnk9clsxXSplK3JbNF0qbityWzddKnMsdGhpcy56PXJbMl0qZStyWzVdKm4rcls4XSpzLHRoaXN9YXBwbHlOb3JtYWxNYXRyaXgodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXgzKHQpLm5vcm1hbGl6ZSgpfWFwcGx5TWF0cml4NCh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxzPXRoaXMueixyPXQuZWxlbWVudHMsbz0xLyhyWzNdKmUrcls3XSpuK3JbMTFdKnMrclsxNV0pO3JldHVybiB0aGlzLng9KHJbMF0qZStyWzRdKm4rcls4XSpzK3JbMTJdKSpvLHRoaXMueT0oclsxXSplK3JbNV0qbityWzldKnMrclsxM10pKm8sdGhpcy56PShyWzJdKmUrcls2XSpuK3JbMTBdKnMrclsxNF0pKm8sdGhpc31hcHBseVF1YXRlcm5pb24odCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnkscz10aGlzLnoscj10Lngsbz10LnksYT10LnosYz10LncsbD0yKihvKnMtYSpuKSxoPTIqKGEqZS1yKnMpLHU9MioocipuLW8qZSk7cmV0dXJuIHRoaXMueD1lK2MqbCtvKnUtYSpoLHRoaXMueT1uK2MqaCthKmwtcip1LHRoaXMuej1zK2MqdStyKmgtbypsLHRoaXN9cHJvamVjdCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZEludmVyc2UpLmFwcGx5TWF0cml4NCh0LnByb2plY3Rpb25NYXRyaXgpfXVucHJvamVjdCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQodC5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSkuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpfXRyYW5zZm9ybURpcmVjdGlvbih0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxzPXRoaXMueixyPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1yWzBdKmUrcls0XSpuK3JbOF0qcyx0aGlzLnk9clsxXSplK3JbNV0qbityWzldKnMsdGhpcy56PXJbMl0qZStyWzZdKm4rclsxMF0qcyx0aGlzLm5vcm1hbGl6ZSgpfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpcy56Lz10LnosdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpcy56PU1hdGgubWluKHRoaXMueix0LnopLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1heCh0aGlzLnosdC56KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1aKHRoaXMueCx0LngsZS54KSx0aGlzLnk9Wih0aGlzLnksdC55LGUueSksdGhpcy56PVoodGhpcy56LHQueixlLnopLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PVoodGhpcy54LHQsZSksdGhpcy55PVoodGhpcy55LHQsZSksdGhpcy56PVoodGhpcy56LHQsZSksdGhpc31jbGFtcExlbmd0aCh0LGUpe2NvbnN0IG49dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIobnx8MSkubXVsdGlwbHlTY2FsYXIoWihuLHQsZSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXMuej1NYXRoLnRydW5jKHRoaXMueiksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueSt0aGlzLnoqdC56fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnopfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXMueis9KHQuei10aGlzLnopKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUsbil7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKm4sdGhpcy55PXQueSsoZS55LXQueSkqbix0aGlzLno9dC56KyhlLnotdC56KSpuLHRoaXN9Y3Jvc3ModCl7cmV0dXJuIHRoaXMuY3Jvc3NWZWN0b3JzKHRoaXMsdCl9Y3Jvc3NWZWN0b3JzKHQsZSl7Y29uc3Qgbj10Lngscz10Lnkscj10Lnosbz1lLngsYT1lLnksYz1lLno7cmV0dXJuIHRoaXMueD1zKmMtciphLHRoaXMueT1yKm8tbipjLHRoaXMuej1uKmEtcypvLHRoaXN9cHJvamVjdE9uVmVjdG9yKHQpe2NvbnN0IGU9dC5sZW5ndGhTcSgpO2lmKGU9PT0wKXJldHVybiB0aGlzLnNldCgwLDAsMCk7Y29uc3Qgbj10LmRvdCh0aGlzKS9lO3JldHVybiB0aGlzLmNvcHkodCkubXVsdGlwbHlTY2FsYXIobil9cHJvamVjdE9uUGxhbmUodCl7cmV0dXJuIHBvLmNvcHkodGhpcykucHJvamVjdE9uVmVjdG9yKHQpLHRoaXMuc3ViKHBvKX1yZWZsZWN0KHQpe3JldHVybiB0aGlzLnN1Yihwby5jb3B5KHQpLm11bHRpcGx5U2NhbGFyKDIqdGhpcy5kb3QodCkpKX1hbmdsZVRvKHQpe2NvbnN0IGU9TWF0aC5zcXJ0KHRoaXMubGVuZ3RoU3EoKSp0Lmxlbmd0aFNxKCkpO2lmKGU9PT0wKXJldHVybiBNYXRoLlBJLzI7Y29uc3Qgbj10aGlzLmRvdCh0KS9lO3JldHVybiBNYXRoLmFjb3MoWihuLC0xLDEpKX1kaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZCh0KSl9ZGlzdGFuY2VUb1NxdWFyZWQodCl7Y29uc3QgZT10aGlzLngtdC54LG49dGhpcy55LXQueSxzPXRoaXMuei10Lno7cmV0dXJuIGUqZStuKm4rcypzfW1hbmhhdHRhbkRpc3RhbmNlVG8odCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC10LngpK01hdGguYWJzKHRoaXMueS10LnkpK01hdGguYWJzKHRoaXMuei10LnopfXNldEZyb21TcGhlcmljYWwodCl7cmV0dXJuIHRoaXMuc2V0RnJvbVNwaGVyaWNhbENvb3Jkcyh0LnJhZGl1cyx0LnBoaSx0LnRoZXRhKX1zZXRGcm9tU3BoZXJpY2FsQ29vcmRzKHQsZSxuKXtjb25zdCBzPU1hdGguc2luKGUpKnQ7cmV0dXJuIHRoaXMueD1zKk1hdGguc2luKG4pLHRoaXMueT1NYXRoLmNvcyhlKSp0LHRoaXMuej1zKk1hdGguY29zKG4pLHRoaXN9c2V0RnJvbUN5bGluZHJpY2FsKHQpe3JldHVybiB0aGlzLnNldEZyb21DeWxpbmRyaWNhbENvb3Jkcyh0LnJhZGl1cyx0LnRoZXRhLHQueSl9c2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzKHQsZSxuKXtyZXR1cm4gdGhpcy54PXQqTWF0aC5zaW4oZSksdGhpcy55PW4sdGhpcy56PXQqTWF0aC5jb3MoZSksdGhpc31zZXRGcm9tTWF0cml4UG9zaXRpb24odCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9ZVsxMl0sdGhpcy55PWVbMTNdLHRoaXMuej1lWzE0XSx0aGlzfXNldEZyb21NYXRyaXhTY2FsZSh0KXtjb25zdCBlPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDApLmxlbmd0aCgpLG49dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMSkubGVuZ3RoKCkscz10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4odCwyKS5sZW5ndGgoKTtyZXR1cm4gdGhpcy54PWUsdGhpcy55PW4sdGhpcy56PXMsdGhpc31zZXRGcm9tTWF0cml4Q29sdW1uKHQsZSl7cmV0dXJuIHRoaXMuZnJvbUFycmF5KHQuZWxlbWVudHMsZSo0KX1zZXRGcm9tTWF0cml4M0NvbHVtbih0LGUpe3JldHVybiB0aGlzLmZyb21BcnJheSh0LmVsZW1lbnRzLGUqMyl9c2V0RnJvbUV1bGVyKHQpe3JldHVybiB0aGlzLng9dC5feCx0aGlzLnk9dC5feSx0aGlzLno9dC5feix0aGlzfXNldEZyb21Db2xvcih0KXtyZXR1cm4gdGhpcy54PXQucix0aGlzLnk9dC5nLHRoaXMuej10LmIsdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55JiZ0Lno9PT10aGlzLnp9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzLno9dFtlKzJdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy54LHRbZSsxXT10aGlzLnksdFtlKzJdPXRoaXMueix0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXMuej10LmdldFooZSksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpcy56PU1hdGgucmFuZG9tKCksdGhpc31yYW5kb21EaXJlY3Rpb24oKXtjb25zdCB0PU1hdGgucmFuZG9tKCkqTWF0aC5QSSoyLGU9TWF0aC5yYW5kb20oKSoyLTEsbj1NYXRoLnNxcnQoMS1lKmUpO3JldHVybiB0aGlzLng9bipNYXRoLmNvcyh0KSx0aGlzLnk9ZSx0aGlzLno9bipNYXRoLnNpbih0KSx0aGlzfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMueCx5aWVsZCB0aGlzLnkseWllbGQgdGhpcy56fX1jb25zdCBwbz1uZXcgUCxVYz1uZXcgUGk7Y2xhc3MgTWV7Y29uc3RydWN0b3IodCxlLG4scyxyLG8sYSxjLGwpe01lLnByb3RvdHlwZS5pc01hdHJpeDM9ITAsdGhpcy5lbGVtZW50cz1bMSwwLDAsMCwxLDAsMCwwLDFdLHQhPT12b2lkIDAmJnRoaXMuc2V0KHQsZSxuLHMscixvLGEsYyxsKX1zZXQodCxlLG4scyxyLG8sYSxjLGwpe2NvbnN0IGg9dGhpcy5lbGVtZW50cztyZXR1cm4gaFswXT10LGhbMV09cyxoWzJdPWEsaFszXT1lLGhbNF09cixoWzVdPWMsaFs2XT1uLGhbN109byxoWzhdPWwsdGhpc31pZGVudGl0eSgpe3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDEsMCwwLDAsMSksdGhpc31jb3B5KHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7cmV0dXJuIGVbMF09blswXSxlWzFdPW5bMV0sZVsyXT1uWzJdLGVbM109blszXSxlWzRdPW5bNF0sZVs1XT1uWzVdLGVbNl09bls2XSxlWzddPW5bN10sZVs4XT1uWzhdLHRoaXN9ZXh0cmFjdEJhc2lzKHQsZSxuKXtyZXR1cm4gdC5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDApLGUuc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywxKSxuLnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMiksdGhpc31zZXRGcm9tTWF0cml4NCh0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMuc2V0KGVbMF0sZVs0XSxlWzhdLGVbMV0sZVs1XSxlWzldLGVbMl0sZVs2XSxlWzEwXSksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0LHRoaXMpfW11bHRpcGx5TWF0cmljZXModCxlKXtjb25zdCBuPXQuZWxlbWVudHMscz1lLmVsZW1lbnRzLHI9dGhpcy5lbGVtZW50cyxvPW5bMF0sYT1uWzNdLGM9bls2XSxsPW5bMV0saD1uWzRdLHU9bls3XSxmPW5bMl0sZD1uWzVdLHA9bls4XSx5PXNbMF0sZz1zWzNdLHc9c1s2XSxiPXNbMV0seD1zWzRdLG09c1s3XSxNPXNbMl0sUz1zWzVdLEE9c1s4XTtyZXR1cm4gclswXT1vKnkrYSpiK2MqTSxyWzNdPW8qZythKngrYypTLHJbNl09byp3K2EqbStjKkEsclsxXT1sKnkraCpiK3UqTSxyWzRdPWwqZytoKngrdSpTLHJbN109bCp3K2gqbSt1KkEsclsyXT1mKnkrZCpiK3AqTSxyWzVdPWYqZytkKngrcCpTLHJbOF09Zip3K2QqbStwKkEsdGhpc31tdWx0aXBseVNjYWxhcih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIGVbMF0qPXQsZVszXSo9dCxlWzZdKj10LGVbMV0qPXQsZVs0XSo9dCxlWzddKj10LGVbMl0qPXQsZVs1XSo9dCxlWzhdKj10LHRoaXN9ZGV0ZXJtaW5hbnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFsxXSxzPXRbMl0scj10WzNdLG89dFs0XSxhPXRbNV0sYz10WzZdLGw9dFs3XSxoPXRbOF07cmV0dXJuIGUqbypoLWUqYSpsLW4qcipoK24qYSpjK3MqcipsLXMqbypjfWludmVydCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzFdLHM9dFsyXSxyPXRbM10sbz10WzRdLGE9dFs1XSxjPXRbNl0sbD10WzddLGg9dFs4XSx1PWgqby1hKmwsZj1hKmMtaCpyLGQ9bCpyLW8qYyxwPWUqdStuKmYrcypkO2lmKHA9PT0wKXJldHVybiB0aGlzLnNldCgwLDAsMCwwLDAsMCwwLDAsMCk7Y29uc3QgeT0xL3A7cmV0dXJuIHRbMF09dSp5LHRbMV09KHMqbC1oKm4pKnksdFsyXT0oYSpuLXMqbykqeSx0WzNdPWYqeSx0WzRdPShoKmUtcypjKSp5LHRbNV09KHMqci1hKmUpKnksdFs2XT1kKnksdFs3XT0obipjLWwqZSkqeSx0WzhdPShvKmUtbipyKSp5LHRoaXN9dHJhbnNwb3NlKCl7bGV0IHQ7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiB0PWVbMV0sZVsxXT1lWzNdLGVbM109dCx0PWVbMl0sZVsyXT1lWzZdLGVbNl09dCx0PWVbNV0sZVs1XT1lWzddLGVbN109dCx0aGlzfWdldE5vcm1hbE1hdHJpeCh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4NCh0KS5pbnZlcnQoKS50cmFuc3Bvc2UoKX10cmFuc3Bvc2VJbnRvQXJyYXkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzNdLHRbMl09ZVs2XSx0WzNdPWVbMV0sdFs0XT1lWzRdLHRbNV09ZVs3XSx0WzZdPWVbMl0sdFs3XT1lWzVdLHRbOF09ZVs4XSx0aGlzfXNldFV2VHJhbnNmb3JtKHQsZSxuLHMscixvLGEpe2NvbnN0IGM9TWF0aC5jb3MociksbD1NYXRoLnNpbihyKTtyZXR1cm4gdGhpcy5zZXQobipjLG4qbCwtbiooYypvK2wqYSkrbyt0LC1zKmwscypjLC1zKigtbCpvK2MqYSkrYStlLDAsMCwxKSx0aGlzfXNjYWxlKHQsZSl7cmV0dXJuIHRoaXMucHJlbXVsdGlwbHkoeW8ubWFrZVNjYWxlKHQsZSkpLHRoaXN9cm90YXRlKHQpe3JldHVybiB0aGlzLnByZW11bHRpcGx5KHlvLm1ha2VSb3RhdGlvbigtdCkpLHRoaXN9dHJhbnNsYXRlKHQsZSl7cmV0dXJuIHRoaXMucHJlbXVsdGlwbHkoeW8ubWFrZVRyYW5zbGF0aW9uKHQsZSkpLHRoaXN9bWFrZVRyYW5zbGF0aW9uKHQsZSl7cmV0dXJuIHQuaXNWZWN0b3IyP3RoaXMuc2V0KDEsMCx0LngsMCwxLHQueSwwLDAsMSk6dGhpcy5zZXQoMSwwLHQsMCwxLGUsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoZSwtbiwwLG4sZSwwLDAsMCwxKSx0aGlzfW1ha2VTY2FsZSh0LGUpe3JldHVybiB0aGlzLnNldCh0LDAsMCwwLGUsMCwwLDAsMSksdGhpc31lcXVhbHModCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztmb3IobGV0IHM9MDtzPDk7cysrKWlmKGVbc10hPT1uW3NdKXJldHVybiExO3JldHVybiEwfWZyb21BcnJheSh0LGU9MCl7Zm9yKGxldCBuPTA7bjw5O24rKyl0aGlzLmVsZW1lbnRzW25dPXRbbitlXTtyZXR1cm4gdGhpc310b0FycmF5KHQ9W10sZT0wKXtjb25zdCBuPXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbZV09blswXSx0W2UrMV09blsxXSx0W2UrMl09blsyXSx0W2UrM109blszXSx0W2UrNF09bls0XSx0W2UrNV09bls1XSx0W2UrNl09bls2XSx0W2UrN109bls3XSx0W2UrOF09bls4XSx0fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfX1jb25zdCB5bz1uZXcgTWUscWM9bmV3IE1lKCkuc2V0KC40MTIzOTA4LC4zNTc1ODQzLC4xODA0ODA4LC4yMTI2MzksLjcxNTE2ODcsLjA3MjE5MjMsLjAxOTMzMDgsLjExOTE5NDgsLjk1MDUzMjIpLFhjPW5ldyBNZSgpLnNldCgzLjI0MDk2OTksLTEuNTM3MzgzMiwtLjQ5ODYxMDgsLS45NjkyNDM2LDEuODc1OTY3NSwuMDQxNTU1MSwuMDU1NjMwMSwtLjIwMzk3NywxLjA1Njk3MTUpO2Z1bmN0aW9uIExmKCl7Y29uc3QgaT17ZW5hYmxlZDohMCx3b3JraW5nQ29sb3JTcGFjZTpJYyxzcGFjZXM6e30sY29udmVydDpmdW5jdGlvbihzLHIsbyl7cmV0dXJuIHRoaXMuZW5hYmxlZD09PSExfHxyPT09b3x8IXJ8fCFvfHwodGhpcy5zcGFjZXNbcl0udHJhbnNmZXI9PT11byYmKHMucj1DZShzLnIpLHMuZz1DZShzLmcpLHMuYj1DZShzLmIpKSx0aGlzLnNwYWNlc1tyXS5wcmltYXJpZXMhPT10aGlzLnNwYWNlc1tvXS5wcmltYXJpZXMmJihzLmFwcGx5TWF0cml4Myh0aGlzLnNwYWNlc1tyXS50b1hZWikscy5hcHBseU1hdHJpeDModGhpcy5zcGFjZXNbb10uZnJvbVhZWikpLHRoaXMuc3BhY2VzW29dLnRyYW5zZmVyPT09dW8mJihzLnI9VW4ocy5yKSxzLmc9VW4ocy5nKSxzLmI9VW4ocy5iKSkpLHN9LHdvcmtpbmdUb0NvbG9yU3BhY2U6ZnVuY3Rpb24ocyxyKXtyZXR1cm4gdGhpcy5jb252ZXJ0KHMsdGhpcy53b3JraW5nQ29sb3JTcGFjZSxyKX0sY29sb3JTcGFjZVRvV29ya2luZzpmdW5jdGlvbihzLHIpe3JldHVybiB0aGlzLmNvbnZlcnQocyxyLHRoaXMud29ya2luZ0NvbG9yU3BhY2UpfSxnZXRQcmltYXJpZXM6ZnVuY3Rpb24ocyl7cmV0dXJuIHRoaXMuc3BhY2VzW3NdLnByaW1hcmllc30sZ2V0VHJhbnNmZXI6ZnVuY3Rpb24ocyl7cmV0dXJuIHM9PT1GYz9rYzp0aGlzLnNwYWNlc1tzXS50cmFuc2Zlcn0sZ2V0VG9uZU1hcHBpbmdNb2RlOmZ1bmN0aW9uKHMpe3JldHVybiB0aGlzLnNwYWNlc1tzXS5vdXRwdXRDb2xvclNwYWNlQ29uZmlnLnRvbmVNYXBwaW5nTW9kZXx8InN0YW5kYXJkIn0sZ2V0THVtaW5hbmNlQ29lZmZpY2llbnRzOmZ1bmN0aW9uKHMscj10aGlzLndvcmtpbmdDb2xvclNwYWNlKXtyZXR1cm4gcy5mcm9tQXJyYXkodGhpcy5zcGFjZXNbcl0ubHVtaW5hbmNlQ29lZmZpY2llbnRzKX0sZGVmaW5lOmZ1bmN0aW9uKHMpe09iamVjdC5hc3NpZ24odGhpcy5zcGFjZXMscyl9LF9nZXRNYXRyaXg6ZnVuY3Rpb24ocyxyLG8pe3JldHVybiBzLmNvcHkodGhpcy5zcGFjZXNbcl0udG9YWVopLm11bHRpcGx5KHRoaXMuc3BhY2VzW29dLmZyb21YWVopfSxfZ2V0RHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U6ZnVuY3Rpb24ocyl7cmV0dXJuIHRoaXMuc3BhY2VzW3NdLm91dHB1dENvbG9yU3BhY2VDb25maWcuZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2V9LF9nZXRVbnBhY2tDb2xvclNwYWNlOmZ1bmN0aW9uKHM9dGhpcy53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIHRoaXMuc3BhY2VzW3NdLndvcmtpbmdDb2xvclNwYWNlQ29uZmlnLnVucGFja0NvbG9yU3BhY2V9LGZyb21Xb3JraW5nQ29sb3JTcGFjZTpmdW5jdGlvbihzLHIpe3JldHVybiBMYygiQ29sb3JNYW5hZ2VtZW50OiAuZnJvbVdvcmtpbmdDb2xvclNwYWNlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAud29ya2luZ1RvQ29sb3JTcGFjZSgpLiIpLGkud29ya2luZ1RvQ29sb3JTcGFjZShzLHIpfSx0b1dvcmtpbmdDb2xvclNwYWNlOmZ1bmN0aW9uKHMscil7cmV0dXJuIExjKCJDb2xvck1hbmFnZW1lbnQ6IC50b1dvcmtpbmdDb2xvclNwYWNlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuY29sb3JTcGFjZVRvV29ya2luZygpLiIpLGkuY29sb3JTcGFjZVRvV29ya2luZyhzLHIpfX0sdD1bLjY0LC4zMywuMywuNiwuMTUsLjA2XSxlPVsuMjEyNiwuNzE1MiwuMDcyMl0sbj1bLjMxMjcsLjMyOV07cmV0dXJuIGkuZGVmaW5lKHtbSWNdOntwcmltYXJpZXM6dCx3aGl0ZVBvaW50Om4sdHJhbnNmZXI6a2MsdG9YWVo6cWMsZnJvbVhZWjpYYyxsdW1pbmFuY2VDb2VmZmljaWVudHM6ZSx3b3JraW5nQ29sb3JTcGFjZUNvbmZpZzp7dW5wYWNrQ29sb3JTcGFjZTpmZX0sb3V0cHV0Q29sb3JTcGFjZUNvbmZpZzp7ZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U6ZmV9fSxbZmVdOntwcmltYXJpZXM6dCx3aGl0ZVBvaW50Om4sdHJhbnNmZXI6dW8sdG9YWVo6cWMsZnJvbVhZWjpYYyxsdW1pbmFuY2VDb2VmZmljaWVudHM6ZSxvdXRwdXRDb2xvclNwYWNlQ29uZmlnOntkcmF3aW5nQnVmZmVyQ29sb3JTcGFjZTpmZX19fSksaX1jb25zdCBkZT1MZigpO2Z1bmN0aW9uIENlKGkpe3JldHVybiBpPC4wNDA0NT9pKi4wNzczOTkzODA4Ok1hdGgucG93KGkqLjk0Nzg2NzI5ODYrLjA1MjEzMjcwMTQsMi40KX1mdW5jdGlvbiBVbihpKXtyZXR1cm4gaTwuMDAzMTMwOD9pKjEyLjkyOjEuMDU1Kk1hdGgucG93KGksLjQxNjY2KS0uMDU1fWxldCBxbjtjbGFzcyBPZntzdGF0aWMgZ2V0RGF0YVVSTCh0LGU9ImltYWdlL3BuZyIpe2lmKC9eZGF0YTovaS50ZXN0KHQuc3JjKXx8dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50PT0idW5kZWZpbmVkIilyZXR1cm4gdC5zcmM7bGV0IG47aWYodCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KW49dDtlbHNle3FuPT09dm9pZCAwJiYocW49TmMoImNhbnZhcyIpKSxxbi53aWR0aD10LndpZHRoLHFuLmhlaWdodD10LmhlaWdodDtjb25zdCBzPXFuLmdldENvbnRleHQoIjJkIik7dCBpbnN0YW5jZW9mIEltYWdlRGF0YT9zLnB1dEltYWdlRGF0YSh0LDAsMCk6cy5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCksbj1xbn1yZXR1cm4gbi50b0RhdGFVUkwoZSl9c3RhdGljIHNSR0JUb0xpbmVhcih0KXtpZih0eXBlb2YgSFRNTEltYWdlRWxlbWVudCE9InVuZGVmaW5lZCImJnQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHx0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQhPSJ1bmRlZmluZWQiJiZ0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnR8fHR5cGVvZiBJbWFnZUJpdG1hcCE9InVuZGVmaW5lZCImJnQgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCl7Y29uc3QgZT1OYygiY2FudmFzIik7ZS53aWR0aD10LndpZHRoLGUuaGVpZ2h0PXQuaGVpZ2h0O2NvbnN0IG49ZS5nZXRDb250ZXh0KCIyZCIpO24uZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpO2NvbnN0IHM9bi5nZXRJbWFnZURhdGEoMCwwLHQud2lkdGgsdC5oZWlnaHQpLHI9cy5kYXRhO2ZvcihsZXQgbz0wO288ci5sZW5ndGg7bysrKXJbb109Q2UocltvXS8yNTUpKjI1NTtyZXR1cm4gbi5wdXRJbWFnZURhdGEocywwLDApLGV9ZWxzZSBpZih0LmRhdGEpe2NvbnN0IGU9dC5kYXRhLnNsaWNlKDApO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWUgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxlIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXk/ZVtuXT1NYXRoLmZsb29yKENlKGVbbl0vMjU1KSoyNTUpOmVbbl09Q2UoZVtuXSk7cmV0dXJue2RhdGE6ZSx3aWR0aDp0LndpZHRoLGhlaWdodDp0LmhlaWdodH19ZWxzZSByZXR1cm4gYnQoIkltYWdlVXRpbHMuc1JHQlRvTGluZWFyKCk6IFVuc3VwcG9ydGVkIGltYWdlIHR5cGUuIE5vIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24gYXBwbGllZC4iKSx0fX1sZXQgRGY9MDtjbGFzcyAkZntjb25zdHJ1Y3Rvcih0PW51bGwpe3RoaXMuaXNTb3VyY2U9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6RGYrK30pLHRoaXMudXVpZD1tbigpLHRoaXMuZGF0YT10LHRoaXMuZGF0YVJlYWR5PSEwLHRoaXMudmVyc2lvbj0wfWdldFNpemUodCl7Y29uc3QgZT10aGlzLmRhdGE7cmV0dXJuIHR5cGVvZiBIVE1MVmlkZW9FbGVtZW50IT0idW5kZWZpbmVkIiYmZSBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQ/dC5zZXQoZS52aWRlb1dpZHRoLGUudmlkZW9IZWlnaHQsMCk6dHlwZW9mIFZpZGVvRnJhbWUhPSJ1bmRlZmluZWQiJiZlIGluc3RhbmNlb2YgVmlkZW9GcmFtZT90LnNldChlLmRpc3BsYXlIZWlnaHQsZS5kaXNwbGF5V2lkdGgsMCk6ZSE9PW51bGw/dC5zZXQoZS53aWR0aCxlLmhlaWdodCxlLmRlcHRofHwwKTp0LnNldCgwLDAsMCksdH1zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK310b0pTT04odCl7Y29uc3QgZT10PT09dm9pZCAwfHx0eXBlb2YgdD09InN0cmluZyI7aWYoIWUmJnQuaW1hZ2VzW3RoaXMudXVpZF0hPT12b2lkIDApcmV0dXJuIHQuaW1hZ2VzW3RoaXMudXVpZF07Y29uc3Qgbj17dXVpZDp0aGlzLnV1aWQsdXJsOiIifSxzPXRoaXMuZGF0YTtpZihzIT09bnVsbCl7bGV0IHI7aWYoQXJyYXkuaXNBcnJheShzKSl7cj1bXTtmb3IobGV0IG89MCxhPXMubGVuZ3RoO288YTtvKyspc1tvXS5pc0RhdGFUZXh0dXJlP3IucHVzaChtbyhzW29dLmltYWdlKSk6ci5wdXNoKG1vKHNbb10pKX1lbHNlIHI9bW8ocyk7bi51cmw9cn1yZXR1cm4gZXx8KHQuaW1hZ2VzW3RoaXMudXVpZF09biksbn19ZnVuY3Rpb24gbW8oaSl7cmV0dXJuIHR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50IT0idW5kZWZpbmVkIiYmaSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCE9InVuZGVmaW5lZCImJmkgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8dHlwZW9mIEltYWdlQml0bWFwIT0idW5kZWZpbmVkIiYmaSBpbnN0YW5jZW9mIEltYWdlQml0bWFwP09mLmdldERhdGFVUkwoaSk6aS5kYXRhP3tkYXRhOkFycmF5LmZyb20oaS5kYXRhKSx3aWR0aDppLndpZHRoLGhlaWdodDppLmhlaWdodCx0eXBlOmkuZGF0YS5jb25zdHJ1Y3Rvci5uYW1lfTooYnQoIlRleHR1cmU6IFVuYWJsZSB0byBzZXJpYWxpemUgVGV4dHVyZS4iKSx7fSl9bGV0IFZmPTA7Y29uc3QgZ289bmV3IFA7Y2xhc3MgZ24gZXh0ZW5kcyBnc3tjb25zdHJ1Y3Rvcih0PWduLkRFRkFVTFRfSU1BR0UsZT1nbi5ERUZBVUxUX01BUFBJTkcsbj0xMDAxLHM9MTAwMSxyPTEwMDYsbz0xMDA4LGE9MTAyMyxjPTEwMDksbD1nbi5ERUZBVUxUX0FOSVNPVFJPUFksaD1GYyl7c3VwZXIoKSx0aGlzLmlzVGV4dHVyZT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpWZisrfSksdGhpcy51dWlkPW1uKCksdGhpcy5uYW1lPSIiLHRoaXMuc291cmNlPW5ldyAkZih0KSx0aGlzLm1pcG1hcHM9W10sdGhpcy5tYXBwaW5nPWUsdGhpcy5jaGFubmVsPTAsdGhpcy53cmFwUz1uLHRoaXMud3JhcFQ9cyx0aGlzLm1hZ0ZpbHRlcj1yLHRoaXMubWluRmlsdGVyPW8sdGhpcy5hbmlzb3Ryb3B5PWwsdGhpcy5mb3JtYXQ9YSx0aGlzLmludGVybmFsRm9ybWF0PW51bGwsdGhpcy50eXBlPWMsdGhpcy5vZmZzZXQ9bmV3IGsoMCwwKSx0aGlzLnJlcGVhdD1uZXcgaygxLDEpLHRoaXMuY2VudGVyPW5ldyBrKDAsMCksdGhpcy5yb3RhdGlvbj0wLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMCx0aGlzLm1hdHJpeD1uZXcgTWUsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITAsdGhpcy5wcmVtdWx0aXBseUFscGhhPSExLHRoaXMuZmxpcFk9ITAsdGhpcy51bnBhY2tBbGlnbm1lbnQ9NCx0aGlzLmNvbG9yU3BhY2U9aCx0aGlzLnVzZXJEYXRhPXt9LHRoaXMudXBkYXRlUmFuZ2VzPVtdLHRoaXMudmVyc2lvbj0wLHRoaXMub25VcGRhdGU9bnVsbCx0aGlzLnJlbmRlclRhcmdldD1udWxsLHRoaXMuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPSExLHRoaXMuaXNBcnJheVRleHR1cmU9ISEodCYmdC5kZXB0aCYmdC5kZXB0aD4xKSx0aGlzLnBtcmVtVmVyc2lvbj0wfWdldCB3aWR0aCgpe3JldHVybiB0aGlzLnNvdXJjZS5nZXRTaXplKGdvKS54fWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy5zb3VyY2UuZ2V0U2l6ZShnbykueX1nZXQgZGVwdGgoKXtyZXR1cm4gdGhpcy5zb3VyY2UuZ2V0U2l6ZShnbykuen1nZXQgaW1hZ2UoKXtyZXR1cm4gdGhpcy5zb3VyY2UuZGF0YX1zZXQgaW1hZ2UodD1udWxsKXt0aGlzLnNvdXJjZS5kYXRhPXR9dXBkYXRlTWF0cml4KCl7dGhpcy5tYXRyaXguc2V0VXZUcmFuc2Zvcm0odGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55LHRoaXMucmVwZWF0LngsdGhpcy5yZXBlYXQueSx0aGlzLnJvdGF0aW9uLHRoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueSl9YWRkVXBkYXRlUmFuZ2UodCxlKXt0aGlzLnVwZGF0ZVJhbmdlcy5wdXNoKHtzdGFydDp0LGNvdW50OmV9KX1jbGVhclVwZGF0ZVJhbmdlcygpe3RoaXMudXBkYXRlUmFuZ2VzLmxlbmd0aD0wfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLm5hbWU9dC5uYW1lLHRoaXMuc291cmNlPXQuc291cmNlLHRoaXMubWlwbWFwcz10Lm1pcG1hcHMuc2xpY2UoMCksdGhpcy5tYXBwaW5nPXQubWFwcGluZyx0aGlzLmNoYW5uZWw9dC5jaGFubmVsLHRoaXMud3JhcFM9dC53cmFwUyx0aGlzLndyYXBUPXQud3JhcFQsdGhpcy5tYWdGaWx0ZXI9dC5tYWdGaWx0ZXIsdGhpcy5taW5GaWx0ZXI9dC5taW5GaWx0ZXIsdGhpcy5hbmlzb3Ryb3B5PXQuYW5pc290cm9weSx0aGlzLmZvcm1hdD10LmZvcm1hdCx0aGlzLmludGVybmFsRm9ybWF0PXQuaW50ZXJuYWxGb3JtYXQsdGhpcy50eXBlPXQudHlwZSx0aGlzLm9mZnNldC5jb3B5KHQub2Zmc2V0KSx0aGlzLnJlcGVhdC5jb3B5KHQucmVwZWF0KSx0aGlzLmNlbnRlci5jb3B5KHQuY2VudGVyKSx0aGlzLnJvdGF0aW9uPXQucm90YXRpb24sdGhpcy5tYXRyaXhBdXRvVXBkYXRlPXQubWF0cml4QXV0b1VwZGF0ZSx0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSx0aGlzLmdlbmVyYXRlTWlwbWFwcz10LmdlbmVyYXRlTWlwbWFwcyx0aGlzLnByZW11bHRpcGx5QWxwaGE9dC5wcmVtdWx0aXBseUFscGhhLHRoaXMuZmxpcFk9dC5mbGlwWSx0aGlzLnVucGFja0FsaWdubWVudD10LnVucGFja0FsaWdubWVudCx0aGlzLmNvbG9yU3BhY2U9dC5jb2xvclNwYWNlLHRoaXMucmVuZGVyVGFyZ2V0PXQucmVuZGVyVGFyZ2V0LHRoaXMuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPXQuaXNSZW5kZXJUYXJnZXRUZXh0dXJlLHRoaXMuaXNBcnJheVRleHR1cmU9dC5pc0FycmF5VGV4dHVyZSx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLHRoaXMubmVlZHNVcGRhdGU9ITAsdGhpc31zZXRWYWx1ZXModCl7Zm9yKGNvbnN0IGUgaW4gdCl7Y29uc3Qgbj10W2VdO2lmKG49PT12b2lkIDApe2J0KGBUZXh0dXJlLnNldFZhbHVlcygpOiBwYXJhbWV0ZXIgJyR7ZX0nIGhhcyB2YWx1ZSBvZiB1bmRlZmluZWQuYCk7Y29udGludWV9Y29uc3Qgcz10aGlzW2VdO2lmKHM9PT12b2lkIDApe2J0KGBUZXh0dXJlLnNldFZhbHVlcygpOiBwcm9wZXJ0eSAnJHtlfScgZG9lcyBub3QgZXhpc3QuYCk7Y29udGludWV9cyYmbiYmcy5pc1ZlY3RvcjImJm4uaXNWZWN0b3IyfHxzJiZuJiZzLmlzVmVjdG9yMyYmbi5pc1ZlY3RvcjN8fHMmJm4mJnMuaXNNYXRyaXgzJiZuLmlzTWF0cml4Mz9zLmNvcHkobik6dGhpc1tlXT1ufX10b0pTT04odCl7Y29uc3QgZT10PT09dm9pZCAwfHx0eXBlb2YgdD09InN0cmluZyI7aWYoIWUmJnQudGV4dHVyZXNbdGhpcy51dWlkXSE9PXZvaWQgMClyZXR1cm4gdC50ZXh0dXJlc1t0aGlzLnV1aWRdO2NvbnN0IG49e21ldGFkYXRhOnt2ZXJzaW9uOjQuNyx0eXBlOiJUZXh0dXJlIixnZW5lcmF0b3I6IlRleHR1cmUudG9KU09OIn0sdXVpZDp0aGlzLnV1aWQsbmFtZTp0aGlzLm5hbWUsaW1hZ2U6dGhpcy5zb3VyY2UudG9KU09OKHQpLnV1aWQsbWFwcGluZzp0aGlzLm1hcHBpbmcsY2hhbm5lbDp0aGlzLmNoYW5uZWwscmVwZWF0Olt0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnldLG9mZnNldDpbdGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55XSxjZW50ZXI6W3RoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueV0scm90YXRpb246dGhpcy5yb3RhdGlvbix3cmFwOlt0aGlzLndyYXBTLHRoaXMud3JhcFRdLGZvcm1hdDp0aGlzLmZvcm1hdCxpbnRlcm5hbEZvcm1hdDp0aGlzLmludGVybmFsRm9ybWF0LHR5cGU6dGhpcy50eXBlLGNvbG9yU3BhY2U6dGhpcy5jb2xvclNwYWNlLG1pbkZpbHRlcjp0aGlzLm1pbkZpbHRlcixtYWdGaWx0ZXI6dGhpcy5tYWdGaWx0ZXIsYW5pc290cm9weTp0aGlzLmFuaXNvdHJvcHksZmxpcFk6dGhpcy5mbGlwWSxnZW5lcmF0ZU1pcG1hcHM6dGhpcy5nZW5lcmF0ZU1pcG1hcHMscHJlbXVsdGlwbHlBbHBoYTp0aGlzLnByZW11bHRpcGx5QWxwaGEsdW5wYWNrQWxpZ25tZW50OnRoaXMudW5wYWNrQWxpZ25tZW50fTtyZXR1cm4gT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJihuLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLGV8fCh0LnRleHR1cmVzW3RoaXMudXVpZF09biksbn1kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXRyYW5zZm9ybVV2KHQpe2lmKHRoaXMubWFwcGluZyE9PTMwMClyZXR1cm4gdDtpZih0LmFwcGx5TWF0cml4Myh0aGlzLm1hdHJpeCksdC54PDB8fHQueD4xKXN3aXRjaCh0aGlzLndyYXBTKXtjYXNlIDFlMzp0Lng9dC54LU1hdGguZmxvb3IodC54KTticmVhaztjYXNlIDEwMDE6dC54PXQueDwwPzA6MTticmVhaztjYXNlIDEwMDI6TWF0aC5hYnMoTWF0aC5mbG9vcih0LngpJTIpPT09MT90Lng9TWF0aC5jZWlsKHQueCktdC54OnQueD10LngtTWF0aC5mbG9vcih0LngpO2JyZWFrfWlmKHQueTwwfHx0Lnk+MSlzd2l0Y2godGhpcy53cmFwVCl7Y2FzZSAxZTM6dC55PXQueS1NYXRoLmZsb29yKHQueSk7YnJlYWs7Y2FzZSAxMDAxOnQueT10Lnk8MD8wOjE7YnJlYWs7Y2FzZSAxMDAyOk1hdGguYWJzKE1hdGguZmxvb3IodC55KSUyKT09PTE/dC55PU1hdGguY2VpbCh0LnkpLXQueTp0Lnk9dC55LU1hdGguZmxvb3IodC55KTticmVha31yZXR1cm4gdGhpcy5mbGlwWSYmKHQueT0xLXQueSksdH1zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiYodGhpcy52ZXJzaW9uKyssdGhpcy5zb3VyY2UubmVlZHNVcGRhdGU9ITApfXNldCBuZWVkc1BNUkVNVXBkYXRlKHQpe3Q9PT0hMCYmdGhpcy5wbXJlbVZlcnNpb24rK319Z24uREVGQVVMVF9JTUFHRT1udWxsLGduLkRFRkFVTFRfTUFQUElORz0zMDAsZ24uREVGQVVMVF9BTklTT1RST1BZPTE7Y2xhc3MgaWV7Y29uc3RydWN0b3IodD0wLGU9MCxuPTAscz0xKXtpZS5wcm90b3R5cGUuaXNWZWN0b3I0PSEwLHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXMudz1zfWdldCB3aWR0aCgpe3JldHVybiB0aGlzLnp9c2V0IHdpZHRoKHQpe3RoaXMuej10fWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy53fXNldCBoZWlnaHQodCl7dGhpcy53PXR9c2V0KHQsZSxuLHMpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bix0aGlzLnc9cyx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpcy56PXQsdGhpcy53PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Wih0KXtyZXR1cm4gdGhpcy56PXQsdGhpc31zZXRXKHQpe3JldHVybiB0aGlzLnc9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztjYXNlIDM6dGhpcy53PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2Nhc2UgMzpyZXR1cm4gdGhpcy53O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56LHRoaXMudyl9Y29weSh0KXtyZXR1cm4gdGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXMuej10LnosdGhpcy53PXQudyE9PXZvaWQgMD90Lnc6MSx0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpcy56Kz10LnosdGhpcy53Kz10LncsdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpcy56Kz10LHRoaXMudys9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpcy56PXQueitlLnosdGhpcy53PXQudytlLncsdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXMueis9dC56KmUsdGhpcy53Kz10LncqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpcy56LT10LnosdGhpcy53LT10LncsdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpcy56LT10LHRoaXMudy09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpcy56PXQuei1lLnosdGhpcy53PXQudy1lLncsdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpcy56Kj10LnosdGhpcy53Kj10LncsdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzLnoqPXQsdGhpcy53Kj10LHRoaXN9YXBwbHlNYXRyaXg0KHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LHM9dGhpcy56LHI9dGhpcy53LG89dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PW9bMF0qZStvWzRdKm4rb1s4XSpzK29bMTJdKnIsdGhpcy55PW9bMV0qZStvWzVdKm4rb1s5XSpzK29bMTNdKnIsdGhpcy56PW9bMl0qZStvWzZdKm4rb1sxMF0qcytvWzE0XSpyLHRoaXMudz1vWzNdKmUrb1s3XSpuK29bMTFdKnMrb1sxNV0qcix0aGlzfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpcy56Lz10LnosdGhpcy53Lz10LncsdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1zZXRBeGlzQW5nbGVGcm9tUXVhdGVybmlvbih0KXt0aGlzLnc9MipNYXRoLmFjb3ModC53KTtjb25zdCBlPU1hdGguc3FydCgxLXQudyp0LncpO3JldHVybiBlPDFlLTQ/KHRoaXMueD0xLHRoaXMueT0wLHRoaXMuej0wKToodGhpcy54PXQueC9lLHRoaXMueT10LnkvZSx0aGlzLno9dC56L2UpLHRoaXN9c2V0QXhpc0FuZ2xlRnJvbVJvdGF0aW9uTWF0cml4KHQpe2xldCBlLG4scyxyO2NvbnN0IGM9dC5lbGVtZW50cyxsPWNbMF0saD1jWzRdLHU9Y1s4XSxmPWNbMV0sZD1jWzVdLHA9Y1s5XSx5PWNbMl0sZz1jWzZdLHc9Y1sxMF07aWYoTWF0aC5hYnMoaC1mKTwuMDEmJk1hdGguYWJzKHUteSk8LjAxJiZNYXRoLmFicyhwLWcpPC4wMSl7aWYoTWF0aC5hYnMoaCtmKTwuMSYmTWF0aC5hYnModSt5KTwuMSYmTWF0aC5hYnMocCtnKTwuMSYmTWF0aC5hYnMobCtkK3ctMyk8LjEpcmV0dXJuIHRoaXMuc2V0KDEsMCwwLDApLHRoaXM7ZT1NYXRoLlBJO2NvbnN0IHg9KGwrMSkvMixtPShkKzEpLzIsTT0odysxKS8yLFM9KGgrZikvNCxBPSh1K3kpLzQsdj0ocCtnKS80O3JldHVybiB4Pm0mJng+TT94PC4wMT8obj0wLHM9LjcwNzEwNjc4MSxyPS43MDcxMDY3ODEpOihuPU1hdGguc3FydCh4KSxzPVMvbixyPUEvbik6bT5NP208LjAxPyhuPS43MDcxMDY3ODEscz0wLHI9LjcwNzEwNjc4MSk6KHM9TWF0aC5zcXJ0KG0pLG49Uy9zLHI9di9zKTpNPC4wMT8obj0uNzA3MTA2NzgxLHM9LjcwNzEwNjc4MSxyPTApOihyPU1hdGguc3FydChNKSxuPUEvcixzPXYvciksdGhpcy5zZXQobixzLHIsZSksdGhpc31sZXQgYj1NYXRoLnNxcnQoKGctcCkqKGctcCkrKHUteSkqKHUteSkrKGYtaCkqKGYtaCkpO3JldHVybiBNYXRoLmFicyhiKTwuMDAxJiYoYj0xKSx0aGlzLng9KGctcCkvYix0aGlzLnk9KHUteSkvYix0aGlzLno9KGYtaCkvYix0aGlzLnc9TWF0aC5hY29zKChsK2Qrdy0xKS8yKSx0aGlzfXNldEZyb21NYXRyaXhQb3NpdGlvbih0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1lWzEyXSx0aGlzLnk9ZVsxM10sdGhpcy56PWVbMTRdLHRoaXMudz1lWzE1XSx0aGlzfW1pbih0KXtyZXR1cm4gdGhpcy54PU1hdGgubWluKHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1pbih0aGlzLnksdC55KSx0aGlzLno9TWF0aC5taW4odGhpcy56LHQueiksdGhpcy53PU1hdGgubWluKHRoaXMudyx0LncpLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1heCh0aGlzLnosdC56KSx0aGlzLnc9TWF0aC5tYXgodGhpcy53LHQudyksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9Wih0aGlzLngsdC54LGUueCksdGhpcy55PVoodGhpcy55LHQueSxlLnkpLHRoaXMuej1aKHRoaXMueix0LnosZS56KSx0aGlzLnc9Wih0aGlzLncsdC53LGUudyksdGhpc31jbGFtcFNjYWxhcih0LGUpe3JldHVybiB0aGlzLng9Wih0aGlzLngsdCxlKSx0aGlzLnk9Wih0aGlzLnksdCxlKSx0aGlzLno9Wih0aGlzLnosdCxlKSx0aGlzLnc9Wih0aGlzLncsdCxlKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgbj10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihufHwxKS5tdWx0aXBseVNjYWxhcihaKG4sdCxlKSl9Zmxvb3IoKXtyZXR1cm4gdGhpcy54PU1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpLHRoaXMuej1NYXRoLmZsb29yKHRoaXMueiksdGhpcy53PU1hdGguZmxvb3IodGhpcy53KSx0aGlzfWNlaWwoKXtyZXR1cm4gdGhpcy54PU1hdGguY2VpbCh0aGlzLngpLHRoaXMueT1NYXRoLmNlaWwodGhpcy55KSx0aGlzLno9TWF0aC5jZWlsKHRoaXMueiksdGhpcy53PU1hdGguY2VpbCh0aGlzLncpLHRoaXN9cm91bmQoKXtyZXR1cm4gdGhpcy54PU1hdGgucm91bmQodGhpcy54KSx0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpLHRoaXMuej1NYXRoLnJvdW5kKHRoaXMueiksdGhpcy53PU1hdGgucm91bmQodGhpcy53KSx0aGlzfXJvdW5kVG9aZXJvKCl7cmV0dXJuIHRoaXMueD1NYXRoLnRydW5jKHRoaXMueCksdGhpcy55PU1hdGgudHJ1bmModGhpcy55KSx0aGlzLno9TWF0aC50cnVuYyh0aGlzLnopLHRoaXMudz1NYXRoLnRydW5jKHRoaXMudyksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpcy53PS10aGlzLncsdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueSt0aGlzLnoqdC56K3RoaXMudyp0Lnd9bGVuZ3RoU3EoKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMud31sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56K3RoaXMudyp0aGlzLncpfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KStNYXRoLmFicyh0aGlzLncpfW5vcm1hbGl6ZSgpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX1zZXRMZW5ndGgodCl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodCl9bGVycCh0LGUpe3JldHVybiB0aGlzLngrPSh0LngtdGhpcy54KSplLHRoaXMueSs9KHQueS10aGlzLnkpKmUsdGhpcy56Kz0odC56LXRoaXMueikqZSx0aGlzLncrPSh0LnctdGhpcy53KSplLHRoaXN9bGVycFZlY3RvcnModCxlLG4pe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSpuLHRoaXMueT10LnkrKGUueS10LnkpKm4sdGhpcy56PXQueisoZS56LXQueikqbix0aGlzLnc9dC53KyhlLnctdC53KSpuLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lng9PT10aGlzLngmJnQueT09PXRoaXMueSYmdC56PT09dGhpcy56JiZ0Lnc9PT10aGlzLnd9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzLno9dFtlKzJdLHRoaXMudz10W2UrM10sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0W2UrMl09dGhpcy56LHRbZSszXT10aGlzLncsdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzLno9dC5nZXRaKGUpLHRoaXMudz10LmdldFcoZSksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpcy56PU1hdGgucmFuZG9tKCksdGhpcy53PU1hdGgucmFuZG9tKCksdGhpc30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLngseWllbGQgdGhpcy55LHlpZWxkIHRoaXMueix5aWVsZCB0aGlzLnd9fWNsYXNzIGd0e2NvbnN0cnVjdG9yKHQ9bmV3IFAoMS8wLDEvMCwxLzApLGU9bmV3IFAoLTEvMCwtMS8wLC0xLzApKXt0aGlzLmlzQm94Mz0hMCx0aGlzLm1pbj10LHRoaXMubWF4PWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMubWluLmNvcHkodCksdGhpcy5tYXguY29weShlKSx0aGlzfXNldEZyb21BcnJheSh0KXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrPTMpdGhpcy5leHBhbmRCeVBvaW50KHBlLmZyb21BcnJheSh0LGUpKTtyZXR1cm4gdGhpc31zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAsbj10LmNvdW50O2U8bjtlKyspdGhpcy5leHBhbmRCeVBvaW50KHBlLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSk7cmV0dXJuIHRoaXN9c2V0RnJvbVBvaW50cyh0KXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl0aGlzLmV4cGFuZEJ5UG9pbnQodFtlXSk7cmV0dXJuIHRoaXN9c2V0RnJvbUNlbnRlckFuZFNpemUodCxlKXtjb25zdCBuPXBlLmNvcHkoZSkubXVsdGlwbHlTY2FsYXIoLjUpO3JldHVybiB0aGlzLm1pbi5jb3B5KHQpLnN1YihuKSx0aGlzLm1heC5jb3B5KHQpLmFkZChuKSx0aGlzfXNldEZyb21PYmplY3QodCxlPSExKXtyZXR1cm4gdGhpcy5tYWtlRW1wdHkoKSx0aGlzLmV4cGFuZEJ5T2JqZWN0KHQsZSl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMubWluLmNvcHkodC5taW4pLHRoaXMubWF4LmNvcHkodC5tYXgpLHRoaXN9bWFrZUVtcHR5KCl7cmV0dXJuIHRoaXMubWluLng9dGhpcy5taW4ueT10aGlzLm1pbi56PTEvMCx0aGlzLm1heC54PXRoaXMubWF4Lnk9dGhpcy5tYXguej0tMS8wLHRoaXN9aXNFbXB0eSgpe3JldHVybiB0aGlzLm1heC54PHRoaXMubWluLnh8fHRoaXMubWF4Lnk8dGhpcy5taW4ueXx8dGhpcy5tYXguejx0aGlzLm1pbi56fWdldENlbnRlcih0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5zZXQoMCwwLDApOnQuYWRkVmVjdG9ycyh0aGlzLm1pbix0aGlzLm1heCkubXVsdGlwbHlTY2FsYXIoLjUpfWdldFNpemUodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3Quc2V0KDAsMCwwKTp0LnN1YlZlY3RvcnModGhpcy5tYXgsdGhpcy5taW4pfWV4cGFuZEJ5UG9pbnQodCl7cmV0dXJuIHRoaXMubWluLm1pbih0KSx0aGlzLm1heC5tYXgodCksdGhpc31leHBhbmRCeVZlY3Rvcih0KXtyZXR1cm4gdGhpcy5taW4uc3ViKHQpLHRoaXMubWF4LmFkZCh0KSx0aGlzfWV4cGFuZEJ5U2NhbGFyKHQpe3JldHVybiB0aGlzLm1pbi5hZGRTY2FsYXIoLXQpLHRoaXMubWF4LmFkZFNjYWxhcih0KSx0aGlzfWV4cGFuZEJ5T2JqZWN0KHQsZT0hMSl7dC51cGRhdGVXb3JsZE1hdHJpeCghMSwhMSk7Y29uc3Qgbj10Lmdlb21ldHJ5O2lmKG4hPT12b2lkIDApe2NvbnN0IHI9bi5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7aWYoZT09PSEwJiZyIT09dm9pZCAwJiZ0LmlzSW5zdGFuY2VkTWVzaCE9PSEwKWZvcihsZXQgbz0wLGE9ci5jb3VudDtvPGE7bysrKXQuaXNNZXNoPT09ITA/dC5nZXRWZXJ0ZXhQb3NpdGlvbihvLHBlKTpwZS5mcm9tQnVmZmVyQXR0cmlidXRlKHIsbykscGUuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpLHRoaXMuZXhwYW5kQnlQb2ludChwZSk7ZWxzZSB0LmJvdW5kaW5nQm94IT09dm9pZCAwPyh0LmJvdW5kaW5nQm94PT09bnVsbCYmdC5jb21wdXRlQm91bmRpbmdCb3goKSx4cy5jb3B5KHQuYm91bmRpbmdCb3gpKToobi5ib3VuZGluZ0JveD09PW51bGwmJm4uY29tcHV0ZUJvdW5kaW5nQm94KCkseHMuY29weShuLmJvdW5kaW5nQm94KSkseHMuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpLHRoaXMudW5pb24oeHMpfWNvbnN0IHM9dC5jaGlsZHJlbjtmb3IobGV0IHI9MCxvPXMubGVuZ3RoO3I8bztyKyspdGhpcy5leHBhbmRCeU9iamVjdChzW3JdLGUpO3JldHVybiB0aGlzfWNvbnRhaW5zUG9pbnQodCl7cmV0dXJuIHQueD49dGhpcy5taW4ueCYmdC54PD10aGlzLm1heC54JiZ0Lnk+PXRoaXMubWluLnkmJnQueTw9dGhpcy5tYXgueSYmdC56Pj10aGlzLm1pbi56JiZ0Lno8PXRoaXMubWF4Lnp9Y29udGFpbnNCb3godCl7cmV0dXJuIHRoaXMubWluLng8PXQubWluLngmJnQubWF4Lng8PXRoaXMubWF4LngmJnRoaXMubWluLnk8PXQubWluLnkmJnQubWF4Lnk8PXRoaXMubWF4LnkmJnRoaXMubWluLno8PXQubWluLnomJnQubWF4Lno8PXRoaXMubWF4Lnp9Z2V0UGFyYW1ldGVyKHQsZSl7cmV0dXJuIGUuc2V0KCh0LngtdGhpcy5taW4ueCkvKHRoaXMubWF4LngtdGhpcy5taW4ueCksKHQueS10aGlzLm1pbi55KS8odGhpcy5tYXgueS10aGlzLm1pbi55KSwodC56LXRoaXMubWluLnopLyh0aGlzLm1heC56LXRoaXMubWluLnopKX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0Lm1heC54Pj10aGlzLm1pbi54JiZ0Lm1pbi54PD10aGlzLm1heC54JiZ0Lm1heC55Pj10aGlzLm1pbi55JiZ0Lm1pbi55PD10aGlzLm1heC55JiZ0Lm1heC56Pj10aGlzLm1pbi56JiZ0Lm1pbi56PD10aGlzLm1heC56fWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHRoaXMuY2xhbXBQb2ludCh0LmNlbnRlcixwZSkscGUuZGlzdGFuY2VUb1NxdWFyZWQodC5jZW50ZXIpPD10LnJhZGl1cyp0LnJhZGl1c31pbnRlcnNlY3RzUGxhbmUodCl7bGV0IGUsbjtyZXR1cm4gdC5ub3JtYWwueD4wPyhlPXQubm9ybWFsLngqdGhpcy5taW4ueCxuPXQubm9ybWFsLngqdGhpcy5tYXgueCk6KGU9dC5ub3JtYWwueCp0aGlzLm1heC54LG49dC5ub3JtYWwueCp0aGlzLm1pbi54KSx0Lm5vcm1hbC55PjA/KGUrPXQubm9ybWFsLnkqdGhpcy5taW4ueSxuKz10Lm5vcm1hbC55KnRoaXMubWF4LnkpOihlKz10Lm5vcm1hbC55KnRoaXMubWF4Lnksbis9dC5ub3JtYWwueSp0aGlzLm1pbi55KSx0Lm5vcm1hbC56PjA/KGUrPXQubm9ybWFsLnoqdGhpcy5taW4ueixuKz10Lm5vcm1hbC56KnRoaXMubWF4LnopOihlKz10Lm5vcm1hbC56KnRoaXMubWF4Lnosbis9dC5ub3JtYWwueip0aGlzLm1pbi56KSxlPD0tdC5jb25zdGFudCYmbj49LXQuY29uc3RhbnR9aW50ZXJzZWN0c1RyaWFuZ2xlKHQpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiExO3RoaXMuZ2V0Q2VudGVyKENpKSx3cy5zdWJWZWN0b3JzKHRoaXMubWF4LENpKSxYbi5zdWJWZWN0b3JzKHQuYSxDaSksWm4uc3ViVmVjdG9ycyh0LmIsQ2kpLEduLnN1YlZlY3RvcnModC5jLENpKSx0bi5zdWJWZWN0b3JzKFpuLFhuKSxlbi5zdWJWZWN0b3JzKEduLFpuKSx4bi5zdWJWZWN0b3JzKFhuLEduKTtsZXQgZT1bMCwtdG4ueix0bi55LDAsLWVuLnosZW4ueSwwLC14bi56LHhuLnksdG4ueiwwLC10bi54LGVuLnosMCwtZW4ueCx4bi56LDAsLXhuLngsLXRuLnksdG4ueCwwLC1lbi55LGVuLngsMCwteG4ueSx4bi54LDBdO3JldHVybiF4byhlLFhuLFpuLEduLHdzKXx8KGU9WzEsMCwwLDAsMSwwLDAsMCwxXSwheG8oZSxYbixabixHbix3cykpPyExOihicy5jcm9zc1ZlY3RvcnModG4sZW4pLGU9W2JzLngsYnMueSxicy56XSx4byhlLFhuLFpuLEduLHdzKSl9Y2xhbXBQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodCkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdGhpcy5jbGFtcFBvaW50KHQscGUpLmRpc3RhbmNlVG8odCl9Z2V0Qm91bmRpbmdTcGhlcmUodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3QubWFrZUVtcHR5KCk6KHRoaXMuZ2V0Q2VudGVyKHQuY2VudGVyKSx0LnJhZGl1cz10aGlzLmdldFNpemUocGUpLmxlbmd0aCgpKi41KSx0fWludGVyc2VjdCh0KXtyZXR1cm4gdGhpcy5taW4ubWF4KHQubWluKSx0aGlzLm1heC5taW4odC5tYXgpLHRoaXMuaXNFbXB0eSgpJiZ0aGlzLm1ha2VFbXB0eSgpLHRoaXN9dW5pb24odCl7cmV0dXJuIHRoaXMubWluLm1pbih0Lm1pbiksdGhpcy5tYXgubWF4KHQubWF4KSx0aGlzfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dGhpczooRWVbMF0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksRWVbMV0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksRWVbMl0uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksRWVbM10uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksRWVbNF0uc2V0KHRoaXMubWF4LngsdGhpcy5taW4ueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksRWVbNV0uc2V0KHRoaXMubWF4LngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksRWVbNl0uc2V0KHRoaXMubWF4LngsdGhpcy5tYXgueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksRWVbN10uc2V0KHRoaXMubWF4LngsdGhpcy5tYXgueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksdGhpcy5zZXRGcm9tUG9pbnRzKEVlKSx0aGlzKX10cmFuc2xhdGUodCl7cmV0dXJuIHRoaXMubWluLmFkZCh0KSx0aGlzLm1heC5hZGQodCksdGhpc31lcXVhbHModCl7cmV0dXJuIHQubWluLmVxdWFscyh0aGlzLm1pbikmJnQubWF4LmVxdWFscyh0aGlzLm1heCl9dG9KU09OKCl7cmV0dXJue21pbjp0aGlzLm1pbi50b0FycmF5KCksbWF4OnRoaXMubWF4LnRvQXJyYXkoKX19ZnJvbUpTT04odCl7cmV0dXJuIHRoaXMubWluLmZyb21BcnJheSh0Lm1pbiksdGhpcy5tYXguZnJvbUFycmF5KHQubWF4KSx0aGlzfX1jb25zdCBFZT1bbmV3IFAsbmV3IFAsbmV3IFAsbmV3IFAsbmV3IFAsbmV3IFAsbmV3IFAsbmV3IFBdLHBlPW5ldyBQLHhzPW5ldyBndCxYbj1uZXcgUCxabj1uZXcgUCxHbj1uZXcgUCx0bj1uZXcgUCxlbj1uZXcgUCx4bj1uZXcgUCxDaT1uZXcgUCx3cz1uZXcgUCxicz1uZXcgUCx3bj1uZXcgUDtmdW5jdGlvbiB4byhpLHQsZSxuLHMpe2ZvcihsZXQgcj0wLG89aS5sZW5ndGgtMztyPD1vO3IrPTMpe3duLmZyb21BcnJheShpLHIpO2NvbnN0IGE9cy54Kk1hdGguYWJzKHduLngpK3MueSpNYXRoLmFicyh3bi55KStzLnoqTWF0aC5hYnMod24ueiksYz10LmRvdCh3biksbD1lLmRvdCh3biksaD1uLmRvdCh3bik7aWYoTWF0aC5tYXgoLU1hdGgubWF4KGMsbCxoKSxNYXRoLm1pbihjLGwsaCkpPmEpcmV0dXJuITF9cmV0dXJuITB9Y29uc3QgVWY9bmV3IGd0LEVpPW5ldyBQLHdvPW5ldyBQO2NsYXNzIFpje2NvbnN0cnVjdG9yKHQ9bmV3IFAsZT0tMSl7dGhpcy5pc1NwaGVyZT0hMCx0aGlzLmNlbnRlcj10LHRoaXMucmFkaXVzPWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodCksdGhpcy5yYWRpdXM9ZSx0aGlzfXNldEZyb21Qb2ludHModCxlKXtjb25zdCBuPXRoaXMuY2VudGVyO2UhPT12b2lkIDA/bi5jb3B5KGUpOlVmLnNldEZyb21Qb2ludHModCkuZ2V0Q2VudGVyKG4pO2xldCBzPTA7Zm9yKGxldCByPTAsbz10Lmxlbmd0aDtyPG87cisrKXM9TWF0aC5tYXgocyxuLmRpc3RhbmNlVG9TcXVhcmVkKHRbcl0pKTtyZXR1cm4gdGhpcy5yYWRpdXM9TWF0aC5zcXJ0KHMpLHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5jZW50ZXIuY29weSh0LmNlbnRlciksdGhpcy5yYWRpdXM9dC5yYWRpdXMsdGhpc31pc0VtcHR5KCl7cmV0dXJuIHRoaXMucmFkaXVzPDB9bWFrZUVtcHR5KCl7cmV0dXJuIHRoaXMuY2VudGVyLnNldCgwLDAsMCksdGhpcy5yYWRpdXM9LTEsdGhpc31jb250YWluc1BvaW50KHQpe3JldHVybiB0LmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuY2VudGVyKTw9dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXN9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiB0LmRpc3RhbmNlVG8odGhpcy5jZW50ZXIpLXRoaXMucmFkaXVzfWludGVyc2VjdHNTcGhlcmUodCl7Y29uc3QgZT10aGlzLnJhZGl1cyt0LnJhZGl1cztyZXR1cm4gdC5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD1lKmV9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzU3BoZXJlKHRoaXMpfWludGVyc2VjdHNQbGFuZSh0KXtyZXR1cm4gTWF0aC5hYnModC5kaXN0YW5jZVRvUG9pbnQodGhpcy5jZW50ZXIpKTw9dGhpcy5yYWRpdXN9Y2xhbXBQb2ludCh0LGUpe2NvbnN0IG49dGhpcy5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQodCk7cmV0dXJuIGUuY29weSh0KSxuPnRoaXMucmFkaXVzKnRoaXMucmFkaXVzJiYoZS5zdWIodGhpcy5jZW50ZXIpLm5vcm1hbGl6ZSgpLGUubXVsdGlwbHlTY2FsYXIodGhpcy5yYWRpdXMpLmFkZCh0aGlzLmNlbnRlcikpLGV9Z2V0Qm91bmRpbmdCb3godCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpPyh0Lm1ha2VFbXB0eSgpLHQpOih0LnNldCh0aGlzLmNlbnRlcix0aGlzLmNlbnRlciksdC5leHBhbmRCeVNjYWxhcih0aGlzLnJhZGl1cyksdCl9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLmNlbnRlci5hcHBseU1hdHJpeDQodCksdGhpcy5yYWRpdXM9dGhpcy5yYWRpdXMqdC5nZXRNYXhTY2FsZU9uQXhpcygpLHRoaXN9dHJhbnNsYXRlKHQpe3JldHVybiB0aGlzLmNlbnRlci5hZGQodCksdGhpc31leHBhbmRCeVBvaW50KHQpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiB0aGlzLmNlbnRlci5jb3B5KHQpLHRoaXMucmFkaXVzPTAsdGhpcztFaS5zdWJWZWN0b3JzKHQsdGhpcy5jZW50ZXIpO2NvbnN0IGU9RWkubGVuZ3RoU3EoKTtpZihlPnRoaXMucmFkaXVzKnRoaXMucmFkaXVzKXtjb25zdCBuPU1hdGguc3FydChlKSxzPShuLXRoaXMucmFkaXVzKSouNTt0aGlzLmNlbnRlci5hZGRTY2FsZWRWZWN0b3IoRWkscy9uKSx0aGlzLnJhZGl1cys9c31yZXR1cm4gdGhpc311bmlvbih0KXtyZXR1cm4gdC5pc0VtcHR5KCk/dGhpczp0aGlzLmlzRW1wdHkoKT8odGhpcy5jb3B5KHQpLHRoaXMpOih0aGlzLmNlbnRlci5lcXVhbHModC5jZW50ZXIpPT09ITA/dGhpcy5yYWRpdXM9TWF0aC5tYXgodGhpcy5yYWRpdXMsdC5yYWRpdXMpOih3by5zdWJWZWN0b3JzKHQuY2VudGVyLHRoaXMuY2VudGVyKS5zZXRMZW5ndGgodC5yYWRpdXMpLHRoaXMuZXhwYW5kQnlQb2ludChFaS5jb3B5KHQuY2VudGVyKS5hZGQod28pKSx0aGlzLmV4cGFuZEJ5UG9pbnQoRWkuY29weSh0LmNlbnRlcikuc3ViKHdvKSkpLHRoaXMpfWVxdWFscyh0KXtyZXR1cm4gdC5jZW50ZXIuZXF1YWxzKHRoaXMuY2VudGVyKSYmdC5yYWRpdXM9PT10aGlzLnJhZGl1c31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9dG9KU09OKCl7cmV0dXJue3JhZGl1czp0aGlzLnJhZGl1cyxjZW50ZXI6dGhpcy5jZW50ZXIudG9BcnJheSgpfX1mcm9tSlNPTih0KXtyZXR1cm4gdGhpcy5yYWRpdXM9dC5yYWRpdXMsdGhpcy5jZW50ZXIuZnJvbUFycmF5KHQuY2VudGVyKSx0aGlzfX1jb25zdCBCZT1uZXcgUCxibz1uZXcgUCxNcz1uZXcgUCxubj1uZXcgUCxNbz1uZXcgUCxBcz1uZXcgUCxBbz1uZXcgUDtjbGFzcyBTb3tjb25zdHJ1Y3Rvcih0PW5ldyBQLGU9bmV3IFAoMCwwLC0xKSl7dGhpcy5vcmlnaW49dCx0aGlzLmRpcmVjdGlvbj1lfXNldCh0LGUpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHQpLHRoaXMuZGlyZWN0aW9uLmNvcHkoZSksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHQub3JpZ2luKSx0aGlzLmRpcmVjdGlvbi5jb3B5KHQuZGlyZWN0aW9uKSx0aGlzfWF0KHQsZSl7cmV0dXJuIGUuY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLHQpfWxvb2tBdCh0KXtyZXR1cm4gdGhpcy5kaXJlY3Rpb24uY29weSh0KS5zdWIodGhpcy5vcmlnaW4pLm5vcm1hbGl6ZSgpLHRoaXN9cmVjYXN0KHQpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHRoaXMuYXQodCxCZSkpLHRoaXN9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUpe2Uuc3ViVmVjdG9ycyh0LHRoaXMub3JpZ2luKTtjb25zdCBuPWUuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gbjwwP2UuY29weSh0aGlzLm9yaWdpbik6ZS5jb3B5KHRoaXMub3JpZ2luKS5hZGRTY2FsZWRWZWN0b3IodGhpcy5kaXJlY3Rpb24sbil9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVNxVG9Qb2ludCh0KSl9ZGlzdGFuY2VTcVRvUG9pbnQodCl7Y29uc3QgZT1CZS5zdWJWZWN0b3JzKHQsdGhpcy5vcmlnaW4pLmRvdCh0aGlzLmRpcmVjdGlvbik7cmV0dXJuIGU8MD90aGlzLm9yaWdpbi5kaXN0YW5jZVRvU3F1YXJlZCh0KTooQmUuY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLGUpLEJlLmRpc3RhbmNlVG9TcXVhcmVkKHQpKX1kaXN0YW5jZVNxVG9TZWdtZW50KHQsZSxuLHMpe2JvLmNvcHkodCkuYWRkKGUpLm11bHRpcGx5U2NhbGFyKC41KSxNcy5jb3B5KGUpLnN1Yih0KS5ub3JtYWxpemUoKSxubi5jb3B5KHRoaXMub3JpZ2luKS5zdWIoYm8pO2NvbnN0IHI9dC5kaXN0YW5jZVRvKGUpKi41LG89LXRoaXMuZGlyZWN0aW9uLmRvdChNcyksYT1ubi5kb3QodGhpcy5kaXJlY3Rpb24pLGM9LW5uLmRvdChNcyksbD1ubi5sZW5ndGhTcSgpLGg9TWF0aC5hYnMoMS1vKm8pO2xldCB1LGYsZCxwO2lmKGg+MClpZih1PW8qYy1hLGY9byphLWMscD1yKmgsdT49MClpZihmPj0tcClpZihmPD1wKXtjb25zdCB5PTEvaDt1Kj15LGYqPXksZD11Kih1K28qZisyKmEpK2YqKG8qdStmKzIqYykrbH1lbHNlIGY9cix1PU1hdGgubWF4KDAsLShvKmYrYSkpLGQ9LXUqdStmKihmKzIqYykrbDtlbHNlIGY9LXIsdT1NYXRoLm1heCgwLC0obypmK2EpKSxkPS11KnUrZiooZisyKmMpK2w7ZWxzZSBmPD0tcD8odT1NYXRoLm1heCgwLC0oLW8qcithKSksZj11PjA/LXI6TWF0aC5taW4oTWF0aC5tYXgoLXIsLWMpLHIpLGQ9LXUqdStmKihmKzIqYykrbCk6Zjw9cD8odT0wLGY9TWF0aC5taW4oTWF0aC5tYXgoLXIsLWMpLHIpLGQ9ZiooZisyKmMpK2wpOih1PU1hdGgubWF4KDAsLShvKnIrYSkpLGY9dT4wP3I6TWF0aC5taW4oTWF0aC5tYXgoLXIsLWMpLHIpLGQ9LXUqdStmKihmKzIqYykrbCk7ZWxzZSBmPW8+MD8tcjpyLHU9TWF0aC5tYXgoMCwtKG8qZithKSksZD0tdSp1K2YqKGYrMipjKStsO3JldHVybiBuJiZuLmNvcHkodGhpcy5vcmlnaW4pLmFkZFNjYWxlZFZlY3Rvcih0aGlzLmRpcmVjdGlvbix1KSxzJiZzLmNvcHkoYm8pLmFkZFNjYWxlZFZlY3RvcihNcyxmKSxkfWludGVyc2VjdFNwaGVyZSh0LGUpe0JlLnN1YlZlY3RvcnModC5jZW50ZXIsdGhpcy5vcmlnaW4pO2NvbnN0IG49QmUuZG90KHRoaXMuZGlyZWN0aW9uKSxzPUJlLmRvdChCZSktbipuLHI9dC5yYWRpdXMqdC5yYWRpdXM7aWYocz5yKXJldHVybiBudWxsO2NvbnN0IG89TWF0aC5zcXJ0KHItcyksYT1uLW8sYz1uK287cmV0dXJuIGM8MD9udWxsOmE8MD90aGlzLmF0KGMsZSk6dGhpcy5hdChhLGUpfWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHQucmFkaXVzPDA/ITE6dGhpcy5kaXN0YW5jZVNxVG9Qb2ludCh0LmNlbnRlcik8PXQucmFkaXVzKnQucmFkaXVzfWRpc3RhbmNlVG9QbGFuZSh0KXtjb25zdCBlPXQubm9ybWFsLmRvdCh0aGlzLmRpcmVjdGlvbik7aWYoZT09PTApcmV0dXJuIHQuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKT09PTA/MDpudWxsO2NvbnN0IG49LSh0aGlzLm9yaWdpbi5kb3QodC5ub3JtYWwpK3QuY29uc3RhbnQpL2U7cmV0dXJuIG4+PTA/bjpudWxsfWludGVyc2VjdFBsYW5lKHQsZSl7Y29uc3Qgbj10aGlzLmRpc3RhbmNlVG9QbGFuZSh0KTtyZXR1cm4gbj09PW51bGw/bnVsbDp0aGlzLmF0KG4sZSl9aW50ZXJzZWN0c1BsYW5lKHQpe2NvbnN0IGU9dC5kaXN0YW5jZVRvUG9pbnQodGhpcy5vcmlnaW4pO3JldHVybiBlPT09MHx8dC5ub3JtYWwuZG90KHRoaXMuZGlyZWN0aW9uKSplPDB9aW50ZXJzZWN0Qm94KHQsZSl7bGV0IG4scyxyLG8sYSxjO2NvbnN0IGw9MS90aGlzLmRpcmVjdGlvbi54LGg9MS90aGlzLmRpcmVjdGlvbi55LHU9MS90aGlzLmRpcmVjdGlvbi56LGY9dGhpcy5vcmlnaW47cmV0dXJuIGw+PTA/KG49KHQubWluLngtZi54KSpsLHM9KHQubWF4LngtZi54KSpsKToobj0odC5tYXgueC1mLngpKmwscz0odC5taW4ueC1mLngpKmwpLGg+PTA/KHI9KHQubWluLnktZi55KSpoLG89KHQubWF4LnktZi55KSpoKToocj0odC5tYXgueS1mLnkpKmgsbz0odC5taW4ueS1mLnkpKmgpLG4+b3x8cj5zfHwoKHI+bnx8aXNOYU4obikpJiYobj1yKSwobzxzfHxpc05hTihzKSkmJihzPW8pLHU+PTA/KGE9KHQubWluLnotZi56KSp1LGM9KHQubWF4LnotZi56KSp1KTooYT0odC5tYXguei1mLnopKnUsYz0odC5taW4uei1mLnopKnUpLG4+Y3x8YT5zKXx8KChhPm58fG4hPT1uKSYmKG49YSksKGM8c3x8cyE9PXMpJiYocz1jKSxzPDApP251bGw6dGhpcy5hdChuPj0wP246cyxlKX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0aGlzLmludGVyc2VjdEJveCh0LEJlKSE9PW51bGx9aW50ZXJzZWN0VHJpYW5nbGUodCxlLG4scyxyKXtNby5zdWJWZWN0b3JzKGUsdCksQXMuc3ViVmVjdG9ycyhuLHQpLEFvLmNyb3NzVmVjdG9ycyhNbyxBcyk7bGV0IG89dGhpcy5kaXJlY3Rpb24uZG90KEFvKSxhO2lmKG8+MCl7aWYocylyZXR1cm4gbnVsbDthPTF9ZWxzZSBpZihvPDApYT0tMSxvPS1vO2Vsc2UgcmV0dXJuIG51bGw7bm4uc3ViVmVjdG9ycyh0aGlzLm9yaWdpbix0KTtjb25zdCBjPWEqdGhpcy5kaXJlY3Rpb24uZG90KEFzLmNyb3NzVmVjdG9ycyhubixBcykpO2lmKGM8MClyZXR1cm4gbnVsbDtjb25zdCBsPWEqdGhpcy5kaXJlY3Rpb24uZG90KE1vLmNyb3NzKG5uKSk7aWYobDwwfHxjK2w+bylyZXR1cm4gbnVsbDtjb25zdCBoPS1hKm5uLmRvdChBbyk7cmV0dXJuIGg8MD9udWxsOnRoaXMuYXQoaC9vLHIpfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5vcmlnaW4uYXBwbHlNYXRyaXg0KHQpLHRoaXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5vcmlnaW4uZXF1YWxzKHRoaXMub3JpZ2luKSYmdC5kaXJlY3Rpb24uZXF1YWxzKHRoaXMuZGlyZWN0aW9uKX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWNsYXNzIHN0e2NvbnN0cnVjdG9yKHQsZSxuLHMscixvLGEsYyxsLGgsdSxmLGQscCx5LGcpe3N0LnByb3RvdHlwZS5pc01hdHJpeDQ9ITAsdGhpcy5lbGVtZW50cz1bMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMV0sdCE9PXZvaWQgMCYmdGhpcy5zZXQodCxlLG4scyxyLG8sYSxjLGwsaCx1LGYsZCxwLHksZyl9c2V0KHQsZSxuLHMscixvLGEsYyxsLGgsdSxmLGQscCx5LGcpe2NvbnN0IHc9dGhpcy5lbGVtZW50cztyZXR1cm4gd1swXT10LHdbNF09ZSx3WzhdPW4sd1sxMl09cyx3WzFdPXIsd1s1XT1vLHdbOV09YSx3WzEzXT1jLHdbMl09bCx3WzZdPWgsd1sxMF09dSx3WzE0XT1mLHdbM109ZCx3WzddPXAsd1sxMV09eSx3WzE1XT1nLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMSksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgc3QoKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9Y29weSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO3JldHVybiBlWzBdPW5bMF0sZVsxXT1uWzFdLGVbMl09blsyXSxlWzNdPW5bM10sZVs0XT1uWzRdLGVbNV09bls1XSxlWzZdPW5bNl0sZVs3XT1uWzddLGVbOF09bls4XSxlWzldPW5bOV0sZVsxMF09blsxMF0sZVsxMV09blsxMV0sZVsxMl09blsxMl0sZVsxM109blsxM10sZVsxNF09blsxNF0sZVsxNV09blsxNV0sdGhpc31jb3B5UG9zaXRpb24odCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztyZXR1cm4gZVsxMl09blsxMl0sZVsxM109blsxM10sZVsxNF09blsxNF0sdGhpc31zZXRGcm9tTWF0cml4Myh0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMuc2V0KGVbMF0sZVszXSxlWzZdLDAsZVsxXSxlWzRdLGVbN10sMCxlWzJdLGVbNV0sZVs4XSwwLDAsMCwwLDEpLHRoaXN9ZXh0cmFjdEJhc2lzKHQsZSxuKXtyZXR1cm4gdGhpcy5kZXRlcm1pbmFudCgpPT09MD8odC5zZXQoMSwwLDApLGUuc2V0KDAsMSwwKSxuLnNldCgwLDAsMSksdGhpcyk6KHQuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDApLGUuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDEpLG4uc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDIpLHRoaXMpfW1ha2VCYXNpcyh0LGUsbil7cmV0dXJuIHRoaXMuc2V0KHQueCxlLngsbi54LDAsdC55LGUueSxuLnksMCx0LnosZS56LG4ueiwwLDAsMCwwLDEpLHRoaXN9ZXh0cmFjdFJvdGF0aW9uKHQpe2lmKHQuZGV0ZXJtaW5hbnQoKT09PTApcmV0dXJuIHRoaXMuaWRlbnRpdHkoKTtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzLHM9MS9Xbi5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMCkubGVuZ3RoKCkscj0xL1duLnNldEZyb21NYXRyaXhDb2x1bW4odCwxKS5sZW5ndGgoKSxvPTEvV24uc2V0RnJvbU1hdHJpeENvbHVtbih0LDIpLmxlbmd0aCgpO3JldHVybiBlWzBdPW5bMF0qcyxlWzFdPW5bMV0qcyxlWzJdPW5bMl0qcyxlWzNdPTAsZVs0XT1uWzRdKnIsZVs1XT1uWzVdKnIsZVs2XT1uWzZdKnIsZVs3XT0wLGVbOF09bls4XSpvLGVbOV09bls5XSpvLGVbMTBdPW5bMTBdKm8sZVsxMV09MCxlWzEyXT0wLGVbMTNdPTAsZVsxNF09MCxlWzE1XT0xLHRoaXN9bWFrZVJvdGF0aW9uRnJvbUV1bGVyKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQueCxzPXQueSxyPXQueixvPU1hdGguY29zKG4pLGE9TWF0aC5zaW4obiksYz1NYXRoLmNvcyhzKSxsPU1hdGguc2luKHMpLGg9TWF0aC5jb3MociksdT1NYXRoLnNpbihyKTtpZih0Lm9yZGVyPT09IlhZWiIpe2NvbnN0IGY9bypoLGQ9byp1LHA9YSpoLHk9YSp1O2VbMF09YypoLGVbNF09LWMqdSxlWzhdPWwsZVsxXT1kK3AqbCxlWzVdPWYteSpsLGVbOV09LWEqYyxlWzJdPXktZipsLGVbNl09cCtkKmwsZVsxMF09bypjfWVsc2UgaWYodC5vcmRlcj09PSJZWFoiKXtjb25zdCBmPWMqaCxkPWMqdSxwPWwqaCx5PWwqdTtlWzBdPWYreSphLGVbNF09cCphLWQsZVs4XT1vKmwsZVsxXT1vKnUsZVs1XT1vKmgsZVs5XT0tYSxlWzJdPWQqYS1wLGVbNl09eStmKmEsZVsxMF09bypjfWVsc2UgaWYodC5vcmRlcj09PSJaWFkiKXtjb25zdCBmPWMqaCxkPWMqdSxwPWwqaCx5PWwqdTtlWzBdPWYteSphLGVbNF09LW8qdSxlWzhdPXArZCphLGVbMV09ZCtwKmEsZVs1XT1vKmgsZVs5XT15LWYqYSxlWzJdPS1vKmwsZVs2XT1hLGVbMTBdPW8qY31lbHNlIGlmKHQub3JkZXI9PT0iWllYIil7Y29uc3QgZj1vKmgsZD1vKnUscD1hKmgseT1hKnU7ZVswXT1jKmgsZVs0XT1wKmwtZCxlWzhdPWYqbCt5LGVbMV09Yyp1LGVbNV09eSpsK2YsZVs5XT1kKmwtcCxlWzJdPS1sLGVbNl09YSpjLGVbMTBdPW8qY31lbHNlIGlmKHQub3JkZXI9PT0iWVpYIil7Y29uc3QgZj1vKmMsZD1vKmwscD1hKmMseT1hKmw7ZVswXT1jKmgsZVs0XT15LWYqdSxlWzhdPXAqdStkLGVbMV09dSxlWzVdPW8qaCxlWzldPS1hKmgsZVsyXT0tbCpoLGVbNl09ZCp1K3AsZVsxMF09Zi15KnV9ZWxzZSBpZih0Lm9yZGVyPT09IlhaWSIpe2NvbnN0IGY9bypjLGQ9bypsLHA9YSpjLHk9YSpsO2VbMF09YypoLGVbNF09LXUsZVs4XT1sKmgsZVsxXT1mKnUreSxlWzVdPW8qaCxlWzldPWQqdS1wLGVbMl09cCp1LWQsZVs2XT1hKmgsZVsxMF09eSp1K2Z9cmV0dXJuIGVbM109MCxlWzddPTAsZVsxMV09MCxlWzEyXT0wLGVbMTNdPTAsZVsxNF09MCxlWzE1XT0xLHRoaXN9bWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24odCl7cmV0dXJuIHRoaXMuY29tcG9zZShxZix0LFhmKX1sb29rQXQodCxlLG4pe2NvbnN0IHM9dGhpcy5lbGVtZW50cztyZXR1cm4gSHQuc3ViVmVjdG9ycyh0LGUpLEh0Lmxlbmd0aFNxKCk9PT0wJiYoSHQuej0xKSxIdC5ub3JtYWxpemUoKSxzbi5jcm9zc1ZlY3RvcnMobixIdCksc24ubGVuZ3RoU3EoKT09PTAmJihNYXRoLmFicyhuLnopPT09MT9IdC54Kz0xZS00Okh0LnorPTFlLTQsSHQubm9ybWFsaXplKCksc24uY3Jvc3NWZWN0b3JzKG4sSHQpKSxzbi5ub3JtYWxpemUoKSxTcy5jcm9zc1ZlY3RvcnMoSHQsc24pLHNbMF09c24ueCxzWzRdPVNzLngsc1s4XT1IdC54LHNbMV09c24ueSxzWzVdPVNzLnksc1s5XT1IdC55LHNbMl09c24ueixzWzZdPVNzLnosc1sxMF09SHQueix0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModGhpcyx0KX1wcmVtdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHQsdGhpcyl9bXVsdGlwbHlNYXRyaWNlcyh0LGUpe2NvbnN0IG49dC5lbGVtZW50cyxzPWUuZWxlbWVudHMscj10aGlzLmVsZW1lbnRzLG89blswXSxhPW5bNF0sYz1uWzhdLGw9blsxMl0saD1uWzFdLHU9bls1XSxmPW5bOV0sZD1uWzEzXSxwPW5bMl0seT1uWzZdLGc9blsxMF0sdz1uWzE0XSxiPW5bM10seD1uWzddLG09blsxMV0sTT1uWzE1XSxTPXNbMF0sQT1zWzRdLHY9c1s4XSxfPXNbMTJdLFQ9c1sxXSx6PXNbNV0sQz1zWzldLEU9c1sxM10sRj1zWzJdLEI9c1s2XSxJPXNbMTBdLFI9c1sxNF0sVj1zWzNdLFU9c1s3XSxLPXNbMTFdLGN0PXNbMTVdO3JldHVybiByWzBdPW8qUythKlQrYypGK2wqVixyWzRdPW8qQSthKnorYypCK2wqVSxyWzhdPW8qdithKkMrYypJK2wqSyxyWzEyXT1vKl8rYSpFK2MqUitsKmN0LHJbMV09aCpTK3UqVCtmKkYrZCpWLHJbNV09aCpBK3UqeitmKkIrZCpVLHJbOV09aCp2K3UqQytmKkkrZCpLLHJbMTNdPWgqXyt1KkUrZipSK2QqY3QsclsyXT1wKlMreSpUK2cqRit3KlYscls2XT1wKkEreSp6K2cqQit3KlUsclsxMF09cCp2K3kqQytnKkkrdypLLHJbMTRdPXAqXyt5KkUrZypSK3cqY3QsclszXT1iKlMreCpUK20qRitNKlYscls3XT1iKkEreCp6K20qQitNKlUsclsxMV09Yip2K3gqQyttKkkrTSpLLHJbMTVdPWIqXyt4KkUrbSpSK00qY3QsdGhpc31tdWx0aXBseVNjYWxhcih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIGVbMF0qPXQsZVs0XSo9dCxlWzhdKj10LGVbMTJdKj10LGVbMV0qPXQsZVs1XSo9dCxlWzldKj10LGVbMTNdKj10LGVbMl0qPXQsZVs2XSo9dCxlWzEwXSo9dCxlWzE0XSo9dCxlWzNdKj10LGVbN10qPXQsZVsxMV0qPXQsZVsxNV0qPXQsdGhpc31kZXRlcm1pbmFudCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzRdLHM9dFs4XSxyPXRbMTJdLG89dFsxXSxhPXRbNV0sYz10WzldLGw9dFsxM10saD10WzJdLHU9dFs2XSxmPXRbMTBdLGQ9dFsxNF0scD10WzNdLHk9dFs3XSxnPXRbMTFdLHc9dFsxNV0sYj1jKmQtbCpmLHg9YSpkLWwqdSxtPWEqZi1jKnUsTT1vKmQtbCpoLFM9bypmLWMqaCxBPW8qdS1hKmg7cmV0dXJuIGUqKHkqYi1nKngrdyptKS1uKihwKmItZypNK3cqUykrcyoocCp4LXkqTSt3KkEpLXIqKHAqbS15KlMrZypBKX10cmFuc3Bvc2UoKXtjb25zdCB0PXRoaXMuZWxlbWVudHM7bGV0IGU7cmV0dXJuIGU9dFsxXSx0WzFdPXRbNF0sdFs0XT1lLGU9dFsyXSx0WzJdPXRbOF0sdFs4XT1lLGU9dFs2XSx0WzZdPXRbOV0sdFs5XT1lLGU9dFszXSx0WzNdPXRbMTJdLHRbMTJdPWUsZT10WzddLHRbN109dFsxM10sdFsxM109ZSxlPXRbMTFdLHRbMTFdPXRbMTRdLHRbMTRdPWUsdGhpc31zZXRQb3NpdGlvbih0LGUsbil7Y29uc3Qgcz10aGlzLmVsZW1lbnRzO3JldHVybiB0LmlzVmVjdG9yMz8oc1sxMl09dC54LHNbMTNdPXQueSxzWzE0XT10LnopOihzWzEyXT10LHNbMTNdPWUsc1sxNF09biksdGhpc31pbnZlcnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFsxXSxzPXRbMl0scj10WzNdLG89dFs0XSxhPXRbNV0sYz10WzZdLGw9dFs3XSxoPXRbOF0sdT10WzldLGY9dFsxMF0sZD10WzExXSxwPXRbMTJdLHk9dFsxM10sZz10WzE0XSx3PXRbMTVdLGI9dSpnKmwteSpmKmwreSpjKmQtYSpnKmQtdSpjKncrYSpmKncseD1wKmYqbC1oKmcqbC1wKmMqZCtvKmcqZCtoKmMqdy1vKmYqdyxtPWgqeSpsLXAqdSpsK3AqYSpkLW8qeSpkLWgqYSp3K28qdSp3LE09cCp1KmMtaCp5KmMtcCphKmYrbyp5KmYraCphKmctbyp1KmcsUz1lKmIrbip4K3MqbStyKk07aWYoUz09PTApcmV0dXJuIHRoaXMuc2V0KDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDApO2NvbnN0IEE9MS9TO3JldHVybiB0WzBdPWIqQSx0WzFdPSh5KmYqci11Kmcqci15KnMqZCtuKmcqZCt1KnMqdy1uKmYqdykqQSx0WzJdPShhKmcqci15KmMqcit5KnMqbC1uKmcqbC1hKnMqdytuKmMqdykqQSx0WzNdPSh1KmMqci1hKmYqci11KnMqbCtuKmYqbCthKnMqZC1uKmMqZCkqQSx0WzRdPXgqQSx0WzVdPShoKmcqci1wKmYqcitwKnMqZC1lKmcqZC1oKnMqdytlKmYqdykqQSx0WzZdPShwKmMqci1vKmcqci1wKnMqbCtlKmcqbCtvKnMqdy1lKmMqdykqQSx0WzddPShvKmYqci1oKmMqcitoKnMqbC1lKmYqbC1vKnMqZCtlKmMqZCkqQSx0WzhdPW0qQSx0WzldPShwKnUqci1oKnkqci1wKm4qZCtlKnkqZCtoKm4qdy1lKnUqdykqQSx0WzEwXT0obyp5KnItcCphKnIrcCpuKmwtZSp5KmwtbypuKncrZSphKncpKkEsdFsxMV09KGgqYSpyLW8qdSpyLWgqbipsK2UqdSpsK28qbipkLWUqYSpkKSpBLHRbMTJdPU0qQSx0WzEzXT0oaCp5KnMtcCp1KnMrcCpuKmYtZSp5KmYtaCpuKmcrZSp1KmcpKkEsdFsxNF09KHAqYSpzLW8qeSpzLXAqbipjK2UqeSpjK28qbipnLWUqYSpnKSpBLHRbMTVdPShvKnUqcy1oKmEqcytoKm4qYy1lKnUqYy1vKm4qZitlKmEqZikqQSx0aGlzfXNjYWxlKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQueCxzPXQueSxyPXQuejtyZXR1cm4gZVswXSo9bixlWzRdKj1zLGVbOF0qPXIsZVsxXSo9bixlWzVdKj1zLGVbOV0qPXIsZVsyXSo9bixlWzZdKj1zLGVbMTBdKj1yLGVbM10qPW4sZVs3XSo9cyxlWzExXSo9cix0aGlzfWdldE1heFNjYWxlT25BeGlzKCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSp0WzBdK3RbMV0qdFsxXSt0WzJdKnRbMl0sbj10WzRdKnRbNF0rdFs1XSp0WzVdK3RbNl0qdFs2XSxzPXRbOF0qdFs4XSt0WzldKnRbOV0rdFsxMF0qdFsxMF07cmV0dXJuIE1hdGguc3FydChNYXRoLm1heChlLG4scykpfW1ha2VUcmFuc2xhdGlvbih0LGUsbil7cmV0dXJuIHQuaXNWZWN0b3IzP3RoaXMuc2V0KDEsMCwwLHQueCwwLDEsMCx0LnksMCwwLDEsdC56LDAsMCwwLDEpOnRoaXMuc2V0KDEsMCwwLHQsMCwxLDAsZSwwLDAsMSxuLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWCh0KXtjb25zdCBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KDEsMCwwLDAsMCxlLC1uLDAsMCxuLGUsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvblkodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldChlLDAsbiwwLDAsMSwwLDAsLW4sMCxlLDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25aKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoZSwtbiwwLDAsbixlLDAsMCwwLDAsMSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uQXhpcyh0LGUpe2NvbnN0IG49TWF0aC5jb3MoZSkscz1NYXRoLnNpbihlKSxyPTEtbixvPXQueCxhPXQueSxjPXQueixsPXIqbyxoPXIqYTtyZXR1cm4gdGhpcy5zZXQobCpvK24sbCphLXMqYyxsKmMrcyphLDAsbCphK3MqYyxoKmErbixoKmMtcypvLDAsbCpjLXMqYSxoKmMrcypvLHIqYypjK24sMCwwLDAsMCwxKSx0aGlzfW1ha2VTY2FsZSh0LGUsbil7cmV0dXJuIHRoaXMuc2V0KHQsMCwwLDAsMCxlLDAsMCwwLDAsbiwwLDAsMCwwLDEpLHRoaXN9bWFrZVNoZWFyKHQsZSxuLHMscixvKXtyZXR1cm4gdGhpcy5zZXQoMSxuLHIsMCx0LDEsbywwLGUscywxLDAsMCwwLDAsMSksdGhpc31jb21wb3NlKHQsZSxuKXtjb25zdCBzPXRoaXMuZWxlbWVudHMscj1lLl94LG89ZS5feSxhPWUuX3osYz1lLl93LGw9cityLGg9bytvLHU9YSthLGY9cipsLGQ9cipoLHA9cip1LHk9bypoLGc9byp1LHc9YSp1LGI9YypsLHg9YypoLG09Yyp1LE09bi54LFM9bi55LEE9bi56O3JldHVybiBzWzBdPSgxLSh5K3cpKSpNLHNbMV09KGQrbSkqTSxzWzJdPShwLXgpKk0sc1szXT0wLHNbNF09KGQtbSkqUyxzWzVdPSgxLShmK3cpKSpTLHNbNl09KGcrYikqUyxzWzddPTAsc1s4XT0ocCt4KSpBLHNbOV09KGctYikqQSxzWzEwXT0oMS0oZit5KSkqQSxzWzExXT0wLHNbMTJdPXQueCxzWzEzXT10Lnksc1sxNF09dC56LHNbMTVdPTEsdGhpc31kZWNvbXBvc2UodCxlLG4pe2NvbnN0IHM9dGhpcy5lbGVtZW50cztpZih0Lng9c1sxMl0sdC55PXNbMTNdLHQuej1zWzE0XSx0aGlzLmRldGVybWluYW50KCk9PT0wKXJldHVybiBuLnNldCgxLDEsMSksZS5pZGVudGl0eSgpLHRoaXM7bGV0IHI9V24uc2V0KHNbMF0sc1sxXSxzWzJdKS5sZW5ndGgoKTtjb25zdCBvPVduLnNldChzWzRdLHNbNV0sc1s2XSkubGVuZ3RoKCksYT1Xbi5zZXQoc1s4XSxzWzldLHNbMTBdKS5sZW5ndGgoKTt0aGlzLmRldGVybWluYW50KCk8MCYmKHI9LXIpLHllLmNvcHkodGhpcyk7Y29uc3QgbD0xL3IsaD0xL28sdT0xL2E7cmV0dXJuIHllLmVsZW1lbnRzWzBdKj1sLHllLmVsZW1lbnRzWzFdKj1sLHllLmVsZW1lbnRzWzJdKj1sLHllLmVsZW1lbnRzWzRdKj1oLHllLmVsZW1lbnRzWzVdKj1oLHllLmVsZW1lbnRzWzZdKj1oLHllLmVsZW1lbnRzWzhdKj11LHllLmVsZW1lbnRzWzldKj11LHllLmVsZW1lbnRzWzEwXSo9dSxlLnNldEZyb21Sb3RhdGlvbk1hdHJpeCh5ZSksbi54PXIsbi55PW8sbi56PWEsdGhpc31tYWtlUGVyc3BlY3RpdmUodCxlLG4scyxyLG8sYT0yZTMsYz0hMSl7Y29uc3QgbD10aGlzLmVsZW1lbnRzLGg9MipyLyhlLXQpLHU9MipyLyhuLXMpLGY9KGUrdCkvKGUtdCksZD0obitzKS8obi1zKTtsZXQgcCx5O2lmKGMpcD1yLyhvLXIpLHk9bypyLyhvLXIpO2Vsc2UgaWYoYT09PTJlMylwPS0obytyKS8oby1yKSx5PS0yKm8qci8oby1yKTtlbHNlIGlmKGE9PT0yMDAxKXA9LW8vKG8tcikseT0tbypyLyhvLXIpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5NYXRyaXg0Lm1ha2VQZXJzcGVjdGl2ZSgpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAiK2EpO3JldHVybiBsWzBdPWgsbFs0XT0wLGxbOF09ZixsWzEyXT0wLGxbMV09MCxsWzVdPXUsbFs5XT1kLGxbMTNdPTAsbFsyXT0wLGxbNl09MCxsWzEwXT1wLGxbMTRdPXksbFszXT0wLGxbN109MCxsWzExXT0tMSxsWzE1XT0wLHRoaXN9bWFrZU9ydGhvZ3JhcGhpYyh0LGUsbixzLHIsbyxhPTJlMyxjPSExKXtjb25zdCBsPXRoaXMuZWxlbWVudHMsaD0yLyhlLXQpLHU9Mi8obi1zKSxmPS0oZSt0KS8oZS10KSxkPS0obitzKS8obi1zKTtsZXQgcCx5O2lmKGMpcD0xLyhvLXIpLHk9by8oby1yKTtlbHNlIGlmKGE9PT0yZTMpcD0tMi8oby1yKSx5PS0obytyKS8oby1yKTtlbHNlIGlmKGE9PT0yMDAxKXA9LTEvKG8tcikseT0tci8oby1yKTtlbHNlIHRocm93IG5ldyBFcnJvcigiVEhSRUUuTWF0cml4NC5tYWtlT3J0aG9ncmFwaGljKCk6IEludmFsaWQgY29vcmRpbmF0ZSBzeXN0ZW06ICIrYSk7cmV0dXJuIGxbMF09aCxsWzRdPTAsbFs4XT0wLGxbMTJdPWYsbFsxXT0wLGxbNV09dSxsWzldPTAsbFsxM109ZCxsWzJdPTAsbFs2XT0wLGxbMTBdPXAsbFsxNF09eSxsWzNdPTAsbFs3XT0wLGxbMTFdPTAsbFsxNV09MSx0aGlzfWVxdWFscyh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO2ZvcihsZXQgcz0wO3M8MTY7cysrKWlmKGVbc10hPT1uW3NdKXJldHVybiExO3JldHVybiEwfWZyb21BcnJheSh0LGU9MCl7Zm9yKGxldCBuPTA7bjwxNjtuKyspdGhpcy5lbGVtZW50c1tuXT10W24rZV07cmV0dXJuIHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7Y29uc3Qgbj10aGlzLmVsZW1lbnRzO3JldHVybiB0W2VdPW5bMF0sdFtlKzFdPW5bMV0sdFtlKzJdPW5bMl0sdFtlKzNdPW5bM10sdFtlKzRdPW5bNF0sdFtlKzVdPW5bNV0sdFtlKzZdPW5bNl0sdFtlKzddPW5bN10sdFtlKzhdPW5bOF0sdFtlKzldPW5bOV0sdFtlKzEwXT1uWzEwXSx0W2UrMTFdPW5bMTFdLHRbZSsxMl09blsxMl0sdFtlKzEzXT1uWzEzXSx0W2UrMTRdPW5bMTRdLHRbZSsxNV09blsxNV0sdH19Y29uc3QgV249bmV3IFAseWU9bmV3IHN0LHFmPW5ldyBQKDAsMCwwKSxYZj1uZXcgUCgxLDEsMSksc249bmV3IFAsU3M9bmV3IFAsSHQ9bmV3IFAsR2M9bmV3IHN0LFdjPW5ldyBQaTtjbGFzcyBCaXtjb25zdHJ1Y3Rvcih0PTAsZT0wLG49MCxzPUJpLkRFRkFVTFRfT1JERVIpe3RoaXMuaXNFdWxlcj0hMCx0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl9vcmRlcj1zfWdldCB4KCl7cmV0dXJuIHRoaXMuX3h9c2V0IHgodCl7dGhpcy5feD10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeSgpe3JldHVybiB0aGlzLl95fXNldCB5KHQpe3RoaXMuX3k9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHooKXtyZXR1cm4gdGhpcy5fen1zZXQgeih0KXt0aGlzLl96PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCBvcmRlcigpe3JldHVybiB0aGlzLl9vcmRlcn1zZXQgb3JkZXIodCl7dGhpcy5fb3JkZXI9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9c2V0KHQsZSxuLHM9dGhpcy5fb3JkZXIpe3JldHVybiB0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl9vcmRlcj1zLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsdGhpcy5feSx0aGlzLl96LHRoaXMuX29yZGVyKX1jb3B5KHQpe3JldHVybiB0aGlzLl94PXQuX3gsdGhpcy5feT10Ll95LHRoaXMuX3o9dC5feix0aGlzLl9vcmRlcj10Ll9vcmRlcix0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUm90YXRpb25NYXRyaXgodCxlPXRoaXMuX29yZGVyLG49ITApe2NvbnN0IHM9dC5lbGVtZW50cyxyPXNbMF0sbz1zWzRdLGE9c1s4XSxjPXNbMV0sbD1zWzVdLGg9c1s5XSx1PXNbMl0sZj1zWzZdLGQ9c1sxMF07c3dpdGNoKGUpe2Nhc2UiWFlaIjp0aGlzLl95PU1hdGguYXNpbihaKGEsLTEsMSkpLE1hdGguYWJzKGEpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoLWgsZCksdGhpcy5fej1NYXRoLmF0YW4yKC1vLHIpKToodGhpcy5feD1NYXRoLmF0YW4yKGYsbCksdGhpcy5fej0wKTticmVhaztjYXNlIllYWiI6dGhpcy5feD1NYXRoLmFzaW4oLVooaCwtMSwxKSksTWF0aC5hYnMoaCk8Ljk5OTk5OTk/KHRoaXMuX3k9TWF0aC5hdGFuMihhLGQpLHRoaXMuX3o9TWF0aC5hdGFuMihjLGwpKToodGhpcy5feT1NYXRoLmF0YW4yKC11LHIpLHRoaXMuX3o9MCk7YnJlYWs7Y2FzZSJaWFkiOnRoaXMuX3g9TWF0aC5hc2luKFooZiwtMSwxKSksTWF0aC5hYnMoZik8Ljk5OTk5OTk/KHRoaXMuX3k9TWF0aC5hdGFuMigtdSxkKSx0aGlzLl96PU1hdGguYXRhbjIoLW8sbCkpOih0aGlzLl95PTAsdGhpcy5fej1NYXRoLmF0YW4yKGMscikpO2JyZWFrO2Nhc2UiWllYIjp0aGlzLl95PU1hdGguYXNpbigtWih1LC0xLDEpKSxNYXRoLmFicyh1KTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKGYsZCksdGhpcy5fej1NYXRoLmF0YW4yKGMscikpOih0aGlzLl94PTAsdGhpcy5fej1NYXRoLmF0YW4yKC1vLGwpKTticmVhaztjYXNlIllaWCI6dGhpcy5fej1NYXRoLmFzaW4oWihjLC0xLDEpKSxNYXRoLmFicyhjKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKC1oLGwpLHRoaXMuX3k9TWF0aC5hdGFuMigtdSxyKSk6KHRoaXMuX3g9MCx0aGlzLl95PU1hdGguYXRhbjIoYSxkKSk7YnJlYWs7Y2FzZSJYWlkiOnRoaXMuX3o9TWF0aC5hc2luKC1aKG8sLTEsMSkpLE1hdGguYWJzKG8pPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoZixsKSx0aGlzLl95PU1hdGguYXRhbjIoYSxyKSk6KHRoaXMuX3g9TWF0aC5hdGFuMigtaCxkKSx0aGlzLl95PTApO2JyZWFrO2RlZmF1bHQ6YnQoIkV1bGVyOiAuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCkgZW5jb3VudGVyZWQgYW4gdW5rbm93biBvcmRlcjogIitlKX1yZXR1cm4gdGhpcy5fb3JkZXI9ZSxuPT09ITAmJnRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21RdWF0ZXJuaW9uKHQsZSxuKXtyZXR1cm4gR2MubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24odCksdGhpcy5zZXRGcm9tUm90YXRpb25NYXRyaXgoR2MsZSxuKX1zZXRGcm9tVmVjdG9yMyh0LGU9dGhpcy5fb3JkZXIpe3JldHVybiB0aGlzLnNldCh0LngsdC55LHQueixlKX1yZW9yZGVyKHQpe3JldHVybiBXYy5zZXRGcm9tRXVsZXIodGhpcyksdGhpcy5zZXRGcm9tUXVhdGVybmlvbihXYyx0KX1lcXVhbHModCl7cmV0dXJuIHQuX3g9PT10aGlzLl94JiZ0Ll95PT09dGhpcy5feSYmdC5fej09PXRoaXMuX3omJnQuX29yZGVyPT09dGhpcy5fb3JkZXJ9ZnJvbUFycmF5KHQpe3JldHVybiB0aGlzLl94PXRbMF0sdGhpcy5feT10WzFdLHRoaXMuX3o9dFsyXSx0WzNdIT09dm9pZCAwJiYodGhpcy5fb3JkZXI9dFszXSksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy5feCx0W2UrMV09dGhpcy5feSx0W2UrMl09dGhpcy5feix0W2UrM109dGhpcy5fb3JkZXIsdH1fb25DaGFuZ2UodCl7cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2s9dCx0aGlzfV9vbkNoYW5nZUNhbGxiYWNrKCl7fSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMuX3gseWllbGQgdGhpcy5feSx5aWVsZCB0aGlzLl96LHlpZWxkIHRoaXMuX29yZGVyfX1CaS5ERUZBVUxUX09SREVSPSJYWVoiO2NsYXNzIFpme2NvbnN0cnVjdG9yKCl7dGhpcy5tYXNrPTF9c2V0KHQpe3RoaXMubWFzaz0oMTw8dHwwKT4+PjB9ZW5hYmxlKHQpe3RoaXMubWFza3w9MTw8dHwwfWVuYWJsZUFsbCgpe3RoaXMubWFzaz0tMX10b2dnbGUodCl7dGhpcy5tYXNrXj0xPDx0fDB9ZGlzYWJsZSh0KXt0aGlzLm1hc2smPX4oMTw8dHwwKX1kaXNhYmxlQWxsKCl7dGhpcy5tYXNrPTB9dGVzdCh0KXtyZXR1cm4odGhpcy5tYXNrJnQubWFzaykhPT0wfWlzRW5hYmxlZCh0KXtyZXR1cm4odGhpcy5tYXNrJigxPDx0fDApKSE9PTB9fWxldCBHZj0wO2NvbnN0IEhjPW5ldyBQLEhuPW5ldyBQaSxGZT1uZXcgc3QsdnM9bmV3IFAsRmk9bmV3IFAsV2Y9bmV3IFAsSGY9bmV3IFBpLEpjPW5ldyBQKDEsMCwwKSxZYz1uZXcgUCgwLDEsMCksamM9bmV3IFAoMCwwLDEpLFFjPXt0eXBlOiJhZGRlZCJ9LEpmPXt0eXBlOiJyZW1vdmVkIn0sSm49e3R5cGU6ImNoaWxkYWRkZWQiLGNoaWxkOm51bGx9LHZvPXt0eXBlOiJjaGlsZHJlbW92ZWQiLGNoaWxkOm51bGx9O2NsYXNzIEllIGV4dGVuZHMgZ3N7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNPYmplY3QzRD0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpHZisrfSksdGhpcy51dWlkPW1uKCksdGhpcy5uYW1lPSIiLHRoaXMudHlwZT0iT2JqZWN0M0QiLHRoaXMucGFyZW50PW51bGwsdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnVwPUllLkRFRkFVTFRfVVAuY2xvbmUoKTtjb25zdCB0PW5ldyBQLGU9bmV3IEJpLG49bmV3IFBpLHM9bmV3IFAoMSwxLDEpO2Z1bmN0aW9uIHIoKXtuLnNldEZyb21FdWxlcihlLCExKX1mdW5jdGlvbiBvKCl7ZS5zZXRGcm9tUXVhdGVybmlvbihuLHZvaWQgMCwhMSl9ZS5fb25DaGFuZ2Uociksbi5fb25DaGFuZ2UobyksT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7cG9zaXRpb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOnR9LHJvdGF0aW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTplfSxxdWF0ZXJuaW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpufSxzY2FsZTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6c30sbW9kZWxWaWV3TWF0cml4Ont2YWx1ZTpuZXcgc3R9LG5vcm1hbE1hdHJpeDp7dmFsdWU6bmV3IE1lfX0pLHRoaXMubWF0cml4PW5ldyBzdCx0aGlzLm1hdHJpeFdvcmxkPW5ldyBzdCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9SWUuREVGQVVMVF9NQVRSSVhfQVVUT19VUERBVEUsdGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9SWUuREVGQVVMVF9NQVRSSVhfV09STERfQVVUT19VUERBVEUsdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExLHRoaXMubGF5ZXJzPW5ldyBaZix0aGlzLnZpc2libGU9ITAsdGhpcy5jYXN0U2hhZG93PSExLHRoaXMucmVjZWl2ZVNoYWRvdz0hMSx0aGlzLmZydXN0dW1DdWxsZWQ9ITAsdGhpcy5yZW5kZXJPcmRlcj0wLHRoaXMuYW5pbWF0aW9ucz1bXSx0aGlzLmN1c3RvbURlcHRoTWF0ZXJpYWw9dm9pZCAwLHRoaXMuY3VzdG9tRGlzdGFuY2VNYXRlcmlhbD12b2lkIDAsdGhpcy51c2VyRGF0YT17fX1vbkJlZm9yZVNoYWRvdygpe31vbkFmdGVyU2hhZG93KCl7fW9uQmVmb3JlUmVuZGVyKCl7fW9uQWZ0ZXJSZW5kZXIoKXt9YXBwbHlNYXRyaXg0KHQpe3RoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSx0aGlzLm1hdHJpeC5wcmVtdWx0aXBseSh0KSx0aGlzLm1hdHJpeC5kZWNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSl9YXBwbHlRdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkodCksdGhpc31zZXRSb3RhdGlvbkZyb21BeGlzQW5nbGUodCxlKXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSh0LGUpfXNldFJvdGF0aW9uRnJvbUV1bGVyKHQpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tRXVsZXIodCwhMCl9c2V0Um90YXRpb25Gcm9tTWF0cml4KHQpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgodCl9c2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbih0KXt0aGlzLnF1YXRlcm5pb24uY29weSh0KX1yb3RhdGVPbkF4aXModCxlKXtyZXR1cm4gSG4uc2V0RnJvbUF4aXNBbmdsZSh0LGUpLHRoaXMucXVhdGVybmlvbi5tdWx0aXBseShIbiksdGhpc31yb3RhdGVPbldvcmxkQXhpcyh0LGUpe3JldHVybiBIbi5zZXRGcm9tQXhpc0FuZ2xlKHQsZSksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KEhuKSx0aGlzfXJvdGF0ZVgodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKEpjLHQpfXJvdGF0ZVkodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKFljLHQpfXJvdGF0ZVoodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKGpjLHQpfXRyYW5zbGF0ZU9uQXhpcyh0LGUpe3JldHVybiBIYy5jb3B5KHQpLmFwcGx5UXVhdGVybmlvbih0aGlzLnF1YXRlcm5pb24pLHRoaXMucG9zaXRpb24uYWRkKEhjLm11bHRpcGx5U2NhbGFyKGUpKSx0aGlzfXRyYW5zbGF0ZVgodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKEpjLHQpfXRyYW5zbGF0ZVkodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKFljLHQpfXRyYW5zbGF0ZVoodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKGpjLHQpfWxvY2FsVG9Xb3JsZCh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdC5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCl9d29ybGRUb0xvY2FsKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0LmFwcGx5TWF0cml4NChGZS5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpKX1sb29rQXQodCxlLG4pe3QuaXNWZWN0b3IzP3ZzLmNvcHkodCk6dnMuc2V0KHQsZSxuKTtjb25zdCBzPXRoaXMucGFyZW50O3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLEZpLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKSx0aGlzLmlzQ2FtZXJhfHx0aGlzLmlzTGlnaHQ/RmUubG9va0F0KEZpLHZzLHRoaXMudXApOkZlLmxvb2tBdCh2cyxGaSx0aGlzLnVwKSx0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KEZlKSxzJiYoRmUuZXh0cmFjdFJvdGF0aW9uKHMubWF0cml4V29ybGQpLEhuLnNldEZyb21Sb3RhdGlvbk1hdHJpeChGZSksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KEhuLmludmVydCgpKSl9YWRkKHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl7Zm9yKGxldCBlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0aGlzLmFkZChhcmd1bWVudHNbZV0pO3JldHVybiB0aGlzfXJldHVybiB0PT09dGhpcz8oeW4oIk9iamVjdDNELmFkZDogb2JqZWN0IGNhbid0IGJlIGFkZGVkIGFzIGEgY2hpbGQgb2YgaXRzZWxmLiIsdCksdGhpcyk6KHQmJnQuaXNPYmplY3QzRD8odC5yZW1vdmVGcm9tUGFyZW50KCksdC5wYXJlbnQ9dGhpcyx0aGlzLmNoaWxkcmVuLnB1c2godCksdC5kaXNwYXRjaEV2ZW50KFFjKSxKbi5jaGlsZD10LHRoaXMuZGlzcGF0Y2hFdmVudChKbiksSm4uY2hpbGQ9bnVsbCk6eW4oIk9iamVjdDNELmFkZDogb2JqZWN0IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5PYmplY3QzRC4iLHQpLHRoaXMpfXJlbW92ZSh0KXtpZihhcmd1bWVudHMubGVuZ3RoPjEpe2ZvcihsZXQgbj0wO248YXJndW1lbnRzLmxlbmd0aDtuKyspdGhpcy5yZW1vdmUoYXJndW1lbnRzW25dKTtyZXR1cm4gdGhpc31jb25zdCBlPXRoaXMuY2hpbGRyZW4uaW5kZXhPZih0KTtyZXR1cm4gZSE9PS0xJiYodC5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuLnNwbGljZShlLDEpLHQuZGlzcGF0Y2hFdmVudChKZiksdm8uY2hpbGQ9dCx0aGlzLmRpc3BhdGNoRXZlbnQodm8pLHZvLmNoaWxkPW51bGwpLHRoaXN9cmVtb3ZlRnJvbVBhcmVudCgpe2NvbnN0IHQ9dGhpcy5wYXJlbnQ7cmV0dXJuIHQhPT1udWxsJiZ0LnJlbW92ZSh0aGlzKSx0aGlzfWNsZWFyKCl7cmV0dXJuIHRoaXMucmVtb3ZlKC4uLnRoaXMuY2hpbGRyZW4pfWF0dGFjaCh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksRmUuY29weSh0aGlzLm1hdHJpeFdvcmxkKS5pbnZlcnQoKSx0LnBhcmVudCE9PW51bGwmJih0LnBhcmVudC51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksRmUubXVsdGlwbHkodC5wYXJlbnQubWF0cml4V29ybGQpKSx0LmFwcGx5TWF0cml4NChGZSksdC5yZW1vdmVGcm9tUGFyZW50KCksdC5wYXJlbnQ9dGhpcyx0aGlzLmNoaWxkcmVuLnB1c2godCksdC51cGRhdGVXb3JsZE1hdHJpeCghMSwhMCksdC5kaXNwYXRjaEV2ZW50KFFjKSxKbi5jaGlsZD10LHRoaXMuZGlzcGF0Y2hFdmVudChKbiksSm4uY2hpbGQ9bnVsbCx0aGlzfWdldE9iamVjdEJ5SWQodCl7cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgiaWQiLHQpfWdldE9iamVjdEJ5TmFtZSh0KXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJuYW1lIix0KX1nZXRPYmplY3RCeVByb3BlcnR5KHQsZSl7aWYodGhpc1t0XT09PWUpcmV0dXJuIHRoaXM7Zm9yKGxldCBuPTAscz10aGlzLmNoaWxkcmVuLmxlbmd0aDtuPHM7bisrKXtjb25zdCBvPXRoaXMuY2hpbGRyZW5bbl0uZ2V0T2JqZWN0QnlQcm9wZXJ0eSh0LGUpO2lmKG8hPT12b2lkIDApcmV0dXJuIG99fWdldE9iamVjdHNCeVByb3BlcnR5KHQsZSxuPVtdKXt0aGlzW3RdPT09ZSYmbi5wdXNoKHRoaXMpO2NvbnN0IHM9dGhpcy5jaGlsZHJlbjtmb3IobGV0IHI9MCxvPXMubGVuZ3RoO3I8bztyKyspc1tyXS5nZXRPYmplY3RzQnlQcm9wZXJ0eSh0LGUsbik7cmV0dXJuIG59Z2V0V29ybGRQb3NpdGlvbih0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCl9Z2V0V29ybGRRdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShGaSx0LFdmKSx0fWdldFdvcmxkU2NhbGUodCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKEZpLEhmLHQpLHR9Z2V0V29ybGREaXJlY3Rpb24odCl7dGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSk7Y29uc3QgZT10aGlzLm1hdHJpeFdvcmxkLmVsZW1lbnRzO3JldHVybiB0LnNldChlWzhdLGVbOV0sZVsxMF0pLm5vcm1hbGl6ZSgpfXJheWNhc3QoKXt9dHJhdmVyc2UodCl7dCh0aGlzKTtjb25zdCBlPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBuPTAscz1lLmxlbmd0aDtuPHM7bisrKWVbbl0udHJhdmVyc2UodCl9dHJhdmVyc2VWaXNpYmxlKHQpe2lmKHRoaXMudmlzaWJsZT09PSExKXJldHVybjt0KHRoaXMpO2NvbnN0IGU9dGhpcy5jaGlsZHJlbjtmb3IobGV0IG49MCxzPWUubGVuZ3RoO248cztuKyspZVtuXS50cmF2ZXJzZVZpc2libGUodCl9dHJhdmVyc2VBbmNlc3RvcnModCl7Y29uc3QgZT10aGlzLnBhcmVudDtlIT09bnVsbCYmKHQoZSksZS50cmF2ZXJzZUFuY2VzdG9ycyh0KSl9dXBkYXRlTWF0cml4KCl7dGhpcy5tYXRyaXguY29tcG9zZSh0aGlzLnBvc2l0aW9uLHRoaXMucXVhdGVybmlvbix0aGlzLnNjYWxlKSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9dXBkYXRlTWF0cml4V29ybGQodCl7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpLCh0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGV8fHQpJiYodGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9PT0hMCYmKHRoaXMucGFyZW50PT09bnVsbD90aGlzLm1hdHJpeFdvcmxkLmNvcHkodGhpcy5tYXRyaXgpOnRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyh0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeCkpLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMSx0PSEwKTtjb25zdCBlPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBuPTAscz1lLmxlbmd0aDtuPHM7bisrKWVbbl0udXBkYXRlTWF0cml4V29ybGQodCl9dXBkYXRlV29ybGRNYXRyaXgodCxlKXtjb25zdCBuPXRoaXMucGFyZW50O2lmKHQ9PT0hMCYmbiE9PW51bGwmJm4udXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSx0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT09PSEwJiYodGhpcy5wYXJlbnQ9PT1udWxsP3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KSksZT09PSEwKXtjb25zdCBzPXRoaXMuY2hpbGRyZW47Zm9yKGxldCByPTAsbz1zLmxlbmd0aDtyPG87cisrKXNbcl0udXBkYXRlV29ybGRNYXRyaXgoITEsITApfX10b0pTT04odCl7Y29uc3QgZT10PT09dm9pZCAwfHx0eXBlb2YgdD09InN0cmluZyIsbj17fTtlJiYodD17Z2VvbWV0cmllczp7fSxtYXRlcmlhbHM6e30sdGV4dHVyZXM6e30saW1hZ2VzOnt9LHNoYXBlczp7fSxza2VsZXRvbnM6e30sYW5pbWF0aW9uczp7fSxub2Rlczp7fX0sbi5tZXRhZGF0YT17dmVyc2lvbjo0LjcsdHlwZToiT2JqZWN0IixnZW5lcmF0b3I6Ik9iamVjdDNELnRvSlNPTiJ9KTtjb25zdCBzPXt9O3MudXVpZD10aGlzLnV1aWQscy50eXBlPXRoaXMudHlwZSx0aGlzLm5hbWUhPT0iIiYmKHMubmFtZT10aGlzLm5hbWUpLHRoaXMuY2FzdFNoYWRvdz09PSEwJiYocy5jYXN0U2hhZG93PSEwKSx0aGlzLnJlY2VpdmVTaGFkb3c9PT0hMCYmKHMucmVjZWl2ZVNoYWRvdz0hMCksdGhpcy52aXNpYmxlPT09ITEmJihzLnZpc2libGU9ITEpLHRoaXMuZnJ1c3R1bUN1bGxlZD09PSExJiYocy5mcnVzdHVtQ3VsbGVkPSExKSx0aGlzLnJlbmRlck9yZGVyIT09MCYmKHMucmVuZGVyT3JkZXI9dGhpcy5yZW5kZXJPcmRlciksT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJihzLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLHMubGF5ZXJzPXRoaXMubGF5ZXJzLm1hc2sscy5tYXRyaXg9dGhpcy5tYXRyaXgudG9BcnJheSgpLHMudXA9dGhpcy51cC50b0FycmF5KCksdGhpcy5tYXRyaXhBdXRvVXBkYXRlPT09ITEmJihzLm1hdHJpeEF1dG9VcGRhdGU9ITEpLHRoaXMuaXNJbnN0YW5jZWRNZXNoJiYocy50eXBlPSJJbnN0YW5jZWRNZXNoIixzLmNvdW50PXRoaXMuY291bnQscy5pbnN0YW5jZU1hdHJpeD10aGlzLmluc3RhbmNlTWF0cml4LnRvSlNPTigpLHRoaXMuaW5zdGFuY2VDb2xvciE9PW51bGwmJihzLmluc3RhbmNlQ29sb3I9dGhpcy5pbnN0YW5jZUNvbG9yLnRvSlNPTigpKSksdGhpcy5pc0JhdGNoZWRNZXNoJiYocy50eXBlPSJCYXRjaGVkTWVzaCIscy5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkPXRoaXMucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZCxzLnNvcnRPYmplY3RzPXRoaXMuc29ydE9iamVjdHMscy5kcmF3UmFuZ2VzPXRoaXMuX2RyYXdSYW5nZXMscy5yZXNlcnZlZFJhbmdlcz10aGlzLl9yZXNlcnZlZFJhbmdlcyxzLmdlb21ldHJ5SW5mbz10aGlzLl9nZW9tZXRyeUluZm8ubWFwKGE9PktlKFV0KHt9LGEpLHtib3VuZGluZ0JveDphLmJvdW5kaW5nQm94P2EuYm91bmRpbmdCb3gudG9KU09OKCk6dm9pZCAwLGJvdW5kaW5nU3BoZXJlOmEuYm91bmRpbmdTcGhlcmU/YS5ib3VuZGluZ1NwaGVyZS50b0pTT04oKTp2b2lkIDB9KSkscy5pbnN0YW5jZUluZm89dGhpcy5faW5zdGFuY2VJbmZvLm1hcChhPT5VdCh7fSxhKSkscy5hdmFpbGFibGVJbnN0YW5jZUlkcz10aGlzLl9hdmFpbGFibGVJbnN0YW5jZUlkcy5zbGljZSgpLHMuYXZhaWxhYmxlR2VvbWV0cnlJZHM9dGhpcy5fYXZhaWxhYmxlR2VvbWV0cnlJZHMuc2xpY2UoKSxzLm5leHRJbmRleFN0YXJ0PXRoaXMuX25leHRJbmRleFN0YXJ0LHMubmV4dFZlcnRleFN0YXJ0PXRoaXMuX25leHRWZXJ0ZXhTdGFydCxzLmdlb21ldHJ5Q291bnQ9dGhpcy5fZ2VvbWV0cnlDb3VudCxzLm1heEluc3RhbmNlQ291bnQ9dGhpcy5fbWF4SW5zdGFuY2VDb3VudCxzLm1heFZlcnRleENvdW50PXRoaXMuX21heFZlcnRleENvdW50LHMubWF4SW5kZXhDb3VudD10aGlzLl9tYXhJbmRleENvdW50LHMuZ2VvbWV0cnlJbml0aWFsaXplZD10aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkLHMubWF0cmljZXNUZXh0dXJlPXRoaXMuX21hdHJpY2VzVGV4dHVyZS50b0pTT04odCkscy5pbmRpcmVjdFRleHR1cmU9dGhpcy5faW5kaXJlY3RUZXh0dXJlLnRvSlNPTih0KSx0aGlzLl9jb2xvcnNUZXh0dXJlIT09bnVsbCYmKHMuY29sb3JzVGV4dHVyZT10aGlzLl9jb2xvcnNUZXh0dXJlLnRvSlNPTih0KSksdGhpcy5ib3VuZGluZ1NwaGVyZSE9PW51bGwmJihzLmJvdW5kaW5nU3BoZXJlPXRoaXMuYm91bmRpbmdTcGhlcmUudG9KU09OKCkpLHRoaXMuYm91bmRpbmdCb3ghPT1udWxsJiYocy5ib3VuZGluZ0JveD10aGlzLmJvdW5kaW5nQm94LnRvSlNPTigpKSk7ZnVuY3Rpb24gcihhLGMpe3JldHVybiBhW2MudXVpZF09PT12b2lkIDAmJihhW2MudXVpZF09Yy50b0pTT04odCkpLGMudXVpZH1pZih0aGlzLmlzU2NlbmUpdGhpcy5iYWNrZ3JvdW5kJiYodGhpcy5iYWNrZ3JvdW5kLmlzQ29sb3I/cy5iYWNrZ3JvdW5kPXRoaXMuYmFja2dyb3VuZC50b0pTT04oKTp0aGlzLmJhY2tncm91bmQuaXNUZXh0dXJlJiYocy5iYWNrZ3JvdW5kPXRoaXMuYmFja2dyb3VuZC50b0pTT04odCkudXVpZCkpLHRoaXMuZW52aXJvbm1lbnQmJnRoaXMuZW52aXJvbm1lbnQuaXNUZXh0dXJlJiZ0aGlzLmVudmlyb25tZW50LmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSE9PSEwJiYocy5lbnZpcm9ubWVudD10aGlzLmVudmlyb25tZW50LnRvSlNPTih0KS51dWlkKTtlbHNlIGlmKHRoaXMuaXNNZXNofHx0aGlzLmlzTGluZXx8dGhpcy5pc1BvaW50cyl7cy5nZW9tZXRyeT1yKHQuZ2VvbWV0cmllcyx0aGlzLmdlb21ldHJ5KTtjb25zdCBhPXRoaXMuZ2VvbWV0cnkucGFyYW1ldGVycztpZihhIT09dm9pZCAwJiZhLnNoYXBlcyE9PXZvaWQgMCl7Y29uc3QgYz1hLnNoYXBlcztpZihBcnJheS5pc0FycmF5KGMpKWZvcihsZXQgbD0wLGg9Yy5sZW5ndGg7bDxoO2wrKyl7Y29uc3QgdT1jW2xdO3IodC5zaGFwZXMsdSl9ZWxzZSByKHQuc2hhcGVzLGMpfX1pZih0aGlzLmlzU2tpbm5lZE1lc2gmJihzLmJpbmRNb2RlPXRoaXMuYmluZE1vZGUscy5iaW5kTWF0cml4PXRoaXMuYmluZE1hdHJpeC50b0FycmF5KCksdGhpcy5za2VsZXRvbiE9PXZvaWQgMCYmKHIodC5za2VsZXRvbnMsdGhpcy5za2VsZXRvbikscy5za2VsZXRvbj10aGlzLnNrZWxldG9uLnV1aWQpKSx0aGlzLm1hdGVyaWFsIT09dm9pZCAwKWlmKEFycmF5LmlzQXJyYXkodGhpcy5tYXRlcmlhbCkpe2NvbnN0IGE9W107Zm9yKGxldCBjPTAsbD10aGlzLm1hdGVyaWFsLmxlbmd0aDtjPGw7YysrKWEucHVzaChyKHQubWF0ZXJpYWxzLHRoaXMubWF0ZXJpYWxbY10pKTtzLm1hdGVyaWFsPWF9ZWxzZSBzLm1hdGVyaWFsPXIodC5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbCk7aWYodGhpcy5jaGlsZHJlbi5sZW5ndGg+MCl7cy5jaGlsZHJlbj1bXTtmb3IobGV0IGE9MDthPHRoaXMuY2hpbGRyZW4ubGVuZ3RoO2ErKylzLmNoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlblthXS50b0pTT04odCkub2JqZWN0KX1pZih0aGlzLmFuaW1hdGlvbnMubGVuZ3RoPjApe3MuYW5pbWF0aW9ucz1bXTtmb3IobGV0IGE9MDthPHRoaXMuYW5pbWF0aW9ucy5sZW5ndGg7YSsrKXtjb25zdCBjPXRoaXMuYW5pbWF0aW9uc1thXTtzLmFuaW1hdGlvbnMucHVzaChyKHQuYW5pbWF0aW9ucyxjKSl9fWlmKGUpe2NvbnN0IGE9byh0Lmdlb21ldHJpZXMpLGM9byh0Lm1hdGVyaWFscyksbD1vKHQudGV4dHVyZXMpLGg9byh0LmltYWdlcyksdT1vKHQuc2hhcGVzKSxmPW8odC5za2VsZXRvbnMpLGQ9byh0LmFuaW1hdGlvbnMpLHA9byh0Lm5vZGVzKTthLmxlbmd0aD4wJiYobi5nZW9tZXRyaWVzPWEpLGMubGVuZ3RoPjAmJihuLm1hdGVyaWFscz1jKSxsLmxlbmd0aD4wJiYobi50ZXh0dXJlcz1sKSxoLmxlbmd0aD4wJiYobi5pbWFnZXM9aCksdS5sZW5ndGg+MCYmKG4uc2hhcGVzPXUpLGYubGVuZ3RoPjAmJihuLnNrZWxldG9ucz1mKSxkLmxlbmd0aD4wJiYobi5hbmltYXRpb25zPWQpLHAubGVuZ3RoPjAmJihuLm5vZGVzPXApfXJldHVybiBuLm9iamVjdD1zLG47ZnVuY3Rpb24gbyhhKXtjb25zdCBjPVtdO2Zvcihjb25zdCBsIGluIGEpe2NvbnN0IGg9YVtsXTtkZWxldGUgaC5tZXRhZGF0YSxjLnB1c2goaCl9cmV0dXJuIGN9fWNsb25lKHQpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyx0KX1jb3B5KHQsZT0hMCl7aWYodGhpcy5uYW1lPXQubmFtZSx0aGlzLnVwLmNvcHkodC51cCksdGhpcy5wb3NpdGlvbi5jb3B5KHQucG9zaXRpb24pLHRoaXMucm90YXRpb24ub3JkZXI9dC5yb3RhdGlvbi5vcmRlcix0aGlzLnF1YXRlcm5pb24uY29weSh0LnF1YXRlcm5pb24pLHRoaXMuc2NhbGUuY29weSh0LnNjYWxlKSx0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSx0aGlzLm1hdHJpeFdvcmxkLmNvcHkodC5tYXRyaXhXb3JsZCksdGhpcy5tYXRyaXhBdXRvVXBkYXRlPXQubWF0cml4QXV0b1VwZGF0ZSx0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT10Lm1hdHJpeFdvcmxkQXV0b1VwZGF0ZSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9dC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlLHRoaXMubGF5ZXJzLm1hc2s9dC5sYXllcnMubWFzayx0aGlzLnZpc2libGU9dC52aXNpYmxlLHRoaXMuY2FzdFNoYWRvdz10LmNhc3RTaGFkb3csdGhpcy5yZWNlaXZlU2hhZG93PXQucmVjZWl2ZVNoYWRvdyx0aGlzLmZydXN0dW1DdWxsZWQ9dC5mcnVzdHVtQ3VsbGVkLHRoaXMucmVuZGVyT3JkZXI9dC5yZW5kZXJPcmRlcix0aGlzLmFuaW1hdGlvbnM9dC5hbmltYXRpb25zLnNsaWNlKCksdGhpcy51c2VyRGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHQudXNlckRhdGEpKSxlPT09ITApZm9yKGxldCBuPTA7bjx0LmNoaWxkcmVuLmxlbmd0aDtuKyspe2NvbnN0IHM9dC5jaGlsZHJlbltuXTt0aGlzLmFkZChzLmNsb25lKCkpfXJldHVybiB0aGlzfX1JZS5ERUZBVUxUX1VQPW5ldyBQKDAsMSwwKSxJZS5ERUZBVUxUX01BVFJJWF9BVVRPX1VQREFURT0hMCxJZS5ERUZBVUxUX01BVFJJWF9XT1JMRF9BVVRPX1VQREFURT0hMDtjb25zdCBtZT1uZXcgUCxrZT1uZXcgUCxfbz1uZXcgUCxOZT1uZXcgUCxZbj1uZXcgUCxqbj1uZXcgUCxLYz1uZXcgUCx6bz1uZXcgUCxUbz1uZXcgUCxQbz1uZXcgUCxDbz1uZXcgaWUsRW89bmV3IGllLEJvPW5ldyBpZTtjbGFzcyBldHtjb25zdHJ1Y3Rvcih0PW5ldyBQLGU9bmV3IFAsbj1uZXcgUCl7dGhpcy5hPXQsdGhpcy5iPWUsdGhpcy5jPW59c3RhdGljIGdldE5vcm1hbCh0LGUsbixzKXtzLnN1YlZlY3RvcnMobixlKSxtZS5zdWJWZWN0b3JzKHQsZSkscy5jcm9zcyhtZSk7Y29uc3Qgcj1zLmxlbmd0aFNxKCk7cmV0dXJuIHI+MD9zLm11bHRpcGx5U2NhbGFyKDEvTWF0aC5zcXJ0KHIpKTpzLnNldCgwLDAsMCl9c3RhdGljIGdldEJhcnljb29yZCh0LGUsbixzLHIpe21lLnN1YlZlY3RvcnMocyxlKSxrZS5zdWJWZWN0b3JzKG4sZSksX28uc3ViVmVjdG9ycyh0LGUpO2NvbnN0IG89bWUuZG90KG1lKSxhPW1lLmRvdChrZSksYz1tZS5kb3QoX28pLGw9a2UuZG90KGtlKSxoPWtlLmRvdChfbyksdT1vKmwtYSphO2lmKHU9PT0wKXJldHVybiByLnNldCgwLDAsMCksbnVsbDtjb25zdCBmPTEvdSxkPShsKmMtYSpoKSpmLHA9KG8qaC1hKmMpKmY7cmV0dXJuIHIuc2V0KDEtZC1wLHAsZCl9c3RhdGljIGNvbnRhaW5zUG9pbnQodCxlLG4scyl7cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKHQsZSxuLHMsTmUpPT09bnVsbD8hMTpOZS54Pj0wJiZOZS55Pj0wJiZOZS54K05lLnk8PTF9c3RhdGljIGdldEludGVycG9sYXRpb24odCxlLG4scyxyLG8sYSxjKXtyZXR1cm4gdGhpcy5nZXRCYXJ5Y29vcmQodCxlLG4scyxOZSk9PT1udWxsPyhjLng9MCxjLnk9MCwieiJpbiBjJiYoYy56PTApLCJ3ImluIGMmJihjLnc9MCksbnVsbCk6KGMuc2V0U2NhbGFyKDApLGMuYWRkU2NhbGVkVmVjdG9yKHIsTmUueCksYy5hZGRTY2FsZWRWZWN0b3IobyxOZS55KSxjLmFkZFNjYWxlZFZlY3RvcihhLE5lLnopLGMpfXN0YXRpYyBnZXRJbnRlcnBvbGF0ZWRBdHRyaWJ1dGUodCxlLG4scyxyLG8pe3JldHVybiBDby5zZXRTY2FsYXIoMCksRW8uc2V0U2NhbGFyKDApLEJvLnNldFNjYWxhcigwKSxDby5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSksRW8uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LG4pLEJvLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxzKSxvLnNldFNjYWxhcigwKSxvLmFkZFNjYWxlZFZlY3RvcihDbyxyLngpLG8uYWRkU2NhbGVkVmVjdG9yKEVvLHIueSksby5hZGRTY2FsZWRWZWN0b3IoQm8sci56KSxvfXN0YXRpYyBpc0Zyb250RmFjaW5nKHQsZSxuLHMpe3JldHVybiBtZS5zdWJWZWN0b3JzKG4sZSksa2Uuc3ViVmVjdG9ycyh0LGUpLG1lLmNyb3NzKGtlKS5kb3Qocyk8MH1zZXQodCxlLG4pe3JldHVybiB0aGlzLmEuY29weSh0KSx0aGlzLmIuY29weShlKSx0aGlzLmMuY29weShuKSx0aGlzfXNldEZyb21Qb2ludHNBbmRJbmRpY2VzKHQsZSxuLHMpe3JldHVybiB0aGlzLmEuY29weSh0W2VdKSx0aGlzLmIuY29weSh0W25dKSx0aGlzLmMuY29weSh0W3NdKSx0aGlzfXNldEZyb21BdHRyaWJ1dGVBbmRJbmRpY2VzKHQsZSxuLHMpe3JldHVybiB0aGlzLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpLHRoaXMuYi5mcm9tQnVmZmVyQXR0cmlidXRlKHQsbiksdGhpcy5jLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxzKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLmEuY29weSh0LmEpLHRoaXMuYi5jb3B5KHQuYiksdGhpcy5jLmNvcHkodC5jKSx0aGlzfWdldEFyZWEoKXtyZXR1cm4gbWUuc3ViVmVjdG9ycyh0aGlzLmMsdGhpcy5iKSxrZS5zdWJWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLG1lLmNyb3NzKGtlKS5sZW5ndGgoKSouNX1nZXRNaWRwb2ludCh0KXtyZXR1cm4gdC5hZGRWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLmFkZCh0aGlzLmMpLm11bHRpcGx5U2NhbGFyKDEvMyl9Z2V0Tm9ybWFsKHQpe3JldHVybiBldC5nZXROb3JtYWwodGhpcy5hLHRoaXMuYix0aGlzLmMsdCl9Z2V0UGxhbmUodCl7cmV0dXJuIHQuc2V0RnJvbUNvcGxhbmFyUG9pbnRzKHRoaXMuYSx0aGlzLmIsdGhpcy5jKX1nZXRCYXJ5Y29vcmQodCxlKXtyZXR1cm4gZXQuZ2V0QmFyeWNvb3JkKHQsdGhpcy5hLHRoaXMuYix0aGlzLmMsZSl9Z2V0SW50ZXJwb2xhdGlvbih0LGUsbixzLHIpe3JldHVybiBldC5nZXRJbnRlcnBvbGF0aW9uKHQsdGhpcy5hLHRoaXMuYix0aGlzLmMsZSxuLHMscil9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gZXQuY29udGFpbnNQb2ludCh0LHRoaXMuYSx0aGlzLmIsdGhpcy5jKX1pc0Zyb250RmFjaW5nKHQpe3JldHVybiBldC5pc0Zyb250RmFjaW5nKHRoaXMuYSx0aGlzLmIsdGhpcy5jLHQpfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQuaW50ZXJzZWN0c1RyaWFuZ2xlKHRoaXMpfWNsb3Nlc3RQb2ludFRvUG9pbnQodCxlKXtjb25zdCBuPXRoaXMuYSxzPXRoaXMuYixyPXRoaXMuYztsZXQgbyxhO1luLnN1YlZlY3RvcnMocyxuKSxqbi5zdWJWZWN0b3JzKHIsbiksem8uc3ViVmVjdG9ycyh0LG4pO2NvbnN0IGM9WW4uZG90KHpvKSxsPWpuLmRvdCh6byk7aWYoYzw9MCYmbDw9MClyZXR1cm4gZS5jb3B5KG4pO1RvLnN1YlZlY3RvcnModCxzKTtjb25zdCBoPVluLmRvdChUbyksdT1qbi5kb3QoVG8pO2lmKGg+PTAmJnU8PWgpcmV0dXJuIGUuY29weShzKTtjb25zdCBmPWMqdS1oKmw7aWYoZjw9MCYmYz49MCYmaDw9MClyZXR1cm4gbz1jLyhjLWgpLGUuY29weShuKS5hZGRTY2FsZWRWZWN0b3IoWW4sbyk7UG8uc3ViVmVjdG9ycyh0LHIpO2NvbnN0IGQ9WW4uZG90KFBvKSxwPWpuLmRvdChQbyk7aWYocD49MCYmZDw9cClyZXR1cm4gZS5jb3B5KHIpO2NvbnN0IHk9ZCpsLWMqcDtpZih5PD0wJiZsPj0wJiZwPD0wKXJldHVybiBhPWwvKGwtcCksZS5jb3B5KG4pLmFkZFNjYWxlZFZlY3RvcihqbixhKTtjb25zdCBnPWgqcC1kKnU7aWYoZzw9MCYmdS1oPj0wJiZkLXA+PTApcmV0dXJuIEtjLnN1YlZlY3RvcnMocixzKSxhPSh1LWgpLyh1LWgrKGQtcCkpLGUuY29weShzKS5hZGRTY2FsZWRWZWN0b3IoS2MsYSk7Y29uc3Qgdz0xLyhnK3krZik7cmV0dXJuIG89eSp3LGE9Zip3LGUuY29weShuKS5hZGRTY2FsZWRWZWN0b3IoWW4sbykuYWRkU2NhbGVkVmVjdG9yKGpuLGEpfWVxdWFscyh0KXtyZXR1cm4gdC5hLmVxdWFscyh0aGlzLmEpJiZ0LmIuZXF1YWxzKHRoaXMuYikmJnQuYy5lcXVhbHModGhpcy5jKX19Y29uc3QgdGw9e2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LGRhcmtzbGF0ZWdyZXk6MzEwMDQ5NSxkYXJrdHVycXVvaXNlOjUyOTQ1LGRhcmt2aW9sZXQ6OTY5OTUzOSxkZWVwcGluazoxNjcxNjk0NyxkZWVwc2t5Ymx1ZTo0OTE1MSxkaW1ncmF5OjY5MDgyNjUsZGltZ3JleTo2OTA4MjY1LGRvZGdlcmJsdWU6MjAwMzE5OSxmaXJlYnJpY2s6MTE2NzQxNDYsZmxvcmFsd2hpdGU6MTY3NzU5MjAsZm9yZXN0Z3JlZW46MjI2Mzg0MixmdWNoc2lhOjE2NzExOTM1LGdhaW5zYm9ybzoxNDQ3NDQ2MCxnaG9zdHdoaXRlOjE2MzE2NjcxLGdvbGQ6MTY3NjY3MjAsZ29sZGVucm9kOjE0MzI5MTIwLGdyYXk6ODQyMTUwNCxncmVlbjozMjc2OCxncmVlbnllbGxvdzoxMTQwMzA1NSxncmV5Ojg0MjE1MDQsaG9uZXlkZXc6MTU3OTQxNjAsaG90cGluazoxNjczODc0MCxpbmRpYW5yZWQ6MTM0NTg1MjQsaW5kaWdvOjQ5MTUzMzAsaXZvcnk6MTY3NzcyMDAsa2hha2k6MTU3ODc2NjAsbGF2ZW5kZXI6MTUxMzI0MTAsbGF2ZW5kZXJibHVzaDoxNjc3MzM2NSxsYXduZ3JlZW46ODE5MDk3NixsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LHJlYmVjY2FwdXJwbGU6NjY5Nzg4MSxyZWQ6MTY3MTE2ODAscm9zeWJyb3duOjEyMzU3NTE5LHJveWFsYmx1ZTo0Mjg2OTQ1LHNhZGRsZWJyb3duOjkxMjcxODcsc2FsbW9uOjE2NDE2ODgyLHNhbmR5YnJvd246MTYwMzI4NjQsc2VhZ3JlZW46MzA1MDMyNyxzZWFzaGVsbDoxNjc3NDYzOCxzaWVubmE6MTA1MDY3OTcsc2lsdmVyOjEyNjMyMjU2LHNreWJsdWU6ODkwMDMzMSxzbGF0ZWJsdWU6Njk3MDA2MSxzbGF0ZWdyYXk6NzM3Mjk0NCxzbGF0ZWdyZXk6NzM3Mjk0NCxzbm93OjE2Nzc1OTMwLHNwcmluZ2dyZWVuOjY1NDA3LHN0ZWVsYmx1ZTo0NjIwOTgwLHRhbjoxMzgwODc4MCx0ZWFsOjMyODk2LHRoaXN0bGU6MTQyMDQ4ODgsdG9tYXRvOjE2NzM3MDk1LHR1cnF1b2lzZTo0MjUxODU2LHZpb2xldDoxNTYzMTA4Nix3aGVhdDoxNjExMzMzMSx3aGl0ZToxNjc3NzIxNSx3aGl0ZXNtb2tlOjE2MTE5Mjg1LHllbGxvdzoxNjc3Njk2MCx5ZWxsb3dncmVlbjoxMDE0NTA3NH0scm49e2g6MCxzOjAsbDowfSxfcz17aDowLHM6MCxsOjB9O2Z1bmN0aW9uIEZvKGksdCxlKXtyZXR1cm4gZTwwJiYoZSs9MSksZT4xJiYoZS09MSksZTwxLzY/aSsodC1pKSo2KmU6ZTwxLzI/dDplPDIvMz9pKyh0LWkpKjYqKDIvMy1lKTppfWxldCB6cz1jbGFzc3tjb25zdHJ1Y3Rvcih0LGUsbil7cmV0dXJuIHRoaXMuaXNDb2xvcj0hMCx0aGlzLnI9MSx0aGlzLmc9MSx0aGlzLmI9MSx0aGlzLnNldCh0LGUsbil9c2V0KHQsZSxuKXtpZihlPT09dm9pZCAwJiZuPT09dm9pZCAwKXtjb25zdCBzPXQ7cyYmcy5pc0NvbG9yP3RoaXMuY29weShzKTp0eXBlb2Ygcz09Im51bWJlciI/dGhpcy5zZXRIZXgocyk6dHlwZW9mIHM9PSJzdHJpbmciJiZ0aGlzLnNldFN0eWxlKHMpfWVsc2UgdGhpcy5zZXRSR0IodCxlLG4pO3JldHVybiB0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy5yPXQsdGhpcy5nPXQsdGhpcy5iPXQsdGhpc31zZXRIZXgodCxlPWZlKXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLHRoaXMucj0odD4+MTYmMjU1KS8yNTUsdGhpcy5nPSh0Pj44JjI1NSkvMjU1LHRoaXMuYj0odCYyNTUpLzI1NSxkZS5jb2xvclNwYWNlVG9Xb3JraW5nKHRoaXMsZSksdGhpc31zZXRSR0IodCxlLG4scz1kZS53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIHRoaXMucj10LHRoaXMuZz1lLHRoaXMuYj1uLGRlLmNvbG9yU3BhY2VUb1dvcmtpbmcodGhpcyxzKSx0aGlzfXNldEhTTCh0LGUsbixzPWRlLndvcmtpbmdDb2xvclNwYWNlKXtpZih0PWZvKHQsMSksZT1aKGUsMCwxKSxuPVoobiwwLDEpLGU9PT0wKXRoaXMucj10aGlzLmc9dGhpcy5iPW47ZWxzZXtjb25zdCByPW48PS41P24qKDErZSk6bitlLW4qZSxvPTIqbi1yO3RoaXMucj1GbyhvLHIsdCsxLzMpLHRoaXMuZz1GbyhvLHIsdCksdGhpcy5iPUZvKG8scix0LTEvMyl9cmV0dXJuIGRlLmNvbG9yU3BhY2VUb1dvcmtpbmcodGhpcyxzKSx0aGlzfXNldFN0eWxlKHQsZT1mZSl7ZnVuY3Rpb24gbihyKXtyIT09dm9pZCAwJiZwYXJzZUZsb2F0KHIpPDEmJmJ0KCJDb2xvcjogQWxwaGEgY29tcG9uZW50IG9mICIrdCsiIHdpbGwgYmUgaWdub3JlZC4iKX1sZXQgcztpZihzPS9eKFx3KylcKChbXlwpXSopXCkvLmV4ZWModCkpe2xldCByO2NvbnN0IG89c1sxXSxhPXNbMl07c3dpdGNoKG8pe2Nhc2UicmdiIjpjYXNlInJnYmEiOmlmKHI9L15ccyooXGQrKVxzKixccyooXGQrKVxzKixccyooXGQrKVxzKig/OixccyooXGQqXC4/XGQrKVxzKik/JC8uZXhlYyhhKSlyZXR1cm4gbihyWzRdKSx0aGlzLnNldFJHQihNYXRoLm1pbigyNTUscGFyc2VJbnQoclsxXSwxMCkpLzI1NSxNYXRoLm1pbigyNTUscGFyc2VJbnQoclsyXSwxMCkpLzI1NSxNYXRoLm1pbigyNTUscGFyc2VJbnQoclszXSwxMCkpLzI1NSxlKTtpZihyPS9eXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqLFxzKihcZCspXCVccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMoYSkpcmV0dXJuIG4ocls0XSksdGhpcy5zZXRSR0IoTWF0aC5taW4oMTAwLHBhcnNlSW50KHJbMV0sMTApKS8xMDAsTWF0aC5taW4oMTAwLHBhcnNlSW50KHJbMl0sMTApKS8xMDAsTWF0aC5taW4oMTAwLHBhcnNlSW50KHJbM10sMTApKS8xMDAsZSk7YnJlYWs7Y2FzZSJoc2wiOmNhc2UiaHNsYSI6aWYocj0vXlxzKihcZCpcLj9cZCspXHMqLFxzKihcZCpcLj9cZCspXCVccyosXHMqKFxkKlwuP1xkKylcJVxzKig/OixccyooXGQqXC4/XGQrKVxzKik/JC8uZXhlYyhhKSlyZXR1cm4gbihyWzRdKSx0aGlzLnNldEhTTChwYXJzZUZsb2F0KHJbMV0pLzM2MCxwYXJzZUZsb2F0KHJbMl0pLzEwMCxwYXJzZUZsb2F0KHJbM10pLzEwMCxlKTticmVhaztkZWZhdWx0OmJ0KCJDb2xvcjogVW5rbm93biBjb2xvciBtb2RlbCAiK3QpfX1lbHNlIGlmKHM9L15cIyhbQS1GYS1mXGRdKykkLy5leGVjKHQpKXtjb25zdCByPXNbMV0sbz1yLmxlbmd0aDtpZihvPT09MylyZXR1cm4gdGhpcy5zZXRSR0IocGFyc2VJbnQoci5jaGFyQXQoMCksMTYpLzE1LHBhcnNlSW50KHIuY2hhckF0KDEpLDE2KS8xNSxwYXJzZUludChyLmNoYXJBdCgyKSwxNikvMTUsZSk7aWYobz09PTYpcmV0dXJuIHRoaXMuc2V0SGV4KHBhcnNlSW50KHIsMTYpLGUpO2J0KCJDb2xvcjogSW52YWxpZCBoZXggY29sb3IgIit0KX1lbHNlIGlmKHQmJnQubGVuZ3RoPjApcmV0dXJuIHRoaXMuc2V0Q29sb3JOYW1lKHQsZSk7cmV0dXJuIHRoaXN9c2V0Q29sb3JOYW1lKHQsZT1mZSl7Y29uc3Qgbj10bFt0LnRvTG93ZXJDYXNlKCldO3JldHVybiBuIT09dm9pZCAwP3RoaXMuc2V0SGV4KG4sZSk6YnQoIkNvbG9yOiBVbmtub3duIGNvbG9yICIrdCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnIsdGhpcy5nLHRoaXMuYil9Y29weSh0KXtyZXR1cm4gdGhpcy5yPXQucix0aGlzLmc9dC5nLHRoaXMuYj10LmIsdGhpc31jb3B5U1JHQlRvTGluZWFyKHQpe3JldHVybiB0aGlzLnI9Q2UodC5yKSx0aGlzLmc9Q2UodC5nKSx0aGlzLmI9Q2UodC5iKSx0aGlzfWNvcHlMaW5lYXJUb1NSR0IodCl7cmV0dXJuIHRoaXMucj1Vbih0LnIpLHRoaXMuZz1Vbih0LmcpLHRoaXMuYj1Vbih0LmIpLHRoaXN9Y29udmVydFNSR0JUb0xpbmVhcigpe3JldHVybiB0aGlzLmNvcHlTUkdCVG9MaW5lYXIodGhpcyksdGhpc31jb252ZXJ0TGluZWFyVG9TUkdCKCl7cmV0dXJuIHRoaXMuY29weUxpbmVhclRvU1JHQih0aGlzKSx0aGlzfWdldEhleCh0PWZlKXtyZXR1cm4gZGUud29ya2luZ1RvQ29sb3JTcGFjZShDdC5jb3B5KHRoaXMpLHQpLE1hdGgucm91bmQoWihDdC5yKjI1NSwwLDI1NSkpKjY1NTM2K01hdGgucm91bmQoWihDdC5nKjI1NSwwLDI1NSkpKjI1NitNYXRoLnJvdW5kKFooQ3QuYioyNTUsMCwyNTUpKX1nZXRIZXhTdHJpbmcodD1mZSl7cmV0dXJuKCIwMDAwMDAiK3RoaXMuZ2V0SGV4KHQpLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTYpfWdldEhTTCh0LGU9ZGUud29ya2luZ0NvbG9yU3BhY2Upe2RlLndvcmtpbmdUb0NvbG9yU3BhY2UoQ3QuY29weSh0aGlzKSxlKTtjb25zdCBuPUN0LnIscz1DdC5nLHI9Q3QuYixvPU1hdGgubWF4KG4scyxyKSxhPU1hdGgubWluKG4scyxyKTtsZXQgYyxsO2NvbnN0IGg9KGErbykvMjtpZihhPT09byljPTAsbD0wO2Vsc2V7Y29uc3QgdT1vLWE7c3dpdGNoKGw9aDw9LjU/dS8obythKTp1LygyLW8tYSksbyl7Y2FzZSBuOmM9KHMtcikvdSsoczxyPzY6MCk7YnJlYWs7Y2FzZSBzOmM9KHItbikvdSsyO2JyZWFrO2Nhc2UgcjpjPShuLXMpL3UrNDticmVha31jLz02fXJldHVybiB0Lmg9Yyx0LnM9bCx0Lmw9aCx0fWdldFJHQih0LGU9ZGUud29ya2luZ0NvbG9yU3BhY2Upe3JldHVybiBkZS53b3JraW5nVG9Db2xvclNwYWNlKEN0LmNvcHkodGhpcyksZSksdC5yPUN0LnIsdC5nPUN0LmcsdC5iPUN0LmIsdH1nZXRTdHlsZSh0PWZlKXtkZS53b3JraW5nVG9Db2xvclNwYWNlKEN0LmNvcHkodGhpcyksdCk7Y29uc3QgZT1DdC5yLG49Q3QuZyxzPUN0LmI7cmV0dXJuIHQhPT1mZT9gY29sb3IoJHt0fSAke2UudG9GaXhlZCgzKX0gJHtuLnRvRml4ZWQoMyl9ICR7cy50b0ZpeGVkKDMpfSlgOmByZ2IoJHtNYXRoLnJvdW5kKGUqMjU1KX0sJHtNYXRoLnJvdW5kKG4qMjU1KX0sJHtNYXRoLnJvdW5kKHMqMjU1KX0pYH1vZmZzZXRIU0wodCxlLG4pe3JldHVybiB0aGlzLmdldEhTTChybiksdGhpcy5zZXRIU0wocm4uaCt0LHJuLnMrZSxybi5sK24pfWFkZCh0KXtyZXR1cm4gdGhpcy5yKz10LnIsdGhpcy5nKz10LmcsdGhpcy5iKz10LmIsdGhpc31hZGRDb2xvcnModCxlKXtyZXR1cm4gdGhpcy5yPXQucitlLnIsdGhpcy5nPXQuZytlLmcsdGhpcy5iPXQuYitlLmIsdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMucis9dCx0aGlzLmcrPXQsdGhpcy5iKz10LHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLnI9TWF0aC5tYXgoMCx0aGlzLnItdC5yKSx0aGlzLmc9TWF0aC5tYXgoMCx0aGlzLmctdC5nKSx0aGlzLmI9TWF0aC5tYXgoMCx0aGlzLmItdC5iKSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLnIqPXQucix0aGlzLmcqPXQuZyx0aGlzLmIqPXQuYix0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLnIqPXQsdGhpcy5nKj10LHRoaXMuYio9dCx0aGlzfWxlcnAodCxlKXtyZXR1cm4gdGhpcy5yKz0odC5yLXRoaXMucikqZSx0aGlzLmcrPSh0LmctdGhpcy5nKSplLHRoaXMuYis9KHQuYi10aGlzLmIpKmUsdGhpc31sZXJwQ29sb3JzKHQsZSxuKXtyZXR1cm4gdGhpcy5yPXQucisoZS5yLXQucikqbix0aGlzLmc9dC5nKyhlLmctdC5nKSpuLHRoaXMuYj10LmIrKGUuYi10LmIpKm4sdGhpc31sZXJwSFNMKHQsZSl7dGhpcy5nZXRIU0wocm4pLHQuZ2V0SFNMKF9zKTtjb25zdCBuPVRpKHJuLmgsX3MuaCxlKSxzPVRpKHJuLnMsX3MucyxlKSxyPVRpKHJuLmwsX3MubCxlKTtyZXR1cm4gdGhpcy5zZXRIU0wobixzLHIpLHRoaXN9c2V0RnJvbVZlY3RvcjModCl7cmV0dXJuIHRoaXMucj10LngsdGhpcy5nPXQueSx0aGlzLmI9dC56LHRoaXN9YXBwbHlNYXRyaXgzKHQpe2NvbnN0IGU9dGhpcy5yLG49dGhpcy5nLHM9dGhpcy5iLHI9dC5lbGVtZW50cztyZXR1cm4gdGhpcy5yPXJbMF0qZStyWzNdKm4rcls2XSpzLHRoaXMuZz1yWzFdKmUrcls0XSpuK3JbN10qcyx0aGlzLmI9clsyXSplK3JbNV0qbityWzhdKnMsdGhpc31lcXVhbHModCl7cmV0dXJuIHQucj09PXRoaXMuciYmdC5nPT09dGhpcy5nJiZ0LmI9PT10aGlzLmJ9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy5yPXRbZV0sdGhpcy5nPXRbZSsxXSx0aGlzLmI9dFtlKzJdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy5yLHRbZSsxXT10aGlzLmcsdFtlKzJdPXRoaXMuYix0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy5yPXQuZ2V0WChlKSx0aGlzLmc9dC5nZXRZKGUpLHRoaXMuYj10LmdldFooZSksdGhpc310b0pTT04oKXtyZXR1cm4gdGhpcy5nZXRIZXgoKX0qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLnIseWllbGQgdGhpcy5nLHlpZWxkIHRoaXMuYn19O2NvbnN0IEN0PW5ldyB6czt6cy5OQU1FUz10bDtsZXQgWWY9MDtjbGFzcyBqZiBleHRlbmRzIGdze2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzTWF0ZXJpYWw9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6WWYrK30pLHRoaXMudXVpZD1tbigpLHRoaXMubmFtZT0iIix0aGlzLnR5cGU9Ik1hdGVyaWFsIix0aGlzLmJsZW5kaW5nPTEsdGhpcy5zaWRlPTAsdGhpcy52ZXJ0ZXhDb2xvcnM9ITEsdGhpcy5vcGFjaXR5PTEsdGhpcy50cmFuc3BhcmVudD0hMSx0aGlzLmFscGhhSGFzaD0hMSx0aGlzLmJsZW5kU3JjPTIwNCx0aGlzLmJsZW5kRHN0PTIwNSx0aGlzLmJsZW5kRXF1YXRpb249MTAwLHRoaXMuYmxlbmRTcmNBbHBoYT1udWxsLHRoaXMuYmxlbmREc3RBbHBoYT1udWxsLHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhPW51bGwsdGhpcy5ibGVuZENvbG9yPW5ldyB6cygwLDAsMCksdGhpcy5ibGVuZEFscGhhPTAsdGhpcy5kZXB0aEZ1bmM9Myx0aGlzLmRlcHRoVGVzdD0hMCx0aGlzLmRlcHRoV3JpdGU9ITAsdGhpcy5zdGVuY2lsV3JpdGVNYXNrPTI1NSx0aGlzLnN0ZW5jaWxGdW5jPTUxOSx0aGlzLnN0ZW5jaWxSZWY9MCx0aGlzLnN0ZW5jaWxGdW5jTWFzaz0yNTUsdGhpcy5zdGVuY2lsRmFpbD03NjgwLHRoaXMuc3RlbmNpbFpGYWlsPTc2ODAsdGhpcy5zdGVuY2lsWlBhc3M9NzY4MCx0aGlzLnN0ZW5jaWxXcml0ZT0hMSx0aGlzLmNsaXBwaW5nUGxhbmVzPW51bGwsdGhpcy5jbGlwSW50ZXJzZWN0aW9uPSExLHRoaXMuY2xpcFNoYWRvd3M9ITEsdGhpcy5zaGFkb3dTaWRlPW51bGwsdGhpcy5jb2xvcldyaXRlPSEwLHRoaXMucHJlY2lzaW9uPW51bGwsdGhpcy5wb2x5Z29uT2Zmc2V0PSExLHRoaXMucG9seWdvbk9mZnNldEZhY3Rvcj0wLHRoaXMucG9seWdvbk9mZnNldFVuaXRzPTAsdGhpcy5kaXRoZXJpbmc9ITEsdGhpcy5hbHBoYVRvQ292ZXJhZ2U9ITEsdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE9ITEsdGhpcy5mb3JjZVNpbmdsZVBhc3M9ITEsdGhpcy5hbGxvd092ZXJyaWRlPSEwLHRoaXMudmlzaWJsZT0hMCx0aGlzLnRvbmVNYXBwZWQ9ITAsdGhpcy51c2VyRGF0YT17fSx0aGlzLnZlcnNpb249MCx0aGlzLl9hbHBoYVRlc3Q9MH1nZXQgYWxwaGFUZXN0KCl7cmV0dXJuIHRoaXMuX2FscGhhVGVzdH1zZXQgYWxwaGFUZXN0KHQpe3RoaXMuX2FscGhhVGVzdD4wIT10PjAmJnRoaXMudmVyc2lvbisrLHRoaXMuX2FscGhhVGVzdD10fW9uQmVmb3JlUmVuZGVyKCl7fW9uQmVmb3JlQ29tcGlsZSgpe31jdXN0b21Qcm9ncmFtQ2FjaGVLZXkoKXtyZXR1cm4gdGhpcy5vbkJlZm9yZUNvbXBpbGUudG9TdHJpbmcoKX1zZXRWYWx1ZXModCl7aWYodCE9PXZvaWQgMClmb3IoY29uc3QgZSBpbiB0KXtjb25zdCBuPXRbZV07aWYobj09PXZvaWQgMCl7YnQoYE1hdGVyaWFsOiBwYXJhbWV0ZXIgJyR7ZX0nIGhhcyB2YWx1ZSBvZiB1bmRlZmluZWQuYCk7Y29udGludWV9Y29uc3Qgcz10aGlzW2VdO2lmKHM9PT12b2lkIDApe2J0KGBNYXRlcmlhbDogJyR7ZX0nIGlzIG5vdCBhIHByb3BlcnR5IG9mIFRIUkVFLiR7dGhpcy50eXBlfS5gKTtjb250aW51ZX1zJiZzLmlzQ29sb3I/cy5zZXQobik6cyYmcy5pc1ZlY3RvcjMmJm4mJm4uaXNWZWN0b3IzP3MuY29weShuKTp0aGlzW2VdPW59fXRvSlNPTih0KXtjb25zdCBlPXQ9PT12b2lkIDB8fHR5cGVvZiB0PT0ic3RyaW5nIjtlJiYodD17dGV4dHVyZXM6e30saW1hZ2VzOnt9fSk7Y29uc3Qgbj17bWV0YWRhdGE6e3ZlcnNpb246NC43LHR5cGU6Ik1hdGVyaWFsIixnZW5lcmF0b3I6Ik1hdGVyaWFsLnRvSlNPTiJ9fTtuLnV1aWQ9dGhpcy51dWlkLG4udHlwZT10aGlzLnR5cGUsdGhpcy5uYW1lIT09IiImJihuLm5hbWU9dGhpcy5uYW1lKSx0aGlzLmNvbG9yJiZ0aGlzLmNvbG9yLmlzQ29sb3ImJihuLmNvbG9yPXRoaXMuY29sb3IuZ2V0SGV4KCkpLHRoaXMucm91Z2huZXNzIT09dm9pZCAwJiYobi5yb3VnaG5lc3M9dGhpcy5yb3VnaG5lc3MpLHRoaXMubWV0YWxuZXNzIT09dm9pZCAwJiYobi5tZXRhbG5lc3M9dGhpcy5tZXRhbG5lc3MpLHRoaXMuc2hlZW4hPT12b2lkIDAmJihuLnNoZWVuPXRoaXMuc2hlZW4pLHRoaXMuc2hlZW5Db2xvciYmdGhpcy5zaGVlbkNvbG9yLmlzQ29sb3ImJihuLnNoZWVuQ29sb3I9dGhpcy5zaGVlbkNvbG9yLmdldEhleCgpKSx0aGlzLnNoZWVuUm91Z2huZXNzIT09dm9pZCAwJiYobi5zaGVlblJvdWdobmVzcz10aGlzLnNoZWVuUm91Z2huZXNzKSx0aGlzLmVtaXNzaXZlJiZ0aGlzLmVtaXNzaXZlLmlzQ29sb3ImJihuLmVtaXNzaXZlPXRoaXMuZW1pc3NpdmUuZ2V0SGV4KCkpLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkhPT12b2lkIDAmJnRoaXMuZW1pc3NpdmVJbnRlbnNpdHkhPT0xJiYobi5lbWlzc2l2ZUludGVuc2l0eT10aGlzLmVtaXNzaXZlSW50ZW5zaXR5KSx0aGlzLnNwZWN1bGFyJiZ0aGlzLnNwZWN1bGFyLmlzQ29sb3ImJihuLnNwZWN1bGFyPXRoaXMuc3BlY3VsYXIuZ2V0SGV4KCkpLHRoaXMuc3BlY3VsYXJJbnRlbnNpdHkhPT12b2lkIDAmJihuLnNwZWN1bGFySW50ZW5zaXR5PXRoaXMuc3BlY3VsYXJJbnRlbnNpdHkpLHRoaXMuc3BlY3VsYXJDb2xvciYmdGhpcy5zcGVjdWxhckNvbG9yLmlzQ29sb3ImJihuLnNwZWN1bGFyQ29sb3I9dGhpcy5zcGVjdWxhckNvbG9yLmdldEhleCgpKSx0aGlzLnNoaW5pbmVzcyE9PXZvaWQgMCYmKG4uc2hpbmluZXNzPXRoaXMuc2hpbmluZXNzKSx0aGlzLmNsZWFyY29hdCE9PXZvaWQgMCYmKG4uY2xlYXJjb2F0PXRoaXMuY2xlYXJjb2F0KSx0aGlzLmNsZWFyY29hdFJvdWdobmVzcyE9PXZvaWQgMCYmKG4uY2xlYXJjb2F0Um91Z2huZXNzPXRoaXMuY2xlYXJjb2F0Um91Z2huZXNzKSx0aGlzLmNsZWFyY29hdE1hcCYmdGhpcy5jbGVhcmNvYXRNYXAuaXNUZXh0dXJlJiYobi5jbGVhcmNvYXRNYXA9dGhpcy5jbGVhcmNvYXRNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwJiZ0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcC5pc1RleHR1cmUmJihuLmNsZWFyY29hdFJvdWdobmVzc01hcD10aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcC50b0pTT04odCkudXVpZCksdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAmJnRoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwLmlzVGV4dHVyZSYmKG4uY2xlYXJjb2F0Tm9ybWFsTWFwPXRoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwLnRvSlNPTih0KS51dWlkLG4uY2xlYXJjb2F0Tm9ybWFsU2NhbGU9dGhpcy5jbGVhcmNvYXROb3JtYWxTY2FsZS50b0FycmF5KCkpLHRoaXMuc2hlZW5Db2xvck1hcCYmdGhpcy5zaGVlbkNvbG9yTWFwLmlzVGV4dHVyZSYmKG4uc2hlZW5Db2xvck1hcD10aGlzLnNoZWVuQ29sb3JNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuc2hlZW5Sb3VnaG5lc3NNYXAmJnRoaXMuc2hlZW5Sb3VnaG5lc3NNYXAuaXNUZXh0dXJlJiYobi5zaGVlblJvdWdobmVzc01hcD10aGlzLnNoZWVuUm91Z2huZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmRpc3BlcnNpb24hPT12b2lkIDAmJihuLmRpc3BlcnNpb249dGhpcy5kaXNwZXJzaW9uKSx0aGlzLmlyaWRlc2NlbmNlIT09dm9pZCAwJiYobi5pcmlkZXNjZW5jZT10aGlzLmlyaWRlc2NlbmNlKSx0aGlzLmlyaWRlc2NlbmNlSU9SIT09dm9pZCAwJiYobi5pcmlkZXNjZW5jZUlPUj10aGlzLmlyaWRlc2NlbmNlSU9SKSx0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2UhPT12b2lkIDAmJihuLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2U9dGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlKSx0aGlzLmlyaWRlc2NlbmNlTWFwJiZ0aGlzLmlyaWRlc2NlbmNlTWFwLmlzVGV4dHVyZSYmKG4uaXJpZGVzY2VuY2VNYXA9dGhpcy5pcmlkZXNjZW5jZU1hcC50b0pTT04odCkudXVpZCksdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCYmdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcC5pc1RleHR1cmUmJihuLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwPXRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuYW5pc290cm9weSE9PXZvaWQgMCYmKG4uYW5pc290cm9weT10aGlzLmFuaXNvdHJvcHkpLHRoaXMuYW5pc290cm9weVJvdGF0aW9uIT09dm9pZCAwJiYobi5hbmlzb3Ryb3B5Um90YXRpb249dGhpcy5hbmlzb3Ryb3B5Um90YXRpb24pLHRoaXMuYW5pc290cm9weU1hcCYmdGhpcy5hbmlzb3Ryb3B5TWFwLmlzVGV4dHVyZSYmKG4uYW5pc290cm9weU1hcD10aGlzLmFuaXNvdHJvcHlNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubWFwJiZ0aGlzLm1hcC5pc1RleHR1cmUmJihuLm1hcD10aGlzLm1hcC50b0pTT04odCkudXVpZCksdGhpcy5tYXRjYXAmJnRoaXMubWF0Y2FwLmlzVGV4dHVyZSYmKG4ubWF0Y2FwPXRoaXMubWF0Y2FwLnRvSlNPTih0KS51dWlkKSx0aGlzLmFscGhhTWFwJiZ0aGlzLmFscGhhTWFwLmlzVGV4dHVyZSYmKG4uYWxwaGFNYXA9dGhpcy5hbHBoYU1hcC50b0pTT04odCkudXVpZCksdGhpcy5saWdodE1hcCYmdGhpcy5saWdodE1hcC5pc1RleHR1cmUmJihuLmxpZ2h0TWFwPXRoaXMubGlnaHRNYXAudG9KU09OKHQpLnV1aWQsbi5saWdodE1hcEludGVuc2l0eT10aGlzLmxpZ2h0TWFwSW50ZW5zaXR5KSx0aGlzLmFvTWFwJiZ0aGlzLmFvTWFwLmlzVGV4dHVyZSYmKG4uYW9NYXA9dGhpcy5hb01hcC50b0pTT04odCkudXVpZCxuLmFvTWFwSW50ZW5zaXR5PXRoaXMuYW9NYXBJbnRlbnNpdHkpLHRoaXMuYnVtcE1hcCYmdGhpcy5idW1wTWFwLmlzVGV4dHVyZSYmKG4uYnVtcE1hcD10aGlzLmJ1bXBNYXAudG9KU09OKHQpLnV1aWQsbi5idW1wU2NhbGU9dGhpcy5idW1wU2NhbGUpLHRoaXMubm9ybWFsTWFwJiZ0aGlzLm5vcm1hbE1hcC5pc1RleHR1cmUmJihuLm5vcm1hbE1hcD10aGlzLm5vcm1hbE1hcC50b0pTT04odCkudXVpZCxuLm5vcm1hbE1hcFR5cGU9dGhpcy5ub3JtYWxNYXBUeXBlLG4ubm9ybWFsU2NhbGU9dGhpcy5ub3JtYWxTY2FsZS50b0FycmF5KCkpLHRoaXMuZGlzcGxhY2VtZW50TWFwJiZ0aGlzLmRpc3BsYWNlbWVudE1hcC5pc1RleHR1cmUmJihuLmRpc3BsYWNlbWVudE1hcD10aGlzLmRpc3BsYWNlbWVudE1hcC50b0pTT04odCkudXVpZCxuLmRpc3BsYWNlbWVudFNjYWxlPXRoaXMuZGlzcGxhY2VtZW50U2NhbGUsbi5kaXNwbGFjZW1lbnRCaWFzPXRoaXMuZGlzcGxhY2VtZW50QmlhcyksdGhpcy5yb3VnaG5lc3NNYXAmJnRoaXMucm91Z2huZXNzTWFwLmlzVGV4dHVyZSYmKG4ucm91Z2huZXNzTWFwPXRoaXMucm91Z2huZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLm1ldGFsbmVzc01hcCYmdGhpcy5tZXRhbG5lc3NNYXAuaXNUZXh0dXJlJiYobi5tZXRhbG5lc3NNYXA9dGhpcy5tZXRhbG5lc3NNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuZW1pc3NpdmVNYXAmJnRoaXMuZW1pc3NpdmVNYXAuaXNUZXh0dXJlJiYobi5lbWlzc2l2ZU1hcD10aGlzLmVtaXNzaXZlTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnNwZWN1bGFyTWFwJiZ0aGlzLnNwZWN1bGFyTWFwLmlzVGV4dHVyZSYmKG4uc3BlY3VsYXJNYXA9dGhpcy5zcGVjdWxhck1hcC50b0pTT04odCkudXVpZCksdGhpcy5zcGVjdWxhckludGVuc2l0eU1hcCYmdGhpcy5zcGVjdWxhckludGVuc2l0eU1hcC5pc1RleHR1cmUmJihuLnNwZWN1bGFySW50ZW5zaXR5TWFwPXRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuc3BlY3VsYXJDb2xvck1hcCYmdGhpcy5zcGVjdWxhckNvbG9yTWFwLmlzVGV4dHVyZSYmKG4uc3BlY3VsYXJDb2xvck1hcD10aGlzLnNwZWN1bGFyQ29sb3JNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuZW52TWFwJiZ0aGlzLmVudk1hcC5pc1RleHR1cmUmJihuLmVudk1hcD10aGlzLmVudk1hcC50b0pTT04odCkudXVpZCx0aGlzLmNvbWJpbmUhPT12b2lkIDAmJihuLmNvbWJpbmU9dGhpcy5jb21iaW5lKSksdGhpcy5lbnZNYXBSb3RhdGlvbiE9PXZvaWQgMCYmKG4uZW52TWFwUm90YXRpb249dGhpcy5lbnZNYXBSb3RhdGlvbi50b0FycmF5KCkpLHRoaXMuZW52TWFwSW50ZW5zaXR5IT09dm9pZCAwJiYobi5lbnZNYXBJbnRlbnNpdHk9dGhpcy5lbnZNYXBJbnRlbnNpdHkpLHRoaXMucmVmbGVjdGl2aXR5IT09dm9pZCAwJiYobi5yZWZsZWN0aXZpdHk9dGhpcy5yZWZsZWN0aXZpdHkpLHRoaXMucmVmcmFjdGlvblJhdGlvIT09dm9pZCAwJiYobi5yZWZyYWN0aW9uUmF0aW89dGhpcy5yZWZyYWN0aW9uUmF0aW8pLHRoaXMuZ3JhZGllbnRNYXAmJnRoaXMuZ3JhZGllbnRNYXAuaXNUZXh0dXJlJiYobi5ncmFkaWVudE1hcD10aGlzLmdyYWRpZW50TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnRyYW5zbWlzc2lvbiE9PXZvaWQgMCYmKG4udHJhbnNtaXNzaW9uPXRoaXMudHJhbnNtaXNzaW9uKSx0aGlzLnRyYW5zbWlzc2lvbk1hcCYmdGhpcy50cmFuc21pc3Npb25NYXAuaXNUZXh0dXJlJiYobi50cmFuc21pc3Npb25NYXA9dGhpcy50cmFuc21pc3Npb25NYXAudG9KU09OKHQpLnV1aWQpLHRoaXMudGhpY2tuZXNzIT09dm9pZCAwJiYobi50aGlja25lc3M9dGhpcy50aGlja25lc3MpLHRoaXMudGhpY2tuZXNzTWFwJiZ0aGlzLnRoaWNrbmVzc01hcC5pc1RleHR1cmUmJihuLnRoaWNrbmVzc01hcD10aGlzLnRoaWNrbmVzc01hcC50b0pTT04odCkudXVpZCksdGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlIT09dm9pZCAwJiZ0aGlzLmF0dGVudWF0aW9uRGlzdGFuY2UhPT0xLzAmJihuLmF0dGVudWF0aW9uRGlzdGFuY2U9dGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlKSx0aGlzLmF0dGVudWF0aW9uQ29sb3IhPT12b2lkIDAmJihuLmF0dGVudWF0aW9uQ29sb3I9dGhpcy5hdHRlbnVhdGlvbkNvbG9yLmdldEhleCgpKSx0aGlzLnNpemUhPT12b2lkIDAmJihuLnNpemU9dGhpcy5zaXplKSx0aGlzLnNoYWRvd1NpZGUhPT1udWxsJiYobi5zaGFkb3dTaWRlPXRoaXMuc2hhZG93U2lkZSksdGhpcy5zaXplQXR0ZW51YXRpb24hPT12b2lkIDAmJihuLnNpemVBdHRlbnVhdGlvbj10aGlzLnNpemVBdHRlbnVhdGlvbiksdGhpcy5ibGVuZGluZyE9PTEmJihuLmJsZW5kaW5nPXRoaXMuYmxlbmRpbmcpLHRoaXMuc2lkZSE9PTAmJihuLnNpZGU9dGhpcy5zaWRlKSx0aGlzLnZlcnRleENvbG9ycz09PSEwJiYobi52ZXJ0ZXhDb2xvcnM9ITApLHRoaXMub3BhY2l0eTwxJiYobi5vcGFjaXR5PXRoaXMub3BhY2l0eSksdGhpcy50cmFuc3BhcmVudD09PSEwJiYobi50cmFuc3BhcmVudD0hMCksdGhpcy5ibGVuZFNyYyE9PTIwNCYmKG4uYmxlbmRTcmM9dGhpcy5ibGVuZFNyYyksdGhpcy5ibGVuZERzdCE9PTIwNSYmKG4uYmxlbmREc3Q9dGhpcy5ibGVuZERzdCksdGhpcy5ibGVuZEVxdWF0aW9uIT09MTAwJiYobi5ibGVuZEVxdWF0aW9uPXRoaXMuYmxlbmRFcXVhdGlvbiksdGhpcy5ibGVuZFNyY0FscGhhIT09bnVsbCYmKG4uYmxlbmRTcmNBbHBoYT10aGlzLmJsZW5kU3JjQWxwaGEpLHRoaXMuYmxlbmREc3RBbHBoYSE9PW51bGwmJihuLmJsZW5kRHN0QWxwaGE9dGhpcy5ibGVuZERzdEFscGhhKSx0aGlzLmJsZW5kRXF1YXRpb25BbHBoYSE9PW51bGwmJihuLmJsZW5kRXF1YXRpb25BbHBoYT10aGlzLmJsZW5kRXF1YXRpb25BbHBoYSksdGhpcy5ibGVuZENvbG9yJiZ0aGlzLmJsZW5kQ29sb3IuaXNDb2xvciYmKG4uYmxlbmRDb2xvcj10aGlzLmJsZW5kQ29sb3IuZ2V0SGV4KCkpLHRoaXMuYmxlbmRBbHBoYSE9PTAmJihuLmJsZW5kQWxwaGE9dGhpcy5ibGVuZEFscGhhKSx0aGlzLmRlcHRoRnVuYyE9PTMmJihuLmRlcHRoRnVuYz10aGlzLmRlcHRoRnVuYyksdGhpcy5kZXB0aFRlc3Q9PT0hMSYmKG4uZGVwdGhUZXN0PXRoaXMuZGVwdGhUZXN0KSx0aGlzLmRlcHRoV3JpdGU9PT0hMSYmKG4uZGVwdGhXcml0ZT10aGlzLmRlcHRoV3JpdGUpLHRoaXMuY29sb3JXcml0ZT09PSExJiYobi5jb2xvcldyaXRlPXRoaXMuY29sb3JXcml0ZSksdGhpcy5zdGVuY2lsV3JpdGVNYXNrIT09MjU1JiYobi5zdGVuY2lsV3JpdGVNYXNrPXRoaXMuc3RlbmNpbFdyaXRlTWFzayksdGhpcy5zdGVuY2lsRnVuYyE9PTUxOSYmKG4uc3RlbmNpbEZ1bmM9dGhpcy5zdGVuY2lsRnVuYyksdGhpcy5zdGVuY2lsUmVmIT09MCYmKG4uc3RlbmNpbFJlZj10aGlzLnN0ZW5jaWxSZWYpLHRoaXMuc3RlbmNpbEZ1bmNNYXNrIT09MjU1JiYobi5zdGVuY2lsRnVuY01hc2s9dGhpcy5zdGVuY2lsRnVuY01hc2spLHRoaXMuc3RlbmNpbEZhaWwhPT03NjgwJiYobi5zdGVuY2lsRmFpbD10aGlzLnN0ZW5jaWxGYWlsKSx0aGlzLnN0ZW5jaWxaRmFpbCE9PTc2ODAmJihuLnN0ZW5jaWxaRmFpbD10aGlzLnN0ZW5jaWxaRmFpbCksdGhpcy5zdGVuY2lsWlBhc3MhPT03NjgwJiYobi5zdGVuY2lsWlBhc3M9dGhpcy5zdGVuY2lsWlBhc3MpLHRoaXMuc3RlbmNpbFdyaXRlPT09ITAmJihuLnN0ZW5jaWxXcml0ZT10aGlzLnN0ZW5jaWxXcml0ZSksdGhpcy5yb3RhdGlvbiE9PXZvaWQgMCYmdGhpcy5yb3RhdGlvbiE9PTAmJihuLnJvdGF0aW9uPXRoaXMucm90YXRpb24pLHRoaXMucG9seWdvbk9mZnNldD09PSEwJiYobi5wb2x5Z29uT2Zmc2V0PSEwKSx0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IhPT0wJiYobi5wb2x5Z29uT2Zmc2V0RmFjdG9yPXRoaXMucG9seWdvbk9mZnNldEZhY3RvciksdGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMhPT0wJiYobi5wb2x5Z29uT2Zmc2V0VW5pdHM9dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMpLHRoaXMubGluZXdpZHRoIT09dm9pZCAwJiZ0aGlzLmxpbmV3aWR0aCE9PTEmJihuLmxpbmV3aWR0aD10aGlzLmxpbmV3aWR0aCksdGhpcy5kYXNoU2l6ZSE9PXZvaWQgMCYmKG4uZGFzaFNpemU9dGhpcy5kYXNoU2l6ZSksdGhpcy5nYXBTaXplIT09dm9pZCAwJiYobi5nYXBTaXplPXRoaXMuZ2FwU2l6ZSksdGhpcy5zY2FsZSE9PXZvaWQgMCYmKG4uc2NhbGU9dGhpcy5zY2FsZSksdGhpcy5kaXRoZXJpbmc9PT0hMCYmKG4uZGl0aGVyaW5nPSEwKSx0aGlzLmFscGhhVGVzdD4wJiYobi5hbHBoYVRlc3Q9dGhpcy5hbHBoYVRlc3QpLHRoaXMuYWxwaGFIYXNoPT09ITAmJihuLmFscGhhSGFzaD0hMCksdGhpcy5hbHBoYVRvQ292ZXJhZ2U9PT0hMCYmKG4uYWxwaGFUb0NvdmVyYWdlPSEwKSx0aGlzLnByZW11bHRpcGxpZWRBbHBoYT09PSEwJiYobi5wcmVtdWx0aXBsaWVkQWxwaGE9ITApLHRoaXMuZm9yY2VTaW5nbGVQYXNzPT09ITAmJihuLmZvcmNlU2luZ2xlUGFzcz0hMCksdGhpcy5hbGxvd092ZXJyaWRlPT09ITEmJihuLmFsbG93T3ZlcnJpZGU9ITEpLHRoaXMud2lyZWZyYW1lPT09ITAmJihuLndpcmVmcmFtZT0hMCksdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg+MSYmKG4ud2lyZWZyYW1lTGluZXdpZHRoPXRoaXMud2lyZWZyYW1lTGluZXdpZHRoKSx0aGlzLndpcmVmcmFtZUxpbmVjYXAhPT0icm91bmQiJiYobi53aXJlZnJhbWVMaW5lY2FwPXRoaXMud2lyZWZyYW1lTGluZWNhcCksdGhpcy53aXJlZnJhbWVMaW5lam9pbiE9PSJyb3VuZCImJihuLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWpvaW4pLHRoaXMuZmxhdFNoYWRpbmc9PT0hMCYmKG4uZmxhdFNoYWRpbmc9ITApLHRoaXMudmlzaWJsZT09PSExJiYobi52aXNpYmxlPSExKSx0aGlzLnRvbmVNYXBwZWQ9PT0hMSYmKG4udG9uZU1hcHBlZD0hMSksdGhpcy5mb2c9PT0hMSYmKG4uZm9nPSExKSxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKG4udXNlckRhdGE9dGhpcy51c2VyRGF0YSk7ZnVuY3Rpb24gcyhyKXtjb25zdCBvPVtdO2Zvcihjb25zdCBhIGluIHIpe2NvbnN0IGM9clthXTtkZWxldGUgYy5tZXRhZGF0YSxvLnB1c2goYyl9cmV0dXJuIG99aWYoZSl7Y29uc3Qgcj1zKHQudGV4dHVyZXMpLG89cyh0LmltYWdlcyk7ci5sZW5ndGg+MCYmKG4udGV4dHVyZXM9ciksby5sZW5ndGg+MCYmKG4uaW1hZ2VzPW8pfXJldHVybiBufWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3RoaXMubmFtZT10Lm5hbWUsdGhpcy5ibGVuZGluZz10LmJsZW5kaW5nLHRoaXMuc2lkZT10LnNpZGUsdGhpcy52ZXJ0ZXhDb2xvcnM9dC52ZXJ0ZXhDb2xvcnMsdGhpcy5vcGFjaXR5PXQub3BhY2l0eSx0aGlzLnRyYW5zcGFyZW50PXQudHJhbnNwYXJlbnQsdGhpcy5ibGVuZFNyYz10LmJsZW5kU3JjLHRoaXMuYmxlbmREc3Q9dC5ibGVuZERzdCx0aGlzLmJsZW5kRXF1YXRpb249dC5ibGVuZEVxdWF0aW9uLHRoaXMuYmxlbmRTcmNBbHBoYT10LmJsZW5kU3JjQWxwaGEsdGhpcy5ibGVuZERzdEFscGhhPXQuYmxlbmREc3RBbHBoYSx0aGlzLmJsZW5kRXF1YXRpb25BbHBoYT10LmJsZW5kRXF1YXRpb25BbHBoYSx0aGlzLmJsZW5kQ29sb3IuY29weSh0LmJsZW5kQ29sb3IpLHRoaXMuYmxlbmRBbHBoYT10LmJsZW5kQWxwaGEsdGhpcy5kZXB0aEZ1bmM9dC5kZXB0aEZ1bmMsdGhpcy5kZXB0aFRlc3Q9dC5kZXB0aFRlc3QsdGhpcy5kZXB0aFdyaXRlPXQuZGVwdGhXcml0ZSx0aGlzLnN0ZW5jaWxXcml0ZU1hc2s9dC5zdGVuY2lsV3JpdGVNYXNrLHRoaXMuc3RlbmNpbEZ1bmM9dC5zdGVuY2lsRnVuYyx0aGlzLnN0ZW5jaWxSZWY9dC5zdGVuY2lsUmVmLHRoaXMuc3RlbmNpbEZ1bmNNYXNrPXQuc3RlbmNpbEZ1bmNNYXNrLHRoaXMuc3RlbmNpbEZhaWw9dC5zdGVuY2lsRmFpbCx0aGlzLnN0ZW5jaWxaRmFpbD10LnN0ZW5jaWxaRmFpbCx0aGlzLnN0ZW5jaWxaUGFzcz10LnN0ZW5jaWxaUGFzcyx0aGlzLnN0ZW5jaWxXcml0ZT10LnN0ZW5jaWxXcml0ZTtjb25zdCBlPXQuY2xpcHBpbmdQbGFuZXM7bGV0IG49bnVsbDtpZihlIT09bnVsbCl7Y29uc3Qgcz1lLmxlbmd0aDtuPW5ldyBBcnJheShzKTtmb3IobGV0IHI9MDtyIT09czsrK3IpbltyXT1lW3JdLmNsb25lKCl9cmV0dXJuIHRoaXMuY2xpcHBpbmdQbGFuZXM9bix0aGlzLmNsaXBJbnRlcnNlY3Rpb249dC5jbGlwSW50ZXJzZWN0aW9uLHRoaXMuY2xpcFNoYWRvd3M9dC5jbGlwU2hhZG93cyx0aGlzLnNoYWRvd1NpZGU9dC5zaGFkb3dTaWRlLHRoaXMuY29sb3JXcml0ZT10LmNvbG9yV3JpdGUsdGhpcy5wcmVjaXNpb249dC5wcmVjaXNpb24sdGhpcy5wb2x5Z29uT2Zmc2V0PXQucG9seWdvbk9mZnNldCx0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I9dC5wb2x5Z29uT2Zmc2V0RmFjdG9yLHRoaXMucG9seWdvbk9mZnNldFVuaXRzPXQucG9seWdvbk9mZnNldFVuaXRzLHRoaXMuZGl0aGVyaW5nPXQuZGl0aGVyaW5nLHRoaXMuYWxwaGFUZXN0PXQuYWxwaGFUZXN0LHRoaXMuYWxwaGFIYXNoPXQuYWxwaGFIYXNoLHRoaXMuYWxwaGFUb0NvdmVyYWdlPXQuYWxwaGFUb0NvdmVyYWdlLHRoaXMucHJlbXVsdGlwbGllZEFscGhhPXQucHJlbXVsdGlwbGllZEFscGhhLHRoaXMuZm9yY2VTaW5nbGVQYXNzPXQuZm9yY2VTaW5nbGVQYXNzLHRoaXMuYWxsb3dPdmVycmlkZT10LmFsbG93T3ZlcnJpZGUsdGhpcy52aXNpYmxlPXQudmlzaWJsZSx0aGlzLnRvbmVNYXBwZWQ9dC50b25lTWFwcGVkLHRoaXMudXNlckRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0LnVzZXJEYXRhKSksdGhpc31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXNldCBuZWVkc1VwZGF0ZSh0KXt0PT09ITAmJnRoaXMudmVyc2lvbisrfX1jbGFzcyBRZiBleHRlbmRzIGpme2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5pc01lc2hCYXNpY01hdGVyaWFsPSEwLHRoaXMudHlwZT0iTWVzaEJhc2ljTWF0ZXJpYWwiLHRoaXMuY29sb3I9bmV3IHpzKDE2Nzc3MjE1KSx0aGlzLm1hcD1udWxsLHRoaXMubGlnaHRNYXA9bnVsbCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTEsdGhpcy5hb01hcD1udWxsLHRoaXMuYW9NYXBJbnRlbnNpdHk9MSx0aGlzLnNwZWN1bGFyTWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuZW52TWFwPW51bGwsdGhpcy5lbnZNYXBSb3RhdGlvbj1uZXcgQmksdGhpcy5jb21iaW5lPTAsdGhpcy5yZWZsZWN0aXZpdHk9MSx0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTgsdGhpcy53aXJlZnJhbWU9ITEsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MSx0aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIix0aGlzLndpcmVmcmFtZUxpbmVqb2luPSJyb3VuZCIsdGhpcy5mb2c9ITAsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5tYXA9dC5tYXAsdGhpcy5saWdodE1hcD10LmxpZ2h0TWFwLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9dC5saWdodE1hcEludGVuc2l0eSx0aGlzLmFvTWFwPXQuYW9NYXAsdGhpcy5hb01hcEludGVuc2l0eT10LmFvTWFwSW50ZW5zaXR5LHRoaXMuc3BlY3VsYXJNYXA9dC5zcGVjdWxhck1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5lbnZNYXA9dC5lbnZNYXAsdGhpcy5lbnZNYXBSb3RhdGlvbi5jb3B5KHQuZW52TWFwUm90YXRpb24pLHRoaXMuY29tYmluZT10LmNvbWJpbmUsdGhpcy5yZWZsZWN0aXZpdHk9dC5yZWZsZWN0aXZpdHksdGhpcy5yZWZyYWN0aW9uUmF0aW89dC5yZWZyYWN0aW9uUmF0aW8sdGhpcy53aXJlZnJhbWU9dC53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9dC53aXJlZnJhbWVMaW5ld2lkdGgsdGhpcy53aXJlZnJhbWVMaW5lY2FwPXQud2lyZWZyYW1lTGluZWNhcCx0aGlzLndpcmVmcmFtZUxpbmVqb2luPXQud2lyZWZyYW1lTGluZWpvaW4sdGhpcy5mb2c9dC5mb2csdGhpc319Y29uc3QgcHQ9bmV3IFAsVHM9bmV3IGs7bGV0IEtmPTA7Y2xhc3MgeHR7Y29uc3RydWN0b3IodCxlLG49ITEpe2lmKEFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4iKTt0aGlzLmlzQnVmZmVyQXR0cmlidXRlPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOktmKyt9KSx0aGlzLm5hbWU9IiIsdGhpcy5hcnJheT10LHRoaXMuaXRlbVNpemU9ZSx0aGlzLmNvdW50PXQhPT12b2lkIDA/dC5sZW5ndGgvZTowLHRoaXMubm9ybWFsaXplZD1uLHRoaXMudXNhZ2U9MzUwNDQsdGhpcy51cGRhdGVSYW5nZXM9W10sdGhpcy5ncHVUeXBlPTEwMTUsdGhpcy52ZXJzaW9uPTB9b25VcGxvYWRDYWxsYmFjaygpe31zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK31zZXRVc2FnZSh0KXtyZXR1cm4gdGhpcy51c2FnZT10LHRoaXN9YWRkVXBkYXRlUmFuZ2UodCxlKXt0aGlzLnVwZGF0ZVJhbmdlcy5wdXNoKHtzdGFydDp0LGNvdW50OmV9KX1jbGVhclVwZGF0ZVJhbmdlcygpe3RoaXMudXBkYXRlUmFuZ2VzLmxlbmd0aD0wfWNvcHkodCl7cmV0dXJuIHRoaXMubmFtZT10Lm5hbWUsdGhpcy5hcnJheT1uZXcgdC5hcnJheS5jb25zdHJ1Y3Rvcih0LmFycmF5KSx0aGlzLml0ZW1TaXplPXQuaXRlbVNpemUsdGhpcy5jb3VudD10LmNvdW50LHRoaXMubm9ybWFsaXplZD10Lm5vcm1hbGl6ZWQsdGhpcy51c2FnZT10LnVzYWdlLHRoaXMuZ3B1VHlwZT10LmdwdVR5cGUsdGhpc31jb3B5QXQodCxlLG4pe3QqPXRoaXMuaXRlbVNpemUsbio9ZS5pdGVtU2l6ZTtmb3IobGV0IHM9MCxyPXRoaXMuaXRlbVNpemU7czxyO3MrKyl0aGlzLmFycmF5W3Qrc109ZS5hcnJheVtuK3NdO3JldHVybiB0aGlzfWNvcHlBcnJheSh0KXtyZXR1cm4gdGhpcy5hcnJheS5zZXQodCksdGhpc31hcHBseU1hdHJpeDModCl7aWYodGhpcy5pdGVtU2l6ZT09PTIpZm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspVHMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLFRzLmFwcGx5TWF0cml4Myh0KSx0aGlzLnNldFhZKGUsVHMueCxUcy55KTtlbHNlIGlmKHRoaXMuaXRlbVNpemU9PT0zKWZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKXB0LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxwdC5hcHBseU1hdHJpeDModCksdGhpcy5zZXRYWVooZSxwdC54LHB0LnkscHQueik7cmV0dXJuIHRoaXN9YXBwbHlNYXRyaXg0KHQpe2ZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKXB0LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxwdC5hcHBseU1hdHJpeDQodCksdGhpcy5zZXRYWVooZSxwdC54LHB0LnkscHQueik7cmV0dXJuIHRoaXN9YXBwbHlOb3JtYWxNYXRyaXgodCl7Zm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspcHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLHB0LmFwcGx5Tm9ybWFsTWF0cml4KHQpLHRoaXMuc2V0WFlaKGUscHQueCxwdC55LHB0LnopO3JldHVybiB0aGlzfXRyYW5zZm9ybURpcmVjdGlvbih0KXtmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKylwdC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSkscHQudHJhbnNmb3JtRGlyZWN0aW9uKHQpLHRoaXMuc2V0WFlaKGUscHQueCxwdC55LHB0LnopO3JldHVybiB0aGlzfXNldCh0LGU9MCl7cmV0dXJuIHRoaXMuYXJyYXkuc2V0KHQsZSksdGhpc31nZXRDb21wb25lbnQodCxlKXtsZXQgbj10aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZStlXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYobj1WbihuLHRoaXMuYXJyYXkpKSxufXNldENvbXBvbmVudCh0LGUsbil7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKG49a3Qobix0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrZV09bix0aGlzfWdldFgodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemVdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPVZuKGUsdGhpcy5hcnJheSkpLGV9c2V0WCh0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPWt0KGUsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplXT1lLHRoaXN9Z2V0WSh0KXtsZXQgZT10aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsxXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1WbihlLHRoaXMuYXJyYXkpKSxlfXNldFkodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1rdChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsxXT1lLHRoaXN9Z2V0Wih0KXtsZXQgZT10aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsyXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1WbihlLHRoaXMuYXJyYXkpKSxlfXNldFoodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1rdChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsyXT1lLHRoaXN9Z2V0Vyh0KXtsZXQgZT10aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSszXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1WbihlLHRoaXMuYXJyYXkpKSxlfXNldFcodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1rdChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSszXT1lLHRoaXN9c2V0WFkodCxlLG4pe3JldHVybiB0Kj10aGlzLml0ZW1TaXplLHRoaXMubm9ybWFsaXplZCYmKGU9a3QoZSx0aGlzLmFycmF5KSxuPWt0KG4sdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCswXT1lLHRoaXMuYXJyYXlbdCsxXT1uLHRoaXN9c2V0WFlaKHQsZSxuLHMpe3JldHVybiB0Kj10aGlzLml0ZW1TaXplLHRoaXMubm9ybWFsaXplZCYmKGU9a3QoZSx0aGlzLmFycmF5KSxuPWt0KG4sdGhpcy5hcnJheSkscz1rdChzLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QrMF09ZSx0aGlzLmFycmF5W3QrMV09bix0aGlzLmFycmF5W3QrMl09cyx0aGlzfXNldFhZWlcodCxlLG4scyxyKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQmJihlPWt0KGUsdGhpcy5hcnJheSksbj1rdChuLHRoaXMuYXJyYXkpLHM9a3Qocyx0aGlzLmFycmF5KSxyPWt0KHIsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCswXT1lLHRoaXMuYXJyYXlbdCsxXT1uLHRoaXMuYXJyYXlbdCsyXT1zLHRoaXMuYXJyYXlbdCszXT1yLHRoaXN9b25VcGxvYWQodCl7cmV0dXJuIHRoaXMub25VcGxvYWRDYWxsYmFjaz10LHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5hcnJheSx0aGlzLml0ZW1TaXplKS5jb3B5KHRoaXMpfXRvSlNPTigpe2NvbnN0IHQ9e2l0ZW1TaXplOnRoaXMuaXRlbVNpemUsdHlwZTp0aGlzLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsYXJyYXk6QXJyYXkuZnJvbSh0aGlzLmFycmF5KSxub3JtYWxpemVkOnRoaXMubm9ybWFsaXplZH07cmV0dXJuIHRoaXMubmFtZSE9PSIiJiYodC5uYW1lPXRoaXMubmFtZSksdGhpcy51c2FnZSE9PTM1MDQ0JiYodC51c2FnZT10aGlzLnVzYWdlKSx0fX1jbGFzcyB0ZCBleHRlbmRzIHh0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgVWludDE2QXJyYXkodCksZSxuKX19Y2xhc3MgZWQgZXh0ZW5kcyB4dHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IFVpbnQzMkFycmF5KHQpLGUsbil9fWNsYXNzIFJlIGV4dGVuZHMgeHR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBGbG9hdDMyQXJyYXkodCksZSxuKX19bGV0IG5kPTA7Y29uc3Qgc2U9bmV3IHN0LElvPW5ldyBJZSxRbj1uZXcgUCxKdD1uZXcgZ3QsSWk9bmV3IGd0LE10PW5ldyBQO2NsYXNzIEFlIGV4dGVuZHMgZ3N7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNCdWZmZXJHZW9tZXRyeT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpuZCsrfSksdGhpcy51dWlkPW1uKCksdGhpcy5uYW1lPSIiLHRoaXMudHlwZT0iQnVmZmVyR2VvbWV0cnkiLHRoaXMuaW5kZXg9bnVsbCx0aGlzLmluZGlyZWN0PW51bGwsdGhpcy5pbmRpcmVjdE9mZnNldD0wLHRoaXMuYXR0cmlidXRlcz17fSx0aGlzLm1vcnBoQXR0cmlidXRlcz17fSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPSExLHRoaXMuZ3JvdXBzPVtdLHRoaXMuYm91bmRpbmdCb3g9bnVsbCx0aGlzLmJvdW5kaW5nU3BoZXJlPW51bGwsdGhpcy5kcmF3UmFuZ2U9e3N0YXJ0OjAsY291bnQ6MS8wfSx0aGlzLnVzZXJEYXRhPXt9fWdldEluZGV4KCl7cmV0dXJuIHRoaXMuaW5kZXh9c2V0SW5kZXgodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dGhpcy5pbmRleD1uZXcoYmYodCk/ZWQ6dGQpKHQsMSk6dGhpcy5pbmRleD10LHRoaXN9c2V0SW5kaXJlY3QodCxlPTApe3JldHVybiB0aGlzLmluZGlyZWN0PXQsdGhpcy5pbmRpcmVjdE9mZnNldD1lLHRoaXN9Z2V0SW5kaXJlY3QoKXtyZXR1cm4gdGhpcy5pbmRpcmVjdH1nZXRBdHRyaWJ1dGUodCl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1t0XX1zZXRBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW3RdPWUsdGhpc31kZWxldGVBdHRyaWJ1dGUodCl7cmV0dXJuIGRlbGV0ZSB0aGlzLmF0dHJpYnV0ZXNbdF0sdGhpc31oYXNBdHRyaWJ1dGUodCl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1t0XSE9PXZvaWQgMH1hZGRHcm91cCh0LGUsbj0wKXt0aGlzLmdyb3Vwcy5wdXNoKHtzdGFydDp0LGNvdW50OmUsbWF0ZXJpYWxJbmRleDpufSl9Y2xlYXJHcm91cHMoKXt0aGlzLmdyb3Vwcz1bXX1zZXREcmF3UmFuZ2UodCxlKXt0aGlzLmRyYXdSYW5nZS5zdGFydD10LHRoaXMuZHJhd1JhbmdlLmNvdW50PWV9YXBwbHlNYXRyaXg0KHQpe2NvbnN0IGU9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uO2UhPT12b2lkIDAmJihlLmFwcGx5TWF0cml4NCh0KSxlLm5lZWRzVXBkYXRlPSEwKTtjb25zdCBuPXRoaXMuYXR0cmlidXRlcy5ub3JtYWw7aWYobiE9PXZvaWQgMCl7Y29uc3Qgcj1uZXcgTWUoKS5nZXROb3JtYWxNYXRyaXgodCk7bi5hcHBseU5vcm1hbE1hdHJpeChyKSxuLm5lZWRzVXBkYXRlPSEwfWNvbnN0IHM9dGhpcy5hdHRyaWJ1dGVzLnRhbmdlbnQ7cmV0dXJuIHMhPT12b2lkIDAmJihzLnRyYW5zZm9ybURpcmVjdGlvbih0KSxzLm5lZWRzVXBkYXRlPSEwKSx0aGlzLmJvdW5kaW5nQm94IT09bnVsbCYmdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKSx0aGlzLmJvdW5kaW5nU3BoZXJlIT09bnVsbCYmdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSx0aGlzfWFwcGx5UXVhdGVybmlvbih0KXtyZXR1cm4gc2UubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24odCksdGhpcy5hcHBseU1hdHJpeDQoc2UpLHRoaXN9cm90YXRlWCh0KXtyZXR1cm4gc2UubWFrZVJvdGF0aW9uWCh0KSx0aGlzLmFwcGx5TWF0cml4NChzZSksdGhpc31yb3RhdGVZKHQpe3JldHVybiBzZS5tYWtlUm90YXRpb25ZKHQpLHRoaXMuYXBwbHlNYXRyaXg0KHNlKSx0aGlzfXJvdGF0ZVoodCl7cmV0dXJuIHNlLm1ha2VSb3RhdGlvbloodCksdGhpcy5hcHBseU1hdHJpeDQoc2UpLHRoaXN9dHJhbnNsYXRlKHQsZSxuKXtyZXR1cm4gc2UubWFrZVRyYW5zbGF0aW9uKHQsZSxuKSx0aGlzLmFwcGx5TWF0cml4NChzZSksdGhpc31zY2FsZSh0LGUsbil7cmV0dXJuIHNlLm1ha2VTY2FsZSh0LGUsbiksdGhpcy5hcHBseU1hdHJpeDQoc2UpLHRoaXN9bG9va0F0KHQpe3JldHVybiBJby5sb29rQXQodCksSW8udXBkYXRlTWF0cml4KCksdGhpcy5hcHBseU1hdHJpeDQoSW8ubWF0cml4KSx0aGlzfWNlbnRlcigpe3JldHVybiB0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpLHRoaXMuYm91bmRpbmdCb3guZ2V0Q2VudGVyKFFuKS5uZWdhdGUoKSx0aGlzLnRyYW5zbGF0ZShRbi54LFFuLnksUW4ueiksdGhpc31zZXRGcm9tUG9pbnRzKHQpe2NvbnN0IGU9dGhpcy5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7aWYoZT09PXZvaWQgMCl7Y29uc3Qgbj1bXTtmb3IobGV0IHM9MCxyPXQubGVuZ3RoO3M8cjtzKyspe2NvbnN0IG89dFtzXTtuLnB1c2goby54LG8ueSxvLnp8fDApfXRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFJlKG4sMykpfWVsc2V7Y29uc3Qgbj1NYXRoLm1pbih0Lmxlbmd0aCxlLmNvdW50KTtmb3IobGV0IHM9MDtzPG47cysrKXtjb25zdCByPXRbc107ZS5zZXRYWVoocyxyLngsci55LHIuenx8MCl9dC5sZW5ndGg+ZS5jb3VudCYmYnQoIkJ1ZmZlckdlb21ldHJ5OiBCdWZmZXIgc2l6ZSB0b28gc21hbGwgZm9yIHBvaW50cyBkYXRhLiBVc2UgLmRpc3Bvc2UoKSBhbmQgY3JlYXRlIGEgbmV3IGdlb21ldHJ5LiIpLGUubmVlZHNVcGRhdGU9ITB9cmV0dXJuIHRoaXN9Y29tcHV0ZUJvdW5kaW5nQm94KCl7dGhpcy5ib3VuZGluZ0JveD09PW51bGwmJih0aGlzLmJvdW5kaW5nQm94PW5ldyBndCk7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24sZT10aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtpZih0JiZ0LmlzR0xCdWZmZXJBdHRyaWJ1dGUpe3luKCJCdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTogR0xCdWZmZXJBdHRyaWJ1dGUgcmVxdWlyZXMgYSBtYW51YWwgYm91bmRpbmcgYm94LiIsdGhpcyksdGhpcy5ib3VuZGluZ0JveC5zZXQobmV3IFAoLTEvMCwtMS8wLC0xLzApLG5ldyBQKDEvMCwxLzAsMS8wKSk7cmV0dXJufWlmKHQhPT12b2lkIDApe2lmKHRoaXMuYm91bmRpbmdCb3guc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSh0KSxlKWZvcihsZXQgbj0wLHM9ZS5sZW5ndGg7bjxzO24rKyl7Y29uc3Qgcj1lW25dO0p0LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUociksdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT8oTXQuYWRkVmVjdG9ycyh0aGlzLmJvdW5kaW5nQm94Lm1pbixKdC5taW4pLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChNdCksTXQuYWRkVmVjdG9ycyh0aGlzLmJvdW5kaW5nQm94Lm1heCxKdC5tYXgpLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChNdCkpOih0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoSnQubWluKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoSnQubWF4KSl9fWVsc2UgdGhpcy5ib3VuZGluZ0JveC5tYWtlRW1wdHkoKTsoaXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueCl8fGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLnkpfHxpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi56KSkmJnluKCdCdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTogQ29tcHV0ZWQgbWluL21heCBoYXZlIE5hTiB2YWx1ZXMuIFRoZSAicG9zaXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsdGhpcyl9Y29tcHV0ZUJvdW5kaW5nU3BoZXJlKCl7dGhpcy5ib3VuZGluZ1NwaGVyZT09PW51bGwmJih0aGlzLmJvdW5kaW5nU3BoZXJlPW5ldyBaYyk7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24sZT10aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtpZih0JiZ0LmlzR0xCdWZmZXJBdHRyaWJ1dGUpe3luKCJCdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogR0xCdWZmZXJBdHRyaWJ1dGUgcmVxdWlyZXMgYSBtYW51YWwgYm91bmRpbmcgc3BoZXJlLiIsdGhpcyksdGhpcy5ib3VuZGluZ1NwaGVyZS5zZXQobmV3IFAsMS8wKTtyZXR1cm59aWYodCl7Y29uc3Qgbj10aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlcjtpZihKdC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHQpLGUpZm9yKGxldCByPTAsbz1lLmxlbmd0aDtyPG87cisrKXtjb25zdCBhPWVbcl07SWkuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShhKSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPyhNdC5hZGRWZWN0b3JzKEp0Lm1pbixJaS5taW4pLEp0LmV4cGFuZEJ5UG9pbnQoTXQpLE10LmFkZFZlY3RvcnMoSnQubWF4LElpLm1heCksSnQuZXhwYW5kQnlQb2ludChNdCkpOihKdC5leHBhbmRCeVBvaW50KElpLm1pbiksSnQuZXhwYW5kQnlQb2ludChJaS5tYXgpKX1KdC5nZXRDZW50ZXIobik7bGV0IHM9MDtmb3IobGV0IHI9MCxvPXQuY291bnQ7cjxvO3IrKylNdC5mcm9tQnVmZmVyQXR0cmlidXRlKHQscikscz1NYXRoLm1heChzLG4uZGlzdGFuY2VUb1NxdWFyZWQoTXQpKTtpZihlKWZvcihsZXQgcj0wLG89ZS5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT1lW3JdLGM9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZTtmb3IobGV0IGw9MCxoPWEuY291bnQ7bDxoO2wrKylNdC5mcm9tQnVmZmVyQXR0cmlidXRlKGEsbCksYyYmKFFuLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxsKSxNdC5hZGQoUW4pKSxzPU1hdGgubWF4KHMsbi5kaXN0YW5jZVRvU3F1YXJlZChNdCkpfXRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzPU1hdGguc3FydChzKSxpc05hTih0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cykmJnluKCdCdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogQ29tcHV0ZWQgcmFkaXVzIGlzIE5hTi4gVGhlICJwb3NpdGlvbiIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJyx0aGlzKX19Y29tcHV0ZVRhbmdlbnRzKCl7Y29uc3QgdD10aGlzLmluZGV4LGU9dGhpcy5hdHRyaWJ1dGVzO2lmKHQ9PT1udWxsfHxlLnBvc2l0aW9uPT09dm9pZCAwfHxlLm5vcm1hbD09PXZvaWQgMHx8ZS51dj09PXZvaWQgMCl7eW4oIkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgZmFpbGVkLiBNaXNzaW5nIHJlcXVpcmVkIGF0dHJpYnV0ZXMgKGluZGV4LCBwb3NpdGlvbiwgbm9ybWFsIG9yIHV2KSIpO3JldHVybn1jb25zdCBuPWUucG9zaXRpb24scz1lLm5vcm1hbCxyPWUudXY7dGhpcy5oYXNBdHRyaWJ1dGUoInRhbmdlbnQiKT09PSExJiZ0aGlzLnNldEF0dHJpYnV0ZSgidGFuZ2VudCIsbmV3IHh0KG5ldyBGbG9hdDMyQXJyYXkoNCpuLmNvdW50KSw0KSk7Y29uc3Qgbz10aGlzLmdldEF0dHJpYnV0ZSgidGFuZ2VudCIpLGE9W10sYz1bXTtmb3IobGV0IHY9MDt2PG4uY291bnQ7disrKWFbdl09bmV3IFAsY1t2XT1uZXcgUDtjb25zdCBsPW5ldyBQLGg9bmV3IFAsdT1uZXcgUCxmPW5ldyBrLGQ9bmV3IGsscD1uZXcgayx5PW5ldyBQLGc9bmV3IFA7ZnVuY3Rpb24gdyh2LF8sVCl7bC5mcm9tQnVmZmVyQXR0cmlidXRlKG4sdiksaC5mcm9tQnVmZmVyQXR0cmlidXRlKG4sXyksdS5mcm9tQnVmZmVyQXR0cmlidXRlKG4sVCksZi5mcm9tQnVmZmVyQXR0cmlidXRlKHIsdiksZC5mcm9tQnVmZmVyQXR0cmlidXRlKHIsXykscC5mcm9tQnVmZmVyQXR0cmlidXRlKHIsVCksaC5zdWIobCksdS5zdWIobCksZC5zdWIoZikscC5zdWIoZik7Y29uc3Qgej0xLyhkLngqcC55LXAueCpkLnkpO2lzRmluaXRlKHopJiYoeS5jb3B5KGgpLm11bHRpcGx5U2NhbGFyKHAueSkuYWRkU2NhbGVkVmVjdG9yKHUsLWQueSkubXVsdGlwbHlTY2FsYXIoeiksZy5jb3B5KHUpLm11bHRpcGx5U2NhbGFyKGQueCkuYWRkU2NhbGVkVmVjdG9yKGgsLXAueCkubXVsdGlwbHlTY2FsYXIoeiksYVt2XS5hZGQoeSksYVtfXS5hZGQoeSksYVtUXS5hZGQoeSksY1t2XS5hZGQoZyksY1tfXS5hZGQoZyksY1tUXS5hZGQoZykpfWxldCBiPXRoaXMuZ3JvdXBzO2IubGVuZ3RoPT09MCYmKGI9W3tzdGFydDowLGNvdW50OnQuY291bnR9XSk7Zm9yKGxldCB2PTAsXz1iLmxlbmd0aDt2PF87Kyt2KXtjb25zdCBUPWJbdl0sej1ULnN0YXJ0LEM9VC5jb3VudDtmb3IobGV0IEU9eixGPXorQztFPEY7RSs9Myl3KHQuZ2V0WChFKzApLHQuZ2V0WChFKzEpLHQuZ2V0WChFKzIpKX1jb25zdCB4PW5ldyBQLG09bmV3IFAsTT1uZXcgUCxTPW5ldyBQO2Z1bmN0aW9uIEEodil7TS5mcm9tQnVmZmVyQXR0cmlidXRlKHMsdiksUy5jb3B5KE0pO2NvbnN0IF89YVt2XTt4LmNvcHkoXykseC5zdWIoTS5tdWx0aXBseVNjYWxhcihNLmRvdChfKSkpLm5vcm1hbGl6ZSgpLG0uY3Jvc3NWZWN0b3JzKFMsXyk7Y29uc3Qgej1tLmRvdChjW3ZdKTwwPy0xOjE7by5zZXRYWVpXKHYseC54LHgueSx4Lnoseil9Zm9yKGxldCB2PTAsXz1iLmxlbmd0aDt2PF87Kyt2KXtjb25zdCBUPWJbdl0sej1ULnN0YXJ0LEM9VC5jb3VudDtmb3IobGV0IEU9eixGPXorQztFPEY7RSs9MylBKHQuZ2V0WChFKzApKSxBKHQuZ2V0WChFKzEpKSxBKHQuZ2V0WChFKzIpKX19Y29tcHV0ZVZlcnRleE5vcm1hbHMoKXtjb25zdCB0PXRoaXMuaW5kZXgsZT10aGlzLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtpZihlIT09dm9pZCAwKXtsZXQgbj10aGlzLmdldEF0dHJpYnV0ZSgibm9ybWFsIik7aWYobj09PXZvaWQgMCluPW5ldyB4dChuZXcgRmxvYXQzMkFycmF5KGUuY291bnQqMyksMyksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbik7ZWxzZSBmb3IobGV0IGY9MCxkPW4uY291bnQ7ZjxkO2YrKyluLnNldFhZWihmLDAsMCwwKTtjb25zdCBzPW5ldyBQLHI9bmV3IFAsbz1uZXcgUCxhPW5ldyBQLGM9bmV3IFAsbD1uZXcgUCxoPW5ldyBQLHU9bmV3IFA7aWYodClmb3IobGV0IGY9MCxkPXQuY291bnQ7ZjxkO2YrPTMpe2NvbnN0IHA9dC5nZXRYKGYrMCkseT10LmdldFgoZisxKSxnPXQuZ2V0WChmKzIpO3MuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHApLHIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHkpLG8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLGcpLGguc3ViVmVjdG9ycyhvLHIpLHUuc3ViVmVjdG9ycyhzLHIpLGguY3Jvc3ModSksYS5mcm9tQnVmZmVyQXR0cmlidXRlKG4scCksYy5mcm9tQnVmZmVyQXR0cmlidXRlKG4seSksbC5mcm9tQnVmZmVyQXR0cmlidXRlKG4sZyksYS5hZGQoaCksYy5hZGQoaCksbC5hZGQoaCksbi5zZXRYWVoocCxhLngsYS55LGEueiksbi5zZXRYWVooeSxjLngsYy55LGMueiksbi5zZXRYWVooZyxsLngsbC55LGwueil9ZWxzZSBmb3IobGV0IGY9MCxkPWUuY291bnQ7ZjxkO2YrPTMpcy5mcm9tQnVmZmVyQXR0cmlidXRlKGUsZiswKSxyLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxmKzEpLG8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLGYrMiksaC5zdWJWZWN0b3JzKG8sciksdS5zdWJWZWN0b3JzKHMsciksaC5jcm9zcyh1KSxuLnNldFhZWihmKzAsaC54LGgueSxoLnopLG4uc2V0WFlaKGYrMSxoLngsaC55LGgueiksbi5zZXRYWVooZisyLGgueCxoLnksaC56KTt0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKSxuLm5lZWRzVXBkYXRlPSEwfX1ub3JtYWxpemVOb3JtYWxzKCl7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMubm9ybWFsO2ZvcihsZXQgZT0wLG49dC5jb3VudDtlPG47ZSsrKU10LmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSxNdC5ub3JtYWxpemUoKSx0LnNldFhZWihlLE10LngsTXQueSxNdC56KX10b05vbkluZGV4ZWQoKXtmdW5jdGlvbiB0KGEsYyl7Y29uc3QgbD1hLmFycmF5LGg9YS5pdGVtU2l6ZSx1PWEubm9ybWFsaXplZCxmPW5ldyBsLmNvbnN0cnVjdG9yKGMubGVuZ3RoKmgpO2xldCBkPTAscD0wO2ZvcihsZXQgeT0wLGc9Yy5sZW5ndGg7eTxnO3krKyl7YS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlP2Q9Y1t5XSphLmRhdGEuc3RyaWRlK2Eub2Zmc2V0OmQ9Y1t5XSpoO2ZvcihsZXQgdz0wO3c8aDt3KyspZltwKytdPWxbZCsrXX1yZXR1cm4gbmV3IHh0KGYsaCx1KX1pZih0aGlzLmluZGV4PT09bnVsbClyZXR1cm4gYnQoIkJ1ZmZlckdlb21ldHJ5LnRvTm9uSW5kZXhlZCgpOiBCdWZmZXJHZW9tZXRyeSBpcyBhbHJlYWR5IG5vbi1pbmRleGVkLiIpLHRoaXM7Y29uc3QgZT1uZXcgQWUsbj10aGlzLmluZGV4LmFycmF5LHM9dGhpcy5hdHRyaWJ1dGVzO2Zvcihjb25zdCBhIGluIHMpe2NvbnN0IGM9c1thXSxsPXQoYyxuKTtlLnNldEF0dHJpYnV0ZShhLGwpfWNvbnN0IHI9dGhpcy5tb3JwaEF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGEgaW4gcil7Y29uc3QgYz1bXSxsPXJbYV07Zm9yKGxldCBoPTAsdT1sLmxlbmd0aDtoPHU7aCsrKXtjb25zdCBmPWxbaF0sZD10KGYsbik7Yy5wdXNoKGQpfWUubW9ycGhBdHRyaWJ1dGVzW2FdPWN9ZS5tb3JwaFRhcmdldHNSZWxhdGl2ZT10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO2NvbnN0IG89dGhpcy5ncm91cHM7Zm9yKGxldCBhPTAsYz1vLmxlbmd0aDthPGM7YSsrKXtjb25zdCBsPW9bYV07ZS5hZGRHcm91cChsLnN0YXJ0LGwuY291bnQsbC5tYXRlcmlhbEluZGV4KX1yZXR1cm4gZX10b0pTT04oKXtjb25zdCB0PXttZXRhZGF0YTp7dmVyc2lvbjo0LjcsdHlwZToiQnVmZmVyR2VvbWV0cnkiLGdlbmVyYXRvcjoiQnVmZmVyR2VvbWV0cnkudG9KU09OIn19O2lmKHQudXVpZD10aGlzLnV1aWQsdC50eXBlPXRoaXMudHlwZSx0aGlzLm5hbWUhPT0iIiYmKHQubmFtZT10aGlzLm5hbWUpLE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aD4wJiYodC51c2VyRGF0YT10aGlzLnVzZXJEYXRhKSx0aGlzLnBhcmFtZXRlcnMhPT12b2lkIDApe2NvbnN0IGM9dGhpcy5wYXJhbWV0ZXJzO2Zvcihjb25zdCBsIGluIGMpY1tsXSE9PXZvaWQgMCYmKHRbbF09Y1tsXSk7cmV0dXJuIHR9dC5kYXRhPXthdHRyaWJ1dGVzOnt9fTtjb25zdCBlPXRoaXMuaW5kZXg7ZSE9PW51bGwmJih0LmRhdGEuaW5kZXg9e3R5cGU6ZS5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLGFycmF5OkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUuYXJyYXkpfSk7Y29uc3Qgbj10aGlzLmF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGMgaW4gbil7Y29uc3QgbD1uW2NdO3QuZGF0YS5hdHRyaWJ1dGVzW2NdPWwudG9KU09OKHQuZGF0YSl9Y29uc3Qgcz17fTtsZXQgcj0hMTtmb3IoY29uc3QgYyBpbiB0aGlzLm1vcnBoQXR0cmlidXRlcyl7Y29uc3QgbD10aGlzLm1vcnBoQXR0cmlidXRlc1tjXSxoPVtdO2ZvcihsZXQgdT0wLGY9bC5sZW5ndGg7dTxmO3UrKyl7Y29uc3QgZD1sW3VdO2gucHVzaChkLnRvSlNPTih0LmRhdGEpKX1oLmxlbmd0aD4wJiYoc1tjXT1oLHI9ITApfXImJih0LmRhdGEubW9ycGhBdHRyaWJ1dGVzPXMsdC5kYXRhLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPXRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmUpO2NvbnN0IG89dGhpcy5ncm91cHM7by5sZW5ndGg+MCYmKHQuZGF0YS5ncm91cHM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvKSkpO2NvbnN0IGE9dGhpcy5ib3VuZGluZ1NwaGVyZTtyZXR1cm4gYSE9PW51bGwmJih0LmRhdGEuYm91bmRpbmdTcGhlcmU9YS50b0pTT04oKSksdH1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9Y29weSh0KXt0aGlzLmluZGV4PW51bGwsdGhpcy5hdHRyaWJ1dGVzPXt9LHRoaXMubW9ycGhBdHRyaWJ1dGVzPXt9LHRoaXMuZ3JvdXBzPVtdLHRoaXMuYm91bmRpbmdCb3g9bnVsbCx0aGlzLmJvdW5kaW5nU3BoZXJlPW51bGw7Y29uc3QgZT17fTt0aGlzLm5hbWU9dC5uYW1lO2NvbnN0IG49dC5pbmRleDtuIT09bnVsbCYmdGhpcy5zZXRJbmRleChuLmNsb25lKCkpO2NvbnN0IHM9dC5hdHRyaWJ1dGVzO2Zvcihjb25zdCBsIGluIHMpe2NvbnN0IGg9c1tsXTt0aGlzLnNldEF0dHJpYnV0ZShsLGguY2xvbmUoZSkpfWNvbnN0IHI9dC5tb3JwaEF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGwgaW4gcil7Y29uc3QgaD1bXSx1PXJbbF07Zm9yKGxldCBmPTAsZD11Lmxlbmd0aDtmPGQ7ZisrKWgucHVzaCh1W2ZdLmNsb25lKGUpKTt0aGlzLm1vcnBoQXR0cmlidXRlc1tsXT1ofXRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU9dC5tb3JwaFRhcmdldHNSZWxhdGl2ZTtjb25zdCBvPXQuZ3JvdXBzO2ZvcihsZXQgbD0wLGg9by5sZW5ndGg7bDxoO2wrKyl7Y29uc3QgdT1vW2xdO3RoaXMuYWRkR3JvdXAodS5zdGFydCx1LmNvdW50LHUubWF0ZXJpYWxJbmRleCl9Y29uc3QgYT10LmJvdW5kaW5nQm94O2EhPT1udWxsJiYodGhpcy5ib3VuZGluZ0JveD1hLmNsb25lKCkpO2NvbnN0IGM9dC5ib3VuZGluZ1NwaGVyZTtyZXR1cm4gYyE9PW51bGwmJih0aGlzLmJvdW5kaW5nU3BoZXJlPWMuY2xvbmUoKSksdGhpcy5kcmF3UmFuZ2Uuc3RhcnQ9dC5kcmF3UmFuZ2Uuc3RhcnQsdGhpcy5kcmF3UmFuZ2UuY291bnQ9dC5kcmF3UmFuZ2UuY291bnQsdGhpcy51c2VyRGF0YT10LnVzZXJEYXRhLHRoaXN9ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19Y29uc3QgZWw9bmV3IHN0LGJuPW5ldyBTbyxQcz1uZXcgWmMsbmw9bmV3IFAsQ3M9bmV3IFAsRXM9bmV3IFAsQnM9bmV3IFAsa289bmV3IFAsRnM9bmV3IFAsaWw9bmV3IFAsSXM9bmV3IFA7Y2xhc3MgaWQgZXh0ZW5kcyBJZXtjb25zdHJ1Y3Rvcih0PW5ldyBBZSxlPW5ldyBRZil7c3VwZXIoKSx0aGlzLmlzTWVzaD0hMCx0aGlzLnR5cGU9Ik1lc2giLHRoaXMuZ2VvbWV0cnk9dCx0aGlzLm1hdGVyaWFsPWUsdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9dm9pZCAwLHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPXZvaWQgMCx0aGlzLmNvdW50PTEsdGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX1jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyE9PXZvaWQgMCYmKHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPXQubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnNsaWNlKCkpLHQubW9ycGhUYXJnZXREaWN0aW9uYXJ5IT09dm9pZCAwJiYodGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9T2JqZWN0LmFzc2lnbih7fSx0Lm1vcnBoVGFyZ2V0RGljdGlvbmFyeSkpLHRoaXMubWF0ZXJpYWw9QXJyYXkuaXNBcnJheSh0Lm1hdGVyaWFsKT90Lm1hdGVyaWFsLnNsaWNlKCk6dC5tYXRlcmlhbCx0aGlzLmdlb21ldHJ5PXQuZ2VvbWV0cnksdGhpc311cGRhdGVNb3JwaFRhcmdldHMoKXtjb25zdCBlPXRoaXMuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLG49T2JqZWN0LmtleXMoZSk7aWYobi5sZW5ndGg+MCl7Y29uc3Qgcz1lW25bMF1dO2lmKHMhPT12b2lkIDApe3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPVtdLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PXt9O2ZvcihsZXQgcj0wLG89cy5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT1zW3JdLm5hbWV8fFN0cmluZyhyKTt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKDApLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5W2FdPXJ9fX19Z2V0VmVydGV4UG9zaXRpb24odCxlKXtjb25zdCBuPXRoaXMuZ2VvbWV0cnkscz1uLmF0dHJpYnV0ZXMucG9zaXRpb24scj1uLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbixvPW4ubW9ycGhUYXJnZXRzUmVsYXRpdmU7ZS5mcm9tQnVmZmVyQXR0cmlidXRlKHMsdCk7Y29uc3QgYT10aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcztpZihyJiZhKXtGcy5zZXQoMCwwLDApO2ZvcihsZXQgYz0wLGw9ci5sZW5ndGg7YzxsO2MrKyl7Y29uc3QgaD1hW2NdLHU9cltjXTtoIT09MCYmKGtvLmZyb21CdWZmZXJBdHRyaWJ1dGUodSx0KSxvP0ZzLmFkZFNjYWxlZFZlY3RvcihrbyxoKTpGcy5hZGRTY2FsZWRWZWN0b3Ioa28uc3ViKGUpLGgpKX1lLmFkZChGcyl9cmV0dXJuIGV9cmF5Y2FzdCh0LGUpe2NvbnN0IG49dGhpcy5nZW9tZXRyeSxzPXRoaXMubWF0ZXJpYWwscj10aGlzLm1hdHJpeFdvcmxkO3MhPT12b2lkIDAmJihuLmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmbi5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxQcy5jb3B5KG4uYm91bmRpbmdTcGhlcmUpLFBzLmFwcGx5TWF0cml4NChyKSxibi5jb3B5KHQucmF5KS5yZWNhc3QodC5uZWFyKSwhKFBzLmNvbnRhaW5zUG9pbnQoYm4ub3JpZ2luKT09PSExJiYoYm4uaW50ZXJzZWN0U3BoZXJlKFBzLG5sKT09PW51bGx8fGJuLm9yaWdpbi5kaXN0YW5jZVRvU3F1YXJlZChubCk+emkodC5mYXItdC5uZWFyLDIpKSkmJihlbC5jb3B5KHIpLmludmVydCgpLGJuLmNvcHkodC5yYXkpLmFwcGx5TWF0cml4NChlbCksIShuLmJvdW5kaW5nQm94IT09bnVsbCYmYm4uaW50ZXJzZWN0c0JveChuLmJvdW5kaW5nQm94KT09PSExKSYmdGhpcy5fY29tcHV0ZUludGVyc2VjdGlvbnModCxlLGJuKSkpfV9jb21wdXRlSW50ZXJzZWN0aW9ucyh0LGUsbil7bGV0IHM7Y29uc3Qgcj10aGlzLmdlb21ldHJ5LG89dGhpcy5tYXRlcmlhbCxhPXIuaW5kZXgsYz1yLmF0dHJpYnV0ZXMucG9zaXRpb24sbD1yLmF0dHJpYnV0ZXMudXYsaD1yLmF0dHJpYnV0ZXMudXYxLHU9ci5hdHRyaWJ1dGVzLm5vcm1hbCxmPXIuZ3JvdXBzLGQ9ci5kcmF3UmFuZ2U7aWYoYSE9PW51bGwpaWYoQXJyYXkuaXNBcnJheShvKSlmb3IobGV0IHA9MCx5PWYubGVuZ3RoO3A8eTtwKyspe2NvbnN0IGc9ZltwXSx3PW9bZy5tYXRlcmlhbEluZGV4XSxiPU1hdGgubWF4KGcuc3RhcnQsZC5zdGFydCkseD1NYXRoLm1pbihhLmNvdW50LE1hdGgubWluKGcuc3RhcnQrZy5jb3VudCxkLnN0YXJ0K2QuY291bnQpKTtmb3IobGV0IG09YixNPXg7bTxNO20rPTMpe2NvbnN0IFM9YS5nZXRYKG0pLEE9YS5nZXRYKG0rMSksdj1hLmdldFgobSsyKTtzPWtzKHRoaXMsdyx0LG4sbCxoLHUsUyxBLHYpLHMmJihzLmZhY2VJbmRleD1NYXRoLmZsb29yKG0vMykscy5mYWNlLm1hdGVyaWFsSW5kZXg9Zy5tYXRlcmlhbEluZGV4LGUucHVzaChzKSl9fWVsc2V7Y29uc3QgcD1NYXRoLm1heCgwLGQuc3RhcnQpLHk9TWF0aC5taW4oYS5jb3VudCxkLnN0YXJ0K2QuY291bnQpO2ZvcihsZXQgZz1wLHc9eTtnPHc7Zys9Myl7Y29uc3QgYj1hLmdldFgoZykseD1hLmdldFgoZysxKSxtPWEuZ2V0WChnKzIpO3M9a3ModGhpcyxvLHQsbixsLGgsdSxiLHgsbSkscyYmKHMuZmFjZUluZGV4PU1hdGguZmxvb3IoZy8zKSxlLnB1c2gocykpfX1lbHNlIGlmKGMhPT12b2lkIDApaWYoQXJyYXkuaXNBcnJheShvKSlmb3IobGV0IHA9MCx5PWYubGVuZ3RoO3A8eTtwKyspe2NvbnN0IGc9ZltwXSx3PW9bZy5tYXRlcmlhbEluZGV4XSxiPU1hdGgubWF4KGcuc3RhcnQsZC5zdGFydCkseD1NYXRoLm1pbihjLmNvdW50LE1hdGgubWluKGcuc3RhcnQrZy5jb3VudCxkLnN0YXJ0K2QuY291bnQpKTtmb3IobGV0IG09YixNPXg7bTxNO20rPTMpe2NvbnN0IFM9bSxBPW0rMSx2PW0rMjtzPWtzKHRoaXMsdyx0LG4sbCxoLHUsUyxBLHYpLHMmJihzLmZhY2VJbmRleD1NYXRoLmZsb29yKG0vMykscy5mYWNlLm1hdGVyaWFsSW5kZXg9Zy5tYXRlcmlhbEluZGV4LGUucHVzaChzKSl9fWVsc2V7Y29uc3QgcD1NYXRoLm1heCgwLGQuc3RhcnQpLHk9TWF0aC5taW4oYy5jb3VudCxkLnN0YXJ0K2QuY291bnQpO2ZvcihsZXQgZz1wLHc9eTtnPHc7Zys9Myl7Y29uc3QgYj1nLHg9ZysxLG09ZysyO3M9a3ModGhpcyxvLHQsbixsLGgsdSxiLHgsbSkscyYmKHMuZmFjZUluZGV4PU1hdGguZmxvb3IoZy8zKSxlLnB1c2gocykpfX19fWZ1bmN0aW9uIHNkKGksdCxlLG4scyxyLG8sYSl7bGV0IGM7aWYodC5zaWRlPT09MT9jPW4uaW50ZXJzZWN0VHJpYW5nbGUobyxyLHMsITAsYSk6Yz1uLmludGVyc2VjdFRyaWFuZ2xlKHMscixvLHQuc2lkZT09PTAsYSksYz09PW51bGwpcmV0dXJuIG51bGw7SXMuY29weShhKSxJcy5hcHBseU1hdHJpeDQoaS5tYXRyaXhXb3JsZCk7Y29uc3QgbD1lLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhJcyk7cmV0dXJuIGw8ZS5uZWFyfHxsPmUuZmFyP251bGw6e2Rpc3RhbmNlOmwscG9pbnQ6SXMuY2xvbmUoKSxvYmplY3Q6aX19ZnVuY3Rpb24ga3MoaSx0LGUsbixzLHIsbyxhLGMsbCl7aS5nZXRWZXJ0ZXhQb3NpdGlvbihhLENzKSxpLmdldFZlcnRleFBvc2l0aW9uKGMsRXMpLGkuZ2V0VmVydGV4UG9zaXRpb24obCxCcyk7Y29uc3QgaD1zZChpLHQsZSxuLENzLEVzLEJzLGlsKTtpZihoKXtjb25zdCB1PW5ldyBQO2V0LmdldEJhcnljb29yZChpbCxDcyxFcyxCcyx1KSxzJiYoaC51dj1ldC5nZXRJbnRlcnBvbGF0ZWRBdHRyaWJ1dGUocyxhLGMsbCx1LG5ldyBrKSksciYmKGgudXYxPWV0LmdldEludGVycG9sYXRlZEF0dHJpYnV0ZShyLGEsYyxsLHUsbmV3IGspKSxvJiYoaC5ub3JtYWw9ZXQuZ2V0SW50ZXJwb2xhdGVkQXR0cmlidXRlKG8sYSxjLGwsdSxuZXcgUCksaC5ub3JtYWwuZG90KG4uZGlyZWN0aW9uKT4wJiZoLm5vcm1hbC5tdWx0aXBseVNjYWxhcigtMSkpO2NvbnN0IGY9e2EsYjpjLGM6bCxub3JtYWw6bmV3IFAsbWF0ZXJpYWxJbmRleDowfTtldC5nZXROb3JtYWwoQ3MsRXMsQnMsZi5ub3JtYWwpLGguZmFjZT1mLGguYmFyeWNvb3JkPXV9cmV0dXJuIGh9Y29uc3QgTm89bmV3IFAscmQ9bmV3IFAsb2Q9bmV3IE1lO2NsYXNzIFJve2NvbnN0cnVjdG9yKHQ9bmV3IFAoMSwwLDApLGU9MCl7dGhpcy5pc1BsYW5lPSEwLHRoaXMubm9ybWFsPXQsdGhpcy5jb25zdGFudD1lfXNldCh0LGUpe3JldHVybiB0aGlzLm5vcm1hbC5jb3B5KHQpLHRoaXMuY29uc3RhbnQ9ZSx0aGlzfXNldENvbXBvbmVudHModCxlLG4scyl7cmV0dXJuIHRoaXMubm9ybWFsLnNldCh0LGUsbiksdGhpcy5jb25zdGFudD1zLHRoaXN9c2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWwuY29weSh0KSx0aGlzLmNvbnN0YW50PS1lLmRvdCh0aGlzLm5vcm1hbCksdGhpc31zZXRGcm9tQ29wbGFuYXJQb2ludHModCxlLG4pe2NvbnN0IHM9Tm8uc3ViVmVjdG9ycyhuLGUpLmNyb3NzKHJkLnN1YlZlY3RvcnModCxlKSkubm9ybWFsaXplKCk7cmV0dXJuIHRoaXMuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQocyx0KSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMubm9ybWFsLmNvcHkodC5ub3JtYWwpLHRoaXMuY29uc3RhbnQ9dC5jb25zdGFudCx0aGlzfW5vcm1hbGl6ZSgpe2NvbnN0IHQ9MS90aGlzLm5vcm1hbC5sZW5ndGgoKTtyZXR1cm4gdGhpcy5ub3JtYWwubXVsdGlwbHlTY2FsYXIodCksdGhpcy5jb25zdGFudCo9dCx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLmNvbnN0YW50Kj0tMSx0aGlzLm5vcm1hbC5uZWdhdGUoKSx0aGlzfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdGhpcy5ub3JtYWwuZG90KHQpK3RoaXMuY29uc3RhbnR9ZGlzdGFuY2VUb1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQodC5jZW50ZXIpLXQucmFkaXVzfXByb2plY3RQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodCkuYWRkU2NhbGVkVmVjdG9yKHRoaXMubm9ybWFsLC10aGlzLmRpc3RhbmNlVG9Qb2ludCh0KSl9aW50ZXJzZWN0TGluZSh0LGUpe2NvbnN0IG49dC5kZWx0YShObykscz10aGlzLm5vcm1hbC5kb3Qobik7aWYocz09PTApcmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KHQuc3RhcnQpPT09MD9lLmNvcHkodC5zdGFydCk6bnVsbDtjb25zdCByPS0odC5zdGFydC5kb3QodGhpcy5ub3JtYWwpK3RoaXMuY29uc3RhbnQpL3M7cmV0dXJuIHI8MHx8cj4xP251bGw6ZS5jb3B5KHQuc3RhcnQpLmFkZFNjYWxlZFZlY3RvcihuLHIpfWludGVyc2VjdHNMaW5lKHQpe2NvbnN0IGU9dGhpcy5kaXN0YW5jZVRvUG9pbnQodC5zdGFydCksbj10aGlzLmRpc3RhbmNlVG9Qb2ludCh0LmVuZCk7cmV0dXJuIGU8MCYmbj4wfHxuPDAmJmU+MH1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1jb3BsYW5hclBvaW50KHQpe3JldHVybiB0LmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmNvbnN0YW50KX1hcHBseU1hdHJpeDQodCxlKXtjb25zdCBuPWV8fG9kLmdldE5vcm1hbE1hdHJpeCh0KSxzPXRoaXMuY29wbGFuYXJQb2ludChObykuYXBwbHlNYXRyaXg0KHQpLHI9dGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKG4pLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzLmNvbnN0YW50PS1zLmRvdChyKSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5jb25zdGFudC09dC5kb3QodGhpcy5ub3JtYWwpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm5vcm1hbC5lcXVhbHModGhpcy5ub3JtYWwpJiZ0LmNvbnN0YW50PT09dGhpcy5jb25zdGFudH1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWNsYXNzIFNle2NvbnN0cnVjdG9yKCl7dGhpcy50eXBlPSJDdXJ2ZSIsdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9MjAwLHRoaXMubmVlZHNVcGRhdGU9ITEsdGhpcy5jYWNoZUFyY0xlbmd0aHM9bnVsbH1nZXRQb2ludCgpe2J0KCJDdXJ2ZTogLmdldFBvaW50KCkgbm90IGltcGxlbWVudGVkLiIpfWdldFBvaW50QXQodCxlKXtjb25zdCBuPXRoaXMuZ2V0VXRvVG1hcHBpbmcodCk7cmV0dXJuIHRoaXMuZ2V0UG9pbnQobixlKX1nZXRQb2ludHModD01KXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248PXQ7bisrKWUucHVzaCh0aGlzLmdldFBvaW50KG4vdCkpO3JldHVybiBlfWdldFNwYWNlZFBvaW50cyh0PTUpe2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjw9dDtuKyspZS5wdXNoKHRoaXMuZ2V0UG9pbnRBdChuL3QpKTtyZXR1cm4gZX1nZXRMZW5ndGgoKXtjb25zdCB0PXRoaXMuZ2V0TGVuZ3RocygpO3JldHVybiB0W3QubGVuZ3RoLTFdfWdldExlbmd0aHModD10aGlzLmFyY0xlbmd0aERpdmlzaW9ucyl7aWYodGhpcy5jYWNoZUFyY0xlbmd0aHMmJnRoaXMuY2FjaGVBcmNMZW5ndGhzLmxlbmd0aD09PXQrMSYmIXRoaXMubmVlZHNVcGRhdGUpcmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzO3RoaXMubmVlZHNVcGRhdGU9ITE7Y29uc3QgZT1bXTtsZXQgbixzPXRoaXMuZ2V0UG9pbnQoMCkscj0wO2UucHVzaCgwKTtmb3IobGV0IG89MTtvPD10O28rKyluPXRoaXMuZ2V0UG9pbnQoby90KSxyKz1uLmRpc3RhbmNlVG8ocyksZS5wdXNoKHIpLHM9bjtyZXR1cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM9ZSxlfXVwZGF0ZUFyY0xlbmd0aHMoKXt0aGlzLm5lZWRzVXBkYXRlPSEwLHRoaXMuZ2V0TGVuZ3RocygpfWdldFV0b1RtYXBwaW5nKHQsZT1udWxsKXtjb25zdCBuPXRoaXMuZ2V0TGVuZ3RocygpO2xldCBzPTA7Y29uc3Qgcj1uLmxlbmd0aDtsZXQgbztlP289ZTpvPXQqbltyLTFdO2xldCBhPTAsYz1yLTEsbDtmb3IoO2E8PWM7KWlmKHM9TWF0aC5mbG9vcihhKyhjLWEpLzIpLGw9bltzXS1vLGw8MClhPXMrMTtlbHNlIGlmKGw+MCljPXMtMTtlbHNle2M9czticmVha31pZihzPWMsbltzXT09PW8pcmV0dXJuIHMvKHItMSk7Y29uc3QgaD1uW3NdLGY9bltzKzFdLWgsZD0oby1oKS9mO3JldHVybihzK2QpLyhyLTEpfWdldFRhbmdlbnQodCxlKXtsZXQgcz10LTFlLTQscj10KzFlLTQ7czwwJiYocz0wKSxyPjEmJihyPTEpO2NvbnN0IG89dGhpcy5nZXRQb2ludChzKSxhPXRoaXMuZ2V0UG9pbnQociksYz1lfHwoby5pc1ZlY3RvcjI/bmV3IGs6bmV3IFApO3JldHVybiBjLmNvcHkoYSkuc3ViKG8pLm5vcm1hbGl6ZSgpLGN9Z2V0VGFuZ2VudEF0KHQsZSl7Y29uc3Qgbj10aGlzLmdldFV0b1RtYXBwaW5nKHQpO3JldHVybiB0aGlzLmdldFRhbmdlbnQobixlKX1jb21wdXRlRnJlbmV0RnJhbWVzKHQsZT0hMSl7Y29uc3Qgbj1uZXcgUCxzPVtdLHI9W10sbz1bXSxhPW5ldyBQLGM9bmV3IHN0O2ZvcihsZXQgZD0wO2Q8PXQ7ZCsrKXtjb25zdCBwPWQvdDtzW2RdPXRoaXMuZ2V0VGFuZ2VudEF0KHAsbmV3IFApfXJbMF09bmV3IFAsb1swXT1uZXcgUDtsZXQgbD1OdW1iZXIuTUFYX1ZBTFVFO2NvbnN0IGg9TWF0aC5hYnMoc1swXS54KSx1PU1hdGguYWJzKHNbMF0ueSksZj1NYXRoLmFicyhzWzBdLnopO2g8PWwmJihsPWgsbi5zZXQoMSwwLDApKSx1PD1sJiYobD11LG4uc2V0KDAsMSwwKSksZjw9bCYmbi5zZXQoMCwwLDEpLGEuY3Jvc3NWZWN0b3JzKHNbMF0sbikubm9ybWFsaXplKCksclswXS5jcm9zc1ZlY3RvcnMoc1swXSxhKSxvWzBdLmNyb3NzVmVjdG9ycyhzWzBdLHJbMF0pO2ZvcihsZXQgZD0xO2Q8PXQ7ZCsrKXtpZihyW2RdPXJbZC0xXS5jbG9uZSgpLG9bZF09b1tkLTFdLmNsb25lKCksYS5jcm9zc1ZlY3RvcnMoc1tkLTFdLHNbZF0pLGEubGVuZ3RoKCk+TnVtYmVyLkVQU0lMT04pe2Eubm9ybWFsaXplKCk7Y29uc3QgcD1NYXRoLmFjb3MoWihzW2QtMV0uZG90KHNbZF0pLC0xLDEpKTtyW2RdLmFwcGx5TWF0cml4NChjLm1ha2VSb3RhdGlvbkF4aXMoYSxwKSl9b1tkXS5jcm9zc1ZlY3RvcnMoc1tkXSxyW2RdKX1pZihlPT09ITApe2xldCBkPU1hdGguYWNvcyhaKHJbMF0uZG90KHJbdF0pLC0xLDEpKTtkLz10LHNbMF0uZG90KGEuY3Jvc3NWZWN0b3JzKHJbMF0sclt0XSkpPjAmJihkPS1kKTtmb3IobGV0IHA9MTtwPD10O3ArKylyW3BdLmFwcGx5TWF0cml4NChjLm1ha2VSb3RhdGlvbkF4aXMoc1twXSxkKnApKSxvW3BdLmNyb3NzVmVjdG9ycyhzW3BdLHJbcF0pfXJldHVybnt0YW5nZW50czpzLG5vcm1hbHM6cixiaW5vcm1hbHM6b319Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPXQuYXJjTGVuZ3RoRGl2aXNpb25zLHRoaXN9dG9KU09OKCl7Y29uc3QgdD17bWV0YWRhdGE6e3ZlcnNpb246NC43LHR5cGU6IkN1cnZlIixnZW5lcmF0b3I6IkN1cnZlLnRvSlNPTiJ9fTtyZXR1cm4gdC5hcmNMZW5ndGhEaXZpc2lvbnM9dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMsdC50eXBlPXRoaXMudHlwZSx0fWZyb21KU09OKHQpe3JldHVybiB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucz10LmFyY0xlbmd0aERpdmlzaW9ucyx0aGlzfX1jbGFzcyBOcyBleHRlbmRzIFNle2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0xLHM9MSxyPTAsbz1NYXRoLlBJKjIsYT0hMSxjPTApe3N1cGVyKCksdGhpcy5pc0VsbGlwc2VDdXJ2ZT0hMCx0aGlzLnR5cGU9IkVsbGlwc2VDdXJ2ZSIsdGhpcy5hWD10LHRoaXMuYVk9ZSx0aGlzLnhSYWRpdXM9bix0aGlzLnlSYWRpdXM9cyx0aGlzLmFTdGFydEFuZ2xlPXIsdGhpcy5hRW5kQW5nbGU9byx0aGlzLmFDbG9ja3dpc2U9YSx0aGlzLmFSb3RhdGlvbj1jfWdldFBvaW50KHQsZT1uZXcgayl7Y29uc3Qgbj1lLHM9TWF0aC5QSSoyO2xldCByPXRoaXMuYUVuZEFuZ2xlLXRoaXMuYVN0YXJ0QW5nbGU7Y29uc3Qgbz1NYXRoLmFicyhyKTxOdW1iZXIuRVBTSUxPTjtmb3IoO3I8MDspcis9cztmb3IoO3I+czspci09cztyPE51bWJlci5FUFNJTE9OJiYobz9yPTA6cj1zKSx0aGlzLmFDbG9ja3dpc2U9PT0hMCYmIW8mJihyPT09cz9yPS1zOnI9ci1zKTtjb25zdCBhPXRoaXMuYVN0YXJ0QW5nbGUrdCpyO2xldCBjPXRoaXMuYVgrdGhpcy54UmFkaXVzKk1hdGguY29zKGEpLGw9dGhpcy5hWSt0aGlzLnlSYWRpdXMqTWF0aC5zaW4oYSk7aWYodGhpcy5hUm90YXRpb24hPT0wKXtjb25zdCBoPU1hdGguY29zKHRoaXMuYVJvdGF0aW9uKSx1PU1hdGguc2luKHRoaXMuYVJvdGF0aW9uKSxmPWMtdGhpcy5hWCxkPWwtdGhpcy5hWTtjPWYqaC1kKnUrdGhpcy5hWCxsPWYqdStkKmgrdGhpcy5hWX1yZXR1cm4gbi5zZXQoYyxsKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuYVg9dC5hWCx0aGlzLmFZPXQuYVksdGhpcy54UmFkaXVzPXQueFJhZGl1cyx0aGlzLnlSYWRpdXM9dC55UmFkaXVzLHRoaXMuYVN0YXJ0QW5nbGU9dC5hU3RhcnRBbmdsZSx0aGlzLmFFbmRBbmdsZT10LmFFbmRBbmdsZSx0aGlzLmFDbG9ja3dpc2U9dC5hQ2xvY2t3aXNlLHRoaXMuYVJvdGF0aW9uPXQuYVJvdGF0aW9uLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC5hWD10aGlzLmFYLHQuYVk9dGhpcy5hWSx0LnhSYWRpdXM9dGhpcy54UmFkaXVzLHQueVJhZGl1cz10aGlzLnlSYWRpdXMsdC5hU3RhcnRBbmdsZT10aGlzLmFTdGFydEFuZ2xlLHQuYUVuZEFuZ2xlPXRoaXMuYUVuZEFuZ2xlLHQuYUNsb2Nrd2lzZT10aGlzLmFDbG9ja3dpc2UsdC5hUm90YXRpb249dGhpcy5hUm90YXRpb24sdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy5hWD10LmFYLHRoaXMuYVk9dC5hWSx0aGlzLnhSYWRpdXM9dC54UmFkaXVzLHRoaXMueVJhZGl1cz10LnlSYWRpdXMsdGhpcy5hU3RhcnRBbmdsZT10LmFTdGFydEFuZ2xlLHRoaXMuYUVuZEFuZ2xlPXQuYUVuZEFuZ2xlLHRoaXMuYUNsb2Nrd2lzZT10LmFDbG9ja3dpc2UsdGhpcy5hUm90YXRpb249dC5hUm90YXRpb24sdGhpc319Y2xhc3Mgc2wgZXh0ZW5kcyBOc3tjb25zdHJ1Y3Rvcih0LGUsbixzLHIsbyl7c3VwZXIodCxlLG4sbixzLHIsbyksdGhpcy5pc0FyY0N1cnZlPSEwLHRoaXMudHlwZT0iQXJjQ3VydmUifX1mdW5jdGlvbiBMbygpe2xldCBpPTAsdD0wLGU9MCxuPTA7ZnVuY3Rpb24gcyhyLG8sYSxjKXtpPXIsdD1hLGU9LTMqciszKm8tMiphLWMsbj0yKnItMipvK2ErY31yZXR1cm57aW5pdENhdG11bGxSb206ZnVuY3Rpb24ocixvLGEsYyxsKXtzKG8sYSxsKihhLXIpLGwqKGMtbykpfSxpbml0Tm9udW5pZm9ybUNhdG11bGxSb206ZnVuY3Rpb24ocixvLGEsYyxsLGgsdSl7bGV0IGY9KG8tcikvbC0oYS1yKS8obCtoKSsoYS1vKS9oLGQ9KGEtbykvaC0oYy1vKS8oaCt1KSsoYy1hKS91O2YqPWgsZCo9aCxzKG8sYSxmLGQpfSxjYWxjOmZ1bmN0aW9uKHIpe2NvbnN0IG89cipyLGE9bypyO3JldHVybiBpK3QqcitlKm8rbiphfX19Y29uc3QgUnM9bmV3IFAsT289bmV3IExvLERvPW5ldyBMbywkbz1uZXcgTG87Y2xhc3MgcmwgZXh0ZW5kcyBTZXtjb25zdHJ1Y3Rvcih0PVtdLGU9ITEsbj0iY2VudHJpcGV0YWwiLHM9LjUpe3N1cGVyKCksdGhpcy5pc0NhdG11bGxSb21DdXJ2ZTM9ITAsdGhpcy50eXBlPSJDYXRtdWxsUm9tQ3VydmUzIix0aGlzLnBvaW50cz10LHRoaXMuY2xvc2VkPWUsdGhpcy5jdXJ2ZVR5cGU9bix0aGlzLnRlbnNpb249c31nZXRQb2ludCh0LGU9bmV3IFApe2NvbnN0IG49ZSxzPXRoaXMucG9pbnRzLHI9cy5sZW5ndGgsbz0oci0odGhpcy5jbG9zZWQ/MDoxKSkqdDtsZXQgYT1NYXRoLmZsb29yKG8pLGM9by1hO3RoaXMuY2xvc2VkP2ErPWE+MD8wOihNYXRoLmZsb29yKE1hdGguYWJzKGEpL3IpKzEpKnI6Yz09PTAmJmE9PT1yLTEmJihhPXItMixjPTEpO2xldCBsLGg7dGhpcy5jbG9zZWR8fGE+MD9sPXNbKGEtMSklcl06KFJzLnN1YlZlY3RvcnMoc1swXSxzWzFdKS5hZGQoc1swXSksbD1Scyk7Y29uc3QgdT1zW2Elcl0sZj1zWyhhKzEpJXJdO2lmKHRoaXMuY2xvc2VkfHxhKzI8cj9oPXNbKGErMiklcl06KFJzLnN1YlZlY3RvcnMoc1tyLTFdLHNbci0yXSkuYWRkKHNbci0xXSksaD1ScyksdGhpcy5jdXJ2ZVR5cGU9PT0iY2VudHJpcGV0YWwifHx0aGlzLmN1cnZlVHlwZT09PSJjaG9yZGFsIil7Y29uc3QgZD10aGlzLmN1cnZlVHlwZT09PSJjaG9yZGFsIj8uNTouMjU7bGV0IHA9TWF0aC5wb3cobC5kaXN0YW5jZVRvU3F1YXJlZCh1KSxkKSx5PU1hdGgucG93KHUuZGlzdGFuY2VUb1NxdWFyZWQoZiksZCksZz1NYXRoLnBvdyhmLmRpc3RhbmNlVG9TcXVhcmVkKGgpLGQpO3k8MWUtNCYmKHk9MSkscDwxZS00JiYocD15KSxnPDFlLTQmJihnPXkpLE9vLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShsLngsdS54LGYueCxoLngscCx5LGcpLERvLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShsLnksdS55LGYueSxoLnkscCx5LGcpLCRvLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShsLnosdS56LGYueixoLnoscCx5LGcpfWVsc2UgdGhpcy5jdXJ2ZVR5cGU9PT0iY2F0bXVsbHJvbSImJihPby5pbml0Q2F0bXVsbFJvbShsLngsdS54LGYueCxoLngsdGhpcy50ZW5zaW9uKSxEby5pbml0Q2F0bXVsbFJvbShsLnksdS55LGYueSxoLnksdGhpcy50ZW5zaW9uKSwkby5pbml0Q2F0bXVsbFJvbShsLnosdS56LGYueixoLnosdGhpcy50ZW5zaW9uKSk7cmV0dXJuIG4uc2V0KE9vLmNhbGMoYyksRG8uY2FsYyhjKSwkby5jYWxjKGMpKSxufWNvcHkodCl7c3VwZXIuY29weSh0KSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IGU9MCxuPXQucG9pbnRzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQucG9pbnRzW2VdO3RoaXMucG9pbnRzLnB1c2gocy5jbG9uZSgpKX1yZXR1cm4gdGhpcy5jbG9zZWQ9dC5jbG9zZWQsdGhpcy5jdXJ2ZVR5cGU9dC5jdXJ2ZVR5cGUsdGhpcy50ZW5zaW9uPXQudGVuc2lvbix0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC5wb2ludHM9W107Zm9yKGxldCBlPTAsbj10aGlzLnBvaW50cy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10aGlzLnBvaW50c1tlXTt0LnBvaW50cy5wdXNoKHMudG9BcnJheSgpKX1yZXR1cm4gdC5jbG9zZWQ9dGhpcy5jbG9zZWQsdC5jdXJ2ZVR5cGU9dGhpcy5jdXJ2ZVR5cGUsdC50ZW5zaW9uPXRoaXMudGVuc2lvbix0fWZyb21KU09OKHQpe3N1cGVyLmZyb21KU09OKHQpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dC5wb2ludHMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dC5wb2ludHNbZV07dGhpcy5wb2ludHMucHVzaChuZXcgUCgpLmZyb21BcnJheShzKSl9cmV0dXJuIHRoaXMuY2xvc2VkPXQuY2xvc2VkLHRoaXMuY3VydmVUeXBlPXQuY3VydmVUeXBlLHRoaXMudGVuc2lvbj10LnRlbnNpb24sdGhpc319ZnVuY3Rpb24gb2woaSx0LGUsbixzKXtjb25zdCByPShuLXQpKi41LG89KHMtZSkqLjUsYT1pKmksYz1pKmE7cmV0dXJuKDIqZS0yKm4rcitvKSpjKygtMyplKzMqbi0yKnItbykqYStyKmkrZX1mdW5jdGlvbiBhZChpLHQpe2NvbnN0IGU9MS1pO3JldHVybiBlKmUqdH1mdW5jdGlvbiBjZChpLHQpe3JldHVybiAyKigxLWkpKmkqdH1mdW5jdGlvbiBsZChpLHQpe3JldHVybiBpKmkqdH1mdW5jdGlvbiBraShpLHQsZSxuKXtyZXR1cm4gYWQoaSx0KStjZChpLGUpK2xkKGksbil9ZnVuY3Rpb24gaGQoaSx0KXtjb25zdCBlPTEtaTtyZXR1cm4gZSplKmUqdH1mdW5jdGlvbiB1ZChpLHQpe2NvbnN0IGU9MS1pO3JldHVybiAzKmUqZSppKnR9ZnVuY3Rpb24gZmQoaSx0KXtyZXR1cm4gMyooMS1pKSppKmkqdH1mdW5jdGlvbiBkZChpLHQpe3JldHVybiBpKmkqaSp0fWZ1bmN0aW9uIE5pKGksdCxlLG4scyl7cmV0dXJuIGhkKGksdCkrdWQoaSxlKStmZChpLG4pK2RkKGkscyl9Y2xhc3MgVm8gZXh0ZW5kcyBTZXtjb25zdHJ1Y3Rvcih0PW5ldyBrLGU9bmV3IGssbj1uZXcgayxzPW5ldyBrKXtzdXBlcigpLHRoaXMuaXNDdWJpY0JlemllckN1cnZlPSEwLHRoaXMudHlwZT0iQ3ViaWNCZXppZXJDdXJ2ZSIsdGhpcy52MD10LHRoaXMudjE9ZSx0aGlzLnYyPW4sdGhpcy52Mz1zfWdldFBvaW50KHQsZT1uZXcgayl7Y29uc3Qgbj1lLHM9dGhpcy52MCxyPXRoaXMudjEsbz10aGlzLnYyLGE9dGhpcy52MztyZXR1cm4gbi5zZXQoTmkodCxzLngsci54LG8ueCxhLngpLE5pKHQscy55LHIueSxvLnksYS55KSksbn1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXMudjMuY29weSh0LnYzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHQudjM9dGhpcy52My50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpcy52My5mcm9tQXJyYXkodC52MyksdGhpc319Y2xhc3MgYWwgZXh0ZW5kcyBTZXtjb25zdHJ1Y3Rvcih0PW5ldyBQLGU9bmV3IFAsbj1uZXcgUCxzPW5ldyBQKXtzdXBlcigpLHRoaXMuaXNDdWJpY0JlemllckN1cnZlMz0hMCx0aGlzLnR5cGU9IkN1YmljQmV6aWVyQ3VydmUzIix0aGlzLnYwPXQsdGhpcy52MT1lLHRoaXMudjI9bix0aGlzLnYzPXN9Z2V0UG9pbnQodCxlPW5ldyBQKXtjb25zdCBuPWUscz10aGlzLnYwLHI9dGhpcy52MSxvPXRoaXMudjIsYT10aGlzLnYzO3JldHVybiBuLnNldChOaSh0LHMueCxyLngsby54LGEueCksTmkodCxzLnksci55LG8ueSxhLnkpLE5pKHQscy56LHIueixvLnosYS56KSksbn1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXMudjMuY29weSh0LnYzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHQudjM9dGhpcy52My50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpcy52My5mcm9tQXJyYXkodC52MyksdGhpc319Y2xhc3MgVW8gZXh0ZW5kcyBTZXtjb25zdHJ1Y3Rvcih0PW5ldyBrLGU9bmV3IGspe3N1cGVyKCksdGhpcy5pc0xpbmVDdXJ2ZT0hMCx0aGlzLnR5cGU9IkxpbmVDdXJ2ZSIsdGhpcy52MT10LHRoaXMudjI9ZX1nZXRQb2ludCh0LGU9bmV3IGspe2NvbnN0IG49ZTtyZXR1cm4gdD09PTE/bi5jb3B5KHRoaXMudjIpOihuLmNvcHkodGhpcy52Mikuc3ViKHRoaXMudjEpLG4ubXVsdGlwbHlTY2FsYXIodCkuYWRkKHRoaXMudjEpKSxufWdldFBvaW50QXQodCxlKXtyZXR1cm4gdGhpcy5nZXRQb2ludCh0LGUpfWdldFRhbmdlbnQodCxlPW5ldyBrKXtyZXR1cm4gZS5zdWJWZWN0b3JzKHRoaXMudjIsdGhpcy52MSkubm9ybWFsaXplKCl9Z2V0VGFuZ2VudEF0KHQsZSl7cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudCh0LGUpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzfX1jbGFzcyBjbCBleHRlbmRzIFNle2NvbnN0cnVjdG9yKHQ9bmV3IFAsZT1uZXcgUCl7c3VwZXIoKSx0aGlzLmlzTGluZUN1cnZlMz0hMCx0aGlzLnR5cGU9IkxpbmVDdXJ2ZTMiLHRoaXMudjE9dCx0aGlzLnYyPWV9Z2V0UG9pbnQodCxlPW5ldyBQKXtjb25zdCBuPWU7cmV0dXJuIHQ9PT0xP24uY29weSh0aGlzLnYyKToobi5jb3B5KHRoaXMudjIpLnN1Yih0aGlzLnYxKSxuLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLnYxKSksbn1nZXRQb2ludEF0KHQsZSl7cmV0dXJuIHRoaXMuZ2V0UG9pbnQodCxlKX1nZXRUYW5nZW50KHQsZT1uZXcgUCl7cmV0dXJuIGUuc3ViVmVjdG9ycyh0aGlzLnYyLHRoaXMudjEpLm5vcm1hbGl6ZSgpfWdldFRhbmdlbnRBdCh0LGUpe3JldHVybiB0aGlzLmdldFRhbmdlbnQodCxlKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYxPXRoaXMudjEudG9BcnJheSgpLHQudjI9dGhpcy52Mi50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpc319Y2xhc3MgcW8gZXh0ZW5kcyBTZXtjb25zdHJ1Y3Rvcih0PW5ldyBrLGU9bmV3IGssbj1uZXcgayl7c3VwZXIoKSx0aGlzLmlzUXVhZHJhdGljQmV6aWVyQ3VydmU9ITAsdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZSIsdGhpcy52MD10LHRoaXMudjE9ZSx0aGlzLnYyPW59Z2V0UG9pbnQodCxlPW5ldyBrKXtjb25zdCBuPWUscz10aGlzLnYwLHI9dGhpcy52MSxvPXRoaXMudjI7cmV0dXJuIG4uc2V0KGtpKHQscy54LHIueCxvLngpLGtpKHQscy55LHIueSxvLnkpKSxufWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MC5jb3B5KHQudjApLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYwPXRoaXMudjAudG9BcnJheSgpLHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYwLmZyb21BcnJheSh0LnYwKSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzfX1jbGFzcyBsbCBleHRlbmRzIFNle2NvbnN0cnVjdG9yKHQ9bmV3IFAsZT1uZXcgUCxuPW5ldyBQKXtzdXBlcigpLHRoaXMuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZTM9ITAsdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZTMiLHRoaXMudjA9dCx0aGlzLnYxPWUsdGhpcy52Mj1ufWdldFBvaW50KHQsZT1uZXcgUCl7Y29uc3Qgbj1lLHM9dGhpcy52MCxyPXRoaXMudjEsbz10aGlzLnYyO3JldHVybiBuLnNldChraSh0LHMueCxyLngsby54KSxraSh0LHMueSxyLnksby55KSxraSh0LHMueixyLnosby56KSksbn1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC52MD10aGlzLnYwLnRvQXJyYXkoKSx0LnYxPXRoaXMudjEudG9BcnJheSgpLHQudjI9dGhpcy52Mi50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpc319Y2xhc3MgWG8gZXh0ZW5kcyBTZXtjb25zdHJ1Y3Rvcih0PVtdKXtzdXBlcigpLHRoaXMuaXNTcGxpbmVDdXJ2ZT0hMCx0aGlzLnR5cGU9IlNwbGluZUN1cnZlIix0aGlzLnBvaW50cz10fWdldFBvaW50KHQsZT1uZXcgayl7Y29uc3Qgbj1lLHM9dGhpcy5wb2ludHMscj0ocy5sZW5ndGgtMSkqdCxvPU1hdGguZmxvb3IociksYT1yLW8sYz1zW289PT0wP286by0xXSxsPXNbb10saD1zW28+cy5sZW5ndGgtMj9zLmxlbmd0aC0xOm8rMV0sdT1zW28+cy5sZW5ndGgtMz9zLmxlbmd0aC0xOm8rMl07cmV0dXJuIG4uc2V0KG9sKGEsYy54LGwueCxoLngsdS54KSxvbChhLGMueSxsLnksaC55LHUueSkpLG59Y29weSh0KXtzdXBlci5jb3B5KHQpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dC5wb2ludHMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dC5wb2ludHNbZV07dGhpcy5wb2ludHMucHVzaChzLmNsb25lKCkpfXJldHVybiB0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC5wb2ludHM9W107Zm9yKGxldCBlPTAsbj10aGlzLnBvaW50cy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgcz10aGlzLnBvaW50c1tlXTt0LnBvaW50cy5wdXNoKHMudG9BcnJheSgpKX1yZXR1cm4gdH1mcm9tSlNPTih0KXtzdXBlci5mcm9tSlNPTih0KSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IGU9MCxuPXQucG9pbnRzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQucG9pbnRzW2VdO3RoaXMucG9pbnRzLnB1c2gobmV3IGsoKS5mcm9tQXJyYXkocykpfXJldHVybiB0aGlzfX12YXIgaGw9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQXJjQ3VydmU6c2wsQ2F0bXVsbFJvbUN1cnZlMzpybCxDdWJpY0JlemllckN1cnZlOlZvLEN1YmljQmV6aWVyQ3VydmUzOmFsLEVsbGlwc2VDdXJ2ZTpOcyxMaW5lQ3VydmU6VW8sTGluZUN1cnZlMzpjbCxRdWFkcmF0aWNCZXppZXJDdXJ2ZTpxbyxRdWFkcmF0aWNCZXppZXJDdXJ2ZTM6bGwsU3BsaW5lQ3VydmU6WG99KTtjbGFzcyBwZCBleHRlbmRzIFNle2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLnR5cGU9IkN1cnZlUGF0aCIsdGhpcy5jdXJ2ZXM9W10sdGhpcy5hdXRvQ2xvc2U9ITF9YWRkKHQpe3RoaXMuY3VydmVzLnB1c2godCl9Y2xvc2VQYXRoKCl7Y29uc3QgdD10aGlzLmN1cnZlc1swXS5nZXRQb2ludCgwKSxlPXRoaXMuY3VydmVzW3RoaXMuY3VydmVzLmxlbmd0aC0xXS5nZXRQb2ludCgxKTtpZighdC5lcXVhbHMoZSkpe2NvbnN0IG49dC5pc1ZlY3RvcjI9PT0hMD8iTGluZUN1cnZlIjoiTGluZUN1cnZlMyI7dGhpcy5jdXJ2ZXMucHVzaChuZXcgaGxbbl0oZSx0KSl9cmV0dXJuIHRoaXN9Z2V0UG9pbnQodCxlKXtjb25zdCBuPXQqdGhpcy5nZXRMZW5ndGgoKSxzPXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7bGV0IHI9MDtmb3IoO3I8cy5sZW5ndGg7KXtpZihzW3JdPj1uKXtjb25zdCBvPXNbcl0tbixhPXRoaXMuY3VydmVzW3JdLGM9YS5nZXRMZW5ndGgoKSxsPWM9PT0wPzA6MS1vL2M7cmV0dXJuIGEuZ2V0UG9pbnRBdChsLGUpfXIrK31yZXR1cm4gbnVsbH1nZXRMZW5ndGgoKXtjb25zdCB0PXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7cmV0dXJuIHRbdC5sZW5ndGgtMV19dXBkYXRlQXJjTGVuZ3Rocygpe3RoaXMubmVlZHNVcGRhdGU9ITAsdGhpcy5jYWNoZUxlbmd0aHM9bnVsbCx0aGlzLmdldEN1cnZlTGVuZ3RocygpfWdldEN1cnZlTGVuZ3Rocygpe2lmKHRoaXMuY2FjaGVMZW5ndGhzJiZ0aGlzLmNhY2hlTGVuZ3Rocy5sZW5ndGg9PT10aGlzLmN1cnZlcy5sZW5ndGgpcmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzO2NvbnN0IHQ9W107bGV0IGU9MDtmb3IobGV0IG49MCxzPXRoaXMuY3VydmVzLmxlbmd0aDtuPHM7bisrKWUrPXRoaXMuY3VydmVzW25dLmdldExlbmd0aCgpLHQucHVzaChlKTtyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM9dCx0fWdldFNwYWNlZFBvaW50cyh0PTQwKXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248PXQ7bisrKWUucHVzaCh0aGlzLmdldFBvaW50KG4vdCkpO3JldHVybiB0aGlzLmF1dG9DbG9zZSYmZS5wdXNoKGVbMF0pLGV9Z2V0UG9pbnRzKHQ9MTIpe2NvbnN0IGU9W107bGV0IG47Zm9yKGxldCBzPTAscj10aGlzLmN1cnZlcztzPHIubGVuZ3RoO3MrKyl7Y29uc3Qgbz1yW3NdLGE9by5pc0VsbGlwc2VDdXJ2ZT90KjI6by5pc0xpbmVDdXJ2ZXx8by5pc0xpbmVDdXJ2ZTM/MTpvLmlzU3BsaW5lQ3VydmU/dCpvLnBvaW50cy5sZW5ndGg6dCxjPW8uZ2V0UG9pbnRzKGEpO2ZvcihsZXQgbD0wO2w8Yy5sZW5ndGg7bCsrKXtjb25zdCBoPWNbbF07biYmbi5lcXVhbHMoaCl8fChlLnB1c2goaCksbj1oKX19cmV0dXJuIHRoaXMuYXV0b0Nsb3NlJiZlLmxlbmd0aD4xJiYhZVtlLmxlbmd0aC0xXS5lcXVhbHMoZVswXSkmJmUucHVzaChlWzBdKSxlfWNvcHkodCl7c3VwZXIuY29weSh0KSx0aGlzLmN1cnZlcz1bXTtmb3IobGV0IGU9MCxuPXQuY3VydmVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQuY3VydmVzW2VdO3RoaXMuY3VydmVzLnB1c2gocy5jbG9uZSgpKX1yZXR1cm4gdGhpcy5hdXRvQ2xvc2U9dC5hdXRvQ2xvc2UsdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QuYXV0b0Nsb3NlPXRoaXMuYXV0b0Nsb3NlLHQuY3VydmVzPVtdO2ZvcihsZXQgZT0wLG49dGhpcy5jdXJ2ZXMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dGhpcy5jdXJ2ZXNbZV07dC5jdXJ2ZXMucHVzaChzLnRvSlNPTigpKX1yZXR1cm4gdH1mcm9tSlNPTih0KXtzdXBlci5mcm9tSlNPTih0KSx0aGlzLmF1dG9DbG9zZT10LmF1dG9DbG9zZSx0aGlzLmN1cnZlcz1bXTtmb3IobGV0IGU9MCxuPXQuY3VydmVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQuY3VydmVzW2VdO3RoaXMuY3VydmVzLnB1c2gobmV3IGhsW3MudHlwZV0oKS5mcm9tSlNPTihzKSl9cmV0dXJuIHRoaXN9fWxldCB1bD1jbGFzcyBleHRlbmRzIHBke2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy50eXBlPSJQYXRoIix0aGlzLmN1cnJlbnRQb2ludD1uZXcgayx0JiZ0aGlzLnNldEZyb21Qb2ludHModCl9c2V0RnJvbVBvaW50cyh0KXt0aGlzLm1vdmVUbyh0WzBdLngsdFswXS55KTtmb3IobGV0IGU9MSxuPXQubGVuZ3RoO2U8bjtlKyspdGhpcy5saW5lVG8odFtlXS54LHRbZV0ueSk7cmV0dXJuIHRoaXN9bW92ZVRvKHQsZSl7cmV0dXJuIHRoaXMuY3VycmVudFBvaW50LnNldCh0LGUpLHRoaXN9bGluZVRvKHQsZSl7Y29uc3Qgbj1uZXcgVW8odGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgayh0LGUpKTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChuKSx0aGlzLmN1cnJlbnRQb2ludC5zZXQodCxlKSx0aGlzfXF1YWRyYXRpY0N1cnZlVG8odCxlLG4scyl7Y29uc3Qgcj1uZXcgcW8odGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgayh0LGUpLG5ldyBrKG4scykpO3JldHVybiB0aGlzLmN1cnZlcy5wdXNoKHIpLHRoaXMuY3VycmVudFBvaW50LnNldChuLHMpLHRoaXN9YmV6aWVyQ3VydmVUbyh0LGUsbixzLHIsbyl7Y29uc3QgYT1uZXcgVm8odGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgayh0LGUpLG5ldyBrKG4scyksbmV3IGsocixvKSk7cmV0dXJuIHRoaXMuY3VydmVzLnB1c2goYSksdGhpcy5jdXJyZW50UG9pbnQuc2V0KHIsbyksdGhpc31zcGxpbmVUaHJ1KHQpe2NvbnN0IGU9W3RoaXMuY3VycmVudFBvaW50LmNsb25lKCldLmNvbmNhdCh0KSxuPW5ldyBYbyhlKTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChuKSx0aGlzLmN1cnJlbnRQb2ludC5jb3B5KHRbdC5sZW5ndGgtMV0pLHRoaXN9YXJjKHQsZSxuLHMscixvKXtjb25zdCBhPXRoaXMuY3VycmVudFBvaW50LngsYz10aGlzLmN1cnJlbnRQb2ludC55O3JldHVybiB0aGlzLmFic2FyYyh0K2EsZStjLG4scyxyLG8pLHRoaXN9YWJzYXJjKHQsZSxuLHMscixvKXtyZXR1cm4gdGhpcy5hYnNlbGxpcHNlKHQsZSxuLG4scyxyLG8pLHRoaXN9ZWxsaXBzZSh0LGUsbixzLHIsbyxhLGMpe2NvbnN0IGw9dGhpcy5jdXJyZW50UG9pbnQueCxoPXRoaXMuY3VycmVudFBvaW50Lnk7cmV0dXJuIHRoaXMuYWJzZWxsaXBzZSh0K2wsZStoLG4scyxyLG8sYSxjKSx0aGlzfWFic2VsbGlwc2UodCxlLG4scyxyLG8sYSxjKXtjb25zdCBsPW5ldyBOcyh0LGUsbixzLHIsbyxhLGMpO2lmKHRoaXMuY3VydmVzLmxlbmd0aD4wKXtjb25zdCB1PWwuZ2V0UG9pbnQoMCk7dS5lcXVhbHModGhpcy5jdXJyZW50UG9pbnQpfHx0aGlzLmxpbmVUbyh1LngsdS55KX10aGlzLmN1cnZlcy5wdXNoKGwpO2NvbnN0IGg9bC5nZXRQb2ludCgxKTtyZXR1cm4gdGhpcy5jdXJyZW50UG9pbnQuY29weShoKSx0aGlzfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jdXJyZW50UG9pbnQuY29weSh0LmN1cnJlbnRQb2ludCksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LmN1cnJlbnRQb2ludD10aGlzLmN1cnJlbnRQb2ludC50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy5jdXJyZW50UG9pbnQuZnJvbUFycmF5KHQuY3VycmVudFBvaW50KSx0aGlzfX07Y2xhc3MgZmwgZXh0ZW5kcyB1bHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLnV1aWQ9bW4oKSx0aGlzLnR5cGU9IlNoYXBlIix0aGlzLmhvbGVzPVtdfWdldFBvaW50c0hvbGVzKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuPTAscz10aGlzLmhvbGVzLmxlbmd0aDtuPHM7bisrKWVbbl09dGhpcy5ob2xlc1tuXS5nZXRQb2ludHModCk7cmV0dXJuIGV9ZXh0cmFjdFBvaW50cyh0KXtyZXR1cm57c2hhcGU6dGhpcy5nZXRQb2ludHModCksaG9sZXM6dGhpcy5nZXRQb2ludHNIb2xlcyh0KX19Y29weSh0KXtzdXBlci5jb3B5KHQpLHRoaXMuaG9sZXM9W107Zm9yKGxldCBlPTAsbj10LmhvbGVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXQuaG9sZXNbZV07dGhpcy5ob2xlcy5wdXNoKHMuY2xvbmUoKSl9cmV0dXJuIHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTt0LnV1aWQ9dGhpcy51dWlkLHQuaG9sZXM9W107Zm9yKGxldCBlPTAsbj10aGlzLmhvbGVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBzPXRoaXMuaG9sZXNbZV07dC5ob2xlcy5wdXNoKHMudG9KU09OKCkpfXJldHVybiB0fWZyb21KU09OKHQpe3N1cGVyLmZyb21KU09OKHQpLHRoaXMudXVpZD10LnV1aWQsdGhpcy5ob2xlcz1bXTtmb3IobGV0IGU9MCxuPXQuaG9sZXMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IHM9dC5ob2xlc1tlXTt0aGlzLmhvbGVzLnB1c2gobmV3IHVsKCkuZnJvbUpTT04ocykpfXJldHVybiB0aGlzfX1mdW5jdGlvbiB5ZChpLHQsZT0yKXtjb25zdCBuPXQmJnQubGVuZ3RoLHM9bj90WzBdKmU6aS5sZW5ndGg7bGV0IHI9ZGwoaSwwLHMsZSwhMCk7Y29uc3Qgbz1bXTtpZighcnx8ci5uZXh0PT09ci5wcmV2KXJldHVybiBvO2xldCBhLGMsbDtpZihuJiYocj1iZChpLHQscixlKSksaS5sZW5ndGg+ODAqZSl7YT1pWzBdLGM9aVsxXTtsZXQgaD1hLHU9Yztmb3IobGV0IGY9ZTtmPHM7Zis9ZSl7Y29uc3QgZD1pW2ZdLHA9aVtmKzFdO2Q8YSYmKGE9ZCkscDxjJiYoYz1wKSxkPmgmJihoPWQpLHA+dSYmKHU9cCl9bD1NYXRoLm1heChoLWEsdS1jKSxsPWwhPT0wPzMyNzY3L2w6MH1yZXR1cm4gUmkocixvLGUsYSxjLGwsMCksb31mdW5jdGlvbiBkbChpLHQsZSxuLHMpe2xldCByO2lmKHM9PT1CZChpLHQsZSxuKT4wKWZvcihsZXQgbz10O288ZTtvKz1uKXI9Z2woby9ufDAsaVtvXSxpW28rMV0scik7ZWxzZSBmb3IobGV0IG89ZS1uO28+PXQ7by09bilyPWdsKG8vbnwwLGlbb10saVtvKzFdLHIpO3JldHVybiByJiZLbihyLHIubmV4dCkmJihEaShyKSxyPXIubmV4dCkscn1mdW5jdGlvbiBNbihpLHQpe2lmKCFpKXJldHVybiBpO3R8fCh0PWkpO2xldCBlPWksbjtkbyBpZihuPSExLCFlLnN0ZWluZXImJihLbihlLGUubmV4dCl8fHJ0KGUucHJldixlLGUubmV4dCk9PT0wKSl7aWYoRGkoZSksZT10PWUucHJldixlPT09ZS5uZXh0KWJyZWFrO249ITB9ZWxzZSBlPWUubmV4dDt3aGlsZShufHxlIT09dCk7cmV0dXJuIHR9ZnVuY3Rpb24gUmkoaSx0LGUsbixzLHIsbyl7aWYoIWkpcmV0dXJuOyFvJiZyJiZfZChpLG4scyxyKTtsZXQgYT1pO2Zvcig7aS5wcmV2IT09aS5uZXh0Oyl7Y29uc3QgYz1pLnByZXYsbD1pLm5leHQ7aWYocj9nZChpLG4scyxyKTptZChpKSl7dC5wdXNoKGMuaSxpLmksbC5pKSxEaShpKSxpPWwubmV4dCxhPWwubmV4dDtjb250aW51ZX1pZihpPWwsaT09PWEpe28/bz09PTE/KGk9eGQoTW4oaSksdCksUmkoaSx0LGUsbixzLHIsMikpOm89PT0yJiZ3ZChpLHQsZSxuLHMscik6UmkoTW4oaSksdCxlLG4scyxyLDEpO2JyZWFrfX19ZnVuY3Rpb24gbWQoaSl7Y29uc3QgdD1pLnByZXYsZT1pLG49aS5uZXh0O2lmKHJ0KHQsZSxuKT49MClyZXR1cm4hMTtjb25zdCBzPXQueCxyPWUueCxvPW4ueCxhPXQueSxjPWUueSxsPW4ueSxoPU1hdGgubWluKHMscixvKSx1PU1hdGgubWluKGEsYyxsKSxmPU1hdGgubWF4KHMscixvKSxkPU1hdGgubWF4KGEsYyxsKTtsZXQgcD1uLm5leHQ7Zm9yKDtwIT09dDspe2lmKHAueD49aCYmcC54PD1mJiZwLnk+PXUmJnAueTw9ZCYmTGkocyxhLHIsYyxvLGwscC54LHAueSkmJnJ0KHAucHJldixwLHAubmV4dCk+PTApcmV0dXJuITE7cD1wLm5leHR9cmV0dXJuITB9ZnVuY3Rpb24gZ2QoaSx0LGUsbil7Y29uc3Qgcz1pLnByZXYscj1pLG89aS5uZXh0O2lmKHJ0KHMscixvKT49MClyZXR1cm4hMTtjb25zdCBhPXMueCxjPXIueCxsPW8ueCxoPXMueSx1PXIueSxmPW8ueSxkPU1hdGgubWluKGEsYyxsKSxwPU1hdGgubWluKGgsdSxmKSx5PU1hdGgubWF4KGEsYyxsKSxnPU1hdGgubWF4KGgsdSxmKSx3PVpvKGQscCx0LGUsbiksYj1abyh5LGcsdCxlLG4pO2xldCB4PWkucHJldlosbT1pLm5leHRaO2Zvcig7eCYmeC56Pj13JiZtJiZtLno8PWI7KXtpZih4Lng+PWQmJngueDw9eSYmeC55Pj1wJiZ4Lnk8PWcmJnghPT1zJiZ4IT09byYmTGkoYSxoLGMsdSxsLGYseC54LHgueSkmJnJ0KHgucHJldix4LHgubmV4dCk+PTB8fCh4PXgucHJldlosbS54Pj1kJiZtLng8PXkmJm0ueT49cCYmbS55PD1nJiZtIT09cyYmbSE9PW8mJkxpKGEsaCxjLHUsbCxmLG0ueCxtLnkpJiZydChtLnByZXYsbSxtLm5leHQpPj0wKSlyZXR1cm4hMTttPW0ubmV4dFp9Zm9yKDt4JiZ4Lno+PXc7KXtpZih4Lng+PWQmJngueDw9eSYmeC55Pj1wJiZ4Lnk8PWcmJnghPT1zJiZ4IT09byYmTGkoYSxoLGMsdSxsLGYseC54LHgueSkmJnJ0KHgucHJldix4LHgubmV4dCk+PTApcmV0dXJuITE7eD14LnByZXZafWZvcig7bSYmbS56PD1iOyl7aWYobS54Pj1kJiZtLng8PXkmJm0ueT49cCYmbS55PD1nJiZtIT09cyYmbSE9PW8mJkxpKGEsaCxjLHUsbCxmLG0ueCxtLnkpJiZydChtLnByZXYsbSxtLm5leHQpPj0wKXJldHVybiExO209bS5uZXh0Wn1yZXR1cm4hMH1mdW5jdGlvbiB4ZChpLHQpe2xldCBlPWk7ZG97Y29uc3Qgbj1lLnByZXYscz1lLm5leHQubmV4dDshS24obixzKSYmeWwobixlLGUubmV4dCxzKSYmT2kobixzKSYmT2kocyxuKSYmKHQucHVzaChuLmksZS5pLHMuaSksRGkoZSksRGkoZS5uZXh0KSxlPWk9cyksZT1lLm5leHR9d2hpbGUoZSE9PWkpO3JldHVybiBNbihlKX1mdW5jdGlvbiB3ZChpLHQsZSxuLHMscil7bGV0IG89aTtkb3tsZXQgYT1vLm5leHQubmV4dDtmb3IoO2EhPT1vLnByZXY7KXtpZihvLmkhPT1hLmkmJlBkKG8sYSkpe2xldCBjPW1sKG8sYSk7bz1NbihvLG8ubmV4dCksYz1NbihjLGMubmV4dCksUmkobyx0LGUsbixzLHIsMCksUmkoYyx0LGUsbixzLHIsMCk7cmV0dXJufWE9YS5uZXh0fW89by5uZXh0fXdoaWxlKG8hPT1pKX1mdW5jdGlvbiBiZChpLHQsZSxuKXtjb25zdCBzPVtdO2ZvcihsZXQgcj0wLG89dC5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT10W3JdKm4sYz1yPG8tMT90W3IrMV0qbjppLmxlbmd0aCxsPWRsKGksYSxjLG4sITEpO2w9PT1sLm5leHQmJihsLnN0ZWluZXI9ITApLHMucHVzaChUZChsKSl9cy5zb3J0KE1kKTtmb3IobGV0IHI9MDtyPHMubGVuZ3RoO3IrKyllPUFkKHNbcl0sZSk7cmV0dXJuIGV9ZnVuY3Rpb24gTWQoaSx0KXtsZXQgZT1pLngtdC54O2lmKGU9PT0wJiYoZT1pLnktdC55LGU9PT0wKSl7Y29uc3Qgbj0oaS5uZXh0LnktaS55KS8oaS5uZXh0LngtaS54KSxzPSh0Lm5leHQueS10LnkpLyh0Lm5leHQueC10LngpO2U9bi1zfXJldHVybiBlfWZ1bmN0aW9uIEFkKGksdCl7Y29uc3QgZT1TZChpLHQpO2lmKCFlKXJldHVybiB0O2NvbnN0IG49bWwoZSxpKTtyZXR1cm4gTW4obixuLm5leHQpLE1uKGUsZS5uZXh0KX1mdW5jdGlvbiBTZChpLHQpe2xldCBlPXQ7Y29uc3Qgbj1pLngscz1pLnk7bGV0IHI9LTEvMCxvO2lmKEtuKGksZSkpcmV0dXJuIGU7ZG97aWYoS24oaSxlLm5leHQpKXJldHVybiBlLm5leHQ7aWYoczw9ZS55JiZzPj1lLm5leHQueSYmZS5uZXh0LnkhPT1lLnkpe2NvbnN0IHU9ZS54KyhzLWUueSkqKGUubmV4dC54LWUueCkvKGUubmV4dC55LWUueSk7aWYodTw9biYmdT5yJiYocj11LG89ZS54PGUubmV4dC54P2U6ZS5uZXh0LHU9PT1uKSlyZXR1cm4gb31lPWUubmV4dH13aGlsZShlIT09dCk7aWYoIW8pcmV0dXJuIG51bGw7Y29uc3QgYT1vLGM9by54LGw9by55O2xldCBoPTEvMDtlPW87ZG97aWYobj49ZS54JiZlLng+PWMmJm4hPT1lLngmJnBsKHM8bD9uOnIscyxjLGwsczxsP3I6bixzLGUueCxlLnkpKXtjb25zdCB1PU1hdGguYWJzKHMtZS55KS8obi1lLngpO09pKGUsaSkmJih1PGh8fHU9PT1oJiYoZS54Pm8ueHx8ZS54PT09by54JiZ2ZChvLGUpKSkmJihvPWUsaD11KX1lPWUubmV4dH13aGlsZShlIT09YSk7cmV0dXJuIG99ZnVuY3Rpb24gdmQoaSx0KXtyZXR1cm4gcnQoaS5wcmV2LGksdC5wcmV2KTwwJiZydCh0Lm5leHQsaSxpLm5leHQpPDB9ZnVuY3Rpb24gX2QoaSx0LGUsbil7bGV0IHM9aTtkbyBzLno9PT0wJiYocy56PVpvKHMueCxzLnksdCxlLG4pKSxzLnByZXZaPXMucHJldixzLm5leHRaPXMubmV4dCxzPXMubmV4dDt3aGlsZShzIT09aSk7cy5wcmV2Wi5uZXh0Wj1udWxsLHMucHJldlo9bnVsbCx6ZChzKX1mdW5jdGlvbiB6ZChpKXtsZXQgdCxlPTE7ZG97bGV0IG49aSxzO2k9bnVsbDtsZXQgcj1udWxsO2Zvcih0PTA7bjspe3QrKztsZXQgbz1uLGE9MDtmb3IobGV0IGw9MDtsPGUmJihhKyssbz1vLm5leHRaLCEhbyk7bCsrKTtsZXQgYz1lO2Zvcig7YT4wfHxjPjAmJm87KWEhPT0wJiYoYz09PTB8fCFvfHxuLno8PW8ueik/KHM9bixuPW4ubmV4dFosYS0tKToocz1vLG89by5uZXh0WixjLS0pLHI/ci5uZXh0Wj1zOmk9cyxzLnByZXZaPXIscj1zO249b31yLm5leHRaPW51bGwsZSo9Mn13aGlsZSh0PjEpO3JldHVybiBpfWZ1bmN0aW9uIFpvKGksdCxlLG4scyl7cmV0dXJuIGk9KGktZSkqc3wwLHQ9KHQtbikqc3wwLGk9KGl8aTw8OCkmMTY3MTE5MzUsaT0oaXxpPDw0KSYyNTI2NDUxMzUsaT0oaXxpPDwyKSY4NTg5OTM0NTksaT0oaXxpPDwxKSYxNDMxNjU1NzY1LHQ9KHR8dDw8OCkmMTY3MTE5MzUsdD0odHx0PDw0KSYyNTI2NDUxMzUsdD0odHx0PDwyKSY4NTg5OTM0NTksdD0odHx0PDwxKSYxNDMxNjU1NzY1LGl8dDw8MX1mdW5jdGlvbiBUZChpKXtsZXQgdD1pLGU9aTtkbyh0Lng8ZS54fHx0Lng9PT1lLngmJnQueTxlLnkpJiYoZT10KSx0PXQubmV4dDt3aGlsZSh0IT09aSk7cmV0dXJuIGV9ZnVuY3Rpb24gcGwoaSx0LGUsbixzLHIsbyxhKXtyZXR1cm4ocy1vKSoodC1hKT49KGktbykqKHItYSkmJihpLW8pKihuLWEpPj0oZS1vKSoodC1hKSYmKGUtbykqKHItYSk+PShzLW8pKihuLWEpfWZ1bmN0aW9uIExpKGksdCxlLG4scyxyLG8sYSl7cmV0dXJuIShpPT09byYmdD09PWEpJiZwbChpLHQsZSxuLHMscixvLGEpfWZ1bmN0aW9uIFBkKGksdCl7cmV0dXJuIGkubmV4dC5pIT09dC5pJiZpLnByZXYuaSE9PXQuaSYmIUNkKGksdCkmJihPaShpLHQpJiZPaSh0LGkpJiZFZChpLHQpJiYocnQoaS5wcmV2LGksdC5wcmV2KXx8cnQoaSx0LnByZXYsdCkpfHxLbihpLHQpJiZydChpLnByZXYsaSxpLm5leHQpPjAmJnJ0KHQucHJldix0LHQubmV4dCk+MCl9ZnVuY3Rpb24gcnQoaSx0LGUpe3JldHVybih0LnktaS55KSooZS54LXQueCktKHQueC1pLngpKihlLnktdC55KX1mdW5jdGlvbiBLbihpLHQpe3JldHVybiBpLng9PT10LngmJmkueT09PXQueX1mdW5jdGlvbiB5bChpLHQsZSxuKXtjb25zdCBzPU9zKHJ0KGksdCxlKSkscj1PcyhydChpLHQsbikpLG89T3MocnQoZSxuLGkpKSxhPU9zKHJ0KGUsbix0KSk7cmV0dXJuISEocyE9PXImJm8hPT1hfHxzPT09MCYmTHMoaSxlLHQpfHxyPT09MCYmTHMoaSxuLHQpfHxvPT09MCYmTHMoZSxpLG4pfHxhPT09MCYmTHMoZSx0LG4pKX1mdW5jdGlvbiBMcyhpLHQsZSl7cmV0dXJuIHQueDw9TWF0aC5tYXgoaS54LGUueCkmJnQueD49TWF0aC5taW4oaS54LGUueCkmJnQueTw9TWF0aC5tYXgoaS55LGUueSkmJnQueT49TWF0aC5taW4oaS55LGUueSl9ZnVuY3Rpb24gT3MoaSl7cmV0dXJuIGk+MD8xOmk8MD8tMTowfWZ1bmN0aW9uIENkKGksdCl7bGV0IGU9aTtkb3tpZihlLmkhPT1pLmkmJmUubmV4dC5pIT09aS5pJiZlLmkhPT10LmkmJmUubmV4dC5pIT09dC5pJiZ5bChlLGUubmV4dCxpLHQpKXJldHVybiEwO2U9ZS5uZXh0fXdoaWxlKGUhPT1pKTtyZXR1cm4hMX1mdW5jdGlvbiBPaShpLHQpe3JldHVybiBydChpLnByZXYsaSxpLm5leHQpPDA/cnQoaSx0LGkubmV4dCk+PTAmJnJ0KGksaS5wcmV2LHQpPj0wOnJ0KGksdCxpLnByZXYpPDB8fHJ0KGksaS5uZXh0LHQpPDB9ZnVuY3Rpb24gRWQoaSx0KXtsZXQgZT1pLG49ITE7Y29uc3Qgcz0oaS54K3QueCkvMixyPShpLnkrdC55KS8yO2RvIGUueT5yIT1lLm5leHQueT5yJiZlLm5leHQueSE9PWUueSYmczwoZS5uZXh0LngtZS54KSooci1lLnkpLyhlLm5leHQueS1lLnkpK2UueCYmKG49IW4pLGU9ZS5uZXh0O3doaWxlKGUhPT1pKTtyZXR1cm4gbn1mdW5jdGlvbiBtbChpLHQpe2NvbnN0IGU9R28oaS5pLGkueCxpLnkpLG49R28odC5pLHQueCx0LnkpLHM9aS5uZXh0LHI9dC5wcmV2O3JldHVybiBpLm5leHQ9dCx0LnByZXY9aSxlLm5leHQ9cyxzLnByZXY9ZSxuLm5leHQ9ZSxlLnByZXY9bixyLm5leHQ9bixuLnByZXY9cixufWZ1bmN0aW9uIGdsKGksdCxlLG4pe2NvbnN0IHM9R28oaSx0LGUpO3JldHVybiBuPyhzLm5leHQ9bi5uZXh0LHMucHJldj1uLG4ubmV4dC5wcmV2PXMsbi5uZXh0PXMpOihzLnByZXY9cyxzLm5leHQ9cyksc31mdW5jdGlvbiBEaShpKXtpLm5leHQucHJldj1pLnByZXYsaS5wcmV2Lm5leHQ9aS5uZXh0LGkucHJldlomJihpLnByZXZaLm5leHRaPWkubmV4dFopLGkubmV4dFomJihpLm5leHRaLnByZXZaPWkucHJldlopfWZ1bmN0aW9uIEdvKGksdCxlKXtyZXR1cm57aSx4OnQseTplLHByZXY6bnVsbCxuZXh0Om51bGwsejowLHByZXZaOm51bGwsbmV4dFo6bnVsbCxzdGVpbmVyOiExfX1mdW5jdGlvbiBCZChpLHQsZSxuKXtsZXQgcz0wO2ZvcihsZXQgcj10LG89ZS1uO3I8ZTtyKz1uKXMrPShpW29dLWlbcl0pKihpW3IrMV0raVtvKzFdKSxvPXI7cmV0dXJuIHN9Y2xhc3MgRmR7c3RhdGljIHRyaWFuZ3VsYXRlKHQsZSxuPTIpe3JldHVybiB5ZCh0LGUsbil9fWNsYXNzIHRpe3N0YXRpYyBhcmVhKHQpe2NvbnN0IGU9dC5sZW5ndGg7bGV0IG49MDtmb3IobGV0IHM9ZS0xLHI9MDtyPGU7cz1yKyspbis9dFtzXS54KnRbcl0ueS10W3JdLngqdFtzXS55O3JldHVybiBuKi41fXN0YXRpYyBpc0Nsb2NrV2lzZSh0KXtyZXR1cm4gdGkuYXJlYSh0KTwwfXN0YXRpYyB0cmlhbmd1bGF0ZVNoYXBlKHQsZSl7Y29uc3Qgbj1bXSxzPVtdLHI9W107eGwodCksd2wobix0KTtsZXQgbz10Lmxlbmd0aDtlLmZvckVhY2goeGwpO2ZvcihsZXQgYz0wO2M8ZS5sZW5ndGg7YysrKXMucHVzaChvKSxvKz1lW2NdLmxlbmd0aCx3bChuLGVbY10pO2NvbnN0IGE9RmQudHJpYW5ndWxhdGUobixzKTtmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrPTMpci5wdXNoKGEuc2xpY2UoYyxjKzMpKTtyZXR1cm4gcn19ZnVuY3Rpb24geGwoaSl7Y29uc3QgdD1pLmxlbmd0aDt0PjImJmlbdC0xXS5lcXVhbHMoaVswXSkmJmkucG9wKCl9ZnVuY3Rpb24gd2woaSx0KXtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKylpLnB1c2godFtlXS54KSxpLnB1c2godFtlXS55KX1jbGFzcyBXbyBleHRlbmRzIEFle2NvbnN0cnVjdG9yKHQ9MSxlPTEsbj0xLHM9MSl7c3VwZXIoKSx0aGlzLnR5cGU9IlBsYW5lR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17d2lkdGg6dCxoZWlnaHQ6ZSx3aWR0aFNlZ21lbnRzOm4saGVpZ2h0U2VnbWVudHM6c307Y29uc3Qgcj10LzIsbz1lLzIsYT1NYXRoLmZsb29yKG4pLGM9TWF0aC5mbG9vcihzKSxsPWErMSxoPWMrMSx1PXQvYSxmPWUvYyxkPVtdLHA9W10seT1bXSxnPVtdO2ZvcihsZXQgdz0wO3c8aDt3Kyspe2NvbnN0IGI9dypmLW87Zm9yKGxldCB4PTA7eDxsO3grKyl7Y29uc3QgbT14KnUtcjtwLnB1c2gobSwtYiwwKSx5LnB1c2goMCwwLDEpLGcucHVzaCh4L2EpLGcucHVzaCgxLXcvYyl9fWZvcihsZXQgdz0wO3c8Yzt3KyspZm9yKGxldCBiPTA7YjxhO2IrKyl7Y29uc3QgeD1iK2wqdyxtPWIrbCoodysxKSxNPWIrMStsKih3KzEpLFM9YisxK2wqdztkLnB1c2goeCxtLFMpLGQucHVzaChtLE0sUyl9dGhpcy5zZXRJbmRleChkKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBSZShwLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgUmUoeSwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgUmUoZywyKSl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnBhcmFtZXRlcnM9T2JqZWN0LmFzc2lnbih7fSx0LnBhcmFtZXRlcnMpLHRoaXN9c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgV28odC53aWR0aCx0LmhlaWdodCx0LndpZHRoU2VnbWVudHMsdC5oZWlnaHRTZWdtZW50cyl9fWNvbnN0IGJsPW5ldyBQLERzPW5ldyBQLGVpPW5ldyBQLG5pPW5ldyBQLEhvPW5ldyBQLElkPW5ldyBQLGtkPW5ldyBQO2NsYXNzIHJle2NvbnN0cnVjdG9yKHQ9bmV3IFAsZT1uZXcgUCl7dGhpcy5zdGFydD10LHRoaXMuZW5kPWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMuc3RhcnQuY29weSh0KSx0aGlzLmVuZC5jb3B5KGUpLHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5zdGFydC5jb3B5KHQuc3RhcnQpLHRoaXMuZW5kLmNvcHkodC5lbmQpLHRoaXN9Z2V0Q2VudGVyKHQpe3JldHVybiB0LmFkZFZlY3RvcnModGhpcy5zdGFydCx0aGlzLmVuZCkubXVsdGlwbHlTY2FsYXIoLjUpfWRlbHRhKHQpe3JldHVybiB0LnN1YlZlY3RvcnModGhpcy5lbmQsdGhpcy5zdGFydCl9ZGlzdGFuY2VTcSgpe3JldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuZW5kKX1kaXN0YW5jZSgpe3JldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG8odGhpcy5lbmQpfWF0KHQsZSl7cmV0dXJuIHRoaXMuZGVsdGEoZSkubXVsdGlwbHlTY2FsYXIodCkuYWRkKHRoaXMuc3RhcnQpfWNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIodCxlKXtibC5zdWJWZWN0b3JzKHQsdGhpcy5zdGFydCksRHMuc3ViVmVjdG9ycyh0aGlzLmVuZCx0aGlzLnN0YXJ0KTtjb25zdCBuPURzLmRvdChEcyk7bGV0IHI9RHMuZG90KGJsKS9uO3JldHVybiBlJiYocj1aKHIsMCwxKSkscn1jbG9zZXN0UG9pbnRUb1BvaW50KHQsZSxuKXtjb25zdCBzPXRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlcih0LGUpO3JldHVybiB0aGlzLmRlbHRhKG4pLm11bHRpcGx5U2NhbGFyKHMpLmFkZCh0aGlzLnN0YXJ0KX1kaXN0YW5jZVNxVG9MaW5lMyh0LGU9SWQsbj1rZCl7Y29uc3Qgcz0xMDAwMDAwMDAwMDAwMDAwMWUtMzI7bGV0IHIsbztjb25zdCBhPXRoaXMuc3RhcnQsYz10LnN0YXJ0LGw9dGhpcy5lbmQsaD10LmVuZDtlaS5zdWJWZWN0b3JzKGwsYSksbmkuc3ViVmVjdG9ycyhoLGMpLEhvLnN1YlZlY3RvcnMoYSxjKTtjb25zdCB1PWVpLmRvdChlaSksZj1uaS5kb3QobmkpLGQ9bmkuZG90KEhvKTtpZih1PD1zJiZmPD1zKXJldHVybiBlLmNvcHkoYSksbi5jb3B5KGMpLGUuc3ViKG4pLGUuZG90KGUpO2lmKHU8PXMpcj0wLG89ZC9mLG89WihvLDAsMSk7ZWxzZXtjb25zdCBwPWVpLmRvdChIbyk7aWYoZjw9cylvPTAscj1aKC1wL3UsMCwxKTtlbHNle2NvbnN0IHk9ZWkuZG90KG5pKSxnPXUqZi15Knk7ZyE9PTA/cj1aKCh5KmQtcCpmKS9nLDAsMSk6cj0wLG89KHkqcitkKS9mLG88MD8obz0wLHI9WigtcC91LDAsMSkpOm8+MSYmKG89MSxyPVooKHktcCkvdSwwLDEpKX19cmV0dXJuIGUuY29weShhKS5hZGQoZWkubXVsdGlwbHlTY2FsYXIocikpLG4uY29weShjKS5hZGQobmkubXVsdGlwbHlTY2FsYXIobykpLGUuc3ViKG4pLGUuZG90KGUpfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5zdGFydC5hcHBseU1hdHJpeDQodCksdGhpcy5lbmQuYXBwbHlNYXRyaXg0KHQpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0LnN0YXJ0LmVxdWFscyh0aGlzLnN0YXJ0KSYmdC5lbmQuZXF1YWxzKHRoaXMuZW5kKX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fXR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX18hPSJ1bmRlZmluZWQiJiZfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInJlZ2lzdGVyIix7ZGV0YWlsOntyZXZpc2lvbjpKfX0pKSx0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmKHdpbmRvdy5fX1RIUkVFX18/YnQoIldBUk5JTkc6IE11bHRpcGxlIGluc3RhbmNlcyBvZiBUaHJlZS5qcyBiZWluZyBpbXBvcnRlZC4iKTp3aW5kb3cuX19USFJFRV9fPUopO2NvbnN0IEFuPW5ldyBNYXAsTmQ9KGk9e30pPT4oe2dlbmVyYXRlVG9wVVYodCxlLG4scyxyKXtjb25zdCBvPWVbbiozXSxhPWVbbiozKzFdLGM9ZVtzKjNdLGw9ZVtzKjMrMV0saD1lW3IqM10sdT1lW3IqMysxXTtsZXQgZjtpZihBbi5oYXModCkpZj1Bbi5nZXQodCk7ZWxzZXtsZXQgZz1pLmJveDM7aWYoIWcpe2c9bmV3IGd0O2NvbnN0IHg9dC5wYXJhbWV0ZXJzLnNoYXBlcy5nZXRQb2ludHMoKS5tYXAobT0+W20ueCxtLnksMF0pLmZsYXQoKTtnLnNldEZyb21BcnJheSh4KX1jb25zdCB3PWcuZ2V0U2l6ZShuZXcgUCk7aS5zcGxpdCYmKHcueS89aS5zcGxpdCksZj17Ym94Omcsc2l6ZTp3fSxBbi5zZXQodCxmKX1jb25zdHtib3g6ZCxzaXplOnB9PWYseT1pLnNwbGl0PzEtaS5zcGxpdDowO3JldHVybltuZXcgaygoby1kLm1pbi54KS9wLngsKGEtZC5taW4ueSkvcC55K3kpLG5ldyBrKChjLWQubWluLngpL3AueCwobC1kLm1pbi55KS9wLnkreSksbmV3IGsoKGgtZC5taW4ueCkvcC54LCh1LWQubWluLnkpL3AueSt5KV19LGdlbmVyYXRlU2lkZVdhbGxVVih0LGUsbixzLHIsbyl7Y29uc3QgYT1lW24qM10sYz1lW24qMysxXSxsPWVbbiozKzJdLGg9ZVtzKjNdLHU9ZVtzKjMrMV0sZj1lW3MqMysyXSxkPWVbciozXSxwPWVbciozKzFdLHk9ZVtyKjMrMl0sZz1lW28qM10sdz1lW28qMysxXSxiPWVbbyozKzJdO2xldCB4O2lmKEFuLmhhcyhlKSl4PUFuLmdldChlKTtlbHNle2NvbnN0IFM9bmV3IGd0O1Muc2V0RnJvbUFycmF5KGUpO2NvbnN0IEE9Uy5nZXRTaXplKG5ldyBQKTtpLnNwbGl0JiYoQS56Lz0xLWkuc3BsaXQpLGkuc2lkZVJlcGVhdCYmKEEuei89aS5zaWRlUmVwZWF0KSx4PXtib3g6UyxzaXplOkF9LEFuLnNldChlLHgpfWNvbnN0e2JveDptLHNpemU6TX09eDtyZXR1cm4gTWF0aC5hYnMoYy11KTxNYXRoLmFicyhhLWgpP1tuZXcgaygoYS1tLm1pbi54KS9NLngsKGwtbS5taW4ueikvTS56KSxuZXcgaygoaC1tLm1pbi54KS9NLngsKGYtbS5taW4ueikvTS56KSxuZXcgaygoZC1tLm1pbi54KS9NLngsKHktbS5taW4ueikvTS56KSxuZXcgaygoZy1tLm1pbi54KS9NLngsKGItbS5taW4ueikvTS56KV06W25ldyBrKChjLW0ubWluLnkpL00ueSwobC1tLm1pbi56KS9NLnopLG5ldyBrKCh1LW0ubWluLnkpL00ueSwoZi1tLm1pbi56KS9NLnopLG5ldyBrKChwLW0ubWluLnkpL00ueSwoeS1tLm1pbi56KS9NLnopLG5ldyBrKCh3LW0ubWluLnkpL00ueSwoYi1tLm1pbi56KS9NLnopXX19KSxSZD0oKT0+e0FuLmNsZWFyKCl9LExkPXtBcmNDdXJ2ZTpzbCxDYXRtdWxsUm9tQ3VydmUzOnJsLEN1YmljQmV6aWVyQ3VydmU6Vm8sQ3ViaWNCZXppZXJDdXJ2ZTM6YWwsRWxsaXBzZUN1cnZlOk5zLExpbmVDdXJ2ZTpVbyxMaW5lQ3VydmUzOmNsLFF1YWRyYXRpY0JlemllckN1cnZlOnFvLFF1YWRyYXRpY0JlemllckN1cnZlMzpsbCxTcGxpbmVDdXJ2ZTpYb307Y2xhc3MgaWkgZXh0ZW5kcyBBZXtjb25zdHJ1Y3Rvcih0PW5ldyBmbChbbmV3IGsoLjUsLjUpLG5ldyBrKC0uNSwuNSksbmV3IGsoLS41LC0uNSksbmV3IGsoLjUsLS41KV0pLGU9e30pe3N1cGVyKCksdGhpcy50eXBlPSJFeHRydWRlR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17c2hhcGVzOnQsb3B0aW9uczplfSx0PUFycmF5LmlzQXJyYXkodCk/dDpbdF07Y29uc3Qgbj10aGlzLHM9W10scj1bXTtmb3IobGV0IGE9MCxjPXQubGVuZ3RoO2E8YzthKyspe2NvbnN0IGw9dFthXTtvKGwpfXRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFJlKHMsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IFJlKHIsMikpLHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtmdW5jdGlvbiBvKGEpe3ZhciBhZixjZixsZjtjb25zdCBjPVtdLGw9ZS5jdXJ2ZVNlZ21lbnRzIT09dm9pZCAwP2UuY3VydmVTZWdtZW50czoxMixoPWUuc3RlcHMhPT12b2lkIDA/ZS5zdGVwczoxLHU9ZS5kZXB0aCE9PXZvaWQgMD9lLmRlcHRoOjE7bGV0IGY9ZS5iZXZlbEVuYWJsZWQhPT12b2lkIDA/ZS5iZXZlbEVuYWJsZWQ6ITAsZD1lLmJldmVsVGhpY2tuZXNzIT09dm9pZCAwP2UuYmV2ZWxUaGlja25lc3M6LjIscD1lLmJldmVsU2l6ZSE9PXZvaWQgMD9lLmJldmVsU2l6ZTpkLS4xLHk9ZS5iZXZlbE9mZnNldCE9PXZvaWQgMD9lLmJldmVsT2Zmc2V0OjAsZz1lLmJldmVsU2VnbWVudHMhPT12b2lkIDA/ZS5iZXZlbFNlZ21lbnRzOjM7Y29uc3Qgdz1lLmV4dHJ1ZGVQYXRoLGI9ZS5VVkdlbmVyYXRvciE9PXZvaWQgMD9lLlVWR2VuZXJhdG9yOk9kLHg9KGFmPWUuaGFzVG9wKSE9bnVsbD9hZjohMCxtPShjZj1lLmhhc0JvdHRvbSkhPW51bGw/Y2Y6ITAsTT0obGY9ZS5oYXNTaWRlKSE9bnVsbD9sZjohMDtsZXQgUyxBPSExLHYsXyxULHo7dyYmKFM9dy5nZXRTcGFjZWRQb2ludHMoaCksQT0hMCxmPSExLHY9dy5jb21wdXRlRnJlbmV0RnJhbWVzKGgsITEpLF89bmV3IFAsVD1uZXcgUCx6PW5ldyBQKSxmfHwoZz0wLGQ9MCxwPTAseT0wKTtjb25zdCBDPWEuZXh0cmFjdFBvaW50cyhsKTtsZXQgRT1DLnNoYXBlO2NvbnN0IEY9Qy5ob2xlcztpZighdGkuaXNDbG9ja1dpc2UoRSkpe0U9RS5yZXZlcnNlKCk7Zm9yKGxldCBOPTAsTD1GLmxlbmd0aDtOPEw7TisrKXtjb25zdCBPPUZbTl07dGkuaXNDbG9ja1dpc2UoTykmJihGW05dPU8ucmV2ZXJzZSgpKX19ZnVuY3Rpb24gSShOKXtjb25zdCBPPTEwMDAwMDAwMDAwMDAwMDAxZS0zNjtsZXQgJD1OWzBdO2ZvcihsZXQgRD0xO0Q8PU4ubGVuZ3RoO0QrKyl7Y29uc3QgWT1EJU4ubGVuZ3RoLFc9TltZXSxpdD1XLngtJC54LGx0PVcueS0kLnksd3Q9aXQqaXQrbHQqbHQsZWU9TWF0aC5tYXgoTWF0aC5hYnMoVy54KSxNYXRoLmFicyhXLnkpLE1hdGguYWJzKCQueCksTWF0aC5hYnMoJC55KSksRG49TyplZSplZTtpZih3dDw9RG4pe04uc3BsaWNlKFksMSksRC0tO2NvbnRpbnVlfSQ9V319SShFKSxGLmZvckVhY2goSSk7Y29uc3QgUj1GLmxlbmd0aCxWPUU7Zm9yKGxldCBOPTA7TjxSO04rKyl7Y29uc3QgTD1GW05dO0U9RS5jb25jYXQoTCl9ZnVuY3Rpb24gVShOLEwsTyl7cmV0dXJuIEx8fGVycm9yKCJFeHRydWRlR2VvbWV0cnk6IHZlYyBkb2VzIG5vdCBleGlzdCIpLE4uY2xvbmUoKS5hZGRTY2FsZWRWZWN0b3IoTCxPKX1jb25zdCBLPUUubGVuZ3RoO2Z1bmN0aW9uIGN0KE4sTCxPKXtsZXQgJCxELFk7Y29uc3QgVz1OLngtTC54LGl0PU4ueS1MLnksbHQ9Ty54LU4ueCx3dD1PLnktTi55LGVlPVcqVytpdCppdCxEbj1XKnd0LWl0Kmx0O2lmKE1hdGguYWJzKERuKT5OdW1iZXIuRVBTSUxPTil7Y29uc3QgbmU9TWF0aC5zcXJ0KGVlKSxoZj1NYXRoLnNxcnQobHQqbHQrd3Qqd3QpLHVmPUwueC1pdC9uZSxmZj1MLnkrVy9uZSxheD1PLngtd3QvaGYsY3g9Ty55K2x0L2hmLGRmPSgoYXgtdWYpKnd0LShjeC1mZikqbHQpLyhXKnd0LWl0Kmx0KTskPXVmK1cqZGYtTi54LEQ9ZmYraXQqZGYtTi55O2NvbnN0IHBmPSQqJCtEKkQ7aWYocGY8PTIpcmV0dXJuIG5ldyBrKCQsRCk7WT1NYXRoLnNxcnQocGYvMil9ZWxzZXtsZXQgbmU9ITE7Vz5OdW1iZXIuRVBTSUxPTj9sdD5OdW1iZXIuRVBTSUxPTiYmKG5lPSEwKTpXPC1OdW1iZXIuRVBTSUxPTj9sdDwtTnVtYmVyLkVQU0lMT04mJihuZT0hMCk6TWF0aC5zaWduKGl0KT09PU1hdGguc2lnbih3dCkmJihuZT0hMCksbmU/KCQ9LWl0LEQ9VyxZPU1hdGguc3FydChlZSkpOigkPVcsRD1pdCxZPU1hdGguc3FydChlZS8yKSl9cmV0dXJuIG5ldyBrKCQvWSxEL1kpfWNvbnN0IEZ0PVtdO2ZvcihsZXQgTj0wLEw9Vi5sZW5ndGgsTz1MLTEsJD1OKzE7TjxMO04rKyxPKyssJCsrKU89PT1MJiYoTz0wKSwkPT09TCYmKCQ9MCksRnRbTl09Y3QoVltOXSxWW09dLFZbJF0pO2NvbnN0IEl0PVtdO2xldCBXdCx2dD1GdC5jb25jYXQoKTtmb3IobGV0IE49MCxMPVI7TjxMO04rKyl7Y29uc3QgTz1GW05dO1d0PVtdO2ZvcihsZXQgJD0wLEQ9Ty5sZW5ndGgsWT1ELTEsVz0kKzE7JDxEOyQrKyxZKyssVysrKVk9PT1EJiYoWT0wKSxXPT09RCYmKFc9MCksV3RbJF09Y3QoT1skXSxPW1ldLE9bV10pO0l0LnB1c2goV3QpLHZ0PXZ0LmNvbmNhdChXdCl9bGV0IFllO2lmKGc9PT0wKVllPXRpLnRyaWFuZ3VsYXRlU2hhcGUoVixGKTtlbHNle2NvbnN0IE49W10sTD1bXTtmb3IobGV0IE89MDtPPGc7TysrKXtjb25zdCAkPU8vZyxEPWQqTWF0aC5jb3MoJCpNYXRoLlBJLzIpLFk9cCpNYXRoLnNpbigkKk1hdGguUEkvMikreTtmb3IobGV0IFc9MCxpdD1WLmxlbmd0aDtXPGl0O1crKyl7Y29uc3QgbHQ9VShWW1ddLEZ0W1ddLFkpO3RlKGx0LngsbHQueSwtRCksJD09PTAmJk4ucHVzaChsdCl9Zm9yKGxldCBXPTAsaXQ9UjtXPGl0O1crKyl7Y29uc3QgbHQ9RltXXTtXdD1JdFtXXTtjb25zdCB3dD1bXTtmb3IobGV0IGVlPTAsRG49bHQubGVuZ3RoO2VlPERuO2VlKyspe2NvbnN0IG5lPVUobHRbZWVdLFd0W2VlXSxZKTt0ZShuZS54LG5lLnksLUQpLCQ9PT0wJiZ3dC5wdXNoKG5lKX0kPT09MCYmTC5wdXNoKHd0KX19WWU9dGkudHJpYW5ndWxhdGVTaGFwZShOLEwpfWNvbnN0IF9pPVllLmxlbmd0aCxvbz1wK3k7Zm9yKGxldCBOPTA7TjxLO04rKyl7Y29uc3QgTD1mP1UoRVtOXSx2dFtOXSxvbyk6RVtOXTtBPyhULmNvcHkodi5ub3JtYWxzWzBdKS5tdWx0aXBseVNjYWxhcihMLngpLF8uY29weSh2LmJpbm9ybWFsc1swXSkubXVsdGlwbHlTY2FsYXIoTC55KSx6LmNvcHkoU1swXSkuYWRkKFQpLmFkZChfKSx0ZSh6Lngsei55LHoueikpOnRlKEwueCxMLnksMCl9Zm9yKGxldCBOPTE7Tjw9aDtOKyspZm9yKGxldCBMPTA7TDxLO0wrKyl7Y29uc3QgTz1mP1UoRVtMXSx2dFtMXSxvbyk6RVtMXTtBPyhULmNvcHkodi5ub3JtYWxzW05dKS5tdWx0aXBseVNjYWxhcihPLngpLF8uY29weSh2LmJpbm9ybWFsc1tOXSkubXVsdGlwbHlTY2FsYXIoTy55KSx6LmNvcHkoU1tOXSkuYWRkKFQpLmFkZChfKSx0ZSh6Lngsei55LHoueikpOnRlKE8ueCxPLnksdS9oKk4pfWZvcihsZXQgTj1nLTE7Tj49MDtOLS0pe2NvbnN0IEw9Ti9nLE89ZCpNYXRoLmNvcyhMKk1hdGguUEkvMiksJD1wKk1hdGguc2luKEwqTWF0aC5QSS8yKSt5O2ZvcihsZXQgRD0wLFk9Vi5sZW5ndGg7RDxZO0QrKyl7Y29uc3QgVz1VKFZbRF0sRnRbRF0sJCk7dGUoVy54LFcueSx1K08pfWZvcihsZXQgRD0wLFk9Ri5sZW5ndGg7RDxZO0QrKyl7Y29uc3QgVz1GW0RdO1d0PUl0W0RdO2ZvcihsZXQgaXQ9MCxsdD1XLmxlbmd0aDtpdDxsdDtpdCsrKXtjb25zdCB3dD1VKFdbaXRdLFd0W2l0XSwkKTtBP3RlKHd0Lngsd3QueStTW2gtMV0ueSxTW2gtMV0ueCtPKTp0ZSh3dC54LHd0LnksdStPKX19fVBjKCksTSYmQ2MoKTtmdW5jdGlvbiBQYygpe2NvbnN0IE49cy5sZW5ndGgvMztpZihmKXtsZXQgTD0wLE89SypMO2lmKG0pZm9yKGxldCAkPTA7JDxfaTskKyspe2NvbnN0IEQ9WWVbJF07Y28oRFsyXStPLERbMV0rTyxEWzBdK08pfWlmKEw9aCtnKjIsTz1LKkwseClmb3IobGV0ICQ9MDskPF9pOyQrKyl7Y29uc3QgRD1ZZVskXTtjbyhEWzBdK08sRFsxXStPLERbMl0rTyl9fWVsc2V7aWYobSlmb3IobGV0IEw9MDtMPF9pO0wrKyl7Y29uc3QgTz1ZZVtMXTtjbyhPWzJdLE9bMV0sT1swXSl9aWYoeClmb3IobGV0IEw9MDtMPF9pO0wrKyl7Y29uc3QgTz1ZZVtMXTtjbyhPWzBdK0sqaCxPWzFdK0sqaCxPWzJdK0sqaCl9fW4uYWRkR3JvdXAoTixzLmxlbmd0aC8zLU4sMCl9ZnVuY3Rpb24gQ2MoKXtjb25zdCBOPXMubGVuZ3RoLzM7bGV0IEw9MDthbyhWLEwpLEwrPVYubGVuZ3RoO2ZvcihsZXQgTz0wLCQ9Ri5sZW5ndGg7TzwkO08rKyl7Y29uc3QgRD1GW09dO2FvKEQsTCksTCs9RC5sZW5ndGh9bi5hZGRHcm91cChOLHMubGVuZ3RoLzMtTiwxKX1mdW5jdGlvbiBhbyhOLEwpe2xldCBPPU4ubGVuZ3RoO2Zvcig7LS1PPj0wOyl7Y29uc3QgJD1PO2xldCBEPU8tMTtEPDAmJihEPU4ubGVuZ3RoLTEpO2ZvcihsZXQgWT0wLFc9aCtnKjI7WTxXO1krKyl7Y29uc3QgaXQ9SypZLGx0PUsqKFkrMSksd3Q9TCskK2l0LGVlPUwrRCtpdCxEbj1MK0QrbHQsbmU9TCskK2x0O294KHd0LGVlLERuLG5lKX19fWZ1bmN0aW9uIHRlKE4sTCxPKXtjLnB1c2goTiksYy5wdXNoKEwpLGMucHVzaChPKX1mdW5jdGlvbiBjbyhOLEwsTyl7amUoTiksamUoTCksamUoTyk7Y29uc3QgJD1zLmxlbmd0aC8zLEQ9Yi5nZW5lcmF0ZVRvcFVWKG4scywkLTMsJC0yLCQtMSk7UWUoRFswXSksUWUoRFsxXSksUWUoRFsyXSl9ZnVuY3Rpb24gb3goTixMLE8sJCl7amUoTiksamUoTCksamUoJCksamUoTCksamUoTyksamUoJCk7Y29uc3QgRD1zLmxlbmd0aC8zLFk9Yi5nZW5lcmF0ZVNpZGVXYWxsVVYobixzLEQtNixELTMsRC0yLEQtMSk7UWUoWVswXSksUWUoWVsxXSksUWUoWVszXSksUWUoWVsxXSksUWUoWVsyXSksUWUoWVszXSl9ZnVuY3Rpb24gamUoTil7cy5wdXNoKGNbTiozKzBdKSxzLnB1c2goY1tOKjMrMV0pLHMucHVzaChjW04qMysyXSl9ZnVuY3Rpb24gUWUoTil7ci5wdXNoKE4ueCksci5wdXNoKE4ueSl9fX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LHQucGFyYW1ldGVycyksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpLGU9dGhpcy5wYXJhbWV0ZXJzLnNoYXBlcyxuPXRoaXMucGFyYW1ldGVycy5vcHRpb25zO3JldHVybiBEZChlLG4sdCl9c3RhdGljIGZyb21KU09OKHQsZSl7Y29uc3Qgbj1bXTtmb3IobGV0IHI9MCxvPXQuc2hhcGVzLmxlbmd0aDtyPG87cisrKXtjb25zdCBhPWVbdC5zaGFwZXNbcl1dO24ucHVzaChhKX1jb25zdCBzPXQub3B0aW9ucy5leHRydWRlUGF0aDtyZXR1cm4gcyE9PXZvaWQgMCYmKHQub3B0aW9ucy5leHRydWRlUGF0aD1uZXcgTGRbcy50eXBlXSgpLmZyb21KU09OKHMpKSxuZXcgaWkobix0Lm9wdGlvbnMpfX1jb25zdCBPZD17Z2VuZXJhdGVUb3BVVjpmdW5jdGlvbihpLHQsZSxuLHMpe2NvbnN0IHI9dFtlKjNdLG89dFtlKjMrMV0sYT10W24qM10sYz10W24qMysxXSxsPXRbcyozXSxoPXRbcyozKzFdO3JldHVybltuZXcgayhyLG8pLG5ldyBrKGEsYyksbmV3IGsobCxoKV19LGdlbmVyYXRlU2lkZVdhbGxVVjpmdW5jdGlvbihpLHQsZSxuLHMscil7Y29uc3Qgbz10W2UqM10sYT10W2UqMysxXSxjPXRbZSozKzJdLGw9dFtuKjNdLGg9dFtuKjMrMV0sdT10W24qMysyXSxmPXRbcyozXSxkPXRbcyozKzFdLHA9dFtzKjMrMl0seT10W3IqM10sZz10W3IqMysxXSx3PXRbciozKzJdO3JldHVybiBNYXRoLmFicyhhLWgpPE1hdGguYWJzKG8tbCk/W25ldyBrKG8sMS1jKSxuZXcgayhsLDEtdSksbmV3IGsoZiwxLXApLG5ldyBrKHksMS13KV06W25ldyBrKGEsMS1jKSxuZXcgayhoLDEtdSksbmV3IGsoZCwxLXApLG5ldyBrKGcsMS13KV19fTtmdW5jdGlvbiBEZChpLHQsZSl7aWYoZS5zaGFwZXM9W10sQXJyYXkuaXNBcnJheShpKSlmb3IobGV0IG49MCxzPWkubGVuZ3RoO248cztuKyspe2NvbnN0IHI9aVtuXTtlLnNoYXBlcy5wdXNoKHIudXVpZCl9ZWxzZSBlLnNoYXBlcy5wdXNoKGkudXVpZCk7cmV0dXJuIGUub3B0aW9ucz1PYmplY3QuYXNzaWduKHt9LHQpLHQuZXh0cnVkZVBhdGghPT12b2lkIDAmJihlLm9wdGlvbnMuZXh0cnVkZVBhdGg9dC5leHRydWRlUGF0aC50b0pTT04oKSksZX1jb25zdCBNbD0wLCRkPTEsVmQ9MixBbD0yLEpvPTEuMjUsU2w9MSxOdD02KjQrNCs0LEF0PU50LzQsdmw9NjU1MzUsVWQ9TWF0aC5wb3coMiwtMjQpLFlvPVN5bWJvbCgiU0tJUF9HRU5FUkFUSU9OIik7ZnVuY3Rpb24gcWQoaSl7cmV0dXJuIGkuaW5kZXg/aS5pbmRleC5jb3VudDppLmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnR9ZnVuY3Rpb24gU24oaSl7cmV0dXJuIHFkKGkpLzN9ZnVuY3Rpb24gWGQoaSx0PUFycmF5QnVmZmVyKXtyZXR1cm4gaT42NTUzNT9uZXcgVWludDMyQXJyYXkobmV3IHQoNCppKSk6bmV3IFVpbnQxNkFycmF5KG5ldyB0KDIqaSkpfWZ1bmN0aW9uIFpkKGksdCl7aWYoIWkuaW5kZXgpe2NvbnN0IGU9aS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50LG49dC51c2VTaGFyZWRBcnJheUJ1ZmZlcj9TaGFyZWRBcnJheUJ1ZmZlcjpBcnJheUJ1ZmZlcixzPVhkKGUsbik7aS5zZXRJbmRleChuZXcgeHQocywxKSk7Zm9yKGxldCByPTA7cjxlO3IrKylzW3JdPXJ9fWZ1bmN0aW9uIF9sKGksdCl7Y29uc3QgZT1TbihpKSxuPXR8fGkuZHJhd1JhbmdlLHM9bi5zdGFydC8zLHI9KG4uc3RhcnQrbi5jb3VudCkvMyxvPU1hdGgubWF4KDAscyksYT1NYXRoLm1pbihlLHIpLW87cmV0dXJuW3tvZmZzZXQ6TWF0aC5mbG9vcihvKSxjb3VudDpNYXRoLmZsb29yKGEpfV19ZnVuY3Rpb24gemwoaSx0KXtpZighaS5ncm91cHN8fCFpLmdyb3Vwcy5sZW5ndGgpcmV0dXJuIF9sKGksdCk7Y29uc3QgZT1bXSxuPXR8fGkuZHJhd1JhbmdlLHM9bi5zdGFydC8zLHI9KG4uc3RhcnQrbi5jb3VudCkvMyxvPVNuKGkpLGE9W107Zm9yKGNvbnN0IGggb2YgaS5ncm91cHMpe2NvbnN0e3N0YXJ0OnUsY291bnQ6Zn09aCxkPXUvMyxwPWlzRmluaXRlKGYpP2Y6byozLXUseT0odStwKS8zO2Q8ciYmeT5zJiYoYS5wdXNoKHtwb3M6TWF0aC5tYXgocyxkKSxpc1N0YXJ0OiEwfSksYS5wdXNoKHtwb3M6TWF0aC5taW4ocix5KSxpc1N0YXJ0OiExfSkpfWEuc29ydCgoaCx1KT0+aC5wb3MhPT11LnBvcz9oLnBvcy11LnBvczpoLnR5cGU9PT0iZW5kIj8tMToxKTtsZXQgYz0wLGw9bnVsbDtmb3IoY29uc3QgaCBvZiBhKXtjb25zdCB1PWgucG9zO2MhPT0wJiZ1IT09bCYmZS5wdXNoKHtvZmZzZXQ6bCxjb3VudDp1LWx9KSxjKz1oLmlzU3RhcnQ/MTotMSxsPXV9cmV0dXJuIGV9ZnVuY3Rpb24gam8oaSx0LGUsbixzKXtsZXQgcj0xLzAsbz0xLzAsYT0xLzAsYz0tMS8wLGw9LTEvMCxoPS0xLzAsdT0xLzAsZj0xLzAsZD0xLzAscD0tMS8wLHk9LTEvMCxnPS0xLzA7Y29uc3Qgdz1pLm9mZnNldHx8MDtmb3IobGV0IGI9KHQtdykqNix4PSh0K2UtdykqNjtiPHg7Yis9Nil7Y29uc3QgbT1pW2IrMF0sTT1pW2IrMV0sUz1tLU0sQT1tK007UzxyJiYocj1TKSxBPmMmJihjPUEpLG08dSYmKHU9bSksbT5wJiYocD1tKTtjb25zdCB2PWlbYisyXSxfPWlbYiszXSxUPXYtXyx6PXYrXztUPG8mJihvPVQpLHo+bCYmKGw9eiksdjxmJiYoZj12KSx2PnkmJih5PXYpO2NvbnN0IEM9aVtiKzRdLEU9aVtiKzVdLEY9Qy1FLEI9QytFO0Y8YSYmKGE9RiksQj5oJiYoaD1CKSxDPGQmJihkPUMpLEM+ZyYmKGc9Qyl9blswXT1yLG5bMV09byxuWzJdPWEsblszXT1jLG5bNF09bCxuWzVdPWgsc1swXT11LHNbMV09ZixzWzJdPWQsc1szXT1wLHNbNF09eSxzWzVdPWd9ZnVuY3Rpb24gVGwoaSx0LGU9bnVsbCxuPW51bGwscz1udWxsKXtjb25zdCByPWkuYXR0cmlidXRlcy5wb3NpdGlvbixvPWkuaW5kZXg/aS5pbmRleC5hcnJheTpudWxsLGE9ci5ub3JtYWxpemVkO2lmKHM9PT1udWxsKXM9bmV3IEZsb2F0MzJBcnJheShlKjYpLHMub2Zmc2V0PXQ7ZWxzZSBpZih0PDB8fGUrdD5zLmxlbmd0aC82KXRocm93IG5ldyBFcnJvcigiTWVzaEJWSDogY29tcHV0ZSB0cmlhbmdsZSBib3VuZHMgcmFuZ2UgaXMgaW52YWxpZC4iKTtjb25zdCBjPXIuYXJyYXksbD1yLm9mZnNldHx8MDtsZXQgaD0zO3IuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSYmKGg9ci5kYXRhLnN0cmlkZSk7Y29uc3QgdT1bImdldFgiLCJnZXRZIiwiZ2V0WiJdLGY9cy5vZmZzZXQ7Zm9yKGxldCBkPXQscD10K2U7ZDxwO2QrKyl7Y29uc3QgZz0obj9uW2RdOmQpKjMsdz0oZC1mKSo2O2xldCBiPWcrMCx4PWcrMSxtPWcrMjtvJiYoYj1vW2JdLHg9b1t4XSxtPW9bbV0pLGF8fChiPWIqaCtsLHg9eCpoK2wsbT1tKmgrbCk7Zm9yKGxldCBNPTA7TTwzO00rKyl7bGV0IFMsQSx2O2E/KFM9clt1W01dXShiKSxBPXJbdVtNXV0oeCksdj1yW3VbTV1dKG0pKTooUz1jW2IrTV0sQT1jW3grTV0sdj1jW20rTV0pO2xldCBfPVM7QTxfJiYoXz1BKSx2PF8mJihfPXYpO2xldCBUPVM7QT5UJiYoVD1BKSx2PlQmJihUPXYpO2NvbnN0IHo9KFQtXykvMixDPU0qMjtzW3crQyswXT1fK3osc1t3K0MrMV09eisoTWF0aC5hYnMoXykreikqVWR9fXJldHVybiBzfWZ1bmN0aW9uIGh0KGksdCxlKXtyZXR1cm4gZS5taW4ueD10W2ldLGUubWluLnk9dFtpKzFdLGUubWluLno9dFtpKzJdLGUubWF4Lng9dFtpKzNdLGUubWF4Lnk9dFtpKzRdLGUubWF4Lno9dFtpKzVdLGV9ZnVuY3Rpb24gUGwoaSl7bGV0IHQ9LTEsZT0tMS8wO2ZvcihsZXQgbj0wO248MztuKyspe2NvbnN0IHM9aVtuKzNdLWlbbl07cz5lJiYoZT1zLHQ9bil9cmV0dXJuIHR9ZnVuY3Rpb24gQ2woaSx0KXt0LnNldChpKX1mdW5jdGlvbiBFbChpLHQsZSl7bGV0IG4scztmb3IobGV0IHI9MDtyPDM7cisrKXtjb25zdCBvPXIrMztuPWlbcl0scz10W3JdLGVbcl09bjxzP246cyxuPWlbb10scz10W29dLGVbb109bj5zP246c319ZnVuY3Rpb24gJHMoaSx0LGUpe2ZvcihsZXQgbj0wO248MztuKyspe2NvbnN0IHM9dFtpKzIqbl0scj10W2krMipuKzFdLG89cy1yLGE9cytyO288ZVtuXSYmKGVbbl09byksYT5lW24rM10mJihlW24rM109YSl9fWZ1bmN0aW9uICRpKGkpe2NvbnN0IHQ9aVszXS1pWzBdLGU9aVs0XS1pWzFdLG49aVs1XS1pWzJdO3JldHVybiAyKih0KmUrZSpuK24qdCl9Y29uc3QgTGU9MzIsR2Q9KGksdCk9PmkuY2FuZGlkYXRlLXQuY2FuZGlkYXRlLG9uPW5ldyBBcnJheShMZSkuZmlsbCgpLm1hcCgoKT0+KHtjb3VudDowLGJvdW5kczpuZXcgRmxvYXQzMkFycmF5KDYpLHJpZ2h0Q2FjaGVCb3VuZHM6bmV3IEZsb2F0MzJBcnJheSg2KSxsZWZ0Q2FjaGVCb3VuZHM6bmV3IEZsb2F0MzJBcnJheSg2KSxjYW5kaWRhdGU6MH0pKSxWcz1uZXcgRmxvYXQzMkFycmF5KDYpO2Z1bmN0aW9uIFdkKGksdCxlLG4scyxyKXtsZXQgbz0tMSxhPTA7aWYocj09PU1sKW89UGwodCksbyE9PS0xJiYoYT0odFtvXSt0W28rM10pLzIpO2Vsc2UgaWYocj09PSRkKW89UGwoaSksbyE9PS0xJiYoYT1IZChlLG4scyxvKSk7ZWxzZSBpZihyPT09VmQpe2NvbnN0IGM9JGkoaSk7bGV0IGw9Sm8qcztjb25zdCBoPWUub2Zmc2V0fHwwLHU9KG4taCkqNixmPShuK3MtaCkqNjtmb3IobGV0IGQ9MDtkPDM7ZCsrKXtjb25zdCBwPXRbZF0sdz0odFtkKzNdLXApL0xlO2lmKHM8TGUvNCl7Y29uc3QgYj1bLi4ub25dO2IubGVuZ3RoPXM7bGV0IHg9MDtmb3IobGV0IE09dTtNPGY7TSs9Nix4Kyspe2NvbnN0IFM9Ylt4XTtTLmNhbmRpZGF0ZT1lW00rMipkXSxTLmNvdW50PTA7Y29uc3R7Ym91bmRzOkEsbGVmdENhY2hlQm91bmRzOnYscmlnaHRDYWNoZUJvdW5kczpffT1TO2ZvcihsZXQgVD0wO1Q8MztUKyspX1tUXT0xLzAsX1tUKzNdPS0xLzAsdltUXT0xLzAsdltUKzNdPS0xLzAsQVtUXT0xLzAsQVtUKzNdPS0xLzA7JHMoTSxlLEEpfWIuc29ydChHZCk7bGV0IG09cztmb3IobGV0IE09MDtNPG07TSsrKXtjb25zdCBTPWJbTV07Zm9yKDtNKzE8bSYmYltNKzFdLmNhbmRpZGF0ZT09PVMuY2FuZGlkYXRlOyliLnNwbGljZShNKzEsMSksbS0tfWZvcihsZXQgTT11O008ZjtNKz02KXtjb25zdCBTPWVbTSsyKmRdO2ZvcihsZXQgQT0wO0E8bTtBKyspe2NvbnN0IHY9YltBXTtTPj12LmNhbmRpZGF0ZT8kcyhNLGUsdi5yaWdodENhY2hlQm91bmRzKTooJHMoTSxlLHYubGVmdENhY2hlQm91bmRzKSx2LmNvdW50KyspfX1mb3IobGV0IE09MDtNPG07TSsrKXtjb25zdCBTPWJbTV0sQT1TLmNvdW50LHY9cy1TLmNvdW50LF89Uy5sZWZ0Q2FjaGVCb3VuZHMsVD1TLnJpZ2h0Q2FjaGVCb3VuZHM7bGV0IHo9MDtBIT09MCYmKHo9JGkoXykvYyk7bGV0IEM9MDt2IT09MCYmKEM9JGkoVCkvYyk7Y29uc3QgRT1TbCtKbyooeipBK0Mqdik7RTxsJiYobz1kLGw9RSxhPVMuY2FuZGlkYXRlKX19ZWxzZXtmb3IobGV0IG09MDttPExlO20rKyl7Y29uc3QgTT1vblttXTtNLmNvdW50PTAsTS5jYW5kaWRhdGU9cCt3K20qdztjb25zdCBTPU0uYm91bmRzO2ZvcihsZXQgQT0wO0E8MztBKyspU1tBXT0xLzAsU1tBKzNdPS0xLzB9Zm9yKGxldCBtPXU7bTxmO20rPTYpe2xldCBBPX5+KChlW20rMipkXS1wKS93KTtBPj1MZSYmKEE9TGUtMSk7Y29uc3Qgdj1vbltBXTt2LmNvdW50KyssJHMobSxlLHYuYm91bmRzKX1jb25zdCBiPW9uW0xlLTFdO0NsKGIuYm91bmRzLGIucmlnaHRDYWNoZUJvdW5kcyk7Zm9yKGxldCBtPUxlLTI7bT49MDttLS0pe2NvbnN0IE09b25bbV0sUz1vblttKzFdO0VsKE0uYm91bmRzLFMucmlnaHRDYWNoZUJvdW5kcyxNLnJpZ2h0Q2FjaGVCb3VuZHMpfWxldCB4PTA7Zm9yKGxldCBtPTA7bTxMZS0xO20rKyl7Y29uc3QgTT1vblttXSxTPU0uY291bnQsQT1NLmJvdW5kcyxfPW9uW20rMV0ucmlnaHRDYWNoZUJvdW5kcztTIT09MCYmKHg9PT0wP0NsKEEsVnMpOkVsKEEsVnMsVnMpKSx4Kz1TO2xldCBUPTAsej0wO3ghPT0wJiYoVD0kaShWcykvYyk7Y29uc3QgQz1zLXg7QyE9PTAmJih6PSRpKF8pL2MpO2NvbnN0IEU9U2wrSm8qKFQqeCt6KkMpO0U8bCYmKG89ZCxsPUUsYT1NLmNhbmRpZGF0ZSl9fX19ZWxzZSBjb25zb2xlLndhcm4oYE1lc2hCVkg6IEludmFsaWQgYnVpbGQgc3RyYXRlZ3kgdmFsdWUgJHtyfSB1c2VkLmApO3JldHVybntheGlzOm8scG9zOmF9fWZ1bmN0aW9uIEhkKGksdCxlLG4pe2xldCBzPTA7Y29uc3Qgcj1pLm9mZnNldDtmb3IobGV0IG89dCxhPXQrZTtvPGE7bysrKXMrPWlbKG8tcikqNituKjJdO3JldHVybiBzL2V9Y2xhc3MgUW97Y29uc3RydWN0b3IoKXt0aGlzLmJvdW5kaW5nRGF0YT1uZXcgRmxvYXQzMkFycmF5KDYpfX1mdW5jdGlvbiBKZChpLHQsZSxuLHMscil7bGV0IG89bixhPW4rcy0xO2NvbnN0IGM9ci5wb3MsbD1yLmF4aXMqMixoPWUub2Zmc2V0fHwwO2Zvcig7Oyl7Zm9yKDtvPD1hJiZlWyhvLWgpKjYrbF08YzspbysrO2Zvcig7bzw9YSYmZVsoYS1oKSo2K2xdPj1jOylhLS07aWYobzxhKXtmb3IobGV0IHU9MDt1PDM7dSsrKXtsZXQgZj10W28qMyt1XTt0W28qMyt1XT10W2EqMyt1XSx0W2EqMyt1XT1mfWZvcihsZXQgdT0wO3U8Njt1Kyspe2NvbnN0IGY9by1oLGQ9YS1oLHA9ZVtmKjYrdV07ZVtmKjYrdV09ZVtkKjYrdV0sZVtkKjYrdV09cH1vKyssYS0tfWVsc2UgcmV0dXJuIG99fWZ1bmN0aW9uIFlkKGksdCxlLG4scyxyKXtsZXQgbz1uLGE9bitzLTE7Y29uc3QgYz1yLnBvcyxsPXIuYXhpcyoyLGg9ZS5vZmZzZXR8fDA7Zm9yKDs7KXtmb3IoO288PWEmJmVbKG8taCkqNitsXTxjOylvKys7Zm9yKDtvPD1hJiZlWyhhLWgpKjYrbF0+PWM7KWEtLTtpZihvPGEpe2xldCB1PWlbb107aVtvXT1pW2FdLGlbYV09dTtmb3IobGV0IGY9MDtmPDY7ZisrKXtjb25zdCBkPW8taCxwPWEtaCx5PWVbZCo2K2ZdO2VbZCo2K2ZdPWVbcCo2K2ZdLGVbcCo2K2ZdPXl9bysrLGEtLX1lbHNlIHJldHVybiBvfX1sZXQgQmwsVXMsS28sRmw7Y29uc3QgamQ9TWF0aC5wb3coMiwzMik7ZnVuY3Rpb24gdGEoaSl7cmV0dXJuImNvdW50ImluIGk/MToxK3RhKGkubGVmdCkrdGEoaS5yaWdodCl9ZnVuY3Rpb24gUWQoaSx0LGUpe3JldHVybiBCbD1uZXcgRmxvYXQzMkFycmF5KGUpLFVzPW5ldyBVaW50MzJBcnJheShlKSxLbz1uZXcgVWludDE2QXJyYXkoZSksRmw9bmV3IFVpbnQ4QXJyYXkoZSksZWEoaSx0KX1mdW5jdGlvbiBlYShpLHQpe2NvbnN0IGU9aS80LG49aS8yLHM9ImNvdW50ImluIHQscj10LmJvdW5kaW5nRGF0YTtmb3IobGV0IG89MDtvPDY7bysrKUJsW2Urb109cltvXTtpZihzKXJldHVybiB0LmJ1ZmZlcj8oRmwuc2V0KG5ldyBVaW50OEFycmF5KHQuYnVmZmVyKSxpKSxpK3QuYnVmZmVyLmJ5dGVMZW5ndGgpOihVc1tlKzZdPXQub2Zmc2V0LEtvW24rMTRdPXQuY291bnQsS29bbisxNV09dmwsaStOdCk7e2NvbnN0e2xlZnQ6byxyaWdodDphLHNwbGl0QXhpczpjfT10LGw9aStOdDtsZXQgaD1lYShsLG8pO2NvbnN0IHU9aS9OdCxkPWgvTnQtdTtpZihkPmpkKXRocm93IG5ldyBFcnJvcigiTWVzaEJWSDogQ2Fubm90IHN0b3JlIHJlbGF0aXZlIGNoaWxkIG5vZGUgb2Zmc2V0IGdyZWF0ZXIgdGhhbiAzMiBiaXRzLiIpO3JldHVybiBVc1tlKzZdPWQsVXNbZSs3XT1jLGVhKGgsYSl9fWZ1bmN0aW9uIEtkKGksdCxlKXtjb25zdCBzPShpLmluZGV4P2kuaW5kZXguY291bnQ6aS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50KS8zPnppKDIsMTYpLHI9ZS5yZWR1Y2UoKGgsdSk9PmgrdS5jb3VudCwwKSxvPXM/NDoyLGE9dD9uZXcgU2hhcmVkQXJyYXlCdWZmZXIocipvKTpuZXcgQXJyYXlCdWZmZXIocipvKSxjPXM/bmV3IFVpbnQzMkFycmF5KGEpOm5ldyBVaW50MTZBcnJheShhKTtsZXQgbD0wO2ZvcihsZXQgaD0wO2g8ZS5sZW5ndGg7aCsrKXtjb25zdHtvZmZzZXQ6dSxjb3VudDpmfT1lW2hdO2ZvcihsZXQgZD0wO2Q8ZjtkKyspY1tsK2RdPXUrZDtsKz1mfXJldHVybiBjfWZ1bmN0aW9uIHQwKGksdCxlLG4scyl7Y29uc3R7bWF4RGVwdGg6cix2ZXJib3NlOm8sbWF4TGVhZlRyaXM6YSxzdHJhdGVneTpjLG9uUHJvZ3Jlc3M6bCxpbmRpcmVjdDpofT1zLHU9aS5faW5kaXJlY3RCdWZmZXIsZj1pLmdlb21ldHJ5LGQ9Zi5pbmRleD9mLmluZGV4LmFycmF5Om51bGwscD1oP1lkOkpkLHk9U24oZiksZz1uZXcgRmxvYXQzMkFycmF5KDYpO2xldCB3PSExO2NvbnN0IGI9bmV3IFFvO3JldHVybiBqbyh0LGUsbixiLmJvdW5kaW5nRGF0YSxnKSxtKGIsZSxuLGcpLGI7ZnVuY3Rpb24geChNKXtsJiZsKE0veSl9ZnVuY3Rpb24gbShNLFMsQSx2PW51bGwsXz0wKXtpZighdyYmXz49ciYmKHc9ITAsbyYmKGNvbnNvbGUud2FybihgTWVzaEJWSDogTWF4IGRlcHRoIG9mICR7cn0gcmVhY2hlZCB3aGVuIGdlbmVyYXRpbmcgQlZILiBDb25zaWRlciBpbmNyZWFzaW5nIG1heERlcHRoLmApLGNvbnNvbGUud2FybihmKSkpLEE8PWF8fF8+PXIpcmV0dXJuIHgoUytBKSxNLm9mZnNldD1TLE0uY291bnQ9QSxNO2NvbnN0IFQ9V2QoTS5ib3VuZGluZ0RhdGEsdix0LFMsQSxjKTtpZihULmF4aXM9PT0tMSlyZXR1cm4geChTK0EpLE0ub2Zmc2V0PVMsTS5jb3VudD1BLE07Y29uc3Qgej1wKHUsZCx0LFMsQSxUKTtpZih6PT09U3x8ej09PVMrQSl4KFMrQSksTS5vZmZzZXQ9UyxNLmNvdW50PUE7ZWxzZXtNLnNwbGl0QXhpcz1ULmF4aXM7Y29uc3QgQz1uZXcgUW8sRT1TLEY9ei1TO00ubGVmdD1DLGpvKHQsRSxGLEMuYm91bmRpbmdEYXRhLGcpLG0oQyxFLEYsZyxfKzEpO2NvbnN0IEI9bmV3IFFvLEk9eixSPUEtRjtNLnJpZ2h0PUIsam8odCxJLFIsQi5ib3VuZGluZ0RhdGEsZyksbShCLEksUixnLF8rMSl9cmV0dXJuIE19fWZ1bmN0aW9uIGUwKGksdCl7Y29uc3QgZT10LnVzZVNoYXJlZEFycmF5QnVmZmVyP1NoYXJlZEFycmF5QnVmZmVyOkFycmF5QnVmZmVyLG49aS5nZW9tZXRyeTtsZXQgcyxyO2lmKHQuaW5kaXJlY3Qpe2NvbnN0IG89emwobix0LnJhbmdlKSxhPUtkKG4sdC51c2VTaGFyZWRBcnJheUJ1ZmZlcixvKTtpLl9pbmRpcmVjdEJ1ZmZlcj1hLHM9VGwobiwwLGEubGVuZ3RoLGEpLHI9W3tvZmZzZXQ6MCxjb3VudDphLmxlbmd0aH1dfWVsc2V7WmQobix0KTtjb25zdCBvPV9sKG4sdC5yYW5nZSlbMF07cz1UbChuLG8ub2Zmc2V0LG8uY291bnQpLHI9emwobix0LnJhbmdlKX1pLl9yb290cz1yLm1hcChvPT57Y29uc3QgYT10MChpLHMsby5vZmZzZXQsby5jb3VudCx0KSxjPXRhKGEpLGw9bmV3IGUoTnQqYyk7cmV0dXJuIFFkKDAsYSxsKSxsfSl9Y2xhc3MgT2V7Y29uc3RydWN0b3IoKXt0aGlzLm1pbj0xLzAsdGhpcy5tYXg9LTEvMH1zZXRGcm9tUG9pbnRzRmllbGQodCxlKXtsZXQgbj0xLzAscz0tMS8wO2ZvcihsZXQgcj0wLG89dC5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYz10W3JdW2VdO249YzxuP2M6bixzPWM+cz9jOnN9dGhpcy5taW49bix0aGlzLm1heD1zfXNldEZyb21Qb2ludHModCxlKXtsZXQgbj0xLzAscz0tMS8wO2ZvcihsZXQgcj0wLG89ZS5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT1lW3JdLGM9dC5kb3QoYSk7bj1jPG4/YzpuLHM9Yz5zP2M6c310aGlzLm1pbj1uLHRoaXMubWF4PXN9aXNTZXBhcmF0ZWQodCl7cmV0dXJuIHRoaXMubWluPnQubWF4fHx0Lm1pbj50aGlzLm1heH19T2UucHJvdG90eXBlLnNldEZyb21Cb3g9ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBQO3JldHVybiBmdW5jdGlvbihlLG4pe2NvbnN0IHM9bi5taW4scj1uLm1heDtsZXQgbz0xLzAsYT0tMS8wO2ZvcihsZXQgYz0wO2M8PTE7YysrKWZvcihsZXQgbD0wO2w8PTE7bCsrKWZvcihsZXQgaD0wO2g8PTE7aCsrKXtpLng9cy54KmMrci54KigxLWMpLGkueT1zLnkqbCtyLnkqKDEtbCksaS56PXMueipoK3IueiooMS1oKTtjb25zdCB1PWUuZG90KGkpO289TWF0aC5taW4odSxvKSxhPU1hdGgubWF4KHUsYSl9dGhpcy5taW49byx0aGlzLm1heD1hfX0oKTtjb25zdCBuMD1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IFAsdD1uZXcgUCxlPW5ldyBQO3JldHVybiBmdW5jdGlvbihzLHIsbyl7Y29uc3QgYT1zLnN0YXJ0LGM9aSxsPXIuc3RhcnQsaD10O2Uuc3ViVmVjdG9ycyhhLGwpLGkuc3ViVmVjdG9ycyhzLmVuZCxzLnN0YXJ0KSx0LnN1YlZlY3RvcnMoci5lbmQsci5zdGFydCk7Y29uc3QgdT1lLmRvdChoKSxmPWguZG90KGMpLGQ9aC5kb3QoaCkscD1lLmRvdChjKSxnPWMuZG90KGMpKmQtZipmO2xldCB3LGI7ZyE9PTA/dz0odSpmLXAqZCkvZzp3PTAsYj0odSt3KmYpL2Qsby54PXcsby55PWJ9fSgpLG5hPWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgayx0PW5ldyBQLGU9bmV3IFA7cmV0dXJuIGZ1bmN0aW9uKHMscixvLGEpe24wKHMscixpKTtsZXQgYz1pLngsbD1pLnk7aWYoYz49MCYmYzw9MSYmbD49MCYmbDw9MSl7cy5hdChjLG8pLHIuYXQobCxhKTtyZXR1cm59ZWxzZSBpZihjPj0wJiZjPD0xKXtsPDA/ci5hdCgwLGEpOnIuYXQoMSxhKSxzLmNsb3Nlc3RQb2ludFRvUG9pbnQoYSwhMCxvKTtyZXR1cm59ZWxzZSBpZihsPj0wJiZsPD0xKXtjPDA/cy5hdCgwLG8pOnMuYXQoMSxvKSxyLmNsb3Nlc3RQb2ludFRvUG9pbnQobywhMCxhKTtyZXR1cm59ZWxzZXtsZXQgaDtjPDA/aD1zLnN0YXJ0Omg9cy5lbmQ7bGV0IHU7bDwwP3U9ci5zdGFydDp1PXIuZW5kO2NvbnN0IGY9dCxkPWU7aWYocy5jbG9zZXN0UG9pbnRUb1BvaW50KHUsITAsdCksci5jbG9zZXN0UG9pbnRUb1BvaW50KGgsITAsZSksZi5kaXN0YW5jZVRvU3F1YXJlZCh1KTw9ZC5kaXN0YW5jZVRvU3F1YXJlZChoKSl7by5jb3B5KGYpLGEuY29weSh1KTtyZXR1cm59ZWxzZXtvLmNvcHkoaCksYS5jb3B5KGQpO3JldHVybn19fX0oKSxpMD1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IFAsdD1uZXcgUCxlPW5ldyBSbyxuPW5ldyByZTtyZXR1cm4gZnVuY3Rpb24ocixvKXtjb25zdHtyYWRpdXM6YSxjZW50ZXI6Y309cix7YTpsLGI6aCxjOnV9PW87aWYobi5zdGFydD1sLG4uZW5kPWgsbi5jbG9zZXN0UG9pbnRUb1BvaW50KGMsITAsaSkuZGlzdGFuY2VUbyhjKTw9YXx8KG4uc3RhcnQ9bCxuLmVuZD11LG4uY2xvc2VzdFBvaW50VG9Qb2ludChjLCEwLGkpLmRpc3RhbmNlVG8oYyk8PWEpfHwobi5zdGFydD1oLG4uZW5kPXUsbi5jbG9zZXN0UG9pbnRUb1BvaW50KGMsITAsaSkuZGlzdGFuY2VUbyhjKTw9YSkpcmV0dXJuITA7Y29uc3QgeT1vLmdldFBsYW5lKGUpO2lmKE1hdGguYWJzKHkuZGlzdGFuY2VUb1BvaW50KGMpKTw9YSl7Y29uc3Qgdz15LnByb2plY3RQb2ludChjLHQpO2lmKG8uY29udGFpbnNQb2ludCh3KSlyZXR1cm4hMH1yZXR1cm4hMX19KCksczA9WyJ4IiwieSIsInoiXSxEZT0xZS0xNSxJbD1EZSpEZTtmdW5jdGlvbiBvZShpKXtyZXR1cm4gTWF0aC5hYnMoaSk8RGV9Y2xhc3MgYWUgZXh0ZW5kcyBldHtjb25zdHJ1Y3RvciguLi50KXtzdXBlciguLi50KSx0aGlzLmlzRXh0ZW5kZWRUcmlhbmdsZT0hMCx0aGlzLnNhdEF4ZXM9bmV3IEFycmF5KDQpLmZpbGwoKS5tYXAoKCk9Pm5ldyBQKSx0aGlzLnNhdEJvdW5kcz1uZXcgQXJyYXkoNCkuZmlsbCgpLm1hcCgoKT0+bmV3IE9lKSx0aGlzLnBvaW50cz1bdGhpcy5hLHRoaXMuYix0aGlzLmNdLHRoaXMucGxhbmU9bmV3IFJvLHRoaXMuaXNEZWdlbmVyYXRlSW50b1NlZ21lbnQ9ITEsdGhpcy5pc0RlZ2VuZXJhdGVJbnRvUG9pbnQ9ITEsdGhpcy5kZWdlbmVyYXRlU2VnbWVudD1uZXcgcmUsdGhpcy5uZWVkc1VwZGF0ZT0hMH1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiBpMCh0LHRoaXMpfXVwZGF0ZSgpe2NvbnN0IHQ9dGhpcy5hLGU9dGhpcy5iLG49dGhpcy5jLHM9dGhpcy5wb2ludHMscj10aGlzLnNhdEF4ZXMsbz10aGlzLnNhdEJvdW5kcyxhPXJbMF0sYz1vWzBdO3RoaXMuZ2V0Tm9ybWFsKGEpLGMuc2V0RnJvbVBvaW50cyhhLHMpO2NvbnN0IGw9clsxXSxoPW9bMV07bC5zdWJWZWN0b3JzKHQsZSksaC5zZXRGcm9tUG9pbnRzKGwscyk7Y29uc3QgdT1yWzJdLGY9b1syXTt1LnN1YlZlY3RvcnMoZSxuKSxmLnNldEZyb21Qb2ludHModSxzKTtjb25zdCBkPXJbM10scD1vWzNdO2Quc3ViVmVjdG9ycyhuLHQpLHAuc2V0RnJvbVBvaW50cyhkLHMpO2NvbnN0IHk9bC5sZW5ndGgoKSxnPXUubGVuZ3RoKCksdz1kLmxlbmd0aCgpO3RoaXMuaXNEZWdlbmVyYXRlSW50b1BvaW50PSExLHRoaXMuaXNEZWdlbmVyYXRlSW50b1NlZ21lbnQ9ITEseTxEZT9nPERlfHx3PERlP3RoaXMuaXNEZWdlbmVyYXRlSW50b1BvaW50PSEwOih0aGlzLmlzRGVnZW5lcmF0ZUludG9TZWdtZW50PSEwLHRoaXMuZGVnZW5lcmF0ZVNlZ21lbnQuc3RhcnQuY29weSh0KSx0aGlzLmRlZ2VuZXJhdGVTZWdtZW50LmVuZC5jb3B5KG4pKTpnPERlP3c8RGU/dGhpcy5pc0RlZ2VuZXJhdGVJbnRvUG9pbnQ9ITA6KHRoaXMuaXNEZWdlbmVyYXRlSW50b1NlZ21lbnQ9ITAsdGhpcy5kZWdlbmVyYXRlU2VnbWVudC5zdGFydC5jb3B5KGUpLHRoaXMuZGVnZW5lcmF0ZVNlZ21lbnQuZW5kLmNvcHkodCkpOnc8RGUmJih0aGlzLmlzRGVnZW5lcmF0ZUludG9TZWdtZW50PSEwLHRoaXMuZGVnZW5lcmF0ZVNlZ21lbnQuc3RhcnQuY29weShuKSx0aGlzLmRlZ2VuZXJhdGVTZWdtZW50LmVuZC5jb3B5KGUpKSx0aGlzLnBsYW5lLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KGEsdCksdGhpcy5uZWVkc1VwZGF0ZT0hMX19YWUucHJvdG90eXBlLmNsb3Nlc3RQb2ludFRvU2VnbWVudD1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IFAsdD1uZXcgUCxlPW5ldyByZTtyZXR1cm4gZnVuY3Rpb24ocyxyPW51bGwsbz1udWxsKXtjb25zdHtzdGFydDphLGVuZDpjfT1zLGw9dGhpcy5wb2ludHM7bGV0IGgsdT0xLzA7Zm9yKGxldCBmPTA7ZjwzO2YrKyl7Y29uc3QgZD0oZisxKSUzO2Uuc3RhcnQuY29weShsW2ZdKSxlLmVuZC5jb3B5KGxbZF0pLG5hKGUscyxpLHQpLGg9aS5kaXN0YW5jZVRvU3F1YXJlZCh0KSxoPHUmJih1PWgsciYmci5jb3B5KGkpLG8mJm8uY29weSh0KSl9cmV0dXJuIHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChhLGkpLGg9YS5kaXN0YW5jZVRvU3F1YXJlZChpKSxoPHUmJih1PWgsciYmci5jb3B5KGkpLG8mJm8uY29weShhKSksdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KGMsaSksaD1jLmRpc3RhbmNlVG9TcXVhcmVkKGkpLGg8dSYmKHU9aCxyJiZyLmNvcHkoaSksbyYmby5jb3B5KGMpKSxNYXRoLnNxcnQodSl9fSgpLGFlLnByb3RvdHlwZS5pbnRlcnNlY3RzVHJpYW5nbGU9ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBhZSx0PW5ldyBPZSxlPW5ldyBPZSxuPW5ldyBQLHM9bmV3IFAscj1uZXcgUCxvPW5ldyBQLGE9bmV3IHJlLGM9bmV3IHJlLGw9bmV3IFAsaD1uZXcgayx1PW5ldyBrO2Z1bmN0aW9uIGYoeCxtLE0sUyl7Y29uc3QgQT1uOyF4LmlzRGVnZW5lcmF0ZUludG9Qb2ludCYmIXguaXNEZWdlbmVyYXRlSW50b1NlZ21lbnQ/QS5jb3B5KHgucGxhbmUubm9ybWFsKTpBLmNvcHkobS5wbGFuZS5ub3JtYWwpO2NvbnN0IHY9eC5zYXRCb3VuZHMsXz14LnNhdEF4ZXM7Zm9yKGxldCBDPTE7Qzw0O0MrKyl7Y29uc3QgRT12W0NdLEY9X1tDXTtpZih0LnNldEZyb21Qb2ludHMoRixtLnBvaW50cyksRS5pc1NlcGFyYXRlZCh0KXx8KG8uY29weShBKS5jcm9zcyhGKSx0LnNldEZyb21Qb2ludHMobyx4LnBvaW50cyksZS5zZXRGcm9tUG9pbnRzKG8sbS5wb2ludHMpLHQuaXNTZXBhcmF0ZWQoZSkpKXJldHVybiExfWNvbnN0IFQ9bS5zYXRCb3VuZHMsej1tLnNhdEF4ZXM7Zm9yKGxldCBDPTE7Qzw0O0MrKyl7Y29uc3QgRT1UW0NdLEY9eltDXTtpZih0LnNldEZyb21Qb2ludHMoRix4LnBvaW50cyksRS5pc1NlcGFyYXRlZCh0KXx8KG8uY3Jvc3NWZWN0b3JzKEEsRiksdC5zZXRGcm9tUG9pbnRzKG8seC5wb2ludHMpLGUuc2V0RnJvbVBvaW50cyhvLG0ucG9pbnRzKSx0LmlzU2VwYXJhdGVkKGUpKSlyZXR1cm4hMX1yZXR1cm4gTSYmKFN8fGNvbnNvbGUud2FybigiRXh0ZW5kZWRUcmlhbmdsZS5pbnRlcnNlY3RzVHJpYW5nbGU6IFRyaWFuZ2xlcyBhcmUgY29wbGFuYXIgd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBhbiBvdXRwdXQgZWRnZS4gU2V0dGluZyBlZGdlIHRvIDAsIDAsIDAuIiksTS5zdGFydC5zZXQoMCwwLDApLE0uZW5kLnNldCgwLDAsMCkpLCEwfWZ1bmN0aW9uIGQoeCxtLE0sUyxBLHYsXyxULHosQyxFKXtsZXQgRj1fLyhfLVQpO0MueD1TKyhBLVMpKkYsRS5zdGFydC5zdWJWZWN0b3JzKG0seCkubXVsdGlwbHlTY2FsYXIoRikuYWRkKHgpLEY9Xy8oXy16KSxDLnk9Uysodi1TKSpGLEUuZW5kLnN1YlZlY3RvcnMoTSx4KS5tdWx0aXBseVNjYWxhcihGKS5hZGQoeCl9ZnVuY3Rpb24gcCh4LG0sTSxTLEEsdixfLFQseixDLEUpe2lmKEE+MClkKHguYyx4LmEseC5iLFMsbSxNLHosXyxULEMsRSk7ZWxzZSBpZih2PjApZCh4LmIseC5hLHguYyxNLG0sUyxULF8seixDLEUpO2Vsc2UgaWYoVCp6PjB8fF8hPTApZCh4LmEseC5iLHguYyxtLE0sUyxfLFQseixDLEUpO2Vsc2UgaWYoVCE9MClkKHguYix4LmEseC5jLE0sbSxTLFQsXyx6LEMsRSk7ZWxzZSBpZih6IT0wKWQoeC5jLHguYSx4LmIsUyxtLE0seixfLFQsQyxFKTtlbHNlIHJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIHkoeCxtLE0sUyl7Y29uc3QgQT1tLmRlZ2VuZXJhdGVTZWdtZW50LHY9eC5wbGFuZS5kaXN0YW5jZVRvUG9pbnQoQS5zdGFydCksXz14LnBsYW5lLmRpc3RhbmNlVG9Qb2ludChBLmVuZCk7cmV0dXJuIG9lKHYpP29lKF8pP2YoeCxtLE0sUyk6KE0mJihNLnN0YXJ0LmNvcHkoQS5zdGFydCksTS5lbmQuY29weShBLnN0YXJ0KSkseC5jb250YWluc1BvaW50KEEuc3RhcnQpKTpvZShfKT8oTSYmKE0uc3RhcnQuY29weShBLmVuZCksTS5lbmQuY29weShBLmVuZCkpLHguY29udGFpbnNQb2ludChBLmVuZCkpOngucGxhbmUuaW50ZXJzZWN0TGluZShBLG4pIT1udWxsPyhNJiYoTS5zdGFydC5jb3B5KG4pLE0uZW5kLmNvcHkobikpLHguY29udGFpbnNQb2ludChuKSk6ITF9ZnVuY3Rpb24gZyh4LG0sTSl7Y29uc3QgUz1tLmE7cmV0dXJuIG9lKHgucGxhbmUuZGlzdGFuY2VUb1BvaW50KFMpKSYmeC5jb250YWluc1BvaW50KFMpPyhNJiYoTS5zdGFydC5jb3B5KFMpLE0uZW5kLmNvcHkoUykpLCEwKTohMX1mdW5jdGlvbiB3KHgsbSxNKXtjb25zdCBTPXguZGVnZW5lcmF0ZVNlZ21lbnQsQT1tLmE7cmV0dXJuIFMuY2xvc2VzdFBvaW50VG9Qb2ludChBLCEwLG4pLEEuZGlzdGFuY2VUb1NxdWFyZWQobik8SWw/KE0mJihNLnN0YXJ0LmNvcHkoQSksTS5lbmQuY29weShBKSksITApOiExfWZ1bmN0aW9uIGIoeCxtLE0sUyl7aWYoeC5pc0RlZ2VuZXJhdGVJbnRvU2VnbWVudClpZihtLmlzRGVnZW5lcmF0ZUludG9TZWdtZW50KXtjb25zdCBBPXguZGVnZW5lcmF0ZVNlZ21lbnQsdj1tLmRlZ2VuZXJhdGVTZWdtZW50LF89cyxUPXI7QS5kZWx0YShfKSx2LmRlbHRhKFQpO2NvbnN0IHo9bi5zdWJWZWN0b3JzKHYuc3RhcnQsQS5zdGFydCksQz1fLngqVC55LV8ueSpULng7aWYob2UoQykpcmV0dXJuITE7Y29uc3QgRT0oei54KlQueS16LnkqVC54KS9DLEY9LShfLngqei55LV8ueSp6LngpL0M7aWYoRTwwfHxFPjF8fEY8MHx8Rj4xKXJldHVybiExO2NvbnN0IEI9QS5zdGFydC56K18ueipFLEk9di5zdGFydC56K1QueipGO3JldHVybiBvZShCLUkpPyhNJiYoTS5zdGFydC5jb3B5KEEuc3RhcnQpLmFkZFNjYWxlZFZlY3RvcihfLEUpLE0uZW5kLmNvcHkoQS5zdGFydCkuYWRkU2NhbGVkVmVjdG9yKF8sRSkpLCEwKTohMX1lbHNlIHJldHVybiBtLmlzRGVnZW5lcmF0ZUludG9Qb2ludD93KHgsbSxNKTp5KG0seCxNLFMpO2Vsc2V7aWYoeC5pc0RlZ2VuZXJhdGVJbnRvUG9pbnQpcmV0dXJuIG0uaXNEZWdlbmVyYXRlSW50b1BvaW50P20uYS5kaXN0YW5jZVRvU3F1YXJlZCh4LmEpPElsPyhNJiYoTS5zdGFydC5jb3B5KHguYSksTS5lbmQuY29weSh4LmEpKSwhMCk6ITE6bS5pc0RlZ2VuZXJhdGVJbnRvU2VnbWVudD93KG0seCxNKTpnKG0seCxNKTtpZihtLmlzRGVnZW5lcmF0ZUludG9Qb2ludClyZXR1cm4gZyh4LG0sTSk7aWYobS5pc0RlZ2VuZXJhdGVJbnRvU2VnbWVudClyZXR1cm4geSh4LG0sTSxTKX19cmV0dXJuIGZ1bmN0aW9uKG0sTT1udWxsLFM9ITEpe3RoaXMubmVlZHNVcGRhdGUmJnRoaXMudXBkYXRlKCksbS5pc0V4dGVuZGVkVHJpYW5nbGU/bS5uZWVkc1VwZGF0ZSYmbS51cGRhdGUoKTooaS5jb3B5KG0pLGkudXBkYXRlKCksbT1pKTtjb25zdCBBPWIodGhpcyxtLE0sUyk7aWYoQSE9PXZvaWQgMClyZXR1cm4gQTtjb25zdCB2PXRoaXMucGxhbmUsXz1tLnBsYW5lO2xldCBUPV8uZGlzdGFuY2VUb1BvaW50KHRoaXMuYSksej1fLmRpc3RhbmNlVG9Qb2ludCh0aGlzLmIpLEM9Xy5kaXN0YW5jZVRvUG9pbnQodGhpcy5jKTtvZShUKSYmKFQ9MCksb2UoeikmJih6PTApLG9lKEMpJiYoQz0wKTtjb25zdCBFPVQqeixGPVQqQztpZihFPjAmJkY+MClyZXR1cm4hMTtsZXQgQj12LmRpc3RhbmNlVG9Qb2ludChtLmEpLEk9di5kaXN0YW5jZVRvUG9pbnQobS5iKSxSPXYuZGlzdGFuY2VUb1BvaW50KG0uYyk7b2UoQikmJihCPTApLG9lKEkpJiYoST0wKSxvZShSKSYmKFI9MCk7Y29uc3QgVj1CKkksVT1CKlI7aWYoVj4wJiZVPjApcmV0dXJuITE7cy5jb3B5KHYubm9ybWFsKSxyLmNvcHkoXy5ub3JtYWwpO2NvbnN0IEs9cy5jcm9zcyhyKTtsZXQgY3Q9MCxGdD1NYXRoLmFicyhLLngpO2NvbnN0IEl0PU1hdGguYWJzKEsueSk7SXQ+RnQmJihGdD1JdCxjdD0xKSxNYXRoLmFicyhLLnopPkZ0JiYoY3Q9Mik7Y29uc3QgdnQ9czBbY3RdLFllPXRoaXMuYVt2dF0sX2k9dGhpcy5iW3Z0XSxvbz10aGlzLmNbdnRdLFBjPW0uYVt2dF0sQ2M9bS5iW3Z0XSxhbz1tLmNbdnRdO2lmKHAodGhpcyxZZSxfaSxvbyxFLEYsVCx6LEMsaCxhKSlyZXR1cm4gZih0aGlzLG0sTSxTKTtpZihwKG0sUGMsQ2MsYW8sVixVLEIsSSxSLHUsYykpcmV0dXJuIGYodGhpcyxtLE0sUyk7aWYoaC55PGgueCl7Y29uc3QgdGU9aC55O2gueT1oLngsaC54PXRlLGwuY29weShhLnN0YXJ0KSxhLnN0YXJ0LmNvcHkoYS5lbmQpLGEuZW5kLmNvcHkobCl9aWYodS55PHUueCl7Y29uc3QgdGU9dS55O3UueT11LngsdS54PXRlLGwuY29weShjLnN0YXJ0KSxjLnN0YXJ0LmNvcHkoYy5lbmQpLGMuZW5kLmNvcHkobCl9cmV0dXJuIGgueTx1Lnh8fHUueTxoLng/ITE6KE0mJih1Lng+aC54P00uc3RhcnQuY29weShjLnN0YXJ0KTpNLnN0YXJ0LmNvcHkoYS5zdGFydCksdS55PGgueT9NLmVuZC5jb3B5KGMuZW5kKTpNLmVuZC5jb3B5KGEuZW5kKSksITApfX0oKSxhZS5wcm90b3R5cGUuZGlzdGFuY2VUb1BvaW50PWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgUDtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChlLGkpLGUuZGlzdGFuY2VUbyhpKX19KCksYWUucHJvdG90eXBlLmRpc3RhbmNlVG9UcmlhbmdsZT1mdW5jdGlvbigpe2NvbnN0IGk9bmV3IFAsdD1uZXcgUCxlPVsiYSIsImIiLCJjIl0sbj1uZXcgcmUscz1uZXcgcmU7cmV0dXJuIGZ1bmN0aW9uKG8sYT1udWxsLGM9bnVsbCl7Y29uc3QgbD1hfHxjP246bnVsbDtpZih0aGlzLmludGVyc2VjdHNUcmlhbmdsZShvLGwpKXJldHVybihhfHxjKSYmKGEmJmwuZ2V0Q2VudGVyKGEpLGMmJmwuZ2V0Q2VudGVyKGMpKSwwO2xldCBoPTEvMDtmb3IobGV0IHU9MDt1PDM7dSsrKXtsZXQgZjtjb25zdCBkPWVbdV0scD1vW2RdO3RoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChwLGkpLGY9cC5kaXN0YW5jZVRvU3F1YXJlZChpKSxmPGgmJihoPWYsYSYmYS5jb3B5KGkpLGMmJmMuY29weShwKSk7Y29uc3QgeT10aGlzW2RdO28uY2xvc2VzdFBvaW50VG9Qb2ludCh5LGkpLGY9eS5kaXN0YW5jZVRvU3F1YXJlZChpKSxmPGgmJihoPWYsYSYmYS5jb3B5KHkpLGMmJmMuY29weShpKSl9Zm9yKGxldCB1PTA7dTwzO3UrKyl7Y29uc3QgZj1lW3VdLGQ9ZVsodSsxKSUzXTtuLnNldCh0aGlzW2ZdLHRoaXNbZF0pO2ZvcihsZXQgcD0wO3A8MztwKyspe2NvbnN0IHk9ZVtwXSxnPWVbKHArMSklM107cy5zZXQob1t5XSxvW2ddKSxuYShuLHMsaSx0KTtjb25zdCB3PWkuZGlzdGFuY2VUb1NxdWFyZWQodCk7dzxoJiYoaD13LGEmJmEuY29weShpKSxjJiZjLmNvcHkodCkpfX1yZXR1cm4gTWF0aC5zcXJ0KGgpfX0oKTtjbGFzcyBSdHtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5pc09yaWVudGVkQm94PSEwLHRoaXMubWluPW5ldyBQLHRoaXMubWF4PW5ldyBQLHRoaXMubWF0cml4PW5ldyBzdCx0aGlzLmludk1hdHJpeD1uZXcgc3QsdGhpcy5wb2ludHM9bmV3IEFycmF5KDgpLmZpbGwoKS5tYXAoKCk9Pm5ldyBQKSx0aGlzLnNhdEF4ZXM9bmV3IEFycmF5KDMpLmZpbGwoKS5tYXAoKCk9Pm5ldyBQKSx0aGlzLnNhdEJvdW5kcz1uZXcgQXJyYXkoMykuZmlsbCgpLm1hcCgoKT0+bmV3IE9lKSx0aGlzLmFsaWduZWRTYXRCb3VuZHM9bmV3IEFycmF5KDMpLmZpbGwoKS5tYXAoKCk9Pm5ldyBPZSksdGhpcy5uZWVkc1VwZGF0ZT0hMSx0JiZ0aGlzLm1pbi5jb3B5KHQpLGUmJnRoaXMubWF4LmNvcHkoZSksbiYmdGhpcy5tYXRyaXguY29weShuKX1zZXQodCxlLG4pe3RoaXMubWluLmNvcHkodCksdGhpcy5tYXguY29weShlKSx0aGlzLm1hdHJpeC5jb3B5KG4pLHRoaXMubmVlZHNVcGRhdGU9ITB9Y29weSh0KXt0aGlzLm1pbi5jb3B5KHQubWluKSx0aGlzLm1heC5jb3B5KHQubWF4KSx0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSx0aGlzLm5lZWRzVXBkYXRlPSEwfX1SdC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7Y29uc3QgdD10aGlzLm1hdHJpeCxlPXRoaXMubWluLG49dGhpcy5tYXgscz10aGlzLnBvaW50cztmb3IobGV0IGw9MDtsPD0xO2wrKylmb3IobGV0IGg9MDtoPD0xO2grKylmb3IobGV0IHU9MDt1PD0xO3UrKyl7Y29uc3QgZj0xKmx8MipofDQqdSxkPXNbZl07ZC54PWw/bi54OmUueCxkLnk9aD9uLnk6ZS55LGQuej11P24uejplLnosZC5hcHBseU1hdHJpeDQodCl9Y29uc3Qgcj10aGlzLnNhdEJvdW5kcyxvPXRoaXMuc2F0QXhlcyxhPXNbMF07Zm9yKGxldCBsPTA7bDwzO2wrKyl7Y29uc3QgaD1vW2xdLHU9cltsXSxmPTE8PGwsZD1zW2ZdO2guc3ViVmVjdG9ycyhhLGQpLHUuc2V0RnJvbVBvaW50cyhoLHMpfWNvbnN0IGM9dGhpcy5hbGlnbmVkU2F0Qm91bmRzO2NbMF0uc2V0RnJvbVBvaW50c0ZpZWxkKHMsIngiKSxjWzFdLnNldEZyb21Qb2ludHNGaWVsZChzLCJ5IiksY1syXS5zZXRGcm9tUG9pbnRzRmllbGQocywieiIpLHRoaXMuaW52TWF0cml4LmNvcHkodGhpcy5tYXRyaXgpLmludmVydCgpLHRoaXMubmVlZHNVcGRhdGU9ITF9fSgpLFJ0LnByb3RvdHlwZS5pbnRlcnNlY3RzQm94PWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgT2U7cmV0dXJuIGZ1bmN0aW9uKGUpe3RoaXMubmVlZHNVcGRhdGUmJnRoaXMudXBkYXRlKCk7Y29uc3Qgbj1lLm1pbixzPWUubWF4LHI9dGhpcy5zYXRCb3VuZHMsbz10aGlzLnNhdEF4ZXMsYT10aGlzLmFsaWduZWRTYXRCb3VuZHM7aWYoaS5taW49bi54LGkubWF4PXMueCxhWzBdLmlzU2VwYXJhdGVkKGkpfHwoaS5taW49bi55LGkubWF4PXMueSxhWzFdLmlzU2VwYXJhdGVkKGkpKXx8KGkubWluPW4ueixpLm1heD1zLnosYVsyXS5pc1NlcGFyYXRlZChpKSkpcmV0dXJuITE7Zm9yKGxldCBjPTA7YzwzO2MrKyl7Y29uc3QgbD1vW2NdLGg9cltjXTtpZihpLnNldEZyb21Cb3gobCxlKSxoLmlzU2VwYXJhdGVkKGkpKXJldHVybiExfXJldHVybiEwfX0oKSxSdC5wcm90b3R5cGUuaW50ZXJzZWN0c1RyaWFuZ2xlPWZ1bmN0aW9uKCl7Y29uc3QgaT1uZXcgYWUsdD1uZXcgQXJyYXkoMyksZT1uZXcgT2Usbj1uZXcgT2Uscz1uZXcgUDtyZXR1cm4gZnVuY3Rpb24obyl7dGhpcy5uZWVkc1VwZGF0ZSYmdGhpcy51cGRhdGUoKSxvLmlzRXh0ZW5kZWRUcmlhbmdsZT9vLm5lZWRzVXBkYXRlJiZvLnVwZGF0ZSgpOihpLmNvcHkobyksaS51cGRhdGUoKSxvPWkpO2NvbnN0IGE9dGhpcy5zYXRCb3VuZHMsYz10aGlzLnNhdEF4ZXM7dFswXT1vLmEsdFsxXT1vLmIsdFsyXT1vLmM7Zm9yKGxldCBmPTA7ZjwzO2YrKyl7Y29uc3QgZD1hW2ZdLHA9Y1tmXTtpZihlLnNldEZyb21Qb2ludHMocCx0KSxkLmlzU2VwYXJhdGVkKGUpKXJldHVybiExfWNvbnN0IGw9by5zYXRCb3VuZHMsaD1vLnNhdEF4ZXMsdT10aGlzLnBvaW50cztmb3IobGV0IGY9MDtmPDM7ZisrKXtjb25zdCBkPWxbZl0scD1oW2ZdO2lmKGUuc2V0RnJvbVBvaW50cyhwLHUpLGQuaXNTZXBhcmF0ZWQoZSkpcmV0dXJuITF9Zm9yKGxldCBmPTA7ZjwzO2YrKyl7Y29uc3QgZD1jW2ZdO2ZvcihsZXQgcD0wO3A8NDtwKyspe2NvbnN0IHk9aFtwXTtpZihzLmNyb3NzVmVjdG9ycyhkLHkpLGUuc2V0RnJvbVBvaW50cyhzLHQpLG4uc2V0RnJvbVBvaW50cyhzLHUpLGUuaXNTZXBhcmF0ZWQobikpcmV0dXJuITF9fXJldHVybiEwfX0oKSxSdC5wcm90b3R5cGUuY2xvc2VzdFBvaW50VG9Qb2ludD1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpLGUuY29weSh0KS5hcHBseU1hdHJpeDQodGhpcy5pbnZNYXRyaXgpLmNsYW1wKHRoaXMubWluLHRoaXMubWF4KS5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXgpLGV9fSgpLFJ0LnByb3RvdHlwZS5kaXN0YW5jZVRvUG9pbnQ9ZnVuY3Rpb24oKXtjb25zdCBpPW5ldyBQO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KGUsaSksZS5kaXN0YW5jZVRvKGkpfX0oKSxSdC5wcm90b3R5cGUuZGlzdGFuY2VUb0JveD1mdW5jdGlvbigpe2NvbnN0IGk9WyJ4IiwieSIsInoiXSx0PW5ldyBBcnJheSgxMikuZmlsbCgpLm1hcCgoKT0+bmV3IHJlKSxlPW5ldyBBcnJheSgxMikuZmlsbCgpLm1hcCgoKT0+bmV3IHJlKSxuPW5ldyBQLHM9bmV3IFA7cmV0dXJuIGZ1bmN0aW9uKG8sYT0wLGM9bnVsbCxsPW51bGwpe2lmKHRoaXMubmVlZHNVcGRhdGUmJnRoaXMudXBkYXRlKCksdGhpcy5pbnRlcnNlY3RzQm94KG8pKXJldHVybihjfHxsKSYmKG8uZ2V0Q2VudGVyKHMpLHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludChzLG4pLG8uY2xvc2VzdFBvaW50VG9Qb2ludChuLHMpLGMmJmMuY29weShuKSxsJiZsLmNvcHkocykpLDA7Y29uc3QgaD1hKmEsdT1vLm1pbixmPW8ubWF4LGQ9dGhpcy5wb2ludHM7bGV0IHA9MS8wO2ZvcihsZXQgZz0wO2c8ODtnKyspe2NvbnN0IHc9ZFtnXTtzLmNvcHkodykuY2xhbXAodSxmKTtjb25zdCBiPXcuZGlzdGFuY2VUb1NxdWFyZWQocyk7aWYoYjxwJiYocD1iLGMmJmMuY29weSh3KSxsJiZsLmNvcHkocyksYjxoKSlyZXR1cm4gTWF0aC5zcXJ0KGIpfWxldCB5PTA7Zm9yKGxldCBnPTA7ZzwzO2crKylmb3IobGV0IHc9MDt3PD0xO3crKylmb3IobGV0IGI9MDtiPD0xO2IrKyl7Y29uc3QgeD0oZysxKSUzLG09KGcrMiklMyxNPXc8PHh8Yjw8bSxTPTE8PGd8dzw8eHxiPDxtLEE9ZFtNXSx2PWRbU107dFt5XS5zZXQoQSx2KTtjb25zdCBUPWlbZ10sej1pW3hdLEM9aVttXSxFPWVbeV0sRj1FLnN0YXJ0LEI9RS5lbmQ7RltUXT11W1RdLEZbel09dz91W3pdOmZbel0sRltDXT1iP3VbQ106Zlt6XSxCW1RdPWZbVF0sQlt6XT13P3Vbel06Zlt6XSxCW0NdPWI/dVtDXTpmW3pdLHkrK31mb3IobGV0IGc9MDtnPD0xO2crKylmb3IobGV0IHc9MDt3PD0xO3crKylmb3IobGV0IGI9MDtiPD0xO2IrKyl7cy54PWc/Zi54OnUueCxzLnk9dz9mLnk6dS55LHMuej1iP2Yuejp1LnosdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KHMsbik7Y29uc3QgeD1zLmRpc3RhbmNlVG9TcXVhcmVkKG4pO2lmKHg8cCYmKHA9eCxjJiZjLmNvcHkobiksbCYmbC5jb3B5KHMpLHg8aCkpcmV0dXJuIE1hdGguc3FydCh4KX1mb3IobGV0IGc9MDtnPDEyO2crKyl7Y29uc3Qgdz10W2ddO2ZvcihsZXQgYj0wO2I8MTI7YisrKXtjb25zdCB4PWVbYl07bmEodyx4LG4scyk7Y29uc3QgbT1uLmRpc3RhbmNlVG9TcXVhcmVkKHMpO2lmKG08cCYmKHA9bSxjJiZjLmNvcHkobiksbCYmbC5jb3B5KHMpLG08aCkpcmV0dXJuIE1hdGguc3FydChtKX19cmV0dXJuIE1hdGguc3FydChwKX19KCk7Y2xhc3MgaWF7Y29uc3RydWN0b3IodCl7dGhpcy5fZ2V0TmV3UHJpbWl0aXZlPXQsdGhpcy5fcHJpbWl0aXZlcz1bXX1nZXRQcmltaXRpdmUoKXtjb25zdCB0PXRoaXMuX3ByaW1pdGl2ZXM7cmV0dXJuIHQubGVuZ3RoPT09MD90aGlzLl9nZXROZXdQcmltaXRpdmUoKTp0LnBvcCgpfXJlbGVhc2VQcmltaXRpdmUodCl7dGhpcy5fcHJpbWl0aXZlcy5wdXNoKHQpfX1jbGFzcyByMCBleHRlbmRzIGlhe2NvbnN0cnVjdG9yKCl7c3VwZXIoKCk9Pm5ldyBhZSl9fWNvbnN0IGNlPW5ldyByMDtmdW5jdGlvbiBTdChpLHQpe3JldHVybiB0W2krMTVdPT09dmx9ZnVuY3Rpb24gWXQoaSx0KXtyZXR1cm4gdFtpKzZdfWZ1bmN0aW9uIGxlKGksdCl7cmV0dXJuIHRbaSsxNF19ZnVuY3Rpb24gX3QoaSl7cmV0dXJuIGkrQXR9ZnVuY3Rpb24genQoaSx0KXtjb25zdCBlPXRbaSs2XTtyZXR1cm4gaStlKkF0fWZ1bmN0aW9uIHNhKGksdCl7cmV0dXJuIHRbaSs3XX1mdW5jdGlvbiBDeChpKXtyZXR1cm4gaX1jbGFzcyBvMHtjb25zdHJ1Y3Rvcigpe3RoaXMuZmxvYXQzMkFycmF5PW51bGwsdGhpcy51aW50MTZBcnJheT1udWxsLHRoaXMudWludDMyQXJyYXk9bnVsbDtjb25zdCB0PVtdO2xldCBlPW51bGw7dGhpcy5zZXRCdWZmZXI9bj0+e2UmJnQucHVzaChlKSxlPW4sdGhpcy5mbG9hdDMyQXJyYXk9bmV3IEZsb2F0MzJBcnJheShuKSx0aGlzLnVpbnQxNkFycmF5PW5ldyBVaW50MTZBcnJheShuKSx0aGlzLnVpbnQzMkFycmF5PW5ldyBVaW50MzJBcnJheShuKX0sdGhpcy5jbGVhckJ1ZmZlcj0oKT0+e2U9bnVsbCx0aGlzLmZsb2F0MzJBcnJheT1udWxsLHRoaXMudWludDE2QXJyYXk9bnVsbCx0aGlzLnVpbnQzMkFycmF5PW51bGwsdC5sZW5ndGghPT0wJiZ0aGlzLnNldEJ1ZmZlcih0LnBvcCgpKX19fWNvbnN0IG50PW5ldyBvMDtsZXQgYW4sc2k7Y29uc3Qgcmk9W10scXM9bmV3IGlhKCgpPT5uZXcgZ3QpO2Z1bmN0aW9uIGEwKGksdCxlLG4scyxyKXthbj1xcy5nZXRQcmltaXRpdmUoKSxzaT1xcy5nZXRQcmltaXRpdmUoKSxyaS5wdXNoKGFuLHNpKSxudC5zZXRCdWZmZXIoaS5fcm9vdHNbdF0pO2NvbnN0IG89cmEoMCxpLmdlb21ldHJ5LGUsbixzLHIpO250LmNsZWFyQnVmZmVyKCkscXMucmVsZWFzZVByaW1pdGl2ZShhbikscXMucmVsZWFzZVByaW1pdGl2ZShzaSkscmkucG9wKCkscmkucG9wKCk7Y29uc3QgYT1yaS5sZW5ndGg7cmV0dXJuIGE+MCYmKHNpPXJpW2EtMV0sYW49cmlbYS0yXSksb31mdW5jdGlvbiByYShpLHQsZSxuLHM9bnVsbCxyPTAsbz0wKXtjb25zdHtmbG9hdDMyQXJyYXk6YSx1aW50MTZBcnJheTpjLHVpbnQzMkFycmF5Omx9PW50O2xldCBoPWkqMjtpZihTdChoLGMpKXtjb25zdCBmPVl0KGksbCksZD1sZShoLGMpO3JldHVybiBodChpLGEsYW4pLG4oZixkLCExLG8scitpL0F0LGFuKX1lbHNle2xldCBUPWZ1bmN0aW9uKEMpe2NvbnN0e3VpbnQxNkFycmF5OkUsdWludDMyQXJyYXk6Rn09bnQ7bGV0IEI9QyoyO2Zvcig7IVN0KEIsRSk7KUM9X3QoQyksQj1DKjI7cmV0dXJuIFl0KEMsRil9LHo9ZnVuY3Rpb24oQyl7Y29uc3R7dWludDE2QXJyYXk6RSx1aW50MzJBcnJheTpGfT1udDtsZXQgQj1DKjI7Zm9yKDshU3QoQixFKTspQz16dChDLEYpLEI9QyoyO3JldHVybiBZdChDLEYpK2xlKEIsRSl9O2NvbnN0IGY9X3QoaSksZD16dChpLGwpO2xldCBwPWYseT1kLGcsdyxiLHg7aWYocyYmKGI9YW4seD1zaSxodChwLGEsYiksaHQoeSxhLHgpLGc9cyhiKSx3PXMoeCksdzxnKSl7cD1kLHk9Zjtjb25zdCBDPWc7Zz13LHc9QyxiPXh9Ynx8KGI9YW4saHQocCxhLGIpKTtjb25zdCBtPVN0KHAqMixjKSxNPWUoYixtLGcsbysxLHIrcC9BdCk7bGV0IFM7aWYoTT09PUFsKXtjb25zdCBDPVQocCksRj16KHApLUM7Uz1uKEMsRiwhMCxvKzEscitwL0F0LGIpfWVsc2UgUz1NJiZyYShwLHQsZSxuLHMscixvKzEpO2lmKFMpcmV0dXJuITA7eD1zaSxodCh5LGEseCk7Y29uc3QgQT1TdCh5KjIsYyksdj1lKHgsQSx3LG8rMSxyK3kvQXQpO2xldCBfO2lmKHY9PT1BbCl7Y29uc3QgQz1UKHkpLEY9eih5KS1DO189bihDLEYsITAsbysxLHIreS9BdCx4KX1lbHNlIF89diYmcmEoeSx0LGUsbixzLHIsbysxKTtyZXR1cm4hIV99fWNvbnN0IFZpPW5ldyBQLG9hPW5ldyBQO2Z1bmN0aW9uIGMwKGksdCxlPXt9LG49MCxzPTEvMCl7Y29uc3Qgcj1uKm4sbz1zKnM7bGV0IGE9MS8wLGM9bnVsbDtpZihpLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjpoPT4oVmkuY29weSh0KS5jbGFtcChoLm1pbixoLm1heCksVmkuZGlzdGFuY2VUb1NxdWFyZWQodCkpLGludGVyc2VjdHNCb3VuZHM6KGgsdSxmKT0+ZjxhJiZmPG8saW50ZXJzZWN0c1RyaWFuZ2xlOihoLHUpPT57aC5jbG9zZXN0UG9pbnRUb1BvaW50KHQsVmkpO2NvbnN0IGY9dC5kaXN0YW5jZVRvU3F1YXJlZChWaSk7cmV0dXJuIGY8YSYmKG9hLmNvcHkoVmkpLGE9ZixjPXUpLGY8cn19KSxhPT09MS8wKXJldHVybiBudWxsO2NvbnN0IGw9TWF0aC5zcXJ0KGEpO3JldHVybiBlLnBvaW50P2UucG9pbnQuY29weShvYSk6ZS5wb2ludD1vYS5jbG9uZSgpLGUuZGlzdGFuY2U9bCxlLmZhY2VJbmRleD1jLGV9Y29uc3QgWHM9cGFyc2VJbnQoSik+PTE2OSxsMD1wYXJzZUludChKKTw9MTYxLHZuPW5ldyBQLF9uPW5ldyBQLHpuPW5ldyBQLFpzPW5ldyBrLEdzPW5ldyBrLFdzPW5ldyBrLGtsPW5ldyBQLE5sPW5ldyBQLFJsPW5ldyBQLFVpPW5ldyBQO2Z1bmN0aW9uIGgwKGksdCxlLG4scyxyLG8sYSl7bGV0IGM7aWYocj09PTE/Yz1pLmludGVyc2VjdFRyaWFuZ2xlKG4sZSx0LCEwLHMpOmM9aS5pbnRlcnNlY3RUcmlhbmdsZSh0LGUsbixyIT09MixzKSxjPT09bnVsbClyZXR1cm4gbnVsbDtjb25zdCBsPWkub3JpZ2luLmRpc3RhbmNlVG8ocyk7cmV0dXJuIGw8b3x8bD5hP251bGw6e2Rpc3RhbmNlOmwscG9pbnQ6cy5jbG9uZSgpfX1mdW5jdGlvbiBMbChpLHQsZSxuLHMscixvLGEsYyxsLGgpe3ZuLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxyKSxfbi5mcm9tQnVmZmVyQXR0cmlidXRlKHQsbyksem4uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGEpO2NvbnN0IHU9aDAoaSx2bixfbix6bixVaSxjLGwsaCk7aWYodSl7aWYobil7WnMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLHIpLEdzLmZyb21CdWZmZXJBdHRyaWJ1dGUobixvKSxXcy5mcm9tQnVmZmVyQXR0cmlidXRlKG4sYSksdS51dj1uZXcgaztjb25zdCBkPWV0LmdldEludGVycG9sYXRpb24oVWksdm4sX24sem4sWnMsR3MsV3MsdS51dik7WHN8fCh1LnV2PWQpfWlmKHMpe1pzLmZyb21CdWZmZXJBdHRyaWJ1dGUocyxyKSxHcy5mcm9tQnVmZmVyQXR0cmlidXRlKHMsbyksV3MuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLGEpLHUudXYxPW5ldyBrO2NvbnN0IGQ9ZXQuZ2V0SW50ZXJwb2xhdGlvbihVaSx2bixfbix6bixacyxHcyxXcyx1LnV2MSk7WHN8fCh1LnV2MT1kKSxsMCYmKHUudXYyPXUudXYxKX1pZihlKXtrbC5mcm9tQnVmZmVyQXR0cmlidXRlKGUsciksTmwuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLG8pLFJsLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxhKSx1Lm5vcm1hbD1uZXcgUDtjb25zdCBkPWV0LmdldEludGVycG9sYXRpb24oVWksdm4sX24sem4sa2wsTmwsUmwsdS5ub3JtYWwpO3Uubm9ybWFsLmRvdChpLmRpcmVjdGlvbik+MCYmdS5ub3JtYWwubXVsdGlwbHlTY2FsYXIoLTEpLFhzfHwodS5ub3JtYWw9ZCl9Y29uc3QgZj17YTpyLGI6byxjOmEsbm9ybWFsOm5ldyBQLG1hdGVyaWFsSW5kZXg6MH07aWYoZXQuZ2V0Tm9ybWFsKHZuLF9uLHpuLGYubm9ybWFsKSx1LmZhY2U9Zix1LmZhY2VJbmRleD1yLFhzKXtjb25zdCBkPW5ldyBQO2V0LmdldEJhcnljb29yZChVaSx2bixfbix6bixkKSx1LmJhcnljb29yZD1kfX1yZXR1cm4gdX1mdW5jdGlvbiBPbChpKXtyZXR1cm4gaSYmaS5pc01hdGVyaWFsP2kuc2lkZTppfWZ1bmN0aW9uIEhzKGksdCxlLG4scyxyLG8pe2NvbnN0IGE9biozO2xldCBjPWErMCxsPWErMSxoPWErMjtjb25zdHtpbmRleDp1LGdyb3VwczpmfT1pO2kuaW5kZXgmJihjPXUuZ2V0WChjKSxsPXUuZ2V0WChsKSxoPXUuZ2V0WChoKSk7Y29uc3R7cG9zaXRpb246ZCxub3JtYWw6cCx1djp5LHV2MTpnfT1pLmF0dHJpYnV0ZXM7aWYoQXJyYXkuaXNBcnJheSh0KSl7Y29uc3Qgdz1uKjM7Zm9yKGxldCBiPTAseD1mLmxlbmd0aDtiPHg7YisrKXtjb25zdHtzdGFydDptLGNvdW50Ok0sbWF0ZXJpYWxJbmRleDpTfT1mW2JdO2lmKHc+PW0mJnc8bStNKXtjb25zdCBBPU9sKHRbU10pLHY9TGwoZSxkLHAseSxnLGMsbCxoLEEscixvKTtpZih2KWlmKHYuZmFjZUluZGV4PW4sdi5mYWNlLm1hdGVyaWFsSW5kZXg9UyxzKXMucHVzaCh2KTtlbHNlIHJldHVybiB2fX19ZWxzZXtjb25zdCB3PU9sKHQpLGI9TGwoZSxkLHAseSxnLGMsbCxoLHcscixvKTtpZihiKWlmKGIuZmFjZUluZGV4PW4sYi5mYWNlLm1hdGVyaWFsSW5kZXg9MCxzKXMucHVzaChiKTtlbHNlIHJldHVybiBifXJldHVybiBudWxsfWZ1bmN0aW9uIHl0KGksdCxlLG4pe2NvbnN0IHM9aS5hLHI9aS5iLG89aS5jO2xldCBhPXQsYz10KzEsbD10KzI7ZSYmKGE9ZS5nZXRYKGEpLGM9ZS5nZXRYKGMpLGw9ZS5nZXRYKGwpKSxzLng9bi5nZXRYKGEpLHMueT1uLmdldFkoYSkscy56PW4uZ2V0WihhKSxyLng9bi5nZXRYKGMpLHIueT1uLmdldFkoYyksci56PW4uZ2V0WihjKSxvLng9bi5nZXRYKGwpLG8ueT1uLmdldFkobCksby56PW4uZ2V0WihsKX1mdW5jdGlvbiB1MChpLHQsZSxuLHMscixvLGEpe2NvbnN0e2dlb21ldHJ5OmMsX2luZGlyZWN0QnVmZmVyOmx9PWk7Zm9yKGxldCBoPW4sdT1uK3M7aDx1O2grKylIcyhjLHQsZSxoLHIsbyxhKX1mdW5jdGlvbiBmMChpLHQsZSxuLHMscixvKXtjb25zdHtnZW9tZXRyeTphLF9pbmRpcmVjdEJ1ZmZlcjpjfT1pO2xldCBsPTEvMCxoPW51bGw7Zm9yKGxldCB1PW4sZj1uK3M7dTxmO3UrKyl7bGV0IGQ7ZD1IcyhhLHQsZSx1LG51bGwscixvKSxkJiZkLmRpc3RhbmNlPGwmJihoPWQsbD1kLmRpc3RhbmNlKX1yZXR1cm4gaH1mdW5jdGlvbiBkMChpLHQsZSxuLHMscixvKXtjb25zdHtnZW9tZXRyeTphfT1lLHtpbmRleDpjfT1hLGw9YS5hdHRyaWJ1dGVzLnBvc2l0aW9uO2ZvcihsZXQgaD1pLHU9dCtpO2g8dTtoKyspe2xldCBmO2lmKGY9aCx5dChvLGYqMyxjLGwpLG8ubmVlZHNVcGRhdGU9ITAsbihvLGYscyxyKSlyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBwMChpLHQ9bnVsbCl7dCYmQXJyYXkuaXNBcnJheSh0KSYmKHQ9bmV3IFNldCh0KSk7Y29uc3QgZT1pLmdlb21ldHJ5LG49ZS5pbmRleD9lLmluZGV4LmFycmF5Om51bGwscz1lLmF0dHJpYnV0ZXMucG9zaXRpb247bGV0IHIsbyxhLGMsbD0wO2NvbnN0IGg9aS5fcm9vdHM7Zm9yKGxldCBmPTAsZD1oLmxlbmd0aDtmPGQ7ZisrKXI9aFtmXSxvPW5ldyBVaW50MzJBcnJheShyKSxhPW5ldyBVaW50MTZBcnJheShyKSxjPW5ldyBGbG9hdDMyQXJyYXkociksdSgwLGwpLGwrPXIuYnl0ZUxlbmd0aDtmdW5jdGlvbiB1KGYsZCxwPSExKXtjb25zdCB5PWYqMjtpZihTdCh5LGEpKXtjb25zdCBnPW9bZis2XSx3PWFbeSsxNF07bGV0IGI9MS8wLHg9MS8wLG09MS8wLE09LTEvMCxTPS0xLzAsQT0tMS8wO2ZvcihsZXQgdj0zKmcsXz0zKihnK3cpO3Y8Xzt2Kyspe2xldCBUPW5bdl07Y29uc3Qgej1zLmdldFgoVCksQz1zLmdldFkoVCksRT1zLmdldFooVCk7ejxiJiYoYj16KSx6Pk0mJihNPXopLEM8eCYmKHg9QyksQz5TJiYoUz1DKSxFPG0mJihtPUUpLEU+QSYmKEE9RSl9cmV0dXJuIGNbZiswXSE9PWJ8fGNbZisxXSE9PXh8fGNbZisyXSE9PW18fGNbZiszXSE9PU18fGNbZis0XSE9PVN8fGNbZis1XSE9PUE/KGNbZiswXT1iLGNbZisxXT14LGNbZisyXT1tLGNbZiszXT1NLGNbZis0XT1TLGNbZis1XT1BLCEwKTohMX1lbHNle2NvbnN0IGc9X3QoZiksdz16dChmLG8pO2xldCBiPXAseD0hMSxtPSExO2lmKHQpe2lmKCFiKXtjb25zdCBUPWcvQXQrZC9OdCx6PXcvQXQrZC9OdDt4PXQuaGFzKFQpLG09dC5oYXMoeiksYj0heCYmIW19fWVsc2UgeD0hMCxtPSEwO2NvbnN0IE09Ynx8eCxTPWJ8fG07bGV0IEE9ITE7TSYmKEE9dShnLGQsYikpO2xldCB2PSExO1MmJih2PXUodyxkLGIpKTtjb25zdCBfPUF8fHY7aWYoXylmb3IobGV0IFQ9MDtUPDM7VCsrKXtjb25zdCB6PWcrVCxDPXcrVCxFPWNbel0sRj1jW3orM10sQj1jW0NdLEk9Y1tDKzNdO2NbZitUXT1FPEI/RTpCLGNbZitUKzNdPUY+ST9GOkl9cmV0dXJuIF99fX1mdW5jdGlvbiBjbihpLHQsZSxuLHMpe2xldCByLG8sYSxjLGwsaDtjb25zdCB1PTEvZS5kaXJlY3Rpb24ueCxmPTEvZS5kaXJlY3Rpb24ueSxkPTEvZS5kaXJlY3Rpb24ueixwPWUub3JpZ2luLngseT1lLm9yaWdpbi55LGc9ZS5vcmlnaW4uejtsZXQgdz10W2ldLGI9dFtpKzNdLHg9dFtpKzFdLG09dFtpKzMrMV0sTT10W2krMl0sUz10W2krMysyXTtyZXR1cm4gdT49MD8ocj0ody1wKSp1LG89KGItcCkqdSk6KHI9KGItcCkqdSxvPSh3LXApKnUpLGY+PTA/KGE9KHgteSkqZixjPShtLXkpKmYpOihhPShtLXkpKmYsYz0oeC15KSpmKSxyPmN8fGE+b3x8KChhPnJ8fGlzTmFOKHIpKSYmKHI9YSksKGM8b3x8aXNOYU4obykpJiYobz1jKSxkPj0wPyhsPShNLWcpKmQsaD0oUy1nKSpkKToobD0oUy1nKSpkLGg9KE0tZykqZCkscj5ofHxsPm8pPyExOigobD5yfHxyIT09cikmJihyPWwpLChoPG98fG8hPT1vKSYmKG89aCkscjw9cyYmbz49bil9ZnVuY3Rpb24geTAoaSx0LGUsbixzLHIsbyxhKXtjb25zdHtnZW9tZXRyeTpjLF9pbmRpcmVjdEJ1ZmZlcjpsfT1pO2ZvcihsZXQgaD1uLHU9bitzO2g8dTtoKyspe2xldCBmPWw/bFtoXTpoO0hzKGMsdCxlLGYscixvLGEpfX1mdW5jdGlvbiBtMChpLHQsZSxuLHMscixvKXtjb25zdHtnZW9tZXRyeTphLF9pbmRpcmVjdEJ1ZmZlcjpjfT1pO2xldCBsPTEvMCxoPW51bGw7Zm9yKGxldCB1PW4sZj1uK3M7dTxmO3UrKyl7bGV0IGQ7ZD1IcyhhLHQsZSxjP2NbdV06dSxudWxsLHIsbyksZCYmZC5kaXN0YW5jZTxsJiYoaD1kLGw9ZC5kaXN0YW5jZSl9cmV0dXJuIGh9ZnVuY3Rpb24gZzAoaSx0LGUsbixzLHIsbyl7Y29uc3R7Z2VvbWV0cnk6YX09ZSx7aW5kZXg6Y309YSxsPWEuYXR0cmlidXRlcy5wb3NpdGlvbjtmb3IobGV0IGg9aSx1PXQraTtoPHU7aCsrKXtsZXQgZjtpZihmPWUucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoaCkseXQobyxmKjMsYyxsKSxvLm5lZWRzVXBkYXRlPSEwLG4obyxmLHMscikpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24geDAoaSx0LGUsbixzLHIsbyl7bnQuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKSxhYSgwLGksZSxuLHMscixvKSxudC5jbGVhckJ1ZmZlcigpfWZ1bmN0aW9uIGFhKGksdCxlLG4scyxyLG8pe2NvbnN0e2Zsb2F0MzJBcnJheTphLHVpbnQxNkFycmF5OmMsdWludDMyQXJyYXk6bH09bnQsaD1pKjI7aWYoU3QoaCxjKSl7Y29uc3QgZj1ZdChpLGwpLGQ9bGUoaCxjKTt1MCh0LGUsbixmLGQscyxyLG8pfWVsc2V7Y29uc3QgZj1fdChpKTtjbihmLGEsbixyLG8pJiZhYShmLHQsZSxuLHMscixvKTtjb25zdCBkPXp0KGksbCk7Y24oZCxhLG4scixvKSYmYWEoZCx0LGUsbixzLHIsbyl9fWNvbnN0IHcwPVsieCIsInkiLCJ6Il07ZnVuY3Rpb24gYjAoaSx0LGUsbixzLHIpe250LnNldEJ1ZmZlcihpLl9yb290c1t0XSk7Y29uc3Qgbz1jYSgwLGksZSxuLHMscik7cmV0dXJuIG50LmNsZWFyQnVmZmVyKCksb31mdW5jdGlvbiBjYShpLHQsZSxuLHMscil7Y29uc3R7ZmxvYXQzMkFycmF5Om8sdWludDE2QXJyYXk6YSx1aW50MzJBcnJheTpjfT1udDtsZXQgbD1pKjI7aWYoU3QobCxhKSl7Y29uc3QgdT1ZdChpLGMpLGY9bGUobCxhKTtyZXR1cm4gZjAodCxlLG4sdSxmLHMscil9ZWxzZXtjb25zdCB1PXNhKGksYyksZj13MFt1XSxwPW4uZGlyZWN0aW9uW2ZdPj0wO2xldCB5LGc7cD8oeT1fdChpKSxnPXp0KGksYykpOih5PXp0KGksYyksZz1fdChpKSk7Y29uc3QgYj1jbih5LG8sbixzLHIpP2NhKHksdCxlLG4scyxyKTpudWxsO2lmKGIpe2NvbnN0IE09Yi5wb2ludFtmXTtpZihwP008PW9bZyt1XTpNPj1vW2crdSszXSlyZXR1cm4gYn1jb25zdCBtPWNuKGcsbyxuLHMscik/Y2EoZyx0LGUsbixzLHIpOm51bGw7cmV0dXJuIGImJm0/Yi5kaXN0YW5jZTw9bS5kaXN0YW5jZT9iOm06Ynx8bXx8bnVsbH19Y29uc3QgSnM9bmV3IGd0LG9pPW5ldyBhZSxhaT1uZXcgYWUscWk9bmV3IHN0LERsPW5ldyBSdCxZcz1uZXcgUnQ7ZnVuY3Rpb24gTTAoaSx0LGUsbil7bnQuc2V0QnVmZmVyKGkuX3Jvb3RzW3RdKTtjb25zdCBzPWxhKDAsaSxlLG4pO3JldHVybiBudC5jbGVhckJ1ZmZlcigpLHN9ZnVuY3Rpb24gbGEoaSx0LGUsbixzPW51bGwpe2NvbnN0e2Zsb2F0MzJBcnJheTpyLHVpbnQxNkFycmF5Om8sdWludDMyQXJyYXk6YX09bnQ7bGV0IGM9aSoyO2lmKHM9PT1udWxsJiYoZS5ib3VuZGluZ0JveHx8ZS5jb21wdXRlQm91bmRpbmdCb3goKSxEbC5zZXQoZS5ib3VuZGluZ0JveC5taW4sZS5ib3VuZGluZ0JveC5tYXgsbikscz1EbCksU3QoYyxvKSl7Y29uc3QgaD10Lmdlb21ldHJ5LHU9aC5pbmRleCxmPWguYXR0cmlidXRlcy5wb3NpdGlvbixkPWUuaW5kZXgscD1lLmF0dHJpYnV0ZXMucG9zaXRpb24seT1ZdChpLGEpLGc9bGUoYyxvKTtpZihxaS5jb3B5KG4pLmludmVydCgpLGUuYm91bmRzVHJlZSlyZXR1cm4gaHQoaSxyLFlzKSxZcy5tYXRyaXguY29weShxaSksWXMubmVlZHNVcGRhdGU9ITAsZS5ib3VuZHNUcmVlLnNoYXBlY2FzdCh7aW50ZXJzZWN0c0JvdW5kczpiPT5Zcy5pbnRlcnNlY3RzQm94KGIpLGludGVyc2VjdHNUcmlhbmdsZTpiPT57Yi5hLmFwcGx5TWF0cml4NChuKSxiLmIuYXBwbHlNYXRyaXg0KG4pLGIuYy5hcHBseU1hdHJpeDQobiksYi5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHg9eSozLG09KGcreSkqMzt4PG07eCs9MylpZih5dChhaSx4LHUsZiksYWkubmVlZHNVcGRhdGU9ITAsYi5pbnRlcnNlY3RzVHJpYW5nbGUoYWkpKXJldHVybiEwO3JldHVybiExfX0pO3tjb25zdCB3PVNuKGUpO2ZvcihsZXQgYj15KjMseD0oZyt5KSozO2I8eDtiKz0zKXt5dChvaSxiLHUsZiksb2kuYS5hcHBseU1hdHJpeDQocWkpLG9pLmIuYXBwbHlNYXRyaXg0KHFpKSxvaS5jLmFwcGx5TWF0cml4NChxaSksb2kubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBtPTAsTT13KjM7bTxNO20rPTMpaWYoeXQoYWksbSxkLHApLGFpLm5lZWRzVXBkYXRlPSEwLG9pLmludGVyc2VjdHNUcmlhbmdsZShhaSkpcmV0dXJuITB9fX1lbHNle2NvbnN0IGg9X3QoaSksdT16dChpLGEpO3JldHVybiBodChoLHIsSnMpLCEhKHMuaW50ZXJzZWN0c0JveChKcykmJmxhKGgsdCxlLG4scyl8fChodCh1LHIsSnMpLHMuaW50ZXJzZWN0c0JveChKcykmJmxhKHUsdCxlLG4scykpKX19Y29uc3QganM9bmV3IHN0LGhhPW5ldyBSdCxYaT1uZXcgUnQsQTA9bmV3IFAsUzA9bmV3IFAsdjA9bmV3IFAsXzA9bmV3IFA7ZnVuY3Rpb24gejAoaSx0LGUsbj17fSxzPXt9LHI9MCxvPTEvMCl7dC5ib3VuZGluZ0JveHx8dC5jb21wdXRlQm91bmRpbmdCb3goKSxoYS5zZXQodC5ib3VuZGluZ0JveC5taW4sdC5ib3VuZGluZ0JveC5tYXgsZSksaGEubmVlZHNVcGRhdGU9ITA7Y29uc3QgYT1pLmdlb21ldHJ5LGM9YS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGw9YS5pbmRleCxoPXQuYXR0cmlidXRlcy5wb3NpdGlvbix1PXQuaW5kZXgsZj1jZS5nZXRQcmltaXRpdmUoKSxkPWNlLmdldFByaW1pdGl2ZSgpO2xldCBwPUEwLHk9UzAsZz1udWxsLHc9bnVsbDtzJiYoZz12MCx3PV8wKTtsZXQgYj0xLzAseD1udWxsLG09bnVsbDtyZXR1cm4ganMuY29weShlKS5pbnZlcnQoKSxYaS5tYXRyaXguY29weShqcyksaS5zaGFwZWNhc3Qoe2JvdW5kc1RyYXZlcnNlT3JkZXI6TT0+aGEuZGlzdGFuY2VUb0JveChNKSxpbnRlcnNlY3RzQm91bmRzOihNLFMsQSk9PkE8YiYmQTxvPyhTJiYoWGkubWluLmNvcHkoTS5taW4pLFhpLm1heC5jb3B5KE0ubWF4KSxYaS5uZWVkc1VwZGF0ZT0hMCksITApOiExLGludGVyc2VjdHNSYW5nZTooTSxTKT0+e2lmKHQuYm91bmRzVHJlZSlyZXR1cm4gdC5ib3VuZHNUcmVlLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjp2PT5YaS5kaXN0YW5jZVRvQm94KHYpLGludGVyc2VjdHNCb3VuZHM6KHYsXyxUKT0+VDxiJiZUPG8saW50ZXJzZWN0c1JhbmdlOih2LF8pPT57Zm9yKGxldCBUPXYsej12K187VDx6O1QrKyl7eXQoZCwzKlQsdSxoKSxkLmEuYXBwbHlNYXRyaXg0KGUpLGQuYi5hcHBseU1hdHJpeDQoZSksZC5jLmFwcGx5TWF0cml4NChlKSxkLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgQz1NLEU9TStTO0M8RTtDKyspe3l0KGYsMypDLGwsYyksZi5uZWVkc1VwZGF0ZT0hMDtjb25zdCBGPWYuZGlzdGFuY2VUb1RyaWFuZ2xlKGQscCxnKTtpZihGPGImJih5LmNvcHkocCksdyYmdy5jb3B5KGcpLGI9Rix4PUMsbT1UKSxGPHIpcmV0dXJuITB9fX19KTt7Y29uc3QgQT1Tbih0KTtmb3IobGV0IHY9MCxfPUE7djxfO3YrKyl7eXQoZCwzKnYsdSxoKSxkLmEuYXBwbHlNYXRyaXg0KGUpLGQuYi5hcHBseU1hdHJpeDQoZSksZC5jLmFwcGx5TWF0cml4NChlKSxkLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgVD1NLHo9TStTO1Q8ejtUKyspe3l0KGYsMypULGwsYyksZi5uZWVkc1VwZGF0ZT0hMDtjb25zdCBDPWYuZGlzdGFuY2VUb1RyaWFuZ2xlKGQscCxnKTtpZihDPGImJih5LmNvcHkocCksdyYmdy5jb3B5KGcpLGI9Qyx4PVQsbT12KSxDPHIpcmV0dXJuITB9fX19fSksY2UucmVsZWFzZVByaW1pdGl2ZShmKSxjZS5yZWxlYXNlUHJpbWl0aXZlKGQpLGI9PT0xLzA/bnVsbDoobi5wb2ludD9uLnBvaW50LmNvcHkoeSk6bi5wb2ludD15LmNsb25lKCksbi5kaXN0YW5jZT1iLG4uZmFjZUluZGV4PXgscyYmKHMucG9pbnQ/cy5wb2ludC5jb3B5KHcpOnMucG9pbnQ9dy5jbG9uZSgpLHMucG9pbnQuYXBwbHlNYXRyaXg0KGpzKSx5LmFwcGx5TWF0cml4NChqcykscy5kaXN0YW5jZT15LnN1YihzLnBvaW50KS5sZW5ndGgoKSxzLmZhY2VJbmRleD1tKSxuKX1mdW5jdGlvbiBUMChpLHQ9bnVsbCl7dCYmQXJyYXkuaXNBcnJheSh0KSYmKHQ9bmV3IFNldCh0KSk7Y29uc3QgZT1pLmdlb21ldHJ5LG49ZS5pbmRleD9lLmluZGV4LmFycmF5Om51bGwscz1lLmF0dHJpYnV0ZXMucG9zaXRpb247bGV0IHIsbyxhLGMsbD0wO2NvbnN0IGg9aS5fcm9vdHM7Zm9yKGxldCBmPTAsZD1oLmxlbmd0aDtmPGQ7ZisrKXI9aFtmXSxvPW5ldyBVaW50MzJBcnJheShyKSxhPW5ldyBVaW50MTZBcnJheShyKSxjPW5ldyBGbG9hdDMyQXJyYXkociksdSgwLGwpLGwrPXIuYnl0ZUxlbmd0aDtmdW5jdGlvbiB1KGYsZCxwPSExKXtjb25zdCB5PWYqMjtpZihTdCh5LGEpKXtjb25zdCBnPW9bZis2XSx3PWFbeSsxNF07bGV0IGI9MS8wLHg9MS8wLG09MS8wLE09LTEvMCxTPS0xLzAsQT0tMS8wO2ZvcihsZXQgdj1nLF89Zyt3O3Y8Xzt2Kyspe2NvbnN0IFQ9MyppLnJlc29sdmVUcmlhbmdsZUluZGV4KHYpO2ZvcihsZXQgej0wO3o8Mzt6Kyspe2xldCBDPVQrejtDPW4/bltDXTpDO2NvbnN0IEU9cy5nZXRYKEMpLEY9cy5nZXRZKEMpLEI9cy5nZXRaKEMpO0U8YiYmKGI9RSksRT5NJiYoTT1FKSxGPHgmJih4PUYpLEY+UyYmKFM9RiksQjxtJiYobT1CKSxCPkEmJihBPUIpfX1yZXR1cm4gY1tmKzBdIT09Ynx8Y1tmKzFdIT09eHx8Y1tmKzJdIT09bXx8Y1tmKzNdIT09TXx8Y1tmKzRdIT09U3x8Y1tmKzVdIT09QT8oY1tmKzBdPWIsY1tmKzFdPXgsY1tmKzJdPW0sY1tmKzNdPU0sY1tmKzRdPVMsY1tmKzVdPUEsITApOiExfWVsc2V7Y29uc3QgZz1fdChmKSx3PXp0KGYsbyk7bGV0IGI9cCx4PSExLG09ITE7aWYodCl7aWYoIWIpe2NvbnN0IFQ9Zy9BdCtkL050LHo9dy9BdCtkL050O3g9dC5oYXMoVCksbT10Lmhhcyh6KSxiPSF4JiYhbX19ZWxzZSB4PSEwLG09ITA7Y29uc3QgTT1ifHx4LFM9Ynx8bTtsZXQgQT0hMTtNJiYoQT11KGcsZCxiKSk7bGV0IHY9ITE7UyYmKHY9dSh3LGQsYikpO2NvbnN0IF89QXx8djtpZihfKWZvcihsZXQgVD0wO1Q8MztUKyspe2NvbnN0IHo9ZytULEM9dytULEU9Y1t6XSxGPWNbeiszXSxCPWNbQ10sST1jW0MrM107Y1tmK1RdPUU8Qj9FOkIsY1tmK1QrM109Rj5JP0Y6SX1yZXR1cm4gX319fWZ1bmN0aW9uIFAwKGksdCxlLG4scyxyLG8pe250LnNldEJ1ZmZlcihpLl9yb290c1t0XSksdWEoMCxpLGUsbixzLHIsbyksbnQuY2xlYXJCdWZmZXIoKX1mdW5jdGlvbiB1YShpLHQsZSxuLHMscixvKXtjb25zdHtmbG9hdDMyQXJyYXk6YSx1aW50MTZBcnJheTpjLHVpbnQzMkFycmF5Omx9PW50LGg9aSoyO2lmKFN0KGgsYykpe2NvbnN0IGY9WXQoaSxsKSxkPWxlKGgsYyk7eTAodCxlLG4sZixkLHMscixvKX1lbHNle2NvbnN0IGY9X3QoaSk7Y24oZixhLG4scixvKSYmdWEoZix0LGUsbixzLHIsbyk7Y29uc3QgZD16dChpLGwpO2NuKGQsYSxuLHIsbykmJnVhKGQsdCxlLG4scyxyLG8pfX1jb25zdCBDMD1bIngiLCJ5IiwieiJdO2Z1bmN0aW9uIEUwKGksdCxlLG4scyxyKXtudC5zZXRCdWZmZXIoaS5fcm9vdHNbdF0pO2NvbnN0IG89ZmEoMCxpLGUsbixzLHIpO3JldHVybiBudC5jbGVhckJ1ZmZlcigpLG99ZnVuY3Rpb24gZmEoaSx0LGUsbixzLHIpe2NvbnN0e2Zsb2F0MzJBcnJheTpvLHVpbnQxNkFycmF5OmEsdWludDMyQXJyYXk6Y309bnQ7bGV0IGw9aSoyO2lmKFN0KGwsYSkpe2NvbnN0IHU9WXQoaSxjKSxmPWxlKGwsYSk7cmV0dXJuIG0wKHQsZSxuLHUsZixzLHIpfWVsc2V7Y29uc3QgdT1zYShpLGMpLGY9QzBbdV0scD1uLmRpcmVjdGlvbltmXT49MDtsZXQgeSxnO3A/KHk9X3QoaSksZz16dChpLGMpKTooeT16dChpLGMpLGc9X3QoaSkpO2NvbnN0IGI9Y24oeSxvLG4scyxyKT9mYSh5LHQsZSxuLHMscik6bnVsbDtpZihiKXtjb25zdCBNPWIucG9pbnRbZl07aWYocD9NPD1vW2crdV06TT49b1tnK3UrM10pcmV0dXJuIGJ9Y29uc3QgbT1jbihnLG8sbixzLHIpP2ZhKGcsdCxlLG4scyxyKTpudWxsO3JldHVybiBiJiZtP2IuZGlzdGFuY2U8PW0uZGlzdGFuY2U/YjptOmJ8fG18fG51bGx9fWNvbnN0IFFzPW5ldyBndCxjaT1uZXcgYWUsbGk9bmV3IGFlLFppPW5ldyBzdCwkbD1uZXcgUnQsS3M9bmV3IFJ0O2Z1bmN0aW9uIEIwKGksdCxlLG4pe250LnNldEJ1ZmZlcihpLl9yb290c1t0XSk7Y29uc3Qgcz1kYSgwLGksZSxuKTtyZXR1cm4gbnQuY2xlYXJCdWZmZXIoKSxzfWZ1bmN0aW9uIGRhKGksdCxlLG4scz1udWxsKXtjb25zdHtmbG9hdDMyQXJyYXk6cix1aW50MTZBcnJheTpvLHVpbnQzMkFycmF5OmF9PW50O2xldCBjPWkqMjtpZihzPT09bnVsbCYmKGUuYm91bmRpbmdCb3h8fGUuY29tcHV0ZUJvdW5kaW5nQm94KCksJGwuc2V0KGUuYm91bmRpbmdCb3gubWluLGUuYm91bmRpbmdCb3gubWF4LG4pLHM9JGwpLFN0KGMsbykpe2NvbnN0IGg9dC5nZW9tZXRyeSx1PWguaW5kZXgsZj1oLmF0dHJpYnV0ZXMucG9zaXRpb24sZD1lLmluZGV4LHA9ZS5hdHRyaWJ1dGVzLnBvc2l0aW9uLHk9WXQoaSxhKSxnPWxlKGMsbyk7aWYoWmkuY29weShuKS5pbnZlcnQoKSxlLmJvdW5kc1RyZWUpcmV0dXJuIGh0KGkscixLcyksS3MubWF0cml4LmNvcHkoWmkpLEtzLm5lZWRzVXBkYXRlPSEwLGUuYm91bmRzVHJlZS5zaGFwZWNhc3Qoe2ludGVyc2VjdHNCb3VuZHM6Yj0+S3MuaW50ZXJzZWN0c0JveChiKSxpbnRlcnNlY3RzVHJpYW5nbGU6Yj0+e2IuYS5hcHBseU1hdHJpeDQobiksYi5iLmFwcGx5TWF0cml4NChuKSxiLmMuYXBwbHlNYXRyaXg0KG4pLGIubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCB4PXksbT1nK3k7eDxtO3grKylpZih5dChsaSwzKnQucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoeCksdSxmKSxsaS5uZWVkc1VwZGF0ZT0hMCxiLmludGVyc2VjdHNUcmlhbmdsZShsaSkpcmV0dXJuITA7cmV0dXJuITF9fSk7e2NvbnN0IHc9U24oZSk7Zm9yKGxldCBiPXkseD1nK3k7Yjx4O2IrKyl7Y29uc3QgbT10LnJlc29sdmVUcmlhbmdsZUluZGV4KGIpO3l0KGNpLDMqbSx1LGYpLGNpLmEuYXBwbHlNYXRyaXg0KFppKSxjaS5iLmFwcGx5TWF0cml4NChaaSksY2kuYy5hcHBseU1hdHJpeDQoWmkpLGNpLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgTT0wLFM9dyozO008UztNKz0zKWlmKHl0KGxpLE0sZCxwKSxsaS5uZWVkc1VwZGF0ZT0hMCxjaS5pbnRlcnNlY3RzVHJpYW5nbGUobGkpKXJldHVybiEwfX19ZWxzZXtjb25zdCBoPV90KGkpLHU9enQoaSxhKTtyZXR1cm4gaHQoaCxyLFFzKSwhIShzLmludGVyc2VjdHNCb3goUXMpJiZkYShoLHQsZSxuLHMpfHwoaHQodSxyLFFzKSxzLmludGVyc2VjdHNCb3goUXMpJiZkYSh1LHQsZSxuLHMpKSl9fWNvbnN0IHRyPW5ldyBzdCxwYT1uZXcgUnQsR2k9bmV3IFJ0LEYwPW5ldyBQLEkwPW5ldyBQLGswPW5ldyBQLE4wPW5ldyBQO2Z1bmN0aW9uIFIwKGksdCxlLG49e30scz17fSxyPTAsbz0xLzApe3QuYm91bmRpbmdCb3h8fHQuY29tcHV0ZUJvdW5kaW5nQm94KCkscGEuc2V0KHQuYm91bmRpbmdCb3gubWluLHQuYm91bmRpbmdCb3gubWF4LGUpLHBhLm5lZWRzVXBkYXRlPSEwO2NvbnN0IGE9aS5nZW9tZXRyeSxjPWEuYXR0cmlidXRlcy5wb3NpdGlvbixsPWEuaW5kZXgsaD10LmF0dHJpYnV0ZXMucG9zaXRpb24sdT10LmluZGV4LGY9Y2UuZ2V0UHJpbWl0aXZlKCksZD1jZS5nZXRQcmltaXRpdmUoKTtsZXQgcD1GMCx5PUkwLGc9bnVsbCx3PW51bGw7cyYmKGc9azAsdz1OMCk7bGV0IGI9MS8wLHg9bnVsbCxtPW51bGw7cmV0dXJuIHRyLmNvcHkoZSkuaW52ZXJ0KCksR2kubWF0cml4LmNvcHkodHIpLGkuc2hhcGVjYXN0KHtib3VuZHNUcmF2ZXJzZU9yZGVyOk09PnBhLmRpc3RhbmNlVG9Cb3goTSksaW50ZXJzZWN0c0JvdW5kczooTSxTLEEpPT5BPGImJkE8bz8oUyYmKEdpLm1pbi5jb3B5KE0ubWluKSxHaS5tYXguY29weShNLm1heCksR2kubmVlZHNVcGRhdGU9ITApLCEwKTohMSxpbnRlcnNlY3RzUmFuZ2U6KE0sUyk9PntpZih0LmJvdW5kc1RyZWUpe2NvbnN0IEE9dC5ib3VuZHNUcmVlO3JldHVybiBBLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjp2PT5HaS5kaXN0YW5jZVRvQm94KHYpLGludGVyc2VjdHNCb3VuZHM6KHYsXyxUKT0+VDxiJiZUPG8saW50ZXJzZWN0c1JhbmdlOih2LF8pPT57Zm9yKGxldCBUPXYsej12K187VDx6O1QrKyl7Y29uc3QgQz1BLnJlc29sdmVUcmlhbmdsZUluZGV4KFQpO3l0KGQsMypDLHUsaCksZC5hLmFwcGx5TWF0cml4NChlKSxkLmIuYXBwbHlNYXRyaXg0KGUpLGQuYy5hcHBseU1hdHJpeDQoZSksZC5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IEU9TSxGPU0rUztFPEY7RSsrKXtjb25zdCBCPWkucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoRSk7eXQoZiwzKkIsbCxjKSxmLm5lZWRzVXBkYXRlPSEwO2NvbnN0IEk9Zi5kaXN0YW5jZVRvVHJpYW5nbGUoZCxwLGcpO2lmKEk8YiYmKHkuY29weShwKSx3JiZ3LmNvcHkoZyksYj1JLHg9RSxtPVQpLEk8cilyZXR1cm4hMH19fX0pfWVsc2V7Y29uc3QgQT1Tbih0KTtmb3IobGV0IHY9MCxfPUE7djxfO3YrKyl7eXQoZCwzKnYsdSxoKSxkLmEuYXBwbHlNYXRyaXg0KGUpLGQuYi5hcHBseU1hdHJpeDQoZSksZC5jLmFwcGx5TWF0cml4NChlKSxkLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgVD1NLHo9TStTO1Q8ejtUKyspe2NvbnN0IEM9aS5yZXNvbHZlVHJpYW5nbGVJbmRleChUKTt5dChmLDMqQyxsLGMpLGYubmVlZHNVcGRhdGU9ITA7Y29uc3QgRT1mLmRpc3RhbmNlVG9UcmlhbmdsZShkLHAsZyk7aWYoRTxiJiYoeS5jb3B5KHApLHcmJncuY29weShnKSxiPUUseD1ULG09diksRTxyKXJldHVybiEwfX19fX0pLGNlLnJlbGVhc2VQcmltaXRpdmUoZiksY2UucmVsZWFzZVByaW1pdGl2ZShkKSxiPT09MS8wP251bGw6KG4ucG9pbnQ/bi5wb2ludC5jb3B5KHkpOm4ucG9pbnQ9eS5jbG9uZSgpLG4uZGlzdGFuY2U9YixuLmZhY2VJbmRleD14LHMmJihzLnBvaW50P3MucG9pbnQuY29weSh3KTpzLnBvaW50PXcuY2xvbmUoKSxzLnBvaW50LmFwcGx5TWF0cml4NCh0cikseS5hcHBseU1hdHJpeDQodHIpLHMuZGlzdGFuY2U9eS5zdWIocy5wb2ludCkubGVuZ3RoKCkscy5mYWNlSW5kZXg9bSksbil9ZnVuY3Rpb24gTDAoKXtyZXR1cm4gdHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyIT0idW5kZWZpbmVkIn1jb25zdCBXaT1uZXcgbnQuY29uc3RydWN0b3IsZXI9bmV3IG50LmNvbnN0cnVjdG9yLGxuPW5ldyBpYSgoKT0+bmV3IGd0KSxoaT1uZXcgZ3QsdWk9bmV3IGd0LHlhPW5ldyBndCxtYT1uZXcgZ3Q7bGV0IGdhPSExO2Z1bmN0aW9uIE8wKGksdCxlLG4pe2lmKGdhKXRocm93IG5ldyBFcnJvcigiTWVzaEJWSDogUmVjdXJzaXZlIGNhbGxzIHRvIGJ2aGNhc3Qgbm90IHN1cHBvcnRlZC4iKTtnYT0hMDtjb25zdCBzPWkuX3Jvb3RzLHI9dC5fcm9vdHM7bGV0IG8sYT0wLGM9MDtjb25zdCBsPW5ldyBzdCgpLmNvcHkoZSkuaW52ZXJ0KCk7Zm9yKGxldCBoPTAsdT1zLmxlbmd0aDtoPHU7aCsrKXtXaS5zZXRCdWZmZXIoc1toXSksYz0wO2NvbnN0IGY9bG4uZ2V0UHJpbWl0aXZlKCk7aHQoMCxXaS5mbG9hdDMyQXJyYXksZiksZi5hcHBseU1hdHJpeDQobCk7Zm9yKGxldCBkPTAscD1yLmxlbmd0aDtkPHAmJihlci5zZXRCdWZmZXIocltkXSksbz1nZSgwLDAsZSxsLG4sYSxjLDAsMCxmKSxlci5jbGVhckJ1ZmZlcigpLGMrPXJbZF0uYnl0ZUxlbmd0aC9OdCwhbyk7ZCsrKTtpZihsbi5yZWxlYXNlUHJpbWl0aXZlKGYpLFdpLmNsZWFyQnVmZmVyKCksYSs9c1toXS5ieXRlTGVuZ3RoL050LG8pYnJlYWt9cmV0dXJuIGdhPSExLG99ZnVuY3Rpb24gZ2UoaSx0LGUsbixzLHI9MCxvPTAsYT0wLGM9MCxsPW51bGwsaD0hMSl7bGV0IHUsZjtoPyh1PWVyLGY9V2kpOih1PVdpLGY9ZXIpO2NvbnN0IGQ9dS5mbG9hdDMyQXJyYXkscD11LnVpbnQzMkFycmF5LHk9dS51aW50MTZBcnJheSxnPWYuZmxvYXQzMkFycmF5LHc9Zi51aW50MzJBcnJheSxiPWYudWludDE2QXJyYXkseD1pKjIsbT10KjIsTT1TdCh4LHkpLFM9U3QobSxiKTtsZXQgQT0hMTtpZihTJiZNKWg/QT1zKFl0KHQsdyksbGUodCoyLGIpLFl0KGkscCksbGUoaSoyLHkpLGMsbyt0L0F0LGEscitpL0F0KTpBPXMoWXQoaSxwKSxsZShpKjIseSksWXQodCx3KSxsZSh0KjIsYiksYSxyK2kvQXQsYyxvK3QvQXQpO2Vsc2UgaWYoUyl7Y29uc3Qgdj1sbi5nZXRQcmltaXRpdmUoKTtodCh0LGcsdiksdi5hcHBseU1hdHJpeDQoZSk7Y29uc3QgXz1fdChpKSxUPXp0KGkscCk7aHQoXyxkLGhpKSxodChULGQsdWkpO2NvbnN0IHo9di5pbnRlcnNlY3RzQm94KGhpKSxDPXYuaW50ZXJzZWN0c0JveCh1aSk7QT16JiZnZSh0LF8sbixlLHMsbyxyLGMsYSsxLHYsIWgpfHxDJiZnZSh0LFQsbixlLHMsbyxyLGMsYSsxLHYsIWgpLGxuLnJlbGVhc2VQcmltaXRpdmUodil9ZWxzZXtjb25zdCB2PV90KHQpLF89enQodCx3KTtodCh2LGcseWEpLGh0KF8sZyxtYSk7Y29uc3QgVD1sLmludGVyc2VjdHNCb3goeWEpLHo9bC5pbnRlcnNlY3RzQm94KG1hKTtpZihUJiZ6KUE9Z2UoaSx2LGUsbixzLHIsbyxhLGMrMSxsLGgpfHxnZShpLF8sZSxuLHMscixvLGEsYysxLGwsaCk7ZWxzZSBpZihUKWlmKE0pQT1nZShpLHYsZSxuLHMscixvLGEsYysxLGwsaCk7ZWxzZXtjb25zdCBDPWxuLmdldFByaW1pdGl2ZSgpO0MuY29weSh5YSkuYXBwbHlNYXRyaXg0KGUpO2NvbnN0IEU9X3QoaSksRj16dChpLHApO2h0KEUsZCxoaSksaHQoRixkLHVpKTtjb25zdCBCPUMuaW50ZXJzZWN0c0JveChoaSksST1DLmludGVyc2VjdHNCb3godWkpO0E9QiYmZ2UodixFLG4sZSxzLG8scixjLGErMSxDLCFoKXx8SSYmZ2UodixGLG4sZSxzLG8scixjLGErMSxDLCFoKSxsbi5yZWxlYXNlUHJpbWl0aXZlKEMpfWVsc2UgaWYoeilpZihNKUE9Z2UoaSxfLGUsbixzLHIsbyxhLGMrMSxsLGgpO2Vsc2V7Y29uc3QgQz1sbi5nZXRQcmltaXRpdmUoKTtDLmNvcHkobWEpLmFwcGx5TWF0cml4NChlKTtjb25zdCBFPV90KGkpLEY9enQoaSxwKTtodChFLGQsaGkpLGh0KEYsZCx1aSk7Y29uc3QgQj1DLmludGVyc2VjdHNCb3goaGkpLEk9Qy5pbnRlcnNlY3RzQm94KHVpKTtBPUImJmdlKF8sRSxuLGUscyxvLHIsYyxhKzEsQywhaCl8fEkmJmdlKF8sRixuLGUscyxvLHIsYyxhKzEsQywhaCksbG4ucmVsZWFzZVByaW1pdGl2ZShDKX19cmV0dXJuIEF9Y29uc3QgbnI9bmV3IFJ0LFZsPW5ldyBndCxEMD17c3RyYXRlZ3k6TWwsbWF4RGVwdGg6NDAsbWF4TGVhZlRyaXM6MTAsdXNlU2hhcmVkQXJyYXlCdWZmZXI6ITEsc2V0Qm91bmRpbmdCb3g6ITAsb25Qcm9ncmVzczpudWxsLGluZGlyZWN0OiExLHZlcmJvc2U6ITAscmFuZ2U6bnVsbH07Y2xhc3MgeGF7c3RhdGljIHNlcmlhbGl6ZSh0LGU9e30pe2U9VXQoe2Nsb25lQnVmZmVyczohMH0sZSk7Y29uc3Qgbj10Lmdlb21ldHJ5LHM9dC5fcm9vdHMscj10Ll9pbmRpcmVjdEJ1ZmZlcixvPW4uZ2V0SW5kZXgoKSxhPXt2ZXJzaW9uOjEscm9vdHM6bnVsbCxpbmRleDpudWxsLGluZGlyZWN0QnVmZmVyOm51bGx9O3JldHVybiBlLmNsb25lQnVmZmVycz8oYS5yb290cz1zLm1hcChjPT5jLnNsaWNlKCkpLGEuaW5kZXg9bz9vLmFycmF5LnNsaWNlKCk6bnVsbCxhLmluZGlyZWN0QnVmZmVyPXI/ci5zbGljZSgpOm51bGwpOihhLnJvb3RzPXMsYS5pbmRleD1vP28uYXJyYXk6bnVsbCxhLmluZGlyZWN0QnVmZmVyPXIpLGF9c3RhdGljIGRlc2VyaWFsaXplKHQsZSxuPXt9KXtuPVV0KHtzZXRJbmRleDohMCxpbmRpcmVjdDohIXQuaW5kaXJlY3RCdWZmZXJ9LG4pO2NvbnN0e2luZGV4OnMscm9vdHM6cixpbmRpcmVjdEJ1ZmZlcjpvfT10O3QudmVyc2lvbnx8KGNvbnNvbGUud2FybigiTWVzaEJWSC5kZXNlcmlhbGl6ZTogU2VyaWFsaXphdGlvbiBmb3JtYXQgaGFzIGJlZW4gY2hhbmdlZCBhbmQgd2lsbCBiZSBmaXhlZCB1cC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gcmVnZW5lcmF0ZSBhbnkgc3RvcmVkIHNlcmlhbGl6ZWQgZGF0YS4iKSxjKHIpKTtjb25zdCBhPW5ldyB4YShlLEtlKFV0KHt9LG4pLHtbWW9dOiEwfSkpO2lmKGEuX3Jvb3RzPXIsYS5faW5kaXJlY3RCdWZmZXI9b3x8bnVsbCxuLnNldEluZGV4KXtjb25zdCBsPWUuZ2V0SW5kZXgoKTtpZihsPT09bnVsbCl7Y29uc3QgaD1uZXcgeHQodC5pbmRleCwxLCExKTtlLnNldEluZGV4KGgpfWVsc2UgbC5hcnJheSE9PXMmJihsLmFycmF5LnNldChzKSxsLm5lZWRzVXBkYXRlPSEwKX1yZXR1cm4gYTtmdW5jdGlvbiBjKGwpe2ZvcihsZXQgaD0wO2g8bC5sZW5ndGg7aCsrKXtjb25zdCB1PWxbaF0sZj1uZXcgVWludDMyQXJyYXkodSksZD1uZXcgVWludDE2QXJyYXkodSk7Zm9yKGxldCBwPTAseT11LmJ5dGVMZW5ndGgvTnQ7cDx5O3ArKyl7Y29uc3QgZz1BdCpwLHc9MipnO1N0KHcsZCl8fChmW2crNl09ZltnKzZdL0F0LXApfX19fWdldCBpbmRpcmVjdCgpe3JldHVybiEhdGhpcy5faW5kaXJlY3RCdWZmZXJ9Y29uc3RydWN0b3IodCxlPXt9KXtpZih0LmlzQnVmZmVyR2VvbWV0cnkpe2lmKHQuaW5kZXgmJnQuaW5kZXguaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSl0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoZSBpbmRleCBhdHRyaWJ1dGUuIil9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IE9ubHkgQnVmZmVyR2VvbWV0cmllcyBhcmUgc3VwcG9ydGVkLiIpO2lmKGU9T2JqZWN0LmFzc2lnbihLZShVdCh7fSxEMCkse1tZb106ITF9KSxlKSxlLnVzZVNoYXJlZEFycmF5QnVmZmVyJiYhTDAoKSl0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IFNoYXJlZEFycmF5QnVmZmVyIGlzIG5vdCBhdmFpbGFibGUuIik7dGhpcy5nZW9tZXRyeT10LHRoaXMuX3Jvb3RzPW51bGwsdGhpcy5faW5kaXJlY3RCdWZmZXI9bnVsbCxlW1lvXXx8KGUwKHRoaXMsZSksIXQuYm91bmRpbmdCb3gmJmUuc2V0Qm91bmRpbmdCb3gmJih0LmJvdW5kaW5nQm94PXRoaXMuZ2V0Qm91bmRpbmdCb3gobmV3IGd0KSkpLHRoaXMucmVzb2x2ZVRyaWFuZ2xlSW5kZXg9ZS5pbmRpcmVjdD9uPT50aGlzLl9pbmRpcmVjdEJ1ZmZlcltuXTpuPT5ufXNoaWZ0VHJpYW5nbGVPZmZzZXRzKHQpe2NvbnN0IGU9dGhpcy5faW5kaXJlY3RCdWZmZXI7aWYoZSlmb3IobGV0IG49MCxzPWUubGVuZ3RoO248cztuKyspZVtuXSs9dDtlbHNle2NvbnN0IG49dGhpcy5fcm9vdHM7Zm9yKGxldCBzPTA7czxuLmxlbmd0aDtzKyspe2NvbnN0IHI9bltzXSxvPW5ldyBVaW50MzJBcnJheShyKSxhPW5ldyBVaW50MTZBcnJheShyKSxjPXIuYnl0ZUxlbmd0aC9OdDtmb3IobGV0IGw9MDtsPGM7bCsrKXtjb25zdCBoPUF0KmwsdT0yKmg7U3QodSxhKSYmKG9baCs2XSs9dCl9fX19cmVmaXQodD1udWxsKXtyZXR1cm4odGhpcy5pbmRpcmVjdD9UMDpwMCkodGhpcyx0KX10cmF2ZXJzZSh0LGU9MCl7Y29uc3Qgbj10aGlzLl9yb290c1tlXSxzPW5ldyBVaW50MzJBcnJheShuKSxyPW5ldyBVaW50MTZBcnJheShuKTtvKDApO2Z1bmN0aW9uIG8oYSxjPTApe2NvbnN0IGw9YSoyLGg9U3QobCxyKTtpZihoKXtjb25zdCB1PXNbYSs2XSxmPXJbbCsxNF07dChjLGgsbmV3IEZsb2F0MzJBcnJheShuLGEqNCw2KSx1LGYpfWVsc2V7Y29uc3QgdT1fdChhKSxmPXp0KGEscyksZD1zYShhLHMpO3QoYyxoLG5ldyBGbG9hdDMyQXJyYXkobixhKjQsNiksZCl8fChvKHUsYysxKSxvKGYsYysxKSl9fX1yYXljYXN0KHQsZT0wLG49MCxzPTEvMCl7Y29uc3Qgcj10aGlzLl9yb290cyxvPVtdLGE9dGhpcy5pbmRpcmVjdD9QMDp4MDtmb3IobGV0IGM9MCxsPXIubGVuZ3RoO2M8bDtjKyspYSh0aGlzLGMsZSx0LG8sbixzKTtyZXR1cm4gb31yYXljYXN0Rmlyc3QodCxlPTAsbj0wLHM9MS8wKXtjb25zdCByPXRoaXMuX3Jvb3RzO2xldCBvPW51bGw7Y29uc3QgYT10aGlzLmluZGlyZWN0P0UwOmIwO2ZvcihsZXQgYz0wLGw9ci5sZW5ndGg7YzxsO2MrKyl7Y29uc3QgaD1hKHRoaXMsYyxlLHQsbixzKTtoIT1udWxsJiYobz09bnVsbHx8aC5kaXN0YW5jZTxvLmRpc3RhbmNlKSYmKG89aCl9cmV0dXJuIG99aW50ZXJzZWN0c0dlb21ldHJ5KHQsZSl7bGV0IG49ITE7Y29uc3Qgcz10aGlzLl9yb290cyxyPXRoaXMuaW5kaXJlY3Q/QjA6TTA7Zm9yKGxldCBvPTAsYT1zLmxlbmd0aDtvPGEmJihuPXIodGhpcyxvLHQsZSksIW4pO28rKyk7cmV0dXJuIG59c2hhcGVjYXN0KHQpe2NvbnN0IGU9Y2UuZ2V0UHJpbWl0aXZlKCksbj10aGlzLmluZGlyZWN0P2cwOmQwO2xldHtib3VuZHNUcmF2ZXJzZU9yZGVyOnMsaW50ZXJzZWN0c0JvdW5kczpyLGludGVyc2VjdHNSYW5nZTpvLGludGVyc2VjdHNUcmlhbmdsZTphfT10O2lmKG8mJmEpe2NvbnN0IHU9bztvPShmLGQscCx5LGcpPT51KGYsZCxwLHksZyk/ITA6bihmLGQsdGhpcyxhLHAseSxlKX1lbHNlIG98fChhP289KHUsZixkLHApPT5uKHUsZix0aGlzLGEsZCxwLGUpOm89KHUsZixkKT0+ZCk7bGV0IGM9ITEsbD0wO2NvbnN0IGg9dGhpcy5fcm9vdHM7Zm9yKGxldCB1PTAsZj1oLmxlbmd0aDt1PGY7dSsrKXtjb25zdCBkPWhbdV07aWYoYz1hMCh0aGlzLHUscixvLHMsbCksYylicmVhaztsKz1kLmJ5dGVMZW5ndGgvTnR9cmV0dXJuIGNlLnJlbGVhc2VQcmltaXRpdmUoZSksY31idmhjYXN0KHQsZSxuKXtsZXR7aW50ZXJzZWN0c1JhbmdlczpzLGludGVyc2VjdHNUcmlhbmdsZXM6cn09bjtjb25zdCBvPWNlLmdldFByaW1pdGl2ZSgpLGE9dGhpcy5nZW9tZXRyeS5pbmRleCxjPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbixsPXRoaXMuaW5kaXJlY3Q/cD0+e2NvbnN0IHk9dGhpcy5yZXNvbHZlVHJpYW5nbGVJbmRleChwKTt5dChvLHkqMyxhLGMpfTpwPT57eXQobyxwKjMsYSxjKX0saD1jZS5nZXRQcmltaXRpdmUoKSx1PXQuZ2VvbWV0cnkuaW5kZXgsZj10Lmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24sZD10LmluZGlyZWN0P3A9Pntjb25zdCB5PXQucmVzb2x2ZVRyaWFuZ2xlSW5kZXgocCk7eXQoaCx5KjMsdSxmKX06cD0+e3l0KGgscCozLHUsZil9O2lmKHIpe2NvbnN0IHA9KHksZyx3LGIseCxtLE0sUyk9Pntmb3IobGV0IEE9dyx2PXcrYjtBPHY7QSsrKXtkKEEpLGguYS5hcHBseU1hdHJpeDQoZSksaC5iLmFwcGx5TWF0cml4NChlKSxoLmMuYXBwbHlNYXRyaXg0KGUpLGgubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBfPXksVD15K2c7XzxUO18rKylpZihsKF8pLG8ubmVlZHNVcGRhdGU9ITAscihvLGgsXyxBLHgsbSxNLFMpKXJldHVybiEwfXJldHVybiExfTtpZihzKXtjb25zdCB5PXM7cz1mdW5jdGlvbihnLHcsYix4LG0sTSxTLEEpe3JldHVybiB5KGcsdyxiLHgsbSxNLFMsQSk/ITA6cChnLHcsYix4LG0sTSxTLEEpfX1lbHNlIHM9cH1yZXR1cm4gTzAodGhpcyx0LGUscyl9aW50ZXJzZWN0c0JveCh0LGUpe3JldHVybiBuci5zZXQodC5taW4sdC5tYXgsZSksbnIubmVlZHNVcGRhdGU9ITAsdGhpcy5zaGFwZWNhc3Qoe2ludGVyc2VjdHNCb3VuZHM6bj0+bnIuaW50ZXJzZWN0c0JveChuKSxpbnRlcnNlY3RzVHJpYW5nbGU6bj0+bnIuaW50ZXJzZWN0c1RyaWFuZ2xlKG4pfSl9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5zaGFwZWNhc3Qoe2ludGVyc2VjdHNCb3VuZHM6ZT0+dC5pbnRlcnNlY3RzQm94KGUpLGludGVyc2VjdHNUcmlhbmdsZTplPT5lLmludGVyc2VjdHNTcGhlcmUodCl9KX1jbG9zZXN0UG9pbnRUb0dlb21ldHJ5KHQsZSxuPXt9LHM9e30scj0wLG89MS8wKXtyZXR1cm4odGhpcy5pbmRpcmVjdD9SMDp6MCkodGhpcyx0LGUsbixzLHIsbyl9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGU9e30sbj0wLHM9MS8wKXtyZXR1cm4gYzAodGhpcyx0LGUsbixzKX1nZXRCb3VuZGluZ0JveCh0KXtyZXR1cm4gdC5tYWtlRW1wdHkoKSx0aGlzLl9yb290cy5mb3JFYWNoKG49PntodCgwLG5ldyBGbG9hdDMyQXJyYXkobiksVmwpLHQudW5pb24oVmwpfSksdH19Y29uc3QgVWw9MWUtNiwkMD1VbCouNSxxbD1NYXRoLnBvdygxMCwtTWF0aC5sb2cxMChVbCkpLFYwPSQwKnFsO2Z1bmN0aW9uIHZlKGkpe3JldHVybn5+KGkqcWwrVjApfWZ1bmN0aW9uIFUwKGkpe3JldHVybmAke3ZlKGkueCl9LCR7dmUoaS55KX1gfWZ1bmN0aW9uIFhsKGkpe3JldHVybmAke3ZlKGkueCl9LCR7dmUoaS55KX0sJHt2ZShpLnopfWB9ZnVuY3Rpb24gcTAoaSl7cmV0dXJuYCR7dmUoaS54KX0sJHt2ZShpLnkpfSwke3ZlKGkueil9LCR7dmUoaS53KX1gfWZ1bmN0aW9uIFgwKGksdCxlKXtlLmRpcmVjdGlvbi5zdWJWZWN0b3JzKHQsaSkubm9ybWFsaXplKCk7Y29uc3Qgbj1pLmRvdChlLmRpcmVjdGlvbik7cmV0dXJuIGUub3JpZ2luLmNvcHkoaSkuYWRkU2NhbGVkVmVjdG9yKGUuZGlyZWN0aW9uLC1uKSxlfWZ1bmN0aW9uIFpsKCl7cmV0dXJuIHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciE9InVuZGVmaW5lZCJ9ZnVuY3Rpb24gWjAoaSl7aWYoaS5idWZmZXIgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcilyZXR1cm4gaTtjb25zdCB0PWkuY29uc3RydWN0b3IsZT1pLmJ1ZmZlcixuPW5ldyBTaGFyZWRBcnJheUJ1ZmZlcihlLmJ5dGVMZW5ndGgpLHM9bmV3IFVpbnQ4QXJyYXkoZSk7cmV0dXJuIG5ldyBVaW50OEFycmF5KG4pLnNldChzLDApLG5ldyB0KG4pfWZ1bmN0aW9uIEcwKGksdD1BcnJheUJ1ZmZlcil7cmV0dXJuIGk+NjU1MzU/bmV3IFVpbnQzMkFycmF5KG5ldyB0KDQqaSkpOm5ldyBVaW50MTZBcnJheShuZXcgdCgyKmkpKX1mdW5jdGlvbiBXMChpLHQpe2lmKCFpLmluZGV4KXtjb25zdCBlPWkuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudCxuPXQudXNlU2hhcmVkQXJyYXlCdWZmZXI/U2hhcmVkQXJyYXlCdWZmZXI6QXJyYXlCdWZmZXIscz1HMChlLG4pO2kuc2V0SW5kZXgobmV3IHh0KHMsMSkpO2ZvcihsZXQgcj0wO3I8ZTtyKyspc1tyXT1yfX1mdW5jdGlvbiBIMChpKXtyZXR1cm4gaS5pbmRleD9pLmluZGV4LmNvdW50OmkuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudH1mdW5jdGlvbiB3YShpKXtyZXR1cm4gSDAoaSkvM31jb25zdCBKMD0xZS04LFkwPW5ldyBQO2Z1bmN0aW9uIGowKGkpe3JldHVybn5+KGkvMyl9ZnVuY3Rpb24gUTAoaSl7cmV0dXJuIGklM31mdW5jdGlvbiBHbChpLHQpe3JldHVybiBpLnN0YXJ0LXQuc3RhcnR9ZnVuY3Rpb24gV2woaSx0KXtyZXR1cm4gWTAuc3ViVmVjdG9ycyh0LGkub3JpZ2luKS5kb3QoaS5kaXJlY3Rpb24pfWZ1bmN0aW9uIEswKGksdCxlLG49SjApe2kuc29ydChHbCksdC5zb3J0KEdsKTtmb3IobGV0IGE9MDthPGkubGVuZ3RoO2ErKyl7Y29uc3QgYz1pW2FdO2ZvcihsZXQgbD0wO2w8dC5sZW5ndGg7bCsrKXtjb25zdCBoPXRbbF07aWYoIShoLnN0YXJ0PmMuZW5kKSl7aWYoYy5lbmQ8aC5zdGFydHx8aC5lbmQ8Yy5zdGFydCljb250aW51ZTtpZihjLnN0YXJ0PD1oLnN0YXJ0JiZjLmVuZD49aC5lbmQpcihoLmVuZCxjLmVuZCl8fGkuc3BsaWNlKGErMSwwLHtzdGFydDpoLmVuZCxlbmQ6Yy5lbmQsaW5kZXg6Yy5pbmRleH0pLGMuZW5kPWguc3RhcnQsaC5zdGFydD0wLGguZW5kPTA7ZWxzZSBpZihjLnN0YXJ0Pj1oLnN0YXJ0JiZjLmVuZDw9aC5lbmQpcihjLmVuZCxoLmVuZCl8fHQuc3BsaWNlKGwrMSwwLHtzdGFydDpjLmVuZCxlbmQ6aC5lbmQsaW5kZXg6aC5pbmRleH0pLGguZW5kPWMuc3RhcnQsYy5zdGFydD0wLGMuZW5kPTA7ZWxzZSBpZihjLnN0YXJ0PD1oLnN0YXJ0JiZjLmVuZDw9aC5lbmQpe2NvbnN0IHU9Yy5lbmQ7Yy5lbmQ9aC5zdGFydCxoLnN0YXJ0PXV9ZWxzZSBpZihjLnN0YXJ0Pj1oLnN0YXJ0JiZjLmVuZD49aC5lbmQpe2NvbnN0IHU9aC5lbmQ7aC5lbmQ9Yy5zdGFydCxjLnN0YXJ0PXV9ZWxzZSB0aHJvdyBuZXcgRXJyb3J9aWYoZS5oYXMoYy5pbmRleCl8fGUuc2V0KGMuaW5kZXgsW10pLGUuaGFzKGguaW5kZXgpfHxlLnNldChoLmluZGV4LFtdKSxlLmdldChjLmluZGV4KS5wdXNoKGguaW5kZXgpLGUuZ2V0KGguaW5kZXgpLnB1c2goYy5pbmRleCksbyhoKSYmKHQuc3BsaWNlKGwsMSksbC0tKSxvKGMpKXtpLnNwbGljZShhLDEpLGEtLTticmVha319fXMoaSkscyh0KTtmdW5jdGlvbiBzKGEpe2ZvcihsZXQgYz0wO2M8YS5sZW5ndGg7YysrKW8oYVtjXSkmJihhLnNwbGljZShjLDEpLGMtLSl9ZnVuY3Rpb24gcihhLGMpe3JldHVybiBNYXRoLmFicyhjLWEpPG59ZnVuY3Rpb24gbyhhKXtyZXR1cm4gTWF0aC5hYnMoYS5lbmQtYS5zdGFydCk8bn19Y29uc3QgSGw9MWUtNSxKbD0xZS00O2NsYXNzIHRwe2NvbnN0cnVjdG9yKCl7dGhpcy5fcmF5cz1bXX1hZGRSYXkodCl7dGhpcy5fcmF5cy5wdXNoKHQpfWZpbmRDbG9zZXN0UmF5KHQpe2NvbnN0IGU9dGhpcy5fcmF5cyxuPXQuY2xvbmUoKTtuLmRpcmVjdGlvbi5tdWx0aXBseVNjYWxhcigtMSk7bGV0IHM9MS8wLHI9bnVsbDtmb3IobGV0IGM9MCxsPWUubGVuZ3RoO2M8bDtjKyspe2NvbnN0IGg9ZVtjXTtpZihvKGgsdCkmJm8oaCxuKSljb250aW51ZTtjb25zdCB1PWEoaCx0KSxmPWEoaCxuKSxkPU1hdGgubWluKHUsZik7ZDxzJiYocz1kLHI9aCl9cmV0dXJuIHI7ZnVuY3Rpb24gbyhjLGwpe2NvbnN0IGg9Yy5vcmlnaW4uZGlzdGFuY2VUbyhsLm9yaWdpbik+SGw7cmV0dXJuIGMuZGlyZWN0aW9uLmFuZ2xlVG8obC5kaXJlY3Rpb24pPkpsfHxofWZ1bmN0aW9uIGEoYyxsKXtjb25zdCBoPWMub3JpZ2luLmRpc3RhbmNlVG8obC5vcmlnaW4pLHU9Yy5kaXJlY3Rpb24uYW5nbGVUbyhsLmRpcmVjdGlvbik7cmV0dXJuIGgvSGwrdS9KbH19fWNvbnN0IGJhPW5ldyBQLE1hPW5ldyBQLGlyPW5ldyBTbztmdW5jdGlvbiBlcChpLHQsZSl7Y29uc3Qgbj1pLmF0dHJpYnV0ZXMscz1pLmluZGV4LHI9bi5wb3NpdGlvbixvPW5ldyBNYXAsYT1uZXcgTWFwLGM9QXJyYXkuZnJvbSh0KSxsPW5ldyB0cDtmb3IobGV0IGg9MCx1PWMubGVuZ3RoO2g8dTtoKyspe2NvbnN0IGY9Y1toXSxkPWowKGYpLHA9UTAoZik7bGV0IHk9MypkK3AsZz0zKmQrKHArMSklMztzJiYoeT1zLmdldFgoeSksZz1zLmdldFgoZykpLGJhLmZyb21CdWZmZXJBdHRyaWJ1dGUocix5KSxNYS5mcm9tQnVmZmVyQXR0cmlidXRlKHIsZyksWDAoYmEsTWEsaXIpO2xldCB3LGI9bC5maW5kQ2xvc2VzdFJheShpcik7Yj09PW51bGwmJihiPWlyLmNsb25lKCksbC5hZGRSYXkoYikpLGEuaGFzKGIpfHxhLnNldChiLHtmb3J3YXJkOltdLHJldmVyc2U6W10scmF5OmJ9KSx3PWEuZ2V0KGIpO2xldCB4PVdsKGIsYmEpLG09V2woYixNYSk7eD5tJiYoW3gsbV09W20seF0pLGlyLmRpcmVjdGlvbi5kb3QoYi5kaXJlY3Rpb24pPDA/dy5yZXZlcnNlLnB1c2goe3N0YXJ0OngsZW5kOm0saW5kZXg6Zn0pOncuZm9yd2FyZC5wdXNoKHtzdGFydDp4LGVuZDptLGluZGV4OmZ9KX1yZXR1cm4gYS5mb3JFYWNoKCh7Zm9yd2FyZDpoLHJldmVyc2U6dX0sZik9PntLMChoLHUsbyxlKSxoLmxlbmd0aD09PTAmJnUubGVuZ3RoPT09MCYmYS5kZWxldGUoZil9KSx7ZGlzam9pbnRDb25uZWN0aXZpdHlNYXA6byxmcmFnbWVudE1hcDphfX1jb25zdCBucD1uZXcgayxBYT1uZXcgUCxpcD1uZXcgaWUsU2E9WyIiLCIiLCIiXTtjbGFzcyBzcHtjb25zdHJ1Y3Rvcih0PW51bGwpe3RoaXMuZGF0YT1udWxsLHRoaXMuZGlzam9pbnRDb25uZWN0aW9ucz1udWxsLHRoaXMudW5tYXRjaGVkRGlzam9pbnRFZGdlcz1udWxsLHRoaXMudW5tYXRjaGVkRWRnZXM9LTEsdGhpcy5tYXRjaGVkRWRnZXM9LTEsdGhpcy51c2VEcmF3UmFuZ2U9ITAsdGhpcy51c2VBbGxBdHRyaWJ1dGVzPSExLHRoaXMubWF0Y2hEaXNqb2ludEVkZ2VzPSExLHRoaXMuZGVnZW5lcmF0ZUVwc2lsb249MWUtOCx0JiZ0aGlzLnVwZGF0ZUZyb20odCl9Z2V0U2libGluZ1RyaWFuZ2xlSW5kZXgodCxlKXtjb25zdCBuPXRoaXMuZGF0YVt0KjMrZV07cmV0dXJuIG49PT0tMT8tMTp+fihuLzMpfWdldFNpYmxpbmdFZGdlSW5kZXgodCxlKXtjb25zdCBuPXRoaXMuZGF0YVt0KjMrZV07cmV0dXJuIG49PT0tMT8tMTpuJTN9Z2V0RGlzam9pbnRTaWJsaW5nVHJpYW5nbGVJbmRpY2VzKHQsZSl7Y29uc3Qgbj10KjMrZSxzPXRoaXMuZGlzam9pbnRDb25uZWN0aW9ucy5nZXQobik7cmV0dXJuIHM/cy5tYXAocj0+fn4oci8zKSk6W119Z2V0RGlzam9pbnRTaWJsaW5nRWRnZUluZGljZXModCxlKXtjb25zdCBuPXQqMytlLHM9dGhpcy5kaXNqb2ludENvbm5lY3Rpb25zLmdldChuKTtyZXR1cm4gcz9zLm1hcChyPT5yJTMpOltdfWlzRnVsbHlDb25uZWN0ZWQoKXtyZXR1cm4gdGhpcy51bm1hdGNoZWRFZGdlcz09PTB9dXBkYXRlRnJvbSh0KXtjb25zdHt1c2VBbGxBdHRyaWJ1dGVzOmUsdXNlRHJhd1JhbmdlOm4sbWF0Y2hEaXNqb2ludEVkZ2VzOnMsZGVnZW5lcmF0ZUVwc2lsb246cn09dGhpcyxvPWU/eDpiLGE9bmV3IE1hcCx7YXR0cmlidXRlczpjfT10LGw9ZT9PYmplY3Qua2V5cyhjKTpudWxsLGg9dC5pbmRleCx1PWMucG9zaXRpb247bGV0IGY9d2EodCk7Y29uc3QgZD1mO2xldCBwPTA7biYmKHA9dC5kcmF3UmFuZ2Uuc3RhcnQsdC5kcmF3UmFuZ2UuY291bnQhPT0xLzAmJihmPX5+KHQuZHJhd1JhbmdlLmNvdW50LzMpKSk7bGV0IHk9dGhpcy5kYXRhOygheXx8eS5sZW5ndGg8MypkKSYmKHk9bmV3IEludDMyQXJyYXkoMypkKSkseS5maWxsKC0xKTtsZXQgZz0wLHc9bmV3IFNldDtmb3IobGV0IG09cCxNPWYqMytwO208TTttKz0zKXtjb25zdCBTPW07Zm9yKGxldCBBPTA7QTwzO0ErKyl7bGV0IHY9UytBO2gmJih2PWguZ2V0WCh2KSksU2FbQV09byh2KX1mb3IobGV0IEE9MDtBPDM7QSsrKXtjb25zdCB2PShBKzEpJTMsXz1TYVtBXSxUPVNhW3ZdLHo9YCR7VH1fJHtffWA7aWYoYS5oYXMoeikpe2NvbnN0IEM9UytBLEU9YS5nZXQoeik7eVtDXT1FLHlbRV09QyxhLmRlbGV0ZSh6KSxnKz0yLHcuZGVsZXRlKEUpfWVsc2V7Y29uc3QgQz1gJHtffV8ke1R9YCxFPVMrQTthLnNldChDLEUpLHcuYWRkKEUpfX19aWYocyl7Y29uc3R7ZnJhZ21lbnRNYXA6bSxkaXNqb2ludENvbm5lY3Rpdml0eU1hcDpNfT1lcCh0LHcscik7dy5jbGVhcigpLG0uZm9yRWFjaCgoe2ZvcndhcmQ6UyxyZXZlcnNlOkF9KT0+e1MuZm9yRWFjaCgoe2luZGV4OnZ9KT0+dy5hZGQodikpLEEuZm9yRWFjaCgoe2luZGV4OnZ9KT0+dy5hZGQodikpfSksdGhpcy51bm1hdGNoZWREaXNqb2ludEVkZ2VzPW0sdGhpcy5kaXNqb2ludENvbm5lY3Rpb25zPU0sZz1mKjMtdy5zaXplfXRoaXMubWF0Y2hlZEVkZ2VzPWcsdGhpcy51bm1hdGNoZWRFZGdlcz13LnNpemUsdGhpcy5kYXRhPXk7ZnVuY3Rpb24gYihtKXtyZXR1cm4gQWEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh1LG0pLFhsKEFhKX1mdW5jdGlvbiB4KG0pe2xldCBNPSIiO2ZvcihsZXQgUz0wLEE9bC5sZW5ndGg7UzxBO1MrKyl7Y29uc3Qgdj1jW2xbU11dO2xldCBfO3N3aXRjaCh2Lml0ZW1TaXplKXtjYXNlIDE6Xz12ZSh2LmdldFgobSkpO2JyZWFrO2Nhc2UgMjpfPVUwKG5wLmZyb21CdWZmZXJBdHRyaWJ1dGUodixtKSk7YnJlYWs7Y2FzZSAzOl89WGwoQWEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh2LG0pKTticmVhaztjYXNlIDQ6Xz1xMChpcC5mcm9tQnVmZmVyQXR0cmlidXRlKHYsbSkpO2JyZWFrfU0hPT0iIiYmKE0rPSJ8IiksTSs9X31yZXR1cm4gTX19fWNsYXNzIHNyIGV4dGVuZHMgaWR7Y29uc3RydWN0b3IoLi4udCl7c3VwZXIoLi4udCksdGhpcy5pc0JydXNoPSEwLHRoaXMuX3ByZXZpb3VzTWF0cml4PW5ldyBzdCx0aGlzLl9wcmV2aW91c01hdHJpeC5lbGVtZW50cy5maWxsKDApfW1hcmtVcGRhdGVkKCl7dGhpcy5fcHJldmlvdXNNYXRyaXguY29weSh0aGlzLm1hdHJpeCl9aXNEaXJ0eSgpe2NvbnN0e21hdHJpeDp0LF9wcmV2aW91c01hdHJpeDplfT10aGlzLG49dC5lbGVtZW50cyxzPWUuZWxlbWVudHM7Zm9yKGxldCByPTA7cjwxNjtyKyspaWYobltyXSE9PXNbcl0pcmV0dXJuITA7cmV0dXJuITF9cHJlcGFyZUdlb21ldHJ5KCl7Y29uc3QgdD10aGlzLmdlb21ldHJ5LGU9dC5hdHRyaWJ1dGVzLG49WmwoKTtpZihuKWZvcihjb25zdCBzIGluIGUpe2NvbnN0IHI9ZVtzXTtpZihyLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpdGhyb3cgbmV3IEVycm9yKCJCcnVzaDogSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkLiIpO3IuYXJyYXk9WjAoci5hcnJheSl9aWYodC5ib3VuZHNUcmVlfHwoVzAodCx7dXNlU2hhcmVkQXJyYXlCdWZmZXI6bn0pLHQuYm91bmRzVHJlZT1uZXcgeGEodCx7bWF4TGVhZlRyaXM6MyxpbmRpcmVjdDohMCx1c2VTaGFyZWRBcnJheUJ1ZmZlcjpufSkpLHQuaGFsZkVkZ2VzfHwodC5oYWxmRWRnZXM9bmV3IHNwKHQpKSwhdC5ncm91cEluZGljZXMpe2NvbnN0IHM9d2EodCkscj1uZXcgVWludDE2QXJyYXkocyksbz10Lmdyb3Vwcztmb3IobGV0IGE9MCxjPW8ubGVuZ3RoO2E8YzthKyspe2NvbnN0e3N0YXJ0OmwsY291bnQ6aH09b1thXTtmb3IobGV0IHU9bC8zLGY9KGwraCkvMzt1PGY7dSsrKXJbdV09YX10Lmdyb3VwSW5kaWNlcz1yfX1kaXNwb3NlQ2FjaGVEYXRhKCl7Y29uc3R7Z2VvbWV0cnk6dH09dGhpczt0LmhhbGZFZGdlcz1udWxsLHQuYm91bmRzVHJlZT1udWxsLHQuZ3JvdXBJbmRpY2VzPW51bGx9fWNvbnN0IHJwPTFlLTE0LHZhPW5ldyBQLFlsPW5ldyBQLGpsPW5ldyBQO2Z1bmN0aW9uIGhuKGksdD1ycCl7dmEuc3ViVmVjdG9ycyhpLmIsaS5hKSxZbC5zdWJWZWN0b3JzKGkuYyxpLmEpLGpsLnN1YlZlY3RvcnMoaS5iLGkuYyk7Y29uc3QgZT12YS5hbmdsZVRvKFlsKSxuPXZhLmFuZ2xlVG8oamwpLHM9TWF0aC5QSS1lLW47cmV0dXJuIE1hdGguYWJzKGUpPHR8fE1hdGguYWJzKG4pPHR8fE1hdGguYWJzKHMpPHR8fGkuYS5kaXN0YW5jZVRvU3F1YXJlZChpLmIpPHR8fGkuYS5kaXN0YW5jZVRvU3F1YXJlZChpLmMpPHR8fGkuYi5kaXN0YW5jZVRvU3F1YXJlZChpLmMpPHR9Y29uc3QgX2E9MWUtMTAsSGk9MWUtMTAsb3A9MWUtMTAsJGU9bmV3IHJlLGR0PW5ldyByZSxWZT1uZXcgUCx6YT1uZXcgUCxRbD1uZXcgUCxycj1uZXcgUm8sVGE9bmV3IGFlO2NsYXNzIGFwe2NvbnN0cnVjdG9yKCl7dGhpcy5fcG9vbD1bXSx0aGlzLl9pbmRleD0wfWdldFRyaWFuZ2xlKCl7cmV0dXJuIHRoaXMuX2luZGV4Pj10aGlzLl9wb29sLmxlbmd0aCYmdGhpcy5fcG9vbC5wdXNoKG5ldyBldCksdGhpcy5fcG9vbFt0aGlzLl9pbmRleCsrXX1jbGVhcigpe3RoaXMuX2luZGV4PTB9cmVzZXQoKXt0aGlzLl9wb29sLmxlbmd0aD0wLHRoaXMuX2luZGV4PTB9fWNsYXNzIGNwe2NvbnN0cnVjdG9yKCl7dGhpcy50cmlhbmdsZVBvb2w9bmV3IGFwLHRoaXMudHJpYW5nbGVzPVtdLHRoaXMubm9ybWFsPW5ldyBQLHRoaXMuY29wbGFuYXJUcmlhbmdsZVVzZWQ9ITF9aW5pdGlhbGl6ZSh0KXt0aGlzLnJlc2V0KCk7Y29uc3R7dHJpYW5nbGVzOmUsdHJpYW5nbGVQb29sOm4sbm9ybWFsOnN9PXRoaXM7aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IobGV0IHI9MCxvPXQubGVuZ3RoO3I8bztyKyspe2NvbnN0IGE9dFtyXTtpZihyPT09MClhLmdldE5vcm1hbChzKTtlbHNlIGlmKE1hdGguYWJzKDEtYS5nZXROb3JtYWwoVmUpLmRvdChzKSk+X2EpdGhyb3cgbmV3IEVycm9yKCJUcmlhbmdsZSBTcGxpdHRlcjogQ2Fubm90IGluaXRpYWxpemUgd2l0aCB0cmlhbmdsZXMgdGhhdCBoYXZlIGRpZmZlcmVudCBub3JtYWxzLiIpO2NvbnN0IGM9bi5nZXRUcmlhbmdsZSgpO2MuY29weShhKSxlLnB1c2goYyl9ZWxzZXt0LmdldE5vcm1hbChzKTtjb25zdCByPW4uZ2V0VHJpYW5nbGUoKTtyLmNvcHkodCksZS5wdXNoKHIpfX1zcGxpdEJ5VHJpYW5nbGUodCl7Y29uc3R7bm9ybWFsOmUsdHJpYW5nbGVzOm59PXRoaXM7aWYodC5nZXROb3JtYWwoemEpLm5vcm1hbGl6ZSgpLE1hdGguYWJzKDEtTWF0aC5hYnMoemEuZG90KGUpKSk8b3Ape3RoaXMuY29wbGFuYXJUcmlhbmdsZVVzZWQ9ITA7Zm9yKGxldCByPTAsbz1uLmxlbmd0aDtyPG87cisrKXtjb25zdCBhPW5bcl07YS5jb3BsYW5hckNvdW50PTB9Y29uc3Qgcz1bdC5hLHQuYix0LmNdO2ZvcihsZXQgcj0wO3I8MztyKyspe2NvbnN0IG89KHIrMSklMyxhPXNbcl0sYz1zW29dO1ZlLnN1YlZlY3RvcnMoYyxhKS5ub3JtYWxpemUoKSxRbC5jcm9zc1ZlY3RvcnMoemEsVmUpLHJyLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KFFsLGEpLHRoaXMuc3BsaXRCeVBsYW5lKHJyLHQpfX1lbHNlIHQuZ2V0UGxhbmUocnIpLHRoaXMuc3BsaXRCeVBsYW5lKHJyLHQpfXNwbGl0QnlQbGFuZSh0LGUpe2NvbnN0e3RyaWFuZ2xlczpuLHRyaWFuZ2xlUG9vbDpzfT10aGlzO1RhLmNvcHkoZSksVGEubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCByPTAsbz1uLmxlbmd0aDtyPG87cisrKXtjb25zdCBhPW5bcl07aWYoIVRhLmludGVyc2VjdHNUcmlhbmdsZShhLCRlLCEwKSljb250aW51ZTtjb25zdHthOmMsYjpsLGM6aH09YTtsZXQgdT0wLGY9LTEsZD0hMSxwPVtdLHk9W107Y29uc3QgZz1bYyxsLGhdO2ZvcihsZXQgdz0wO3c8Mzt3Kyspe2NvbnN0IGI9KHcrMSklMzskZS5zdGFydC5jb3B5KGdbd10pLCRlLmVuZC5jb3B5KGdbYl0pO2NvbnN0IHg9dC5kaXN0YW5jZVRvUG9pbnQoJGUuc3RhcnQpLG09dC5kaXN0YW5jZVRvUG9pbnQoJGUuZW5kKTtpZihNYXRoLmFicyh4KTxIaSYmTWF0aC5hYnMobSk8SGkpe2Q9ITA7YnJlYWt9aWYoeD4wP3AucHVzaCh3KTp5LnB1c2godyksTWF0aC5hYnMoeCk8SGkpY29udGludWU7bGV0IE09ISF0LmludGVyc2VjdExpbmUoJGUsVmUpOyFNJiZNYXRoLmFicyhtKTxIaSYmKFZlLmNvcHkoJGUuZW5kKSxNPSEwKSxNJiYhKFZlLmRpc3RhbmNlVG8oJGUuc3RhcnQpPF9hKSYmKFZlLmRpc3RhbmNlVG8oJGUuZW5kKTxfYSYmKGY9dyksdT09PTA/ZHQuc3RhcnQuY29weShWZSk6ZHQuZW5kLmNvcHkoVmUpLHUrKyl9aWYoIWQmJnU9PT0yJiZkdC5kaXN0YW5jZSgpPkhpKWlmKGYhPT0tMSl7Zj0oZisxKSUzO2xldCB3PTA7dz09PWYmJih3PSh3KzEpJTMpO2xldCBiPXcrMTtiPT09ZiYmKGI9KGIrMSklMyk7Y29uc3QgeD1zLmdldFRyaWFuZ2xlKCk7eC5hLmNvcHkoZ1tiXSkseC5iLmNvcHkoZHQuZW5kKSx4LmMuY29weShkdC5zdGFydCksaG4oeCl8fG4ucHVzaCh4KSxhLmEuY29weShnW3ddKSxhLmIuY29weShkdC5zdGFydCksYS5jLmNvcHkoZHQuZW5kKSxobihhKSYmKG4uc3BsaWNlKHIsMSksci0tLG8tLSl9ZWxzZXtjb25zdCB3PXAubGVuZ3RoPj0yP3lbMF06cFswXTtpZih3PT09MCl7bGV0IFM9ZHQuc3RhcnQ7ZHQuc3RhcnQ9ZHQuZW5kLGR0LmVuZD1TfWNvbnN0IGI9KHcrMSklMyx4PSh3KzIpJTMsbT1zLmdldFRyaWFuZ2xlKCksTT1zLmdldFRyaWFuZ2xlKCk7Z1tiXS5kaXN0YW5jZVRvU3F1YXJlZChkdC5zdGFydCk8Z1t4XS5kaXN0YW5jZVRvU3F1YXJlZChkdC5lbmQpPyhtLmEuY29weShnW2JdKSxtLmIuY29weShkdC5zdGFydCksbS5jLmNvcHkoZHQuZW5kKSxNLmEuY29weShnW2JdKSxNLmIuY29weShnW3hdKSxNLmMuY29weShkdC5zdGFydCkpOihtLmEuY29weShnW3hdKSxtLmIuY29weShkdC5zdGFydCksbS5jLmNvcHkoZHQuZW5kKSxNLmEuY29weShnW2JdKSxNLmIuY29weShnW3hdKSxNLmMuY29weShkdC5lbmQpKSxhLmEuY29weShnW3ddKSxhLmIuY29weShkdC5lbmQpLGEuYy5jb3B5KGR0LnN0YXJ0KSxobihtKXx8bi5wdXNoKG0pLGhuKE0pfHxuLnB1c2goTSksaG4oYSkmJihuLnNwbGljZShyLDEpLHItLSxvLS0pfWVsc2UgdT09PTMmJmNvbnNvbGUud2FybigiVHJpYW5nbGVDbGlwcGVyOiBDb3BsYW5hciBjbGlwIG5vdCBoYW5kbGVkIil9fXJlc2V0KCl7dGhpcy50cmlhbmdsZXMubGVuZ3RoPTAsdGhpcy50cmlhbmdsZVBvb2wuY2xlYXIoKSx0aGlzLmNvcGxhbmFyVHJpYW5nbGVVc2VkPSExfX1mdW5jdGlvbiBscChpKXtyZXR1cm4gaT1+fmksaSs0LWklNH1jbGFzcyBLbHtjb25zdHJ1Y3Rvcih0LGU9NTAwKXt0aGlzLmV4cGFuc2lvbkZhY3Rvcj0xLjUsdGhpcy50eXBlPXQsdGhpcy5sZW5ndGg9MCx0aGlzLmFycmF5PW51bGwsdGhpcy5zZXRTaXplKGUpfXNldFR5cGUodCl7aWYodGhpcy5sZW5ndGghPT0wKXRocm93IG5ldyBFcnJvcigiVHlwZUJhY2tlZEFycmF5OiBDYW5ub3QgY2hhbmdlIHRoZSB0eXBlIHdoaWxlIHRoZXJlIGlzIHVzZWQgZGF0YSBpbiB0aGUgYnVmZmVyLiIpO2NvbnN0IGU9dGhpcy5hcnJheS5idWZmZXI7dGhpcy5hcnJheT1uZXcgdChlKSx0aGlzLnR5cGU9dH1zZXRTaXplKHQpe2lmKHRoaXMuYXJyYXkmJnQ9PT10aGlzLmFycmF5Lmxlbmd0aClyZXR1cm47Y29uc3QgZT10aGlzLnR5cGUsbj1abCgpP1NoYXJlZEFycmF5QnVmZmVyOkFycmF5QnVmZmVyLHM9bmV3IGUobmV3IG4obHAodCplLkJZVEVTX1BFUl9FTEVNRU5UKSkpO3RoaXMuYXJyYXkmJnMuc2V0KHRoaXMuYXJyYXksMCksdGhpcy5hcnJheT1zfWV4cGFuZCgpe2NvbnN0e2FycmF5OnQsZXhwYW5zaW9uRmFjdG9yOmV9PXRoaXM7dGhpcy5zZXRTaXplKHQubGVuZ3RoKmUpfXB1c2goLi4udCl7bGV0e2FycmF5OmUsbGVuZ3RoOm59PXRoaXM7bit0Lmxlbmd0aD5lLmxlbmd0aCYmKHRoaXMuZXhwYW5kKCksZT10aGlzLmFycmF5KTtmb3IobGV0IHM9MCxyPXQubGVuZ3RoO3M8cjtzKyspZVtuK3NdPXRbc107dGhpcy5sZW5ndGgrPXQubGVuZ3RofWNsZWFyKCl7dGhpcy5sZW5ndGg9MH19Y2xhc3MgaHB7Y29uc3RydWN0b3IoKXt0aGlzLmdyb3VwQXR0cmlidXRlcz1be31dLHRoaXMuZ3JvdXBDb3VudD0wfWdldFR5cGUodCl7cmV0dXJuIHRoaXMuZ3JvdXBBdHRyaWJ1dGVzWzBdW3RdLnR5cGV9Z2V0SXRlbVNpemUodCl7cmV0dXJuIHRoaXMuZ3JvdXBBdHRyaWJ1dGVzWzBdW3RdLml0ZW1TaXplfWdldE5vcm1hbGl6ZWQodCl7cmV0dXJuIHRoaXMuZ3JvdXBBdHRyaWJ1dGVzWzBdW3RdLm5vcm1hbGl6ZWR9Z2V0Q291bnQodCl7aWYodGhpcy5ncm91cENvdW50PD10KXJldHVybiAwO2NvbnN0IGU9dGhpcy5nZXRHcm91cEF0dHJBcnJheSgicG9zaXRpb24iLHQpO3JldHVybiBlLmxlbmd0aC9lLml0ZW1TaXplfWdldFRvdGFsTGVuZ3RoKHQpe2NvbnN0e2dyb3VwQ291bnQ6ZSxncm91cEF0dHJpYnV0ZXM6bn09dGhpcztsZXQgcz0wO2ZvcihsZXQgcj0wO3I8ZTtyKyspe2NvbnN0IG89bltyXTtzKz1vW3RdLmxlbmd0aH1yZXR1cm4gc31nZXRHcm91cEF0dHJTZXQodD0wKXtjb25zdHtncm91cEF0dHJpYnV0ZXM6ZX09dGhpcztpZihlW3RdKXJldHVybiB0aGlzLmdyb3VwQ291bnQ9TWF0aC5tYXgodGhpcy5ncm91cENvdW50LHQrMSksZVt0XTtjb25zdCBuPWVbMF07Zm9yKHRoaXMuZ3JvdXBDb3VudD1NYXRoLm1heCh0aGlzLmdyb3VwQ291bnQsdCsxKTt0Pj1lLmxlbmd0aDspe2NvbnN0IHM9e307ZS5wdXNoKHMpO2Zvcihjb25zdCByIGluIG4pe2NvbnN0IG89bltyXSxhPW5ldyBLbChvLnR5cGUpO2EuaXRlbVNpemU9by5pdGVtU2l6ZSxhLm5vcm1hbGl6ZWQ9by5ub3JtYWxpemVkLHNbcl09YX19cmV0dXJuIGVbdF19Z2V0R3JvdXBBdHRyQXJyYXkodCxlPTApe2NvbnN0e2dyb3VwQXR0cmlidXRlczpufT10aGlzO2lmKCFuWzBdW3RdKXRocm93IG5ldyBFcnJvcihgVHlwZWRBdHRyaWJ1dGVEYXRhOiBBdHRyaWJ1dGUgd2l0aCAiJHt0fSIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkYCk7cmV0dXJuIHRoaXMuZ2V0R3JvdXBBdHRyU2V0KGUpW3RdfWluaXRpYWxpemVBcnJheSh0LGUsbixzKXtjb25zdHtncm91cEF0dHJpYnV0ZXM6cn09dGhpcyxhPXJbMF1bdF07aWYoYSl7aWYoYS50eXBlIT09ZSlmb3IobGV0IGM9MCxsPXIubGVuZ3RoO2M8bDtjKyspe2NvbnN0IGg9cltjXVt0XTtoLnNldFR5cGUoZSksaC5pdGVtU2l6ZT1uLGgubm9ybWFsaXplZD1zfX1lbHNlIGZvcihsZXQgYz0wLGw9ci5sZW5ndGg7YzxsO2MrKyl7Y29uc3QgaD1uZXcgS2woZSk7aC5pdGVtU2l6ZT1uLGgubm9ybWFsaXplZD1zLHJbY11bdF09aH19Y2xlYXIoKXt0aGlzLmdyb3VwQ291bnQ9MDtjb25zdHtncm91cEF0dHJpYnV0ZXM6dH09dGhpczt0LmZvckVhY2goZT0+e2Zvcihjb25zdCBuIGluIGUpZVtuXS5jbGVhcigpfSl9ZGVsZXRlKHQpe3RoaXMuZ3JvdXBBdHRyaWJ1dGVzLmZvckVhY2goZT0+e2RlbGV0ZSBlW3RdfSl9cmVzZXQoKXt0aGlzLmdyb3VwQXR0cmlidXRlcz1bXSx0aGlzLmdyb3VwQ291bnQ9MH19Y2xhc3MgdGh7Y29uc3RydWN0b3IoKXt0aGlzLmludGVyc2VjdGlvblNldD17fSx0aGlzLmlkcz1bXX1hZGQodCxlKXtjb25zdHtpbnRlcnNlY3Rpb25TZXQ6bixpZHM6c309dGhpcztuW3RdfHwoblt0XT1bXSxzLnB1c2godCkpLG5bdF0ucHVzaChlKX19Y29uc3QgdXA9MCxmcD0xLGRwPTIsZWg9MyxwcD00LG5oPTUsaWg9NixoZT1uZXcgU28sc2g9bmV3IHN0LEx0PW5ldyBldCxVZT1uZXcgUCxyaD1uZXcgaWUsb2g9bmV3IGllLGFoPW5ldyBpZSxQYT1uZXcgaWUsb3I9bmV3IGllLGFyPW5ldyBpZSxjaD1uZXcgcmUsQ2E9bmV3IFAsRWE9MWUtOCx5cD0xZS0xNSxUbj0tMSxQbj0xLGNyPS0yLGxyPTIsSmk9MCxDbj0xLEJhPTIsbXA9MWUtMTQ7bGV0IGhyPW51bGw7ZnVuY3Rpb24gbGgoaSl7aHI9aX1mdW5jdGlvbiBoaChpLHQpe2kuZ2V0TWlkcG9pbnQoaGUub3JpZ2luKSxpLmdldE5vcm1hbChoZS5kaXJlY3Rpb24pO2NvbnN0IGU9dC5yYXljYXN0Rmlyc3QoaGUsMik7cmV0dXJuISEoZSYmaGUuZGlyZWN0aW9uLmRvdChlLmZhY2Uubm9ybWFsKT4wKT9UbjpQbn1mdW5jdGlvbiBncChpLHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gTWF0aC5yYW5kb20oKS0uNX1pLmdldE5vcm1hbChDYSksaGUuZGlyZWN0aW9uLmNvcHkoQ2EpLGkuZ2V0TWlkcG9pbnQoaGUub3JpZ2luKTtjb25zdCBuPTM7bGV0IHM9MCxyPTEvMDtmb3IobGV0IG89MDtvPG47bysrKXtoZS5kaXJlY3Rpb24ueCs9ZSgpKkVhLGhlLmRpcmVjdGlvbi55Kz1lKCkqRWEsaGUuZGlyZWN0aW9uLnorPWUoKSpFYSxoZS5kaXJlY3Rpb24ubXVsdGlwbHlTY2FsYXIoLTEpO2NvbnN0IGE9dC5yYXljYXN0Rmlyc3QoaGUsMik7aWYoISEoYSYmaGUuZGlyZWN0aW9uLmRvdChhLmZhY2Uubm9ybWFsKT4wKSYmcysrLGEhPT1udWxsJiYocj1NYXRoLm1pbihyLGEuZGlzdGFuY2UpKSxyPD15cClyZXR1cm4gYS5mYWNlLm5vcm1hbC5kb3QoQ2EpPjA/bHI6Y3I7aWYocy9uPi41fHwoby1zKzEpL24+LjUpYnJlYWt9cmV0dXJuIHMvbj4uNT9UbjpQbn1mdW5jdGlvbiB4cChpLHQpe2NvbnN0IGU9bmV3IHRoLG49bmV3IHRoO3JldHVybiBzaC5jb3B5KGkubWF0cml4V29ybGQpLmludmVydCgpLm11bHRpcGx5KHQubWF0cml4V29ybGQpLGkuZ2VvbWV0cnkuYm91bmRzVHJlZS5idmhjYXN0KHQuZ2VvbWV0cnkuYm91bmRzVHJlZSxzaCx7aW50ZXJzZWN0c1RyaWFuZ2xlcyhzLHIsbyxhKXtpZighaG4ocykmJiFobihyKSl7bGV0IGM9cy5pbnRlcnNlY3RzVHJpYW5nbGUocixjaCwhMCk7aWYoIWMpe2NvbnN0IGw9cy5wbGFuZSxoPXIucGxhbmUsdT1sLm5vcm1hbCxmPWgubm9ybWFsO3UuZG90KGYpPT09MSYmTWF0aC5hYnMobC5jb25zdGFudC1oLmNvbnN0YW50KTxtcCYmKGM9ITApfWlmKGMpe2xldCBsPWkuZ2VvbWV0cnkuYm91bmRzVHJlZS5yZXNvbHZlVHJpYW5nbGVJbmRleChvKSxoPXQuZ2VvbWV0cnkuYm91bmRzVHJlZS5yZXNvbHZlVHJpYW5nbGVJbmRleChhKTtlLmFkZChsLGgpLG4uYWRkKGgsbCksaHImJihoci5hZGRFZGdlKGNoKSxoci5hZGRJbnRlcnNlY3RpbmdUcmlhbmdsZXMobyxzLGEscikpfX1yZXR1cm4hMX19KSx7YUludGVyc2VjdGlvbnM6ZSxiSW50ZXJzZWN0aW9uczpufX1mdW5jdGlvbiB3cChpLHQsZSxuLHMscixvPSExKXtjb25zdCBhPWUuYXR0cmlidXRlcyxjPWUuaW5kZXgsbD1pKjMsaD1jLmdldFgobCswKSx1PWMuZ2V0WChsKzEpLGY9Yy5nZXRYKGwrMik7Zm9yKGNvbnN0IGQgaW4gcil7Y29uc3QgcD1hW2RdLHk9cltkXTtpZighKGQgaW4gYSkpdGhyb3cgbmV3IEVycm9yKGBDU0cgT3BlcmF0aW9uczogQXR0cmlidXRlICR7ZH0gbm90IGF2YWlsYWJsZSBvbiBnZW9tZXRyeS5gKTtjb25zdCBnPXAuaXRlbVNpemU7ZD09PSJwb3NpdGlvbiI/KEx0LmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLGgpLmFwcGx5TWF0cml4NChuKSxMdC5iLmZyb21CdWZmZXJBdHRyaWJ1dGUocCx1KS5hcHBseU1hdHJpeDQobiksTHQuYy5mcm9tQnVmZmVyQXR0cmlidXRlKHAsZikuYXBwbHlNYXRyaXg0KG4pLEZhKEx0LmEsTHQuYixMdC5jLHQsMyx5LG8pKTpkPT09Im5vcm1hbCI/KEx0LmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLGgpLmFwcGx5Tm9ybWFsTWF0cml4KHMpLEx0LmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLHUpLmFwcGx5Tm9ybWFsTWF0cml4KHMpLEx0LmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLGYpLmFwcGx5Tm9ybWFsTWF0cml4KHMpLG8mJihMdC5hLm11bHRpcGx5U2NhbGFyKC0xKSxMdC5iLm11bHRpcGx5U2NhbGFyKC0xKSxMdC5jLm11bHRpcGx5U2NhbGFyKC0xKSksRmEoTHQuYSxMdC5iLEx0LmMsdCwzLHksbywhMCkpOihyaC5mcm9tQnVmZmVyQXR0cmlidXRlKHAsaCksb2guZnJvbUJ1ZmZlckF0dHJpYnV0ZShwLHUpLGFoLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxmKSxGYShyaCxvaCxhaCx0LGcseSxvKSl9fWZ1bmN0aW9uIGJwKGksdCxlLG4scyxyLG8sYT0hMSl7SWEoaSxuLHMscixvLGEpLElhKGE/ZTp0LG4scyxyLG8sYSksSWEoYT90OmUsbixzLHIsbyxhKX1mdW5jdGlvbiB1aChpLHQsZT0hMSl7c3dpdGNoKGkpe2Nhc2UgdXA6aWYodD09PVBufHx0PT09bHImJiFlKXJldHVybiBDbjticmVhaztjYXNlIGZwOmlmKGUpe2lmKHQ9PT1UbilyZXR1cm4gSml9ZWxzZSBpZih0PT09UG58fHQ9PT1jcilyZXR1cm4gQ247YnJlYWs7Y2FzZSBkcDppZihlKXtpZih0PT09UG58fHQ9PT1jcilyZXR1cm4gQ259ZWxzZSBpZih0PT09VG4pcmV0dXJuIEppO2JyZWFrO2Nhc2UgcHA6aWYodD09PVRuKXJldHVybiBKaTtpZih0PT09UG4pcmV0dXJuIENuO2JyZWFrO2Nhc2UgZWg6aWYodD09PVRufHx0PT09bHImJiFlKXJldHVybiBDbjticmVhaztjYXNlIG5oOmlmKCFlJiYodD09PVBufHx0PT09Y3IpKXJldHVybiBDbjticmVhaztjYXNlIGloOmlmKCFlJiYodD09PVRufHx0PT09bHIpKXJldHVybiBDbjticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIENTRyBvcGVyYXRpb24gZW51bSAiJHtpfSIuYCl9cmV0dXJuIEJhfWZ1bmN0aW9uIEZhKGksdCxlLG4scyxyLG89ITEsYT0hMSl7Y29uc3QgYz1sPT57ci5wdXNoKGwueCkscz4xJiZyLnB1c2gobC55KSxzPjImJnIucHVzaChsLnopLHM+MyYmci5wdXNoKGwudyl9O1BhLnNldCgwLDAsMCwwKS5hZGRTY2FsZWRWZWN0b3IoaSxuLmEueCkuYWRkU2NhbGVkVmVjdG9yKHQsbi5hLnkpLmFkZFNjYWxlZFZlY3RvcihlLG4uYS56KSxvci5zZXQoMCwwLDAsMCkuYWRkU2NhbGVkVmVjdG9yKGksbi5iLngpLmFkZFNjYWxlZFZlY3Rvcih0LG4uYi55KS5hZGRTY2FsZWRWZWN0b3IoZSxuLmIueiksYXIuc2V0KDAsMCwwLDApLmFkZFNjYWxlZFZlY3RvcihpLG4uYy54KS5hZGRTY2FsZWRWZWN0b3IodCxuLmMueSkuYWRkU2NhbGVkVmVjdG9yKGUsbi5jLnopLGEmJihQYS5ub3JtYWxpemUoKSxvci5ub3JtYWxpemUoKSxhci5ub3JtYWxpemUoKSksYyhQYSksbz8oYyhhciksYyhvcikpOihjKG9yKSxjKGFyKSl9ZnVuY3Rpb24gSWEoaSx0LGUsbixzLHI9ITEpe2Zvcihjb25zdCBvIGluIHMpe2NvbnN0IGE9dFtvXSxjPXNbb107aWYoIShvIGluIHQpKXRocm93IG5ldyBFcnJvcihgQ1NHIE9wZXJhdGlvbnM6IEF0dHJpYnV0ZSAke299IG5vIGF2YWlsYWJsZSBvbiBnZW9tZXRyeS5gKTtjb25zdCBsPWEuaXRlbVNpemU7bz09PSJwb3NpdGlvbiI/KFVlLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxpKS5hcHBseU1hdHJpeDQoZSksYy5wdXNoKFVlLngsVWUueSxVZS56KSk6bz09PSJub3JtYWwiPyhVZS5mcm9tQnVmZmVyQXR0cmlidXRlKGEsaSkuYXBwbHlOb3JtYWxNYXRyaXgobiksciYmVWUubXVsdGlwbHlTY2FsYXIoLTEpLGMucHVzaChVZS54LFVlLnksVWUueikpOihjLnB1c2goYS5nZXRYKGkpKSxsPjEmJmMucHVzaChhLmdldFkoaSkpLGw+MiYmYy5wdXNoKGEuZ2V0WihpKSksbD4zJiZjLnB1c2goYS5nZXRXKGkpKSl9fWNsYXNzIE1we2NvbnN0cnVjdG9yKHQpe3RoaXMudHJpYW5nbGU9bmV3IGV0KCkuY29weSh0KSx0aGlzLmludGVyc2VjdHM9e319YWRkVHJpYW5nbGUodCxlKXt0aGlzLmludGVyc2VjdHNbdF09bmV3IGV0KCkuY29weShlKX1nZXRJbnRlcnNlY3RBcnJheSgpe2NvbnN0IHQ9W10se2ludGVyc2VjdHM6ZX09dGhpcztmb3IoY29uc3QgbiBpbiBlKXQucHVzaChlW25dKTtyZXR1cm4gdH19Y2xhc3MgZmh7Y29uc3RydWN0b3IoKXt0aGlzLmRhdGE9e319YWRkVHJpYW5nbGVJbnRlcnNlY3Rpb24odCxlLG4scyl7Y29uc3R7ZGF0YTpyfT10aGlzO3JbdF18fChyW3RdPW5ldyBNcChlKSksclt0XS5hZGRUcmlhbmdsZShuLHMpfWdldFRyaWFuZ2xlc0FzQXJyYXkodD1udWxsKXtjb25zdHtkYXRhOmV9PXRoaXMsbj1bXTtpZih0IT09bnVsbCl0IGluIGUmJm4ucHVzaChlW3RdLnRyaWFuZ2xlKTtlbHNlIGZvcihjb25zdCBzIGluIGUpbi5wdXNoKGVbc10udHJpYW5nbGUpO3JldHVybiBufWdldFRyaWFuZ2xlSW5kaWNlcygpe3JldHVybiBPYmplY3Qua2V5cyh0aGlzLmRhdGEpLm1hcCh0PT5wYXJzZUludCh0KSl9Z2V0SW50ZXJzZWN0aW9uSW5kaWNlcyh0KXtjb25zdHtkYXRhOmV9PXRoaXM7cmV0dXJuIGVbdF0/T2JqZWN0LmtleXMoZVt0XS5pbnRlcnNlY3RzKS5tYXAobj0+cGFyc2VJbnQobikpOltdfWdldEludGVyc2VjdGlvbnNBc0FycmF5KHQ9bnVsbCxlPW51bGwpe2NvbnN0e2RhdGE6bn09dGhpcyxzPW5ldyBTZXQscj1bXSxvPWE9PntpZihuW2FdKWlmKGUhPT1udWxsKW5bYV0uaW50ZXJzZWN0c1tlXSYmci5wdXNoKG5bYV0uaW50ZXJzZWN0c1tlXSk7ZWxzZXtjb25zdCBjPW5bYV0uaW50ZXJzZWN0cztmb3IoY29uc3QgbCBpbiBjKXMuaGFzKGwpfHwocy5hZGQobCksci5wdXNoKGNbbF0pKX19O2lmKHQhPT1udWxsKW8odCk7ZWxzZSBmb3IoY29uc3QgYSBpbiBuKW8oYSk7cmV0dXJuIHJ9cmVzZXQoKXt0aGlzLmRhdGE9e319fWNsYXNzIEFwe2NvbnN0cnVjdG9yKCl7dGhpcy5lbmFibGVkPSExLHRoaXMudHJpYW5nbGVJbnRlcnNlY3RzQT1uZXcgZmgsdGhpcy50cmlhbmdsZUludGVyc2VjdHNCPW5ldyBmaCx0aGlzLmludGVyc2VjdGlvbkVkZ2VzPVtdfWFkZEludGVyc2VjdGluZ1RyaWFuZ2xlcyh0LGUsbixzKXtjb25zdHt0cmlhbmdsZUludGVyc2VjdHNBOnIsdHJpYW5nbGVJbnRlcnNlY3RzQjpvfT10aGlzO3IuYWRkVHJpYW5nbGVJbnRlcnNlY3Rpb24odCxlLG4scyksby5hZGRUcmlhbmdsZUludGVyc2VjdGlvbihuLHMsdCxlKX1hZGRFZGdlKHQpe3RoaXMuaW50ZXJzZWN0aW9uRWRnZXMucHVzaCh0LmNsb25lKCkpfXJlc2V0KCl7dGhpcy50cmlhbmdsZUludGVyc2VjdHNBLnJlc2V0KCksdGhpcy50cmlhbmdsZUludGVyc2VjdHNCLnJlc2V0KCksdGhpcy5pbnRlcnNlY3Rpb25FZGdlcz1bXX1pbml0KCl7dGhpcy5lbmFibGVkJiYodGhpcy5yZXNldCgpLGxoKHRoaXMpKX1jb21wbGV0ZSgpe3RoaXMuZW5hYmxlZCYmbGgobnVsbCl9fWNvbnN0IHVuPW5ldyBzdCx1cj1uZXcgTWUsRW49bmV3IGV0LGZyPW5ldyBldCxmbj1uZXcgZXQsZHI9bmV3IGV0LHhlPVtdLEJuPVtdO2Z1bmN0aW9uIFNwKGkpe2Zvcihjb25zdCB0IG9mIGkpcmV0dXJuIHR9ZnVuY3Rpb24gdnAoaSx0LGUsbixzLHI9e30pe2NvbnN0e3VzZUdyb3VwczpvPSEwfT1yLHthSW50ZXJzZWN0aW9uczphLGJJbnRlcnNlY3Rpb25zOmN9PXhwKGksdCksbD1bXTtsZXQgaD1udWxsLHU7cmV0dXJuIHU9bz8wOi0xLGRoKGksdCxhLGUsITEsbixzLHUpLHBoKGksdCxhLGUsITEscyx1KSxlLmZpbmRJbmRleChkPT5kIT09aWgmJmQhPT1uaCkhPT0tMSYmKHU9bz9pLmdlb21ldHJ5Lmdyb3Vwcy5sZW5ndGh8fDE6LTEsZGgodCxpLGMsZSwhMCxuLHMsdSkscGgodCxpLGMsZSwhMCxzLHUpKSx4ZS5sZW5ndGg9MCxCbi5sZW5ndGg9MCx7Z3JvdXBzOmwsbWF0ZXJpYWxzOmh9fWZ1bmN0aW9uIGRoKGksdCxlLG4scyxyLG8sYT0wKXtjb25zdCBjPWkubWF0cml4V29ybGQuZGV0ZXJtaW5hbnQoKTwwO3VuLmNvcHkodC5tYXRyaXhXb3JsZCkuaW52ZXJ0KCkubXVsdGlwbHkoaS5tYXRyaXhXb3JsZCksdXIuZ2V0Tm9ybWFsTWF0cml4KGkubWF0cml4V29ybGQpLm11bHRpcGx5U2NhbGFyKGM/LTE6MSk7Y29uc3QgbD1pLmdlb21ldHJ5Lmdyb3VwSW5kaWNlcyxoPWkuZ2VvbWV0cnkuaW5kZXgsdT1pLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24sZj10Lmdlb21ldHJ5LmJvdW5kc1RyZWUsZD10Lmdlb21ldHJ5LmluZGV4LHA9dC5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLHk9ZS5pZHMsZz1lLmludGVyc2VjdGlvblNldDtmb3IobGV0IHc9MCxiPXkubGVuZ3RoO3c8Yjt3Kyspe2NvbnN0IHg9eVt3XSxtPWE9PT0tMT8wOmxbeF0rYSxNPTMqeCxTPWguZ2V0WChNKzApLEE9aC5nZXRYKE0rMSksdj1oLmdldFgoTSsyKTtFbi5hLmZyb21CdWZmZXJBdHRyaWJ1dGUodSxTKS5hcHBseU1hdHJpeDQodW4pLEVuLmIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh1LEEpLmFwcGx5TWF0cml4NCh1biksRW4uYy5mcm9tQnVmZmVyQXR0cmlidXRlKHUsdikuYXBwbHlNYXRyaXg0KHVuKSxyLnJlc2V0KCksci5pbml0aWFsaXplKEVuKTtjb25zdCBfPWdbeF07Zm9yKGxldCB6PTAsQz1fLmxlbmd0aDt6PEM7eisrKXtjb25zdCBFPTMqX1t6XSxGPWQuZ2V0WChFKzApLEI9ZC5nZXRYKEUrMSksST1kLmdldFgoRSsyKTtmci5hLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxGKSxmci5iLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxCKSxmci5jLmZyb21CdWZmZXJBdHRyaWJ1dGUocCxJKSxyLnNwbGl0QnlUcmlhbmdsZShmcil9Y29uc3QgVD1yLnRyaWFuZ2xlcztmb3IobGV0IHo9MCxDPVQubGVuZ3RoO3o8Qzt6Kyspe2NvbnN0IEU9VFt6XSxGPXIuY29wbGFuYXJUcmlhbmdsZVVzZWQ/Z3AoRSxmKTpoaChFLGYpO3hlLmxlbmd0aD0wLEJuLmxlbmd0aD0wO2ZvcihsZXQgQj0wLEk9bi5sZW5ndGg7QjxJO0IrKyl7Y29uc3QgUj11aChuW0JdLEYscyk7UiE9PUJhJiYoQm4ucHVzaChSKSx4ZS5wdXNoKG9bQl0uZ2V0R3JvdXBBdHRyU2V0KG0pKSl9aWYoeGUubGVuZ3RoIT09MCl7RW4uZ2V0QmFyeWNvb3JkKEUuYSxkci5hKSxFbi5nZXRCYXJ5Y29vcmQoRS5iLGRyLmIpLEVuLmdldEJhcnljb29yZChFLmMsZHIuYyk7Zm9yKGxldCBCPTAsST14ZS5sZW5ndGg7QjxJO0IrKyl7Y29uc3QgUj14ZVtCXSxVPUJuW0JdPT09Smk7d3AoeCxkcixpLmdlb21ldHJ5LGkubWF0cml4V29ybGQsdXIsUixjIT09VSl9fX19cmV0dXJuIHkubGVuZ3RofWZ1bmN0aW9uIHBoKGksdCxlLG4scyxyLG89MCl7Y29uc3QgYT1pLm1hdHJpeFdvcmxkLmRldGVybWluYW50KCk8MDt1bi5jb3B5KHQubWF0cml4V29ybGQpLmludmVydCgpLm11bHRpcGx5KGkubWF0cml4V29ybGQpLHVyLmdldE5vcm1hbE1hdHJpeChpLm1hdHJpeFdvcmxkKS5tdWx0aXBseVNjYWxhcihhPy0xOjEpO2NvbnN0IGM9dC5nZW9tZXRyeS5ib3VuZHNUcmVlLGw9aS5nZW9tZXRyeS5ncm91cEluZGljZXMsaD1pLmdlb21ldHJ5LmluZGV4LHU9aS5nZW9tZXRyeS5hdHRyaWJ1dGVzLGY9dS5wb3NpdGlvbixkPVtdLHA9aS5nZW9tZXRyeS5oYWxmRWRnZXMseT1uZXcgU2V0LGc9d2EoaS5nZW9tZXRyeSk7Zm9yKGxldCB3PTAsYj1nO3c8Yjt3KyspdyBpbiBlLmludGVyc2VjdGlvblNldHx8eS5hZGQodyk7Zm9yKDt5LnNpemU+MDspe2NvbnN0IHc9U3AoeSk7eS5kZWxldGUodyksZC5wdXNoKHcpO2NvbnN0IGI9Myp3LHg9aC5nZXRYKGIrMCksbT1oLmdldFgoYisxKSxNPWguZ2V0WChiKzIpO2ZuLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShmLHgpLmFwcGx5TWF0cml4NCh1biksZm4uYi5mcm9tQnVmZmVyQXR0cmlidXRlKGYsbSkuYXBwbHlNYXRyaXg0KHVuKSxmbi5jLmZyb21CdWZmZXJBdHRyaWJ1dGUoZixNKS5hcHBseU1hdHJpeDQodW4pO2NvbnN0IFM9aGgoZm4sYyk7Qm4ubGVuZ3RoPTAseGUubGVuZ3RoPTA7Zm9yKGxldCBBPTAsdj1uLmxlbmd0aDtBPHY7QSsrKXtjb25zdCBfPXVoKG5bQV0sUyxzKTtfIT09QmEmJihCbi5wdXNoKF8pLHhlLnB1c2gocltBXSkpfWZvcig7ZC5sZW5ndGg+MDspe2NvbnN0IEE9ZC5wb3AoKTtmb3IobGV0IHY9MDt2PDM7disrKXtjb25zdCBfPXAuZ2V0U2libGluZ1RyaWFuZ2xlSW5kZXgoQSx2KTtfIT09LTEmJnkuaGFzKF8pJiYoZC5wdXNoKF8pLHkuZGVsZXRlKF8pKX1pZih4ZS5sZW5ndGghPT0wKXtjb25zdCB2PTMqQSxfPWguZ2V0WCh2KzApLFQ9aC5nZXRYKHYrMSksej1oLmdldFgodisyKSxDPW89PT0tMT8wOmxbQV0rbztpZihmbi5hLmZyb21CdWZmZXJBdHRyaWJ1dGUoZixfKSxmbi5iLmZyb21CdWZmZXJBdHRyaWJ1dGUoZixUKSxmbi5jLmZyb21CdWZmZXJBdHRyaWJ1dGUoZix6KSwhaG4oZm4pKWZvcihsZXQgRT0wLEY9eGUubGVuZ3RoO0U8RjtFKyspe2NvbnN0IEI9Qm5bRV0sST14ZVtFXS5nZXRHcm91cEF0dHJTZXQoQyksUj1CPT09Smk7YnAoXyxULHosdSxpLm1hdHJpeFdvcmxkLHVyLEksUiE9PWEpfX19fX1mdW5jdGlvbiBfcChpKXtmb3IobGV0IHQ9MDt0PGkubGVuZ3RoLTE7dCsrKXtjb25zdCBlPWlbdF0sbj1pW3QrMV07aWYoZS5tYXRlcmlhbEluZGV4PT09bi5tYXRlcmlhbEluZGV4KXtjb25zdCBzPWUuc3RhcnQscj1uLnN0YXJ0K24uY291bnQ7bi5zdGFydD1zLG4uY291bnQ9ci1zLGkuc3BsaWNlKHQsMSksdC0tfX19ZnVuY3Rpb24genAoaSx0LGUsbil7ZS5jbGVhcigpO2NvbnN0IHM9aS5hdHRyaWJ1dGVzO2ZvcihsZXQgcj0wLG89bi5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT1uW3JdLGM9c1thXTtlLmluaXRpYWxpemVBcnJheShhLGMuYXJyYXkuY29uc3RydWN0b3IsYy5pdGVtU2l6ZSxjLm5vcm1hbGl6ZWQpfWZvcihjb25zdCByIGluIGUuYXR0cmlidXRlcyluLmluY2x1ZGVzKHIpfHxlLmRlbGV0ZShyKTtmb3IoY29uc3QgciBpbiB0LmF0dHJpYnV0ZXMpbi5pbmNsdWRlcyhyKXx8KHQuZGVsZXRlQXR0cmlidXRlKHIpLHQuZGlzcG9zZSgpKX1mdW5jdGlvbiBUcChpLHQsZSl7bGV0IG49ITEscz0tMTtjb25zdCByPWkuYXR0cmlidXRlcyxvPXQuZ3JvdXBBdHRyaWJ1dGVzWzBdO2Zvcihjb25zdCBjIGluIG8pe2NvbnN0IGw9dC5nZXRUb3RhbExlbmd0aChjKSxoPXQuZ2V0VHlwZShjKSx1PXQuZ2V0SXRlbVNpemUoYyksZj10LmdldE5vcm1hbGl6ZWQoYyk7bGV0IGQ9cltjXTsoIWR8fGQuYXJyYXkubGVuZ3RoPGwpJiYoZD1uZXcgeHQobmV3IGgobCksdSxmKSxpLnNldEF0dHJpYnV0ZShjLGQpLG49ITApO2xldCBwPTA7Zm9yKGxldCB5PTAsZz1NYXRoLm1pbihlLmxlbmd0aCx0Lmdyb3VwQ291bnQpO3k8Zzt5Kyspe2NvbnN0IHc9ZVt5XS5pbmRleCx7YXJyYXk6Yix0eXBlOngsbGVuZ3RoOm19PXQuZ3JvdXBBdHRyaWJ1dGVzW3ddW2NdLE09bmV3IHgoYi5idWZmZXIsMCxtKTtkLmFycmF5LnNldChNLHApLHArPU0ubGVuZ3RofWQubmVlZHNVcGRhdGU9ITAscz1sL2QuaXRlbVNpemV9aWYoaS5pbmRleCl7Y29uc3QgYz1pLmluZGV4LmFycmF5O2lmKGMubGVuZ3RoPHMpaS5pbmRleD1udWxsLG49ITA7ZWxzZSBmb3IobGV0IGw9MCxoPWMubGVuZ3RoO2w8aDtsKyspY1tsXT1sfWxldCBhPTA7aS5jbGVhckdyb3VwcygpO2ZvcihsZXQgYz0wLGw9TWF0aC5taW4oZS5sZW5ndGgsdC5ncm91cENvdW50KTtjPGw7YysrKXtjb25zdHtpbmRleDpoLG1hdGVyaWFsSW5kZXg6dX09ZVtjXSxmPXQuZ2V0Q291bnQoaCk7ZiE9PTAmJihpLmFkZEdyb3VwKGEsZix1KSxhKz1mKX1pLnNldERyYXdSYW5nZSgwLHMpLGkuYm91bmRzVHJlZT1udWxsLG4mJmkuZGlzcG9zZSgpfWZ1bmN0aW9uIHloKGksdCl7bGV0IGU9dDtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KXx8KGU9W10saS5mb3JFYWNoKG49PntlW24ubWF0ZXJpYWxJbmRleF09dH0pKSxlfWNsYXNzIFBwe2NvbnN0cnVjdG9yKCl7dGhpcy50cmlhbmdsZVNwbGl0dGVyPW5ldyBjcCx0aGlzLmF0dHJpYnV0ZURhdGE9W10sdGhpcy5hdHRyaWJ1dGVzPVsicG9zaXRpb24iLCJ1diIsIm5vcm1hbCJdLHRoaXMudXNlR3JvdXBzPSEwLHRoaXMuY29uc29saWRhdGVHcm91cHM9ITAsdGhpcy5kZWJ1Zz1uZXcgQXB9Z2V0R3JvdXBSYW5nZXModCl7cmV0dXJuIXRoaXMudXNlR3JvdXBzfHx0Lmdyb3Vwcy5sZW5ndGg9PT0wP1t7c3RhcnQ6MCxjb3VudDoxLzAsbWF0ZXJpYWxJbmRleDowfV06dC5ncm91cHMubWFwKGU9PlV0KHt9LGUpKX1ldmFsdWF0ZSh0LGUsbixzPW5ldyBzcil7bGV0IHI9ITA7aWYoQXJyYXkuaXNBcnJheShuKXx8KG49W25dKSxBcnJheS5pc0FycmF5KHMpfHwocz1bc10scj0hMSkscy5sZW5ndGghPT1uLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkV2YWx1YXRvcjogb3BlcmF0aW9ucyBhbmQgdGFyZ2V0IGFycmF5IHBhc3NlZCBhcyBkaWZmZXJlbnQgc2l6ZXMuIik7dC5wcmVwYXJlR2VvbWV0cnkoKSxlLnByZXBhcmVHZW9tZXRyeSgpO2NvbnN0e3RyaWFuZ2xlU3BsaXR0ZXI6byxhdHRyaWJ1dGVEYXRhOmEsYXR0cmlidXRlczpjLHVzZUdyb3VwczpsLGNvbnNvbGlkYXRlR3JvdXBzOmgsZGVidWc6dX09dGhpcztmb3IoO2EubGVuZ3RoPHMubGVuZ3RoOylhLnB1c2gobmV3IGhwKTtzLmZvckVhY2goKHcsYik9Pnt6cCh0Lmdlb21ldHJ5LHcuZ2VvbWV0cnksYVtiXSxjKX0pLHUuaW5pdCgpLHZwKHQsZSxuLG8sYSx7dXNlR3JvdXBzOmx9KSx1LmNvbXBsZXRlKCk7Y29uc3QgZj10aGlzLmdldEdyb3VwUmFuZ2VzKHQuZ2VvbWV0cnkpLGQ9eWgoZix0Lm1hdGVyaWFsKSxwPXRoaXMuZ2V0R3JvdXBSYW5nZXMoZS5nZW9tZXRyeSkseT15aChwLGUubWF0ZXJpYWwpO3AuZm9yRWFjaCh3PT53Lm1hdGVyaWFsSW5kZXgrPWQubGVuZ3RoKTtsZXQgZz1bLi4uZiwuLi5wXS5tYXAoKHcsYik9PktlKFV0KHt9LHcpLHtpbmRleDpifSkpO2lmKGwpe2NvbnN0IHc9Wy4uLmQsLi4ueV07aCYmKGc9Zy5tYXAoeD0+e2NvbnN0IG09d1t4Lm1hdGVyaWFsSW5kZXhdO3JldHVybiB4Lm1hdGVyaWFsSW5kZXg9dy5pbmRleE9mKG0pLHh9KS5zb3J0KCh4LG0pPT54Lm1hdGVyaWFsSW5kZXgtbS5tYXRlcmlhbEluZGV4KSk7Y29uc3QgYj1bXTtmb3IobGV0IHg9MCxtPXcubGVuZ3RoO3g8bTt4Kyspe2xldCBNPSExO2ZvcihsZXQgUz0wLEE9Zy5sZW5ndGg7UzxBO1MrKyl7Y29uc3Qgdj1nW1NdO3YubWF0ZXJpYWxJbmRleD09PXgmJihNPSEwLHYubWF0ZXJpYWxJbmRleD1iLmxlbmd0aCl9TSYmYi5wdXNoKHdbeF0pfXMuZm9yRWFjaCh4PT57eC5tYXRlcmlhbD1ifSl9ZWxzZSBnPVt7c3RhcnQ6MCxjb3VudDoxLzAsaW5kZXg6MCxtYXRlcmlhbEluZGV4OjB9XSxzLmZvckVhY2godz0+e3cubWF0ZXJpYWw9ZFswXX0pO3JldHVybiBzLmZvckVhY2goKHcsYik9Pntjb25zdCB4PXcuZ2VvbWV0cnk7VHAoeCxhW2JdLGcpLGgmJl9wKHguZ3JvdXBzKX0pLHI/czpzWzBdfWV2YWx1YXRlSGllcmFyY2h5KHQsZT1uZXcgc3Ipe3QudXBkYXRlTWF0cml4V29ybGQoITApO2NvbnN0IG49KHIsbyk9Pntjb25zdCBhPXIuY2hpbGRyZW47Zm9yKGxldCBjPTAsbD1hLmxlbmd0aDtjPGw7YysrKXtjb25zdCBoPWFbY107aC5pc09wZXJhdGlvbkdyb3VwP24oaCxvKTpvKGgpfX0scz1yPT57Y29uc3Qgbz1yLmNoaWxkcmVuO2xldCBhPSExO2ZvcihsZXQgbD0wLGg9by5sZW5ndGg7bDxoO2wrKyl7Y29uc3QgdT1vW2xdO2E9cyh1KXx8YX1jb25zdCBjPXIuaXNEaXJ0eSgpO2lmKGMmJnIubWFya1VwZGF0ZWQoKSxhJiYhci5pc09wZXJhdGlvbkdyb3VwKXtsZXQgbDtyZXR1cm4gbihyLGg9PntsP2w9dGhpcy5ldmFsdWF0ZShsLGgsaC5vcGVyYXRpb24pOmw9dGhpcy5ldmFsdWF0ZShyLGgsaC5vcGVyYXRpb24pfSksci5fY2FjaGVkR2VvbWV0cnk9bC5nZW9tZXRyeSxyLl9jYWNoZWRNYXRlcmlhbHM9bC5tYXRlcmlhbCwhMH1lbHNlIHJldHVybiBhfHxjfTtyZXR1cm4gcyh0KSxlLmdlb21ldHJ5PXQuX2NhY2hlZEdlb21ldHJ5LGUubWF0ZXJpYWw9dC5fY2FjaGVkTWF0ZXJpYWxzLGV9cmVzZXQoKXt0aGlzLnRyaWFuZ2xlU3BsaXR0ZXIucmVzZXQoKX19ZnVuY3Rpb24gbWgoaSl7bGV0IHQsZSxuLHM9LTEscj0wO2ZvcihsZXQgbD0wO2w8aS5sZW5ndGg7KytsKXtjb25zdCBoPWlbbF07aWYodD09PXZvaWQgMCYmKHQ9aC5hcnJheS5jb25zdHJ1Y3RvciksdCE9PWguYXJyYXkuY29uc3RydWN0b3IpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUF0dHJpYnV0ZXMoKSBmYWlsZWQuIEJ1ZmZlckF0dHJpYnV0ZS5hcnJheSBtdXN0IGJlIG9mIGNvbnNpc3RlbnQgYXJyYXkgdHlwZXMgYWNyb3NzIG1hdGNoaW5nIGF0dHJpYnV0ZXMuIiksbnVsbDtpZihlPT09dm9pZCAwJiYoZT1oLml0ZW1TaXplKSxlIT09aC5pdGVtU2l6ZSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlQXR0cmlidXRlcygpIGZhaWxlZC4gQnVmZmVyQXR0cmlidXRlLml0ZW1TaXplIG11c3QgYmUgY29uc2lzdGVudCBhY3Jvc3MgbWF0Y2hpbmcgYXR0cmlidXRlcy4iKSxudWxsO2lmKG49PT12b2lkIDAmJihuPWgubm9ybWFsaXplZCksbiE9PWgubm9ybWFsaXplZClyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlQXR0cmlidXRlcygpIGZhaWxlZC4gQnVmZmVyQXR0cmlidXRlLm5vcm1hbGl6ZWQgbXVzdCBiZSBjb25zaXN0ZW50IGFjcm9zcyBtYXRjaGluZyBhdHRyaWJ1dGVzLiIpLG51bGw7aWYocz09PS0xJiYocz1oLmdwdVR5cGUpLHMhPT1oLmdwdVR5cGUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUF0dHJpYnV0ZXMoKSBmYWlsZWQuIEJ1ZmZlckF0dHJpYnV0ZS5ncHVUeXBlIG11c3QgYmUgY29uc2lzdGVudCBhY3Jvc3MgbWF0Y2hpbmcgYXR0cmlidXRlcy4iKSxudWxsO3IrPWguY291bnQqZX1jb25zdCBvPW5ldyB0KHIpLGE9bmV3IHh0KG8sZSxuKTtsZXQgYz0wO2ZvcihsZXQgbD0wO2w8aS5sZW5ndGg7KytsKXtjb25zdCBoPWlbbF07aWYoaC5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKXtjb25zdCB1PWMvZTtmb3IobGV0IGY9MCxkPWguY291bnQ7ZjxkO2YrKylmb3IobGV0IHA9MDtwPGU7cCsrKXtjb25zdCB5PWguZ2V0Q29tcG9uZW50KGYscCk7YS5zZXRDb21wb25lbnQoZit1LHAseSl9fWVsc2Ugby5zZXQoaC5hcnJheSxjKTtjKz1oLmNvdW50KmV9cmV0dXJuIHMhPT12b2lkIDAmJihhLmdwdVR5cGU9cyksYX1mdW5jdGlvbiBDcChpKXtpZihpLmdyb3Vwcy5sZW5ndGg9PT0wKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHMubWVyZ2VHcm91cHMoKTogTm8gZ3JvdXBzIGFyZSBkZWZpbmVkLiBOb3RoaW5nIHRvIG1lcmdlLiIpLGk7bGV0IHQ9aS5ncm91cHM7aWYodD10LnNvcnQoKG8sYSk9Pm8ubWF0ZXJpYWxJbmRleCE9PWEubWF0ZXJpYWxJbmRleD9vLm1hdGVyaWFsSW5kZXgtYS5tYXRlcmlhbEluZGV4Om8uc3RhcnQtYS5zdGFydCksaS5nZXRJbmRleCgpPT09bnVsbCl7Y29uc3Qgbz1pLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKSxhPVtdO2ZvcihsZXQgYz0wO2M8by5jb3VudDtjKz0zKWEucHVzaChjLGMrMSxjKzIpO2kuc2V0SW5kZXgoYSl9Y29uc3QgZT1pLmdldEluZGV4KCksbj1bXTtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7Y29uc3QgYT10W29dLGM9YS5zdGFydCxsPWMrYS5jb3VudDtmb3IobGV0IGg9YztoPGw7aCsrKW4ucHVzaChlLmdldFgoaCkpfWkuZGlzcG9zZSgpLGkuc2V0SW5kZXgobik7bGV0IHM9MDtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7Y29uc3QgYT10W29dO2Euc3RhcnQ9cyxzKz1hLmNvdW50fWxldCByPXRbMF07aS5ncm91cHM9W3JdO2ZvcihsZXQgbz0xO288dC5sZW5ndGg7bysrKXtjb25zdCBhPXRbb107ci5tYXRlcmlhbEluZGV4PT09YS5tYXRlcmlhbEluZGV4P3IuY291bnQrPWEuY291bnQ6KHI9YSxpLmdyb3Vwcy5wdXNoKHIpKX1yZXR1cm4gaX1mdW5jdGlvbiBnaChpLHQ9MCl7Y29uc3QgZT1pWzBdLmluZGV4IT09bnVsbCxuPW5ldyBTZXQoT2JqZWN0LmtleXMoaVswXS5hdHRyaWJ1dGVzKSkscz1uZXcgU2V0KE9iamVjdC5rZXlzKGlbMF0ubW9ycGhBdHRyaWJ1dGVzKSkscj17fSxvPXt9LGE9aVswXS5tb3JwaFRhcmdldHNSZWxhdGl2ZSxjPW5ldyBBZTtsZXQgbD0wO2ZvcihsZXQgaD0wO2g8aS5sZW5ndGg7KytoKXtjb25zdCB1PWlbaF07bGV0IGY9MDtpZihlIT09KHUuaW5kZXghPT1udWxsKSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIraCsiLiBBbGwgZ2VvbWV0cmllcyBtdXN0IGhhdmUgY29tcGF0aWJsZSBhdHRyaWJ1dGVzOyBtYWtlIHN1cmUgaW5kZXggYXR0cmlidXRlIGV4aXN0cyBhbW9uZyBhbGwgZ2VvbWV0cmllcywgb3IgaW4gbm9uZSBvZiB0aGVtLiIpLG51bGw7Zm9yKGNvbnN0IGQgaW4gdS5hdHRyaWJ1dGVzKXtpZighbi5oYXMoZCkpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2l0aCBnZW9tZXRyeSBhdCBpbmRleCAiK2grJy4gQWxsIGdlb21ldHJpZXMgbXVzdCBoYXZlIGNvbXBhdGlibGUgYXR0cmlidXRlczsgbWFrZSBzdXJlICInK2QrJyIgYXR0cmlidXRlIGV4aXN0cyBhbW9uZyBhbGwgZ2VvbWV0cmllcywgb3IgaW4gbm9uZSBvZiB0aGVtLicpLG51bGw7cltkXT09PXZvaWQgMCYmKHJbZF09W10pLHJbZF0ucHVzaCh1LmF0dHJpYnV0ZXNbZF0pLGYrK31pZihmIT09bi5zaXplKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdpdGggZ2VvbWV0cnkgYXQgaW5kZXggIitoKyIuIE1ha2Ugc3VyZSBhbGwgZ2VvbWV0cmllcyBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBhdHRyaWJ1dGVzLiIpLG51bGw7aWYoYSE9PXUubW9ycGhUYXJnZXRzUmVsYXRpdmUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2l0aCBnZW9tZXRyeSBhdCBpbmRleCAiK2grIi4gLm1vcnBoVGFyZ2V0c1JlbGF0aXZlIG11c3QgYmUgY29uc2lzdGVudCB0aHJvdWdob3V0IGFsbCBnZW9tZXRyaWVzLiIpLG51bGw7Zm9yKGNvbnN0IGQgaW4gdS5tb3JwaEF0dHJpYnV0ZXMpe2lmKCFzLmhhcyhkKSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIraCsiLiAgLm1vcnBoQXR0cmlidXRlcyBtdXN0IGJlIGNvbnNpc3RlbnQgdGhyb3VnaG91dCBhbGwgZ2VvbWV0cmllcy4iKSxudWxsO29bZF09PT12b2lkIDAmJihvW2RdPVtdKSxvW2RdLnB1c2godS5tb3JwaEF0dHJpYnV0ZXNbZF0pfWlmKHQpe2xldCBkO2lmKGUpZD11LmluZGV4LmNvdW50O2Vsc2UgaWYodS5hdHRyaWJ1dGVzLnBvc2l0aW9uIT09dm9pZCAwKWQ9dS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50O2Vsc2UgcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2l0aCBnZW9tZXRyeSBhdCBpbmRleCAiK2grIi4gVGhlIGdlb21ldHJ5IG11c3QgaGF2ZSBlaXRoZXIgYW4gaW5kZXggb3IgYSBwb3NpdGlvbiBhdHRyaWJ1dGUiKSxudWxsO2lmKHQ9PT0xKWMuYWRkR3JvdXAobCxkLGgpO2Vsc2UgaWYodD09PTImJnUuZ3JvdXBzLmxlbmd0aD4wKWZvcihsZXQgcCBvZiB1Lmdyb3Vwcyl7bGV0IHk9cC5tYXRlcmlhbEluZGV4O2MuYWRkR3JvdXAobCtwLnN0YXJ0LE1hdGgubWluKHAuY291bnQsZCkseSl9bCs9ZH19aWYoZSl7bGV0IGg9MDtjb25zdCB1PVtdO2ZvcihsZXQgZj0wO2Y8aS5sZW5ndGg7KytmKXtjb25zdCBkPWlbZl0uaW5kZXg7Zm9yKGxldCBwPTA7cDxkLmNvdW50OysrcCl1LnB1c2goZC5nZXRYKHApK2gpO2grPWlbZl0uYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudH1jLnNldEluZGV4KHUpfWZvcihjb25zdCBoIGluIHIpe2NvbnN0IHU9bWgocltoXSk7aWYoIXUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2hpbGUgdHJ5aW5nIHRvIG1lcmdlIHRoZSAiK2grIiBhdHRyaWJ1dGUuIiksbnVsbDtjLnNldEF0dHJpYnV0ZShoLHUpfWZvcihjb25zdCBoIGluIG8pe2NvbnN0IHU9b1toXVswXS5sZW5ndGg7aWYodT09PTApYnJlYWs7Yy5tb3JwaEF0dHJpYnV0ZXM9Yy5tb3JwaEF0dHJpYnV0ZXN8fHt9LGMubW9ycGhBdHRyaWJ1dGVzW2hdPVtdO2ZvcihsZXQgZj0wO2Y8dTsrK2Ype2NvbnN0IGQ9W107Zm9yKGxldCB5PTA7eTxvW2hdLmxlbmd0aDsrK3kpZC5wdXNoKG9baF1beV1bZl0pO2NvbnN0IHA9bWgoZCk7aWYoIXApcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2hpbGUgdHJ5aW5nIHRvIG1lcmdlIHRoZSAiK2grIiBtb3JwaEF0dHJpYnV0ZS4iKSxudWxsO2MubW9ycGhBdHRyaWJ1dGVzW2hdLnB1c2gocCl9fXJldHVybiB0PT09Mj9DcChjKTpjfWNsYXNzIEVwIGV4dGVuZHMgaWl7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0LGUpO2NvbnN0IG49bmV3IHNyKG5ldyBpaSh0LEtlKFV0KHt9LGUpLHtoYXNUb3A6ITAsaGFzU2lkZTohMCxoYXNCb3R0b206ITF9KSkpO24udXBkYXRlTWF0cml4V29ybGQoKTtjb25zdCBzPW5ldyBndCgpLnNldEZyb21PYmplY3Qobikscj1uZXcgUDtzLmdldFNpemUocik7Y29uc3Qgbz1uZXcgUChzLm1pbi54K3IueC8yLHMubWluLnkrci55LzIsMCk7bGV0IGE9ZS50b3BTZWdtZW50cyxjPWUuYm94MztpZihjKXtjPWMudW5pb24ocyk7Y29uc3Qgdz1uZXcgUDtjLmdldFNpemUodyk7Y29uc3QgYj1NYXRoLm1heChyLngvdy54LHIueS93LnkpO2E9TWF0aC5jZWlsKGUudG9wU2VnbWVudHMqYil9aWYoYTw0KXJldHVybiB0aGlzO2NvbnN0IGw9bmV3IFdvKHIueCxyLnksYSxhKSxoPW5ldyBzcihsKTtoLnBvc2l0aW9uLnNldChvLngsby55LG8ueiksaC51cGRhdGVNYXRyaXhXb3JsZCgpO2NvbnN0IGY9bmV3IFBwKCkuZXZhbHVhdGUoaCxuLGVoKSxkPWYuZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLHA9bmV3IFJlKGQuY291bnQqMiwyKTtmb3IobGV0IHc9MDt3PGQuY291bnQ7dysrKXtjb25zdCBiPWQuZ2V0Wih3KTtkLnNldFoodyxlLmRlcHRoK2IpfWlmKGMpe2NvbnN0IHc9Yy5taW4sYj1jLm1heCx4PW5ldyBQKCkuc3ViVmVjdG9ycyhiLHcpO2ZvcihsZXQgbT0wO208ZC5jb3VudDttKyspe2NvbnN0IE09ZC5nZXRYKG0pLFM9ZC5nZXRZKG0pLEE9KE0tdy54KS94Lngsdj0oUy13LnkpL3gueTtwLnNldFhZKG0sQSx2KX1mLmdlb21ldHJ5LnNldEF0dHJpYnV0ZSgidXYiLHApfWQubmVlZHNVcGRhdGU9ITA7Y29uc3QgeT1uZXcgaWkodCxLZShVdCh7fSxlKSx7aGFzVG9wOiExfSkpLGc9Z2goW2YuZ2VvbWV0cnkseV0sMik7dGhpcy5jb3B5KGcudG9Ob25JbmRleGVkKCkpfX12YXIgQnA9aT0+e2NvbnN0e3NwbGl0OnQsZGVwdGg6ZSxwb2ludHM6bixib3gzOnMsaGFzVG9wOnIsaGFzQm90dG9tOm8saGFzU2lkZTphLHNpZGVSZXBlYXQ6Yyx0b3BTZWdtZW50czpsfT1pLGg9bD9FcDppaSx1PW5ldyBoKG5ldyBmbChuKSx7ZGVwdGg6ZSxiZXZlbEVuYWJsZWQ6ITEsYm94MzpzLFVWR2VuZXJhdG9yOk5kKHtzcGxpdDp0LGJveDM6cyxzaWRlUmVwZWF0OmN9KSxoYXNUb3A6cixoYXNCb3R0b206byxoYXNTaWRlOmEsdG9wU2VnbWVudHM6bH0pO3JldHVybiBSZCgpLHV9O2Z1bmN0aW9uIHByKGksdCl7cmV0dXJuIGk9PW51bGx8fHQ9PW51bGw/TmFOOmk8dD8tMTppPnQ/MTppPj10PzA6TmFOfWZ1bmN0aW9uIEZwKGksdCl7cmV0dXJuIGk9PW51bGx8fHQ9PW51bGw/TmFOOnQ8aT8tMTp0Pmk/MTp0Pj1pPzA6TmFOfWZ1bmN0aW9uIHhoKGkpe2xldCB0LGUsbjtpLmxlbmd0aCE9PTI/KHQ9cHIsZT0oYSxjKT0+cHIoaShhKSxjKSxuPShhLGMpPT5pKGEpLWMpOih0PWk9PT1wcnx8aT09PUZwP2k6SXAsZT1pLG49aSk7ZnVuY3Rpb24gcyhhLGMsbD0wLGg9YS5sZW5ndGgpe2lmKGw8aCl7aWYodChjLGMpIT09MClyZXR1cm4gaDtkb3tjb25zdCB1PWwraD4+PjE7ZShhW3VdLGMpPDA/bD11KzE6aD11fXdoaWxlKGw8aCl9cmV0dXJuIGx9ZnVuY3Rpb24gcihhLGMsbD0wLGg9YS5sZW5ndGgpe2lmKGw8aCl7aWYodChjLGMpIT09MClyZXR1cm4gaDtkb3tjb25zdCB1PWwraD4+PjE7ZShhW3VdLGMpPD0wP2w9dSsxOmg9dX13aGlsZShsPGgpfXJldHVybiBsfWZ1bmN0aW9uIG8oYSxjLGw9MCxoPWEubGVuZ3RoKXtjb25zdCB1PXMoYSxjLGwsaC0xKTtyZXR1cm4gdT5sJiZuKGFbdS0xXSxjKT4tbihhW3VdLGMpP3UtMTp1fXJldHVybntsZWZ0OnMsY2VudGVyOm8scmlnaHQ6cn19ZnVuY3Rpb24gSXAoKXtyZXR1cm4gMH1mdW5jdGlvbiBrcChpKXtyZXR1cm4gaT09PW51bGw/TmFOOitpfWNvbnN0IE5wPXhoKHByKS5yaWdodDt4aChrcCkuY2VudGVyO2Z1bmN0aW9uIHlyKGksdCl7bGV0IGUsbjtpZih0PT09dm9pZCAwKWZvcihjb25zdCBzIG9mIGkpcyE9bnVsbCYmKGU9PT12b2lkIDA/cz49cyYmKGU9bj1zKTooZT5zJiYoZT1zKSxuPHMmJihuPXMpKSk7ZWxzZXtsZXQgcz0tMTtmb3IobGV0IHIgb2YgaSkocj10KHIsKytzLGkpKSE9bnVsbCYmKGU9PT12b2lkIDA/cj49ciYmKGU9bj1yKTooZT5yJiYoZT1yKSxuPHImJihuPXIpKSl9cmV0dXJuW2Usbl19Y2xhc3MgcWV7Y29uc3RydWN0b3IoKXt0aGlzLl9wYXJ0aWFscz1uZXcgRmxvYXQ2NEFycmF5KDMyKSx0aGlzLl9uPTB9YWRkKHQpe2NvbnN0IGU9dGhpcy5fcGFydGlhbHM7bGV0IG49MDtmb3IobGV0IHM9MDtzPHRoaXMuX24mJnM8MzI7cysrKXtjb25zdCByPWVbc10sbz10K3IsYT1NYXRoLmFicyh0KTxNYXRoLmFicyhyKT90LShvLXIpOnItKG8tdCk7YSYmKGVbbisrXT1hKSx0PW99cmV0dXJuIGVbbl09dCx0aGlzLl9uPW4rMSx0aGlzfXZhbHVlT2YoKXtjb25zdCB0PXRoaXMuX3BhcnRpYWxzO2xldCBlPXRoaXMuX24sbixzLHIsbz0wO2lmKGU+MCl7Zm9yKG89dFstLWVdO2U+MCYmKG49byxzPXRbLS1lXSxvPW4rcyxyPXMtKG8tbiksIXIpOyk7ZT4wJiYocjwwJiZ0W2UtMV08MHx8cj4wJiZ0W2UtMV0+MCkmJihzPXIqMixuPW8rcyxzPT1uLW8mJihvPW4pKX1yZXR1cm4gb319Y29uc3QgUnA9TWF0aC5zcXJ0KDUwKSxMcD1NYXRoLnNxcnQoMTApLE9wPU1hdGguc3FydCgyKTtmdW5jdGlvbiBtcihpLHQsZSl7Y29uc3Qgbj0odC1pKS9NYXRoLm1heCgwLGUpLHM9TWF0aC5mbG9vcihNYXRoLmxvZzEwKG4pKSxyPW4vTWF0aC5wb3coMTAscyksbz1yPj1ScD8xMDpyPj1McD81OnI+PU9wPzI6MTtsZXQgYSxjLGw7cmV0dXJuIHM8MD8obD1NYXRoLnBvdygxMCwtcykvbyxhPU1hdGgucm91bmQoaSpsKSxjPU1hdGgucm91bmQodCpsKSxhL2w8aSYmKythLGMvbD50JiYtLWMsbD0tbCk6KGw9TWF0aC5wb3coMTAscykqbyxhPU1hdGgucm91bmQoaS9sKSxjPU1hdGgucm91bmQodC9sKSxhKmw8aSYmKythLGMqbD50JiYtLWMpLGM8YSYmLjU8PWUmJmU8Mj9tcihpLHQsZSoyKTpbYSxjLGxdfWZ1bmN0aW9uIERwKGksdCxlKXtpZih0PSt0LGk9K2ksZT0rZSwhKGU+MCkpcmV0dXJuW107aWYoaT09PXQpcmV0dXJuW2ldO2NvbnN0IG49dDxpLFtzLHIsb109bj9tcih0LGksZSk6bXIoaSx0LGUpO2lmKCEocj49cykpcmV0dXJuW107Y29uc3QgYT1yLXMrMSxjPW5ldyBBcnJheShhKTtpZihuKWlmKG88MClmb3IobGV0IGw9MDtsPGE7KytsKWNbbF09KHItbCkvLW87ZWxzZSBmb3IobGV0IGw9MDtsPGE7KytsKWNbbF09KHItbCkqbztlbHNlIGlmKG88MClmb3IobGV0IGw9MDtsPGE7KytsKWNbbF09KHMrbCkvLW87ZWxzZSBmb3IobGV0IGw9MDtsPGE7KytsKWNbbF09KHMrbCkqbztyZXR1cm4gY31mdW5jdGlvbiBrYShpLHQsZSl7cmV0dXJuIHQ9K3QsaT0raSxlPStlLG1yKGksdCxlKVsyXX1mdW5jdGlvbiAkcChpLHQsZSl7dD0rdCxpPStpLGU9K2U7Y29uc3Qgbj10PGkscz1uP2thKHQsaSxlKTprYShpLHQsZSk7cmV0dXJuKG4/LTE6MSkqKHM8MD8xLy1zOnMpfWZ1bmN0aW9uIFZwKGksdCl7bGV0IGU9MCxuPTA7aWYodD09PXZvaWQgMClmb3IobGV0IHMgb2YgaSlzIT1udWxsJiYocz0rcyk+PXMmJigrK2Usbis9cyk7ZWxzZXtsZXQgcz0tMTtmb3IobGV0IHIgb2YgaSkocj10KHIsKytzLGkpKSE9bnVsbCYmKHI9K3IpPj1yJiYoKytlLG4rPXIpfWlmKGUpcmV0dXJuIG4vZX1mdW5jdGlvbipVcChpKXtmb3IoY29uc3QgdCBvZiBpKXlpZWxkKndmKHQpfWZ1bmN0aW9uIFlpKGkpe3JldHVybiBBcnJheS5mcm9tKFVwKGkpKX12YXIgUT0xZS02LGdyPTFlLTEyLEg9TWF0aC5QSSxxdD1ILzIseHI9SC80LFh0PUgqMix1dD0xODAvSCxYPUgvMTgwLHR0PU1hdGguYWJzLE5hPU1hdGguYXRhbix1ZT1NYXRoLmF0YW4yLEc9TWF0aC5jb3MscXA9TWF0aC5leHAsUmE9TWF0aC5oeXBvdCxYcD1NYXRoLmxvZyxxPU1hdGguc2luLFpwPU1hdGguc2lnbnx8ZnVuY3Rpb24oaSl7cmV0dXJuIGk+MD8xOmk8MD8tMTowfSxYZT1NYXRoLnNxcnQsR3A9TWF0aC50YW47ZnVuY3Rpb24gV3AoaSl7cmV0dXJuIGk+MT8wOmk8LTE/SDpNYXRoLmFjb3MoaSl9ZnVuY3Rpb24gWmUoaSl7cmV0dXJuIGk+MT9xdDppPC0xPy1xdDpNYXRoLmFzaW4oaSl9ZnVuY3Rpb24gd2goaSl7cmV0dXJuKGk9cShpLzIpKSppfWZ1bmN0aW9uIEV0KCl7fWZ1bmN0aW9uIHdyKGksdCl7aSYmTWguaGFzT3duUHJvcGVydHkoaS50eXBlKSYmTWhbaS50eXBlXShpLHQpfXZhciBiaD17RmVhdHVyZTpmdW5jdGlvbihpLHQpe3dyKGkuZ2VvbWV0cnksdCl9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuZmVhdHVyZXMsbj0tMSxzPWUubGVuZ3RoOysrbjxzOyl3cihlW25dLmdlb21ldHJ5LHQpfX0sTWg9e1NwaGVyZTpmdW5jdGlvbihpLHQpe3Quc3BoZXJlKCl9LFBvaW50OmZ1bmN0aW9uKGksdCl7aT1pLmNvb3JkaW5hdGVzLHQucG9pbnQoaVswXSxpWzFdLGlbMl0pfSxNdWx0aVBvaW50OmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuY29vcmRpbmF0ZXMsbj0tMSxzPWUubGVuZ3RoOysrbjxzOylpPWVbbl0sdC5wb2ludChpWzBdLGlbMV0saVsyXSl9LExpbmVTdHJpbmc6ZnVuY3Rpb24oaSx0KXtMYShpLmNvb3JkaW5hdGVzLHQsMCl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmNvb3JkaW5hdGVzLG49LTEscz1lLmxlbmd0aDsrK248czspTGEoZVtuXSx0LDApfSxQb2x5Z29uOmZ1bmN0aW9uKGksdCl7QWgoaS5jb29yZGluYXRlcyx0KX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuY29vcmRpbmF0ZXMsbj0tMSxzPWUubGVuZ3RoOysrbjxzOylBaChlW25dLHQpfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5nZW9tZXRyaWVzLG49LTEscz1lLmxlbmd0aDsrK248czspd3IoZVtuXSx0KX19O2Z1bmN0aW9uIExhKGksdCxlKXt2YXIgbj0tMSxzPWkubGVuZ3RoLWUscjtmb3IodC5saW5lU3RhcnQoKTsrK248czspcj1pW25dLHQucG9pbnQoclswXSxyWzFdLHJbMl0pO3QubGluZUVuZCgpfWZ1bmN0aW9uIEFoKGksdCl7dmFyIGU9LTEsbj1pLmxlbmd0aDtmb3IodC5wb2x5Z29uU3RhcnQoKTsrK2U8bjspTGEoaVtlXSx0LDEpO3QucG9seWdvbkVuZCgpfWZ1bmN0aW9uIGJyKGksdCl7aSYmYmguaGFzT3duUHJvcGVydHkoaS50eXBlKT9iaFtpLnR5cGVdKGksdCk6d3IoaSx0KX12YXIgTXI9bmV3IHFlLFNoPW5ldyBxZSx2aCxfaCxPYSxEYSwkYSxHZT17cG9pbnQ6RXQsbGluZVN0YXJ0OkV0LGxpbmVFbmQ6RXQscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7TXI9bmV3IHFlLEdlLmxpbmVTdGFydD1IcCxHZS5saW5lRW5kPUpwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIGk9K01yO1NoLmFkZChpPDA/WHQraTppKSx0aGlzLmxpbmVTdGFydD10aGlzLmxpbmVFbmQ9dGhpcy5wb2ludD1FdH0sc3BoZXJlOmZ1bmN0aW9uKCl7U2guYWRkKFh0KX19O2Z1bmN0aW9uIEhwKCl7R2UucG9pbnQ9WXB9ZnVuY3Rpb24gSnAoKXt6aCh2aCxfaCl9ZnVuY3Rpb24gWXAoaSx0KXtHZS5wb2ludD16aCx2aD1pLF9oPXQsaSo9WCx0Kj1YLE9hPWksRGE9Ryh0PXQvMit4ciksJGE9cSh0KX1mdW5jdGlvbiB6aChpLHQpe2kqPVgsdCo9WCx0PXQvMit4cjt2YXIgZT1pLU9hLG49ZT49MD8xOi0xLHM9biplLHI9Ryh0KSxvPXEodCksYT0kYSpvLGM9RGEqcithKkcocyksbD1hKm4qcShzKTtNci5hZGQodWUobCxjKSksT2E9aSxEYT1yLCRhPW99ZnVuY3Rpb24gQXIoaSl7cmV0dXJuW3VlKGlbMV0saVswXSksWmUoaVsyXSldfWZ1bmN0aW9uIEZuKGkpe3ZhciB0PWlbMF0sZT1pWzFdLG49RyhlKTtyZXR1cm5bbipHKHQpLG4qcSh0KSxxKGUpXX1mdW5jdGlvbiBTcihpLHQpe3JldHVybiBpWzBdKnRbMF0raVsxXSp0WzFdK2lbMl0qdFsyXX1mdW5jdGlvbiBmaShpLHQpe3JldHVybltpWzFdKnRbMl0taVsyXSp0WzFdLGlbMl0qdFswXS1pWzBdKnRbMl0saVswXSp0WzFdLWlbMV0qdFswXV19ZnVuY3Rpb24gVmEoaSx0KXtpWzBdKz10WzBdLGlbMV0rPXRbMV0saVsyXSs9dFsyXX1mdW5jdGlvbiB2cihpLHQpe3JldHVybltpWzBdKnQsaVsxXSp0LGlbMl0qdF19ZnVuY3Rpb24gX3IoaSl7dmFyIHQ9WGUoaVswXSppWzBdK2lbMV0qaVsxXStpWzJdKmlbMl0pO2lbMF0vPXQsaVsxXS89dCxpWzJdLz10fXZhciBvdCxadCxmdCxqdCxJbixUaCxQaCxkaSxqaSxkbixXZSxIZT17cG9pbnQ6VWEsbGluZVN0YXJ0OkVoLGxpbmVFbmQ6QmgscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7SGUucG9pbnQ9RmgsSGUubGluZVN0YXJ0PWpwLEhlLmxpbmVFbmQ9UXAsamk9bmV3IHFlLEdlLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7R2UucG9seWdvbkVuZCgpLEhlLnBvaW50PVVhLEhlLmxpbmVTdGFydD1FaCxIZS5saW5lRW5kPUJoLE1yPDA/KG90PS0oZnQ9MTgwKSxadD0tKGp0PTkwKSk6amk+UT9qdD05MDpqaTwtUSYmKFp0PS05MCksV2VbMF09b3QsV2VbMV09ZnR9LHNwaGVyZTpmdW5jdGlvbigpe290PS0oZnQ9MTgwKSxadD0tKGp0PTkwKX19O2Z1bmN0aW9uIFVhKGksdCl7ZG4ucHVzaChXZT1bb3Q9aSxmdD1pXSksdDxadCYmKFp0PXQpLHQ+anQmJihqdD10KX1mdW5jdGlvbiBDaChpLHQpe3ZhciBlPUZuKFtpKlgsdCpYXSk7aWYoZGkpe3ZhciBuPWZpKGRpLGUpLHM9W25bMV0sLW5bMF0sMF0scj1maShzLG4pO19yKHIpLHI9QXIocik7dmFyIG89aS1JbixhPW8+MD8xOi0xLGM9clswXSp1dCphLGwsaD10dChvKT4xODA7aF4oYSpJbjxjJiZjPGEqaSk/KGw9clsxXSp1dCxsPmp0JiYoanQ9bCkpOihjPShjKzM2MCklMzYwLTE4MCxoXihhKkluPGMmJmM8YSppKT8obD0tclsxXSp1dCxsPFp0JiYoWnQ9bCkpOih0PFp0JiYoWnQ9dCksdD5qdCYmKGp0PXQpKSksaD9pPEluP1F0KG90LGkpPlF0KG90LGZ0KSYmKGZ0PWkpOlF0KGksZnQpPlF0KG90LGZ0KSYmKG90PWkpOmZ0Pj1vdD8oaTxvdCYmKG90PWkpLGk+ZnQmJihmdD1pKSk6aT5Jbj9RdChvdCxpKT5RdChvdCxmdCkmJihmdD1pKTpRdChpLGZ0KT5RdChvdCxmdCkmJihvdD1pKX1lbHNlIGRuLnB1c2goV2U9W290PWksZnQ9aV0pO3Q8WnQmJihadD10KSx0Pmp0JiYoanQ9dCksZGk9ZSxJbj1pfWZ1bmN0aW9uIEVoKCl7SGUucG9pbnQ9Q2h9ZnVuY3Rpb24gQmgoKXtXZVswXT1vdCxXZVsxXT1mdCxIZS5wb2ludD1VYSxkaT1udWxsfWZ1bmN0aW9uIEZoKGksdCl7aWYoZGkpe3ZhciBlPWktSW47amkuYWRkKHR0KGUpPjE4MD9lKyhlPjA/MzYwOi0zNjApOmUpfWVsc2UgVGg9aSxQaD10O0dlLnBvaW50KGksdCksQ2goaSx0KX1mdW5jdGlvbiBqcCgpe0dlLmxpbmVTdGFydCgpfWZ1bmN0aW9uIFFwKCl7RmgoVGgsUGgpLEdlLmxpbmVFbmQoKSx0dChqaSk+USYmKG90PS0oZnQ9MTgwKSksV2VbMF09b3QsV2VbMV09ZnQsZGk9bnVsbH1mdW5jdGlvbiBRdChpLHQpe3JldHVybih0LT1pKTwwP3QrMzYwOnR9ZnVuY3Rpb24gS3AoaSx0KXtyZXR1cm4gaVswXS10WzBdfWZ1bmN0aW9uIEloKGksdCl7cmV0dXJuIGlbMF08PWlbMV0/aVswXTw9dCYmdDw9aVsxXTp0PGlbMF18fGlbMV08dH1mdW5jdGlvbiBraChpKXt2YXIgdCxlLG4scyxyLG8sYTtpZihqdD1mdD0tKG90PVp0PTEvMCksZG49W10sYnIoaSxIZSksZT1kbi5sZW5ndGgpe2Zvcihkbi5zb3J0KEtwKSx0PTEsbj1kblswXSxyPVtuXTt0PGU7Kyt0KXM9ZG5bdF0sSWgobixzWzBdKXx8SWgobixzWzFdKT8oUXQoblswXSxzWzFdKT5RdChuWzBdLG5bMV0pJiYoblsxXT1zWzFdKSxRdChzWzBdLG5bMV0pPlF0KG5bMF0sblsxXSkmJihuWzBdPXNbMF0pKTpyLnB1c2gobj1zKTtmb3Iobz0tMS8wLGU9ci5sZW5ndGgtMSx0PTAsbj1yW2VdO3Q8PWU7bj1zLCsrdClzPXJbdF0sKGE9UXQoblsxXSxzWzBdKSk+byYmKG89YSxvdD1zWzBdLGZ0PW5bMV0pfXJldHVybiBkbj1XZT1udWxsLG90PT09MS8wfHxadD09PTEvMD9bW05hTixOYU5dLFtOYU4sTmFOXV06W1tvdCxadF0sW2Z0LGp0XV19dmFyIFFpLHpyLFRyLFByLENyLEVyLEJyLEZyLHFhLFhhLFphLE5oLFJoLE90LER0LCR0LHdlPXtzcGhlcmU6RXQscG9pbnQ6R2EsbGluZVN0YXJ0OkxoLGxpbmVFbmQ6T2gscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7d2UubGluZVN0YXJ0PW55LHdlLmxpbmVFbmQ9aXl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt3ZS5saW5lU3RhcnQ9TGgsd2UubGluZUVuZD1PaH19O2Z1bmN0aW9uIEdhKGksdCl7aSo9WCx0Kj1YO3ZhciBlPUcodCk7S2koZSpHKGkpLGUqcShpKSxxKHQpKX1mdW5jdGlvbiBLaShpLHQsZSl7KytRaSxUcis9KGktVHIpL1FpLFByKz0odC1QcikvUWksQ3IrPShlLUNyKS9RaX1mdW5jdGlvbiBMaCgpe3dlLnBvaW50PXR5fWZ1bmN0aW9uIHR5KGksdCl7aSo9WCx0Kj1YO3ZhciBlPUcodCk7T3Q9ZSpHKGkpLER0PWUqcShpKSwkdD1xKHQpLHdlLnBvaW50PWV5LEtpKE90LER0LCR0KX1mdW5jdGlvbiBleShpLHQpe2kqPVgsdCo9WDt2YXIgZT1HKHQpLG49ZSpHKGkpLHM9ZSpxKGkpLHI9cSh0KSxvPXVlKFhlKChvPUR0KnItJHQqcykqbysobz0kdCpuLU90KnIpKm8rKG89T3Qqcy1EdCpuKSpvKSxPdCpuK0R0KnMrJHQqcik7enIrPW8sRXIrPW8qKE90KyhPdD1uKSksQnIrPW8qKER0KyhEdD1zKSksRnIrPW8qKCR0KygkdD1yKSksS2koT3QsRHQsJHQpfWZ1bmN0aW9uIE9oKCl7d2UucG9pbnQ9R2F9ZnVuY3Rpb24gbnkoKXt3ZS5wb2ludD1zeX1mdW5jdGlvbiBpeSgpe0RoKE5oLFJoKSx3ZS5wb2ludD1HYX1mdW5jdGlvbiBzeShpLHQpe05oPWksUmg9dCxpKj1YLHQqPVgsd2UucG9pbnQ9RGg7dmFyIGU9Ryh0KTtPdD1lKkcoaSksRHQ9ZSpxKGkpLCR0PXEodCksS2koT3QsRHQsJHQpfWZ1bmN0aW9uIERoKGksdCl7aSo9WCx0Kj1YO3ZhciBlPUcodCksbj1lKkcoaSkscz1lKnEoaSkscj1xKHQpLG89RHQqci0kdCpzLGE9JHQqbi1PdCpyLGM9T3Qqcy1EdCpuLGw9UmEobyxhLGMpLGg9WmUobCksdT1sJiYtaC9sO3FhLmFkZCh1Km8pLFhhLmFkZCh1KmEpLFphLmFkZCh1KmMpLHpyKz1oLEVyKz1oKihPdCsoT3Q9bikpLEJyKz1oKihEdCsoRHQ9cykpLEZyKz1oKigkdCsoJHQ9cikpLEtpKE90LER0LCR0KX1mdW5jdGlvbiAkaChpKXtRaT16cj1Ucj1Qcj1Dcj1Fcj1Ccj1Gcj0wLHFhPW5ldyBxZSxYYT1uZXcgcWUsWmE9bmV3IHFlLGJyKGksd2UpO3ZhciB0PStxYSxlPStYYSxuPStaYSxzPVJhKHQsZSxuKTtyZXR1cm4gczxnciYmKHQ9RXIsZT1CcixuPUZyLHpyPFEmJih0PVRyLGU9UHIsbj1Dcikscz1SYSh0LGUsbiksczxncik/W05hTixOYU5dOlt1ZShlLHQpKnV0LFplKG4vcykqdXRdfWZ1bmN0aW9uIFdhKGksdCl7ZnVuY3Rpb24gZShuLHMpe3JldHVybiBuPWkobixzKSx0KG5bMF0sblsxXSl9cmV0dXJuIGkuaW52ZXJ0JiZ0LmludmVydCYmKGUuaW52ZXJ0PWZ1bmN0aW9uKG4scyl7cmV0dXJuIG49dC5pbnZlcnQobixzKSxuJiZpLmludmVydChuWzBdLG5bMV0pfSksZX1mdW5jdGlvbiBIYShpLHQpe3JldHVybiB0dChpKT5IJiYoaS09TWF0aC5yb3VuZChpL1h0KSpYdCksW2ksdF19SGEuaW52ZXJ0PUhhO2Z1bmN0aW9uIFZoKGksdCxlKXtyZXR1cm4oaSU9WHQpP3R8fGU/V2EocWgoaSksWGgodCxlKSk6cWgoaSk6dHx8ZT9YaCh0LGUpOkhhfWZ1bmN0aW9uIFVoKGkpe3JldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiB0Kz1pLHR0KHQpPkgmJih0LT1NYXRoLnJvdW5kKHQvWHQpKlh0KSxbdCxlXX19ZnVuY3Rpb24gcWgoaSl7dmFyIHQ9VWgoaSk7cmV0dXJuIHQuaW52ZXJ0PVVoKC1pKSx0fWZ1bmN0aW9uIFhoKGksdCl7dmFyIGU9RyhpKSxuPXEoaSkscz1HKHQpLHI9cSh0KTtmdW5jdGlvbiBvKGEsYyl7dmFyIGw9RyhjKSxoPUcoYSkqbCx1PXEoYSkqbCxmPXEoYyksZD1mKmUraCpuO3JldHVyblt1ZSh1KnMtZCpyLGgqZS1mKm4pLFplKGQqcyt1KnIpXX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24oYSxjKXt2YXIgbD1HKGMpLGg9RyhhKSpsLHU9cShhKSpsLGY9cShjKSxkPWYqcy11KnI7cmV0dXJuW3VlKHUqcytmKnIsaCplK2QqbiksWmUoZCplLWgqbildfSxvfWZ1bmN0aW9uIFpoKGkpe2k9VmgoaVswXSpYLGlbMV0qWCxpLmxlbmd0aD4yP2lbMl0qWDowKTtmdW5jdGlvbiB0KGUpe3JldHVybiBlPWkoZVswXSpYLGVbMV0qWCksZVswXSo9dXQsZVsxXSo9dXQsZX1yZXR1cm4gdC5pbnZlcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9aS5pbnZlcnQoZVswXSpYLGVbMV0qWCksZVswXSo9dXQsZVsxXSo9dXQsZX0sdH1mdW5jdGlvbiByeShpLHQsZSxuLHMscil7aWYoZSl7dmFyIG89Ryh0KSxhPXEodCksYz1uKmU7cz09bnVsbD8ocz10K24qWHQscj10LWMvMik6KHM9R2gobyxzKSxyPUdoKG8sciksKG4+MD9zPHI6cz5yKSYmKHMrPW4qWHQpKTtmb3IodmFyIGwsaD1zO24+MD9oPnI6aDxyO2gtPWMpbD1BcihbbywtYSpHKGgpLC1hKnEoaCldKSxpLnBvaW50KGxbMF0sbFsxXSl9fWZ1bmN0aW9uIEdoKGksdCl7dD1Gbih0KSx0WzBdLT1pLF9yKHQpO3ZhciBlPVdwKC10WzFdKTtyZXR1cm4oKC10WzJdPDA/LWU6ZSkrWHQtUSklWHR9ZnVuY3Rpb24gV2goKXt2YXIgaT1bXSx0O3JldHVybntwb2ludDpmdW5jdGlvbihlLG4scyl7dC5wdXNoKFtlLG4sc10pfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtpLnB1c2godD1bXSl9LGxpbmVFbmQ6RXQscmVqb2luOmZ1bmN0aW9uKCl7aS5sZW5ndGg+MSYmaS5wdXNoKGkucG9wKCkuY29uY2F0KGkuc2hpZnQoKSkpfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgZT1pO3JldHVybiBpPVtdLHQ9bnVsbCxlfX19ZnVuY3Rpb24gSXIoaSx0KXtyZXR1cm4gdHQoaVswXS10WzBdKTxRJiZ0dChpWzFdLXRbMV0pPFF9ZnVuY3Rpb24ga3IoaSx0LGUsbil7dGhpcy54PWksdGhpcy56PXQsdGhpcy5vPWUsdGhpcy5lPW4sdGhpcy52PSExLHRoaXMubj10aGlzLnA9bnVsbH1mdW5jdGlvbiBIaChpLHQsZSxuLHMpe3ZhciByPVtdLG89W10sYSxjO2lmKGkuZm9yRWFjaChmdW5jdGlvbihwKXtpZighKCh5PXAubGVuZ3RoLTEpPD0wKSl7dmFyIHksZz1wWzBdLHc9cFt5XSxiO2lmKElyKGcsdykpe2lmKCFnWzJdJiYhd1syXSl7Zm9yKHMubGluZVN0YXJ0KCksYT0wO2E8eTsrK2Epcy5wb2ludCgoZz1wW2FdKVswXSxnWzFdKTtzLmxpbmVFbmQoKTtyZXR1cm59d1swXSs9MipRfXIucHVzaChiPW5ldyBrcihnLHAsbnVsbCwhMCkpLG8ucHVzaChiLm89bmV3IGtyKGcsbnVsbCxiLCExKSksci5wdXNoKGI9bmV3IGtyKHcscCxudWxsLCExKSksby5wdXNoKGIubz1uZXcga3IodyxudWxsLGIsITApKX19KSwhIXIubGVuZ3RoKXtmb3Ioby5zb3J0KHQpLEpoKHIpLEpoKG8pLGE9MCxjPW8ubGVuZ3RoO2E8YzsrK2Epb1thXS5lPWU9IWU7Zm9yKHZhciBsPXJbMF0saCx1Ozspe2Zvcih2YXIgZj1sLGQ9ITA7Zi52OylpZigoZj1mLm4pPT09bClyZXR1cm47aD1mLnoscy5saW5lU3RhcnQoKTtkb3tpZihmLnY9Zi5vLnY9ITAsZi5lKXtpZihkKWZvcihhPTAsYz1oLmxlbmd0aDthPGM7KythKXMucG9pbnQoKHU9aFthXSlbMF0sdVsxXSk7ZWxzZSBuKGYueCxmLm4ueCwxLHMpO2Y9Zi5ufWVsc2V7aWYoZClmb3IoaD1mLnAueixhPWgubGVuZ3RoLTE7YT49MDstLWEpcy5wb2ludCgodT1oW2FdKVswXSx1WzFdKTtlbHNlIG4oZi54LGYucC54LC0xLHMpO2Y9Zi5wfWY9Zi5vLGg9Zi56LGQ9IWR9d2hpbGUoIWYudik7cy5saW5lRW5kKCl9fX1mdW5jdGlvbiBKaChpKXtpZih0PWkubGVuZ3RoKXtmb3IodmFyIHQsZT0wLG49aVswXSxzOysrZTx0OyluLm49cz1pW2VdLHMucD1uLG49cztuLm49cz1pWzBdLHMucD1ufX1mdW5jdGlvbiBKYShpKXtyZXR1cm4gdHQoaVswXSk8PUg/aVswXTpacChpWzBdKSooKHR0KGlbMF0pK0gpJVh0LUgpfWZ1bmN0aW9uIFloKGksdCl7dmFyIGU9SmEodCksbj10WzFdLHM9cShuKSxyPVtxKGUpLC1HKGUpLDBdLG89MCxhPTAsYz1uZXcgcWU7cz09PTE/bj1xdCtROnM9PT0tMSYmKG49LXF0LVEpO2Zvcih2YXIgbD0wLGg9aS5sZW5ndGg7bDxoOysrbClpZihmPSh1PWlbbF0pLmxlbmd0aClmb3IodmFyIHUsZixkPXVbZi0xXSxwPUphKGQpLHk9ZFsxXS8yK3hyLGc9cSh5KSx3PUcoeSksYj0wO2I8ZjsrK2IscD1tLGc9Uyx3PUEsZD14KXt2YXIgeD11W2JdLG09SmEoeCksTT14WzFdLzIreHIsUz1xKE0pLEE9RyhNKSx2PW0tcCxfPXY+PTA/MTotMSxUPV8qdix6PVQ+SCxDPWcqUztpZihjLmFkZCh1ZShDKl8qcShUKSx3KkErQypHKFQpKSksbys9ej92K18qWHQ6dix6XnA+PWVebT49ZSl7dmFyIEU9ZmkoRm4oZCksRm4oeCkpO19yKEUpO3ZhciBGPWZpKHIsRSk7X3IoRik7dmFyIEI9KHpedj49MD8tMToxKSpaZShGWzJdKTsobj5CfHxuPT09QiYmKEVbMF18fEVbMV0pKSYmKGErPXpedj49MD8xOi0xKX19cmV0dXJuKG88LVF8fG88USYmYzwtZ3IpXmEmMX1mdW5jdGlvbiBqaChpLHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24ocyl7dmFyIHI9dChzKSxvPVdoKCksYT10KG8pLGM9ITEsbCxoLHUsZj17cG9pbnQ6ZCxsaW5lU3RhcnQ6eSxsaW5lRW5kOmcscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Zi5wb2ludD13LGYubGluZVN0YXJ0PWIsZi5saW5lRW5kPXgsaD1bXSxsPVtdfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7Zi5wb2ludD1kLGYubGluZVN0YXJ0PXksZi5saW5lRW5kPWcsaD1ZaShoKTt2YXIgbT1ZaChsLG4pO2gubGVuZ3RoPyhjfHwocy5wb2x5Z29uU3RhcnQoKSxjPSEwKSxIaChoLGF5LG0sZSxzKSk6bSYmKGN8fChzLnBvbHlnb25TdGFydCgpLGM9ITApLHMubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxzKSxzLmxpbmVFbmQoKSksYyYmKHMucG9seWdvbkVuZCgpLGM9ITEpLGg9bD1udWxsfSxzcGhlcmU6ZnVuY3Rpb24oKXtzLnBvbHlnb25TdGFydCgpLHMubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxzKSxzLmxpbmVFbmQoKSxzLnBvbHlnb25FbmQoKX19O2Z1bmN0aW9uIGQobSxNKXtpKG0sTSkmJnMucG9pbnQobSxNKX1mdW5jdGlvbiBwKG0sTSl7ci5wb2ludChtLE0pfWZ1bmN0aW9uIHkoKXtmLnBvaW50PXAsci5saW5lU3RhcnQoKX1mdW5jdGlvbiBnKCl7Zi5wb2ludD1kLHIubGluZUVuZCgpfWZ1bmN0aW9uIHcobSxNKXt1LnB1c2goW20sTV0pLGEucG9pbnQobSxNKX1mdW5jdGlvbiBiKCl7YS5saW5lU3RhcnQoKSx1PVtdfWZ1bmN0aW9uIHgoKXt3KHVbMF1bMF0sdVswXVsxXSksYS5saW5lRW5kKCk7dmFyIG09YS5jbGVhbigpLE09by5yZXN1bHQoKSxTLEE9TS5sZW5ndGgsdixfLFQ7aWYodS5wb3AoKSxsLnB1c2godSksdT1udWxsLCEhQSl7aWYobSYxKXtpZihfPU1bMF0sKHY9Xy5sZW5ndGgtMSk+MCl7Zm9yKGN8fChzLnBvbHlnb25TdGFydCgpLGM9ITApLHMubGluZVN0YXJ0KCksUz0wO1M8djsrK1Mpcy5wb2ludCgoVD1fW1NdKVswXSxUWzFdKTtzLmxpbmVFbmQoKX1yZXR1cm59QT4xJiZtJjImJk0ucHVzaChNLnBvcCgpLmNvbmNhdChNLnNoaWZ0KCkpKSxoLnB1c2goTS5maWx0ZXIob3kpKX19cmV0dXJuIGZ9fWZ1bmN0aW9uIG95KGkpe3JldHVybiBpLmxlbmd0aD4xfWZ1bmN0aW9uIGF5KGksdCl7cmV0dXJuKChpPWkueClbMF08MD9pWzFdLXF0LVE6cXQtaVsxXSktKCh0PXQueClbMF08MD90WzFdLXF0LVE6cXQtdFsxXSl9dmFyIFFoPWpoKGZ1bmN0aW9uKCl7cmV0dXJuITB9LGN5LGh5LFstSCwtcXRdKTtmdW5jdGlvbiBjeShpKXt2YXIgdD1OYU4sZT1OYU4sbj1OYU4scztyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7aS5saW5lU3RhcnQoKSxzPTF9LHBvaW50OmZ1bmN0aW9uKHIsbyl7dmFyIGE9cj4wP0g6LUgsYz10dChyLXQpO3R0KGMtSCk8UT8oaS5wb2ludCh0LGU9KGUrbykvMj4wP3F0Oi1xdCksaS5wb2ludChuLGUpLGkubGluZUVuZCgpLGkubGluZVN0YXJ0KCksaS5wb2ludChhLGUpLGkucG9pbnQocixlKSxzPTApOm4hPT1hJiZjPj1IJiYodHQodC1uKTxRJiYodC09bipRKSx0dChyLWEpPFEmJihyLT1hKlEpLGU9bHkodCxlLHIsbyksaS5wb2ludChuLGUpLGkubGluZUVuZCgpLGkubGluZVN0YXJ0KCksaS5wb2ludChhLGUpLHM9MCksaS5wb2ludCh0PXIsZT1vKSxuPWF9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtpLmxpbmVFbmQoKSx0PWU9TmFOfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiAyLXN9fX1mdW5jdGlvbiBseShpLHQsZSxuKXt2YXIgcyxyLG89cShpLWUpO3JldHVybiB0dChvKT5RP05hKChxKHQpKihyPUcobikpKnEoZSktcShuKSoocz1HKHQpKSpxKGkpKS8ocypyKm8pKToodCtuKS8yfWZ1bmN0aW9uIGh5KGksdCxlLG4pe3ZhciBzO2lmKGk9PW51bGwpcz1lKnF0LG4ucG9pbnQoLUgscyksbi5wb2ludCgwLHMpLG4ucG9pbnQoSCxzKSxuLnBvaW50KEgsMCksbi5wb2ludChILC1zKSxuLnBvaW50KDAsLXMpLG4ucG9pbnQoLUgsLXMpLG4ucG9pbnQoLUgsMCksbi5wb2ludCgtSCxzKTtlbHNlIGlmKHR0KGlbMF0tdFswXSk+USl7dmFyIHI9aVswXTx0WzBdP0g6LUg7cz1lKnIvMixuLnBvaW50KC1yLHMpLG4ucG9pbnQoMCxzKSxuLnBvaW50KHIscyl9ZWxzZSBuLnBvaW50KHRbMF0sdFsxXSl9ZnVuY3Rpb24gdXkoaSl7dmFyIHQ9RyhpKSxlPTIqWCxuPXQ+MCxzPXR0KHQpPlE7ZnVuY3Rpb24gcihoLHUsZixkKXtyeShkLGksZSxmLGgsdSl9ZnVuY3Rpb24gbyhoLHUpe3JldHVybiBHKGgpKkcodSk+dH1mdW5jdGlvbiBhKGgpe3ZhciB1LGYsZCxwLHk7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe3A9ZD0hMSx5PTF9LHBvaW50OmZ1bmN0aW9uKGcsdyl7dmFyIGI9W2csd10seCxtPW8oZyx3KSxNPW4/bT8wOmwoZyx3KTptP2woZysoZzwwP0g6LUgpLHcpOjA7aWYoIXUmJihwPWQ9bSkmJmgubGluZVN0YXJ0KCksbSE9PWQmJih4PWModSxiKSwoIXh8fElyKHUseCl8fElyKGIseCkpJiYoYlsyXT0xKSksbSE9PWQpeT0wLG0/KGgubGluZVN0YXJ0KCkseD1jKGIsdSksaC5wb2ludCh4WzBdLHhbMV0pKTooeD1jKHUsYiksaC5wb2ludCh4WzBdLHhbMV0sMiksaC5saW5lRW5kKCkpLHU9eDtlbHNlIGlmKHMmJnUmJm5ebSl7dmFyIFM7IShNJmYpJiYoUz1jKGIsdSwhMCkpJiYoeT0wLG4/KGgubGluZVN0YXJ0KCksaC5wb2ludChTWzBdWzBdLFNbMF1bMV0pLGgucG9pbnQoU1sxXVswXSxTWzFdWzFdKSxoLmxpbmVFbmQoKSk6KGgucG9pbnQoU1sxXVswXSxTWzFdWzFdKSxoLmxpbmVFbmQoKSxoLmxpbmVTdGFydCgpLGgucG9pbnQoU1swXVswXSxTWzBdWzFdLDMpKSl9bSYmKCF1fHwhSXIodSxiKSkmJmgucG9pbnQoYlswXSxiWzFdKSx1PWIsZD1tLGY9TX0sbGluZUVuZDpmdW5jdGlvbigpe2QmJmgubGluZUVuZCgpLHU9bnVsbH0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4geXwocCYmZCk8PDF9fX1mdW5jdGlvbiBjKGgsdSxmKXt2YXIgZD1GbihoKSxwPUZuKHUpLHk9WzEsMCwwXSxnPWZpKGQscCksdz1TcihnLGcpLGI9Z1swXSx4PXctYipiO2lmKCF4KXJldHVybiFmJiZoO3ZhciBtPXQqdy94LE09LXQqYi94LFM9ZmkoeSxnKSxBPXZyKHksbSksdj12cihnLE0pO1ZhKEEsdik7dmFyIF89UyxUPVNyKEEsXyksej1TcihfLF8pLEM9VCpULXoqKFNyKEEsQSktMSk7aWYoIShDPDApKXt2YXIgRT1YZShDKSxGPXZyKF8sKC1ULUUpL3opO2lmKFZhKEYsQSksRj1BcihGKSwhZilyZXR1cm4gRjt2YXIgQj1oWzBdLEk9dVswXSxSPWhbMV0sVj11WzFdLFU7STxCJiYoVT1CLEI9SSxJPVUpO3ZhciBLPUktQixjdD10dChLLUgpPFEsRnQ9Y3R8fEs8UTtpZighY3QmJlY8UiYmKFU9UixSPVYsVj1VKSxGdD9jdD9SK1Y+MF5GWzFdPCh0dChGWzBdLUIpPFE/UjpWKTpSPD1GWzFdJiZGWzFdPD1WOks+SF4oQjw9RlswXSYmRlswXTw9SSkpe3ZhciBJdD12cihfLCgtVCtFKS96KTtyZXR1cm4gVmEoSXQsQSksW0YsQXIoSXQpXX19fWZ1bmN0aW9uIGwoaCx1KXt2YXIgZj1uP2k6SC1pLGQ9MDtyZXR1cm4gaDwtZj9kfD0xOmg+ZiYmKGR8PTIpLHU8LWY/ZHw9NDp1PmYmJihkfD04KSxkfXJldHVybiBqaChvLGEscixuP1swLC1pXTpbLUgsaS1IXSl9ZnVuY3Rpb24gZnkoaSx0LGUsbixzLHIpe3ZhciBvPWlbMF0sYT1pWzFdLGM9dFswXSxsPXRbMV0saD0wLHU9MSxmPWMtbyxkPWwtYSxwO2lmKHA9ZS1vLCEoIWYmJnA+MCkpe2lmKHAvPWYsZjwwKXtpZihwPGgpcmV0dXJuO3A8dSYmKHU9cCl9ZWxzZSBpZihmPjApe2lmKHA+dSlyZXR1cm47cD5oJiYoaD1wKX1pZihwPXMtbywhKCFmJiZwPDApKXtpZihwLz1mLGY8MCl7aWYocD51KXJldHVybjtwPmgmJihoPXApfWVsc2UgaWYoZj4wKXtpZihwPGgpcmV0dXJuO3A8dSYmKHU9cCl9aWYocD1uLWEsISghZCYmcD4wKSl7aWYocC89ZCxkPDApe2lmKHA8aClyZXR1cm47cDx1JiYodT1wKX1lbHNlIGlmKGQ+MCl7aWYocD51KXJldHVybjtwPmgmJihoPXApfWlmKHA9ci1hLCEoIWQmJnA8MCkpe2lmKHAvPWQsZDwwKXtpZihwPnUpcmV0dXJuO3A+aCYmKGg9cCl9ZWxzZSBpZihkPjApe2lmKHA8aClyZXR1cm47cDx1JiYodT1wKX1yZXR1cm4gaD4wJiYoaVswXT1vK2gqZixpWzFdPWEraCpkKSx1PDEmJih0WzBdPW8rdSpmLHRbMV09YSt1KmQpLCEwfX19fX12YXIgdHM9MWU5LE5yPS10cztmdW5jdGlvbiBkeShpLHQsZSxuKXtmdW5jdGlvbiBzKGwsaCl7cmV0dXJuIGk8PWwmJmw8PWUmJnQ8PWgmJmg8PW59ZnVuY3Rpb24gcihsLGgsdSxmKXt2YXIgZD0wLHA9MDtpZihsPT1udWxsfHwoZD1vKGwsdSkpIT09KHA9byhoLHUpKXx8YyhsLGgpPDBedT4wKWRvIGYucG9pbnQoZD09PTB8fGQ9PT0zP2k6ZSxkPjE/bjp0KTt3aGlsZSgoZD0oZCt1KzQpJTQpIT09cCk7ZWxzZSBmLnBvaW50KGhbMF0saFsxXSl9ZnVuY3Rpb24gbyhsLGgpe3JldHVybiB0dChsWzBdLWkpPFE/aD4wPzA6Mzp0dChsWzBdLWUpPFE/aD4wPzI6MTp0dChsWzFdLXQpPFE/aD4wPzE6MDpoPjA/MzoyfWZ1bmN0aW9uIGEobCxoKXtyZXR1cm4gYyhsLngsaC54KX1mdW5jdGlvbiBjKGwsaCl7dmFyIHU9byhsLDEpLGY9byhoLDEpO3JldHVybiB1IT09Zj91LWY6dT09PTA/aFsxXS1sWzFdOnU9PT0xP2xbMF0taFswXTp1PT09Mj9sWzFdLWhbMV06aFswXS1sWzBdfXJldHVybiBmdW5jdGlvbihsKXt2YXIgaD1sLHU9V2goKSxmLGQscCx5LGcsdyxiLHgsbSxNLFMsQT17cG9pbnQ6dixsaW5lU3RhcnQ6QyxsaW5lRW5kOkUscG9seWdvblN0YXJ0OlQscG9seWdvbkVuZDp6fTtmdW5jdGlvbiB2KEIsSSl7cyhCLEkpJiZoLnBvaW50KEIsSSl9ZnVuY3Rpb24gXygpe2Zvcih2YXIgQj0wLEk9MCxSPWQubGVuZ3RoO0k8UjsrK0kpZm9yKHZhciBWPWRbSV0sVT0xLEs9Vi5sZW5ndGgsY3Q9VlswXSxGdCxJdCxXdD1jdFswXSx2dD1jdFsxXTtVPEs7KytVKUZ0PVd0LEl0PXZ0LGN0PVZbVV0sV3Q9Y3RbMF0sdnQ9Y3RbMV0sSXQ8PW4/dnQ+biYmKFd0LUZ0KSoobi1JdCk+KHZ0LUl0KSooaS1GdCkmJisrQjp2dDw9biYmKFd0LUZ0KSoobi1JdCk8KHZ0LUl0KSooaS1GdCkmJi0tQjtyZXR1cm4gQn1mdW5jdGlvbiBUKCl7aD11LGY9W10sZD1bXSxTPSEwfWZ1bmN0aW9uIHooKXt2YXIgQj1fKCksST1TJiZCLFI9KGY9WWkoZikpLmxlbmd0aDsoSXx8UikmJihsLnBvbHlnb25TdGFydCgpLEkmJihsLmxpbmVTdGFydCgpLHIobnVsbCxudWxsLDEsbCksbC5saW5lRW5kKCkpLFImJkhoKGYsYSxCLHIsbCksbC5wb2x5Z29uRW5kKCkpLGg9bCxmPWQ9cD1udWxsfWZ1bmN0aW9uIEMoKXtBLnBvaW50PUYsZCYmZC5wdXNoKHA9W10pLE09ITAsbT0hMSxiPXg9TmFOfWZ1bmN0aW9uIEUoKXtmJiYoRih5LGcpLHcmJm0mJnUucmVqb2luKCksZi5wdXNoKHUucmVzdWx0KCkpKSxBLnBvaW50PXYsbSYmaC5saW5lRW5kKCl9ZnVuY3Rpb24gRihCLEkpe3ZhciBSPXMoQixJKTtpZihkJiZwLnB1c2goW0IsSV0pLE0peT1CLGc9SSx3PVIsTT0hMSxSJiYoaC5saW5lU3RhcnQoKSxoLnBvaW50KEIsSSkpO2Vsc2UgaWYoUiYmbSloLnBvaW50KEIsSSk7ZWxzZXt2YXIgVj1bYj1NYXRoLm1heChOcixNYXRoLm1pbih0cyxiKSkseD1NYXRoLm1heChOcixNYXRoLm1pbih0cyx4KSldLFU9W0I9TWF0aC5tYXgoTnIsTWF0aC5taW4odHMsQikpLEk9TWF0aC5tYXgoTnIsTWF0aC5taW4odHMsSSkpXTtmeShWLFUsaSx0LGUsbik/KG18fChoLmxpbmVTdGFydCgpLGgucG9pbnQoVlswXSxWWzFdKSksaC5wb2ludChVWzBdLFVbMV0pLFJ8fGgubGluZUVuZCgpLFM9ITEpOlImJihoLmxpbmVTdGFydCgpLGgucG9pbnQoQixJKSxTPSExKX1iPUIseD1JLG09Un1yZXR1cm4gQX19dmFyIFlhLGphLFJyLExyLHBpPXtzcGhlcmU6RXQscG9pbnQ6RXQsbGluZVN0YXJ0OnB5LGxpbmVFbmQ6RXQscG9seWdvblN0YXJ0OkV0LHBvbHlnb25FbmQ6RXR9O2Z1bmN0aW9uIHB5KCl7cGkucG9pbnQ9bXkscGkubGluZUVuZD15eX1mdW5jdGlvbiB5eSgpe3BpLnBvaW50PXBpLmxpbmVFbmQ9RXR9ZnVuY3Rpb24gbXkoaSx0KXtpKj1YLHQqPVgsamE9aSxScj1xKHQpLExyPUcodCkscGkucG9pbnQ9Z3l9ZnVuY3Rpb24gZ3koaSx0KXtpKj1YLHQqPVg7dmFyIGU9cSh0KSxuPUcodCkscz10dChpLWphKSxyPUcocyksbz1xKHMpLGE9bipvLGM9THIqZS1ScipuKnIsbD1SciplK0xyKm4qcjtZYS5hZGQodWUoWGUoYSphK2MqYyksbCkpLGphPWksUnI9ZSxMcj1ufWZ1bmN0aW9uIHh5KGkpe3JldHVybiBZYT1uZXcgcWUsYnIoaSxwaSksK1lhfXZhciBRYT1bbnVsbCxudWxsXSx3eT17dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6UWF9O2Z1bmN0aW9uIHlpKGksdCl7cmV0dXJuIFFhWzBdPWksUWFbMV09dCx4eSh3eSl9dmFyIEtoPXtGZWF0dXJlOmZ1bmN0aW9uKGksdCl7cmV0dXJuIE9yKGkuZ2VvbWV0cnksdCl9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuZmVhdHVyZXMsbj0tMSxzPWUubGVuZ3RoOysrbjxzOylpZihPcihlW25dLmdlb21ldHJ5LHQpKXJldHVybiEwO3JldHVybiExfX0sdHU9e1NwaGVyZTpmdW5jdGlvbigpe3JldHVybiEwfSxQb2ludDpmdW5jdGlvbihpLHQpe3JldHVybiBldShpLmNvb3JkaW5hdGVzLHQpfSxNdWx0aVBvaW50OmZ1bmN0aW9uKGksdCl7Zm9yKHZhciBlPWkuY29vcmRpbmF0ZXMsbj0tMSxzPWUubGVuZ3RoOysrbjxzOylpZihldShlW25dLHQpKXJldHVybiEwO3JldHVybiExfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKGksdCl7cmV0dXJuIG51KGkuY29vcmRpbmF0ZXMsdCl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmNvb3JkaW5hdGVzLG49LTEscz1lLmxlbmd0aDsrK248czspaWYobnUoZVtuXSx0KSlyZXR1cm4hMDtyZXR1cm4hMX0sUG9seWdvbjpmdW5jdGlvbihpLHQpe3JldHVybiBpdShpLmNvb3JkaW5hdGVzLHQpfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24oaSx0KXtmb3IodmFyIGU9aS5jb29yZGluYXRlcyxuPS0xLHM9ZS5sZW5ndGg7KytuPHM7KWlmKGl1KGVbbl0sdCkpcmV0dXJuITA7cmV0dXJuITF9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbihpLHQpe2Zvcih2YXIgZT1pLmdlb21ldHJpZXMsbj0tMSxzPWUubGVuZ3RoOysrbjxzOylpZihPcihlW25dLHQpKXJldHVybiEwO3JldHVybiExfX07ZnVuY3Rpb24gT3IoaSx0KXtyZXR1cm4gaSYmdHUuaGFzT3duUHJvcGVydHkoaS50eXBlKT90dVtpLnR5cGVdKGksdCk6ITF9ZnVuY3Rpb24gZXUoaSx0KXtyZXR1cm4geWkoaSx0KT09PTB9ZnVuY3Rpb24gbnUoaSx0KXtmb3IodmFyIGUsbixzLHI9MCxvPWkubGVuZ3RoO3I8bztyKyspe2lmKG49eWkoaVtyXSx0KSxuPT09MHx8cj4wJiYocz15aShpW3JdLGlbci0xXSkscz4wJiZlPD1zJiZuPD1zJiYoZStuLXMpKigxLU1hdGgucG93KChlLW4pL3MsMikpPGdyKnMpKXJldHVybiEwO2U9bn1yZXR1cm4hMX1mdW5jdGlvbiBpdShpLHQpe3JldHVybiEhWWgoaS5tYXAoYnkpLHN1KHQpKX1mdW5jdGlvbiBieShpKXtyZXR1cm4gaT1pLm1hcChzdSksaS5wb3AoKSxpfWZ1bmN0aW9uIHN1KGkpe3JldHVybltpWzBdKlgsaVsxXSpYXX1mdW5jdGlvbiBNeShpLHQpe3JldHVybihpJiZLaC5oYXNPd25Qcm9wZXJ0eShpLnR5cGUpP0toW2kudHlwZV06T3IpKGksdCl9ZnVuY3Rpb24gQXkoaSx0KXt2YXIgZT1pWzBdKlgsbj1pWzFdKlgscz10WzBdKlgscj10WzFdKlgsbz1HKG4pLGE9cShuKSxjPUcociksbD1xKHIpLGg9bypHKGUpLHU9bypxKGUpLGY9YypHKHMpLGQ9YypxKHMpLHA9MipaZShYZSh3aChyLW4pK28qYyp3aChzLWUpKSkseT1xKHApLGc9cD9mdW5jdGlvbih3KXt2YXIgYj1xKHcqPXApL3kseD1xKHAtdykveSxtPXgqaCtiKmYsTT14KnUrYipkLFM9eCphK2IqbDtyZXR1cm5bdWUoTSxtKSp1dCx1ZShTLFhlKG0qbStNKk0pKSp1dF19OmZ1bmN0aW9uKCl7cmV0dXJuW2UqdXQsbip1dF19O3JldHVybiBnLmRpc3RhbmNlPXAsZ312YXIgcnU9aT0+aSxtaT0xLzAsRHI9bWksZXM9LW1pLCRyPWVzLG91PXtwb2ludDpTeSxsaW5lU3RhcnQ6RXQsbGluZUVuZDpFdCxwb2x5Z29uU3RhcnQ6RXQscG9seWdvbkVuZDpFdCxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgaT1bW21pLERyXSxbZXMsJHJdXTtyZXR1cm4gZXM9JHI9LShEcj1taT0xLzApLGl9fTtmdW5jdGlvbiBTeShpLHQpe2k8bWkmJihtaT1pKSxpPmVzJiYoZXM9aSksdDxEciYmKERyPXQpLHQ+JHImJigkcj10KX1mdW5jdGlvbiBLYShpKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9bmV3IHRjO2Zvcih2YXIgbiBpbiBpKWVbbl09aVtuXTtyZXR1cm4gZS5zdHJlYW09dCxlfX1mdW5jdGlvbiB0Yygpe310Yy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnRjLHBvaW50OmZ1bmN0aW9uKGksdCl7dGhpcy5zdHJlYW0ucG9pbnQoaSx0KX0sc3BoZXJlOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25FbmQoKX19O2Z1bmN0aW9uIGVjKGksdCxlKXt2YXIgbj1pLmNsaXBFeHRlbnQmJmkuY2xpcEV4dGVudCgpO3JldHVybiBpLnNjYWxlKDE1MCkudHJhbnNsYXRlKFswLDBdKSxuIT1udWxsJiZpLmNsaXBFeHRlbnQobnVsbCksYnIoZSxpLnN0cmVhbShvdSkpLHQob3UucmVzdWx0KCkpLG4hPW51bGwmJmkuY2xpcEV4dGVudChuKSxpfWZ1bmN0aW9uIGF1KGksdCxlKXtyZXR1cm4gZWMoaSxmdW5jdGlvbihuKXt2YXIgcz10WzFdWzBdLXRbMF1bMF0scj10WzFdWzFdLXRbMF1bMV0sbz1NYXRoLm1pbihzLyhuWzFdWzBdLW5bMF1bMF0pLHIvKG5bMV1bMV0tblswXVsxXSkpLGE9K3RbMF1bMF0rKHMtbyooblsxXVswXStuWzBdWzBdKSkvMixjPSt0WzBdWzFdKyhyLW8qKG5bMV1bMV0rblswXVsxXSkpLzI7aS5zY2FsZSgxNTAqbykudHJhbnNsYXRlKFthLGNdKX0sZSl9ZnVuY3Rpb24gdnkoaSx0LGUpe3JldHVybiBhdShpLFtbMCwwXSx0XSxlKX1mdW5jdGlvbiBfeShpLHQsZSl7cmV0dXJuIGVjKGksZnVuY3Rpb24obil7dmFyIHM9K3Qscj1zLyhuWzFdWzBdLW5bMF1bMF0pLG89KHMtciooblsxXVswXStuWzBdWzBdKSkvMixhPS1yKm5bMF1bMV07aS5zY2FsZSgxNTAqcikudHJhbnNsYXRlKFtvLGFdKX0sZSl9ZnVuY3Rpb24genkoaSx0LGUpe3JldHVybiBlYyhpLGZ1bmN0aW9uKG4pe3ZhciBzPSt0LHI9cy8oblsxXVsxXS1uWzBdWzFdKSxvPS1yKm5bMF1bMF0sYT0ocy1yKihuWzFdWzFdK25bMF1bMV0pKS8yO2kuc2NhbGUoMTUwKnIpLnRyYW5zbGF0ZShbbyxhXSl9LGUpfXZhciBjdT0xNixUeT1HKDMwKlgpO2Z1bmN0aW9uIGx1KGksdCl7cmV0dXJuK3Q/Q3koaSx0KTpQeShpKX1mdW5jdGlvbiBQeShpKXtyZXR1cm4gS2Eoe3BvaW50OmZ1bmN0aW9uKHQsZSl7dD1pKHQsZSksdGhpcy5zdHJlYW0ucG9pbnQodFswXSx0WzFdKX19KX1mdW5jdGlvbiBDeShpLHQpe2Z1bmN0aW9uIGUobixzLHIsbyxhLGMsbCxoLHUsZixkLHAseSxnKXt2YXIgdz1sLW4sYj1oLXMseD13KncrYipiO2lmKHg+NCp0JiZ5LS0pe3ZhciBtPW8rZixNPWErZCxTPWMrcCxBPVhlKG0qbStNKk0rUypTKSx2PVplKFMvPUEpLF89dHQodHQoUyktMSk8UXx8dHQoci11KTxRPyhyK3UpLzI6dWUoTSxtKSxUPWkoXyx2KSx6PVRbMF0sQz1UWzFdLEU9ei1uLEY9Qy1zLEI9YipFLXcqRjsoQipCL3g+dHx8dHQoKHcqRStiKkYpL3gtLjUpPi4zfHxvKmYrYSpkK2MqcDxUeSkmJihlKG4scyxyLG8sYSxjLHosQyxfLG0vPUEsTS89QSxTLHksZyksZy5wb2ludCh6LEMpLGUoeixDLF8sbSxNLFMsbCxoLHUsZixkLHAseSxnKSl9fXJldHVybiBmdW5jdGlvbihuKXt2YXIgcyxyLG8sYSxjLGwsaCx1LGYsZCxwLHksZz17cG9pbnQ6dyxsaW5lU3RhcnQ6YixsaW5lRW5kOm0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7bi5wb2x5Z29uU3RhcnQoKSxnLmxpbmVTdGFydD1NfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7bi5wb2x5Z29uRW5kKCksZy5saW5lU3RhcnQ9Yn19O2Z1bmN0aW9uIHcodixfKXt2PWkodixfKSxuLnBvaW50KHZbMF0sdlsxXSl9ZnVuY3Rpb24gYigpe3U9TmFOLGcucG9pbnQ9eCxuLmxpbmVTdGFydCgpfWZ1bmN0aW9uIHgodixfKXt2YXIgVD1GbihbdixfXSksej1pKHYsXyk7ZSh1LGYsaCxkLHAseSx1PXpbMF0sZj16WzFdLGg9dixkPVRbMF0scD1UWzFdLHk9VFsyXSxjdSxuKSxuLnBvaW50KHUsZil9ZnVuY3Rpb24gbSgpe2cucG9pbnQ9dyxuLmxpbmVFbmQoKX1mdW5jdGlvbiBNKCl7YigpLGcucG9pbnQ9UyxnLmxpbmVFbmQ9QX1mdW5jdGlvbiBTKHYsXyl7eChzPXYsXykscj11LG89ZixhPWQsYz1wLGw9eSxnLnBvaW50PXh9ZnVuY3Rpb24gQSgpe2UodSxmLGgsZCxwLHkscixvLHMsYSxjLGwsY3UsbiksZy5saW5lRW5kPW0sbSgpfXJldHVybiBnfX12YXIgRXk9S2Eoe3BvaW50OmZ1bmN0aW9uKGksdCl7dGhpcy5zdHJlYW0ucG9pbnQoaSpYLHQqWCl9fSk7ZnVuY3Rpb24gQnkoaSl7cmV0dXJuIEthKHtwb2ludDpmdW5jdGlvbih0LGUpe3ZhciBuPWkodCxlKTtyZXR1cm4gdGhpcy5zdHJlYW0ucG9pbnQoblswXSxuWzFdKX19KX1mdW5jdGlvbiBGeShpLHQsZSxuLHMpe2Z1bmN0aW9uIHIobyxhKXtyZXR1cm4gbyo9bixhKj1zLFt0K2kqbyxlLWkqYV19cmV0dXJuIHIuaW52ZXJ0PWZ1bmN0aW9uKG8sYSl7cmV0dXJuWyhvLXQpL2kqbiwoZS1hKS9pKnNdfSxyfWZ1bmN0aW9uIGh1KGksdCxlLG4scyxyKXtpZighcilyZXR1cm4gRnkoaSx0LGUsbixzKTt2YXIgbz1HKHIpLGE9cShyKSxjPW8qaSxsPWEqaSxoPW8vaSx1PWEvaSxmPShhKmUtbyp0KS9pLGQ9KGEqdCtvKmUpL2k7ZnVuY3Rpb24gcCh5LGcpe3JldHVybiB5Kj1uLGcqPXMsW2MqeS1sKmcrdCxlLWwqeS1jKmddfXJldHVybiBwLmludmVydD1mdW5jdGlvbih5LGcpe3JldHVybltuKihoKnktdSpnK2YpLHMqKGQtdSp5LWgqZyldfSxwfWZ1bmN0aW9uIFZyKGkpe3JldHVybiBJeShmdW5jdGlvbigpe3JldHVybiBpfSkoKX1mdW5jdGlvbiBJeShpKXt2YXIgdCxlPTE1MCxuPTQ4MCxzPTI1MCxyPTAsbz0wLGE9MCxjPTAsbD0wLGgsdT0wLGY9MSxkPTEscD1udWxsLHk9UWgsZz1udWxsLHcsYix4LG09cnUsTT0uNSxTLEEsdixfLFQ7ZnVuY3Rpb24geihCKXtyZXR1cm4gdihCWzBdKlgsQlsxXSpYKX1mdW5jdGlvbiBDKEIpe3JldHVybiBCPXYuaW52ZXJ0KEJbMF0sQlsxXSksQiYmW0JbMF0qdXQsQlsxXSp1dF19ei5zdHJlYW09ZnVuY3Rpb24oQil7cmV0dXJuIF8mJlQ9PT1CP186Xz1FeShCeShoKSh5KFMobShUPUIpKSkpKX0sei5wcmVjbGlwPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PUIscD12b2lkIDAsRigpKTp5fSx6LnBvc3RjbGlwPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPUIsZz13PWI9eD1udWxsLEYoKSk6bX0sei5jbGlwQW5nbGU9ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9K0I/dXkocD1CKlgpOihwPW51bGwsUWgpLEYoKSk6cCp1dH0sei5jbGlwRXh0ZW50PWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPUI9PW51bGw/KGc9dz1iPXg9bnVsbCxydSk6ZHkoZz0rQlswXVswXSx3PStCWzBdWzFdLGI9K0JbMV1bMF0seD0rQlsxXVsxXSksRigpKTpnPT1udWxsP251bGw6W1tnLHddLFtiLHhdXX0sei5zY2FsZT1mdW5jdGlvbihCKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rQixFKCkpOmV9LHoudHJhbnNsYXRlPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPStCWzBdLHM9K0JbMV0sRSgpKTpbbixzXX0sei5jZW50ZXI9ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9QlswXSUzNjAqWCxvPUJbMV0lMzYwKlgsRSgpKTpbcip1dCxvKnV0XX0sei5yb3RhdGU9ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9QlswXSUzNjAqWCxjPUJbMV0lMzYwKlgsbD1CLmxlbmd0aD4yP0JbMl0lMzYwKlg6MCxFKCkpOlthKnV0LGMqdXQsbCp1dF19LHouYW5nbGU9ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9QiUzNjAqWCxFKCkpOnUqdXR9LHoucmVmbGVjdFg9ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9Qj8tMToxLEUoKSk6ZjwwfSx6LnJlZmxlY3RZPWZ1bmN0aW9uKEIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPUI/LTE6MSxFKCkpOmQ8MH0sei5wcmVjaXNpb249ZnVuY3Rpb24oQil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KFM9bHUoQSxNPUIqQiksRigpKTpYZShNKX0sei5maXRFeHRlbnQ9ZnVuY3Rpb24oQixJKXtyZXR1cm4gYXUoeixCLEkpfSx6LmZpdFNpemU9ZnVuY3Rpb24oQixJKXtyZXR1cm4gdnkoeixCLEkpfSx6LmZpdFdpZHRoPWZ1bmN0aW9uKEIsSSl7cmV0dXJuIF95KHosQixJKX0sei5maXRIZWlnaHQ9ZnVuY3Rpb24oQixJKXtyZXR1cm4genkoeixCLEkpfTtmdW5jdGlvbiBFKCl7dmFyIEI9aHUoZSwwLDAsZixkLHUpLmFwcGx5KG51bGwsdChyLG8pKSxJPWh1KGUsbi1CWzBdLHMtQlsxXSxmLGQsdSk7cmV0dXJuIGg9VmgoYSxjLGwpLEE9V2EodCxJKSx2PVdhKGgsQSksUz1sdShBLE0pLEYoKX1mdW5jdGlvbiBGKCl7cmV0dXJuIF89VD1udWxsLHp9cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyksei5pbnZlcnQ9dC5pbnZlcnQmJkMsRSgpfX1mdW5jdGlvbiBreShpKXtyZXR1cm4gZnVuY3Rpb24odCxlKXt2YXIgbj1YZSh0KnQrZSplKSxzPWkobikscj1xKHMpLG89RyhzKTtyZXR1cm5bdWUodCpyLG4qbyksWmUobiYmZSpyL24pXX19ZnVuY3Rpb24gbmMoaSx0KXtyZXR1cm5baSxYcChHcCgocXQrdCkvMikpXX1uYy5pbnZlcnQ9ZnVuY3Rpb24oaSx0KXtyZXR1cm5baSwyKk5hKHFwKHQpKS1xdF19O2Z1bmN0aW9uIE55KCl7cmV0dXJuIFJ5KG5jKS5zY2FsZSg5NjEvWHQpfWZ1bmN0aW9uIFJ5KGkpe3ZhciB0PVZyKGkpLGU9dC5jZW50ZXIsbj10LnNjYWxlLHM9dC50cmFuc2xhdGUscj10LmNsaXBFeHRlbnQsbz1udWxsLGEsYyxsO3Quc2NhbGU9ZnVuY3Rpb24odSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG4odSksaCgpKTpuKCl9LHQudHJhbnNsYXRlPWZ1bmN0aW9uKHUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzKHUpLGgoKSk6cygpfSx0LmNlbnRlcj1mdW5jdGlvbih1KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZSh1KSxoKCkpOmUoKX0sdC5jbGlwRXh0ZW50PWZ1bmN0aW9uKHUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PT1udWxsP289YT1jPWw9bnVsbDoobz0rdVswXVswXSxhPSt1WzBdWzFdLGM9K3VbMV1bMF0sbD0rdVsxXVsxXSksaCgpKTpvPT1udWxsP251bGw6W1tvLGFdLFtjLGxdXX07ZnVuY3Rpb24gaCgpe3ZhciB1PUgqbigpLGY9dChaaCh0LnJvdGF0ZSgpKS5pbnZlcnQoWzAsMF0pKTtyZXR1cm4gcihvPT1udWxsP1tbZlswXS11LGZbMV0tdV0sW2ZbMF0rdSxmWzFdK3VdXTppPT09bmM/W1tNYXRoLm1heChmWzBdLXUsbyksYV0sW01hdGgubWluKGZbMF0rdSxjKSxsXV06W1tvLE1hdGgubWF4KGZbMV0tdSxhKV0sW2MsTWF0aC5taW4oZlsxXSt1LGwpXV0pfXJldHVybiBoKCl9ZnVuY3Rpb24gaWMoaSx0KXtyZXR1cm5baSx0XX1pYy5pbnZlcnQ9aWM7ZnVuY3Rpb24gTHkoKXtyZXR1cm4gVnIoaWMpLnNjYWxlKDE1Mi42Myl9ZnVuY3Rpb24gdXUoaSx0KXt2YXIgZT1HKHQpLG49MStHKGkpKmU7cmV0dXJuW2UqcShpKS9uLHEodCkvbl19dXUuaW52ZXJ0PWt5KGZ1bmN0aW9uKGkpe3JldHVybiAyKk5hKGkpfSk7ZnVuY3Rpb24gT3koKXtyZXR1cm4gVnIodXUpLnNjYWxlKDI1MCkuY2xpcEFuZ2xlKDE0Mil9dmFyIFVyPU1hdGguYWJzLGdpPU1hdGguY29zLF9lPU1hdGguc2luLG5zPTFlLTYscXI9TWF0aC5QSSxzYz1xci8yO2Z1bmN0aW9uIER5KGkpe3JldHVybiBpP2kvTWF0aC5zaW4oaSk6MX1mdW5jdGlvbiByYyhpKXtyZXR1cm4gaT4xPzA6aTwtMT9xcjpNYXRoLmFjb3MoaSl9ZnVuY3Rpb24gZnUoaSl7cmV0dXJuIGk+MD9NYXRoLnNxcnQoaSk6MH1mdW5jdGlvbiBkdShpLHQpe3ZhciBlPWdpKHQpLG49RHkocmMoZSpnaShpLz0yKSkpO3JldHVyblsyKmUqX2UoaSkqbixfZSh0KSpuXX1kdS5pbnZlcnQ9ZnVuY3Rpb24oaSx0KXtpZighKGkqaSs0KnQqdD5xcipxcitucykpe3ZhciBlPWksbj10LHM9MjU7ZG97dmFyIHI9X2UoZSksbz1fZShlLzIpLGE9Z2koZS8yKSxjPV9lKG4pLGw9Z2kobiksaD1fZSgyKm4pLHU9YypjLGY9bCpsLGQ9bypvLHA9MS1mKmEqYSx5PXA/cmMobCphKSpmdShnPTEvcCk6Zz0wLGcsdz0yKnkqbCpvLWksYj15KmMtdCx4PWcqKGYqZCt5KmwqYSp1KSxtPWcqKC41KnIqaC15KjIqYypvKSxNPWcqLjI1KihoKm8teSpjKmYqciksUz1nKih1KmEreSpkKmwpLEE9bSpNLVMqeDtpZighQSlicmVhazt2YXIgdj0oYiptLXcqUykvQSxfPSh3Kk0tYip4KS9BO2UtPXYsbi09X313aGlsZSgoVXIodik+bnN8fFVyKF8pPm5zKSYmLS1zPjApO3JldHVybltlLG5dfX07ZnVuY3Rpb24gcHUoaSx0KXt2YXIgZT1kdShpLHQpO3JldHVyblsoZVswXStpL3NjKS8yLChlWzFdK3QpLzJdfXB1LmludmVydD1mdW5jdGlvbihpLHQpe3ZhciBlPWksbj10LHM9MjU7ZG97dmFyIHI9Z2kobiksbz1fZShuKSxhPV9lKDIqbiksYz1vKm8sbD1yKnIsaD1fZShlKSx1PWdpKGUvMiksZj1fZShlLzIpLGQ9ZipmLHA9MS1sKnUqdSx5PXA/cmMocip1KSpmdShnPTEvcCk6Zz0wLGcsdz0uNSooMip5KnIqZitlL3NjKS1pLGI9LjUqKHkqbytuKS10LHg9LjUqZyoobCpkK3kqcip1KmMpKy41L3NjLG09ZyooaCphLzQteSpvKmYpLE09LjEyNSpnKihhKmYteSpvKmwqaCksUz0uNSpnKihjKnUreSpkKnIpKy41LEE9bSpNLVMqeCx2PShiKm0tdypTKS9BLF89KHcqTS1iKngpL0E7ZS09dixuLT1ffXdoaWxlKChVcih2KT5uc3x8VXIoXyk+bnMpJiYtLXM+MCk7cmV0dXJuW2Usbl19O2Z1bmN0aW9uICR5KCl7cmV0dXJuIFZyKHB1KS5zY2FsZSgxNTguODM3KX1jb25zdCBWeT17bWVyY2F0b3I6TnksZXF1aXJlY3Rhbmd1bGFyOkx5LHdpbmtlbDM6JHl9LG9jPXt9LGlzPWk9Pnt2YXIgbixzLHI7Y29uc3QgdD1KU09OLnN0cmluZ2lmeShpKTtpZihvY1t0XSlyZXR1cm4gb2NbdF07Y29uc3QgZT1WeVsobj1pLnByb2plY3Rpb25UeXBlKSE9bnVsbD9uOiJtZXJjYXRvciJdKCkuY2VudGVyKGkuY2VudGVyKS5zY2FsZShpLnNjYWxlKS50cmFuc2xhdGUoKHM9aS50cmFuc2xhdGUpIT1udWxsP3M6WzAsMF0pLnByZWNpc2lvbigocj1pLnByZWNpc2lvbikhPW51bGw/cjouMSk7cmV0dXJuIGkucm90YXRlJiZlLnJvdGF0ZShpLnJvdGF0ZSksb2NbdF09ZSxlfSxrbj17YTo2Mzc4MTM3LGI6NjM1Njc1MjMxNDI0NTE3OWUtOSxmOjEvMjk4LjI1NzIyMzU2M307ZnVuY3Rpb24geXUoaSx0LGU9MCxuPTEva24uYSxzPSExKXtjb25zdCByPVZjLmRlZ1RvUmFkKGkpLG89VmMuZGVnVG9SYWQodCksYT1NYXRoLmNvcyhvKSxjPU1hdGguc2luKG8pLGw9TWF0aC5jb3MociksaD1NYXRoLnNpbihyKTtsZXQgdSxmLGQ7aWYocyl7Y29uc3QgeT0oa24uYStlKSpuO3U9eSphKmgsZj15KmMsZD15KmEqbH1lbHNle2NvbnN0IHA9a24uYSx5PWtuLmIsZz1wKnAsdz15KnksYj0oZy13KS9nLHg9cC9NYXRoLnNxcnQoMS1iKmMqYyk7dT0oeCtlKSphKmgqbixmPSh4KigxLWIpK2UpKmMqbixkPSh4K2UpKmEqbCpufXJldHVybiBuZXcgUCh1LGYsZCl9Y29uc3QgWHI9KGksdCk9PmkubWFwKChbZSxuXSk9PntsZXQgcztpZih0KXtjb25zdFtyLG9dPXQoW2Usbl0pO3M9bmV3IGsociwtbyl9ZWxzZSBzPW5ldyBrKGUsbik7cmV0dXJuIHN9KSxzcz0oe2Nvb3JkaW5hdGVzOmksbGVuZ3Roczp0LG1ldGFMZW5ndGg6ZSxkaW1lbnNpb246bj0yfSk9Pntjb25zdCBzPVtdLHI9W107aWYoaSYmdCYmaSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSl7bGV0IG89MDtzLmxlbmd0aD10Lmxlbmd0aDtmb3IobGV0IGE9MDthPHQubGVuZ3RoO2ErKyl7Y29uc3QgYz10W2FdLGw9bmV3IEFycmF5KGMpO2ZvcihsZXQgaD0wO2g8YztoKyspbFtoXT1BcnJheS5mcm9tKGkuc3ViYXJyYXkobyxvK24pKSxvKz1uO3NbYV09bH1pZihlKXtjb25zdCBhPShpLmxlbmd0aC1vKS9lO3IubGVuZ3RoPWE7Zm9yKGxldCBjPTA7YzxhO2MrKylyW2NdPUFycmF5LmZyb20oaS5zdWJhcnJheShvLG8rZSkpLG8rPWV9fXJldHVybntjb29yZGluYXRlc0FycjpzLG1ldGFBcnJheTpyfX07dmFyIHJzPShpLHQpPT57Y29uc3QgZT1naChpLHQhPW51bGw/dDowKSxuPXt9LHM9W10scj1PYmplY3Qua2V5cyhlLmF0dHJpYnV0ZXMpO3JldHVybiBlLmluZGV4JiZyLnB1c2goImluZGV4Iiksci5mb3JFYWNoKG89Pntjb25zdCBhPW89PT0iaW5kZXgiP2UuaW5kZXg6ZS5hdHRyaWJ1dGVzW29dO25bb109e2FycmF5OmEuYXJyYXksaXRlbVNpemU6YS5pdGVtU2l6ZX0scy5wdXNoKGEuYXJyYXkuYnVmZmVyKX0pLHQmJihuLmdyb3Vwcz1lLmdyb3VwcyksZS5kaXNwb3NlKCksaS5mb3JFYWNoKG89PntvLmRpc3Bvc2UoKX0pLHttZXNzYWdlOm4sdHJhbnNmZXI6c319LGFjPShpLHQ9MzAwLGUpPT57Y29uc3Qgbj1bXSxzPVtdO3JldHVybiBpLmZvckVhY2goKHIsbyk9PntsZXQgYT0hMTtmb3IobGV0IGM9MTtjPHIubGVuZ3RoO2MrKylpZihNYXRoLmFicyhyW2NdLngtcltjLTFdLngpPnQpe2E9ITA7YnJlYWt9aWYoYSl7Y29uc3QgYz1bXSxsPVtdO3IuZm9yRWFjaChoPT57aC54PDA/Yy5wdXNoKGgpOmwucHVzaChoKX0pLG4ucHVzaChjLGwpLGUmJnMucHVzaChlW29dLGVbb10pfWVsc2Ugbi5wdXNoKHIpLGUmJnMucHVzaChlW29dKX0pLHtzcGxpdFBvbHlnb25zOm4sc3BsaXRNZXRhOnN9fTtmdW5jdGlvbiBVeShpLHQsZT0wKXtjb25zdFtuLHMscixvXT1pO2xldCBhPTEvMCxjPTEvMCxsPS0xLzAsaD0tMS8wO2ZvcihsZXQgdT0wO3U8PWU7dSsrKXtjb25zdCBmPWUmJnUvZTtYcihbW24rZiooci1uKSxzXSxbbitmKihyLW4pLG9dLFtuLHMrZiooby1zKV0sW3IscytmKihvLXMpXV0sdCkuZm9yRWFjaChkPT57YT1NYXRoLm1pbihhLGQueCksYz1NYXRoLm1pbihjLGQueSksbD1NYXRoLm1heChsLGQueCksaD1NYXRoLm1heChoLGQueSl9KX1yZXR1cm5bW2EsY10sW2wsaF1dfWNvbnN0IHF5PSh7Y29vcmRpbmF0ZXM6aSxsZW5ndGhzOnQsbWV0YUxlbmd0aDplLHNwbGl0Om4sYmJveDpzLHByb2plY3Rpb246cix1c2VHcm91cHM6byxoYXNUb3A6YSxoYXNCb3R0b206YyxoYXNTaWRlOmwsc3BsaXRQb2x5Z29uczpoLHRvcFNlZ21lbnRzOnV9KT0+e2NvbnN0IGY9ciYmaXMocikse2Nvb3JkaW5hdGVzQXJyOmQsbWV0YUFycmF5OnB9PXNzKHtjb29yZGluYXRlczppLGxlbmd0aHM6dCxtZXRhTGVuZ3RoOmV9KTtsZXQgeT1kLm1hcCh4PT5Ycih4LGYpKSxnPXA7aWYoaCl7Y29uc3QgeD1hYyh5LGgscCk7eT14LnNwbGl0UG9seWdvbnMsZz14LnNwbGl0TWV0YX1sZXQgdztpZihzKXtjb25zdCB4PXNbMF09PT0tMTgwJiZzWzJdPT09MTgwJiYocj09bnVsbD92b2lkIDA6ci5yb3RhdGUpLFttLE1dPVV5KHMseD9pcyhLZShVdCh7fSxyKSx7cm90YXRlOnZvaWQgMH0pKTpmLChyPT1udWxsP3ZvaWQgMDpyLnByb2plY3Rpb25UeXBlKT09PSJ3aW5rZWwzIj8xMDowKTt3PW5ldyBndChuZXcgUChtWzBdLG1bMV0sMCksbmV3IFAoTVswXSxNWzFdLDApKX1jb25zdCBiPXkubWFwKCh4LG0pPT57Y29uc3QgTT1nW21dWzBdLFM9Z1ttXVsxXXx8MCxBPWdbbV1bMl18fDEsdj1CcCh7cG9pbnRzOngsc3BsaXQ6bixzaWRlUmVwZWF0OkEsZGVwdGg6TSxoYXNUb3A6YSxoYXNCb3R0b206YyxoYXNTaWRlOmwsYm94Mzp3LHRvcFNlZ21lbnRzOnV9KTtpZihTKXtjb25zdCBfPXYuYXR0cmlidXRlcy5wb3NpdGlvbjtmb3IobGV0IFQ9MDtUPF8uY291bnQ7VCsrKV8uc2V0WihULF8uZ2V0WihUKStTKTtfLm5lZWRzVXBkYXRlPSEwfXJldHVybiB2fSk7cmV0dXJuIHJzKGIsbyl9O2NsYXNzIFh5IGV4dGVuZHMgQWV7Y29uc3RydWN0b3IodD1bXSxlPSJub25lIixuKXtzdXBlcigpLHRoaXMudHlwZT0iTWVzaExpbmVHZW9tZXRyeSIsdGhpcy5wb2ludENvdW50PTAsdGhpcy5fcG9pbnRzPVtdLHRoaXMuc2hhcGU9Im5vbmUiLHRoaXMuc2hhcGVGdW5jdGlvbj1zPT4xLHRoaXMubWF0cml4V29ybGQ9bmV3IHN0LHRoaXMuc2hhcGU9ZSxuJiYodGhpcy5zaGFwZUZ1bmN0aW9uPW4pLHQubGVuZ3RoPjAmJnRoaXMuc2V0UG9pbnRzKHQpfWNvbnZlcnRUb1ZlY3RvcjNBcnJheSh0KXtpZih0eXBlb2YgdFswXT09Im51bWJlciIpe2NvbnN0IGU9W10sbj10O2ZvcihsZXQgcz0wO3M8bi5sZW5ndGg7cys9MyllLnB1c2gobmV3IFAobltzXSxuW3MrMV0sbltzKzJdKSk7cmV0dXJuIGV9ZWxzZSByZXR1cm4gdC5tYXAoZT0+e2lmKGUgaW5zdGFuY2VvZiBrKXJldHVybiBuZXcgUChlLngsZS55LDApO2lmKGUgaW5zdGFuY2VvZiBQKXJldHVybiBlO2lmKEFycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoPT09MilyZXR1cm4gbmV3IFAoZVswXSxlWzFdLDApO2lmKEFycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoPT09MylyZXR1cm4gbmV3IFAoZVswXSxlWzFdLGVbMl0pfSkuZmlsdGVyKEJvb2xlYW4pfXNldE1hdHJpeFdvcmxkKHQpe3RoaXMubWF0cml4V29ybGQ9dH1zZXRQb2ludHModCxlKXshdHx8dC5sZW5ndGg9PT0wfHwodGhpcy5fcG9pbnRzPXRoaXMuY29udmVydFRvVmVjdG9yM0FycmF5KHQpLHRoaXMucG9pbnRDb3VudD10aGlzLl9wb2ludHMubGVuZ3RoLGUmJih0aGlzLnNoYXBlRnVuY3Rpb249ZSx0aGlzLnNoYXBlPSJjdXN0b20iKSx0aGlzLmluaXRpYWxpemVHZW9tZXRyeSgpLHRoaXMudXBkYXRlR2VvbWV0cnkoKSl9aW5pdGlhbGl6ZUdlb21ldHJ5KCl7Y29uc3QgdD1uZXcgeHQobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvaW50Q291bnQqNiksMyksZT1uZXcgeHQobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvaW50Q291bnQqNiksMyksbj1uZXcgeHQobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvaW50Q291bnQqNiksMykscz1uZXcgeHQobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvaW50Q291bnQqMiksMSkscj1uZXcgeHQobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvaW50Q291bnQqMiksMSksbz1uZXcgeHQobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvaW50Q291bnQqMiksMSksYT1uZXcgeHQobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvaW50Q291bnQqNCksMiksYz1uZXcgeHQobmV3IFVpbnQxNkFycmF5KCh0aGlzLnBvaW50Q291bnQtMSkqNiksMSk7dGhpcy5zaGFwZT09PSJ0YXBlciImJih0aGlzLnNoYXBlRnVuY3Rpb249bD0+MSpNYXRoLnBvdyg0KmwqKDEtbCksMSkpO2ZvcihsZXQgbD0wLGg9MCx1PTA7bDx0aGlzLnBvaW50Q291bnQ7bCs9MSxoKz0yLHUrPTYpe3Muc2V0WChoLGwvdGhpcy5wb2ludENvdW50KSxzLnNldFgoaCsxLGwvdGhpcy5wb2ludENvdW50KSxyLnNldFgoaCwxKSxyLnNldFgoaCsxLC0xKTtjb25zdCBmPXRoaXMuc2hhcGU9PT0ibm9uZSI/MTp0aGlzLnNoYXBlRnVuY3Rpb24obC8odGhpcy5wb2ludENvdW50LTEpKTtvLnNldFgoaCxmKSxvLnNldFgoaCsxLGYpO2NvbnN0IGQ9bC8odGhpcy5wb2ludENvdW50LTEpO2lmKGEuc2V0WFkoaCxkLDApLGEuc2V0WFkoaCsxLGQsMSksbDx0aGlzLnBvaW50Q291bnQtMSl7Y29uc3QgcD1sKjI7Yy5zZXRYKHUrMCxwKzApLGMuc2V0WCh1KzEscCsxKSxjLnNldFgodSsyLHArMiksYy5zZXRYKHUrMyxwKzIpLGMuc2V0WCh1KzQscCsxKSxjLnNldFgodSs1LHArMyl9fXRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsdCksdGhpcy5zZXRBdHRyaWJ1dGUoInByZXZpb3VzIixlKSx0aGlzLnNldEF0dHJpYnV0ZSgibmV4dCIsbiksdGhpcy5zZXRBdHRyaWJ1dGUoImNvdW50ZXJzIixzKSx0aGlzLnNldEF0dHJpYnV0ZSgic2lkZSIsciksdGhpcy5zZXRBdHRyaWJ1dGUoIndpZHRoIixvKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLGEpLHRoaXMuc2V0SW5kZXgoYyl9dXBkYXRlR2VvbWV0cnkoKXtpZighdGhpcy5fcG9pbnRzWzBdKXJldHVybjtjb25zdCB0PXRoaXMuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLGU9dGhpcy5nZXRBdHRyaWJ1dGUoInByZXZpb3VzIiksbj10aGlzLmdldEF0dHJpYnV0ZSgibmV4dCIpO2xldCBzPTAscj0wLG89MDtjb25zdCBhPXRoaXMuX3BvaW50c1swXTtlLnNldFhZWihyLGEueCxhLnksYS56KSxyKz0xLGUuc2V0WFlaKHIsYS54LGEueSxhLnopLHIrPTE7Zm9yKGxldCBsPTA7bDx0aGlzLnBvaW50Q291bnQ7bCsrKXtjb25zdCBoPXRoaXMuX3BvaW50c1tsXTt0LnNldFhZWihzLGgueCxoLnksaC56KSxzKz0xLHQuc2V0WFlaKHMsaC54LGgueSxoLnopLHMrPTEsbDx0aGlzLnBvaW50Q291bnQtMSYmKGUuc2V0WFlaKHIsaC54LGgueSxoLnopLHIrPTEsZS5zZXRYWVoocixoLngsaC55LGgueikscis9MSksbD4wJiZsKzE8PXRoaXMucG9pbnRDb3VudCYmKG4uc2V0WFlaKG8saC54LGgueSxoLnopLG8rPTEsbi5zZXRYWVoobyxoLngsaC55LGgueiksbys9MSl9Y29uc3QgYz10aGlzLl9wb2ludHNbdGhpcy5wb2ludENvdW50LTFdO24uc2V0WFlaKG8sYy54LGMueSxjLnopLG8rPTEsbi5zZXRYWVoobyxjLngsYy55LGMueiksbys9MSx0Lm5lZWRzVXBkYXRlPSEwLGUubmVlZHNVcGRhdGU9ITAsbi5uZWVkc1VwZGF0ZT0hMCx0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCl9Z2V0IHBvaW50cygpe3JldHVybiB0aGlzLl9wb2ludHN9c2V0IHBvaW50cyh0KXt0aGlzLnNldFBvaW50cyh0KX11cGRhdGVQb2ludHModCxlKXtjb25zdCBuPXRoaXMuY29udmVydFRvVmVjdG9yM0FycmF5KHQpO2lmKG4ubGVuZ3RoIT09dGhpcy5wb2ludENvdW50KXtjb25zb2xlLndhcm4oIk1lc2hMaW5lR2VvbWV0cnk6IENhbm5vdCB1cGRhdGUgcG9pbnRzIHdpdGggZGlmZmVyZW50IGxlbmd0aC4gVXNlIHNldFBvaW50cygpIGluc3RlYWQuIik7cmV0dXJufXRoaXMuX3BvaW50cz1uLGUmJih0aGlzLnNoYXBlRnVuY3Rpb249ZSx0aGlzLnNoYXBlPSJjdXN0b20iLHRoaXMuaW5pdGlhbGl6ZUdlb21ldHJ5KCkpLHRoaXMudXBkYXRlR2VvbWV0cnkoKX1zZXRTaGFwZSh0LGUpe3RoaXMuc2hhcGU9dCxlJiYodGhpcy5zaGFwZUZ1bmN0aW9uPWUpLHRoaXMuX3BvaW50cy5sZW5ndGg+MCYmKHRoaXMuaW5pdGlhbGl6ZUdlb21ldHJ5KCksdGhpcy51cGRhdGVHZW9tZXRyeSgpKX19dmFyIG11PWk9Pntjb25zdHtzZXRQb2ludFdpZHRoOnQsbm9kZXM6ZX09aSxuPW5ldyBYeTtyZXR1cm4gbi5zZXRQb2ludHMoZSx0KSxufTtjb25zdCBaeT0oe2Nvb3JkaW5hdGVzOmksbGVuZ3Roczp0LG1ldGFMZW5ndGg6ZSxwcm9qZWN0aW9uOm4sdXNlR3JvdXBzOnMsc3BsaXRQb2x5Z29uczpyfSk9Pntjb25zdCBvPW4mJmlzKG4pLHtjb29yZGluYXRlc0FycjphLG1ldGFBcnJheTpjfT1zcyh7Y29vcmRpbmF0ZXM6aSxsZW5ndGhzOnQsbWV0YUxlbmd0aDplfSk7bGV0IGw9YS5tYXAoZj0+WHIoZixvKSksaD1jO2lmKHIpe2NvbnN0IGY9YWMobCxyLGgpO2w9Zi5zcGxpdFBvbHlnb25zLGg9Zi5zcGxpdE1ldGF9Y29uc3QgdT1sLm1hcCgoZixkKT0+e2NvbnN0IHA9aFtkXVswXXx8MTtyZXR1cm4gbXUoe25vZGVzOmYsc2V0UG9pbnRXaWR0aDooKT0+cH0pfSk7cmV0dXJuIHJzKHUscyl9O3ZhciBHeT1pPT57Y29uc3R7cG9pbnRzOnR9PWksZT10LnJlZHVjZSgocyxyLG8pPT4obzx0Lmxlbmd0aC0xJiZzLnB1c2gocix0W28rMV0pLHMpLFtdKTtyZXR1cm4gbmV3IEFlKCkuc2V0RnJvbVBvaW50cyhlKX07Y29uc3QgV3k9KHtjb29yZGluYXRlczppLGxlbmd0aHM6dCxtZXRhTGVuZ3RoOmUscHJvamVjdGlvbjpuLHVzZUdyb3VwczpzLHNwbGl0UG9seWdvbnM6cn0pPT57Y29uc3Qgbz1uJiZpcyhuKSx7Y29vcmRpbmF0ZXNBcnI6YSxtZXRhQXJyYXk6Y309c3Moe2Nvb3JkaW5hdGVzOmksbGVuZ3Roczp0LG1ldGFMZW5ndGg6ZX0pO2xldCBsPWEubWFwKHU9PlhyKHUsbykpO3ImJihsPWFjKGwscixjKS5zcGxpdFBvbHlnb25zKTtjb25zdCBoPWwubWFwKCh1LGYpPT5HeSh7cG9pbnRzOnUubWFwKGQ9Pm5ldyBQKGQueCxkLnksMCkpfSkpO3JldHVybiBycyhoLHMpfTtmdW5jdGlvbiBIeShpLHQsZT0yKXtjb25zdCBuPXQmJnQubGVuZ3RoLHM9bj90WzBdKmU6aS5sZW5ndGg7bGV0IHI9Z3UoaSwwLHMsZSwhMCk7Y29uc3Qgbz1bXTtpZighcnx8ci5uZXh0PT09ci5wcmV2KXJldHVybiBvO2xldCBhLGMsbDtpZihuJiYocj1LeShpLHQscixlKSksaS5sZW5ndGg+ODAqZSl7YT1pWzBdLGM9aVsxXTtsZXQgaD1hLHU9Yztmb3IobGV0IGY9ZTtmPHM7Zis9ZSl7Y29uc3QgZD1pW2ZdLHA9aVtmKzFdO2Q8YSYmKGE9ZCkscDxjJiYoYz1wKSxkPmgmJihoPWQpLHA+dSYmKHU9cCl9bD1NYXRoLm1heChoLWEsdS1jKSxsPWwhPT0wPzMyNzY3L2w6MH1yZXR1cm4gb3MocixvLGUsYSxjLGwsMCksb31mdW5jdGlvbiBndShpLHQsZSxuLHMpe2xldCByO2lmKHM9PT1obShpLHQsZSxuKT4wKWZvcihsZXQgbz10O288ZTtvKz1uKXI9TXUoby9ufDAsaVtvXSxpW28rMV0scik7ZWxzZSBmb3IobGV0IG89ZS1uO28+PXQ7by09bilyPU11KG8vbnwwLGlbb10saVtvKzFdLHIpO3JldHVybiByJiZ4aShyLHIubmV4dCkmJihscyhyKSxyPXIubmV4dCkscn1mdW5jdGlvbiBObihpLHQpe2lmKCFpKXJldHVybiBpO3R8fCh0PWkpO2xldCBlPWksbjtkbyBpZihuPSExLCFlLnN0ZWluZXImJih4aShlLGUubmV4dCl8fGF0KGUucHJldixlLGUubmV4dCk9PT0wKSl7aWYobHMoZSksZT10PWUucHJldixlPT09ZS5uZXh0KWJyZWFrO249ITB9ZWxzZSBlPWUubmV4dDt3aGlsZShufHxlIT09dCk7cmV0dXJuIHR9ZnVuY3Rpb24gb3MoaSx0LGUsbixzLHIsbyl7aWYoIWkpcmV0dXJuOyFvJiZyJiZzbShpLG4scyxyKTtsZXQgYT1pO2Zvcig7aS5wcmV2IT09aS5uZXh0Oyl7Y29uc3QgYz1pLnByZXYsbD1pLm5leHQ7aWYocj9ZeShpLG4scyxyKTpKeShpKSl7dC5wdXNoKGMuaSxpLmksbC5pKSxscyhpKSxpPWwubmV4dCxhPWwubmV4dDtjb250aW51ZX1pZihpPWwsaT09PWEpe28/bz09PTE/KGk9ankoTm4oaSksdCksb3MoaSx0LGUsbixzLHIsMikpOm89PT0yJiZReShpLHQsZSxuLHMscik6b3MoTm4oaSksdCxlLG4scyxyLDEpO2JyZWFrfX19ZnVuY3Rpb24gSnkoaSl7Y29uc3QgdD1pLnByZXYsZT1pLG49aS5uZXh0O2lmKGF0KHQsZSxuKT49MClyZXR1cm4hMTtjb25zdCBzPXQueCxyPWUueCxvPW4ueCxhPXQueSxjPWUueSxsPW4ueSxoPU1hdGgubWluKHMscixvKSx1PU1hdGgubWluKGEsYyxsKSxmPU1hdGgubWF4KHMscixvKSxkPU1hdGgubWF4KGEsYyxsKTtsZXQgcD1uLm5leHQ7Zm9yKDtwIT09dDspe2lmKHAueD49aCYmcC54PD1mJiZwLnk+PXUmJnAueTw9ZCYmYXMocyxhLHIsYyxvLGwscC54LHAueSkmJmF0KHAucHJldixwLHAubmV4dCk+PTApcmV0dXJuITE7cD1wLm5leHR9cmV0dXJuITB9ZnVuY3Rpb24gWXkoaSx0LGUsbil7Y29uc3Qgcz1pLnByZXYscj1pLG89aS5uZXh0O2lmKGF0KHMscixvKT49MClyZXR1cm4hMTtjb25zdCBhPXMueCxjPXIueCxsPW8ueCxoPXMueSx1PXIueSxmPW8ueSxkPU1hdGgubWluKGEsYyxsKSxwPU1hdGgubWluKGgsdSxmKSx5PU1hdGgubWF4KGEsYyxsKSxnPU1hdGgubWF4KGgsdSxmKSx3PWNjKGQscCx0LGUsbiksYj1jYyh5LGcsdCxlLG4pO2xldCB4PWkucHJldlosbT1pLm5leHRaO2Zvcig7eCYmeC56Pj13JiZtJiZtLno8PWI7KXtpZih4Lng+PWQmJngueDw9eSYmeC55Pj1wJiZ4Lnk8PWcmJnghPT1zJiZ4IT09byYmYXMoYSxoLGMsdSxsLGYseC54LHgueSkmJmF0KHgucHJldix4LHgubmV4dCk+PTB8fCh4PXgucHJldlosbS54Pj1kJiZtLng8PXkmJm0ueT49cCYmbS55PD1nJiZtIT09cyYmbSE9PW8mJmFzKGEsaCxjLHUsbCxmLG0ueCxtLnkpJiZhdChtLnByZXYsbSxtLm5leHQpPj0wKSlyZXR1cm4hMTttPW0ubmV4dFp9Zm9yKDt4JiZ4Lno+PXc7KXtpZih4Lng+PWQmJngueDw9eSYmeC55Pj1wJiZ4Lnk8PWcmJnghPT1zJiZ4IT09byYmYXMoYSxoLGMsdSxsLGYseC54LHgueSkmJmF0KHgucHJldix4LHgubmV4dCk+PTApcmV0dXJuITE7eD14LnByZXZafWZvcig7bSYmbS56PD1iOyl7aWYobS54Pj1kJiZtLng8PXkmJm0ueT49cCYmbS55PD1nJiZtIT09cyYmbSE9PW8mJmFzKGEsaCxjLHUsbCxmLG0ueCxtLnkpJiZhdChtLnByZXYsbSxtLm5leHQpPj0wKXJldHVybiExO209bS5uZXh0Wn1yZXR1cm4hMH1mdW5jdGlvbiBqeShpLHQpe2xldCBlPWk7ZG97Y29uc3Qgbj1lLnByZXYscz1lLm5leHQubmV4dDsheGkobixzKSYmd3UobixlLGUubmV4dCxzKSYmY3MobixzKSYmY3MocyxuKSYmKHQucHVzaChuLmksZS5pLHMuaSksbHMoZSksbHMoZS5uZXh0KSxlPWk9cyksZT1lLm5leHR9d2hpbGUoZSE9PWkpO3JldHVybiBObihlKX1mdW5jdGlvbiBReShpLHQsZSxuLHMscil7bGV0IG89aTtkb3tsZXQgYT1vLm5leHQubmV4dDtmb3IoO2EhPT1vLnByZXY7KXtpZihvLmkhPT1hLmkmJmFtKG8sYSkpe2xldCBjPWJ1KG8sYSk7bz1ObihvLG8ubmV4dCksYz1ObihjLGMubmV4dCksb3Mobyx0LGUsbixzLHIsMCksb3MoYyx0LGUsbixzLHIsMCk7cmV0dXJufWE9YS5uZXh0fW89by5uZXh0fXdoaWxlKG8hPT1pKX1mdW5jdGlvbiBLeShpLHQsZSxuKXtjb25zdCBzPVtdO2ZvcihsZXQgcj0wLG89dC5sZW5ndGg7cjxvO3IrKyl7Y29uc3QgYT10W3JdKm4sYz1yPG8tMT90W3IrMV0qbjppLmxlbmd0aCxsPWd1KGksYSxjLG4sITEpO2w9PT1sLm5leHQmJihsLnN0ZWluZXI9ITApLHMucHVzaChvbShsKSl9cy5zb3J0KHRtKTtmb3IobGV0IHI9MDtyPHMubGVuZ3RoO3IrKyllPWVtKHNbcl0sZSk7cmV0dXJuIGV9ZnVuY3Rpb24gdG0oaSx0KXtsZXQgZT1pLngtdC54O2lmKGU9PT0wJiYoZT1pLnktdC55LGU9PT0wKSl7Y29uc3Qgbj0oaS5uZXh0LnktaS55KS8oaS5uZXh0LngtaS54KSxzPSh0Lm5leHQueS10LnkpLyh0Lm5leHQueC10LngpO2U9bi1zfXJldHVybiBlfWZ1bmN0aW9uIGVtKGksdCl7Y29uc3QgZT1ubShpLHQpO2lmKCFlKXJldHVybiB0O2NvbnN0IG49YnUoZSxpKTtyZXR1cm4gTm4obixuLm5leHQpLE5uKGUsZS5uZXh0KX1mdW5jdGlvbiBubShpLHQpe2xldCBlPXQ7Y29uc3Qgbj1pLngscz1pLnk7bGV0IHI9LTEvMCxvO2lmKHhpKGksZSkpcmV0dXJuIGU7ZG97aWYoeGkoaSxlLm5leHQpKXJldHVybiBlLm5leHQ7aWYoczw9ZS55JiZzPj1lLm5leHQueSYmZS5uZXh0LnkhPT1lLnkpe2NvbnN0IHU9ZS54KyhzLWUueSkqKGUubmV4dC54LWUueCkvKGUubmV4dC55LWUueSk7aWYodTw9biYmdT5yJiYocj11LG89ZS54PGUubmV4dC54P2U6ZS5uZXh0LHU9PT1uKSlyZXR1cm4gb31lPWUubmV4dH13aGlsZShlIT09dCk7aWYoIW8pcmV0dXJuIG51bGw7Y29uc3QgYT1vLGM9by54LGw9by55O2xldCBoPTEvMDtlPW87ZG97aWYobj49ZS54JiZlLng+PWMmJm4hPT1lLngmJnh1KHM8bD9uOnIscyxjLGwsczxsP3I6bixzLGUueCxlLnkpKXtjb25zdCB1PU1hdGguYWJzKHMtZS55KS8obi1lLngpO2NzKGUsaSkmJih1PGh8fHU9PT1oJiYoZS54Pm8ueHx8ZS54PT09by54JiZpbShvLGUpKSkmJihvPWUsaD11KX1lPWUubmV4dH13aGlsZShlIT09YSk7cmV0dXJuIG99ZnVuY3Rpb24gaW0oaSx0KXtyZXR1cm4gYXQoaS5wcmV2LGksdC5wcmV2KTwwJiZhdCh0Lm5leHQsaSxpLm5leHQpPDB9ZnVuY3Rpb24gc20oaSx0LGUsbil7bGV0IHM9aTtkbyBzLno9PT0wJiYocy56PWNjKHMueCxzLnksdCxlLG4pKSxzLnByZXZaPXMucHJldixzLm5leHRaPXMubmV4dCxzPXMubmV4dDt3aGlsZShzIT09aSk7cy5wcmV2Wi5uZXh0Wj1udWxsLHMucHJldlo9bnVsbCxybShzKX1mdW5jdGlvbiBybShpKXtsZXQgdCxlPTE7ZG97bGV0IG49aSxzO2k9bnVsbDtsZXQgcj1udWxsO2Zvcih0PTA7bjspe3QrKztsZXQgbz1uLGE9MDtmb3IobGV0IGw9MDtsPGUmJihhKyssbz1vLm5leHRaLCEhbyk7bCsrKTtsZXQgYz1lO2Zvcig7YT4wfHxjPjAmJm87KWEhPT0wJiYoYz09PTB8fCFvfHxuLno8PW8ueik/KHM9bixuPW4ubmV4dFosYS0tKToocz1vLG89by5uZXh0WixjLS0pLHI/ci5uZXh0Wj1zOmk9cyxzLnByZXZaPXIscj1zO249b31yLm5leHRaPW51bGwsZSo9Mn13aGlsZSh0PjEpO3JldHVybiBpfWZ1bmN0aW9uIGNjKGksdCxlLG4scyl7cmV0dXJuIGk9KGktZSkqc3wwLHQ9KHQtbikqc3wwLGk9KGl8aTw8OCkmMTY3MTE5MzUsaT0oaXxpPDw0KSYyNTI2NDUxMzUsaT0oaXxpPDwyKSY4NTg5OTM0NTksaT0oaXxpPDwxKSYxNDMxNjU1NzY1LHQ9KHR8dDw8OCkmMTY3MTE5MzUsdD0odHx0PDw0KSYyNTI2NDUxMzUsdD0odHx0PDwyKSY4NTg5OTM0NTksdD0odHx0PDwxKSYxNDMxNjU1NzY1LGl8dDw8MX1mdW5jdGlvbiBvbShpKXtsZXQgdD1pLGU9aTtkbyh0Lng8ZS54fHx0Lng9PT1lLngmJnQueTxlLnkpJiYoZT10KSx0PXQubmV4dDt3aGlsZSh0IT09aSk7cmV0dXJuIGV9ZnVuY3Rpb24geHUoaSx0LGUsbixzLHIsbyxhKXtyZXR1cm4ocy1vKSoodC1hKT49KGktbykqKHItYSkmJihpLW8pKihuLWEpPj0oZS1vKSoodC1hKSYmKGUtbykqKHItYSk+PShzLW8pKihuLWEpfWZ1bmN0aW9uIGFzKGksdCxlLG4scyxyLG8sYSl7cmV0dXJuIShpPT09byYmdD09PWEpJiZ4dShpLHQsZSxuLHMscixvLGEpfWZ1bmN0aW9uIGFtKGksdCl7cmV0dXJuIGkubmV4dC5pIT09dC5pJiZpLnByZXYuaSE9PXQuaSYmIWNtKGksdCkmJihjcyhpLHQpJiZjcyh0LGkpJiZsbShpLHQpJiYoYXQoaS5wcmV2LGksdC5wcmV2KXx8YXQoaSx0LnByZXYsdCkpfHx4aShpLHQpJiZhdChpLnByZXYsaSxpLm5leHQpPjAmJmF0KHQucHJldix0LHQubmV4dCk+MCl9ZnVuY3Rpb24gYXQoaSx0LGUpe3JldHVybih0LnktaS55KSooZS54LXQueCktKHQueC1pLngpKihlLnktdC55KX1mdW5jdGlvbiB4aShpLHQpe3JldHVybiBpLng9PT10LngmJmkueT09PXQueX1mdW5jdGlvbiB3dShpLHQsZSxuKXtjb25zdCBzPUdyKGF0KGksdCxlKSkscj1HcihhdChpLHQsbikpLG89R3IoYXQoZSxuLGkpKSxhPUdyKGF0KGUsbix0KSk7cmV0dXJuISEocyE9PXImJm8hPT1hfHxzPT09MCYmWnIoaSxlLHQpfHxyPT09MCYmWnIoaSxuLHQpfHxvPT09MCYmWnIoZSxpLG4pfHxhPT09MCYmWnIoZSx0LG4pKX1mdW5jdGlvbiBacihpLHQsZSl7cmV0dXJuIHQueDw9TWF0aC5tYXgoaS54LGUueCkmJnQueD49TWF0aC5taW4oaS54LGUueCkmJnQueTw9TWF0aC5tYXgoaS55LGUueSkmJnQueT49TWF0aC5taW4oaS55LGUueSl9ZnVuY3Rpb24gR3IoaSl7cmV0dXJuIGk+MD8xOmk8MD8tMTowfWZ1bmN0aW9uIGNtKGksdCl7bGV0IGU9aTtkb3tpZihlLmkhPT1pLmkmJmUubmV4dC5pIT09aS5pJiZlLmkhPT10LmkmJmUubmV4dC5pIT09dC5pJiZ3dShlLGUubmV4dCxpLHQpKXJldHVybiEwO2U9ZS5uZXh0fXdoaWxlKGUhPT1pKTtyZXR1cm4hMX1mdW5jdGlvbiBjcyhpLHQpe3JldHVybiBhdChpLnByZXYsaSxpLm5leHQpPDA/YXQoaSx0LGkubmV4dCk+PTAmJmF0KGksaS5wcmV2LHQpPj0wOmF0KGksdCxpLnByZXYpPDB8fGF0KGksaS5uZXh0LHQpPDB9ZnVuY3Rpb24gbG0oaSx0KXtsZXQgZT1pLG49ITE7Y29uc3Qgcz0oaS54K3QueCkvMixyPShpLnkrdC55KS8yO2RvIGUueT5yIT1lLm5leHQueT5yJiZlLm5leHQueSE9PWUueSYmczwoZS5uZXh0LngtZS54KSooci1lLnkpLyhlLm5leHQueS1lLnkpK2UueCYmKG49IW4pLGU9ZS5uZXh0O3doaWxlKGUhPT1pKTtyZXR1cm4gbn1mdW5jdGlvbiBidShpLHQpe2NvbnN0IGU9bGMoaS5pLGkueCxpLnkpLG49bGModC5pLHQueCx0LnkpLHM9aS5uZXh0LHI9dC5wcmV2O3JldHVybiBpLm5leHQ9dCx0LnByZXY9aSxlLm5leHQ9cyxzLnByZXY9ZSxuLm5leHQ9ZSxlLnByZXY9bixyLm5leHQ9bixuLnByZXY9cixufWZ1bmN0aW9uIE11KGksdCxlLG4pe2NvbnN0IHM9bGMoaSx0LGUpO3JldHVybiBuPyhzLm5leHQ9bi5uZXh0LHMucHJldj1uLG4ubmV4dC5wcmV2PXMsbi5uZXh0PXMpOihzLnByZXY9cyxzLm5leHQ9cyksc31mdW5jdGlvbiBscyhpKXtpLm5leHQucHJldj1pLnByZXYsaS5wcmV2Lm5leHQ9aS5uZXh0LGkucHJldlomJihpLnByZXZaLm5leHRaPWkubmV4dFopLGkubmV4dFomJihpLm5leHRaLnByZXZaPWkucHJldlopfWZ1bmN0aW9uIGxjKGksdCxlKXtyZXR1cm57aSx4OnQseTplLHByZXY6bnVsbCxuZXh0Om51bGwsejowLHByZXZaOm51bGwsbmV4dFo6bnVsbCxzdGVpbmVyOiExfX1mdW5jdGlvbiBobShpLHQsZSxuKXtsZXQgcz0wO2ZvcihsZXQgcj10LG89ZS1uO3I8ZTtyKz1uKXMrPShpW29dLWlbcl0pKihpW3IrMV0raVtvKzFdKSxvPXI7cmV0dXJuIHN9ZnVuY3Rpb24gQXUoaSl7Y29uc3QgdD1bXSxlPVtdLG49aVswXVswXS5sZW5ndGg7bGV0IHM9MCxyPTA7Zm9yKGNvbnN0IG8gb2YgaSl7Zm9yKGNvbnN0IGEgb2Ygbylmb3IobGV0IGM9MDtjPG47YysrKXQucHVzaChhW2NdKTtyJiYocys9cixlLnB1c2gocykpLHI9by5sZW5ndGh9cmV0dXJue3ZlcnRpY2VzOnQsaG9sZXM6ZSxkaW1lbnNpb25zOm59fWZ1bmN0aW9uIHVtKGkpe2lmKCFpKXRocm93IG5ldyBFcnJvcigiY29vcmQgaXMgcmVxdWlyZWQiKTtpZighQXJyYXkuaXNBcnJheShpKSl7aWYoaS50eXBlPT09IkZlYXR1cmUiJiZpLmdlb21ldHJ5IT09bnVsbCYmaS5nZW9tZXRyeS50eXBlPT09IlBvaW50IilyZXR1cm5bLi4uaS5nZW9tZXRyeS5jb29yZGluYXRlc107aWYoaS50eXBlPT09IlBvaW50IilyZXR1cm5bLi4uaS5jb29yZGluYXRlc119aWYoQXJyYXkuaXNBcnJheShpKSYmaS5sZW5ndGg+PTImJiFBcnJheS5pc0FycmF5KGlbMF0pJiYhQXJyYXkuaXNBcnJheShpWzFdKSlyZXR1cm5bLi4uaV07dGhyb3cgbmV3IEVycm9yKCJjb29yZCBtdXN0IGJlIEdlb0pTT04gUG9pbnQgb3IgYW4gQXJyYXkgb2YgbnVtYmVycyIpfWZ1bmN0aW9uIGZtKGkpe2lmKEFycmF5LmlzQXJyYXkoaSkpcmV0dXJuIGk7aWYoaS50eXBlPT09IkZlYXR1cmUiKXtpZihpLmdlb21ldHJ5IT09bnVsbClyZXR1cm4gaS5nZW9tZXRyeS5jb29yZGluYXRlc31lbHNlIGlmKGkuY29vcmRpbmF0ZXMpcmV0dXJuIGkuY29vcmRpbmF0ZXM7dGhyb3cgbmV3IEVycm9yKCJjb29yZHMgbXVzdCBiZSBHZW9KU09OIEZlYXR1cmUsIEdlb21ldHJ5IE9iamVjdCBvciBhbiBBcnJheSIpfWZ1bmN0aW9uIGRtKGkpe3JldHVybiBpLnR5cGU9PT0iRmVhdHVyZSI/aS5nZW9tZXRyeTppfWZ1bmN0aW9uIHBtKGkpe2NvbnN0IHQ9Zm0oaSk7bGV0IGU9MCxuPTEscyxyO2Zvcig7bjx0Lmxlbmd0aDspcz1yfHx0WzBdLHI9dFtuXSxlKz0oclswXS1zWzBdKSooclsxXStzWzFdKSxuKys7cmV0dXJuIGU+MH12YXIgeW09cG07Y29uc3QgSmU9MTExMDIyMzAyNDYyNTE1NjVlLTMyLEJ0PTEzNDIxNzcyOSxtbT0oMys4KkplKSpKZTtmdW5jdGlvbiBoYyhpLHQsZSxuLHMpe2xldCByLG8sYSxjLGw9dFswXSxoPW5bMF0sdT0wLGY9MDtoPmw9PWg+LWw/KHI9bCxsPXRbKyt1XSk6KHI9aCxoPW5bKytmXSk7bGV0IGQ9MDtpZih1PGkmJmY8ZSlmb3IoaD5sPT1oPi1sPyhvPWwrcixhPXItKG8tbCksbD10WysrdV0pOihvPWgrcixhPXItKG8taCksaD1uWysrZl0pLHI9byxhIT09MCYmKHNbZCsrXT1hKTt1PGkmJmY8ZTspaD5sPT1oPi1sPyhvPXIrbCxjPW8tcixhPXItKG8tYykrKGwtYyksbD10WysrdV0pOihvPXIraCxjPW8tcixhPXItKG8tYykrKGgtYyksaD1uWysrZl0pLHI9byxhIT09MCYmKHNbZCsrXT1hKTtmb3IoO3U8aTspbz1yK2wsYz1vLXIsYT1yLShvLWMpKyhsLWMpLGw9dFsrK3VdLHI9byxhIT09MCYmKHNbZCsrXT1hKTtmb3IoO2Y8ZTspbz1yK2gsYz1vLXIsYT1yLShvLWMpKyhoLWMpLGg9blsrK2ZdLHI9byxhIT09MCYmKHNbZCsrXT1hKTtyZXR1cm4ociE9PTB8fGQ9PT0wKSYmKHNbZCsrXT1yKSxkfWZ1bmN0aW9uIGdtKGksdCl7bGV0IGU9dFswXTtmb3IobGV0IG49MTtuPGk7bisrKWUrPXRbbl07cmV0dXJuIGV9ZnVuY3Rpb24gaHMoaSl7cmV0dXJuIG5ldyBGbG9hdDY0QXJyYXkoaSl9Y29uc3QgeG09KDMrMTYqSmUpKkplLHdtPSgyKzEyKkplKSpKZSxibT0oOSs2NCpKZSkqSmUqSmUsd2k9aHMoNCksU3U9aHMoOCksdnU9aHMoMTIpLF91PWhzKDE2KSxWdD1ocyg0KTtmdW5jdGlvbiBNbShpLHQsZSxuLHMscixvKXtsZXQgYSxjLGwsaCx1LGYsZCxwLHksZyx3LGIseCxtLE0sUyxBLHY7Y29uc3QgXz1pLXMsVD1lLXMsej10LXIsQz1uLXI7bT1fKkMsZj1CdCpfLGQ9Zi0oZi1fKSxwPV8tZCxmPUJ0KkMseT1mLShmLUMpLGc9Qy15LE09cCpnLShtLWQqeS1wKnktZCpnKSxTPXoqVCxmPUJ0KnosZD1mLShmLXopLHA9ei1kLGY9QnQqVCx5PWYtKGYtVCksZz1ULXksQT1wKmctKFMtZCp5LXAqeS1kKmcpLHc9TS1BLHU9TS13LHdpWzBdPU0tKHcrdSkrKHUtQSksYj1tK3csdT1iLW0seD1tLShiLXUpKyh3LXUpLHc9eC1TLHU9eC13LHdpWzFdPXgtKHcrdSkrKHUtUyksdj1iK3csdT12LWIsd2lbMl09Yi0odi11KSsody11KSx3aVszXT12O2xldCBFPWdtKDQsd2kpLEY9d20qbztpZihFPj1GfHwtRT49Rnx8KHU9aS1fLGE9aS0oXyt1KSsodS1zKSx1PWUtVCxsPWUtKFQrdSkrKHUtcyksdT10LXosYz10LSh6K3UpKyh1LXIpLHU9bi1DLGg9bi0oQyt1KSsodS1yKSxhPT09MCYmYz09PTAmJmw9PT0wJiZoPT09MCl8fChGPWJtKm8rbW0qTWF0aC5hYnMoRSksRSs9XypoK0MqYS0oeipsK1QqYyksRT49Rnx8LUU+PUYpKXJldHVybiBFO209YSpDLGY9QnQqYSxkPWYtKGYtYSkscD1hLWQsZj1CdCpDLHk9Zi0oZi1DKSxnPUMteSxNPXAqZy0obS1kKnktcCp5LWQqZyksUz1jKlQsZj1CdCpjLGQ9Zi0oZi1jKSxwPWMtZCxmPUJ0KlQseT1mLShmLVQpLGc9VC15LEE9cCpnLShTLWQqeS1wKnktZCpnKSx3PU0tQSx1PU0tdyxWdFswXT1NLSh3K3UpKyh1LUEpLGI9bSt3LHU9Yi1tLHg9bS0oYi11KSsody11KSx3PXgtUyx1PXgtdyxWdFsxXT14LSh3K3UpKyh1LVMpLHY9Yit3LHU9di1iLFZ0WzJdPWItKHYtdSkrKHctdSksVnRbM109djtjb25zdCBCPWhjKDQsd2ksNCxWdCxTdSk7bT1fKmgsZj1CdCpfLGQ9Zi0oZi1fKSxwPV8tZCxmPUJ0KmgseT1mLShmLWgpLGc9aC15LE09cCpnLShtLWQqeS1wKnktZCpnKSxTPXoqbCxmPUJ0KnosZD1mLShmLXopLHA9ei1kLGY9QnQqbCx5PWYtKGYtbCksZz1sLXksQT1wKmctKFMtZCp5LXAqeS1kKmcpLHc9TS1BLHU9TS13LFZ0WzBdPU0tKHcrdSkrKHUtQSksYj1tK3csdT1iLW0seD1tLShiLXUpKyh3LXUpLHc9eC1TLHU9eC13LFZ0WzFdPXgtKHcrdSkrKHUtUyksdj1iK3csdT12LWIsVnRbMl09Yi0odi11KSsody11KSxWdFszXT12O2NvbnN0IEk9aGMoQixTdSw0LFZ0LHZ1KTttPWEqaCxmPUJ0KmEsZD1mLShmLWEpLHA9YS1kLGY9QnQqaCx5PWYtKGYtaCksZz1oLXksTT1wKmctKG0tZCp5LXAqeS1kKmcpLFM9YypsLGY9QnQqYyxkPWYtKGYtYykscD1jLWQsZj1CdCpsLHk9Zi0oZi1sKSxnPWwteSxBPXAqZy0oUy1kKnktcCp5LWQqZyksdz1NLUEsdT1NLXcsVnRbMF09TS0odyt1KSsodS1BKSxiPW0rdyx1PWItbSx4PW0tKGItdSkrKHctdSksdz14LVMsdT14LXcsVnRbMV09eC0odyt1KSsodS1TKSx2PWIrdyx1PXYtYixWdFsyXT1iLSh2LXUpKyh3LXUpLFZ0WzNdPXY7Y29uc3QgUj1oYyhJLHZ1LDQsVnQsX3UpO3JldHVybiBfdVtSLTFdfWZ1bmN0aW9uIFdyKGksdCxlLG4scyxyKXtjb25zdCBvPSh0LXIpKihlLXMpLGE9KGktcykqKG4tciksYz1vLWEsbD1NYXRoLmFicyhvK2EpO3JldHVybiBNYXRoLmFicyhjKT49eG0qbD9jOi1NbShpLHQsZSxuLHMscixsKX1jb25zdCB6dT1NYXRoLnBvdygyLC01MiksSHI9bmV3IFVpbnQzMkFycmF5KDUxMik7Y2xhc3MgdXN7c3RhdGljIGZyb20odCxlPXptLG49VG0pe2NvbnN0IHM9dC5sZW5ndGgscj1uZXcgRmxvYXQ2NEFycmF5KHMqMik7Zm9yKGxldCBvPTA7bzxzO28rKyl7Y29uc3QgYT10W29dO3JbMipvXT1lKGEpLHJbMipvKzFdPW4oYSl9cmV0dXJuIG5ldyB1cyhyKX1jb25zdHJ1Y3Rvcih0KXtjb25zdCBlPXQubGVuZ3RoPj4xO2lmKGU+MCYmdHlwZW9mIHRbMF0hPSJudW1iZXIiKXRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgY29vcmRzIHRvIGNvbnRhaW4gbnVtYmVycy4iKTt0aGlzLmNvb3Jkcz10O2NvbnN0IG49TWF0aC5tYXgoMiplLTUsMCk7dGhpcy5fdHJpYW5nbGVzPW5ldyBVaW50MzJBcnJheShuKjMpLHRoaXMuX2hhbGZlZGdlcz1uZXcgSW50MzJBcnJheShuKjMpLHRoaXMuX2hhc2hTaXplPU1hdGguY2VpbChNYXRoLnNxcnQoZSkpLHRoaXMuX2h1bGxQcmV2PW5ldyBVaW50MzJBcnJheShlKSx0aGlzLl9odWxsTmV4dD1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5faHVsbFRyaT1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5faHVsbEhhc2g9bmV3IEludDMyQXJyYXkodGhpcy5faGFzaFNpemUpLHRoaXMuX2lkcz1uZXcgVWludDMyQXJyYXkoZSksdGhpcy5fZGlzdHM9bmV3IEZsb2F0NjRBcnJheShlKSx0aGlzLnVwZGF0ZSgpfXVwZGF0ZSgpe2NvbnN0e2Nvb3Jkczp0LF9odWxsUHJldjplLF9odWxsTmV4dDpuLF9odWxsVHJpOnMsX2h1bGxIYXNoOnJ9PXRoaXMsbz10Lmxlbmd0aD4+MTtsZXQgYT0xLzAsYz0xLzAsbD0tMS8wLGg9LTEvMDtmb3IobGV0IF89MDtfPG87XysrKXtjb25zdCBUPXRbMipfXSx6PXRbMipfKzFdO1Q8YSYmKGE9VCksejxjJiYoYz16KSxUPmwmJihsPVQpLHo+aCYmKGg9eiksdGhpcy5faWRzW19dPV99Y29uc3QgdT0oYStsKS8yLGY9KGMraCkvMjtsZXQgZCxwLHk7Zm9yKGxldCBfPTAsVD0xLzA7XzxvO18rKyl7Y29uc3Qgej11Yyh1LGYsdFsyKl9dLHRbMipfKzFdKTt6PFQmJihkPV8sVD16KX1jb25zdCBnPXRbMipkXSx3PXRbMipkKzFdO2ZvcihsZXQgXz0wLFQ9MS8wO188bztfKyspe2lmKF89PT1kKWNvbnRpbnVlO2NvbnN0IHo9dWMoZyx3LHRbMipfXSx0WzIqXysxXSk7ejxUJiZ6PjAmJihwPV8sVD16KX1sZXQgYj10WzIqcF0seD10WzIqcCsxXSxtPTEvMDtmb3IobGV0IF89MDtfPG87XysrKXtpZihfPT09ZHx8Xz09PXApY29udGludWU7Y29uc3QgVD12bShnLHcsYix4LHRbMipfXSx0WzIqXysxXSk7VDxtJiYoeT1fLG09VCl9bGV0IE09dFsyKnldLFM9dFsyKnkrMV07aWYobT09PTEvMCl7Zm9yKGxldCB6PTA7ejxvO3orKyl0aGlzLl9kaXN0c1t6XT10WzIqel0tdFswXXx8dFsyKnorMV0tdFsxXTtiaSh0aGlzLl9pZHMsdGhpcy5fZGlzdHMsMCxvLTEpO2NvbnN0IF89bmV3IFVpbnQzMkFycmF5KG8pO2xldCBUPTA7Zm9yKGxldCB6PTAsQz0tMS8wO3o8bzt6Kyspe2NvbnN0IEU9dGhpcy5faWRzW3pdLEY9dGhpcy5fZGlzdHNbRV07Rj5DJiYoX1tUKytdPUUsQz1GKX10aGlzLmh1bGw9Xy5zdWJhcnJheSgwLFQpLHRoaXMudHJpYW5nbGVzPW5ldyBVaW50MzJBcnJheSgwKSx0aGlzLmhhbGZlZGdlcz1uZXcgVWludDMyQXJyYXkoMCk7cmV0dXJufWlmKFdyKGcsdyxiLHgsTSxTKTwwKXtjb25zdCBfPXAsVD1iLHo9eDtwPXksYj1NLHg9Uyx5PV8sTT1ULFM9en1jb25zdCBBPV9tKGcsdyxiLHgsTSxTKTt0aGlzLl9jeD1BLngsdGhpcy5fY3k9QS55O2ZvcihsZXQgXz0wO188bztfKyspdGhpcy5fZGlzdHNbX109dWModFsyKl9dLHRbMipfKzFdLEEueCxBLnkpO2JpKHRoaXMuX2lkcyx0aGlzLl9kaXN0cywwLG8tMSksdGhpcy5faHVsbFN0YXJ0PWQ7bGV0IHY9MztuW2RdPWVbeV09cCxuW3BdPWVbZF09eSxuW3ldPWVbcF09ZCxzW2RdPTAsc1twXT0xLHNbeV09MixyLmZpbGwoLTEpLHJbdGhpcy5faGFzaEtleShnLHcpXT1kLHJbdGhpcy5faGFzaEtleShiLHgpXT1wLHJbdGhpcy5faGFzaEtleShNLFMpXT15LHRoaXMudHJpYW5nbGVzTGVuPTAsdGhpcy5fYWRkVHJpYW5nbGUoZCxwLHksLTEsLTEsLTEpO2ZvcihsZXQgXz0wLFQsejtfPHRoaXMuX2lkcy5sZW5ndGg7XysrKXtjb25zdCBDPXRoaXMuX2lkc1tfXSxFPXRbMipDXSxGPXRbMipDKzFdO2lmKF8+MCYmTWF0aC5hYnMoRS1UKTw9enUmJk1hdGguYWJzKEYteik8PXp1fHwoVD1FLHo9RixDPT09ZHx8Qz09PXB8fEM9PT15KSljb250aW51ZTtsZXQgQj0wO2ZvcihsZXQgSz0wLGN0PXRoaXMuX2hhc2hLZXkoRSxGKTtLPHRoaXMuX2hhc2hTaXplJiYoQj1yWyhjdCtLKSV0aGlzLl9oYXNoU2l6ZV0sIShCIT09LTEmJkIhPT1uW0JdKSk7SysrKTtCPWVbQl07bGV0IEk9QixSO2Zvcig7Uj1uW0ldLFdyKEUsRix0WzIqSV0sdFsyKkkrMV0sdFsyKlJdLHRbMipSKzFdKT49MDspaWYoST1SLEk9PT1CKXtJPS0xO2JyZWFrfWlmKEk9PT0tMSljb250aW51ZTtsZXQgVj10aGlzLl9hZGRUcmlhbmdsZShJLEMsbltJXSwtMSwtMSxzW0ldKTtzW0NdPXRoaXMuX2xlZ2FsaXplKFYrMiksc1tJXT1WLHYrKztsZXQgVT1uW0ldO2Zvcig7Uj1uW1VdLFdyKEUsRix0WzIqVV0sdFsyKlUrMV0sdFsyKlJdLHRbMipSKzFdKTwwOylWPXRoaXMuX2FkZFRyaWFuZ2xlKFUsQyxSLHNbQ10sLTEsc1tVXSksc1tDXT10aGlzLl9sZWdhbGl6ZShWKzIpLG5bVV09VSx2LS0sVT1SO2lmKEk9PT1CKWZvcig7Uj1lW0ldLFdyKEUsRix0WzIqUl0sdFsyKlIrMV0sdFsyKkldLHRbMipJKzFdKTwwOylWPXRoaXMuX2FkZFRyaWFuZ2xlKFIsQyxJLC0xLHNbSV0sc1tSXSksdGhpcy5fbGVnYWxpemUoVisyKSxzW1JdPVYsbltJXT1JLHYtLSxJPVI7dGhpcy5faHVsbFN0YXJ0PWVbQ109SSxuW0ldPWVbVV09QyxuW0NdPVUsclt0aGlzLl9oYXNoS2V5KEUsRildPUMsclt0aGlzLl9oYXNoS2V5KHRbMipJXSx0WzIqSSsxXSldPUl9dGhpcy5odWxsPW5ldyBVaW50MzJBcnJheSh2KTtmb3IobGV0IF89MCxUPXRoaXMuX2h1bGxTdGFydDtfPHY7XysrKXRoaXMuaHVsbFtfXT1ULFQ9bltUXTt0aGlzLnRyaWFuZ2xlcz10aGlzLl90cmlhbmdsZXMuc3ViYXJyYXkoMCx0aGlzLnRyaWFuZ2xlc0xlbiksdGhpcy5oYWxmZWRnZXM9dGhpcy5faGFsZmVkZ2VzLnN1YmFycmF5KDAsdGhpcy50cmlhbmdsZXNMZW4pfV9oYXNoS2V5KHQsZSl7cmV0dXJuIE1hdGguZmxvb3IoQW0odC10aGlzLl9jeCxlLXRoaXMuX2N5KSp0aGlzLl9oYXNoU2l6ZSkldGhpcy5faGFzaFNpemV9X2xlZ2FsaXplKHQpe2NvbnN0e190cmlhbmdsZXM6ZSxfaGFsZmVkZ2VzOm4sY29vcmRzOnN9PXRoaXM7bGV0IHI9MCxvPTA7Zm9yKDs7KXtjb25zdCBhPW5bdF0sYz10LXQlMztpZihvPWMrKHQrMiklMyxhPT09LTEpe2lmKHI9PT0wKWJyZWFrO3Q9SHJbLS1yXTtjb250aW51ZX1jb25zdCBsPWEtYSUzLGg9YysodCsxKSUzLHU9bCsoYSsyKSUzLGY9ZVtvXSxkPWVbdF0scD1lW2hdLHk9ZVt1XTtpZihTbShzWzIqZl0sc1syKmYrMV0sc1syKmRdLHNbMipkKzFdLHNbMipwXSxzWzIqcCsxXSxzWzIqeV0sc1syKnkrMV0pKXtlW3RdPXksZVthXT1mO2NvbnN0IHc9blt1XTtpZih3PT09LTEpe2xldCB4PXRoaXMuX2h1bGxTdGFydDtkb3tpZih0aGlzLl9odWxsVHJpW3hdPT09dSl7dGhpcy5faHVsbFRyaVt4XT10O2JyZWFrfXg9dGhpcy5faHVsbFByZXZbeF19d2hpbGUoeCE9PXRoaXMuX2h1bGxTdGFydCl9dGhpcy5fbGluayh0LHcpLHRoaXMuX2xpbmsoYSxuW29dKSx0aGlzLl9saW5rKG8sdSk7Y29uc3QgYj1sKyhhKzEpJTM7cjxIci5sZW5ndGgmJihIcltyKytdPWIpfWVsc2V7aWYocj09PTApYnJlYWs7dD1IclstLXJdfX1yZXR1cm4gb31fbGluayh0LGUpe3RoaXMuX2hhbGZlZGdlc1t0XT1lLGUhPT0tMSYmKHRoaXMuX2hhbGZlZGdlc1tlXT10KX1fYWRkVHJpYW5nbGUodCxlLG4scyxyLG8pe2NvbnN0IGE9dGhpcy50cmlhbmdsZXNMZW47cmV0dXJuIHRoaXMuX3RyaWFuZ2xlc1thXT10LHRoaXMuX3RyaWFuZ2xlc1thKzFdPWUsdGhpcy5fdHJpYW5nbGVzW2ErMl09bix0aGlzLl9saW5rKGEscyksdGhpcy5fbGluayhhKzEsciksdGhpcy5fbGluayhhKzIsbyksdGhpcy50cmlhbmdsZXNMZW4rPTMsYX19ZnVuY3Rpb24gQW0oaSx0KXtjb25zdCBlPWkvKE1hdGguYWJzKGkpK01hdGguYWJzKHQpKTtyZXR1cm4odD4wPzMtZToxK2UpLzR9ZnVuY3Rpb24gdWMoaSx0LGUsbil7Y29uc3Qgcz1pLWUscj10LW47cmV0dXJuIHMqcytyKnJ9ZnVuY3Rpb24gU20oaSx0LGUsbixzLHIsbyxhKXtjb25zdCBjPWktbyxsPXQtYSxoPWUtbyx1PW4tYSxmPXMtbyxkPXItYSxwPWMqYytsKmwseT1oKmgrdSp1LGc9ZipmK2QqZDtyZXR1cm4gYyoodSpnLXkqZCktbCooaCpnLXkqZikrcCooaCpkLXUqZik8MH1mdW5jdGlvbiB2bShpLHQsZSxuLHMscil7Y29uc3Qgbz1lLWksYT1uLXQsYz1zLWksbD1yLXQsaD1vKm8rYSphLHU9YypjK2wqbCxmPS41LyhvKmwtYSpjKSxkPShsKmgtYSp1KSpmLHA9KG8qdS1jKmgpKmY7cmV0dXJuIGQqZCtwKnB9ZnVuY3Rpb24gX20oaSx0LGUsbixzLHIpe2NvbnN0IG89ZS1pLGE9bi10LGM9cy1pLGw9ci10LGg9bypvK2EqYSx1PWMqYytsKmwsZj0uNS8obypsLWEqYyksZD1pKyhsKmgtYSp1KSpmLHA9dCsobyp1LWMqaCkqZjtyZXR1cm57eDpkLHk6cH19ZnVuY3Rpb24gYmkoaSx0LGUsbil7aWYobi1lPD0yMClmb3IobGV0IHM9ZSsxO3M8PW47cysrKXtjb25zdCByPWlbc10sbz10W3JdO2xldCBhPXMtMTtmb3IoO2E+PWUmJnRbaVthXV0+bzspaVthKzFdPWlbYS0tXTtpW2ErMV09cn1lbHNle2NvbnN0IHM9ZStuPj4xO2xldCByPWUrMSxvPW47ZnMoaSxzLHIpLHRbaVtlXV0+dFtpW25dXSYmZnMoaSxlLG4pLHRbaVtyXV0+dFtpW25dXSYmZnMoaSxyLG4pLHRbaVtlXV0+dFtpW3JdXSYmZnMoaSxlLHIpO2NvbnN0IGE9aVtyXSxjPXRbYV07Zm9yKDs7KXtkbyByKys7d2hpbGUodFtpW3JdXTxjKTtkbyBvLS07d2hpbGUodFtpW29dXT5jKTtpZihvPHIpYnJlYWs7ZnMoaSxyLG8pfWlbZSsxXT1pW29dLGlbb109YSxuLXIrMT49by1lPyhiaShpLHQscixuKSxiaShpLHQsZSxvLTEpKTooYmkoaSx0LGUsby0xKSxiaShpLHQscixuKSl9fWZ1bmN0aW9uIGZzKGksdCxlKXtjb25zdCBuPWlbdF07aVt0XT1pW2VdLGlbZV09bn1mdW5jdGlvbiB6bShpKXtyZXR1cm4gaVswXX1mdW5jdGlvbiBUbShpKXtyZXR1cm4gaVsxXX1mdW5jdGlvbiBQbShpLHQpe3ZhciBlPTAsbj0wLHM9MCxyPTAsbz0wLGE9MCxjPTAsbD0wLGg9bnVsbCx1PW51bGwsZj1pWzBdLGQ9aVsxXSxwPXQubGVuZ3RoO2ZvcihlO2U8cDtlKyspe249MDt2YXIgeT10W2VdLmxlbmd0aC0xLGc9dFtlXTtpZihoPWdbMF0saFswXSE9PWdbeV1bMF0mJmhbMV0hPT1nW3ldWzFdKXRocm93IG5ldyBFcnJvcigiRmlyc3QgYW5kIGxhc3QgY29vcmRpbmF0ZXMgaW4gYSByaW5nIG11c3QgYmUgdGhlIHNhbWUiKTtmb3Iobz1oWzBdLWYsYT1oWzFdLWQsbjtuPHk7bisrKXtpZih1PWdbbisxXSxsPXVbMV0tZCxhPDAmJmw8MHx8YT4wJiZsPjApe2g9dSxhPWwsbz1oWzBdLWY7Y29udGludWV9aWYoYz11WzBdLWlbMF0sbD4wJiZhPD0wKXtpZihyPW8qbC1jKmEscj4wKXM9cysxO2Vsc2UgaWYocj09PTApcmV0dXJuIDB9ZWxzZSBpZihhPjAmJmw8PTApe2lmKHI9bypsLWMqYSxyPDApcz1zKzE7ZWxzZSBpZihyPT09MClyZXR1cm4gMH1lbHNlIGlmKGw9PT0wJiZhPDApe2lmKHI9bypsLWMqYSxyPT09MClyZXR1cm4gMH1lbHNlIGlmKGE9PT0wJiZsPDApe2lmKHI9bypsLWMqYSxyPT09MClyZXR1cm4gMH1lbHNlIGlmKGE9PT0wJiZsPT09MCl7aWYoYzw9MCYmbz49MClyZXR1cm4gMDtpZihvPD0wJiZjPj0wKXJldHVybiAwfWg9dSxhPWwsbz1jfX1yZXR1cm4gcyUyIT09MH1mdW5jdGlvbiBDbShpLHQsZT17fSl7aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJwb2ludCBpcyByZXF1aXJlZCIpO2lmKCF0KXRocm93IG5ldyBFcnJvcigicG9seWdvbiBpcyByZXF1aXJlZCIpO2NvbnN0IG49dW0oaSkscz1kbSh0KSxyPXMudHlwZSxvPXQuYmJveDtsZXQgYT1zLmNvb3JkaW5hdGVzO2lmKG8mJkVtKG4sbyk9PT0hMSlyZXR1cm4hMTtyPT09IlBvbHlnb24iJiYoYT1bYV0pO2xldCBjPSExO2Zvcih2YXIgbD0wO2w8YS5sZW5ndGg7KytsKXtjb25zdCBoPVBtKG4sYVtsXSk7aWYoaD09PTApcmV0dXJuIWUuaWdub3JlQm91bmRhcnk7aCYmKGM9ITApfXJldHVybiBjfWZ1bmN0aW9uIEVtKGksdCl7cmV0dXJuIHRbMF08PWlbMF0mJnRbMV08PWlbMV0mJnRbMl0+PWlbMF0mJnRbM10+PWlbMV19dmFyIEJtPUNtO2NvbnN0IFR1PTFlLTY7Y2xhc3MgUm57Y29uc3RydWN0b3IoKXt0aGlzLl94MD10aGlzLl95MD10aGlzLl94MT10aGlzLl95MT1udWxsLHRoaXMuXz0iIn1tb3ZlVG8odCxlKXt0aGlzLl8rPWBNJHt0aGlzLl94MD10aGlzLl94MT0rdH0sJHt0aGlzLl95MD10aGlzLl95MT0rZX1gfWNsb3NlUGF0aCgpe3RoaXMuX3gxIT09bnVsbCYmKHRoaXMuX3gxPXRoaXMuX3gwLHRoaXMuX3kxPXRoaXMuX3kwLHRoaXMuXys9IloiKX1saW5lVG8odCxlKXt0aGlzLl8rPWBMJHt0aGlzLl94MT0rdH0sJHt0aGlzLl95MT0rZX1gfWFyYyh0LGUsbil7dD0rdCxlPStlLG49K247Y29uc3Qgcz10K24scj1lO2lmKG48MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1cyIpO3RoaXMuX3gxPT09bnVsbD90aGlzLl8rPWBNJHtzfSwke3J9YDooTWF0aC5hYnModGhpcy5feDEtcyk+VHV8fE1hdGguYWJzKHRoaXMuX3kxLXIpPlR1KSYmKHRoaXMuXys9IkwiK3MrIiwiK3IpLG4mJih0aGlzLl8rPWBBJHtufSwke259LDAsMSwxLCR7dC1ufSwke2V9QSR7bn0sJHtufSwwLDEsMSwke3RoaXMuX3gxPXN9LCR7dGhpcy5feTE9cn1gKX1yZWN0KHQsZSxuLHMpe3RoaXMuXys9YE0ke3RoaXMuX3gwPXRoaXMuX3gxPSt0fSwke3RoaXMuX3kwPXRoaXMuX3kxPStlfWgkeytufXYkeytzfWgkey1ufVpgfXZhbHVlKCl7cmV0dXJuIHRoaXMuX3x8bnVsbH19Y2xhc3MgZmN7Y29uc3RydWN0b3IoKXt0aGlzLl89W119bW92ZVRvKHQsZSl7dGhpcy5fLnB1c2goW3QsZV0pfWNsb3NlUGF0aCgpe3RoaXMuXy5wdXNoKHRoaXMuX1swXS5zbGljZSgpKX1saW5lVG8odCxlKXt0aGlzLl8ucHVzaChbdCxlXSl9dmFsdWUoKXtyZXR1cm4gdGhpcy5fLmxlbmd0aD90aGlzLl86bnVsbH19Y2xhc3MgRm17Y29uc3RydWN0b3IodCxbZSxuLHMscl09WzAsMCw5NjAsNTAwXSl7aWYoISgocz0rcyk+PShlPStlKSl8fCEoKHI9K3IpPj0obj0rbikpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBib3VuZHMiKTt0aGlzLmRlbGF1bmF5PXQsdGhpcy5fY2lyY3VtY2VudGVycz1uZXcgRmxvYXQ2NEFycmF5KHQucG9pbnRzLmxlbmd0aCoyKSx0aGlzLnZlY3RvcnM9bmV3IEZsb2F0NjRBcnJheSh0LnBvaW50cy5sZW5ndGgqMiksdGhpcy54bWF4PXMsdGhpcy54bWluPWUsdGhpcy55bWF4PXIsdGhpcy55bWluPW4sdGhpcy5faW5pdCgpfXVwZGF0ZSgpe3JldHVybiB0aGlzLmRlbGF1bmF5LnVwZGF0ZSgpLHRoaXMuX2luaXQoKSx0aGlzfV9pbml0KCl7Y29uc3R7ZGVsYXVuYXk6e3BvaW50czp0LGh1bGw6ZSx0cmlhbmdsZXM6bn0sdmVjdG9yczpzfT10aGlzLHI9dGhpcy5jaXJjdW1jZW50ZXJzPXRoaXMuX2NpcmN1bWNlbnRlcnMuc3ViYXJyYXkoMCxuLmxlbmd0aC8zKjIpO2ZvcihsZXQgZD0wLHA9MCx5PW4ubGVuZ3RoLGcsdztkPHk7ZCs9MyxwKz0yKXtjb25zdCBiPW5bZF0qMix4PW5bZCsxXSoyLG09bltkKzJdKjIsTT10W2JdLFM9dFtiKzFdLEE9dFt4XSx2PXRbeCsxXSxfPXRbbV0sVD10W20rMV0sej1BLU0sQz12LVMsRT1fLU0sRj1ULVMsQj0oeipGLUMqRSkqMjtpZihNYXRoLmFicyhCKTwxZS05KXtsZXQgST0xZTk7Y29uc3QgUj1uWzBdKjI7SSo9TWF0aC5zaWduKCh0W1JdLU0pKkYtKHRbUisxXS1TKSpFKSxnPShNK18pLzItSSpGLHc9KFMrVCkvMitJKkV9ZWxzZXtjb25zdCBJPTEvQixSPXoqeitDKkMsVj1FKkUrRipGO2c9TSsoRipSLUMqVikqSSx3PVMrKHoqVi1FKlIpKkl9cltwXT1nLHJbcCsxXT13fWxldCBvPWVbZS5sZW5ndGgtMV0sYSxjPW8qNCxsLGg9dFsyKm9dLHUsZj10WzIqbysxXTtzLmZpbGwoMCk7Zm9yKGxldCBkPTA7ZDxlLmxlbmd0aDsrK2Qpbz1lW2RdLGE9YyxsPWgsdT1mLGM9byo0LGg9dFsyKm9dLGY9dFsyKm8rMV0sc1thKzJdPXNbY109dS1mLHNbYSszXT1zW2MrMV09aC1sfXJlbmRlcih0KXtjb25zdCBlPXQ9PW51bGw/dD1uZXcgUm46dm9pZCAwLHtkZWxhdW5heTp7aGFsZmVkZ2VzOm4saW5lZGdlczpzLGh1bGw6cn0sY2lyY3VtY2VudGVyczpvLHZlY3RvcnM6YX09dGhpcztpZihyLmxlbmd0aDw9MSlyZXR1cm4gbnVsbDtmb3IobGV0IGg9MCx1PW4ubGVuZ3RoO2g8dTsrK2gpe2NvbnN0IGY9bltoXTtpZihmPGgpY29udGludWU7Y29uc3QgZD1NYXRoLmZsb29yKGgvMykqMixwPU1hdGguZmxvb3IoZi8zKSoyLHk9b1tkXSxnPW9bZCsxXSx3PW9bcF0sYj1vW3ArMV07dGhpcy5fcmVuZGVyU2VnbWVudCh5LGcsdyxiLHQpfWxldCBjLGw9cltyLmxlbmd0aC0xXTtmb3IobGV0IGg9MDtoPHIubGVuZ3RoOysraCl7Yz1sLGw9cltoXTtjb25zdCB1PU1hdGguZmxvb3Ioc1tsXS8zKSoyLGY9b1t1XSxkPW9bdSsxXSxwPWMqNCx5PXRoaXMuX3Byb2plY3QoZixkLGFbcCsyXSxhW3ArM10pO3kmJnRoaXMuX3JlbmRlclNlZ21lbnQoZixkLHlbMF0seVsxXSx0KX1yZXR1cm4gZSYmZS52YWx1ZSgpfXJlbmRlckJvdW5kcyh0KXtjb25zdCBlPXQ9PW51bGw/dD1uZXcgUm46dm9pZCAwO3JldHVybiB0LnJlY3QodGhpcy54bWluLHRoaXMueW1pbix0aGlzLnhtYXgtdGhpcy54bWluLHRoaXMueW1heC10aGlzLnltaW4pLGUmJmUudmFsdWUoKX1yZW5kZXJDZWxsKHQsZSl7Y29uc3Qgbj1lPT1udWxsP2U9bmV3IFJuOnZvaWQgMCxzPXRoaXMuX2NsaXAodCk7aWYocz09PW51bGx8fCFzLmxlbmd0aClyZXR1cm47ZS5tb3ZlVG8oc1swXSxzWzFdKTtsZXQgcj1zLmxlbmd0aDtmb3IoO3NbMF09PT1zW3ItMl0mJnNbMV09PT1zW3ItMV0mJnI+MTspci09Mjtmb3IobGV0IG89MjtvPHI7bys9Mikoc1tvXSE9PXNbby0yXXx8c1tvKzFdIT09c1tvLTFdKSYmZS5saW5lVG8oc1tvXSxzW28rMV0pO3JldHVybiBlLmNsb3NlUGF0aCgpLG4mJm4udmFsdWUoKX0qY2VsbFBvbHlnb25zKCl7Y29uc3R7ZGVsYXVuYXk6e3BvaW50czp0fX09dGhpcztmb3IobGV0IGU9MCxuPXQubGVuZ3RoLzI7ZTxuOysrZSl7Y29uc3Qgcz10aGlzLmNlbGxQb2x5Z29uKGUpO3MmJihzLmluZGV4PWUseWllbGQgcyl9fWNlbGxQb2x5Z29uKHQpe2NvbnN0IGU9bmV3IGZjO3JldHVybiB0aGlzLnJlbmRlckNlbGwodCxlKSxlLnZhbHVlKCl9X3JlbmRlclNlZ21lbnQodCxlLG4scyxyKXtsZXQgbztjb25zdCBhPXRoaXMuX3JlZ2lvbmNvZGUodCxlKSxjPXRoaXMuX3JlZ2lvbmNvZGUobixzKTthPT09MCYmYz09PTA/KHIubW92ZVRvKHQsZSksci5saW5lVG8obixzKSk6KG89dGhpcy5fY2xpcFNlZ21lbnQodCxlLG4scyxhLGMpKSYmKHIubW92ZVRvKG9bMF0sb1sxXSksci5saW5lVG8ob1syXSxvWzNdKSl9Y29udGFpbnModCxlLG4pe3JldHVybiBlPStlLGUhPT1lfHwobj0rbixuIT09bik/ITE6dGhpcy5kZWxhdW5heS5fc3RlcCh0LGUsbik9PT10fSpuZWlnaGJvcnModCl7Y29uc3QgZT10aGlzLl9jbGlwKHQpO2lmKGUpZm9yKGNvbnN0IG4gb2YgdGhpcy5kZWxhdW5heS5uZWlnaGJvcnModCkpe2NvbnN0IHM9dGhpcy5fY2xpcChuKTtpZihzKXt0OmZvcihsZXQgcj0wLG89ZS5sZW5ndGg7cjxvO3IrPTIpZm9yKGxldCBhPTAsYz1zLmxlbmd0aDthPGM7YSs9MilpZihlW3JdPT1zW2FdJiZlW3IrMV09PXNbYSsxXSYmZVsocisyKSVvXT09c1soYStjLTIpJWNdJiZlWyhyKzMpJW9dPT1zWyhhK2MtMSklY10pe3lpZWxkIG47YnJlYWsgdH19fX1fY2VsbCh0KXtjb25zdHtjaXJjdW1jZW50ZXJzOmUsZGVsYXVuYXk6e2luZWRnZXM6bixoYWxmZWRnZXM6cyx0cmlhbmdsZXM6cn19PXRoaXMsbz1uW3RdO2lmKG89PT0tMSlyZXR1cm4gbnVsbDtjb25zdCBhPVtdO2xldCBjPW87ZG97Y29uc3QgbD1NYXRoLmZsb29yKGMvMyk7aWYoYS5wdXNoKGVbbCoyXSxlW2wqMisxXSksYz1jJTM9PT0yP2MtMjpjKzEscltjXSE9PXQpYnJlYWs7Yz1zW2NdfXdoaWxlKGMhPT1vJiZjIT09LTEpO3JldHVybiBhfV9jbGlwKHQpe2lmKHQ9PT0wJiZ0aGlzLmRlbGF1bmF5Lmh1bGwubGVuZ3RoPT09MSlyZXR1cm5bdGhpcy54bWF4LHRoaXMueW1pbix0aGlzLnhtYXgsdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1pbl07Y29uc3QgZT10aGlzLl9jZWxsKHQpO2lmKGU9PT1udWxsKXJldHVybiBudWxsO2NvbnN0e3ZlY3RvcnM6bn09dGhpcyxzPXQqNDtyZXR1cm4gbltzXXx8bltzKzFdP3RoaXMuX2NsaXBJbmZpbml0ZSh0LGUsbltzXSxuW3MrMV0sbltzKzJdLG5bcyszXSk6dGhpcy5fY2xpcEZpbml0ZSh0LGUpfV9jbGlwRmluaXRlKHQsZSl7Y29uc3Qgbj1lLmxlbmd0aDtsZXQgcz1udWxsLHIsbyxhPWVbbi0yXSxjPWVbbi0xXSxsLGg9dGhpcy5fcmVnaW9uY29kZShhLGMpLHUsZj0wO2ZvcihsZXQgZD0wO2Q8bjtkKz0yKWlmKHI9YSxvPWMsYT1lW2RdLGM9ZVtkKzFdLGw9aCxoPXRoaXMuX3JlZ2lvbmNvZGUoYSxjKSxsPT09MCYmaD09PTApdT1mLGY9MCxzP3MucHVzaChhLGMpOnM9W2EsY107ZWxzZXtsZXQgcCx5LGcsdyxiO2lmKGw9PT0wKXtpZigocD10aGlzLl9jbGlwU2VnbWVudChyLG8sYSxjLGwsaCkpPT09bnVsbCljb250aW51ZTtbeSxnLHcsYl09cH1lbHNle2lmKChwPXRoaXMuX2NsaXBTZWdtZW50KGEsYyxyLG8saCxsKSk9PT1udWxsKWNvbnRpbnVlO1t3LGIseSxnXT1wLHU9ZixmPXRoaXMuX2VkZ2Vjb2RlKHksZyksdSYmZiYmdGhpcy5fZWRnZSh0LHUsZixzLHMubGVuZ3RoKSxzP3MucHVzaCh5LGcpOnM9W3ksZ119dT1mLGY9dGhpcy5fZWRnZWNvZGUodyxiKSx1JiZmJiZ0aGlzLl9lZGdlKHQsdSxmLHMscy5sZW5ndGgpLHM/cy5wdXNoKHcsYik6cz1bdyxiXX1pZihzKXU9ZixmPXRoaXMuX2VkZ2Vjb2RlKHNbMF0sc1sxXSksdSYmZiYmdGhpcy5fZWRnZSh0LHUsZixzLHMubGVuZ3RoKTtlbHNlIGlmKHRoaXMuY29udGFpbnModCwodGhpcy54bWluK3RoaXMueG1heCkvMiwodGhpcy55bWluK3RoaXMueW1heCkvMikpcmV0dXJuW3RoaXMueG1heCx0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltaW5dO3JldHVybiBzfV9jbGlwU2VnbWVudCh0LGUsbixzLHIsbyl7Zm9yKDs7KXtpZihyPT09MCYmbz09PTApcmV0dXJuW3QsZSxuLHNdO2lmKHImbylyZXR1cm4gbnVsbDtsZXQgYSxjLGw9cnx8bztsJjg/KGE9dCsobi10KSoodGhpcy55bWF4LWUpLyhzLWUpLGM9dGhpcy55bWF4KTpsJjQ/KGE9dCsobi10KSoodGhpcy55bWluLWUpLyhzLWUpLGM9dGhpcy55bWluKTpsJjI/KGM9ZSsocy1lKSoodGhpcy54bWF4LXQpLyhuLXQpLGE9dGhpcy54bWF4KTooYz1lKyhzLWUpKih0aGlzLnhtaW4tdCkvKG4tdCksYT10aGlzLnhtaW4pLHI/KHQ9YSxlPWMscj10aGlzLl9yZWdpb25jb2RlKHQsZSkpOihuPWEscz1jLG89dGhpcy5fcmVnaW9uY29kZShuLHMpKX19X2NsaXBJbmZpbml0ZSh0LGUsbixzLHIsbyl7bGV0IGE9QXJyYXkuZnJvbShlKSxjO2lmKChjPXRoaXMuX3Byb2plY3QoYVswXSxhWzFdLG4scykpJiZhLnVuc2hpZnQoY1swXSxjWzFdKSwoYz10aGlzLl9wcm9qZWN0KGFbYS5sZW5ndGgtMl0sYVthLmxlbmd0aC0xXSxyLG8pKSYmYS5wdXNoKGNbMF0sY1sxXSksYT10aGlzLl9jbGlwRmluaXRlKHQsYSkpZm9yKGxldCBsPTAsaD1hLmxlbmd0aCx1LGY9dGhpcy5fZWRnZWNvZGUoYVtoLTJdLGFbaC0xXSk7bDxoO2wrPTIpdT1mLGY9dGhpcy5fZWRnZWNvZGUoYVtsXSxhW2wrMV0pLHUmJmYmJihsPXRoaXMuX2VkZ2UodCx1LGYsYSxsKSxoPWEubGVuZ3RoKTtlbHNlIHRoaXMuY29udGFpbnModCwodGhpcy54bWluK3RoaXMueG1heCkvMiwodGhpcy55bWluK3RoaXMueW1heCkvMikmJihhPVt0aGlzLnhtaW4sdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWF4XSk7cmV0dXJuIGF9X2VkZ2UodCxlLG4scyxyKXtmb3IoO2UhPT1uOyl7bGV0IG8sYTtzd2l0Y2goZSl7Y2FzZSA1OmU9NDtjb250aW51ZTtjYXNlIDQ6ZT02LG89dGhpcy54bWF4LGE9dGhpcy55bWluO2JyZWFrO2Nhc2UgNjplPTI7Y29udGludWU7Y2FzZSAyOmU9MTAsbz10aGlzLnhtYXgsYT10aGlzLnltYXg7YnJlYWs7Y2FzZSAxMDplPTg7Y29udGludWU7Y2FzZSA4OmU9OSxvPXRoaXMueG1pbixhPXRoaXMueW1heDticmVhaztjYXNlIDk6ZT0xO2NvbnRpbnVlO2Nhc2UgMTplPTUsbz10aGlzLnhtaW4sYT10aGlzLnltaW47YnJlYWt9KHNbcl0hPT1vfHxzW3IrMV0hPT1hKSYmdGhpcy5jb250YWlucyh0LG8sYSkmJihzLnNwbGljZShyLDAsbyxhKSxyKz0yKX1pZihzLmxlbmd0aD40KWZvcihsZXQgbz0wO288cy5sZW5ndGg7bys9Mil7Y29uc3QgYT0obysyKSVzLmxlbmd0aCxjPShvKzQpJXMubGVuZ3RoOyhzW29dPT09c1thXSYmc1thXT09PXNbY118fHNbbysxXT09PXNbYSsxXSYmc1thKzFdPT09c1tjKzFdKSYmKHMuc3BsaWNlKGEsMiksby09Mil9cmV0dXJuIHJ9X3Byb2plY3QodCxlLG4scyl7bGV0IHI9MS8wLG8sYSxjO2lmKHM8MCl7aWYoZTw9dGhpcy55bWluKXJldHVybiBudWxsOyhvPSh0aGlzLnltaW4tZSkvcyk8ciYmKGM9dGhpcy55bWluLGE9dCsocj1vKSpuKX1lbHNlIGlmKHM+MCl7aWYoZT49dGhpcy55bWF4KXJldHVybiBudWxsOyhvPSh0aGlzLnltYXgtZSkvcyk8ciYmKGM9dGhpcy55bWF4LGE9dCsocj1vKSpuKX1pZihuPjApe2lmKHQ+PXRoaXMueG1heClyZXR1cm4gbnVsbDsobz0odGhpcy54bWF4LXQpL24pPHImJihhPXRoaXMueG1heCxjPWUrKHI9bykqcyl9ZWxzZSBpZihuPDApe2lmKHQ8PXRoaXMueG1pbilyZXR1cm4gbnVsbDsobz0odGhpcy54bWluLXQpL24pPHImJihhPXRoaXMueG1pbixjPWUrKHI9bykqcyl9cmV0dXJuW2EsY119X2VkZ2Vjb2RlKHQsZSl7cmV0dXJuKHQ9PT10aGlzLnhtaW4/MTp0PT09dGhpcy54bWF4PzI6MCl8KGU9PT10aGlzLnltaW4/NDplPT09dGhpcy55bWF4Pzg6MCl9X3JlZ2lvbmNvZGUodCxlKXtyZXR1cm4odDx0aGlzLnhtaW4/MTp0PnRoaXMueG1heD8yOjApfChlPHRoaXMueW1pbj80OmU+dGhpcy55bWF4Pzg6MCl9fWNvbnN0IEltPTIqTWF0aC5QSSxNaT1NYXRoLnBvdztmdW5jdGlvbiBrbShpKXtyZXR1cm4gaVswXX1mdW5jdGlvbiBObShpKXtyZXR1cm4gaVsxXX1mdW5jdGlvbiBSbShpKXtjb25zdHt0cmlhbmdsZXM6dCxjb29yZHM6ZX09aTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rPTMpe2NvbnN0IHM9Mip0W25dLHI9Mip0W24rMV0sbz0yKnRbbisyXTtpZigoZVtvXS1lW3NdKSooZVtyKzFdLWVbcysxXSktKGVbcl0tZVtzXSkqKGVbbysxXS1lW3MrMV0pPjFlLTEwKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIExtKGksdCxlKXtyZXR1cm5baStNYXRoLnNpbihpK3QpKmUsdCtNYXRoLmNvcyhpLXQpKmVdfWNsYXNzIGRje3N0YXRpYyBmcm9tKHQsZT1rbSxuPU5tLHMpe3JldHVybiBuZXcgZGMoImxlbmd0aCJpbiB0P09tKHQsZSxuLHMpOkZsb2F0NjRBcnJheS5mcm9tKERtKHQsZSxuLHMpKSl9Y29uc3RydWN0b3IodCl7dGhpcy5fZGVsYXVuYXRvcj1uZXcgdXModCksdGhpcy5pbmVkZ2VzPW5ldyBJbnQzMkFycmF5KHQubGVuZ3RoLzIpLHRoaXMuX2h1bGxJbmRleD1uZXcgSW50MzJBcnJheSh0Lmxlbmd0aC8yKSx0aGlzLnBvaW50cz10aGlzLl9kZWxhdW5hdG9yLmNvb3Jkcyx0aGlzLl9pbml0KCl9dXBkYXRlKCl7cmV0dXJuIHRoaXMuX2RlbGF1bmF0b3IudXBkYXRlKCksdGhpcy5faW5pdCgpLHRoaXN9X2luaXQoKXtjb25zdCB0PXRoaXMuX2RlbGF1bmF0b3IsZT10aGlzLnBvaW50cztpZih0Lmh1bGwmJnQuaHVsbC5sZW5ndGg+MiYmUm0odCkpe3RoaXMuY29sbGluZWFyPUludDMyQXJyYXkuZnJvbSh7bGVuZ3RoOmUubGVuZ3RoLzJ9LChmLGQpPT5kKS5zb3J0KChmLGQpPT5lWzIqZl0tZVsyKmRdfHxlWzIqZisxXS1lWzIqZCsxXSk7Y29uc3QgYz10aGlzLmNvbGxpbmVhclswXSxsPXRoaXMuY29sbGluZWFyW3RoaXMuY29sbGluZWFyLmxlbmd0aC0xXSxoPVtlWzIqY10sZVsyKmMrMV0sZVsyKmxdLGVbMipsKzFdXSx1PTFlLTgqTWF0aC5oeXBvdChoWzNdLWhbMV0saFsyXS1oWzBdKTtmb3IobGV0IGY9MCxkPWUubGVuZ3RoLzI7ZjxkOysrZil7Y29uc3QgcD1MbShlWzIqZl0sZVsyKmYrMV0sdSk7ZVsyKmZdPXBbMF0sZVsyKmYrMV09cFsxXX10aGlzLl9kZWxhdW5hdG9yPW5ldyB1cyhlKX1lbHNlIGRlbGV0ZSB0aGlzLmNvbGxpbmVhcjtjb25zdCBuPXRoaXMuaGFsZmVkZ2VzPXRoaXMuX2RlbGF1bmF0b3IuaGFsZmVkZ2VzLHM9dGhpcy5odWxsPXRoaXMuX2RlbGF1bmF0b3IuaHVsbCxyPXRoaXMudHJpYW5nbGVzPXRoaXMuX2RlbGF1bmF0b3IudHJpYW5nbGVzLG89dGhpcy5pbmVkZ2VzLmZpbGwoLTEpLGE9dGhpcy5faHVsbEluZGV4LmZpbGwoLTEpO2ZvcihsZXQgYz0wLGw9bi5sZW5ndGg7YzxsOysrYyl7Y29uc3QgaD1yW2MlMz09PTI/Yy0yOmMrMV07KG5bY109PT0tMXx8b1toXT09PS0xKSYmKG9baF09Yyl9Zm9yKGxldCBjPTAsbD1zLmxlbmd0aDtjPGw7KytjKWFbc1tjXV09YztzLmxlbmd0aDw9MiYmcy5sZW5ndGg+MCYmKHRoaXMudHJpYW5nbGVzPW5ldyBJbnQzMkFycmF5KDMpLmZpbGwoLTEpLHRoaXMuaGFsZmVkZ2VzPW5ldyBJbnQzMkFycmF5KDMpLmZpbGwoLTEpLHRoaXMudHJpYW5nbGVzWzBdPXNbMF0sb1tzWzBdXT0xLHMubGVuZ3RoPT09MiYmKG9bc1sxXV09MCx0aGlzLnRyaWFuZ2xlc1sxXT1zWzFdLHRoaXMudHJpYW5nbGVzWzJdPXNbMV0pKX12b3Jvbm9pKHQpe3JldHVybiBuZXcgRm0odGhpcyx0KX0qbmVpZ2hib3JzKHQpe2NvbnN0e2luZWRnZXM6ZSxodWxsOm4sX2h1bGxJbmRleDpzLGhhbGZlZGdlczpyLHRyaWFuZ2xlczpvLGNvbGxpbmVhcjphfT10aGlzO2lmKGEpe2NvbnN0IHU9YS5pbmRleE9mKHQpO3U+MCYmKHlpZWxkIGFbdS0xXSksdTxhLmxlbmd0aC0xJiYoeWllbGQgYVt1KzFdKTtyZXR1cm59Y29uc3QgYz1lW3RdO2lmKGM9PT0tMSlyZXR1cm47bGV0IGw9YyxoPS0xO2Rve2lmKHlpZWxkIGg9b1tsXSxsPWwlMz09PTI/bC0yOmwrMSxvW2xdIT09dClyZXR1cm47aWYobD1yW2xdLGw9PT0tMSl7Y29uc3QgdT1uWyhzW3RdKzEpJW4ubGVuZ3RoXTt1IT09aCYmKHlpZWxkIHUpO3JldHVybn19d2hpbGUobCE9PWMpfWZpbmQodCxlLG49MCl7aWYodD0rdCx0IT09dHx8KGU9K2UsZSE9PWUpKXJldHVybi0xO2NvbnN0IHM9bjtsZXQgcjtmb3IoOyhyPXRoaXMuX3N0ZXAobix0LGUpKT49MCYmciE9PW4mJnIhPT1zOyluPXI7cmV0dXJuIHJ9X3N0ZXAodCxlLG4pe2NvbnN0e2luZWRnZXM6cyxodWxsOnIsX2h1bGxJbmRleDpvLGhhbGZlZGdlczphLHRyaWFuZ2xlczpjLHBvaW50czpsfT10aGlzO2lmKHNbdF09PT0tMXx8IWwubGVuZ3RoKXJldHVybih0KzEpJShsLmxlbmd0aD4+MSk7bGV0IGg9dCx1PU1pKGUtbFt0KjJdLDIpK01pKG4tbFt0KjIrMV0sMik7Y29uc3QgZj1zW3RdO2xldCBkPWY7ZG97bGV0IHA9Y1tkXTtjb25zdCB5PU1pKGUtbFtwKjJdLDIpK01pKG4tbFtwKjIrMV0sMik7aWYoeTx1JiYodT15LGg9cCksZD1kJTM9PT0yP2QtMjpkKzEsY1tkXSE9PXQpYnJlYWs7aWYoZD1hW2RdLGQ9PT0tMSl7aWYoZD1yWyhvW3RdKzEpJXIubGVuZ3RoXSxkIT09cCYmTWkoZS1sW2QqMl0sMikrTWkobi1sW2QqMisxXSwyKTx1KXJldHVybiBkO2JyZWFrfX13aGlsZShkIT09Zik7cmV0dXJuIGh9cmVuZGVyKHQpe2NvbnN0IGU9dD09bnVsbD90PW5ldyBSbjp2b2lkIDAse3BvaW50czpuLGhhbGZlZGdlczpzLHRyaWFuZ2xlczpyfT10aGlzO2ZvcihsZXQgbz0wLGE9cy5sZW5ndGg7bzxhOysrbyl7Y29uc3QgYz1zW29dO2lmKGM8byljb250aW51ZTtjb25zdCBsPXJbb10qMixoPXJbY10qMjt0Lm1vdmVUbyhuW2xdLG5bbCsxXSksdC5saW5lVG8obltoXSxuW2grMV0pfXJldHVybiB0aGlzLnJlbmRlckh1bGwodCksZSYmZS52YWx1ZSgpfXJlbmRlclBvaW50cyh0LGUpe2U9PT12b2lkIDAmJighdHx8dHlwZW9mIHQubW92ZVRvIT0iZnVuY3Rpb24iKSYmKGU9dCx0PW51bGwpLGU9ZT09bnVsbD8yOitlO2NvbnN0IG49dD09bnVsbD90PW5ldyBSbjp2b2lkIDAse3BvaW50czpzfT10aGlzO2ZvcihsZXQgcj0wLG89cy5sZW5ndGg7cjxvO3IrPTIpe2NvbnN0IGE9c1tyXSxjPXNbcisxXTt0Lm1vdmVUbyhhK2UsYyksdC5hcmMoYSxjLGUsMCxJbSl9cmV0dXJuIG4mJm4udmFsdWUoKX1yZW5kZXJIdWxsKHQpe2NvbnN0IGU9dD09bnVsbD90PW5ldyBSbjp2b2lkIDAse2h1bGw6bixwb2ludHM6c309dGhpcyxyPW5bMF0qMixvPW4ubGVuZ3RoO3QubW92ZVRvKHNbcl0sc1tyKzFdKTtmb3IobGV0IGE9MTthPG87KythKXtjb25zdCBjPTIqblthXTt0LmxpbmVUbyhzW2NdLHNbYysxXSl9cmV0dXJuIHQuY2xvc2VQYXRoKCksZSYmZS52YWx1ZSgpfWh1bGxQb2x5Z29uKCl7Y29uc3QgdD1uZXcgZmM7cmV0dXJuIHRoaXMucmVuZGVySHVsbCh0KSx0LnZhbHVlKCl9cmVuZGVyVHJpYW5nbGUodCxlKXtjb25zdCBuPWU9PW51bGw/ZT1uZXcgUm46dm9pZCAwLHtwb2ludHM6cyx0cmlhbmdsZXM6cn09dGhpcyxvPXJbdCo9M10qMixhPXJbdCsxXSoyLGM9clt0KzJdKjI7cmV0dXJuIGUubW92ZVRvKHNbb10sc1tvKzFdKSxlLmxpbmVUbyhzW2FdLHNbYSsxXSksZS5saW5lVG8oc1tjXSxzW2MrMV0pLGUuY2xvc2VQYXRoKCksbiYmbi52YWx1ZSgpfSp0cmlhbmdsZVBvbHlnb25zKCl7Y29uc3R7dHJpYW5nbGVzOnR9PXRoaXM7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aC8zO2U8bjsrK2UpeWllbGQgdGhpcy50cmlhbmdsZVBvbHlnb24oZSl9dHJpYW5nbGVQb2x5Z29uKHQpe2NvbnN0IGU9bmV3IGZjO3JldHVybiB0aGlzLnJlbmRlclRyaWFuZ2xlKHQsZSksZS52YWx1ZSgpfX1mdW5jdGlvbiBPbShpLHQsZSxuKXtjb25zdCBzPWkubGVuZ3RoLHI9bmV3IEZsb2F0NjRBcnJheShzKjIpO2ZvcihsZXQgbz0wO288czsrK28pe2NvbnN0IGE9aVtvXTtyW28qMl09dC5jYWxsKG4sYSxvLGkpLHJbbyoyKzFdPWUuY2FsbChuLGEsbyxpKX1yZXR1cm4gcn1mdW5jdGlvbipEbShpLHQsZSxuKXtsZXQgcz0wO2Zvcihjb25zdCByIG9mIGkpeWllbGQgdC5jYWxsKG4scixzLGkpLHlpZWxkIGUuY2FsbChuLHIscyxpKSwrK3N9Y29uc3QgcGM9TWF0aC5QSSxQdT1wYy8yLEN1PTE4MC9wYyxFdT1wYy8xODAsJG09TWF0aC5hdGFuMixCdT1NYXRoLmNvcyxWbT1NYXRoLm1heCxVbT1NYXRoLm1pbixGdT1NYXRoLnNpbixxbT1NYXRoLnNpZ258fGZ1bmN0aW9uKGkpe3JldHVybiBpPjA/MTppPDA/LTE6MH0sSXU9TWF0aC5zcXJ0O2Z1bmN0aW9uIFhtKGkpe3JldHVybiBpPjE/UHU6aTwtMT8tUHU6TWF0aC5hc2luKGkpfWZ1bmN0aW9uIGt1KGksdCl7cmV0dXJuIGlbMF0qdFswXStpWzFdKnRbMV0raVsyXSp0WzJdfWZ1bmN0aW9uIEt0KGksdCl7cmV0dXJuW2lbMV0qdFsyXS1pWzJdKnRbMV0saVsyXSp0WzBdLWlbMF0qdFsyXSxpWzBdKnRbMV0taVsxXSp0WzBdXX1mdW5jdGlvbiBKcihpLHQpe3JldHVybltpWzBdK3RbMF0saVsxXSt0WzFdLGlbMl0rdFsyXV19ZnVuY3Rpb24gWXIoaSl7dmFyIHQ9SXUoaVswXSppWzBdK2lbMV0qaVsxXStpWzJdKmlbMl0pO3JldHVybltpWzBdL3QsaVsxXS90LGlbMl0vdF19ZnVuY3Rpb24geWMoaSl7cmV0dXJuWyRtKGlbMV0saVswXSkqQ3UsWG0oVm0oLTEsVW0oMSxpWzJdKSkpKkN1XX1mdW5jdGlvbiB6ZShpKXtjb25zdCB0PWlbMF0qRXUsZT1pWzFdKkV1LG49QnUoZSk7cmV0dXJuW24qQnUodCksbipGdSh0KSxGdShlKV19ZnVuY3Rpb24gbWMoaSl7cmV0dXJuIGk9aS5tYXAodD0+emUodCkpLGt1KGlbMF0sS3QoaVsyXSxpWzFdKSl9ZnVuY3Rpb24gWm0oaSl7Y29uc3QgdD1XbShpKSxlPUptKHQpLG49SG0oZSxpKSxzPWptKGUsaS5sZW5ndGgpLHI9R20ocyxpKSxvPVltKGUsaSkse3BvbHlnb25zOmEsY2VudGVyczpjfT1RbShvLGUsaSksbD1LbShhKSxoPWVnKGUsaSksdT10ZyhuLGUpO3JldHVybntkZWxhdW5heTp0LGVkZ2VzOm4sdHJpYW5nbGVzOmUsY2VudGVyczpjLG5laWdoYm9yczpzLHBvbHlnb25zOmEsbWVzaDpsLGh1bGw6aCx1cnF1aGFydDp1LGZpbmQ6cn19ZnVuY3Rpb24gR20oaSx0KXtmdW5jdGlvbiBlKG4scyl7bGV0IHI9blswXS1zWzBdLG89blsxXS1zWzFdLGE9blsyXS1zWzJdO3JldHVybiByKnIrbypvK2EqYX1yZXR1cm4gZnVuY3Rpb24ocyxyLG8pe289PT12b2lkIDAmJihvPTApO2xldCBhLGMsbD1vO2NvbnN0IGg9emUoW3Mscl0pO2RvIGE9byxvPW51bGwsYz1lKGgsemUodFthXSkpLGlbYV0uZm9yRWFjaCh1PT57bGV0IGY9ZShoLHplKHRbdV0pKTtpZihmPGMpe2M9ZixvPXUsbD11O3JldHVybn19KTt3aGlsZShvIT09bnVsbCk7cmV0dXJuIGx9fWZ1bmN0aW9uIFdtKGkpe2lmKGkubGVuZ3RoPDIpcmV0dXJue307bGV0IHQ9MDtmb3IoO2lzTmFOKGlbdF1bMF0raVt0XVsxXSkmJnQrKzxpLmxlbmd0aDspO2NvbnN0IGU9WmgoaVt0XSksbj1PeSgpLnRyYW5zbGF0ZShbMCwwXSkuc2NhbGUoMSkucm90YXRlKGUuaW52ZXJ0KFsxODAsMF0pKTtpPWkubWFwKG4pO2NvbnN0IHM9W107bGV0IHI9MTtmb3IobGV0IHU9MCxmPWkubGVuZ3RoO3U8Zjt1Kyspe2xldCBkPXppKGlbdV1bMF0sMikremkoaVt1XVsxXSwyKTshaXNGaW5pdGUoZCl8fGQ+MWUzMj9zLnB1c2godSk6ZD5yJiYocj1kKX1jb25zdCBvPTFlNipJdShyKTtzLmZvckVhY2godT0+aVt1XT1bbywwXSksaS5wdXNoKFswLG9dKSxpLnB1c2goWy1vLDBdKSxpLnB1c2goWzAsLW9dKTtjb25zdCBhPWRjLmZyb20oaSk7YS5wcm9qZWN0aW9uPW47Y29uc3R7dHJpYW5nbGVzOmMsaGFsZmVkZ2VzOmwsaW5lZGdlczpofT1hO2ZvcihsZXQgdT0wLGY9bC5sZW5ndGg7dTxmO3UrKylpZihsW3VdPDApe2NvbnN0IGQ9dSUzPT0yP3UtMjp1KzEscD11JTM9PTA/dSsyOnUtMSx5PWxbZF0sZz1sW3BdO2xbeV09ZyxsW2ddPXksbFtkXT1sW3BdPS0xLGNbdV09Y1tkXT1jW3BdPXQsaFtjW3ldXT15JTM9PTA/eSsyOnktMSxoW2NbZ11dPWclMz09MD9nKzI6Zy0xLHUrPTItdSUzfWVsc2UgY1t1XT5pLmxlbmd0aC0zLTEmJihjW3VdPXQpO3JldHVybiBhfWZ1bmN0aW9uIEhtKGksdCl7Y29uc3QgZT1uZXcgU2V0O3JldHVybiB0Lmxlbmd0aD09PTI/W1swLDFdXTooaS5mb3JFYWNoKG49PntpZihuWzBdIT09blsxXSYmIShtYyhuLm1hcChzPT50W3NdKSk8MCkpZm9yKGxldCBzPTAscjtzPDM7cysrKXI9KHMrMSklMyxlLmFkZCh5cihbbltzXSxuW3JdXSkuam9pbigiLSIpKX0pLEFycmF5LmZyb20oZSxuPT5uLnNwbGl0KCItIikubWFwKE51bWJlcikpKX1mdW5jdGlvbiBKbShpKXtjb25zdHt0cmlhbmdsZXM6dH09aTtpZighdClyZXR1cm5bXTtjb25zdCBlPVtdO2ZvcihsZXQgbj0wLHM9dC5sZW5ndGgvMztuPHM7bisrKXtjb25zdCByPXRbMypuXSxvPXRbMypuKzFdLGE9dFszKm4rMl07ciE9PW8mJm8hPT1hJiZlLnB1c2goW3IsYSxvXSl9cmV0dXJuIGV9ZnVuY3Rpb24gWW0oaSx0KXtyZXR1cm4gaS5tYXAoZT0+e2NvbnN0IG49ZS5tYXAocj0+dFtyXSkubWFwKHplKSxzPUpyKEpyKEt0KG5bMV0sblswXSksS3QoblsyXSxuWzFdKSksS3QoblswXSxuWzJdKSk7cmV0dXJuIHljKFlyKHMpKX0pfWZ1bmN0aW9uIGptKGksdCl7Y29uc3QgZT1bXTtyZXR1cm4gaS5mb3JFYWNoKG49Pntmb3IobGV0IHM9MDtzPDM7cysrKXtjb25zdCByPW5bc10sbz1uWyhzKzEpJTNdO2Vbcl09ZVtyXXx8W10sZVtyXS5wdXNoKG8pfX0pLGkubGVuZ3RoPT09MCYmKHQ9PT0yPyhlWzBdPVsxXSxlWzFdPVswXSk6dD09PTEmJihlWzBdPVtdKSksZX1mdW5jdGlvbiBRbShpLHQsZSl7Y29uc3Qgbj1bXSxzPWkuc2xpY2UoKTtpZih0Lmxlbmd0aD09PTApe2lmKGUubGVuZ3RoPDIpcmV0dXJue3BvbHlnb25zOm4sY2VudGVyczpzfTtpZihlLmxlbmd0aD09PTIpe2NvbnN0IGE9emUoZVswXSksYz16ZShlWzFdKSxsPVlyKEpyKGEsYykpLGg9WXIoS3QoYSxjKSksdT1LdChsLGgpLGY9W2wsS3QobCx1KSxLdChLdChsLHUpLHUpLEt0KEt0KEt0KGwsdSksdSksdSldLm1hcCh5YykubWFwKG8pO3JldHVybiBuLnB1c2goZiksbi5wdXNoKGYuc2xpY2UoKS5yZXZlcnNlKCkpLHtwb2x5Z29uczpuLGNlbnRlcnM6c319fXQuZm9yRWFjaCgoYSxjKT0+e2ZvcihsZXQgbD0wO2w8MztsKyspe2NvbnN0IGg9YVtsXSx1PWFbKGwrMSklM10sZj1hWyhsKzIpJTNdO25baF09bltoXXx8W10sbltoXS5wdXNoKFt1LGYsYyxbaCx1LGZdXSl9fSk7Y29uc3Qgcj1uLm1hcChhPT57Y29uc3QgYz1bYVswXVsyXV07bGV0IGw9YVswXVsxXTtmb3IobGV0IGg9MTtoPGEubGVuZ3RoO2grKylmb3IobGV0IHU9MDt1PGEubGVuZ3RoO3UrKylpZihhW3VdWzBdPT1sKXtsPWFbdV1bMV0sYy5wdXNoKGFbdV1bMl0pO2JyZWFrfWlmKGMubGVuZ3RoPjIpcmV0dXJuIGM7aWYoYy5sZW5ndGg9PTIpe2NvbnN0IGg9TnUoZVthWzBdWzNdWzBdXSxlW2FbMF1bM11bMV1dLHNbY1swXV0pLHU9TnUoZVthWzBdWzNdWzJdXSxlW2FbMF1bM11bMF1dLHNbY1swXV0pLGY9byhoKSxkPW8odSk7cmV0dXJuW2NbMF0sZCxjWzFdLGZdfX0pO2Z1bmN0aW9uIG8oYSl7bGV0IGM9LTE7cmV0dXJuIHMuc2xpY2UodC5sZW5ndGgsMS8wKS5mb3JFYWNoKChsLGgpPT57bFswXT09PWFbMF0mJmxbMV09PT1hWzFdJiYoYz1oK3QubGVuZ3RoKX0pLGM8MCYmKGM9cy5sZW5ndGgscy5wdXNoKGEpKSxjfXJldHVybntwb2x5Z29uczpyLGNlbnRlcnM6c319ZnVuY3Rpb24gTnUoaSx0LGUpe2k9emUoaSksdD16ZSh0KSxlPXplKGUpO2NvbnN0IG49cW0oa3UoS3QodCxpKSxlKSk7cmV0dXJuIHljKFlyKEpyKGksdCkpLm1hcChzPT5uKnMpKX1mdW5jdGlvbiBLbShpKXtjb25zdCB0PVtdO3JldHVybiBpLmZvckVhY2goZT0+e2lmKCFlKXJldHVybjtsZXQgbj1lW2UubGVuZ3RoLTFdO2ZvcihsZXQgcyBvZiBlKXM+biYmdC5wdXNoKFtuLHNdKSxuPXN9KSx0fWZ1bmN0aW9uIHRnKGksdCl7cmV0dXJuIGZ1bmN0aW9uKGUpe2NvbnN0IG49bmV3IE1hcCxzPW5ldyBNYXA7cmV0dXJuIGkuZm9yRWFjaCgocixvKT0+e2NvbnN0IGE9ci5qb2luKCItIik7bi5zZXQoYSxlW29dKSxzLnNldChhLCEwKX0pLHQuZm9yRWFjaChyPT57bGV0IG89MCxhPS0xO2ZvcihsZXQgYz0wO2M8MztjKyspe2xldCBsPXlyKFtyW2NdLHJbKGMrMSklM11dKS5qb2luKCItIik7bi5nZXQobCk+byYmKG89bi5nZXQobCksYT1sKX1zLnNldChhLCExKX0pLGkubWFwKHI9PnMuZ2V0KHIuam9pbigiLSIpKSl9fWZ1bmN0aW9uIGVnKGksdCl7Y29uc3QgZT1uZXcgU2V0LG49W107aS5tYXAoYT0+e2lmKCEobWMoYS5tYXAoYz0+dFtjPnQubGVuZ3RoPzA6Y10pKT4xZS0xMikpZm9yKGxldCBjPTA7YzwzO2MrKyl7bGV0IGw9W2FbY10sYVsoYysxKSUzXV0saD1gJHtsWzBdfS0ke2xbMV19YDtlLmhhcyhoKT9lLmRlbGV0ZShoKTplLmFkZChgJHtsWzFdfS0ke2xbMF19YCl9fSk7Y29uc3Qgcz1uZXcgTWFwO2xldCByO2lmKGUuZm9yRWFjaChhPT57YT1hLnNwbGl0KCItIikubWFwKE51bWJlcikscy5zZXQoYVswXSxhWzFdKSxyPWFbMF19KSxyPT09dm9pZCAwKXJldHVybiBuO2xldCBvPXI7ZG97bi5wdXNoKG8pO2xldCBhPXMuZ2V0KG8pO3Muc2V0KG8sLTEpLG89YX13aGlsZShvPi0xJiZvIT09cik7cmV0dXJuIG59ZnVuY3Rpb24gbmcoaSl7Y29uc3QgdD1mdW5jdGlvbihlKXtpZih0LmRlbGF1bmF5PW51bGwsdC5fZGF0YT1lLHR5cGVvZiB0Ll9kYXRhPT0ib2JqZWN0IiYmdC5fZGF0YS50eXBlPT09IkZlYXR1cmVDb2xsZWN0aW9uIiYmKHQuX2RhdGE9dC5fZGF0YS5mZWF0dXJlcyksdHlwZW9mIHQuX2RhdGE9PSJvYmplY3QiKXtjb25zdCBuPXQuX2RhdGEubWFwKHM9Plt0Ll92eChzKSx0Ll92eShzKSxzXSkuZmlsdGVyKHM9PmlzRmluaXRlKHNbMF0rc1sxXSkpO3QucG9pbnRzPW4ubWFwKHM9PltzWzBdLHNbMV1dKSx0LnZhbGlkPW4ubWFwKHM9PnNbMl0pLHQuZGVsYXVuYXk9Wm0odC5wb2ludHMpfXJldHVybiB0fTtyZXR1cm4gdC5fdng9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIGU9PSJvYmplY3QiJiYidHlwZSJpbiBlKXJldHVybiAkaChlKVswXTtpZigwIGluIGUpcmV0dXJuIGVbMF19LHQuX3Z5PWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlPT0ib2JqZWN0IiYmInR5cGUiaW4gZSlyZXR1cm4gJGgoZSlbMV07aWYoMSBpbiBlKXJldHVybiBlWzFdfSx0Lng9ZnVuY3Rpb24oZSl7cmV0dXJuIGU/KHQuX3Z4PWUsdCk6dC5fdnh9LHQueT1mdW5jdGlvbihlKXtyZXR1cm4gZT8odC5fdnk9ZSx0KTp0Ll92eX0sdC5wb2x5Z29ucz1mdW5jdGlvbihlKXtpZihlIT09dm9pZCAwJiZ0KGUpLCF0LmRlbGF1bmF5KXJldHVybiExO2NvbnN0IG49e3R5cGU6IkZlYXR1cmVDb2xsZWN0aW9uIixmZWF0dXJlczpbXX07cmV0dXJuIHQudmFsaWQubGVuZ3RoPT09MHx8KHQuZGVsYXVuYXkucG9seWdvbnMuZm9yRWFjaCgocyxyKT0+bi5mZWF0dXJlcy5wdXNoKHt0eXBlOiJGZWF0dXJlIixnZW9tZXRyeTpzP3t0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbWy4uLnMsc1swXV0ubWFwKG89PnQuZGVsYXVuYXkuY2VudGVyc1tvXSldfTpudWxsLHByb3BlcnRpZXM6e3NpdGU6dC52YWxpZFtyXSxzaXRlY29vcmRpbmF0ZXM6dC5wb2ludHNbcl0sbmVpZ2hib3Vyczp0LmRlbGF1bmF5Lm5laWdoYm9yc1tyXX19KSksdC52YWxpZC5sZW5ndGg9PT0xJiZuLmZlYXR1cmVzLnB1c2goe3R5cGU6IkZlYXR1cmUiLGdlb21ldHJ5Ont0eXBlOiJTcGhlcmUifSxwcm9wZXJ0aWVzOntzaXRlOnQudmFsaWRbMF0sc2l0ZWNvb3JkaW5hdGVzOnQucG9pbnRzWzBdLG5laWdoYm91cnM6W119fSkpLG59LHQudHJpYW5nbGVzPWZ1bmN0aW9uKGUpe3JldHVybiBlIT09dm9pZCAwJiZ0KGUpLHQuZGVsYXVuYXk/e3R5cGU6IkZlYXR1cmVDb2xsZWN0aW9uIixmZWF0dXJlczp0LmRlbGF1bmF5LnRyaWFuZ2xlcy5tYXAoKG4scyk9PihuPW4ubWFwKHI9PnQucG9pbnRzW3JdKSxuLmNlbnRlcj10LmRlbGF1bmF5LmNlbnRlcnNbc10sbikpLmZpbHRlcihuPT5tYyhuKT4wKS5tYXAobj0+KHt0eXBlOiJGZWF0dXJlIixwcm9wZXJ0aWVzOntjaXJjdW1jZW50ZXI6bi5jZW50ZXJ9LGdlb21ldHJ5Ont0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbWy4uLm4sblswXV1dfX0pKX06ITF9LHQubGlua3M9ZnVuY3Rpb24oZSl7aWYoZSE9PXZvaWQgMCYmdChlKSwhdC5kZWxhdW5heSlyZXR1cm4hMTtjb25zdCBuPXQuZGVsYXVuYXkuZWRnZXMubWFwKHI9PnlpKHQucG9pbnRzW3JbMF1dLHQucG9pbnRzW3JbMV1dKSkscz10LmRlbGF1bmF5LnVycXVoYXJ0KG4pO3JldHVybnt0eXBlOiJGZWF0dXJlQ29sbGVjdGlvbiIsZmVhdHVyZXM6dC5kZWxhdW5heS5lZGdlcy5tYXAoKHIsbyk9Pih7dHlwZToiRmVhdHVyZSIscHJvcGVydGllczp7c291cmNlOnQudmFsaWRbclswXV0sdGFyZ2V0OnQudmFsaWRbclsxXV0sbGVuZ3RoOm5bb10sdXJxdWhhcnQ6ISFzW29dfSxnZW9tZXRyeTp7dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6W3QucG9pbnRzW3JbMF1dLHQucG9pbnRzW3JbMV1dXX19KSl9fSx0Lm1lc2g9ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT12b2lkIDAmJnQoZSksdC5kZWxhdW5heT97dHlwZToiTXVsdGlMaW5lU3RyaW5nIixjb29yZGluYXRlczp0LmRlbGF1bmF5LmVkZ2VzLm1hcChuPT5bdC5wb2ludHNbblswXV0sdC5wb2ludHNbblsxXV1dKX06ITF9LHQuY2VsbE1lc2g9ZnVuY3Rpb24oZSl7aWYoZSE9PXZvaWQgMCYmdChlKSwhdC5kZWxhdW5heSlyZXR1cm4hMTtjb25zdHtjZW50ZXJzOm4scG9seWdvbnM6c309dC5kZWxhdW5heSxyPVtdO2Zvcihjb25zdCBvIG9mIHMpaWYobylmb3IobGV0IGE9by5sZW5ndGgsYz1vW2EtMV0sbD1vWzBdLGg9MDtoPGE7Yz1sLGw9b1srK2hdKWw+YyYmci5wdXNoKFtuW2NdLG5bbF1dKTtyZXR1cm57dHlwZToiTXVsdGlMaW5lU3RyaW5nIixjb29yZGluYXRlczpyfX0sdC5fZm91bmQ9dm9pZCAwLHQuZmluZD1mdW5jdGlvbihlLG4scyl7aWYodC5fZm91bmQ9dC5kZWxhdW5heS5maW5kKGUsbix0Ll9mb3VuZCksIXN8fHlpKFtlLG5dLHQucG9pbnRzW3QuX2ZvdW5kXSk8cylyZXR1cm4gdC5fZm91bmR9LHQuaHVsbD1mdW5jdGlvbihlKXtlIT09dm9pZCAwJiZ0KGUpO2NvbnN0IG49dC5kZWxhdW5heS5odWxsLHM9dC5wb2ludHM7cmV0dXJuIG4ubGVuZ3RoPT09MD9udWxsOnt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbWy4uLm4ubWFwKHI9PnNbcl0pLHNbblswXV1dXX19LGk/dChpKTp0fWZ1bmN0aW9uIGlnKGksdCl7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMDpicmVhaztjYXNlIDE6dGhpcy5yYW5nZShpKTticmVhaztkZWZhdWx0OnRoaXMucmFuZ2UodCkuZG9tYWluKGkpO2JyZWFrfXJldHVybiB0aGlzfWZ1bmN0aW9uIGdjKGksdCxlKXtpLnByb3RvdHlwZT10LnByb3RvdHlwZT1lLGUuY29uc3RydWN0b3I9aX1mdW5jdGlvbiBSdShpLHQpe3ZhciBlPU9iamVjdC5jcmVhdGUoaS5wcm90b3R5cGUpO2Zvcih2YXIgbiBpbiB0KWVbbl09dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBkcygpe312YXIgcHM9LjcsanI9MS9wcyxBaT0iXFxzKihbKy1dP1xcZCspXFxzKiIseXM9IlxccyooWystXT8oPzpcXGQqXFwuKT9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLFRlPSJcXHMqKFsrLV0/KD86XFxkKlxcLik/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiIsc2c9L14jKFswLTlhLWZdezMsOH0pJC8scmc9bmV3IFJlZ0V4cChgXnJnYlxcKCR7QWl9LCR7QWl9LCR7QWl9XFwpJGApLG9nPW5ldyBSZWdFeHAoYF5yZ2JcXCgke1RlfSwke1RlfSwke1RlfVxcKSRgKSxhZz1uZXcgUmVnRXhwKGBecmdiYVxcKCR7QWl9LCR7QWl9LCR7QWl9LCR7eXN9XFwpJGApLGNnPW5ldyBSZWdFeHAoYF5yZ2JhXFwoJHtUZX0sJHtUZX0sJHtUZX0sJHt5c31cXCkkYCksbGc9bmV3IFJlZ0V4cChgXmhzbFxcKCR7eXN9LCR7VGV9LCR7VGV9XFwpJGApLGhnPW5ldyBSZWdFeHAoYF5oc2xhXFwoJHt5c30sJHtUZX0sJHtUZX0sJHt5c31cXCkkYCksTHU9e2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LGRhcmtzbGF0ZWdyZXk6MzEwMDQ5NSxkYXJrdHVycXVvaXNlOjUyOTQ1LGRhcmt2aW9sZXQ6OTY5OTUzOSxkZWVwcGluazoxNjcxNjk0NyxkZWVwc2t5Ymx1ZTo0OTE1MSxkaW1ncmF5OjY5MDgyNjUsZGltZ3JleTo2OTA4MjY1LGRvZGdlcmJsdWU6MjAwMzE5OSxmaXJlYnJpY2s6MTE2NzQxNDYsZmxvcmFsd2hpdGU6MTY3NzU5MjAsZm9yZXN0Z3JlZW46MjI2Mzg0MixmdWNoc2lhOjE2NzExOTM1LGdhaW5zYm9ybzoxNDQ3NDQ2MCxnaG9zdHdoaXRlOjE2MzE2NjcxLGdvbGQ6MTY3NjY3MjAsZ29sZGVucm9kOjE0MzI5MTIwLGdyYXk6ODQyMTUwNCxncmVlbjozMjc2OCxncmVlbnllbGxvdzoxMTQwMzA1NSxncmV5Ojg0MjE1MDQsaG9uZXlkZXc6MTU3OTQxNjAsaG90cGluazoxNjczODc0MCxpbmRpYW5yZWQ6MTM0NTg1MjQsaW5kaWdvOjQ5MTUzMzAsaXZvcnk6MTY3NzcyMDAsa2hha2k6MTU3ODc2NjAsbGF2ZW5kZXI6MTUxMzI0MTAsbGF2ZW5kZXJibHVzaDoxNjc3MzM2NSxsYXduZ3JlZW46ODE5MDk3NixsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LHJlYmVjY2FwdXJwbGU6NjY5Nzg4MSxyZWQ6MTY3MTE2ODAscm9zeWJyb3duOjEyMzU3NTE5LHJveWFsYmx1ZTo0Mjg2OTQ1LHNhZGRsZWJyb3duOjkxMjcxODcsc2FsbW9uOjE2NDE2ODgyLHNhbmR5YnJvd246MTYwMzI4NjQsc2VhZ3JlZW46MzA1MDMyNyxzZWFzaGVsbDoxNjc3NDYzOCxzaWVubmE6MTA1MDY3OTcsc2lsdmVyOjEyNjMyMjU2LHNreWJsdWU6ODkwMDMzMSxzbGF0ZWJsdWU6Njk3MDA2MSxzbGF0ZWdyYXk6NzM3Mjk0NCxzbGF0ZWdyZXk6NzM3Mjk0NCxzbm93OjE2Nzc1OTMwLHNwcmluZ2dyZWVuOjY1NDA3LHN0ZWVsYmx1ZTo0NjIwOTgwLHRhbjoxMzgwODc4MCx0ZWFsOjMyODk2LHRoaXN0bGU6MTQyMDQ4ODgsdG9tYXRvOjE2NzM3MDk1LHR1cnF1b2lzZTo0MjUxODU2LHZpb2xldDoxNTYzMTA4Nix3aGVhdDoxNjExMzMzMSx3aGl0ZToxNjc3NzIxNSx3aGl0ZXNtb2tlOjE2MTE5Mjg1LHllbGxvdzoxNjc3Njk2MCx5ZWxsb3dncmVlbjoxMDE0NTA3NH07Z2MoZHMsbXMse2NvcHkoaSl7cmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IHRoaXMuY29uc3RydWN0b3IsdGhpcyxpKX0sZGlzcGxheWFibGUoKXtyZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpfSxoZXg6T3UsZm9ybWF0SGV4Ok91LGZvcm1hdEhleDg6dWcsZm9ybWF0SHNsOmZnLGZvcm1hdFJnYjpEdSx0b1N0cmluZzpEdX0pO2Z1bmN0aW9uIE91KCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4KCl9ZnVuY3Rpb24gdWcoKXtyZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXg4KCl9ZnVuY3Rpb24gZmcoKXtyZXR1cm4gWHUodGhpcykuZm9ybWF0SHNsKCl9ZnVuY3Rpb24gRHUoKXtyZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRSZ2IoKX1mdW5jdGlvbiBtcyhpKXt2YXIgdCxlO3JldHVybiBpPShpKyIiKS50cmltKCkudG9Mb3dlckNhc2UoKSwodD1zZy5leGVjKGkpKT8oZT10WzFdLmxlbmd0aCx0PXBhcnNlSW50KHRbMV0sMTYpLGU9PT02PyR1KHQpOmU9PT0zP25ldyBHdCh0Pj44JjE1fHQ+PjQmMjQwLHQ+PjQmMTV8dCYyNDAsKHQmMTUpPDw0fHQmMTUsMSk6ZT09PTg/UXIodD4+MjQmMjU1LHQ+PjE2JjI1NSx0Pj44JjI1NSwodCYyNTUpLzI1NSk6ZT09PTQ/UXIodD4+MTImMTV8dD4+OCYyNDAsdD4+OCYxNXx0Pj40JjI0MCx0Pj40JjE1fHQmMjQwLCgodCYxNSk8PDR8dCYxNSkvMjU1KTpudWxsKToodD1yZy5leGVjKGkpKT9uZXcgR3QodFsxXSx0WzJdLHRbM10sMSk6KHQ9b2cuZXhlYyhpKSk/bmV3IEd0KHRbMV0qMjU1LzEwMCx0WzJdKjI1NS8xMDAsdFszXSoyNTUvMTAwLDEpOih0PWFnLmV4ZWMoaSkpP1FyKHRbMV0sdFsyXSx0WzNdLHRbNF0pOih0PWNnLmV4ZWMoaSkpP1FyKHRbMV0qMjU1LzEwMCx0WzJdKjI1NS8xMDAsdFszXSoyNTUvMTAwLHRbNF0pOih0PWxnLmV4ZWMoaSkpP3F1KHRbMV0sdFsyXS8xMDAsdFszXS8xMDAsMSk6KHQ9aGcuZXhlYyhpKSk/cXUodFsxXSx0WzJdLzEwMCx0WzNdLzEwMCx0WzRdKTpMdS5oYXNPd25Qcm9wZXJ0eShpKT8kdShMdVtpXSk6aT09PSJ0cmFuc3BhcmVudCI/bmV3IEd0KE5hTixOYU4sTmFOLDApOm51bGx9ZnVuY3Rpb24gJHUoaSl7cmV0dXJuIG5ldyBHdChpPj4xNiYyNTUsaT4+OCYyNTUsaSYyNTUsMSl9ZnVuY3Rpb24gUXIoaSx0LGUsbil7cmV0dXJuIG48PTAmJihpPXQ9ZT1OYU4pLG5ldyBHdChpLHQsZSxuKX1mdW5jdGlvbiBkZyhpKXtyZXR1cm4gaSBpbnN0YW5jZW9mIGRzfHwoaT1tcyhpKSksaT8oaT1pLnJnYigpLG5ldyBHdChpLnIsaS5nLGkuYixpLm9wYWNpdHkpKTpuZXcgR3R9ZnVuY3Rpb24geGMoaSx0LGUsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0xP2RnKGkpOm5ldyBHdChpLHQsZSxuPT1udWxsPzE6bil9ZnVuY3Rpb24gR3QoaSx0LGUsbil7dGhpcy5yPStpLHRoaXMuZz0rdCx0aGlzLmI9K2UsdGhpcy5vcGFjaXR5PStufWdjKEd0LHhjLFJ1KGRzLHticmlnaHRlcihpKXtyZXR1cm4gaT1pPT1udWxsP2pyOk1hdGgucG93KGpyLGkpLG5ldyBHdCh0aGlzLnIqaSx0aGlzLmcqaSx0aGlzLmIqaSx0aGlzLm9wYWNpdHkpfSxkYXJrZXIoaSl7cmV0dXJuIGk9aT09bnVsbD9wczpNYXRoLnBvdyhwcyxpKSxuZXcgR3QodGhpcy5yKmksdGhpcy5nKmksdGhpcy5iKmksdGhpcy5vcGFjaXR5KX0scmdiKCl7cmV0dXJuIHRoaXN9LGNsYW1wKCl7cmV0dXJuIG5ldyBHdChMbih0aGlzLnIpLExuKHRoaXMuZyksTG4odGhpcy5iKSxLcih0aGlzLm9wYWNpdHkpKX0sZGlzcGxheWFibGUoKXtyZXR1cm4tLjU8PXRoaXMuciYmdGhpcy5yPDI1NS41JiYtLjU8PXRoaXMuZyYmdGhpcy5nPDI1NS41JiYtLjU8PXRoaXMuYiYmdGhpcy5iPDI1NS41JiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0saGV4OlZ1LGZvcm1hdEhleDpWdSxmb3JtYXRIZXg4OnBnLGZvcm1hdFJnYjpVdSx0b1N0cmluZzpVdX0pKTtmdW5jdGlvbiBWdSgpe3JldHVybmAjJHtPbih0aGlzLnIpfSR7T24odGhpcy5nKX0ke09uKHRoaXMuYil9YH1mdW5jdGlvbiBwZygpe3JldHVybmAjJHtPbih0aGlzLnIpfSR7T24odGhpcy5nKX0ke09uKHRoaXMuYil9JHtPbigoaXNOYU4odGhpcy5vcGFjaXR5KT8xOnRoaXMub3BhY2l0eSkqMjU1KX1gfWZ1bmN0aW9uIFV1KCl7Y29uc3QgaT1Lcih0aGlzLm9wYWNpdHkpO3JldHVybmAke2k9PT0xPyJyZ2IoIjoicmdiYSgifSR7TG4odGhpcy5yKX0sICR7TG4odGhpcy5nKX0sICR7TG4odGhpcy5iKX0ke2k9PT0xPyIpIjpgLCAke2l9KWB9YH1mdW5jdGlvbiBLcihpKXtyZXR1cm4gaXNOYU4oaSk/MTpNYXRoLm1heCgwLE1hdGgubWluKDEsaSkpfWZ1bmN0aW9uIExuKGkpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKGkpfHwwKSl9ZnVuY3Rpb24gT24oaSl7cmV0dXJuIGk9TG4oaSksKGk8MTY/IjAiOiIiKStpLnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBxdShpLHQsZSxuKXtyZXR1cm4gbjw9MD9pPXQ9ZT1OYU46ZTw9MHx8ZT49MT9pPXQ9TmFOOnQ8PTAmJihpPU5hTiksbmV3IGJlKGksdCxlLG4pfWZ1bmN0aW9uIFh1KGkpe2lmKGkgaW5zdGFuY2VvZiBiZSlyZXR1cm4gbmV3IGJlKGkuaCxpLnMsaS5sLGkub3BhY2l0eSk7aWYoaSBpbnN0YW5jZW9mIGRzfHwoaT1tcyhpKSksIWkpcmV0dXJuIG5ldyBiZTtpZihpIGluc3RhbmNlb2YgYmUpcmV0dXJuIGk7aT1pLnJnYigpO3ZhciB0PWkuci8yNTUsZT1pLmcvMjU1LG49aS5iLzI1NSxzPU1hdGgubWluKHQsZSxuKSxyPU1hdGgubWF4KHQsZSxuKSxvPU5hTixhPXItcyxjPShyK3MpLzI7cmV0dXJuIGE/KHQ9PT1yP289KGUtbikvYSsoZTxuKSo2OmU9PT1yP289KG4tdCkvYSsyOm89KHQtZSkvYSs0LGEvPWM8LjU/citzOjItci1zLG8qPTYwKTphPWM+MCYmYzwxPzA6byxuZXcgYmUobyxhLGMsaS5vcGFjaXR5KX1mdW5jdGlvbiB5ZyhpLHQsZSxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTE/WHUoaSk6bmV3IGJlKGksdCxlLG49PW51bGw/MTpuKX1mdW5jdGlvbiBiZShpLHQsZSxuKXt0aGlzLmg9K2ksdGhpcy5zPSt0LHRoaXMubD0rZSx0aGlzLm9wYWNpdHk9K259Z2MoYmUseWcsUnUoZHMse2JyaWdodGVyKGkpe3JldHVybiBpPWk9PW51bGw/anI6TWF0aC5wb3coanIsaSksbmV3IGJlKHRoaXMuaCx0aGlzLnMsdGhpcy5sKmksdGhpcy5vcGFjaXR5KX0sZGFya2VyKGkpe3JldHVybiBpPWk9PW51bGw/cHM6TWF0aC5wb3cocHMsaSksbmV3IGJlKHRoaXMuaCx0aGlzLnMsdGhpcy5sKmksdGhpcy5vcGFjaXR5KX0scmdiKCl7dmFyIGk9dGhpcy5oJTM2MCsodGhpcy5oPDApKjM2MCx0PWlzTmFOKGkpfHxpc05hTih0aGlzLnMpPzA6dGhpcy5zLGU9dGhpcy5sLG49ZSsoZTwuNT9lOjEtZSkqdCxzPTIqZS1uO3JldHVybiBuZXcgR3Qod2MoaT49MjQwP2ktMjQwOmkrMTIwLHMsbiksd2MoaSxzLG4pLHdjKGk8MTIwP2krMjQwOmktMTIwLHMsbiksdGhpcy5vcGFjaXR5KX0sY2xhbXAoKXtyZXR1cm4gbmV3IGJlKFp1KHRoaXMuaCksdG8odGhpcy5zKSx0byh0aGlzLmwpLEtyKHRoaXMub3BhY2l0eSkpfSxkaXNwbGF5YWJsZSgpe3JldHVybigwPD10aGlzLnMmJnRoaXMuczw9MXx8aXNOYU4odGhpcy5zKSkmJjA8PXRoaXMubCYmdGhpcy5sPD0xJiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0sZm9ybWF0SHNsKCl7Y29uc3QgaT1Lcih0aGlzLm9wYWNpdHkpO3JldHVybmAke2k9PT0xPyJoc2woIjoiaHNsYSgifSR7WnUodGhpcy5oKX0sICR7dG8odGhpcy5zKSoxMDB9JSwgJHt0byh0aGlzLmwpKjEwMH0lJHtpPT09MT8iKSI6YCwgJHtpfSlgfWB9fSkpO2Z1bmN0aW9uIFp1KGkpe3JldHVybiBpPShpfHwwKSUzNjAsaTwwP2krMzYwOml9ZnVuY3Rpb24gdG8oaSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oMSxpfHwwKSl9ZnVuY3Rpb24gd2MoaSx0LGUpe3JldHVybihpPDYwP3QrKGUtdCkqaS82MDppPDE4MD9lOmk8MjQwP3QrKGUtdCkqKDI0MC1pKS82MDp0KSoyNTV9dmFyIGJjPWk9PigpPT5pO2Z1bmN0aW9uIG1nKGksdCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBpK2UqdH19ZnVuY3Rpb24gZ2coaSx0LGUpe3JldHVybiBpPU1hdGgucG93KGksZSksdD1NYXRoLnBvdyh0LGUpLWksZT0xL2UsZnVuY3Rpb24obil7cmV0dXJuIE1hdGgucG93KGkrbip0LGUpfX1mdW5jdGlvbiB4ZyhpKXtyZXR1cm4oaT0raSk9PTE/R3U6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS10P2dnKHQsZSxpKTpiYyhpc05hTih0KT9lOnQpfX1mdW5jdGlvbiBHdShpLHQpe3ZhciBlPXQtaTtyZXR1cm4gZT9tZyhpLGUpOmJjKGlzTmFOKGkpP3Q6aSl9dmFyIFd1PWZ1bmN0aW9uIGkodCl7dmFyIGU9eGcodCk7ZnVuY3Rpb24gbihzLHIpe3ZhciBvPWUoKHM9eGMocykpLnIsKHI9eGMocikpLnIpLGE9ZShzLmcsci5nKSxjPWUocy5iLHIuYiksbD1HdShzLm9wYWNpdHksci5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24oaCl7cmV0dXJuIHMucj1vKGgpLHMuZz1hKGgpLHMuYj1jKGgpLHMub3BhY2l0eT1sKGgpLHMrIiJ9fXJldHVybiBuLmdhbW1hPWksbn0oMSk7ZnVuY3Rpb24gd2coaSx0KXt0fHwodD1bXSk7dmFyIGU9aT9NYXRoLm1pbih0Lmxlbmd0aCxpLmxlbmd0aCk6MCxuPXQuc2xpY2UoKSxzO3JldHVybiBmdW5jdGlvbihyKXtmb3Iocz0wO3M8ZTsrK3MpbltzXT1pW3NdKigxLXIpK3Rbc10qcjtyZXR1cm4gbn19ZnVuY3Rpb24gYmcoaSl7cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhpKSYmIShpIGluc3RhbmNlb2YgRGF0YVZpZXcpfWZ1bmN0aW9uIE1nKGksdCl7dmFyIGU9dD90Lmxlbmd0aDowLG49aT9NYXRoLm1pbihlLGkubGVuZ3RoKTowLHM9bmV3IEFycmF5KG4pLHI9bmV3IEFycmF5KGUpLG87Zm9yKG89MDtvPG47KytvKXNbb109U2MoaVtvXSx0W29dKTtmb3IoO288ZTsrK28pcltvXT10W29dO3JldHVybiBmdW5jdGlvbihhKXtmb3Iobz0wO288bjsrK28pcltvXT1zW29dKGEpO3JldHVybiByfX1mdW5jdGlvbiBBZyhpLHQpe3ZhciBlPW5ldyBEYXRlO3JldHVybiBpPStpLHQ9K3QsZnVuY3Rpb24obil7cmV0dXJuIGUuc2V0VGltZShpKigxLW4pK3QqbiksZX19ZnVuY3Rpb24gZW8oaSx0KXtyZXR1cm4gaT0raSx0PSt0LGZ1bmN0aW9uKGUpe3JldHVybiBpKigxLWUpK3QqZX19ZnVuY3Rpb24gU2coaSx0KXt2YXIgZT17fSxuPXt9LHM7KGk9PT1udWxsfHx0eXBlb2YgaSE9Im9iamVjdCIpJiYoaT17fSksKHQ9PT1udWxsfHx0eXBlb2YgdCE9Im9iamVjdCIpJiYodD17fSk7Zm9yKHMgaW4gdClzIGluIGk/ZVtzXT1TYyhpW3NdLHRbc10pOm5bc109dFtzXTtyZXR1cm4gZnVuY3Rpb24ocil7Zm9yKHMgaW4gZSluW3NdPWVbc10ocik7cmV0dXJuIG59fXZhciBNYz0vWy0rXT8oPzpcZCtcLj9cZCp8XC4/XGQrKSg/OltlRV1bLStdP1xkKyk/L2csQWM9bmV3IFJlZ0V4cChNYy5zb3VyY2UsImciKTtmdW5jdGlvbiB2ZyhpKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gaX19ZnVuY3Rpb24gX2coaSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBpKHQpKyIifX1mdW5jdGlvbiB6ZyhpLHQpe3ZhciBlPU1jLmxhc3RJbmRleD1BYy5sYXN0SW5kZXg9MCxuLHMscixvPS0xLGE9W10sYz1bXTtmb3IoaT1pKyIiLHQ9dCsiIjsobj1NYy5leGVjKGkpKSYmKHM9QWMuZXhlYyh0KSk7KShyPXMuaW5kZXgpPmUmJihyPXQuc2xpY2UoZSxyKSxhW29dP2Fbb10rPXI6YVsrK29dPXIpLChuPW5bMF0pPT09KHM9c1swXSk/YVtvXT9hW29dKz1zOmFbKytvXT1zOihhWysrb109bnVsbCxjLnB1c2goe2k6byx4OmVvKG4scyl9KSksZT1BYy5sYXN0SW5kZXg7cmV0dXJuIGU8dC5sZW5ndGgmJihyPXQuc2xpY2UoZSksYVtvXT9hW29dKz1yOmFbKytvXT1yKSxhLmxlbmd0aDwyP2NbMF0/X2coY1swXS54KTp2Zyh0KToodD1jLmxlbmd0aCxmdW5jdGlvbihsKXtmb3IodmFyIGg9MCx1O2g8dDsrK2gpYVsodT1jW2hdKS5pXT11LngobCk7cmV0dXJuIGEuam9pbigiIil9KX1mdW5jdGlvbiBTYyhpLHQpe3ZhciBlPXR5cGVvZiB0LG47cmV0dXJuIHQ9PW51bGx8fGU9PT0iYm9vbGVhbiI/YmModCk6KGU9PT0ibnVtYmVyIj9lbzplPT09InN0cmluZyI/KG49bXModCkpPyh0PW4sV3UpOnpnOnQgaW5zdGFuY2VvZiBtcz9XdTp0IGluc3RhbmNlb2YgRGF0ZT9BZzpiZyh0KT93ZzpBcnJheS5pc0FycmF5KHQpP01nOnR5cGVvZiB0LnZhbHVlT2YhPSJmdW5jdGlvbiImJnR5cGVvZiB0LnRvU3RyaW5nIT0iZnVuY3Rpb24ifHxpc05hTih0KT9TZzplbykoaSx0KX1mdW5jdGlvbiBUZyhpLHQpe3JldHVybiBpPStpLHQ9K3QsZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucm91bmQoaSooMS1lKSt0KmUpfX1mdW5jdGlvbiBQZyhpKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gaX19ZnVuY3Rpb24gQ2coaSl7cmV0dXJuK2l9dmFyIEh1PVswLDFdO2Z1bmN0aW9uIFNpKGkpe3JldHVybiBpfWZ1bmN0aW9uIHZjKGksdCl7cmV0dXJuKHQtPWk9K2kpP2Z1bmN0aW9uKGUpe3JldHVybihlLWkpL3R9OlBnKGlzTmFOKHQpP05hTjouNSl9ZnVuY3Rpb24gRWcoaSx0KXt2YXIgZTtyZXR1cm4gaT50JiYoZT1pLGk9dCx0PWUpLGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLm1heChpLE1hdGgubWluKHQsbikpfX1mdW5jdGlvbiBCZyhpLHQsZSl7dmFyIG49aVswXSxzPWlbMV0scj10WzBdLG89dFsxXTtyZXR1cm4gczxuPyhuPXZjKHMsbikscj1lKG8scikpOihuPXZjKG4scykscj1lKHIsbykpLGZ1bmN0aW9uKGEpe3JldHVybiByKG4oYSkpfX1mdW5jdGlvbiBGZyhpLHQsZSl7dmFyIG49TWF0aC5taW4oaS5sZW5ndGgsdC5sZW5ndGgpLTEscz1uZXcgQXJyYXkobikscj1uZXcgQXJyYXkobiksbz0tMTtmb3IoaVtuXTxpWzBdJiYoaT1pLnNsaWNlKCkucmV2ZXJzZSgpLHQ9dC5zbGljZSgpLnJldmVyc2UoKSk7KytvPG47KXNbb109dmMoaVtvXSxpW28rMV0pLHJbb109ZSh0W29dLHRbbysxXSk7cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBjPU5wKGksYSwxLG4pLTE7cmV0dXJuIHJbY10oc1tjXShhKSl9fWZ1bmN0aW9uIElnKGksdCl7cmV0dXJuIHQuZG9tYWluKGkuZG9tYWluKCkpLnJhbmdlKGkucmFuZ2UoKSkuaW50ZXJwb2xhdGUoaS5pbnRlcnBvbGF0ZSgpKS5jbGFtcChpLmNsYW1wKCkpLnVua25vd24oaS51bmtub3duKCkpfWZ1bmN0aW9uIGtnKCl7dmFyIGk9SHUsdD1IdSxlPVNjLG4scyxyLG89U2ksYSxjLGw7ZnVuY3Rpb24gaCgpe3ZhciBmPU1hdGgubWluKGkubGVuZ3RoLHQubGVuZ3RoKTtyZXR1cm4gbyE9PVNpJiYobz1FZyhpWzBdLGlbZi0xXSkpLGE9Zj4yP0ZnOkJnLGM9bD1udWxsLHV9ZnVuY3Rpb24gdShmKXtyZXR1cm4gZj09bnVsbHx8aXNOYU4oZj0rZik/cjooY3x8KGM9YShpLm1hcChuKSx0LGUpKSkobihvKGYpKSl9cmV0dXJuIHUuaW52ZXJ0PWZ1bmN0aW9uKGYpe3JldHVybiBvKHMoKGx8fChsPWEodCxpLm1hcChuKSxlbykpKShmKSkpfSx1LmRvbWFpbj1mdW5jdGlvbihmKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1BcnJheS5mcm9tKGYsQ2cpLGgoKSk6aS5zbGljZSgpfSx1LnJhbmdlPWZ1bmN0aW9uKGYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PUFycmF5LmZyb20oZiksaCgpKTp0LnNsaWNlKCl9LHUucmFuZ2VSb3VuZD1mdW5jdGlvbihmKXtyZXR1cm4gdD1BcnJheS5mcm9tKGYpLGU9VGcsaCgpfSx1LmNsYW1wPWZ1bmN0aW9uKGYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWY/ITA6U2ksaCgpKTpvIT09U2l9LHUuaW50ZXJwb2xhdGU9ZnVuY3Rpb24oZil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ZixoKCkpOmV9LHUudW5rbm93bj1mdW5jdGlvbihmKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1mLHUpOnJ9LGZ1bmN0aW9uKGYsZCl7cmV0dXJuIG49ZixzPWQsaCgpfX1mdW5jdGlvbiBOZygpe3JldHVybiBrZygpKFNpLFNpKX1mdW5jdGlvbiBSZyhpKXtyZXR1cm4gTWF0aC5hYnMoaT1NYXRoLnJvdW5kKGkpKT49MWUyMT9pLnRvTG9jYWxlU3RyaW5nKCJlbiIpLnJlcGxhY2UoLywvZywiIik6aS50b1N0cmluZygxMCl9ZnVuY3Rpb24gbm8oaSx0KXtpZigoZT0oaT10P2kudG9FeHBvbmVudGlhbCh0LTEpOmkudG9FeHBvbmVudGlhbCgpKS5pbmRleE9mKCJlIikpPDApcmV0dXJuIG51bGw7dmFyIGUsbj1pLnNsaWNlKDAsZSk7cmV0dXJuW24ubGVuZ3RoPjE/blswXStuLnNsaWNlKDIpOm4sK2kuc2xpY2UoZSsxKV19ZnVuY3Rpb24gdmkoaSl7cmV0dXJuIGk9bm8oTWF0aC5hYnMoaSkpLGk/aVsxXTpOYU59ZnVuY3Rpb24gTGcoaSx0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtmb3IodmFyIHM9ZS5sZW5ndGgscj1bXSxvPTAsYT1pWzBdLGM9MDtzPjAmJmE+MCYmKGMrYSsxPm4mJihhPU1hdGgubWF4KDEsbi1jKSksci5wdXNoKGUuc3Vic3RyaW5nKHMtPWEscythKSksISgoYys9YSsxKT5uKSk7KWE9aVtvPShvKzEpJWkubGVuZ3RoXTtyZXR1cm4gci5yZXZlcnNlKCkuam9pbih0KX19ZnVuY3Rpb24gT2coaSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0LnJlcGxhY2UoL1swLTldL2csZnVuY3Rpb24oZSl7cmV0dXJuIGlbK2VdfSl9fXZhciBEZz0vXig/OiguKT8oWzw+PV5dKSk/KFsrXC0oIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KH4pPyhbYS16JV0pPyQvaTtmdW5jdGlvbiBpbyhpKXtpZighKHQ9RGcuZXhlYyhpKSkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvcm1hdDogIitpKTt2YXIgdDtyZXR1cm4gbmV3IF9jKHtmaWxsOnRbMV0sYWxpZ246dFsyXSxzaWduOnRbM10sc3ltYm9sOnRbNF0semVybzp0WzVdLHdpZHRoOnRbNl0sY29tbWE6dFs3XSxwcmVjaXNpb246dFs4XSYmdFs4XS5zbGljZSgxKSx0cmltOnRbOV0sdHlwZTp0WzEwXX0pfWlvLnByb3RvdHlwZT1fYy5wcm90b3R5cGU7ZnVuY3Rpb24gX2MoaSl7dGhpcy5maWxsPWkuZmlsbD09PXZvaWQgMD8iICI6aS5maWxsKyIiLHRoaXMuYWxpZ249aS5hbGlnbj09PXZvaWQgMD8iPiI6aS5hbGlnbisiIix0aGlzLnNpZ249aS5zaWduPT09dm9pZCAwPyItIjppLnNpZ24rIiIsdGhpcy5zeW1ib2w9aS5zeW1ib2w9PT12b2lkIDA/IiI6aS5zeW1ib2wrIiIsdGhpcy56ZXJvPSEhaS56ZXJvLHRoaXMud2lkdGg9aS53aWR0aD09PXZvaWQgMD92b2lkIDA6K2kud2lkdGgsdGhpcy5jb21tYT0hIWkuY29tbWEsdGhpcy5wcmVjaXNpb249aS5wcmVjaXNpb249PT12b2lkIDA/dm9pZCAwOitpLnByZWNpc2lvbix0aGlzLnRyaW09ISFpLnRyaW0sdGhpcy50eXBlPWkudHlwZT09PXZvaWQgMD8iIjppLnR5cGUrIiJ9X2MucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsbCt0aGlzLmFsaWduK3RoaXMuc2lnbit0aGlzLnN5bWJvbCsodGhpcy56ZXJvPyIwIjoiIikrKHRoaXMud2lkdGg9PT12b2lkIDA/IiI6TWF0aC5tYXgoMSx0aGlzLndpZHRofDApKSsodGhpcy5jb21tYT8iLCI6IiIpKyh0aGlzLnByZWNpc2lvbj09PXZvaWQgMD8iIjoiLiIrTWF0aC5tYXgoMCx0aGlzLnByZWNpc2lvbnwwKSkrKHRoaXMudHJpbT8ifiI6IiIpK3RoaXMudHlwZX07ZnVuY3Rpb24gJGcoaSl7dDpmb3IodmFyIHQ9aS5sZW5ndGgsZT0xLG49LTEscztlPHQ7KytlKXN3aXRjaChpW2VdKXtjYXNlIi4iOm49cz1lO2JyZWFrO2Nhc2UiMCI6bj09PTAmJihuPWUpLHM9ZTticmVhaztkZWZhdWx0OmlmKCEraVtlXSlicmVhayB0O24+MCYmKG49MCk7YnJlYWt9cmV0dXJuIG4+MD9pLnNsaWNlKDAsbikraS5zbGljZShzKzEpOml9dmFyIEp1O2Z1bmN0aW9uIFZnKGksdCl7dmFyIGU9bm8oaSx0KTtpZighZSlyZXR1cm4gaSsiIjt2YXIgbj1lWzBdLHM9ZVsxXSxyPXMtKEp1PU1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihzLzMpKSkqMykrMSxvPW4ubGVuZ3RoO3JldHVybiByPT09bz9uOnI+bz9uK25ldyBBcnJheShyLW8rMSkuam9pbigiMCIpOnI+MD9uLnNsaWNlKDAscikrIi4iK24uc2xpY2Uocik6IjAuIituZXcgQXJyYXkoMS1yKS5qb2luKCIwIikrbm8oaSxNYXRoLm1heCgwLHQrci0xKSlbMF19ZnVuY3Rpb24gWXUoaSx0KXt2YXIgZT1ubyhpLHQpO2lmKCFlKXJldHVybiBpKyIiO3ZhciBuPWVbMF0scz1lWzFdO3JldHVybiBzPDA/IjAuIituZXcgQXJyYXkoLXMpLmpvaW4oIjAiKStuOm4ubGVuZ3RoPnMrMT9uLnNsaWNlKDAscysxKSsiLiIrbi5zbGljZShzKzEpOm4rbmV3IEFycmF5KHMtbi5sZW5ndGgrMikuam9pbigiMCIpfXZhciBqdT17IiUiOihpLHQpPT4oaSoxMDApLnRvRml4ZWQodCksYjppPT5NYXRoLnJvdW5kKGkpLnRvU3RyaW5nKDIpLGM6aT0+aSsiIixkOlJnLGU6KGksdCk9PmkudG9FeHBvbmVudGlhbCh0KSxmOihpLHQpPT5pLnRvRml4ZWQodCksZzooaSx0KT0+aS50b1ByZWNpc2lvbih0KSxvOmk9Pk1hdGgucm91bmQoaSkudG9TdHJpbmcoOCkscDooaSx0KT0+WXUoaSoxMDAsdCkscjpZdSxzOlZnLFg6aT0+TWF0aC5yb3VuZChpKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSx4Omk9Pk1hdGgucm91bmQoaSkudG9TdHJpbmcoMTYpfTtmdW5jdGlvbiBRdShpKXtyZXR1cm4gaX12YXIgS3U9QXJyYXkucHJvdG90eXBlLm1hcCx0Zj1bInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIsK1IiwibSIsIiIsImsiLCJNIiwiRyIsIlQiLCJQIiwiRSIsIloiLCJZIl07ZnVuY3Rpb24gVWcoaSl7dmFyIHQ9aS5ncm91cGluZz09PXZvaWQgMHx8aS50aG91c2FuZHM9PT12b2lkIDA/UXU6TGcoS3UuY2FsbChpLmdyb3VwaW5nLE51bWJlciksaS50aG91c2FuZHMrIiIpLGU9aS5jdXJyZW5jeT09PXZvaWQgMD8iIjppLmN1cnJlbmN5WzBdKyIiLG49aS5jdXJyZW5jeT09PXZvaWQgMD8iIjppLmN1cnJlbmN5WzFdKyIiLHM9aS5kZWNpbWFsPT09dm9pZCAwPyIuIjppLmRlY2ltYWwrIiIscj1pLm51bWVyYWxzPT09dm9pZCAwP1F1Ok9nKEt1LmNhbGwoaS5udW1lcmFscyxTdHJpbmcpKSxvPWkucGVyY2VudD09PXZvaWQgMD8iJSI6aS5wZXJjZW50KyIiLGE9aS5taW51cz09PXZvaWQgMD8i4oiSIjppLm1pbnVzKyIiLGM9aS5uYW49PT12b2lkIDA/Ik5hTiI6aS5uYW4rIiI7ZnVuY3Rpb24gbCh1KXt1PWlvKHUpO3ZhciBmPXUuZmlsbCxkPXUuYWxpZ24scD11LnNpZ24seT11LnN5bWJvbCxnPXUuemVybyx3PXUud2lkdGgsYj11LmNvbW1hLHg9dS5wcmVjaXNpb24sbT11LnRyaW0sTT11LnR5cGU7TT09PSJuIj8oYj0hMCxNPSJnIik6anVbTV18fCh4PT09dm9pZCAwJiYoeD0xMiksbT0hMCxNPSJnIiksKGd8fGY9PT0iMCImJmQ9PT0iPSIpJiYoZz0hMCxmPSIwIixkPSI9Iik7dmFyIFM9eT09PSIkIj9lOnk9PT0iIyImJi9bYm94WF0vLnRlc3QoTSk/IjAiK00udG9Mb3dlckNhc2UoKToiIixBPXk9PT0iJCI/bjovWyVwXS8udGVzdChNKT9vOiIiLHY9anVbTV0sXz0vW2RlZmdwcnMlXS8udGVzdChNKTt4PXg9PT12b2lkIDA/NjovW2dwcnNdLy50ZXN0KE0pP01hdGgubWF4KDEsTWF0aC5taW4oMjEseCkpOk1hdGgubWF4KDAsTWF0aC5taW4oMjAseCkpO2Z1bmN0aW9uIFQoeil7dmFyIEM9UyxFPUEsRixCLEk7aWYoTT09PSJjIilFPXYoeikrRSx6PSIiO2Vsc2V7ej0rejt2YXIgUj16PDB8fDEvejwwO2lmKHo9aXNOYU4oeik/Yzp2KE1hdGguYWJzKHopLHgpLG0mJih6PSRnKHopKSxSJiYrej09MCYmcCE9PSIrIiYmKFI9ITEpLEM9KFI/cD09PSIoIj9wOmE6cD09PSItInx8cD09PSIoIj8iIjpwKStDLEU9KE09PT0icyI/dGZbOCtKdS8zXToiIikrRSsoUiYmcD09PSIoIj8iKSI6IiIpLF8pe2ZvcihGPS0xLEI9ei5sZW5ndGg7KytGPEI7KWlmKEk9ei5jaGFyQ29kZUF0KEYpLDQ4Pkl8fEk+NTcpe0U9KEk9PT00Nj9zK3ouc2xpY2UoRisxKTp6LnNsaWNlKEYpKStFLHo9ei5zbGljZSgwLEYpO2JyZWFrfX19YiYmIWcmJih6PXQoeiwxLzApKTt2YXIgVj1DLmxlbmd0aCt6Lmxlbmd0aCtFLmxlbmd0aCxVPVY8dz9uZXcgQXJyYXkody1WKzEpLmpvaW4oZik6IiI7c3dpdGNoKGImJmcmJih6PXQoVSt6LFUubGVuZ3RoP3ctRS5sZW5ndGg6MS8wKSxVPSIiKSxkKXtjYXNlIjwiOno9Qyt6K0UrVTticmVhaztjYXNlIj0iOno9QytVK3orRTticmVhaztjYXNlIl4iOno9VS5zbGljZSgwLFY9VS5sZW5ndGg+PjEpK0MreitFK1Uuc2xpY2UoVik7YnJlYWs7ZGVmYXVsdDp6PVUrQyt6K0U7YnJlYWt9cmV0dXJuIHIoeil9cmV0dXJuIFQudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdSsiIn0sVH1mdW5jdGlvbiBoKHUsZil7dmFyIGQ9bCgodT1pbyh1KSx1LnR5cGU9ImYiLHUpKSxwPU1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcih2aShmKS8zKSkpKjMseT1NYXRoLnBvdygxMCwtcCksZz10Zls4K3AvM107cmV0dXJuIGZ1bmN0aW9uKHcpe3JldHVybiBkKHkqdykrZ319cmV0dXJue2Zvcm1hdDpsLGZvcm1hdFByZWZpeDpofX12YXIgc28sZWYsbmY7cWcoe3Rob3VzYW5kczoiLCIsZ3JvdXBpbmc6WzNdLGN1cnJlbmN5OlsiJCIsIiJdfSk7ZnVuY3Rpb24gcWcoaSl7cmV0dXJuIHNvPVVnKGkpLGVmPXNvLmZvcm1hdCxuZj1zby5mb3JtYXRQcmVmaXgsc299ZnVuY3Rpb24gWGcoaSl7cmV0dXJuIE1hdGgubWF4KDAsLXZpKE1hdGguYWJzKGkpKSl9ZnVuY3Rpb24gWmcoaSx0KXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IodmkodCkvMykpKSozLXZpKE1hdGguYWJzKGkpKSl9ZnVuY3Rpb24gR2coaSx0KXtyZXR1cm4gaT1NYXRoLmFicyhpKSx0PU1hdGguYWJzKHQpLWksTWF0aC5tYXgoMCx2aSh0KS12aShpKSkrMX1mdW5jdGlvbiBXZyhpLHQsZSxuKXt2YXIgcz0kcChpLHQsZSkscjtzd2l0Y2gobj1pbyhuPT1udWxsPyIsZiI6biksbi50eXBlKXtjYXNlInMiOnt2YXIgbz1NYXRoLm1heChNYXRoLmFicyhpKSxNYXRoLmFicyh0KSk7cmV0dXJuIG4ucHJlY2lzaW9uPT1udWxsJiYhaXNOYU4ocj1aZyhzLG8pKSYmKG4ucHJlY2lzaW9uPXIpLG5mKG4sbyl9Y2FzZSIiOmNhc2UiZSI6Y2FzZSJnIjpjYXNlInAiOmNhc2UiciI6e24ucHJlY2lzaW9uPT1udWxsJiYhaXNOYU4ocj1HZyhzLE1hdGgubWF4KE1hdGguYWJzKGkpLE1hdGguYWJzKHQpKSkpJiYobi5wcmVjaXNpb249ci0obi50eXBlPT09ImUiKSk7YnJlYWt9Y2FzZSJmIjpjYXNlIiUiOntuLnByZWNpc2lvbj09bnVsbCYmIWlzTmFOKHI9WGcocykpJiYobi5wcmVjaXNpb249ci0obi50eXBlPT09IiUiKSoyKTticmVha319cmV0dXJuIGVmKG4pfWZ1bmN0aW9uIEhnKGkpe3ZhciB0PWkuZG9tYWluO3JldHVybiBpLnRpY2tzPWZ1bmN0aW9uKGUpe3ZhciBuPXQoKTtyZXR1cm4gRHAoblswXSxuW24ubGVuZ3RoLTFdLGU9PW51bGw/MTA6ZSl9LGkudGlja0Zvcm1hdD1mdW5jdGlvbihlLG4pe3ZhciBzPXQoKTtyZXR1cm4gV2coc1swXSxzW3MubGVuZ3RoLTFdLGU9PW51bGw/MTA6ZSxuKX0saS5uaWNlPWZ1bmN0aW9uKGUpe2U9PW51bGwmJihlPTEwKTt2YXIgbj10KCkscz0wLHI9bi5sZW5ndGgtMSxvPW5bc10sYT1uW3JdLGMsbCxoPTEwO2ZvcihhPG8mJihsPW8sbz1hLGE9bCxsPXMscz1yLHI9bCk7aC0tID4wOyl7aWYobD1rYShvLGEsZSksbD09PWMpcmV0dXJuIG5bc109byxuW3JdPWEsdChuKTtpZihsPjApbz1NYXRoLmZsb29yKG8vbCkqbCxhPU1hdGguY2VpbChhL2wpKmw7ZWxzZSBpZihsPDApbz1NYXRoLmNlaWwobypsKS9sLGE9TWF0aC5mbG9vcihhKmwpL2w7ZWxzZSBicmVhaztjPWx9cmV0dXJuIGl9LGl9ZnVuY3Rpb24gemMoKXt2YXIgaT1OZygpO3JldHVybiBpLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gSWcoaSx6YygpKX0saWcuYXBwbHkoaSxhcmd1bWVudHMpLEhnKGkpfWZ1bmN0aW9uIEpnKGksdCl7cmV0dXJuIGkubWFwKGU9Pntjb25zdCBuPVtdO2xldCBzO3JldHVybiBlLmZvckVhY2gocj0+e2lmKHMpe2NvbnN0IG89eWkocixzKSoxODAvTWF0aC5QSTtpZihvPnQpe2NvbnN0IGE9QXkocyxyKSxjPTEvTWF0aC5jZWlsKG8vdCk7bGV0IGw9Yztmb3IoO2w8MTspbi5wdXNoKGEobCkpLGwrPWN9fW4ucHVzaChzPXIpfSksbn0pfWZ1bmN0aW9uIFlnKGkse21pbkxuZzp0LG1heExuZzplLG1pbkxhdDpuLG1heExhdDpzfT17fSl7Y29uc3Qgcj1NYXRoLnJvdW5kKHppKDM2MC9pLDIpL01hdGguUEkpLG89KDErTWF0aC5zcXJ0KDUpKS8yLGE9ZD0+ZC9vKjM2MCUzNjAtMTgwLGM9ZD0+TWF0aC5hY29zKDIqZC9yLTEpL01hdGguUEkqMTgwLTkwLGw9ZD0+ciooTWF0aC5jb3MoKGQrOTApKk1hdGguUEkvMTgwKSsxKS8yLGg9W3MhPT12b2lkIDA/TWF0aC5jZWlsKGwocykpOjAsbiE9PXZvaWQgMD9NYXRoLmZsb29yKGwobikpOnItMV0sdT10PT09dm9pZCAwJiZlPT09dm9pZCAwPygpPT4hMDp0PT09dm9pZCAwP2Q9PmQ8PWU6ZT09PXZvaWQgMD9kPT5kPj10OmU+PXQ/ZD0+ZD49dCYmZDw9ZTpkPT5kPj10fHxkPD1lLGY9W107Zm9yKGxldCBkPWhbMF07ZDw9aFsxXTtkKyspe2NvbnN0IHA9YShkKTt1KHApJiZmLnB1c2goW3AsYyhkKV0pfXJldHVybiBmfWZ1bmN0aW9uIFRjKGksdCxlPSExKXtyZXR1cm4gZT9NeSh0LGkpOkJtKGksdCl9ZnVuY3Rpb24gamcoaSx0KXtjb25zdCBlPXt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczppfSxbW24sc10sW3Isb11dPWtoKGUpO2lmKE1hdGgubWluKE1hdGguYWJzKHItbiksTWF0aC5hYnMoby1zKSk8dClyZXR1cm5bXTtjb25zdCBhPW4+cnx8bz49ODl8fHM8PS04OTtyZXR1cm4gWWcodCx7bWluTG5nOm4sbWF4TG5nOnIsbWluTGF0OnMsbWF4TGF0Om99KS5maWx0ZXIoYz0+VGMoYyxlLGEpKX1mdW5jdGlvbiBRZyhpLHtyZXNvbHV0aW9uOnQ9MS8wLGJib3g6ZSxwcm9qZWN0aW9uOm59PXt9KXtjb25zdCBzPUpnKGksdCkscj1ZaShzKSxvPWpnKGksdCksYT1bLi4uciwuLi5vXSxjPXt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczppfSxbW2wsaF0sW3UsZl1dPWtoKGMpLGQ9bD51fHxmPj04OXx8aDw9LTg5O2xldCBwPVtdO2lmKGQpe2NvbnN0IE09bmcoYSkudHJpYW5nbGVzKCksUz1uZXcgTWFwKGEubWFwKChbQSx2XSxfKT0+W2Ake0F9LSR7dn1gLF9dKSk7TS5mZWF0dXJlcy5mb3JFYWNoKEE9Pntjb25zdCB2PUEuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF0uc2xpY2UoMCwzKS5yZXZlcnNlKCksXz1bXTtpZih2LmZvckVhY2goKFtULHpdKT0+e2NvbnN0IEM9YCR7VH0tJHt6fWA7Uy5oYXMoQykmJl8ucHVzaChTLmdldChDKSl9KSxfLmxlbmd0aD09PTMpe2lmKF8uc29tZShUPT5UPHIubGVuZ3RoKSl7Y29uc3QgVD1BLnByb3BlcnRpZXMuY2lyY3VtY2VudGVyO2lmKCFUYyhULGMsZCkpcmV0dXJufXAucHVzaCguLi5fKX19KX1lbHNlIGlmKG8ubGVuZ3RoKXtjb25zdCBNPXVzLmZyb20oYSk7Zm9yKGxldCBTPTAsQT1NLnRyaWFuZ2xlcy5sZW5ndGg7UzxBO1MrPTMpe2NvbnN0IHY9WzIsMSwwXS5tYXAoVD0+TS50cmlhbmdsZXNbUytUXSksXz12Lm1hcChUPT5hW1RdKTtpZih2LnNvbWUoVD0+VDxyLmxlbmd0aCkpe2NvbnN0IFQ9WzAsMV0ubWFwKHo9PlZwKF8sQz0+Q1t6XSkpO2lmKCFUYyhULGMsZCkpY29udGludWV9cC5wdXNoKC4uLnYpfX1lbHNle2NvbnN0e3ZlcnRpY2VzOk0saG9sZXM6Uz1bXX09QXUocyk7cD1IeShNLFMsMil9bGV0IHk9ZT9bZVswXSxlWzJdXTp5cihhLE09Pk1bMF0pLGc9ZT9bZVsxXSxlWzNdXTp5cihhLE09Pk1bMV0pO2lmKG4pe2NvbnN0W00sU109bihbeVswXSxnWzBdXSksW0Esdl09bihbeVsxXSxnWzFdXSk7eT1bTSxBXSxnPVstUywtdl19Y29uc3Qgdz16Yyh5LFswLDFdKSxiPXpjKGcsWzAsMV0pLHg9YS5tYXAoKFtNLFNdKT0+e2lmKG4pe2NvbnN0W0Esdl09bihbTSxTXSk7cmV0dXJuW3coQSksYigtdildfWVsc2UgcmV0dXJuW3coTSksYihTKV19KTtyZXR1cm57Y29udG91cjpzLHRyaWFuZ2xlczp7cG9pbnRzOmEsaW5kaWNlczpwLHV2czp4fX19Y29uc3Qgc2Y9bmV3IEFlKCkuc2V0QXR0cmlidXRlPyJzZXRBdHRyaWJ1dGUiOiJhZGRBdHRyaWJ1dGUiO2Z1bmN0aW9uIHJvKGksdCxlKXtjb25zdCBuPWkubWFwKHM9PnMubWFwKChbcixvXSk9PntpZihlPT09ImNlc2l1bSIpe2NvbnN0IGE9MS9rbi5hLGM9dC9hLGw9TWF0aC5tYXgoMCxjLWtuLmEpLGg9eXUocixvLGwsYSwhMSk7cmV0dXJuW2gueCxoLnksaC56XX1pZihlPT09InNwaGVyZSIpe2NvbnN0IGE9eXUocixvLHQta24uYSwxLCEwKTtyZXR1cm5bYS54LGEueSxhLnpdfWlmKHR5cGVvZiBlPT0iZnVuY3Rpb24iKXtjb25zdFthLGNdPWUoW3Isb10pO3JldHVyblthLC1jLHRdfXJldHVybltyLG8sdF19KSk7cmV0dXJuIEF1KG4pfWZ1bmN0aW9uIEtnKGksdCxlLG4pe2NvbnN0e3ZlcnRpY2VzOnMsaG9sZXM6cn09cm8oaSx0LG4pLHt2ZXJ0aWNlczpvfT1ybyhpLGUsbiksYT1ZaShbbyxzXSksYz1NYXRoLnJvdW5kKG8ubGVuZ3RoLzMpLGw9bmV3IFNldChyKTtsZXQgaD0wO2NvbnN0IHU9W107Zm9yKGxldCBkPTA7ZDxjO2QrKyl7bGV0IHA9ZCsxO2lmKHA9PT1jKXA9aDtlbHNlIGlmKGwuaGFzKHApKXtjb25zdCB5PXA7cD1oLGg9eX11LnB1c2goZCxkK2MscCtjKSx1LnB1c2gocCtjLHAsZCl9Y29uc3QgZj1bXTtmb3IobGV0IGQ9MTtkPj0wO2QtLSlmb3IobGV0IHA9MDtwPGM7cCs9MSlmLnB1c2gocC8oYy0xKSxkKTtyZXR1cm57aW5kaWNlczp1LHZlcnRpY2VzOmEsdXZzOmYsdG9wVmVydHM6b319ZnVuY3Rpb24gcmYoaSx0LGUsbixzKXtyZXR1cm57aW5kaWNlczpuP2kuaW5kaWNlczppLmluZGljZXMuc2xpY2UoKS5yZXZlcnNlKCksdmVydGljZXM6cm8oW2kucG9pbnRzXSx0LHMpLnZlcnRpY2VzLHV2czplfX1jb25zdCBvZj0oe3BvbHlnb25HZW9Kc29uOmksc3RhcnRIZWlnaHQ6dCxlbmRIZWlnaHQ6ZSxjdXJ2YXR1cmVSZXNvbHV0aW9uOm49MSxoYXNTaWRlOnM9ITAsaGFzQm90dG9tOnI9ITEsaGFzVG9wOm89ITEscHJvamVjdGlvbjphPSJzcGhlcmUiLGJib3g6Y30pPT57aS5mb3JFYWNoKHc9Pnt5bSh3KXx8dy5yZXZlcnNlKCl9KTtjb25zdCBsPXR5cGVvZiBhPT0iZnVuY3Rpb24iP2E6dm9pZCAwLHtjb250b3VyOmgsdHJpYW5nbGVzOnV9PVFnKGkse3Jlc29sdXRpb246bixiYm94OmMscHJvamVjdGlvbjpsfSk7bGV0IGY9e30sZDtzJiYoZj1LZyhoLHQhPW51bGw/dDplLGUhPW51bGw/ZTp0LGEpLGQ9Zi50b3BWZXJ0cyk7bGV0IHA9W107KHJ8fG8pJiYocD1ZaSh1LnV2cykpO2xldCB5PXt9O3ImJih5PXJmKHUsdCxwLCExLGEpKTtsZXQgZz17fTtyZXR1cm4gbyYmKGc9cmYodSxlLHAsITAsYSkpLHtjb250b3VyOmgsdHJpYW5nbGVzOnUsc2lkZVRvcnNvOmYsYm90dG9tQ2FwOnksdG9wQ2FwOmcsdG9wVmVydHM6ZH19O2NsYXNzIHR4IGV4dGVuZHMgQWV7Y29uc3RydWN0b3IodCxlPXt9KXtzdXBlcigpLHRoaXMudHlwZT0iUG9seWdvbkJ1ZmZlckdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9VXQoe3BvbHlnb25HZW9Kc29uOnQsc3RhcnRIZWlnaHQ6MCxlbmRIZWlnaHQ6MSxoYXNUb3A6ITAsdG9wRmlyc3Q6ITEsaGFzQm90dG9tOiEwLGhhc1NpZGU6ITAsY3VydmF0dXJlUmVzb2x1dGlvbjoxLHByb2plY3Rpb246InNwaGVyZSIsdXNlckRhdGFSc29PZmZzZXQ6MH0sZSk7Y29uc3R7ZW5kSGVpZ2h0Om4saGFzVG9wOnMsdG9wRmlyc3Q6cixoYXNCb3R0b206byxoYXNTaWRlOmEsdXNlckRhdGFSc29PZmZzZXQ6Yyxwcm9qZWN0aW9uOmx9PXRoaXMucGFyYW1ldGVycyx7Y29udG91cjpoLHNpZGVUb3Jzbzp1LHRvcFZlcnRzOmYsYm90dG9tQ2FwOmQsdG9wQ2FwOnB9PW9mKFV0KHt9LHRoaXMucGFyYW1ldGVycykpO2xldCB5PVtdLGc9W10sdz1bXSxiPTA7Y29uc3QgeD1tPT57Y29uc3QgTT1NYXRoLnJvdW5kKHkubGVuZ3RoLzMpLFM9dy5sZW5ndGg7eT15LmNvbmNhdChtLnZlcnRpY2VzKSxnPWcuY29uY2F0KG0udXZzKSx3PXcuY29uY2F0KE0/bS5pbmRpY2VzLm1hcChBPT5BK00pOm0uaW5kaWNlcyksdGhpcy5hZGRHcm91cChTLHcubGVuZ3RoLVMsYisrKX07cyYmciYmeChwKSxhJiYoeCh1KSx0aGlzLnVzZXJEYXRhLnRvcFZlcnRzPWM/cm8oaCxuK2MsbCkudmVydGljZXM6ZiksbyYmeChkKSxzJiYhciYmeChwKSx0aGlzLnNldEluZGV4KHcpLHRoaXNbc2ZdKCJwb3NpdGlvbiIsbmV3IFJlKHksMykpLHRoaXNbc2ZdKCJ1diIsbmV3IFJlKGcsMikpLHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKX19dmFyIGV4PWk9Pntjb25zdCBhPWkse2Nvb3JkaW5hdGU6dCxzdGFydEhlaWdodDplLGhlaWdodDpufT1hLHM9eGYoYSxbImNvb3JkaW5hdGUiLCJzdGFydEhlaWdodCIsImhlaWdodCJdKTtsZXQgcj1lfHwwO3JldHVybiB0eXBlb2YgZSE9InVuZGVmaW5lZCImJnR5cGVvZiBuIT0idW5kZWZpbmVkIiYmKHI9ZStuKSxuZXcgdHgoW3RdLEtlKFV0KHt9LHMpLHtzdGFydEhlaWdodDplLGVuZEhlaWdodDpyfSkpfTtjb25zdCBueD0oe2Nvb3JkaW5hdGVzOmksbGVuZ3Roczp0LG1ldGFMZW5ndGg6ZSx1c2VHcm91cHM6bixoYXNUb3A6cyx0b3BGaXJzdDpyLGhhc0JvdHRvbTpvLGhhc1NpZGU6YSxwcm9qZWN0aW9uOmMsY3VydmF0dXJlUmVzb2x1dGlvbjpsLGJib3g6aH0pPT57bGV0IHU7YyYmdHlwZW9mIGM9PSJvYmplY3QiP3U9aXMoYyk6dT1jfHwic3BoZXJlIjtjb25zdHtjb29yZGluYXRlc0FycjpmLG1ldGFBcnJheTpkfT1zcyh7Y29vcmRpbmF0ZXM6aSxsZW5ndGhzOnQsbWV0YUxlbmd0aDplfSkscD1mLm1hcCgoeSxnKT0+e2NvbnN0IHc9ZFtnXVswXSxiPWRbZ11bMV18fDA7cmV0dXJuIGV4KHtjb29yZGluYXRlOnkscHJvamVjdGlvbjp1LHN0YXJ0SGVpZ2h0OmIsaGVpZ2h0OncsaGFzVG9wOnMhPW51bGw/czohMCx0b3BGaXJzdDpyIT1udWxsP3I6ITEsaGFzQm90dG9tOm8hPW51bGw/bzohMCxoYXNTaWRlOmEhPW51bGw/YTohMCxjdXJ2YXR1cmVSZXNvbHV0aW9uOmwhPW51bGw/bDoxLGJib3g6aH0pfSk7cmV0dXJuIHJzKHAsbil9LGl4PSh7Y29vcmRpbmF0ZXM6aSxsZW5ndGhzOnQsbWV0YUxlbmd0aDplLHVzZUdyb3VwczpuLHByb2plY3Rpb246cz0ic3BoZXJlIn0pPT57Y29uc3R7Y29vcmRpbmF0ZXNBcnI6cixtZXRhQXJyYXk6b309c3Moe2Nvb3JkaW5hdGVzOmksbGVuZ3Roczp0LG1ldGFMZW5ndGg6ZX0pLGM9ci5tYXAoKGwsaCk9Pntjb25zdCB1PW9baF1bMV18fDA7cmV0dXJuIG9mKHtwb2x5Z29uR2VvSnNvbjpbbF0sc3RhcnRIZWlnaHQ6dSxwcm9qZWN0aW9uOnN9KS50b3BWZXJ0c30pLm1hcCgobCxoKT0+e2NvbnN0IHU9b1toXVswXTtyZXR1cm4gbXUoe25vZGVzOmwsc2V0UG9pbnRXaWR0aDooKT0+dX0pfSk7cmV0dXJuIHJzKGMsbil9O3ZhciBzeD0oaSx0LGUpPT5uZXcgUHJvbWlzZSgobixzKT0+e3ZhciByPWM9Pnt0cnl7YShlLm5leHQoYykpfWNhdGNoKGwpe3MobCl9fSxvPWM9Pnt0cnl7YShlLnRocm93KGMpKX1jYXRjaChsKXtzKGwpfX0sYT1jPT5jLmRvbmU/bihjLnZhbHVlKTpQcm9taXNlLnJlc29sdmUoYy52YWx1ZSkudGhlbihyLG8pO2EoKGU9ZS5hcHBseShpLHQpKS5uZXh0KCkpfSk7ZnVuY3Rpb24gcngoaSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGkpLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTppW2VdLGVudW1lcmFibGU6ITB9KX0se30pfShpPT57Y29uc3QgdD17cnVuKGUsbil7Y29uc3Qgcz1uZXcgRnVuY3Rpb24oInJldHVybiAoIitlKyIpLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7Iik7cmV0dXJuIHMuYXBwbHkocyxuKX0sbWV0aG9kcygpe3JldHVybiBPYmplY3Qua2V5cyh0KX19O2FkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGU9PnN4KHZvaWQgMCxbZV0sZnVuY3Rpb24qKHtkYXRhOm59KXt0cnl7Y29uc3Qgcz10W24ubWV0aG9kXTtpZihzKXtjb25zdCByPXlpZWxkIHMuYXBwbHkocyxuLnBhcmFtcyk7ci50cmFuc2ZlciYmci5tZXNzYWdlP3Bvc3RNZXNzYWdlKHtpZDpuLmlkLHJlc3VsdDpyLm1lc3NhZ2UsZXJyb3I6bnVsbH0sci50cmFuc2Zlcik6cG9zdE1lc3NhZ2Uoe2lkOm4uaWQscmVzdWx0OnIsZXJyb3I6bnVsbH0pfWVsc2UgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIG1ldGhvZCAiJytuLm1ldGhvZCsnIicpfWNhdGNoKHMpe3Bvc3RNZXNzYWdlKHtpZDpuLmlkLHJlc3VsdDpudWxsLGVycm9yOnJ4KHMpfSl9fSkpLE9iamVjdC5rZXlzKGkpLmZvckVhY2goZT0+e3RbZV09aVtlXX0pLHBvc3RNZXNzYWdlKCJyZWFkeSIpfSkoe2V4dHJ1ZGVQb2x5Z29uOnF5LGxpbmU6WnksbGluZTI6V3ksY29uaWNQb2x5Z29uOm54LGNvbmljTGluZTppeH0pfSkoKTsK", t = (l) => Uint8Array.from(atob(l), (b) => b.charCodeAt(0)), C = typeof window != "undefined" && window.Blob && new Blob([t(M)], { type: "text/javascript;charset=utf-8" });
55
55
  function Q(l) {
56
56
  let b;
57
57
  try {