(() => {
var clientBase64 = "KCgpPT57dmFyIFEwPU9iamVjdC5jcmVhdGU7dmFyIF9wPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgSjA9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgWDA9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7dmFyIFowPU9iamVjdC5nZXRQcm90b3R5cGVPZixldz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBUcj0oZSx0KT0+KCk9Pih0fHxlKCh0PXtleHBvcnRzOnt9fSkuZXhwb3J0cyx0KSx0LmV4cG9ydHMpO3ZhciB0dz0oZSx0LG4scik9PntpZih0JiZ0eXBlb2YgdD09Im9iamVjdCJ8fHR5cGVvZiB0PT0iZnVuY3Rpb24iKWZvcihsZXQgbyBvZiBYMCh0KSkhZXcuY2FsbChlLG8pJiZvIT09biYmX3AoZSxvLHtnZXQ6KCk9PnRbb10sZW51bWVyYWJsZTohKHI9SjAodCxvKSl8fHIuZW51bWVyYWJsZX0pO3JldHVybiBlfTt2YXIgeWU9KGUsdCxuKT0+KG49ZSE9bnVsbD9RMChaMChlKSk6e30sdHcodHx8IWV8fCFlLl9fZXNNb2R1bGU/X3AobiwiZGVmYXVsdCIse3ZhbHVlOmUsZW51bWVyYWJsZTohMH0pOm4sZSkpO3ZhciAkcD1UcihzZT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgUW89U3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpLG53PVN5bWJvbC5mb3IoInJlYWN0LnBvcnRhbCIpLHJ3PVN5bWJvbC5mb3IoInJlYWN0LmZyYWdtZW50Iiksb3c9U3ltYm9sLmZvcigicmVhY3Quc3RyaWN0X21vZGUiKSxhdz1TeW1ib2wuZm9yKCJyZWFjdC5wcm9maWxlciIpLGl3PVN5bWJvbC5mb3IoInJlYWN0LnByb3ZpZGVyIiksc3c9U3ltYm9sLmZvcigicmVhY3QuY29udGV4dCIpLGx3PVN5bWJvbC5mb3IoInJlYWN0LmZvcndhcmRfcmVmIiksdXc9U3ltYm9sLmZvcigicmVhY3Quc3VzcGVuc2UiKSxjdz1TeW1ib2wuZm9yKCJyZWFjdC5tZW1vIiksZHc9U3ltYm9sLmZvcigicmVhY3QubGF6eSIpLEFwPVN5bWJvbC5pdGVyYXRvcjtmdW5jdGlvbiBwdyhlKXtyZXR1cm4gZT09PW51bGx8fHR5cGVvZiBlIT0ib2JqZWN0Ij9udWxsOihlPUFwJiZlW0FwXXx8ZVsiQEBpdGVyYXRvciJdLHR5cGVvZiBlPT0iZnVuY3Rpb24iP2U6bnVsbCl9dmFyIE1wPXtpc01vdW50ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZW5xdWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9uKCl7fSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKCl7fSxlbnF1ZXVlU2V0U3RhdGU6ZnVuY3Rpb24oKXt9fSxScD1PYmplY3QuYXNzaWduLElwPXt9O2Z1bmN0aW9uIG9vKGUsdCxuKXt0aGlzLnByb3BzPWUsdGhpcy5jb250ZXh0PXQsdGhpcy5yZWZzPUlwLHRoaXMudXBkYXRlcj1ufHxNcH1vby5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudD17fTtvby5wcm90b3R5cGUuc2V0U3RhdGU9ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgZSE9Im9iamVjdCImJnR5cGVvZiBlIT0iZnVuY3Rpb24iJiZlIT1udWxsKXRocm93IEVycm9yKCJzZXRTdGF0ZSguLi4pOiB0YWtlcyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzIHRvIHVwZGF0ZSBvciBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcy4iKTt0aGlzLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKHRoaXMsZSx0LCJzZXRTdGF0ZSIpfTtvby5wcm90b3R5cGUuZm9yY2VVcGRhdGU9ZnVuY3Rpb24oZSl7dGhpcy51cGRhdGVyLmVucXVldWVGb3JjZVVwZGF0ZSh0aGlzLGUsImZvcmNlVXBkYXRlIil9O2Z1bmN0aW9uIFBwKCl7fVBwLnByb3RvdHlwZT1vby5wcm90b3R5cGU7ZnVuY3Rpb24gUGwoZSx0LG4pe3RoaXMucHJvcHM9ZSx0aGlzLmNvbnRleHQ9dCx0aGlzLnJlZnM9SXAsdGhpcy51cGRhdGVyPW58fE1wfXZhciBMbD1QbC5wcm90b3R5cGU9bmV3IFBwO0xsLmNvbnN0cnVjdG9yPVBsO1JwKExsLG9vLnByb3RvdHlwZSk7TGwuaXNQdXJlUmVhY3RDb21wb25lbnQ9ITA7dmFyIENwPUFycmF5LmlzQXJyYXksTHA9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSx6bD17Y3VycmVudDpudWxsfSx6cD17a2V5OiEwLHJlZjohMCxfX3NlbGY6ITAsX19zb3VyY2U6ITB9O2Z1bmN0aW9uIEZwKGUsdCxuKXt2YXIgcixvPXt9LGE9bnVsbCxpPW51bGw7aWYodCE9bnVsbClmb3IociBpbiB0LnJlZiE9PXZvaWQgMCYmKGk9dC5yZWYpLHQua2V5IT09dm9pZCAwJiYoYT0iIit0LmtleSksdClMcC5jYWxsKHQscikmJiF6cC5oYXNPd25Qcm9wZXJ0eShyKSYmKG9bcl09dFtyXSk7dmFyIHM9YXJndW1lbnRzLmxlbmd0aC0yO2lmKHM9PT0xKW8uY2hpbGRyZW49bjtlbHNlIGlmKDE8cyl7Zm9yKHZhciBsPUFycmF5KHMpLHU9MDt1PHM7dSsrKWxbdV09YXJndW1lbnRzW3UrMl07by5jaGlsZHJlbj1sfWlmKGUmJmUuZGVmYXVsdFByb3BzKWZvcihyIGluIHM9ZS5kZWZhdWx0UHJvcHMscylvW3JdPT09dm9pZCAwJiYob1tyXT1zW3JdKTtyZXR1cm57JCR0eXBlb2Y6UW8sdHlwZTplLGtleTphLHJlZjppLHByb3BzOm8sX293bmVyOnpsLmN1cnJlbnR9fWZ1bmN0aW9uIGZ3KGUsdCl7cmV0dXJueyQkdHlwZW9mOlFvLHR5cGU6ZS50eXBlLGtleTp0LHJlZjplLnJlZixwcm9wczplLnByb3BzLF9vd25lcjplLl9vd25lcn19ZnVuY3Rpb24gRmwoZSl7cmV0dXJuIHR5cGVvZiBlPT0ib2JqZWN0IiYmZSE9PW51bGwmJmUuJCR0eXBlb2Y9PT1Rb31mdW5jdGlvbiBtdyhlKXt2YXIgdD17Ij0iOiI9MCIsIjoiOiI9MiJ9O3JldHVybiIkIitlLnJlcGxhY2UoL1s9Ol0vZyxmdW5jdGlvbihuKXtyZXR1cm4gdFtuXX0pfXZhciBPcD0vXC8rL2c7ZnVuY3Rpb24gSWwoZSx0KXtyZXR1cm4gdHlwZW9mIGU9PSJvYmplY3QiJiZlIT09bnVsbCYmZS5rZXkhPW51bGw/bXcoIiIrZS5rZXkpOnQudG9TdHJpbmcoMzYpfWZ1bmN0aW9uIGJpKGUsdCxuLHIsbyl7dmFyIGE9dHlwZW9mIGU7KGE9PT0idW5kZWZpbmVkInx8YT09PSJib29sZWFuIikmJihlPW51bGwpO3ZhciBpPSExO2lmKGU9PT1udWxsKWk9ITA7ZWxzZSBzd2l0Y2goYSl7Y2FzZSJzdHJpbmciOmNhc2UibnVtYmVyIjppPSEwO2JyZWFrO2Nhc2Uib2JqZWN0Ijpzd2l0Y2goZS4kJHR5cGVvZil7Y2FzZSBRbzpjYXNlIG53Omk9ITB9fWlmKGkpcmV0dXJuIGk9ZSxvPW8oaSksZT1yPT09IiI/Ii4iK0lsKGksMCk6cixDcChvKT8obj0iIixlIT1udWxsJiYobj1lLnJlcGxhY2UoT3AsIiQmLyIpKyIvIiksYmkobyx0LG4sIiIsZnVuY3Rpb24odSl7cmV0dXJuIHV9KSk6byE9bnVsbCYmKEZsKG8pJiYobz1mdyhvLG4rKCFvLmtleXx8aSYmaS5rZXk9PT1vLmtleT8iIjooIiIrby5rZXkpLnJlcGxhY2UoT3AsIiQmLyIpKyIvIikrZSkpLHQucHVzaChvKSksMTtpZihpPTAscj1yPT09IiI/Ii4iOnIrIjoiLENwKGUpKWZvcih2YXIgcz0wO3M8ZS5sZW5ndGg7cysrKXthPWVbc107dmFyIGw9citJbChhLHMpO2krPWJpKGEsdCxuLGwsbyl9ZWxzZSBpZihsPXB3KGUpLHR5cGVvZiBsPT0iZnVuY3Rpb24iKWZvcihlPWwuY2FsbChlKSxzPTA7IShhPWUubmV4dCgpKS5kb25lOylhPWEudmFsdWUsbD1yK0lsKGEscysrKSxpKz1iaShhLHQsbixsLG8pO2Vsc2UgaWYoYT09PSJvYmplY3QiKXRocm93IHQ9U3RyaW5nKGUpLEVycm9yKCJPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6ICIrKHQ9PT0iW29iamVjdCBPYmplY3RdIj8ib2JqZWN0IHdpdGgga2V5cyB7IitPYmplY3Qua2V5cyhlKS5qb2luKCIsICIpKyJ9Ijp0KSsiKS4gSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSBpbnN0ZWFkLiIpO3JldHVybiBpfWZ1bmN0aW9uIHdpKGUsdCxuKXtpZihlPT1udWxsKXJldHVybiBlO3ZhciByPVtdLG89MDtyZXR1cm4gYmkoZSxyLCIiLCIiLGZ1bmN0aW9uKGEpe3JldHVybiB0LmNhbGwobixhLG8rKyl9KSxyfWZ1bmN0aW9uIGh3KGUpe2lmKGUuX3N0YXR1cz09PS0xKXt2YXIgdD1lLl9yZXN1bHQ7dD10KCksdC50aGVuKGZ1bmN0aW9uKG4peyhlLl9zdGF0dXM9PT0wfHxlLl9zdGF0dXM9PT0tMSkmJihlLl9zdGF0dXM9MSxlLl9yZXN1bHQ9bil9LGZ1bmN0aW9uKG4peyhlLl9zdGF0dXM9PT0wfHxlLl9zdGF0dXM9PT0tMSkmJihlLl9zdGF0dXM9MixlLl9yZXN1bHQ9bil9KSxlLl9zdGF0dXM9PT0tMSYmKGUuX3N0YXR1cz0wLGUuX3Jlc3VsdD10KX1pZihlLl9zdGF0dXM9PT0xKXJldHVybiBlLl9yZXN1bHQuZGVmYXVsdDt0aHJvdyBlLl9yZXN1bHR9dmFyIHB0PXtjdXJyZW50Om51bGx9LHhpPXt0cmFuc2l0aW9uOm51bGx9LGd3PXtSZWFjdEN1cnJlbnREaXNwYXRjaGVyOnB0LFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnOnhpLFJlYWN0Q3VycmVudE93bmVyOnpsfTtmdW5jdGlvbiBVcCgpe3Rocm93IEVycm9yKCJhY3QoLi4uKSBpcyBub3Qgc3VwcG9ydGVkIGluIHByb2R1Y3Rpb24gYnVpbGRzIG9mIFJlYWN0LiIpfXNlLkNoaWxkcmVuPXttYXA6d2ksZm9yRWFjaDpmdW5jdGlvbihlLHQsbil7d2koZSxmdW5jdGlvbigpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxuKX0sY291bnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9MDtyZXR1cm4gd2koZSxmdW5jdGlvbigpe3QrK30pLHR9LHRvQXJyYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIHdpKGUsZnVuY3Rpb24odCl7cmV0dXJuIHR9KXx8W119LG9ubHk6ZnVuY3Rpb24oZSl7aWYoIUZsKGUpKXRocm93IEVycm9yKCJSZWFjdC5DaGlsZHJlbi5vbmx5IGV4cGVjdGVkIHRvIHJlY2VpdmUgYSBzaW5nbGUgUmVhY3QgZWxlbWVudCBjaGlsZC4iKTtyZXR1cm4gZX19O3NlLkNvbXBvbmVudD1vbztzZS5GcmFnbWVudD1ydztzZS5Qcm9maWxlcj1hdztzZS5QdXJlQ29tcG9uZW50PVBsO3NlLlN0cmljdE1vZGU9b3c7c2UuU3VzcGVuc2U9dXc7c2UuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9Z3c7c2UuYWN0PVVwO3NlLmNsb25lRWxlbWVudD1mdW5jdGlvbihlLHQsbil7aWYoZT09bnVsbCl0aHJvdyBFcnJvcigiUmVhY3QuY2xvbmVFbGVtZW50KC4uLik6IFRoZSBhcmd1bWVudCBtdXN0IGJlIGEgUmVhY3QgZWxlbWVudCwgYnV0IHlvdSBwYXNzZWQgIitlKyIuIik7dmFyIHI9UnAoe30sZS5wcm9wcyksbz1lLmtleSxhPWUucmVmLGk9ZS5fb3duZXI7aWYodCE9bnVsbCl7aWYodC5yZWYhPT12b2lkIDAmJihhPXQucmVmLGk9emwuY3VycmVudCksdC5rZXkhPT12b2lkIDAmJihvPSIiK3Qua2V5KSxlLnR5cGUmJmUudHlwZS5kZWZhdWx0UHJvcHMpdmFyIHM9ZS50eXBlLmRlZmF1bHRQcm9wcztmb3IobCBpbiB0KUxwLmNhbGwodCxsKSYmIXpwLmhhc093blByb3BlcnR5KGwpJiYocltsXT10W2xdPT09dm9pZCAwJiZzIT09dm9pZCAwP3NbbF06dFtsXSl9dmFyIGw9YXJndW1lbnRzLmxlbmd0aC0yO2lmKGw9PT0xKXIuY2hpbGRyZW49bjtlbHNlIGlmKDE8bCl7cz1BcnJheShsKTtmb3IodmFyIHU9MDt1PGw7dSsrKXNbdV09YXJndW1lbnRzW3UrMl07ci5jaGlsZHJlbj1zfXJldHVybnskJHR5cGVvZjpRbyx0eXBlOmUudHlwZSxrZXk6byxyZWY6YSxwcm9wczpyLF9vd25lcjppfX07c2UuY3JlYXRlQ29udGV4dD1mdW5jdGlvbihlKXtyZXR1cm4gZT17JCR0eXBlb2Y6c3csX2N1cnJlbnRWYWx1ZTplLF9jdXJyZW50VmFsdWUyOmUsX3RocmVhZENvdW50OjAsUHJvdmlkZXI6bnVsbCxDb25zdW1lcjpudWxsLF9kZWZhdWx0VmFsdWU6bnVsbCxfZ2xvYmFsTmFtZTpudWxsfSxlLlByb3ZpZGVyPXskJHR5cGVvZjppdyxfY29udGV4dDplfSxlLkNvbnN1bWVyPWV9O3NlLmNyZWF0ZUVsZW1lbnQ9RnA7c2UuY3JlYXRlRmFjdG9yeT1mdW5jdGlvbihlKXt2YXIgdD1GcC5iaW5kKG51bGwsZSk7cmV0dXJuIHQudHlwZT1lLHR9O3NlLmNyZWF0ZVJlZj1mdW5jdGlvbigpe3JldHVybntjdXJyZW50Om51bGx9fTtzZS5mb3J3YXJkUmVmPWZ1bmN0aW9uKGUpe3JldHVybnskJHR5cGVvZjpsdyxyZW5kZXI6ZX19O3NlLmlzVmFsaWRFbGVtZW50PUZsO3NlLmxhenk9ZnVuY3Rpb24oZSl7cmV0dXJueyQkdHlwZW9mOmR3LF9wYXlsb2FkOntfc3RhdHVzOi0xLF9yZXN1bHQ6ZX0sX2luaXQ6aHd9fTtzZS5tZW1vPWZ1bmN0aW9uKGUsdCl7cmV0dXJueyQkdHlwZW9mOmN3LHR5cGU6ZSxjb21wYXJlOnQ9PT12b2lkIDA/bnVsbDp0fX07c2Uuc3RhcnRUcmFuc2l0aW9uPWZ1bmN0aW9uKGUpe3ZhciB0PXhpLnRyYW5zaXRpb247eGkudHJhbnNpdGlvbj17fTt0cnl7ZSgpfWZpbmFsbHl7eGkudHJhbnNpdGlvbj10fX07c2UudW5zdGFibGVfYWN0PVVwO3NlLnVzZUNhbGxiYWNrPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHB0LmN1cnJlbnQudXNlQ2FsbGJhY2soZSx0KX07c2UudXNlQ29udGV4dD1mdW5jdGlvbihlKXtyZXR1cm4gcHQuY3VycmVudC51c2VDb250ZXh0KGUpfTtzZS51c2VEZWJ1Z1ZhbHVlPWZ1bmN0aW9uKCl7fTtzZS51c2VEZWZlcnJlZFZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiBwdC5jdXJyZW50LnVzZURlZmVycmVkVmFsdWUoZSl9O3NlLnVzZUVmZmVjdD1mdW5jdGlvbihlLHQpe3JldHVybiBwdC5jdXJyZW50LnVzZUVmZmVjdChlLHQpfTtzZS51c2VJZD1mdW5jdGlvbigpe3JldHVybiBwdC5jdXJyZW50LnVzZUlkKCl9O3NlLnVzZUltcGVyYXRpdmVIYW5kbGU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBwdC5jdXJyZW50LnVzZUltcGVyYXRpdmVIYW5kbGUoZSx0LG4pfTtzZS51c2VJbnNlcnRpb25FZmZlY3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcHQuY3VycmVudC51c2VJbnNlcnRpb25FZmZlY3QoZSx0KX07c2UudXNlTGF5b3V0RWZmZWN0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHB0LmN1cnJlbnQudXNlTGF5b3V0RWZmZWN0KGUsdCl9O3NlLnVzZU1lbW89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcHQuY3VycmVudC51c2VNZW1vKGUsdCl9O3NlLnVzZVJlZHVjZXI9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBwdC5jdXJyZW50LnVzZVJlZHVjZXIoZSx0LG4pfTtzZS51c2VSZWY9ZnVuY3Rpb24oZSl7cmV0dXJuIHB0LmN1cnJlbnQudXNlUmVmKGUpfTtzZS51c2VTdGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gcHQuY3VycmVudC51c2VTdGF0ZShlKX07c2UudXNlU3luY0V4dGVybmFsU3RvcmU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBwdC5jdXJyZW50LnVzZVN5bmNFeHRlcm5hbFN0b3JlKGUsdCxuKX07c2UudXNlVHJhbnNpdGlvbj1mdW5jdGlvbigpe3JldHVybiBwdC5jdXJyZW50LnVzZVRyYW5zaXRpb24oKX07c2UudmVyc2lvbj0iMTguMy4xIn0pO3ZhciBtZT1UcigoWEQsQnApPT57InVzZSBzdHJpY3QiO0JwLmV4cG9ydHM9JHAoKX0pO3ZhciBKcD1UcihrZT0+eyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBXbChlLHQpe3ZhciBuPWUubGVuZ3RoO2UucHVzaCh0KTtlOmZvcig7MDxuOyl7dmFyIHI9bi0xPj4+MSxvPWVbcl07aWYoMDxraShvLHQpKWVbcl09dCxlW25dPW8sbj1yO2Vsc2UgYnJlYWsgZX19ZnVuY3Rpb24gcXQoZSl7cmV0dXJuIGUubGVuZ3RoPT09MD9udWxsOmVbMF19ZnVuY3Rpb24gRWkoZSl7aWYoZS5sZW5ndGg9PT0wKXJldHVybiBudWxsO3ZhciB0PWVbMF0sbj1lLnBvcCgpO2lmKG4hPT10KXtlWzBdPW47ZTpmb3IodmFyIHI9MCxvPWUubGVuZ3RoLGE9bz4+PjE7cjxhOyl7dmFyIGk9MioocisxKS0xLHM9ZVtpXSxsPWkrMSx1PWVbbF07aWYoMD5raShzLG4pKWw8byYmMD5raSh1LHMpPyhlW3JdPXUsZVtsXT1uLHI9bCk6KGVbcl09cyxlW2ldPW4scj1pKTtlbHNlIGlmKGw8byYmMD5raSh1LG4pKWVbcl09dSxlW2xdPW4scj1sO2Vsc2UgYnJlYWsgZX19cmV0dXJuIHR9ZnVuY3Rpb24ga2koZSx0KXt2YXIgbj1lLnNvcnRJbmRleC10LnNvcnRJbmRleDtyZXR1cm4gbiE9PTA/bjplLmlkLXQuaWR9dHlwZW9mIHBlcmZvcm1hbmNlPT0ib2JqZWN0IiYmdHlwZW9mIHBlcmZvcm1hbmNlLm5vdz09ImZ1bmN0aW9uIj8oV3A9cGVyZm9ybWFuY2Usa2UudW5zdGFibGVfbm93PWZ1bmN0aW9uKCl7cmV0dXJuIFdwLm5vdygpfSk6KFVsPURhdGUsSHA9VWwubm93KCksa2UudW5zdGFibGVfbm93PWZ1bmN0aW9uKCl7cmV0dXJuIFVsLm5vdygpLUhwfSk7dmFyIFdwLFVsLEhwLG1uPVtdLFluPVtdLHl3PTEsTHQ9bnVsbCxpdD0zLFRpPSExLE5yPSExLFhvPSExLEdwPXR5cGVvZiBzZXRUaW1lb3V0PT0iZnVuY3Rpb24iP3NldFRpbWVvdXQ6bnVsbCxLcD10eXBlb2YgY2xlYXJUaW1lb3V0PT0iZnVuY3Rpb24iP2NsZWFyVGltZW91dDpudWxsLGpwPXR5cGVvZiBzZXRJbW1lZGlhdGU8InUiP3NldEltbWVkaWF0ZTpudWxsO3R5cGVvZiBuYXZpZ2F0b3I8InUiJiZuYXZpZ2F0b3Iuc2NoZWR1bGluZyE9PXZvaWQgMCYmbmF2aWdhdG9yLnNjaGVkdWxpbmcuaXNJbnB1dFBlbmRpbmchPT12b2lkIDAmJm5hdmlnYXRvci5zY2hlZHVsaW5nLmlzSW5wdXRQZW5kaW5nLmJpbmQobmF2aWdhdG9yLnNjaGVkdWxpbmcpO2Z1bmN0aW9uIEhsKGUpe2Zvcih2YXIgdD1xdChZbik7dCE9PW51bGw7KXtpZih0LmNhbGxiYWNrPT09bnVsbClFaShZbik7ZWxzZSBpZih0LnN0YXJ0VGltZTw9ZSlFaShZbiksdC5zb3J0SW5kZXg9dC5leHBpcmF0aW9uVGltZSxXbChtbix0KTtlbHNlIGJyZWFrO3Q9cXQoWW4pfX1mdW5jdGlvbiBqbChlKXtpZihYbz0hMSxIbChlKSwhTnIpaWYocXQobW4pIT09bnVsbClOcj0hMCxHbChWbCk7ZWxzZXt2YXIgdD1xdChZbik7dCE9PW51bGwmJktsKGpsLHQuc3RhcnRUaW1lLWUpfX1mdW5jdGlvbiBWbChlLHQpe05yPSExLFhvJiYoWG89ITEsS3AoWm8pLFpvPS0xKSxUaT0hMDt2YXIgbj1pdDt0cnl7Zm9yKEhsKHQpLEx0PXF0KG1uKTtMdCE9PW51bGwmJighKEx0LmV4cGlyYXRpb25UaW1lPnQpfHxlJiYhUXAoKSk7KXt2YXIgcj1MdC5jYWxsYmFjaztpZih0eXBlb2Ygcj09ImZ1bmN0aW9uIil7THQuY2FsbGJhY2s9bnVsbCxpdD1MdC5wcmlvcml0eUxldmVsO3ZhciBvPXIoTHQuZXhwaXJhdGlvblRpbWU8PXQpO3Q9a2UudW5zdGFibGVfbm93KCksdHlwZW9mIG89PSJmdW5jdGlvbiI/THQuY2FsbGJhY2s9bzpMdD09PXF0KG1uKSYmRWkobW4pLEhsKHQpfWVsc2UgRWkobW4pO0x0PXF0KG1uKX1pZihMdCE9PW51bGwpdmFyIGE9ITA7ZWxzZXt2YXIgaT1xdChZbik7aSE9PW51bGwmJktsKGpsLGkuc3RhcnRUaW1lLXQpLGE9ITF9cmV0dXJuIGF9ZmluYWxseXtMdD1udWxsLGl0PW4sVGk9ITF9fXZhciBOaT0hMSxTaT1udWxsLFpvPS0xLFlwPTUscXA9LTE7ZnVuY3Rpb24gUXAoKXtyZXR1cm4hKGtlLnVuc3RhYmxlX25vdygpLXFwPFlwKX1mdW5jdGlvbiAkbCgpe2lmKFNpIT09bnVsbCl7dmFyIGU9a2UudW5zdGFibGVfbm93KCk7cXA9ZTt2YXIgdD0hMDt0cnl7dD1TaSghMCxlKX1maW5hbGx5e3Q/Sm8oKTooTmk9ITEsU2k9bnVsbCl9fWVsc2UgTmk9ITF9dmFyIEpvO3R5cGVvZiBqcD09ImZ1bmN0aW9uIj9Kbz1mdW5jdGlvbigpe2pwKCRsKX06dHlwZW9mIE1lc3NhZ2VDaGFubmVsPCJ1Ij8oQmw9bmV3IE1lc3NhZ2VDaGFubmVsLFZwPUJsLnBvcnQyLEJsLnBvcnQxLm9ubWVzc2FnZT0kbCxKbz1mdW5jdGlvbigpe1ZwLnBvc3RNZXNzYWdlKG51bGwpfSk6Sm89ZnVuY3Rpb24oKXtHcCgkbCwwKX07dmFyIEJsLFZwO2Z1bmN0aW9uIEdsKGUpe1NpPWUsTml8fChOaT0hMCxKbygpKX1mdW5jdGlvbiBLbChlLHQpe1pvPUdwKGZ1bmN0aW9uKCl7ZShrZS51bnN0YWJsZV9ub3coKSl9LHQpfWtlLnVuc3RhYmxlX0lkbGVQcmlvcml0eT01O2tlLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5PTE7a2UudW5zdGFibGVfTG93UHJpb3JpdHk9NDtrZS51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eT0zO2tlLnVuc3RhYmxlX1Byb2ZpbGluZz1udWxsO2tlLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5PTI7a2UudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2s9ZnVuY3Rpb24oZSl7ZS5jYWxsYmFjaz1udWxsfTtrZS51bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbj1mdW5jdGlvbigpe05yfHxUaXx8KE5yPSEwLEdsKFZsKSl9O2tlLnVuc3RhYmxlX2ZvcmNlRnJhbWVSYXRlPWZ1bmN0aW9uKGUpezA+ZXx8MTI1PGU/Y29uc29sZS5lcnJvcigiZm9yY2VGcmFtZVJhdGUgdGFrZXMgYSBwb3NpdGl2ZSBpbnQgYmV0d2VlbiAwIGFuZCAxMjUsIGZvcmNpbmcgZnJhbWUgcmF0ZXMgaGlnaGVyIHRoYW4gMTI1IGZwcyBpcyBub3Qgc3VwcG9ydGVkIik6WXA9MDxlP01hdGguZmxvb3IoMWUzL2UpOjV9O2tlLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsPWZ1bmN0aW9uKCl7cmV0dXJuIGl0fTtrZS51bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZT1mdW5jdGlvbigpe3JldHVybiBxdChtbil9O2tlLnVuc3RhYmxlX25leHQ9ZnVuY3Rpb24oZSl7c3dpdGNoKGl0KXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzp2YXIgdD0zO2JyZWFrO2RlZmF1bHQ6dD1pdH12YXIgbj1pdDtpdD10O3RyeXtyZXR1cm4gZSgpfWZpbmFsbHl7aXQ9bn19O2tlLnVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uPWZ1bmN0aW9uKCl7fTtrZS51bnN0YWJsZV9yZXF1ZXN0UGFpbnQ9ZnVuY3Rpb24oKXt9O2tlLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eT1mdW5jdGlvbihlLHQpe3N3aXRjaChlKXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzpjYXNlIDQ6Y2FzZSA1OmJyZWFrO2RlZmF1bHQ6ZT0zfXZhciBuPWl0O2l0PWU7dHJ5e3JldHVybiB0KCl9ZmluYWxseXtpdD1ufX07a2UudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjaz1mdW5jdGlvbihlLHQsbil7dmFyIHI9a2UudW5zdGFibGVfbm93KCk7c3dpdGNoKHR5cGVvZiBuPT0ib2JqZWN0IiYmbiE9PW51bGw/KG49bi5kZWxheSxuPXR5cGVvZiBuPT0ibnVtYmVyIiYmMDxuP3IrbjpyKTpuPXIsZSl7Y2FzZSAxOnZhciBvPS0xO2JyZWFrO2Nhc2UgMjpvPTI1MDticmVhaztjYXNlIDU6bz0xMDczNzQxODIzO2JyZWFrO2Nhc2UgNDpvPTFlNDticmVhaztkZWZhdWx0Om89NWUzfXJldHVybiBvPW4rbyxlPXtpZDp5dysrLGNhbGxiYWNrOnQscHJpb3JpdHlMZXZlbDplLHN0YXJ0VGltZTpuLGV4cGlyYXRpb25UaW1lOm8sc29ydEluZGV4Oi0xfSxuPnI/KGUuc29ydEluZGV4PW4sV2woWW4sZSkscXQobW4pPT09bnVsbCYmZT09PXF0KFluKSYmKFhvPyhLcChabyksWm89LTEpOlhvPSEwLEtsKGpsLG4tcikpKTooZS5zb3J0SW5kZXg9byxXbChtbixlKSxOcnx8VGl8fChOcj0hMCxHbChWbCkpKSxlfTtrZS51bnN0YWJsZV9zaG91bGRZaWVsZD1RcDtrZS51bnN0YWJsZV93cmFwQ2FsbGJhY2s9ZnVuY3Rpb24oZSl7dmFyIHQ9aXQ7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49aXQ7aXQ9dDt0cnl7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7aXQ9bn19fX0pO3ZhciBacD1UcigoZV8sWHApPT57InVzZSBzdHJpY3QiO1hwLmV4cG9ydHM9SnAoKX0pO3ZhciBvZz1UcihNdD0+eyJ1c2Ugc3RyaWN0Ijt2YXIgdnc9bWUoKSxDdD1acCgpO2Z1bmN0aW9uIEkoZSl7Zm9yKHZhciB0PSJodHRwczovL3JlYWN0anMub3JnL2RvY3MvZXJyb3ItZGVjb2Rlci5odG1sP2ludmFyaWFudD0iK2Usbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdCs9IiZhcmdzW109IitlbmNvZGVVUklDb21wb25lbnQoYXJndW1lbnRzW25dKTtyZXR1cm4iTWluaWZpZWQgUmVhY3QgZXJyb3IgIyIrZSsiOyB2aXNpdCAiK3QrIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuIn12YXIgc209bmV3IFNldCx4YT17fTtmdW5jdGlvbiBVcihlLHQpe05vKGUsdCksTm8oZSsiQ2FwdHVyZSIsdCl9ZnVuY3Rpb24gTm8oZSx0KXtmb3IoeGFbZV09dCxlPTA7ZTx0Lmxlbmd0aDtlKyspc20uYWRkKHRbZV0pfXZhciBPbj0hKHR5cGVvZiB3aW5kb3c+InUifHx0eXBlb2Ygd2luZG93LmRvY3VtZW50PiJ1Inx8dHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50PiJ1IiksZ3U9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSx3dz0vXls6QS1aX2Etelx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDJGRlx1MDM3MC1cdTAzN0RcdTAzN0YtXHUxRkZGXHUyMDBDLVx1MjAwRFx1MjA3MC1cdTIxOEZcdTJDMDAtXHUyRkVGXHUzMDAxLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkZEXVs6QS1aX2Etelx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDJGRlx1MDM3MC1cdTAzN0RcdTAzN0YtXHUxRkZGXHUyMDBDLVx1MjAwRFx1MjA3MC1cdTIxOEZcdTJDMDAtXHUyRkVGXHUzMDAxLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkZEXC0uMC05XHUwMEI3XHUwMzAwLVx1MDM2Rlx1MjAzRi1cdTIwNDBdKiQvLGVmPXt9LHRmPXt9O2Z1bmN0aW9uIGJ3KGUpe3JldHVybiBndS5jYWxsKHRmLGUpPyEwOmd1LmNhbGwoZWYsZSk/ITE6d3cudGVzdChlKT90ZltlXT0hMDooZWZbZV09ITAsITEpfWZ1bmN0aW9uIHh3KGUsdCxuLHIpe2lmKG4hPT1udWxsJiZuLnR5cGU9PT0wKXJldHVybiExO3N3aXRjaCh0eXBlb2YgdCl7Y2FzZSJmdW5jdGlvbiI6Y2FzZSJzeW1ib2wiOnJldHVybiEwO2Nhc2UiYm9vbGVhbiI6cmV0dXJuIHI/ITE6biE9PW51bGw/IW4uYWNjZXB0c0Jvb2xlYW5zOihlPWUudG9Mb3dlckNhc2UoKS5zbGljZSgwLDUpLGUhPT0iZGF0YS0iJiZlIT09ImFyaWEtIik7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24ga3coZSx0LG4scil7aWYodD09PW51bGx8fHR5cGVvZiB0PiJ1Inx8eHcoZSx0LG4scikpcmV0dXJuITA7aWYocilyZXR1cm4hMTtpZihuIT09bnVsbClzd2l0Y2gobi50eXBlKXtjYXNlIDM6cmV0dXJuIXQ7Y2FzZSA0OnJldHVybiB0PT09ITE7Y2FzZSA1OnJldHVybiBpc05hTih0KTtjYXNlIDY6cmV0dXJuIGlzTmFOKHQpfHwxPnR9cmV0dXJuITF9ZnVuY3Rpb24gaHQoZSx0LG4scixvLGEsaSl7dGhpcy5hY2NlcHRzQm9vbGVhbnM9dD09PTJ8fHQ9PT0zfHx0PT09NCx0aGlzLmF0dHJpYnV0ZU5hbWU9cix0aGlzLmF0dHJpYnV0ZU5hbWVzcGFjZT1vLHRoaXMubXVzdFVzZVByb3BlcnR5PW4sdGhpcy5wcm9wZXJ0eU5hbWU9ZSx0aGlzLnR5cGU9dCx0aGlzLnNhbml0aXplVVJMPWEsdGhpcy5yZW1vdmVFbXB0eVN0cmluZz1pfXZhciBydD17fTsiY2hpbGRyZW4gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgZGVmYXVsdFZhbHVlIGRlZmF1bHRDaGVja2VkIGlubmVySFRNTCBzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIHN0eWxlIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7cnRbZV09bmV3IGh0KGUsMCwhMSxlLG51bGwsITEsITEpfSk7W1siYWNjZXB0Q2hhcnNldCIsImFjY2VwdC1jaGFyc2V0Il0sWyJjbGFzc05hbWUiLCJjbGFzcyJdLFsiaHRtbEZvciIsImZvciJdLFsiaHR0cEVxdWl2IiwiaHR0cC1lcXVpdiJdXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWVbMF07cnRbdF09bmV3IGh0KHQsMSwhMSxlWzFdLG51bGwsITEsITEpfSk7WyJjb250ZW50RWRpdGFibGUiLCJkcmFnZ2FibGUiLCJzcGVsbENoZWNrIiwidmFsdWUiXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3J0W2VdPW5ldyBodChlLDIsITEsZS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7WyJhdXRvUmV2ZXJzZSIsImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQiLCJmb2N1c2FibGUiLCJwcmVzZXJ2ZUFscGhhIl0uZm9yRWFjaChmdW5jdGlvbihlKXtydFtlXT1uZXcgaHQoZSwyLCExLGUsbnVsbCwhMSwhMSl9KTsiYWxsb3dGdWxsU2NyZWVuIGFzeW5jIGF1dG9Gb2N1cyBhdXRvUGxheSBjb250cm9scyBkZWZhdWx0IGRlZmVyIGRpc2FibGVkIGRpc2FibGVQaWN0dXJlSW5QaWN0dXJlIGRpc2FibGVSZW1vdGVQbGF5YmFjayBmb3JtTm9WYWxpZGF0ZSBoaWRkZW4gbG9vcCBub01vZHVsZSBub1ZhbGlkYXRlIG9wZW4gcGxheXNJbmxpbmUgcmVhZE9ubHkgcmVxdWlyZWQgcmV2ZXJzZWQgc2NvcGVkIHNlYW1sZXNzIGl0ZW1TY29wZSIuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3J0W2VdPW5ldyBodChlLDMsITEsZS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7WyJjaGVja2VkIiwibXVsdGlwbGUiLCJtdXRlZCIsInNlbGVjdGVkIl0uZm9yRWFjaChmdW5jdGlvbihlKXtydFtlXT1uZXcgaHQoZSwzLCEwLGUsbnVsbCwhMSwhMSl9KTtbImNhcHR1cmUiLCJkb3dubG9hZCJdLmZvckVhY2goZnVuY3Rpb24oZSl7cnRbZV09bmV3IGh0KGUsNCwhMSxlLG51bGwsITEsITEpfSk7WyJjb2xzIiwicm93cyIsInNpemUiLCJzcGFuIl0uZm9yRWFjaChmdW5jdGlvbihlKXtydFtlXT1uZXcgaHQoZSw2LCExLGUsbnVsbCwhMSwhMSl9KTtbInJvd1NwYW4iLCJzdGFydCJdLmZvckVhY2goZnVuY3Rpb24oZSl7cnRbZV09bmV3IGh0KGUsNSwhMSxlLnRvTG93ZXJDYXNlKCksbnVsbCwhMSwhMSl9KTt2YXIgbGM9L1tcLTpdKFthLXpdKS9nO2Z1bmN0aW9uIHVjKGUpe3JldHVybiBlWzFdLnRvVXBwZXJDYXNlKCl9ImFjY2VudC1oZWlnaHQgYWxpZ25tZW50LWJhc2VsaW5lIGFyYWJpYy1mb3JtIGJhc2VsaW5lLXNoaWZ0IGNhcC1oZWlnaHQgY2xpcC1wYXRoIGNsaXAtcnVsZSBjb2xvci1pbnRlcnBvbGF0aW9uIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyBjb2xvci1wcm9maWxlIGNvbG9yLXJlbmRlcmluZyBkb21pbmFudC1iYXNlbGluZSBlbmFibGUtYmFja2dyb3VuZCBmaWxsLW9wYWNpdHkgZmlsbC1ydWxlIGZsb29kLWNvbG9yIGZsb29kLW9wYWNpdHkgZm9udC1mYW1pbHkgZm9udC1zaXplIGZvbnQtc2l6ZS1hZGp1c3QgZm9udC1zdHJldGNoIGZvbnQtc3R5bGUgZm9udC12YXJpYW50IGZvbnQtd2VpZ2h0IGdseXBoLW5hbWUgZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCBnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCBob3Jpei1hZHYteCBob3Jpei1vcmlnaW4teCBpbWFnZS1yZW5kZXJpbmcgbGV0dGVyLXNwYWNpbmcgbGlnaHRpbmctY29sb3IgbWFya2VyLWVuZCBtYXJrZXItbWlkIG1hcmtlci1zdGFydCBvdmVybGluZS1wb3NpdGlvbiBvdmVybGluZS10aGlja25lc3MgcGFpbnQtb3JkZXIgcGFub3NlLTEgcG9pbnRlci1ldmVudHMgcmVuZGVyaW5nLWludGVudCBzaGFwZS1yZW5kZXJpbmcgc3RvcC1jb2xvciBzdG9wLW9wYWNpdHkgc3RyaWtldGhyb3VnaC1wb3NpdGlvbiBzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyBzdHJva2UtZGFzaGFycmF5IHN0cm9rZS1kYXNob2Zmc2V0IHN0cm9rZS1saW5lY2FwIHN0cm9rZS1saW5lam9pbiBzdHJva2UtbWl0ZXJsaW1pdCBzdHJva2Utb3BhY2l0eSBzdHJva2Utd2lkdGggdGV4dC1hbmNob3IgdGV4dC1kZWNvcmF0aW9uIHRleHQtcmVuZGVyaW5nIHVuZGVybGluZS1wb3NpdGlvbiB1bmRlcmxpbmUtdGhpY2tuZXNzIHVuaWNvZGUtYmlkaSB1bmljb2RlLXJhbmdlIHVuaXRzLXBlci1lbSB2LWFscGhhYmV0aWMgdi1oYW5naW5nIHYtaWRlb2dyYXBoaWMgdi1tYXRoZW1hdGljYWwgdmVjdG9yLWVmZmVjdCB2ZXJ0LWFkdi15IHZlcnQtb3JpZ2luLXggdmVydC1vcmlnaW4teSB3b3JkLXNwYWNpbmcgd3JpdGluZy1tb2RlIHhtbG5zOnhsaW5rIHgtaGVpZ2h0Ii5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKGxjLHVjKTtydFt0XT1uZXcgaHQodCwxLCExLGUsbnVsbCwhMSwhMSl9KTsieGxpbms6YWN0dWF0ZSB4bGluazphcmNyb2xlIHhsaW5rOnJvbGUgeGxpbms6c2hvdyB4bGluazp0aXRsZSB4bGluazp0eXBlIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKGxjLHVjKTtydFt0XT1uZXcgaHQodCwxLCExLGUsImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLCExLCExKX0pO1sieG1sOmJhc2UiLCJ4bWw6bGFuZyIsInhtbDpzcGFjZSJdLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKGxjLHVjKTtydFt0XT1uZXcgaHQodCwxLCExLGUsImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsITEsITEpfSk7WyJ0YWJJbmRleCIsImNyb3NzT3JpZ2luIl0uZm9yRWFjaChmdW5jdGlvbihlKXtydFtlXT1uZXcgaHQoZSwxLCExLGUudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO3J0LnhsaW5rSHJlZj1uZXcgaHQoInhsaW5rSHJlZiIsMSwhMSwieGxpbms6aHJlZiIsImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLCEwLCExKTtbInNyYyIsImhyZWYiLCJhY3Rpb24iLCJmb3JtQWN0aW9uIl0uZm9yRWFjaChmdW5jdGlvbihlKXtydFtlXT1uZXcgaHQoZSwxLCExLGUudG9Mb3dlckNhc2UoKSxudWxsLCEwLCEwKX0pO2Z1bmN0aW9uIGNjKGUsdCxuLHIpe3ZhciBvPXJ0Lmhhc093blByb3BlcnR5KHQpP3J0W3RdOm51bGw7KG8hPT1udWxsP28udHlwZSE9PTA6cnx8ISgyPHQubGVuZ3RoKXx8dFswXSE9PSJvIiYmdFswXSE9PSJPInx8dFsxXSE9PSJuIiYmdFsxXSE9PSJOIikmJihrdyh0LG4sbyxyKSYmKG49bnVsbCkscnx8bz09PW51bGw/YncodCkmJihuPT09bnVsbD9lLnJlbW92ZUF0dHJpYnV0ZSh0KTplLnNldEF0dHJpYnV0ZSh0LCIiK24pKTpvLm11c3RVc2VQcm9wZXJ0eT9lW28ucHJvcGVydHlOYW1lXT1uPT09bnVsbD9vLnR5cGU9PT0zPyExOiIiOm46KHQ9by5hdHRyaWJ1dGVOYW1lLHI9by5hdHRyaWJ1dGVOYW1lc3BhY2Usbj09PW51bGw/ZS5yZW1vdmVBdHRyaWJ1dGUodCk6KG89by50eXBlLG49bz09PTN8fG89PT00JiZuPT09ITA/IiI6IiIrbixyP2Uuc2V0QXR0cmlidXRlTlMocix0LG4pOmUuc2V0QXR0cmlidXRlKHQsbikpKSl9dmFyIFBuPXZ3Ll9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVELERpPVN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKSxzbz1TeW1ib2wuZm9yKCJyZWFjdC5wb3J0YWwiKSxsbz1TeW1ib2wuZm9yKCJyZWFjdC5mcmFnbWVudCIpLGRjPVN5bWJvbC5mb3IoInJlYWN0LnN0cmljdF9tb2RlIikseXU9U3ltYm9sLmZvcigicmVhY3QucHJvZmlsZXIiKSxsbT1TeW1ib2wuZm9yKCJyZWFjdC5wcm92aWRlciIpLHVtPVN5bWJvbC5mb3IoInJlYWN0LmNvbnRleHQiKSxwYz1TeW1ib2wuZm9yKCJyZWFjdC5mb3J3YXJkX3JlZiIpLHZ1PVN5bWJvbC5mb3IoInJlYWN0LnN1c3BlbnNlIiksd3U9U3ltYm9sLmZvcigicmVhY3Quc3VzcGVuc2VfbGlzdCIpLGZjPVN5bWJvbC5mb3IoInJlYWN0Lm1lbW8iKSxRbj1TeW1ib2wuZm9yKCJyZWFjdC5sYXp5Iik7U3ltYm9sLmZvcigicmVhY3Quc2NvcGUiKTtTeW1ib2wuZm9yKCJyZWFjdC5kZWJ1Z190cmFjZV9tb2RlIik7dmFyIGNtPVN5bWJvbC5mb3IoInJlYWN0Lm9mZnNjcmVlbiIpO1N5bWJvbC5mb3IoInJlYWN0LmxlZ2FjeV9oaWRkZW4iKTtTeW1ib2wuZm9yKCJyZWFjdC5jYWNoZSIpO1N5bWJvbC5mb3IoInJlYWN0LnRyYWNpbmdfbWFya2VyIik7dmFyIG5mPVN5bWJvbC5pdGVyYXRvcjtmdW5jdGlvbiBlYShlKXtyZXR1cm4gZT09PW51bGx8fHR5cGVvZiBlIT0ib2JqZWN0Ij9udWxsOihlPW5mJiZlW25mXXx8ZVsiQEBpdGVyYXRvciJdLHR5cGVvZiBlPT0iZnVuY3Rpb24iP2U6bnVsbCl9dmFyIFBlPU9iamVjdC5hc3NpZ24sWWw7ZnVuY3Rpb24gbGEoZSl7aWYoWWw9PT12b2lkIDApdHJ5e3Rocm93IEVycm9yKCl9Y2F0Y2gobil7dmFyIHQ9bi5zdGFjay50cmltKCkubWF0Y2goL1xuKCAqKGF0ICk/KS8pO1lsPXQmJnRbMV18fCIifXJldHVybmAKYCtZbCtlfXZhciBxbD0hMTtmdW5jdGlvbiBRbChlLHQpe2lmKCFlfHxxbClyZXR1cm4iIjtxbD0hMDt2YXIgbj1FcnJvci5wcmVwYXJlU3RhY2tUcmFjZTtFcnJvci5wcmVwYXJlU3RhY2tUcmFjZT12b2lkIDA7dHJ5e2lmKHQpaWYodD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwicHJvcHMiLHtzZXQ6ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigpfX0pLHR5cGVvZiBSZWZsZWN0PT0ib2JqZWN0IiYmUmVmbGVjdC5jb25zdHJ1Y3Qpe3RyeXtSZWZsZWN0LmNvbnN0cnVjdCh0LFtdKX1jYXRjaCh1KXt2YXIgcj11fVJlZmxlY3QuY29uc3RydWN0KGUsW10sdCl9ZWxzZXt0cnl7dC5jYWxsKCl9Y2F0Y2godSl7cj11fWUuY2FsbCh0LnByb3RvdHlwZSl9ZWxzZXt0cnl7dGhyb3cgRXJyb3IoKX1jYXRjaCh1KXtyPXV9ZSgpfX1jYXRjaCh1KXtpZih1JiZyJiZ0eXBlb2YgdS5zdGFjaz09InN0cmluZyIpe2Zvcih2YXIgbz11LnN0YWNrLnNwbGl0KGAKYCksYT1yLnN0YWNrLnNwbGl0KGAKYCksaT1vLmxlbmd0aC0xLHM9YS5sZW5ndGgtMTsxPD1pJiYwPD1zJiZvW2ldIT09YVtzXTspcy0tO2Zvcig7MTw9aSYmMDw9cztpLS0scy0tKWlmKG9baV0hPT1hW3NdKXtpZihpIT09MXx8cyE9PTEpZG8gaWYoaS0tLHMtLSwwPnN8fG9baV0hPT1hW3NdKXt2YXIgbD1gCmArb1tpXS5yZXBsYWNlKCIgYXQgbmV3ICIsIiBhdCAiKTtyZXR1cm4gZS5kaXNwbGF5TmFtZSYmbC5pbmNsdWRlcygiPGFub255bW91cz4iKSYmKGw9bC5yZXBsYWNlKCI8YW5vbnltb3VzPiIsZS5kaXNwbGF5TmFtZSkpLGx9d2hpbGUoMTw9aSYmMDw9cyk7YnJlYWt9fX1maW5hbGx5e3FsPSExLEVycm9yLnByZXBhcmVTdGFja1RyYWNlPW59cmV0dXJuKGU9ZT9lLmRpc3BsYXlOYW1lfHxlLm5hbWU6IiIpP2xhKGUpOiIifWZ1bmN0aW9uIFN3KGUpe3N3aXRjaChlLnRhZyl7Y2FzZSA1OnJldHVybiBsYShlLnR5cGUpO2Nhc2UgMTY6cmV0dXJuIGxhKCJMYXp5Iik7Y2FzZSAxMzpyZXR1cm4gbGEoIlN1c3BlbnNlIik7Y2FzZSAxOTpyZXR1cm4gbGEoIlN1c3BlbnNlTGlzdCIpO2Nhc2UgMDpjYXNlIDI6Y2FzZSAxNTpyZXR1cm4gZT1RbChlLnR5cGUsITEpLGU7Y2FzZSAxMTpyZXR1cm4gZT1RbChlLnR5cGUucmVuZGVyLCExKSxlO2Nhc2UgMTpyZXR1cm4gZT1RbChlLnR5cGUsITApLGU7ZGVmYXVsdDpyZXR1cm4iIn19ZnVuY3Rpb24gYnUoZSl7aWYoZT09bnVsbClyZXR1cm4gbnVsbDtpZih0eXBlb2YgZT09ImZ1bmN0aW9uIilyZXR1cm4gZS5kaXNwbGF5TmFtZXx8ZS5uYW1lfHxudWxsO2lmKHR5cGVvZiBlPT0ic3RyaW5nIilyZXR1cm4gZTtzd2l0Y2goZSl7Y2FzZSBsbzpyZXR1cm4iRnJhZ21lbnQiO2Nhc2Ugc286cmV0dXJuIlBvcnRhbCI7Y2FzZSB5dTpyZXR1cm4iUHJvZmlsZXIiO2Nhc2UgZGM6cmV0dXJuIlN0cmljdE1vZGUiO2Nhc2UgdnU6cmV0dXJuIlN1c3BlbnNlIjtjYXNlIHd1OnJldHVybiJTdXNwZW5zZUxpc3QifWlmKHR5cGVvZiBlPT0ib2JqZWN0Iilzd2l0Y2goZS4kJHR5cGVvZil7Y2FzZSB1bTpyZXR1cm4oZS5kaXNwbGF5TmFtZXx8IkNvbnRleHQiKSsiLkNvbnN1bWVyIjtjYXNlIGxtOnJldHVybihlLl9jb250ZXh0LmRpc3BsYXlOYW1lfHwiQ29udGV4dCIpKyIuUHJvdmlkZXIiO2Nhc2UgcGM6dmFyIHQ9ZS5yZW5kZXI7cmV0dXJuIGU9ZS5kaXNwbGF5TmFtZSxlfHwoZT10LmRpc3BsYXlOYW1lfHx0Lm5hbWV8fCIiLGU9ZSE9PSIiPyJGb3J3YXJkUmVmKCIrZSsiKSI6IkZvcndhcmRSZWYiKSxlO2Nhc2UgZmM6cmV0dXJuIHQ9ZS5kaXNwbGF5TmFtZXx8bnVsbCx0IT09bnVsbD90OmJ1KGUudHlwZSl8fCJNZW1vIjtjYXNlIFFuOnQ9ZS5fcGF5bG9hZCxlPWUuX2luaXQ7dHJ5e3JldHVybiBidShlKHQpKX1jYXRjaHt9fXJldHVybiBudWxsfWZ1bmN0aW9uIEV3KGUpe3ZhciB0PWUudHlwZTtzd2l0Y2goZS50YWcpe2Nhc2UgMjQ6cmV0dXJuIkNhY2hlIjtjYXNlIDk6cmV0dXJuKHQuZGlzcGxheU5hbWV8fCJDb250ZXh0IikrIi5Db25zdW1lciI7Y2FzZSAxMDpyZXR1cm4odC5fY29udGV4dC5kaXNwbGF5TmFtZXx8IkNvbnRleHQiKSsiLlByb3ZpZGVyIjtjYXNlIDE4OnJldHVybiJEZWh5ZHJhdGVkRnJhZ21lbnQiO2Nhc2UgMTE6cmV0dXJuIGU9dC5yZW5kZXIsZT1lLmRpc3BsYXlOYW1lfHxlLm5hbWV8fCIiLHQuZGlzcGxheU5hbWV8fChlIT09IiI/IkZvcndhcmRSZWYoIitlKyIpIjoiRm9yd2FyZFJlZiIpO2Nhc2UgNzpyZXR1cm4iRnJhZ21lbnQiO2Nhc2UgNTpyZXR1cm4gdDtjYXNlIDQ6cmV0dXJuIlBvcnRhbCI7Y2FzZSAzOnJldHVybiJSb290IjtjYXNlIDY6cmV0dXJuIlRleHQiO2Nhc2UgMTY6cmV0dXJuIGJ1KHQpO2Nhc2UgODpyZXR1cm4gdD09PWRjPyJTdHJpY3RNb2RlIjoiTW9kZSI7Y2FzZSAyMjpyZXR1cm4iT2Zmc2NyZWVuIjtjYXNlIDEyOnJldHVybiJQcm9maWxlciI7Y2FzZSAyMTpyZXR1cm4iU2NvcGUiO2Nhc2UgMTM6cmV0dXJuIlN1c3BlbnNlIjtjYXNlIDE5OnJldHVybiJTdXNwZW5zZUxpc3QiO2Nhc2UgMjU6cmV0dXJuIlRyYWNpbmdNYXJrZXIiO2Nhc2UgMTpjYXNlIDA6Y2FzZSAxNzpjYXNlIDI6Y2FzZSAxNDpjYXNlIDE1OmlmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXJldHVybiB0LmRpc3BsYXlOYW1lfHx0Lm5hbWV8fG51bGw7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXJldHVybiB0fXJldHVybiBudWxsfWZ1bmN0aW9uIGNyKGUpe3N3aXRjaCh0eXBlb2YgZSl7Y2FzZSJib29sZWFuIjpjYXNlIm51bWJlciI6Y2FzZSJzdHJpbmciOmNhc2UidW5kZWZpbmVkIjpyZXR1cm4gZTtjYXNlIm9iamVjdCI6cmV0dXJuIGU7ZGVmYXVsdDpyZXR1cm4iIn19ZnVuY3Rpb24gZG0oZSl7dmFyIHQ9ZS50eXBlO3JldHVybihlPWUubm9kZU5hbWUpJiZlLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYodD09PSJjaGVja2JveCJ8fHQ9PT0icmFkaW8iKX1mdW5jdGlvbiBUdyhlKXt2YXIgdD1kbShlKT8iY2hlY2tlZCI6InZhbHVlIixuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsdCkscj0iIitlW3RdO2lmKCFlLmhhc093blByb3BlcnR5KHQpJiZ0eXBlb2YgbjwidSImJnR5cGVvZiBuLmdldD09ImZ1bmN0aW9uIiYmdHlwZW9mIG4uc2V0PT0iZnVuY3Rpb24iKXt2YXIgbz1uLmdldCxhPW4uc2V0O3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG8uY2FsbCh0aGlzKX0sc2V0OmZ1bmN0aW9uKGkpe3I9IiIraSxhLmNhbGwodGhpcyxpKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtlbnVtZXJhYmxlOm4uZW51bWVyYWJsZX0pLHtnZXRWYWx1ZTpmdW5jdGlvbigpe3JldHVybiByfSxzZXRWYWx1ZTpmdW5jdGlvbihpKXtyPSIiK2l9LHN0b3BUcmFja2luZzpmdW5jdGlvbigpe2UuX3ZhbHVlVHJhY2tlcj1udWxsLGRlbGV0ZSBlW3RdfX19fWZ1bmN0aW9uIF9pKGUpe2UuX3ZhbHVlVHJhY2tlcnx8KGUuX3ZhbHVlVHJhY2tlcj1UdyhlKSl9ZnVuY3Rpb24gcG0oZSl7aWYoIWUpcmV0dXJuITE7dmFyIHQ9ZS5fdmFsdWVUcmFja2VyO2lmKCF0KXJldHVybiEwO3ZhciBuPXQuZ2V0VmFsdWUoKSxyPSIiO3JldHVybiBlJiYocj1kbShlKT9lLmNoZWNrZWQ/InRydWUiOiJmYWxzZSI6ZS52YWx1ZSksZT1yLGUhPT1uPyh0LnNldFZhbHVlKGUpLCEwKTohMX1mdW5jdGlvbiBucyhlKXtpZihlPWV8fCh0eXBlb2YgZG9jdW1lbnQ8InUiP2RvY3VtZW50OnZvaWQgMCksdHlwZW9mIGU+InUiKXJldHVybiBudWxsO3RyeXtyZXR1cm4gZS5hY3RpdmVFbGVtZW50fHxlLmJvZHl9Y2F0Y2h7cmV0dXJuIGUuYm9keX19ZnVuY3Rpb24geHUoZSx0KXt2YXIgbj10LmNoZWNrZWQ7cmV0dXJuIFBlKHt9LHQse2RlZmF1bHRDaGVja2VkOnZvaWQgMCxkZWZhdWx0VmFsdWU6dm9pZCAwLHZhbHVlOnZvaWQgMCxjaGVja2VkOm4/P2UuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZH0pfWZ1bmN0aW9uIHJmKGUsdCl7dmFyIG49dC5kZWZhdWx0VmFsdWU9PW51bGw/IiI6dC5kZWZhdWx0VmFsdWUscj10LmNoZWNrZWQhPW51bGw/dC5jaGVja2VkOnQuZGVmYXVsdENoZWNrZWQ7bj1jcih0LnZhbHVlIT1udWxsP3QudmFsdWU6biksZS5fd3JhcHBlclN0YXRlPXtpbml0aWFsQ2hlY2tlZDpyLGluaXRpYWxWYWx1ZTpuLGNvbnRyb2xsZWQ6dC50eXBlPT09ImNoZWNrYm94Inx8dC50eXBlPT09InJhZGlvIj90LmNoZWNrZWQhPW51bGw6dC52YWx1ZSE9bnVsbH19ZnVuY3Rpb24gZm0oZSx0KXt0PXQuY2hlY2tlZCx0IT1udWxsJiZjYyhlLCJjaGVja2VkIix0LCExKX1mdW5jdGlvbiBrdShlLHQpe2ZtKGUsdCk7dmFyIG49Y3IodC52YWx1ZSkscj10LnR5cGU7aWYobiE9bnVsbClyPT09Im51bWJlciI/KG49PT0wJiZlLnZhbHVlPT09IiJ8fGUudmFsdWUhPW4pJiYoZS52YWx1ZT0iIituKTplLnZhbHVlIT09IiIrbiYmKGUudmFsdWU9IiIrbik7ZWxzZSBpZihyPT09InN1Ym1pdCJ8fHI9PT0icmVzZXQiKXtlLnJlbW92ZUF0dHJpYnV0ZSgidmFsdWUiKTtyZXR1cm59dC5oYXNPd25Qcm9wZXJ0eSgidmFsdWUiKT9TdShlLHQudHlwZSxuKTp0Lmhhc093blByb3BlcnR5KCJkZWZhdWx0VmFsdWUiKSYmU3UoZSx0LnR5cGUsY3IodC5kZWZhdWx0VmFsdWUpKSx0LmNoZWNrZWQ9PW51bGwmJnQuZGVmYXVsdENoZWNrZWQhPW51bGwmJihlLmRlZmF1bHRDaGVja2VkPSEhdC5kZWZhdWx0Q2hlY2tlZCl9ZnVuY3Rpb24gb2YoZSx0LG4pe2lmKHQuaGFzT3duUHJvcGVydHkoInZhbHVlIil8fHQuaGFzT3duUHJvcGVydHkoImRlZmF1bHRWYWx1ZSIpKXt2YXIgcj10LnR5cGU7aWYoIShyIT09InN1Ym1pdCImJnIhPT0icmVzZXQifHx0LnZhbHVlIT09dm9pZCAwJiZ0LnZhbHVlIT09bnVsbCkpcmV0dXJuO3Q9IiIrZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSxufHx0PT09ZS52YWx1ZXx8KGUudmFsdWU9dCksZS5kZWZhdWx0VmFsdWU9dH1uPWUubmFtZSxuIT09IiImJihlLm5hbWU9IiIpLGUuZGVmYXVsdENoZWNrZWQ9ISFlLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWQsbiE9PSIiJiYoZS5uYW1lPW4pfWZ1bmN0aW9uIFN1KGUsdCxuKXsodCE9PSJudW1iZXIifHxucyhlLm93bmVyRG9jdW1lbnQpIT09ZSkmJihuPT1udWxsP2UuZGVmYXVsdFZhbHVlPSIiK2UuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWU6ZS5kZWZhdWx0VmFsdWUhPT0iIituJiYoZS5kZWZhdWx0VmFsdWU9IiIrbikpfXZhciB1YT1BcnJheS5pc0FycmF5O2Z1bmN0aW9uIGJvKGUsdCxuLHIpe2lmKGU9ZS5vcHRpb25zLHQpe3Q9e307Zm9yKHZhciBvPTA7bzxuLmxlbmd0aDtvKyspdFsiJCIrbltvXV09ITA7Zm9yKG49MDtuPGUubGVuZ3RoO24rKylvPXQuaGFzT3duUHJvcGVydHkoIiQiK2Vbbl0udmFsdWUpLGVbbl0uc2VsZWN0ZWQhPT1vJiYoZVtuXS5zZWxlY3RlZD1vKSxvJiZyJiYoZVtuXS5kZWZhdWx0U2VsZWN0ZWQ9ITApfWVsc2V7Zm9yKG49IiIrY3IobiksdD1udWxsLG89MDtvPGUubGVuZ3RoO28rKyl7aWYoZVtvXS52YWx1ZT09PW4pe2Vbb10uc2VsZWN0ZWQ9ITAsciYmKGVbb10uZGVmYXVsdFNlbGVjdGVkPSEwKTtyZXR1cm59dCE9PW51bGx8fGVbb10uZGlzYWJsZWR8fCh0PWVbb10pfXQhPT1udWxsJiYodC5zZWxlY3RlZD0hMCl9fWZ1bmN0aW9uIEV1KGUsdCl7aWYodC5kYW5nZXJvdXNseVNldElubmVySFRNTCE9bnVsbCl0aHJvdyBFcnJvcihJKDkxKSk7cmV0dXJuIFBlKHt9LHQse3ZhbHVlOnZvaWQgMCxkZWZhdWx0VmFsdWU6dm9pZCAwLGNoaWxkcmVuOiIiK2UuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWV9KX1mdW5jdGlvbiBhZihlLHQpe3ZhciBuPXQudmFsdWU7aWYobj09bnVsbCl7aWYobj10LmNoaWxkcmVuLHQ9dC5kZWZhdWx0VmFsdWUsbiE9bnVsbCl7aWYodCE9bnVsbCl0aHJvdyBFcnJvcihJKDkyKSk7aWYodWEobikpe2lmKDE8bi5sZW5ndGgpdGhyb3cgRXJyb3IoSSg5MykpO249blswXX10PW59dD09bnVsbCYmKHQ9IiIpLG49dH1lLl93cmFwcGVyU3RhdGU9e2luaXRpYWxWYWx1ZTpjcihuKX19ZnVuY3Rpb24gbW0oZSx0KXt2YXIgbj1jcih0LnZhbHVlKSxyPWNyKHQuZGVmYXVsdFZhbHVlKTtuIT1udWxsJiYobj0iIituLG4hPT1lLnZhbHVlJiYoZS52YWx1ZT1uKSx0LmRlZmF1bHRWYWx1ZT09bnVsbCYmZS5kZWZhdWx0VmFsdWUhPT1uJiYoZS5kZWZhdWx0VmFsdWU9bikpLHIhPW51bGwmJihlLmRlZmF1bHRWYWx1ZT0iIityKX1mdW5jdGlvbiBzZihlKXt2YXIgdD1lLnRleHRDb250ZW50O3Q9PT1lLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlJiZ0IT09IiImJnQhPT1udWxsJiYoZS52YWx1ZT10KX1mdW5jdGlvbiBobShlKXtzd2l0Y2goZSl7Y2FzZSJzdmciOnJldHVybiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7Y2FzZSJtYXRoIjpyZXR1cm4iaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCI7ZGVmYXVsdDpyZXR1cm4iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCJ9fWZ1bmN0aW9uIFR1KGUsdCl7cmV0dXJuIGU9PW51bGx8fGU9PT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI/aG0odCk6ZT09PSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyImJnQ9PT0iZm9yZWlnbk9iamVjdCI/Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOmV9dmFyIEFpLGdtPWZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgTVNBcHA8InUiJiZNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbj9mdW5jdGlvbih0LG4scixvKXtNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbihmdW5jdGlvbigpe3JldHVybiBlKHQsbixyLG8pfSl9OmV9KGZ1bmN0aW9uKGUsdCl7aWYoZS5uYW1lc3BhY2VVUkkhPT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcifHwiaW5uZXJIVE1MImluIGUpZS5pbm5lckhUTUw9dDtlbHNle2ZvcihBaT1BaXx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksQWkuaW5uZXJIVE1MPSI8c3ZnPiIrdC52YWx1ZU9mKCkudG9TdHJpbmcoKSsiPC9zdmc+Iix0PUFpLmZpcnN0Q2hpbGQ7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7Zm9yKDt0LmZpcnN0Q2hpbGQ7KWUuYXBwZW5kQ2hpbGQodC5maXJzdENoaWxkKX19KTtmdW5jdGlvbiBrYShlLHQpe2lmKHQpe3ZhciBuPWUuZmlyc3RDaGlsZDtpZihuJiZuPT09ZS5sYXN0Q2hpbGQmJm4ubm9kZVR5cGU9PT0zKXtuLm5vZGVWYWx1ZT10O3JldHVybn19ZS50ZXh0Q29udGVudD10fXZhciBwYT17YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsYXNwZWN0UmF0aW86ITAsYm9yZGVySW1hZ2VPdXRzZXQ6ITAsYm9yZGVySW1hZ2VTbGljZTohMCxib3JkZXJJbWFnZVdpZHRoOiEwLGJveEZsZXg6ITAsYm94RmxleEdyb3VwOiEwLGJveE9yZGluYWxHcm91cDohMCxjb2x1bW5Db3VudDohMCxjb2x1bW5zOiEwLGZsZXg6ITAsZmxleEdyb3c6ITAsZmxleFBvc2l0aXZlOiEwLGZsZXhTaHJpbms6ITAsZmxleE5lZ2F0aXZlOiEwLGZsZXhPcmRlcjohMCxncmlkQXJlYTohMCxncmlkUm93OiEwLGdyaWRSb3dFbmQ6ITAsZ3JpZFJvd1NwYW46ITAsZ3JpZFJvd1N0YXJ0OiEwLGdyaWRDb2x1bW46ITAsZ3JpZENvbHVtbkVuZDohMCxncmlkQ29sdW1uU3BhbjohMCxncmlkQ29sdW1uU3RhcnQ6ITAsZm9udFdlaWdodDohMCxsaW5lQ2xhbXA6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsdGFiU2l6ZTohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITAsZmlsbE9wYWNpdHk6ITAsZmxvb2RPcGFjaXR5OiEwLHN0b3BPcGFjaXR5OiEwLHN0cm9rZURhc2hhcnJheTohMCxzdHJva2VEYXNob2Zmc2V0OiEwLHN0cm9rZU1pdGVybGltaXQ6ITAsc3Ryb2tlT3BhY2l0eTohMCxzdHJva2VXaWR0aDohMH0sTnc9WyJXZWJraXQiLCJtcyIsIk1veiIsIk8iXTtPYmplY3Qua2V5cyhwYSkuZm9yRWFjaChmdW5jdGlvbihlKXtOdy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Q9dCtlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc3Vic3RyaW5nKDEpLHBhW3RdPXBhW2VdfSl9KTtmdW5jdGlvbiB5bShlLHQsbil7cmV0dXJuIHQ9PW51bGx8fHR5cGVvZiB0PT0iYm9vbGVhbiJ8fHQ9PT0iIj8iIjpufHx0eXBlb2YgdCE9Im51bWJlciJ8fHQ9PT0wfHxwYS5oYXNPd25Qcm9wZXJ0eShlKSYmcGFbZV0/KCIiK3QpLnRyaW0oKTp0KyJweCJ9ZnVuY3Rpb24gdm0oZSx0KXtlPWUuc3R5bGU7Zm9yKHZhciBuIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShuKSl7dmFyIHI9bi5pbmRleE9mKCItLSIpPT09MCxvPXltKG4sdFtuXSxyKTtuPT09ImZsb2F0IiYmKG49ImNzc0Zsb2F0Iikscj9lLnNldFByb3BlcnR5KG4sbyk6ZVtuXT1vfX12YXIgRHc9UGUoe21lbnVpdGVtOiEwfSx7YXJlYTohMCxiYXNlOiEwLGJyOiEwLGNvbDohMCxlbWJlZDohMCxocjohMCxpbWc6ITAsaW5wdXQ6ITAsa2V5Z2VuOiEwLGxpbms6ITAsbWV0YTohMCxwYXJhbTohMCxzb3VyY2U6ITAsdHJhY2s6ITAsd2JyOiEwfSk7ZnVuY3Rpb24gTnUoZSx0KXtpZih0KXtpZihEd1tlXSYmKHQuY2hpbGRyZW4hPW51bGx8fHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwhPW51bGwpKXRocm93IEVycm9yKEkoMTM3LGUpKTtpZih0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIT1udWxsKXtpZih0LmNoaWxkcmVuIT1udWxsKXRocm93IEVycm9yKEkoNjApKTtpZih0eXBlb2YgdC5kYW5nZXJvdXNseVNldElubmVySFRNTCE9Im9iamVjdCJ8fCEoIl9faHRtbCJpbiB0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSl0aHJvdyBFcnJvcihJKDYxKSl9aWYodC5zdHlsZSE9bnVsbCYmdHlwZW9mIHQuc3R5bGUhPSJvYmplY3QiKXRocm93IEVycm9yKEkoNjIpKX19ZnVuY3Rpb24gRHUoZSx0KXtpZihlLmluZGV4T2YoIi0iKT09PS0xKXJldHVybiB0eXBlb2YgdC5pcz09InN0cmluZyI7c3dpdGNoKGUpe2Nhc2UiYW5ub3RhdGlvbi14bWwiOmNhc2UiY29sb3ItcHJvZmlsZSI6Y2FzZSJmb250LWZhY2UiOmNhc2UiZm9udC1mYWNlLXNyYyI6Y2FzZSJmb250LWZhY2UtdXJpIjpjYXNlImZvbnQtZmFjZS1mb3JtYXQiOmNhc2UiZm9udC1mYWNlLW5hbWUiOmNhc2UibWlzc2luZy1nbHlwaCI6cmV0dXJuITE7ZGVmYXVsdDpyZXR1cm4hMH19dmFyIF91PW51bGw7ZnVuY3Rpb24gbWMoZSl7cmV0dXJuIGU9ZS50YXJnZXR8fGUuc3JjRWxlbWVudHx8d2luZG93LGUuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQmJihlPWUuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQpLGUubm9kZVR5cGU9PT0zP2UucGFyZW50Tm9kZTplfXZhciBBdT1udWxsLHhvPW51bGwsa289bnVsbDtmdW5jdGlvbiBsZihlKXtpZihlPSRhKGUpKXtpZih0eXBlb2YgQXUhPSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoSSgyODApKTt2YXIgdD1lLnN0YXRlTm9kZTt0JiYodD1Dcyh0KSxBdShlLnN0YXRlTm9kZSxlLnR5cGUsdCkpfX1mdW5jdGlvbiB3bShlKXt4bz9rbz9rby5wdXNoKGUpOmtvPVtlXTp4bz1lfWZ1bmN0aW9uIGJtKCl7aWYoeG8pe3ZhciBlPXhvLHQ9a287aWYoa289eG89bnVsbCxsZihlKSx0KWZvcihlPTA7ZTx0Lmxlbmd0aDtlKyspbGYodFtlXSl9fWZ1bmN0aW9uIHhtKGUsdCl7cmV0dXJuIGUodCl9ZnVuY3Rpb24ga20oKXt9dmFyIEpsPSExO2Z1bmN0aW9uIFNtKGUsdCxuKXtpZihKbClyZXR1cm4gZSh0LG4pO0psPSEwO3RyeXtyZXR1cm4geG0oZSx0LG4pfWZpbmFsbHl7Smw9ITEsKHhvIT09bnVsbHx8a28hPT1udWxsKSYmKGttKCksYm0oKSl9fWZ1bmN0aW9uIFNhKGUsdCl7dmFyIG49ZS5zdGF0ZU5vZGU7aWYobj09PW51bGwpcmV0dXJuIG51bGw7dmFyIHI9Q3Mobik7aWYocj09PW51bGwpcmV0dXJuIG51bGw7bj1yW3RdO2U6c3dpdGNoKHQpe2Nhc2Uib25DbGljayI6Y2FzZSJvbkNsaWNrQ2FwdHVyZSI6Y2FzZSJvbkRvdWJsZUNsaWNrIjpjYXNlIm9uRG91YmxlQ2xpY2tDYXB0dXJlIjpjYXNlIm9uTW91c2VEb3duIjpjYXNlIm9uTW91c2VEb3duQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlTW92ZSI6Y2FzZSJvbk1vdXNlTW92ZUNhcHR1cmUiOmNhc2Uib25Nb3VzZVVwIjpjYXNlIm9uTW91c2VVcENhcHR1cmUiOmNhc2Uib25Nb3VzZUVudGVyIjoocj0hci5kaXNhYmxlZCl8fChlPWUudHlwZSxyPSEoZT09PSJidXR0b24ifHxlPT09ImlucHV0Inx8ZT09PSJzZWxlY3QifHxlPT09InRleHRhcmVhIikpLGU9IXI7YnJlYWsgZTtkZWZhdWx0OmU9ITF9aWYoZSlyZXR1cm4gbnVsbDtpZihuJiZ0eXBlb2YgbiE9ImZ1bmN0aW9uIil0aHJvdyBFcnJvcihJKDIzMSx0LHR5cGVvZiBuKSk7cmV0dXJuIG59dmFyIEN1PSExO2lmKE9uKXRyeXthbz17fSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYW8sInBhc3NpdmUiLHtnZXQ6ZnVuY3Rpb24oKXtDdT0hMH19KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsYW8sYW8pLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0Iixhbyxhbyl9Y2F0Y2h7Q3U9ITF9dmFyIGFvO2Z1bmN0aW9uIF93KGUsdCxuLHIsbyxhLGkscyxsKXt2YXIgdT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMyk7dHJ5e3QuYXBwbHkobix1KX1jYXRjaChjKXt0aGlzLm9uRXJyb3IoYyl9fXZhciBmYT0hMSxycz1udWxsLG9zPSExLE91PW51bGwsQXc9e29uRXJyb3I6ZnVuY3Rpb24oZSl7ZmE9ITAscnM9ZX19O2Z1bmN0aW9uIEN3KGUsdCxuLHIsbyxhLGkscyxsKXtmYT0hMSxycz1udWxsLF93LmFwcGx5KEF3LGFyZ3VtZW50cyl9ZnVuY3Rpb24gT3coZSx0LG4scixvLGEsaSxzLGwpe2lmKEN3LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxmYSl7aWYoZmEpe3ZhciB1PXJzO2ZhPSExLHJzPW51bGx9ZWxzZSB0aHJvdyBFcnJvcihJKDE5OCkpO29zfHwob3M9ITAsT3U9dSl9fWZ1bmN0aW9uICRyKGUpe3ZhciB0PWUsbj1lO2lmKGUuYWx0ZXJuYXRlKWZvcig7dC5yZXR1cm47KXQ9dC5yZXR1cm47ZWxzZXtlPXQ7ZG8gdD1lLHQuZmxhZ3MmNDA5OCYmKG49dC5yZXR1cm4pLGU9dC5yZXR1cm47d2hpbGUoZSl9cmV0dXJuIHQudGFnPT09Mz9uOm51bGx9ZnVuY3Rpb24gRW0oZSl7aWYoZS50YWc9PT0xMyl7dmFyIHQ9ZS5tZW1vaXplZFN0YXRlO2lmKHQ9PT1udWxsJiYoZT1lLmFsdGVybmF0ZSxlIT09bnVsbCYmKHQ9ZS5tZW1vaXplZFN0YXRlKSksdCE9PW51bGwpcmV0dXJuIHQuZGVoeWRyYXRlZH1yZXR1cm4gbnVsbH1mdW5jdGlvbiB1ZihlKXtpZigkcihlKSE9PWUpdGhyb3cgRXJyb3IoSSgxODgpKX1mdW5jdGlvbiBNdyhlKXt2YXIgdD1lLmFsdGVybmF0ZTtpZighdCl7aWYodD0kcihlKSx0PT09bnVsbCl0aHJvdyBFcnJvcihJKDE4OCkpO3JldHVybiB0IT09ZT9udWxsOmV9Zm9yKHZhciBuPWUscj10Ozspe3ZhciBvPW4ucmV0dXJuO2lmKG89PT1udWxsKWJyZWFrO3ZhciBhPW8uYWx0ZXJuYXRlO2lmKGE9PT1udWxsKXtpZihyPW8ucmV0dXJuLHIhPT1udWxsKXtuPXI7Y29udGludWV9YnJlYWt9aWYoby5jaGlsZD09PWEuY2hpbGQpe2ZvcihhPW8uY2hpbGQ7YTspe2lmKGE9PT1uKXJldHVybiB1ZihvKSxlO2lmKGE9PT1yKXJldHVybiB1ZihvKSx0O2E9YS5zaWJsaW5nfXRocm93IEVycm9yKEkoMTg4KSl9aWYobi5yZXR1cm4hPT1yLnJldHVybiluPW8scj1hO2Vsc2V7Zm9yKHZhciBpPSExLHM9by5jaGlsZDtzOyl7aWYocz09PW4pe2k9ITAsbj1vLHI9YTticmVha31pZihzPT09cil7aT0hMCxyPW8sbj1hO2JyZWFrfXM9cy5zaWJsaW5nfWlmKCFpKXtmb3Iocz1hLmNoaWxkO3M7KXtpZihzPT09bil7aT0hMCxuPWEscj1vO2JyZWFrfWlmKHM9PT1yKXtpPSEwLHI9YSxuPW87YnJlYWt9cz1zLnNpYmxpbmd9aWYoIWkpdGhyb3cgRXJyb3IoSSgxODkpKX19aWYobi5hbHRlcm5hdGUhPT1yKXRocm93IEVycm9yKEkoMTkwKSl9aWYobi50YWchPT0zKXRocm93IEVycm9yKEkoMTg4KSk7cmV0dXJuIG4uc3RhdGVOb2RlLmN1cnJlbnQ9PT1uP2U6dH1mdW5jdGlvbiBUbShlKXtyZXR1cm4gZT1NdyhlKSxlIT09bnVsbD9ObShlKTpudWxsfWZ1bmN0aW9uIE5tKGUpe2lmKGUudGFnPT09NXx8ZS50YWc9PT02KXJldHVybiBlO2ZvcihlPWUuY2hpbGQ7ZSE9PW51bGw7KXt2YXIgdD1ObShlKTtpZih0IT09bnVsbClyZXR1cm4gdDtlPWUuc2libGluZ31yZXR1cm4gbnVsbH12YXIgRG09Q3QudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayxjZj1DdC51bnN0YWJsZV9jYW5jZWxDYWxsYmFjayxSdz1DdC51bnN0YWJsZV9zaG91bGRZaWVsZCxJdz1DdC51bnN0YWJsZV9yZXF1ZXN0UGFpbnQsRmU9Q3QudW5zdGFibGVfbm93LFB3PUN0LnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsLGhjPUN0LnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5LF9tPUN0LnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5LGFzPUN0LnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LEx3PUN0LnVuc3RhYmxlX0xvd1ByaW9yaXR5LEFtPUN0LnVuc3RhYmxlX0lkbGVQcmlvcml0eSxOcz1udWxsLHZuPW51bGw7ZnVuY3Rpb24gencoZSl7aWYodm4mJnR5cGVvZiB2bi5vbkNvbW1pdEZpYmVyUm9vdD09ImZ1bmN0aW9uIil0cnl7dm4ub25Db21taXRGaWJlclJvb3QoTnMsZSx2b2lkIDAsKGUuY3VycmVudC5mbGFncyYxMjgpPT09MTI4KX1jYXRjaHt9fXZhciBlbj1NYXRoLmNsejMyP01hdGguY2x6MzI6JHcsRnc9TWF0aC5sb2csVXc9TWF0aC5MTjI7ZnVuY3Rpb24gJHcoZSl7cmV0dXJuIGU+Pj49MCxlPT09MD8zMjozMS0oRncoZSkvVXd8MCl8MH12YXIgQ2k9NjQsT2k9NDE5NDMwNDtmdW5jdGlvbiBjYShlKXtzd2l0Y2goZSYtZSl7Y2FzZSAxOnJldHVybiAxO2Nhc2UgMjpyZXR1cm4gMjtjYXNlIDQ6cmV0dXJuIDQ7Y2FzZSA4OnJldHVybiA4O2Nhc2UgMTY6cmV0dXJuIDE2O2Nhc2UgMzI6cmV0dXJuIDMyO2Nhc2UgNjQ6Y2FzZSAxMjg6Y2FzZSAyNTY6Y2FzZSA1MTI6Y2FzZSAxMDI0OmNhc2UgMjA0ODpjYXNlIDQwOTY6Y2FzZSA4MTkyOmNhc2UgMTYzODQ6Y2FzZSAzMjc2ODpjYXNlIDY1NTM2OmNhc2UgMTMxMDcyOmNhc2UgMjYyMTQ0OmNhc2UgNTI0Mjg4OmNhc2UgMTA0ODU3NjpjYXNlIDIwOTcxNTI6cmV0dXJuIGUmNDE5NDI0MDtjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpjYXNlIDY3MTA4ODY0OnJldHVybiBlJjEzMDAyMzQyNDtjYXNlIDEzNDIxNzcyODpyZXR1cm4gMTM0MjE3NzI4O2Nhc2UgMjY4NDM1NDU2OnJldHVybiAyNjg0MzU0NTY7Y2FzZSA1MzY4NzA5MTI6cmV0dXJuIDUzNjg3MDkxMjtjYXNlIDEwNzM3NDE4MjQ6cmV0dXJuIDEwNzM3NDE4MjQ7ZGVmYXVsdDpyZXR1cm4gZX19ZnVuY3Rpb24gaXMoZSx0KXt2YXIgbj1lLnBlbmRpbmdMYW5lcztpZihuPT09MClyZXR1cm4gMDt2YXIgcj0wLG89ZS5zdXNwZW5kZWRMYW5lcyxhPWUucGluZ2VkTGFuZXMsaT1uJjI2ODQzNTQ1NTtpZihpIT09MCl7dmFyIHM9aSZ+bztzIT09MD9yPWNhKHMpOihhJj1pLGEhPT0wJiYocj1jYShhKSkpfWVsc2UgaT1uJn5vLGkhPT0wP3I9Y2EoaSk6YSE9PTAmJihyPWNhKGEpKTtpZihyPT09MClyZXR1cm4gMDtpZih0IT09MCYmdCE9PXImJiEodCZvKSYmKG89ciYtcixhPXQmLXQsbz49YXx8bz09PTE2JiYoYSY0MTk0MjQwKSE9PTApKXJldHVybiB0O2lmKHImNCYmKHJ8PW4mMTYpLHQ9ZS5lbnRhbmdsZWRMYW5lcyx0IT09MClmb3IoZT1lLmVudGFuZ2xlbWVudHMsdCY9cjswPHQ7KW49MzEtZW4odCksbz0xPDxuLHJ8PWVbbl0sdCY9fm87cmV0dXJuIHJ9ZnVuY3Rpb24gQncoZSx0KXtzd2l0Y2goZSl7Y2FzZSAxOmNhc2UgMjpjYXNlIDQ6cmV0dXJuIHQrMjUwO2Nhc2UgODpjYXNlIDE2OmNhc2UgMzI6Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpyZXR1cm4gdCs1ZTM7Y2FzZSA0MTk0MzA0OmNhc2UgODM4ODYwODpjYXNlIDE2Nzc3MjE2OmNhc2UgMzM1NTQ0MzI6Y2FzZSA2NzEwODg2NDpyZXR1cm4tMTtjYXNlIDEzNDIxNzcyODpjYXNlIDI2ODQzNTQ1NjpjYXNlIDUzNjg3MDkxMjpjYXNlIDEwNzM3NDE4MjQ6cmV0dXJuLTE7ZGVmYXVsdDpyZXR1cm4tMX19ZnVuY3Rpb24gV3coZSx0KXtmb3IodmFyIG49ZS5zdXNwZW5kZWRMYW5lcyxyPWUucGluZ2VkTGFuZXMsbz1lLmV4cGlyYXRpb25UaW1lcyxhPWUucGVuZGluZ0xhbmVzOzA8YTspe3ZhciBpPTMxLWVuKGEpLHM9MTw8aSxsPW9baV07bD09PS0xPyghKHMmbil8fHMmcikmJihvW2ldPUJ3KHMsdCkpOmw8PXQmJihlLmV4cGlyZWRMYW5lc3w9cyksYSY9fnN9fWZ1bmN0aW9uIE11KGUpe3JldHVybiBlPWUucGVuZGluZ0xhbmVzJi0xMDczNzQxODI1LGUhPT0wP2U6ZSYxMDczNzQxODI0PzEwNzM3NDE4MjQ6MH1mdW5jdGlvbiBDbSgpe3ZhciBlPUNpO3JldHVybiBDaTw8PTEsIShDaSY0MTk0MjQwKSYmKENpPTY0KSxlfWZ1bmN0aW9uIFhsKGUpe2Zvcih2YXIgdD1bXSxuPTA7MzE+bjtuKyspdC5wdXNoKGUpO3JldHVybiB0fWZ1bmN0aW9uIEZhKGUsdCxuKXtlLnBlbmRpbmdMYW5lc3w9dCx0IT09NTM2ODcwOTEyJiYoZS5zdXNwZW5kZWRMYW5lcz0wLGUucGluZ2VkTGFuZXM9MCksZT1lLmV2ZW50VGltZXMsdD0zMS1lbih0KSxlW3RdPW59ZnVuY3Rpb24gSHcoZSx0KXt2YXIgbj1lLnBlbmRpbmdMYW5lcyZ+dDtlLnBlbmRpbmdMYW5lcz10LGUuc3VzcGVuZGVkTGFuZXM9MCxlLnBpbmdlZExhbmVzPTAsZS5leHBpcmVkTGFuZXMmPXQsZS5tdXRhYmxlUmVhZExhbmVzJj10LGUuZW50YW5nbGVkTGFuZXMmPXQsdD1lLmVudGFuZ2xlbWVudHM7dmFyIHI9ZS5ldmVudFRpbWVzO2ZvcihlPWUuZXhwaXJhdGlvblRpbWVzOzA8bjspe3ZhciBvPTMxLWVuKG4pLGE9MTw8bzt0W29dPTAscltvXT0tMSxlW29dPS0xLG4mPX5hfX1mdW5jdGlvbiBnYyhlLHQpe3ZhciBuPWUuZW50YW5nbGVkTGFuZXN8PXQ7Zm9yKGU9ZS5lbnRhbmdsZW1lbnRzO247KXt2YXIgcj0zMS1lbihuKSxvPTE8PHI7byZ0fGVbcl0mdCYmKGVbcl18PXQpLG4mPX5vfX12YXIgdmU9MDtmdW5jdGlvbiBPbShlKXtyZXR1cm4gZSY9LWUsMTxlPzQ8ZT9lJjI2ODQzNTQ1NT8xNjo1MzY4NzA5MTI6NDoxfXZhciBNbSx5YyxSbSxJbSxQbSxSdT0hMSxNaT1bXSxucj1udWxsLHJyPW51bGwsb3I9bnVsbCxFYT1uZXcgTWFwLFRhPW5ldyBNYXAsWG49W10sanc9Im1vdXNlZG93biBtb3VzZXVwIHRvdWNoY2FuY2VsIHRvdWNoZW5kIHRvdWNoc3RhcnQgYXV4Y2xpY2sgZGJsY2xpY2sgcG9pbnRlcmNhbmNlbCBwb2ludGVyZG93biBwb2ludGVydXAgZHJhZ2VuZCBkcmFnc3RhcnQgZHJvcCBjb21wb3NpdGlvbmVuZCBjb21wb3NpdGlvbnN0YXJ0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgaW5wdXQgdGV4dElucHV0IGNvcHkgY3V0IHBhc3RlIGNsaWNrIGNoYW5nZSBjb250ZXh0bWVudSByZXNldCBzdWJtaXQiLnNwbGl0KCIgIik7ZnVuY3Rpb24gZGYoZSx0KXtzd2l0Y2goZSl7Y2FzZSJmb2N1c2luIjpjYXNlImZvY3Vzb3V0Ijpucj1udWxsO2JyZWFrO2Nhc2UiZHJhZ2VudGVyIjpjYXNlImRyYWdsZWF2ZSI6cnI9bnVsbDticmVhaztjYXNlIm1vdXNlb3ZlciI6Y2FzZSJtb3VzZW91dCI6b3I9bnVsbDticmVhaztjYXNlInBvaW50ZXJvdmVyIjpjYXNlInBvaW50ZXJvdXQiOkVhLmRlbGV0ZSh0LnBvaW50ZXJJZCk7YnJlYWs7Y2FzZSJnb3Rwb2ludGVyY2FwdHVyZSI6Y2FzZSJsb3N0cG9pbnRlcmNhcHR1cmUiOlRhLmRlbGV0ZSh0LnBvaW50ZXJJZCl9fWZ1bmN0aW9uIHRhKGUsdCxuLHIsbyxhKXtyZXR1cm4gZT09PW51bGx8fGUubmF0aXZlRXZlbnQhPT1hPyhlPXtibG9ja2VkT246dCxkb21FdmVudE5hbWU6bixldmVudFN5c3RlbUZsYWdzOnIsbmF0aXZlRXZlbnQ6YSx0YXJnZXRDb250YWluZXJzOltvXX0sdCE9PW51bGwmJih0PSRhKHQpLHQhPT1udWxsJiZ5Yyh0KSksZSk6KGUuZXZlbnRTeXN0ZW1GbGFnc3w9cix0PWUudGFyZ2V0Q29udGFpbmVycyxvIT09bnVsbCYmdC5pbmRleE9mKG8pPT09LTEmJnQucHVzaChvKSxlKX1mdW5jdGlvbiBWdyhlLHQsbixyLG8pe3N3aXRjaCh0KXtjYXNlImZvY3VzaW4iOnJldHVybiBucj10YShucixlLHQsbixyLG8pLCEwO2Nhc2UiZHJhZ2VudGVyIjpyZXR1cm4gcnI9dGEocnIsZSx0LG4scixvKSwhMDtjYXNlIm1vdXNlb3ZlciI6cmV0dXJuIG9yPXRhKG9yLGUsdCxuLHIsbyksITA7Y2FzZSJwb2ludGVyb3ZlciI6dmFyIGE9by5wb2ludGVySWQ7cmV0dXJuIEVhLnNldChhLHRhKEVhLmdldChhKXx8bnVsbCxlLHQsbixyLG8pKSwhMDtjYXNlImdvdHBvaW50ZXJjYXB0dXJlIjpyZXR1cm4gYT1vLnBvaW50ZXJJZCxUYS5zZXQoYSx0YShUYS5nZXQoYSl8fG51bGwsZSx0LG4scixvKSksITB9cmV0dXJuITF9ZnVuY3Rpb24gTG0oZSl7dmFyIHQ9QXIoZS50YXJnZXQpO2lmKHQhPT1udWxsKXt2YXIgbj0kcih0KTtpZihuIT09bnVsbCl7aWYodD1uLnRhZyx0PT09MTMpe2lmKHQ9RW0obiksdCE9PW51bGwpe2UuYmxvY2tlZE9uPXQsUG0oZS5wcmlvcml0eSxmdW5jdGlvbigpe1JtKG4pfSk7cmV0dXJufX1lbHNlIGlmKHQ9PT0zJiZuLnN0YXRlTm9kZS5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXtlLmJsb2NrZWRPbj1uLnRhZz09PTM/bi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzpudWxsO3JldHVybn19fWUuYmxvY2tlZE9uPW51bGx9ZnVuY3Rpb24gR2koZSl7aWYoZS5ibG9ja2VkT24hPT1udWxsKXJldHVybiExO2Zvcih2YXIgdD1lLnRhcmdldENvbnRhaW5lcnM7MDx0Lmxlbmd0aDspe3ZhciBuPUl1KGUuZG9tRXZlbnROYW1lLGUuZXZlbnRTeXN0ZW1GbGFncyx0WzBdLGUubmF0aXZlRXZlbnQpO2lmKG49PT1udWxsKXtuPWUubmF0aXZlRXZlbnQ7dmFyIHI9bmV3IG4uY29uc3RydWN0b3Iobi50eXBlLG4pO191PXIsbi50YXJnZXQuZGlzcGF0Y2hFdmVudChyKSxfdT1udWxsfWVsc2UgcmV0dXJuIHQ9JGEobiksdCE9PW51bGwmJnljKHQpLGUuYmxvY2tlZE9uPW4sITE7dC5zaGlmdCgpfXJldHVybiEwfWZ1bmN0aW9uIHBmKGUsdCxuKXtHaShlKSYmbi5kZWxldGUodCl9ZnVuY3Rpb24gR3coKXtSdT0hMSxuciE9PW51bGwmJkdpKG5yKSYmKG5yPW51bGwpLHJyIT09bnVsbCYmR2kocnIpJiYocnI9bnVsbCksb3IhPT1udWxsJiZHaShvcikmJihvcj1udWxsKSxFYS5mb3JFYWNoKHBmKSxUYS5mb3JFYWNoKHBmKX1mdW5jdGlvbiBuYShlLHQpe2UuYmxvY2tlZE9uPT09dCYmKGUuYmxvY2tlZE9uPW51bGwsUnV8fChSdT0hMCxDdC51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrKEN0LnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LEd3KSkpfWZ1bmN0aW9uIE5hKGUpe2Z1bmN0aW9uIHQobyl7cmV0dXJuIG5hKG8sZSl9aWYoMDxNaS5sZW5ndGgpe25hKE1pWzBdLGUpO2Zvcih2YXIgbj0xO248TWkubGVuZ3RoO24rKyl7dmFyIHI9TWlbbl07ci5ibG9ja2VkT249PT1lJiYoci5ibG9ja2VkT249bnVsbCl9fWZvcihuciE9PW51bGwmJm5hKG5yLGUpLHJyIT09bnVsbCYmbmEocnIsZSksb3IhPT1udWxsJiZuYShvcixlKSxFYS5mb3JFYWNoKHQpLFRhLmZvckVhY2godCksbj0wO248WG4ubGVuZ3RoO24rKylyPVhuW25dLHIuYmxvY2tlZE9uPT09ZSYmKHIuYmxvY2tlZE9uPW51bGwpO2Zvcig7MDxYbi5sZW5ndGgmJihuPVhuWzBdLG4uYmxvY2tlZE9uPT09bnVsbCk7KUxtKG4pLG4uYmxvY2tlZE9uPT09bnVsbCYmWG4uc2hpZnQoKX12YXIgU289UG4uUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsc3M9ITA7ZnVuY3Rpb24gS3coZSx0LG4scil7dmFyIG89dmUsYT1Tby50cmFuc2l0aW9uO1NvLnRyYW5zaXRpb249bnVsbDt0cnl7dmU9MSx2YyhlLHQsbixyKX1maW5hbGx5e3ZlPW8sU28udHJhbnNpdGlvbj1hfX1mdW5jdGlvbiBZdyhlLHQsbixyKXt2YXIgbz12ZSxhPVNvLnRyYW5zaXRpb247U28udHJhbnNpdGlvbj1udWxsO3RyeXt2ZT00LHZjKGUsdCxuLHIpfWZpbmFsbHl7dmU9byxTby50cmFuc2l0aW9uPWF9fWZ1bmN0aW9uIHZjKGUsdCxuLHIpe2lmKHNzKXt2YXIgbz1JdShlLHQsbixyKTtpZihvPT09bnVsbClhdShlLHQscixscyxuKSxkZihlLHIpO2Vsc2UgaWYoVncobyxlLHQsbixyKSlyLnN0b3BQcm9wYWdhdGlvbigpO2Vsc2UgaWYoZGYoZSxyKSx0JjQmJi0xPGp3LmluZGV4T2YoZSkpe2Zvcig7byE9PW51bGw7KXt2YXIgYT0kYShvKTtpZihhIT09bnVsbCYmTW0oYSksYT1JdShlLHQsbixyKSxhPT09bnVsbCYmYXUoZSx0LHIsbHMsbiksYT09PW8pYnJlYWs7bz1hfW8hPT1udWxsJiZyLnN0b3BQcm9wYWdhdGlvbigpfWVsc2UgYXUoZSx0LHIsbnVsbCxuKX19dmFyIGxzPW51bGw7ZnVuY3Rpb24gSXUoZSx0LG4scil7aWYobHM9bnVsbCxlPW1jKHIpLGU9QXIoZSksZSE9PW51bGwpaWYodD0kcihlKSx0PT09bnVsbCllPW51bGw7ZWxzZSBpZihuPXQudGFnLG49PT0xMyl7aWYoZT1FbSh0KSxlIT09bnVsbClyZXR1cm4gZTtlPW51bGx9ZWxzZSBpZihuPT09Myl7aWYodC5zdGF0ZU5vZGUuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZClyZXR1cm4gdC50YWc9PT0zP3Quc3RhdGVOb2RlLmNvbnRhaW5lckluZm86bnVsbDtlPW51bGx9ZWxzZSB0IT09ZSYmKGU9bnVsbCk7cmV0dXJuIGxzPWUsbnVsbH1mdW5jdGlvbiB6bShlKXtzd2l0Y2goZSl7Y2FzZSJjYW5jZWwiOmNhc2UiY2xpY2siOmNhc2UiY2xvc2UiOmNhc2UiY29udGV4dG1lbnUiOmNhc2UiY29weSI6Y2FzZSJjdXQiOmNhc2UiYXV4Y2xpY2siOmNhc2UiZGJsY2xpY2siOmNhc2UiZHJhZ2VuZCI6Y2FzZSJkcmFnc3RhcnQiOmNhc2UiZHJvcCI6Y2FzZSJmb2N1c2luIjpjYXNlImZvY3Vzb3V0IjpjYXNlImlucHV0IjpjYXNlImludmFsaWQiOmNhc2Uia2V5ZG93biI6Y2FzZSJrZXlwcmVzcyI6Y2FzZSJrZXl1cCI6Y2FzZSJtb3VzZWRvd24iOmNhc2UibW91c2V1cCI6Y2FzZSJwYXN0ZSI6Y2FzZSJwYXVzZSI6Y2FzZSJwbGF5IjpjYXNlInBvaW50ZXJjYW5jZWwiOmNhc2UicG9pbnRlcmRvd24iOmNhc2UicG9pbnRlcnVwIjpjYXNlInJhdGVjaGFuZ2UiOmNhc2UicmVzZXQiOmNhc2UicmVzaXplIjpjYXNlInNlZWtlZCI6Y2FzZSJzdWJtaXQiOmNhc2UidG91Y2hjYW5jZWwiOmNhc2UidG91Y2hlbmQiOmNhc2UidG91Y2hzdGFydCI6Y2FzZSJ2b2x1bWVjaGFuZ2UiOmNhc2UiY2hhbmdlIjpjYXNlInNlbGVjdGlvbmNoYW5nZSI6Y2FzZSJ0ZXh0SW5wdXQiOmNhc2UiY29tcG9zaXRpb25zdGFydCI6Y2FzZSJjb21wb3NpdGlvbmVuZCI6Y2FzZSJjb21wb3NpdGlvbnVwZGF0ZSI6Y2FzZSJiZWZvcmVibHVyIjpjYXNlImFmdGVyYmx1ciI6Y2FzZSJiZWZvcmVpbnB1dCI6Y2FzZSJibHVyIjpjYXNlImZ1bGxzY3JlZW5jaGFuZ2UiOmNhc2UiZm9jdXMiOmNhc2UiaGFzaGNoYW5nZSI6Y2FzZSJwb3BzdGF0ZSI6Y2FzZSJzZWxlY3QiOmNhc2Uic2VsZWN0c3RhcnQiOnJldHVybiAxO2Nhc2UiZHJhZyI6Y2FzZSJkcmFnZW50ZXIiOmNhc2UiZHJhZ2V4aXQiOmNhc2UiZHJhZ2xlYXZlIjpjYXNlImRyYWdvdmVyIjpjYXNlIm1vdXNlbW92ZSI6Y2FzZSJtb3VzZW91dCI6Y2FzZSJtb3VzZW92ZXIiOmNhc2UicG9pbnRlcm1vdmUiOmNhc2UicG9pbnRlcm91dCI6Y2FzZSJwb2ludGVyb3ZlciI6Y2FzZSJzY3JvbGwiOmNhc2UidG9nZ2xlIjpjYXNlInRvdWNobW92ZSI6Y2FzZSJ3aGVlbCI6Y2FzZSJtb3VzZWVudGVyIjpjYXNlIm1vdXNlbGVhdmUiOmNhc2UicG9pbnRlcmVudGVyIjpjYXNlInBvaW50ZXJsZWF2ZSI6cmV0dXJuIDQ7Y2FzZSJtZXNzYWdlIjpzd2l0Y2goUHcoKSl7Y2FzZSBoYzpyZXR1cm4gMTtjYXNlIF9tOnJldHVybiA0O2Nhc2UgYXM6Y2FzZSBMdzpyZXR1cm4gMTY7Y2FzZSBBbTpyZXR1cm4gNTM2ODcwOTEyO2RlZmF1bHQ6cmV0dXJuIDE2fWRlZmF1bHQ6cmV0dXJuIDE2fX12YXIgZXI9bnVsbCx3Yz1udWxsLEtpPW51bGw7ZnVuY3Rpb24gRm0oKXtpZihLaSlyZXR1cm4gS2k7dmFyIGUsdD13YyxuPXQubGVuZ3RoLHIsbz0idmFsdWUiaW4gZXI/ZXIudmFsdWU6ZXIudGV4dENvbnRlbnQsYT1vLmxlbmd0aDtmb3IoZT0wO2U8biYmdFtlXT09PW9bZV07ZSsrKTt2YXIgaT1uLWU7Zm9yKHI9MTtyPD1pJiZ0W24tcl09PT1vW2Etcl07cisrKTtyZXR1cm4gS2k9by5zbGljZShlLDE8cj8xLXI6dm9pZCAwKX1mdW5jdGlvbiBZaShlKXt2YXIgdD1lLmtleUNvZGU7cmV0dXJuImNoYXJDb2RlImluIGU/KGU9ZS5jaGFyQ29kZSxlPT09MCYmdD09PTEzJiYoZT0xMykpOmU9dCxlPT09MTAmJihlPTEzKSwzMjw9ZXx8ZT09PTEzP2U6MH1mdW5jdGlvbiBSaSgpe3JldHVybiEwfWZ1bmN0aW9uIGZmKCl7cmV0dXJuITF9ZnVuY3Rpb24gT3QoZSl7ZnVuY3Rpb24gdChuLHIsbyxhLGkpe3RoaXMuX3JlYWN0TmFtZT1uLHRoaXMuX3RhcmdldEluc3Q9byx0aGlzLnR5cGU9cix0aGlzLm5hdGl2ZUV2ZW50PWEsdGhpcy50YXJnZXQ9aSx0aGlzLmN1cnJlbnRUYXJnZXQ9bnVsbDtmb3IodmFyIHMgaW4gZSllLmhhc093blByb3BlcnR5KHMpJiYobj1lW3NdLHRoaXNbc109bj9uKGEpOmFbc10pO3JldHVybiB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD0oYS5kZWZhdWx0UHJldmVudGVkIT1udWxsP2EuZGVmYXVsdFByZXZlbnRlZDphLnJldHVyblZhbHVlPT09ITEpP1JpOmZmLHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9ZmYsdGhpc31yZXR1cm4gUGUodC5wcm90b3R5cGUse3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5kZWZhdWx0UHJldmVudGVkPSEwO3ZhciBuPXRoaXMubmF0aXZlRXZlbnQ7biYmKG4ucHJldmVudERlZmF1bHQ/bi5wcmV2ZW50RGVmYXVsdCgpOnR5cGVvZiBuLnJldHVyblZhbHVlIT0idW5rbm93biImJihuLnJldHVyblZhbHVlPSExKSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1SaSl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBuPXRoaXMubmF0aXZlRXZlbnQ7biYmKG4uc3RvcFByb3BhZ2F0aW9uP24uc3RvcFByb3BhZ2F0aW9uKCk6dHlwZW9mIG4uY2FuY2VsQnViYmxlIT0idW5rbm93biImJihuLmNhbmNlbEJ1YmJsZT0hMCksdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1SaSl9LHBlcnNpc3Q6ZnVuY3Rpb24oKXt9LGlzUGVyc2lzdGVudDpSaX0pLHR9dmFyIFJvPXtldmVudFBoYXNlOjAsYnViYmxlczowLGNhbmNlbGFibGU6MCx0aW1lU3RhbXA6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudGltZVN0YW1wfHxEYXRlLm5vdygpfSxkZWZhdWx0UHJldmVudGVkOjAsaXNUcnVzdGVkOjB9LGJjPU90KFJvKSxVYT1QZSh7fSxSbyx7dmlldzowLGRldGFpbDowfSkscXc9T3QoVWEpLFpsLGV1LHJhLERzPVBlKHt9LFVhLHtzY3JlZW5YOjAsc2NyZWVuWTowLGNsaWVudFg6MCxjbGllbnRZOjAscGFnZVg6MCxwYWdlWTowLGN0cmxLZXk6MCxzaGlmdEtleTowLGFsdEtleTowLG1ldGFLZXk6MCxnZXRNb2RpZmllclN0YXRlOnhjLGJ1dHRvbjowLGJ1dHRvbnM6MCxyZWxhdGVkVGFyZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlbGF0ZWRUYXJnZXQ9PT12b2lkIDA/ZS5mcm9tRWxlbWVudD09PWUuc3JjRWxlbWVudD9lLnRvRWxlbWVudDplLmZyb21FbGVtZW50OmUucmVsYXRlZFRhcmdldH0sbW92ZW1lbnRYOmZ1bmN0aW9uKGUpe3JldHVybiJtb3ZlbWVudFgiaW4gZT9lLm1vdmVtZW50WDooZSE9PXJhJiYocmEmJmUudHlwZT09PSJtb3VzZW1vdmUiPyhabD1lLnNjcmVlblgtcmEuc2NyZWVuWCxldT1lLnNjcmVlblktcmEuc2NyZWVuWSk6ZXU9Wmw9MCxyYT1lKSxabCl9LG1vdmVtZW50WTpmdW5jdGlvbihlKXtyZXR1cm4ibW92ZW1lbnRZImluIGU/ZS5tb3ZlbWVudFk6ZXV9fSksbWY9T3QoRHMpLFF3PVBlKHt9LERzLHtkYXRhVHJhbnNmZXI6MH0pLEp3PU90KFF3KSxYdz1QZSh7fSxVYSx7cmVsYXRlZFRhcmdldDowfSksdHU9T3QoWHcpLFp3PVBlKHt9LFJvLHthbmltYXRpb25OYW1lOjAsZWxhcHNlZFRpbWU6MCxwc2V1ZG9FbGVtZW50OjB9KSxlYj1PdChadyksdGI9UGUoe30sUm8se2NsaXBib2FyZERhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuImNsaXBib2FyZERhdGEiaW4gZT9lLmNsaXBib2FyZERhdGE6d2luZG93LmNsaXBib2FyZERhdGF9fSksbmI9T3QodGIpLHJiPVBlKHt9LFJvLHtkYXRhOjB9KSxoZj1PdChyYiksb2I9e0VzYzoiRXNjYXBlIixTcGFjZWJhcjoiICIsTGVmdDoiQXJyb3dMZWZ0IixVcDoiQXJyb3dVcCIsUmlnaHQ6IkFycm93UmlnaHQiLERvd246IkFycm93RG93biIsRGVsOiJEZWxldGUiLFdpbjoiT1MiLE1lbnU6IkNvbnRleHRNZW51IixBcHBzOiJDb250ZXh0TWVudSIsU2Nyb2xsOiJTY3JvbGxMb2NrIixNb3pQcmludGFibGVLZXk6IlVuaWRlbnRpZmllZCJ9LGFiPXs4OiJCYWNrc3BhY2UiLDk6IlRhYiIsMTI6IkNsZWFyIiwxMzoiRW50ZXIiLDE2OiJTaGlmdCIsMTc6IkNvbnRyb2wiLDE4OiJBbHQiLDE5OiJQYXVzZSIsMjA6IkNhcHNMb2NrIiwyNzoiRXNjYXBlIiwzMjoiICIsMzM6IlBhZ2VVcCIsMzQ6IlBhZ2VEb3duIiwzNToiRW5kIiwzNjoiSG9tZSIsMzc6IkFycm93TGVmdCIsMzg6IkFycm93VXAiLDM5OiJBcnJvd1JpZ2h0Iiw0MDoiQXJyb3dEb3duIiw0NToiSW5zZXJ0Iiw0NjoiRGVsZXRlIiwxMTI6IkYxIiwxMTM6IkYyIiwxMTQ6IkYzIiwxMTU6IkY0IiwxMTY6IkY1IiwxMTc6IkY2IiwxMTg6IkY3IiwxMTk6IkY4IiwxMjA6IkY5IiwxMjE6IkYxMCIsMTIyOiJGMTEiLDEyMzoiRjEyIiwxNDQ6Ik51bUxvY2siLDE0NToiU2Nyb2xsTG9jayIsMjI0OiJNZXRhIn0saWI9e0FsdDoiYWx0S2V5IixDb250cm9sOiJjdHJsS2V5IixNZXRhOiJtZXRhS2V5IixTaGlmdDoic2hpZnRLZXkifTtmdW5jdGlvbiBzYihlKXt2YXIgdD10aGlzLm5hdGl2ZUV2ZW50O3JldHVybiB0LmdldE1vZGlmaWVyU3RhdGU/dC5nZXRNb2RpZmllclN0YXRlKGUpOihlPWliW2VdKT8hIXRbZV06ITF9ZnVuY3Rpb24geGMoKXtyZXR1cm4gc2J9dmFyIGxiPVBlKHt9LFVhLHtrZXk6ZnVuY3Rpb24oZSl7aWYoZS5rZXkpe3ZhciB0PW9iW2Uua2V5XXx8ZS5rZXk7aWYodCE9PSJVbmlkZW50aWZpZWQiKXJldHVybiB0fXJldHVybiBlLnR5cGU9PT0ia2V5cHJlc3MiPyhlPVlpKGUpLGU9PT0xMz8iRW50ZXIiOlN0cmluZy5mcm9tQ2hhckNvZGUoZSkpOmUudHlwZT09PSJrZXlkb3duInx8ZS50eXBlPT09ImtleXVwIj9hYltlLmtleUNvZGVdfHwiVW5pZGVudGlmaWVkIjoiIn0sY29kZTowLGxvY2F0aW9uOjAsY3RybEtleTowLHNoaWZ0S2V5OjAsYWx0S2V5OjAsbWV0YUtleTowLHJlcGVhdDowLGxvY2FsZTowLGdldE1vZGlmaWVyU3RhdGU6eGMsY2hhckNvZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHlwZT09PSJrZXlwcmVzcyI/WWkoZSk6MH0sa2V5Q29kZTpmdW5jdGlvbihlKXtyZXR1cm4gZS50eXBlPT09ImtleWRvd24ifHxlLnR5cGU9PT0ia2V5dXAiP2Uua2V5Q29kZTowfSx3aGljaDpmdW5jdGlvbihlKXtyZXR1cm4gZS50eXBlPT09ImtleXByZXNzIj9ZaShlKTplLnR5cGU9PT0ia2V5ZG93biJ8fGUudHlwZT09PSJrZXl1cCI/ZS5rZXlDb2RlOjB9fSksdWI9T3QobGIpLGNiPVBlKHt9LERzLHtwb2ludGVySWQ6MCx3aWR0aDowLGhlaWdodDowLHByZXNzdXJlOjAsdGFuZ2VudGlhbFByZXNzdXJlOjAsdGlsdFg6MCx0aWx0WTowLHR3aXN0OjAscG9pbnRlclR5cGU6MCxpc1ByaW1hcnk6MH0pLGdmPU90KGNiKSxkYj1QZSh7fSxVYSx7dG91Y2hlczowLHRhcmdldFRvdWNoZXM6MCxjaGFuZ2VkVG91Y2hlczowLGFsdEtleTowLG1ldGFLZXk6MCxjdHJsS2V5OjAsc2hpZnRLZXk6MCxnZXRNb2RpZmllclN0YXRlOnhjfSkscGI9T3QoZGIpLGZiPVBlKHt9LFJvLHtwcm9wZXJ0eU5hbWU6MCxlbGFwc2VkVGltZTowLHBzZXVkb0VsZW1lbnQ6MH0pLG1iPU90KGZiKSxoYj1QZSh7fSxEcyx7ZGVsdGFYOmZ1bmN0aW9uKGUpe3JldHVybiJkZWx0YVgiaW4gZT9lLmRlbHRhWDoid2hlZWxEZWx0YVgiaW4gZT8tZS53aGVlbERlbHRhWDowfSxkZWx0YVk6ZnVuY3Rpb24oZSl7cmV0dXJuImRlbHRhWSJpbiBlP2UuZGVsdGFZOiJ3aGVlbERlbHRhWSJpbiBlPy1lLndoZWVsRGVsdGFZOiJ3aGVlbERlbHRhImluIGU/LWUud2hlZWxEZWx0YTowfSxkZWx0YVo6MCxkZWx0YU1vZGU6MH0pLGdiPU90KGhiKSx5Yj1bOSwxMywyNywzMl0sa2M9T24mJiJDb21wb3NpdGlvbkV2ZW50ImluIHdpbmRvdyxtYT1udWxsO09uJiYiZG9jdW1lbnRNb2RlImluIGRvY3VtZW50JiYobWE9ZG9jdW1lbnQuZG9jdW1lbnRNb2RlKTt2YXIgdmI9T24mJiJUZXh0RXZlbnQiaW4gd2luZG93JiYhbWEsVW09T24mJigha2N8fG1hJiY4PG1hJiYxMT49bWEpLHlmPSIgIix2Zj0hMTtmdW5jdGlvbiAkbShlLHQpe3N3aXRjaChlKXtjYXNlImtleXVwIjpyZXR1cm4geWIuaW5kZXhPZih0LmtleUNvZGUpIT09LTE7Y2FzZSJrZXlkb3duIjpyZXR1cm4gdC5rZXlDb2RlIT09MjI5O2Nhc2Uia2V5cHJlc3MiOmNhc2UibW91c2Vkb3duIjpjYXNlImZvY3Vzb3V0IjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBCbShlKXtyZXR1cm4gZT1lLmRldGFpbCx0eXBlb2YgZT09Im9iamVjdCImJiJkYXRhImluIGU/ZS5kYXRhOm51bGx9dmFyIHVvPSExO2Z1bmN0aW9uIHdiKGUsdCl7c3dpdGNoKGUpe2Nhc2UiY29tcG9zaXRpb25lbmQiOnJldHVybiBCbSh0KTtjYXNlImtleXByZXNzIjpyZXR1cm4gdC53aGljaCE9PTMyP251bGw6KHZmPSEwLHlmKTtjYXNlInRleHRJbnB1dCI6cmV0dXJuIGU9dC5kYXRhLGU9PT15ZiYmdmY/bnVsbDplO2RlZmF1bHQ6cmV0dXJuIG51bGx9fWZ1bmN0aW9uIGJiKGUsdCl7aWYodW8pcmV0dXJuIGU9PT0iY29tcG9zaXRpb25lbmQifHwha2MmJiRtKGUsdCk/KGU9Rm0oKSxLaT13Yz1lcj1udWxsLHVvPSExLGUpOm51bGw7c3dpdGNoKGUpe2Nhc2UicGFzdGUiOnJldHVybiBudWxsO2Nhc2Uia2V5cHJlc3MiOmlmKCEodC5jdHJsS2V5fHx0LmFsdEtleXx8dC5tZXRhS2V5KXx8dC5jdHJsS2V5JiZ0LmFsdEtleSl7aWYodC5jaGFyJiYxPHQuY2hhci5sZW5ndGgpcmV0dXJuIHQuY2hhcjtpZih0LndoaWNoKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHQud2hpY2gpfXJldHVybiBudWxsO2Nhc2UiY29tcG9zaXRpb25lbmQiOnJldHVybiBVbSYmdC5sb2NhbGUhPT0ia28iP251bGw6dC5kYXRhO2RlZmF1bHQ6cmV0dXJuIG51bGx9fXZhciB4Yj17Y29sb3I6ITAsZGF0ZTohMCxkYXRldGltZTohMCwiZGF0ZXRpbWUtbG9jYWwiOiEwLGVtYWlsOiEwLG1vbnRoOiEwLG51bWJlcjohMCxwYXNzd29yZDohMCxyYW5nZTohMCxzZWFyY2g6ITAsdGVsOiEwLHRleHQ6ITAsdGltZTohMCx1cmw6ITAsd2VlazohMH07ZnVuY3Rpb24gd2YoZSl7dmFyIHQ9ZSYmZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiB0PT09ImlucHV0Ij8hIXhiW2UudHlwZV06dD09PSJ0ZXh0YXJlYSJ9ZnVuY3Rpb24gV20oZSx0LG4scil7d20ociksdD11cyh0LCJvbkNoYW5nZSIpLDA8dC5sZW5ndGgmJihuPW5ldyBiYygib25DaGFuZ2UiLCJjaGFuZ2UiLG51bGwsbixyKSxlLnB1c2goe2V2ZW50Om4sbGlzdGVuZXJzOnR9KSl9dmFyIGhhPW51bGwsRGE9bnVsbDtmdW5jdGlvbiBrYihlKXtabShlLDApfWZ1bmN0aW9uIF9zKGUpe3ZhciB0PWZvKGUpO2lmKHBtKHQpKXJldHVybiBlfWZ1bmN0aW9uIFNiKGUsdCl7aWYoZT09PSJjaGFuZ2UiKXJldHVybiB0fXZhciBIbT0hMTtPbiYmKE9uPyhQaT0ib25pbnB1dCJpbiBkb2N1bWVudCxQaXx8KG51PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLG51LnNldEF0dHJpYnV0ZSgib25pbnB1dCIsInJldHVybjsiKSxQaT10eXBlb2YgbnUub25pbnB1dD09ImZ1bmN0aW9uIiksSWk9UGkpOklpPSExLEhtPUlpJiYoIWRvY3VtZW50LmRvY3VtZW50TW9kZXx8OTxkb2N1bWVudC5kb2N1bWVudE1vZGUpKTt2YXIgSWksUGksbnU7ZnVuY3Rpb24gYmYoKXtoYSYmKGhhLmRldGFjaEV2ZW50KCJvbnByb3BlcnR5Y2hhbmdlIixqbSksRGE9aGE9bnVsbCl9ZnVuY3Rpb24gam0oZSl7aWYoZS5wcm9wZXJ0eU5hbWU9PT0idmFsdWUiJiZfcyhEYSkpe3ZhciB0PVtdO1dtKHQsRGEsZSxtYyhlKSksU20oa2IsdCl9fWZ1bmN0aW9uIEViKGUsdCxuKXtlPT09ImZvY3VzaW4iPyhiZigpLGhhPXQsRGE9bixoYS5hdHRhY2hFdmVudCgib25wcm9wZXJ0eWNoYW5nZSIsam0pKTplPT09ImZvY3Vzb3V0IiYmYmYoKX1mdW5jdGlvbiBUYihlKXtpZihlPT09InNlbGVjdGlvbmNoYW5nZSJ8fGU9PT0ia2V5dXAifHxlPT09ImtleWRvd24iKXJldHVybiBfcyhEYSl9ZnVuY3Rpb24gTmIoZSx0KXtpZihlPT09ImNsaWNrIilyZXR1cm4gX3ModCl9ZnVuY3Rpb24gRGIoZSx0KXtpZihlPT09ImlucHV0Inx8ZT09PSJjaGFuZ2UiKXJldHVybiBfcyh0KX1mdW5jdGlvbiBfYihlLHQpe3JldHVybiBlPT09dCYmKGUhPT0wfHwxL2U9PT0xL3QpfHxlIT09ZSYmdCE9PXR9dmFyIG5uPXR5cGVvZiBPYmplY3QuaXM9PSJmdW5jdGlvbiI/T2JqZWN0LmlzOl9iO2Z1bmN0aW9uIF9hKGUsdCl7aWYobm4oZSx0KSlyZXR1cm4hMDtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsfHx0eXBlb2YgdCE9Im9iamVjdCJ8fHQ9PT1udWxsKXJldHVybiExO3ZhciBuPU9iamVjdC5rZXlzKGUpLHI9T2JqZWN0LmtleXModCk7aWYobi5sZW5ndGghPT1yLmxlbmd0aClyZXR1cm4hMTtmb3Iocj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgbz1uW3JdO2lmKCFndS5jYWxsKHQsbyl8fCFubihlW29dLHRbb10pKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIHhmKGUpe2Zvcig7ZSYmZS5maXJzdENoaWxkOyllPWUuZmlyc3RDaGlsZDtyZXR1cm4gZX1mdW5jdGlvbiBrZihlLHQpe3ZhciBuPXhmKGUpO2U9MDtmb3IodmFyIHI7bjspe2lmKG4ubm9kZVR5cGU9PT0zKXtpZihyPWUrbi50ZXh0Q29udGVudC5sZW5ndGgsZTw9dCYmcj49dClyZXR1cm57bm9kZTpuLG9mZnNldDp0LWV9O2U9cn1lOntmb3IoO247KXtpZihuLm5leHRTaWJsaW5nKXtuPW4ubmV4dFNpYmxpbmc7YnJlYWsgZX1uPW4ucGFyZW50Tm9kZX1uPXZvaWQgMH1uPXhmKG4pfX1mdW5jdGlvbiBWbShlLHQpe3JldHVybiBlJiZ0P2U9PT10PyEwOmUmJmUubm9kZVR5cGU9PT0zPyExOnQmJnQubm9kZVR5cGU9PT0zP1ZtKGUsdC5wYXJlbnROb2RlKToiY29udGFpbnMiaW4gZT9lLmNvbnRhaW5zKHQpOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ISEoZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0KSYxNik6ITE6ITF9ZnVuY3Rpb24gR20oKXtmb3IodmFyIGU9d2luZG93LHQ9bnMoKTt0IGluc3RhbmNlb2YgZS5IVE1MSUZyYW1lRWxlbWVudDspe3RyeXt2YXIgbj10eXBlb2YgdC5jb250ZW50V2luZG93LmxvY2F0aW9uLmhyZWY9PSJzdHJpbmcifWNhdGNoe249ITF9aWYobillPXQuY29udGVudFdpbmRvdztlbHNlIGJyZWFrO3Q9bnMoZS5kb2N1bWVudCl9cmV0dXJuIHR9ZnVuY3Rpb24gU2MoZSl7dmFyIHQ9ZSYmZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiB0JiYodD09PSJpbnB1dCImJihlLnR5cGU9PT0idGV4dCJ8fGUudHlwZT09PSJzZWFyY2gifHxlLnR5cGU9PT0idGVsInx8ZS50eXBlPT09InVybCJ8fGUudHlwZT09PSJwYXNzd29yZCIpfHx0PT09InRleHRhcmVhInx8ZS5jb250ZW50RWRpdGFibGU9PT0idHJ1ZSIpfWZ1bmN0aW9uIEFiKGUpe3ZhciB0PUdtKCksbj1lLmZvY3VzZWRFbGVtLHI9ZS5zZWxlY3Rpb25SYW5nZTtpZih0IT09biYmbiYmbi5vd25lckRvY3VtZW50JiZWbShuLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LG4pKXtpZihyIT09bnVsbCYmU2Mobikpe2lmKHQ9ci5zdGFydCxlPXIuZW5kLGU9PT12b2lkIDAmJihlPXQpLCJzZWxlY3Rpb25TdGFydCJpbiBuKW4uc2VsZWN0aW9uU3RhcnQ9dCxuLnNlbGVjdGlvbkVuZD1NYXRoLm1pbihlLG4udmFsdWUubGVuZ3RoKTtlbHNlIGlmKGU9KHQ9bi5vd25lckRvY3VtZW50fHxkb2N1bWVudCkmJnQuZGVmYXVsdFZpZXd8fHdpbmRvdyxlLmdldFNlbGVjdGlvbil7ZT1lLmdldFNlbGVjdGlvbigpO3ZhciBvPW4udGV4dENvbnRlbnQubGVuZ3RoLGE9TWF0aC5taW4oci5zdGFydCxvKTtyPXIuZW5kPT09dm9pZCAwP2E6TWF0aC5taW4oci5lbmQsbyksIWUuZXh0ZW5kJiZhPnImJihvPXIscj1hLGE9byksbz1rZihuLGEpO3ZhciBpPWtmKG4scik7byYmaSYmKGUucmFuZ2VDb3VudCE9PTF8fGUuYW5jaG9yTm9kZSE9PW8ubm9kZXx8ZS5hbmNob3JPZmZzZXQhPT1vLm9mZnNldHx8ZS5mb2N1c05vZGUhPT1pLm5vZGV8fGUuZm9jdXNPZmZzZXQhPT1pLm9mZnNldCkmJih0PXQuY3JlYXRlUmFuZ2UoKSx0LnNldFN0YXJ0KG8ubm9kZSxvLm9mZnNldCksZS5yZW1vdmVBbGxSYW5nZXMoKSxhPnI/KGUuYWRkUmFuZ2UodCksZS5leHRlbmQoaS5ub2RlLGkub2Zmc2V0KSk6KHQuc2V0RW5kKGkubm9kZSxpLm9mZnNldCksZS5hZGRSYW5nZSh0KSkpfX1mb3IodD1bXSxlPW47ZT1lLnBhcmVudE5vZGU7KWUubm9kZVR5cGU9PT0xJiZ0LnB1c2goe2VsZW1lbnQ6ZSxsZWZ0OmUuc2Nyb2xsTGVmdCx0b3A6ZS5zY3JvbGxUb3B9KTtmb3IodHlwZW9mIG4uZm9jdXM9PSJmdW5jdGlvbiImJm4uZm9jdXMoKSxuPTA7bjx0Lmxlbmd0aDtuKyspZT10W25dLGUuZWxlbWVudC5zY3JvbGxMZWZ0PWUubGVmdCxlLmVsZW1lbnQuc2Nyb2xsVG9wPWUudG9wfX12YXIgQ2I9T24mJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQmJjExPj1kb2N1bWVudC5kb2N1bWVudE1vZGUsY289bnVsbCxQdT1udWxsLGdhPW51bGwsTHU9ITE7ZnVuY3Rpb24gU2YoZSx0LG4pe3ZhciByPW4ud2luZG93PT09bj9uLmRvY3VtZW50Om4ubm9kZVR5cGU9PT05P246bi5vd25lckRvY3VtZW50O0x1fHxjbz09bnVsbHx8Y28hPT1ucyhyKXx8KHI9Y28sInNlbGVjdGlvblN0YXJ0ImluIHImJlNjKHIpP3I9e3N0YXJ0OnIuc2VsZWN0aW9uU3RhcnQsZW5kOnIuc2VsZWN0aW9uRW5kfToocj0oci5vd25lckRvY3VtZW50JiZyLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHdpbmRvdykuZ2V0U2VsZWN0aW9uKCkscj17YW5jaG9yTm9kZTpyLmFuY2hvck5vZGUsYW5jaG9yT2Zmc2V0OnIuYW5jaG9yT2Zmc2V0LGZvY3VzTm9kZTpyLmZvY3VzTm9kZSxmb2N1c09mZnNldDpyLmZvY3VzT2Zmc2V0fSksZ2EmJl9hKGdhLHIpfHwoZ2E9cixyPXVzKFB1LCJvblNlbGVjdCIpLDA8ci5sZW5ndGgmJih0PW5ldyBiYygib25TZWxlY3QiLCJzZWxlY3QiLG51bGwsdCxuKSxlLnB1c2goe2V2ZW50OnQsbGlzdGVuZXJzOnJ9KSx0LnRhcmdldD1jbykpKX1mdW5jdGlvbiBMaShlLHQpe3ZhciBuPXt9O3JldHVybiBuW2UudG9Mb3dlckNhc2UoKV09dC50b0xvd2VyQ2FzZSgpLG5bIldlYmtpdCIrZV09IndlYmtpdCIrdCxuWyJNb3oiK2VdPSJtb3oiK3Qsbn12YXIgcG89e2FuaW1hdGlvbmVuZDpMaSgiQW5pbWF0aW9uIiwiQW5pbWF0aW9uRW5kIiksYW5pbWF0aW9uaXRlcmF0aW9uOkxpKCJBbmltYXRpb24iLCJBbmltYXRpb25JdGVyYXRpb24iKSxhbmltYXRpb25zdGFydDpMaSgiQW5pbWF0aW9uIiwiQW5pbWF0aW9uU3RhcnQiKSx0cmFuc2l0aW9uZW5kOkxpKCJUcmFuc2l0aW9uIiwiVHJhbnNpdGlvbkVuZCIpfSxydT17fSxLbT17fTtPbiYmKEttPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlLCJBbmltYXRpb25FdmVudCJpbiB3aW5kb3d8fChkZWxldGUgcG8uYW5pbWF0aW9uZW5kLmFuaW1hdGlvbixkZWxldGUgcG8uYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbixkZWxldGUgcG8uYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uKSwiVHJhbnNpdGlvbkV2ZW50ImluIHdpbmRvd3x8ZGVsZXRlIHBvLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbik7ZnVuY3Rpb24gQXMoZSl7aWYocnVbZV0pcmV0dXJuIHJ1W2VdO2lmKCFwb1tlXSlyZXR1cm4gZTt2YXIgdD1wb1tlXSxuO2ZvcihuIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShuKSYmbiBpbiBLbSlyZXR1cm4gcnVbZV09dFtuXTtyZXR1cm4gZX12YXIgWW09QXMoImFuaW1hdGlvbmVuZCIpLHFtPUFzKCJhbmltYXRpb25pdGVyYXRpb24iKSxRbT1BcygiYW5pbWF0aW9uc3RhcnQiKSxKbT1BcygidHJhbnNpdGlvbmVuZCIpLFhtPW5ldyBNYXAsRWY9ImFib3J0IGF1eENsaWNrIGNhbmNlbCBjYW5QbGF5IGNhblBsYXlUaHJvdWdoIGNsaWNrIGNsb3NlIGNvbnRleHRNZW51IGNvcHkgY3V0IGRyYWcgZHJhZ0VuZCBkcmFnRW50ZXIgZHJhZ0V4aXQgZHJhZ0xlYXZlIGRyYWdPdmVyIGRyYWdTdGFydCBkcm9wIGR1cmF0aW9uQ2hhbmdlIGVtcHRpZWQgZW5jcnlwdGVkIGVuZGVkIGVycm9yIGdvdFBvaW50ZXJDYXB0dXJlIGlucHV0IGludmFsaWQga2V5RG93biBrZXlQcmVzcyBrZXlVcCBsb2FkIGxvYWRlZERhdGEgbG9hZGVkTWV0YWRhdGEgbG9hZFN0YXJ0IGxvc3RQb2ludGVyQ2FwdHVyZSBtb3VzZURvd24gbW91c2VNb3ZlIG1vdXNlT3V0IG1vdXNlT3ZlciBtb3VzZVVwIHBhc3RlIHBhdXNlIHBsYXkgcGxheWluZyBwb2ludGVyQ2FuY2VsIHBvaW50ZXJEb3duIHBvaW50ZXJNb3ZlIHBvaW50ZXJPdXQgcG9pbnRlck92ZXIgcG9pbnRlclVwIHByb2dyZXNzIHJhdGVDaGFuZ2UgcmVzZXQgcmVzaXplIHNlZWtlZCBzZWVraW5nIHN0YWxsZWQgc3VibWl0IHN1c3BlbmQgdGltZVVwZGF0ZSB0b3VjaENhbmNlbCB0b3VjaEVuZCB0b3VjaFN0YXJ0IHZvbHVtZUNoYW5nZSBzY3JvbGwgdG9nZ2xlIHRvdWNoTW92ZSB3YWl0aW5nIHdoZWVsIi5zcGxpdCgiICIpO2Z1bmN0aW9uIHByKGUsdCl7WG0uc2V0KGUsdCksVXIodCxbZV0pfWZvcih6aT0wO3ppPEVmLmxlbmd0aDt6aSsrKUZpPUVmW3ppXSxUZj1GaS50b0xvd2VyQ2FzZSgpLE5mPUZpWzBdLnRvVXBwZXJDYXNlKCkrRmkuc2xpY2UoMSkscHIoVGYsIm9uIitOZik7dmFyIEZpLFRmLE5mLHppO3ByKFltLCJvbkFuaW1hdGlvbkVuZCIpO3ByKHFtLCJvbkFuaW1hdGlvbkl0ZXJhdGlvbiIpO3ByKFFtLCJvbkFuaW1hdGlvblN0YXJ0Iik7cHIoImRibGNsaWNrIiwib25Eb3VibGVDbGljayIpO3ByKCJmb2N1c2luIiwib25Gb2N1cyIpO3ByKCJmb2N1c291dCIsIm9uQmx1ciIpO3ByKEptLCJvblRyYW5zaXRpb25FbmQiKTtObygib25Nb3VzZUVudGVyIixbIm1vdXNlb3V0IiwibW91c2VvdmVyIl0pO05vKCJvbk1vdXNlTGVhdmUiLFsibW91c2VvdXQiLCJtb3VzZW92ZXIiXSk7Tm8oIm9uUG9pbnRlckVudGVyIixbInBvaW50ZXJvdXQiLCJwb2ludGVyb3ZlciJdKTtObygib25Qb2ludGVyTGVhdmUiLFsicG9pbnRlcm91dCIsInBvaW50ZXJvdmVyIl0pO1VyKCJvbkNoYW5nZSIsImNoYW5nZSBjbGljayBmb2N1c2luIGZvY3Vzb3V0IGlucHV0IGtleWRvd24ga2V5dXAgc2VsZWN0aW9uY2hhbmdlIi5zcGxpdCgiICIpKTtVcigib25TZWxlY3QiLCJmb2N1c291dCBjb250ZXh0bWVudSBkcmFnZW5kIGZvY3VzaW4ga2V5ZG93biBrZXl1cCBtb3VzZWRvd24gbW91c2V1cCBzZWxlY3Rpb25jaGFuZ2UiLnNwbGl0KCIgIikpO1VyKCJvbkJlZm9yZUlucHV0IixbImNvbXBvc2l0aW9uZW5kIiwia2V5cHJlc3MiLCJ0ZXh0SW5wdXQiLCJwYXN0ZSJdKTtVcigib25Db21wb3NpdGlvbkVuZCIsImNvbXBvc2l0aW9uZW5kIGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duIi5zcGxpdCgiICIpKTtVcigib25Db21wb3NpdGlvblN0YXJ0IiwiY29tcG9zaXRpb25zdGFydCBmb2N1c291dCBrZXlkb3duIGtleXByZXNzIGtleXVwIG1vdXNlZG93biIuc3BsaXQoIiAiKSk7VXIoIm9uQ29tcG9zaXRpb25VcGRhdGUiLCJjb21wb3NpdGlvbnVwZGF0ZSBmb2N1c291dCBrZXlkb3duIGtleXByZXNzIGtleXVwIG1vdXNlZG93biIuc3BsaXQoIiAiKSk7dmFyIGRhPSJhYm9ydCBjYW5wbGF5IGNhbnBsYXl0aHJvdWdoIGR1cmF0aW9uY2hhbmdlIGVtcHRpZWQgZW5jcnlwdGVkIGVuZGVkIGVycm9yIGxvYWRlZGRhdGEgbG9hZGVkbWV0YWRhdGEgbG9hZHN0YXJ0IHBhdXNlIHBsYXkgcGxheWluZyBwcm9ncmVzcyByYXRlY2hhbmdlIHJlc2l6ZSBzZWVrZWQgc2Vla2luZyBzdGFsbGVkIHN1c3BlbmQgdGltZXVwZGF0ZSB2b2x1bWVjaGFuZ2Ugd2FpdGluZyIuc3BsaXQoIiAiKSxPYj1uZXcgU2V0KCJjYW5jZWwgY2xvc2UgaW52YWxpZCBsb2FkIHNjcm9sbCB0b2dnbGUiLnNwbGl0KCIgIikuY29uY2F0KGRhKSk7ZnVuY3Rpb24gRGYoZSx0LG4pe3ZhciByPWUudHlwZXx8InVua25vd24tZXZlbnQiO2UuY3VycmVudFRhcmdldD1uLE93KHIsdCx2b2lkIDAsZSksZS5jdXJyZW50VGFyZ2V0PW51bGx9ZnVuY3Rpb24gWm0oZSx0KXt0PSh0JjQpIT09MDtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXSxvPXIuZXZlbnQ7cj1yLmxpc3RlbmVycztlOnt2YXIgYT12b2lkIDA7aWYodClmb3IodmFyIGk9ci5sZW5ndGgtMTswPD1pO2ktLSl7dmFyIHM9cltpXSxsPXMuaW5zdGFuY2UsdT1zLmN1cnJlbnRUYXJnZXQ7aWYocz1zLmxpc3RlbmVyLGwhPT1hJiZvLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYnJlYWsgZTtEZihvLHMsdSksYT1sfWVsc2UgZm9yKGk9MDtpPHIubGVuZ3RoO2krKyl7aWYocz1yW2ldLGw9cy5pbnN0YW5jZSx1PXMuY3VycmVudFRhcmdldCxzPXMubGlzdGVuZXIsbCE9PWEmJm8uaXNQcm9wYWdhdGlvblN0b3BwZWQoKSlicmVhayBlO0RmKG8scyx1KSxhPWx9fX1pZihvcyl0aHJvdyBlPU91LG9zPSExLE91PW51bGwsZX1mdW5jdGlvbiBEZShlLHQpe3ZhciBuPXRbQnVdO249PT12b2lkIDAmJihuPXRbQnVdPW5ldyBTZXQpO3ZhciByPWUrIl9fYnViYmxlIjtuLmhhcyhyKXx8KGVoKHQsZSwyLCExKSxuLmFkZChyKSl9ZnVuY3Rpb24gb3UoZSx0LG4pe3ZhciByPTA7dCYmKHJ8PTQpLGVoKG4sZSxyLHQpfXZhciBVaT0iX3JlYWN0TGlzdGVuaW5nIitNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtmdW5jdGlvbiBBYShlKXtpZighZVtVaV0pe2VbVWldPSEwLHNtLmZvckVhY2goZnVuY3Rpb24obil7biE9PSJzZWxlY3Rpb25jaGFuZ2UiJiYoT2IuaGFzKG4pfHxvdShuLCExLGUpLG91KG4sITAsZSkpfSk7dmFyIHQ9ZS5ub2RlVHlwZT09PTk/ZTplLm93bmVyRG9jdW1lbnQ7dD09PW51bGx8fHRbVWldfHwodFtVaV09ITAsb3UoInNlbGVjdGlvbmNoYW5nZSIsITEsdCkpfX1mdW5jdGlvbiBlaChlLHQsbixyKXtzd2l0Y2goem0odCkpe2Nhc2UgMTp2YXIgbz1LdzticmVhaztjYXNlIDQ6bz1ZdzticmVhaztkZWZhdWx0Om89dmN9bj1vLmJpbmQobnVsbCx0LG4sZSksbz12b2lkIDAsIUN1fHx0IT09InRvdWNoc3RhcnQiJiZ0IT09InRvdWNobW92ZSImJnQhPT0id2hlZWwifHwobz0hMCkscj9vIT09dm9pZCAwP2UuYWRkRXZlbnRMaXN0ZW5lcih0LG4se2NhcHR1cmU6ITAscGFzc2l2ZTpvfSk6ZS5hZGRFdmVudExpc3RlbmVyKHQsbiwhMCk6byE9PXZvaWQgMD9lLmFkZEV2ZW50TGlzdGVuZXIodCxuLHtwYXNzaXZlOm99KTplLmFkZEV2ZW50TGlzdGVuZXIodCxuLCExKX1mdW5jdGlvbiBhdShlLHQsbixyLG8pe3ZhciBhPXI7aWYoISh0JjEpJiYhKHQmMikmJnIhPT1udWxsKWU6Zm9yKDs7KXtpZihyPT09bnVsbClyZXR1cm47dmFyIGk9ci50YWc7aWYoaT09PTN8fGk9PT00KXt2YXIgcz1yLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO2lmKHM9PT1vfHxzLm5vZGVUeXBlPT09OCYmcy5wYXJlbnROb2RlPT09bylicmVhaztpZihpPT09NClmb3IoaT1yLnJldHVybjtpIT09bnVsbDspe3ZhciBsPWkudGFnO2lmKChsPT09M3x8bD09PTQpJiYobD1pLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLGw9PT1vfHxsLm5vZGVUeXBlPT09OCYmbC5wYXJlbnROb2RlPT09bykpcmV0dXJuO2k9aS5yZXR1cm59Zm9yKDtzIT09bnVsbDspe2lmKGk9QXIocyksaT09PW51bGwpcmV0dXJuO2lmKGw9aS50YWcsbD09PTV8fGw9PT02KXtyPWE9aTtjb250aW51ZSBlfXM9cy5wYXJlbnROb2RlfX1yPXIucmV0dXJufVNtKGZ1bmN0aW9uKCl7dmFyIHU9YSxjPW1jKG4pLGQ9W107ZTp7dmFyIHA9WG0uZ2V0KGUpO2lmKHAhPT12b2lkIDApe3ZhciB5PWJjLGg9ZTtzd2l0Y2goZSl7Y2FzZSJrZXlwcmVzcyI6aWYoWWkobik9PT0wKWJyZWFrIGU7Y2FzZSJrZXlkb3duIjpjYXNlImtleXVwIjp5PXViO2JyZWFrO2Nhc2UiZm9jdXNpbiI6aD0iZm9jdXMiLHk9dHU7YnJlYWs7Y2FzZSJmb2N1c291dCI6aD0iYmx1ciIseT10dTticmVhaztjYXNlImJlZm9yZWJsdXIiOmNhc2UiYWZ0ZXJibHVyIjp5PXR1O2JyZWFrO2Nhc2UiY2xpY2siOmlmKG4uYnV0dG9uPT09MilicmVhayBlO2Nhc2UiYXV4Y2xpY2siOmNhc2UiZGJsY2xpY2siOmNhc2UibW91c2Vkb3duIjpjYXNlIm1vdXNlbW92ZSI6Y2FzZSJtb3VzZXVwIjpjYXNlIm1vdXNlb3V0IjpjYXNlIm1vdXNlb3ZlciI6Y2FzZSJjb250ZXh0bWVudSI6eT1tZjticmVhaztjYXNlImRyYWciOmNhc2UiZHJhZ2VuZCI6Y2FzZSJkcmFnZW50ZXIiOmNhc2UiZHJhZ2V4aXQiOmNhc2UiZHJhZ2xlYXZlIjpjYXNlImRyYWdvdmVyIjpjYXNlImRyYWdzdGFydCI6Y2FzZSJkcm9wIjp5PUp3O2JyZWFrO2Nhc2UidG91Y2hjYW5jZWwiOmNhc2UidG91Y2hlbmQiOmNhc2UidG91Y2htb3ZlIjpjYXNlInRvdWNoc3RhcnQiOnk9cGI7YnJlYWs7Y2FzZSBZbTpjYXNlIHFtOmNhc2UgUW06eT1lYjticmVhaztjYXNlIEptOnk9bWI7YnJlYWs7Y2FzZSJzY3JvbGwiOnk9cXc7YnJlYWs7Y2FzZSJ3aGVlbCI6eT1nYjticmVhaztjYXNlImNvcHkiOmNhc2UiY3V0IjpjYXNlInBhc3RlIjp5PW5iO2JyZWFrO2Nhc2UiZ290cG9pbnRlcmNhcHR1cmUiOmNhc2UibG9zdHBvaW50ZXJjYXB0dXJlIjpjYXNlInBvaW50ZXJjYW5jZWwiOmNhc2UicG9pbnRlcmRvd24iOmNhc2UicG9pbnRlcm1vdmUiOmNhc2UicG9pbnRlcm91dCI6Y2FzZSJwb2ludGVyb3ZlciI6Y2FzZSJwb2ludGVydXAiOnk9Z2Z9dmFyIHc9KHQmNCkhPT0wLGI9IXcmJmU9PT0ic2Nyb2xsIixnPXc/cCE9PW51bGw/cCsiQ2FwdHVyZSI6bnVsbDpwO3c9W107Zm9yKHZhciBtPXUsdjttIT09bnVsbDspe3Y9bTt2YXIgZj12LnN0YXRlTm9kZTtpZih2LnRhZz09PTUmJmYhPT1udWxsJiYodj1mLGchPT1udWxsJiYoZj1TYShtLGcpLGYhPW51bGwmJncucHVzaChDYShtLGYsdikpKSksYilicmVhazttPW0ucmV0dXJufTA8dy5sZW5ndGgmJihwPW5ldyB5KHAsaCxudWxsLG4sYyksZC5wdXNoKHtldmVudDpwLGxpc3RlbmVyczp3fSkpfX1pZighKHQmNykpe2U6e2lmKHA9ZT09PSJtb3VzZW92ZXIifHxlPT09InBvaW50ZXJvdmVyIix5PWU9PT0ibW91c2VvdXQifHxlPT09InBvaW50ZXJvdXQiLHAmJm4hPT1fdSYmKGg9bi5yZWxhdGVkVGFyZ2V0fHxuLmZyb21FbGVtZW50KSYmKEFyKGgpfHxoW01uXSkpYnJlYWsgZTtpZigoeXx8cCkmJihwPWMud2luZG93PT09Yz9jOihwPWMub3duZXJEb2N1bWVudCk/cC5kZWZhdWx0Vmlld3x8cC5wYXJlbnRXaW5kb3c6d2luZG93LHk/KGg9bi5yZWxhdGVkVGFyZ2V0fHxuLnRvRWxlbWVudCx5PXUsaD1oP0FyKGgpOm51bGwsaCE9PW51bGwmJihiPSRyKGgpLGghPT1ifHxoLnRhZyE9PTUmJmgudGFnIT09NikmJihoPW51bGwpKTooeT1udWxsLGg9dSkseSE9PWgpKXtpZih3PW1mLGY9Im9uTW91c2VMZWF2ZSIsZz0ib25Nb3VzZUVudGVyIixtPSJtb3VzZSIsKGU9PT0icG9pbnRlcm91dCJ8fGU9PT0icG9pbnRlcm92ZXIiKSYmKHc9Z2YsZj0ib25Qb2ludGVyTGVhdmUiLGc9Im9uUG9pbnRlckVudGVyIixtPSJwb2ludGVyIiksYj15PT1udWxsP3A6Zm8oeSksdj1oPT1udWxsP3A6Zm8oaCkscD1uZXcgdyhmLG0rImxlYXZlIix5LG4sYykscC50YXJnZXQ9YixwLnJlbGF0ZWRUYXJnZXQ9dixmPW51bGwsQXIoYyk9PT11JiYodz1uZXcgdyhnLG0rImVudGVyIixoLG4sYyksdy50YXJnZXQ9dix3LnJlbGF0ZWRUYXJnZXQ9YixmPXcpLGI9Zix5JiZoKXQ6e2Zvcih3PXksZz1oLG09MCx2PXc7djt2PWlvKHYpKW0rKztmb3Iodj0wLGY9ZztmO2Y9aW8oZikpdisrO2Zvcig7MDxtLXY7KXc9aW8odyksbS0tO2Zvcig7MDx2LW07KWc9aW8oZyksdi0tO2Zvcig7bS0tOyl7aWYodz09PWd8fGchPT1udWxsJiZ3PT09Zy5hbHRlcm5hdGUpYnJlYWsgdDt3PWlvKHcpLGc9aW8oZyl9dz1udWxsfWVsc2Ugdz1udWxsO3khPT1udWxsJiZfZihkLHAseSx3LCExKSxoIT09bnVsbCYmYiE9PW51bGwmJl9mKGQsYixoLHcsITApfX1lOntpZihwPXU/Zm8odSk6d2luZG93LHk9cC5ub2RlTmFtZSYmcC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHk9PT0ic2VsZWN0Inx8eT09PSJpbnB1dCImJnAudHlwZT09PSJmaWxlIil2YXIgRT1TYjtlbHNlIGlmKHdmKHApKWlmKEhtKUU9RGI7ZWxzZXtFPVRiO3ZhciBrPUVifWVsc2UoeT1wLm5vZGVOYW1lKSYmeS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmKHAudHlwZT09PSJjaGVja2JveCJ8fHAudHlwZT09PSJyYWRpbyIpJiYoRT1OYik7aWYoRSYmKEU9RShlLHUpKSl7V20oZCxFLG4sYyk7YnJlYWsgZX1rJiZrKGUscCx1KSxlPT09ImZvY3Vzb3V0IiYmKGs9cC5fd3JhcHBlclN0YXRlKSYmay5jb250cm9sbGVkJiZwLnR5cGU9PT0ibnVtYmVyIiYmU3UocCwibnVtYmVyIixwLnZhbHVlKX1zd2l0Y2goaz11P2ZvKHUpOndpbmRvdyxlKXtjYXNlImZvY3VzaW4iOih3ZihrKXx8ay5jb250ZW50RWRpdGFibGU9PT0idHJ1ZSIpJiYoY289ayxQdT11LGdhPW51bGwpO2JyZWFrO2Nhc2UiZm9jdXNvdXQiOmdhPVB1PWNvPW51bGw7YnJlYWs7Y2FzZSJtb3VzZWRvd24iOkx1PSEwO2JyZWFrO2Nhc2UiY29udGV4dG1lbnUiOmNhc2UibW91c2V1cCI6Y2FzZSJkcmFnZW5kIjpMdT0hMSxTZihkLG4sYyk7YnJlYWs7Y2FzZSJzZWxlY3Rpb25jaGFuZ2UiOmlmKENiKWJyZWFrO2Nhc2Uia2V5ZG93biI6Y2FzZSJrZXl1cCI6U2YoZCxuLGMpfXZhciBOO2lmKGtjKWU6e3N3aXRjaChlKXtjYXNlImNvbXBvc2l0aW9uc3RhcnQiOnZhciBEPSJvbkNvbXBvc2l0aW9uU3RhcnQiO2JyZWFrIGU7Y2FzZSJjb21wb3NpdGlvbmVuZCI6RD0ib25Db21wb3NpdGlvbkVuZCI7YnJlYWsgZTtjYXNlImNvbXBvc2l0aW9udXBkYXRlIjpEPSJvbkNvbXBvc2l0aW9uVXBkYXRlIjticmVhayBlfUQ9dm9pZCAwfWVsc2UgdW8/JG0oZSxuKSYmKEQ9Im9uQ29tcG9zaXRpb25FbmQiKTplPT09ImtleWRvd24iJiZuLmtleUNvZGU9PT0yMjkmJihEPSJvbkNvbXBvc2l0aW9uU3RhcnQiKTtEJiYoVW0mJm4ubG9jYWxlIT09ImtvIiYmKHVvfHxEIT09Im9uQ29tcG9zaXRpb25TdGFydCI/RD09PSJvbkNvbXBvc2l0aW9uRW5kIiYmdW8mJihOPUZtKCkpOihlcj1jLHdjPSJ2YWx1ZSJpbiBlcj9lci52YWx1ZTplci50ZXh0Q29udGVudCx1bz0hMCkpLGs9dXModSxEKSwwPGsubGVuZ3RoJiYoRD1uZXcgaGYoRCxlLG51bGwsbixjKSxkLnB1c2goe2V2ZW50OkQsbGlzdGVuZXJzOmt9KSxOP0QuZGF0YT1OOihOPUJtKG4pLE4hPT1udWxsJiYoRC5kYXRhPU4pKSkpLChOPXZiP3diKGUsbik6YmIoZSxuKSkmJih1PXVzKHUsIm9uQmVmb3JlSW5wdXQiKSwwPHUubGVuZ3RoJiYoYz1uZXcgaGYoIm9uQmVmb3JlSW5wdXQiLCJiZWZvcmVpbnB1dCIsbnVsbCxuLGMpLGQucHVzaCh7ZXZlbnQ6YyxsaXN0ZW5lcnM6dX0pLGMuZGF0YT1OKSl9Wm0oZCx0KX0pfWZ1bmN0aW9uIENhKGUsdCxuKXtyZXR1cm57aW5zdGFuY2U6ZSxsaXN0ZW5lcjp0LGN1cnJlbnRUYXJnZXQ6bn19ZnVuY3Rpb24gdXMoZSx0KXtmb3IodmFyIG49dCsiQ2FwdHVyZSIscj1bXTtlIT09bnVsbDspe3ZhciBvPWUsYT1vLnN0YXRlTm9kZTtvLnRhZz09PTUmJmEhPT1udWxsJiYobz1hLGE9U2EoZSxuKSxhIT1udWxsJiZyLnVuc2hpZnQoQ2EoZSxhLG8pKSxhPVNhKGUsdCksYSE9bnVsbCYmci5wdXNoKENhKGUsYSxvKSkpLGU9ZS5yZXR1cm59cmV0dXJuIHJ9ZnVuY3Rpb24gaW8oZSl7aWYoZT09PW51bGwpcmV0dXJuIG51bGw7ZG8gZT1lLnJldHVybjt3aGlsZShlJiZlLnRhZyE9PTUpO3JldHVybiBlfHxudWxsfWZ1bmN0aW9uIF9mKGUsdCxuLHIsbyl7Zm9yKHZhciBhPXQuX3JlYWN0TmFtZSxpPVtdO24hPT1udWxsJiZuIT09cjspe3ZhciBzPW4sbD1zLmFsdGVybmF0ZSx1PXMuc3RhdGVOb2RlO2lmKGwhPT1udWxsJiZsPT09cilicmVhaztzLnRhZz09PTUmJnUhPT1udWxsJiYocz11LG8/KGw9U2EobixhKSxsIT1udWxsJiZpLnVuc2hpZnQoQ2EobixsLHMpKSk6b3x8KGw9U2EobixhKSxsIT1udWxsJiZpLnB1c2goQ2EobixsLHMpKSkpLG49bi5yZXR1cm59aS5sZW5ndGghPT0wJiZlLnB1c2goe2V2ZW50OnQsbGlzdGVuZXJzOml9KX12YXIgTWI9L1xyXG4/L2csUmI9L1x1MDAwMHxcdUZGRkQvZztmdW5jdGlvbiBBZihlKXtyZXR1cm4odHlwZW9mIGU9PSJzdHJpbmciP2U6IiIrZSkucmVwbGFjZShNYixgCmApLnJlcGxhY2UoUmIsIiIpfWZ1bmN0aW9uICRpKGUsdCxuKXtpZih0PUFmKHQpLEFmKGUpIT09dCYmbil0aHJvdyBFcnJvcihJKDQyNSkpfWZ1bmN0aW9uIGNzKCl7fXZhciB6dT1udWxsLEZ1PW51bGw7ZnVuY3Rpb24gVXUoZSx0KXtyZXR1cm4gZT09PSJ0ZXh0YXJlYSJ8fGU9PT0ibm9zY3JpcHQifHx0eXBlb2YgdC5jaGlsZHJlbj09InN0cmluZyJ8fHR5cGVvZiB0LmNoaWxkcmVuPT0ibnVtYmVyInx8dHlwZW9mIHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9PSJvYmplY3QiJiZ0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIT09bnVsbCYmdC5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWwhPW51bGx9dmFyICR1PXR5cGVvZiBzZXRUaW1lb3V0PT0iZnVuY3Rpb24iP3NldFRpbWVvdXQ6dm9pZCAwLEliPXR5cGVvZiBjbGVhclRpbWVvdXQ9PSJmdW5jdGlvbiI/Y2xlYXJUaW1lb3V0OnZvaWQgMCxDZj10eXBlb2YgUHJvbWlzZT09ImZ1bmN0aW9uIj9Qcm9taXNlOnZvaWQgMCxQYj10eXBlb2YgcXVldWVNaWNyb3Rhc2s9PSJmdW5jdGlvbiI/cXVldWVNaWNyb3Rhc2s6dHlwZW9mIENmPCJ1Ij9mdW5jdGlvbihlKXtyZXR1cm4gQ2YucmVzb2x2ZShudWxsKS50aGVuKGUpLmNhdGNoKExiKX06JHU7ZnVuY3Rpb24gTGIoZSl7c2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IGV9KX1mdW5jdGlvbiBpdShlLHQpe3ZhciBuPXQscj0wO2Rve3ZhciBvPW4ubmV4dFNpYmxpbmc7aWYoZS5yZW1vdmVDaGlsZChuKSxvJiZvLm5vZGVUeXBlPT09OClpZihuPW8uZGF0YSxuPT09Ii8kIil7aWYocj09PTApe2UucmVtb3ZlQ2hpbGQobyksTmEodCk7cmV0dXJufXItLX1lbHNlIG4hPT0iJCImJm4hPT0iJD8iJiZuIT09IiQhInx8cisrO249b313aGlsZShuKTtOYSh0KX1mdW5jdGlvbiBhcihlKXtmb3IoO2UhPW51bGw7ZT1lLm5leHRTaWJsaW5nKXt2YXIgdD1lLm5vZGVUeXBlO2lmKHQ9PT0xfHx0PT09MylicmVhaztpZih0PT09OCl7aWYodD1lLmRhdGEsdD09PSIkInx8dD09PSIkISJ8fHQ9PT0iJD8iKWJyZWFrO2lmKHQ9PT0iLyQiKXJldHVybiBudWxsfX1yZXR1cm4gZX1mdW5jdGlvbiBPZihlKXtlPWUucHJldmlvdXNTaWJsaW5nO2Zvcih2YXIgdD0wO2U7KXtpZihlLm5vZGVUeXBlPT09OCl7dmFyIG49ZS5kYXRhO2lmKG49PT0iJCJ8fG49PT0iJCEifHxuPT09IiQ/Iil7aWYodD09PTApcmV0dXJuIGU7dC0tfWVsc2Ugbj09PSIvJCImJnQrK31lPWUucHJldmlvdXNTaWJsaW5nfXJldHVybiBudWxsfXZhciBJbz1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKSx5bj0iX19yZWFjdEZpYmVyJCIrSW8sT2E9Il9fcmVhY3RQcm9wcyQiK0lvLE1uPSJfX3JlYWN0Q29udGFpbmVyJCIrSW8sQnU9Il9fcmVhY3RFdmVudHMkIitJbyx6Yj0iX19yZWFjdExpc3RlbmVycyQiK0lvLEZiPSJfX3JlYWN0SGFuZGxlcyQiK0lvO2Z1bmN0aW9uIEFyKGUpe3ZhciB0PWVbeW5dO2lmKHQpcmV0dXJuIHQ7Zm9yKHZhciBuPWUucGFyZW50Tm9kZTtuOyl7aWYodD1uW01uXXx8blt5bl0pe2lmKG49dC5hbHRlcm5hdGUsdC5jaGlsZCE9PW51bGx8fG4hPT1udWxsJiZuLmNoaWxkIT09bnVsbClmb3IoZT1PZihlKTtlIT09bnVsbDspe2lmKG49ZVt5bl0pcmV0dXJuIG47ZT1PZihlKX1yZXR1cm4gdH1lPW4sbj1lLnBhcmVudE5vZGV9cmV0dXJuIG51bGx9ZnVuY3Rpb24gJGEoZSl7cmV0dXJuIGU9ZVt5bl18fGVbTW5dLCFlfHxlLnRhZyE9PTUmJmUudGFnIT09NiYmZS50YWchPT0xMyYmZS50YWchPT0zP251bGw6ZX1mdW5jdGlvbiBmbyhlKXtpZihlLnRhZz09PTV8fGUudGFnPT09NilyZXR1cm4gZS5zdGF0ZU5vZGU7dGhyb3cgRXJyb3IoSSgzMykpfWZ1bmN0aW9uIENzKGUpe3JldHVybiBlW09hXXx8bnVsbH12YXIgV3U9W10sbW89LTE7ZnVuY3Rpb24gZnIoZSl7cmV0dXJue2N1cnJlbnQ6ZX19ZnVuY3Rpb24gX2UoZSl7MD5tb3x8KGUuY3VycmVudD1XdVttb10sV3VbbW9dPW51bGwsbW8tLSl9ZnVuY3Rpb24gU2UoZSx0KXttbysrLFd1W21vXT1lLmN1cnJlbnQsZS5jdXJyZW50PXR9dmFyIGRyPXt9LGN0PWZyKGRyKSxidD1mcighMSksSXI9ZHI7ZnVuY3Rpb24gRG8oZSx0KXt2YXIgbj1lLnR5cGUuY29udGV4dFR5cGVzO2lmKCFuKXJldHVybiBkcjt2YXIgcj1lLnN0YXRlTm9kZTtpZihyJiZyLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9PT10KXJldHVybiByLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0O3ZhciBvPXt9LGE7Zm9yKGEgaW4gbilvW2FdPXRbYV07cmV0dXJuIHImJihlPWUuc3RhdGVOb2RlLGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dD10LGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ9byksb31mdW5jdGlvbiB4dChlKXtyZXR1cm4gZT1lLmNoaWxkQ29udGV4dFR5cGVzLGUhPW51bGx9ZnVuY3Rpb24gZHMoKXtfZShidCksX2UoY3QpfWZ1bmN0aW9uIE1mKGUsdCxuKXtpZihjdC5jdXJyZW50IT09ZHIpdGhyb3cgRXJyb3IoSSgxNjgpKTtTZShjdCx0KSxTZShidCxuKX1mdW5jdGlvbiB0aChlLHQsbil7dmFyIHI9ZS5zdGF0ZU5vZGU7aWYodD10LmNoaWxkQ29udGV4dFR5cGVzLHR5cGVvZiByLmdldENoaWxkQ29udGV4dCE9ImZ1bmN0aW9uIilyZXR1cm4gbjtyPXIuZ2V0Q2hpbGRDb250ZXh0KCk7Zm9yKHZhciBvIGluIHIpaWYoIShvIGluIHQpKXRocm93IEVycm9yKEkoMTA4LEV3KGUpfHwiVW5rbm93biIsbykpO3JldHVybiBQZSh7fSxuLHIpfWZ1bmN0aW9uIHBzKGUpe3JldHVybiBlPShlPWUuc3RhdGVOb2RlKSYmZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dHx8ZHIsSXI9Y3QuY3VycmVudCxTZShjdCxlKSxTZShidCxidC5jdXJyZW50KSwhMH1mdW5jdGlvbiBSZihlLHQsbil7dmFyIHI9ZS5zdGF0ZU5vZGU7aWYoIXIpdGhyb3cgRXJyb3IoSSgxNjkpKTtuPyhlPXRoKGUsdCxJciksci5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dD1lLF9lKGJ0KSxfZShjdCksU2UoY3QsZSkpOl9lKGJ0KSxTZShidCxuKX12YXIgRG49bnVsbCxPcz0hMSxzdT0hMTtmdW5jdGlvbiBuaChlKXtEbj09PW51bGw/RG49W2VdOkRuLnB1c2goZSl9ZnVuY3Rpb24gVWIoZSl7T3M9ITAsbmgoZSl9ZnVuY3Rpb24gbXIoKXtpZighc3UmJkRuIT09bnVsbCl7c3U9ITA7dmFyIGU9MCx0PXZlO3RyeXt2YXIgbj1Ebjtmb3IodmU9MTtlPG4ubGVuZ3RoO2UrKyl7dmFyIHI9bltlXTtkbyByPXIoITApO3doaWxlKHIhPT1udWxsKX1Ebj1udWxsLE9zPSExfWNhdGNoKG8pe3Rocm93IERuIT09bnVsbCYmKERuPURuLnNsaWNlKGUrMSkpLERtKGhjLG1yKSxvfWZpbmFsbHl7dmU9dCxzdT0hMX19cmV0dXJuIG51bGx9dmFyIGhvPVtdLGdvPTAsZnM9bnVsbCxtcz0wLHp0PVtdLEZ0PTAsUHI9bnVsbCxfbj0xLEFuPSIiO2Z1bmN0aW9uIERyKGUsdCl7aG9bZ28rK109bXMsaG9bZ28rK109ZnMsZnM9ZSxtcz10fWZ1bmN0aW9uIHJoKGUsdCxuKXt6dFtGdCsrXT1fbix6dFtGdCsrXT1Bbix6dFtGdCsrXT1QcixQcj1lO3ZhciByPV9uO2U9QW47dmFyIG89MzItZW4ociktMTtyJj1+KDE8PG8pLG4rPTE7dmFyIGE9MzItZW4odCkrbztpZigzMDxhKXt2YXIgaT1vLW8lNTthPShyJigxPDxpKS0xKS50b1N0cmluZygzMikscj4+PWksby09aSxfbj0xPDwzMi1lbih0KStvfG48PG98cixBbj1hK2V9ZWxzZSBfbj0xPDxhfG48PG98cixBbj1lfWZ1bmN0aW9uIEVjKGUpe2UucmV0dXJuIT09bnVsbCYmKERyKGUsMSkscmgoZSwxLDApKX1mdW5jdGlvbiBUYyhlKXtmb3IoO2U9PT1mczspZnM9aG9bLS1nb10saG9bZ29dPW51bGwsbXM9aG9bLS1nb10saG9bZ29dPW51bGw7Zm9yKDtlPT09UHI7KVByPXp0Wy0tRnRdLHp0W0Z0XT1udWxsLEFuPXp0Wy0tRnRdLHp0W0Z0XT1udWxsLF9uPXp0Wy0tRnRdLHp0W0Z0XT1udWxsfXZhciBBdD1udWxsLF90PW51bGwsQ2U9ITEsWnQ9bnVsbDtmdW5jdGlvbiBvaChlLHQpe3ZhciBuPVV0KDUsbnVsbCxudWxsLDApO24uZWxlbWVudFR5cGU9IkRFTEVURUQiLG4uc3RhdGVOb2RlPXQsbi5yZXR1cm49ZSx0PWUuZGVsZXRpb25zLHQ9PT1udWxsPyhlLmRlbGV0aW9ucz1bbl0sZS5mbGFnc3w9MTYpOnQucHVzaChuKX1mdW5jdGlvbiBJZihlLHQpe3N3aXRjaChlLnRhZyl7Y2FzZSA1OnZhciBuPWUudHlwZTtyZXR1cm4gdD10Lm5vZGVUeXBlIT09MXx8bi50b0xvd2VyQ2FzZSgpIT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP251bGw6dCx0IT09bnVsbD8oZS5zdGF0ZU5vZGU9dCxBdD1lLF90PWFyKHQuZmlyc3RDaGlsZCksITApOiExO2Nhc2UgNjpyZXR1cm4gdD1lLnBlbmRpbmdQcm9wcz09PSIifHx0Lm5vZGVUeXBlIT09Mz9udWxsOnQsdCE9PW51bGw/KGUuc3RhdGVOb2RlPXQsQXQ9ZSxfdD1udWxsLCEwKTohMTtjYXNlIDEzOnJldHVybiB0PXQubm9kZVR5cGUhPT04P251bGw6dCx0IT09bnVsbD8obj1QciE9PW51bGw/e2lkOl9uLG92ZXJmbG93OkFufTpudWxsLGUubWVtb2l6ZWRTdGF0ZT17ZGVoeWRyYXRlZDp0LHRyZWVDb250ZXh0Om4scmV0cnlMYW5lOjEwNzM3NDE4MjR9LG49VXQoMTgsbnVsbCxudWxsLDApLG4uc3RhdGVOb2RlPXQsbi5yZXR1cm49ZSxlLmNoaWxkPW4sQXQ9ZSxfdD1udWxsLCEwKTohMTtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBIdShlKXtyZXR1cm4oZS5tb2RlJjEpIT09MCYmKGUuZmxhZ3MmMTI4KT09PTB9ZnVuY3Rpb24ganUoZSl7aWYoQ2Upe3ZhciB0PV90O2lmKHQpe3ZhciBuPXQ7aWYoIUlmKGUsdCkpe2lmKEh1KGUpKXRocm93IEVycm9yKEkoNDE4KSk7dD1hcihuLm5leHRTaWJsaW5nKTt2YXIgcj1BdDt0JiZJZihlLHQpP29oKHIsbik6KGUuZmxhZ3M9ZS5mbGFncyYtNDA5N3wyLENlPSExLEF0PWUpfX1lbHNle2lmKEh1KGUpKXRocm93IEVycm9yKEkoNDE4KSk7ZS5mbGFncz1lLmZsYWdzJi00MDk3fDIsQ2U9ITEsQXQ9ZX19fWZ1bmN0aW9uIFBmKGUpe2ZvcihlPWUucmV0dXJuO2UhPT1udWxsJiZlLnRhZyE9PTUmJmUudGFnIT09MyYmZS50YWchPT0xMzspZT1lLnJldHVybjtBdD1lfWZ1bmN0aW9uIEJpKGUpe2lmKGUhPT1BdClyZXR1cm4hMTtpZighQ2UpcmV0dXJuIFBmKGUpLENlPSEwLCExO3ZhciB0O2lmKCh0PWUudGFnIT09MykmJiEodD1lLnRhZyE9PTUpJiYodD1lLnR5cGUsdD10IT09ImhlYWQiJiZ0IT09ImJvZHkiJiYhVXUoZS50eXBlLGUubWVtb2l6ZWRQcm9wcykpLHQmJih0PV90KSl7aWYoSHUoZSkpdGhyb3cgYWgoKSxFcnJvcihJKDQxOCkpO2Zvcig7dDspb2goZSx0KSx0PWFyKHQubmV4dFNpYmxpbmcpfWlmKFBmKGUpLGUudGFnPT09MTMpe2lmKGU9ZS5tZW1vaXplZFN0YXRlLGU9ZSE9PW51bGw/ZS5kZWh5ZHJhdGVkOm51bGwsIWUpdGhyb3cgRXJyb3IoSSgzMTcpKTtlOntmb3IoZT1lLm5leHRTaWJsaW5nLHQ9MDtlOyl7aWYoZS5ub2RlVHlwZT09PTgpe3ZhciBuPWUuZGF0YTtpZihuPT09Ii8kIil7aWYodD09PTApe190PWFyKGUubmV4dFNpYmxpbmcpO2JyZWFrIGV9dC0tfWVsc2UgbiE9PSIkIiYmbiE9PSIkISImJm4hPT0iJD8ifHx0Kyt9ZT1lLm5leHRTaWJsaW5nfV90PW51bGx9fWVsc2UgX3Q9QXQ/YXIoZS5zdGF0ZU5vZGUubmV4dFNpYmxpbmcpOm51bGw7cmV0dXJuITB9ZnVuY3Rpb24gYWgoKXtmb3IodmFyIGU9X3Q7ZTspZT1hcihlLm5leHRTaWJsaW5nKX1mdW5jdGlvbiBfbygpe190PUF0PW51bGwsQ2U9ITF9ZnVuY3Rpb24gTmMoZSl7WnQ9PT1udWxsP1p0PVtlXTpadC5wdXNoKGUpfXZhciAkYj1Qbi5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZztmdW5jdGlvbiBvYShlLHQsbil7aWYoZT1uLnJlZixlIT09bnVsbCYmdHlwZW9mIGUhPSJmdW5jdGlvbiImJnR5cGVvZiBlIT0ib2JqZWN0Iil7aWYobi5fb3duZXIpe2lmKG49bi5fb3duZXIsbil7aWYobi50YWchPT0xKXRocm93IEVycm9yKEkoMzA5KSk7dmFyIHI9bi5zdGF0ZU5vZGV9aWYoIXIpdGhyb3cgRXJyb3IoSSgxNDcsZSkpO3ZhciBvPXIsYT0iIitlO3JldHVybiB0IT09bnVsbCYmdC5yZWYhPT1udWxsJiZ0eXBlb2YgdC5yZWY9PSJmdW5jdGlvbiImJnQucmVmLl9zdHJpbmdSZWY9PT1hP3QucmVmOih0PWZ1bmN0aW9uKGkpe3ZhciBzPW8ucmVmcztpPT09bnVsbD9kZWxldGUgc1thXTpzW2FdPWl9LHQuX3N0cmluZ1JlZj1hLHQpfWlmKHR5cGVvZiBlIT0ic3RyaW5nIil0aHJvdyBFcnJvcihJKDI4NCkpO2lmKCFuLl9vd25lcil0aHJvdyBFcnJvcihJKDI5MCxlKSl9cmV0dXJuIGV9ZnVuY3Rpb24gV2koZSx0KXt0aHJvdyBlPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSxFcnJvcihJKDMxLGU9PT0iW29iamVjdCBPYmplY3RdIj8ib2JqZWN0IHdpdGgga2V5cyB7IitPYmplY3Qua2V5cyh0KS5qb2luKCIsICIpKyJ9IjplKSl9ZnVuY3Rpb24gTGYoZSl7dmFyIHQ9ZS5faW5pdDtyZXR1cm4gdChlLl9wYXlsb2FkKX1mdW5jdGlvbiBpaChlKXtmdW5jdGlvbiB0KGcsbSl7aWYoZSl7dmFyIHY9Zy5kZWxldGlvbnM7dj09PW51bGw/KGcuZGVsZXRpb25zPVttXSxnLmZsYWdzfD0xNik6di5wdXNoKG0pfX1mdW5jdGlvbiBuKGcsbSl7aWYoIWUpcmV0dXJuIG51bGw7Zm9yKDttIT09bnVsbDspdChnLG0pLG09bS5zaWJsaW5nO3JldHVybiBudWxsfWZ1bmN0aW9uIHIoZyxtKXtmb3IoZz1uZXcgTWFwO20hPT1udWxsOyltLmtleSE9PW51bGw/Zy5zZXQobS5rZXksbSk6Zy5zZXQobS5pbmRleCxtKSxtPW0uc2libGluZztyZXR1cm4gZ31mdW5jdGlvbiBvKGcsbSl7cmV0dXJuIGc9dXIoZyxtKSxnLmluZGV4PTAsZy5zaWJsaW5nPW51bGwsZ31mdW5jdGlvbiBhKGcsbSx2KXtyZXR1cm4gZy5pbmRleD12LGU/KHY9Zy5hbHRlcm5hdGUsdiE9PW51bGw/KHY9di5pbmRleCx2PG0/KGcuZmxhZ3N8PTIsbSk6dik6KGcuZmxhZ3N8PTIsbSkpOihnLmZsYWdzfD0xMDQ4NTc2LG0pfWZ1bmN0aW9uIGkoZyl7cmV0dXJuIGUmJmcuYWx0ZXJuYXRlPT09bnVsbCYmKGcuZmxhZ3N8PTIpLGd9ZnVuY3Rpb24gcyhnLG0sdixmKXtyZXR1cm4gbT09PW51bGx8fG0udGFnIT09Nj8obT1tdSh2LGcubW9kZSxmKSxtLnJldHVybj1nLG0pOihtPW8obSx2KSxtLnJldHVybj1nLG0pfWZ1bmN0aW9uIGwoZyxtLHYsZil7dmFyIEU9di50eXBlO3JldHVybiBFPT09bG8/YyhnLG0sdi5wcm9wcy5jaGlsZHJlbixmLHYua2V5KTptIT09bnVsbCYmKG0uZWxlbWVudFR5cGU9PT1FfHx0eXBlb2YgRT09Im9iamVjdCImJkUhPT1udWxsJiZFLiQkdHlwZW9mPT09UW4mJkxmKEUpPT09bS50eXBlKT8oZj1vKG0sdi5wcm9wcyksZi5yZWY9b2EoZyxtLHYpLGYucmV0dXJuPWcsZik6KGY9dHModi50eXBlLHYua2V5LHYucHJvcHMsbnVsbCxnLm1vZGUsZiksZi5yZWY9b2EoZyxtLHYpLGYucmV0dXJuPWcsZil9ZnVuY3Rpb24gdShnLG0sdixmKXtyZXR1cm4gbT09PW51bGx8fG0udGFnIT09NHx8bS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyE9PXYuY29udGFpbmVySW5mb3x8bS5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24hPT12LmltcGxlbWVudGF0aW9uPyhtPWh1KHYsZy5tb2RlLGYpLG0ucmV0dXJuPWcsbSk6KG09byhtLHYuY2hpbGRyZW58fFtdKSxtLnJldHVybj1nLG0pfWZ1bmN0aW9uIGMoZyxtLHYsZixFKXtyZXR1cm4gbT09PW51bGx8fG0udGFnIT09Nz8obT1Scih2LGcubW9kZSxmLEUpLG0ucmV0dXJuPWcsbSk6KG09byhtLHYpLG0ucmV0dXJuPWcsbSl9ZnVuY3Rpb24gZChnLG0sdil7aWYodHlwZW9mIG09PSJzdHJpbmciJiZtIT09IiJ8fHR5cGVvZiBtPT0ibnVtYmVyIilyZXR1cm4gbT1tdSgiIittLGcubW9kZSx2KSxtLnJldHVybj1nLG07aWYodHlwZW9mIG09PSJvYmplY3QiJiZtIT09bnVsbCl7c3dpdGNoKG0uJCR0eXBlb2Ype2Nhc2UgRGk6cmV0dXJuIHY9dHMobS50eXBlLG0ua2V5LG0ucHJvcHMsbnVsbCxnLm1vZGUsdiksdi5yZWY9b2EoZyxudWxsLG0pLHYucmV0dXJuPWcsdjtjYXNlIHNvOnJldHVybiBtPWh1KG0sZy5tb2RlLHYpLG0ucmV0dXJuPWcsbTtjYXNlIFFuOnZhciBmPW0uX2luaXQ7cmV0dXJuIGQoZyxmKG0uX3BheWxvYWQpLHYpfWlmKHVhKG0pfHxlYShtKSlyZXR1cm4gbT1ScihtLGcubW9kZSx2LG51bGwpLG0ucmV0dXJuPWcsbTtXaShnLG0pfXJldHVybiBudWxsfWZ1bmN0aW9uIHAoZyxtLHYsZil7dmFyIEU9bSE9PW51bGw/bS5rZXk6bnVsbDtpZih0eXBlb2Ygdj09InN0cmluZyImJnYhPT0iInx8dHlwZW9mIHY9PSJudW1iZXIiKXJldHVybiBFIT09bnVsbD9udWxsOnMoZyxtLCIiK3YsZik7aWYodHlwZW9mIHY9PSJvYmplY3QiJiZ2IT09bnVsbCl7c3dpdGNoKHYuJCR0eXBlb2Ype2Nhc2UgRGk6cmV0dXJuIHYua2V5PT09RT9sKGcsbSx2LGYpOm51bGw7Y2FzZSBzbzpyZXR1cm4gdi5rZXk9PT1FP3UoZyxtLHYsZik6bnVsbDtjYXNlIFFuOnJldHVybiBFPXYuX2luaXQscChnLG0sRSh2Ll9wYXlsb2FkKSxmKX1pZih1YSh2KXx8ZWEodikpcmV0dXJuIEUhPT1udWxsP251bGw6YyhnLG0sdixmLG51bGwpO1dpKGcsdil9cmV0dXJuIG51bGx9ZnVuY3Rpb24geShnLG0sdixmLEUpe2lmKHR5cGVvZiBmPT0ic3RyaW5nIiYmZiE9PSIifHx0eXBlb2YgZj09Im51bWJlciIpcmV0dXJuIGc9Zy5nZXQodil8fG51bGwscyhtLGcsIiIrZixFKTtpZih0eXBlb2YgZj09Im9iamVjdCImJmYhPT1udWxsKXtzd2l0Y2goZi4kJHR5cGVvZil7Y2FzZSBEaTpyZXR1cm4gZz1nLmdldChmLmtleT09PW51bGw/djpmLmtleSl8fG51bGwsbChtLGcsZixFKTtjYXNlIHNvOnJldHVybiBnPWcuZ2V0KGYua2V5PT09bnVsbD92OmYua2V5KXx8bnVsbCx1KG0sZyxmLEUpO2Nhc2UgUW46dmFyIGs9Zi5faW5pdDtyZXR1cm4geShnLG0sdixrKGYuX3BheWxvYWQpLEUpfWlmKHVhKGYpfHxlYShmKSlyZXR1cm4gZz1nLmdldCh2KXx8bnVsbCxjKG0sZyxmLEUsbnVsbCk7V2kobSxmKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBoKGcsbSx2LGYpe2Zvcih2YXIgRT1udWxsLGs9bnVsbCxOPW0sRD1tPTAsTz1udWxsO04hPT1udWxsJiZEPHYubGVuZ3RoO0QrKyl7Ti5pbmRleD5EPyhPPU4sTj1udWxsKTpPPU4uc2libGluZzt2YXIgVD1wKGcsTix2W0RdLGYpO2lmKFQ9PT1udWxsKXtOPT09bnVsbCYmKE49Tyk7YnJlYWt9ZSYmTiYmVC5hbHRlcm5hdGU9PT1udWxsJiZ0KGcsTiksbT1hKFQsbSxEKSxrPT09bnVsbD9FPVQ6ay5zaWJsaW5nPVQsaz1ULE49T31pZihEPT09di5sZW5ndGgpcmV0dXJuIG4oZyxOKSxDZSYmRHIoZyxEKSxFO2lmKE49PT1udWxsKXtmb3IoO0Q8di5sZW5ndGg7RCsrKU49ZChnLHZbRF0sZiksTiE9PW51bGwmJihtPWEoTixtLEQpLGs9PT1udWxsP0U9TjprLnNpYmxpbmc9TixrPU4pO3JldHVybiBDZSYmRHIoZyxEKSxFfWZvcihOPXIoZyxOKTtEPHYubGVuZ3RoO0QrKylPPXkoTixnLEQsdltEXSxmKSxPIT09bnVsbCYmKGUmJk8uYWx0ZXJuYXRlIT09bnVsbCYmTi5kZWxldGUoTy5rZXk9PT1udWxsP0Q6Ty5rZXkpLG09YShPLG0sRCksaz09PW51bGw/RT1POmsuc2libGluZz1PLGs9Tyk7cmV0dXJuIGUmJk4uZm9yRWFjaChmdW5jdGlvbih6KXtyZXR1cm4gdChnLHopfSksQ2UmJkRyKGcsRCksRX1mdW5jdGlvbiB3KGcsbSx2LGYpe3ZhciBFPWVhKHYpO2lmKHR5cGVvZiBFIT0iZnVuY3Rpb24iKXRocm93IEVycm9yKEkoMTUwKSk7aWYodj1FLmNhbGwodiksdj09bnVsbCl0aHJvdyBFcnJvcihJKDE1MSkpO2Zvcih2YXIgaz1FPW51bGwsTj1tLEQ9bT0wLE89bnVsbCxUPXYubmV4dCgpO04hPT1udWxsJiYhVC5kb25lO0QrKyxUPXYubmV4dCgpKXtOLmluZGV4PkQ/KE89TixOPW51bGwpOk89Ti5zaWJsaW5nO3ZhciB6PXAoZyxOLFQudmFsdWUsZik7aWYoej09PW51bGwpe049PT1udWxsJiYoTj1PKTticmVha31lJiZOJiZ6LmFsdGVybmF0ZT09PW51bGwmJnQoZyxOKSxtPWEoeixtLEQpLGs9PT1udWxsP0U9ejprLnNpYmxpbmc9eixrPXosTj1PfWlmKFQuZG9uZSlyZXR1cm4gbihnLE4pLENlJiZEcihnLEQpLEU7aWYoTj09PW51bGwpe2Zvcig7IVQuZG9uZTtEKyssVD12Lm5leHQoKSlUPWQoZyxULnZhbHVlLGYpLFQhPT1udWxsJiYobT1hKFQsbSxEKSxrPT09bnVsbD9FPVQ6ay5zaWJsaW5nPVQsaz1UKTtyZXR1cm4gQ2UmJkRyKGcsRCksRX1mb3IoTj1yKGcsTik7IVQuZG9uZTtEKyssVD12Lm5leHQoKSlUPXkoTixnLEQsVC52YWx1ZSxmKSxUIT09bnVsbCYmKGUmJlQuYWx0ZXJuYXRlIT09bnVsbCYmTi5kZWxldGUoVC5rZXk9PT1udWxsP0Q6VC5rZXkpLG09YShULG0sRCksaz09PW51bGw/RT1UOmsuc2libGluZz1ULGs9VCk7cmV0dXJuIGUmJk4uZm9yRWFjaChmdW5jdGlvbihQKXtyZXR1cm4gdChnLFApfSksQ2UmJkRyKGcsRCksRX1mdW5jdGlvbiBiKGcsbSx2LGYpe2lmKHR5cGVvZiB2PT0ib2JqZWN0IiYmdiE9PW51bGwmJnYudHlwZT09PWxvJiZ2LmtleT09PW51bGwmJih2PXYucHJvcHMuY2hpbGRyZW4pLHR5cGVvZiB2PT0ib2JqZWN0IiYmdiE9PW51bGwpe3N3aXRjaCh2LiQkdHlwZW9mKXtjYXNlIERpOmU6e2Zvcih2YXIgRT12LmtleSxrPW07ayE9PW51bGw7KXtpZihrLmtleT09PUUpe2lmKEU9di50eXBlLEU9PT1sbyl7aWYoay50YWc9PT03KXtuKGcsay5zaWJsaW5nKSxtPW8oayx2LnByb3BzLmNoaWxkcmVuKSxtLnJldHVybj1nLGc9bTticmVhayBlfX1lbHNlIGlmKGsuZWxlbWVudFR5cGU9PT1FfHx0eXBlb2YgRT09Im9iamVjdCImJkUhPT1udWxsJiZFLiQkdHlwZW9mPT09UW4mJkxmKEUpPT09ay50eXBlKXtuKGcsay5zaWJsaW5nKSxtPW8oayx2LnByb3BzKSxtLnJlZj1vYShnLGssdiksbS5yZXR1cm49ZyxnPW07YnJlYWsgZX1uKGcsayk7YnJlYWt9ZWxzZSB0KGcsayk7az1rLnNpYmxpbmd9di50eXBlPT09bG8/KG09UnIodi5wcm9wcy5jaGlsZHJlbixnLm1vZGUsZix2LmtleSksbS5yZXR1cm49ZyxnPW0pOihmPXRzKHYudHlwZSx2LmtleSx2LnByb3BzLG51bGwsZy5tb2RlLGYpLGYucmVmPW9hKGcsbSx2KSxmLnJldHVybj1nLGc9Zil9cmV0dXJuIGkoZyk7Y2FzZSBzbzplOntmb3Ioaz12LmtleTttIT09bnVsbDspe2lmKG0ua2V5PT09aylpZihtLnRhZz09PTQmJm0uc3RhdGVOb2RlLmNvbnRhaW5lckluZm89PT12LmNvbnRhaW5lckluZm8mJm0uc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uPT09di5pbXBsZW1lbnRhdGlvbil7bihnLG0uc2libGluZyksbT1vKG0sdi5jaGlsZHJlbnx8W10pLG0ucmV0dXJuPWcsZz1tO2JyZWFrIGV9ZWxzZXtuKGcsbSk7YnJlYWt9ZWxzZSB0KGcsbSk7bT1tLnNpYmxpbmd9bT1odSh2LGcubW9kZSxmKSxtLnJldHVybj1nLGc9bX1yZXR1cm4gaShnKTtjYXNlIFFuOnJldHVybiBrPXYuX2luaXQsYihnLG0sayh2Ll9wYXlsb2FkKSxmKX1pZih1YSh2KSlyZXR1cm4gaChnLG0sdixmKTtpZihlYSh2KSlyZXR1cm4gdyhnLG0sdixmKTtXaShnLHYpfXJldHVybiB0eXBlb2Ygdj09InN0cmluZyImJnYhPT0iInx8dHlwZW9mIHY9PSJudW1iZXIiPyh2PSIiK3YsbSE9PW51bGwmJm0udGFnPT09Nj8obihnLG0uc2libGluZyksbT1vKG0sdiksbS5yZXR1cm49ZyxnPW0pOihuKGcsbSksbT1tdSh2LGcubW9kZSxmKSxtLnJldHVybj1nLGc9bSksaShnKSk6bihnLG0pfXJldHVybiBifXZhciBBbz1paCghMCksc2g9aWgoITEpLGhzPWZyKG51bGwpLGdzPW51bGwseW89bnVsbCxEYz1udWxsO2Z1bmN0aW9uIF9jKCl7RGM9eW89Z3M9bnVsbH1mdW5jdGlvbiBBYyhlKXt2YXIgdD1ocy5jdXJyZW50O19lKGhzKSxlLl9jdXJyZW50VmFsdWU9dH1mdW5jdGlvbiBWdShlLHQsbil7Zm9yKDtlIT09bnVsbDspe3ZhciByPWUuYWx0ZXJuYXRlO2lmKChlLmNoaWxkTGFuZXMmdCkhPT10PyhlLmNoaWxkTGFuZXN8PXQsciE9PW51bGwmJihyLmNoaWxkTGFuZXN8PXQpKTpyIT09bnVsbCYmKHIuY2hpbGRMYW5lcyZ0KSE9PXQmJihyLmNoaWxkTGFuZXN8PXQpLGU9PT1uKWJyZWFrO2U9ZS5yZXR1cm59fWZ1bmN0aW9uIEVvKGUsdCl7Z3M9ZSxEYz15bz1udWxsLGU9ZS5kZXBlbmRlbmNpZXMsZSE9PW51bGwmJmUuZmlyc3RDb250ZXh0IT09bnVsbCYmKGUubGFuZXMmdCYmKHd0PSEwKSxlLmZpcnN0Q29udGV4dD1udWxsKX1mdW5jdGlvbiBCdChlKXt2YXIgdD1lLl9jdXJyZW50VmFsdWU7aWYoRGMhPT1lKWlmKGU9e2NvbnRleHQ6ZSxtZW1vaXplZFZhbHVlOnQsbmV4dDpudWxsfSx5bz09PW51bGwpe2lmKGdzPT09bnVsbCl0aHJvdyBFcnJvcihJKDMwOCkpO3lvPWUsZ3MuZGVwZW5kZW5jaWVzPXtsYW5lczowLGZpcnN0Q29udGV4dDplfX1lbHNlIHlvPXlvLm5leHQ9ZTtyZXR1cm4gdH12YXIgQ3I9bnVsbDtmdW5jdGlvbiBDYyhlKXtDcj09PW51bGw/Q3I9W2VdOkNyLnB1c2goZSl9ZnVuY3Rpb24gbGgoZSx0LG4scil7dmFyIG89dC5pbnRlcmxlYXZlZDtyZXR1cm4gbz09PW51bGw/KG4ubmV4dD1uLENjKHQpKToobi5uZXh0PW8ubmV4dCxvLm5leHQ9biksdC5pbnRlcmxlYXZlZD1uLFJuKGUscil9ZnVuY3Rpb24gUm4oZSx0KXtlLmxhbmVzfD10O3ZhciBuPWUuYWx0ZXJuYXRlO2ZvcihuIT09bnVsbCYmKG4ubGFuZXN8PXQpLG49ZSxlPWUucmV0dXJuO2UhPT1udWxsOyllLmNoaWxkTGFuZXN8PXQsbj1lLmFsdGVybmF0ZSxuIT09bnVsbCYmKG4uY2hpbGRMYW5lc3w9dCksbj1lLGU9ZS5yZXR1cm47cmV0dXJuIG4udGFnPT09Mz9uLnN0YXRlTm9kZTpudWxsfXZhciBKbj0hMTtmdW5jdGlvbiBPYyhlKXtlLnVwZGF0ZVF1ZXVlPXtiYXNlU3RhdGU6ZS5tZW1vaXplZFN0YXRlLGZpcnN0QmFzZVVwZGF0ZTpudWxsLGxhc3RCYXNlVXBkYXRlOm51bGwsc2hhcmVkOntwZW5kaW5nOm51bGwsaW50ZXJsZWF2ZWQ6bnVsbCxsYW5lczowfSxlZmZlY3RzOm51bGx9fWZ1bmN0aW9uIHVoKGUsdCl7ZT1lLnVwZGF0ZVF1ZXVlLHQudXBkYXRlUXVldWU9PT1lJiYodC51cGRhdGVRdWV1ZT17YmFzZVN0YXRlOmUuYmFzZVN0YXRlLGZpcnN0QmFzZVVwZGF0ZTplLmZpcnN0QmFzZVVwZGF0ZSxsYXN0QmFzZVVwZGF0ZTplLmxhc3RCYXNlVXBkYXRlLHNoYXJlZDplLnNoYXJlZCxlZmZlY3RzOmUuZWZmZWN0c30pfWZ1bmN0aW9uIENuKGUsdCl7cmV0dXJue2V2ZW50VGltZTplLGxhbmU6dCx0YWc6MCxwYXlsb2FkOm51bGwsY2FsbGJhY2s6bnVsbCxuZXh0Om51bGx9fWZ1bmN0aW9uIGlyKGUsdCxuKXt2YXIgcj1lLnVwZGF0ZVF1ZXVlO2lmKHI9PT1udWxsKXJldHVybiBudWxsO2lmKHI9ci5zaGFyZWQsdWUmMil7dmFyIG89ci5wZW5kaW5nO3JldHVybiBvPT09bnVsbD90Lm5leHQ9dDoodC5uZXh0PW8ubmV4dCxvLm5leHQ9dCksci5wZW5kaW5nPXQsUm4oZSxuKX1yZXR1cm4gbz1yLmludGVybGVhdmVkLG89PT1udWxsPyh0Lm5leHQ9dCxDYyhyKSk6KHQubmV4dD1vLm5leHQsby5uZXh0PXQpLHIuaW50ZXJsZWF2ZWQ9dCxSbihlLG4pfWZ1bmN0aW9uIHFpKGUsdCxuKXtpZih0PXQudXBkYXRlUXVldWUsdCE9PW51bGwmJih0PXQuc2hhcmVkLChuJjQxOTQyNDApIT09MCkpe3ZhciByPXQubGFuZXM7ciY9ZS5wZW5kaW5nTGFuZXMsbnw9cix0LmxhbmVzPW4sZ2MoZSxuKX19ZnVuY3Rpb24gemYoZSx0KXt2YXIgbj1lLnVwZGF0ZVF1ZXVlLHI9ZS5hbHRlcm5hdGU7aWYociE9PW51bGwmJihyPXIudXBkYXRlUXVldWUsbj09PXIpKXt2YXIgbz1udWxsLGE9bnVsbDtpZihuPW4uZmlyc3RCYXNlVXBkYXRlLG4hPT1udWxsKXtkb3t2YXIgaT17ZXZlbnRUaW1lOm4uZXZlbnRUaW1lLGxhbmU6bi5sYW5lLHRhZzpuLnRhZyxwYXlsb2FkOm4ucGF5bG9hZCxjYWxsYmFjazpuLmNhbGxiYWNrLG5leHQ6bnVsbH07YT09PW51bGw/bz1hPWk6YT1hLm5leHQ9aSxuPW4ubmV4dH13aGlsZShuIT09bnVsbCk7YT09PW51bGw/bz1hPXQ6YT1hLm5leHQ9dH1lbHNlIG89YT10O249e2Jhc2VTdGF0ZTpyLmJhc2VTdGF0ZSxmaXJzdEJhc2VVcGRhdGU6byxsYXN0QmFzZVVwZGF0ZTphLHNoYXJlZDpyLnNoYXJlZCxlZmZlY3RzOnIuZWZmZWN0c30sZS51cGRhdGVRdWV1ZT1uO3JldHVybn1lPW4ubGFzdEJhc2VVcGRhdGUsZT09PW51bGw/bi5maXJzdEJhc2VVcGRhdGU9dDplLm5leHQ9dCxuLmxhc3RCYXNlVXBkYXRlPXR9ZnVuY3Rpb24geXMoZSx0LG4scil7dmFyIG89ZS51cGRhdGVRdWV1ZTtKbj0hMTt2YXIgYT1vLmZpcnN0QmFzZVVwZGF0ZSxpPW8ubGFzdEJhc2VVcGRhdGUscz1vLnNoYXJlZC5wZW5kaW5nO2lmKHMhPT1udWxsKXtvLnNoYXJlZC5wZW5kaW5nPW51bGw7dmFyIGw9cyx1PWwubmV4dDtsLm5leHQ9bnVsbCxpPT09bnVsbD9hPXU6aS5uZXh0PXUsaT1sO3ZhciBjPWUuYWx0ZXJuYXRlO2MhPT1udWxsJiYoYz1jLnVwZGF0ZVF1ZXVlLHM9Yy5sYXN0QmFzZVVwZGF0ZSxzIT09aSYmKHM9PT1udWxsP2MuZmlyc3RCYXNlVXBkYXRlPXU6cy5uZXh0PXUsYy5sYXN0QmFzZVVwZGF0ZT1sKSl9aWYoYSE9PW51bGwpe3ZhciBkPW8uYmFzZVN0YXRlO2k9MCxjPXU9bD1udWxsLHM9YTtkb3t2YXIgcD1zLmxhbmUseT1zLmV2ZW50VGltZTtpZigociZwKT09PXApe2MhPT1udWxsJiYoYz1jLm5leHQ9e2V2ZW50VGltZTp5LGxhbmU6MCx0YWc6cy50YWcscGF5bG9hZDpzLnBheWxvYWQsY2FsbGJhY2s6cy5jYWxsYmFjayxuZXh0Om51bGx9KTtlOnt2YXIgaD1lLHc9cztzd2l0Y2gocD10LHk9bix3LnRhZyl7Y2FzZSAxOmlmKGg9dy5wYXlsb2FkLHR5cGVvZiBoPT0iZnVuY3Rpb24iKXtkPWguY2FsbCh5LGQscCk7YnJlYWsgZX1kPWg7YnJlYWsgZTtjYXNlIDM6aC5mbGFncz1oLmZsYWdzJi02NTUzN3wxMjg7Y2FzZSAwOmlmKGg9dy5wYXlsb2FkLHA9dHlwZW9mIGg9PSJmdW5jdGlvbiI/aC5jYWxsKHksZCxwKTpoLHA9PW51bGwpYnJlYWsgZTtkPVBlKHt9LGQscCk7YnJlYWsgZTtjYXNlIDI6Sm49ITB9fXMuY2FsbGJhY2shPT1udWxsJiZzLmxhbmUhPT0wJiYoZS5mbGFnc3w9NjQscD1vLmVmZmVjdHMscD09PW51bGw/by5lZmZlY3RzPVtzXTpwLnB1c2gocykpfWVsc2UgeT17ZXZlbnRUaW1lOnksbGFuZTpwLHRhZzpzLnRhZyxwYXlsb2FkOnMucGF5bG9hZCxjYWxsYmFjazpzLmNhbGxiYWNrLG5leHQ6bnVsbH0sYz09PW51bGw/KHU9Yz15LGw9ZCk6Yz1jLm5leHQ9eSxpfD1wO2lmKHM9cy5uZXh0LHM9PT1udWxsKXtpZihzPW8uc2hhcmVkLnBlbmRpbmcscz09PW51bGwpYnJlYWs7cD1zLHM9cC5uZXh0LHAubmV4dD1udWxsLG8ubGFzdEJhc2VVcGRhdGU9cCxvLnNoYXJlZC5wZW5kaW5nPW51bGx9fXdoaWxlKCEwKTtpZihjPT09bnVsbCYmKGw9ZCksby5iYXNlU3RhdGU9bCxvLmZpcnN0QmFzZVVwZGF0ZT11LG8ubGFzdEJhc2VVcGRhdGU9Yyx0PW8uc2hhcmVkLmludGVybGVhdmVkLHQhPT1udWxsKXtvPXQ7ZG8gaXw9by5sYW5lLG89by5uZXh0O3doaWxlKG8hPT10KX1lbHNlIGE9PT1udWxsJiYoby5zaGFyZWQubGFuZXM9MCk7enJ8PWksZS5sYW5lcz1pLGUubWVtb2l6ZWRTdGF0ZT1kfX1mdW5jdGlvbiBGZihlLHQsbil7aWYoZT10LmVmZmVjdHMsdC5lZmZlY3RzPW51bGwsZSE9PW51bGwpZm9yKHQ9MDt0PGUubGVuZ3RoO3QrKyl7dmFyIHI9ZVt0XSxvPXIuY2FsbGJhY2s7aWYobyE9PW51bGwpe2lmKHIuY2FsbGJhY2s9bnVsbCxyPW4sdHlwZW9mIG8hPSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoSSgxOTEsbykpO28uY2FsbChyKX19fXZhciBCYT17fSx3bj1mcihCYSksTWE9ZnIoQmEpLFJhPWZyKEJhKTtmdW5jdGlvbiBPcihlKXtpZihlPT09QmEpdGhyb3cgRXJyb3IoSSgxNzQpKTtyZXR1cm4gZX1mdW5jdGlvbiBNYyhlLHQpe3N3aXRjaChTZShSYSx0KSxTZShNYSxlKSxTZSh3bixCYSksZT10Lm5vZGVUeXBlLGUpe2Nhc2UgOTpjYXNlIDExOnQ9KHQ9dC5kb2N1bWVudEVsZW1lbnQpP3QubmFtZXNwYWNlVVJJOlR1KG51bGwsIiIpO2JyZWFrO2RlZmF1bHQ6ZT1lPT09OD90LnBhcmVudE5vZGU6dCx0PWUubmFtZXNwYWNlVVJJfHxudWxsLGU9ZS50YWdOYW1lLHQ9VHUodCxlKX1fZSh3biksU2Uod24sdCl9ZnVuY3Rpb24gQ28oKXtfZSh3biksX2UoTWEpLF9lKFJhKX1mdW5jdGlvbiBjaChlKXtPcihSYS5jdXJyZW50KTt2YXIgdD1Pcih3bi5jdXJyZW50KSxuPVR1KHQsZS50eXBlKTt0IT09biYmKFNlKE1hLGUpLFNlKHduLG4pKX1mdW5jdGlvbiBSYyhlKXtNYS5jdXJyZW50PT09ZSYmKF9lKHduKSxfZShNYSkpfXZhciBSZT1mcigwKTtmdW5jdGlvbiB2cyhlKXtmb3IodmFyIHQ9ZTt0IT09bnVsbDspe2lmKHQudGFnPT09MTMpe3ZhciBuPXQubWVtb2l6ZWRTdGF0ZTtpZihuIT09bnVsbCYmKG49bi5kZWh5ZHJhdGVkLG49PT1udWxsfHxuLmRhdGE9PT0iJD8ifHxuLmRhdGE9PT0iJCEiKSlyZXR1cm4gdH1lbHNlIGlmKHQudGFnPT09MTkmJnQubWVtb2l6ZWRQcm9wcy5yZXZlYWxPcmRlciE9PXZvaWQgMCl7aWYodC5mbGFncyYxMjgpcmV0dXJuIHR9ZWxzZSBpZih0LmNoaWxkIT09bnVsbCl7dC5jaGlsZC5yZXR1cm49dCx0PXQuY2hpbGQ7Y29udGludWV9aWYodD09PWUpYnJlYWs7Zm9yKDt0LnNpYmxpbmc9PT1udWxsOyl7aWYodC5yZXR1cm49PT1udWxsfHx0LnJldHVybj09PWUpcmV0dXJuIG51bGw7dD10LnJldHVybn10LnNpYmxpbmcucmV0dXJuPXQucmV0dXJuLHQ9dC5zaWJsaW5nfXJldHVybiBudWxsfXZhciBsdT1bXTtmdW5jdGlvbiBJYygpe2Zvcih2YXIgZT0wO2U8bHUubGVuZ3RoO2UrKylsdVtlXS5fd29ya0luUHJvZ3Jlc3NWZXJzaW9uUHJpbWFyeT1udWxsO2x1Lmxlbmd0aD0wfXZhciBRaT1Qbi5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLHV1PVBuLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLExyPTAsSWU9bnVsbCxHZT1udWxsLFFlPW51bGwsd3M9ITEseWE9ITEsSWE9MCxCYj0wO2Z1bmN0aW9uIHN0KCl7dGhyb3cgRXJyb3IoSSgzMjEpKX1mdW5jdGlvbiBQYyhlLHQpe2lmKHQ9PT1udWxsKXJldHVybiExO2Zvcih2YXIgbj0wO248dC5sZW5ndGgmJm48ZS5sZW5ndGg7bisrKWlmKCFubihlW25dLHRbbl0pKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIExjKGUsdCxuLHIsbyxhKXtpZihMcj1hLEllPXQsdC5tZW1vaXplZFN0YXRlPW51bGwsdC51cGRhdGVRdWV1ZT1udWxsLHQubGFuZXM9MCxRaS5jdXJyZW50PWU9PT1udWxsfHxlLm1lbW9pemVkU3RhdGU9PT1udWxsP1ZiOkdiLGU9bihyLG8pLHlhKXthPTA7ZG97aWYoeWE9ITEsSWE9MCwyNTw9YSl0aHJvdyBFcnJvcihJKDMwMSkpO2ErPTEsUWU9R2U9bnVsbCx0LnVwZGF0ZVF1ZXVlPW51bGwsUWkuY3VycmVudD1LYixlPW4ocixvKX13aGlsZSh5YSl9aWYoUWkuY3VycmVudD1icyx0PUdlIT09bnVsbCYmR2UubmV4dCE9PW51bGwsTHI9MCxRZT1HZT1JZT1udWxsLHdzPSExLHQpdGhyb3cgRXJyb3IoSSgzMDApKTtyZXR1cm4gZX1mdW5jdGlvbiB6Yygpe3ZhciBlPUlhIT09MDtyZXR1cm4gSWE9MCxlfWZ1bmN0aW9uIGduKCl7dmFyIGU9e21lbW9pemVkU3RhdGU6bnVsbCxiYXNlU3RhdGU6bnVsbCxiYXNlUXVldWU6bnVsbCxxdWV1ZTpudWxsLG5leHQ6bnVsbH07cmV0dXJuIFFlPT09bnVsbD9JZS5tZW1vaXplZFN0YXRlPVFlPWU6UWU9UWUubmV4dD1lLFFlfWZ1bmN0aW9uIFd0KCl7aWYoR2U9PT1udWxsKXt2YXIgZT1JZS5hbHRlcm5hdGU7ZT1lIT09bnVsbD9lLm1lbW9pemVkU3RhdGU6bnVsbH1lbHNlIGU9R2UubmV4dDt2YXIgdD1RZT09PW51bGw/SWUubWVtb2l6ZWRTdGF0ZTpRZS5uZXh0O2lmKHQhPT1udWxsKVFlPXQsR2U9ZTtlbHNle2lmKGU9PT1udWxsKXRocm93IEVycm9yKEkoMzEwKSk7R2U9ZSxlPXttZW1vaXplZFN0YXRlOkdlLm1lbW9pemVkU3RhdGUsYmFzZVN0YXRlOkdlLmJhc2VTdGF0ZSxiYXNlUXVldWU6R2UuYmFzZVF1ZXVlLHF1ZXVlOkdlLnF1ZXVlLG5leHQ6bnVsbH0sUWU9PT1udWxsP0llLm1lbW9pemVkU3RhdGU9UWU9ZTpRZT1RZS5uZXh0PWV9cmV0dXJuIFFlfWZ1bmN0aW9uIFBhKGUsdCl7cmV0dXJuIHR5cGVvZiB0PT0iZnVuY3Rpb24iP3QoZSk6dH1mdW5jdGlvbiBjdShlKXt2YXIgdD1XdCgpLG49dC5xdWV1ZTtpZihuPT09bnVsbCl0aHJvdyBFcnJvcihJKDMxMSkpO24ubGFzdFJlbmRlcmVkUmVkdWNlcj1lO3ZhciByPUdlLG89ci5iYXNlUXVldWUsYT1uLnBlbmRpbmc7aWYoYSE9PW51bGwpe2lmKG8hPT1udWxsKXt2YXIgaT1vLm5leHQ7by5uZXh0PWEubmV4dCxhLm5leHQ9aX1yLmJhc2VRdWV1ZT1vPWEsbi5wZW5kaW5nPW51bGx9aWYobyE9PW51bGwpe2E9by5uZXh0LHI9ci5iYXNlU3RhdGU7dmFyIHM9aT1udWxsLGw9bnVsbCx1PWE7ZG97dmFyIGM9dS5sYW5lO2lmKChMciZjKT09PWMpbCE9PW51bGwmJihsPWwubmV4dD17bGFuZTowLGFjdGlvbjp1LmFjdGlvbixoYXNFYWdlclN0YXRlOnUuaGFzRWFnZXJTdGF0ZSxlYWdlclN0YXRlOnUuZWFnZXJTdGF0ZSxuZXh0Om51bGx9KSxyPXUuaGFzRWFnZXJTdGF0ZT91LmVhZ2VyU3RhdGU6ZShyLHUuYWN0aW9uKTtlbHNle3ZhciBkPXtsYW5lOmMsYWN0aW9uOnUuYWN0aW9uLGhhc0VhZ2VyU3RhdGU6dS5oYXNFYWdlclN0YXRlLGVhZ2VyU3RhdGU6dS5lYWdlclN0YXRlLG5leHQ6bnVsbH07bD09PW51bGw/KHM9bD1kLGk9cik6bD1sLm5leHQ9ZCxJZS5sYW5lc3w9Yyx6cnw9Y311PXUubmV4dH13aGlsZSh1IT09bnVsbCYmdSE9PWEpO2w9PT1udWxsP2k9cjpsLm5leHQ9cyxubihyLHQubWVtb2l6ZWRTdGF0ZSl8fCh3dD0hMCksdC5tZW1vaXplZFN0YXRlPXIsdC5iYXNlU3RhdGU9aSx0LmJhc2VRdWV1ZT1sLG4ubGFzdFJlbmRlcmVkU3RhdGU9cn1pZihlPW4uaW50ZXJsZWF2ZWQsZSE9PW51bGwpe289ZTtkbyBhPW8ubGFuZSxJZS5sYW5lc3w9YSx6cnw9YSxvPW8ubmV4dDt3aGlsZShvIT09ZSl9ZWxzZSBvPT09bnVsbCYmKG4ubGFuZXM9MCk7cmV0dXJuW3QubWVtb2l6ZWRTdGF0ZSxuLmRpc3BhdGNoXX1mdW5jdGlvbiBkdShlKXt2YXIgdD1XdCgpLG49dC5xdWV1ZTtpZihuPT09bnVsbCl0aHJvdyBFcnJvcihJKDMxMSkpO24ubGFzdFJlbmRlcmVkUmVkdWNlcj1lO3ZhciByPW4uZGlzcGF0Y2gsbz1uLnBlbmRpbmcsYT10Lm1lbW9pemVkU3RhdGU7aWYobyE9PW51bGwpe24ucGVuZGluZz1udWxsO3ZhciBpPW89by5uZXh0O2RvIGE9ZShhLGkuYWN0aW9uKSxpPWkubmV4dDt3aGlsZShpIT09byk7bm4oYSx0Lm1lbW9pemVkU3RhdGUpfHwod3Q9ITApLHQubWVtb2l6ZWRTdGF0ZT1hLHQuYmFzZVF1ZXVlPT09bnVsbCYmKHQuYmFzZVN0YXRlPWEpLG4ubGFzdFJlbmRlcmVkU3RhdGU9YX1yZXR1cm5bYSxyXX1mdW5jdGlvbiBkaCgpe31mdW5jdGlvbiBwaChlLHQpe3ZhciBuPUllLHI9V3QoKSxvPXQoKSxhPSFubihyLm1lbW9pemVkU3RhdGUsbyk7aWYoYSYmKHIubWVtb2l6ZWRTdGF0ZT1vLHd0PSEwKSxyPXIucXVldWUsRmMoaGguYmluZChudWxsLG4scixlKSxbZV0pLHIuZ2V0U25hcHNob3QhPT10fHxhfHxRZSE9PW51bGwmJlFlLm1lbW9pemVkU3RhdGUudGFnJjEpe2lmKG4uZmxhZ3N8PTIwNDgsTGEoOSxtaC5iaW5kKG51bGwsbixyLG8sdCksdm9pZCAwLG51bGwpLEplPT09bnVsbCl0aHJvdyBFcnJvcihJKDM0OSkpO0xyJjMwfHxmaChuLHQsbyl9cmV0dXJuIG99ZnVuY3Rpb24gZmgoZSx0LG4pe2UuZmxhZ3N8PTE2Mzg0LGU9e2dldFNuYXBzaG90OnQsdmFsdWU6bn0sdD1JZS51cGRhdGVRdWV1ZSx0PT09bnVsbD8odD17bGFzdEVmZmVjdDpudWxsLHN0b3JlczpudWxsfSxJZS51cGRhdGVRdWV1ZT10LHQuc3RvcmVzPVtlXSk6KG49dC5zdG9yZXMsbj09PW51bGw/dC5zdG9yZXM9W2VdOm4ucHVzaChlKSl9ZnVuY3Rpb24gbWgoZSx0LG4scil7dC52YWx1ZT1uLHQuZ2V0U25hcHNob3Q9cixnaCh0KSYmeWgoZSl9ZnVuY3Rpb24gaGgoZSx0LG4pe3JldHVybiBuKGZ1bmN0aW9uKCl7Z2godCkmJnloKGUpfSl9ZnVuY3Rpb24gZ2goZSl7dmFyIHQ9ZS5nZXRTbmFwc2hvdDtlPWUudmFsdWU7dHJ5e3ZhciBuPXQoKTtyZXR1cm4hbm4oZSxuKX1jYXRjaHtyZXR1cm4hMH19ZnVuY3Rpb24geWgoZSl7dmFyIHQ9Um4oZSwxKTt0IT09bnVsbCYmdG4odCxlLDEsLTEpfWZ1bmN0aW9uIFVmKGUpe3ZhciB0PWduKCk7cmV0dXJuIHR5cGVvZiBlPT0iZnVuY3Rpb24iJiYoZT1lKCkpLHQubWVtb2l6ZWRTdGF0ZT10LmJhc2VTdGF0ZT1lLGU9e3BlbmRpbmc6bnVsbCxpbnRlcmxlYXZlZDpudWxsLGxhbmVzOjAsZGlzcGF0Y2g6bnVsbCxsYXN0UmVuZGVyZWRSZWR1Y2VyOlBhLGxhc3RSZW5kZXJlZFN0YXRlOmV9LHQucXVldWU9ZSxlPWUuZGlzcGF0Y2g9amIuYmluZChudWxsLEllLGUpLFt0Lm1lbW9pemVkU3RhdGUsZV19ZnVuY3Rpb24gTGEoZSx0LG4scil7cmV0dXJuIGU9e3RhZzplLGNyZWF0ZTp0LGRlc3Ryb3k6bixkZXBzOnIsbmV4dDpudWxsfSx0PUllLnVwZGF0ZVF1ZXVlLHQ9PT1udWxsPyh0PXtsYXN0RWZmZWN0Om51bGwsc3RvcmVzOm51bGx9LEllLnVwZGF0ZVF1ZXVlPXQsdC5sYXN0RWZmZWN0PWUubmV4dD1lKToobj10Lmxhc3RFZmZlY3Qsbj09PW51bGw/dC5sYXN0RWZmZWN0PWUubmV4dD1lOihyPW4ubmV4dCxuLm5leHQ9ZSxlLm5leHQ9cix0Lmxhc3RFZmZlY3Q9ZSkpLGV9ZnVuY3Rpb24gdmgoKXtyZXR1cm4gV3QoKS5tZW1vaXplZFN0YXRlfWZ1bmN0aW9uIEppKGUsdCxuLHIpe3ZhciBvPWduKCk7SWUuZmxhZ3N8PWUsby5tZW1vaXplZFN0YXRlPUxhKDF8dCxuLHZvaWQgMCxyPT09dm9pZCAwP251bGw6cil9ZnVuY3Rpb24gTXMoZSx0LG4scil7dmFyIG89V3QoKTtyPXI9PT12b2lkIDA/bnVsbDpyO3ZhciBhPXZvaWQgMDtpZihHZSE9PW51bGwpe3ZhciBpPUdlLm1lbW9pemVkU3RhdGU7aWYoYT1pLmRlc3Ryb3ksciE9PW51bGwmJlBjKHIsaS5kZXBzKSl7by5tZW1vaXplZFN0YXRlPUxhKHQsbixhLHIpO3JldHVybn19SWUuZmxhZ3N8PWUsby5tZW1vaXplZFN0YXRlPUxhKDF8dCxuLGEscil9ZnVuY3Rpb24gJGYoZSx0KXtyZXR1cm4gSmkoODM5MDY1Niw4LGUsdCl9ZnVuY3Rpb24gRmMoZSx0KXtyZXR1cm4gTXMoMjA0OCw4LGUsdCl9ZnVuY3Rpb24gd2goZSx0KXtyZXR1cm4gTXMoNCwyLGUsdCl9ZnVuY3Rpb24gYmgoZSx0KXtyZXR1cm4gTXMoNCw0LGUsdCl9ZnVuY3Rpb24geGgoZSx0KXtpZih0eXBlb2YgdD09ImZ1bmN0aW9uIilyZXR1cm4gZT1lKCksdChlKSxmdW5jdGlvbigpe3QobnVsbCl9O2lmKHQhPW51bGwpcmV0dXJuIGU9ZSgpLHQuY3VycmVudD1lLGZ1bmN0aW9uKCl7dC5jdXJyZW50PW51bGx9fWZ1bmN0aW9uIGtoKGUsdCxuKXtyZXR1cm4gbj1uIT1udWxsP24uY29uY2F0KFtlXSk6bnVsbCxNcyg0LDQseGguYmluZChudWxsLHQsZSksbil9ZnVuY3Rpb24gVWMoKXt9ZnVuY3Rpb24gU2goZSx0KXt2YXIgbj1XdCgpO3Q9dD09PXZvaWQgMD9udWxsOnQ7dmFyIHI9bi5tZW1vaXplZFN0YXRlO3JldHVybiByIT09bnVsbCYmdCE9PW51bGwmJlBjKHQsclsxXSk/clswXToobi5tZW1vaXplZFN0YXRlPVtlLHRdLGUpfWZ1bmN0aW9uIEVoKGUsdCl7dmFyIG49V3QoKTt0PXQ9PT12b2lkIDA/bnVsbDp0O3ZhciByPW4ubWVtb2l6ZWRTdGF0ZTtyZXR1cm4gciE9PW51bGwmJnQhPT1udWxsJiZQYyh0LHJbMV0pP3JbMF06KGU9ZSgpLG4ubWVtb2l6ZWRTdGF0ZT1bZSx0XSxlKX1mdW5jdGlvbiBUaChlLHQsbil7cmV0dXJuIExyJjIxPyhubihuLHQpfHwobj1DbSgpLEllLmxhbmVzfD1uLHpyfD1uLGUuYmFzZVN0YXRlPSEwKSx0KTooZS5iYXNlU3RhdGUmJihlLmJhc2VTdGF0ZT0hMSx3dD0hMCksZS5tZW1vaXplZFN0YXRlPW4pfWZ1bmN0aW9uIFdiKGUsdCl7dmFyIG49dmU7dmU9biE9PTAmJjQ+bj9uOjQsZSghMCk7dmFyIHI9dXUudHJhbnNpdGlvbjt1dS50cmFuc2l0aW9uPXt9O3RyeXtlKCExKSx0KCl9ZmluYWxseXt2ZT1uLHV1LnRyYW5zaXRpb249cn19ZnVuY3Rpb24gTmgoKXtyZXR1cm4gV3QoKS5tZW1vaXplZFN0YXRlfWZ1bmN0aW9uIEhiKGUsdCxuKXt2YXIgcj1scihlKTtpZihuPXtsYW5lOnIsYWN0aW9uOm4saGFzRWFnZXJTdGF0ZTohMSxlYWdlclN0YXRlOm51bGwsbmV4dDpudWxsfSxEaChlKSlfaCh0LG4pO2Vsc2UgaWYobj1saChlLHQsbixyKSxuIT09bnVsbCl7dmFyIG89bXQoKTt0bihuLGUscixvKSxBaChuLHQscil9fWZ1bmN0aW9uIGpiKGUsdCxuKXt2YXIgcj1scihlKSxvPXtsYW5lOnIsYWN0aW9uOm4saGFzRWFnZXJTdGF0ZTohMSxlYWdlclN0YXRlOm51bGwsbmV4dDpudWxsfTtpZihEaChlKSlfaCh0LG8pO2Vsc2V7dmFyIGE9ZS5hbHRlcm5hdGU7aWYoZS5sYW5lcz09PTAmJihhPT09bnVsbHx8YS5sYW5lcz09PTApJiYoYT10Lmxhc3RSZW5kZXJlZFJlZHVjZXIsYSE9PW51bGwpKXRyeXt2YXIgaT10Lmxhc3RSZW5kZXJlZFN0YXRlLHM9YShpLG4pO2lmKG8uaGFzRWFnZXJTdGF0ZT0hMCxvLmVhZ2VyU3RhdGU9cyxubihzLGkpKXt2YXIgbD10LmludGVybGVhdmVkO2w9PT1udWxsPyhvLm5leHQ9byxDYyh0KSk6KG8ubmV4dD1sLm5leHQsbC5uZXh0PW8pLHQuaW50ZXJsZWF2ZWQ9bztyZXR1cm59fWNhdGNoe31maW5hbGx5e31uPWxoKGUsdCxvLHIpLG4hPT1udWxsJiYobz1tdCgpLHRuKG4sZSxyLG8pLEFoKG4sdCxyKSl9fWZ1bmN0aW9uIERoKGUpe3ZhciB0PWUuYWx0ZXJuYXRlO3JldHVybiBlPT09SWV8fHQhPT1udWxsJiZ0PT09SWV9ZnVuY3Rpb24gX2goZSx0KXt5YT13cz0hMDt2YXIgbj1lLnBlbmRpbmc7bj09PW51bGw/dC5uZXh0PXQ6KHQubmV4dD1uLm5leHQsbi5uZXh0PXQpLGUucGVuZGluZz10fWZ1bmN0aW9uIEFoKGUsdCxuKXtpZihuJjQxOTQyNDApe3ZhciByPXQubGFuZXM7ciY9ZS5wZW5kaW5nTGFuZXMsbnw9cix0LmxhbmVzPW4sZ2MoZSxuKX19dmFyIGJzPXtyZWFkQ29udGV4dDpCdCx1c2VDYWxsYmFjazpzdCx1c2VDb250ZXh0OnN0LHVzZUVmZmVjdDpzdCx1c2VJbXBlcmF0aXZlSGFuZGxlOnN0LHVzZUluc2VydGlvbkVmZmVjdDpzdCx1c2VMYXlvdXRFZmZlY3Q6c3QsdXNlTWVtbzpzdCx1c2VSZWR1Y2VyOnN0LHVzZVJlZjpzdCx1c2VTdGF0ZTpzdCx1c2VEZWJ1Z1ZhbHVlOnN0LHVzZURlZmVycmVkVmFsdWU6c3QsdXNlVHJhbnNpdGlvbjpzdCx1c2VNdXRhYmxlU291cmNlOnN0LHVzZVN5bmNFeHRlcm5hbFN0b3JlOnN0LHVzZUlkOnN0LHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX0sVmI9e3JlYWRDb250ZXh0OkJ0LHVzZUNhbGxiYWNrOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGduKCkubWVtb2l6ZWRTdGF0ZT1bZSx0PT09dm9pZCAwP251bGw6dF0sZX0sdXNlQ29udGV4dDpCdCx1c2VFZmZlY3Q6JGYsdXNlSW1wZXJhdGl2ZUhhbmRsZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIG49biE9bnVsbD9uLmNvbmNhdChbZV0pOm51bGwsSmkoNDE5NDMwOCw0LHhoLmJpbmQobnVsbCx0LGUpLG4pfSx1c2VMYXlvdXRFZmZlY3Q6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gSmkoNDE5NDMwOCw0LGUsdCl9LHVzZUluc2VydGlvbkVmZmVjdDpmdW5jdGlvbihlLHQpe3JldHVybiBKaSg0LDIsZSx0KX0sdXNlTWVtbzpmdW5jdGlvbihlLHQpe3ZhciBuPWduKCk7cmV0dXJuIHQ9dD09PXZvaWQgMD9udWxsOnQsZT1lKCksbi5tZW1vaXplZFN0YXRlPVtlLHRdLGV9LHVzZVJlZHVjZXI6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWduKCk7cmV0dXJuIHQ9biE9PXZvaWQgMD9uKHQpOnQsci5tZW1vaXplZFN0YXRlPXIuYmFzZVN0YXRlPXQsZT17cGVuZGluZzpudWxsLGludGVybGVhdmVkOm51bGwsbGFuZXM6MCxkaXNwYXRjaDpudWxsLGxhc3RSZW5kZXJlZFJlZHVjZXI6ZSxsYXN0UmVuZGVyZWRTdGF0ZTp0fSxyLnF1ZXVlPWUsZT1lLmRpc3BhdGNoPUhiLmJpbmQobnVsbCxJZSxlKSxbci5tZW1vaXplZFN0YXRlLGVdfSx1c2VSZWY6ZnVuY3Rpb24oZSl7dmFyIHQ9Z24oKTtyZXR1cm4gZT17Y3VycmVudDplfSx0Lm1lbW9pemVkU3RhdGU9ZX0sdXNlU3RhdGU6VWYsdXNlRGVidWdWYWx1ZTpVYyx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBnbigpLm1lbW9pemVkU3RhdGU9ZX0sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3ZhciBlPVVmKCExKSx0PWVbMF07cmV0dXJuIGU9V2IuYmluZChudWxsLGVbMV0pLGduKCkubWVtb2l6ZWRTdGF0ZT1lLFt0LGVdfSx1c2VNdXRhYmxlU291cmNlOmZ1bmN0aW9uKCl7fSx1c2VTeW5jRXh0ZXJuYWxTdG9yZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9SWUsbz1nbigpO2lmKENlKXtpZihuPT09dm9pZCAwKXRocm93IEVycm9yKEkoNDA3KSk7bj1uKCl9ZWxzZXtpZihuPXQoKSxKZT09PW51bGwpdGhyb3cgRXJyb3IoSSgzNDkpKTtMciYzMHx8Zmgocix0LG4pfW8ubWVtb2l6ZWRTdGF0ZT1uO3ZhciBhPXt2YWx1ZTpuLGdldFNuYXBzaG90OnR9O3JldHVybiBvLnF1ZXVlPWEsJGYoaGguYmluZChudWxsLHIsYSxlKSxbZV0pLHIuZmxhZ3N8PTIwNDgsTGEoOSxtaC5iaW5kKG51bGwscixhLG4sdCksdm9pZCAwLG51bGwpLG59LHVzZUlkOmZ1bmN0aW9uKCl7dmFyIGU9Z24oKSx0PUplLmlkZW50aWZpZXJQcmVmaXg7aWYoQ2Upe3ZhciBuPUFuLHI9X247bj0ociZ+KDE8PDMyLWVuKHIpLTEpKS50b1N0cmluZygzMikrbix0PSI6Iit0KyJSIituLG49SWErKywwPG4mJih0Kz0iSCIrbi50b1N0cmluZygzMikpLHQrPSI6In1lbHNlIG49QmIrKyx0PSI6Iit0KyJyIituLnRvU3RyaW5nKDMyKSsiOiI7cmV0dXJuIGUubWVtb2l6ZWRTdGF0ZT10fSx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LEdiPXtyZWFkQ29udGV4dDpCdCx1c2VDYWxsYmFjazpTaCx1c2VDb250ZXh0OkJ0LHVzZUVmZmVjdDpGYyx1c2VJbXBlcmF0aXZlSGFuZGxlOmtoLHVzZUluc2VydGlvbkVmZmVjdDp3aCx1c2VMYXlvdXRFZmZlY3Q6YmgsdXNlTWVtbzpFaCx1c2VSZWR1Y2VyOmN1LHVzZVJlZjp2aCx1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiBjdShQYSl9LHVzZURlYnVnVmFsdWU6VWMsdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1XdCgpO3JldHVybiBUaCh0LEdlLm1lbW9pemVkU3RhdGUsZSl9LHVzZVRyYW5zaXRpb246ZnVuY3Rpb24oKXt2YXIgZT1jdShQYSlbMF0sdD1XdCgpLm1lbW9pemVkU3RhdGU7cmV0dXJuW2UsdF19LHVzZU11dGFibGVTb3VyY2U6ZGgsdXNlU3luY0V4dGVybmFsU3RvcmU6cGgsdXNlSWQ6TmgsdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiExfSxLYj17cmVhZENvbnRleHQ6QnQsdXNlQ2FsbGJhY2s6U2gsdXNlQ29udGV4dDpCdCx1c2VFZmZlY3Q6RmMsdXNlSW1wZXJhdGl2ZUhhbmRsZTpraCx1c2VJbnNlcnRpb25FZmZlY3Q6d2gsdXNlTGF5b3V0RWZmZWN0OmJoLHVzZU1lbW86RWgsdXNlUmVkdWNlcjpkdSx1c2VSZWY6dmgsdXNlU3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gZHUoUGEpfSx1c2VEZWJ1Z1ZhbHVlOlVjLHVzZURlZmVycmVkVmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9V3QoKTtyZXR1cm4gR2U9PT1udWxsP3QubWVtb2l6ZWRTdGF0ZT1lOlRoKHQsR2UubWVtb2l6ZWRTdGF0ZSxlKX0sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3ZhciBlPWR1KFBhKVswXSx0PVd0KCkubWVtb2l6ZWRTdGF0ZTtyZXR1cm5bZSx0XX0sdXNlTXV0YWJsZVNvdXJjZTpkaCx1c2VTeW5jRXh0ZXJuYWxTdG9yZTpwaCx1c2VJZDpOaCx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9O2Z1bmN0aW9uIEp0KGUsdCl7aWYoZSYmZS5kZWZhdWx0UHJvcHMpe3Q9UGUoe30sdCksZT1lLmRlZmF1bHRQcm9wcztmb3IodmFyIG4gaW4gZSl0W25dPT09dm9pZCAwJiYodFtuXT1lW25dKTtyZXR1cm4gdH1yZXR1cm4gdH1mdW5jdGlvbiBHdShlLHQsbixyKXt0PWUubWVtb2l6ZWRTdGF0ZSxuPW4ocix0KSxuPW49PW51bGw/dDpQZSh7fSx0LG4pLGUubWVtb2l6ZWRTdGF0ZT1uLGUubGFuZXM9PT0wJiYoZS51cGRhdGVRdWV1ZS5iYXNlU3RhdGU9bil9dmFyIFJzPXtpc01vdW50ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuKGU9ZS5fcmVhY3RJbnRlcm5hbHMpPyRyKGUpPT09ZTohMX0sZW5xdWV1ZVNldFN0YXRlOmZ1bmN0aW9uKGUsdCxuKXtlPWUuX3JlYWN0SW50ZXJuYWxzO3ZhciByPW10KCksbz1scihlKSxhPUNuKHIsbyk7YS5wYXlsb2FkPXQsbiE9bnVsbCYmKGEuY2FsbGJhY2s9biksdD1pcihlLGEsbyksdCE9PW51bGwmJih0bih0LGUsbyxyKSxxaSh0LGUsbykpfSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKGUsdCxuKXtlPWUuX3JlYWN0SW50ZXJuYWxzO3ZhciByPW10KCksbz1scihlKSxhPUNuKHIsbyk7YS50YWc9MSxhLnBheWxvYWQ9dCxuIT1udWxsJiYoYS5jYWxsYmFjaz1uKSx0PWlyKGUsYSxvKSx0IT09bnVsbCYmKHRuKHQsZSxvLHIpLHFpKHQsZSxvKSl9LGVucXVldWVGb3JjZVVwZGF0ZTpmdW5jdGlvbihlLHQpe2U9ZS5fcmVhY3RJbnRlcm5hbHM7dmFyIG49bXQoKSxyPWxyKGUpLG89Q24obixyKTtvLnRhZz0yLHQhPW51bGwmJihvLmNhbGxiYWNrPXQpLHQ9aXIoZSxvLHIpLHQhPT1udWxsJiYodG4odCxlLHIsbikscWkodCxlLHIpKX19O2Z1bmN0aW9uIEJmKGUsdCxuLHIsbyxhLGkpe3JldHVybiBlPWUuc3RhdGVOb2RlLHR5cGVvZiBlLnNob3VsZENvbXBvbmVudFVwZGF0ZT09ImZ1bmN0aW9uIj9lLnNob3VsZENvbXBvbmVudFVwZGF0ZShyLGEsaSk6dC5wcm90b3R5cGUmJnQucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50PyFfYShuLHIpfHwhX2EobyxhKTohMH1mdW5jdGlvbiBDaChlLHQsbil7dmFyIHI9ITEsbz1kcixhPXQuY29udGV4dFR5cGU7cmV0dXJuIHR5cGVvZiBhPT0ib2JqZWN0IiYmYSE9PW51bGw/YT1CdChhKToobz14dCh0KT9JcjpjdC5jdXJyZW50LHI9dC5jb250ZXh0VHlwZXMsYT0ocj1yIT1udWxsKT9EbyhlLG8pOmRyKSx0PW5ldyB0KG4sYSksZS5tZW1vaXplZFN0YXRlPXQuc3RhdGUhPT1udWxsJiZ0LnN0YXRlIT09dm9pZCAwP3Quc3RhdGU6bnVsbCx0LnVwZGF0ZXI9UnMsZS5zdGF0ZU5vZGU9dCx0Ll9yZWFjdEludGVybmFscz1lLHImJihlPWUuc3RhdGVOb2RlLGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dD1vLGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ9YSksdH1mdW5jdGlvbiBXZihlLHQsbixyKXtlPXQuc3RhdGUsdHlwZW9mIHQuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcz09ImZ1bmN0aW9uIiYmdC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG4sciksdHlwZW9mIHQuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM9PSJmdW5jdGlvbiImJnQuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobixyKSx0LnN0YXRlIT09ZSYmUnMuZW5xdWV1ZVJlcGxhY2VTdGF0ZSh0LHQuc3RhdGUsbnVsbCl9ZnVuY3Rpb24gS3UoZSx0LG4scil7dmFyIG89ZS5zdGF0ZU5vZGU7by5wcm9wcz1uLG8uc3RhdGU9ZS5tZW1vaXplZFN0YXRlLG8ucmVmcz17fSxPYyhlKTt2YXIgYT10LmNvbnRleHRUeXBlO3R5cGVvZiBhPT0ib2JqZWN0IiYmYSE9PW51bGw/by5jb250ZXh0PUJ0KGEpOihhPXh0KHQpP0lyOmN0LmN1cnJlbnQsby5jb250ZXh0PURvKGUsYSkpLG8uc3RhdGU9ZS5tZW1vaXplZFN0YXRlLGE9dC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsdHlwZW9mIGE9PSJmdW5jdGlvbiImJihHdShlLHQsYSxuKSxvLnN0YXRlPWUubWVtb2l6ZWRTdGF0ZSksdHlwZW9mIHQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzPT0iZnVuY3Rpb24ifHx0eXBlb2Ygby5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZT09ImZ1bmN0aW9uInx8dHlwZW9mIG8uVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCE9ImZ1bmN0aW9uIiYmdHlwZW9mIG8uY29tcG9uZW50V2lsbE1vdW50IT0iZnVuY3Rpb24ifHwodD1vLnN0YXRlLHR5cGVvZiBvLmNvbXBvbmVudFdpbGxNb3VudD09ImZ1bmN0aW9uIiYmby5jb21wb25lbnRXaWxsTW91bnQoKSx0eXBlb2Ygby5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50PT0iZnVuY3Rpb24iJiZvLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKSx0IT09by5zdGF0ZSYmUnMuZW5xdWV1ZVJlcGxhY2VTdGF0ZShvLG8uc3RhdGUsbnVsbCkseXMoZSxuLG8sciksby5zdGF0ZT1lLm1lbW9pemVkU3RhdGUpLHR5cGVvZiBvLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iJiYoZS5mbGFnc3w9NDE5NDMwOCl9ZnVuY3Rpb24gT28oZSx0KXt0cnl7dmFyIG49IiIscj10O2RvIG4rPVN3KHIpLHI9ci5yZXR1cm47d2hpbGUocik7dmFyIG89bn1jYXRjaChhKXtvPWAKRXJyb3IgZ2VuZXJhdGluZyBzdGFjazogYCthLm1lc3NhZ2UrYApgK2Euc3RhY2t9cmV0dXJue3ZhbHVlOmUsc291cmNlOnQsc3RhY2s6byxkaWdlc3Q6bnVsbH19ZnVuY3Rpb24gcHUoZSx0LG4pe3JldHVybnt2YWx1ZTplLHNvdXJjZTpudWxsLHN0YWNrOm4/P251bGwsZGlnZXN0OnQ/P251bGx9fWZ1bmN0aW9uIFl1KGUsdCl7dHJ5e2NvbnNvbGUuZXJyb3IodC52YWx1ZSl9Y2F0Y2gobil7c2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IG59KX19dmFyIFliPXR5cGVvZiBXZWFrTWFwPT0iZnVuY3Rpb24iP1dlYWtNYXA6TWFwO2Z1bmN0aW9uIE9oKGUsdCxuKXtuPUNuKC0xLG4pLG4udGFnPTMsbi5wYXlsb2FkPXtlbGVtZW50Om51bGx9O3ZhciByPXQudmFsdWU7cmV0dXJuIG4uY2FsbGJhY2s9ZnVuY3Rpb24oKXtrc3x8KGtzPSEwLG9jPXIpLFl1KGUsdCl9LG59ZnVuY3Rpb24gTWgoZSx0LG4pe249Q24oLTEsbiksbi50YWc9Mzt2YXIgcj1lLnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yO2lmKHR5cGVvZiByPT0iZnVuY3Rpb24iKXt2YXIgbz10LnZhbHVlO24ucGF5bG9hZD1mdW5jdGlvbigpe3JldHVybiByKG8pfSxuLmNhbGxiYWNrPWZ1bmN0aW9uKCl7WXUoZSx0KX19dmFyIGE9ZS5zdGF0ZU5vZGU7cmV0dXJuIGEhPT1udWxsJiZ0eXBlb2YgYS5jb21wb25lbnREaWRDYXRjaD09ImZ1bmN0aW9uIiYmKG4uY2FsbGJhY2s9ZnVuY3Rpb24oKXtZdShlLHQpLHR5cGVvZiByIT0iZnVuY3Rpb24iJiYoc3I9PT1udWxsP3NyPW5ldyBTZXQoW3RoaXNdKTpzci5hZGQodGhpcykpO3ZhciBpPXQuc3RhY2s7dGhpcy5jb21wb25lbnREaWRDYXRjaCh0LnZhbHVlLHtjb21wb25lbnRTdGFjazppIT09bnVsbD9pOiIifSl9KSxufWZ1bmN0aW9uIEhmKGUsdCxuKXt2YXIgcj1lLnBpbmdDYWNoZTtpZihyPT09bnVsbCl7cj1lLnBpbmdDYWNoZT1uZXcgWWI7dmFyIG89bmV3IFNldDtyLnNldCh0LG8pfWVsc2Ugbz1yLmdldCh0KSxvPT09dm9pZCAwJiYobz1uZXcgU2V0LHIuc2V0KHQsbykpO28uaGFzKG4pfHwoby5hZGQobiksZT1seC5iaW5kKG51bGwsZSx0LG4pLHQudGhlbihlLGUpKX1mdW5jdGlvbiBqZihlKXtkb3t2YXIgdDtpZigodD1lLnRhZz09PTEzKSYmKHQ9ZS5tZW1vaXplZFN0YXRlLHQ9dCE9PW51bGw/dC5kZWh5ZHJhdGVkIT09bnVsbDohMCksdClyZXR1cm4gZTtlPWUucmV0dXJufXdoaWxlKGUhPT1udWxsKTtyZXR1cm4gbnVsbH1mdW5jdGlvbiBWZihlLHQsbixyLG8pe3JldHVybiBlLm1vZGUmMT8oZS5mbGFnc3w9NjU1MzYsZS5sYW5lcz1vLGUpOihlPT09dD9lLmZsYWdzfD02NTUzNjooZS5mbGFnc3w9MTI4LG4uZmxhZ3N8PTEzMTA3MixuLmZsYWdzJj0tNTI4MDUsbi50YWc9PT0xJiYobi5hbHRlcm5hdGU9PT1udWxsP24udGFnPTE3Oih0PUNuKC0xLDEpLHQudGFnPTIsaXIobix0LDEpKSksbi5sYW5lc3w9MSksZSl9dmFyIHFiPVBuLlJlYWN0Q3VycmVudE93bmVyLHd0PSExO2Z1bmN0aW9uIGZ0KGUsdCxuLHIpe3QuY2hpbGQ9ZT09PW51bGw/c2godCxudWxsLG4scik6QW8odCxlLmNoaWxkLG4scil9ZnVuY3Rpb24gR2YoZSx0LG4scixvKXtuPW4ucmVuZGVyO3ZhciBhPXQucmVmO3JldHVybiBFbyh0LG8pLHI9TGMoZSx0LG4scixhLG8pLG49emMoKSxlIT09bnVsbCYmIXd0Pyh0LnVwZGF0ZVF1ZXVlPWUudXBkYXRlUXVldWUsdC5mbGFncyY9LTIwNTMsZS5sYW5lcyY9fm8sSW4oZSx0LG8pKTooQ2UmJm4mJkVjKHQpLHQuZmxhZ3N8PTEsZnQoZSx0LHIsbyksdC5jaGlsZCl9ZnVuY3Rpb24gS2YoZSx0LG4scixvKXtpZihlPT09bnVsbCl7dmFyIGE9bi50eXBlO3JldHVybiB0eXBlb2YgYT09ImZ1bmN0aW9uIiYmIUtjKGEpJiZhLmRlZmF1bHRQcm9wcz09PXZvaWQgMCYmbi5jb21wYXJlPT09bnVsbCYmbi5kZWZhdWx0UHJvcHM9PT12b2lkIDA/KHQudGFnPTE1LHQudHlwZT1hLFJoKGUsdCxhLHIsbykpOihlPXRzKG4udHlwZSxudWxsLHIsdCx0Lm1vZGUsbyksZS5yZWY9dC5yZWYsZS5yZXR1cm49dCx0LmNoaWxkPWUpfWlmKGE9ZS5jaGlsZCwhKGUubGFuZXMmbykpe3ZhciBpPWEubWVtb2l6ZWRQcm9wcztpZihuPW4uY29tcGFyZSxuPW4hPT1udWxsP246X2EsbihpLHIpJiZlLnJlZj09PXQucmVmKXJldHVybiBJbihlLHQsbyl9cmV0dXJuIHQuZmxhZ3N8PTEsZT11cihhLHIpLGUucmVmPXQucmVmLGUucmV0dXJuPXQsdC5jaGlsZD1lfWZ1bmN0aW9uIFJoKGUsdCxuLHIsbyl7aWYoZSE9PW51bGwpe3ZhciBhPWUubWVtb2l6ZWRQcm9wcztpZihfYShhLHIpJiZlLnJlZj09PXQucmVmKWlmKHd0PSExLHQucGVuZGluZ1Byb3BzPXI9YSwoZS5sYW5lcyZvKSE9PTApZS5mbGFncyYxMzEwNzImJih3dD0hMCk7ZWxzZSByZXR1cm4gdC5sYW5lcz1lLmxhbmVzLEluKGUsdCxvKX1yZXR1cm4gcXUoZSx0LG4scixvKX1mdW5jdGlvbiBJaChlLHQsbil7dmFyIHI9dC5wZW5kaW5nUHJvcHMsbz1yLmNoaWxkcmVuLGE9ZSE9PW51bGw/ZS5tZW1vaXplZFN0YXRlOm51bGw7aWYoci5tb2RlPT09ImhpZGRlbiIpaWYoISh0Lm1vZGUmMSkpdC5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MCxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSxTZSh3byxEdCksRHR8PW47ZWxzZXtpZighKG4mMTA3Mzc0MTgyNCkpcmV0dXJuIGU9YSE9PW51bGw/YS5iYXNlTGFuZXN8bjpuLHQubGFuZXM9dC5jaGlsZExhbmVzPTEwNzM3NDE4MjQsdC5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6ZSxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSx0LnVwZGF0ZVF1ZXVlPW51bGwsU2Uod28sRHQpLER0fD1lLG51bGw7dC5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MCxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSxyPWEhPT1udWxsP2EuYmFzZUxhbmVzOm4sU2Uod28sRHQpLER0fD1yfWVsc2UgYSE9PW51bGw/KHI9YS5iYXNlTGFuZXN8bix0Lm1lbW9pemVkU3RhdGU9bnVsbCk6cj1uLFNlKHdvLER0KSxEdHw9cjtyZXR1cm4gZnQoZSx0LG8sbiksdC5jaGlsZH1mdW5jdGlvbiBQaChlLHQpe3ZhciBuPXQucmVmOyhlPT09bnVsbCYmbiE9PW51bGx8fGUhPT1udWxsJiZlLnJlZiE9PW4pJiYodC5mbGFnc3w9NTEyLHQuZmxhZ3N8PTIwOTcxNTIpfWZ1bmN0aW9uIHF1KGUsdCxuLHIsbyl7dmFyIGE9eHQobik/SXI6Y3QuY3VycmVudDtyZXR1cm4gYT1Ebyh0LGEpLEVvKHQsbyksbj1MYyhlLHQsbixyLGEsbykscj16YygpLGUhPT1udWxsJiYhd3Q/KHQudXBkYXRlUXVldWU9ZS51cGRhdGVRdWV1ZSx0LmZsYWdzJj0tMjA1MyxlLmxhbmVzJj1+byxJbihlLHQsbykpOihDZSYmciYmRWModCksdC5mbGFnc3w9MSxmdChlLHQsbixvKSx0LmNoaWxkKX1mdW5jdGlvbiBZZihlLHQsbixyLG8pe2lmKHh0KG4pKXt2YXIgYT0hMDtwcyh0KX1lbHNlIGE9ITE7aWYoRW8odCxvKSx0LnN0YXRlTm9kZT09PW51bGwpWGkoZSx0KSxDaCh0LG4sciksS3UodCxuLHIsbykscj0hMDtlbHNlIGlmKGU9PT1udWxsKXt2YXIgaT10LnN0YXRlTm9kZSxzPXQubWVtb2l6ZWRQcm9wcztpLnByb3BzPXM7dmFyIGw9aS5jb250ZXh0LHU9bi5jb250ZXh0VHlwZTt0eXBlb2YgdT09Im9iamVjdCImJnUhPT1udWxsP3U9QnQodSk6KHU9eHQobik/SXI6Y3QuY3VycmVudCx1PURvKHQsdSkpO3ZhciBjPW4uZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLGQ9dHlwZW9mIGM9PSJmdW5jdGlvbiJ8fHR5cGVvZiBpLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlPT0iZnVuY3Rpb24iO2R8fHR5cGVvZiBpLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24iJiZ0eXBlb2YgaS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24ifHwocyE9PXJ8fGwhPT11KSYmV2YodCxpLHIsdSksSm49ITE7dmFyIHA9dC5tZW1vaXplZFN0YXRlO2kuc3RhdGU9cCx5cyh0LHIsaSxvKSxsPXQubWVtb2l6ZWRTdGF0ZSxzIT09cnx8cCE9PWx8fGJ0LmN1cnJlbnR8fEpuPyh0eXBlb2YgYz09ImZ1bmN0aW9uIiYmKEd1KHQsbixjLHIpLGw9dC5tZW1vaXplZFN0YXRlKSwocz1Kbnx8QmYodCxuLHMscixwLGwsdSkpPyhkfHx0eXBlb2YgaS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IT0iZnVuY3Rpb24iJiZ0eXBlb2YgaS5jb21wb25lbnRXaWxsTW91bnQhPSJmdW5jdGlvbiJ8fCh0eXBlb2YgaS5jb21wb25lbnRXaWxsTW91bnQ9PSJmdW5jdGlvbiImJmkuY29tcG9uZW50V2lsbE1vdW50KCksdHlwZW9mIGkuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudD09ImZ1bmN0aW9uIiYmaS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCkpLHR5cGVvZiBpLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9NDE5NDMwOCkpOih0eXBlb2YgaS5jb21wb25lbnREaWRNb3VudD09ImZ1bmN0aW9uIiYmKHQuZmxhZ3N8PTQxOTQzMDgpLHQubWVtb2l6ZWRQcm9wcz1yLHQubWVtb2l6ZWRTdGF0ZT1sKSxpLnByb3BzPXIsaS5zdGF0ZT1sLGkuY29udGV4dD11LHI9cyk6KHR5cGVvZiBpLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9NDE5NDMwOCkscj0hMSl9ZWxzZXtpPXQuc3RhdGVOb2RlLHVoKGUsdCkscz10Lm1lbW9pemVkUHJvcHMsdT10LnR5cGU9PT10LmVsZW1lbnRUeXBlP3M6SnQodC50eXBlLHMpLGkucHJvcHM9dSxkPXQucGVuZGluZ1Byb3BzLHA9aS5jb250ZXh0LGw9bi5jb250ZXh0VHlwZSx0eXBlb2YgbD09Im9iamVjdCImJmwhPT1udWxsP2w9QnQobCk6KGw9eHQobik/SXI6Y3QuY3VycmVudCxsPURvKHQsbCkpO3ZhciB5PW4uZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOyhjPXR5cGVvZiB5PT0iZnVuY3Rpb24ifHx0eXBlb2YgaS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZT09ImZ1bmN0aW9uIil8fHR5cGVvZiBpLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24iJiZ0eXBlb2YgaS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24ifHwocyE9PWR8fHAhPT1sKSYmV2YodCxpLHIsbCksSm49ITEscD10Lm1lbW9pemVkU3RhdGUsaS5zdGF0ZT1wLHlzKHQscixpLG8pO3ZhciBoPXQubWVtb2l6ZWRTdGF0ZTtzIT09ZHx8cCE9PWh8fGJ0LmN1cnJlbnR8fEpuPyh0eXBlb2YgeT09ImZ1bmN0aW9uIiYmKEd1KHQsbix5LHIpLGg9dC5tZW1vaXplZFN0YXRlKSwodT1Kbnx8QmYodCxuLHUscixwLGgsbCl8fCExKT8oY3x8dHlwZW9mIGkuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUhPSJmdW5jdGlvbiImJnR5cGVvZiBpLmNvbXBvbmVudFdpbGxVcGRhdGUhPSJmdW5jdGlvbiJ8fCh0eXBlb2YgaS5jb21wb25lbnRXaWxsVXBkYXRlPT0iZnVuY3Rpb24iJiZpLmNvbXBvbmVudFdpbGxVcGRhdGUocixoLGwpLHR5cGVvZiBpLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlPT0iZnVuY3Rpb24iJiZpLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlKHIsaCxsKSksdHlwZW9mIGkuY29tcG9uZW50RGlkVXBkYXRlPT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9NCksdHlwZW9mIGkuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGU9PSJmdW5jdGlvbiImJih0LmZsYWdzfD0xMDI0KSk6KHR5cGVvZiBpLmNvbXBvbmVudERpZFVwZGF0ZSE9ImZ1bmN0aW9uInx8cz09PWUubWVtb2l6ZWRQcm9wcyYmcD09PWUubWVtb2l6ZWRTdGF0ZXx8KHQuZmxhZ3N8PTQpLHR5cGVvZiBpLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlIT0iZnVuY3Rpb24ifHxzPT09ZS5tZW1vaXplZFByb3BzJiZwPT09ZS5tZW1vaXplZFN0YXRlfHwodC5mbGFnc3w9MTAyNCksdC5tZW1vaXplZFByb3BzPXIsdC5tZW1vaXplZFN0YXRlPWgpLGkucHJvcHM9cixpLnN0YXRlPWgsaS5jb250ZXh0PWwscj11KToodHlwZW9mIGkuY29tcG9uZW50RGlkVXBkYXRlIT0iZnVuY3Rpb24ifHxzPT09ZS5tZW1vaXplZFByb3BzJiZwPT09ZS5tZW1vaXplZFN0YXRlfHwodC5mbGFnc3w9NCksdHlwZW9mIGkuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUhPSJmdW5jdGlvbiJ8fHM9PT1lLm1lbW9pemVkUHJvcHMmJnA9PT1lLm1lbW9pemVkU3RhdGV8fCh0LmZsYWdzfD0xMDI0KSxyPSExKX1yZXR1cm4gUXUoZSx0LG4scixhLG8pfWZ1bmN0aW9uIFF1KGUsdCxuLHIsbyxhKXtQaChlLHQpO3ZhciBpPSh0LmZsYWdzJjEyOCkhPT0wO2lmKCFyJiYhaSlyZXR1cm4gbyYmUmYodCxuLCExKSxJbihlLHQsYSk7cj10LnN0YXRlTm9kZSxxYi5jdXJyZW50PXQ7dmFyIHM9aSYmdHlwZW9mIG4uZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIT0iZnVuY3Rpb24iP251bGw6ci5yZW5kZXIoKTtyZXR1cm4gdC5mbGFnc3w9MSxlIT09bnVsbCYmaT8odC5jaGlsZD1Bbyh0LGUuY2hpbGQsbnVsbCxhKSx0LmNoaWxkPUFvKHQsbnVsbCxzLGEpKTpmdChlLHQscyxhKSx0Lm1lbW9pemVkU3RhdGU9ci5zdGF0ZSxvJiZSZih0LG4sITApLHQuY2hpbGR9ZnVuY3Rpb24gTGgoZSl7dmFyIHQ9ZS5zdGF0ZU5vZGU7dC5wZW5kaW5nQ29udGV4dD9NZihlLHQucGVuZGluZ0NvbnRleHQsdC5wZW5kaW5nQ29udGV4dCE9PXQuY29udGV4dCk6dC5jb250ZXh0JiZNZihlLHQuY29udGV4dCwhMSksTWMoZSx0LmNvbnRhaW5lckluZm8pfWZ1bmN0aW9uIHFmKGUsdCxuLHIsbyl7cmV0dXJuIF9vKCksTmMobyksdC5mbGFnc3w9MjU2LGZ0KGUsdCxuLHIpLHQuY2hpbGR9dmFyIEp1PXtkZWh5ZHJhdGVkOm51bGwsdHJlZUNvbnRleHQ6bnVsbCxyZXRyeUxhbmU6MH07ZnVuY3Rpb24gWHUoZSl7cmV0dXJue2Jhc2VMYW5lczplLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOm51bGx9fWZ1bmN0aW9uIHpoKGUsdCxuKXt2YXIgcj10LnBlbmRpbmdQcm9wcyxvPVJlLmN1cnJlbnQsYT0hMSxpPSh0LmZsYWdzJjEyOCkhPT0wLHM7aWYoKHM9aSl8fChzPWUhPT1udWxsJiZlLm1lbW9pemVkU3RhdGU9PT1udWxsPyExOihvJjIpIT09MCkscz8oYT0hMCx0LmZsYWdzJj0tMTI5KTooZT09PW51bGx8fGUubWVtb2l6ZWRTdGF0ZSE9PW51bGwpJiYob3w9MSksU2UoUmUsbyYxKSxlPT09bnVsbClyZXR1cm4ganUodCksZT10Lm1lbW9pemVkU3RhdGUsZSE9PW51bGwmJihlPWUuZGVoeWRyYXRlZCxlIT09bnVsbCk/KHQubW9kZSYxP2UuZGF0YT09PSIkISI/dC5sYW5lcz04OnQubGFuZXM9MTA3Mzc0MTgyNDp0LmxhbmVzPTEsbnVsbCk6KGk9ci5jaGlsZHJlbixlPXIuZmFsbGJhY2ssYT8ocj10Lm1vZGUsYT10LmNoaWxkLGk9e21vZGU6ImhpZGRlbiIsY2hpbGRyZW46aX0sIShyJjEpJiZhIT09bnVsbD8oYS5jaGlsZExhbmVzPTAsYS5wZW5kaW5nUHJvcHM9aSk6YT1McyhpLHIsMCxudWxsKSxlPVJyKGUscixuLG51bGwpLGEucmV0dXJuPXQsZS5yZXR1cm49dCxhLnNpYmxpbmc9ZSx0LmNoaWxkPWEsdC5jaGlsZC5tZW1vaXplZFN0YXRlPVh1KG4pLHQubWVtb2l6ZWRTdGF0ZT1KdSxlKTokYyh0LGkpKTtpZihvPWUubWVtb2l6ZWRTdGF0ZSxvIT09bnVsbCYmKHM9by5kZWh5ZHJhdGVkLHMhPT1udWxsKSlyZXR1cm4gUWIoZSx0LGkscixzLG8sbik7aWYoYSl7YT1yLmZhbGxiYWNrLGk9dC5tb2RlLG89ZS5jaGlsZCxzPW8uc2libGluZzt2YXIgbD17bW9kZToiaGlkZGVuIixjaGlsZHJlbjpyLmNoaWxkcmVufTtyZXR1cm4hKGkmMSkmJnQuY2hpbGQhPT1vPyhyPXQuY2hpbGQsci5jaGlsZExhbmVzPTAsci5wZW5kaW5nUHJvcHM9bCx0LmRlbGV0aW9ucz1udWxsKToocj11cihvLGwpLHIuc3VidHJlZUZsYWdzPW8uc3VidHJlZUZsYWdzJjE0NjgwMDY0KSxzIT09bnVsbD9hPXVyKHMsYSk6KGE9UnIoYSxpLG4sbnVsbCksYS5mbGFnc3w9MiksYS5yZXR1cm49dCxyLnJldHVybj10LHIuc2libGluZz1hLHQuY2hpbGQ9cixyPWEsYT10LmNoaWxkLGk9ZS5jaGlsZC5tZW1vaXplZFN0YXRlLGk9aT09PW51bGw/WHUobik6e2Jhc2VMYW5lczppLmJhc2VMYW5lc3xuLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOmkudHJhbnNpdGlvbnN9LGEubWVtb2l6ZWRTdGF0ZT1pLGEuY2hpbGRMYW5lcz1lLmNoaWxkTGFuZXMmfm4sdC5tZW1vaXplZFN0YXRlPUp1LHJ9cmV0dXJuIGE9ZS5jaGlsZCxlPWEuc2libGluZyxyPXVyKGEse21vZGU6InZpc2libGUiLGNoaWxkcmVuOnIuY2hpbGRyZW59KSwhKHQubW9kZSYxKSYmKHIubGFuZXM9biksci5yZXR1cm49dCxyLnNpYmxpbmc9bnVsbCxlIT09bnVsbCYmKG49dC5kZWxldGlvbnMsbj09PW51bGw/KHQuZGVsZXRpb25zPVtlXSx0LmZsYWdzfD0xNik6bi5wdXNoKGUpKSx0LmNoaWxkPXIsdC5tZW1vaXplZFN0YXRlPW51bGwscn1mdW5jdGlvbiAkYyhlLHQpe3JldHVybiB0PUxzKHttb2RlOiJ2aXNpYmxlIixjaGlsZHJlbjp0fSxlLm1vZGUsMCxudWxsKSx0LnJldHVybj1lLGUuY2hpbGQ9dH1mdW5jdGlvbiBIaShlLHQsbixyKXtyZXR1cm4gciE9PW51bGwmJk5jKHIpLEFvKHQsZS5jaGlsZCxudWxsLG4pLGU9JGModCx0LnBlbmRpbmdQcm9wcy5jaGlsZHJlbiksZS5mbGFnc3w9Mix0Lm1lbW9pemVkU3RhdGU9bnVsbCxlfWZ1bmN0aW9uIFFiKGUsdCxuLHIsbyxhLGkpe2lmKG4pcmV0dXJuIHQuZmxhZ3MmMjU2Pyh0LmZsYWdzJj0tMjU3LHI9cHUoRXJyb3IoSSg0MjIpKSksSGkoZSx0LGkscikpOnQubWVtb2l6ZWRTdGF0ZSE9PW51bGw/KHQuY2hpbGQ9ZS5jaGlsZCx0LmZsYWdzfD0xMjgsbnVsbCk6KGE9ci5mYWxsYmFjayxvPXQubW9kZSxyPUxzKHttb2RlOiJ2aXNpYmxlIixjaGlsZHJlbjpyLmNoaWxkcmVufSxvLDAsbnVsbCksYT1ScihhLG8saSxudWxsKSxhLmZsYWdzfD0yLHIucmV0dXJuPXQsYS5yZXR1cm49dCxyLnNpYmxpbmc9YSx0LmNoaWxkPXIsdC5tb2RlJjEmJkFvKHQsZS5jaGlsZCxudWxsLGkpLHQuY2hpbGQubWVtb2l6ZWRTdGF0ZT1YdShpKSx0Lm1lbW9pemVkU3RhdGU9SnUsYSk7aWYoISh0Lm1vZGUmMSkpcmV0dXJuIEhpKGUsdCxpLG51bGwpO2lmKG8uZGF0YT09PSIkISIpe2lmKHI9by5uZXh0U2libGluZyYmby5uZXh0U2libGluZy5kYXRhc2V0LHIpdmFyIHM9ci5kZ3N0O3JldHVybiByPXMsYT1FcnJvcihJKDQxOSkpLHI9cHUoYSxyLHZvaWQgMCksSGkoZSx0LGkscil9aWYocz0oaSZlLmNoaWxkTGFuZXMpIT09MCx3dHx8cyl7aWYocj1KZSxyIT09bnVsbCl7c3dpdGNoKGkmLWkpe2Nhc2UgNDpvPTI7YnJlYWs7Y2FzZSAxNjpvPTg7YnJlYWs7Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpjYXNlIDY3MTA4ODY0Om89MzI7YnJlYWs7Y2FzZSA1MzY4NzA5MTI6bz0yNjg0MzU0NTY7YnJlYWs7ZGVmYXVsdDpvPTB9bz1vJihyLnN1c3BlbmRlZExhbmVzfGkpPzA6byxvIT09MCYmbyE9PWEucmV0cnlMYW5lJiYoYS5yZXRyeUxhbmU9byxSbihlLG8pLHRuKHIsZSxvLC0xKSl9cmV0dXJuIEdjKCkscj1wdShFcnJvcihJKDQyMSkpKSxIaShlLHQsaSxyKX1yZXR1cm4gby5kYXRhPT09IiQ/Ij8odC5mbGFnc3w9MTI4LHQuY2hpbGQ9ZS5jaGlsZCx0PXV4LmJpbmQobnVsbCxlKSxvLl9yZWFjdFJldHJ5PXQsbnVsbCk6KGU9YS50cmVlQ29udGV4dCxfdD1hcihvLm5leHRTaWJsaW5nKSxBdD10LENlPSEwLFp0PW51bGwsZSE9PW51bGwmJih6dFtGdCsrXT1fbix6dFtGdCsrXT1Bbix6dFtGdCsrXT1Qcixfbj1lLmlkLEFuPWUub3ZlcmZsb3csUHI9dCksdD0kYyh0LHIuY2hpbGRyZW4pLHQuZmxhZ3N8PTQwOTYsdCl9ZnVuY3Rpb24gUWYoZSx0LG4pe2UubGFuZXN8PXQ7dmFyIHI9ZS5hbHRlcm5hdGU7ciE9PW51bGwmJihyLmxhbmVzfD10KSxWdShlLnJldHVybix0LG4pfWZ1bmN0aW9uIGZ1KGUsdCxuLHIsbyl7dmFyIGE9ZS5tZW1vaXplZFN0YXRlO2E9PT1udWxsP2UubWVtb2l6ZWRTdGF0ZT17aXNCYWNrd2FyZHM6dCxyZW5kZXJpbmc6bnVsbCxyZW5kZXJpbmdTdGFydFRpbWU6MCxsYXN0OnIsdGFpbDpuLHRhaWxNb2RlOm99OihhLmlzQmFja3dhcmRzPXQsYS5yZW5kZXJpbmc9bnVsbCxhLnJlbmRlcmluZ1N0YXJ0VGltZT0wLGEubGFzdD1yLGEudGFpbD1uLGEudGFpbE1vZGU9byl9ZnVuY3Rpb24gRmgoZSx0LG4pe3ZhciByPXQucGVuZGluZ1Byb3BzLG89ci5yZXZlYWxPcmRlcixhPXIudGFpbDtpZihmdChlLHQsci5jaGlsZHJlbixuKSxyPVJlLmN1cnJlbnQsciYyKXI9ciYxfDIsdC5mbGFnc3w9MTI4O2Vsc2V7aWYoZSE9PW51bGwmJmUuZmxhZ3MmMTI4KWU6Zm9yKGU9dC5jaGlsZDtlIT09bnVsbDspe2lmKGUudGFnPT09MTMpZS5tZW1vaXplZFN0YXRlIT09bnVsbCYmUWYoZSxuLHQpO2Vsc2UgaWYoZS50YWc9PT0xOSlRZihlLG4sdCk7ZWxzZSBpZihlLmNoaWxkIT09bnVsbCl7ZS5jaGlsZC5yZXR1cm49ZSxlPWUuY2hpbGQ7Y29udGludWV9aWYoZT09PXQpYnJlYWsgZTtmb3IoO2Uuc2libGluZz09PW51bGw7KXtpZihlLnJldHVybj09PW51bGx8fGUucmV0dXJuPT09dClicmVhayBlO2U9ZS5yZXR1cm59ZS5zaWJsaW5nLnJldHVybj1lLnJldHVybixlPWUuc2libGluZ31yJj0xfWlmKFNlKFJlLHIpLCEodC5tb2RlJjEpKXQubWVtb2l6ZWRTdGF0ZT1udWxsO2Vsc2Ugc3dpdGNoKG8pe2Nhc2UiZm9yd2FyZHMiOmZvcihuPXQuY2hpbGQsbz1udWxsO24hPT1udWxsOyllPW4uYWx0ZXJuYXRlLGUhPT1udWxsJiZ2cyhlKT09PW51bGwmJihvPW4pLG49bi5zaWJsaW5nO249byxuPT09bnVsbD8obz10LmNoaWxkLHQuY2hpbGQ9bnVsbCk6KG89bi5zaWJsaW5nLG4uc2libGluZz1udWxsKSxmdSh0LCExLG8sbixhKTticmVhaztjYXNlImJhY2t3YXJkcyI6Zm9yKG49bnVsbCxvPXQuY2hpbGQsdC5jaGlsZD1udWxsO28hPT1udWxsOyl7aWYoZT1vLmFsdGVybmF0ZSxlIT09bnVsbCYmdnMoZSk9PT1udWxsKXt0LmNoaWxkPW87YnJlYWt9ZT1vLnNpYmxpbmcsby5zaWJsaW5nPW4sbj1vLG89ZX1mdSh0LCEwLG4sbnVsbCxhKTticmVhaztjYXNlInRvZ2V0aGVyIjpmdSh0LCExLG51bGwsbnVsbCx2b2lkIDApO2JyZWFrO2RlZmF1bHQ6dC5tZW1vaXplZFN0YXRlPW51bGx9cmV0dXJuIHQuY2hpbGR9ZnVuY3Rpb24gWGkoZSx0KXshKHQubW9kZSYxKSYmZSE9PW51bGwmJihlLmFsdGVybmF0ZT1udWxsLHQuYWx0ZXJuYXRlPW51bGwsdC5mbGFnc3w9Mil9ZnVuY3Rpb24gSW4oZSx0LG4pe2lmKGUhPT1udWxsJiYodC5kZXBlbmRlbmNpZXM9ZS5kZXBlbmRlbmNpZXMpLHpyfD10LmxhbmVzLCEobiZ0LmNoaWxkTGFuZXMpKXJldHVybiBudWxsO2lmKGUhPT1udWxsJiZ0LmNoaWxkIT09ZS5jaGlsZCl0aHJvdyBFcnJvcihJKDE1MykpO2lmKHQuY2hpbGQhPT1udWxsKXtmb3IoZT10LmNoaWxkLG49dXIoZSxlLnBlbmRpbmdQcm9wcyksdC5jaGlsZD1uLG4ucmV0dXJuPXQ7ZS5zaWJsaW5nIT09bnVsbDspZT1lLnNpYmxpbmcsbj1uLnNpYmxpbmc9dXIoZSxlLnBlbmRpbmdQcm9wcyksbi5yZXR1cm49dDtuLnNpYmxpbmc9bnVsbH1yZXR1cm4gdC5jaGlsZH1mdW5jdGlvbiBKYihlLHQsbil7c3dpdGNoKHQudGFnKXtjYXNlIDM6TGgodCksX28oKTticmVhaztjYXNlIDU6Y2godCk7YnJlYWs7Y2FzZSAxOnh0KHQudHlwZSkmJnBzKHQpO2JyZWFrO2Nhc2UgNDpNYyh0LHQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO2JyZWFrO2Nhc2UgMTA6dmFyIHI9dC50eXBlLl9jb250ZXh0LG89dC5tZW1vaXplZFByb3BzLnZhbHVlO1NlKGhzLHIuX2N1cnJlbnRWYWx1ZSksci5fY3VycmVudFZhbHVlPW87YnJlYWs7Y2FzZSAxMzppZihyPXQubWVtb2l6ZWRTdGF0ZSxyIT09bnVsbClyZXR1cm4gci5kZWh5ZHJhdGVkIT09bnVsbD8oU2UoUmUsUmUuY3VycmVudCYxKSx0LmZsYWdzfD0xMjgsbnVsbCk6biZ0LmNoaWxkLmNoaWxkTGFuZXM/emgoZSx0LG4pOihTZShSZSxSZS5jdXJyZW50JjEpLGU9SW4oZSx0LG4pLGUhPT1udWxsP2Uuc2libGluZzpudWxsKTtTZShSZSxSZS5jdXJyZW50JjEpO2JyZWFrO2Nhc2UgMTk6aWYocj0obiZ0LmNoaWxkTGFuZXMpIT09MCxlLmZsYWdzJjEyOCl7aWYocilyZXR1cm4gRmgoZSx0LG4pO3QuZmxhZ3N8PTEyOH1pZihvPXQubWVtb2l6ZWRTdGF0ZSxvIT09bnVsbCYmKG8ucmVuZGVyaW5nPW51bGwsby50YWlsPW51bGwsby5sYXN0RWZmZWN0PW51bGwpLFNlKFJlLFJlLmN1cnJlbnQpLHIpYnJlYWs7cmV0dXJuIG51bGw7Y2FzZSAyMjpjYXNlIDIzOnJldHVybiB0LmxhbmVzPTAsSWgoZSx0LG4pfXJldHVybiBJbihlLHQsbil9dmFyIFVoLFp1LCRoLEJoO1VoPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXQuY2hpbGQ7biE9PW51bGw7KXtpZihuLnRhZz09PTV8fG4udGFnPT09NillLmFwcGVuZENoaWxkKG4uc3RhdGVOb2RlKTtlbHNlIGlmKG4udGFnIT09NCYmbi5jaGlsZCE9PW51bGwpe24uY2hpbGQucmV0dXJuPW4sbj1uLmNoaWxkO2NvbnRpbnVlfWlmKG49PT10KWJyZWFrO2Zvcig7bi5zaWJsaW5nPT09bnVsbDspe2lmKG4ucmV0dXJuPT09bnVsbHx8bi5yZXR1cm49PT10KXJldHVybjtuPW4ucmV0dXJufW4uc2libGluZy5yZXR1cm49bi5yZXR1cm4sbj1uLnNpYmxpbmd9fTtadT1mdW5jdGlvbigpe307JGg9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89ZS5tZW1vaXplZFByb3BzO2lmKG8hPT1yKXtlPXQuc3RhdGVOb2RlLE9yKHduLmN1cnJlbnQpO3ZhciBhPW51bGw7c3dpdGNoKG4pe2Nhc2UiaW5wdXQiOm89eHUoZSxvKSxyPXh1KGUsciksYT1bXTticmVhaztjYXNlInNlbGVjdCI6bz1QZSh7fSxvLHt2YWx1ZTp2b2lkIDB9KSxyPVBlKHt9LHIse3ZhbHVlOnZvaWQgMH0pLGE9W107YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6bz1FdShlLG8pLHI9RXUoZSxyKSxhPVtdO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIG8ub25DbGljayE9ImZ1bmN0aW9uIiYmdHlwZW9mIHIub25DbGljaz09ImZ1bmN0aW9uIiYmKGUub25jbGljaz1jcyl9TnUobixyKTt2YXIgaTtuPW51bGw7Zm9yKHUgaW4gbylpZighci5oYXNPd25Qcm9wZXJ0eSh1KSYmby5oYXNPd25Qcm9wZXJ0eSh1KSYmb1t1XSE9bnVsbClpZih1PT09InN0eWxlIil7dmFyIHM9b1t1XTtmb3IoaSBpbiBzKXMuaGFzT3duUHJvcGVydHkoaSkmJihufHwobj17fSksbltpXT0iIil9ZWxzZSB1IT09ImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiYmdSE9PSJjaGlsZHJlbiImJnUhPT0ic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIiYmdSE9PSJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmciJiZ1IT09ImF1dG9Gb2N1cyImJih4YS5oYXNPd25Qcm9wZXJ0eSh1KT9hfHwoYT1bXSk6KGE9YXx8W10pLnB1c2godSxudWxsKSk7Zm9yKHUgaW4gcil7dmFyIGw9clt1XTtpZihzPW8/Llt1XSxyLmhhc093blByb3BlcnR5KHUpJiZsIT09cyYmKGwhPW51bGx8fHMhPW51bGwpKWlmKHU9PT0ic3R5bGUiKWlmKHMpe2ZvcihpIGluIHMpIXMuaGFzT3duUHJvcGVydHkoaSl8fGwmJmwuaGFzT3duUHJvcGVydHkoaSl8fChufHwobj17fSksbltpXT0iIik7Zm9yKGkgaW4gbClsLmhhc093blByb3BlcnR5KGkpJiZzW2ldIT09bFtpXSYmKG58fChuPXt9KSxuW2ldPWxbaV0pfWVsc2Ugbnx8KGF8fChhPVtdKSxhLnB1c2godSxuKSksbj1sO2Vsc2UgdT09PSJkYW5nZXJvdXNseVNldElubmVySFRNTCI/KGw9bD9sLl9faHRtbDp2b2lkIDAscz1zP3MuX19odG1sOnZvaWQgMCxsIT1udWxsJiZzIT09bCYmKGE9YXx8W10pLnB1c2godSxsKSk6dT09PSJjaGlsZHJlbiI/dHlwZW9mIGwhPSJzdHJpbmciJiZ0eXBlb2YgbCE9Im51bWJlciJ8fChhPWF8fFtdKS5wdXNoKHUsIiIrbCk6dSE9PSJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmciJiZ1IT09InN1cHByZXNzSHlkcmF0aW9uV2FybmluZyImJih4YS5oYXNPd25Qcm9wZXJ0eSh1KT8obCE9bnVsbCYmdT09PSJvblNjcm9sbCImJkRlKCJzY3JvbGwiLGUpLGF8fHM9PT1sfHwoYT1bXSkpOihhPWF8fFtdKS5wdXNoKHUsbCkpfW4mJihhPWF8fFtdKS5wdXNoKCJzdHlsZSIsbik7dmFyIHU9YTsodC51cGRhdGVRdWV1ZT11KSYmKHQuZmxhZ3N8PTQpfX07Qmg9ZnVuY3Rpb24oZSx0LG4scil7biE9PXImJih0LmZsYWdzfD00KX07ZnVuY3Rpb24gYWEoZSx0KXtpZighQ2Upc3dpdGNoKGUudGFpbE1vZGUpe2Nhc2UiaGlkZGVuIjp0PWUudGFpbDtmb3IodmFyIG49bnVsbDt0IT09bnVsbDspdC5hbHRlcm5hdGUhPT1udWxsJiYobj10KSx0PXQuc2libGluZztuPT09bnVsbD9lLnRhaWw9bnVsbDpuLnNpYmxpbmc9bnVsbDticmVhaztjYXNlImNvbGxhcHNlZCI6bj1lLnRhaWw7Zm9yKHZhciByPW51bGw7biE9PW51bGw7KW4uYWx0ZXJuYXRlIT09bnVsbCYmKHI9biksbj1uLnNpYmxpbmc7cj09PW51bGw/dHx8ZS50YWlsPT09bnVsbD9lLnRhaWw9bnVsbDplLnRhaWwuc2libGluZz1udWxsOnIuc2libGluZz1udWxsfX1mdW5jdGlvbiBsdChlKXt2YXIgdD1lLmFsdGVybmF0ZSE9PW51bGwmJmUuYWx0ZXJuYXRlLmNoaWxkPT09ZS5jaGlsZCxuPTAscj0wO2lmKHQpZm9yKHZhciBvPWUuY2hpbGQ7byE9PW51bGw7KW58PW8ubGFuZXN8by5jaGlsZExhbmVzLHJ8PW8uc3VidHJlZUZsYWdzJjE0NjgwMDY0LHJ8PW8uZmxhZ3MmMTQ2ODAwNjQsby5yZXR1cm49ZSxvPW8uc2libGluZztlbHNlIGZvcihvPWUuY2hpbGQ7byE9PW51bGw7KW58PW8ubGFuZXN8by5jaGlsZExhbmVzLHJ8PW8uc3VidHJlZUZsYWdzLHJ8PW8uZmxhZ3Msby5yZXR1cm49ZSxvPW8uc2libGluZztyZXR1cm4gZS5zdWJ0cmVlRmxhZ3N8PXIsZS5jaGlsZExhbmVzPW4sdH1mdW5jdGlvbiBYYihlLHQsbil7dmFyIHI9dC5wZW5kaW5nUHJvcHM7c3dpdGNoKFRjKHQpLHQudGFnKXtjYXNlIDI6Y2FzZSAxNjpjYXNlIDE1OmNhc2UgMDpjYXNlIDExOmNhc2UgNzpjYXNlIDg6Y2FzZSAxMjpjYXNlIDk6Y2FzZSAxNDpyZXR1cm4gbHQodCksbnVsbDtjYXNlIDE6cmV0dXJuIHh0KHQudHlwZSkmJmRzKCksbHQodCksbnVsbDtjYXNlIDM6cmV0dXJuIHI9dC5zdGF0ZU5vZGUsQ28oKSxfZShidCksX2UoY3QpLEljKCksci5wZW5kaW5nQ29udGV4dCYmKHIuY29udGV4dD1yLnBlbmRpbmdDb250ZXh0LHIucGVuZGluZ0NvbnRleHQ9bnVsbCksKGU9PT1udWxsfHxlLmNoaWxkPT09bnVsbCkmJihCaSh0KT90LmZsYWdzfD00OmU9PT1udWxsfHxlLm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkJiYhKHQuZmxhZ3MmMjU2KXx8KHQuZmxhZ3N8PTEwMjQsWnQhPT1udWxsJiYoc2MoWnQpLFp0PW51bGwpKSksWnUoZSx0KSxsdCh0KSxudWxsO2Nhc2UgNTpSYyh0KTt2YXIgbz1PcihSYS5jdXJyZW50KTtpZihuPXQudHlwZSxlIT09bnVsbCYmdC5zdGF0ZU5vZGUhPW51bGwpJGgoZSx0LG4scixvKSxlLnJlZiE9PXQucmVmJiYodC5mbGFnc3w9NTEyLHQuZmxhZ3N8PTIwOTcxNTIpO2Vsc2V7aWYoIXIpe2lmKHQuc3RhdGVOb2RlPT09bnVsbCl0aHJvdyBFcnJvcihJKDE2NikpO3JldHVybiBsdCh0KSxudWxsfWlmKGU9T3Iod24uY3VycmVudCksQmkodCkpe3I9dC5zdGF0ZU5vZGUsbj10LnR5cGU7dmFyIGE9dC5tZW1vaXplZFByb3BzO3N3aXRjaChyW3luXT10LHJbT2FdPWEsZT0odC5tb2RlJjEpIT09MCxuKXtjYXNlImRpYWxvZyI6RGUoImNhbmNlbCIsciksRGUoImNsb3NlIixyKTticmVhaztjYXNlImlmcmFtZSI6Y2FzZSJvYmplY3QiOmNhc2UiZW1iZWQiOkRlKCJsb2FkIixyKTticmVhaztjYXNlInZpZGVvIjpjYXNlImF1ZGlvIjpmb3Iobz0wO288ZGEubGVuZ3RoO28rKylEZShkYVtvXSxyKTticmVhaztjYXNlInNvdXJjZSI6RGUoImVycm9yIixyKTticmVhaztjYXNlImltZyI6Y2FzZSJpbWFnZSI6Y2FzZSJsaW5rIjpEZSgiZXJyb3IiLHIpLERlKCJsb2FkIixyKTticmVhaztjYXNlImRldGFpbHMiOkRlKCJ0b2dnbGUiLHIpO2JyZWFrO2Nhc2UiaW5wdXQiOnJmKHIsYSksRGUoImludmFsaWQiLHIpO2JyZWFrO2Nhc2Uic2VsZWN0IjpyLl93cmFwcGVyU3RhdGU9e3dhc011bHRpcGxlOiEhYS5tdWx0aXBsZX0sRGUoImludmFsaWQiLHIpO2JyZWFrO2Nhc2UidGV4dGFyZWEiOmFmKHIsYSksRGUoImludmFsaWQiLHIpfU51KG4sYSksbz1udWxsO2Zvcih2YXIgaSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoaSkpe3ZhciBzPWFbaV07aT09PSJjaGlsZHJlbiI/dHlwZW9mIHM9PSJzdHJpbmciP3IudGV4dENvbnRlbnQhPT1zJiYoYS5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmchPT0hMCYmJGkoci50ZXh0Q29udGVudCxzLGUpLG89WyJjaGlsZHJlbiIsc10pOnR5cGVvZiBzPT0ibnVtYmVyIiYmci50ZXh0Q29udGVudCE9PSIiK3MmJihhLnN1cHByZXNzSHlkcmF0aW9uV2FybmluZyE9PSEwJiYkaShyLnRleHRDb250ZW50LHMsZSksbz1bImNoaWxkcmVuIiwiIitzXSk6eGEuaGFzT3duUHJvcGVydHkoaSkmJnMhPW51bGwmJmk9PT0ib25TY3JvbGwiJiZEZSgic2Nyb2xsIixyKX1zd2l0Y2gobil7Y2FzZSJpbnB1dCI6X2kociksb2YocixhLCEwKTticmVhaztjYXNlInRleHRhcmVhIjpfaShyKSxzZihyKTticmVhaztjYXNlInNlbGVjdCI6Y2FzZSJvcHRpb24iOmJyZWFrO2RlZmF1bHQ6dHlwZW9mIGEub25DbGljaz09ImZ1bmN0aW9uIiYmKHIub25jbGljaz1jcyl9cj1vLHQudXBkYXRlUXVldWU9cixyIT09bnVsbCYmKHQuZmxhZ3N8PTQpfWVsc2V7aT1vLm5vZGVUeXBlPT09OT9vOm8ub3duZXJEb2N1bWVudCxlPT09Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiJiYoZT1obShuKSksZT09PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj9uPT09InNjcmlwdCI/KGU9aS5jcmVhdGVFbGVtZW50KCJkaXYiKSxlLmlubmVySFRNTD0iPHNjcmlwdD48XC9zY3JpcHQ+IixlPWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKSk6dHlwZW9mIHIuaXM9PSJzdHJpbmciP2U9aS5jcmVhdGVFbGVtZW50KG4se2lzOnIuaXN9KTooZT1pLmNyZWF0ZUVsZW1lbnQobiksbj09PSJzZWxlY3QiJiYoaT1lLHIubXVsdGlwbGU/aS5tdWx0aXBsZT0hMDpyLnNpemUmJihpLnNpemU9ci5zaXplKSkpOmU9aS5jcmVhdGVFbGVtZW50TlMoZSxuKSxlW3luXT10LGVbT2FdPXIsVWgoZSx0LCExLCExKSx0LnN0YXRlTm9kZT1lO2U6e3N3aXRjaChpPUR1KG4sciksbil7Y2FzZSJkaWFsb2ciOkRlKCJjYW5jZWwiLGUpLERlKCJjbG9zZSIsZSksbz1yO2JyZWFrO2Nhc2UiaWZyYW1lIjpjYXNlIm9iamVjdCI6Y2FzZSJlbWJlZCI6RGUoImxvYWQiLGUpLG89cjticmVhaztjYXNlInZpZGVvIjpjYXNlImF1ZGlvIjpmb3Iobz0wO288ZGEubGVuZ3RoO28rKylEZShkYVtvXSxlKTtvPXI7YnJlYWs7Y2FzZSJzb3VyY2UiOkRlKCJlcnJvciIsZSksbz1yO2JyZWFrO2Nhc2UiaW1nIjpjYXNlImltYWdlIjpjYXNlImxpbmsiOkRlKCJlcnJvciIsZSksRGUoImxvYWQiLGUpLG89cjticmVhaztjYXNlImRldGFpbHMiOkRlKCJ0b2dnbGUiLGUpLG89cjticmVhaztjYXNlImlucHV0IjpyZihlLHIpLG89eHUoZSxyKSxEZSgiaW52YWxpZCIsZSk7YnJlYWs7Y2FzZSJvcHRpb24iOm89cjticmVhaztjYXNlInNlbGVjdCI6ZS5fd3JhcHBlclN0YXRlPXt3YXNNdWx0aXBsZTohIXIubXVsdGlwbGV9LG89UGUoe30scix7dmFsdWU6dm9pZCAwfSksRGUoImludmFsaWQiLGUpO2JyZWFrO2Nhc2UidGV4dGFyZWEiOmFmKGUsciksbz1FdShlLHIpLERlKCJpbnZhbGlkIixlKTticmVhaztkZWZhdWx0Om89cn1OdShuLG8pLHM9bztmb3IoYSBpbiBzKWlmKHMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBsPXNbYV07YT09PSJzdHlsZSI/dm0oZSxsKTphPT09ImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIj8obD1sP2wuX19odG1sOnZvaWQgMCxsIT1udWxsJiZnbShlLGwpKTphPT09ImNoaWxkcmVuIj90eXBlb2YgbD09InN0cmluZyI/KG4hPT0idGV4dGFyZWEifHxsIT09IiIpJiZrYShlLGwpOnR5cGVvZiBsPT0ibnVtYmVyIiYma2EoZSwiIitsKTphIT09InN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyImJmEhPT0ic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIiYmYSE9PSJhdXRvRm9jdXMiJiYoeGEuaGFzT3duUHJvcGVydHkoYSk/bCE9bnVsbCYmYT09PSJvblNjcm9sbCImJkRlKCJzY3JvbGwiLGUpOmwhPW51bGwmJmNjKGUsYSxsLGkpKX1zd2l0Y2gobil7Y2FzZSJpbnB1dCI6X2koZSksb2YoZSxyLCExKTticmVhaztjYXNlInRleHRhcmVhIjpfaShlKSxzZihlKTticmVhaztjYXNlIm9wdGlvbiI6ci52YWx1ZSE9bnVsbCYmZS5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIitjcihyLnZhbHVlKSk7YnJlYWs7Y2FzZSJzZWxlY3QiOmUubXVsdGlwbGU9ISFyLm11bHRpcGxlLGE9ci52YWx1ZSxhIT1udWxsP2JvKGUsISFyLm11bHRpcGxlLGEsITEpOnIuZGVmYXVsdFZhbHVlIT1udWxsJiZibyhlLCEhci5tdWx0aXBsZSxyLmRlZmF1bHRWYWx1ZSwhMCk7YnJlYWs7ZGVmYXVsdDp0eXBlb2Ygby5vbkNsaWNrPT0iZnVuY3Rpb24iJiYoZS5vbmNsaWNrPWNzKX1zd2l0Y2gobil7Y2FzZSJidXR0b24iOmNhc2UiaW5wdXQiOmNhc2Uic2VsZWN0IjpjYXNlInRleHRhcmVhIjpyPSEhci5hdXRvRm9jdXM7YnJlYWsgZTtjYXNlImltZyI6cj0hMDticmVhayBlO2RlZmF1bHQ6cj0hMX19ciYmKHQuZmxhZ3N8PTQpfXQucmVmIT09bnVsbCYmKHQuZmxhZ3N8PTUxMix0LmZsYWdzfD0yMDk3MTUyKX1yZXR1cm4gbHQodCksbnVsbDtjYXNlIDY6aWYoZSYmdC5zdGF0ZU5vZGUhPW51bGwpQmgoZSx0LGUubWVtb2l6ZWRQcm9wcyxyKTtlbHNle2lmKHR5cGVvZiByIT0ic3RyaW5nIiYmdC5zdGF0ZU5vZGU9PT1udWxsKXRocm93IEVycm9yKEkoMTY2KSk7aWYobj1PcihSYS5jdXJyZW50KSxPcih3bi5jdXJyZW50KSxCaSh0KSl7aWYocj10LnN0YXRlTm9kZSxuPXQubWVtb2l6ZWRQcm9wcyxyW3luXT10LChhPXIubm9kZVZhbHVlIT09bikmJihlPUF0LGUhPT1udWxsKSlzd2l0Y2goZS50YWcpe2Nhc2UgMzokaShyLm5vZGVWYWx1ZSxuLChlLm1vZGUmMSkhPT0wKTticmVhaztjYXNlIDU6ZS5tZW1vaXplZFByb3BzLnN1cHByZXNzSHlkcmF0aW9uV2FybmluZyE9PSEwJiYkaShyLm5vZGVWYWx1ZSxuLChlLm1vZGUmMSkhPT0wKX1hJiYodC5mbGFnc3w9NCl9ZWxzZSByPShuLm5vZGVUeXBlPT09OT9uOm4ub3duZXJEb2N1bWVudCkuY3JlYXRlVGV4dE5vZGUociksclt5bl09dCx0LnN0YXRlTm9kZT1yfXJldHVybiBsdCh0KSxudWxsO2Nhc2UgMTM6aWYoX2UoUmUpLHI9dC5tZW1vaXplZFN0YXRlLGU9PT1udWxsfHxlLm1lbW9pemVkU3RhdGUhPT1udWxsJiZlLm1lbW9pemVkU3RhdGUuZGVoeWRyYXRlZCE9PW51bGwpe2lmKENlJiZfdCE9PW51bGwmJnQubW9kZSYxJiYhKHQuZmxhZ3MmMTI4KSlhaCgpLF9vKCksdC5mbGFnc3w9OTg1NjAsYT0hMTtlbHNlIGlmKGE9QmkodCksciE9PW51bGwmJnIuZGVoeWRyYXRlZCE9PW51bGwpe2lmKGU9PT1udWxsKXtpZighYSl0aHJvdyBFcnJvcihJKDMxOCkpO2lmKGE9dC5tZW1vaXplZFN0YXRlLGE9YSE9PW51bGw/YS5kZWh5ZHJhdGVkOm51bGwsIWEpdGhyb3cgRXJyb3IoSSgzMTcpKTthW3luXT10fWVsc2UgX28oKSwhKHQuZmxhZ3MmMTI4KSYmKHQubWVtb2l6ZWRTdGF0ZT1udWxsKSx0LmZsYWdzfD00O2x0KHQpLGE9ITF9ZWxzZSBadCE9PW51bGwmJihzYyhadCksWnQ9bnVsbCksYT0hMDtpZighYSlyZXR1cm4gdC5mbGFncyY2NTUzNj90Om51bGx9cmV0dXJuIHQuZmxhZ3MmMTI4Pyh0LmxhbmVzPW4sdCk6KHI9ciE9PW51bGwsciE9PShlIT09bnVsbCYmZS5tZW1vaXplZFN0YXRlIT09bnVsbCkmJnImJih0LmNoaWxkLmZsYWdzfD04MTkyLHQubW9kZSYxJiYoZT09PW51bGx8fFJlLmN1cnJlbnQmMT9LZT09PTAmJihLZT0zKTpHYygpKSksdC51cGRhdGVRdWV1ZSE9PW51bGwmJih0LmZsYWdzfD00KSxsdCh0KSxudWxsKTtjYXNlIDQ6cmV0dXJuIENvKCksWnUoZSx0KSxlPT09bnVsbCYmQWEodC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyksbHQodCksbnVsbDtjYXNlIDEwOnJldHVybiBBYyh0LnR5cGUuX2NvbnRleHQpLGx0KHQpLG51bGw7Y2FzZSAxNzpyZXR1cm4geHQodC50eXBlKSYmZHMoKSxsdCh0KSxudWxsO2Nhc2UgMTk6aWYoX2UoUmUpLGE9dC5tZW1vaXplZFN0YXRlLGE9PT1udWxsKXJldHVybiBsdCh0KSxudWxsO2lmKHI9KHQuZmxhZ3MmMTI4KSE9PTAsaT1hLnJlbmRlcmluZyxpPT09bnVsbClpZihyKWFhKGEsITEpO2Vsc2V7aWYoS2UhPT0wfHxlIT09bnVsbCYmZS5mbGFncyYxMjgpZm9yKGU9dC5jaGlsZDtlIT09bnVsbDspe2lmKGk9dnMoZSksaSE9PW51bGwpe2Zvcih0LmZsYWdzfD0xMjgsYWEoYSwhMSkscj1pLnVwZGF0ZVF1ZXVlLHIhPT1udWxsJiYodC51cGRhdGVRdWV1ZT1yLHQuZmxhZ3N8PTQpLHQuc3VidHJlZUZsYWdzPTAscj1uLG49dC5jaGlsZDtuIT09bnVsbDspYT1uLGU9cixhLmZsYWdzJj0xNDY4MDA2NixpPWEuYWx0ZXJuYXRlLGk9PT1udWxsPyhhLmNoaWxkTGFuZXM9MCxhLmxhbmVzPWUsYS5jaGlsZD1udWxsLGEuc3VidHJlZUZsYWdzPTAsYS5tZW1vaXplZFByb3BzPW51bGwsYS5tZW1vaXplZFN0YXRlPW51bGwsYS51cGRhdGVRdWV1ZT1udWxsLGEuZGVwZW5kZW5jaWVzPW51bGwsYS5zdGF0ZU5vZGU9bnVsbCk6KGEuY2hpbGRMYW5lcz1pLmNoaWxkTGFuZXMsYS5sYW5lcz1pLmxhbmVzLGEuY2hpbGQ9aS5jaGlsZCxhLnN1YnRyZWVGbGFncz0wLGEuZGVsZXRpb25zPW51bGwsYS5tZW1vaXplZFByb3BzPWkubWVtb2l6ZWRQcm9wcyxhLm1lbW9pemVkU3RhdGU9aS5tZW1vaXplZFN0YXRlLGEudXBkYXRlUXVldWU9aS51cGRhdGVRdWV1ZSxhLnR5cGU9aS50eXBlLGU9aS5kZXBlbmRlbmNpZXMsYS5kZXBlbmRlbmNpZXM9ZT09PW51bGw/bnVsbDp7bGFuZXM6ZS5sYW5lcyxmaXJzdENvbnRleHQ6ZS5maXJzdENvbnRleHR9KSxuPW4uc2libGluZztyZXR1cm4gU2UoUmUsUmUuY3VycmVudCYxfDIpLHQuY2hpbGR9ZT1lLnNpYmxpbmd9YS50YWlsIT09bnVsbCYmRmUoKT5NbyYmKHQuZmxhZ3N8PTEyOCxyPSEwLGFhKGEsITEpLHQubGFuZXM9NDE5NDMwNCl9ZWxzZXtpZighcilpZihlPXZzKGkpLGUhPT1udWxsKXtpZih0LmZsYWdzfD0xMjgscj0hMCxuPWUudXBkYXRlUXVldWUsbiE9PW51bGwmJih0LnVwZGF0ZVF1ZXVlPW4sdC5mbGFnc3w9NCksYWEoYSwhMCksYS50YWlsPT09bnVsbCYmYS50YWlsTW9kZT09PSJoaWRkZW4iJiYhaS5hbHRlcm5hdGUmJiFDZSlyZXR1cm4gbHQodCksbnVsbH1lbHNlIDIqRmUoKS1hLnJlbmRlcmluZ1N0YXJ0VGltZT5NbyYmbiE9PTEwNzM3NDE4MjQmJih0LmZsYWdzfD0xMjgscj0hMCxhYShhLCExKSx0LmxhbmVzPTQxOTQzMDQpO2EuaXNCYWNrd2FyZHM/KGkuc2libGluZz10LmNoaWxkLHQuY2hpbGQ9aSk6KG49YS5sYXN0LG4hPT1udWxsP24uc2libGluZz1pOnQuY2hpbGQ9aSxhLmxhc3Q9aSl9cmV0dXJuIGEudGFpbCE9PW51bGw/KHQ9YS50YWlsLGEucmVuZGVyaW5nPXQsYS50YWlsPXQuc2libGluZyxhLnJlbmRlcmluZ1N0YXJ0VGltZT1GZSgpLHQuc2libGluZz1udWxsLG49UmUuY3VycmVudCxTZShSZSxyP24mMXwyOm4mMSksdCk6KGx0KHQpLG51bGwpO2Nhc2UgMjI6Y2FzZSAyMzpyZXR1cm4gVmMoKSxyPXQubWVtb2l6ZWRTdGF0ZSE9PW51bGwsZSE9PW51bGwmJmUubWVtb2l6ZWRTdGF0ZSE9PW51bGwhPT1yJiYodC5mbGFnc3w9ODE5MiksciYmdC5tb2RlJjE/RHQmMTA3Mzc0MTgyNCYmKGx0KHQpLHQuc3VidHJlZUZsYWdzJjYmJih0LmZsYWdzfD04MTkyKSk6bHQodCksbnVsbDtjYXNlIDI0OnJldHVybiBudWxsO2Nhc2UgMjU6cmV0dXJuIG51bGx9dGhyb3cgRXJyb3IoSSgxNTYsdC50YWcpKX1mdW5jdGlvbiBaYihlLHQpe3N3aXRjaChUYyh0KSx0LnRhZyl7Y2FzZSAxOnJldHVybiB4dCh0LnR5cGUpJiZkcygpLGU9dC5mbGFncyxlJjY1NTM2Pyh0LmZsYWdzPWUmLTY1NTM3fDEyOCx0KTpudWxsO2Nhc2UgMzpyZXR1cm4gQ28oKSxfZShidCksX2UoY3QpLEljKCksZT10LmZsYWdzLGUmNjU1MzYmJiEoZSYxMjgpPyh0LmZsYWdzPWUmLTY1NTM3fDEyOCx0KTpudWxsO2Nhc2UgNTpyZXR1cm4gUmModCksbnVsbDtjYXNlIDEzOmlmKF9lKFJlKSxlPXQubWVtb2l6ZWRTdGF0ZSxlIT09bnVsbCYmZS5kZWh5ZHJhdGVkIT09bnVsbCl7aWYodC5hbHRlcm5hdGU9PT1udWxsKXRocm93IEVycm9yKEkoMzQwKSk7X28oKX1yZXR1cm4gZT10LmZsYWdzLGUmNjU1MzY/KHQuZmxhZ3M9ZSYtNjU1Mzd8MTI4LHQpOm51bGw7Y2FzZSAxOTpyZXR1cm4gX2UoUmUpLG51bGw7Y2FzZSA0OnJldHVybiBDbygpLG51bGw7Y2FzZSAxMDpyZXR1cm4gQWModC50eXBlLl9jb250ZXh0KSxudWxsO2Nhc2UgMjI6Y2FzZSAyMzpyZXR1cm4gVmMoKSxudWxsO2Nhc2UgMjQ6cmV0dXJuIG51bGw7ZGVmYXVsdDpyZXR1cm4gbnVsbH19dmFyIGppPSExLHV0PSExLGV4PXR5cGVvZiBXZWFrU2V0PT0iZnVuY3Rpb24iP1dlYWtTZXQ6U2V0LGo9bnVsbDtmdW5jdGlvbiB2byhlLHQpe3ZhciBuPWUucmVmO2lmKG4hPT1udWxsKWlmKHR5cGVvZiBuPT0iZnVuY3Rpb24iKXRyeXtuKG51bGwpfWNhdGNoKHIpe0xlKGUsdCxyKX1lbHNlIG4uY3VycmVudD1udWxsfWZ1bmN0aW9uIGVjKGUsdCxuKXt0cnl7bigpfWNhdGNoKHIpe0xlKGUsdCxyKX19dmFyIEpmPSExO2Z1bmN0aW9uIHR4KGUsdCl7aWYoenU9c3MsZT1HbSgpLFNjKGUpKXtpZigic2VsZWN0aW9uU3RhcnQiaW4gZSl2YXIgbj17c3RhcnQ6ZS5zZWxlY3Rpb25TdGFydCxlbmQ6ZS5zZWxlY3Rpb25FbmR9O2Vsc2UgZTp7bj0obj1lLm93bmVyRG9jdW1lbnQpJiZuLmRlZmF1bHRWaWV3fHx3aW5kb3c7dmFyIHI9bi5nZXRTZWxlY3Rpb24mJm4uZ2V0U2VsZWN0aW9uKCk7aWYociYmci5yYW5nZUNvdW50IT09MCl7bj1yLmFuY2hvck5vZGU7dmFyIG89ci5hbmNob3JPZmZzZXQsYT1yLmZvY3VzTm9kZTtyPXIuZm9jdXNPZmZzZXQ7dHJ5e24ubm9kZVR5cGUsYS5ub2RlVHlwZX1jYXRjaHtuPW51bGw7YnJlYWsgZX12YXIgaT0wLHM9LTEsbD0tMSx1PTAsYz0wLGQ9ZSxwPW51bGw7dDpmb3IoOzspe2Zvcih2YXIgeTtkIT09bnx8byE9PTAmJmQubm9kZVR5cGUhPT0zfHwocz1pK28pLGQhPT1hfHxyIT09MCYmZC5ub2RlVHlwZSE9PTN8fChsPWkrciksZC5ub2RlVHlwZT09PTMmJihpKz1kLm5vZGVWYWx1ZS5sZW5ndGgpLCh5PWQuZmlyc3RDaGlsZCkhPT1udWxsOylwPWQsZD15O2Zvcig7Oyl7aWYoZD09PWUpYnJlYWsgdDtpZihwPT09biYmKyt1PT09byYmKHM9aSkscD09PWEmJisrYz09PXImJihsPWkpLCh5PWQubmV4dFNpYmxpbmcpIT09bnVsbClicmVhaztkPXAscD1kLnBhcmVudE5vZGV9ZD15fW49cz09PS0xfHxsPT09LTE/bnVsbDp7c3RhcnQ6cyxlbmQ6bH19ZWxzZSBuPW51bGx9bj1ufHx7c3RhcnQ6MCxlbmQ6MH19ZWxzZSBuPW51bGw7Zm9yKEZ1PXtmb2N1c2VkRWxlbTplLHNlbGVjdGlvblJhbmdlOm59LHNzPSExLGo9dDtqIT09bnVsbDspaWYodD1qLGU9dC5jaGlsZCwodC5zdWJ0cmVlRmxhZ3MmMTAyOCkhPT0wJiZlIT09bnVsbCllLnJldHVybj10LGo9ZTtlbHNlIGZvcig7aiE9PW51bGw7KXt0PWo7dHJ5e3ZhciBoPXQuYWx0ZXJuYXRlO2lmKHQuZmxhZ3MmMTAyNClzd2l0Y2godC50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6YnJlYWs7Y2FzZSAxOmlmKGghPT1udWxsKXt2YXIgdz1oLm1lbW9pemVkUHJvcHMsYj1oLm1lbW9pemVkU3RhdGUsZz10LnN0YXRlTm9kZSxtPWcuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUodC5lbGVtZW50VHlwZT09PXQudHlwZT93Okp0KHQudHlwZSx3KSxiKTtnLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlPW19YnJlYWs7Y2FzZSAzOnZhciB2PXQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87di5ub2RlVHlwZT09PTE/di50ZXh0Q29udGVudD0iIjp2Lm5vZGVUeXBlPT09OSYmdi5kb2N1bWVudEVsZW1lbnQmJnYucmVtb3ZlQ2hpbGQodi5kb2N1bWVudEVsZW1lbnQpO2JyZWFrO2Nhc2UgNTpjYXNlIDY6Y2FzZSA0OmNhc2UgMTc6YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihJKDE2MykpfX1jYXRjaChmKXtMZSh0LHQucmV0dXJuLGYpfWlmKGU9dC5zaWJsaW5nLGUhPT1udWxsKXtlLnJldHVybj10LnJldHVybixqPWU7YnJlYWt9aj10LnJldHVybn1yZXR1cm4gaD1KZixKZj0hMSxofWZ1bmN0aW9uIHZhKGUsdCxuKXt2YXIgcj10LnVwZGF0ZVF1ZXVlO2lmKHI9ciE9PW51bGw/ci5sYXN0RWZmZWN0Om51bGwsciE9PW51bGwpe3ZhciBvPXI9ci5uZXh0O2Rve2lmKChvLnRhZyZlKT09PWUpe3ZhciBhPW8uZGVzdHJveTtvLmRlc3Ryb3k9dm9pZCAwLGEhPT12b2lkIDAmJmVjKHQsbixhKX1vPW8ubmV4dH13aGlsZShvIT09cil9fWZ1bmN0aW9uIElzKGUsdCl7aWYodD10LnVwZGF0ZVF1ZXVlLHQ9dCE9PW51bGw/dC5sYXN0RWZmZWN0Om51bGwsdCE9PW51bGwpe3ZhciBuPXQ9dC5uZXh0O2Rve2lmKChuLnRhZyZlKT09PWUpe3ZhciByPW4uY3JlYXRlO24uZGVzdHJveT1yKCl9bj1uLm5leHR9d2hpbGUobiE9PXQpfX1mdW5jdGlvbiB0YyhlKXt2YXIgdD1lLnJlZjtpZih0IT09bnVsbCl7dmFyIG49ZS5zdGF0ZU5vZGU7c3dpdGNoKGUudGFnKXtjYXNlIDU6ZT1uO2JyZWFrO2RlZmF1bHQ6ZT1ufXR5cGVvZiB0PT0iZnVuY3Rpb24iP3QoZSk6dC5jdXJyZW50PWV9fWZ1bmN0aW9uIFdoKGUpe3ZhciB0PWUuYWx0ZXJuYXRlO3QhPT1udWxsJiYoZS5hbHRlcm5hdGU9bnVsbCxXaCh0KSksZS5jaGlsZD1udWxsLGUuZGVsZXRpb25zPW51bGwsZS5zaWJsaW5nPW51bGwsZS50YWc9PT01JiYodD1lLnN0YXRlTm9kZSx0IT09bnVsbCYmKGRlbGV0ZSB0W3luXSxkZWxldGUgdFtPYV0sZGVsZXRlIHRbQnVdLGRlbGV0ZSB0W3piXSxkZWxldGUgdFtGYl0pKSxlLnN0YXRlTm9kZT1udWxsLGUucmV0dXJuPW51bGwsZS5kZXBlbmRlbmNpZXM9bnVsbCxlLm1lbW9pemVkUHJvcHM9bnVsbCxlLm1lbW9pemVkU3RhdGU9bnVsbCxlLnBlbmRpbmdQcm9wcz1udWxsLGUuc3RhdGVOb2RlPW51bGwsZS51cGRhdGVRdWV1ZT1udWxsfWZ1bmN0aW9uIEhoKGUpe3JldHVybiBlLnRhZz09PTV8fGUudGFnPT09M3x8ZS50YWc9PT00fWZ1bmN0aW9uIFhmKGUpe2U6Zm9yKDs7KXtmb3IoO2Uuc2libGluZz09PW51bGw7KXtpZihlLnJldHVybj09PW51bGx8fEhoKGUucmV0dXJuKSlyZXR1cm4gbnVsbDtlPWUucmV0dXJufWZvcihlLnNpYmxpbmcucmV0dXJuPWUucmV0dXJuLGU9ZS5zaWJsaW5nO2UudGFnIT09NSYmZS50YWchPT02JiZlLnRhZyE9PTE4Oyl7aWYoZS5mbGFncyYyfHxlLmNoaWxkPT09bnVsbHx8ZS50YWc9PT00KWNvbnRpbnVlIGU7ZS5jaGlsZC5yZXR1cm49ZSxlPWUuY2hpbGR9aWYoIShlLmZsYWdzJjIpKXJldHVybiBlLnN0YXRlTm9kZX19ZnVuY3Rpb24gbmMoZSx0LG4pe3ZhciByPWUudGFnO2lmKHI9PT01fHxyPT09NillPWUuc3RhdGVOb2RlLHQ/bi5ub2RlVHlwZT09PTg/bi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLHQpOm4uaW5zZXJ0QmVmb3JlKGUsdCk6KG4ubm9kZVR5cGU9PT04Pyh0PW4ucGFyZW50Tm9kZSx0Lmluc2VydEJlZm9yZShlLG4pKToodD1uLHQuYXBwZW5kQ2hpbGQoZSkpLG49bi5fcmVhY3RSb290Q29udGFpbmVyLG4hPW51bGx8fHQub25jbGljayE9PW51bGx8fCh0Lm9uY2xpY2s9Y3MpKTtlbHNlIGlmKHIhPT00JiYoZT1lLmNoaWxkLGUhPT1udWxsKSlmb3IobmMoZSx0LG4pLGU9ZS5zaWJsaW5nO2UhPT1udWxsOyluYyhlLHQsbiksZT1lLnNpYmxpbmd9ZnVuY3Rpb24gcmMoZSx0LG4pe3ZhciByPWUudGFnO2lmKHI9PT01fHxyPT09NillPWUuc3RhdGVOb2RlLHQ/bi5pbnNlcnRCZWZvcmUoZSx0KTpuLmFwcGVuZENoaWxkKGUpO2Vsc2UgaWYociE9PTQmJihlPWUuY2hpbGQsZSE9PW51bGwpKWZvcihyYyhlLHQsbiksZT1lLnNpYmxpbmc7ZSE9PW51bGw7KXJjKGUsdCxuKSxlPWUuc2libGluZ312YXIgdHQ9bnVsbCxYdD0hMTtmdW5jdGlvbiBxbihlLHQsbil7Zm9yKG49bi5jaGlsZDtuIT09bnVsbDspamgoZSx0LG4pLG49bi5zaWJsaW5nfWZ1bmN0aW9uIGpoKGUsdCxuKXtpZih2biYmdHlwZW9mIHZuLm9uQ29tbWl0RmliZXJVbm1vdW50PT0iZnVuY3Rpb24iKXRyeXt2bi5vbkNvbW1pdEZpYmVyVW5tb3VudChOcyxuKX1jYXRjaHt9c3dpdGNoKG4udGFnKXtjYXNlIDU6dXR8fHZvKG4sdCk7Y2FzZSA2OnZhciByPXR0LG89WHQ7dHQ9bnVsbCxxbihlLHQsbiksdHQ9cixYdD1vLHR0IT09bnVsbCYmKFh0PyhlPXR0LG49bi5zdGF0ZU5vZGUsZS5ub2RlVHlwZT09PTg/ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG4pOmUucmVtb3ZlQ2hpbGQobikpOnR0LnJlbW92ZUNoaWxkKG4uc3RhdGVOb2RlKSk7YnJlYWs7Y2FzZSAxODp0dCE9PW51bGwmJihYdD8oZT10dCxuPW4uc3RhdGVOb2RlLGUubm9kZVR5cGU9PT04P2l1KGUucGFyZW50Tm9kZSxuKTplLm5vZGVUeXBlPT09MSYmaXUoZSxuKSxOYShlKSk6aXUodHQsbi5zdGF0ZU5vZGUpKTticmVhaztjYXNlIDQ6cj10dCxvPVh0LHR0PW4uc3RhdGVOb2RlLmNvbnRhaW5lckluZm8sWHQ9ITAscW4oZSx0LG4pLHR0PXIsWHQ9bzticmVhaztjYXNlIDA6Y2FzZSAxMTpjYXNlIDE0OmNhc2UgMTU6aWYoIXV0JiYocj1uLnVwZGF0ZVF1ZXVlLHIhPT1udWxsJiYocj1yLmxhc3RFZmZlY3QsciE9PW51bGwpKSl7bz1yPXIubmV4dDtkb3t2YXIgYT1vLGk9YS5kZXN0cm95O2E9YS50YWcsaSE9PXZvaWQgMCYmKGEmMnx8YSY0KSYmZWMobix0LGkpLG89by5uZXh0fXdoaWxlKG8hPT1yKX1xbihlLHQsbik7YnJlYWs7Y2FzZSAxOmlmKCF1dCYmKHZvKG4sdCkscj1uLnN0YXRlTm9kZSx0eXBlb2Ygci5jb21wb25lbnRXaWxsVW5tb3VudD09ImZ1bmN0aW9uIikpdHJ5e3IucHJvcHM9bi5tZW1vaXplZFByb3BzLHIuc3RhdGU9bi5tZW1vaXplZFN0YXRlLHIuY29tcG9uZW50V2lsbFVubW91bnQoKX1jYXRjaChzKXtMZShuLHQscyl9cW4oZSx0LG4pO2JyZWFrO2Nhc2UgMjE6cW4oZSx0LG4pO2JyZWFrO2Nhc2UgMjI6bi5tb2RlJjE/KHV0PShyPXV0KXx8bi5tZW1vaXplZFN0YXRlIT09bnVsbCxxbihlLHQsbiksdXQ9cik6cW4oZSx0LG4pO2JyZWFrO2RlZmF1bHQ6cW4oZSx0LG4pfX1mdW5jdGlvbiBaZihlKXt2YXIgdD1lLnVwZGF0ZVF1ZXVlO2lmKHQhPT1udWxsKXtlLnVwZGF0ZVF1ZXVlPW51bGw7dmFyIG49ZS5zdGF0ZU5vZGU7bj09PW51bGwmJihuPWUuc3RhdGVOb2RlPW5ldyBleCksdC5mb3JFYWNoKGZ1bmN0aW9uKHIpe3ZhciBvPWN4LmJpbmQobnVsbCxlLHIpO24uaGFzKHIpfHwobi5hZGQociksci50aGVuKG8sbykpfSl9fWZ1bmN0aW9uIFF0KGUsdCl7dmFyIG49dC5kZWxldGlvbnM7aWYobiE9PW51bGwpZm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBvPW5bcl07dHJ5e3ZhciBhPWUsaT10LHM9aTtlOmZvcig7cyE9PW51bGw7KXtzd2l0Y2gocy50YWcpe2Nhc2UgNTp0dD1zLnN0YXRlTm9kZSxYdD0hMTticmVhayBlO2Nhc2UgMzp0dD1zLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLFh0PSEwO2JyZWFrIGU7Y2FzZSA0OnR0PXMuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8sWHQ9ITA7YnJlYWsgZX1zPXMucmV0dXJufWlmKHR0PT09bnVsbCl0aHJvdyBFcnJvcihJKDE2MCkpO2poKGEsaSxvKSx0dD1udWxsLFh0PSExO3ZhciBsPW8uYWx0ZXJuYXRlO2whPT1udWxsJiYobC5yZXR1cm49bnVsbCksby5yZXR1cm49bnVsbH1jYXRjaCh1KXtMZShvLHQsdSl9fWlmKHQuc3VidHJlZUZsYWdzJjEyODU0KWZvcih0PXQuY2hpbGQ7dCE9PW51bGw7KVZoKHQsZSksdD10LnNpYmxpbmd9ZnVuY3Rpb24gVmgoZSx0KXt2YXIgbj1lLmFsdGVybmF0ZSxyPWUuZmxhZ3M7c3dpdGNoKGUudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE0OmNhc2UgMTU6aWYoUXQodCxlKSxobihlKSxyJjQpe3RyeXt2YSgzLGUsZS5yZXR1cm4pLElzKDMsZSl9Y2F0Y2godyl7TGUoZSxlLnJldHVybix3KX10cnl7dmEoNSxlLGUucmV0dXJuKX1jYXRjaCh3KXtMZShlLGUucmV0dXJuLHcpfX1icmVhaztjYXNlIDE6UXQodCxlKSxobihlKSxyJjUxMiYmbiE9PW51bGwmJnZvKG4sbi5yZXR1cm4pO2JyZWFrO2Nhc2UgNTppZihRdCh0LGUpLGhuKGUpLHImNTEyJiZuIT09bnVsbCYmdm8obixuLnJldHVybiksZS5mbGFncyYzMil7dmFyIG89ZS5zdGF0ZU5vZGU7dHJ5e2thKG8sIiIpfWNhdGNoKHcpe0xlKGUsZS5yZXR1cm4sdyl9fWlmKHImNCYmKG89ZS5zdGF0ZU5vZGUsbyE9bnVsbCkpe3ZhciBhPWUubWVtb2l6ZWRQcm9wcyxpPW4hPT1udWxsP24ubWVtb2l6ZWRQcm9wczphLHM9ZS50eXBlLGw9ZS51cGRhdGVRdWV1ZTtpZihlLnVwZGF0ZVF1ZXVlPW51bGwsbCE9PW51bGwpdHJ5e3M9PT0iaW5wdXQiJiZhLnR5cGU9PT0icmFkaW8iJiZhLm5hbWUhPW51bGwmJmZtKG8sYSksRHUocyxpKTt2YXIgdT1EdShzLGEpO2ZvcihpPTA7aTxsLmxlbmd0aDtpKz0yKXt2YXIgYz1sW2ldLGQ9bFtpKzFdO2M9PT0ic3R5bGUiP3ZtKG8sZCk6Yz09PSJkYW5nZXJvdXNseVNldElubmVySFRNTCI/Z20obyxkKTpjPT09ImNoaWxkcmVuIj9rYShvLGQpOmNjKG8sYyxkLHUpfXN3aXRjaChzKXtjYXNlImlucHV0IjprdShvLGEpO2JyZWFrO2Nhc2UidGV4dGFyZWEiOm1tKG8sYSk7YnJlYWs7Y2FzZSJzZWxlY3QiOnZhciBwPW8uX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZTtvLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU9ISFhLm11bHRpcGxlO3ZhciB5PWEudmFsdWU7eSE9bnVsbD9ibyhvLCEhYS5tdWx0aXBsZSx5LCExKTpwIT09ISFhLm11bHRpcGxlJiYoYS5kZWZhdWx0VmFsdWUhPW51bGw/Ym8obywhIWEubXVsdGlwbGUsYS5kZWZhdWx0VmFsdWUsITApOmJvKG8sISFhLm11bHRpcGxlLGEubXVsdGlwbGU/W106IiIsITEpKX1vW09hXT1hfWNhdGNoKHcpe0xlKGUsZS5yZXR1cm4sdyl9fWJyZWFrO2Nhc2UgNjppZihRdCh0LGUpLGhuKGUpLHImNCl7aWYoZS5zdGF0ZU5vZGU9PT1udWxsKXRocm93IEVycm9yKEkoMTYyKSk7bz1lLnN0YXRlTm9kZSxhPWUubWVtb2l6ZWRQcm9wczt0cnl7by5ub2RlVmFsdWU9YX1jYXRjaCh3KXtMZShlLGUucmV0dXJuLHcpfX1icmVhaztjYXNlIDM6aWYoUXQodCxlKSxobihlKSxyJjQmJm4hPT1udWxsJiZuLm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXRyeXtOYSh0LmNvbnRhaW5lckluZm8pfWNhdGNoKHcpe0xlKGUsZS5yZXR1cm4sdyl9YnJlYWs7Y2FzZSA0OlF0KHQsZSksaG4oZSk7YnJlYWs7Y2FzZSAxMzpRdCh0LGUpLGhuKGUpLG89ZS5jaGlsZCxvLmZsYWdzJjgxOTImJihhPW8ubWVtb2l6ZWRTdGF0ZSE9PW51bGwsby5zdGF0ZU5vZGUuaXNIaWRkZW49YSwhYXx8by5hbHRlcm5hdGUhPT1udWxsJiZvLmFsdGVybmF0ZS5tZW1vaXplZFN0YXRlIT09bnVsbHx8KEhjPUZlKCkpKSxyJjQmJlpmKGUpO2JyZWFrO2Nhc2UgMjI6aWYoYz1uIT09bnVsbCYmbi5tZW1vaXplZFN0YXRlIT09bnVsbCxlLm1vZGUmMT8odXQ9KHU9dXQpfHxjLFF0KHQsZSksdXQ9dSk6UXQodCxlKSxobihlKSxyJjgxOTIpe2lmKHU9ZS5tZW1vaXplZFN0YXRlIT09bnVsbCwoZS5zdGF0ZU5vZGUuaXNIaWRkZW49dSkmJiFjJiZlLm1vZGUmMSlmb3Ioaj1lLGM9ZS5jaGlsZDtjIT09bnVsbDspe2ZvcihkPWo9YztqIT09bnVsbDspe3N3aXRjaChwPWoseT1wLmNoaWxkLHAudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE0OmNhc2UgMTU6dmEoNCxwLHAucmV0dXJuKTticmVhaztjYXNlIDE6dm8ocCxwLnJldHVybik7dmFyIGg9cC5zdGF0ZU5vZGU7aWYodHlwZW9mIGguY29tcG9uZW50V2lsbFVubW91bnQ9PSJmdW5jdGlvbiIpe3I9cCxuPXAucmV0dXJuO3RyeXt0PXIsaC5wcm9wcz10Lm1lbW9pemVkUHJvcHMsaC5zdGF0ZT10Lm1lbW9pemVkU3RhdGUsaC5jb21wb25lbnRXaWxsVW5tb3VudCgpfWNhdGNoKHcpe0xlKHIsbix3KX19YnJlYWs7Y2FzZSA1OnZvKHAscC5yZXR1cm4pO2JyZWFrO2Nhc2UgMjI6aWYocC5tZW1vaXplZFN0YXRlIT09bnVsbCl7dG0oZCk7Y29udGludWV9fXkhPT1udWxsPyh5LnJldHVybj1wLGo9eSk6dG0oZCl9Yz1jLnNpYmxpbmd9ZTpmb3IoYz1udWxsLGQ9ZTs7KXtpZihkLnRhZz09PTUpe2lmKGM9PT1udWxsKXtjPWQ7dHJ5e289ZC5zdGF0ZU5vZGUsdT8oYT1vLnN0eWxlLHR5cGVvZiBhLnNldFByb3BlcnR5PT0iZnVuY3Rpb24iP2Euc2V0UHJvcGVydHkoImRpc3BsYXkiLCJub25lIiwiaW1wb3J0YW50Iik6YS5kaXNwbGF5PSJub25lIik6KHM9ZC5zdGF0ZU5vZGUsbD1kLm1lbW9pemVkUHJvcHMuc3R5bGUsaT1sIT1udWxsJiZsLmhhc093blByb3BlcnR5KCJkaXNwbGF5Iik/bC5kaXNwbGF5Om51bGwscy5zdHlsZS5kaXNwbGF5PXltKCJkaXNwbGF5IixpKSl9Y2F0Y2godyl7TGUoZSxlLnJldHVybix3KX19fWVsc2UgaWYoZC50YWc9PT02KXtpZihjPT09bnVsbCl0cnl7ZC5zdGF0ZU5vZGUubm9kZVZhbHVlPXU/IiI6ZC5tZW1vaXplZFByb3BzfWNhdGNoKHcpe0xlKGUsZS5yZXR1cm4sdyl9fWVsc2UgaWYoKGQudGFnIT09MjImJmQudGFnIT09MjN8fGQubWVtb2l6ZWRTdGF0ZT09PW51bGx8fGQ9PT1lKSYmZC5jaGlsZCE9PW51bGwpe2QuY2hpbGQucmV0dXJuPWQsZD1kLmNoaWxkO2NvbnRpbnVlfWlmKGQ9PT1lKWJyZWFrIGU7Zm9yKDtkLnNpYmxpbmc9PT1udWxsOyl7aWYoZC5yZXR1cm49PT1udWxsfHxkLnJldHVybj09PWUpYnJlYWsgZTtjPT09ZCYmKGM9bnVsbCksZD1kLnJldHVybn1jPT09ZCYmKGM9bnVsbCksZC5zaWJsaW5nLnJldHVybj1kLnJldHVybixkPWQuc2libGluZ319YnJlYWs7Y2FzZSAxOTpRdCh0LGUpLGhuKGUpLHImNCYmWmYoZSk7YnJlYWs7Y2FzZSAyMTpicmVhaztkZWZhdWx0OlF0KHQsZSksaG4oZSl9fWZ1bmN0aW9uIGhuKGUpe3ZhciB0PWUuZmxhZ3M7aWYodCYyKXt0cnl7ZTp7Zm9yKHZhciBuPWUucmV0dXJuO24hPT1udWxsOyl7aWYoSGgobikpe3ZhciByPW47YnJlYWsgZX1uPW4ucmV0dXJufXRocm93IEVycm9yKEkoMTYwKSl9c3dpdGNoKHIudGFnKXtjYXNlIDU6dmFyIG89ci5zdGF0ZU5vZGU7ci5mbGFncyYzMiYmKGthKG8sIiIpLHIuZmxhZ3MmPS0zMyk7dmFyIGE9WGYoZSk7cmMoZSxhLG8pO2JyZWFrO2Nhc2UgMzpjYXNlIDQ6dmFyIGk9ci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxzPVhmKGUpO25jKGUscyxpKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKEkoMTYxKSl9fWNhdGNoKGwpe0xlKGUsZS5yZXR1cm4sbCl9ZS5mbGFncyY9LTN9dCY0MDk2JiYoZS5mbGFncyY9LTQwOTcpfWZ1bmN0aW9uIG54KGUsdCxuKXtqPWUsR2goZSx0LG4pfWZ1bmN0aW9uIEdoKGUsdCxuKXtmb3IodmFyIHI9KGUubW9kZSYxKSE9PTA7aiE9PW51bGw7KXt2YXIgbz1qLGE9by5jaGlsZDtpZihvLnRhZz09PTIyJiZyKXt2YXIgaT1vLm1lbW9pemVkU3RhdGUhPT1udWxsfHxqaTtpZighaSl7dmFyIHM9by5hbHRlcm5hdGUsbD1zIT09bnVsbCYmcy5tZW1vaXplZFN0YXRlIT09bnVsbHx8dXQ7cz1qaTt2YXIgdT11dDtpZihqaT1pLCh1dD1sKSYmIXUpZm9yKGo9bztqIT09bnVsbDspaT1qLGw9aS5jaGlsZCxpLnRhZz09PTIyJiZpLm1lbW9pemVkU3RhdGUhPT1udWxsP25tKG8pOmwhPT1udWxsPyhsLnJldHVybj1pLGo9bCk6bm0obyk7Zm9yKDthIT09bnVsbDspaj1hLEdoKGEsdCxuKSxhPWEuc2libGluZztqPW8samk9cyx1dD11fWVtKGUsdCxuKX1lbHNlIG8uc3VidHJlZUZsYWdzJjg3NzImJmEhPT1udWxsPyhhLnJldHVybj1vLGo9YSk6ZW0oZSx0LG4pfX1mdW5jdGlvbiBlbShlKXtmb3IoO2ohPT1udWxsOyl7dmFyIHQ9ajtpZih0LmZsYWdzJjg3NzIpe3ZhciBuPXQuYWx0ZXJuYXRlO3RyeXtpZih0LmZsYWdzJjg3NzIpc3dpdGNoKHQudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OnV0fHxJcyg1LHQpO2JyZWFrO2Nhc2UgMTp2YXIgcj10LnN0YXRlTm9kZTtpZih0LmZsYWdzJjQmJiF1dClpZihuPT09bnVsbClyLmNvbXBvbmVudERpZE1vdW50KCk7ZWxzZXt2YXIgbz10LmVsZW1lbnRUeXBlPT09dC50eXBlP24ubWVtb2l6ZWRQcm9wczpKdCh0LnR5cGUsbi5tZW1vaXplZFByb3BzKTtyLmNvbXBvbmVudERpZFVwZGF0ZShvLG4ubWVtb2l6ZWRTdGF0ZSxyLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKX12YXIgYT10LnVwZGF0ZVF1ZXVlO2EhPT1udWxsJiZGZih0LGEscik7YnJlYWs7Y2FzZSAzOnZhciBpPXQudXBkYXRlUXVldWU7aWYoaSE9PW51bGwpe2lmKG49bnVsbCx0LmNoaWxkIT09bnVsbClzd2l0Y2godC5jaGlsZC50YWcpe2Nhc2UgNTpuPXQuY2hpbGQuc3RhdGVOb2RlO2JyZWFrO2Nhc2UgMTpuPXQuY2hpbGQuc3RhdGVOb2RlfUZmKHQsaSxuKX1icmVhaztjYXNlIDU6dmFyIHM9dC5zdGF0ZU5vZGU7aWYobj09PW51bGwmJnQuZmxhZ3MmNCl7bj1zO3ZhciBsPXQubWVtb2l6ZWRQcm9wcztzd2l0Y2godC50eXBlKXtjYXNlImJ1dHRvbiI6Y2FzZSJpbnB1dCI6Y2FzZSJzZWxlY3QiOmNhc2UidGV4dGFyZWEiOmwuYXV0b0ZvY3VzJiZuLmZvY3VzKCk7YnJlYWs7Y2FzZSJpbWciOmwuc3JjJiYobi5zcmM9bC5zcmMpfX1icmVhaztjYXNlIDY6YnJlYWs7Y2FzZSA0OmJyZWFrO2Nhc2UgMTI6YnJlYWs7Y2FzZSAxMzppZih0Lm1lbW9pemVkU3RhdGU9PT1udWxsKXt2YXIgdT10LmFsdGVybmF0ZTtpZih1IT09bnVsbCl7dmFyIGM9dS5tZW1vaXplZFN0YXRlO2lmKGMhPT1udWxsKXt2YXIgZD1jLmRlaHlkcmF0ZWQ7ZCE9PW51bGwmJk5hKGQpfX19YnJlYWs7Y2FzZSAxOTpjYXNlIDE3OmNhc2UgMjE6Y2FzZSAyMjpjYXNlIDIzOmNhc2UgMjU6YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihJKDE2MykpfXV0fHx0LmZsYWdzJjUxMiYmdGModCl9Y2F0Y2gocCl7TGUodCx0LnJldHVybixwKX19aWYodD09PWUpe2o9bnVsbDticmVha31pZihuPXQuc2libGluZyxuIT09bnVsbCl7bi5yZXR1cm49dC5yZXR1cm4saj1uO2JyZWFrfWo9dC5yZXR1cm59fWZ1bmN0aW9uIHRtKGUpe2Zvcig7aiE9PW51bGw7KXt2YXIgdD1qO2lmKHQ9PT1lKXtqPW51bGw7YnJlYWt9dmFyIG49dC5zaWJsaW5nO2lmKG4hPT1udWxsKXtuLnJldHVybj10LnJldHVybixqPW47YnJlYWt9aj10LnJldHVybn19ZnVuY3Rpb24gbm0oZSl7Zm9yKDtqIT09bnVsbDspe3ZhciB0PWo7dHJ5e3N3aXRjaCh0LnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTp2YXIgbj10LnJldHVybjt0cnl7SXMoNCx0KX1jYXRjaChsKXtMZSh0LG4sbCl9YnJlYWs7Y2FzZSAxOnZhciByPXQuc3RhdGVOb2RlO2lmKHR5cGVvZiByLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iKXt2YXIgbz10LnJldHVybjt0cnl7ci5jb21wb25lbnREaWRNb3VudCgpfWNhdGNoKGwpe0xlKHQsbyxsKX19dmFyIGE9dC5yZXR1cm47dHJ5e3RjKHQpfWNhdGNoKGwpe0xlKHQsYSxsKX1icmVhaztjYXNlIDU6dmFyIGk9dC5yZXR1cm47dHJ5e3RjKHQpfWNhdGNoKGwpe0xlKHQsaSxsKX19fWNhdGNoKGwpe0xlKHQsdC5yZXR1cm4sbCl9aWYodD09PWUpe2o9bnVsbDticmVha312YXIgcz10LnNpYmxpbmc7aWYocyE9PW51bGwpe3MucmV0dXJuPXQucmV0dXJuLGo9czticmVha31qPXQucmV0dXJufX12YXIgcng9TWF0aC5jZWlsLHhzPVBuLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsQmM9UG4uUmVhY3RDdXJyZW50T3duZXIsJHQ9UG4uUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsdWU9MCxKZT1udWxsLEhlPW51bGwsbnQ9MCxEdD0wLHdvPWZyKDApLEtlPTAsemE9bnVsbCx6cj0wLFBzPTAsV2M9MCx3YT1udWxsLHZ0PW51bGwsSGM9MCxNbz0xLzAsTm49bnVsbCxrcz0hMSxvYz1udWxsLHNyPW51bGwsVmk9ITEsdHI9bnVsbCxTcz0wLGJhPTAsYWM9bnVsbCxaaT0tMSxlcz0wO2Z1bmN0aW9uIG10KCl7cmV0dXJuIHVlJjY/RmUoKTpaaSE9PS0xP1ppOlppPUZlKCl9ZnVuY3Rpb24gbHIoZSl7cmV0dXJuIGUubW9kZSYxP3VlJjImJm50IT09MD9udCYtbnQ6JGIudHJhbnNpdGlvbiE9PW51bGw/KGVzPT09MCYmKGVzPUNtKCkpLGVzKTooZT12ZSxlIT09MHx8KGU9d2luZG93LmV2ZW50LGU9ZT09PXZvaWQgMD8xNjp6bShlLnR5cGUpKSxlKToxfWZ1bmN0aW9uIHRuKGUsdCxuLHIpe2lmKDUwPGJhKXRocm93IGJhPTAsYWM9bnVsbCxFcnJvcihJKDE4NSkpO0ZhKGUsbixyKSwoISh1ZSYyKXx8ZSE9PUplKSYmKGU9PT1KZSYmKCEodWUmMikmJihQc3w9biksS2U9PT00JiZabihlLG50KSksa3QoZSxyKSxuPT09MSYmdWU9PT0wJiYhKHQubW9kZSYxKSYmKE1vPUZlKCkrNTAwLE9zJiZtcigpKSl9ZnVuY3Rpb24ga3QoZSx0KXt2YXIgbj1lLmNhbGxiYWNrTm9kZTtXdyhlLHQpO3ZhciByPWlzKGUsZT09PUplP250OjApO2lmKHI9PT0wKW4hPT1udWxsJiZjZihuKSxlLmNhbGxiYWNrTm9kZT1udWxsLGUuY2FsbGJhY2tQcmlvcml0eT0wO2Vsc2UgaWYodD1yJi1yLGUuY2FsbGJhY2tQcmlvcml0eSE9PXQpe2lmKG4hPW51bGwmJmNmKG4pLHQ9PT0xKWUudGFnPT09MD9VYihybS5iaW5kKG51bGwsZSkpOm5oKHJtLmJpbmQobnVsbCxlKSksUGIoZnVuY3Rpb24oKXshKHVlJjYpJiZtcigpfSksbj1udWxsO2Vsc2V7c3dpdGNoKE9tKHIpKXtjYXNlIDE6bj1oYzticmVhaztjYXNlIDQ6bj1fbTticmVhaztjYXNlIDE2Om49YXM7YnJlYWs7Y2FzZSA1MzY4NzA5MTI6bj1BbTticmVhaztkZWZhdWx0Om49YXN9bj1lZyhuLEtoLmJpbmQobnVsbCxlKSl9ZS5jYWxsYmFja1ByaW9yaXR5PXQsZS5jYWxsYmFja05vZGU9bn19ZnVuY3Rpb24gS2goZSx0KXtpZihaaT0tMSxlcz0wLHVlJjYpdGhyb3cgRXJyb3IoSSgzMjcpKTt2YXIgbj1lLmNhbGxiYWNrTm9kZTtpZihUbygpJiZlLmNhbGxiYWNrTm9kZSE9PW4pcmV0dXJuIG51bGw7dmFyIHI9aXMoZSxlPT09SmU/bnQ6MCk7aWYocj09PTApcmV0dXJuIG51bGw7aWYociYzMHx8ciZlLmV4cGlyZWRMYW5lc3x8dCl0PUVzKGUscik7ZWxzZXt0PXI7dmFyIG89dWU7dWV8PTI7dmFyIGE9cWgoKTsoSmUhPT1lfHxudCE9PXQpJiYoTm49bnVsbCxNbz1GZSgpKzUwMCxNcihlLHQpKTtkbyB0cnl7aXgoKTticmVha31jYXRjaChzKXtZaChlLHMpfXdoaWxlKCEwKTtfYygpLHhzLmN1cnJlbnQ9YSx1ZT1vLEhlIT09bnVsbD90PTA6KEplPW51bGwsbnQ9MCx0PUtlKX1pZih0IT09MCl7aWYodD09PTImJihvPU11KGUpLG8hPT0wJiYocj1vLHQ9aWMoZSxvKSkpLHQ9PT0xKXRocm93IG49emEsTXIoZSwwKSxabihlLHIpLGt0KGUsRmUoKSksbjtpZih0PT09NilabihlLHIpO2Vsc2V7aWYobz1lLmN1cnJlbnQuYWx0ZXJuYXRlLCEociYzMCkmJiFveChvKSYmKHQ9RXMoZSxyKSx0PT09MiYmKGE9TXUoZSksYSE9PTAmJihyPWEsdD1pYyhlLGEpKSksdD09PTEpKXRocm93IG49emEsTXIoZSwwKSxabihlLHIpLGt0KGUsRmUoKSksbjtzd2l0Y2goZS5maW5pc2hlZFdvcms9byxlLmZpbmlzaGVkTGFuZXM9cix0KXtjYXNlIDA6Y2FzZSAxOnRocm93IEVycm9yKEkoMzQ1KSk7Y2FzZSAyOl9yKGUsdnQsTm4pO2JyZWFrO2Nhc2UgMzppZihabihlLHIpLChyJjEzMDAyMzQyNCk9PT1yJiYodD1IYys1MDAtRmUoKSwxMDx0KSl7aWYoaXMoZSwwKSE9PTApYnJlYWs7aWYobz1lLnN1c3BlbmRlZExhbmVzLChvJnIpIT09cil7bXQoKSxlLnBpbmdlZExhbmVzfD1lLnN1c3BlbmRlZExhbmVzJm87YnJlYWt9ZS50aW1lb3V0SGFuZGxlPSR1KF9yLmJpbmQobnVsbCxlLHZ0LE5uKSx0KTticmVha31fcihlLHZ0LE5uKTticmVhaztjYXNlIDQ6aWYoWm4oZSxyKSwociY0MTk0MjQwKT09PXIpYnJlYWs7Zm9yKHQ9ZS5ldmVudFRpbWVzLG89LTE7MDxyOyl7dmFyIGk9MzEtZW4ocik7YT0xPDxpLGk9dFtpXSxpPm8mJihvPWkpLHImPX5hfWlmKHI9byxyPUZlKCktcixyPSgxMjA+cj8xMjA6NDgwPnI/NDgwOjEwODA+cj8xMDgwOjE5MjA+cj8xOTIwOjNlMz5yPzNlMzo0MzIwPnI/NDMyMDoxOTYwKnJ4KHIvMTk2MCkpLXIsMTA8cil7ZS50aW1lb3V0SGFuZGxlPSR1KF9yLmJpbmQobnVsbCxlLHZ0LE5uKSxyKTticmVha31fcihlLHZ0LE5uKTticmVhaztjYXNlIDU6X3IoZSx2dCxObik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihJKDMyOSkpfX19cmV0dXJuIGt0KGUsRmUoKSksZS5jYWxsYmFja05vZGU9PT1uP0toLmJpbmQobnVsbCxlKTpudWxsfWZ1bmN0aW9uIGljKGUsdCl7dmFyIG49d2E7cmV0dXJuIGUuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCYmKE1yKGUsdCkuZmxhZ3N8PTI1NiksZT1FcyhlLHQpLGUhPT0yJiYodD12dCx2dD1uLHQhPT1udWxsJiZzYyh0KSksZX1mdW5jdGlvbiBzYyhlKXt2dD09PW51bGw/dnQ9ZTp2dC5wdXNoLmFwcGx5KHZ0LGUpfWZ1bmN0aW9uIG94KGUpe2Zvcih2YXIgdD1lOzspe2lmKHQuZmxhZ3MmMTYzODQpe3ZhciBuPXQudXBkYXRlUXVldWU7aWYobiE9PW51bGwmJihuPW4uc3RvcmVzLG4hPT1udWxsKSlmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIG89bltyXSxhPW8uZ2V0U25hcHNob3Q7bz1vLnZhbHVlO3RyeXtpZighbm4oYSgpLG8pKXJldHVybiExfWNhdGNoe3JldHVybiExfX19aWYobj10LmNoaWxkLHQuc3VidHJlZUZsYWdzJjE2Mzg0JiZuIT09bnVsbCluLnJldHVybj10LHQ9bjtlbHNle2lmKHQ9PT1lKWJyZWFrO2Zvcig7dC5zaWJsaW5nPT09bnVsbDspe2lmKHQucmV0dXJuPT09bnVsbHx8dC5yZXR1cm49PT1lKXJldHVybiEwO3Q9dC5yZXR1cm59dC5zaWJsaW5nLnJldHVybj10LnJldHVybix0PXQuc2libGluZ319cmV0dXJuITB9ZnVuY3Rpb24gWm4oZSx0KXtmb3IodCY9fldjLHQmPX5QcyxlLnN1c3BlbmRlZExhbmVzfD10LGUucGluZ2VkTGFuZXMmPX50LGU9ZS5leHBpcmF0aW9uVGltZXM7MDx0Oyl7dmFyIG49MzEtZW4odCkscj0xPDxuO2Vbbl09LTEsdCY9fnJ9fWZ1bmN0aW9uIHJtKGUpe2lmKHVlJjYpdGhyb3cgRXJyb3IoSSgzMjcpKTtUbygpO3ZhciB0PWlzKGUsMCk7aWYoISh0JjEpKXJldHVybiBrdChlLEZlKCkpLG51bGw7dmFyIG49RXMoZSx0KTtpZihlLnRhZyE9PTAmJm49PT0yKXt2YXIgcj1NdShlKTtyIT09MCYmKHQ9cixuPWljKGUscikpfWlmKG49PT0xKXRocm93IG49emEsTXIoZSwwKSxabihlLHQpLGt0KGUsRmUoKSksbjtpZihuPT09Nil0aHJvdyBFcnJvcihJKDM0NSkpO3JldHVybiBlLmZpbmlzaGVkV29yaz1lLmN1cnJlbnQuYWx0ZXJuYXRlLGUuZmluaXNoZWRMYW5lcz10LF9yKGUsdnQsTm4pLGt0KGUsRmUoKSksbnVsbH1mdW5jdGlvbiBqYyhlLHQpe3ZhciBuPXVlO3VlfD0xO3RyeXtyZXR1cm4gZSh0KX1maW5hbGx5e3VlPW4sdWU9PT0wJiYoTW89RmUoKSs1MDAsT3MmJm1yKCkpfX1mdW5jdGlvbiBGcihlKXt0ciE9PW51bGwmJnRyLnRhZz09PTAmJiEodWUmNikmJlRvKCk7dmFyIHQ9dWU7dWV8PTE7dmFyIG49JHQudHJhbnNpdGlvbixyPXZlO3RyeXtpZigkdC50cmFuc2l0aW9uPW51bGwsdmU9MSxlKXJldHVybiBlKCl9ZmluYWxseXt2ZT1yLCR0LnRyYW5zaXRpb249bix1ZT10LCEodWUmNikmJm1yKCl9fWZ1bmN0aW9uIFZjKCl7RHQ9d28uY3VycmVudCxfZSh3byl9ZnVuY3Rpb24gTXIoZSx0KXtlLmZpbmlzaGVkV29yaz1udWxsLGUuZmluaXNoZWRMYW5lcz0wO3ZhciBuPWUudGltZW91dEhhbmRsZTtpZihuIT09LTEmJihlLnRpbWVvdXRIYW5kbGU9LTEsSWIobikpLEhlIT09bnVsbClmb3Iobj1IZS5yZXR1cm47biE9PW51bGw7KXt2YXIgcj1uO3N3aXRjaChUYyhyKSxyLnRhZyl7Y2FzZSAxOnI9ci50eXBlLmNoaWxkQ29udGV4dFR5cGVzLHIhPW51bGwmJmRzKCk7YnJlYWs7Y2FzZSAzOkNvKCksX2UoYnQpLF9lKGN0KSxJYygpO2JyZWFrO2Nhc2UgNTpSYyhyKTticmVhaztjYXNlIDQ6Q28oKTticmVhaztjYXNlIDEzOl9lKFJlKTticmVhaztjYXNlIDE5Ol9lKFJlKTticmVhaztjYXNlIDEwOkFjKHIudHlwZS5fY29udGV4dCk7YnJlYWs7Y2FzZSAyMjpjYXNlIDIzOlZjKCl9bj1uLnJldHVybn1pZihKZT1lLEhlPWU9dXIoZS5jdXJyZW50LG51bGwpLG50PUR0PXQsS2U9MCx6YT1udWxsLFdjPVBzPXpyPTAsdnQ9d2E9bnVsbCxDciE9PW51bGwpe2Zvcih0PTA7dDxDci5sZW5ndGg7dCsrKWlmKG49Q3JbdF0scj1uLmludGVybGVhdmVkLHIhPT1udWxsKXtuLmludGVybGVhdmVkPW51bGw7dmFyIG89ci5uZXh0LGE9bi5wZW5kaW5nO2lmKGEhPT1udWxsKXt2YXIgaT1hLm5leHQ7YS5uZXh0PW8sci5uZXh0PWl9bi5wZW5kaW5nPXJ9Q3I9bnVsbH1yZXR1cm4gZX1mdW5jdGlvbiBZaChlLHQpe2Rve3ZhciBuPUhlO3RyeXtpZihfYygpLFFpLmN1cnJlbnQ9YnMsd3Mpe2Zvcih2YXIgcj1JZS5tZW1vaXplZFN0YXRlO3IhPT1udWxsOyl7dmFyIG89ci5xdWV1ZTtvIT09bnVsbCYmKG8ucGVuZGluZz1udWxsKSxyPXIubmV4dH13cz0hMX1pZihMcj0wLFFlPUdlPUllPW51bGwseWE9ITEsSWE9MCxCYy5jdXJyZW50PW51bGwsbj09PW51bGx8fG4ucmV0dXJuPT09bnVsbCl7S2U9MSx6YT10LEhlPW51bGw7YnJlYWt9ZTp7dmFyIGE9ZSxpPW4ucmV0dXJuLHM9bixsPXQ7aWYodD1udCxzLmZsYWdzfD0zMjc2OCxsIT09bnVsbCYmdHlwZW9mIGw9PSJvYmplY3QiJiZ0eXBlb2YgbC50aGVuPT0iZnVuY3Rpb24iKXt2YXIgdT1sLGM9cyxkPWMudGFnO2lmKCEoYy5tb2RlJjEpJiYoZD09PTB8fGQ9PT0xMXx8ZD09PTE1KSl7dmFyIHA9Yy5hbHRlcm5hdGU7cD8oYy51cGRhdGVRdWV1ZT1wLnVwZGF0ZVF1ZXVlLGMubWVtb2l6ZWRTdGF0ZT1wLm1lbW9pemVkU3RhdGUsYy5sYW5lcz1wLmxhbmVzKTooYy51cGRhdGVRdWV1ZT1udWxsLGMubWVtb2l6ZWRTdGF0ZT1udWxsKX12YXIgeT1qZihpKTtpZih5IT09bnVsbCl7eS5mbGFncyY9LTI1NyxWZih5LGkscyxhLHQpLHkubW9kZSYxJiZIZihhLHUsdCksdD15LGw9dTt2YXIgaD10LnVwZGF0ZVF1ZXVlO2lmKGg9PT1udWxsKXt2YXIgdz1uZXcgU2V0O3cuYWRkKGwpLHQudXBkYXRlUXVldWU9d31lbHNlIGguYWRkKGwpO2JyZWFrIGV9ZWxzZXtpZighKHQmMSkpe0hmKGEsdSx0KSxHYygpO2JyZWFrIGV9bD1FcnJvcihJKDQyNikpfX1lbHNlIGlmKENlJiZzLm1vZGUmMSl7dmFyIGI9amYoaSk7aWYoYiE9PW51bGwpeyEoYi5mbGFncyY2NTUzNikmJihiLmZsYWdzfD0yNTYpLFZmKGIsaSxzLGEsdCksTmMoT28obCxzKSk7YnJlYWsgZX19YT1sPU9vKGwscyksS2UhPT00JiYoS2U9Miksd2E9PT1udWxsP3dhPVthXTp3YS5wdXNoKGEpLGE9aTtkb3tzd2l0Y2goYS50YWcpe2Nhc2UgMzphLmZsYWdzfD02NTUzNix0Jj0tdCxhLmxhbmVzfD10O3ZhciBnPU9oKGEsbCx0KTt6ZihhLGcpO2JyZWFrIGU7Y2FzZSAxOnM9bDt2YXIgbT1hLnR5cGUsdj1hLnN0YXRlTm9kZTtpZighKGEuZmxhZ3MmMTI4KSYmKHR5cGVvZiBtLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcj09ImZ1bmN0aW9uInx8diE9PW51bGwmJnR5cGVvZiB2LmNvbXBvbmVudERpZENhdGNoPT0iZnVuY3Rpb24iJiYoc3I9PT1udWxsfHwhc3IuaGFzKHYpKSkpe2EuZmxhZ3N8PTY1NTM2LHQmPS10LGEubGFuZXN8PXQ7dmFyIGY9TWgoYSxzLHQpO3pmKGEsZik7YnJlYWsgZX19YT1hLnJldHVybn13aGlsZShhIT09bnVsbCl9Smgobil9Y2F0Y2goRSl7dD1FLEhlPT09biYmbiE9PW51bGwmJihIZT1uPW4ucmV0dXJuKTtjb250aW51ZX1icmVha313aGlsZSghMCl9ZnVuY3Rpb24gcWgoKXt2YXIgZT14cy5jdXJyZW50O3JldHVybiB4cy5jdXJyZW50PWJzLGU9PT1udWxsP2JzOmV9ZnVuY3Rpb24gR2MoKXsoS2U9PT0wfHxLZT09PTN8fEtlPT09MikmJihLZT00KSxKZT09PW51bGx8fCEoenImMjY4NDM1NDU1KSYmIShQcyYyNjg0MzU0NTUpfHxabihKZSxudCl9ZnVuY3Rpb24gRXMoZSx0KXt2YXIgbj11ZTt1ZXw9Mjt2YXIgcj1xaCgpOyhKZSE9PWV8fG50IT09dCkmJihObj1udWxsLE1yKGUsdCkpO2RvIHRyeXtheCgpO2JyZWFrfWNhdGNoKG8pe1loKGUsbyl9d2hpbGUoITApO2lmKF9jKCksdWU9bix4cy5jdXJyZW50PXIsSGUhPT1udWxsKXRocm93IEVycm9yKEkoMjYxKSk7cmV0dXJuIEplPW51bGwsbnQ9MCxLZX1mdW5jdGlvbiBheCgpe2Zvcig7SGUhPT1udWxsOylRaChIZSl9ZnVuY3Rpb24gaXgoKXtmb3IoO0hlIT09bnVsbCYmIVJ3KCk7KVFoKEhlKX1mdW5jdGlvbiBRaChlKXt2YXIgdD1aaChlLmFsdGVybmF0ZSxlLER0KTtlLm1lbW9pemVkUHJvcHM9ZS5wZW5kaW5nUHJvcHMsdD09PW51bGw/SmgoZSk6SGU9dCxCYy5jdXJyZW50PW51bGx9ZnVuY3Rpb24gSmgoZSl7dmFyIHQ9ZTtkb3t2YXIgbj10LmFsdGVybmF0ZTtpZihlPXQucmV0dXJuLHQuZmxhZ3MmMzI3Njgpe2lmKG49WmIobix0KSxuIT09bnVsbCl7bi5mbGFncyY9MzI3NjcsSGU9bjtyZXR1cm59aWYoZSE9PW51bGwpZS5mbGFnc3w9MzI3NjgsZS5zdWJ0cmVlRmxhZ3M9MCxlLmRlbGV0aW9ucz1udWxsO2Vsc2V7S2U9NixIZT1udWxsO3JldHVybn19ZWxzZSBpZihuPVhiKG4sdCxEdCksbiE9PW51bGwpe0hlPW47cmV0dXJufWlmKHQ9dC5zaWJsaW5nLHQhPT1udWxsKXtIZT10O3JldHVybn1IZT10PWV9d2hpbGUodCE9PW51bGwpO0tlPT09MCYmKEtlPTUpfWZ1bmN0aW9uIF9yKGUsdCxuKXt2YXIgcj12ZSxvPSR0LnRyYW5zaXRpb247dHJ5eyR0LnRyYW5zaXRpb249bnVsbCx2ZT0xLHN4KGUsdCxuLHIpfWZpbmFsbHl7JHQudHJhbnNpdGlvbj1vLHZlPXJ9cmV0dXJuIG51bGx9ZnVuY3Rpb24gc3goZSx0LG4scil7ZG8gVG8oKTt3aGlsZSh0ciE9PW51bGwpO2lmKHVlJjYpdGhyb3cgRXJyb3IoSSgzMjcpKTtuPWUuZmluaXNoZWRXb3JrO3ZhciBvPWUuZmluaXNoZWRMYW5lcztpZihuPT09bnVsbClyZXR1cm4gbnVsbDtpZihlLmZpbmlzaGVkV29yaz1udWxsLGUuZmluaXNoZWRMYW5lcz0wLG49PT1lLmN1cnJlbnQpdGhyb3cgRXJyb3IoSSgxNzcpKTtlLmNhbGxiYWNrTm9kZT1udWxsLGUuY2FsbGJhY2tQcmlvcml0eT0wO3ZhciBhPW4ubGFuZXN8bi5jaGlsZExhbmVzO2lmKEh3KGUsYSksZT09PUplJiYoSGU9SmU9bnVsbCxudD0wKSwhKG4uc3VidHJlZUZsYWdzJjIwNjQpJiYhKG4uZmxhZ3MmMjA2NCl8fFZpfHwoVmk9ITAsZWcoYXMsZnVuY3Rpb24oKXtyZXR1cm4gVG8oKSxudWxsfSkpLGE9KG4uZmxhZ3MmMTU5OTApIT09MCxuLnN1YnRyZWVGbGFncyYxNTk5MHx8YSl7YT0kdC50cmFuc2l0aW9uLCR0LnRyYW5zaXRpb249bnVsbDt2YXIgaT12ZTt2ZT0xO3ZhciBzPXVlO3VlfD00LEJjLmN1cnJlbnQ9bnVsbCx0eChlLG4pLFZoKG4sZSksQWIoRnUpLHNzPSEhenUsRnU9enU9bnVsbCxlLmN1cnJlbnQ9bixueChuLGUsbyksSXcoKSx1ZT1zLHZlPWksJHQudHJhbnNpdGlvbj1hfWVsc2UgZS5jdXJyZW50PW47aWYoVmkmJihWaT0hMSx0cj1lLFNzPW8pLGE9ZS5wZW5kaW5nTGFuZXMsYT09PTAmJihzcj1udWxsKSx6dyhuLnN0YXRlTm9kZSxyKSxrdChlLEZlKCkpLHQhPT1udWxsKWZvcihyPWUub25SZWNvdmVyYWJsZUVycm9yLG49MDtuPHQubGVuZ3RoO24rKylvPXRbbl0scihvLnZhbHVlLHtjb21wb25lbnRTdGFjazpvLnN0YWNrLGRpZ2VzdDpvLmRpZ2VzdH0pO2lmKGtzKXRocm93IGtzPSExLGU9b2Msb2M9bnVsbCxlO3JldHVybiBTcyYxJiZlLnRhZyE9PTAmJlRvKCksYT1lLnBlbmRpbmdMYW5lcyxhJjE/ZT09PWFjP2JhKys6KGJhPTAsYWM9ZSk6YmE9MCxtcigpLG51bGx9ZnVuY3Rpb24gVG8oKXtpZih0ciE9PW51bGwpe3ZhciBlPU9tKFNzKSx0PSR0LnRyYW5zaXRpb24sbj12ZTt0cnl7aWYoJHQudHJhbnNpdGlvbj1udWxsLHZlPTE2PmU/MTY6ZSx0cj09PW51bGwpdmFyIHI9ITE7ZWxzZXtpZihlPXRyLHRyPW51bGwsU3M9MCx1ZSY2KXRocm93IEVycm9yKEkoMzMxKSk7dmFyIG89dWU7Zm9yKHVlfD00LGo9ZS5jdXJyZW50O2ohPT1udWxsOyl7dmFyIGE9aixpPWEuY2hpbGQ7aWYoai5mbGFncyYxNil7dmFyIHM9YS5kZWxldGlvbnM7aWYocyE9PW51bGwpe2Zvcih2YXIgbD0wO2w8cy5sZW5ndGg7bCsrKXt2YXIgdT1zW2xdO2ZvcihqPXU7aiE9PW51bGw7KXt2YXIgYz1qO3N3aXRjaChjLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTp2YSg4LGMsYSl9dmFyIGQ9Yy5jaGlsZDtpZihkIT09bnVsbClkLnJldHVybj1jLGo9ZDtlbHNlIGZvcig7aiE9PW51bGw7KXtjPWo7dmFyIHA9Yy5zaWJsaW5nLHk9Yy5yZXR1cm47aWYoV2goYyksYz09PXUpe2o9bnVsbDticmVha31pZihwIT09bnVsbCl7cC5yZXR1cm49eSxqPXA7YnJlYWt9aj15fX19dmFyIGg9YS5hbHRlcm5hdGU7aWYoaCE9PW51bGwpe3ZhciB3PWguY2hpbGQ7aWYodyE9PW51bGwpe2guY2hpbGQ9bnVsbDtkb3t2YXIgYj13LnNpYmxpbmc7dy5zaWJsaW5nPW51bGwsdz1ifXdoaWxlKHchPT1udWxsKX19aj1hfX1pZihhLnN1YnRyZWVGbGFncyYyMDY0JiZpIT09bnVsbClpLnJldHVybj1hLGo9aTtlbHNlIGU6Zm9yKDtqIT09bnVsbDspe2lmKGE9aixhLmZsYWdzJjIwNDgpc3dpdGNoKGEudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OnZhKDksYSxhLnJldHVybil9dmFyIGc9YS5zaWJsaW5nO2lmKGchPT1udWxsKXtnLnJldHVybj1hLnJldHVybixqPWc7YnJlYWsgZX1qPWEucmV0dXJufX12YXIgbT1lLmN1cnJlbnQ7Zm9yKGo9bTtqIT09bnVsbDspe2k9ajt2YXIgdj1pLmNoaWxkO2lmKGkuc3VidHJlZUZsYWdzJjIwNjQmJnYhPT1udWxsKXYucmV0dXJuPWksaj12O2Vsc2UgZTpmb3IoaT1tO2ohPT1udWxsOyl7aWYocz1qLHMuZmxhZ3MmMjA0OCl0cnl7c3dpdGNoKHMudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OklzKDkscyl9fWNhdGNoKEUpe0xlKHMscy5yZXR1cm4sRSl9aWYocz09PWkpe2o9bnVsbDticmVhayBlfXZhciBmPXMuc2libGluZztpZihmIT09bnVsbCl7Zi5yZXR1cm49cy5yZXR1cm4saj1mO2JyZWFrIGV9aj1zLnJldHVybn19aWYodWU9byxtcigpLHZuJiZ0eXBlb2Ygdm4ub25Qb3N0Q29tbWl0RmliZXJSb290PT0iZnVuY3Rpb24iKXRyeXt2bi5vblBvc3RDb21taXRGaWJlclJvb3QoTnMsZSl9Y2F0Y2h7fXI9ITB9cmV0dXJuIHJ9ZmluYWxseXt2ZT1uLCR0LnRyYW5zaXRpb249dH19cmV0dXJuITF9ZnVuY3Rpb24gb20oZSx0LG4pe3Q9T28obix0KSx0PU9oKGUsdCwxKSxlPWlyKGUsdCwxKSx0PW10KCksZSE9PW51bGwmJihGYShlLDEsdCksa3QoZSx0KSl9ZnVuY3Rpb24gTGUoZSx0LG4pe2lmKGUudGFnPT09MylvbShlLGUsbik7ZWxzZSBmb3IoO3QhPT1udWxsOyl7aWYodC50YWc9PT0zKXtvbSh0LGUsbik7YnJlYWt9ZWxzZSBpZih0LnRhZz09PTEpe3ZhciByPXQuc3RhdGVOb2RlO2lmKHR5cGVvZiB0LnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yPT0iZnVuY3Rpb24ifHx0eXBlb2Ygci5jb21wb25lbnREaWRDYXRjaD09ImZ1bmN0aW9uIiYmKHNyPT09bnVsbHx8IXNyLmhhcyhyKSkpe2U9T28obixlKSxlPU1oKHQsZSwxKSx0PWlyKHQsZSwxKSxlPW10KCksdCE9PW51bGwmJihGYSh0LDEsZSksa3QodCxlKSk7YnJlYWt9fXQ9dC5yZXR1cm59fWZ1bmN0aW9uIGx4KGUsdCxuKXt2YXIgcj1lLnBpbmdDYWNoZTtyIT09bnVsbCYmci5kZWxldGUodCksdD1tdCgpLGUucGluZ2VkTGFuZXN8PWUuc3VzcGVuZGVkTGFuZXMmbixKZT09PWUmJihudCZuKT09PW4mJihLZT09PTR8fEtlPT09MyYmKG50JjEzMDAyMzQyNCk9PT1udCYmNTAwPkZlKCktSGM/TXIoZSwwKTpXY3w9biksa3QoZSx0KX1mdW5jdGlvbiBYaChlLHQpe3Q9PT0wJiYoZS5tb2RlJjE/KHQ9T2ksT2k8PD0xLCEoT2kmMTMwMDIzNDI0KSYmKE9pPTQxOTQzMDQpKTp0PTEpO3ZhciBuPW10KCk7ZT1SbihlLHQpLGUhPT1udWxsJiYoRmEoZSx0LG4pLGt0KGUsbikpfWZ1bmN0aW9uIHV4KGUpe3ZhciB0PWUubWVtb2l6ZWRTdGF0ZSxuPTA7dCE9PW51bGwmJihuPXQucmV0cnlMYW5lKSxYaChlLG4pfWZ1bmN0aW9uIGN4KGUsdCl7dmFyIG49MDtzd2l0Y2goZS50YWcpe2Nhc2UgMTM6dmFyIHI9ZS5zdGF0ZU5vZGUsbz1lLm1lbW9pemVkU3RhdGU7byE9PW51bGwmJihuPW8ucmV0cnlMYW5lKTticmVhaztjYXNlIDE5OnI9ZS5zdGF0ZU5vZGU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihJKDMxNCkpfXIhPT1udWxsJiZyLmRlbGV0ZSh0KSxYaChlLG4pfXZhciBaaDtaaD1mdW5jdGlvbihlLHQsbil7aWYoZSE9PW51bGwpaWYoZS5tZW1vaXplZFByb3BzIT09dC5wZW5kaW5nUHJvcHN8fGJ0LmN1cnJlbnQpd3Q9ITA7ZWxzZXtpZighKGUubGFuZXMmbikmJiEodC5mbGFncyYxMjgpKXJldHVybiB3dD0hMSxKYihlLHQsbik7d3Q9ISEoZS5mbGFncyYxMzEwNzIpfWVsc2Ugd3Q9ITEsQ2UmJnQuZmxhZ3MmMTA0ODU3NiYmcmgodCxtcyx0LmluZGV4KTtzd2l0Y2godC5sYW5lcz0wLHQudGFnKXtjYXNlIDI6dmFyIHI9dC50eXBlO1hpKGUsdCksZT10LnBlbmRpbmdQcm9wczt2YXIgbz1Ebyh0LGN0LmN1cnJlbnQpO0VvKHQsbiksbz1MYyhudWxsLHQscixlLG8sbik7dmFyIGE9emMoKTtyZXR1cm4gdC5mbGFnc3w9MSx0eXBlb2Ygbz09Im9iamVjdCImJm8hPT1udWxsJiZ0eXBlb2Ygby5yZW5kZXI9PSJmdW5jdGlvbiImJm8uJCR0eXBlb2Y9PT12b2lkIDA/KHQudGFnPTEsdC5tZW1vaXplZFN0YXRlPW51bGwsdC51cGRhdGVRdWV1ZT1udWxsLHh0KHIpPyhhPSEwLHBzKHQpKTphPSExLHQubWVtb2l6ZWRTdGF0ZT1vLnN0YXRlIT09bnVsbCYmby5zdGF0ZSE9PXZvaWQgMD9vLnN0YXRlOm51bGwsT2ModCksby51cGRhdGVyPVJzLHQuc3RhdGVOb2RlPW8sby5fcmVhY3RJbnRlcm5hbHM9dCxLdSh0LHIsZSxuKSx0PVF1KG51bGwsdCxyLCEwLGEsbikpOih0LnRhZz0wLENlJiZhJiZFYyh0KSxmdChudWxsLHQsbyxuKSx0PXQuY2hpbGQpLHQ7Y2FzZSAxNjpyPXQuZWxlbWVudFR5cGU7ZTp7c3dpdGNoKFhpKGUsdCksZT10LnBlbmRpbmdQcm9wcyxvPXIuX2luaXQscj1vKHIuX3BheWxvYWQpLHQudHlwZT1yLG89dC50YWc9cHgociksZT1KdChyLGUpLG8pe2Nhc2UgMDp0PXF1KG51bGwsdCxyLGUsbik7YnJlYWsgZTtjYXNlIDE6dD1ZZihudWxsLHQscixlLG4pO2JyZWFrIGU7Y2FzZSAxMTp0PUdmKG51bGwsdCxyLGUsbik7YnJlYWsgZTtjYXNlIDE0OnQ9S2YobnVsbCx0LHIsSnQoci50eXBlLGUpLG4pO2JyZWFrIGV9dGhyb3cgRXJyb3IoSSgzMDYsciwiIikpfXJldHVybiB0O2Nhc2UgMDpyZXR1cm4gcj10LnR5cGUsbz10LnBlbmRpbmdQcm9wcyxvPXQuZWxlbWVudFR5cGU9PT1yP286SnQocixvKSxxdShlLHQscixvLG4pO2Nhc2UgMTpyZXR1cm4gcj10LnR5cGUsbz10LnBlbmRpbmdQcm9wcyxvPXQuZWxlbWVudFR5cGU9PT1yP286SnQocixvKSxZZihlLHQscixvLG4pO2Nhc2UgMzplOntpZihMaCh0KSxlPT09bnVsbCl0aHJvdyBFcnJvcihJKDM4NykpO3I9dC5wZW5kaW5nUHJvcHMsYT10Lm1lbW9pemVkU3RhdGUsbz1hLmVsZW1lbnQsdWgoZSx0KSx5cyh0LHIsbnVsbCxuKTt2YXIgaT10Lm1lbW9pemVkU3RhdGU7aWYocj1pLmVsZW1lbnQsYS5pc0RlaHlkcmF0ZWQpaWYoYT17ZWxlbWVudDpyLGlzRGVoeWRyYXRlZDohMSxjYWNoZTppLmNhY2hlLHBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXM6aS5wZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzLHRyYW5zaXRpb25zOmkudHJhbnNpdGlvbnN9LHQudXBkYXRlUXVldWUuYmFzZVN0YXRlPWEsdC5tZW1vaXplZFN0YXRlPWEsdC5mbGFncyYyNTYpe289T28oRXJyb3IoSSg0MjMpKSx0KSx0PXFmKGUsdCxyLG4sbyk7YnJlYWsgZX1lbHNlIGlmKHIhPT1vKXtvPU9vKEVycm9yKEkoNDI0KSksdCksdD1xZihlLHQscixuLG8pO2JyZWFrIGV9ZWxzZSBmb3IoX3Q9YXIodC5zdGF0ZU5vZGUuY29udGFpbmVySW5mby5maXJzdENoaWxkKSxBdD10LENlPSEwLFp0PW51bGwsbj1zaCh0LG51bGwscixuKSx0LmNoaWxkPW47bjspbi5mbGFncz1uLmZsYWdzJi0zfDQwOTYsbj1uLnNpYmxpbmc7ZWxzZXtpZihfbygpLHI9PT1vKXt0PUluKGUsdCxuKTticmVhayBlfWZ0KGUsdCxyLG4pfXQ9dC5jaGlsZH1yZXR1cm4gdDtjYXNlIDU6cmV0dXJuIGNoKHQpLGU9PT1udWxsJiZqdSh0KSxyPXQudHlwZSxvPXQucGVuZGluZ1Byb3BzLGE9ZSE9PW51bGw/ZS5tZW1vaXplZFByb3BzOm51bGwsaT1vLmNoaWxkcmVuLFV1KHIsbyk/aT1udWxsOmEhPT1udWxsJiZVdShyLGEpJiYodC5mbGFnc3w9MzIpLFBoKGUsdCksZnQoZSx0LGksbiksdC5jaGlsZDtjYXNlIDY6cmV0dXJuIGU9PT1udWxsJiZqdSh0KSxudWxsO2Nhc2UgMTM6cmV0dXJuIHpoKGUsdCxuKTtjYXNlIDQ6cmV0dXJuIE1jKHQsdC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbykscj10LnBlbmRpbmdQcm9wcyxlPT09bnVsbD90LmNoaWxkPUFvKHQsbnVsbCxyLG4pOmZ0KGUsdCxyLG4pLHQuY2hpbGQ7Y2FzZSAxMTpyZXR1cm4gcj10LnR5cGUsbz10LnBlbmRpbmdQcm9wcyxvPXQuZWxlbWVudFR5cGU9PT1yP286SnQocixvKSxHZihlLHQscixvLG4pO2Nhc2UgNzpyZXR1cm4gZnQoZSx0LHQucGVuZGluZ1Byb3BzLG4pLHQuY2hpbGQ7Y2FzZSA4OnJldHVybiBmdChlLHQsdC5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sbiksdC5jaGlsZDtjYXNlIDEyOnJldHVybiBmdChlLHQsdC5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sbiksdC5jaGlsZDtjYXNlIDEwOmU6e2lmKHI9dC50eXBlLl9jb250ZXh0LG89dC5wZW5kaW5nUHJvcHMsYT10Lm1lbW9pemVkUHJvcHMsaT1vLnZhbHVlLFNlKGhzLHIuX2N1cnJlbnRWYWx1ZSksci5fY3VycmVudFZhbHVlPWksYSE9PW51bGwpaWYobm4oYS52YWx1ZSxpKSl7aWYoYS5jaGlsZHJlbj09PW8uY2hpbGRyZW4mJiFidC5jdXJyZW50KXt0PUluKGUsdCxuKTticmVhayBlfX1lbHNlIGZvcihhPXQuY2hpbGQsYSE9PW51bGwmJihhLnJldHVybj10KTthIT09bnVsbDspe3ZhciBzPWEuZGVwZW5kZW5jaWVzO2lmKHMhPT1udWxsKXtpPWEuY2hpbGQ7Zm9yKHZhciBsPXMuZmlyc3RDb250ZXh0O2whPT1udWxsOyl7aWYobC5jb250ZXh0PT09cil7aWYoYS50YWc9PT0xKXtsPUNuKC0xLG4mLW4pLGwudGFnPTI7dmFyIHU9YS51cGRhdGVRdWV1ZTtpZih1IT09bnVsbCl7dT11LnNoYXJlZDt2YXIgYz11LnBlbmRpbmc7Yz09PW51bGw/bC5uZXh0PWw6KGwubmV4dD1jLm5leHQsYy5uZXh0PWwpLHUucGVuZGluZz1sfX1hLmxhbmVzfD1uLGw9YS5hbHRlcm5hdGUsbCE9PW51bGwmJihsLmxhbmVzfD1uKSxWdShhLnJldHVybixuLHQpLHMubGFuZXN8PW47YnJlYWt9bD1sLm5leHR9fWVsc2UgaWYoYS50YWc9PT0xMClpPWEudHlwZT09PXQudHlwZT9udWxsOmEuY2hpbGQ7ZWxzZSBpZihhLnRhZz09PTE4KXtpZihpPWEucmV0dXJuLGk9PT1udWxsKXRocm93IEVycm9yKEkoMzQxKSk7aS5sYW5lc3w9bixzPWkuYWx0ZXJuYXRlLHMhPT1udWxsJiYocy5sYW5lc3w9biksVnUoaSxuLHQpLGk9YS5zaWJsaW5nfWVsc2UgaT1hLmNoaWxkO2lmKGkhPT1udWxsKWkucmV0dXJuPWE7ZWxzZSBmb3IoaT1hO2khPT1udWxsOyl7aWYoaT09PXQpe2k9bnVsbDticmVha31pZihhPWkuc2libGluZyxhIT09bnVsbCl7YS5yZXR1cm49aS5yZXR1cm4saT1hO2JyZWFrfWk9aS5yZXR1cm59YT1pfWZ0KGUsdCxvLmNoaWxkcmVuLG4pLHQ9dC5jaGlsZH1yZXR1cm4gdDtjYXNlIDk6cmV0dXJuIG89dC50eXBlLHI9dC5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sRW8odCxuKSxvPUJ0KG8pLHI9cihvKSx0LmZsYWdzfD0xLGZ0KGUsdCxyLG4pLHQuY2hpbGQ7Y2FzZSAxNDpyZXR1cm4gcj10LnR5cGUsbz1KdChyLHQucGVuZGluZ1Byb3BzKSxvPUp0KHIudHlwZSxvKSxLZihlLHQscixvLG4pO2Nhc2UgMTU6cmV0dXJuIFJoKGUsdCx0LnR5cGUsdC5wZW5kaW5nUHJvcHMsbik7Y2FzZSAxNzpyZXR1cm4gcj10LnR5cGUsbz10LnBlbmRpbmdQcm9wcyxvPXQuZWxlbWVudFR5cGU9PT1yP286SnQocixvKSxYaShlLHQpLHQudGFnPTEseHQocik/KGU9ITAscHModCkpOmU9ITEsRW8odCxuKSxDaCh0LHIsbyksS3UodCxyLG8sbiksUXUobnVsbCx0LHIsITAsZSxuKTtjYXNlIDE5OnJldHVybiBGaChlLHQsbik7Y2FzZSAyMjpyZXR1cm4gSWgoZSx0LG4pfXRocm93IEVycm9yKEkoMTU2LHQudGFnKSl9O2Z1bmN0aW9uIGVnKGUsdCl7cmV0dXJuIERtKGUsdCl9ZnVuY3Rpb24gZHgoZSx0LG4scil7dGhpcy50YWc9ZSx0aGlzLmtleT1uLHRoaXMuc2libGluZz10aGlzLmNoaWxkPXRoaXMucmV0dXJuPXRoaXMuc3RhdGVOb2RlPXRoaXMudHlwZT10aGlzLmVsZW1lbnRUeXBlPW51bGwsdGhpcy5pbmRleD0wLHRoaXMucmVmPW51bGwsdGhpcy5wZW5kaW5nUHJvcHM9dCx0aGlzLmRlcGVuZGVuY2llcz10aGlzLm1lbW9pemVkU3RhdGU9dGhpcy51cGRhdGVRdWV1ZT10aGlzLm1lbW9pemVkUHJvcHM9bnVsbCx0aGlzLm1vZGU9cix0aGlzLnN1YnRyZWVGbGFncz10aGlzLmZsYWdzPTAsdGhpcy5kZWxldGlvbnM9bnVsbCx0aGlzLmNoaWxkTGFuZXM9dGhpcy5sYW5lcz0wLHRoaXMuYWx0ZXJuYXRlPW51bGx9ZnVuY3Rpb24gVXQoZSx0LG4scil7cmV0dXJuIG5ldyBkeChlLHQsbixyKX1mdW5jdGlvbiBLYyhlKXtyZXR1cm4gZT1lLnByb3RvdHlwZSwhKCFlfHwhZS5pc1JlYWN0Q29tcG9uZW50KX1mdW5jdGlvbiBweChlKXtpZih0eXBlb2YgZT09ImZ1bmN0aW9uIilyZXR1cm4gS2MoZSk/MTowO2lmKGUhPW51bGwpe2lmKGU9ZS4kJHR5cGVvZixlPT09cGMpcmV0dXJuIDExO2lmKGU9PT1mYylyZXR1cm4gMTR9cmV0dXJuIDJ9ZnVuY3Rpb24gdXIoZSx0KXt2YXIgbj1lLmFsdGVybmF0ZTtyZXR1cm4gbj09PW51bGw/KG49VXQoZS50YWcsdCxlLmtleSxlLm1vZGUpLG4uZWxlbWVudFR5cGU9ZS5lbGVtZW50VHlwZSxuLnR5cGU9ZS50eXBlLG4uc3RhdGVOb2RlPWUuc3RhdGVOb2RlLG4uYWx0ZXJuYXRlPWUsZS5hbHRlcm5hdGU9bik6KG4ucGVuZGluZ1Byb3BzPXQsbi50eXBlPWUudHlwZSxuLmZsYWdzPTAsbi5zdWJ0cmVlRmxhZ3M9MCxuLmRlbGV0aW9ucz1udWxsKSxuLmZsYWdzPWUuZmxhZ3MmMTQ2ODAwNjQsbi5jaGlsZExhbmVzPWUuY2hpbGRMYW5lcyxuLmxhbmVzPWUubGFuZXMsbi5jaGlsZD1lLmNoaWxkLG4ubWVtb2l6ZWRQcm9wcz1lLm1lbW9pemVkUHJvcHMsbi5tZW1vaXplZFN0YXRlPWUubWVtb2l6ZWRTdGF0ZSxuLnVwZGF0ZVF1ZXVlPWUudXBkYXRlUXVldWUsdD1lLmRlcGVuZGVuY2llcyxuLmRlcGVuZGVuY2llcz10PT09bnVsbD9udWxsOntsYW5lczp0LmxhbmVzLGZpcnN0Q29udGV4dDp0LmZpcnN0Q29udGV4dH0sbi5zaWJsaW5nPWUuc2libGluZyxuLmluZGV4PWUuaW5kZXgsbi5yZWY9ZS5yZWYsbn1mdW5jdGlvbiB0cyhlLHQsbixyLG8sYSl7dmFyIGk9MjtpZihyPWUsdHlwZW9mIGU9PSJmdW5jdGlvbiIpS2MoZSkmJihpPTEpO2Vsc2UgaWYodHlwZW9mIGU9PSJzdHJpbmciKWk9NTtlbHNlIGU6c3dpdGNoKGUpe2Nhc2UgbG86cmV0dXJuIFJyKG4uY2hpbGRyZW4sbyxhLHQpO2Nhc2UgZGM6aT04LG98PTg7YnJlYWs7Y2FzZSB5dTpyZXR1cm4gZT1VdCgxMixuLHQsb3wyKSxlLmVsZW1lbnRUeXBlPXl1LGUubGFuZXM9YSxlO2Nhc2UgdnU6cmV0dXJuIGU9VXQoMTMsbix0LG8pLGUuZWxlbWVudFR5cGU9dnUsZS5sYW5lcz1hLGU7Y2FzZSB3dTpyZXR1cm4gZT1VdCgxOSxuLHQsbyksZS5lbGVtZW50VHlwZT13dSxlLmxhbmVzPWEsZTtjYXNlIGNtOnJldHVybiBMcyhuLG8sYSx0KTtkZWZhdWx0OmlmKHR5cGVvZiBlPT0ib2JqZWN0IiYmZSE9PW51bGwpc3dpdGNoKGUuJCR0eXBlb2Ype2Nhc2UgbG06aT0xMDticmVhayBlO2Nhc2UgdW06aT05O2JyZWFrIGU7Y2FzZSBwYzppPTExO2JyZWFrIGU7Y2FzZSBmYzppPTE0O2JyZWFrIGU7Y2FzZSBRbjppPTE2LHI9bnVsbDticmVhayBlfXRocm93IEVycm9yKEkoMTMwLGU9PW51bGw/ZTp0eXBlb2YgZSwiIikpfXJldHVybiB0PVV0KGksbix0LG8pLHQuZWxlbWVudFR5cGU9ZSx0LnR5cGU9cix0LmxhbmVzPWEsdH1mdW5jdGlvbiBScihlLHQsbixyKXtyZXR1cm4gZT1VdCg3LGUscix0KSxlLmxhbmVzPW4sZX1mdW5jdGlvbiBMcyhlLHQsbixyKXtyZXR1cm4gZT1VdCgyMixlLHIsdCksZS5lbGVtZW50VHlwZT1jbSxlLmxhbmVzPW4sZS5zdGF0ZU5vZGU9e2lzSGlkZGVuOiExfSxlfWZ1bmN0aW9uIG11KGUsdCxuKXtyZXR1cm4gZT1VdCg2LGUsbnVsbCx0KSxlLmxhbmVzPW4sZX1mdW5jdGlvbiBodShlLHQsbil7cmV0dXJuIHQ9VXQoNCxlLmNoaWxkcmVuIT09bnVsbD9lLmNoaWxkcmVuOltdLGUua2V5LHQpLHQubGFuZXM9bix0LnN0YXRlTm9kZT17Y29udGFpbmVySW5mbzplLmNvbnRhaW5lckluZm8scGVuZGluZ0NoaWxkcmVuOm51bGwsaW1wbGVtZW50YXRpb246ZS5pbXBsZW1lbnRhdGlvbn0sdH1mdW5jdGlvbiBmeChlLHQsbixyLG8pe3RoaXMudGFnPXQsdGhpcy5jb250YWluZXJJbmZvPWUsdGhpcy5maW5pc2hlZFdvcms9dGhpcy5waW5nQ2FjaGU9dGhpcy5jdXJyZW50PXRoaXMucGVuZGluZ0NoaWxkcmVuPW51bGwsdGhpcy50aW1lb3V0SGFuZGxlPS0xLHRoaXMuY2FsbGJhY2tOb2RlPXRoaXMucGVuZGluZ0NvbnRleHQ9dGhpcy5jb250ZXh0PW51bGwsdGhpcy5jYWxsYmFja1ByaW9yaXR5PTAsdGhpcy5ldmVudFRpbWVzPVhsKDApLHRoaXMuZXhwaXJhdGlvblRpbWVzPVhsKC0xKSx0aGlzLmVudGFuZ2xlZExhbmVzPXRoaXMuZmluaXNoZWRMYW5lcz10aGlzLm11dGFibGVSZWFkTGFuZXM9dGhpcy5leHBpcmVkTGFuZXM9dGhpcy5waW5nZWRMYW5lcz10aGlzLnN1c3BlbmRlZExhbmVzPXRoaXMucGVuZGluZ0xhbmVzPTAsdGhpcy5lbnRhbmdsZW1lbnRzPVhsKDApLHRoaXMuaWRlbnRpZmllclByZWZpeD1yLHRoaXMub25SZWNvdmVyYWJsZUVycm9yPW8sdGhpcy5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhPW51bGx9ZnVuY3Rpb24gWWMoZSx0LG4scixvLGEsaSxzLGwpe3JldHVybiBlPW5ldyBmeChlLHQsbixzLGwpLHQ9PT0xPyh0PTEsYT09PSEwJiYodHw9OCkpOnQ9MCxhPVV0KDMsbnVsbCxudWxsLHQpLGUuY3VycmVudD1hLGEuc3RhdGVOb2RlPWUsYS5tZW1vaXplZFN0YXRlPXtlbGVtZW50OnIsaXNEZWh5ZHJhdGVkOm4sY2FjaGU6bnVsbCx0cmFuc2l0aW9uczpudWxsLHBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXM6bnVsbH0sT2MoYSksZX1mdW5jdGlvbiBteChlLHQsbil7dmFyIHI9Mzxhcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOm51bGw7cmV0dXJueyQkdHlwZW9mOnNvLGtleTpyPT1udWxsP251bGw6IiIrcixjaGlsZHJlbjplLGNvbnRhaW5lckluZm86dCxpbXBsZW1lbnRhdGlvbjpufX1mdW5jdGlvbiB0ZyhlKXtpZighZSlyZXR1cm4gZHI7ZT1lLl9yZWFjdEludGVybmFscztlOntpZigkcihlKSE9PWV8fGUudGFnIT09MSl0aHJvdyBFcnJvcihJKDE3MCkpO3ZhciB0PWU7ZG97c3dpdGNoKHQudGFnKXtjYXNlIDM6dD10LnN0YXRlTm9kZS5jb250ZXh0O2JyZWFrIGU7Y2FzZSAxOmlmKHh0KHQudHlwZSkpe3Q9dC5zdGF0ZU5vZGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQ7YnJlYWsgZX19dD10LnJldHVybn13aGlsZSh0IT09bnVsbCk7dGhyb3cgRXJyb3IoSSgxNzEpKX1pZihlLnRhZz09PTEpe3ZhciBuPWUudHlwZTtpZih4dChuKSlyZXR1cm4gdGgoZSxuLHQpfXJldHVybiB0fWZ1bmN0aW9uIG5nKGUsdCxuLHIsbyxhLGkscyxsKXtyZXR1cm4gZT1ZYyhuLHIsITAsZSxvLGEsaSxzLGwpLGUuY29udGV4dD10ZyhudWxsKSxuPWUuY3VycmVudCxyPW10KCksbz1scihuKSxhPUNuKHIsbyksYS5jYWxsYmFjaz10Pz9udWxsLGlyKG4sYSxvKSxlLmN1cnJlbnQubGFuZXM9byxGYShlLG8sciksa3QoZSxyKSxlfWZ1bmN0aW9uIHpzKGUsdCxuLHIpe3ZhciBvPXQuY3VycmVudCxhPW10KCksaT1scihvKTtyZXR1cm4gbj10ZyhuKSx0LmNvbnRleHQ9PT1udWxsP3QuY29udGV4dD1uOnQucGVuZGluZ0NvbnRleHQ9bix0PUNuKGEsaSksdC5wYXlsb2FkPXtlbGVtZW50OmV9LHI9cj09PXZvaWQgMD9udWxsOnIsciE9PW51bGwmJih0LmNhbGxiYWNrPXIpLGU9aXIobyx0LGkpLGUhPT1udWxsJiYodG4oZSxvLGksYSkscWkoZSxvLGkpKSxpfWZ1bmN0aW9uIFRzKGUpe2lmKGU9ZS5jdXJyZW50LCFlLmNoaWxkKXJldHVybiBudWxsO3N3aXRjaChlLmNoaWxkLnRhZyl7Y2FzZSA1OnJldHVybiBlLmNoaWxkLnN0YXRlTm9kZTtkZWZhdWx0OnJldHVybiBlLmNoaWxkLnN0YXRlTm9kZX19ZnVuY3Rpb24gYW0oZSx0KXtpZihlPWUubWVtb2l6ZWRTdGF0ZSxlIT09bnVsbCYmZS5kZWh5ZHJhdGVkIT09bnVsbCl7dmFyIG49ZS5yZXRyeUxhbmU7ZS5yZXRyeUxhbmU9biE9PTAmJm48dD9uOnR9fWZ1bmN0aW9uIHFjKGUsdCl7YW0oZSx0KSwoZT1lLmFsdGVybmF0ZSkmJmFtKGUsdCl9ZnVuY3Rpb24gaHgoKXtyZXR1cm4gbnVsbH12YXIgcmc9dHlwZW9mIHJlcG9ydEVycm9yPT0iZnVuY3Rpb24iP3JlcG9ydEVycm9yOmZ1bmN0aW9uKGUpe2NvbnNvbGUuZXJyb3IoZSl9O2Z1bmN0aW9uIFFjKGUpe3RoaXMuX2ludGVybmFsUm9vdD1lfUZzLnByb3RvdHlwZS5yZW5kZXI9UWMucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9pbnRlcm5hbFJvb3Q7aWYodD09PW51bGwpdGhyb3cgRXJyb3IoSSg0MDkpKTt6cyhlLHQsbnVsbCxudWxsKX07RnMucHJvdG90eXBlLnVubW91bnQ9UWMucHJvdG90eXBlLnVubW91bnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9pbnRlcm5hbFJvb3Q7aWYoZSE9PW51bGwpe3RoaXMuX2ludGVybmFsUm9vdD1udWxsO3ZhciB0PWUuY29udGFpbmVySW5mbztGcihmdW5jdGlvbigpe3pzKG51bGwsZSxudWxsLG51bGwpfSksdFtNbl09bnVsbH19O2Z1bmN0aW9uIEZzKGUpe3RoaXMuX2ludGVybmFsUm9vdD1lfUZzLnByb3RvdHlwZS51bnN0YWJsZV9zY2hlZHVsZUh5ZHJhdGlvbj1mdW5jdGlvbihlKXtpZihlKXt2YXIgdD1JbSgpO2U9e2Jsb2NrZWRPbjpudWxsLHRhcmdldDplLHByaW9yaXR5OnR9O2Zvcih2YXIgbj0wO248WG4ubGVuZ3RoJiZ0IT09MCYmdDxYbltuXS5wcmlvcml0eTtuKyspO1huLnNwbGljZShuLDAsZSksbj09PTAmJkxtKGUpfX07ZnVuY3Rpb24gSmMoZSl7cmV0dXJuISghZXx8ZS5ub2RlVHlwZSE9PTEmJmUubm9kZVR5cGUhPT05JiZlLm5vZGVUeXBlIT09MTEpfWZ1bmN0aW9uIFVzKGUpe3JldHVybiEoIWV8fGUubm9kZVR5cGUhPT0xJiZlLm5vZGVUeXBlIT09OSYmZS5ub2RlVHlwZSE9PTExJiYoZS5ub2RlVHlwZSE9PTh8fGUubm9kZVZhbHVlIT09IiByZWFjdC1tb3VudC1wb2ludC11bnN0YWJsZSAiKSl9ZnVuY3Rpb24gaW0oKXt9ZnVuY3Rpb24gZ3goZSx0LG4scixvKXtpZihvKXtpZih0eXBlb2Ygcj09ImZ1bmN0aW9uIil7dmFyIGE9cjtyPWZ1bmN0aW9uKCl7dmFyIHU9VHMoaSk7YS5jYWxsKHUpfX12YXIgaT1uZyh0LHIsZSwwLG51bGwsITEsITEsIiIsaW0pO3JldHVybiBlLl9yZWFjdFJvb3RDb250YWluZXI9aSxlW01uXT1pLmN1cnJlbnQsQWEoZS5ub2RlVHlwZT09PTg/ZS5wYXJlbnROb2RlOmUpLEZyKCksaX1mb3IoO289ZS5sYXN0Q2hpbGQ7KWUucmVtb3ZlQ2hpbGQobyk7aWYodHlwZW9mIHI9PSJmdW5jdGlvbiIpe3ZhciBzPXI7cj1mdW5jdGlvbigpe3ZhciB1PVRzKGwpO3MuY2FsbCh1KX19dmFyIGw9WWMoZSwwLCExLG51bGwsbnVsbCwhMSwhMSwiIixpbSk7cmV0dXJuIGUuX3JlYWN0Um9vdENvbnRhaW5lcj1sLGVbTW5dPWwuY3VycmVudCxBYShlLm5vZGVUeXBlPT09OD9lLnBhcmVudE5vZGU6ZSksRnIoZnVuY3Rpb24oKXt6cyh0LGwsbixyKX0pLGx9ZnVuY3Rpb24gJHMoZSx0LG4scixvKXt2YXIgYT1uLl9yZWFjdFJvb3RDb250YWluZXI7aWYoYSl7dmFyIGk9YTtpZih0eXBlb2Ygbz09ImZ1bmN0aW9uIil7dmFyIHM9bztvPWZ1bmN0aW9uKCl7dmFyIGw9VHMoaSk7cy5jYWxsKGwpfX16cyh0LGksZSxvKX1lbHNlIGk9Z3gobix0LGUsbyxyKTtyZXR1cm4gVHMoaSl9TW09ZnVuY3Rpb24oZSl7c3dpdGNoKGUudGFnKXtjYXNlIDM6dmFyIHQ9ZS5zdGF0ZU5vZGU7aWYodC5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXt2YXIgbj1jYSh0LnBlbmRpbmdMYW5lcyk7biE9PTAmJihnYyh0LG58MSksa3QodCxGZSgpKSwhKHVlJjYpJiYoTW89RmUoKSs1MDAsbXIoKSkpfWJyZWFrO2Nhc2UgMTM6RnIoZnVuY3Rpb24oKXt2YXIgcj1SbihlLDEpO2lmKHIhPT1udWxsKXt2YXIgbz1tdCgpO3RuKHIsZSwxLG8pfX0pLHFjKGUsMSl9fTt5Yz1mdW5jdGlvbihlKXtpZihlLnRhZz09PTEzKXt2YXIgdD1SbihlLDEzNDIxNzcyOCk7aWYodCE9PW51bGwpe3ZhciBuPW10KCk7dG4odCxlLDEzNDIxNzcyOCxuKX1xYyhlLDEzNDIxNzcyOCl9fTtSbT1mdW5jdGlvbihlKXtpZihlLnRhZz09PTEzKXt2YXIgdD1scihlKSxuPVJuKGUsdCk7aWYobiE9PW51bGwpe3ZhciByPW10KCk7dG4obixlLHQscil9cWMoZSx0KX19O0ltPWZ1bmN0aW9uKCl7cmV0dXJuIHZlfTtQbT1mdW5jdGlvbihlLHQpe3ZhciBuPXZlO3RyeXtyZXR1cm4gdmU9ZSx0KCl9ZmluYWxseXt2ZT1ufX07QXU9ZnVuY3Rpb24oZSx0LG4pe3N3aXRjaCh0KXtjYXNlImlucHV0IjppZihrdShlLG4pLHQ9bi5uYW1lLG4udHlwZT09PSJyYWRpbyImJnQhPW51bGwpe2ZvcihuPWU7bi5wYXJlbnROb2RlOyluPW4ucGFyZW50Tm9kZTtmb3Iobj1uLnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0W25hbWU9IitKU09OLnN0cmluZ2lmeSgiIit0KSsnXVt0eXBlPSJyYWRpbyJdJyksdD0wO3Q8bi5sZW5ndGg7dCsrKXt2YXIgcj1uW3RdO2lmKHIhPT1lJiZyLmZvcm09PT1lLmZvcm0pe3ZhciBvPUNzKHIpO2lmKCFvKXRocm93IEVycm9yKEkoOTApKTtwbShyKSxrdShyLG8pfX19YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6bW0oZSxuKTticmVhaztjYXNlInNlbGVjdCI6dD1uLnZhbHVlLHQhPW51bGwmJmJvKGUsISFuLm11bHRpcGxlLHQsITEpfX07eG09amM7a209RnI7dmFyIHl4PXt1c2luZ0NsaWVudEVudHJ5UG9pbnQ6ITEsRXZlbnRzOlskYSxmbyxDcyx3bSxibSxqY119LGlhPXtmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTpBcixidW5kbGVUeXBlOjAsdmVyc2lvbjoiMTguMy4xIixyZW5kZXJlclBhY2thZ2VOYW1lOiJyZWFjdC1kb20ifSx2eD17YnVuZGxlVHlwZTppYS5idW5kbGVUeXBlLHZlcnNpb246aWEudmVyc2lvbixyZW5kZXJlclBhY2thZ2VOYW1lOmlhLnJlbmRlcmVyUGFja2FnZU5hbWUscmVuZGVyZXJDb25maWc6aWEucmVuZGVyZXJDb25maWcsb3ZlcnJpZGVIb29rU3RhdGU6bnVsbCxvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGg6bnVsbCxvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGg6bnVsbCxvdmVycmlkZVByb3BzOm51bGwsb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGg6bnVsbCxvdmVycmlkZVByb3BzUmVuYW1lUGF0aDpudWxsLHNldEVycm9ySGFuZGxlcjpudWxsLHNldFN1c3BlbnNlSGFuZGxlcjpudWxsLHNjaGVkdWxlVXBkYXRlOm51bGwsY3VycmVudERpc3BhdGNoZXJSZWY6UG4uUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixmaW5kSG9zdEluc3RhbmNlQnlGaWJlcjpmdW5jdGlvbihlKXtyZXR1cm4gZT1UbShlKSxlPT09bnVsbD9udWxsOmUuc3RhdGVOb2RlfSxmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTppYS5maW5kRmliZXJCeUhvc3RJbnN0YW5jZXx8aHgsZmluZEhvc3RJbnN0YW5jZXNGb3JSZWZyZXNoOm51bGwsc2NoZWR1bGVSZWZyZXNoOm51bGwsc2NoZWR1bGVSb290Om51bGwsc2V0UmVmcmVzaEhhbmRsZXI6bnVsbCxnZXRDdXJyZW50RmliZXI6bnVsbCxyZWNvbmNpbGVyVmVyc2lvbjoiMTguMy4xLW5leHQtZjEzMzhmODA4MC0yMDI0MDQyNiJ9O2lmKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX188InUiJiYoc2E9X19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLCFzYS5pc0Rpc2FibGVkJiZzYS5zdXBwb3J0c0ZpYmVyKSl0cnl7TnM9c2EuaW5qZWN0KHZ4KSx2bj1zYX1jYXRjaHt9dmFyIHNhO010Ll9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEPXl4O010LmNyZWF0ZVBvcnRhbD1mdW5jdGlvbihlLHQpe3ZhciBuPTI8YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTpudWxsO2lmKCFKYyh0KSl0aHJvdyBFcnJvcihJKDIwMCkpO3JldHVybiBteChlLHQsbnVsbCxuKX07TXQuY3JlYXRlUm9vdD1mdW5jdGlvbihlLHQpe2lmKCFKYyhlKSl0aHJvdyBFcnJvcihJKDI5OSkpO3ZhciBuPSExLHI9IiIsbz1yZztyZXR1cm4gdCE9bnVsbCYmKHQudW5zdGFibGVfc3RyaWN0TW9kZT09PSEwJiYobj0hMCksdC5pZGVudGlmaWVyUHJlZml4IT09dm9pZCAwJiYocj10LmlkZW50aWZpZXJQcmVmaXgpLHQub25SZWNvdmVyYWJsZUVycm9yIT09dm9pZCAwJiYobz10Lm9uUmVjb3ZlcmFibGVFcnJvcikpLHQ9WWMoZSwxLCExLG51bGwsbnVsbCxuLCExLHIsbyksZVtNbl09dC5jdXJyZW50LEFhKGUubm9kZVR5cGU9PT04P2UucGFyZW50Tm9kZTplKSxuZXcgUWModCl9O010LmZpbmRET01Ob2RlPWZ1bmN0aW9uKGUpe2lmKGU9PW51bGwpcmV0dXJuIG51bGw7aWYoZS5ub2RlVHlwZT09PTEpcmV0dXJuIGU7dmFyIHQ9ZS5fcmVhY3RJbnRlcm5hbHM7aWYodD09PXZvaWQgMCl0aHJvdyB0eXBlb2YgZS5yZW5kZXI9PSJmdW5jdGlvbiI/RXJyb3IoSSgxODgpKTooZT1PYmplY3Qua2V5cyhlKS5qb2luKCIsIiksRXJyb3IoSSgyNjgsZSkpKTtyZXR1cm4gZT1UbSh0KSxlPWU9PT1udWxsP251bGw6ZS5zdGF0ZU5vZGUsZX07TXQuZmx1c2hTeW5jPWZ1bmN0aW9uKGUpe3JldHVybiBGcihlKX07TXQuaHlkcmF0ZT1mdW5jdGlvbihlLHQsbil7aWYoIVVzKHQpKXRocm93IEVycm9yKEkoMjAwKSk7cmV0dXJuICRzKG51bGwsZSx0LCEwLG4pfTtNdC5oeWRyYXRlUm9vdD1mdW5jdGlvbihlLHQsbil7aWYoIUpjKGUpKXRocm93IEVycm9yKEkoNDA1KSk7dmFyIHI9biE9bnVsbCYmbi5oeWRyYXRlZFNvdXJjZXN8fG51bGwsbz0hMSxhPSIiLGk9cmc7aWYobiE9bnVsbCYmKG4udW5zdGFibGVfc3RyaWN0TW9kZT09PSEwJiYobz0hMCksbi5pZGVudGlmaWVyUHJlZml4IT09dm9pZCAwJiYoYT1uLmlkZW50aWZpZXJQcmVmaXgpLG4ub25SZWNvdmVyYWJsZUVycm9yIT09dm9pZCAwJiYoaT1uLm9uUmVjb3ZlcmFibGVFcnJvcikpLHQ9bmcodCxudWxsLGUsMSxuPz9udWxsLG8sITEsYSxpKSxlW01uXT10LmN1cnJlbnQsQWEoZSkscilmb3IoZT0wO2U8ci5sZW5ndGg7ZSsrKW49cltlXSxvPW4uX2dldFZlcnNpb24sbz1vKG4uX3NvdXJjZSksdC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhPT1udWxsP3QubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YT1bbixvXTp0Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEucHVzaChuLG8pO3JldHVybiBuZXcgRnModCl9O010LnJlbmRlcj1mdW5jdGlvbihlLHQsbil7aWYoIVVzKHQpKXRocm93IEVycm9yKEkoMjAwKSk7cmV0dXJuICRzKG51bGwsZSx0LCExLG4pfTtNdC51bm1vdW50Q29tcG9uZW50QXROb2RlPWZ1bmN0aW9uKGUpe2lmKCFVcyhlKSl0aHJvdyBFcnJvcihJKDQwKSk7cmV0dXJuIGUuX3JlYWN0Um9vdENvbnRhaW5lcj8oRnIoZnVuY3Rpb24oKXskcyhudWxsLG51bGwsZSwhMSxmdW5jdGlvbigpe2UuX3JlYWN0Um9vdENvbnRhaW5lcj1udWxsLGVbTW5dPW51bGx9KX0pLCEwKTohMX07TXQudW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXM9amM7TXQudW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXI9ZnVuY3Rpb24oZSx0LG4scil7aWYoIVVzKG4pKXRocm93IEVycm9yKEkoMjAwKSk7aWYoZT09bnVsbHx8ZS5fcmVhY3RJbnRlcm5hbHM9PT12b2lkIDApdGhyb3cgRXJyb3IoSSgzOCkpO3JldHVybiAkcyhlLHQsbiwhMSxyKX07TXQudmVyc2lvbj0iMTguMy4xLW5leHQtZjEzMzhmODA4MC0yMDI0MDQyNiJ9KTt2YXIgc2c9VHIoKG5fLGlnKT0+eyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBhZygpe2lmKCEodHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXz4idSJ8fHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UhPSJmdW5jdGlvbiIpKXRyeXtfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UoYWcpfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoZSl9fWFnKCksaWcuZXhwb3J0cz1vZygpfSk7dmFyIHVnPVRyKFhjPT57InVzZSBzdHJpY3QiO3ZhciBsZz1zZygpO1hjLmNyZWF0ZVJvb3Q9bGcuY3JlYXRlUm9vdCxYYy5oeWRyYXRlUm9vdD1sZy5oeWRyYXRlUm9vdDt2YXIgcl99KTt2YXIgSzA9eWUobWUoKSwxKSxZMD15ZSh1ZygpLDEpO3ZhciBybj17REVGQVVMVDoiZGVmYXVsdCIsTEFZT1VUX0NPTkZJRzoibGF5b3V0Q29uZmlnIixTRVRUSU5HU19DT05GSUc6InNldHRpbmdzQ29uZmlnIn07dmFyIGRnPXR5cGVvZiBwcm9jZXNzPCJ1IiYmITEsTG49ITEsWmM9MzAsWGU9InBsdWdpbnMvZGFzaGJvYXJkIixCcz0icGxhbm5pbmcvcXVhcnRlcmx5IixwZz17YW50aHJvcGljOiJBbnRocm9waWMgQVBJIEtleSIsZGVlcHNlZWs6IkRlZXBTZWVrIEFQSSBLZXkiLGdlbWluaToiR2VtaW5pIEFQSSBLZXkiLGdyb2s6Ikdyb2sgQVBJIEtleSIsb3BlbmFpOiJPcGVuQUkgQVBJIEtleSJ9O3ZhciBaPXtCQUNLR1JPVU5EX0lNQUdFX1VSTDoiQmFja2dyb3VuZCBJbWFnZSBVUkwiLEJBQ0tHUk9VTkRfSU1BR0VfTU9ERToiQmFja2dyb3VuZCBJbWFnZSBNb2RlIixDT05TT0xFX0xPR0dJTkc6IkNvbnNvbGUgbG9nZ2luZyIsREFTSEJPQVJEX0NPTVBPTkVOVFM6ImRhc2hib2FyZF9lbGVtZW50cyIsTExNX0FQSV9LRVlfQU5USFJPUElDOiJBbnRocm9waWMgQVBJIEtleSIsTExNX0FQSV9LRVlfR0VNSU5JOiJHZW1pbmkgQVBJIEtleSIsTExNX0FQSV9LRVlfR1JPSzoiR3JvayBBUEkgS2V5IixMTE1fQVBJX0tFWV9PUEVOQUk6Ik9wZW5BSSBBUEkgS2V5IixMTE1fUFJPVklERVJfTU9ERUw6IkxMTSBQcm92aWRlciIsVEFTS19ET01BSU5TOiJkYXNoYm9hcmRfdGFza19kb21haW5zIixQTEFOTklOR19OT1RFX1RBRzoiVGFnIHRvIGFwcGx5IHRvIHBsYW5uaW5nIG5vdGVzIn0sZmc9e2FudGhyb3BpYzpaLkxMTV9BUElfS0VZX0FOVEhST1BJQyxnZW1pbmk6Wi5MTE1fQVBJX0tFWV9HRU1JTkksZ3JvazpaLkxMTV9BUElfS0VZX0dST0ssb3BlbmFpOlouTExNX0FQSV9LRVlfT1BFTkFJfSxjZz17bm9uZTpudWxsLG9wZW5haToib3BlbmFpIixhbnRocm9waWM6ImFudGhyb3BpYyIsImFudGhyb3BpYy1zb25uZXQiOiJhbnRocm9waWMiLGdlbWluaToiZ2VtaW5pIixncm9rOiJncm9rIn07ZnVuY3Rpb24gaHIoZSl7cmV0dXJuIWV8fGU9PT0ibm9uZSI/bnVsbDpPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY2csZSk/Y2dbZV06ZmdbZV0/ZTpudWxsfWZ1bmN0aW9uIG9uKGUpe3JldHVybiBmZ1tlXXx8bnVsbH1mdW5jdGlvbiBQbyhlKXtyZXR1cm5gZGFzaGJvYXJkXyR7ZX1fY29uZmlnYH1mdW5jdGlvbiBXcyhlLHQpe2xldCBuPWUuc2V0dGluZ3M/LltQbyh0KV07aWYoIW4pcmV0dXJuW107aWYoQXJyYXkuaXNBcnJheShuKSlyZXR1cm4gbjt0cnl7cmV0dXJuIEpTT04ucGFyc2Uobil9Y2F0Y2h7cmV0dXJuW119fXZhciBtZz1be3ZhbHVlOiJjb3ZlciIsbGFiZWw6IkNvdmVyIChmaWxsIGVudGlyZSBiYWNrZ3JvdW5kKSJ9LHt2YWx1ZToiY29udGFpbiIsbGFiZWw6IkNvbnRhaW4gKGZpdCB3aXRob3V0IGNyb3BwaW5nKSJ9LHt2YWx1ZToicmVwZWF0IixsYWJlbDoiUmVwZWF0ICh0aWxlIHRoZSBpbWFnZSkifSx7dmFsdWU6InJlcGVhdC14IixsYWJlbDoiUmVwZWF0IGhvcml6b250YWxseSJ9LHt2YWx1ZToicmVwZWF0LXkiLGxhYmVsOiJSZXBlYXQgdmVydGljYWxseSJ9LHt2YWx1ZToibm8tcmVwZWF0IixsYWJlbDoiTm8gcmVwZWF0IChzaW5nbGUgY2VudGVyZWQgaW1hZ2UpIn1dLGFfPVouREFTSEJPQVJEX0NPTVBPTkVOVFMsaV89Wi5UQVNLX0RPTUFJTlMsc189Wi5QTEFOTklOR19OT1RFX1RBRyx3eD0yNCo2MCo2MCoxZTMsYm49W3t3aWRnZXRJZDoicGxhbm5pbmciLG5hbWU6IlF1YXJ0ZXJseSBQbGFubmluZyIsZGVzY3JpcHRpb246IlBsYW4gYW5kIHRyYWNrIHlvdXIgcXVhcnRlcmx5IGdvYWxzIGFuZCBwcmlvcml0aWVzIixpY29uOiJcdXsxRjRDQn0iLGRlZmF1bHRHcmlkV2lkdGhTaXplOjIsbWF4SG9yaXpvbnRhbFRpbGVzOjQsbWF4VmVydGljYWxUaWxlczoyfSx7d2lkZ2V0SWQ6InZpY3RvcnktdmFsdWUiLG5hbWU6IlZpY3RvcnkgVmFsdWUiLGRlc2NyaXB0aW9uOiJDZWxlYnJhdGUgd2lucyBhbmQgdHJhY2sgaGlnaC12YWx1ZSB0YXNrIGNvbXBsZXRpb25zIixpY29uOiJcdXsxRjNDNn0iLGRlZmF1bHRHcmlkV2lkdGhTaXplOjIsbWF4SG9yaXpvbnRhbFRpbGVzOjQsbWF4VmVydGljYWxUaWxlczoyfSx7d2lkZ2V0SWQ6Im1vb2QiLG5hbWU6Ik1vb2QgVHJhY2tlciIsdmlzaWJsZVRpdGxlOiJIb3cgYXJlIHlvdSBmZWVsaW5nPyIsZGVzY3JpcHRpb246IkxvZyB5b3VyIGRhaWx5IG1vb2QgYW5kIHZpc3VhbGl6ZSB0cmVuZHMgb3ZlciB0aW1lIixpY29uOiJcdXsxRjNBRH0iLGRlZmF1bHRHcmlkV2lkdGhTaXplOjEsbWF4SG9yaXpvbnRhbFRpbGVzOjIsbWF4VmVydGljYWxUaWxlczoyfSx7d2lkZ2V0SWQ6ImNhbGVuZGFyIixuYW1lOiJDYWxlbmRhciIsZGVzY3JpcHRpb246IlNlZSB1cGNvbWluZyBldmVudHMgYW5kIGFwcG9pbnRtZW50cyBhdCBhIGdsYW5jZSIsaWNvbjoiXHV7MUY0QzV9IixkZWZhdWx0R3JpZFdpZHRoU2l6ZToxLG1heEhvcml6b250YWxUaWxlczoyLG1heFZlcnRpY2FsVGlsZXM6Mn0se3dpZGdldElkOiJhZ2VuZGEiLG5hbWU6IlRhc2sgQWdlbmRhIixkZXNjcmlwdGlvbjoiVmlldyBhbmQgbWFuYWdlIHlvdXIgcHJpb3JpdGl6ZWQgdGFzayBsaXN0IixpY29uOiJcdXsxRjRDQ30iLGRlZmF1bHRHcmlkV2lkdGhTaXplOjIsbWF4SG9yaXpvbnRhbFRpbGVzOjQsbWF4VmVydGljYWxUaWxlczoyfSx7d2lkZ2V0SWQ6InF1b3RlcyIsbmFtZToiSW5zcGlyYXRpb24gUXVvdGVzIixkZXNjcmlwdGlvbjoiUm90YXRpbmcgaW5zcGlyYXRpb25hbCBxdW90ZXMgdG8ga2VlcCB5b3UgbW90aXZhdGVkIixpY29uOiJcdXsxRjRBMX0iLGRlZmF1bHRHcmlkV2lkdGhTaXplOjIsbWF4SG9yaXpvbnRhbFRpbGVzOjQsbWF4VmVydGljYWxUaWxlczoyfSx7d2lkZ2V0SWQ6InJlY2VudC1ub3RlcyIsbmFtZToiUmV2aXNpdCBDYW5kaWRhdGUiLGRlc2NyaXB0aW9uOiJOb3RlcyB3aXRoIG9wZW4gdGFza3MgdGhhdCBoYXZlIG5vdCBoYWQgYSBuZXcgdGFzayBpbiBvdmVyIGEgd2VlayIsaWNvbjoiXHV7MUY0RER9IixkZWZhdWx0R3JpZFdpZHRoU2l6ZToxLG1heEhvcml6b250YWxUaWxlczo0LG1heFZlcnRpY2FsVGlsZXM6Mn0se3dpZGdldElkOiJxdWljay1hY3Rpb25zIixuYW1lOiJRdWljayBBY3Rpb25zIixkZXNjcmlwdGlvbjoiU2hvcnRjdXRzIGZvciB5b3VyIG1vc3QgZnJlcXVlbnRseSB1c2VkIGRhc2hib2FyZCBhY3Rpb25zIixpY29uOiJcdTI2QTEiLGRlZmF1bHRHcmlkV2lkdGhTaXplOjEsbWF4SG9yaXpvbnRhbFRpbGVzOjIsbWF4VmVydGljYWxUaWxlczoyfSx7d2lkZ2V0SWQ6ImRyZWFtLXRhc2siLG5hbWU6IkdvYWwgQ29hY2giLGRlc2NyaXB0aW9uOiJHZXQgdGFzayBzdWdnZXN0aW9ucyB0aGF0IGJsZW5kIHF1YXJ0ZXJseS9tb250aGx5IGdvYWxzIHdpdGggZGF5LW9mLXdlZWsgcHJlZmVyZW5jZXMiLGljb246Ilx1ezFGNTJFfSIsZGVmYXVsdEdyaWRXaWR0aFNpemU6MixtYXhIb3Jpem9udGFsVGlsZXM6NCxtYXhWZXJ0aWNhbFRpbGVzOjJ9LHt3aWRnZXRJZDoicGVhay1ob3VycyIsbmFtZToiUGVhayBIb3VycyIsZGVzY3JpcHRpb246IkhvdXJseSBkaXN0cmlidXRpb24gb2YgdGFzayBjcmVhdGlvbiBhbmQgY29tcGxldGlvbiBhY3Rpdml0eSIsaWNvbjoiXHUyM0YwIixkZWZhdWx0R3JpZFdpZHRoU2l6ZToyLG1heEhvcml6b250YWxUaWxlczo0LG1heFZlcnRpY2FsVGlsZXM6Mn0se3dpZGdldElkOiJkYXktc2tldGNoIixuYW1lOiJEYXkgU2tldGNoZXIiLGRlc2NyaXB0aW9uOiJOb3RlYm9vay1wYXBlciBkYXkgcGxhbm5lciB3aXRoIGhvdXItYnktaG91ciBlbnRyaWVzIHNhdmVkIHRvIGEgbm90ZSIsaWNvbjoiXHV7MUY1RDJ9XHVGRTBGIixkZWZhdWx0R3JpZFdpZHRoU2l6ZToyLG1heEhvcml6b250YWxUaWxlczo0LG1heFZlcnRpY2FsVGlsZXM6Mn1dO2Z1bmN0aW9uIGRlKGUpe2xldCB0PWJuLmZpbmQobj0+bi53aWRnZXRJZD09PWUpO3JldHVybiB0Py52aXNpYmxlVGl0bGV8fHQ/Lm5hbWV8fGV9ZnVuY3Rpb24gaGcoZSl7cmV0dXJuIGJuLmZpbmQodD0+dC53aWRnZXRJZD09PWUpfHxudWxsfXZhciBMbz1ibi5tYXAoZT0+KHt3aWRnZXRJZDplLndpZGdldElkLGdyaWRXaWR0aFNpemU6ZS5kZWZhdWx0R3JpZFdpZHRoU2l6ZSxncmlkSGVpZ2h0U2l6ZToxLHNldHRpbmdzOnt9fSkpO3ZhciBlZD0hMTtmdW5jdGlvbiB0ZChlKXtpZih0eXBlb2YgZT09ImJvb2xlYW4iKXtlZD1lO3JldHVybn1sZXQgdD1TdHJpbmcoZXx8IiIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO2VkPVsidHJ1ZSIsInllcyIsIjEiLCJvbiIsImVuYWJsZWQiXS5pbmNsdWRlcyh0KX1mdW5jdGlvbiBfKC4uLmUpe2VkJiZjb25zb2xlLmxvZyguLi5lKX12YXIgZ2c9IkNvbnNvbGUgbG9nZ2luZyI7ZnVuY3Rpb24gSHMoZSl7cmV0dXJuYGRhc2hib2FyZF8ke2V9X2NvbmZpZ2B9ZnVuY3Rpb24gbmQoZSl7cmV0dXJuIHR5cGVvZiBlPT0ic3RyaW5nIj9lOmU/LnV1aWR9ZnVuY3Rpb24ga2coZSl7cmV0dXJuKGUubWF0Y2goL14oI3sxLDZ9KVxzKyguKykkL2dtKXx8W10pLm1hcCgobixyKT0+KHtoZWFkaW5nOnt0ZXh0Om4ucmVwbGFjZSgvXiN7MSw2fVxzKy8sIiIpLnRyaW0oKSxsZXZlbDoobi5tYXRjaCgvXiMrLyl8fFsiIl0pWzBdLmxlbmd0aH0saW5kZXg6cn0pKX1mdW5jdGlvbiBqcyhlKXtyZXR1cm4gZT09bnVsbD9udWxsOmU8MWUxMD9lKjFlMzplfWZ1bmN0aW9uIGJ4KGUpe2xldCB0PW5ldyBEYXRlKGUpLG49dC5nZXREYXkoKTtyZXR1cm4gdC5zZXREYXRlKHQuZ2V0RGF0ZSgpLW4rKG49PT0wPy02OjEpKSx0LnNldEhvdXJzKDAsMCwwLDApLHR9ZnVuY3Rpb24geHgoZSx0KXtsZXQgbj1uZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksdC5nZXRNb250aCgpLHQuZ2V0RGF0ZSgpKS5nZXRUaW1lKCkscj1uKzg2NGU1O3JldHVybiBlLmZpbHRlcihvPT57bGV0IGE9anMoby5zdGFydEF0KTtyZXR1cm4hby5jb21wbGV0ZWRBdCYmIW8uZGlzbWlzc2VkQXQmJmEhPW51bGwmJmE+PW4mJmE8cn0pfWZ1bmN0aW9uIFNnKGUsdCl7bGV0IG49dC5nZXRUaW1lKCkscj1uKzcqODY0ZTU7cmV0dXJuIGUuZmlsdGVyKG89PntsZXQgYT1qcyhvLmNvbXBsZXRlZEF0KTtyZXR1cm4gYSE9bnVsbCYmYT49biYmYTxyfSl9ZnVuY3Rpb24ga3goZSx0KXtyZXR1cm4gU2coZSx0KS5yZWR1Y2UoKG4scik9Pm4rKHIudmljdG9yeVZhbHVlfHwwKSwwKX1mdW5jdGlvbiBTeChlLHQpe3JldHVyblsiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0IiwiU3VuIl0ubWFwKChyLG8pPT57bGV0IGE9bmV3IERhdGUodCk7YS5zZXREYXRlKGEuZ2V0RGF0ZSgpK28pO2xldCBpPW5ldyBEYXRlKGEpO2kuc2V0RGF0ZShpLmdldERhdGUoKSsxKTtsZXQgcz1lLmZpbHRlcihsPT57bGV0IHU9anMobC5jb21wbGV0ZWRBdCk7cmV0dXJuIHUhPW51bGwmJnU+PWEuZ2V0VGltZSgpJiZ1PGkuZ2V0VGltZSgpfSk7cmV0dXJue2RheTpyLGRhdGU6YS50b0lTT1N0cmluZygpLHZhbHVlOnMucmVkdWNlKChsLHUpPT5sKyh1LnZpY3RvcnlWYWx1ZXx8MCksMCksdGFza0NvdW50OnMubGVuZ3RofX0pfWZ1bmN0aW9uIHlnKGUpe2xldCB0PVsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxuPShlLTEpKjM7cmV0dXJuW3Rbbl0sdFtuKzFdLHRbbisyXV19ZnVuY3Rpb24gRXgoZSx0KXtsZXQgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsYWJlbCIpO24uc3R5bGUuZGlzcGxheT0iZmxleCIsbi5zdHlsZS5hbGlnbkl0ZW1zPSJjZW50ZXIiLG4uc3R5bGUuZ2FwPSIxMHB4IjtsZXQgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7ci50ZXh0Q29udGVudD1lPy5sYWJlbHx8YElucHV0ICR7dCsxfWAsci5zdHlsZS5taW5XaWR0aD0iMTQwcHgiLG4uYXBwZW5kQ2hpbGQocik7bGV0IG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7by5zdHlsZS5mbGV4PSIxIixuLmFwcGVuZENoaWxkKG8pO2xldCBhPWU/LnR5cGV8fCJ0ZXh0IixpPUFycmF5LmlzQXJyYXkoZT8ub3B0aW9ucyk/ZS5vcHRpb25zOltdO2lmKGE9PT0iY2hlY2tib3giKXtsZXQgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO3JldHVybiBsLnR5cGU9ImNoZWNrYm94IixsLmNoZWNrZWQ9ISFlPy52YWx1ZSxvLmFwcGVuZENoaWxkKGwpLHtsaW5lOm4sZm9jdXNUYXJnZXQ6bCxnZXRWYWx1ZTooKT0+bC5jaGVja2VkfX1pZihhPT09InJhZGlvIil7bGV0IGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5zdHlsZS5kaXNwbGF5PSJmbGV4IixsLnN0eWxlLmZsZXhXcmFwPSJ3cmFwIixsLnN0eWxlLmdhcD0iMTBweCI7bGV0IHU9YGRldi1wcm9tcHQtcmFkaW8tJHtEYXRlLm5vdygpfS0ke3R9YCxjPW51bGw7Zm9yKGxldFtkLHBdb2YgaS5lbnRyaWVzKCkpe2xldCB5PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxhYmVsIik7eS5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtZmxleCIseS5zdHlsZS5hbGlnbkl0ZW1zPSJjZW50ZXIiLHkuc3R5bGUuZ2FwPSI0cHgiO2xldCBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7aC50eXBlPSJyYWRpbyIsaC5uYW1lPXUsaC52YWx1ZT1TdHJpbmcocD8udmFsdWU/P3A/LmxhYmVsPz8iIiksZT8udmFsdWUhPW51bGwmJlN0cmluZyhlLnZhbHVlKT09PWgudmFsdWUmJihoLmNoZWNrZWQ9ITApLGN8fChjPWgpO2xldCB3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTt3LnRleHRDb250ZW50PXA/LmxhYmVsPz9oLnZhbHVlLHkuYXBwZW5kKGgsdyksbC5hcHBlbmRDaGlsZCh5KSxkPT09aS5sZW5ndGgtMSYmIWwucXVlcnlTZWxlY3RvcigiaW5wdXQ6Y2hlY2tlZCIpJiZjJiYoYy5jaGVja2VkPSEwKX1yZXR1cm4gby5hcHBlbmRDaGlsZChsKSx7bGluZTpuLGZvY3VzVGFyZ2V0OmMsZ2V0VmFsdWU6KCk9PntsZXQgZD1sLnF1ZXJ5U2VsZWN0b3IoImlucHV0OmNoZWNrZWQiKTtyZXR1cm4gZD9kLnZhbHVlOm51bGx9fX1pZihhPT09InNlbGVjdCIpe2xldCBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpO2wuc3R5bGUud2lkdGg9IjEwMCUiO2ZvcihsZXQgdSBvZiBpKXtsZXQgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKTtjLnZhbHVlPVN0cmluZyh1Py52YWx1ZT8/dT8ubGFiZWw/PyIiKSxjLnRleHRDb250ZW50PXU/LmxhYmVsPz9jLnZhbHVlLGwuYXBwZW5kQ2hpbGQoYyl9cmV0dXJuIGU/LnZhbHVlIT1udWxsJiYobC52YWx1ZT1TdHJpbmcoZS52YWx1ZSkpLG8uYXBwZW5kQ2hpbGQobCkse2xpbmU6bixmb2N1c1RhcmdldDpsLGdldFZhbHVlOigpPT5sLnZhbHVlfX1pZihhPT09ImRhdGUiKXtsZXQgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2lmKGwudHlwZT0iZGF0ZSIsZT8udmFsdWUhPW51bGwpe2xldCB1PW5ldyBEYXRlKGpzKE51bWJlcihlLnZhbHVlKSkpO051bWJlci5pc05hTih1LmdldFRpbWUoKSl8fChsLnZhbHVlPXUudG9JU09TdHJpbmcoKS5zbGljZSgwLDEwKSl9cmV0dXJuIGwuc3R5bGUud2lkdGg9IjEwMCUiLG8uYXBwZW5kQ2hpbGQobCkse2xpbmU6bixmb2N1c1RhcmdldDpsLGdldFZhbHVlOigpPT57aWYoIWwudmFsdWUpcmV0dXJuIG51bGw7bGV0IHU9RGF0ZS5wYXJzZShgJHtsLnZhbHVlfVQwMDowMDowMFpgKTtyZXR1cm4gTnVtYmVyLmlzTmFOKHUpP251bGw6TWF0aC5mbG9vcih1LzFlMyl9fX1pZihhPT09InRleHQiKXtsZXQgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpO3JldHVybiBsLnJvd3M9MixsLnN0eWxlLndpZHRoPSIxMDAlIixsLnZhbHVlPVN0cmluZyhlPy52YWx1ZT8/IiIpLGU/LnBsYWNlaG9sZGVyJiYobC5wbGFjZWhvbGRlcj1lLnBsYWNlaG9sZGVyKSxvLmFwcGVuZENoaWxkKGwpLHtsaW5lOm4sZm9jdXNUYXJnZXQ6bCxnZXRWYWx1ZTooKT0+bC52YWx1ZX19bGV0IHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtyZXR1cm4gcy50eXBlPWE9PT0ic2VjdXJlVGV4dCI/InBhc3N3b3JkIjoidGV4dCIscy5zdHlsZS53aWR0aD0iMTAwJSIscy52YWx1ZT1TdHJpbmcoZT8udmFsdWU/PyIiKSxlPy5wbGFjZWhvbGRlciYmKHMucGxhY2Vob2xkZXI9ZS5wbGFjZWhvbGRlciksby5hcHBlbmRDaGlsZChzKSx7bGluZTpuLGZvY3VzVGFyZ2V0OnMsZ2V0VmFsdWU6KCk9PnMudmFsdWV9fWZ1bmN0aW9uIFR4KGUsdD17fSl7aWYodHlwZW9mIGRvY3VtZW50PiJ1IilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO2xldCBuPUFycmF5LmlzQXJyYXkodD8uaW5wdXRzKSYmdC5pbnB1dHMubGVuZ3RoPjA/dC5pbnB1dHM6W3t0eXBlOiJ0ZXh0In1dLHI9QXJyYXkuaXNBcnJheSh0Py5hY3Rpb25zKT90LmFjdGlvbnM6W107cmV0dXJuIG5ldyBQcm9taXNlKG89PntsZXQgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmRhdGFzZXQuZGV2UHJvbXB0PSJvdmVybGF5IixhLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsYS5zdHlsZS5pbnNldD0iMCIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJyZ2JhKDAsMCwwLDAuMzUpIixhLnN0eWxlLnpJbmRleD0iOTk5OTkiLGEuc3R5bGUuZGlzcGxheT0iZ3JpZCIsYS5zdHlsZS5wbGFjZUl0ZW1zPSJjZW50ZXIiO2xldCBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2kuc3R5bGUud2lkdGg9Im1pbig2ODBweCwgOTJ2dykiLGkuc3R5bGUuYmFja2dyb3VuZD0iI2ZmZiIsaS5zdHlsZS5jb2xvcj0iIzExMSIsaS5zdHlsZS5ib3JkZXJSYWRpdXM9IjEwcHgiLGkuc3R5bGUucGFkZGluZz0iMTZweCIsaS5zdHlsZS5ib3hTaGFkb3c9IjAgMTZweCA0OHB4IHJnYmEoMCwwLDAsMC4yNSkiLGEuYXBwZW5kQ2hpbGQoaSk7bGV0IHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cy50ZXh0Q29udGVudD1TdHJpbmcoZT8/IlByb21wdCIpLHMuc3R5bGUuZm9udFdlaWdodD0iNjAwIixzLnN0eWxlLm1hcmdpbkJvdHRvbT0iMTJweCIsaS5hcHBlbmRDaGlsZChzKTtsZXQgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJmb3JtIik7bC5zdHlsZS5kaXNwbGF5PSJmbGV4IixsLnN0eWxlLmZsZXhEaXJlY3Rpb249ImNvbHVtbiIsbC5zdHlsZS5nYXA9IjEwcHgiLGkuYXBwZW5kQ2hpbGQobCk7bGV0IHU9bi5tYXAoKHcsYik9PkV4KHcsYikpO2ZvcihsZXQgdyBvZiB1KWwuYXBwZW5kQ2hpbGQody5saW5lKTtsZXQgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLnN0eWxlLmRpc3BsYXk9ImZsZXgiLGMuc3R5bGUuanVzdGlmeUNvbnRlbnQ9ImZsZXgtZW5kIixjLnN0eWxlLmdhcD0iOHB4IixjLnN0eWxlLm1hcmdpblRvcD0iOHB4IixsLmFwcGVuZENoaWxkKGMpO2xldCBkPS0xO2ZvcihsZXRbdyxiXW9mIHIuZW50cmllcygpKXtsZXQgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTtnLnR5cGU9ImJ1dHRvbiIsZy50ZXh0Q29udGVudD1iPy5sYWJlbHx8YEFjdGlvbiAke3crMX1gLGcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57ZD1iPy52YWx1ZT8/dyxsLnJlcXVlc3RTdWJtaXQoKX0pLGMuYXBwZW5kQ2hpbGQoZyl9bGV0IHA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7cC50eXBlPSJidXR0b24iLHAuZGF0YXNldC5kZXZQcm9tcHRDYW5jZWw9InRydWUiLHAudGV4dENvbnRlbnQ9IkNhbmNlbCIscC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9PnthLnJlbW92ZSgpLG8obnVsbCl9KSxjLmFwcGVuZENoaWxkKHApO2xldCB5PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpO3kudHlwZT0ic3VibWl0Iix5LnRleHRDb250ZW50PSJTdWJtaXQiLGMuYXBwZW5kQ2hpbGQoeSksbC5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLHc9Pnt3LnByZXZlbnREZWZhdWx0KCk7bGV0IGI9dS5tYXAoZz0+Zy5nZXRWYWx1ZSgpKTthLnJlbW92ZSgpLGIubGVuZ3RoPT09MSYmci5sZW5ndGg9PT0wP28oYlswXSk6ci5sZW5ndGg9PT0wP28oYik6byhbLi4uYixkXSl9KSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO2xldCBoPXUuZmluZCh3PT53LmZvY3VzVGFyZ2V0KT8uZm9jdXNUYXJnZXQ7aCYmaC5mb2N1cygpfSl9dmFyIFdhPW51bGw7YXN5bmMgZnVuY3Rpb24gRWcoKXtpZihXYSE9PW51bGwpcmV0dXJuIFdhO3RyeXtXYT1hd2FpdChhd2FpdCBmZXRjaCgiL2FwaS9zZXR0aW5ncyIpKS5qc29uKCl9Y2F0Y2h7V2E9e319cmV0dXJuIFdhfWFzeW5jIGZ1bmN0aW9uIE54KGUsdCl7bGV0IG49YXdhaXQgRWcoKTtuW2VdPXQ7dHJ5e2F3YWl0IGZldGNoKCIvYXBpL3NldHRpbmdzIix7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9LGJvZHk6SlNPTi5zdHJpbmdpZnkoe2tleTplLHZhbHVlOnR9KX0pfWNhdGNoKHIpe2NvbnNvbGUud2FybigiW2Rldi1hcHBdIGZhaWxlZCB0byBwZXJzaXN0IHNldHRpbmciLGUscil9fWFzeW5jIGZ1bmN0aW9uIHZnKCl7dHJ5e3JldHVybiBhd2FpdChhd2FpdCBmZXRjaCgiL2FwaS90YXNrcyIpKS5qc29uKCl9Y2F0Y2h7cmV0dXJuW119fWFzeW5jIGZ1bmN0aW9uIER4KGUsdCl7dHJ5e3JldHVybiBhd2FpdChhd2FpdCBmZXRjaChgL2FwaS90YXNrcz9mcm9tPSR7ZX0mdG89JHt0fWApKS5qc29uKCl9Y2F0Y2h7cmV0dXJuW119fWFzeW5jIGZ1bmN0aW9uIHdnKGUpe3RyeXtsZXQgdD1lP2AvYXBpL21vb2RzP2Zyb209JHtlfWA6Ii9hcGkvbW9vZHMiO3JldHVybiBhd2FpdChhd2FpdCBmZXRjaCh0KSkuanNvbigpfWNhdGNoe3JldHVybltdfX12YXIgcmQ9eyJkb21haW4td29yay11dWlkIjpbe3V1aWQ6Im5vdGUtd29yay0xIixuYW1lOiJRMSBHb2FsIFJldmlldyJ9LHt1dWlkOiJub3RlLXdvcmstMiIsbmFtZToiU3RhbmQtdXAgTm90ZXMifSx7dXVpZDoibm90ZS13b3JrLTMiLG5hbWU6IkZlYXR1cmUgSW1wbGVtZW50YXRpb24ifSx7dXVpZDoibm90ZS13b3JrLTQiLG5hbWU6IkRlc2lnbiBGZWVkYmFjayJ9LHt1dWlkOiJub3RlLXdvcmstNSIsbmFtZToiQnVkZ2V0IFRyYWNrZXIifSx7dXVpZDoibm90ZS13b3JrLTYiLG5hbWU6Ik9mZmxpbmUgVGVzdGluZyJ9LHt1dWlkOiJub3RlLXdvcmstNyIsbmFtZToiU3ByaW50IFJldHJvIn0se3V1aWQ6Im5vdGUtd29yay04IixuYW1lOiJBUEkgTGF5ZXIgUmVzZWFyY2gifSx7dXVpZDoibm90ZS13b3JrLTkiLG5hbWU6IkludGVncmF0aW9uIFRlc3RzIn0se3V1aWQ6Im5vdGUtd29yay0xMCIsbmFtZToiUHVsbCBSZXF1ZXN0IFF1ZXVlIn0se3V1aWQ6Im5vdGUtd29yay0xMSIsbmFtZToiU2V0dGluZ3MgTW9kdWxlIFRlc3RzIn0se3V1aWQ6Im5vdGUtd29yay0xMiIsbmFtZToiQ1NTIENsZWFudXAifSx7dXVpZDoibm90ZS13b3JrLTEzIixuYW1lOiJEYXNoYm9hcmQgTWVtb3J5IExlYWsifSx7dXVpZDoibm90ZS13b3JrLTE0IixuYW1lOiJDbGllbnQgRmVlZGJhY2sifSx7dXVpZDoibm90ZS13b3JrLTE1IixuYW1lOiJBUEkgRXJyb3IgSGFuZGxpbmcifSx7dXVpZDoibm90ZS13b3JrLTE2IixuYW1lOiJBdXRoIFRva2VuIFJlZnJlc2gifSx7dXVpZDoibm90ZS13b3JrLTE3IixuYW1lOiJEQiBRdWVyeSBQZXJmb3JtYW5jZSJ9XSwiZG9tYWluLXBlcnNvbmFsLXV1aWQiOlt7dXVpZDoibm90ZS1wZXJzb25hbC0xIixuYW1lOiJOZXR3b3JraW5nIE91dHJlYWNoIn0se3V1aWQ6Im5vdGUtcGVyc29uYWwtMiIsbmFtZToiRml0bmVzcyBMb2cifSx7dXVpZDoibm90ZS1wZXJzb25hbC0zIixuYW1lOiJTb2NpYWwgUmVtaW5kZXJzIn0se3V1aWQ6Im5vdGUtcGVyc29uYWwtNCIsbmFtZToiRW50ZXJ0YWlubWVudCJ9LHt1dWlkOiJub3RlLXBlcnNvbmFsLTUiLG5hbWU6IlNob3BwaW5nIExpc3QifSx7dXVpZDoibm90ZS1wZXJzb25hbC02IixuYW1lOiJIZWFsdGggQXBwb2ludG1lbnRzIn0se3V1aWQ6Im5vdGUtcGVyc29uYWwtNyIsbmFtZToiUmVhZGluZyBMaXN0In0se3V1aWQ6Im5vdGUtcGVyc29uYWwtOCIsbmFtZToiSG9iYmllcyJ9LHt1dWlkOiJub3RlLXBlcnNvbmFsLTkiLG5hbWU6IlRyaXAgUGxhbm5pbmcifSx7dXVpZDoibm90ZS1wZXJzb25hbC0xMCIsbmFtZToiSG9tZSBPZmZpY2UifV0sImRvbWFpbi1zaWRlLXV1aWQiOlt7dXVpZDoibm90ZS1zaWRlLTEiLG5hbWU6IkJsb2cgUG9zdCBJZGVhcyJ9LHt1dWlkOiJub3RlLXNpZGUtMiIsbmFtZToiU2lkZSBQcm9qZWN0IFJFQURNRSJ9LHt1dWlkOiJub3RlLXNpZGUtMyIsbmFtZToiQ0kgUGlwZWxpbmUgU2V0dXAifV19LF94PVt7bmFtZToiV29yayIsdXVpZDoiZG9tYWluLXdvcmstdXVpZCIsbm90ZXM6cmRbImRvbWFpbi13b3JrLXV1aWQiXX0se25hbWU6IlBlcnNvbmFsIix1dWlkOiJkb21haW4tcGVyc29uYWwtdXVpZCIsbm90ZXM6cmRbImRvbWFpbi1wZXJzb25hbC11dWlkIl19LHtuYW1lOiJTaWRlIFByb2plY3RzIix1dWlkOiJkb21haW4tc2lkZS11dWlkIixub3RlczpyZFsiZG9tYWluLXNpZGUtdXVpZCJdfV07YXN5bmMgZnVuY3Rpb24gYmcoZSl7dHJ5e3JldHVybiBhd2FpdChhd2FpdCBmZXRjaChgL2FwaS9ub3RlLWZpbmQ/bmFtZT0ke2VuY29kZVVSSUNvbXBvbmVudChlKX1gKSkuanNvbigpfWNhdGNoe3JldHVybiBudWxsfX1hc3luYyBmdW5jdGlvbiB4ZyhlKXt0cnl7bGV0IG49YXdhaXQgb2QoKS5nZXROb3RlQ29udGVudChlKTtyZXR1cm4ga2cobnx8IiIpfWNhdGNoe3JldHVybltdfX12YXIgem89bnVsbDtmdW5jdGlvbiBvZCgpe2lmKHpvKXJldHVybiB6bztsZXQgZT10PT57bGV0IG49L15odHRwczpcL1wvd3d3XC5hbXBsZW5vdGVcLmNvbVwvbm90ZXMoPzokfFsvP10uKikvLnRlc3QodCk7cmV0dXJuIG4/Y29uc29sZS5sb2coIltkZXYtYXBwXSBuYXZpZ2F0ZSIsdCk6Y29uc29sZS53YXJuKCJbZGV2LWFwcF0gbmF2aWdhdGUgcmVqZWN0ZWQgaW52YWxpZCBVUkwiLHQpLG59O3JldHVybiB6bz17c2V0dGluZ3M6e30sYXN5bmMgaW5pdCgpe2xldCB0PWF3YWl0IEVnKCk7aWYodFtnZ118fCh0W2dnXT0idHJ1ZSIpLHR5cGVvZiB0LmRhc2hib2FyZF9lbGVtZW50cz09InN0cmluZyIpdHJ5e3QuZGFzaGJvYXJkX2VsZW1lbnRzPUpTT04ucGFyc2UodC5kYXNoYm9hcmRfZWxlbWVudHMpfWNhdGNoe3QuZGFzaGJvYXJkX2VsZW1lbnRzPW51bGx9Zm9yKGxldCB2IG9mW0hzKCJ2aWN0b3J5LXZhbHVlIiksSHMoImNhbGVuZGFyIiksSHMoIm1vb2QiKSxIcygicXVvdGVzIildKWlmKHR5cGVvZiB0W3ZdPT0ic3RyaW5nIil0cnl7dFt2XT1KU09OLnBhcnNlKHRbdl0pfWNhdGNoe3Rbdl09bnVsbH1sZXQgbj1uZXcgRGF0ZSxyPWJ4KG4pLG89YXdhaXQgdmcoKSxhPWF3YWl0IHdnKCksaT1NYXRoLmNlaWwoKG4uZ2V0TW9udGgoKSsxKS8zKSxzPWBRJHtpfSAke24uZ2V0RnVsbFllYXIoKX1gLGw9aT09PTQ/MTppKzEsdT1pPT09ND9uLmdldEZ1bGxZZWFyKCkrMTpuLmdldEZ1bGxZZWFyKCksYz1gUSR7bH0gJHt1fWAsW2QscF09YXdhaXQgUHJvbWlzZS5hbGwoW2JnKGAke3N9IFBsYW5gKSxiZyhgJHtjfSBQbGFuYCldKSxbeSxoXT1hd2FpdCBQcm9taXNlLmFsbChbZD8udXVpZD94ZyhkLnV1aWQpOlByb21pc2UucmVzb2x2ZShbXSkscD8udXVpZD94ZyhwLnV1aWQpOlByb21pc2UucmVzb2x2ZShbXSldKSx3PXlnKGkpLGI9eWcobCksZz13LmV2ZXJ5KHY9Pnkuc29tZShmPT5mLmhlYWRpbmc/LnRleHQ/LnRyaW0oKS50b0xvd2VyQ2FzZSgpPT09di50b0xvd2VyQ2FzZSgpKSksbT1iLmV2ZXJ5KHY9Pmguc29tZShmPT5mLmhlYWRpbmc/LnRleHQ/LnRyaW0oKS50b0xvd2VyQ2FzZSgpPT09di50b0xvd2VyQ2FzZSgpKSk7cmV0dXJuIHpvLnNldHRpbmdzPXQse3Rhc2tzOm8sdG9kYXlUYXNrczp4eChvLG4pLGNvbXBsZXRlZFRoaXNXZWVrOlNnKG8sciksd2Vla2x5VmljdG9yeVZhbHVlOmt4KG8sciksZGFpbHlWaWN0b3J5VmFsdWVzOlN4KG8sciksbW9vZFJhdGluZ3M6YSxxdWFydGVybHlQbGFuczp7Y3VycmVudDp7eWVhcjpuLmdldEZ1bGxZZWFyKCkscXVhcnRlcjppLGxhYmVsOnMsbm90ZVVVSUQ6ZD8udXVpZD8/bnVsbCxoYXNBbGxNb250aGx5RGV0YWlsczpnfSxuZXh0Ont5ZWFyOnUscXVhcnRlcjpsLGxhYmVsOmMsbm90ZVVVSUQ6cD8udXVpZD8/bnVsbCxoYXNBbGxNb250aGx5RGV0YWlsczptfX0sY3VycmVudERhdGU6bi50b0lTT1N0cmluZygpLHNldHRpbmdzOnQsdGFza0RvbWFpbnM6W3tuYW1lOiJXb3JrIix1dWlkOiJkb21haW4td29yay11dWlkIn0se25hbWU6IlBlcnNvbmFsIix1dWlkOiJkb21haW4tcGVyc29uYWwtdXVpZCJ9LHtuYW1lOiJTaWRlIFByb2plY3RzIix1dWlkOiJkb21haW4tc2lkZS11dWlkIn1dLGFjdGl2ZVRhc2tEb21haW46ImRvbWFpbi13b3JrLXV1aWQifX0sYXN5bmMgY29uZmlndXJlKCl7cmV0dXJuIG51bGx9LGFzeW5jIGdldE1vb2RSYXRpbmdzKHQpe3JldHVybiB3Zyh0KX0sYXN5bmMgZ2V0Q29tcGxldGVkVGFza3ModCxuKXtyZXR1cm4gRHgodCxuKX0sYXN5bmMgZ2V0RXh0ZXJuYWxDYWxlbmRhckV2ZW50cygpe2xldCB0PW5ldyBEYXRlLG49dC5nZXRGdWxsWWVhcigpLHI9dC5nZXRNb250aCgpLG89dC5nZXREYXRlKCk7cmV0dXJuW3thbGxEYXk6ITEsY2FsZW5kYXI6e3V1aWQ6ImNhbC1wZXJzb25hbC11dWlkIixuYW1lOiJQZXJzb25hbCJ9LGNvbG9yOiIjNDI4NWY0IixlbmQ6bmV3IERhdGUobixyLG8sMTcsMCwwKSxzdGFydDpuZXcgRGF0ZShuLHIsbywxNiwwLDApLHRpdGxlOiJCaXJ0aGRheSBwYXJ0eSJ9LHthbGxEYXk6ITEsY2FsZW5kYXI6e3V1aWQ6ImNhbC13b3JrLXV1aWQiLG5hbWU6IldvcmsifSxjb2xvcjoiIzBiODA0MyIsZW5kOm5ldyBEYXRlKG4scixvKzIsMTIsMjUsMCksc3RhcnQ6bmV3IERhdGUobixyLG8rMiwxMSwyNSwwKSx0aXRsZToiUXVhcnRlcmx5IFJldmlldyBTeW5jIn1dfSxhc3luYyBnZXRUYXNrRG9tYWlucygpe3JldHVybiBfeH0sYXN5bmMgZ2V0VGFza0RvbWFpblRhc2tzKHQpe2xldCBuPXQ/YC9hcGkvdGFza3M/ZG9tYWluPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHQpfWA6Ii9hcGkvdGFza3MiO3JldHVybiBhd2FpdChhd2FpdCBmZXRjaChuKSkuanNvbigpfSxhc3luYyBnZXROb3RlVGFza3ModCxuKXtyZXR1cm4oYXdhaXQgdmcoKSkuZmlsdGVyKG89Pm8ubm90ZVVVSUQ9PT10JiZvLmNvbXBsZXRlZEF0PT1udWxsJiZvLmRpc21pc3NlZEF0PT1udWxsKX0sbmF2aWdhdGUodCl7cmV0dXJuIGUodCl9LGFzeW5jIHNldFNldHRpbmcodCxuKXtsZXQgcj1uPT1udWxsPyIiOlN0cmluZyhuKTt6by5zZXR0aW5nc1t0XT1yLGF3YWl0IE54KHQscil9LGFzeW5jIHJlY29yZE1vb2RSYXRpbmcodCl7dHJ5e3JldHVybihhd2FpdChhd2FpdCBmZXRjaCgiL2FwaS9tb29kcyIse21ldGhvZDoiUE9TVCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifSxib2R5OkpTT04uc3RyaW5naWZ5KHt2YWx1ZTp0fSl9KSkuanNvbigpKS51dWlkfWNhdGNoKG4pe3JldHVybiBfKCJbZGV2LWFwcF0gcmVjb3JkTW9vZFJhdGluZyBmYWlsZWQ6IixuKSxudWxsfX0sYXN5bmMgdXBkYXRlTW9vZFJhdGluZyh0LG4pe3RyeXthd2FpdCBmZXRjaCgiL2FwaS9tb29kcyIse21ldGhvZDoiUEFUQ0giLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn0sYm9keTpKU09OLnN0cmluZ2lmeSh7dXVpZDp0LHVwZGF0ZXM6bn0pfSl9Y2F0Y2gocil7XygiW2Rldi1hcHBdIHVwZGF0ZU1vb2RSYXRpbmcgZmFpbGVkOiIscil9fSxhc3luYyBnZXROb3RlQ29udGVudCh0KXtsZXQgbj1uZCh0KTt0cnl7cmV0dXJuKGF3YWl0KGF3YWl0IGZldGNoKGAvYXBpL25vdGUtY29udGVudD91dWlkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KG4pfWApKS5qc29uKCkpLmNvbnRlbnQ/PyIifWNhdGNoe3JldHVybiIifX0sYXN5bmMgZ2V0Tm90ZVNlY3Rpb25zKHQpe2xldCBuPWF3YWl0IHRoaXMuZ2V0Tm90ZUNvbnRlbnQodCk7cmV0dXJuIGtnKG4pfSxhc3luYyBmaW5kTm90ZSh0PXt9KXt0cnl7bGV0IG49dC51dWlkP2B1dWlkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHQudXVpZCl9YDpgbmFtZT0ke2VuY29kZVVSSUNvbXBvbmVudCh0Lm5hbWUpfWAsbz1hd2FpdChhd2FpdCBmZXRjaChgL2FwaS9ub3RlLWZpbmQ/JHtufWApKS5qc29uKCk7cmV0dXJuIG8/LnV1aWQ/bzpudWxsfWNhdGNoe3JldHVybiBudWxsfX0sYXN5bmMgZmlsdGVyTm90ZXModD17fSl7aWYodC5xdWVyeSl0cnl7bGV0IHI9YXdhaXQoYXdhaXQgZmV0Y2goYC9hcGkvbm90ZS1maW5kP25hbWU9JHtlbmNvZGVVUklDb21wb25lbnQodC5xdWVyeSl9YCkpLmpzb24oKTtyZXR1cm4gcj8udXVpZD9bcl06W119Y2F0Y2h7cmV0dXJuW119cmV0dXJuW119LGFzeW5jIGNyZWF0ZU5vdGUodCxuPVtdKXt0cnl7cmV0dXJuKGF3YWl0KGF3YWl0IGZldGNoKCIvYXBpL25vdGUtY3JlYXRlIix7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9LGJvZHk6SlNPTi5zdHJpbmdpZnkoe25hbWU6dCx0YWdzOm59KX0pKS5qc29uKCkpLnV1aWR9Y2F0Y2h7cmV0dXJuIG51bGx9fSxhc3luYyByZXBsYWNlTm90ZUNvbnRlbnQodCxuLHI9e30pe2xldCBvPW5kKHQpO3RyeXtsZXQgYT17dXVpZDpvLGNvbnRlbnQ6bn07cmV0dXJuIHIuc2VjdGlvbiYmKGEuc2VjdGlvbj1yLnNlY3Rpb24pLChhd2FpdChhd2FpdCBmZXRjaCgiL2FwaS9ub3RlLWNvbnRlbnQiLHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn0sYm9keTpKU09OLnN0cmluZ2lmeShhKX0pKS5qc29uKCkpLm9rfHwhMX1jYXRjaHtyZXR1cm4hMX19LGFzeW5jIGluc2VydE5vdGVDb250ZW50KHQsbixyPXt9KXtsZXQgbz1uZCh0KTt0cnl7YXdhaXQgZmV0Y2goIi9hcGkvbm90ZS1hcHBlbmQiLHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn0sYm9keTpKU09OLnN0cmluZ2lmeSh7dXVpZDpvLGNvbnRlbnQ6bixhdEVuZDohIXIuYXRFbmR9KX0pfWNhdGNoe319LGFzeW5jIGF0dGFjaE5vdGVNZWRpYSh0LG4pe18oIltkZXYtYXBwXSBhdHRhY2hOb3RlTWVkaWEgY2FsbGVkLCBkYXRhVVJMIGxlbmd0aDoiLG4/Lmxlbmd0aHx8MCk7dHJ5e2xldCBhPShhd2FpdChhd2FpdCBmZXRjaCgiL2FwaS9hdHRhY2gtbWVkaWEiLHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn0sYm9keTpKU09OLnN0cmluZ2lmeSh7ZGF0YVVSTDpufSl9KSkuanNvbigpKS51cmx8fG51bGw7cmV0dXJuIF8oIltkZXYtYXBwXSBhdHRhY2hOb3RlTWVkaWEgcmVzcG9uc2U6IixhP2BVUkwgcmVjZWl2ZWQ6ICR7YX1gOiJubyBVUkwgaW4gcmVzcG9uc2UiKSxhfWNhdGNoKHIpe3JldHVybiBfKCJbZGV2LWFwcF0gYXR0YWNoTm90ZU1lZGlhIEZBSUxFRDoiLHIpLG51bGx9fSxhc3luYyBwcm9tcHQodCxuPXt9KXtyZXR1cm4gVHgodCxuKX19LHpvfXZhciByZT15ZShtZSgpLDEpO3ZhciBIYT1bIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sQXg9WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXSxhZD1jbGFzc3tjb25zdHJ1Y3Rvcih7aW5kZXg6dCxzaG9ydDpuLGZ1bGw6cixwbGFuOm8sY3VycmVudDphfSl7dGhpcy5pbmRleD10LHRoaXMuc2hvcnQ9bix0aGlzLmZ1bGw9cix0aGlzLnBsYW49byx0aGlzLmN1cnJlbnQ9YX19O2Z1bmN0aW9uIGlkKCl7bGV0IGU9bmV3IERhdGUsdD1lLmdldEZ1bGxZZWFyKCksbj1lLmdldE1vbnRoKCkscj1NYXRoLmZsb29yKG4vMykrMTtyZXR1cm57eWVhcjp0LHF1YXJ0ZXI6cixsYWJlbDpgUSR7cn0gJHt0fWB9fWZ1bmN0aW9uIFRnKGUsdCl7bGV0IG49KGUucXVhcnRlci0xKSozLHI9bmV3IERhdGUoKS5nZXRNb250aCgpLG89W107Zm9yKGxldCBhPTA7YTw2O2ErKyl7bGV0IGk9KG4rYSklMTI7by5wdXNoKG5ldyBhZCh7aW5kZXg6aSxzaG9ydDpBeFtpXSxmdWxsOkhhW2ldLHBsYW46YTwzP2U6dCxjdXJyZW50Omk9PT1yfSkpfXJldHVybiBvfWZ1bmN0aW9uIFZzKCl7bGV0IGU9bmV3IERhdGUsdD1lLmdldERheSgpLG47cmV0dXJuIHQ9PT02P249Mjp0PT09MD9uPTE6bj0xLXQsbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLGUuZ2V0TW9udGgoKSxlLmdldERhdGUoKStuKX1mdW5jdGlvbiBHcyhlKXtyZXR1cm5gV2VlayBvZiAke0hhW2UuZ2V0TW9udGgoKV19ICR7ZS5nZXREYXRlKCl9YH1mdW5jdGlvbiBGbyhlLHQpe2xldCBuPXQucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csIlxcJCYiKSxyPW5ldyBSZWdFeHAoYChefFxcbikoI3sxLDZ9KVxccyske259XFxzKlxcbmAsImkiKSxvPWUubWF0Y2gocik7aWYoIW8pcmV0dXJuIG51bGw7bGV0IGE9by5pbmRleCtvWzBdLmxlbmd0aCxpPWUuc3Vic3RyaW5nKGEpLHM9aS5tYXRjaCgvXG4jezEsNn1ccy8pO3JldHVybihzP2kuc3Vic3RyaW5nKDAscy5pbmRleCk6aSkudHJpbSgpfWZ1bmN0aW9uIHNkKGUpe3JldHVybmAKIyMjICR7ZX0KLSBGb2N1czoKLSBLZXkgbW92ZToKYH1mdW5jdGlvbiBsZChlKXtyZXR1cm5gCiMjIyAke2V9Ci0gUHJpbWFyeSBmb2N1czoKLSBLZXkgdGFza3M6Ci0gQ29tbWl0bWVudHM6CmB9dmFyIHplPSJ0b3AiLFllPSJib3R0b20iLGplPSJyaWdodCIsVWU9ImxlZnQiLEtzPSJhdXRvIixncj1bemUsWWUsamUsVWVdLHpuPSJzdGFydCIsQnI9ImVuZCIsTmc9ImNsaXBwaW5nUGFyZW50cyIsWXM9InZpZXdwb3J0IixVbz0icG9wcGVyIixEZz0icmVmZXJlbmNlIix1ZD1nci5yZWR1Y2UoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5jb25jYXQoW3QrIi0iK3puLHQrIi0iK0JyXSl9LFtdKSxxcz1bXS5jb25jYXQoZ3IsW0tzXSkucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29uY2F0KFt0LHQrIi0iK3puLHQrIi0iK0JyXSl9LFtdKSxDeD0iYmVmb3JlUmVhZCIsT3g9InJlYWQiLE14PSJhZnRlclJlYWQiLFJ4PSJiZWZvcmVNYWluIixJeD0ibWFpbiIsUHg9ImFmdGVyTWFpbiIsTHg9ImJlZm9yZVdyaXRlIix6eD0id3JpdGUiLEZ4PSJhZnRlcldyaXRlIixfZz1bQ3gsT3gsTXgsUngsSXgsUHgsTHgsengsRnhdO2Z1bmN0aW9uIFplKGUpe3JldHVybiBlPyhlLm5vZGVOYW1lfHwiIikudG9Mb3dlckNhc2UoKTpudWxsfWZ1bmN0aW9uIE9lKGUpe2lmKGU9PW51bGwpcmV0dXJuIHdpbmRvdztpZihlLnRvU3RyaW5nKCkhPT0iW29iamVjdCBXaW5kb3ddIil7dmFyIHQ9ZS5vd25lckRvY3VtZW50O3JldHVybiB0JiZ0LmRlZmF1bHRWaWV3fHx3aW5kb3d9cmV0dXJuIGV9ZnVuY3Rpb24gSHQoZSl7dmFyIHQ9T2UoZSkuRWxlbWVudDtyZXR1cm4gZSBpbnN0YW5jZW9mIHR8fGUgaW5zdGFuY2VvZiBFbGVtZW50fWZ1bmN0aW9uIHFlKGUpe3ZhciB0PU9lKGUpLkhUTUxFbGVtZW50O3JldHVybiBlIGluc3RhbmNlb2YgdHx8ZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50fWZ1bmN0aW9uICRvKGUpe2lmKHR5cGVvZiBTaGFkb3dSb290PiJ1IilyZXR1cm4hMTt2YXIgdD1PZShlKS5TaGFkb3dSb290O3JldHVybiBlIGluc3RhbmNlb2YgdHx8ZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3R9ZnVuY3Rpb24gVXgoZSl7dmFyIHQ9ZS5zdGF0ZTtPYmplY3Qua2V5cyh0LmVsZW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3ZhciByPXQuc3R5bGVzW25dfHx7fSxvPXQuYXR0cmlidXRlc1tuXXx8e30sYT10LmVsZW1lbnRzW25dOyFxZShhKXx8IVplKGEpfHwoT2JqZWN0LmFzc2lnbihhLnN0eWxlLHIpLE9iamVjdC5rZXlzKG8pLmZvckVhY2goZnVuY3Rpb24oaSl7dmFyIHM9b1tpXTtzPT09ITE/YS5yZW1vdmVBdHRyaWJ1dGUoaSk6YS5zZXRBdHRyaWJ1dGUoaSxzPT09ITA/IiI6cyl9KSl9KX1mdW5jdGlvbiAkeChlKXt2YXIgdD1lLnN0YXRlLG49e3BvcHBlcjp7cG9zaXRpb246dC5vcHRpb25zLnN0cmF0ZWd5LGxlZnQ6IjAiLHRvcDoiMCIsbWFyZ2luOiIwIn0sYXJyb3c6e3Bvc2l0aW9uOiJhYnNvbHV0ZSJ9LHJlZmVyZW5jZTp7fX07cmV0dXJuIE9iamVjdC5hc3NpZ24odC5lbGVtZW50cy5wb3BwZXIuc3R5bGUsbi5wb3BwZXIpLHQuc3R5bGVzPW4sdC5lbGVtZW50cy5hcnJvdyYmT2JqZWN0LmFzc2lnbih0LmVsZW1lbnRzLmFycm93LnN0eWxlLG4uYXJyb3cpLGZ1bmN0aW9uKCl7T2JqZWN0LmtleXModC5lbGVtZW50cykuZm9yRWFjaChmdW5jdGlvbihyKXt2YXIgbz10LmVsZW1lbnRzW3JdLGE9dC5hdHRyaWJ1dGVzW3JdfHx7fSxpPU9iamVjdC5rZXlzKHQuc3R5bGVzLmhhc093blByb3BlcnR5KHIpP3Quc3R5bGVzW3JdOm5bcl0pLHM9aS5yZWR1Y2UoZnVuY3Rpb24obCx1KXtyZXR1cm4gbFt1XT0iIixsfSx7fSk7IXFlKG8pfHwhWmUobyl8fChPYmplY3QuYXNzaWduKG8uc3R5bGUscyksT2JqZWN0LmtleXMoYSkuZm9yRWFjaChmdW5jdGlvbihsKXtvLnJlbW92ZUF0dHJpYnV0ZShsKX0pKX0pfX12YXIgamE9e25hbWU6ImFwcGx5U3R5bGVzIixlbmFibGVkOiEwLHBoYXNlOiJ3cml0ZSIsZm46VXgsZWZmZWN0OiR4LHJlcXVpcmVzOlsiY29tcHV0ZVN0eWxlcyJdfTtmdW5jdGlvbiBldChlKXtyZXR1cm4gZS5zcGxpdCgiLSIpWzBdfXZhciBhbj1NYXRoLm1heCxXcj1NYXRoLm1pbixGbj1NYXRoLnJvdW5kO2Z1bmN0aW9uIEJvKCl7dmFyIGU9bmF2aWdhdG9yLnVzZXJBZ2VudERhdGE7cmV0dXJuIGUhPW51bGwmJmUuYnJhbmRzJiZBcnJheS5pc0FycmF5KGUuYnJhbmRzKT9lLmJyYW5kcy5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQuYnJhbmQrIi8iK3QudmVyc2lvbn0pLmpvaW4oIiAiKTpuYXZpZ2F0b3IudXNlckFnZW50fWZ1bmN0aW9uIFZhKCl7cmV0dXJuIS9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QoQm8oKSl9ZnVuY3Rpb24ganQoZSx0LG4pe3Q9PT12b2lkIDAmJih0PSExKSxuPT09dm9pZCAwJiYobj0hMSk7dmFyIHI9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxvPTEsYT0xO3QmJnFlKGUpJiYobz1lLm9mZnNldFdpZHRoPjAmJkZuKHIud2lkdGgpL2Uub2Zmc2V0V2lkdGh8fDEsYT1lLm9mZnNldEhlaWdodD4wJiZGbihyLmhlaWdodCkvZS5vZmZzZXRIZWlnaHR8fDEpO3ZhciBpPUh0KGUpP09lKGUpOndpbmRvdyxzPWkudmlzdWFsVmlld3BvcnQsbD0hVmEoKSYmbix1PShyLmxlZnQrKGwmJnM/cy5vZmZzZXRMZWZ0OjApKS9vLGM9KHIudG9wKyhsJiZzP3Mub2Zmc2V0VG9wOjApKS9hLGQ9ci53aWR0aC9vLHA9ci5oZWlnaHQvYTtyZXR1cm57d2lkdGg6ZCxoZWlnaHQ6cCx0b3A6YyxyaWdodDp1K2QsYm90dG9tOmMrcCxsZWZ0OnUseDp1LHk6Y319ZnVuY3Rpb24gSHIoZSl7dmFyIHQ9anQoZSksbj1lLm9mZnNldFdpZHRoLHI9ZS5vZmZzZXRIZWlnaHQ7cmV0dXJuIE1hdGguYWJzKHQud2lkdGgtbik8PTEmJihuPXQud2lkdGgpLE1hdGguYWJzKHQuaGVpZ2h0LXIpPD0xJiYocj10LmhlaWdodCkse3g6ZS5vZmZzZXRMZWZ0LHk6ZS5vZmZzZXRUb3Asd2lkdGg6bixoZWlnaHQ6cn19ZnVuY3Rpb24gR2EoZSx0KXt2YXIgbj10LmdldFJvb3ROb2RlJiZ0LmdldFJvb3ROb2RlKCk7aWYoZS5jb250YWlucyh0KSlyZXR1cm4hMDtpZihuJiYkbyhuKSl7dmFyIHI9dDtkb3tpZihyJiZlLmlzU2FtZU5vZGUocikpcmV0dXJuITA7cj1yLnBhcmVudE5vZGV8fHIuaG9zdH13aGlsZShyKX1yZXR1cm4hMX1mdW5jdGlvbiBndChlKXtyZXR1cm4gT2UoZSkuZ2V0Q29tcHV0ZWRTdHlsZShlKX1mdW5jdGlvbiBjZChlKXtyZXR1cm5bInRhYmxlIiwidGQiLCJ0aCJdLmluZGV4T2YoWmUoZSkpPj0wfWZ1bmN0aW9uIG90KGUpe3JldHVybigoSHQoZSk/ZS5vd25lckRvY3VtZW50OmUuZG9jdW1lbnQpfHx3aW5kb3cuZG9jdW1lbnQpLmRvY3VtZW50RWxlbWVudH1mdW5jdGlvbiBVbihlKXtyZXR1cm4gWmUoZSk9PT0iaHRtbCI/ZTplLmFzc2lnbmVkU2xvdHx8ZS5wYXJlbnROb2RlfHwoJG8oZSk/ZS5ob3N0Om51bGwpfHxvdChlKX1mdW5jdGlvbiBBZyhlKXtyZXR1cm4hcWUoZSl8fGd0KGUpLnBvc2l0aW9uPT09ImZpeGVkIj9udWxsOmUub2Zmc2V0UGFyZW50fWZ1bmN0aW9uIEJ4KGUpe3ZhciB0PS9maXJlZm94L2kudGVzdChCbygpKSxuPS9UcmlkZW50L2kudGVzdChCbygpKTtpZihuJiZxZShlKSl7dmFyIHI9Z3QoZSk7aWYoci5wb3NpdGlvbj09PSJmaXhlZCIpcmV0dXJuIG51bGx9dmFyIG89VW4oZSk7Zm9yKCRvKG8pJiYobz1vLmhvc3QpO3FlKG8pJiZbImh0bWwiLCJib2R5Il0uaW5kZXhPZihaZShvKSk8MDspe3ZhciBhPWd0KG8pO2lmKGEudHJhbnNmb3JtIT09Im5vbmUifHxhLnBlcnNwZWN0aXZlIT09Im5vbmUifHxhLmNvbnRhaW49PT0icGFpbnQifHxbInRyYW5zZm9ybSIsInBlcnNwZWN0aXZlIl0uaW5kZXhPZihhLndpbGxDaGFuZ2UpIT09LTF8fHQmJmEud2lsbENoYW5nZT09PSJmaWx0ZXIifHx0JiZhLmZpbHRlciYmYS5maWx0ZXIhPT0ibm9uZSIpcmV0dXJuIG87bz1vLnBhcmVudE5vZGV9cmV0dXJuIG51bGx9ZnVuY3Rpb24gc24oZSl7Zm9yKHZhciB0PU9lKGUpLG49QWcoZSk7biYmY2QobikmJmd0KG4pLnBvc2l0aW9uPT09InN0YXRpYyI7KW49QWcobik7cmV0dXJuIG4mJihaZShuKT09PSJodG1sInx8WmUobik9PT0iYm9keSImJmd0KG4pLnBvc2l0aW9uPT09InN0YXRpYyIpP3Q6bnx8QngoZSl8fHR9ZnVuY3Rpb24ganIoZSl7cmV0dXJuWyJ0b3AiLCJib3R0b20iXS5pbmRleE9mKGUpPj0wPyJ4IjoieSJ9ZnVuY3Rpb24gVnIoZSx0LG4pe3JldHVybiBhbihlLFdyKHQsbikpfWZ1bmN0aW9uIENnKGUsdCxuKXt2YXIgcj1WcihlLHQsbik7cmV0dXJuIHI+bj9uOnJ9ZnVuY3Rpb24gS2EoKXtyZXR1cm57dG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjB9fWZ1bmN0aW9uIFlhKGUpe3JldHVybiBPYmplY3QuYXNzaWduKHt9LEthKCksZSl9ZnVuY3Rpb24gcWEoZSx0KXtyZXR1cm4gdC5yZWR1Y2UoZnVuY3Rpb24obixyKXtyZXR1cm4gbltyXT1lLG59LHt9KX12YXIgV3g9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdD10eXBlb2YgdD09ImZ1bmN0aW9uIj90KE9iamVjdC5hc3NpZ24oe30sbi5yZWN0cyx7cGxhY2VtZW50Om4ucGxhY2VtZW50fSkpOnQsWWEodHlwZW9mIHQhPSJudW1iZXIiP3Q6cWEodCxncikpfTtmdW5jdGlvbiBIeChlKXt2YXIgdCxuPWUuc3RhdGUscj1lLm5hbWUsbz1lLm9wdGlvbnMsYT1uLmVsZW1lbnRzLmFycm93LGk9bi5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMscz1ldChuLnBsYWNlbWVudCksbD1qcihzKSx1PVtVZSxqZV0uaW5kZXhPZihzKT49MCxjPXU/ImhlaWdodCI6IndpZHRoIjtpZighKCFhfHwhaSkpe3ZhciBkPVd4KG8ucGFkZGluZyxuKSxwPUhyKGEpLHk9bD09PSJ5Ij96ZTpVZSxoPWw9PT0ieSI/WWU6amUsdz1uLnJlY3RzLnJlZmVyZW5jZVtjXStuLnJlY3RzLnJlZmVyZW5jZVtsXS1pW2xdLW4ucmVjdHMucG9wcGVyW2NdLGI9aVtsXS1uLnJlY3RzLnJlZmVyZW5jZVtsXSxnPXNuKGEpLG09Zz9sPT09InkiP2cuY2xpZW50SGVpZ2h0fHwwOmcuY2xpZW50V2lkdGh8fDA6MCx2PXcvMi1iLzIsZj1kW3ldLEU9bS1wW2NdLWRbaF0saz1tLzItcFtjXS8yK3YsTj1WcihmLGssRSksRD1sO24ubW9kaWZpZXJzRGF0YVtyXT0odD17fSx0W0RdPU4sdC5jZW50ZXJPZmZzZXQ9Ti1rLHQpfX1mdW5jdGlvbiBqeChlKXt2YXIgdD1lLnN0YXRlLG49ZS5vcHRpb25zLHI9bi5lbGVtZW50LG89cj09PXZvaWQgMD8iW2RhdGEtcG9wcGVyLWFycm93XSI6cjtvIT1udWxsJiYodHlwZW9mIG89PSJzdHJpbmciJiYobz10LmVsZW1lbnRzLnBvcHBlci5xdWVyeVNlbGVjdG9yKG8pLCFvKXx8R2EodC5lbGVtZW50cy5wb3BwZXIsbykmJih0LmVsZW1lbnRzLmFycm93PW8pKX12YXIgT2c9e25hbWU6ImFycm93IixlbmFibGVkOiEwLHBoYXNlOiJtYWluIixmbjpIeCxlZmZlY3Q6angscmVxdWlyZXM6WyJwb3BwZXJPZmZzZXRzIl0scmVxdWlyZXNJZkV4aXN0czpbInByZXZlbnRPdmVyZmxvdyJdfTtmdW5jdGlvbiBWdChlKXtyZXR1cm4gZS5zcGxpdCgiLSIpWzFdfXZhciBWeD17dG9wOiJhdXRvIixyaWdodDoiYXV0byIsYm90dG9tOiJhdXRvIixsZWZ0OiJhdXRvIn07ZnVuY3Rpb24gR3goZSx0KXt2YXIgbj1lLngscj1lLnksbz10LmRldmljZVBpeGVsUmF0aW98fDE7cmV0dXJue3g6Rm4obipvKS9vfHwwLHk6Rm4ocipvKS9vfHwwfX1mdW5jdGlvbiBNZyhlKXt2YXIgdCxuPWUucG9wcGVyLHI9ZS5wb3BwZXJSZWN0LG89ZS5wbGFjZW1lbnQsYT1lLnZhcmlhdGlvbixpPWUub2Zmc2V0cyxzPWUucG9zaXRpb24sbD1lLmdwdUFjY2VsZXJhdGlvbix1PWUuYWRhcHRpdmUsYz1lLnJvdW5kT2Zmc2V0cyxkPWUuaXNGaXhlZCxwPWkueCx5PXA9PT12b2lkIDA/MDpwLGg9aS55LHc9aD09PXZvaWQgMD8wOmgsYj10eXBlb2YgYz09ImZ1bmN0aW9uIj9jKHt4OnkseTp3fSk6e3g6eSx5Ond9O3k9Yi54LHc9Yi55O3ZhciBnPWkuaGFzT3duUHJvcGVydHkoIngiKSxtPWkuaGFzT3duUHJvcGVydHkoInkiKSx2PVVlLGY9emUsRT13aW5kb3c7aWYodSl7dmFyIGs9c24obiksTj0iY2xpZW50SGVpZ2h0IixEPSJjbGllbnRXaWR0aCI7aWYoaz09PU9lKG4pJiYoaz1vdChuKSxndChrKS5wb3NpdGlvbiE9PSJzdGF0aWMiJiZzPT09ImFic29sdXRlIiYmKE49InNjcm9sbEhlaWdodCIsRD0ic2Nyb2xsV2lkdGgiKSksaz1rLG89PT16ZXx8KG89PT1VZXx8bz09PWplKSYmYT09PUJyKXtmPVllO3ZhciBPPWQmJms9PT1FJiZFLnZpc3VhbFZpZXdwb3J0P0UudmlzdWFsVmlld3BvcnQuaGVpZ2h0OmtbTl07dy09Ty1yLmhlaWdodCx3Kj1sPzE6LTF9aWYobz09PVVlfHwobz09PXplfHxvPT09WWUpJiZhPT09QnIpe3Y9amU7dmFyIFQ9ZCYmaz09PUUmJkUudmlzdWFsVmlld3BvcnQ/RS52aXN1YWxWaWV3cG9ydC53aWR0aDprW0RdO3ktPVQtci53aWR0aCx5Kj1sPzE6LTF9fXZhciB6PU9iamVjdC5hc3NpZ24oe3Bvc2l0aW9uOnN9LHUmJlZ4KSxQPWM9PT0hMD9HeCh7eDp5LHk6d30sT2UobikpOnt4OnkseTp3fTtpZih5PVAueCx3PVAueSxsKXt2YXIgQztyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSx6LChDPXt9LENbZl09bT8iMCI6IiIsQ1t2XT1nPyIwIjoiIixDLnRyYW5zZm9ybT0oRS5kZXZpY2VQaXhlbFJhdGlvfHwxKTw9MT8idHJhbnNsYXRlKCIreSsicHgsICIrdysicHgpIjoidHJhbnNsYXRlM2QoIit5KyJweCwgIit3KyJweCwgMCkiLEMpKX1yZXR1cm4gT2JqZWN0LmFzc2lnbih7fSx6LCh0PXt9LHRbZl09bT93KyJweCI6IiIsdFt2XT1nP3krInB4IjoiIix0LnRyYW5zZm9ybT0iIix0KSl9ZnVuY3Rpb24gS3goZSl7dmFyIHQ9ZS5zdGF0ZSxuPWUub3B0aW9ucyxyPW4uZ3B1QWNjZWxlcmF0aW9uLG89cj09PXZvaWQgMD8hMDpyLGE9bi5hZGFwdGl2ZSxpPWE9PT12b2lkIDA/ITA6YSxzPW4ucm91bmRPZmZzZXRzLGw9cz09PXZvaWQgMD8hMDpzLHU9e3BsYWNlbWVudDpldCh0LnBsYWNlbWVudCksdmFyaWF0aW9uOlZ0KHQucGxhY2VtZW50KSxwb3BwZXI6dC5lbGVtZW50cy5wb3BwZXIscG9wcGVyUmVjdDp0LnJlY3RzLnBvcHBlcixncHVBY2NlbGVyYXRpb246byxpc0ZpeGVkOnQub3B0aW9ucy5zdHJhdGVneT09PSJmaXhlZCJ9O3QubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzIT1udWxsJiYodC5zdHlsZXMucG9wcGVyPU9iamVjdC5hc3NpZ24oe30sdC5zdHlsZXMucG9wcGVyLE1nKE9iamVjdC5hc3NpZ24oe30sdSx7b2Zmc2V0czp0Lm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyxwb3NpdGlvbjp0Lm9wdGlvbnMuc3RyYXRlZ3ksYWRhcHRpdmU6aSxyb3VuZE9mZnNldHM6bH0pKSkpLHQubW9kaWZpZXJzRGF0YS5hcnJvdyE9bnVsbCYmKHQuc3R5bGVzLmFycm93PU9iamVjdC5hc3NpZ24oe30sdC5zdHlsZXMuYXJyb3csTWcoT2JqZWN0LmFzc2lnbih7fSx1LHtvZmZzZXRzOnQubW9kaWZpZXJzRGF0YS5hcnJvdyxwb3NpdGlvbjoiYWJzb2x1dGUiLGFkYXB0aXZlOiExLHJvdW5kT2Zmc2V0czpsfSkpKSksdC5hdHRyaWJ1dGVzLnBvcHBlcj1PYmplY3QuYXNzaWduKHt9LHQuYXR0cmlidXRlcy5wb3BwZXIseyJkYXRhLXBvcHBlci1wbGFjZW1lbnQiOnQucGxhY2VtZW50fSl9dmFyIFJnPXtuYW1lOiJjb21wdXRlU3R5bGVzIixlbmFibGVkOiEwLHBoYXNlOiJiZWZvcmVXcml0ZSIsZm46S3gsZGF0YTp7fX07dmFyIFFzPXtwYXNzaXZlOiEwfTtmdW5jdGlvbiBZeChlKXt2YXIgdD1lLnN0YXRlLG49ZS5pbnN0YW5jZSxyPWUub3B0aW9ucyxvPXIuc2Nyb2xsLGE9bz09PXZvaWQgMD8hMDpvLGk9ci5yZXNpemUscz1pPT09dm9pZCAwPyEwOmksbD1PZSh0LmVsZW1lbnRzLnBvcHBlciksdT1bXS5jb25jYXQodC5zY3JvbGxQYXJlbnRzLnJlZmVyZW5jZSx0LnNjcm9sbFBhcmVudHMucG9wcGVyKTtyZXR1cm4gYSYmdS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2MuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixuLnVwZGF0ZSxRcyl9KSxzJiZsLmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsbi51cGRhdGUsUXMpLGZ1bmN0aW9uKCl7YSYmdS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixuLnVwZGF0ZSxRcyl9KSxzJiZsLnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsbi51cGRhdGUsUXMpfX12YXIgSWc9e25hbWU6ImV2ZW50TGlzdGVuZXJzIixlbmFibGVkOiEwLHBoYXNlOiJ3cml0ZSIsZm46ZnVuY3Rpb24oKXt9LGVmZmVjdDpZeCxkYXRhOnt9fTt2YXIgcXg9e2xlZnQ6InJpZ2h0IixyaWdodDoibGVmdCIsYm90dG9tOiJ0b3AiLHRvcDoiYm90dG9tIn07ZnVuY3Rpb24gV28oZSl7cmV0dXJuIGUucmVwbGFjZSgvbGVmdHxyaWdodHxib3R0b218dG9wL2csZnVuY3Rpb24odCl7cmV0dXJuIHF4W3RdfSl9dmFyIFF4PXtzdGFydDoiZW5kIixlbmQ6InN0YXJ0In07ZnVuY3Rpb24gSnMoZSl7cmV0dXJuIGUucmVwbGFjZSgvc3RhcnR8ZW5kL2csZnVuY3Rpb24odCl7cmV0dXJuIFF4W3RdfSl9ZnVuY3Rpb24gR3IoZSl7dmFyIHQ9T2UoZSksbj10LnBhZ2VYT2Zmc2V0LHI9dC5wYWdlWU9mZnNldDtyZXR1cm57c2Nyb2xsTGVmdDpuLHNjcm9sbFRvcDpyfX1mdW5jdGlvbiBLcihlKXtyZXR1cm4ganQob3QoZSkpLmxlZnQrR3IoZSkuc2Nyb2xsTGVmdH1mdW5jdGlvbiBkZChlLHQpe3ZhciBuPU9lKGUpLHI9b3QoZSksbz1uLnZpc3VhbFZpZXdwb3J0LGE9ci5jbGllbnRXaWR0aCxpPXIuY2xpZW50SGVpZ2h0LHM9MCxsPTA7aWYobyl7YT1vLndpZHRoLGk9by5oZWlnaHQ7dmFyIHU9VmEoKTsodXx8IXUmJnQ9PT0iZml4ZWQiKSYmKHM9by5vZmZzZXRMZWZ0LGw9by5vZmZzZXRUb3ApfXJldHVybnt3aWR0aDphLGhlaWdodDppLHg6cytLcihlKSx5Omx9fWZ1bmN0aW9uIHBkKGUpe3ZhciB0LG49b3QoZSkscj1HcihlKSxvPSh0PWUub3duZXJEb2N1bWVudCk9PW51bGw/dm9pZCAwOnQuYm9keSxhPWFuKG4uc2Nyb2xsV2lkdGgsbi5jbGllbnRXaWR0aCxvP28uc2Nyb2xsV2lkdGg6MCxvP28uY2xpZW50V2lkdGg6MCksaT1hbihuLnNjcm9sbEhlaWdodCxuLmNsaWVudEhlaWdodCxvP28uc2Nyb2xsSGVpZ2h0OjAsbz9vLmNsaWVudEhlaWdodDowKSxzPS1yLnNjcm9sbExlZnQrS3IoZSksbD0tci5zY3JvbGxUb3A7cmV0dXJuIGd0KG98fG4pLmRpcmVjdGlvbj09PSJydGwiJiYocys9YW4obi5jbGllbnRXaWR0aCxvP28uY2xpZW50V2lkdGg6MCktYSkse3dpZHRoOmEsaGVpZ2h0OmkseDpzLHk6bH19ZnVuY3Rpb24gWXIoZSl7dmFyIHQ9Z3QoZSksbj10Lm92ZXJmbG93LHI9dC5vdmVyZmxvd1gsbz10Lm92ZXJmbG93WTtyZXR1cm4vYXV0b3xzY3JvbGx8b3ZlcmxheXxoaWRkZW4vLnRlc3QobitvK3IpfWZ1bmN0aW9uIFhzKGUpe3JldHVyblsiaHRtbCIsImJvZHkiLCIjZG9jdW1lbnQiXS5pbmRleE9mKFplKGUpKT49MD9lLm93bmVyRG9jdW1lbnQuYm9keTpxZShlKSYmWXIoZSk/ZTpYcyhVbihlKSl9ZnVuY3Rpb24geXIoZSx0KXt2YXIgbjt0PT09dm9pZCAwJiYodD1bXSk7dmFyIHI9WHMoZSksbz1yPT09KChuPWUub3duZXJEb2N1bWVudCk9PW51bGw/dm9pZCAwOm4uYm9keSksYT1PZShyKSxpPW8/W2FdLmNvbmNhdChhLnZpc3VhbFZpZXdwb3J0fHxbXSxZcihyKT9yOltdKTpyLHM9dC5jb25jYXQoaSk7cmV0dXJuIG8/czpzLmNvbmNhdCh5cihVbihpKSkpfWZ1bmN0aW9uIEhvKGUpe3JldHVybiBPYmplY3QuYXNzaWduKHt9LGUse2xlZnQ6ZS54LHRvcDplLnkscmlnaHQ6ZS54K2Uud2lkdGgsYm90dG9tOmUueStlLmhlaWdodH0pfWZ1bmN0aW9uIEp4KGUsdCl7dmFyIG49anQoZSwhMSx0PT09ImZpeGVkIik7cmV0dXJuIG4udG9wPW4udG9wK2UuY2xpZW50VG9wLG4ubGVmdD1uLmxlZnQrZS5jbGllbnRMZWZ0LG4uYm90dG9tPW4udG9wK2UuY2xpZW50SGVpZ2h0LG4ucmlnaHQ9bi5sZWZ0K2UuY2xpZW50V2lkdGgsbi53aWR0aD1lLmNsaWVudFdpZHRoLG4uaGVpZ2h0PWUuY2xpZW50SGVpZ2h0LG4ueD1uLmxlZnQsbi55PW4udG9wLG59ZnVuY3Rpb24gUGcoZSx0LG4pe3JldHVybiB0PT09WXM/SG8oZGQoZSxuKSk6SHQodCk/SngodCxuKTpIbyhwZChvdChlKSkpfWZ1bmN0aW9uIFh4KGUpe3ZhciB0PXlyKFVuKGUpKSxuPVsiYWJzb2x1dGUiLCJmaXhlZCJdLmluZGV4T2YoZ3QoZSkucG9zaXRpb24pPj0wLHI9biYmcWUoZSk/c24oZSk6ZTtyZXR1cm4gSHQocik/dC5maWx0ZXIoZnVuY3Rpb24obyl7cmV0dXJuIEh0KG8pJiZHYShvLHIpJiZaZShvKSE9PSJib2R5In0pOltdfWZ1bmN0aW9uIGZkKGUsdCxuLHIpe3ZhciBvPXQ9PT0iY2xpcHBpbmdQYXJlbnRzIj9YeChlKTpbXS5jb25jYXQodCksYT1bXS5jb25jYXQobyxbbl0pLGk9YVswXSxzPWEucmVkdWNlKGZ1bmN0aW9uKGwsdSl7dmFyIGM9UGcoZSx1LHIpO3JldHVybiBsLnRvcD1hbihjLnRvcCxsLnRvcCksbC5yaWdodD1XcihjLnJpZ2h0LGwucmlnaHQpLGwuYm90dG9tPVdyKGMuYm90dG9tLGwuYm90dG9tKSxsLmxlZnQ9YW4oYy5sZWZ0LGwubGVmdCksbH0sUGcoZSxpLHIpKTtyZXR1cm4gcy53aWR0aD1zLnJpZ2h0LXMubGVmdCxzLmhlaWdodD1zLmJvdHRvbS1zLnRvcCxzLng9cy5sZWZ0LHMueT1zLnRvcCxzfWZ1bmN0aW9uIFFhKGUpe3ZhciB0PWUucmVmZXJlbmNlLG49ZS5lbGVtZW50LHI9ZS5wbGFjZW1lbnQsbz1yP2V0KHIpOm51bGwsYT1yP1Z0KHIpOm51bGwsaT10LngrdC53aWR0aC8yLW4ud2lkdGgvMixzPXQueSt0LmhlaWdodC8yLW4uaGVpZ2h0LzIsbDtzd2l0Y2gobyl7Y2FzZSB6ZTpsPXt4OmkseTp0Lnktbi5oZWlnaHR9O2JyZWFrO2Nhc2UgWWU6bD17eDppLHk6dC55K3QuaGVpZ2h0fTticmVhaztjYXNlIGplOmw9e3g6dC54K3Qud2lkdGgseTpzfTticmVhaztjYXNlIFVlOmw9e3g6dC54LW4ud2lkdGgseTpzfTticmVhaztkZWZhdWx0Omw9e3g6dC54LHk6dC55fX12YXIgdT1vP2pyKG8pOm51bGw7aWYodSE9bnVsbCl7dmFyIGM9dT09PSJ5Ij8iaGVpZ2h0Ijoid2lkdGgiO3N3aXRjaChhKXtjYXNlIHpuOmxbdV09bFt1XS0odFtjXS8yLW5bY10vMik7YnJlYWs7Y2FzZSBCcjpsW3VdPWxbdV0rKHRbY10vMi1uW2NdLzIpO2JyZWFrO2RlZmF1bHQ6fX1yZXR1cm4gbH1mdW5jdGlvbiBsbihlLHQpe3Q9PT12b2lkIDAmJih0PXt9KTt2YXIgbj10LHI9bi5wbGFjZW1lbnQsbz1yPT09dm9pZCAwP2UucGxhY2VtZW50OnIsYT1uLnN0cmF0ZWd5LGk9YT09PXZvaWQgMD9lLnN0cmF0ZWd5OmEscz1uLmJvdW5kYXJ5LGw9cz09PXZvaWQgMD9OZzpzLHU9bi5yb290Qm91bmRhcnksYz11PT09dm9pZCAwP1lzOnUsZD1uLmVsZW1lbnRDb250ZXh0LHA9ZD09PXZvaWQgMD9VbzpkLHk9bi5hbHRCb3VuZGFyeSxoPXk9PT12b2lkIDA/ITE6eSx3PW4ucGFkZGluZyxiPXc9PT12b2lkIDA/MDp3LGc9WWEodHlwZW9mIGIhPSJudW1iZXIiP2I6cWEoYixncikpLG09cD09PVVvP0RnOlVvLHY9ZS5yZWN0cy5wb3BwZXIsZj1lLmVsZW1lbnRzW2g/bTpwXSxFPWZkKEh0KGYpP2Y6Zi5jb250ZXh0RWxlbWVudHx8b3QoZS5lbGVtZW50cy5wb3BwZXIpLGwsYyxpKSxrPWp0KGUuZWxlbWVudHMucmVmZXJlbmNlKSxOPVFhKHtyZWZlcmVuY2U6ayxlbGVtZW50OnYsc3RyYXRlZ3k6ImFic29sdXRlIixwbGFjZW1lbnQ6b30pLEQ9SG8oT2JqZWN0LmFzc2lnbih7fSx2LE4pKSxPPXA9PT1Vbz9EOmssVD17dG9wOkUudG9wLU8udG9wK2cudG9wLGJvdHRvbTpPLmJvdHRvbS1FLmJvdHRvbStnLmJvdHRvbSxsZWZ0OkUubGVmdC1PLmxlZnQrZy5sZWZ0LHJpZ2h0Ok8ucmlnaHQtRS5yaWdodCtnLnJpZ2h0fSx6PWUubW9kaWZpZXJzRGF0YS5vZmZzZXQ7aWYocD09PVVvJiZ6KXt2YXIgUD16W29dO09iamVjdC5rZXlzKFQpLmZvckVhY2goZnVuY3Rpb24oQyl7dmFyIEw9W2plLFllXS5pbmRleE9mKEMpPj0wPzE6LTEsJD1bemUsWWVdLmluZGV4T2YoQyk+PTA/InkiOiJ4IjtUW0NdKz1QWyRdKkx9KX1yZXR1cm4gVH1mdW5jdGlvbiBtZChlLHQpe3Q9PT12b2lkIDAmJih0PXt9KTt2YXIgbj10LHI9bi5wbGFjZW1lbnQsbz1uLmJvdW5kYXJ5LGE9bi5yb290Qm91bmRhcnksaT1uLnBhZGRpbmcscz1uLmZsaXBWYXJpYXRpb25zLGw9bi5hbGxvd2VkQXV0b1BsYWNlbWVudHMsdT1sPT09dm9pZCAwP3FzOmwsYz1WdChyKSxkPWM/cz91ZDp1ZC5maWx0ZXIoZnVuY3Rpb24oaCl7cmV0dXJuIFZ0KGgpPT09Y30pOmdyLHA9ZC5maWx0ZXIoZnVuY3Rpb24oaCl7cmV0dXJuIHUuaW5kZXhPZihoKT49MH0pO3AubGVuZ3RoPT09MCYmKHA9ZCk7dmFyIHk9cC5yZWR1Y2UoZnVuY3Rpb24oaCx3KXtyZXR1cm4gaFt3XT1sbihlLHtwbGFjZW1lbnQ6dyxib3VuZGFyeTpvLHJvb3RCb3VuZGFyeTphLHBhZGRpbmc6aX0pW2V0KHcpXSxofSx7fSk7cmV0dXJuIE9iamVjdC5rZXlzKHkpLnNvcnQoZnVuY3Rpb24oaCx3KXtyZXR1cm4geVtoXS15W3ddfSl9ZnVuY3Rpb24gWngoZSl7aWYoZXQoZSk9PT1LcylyZXR1cm5bXTt2YXIgdD1XbyhlKTtyZXR1cm5bSnMoZSksdCxKcyh0KV19ZnVuY3Rpb24gZWsoZSl7dmFyIHQ9ZS5zdGF0ZSxuPWUub3B0aW9ucyxyPWUubmFtZTtpZighdC5tb2RpZmllcnNEYXRhW3JdLl9za2lwKXtmb3IodmFyIG89bi5tYWluQXhpcyxhPW89PT12b2lkIDA/ITA6byxpPW4uYWx0QXhpcyxzPWk9PT12b2lkIDA/ITA6aSxsPW4uZmFsbGJhY2tQbGFjZW1lbnRzLHU9bi5wYWRkaW5nLGM9bi5ib3VuZGFyeSxkPW4ucm9vdEJvdW5kYXJ5LHA9bi5hbHRCb3VuZGFyeSx5PW4uZmxpcFZhcmlhdGlvbnMsaD15PT09dm9pZCAwPyEwOnksdz1uLmFsbG93ZWRBdXRvUGxhY2VtZW50cyxiPXQub3B0aW9ucy5wbGFjZW1lbnQsZz1ldChiKSxtPWc9PT1iLHY9bHx8KG18fCFoP1tXbyhiKV06WngoYikpLGY9W2JdLmNvbmNhdCh2KS5yZWR1Y2UoZnVuY3Rpb24oSCxZKXtyZXR1cm4gSC5jb25jYXQoZXQoWSk9PT1Lcz9tZCh0LHtwbGFjZW1lbnQ6WSxib3VuZGFyeTpjLHJvb3RCb3VuZGFyeTpkLHBhZGRpbmc6dSxmbGlwVmFyaWF0aW9uczpoLGFsbG93ZWRBdXRvUGxhY2VtZW50czp3fSk6WSl9LFtdKSxFPXQucmVjdHMucmVmZXJlbmNlLGs9dC5yZWN0cy5wb3BwZXIsTj1uZXcgTWFwLEQ9ITAsTz1mWzBdLFQ9MDtUPGYubGVuZ3RoO1QrKyl7dmFyIHo9ZltUXSxQPWV0KHopLEM9VnQoeik9PT16bixMPVt6ZSxZZV0uaW5kZXhPZihQKT49MCwkPUw/IndpZHRoIjoiaGVpZ2h0IixXPWxuKHQse3BsYWNlbWVudDp6LGJvdW5kYXJ5OmMscm9vdEJvdW5kYXJ5OmQsYWx0Qm91bmRhcnk6cCxwYWRkaW5nOnV9KSxNPUw/Qz9qZTpVZTpDP1llOnplO0VbJF0+a1skXSYmKE09V28oTSkpO3ZhciBLPVdvKE0pLG9lPVtdO2lmKGEmJm9lLnB1c2goV1tQXTw9MCkscyYmb2UucHVzaChXW01dPD0wLFdbS108PTApLG9lLmV2ZXJ5KGZ1bmN0aW9uKEgpe3JldHVybiBIfSkpe089eixEPSExO2JyZWFrfU4uc2V0KHosb2UpfWlmKEQpZm9yKHZhciBTPWg/MzoxLHg9ZnVuY3Rpb24oWSl7dmFyIHE9Zi5maW5kKGZ1bmN0aW9uKFYpe3ZhciBKPU4uZ2V0KFYpO2lmKEopcmV0dXJuIEouc2xpY2UoMCxZKS5ldmVyeShmdW5jdGlvbihRKXtyZXR1cm4gUX0pfSk7aWYocSlyZXR1cm4gTz1xLCJicmVhayJ9LFI9UztSPjA7Ui0tKXt2YXIgQj14KFIpO2lmKEI9PT0iYnJlYWsiKWJyZWFrfXQucGxhY2VtZW50IT09TyYmKHQubW9kaWZpZXJzRGF0YVtyXS5fc2tpcD0hMCx0LnBsYWNlbWVudD1PLHQucmVzZXQ9ITApfX12YXIgTGc9e25hbWU6ImZsaXAiLGVuYWJsZWQ6ITAscGhhc2U6Im1haW4iLGZuOmVrLHJlcXVpcmVzSWZFeGlzdHM6WyJvZmZzZXQiXSxkYXRhOntfc2tpcDohMX19O2Z1bmN0aW9uIHpnKGUsdCxuKXtyZXR1cm4gbj09PXZvaWQgMCYmKG49e3g6MCx5OjB9KSx7dG9wOmUudG9wLXQuaGVpZ2h0LW4ueSxyaWdodDplLnJpZ2h0LXQud2lkdGgrbi54LGJvdHRvbTplLmJvdHRvbS10LmhlaWdodCtuLnksbGVmdDplLmxlZnQtdC53aWR0aC1uLnh9fWZ1bmN0aW9uIEZnKGUpe3JldHVyblt6ZSxqZSxZZSxVZV0uc29tZShmdW5jdGlvbih0KXtyZXR1cm4gZVt0XT49MH0pfWZ1bmN0aW9uIHRrKGUpe3ZhciB0PWUuc3RhdGUsbj1lLm5hbWUscj10LnJlY3RzLnJlZmVyZW5jZSxvPXQucmVjdHMucG9wcGVyLGE9dC5tb2RpZmllcnNEYXRhLnByZXZlbnRPdmVyZmxvdyxpPWxuKHQse2VsZW1lbnRDb250ZXh0OiJyZWZlcmVuY2UifSkscz1sbih0LHthbHRCb3VuZGFyeTohMH0pLGw9emcoaSxyKSx1PXpnKHMsbyxhKSxjPUZnKGwpLGQ9RmcodSk7dC5tb2RpZmllcnNEYXRhW25dPXtyZWZlcmVuY2VDbGlwcGluZ09mZnNldHM6bCxwb3BwZXJFc2NhcGVPZmZzZXRzOnUsaXNSZWZlcmVuY2VIaWRkZW46YyxoYXNQb3BwZXJFc2NhcGVkOmR9LHQuYXR0cmlidXRlcy5wb3BwZXI9T2JqZWN0LmFzc2lnbih7fSx0LmF0dHJpYnV0ZXMucG9wcGVyLHsiZGF0YS1wb3BwZXItcmVmZXJlbmNlLWhpZGRlbiI6YywiZGF0YS1wb3BwZXItZXNjYXBlZCI6ZH0pfXZhciBVZz17bmFtZToiaGlkZSIsZW5hYmxlZDohMCxwaGFzZToibWFpbiIscmVxdWlyZXNJZkV4aXN0czpbInByZXZlbnRPdmVyZmxvdyJdLGZuOnRrfTtmdW5jdGlvbiBuayhlLHQsbil7dmFyIHI9ZXQoZSksbz1bVWUsemVdLmluZGV4T2Yocik+PTA/LTE6MSxhPXR5cGVvZiBuPT0iZnVuY3Rpb24iP24oT2JqZWN0LmFzc2lnbih7fSx0LHtwbGFjZW1lbnQ6ZX0pKTpuLGk9YVswXSxzPWFbMV07cmV0dXJuIGk9aXx8MCxzPShzfHwwKSpvLFtVZSxqZV0uaW5kZXhPZihyKT49MD97eDpzLHk6aX06e3g6aSx5OnN9fWZ1bmN0aW9uIHJrKGUpe3ZhciB0PWUuc3RhdGUsbj1lLm9wdGlvbnMscj1lLm5hbWUsbz1uLm9mZnNldCxhPW89PT12b2lkIDA/WzAsMF06byxpPXFzLnJlZHVjZShmdW5jdGlvbihjLGQpe3JldHVybiBjW2RdPW5rKGQsdC5yZWN0cyxhKSxjfSx7fSkscz1pW3QucGxhY2VtZW50XSxsPXMueCx1PXMueTt0Lm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyE9bnVsbCYmKHQubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLngrPWwsdC5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMueSs9dSksdC5tb2RpZmllcnNEYXRhW3JdPWl9dmFyICRnPXtuYW1lOiJvZmZzZXQiLGVuYWJsZWQ6ITAscGhhc2U6Im1haW4iLHJlcXVpcmVzOlsicG9wcGVyT2Zmc2V0cyJdLGZuOnJrfTtmdW5jdGlvbiBvayhlKXt2YXIgdD1lLnN0YXRlLG49ZS5uYW1lO3QubW9kaWZpZXJzRGF0YVtuXT1RYSh7cmVmZXJlbmNlOnQucmVjdHMucmVmZXJlbmNlLGVsZW1lbnQ6dC5yZWN0cy5wb3BwZXIsc3RyYXRlZ3k6ImFic29sdXRlIixwbGFjZW1lbnQ6dC5wbGFjZW1lbnR9KX12YXIgQmc9e25hbWU6InBvcHBlck9mZnNldHMiLGVuYWJsZWQ6ITAscGhhc2U6InJlYWQiLGZuOm9rLGRhdGE6e319O2Z1bmN0aW9uIGhkKGUpe3JldHVybiBlPT09IngiPyJ5IjoieCJ9ZnVuY3Rpb24gYWsoZSl7dmFyIHQ9ZS5zdGF0ZSxuPWUub3B0aW9ucyxyPWUubmFtZSxvPW4ubWFpbkF4aXMsYT1vPT09dm9pZCAwPyEwOm8saT1uLmFsdEF4aXMscz1pPT09dm9pZCAwPyExOmksbD1uLmJvdW5kYXJ5LHU9bi5yb290Qm91bmRhcnksYz1uLmFsdEJvdW5kYXJ5LGQ9bi5wYWRkaW5nLHA9bi50ZXRoZXIseT1wPT09dm9pZCAwPyEwOnAsaD1uLnRldGhlck9mZnNldCx3PWg9PT12b2lkIDA/MDpoLGI9bG4odCx7Ym91bmRhcnk6bCxyb290Qm91bmRhcnk6dSxwYWRkaW5nOmQsYWx0Qm91bmRhcnk6Y30pLGc9ZXQodC5wbGFjZW1lbnQpLG09VnQodC5wbGFjZW1lbnQpLHY9IW0sZj1qcihnKSxFPWhkKGYpLGs9dC5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMsTj10LnJlY3RzLnJlZmVyZW5jZSxEPXQucmVjdHMucG9wcGVyLE89dHlwZW9mIHc9PSJmdW5jdGlvbiI/dyhPYmplY3QuYXNzaWduKHt9LHQucmVjdHMse3BsYWNlbWVudDp0LnBsYWNlbWVudH0pKTp3LFQ9dHlwZW9mIE89PSJudW1iZXIiP3ttYWluQXhpczpPLGFsdEF4aXM6T306T2JqZWN0LmFzc2lnbih7bWFpbkF4aXM6MCxhbHRBeGlzOjB9LE8pLHo9dC5tb2RpZmllcnNEYXRhLm9mZnNldD90Lm1vZGlmaWVyc0RhdGEub2Zmc2V0W3QucGxhY2VtZW50XTpudWxsLFA9e3g6MCx5OjB9O2lmKGspe2lmKGEpe3ZhciBDLEw9Zj09PSJ5Ij96ZTpVZSwkPWY9PT0ieSI/WWU6amUsVz1mPT09InkiPyJoZWlnaHQiOiJ3aWR0aCIsTT1rW2ZdLEs9TStiW0xdLG9lPU0tYlskXSxTPXk/LURbV10vMjowLHg9bT09PXpuP05bV106RFtXXSxSPW09PT16bj8tRFtXXTotTltXXSxCPXQuZWxlbWVudHMuYXJyb3csSD15JiZCP0hyKEIpOnt3aWR0aDowLGhlaWdodDowfSxZPXQubW9kaWZpZXJzRGF0YVsiYXJyb3cjcGVyc2lzdGVudCJdP3QubW9kaWZpZXJzRGF0YVsiYXJyb3cjcGVyc2lzdGVudCJdLnBhZGRpbmc6S2EoKSxxPVlbTF0sVj1ZWyRdLEo9VnIoMCxOW1ddLEhbV10pLFE9dj9OW1ddLzItUy1KLXEtVC5tYWluQXhpczp4LUotcS1ULm1haW5BeGlzLG5lPXY/LU5bV10vMitTK0orVitULm1haW5BeGlzOlIrSitWK1QubWFpbkF4aXMsdGU9dC5lbGVtZW50cy5hcnJvdyYmc24odC5lbGVtZW50cy5hcnJvdyksaWU9dGU/Zj09PSJ5Ij90ZS5jbGllbnRUb3B8fDA6dGUuY2xpZW50TGVmdHx8MDowLFRlPShDPXo/LltmXSkhPW51bGw/QzowLGFlPU0rUS1UZS1pZSxBZT1NK25lLVRlLFdlPVZyKHk/V3IoSyxhZSk6SyxNLHk/YW4ob2UsQWUpOm9lKTtrW2ZdPVdlLFBbZl09V2UtTX1pZihzKXt2YXIgVmUsWD1mPT09IngiP3plOlVlLE5lPWY9PT0ieCI/WWU6amUsd2U9a1tFXSxUdD1FPT09InkiPyJoZWlnaHQiOiJ3aWR0aCIsZm49d2UrYltYXSxOdD13ZS1iW05lXSxZdD1bemUsVWVdLmluZGV4T2YoZykhPT0tMSxHbj0oVmU9ej8uW0VdKSE9bnVsbD9WZTowLEtuPVl0P2ZuOndlLU5bVHRdLURbVHRdLUduK1QuYWx0QXhpcyxlbz1ZdD93ZStOW1R0XStEW1R0XS1Hbi1ULmFsdEF4aXM6TnQsdG89eSYmWXQ/Q2coS24sd2UsZW8pOlZyKHk/S246Zm4sd2UseT9lbzpOdCk7a1tFXT10byxQW0VdPXRvLXdlfXQubW9kaWZpZXJzRGF0YVtyXT1QfX12YXIgV2c9e25hbWU6InByZXZlbnRPdmVyZmxvdyIsZW5hYmxlZDohMCxwaGFzZToibWFpbiIsZm46YWsscmVxdWlyZXNJZkV4aXN0czpbIm9mZnNldCJdfTtmdW5jdGlvbiBnZChlKXtyZXR1cm57c2Nyb2xsTGVmdDplLnNjcm9sbExlZnQsc2Nyb2xsVG9wOmUuc2Nyb2xsVG9wfX1mdW5jdGlvbiB5ZChlKXtyZXR1cm4gZT09PU9lKGUpfHwhcWUoZSk/R3IoZSk6Z2QoZSl9ZnVuY3Rpb24gaWsoZSl7dmFyIHQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxuPUZuKHQud2lkdGgpL2Uub2Zmc2V0V2lkdGh8fDEscj1Gbih0LmhlaWdodCkvZS5vZmZzZXRIZWlnaHR8fDE7cmV0dXJuIG4hPT0xfHxyIT09MX1mdW5jdGlvbiB2ZChlLHQsbil7bj09PXZvaWQgMCYmKG49ITEpO3ZhciByPXFlKHQpLG89cWUodCkmJmlrKHQpLGE9b3QodCksaT1qdChlLG8sbikscz17c2Nyb2xsTGVmdDowLHNjcm9sbFRvcDowfSxsPXt4OjAseTowfTtyZXR1cm4ocnx8IXImJiFuKSYmKChaZSh0KSE9PSJib2R5Inx8WXIoYSkpJiYocz15ZCh0KSkscWUodCk/KGw9anQodCwhMCksbC54Kz10LmNsaWVudExlZnQsbC55Kz10LmNsaWVudFRvcCk6YSYmKGwueD1LcihhKSkpLHt4OmkubGVmdCtzLnNjcm9sbExlZnQtbC54LHk6aS50b3Arcy5zY3JvbGxUb3AtbC55LHdpZHRoOmkud2lkdGgsaGVpZ2h0OmkuaGVpZ2h0fX1mdW5jdGlvbiBzayhlKXt2YXIgdD1uZXcgTWFwLG49bmV3IFNldCxyPVtdO2UuZm9yRWFjaChmdW5jdGlvbihhKXt0LnNldChhLm5hbWUsYSl9KTtmdW5jdGlvbiBvKGEpe24uYWRkKGEubmFtZSk7dmFyIGk9W10uY29uY2F0KGEucmVxdWlyZXN8fFtdLGEucmVxdWlyZXNJZkV4aXN0c3x8W10pO2kuZm9yRWFjaChmdW5jdGlvbihzKXtpZighbi5oYXMocykpe3ZhciBsPXQuZ2V0KHMpO2wmJm8obCl9fSksci5wdXNoKGEpfXJldHVybiBlLmZvckVhY2goZnVuY3Rpb24oYSl7bi5oYXMoYS5uYW1lKXx8byhhKX0pLHJ9ZnVuY3Rpb24gd2QoZSl7dmFyIHQ9c2soZSk7cmV0dXJuIF9nLnJlZHVjZShmdW5jdGlvbihuLHIpe3JldHVybiBuLmNvbmNhdCh0LmZpbHRlcihmdW5jdGlvbihvKXtyZXR1cm4gby5waGFzZT09PXJ9KSl9LFtdKX1mdW5jdGlvbiBiZChlKXt2YXIgdDtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdHx8KHQ9bmV3IFByb21pc2UoZnVuY3Rpb24obil7UHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe3Q9dm9pZCAwLG4oZSgpKX0pfSkpLHR9fWZ1bmN0aW9uIHhkKGUpe3ZhciB0PWUucmVkdWNlKGZ1bmN0aW9uKG4scil7dmFyIG89bltyLm5hbWVdO3JldHVybiBuW3IubmFtZV09bz9PYmplY3QuYXNzaWduKHt9LG8scix7b3B0aW9uczpPYmplY3QuYXNzaWduKHt9LG8ub3B0aW9ucyxyLm9wdGlvbnMpLGRhdGE6T2JqZWN0LmFzc2lnbih7fSxvLmRhdGEsci5kYXRhKX0pOnIsbn0se30pO3JldHVybiBPYmplY3Qua2V5cyh0KS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIHRbbl19KX12YXIgSGc9e3BsYWNlbWVudDoiYm90dG9tIixtb2RpZmllcnM6W10sc3RyYXRlZ3k6ImFic29sdXRlIn07ZnVuY3Rpb24gamcoKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4hdC5zb21lKGZ1bmN0aW9uKHIpe3JldHVybiEociYmdHlwZW9mIHIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PT0iZnVuY3Rpb24iKX0pfWZ1bmN0aW9uIFZnKGUpe2U9PT12b2lkIDAmJihlPXt9KTt2YXIgdD1lLG49dC5kZWZhdWx0TW9kaWZpZXJzLHI9bj09PXZvaWQgMD9bXTpuLG89dC5kZWZhdWx0T3B0aW9ucyxhPW89PT12b2lkIDA/SGc6bztyZXR1cm4gZnVuY3Rpb24ocyxsLHUpe3U9PT12b2lkIDAmJih1PWEpO3ZhciBjPXtwbGFjZW1lbnQ6ImJvdHRvbSIsb3JkZXJlZE1vZGlmaWVyczpbXSxvcHRpb25zOk9iamVjdC5hc3NpZ24oe30sSGcsYSksbW9kaWZpZXJzRGF0YTp7fSxlbGVtZW50czp7cmVmZXJlbmNlOnMscG9wcGVyOmx9LGF0dHJpYnV0ZXM6e30sc3R5bGVzOnt9fSxkPVtdLHA9ITEseT17c3RhdGU6YyxzZXRPcHRpb25zOmZ1bmN0aW9uKGcpe3ZhciBtPXR5cGVvZiBnPT0iZnVuY3Rpb24iP2coYy5vcHRpb25zKTpnO3coKSxjLm9wdGlvbnM9T2JqZWN0LmFzc2lnbih7fSxhLGMub3B0aW9ucyxtKSxjLnNjcm9sbFBhcmVudHM9e3JlZmVyZW5jZTpIdChzKT95cihzKTpzLmNvbnRleHRFbGVtZW50P3lyKHMuY29udGV4dEVsZW1lbnQpOltdLHBvcHBlcjp5cihsKX07dmFyIHY9d2QoeGQoW10uY29uY2F0KHIsYy5vcHRpb25zLm1vZGlmaWVycykpKTtyZXR1cm4gYy5vcmRlcmVkTW9kaWZpZXJzPXYuZmlsdGVyKGZ1bmN0aW9uKGYpe3JldHVybiBmLmVuYWJsZWR9KSxoKCkseS51cGRhdGUoKX0sZm9yY2VVcGRhdGU6ZnVuY3Rpb24oKXtpZighcCl7dmFyIGc9Yy5lbGVtZW50cyxtPWcucmVmZXJlbmNlLHY9Zy5wb3BwZXI7aWYoamcobSx2KSl7Yy5yZWN0cz17cmVmZXJlbmNlOnZkKG0sc24odiksYy5vcHRpb25zLnN0cmF0ZWd5PT09ImZpeGVkIikscG9wcGVyOkhyKHYpfSxjLnJlc2V0PSExLGMucGxhY2VtZW50PWMub3B0aW9ucy5wbGFjZW1lbnQsYy5vcmRlcmVkTW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24oVCl7cmV0dXJuIGMubW9kaWZpZXJzRGF0YVtULm5hbWVdPU9iamVjdC5hc3NpZ24oe30sVC5kYXRhKX0pO2Zvcih2YXIgZj0wO2Y8Yy5vcmRlcmVkTW9kaWZpZXJzLmxlbmd0aDtmKyspe2lmKGMucmVzZXQ9PT0hMCl7Yy5yZXNldD0hMSxmPS0xO2NvbnRpbnVlfXZhciBFPWMub3JkZXJlZE1vZGlmaWVyc1tmXSxrPUUuZm4sTj1FLm9wdGlvbnMsRD1OPT09dm9pZCAwP3t9Ok4sTz1FLm5hbWU7dHlwZW9mIGs9PSJmdW5jdGlvbiImJihjPWsoe3N0YXRlOmMsb3B0aW9uczpELG5hbWU6TyxpbnN0YW5jZTp5fSl8fGMpfX19fSx1cGRhdGU6YmQoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oYil7eS5mb3JjZVVwZGF0ZSgpLGIoYyl9KX0pLGRlc3Ryb3k6ZnVuY3Rpb24oKXt3KCkscD0hMH19O2lmKCFqZyhzLGwpKXJldHVybiB5O3kuc2V0T3B0aW9ucyh1KS50aGVuKGZ1bmN0aW9uKGIpeyFwJiZ1Lm9uRmlyc3RVcGRhdGUmJnUub25GaXJzdFVwZGF0ZShiKX0pO2Z1bmN0aW9uIGgoKXtjLm9yZGVyZWRNb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbihiKXt2YXIgZz1iLm5hbWUsbT1iLm9wdGlvbnMsdj1tPT09dm9pZCAwP3t9Om0sZj1iLmVmZmVjdDtpZih0eXBlb2YgZj09ImZ1bmN0aW9uIil7dmFyIEU9Zih7c3RhdGU6YyxuYW1lOmcsaW5zdGFuY2U6eSxvcHRpb25zOnZ9KSxrPWZ1bmN0aW9uKCl7fTtkLnB1c2goRXx8ayl9fSl9ZnVuY3Rpb24gdygpe2QuZm9yRWFjaChmdW5jdGlvbihiKXtyZXR1cm4gYigpfSksZD1bXX1yZXR1cm4geX19dmFyIGxrPVtJZyxCZyxSZyxqYSwkZyxMZyxXZyxPZyxVZ10sa2Q9Vmcoe2RlZmF1bHRNb2RpZmllcnM6bGt9KTt2YXIgdWs9InRpcHB5LWJveCIsdHk9InRpcHB5LWNvbnRlbnQiLGNrPSJ0aXBweS1iYWNrZHJvcCIsbnk9InRpcHB5LWFycm93IixyeT0idGlwcHktc3ZnLWFycm93Iixxcj17cGFzc2l2ZTohMCxjYXB0dXJlOiEwfSxveT1mdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5ib2R5fTtmdW5jdGlvbiBTZChlLHQsbil7aWYoQXJyYXkuaXNBcnJheShlKSl7dmFyIHI9ZVt0XTtyZXR1cm4gcj8/KEFycmF5LmlzQXJyYXkobik/blt0XTpuKX1yZXR1cm4gZX1mdW5jdGlvbiBBZChlLHQpe3ZhciBuPXt9LnRvU3RyaW5nLmNhbGwoZSk7cmV0dXJuIG4uaW5kZXhPZigiW29iamVjdCIpPT09MCYmbi5pbmRleE9mKHQrIl0iKT4tMX1mdW5jdGlvbiBheShlLHQpe3JldHVybiB0eXBlb2YgZT09ImZ1bmN0aW9uIj9lLmFwcGx5KHZvaWQgMCx0KTplfWZ1bmN0aW9uIEdnKGUsdCl7aWYodD09PTApcmV0dXJuIGU7dmFyIG47cmV0dXJuIGZ1bmN0aW9uKHIpe2NsZWFyVGltZW91dChuKSxuPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKHIpfSx0KX19ZnVuY3Rpb24gZGsoZSl7cmV0dXJuIGUuc3BsaXQoL1xzKy8pLmZpbHRlcihCb29sZWFuKX1mdW5jdGlvbiBqbyhlKXtyZXR1cm5bXS5jb25jYXQoZSl9ZnVuY3Rpb24gS2coZSx0KXtlLmluZGV4T2YodCk9PT0tMSYmZS5wdXNoKHQpfWZ1bmN0aW9uIHBrKGUpe3JldHVybiBlLmZpbHRlcihmdW5jdGlvbih0LG4pe3JldHVybiBlLmluZGV4T2YodCk9PT1ufSl9ZnVuY3Rpb24gZmsoZSl7cmV0dXJuIGUuc3BsaXQoIi0iKVswXX1mdW5jdGlvbiBlbChlKXtyZXR1cm5bXS5zbGljZS5jYWxsKGUpfWZ1bmN0aW9uIFlnKGUpe3JldHVybiBPYmplY3Qua2V5cyhlKS5yZWR1Y2UoZnVuY3Rpb24odCxuKXtyZXR1cm4gZVtuXSE9PXZvaWQgMCYmKHRbbl09ZVtuXSksdH0se30pfWZ1bmN0aW9uIEphKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpfWZ1bmN0aW9uIHRsKGUpe3JldHVyblsiRWxlbWVudCIsIkZyYWdtZW50Il0uc29tZShmdW5jdGlvbih0KXtyZXR1cm4gQWQoZSx0KX0pfWZ1bmN0aW9uIG1rKGUpe3JldHVybiBBZChlLCJOb2RlTGlzdCIpfWZ1bmN0aW9uIGhrKGUpe3JldHVybiBBZChlLCJNb3VzZUV2ZW50Iil9ZnVuY3Rpb24gZ2soZSl7cmV0dXJuISEoZSYmZS5fdGlwcHkmJmUuX3RpcHB5LnJlZmVyZW5jZT09PWUpfWZ1bmN0aW9uIHlrKGUpe3JldHVybiB0bChlKT9bZV06bWsoZSk/ZWwoZSk6QXJyYXkuaXNBcnJheShlKT9lOmVsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZSkpfWZ1bmN0aW9uIEVkKGUsdCl7ZS5mb3JFYWNoKGZ1bmN0aW9uKG4pe24mJihuLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj10KyJtcyIpfSl9ZnVuY3Rpb24gcWcoZSx0KXtlLmZvckVhY2goZnVuY3Rpb24obil7biYmbi5zZXRBdHRyaWJ1dGUoImRhdGEtc3RhdGUiLHQpfSl9ZnVuY3Rpb24gdmsoZSl7dmFyIHQsbj1qbyhlKSxyPW5bMF07cmV0dXJuIHIhPW51bGwmJih0PXIub3duZXJEb2N1bWVudCkhPW51bGwmJnQuYm9keT9yLm93bmVyRG9jdW1lbnQ6ZG9jdW1lbnR9ZnVuY3Rpb24gd2soZSx0KXt2YXIgbj10LmNsaWVudFgscj10LmNsaWVudFk7cmV0dXJuIGUuZXZlcnkoZnVuY3Rpb24obyl7dmFyIGE9by5wb3BwZXJSZWN0LGk9by5wb3BwZXJTdGF0ZSxzPW8ucHJvcHMsbD1zLmludGVyYWN0aXZlQm9yZGVyLHU9ZmsoaS5wbGFjZW1lbnQpLGM9aS5tb2RpZmllcnNEYXRhLm9mZnNldDtpZighYylyZXR1cm4hMDt2YXIgZD11PT09ImJvdHRvbSI/Yy50b3AueTowLHA9dT09PSJ0b3AiP2MuYm90dG9tLnk6MCx5PXU9PT0icmlnaHQiP2MubGVmdC54OjAsaD11PT09ImxlZnQiP2MucmlnaHQueDowLHc9YS50b3AtcitkPmwsYj1yLWEuYm90dG9tLXA+bCxnPWEubGVmdC1uK3k+bCxtPW4tYS5yaWdodC1oPmw7cmV0dXJuIHd8fGJ8fGd8fG19KX1mdW5jdGlvbiBUZChlLHQsbil7dmFyIHI9dCsiRXZlbnRMaXN0ZW5lciI7WyJ0cmFuc2l0aW9uZW5kIiwid2Via2l0VHJhbnNpdGlvbkVuZCJdLmZvckVhY2goZnVuY3Rpb24obyl7ZVtyXShvLG4pfSl9ZnVuY3Rpb24gUWcoZSx0KXtmb3IodmFyIG49dDtuOyl7dmFyIHI7aWYoZS5jb250YWlucyhuKSlyZXR1cm4hMDtuPW4uZ2V0Um9vdE5vZGU9PW51bGx8fChyPW4uZ2V0Um9vdE5vZGUoKSk9PW51bGw/dm9pZCAwOnIuaG9zdH1yZXR1cm4hMX12YXIgeG49e2lzVG91Y2g6ITF9LEpnPTA7ZnVuY3Rpb24gYmsoKXt4bi5pc1RvdWNofHwoeG4uaXNUb3VjaD0hMCx3aW5kb3cucGVyZm9ybWFuY2UmJmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsaXkpKX1mdW5jdGlvbiBpeSgpe3ZhciBlPXBlcmZvcm1hbmNlLm5vdygpO2UtSmc8MjAmJih4bi5pc1RvdWNoPSExLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsaXkpKSxKZz1lfWZ1bmN0aW9uIHhrKCl7dmFyIGU9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtpZihnayhlKSl7dmFyIHQ9ZS5fdGlwcHk7ZS5ibHVyJiYhdC5zdGF0ZS5pc1Zpc2libGUmJmUuYmx1cigpfX1mdW5jdGlvbiBraygpe2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLGJrLHFyKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIseGspfXZhciBTaz10eXBlb2Ygd2luZG93PCJ1IiYmdHlwZW9mIGRvY3VtZW50PCJ1IixFaz1Taz8hIXdpbmRvdy5tc0NyeXB0bzohMTt2YXIgVGs9e2FuaW1hdGVGaWxsOiExLGZvbGxvd0N1cnNvcjohMSxpbmxpbmVQb3NpdGlvbmluZzohMSxzdGlja3k6ITF9LE5rPXthbGxvd0hUTUw6ITEsYW5pbWF0aW9uOiJmYWRlIixhcnJvdzohMCxjb250ZW50OiIiLGluZXJ0aWE6ITEsbWF4V2lkdGg6MzUwLHJvbGU6InRvb2x0aXAiLHRoZW1lOiIiLHpJbmRleDo5OTk5fSx1bj1PYmplY3QuYXNzaWduKHthcHBlbmRUbzpveSxhcmlhOntjb250ZW50OiJhdXRvIixleHBhbmRlZDoiYXV0byJ9LGRlbGF5OjAsZHVyYXRpb246WzMwMCwyNTBdLGdldFJlZmVyZW5jZUNsaWVudFJlY3Q6bnVsbCxoaWRlT25DbGljazohMCxpZ25vcmVBdHRyaWJ1dGVzOiExLGludGVyYWN0aXZlOiExLGludGVyYWN0aXZlQm9yZGVyOjIsaW50ZXJhY3RpdmVEZWJvdW5jZTowLG1vdmVUcmFuc2l0aW9uOiIiLG9mZnNldDpbMCwxMF0sb25BZnRlclVwZGF0ZTpmdW5jdGlvbigpe30sb25CZWZvcmVVcGRhdGU6ZnVuY3Rpb24oKXt9LG9uQ3JlYXRlOmZ1bmN0aW9uKCl7fSxvbkRlc3Ryb3k6ZnVuY3Rpb24oKXt9LG9uSGlkZGVuOmZ1bmN0aW9uKCl7fSxvbkhpZGU6ZnVuY3Rpb24oKXt9LG9uTW91bnQ6ZnVuY3Rpb24oKXt9LG9uU2hvdzpmdW5jdGlvbigpe30sb25TaG93bjpmdW5jdGlvbigpe30sb25UcmlnZ2VyOmZ1bmN0aW9uKCl7fSxvblVudHJpZ2dlcjpmdW5jdGlvbigpe30sb25DbGlja091dHNpZGU6ZnVuY3Rpb24oKXt9LHBsYWNlbWVudDoidG9wIixwbHVnaW5zOltdLHBvcHBlck9wdGlvbnM6e30scmVuZGVyOm51bGwsc2hvd09uQ3JlYXRlOiExLHRvdWNoOiEwLHRyaWdnZXI6Im1vdXNlZW50ZXIgZm9jdXMiLHRyaWdnZXJUYXJnZXQ6bnVsbH0sVGssTmspLERrPU9iamVjdC5rZXlzKHVuKSxfaz1mdW5jdGlvbih0KXt2YXIgbj1PYmplY3Qua2V5cyh0KTtuLmZvckVhY2goZnVuY3Rpb24ocil7dW5bcl09dFtyXX0pfTtmdW5jdGlvbiBzeShlKXt2YXIgdD1lLnBsdWdpbnN8fFtdLG49dC5yZWR1Y2UoZnVuY3Rpb24ocixvKXt2YXIgYT1vLm5hbWUsaT1vLmRlZmF1bHRWYWx1ZTtpZihhKXt2YXIgcztyW2FdPWVbYV0hPT12b2lkIDA/ZVthXToocz11blthXSkhPW51bGw/czppfXJldHVybiByfSx7fSk7cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sZSxuKX1mdW5jdGlvbiBBayhlLHQpe3ZhciBuPXQ/T2JqZWN0LmtleXMoc3koT2JqZWN0LmFzc2lnbih7fSx1bix7cGx1Z2luczp0fSkpKTpEayxyPW4ucmVkdWNlKGZ1bmN0aW9uKG8sYSl7dmFyIGk9KGUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpcHB5LSIrYSl8fCIiKS50cmltKCk7aWYoIWkpcmV0dXJuIG87aWYoYT09PSJjb250ZW50IilvW2FdPWk7ZWxzZSB0cnl7b1thXT1KU09OLnBhcnNlKGkpfWNhdGNoe29bYV09aX1yZXR1cm4gb30se30pO3JldHVybiByfWZ1bmN0aW9uIFhnKGUsdCl7dmFyIG49T2JqZWN0LmFzc2lnbih7fSx0LHtjb250ZW50OmF5KHQuY29udGVudCxbZV0pfSx0Lmlnbm9yZUF0dHJpYnV0ZXM/e306QWsoZSx0LnBsdWdpbnMpKTtyZXR1cm4gbi5hcmlhPU9iamVjdC5hc3NpZ24oe30sdW4uYXJpYSxuLmFyaWEpLG4uYXJpYT17ZXhwYW5kZWQ6bi5hcmlhLmV4cGFuZGVkPT09ImF1dG8iP3QuaW50ZXJhY3RpdmU6bi5hcmlhLmV4cGFuZGVkLGNvbnRlbnQ6bi5hcmlhLmNvbnRlbnQ9PT0iYXV0byI/dC5pbnRlcmFjdGl2ZT9udWxsOiJkZXNjcmliZWRieSI6bi5hcmlhLmNvbnRlbnR9LG59dmFyIENrPWZ1bmN0aW9uKCl7cmV0dXJuImlubmVySFRNTCJ9O2Z1bmN0aW9uIERkKGUsdCl7ZVtDaygpXT10fWZ1bmN0aW9uIFpnKGUpe3ZhciB0PUphKCk7cmV0dXJuIGU9PT0hMD90LmNsYXNzTmFtZT1ueToodC5jbGFzc05hbWU9cnksdGwoZSk/dC5hcHBlbmRDaGlsZChlKTpEZCh0LGUpKSx0fWZ1bmN0aW9uIGV5KGUsdCl7dGwodC5jb250ZW50KT8oRGQoZSwiIiksZS5hcHBlbmRDaGlsZCh0LmNvbnRlbnQpKTp0eXBlb2YgdC5jb250ZW50IT0iZnVuY3Rpb24iJiYodC5hbGxvd0hUTUw/RGQoZSx0LmNvbnRlbnQpOmUudGV4dENvbnRlbnQ9dC5jb250ZW50KX1mdW5jdGlvbiBfZChlKXt2YXIgdD1lLmZpcnN0RWxlbWVudENoaWxkLG49ZWwodC5jaGlsZHJlbik7cmV0dXJue2JveDp0LGNvbnRlbnQ6bi5maW5kKGZ1bmN0aW9uKHIpe3JldHVybiByLmNsYXNzTGlzdC5jb250YWlucyh0eSl9KSxhcnJvdzpuLmZpbmQoZnVuY3Rpb24ocil7cmV0dXJuIHIuY2xhc3NMaXN0LmNvbnRhaW5zKG55KXx8ci5jbGFzc0xpc3QuY29udGFpbnMocnkpfSksYmFja2Ryb3A6bi5maW5kKGZ1bmN0aW9uKHIpe3JldHVybiByLmNsYXNzTGlzdC5jb250YWlucyhjayl9KX19ZnVuY3Rpb24gbHkoZSl7dmFyIHQ9SmEoKSxuPUphKCk7bi5jbGFzc05hbWU9dWssbi5zZXRBdHRyaWJ1dGUoImRhdGEtc3RhdGUiLCJoaWRkZW4iKSxuLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCItMSIpO3ZhciByPUphKCk7ci5jbGFzc05hbWU9dHksci5zZXRBdHRyaWJ1dGUoImRhdGEtc3RhdGUiLCJoaWRkZW4iKSxleShyLGUucHJvcHMpLHQuYXBwZW5kQ2hpbGQobiksbi5hcHBlbmRDaGlsZChyKSxvKGUucHJvcHMsZS5wcm9wcyk7ZnVuY3Rpb24gbyhhLGkpe3ZhciBzPV9kKHQpLGw9cy5ib3gsdT1zLmNvbnRlbnQsYz1zLmFycm93O2kudGhlbWU/bC5zZXRBdHRyaWJ1dGUoImRhdGEtdGhlbWUiLGkudGhlbWUpOmwucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXRoZW1lIiksdHlwZW9mIGkuYW5pbWF0aW9uPT0ic3RyaW5nIj9sLnNldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRpb24iLGkuYW5pbWF0aW9uKTpsLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1hbmltYXRpb24iKSxpLmluZXJ0aWE/bC5zZXRBdHRyaWJ1dGUoImRhdGEtaW5lcnRpYSIsIiIpOmwucmVtb3ZlQXR0cmlidXRlKCJkYXRhLWluZXJ0aWEiKSxsLnN0eWxlLm1heFdpZHRoPXR5cGVvZiBpLm1heFdpZHRoPT0ibnVtYmVyIj9pLm1heFdpZHRoKyJweCI6aS5tYXhXaWR0aCxpLnJvbGU/bC5zZXRBdHRyaWJ1dGUoInJvbGUiLGkucm9sZSk6bC5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKSwoYS5jb250ZW50IT09aS5jb250ZW50fHxhLmFsbG93SFRNTCE9PWkuYWxsb3dIVE1MKSYmZXkodSxlLnByb3BzKSxpLmFycm93P2M/YS5hcnJvdyE9PWkuYXJyb3cmJihsLnJlbW92ZUNoaWxkKGMpLGwuYXBwZW5kQ2hpbGQoWmcoaS5hcnJvdykpKTpsLmFwcGVuZENoaWxkKFpnKGkuYXJyb3cpKTpjJiZsLnJlbW92ZUNoaWxkKGMpfXJldHVybntwb3BwZXI6dCxvblVwZGF0ZTpvfX1seS4kJHRpcHB5PSEwO3ZhciBPaz0xLFpzPVtdLE5kPVtdO2Z1bmN0aW9uIE1rKGUsdCl7dmFyIG49WGcoZSxPYmplY3QuYXNzaWduKHt9LHVuLHN5KFlnKHQpKSkpLHIsbyxhLGk9ITEscz0hMSxsPSExLHU9ITEsYyxkLHAseT1bXSxoPUdnKGFlLG4uaW50ZXJhY3RpdmVEZWJvdW5jZSksdyxiPU9rKyssZz1udWxsLG09cGsobi5wbHVnaW5zKSx2PXtpc0VuYWJsZWQ6ITAsaXNWaXNpYmxlOiExLGlzRGVzdHJveWVkOiExLGlzTW91bnRlZDohMSxpc1Nob3duOiExfSxmPXtpZDpiLHJlZmVyZW5jZTplLHBvcHBlcjpKYSgpLHBvcHBlckluc3RhbmNlOmcscHJvcHM6bixzdGF0ZTp2LHBsdWdpbnM6bSxjbGVhckRlbGF5VGltZW91dHM6S24sc2V0UHJvcHM6ZW8sc2V0Q29udGVudDp0byxzaG93OmhpLGhpZGU6Z2ksaGlkZVdpdGhJbnRlcmFjdGl2aXR5OnFvLGVuYWJsZTpZdCxkaXNhYmxlOkduLHVubW91bnQ6Q2wsZGVzdHJveTpPbH07aWYoIW4ucmVuZGVyKXJldHVybiBmO3ZhciBFPW4ucmVuZGVyKGYpLGs9RS5wb3BwZXIsTj1FLm9uVXBkYXRlO2suc2V0QXR0cmlidXRlKCJkYXRhLXRpcHB5LXJvb3QiLCIiKSxrLmlkPSJ0aXBweS0iK2YuaWQsZi5wb3BwZXI9ayxlLl90aXBweT1mLGsuX3RpcHB5PWY7dmFyIEQ9bS5tYXAoZnVuY3Rpb24oQSl7cmV0dXJuIEEuZm4oZil9KSxPPWUuaGFzQXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIik7cmV0dXJuIHRlKCksUygpLE0oKSxLKCJvbkNyZWF0ZSIsW2ZdKSxuLnNob3dPbkNyZWF0ZSYmZm4oKSxrLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLGZ1bmN0aW9uKCl7Zi5wcm9wcy5pbnRlcmFjdGl2ZSYmZi5zdGF0ZS5pc1Zpc2libGUmJmYuY2xlYXJEZWxheVRpbWVvdXRzKCl9KSxrLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLGZ1bmN0aW9uKCl7Zi5wcm9wcy5pbnRlcmFjdGl2ZSYmZi5wcm9wcy50cmlnZ2VyLmluZGV4T2YoIm1vdXNlZW50ZXIiKT49MCYmTCgpLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsaCl9KSxmO2Z1bmN0aW9uIFQoKXt2YXIgQT1mLnByb3BzLnRvdWNoO3JldHVybiBBcnJheS5pc0FycmF5KEEpP0E6W0EsMF19ZnVuY3Rpb24geigpe3JldHVybiBUKClbMF09PT0iaG9sZCJ9ZnVuY3Rpb24gUCgpe3ZhciBBO3JldHVybiEhKChBPWYucHJvcHMucmVuZGVyKSE9bnVsbCYmQS4kJHRpcHB5KX1mdW5jdGlvbiBDKCl7cmV0dXJuIHd8fGV9ZnVuY3Rpb24gTCgpe3ZhciBBPUMoKS5wYXJlbnROb2RlO3JldHVybiBBP3ZrKEEpOmRvY3VtZW50fWZ1bmN0aW9uICQoKXtyZXR1cm4gX2Qoayl9ZnVuY3Rpb24gVyhBKXtyZXR1cm4gZi5zdGF0ZS5pc01vdW50ZWQmJiFmLnN0YXRlLmlzVmlzaWJsZXx8eG4uaXNUb3VjaHx8YyYmYy50eXBlPT09ImZvY3VzIj8wOlNkKGYucHJvcHMuZGVsYXksQT8wOjEsdW4uZGVsYXkpfWZ1bmN0aW9uIE0oQSl7QT09PXZvaWQgMCYmKEE9ITEpLGsuc3R5bGUucG9pbnRlckV2ZW50cz1mLnByb3BzLmludGVyYWN0aXZlJiYhQT8iIjoibm9uZSIsay5zdHlsZS56SW5kZXg9IiIrZi5wcm9wcy56SW5kZXh9ZnVuY3Rpb24gSyhBLEcsZWUpe2lmKGVlPT09dm9pZCAwJiYoZWU9ITApLEQuZm9yRWFjaChmdW5jdGlvbihsZSl7bGVbQV0mJmxlW0FdLmFwcGx5KGxlLEcpfSksZWUpe3ZhciBnZTsoZ2U9Zi5wcm9wcylbQV0uYXBwbHkoZ2UsRyl9fWZ1bmN0aW9uIG9lKCl7dmFyIEE9Zi5wcm9wcy5hcmlhO2lmKEEuY29udGVudCl7dmFyIEc9ImFyaWEtIitBLmNvbnRlbnQsZWU9ay5pZCxnZT1qbyhmLnByb3BzLnRyaWdnZXJUYXJnZXR8fGUpO2dlLmZvckVhY2goZnVuY3Rpb24obGUpe3ZhciBkdD1sZS5nZXRBdHRyaWJ1dGUoRyk7aWYoZi5zdGF0ZS5pc1Zpc2libGUpbGUuc2V0QXR0cmlidXRlKEcsZHQ/ZHQrIiAiK2VlOmVlKTtlbHNle3ZhciBQdD1kdCYmZHQucmVwbGFjZShlZSwiIikudHJpbSgpO1B0P2xlLnNldEF0dHJpYnV0ZShHLFB0KTpsZS5yZW1vdmVBdHRyaWJ1dGUoRyl9fSl9fWZ1bmN0aW9uIFMoKXtpZighKE98fCFmLnByb3BzLmFyaWEuZXhwYW5kZWQpKXt2YXIgQT1qbyhmLnByb3BzLnRyaWdnZXJUYXJnZXR8fGUpO0EuZm9yRWFjaChmdW5jdGlvbihHKXtmLnByb3BzLmludGVyYWN0aXZlP0cuc2V0QXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIixmLnN0YXRlLmlzVmlzaWJsZSYmRz09PUMoKT8idHJ1ZSI6ImZhbHNlIik6Ry5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtZXhwYW5kZWQiKX0pfX1mdW5jdGlvbiB4KCl7TCgpLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsaCksWnM9WnMuZmlsdGVyKGZ1bmN0aW9uKEEpe3JldHVybiBBIT09aH0pfWZ1bmN0aW9uIFIoQSl7aWYoISh4bi5pc1RvdWNoJiYobHx8QS50eXBlPT09Im1vdXNlZG93biIpKSl7dmFyIEc9QS5jb21wb3NlZFBhdGgmJkEuY29tcG9zZWRQYXRoKClbMF18fEEudGFyZ2V0O2lmKCEoZi5wcm9wcy5pbnRlcmFjdGl2ZSYmUWcoayxHKSkpe2lmKGpvKGYucHJvcHMudHJpZ2dlclRhcmdldHx8ZSkuc29tZShmdW5jdGlvbihlZSl7cmV0dXJuIFFnKGVlLEcpfSkpe2lmKHhuLmlzVG91Y2h8fGYuc3RhdGUuaXNWaXNpYmxlJiZmLnByb3BzLnRyaWdnZXIuaW5kZXhPZigiY2xpY2siKT49MClyZXR1cm59ZWxzZSBLKCJvbkNsaWNrT3V0c2lkZSIsW2YsQV0pO2YucHJvcHMuaGlkZU9uQ2xpY2s9PT0hMCYmKGYuY2xlYXJEZWxheVRpbWVvdXRzKCksZi5oaWRlKCkscz0hMCxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cz0hMX0pLGYuc3RhdGUuaXNNb3VudGVkfHxxKCkpfX19ZnVuY3Rpb24gQigpe2w9ITB9ZnVuY3Rpb24gSCgpe2w9ITF9ZnVuY3Rpb24gWSgpe3ZhciBBPUwoKTtBLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsUiwhMCksQS5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsUixxciksQS5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixILHFyKSxBLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQixxcil9ZnVuY3Rpb24gcSgpe3ZhciBBPUwoKTtBLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsUiwhMCksQS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsUixxciksQS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixILHFyKSxBLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQixxcil9ZnVuY3Rpb24gVihBLEcpe1EoQSxmdW5jdGlvbigpeyFmLnN0YXRlLmlzVmlzaWJsZSYmay5wYXJlbnROb2RlJiZrLnBhcmVudE5vZGUuY29udGFpbnMoaykmJkcoKX0pfWZ1bmN0aW9uIEooQSxHKXtRKEEsRyl9ZnVuY3Rpb24gUShBLEcpe3ZhciBlZT0kKCkuYm94O2Z1bmN0aW9uIGdlKGxlKXtsZS50YXJnZXQ9PT1lZSYmKFRkKGVlLCJyZW1vdmUiLGdlKSxHKCkpfWlmKEE9PT0wKXJldHVybiBHKCk7VGQoZWUsInJlbW92ZSIsZCksVGQoZWUsImFkZCIsZ2UpLGQ9Z2V9ZnVuY3Rpb24gbmUoQSxHLGVlKXtlZT09PXZvaWQgMCYmKGVlPSExKTt2YXIgZ2U9am8oZi5wcm9wcy50cmlnZ2VyVGFyZ2V0fHxlKTtnZS5mb3JFYWNoKGZ1bmN0aW9uKGxlKXtsZS5hZGRFdmVudExpc3RlbmVyKEEsRyxlZSkseS5wdXNoKHtub2RlOmxlLGV2ZW50VHlwZTpBLGhhbmRsZXI6RyxvcHRpb25zOmVlfSl9KX1mdW5jdGlvbiB0ZSgpe3ooKSYmKG5lKCJ0b3VjaHN0YXJ0IixUZSx7cGFzc2l2ZTohMH0pLG5lKCJ0b3VjaGVuZCIsQWUse3Bhc3NpdmU6ITB9KSksZGsoZi5wcm9wcy50cmlnZ2VyKS5mb3JFYWNoKGZ1bmN0aW9uKEEpe2lmKEEhPT0ibWFudWFsIilzd2l0Y2gobmUoQSxUZSksQSl7Y2FzZSJtb3VzZWVudGVyIjpuZSgibW91c2VsZWF2ZSIsQWUpO2JyZWFrO2Nhc2UiZm9jdXMiOm5lKEVrPyJmb2N1c291dCI6ImJsdXIiLFdlKTticmVhaztjYXNlImZvY3VzaW4iOm5lKCJmb2N1c291dCIsV2UpO2JyZWFrfX0pfWZ1bmN0aW9uIGllKCl7eS5mb3JFYWNoKGZ1bmN0aW9uKEEpe3ZhciBHPUEubm9kZSxlZT1BLmV2ZW50VHlwZSxnZT1BLmhhbmRsZXIsbGU9QS5vcHRpb25zO0cucmVtb3ZlRXZlbnRMaXN0ZW5lcihlZSxnZSxsZSl9KSx5PVtdfWZ1bmN0aW9uIFRlKEEpe3ZhciBHLGVlPSExO2lmKCEoIWYuc3RhdGUuaXNFbmFibGVkfHxWZShBKXx8cykpe3ZhciBnZT0oKEc9Yyk9PW51bGw/dm9pZCAwOkcudHlwZSk9PT0iZm9jdXMiO2M9QSx3PUEuY3VycmVudFRhcmdldCxTKCksIWYuc3RhdGUuaXNWaXNpYmxlJiZoayhBKSYmWnMuZm9yRWFjaChmdW5jdGlvbihsZSl7cmV0dXJuIGxlKEEpfSksQS50eXBlPT09ImNsaWNrIiYmKGYucHJvcHMudHJpZ2dlci5pbmRleE9mKCJtb3VzZWVudGVyIik8MHx8aSkmJmYucHJvcHMuaGlkZU9uQ2xpY2shPT0hMSYmZi5zdGF0ZS5pc1Zpc2libGU/ZWU9ITA6Zm4oQSksQS50eXBlPT09ImNsaWNrIiYmKGk9IWVlKSxlZSYmIWdlJiZOdChBKX19ZnVuY3Rpb24gYWUoQSl7dmFyIEc9QS50YXJnZXQsZWU9QygpLmNvbnRhaW5zKEcpfHxrLmNvbnRhaW5zKEcpO2lmKCEoQS50eXBlPT09Im1vdXNlbW92ZSImJmVlKSl7dmFyIGdlPVR0KCkuY29uY2F0KGspLm1hcChmdW5jdGlvbihsZSl7dmFyIGR0LFB0PWxlLl90aXBweSxubz0oZHQ9UHQucG9wcGVySW5zdGFuY2UpPT1udWxsP3ZvaWQgMDpkdC5zdGF0ZTtyZXR1cm4gbm8/e3BvcHBlclJlY3Q6bGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscG9wcGVyU3RhdGU6bm8scHJvcHM6bn06bnVsbH0pLmZpbHRlcihCb29sZWFuKTt3ayhnZSxBKSYmKHgoKSxOdChBKSl9fWZ1bmN0aW9uIEFlKEEpe3ZhciBHPVZlKEEpfHxmLnByb3BzLnRyaWdnZXIuaW5kZXhPZigiY2xpY2siKT49MCYmaTtpZighRyl7aWYoZi5wcm9wcy5pbnRlcmFjdGl2ZSl7Zi5oaWRlV2l0aEludGVyYWN0aXZpdHkoQSk7cmV0dXJufU50KEEpfX1mdW5jdGlvbiBXZShBKXtmLnByb3BzLnRyaWdnZXIuaW5kZXhPZigiZm9jdXNpbiIpPDAmJkEudGFyZ2V0IT09QygpfHxmLnByb3BzLmludGVyYWN0aXZlJiZBLnJlbGF0ZWRUYXJnZXQmJmsuY29udGFpbnMoQS5yZWxhdGVkVGFyZ2V0KXx8TnQoQSl9ZnVuY3Rpb24gVmUoQSl7cmV0dXJuIHhuLmlzVG91Y2g/eigpIT09QS50eXBlLmluZGV4T2YoInRvdWNoIik+PTA6ITF9ZnVuY3Rpb24gWCgpe05lKCk7dmFyIEE9Zi5wcm9wcyxHPUEucG9wcGVyT3B0aW9ucyxlZT1BLnBsYWNlbWVudCxnZT1BLm9mZnNldCxsZT1BLmdldFJlZmVyZW5jZUNsaWVudFJlY3QsZHQ9QS5tb3ZlVHJhbnNpdGlvbixQdD1QKCk/X2QoaykuYXJyb3c6bnVsbCxubz1sZT97Z2V0Qm91bmRpbmdDbGllbnRSZWN0OmxlLGNvbnRleHRFbGVtZW50OmxlLmNvbnRleHRFbGVtZW50fHxDKCl9OmUsRHA9e25hbWU6IiQkdGlwcHkiLGVuYWJsZWQ6ITAscGhhc2U6ImJlZm9yZVdyaXRlIixyZXF1aXJlczpbImNvbXB1dGVTdHlsZXMiXSxmbjpmdW5jdGlvbih5aSl7dmFyIHJvPXlpLnN0YXRlO2lmKFAoKSl7dmFyIHEwPSQoKSxSbD1xMC5ib3g7WyJwbGFjZW1lbnQiLCJyZWZlcmVuY2UtaGlkZGVuIiwiZXNjYXBlZCJdLmZvckVhY2goZnVuY3Rpb24odmkpe3ZpPT09InBsYWNlbWVudCI/Umwuc2V0QXR0cmlidXRlKCJkYXRhLXBsYWNlbWVudCIscm8ucGxhY2VtZW50KTpyby5hdHRyaWJ1dGVzLnBvcHBlclsiZGF0YS1wb3BwZXItIit2aV0/Umwuc2V0QXR0cmlidXRlKCJkYXRhLSIrdmksIiIpOlJsLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS0iK3ZpKX0pLHJvLmF0dHJpYnV0ZXMucG9wcGVyPXt9fX19LEVyPVt7bmFtZToib2Zmc2V0IixvcHRpb25zOntvZmZzZXQ6Z2V9fSx7bmFtZToicHJldmVudE92ZXJmbG93IixvcHRpb25zOntwYWRkaW5nOnt0b3A6Mixib3R0b206MixsZWZ0OjUscmlnaHQ6NX19fSx7bmFtZToiZmxpcCIsb3B0aW9uczp7cGFkZGluZzo1fX0se25hbWU6ImNvbXB1dGVTdHlsZXMiLG9wdGlvbnM6e2FkYXB0aXZlOiFkdH19LERwXTtQKCkmJlB0JiZFci5wdXNoKHtuYW1lOiJhcnJvdyIsb3B0aW9uczp7ZWxlbWVudDpQdCxwYWRkaW5nOjN9fSksRXIucHVzaC5hcHBseShFcixHPy5tb2RpZmllcnN8fFtdKSxmLnBvcHBlckluc3RhbmNlPWtkKG5vLGssT2JqZWN0LmFzc2lnbih7fSxHLHtwbGFjZW1lbnQ6ZWUsb25GaXJzdFVwZGF0ZTpwLG1vZGlmaWVyczpFcn0pKX1mdW5jdGlvbiBOZSgpe2YucG9wcGVySW5zdGFuY2UmJihmLnBvcHBlckluc3RhbmNlLmRlc3Ryb3koKSxmLnBvcHBlckluc3RhbmNlPW51bGwpfWZ1bmN0aW9uIHdlKCl7dmFyIEE9Zi5wcm9wcy5hcHBlbmRUbyxHLGVlPUMoKTtmLnByb3BzLmludGVyYWN0aXZlJiZBPT09b3l8fEE9PT0icGFyZW50Ij9HPWVlLnBhcmVudE5vZGU6Rz1heShBLFtlZV0pLEcuY29udGFpbnMoayl8fEcuYXBwZW5kQ2hpbGQoayksZi5zdGF0ZS5pc01vdW50ZWQ9ITAsWCgpfWZ1bmN0aW9uIFR0KCl7cmV0dXJuIGVsKGsucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtdGlwcHktcm9vdF0iKSl9ZnVuY3Rpb24gZm4oQSl7Zi5jbGVhckRlbGF5VGltZW91dHMoKSxBJiZLKCJvblRyaWdnZXIiLFtmLEFdKSxZKCk7dmFyIEc9VyghMCksZWU9VCgpLGdlPWVlWzBdLGxlPWVlWzFdO3huLmlzVG91Y2gmJmdlPT09ImhvbGQiJiZsZSYmKEc9bGUpLEc/cj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5zaG93KCl9LEcpOmYuc2hvdygpfWZ1bmN0aW9uIE50KEEpe2lmKGYuY2xlYXJEZWxheVRpbWVvdXRzKCksSygib25VbnRyaWdnZXIiLFtmLEFdKSwhZi5zdGF0ZS5pc1Zpc2libGUpe3EoKTtyZXR1cm59aWYoIShmLnByb3BzLnRyaWdnZXIuaW5kZXhPZigibW91c2VlbnRlciIpPj0wJiZmLnByb3BzLnRyaWdnZXIuaW5kZXhPZigiY2xpY2siKT49MCYmWyJtb3VzZWxlYXZlIiwibW91c2Vtb3ZlIl0uaW5kZXhPZihBLnR5cGUpPj0wJiZpKSl7dmFyIEc9VyghMSk7Rz9vPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLnN0YXRlLmlzVmlzaWJsZSYmZi5oaWRlKCl9LEcpOmE9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7Zi5oaWRlKCl9KX19ZnVuY3Rpb24gWXQoKXtmLnN0YXRlLmlzRW5hYmxlZD0hMH1mdW5jdGlvbiBHbigpe2YuaGlkZSgpLGYuc3RhdGUuaXNFbmFibGVkPSExfWZ1bmN0aW9uIEtuKCl7Y2xlYXJUaW1lb3V0KHIpLGNsZWFyVGltZW91dChvKSxjYW5jZWxBbmltYXRpb25GcmFtZShhKX1mdW5jdGlvbiBlbyhBKXtpZighZi5zdGF0ZS5pc0Rlc3Ryb3llZCl7Sygib25CZWZvcmVVcGRhdGUiLFtmLEFdKSxpZSgpO3ZhciBHPWYucHJvcHMsZWU9WGcoZSxPYmplY3QuYXNzaWduKHt9LEcsWWcoQSkse2lnbm9yZUF0dHJpYnV0ZXM6ITB9KSk7Zi5wcm9wcz1lZSx0ZSgpLEcuaW50ZXJhY3RpdmVEZWJvdW5jZSE9PWVlLmludGVyYWN0aXZlRGVib3VuY2UmJih4KCksaD1HZyhhZSxlZS5pbnRlcmFjdGl2ZURlYm91bmNlKSksRy50cmlnZ2VyVGFyZ2V0JiYhZWUudHJpZ2dlclRhcmdldD9qbyhHLnRyaWdnZXJUYXJnZXQpLmZvckVhY2goZnVuY3Rpb24oZ2Upe2dlLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIpfSk6ZWUudHJpZ2dlclRhcmdldCYmZS5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtZXhwYW5kZWQiKSxTKCksTSgpLE4mJk4oRyxlZSksZi5wb3BwZXJJbnN0YW5jZSYmKFgoKSxUdCgpLmZvckVhY2goZnVuY3Rpb24oZ2Upe3JlcXVlc3RBbmltYXRpb25GcmFtZShnZS5fdGlwcHkucG9wcGVySW5zdGFuY2UuZm9yY2VVcGRhdGUpfSkpLEsoIm9uQWZ0ZXJVcGRhdGUiLFtmLEFdKX19ZnVuY3Rpb24gdG8oQSl7Zi5zZXRQcm9wcyh7Y29udGVudDpBfSl9ZnVuY3Rpb24gaGkoKXt2YXIgQT1mLnN0YXRlLmlzVmlzaWJsZSxHPWYuc3RhdGUuaXNEZXN0cm95ZWQsZWU9IWYuc3RhdGUuaXNFbmFibGVkLGdlPXhuLmlzVG91Y2gmJiFmLnByb3BzLnRvdWNoLGxlPVNkKGYucHJvcHMuZHVyYXRpb24sMCx1bi5kdXJhdGlvbik7aWYoIShBfHxHfHxlZXx8Z2UpJiYhQygpLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSYmKEsoIm9uU2hvdyIsW2ZdLCExKSxmLnByb3BzLm9uU2hvdyhmKSE9PSExKSl7aWYoZi5zdGF0ZS5pc1Zpc2libGU9ITAsUCgpJiYoay5zdHlsZS52aXNpYmlsaXR5PSJ2aXNpYmxlIiksTSgpLFkoKSxmLnN0YXRlLmlzTW91bnRlZHx8KGsuc3R5bGUudHJhbnNpdGlvbj0ibm9uZSIpLFAoKSl7dmFyIGR0PSQoKSxQdD1kdC5ib3gsbm89ZHQuY29udGVudDtFZChbUHQsbm9dLDApfXA9ZnVuY3Rpb24oKXt2YXIgRXI7aWYoISghZi5zdGF0ZS5pc1Zpc2libGV8fHUpKXtpZih1PSEwLGsub2Zmc2V0SGVpZ2h0LGsuc3R5bGUudHJhbnNpdGlvbj1mLnByb3BzLm1vdmVUcmFuc2l0aW9uLFAoKSYmZi5wcm9wcy5hbmltYXRpb24pe3ZhciBNbD0kKCkseWk9TWwuYm94LHJvPU1sLmNvbnRlbnQ7RWQoW3lpLHJvXSxsZSkscWcoW3lpLHJvXSwidmlzaWJsZSIpfW9lKCksUygpLEtnKE5kLGYpLChFcj1mLnBvcHBlckluc3RhbmNlKT09bnVsbHx8RXIuZm9yY2VVcGRhdGUoKSxLKCJvbk1vdW50IixbZl0pLGYucHJvcHMuYW5pbWF0aW9uJiZQKCkmJkoobGUsZnVuY3Rpb24oKXtmLnN0YXRlLmlzU2hvd249ITAsSygib25TaG93biIsW2ZdKX0pfX0sd2UoKX19ZnVuY3Rpb24gZ2koKXt2YXIgQT0hZi5zdGF0ZS5pc1Zpc2libGUsRz1mLnN0YXRlLmlzRGVzdHJveWVkLGVlPSFmLnN0YXRlLmlzRW5hYmxlZCxnZT1TZChmLnByb3BzLmR1cmF0aW9uLDEsdW4uZHVyYXRpb24pO2lmKCEoQXx8R3x8ZWUpJiYoSygib25IaWRlIixbZl0sITEpLGYucHJvcHMub25IaWRlKGYpIT09ITEpKXtpZihmLnN0YXRlLmlzVmlzaWJsZT0hMSxmLnN0YXRlLmlzU2hvd249ITEsdT0hMSxpPSExLFAoKSYmKGsuc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIikseCgpLHEoKSxNKCEwKSxQKCkpe3ZhciBsZT0kKCksZHQ9bGUuYm94LFB0PWxlLmNvbnRlbnQ7Zi5wcm9wcy5hbmltYXRpb24mJihFZChbZHQsUHRdLGdlKSxxZyhbZHQsUHRdLCJoaWRkZW4iKSl9b2UoKSxTKCksZi5wcm9wcy5hbmltYXRpb24/UCgpJiZWKGdlLGYudW5tb3VudCk6Zi51bm1vdW50KCl9fWZ1bmN0aW9uIHFvKEEpe0woKS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLGgpLEtnKFpzLGgpLGgoQSl9ZnVuY3Rpb24gQ2woKXtmLnN0YXRlLmlzVmlzaWJsZSYmZi5oaWRlKCksZi5zdGF0ZS5pc01vdW50ZWQmJihOZSgpLFR0KCkuZm9yRWFjaChmdW5jdGlvbihBKXtBLl90aXBweS51bm1vdW50KCl9KSxrLnBhcmVudE5vZGUmJmsucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChrKSxOZD1OZC5maWx0ZXIoZnVuY3Rpb24oQSl7cmV0dXJuIEEhPT1mfSksZi5zdGF0ZS5pc01vdW50ZWQ9ITEsSygib25IaWRkZW4iLFtmXSkpfWZ1bmN0aW9uIE9sKCl7Zi5zdGF0ZS5pc0Rlc3Ryb3llZHx8KGYuY2xlYXJEZWxheVRpbWVvdXRzKCksZi51bm1vdW50KCksaWUoKSxkZWxldGUgZS5fdGlwcHksZi5zdGF0ZS5pc0Rlc3Ryb3llZD0hMCxLKCJvbkRlc3Ryb3kiLFtmXSkpfX1mdW5jdGlvbiBYYShlLHQpe3Q9PT12b2lkIDAmJih0PXt9KTt2YXIgbj11bi5wbHVnaW5zLmNvbmNhdCh0LnBsdWdpbnN8fFtdKTtraygpO3ZhciByPU9iamVjdC5hc3NpZ24oe30sdCx7cGx1Z2luczpufSksbz15ayhlKTtpZigwKXZhciBhLGk7dmFyIHM9by5yZWR1Y2UoZnVuY3Rpb24obCx1KXt2YXIgYz11JiZNayh1LHIpO3JldHVybiBjJiZsLnB1c2goYyksbH0sW10pO3JldHVybiB0bChlKT9zWzBdOnN9WGEuZGVmYXVsdFByb3BzPXVuO1hhLnNldERlZmF1bHRQcm9wcz1faztYYS5jdXJyZW50SW5wdXQ9eG47dmFyIHVPPU9iamVjdC5hc3NpZ24oe30samEse2VmZmVjdDpmdW5jdGlvbih0KXt2YXIgbj10LnN0YXRlLHI9e3BvcHBlcjp7cG9zaXRpb246bi5vcHRpb25zLnN0cmF0ZWd5LGxlZnQ6IjAiLHRvcDoiMCIsbWFyZ2luOiIwIn0sYXJyb3c6e3Bvc2l0aW9uOiJhYnNvbHV0ZSJ9LHJlZmVyZW5jZTp7fX07T2JqZWN0LmFzc2lnbihuLmVsZW1lbnRzLnBvcHBlci5zdHlsZSxyLnBvcHBlciksbi5zdHlsZXM9cixuLmVsZW1lbnRzLmFycm93JiZPYmplY3QuYXNzaWduKG4uZWxlbWVudHMuYXJyb3cuc3R5bGUsci5hcnJvdyl9fSk7WGEuc2V0RGVmYXVsdFByb3BzKHtyZW5kZXI6bHl9KTt2YXIgWmE9WGE7dmFyIFN0PXllKG1lKCksMSk7dmFyIHV5PXt0aGVtZToiZGFzaGJvYXJkIixkdXJhdGlvbjpbMTIwLDgwXSxhcnJvdzohMCxvZmZzZXQ6WzAsOF19O2Z1bmN0aW9uIENkKHtjb250ZW50OmUscGxhY2VtZW50OnQsaW50ZXJhY3RpdmU6bixjaGlsZHJlbjpyLC4uLm99KXtsZXQgYT0oMCxTdC51c2VSZWYpKG51bGwpLGk9KDAsU3QudXNlUmVmKShudWxsKTtyZXR1cm4oMCxTdC51c2VFZmZlY3QpKCgpPT57aWYoYS5jdXJyZW50KXJldHVybiBpLmN1cnJlbnQ9WmEoYS5jdXJyZW50LHsuLi51eSxjb250ZW50OmV8fCIiLHBsYWNlbWVudDp0fHwidG9wIixpbnRlcmFjdGl2ZTpufHwhMSxhbGxvd0hUTUw6ITAsLi4ub30pLCgpPT57aS5jdXJyZW50Py5kZXN0cm95KCksaS5jdXJyZW50PW51bGx9fSxbXSksKDAsU3QudXNlRWZmZWN0KSgoKT0+e2kuY3VycmVudCYmZSE9bnVsbCYmaS5jdXJyZW50LnNldENvbnRlbnQoZSl9LFtlXSksKDAsU3QuY3JlYXRlRWxlbWVudCkoInNwYW4iLHtyZWY6YSxzdHlsZTp7ZGlzcGxheToiaW5saW5lIn19LHIpfWZ1bmN0aW9uIGVpKGU9e30pe2xldCB0PSgwLFN0LnVzZVJlZikobnVsbCksbj0oMCxTdC51c2VSZWYpKHt3aWR0aDowLGhlaWdodDowLHRvcDowLHJpZ2h0OjAsYm90dG9tOjAsbGVmdDowfSkscj0oMCxTdC51c2VSZWYpKG51bGwpLG89KDAsU3QudXNlUmVmKShlLmhpZGVEZWxheXx8MzAwKSxhPSgwLFN0LnVzZVJlZikobnVsbCk7ZnVuY3Rpb24gaSgpe3IuY3VycmVudCYmKGNsZWFyVGltZW91dChyLmN1cnJlbnQpLHIuY3VycmVudD1udWxsKX1mdW5jdGlvbiBzKGMsZCl7aSgpLGQhPT12b2lkIDAmJihhLmN1cnJlbnQ9ZCksci5jdXJyZW50PXNldFRpbWVvdXQoKCk9PntyLmN1cnJlbnQ9bnVsbCx0LmN1cnJlbnQ/LmhpZGUoKSxhLmN1cnJlbnQmJmEuY3VycmVudCgpfSxjPz9vLmN1cnJlbnQpfSgwLFN0LnVzZUVmZmVjdCkoKCk9Pnt0LmN1cnJlbnQ9WmEoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iiksey4uLnV5LGdldFJlZmVyZW5jZUNsaWVudFJlY3Q6KCk9Pm4uY3VycmVudCx0cmlnZ2VyOiJtYW51YWwiLGhpZGVPbkNsaWNrOiExLGFsbG93SFRNTDohMCxpbnRlcmFjdGl2ZTohIWUuaW50ZXJhY3RpdmUscGxhY2VtZW50OmUucGxhY2VtZW50fHwidG9wIixhcHBlbmRUbzooKT0+ZG9jdW1lbnQuYm9keSwuLi5lfSk7bGV0IGMsZDtpZihlLmludGVyYWN0aXZlKXtsZXQgcD10LmN1cnJlbnQucG9wcGVyO2M9KCk9PmkoKSxkPSgpPT5zKCkscC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIixjKSxwLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLGQpfXJldHVybigpPT57aWYoZS5pbnRlcmFjdGl2ZSYmdC5jdXJyZW50KXtsZXQgcD10LmN1cnJlbnQucG9wcGVyO2MmJnAucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsYyksZCYmcC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIixkKX1pKCksdC5jdXJyZW50Py5kZXN0cm95KCksdC5jdXJyZW50PW51bGx9fSxbXSk7ZnVuY3Rpb24gbChjLGQscCx5KXtpKCk7bGV0IGg9dC5jdXJyZW50O2lmKCFoKXJldHVybjtuLmN1cnJlbnQ9e3dpZHRoOjAsaGVpZ2h0OjAsdG9wOnAscmlnaHQ6ZCxib3R0b206cCxsZWZ0OmR9LGguc2V0Q29udGVudChjKTtsZXQgdz15fHx7fSxiPXcucGxhY2VtZW50fHxoLnByb3BzLnBsYWNlbWVudDtiIT09aC5wcm9wcy5wbGFjZW1lbnQmJmguc2V0UHJvcHMoe3BsYWNlbWVudDpifSk7bGV0IGc9aC5wb3BwZXIuZmlyc3RFbGVtZW50Q2hpbGQ7ZyYmZy5jbGFzc0xpc3QudG9nZ2xlKCJiZWxvdy1jaGFydCIsISF3LmJlbG93Q2hhcnQpLGguc3RhdGUuaXNWaXNpYmxlP2gucG9wcGVySW5zdGFuY2U/LnVwZGF0ZSgpOmguc2hvdygpfWZ1bmN0aW9uIHUoKXtpKCksdC5jdXJyZW50Py5oaWRlKCl9cmV0dXJue3Nob3c6bCxoaWRlOnUsc2NoZWR1bGVIaWRlOnMsY2FuY2VsU2NoZWR1bGVkSGlkZTppfX12YXIgdnI9eWUobWUoKSk7ZnVuY3Rpb24gQmUoZSx7dGhyb3dPbkludmFsaWQ6dD0hMH09e30pe2xldCBuPSgpPT57aWYoIXQpcmV0dXJuIG51bGw7dGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBkYXRlIGlucHV0OiAke1N0cmluZyhlKX1gKX07aWYoZT09bnVsbHx8ZT09PSIiKXJldHVybiBuKCk7aWYoZSBpbnN0YW5jZW9mIERhdGUpe2xldCBvPW5ldyBEYXRlKGUpO3JldHVybiBOdW1iZXIuaXNOYU4oby5nZXRUaW1lKCkpP24oKTpvfWlmKHR5cGVvZiBlPT0ibnVtYmVyIil7aWYoIU51bWJlci5pc0Zpbml0ZShlKSlyZXR1cm4gbigpO2xldCBvPU1hdGguYWJzKGUpPDFlMTA/ZSoxZTM6ZSxhPW5ldyBEYXRlKG8pO3JldHVybiBOdW1iZXIuaXNOYU4oYS5nZXRUaW1lKCkpP24oKTphfWlmKHR5cGVvZiBlPT0ic3RyaW5nIil7bGV0IG89ZS50cmltKCk7aWYoIW8pcmV0dXJuIG4oKTtpZigvXlxkezR9LVxkezJ9LVxkezJ9JC8udGVzdChlKSl7bGV0W3MsbCx1XT1lLnNwbGl0KCItIikubWFwKE51bWJlcik7cmV0dXJuIG5ldyBEYXRlKHMsbC0xLHUpfWxldCBhPU51bWJlcihvKTtpZighTnVtYmVyLmlzTmFOKGEpKXJldHVybiBCZShhLHt0aHJvd09uSW52YWxpZDp0fSk7bGV0IGk9bmV3IERhdGUobyk7cmV0dXJuIE51bWJlci5pc05hTihpLmdldFRpbWUoKSk/bigpOml9bGV0IHI9bmV3IERhdGUoZSk7cmV0dXJuIE51bWJlci5pc05hTihyLmdldFRpbWUoKSk/bigpOnJ9ZnVuY3Rpb24gJG4oZSl7bGV0IHQ9QmUoZSksbj10LmdldEZ1bGxZZWFyKCkscj1TdHJpbmcodC5nZXRNb250aCgpKzEpLnBhZFN0YXJ0KDIsIjAiKSxvPVN0cmluZyh0LmdldERhdGUoKSkucGFkU3RhcnQoMiwiMCIpO3JldHVybmAke259LSR7cn0tJHtvfWB9ZnVuY3Rpb24gJGUoZSl7cmV0dXJuICRuKGUpfWZ1bmN0aW9uIEd0KGUsdD0xKXtsZXQgbj1CZShlKSxvPShuLmdldERheSgpLXQrNyklNyxhPW5ldyBEYXRlKG4uZ2V0RnVsbFllYXIoKSxuLmdldE1vbnRoKCksbi5nZXREYXRlKCktbyk7cmV0dXJuIGEuc2V0SG91cnMoMCwwLDAsMCksYX1mdW5jdGlvbiBjeShlLHQ9MSl7bGV0IG49R3QoZSx0KSxyPW5ldyBEYXRlKG4pO3JldHVybiByLnNldERhdGUoci5nZXREYXRlKCkrNiksci5zZXRIb3VycygyMyw1OSw1OSw5OTkpLHJ9ZnVuY3Rpb24gZHkoZSx0PTEpe2xldCBuPUd0KGUsdCkscj1bXTtmb3IobGV0IG89MDtvPDc7bysrKXtsZXQgYT1uZXcgRGF0ZShuLmdldEZ1bGxZZWFyKCksbi5nZXRNb250aCgpLG4uZ2V0RGF0ZSgpK28pLGk9bmV3IERhdGUobi5nZXRGdWxsWWVhcigpLG4uZ2V0TW9udGgoKSxuLmdldERhdGUoKStvKzEpO3IucHVzaCh7ZnJvbTpNYXRoLmZsb29yKGEuZ2V0VGltZSgpLzFlMyksdG86TWF0aC5mbG9vcihpLmdldFRpbWUoKS8xZTMpLGRhdGVLZXk6JGUoYSl9KX1yZXR1cm57Ym91bmRhcmllczpyLHdlZWtTdGFydEtleTokZShuKX19ZnVuY3Rpb24gcHkoZSx0PTEpe2xldCBuPUd0KGUsdCk7cmV0dXJuIEFycmF5LmZyb20oe2xlbmd0aDo3fSwocixvKT0+e2xldCBhPW5ldyBEYXRlKG4uZ2V0RnVsbFllYXIoKSxuLmdldE1vbnRoKCksbi5nZXREYXRlKCkrbyk7cmV0dXJue2RheTphLnRvTG9jYWxlRGF0ZVN0cmluZyh2b2lkIDAse3dlZWtkYXk6InNob3J0In0pLGRhdGU6YS50b0lTT1N0cmluZygpLGRhdGVLZXk6JGUoYSl9fSl9ZnVuY3Rpb24gbmwoZSl7cmV0dXJuIGU9PT0ic3VuZGF5Ij8wOjF9ZnVuY3Rpb24gVm8oZSx0KXtyZXR1cm4gdD09PSIyNGgiP2Ake1N0cmluZyhlKS5wYWRTdGFydCgyLCIwIil9OjAwYDplPT09MD8iMTJhbSI6ZTwxMj9gJHtlfWFtYDplPT09MTI/IjEycG0iOmAke2UtMTJ9cG1gfWZ1bmN0aW9uIGZ5KGUpe3JldHVybiBCZShlKS50b0xvY2FsZURhdGVTdHJpbmcodm9pZCAwLHt3ZWVrZGF5OiJzaG9ydCIsbW9udGg6InNob3J0IixkYXk6Im51bWVyaWMifSl9YXN5bmMgZnVuY3Rpb24gbXkoZSx0KXtsZXQgbj1uZXcgRGF0ZSxyPUd0KG4pLG89Y3kobiksYT1lLnNldHRpbmdzW1ouVEFTS19ET01BSU5TXSxpPXt9O3RyeXtpPWE/SlNPTi5wYXJzZShhKTp7fX1jYXRjaHtpPXt9fWkuc2VsZWN0ZWREb21haW5VdWlkPXQsYXdhaXQgZS5zZXRTZXR0aW5nKFouVEFTS19ET01BSU5TLEpTT04uc3RyaW5naWZ5KGkpKTtsZXQgcz1hd2FpdCBJayhlLHQpO3JldHVybnt0YXNrczpzLHRvZGF5VGFza3M6UGsocyxuKSxjb21wbGV0ZWRUaGlzV2Vlazp4eShzLHIsbyksd2Vla2x5VmljdG9yeVZhbHVlOkxrKHMscixvKSxkYWlseVZpY3RvcnlWYWx1ZXM6emsocyxyKSxhY3RpdmVUYXNrRG9tYWluOnR9fWFzeW5jIGZ1bmN0aW9uIGh5KGUpe18oIltyZWZyZXNoVGFza0RvbWFpbnNdIFN0YXJ0aW5nIGRvbWFpbiByZWZyZXNoIik7bGV0IHQ9YXdhaXQgZS5nZXRUYXNrRG9tYWlucygpO18oYFtyZWZyZXNoVGFza0RvbWFpbnNdIEZldGNoZWQgJHt0Py5sZW5ndGg/PzB9IGRvbWFpbnMgZnJvbSBBUElgLHQpO2xldCBuPWUuc2V0dGluZ3NbWi5UQVNLX0RPTUFJTlNdLHI9e307dHJ5e3I9bj9KU09OLnBhcnNlKG4pOnt9fWNhdGNoe3I9e319cmV0dXJuIHIuZG9tYWlucz10Lm1hcChhPT4oe25hbWU6YS5uYW1lLHV1aWQ6YS51dWlkfSkpLHIubGFzdFJldHJpZXZlZD1EYXRlLm5vdygpLHIuc2VsZWN0ZWREb21haW5VdWlkJiZyLmRvbWFpbnMuc29tZShhPT5hLnV1aWQ9PT1yLnNlbGVjdGVkRG9tYWluVXVpZCl8fChfKGBbcmVmcmVzaFRhc2tEb21haW5zXSBQcmV2aW91cyBzZWxlY3Rpb24gJHtyLnNlbGVjdGVkRG9tYWluVXVpZH0gbm8gbG9uZ2VyIGV4aXN0cywgcGlja2luZyBkZWZhdWx0YCksci5zZWxlY3RlZERvbWFpblV1aWQ9Umsoci5kb21haW5zKSksYXdhaXQgZS5zZXRTZXR0aW5nKFouVEFTS19ET01BSU5TLEpTT04uc3RyaW5naWZ5KHIpKSxfKGBbcmVmcmVzaFRhc2tEb21haW5zXSBSZWZyZXNoIGNvbXBsZXRlIFx1MjAxNCAke3IuZG9tYWlucy5sZW5ndGh9IGRvbWFpbnMsIGFjdGl2ZTogJHtyLnNlbGVjdGVkRG9tYWluVXVpZH1gKSx7ZG9tYWluczpyLmRvbWFpbnMsYWN0aXZlVGFza0RvbWFpbjpyLnNlbGVjdGVkRG9tYWluVXVpZH19YXN5bmMgZnVuY3Rpb24gZ3koZSx0KXtsZXR7bGFiZWw6bix5ZWFyOnIscXVhcnRlcjpvfT10LGE9YCR7bn0gUGxhbmAsaT1lLnNldHRpbmdzW1ouUExBTk5JTkdfTk9URV9UQUddfHxCcyxzPVtYZSxpXSx1PShhd2FpdCBlLmZpbHRlck5vdGVzKHtxdWVyeTphfSkpLmZpbmQocD0+cC5uYW1lPT09YSk7aWYodSlyZXR1cm4gYXdhaXQgZS5uYXZpZ2F0ZShgaHR0cHM6Ly93d3cuYW1wbGVub3RlLmNvbS9ub3Rlcy8ke3UudXVpZH1gKSx7dXVpZDp1LnV1aWQsZXhpc3RlZDohMH07bGV0IGM9TWQobixvKSxkPWF3YWl0IGUuY3JlYXRlTm90ZShhLHMpO3JldHVybiBhd2FpdCBlLmluc2VydE5vdGVDb250ZW50KHt1dWlkOmR9LGMpLGF3YWl0IGUubmF2aWdhdGUoYGh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vbm90ZXMvJHtkfWApLHt1dWlkOmQsZXhpc3RlZDohMX19YXN5bmMgZnVuY3Rpb24geXkoZSx0LHthcGlLZXk6bixwcm92aWRlcjpyfT17fSl7aWYobnx8KG49ZS5zZXR0aW5ncz8uWyJMTE0gQVBJIEtleSJdKSxyfHwocj1lLnNldHRpbmdzPy5bWi5MTE1fUFJPVklERVJfTU9ERUxdfHwib3BlbmFpIiksIW4pcmV0dXJuW107bGV0IG89dD9gQmFzZWQgb24gdGhlc2UgcXVhcnRlcmx5IGdvYWxzLCBnZW5lcmF0ZSAyIHNob3J0IGluc3BpcmF0aW9uYWwgcXVvdGVzICgxLTIgc2VudGVuY2VzIGVhY2gpIHRoYXQgbW90aXZhdGUgcHJvZ3Jlc3MgdG93YXJkIHRoZXNlIGdvYWxzLiBSZXR1cm4gYXMgSlNPTiBhcnJheSBbe3RleHQsIGF1dGhvcn1dLiBHb2FsczogJHt0LnN1YnN0cmluZygwLDUwMCl9YDoiR2VuZXJhdGUgMiBzaG9ydCBpbnNwaXJhdGlvbmFsIHF1b3RlcyBhYm91dCBwcm9kdWN0aXZpdHkgYW5kIHBlcnNvbmFsIGdyb3d0aC4gUmV0dXJuIGFzIEpTT04gYXJyYXkgW3t0ZXh0LCBhdXRob3J9XS4iLGE9cj09PSJhbnRocm9waWMiPyJodHRwczovL2FwaS5hbnRocm9waWMuY29tL3YxL21lc3NhZ2VzIjoiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MS9jaGF0L2NvbXBsZXRpb25zIixpPXI9PT0iYW50aHJvcGljIj97IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24iLCJ4LWFwaS1rZXkiOm4sImFudGhyb3BpYy12ZXJzaW9uIjoiMjAyMy0wNi0wMSJ9OnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiIsQXV0aG9yaXphdGlvbjpgQmVhcmVyICR7bn1gfSxzPXI9PT0iYW50aHJvcGljIj97bW9kZWw6ImNsYXVkZS1zb25uZXQtNC0yMDI1MDUxNCIsbWF4X3Rva2VuczozMDAsbWVzc2FnZXM6W3tyb2xlOiJ1c2VyIixjb250ZW50Om99XX06e21vZGVsOiJncHQtNG8tbWluaSIsbWVzc2FnZXM6W3tyb2xlOiJ1c2VyIixjb250ZW50Om99XSxtYXhfdG9rZW5zOjMwMH07dHJ5e2xldCB1PWF3YWl0KGF3YWl0IGZldGNoKGEse21ldGhvZDoiUE9TVCIsaGVhZGVyczppLGJvZHk6SlNPTi5zdHJpbmdpZnkocyl9KSkuanNvbigpLGM9cj09PSJhbnRocm9waWMiP3U/LmNvbnRlbnQ/LlswXT8udGV4dDp1Py5jaG9pY2VzPy5bMF0/Lm1lc3NhZ2U/LmNvbnRlbnQ7cmV0dXJuIEpTT04ucGFyc2UoYyl9Y2F0Y2gobCl7cmV0dXJuIF8oIlF1b3RlIGZldGNoIGVycm9yOiIsbCksW3t0ZXh0OiJXaGF0IGdldHMgbWVhc3VyZWQgZ2V0cyBtYW5hZ2VkLiIsYXV0aG9yOiJQZXRlciBEcnVja2VyIn0se3RleHQ6IlNtYWxsIGRhaWx5IGltcHJvdmVtZW50cyBsZWFkIHRvIHN0dW5uaW5nIHJlc3VsdHMuIixhdXRob3I6IlJvYmluIFNoYXJtYSJ9XX19YXN5bmMgZnVuY3Rpb24gT2QoZSx0LG4pe2lmKCF0KXJldHVybntmb3VuZDohMSxjb250ZW50Om51bGx9O2xldCByPWF3YWl0IGUuZ2V0Tm90ZVNlY3Rpb25zKHt1dWlkOnR9KTtfKGBbZ2V0TW9udGhseVBsYW5Db250ZW50XSBub3RlVVVJRD0ke3R9IG1vbnRoTmFtZT0iJHtufSIgc2VjdGlvbnM6YCxyPy5tYXAocz0+cy5oZWFkaW5nPy50ZXh0KSk7bGV0IG89ci5maW5kKHM9PnMuaGVhZGluZyYmcy5oZWFkaW5nLnRleHQmJnMuaGVhZGluZy50ZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpPT09bi50b0xvd2VyQ2FzZSgpKTtpZihfKCJbZ2V0TW9udGhseVBsYW5Db250ZW50XSBtb250aFNlY3Rpb24gZm91bmQ6IiwhIW8pLCFvKXJldHVybntmb3VuZDohMSxjb250ZW50Om51bGx9O2xldCBhPWF3YWl0IGUuZ2V0Tm90ZUNvbnRlbnQoe3V1aWQ6dH0pLGk9Rm8oYSxuKTtyZXR1cm4gXyhgW2dldE1vbnRobHlQbGFuQ29udGVudF0gZXh0cmFjdGVkIGNvbnRlbnQgbGVuZ3RoOiAke2k/Lmxlbmd0aD8/MH1gKSx7Zm91bmQ6ITAsY29udGVudDppfHwiIn19YXN5bmMgZnVuY3Rpb24gdnkoZSx0LG4pe2xldHtsYWJlbDpyLHllYXI6byxxdWFydGVyOmF9PXQsaT1gJHtyfSBQbGFuYCxzPWUuc2V0dGluZ3NbWi5QTEFOTklOR19OT1RFX1RBR118fEJzLGw9W1hlLHNdLGM9KGF3YWl0IGUuZmlsdGVyTm90ZXMoe3F1ZXJ5Oml9KSkuZmluZCh5PT55Lm5hbWU9PT1pKSxkO2lmKGMpZD1jLnV1aWQsYXdhaXQgZS5pbnNlcnROb3RlQ29udGVudCh7dXVpZDpkfSxzZChuKSx7YXRFbmQ6ITB9KTtlbHNle2xldCB5PU1kKHIsYSk7ZD1hd2FpdCBlLmNyZWF0ZU5vdGUoaSxsKSxhd2FpdCBlLmluc2VydE5vdGVDb250ZW50KHt1dWlkOmR9LHkpfWxldCBwPWF3YWl0IGJ5KGUsZCxuKTtyZXR1cm57bm90ZVVVSUQ6ZCxjb250ZW50OnAsY3JlYXRlZDohY319YXN5bmMgZnVuY3Rpb24gd3koZSx0LG4pe2xldHtsYWJlbDpyLHllYXI6byxxdWFydGVyOmF9PXQsaT1gJHtyfSBQbGFuYCxzPWUuc2V0dGluZ3NbWi5QTEFOTklOR19OT1RFX1RBR118fEJzLGw9W1hlLHNdLGM9KGF3YWl0IGUuZmlsdGVyTm90ZXMoe3F1ZXJ5Oml9KSkuZmluZCh5PT55Lm5hbWU9PT1pKSxkO2lmKGMpZD1jLnV1aWQsKGF3YWl0IE9kKGUsZCxuKSkuZm91bmR8fGF3YWl0IGUuaW5zZXJ0Tm90ZUNvbnRlbnQoe3V1aWQ6ZH0sbGQobikse2F0RW5kOiEwfSk7ZWxzZXtsZXQgeT1NZChyLGEpO2Q9YXdhaXQgZS5jcmVhdGVOb3RlKGksbCksYXdhaXQgZS5pbnNlcnROb3RlQ29udGVudCh7dXVpZDpkfSx5KSxhd2FpdCBlLmluc2VydE5vdGVDb250ZW50KHt1dWlkOmR9LGxkKG4pLHthdEVuZDohMH0pfWxldCBwPWF3YWl0IGJ5KGUsZCxuKTtyZXR1cm57bm90ZVVVSUQ6ZCxjb250ZW50OnB9fWFzeW5jIGZ1bmN0aW9uIGJ5KGUsdCxuLHthdHRlbXB0czpyPTMsZGVsYXlNczpvPTUwMH09e30pe2ZvcihsZXQgYT0wO2E8cjthKyspe2E+MCYmYXdhaXQgbmV3IFByb21pc2UobD0+c2V0VGltZW91dChsLG8pKTtsZXQgaT1hd2FpdCBlLmdldE5vdGVDb250ZW50KHt1dWlkOnR9KSxzPUZvKGksbik7aWYocylyZXR1cm4gc31yZXR1cm4gc2Qobikuc3BsaXQoYApgKS5maWx0ZXIoYT0+YSYmIWEuc3RhcnRzV2l0aCgiIyIpKS5qb2luKGAKYCl9ZnVuY3Rpb24gUmsoZSl7aWYoIWV8fGUubGVuZ3RoPT09MClyZXR1cm4gbnVsbDtsZXQgdD1lLmZpbmQobj0+bi5uYW1lPT09IldvcmsiKTtyZXR1cm4gdD90LnV1aWQ6ZVswXS51dWlkfWFzeW5jIGZ1bmN0aW9uIElrKGUsdCl7aWYoIXQpcmV0dXJuW107dHJ5e2xldCBuPWF3YWl0IGUuZ2V0VGFza0RvbWFpblRhc2tzKHQpO3JldHVybiBBcnJheS5pc0FycmF5KG4pP246W119Y2F0Y2gobil7cmV0dXJuIF8oYFtfZmV0Y2hUYXNrc0ZvckRvbWFpbl0gZ2V0VGFza0RvbWFpblRhc2tzIGZhaWxlZCBmb3IgZG9tYWluICR7dH06YCxuKSxbXX19ZnVuY3Rpb24gUGsoZSx0KXtsZXQgbj1uZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksdC5nZXRNb250aCgpLHQuZ2V0RGF0ZSgpKS5nZXRUaW1lKCkscj1uKzg2NGU1O3JldHVybiBlLmZpbHRlcihvPT4hby5jb21wbGV0ZWRBdCYmIW8uZGlzbWlzc2VkQXQmJmNuKG8uc3RhcnRBdCkmJmNuKG8uc3RhcnRBdCk+PW4mJmNuKG8uc3RhcnRBdCk8cikuc29ydCgobyxhKT0+KGNuKG8uc3RhcnRBdCl8fDApLShjbihhLnN0YXJ0QXQpfHwwKSl9ZnVuY3Rpb24geHkoZSx0LG4pe2xldCByPXQuZ2V0VGltZSgpLG89bi5nZXRUaW1lKCk7cmV0dXJuIGUuZmlsdGVyKGE9PmNuKGEuY29tcGxldGVkQXQpJiZjbihhLmNvbXBsZXRlZEF0KT49ciYmY24oYS5jb21wbGV0ZWRBdCk8PW8pfWZ1bmN0aW9uIExrKGUsdCxuKXtyZXR1cm4geHkoZSx0LG4pLnJlZHVjZSgocixvKT0+cisoby52aWN0b3J5VmFsdWV8fDApLDApfWZ1bmN0aW9uIHprKGUsdCl7cmV0dXJuIEFycmF5LmZyb20oe2xlbmd0aDo3fSwocixvKT0+e2xldCBhPW5ldyBEYXRlKHQpO2Euc2V0RGF0ZShhLmdldERhdGUoKStvKTtsZXQgaT1uZXcgRGF0ZShhKTtpLnNldERhdGUoaS5nZXREYXRlKCkrMSk7bGV0IHM9ZS5maWx0ZXIobD0+Y24obC5jb21wbGV0ZWRBdCkmJmNuKGwuY29tcGxldGVkQXQpPj1hLmdldFRpbWUoKSYmY24obC5jb21wbGV0ZWRBdCk8aS5nZXRUaW1lKCkpO3JldHVybntkYXk6WyJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiLCJTdW4iXVtvXSxkYXRlOmEudG9JU09TdHJpbmcoKSx2YWx1ZTpzLnJlZHVjZSgobCx1KT0+bCsodS52aWN0b3J5VmFsdWV8fDApLDApLHRhc2tDb3VudDpzLmxlbmd0aH19KX1mdW5jdGlvbiBjbihlKXtpZihlPT1udWxsKXJldHVybiBudWxsO2lmKHR5cGVvZiBlIT0ibnVtYmVyIil7bGV0IHQ9TnVtYmVyKGUpO3JldHVybiBOdW1iZXIuaXNGaW5pdGUodCk/dDwxZTEwP3QqMWUzOnQ6bnVsbH1yZXR1cm4gZTwxZTEwP2UqMWUzOmV9ZnVuY3Rpb24gTWQoZSx0KXtsZXQgcj17MTpbIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIl0sMjpbIkFwcmlsIiwiTWF5IiwiSnVuZSJdLDM6WyJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIl0sNDpbIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl19W3RdfHxbIk1vbnRoIDEiLCJNb250aCAyIiwiTW9udGggMyJdO3JldHVybmBRdWFydGVybHkgUGxhbiBcdTIwMTQgJHtlfQoKIyBRdWFydGVyIFRoZW1lCltPbmUgc2VudGVuY2UgZGVzY3JpYmluZyB0aGUgbWFpbiBmb2N1cyBvZiB0aGlzIHF1YXJ0ZXIuXQoKIyMgU3VjY2VzcyBMb29rcyBMaWtlCjEuIFsgXSBbVG9wIG91dGNvbWVdCjIuIFsgXSBbVG9wIG91dGNvbWVdCjMuIFsgXSBbVG9wIG91dGNvbWVdCgojIFByb2plY3RzCgojIyBbUHJvamVjdCAxXQotIE91dGNvbWU6Ci0gV2h5IG5vdzoKLSBXZWVrbHkgcmh5dGhtOgotIERlYWRsaW5lOgotIENvbnN0cmFpbnRzOgotIERvbmUgZW5vdWdoIHdoZW46CgojIyBbUHJvamVjdCAyXQotIE91dGNvbWU6Ci0gV2h5IG5vdzoKLSBXZWVrbHkgcmh5dGhtOgotIERlYWRsaW5lOgotIENvbnN0cmFpbnRzOgotIERvbmUgZW5vdWdoIHdoZW46CgojIyBbUHJvamVjdCAzXQotIE91dGNvbWU6Ci0gV2h5IG5vdzoKLSBXZWVrbHkgcmh5dGhtOgotIERlYWRsaW5lOgotIENvbnN0cmFpbnRzOgotIERvbmUgZW5vdWdoIHdoZW46CgojIE5vdCBUaGlzIFF1YXJ0ZXIKLSBbIF0gW0xvd2VyLXByaW9yaXR5IHByb2plY3RdCi0gWyBdIFtDb21taXRtZW50IHRvIGRlY2xpbmVdCi0gWyBdIFtBcmVhIHRvIGludGVudGlvbmFsbHkgaWdub3JlXQoKIyBEYXktb2YtV2VlayBCcmVha2Rvd24KQW55IGNhdGVnb3J5IG9mIHRhc2sgeW91IHdvdWxkIGxpa2UgdG8gaGF2ZSBiZSB0aGUgZm9jdXMgZm9yIGRpZmZlcmVudCBkYXlzLW9mLXdlZWsgKHNvbWV0aW1lcyBjYWxsZWQgImRheSBzdHJpcGluZyIpPwpTZXBhcmF0ZSB5b3VyIHRhc2sgY2F0ZWdvcmllcyB3aXRoIGEgc2VtaWNvbG9uIChpLmUuLCAiOyIpLiBXZSB3aWxsIGNvbnNpZGVyIHRoZW0gd2hlbiBwcm9wb3NpbmcgcG9zc2libGUgCmRhaWx5IGFnZW5kYXMgZnJvbSB5b3VyIGV4aXN0aW5nIHRhc2tzLiAgCgotIE1vbmRheXM6IAotIFR1ZXNkYXlzOiAKLSBXZWRuZXNkYXlzOiAKLSBUaHVyc2RheXM6IAotIEZyaWRheXM6IAoKW0FtcGxlbm90ZSBtZXNzYWdlXQpZb3UgY2FuIGFsc28gYWRkIFNhdHVyZGF5IGFuZCBTdW5kYXkgaWYgeW91IGxpa2U7IHRoZXkncmUgbm90IGluIHRoZSBsaXN0IHNpbmNlIGJ5IGRlZmF1bHQgYmVjYXVzZSB3ZSBzdXNwZWN0IAp5b3UncmUgYmVzdCBvZmYgcHJlc2VydmluZyB5b3VyIHdlZWtlbmQgZm9yIHVucGxhbm5lZCBmYW1pbHkgJiByZXN0b3JhdGlvbiBhY3Rpdml0aWVzLiAgIAoKIyBNb250aC1ieS1Nb250aCBCcmVha2Rvd24KCiMjICR7clswXX0KLSBGb2N1czoKLSBLZXkgbW92ZToKCiMjICR7clsxXX0KLSBGb2N1czoKLSBLZXkgbW92ZToKCiMjICR7clsyXX0KLSBGb2N1czoKLSBLZXkgbW92ZToKCiMgV2Vla2x5IFBsYW5uaW5nIFByb21wdApXaGljaCBwcm9qZWN0cyBuZWVkIHRpbWUgb24gbXkgY2FsZW5kYXIgdGhpcyB3ZWVrPwoKIyBRdWFydGVybHkgUmV2aWV3Ci0gRmluaXNoZWQ6Ci0gUHJvZ3Jlc3MgbWFkZToKLSBMZXNzb25zIGxlYXJuZWQ6Ci0gQ2FycnkgZm9yd2FyZDpgfWFzeW5jIGZ1bmN0aW9uIFJkKGUsdCxuKXtyZXR1cm4gYXdhaXQgT2QoZSx0LG4pfWFzeW5jIGZ1bmN0aW9uIGt5KGUsdCxuKXtyZXR1cm4gYXdhaXQgdnkoZSx0LG4pfWFzeW5jIGZ1bmN0aW9uIFN5KGUsdCxuKXtyZXR1cm4gYXdhaXQgd3koZSx0LG4pfWFzeW5jIGZ1bmN0aW9uIEV5KGUsdCl7bGV0IG49YXdhaXQgZ3koZSx0KTtyZXR1cm4gTG4mJm4/LnV1aWQ/ey4uLm4sZGV2RWRpdDohMCxub3RlVVVJRDpuLnV1aWR9Om59YXN5bmMgZnVuY3Rpb24gcmwoZSx0KXtyZXR1cm4gTG4/e2RldkVkaXQ6ITAsbm90ZVVVSUQ6dH06YXdhaXQgZS5uYXZpZ2F0ZShgaHR0cHM6Ly93d3cuYW1wbGVub3RlLmNvbS9ub3Rlcy8ke3R9YCl9YXN5bmMgZnVuY3Rpb24gVHkoZSx0KXtyZXR1cm4gYXdhaXQgZS5nZXROb3RlQ29udGVudCh7dXVpZDp0fSl9YXN5bmMgZnVuY3Rpb24gTnkoZSx0LG4scil7cmV0dXJuIGF3YWl0IGUucmVwbGFjZU5vdGVDb250ZW50KHt1dWlkOnR9LG4scil9ZnVuY3Rpb24gSWQoe2FwcDplLG5vdGVVVUlEOnQsb25CYWNrOm59KXtsZXQgcj12ci5jcmVhdGVFbGVtZW50LFtvLGFdPSgwLHZyLnVzZVN0YXRlKSgiIiksW2ksc109KDAsdnIudXNlU3RhdGUpKCEwKSxbbCx1XT0oMCx2ci51c2VTdGF0ZSkoITEpOygwLHZyLnVzZUVmZmVjdCkoKCk9PntsZXQgZD0hMTtyZXR1cm4gVHkoZSx0KS50aGVuKHA9PntkfHwoYShwfHwiIikscyghMSkpfSksKCk9PntkPSEwfX0sW3QsZV0pO2xldCBjPWFzeW5jKCk9Pnt1KCEwKSxhd2FpdCBOeShlLHQsbyksdSghMSl9O3JldHVybiBpP3IoImRpdiIse2NsYXNzTmFtZToibm90ZS1lZGl0b3ItbG9hZGluZyJ9LCJMb2FkaW5nIG5vdGVcdTIwMjYiKTpyKCJkaXYiLHtjbGFzc05hbWU6Im5vdGUtZWRpdG9yIn0scigiZGl2Iix7Y2xhc3NOYW1lOiJub3RlLWVkaXRvci10b29sYmFyIn0scigiYnV0dG9uIix7Y2xhc3NOYW1lOiJub3RlLWVkaXRvci1idG4gbm90ZS1lZGl0b3ItYnRuLS1iYWNrIixvbkNsaWNrOm59LCJcdTIxOTAgQmFjayIpLHIoImJ1dHRvbiIse2NsYXNzTmFtZToibm90ZS1lZGl0b3ItYnRuIG5vdGUtZWRpdG9yLWJ0bi0tc2F2ZSIsb25DbGljazpjLGRpc2FibGVkOmx9LGw/IlNhdmluZ1x1MjAyNiI6IlNhdmUiKSkscigidGV4dGFyZWEiLHtjbGFzc05hbWU6Im5vdGUtZWRpdG9yLXRleHRhcmVhIix2YWx1ZTpvLG9uQ2hhbmdlOmQ9PmEoZC50YXJnZXQudmFsdWUpfSkpfXZhciBSdD15ZShtZSgpKTtmdW5jdGlvbiBGZCgpe3JldHVybnthc3luYzohMSxicmVha3M6ITEsZXh0ZW5zaW9uczpudWxsLGdmbTohMCxob29rczpudWxsLHBlZGFudGljOiExLHJlbmRlcmVyOm51bGwsc2lsZW50OiExLHRva2VuaXplcjpudWxsLHdhbGtUb2tlbnM6bnVsbH19dmFyIEpyPUZkKCk7ZnVuY3Rpb24gTXkoZSl7SnI9ZX12YXIgcmk9e2V4ZWM6KCk9Pm51bGx9O2Z1bmN0aW9uIGhlKGUsdD0iIil7bGV0IG49dHlwZW9mIGU9PSJzdHJpbmciP2U6ZS5zb3VyY2Uscj17cmVwbGFjZToobyxhKT0+e2xldCBpPXR5cGVvZiBhPT0ic3RyaW5nIj9hOmEuc291cmNlO3JldHVybiBpPWkucmVwbGFjZSh5dC5jYXJldCwiJDEiKSxuPW4ucmVwbGFjZShvLGkpLHJ9LGdldFJlZ2V4OigpPT5uZXcgUmVnRXhwKG4sdCl9O3JldHVybiByfXZhciB5dD17Y29kZVJlbW92ZUluZGVudDovXig/OiB7MSw0fXwgezAsM31cdCkvZ20sb3V0cHV0TGlua1JlcGxhY2U6L1xcKFtcW1xdXSkvZyxpbmRlbnRDb2RlQ29tcGVuc2F0aW9uOi9eKFxzKykoPzpgYGApLyxiZWdpbm5pbmdTcGFjZTovXlxzKy8sZW5kaW5nSGFzaDovIyQvLHN0YXJ0aW5nU3BhY2VDaGFyOi9eIC8sZW5kaW5nU3BhY2VDaGFyOi8gJC8sbm9uU3BhY2VDaGFyOi9bXiBdLyxuZXdMaW5lQ2hhckdsb2JhbDovXG4vZyx0YWJDaGFyR2xvYmFsOi9cdC9nLG11bHRpcGxlU3BhY2VHbG9iYWw6L1xzKy9nLGJsYW5rTGluZTovXlsgXHRdKiQvLGRvdWJsZUJsYW5rTGluZTovXG5bIFx0XSpcblsgXHRdKiQvLGJsb2NrcXVvdGVTdGFydDovXiB7MCwzfT4vLGJsb2NrcXVvdGVTZXRleHRSZXBsYWNlOi9cbiB7MCwzfSgoPzo9K3wtKykgKikoPz1cbnwkKS9nLGJsb2NrcXVvdGVTZXRleHRSZXBsYWNlMjovXiB7MCwzfT5bIFx0XT8vZ20sbGlzdFJlcGxhY2VUYWJzOi9eXHQrLyxsaXN0UmVwbGFjZU5lc3Rpbmc6L14gezEsNH0oPz0oIHs0fSkqW14gXSkvZyxsaXN0SXNUYXNrOi9eXFtbIHhYXVxdIC8sbGlzdFJlcGxhY2VUYXNrOi9eXFtbIHhYXVxdICsvLGFueUxpbmU6L1xuLipcbi8saHJlZkJyYWNrZXRzOi9ePCguKik+JC8sdGFibGVEZWxpbWl0ZXI6L1s6fF0vLHRhYmxlQWxpZ25DaGFyczovXlx8fFx8ICokL2csdGFibGVSb3dCbGFua0xpbmU6L1xuWyBcdF0qJC8sdGFibGVBbGlnblJpZ2h0Oi9eICotKzogKiQvLHRhYmxlQWxpZ25DZW50ZXI6L14gKjotKzogKiQvLHRhYmxlQWxpZ25MZWZ0Oi9eICo6LSsgKiQvLHN0YXJ0QVRhZzovXjxhIC9pLGVuZEFUYWc6L148XC9hPi9pLHN0YXJ0UHJlU2NyaXB0VGFnOi9ePChwcmV8Y29kZXxrYmR8c2NyaXB0KShcc3w+KS9pLGVuZFByZVNjcmlwdFRhZzovXjxcLyhwcmV8Y29kZXxrYmR8c2NyaXB0KShcc3w+KS9pLHN0YXJ0QW5nbGVCcmFja2V0Oi9ePC8sZW5kQW5nbGVCcmFja2V0Oi8+JC8scGVkYW50aWNIcmVmVGl0bGU6L14oW14nIl0qW15cc10pXHMrKFsnIl0pKC4qKVwyLyx1bmljb2RlQWxwaGFOdW1lcmljOi9bXHB7TH1ccHtOfV0vdSxlc2NhcGVUZXN0Oi9bJjw+IiddLyxlc2NhcGVSZXBsYWNlOi9bJjw+IiddL2csZXNjYXBlVGVzdE5vRW5jb2RlOi9bPD4iJ118Jig/ISgjXGR7MSw3fXwjW1h4XVthLWZBLUYwLTldezEsNn18XHcrKTspLyxlc2NhcGVSZXBsYWNlTm9FbmNvZGU6L1s8PiInXXwmKD8hKCNcZHsxLDd9fCNbWHhdW2EtZkEtRjAtOV17MSw2fXxcdyspOykvZyx1bmVzY2FwZVRlc3Q6LyYoIyg/OlxkKyl8KD86I3hbMC05QS1GYS1mXSspfCg/Olx3KykpOz8vaWcsY2FyZXQ6LyhefFteXFtdKVxeL2cscGVyY2VudERlY29kZTovJTI1L2csZmluZFBpcGU6L1x8L2csc3BsaXRQaXBlOi8gXHwvLHNsYXNoUGlwZTovXFxcfC9nLGNhcnJpYWdlUmV0dXJuOi9cclxufFxyL2csc3BhY2VMaW5lOi9eICskL2dtLG5vdFNwYWNlU3RhcnQ6L15cUyovLGVuZGluZ05ld2xpbmU6L1xuJC8sbGlzdEl0ZW1SZWdleDplPT5uZXcgUmVnRXhwKGBeKCB7MCwzfSR7ZX0pKCg/OlsJIF1bXlxcbl0qKT8oPzpcXG58JCkpYCksbmV4dEJ1bGxldFJlZ2V4OmU9Pm5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLGUtMSl9fSg/OlsqKy1dfFxcZHsxLDl9Wy4pXSkoKD86WyAJXVteXFxuXSopPyg/OlxcbnwkKSlgKSxoclJlZ2V4OmU9Pm5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLGUtMSl9fSgoPzotICopezMsfXwoPzpfICopezMsfXwoPzpcXCogKil7Myx9KSg/Olxcbit8JClgKSxmZW5jZXNCZWdpblJlZ2V4OmU9Pm5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLGUtMSl9fSg/OlxgXGBcYHx+fn4pYCksaGVhZGluZ0JlZ2luUmVnZXg6ZT0+bmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsZS0xKX19I2ApLGh0bWxCZWdpblJlZ2V4OmU9Pm5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLGUtMSl9fTwoPzpbYS16XS4qPnwhLS0pYCwiaSIpfSxGaz0vXig/OlsgXHRdKig/OlxufCQpKSsvLFVrPS9eKCg/OiB7NH18IHswLDN9XHQpW15cbl0rKD86XG4oPzpbIFx0XSooPzpcbnwkKSkqKT8pKy8sJGs9L14gezAsM30oYHszLH0oPz1bXmBcbl0qKD86XG58JCkpfH57Myx9KShbXlxuXSopKD86XG58JCkoPzp8KFtcc1xTXSo/KSg/OlxufCQpKSg/OiB7MCwzfVwxW35gXSogKig/PVxufCQpfCQpLyxvaT0vXiB7MCwzfSgoPzotW1x0IF0qKXszLH18KD86X1sgXHRdKil7Myx9fCg/OlwqWyBcdF0qKXszLH0pKD86XG4rfCQpLyxCaz0vXiB7MCwzfSgjezEsNn0pKD89XHN8JCkoLiopKD86XG4rfCQpLyxVZD0vKD86WyorLV18XGR7MSw5fVsuKV0pLyxSeT0vXig/IWJ1bGwgfGJsb2NrQ29kZXxmZW5jZXN8YmxvY2txdW90ZXxoZWFkaW5nfGh0bWx8dGFibGUpKCg/Oi58XG4oPyFccyo/XG58YnVsbCB8YmxvY2tDb2RlfGZlbmNlc3xibG9ja3F1b3RlfGhlYWRpbmd8aHRtbHx0YWJsZSkpKz8pXG4gezAsM30oPSt8LSspICooPzpcbit8JCkvLEl5PWhlKFJ5KS5yZXBsYWNlKC9idWxsL2csVWQpLnJlcGxhY2UoL2Jsb2NrQ29kZS9nLC8oPzogezR9fCB7MCwzfVx0KS8pLnJlcGxhY2UoL2ZlbmNlcy9nLC8gezAsM30oPzpgezMsfXx+ezMsfSkvKS5yZXBsYWNlKC9ibG9ja3F1b3RlL2csLyB7MCwzfT4vKS5yZXBsYWNlKC9oZWFkaW5nL2csLyB7MCwzfSN7MSw2fS8pLnJlcGxhY2UoL2h0bWwvZywvIHswLDN9PFteXG4+XSs+XG4vKS5yZXBsYWNlKC9cfHRhYmxlL2csIiIpLmdldFJlZ2V4KCksV2s9aGUoUnkpLnJlcGxhY2UoL2J1bGwvZyxVZCkucmVwbGFjZSgvYmxvY2tDb2RlL2csLyg/OiB7NH18IHswLDN9XHQpLykucmVwbGFjZSgvZmVuY2VzL2csLyB7MCwzfSg/OmB7Myx9fH57Myx9KS8pLnJlcGxhY2UoL2Jsb2NrcXVvdGUvZywvIHswLDN9Pi8pLnJlcGxhY2UoL2hlYWRpbmcvZywvIHswLDN9I3sxLDZ9LykucmVwbGFjZSgvaHRtbC9nLC8gezAsM308W15cbj5dKz5cbi8pLnJlcGxhY2UoL3RhYmxlL2csLyB7MCwzfVx8Pyg/Ols6XC0gXSpcfCkrW1w6XC0gXSpcbi8pLmdldFJlZ2V4KCksJGQ9L14oW15cbl0rKD86XG4oPyFocnxoZWFkaW5nfGxoZWFkaW5nfGJsb2NrcXVvdGV8ZmVuY2VzfGxpc3R8aHRtbHx0YWJsZXwgK1xuKVteXG5dKykqKS8sSGs9L15bXlxuXSsvLEJkPS8oPyFccypcXSkoPzpcXC58W15cW1xdXFxdKSsvLGprPWhlKC9eIHswLDN9XFsobGFiZWwpXF06ICooPzpcblsgXHRdKik/KFtePFxzXVteXHNdKnw8Lio/PikoPzooPzogKyg/OlxuWyBcdF0qKT98ICpcblsgXHRdKikodGl0bGUpKT8gKig/OlxuK3wkKS8pLnJlcGxhY2UoImxhYmVsIixCZCkucmVwbGFjZSgidGl0bGUiLC8oPzoiKD86XFwiP3xbXiJcXF0pKiJ8J1teJ1xuXSooPzpcblteJ1xuXSspKlxuPyd8XChbXigpXSpcKSkvKS5nZXRSZWdleCgpLFZrPWhlKC9eKCB7MCwzfWJ1bGwpKFsgXHRdW15cbl0rPyk/KD86XG58JCkvKS5yZXBsYWNlKC9idWxsL2csVWQpLmdldFJlZ2V4KCksdWw9ImFkZHJlc3N8YXJ0aWNsZXxhc2lkZXxiYXNlfGJhc2Vmb250fGJsb2NrcXVvdGV8Ym9keXxjYXB0aW9ufGNlbnRlcnxjb2x8Y29sZ3JvdXB8ZGR8ZGV0YWlsc3xkaWFsb2d8ZGlyfGRpdnxkbHxkdHxmaWVsZHNldHxmaWdjYXB0aW9ufGZpZ3VyZXxmb290ZXJ8Zm9ybXxmcmFtZXxmcmFtZXNldHxoWzEtNl18aGVhZHxoZWFkZXJ8aHJ8aHRtbHxpZnJhbWV8bGVnZW5kfGxpfGxpbmt8bWFpbnxtZW51fG1lbnVpdGVtfG1ldGF8bmF2fG5vZnJhbWVzfG9sfG9wdGdyb3VwfG9wdGlvbnxwfHBhcmFtfHNlYXJjaHxzZWN0aW9ufHN1bW1hcnl8dGFibGV8dGJvZHl8dGR8dGZvb3R8dGh8dGhlYWR8dGl0bGV8dHJ8dHJhY2t8dWwiLFdkPS88IS0tKD86LT8+fFtcc1xTXSo/KD86LS0+fCQpKS8sR2s9aGUoIl4gezAsM30oPzo8KHNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWEpW1xccz5dW1xcc1xcU10qPyg/OjwvXFwxPlteXFxuXSpcXG4rfCQpfGNvbW1lbnRbXlxcbl0qKFxcbit8JCl8PFxcP1tcXHNcXFNdKj8oPzpcXD8+XFxuKnwkKXw8IVtBLVpdW1xcc1xcU10qPyg/Oj5cXG4qfCQpfDwhXFxbQ0RBVEFcXFtbXFxzXFxTXSo/KD86XFxdXFxdPlxcbip8JCl8PC8/KHRhZykoPzogK3xcXG58Lz8+KVtcXHNcXFNdKj8oPzooPzpcXG5bIAldKikrXFxufCQpfDwoPyFzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhKShbYS16XVtcXHctXSopKD86YXR0cmlidXRlKSo/ICovPz4oPz1bIFxcdF0qKD86XFxufCQpKVtcXHNcXFNdKj8oPzooPzpcXG5bIAldKikrXFxufCQpfDwvKD8hc2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYSlbYS16XVtcXHctXSpcXHMqPig/PVsgXFx0XSooPzpcXG58JCkpW1xcc1xcU10qPyg/Oig/OlxcblsgCV0qKStcXG58JCkpIiwiaSIpLnJlcGxhY2UoImNvbW1lbnQiLFdkKS5yZXBsYWNlKCJ0YWciLHVsKS5yZXBsYWNlKCJhdHRyaWJ1dGUiLC8gK1thLXpBLVo6X11bXHcuOi1dKig/OiAqPSAqIlteIlxuXSoifCAqPSAqJ1teJ1xuXSonfCAqPSAqW15ccyInPTw+YF0rKT8vKS5nZXRSZWdleCgpLFB5PWhlKCRkKS5yZXBsYWNlKCJociIsb2kpLnJlcGxhY2UoImhlYWRpbmciLCIgezAsM30jezEsNn0oPzpcXHN8JCkiKS5yZXBsYWNlKCJ8bGhlYWRpbmciLCIiKS5yZXBsYWNlKCJ8dGFibGUiLCIiKS5yZXBsYWNlKCJibG9ja3F1b3RlIiwiIHswLDN9PiIpLnJlcGxhY2UoImZlbmNlcyIsIiB7MCwzfSg/OmB7Myx9KD89W15gXFxuXSpcXG4pfH57Myx9KVteXFxuXSpcXG4iKS5yZXBsYWNlKCJsaXN0IiwiIHswLDN9KD86WyorLV18MVsuKV0pICIpLnJlcGxhY2UoImh0bWwiLCI8Lz8oPzp0YWcpKD86ICt8XFxufC8/Pil8PCg/OnNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWF8IS0tKSIpLnJlcGxhY2UoInRhZyIsdWwpLmdldFJlZ2V4KCksS2s9aGUoL14oIHswLDN9PiA/KHBhcmFncmFwaHxbXlxuXSopKD86XG58JCkpKy8pLnJlcGxhY2UoInBhcmFncmFwaCIsUHkpLmdldFJlZ2V4KCksSGQ9e2Jsb2NrcXVvdGU6S2ssY29kZTpVayxkZWY6amssZmVuY2VzOiRrLGhlYWRpbmc6QmssaHI6b2ksaHRtbDpHayxsaGVhZGluZzpJeSxsaXN0OlZrLG5ld2xpbmU6RmsscGFyYWdyYXBoOlB5LHRhYmxlOnJpLHRleHQ6SGt9LER5PWhlKCJeICooW15cXG4gXS4qKVxcbiB7MCwzfSgoPzpcXHwgKik/Oj8tKzo/ICooPzpcXHwgKjo/LSs6PyAqKSooPzpcXHwgKik/KSg/OlxcbigoPzooPyEgKlxcbnxocnxoZWFkaW5nfGJsb2NrcXVvdGV8Y29kZXxmZW5jZXN8bGlzdHxodG1sKS4qKD86XFxufCQpKSopXFxuKnwkKSIpLnJlcGxhY2UoImhyIixvaSkucmVwbGFjZSgiaGVhZGluZyIsIiB7MCwzfSN7MSw2fSg/Olxcc3wkKSIpLnJlcGxhY2UoImJsb2NrcXVvdGUiLCIgezAsM30+IikucmVwbGFjZSgiY29kZSIsIig/OiB7NH18IHswLDN9CSlbXlxcbl0iKS5yZXBsYWNlKCJmZW5jZXMiLCIgezAsM30oPzpgezMsfSg/PVteYFxcbl0qXFxuKXx+ezMsfSlbXlxcbl0qXFxuIikucmVwbGFjZSgibGlzdCIsIiB7MCwzfSg/OlsqKy1dfDFbLildKSAiKS5yZXBsYWNlKCJodG1sIiwiPC8/KD86dGFnKSg/OiArfFxcbnwvPz4pfDwoPzpzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhfCEtLSkiKS5yZXBsYWNlKCJ0YWciLHVsKS5nZXRSZWdleCgpLFlrPXsuLi5IZCxsaGVhZGluZzpXayx0YWJsZTpEeSxwYXJhZ3JhcGg6aGUoJGQpLnJlcGxhY2UoImhyIixvaSkucmVwbGFjZSgiaGVhZGluZyIsIiB7MCwzfSN7MSw2fSg/Olxcc3wkKSIpLnJlcGxhY2UoInxsaGVhZGluZyIsIiIpLnJlcGxhY2UoInRhYmxlIixEeSkucmVwbGFjZSgiYmxvY2txdW90ZSIsIiB7MCwzfT4iKS5yZXBsYWNlKCJmZW5jZXMiLCIgezAsM30oPzpgezMsfSg/PVteYFxcbl0qXFxuKXx+ezMsfSlbXlxcbl0qXFxuIikucmVwbGFjZSgibGlzdCIsIiB7MCwzfSg/OlsqKy1dfDFbLildKSAiKS5yZXBsYWNlKCJodG1sIiwiPC8/KD86dGFnKSg/OiArfFxcbnwvPz4pfDwoPzpzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhfCEtLSkiKS5yZXBsYWNlKCJ0YWciLHVsKS5nZXRSZWdleCgpfSxxaz17Li4uSGQsaHRtbDpoZShgXiAqKD86Y29tbWVudCAqKD86XFxufFxccyokKXw8KHRhZylbXFxzXFxTXSs/PC9cXDE+ICooPzpcXG57Mix9fFxccyokKXw8dGFnKD86IlteIl0qInwnW14nXSonfFxcc1teJyIvPlxcc10qKSo/Lz8+ICooPzpcXG57Mix9fFxccyokKSlgKS5yZXBsYWNlKCJjb21tZW50IixXZCkucmVwbGFjZSgvdGFnL2csIig/ISg/OmF8ZW18c3Ryb25nfHNtYWxsfHN8Y2l0ZXxxfGRmbnxhYmJyfGRhdGF8dGltZXxjb2RlfHZhcnxzYW1wfGtiZHxzdWJ8c3VwfGl8Ynx1fG1hcmt8cnVieXxydHxycHxiZGl8YmRvfHNwYW58YnJ8d2JyfGluc3xkZWx8aW1nKVxcYilcXHcrKD8hOnxbXlxcd1xcc0BdKkApXFxiIikuZ2V0UmVnZXgoKSxkZWY6L14gKlxbKFteXF1dKylcXTogKjw/KFteXHM+XSspPj8oPzogKyhbIihdW15cbl0rWyIpXSkpPyAqKD86XG4rfCQpLyxoZWFkaW5nOi9eKCN7MSw2fSkoLiopKD86XG4rfCQpLyxmZW5jZXM6cmksbGhlYWRpbmc6L14oLis/KVxuIHswLDN9KD0rfC0rKSAqKD86XG4rfCQpLyxwYXJhZ3JhcGg6aGUoJGQpLnJlcGxhY2UoImhyIixvaSkucmVwbGFjZSgiaGVhZGluZyIsYCAqI3sxLDZ9ICpbXgpdYCkucmVwbGFjZSgibGhlYWRpbmciLEl5KS5yZXBsYWNlKCJ8dGFibGUiLCIiKS5yZXBsYWNlKCJibG9ja3F1b3RlIiwiIHswLDN9PiIpLnJlcGxhY2UoInxmZW5jZXMiLCIiKS5yZXBsYWNlKCJ8bGlzdCIsIiIpLnJlcGxhY2UoInxodG1sIiwiIikucmVwbGFjZSgifHRhZyIsIiIpLmdldFJlZ2V4KCl9LFFrPS9eXFwoWyEiIyQlJicoKSorLFwtLi86Ozw9Pj9AXFtcXVxcXl9ge3x9fl0pLyxKaz0vXihgKykoW15gXXxbXmBdW1xzXFNdKj9bXmBdKVwxKD8hYCkvLEx5PS9eKCB7Mix9fFxcKVxuKD8hXHMqJCkvLFhrPS9eKGArfFteYF0pKD86KD89IHsyLH1cbil8W1xzXFNdKj8oPzooPz1bXFw8IVxbYCpfXXxcYl98JCl8W14gXSg/PSB7Mix9XG4pKSkvLGNsPS9bXHB7UH1ccHtTfV0vdSxqZD0vW1xzXHB7UH1ccHtTfV0vdSx6eT0vW15cc1xwe1B9XHB7U31dL3UsWms9aGUoL14oKD8hWypfXSlwdW5jdFNwYWNlKS8sInUiKS5yZXBsYWNlKC9wdW5jdFNwYWNlL2csamQpLmdldFJlZ2V4KCksRnk9Lyg/IX4pW1xwe1B9XHB7U31dL3UsZTE9Lyg/IX4pW1xzXHB7UH1ccHtTfV0vdSx0MT0vKD86W15cc1xwe1B9XHB7U31dfH4pL3UsbjE9L1xbW15bXF1dKj9cXVwoKD86XFwufFteXFxcKFwpXXxcKCg/OlxcLnxbXlxcXChcKV0pKlwpKSpcKXxgW15gXSo/YHw8W148Pl0qPz4vZyxVeT0vXig/OlwqKyg/OigoPyFcKilwdW5jdCl8W15ccypdKSl8Xl8rKD86KCg/IV8pcHVuY3QpfChbXlxzX10pKS8scjE9aGUoVXksInUiKS5yZXBsYWNlKC9wdW5jdC9nLGNsKS5nZXRSZWdleCgpLG8xPWhlKFV5LCJ1IikucmVwbGFjZSgvcHVuY3QvZyxGeSkuZ2V0UmVnZXgoKSwkeT0iXlteXypdKj9fX1teXypdKj9cXCpbXl8qXSo/KD89X18pfFteKl0rKD89W14qXSl8KD8hXFwqKXB1bmN0KFxcKispKD89W1xcc118JCl8bm90UHVuY3RTcGFjZShcXCorKSg/IVxcKikoPz1wdW5jdFNwYWNlfCQpfCg/IVxcKilwdW5jdFNwYWNlKFxcKispKD89bm90UHVuY3RTcGFjZSl8W1xcc10oXFwqKykoPyFcXCopKD89cHVuY3QpfCg/IVxcKilwdW5jdChcXCorKSg/IVxcKikoPz1wdW5jdCl8bm90UHVuY3RTcGFjZShcXCorKSg/PW5vdFB1bmN0U3BhY2UpIixhMT1oZSgkeSwiZ3UiKS5yZXBsYWNlKC9ub3RQdW5jdFNwYWNlL2csenkpLnJlcGxhY2UoL3B1bmN0U3BhY2UvZyxqZCkucmVwbGFjZSgvcHVuY3QvZyxjbCkuZ2V0UmVnZXgoKSxpMT1oZSgkeSwiZ3UiKS5yZXBsYWNlKC9ub3RQdW5jdFNwYWNlL2csdDEpLnJlcGxhY2UoL3B1bmN0U3BhY2UvZyxlMSkucmVwbGFjZSgvcHVuY3QvZyxGeSkuZ2V0UmVnZXgoKSxzMT1oZSgiXlteXypdKj9cXCpcXCpbXl8qXSo/X1teXypdKj8oPz1cXCpcXCopfFteX10rKD89W15fXSl8KD8hXylwdW5jdChfKykoPz1bXFxzXXwkKXxub3RQdW5jdFNwYWNlKF8rKSg/IV8pKD89cHVuY3RTcGFjZXwkKXwoPyFfKXB1bmN0U3BhY2UoXyspKD89bm90UHVuY3RTcGFjZSl8W1xcc10oXyspKD8hXykoPz1wdW5jdCl8KD8hXylwdW5jdChfKykoPyFfKSg/PXB1bmN0KSIsImd1IikucmVwbGFjZSgvbm90UHVuY3RTcGFjZS9nLHp5KS5yZXBsYWNlKC9wdW5jdFNwYWNlL2csamQpLnJlcGxhY2UoL3B1bmN0L2csY2wpLmdldFJlZ2V4KCksbDE9aGUoL1xcKHB1bmN0KS8sImd1IikucmVwbGFjZSgvcHVuY3QvZyxjbCkuZ2V0UmVnZXgoKSx1MT1oZSgvXjwoc2NoZW1lOlteXHNceDAwLVx4MWY8Pl0qfGVtYWlsKT4vKS5yZXBsYWNlKCJzY2hlbWUiLC9bYS16QS1aXVthLXpBLVowLTkrLi1dezEsMzF9LykucmVwbGFjZSgiZW1haWwiLC9bYS16QS1aMC05LiEjJCUmJyorLz0/Xl9ge3x9fi1dKyhAKVthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPyg/OlwuW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KSsoPyFbLV9dKS8pLmdldFJlZ2V4KCksYzE9aGUoV2QpLnJlcGxhY2UoIig/Oi0tPnwkKSIsIi0tPiIpLmdldFJlZ2V4KCksZDE9aGUoIl5jb21tZW50fF48L1thLXpBLVpdW1xcdzotXSpcXHMqPnxePFthLXpBLVpdW1xcdy1dKig/OmF0dHJpYnV0ZSkqP1xccyovPz58XjxcXD9bXFxzXFxTXSo/XFw/PnxePCFbYS16QS1aXStcXHNbXFxzXFxTXSo/PnxePCFcXFtDREFUQVxcW1tcXHNcXFNdKj9cXF1cXF0+IikucmVwbGFjZSgiY29tbWVudCIsYzEpLnJlcGxhY2UoImF0dHJpYnV0ZSIsL1xzK1thLXpBLVo6X11bXHcuOi1dKig/OlxzKj1ccyoiW14iXSoifFxzKj1ccyonW14nXSonfFxzKj1ccypbXlxzIic9PD5gXSspPy8pLmdldFJlZ2V4KCksaWw9Lyg/OlxbKD86XFwufFteXFtcXVxcXSkqXF18XFwufGBbXmBdKmB8W15cW1xdXFxgXSkqPy8scDE9aGUoL14hP1xbKGxhYmVsKVxdXChccyooaHJlZikoPzooPzpbIFx0XSooPzpcblsgXHRdKik/KSh0aXRsZSkpP1xzKlwpLykucmVwbGFjZSgibGFiZWwiLGlsKS5yZXBsYWNlKCJocmVmIiwvPCg/OlxcLnxbXlxuPD5cXF0pKz58W14gXHRcblx4MDAtXHgxZl0qLykucmVwbGFjZSgidGl0bGUiLC8iKD86XFwiP3xbXiJcXF0pKiJ8Jyg/OlxcJz98W14nXFxdKSonfFwoKD86XFxcKT98W14pXFxdKSpcKS8pLmdldFJlZ2V4KCksQnk9aGUoL14hP1xbKGxhYmVsKVxdXFsocmVmKVxdLykucmVwbGFjZSgibGFiZWwiLGlsKS5yZXBsYWNlKCJyZWYiLEJkKS5nZXRSZWdleCgpLFd5PWhlKC9eIT9cWyhyZWYpXF0oPzpcW1xdKT8vKS5yZXBsYWNlKCJyZWYiLEJkKS5nZXRSZWdleCgpLGYxPWhlKCJyZWZsaW5rfG5vbGluayg/IVxcKCkiLCJnIikucmVwbGFjZSgicmVmbGluayIsQnkpLnJlcGxhY2UoIm5vbGluayIsV3kpLmdldFJlZ2V4KCksVmQ9e19iYWNrcGVkYWw6cmksYW55UHVuY3R1YXRpb246bDEsYXV0b2xpbms6dTEsYmxvY2tTa2lwOm4xLGJyOkx5LGNvZGU6SmssZGVsOnJpLGVtU3Ryb25nTERlbGltOnIxLGVtU3Ryb25nUkRlbGltQXN0OmExLGVtU3Ryb25nUkRlbGltVW5kOnMxLGVzY2FwZTpRayxsaW5rOnAxLG5vbGluazpXeSxwdW5jdHVhdGlvbjpaayxyZWZsaW5rOkJ5LHJlZmxpbmtTZWFyY2g6ZjEsdGFnOmQxLHRleHQ6WGssdXJsOnJpfSxtMT17Li4uVmQsbGluazpoZSgvXiE/XFsobGFiZWwpXF1cKCguKj8pXCkvKS5yZXBsYWNlKCJsYWJlbCIsaWwpLmdldFJlZ2V4KCkscmVmbGluazpoZSgvXiE/XFsobGFiZWwpXF1ccypcWyhbXlxdXSopXF0vKS5yZXBsYWNlKCJsYWJlbCIsaWwpLmdldFJlZ2V4KCl9LFBkPXsuLi5WZCxlbVN0cm9uZ1JEZWxpbUFzdDppMSxlbVN0cm9uZ0xEZWxpbTpvMSx1cmw6aGUoL14oKD86ZnRwfGh0dHBzPyk6XC9cL3x3d3dcLikoPzpbYS16QS1aMC05XC1dK1wuPykrW15cczxdKnxeZW1haWwvLCJpIikucmVwbGFjZSgiZW1haWwiLC9bQS1aYS16MC05Ll8rLV0rKEApW2EtekEtWjAtOS1fXSsoPzpcLlthLXpBLVowLTktX10qW2EtekEtWjAtOV0pKyg/IVstX10pLykuZ2V0UmVnZXgoKSxfYmFja3BlZGFsOi8oPzpbXj8hLiw6OypfJyJ+KCkmXSt8XChbXildKlwpfCYoPyFbYS16QS1aMC05XSs7JCl8Wz8hLiw6OypfJyJ+KV0rKD8hJCkpKy8sZGVsOi9eKH5+PykoPz1bXlxzfl0pKCg/OlxcLnxbXlxcXSkqPyg/OlxcLnxbXlxzflxcXSkpXDEoPz1bXn5dfCQpLyx0ZXh0Oi9eKFtgfl0rfFteYH5dKSg/Oig/PSB7Mix9XG4pfCg/PVthLXpBLVowLTkuISMkJSYnKitcLz0/X2B7XHx9fi1dK0ApfFtcc1xTXSo/KD86KD89W1xcPCFcW2Aqfl9dfFxiX3xodHRwcz86XC9cL3xmdHA6XC9cL3x3d3dcLnwkKXxbXiBdKD89IHsyLH1cbil8W15hLXpBLVowLTkuISMkJSYnKitcLz0/X2B7XHx9fi1dKD89W2EtekEtWjAtOS4hIyQlJicqK1wvPT9fYHtcfH1+LV0rQCkpKS99LGgxPXsuLi5QZCxicjpoZShMeSkucmVwbGFjZSgiezIsfSIsIioiKS5nZXRSZWdleCgpLHRleHQ6aGUoUGQudGV4dCkucmVwbGFjZSgiXFxiXyIsIlxcYl98IHsyLH1cXG4iKS5yZXBsYWNlKC9cezIsXH0vZywiKiIpLmdldFJlZ2V4KCl9LG9sPXtub3JtYWw6SGQsZ2ZtOllrLHBlZGFudGljOnFrfSx0aT17bm9ybWFsOlZkLGdmbTpQZCxicmVha3M6aDEscGVkYW50aWM6bTF9LGcxPXsiJiI6IiZhbXA7IiwiPCI6IiZsdDsiLCI+IjoiJmd0OyIsJyInOiImcXVvdDsiLCInIjoiJiMzOTsifSxfeT1lPT5nMVtlXTtmdW5jdGlvbiBrbihlLHQpe2lmKHQpe2lmKHl0LmVzY2FwZVRlc3QudGVzdChlKSlyZXR1cm4gZS5yZXBsYWNlKHl0LmVzY2FwZVJlcGxhY2UsX3kpfWVsc2UgaWYoeXQuZXNjYXBlVGVzdE5vRW5jb2RlLnRlc3QoZSkpcmV0dXJuIGUucmVwbGFjZSh5dC5lc2NhcGVSZXBsYWNlTm9FbmNvZGUsX3kpO3JldHVybiBlfWZ1bmN0aW9uIEF5KGUpe3RyeXtlPWVuY29kZVVSSShlKS5yZXBsYWNlKHl0LnBlcmNlbnREZWNvZGUsIiUiKX1jYXRjaHtyZXR1cm4gbnVsbH1yZXR1cm4gZX1mdW5jdGlvbiBDeShlLHQpe2xldCBuPWUucmVwbGFjZSh5dC5maW5kUGlwZSwoYSxpLHMpPT57bGV0IGw9ITEsdT1pO2Zvcig7LS11Pj0wJiZzW3VdPT09IlxcIjspbD0hbDtyZXR1cm4gbD8ifCI6IiB8In0pLHI9bi5zcGxpdCh5dC5zcGxpdFBpcGUpLG89MDtpZihyWzBdLnRyaW0oKXx8ci5zaGlmdCgpLHIubGVuZ3RoPjAmJiFyLmF0KC0xKT8udHJpbSgpJiZyLnBvcCgpLHQpaWYoci5sZW5ndGg+dClyLnNwbGljZSh0KTtlbHNlIGZvcig7ci5sZW5ndGg8dDspci5wdXNoKCIiKTtmb3IoO288ci5sZW5ndGg7bysrKXJbb109cltvXS50cmltKCkucmVwbGFjZSh5dC5zbGFzaFBpcGUsInwiKTtyZXR1cm4gcn1mdW5jdGlvbiBuaShlLHQsbil7bGV0IHI9ZS5sZW5ndGg7aWYocj09PTApcmV0dXJuIiI7bGV0IG89MDtmb3IoO288cjspe2xldCBhPWUuY2hhckF0KHItby0xKTtpZihhPT09dCYmIW4pbysrO2Vsc2UgaWYoYSE9PXQmJm4pbysrO2Vsc2UgYnJlYWt9cmV0dXJuIGUuc2xpY2UoMCxyLW8pfWZ1bmN0aW9uIHkxKGUsdCl7aWYoZS5pbmRleE9mKHRbMV0pPT09LTEpcmV0dXJuLTE7bGV0IG49MDtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKylpZihlW3JdPT09IlxcIilyKys7ZWxzZSBpZihlW3JdPT09dFswXSluKys7ZWxzZSBpZihlW3JdPT09dFsxXSYmKG4tLSxuPDApKXJldHVybiByO3JldHVybiBuPjA/LTI6LTF9ZnVuY3Rpb24gT3koZSx0LG4scixvKXtsZXQgYT10LmhyZWYsaT10LnRpdGxlfHxudWxsLHM9ZVsxXS5yZXBsYWNlKG8ub3RoZXIub3V0cHV0TGlua1JlcGxhY2UsIiQxIik7ci5zdGF0ZS5pbkxpbms9ITA7bGV0IGw9e3R5cGU6ZVswXS5jaGFyQXQoMCk9PT0iISI/ImltYWdlIjoibGluayIscmF3Om4saHJlZjphLHRpdGxlOmksdGV4dDpzLHRva2VuczpyLmlubGluZVRva2VucyhzKX07cmV0dXJuIHIuc3RhdGUuaW5MaW5rPSExLGx9ZnVuY3Rpb24gdjEoZSx0LG4pe2xldCByPWUubWF0Y2gobi5vdGhlci5pbmRlbnRDb2RlQ29tcGVuc2F0aW9uKTtpZihyPT09bnVsbClyZXR1cm4gdDtsZXQgbz1yWzFdO3JldHVybiB0LnNwbGl0KGAKYCkubWFwKGE9PntsZXQgaT1hLm1hdGNoKG4ub3RoZXIuYmVnaW5uaW5nU3BhY2UpO2lmKGk9PT1udWxsKXJldHVybiBhO2xldFtzXT1pO3JldHVybiBzLmxlbmd0aD49by5sZW5ndGg/YS5zbGljZShvLmxlbmd0aCk6YX0pLmpvaW4oYApgKX12YXIgc2w9Y2xhc3N7b3B0aW9ucztydWxlcztsZXhlcjtjb25zdHJ1Y3RvcihlKXt0aGlzLm9wdGlvbnM9ZXx8SnJ9c3BhY2UoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay5uZXdsaW5lLmV4ZWMoZSk7aWYodCYmdFswXS5sZW5ndGg+MClyZXR1cm57dHlwZToic3BhY2UiLHJhdzp0WzBdfX1jb2RlKGUpe2xldCB0PXRoaXMucnVsZXMuYmxvY2suY29kZS5leGVjKGUpO2lmKHQpe2xldCBuPXRbMF0ucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmNvZGVSZW1vdmVJbmRlbnQsIiIpO3JldHVybnt0eXBlOiJjb2RlIixyYXc6dFswXSxjb2RlQmxvY2tTdHlsZToiaW5kZW50ZWQiLHRleHQ6dGhpcy5vcHRpb25zLnBlZGFudGljP246bmkobixgCmApfX19ZmVuY2VzKGUpe2xldCB0PXRoaXMucnVsZXMuYmxvY2suZmVuY2VzLmV4ZWMoZSk7aWYodCl7bGV0IG49dFswXSxyPXYxKG4sdFszXXx8IiIsdGhpcy5ydWxlcyk7cmV0dXJue3R5cGU6ImNvZGUiLHJhdzpuLGxhbmc6dFsyXT90WzJdLnRyaW0oKS5yZXBsYWNlKHRoaXMucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLCIkMSIpOnRbMl0sdGV4dDpyfX19aGVhZGluZyhlKXtsZXQgdD10aGlzLnJ1bGVzLmJsb2NrLmhlYWRpbmcuZXhlYyhlKTtpZih0KXtsZXQgbj10WzJdLnRyaW0oKTtpZih0aGlzLnJ1bGVzLm90aGVyLmVuZGluZ0hhc2gudGVzdChuKSl7bGV0IHI9bmkobiwiIyIpOyh0aGlzLm9wdGlvbnMucGVkYW50aWN8fCFyfHx0aGlzLnJ1bGVzLm90aGVyLmVuZGluZ1NwYWNlQ2hhci50ZXN0KHIpKSYmKG49ci50cmltKCkpfXJldHVybnt0eXBlOiJoZWFkaW5nIixyYXc6dFswXSxkZXB0aDp0WzFdLmxlbmd0aCx0ZXh0Om4sdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lKG4pfX19aHIoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay5oci5leGVjKGUpO2lmKHQpcmV0dXJue3R5cGU6ImhyIixyYXc6bmkodFswXSxgCmApfX1ibG9ja3F1b3RlKGUpe2xldCB0PXRoaXMucnVsZXMuYmxvY2suYmxvY2txdW90ZS5leGVjKGUpO2lmKHQpe2xldCBuPW5pKHRbMF0sYApgKS5zcGxpdChgCmApLHI9IiIsbz0iIixhPVtdO2Zvcig7bi5sZW5ndGg+MDspe2xldCBpPSExLHM9W10sbDtmb3IobD0wO2w8bi5sZW5ndGg7bCsrKWlmKHRoaXMucnVsZXMub3RoZXIuYmxvY2txdW90ZVN0YXJ0LnRlc3QobltsXSkpcy5wdXNoKG5bbF0pLGk9ITA7ZWxzZSBpZighaSlzLnB1c2gobltsXSk7ZWxzZSBicmVhaztuPW4uc2xpY2UobCk7bGV0IHU9cy5qb2luKGAKYCksYz11LnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5ibG9ja3F1b3RlU2V0ZXh0UmVwbGFjZSxgCiAgICAkMWApLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5ibG9ja3F1b3RlU2V0ZXh0UmVwbGFjZTIsIiIpO3I9cj9gJHtyfQoke3V9YDp1LG89bz9gJHtvfQoke2N9YDpjO2xldCBkPXRoaXMubGV4ZXIuc3RhdGUudG9wO2lmKHRoaXMubGV4ZXIuc3RhdGUudG9wPSEwLHRoaXMubGV4ZXIuYmxvY2tUb2tlbnMoYyxhLCEwKSx0aGlzLmxleGVyLnN0YXRlLnRvcD1kLG4ubGVuZ3RoPT09MClicmVhaztsZXQgcD1hLmF0KC0xKTtpZihwPy50eXBlPT09ImNvZGUiKWJyZWFrO2lmKHA/LnR5cGU9PT0iYmxvY2txdW90ZSIpe2xldCB5PXAsaD15LnJhdytgCmArbi5qb2luKGAKYCksdz10aGlzLmJsb2NrcXVvdGUoaCk7YVthLmxlbmd0aC0xXT13LHI9ci5zdWJzdHJpbmcoMCxyLmxlbmd0aC15LnJhdy5sZW5ndGgpK3cucmF3LG89by5zdWJzdHJpbmcoMCxvLmxlbmd0aC15LnRleHQubGVuZ3RoKSt3LnRleHQ7YnJlYWt9ZWxzZSBpZihwPy50eXBlPT09Imxpc3QiKXtsZXQgeT1wLGg9eS5yYXcrYApgK24uam9pbihgCmApLHc9dGhpcy5saXN0KGgpO2FbYS5sZW5ndGgtMV09dyxyPXIuc3Vic3RyaW5nKDAsci5sZW5ndGgtcC5yYXcubGVuZ3RoKSt3LnJhdyxvPW8uc3Vic3RyaW5nKDAsby5sZW5ndGgteS5yYXcubGVuZ3RoKSt3LnJhdyxuPWguc3Vic3RyaW5nKGEuYXQoLTEpLnJhdy5sZW5ndGgpLnNwbGl0KGAKYCk7Y29udGludWV9fXJldHVybnt0eXBlOiJibG9ja3F1b3RlIixyYXc6cix0b2tlbnM6YSx0ZXh0Om99fX1saXN0KGUpe2xldCB0PXRoaXMucnVsZXMuYmxvY2subGlzdC5leGVjKGUpO2lmKHQpe2xldCBuPXRbMV0udHJpbSgpLHI9bi5sZW5ndGg+MSxvPXt0eXBlOiJsaXN0IixyYXc6IiIsb3JkZXJlZDpyLHN0YXJ0OnI/K24uc2xpY2UoMCwtMSk6IiIsbG9vc2U6ITEsaXRlbXM6W119O249cj9gXFxkezEsOX1cXCR7bi5zbGljZSgtMSl9YDpgXFwke259YCx0aGlzLm9wdGlvbnMucGVkYW50aWMmJihuPXI/bjoiWyorLV0iKTtsZXQgYT10aGlzLnJ1bGVzLm90aGVyLmxpc3RJdGVtUmVnZXgobiksaT0hMTtmb3IoO2U7KXtsZXQgbD0hMSx1PSIiLGM9IiI7aWYoISh0PWEuZXhlYyhlKSl8fHRoaXMucnVsZXMuYmxvY2suaHIudGVzdChlKSlicmVhazt1PXRbMF0sZT1lLnN1YnN0cmluZyh1Lmxlbmd0aCk7bGV0IGQ9dFsyXS5zcGxpdChgCmAsMSlbMF0ucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmxpc3RSZXBsYWNlVGFicyxnPT4iICIucmVwZWF0KDMqZy5sZW5ndGgpKSxwPWUuc3BsaXQoYApgLDEpWzBdLHk9IWQudHJpbSgpLGg9MDtpZih0aGlzLm9wdGlvbnMucGVkYW50aWM/KGg9MixjPWQudHJpbVN0YXJ0KCkpOnk/aD10WzFdLmxlbmd0aCsxOihoPXRbMl0uc2VhcmNoKHRoaXMucnVsZXMub3RoZXIubm9uU3BhY2VDaGFyKSxoPWg+ND8xOmgsYz1kLnNsaWNlKGgpLGgrPXRbMV0ubGVuZ3RoKSx5JiZ0aGlzLnJ1bGVzLm90aGVyLmJsYW5rTGluZS50ZXN0KHApJiYodSs9cCtgCmAsZT1lLnN1YnN0cmluZyhwLmxlbmd0aCsxKSxsPSEwKSwhbCl7bGV0IGc9dGhpcy5ydWxlcy5vdGhlci5uZXh0QnVsbGV0UmVnZXgoaCksbT10aGlzLnJ1bGVzLm90aGVyLmhyUmVnZXgoaCksdj10aGlzLnJ1bGVzLm90aGVyLmZlbmNlc0JlZ2luUmVnZXgoaCksZj10aGlzLnJ1bGVzLm90aGVyLmhlYWRpbmdCZWdpblJlZ2V4KGgpLEU9dGhpcy5ydWxlcy5vdGhlci5odG1sQmVnaW5SZWdleChoKTtmb3IoO2U7KXtsZXQgaz1lLnNwbGl0KGAKYCwxKVswXSxOO2lmKHA9ayx0aGlzLm9wdGlvbnMucGVkYW50aWM/KHA9cC5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIubGlzdFJlcGxhY2VOZXN0aW5nLCIgICIpLE49cCk6Tj1wLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci50YWJDaGFyR2xvYmFsLCIgICAgIiksdi50ZXN0KHApfHxmLnRlc3QocCl8fEUudGVzdChwKXx8Zy50ZXN0KHApfHxtLnRlc3QocCkpYnJlYWs7aWYoTi5zZWFyY2godGhpcy5ydWxlcy5vdGhlci5ub25TcGFjZUNoYXIpPj1ofHwhcC50cmltKCkpYys9YApgK04uc2xpY2UoaCk7ZWxzZXtpZih5fHxkLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci50YWJDaGFyR2xvYmFsLCIgICAgIikuc2VhcmNoKHRoaXMucnVsZXMub3RoZXIubm9uU3BhY2VDaGFyKT49NHx8di50ZXN0KGQpfHxmLnRlc3QoZCl8fG0udGVzdChkKSlicmVhaztjKz1gCmArcH0heSYmIXAudHJpbSgpJiYoeT0hMCksdSs9aytgCmAsZT1lLnN1YnN0cmluZyhrLmxlbmd0aCsxKSxkPU4uc2xpY2UoaCl9fW8ubG9vc2V8fChpP28ubG9vc2U9ITA6dGhpcy5ydWxlcy5vdGhlci5kb3VibGVCbGFua0xpbmUudGVzdCh1KSYmKGk9ITApKTtsZXQgdz1udWxsLGI7dGhpcy5vcHRpb25zLmdmbSYmKHc9dGhpcy5ydWxlcy5vdGhlci5saXN0SXNUYXNrLmV4ZWMoYyksdyYmKGI9d1swXSE9PSJbIF0gIixjPWMucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmxpc3RSZXBsYWNlVGFzaywiIikpKSxvLml0ZW1zLnB1c2goe3R5cGU6Imxpc3RfaXRlbSIscmF3OnUsdGFzazohIXcsY2hlY2tlZDpiLGxvb3NlOiExLHRleHQ6Yyx0b2tlbnM6W119KSxvLnJhdys9dX1sZXQgcz1vLml0ZW1zLmF0KC0xKTtpZihzKXMucmF3PXMucmF3LnRyaW1FbmQoKSxzLnRleHQ9cy50ZXh0LnRyaW1FbmQoKTtlbHNlIHJldHVybjtvLnJhdz1vLnJhdy50cmltRW5kKCk7Zm9yKGxldCBsPTA7bDxvLml0ZW1zLmxlbmd0aDtsKyspaWYodGhpcy5sZXhlci5zdGF0ZS50b3A9ITEsby5pdGVtc1tsXS50b2tlbnM9dGhpcy5sZXhlci5ibG9ja1Rva2VucyhvLml0ZW1zW2xdLnRleHQsW10pLCFvLmxvb3NlKXtsZXQgdT1vLml0ZW1zW2xdLnRva2Vucy5maWx0ZXIoZD0+ZC50eXBlPT09InNwYWNlIiksYz11Lmxlbmd0aD4wJiZ1LnNvbWUoZD0+dGhpcy5ydWxlcy5vdGhlci5hbnlMaW5lLnRlc3QoZC5yYXcpKTtvLmxvb3NlPWN9aWYoby5sb29zZSlmb3IobGV0IGw9MDtsPG8uaXRlbXMubGVuZ3RoO2wrKylvLml0ZW1zW2xdLmxvb3NlPSEwO3JldHVybiBvfX1odG1sKGUpe2xldCB0PXRoaXMucnVsZXMuYmxvY2suaHRtbC5leGVjKGUpO2lmKHQpcmV0dXJue3R5cGU6Imh0bWwiLGJsb2NrOiEwLHJhdzp0WzBdLHByZTp0WzFdPT09InByZSJ8fHRbMV09PT0ic2NyaXB0Inx8dFsxXT09PSJzdHlsZSIsdGV4dDp0WzBdfX1kZWYoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay5kZWYuZXhlYyhlKTtpZih0KXtsZXQgbj10WzFdLnRvTG93ZXJDYXNlKCkucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLm11bHRpcGxlU3BhY2VHbG9iYWwsIiAiKSxyPXRbMl0/dFsyXS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIuaHJlZkJyYWNrZXRzLCIkMSIpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24sIiQxIik6IiIsbz10WzNdP3RbM10uc3Vic3RyaW5nKDEsdFszXS5sZW5ndGgtMSkucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwiJDEiKTp0WzNdO3JldHVybnt0eXBlOiJkZWYiLHRhZzpuLHJhdzp0WzBdLGhyZWY6cix0aXRsZTpvfX19dGFibGUoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay50YWJsZS5leGVjKGUpO2lmKCF0fHwhdGhpcy5ydWxlcy5vdGhlci50YWJsZURlbGltaXRlci50ZXN0KHRbMl0pKXJldHVybjtsZXQgbj1DeSh0WzFdKSxyPXRbMl0ucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLnRhYmxlQWxpZ25DaGFycywiIikuc3BsaXQoInwiKSxvPXRbM10/LnRyaW0oKT90WzNdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci50YWJsZVJvd0JsYW5rTGluZSwiIikuc3BsaXQoYApgKTpbXSxhPXt0eXBlOiJ0YWJsZSIscmF3OnRbMF0saGVhZGVyOltdLGFsaWduOltdLHJvd3M6W119O2lmKG4ubGVuZ3RoPT09ci5sZW5ndGgpe2ZvcihsZXQgaSBvZiByKXRoaXMucnVsZXMub3RoZXIudGFibGVBbGlnblJpZ2h0LnRlc3QoaSk/YS5hbGlnbi5wdXNoKCJyaWdodCIpOnRoaXMucnVsZXMub3RoZXIudGFibGVBbGlnbkNlbnRlci50ZXN0KGkpP2EuYWxpZ24ucHVzaCgiY2VudGVyIik6dGhpcy5ydWxlcy5vdGhlci50YWJsZUFsaWduTGVmdC50ZXN0KGkpP2EuYWxpZ24ucHVzaCgibGVmdCIpOmEuYWxpZ24ucHVzaChudWxsKTtmb3IobGV0IGk9MDtpPG4ubGVuZ3RoO2krKylhLmhlYWRlci5wdXNoKHt0ZXh0Om5baV0sdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lKG5baV0pLGhlYWRlcjohMCxhbGlnbjphLmFsaWduW2ldfSk7Zm9yKGxldCBpIG9mIG8pYS5yb3dzLnB1c2goQ3koaSxhLmhlYWRlci5sZW5ndGgpLm1hcCgocyxsKT0+KHt0ZXh0OnMsdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lKHMpLGhlYWRlcjohMSxhbGlnbjphLmFsaWduW2xdfSkpKTtyZXR1cm4gYX19bGhlYWRpbmcoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay5saGVhZGluZy5leGVjKGUpO2lmKHQpcmV0dXJue3R5cGU6ImhlYWRpbmciLHJhdzp0WzBdLGRlcHRoOnRbMl0uY2hhckF0KDApPT09Ij0iPzE6Mix0ZXh0OnRbMV0sdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lKHRbMV0pfX1wYXJhZ3JhcGgoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay5wYXJhZ3JhcGguZXhlYyhlKTtpZih0KXtsZXQgbj10WzFdLmNoYXJBdCh0WzFdLmxlbmd0aC0xKT09PWAKYD90WzFdLnNsaWNlKDAsLTEpOnRbMV07cmV0dXJue3R5cGU6InBhcmFncmFwaCIscmF3OnRbMF0sdGV4dDpuLHRva2Vuczp0aGlzLmxleGVyLmlubGluZShuKX19fXRleHQoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay50ZXh0LmV4ZWMoZSk7aWYodClyZXR1cm57dHlwZToidGV4dCIscmF3OnRbMF0sdGV4dDp0WzBdLHRva2Vuczp0aGlzLmxleGVyLmlubGluZSh0WzBdKX19ZXNjYXBlKGUpe2xldCB0PXRoaXMucnVsZXMuaW5saW5lLmVzY2FwZS5leGVjKGUpO2lmKHQpcmV0dXJue3R5cGU6ImVzY2FwZSIscmF3OnRbMF0sdGV4dDp0WzFdfX10YWcoZSl7bGV0IHQ9dGhpcy5ydWxlcy5pbmxpbmUudGFnLmV4ZWMoZSk7aWYodClyZXR1cm4hdGhpcy5sZXhlci5zdGF0ZS5pbkxpbmsmJnRoaXMucnVsZXMub3RoZXIuc3RhcnRBVGFnLnRlc3QodFswXSk/dGhpcy5sZXhlci5zdGF0ZS5pbkxpbms9ITA6dGhpcy5sZXhlci5zdGF0ZS5pbkxpbmsmJnRoaXMucnVsZXMub3RoZXIuZW5kQVRhZy50ZXN0KHRbMF0pJiYodGhpcy5sZXhlci5zdGF0ZS5pbkxpbms9ITEpLCF0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2smJnRoaXMucnVsZXMub3RoZXIuc3RhcnRQcmVTY3JpcHRUYWcudGVzdCh0WzBdKT90aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2s9ITA6dGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrJiZ0aGlzLnJ1bGVzLm90aGVyLmVuZFByZVNjcmlwdFRhZy50ZXN0KHRbMF0pJiYodGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrPSExKSx7dHlwZToiaHRtbCIscmF3OnRbMF0saW5MaW5rOnRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rLGluUmF3QmxvY2s6dGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrLGJsb2NrOiExLHRleHQ6dFswXX19bGluayhlKXtsZXQgdD10aGlzLnJ1bGVzLmlubGluZS5saW5rLmV4ZWMoZSk7aWYodCl7bGV0IG49dFsyXS50cmltKCk7aWYoIXRoaXMub3B0aW9ucy5wZWRhbnRpYyYmdGhpcy5ydWxlcy5vdGhlci5zdGFydEFuZ2xlQnJhY2tldC50ZXN0KG4pKXtpZighdGhpcy5ydWxlcy5vdGhlci5lbmRBbmdsZUJyYWNrZXQudGVzdChuKSlyZXR1cm47bGV0IGE9bmkobi5zbGljZSgwLC0xKSwiXFwiKTtpZigobi5sZW5ndGgtYS5sZW5ndGgpJTI9PT0wKXJldHVybn1lbHNle2xldCBhPXkxKHRbMl0sIigpIik7aWYoYT09PS0yKXJldHVybjtpZihhPi0xKXtsZXQgcz0odFswXS5pbmRleE9mKCIhIik9PT0wPzU6NCkrdFsxXS5sZW5ndGgrYTt0WzJdPXRbMl0uc3Vic3RyaW5nKDAsYSksdFswXT10WzBdLnN1YnN0cmluZygwLHMpLnRyaW0oKSx0WzNdPSIifX1sZXQgcj10WzJdLG89IiI7aWYodGhpcy5vcHRpb25zLnBlZGFudGljKXtsZXQgYT10aGlzLnJ1bGVzLm90aGVyLnBlZGFudGljSHJlZlRpdGxlLmV4ZWMocik7YSYmKHI9YVsxXSxvPWFbM10pfWVsc2Ugbz10WzNdP3RbM10uc2xpY2UoMSwtMSk6IiI7cmV0dXJuIHI9ci50cmltKCksdGhpcy5ydWxlcy5vdGhlci5zdGFydEFuZ2xlQnJhY2tldC50ZXN0KHIpJiYodGhpcy5vcHRpb25zLnBlZGFudGljJiYhdGhpcy5ydWxlcy5vdGhlci5lbmRBbmdsZUJyYWNrZXQudGVzdChuKT9yPXIuc2xpY2UoMSk6cj1yLnNsaWNlKDEsLTEpKSxPeSh0LHtocmVmOnImJnIucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwiJDEiKSx0aXRsZTpvJiZvLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24sIiQxIil9LHRbMF0sdGhpcy5sZXhlcix0aGlzLnJ1bGVzKX19cmVmbGluayhlLHQpe2xldCBuO2lmKChuPXRoaXMucnVsZXMuaW5saW5lLnJlZmxpbmsuZXhlYyhlKSl8fChuPXRoaXMucnVsZXMuaW5saW5lLm5vbGluay5leGVjKGUpKSl7bGV0IHI9KG5bMl18fG5bMV0pLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5tdWx0aXBsZVNwYWNlR2xvYmFsLCIgIiksbz10W3IudG9Mb3dlckNhc2UoKV07aWYoIW8pe2xldCBhPW5bMF0uY2hhckF0KDApO3JldHVybnt0eXBlOiJ0ZXh0IixyYXc6YSx0ZXh0OmF9fXJldHVybiBPeShuLG8sblswXSx0aGlzLmxleGVyLHRoaXMucnVsZXMpfX1lbVN0cm9uZyhlLHQsbj0iIil7bGV0IHI9dGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmdMRGVsaW0uZXhlYyhlKTtpZighcnx8clszXSYmbi5tYXRjaCh0aGlzLnJ1bGVzLm90aGVyLnVuaWNvZGVBbHBoYU51bWVyaWMpKXJldHVybjtpZighKHJbMV18fHJbMl18fCIiKXx8IW58fHRoaXMucnVsZXMuaW5saW5lLnB1bmN0dWF0aW9uLmV4ZWMobikpe2xldCBhPVsuLi5yWzBdXS5sZW5ndGgtMSxpLHMsbD1hLHU9MCxjPXJbMF1bMF09PT0iKiI/dGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmdSRGVsaW1Bc3Q6dGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmdSRGVsaW1VbmQ7Zm9yKGMubGFzdEluZGV4PTAsdD10LnNsaWNlKC0xKmUubGVuZ3RoK2EpOyhyPWMuZXhlYyh0KSkhPW51bGw7KXtpZihpPXJbMV18fHJbMl18fHJbM118fHJbNF18fHJbNV18fHJbNl0sIWkpY29udGludWU7aWYocz1bLi4uaV0ubGVuZ3RoLHJbM118fHJbNF0pe2wrPXM7Y29udGludWV9ZWxzZSBpZigocls1XXx8cls2XSkmJmElMyYmISgoYStzKSUzKSl7dSs9cztjb250aW51ZX1pZihsLT1zLGw+MCljb250aW51ZTtzPU1hdGgubWluKHMscytsK3UpO2xldCBkPVsuLi5yWzBdXVswXS5sZW5ndGgscD1lLnNsaWNlKDAsYStyLmluZGV4K2Qrcyk7aWYoTWF0aC5taW4oYSxzKSUyKXtsZXQgaD1wLnNsaWNlKDEsLTEpO3JldHVybnt0eXBlOiJlbSIscmF3OnAsdGV4dDpoLHRva2Vuczp0aGlzLmxleGVyLmlubGluZVRva2VucyhoKX19bGV0IHk9cC5zbGljZSgyLC0yKTtyZXR1cm57dHlwZToic3Ryb25nIixyYXc6cCx0ZXh0OnksdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lVG9rZW5zKHkpfX19fWNvZGVzcGFuKGUpe2xldCB0PXRoaXMucnVsZXMuaW5saW5lLmNvZGUuZXhlYyhlKTtpZih0KXtsZXQgbj10WzJdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5uZXdMaW5lQ2hhckdsb2JhbCwiICIpLHI9dGhpcy5ydWxlcy5vdGhlci5ub25TcGFjZUNoYXIudGVzdChuKSxvPXRoaXMucnVsZXMub3RoZXIuc3RhcnRpbmdTcGFjZUNoYXIudGVzdChuKSYmdGhpcy5ydWxlcy5vdGhlci5lbmRpbmdTcGFjZUNoYXIudGVzdChuKTtyZXR1cm4gciYmbyYmKG49bi5zdWJzdHJpbmcoMSxuLmxlbmd0aC0xKSkse3R5cGU6ImNvZGVzcGFuIixyYXc6dFswXSx0ZXh0Om59fX1icihlKXtsZXQgdD10aGlzLnJ1bGVzLmlubGluZS5ici5leGVjKGUpO2lmKHQpcmV0dXJue3R5cGU6ImJyIixyYXc6dFswXX19ZGVsKGUpe2xldCB0PXRoaXMucnVsZXMuaW5saW5lLmRlbC5leGVjKGUpO2lmKHQpcmV0dXJue3R5cGU6ImRlbCIscmF3OnRbMF0sdGV4dDp0WzJdLHRva2Vuczp0aGlzLmxleGVyLmlubGluZVRva2Vucyh0WzJdKX19YXV0b2xpbmsoZSl7bGV0IHQ9dGhpcy5ydWxlcy5pbmxpbmUuYXV0b2xpbmsuZXhlYyhlKTtpZih0KXtsZXQgbixyO3JldHVybiB0WzJdPT09IkAiPyhuPXRbMV0scj0ibWFpbHRvOiIrbik6KG49dFsxXSxyPW4pLHt0eXBlOiJsaW5rIixyYXc6dFswXSx0ZXh0Om4saHJlZjpyLHRva2Vuczpbe3R5cGU6InRleHQiLHJhdzpuLHRleHQ6bn1dfX19dXJsKGUpe2xldCB0O2lmKHQ9dGhpcy5ydWxlcy5pbmxpbmUudXJsLmV4ZWMoZSkpe2xldCBuLHI7aWYodFsyXT09PSJAIiluPXRbMF0scj0ibWFpbHRvOiIrbjtlbHNle2xldCBvO2RvIG89dFswXSx0WzBdPXRoaXMucnVsZXMuaW5saW5lLl9iYWNrcGVkYWwuZXhlYyh0WzBdKT8uWzBdPz8iIjt3aGlsZShvIT09dFswXSk7bj10WzBdLHRbMV09PT0id3d3LiI/cj0iaHR0cDovLyIrdFswXTpyPXRbMF19cmV0dXJue3R5cGU6ImxpbmsiLHJhdzp0WzBdLHRleHQ6bixocmVmOnIsdG9rZW5zOlt7dHlwZToidGV4dCIscmF3Om4sdGV4dDpufV19fX1pbmxpbmVUZXh0KGUpe2xldCB0PXRoaXMucnVsZXMuaW5saW5lLnRleHQuZXhlYyhlKTtpZih0KXtsZXQgbj10aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2s7cmV0dXJue3R5cGU6InRleHQiLHJhdzp0WzBdLHRleHQ6dFswXSxlc2NhcGVkOm59fX19LEJuPWNsYXNzIExke3Rva2VucztvcHRpb25zO3N0YXRlO3Rva2VuaXplcjtpbmxpbmVRdWV1ZTtjb25zdHJ1Y3Rvcih0KXt0aGlzLnRva2Vucz1bXSx0aGlzLnRva2Vucy5saW5rcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMub3B0aW9ucz10fHxKcix0aGlzLm9wdGlvbnMudG9rZW5pemVyPXRoaXMub3B0aW9ucy50b2tlbml6ZXJ8fG5ldyBzbCx0aGlzLnRva2VuaXplcj10aGlzLm9wdGlvbnMudG9rZW5pemVyLHRoaXMudG9rZW5pemVyLm9wdGlvbnM9dGhpcy5vcHRpb25zLHRoaXMudG9rZW5pemVyLmxleGVyPXRoaXMsdGhpcy5pbmxpbmVRdWV1ZT1bXSx0aGlzLnN0YXRlPXtpbkxpbms6ITEsaW5SYXdCbG9jazohMSx0b3A6ITB9O2xldCBuPXtvdGhlcjp5dCxibG9jazpvbC5ub3JtYWwsaW5saW5lOnRpLm5vcm1hbH07dGhpcy5vcHRpb25zLnBlZGFudGljPyhuLmJsb2NrPW9sLnBlZGFudGljLG4uaW5saW5lPXRpLnBlZGFudGljKTp0aGlzLm9wdGlvbnMuZ2ZtJiYobi5ibG9jaz1vbC5nZm0sdGhpcy5vcHRpb25zLmJyZWFrcz9uLmlubGluZT10aS5icmVha3M6bi5pbmxpbmU9dGkuZ2ZtKSx0aGlzLnRva2VuaXplci5ydWxlcz1ufXN0YXRpYyBnZXQgcnVsZXMoKXtyZXR1cm57YmxvY2s6b2wsaW5saW5lOnRpfX1zdGF0aWMgbGV4KHQsbil7cmV0dXJuIG5ldyBMZChuKS5sZXgodCl9c3RhdGljIGxleElubGluZSh0LG4pe3JldHVybiBuZXcgTGQobikuaW5saW5lVG9rZW5zKHQpfWxleCh0KXt0PXQucmVwbGFjZSh5dC5jYXJyaWFnZVJldHVybixgCmApLHRoaXMuYmxvY2tUb2tlbnModCx0aGlzLnRva2Vucyk7Zm9yKGxldCBuPTA7bjx0aGlzLmlubGluZVF1ZXVlLmxlbmd0aDtuKyspe2xldCByPXRoaXMuaW5saW5lUXVldWVbbl07dGhpcy5pbmxpbmVUb2tlbnMoci5zcmMsci50b2tlbnMpfXJldHVybiB0aGlzLmlubGluZVF1ZXVlPVtdLHRoaXMudG9rZW5zfWJsb2NrVG9rZW5zKHQsbj1bXSxyPSExKXtmb3IodGhpcy5vcHRpb25zLnBlZGFudGljJiYodD10LnJlcGxhY2UoeXQudGFiQ2hhckdsb2JhbCwiICAgICIpLnJlcGxhY2UoeXQuc3BhY2VMaW5lLCIiKSk7dDspe2xldCBvO2lmKHRoaXMub3B0aW9ucy5leHRlbnNpb25zPy5ibG9jaz8uc29tZShpPT4obz1pLmNhbGwoe2xleGVyOnRoaXN9LHQsbikpPyh0PXQuc3Vic3RyaW5nKG8ucmF3Lmxlbmd0aCksbi5wdXNoKG8pLCEwKTohMSkpY29udGludWU7aWYobz10aGlzLnRva2VuaXplci5zcGFjZSh0KSl7dD10LnN1YnN0cmluZyhvLnJhdy5sZW5ndGgpO2xldCBpPW4uYXQoLTEpO28ucmF3Lmxlbmd0aD09PTEmJmkhPT12b2lkIDA/aS5yYXcrPWAKYDpuLnB1c2gobyk7Y29udGludWV9aWYobz10aGlzLnRva2VuaXplci5jb2RlKHQpKXt0PXQuc3Vic3RyaW5nKG8ucmF3Lmxlbmd0aCk7bGV0IGk9bi5hdCgtMSk7aT8udHlwZT09PSJwYXJhZ3JhcGgifHxpPy50eXBlPT09InRleHQiPyhpLnJhdys9YApgK28ucmF3LGkudGV4dCs9YApgK28udGV4dCx0aGlzLmlubGluZVF1ZXVlLmF0KC0xKS5zcmM9aS50ZXh0KTpuLnB1c2gobyk7Y29udGludWV9aWYobz10aGlzLnRva2VuaXplci5mZW5jZXModCkpe3Q9dC5zdWJzdHJpbmcoby5yYXcubGVuZ3RoKSxuLnB1c2gobyk7Y29udGludWV9aWYobz10aGlzLnRva2VuaXplci5oZWFkaW5nKHQpKXt0PXQuc3Vic3RyaW5nKG8ucmF3Lmxlbmd0aCksbi5wdXNoKG8pO2NvbnRpbnVlfWlmKG89dGhpcy50b2tlbml6ZXIuaHIodCkpe3Q9dC5zdWJzdHJpbmcoby5yYXcubGVuZ3RoKSxuLnB1c2gobyk7Y29udGludWV9aWYobz10aGlzLnRva2VuaXplci5ibG9ja3F1b3RlKHQpKXt0PXQuc3Vic3RyaW5nKG8ucmF3Lmxlbmd0aCksbi5wdXNoKG8pO2NvbnRpbnVlfWlmKG89dGhpcy50b2tlbml6ZXIubGlzdCh0KSl7dD10LnN1YnN0cmluZyhvLnJhdy5sZW5ndGgpLG4ucHVzaChvKTtjb250aW51ZX1pZihvPXRoaXMudG9rZW5pemVyLmh0bWwodCkpe3Q9dC5zdWJzdHJpbmcoby5yYXcubGVuZ3RoKSxuLnB1c2gobyk7Y29udGludWV9aWYobz10aGlzLnRva2VuaXplci5kZWYodCkpe3Q9dC5zdWJzdHJpbmcoby5yYXcubGVuZ3RoKTtsZXQgaT1uLmF0KC0xKTtpPy50eXBlPT09InBhcmFncmFwaCJ8fGk/LnR5cGU9PT0idGV4dCI/KGkucmF3Kz1gCmArby5yYXcsaS50ZXh0Kz1gCmArby5yYXcsdGhpcy5pbmxpbmVRdWV1ZS5hdCgtMSkuc3JjPWkudGV4dCk6dGhpcy50b2tlbnMubGlua3Nbby50YWddfHwodGhpcy50b2tlbnMubGlua3Nbby50YWddPXtocmVmOm8uaHJlZix0aXRsZTpvLnRpdGxlfSk7Y29udGludWV9aWYobz10aGlzLnRva2VuaXplci50YWJsZSh0KSl7dD10LnN1YnN0cmluZyhvLnJhdy5sZW5ndGgpLG4ucHVzaChvKTtjb250aW51ZX1pZihvPXRoaXMudG9rZW5pemVyLmxoZWFkaW5nKHQpKXt0PXQuc3Vic3RyaW5nKG8ucmF3Lmxlbmd0aCksbi5wdXNoKG8pO2NvbnRpbnVlfWxldCBhPXQ7aWYodGhpcy5vcHRpb25zLmV4dGVuc2lvbnM/LnN0YXJ0QmxvY2spe2xldCBpPTEvMCxzPXQuc2xpY2UoMSksbDt0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5zdGFydEJsb2NrLmZvckVhY2godT0+e2w9dS5jYWxsKHtsZXhlcjp0aGlzfSxzKSx0eXBlb2YgbD09Im51bWJlciImJmw+PTAmJihpPU1hdGgubWluKGksbCkpfSksaTwxLzAmJmk+PTAmJihhPXQuc3Vic3RyaW5nKDAsaSsxKSl9aWYodGhpcy5zdGF0ZS50b3AmJihvPXRoaXMudG9rZW5pemVyLnBhcmFncmFwaChhKSkpe2xldCBpPW4uYXQoLTEpO3ImJmk/LnR5cGU9PT0icGFyYWdyYXBoIj8oaS5yYXcrPWAKYCtvLnJhdyxpLnRleHQrPWAKYCtvLnRleHQsdGhpcy5pbmxpbmVRdWV1ZS5wb3AoKSx0aGlzLmlubGluZVF1ZXVlLmF0KC0xKS5zcmM9aS50ZXh0KTpuLnB1c2gobykscj1hLmxlbmd0aCE9PXQubGVuZ3RoLHQ9dC5zdWJzdHJpbmcoby5yYXcubGVuZ3RoKTtjb250aW51ZX1pZihvPXRoaXMudG9rZW5pemVyLnRleHQodCkpe3Q9dC5zdWJzdHJpbmcoby5yYXcubGVuZ3RoKTtsZXQgaT1uLmF0KC0xKTtpPy50eXBlPT09InRleHQiPyhpLnJhdys9YApgK28ucmF3LGkudGV4dCs9YApgK28udGV4dCx0aGlzLmlubGluZVF1ZXVlLnBvcCgpLHRoaXMuaW5saW5lUXVldWUuYXQoLTEpLnNyYz1pLnRleHQpOm4ucHVzaChvKTtjb250aW51ZX1pZih0KXtsZXQgaT0iSW5maW5pdGUgbG9vcCBvbiBieXRlOiAiK3QuY2hhckNvZGVBdCgwKTtpZih0aGlzLm9wdGlvbnMuc2lsZW50KXtjb25zb2xlLmVycm9yKGkpO2JyZWFrfWVsc2UgdGhyb3cgbmV3IEVycm9yKGkpfX1yZXR1cm4gdGhpcy5zdGF0ZS50b3A9ITAsbn1pbmxpbmUodCxuPVtdKXtyZXR1cm4gdGhpcy5pbmxpbmVRdWV1ZS5wdXNoKHtzcmM6dCx0b2tlbnM6bn0pLG59aW5saW5lVG9rZW5zKHQsbj1bXSl7bGV0IHI9dCxvPW51bGw7aWYodGhpcy50b2tlbnMubGlua3Mpe2xldCBzPU9iamVjdC5rZXlzKHRoaXMudG9rZW5zLmxpbmtzKTtpZihzLmxlbmd0aD4wKWZvcig7KG89dGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLnJlZmxpbmtTZWFyY2guZXhlYyhyKSkhPW51bGw7KXMuaW5jbHVkZXMob1swXS5zbGljZShvWzBdLmxhc3RJbmRleE9mKCJbIikrMSwtMSkpJiYocj1yLnNsaWNlKDAsby5pbmRleCkrIlsiKyJhIi5yZXBlYXQob1swXS5sZW5ndGgtMikrIl0iK3Iuc2xpY2UodGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLnJlZmxpbmtTZWFyY2gubGFzdEluZGV4KSl9Zm9yKDsobz10aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24uZXhlYyhyKSkhPW51bGw7KXI9ci5zbGljZSgwLG8uaW5kZXgpKyIrKyIrci5zbGljZSh0aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24ubGFzdEluZGV4KTtmb3IoOyhvPXRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5ibG9ja1NraXAuZXhlYyhyKSkhPW51bGw7KXI9ci5zbGljZSgwLG8uaW5kZXgpKyJbIisiYSIucmVwZWF0KG9bMF0ubGVuZ3RoLTIpKyJdIityLnNsaWNlKHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5ibG9ja1NraXAubGFzdEluZGV4KTtsZXQgYT0hMSxpPSIiO2Zvcig7dDspe2F8fChpPSIiKSxhPSExO2xldCBzO2lmKHRoaXMub3B0aW9ucy5leHRlbnNpb25zPy5pbmxpbmU/LnNvbWUodT0+KHM9dS5jYWxsKHtsZXhlcjp0aGlzfSx0LG4pKT8odD10LnN1YnN0cmluZyhzLnJhdy5sZW5ndGgpLG4ucHVzaChzKSwhMCk6ITEpKWNvbnRpbnVlO2lmKHM9dGhpcy50b2tlbml6ZXIuZXNjYXBlKHQpKXt0PXQuc3Vic3RyaW5nKHMucmF3Lmxlbmd0aCksbi5wdXNoKHMpO2NvbnRpbnVlfWlmKHM9dGhpcy50b2tlbml6ZXIudGFnKHQpKXt0PXQuc3Vic3RyaW5nKHMucmF3Lmxlbmd0aCksbi5wdXNoKHMpO2NvbnRpbnVlfWlmKHM9dGhpcy50b2tlbml6ZXIubGluayh0KSl7dD10LnN1YnN0cmluZyhzLnJhdy5sZW5ndGgpLG4ucHVzaChzKTtjb250aW51ZX1pZihzPXRoaXMudG9rZW5pemVyLnJlZmxpbmsodCx0aGlzLnRva2Vucy5saW5rcykpe3Q9dC5zdWJzdHJpbmcocy5yYXcubGVuZ3RoKTtsZXQgdT1uLmF0KC0xKTtzLnR5cGU9PT0idGV4dCImJnU/LnR5cGU9PT0idGV4dCI/KHUucmF3Kz1zLnJhdyx1LnRleHQrPXMudGV4dCk6bi5wdXNoKHMpO2NvbnRpbnVlfWlmKHM9dGhpcy50b2tlbml6ZXIuZW1TdHJvbmcodCxyLGkpKXt0PXQuc3Vic3RyaW5nKHMucmF3Lmxlbmd0aCksbi5wdXNoKHMpO2NvbnRpbnVlfWlmKHM9dGhpcy50b2tlbml6ZXIuY29kZXNwYW4odCkpe3Q9dC5zdWJzdHJpbmcocy5yYXcubGVuZ3RoKSxuLnB1c2gocyk7Y29udGludWV9aWYocz10aGlzLnRva2VuaXplci5icih0KSl7dD10LnN1YnN0cmluZyhzLnJhdy5sZW5ndGgpLG4ucHVzaChzKTtjb250aW51ZX1pZihzPXRoaXMudG9rZW5pemVyLmRlbCh0KSl7dD10LnN1YnN0cmluZyhzLnJhdy5sZW5ndGgpLG4ucHVzaChzKTtjb250aW51ZX1pZihzPXRoaXMudG9rZW5pemVyLmF1dG9saW5rKHQpKXt0PXQuc3Vic3RyaW5nKHMucmF3Lmxlbmd0aCksbi5wdXNoKHMpO2NvbnRpbnVlfWlmKCF0aGlzLnN0YXRlLmluTGluayYmKHM9dGhpcy50b2tlbml6ZXIudXJsKHQpKSl7dD10LnN1YnN0cmluZyhzLnJhdy5sZW5ndGgpLG4ucHVzaChzKTtjb250aW51ZX1sZXQgbD10O2lmKHRoaXMub3B0aW9ucy5leHRlbnNpb25zPy5zdGFydElubGluZSl7bGV0IHU9MS8wLGM9dC5zbGljZSgxKSxkO3RoaXMub3B0aW9ucy5leHRlbnNpb25zLnN0YXJ0SW5saW5lLmZvckVhY2gocD0+e2Q9cC5jYWxsKHtsZXhlcjp0aGlzfSxjKSx0eXBlb2YgZD09Im51bWJlciImJmQ+PTAmJih1PU1hdGgubWluKHUsZCkpfSksdTwxLzAmJnU+PTAmJihsPXQuc3Vic3RyaW5nKDAsdSsxKSl9aWYocz10aGlzLnRva2VuaXplci5pbmxpbmVUZXh0KGwpKXt0PXQuc3Vic3RyaW5nKHMucmF3Lmxlbmd0aCkscy5yYXcuc2xpY2UoLTEpIT09Il8iJiYoaT1zLnJhdy5zbGljZSgtMSkpLGE9ITA7bGV0IHU9bi5hdCgtMSk7dT8udHlwZT09PSJ0ZXh0Ij8odS5yYXcrPXMucmF3LHUudGV4dCs9cy50ZXh0KTpuLnB1c2gocyk7Y29udGludWV9aWYodCl7bGV0IHU9IkluZmluaXRlIGxvb3Agb24gYnl0ZTogIit0LmNoYXJDb2RlQXQoMCk7aWYodGhpcy5vcHRpb25zLnNpbGVudCl7Y29uc29sZS5lcnJvcih1KTticmVha31lbHNlIHRocm93IG5ldyBFcnJvcih1KX19cmV0dXJuIG59fSxsbD1jbGFzc3tvcHRpb25zO3BhcnNlcjtjb25zdHJ1Y3RvcihlKXt0aGlzLm9wdGlvbnM9ZXx8SnJ9c3BhY2UoZSl7cmV0dXJuIiJ9Y29kZSh7dGV4dDplLGxhbmc6dCxlc2NhcGVkOm59KXtsZXQgcj0odHx8IiIpLm1hdGNoKHl0Lm5vdFNwYWNlU3RhcnQpPy5bMF0sbz1lLnJlcGxhY2UoeXQuZW5kaW5nTmV3bGluZSwiIikrYApgO3JldHVybiByPyc8cHJlPjxjb2RlIGNsYXNzPSJsYW5ndWFnZS0nK2tuKHIpKyciPicrKG4/bzprbihvLCEwKSkrYDwvY29kZT48L3ByZT4KYDoiPHByZT48Y29kZT4iKyhuP286a24obywhMCkpK2A8L2NvZGU+PC9wcmU+CmB9YmxvY2txdW90ZSh7dG9rZW5zOmV9KXtyZXR1cm5gPGJsb2NrcXVvdGU+CiR7dGhpcy5wYXJzZXIucGFyc2UoZSl9PC9ibG9ja3F1b3RlPgpgfWh0bWwoe3RleHQ6ZX0pe3JldHVybiBlfWhlYWRpbmcoe3Rva2VuczplLGRlcHRoOnR9KXtyZXR1cm5gPGgke3R9PiR7dGhpcy5wYXJzZXIucGFyc2VJbmxpbmUoZSl9PC9oJHt0fT4KYH1ocihlKXtyZXR1cm5gPGhyPgpgfWxpc3QoZSl7bGV0IHQ9ZS5vcmRlcmVkLG49ZS5zdGFydCxyPSIiO2ZvcihsZXQgaT0wO2k8ZS5pdGVtcy5sZW5ndGg7aSsrKXtsZXQgcz1lLml0ZW1zW2ldO3IrPXRoaXMubGlzdGl0ZW0ocyl9bGV0IG89dD8ib2wiOiJ1bCIsYT10JiZuIT09MT8nIHN0YXJ0PSInK24rJyInOiIiO3JldHVybiI8IitvK2ErYD4KYCtyKyI8LyIrbytgPgpgfWxpc3RpdGVtKGUpe2xldCB0PSIiO2lmKGUudGFzayl7bGV0IG49dGhpcy5jaGVja2JveCh7Y2hlY2tlZDohIWUuY2hlY2tlZH0pO2UubG9vc2U/ZS50b2tlbnNbMF0/LnR5cGU9PT0icGFyYWdyYXBoIj8oZS50b2tlbnNbMF0udGV4dD1uKyIgIitlLnRva2Vuc1swXS50ZXh0LGUudG9rZW5zWzBdLnRva2VucyYmZS50b2tlbnNbMF0udG9rZW5zLmxlbmd0aD4wJiZlLnRva2Vuc1swXS50b2tlbnNbMF0udHlwZT09PSJ0ZXh0IiYmKGUudG9rZW5zWzBdLnRva2Vuc1swXS50ZXh0PW4rIiAiK2tuKGUudG9rZW5zWzBdLnRva2Vuc1swXS50ZXh0KSxlLnRva2Vuc1swXS50b2tlbnNbMF0uZXNjYXBlZD0hMCkpOmUudG9rZW5zLnVuc2hpZnQoe3R5cGU6InRleHQiLHJhdzpuKyIgIix0ZXh0Om4rIiAiLGVzY2FwZWQ6ITB9KTp0Kz1uKyIgIn1yZXR1cm4gdCs9dGhpcy5wYXJzZXIucGFyc2UoZS50b2tlbnMsISFlLmxvb3NlKSxgPGxpPiR7dH08L2xpPgpgfWNoZWNrYm94KHtjaGVja2VkOmV9KXtyZXR1cm4iPGlucHV0ICIrKGU/J2NoZWNrZWQ9IiIgJzoiIikrJ2Rpc2FibGVkPSIiIHR5cGU9ImNoZWNrYm94Ij4nfXBhcmFncmFwaCh7dG9rZW5zOmV9KXtyZXR1cm5gPHA+JHt0aGlzLnBhcnNlci5wYXJzZUlubGluZShlKX08L3A+CmB9dGFibGUoZSl7bGV0IHQ9IiIsbj0iIjtmb3IobGV0IG89MDtvPGUuaGVhZGVyLmxlbmd0aDtvKyspbis9dGhpcy50YWJsZWNlbGwoZS5oZWFkZXJbb10pO3QrPXRoaXMudGFibGVyb3coe3RleHQ6bn0pO2xldCByPSIiO2ZvcihsZXQgbz0wO288ZS5yb3dzLmxlbmd0aDtvKyspe2xldCBhPWUucm93c1tvXTtuPSIiO2ZvcihsZXQgaT0wO2k8YS5sZW5ndGg7aSsrKW4rPXRoaXMudGFibGVjZWxsKGFbaV0pO3IrPXRoaXMudGFibGVyb3coe3RleHQ6bn0pfXJldHVybiByJiYocj1gPHRib2R5PiR7cn08L3Rib2R5PmApLGA8dGFibGU+Cjx0aGVhZD4KYCt0K2A8L3RoZWFkPgpgK3IrYDwvdGFibGU+CmB9dGFibGVyb3coe3RleHQ6ZX0pe3JldHVybmA8dHI+CiR7ZX08L3RyPgpgfXRhYmxlY2VsbChlKXtsZXQgdD10aGlzLnBhcnNlci5wYXJzZUlubGluZShlLnRva2Vucyksbj1lLmhlYWRlcj8idGgiOiJ0ZCI7cmV0dXJuKGUuYWxpZ24/YDwke259IGFsaWduPSIke2UuYWxpZ259Ij5gOmA8JHtufT5gKSt0K2A8LyR7bn0+CmB9c3Ryb25nKHt0b2tlbnM6ZX0pe3JldHVybmA8c3Ryb25nPiR7dGhpcy5wYXJzZXIucGFyc2VJbmxpbmUoZSl9PC9zdHJvbmc+YH1lbSh7dG9rZW5zOmV9KXtyZXR1cm5gPGVtPiR7dGhpcy5wYXJzZXIucGFyc2VJbmxpbmUoZSl9PC9lbT5gfWNvZGVzcGFuKHt0ZXh0OmV9KXtyZXR1cm5gPGNvZGU+JHtrbihlLCEwKX08L2NvZGU+YH1icihlKXtyZXR1cm4iPGJyPiJ9ZGVsKHt0b2tlbnM6ZX0pe3JldHVybmA8ZGVsPiR7dGhpcy5wYXJzZXIucGFyc2VJbmxpbmUoZSl9PC9kZWw+YH1saW5rKHtocmVmOmUsdGl0bGU6dCx0b2tlbnM6bn0pe2xldCByPXRoaXMucGFyc2VyLnBhcnNlSW5saW5lKG4pLG89QXkoZSk7aWYobz09PW51bGwpcmV0dXJuIHI7ZT1vO2xldCBhPSc8YSBocmVmPSInK2UrJyInO3JldHVybiB0JiYoYSs9JyB0aXRsZT0iJytrbih0KSsnIicpLGErPSI+IityKyI8L2E+IixhfWltYWdlKHtocmVmOmUsdGl0bGU6dCx0ZXh0Om4sdG9rZW5zOnJ9KXtyJiYobj10aGlzLnBhcnNlci5wYXJzZUlubGluZShyLHRoaXMucGFyc2VyLnRleHRSZW5kZXJlcikpO2xldCBvPUF5KGUpO2lmKG89PT1udWxsKXJldHVybiBrbihuKTtlPW87bGV0IGE9YDxpbWcgc3JjPSIke2V9IiBhbHQ9IiR7bn0iYDtyZXR1cm4gdCYmKGErPWAgdGl0bGU9IiR7a24odCl9ImApLGErPSI+IixhfXRleHQoZSl7cmV0dXJuInRva2VucyJpbiBlJiZlLnRva2Vucz90aGlzLnBhcnNlci5wYXJzZUlubGluZShlLnRva2Vucyk6ImVzY2FwZWQiaW4gZSYmZS5lc2NhcGVkP2UudGV4dDprbihlLnRleHQpfX0sYWk9Y2xhc3N7c3Ryb25nKHt0ZXh0OmV9KXtyZXR1cm4gZX1lbSh7dGV4dDplfSl7cmV0dXJuIGV9Y29kZXNwYW4oe3RleHQ6ZX0pe3JldHVybiBlfWRlbCh7dGV4dDplfSl7cmV0dXJuIGV9aHRtbCh7dGV4dDplfSl7cmV0dXJuIGV9dGV4dCh7dGV4dDplfSl7cmV0dXJuIGV9bGluayh7dGV4dDplfSl7cmV0dXJuIiIrZX1pbWFnZSh7dGV4dDplfSl7cmV0dXJuIiIrZX1icigpe3JldHVybiIifX0sV249Y2xhc3MgemR7b3B0aW9ucztyZW5kZXJlcjt0ZXh0UmVuZGVyZXI7Y29uc3RydWN0b3IodCl7dGhpcy5vcHRpb25zPXR8fEpyLHRoaXMub3B0aW9ucy5yZW5kZXJlcj10aGlzLm9wdGlvbnMucmVuZGVyZXJ8fG5ldyBsbCx0aGlzLnJlbmRlcmVyPXRoaXMub3B0aW9ucy5yZW5kZXJlcix0aGlzLnJlbmRlcmVyLm9wdGlvbnM9dGhpcy5vcHRpb25zLHRoaXMucmVuZGVyZXIucGFyc2VyPXRoaXMsdGhpcy50ZXh0UmVuZGVyZXI9bmV3IGFpfXN0YXRpYyBwYXJzZSh0LG4pe3JldHVybiBuZXcgemQobikucGFyc2UodCl9c3RhdGljIHBhcnNlSW5saW5lKHQsbil7cmV0dXJuIG5ldyB6ZChuKS5wYXJzZUlubGluZSh0KX1wYXJzZSh0LG49ITApe2xldCByPSIiO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtsZXQgYT10W29dO2lmKHRoaXMub3B0aW9ucy5leHRlbnNpb25zPy5yZW5kZXJlcnM/LlthLnR5cGVdKXtsZXQgcz1hLGw9dGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzW3MudHlwZV0uY2FsbCh7cGFyc2VyOnRoaXN9LHMpO2lmKGwhPT0hMXx8IVsic3BhY2UiLCJociIsImhlYWRpbmciLCJjb2RlIiwidGFibGUiLCJibG9ja3F1b3RlIiwibGlzdCIsImh0bWwiLCJwYXJhZ3JhcGgiLCJ0ZXh0Il0uaW5jbHVkZXMocy50eXBlKSl7cis9bHx8IiI7Y29udGludWV9fWxldCBpPWE7c3dpdGNoKGkudHlwZSl7Y2FzZSJzcGFjZSI6e3IrPXRoaXMucmVuZGVyZXIuc3BhY2UoaSk7Y29udGludWV9Y2FzZSJociI6e3IrPXRoaXMucmVuZGVyZXIuaHIoaSk7Y29udGludWV9Y2FzZSJoZWFkaW5nIjp7cis9dGhpcy5yZW5kZXJlci5oZWFkaW5nKGkpO2NvbnRpbnVlfWNhc2UiY29kZSI6e3IrPXRoaXMucmVuZGVyZXIuY29kZShpKTtjb250aW51ZX1jYXNlInRhYmxlIjp7cis9dGhpcy5yZW5kZXJlci50YWJsZShpKTtjb250aW51ZX1jYXNlImJsb2NrcXVvdGUiOntyKz10aGlzLnJlbmRlcmVyLmJsb2NrcXVvdGUoaSk7Y29udGludWV9Y2FzZSJsaXN0Ijp7cis9dGhpcy5yZW5kZXJlci5saXN0KGkpO2NvbnRpbnVlfWNhc2UiaHRtbCI6e3IrPXRoaXMucmVuZGVyZXIuaHRtbChpKTtjb250aW51ZX1jYXNlInBhcmFncmFwaCI6e3IrPXRoaXMucmVuZGVyZXIucGFyYWdyYXBoKGkpO2NvbnRpbnVlfWNhc2UidGV4dCI6e2xldCBzPWksbD10aGlzLnJlbmRlcmVyLnRleHQocyk7Zm9yKDtvKzE8dC5sZW5ndGgmJnRbbysxXS50eXBlPT09InRleHQiOylzPXRbKytvXSxsKz1gCmArdGhpcy5yZW5kZXJlci50ZXh0KHMpO24/cis9dGhpcy5yZW5kZXJlci5wYXJhZ3JhcGgoe3R5cGU6InBhcmFncmFwaCIscmF3OmwsdGV4dDpsLHRva2Vuczpbe3R5cGU6InRleHQiLHJhdzpsLHRleHQ6bCxlc2NhcGVkOiEwfV19KTpyKz1sO2NvbnRpbnVlfWRlZmF1bHQ6e2xldCBzPSdUb2tlbiB3aXRoICInK2kudHlwZSsnIiB0eXBlIHdhcyBub3QgZm91bmQuJztpZih0aGlzLm9wdGlvbnMuc2lsZW50KXJldHVybiBjb25zb2xlLmVycm9yKHMpLCIiO3Rocm93IG5ldyBFcnJvcihzKX19fXJldHVybiByfXBhcnNlSW5saW5lKHQsbj10aGlzLnJlbmRlcmVyKXtsZXQgcj0iIjtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7bGV0IGE9dFtvXTtpZih0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8ucmVuZGVyZXJzPy5bYS50eXBlXSl7bGV0IHM9dGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzW2EudHlwZV0uY2FsbCh7cGFyc2VyOnRoaXN9LGEpO2lmKHMhPT0hMXx8IVsiZXNjYXBlIiwiaHRtbCIsImxpbmsiLCJpbWFnZSIsInN0cm9uZyIsImVtIiwiY29kZXNwYW4iLCJiciIsImRlbCIsInRleHQiXS5pbmNsdWRlcyhhLnR5cGUpKXtyKz1zfHwiIjtjb250aW51ZX19bGV0IGk9YTtzd2l0Y2goaS50eXBlKXtjYXNlImVzY2FwZSI6e3IrPW4udGV4dChpKTticmVha31jYXNlImh0bWwiOntyKz1uLmh0bWwoaSk7YnJlYWt9Y2FzZSJsaW5rIjp7cis9bi5saW5rKGkpO2JyZWFrfWNhc2UiaW1hZ2UiOntyKz1uLmltYWdlKGkpO2JyZWFrfWNhc2Uic3Ryb25nIjp7cis9bi5zdHJvbmcoaSk7YnJlYWt9Y2FzZSJlbSI6e3IrPW4uZW0oaSk7YnJlYWt9Y2FzZSJjb2Rlc3BhbiI6e3IrPW4uY29kZXNwYW4oaSk7YnJlYWt9Y2FzZSJiciI6e3IrPW4uYnIoaSk7YnJlYWt9Y2FzZSJkZWwiOntyKz1uLmRlbChpKTticmVha31jYXNlInRleHQiOntyKz1uLnRleHQoaSk7YnJlYWt9ZGVmYXVsdDp7bGV0IHM9J1Rva2VuIHdpdGggIicraS50eXBlKyciIHR5cGUgd2FzIG5vdCBmb3VuZC4nO2lmKHRoaXMub3B0aW9ucy5zaWxlbnQpcmV0dXJuIGNvbnNvbGUuZXJyb3IocyksIiI7dGhyb3cgbmV3IEVycm9yKHMpfX19cmV0dXJuIHJ9fSxhbD1jbGFzc3tvcHRpb25zO2Jsb2NrO2NvbnN0cnVjdG9yKGUpe3RoaXMub3B0aW9ucz1lfHxKcn1zdGF0aWMgcGFzc1Rocm91Z2hIb29rcz1uZXcgU2V0KFsicHJlcHJvY2VzcyIsInBvc3Rwcm9jZXNzIiwicHJvY2Vzc0FsbFRva2VucyJdKTtwcmVwcm9jZXNzKGUpe3JldHVybiBlfXBvc3Rwcm9jZXNzKGUpe3JldHVybiBlfXByb2Nlc3NBbGxUb2tlbnMoZSl7cmV0dXJuIGV9cHJvdmlkZUxleGVyKCl7cmV0dXJuIHRoaXMuYmxvY2s/Qm4ubGV4OkJuLmxleElubGluZX1wcm92aWRlUGFyc2VyKCl7cmV0dXJuIHRoaXMuYmxvY2s/V24ucGFyc2U6V24ucGFyc2VJbmxpbmV9fSx3MT1jbGFzc3tkZWZhdWx0cz1GZCgpO29wdGlvbnM9dGhpcy5zZXRPcHRpb25zO3BhcnNlPXRoaXMucGFyc2VNYXJrZG93bighMCk7cGFyc2VJbmxpbmU9dGhpcy5wYXJzZU1hcmtkb3duKCExKTtQYXJzZXI9V247UmVuZGVyZXI9bGw7VGV4dFJlbmRlcmVyPWFpO0xleGVyPUJuO1Rva2VuaXplcj1zbDtIb29rcz1hbDtjb25zdHJ1Y3RvciguLi5lKXt0aGlzLnVzZSguLi5lKX13YWxrVG9rZW5zKGUsdCl7bGV0IG49W107Zm9yKGxldCByIG9mIGUpc3dpdGNoKG49bi5jb25jYXQodC5jYWxsKHRoaXMscikpLHIudHlwZSl7Y2FzZSJ0YWJsZSI6e2xldCBvPXI7Zm9yKGxldCBhIG9mIG8uaGVhZGVyKW49bi5jb25jYXQodGhpcy53YWxrVG9rZW5zKGEudG9rZW5zLHQpKTtmb3IobGV0IGEgb2Ygby5yb3dzKWZvcihsZXQgaSBvZiBhKW49bi5jb25jYXQodGhpcy53YWxrVG9rZW5zKGkudG9rZW5zLHQpKTticmVha31jYXNlImxpc3QiOntsZXQgbz1yO249bi5jb25jYXQodGhpcy53YWxrVG9rZW5zKG8uaXRlbXMsdCkpO2JyZWFrfWRlZmF1bHQ6e2xldCBvPXI7dGhpcy5kZWZhdWx0cy5leHRlbnNpb25zPy5jaGlsZFRva2Vucz8uW28udHlwZV0/dGhpcy5kZWZhdWx0cy5leHRlbnNpb25zLmNoaWxkVG9rZW5zW28udHlwZV0uZm9yRWFjaChhPT57bGV0IGk9b1thXS5mbGF0KDEvMCk7bj1uLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoaSx0KSl9KTpvLnRva2VucyYmKG49bi5jb25jYXQodGhpcy53YWxrVG9rZW5zKG8udG9rZW5zLHQpKSl9fXJldHVybiBufXVzZSguLi5lKXtsZXQgdD10aGlzLmRlZmF1bHRzLmV4dGVuc2lvbnN8fHtyZW5kZXJlcnM6e30sY2hpbGRUb2tlbnM6e319O3JldHVybiBlLmZvckVhY2gobj0+e2xldCByPXsuLi5ufTtpZihyLmFzeW5jPXRoaXMuZGVmYXVsdHMuYXN5bmN8fHIuYXN5bmN8fCExLG4uZXh0ZW5zaW9ucyYmKG4uZXh0ZW5zaW9ucy5mb3JFYWNoKG89PntpZighby5uYW1lKXRocm93IG5ldyBFcnJvcigiZXh0ZW5zaW9uIG5hbWUgcmVxdWlyZWQiKTtpZigicmVuZGVyZXIiaW4gbyl7bGV0IGE9dC5yZW5kZXJlcnNbby5uYW1lXTthP3QucmVuZGVyZXJzW28ubmFtZV09ZnVuY3Rpb24oLi4uaSl7bGV0IHM9by5yZW5kZXJlci5hcHBseSh0aGlzLGkpO3JldHVybiBzPT09ITEmJihzPWEuYXBwbHkodGhpcyxpKSksc306dC5yZW5kZXJlcnNbby5uYW1lXT1vLnJlbmRlcmVyfWlmKCJ0b2tlbml6ZXIiaW4gbyl7aWYoIW8ubGV2ZWx8fG8ubGV2ZWwhPT0iYmxvY2siJiZvLmxldmVsIT09ImlubGluZSIpdGhyb3cgbmV3IEVycm9yKCJleHRlbnNpb24gbGV2ZWwgbXVzdCBiZSAnYmxvY2snIG9yICdpbmxpbmUnIik7bGV0IGE9dFtvLmxldmVsXTthP2EudW5zaGlmdChvLnRva2VuaXplcik6dFtvLmxldmVsXT1bby50b2tlbml6ZXJdLG8uc3RhcnQmJihvLmxldmVsPT09ImJsb2NrIj90LnN0YXJ0QmxvY2s/dC5zdGFydEJsb2NrLnB1c2goby5zdGFydCk6dC5zdGFydEJsb2NrPVtvLnN0YXJ0XTpvLmxldmVsPT09ImlubGluZSImJih0LnN0YXJ0SW5saW5lP3Quc3RhcnRJbmxpbmUucHVzaChvLnN0YXJ0KTp0LnN0YXJ0SW5saW5lPVtvLnN0YXJ0XSkpfSJjaGlsZFRva2VucyJpbiBvJiZvLmNoaWxkVG9rZW5zJiYodC5jaGlsZFRva2Vuc1tvLm5hbWVdPW8uY2hpbGRUb2tlbnMpfSksci5leHRlbnNpb25zPXQpLG4ucmVuZGVyZXIpe2xldCBvPXRoaXMuZGVmYXVsdHMucmVuZGVyZXJ8fG5ldyBsbCh0aGlzLmRlZmF1bHRzKTtmb3IobGV0IGEgaW4gbi5yZW5kZXJlcil7aWYoIShhIGluIG8pKXRocm93IG5ldyBFcnJvcihgcmVuZGVyZXIgJyR7YX0nIGRvZXMgbm90IGV4aXN0YCk7aWYoWyJvcHRpb25zIiwicGFyc2VyIl0uaW5jbHVkZXMoYSkpY29udGludWU7bGV0IGk9YSxzPW4ucmVuZGVyZXJbaV0sbD1vW2ldO29baV09KC4uLnUpPT57bGV0IGM9cy5hcHBseShvLHUpO3JldHVybiBjPT09ITEmJihjPWwuYXBwbHkobyx1KSksY3x8IiJ9fXIucmVuZGVyZXI9b31pZihuLnRva2VuaXplcil7bGV0IG89dGhpcy5kZWZhdWx0cy50b2tlbml6ZXJ8fG5ldyBzbCh0aGlzLmRlZmF1bHRzKTtmb3IobGV0IGEgaW4gbi50b2tlbml6ZXIpe2lmKCEoYSBpbiBvKSl0aHJvdyBuZXcgRXJyb3IoYHRva2VuaXplciAnJHthfScgZG9lcyBub3QgZXhpc3RgKTtpZihbIm9wdGlvbnMiLCJydWxlcyIsImxleGVyIl0uaW5jbHVkZXMoYSkpY29udGludWU7bGV0IGk9YSxzPW4udG9rZW5pemVyW2ldLGw9b1tpXTtvW2ldPSguLi51KT0+e2xldCBjPXMuYXBwbHkobyx1KTtyZXR1cm4gYz09PSExJiYoYz1sLmFwcGx5KG8sdSkpLGN9fXIudG9rZW5pemVyPW99aWYobi5ob29rcyl7bGV0IG89dGhpcy5kZWZhdWx0cy5ob29rc3x8bmV3IGFsO2ZvcihsZXQgYSBpbiBuLmhvb2tzKXtpZighKGEgaW4gbykpdGhyb3cgbmV3IEVycm9yKGBob29rICcke2F9JyBkb2VzIG5vdCBleGlzdGApO2lmKFsib3B0aW9ucyIsImJsb2NrIl0uaW5jbHVkZXMoYSkpY29udGludWU7bGV0IGk9YSxzPW4uaG9va3NbaV0sbD1vW2ldO2FsLnBhc3NUaHJvdWdoSG9va3MuaGFzKGEpP29baV09dT0+e2lmKHRoaXMuZGVmYXVsdHMuYXN5bmMpcmV0dXJuIFByb21pc2UucmVzb2x2ZShzLmNhbGwobyx1KSkudGhlbihkPT5sLmNhbGwobyxkKSk7bGV0IGM9cy5jYWxsKG8sdSk7cmV0dXJuIGwuY2FsbChvLGMpfTpvW2ldPSguLi51KT0+e2xldCBjPXMuYXBwbHkobyx1KTtyZXR1cm4gYz09PSExJiYoYz1sLmFwcGx5KG8sdSkpLGN9fXIuaG9va3M9b31pZihuLndhbGtUb2tlbnMpe2xldCBvPXRoaXMuZGVmYXVsdHMud2Fsa1Rva2VucyxhPW4ud2Fsa1Rva2VucztyLndhbGtUb2tlbnM9ZnVuY3Rpb24oaSl7bGV0IHM9W107cmV0dXJuIHMucHVzaChhLmNhbGwodGhpcyxpKSksbyYmKHM9cy5jb25jYXQoby5jYWxsKHRoaXMsaSkpKSxzfX10aGlzLmRlZmF1bHRzPXsuLi50aGlzLmRlZmF1bHRzLC4uLnJ9fSksdGhpc31zZXRPcHRpb25zKGUpe3JldHVybiB0aGlzLmRlZmF1bHRzPXsuLi50aGlzLmRlZmF1bHRzLC4uLmV9LHRoaXN9bGV4ZXIoZSx0KXtyZXR1cm4gQm4ubGV4KGUsdD8/dGhpcy5kZWZhdWx0cyl9cGFyc2VyKGUsdCl7cmV0dXJuIFduLnBhcnNlKGUsdD8/dGhpcy5kZWZhdWx0cyl9cGFyc2VNYXJrZG93bihlKXtyZXR1cm4obixyKT0+e2xldCBvPXsuLi5yfSxhPXsuLi50aGlzLmRlZmF1bHRzLC4uLm99LGk9dGhpcy5vbkVycm9yKCEhYS5zaWxlbnQsISFhLmFzeW5jKTtpZih0aGlzLmRlZmF1bHRzLmFzeW5jPT09ITAmJm8uYXN5bmM9PT0hMSlyZXR1cm4gaShuZXcgRXJyb3IoIm1hcmtlZCgpOiBUaGUgYXN5bmMgb3B0aW9uIHdhcyBzZXQgdG8gdHJ1ZSBieSBhbiBleHRlbnNpb24uIFJlbW92ZSBhc3luYzogZmFsc2UgZnJvbSB0aGUgcGFyc2Ugb3B0aW9ucyBvYmplY3QgdG8gcmV0dXJuIGEgUHJvbWlzZS4iKSk7aWYodHlwZW9mIG4+InUifHxuPT09bnVsbClyZXR1cm4gaShuZXcgRXJyb3IoIm1hcmtlZCgpOiBpbnB1dCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkIG9yIG51bGwiKSk7aWYodHlwZW9mIG4hPSJzdHJpbmciKXJldHVybiBpKG5ldyBFcnJvcigibWFya2VkKCk6IGlucHV0IHBhcmFtZXRlciBpcyBvZiB0eXBlICIrT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG4pKyIsIHN0cmluZyBleHBlY3RlZCIpKTthLmhvb2tzJiYoYS5ob29rcy5vcHRpb25zPWEsYS5ob29rcy5ibG9jaz1lKTtsZXQgcz1hLmhvb2tzP2EuaG9va3MucHJvdmlkZUxleGVyKCk6ZT9Cbi5sZXg6Qm4ubGV4SW5saW5lLGw9YS5ob29rcz9hLmhvb2tzLnByb3ZpZGVQYXJzZXIoKTplP1duLnBhcnNlOlduLnBhcnNlSW5saW5lO2lmKGEuYXN5bmMpcmV0dXJuIFByb21pc2UucmVzb2x2ZShhLmhvb2tzP2EuaG9va3MucHJlcHJvY2VzcyhuKTpuKS50aGVuKHU9PnModSxhKSkudGhlbih1PT5hLmhvb2tzP2EuaG9va3MucHJvY2Vzc0FsbFRva2Vucyh1KTp1KS50aGVuKHU9PmEud2Fsa1Rva2Vucz9Qcm9taXNlLmFsbCh0aGlzLndhbGtUb2tlbnModSxhLndhbGtUb2tlbnMpKS50aGVuKCgpPT51KTp1KS50aGVuKHU9PmwodSxhKSkudGhlbih1PT5hLmhvb2tzP2EuaG9va3MucG9zdHByb2Nlc3ModSk6dSkuY2F0Y2goaSk7dHJ5e2EuaG9va3MmJihuPWEuaG9va3MucHJlcHJvY2VzcyhuKSk7bGV0IHU9cyhuLGEpO2EuaG9va3MmJih1PWEuaG9va3MucHJvY2Vzc0FsbFRva2Vucyh1KSksYS53YWxrVG9rZW5zJiZ0aGlzLndhbGtUb2tlbnModSxhLndhbGtUb2tlbnMpO2xldCBjPWwodSxhKTtyZXR1cm4gYS5ob29rcyYmKGM9YS5ob29rcy5wb3N0cHJvY2VzcyhjKSksY31jYXRjaCh1KXtyZXR1cm4gaSh1KX19fW9uRXJyb3IoZSx0KXtyZXR1cm4gbj0+e2lmKG4ubWVzc2FnZSs9YApQbGVhc2UgcmVwb3J0IHRoaXMgdG8gaHR0cHM6Ly9naXRodWIuY29tL21hcmtlZGpzL21hcmtlZC5gLGUpe2xldCByPSI8cD5BbiBlcnJvciBvY2N1cnJlZDo8L3A+PHByZT4iK2tuKG4ubWVzc2FnZSsiIiwhMCkrIjwvcHJlPiI7cmV0dXJuIHQ/UHJvbWlzZS5yZXNvbHZlKHIpOnJ9aWYodClyZXR1cm4gUHJvbWlzZS5yZWplY3Qobik7dGhyb3cgbn19fSxRcj1uZXcgdzE7ZnVuY3Rpb24gcGUoZSx0KXtyZXR1cm4gUXIucGFyc2UoZSx0KX1wZS5vcHRpb25zPXBlLnNldE9wdGlvbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIFFyLnNldE9wdGlvbnMoZSkscGUuZGVmYXVsdHM9UXIuZGVmYXVsdHMsTXkocGUuZGVmYXVsdHMpLHBlfTtwZS5nZXREZWZhdWx0cz1GZDtwZS5kZWZhdWx0cz1KcjtwZS51c2U9ZnVuY3Rpb24oLi4uZSl7cmV0dXJuIFFyLnVzZSguLi5lKSxwZS5kZWZhdWx0cz1Rci5kZWZhdWx0cyxNeShwZS5kZWZhdWx0cykscGV9O3BlLndhbGtUb2tlbnM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gUXIud2Fsa1Rva2VucyhlLHQpfTtwZS5wYXJzZUlubGluZT1Rci5wYXJzZUlubGluZTtwZS5QYXJzZXI9V247cGUucGFyc2VyPVduLnBhcnNlO3BlLlJlbmRlcmVyPWxsO3BlLlRleHRSZW5kZXJlcj1haTtwZS5MZXhlcj1CbjtwZS5sZXhlcj1Cbi5sZXg7cGUuVG9rZW5pemVyPXNsO3BlLkhvb2tzPWFsO3BlLnBhcnNlPXBlO3ZhciBfTz1wZS5vcHRpb25zLEFPPXBlLnNldE9wdGlvbnMsQ089cGUudXNlLE9PPXBlLndhbGtUb2tlbnMsSHk9cGUucGFyc2VJbmxpbmU7dmFyIE1PPVduLnBhcnNlLFJPPUJuLmxleDtwZS51c2Uoe2JyZWFrczohMCxnZm06ITAscmVuZGVyZXI6e2xpbmsoe2hyZWY6ZSx0aXRsZTp0LHRleHQ6bn0pe2xldCByPXQ/YCB0aXRsZT0iJHt0fSJgOiIiO3JldHVybmA8YSBocmVmPSIke2V9IiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIiR7cn0+JHtufTwvYT5gfX19KTtmdW5jdGlvbiBHbyhlKXtyZXR1cm4gZT9wZS5wYXJzZUlubGluZShlKToiIn1mdW5jdGlvbiBHZChlKXtyZXR1cm4gZT9wZS5wYXJzZShlKToiIn1mdW5jdGlvbiBqeShlKXtpZighZSlyZXR1cm4iIjtsZXQgdD1lLnJlcGxhY2UoL1xbKFteXF1dKylcXVxbXF4/XGQrXF0vZywiJDEiKS5yZXBsYWNlKC9cW1xeW15cXV0qXF0vZywiIikucmVwbGFjZSgvPT0oW149XSspPT0vZywiJDEiKTtyZXR1cm4gSHkodCx7cmVuZGVyZXI6bmV3IGFpfSkudHJpbSgpfXZhciBZeT15ZShtZSgpKTt2YXIgYmU9eWUobWUoKSksYjE9MmUzLEtkPSJkYXNoYm9hcmQ6d2lkZ2V0LWRyYWctcmVhZHkiLFZ5PTIyMDtmdW5jdGlvbiB4MShlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEVsZW1lbnQ/ISFlLmNsb3Nlc3QoImJ1dHRvbiwgYSwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIFtyb2xlPSdidXR0b24nXSIpOiExfWZ1bmN0aW9uIGsxKGUsdCxuKXtpZighQXJyYXkuaXNBcnJheShlKXx8IXR8fCFufHx0PT09bilyZXR1cm4gZTtsZXQgcj1lLmZpbmRJbmRleChsPT5sPy53aWRnZXRJZD09PXQpLG89ZS5maW5kSW5kZXgobD0+bD8ud2lkZ2V0SWQ9PT1uKTtpZihyPDB8fG88MHx8cj09PW8pcmV0dXJuIGU7bGV0IGE9Wy4uLmVdLFtpXT1hLnNwbGljZShyLDEpLHM9cjxvP28tMTpvO3JldHVybiBhLnNwbGljZShzLDAsaSksYX1mdW5jdGlvbiBTMSgpe2lmKHR5cGVvZiBkb2N1bWVudD4idSIpcmV0dXJuIG5ldyBNYXA7bGV0IGU9bmV3IE1hcDtyZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmRhc2hib2FyZC1ncmlkIC5ncmlkLWNlbGxbZGF0YS13aWRnZXQtaWRdIikuZm9yRWFjaChuPT57bGV0IHI9bi5nZXRBdHRyaWJ1dGUoImRhdGEtd2lkZ2V0LWlkIik7ciYmZS5zZXQocixuLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKX0pLGV9ZnVuY3Rpb24gRTEoZSx0KXtpZighKGUgaW5zdGFuY2VvZiBNYXApfHxlLnNpemU9PT0wfHx0eXBlb2YgZG9jdW1lbnQ+InUiKXJldHVybjtsZXQgbj1bXTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuZGFzaGJvYXJkLWdyaWQgLmdyaWQtY2VsbFtkYXRhLXdpZGdldC1pZF0iKS5mb3JFYWNoKG89PntsZXQgYT1vLmdldEF0dHJpYnV0ZSgiZGF0YS13aWRnZXQtaWQiKTtpZighYXx8YT09PXQpcmV0dXJuO2xldCBpPWUuZ2V0KGEpO2lmKCFpKXJldHVybjtsZXQgcz1vLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGw9aS5sZWZ0LXMubGVmdCx1PWkudG9wLXMudG9wO01hdGguYWJzKGwpPDEmJk1hdGguYWJzKHUpPDF8fChvLnN0eWxlLnRyYW5zaXRpb249Im5vbmUiLG8uc3R5bGUuc2V0UHJvcGVydHkoIi0tZmxpcC14IixgJHtsfXB4YCksby5zdHlsZS5zZXRQcm9wZXJ0eSgiLS1mbGlwLXkiLGAke3V9cHhgKSxuLnB1c2gobykpfSksbi5sZW5ndGghPT0wJiZ3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57bi5mb3JFYWNoKG89PntvLnN0eWxlLnRyYW5zaXRpb249YHRyYW5zZm9ybSAke1Z5fW1zIGVhc2VgLG8uc3R5bGUuc2V0UHJvcGVydHkoIi0tZmxpcC14IiwiMHB4Iiksby5zdHlsZS5zZXRQcm9wZXJ0eSgiLS1mbGlwLXkiLCIwcHgiKX0pLHdpbmRvdy5zZXRUaW1lb3V0KCgpPT57bi5mb3JFYWNoKG89Pm8uc3R5bGUucmVtb3ZlUHJvcGVydHkoInRyYW5zaXRpb24iKSl9LFZ5KzQwKX0pfWZ1bmN0aW9uIEd5KGUpe3JldHVybihlfHxbXSkubWFwKHQ9PnQ/LndpZGdldElkKS5maWx0ZXIoQm9vbGVhbikuam9pbigifCIpfWZ1bmN0aW9uIEt5KGUsdCl7bGV0W24scl09KDAsYmUudXNlU3RhdGUpKG51bGwpLFtvLGFdPSgwLGJlLnVzZVN0YXRlKShlKSxpPSgwLGJlLnVzZVJlZikoZSkscz0oMCxiZS51c2VSZWYpKG51bGwpOygwLGJlLnVzZUVmZmVjdCkoKCk9PntufHxhKGUpfSxbZSxuXSksKDAsYmUudXNlRWZmZWN0KSgoKT0+e2kuY3VycmVudD1vfSxbb10pLCgwLGJlLnVzZUxheW91dEVmZmVjdCkoKCk9PntsZXQgdT1zLmN1cnJlbnQ7IW58fCF1fHwocy5jdXJyZW50PW51bGwsRTEodSxuKSl9LFtvLG5dKSwoMCxiZS51c2VFZmZlY3QpKCgpPT57bGV0IHU9Yz0+e2xldCBkPWM/LmRldGFpbD8ud2lkZ2V0SWQ7ZCYmKHIoZCksYShwPT5BcnJheS5pc0FycmF5KHApJiZwLmxlbmd0aD9wOmUpKX07cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEtkLHUpLCgpPT53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihLZCx1KX0sW2VdKTtsZXQgbD0oMCxiZS51c2VDYWxsYmFjaykoKCk9PntpZighbilyZXR1cm47bGV0IHU9R3koZSksYz1HeShpLmN1cnJlbnQpO3IobnVsbCksYyYmdSE9PWMmJnQoaS5jdXJyZW50Lm1hcChkPT5kLndpZGdldElkKSl9LFtlLG4sdF0pO3JldHVybigwLGJlLnVzZUVmZmVjdCkoKCk9PntpZighbilyZXR1cm47bGV0IHU9cD0+e2lmKChwLmJ1dHRvbnMmMSkhPT0xKXtsKCk7cmV0dXJufWxldCB3PWRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQocC5jbGllbnRYLHAuY2xpZW50WSk/LmNsb3Nlc3Q/LigiLmRhc2hib2FyZC1ncmlkIC5ncmlkLWNlbGxbZGF0YS13aWRnZXQtaWRdIik/LmdldEF0dHJpYnV0ZT8uKCJkYXRhLXdpZGdldC1pZCIpO2lmKCF3fHx3PT09bilyZXR1cm47bGV0IGI9UzEoKTthKGc9PntsZXQgbT1rMShnLG4sdyk7cmV0dXJuIG0hPT1nJiYocy5jdXJyZW50PWIpLG19KX0sYz0oKT0+bCgpLGQ9KCk9PmwoKTtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLGMpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJibHVyIixkKSwoKT0+e3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHUpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIixjKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYmx1ciIsZCl9fSxbbixsXSkse2RyYWdnaW5nV2lkZ2V0SWQ6bixkaXNwbGF5ZWRDb21wb25lbnRzOm99fWZ1bmN0aW9uIFlkKHtjb25maWd1cmFibGU6ZSxoZWFkZXJBY3Rpb25zOnQsaWNvbjpuLG9uQ29uZmlndXJlOnIsc3VidGl0bGU6byx0aXRsZTphLHdpZGdldElkOml9KXtsZXQgcz0oMCxiZS51c2VSZWYpKG51bGwpLGw9KDAsYmUudXNlUmVmKShudWxsKSx1PSgwLGJlLnVzZVJlZikoITEpLGM9KDAsYmUudXNlTWVtbykoKCk9Pih7d2lkZ2V0SWQ6aX0pLFtpXSk7cmV0dXJuKDAsYmUudXNlRWZmZWN0KSgoKT0+e2xldCBkPXMuY3VycmVudDtpZighZClyZXR1cm47bGV0IHA9KCk9PntsLmN1cnJlbnQhPW51bGwmJih3aW5kb3cuY2xlYXJUaW1lb3V0KGwuY3VycmVudCksbC5jdXJyZW50PW51bGwpfSx5PWI9PntkLmNsYXNzTGlzdC50b2dnbGUoIndpZGdldC1oZWFkaW5nLWJhci0tZHJhZy1yZWFkeSIsISFiKX0saD1iPT57Yi5idXR0b249PT0wJiYoeDEoYi50YXJnZXQpfHwodS5jdXJyZW50PSExLHkoITEpLHAoKSxsLmN1cnJlbnQ9d2luZG93LnNldFRpbWVvdXQoKCk9Pnt1LmN1cnJlbnQ9ITAseSghMCksd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KEtkLHtkZXRhaWw6Y30pKX0sYjEpKSl9LHc9KCk9PntwKCksdS5jdXJyZW50PSExLHkoITEpfTtyZXR1cm4gZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLGgpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIix3KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsdyksKCk9PntwKCkseSghMSksZC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLGgpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIix3KSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsdyl9fSxbY10pLCgwLGJlLmNyZWF0ZUVsZW1lbnQpKCJkaXYiLHtyZWY6cyxjbGFzc05hbWU6IndpZGdldC1oZWFkZXIgd2lkZ2V0LWhlYWRpbmctYmFyIn0sKDAsYmUuY3JlYXRlRWxlbWVudCkoInNwYW4iLHtjbGFzc05hbWU6IndpZGdldC1pY29uIn0sbiksKDAsYmUuY3JlYXRlRWxlbWVudCkoImgzIix7Y2xhc3NOYW1lOiJ3aWRnZXQtdGl0bGUifSwoMCxiZS5jcmVhdGVFbGVtZW50KSgic3BhbiIse2NsYXNzTmFtZToid2lkZ2V0LXRpdGxlX19sYWJlbCJ9LGEpLG8/KDAsYmUuY3JlYXRlRWxlbWVudCkoInNwYW4iLHtjbGFzc05hbWU6IndpZGdldC10aXRsZV9fc3VidGl0bGUifSxvKTpudWxsKSx0fHxudWxsLGU/KDAsYmUuY3JlYXRlRWxlbWVudCkoImJ1dHRvbiIse2NsYXNzTmFtZToid2lkZ2V0LWNvbmZpZ3VyZSIsb25DbGljazpyfSwiXHUyNjk5IENvbmZpZ3VyZSIpOm51bGwpfWZ1bmN0aW9uIGZlKHthcHA6ZSxjaGlsZHJlbjp0LGNvbmZpZ3VyYWJsZTpuLGdyaWRIZWlnaHRTaXplOnIsZ3JpZFdpZHRoU2l6ZTpvLGhlYWRlckFjdGlvbnM6YSxpY29uOmksb25Db25maWd1cmU6cyxzdWJ0aXRsZTpsLHRpdGxlOnUsd2lkZ2V0SWQ6Y30pe2xldCBkPVl5LmRlZmF1bHQuY3JlYXRlRWxlbWVudCxwPWFzeW5jKCk9PntzP3MoKTplJiZhd2FpdCBlLmNvbmZpZ3VyZShjKSYmd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpfSx5PU51bWJlcihvKT4wP051bWJlcihvKToxLGg9TnVtYmVyKHIpPjA/TnVtYmVyKHIpOjEsdz1gaG9yaXpvbnRhbC0ke3l9LWNlbGwgdmVydGljYWwtJHtofS1jZWxsYDtyZXR1cm4gZCgiZGl2Iix7Y2xhc3NOYW1lOmB3aWRnZXQgd2lkZ2V0LSR7Y30gJHt3fWB9LGQoWWQse2NvbmZpZ3VyYWJsZTpuLGhlYWRlckFjdGlvbnM6YSxpY29uOmksc3VidGl0bGU6bCx0aXRsZTp1LHdpZGdldElkOmMsb25Db25maWd1cmU6cH0pLGQoImRpdiIse2NsYXNzTmFtZToid2lkZ2V0LWJvZHkifSx0KSl9YXN5bmMgZnVuY3Rpb24gVDEoZSx0KXtyZXR1cm4gdC5ub3RlVVVJRD9hd2FpdCBybChlLHQubm90ZVVVSUQpOmF3YWl0IEV5KGUsdCl9YXN5bmMgZnVuY3Rpb24gcXkoZSx0LHthY3RpdmVUYWI6bixzZXRBY3RpdmVUYWI6cixzZXRNb250aExvYWRpbmc6byxzZXRNb250aENvbnRlbnQ6YX0pe2lmKG49PT10LmluZGV4KXtyKG51bGwpLGEobnVsbCk7cmV0dXJufXIodC5pbmRleCksbyghMCksYShudWxsKTtsZXQgaT10LnBsYW4ubm90ZVVVSUQ7dHJ5e2lmKCFpKWEoe2ZvdW5kOiExLHBsYW46dC5wbGFuLG1vbnRoTmFtZTp0LmZ1bGwseWVhcjp0LnBsYW4ueWVhcn0pO2Vsc2V7bGV0IHM9YXdhaXQgUmQoZSxpLHQuZnVsbCk7XyhgW1BsYW5uaW5nXSBSYXcgbWFya2Rvd24gZm9yICR7dC5mdWxsfTpgLHM/LmNvbnRlbnQpLGEoey4uLnMscGxhbjp0LnBsYW4sbW9udGhOYW1lOnQuZnVsbCx5ZWFyOnQucGxhbi55ZWFyfSl9fWNhdGNoe2Eoe2ZvdW5kOiExLHBsYW46dC5wbGFuLG1vbnRoTmFtZTp0LmZ1bGwseWVhcjp0LnBsYW4ueWVhcn0pfWZpbmFsbHl7byghMSl9fWFzeW5jIGZ1bmN0aW9uIE4xKGUsdCx7c2V0TW9udGhMb2FkaW5nOm4sc2V0TW9udGhDb250ZW50OnJ9KXtpZih0KXtuKCEwKTt0cnl7bGV0IG89YXdhaXQga3koZSx0LnBsYW4sdC5tb250aE5hbWUpO2lmKG8mJm8ubm90ZVVVSUQpcmV0dXJuIHIoYT0+KHsuLi5hLGZvdW5kOiEwLGNvbnRlbnQ6by5jb250ZW50fHwiIn0pKSxhd2FpdCBybChlLG8ubm90ZVVVSUQpfWNhdGNoe31maW5hbGx5e24oITEpfX19YXN5bmMgZnVuY3Rpb24gRDEoZSx0LG4scixvKXtyKCEwKTt0cnl7bGV0IGE9YXdhaXQgU3koZSx0LG4pO2lmKGE/Lm5vdGVVVUlEKXJldHVybiBvKHtmb3VuZDohMCxjb250ZW50OmEuY29udGVudHx8IiJ9KSxhd2FpdCBybChlLGEubm90ZVVVSUQpfWNhdGNoe31maW5hbGx5e3IoITEpfX1mdW5jdGlvbiBfMShlLHQsbil7bGV0IHI9ISF0Lm5vdGVVVUlELG89ISF0Lmhhc0FsbE1vbnRobHlEZXRhaWxzLGE9InF1YXJ0ZXItY2FyZCIrKHI/IiBxdWFydGVyLWNhcmQtLWhhcy1wbGFuIjoiIiksaT1vPyJcdTI3MDUiOiJcdXsxRjZBN30iLHM9bz8iQWxsIDMgbW9udGhzIGluIHRoaXMgcXVhcnRlciBoYXZlIGJlZW4gcGxhbm5lZC4iOiJNb250aGx5IGRldGFpbHMgYXJlIG1pc3NpbmcgZm9yIG9uZSBvciBtb3JlIG1vbnRocyBcdTIwMTQgdGhpcyBwbGFuIGlzIGEgd29yayBpbiBwcm9ncmVzcy4iO3JldHVybiBlKCJkaXYiLHtrZXk6dC5sYWJlbCxjbGFzc05hbWU6YSxvbkNsaWNrOm59LGUoInNwYW4iLHtjbGFzc05hbWU6InF1YXJ0ZXItbGFiZWwifSx0LmxhYmVsKSxlKCJkaXYiLHtjbGFzc05hbWU6InF1YXJ0ZXItc3RhdHVzLXJvdyJ9LGUoInNwYW4iLHtjbGFzc05hbWU6InF1YXJ0ZXItc3RhdHVzIn0scj8iXHV7MUY0RER9IE9wZW4gUGxhbiI6IisgQ3JlYXRlIFBsYW4iKSxyP2UoQ2Qse2NvbnRlbnQ6cyxwbGFjZW1lbnQ6ImJvdHRvbSJ9LGUoInNwYW4iLHtjbGFzc05hbWU6InF1YXJ0ZXItcGxhbi1pbmRpY2F0b3IiLG9uQ2xpY2s6bD0+bC5zdG9wUHJvcGFnYXRpb24oKX0saSkpOm51bGwpKX1mdW5jdGlvbiBBMShlLHQsbixyKXtyZXR1cm4gdD9lKCJkaXYiLHtjbGFzc05hbWU6Im1vbnRoLWNvbnRlbnQtbG9hZGluZyJ9LCJMb2FkaW5nXHUyMDI2Iik6bj9uLmZvdW5kP2UoImRpdiIse2NsYXNzTmFtZToibW9udGgtY29udGVudCJ9LGUoImRpdiIse2NsYXNzTmFtZToibW9udGgtY29udGVudC1oZWFkZXIifSxuLm1vbnRoTmFtZSksZSgiZGl2Iix7Y2xhc3NOYW1lOiJtb250aC1jb250ZW50LXRleHQiLGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOntfX2h0bWw6R2Qobi5jb250ZW50KXx8IjxwPihFbXB0eSBzZWN0aW9uKTwvcD4ifX0pKTplKCJkaXYiLHtjbGFzc05hbWU6Im1vbnRoLWNvbnRlbnQtZW1wdHkifSxlKCJidXR0b24iLHtjbGFzc05hbWU6ImNyZWF0ZS1tb250aC1wbGFuLWxpbmsiLG9uQ2xpY2s6cn0sYENyZWF0ZSBhIHBsYW4gZm9yICR7bi5tb250aE5hbWV9ICR7bi55ZWFyfWApKTpudWxsfWZ1bmN0aW9uIEMxKGUsdCxuLHIsbyxhKXtyZXR1cm4gcj9lKCJkaXYiLHtjbGFzc05hbWU6IndlZWtseS1wbGFuLXNlY3Rpb24ifSxlKCJkaXYiLHtjbGFzc05hbWU6IndlZWtseS1wbGFuLWxvYWRpbmcifSwiTG9hZGluZ1x1MjAyNiIpKTpvPy5mb3VuZD9lKCJkaXYiLHtjbGFzc05hbWU6Im1vbnRoLWNvbnRlbnQtYXJlYSJ9LGUoImRpdiIse2NsYXNzTmFtZToibW9udGgtY29udGVudCJ9LGUoImRpdiIse2NsYXNzTmFtZToibW9udGgtY29udGVudC1oZWFkZXIifSx0KSxlKCJkaXYiLHtjbGFzc05hbWU6Im1vbnRoLWNvbnRlbnQtdGV4dCIsZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6e19faHRtbDpHZChvLmNvbnRlbnQpfHwiPHA+KEVtcHR5IHNlY3Rpb24pPC9wPiJ9fSkpKTplKCJkaXYiLHtjbGFzc05hbWU6IndlZWtseS1wbGFuLXNlY3Rpb24ifSxlKCJkaXYiLHtjbGFzc05hbWU6IndlZWtseS1wbGFuLWhlYWRlciJ9LCJXZWVrbHkgUGxhbiIpLGUoImJ1dHRvbiIse2NsYXNzTmFtZToiY3JlYXRlLXdlZWstcGxhbi1saW5rIixvbkNsaWNrOmF9LGBDcmVhdGUgYSB3ZWVrbHkgcGxhbiBmb3IgJHt0fSwgJHtufWApKX1mdW5jdGlvbiBxZCh7YXBwOmUsZ3JpZEhlaWdodFNpemU6dD0xLHF1YXJ0ZXJseVBsYW5zOm59KXtsZXQgcj1SdC5jcmVhdGVFbGVtZW50LFtvLGFdPSgwLFJ0LnVzZVN0YXRlKShudWxsKSxbaSxzXT0oMCxSdC51c2VTdGF0ZSkobnVsbCksW2wsdV09KDAsUnQudXNlU3RhdGUpKCExKSxbYyxkXT0oMCxSdC51c2VTdGF0ZSkobnVsbCksW3AseV09KDAsUnQudXNlU3RhdGUpKCExKSxbaCx3XT0oMCxSdC51c2VTdGF0ZSkoITEpLFtiLGddPSgwLFJ0LnVzZVN0YXRlKShudWxsKSxtPXQ+PTI7aWYoYiYmTG4pcmV0dXJuIHIoZmUse3RpdGxlOmRlKCJwbGFubmluZyIpLGljb246Ilx1ezFGNENCfSIsd2lkZ2V0SWQ6InBsYW5uaW5nIn0scihJZCx7YXBwOmUsbm90ZVVVSUQ6YixvbkJhY2s6KCk9PmcobnVsbCl9KSk7aWYoIW4/LmN1cnJlbnR8fCFuPy5uZXh0KXJldHVybiByKGZlLHt0aXRsZTpkZSgicGxhbm5pbmciKSxpY29uOiJcdXsxRjRDQn0iLHdpZGdldElkOiJwbGFubmluZyJ9LHIoInAiLHtjbGFzc05hbWU6InBsYW5uaW5nLWVtcHR5In0sIkxvYWRpbmcgcXVhcnRlcmx5IHBsYW5zXHUyMDI2IikpO2xldCB2PVRnKG4uY3VycmVudCxuLm5leHQpLGY9e2FjdGl2ZVRhYjpvLHNldEFjdGl2ZVRhYjphLHNldE1vbnRoTG9hZGluZzp1LHNldE1vbnRoQ29udGVudDpzfSxFPXtzZXRNb250aExvYWRpbmc6dSxzZXRNb250aENvbnRlbnQ6c30saz1PPT57Tz8uZGV2RWRpdCYmTy5ub3RlVVVJRCYmZyhPLm5vdGVVVUlEKX0sTj1WcygpLEQ9R3MoTik7cmV0dXJuKDAsUnQudXNlRWZmZWN0KSgoKT0+e2lmKGgpcmV0dXJuO2xldCBPPXYuZmluZChUPT5ULmN1cnJlbnQpO08mJih3KCEwKSxxeShlLE8sZikpfSxbaF0pLCgwLFJ0LnVzZUVmZmVjdCkoKCk9PntpZighbSlyZXR1cm47bGV0IE89bi5jdXJyZW50Py5ub3RlVVVJRDtPJiYoeSghMCksUmQoZSxPLEQpLnRoZW4oVD0+e18oYFtQbGFubmluZ10gV2Vla2x5IHNlY3Rpb24gIiR7RH0iOmAsVCksZChUKX0pLmNhdGNoKCgpPT5kKHtmb3VuZDohMSxjb250ZW50Om51bGx9KSkuZmluYWxseSgoKT0+eSghMSkpKX0sW20sbi5jdXJyZW50Py5ub3RlVVVJRCxEXSkscihmZSx7dGl0bGU6ZGUoInBsYW5uaW5nIiksaWNvbjoiXHV7MUY0Q0J9Iix3aWRnZXRJZDoicGxhbm5pbmcifSxyKCJkaXYiLHtjbGFzc05hbWU6InBsYW5uaW5nLXF1YXJ0ZXJzIn0sW24uY3VycmVudCxuLm5leHRdLm1hcChPPT5fMShyLE8sYXN5bmMoKT0+e2xldCBUPWF3YWl0IFQxKGUsTyk7ayhUKX0pKSkscigiZGl2Iix7Y2xhc3NOYW1lOiJtb250aC10YWJzIn0sdi5tYXAoTz0+cigiYnV0dG9uIix7a2V5Ok8uaW5kZXgsY2xhc3NOYW1lOiJtb250aC10YWIiKyhPLmluZGV4PT09bz8iIGFjdGl2ZSI6IiIpLG9uQ2xpY2s6KCk9PnF5KGUsTyxmKX0sTy5zaG9ydCkpKSxvIT09bnVsbD9yKCJkaXYiLHtjbGFzc05hbWU6Im1vbnRoLWNvbnRlbnQtYXJlYSJ9LEExKHIsbCxpLGFzeW5jKCk9PntsZXQgTz1hd2FpdCBOMShlLGksRSk7ayhPKX0pKTpudWxsLG0/QzEocixELG4uY3VycmVudC55ZWFyLHAsYyxhc3luYygpPT57bGV0IE89YXdhaXQgRDEoZSxuLmN1cnJlbnQsRCx5LGQpO2soTyl9KTpudWxsKX12YXIgSG49eWUobWUoKSk7dmFyIE8xPS9cWyhbXlxdXSspXF1cW1xePyhcZCspXF0vZyxReT0vXHMqXFtcXj8oXGQrKVxdWy46XVxzKi8sTTE9L14hXFsoW15cXV0qKVxdXCgoW14pXSspXCkvLFIxPS9eXFsoW15cXV0qKVxdXCgoW14pXSopXCkvLEkxPS9cLihtcDR8d2VibXxvZ2cpKFw/fCQpL2ksWHk9Lyg/OnlvdXR1YmVcLmNvbVwvd2F0Y2hcP3Y9fHlvdXR1XC5iZVwvKShbYS16QS1aMC05Xy1dKykvLFp5PS92aW1lb1wuY29tXC8oXGQrKS87ZnVuY3Rpb24gUDEoZSl7cmV0dXJuIEkxLnRlc3QoZSl8fFh5LnRlc3QoZSl8fFp5LnRlc3QoZSl9ZnVuY3Rpb24gaWkoZSl7cmV0dXJuIGUucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoLyIvZywiJnF1b3Q7IikucmVwbGFjZSgvJy9nLCImIzM5OyIpLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpfWZ1bmN0aW9uIFFkKGUpe3JldHVybiBlLnJlcGxhY2UoLyYvZywiJmFtcDsiKS5yZXBsYWNlKC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKS5yZXBsYWNlKC8iL2csIiZxdW90OyIpfWZ1bmN0aW9uIEwxKGUsdCl7bGV0IG49ZS5tYXRjaChNMSk7aWYobil7bGV0IG89blsyXTtQMShvKT90LnZpZGVvcy5wdXNoKHthbHQ6blsxXSx1cmw6b30pOnQuaW1hZ2VzLnB1c2goe2FsdDpuWzFdLHVybDpvfSk7cmV0dXJufWxldCByPWUubWF0Y2goUjEpO2lmKHIpeyF0LmRlc2NyaXB0aW9uJiYhdC51cmw/KHQuZGVzY3JpcHRpb249clsxXXx8IiIsdC51cmw9clsyXXx8IiIpOnQudGV4dC5wdXNoKGUpO3JldHVybn1lJiZ0LnRleHQucHVzaChlKX1mdW5jdGlvbiB6MShlKXtsZXQgdD1lLm1hdGNoKFF5KTtpZighdClyZXR1cm57Zm9vdG5vdGVzOnt9LGNsZWFuZWRNYXJrZG93bjplfTtsZXQgbj1lLnN1YnN0cmluZygwLHQuaW5kZXgpLnRyaW1FbmQoKSxyPWUuc3Vic3RyaW5nKHQuaW5kZXgpLG89e30sYT1uZXcgUmVnRXhwKFF5LnNvdXJjZSwiZyIpLGk9bnVsbCxzPTAsbDtmb3IoOyhsPWEuZXhlYyhyKSkhPT1udWxsOylpIT09bnVsbCYmKG9baV09Snkoci5zdWJzdHJpbmcocyxsLmluZGV4KSkpLGk9bFsxXSxzPWwuaW5kZXgrbFswXS5sZW5ndGg7cmV0dXJuIGkhPT1udWxsJiYob1tpXT1KeShyLnN1YnN0cmluZyhzKSkpLHtmb290bm90ZXM6byxjbGVhbmVkTWFya2Rvd246bn19ZnVuY3Rpb24gSnkoZSl7bGV0IHQ9e2Rlc2NyaXB0aW9uOiIiLHVybDoiIixpbWFnZXM6W10sdmlkZW9zOltdLHRleHQ6W119O2ZvcihsZXQgbiBvZiBlLnNwbGl0KGAKYCkpe2xldCByPW4udHJpbSgpO3ImJkwxKHIsdCl9cmV0dXJuIHR9ZnVuY3Rpb24gRjEoZSl7bGV0IHQ9W107cmV0dXJuIGUuaW1hZ2VzLmxlbmd0aCYmdC5wdXNoKHtjbHM6ImltYWdlIix0aXRsZToiQ29udGFpbnMgaW1hZ2UiLHN5bWJvbDoiXHV7MUY1QkN9In0pLGUudmlkZW9zLmxlbmd0aCYmdC5wdXNoKHtjbHM6InZpZGVvIix0aXRsZToiQ29udGFpbnMgdmlkZW8iLHN5bWJvbDoiXHV7MUYzQUN9In0pLCFlLmltYWdlcy5sZW5ndGgmJiFlLnZpZGVvcy5sZW5ndGgmJihlLnVybD90LnB1c2goe2NsczoidXJsIix0aXRsZToiQ29udGFpbnMgbGluayIsc3ltYm9sOiJcdXsxRjUxN30ifSk6KGUuZGVzY3JpcHRpb258fGUudGV4dC5sZW5ndGgpJiZ0LnB1c2goe2NsczoidGV4dCIsdGl0bGU6IkNvbnRhaW5zIGRldGFpbHMiLHN5bWJvbDoiXHV7MUY0RER9In0pKSx0fWZ1bmN0aW9uIFUxKGUpe2xldCB0PVsnPGRpdiBjbGFzcz0icmljaC1mb290bm90ZS1wb3B1cCI+J107ZS51cmwmJnQucHVzaChgPGRpdiBjbGFzcz0icmljaC1mb290bm90ZS1wb3B1cC11cmwiPjxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTE4IDEzdjZhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJWOGEyIDIgMCAwIDEgMi0yaDYiLz48cG9seWxpbmUgcG9pbnRzPSIxNSAzIDIxIDMgMjEgOSIvPjxsaW5lIHgxPSIxMCIgeTE9IjE0IiB4Mj0iMjEiIHkyPSIzIi8+PC9zdmc+PGEgaHJlZj0iJHtpaShlLnVybCl9IiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIj4ke1FkKGUudXJsKX08L2E+PC9kaXY+YCksZS5kZXNjcmlwdGlvbiYmdC5wdXNoKGA8ZGl2IGNsYXNzPSJyaWNoLWZvb3Rub3RlLXBvcHVwLXRleHQiPiR7UWQoZS5kZXNjcmlwdGlvbil9PC9kaXY+YCk7Zm9yKGxldCBuIG9mIGUudGV4dCl0LnB1c2goYDxkaXYgY2xhc3M9InJpY2gtZm9vdG5vdGUtcG9wdXAtdGV4dCI+JHtRZChuKX08L2Rpdj5gKTtmb3IobGV0IG4gb2YgZS5pbWFnZXMpdC5wdXNoKGA8ZGl2IGNsYXNzPSJyaWNoLWZvb3Rub3RlLXBvcHVwLW1lZGlhIj48aW1nIHNyYz0iJHtpaShuLnVybCl9IiBhbHQ9IiR7aWkobi5hbHQpfSIgbG9hZGluZz0ibGF6eSIvPjwvZGl2PmApO2ZvcihsZXQgbiBvZiBlLnZpZGVvcyl7bGV0IHI9bi51cmwubWF0Y2goWHkpLG89bi51cmwubWF0Y2goWnkpO3I/dC5wdXNoKGA8ZGl2IGNsYXNzPSJyaWNoLWZvb3Rub3RlLXBvcHVwLW1lZGlhIj48aWZyYW1lIHNyYz0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvJHtyWzFdfSIgZnJhbWVib3JkZXI9IjAiIGFsbG93ZnVsbHNjcmVlbj48L2lmcmFtZT48L2Rpdj5gKTpvP3QucHVzaChgPGRpdiBjbGFzcz0icmljaC1mb290bm90ZS1wb3B1cC1tZWRpYSI+PGlmcmFtZSBzcmM9Imh0dHBzOi8vcGxheWVyLnZpbWVvLmNvbS92aWRlby8ke29bMV19IiBmcmFtZWJvcmRlcj0iMCIgYWxsb3dmdWxsc2NyZWVuPjwvaWZyYW1lPjwvZGl2PmApOnQucHVzaChgPGRpdiBjbGFzcz0icmljaC1mb290bm90ZS1wb3B1cC1tZWRpYSI+PHZpZGVvIHNyYz0iJHtpaShuLnVybCl9IiBjb250cm9scz48L3ZpZGVvPjwvZGl2PmApfXJldHVybiB0LnB1c2goJzxkaXYgY2xhc3M9InJpY2gtZm9vdG5vdGUtcG9wdXAtYWN0aW9ucyI+PGJ1dHRvbiBjbGFzcz0icmljaC1mb290bm90ZS1wb3B1cC1jbG9zZSIgdHlwZT0iYnV0dG9uIj5DTE9TRTwvYnV0dG9uPjwvZGl2PicpLHQucHVzaCgiPC9kaXY+IiksdC5qb2luKCIiKX1mdW5jdGlvbiAkMShlLHQpe2xldCBuPUYxKHQpLHI9ZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHt1cmw6dC51cmwsZGVzY3JpcHRpb246dC5kZXNjcmlwdGlvbix0ZXh0OnQudGV4dCxpbWFnZXM6dC5pbWFnZXMsdmlkZW9zOnQudmlkZW9zfSkpLG89dC51cmx8fCIjIixhPW4ubWFwKGk9PmA8c3BhbiBjbGFzcz0icmljaC1mb290bm90ZS1pbmRpY2F0b3IgcmljaC1mb290bm90ZS1pbmRpY2F0b3ItLSR7aS5jbHN9IiB0aXRsZT0iJHtpLnRpdGxlfSI+JHtpLnN5bWJvbH08L3NwYW4+YCkuam9pbigiIik7cmV0dXJuYDxkaXYgY2xhc3M9InJpY2gtZm9vdG5vdGUtd3JhcCI+PGEgY2xhc3M9InJpY2gtZm9vdG5vdGUtbGluayIgaHJlZj0iJHtpaShvKX0iIGRhdGEtcmljaC1mb290bm90ZT0iJHtyfSIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciI+JHtlfTwvYT5gK2ErIjwvZGl2PiJ9ZnVuY3Rpb24gc2koZSl7aWYoIWUpcmV0dXJuIiI7bGV0e2Zvb3Rub3Rlczp0LGNsZWFuZWRNYXJrZG93bjpufT16MShlKTtpZihPYmplY3Qua2V5cyh0KS5sZW5ndGg9PT0wKXJldHVybiBHbyhlKTtsZXQgcj1bXSxvPW4ucmVwbGFjZShPMSwoaSxzLGwpPT57aWYoIXRbbF0pcmV0dXJuIGk7bGV0IHU9ci5sZW5ndGg7cmV0dXJuIHIucHVzaCh7dGV4dDpzLGZuSWQ6bH0pLGA8IS0tRk5SRUY6JHt1fS0tPmB9KSxhPUdvKG8pO3JldHVybiBhPWEucmVwbGFjZSgvPCEtLUZOUkVGOihcZCspLS0+L2csKGkscyk9PntsZXR7dGV4dDpsLGZuSWQ6dX09cltwYXJzZUludChzKV0sYz10W3VdO2lmKCFjKXJldHVybiBsO2xldCBkPUdvKGwpO3JldHVybiAkMShkLGMpfSksYX1mdW5jdGlvbiBkbChlKXtpZighZSlyZXR1cm47bGV0IHQ9ZS5xdWVyeVNlbGVjdG9yQWxsKCIucmljaC1mb290bm90ZS1saW5rW2RhdGEtcmljaC1mb290bm90ZV0iKTtmb3IobGV0IG4gb2YgdCl7aWYobi5fdGlwcHlSaWNoRm9vdG5vdGUpY29udGludWU7bGV0IHI7dHJ5e3I9SlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQobi5kYXRhc2V0LnJpY2hGb290bm90ZSkpfWNhdGNoe2NvbnRpbnVlfWlmKCEhIShyLmRlc2NyaXB0aW9ufHxyLnRleHQ/Lmxlbmd0aHx8ci5pbWFnZXM/Lmxlbmd0aHx8ci52aWRlb3M/Lmxlbmd0aCkpY29udGludWU7bGV0IGE9VTEociksaT1aYShuLHtjb250ZW50OmEsYWxsb3dIVE1MOiEwLGludGVyYWN0aXZlOiEwLHRyaWdnZXI6Im1hbnVhbCIscGxhY2VtZW50OiJib3R0b20tc3RhcnQiLHRoZW1lOiJyaWNoLWZvb3Rub3RlIixtYXhXaWR0aDo0MjAsYXJyb3c6ITAsZHVyYXRpb246WzE1MCwxMDBdLGFwcGVuZFRvOigpPT5kb2N1bWVudC5ib2R5LG9uU2hvd24oKXtsZXQgcz1pLnBvcHBlci5xdWVyeVNlbGVjdG9yKCIucmljaC1mb290bm90ZS1wb3B1cC1jbG9zZSIpO3MmJnMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT5pLmhpZGUoKSx7b25jZTohMH0pfX0pO24uX3RpcHB5UmljaEZvb3Rub3RlPWksbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIscz0+e2lmKGkuc3RhdGUuaXNWaXNpYmxlKXtpLmhpZGUoKTtyZXR1cm59cy5wcmV2ZW50RGVmYXVsdCgpLHMuc3RvcFByb3BhZ2F0aW9uKCksaS5zaG93KCl9KX19dmFyIHBsPTM7ZnVuY3Rpb24gZXYoZSx0KXtyZXR1cm4hQXJyYXkuaXNBcnJheShlKXx8IXQ/W106ZS5maWx0ZXIobj0+bj8uc3RhcnQmJiRuKG4uc3RhcnQpPT09dCl9ZnVuY3Rpb24gSmQoe2FwcDplLGNhbGVuZGFyRXZlbnRzOnQsY3VycmVudERhdGU6bixzZWxlY3RlZERhdGU6cix0YXNrczpvLHRpbWVGb3JtYXQ6YX0pe2xldCBpPUhuLmNyZWF0ZUVsZW1lbnQsW3MsbF09KDAsSG4udXNlU3RhdGUpKDApLHU9KDAsSG4udXNlUmVmKShudWxsKSxjPSRuKG58fG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSksZD1PYmplY3Qua2V5cyhvfHx7fSkuc29ydCgpLHk9QXJyYXkuaXNBcnJheSh0KSYmdC5sZW5ndGg+MD9ldih0LGMpOltdLGg9QXJyYXkuZnJvbShuZXcgU2V0KFsuLi5kLC4uLnkubGVuZ3RoPjA/W2NdOltdXSkpLnNvcnQoKSx3PXImJiFoLmluY2x1ZGVzKHIpP1suLi5oLHJdLnNvcnQoKTpoLGI9TWF0aC5tYXgoMSxNYXRoLmNlaWwody5sZW5ndGgvcGwpKTsoMCxIbi51c2VFZmZlY3QpKCgpPT57aWYoIXIpcmV0dXJuO2xldCBNPXcuaW5kZXhPZihyKTtNPj0wJiZsKE1hdGguZmxvb3IoTS9wbCkpfSxbcl0pLCgwLEhuLnVzZUVmZmVjdCkoKCk9PntkbCh1LmN1cnJlbnQpfSk7bGV0IGc9TWF0aC5taW4ocyxiLTEpLG09dy5zbGljZShnKnBsLChnKzEpKnBsKSx2PU09Pk0uaW1wb3J0YW50JiZNLnVyZ2VudD8icHJpb3JpdHktY3JpdGljYWwiOk0uaW1wb3J0YW50PyJwcmlvcml0eS1pbXBvcnRhbnQiOk0udXJnZW50PyJwcmlvcml0eS11cmdlbnQiOiJwcmlvcml0eS1ub3JtYWwiLGY9TT0+e2lmKCFNKXJldHVybiBudWxsO2lmKE0gaW5zdGFuY2VvZiBEYXRlKXJldHVybiBNLmdldFRpbWUoKTtpZih0eXBlb2YgTT09Im51bWJlciIpcmV0dXJuIE08MWUxMD9NKjFlMzpNO2lmKHR5cGVvZiBNPT0ic3RyaW5nIil7bGV0IEs9bmV3IERhdGUoTSkuZ2V0VGltZSgpO3JldHVybiBOdW1iZXIuaXNOYU4oSyk/bnVsbDpLfXJldHVybiBudWxsfSxFPU09PntsZXQgSz1mKE0/LmVuZCksb2U9ZihNPy5zdGFydCk7cmV0dXJuIEs9PW51bGx8fG9lPT1udWxsfHxLPD1vZT9udWxsOk1hdGgucm91bmQoKEstb2UpLzZlNCl9LGs9TT0+e2xldCBLPWYoTSk7aWYoIUspcmV0dXJuIiI7bGV0IG9lPWE9PT0iMjRoIj97aG91cjoiMi1kaWdpdCIsbWludXRlOiIyLWRpZ2l0Iixob3VyMTI6ITF9Ontob3VyOiIyLWRpZ2l0IixtaW51dGU6IjItZGlnaXQifTtyZXR1cm4gbmV3IERhdGUoSykudG9Mb2NhbGVUaW1lU3RyaW5nKFtdLG9lKX0sTj1NPT5NLm5vdGVVVUlEfHxNLm5vdGVVdWlkfHxNLm5vdGU/LnV1aWR8fG51bGwsRD1NPT5NLm5vdGVOYW1lfHxNLm5vdGVUaXRsZXx8TS5ub3RlPy5uYW1lfHwiT3BlbiBub3RlIixPPWFzeW5jIE09PntsZXQgSz1OKE0pOyFLfHwhTS51dWlkfHxhd2FpdCBlLm5hdmlnYXRlKGBodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzLyR7S30/aGlnaGxpZ2h0VGFza1VVSUQ9JHtNLnV1aWR9YCl9LFQ9YXN5bmMoTSxLKT0+e0suc3RvcFByb3BhZ2F0aW9uKCk7bGV0IG9lPU4oTSk7b2UmJmF3YWl0IGUubmF2aWdhdGUoYGh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vbm90ZXMvJHtvZX1gKX0sej1NPT5uZXcgRGF0ZShgJHtNfVQwMDowMDowMGApLnRvTG9jYWxlRGF0ZVN0cmluZyhbXSx7d2Vla2RheToic2hvcnQiLG1vbnRoOiJzaG9ydCIsZGF5OiJudW1lcmljIn0pLFA9RGF0ZS5ub3coKSxDPU09Pk0uZmlsdGVyKEs9PntsZXQgb2U9ZihLLmhpZGVVbnRpbCk7cmV0dXJuIG9lPT1udWxsPyEwOm9lPD1QfSksTD0oTSxLKT0+e2lmKEsudHlwZT09PSJldmVudCImJksuZXZlbnQuYWxsRGF5KXJldHVybiBuZXcgRGF0ZShgJHtNfVQwMDowMDowMGApLmdldFRpbWUoKTtsZXQgb2U9Sy50eXBlPT09ImV2ZW50Ij9LLmV2ZW50LnN0YXJ0OksudGFzay5zdGFydEF0fHxLLnRhc2suZGVhZGxpbmUsUz1mKG9lKTtyZXR1cm4gUz8/TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZfSwkPShNLEssb2UpPT5bLi4ub2UubWFwKChTLHgpPT4oe2luZGV4Ongsc29ydE1zOkwoTSx7dGFzazpTLHR5cGU6InRhc2sifSksdGFzazpTLHR5cGU6InRhc2sifSkpLC4uLksubWFwKChTLHgpPT4oe2V2ZW50OlMsaW5kZXg6eCxzb3J0TXM6TChNLHtldmVudDpTLHR5cGU6ImV2ZW50In0pLHNvdXJjZU9yZGVyOm9lLmxlbmd0aCt4LHR5cGU6ImV2ZW50In0pKV0ubWFwKChTLHgpPT4oey4uLlMsc291cmNlT3JkZXI6Uy5zb3VyY2VPcmRlcj8/eH0pKS5zb3J0KChTLHgpPT5TLnNvcnRNcy14LnNvcnRNc3x8Uy5zb3VyY2VPcmRlci14LnNvdXJjZU9yZGVyKSxXPWI+MT9pKCJkaXYiLHtjbGFzc05hbWU6ImFnZW5kYS1wYWdpbmF0aW9uIn0saSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJhZ2VuZGEtcGFnZS1hcnJvdyIsb25DbGljazooKT0+bChNPT5NYXRoLm1heCgwLE0tMSkpLGRpc2FibGVkOmc9PT0wfSwiXHUyNUMwIiksaSgic3BhbiIse2NsYXNzTmFtZToiYWdlbmRhLXBhZ2UtaW5kaWNhdG9yIn0sYCR7ZysxfSAvICR7Yn1gKSxpKCJidXR0b24iLHtjbGFzc05hbWU6ImFnZW5kYS1wYWdlLWFycm93IixvbkNsaWNrOigpPT5sKE09Pk1hdGgubWluKGItMSxNKzEpKSxkaXNhYmxlZDpnPj1iLTF9LCJcdTI1QjYiKSk6bnVsbDtyZXR1cm4gaShmZSx7dGl0bGU6ZGUoImFnZW5kYSIpLGljb246Ilx1ezFGNENCfSIsd2lkZ2V0SWQ6ImFnZW5kYSIsaGVhZGVyQWN0aW9uczpXfSxpKCJkaXYiLHtjbGFzc05hbWU6ImFnZW5kYS1saXN0IixyZWY6dX0sbS5tYXAoTT0+e2xldCBLPW9bTV18fFtdLG9lPUMoSyksUz1ldih0LE0pLHg9JChNLFMsb2UpO3JldHVybiBpKCJzZWN0aW9uIix7a2V5Ok0sY2xhc3NOYW1lOiJhZ2VuZGEtZGF5In0saSgiaDQiLHtjbGFzc05hbWU6ImFnZW5kYS1kYXRlLWxhYmVsIn0seihNKSksb2UubGVuZ3RoPT09MCYmUy5sZW5ndGg9PT0wP2koInAiLHtjbGFzc05hbWU6ImFnZW5kYS1lbXB0eS1kYXkifSxNPT09Yz8iTm8gdGFza3Mgc2NoZWR1bGVkIGZvciB0b2RheSI6Ik5vIHRhc2tzIHNjaGVkdWxlZCIpOngubWFwKFI9PlIudHlwZT09PSJ0YXNrIj9pKCJkaXYiLHtrZXk6Ui50YXNrLnV1aWQsY2xhc3NOYW1lOiJhZ2VuZGEtaXRlbSBhZ2VuZGEtdGFzay1yb3ciLG9uQ2xpY2s6Qj0+e0IudGFyZ2V0LmNsb3Nlc3QoImEiKXx8TyhSLnRhc2spfX0saSgiZGl2Iix7Y2xhc3NOYW1lOmBhZ2VuZGEtaW5kaWNhdG9yICR7dihSLnRhc2spfWB9KSxpKCJkaXYiLHtjbGFzc05hbWU6ImFnZW5kYS1jb250ZW50In0saSgic3BhbiIse2NsYXNzTmFtZToiYWdlbmRhLXRpbWUiLHRpdGxlOmAke1IudGFzay5zdGFydEF0PyJTdGFydCI6IkRlYWRsaW5lIn0gdGltZSBmb3IgdGFza2B9LGsoUi50YXNrLnN0YXJ0QXR8fFIudGFzay5kZWFkbGluZSkpLGkoInNwYW4iLHtjbGFzc05hbWU6ImFnZW5kYS10ZXh0IixkYW5nZXJvdXNseVNldElubmVySFRNTDp7X19odG1sOnNpKFIudGFzay5jb250ZW50KXx8IlVudGl0bGVkIHRhc2sifX0pLE4oUi50YXNrKT9pKCJidXR0b24iLHt0eXBlOiJidXR0b24iLGNsYXNzTmFtZToiYWdlbmRhLW5vdGUtbGluayIsb25DbGljazpCPT5UKFIudGFzayxCKX0sRChSLnRhc2spKTpudWxsKSxmKFIudGFzay5lbmRBdCkmJmYoUi50YXNrLnN0YXJ0QXQpJiZmKFIudGFzay5lbmRBdCk+ZihSLnRhc2suc3RhcnRBdCk/aSgic3BhbiIse2NsYXNzTmFtZToiYWdlbmRhLWR1cmF0aW9uIn0sTWF0aC5yb3VuZCgoZihSLnRhc2suZW5kQXQpLWYoUi50YXNrLnN0YXJ0QXQpKS82ZTQpKyJtIik6bnVsbCk6aSgiZGl2Iix7a2V5OmBjYWwtJHtSLmluZGV4fWAsY2xhc3NOYW1lOiJhZ2VuZGEtaXRlbSBhZ2VuZGEtdGFzay1yb3cifSxpKCJkaXYiLHtjbGFzc05hbWU6ImFnZW5kYS1pbmRpY2F0b3IgcHJpb3JpdHktbm9ybWFsIn0pLGkoImRpdiIse2NsYXNzTmFtZToiYWdlbmRhLWNvbnRlbnQifSxSLmV2ZW50LmFsbERheT9pKCJzcGFuIix7Y2xhc3NOYW1lOiJhZ2VuZGEtdGltZSJ9LCJBbGwgZGF5Iik6Ui5ldmVudC5zdGFydD9pKCJzcGFuIix7Y2xhc3NOYW1lOiJhZ2VuZGEtdGltZSJ9LGsoUi5ldmVudC5zdGFydCkpOm51bGwsaSgic3BhbiIse2NsYXNzTmFtZToiYWdlbmRhLXRleHQifSxSLmV2ZW50LnRpdGxlfHwiQ2FsZW5kYXIgZXZlbnQiKSxSLmV2ZW50LmNhbGVuZGFyPy5uYW1lP2koInNwYW4iLHtjbGFzc05hbWU6ImFnZW5kYS1ub3RlLWxpbmsifSxSLmV2ZW50LmNhbGVuZGFyLm5hbWUpOm51bGwpLEUoUi5ldmVudCk/aSgic3BhbiIse2NsYXNzTmFtZToiYWdlbmRhLWR1cmF0aW9uIn0sRShSLmV2ZW50KSsibSIpOm51bGwpKSl9KSkpfXZhciBmbD15ZShtZSgpKTtmdW5jdGlvbiBYZCh7YXBwOmUsY29tcGxldGVkVGFza3NCeURhdGU6dCxjdXJyZW50RGF0ZTpuLGdyaWRIZWlnaHRTaXplOnIsZ3JpZFdpZHRoU2l6ZTpvLG9uRGF0ZVNlbGVjdDphLG9uT3BlblNldHRpbmdzOmksb3BlblRhc2tzOnMsc2VsZWN0ZWREYXRlOmwsd2Vla0Zvcm1hdDp1fSl7bGV0IGM9ZmwuY3JlYXRlRWxlbWVudCxkPW5ldyBEYXRlKG4pLFtwLHldPSgwLGZsLnVzZVN0YXRlKShuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksZC5nZXRNb250aCgpLDEpKSxoPXU9PT0ibW9uZGF5Ij8xOjAsdz1uZXcgRGF0ZShwLmdldEZ1bGxZZWFyKCkscC5nZXRNb250aCgpKzEsMCkuZ2V0RGF0ZSgpLGI9KG5ldyBEYXRlKHAuZ2V0RnVsbFllYXIoKSxwLmdldE1vbnRoKCksMSkuZ2V0RGF5KCktaCs3KSU3LGc9aD09PTE/WyJNbyIsIlR1IiwiV2UiLCJUaCIsIkZyIiwiU2EiLCJTdSJdOlsiU3UiLCJNbyIsIlR1IiwiV2UiLCJUaCIsIkZyIiwiU2EiXSxtPXt9LHY9cC5nZXRGdWxsWWVhcigpLGY9cC5nZXRNb250aCgpLEU9YCR7dn0tJHtTdHJpbmcoZisxKS5wYWRTdGFydCgyLCIwIil9LWA7W3MsdF0uZm9yRWFjaChMPT57T2JqZWN0LmtleXMoTHx8e30pLmZvckVhY2goJD0+e2lmKCQuc3RhcnRzV2l0aChFKSl7bGV0IFc9cGFyc2VJbnQoJC5zdWJzdHJpbmcoOCksMTApO21bV109KG1bV118fDApKyhMWyRdPy5sZW5ndGh8fDApfX0pfSk7bGV0IGs9KCk9PnkobmV3IERhdGUocC5nZXRGdWxsWWVhcigpLHAuZ2V0TW9udGgoKS0xLDEpKSxOPSgpPT55KG5ldyBEYXRlKHAuZ2V0RnVsbFllYXIoKSxwLmdldE1vbnRoKCkrMSwxKSksRD1wLnRvTG9jYWxlU3RyaW5nKCJkZWZhdWx0Iix7bW9udGg6ImxvbmciLHllYXI6Im51bWVyaWMifSksTz1MPT5MPT09ZC5nZXREYXRlKCkmJnAuZ2V0TW9udGgoKT09PWQuZ2V0TW9udGgoKSYmcC5nZXRGdWxsWWVhcigpPT09ZC5nZXRGdWxsWWVhcigpLFQ9TD0+e2xldCAkPXAuZ2V0RnVsbFllYXIoKSxXPVN0cmluZyhwLmdldE1vbnRoKCkrMSkucGFkU3RhcnQoMiwiMCIpLE09U3RyaW5nKEwpLnBhZFN0YXJ0KDIsIjAiKTtyZXR1cm5gJHskfS0ke1d9LSR7TX1gfSx6PUw9PmwmJlQoTCk9PT1sLFA9TD0+e2lmKGEpe2xldCAkPVQoTCk7YSgkPT09bD9udWxsOiQpfX0sQz1bXTtmb3IobGV0IEw9MDtMPGI7TCsrKUMucHVzaChjKCJkaXYiLHtrZXk6ImVtcHR5LSIrTCxjbGFzc05hbWU6ImNhbC1jZWxsIGVtcHR5In0pKTtmb3IobGV0IEw9MTtMPD13O0wrKyl7bGV0ICQ9bVtMXXx8MCxXPSQ9PT0wPyJub25lIjokPD0yPyIjODZlZmFjIjokPD01PyIjZmJiZjI0IjoiI2Y4NzE3MSIsTT0iY2FsLWNlbGwiO08oTCkmJihNKz0iIHRvZGF5IikseihMKSYmKE0rPSIgc2VsZWN0ZWQiKSxDLnB1c2goYygiZGl2Iix7a2V5OkwsY2xhc3NOYW1lOk0sb25DbGljazooKT0+UChMKX0sYygic3BhbiIse2NsYXNzTmFtZToiY2FsLWRheSJ9LEwpLFchPT0ibm9uZSI/Yygic3BhbiIse2NsYXNzTmFtZToiY2FsLWRvdCIsc3R5bGU6e2JhY2tncm91bmRDb2xvcjpXfX0pOm51bGwpKX1yZXR1cm4gYyhmZSx7Y29uZmlndXJhYmxlOiEwLGdyaWRIZWlnaHRTaXplOnIsZ3JpZFdpZHRoU2l6ZTpvLGljb246Ilx1ezFGNEM1fSIsb25Db25maWd1cmU6aSx0aXRsZTpkZSgiY2FsZW5kYXIiKSx3aWRnZXRJZDoiY2FsZW5kYXIifSxjKCJkaXYiLHtjbGFzc05hbWU6ImNhbC1uYXYifSxjKCJidXR0b24iLHtvbkNsaWNrOmssY2xhc3NOYW1lOiJjYWwtYXJyb3cifSwiXHUyNUMwIiksYygic3BhbiIse2NsYXNzTmFtZToiY2FsLW1vbnRoIn0sRCksYygiYnV0dG9uIix7b25DbGljazpOLGNsYXNzTmFtZToiY2FsLWFycm93In0sIlx1MjVCNiIpKSxjKCJkaXYiLHtjbGFzc05hbWU6ImNhbC1ncmlkIn0sZy5tYXAoTD0+YygiZGl2Iix7a2V5OkwsY2xhc3NOYW1lOiJjYWwtaGVhZGVyIn0sTCkpLC4uLkMpKX12YXIgSXQ9eWUobWUoKSk7ZnVuY3Rpb24gcnYoZSl7cmV0dXJuIGJuLmZpbmQodD0+dC53aWRnZXRJZD09PWUpfWZ1bmN0aW9uIEIxKGUpe2xldCB0PWJuLm1hcChhPT5hLndpZGdldElkKSxyPShBcnJheS5pc0FycmF5KGUpP2U6W10pLm1hcChhPT5hLndpZGdldElkKS5maWx0ZXIoYT0+dC5pbmNsdWRlcyhhKSksbz10LmZpbHRlcihhPT4hci5pbmNsdWRlcyhhKSk7cmV0dXJue3JlbmRlcmVkSWRzOnIsaGlkZGVuSWRzOm99fWZ1bmN0aW9uIHR2KGUpe2xldCB0PXt9O3JldHVybiBibi5mb3JFYWNoKHI9Pnt0W3Iud2lkZ2V0SWRdPXtncmlkV2lkdGhTaXplOnIuZGVmYXVsdEdyaWRXaWR0aFNpemV8fDEsZ3JpZEhlaWdodFNpemU6MX19KSwoQXJyYXkuaXNBcnJheShlKT9lOltdKS5mb3JFYWNoKHI9Pnt0W3Iud2lkZ2V0SWRdJiYodFtyLndpZGdldElkXT17Z3JpZFdpZHRoU2l6ZTpyLmdyaWRXaWR0aFNpemV8fHRbci53aWRnZXRJZF0uZ3JpZFdpZHRoU2l6ZSxncmlkSGVpZ2h0U2l6ZTpyLmdyaWRIZWlnaHRTaXplfHwxfSl9KSx0fWZ1bmN0aW9uIFcxKGUsdCxuLHIpe2xldCBvPVsuLi5lLC4uLnRdLGE9by5pbmRleE9mKG4pO2lmKHI9PT0idXAiJiZhPT09MHx8cj09PSJkb3duIiYmYT09PW8ubGVuZ3RoLTEpcmV0dXJuIG51bGw7bGV0IGk9Wy4uLm9dLHM9cj09PSJ1cCI/YS0xOmErMTtyZXR1cm5baVthXSxpW3NdXT1baVtzXSxpW2FdXSx7cmVuZGVyZWRJZHM6aS5zbGljZSgwLGUubGVuZ3RoKSxoaWRkZW5JZHM6aS5zbGljZShlLmxlbmd0aCl9fWZ1bmN0aW9uIEgxKGUsdCxuLHIpe2xldCBvPWUuZmlsdGVyKGk9PmkhPT1uKSxhPXQuZmlsdGVyKGk9PmkhPT1uKTtyZXR1cm4gZS5pbmNsdWRlcyhyKT9vLnNwbGljZShvLmluZGV4T2YociksMCxuKTphLnNwbGljZShhLmluZGV4T2YociksMCxuKSx7cmVuZGVyZWRJZHM6byxoaWRkZW5JZHM6YX19ZnVuY3Rpb24gajEoZSx0LG4scil7bGV0IG89ZS5maWx0ZXIoaT0+aSE9PW4pLGE9dC5maWx0ZXIoaT0+aSE9PW4pO3JldHVybihyPT09InJlbmRlcmVkIj9vOmEpLnB1c2gobikse3JlbmRlcmVkSWRzOm8saGlkZGVuSWRzOmF9fWZ1bmN0aW9uIFYxKGUsdCxuKXtsZXQgcj1ydih0KTtpZighcilyZXR1cm4gbnVsbDtsZXQgbz1bLi4ubi5yZW5kZXJlZElkcywuLi5uLmhpZGRlbklkc10sYT1vLmluZGV4T2YodCk7cmV0dXJuIGUoImRpdiIse2tleTp0LGNsYXNzTmFtZTpbImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtaXRlbSIsbi5kcmFnZ2luZ0lkPT09dD8iZGFzaGJvYXJkLWxheW91dC1wb3B1cC1pdGVtLS1kcmFnZ2luZyI6IiIsbi5kcmFnT3ZlcklkPT09dD8iZGFzaGJvYXJkLWxheW91dC1wb3B1cC1pdGVtLS1kcmFnLW92ZXIiOiIiXS5maWx0ZXIoQm9vbGVhbikuam9pbigiICIpLGRyYWdnYWJsZTohMCxvbkRyYWdTdGFydDppPT5uLm9uRHJhZ1N0YXJ0KGksdCksb25EcmFnRW5kOm4ub25EcmFnRW5kLG9uRHJhZ092ZXI6aT0+bi5vbkRyYWdPdmVySXRlbShpLHQpLG9uRHJvcDppPT5uLm9uRHJvcE9uSXRlbShpLHQpfSxlKCJzcGFuIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLWl0ZW0taGFuZGxlIiwiYXJpYS1oaWRkZW4iOiJ0cnVlIn0sIlx1MjgzRiIpLGUoInNwYW4iLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtaXRlbS1pY29uIiwiYXJpYS1oaWRkZW4iOiJ0cnVlIn0sci5pY29uKSxlKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtaXRlbS1pbmZvIn0sZSgic3BhbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1pdGVtLW5hbWUifSxyLm5hbWUpLHIuZGVzY3JpcHRpb24mJmUoInNwYW4iLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtaXRlbS1kZXNjcmlwdGlvbiJ9LHIuZGVzY3JpcHRpb24pKSxlKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtaXRlbS1hY3Rpb25zIn0sZSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLWFycm93LWJ1dHRvbiIsdHlwZToiYnV0dG9uIixkaXNhYmxlZDphPT09MCx0aXRsZToiTW92ZSB1cCIsImFyaWEtbGFiZWwiOmBNb3ZlICR7ci5uYW1lfSB1cGAsb25DbGljazppPT57aS5zdG9wUHJvcGFnYXRpb24oKSxuLm9uTW92ZSh0LCJ1cCIpfX0sIlx1MjE5MSIpLGUoImJ1dHRvbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1hcnJvdy1idXR0b24iLHR5cGU6ImJ1dHRvbiIsZGlzYWJsZWQ6YT09PW8ubGVuZ3RoLTEsdGl0bGU6Ik1vdmUgZG93biIsImFyaWEtbGFiZWwiOmBNb3ZlICR7ci5uYW1lfSBkb3duYCxvbkNsaWNrOmk9PntpLnN0b3BQcm9wYWdhdGlvbigpLG4ub25Nb3ZlKHQsImRvd24iKX19LCJcdTIxOTMiKSkpfWZ1bmN0aW9uIG52KGUsdCxuLHIsbyxhKXtyZXR1cm4gZSgiZGl2Iix7Y2xhc3NOYW1lOlsiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1zZWN0aW9uIixhLmRyYWdPdmVyU2VjdGlvbj09PXQ/ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtc2VjdGlvbi0tZHJhZy1vdmVyIjoiIl0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oIiAiKSxvbkRyYWdPdmVyOmk9PmEub25EcmFnT3ZlclNlY3Rpb24oaSx0KSxvbkRyYWdMZWF2ZTphLm9uRHJhZ0xlYXZlU2VjdGlvbixvbkRyb3A6aT0+YS5vbkRyb3BPblNlY3Rpb24oaSx0KX0sZSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXNlY3Rpb24taGVhZGVyIn0sZSgic3BhbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1zZWN0aW9uLWljb24iLCJhcmlhLWhpZGRlbiI6InRydWUifSxyKSxlKCJoNCIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1zZWN0aW9uLXRpdGxlIn0sbikpLG8ubGVuZ3RoPT09MD9lKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtZW1wdHkifSx0PT09InJlbmRlcmVkIj8iRHJhZyBjb21wb25lbnRzIGhlcmUgdG8gc2hvdyB0aGVtIG9uIHRoZSBkYXNoYm9hcmQiOiJBbGwgY29tcG9uZW50cyBhcmUgY3VycmVudGx5IHNob3duIik6ZSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLWxpc3QifSwuLi5vLm1hcChpPT5WMShlLGksYSkpKSl9ZnVuY3Rpb24gRzEoZSx0LG4scil7bGV0IG89cnYodCk7aWYoIW8pcmV0dXJuIG51bGw7bGV0IGE9blt0XT8uZ3JpZFdpZHRoU2l6ZT8/by5kZWZhdWx0R3JpZFdpZHRoU2l6ZT8/MSxpPW5bdF0/LmdyaWRIZWlnaHRTaXplPz8xLHM9by5tYXhIb3Jpem9udGFsVGlsZXN8fDQsbD1vLm1heFZlcnRpY2FsVGlsZXN8fDI7cmV0dXJuIGUoImRpdiIse2tleTp0LGNsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1zaXppbmctaXRlbSJ9LGUoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1zaXppbmctaXRlbS1oZWFkZXIifSxlKCJzcGFuIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLWl0ZW0taWNvbiIsImFyaWEtaGlkZGVuIjoidHJ1ZSJ9LG8uaWNvbiksZSgic3BhbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1pdGVtLW5hbWUifSxvLm5hbWUpKSxlKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtc2l6aW5nLWl0ZW0tY29udHJvbHMifSxlKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtc2l6aW5nLWZpZWxkIn0sZSgibGFiZWwiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtc2l6aW5nLWxhYmVsIn0sIldpZHRoIiksZSgic2VsZWN0Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXNpemluZy1zZWxlY3QiLHZhbHVlOmEsb25DaGFuZ2U6dT0+cih0LCJncmlkV2lkdGhTaXplIixOdW1iZXIodS50YXJnZXQudmFsdWUpKX0sLi4uQXJyYXkuZnJvbSh7bGVuZ3RoOnN9LCh1LGMpPT5lKCJvcHRpb24iLHtrZXk6YysxLHZhbHVlOmMrMX0sYCR7YysxfWApKSkpLGUoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1zaXppbmctZmllbGQifSxlKCJsYWJlbCIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1zaXppbmctbGFiZWwifSwiVmVydGljYWwgdGlsZXMiKSxlKCJzZWxlY3QiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtc2l6aW5nLXNlbGVjdCIsdmFsdWU6aSxvbkNoYW5nZTp1PT5yKHQsImdyaWRIZWlnaHRTaXplIixOdW1iZXIodS50YXJnZXQudmFsdWUpKX0sLi4uQXJyYXkuZnJvbSh7bGVuZ3RoOmx9LCh1LGMpPT5lKCJvcHRpb24iLHtrZXk6YysxLHZhbHVlOmMrMX0sYCR7YysxfWApKSkpKSl9ZnVuY3Rpb24gSzEoZSl7bGV0e3JlbmRlcmVkSWRzOnQsaGlkZGVuSWRzOm59PUIxKGUpLFtyLG9dPSgwLEl0LnVzZVN0YXRlKSh0KSxbYSxpXT0oMCxJdC51c2VTdGF0ZSkobiksW3MsbF09KDAsSXQudXNlU3RhdGUpKCgpPT50dihlKSksW3UsY109KDAsSXQudXNlU3RhdGUpKG51bGwpLFtkLHBdPSgwLEl0LnVzZVN0YXRlKShudWxsKSxbeSxoXT0oMCxJdC51c2VTdGF0ZSkobnVsbCksdz0oMCxJdC51c2VSZWYpKG51bGwpLFtiLGddPSgwLEl0LnVzZVN0YXRlKSghMSksbT0oKT0+e3cuY3VycmVudD1udWxsLGMobnVsbCkscChudWxsKSxoKG51bGwpfTtyZXR1cm57cmVuZGVyZWRJZHM6cixoaWRkZW5JZHM6YSxzaXppbmc6cyxkcmFnZ2luZ0lkOnUsZHJhZ092ZXJJZDpkLGRyYWdPdmVyU2VjdGlvbjp5LGhhc1Jlc2V0OmIsb25Nb3ZlOihDLEwpPT57bGV0ICQ9VzEocixhLEMsTCk7JCYmKG8oJC5yZW5kZXJlZElkcyksaSgkLmhpZGRlbklkcykpfSxvbkRyYWdTdGFydDooQyxMKT0+e3cuY3VycmVudD1MLEMuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQ9Im1vdmUiLHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+YyhMKSl9LG9uRHJhZ0VuZDooKT0+bSgpLG9uRHJhZ092ZXJJdGVtOihDLEwpPT57Qy5wcmV2ZW50RGVmYXVsdCgpLEMuc3RvcFByb3BhZ2F0aW9uKCksQy5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdD0ibW92ZSIscChMKSxoKG51bGwpfSxvbkRyYWdPdmVyU2VjdGlvbjooQyxMKT0+e0MucHJldmVudERlZmF1bHQoKSxDLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0PSJtb3ZlIixoKEwpLHAobnVsbCl9LG9uRHJhZ0xlYXZlU2VjdGlvbjpDPT57Qy5jdXJyZW50VGFyZ2V0LmNvbnRhaW5zKEMucmVsYXRlZFRhcmdldCl8fGgobnVsbCl9LG9uRHJvcE9uSXRlbTooQyxMKT0+e0MucHJldmVudERlZmF1bHQoKSxDLnN0b3BQcm9wYWdhdGlvbigpO2xldCAkPXcuY3VycmVudDtpZihtKCksISR8fCQ9PT1MKXJldHVybjtsZXR7cmVuZGVyZWRJZHM6VyxoaWRkZW5JZHM6TX09SDEocixhLCQsTCk7byhXKSxpKE0pfSxvbkRyb3BPblNlY3Rpb246KEMsTCk9PntDLnByZXZlbnREZWZhdWx0KCk7bGV0ICQ9dy5jdXJyZW50O2lmKG0oKSwhJClyZXR1cm47bGV0e3JlbmRlcmVkSWRzOlcsaGlkZGVuSWRzOk19PWoxKHIsYSwkLEwpO28oVyksaShNKX0sb25TaXppbmdDaGFuZ2U6KEMsTCwkKT0+e2woVz0+KHsuLi5XLFtDXTp7Li4uV1tDXSxbTF06JH19KSl9LG9uUmVzZXQ6KCk9PntvKGJuLm1hcChDPT5DLndpZGdldElkKSksaShbXSksZyghMCksbCh0dihudWxsKSl9fX1mdW5jdGlvbiBaZCh7Y3VycmVudExheW91dDplLG9uU2F2ZTp0LG9uQ2FuY2VsOm59KXtsZXQgcj1JdC5jcmVhdGVFbGVtZW50LFtvLGFdPSgwLEl0LnVzZVN0YXRlKSgiY29tcG9uZW50cyIpLGk9SzEoZSkse3JlbmRlcmVkSWRzOnMsaGlkZGVuSWRzOmwsc2l6aW5nOnUsaGFzUmVzZXQ6YyxvblJlc2V0OmQsb25TaXppbmdDaGFuZ2U6cH09aSx5PW89PT0iY29tcG9uZW50cyI/W252KHIsInJlbmRlcmVkIiwiUmVuZGVyZWQgRGFzaGJvYXJkIEVsZW1lbnRzIiwiXHV7MUY0NDF9IixzLGkpLG52KHIsImhpZGRlbiIsIkhpZGRlbiBEYXNoYm9hcmQgRWxlbWVudHMiLCJcdXsxRjZBQn0iLGwsaSldOltzLmxlbmd0aD09PTA/cigiZGl2Iix7a2V5OiJlbXB0eSIsY2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLWVtcHR5In0sIk5vIHJlbmRlcmVkIGNvbXBvbmVudHMuIEFkZCBjb21wb25lbnRzIGluIHRoZSBDb21wb25lbnRzIHRhYi4iKTpyKCJkaXYiLHtrZXk6InNpemluZy1saXN0IixjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtc2l6aW5nIn0sLi4ucy5tYXAoaD0+RzEocixoLHUscCkpKV07cmV0dXJuIHIoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLXBvcHVwLW92ZXJsYXkiLG9uQ2xpY2s6aD0+aC50YXJnZXQ9PT1oLmN1cnJlbnRUYXJnZXQmJm4oKX0scigiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtY29udGFpbmVyIGRhc2hib2FyZC1sYXlvdXQtcG9wdXAifSxyKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1wb3B1cC1oZWFkZXIifSxyKCJoMyIse2NsYXNzTmFtZToiY29uZmlnLXBvcHVwLXRpdGxlIn0sIlx1MjY5OVx1RkUwRiBEYXNoYm9hcmQgTGF5b3V0IikscigiZGl2Iix7Y2xhc3NOYW1lOiJleHBsYW5hdGlvbi1wYXJhZ3JhcGgifSwiQ3VzdG9taXplIHRoZSBvcmRlciBvZiB5b3VyIHdpZGdldHMgYnkgZHJhZ2dpbmcgb3Igc2l6aW5nIHRoZW0gaW4gdGhpcyBtZW51LiBZb3UgY2FuIGFsc28gcmVvcmRlciB3aWRnZXRzIG91dHNpZGUgdGhpcyBtZW51IGJ5IGNsaWNraW5nIG9uIHRoZWlyIGhlYWRlciBmb3IgMiBzZWNvbmRzIHRvIGVuZ2FnZSBkcmFnIHJlb3JkZXJpbmcuIikscigiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXRhYnMifSxyKCJidXR0b24iLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtdGFiIisobz09PSJjb21wb25lbnRzIj8iIGFjdGl2ZSI6IiIpLHR5cGU6ImJ1dHRvbiIsb25DbGljazooKT0+YSgiY29tcG9uZW50cyIpfSwiQ29tcG9uZW50cyIpLHIoImJ1dHRvbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC10YWIiKyhvPT09InNpemluZyI/IiBhY3RpdmUiOiIiKSx0eXBlOiJidXR0b24iLG9uQ2xpY2s6KCk9PmEoInNpemluZyIpfSwiU2l6aW5nIikpKSxyKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1wb3B1cC1ib2R5IGRhc2hib2FyZC1sYXlvdXQtcG9wdXAtYm9keSJ9LC4uLnkpLHIoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLXBvcHVwLWFjdGlvbnMifSxyKCJidXR0b24iLHtjbGFzc05hbWU6ImNvbmZpZy1wb3B1cC1saW5rIix0eXBlOiJidXR0b24iLG9uQ2xpY2s6ZH0sIlJlc2V0IHRvIGRlZmF1bHRzIikscigiYnV0dG9uIix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtYnRuIGNvbmZpZy1wb3B1cC1idG4tLWNhbmNlbCIsdHlwZToiYnV0dG9uIixvbkNsaWNrOm59LCJDYW5jZWwiKSxyKCJidXR0b24iLHtjbGFzc05hbWU6ImNvbmZpZy1wb3B1cC1idG4gY29uZmlnLXBvcHVwLWJ0bi0tc3VibWl0Iix0eXBlOiJidXR0b24iLG9uQ2xpY2s6KCk9PnQocyx7aXNSZXNldDpjLHNpemluZzp1fSl9LCJTYXZlIExheW91dCIpKSkpfXZhciBvdj0iTWlzc2lvbiBDb250cm9sIERhc2hib2FyZDogcGx1Z2luIHNldHRpbmdzIjtmdW5jdGlvbiBhdigpe3RyeXtsZXR7aG91ckN5Y2xlOmV9PW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHZvaWQgMCx7aG91cjoibnVtZXJpYyJ9KS5yZXNvbHZlZE9wdGlvbnMoKTtyZXR1cm4gZT09PSJoMjMifHxlPT09ImgyNCI/IjI0aCI6Im1lcmlkaWFuIn1jYXRjaHtyZXR1cm4ibWVyaWRpYW4ifX1mdW5jdGlvbiBpdigpe3RyeXtsZXQgZT1uZXcgSW50bC5Mb2NhbGUobmF2aWdhdG9yLmxhbmd1YWdlKSx0PWUud2Vla0luZm98fGUuZ2V0V2Vla0luZm8/LigpO3JldHVybiB0Py5maXJzdERheT09PTd8fHQ/LmZpcnN0RGF5PT09MD8ic3VuZGF5IjoibW9uZGF5In1jYXRjaHtyZXR1cm4ibW9uZGF5In19ZnVuY3Rpb24gWTEoZSl7bGV0IHQ9e307aWYoIWUpcmV0dXJuIHQ7Zm9yKGxldCBuIG9mIGUuc3BsaXQoYApgKSl7bGV0IHI9bi5tYXRjaCgvXihbXjpdKyk6XHMqKC4rKS8pO2lmKCFyKWNvbnRpbnVlO2xldCBvPXJbMV0udHJpbSgpLnRvTG93ZXJDYXNlKCksYT1yWzJdLnRyaW0oKS50b0xvd2VyQ2FzZSgpO289PT0idGltZSBmb3JtYXQiJiYodC50aW1lRm9ybWF0PWEpLG89PT0id2VlayBmb3JtYXQiJiYodC53ZWVrRm9ybWF0PWEpfXJldHVybiB0fWZ1bmN0aW9uIHN2KGUpe2xldCB0PVtdO3JldHVybiBlLnRpbWVGb3JtYXQmJnQucHVzaChgVGltZSBmb3JtYXQ6ICR7ZS50aW1lRm9ybWF0fWApLGUud2Vla0Zvcm1hdCYmdC5wdXNoKGBXZWVrIGZvcm1hdDogJHtlLndlZWtGb3JtYXR9YCksdC5qb2luKGAKYCl9dmFyIGxpPWNsYXNze2NvbnN0cnVjdG9yKHQpe3RoaXMuX2FwcD10LHRoaXMuX25vdGVVVUlEPW51bGwsdGhpcy5fc2V0dGluZ3M9bnVsbH1hc3luYyBsb2FkKCl7bGV0IHQ9YXdhaXQgdGhpcy5fYXBwLmZpbmROb3RlKHtuYW1lOm92LHRhZ3M6W1hlXX0pO2lmKHQ/LnV1aWQpe3RoaXMuX25vdGVVVUlEPXQudXVpZDtsZXQgcj1hd2FpdCB0aGlzLl9hcHAuZ2V0Tm90ZUNvbnRlbnQoe3V1aWQ6dC51dWlkfSk7cmV0dXJuIHRoaXMuX3NldHRpbmdzPVkxKHIpLHRoaXMuX3NldHRpbmdzLnRpbWVGb3JtYXR8fCh0aGlzLl9zZXR0aW5ncy50aW1lRm9ybWF0PWF2KCkpLHRoaXMuX3NldHRpbmdzLndlZWtGb3JtYXR8fCh0aGlzLl9zZXR0aW5ncy53ZWVrRm9ybWF0PWl2KCkpLF8oIltEYXNoYm9hcmRTZXR0aW5nTm90ZV0gbG9hZGVkIHNldHRpbmdzOiIsdGhpcy5fc2V0dGluZ3MpLHsuLi50aGlzLl9zZXR0aW5nc319dGhpcy5fc2V0dGluZ3M9e3RpbWVGb3JtYXQ6YXYoKSx3ZWVrRm9ybWF0Oml2KCl9O2xldCBuPWF3YWl0IHRoaXMuX2FwcC5jcmVhdGVOb3RlKG92LFtYZV0se2FyY2hpdmU6ITB9KTtyZXR1cm4gdGhpcy5fbm90ZVVVSUQ9dHlwZW9mIG49PSJvYmplY3QiP24udXVpZDpuLGF3YWl0IHRoaXMuX2FwcC5yZXBsYWNlTm90ZUNvbnRlbnQoe3V1aWQ6dGhpcy5fbm90ZVVVSUR9LHN2KHRoaXMuX3NldHRpbmdzKSksXygiW0Rhc2hib2FyZFNldHRpbmdOb3RlXSBjcmVhdGVkIHNldHRpbmdzIG5vdGU6Iix0aGlzLl9ub3RlVVVJRCksey4uLnRoaXMuX3NldHRpbmdzfX1hc3luYyBzYXZlKHQpe2lmKHRoaXMuX3NldHRpbmdzPXsuLi50aGlzLl9zZXR0aW5ncywuLi50fSwhdGhpcy5fbm90ZVVVSUQpe18oIltEYXNoYm9hcmRTZXR0aW5nTm90ZV0gbm8gbm90ZVVVSUQ7IGNhbm5vdCBzYXZlIik7cmV0dXJufWF3YWl0IHRoaXMuX2FwcC5yZXBsYWNlTm90ZUNvbnRlbnQoe3V1aWQ6dGhpcy5fbm90ZVVVSUR9LHN2KHRoaXMuX3NldHRpbmdzKSksXygiW0Rhc2hib2FyZFNldHRpbmdOb3RlXSBzYXZlZCBzZXR0aW5nczoiLHRoaXMuX3NldHRpbmdzKX1nZXQgc2V0dGluZ3MoKXtyZXR1cm4gdGhpcy5fc2V0dGluZ3M/ey4uLnRoaXMuX3NldHRpbmdzfTpudWxsfX07dmFyIEtvPXllKG1lKCkpO2Z1bmN0aW9uIFhyKHt0aXRsZTplLG9uU3VibWl0OnQsb25DYW5jZWw6bixzdWJtaXRMYWJlbDpyPSJTdWJtaXQiLGNoaWxkcmVuOm8sc2Nyb2xsVG9wOmF9KXtsZXQgaT1Lby5jcmVhdGVFbGVtZW50LHM9KDAsS28udXNlUmVmKShudWxsKTtyZXR1cm4oMCxLby51c2VFZmZlY3QpKCgpPT57aWYoYT09PXZvaWQgMClyZXR1cm47bGV0IHU9Yz0+e3MuY3VycmVudCYmIXMuY3VycmVudC5jb250YWlucyhjLnRhcmdldCkmJm4oKX07cmV0dXJuIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdSksKCk9PmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdSl9LFthLG5dKSxpKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1wb3B1cC1vdmVybGF5IixzdHlsZTphIT09dm9pZCAwP3twb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDphLGxlZnQ6MCxyaWdodDowLG1pbkhlaWdodDoiMTAwdmgiLHBvaW50ZXJFdmVudHM6Im5vbmUiLGFsaWduSXRlbXM6ImZsZXgtc3RhcnQiLHBhZGRpbmc6IjE2cHgifTp2b2lkIDAsb25DbGljazphPT09dm9pZCAwP3U9Pnt1LnRhcmdldD09PXUuY3VycmVudFRhcmdldCYmbigpfTp2b2lkIDB9LGkoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLXBvcHVwLWNvbnRhaW5lciIscmVmOnMsc3R5bGU6YSE9PXZvaWQgMD97cG9pbnRlckV2ZW50czoiYXV0byJ9OnZvaWQgMH0sZT9pKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1wb3B1cC1oZWFkZXIifSxpKCJoMyIse2NsYXNzTmFtZToiY29uZmlnLXBvcHVwLXRpdGxlIn0sZSkpOm51bGwsaSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtYm9keSJ9LG8pLGkoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLXBvcHVwLWFjdGlvbnMifSxpKCJidXR0b24iLHtjbGFzc05hbWU6ImNvbmZpZy1wb3B1cC1idG4gY29uZmlnLXBvcHVwLWJ0bi0tY2FuY2VsIixvbkNsaWNrOm59LCJDYW5jZWwiKSxpKCJidXR0b24iLHtjbGFzc05hbWU6ImNvbmZpZy1wb3B1cC1idG4gY29uZmlnLXBvcHVwLWJ0bi0tc3VibWl0IixvbkNsaWNrOnR9LHIpKSkpfXZhciBxMT01MCoxMDI0KjQ7dmFyIGx2PXthbnRocm9waWM6Imh0dHBzOi8vY29uc29sZS5hbnRocm9waWMuY29tL3NldHRpbmdzL2tleXMiLCJhbnRocm9waWMtc29ubmV0IjoiaHR0cHM6Ly9jb25zb2xlLmFudGhyb3BpYy5jb20vc2V0dGluZ3Mva2V5cyIsZGVlcHNlZWs6Imh0dHBzOi8vcGxhdGZvcm0uZGVlcHNlZWsuY29tL2FwaV9rZXlzIixnZW1pbmk6Imh0dHBzOi8vYWlzdHVkaW8uZ29vZ2xlLmNvbS9hcHAvYXBpLWtleXMiLGdyb2s6Imh0dHBzOi8vY29uc29sZS54LmFpL3RlYW0vZGVmYXVsdC9hcGkta2V5cyIsb3BlbmFpOiJodHRwczovL3BsYXRmb3JtLm9wZW5haS5jb20vYXBpLWtleXMiLHBlcnBsZXhpdHk6Imh0dHBzOi8vd3d3LnBlcnBsZXhpdHkuYWkvYWNjb3VudC9hcGkva2V5cyJ9LFpyPXthbnRocm9waWM6ImNsYXVkZS1vcHVzLTQtNiIsImFudGhyb3BpYy1zb25uZXQiOiJjbGF1ZGUtc29ubmV0LTQtNiIsZGVlcHNlZWs6ImRlZXBzZWVrLWNoYXQiLGdlbWluaToiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsZ3JvazoiZ3Jvay00LjIwIixvcGVuYWk6ImdwdC01LjQiLHBlcnBsZXhpdHk6InNvbmFyLXBybyJ9O3ZhciBlcD17YW50aHJvcGljOiJodHRwczovL2FwaS5hbnRocm9waWMuY29tL3YxL21lc3NhZ2VzIiwiYW50aHJvcGljLXNvbm5ldCI6Imh0dHBzOi8vYXBpLmFudGhyb3BpYy5jb20vdjEvbWVzc2FnZXMiLGRlZXBzZWVrOiJodHRwczovL2FwaS5kZWVwc2Vlay5jb20vdjEvY2hhdC9jb21wbGV0aW9ucyIsZ2VtaW5pOiJodHRwczovL2dlbmVyYXRpdmVsYW5ndWFnZS5nb29nbGVhcGlzLmNvbS92MWJldGEvbW9kZWxzL3ttb2RlbC1uYW1lfTpnZW5lcmF0ZUNvbnRlbnQiLGdyb2s6Imh0dHBzOi8vYXBpLnguYWkvdjEvY2hhdC9jb21wbGV0aW9ucyIsb3BlbmFpOiJodHRwczovL2FwaS5vcGVuYWkuY29tL3YxL2NoYXQvY29tcGxldGlvbnMiLHBlcnBsZXhpdHk6Imh0dHBzOi8vYXBpLnBlcnBsZXhpdHkuYWkvY2hhdC9jb21wbGV0aW9ucyJ9LEJNPU9iamVjdC5rZXlzKGVwKSx1dj17ImNsYXVkZS1vcHVzLTQtNiI6MjAwKjEwMjQqNCwiY2xhdWRlLXNvbm5ldC00LTYiOjIwMCoxMDI0KjQsImNsYXVkZS1zb25uZXQtNC01IjoyMDAqMTAyNCo0LCJjbGF1ZGUtc29ubmV0LTQtNS0yMDI1MDkyOSI6MjAwKjEwMjQqNCwiY2xhdWRlLWhhaWt1LTQtNSI6MjAwKjEwMjQqNCwiY2xhdWRlLWhhaWt1LTQtNS0yMDI1MTAwMSI6MjAwKjEwMjQqNCwiY2xhdWRlLW9wdXMtNC01IjoyMDAqMTAyNCo0LCJjbGF1ZGUtb3B1cy00LTUtMjAyNTExMDEiOjIwMCoxMDI0KjQsImNsYXVkZS1vcHVzLTQtMSI6MjAwKjEwMjQqNCwiY2xhdWRlLW9wdXMtNC0xLTIwMjUwODA1IjoyMDAqMTAyNCo0LCJjbGF1ZGUtc29ubmV0LTQtMCI6MjAwKjEwMjQqNCwiY2xhdWRlLXNvbm5ldC00LTIwMjUwNTE0IjoyMDAqMTAyNCo0LCJjbGF1ZGUtMy03LXNvbm5ldC1sYXRlc3QiOjIwMCoxMDI0KjQsImNsYXVkZS0zLTctc29ubmV0LTIwMjUwMjE5IjoyMDAqMTAyNCo0LCJjbGF1ZGUtb3B1cy00LTAiOjIwMCoxMDI0KjQsImNsYXVkZS1vcHVzLTQtMjAyNTA1MTQiOjIwMCoxMDI0KjQsImNsYXVkZS0zLTUtaGFpa3UtbGF0ZXN0IjoyMDAqMTAyNCo0LCJjbGF1ZGUtMy01LWhhaWt1LTIwMjQxMDIyIjoyMDAqMTAyNCo0LCJjbGF1ZGUtMy01LXNvbm5ldC1sYXRlc3QiOjIwMCoxMDI0KjQsImNsYXVkZS0zLWhhaWt1LTIwMjQwMzA3IjoyMDAqMTAyNCo0fSxjdj17ImRlZXBzZWVrLWNoYXQiOjY0KjEwMjQqNCwiZGVlcHNlZWstcmVhc29uZXIiOjY0KjEwMjQqNCwiZGVlcHNlZWstcjEiOjY0KjEwMjQqNCwiZGVlcHNlZWstcjEtMDUyOCI6NjQqMTAyNCo0fSxkdj17ImdlbWluaS0zLWZsYXNoIjo2NCoxMDI0KjQsImdlbWluaS0zLWZsYXNoLXByZXZpZXciOjY0KjEwMjQqNCwiZ2VtaW5pLTMtcHJvIjoxMDI0KjEwMjQqNCwiZ2VtaW5pLTMtcHJvLXByZXZpZXciOjEwMjQqMTAyNCo0LCJnZW1pbmktMy4xLXByby1wcmV2aWV3IjoxMDI0KjEwMjQqNCwiZ2VtaW5pLTMtcHJvLWltYWdlLXByZXZpZXciOjY0KjEwMjQqNCwiZ2VtaW5pLTIuNS1wcm8iOjEwMjQqMTAyNCo0LCJnZW1pbmktMi41LWZsYXNoIjoxMDI0KjEwMjQqNCwiZ2VtaW5pLTIuNS1mbGFzaC1saXRlIjoxMDI0KjEwMjQqNCwiZ2VtaW5pLTIuNS1mbGFzaC1saXRlLXByZXZpZXctMDYtMTciOjEwMjQqMTAyNCo0LCJnZW1pbmktMi4wLWZsYXNoIjoxMDI0KjEwMjQqNCwiZ2VtaW5pLTIuMC1mbGFzaC1saXRlIjoxMDI0KjEwMjQqNH0scHY9eyJncm9rLTQtMS1mYXN0IjoyMDQ4KjEwMjQqNCwiZ3Jvay00LWZhc3QiOjIwNDgqMTAyNCo0LCJncm9rLTQiOjI1NioxMDI0KjQsImdyb2stNC4yMCI6MjU2KjEwMjQqNCwiZ3Jvay00LTA3MDkiOjI1NioxMDI0KjQsImdyb2stMyI6MTI4KjEwMjQqNCwiZ3Jvay0zLWJldGEiOjEyOCoxMDI0KjQsImdyb2stMy1taW5pIjoxMjgqMTAyNCo0LCJncm9rLTMtbWluaS1iZXRhIjoxMjgqMTAyNCo0LCJncm9rLTItdmlzaW9uLTEyMTIiOjgqMTAyNCo0LCJncm9rLTItaW1hZ2UtMTIxMiI6MTI4KjEwMjQqNCwiZ3Jvay0yLTEyMTIiOjEyOCoxMDI0KjR9LGZ2PXsiZ3B0LTUuNCI6NDAwKjEwMjQqNCwiZ3B0LTUuMiI6NDAwKjEwMjQqNCwiZ3B0LTUuMSI6NDAwKjEwMjQqNCwiZ3B0LTUuMS1jb2RleC1tYXgiOjQwMCoxMDI0KjQsImdwdC01Ijo0MDAqMTAyNCo0LCJncHQtNS1mYXN0Ijo0MDAqMTAyNCo0LCJncHQtNS10aGlua2luZyI6NDAwKjEwMjQqNCwiZ3B0LTQuMSI6MWUzKjEwMjQqNCwiZ3B0LTQuMS1taW5pIjoxMjgqMTAyNCo0LCJncHQtNG8iOjEyOCoxMDI0KjQsImdwdC00by1taW5pIjoxMjgqMTAyNCo0LG8zOjIwMCoxMDI0KjQsIm8zLW1pbmkiOjIwMCoxMDI0KjQsIm8zLXBybyI6MjAwKjEwMjQqNCwibzQtbWluaSI6MjAwKjEwMjQqNCwiZ3B0LTQiOjgqMTAyNCo0LCJncHQtNC0xMTA2LXByZXZpZXciOjEyOCoxMDI0KjQsImdwdC00LTMyayI6MzIqMTAyNCo0LCJncHQtNC0zMmstMDYxMyI6MzIqMTAyNCo0LCJncHQtNC12aXNpb24tcHJldmlldyI6MTI4KjEwMjQqNH0sV009eyJzb25hci1wcm8iOjIwMCoxMDI0KjQsc29uYXI6MTI4KjEwMjQqNCwic29uYXItcmVhc29uaW5nLXBybyI6MTI4KjEwMjQqNCwic29uYXItcmVhc29uaW5nIjoxMjgqMTAyNCo0LCJzb25hci1kZWVwLXJlc2VhcmNoIjoxMjgqMTAyNCo0fSxRMT17Li4udXYsLi4uY3YsLi4uZHYsLi4ucHYsLi4uZnZ9LHRwPXthbnRocm9waWM6T2JqZWN0LmtleXModXYpLGRlZXBzZWVrOk9iamVjdC5rZXlzKGN2KSxnZW1pbmk6T2JqZWN0LmtleXMoZHYpLGdyb2s6T2JqZWN0LmtleXMocHYpLG9wZW5haTpPYmplY3Qua2V5cyhmdil9O3ZhciBFdD15ZShtZSgpKTtmdW5jdGlvbiBKMShlKXtyZXR1cm4gbmV3IFByb21pc2UoKHQsbik9PntsZXQgcj1uZXcgRmlsZVJlYWRlcjtyLm9ubG9hZD1vPT50KG8udGFyZ2V0LnJlc3VsdCksci5vbmVycm9yPW89PntyLmFib3J0KCksbihvLnRhcmdldC5lcnJvcil9LHIucmVhZEFzRGF0YVVSTChlKX0pfWZ1bmN0aW9uIG5wKHthcHA6ZSxwbHVnaW5Ob3RlVVVJRDp0LGluaXRpYWxJbWFnZVVybDpuPSIiLGluaXRpYWxNb2RlOnI9ImNvdmVyIn09e30pe2xldFtvLGFdPSgwLEV0LnVzZVN0YXRlKShuKSxbaSxzXT0oMCxFdC51c2VTdGF0ZSkociksW2wsdV09KDAsRXQudXNlU3RhdGUpKCExKSxbYyxkXT0oMCxFdC51c2VTdGF0ZSkoITEpLHA9KDAsRXQudXNlUmVmKShudWxsKSx5PSgwLEV0LnVzZUNhbGxiYWNrKShhc3luYyB2PT57aWYoIXZ8fCF2LnR5cGUuc3RhcnRzV2l0aCgiaW1hZ2UvIikpe18oIltiZy11cGxvYWRdIHJlamVjdGVkIGZpbGUgKG5vdCBhbiBpbWFnZSBvciBtaXNzaW5nKToiLHY/LnR5cGUpO3JldHVybn1fKCJbYmctdXBsb2FkXSBzdGFydGluZyB1cGxvYWQgZm9yOiIsdi5uYW1lLHYudHlwZSx2LnNpemUsImJ5dGVzIiksdSghMCk7dHJ5e2xldCBmPWF3YWl0IEoxKHYpO18oIltiZy11cGxvYWRdIGZpbGUgY29udmVydGVkIHRvIGRhdGEgVVJMLCBsZW5ndGg6IixmLmxlbmd0aCk7bGV0IEU9YXdhaXQgZS5hdHRhY2hOb3RlTWVkaWEoe3V1aWQ6dH0sZik7XygiW2JnLXVwbG9hZF0gYXR0YWNoTm90ZU1lZGlhIHJldHVybmVkIFVSTDoiLEUpLEU/YShFKTpfKCJbYmctdXBsb2FkXSBhdHRhY2hOb3RlTWVkaWEgcmV0dXJuZWQgZmFsc3kgVVJMIFx1MjAxNCB1cGxvYWQgbWF5IGhhdmUgZmFpbGVkIHNpbGVudGx5Iil9Y2F0Y2goZil7XygiW2JnLXVwbG9hZF0gdXBsb2FkIEZBSUxFRCB3aXRoIGV4Y2VwdGlvbjoiLGYpfWZpbmFsbHl7dSghMSksXygiW2JnLXVwbG9hZF0gdXBsb2FkIGZsb3cgY29tcGxldGUiKX19LFtdKSxoPSgwLEV0LnVzZUNhbGxiYWNrKSh2PT57di5wcmV2ZW50RGVmYXVsdCgpLHYuc3RvcFByb3BhZ2F0aW9uKCksZCghMSk7bGV0IGY9di5kYXRhVHJhbnNmZXI/LmZpbGVzPy5bMF07ZiYmeShmKX0sW3ldKSx3PSgwLEV0LnVzZUNhbGxiYWNrKSh2PT57di5wcmV2ZW50RGVmYXVsdCgpLHYuc3RvcFByb3BhZ2F0aW9uKCksZCghMCl9LFtdKSxiPSgwLEV0LnVzZUNhbGxiYWNrKSh2PT57di5wcmV2ZW50RGVmYXVsdCgpLHYuc3RvcFByb3BhZ2F0aW9uKCksZCghMSl9LFtdKSxnPSgwLEV0LnVzZUNhbGxiYWNrKSh2PT57bGV0IGY9di50YXJnZXQuZmlsZXM/LlswXTtmJiZ5KGYpfSxbeV0pLG09KDAsRXQudXNlQ2FsbGJhY2spKCgpPT57YSgiIil9LFtdKTtyZXR1cm57YmFja2dyb3VuZEltYWdlVXJsOm8sYmFja2dyb3VuZE1vZGU6aSxzZXRCYWNrZ3JvdW5kTW9kZTpzLHVwbG9hZGluZzpsLGRyYWdPdmVyOmMsZmlsZUlucHV0UmVmOnAsaGFuZGxlRHJvcDpoLGhhbmRsZURyYWdPdmVyOncsaGFuZGxlRHJhZ0xlYXZlOmIsaGFuZGxlRmlsZUlucHV0Q2hhbmdlOmcsaGFuZGxlUmVtb3ZlSW1hZ2U6bX19dmFyIGpuPXllKG1lKCkpO3ZhciB3cj1be3ZhbHVlOiJub25lIixsYWJlbDoiTm9uZSAoZGlzYWJsZSBBSSBmZWF0dXJlcykiLGFwaUtleVByb3ZpZGVyOm51bGx9LHt2YWx1ZToib3BlbmFpIixsYWJlbDoiT3BlbkFJIENoYXRHUFQiLGFwaUtleVByb3ZpZGVyOiJvcGVuYWkifSx7dmFsdWU6ImFudGhyb3BpYyIsbGFiZWw6IkFudGhyb3BpYyBPcHVzIixhcGlLZXlQcm92aWRlcjoiYW50aHJvcGljIn0se3ZhbHVlOiJhbnRocm9waWMtc29ubmV0IixsYWJlbDoiQW50aHJvcGljIFNvbm5ldCIsYXBpS2V5UHJvdmlkZXI6ImFudGhyb3BpYyJ9LHt2YWx1ZToiZ2VtaW5pIixsYWJlbDoiR29vZ2xlIEdlbWluaSIsYXBpS2V5UHJvdmlkZXI6ImdlbWluaSJ9LHt2YWx1ZToiZ3JvayIsbGFiZWw6Ikdyb2siLGFwaUtleVByb3ZpZGVyOiJncm9rIn1dO2Z1bmN0aW9uIFgxKCl7bGV0IGU9bmF2aWdhdG9yLnVzZXJBZ2VudHx8IiIsdD1uYXZpZ2F0b3IucGxhdGZvcm18fCIiLG49L0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KGUpLHI9bmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzPjEmJi9NYWNpbnRvc2gvLnRlc3QoZSk7cmV0dXJuIG58fHI/e2xpbmtQYXJlbnRoZXRpY2FsOiJsb25nLXByZXNzLCBPcGVuIGluIE5ldyBUYWIiLG5vdGU6IkxvbmctcHJlc3MgdGhlIGZvbGxvd2luZyBsaW5rLCB0aGVuIGNob29zZSBPcGVuIGluIE5ldyBUYWIgb3IgT3BlbiBpbiBCcm93c2VyLiBBIG5vcm1hbCBjbGljayBtYXkgaGF2ZSBubyB2aXNpYmxlIGVmZmVjdC4ifTovTWFjfGlQaG9uZXxpUG9kfGlQYWQvLnRlc3QodCl8fC9NYWMgT1MgWC8udGVzdChlKT97bGlua1BhcmVudGhldGljYWw6IkNtZCtjbGljayIsbm90ZToiQ21kLWNsaWNrIHRoZSBmb2xsb3dpbmcgbGluayB0byBvcGVuIGl0LiBBIG5vcm1hbCBjbGljayBtYXkgaGF2ZSBubyB2aXNpYmxlIGVmZmVjdC4ifTovV2luLy50ZXN0KHQpP3tsaW5rUGFyZW50aGV0aWNhbDoiQ3RybCtjbGljayIsbm90ZToiQ3RybC1jbGljayB0aGUgZm9sbG93aW5nIGxpbmsgdG8gb3BlbiBpdC4gQSBub3JtYWwgY2xpY2sgbWF5IGhhdmUgbm8gdmlzaWJsZSBlZmZlY3QuIn06e2xpbmtQYXJlbnRoZXRpY2FsOiJDdHJsK2NsaWNrIixub3RlOiJDdHJsLWNsaWNrIHRoZSBmb2xsb3dpbmcgbGluayB0byBvcGVuIGl0LiBBIG5vcm1hbCBjbGljayBtYXkgaGF2ZSBubyB2aXNpYmxlIGVmZmVjdCJ9fWZ1bmN0aW9uIFoxKGUse2FwaUtleTp0LGFwaUtleVZpc2libGU6bixsaW5rUGFyZW50aGV0aWNhbDpyLG5vdGU6byxvbkFwaUtleUNoYW5nZTphLG9uUHJvdmlkZXJDaGFuZ2U6aSxvblRvZ2dsZUtleVZpc2liaWxpdHk6cyxwcm92aWRlckFwaUtleVVybDpsLHByb3ZpZGVyTmFtZTp1LHNlbGVjdGVkUHJvdmlkZXI6Y30pe3JldHVybiBlKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1zZWN0aW9uIHNlY3Rpb24ifSxlKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1zZWN0aW9uLWhlYWRlciJ9LGUoImg0Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VjdGlvbi10aXRsZSJ9LCJBSSBQcm92aWRlciIpLGUoInAiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1zZWN0aW9uLWRlc2MifSwiRW5hYmxlIGFuYWx5c2lzIG9mIHF1YXJ0ZXJseSBwbGFuICYgc3VnZ2VzdGVkIHRhc2tzLiIpKSxlKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1maWVsZCJ9LGUoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWxpbmUifSxlKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1maWVsZC1sYWJlbCJ9LCJMTE0gUHJvdmlkZXIiKSxlKCJzZWxlY3QiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1zZWxlY3QiLGlkOiJsbG0tcHJvdmlkZXItc2VsZWN0Iix2YWx1ZTpjLG9uQ2hhbmdlOmQ9PmkoZC50YXJnZXQudmFsdWUpfSwuLi53ci5tYXAoZD0+ZSgib3B0aW9uIix7a2V5OmQudmFsdWUsdmFsdWU6ZC52YWx1ZX0sZC5sYWJlbCkpKSksZSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctbGluZSJ9LGUoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWZpZWxkLWxhYmVsIn0sIkFQSSBLZXkiKSxlKCJwIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3MtYXBpLWtleS1oaW50In0sbyksZSgiYSIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLWFwaS1rZXktbGluayIsaHJlZjpsLHRhcmdldDoiX2JsYW5rIixyZWw6Im5vb3BlbmVyIG5vcmVmZXJyZXIifSxgUmV0cmlldmUgeW91ciAke3V9IEFQSSBrZXkgKCR7cn0pIFx1MjE5MmApLGUoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLWFwaS1rZXktaW5wdXQtcm93In0sZSgiaW5wdXQiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1hcGkta2V5LWlucHV0Iix0eXBlOm4/InRleHQiOiJwYXNzd29yZCIsdmFsdWU6dCxvbkNoYW5nZTpkPT5hKGQudGFyZ2V0LnZhbHVlKSxwbGFjZWhvbGRlcjoiUGFzdGUgeW91ciBBUEkga2V5IGhlcmUiLGF1dG9Db21wbGV0ZToib2ZmIixzcGVsbENoZWNrOiExfSksZSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3MtYXBpLWtleS10b2dnbGUiLHR5cGU6ImJ1dHRvbiIsb25DbGljazpzLHRpdGxlOm4/IkhpZGUgQVBJIGtleSI6IlNob3cgQVBJIGtleSIsImFyaWEtbGFiZWwiOm4/IkhpZGUgQVBJIGtleSI6IlNob3cgQVBJIGtleSJ9LG4/Ilx1ezFGNjQ4fSI6Ilx1ezFGNDQxfVx1RkUwRiIpKSkpKX1mdW5jdGlvbiBlUyhlLHtiYWNrZ3JvdW5kSW1hZ2VVcmw6dCxiYWNrZ3JvdW5kTW9kZTpuLGRyYWdPdmVyOnIsZmlsZUlucHV0UmVmOm8sb25CYWNrZ3JvdW5kTW9kZUNoYW5nZTphLG9uRHJhZ0xlYXZlOmksb25EcmFnT3ZlcjpzLG9uRHJvcDpsLG9uRmlsZUlucHV0Q2hhbmdlOnUsb25SZW1vdmVJbWFnZTpjLHVwbG9hZGluZzpkfSl7cmV0dXJuIGUoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLXNlY3Rpb24gc2VjdGlvbiJ9LGUoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLXNlY3Rpb24taGVhZGVyIn0sZSgiaDQiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1zZWN0aW9uLXRpdGxlIn0sIkJhY2tncm91bmQgSW1hZ2UiKSxlKCJwIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VjdGlvbi1kZXNjIn0sIlVwbG9hZCBhbiBpbWFnZSB0byB1c2UgYXMgeW91ciBkYXNoYm9hcmQgYmFja2dyb3VuZC4iKSksZSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctZmllbGQifSxlKCJkaXYiLHtjbGFzc05hbWU6YGRhc2hib2FyZC1zZXR0aW5ncy1kcm9wem9uZSR7cj8iIGRhc2hib2FyZC1zZXR0aW5ncy1kcm9wem9uZS0tYWN0aXZlIjoiIn0ke2Q/IiBkYXNoYm9hcmQtc2V0dGluZ3MtZHJvcHpvbmUtLXVwbG9hZGluZyI6IiJ9YCxvbkRyb3A6bCxvbkRyYWdPdmVyOnMsb25EcmFnTGVhdmU6aSxvbkNsaWNrOigpPT4hZCYmby5jdXJyZW50Py5jbGljaygpfSxlKCJpbnB1dCIse3JlZjpvLHR5cGU6ImZpbGUiLGFjY2VwdDoiaW1hZ2UvKiIsY2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3MtZHJvcHpvbmUtaW5wdXQiLG9uQ2hhbmdlOnV9KSxkP2UoInNwYW4iLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1kcm9wem9uZS10ZXh0In0sIlVwbG9hZGluZy4uLiIpOnQ/ZSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3MtZHJvcHpvbmUtcHJldmlldyJ9LGUoImltZyIse3NyYzp0LGFsdDoiQmFja2dyb3VuZCBwcmV2aWV3IixjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1kcm9wem9uZS1wcmV2aWV3LWltZyIsb25Mb2FkOigpPT5fKCJbc2V0dGluZ3MtcG9wdXBdIGJhY2tncm91bmQgcHJldmlldyBpbWFnZSBsb2FkZWQgT0s6Iix0KSxvbkVycm9yOnA9Pl8oIltzZXR0aW5ncy1wb3B1cF0gYmFja2dyb3VuZCBwcmV2aWV3IGltYWdlIEZBSUxFRCB0byBsb2FkOiIsdCxwLnR5cGUpfSksZSgic3BhbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLWRyb3B6b25lLXRleHQifSwiRHJvcCBhIG5ldyBpbWFnZSBvciBjbGljayB0byByZXBsYWNlIikpOmUoInNwYW4iLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1kcm9wem9uZS10ZXh0In0sIkRyYWcgJiBkcm9wIGFuIGltYWdlIGhlcmUsIG9yIGNsaWNrIHRvIHVwbG9hZCIpKSx0JiZlKCJhIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3MtcmVtb3ZlLWltYWdlIixocmVmOiIjIixvbkNsaWNrOnA9PntwLnByZXZlbnREZWZhdWx0KCksYygpfX0sIlJlbW92ZSBpbWFnZSIpKSx0JiZlKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1maWVsZCJ9LGUoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWZpZWxkLWxhYmVsIn0sIkRpc3BsYXkgTW9kZSIpLGUoInNlbGVjdCIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLXNlbGVjdCIsdmFsdWU6bixvbkNoYW5nZTpwPT5hKHAudGFyZ2V0LnZhbHVlKX0sLi4ubWcubWFwKHA9PmUoIm9wdGlvbiIse2tleTpwLnZhbHVlLHZhbHVlOnAudmFsdWV9LHAubGFiZWwpKSkpKX1mdW5jdGlvbiB0UyhlLHtvblRpbWVGb3JtYXRDaGFuZ2U6dCxvbldlZWtGb3JtYXRDaGFuZ2U6bix0aW1lRm9ybWF0OnIsd2Vla0Zvcm1hdDpvfSl7cmV0dXJuIGUoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLXNlY3Rpb24gc2VjdGlvbiJ9LGUoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLXNlY3Rpb24taGVhZGVyIn0sZSgiaDQiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1zZWN0aW9uLXRpdGxlIn0sIlRpbWUgJiBEYXRlIEZvcm1hdCIpLGUoInAiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1zZWN0aW9uLWRlc2MifSwiQ2hvb3NlIGhvdyB0aW1lcyBhbmQgd2Vla3MgYXJlIGRpc3BsYXllZCBhY3Jvc3MgdGhlIGRhc2hib2FyZC4iKSksZSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctZmllbGQifSxlKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1saW5lIn0sZSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctZmllbGQtbGFiZWwifSwiVGltZSBGb3JtYXQiKSxlKCJsYWJlbCIsbnVsbCxlKCJpbnB1dCIse3R5cGU6InJhZGlvIixuYW1lOiJ0aW1lLWZvcm1hdCIsdmFsdWU6Im1lcmlkaWFuIixjaGVja2VkOnI9PT0ibWVyaWRpYW4iLG9uQ2hhbmdlOigpPT50KCJtZXJpZGlhbiIpfSksIlVzZSBtZXJpZGlhbiAoYW0vcG0pIHRpbWVzIiksZSgibGFiZWwiLG51bGwsZSgiaW5wdXQiLHt0eXBlOiJyYWRpbyIsbmFtZToidGltZS1mb3JtYXQiLHZhbHVlOiIyNGgiLGNoZWNrZWQ6cj09PSIyNGgiLG9uQ2hhbmdlOigpPT50KCIyNGgiKX0pLCIyNCBob3VyIHRpbWUiKSksZSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctbGluZSJ9LGUoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWZpZWxkLWxhYmVsIn0sIldlZWsgRm9ybWF0IiksZSgibGFiZWwiLG51bGwsZSgiaW5wdXQiLHt0eXBlOiJyYWRpbyIsbmFtZToid2Vlay1mb3JtYXQiLHZhbHVlOiJzdW5kYXkiLGNoZWNrZWQ6bz09PSJzdW5kYXkiLG9uQ2hhbmdlOigpPT5uKCJzdW5kYXkiKX0pLCJXZWVrIGJlZ2lucyBvbiBTdW5kYXkiKSxlKCJsYWJlbCIsbnVsbCxlKCJpbnB1dCIse3R5cGU6InJhZGlvIixuYW1lOiJ3ZWVrLWZvcm1hdCIsdmFsdWU6Im1vbmRheSIsY2hlY2tlZDpvPT09Im1vbmRheSIsb25DaGFuZ2U6KCk9Pm4oIm1vbmRheSIpfSksIldlZWsgYmVnaW5zIG9uIE1vbmRheSIpKSkpfWZ1bmN0aW9uIG12KGUsdCl7aWYoIXQpcmV0dXJuIiI7bGV0IG49b24odCk7cmV0dXJuIG4mJmU/LltuXXx8IiJ9ZnVuY3Rpb24gcnAoe2FwcDplLGNvbmZpZ1BhcmFtczp0LG9uQ2FuY2VsOm4sb25TYXZlOnIscGx1Z2luTm90ZVVVSUQ6byx0aW1lRm9ybWF0OmEsd2Vla0Zvcm1hdDppfSl7bGV0IHM9am4uY3JlYXRlRWxlbWVudCxbbF09KDAsam4udXNlU3RhdGUpKCgpPT50eXBlb2Ygd2luZG93PiJ1Ij8wOndpbmRvdy5zY3JvbGxZPz9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wPz8wKSx1PXQ/LltaLkxMTV9QUk9WSURFUl9NT0RFTF0sYz10Py5bWi5CQUNLR1JPVU5EX0lNQUdFX1VSTF0sZD10Py5bWi5CQUNLR1JPVU5EX0lNQUdFX01PREVdLHA9d3IuZmluZChIPT5ILnZhbHVlPT09dSl8fHdyWzBdLFt5LGhdPSgwLGpuLnVzZVN0YXRlKShtdih0LHAuYXBpS2V5UHJvdmlkZXIpKSxbdyxiXT0oMCxqbi51c2VTdGF0ZSkoITEpLFtnLG1dPSgwLGpuLnVzZVN0YXRlKSh1fHwib3BlbmFpIiksW3YsZl09KDAsam4udXNlU3RhdGUpKGF8fCJtZXJpZGlhbiIpLFtFLGtdPSgwLGpuLnVzZVN0YXRlKShpfHwic3VuZGF5Iik7XygiW3NldHRpbmdzLXBvcHVwXSByZW5kZXJpbmcgRGFzaGJvYXJkU2V0dGluZ3NQb3B1cCwgY3VycmVudEJhY2tncm91bmRJbWFnZVVybDoiLGMpO2xldHtiYWNrZ3JvdW5kSW1hZ2VVcmw6TixiYWNrZ3JvdW5kTW9kZTpELHNldEJhY2tncm91bmRNb2RlOk8sdXBsb2FkaW5nOlQsZHJhZ092ZXI6eixmaWxlSW5wdXRSZWY6UCxoYW5kbGVEcm9wOkMsaGFuZGxlRHJhZ092ZXI6TCxoYW5kbGVEcmFnTGVhdmU6JCxoYW5kbGVGaWxlSW5wdXRDaGFuZ2U6VyxoYW5kbGVSZW1vdmVJbWFnZTpNfT1ucCh7YXBwOmUscGx1Z2luTm90ZVVVSUQ6byxpbml0aWFsSW1hZ2VVcmw6Yyxpbml0aWFsTW9kZTpkfSksSz13ci5maW5kKEg9PkgudmFsdWU9PT1nKXx8d3JbMF0sb2U9bHZbSy5hcGlLZXlQcm92aWRlcl0sUz13ci5maW5kKEg9PkgudmFsdWU9PT1nKT8ubGFiZWwseD1IPT57bShIKTtsZXQgWT13ci5maW5kKFY9PlYudmFsdWU9PT1IKXx8d3JbMF0scT1tdih0LFkuYXBpS2V5UHJvdmlkZXIpO2gocSl9LHtsaW5rUGFyZW50aGV0aWNhbDpSLG5vdGU6Qn09WDEoKTtyZXR1cm4gcyhYcix7dGl0bGU6Ilx1MjY5OVx1RkUwRiBEYXNoYm9hcmQgU2V0dGluZ3MiLHNjcm9sbFRvcDpsLG9uU3VibWl0OigpPT5yKHthcGlLZXk6eSxhcGlLZXlQcm92aWRlcjpLLmFwaUtleVByb3ZpZGVyLGJhY2tncm91bmRJbWFnZVVybDpOLGJhY2tncm91bmRNb2RlOkQsbGxtUHJvdmlkZXI6Zyx0aW1lRm9ybWF0OnYsd2Vla0Zvcm1hdDpFfSksb25DYW5jZWw6bixzdWJtaXRMYWJlbDoiU2F2ZSBTZXR0aW5ncyJ9LHMoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLWNvbnRhaW5lciJ9LGVTKHMse2JhY2tncm91bmRJbWFnZVVybDpOLGJhY2tncm91bmRNb2RlOkQsZHJhZ092ZXI6eixmaWxlSW5wdXRSZWY6UCxvbkJhY2tncm91bmRNb2RlQ2hhbmdlOk8sb25EcmFnTGVhdmU6JCxvbkRyYWdPdmVyOkwsb25Ecm9wOkMsb25GaWxlSW5wdXRDaGFuZ2U6VyxvblJlbW92ZUltYWdlOk0sdXBsb2FkaW5nOlR9KSxaMShzLHthcGlLZXk6eSxhcGlLZXlWaXNpYmxlOncsbGlua1BhcmVudGhldGljYWw6Uixub3RlOkIsb25BcGlLZXlDaGFuZ2U6aCxvblByb3ZpZGVyQ2hhbmdlOngsb25Ub2dnbGVLZXlWaXNpYmlsaXR5OigpPT5iKEg9PiFIKSxwcm92aWRlckFwaUtleVVybDpvZSxwcm92aWRlck5hbWU6UyxzZWxlY3RlZFByb3ZpZGVyOmd9KSx0UyhzLHtvblRpbWVGb3JtYXRDaGFuZ2U6ZixvbldlZWtGb3JtYXRDaGFuZ2U6ayx0aW1lRm9ybWF0OnYsd2Vla0Zvcm1hdDpFfSkpKX12YXIgb3A9e307KGZ1bmN0aW9uIGUodCxuLHIsbyl7dmFyIGE9ISEodC5Xb3JrZXImJnQuQmxvYiYmdC5Qcm9taXNlJiZ0Lk9mZnNjcmVlbkNhbnZhcyYmdC5PZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQmJnQuSFRNTENhbnZhc0VsZW1lbnQmJnQuSFRNTENhbnZhc0VsZW1lbnQucHJvdG90eXBlLnRyYW5zZmVyQ29udHJvbFRvT2Zmc2NyZWVuJiZ0LlVSTCYmdC5VUkwuY3JlYXRlT2JqZWN0VVJMKSxpPXR5cGVvZiBQYXRoMkQ9PSJmdW5jdGlvbiImJnR5cGVvZiBET01NYXRyaXg9PSJmdW5jdGlvbiIscz1mdW5jdGlvbigpe2lmKCF0Lk9mZnNjcmVlbkNhbnZhcylyZXR1cm4hMTt0cnl7dmFyIFM9bmV3IE9mZnNjcmVlbkNhbnZhcygxLDEpLHg9Uy5nZXRDb250ZXh0KCIyZCIpO3guZmlsbFJlY3QoMCwwLDEsMSk7dmFyIFI9Uy50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKTt4LmNyZWF0ZVBhdHRlcm4oUiwibm8tcmVwZWF0Iil9Y2F0Y2h7cmV0dXJuITF9cmV0dXJuITB9KCk7ZnVuY3Rpb24gbCgpe31mdW5jdGlvbiB1KFMpe3ZhciB4PW4uZXhwb3J0cy5Qcm9taXNlLFI9eCE9PXZvaWQgMD94OnQuUHJvbWlzZTtyZXR1cm4gdHlwZW9mIFI9PSJmdW5jdGlvbiI/bmV3IFIoUyk6KFMobCxsKSxudWxsKX12YXIgYz1mdW5jdGlvbihTLHgpe3JldHVybnt0cmFuc2Zvcm06ZnVuY3Rpb24oUil7aWYoUylyZXR1cm4gUjtpZih4LmhhcyhSKSlyZXR1cm4geC5nZXQoUik7dmFyIEI9bmV3IE9mZnNjcmVlbkNhbnZhcyhSLndpZHRoLFIuaGVpZ2h0KSxIPUIuZ2V0Q29udGV4dCgiMmQiKTtyZXR1cm4gSC5kcmF3SW1hZ2UoUiwwLDApLHguc2V0KFIsQiksQn0sY2xlYXI6ZnVuY3Rpb24oKXt4LmNsZWFyKCl9fX0ocyxuZXcgTWFwKSxkPWZ1bmN0aW9uKCl7dmFyIFM9TWF0aC5mbG9vcigxNi42NjY2NjY2NjY2NjY2NjgpLHgsUixCPXt9LEg9MDtyZXR1cm4gdHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZT09ImZ1bmN0aW9uIiYmdHlwZW9mIGNhbmNlbEFuaW1hdGlvbkZyYW1lPT0iZnVuY3Rpb24iPyh4PWZ1bmN0aW9uKFkpe3ZhciBxPU1hdGgucmFuZG9tKCk7cmV0dXJuIEJbcV09cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uIFYoSil7SD09PUp8fEgrUy0xPEo/KEg9SixkZWxldGUgQltxXSxZKCkpOkJbcV09cmVxdWVzdEFuaW1hdGlvbkZyYW1lKFYpfSkscX0sUj1mdW5jdGlvbihZKXtCW1ldJiZjYW5jZWxBbmltYXRpb25GcmFtZShCW1ldKX0pOih4PWZ1bmN0aW9uKFkpe3JldHVybiBzZXRUaW1lb3V0KFksUyl9LFI9ZnVuY3Rpb24oWSl7cmV0dXJuIGNsZWFyVGltZW91dChZKX0pLHtmcmFtZTp4LGNhbmNlbDpSfX0oKSxwPWZ1bmN0aW9uKCl7dmFyIFMseCxSPXt9O2Z1bmN0aW9uIEIoSCl7ZnVuY3Rpb24gWShxLFYpe0gucG9zdE1lc3NhZ2Uoe29wdGlvbnM6cXx8e30sY2FsbGJhY2s6Vn0pfUguaW5pdD1mdW5jdGlvbihWKXt2YXIgSj1WLnRyYW5zZmVyQ29udHJvbFRvT2Zmc2NyZWVuKCk7SC5wb3N0TWVzc2FnZSh7Y2FudmFzOkp9LFtKXSl9LEguZmlyZT1mdW5jdGlvbihWLEosUSl7aWYoeClyZXR1cm4gWShWLG51bGwpLHg7dmFyIG5lPU1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO3JldHVybiB4PXUoZnVuY3Rpb24odGUpe2Z1bmN0aW9uIGllKFRlKXtUZS5kYXRhLmNhbGxiYWNrPT09bmUmJihkZWxldGUgUltuZV0sSC5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixpZSkseD1udWxsLGMuY2xlYXIoKSxRKCksdGUoKSl9SC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixpZSksWShWLG5lKSxSW25lXT1pZS5iaW5kKG51bGwse2RhdGE6e2NhbGxiYWNrOm5lfX0pfSkseH0sSC5yZXNldD1mdW5jdGlvbigpe0gucG9zdE1lc3NhZ2Uoe3Jlc2V0OiEwfSk7Zm9yKHZhciBWIGluIFIpUltWXSgpLGRlbGV0ZSBSW1ZdfX1yZXR1cm4gZnVuY3Rpb24oKXtpZihTKXJldHVybiBTO2lmKCFyJiZhKXt2YXIgSD1bInZhciBDT05GRVRUSSwgU0laRSA9IHt9LCBtb2R1bGUgPSB7fTsiLCIoIitlLnRvU3RyaW5nKCkrIikodGhpcywgbW9kdWxlLCB0cnVlLCBTSVpFKTsiLCJvbm1lc3NhZ2UgPSBmdW5jdGlvbihtc2cpIHsiLCIgIGlmIChtc2cuZGF0YS5vcHRpb25zKSB7IiwiICAgIENPTkZFVFRJKG1zZy5kYXRhLm9wdGlvbnMpLnRoZW4oZnVuY3Rpb24gKCkgeyIsIiAgICAgIGlmIChtc2cuZGF0YS5jYWxsYmFjaykgeyIsIiAgICAgICAgcG9zdE1lc3NhZ2UoeyBjYWxsYmFjazogbXNnLmRhdGEuY2FsbGJhY2sgfSk7IiwiICAgICAgfSIsIiAgICB9KTsiLCIgIH0gZWxzZSBpZiAobXNnLmRhdGEucmVzZXQpIHsiLCIgICAgQ09ORkVUVEkgJiYgQ09ORkVUVEkucmVzZXQoKTsiLCIgIH0gZWxzZSBpZiAobXNnLmRhdGEucmVzaXplKSB7IiwiICAgIFNJWkUud2lkdGggPSBtc2cuZGF0YS5yZXNpemUud2lkdGg7IiwiICAgIFNJWkUuaGVpZ2h0ID0gbXNnLmRhdGEucmVzaXplLmhlaWdodDsiLCIgIH0gZWxzZSBpZiAobXNnLmRhdGEuY2FudmFzKSB7IiwiICAgIFNJWkUud2lkdGggPSBtc2cuZGF0YS5jYW52YXMud2lkdGg7IiwiICAgIFNJWkUuaGVpZ2h0ID0gbXNnLmRhdGEuY2FudmFzLmhlaWdodDsiLCIgICAgQ09ORkVUVEkgPSBtb2R1bGUuZXhwb3J0cy5jcmVhdGUobXNnLmRhdGEuY2FudmFzKTsiLCIgIH0iLCJ9Il0uam9pbihgCmApO3RyeXtTPW5ldyBXb3JrZXIoVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbSF0pKSl9Y2F0Y2goWSl7cmV0dXJuIHR5cGVvZiBjb25zb2xlPCJ1IiYmdHlwZW9mIGNvbnNvbGUud2Fybj09ImZ1bmN0aW9uIiYmY29uc29sZS53YXJuKCJcdXsxRjM4QX0gQ291bGQgbm90IGxvYWQgd29ya2VyIixZKSxudWxsfUIoUyl9cmV0dXJuIFN9fSgpLHk9e3BhcnRpY2xlQ291bnQ6NTAsYW5nbGU6OTAsc3ByZWFkOjQ1LHN0YXJ0VmVsb2NpdHk6NDUsZGVjYXk6LjksZ3Jhdml0eToxLGRyaWZ0OjAsdGlja3M6MjAwLHg6LjUseTouNSxzaGFwZXM6WyJzcXVhcmUiLCJjaXJjbGUiXSx6SW5kZXg6MTAwLGNvbG9yczpbIiMyNmNjZmYiLCIjYTI1YWZkIiwiI2ZmNWU3ZSIsIiM4OGZmNWEiLCIjZmNmZjQyIiwiI2ZmYTYyZCIsIiNmZjM2ZmYiXSxkaXNhYmxlRm9yUmVkdWNlZE1vdGlvbjohMSxzY2FsYXI6MX07ZnVuY3Rpb24gaChTLHgpe3JldHVybiB4P3goUyk6U31mdW5jdGlvbiB3KFMpe3JldHVybiBTIT1udWxsfWZ1bmN0aW9uIGIoUyx4LFIpe3JldHVybiBoKFMmJncoU1t4XSk/U1t4XTp5W3hdLFIpfWZ1bmN0aW9uIGcoUyl7cmV0dXJuIFM8MD8wOk1hdGguZmxvb3IoUyl9ZnVuY3Rpb24gbShTLHgpe3JldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKHgtUykpK1N9ZnVuY3Rpb24gdihTKXtyZXR1cm4gcGFyc2VJbnQoUywxNil9ZnVuY3Rpb24gZihTKXtyZXR1cm4gUy5tYXAoRSl9ZnVuY3Rpb24gRShTKXt2YXIgeD1TdHJpbmcoUykucmVwbGFjZSgvW14wLTlhLWZdL2dpLCIiKTtyZXR1cm4geC5sZW5ndGg8NiYmKHg9eFswXSt4WzBdK3hbMV0reFsxXSt4WzJdK3hbMl0pLHtyOnYoeC5zdWJzdHJpbmcoMCwyKSksZzp2KHguc3Vic3RyaW5nKDIsNCkpLGI6dih4LnN1YnN0cmluZyg0LDYpKX19ZnVuY3Rpb24gayhTKXt2YXIgeD1iKFMsIm9yaWdpbiIsT2JqZWN0KTtyZXR1cm4geC54PWIoeCwieCIsTnVtYmVyKSx4Lnk9Yih4LCJ5IixOdW1iZXIpLHh9ZnVuY3Rpb24gTihTKXtTLndpZHRoPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCxTLmhlaWdodD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0fWZ1bmN0aW9uIEQoUyl7dmFyIHg9Uy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtTLndpZHRoPXgud2lkdGgsUy5oZWlnaHQ9eC5oZWlnaHR9ZnVuY3Rpb24gTyhTKXt2YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTtyZXR1cm4geC5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiLHguc3R5bGUudG9wPSIwcHgiLHguc3R5bGUubGVmdD0iMHB4Iix4LnN0eWxlLnBvaW50ZXJFdmVudHM9Im5vbmUiLHguc3R5bGUuekluZGV4PVMseH1mdW5jdGlvbiBUKFMseCxSLEIsSCxZLHEsVixKKXtTLnNhdmUoKSxTLnRyYW5zbGF0ZSh4LFIpLFMucm90YXRlKFkpLFMuc2NhbGUoQixIKSxTLmFyYygwLDAsMSxxLFYsSiksUy5yZXN0b3JlKCl9ZnVuY3Rpb24geihTKXt2YXIgeD1TLmFuZ2xlKihNYXRoLlBJLzE4MCksUj1TLnNwcmVhZCooTWF0aC5QSS8xODApO3JldHVybnt4OlMueCx5OlMueSx3b2JibGU6TWF0aC5yYW5kb20oKSoxMCx3b2JibGVTcGVlZDpNYXRoLm1pbiguMTEsTWF0aC5yYW5kb20oKSouMSsuMDUpLHZlbG9jaXR5OlMuc3RhcnRWZWxvY2l0eSouNStNYXRoLnJhbmRvbSgpKlMuc3RhcnRWZWxvY2l0eSxhbmdsZTJEOi14KyguNSpSLU1hdGgucmFuZG9tKCkqUiksdGlsdEFuZ2xlOihNYXRoLnJhbmRvbSgpKiguNzUtLjI1KSsuMjUpKk1hdGguUEksY29sb3I6Uy5jb2xvcixzaGFwZTpTLnNoYXBlLHRpY2s6MCx0b3RhbFRpY2tzOlMudGlja3MsZGVjYXk6Uy5kZWNheSxkcmlmdDpTLmRyaWZ0LHJhbmRvbTpNYXRoLnJhbmRvbSgpKzIsdGlsdFNpbjowLHRpbHRDb3M6MCx3b2JibGVYOjAsd29iYmxlWTowLGdyYXZpdHk6Uy5ncmF2aXR5KjMsb3ZhbFNjYWxhcjouNixzY2FsYXI6Uy5zY2FsYXIsZmxhdDpTLmZsYXR9fWZ1bmN0aW9uIFAoUyx4KXt4LngrPU1hdGguY29zKHguYW5nbGUyRCkqeC52ZWxvY2l0eSt4LmRyaWZ0LHgueSs9TWF0aC5zaW4oeC5hbmdsZTJEKSp4LnZlbG9jaXR5K3guZ3Jhdml0eSx4LnZlbG9jaXR5Kj14LmRlY2F5LHguZmxhdD8oeC53b2JibGU9MCx4LndvYmJsZVg9eC54KzEwKnguc2NhbGFyLHgud29iYmxlWT14LnkrMTAqeC5zY2FsYXIseC50aWx0U2luPTAseC50aWx0Q29zPTAseC5yYW5kb209MSk6KHgud29iYmxlKz14LndvYmJsZVNwZWVkLHgud29iYmxlWD14LngrMTAqeC5zY2FsYXIqTWF0aC5jb3MoeC53b2JibGUpLHgud29iYmxlWT14LnkrMTAqeC5zY2FsYXIqTWF0aC5zaW4oeC53b2JibGUpLHgudGlsdEFuZ2xlKz0uMSx4LnRpbHRTaW49TWF0aC5zaW4oeC50aWx0QW5nbGUpLHgudGlsdENvcz1NYXRoLmNvcyh4LnRpbHRBbmdsZSkseC5yYW5kb209TWF0aC5yYW5kb20oKSsyKTt2YXIgUj14LnRpY2srKy94LnRvdGFsVGlja3MsQj14LngreC5yYW5kb20qeC50aWx0Q29zLEg9eC55K3gucmFuZG9tKngudGlsdFNpbixZPXgud29iYmxlWCt4LnJhbmRvbSp4LnRpbHRDb3MscT14LndvYmJsZVkreC5yYW5kb20qeC50aWx0U2luO2lmKFMuZmlsbFN0eWxlPSJyZ2JhKCIreC5jb2xvci5yKyIsICIreC5jb2xvci5nKyIsICIreC5jb2xvci5iKyIsICIrKDEtUikrIikiLFMuYmVnaW5QYXRoKCksaSYmeC5zaGFwZS50eXBlPT09InBhdGgiJiZ0eXBlb2YgeC5zaGFwZS5wYXRoPT0ic3RyaW5nIiYmQXJyYXkuaXNBcnJheSh4LnNoYXBlLm1hdHJpeCkpUy5maWxsKE0oeC5zaGFwZS5wYXRoLHguc2hhcGUubWF0cml4LHgueCx4LnksTWF0aC5hYnMoWS1CKSouMSxNYXRoLmFicyhxLUgpKi4xLE1hdGguUEkvMTAqeC53b2JibGUpKTtlbHNlIGlmKHguc2hhcGUudHlwZT09PSJiaXRtYXAiKXt2YXIgVj1NYXRoLlBJLzEwKngud29iYmxlLEo9TWF0aC5hYnMoWS1CKSouMSxRPU1hdGguYWJzKHEtSCkqLjEsbmU9eC5zaGFwZS5iaXRtYXAud2lkdGgqeC5zY2FsYXIsdGU9eC5zaGFwZS5iaXRtYXAuaGVpZ2h0Knguc2NhbGFyLGllPW5ldyBET01NYXRyaXgoW01hdGguY29zKFYpKkosTWF0aC5zaW4oVikqSiwtTWF0aC5zaW4oVikqUSxNYXRoLmNvcyhWKSpRLHgueCx4LnldKTtpZS5tdWx0aXBseVNlbGYobmV3IERPTU1hdHJpeCh4LnNoYXBlLm1hdHJpeCkpO3ZhciBUZT1TLmNyZWF0ZVBhdHRlcm4oYy50cmFuc2Zvcm0oeC5zaGFwZS5iaXRtYXApLCJuby1yZXBlYXQiKTtUZS5zZXRUcmFuc2Zvcm0oaWUpLFMuZ2xvYmFsQWxwaGE9MS1SLFMuZmlsbFN0eWxlPVRlLFMuZmlsbFJlY3QoeC54LW5lLzIseC55LXRlLzIsbmUsdGUpLFMuZ2xvYmFsQWxwaGE9MX1lbHNlIGlmKHguc2hhcGU9PT0iY2lyY2xlIilTLmVsbGlwc2U/Uy5lbGxpcHNlKHgueCx4LnksTWF0aC5hYnMoWS1CKSp4Lm92YWxTY2FsYXIsTWF0aC5hYnMocS1IKSp4Lm92YWxTY2FsYXIsTWF0aC5QSS8xMCp4LndvYmJsZSwwLDIqTWF0aC5QSSk6VChTLHgueCx4LnksTWF0aC5hYnMoWS1CKSp4Lm92YWxTY2FsYXIsTWF0aC5hYnMocS1IKSp4Lm92YWxTY2FsYXIsTWF0aC5QSS8xMCp4LndvYmJsZSwwLDIqTWF0aC5QSSk7ZWxzZSBpZih4LnNoYXBlPT09InN0YXIiKWZvcih2YXIgYWU9TWF0aC5QSS8yKjMsQWU9NCp4LnNjYWxhcixXZT04Knguc2NhbGFyLFZlPXgueCxYPXgueSxOZT01LHdlPU1hdGguUEkvTmU7TmUtLTspVmU9eC54K01hdGguY29zKGFlKSpXZSxYPXgueStNYXRoLnNpbihhZSkqV2UsUy5saW5lVG8oVmUsWCksYWUrPXdlLFZlPXgueCtNYXRoLmNvcyhhZSkqQWUsWD14LnkrTWF0aC5zaW4oYWUpKkFlLFMubGluZVRvKFZlLFgpLGFlKz13ZTtlbHNlIFMubW92ZVRvKE1hdGguZmxvb3IoeC54KSxNYXRoLmZsb29yKHgueSkpLFMubGluZVRvKE1hdGguZmxvb3IoeC53b2JibGVYKSxNYXRoLmZsb29yKEgpKSxTLmxpbmVUbyhNYXRoLmZsb29yKFkpLE1hdGguZmxvb3IocSkpLFMubGluZVRvKE1hdGguZmxvb3IoQiksTWF0aC5mbG9vcih4LndvYmJsZVkpKTtyZXR1cm4gUy5jbG9zZVBhdGgoKSxTLmZpbGwoKSx4LnRpY2s8eC50b3RhbFRpY2tzfWZ1bmN0aW9uIEMoUyx4LFIsQixIKXt2YXIgWT14LnNsaWNlKCkscT1TLmdldENvbnRleHQoIjJkIiksVixKLFE9dShmdW5jdGlvbihuZSl7ZnVuY3Rpb24gdGUoKXtWPUo9bnVsbCxxLmNsZWFyUmVjdCgwLDAsQi53aWR0aCxCLmhlaWdodCksYy5jbGVhcigpLEgoKSxuZSgpfWZ1bmN0aW9uIGllKCl7ciYmIShCLndpZHRoPT09by53aWR0aCYmQi5oZWlnaHQ9PT1vLmhlaWdodCkmJihCLndpZHRoPVMud2lkdGg9by53aWR0aCxCLmhlaWdodD1TLmhlaWdodD1vLmhlaWdodCksIUIud2lkdGgmJiFCLmhlaWdodCYmKFIoUyksQi53aWR0aD1TLndpZHRoLEIuaGVpZ2h0PVMuaGVpZ2h0KSxxLmNsZWFyUmVjdCgwLDAsQi53aWR0aCxCLmhlaWdodCksWT1ZLmZpbHRlcihmdW5jdGlvbihUZSl7cmV0dXJuIFAocSxUZSl9KSxZLmxlbmd0aD9WPWQuZnJhbWUoaWUpOnRlKCl9Vj1kLmZyYW1lKGllKSxKPXRlfSk7cmV0dXJue2FkZEZldHRpczpmdW5jdGlvbihuZSl7cmV0dXJuIFk9WS5jb25jYXQobmUpLFF9LGNhbnZhczpTLHByb21pc2U6USxyZXNldDpmdW5jdGlvbigpe1YmJmQuY2FuY2VsKFYpLEomJkooKX19fWZ1bmN0aW9uIEwoUyx4KXt2YXIgUj0hUyxCPSEhYih4fHx7fSwicmVzaXplIiksSD0hMSxZPWIoeCwiZGlzYWJsZUZvclJlZHVjZWRNb3Rpb24iLEJvb2xlYW4pLHE9YSYmISFiKHh8fHt9LCJ1c2VXb3JrZXIiKSxWPXE/cCgpOm51bGwsSj1SP046RCxRPVMmJlY/ISFTLl9fY29uZmV0dGlfaW5pdGlhbGl6ZWQ6ITEsbmU9dHlwZW9mIG1hdGNoTWVkaWE9PSJmdW5jdGlvbiImJm1hdGNoTWVkaWEoIihwcmVmZXJzLXJlZHVjZWQtbW90aW9uKSIpLm1hdGNoZXMsdGU7ZnVuY3Rpb24gaWUoYWUsQWUsV2Upe2Zvcih2YXIgVmU9YihhZSwicGFydGljbGVDb3VudCIsZyksWD1iKGFlLCJhbmdsZSIsTnVtYmVyKSxOZT1iKGFlLCJzcHJlYWQiLE51bWJlciksd2U9YihhZSwic3RhcnRWZWxvY2l0eSIsTnVtYmVyKSxUdD1iKGFlLCJkZWNheSIsTnVtYmVyKSxmbj1iKGFlLCJncmF2aXR5IixOdW1iZXIpLE50PWIoYWUsImRyaWZ0IixOdW1iZXIpLFl0PWIoYWUsImNvbG9ycyIsZiksR249YihhZSwidGlja3MiLE51bWJlciksS249YihhZSwic2hhcGVzIiksZW89YihhZSwic2NhbGFyIiksdG89ISFiKGFlLCJmbGF0IiksaGk9ayhhZSksZ2k9VmUscW89W10sQ2w9Uy53aWR0aCpoaS54LE9sPVMuaGVpZ2h0KmhpLnk7Z2ktLTspcW8ucHVzaCh6KHt4OkNsLHk6T2wsYW5nbGU6WCxzcHJlYWQ6TmUsc3RhcnRWZWxvY2l0eTp3ZSxjb2xvcjpZdFtnaSVZdC5sZW5ndGhdLHNoYXBlOktuW20oMCxLbi5sZW5ndGgpXSx0aWNrczpHbixkZWNheTpUdCxncmF2aXR5OmZuLGRyaWZ0Ok50LHNjYWxhcjplbyxmbGF0OnRvfSkpO3JldHVybiB0ZT90ZS5hZGRGZXR0aXMocW8pOih0ZT1DKFMscW8sSixBZSxXZSksdGUucHJvbWlzZSl9ZnVuY3Rpb24gVGUoYWUpe3ZhciBBZT1ZfHxiKGFlLCJkaXNhYmxlRm9yUmVkdWNlZE1vdGlvbiIsQm9vbGVhbiksV2U9YihhZSwiekluZGV4IixOdW1iZXIpO2lmKEFlJiZuZSlyZXR1cm4gdShmdW5jdGlvbih3ZSl7d2UoKX0pO1ImJnRlP1M9dGUuY2FudmFzOlImJiFTJiYoUz1PKFdlKSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKFMpKSxCJiYhUSYmSihTKTt2YXIgVmU9e3dpZHRoOlMud2lkdGgsaGVpZ2h0OlMuaGVpZ2h0fTtWJiYhUSYmVi5pbml0KFMpLFE9ITAsViYmKFMuX19jb25mZXR0aV9pbml0aWFsaXplZD0hMCk7ZnVuY3Rpb24gWCgpe2lmKFYpe3ZhciB3ZT17Z2V0Qm91bmRpbmdDbGllbnRSZWN0OmZ1bmN0aW9uKCl7aWYoIVIpcmV0dXJuIFMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9fTtKKHdlKSxWLnBvc3RNZXNzYWdlKHtyZXNpemU6e3dpZHRoOndlLndpZHRoLGhlaWdodDp3ZS5oZWlnaHR9fSk7cmV0dXJufVZlLndpZHRoPVZlLmhlaWdodD1udWxsfWZ1bmN0aW9uIE5lKCl7dGU9bnVsbCxCJiYoSD0hMSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsWCkpLFImJlMmJihkb2N1bWVudC5ib2R5LmNvbnRhaW5zKFMpJiZkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKFMpLFM9bnVsbCxRPSExKX1yZXR1cm4gQiYmIUgmJihIPSEwLHQuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIixYLCExKSksVj9WLmZpcmUoYWUsVmUsTmUpOmllKGFlLFZlLE5lKX1yZXR1cm4gVGUucmVzZXQ9ZnVuY3Rpb24oKXtWJiZWLnJlc2V0KCksdGUmJnRlLnJlc2V0KCl9LFRlfXZhciAkO2Z1bmN0aW9uIFcoKXtyZXR1cm4gJHx8KCQ9TChudWxsLHt1c2VXb3JrZXI6ITAscmVzaXplOiEwfSkpLCR9ZnVuY3Rpb24gTShTLHgsUixCLEgsWSxxKXt2YXIgVj1uZXcgUGF0aDJEKFMpLEo9bmV3IFBhdGgyRDtKLmFkZFBhdGgoVixuZXcgRE9NTWF0cml4KHgpKTt2YXIgUT1uZXcgUGF0aDJEO3JldHVybiBRLmFkZFBhdGgoSixuZXcgRE9NTWF0cml4KFtNYXRoLmNvcyhxKSpILE1hdGguc2luKHEpKkgsLU1hdGguc2luKHEpKlksTWF0aC5jb3MocSkqWSxSLEJdKSksUX1mdW5jdGlvbiBLKFMpe2lmKCFpKXRocm93IG5ldyBFcnJvcigicGF0aCBjb25mZXR0aSBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXIiKTt2YXIgeCxSO3R5cGVvZiBTPT0ic3RyaW5nIj94PVM6KHg9Uy5wYXRoLFI9Uy5tYXRyaXgpO3ZhciBCPW5ldyBQYXRoMkQoeCksSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSxZPUguZ2V0Q29udGV4dCgiMmQiKTtpZighUil7Zm9yKHZhciBxPTFlMyxWPXEsSj1xLFE9MCxuZT0wLHRlLGllLFRlPTA7VGU8cTtUZSs9Milmb3IodmFyIGFlPTA7YWU8cTthZSs9MilZLmlzUG9pbnRJblBhdGgoQixUZSxhZSwibm9uemVybyIpJiYoVj1NYXRoLm1pbihWLFRlKSxKPU1hdGgubWluKEosYWUpLFE9TWF0aC5tYXgoUSxUZSksbmU9TWF0aC5tYXgobmUsYWUpKTt0ZT1RLVYsaWU9bmUtSjt2YXIgQWU9MTAsV2U9TWF0aC5taW4oQWUvdGUsQWUvaWUpO1I9W1dlLDAsMCxXZSwtTWF0aC5yb3VuZCh0ZS8yK1YpKldlLC1NYXRoLnJvdW5kKGllLzIrSikqV2VdfXJldHVybnt0eXBlOiJwYXRoIixwYXRoOngsbWF0cml4OlJ9fWZ1bmN0aW9uIG9lKFMpe3ZhciB4LFI9MSxCPSIjMDAwMDAwIixIPSciQXBwbGUgQ29sb3IgRW1vamkiLCAiU2Vnb2UgVUkgRW1vamkiLCAiU2Vnb2UgVUkgU3ltYm9sIiwgIk5vdG8gQ29sb3IgRW1vamkiLCAiRW1vamlPbmUgQ29sb3IiLCAiQW5kcm9pZCBFbW9qaSIsICJUd2Vtb2ppIE1vemlsbGEiLCAic3lzdGVtIGVtb2ppIiwgc2Fucy1zZXJpZic7dHlwZW9mIFM9PSJzdHJpbmciP3g9UzooeD1TLnRleHQsUj0ic2NhbGFyImluIFM/Uy5zY2FsYXI6UixIPSJmb250RmFtaWx5ImluIFM/Uy5mb250RmFtaWx5OkgsQj0iY29sb3IiaW4gUz9TLmNvbG9yOkIpO3ZhciBZPTEwKlIscT0iIitZKyJweCAiK0gsVj1uZXcgT2Zmc2NyZWVuQ2FudmFzKFksWSksSj1WLmdldENvbnRleHQoIjJkIik7Si5mb250PXE7dmFyIFE9Si5tZWFzdXJlVGV4dCh4KSxuZT1NYXRoLmNlaWwoUS5hY3R1YWxCb3VuZGluZ0JveFJpZ2h0K1EuYWN0dWFsQm91bmRpbmdCb3hMZWZ0KSx0ZT1NYXRoLmNlaWwoUS5hY3R1YWxCb3VuZGluZ0JveEFzY2VudCtRLmFjdHVhbEJvdW5kaW5nQm94RGVzY2VudCksaWU9MixUZT1RLmFjdHVhbEJvdW5kaW5nQm94TGVmdCtpZSxhZT1RLmFjdHVhbEJvdW5kaW5nQm94QXNjZW50K2llO25lKz1pZStpZSx0ZSs9aWUraWUsVj1uZXcgT2Zmc2NyZWVuQ2FudmFzKG5lLHRlKSxKPVYuZ2V0Q29udGV4dCgiMmQiKSxKLmZvbnQ9cSxKLmZpbGxTdHlsZT1CLEouZmlsbFRleHQoeCxUZSxhZSk7dmFyIEFlPTEvUjtyZXR1cm57dHlwZToiYml0bWFwIixiaXRtYXA6Vi50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKSxtYXRyaXg6W0FlLDAsMCxBZSwtbmUqQWUvMiwtdGUqQWUvMl19fW4uZXhwb3J0cz1mdW5jdGlvbigpe3JldHVybiBXKCkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxuLmV4cG9ydHMucmVzZXQ9ZnVuY3Rpb24oKXtXKCkucmVzZXQoKX0sbi5leHBvcnRzLmNyZWF0ZT1MLG4uZXhwb3J0cy5zaGFwZUZyb21QYXRoPUssbi5leHBvcnRzLnNoYXBlRnJvbVRleHQ9b2V9KShmdW5jdGlvbigpe3JldHVybiB0eXBlb2Ygd2luZG93PCJ1Ij93aW5kb3c6dHlwZW9mIHNlbGY8InUiP3NlbGY6dGhpc3x8e319KCksb3AsITEpO3ZhciBodj1vcC5leHBvcnRzLHRSPW9wLmV4cG9ydHMuY3JlYXRlO3ZhciBndj0iWHJ4aEdXUGJibWdTQko2ZlNDVm5zNTdrIjtmdW5jdGlvbiBtbChlKXtsZXQgdD1lLnNldHRpbmdzW1ouTExNX1BST1ZJREVSX01PREVMXTtpZighdHx8dD09PSJub25lIilyZXR1cm5bXTtsZXQgbj1ocih0KXx8dCxyPXRwW25dO2lmKCFyfHxyLmxlbmd0aD09PTApcmV0dXJuW107bGV0IG89WnJbbl07cmV0dXJuIG8/W28sLi4uci5maWx0ZXIoYT0+YSE9PW8pXTpbLi4ucl19ZnVuY3Rpb24geXYoZSx0KXtsZXQgbj1vbih0KTtpZihuJiZlLnNldHRpbmdzW25dKXJldHVybiBlLnNldHRpbmdzW25dLnRyaW0oKTtsZXQgcj1lLnNldHRpbmdzWyJMTE0gQVBJIEtleSJdO2lmKHIpcmV0dXJuIHIudHJpbSgpO2lmKGRnKXRocm93IG5ldyBFcnJvcihgQ291bGRudCBmaW5kIGEgJHt0fSBrZXkgaW4gJHtKU09OLnN0cmluZ2lmeShPYmplY3Qua2V5cyhlLnNldHRpbmdzKSl9YCk7cmV0dXJuIGUuYWxlcnQoIlBsZWFzZSBjb25maWd1cmUgeW91ciBBUEkga2V5IGluIHBsdWdpbiBzZXR0aW5ncy4iKSxudWxsfWZ1bmN0aW9uIHZ2KGUsdCl7bGV0IG49YnIoZSkscj1lcFtuXTtyZXR1cm4gcj1yLnJlcGxhY2UoInttb2RlbC1uYW1lfSIsZSksbj09PSJnZW1pbmkiJiYocj1gJHtyfT9rZXk9JHt0fWApLHJ9ZnVuY3Rpb24gYnIoZSl7Zm9yKGxldFt0LG5db2YgT2JqZWN0LmVudHJpZXModHApKWlmKG4uaW5jbHVkZXMoZSkpcmV0dXJuIHQ7dGhyb3cgbmV3IEVycm9yKGBNb2RlbCAke2V9IG5vdCBmb3VuZCBpbiBhbnkgcHJvdmlkZXJgKX1mdW5jdGlvbiB4cihlKXtyZXR1cm57YW50aHJvcGljOiJBbnRocm9waWMiLGRlZXBzZWVrOiJEZWVwU2VlayIsZ2VtaW5pOiJHZW1pbmkiLGdyb2s6Ikdyb2siLG9wZW5haToiT3BlbkFJIixwZXJwbGV4aXR5OiJQZXJwbGV4aXR5In1bZV18fGUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKX1mdW5jdGlvbiB3dihlKXtsZXQgdCxuPWUudHJpbSgpLHI9bi5pbmRleE9mKCJbIiksbz1uLmluZGV4T2YoInsiKSxhPW4uaW5jbHVkZXMoIn0iKSxpPW4uaW5jbHVkZXMoIl0iKSxzPSExLGw9LTE7YSYmbz09PS0xJiYoZT1geyR7ZX1gLG89MCksaSYmcj09PS0xJiYoZT1gWyR7ZX1gLHI9MCkscj1lLmluZGV4T2YoIlsiKSxvPWUuaW5kZXhPZigieyIpLHIhPT0tMSYmKG89PT0tMXx8cjxvKT8ocz0hMCxsPXIpOm8hPT0tMT8ocz0hMSxsPW8pOihlPWB7JHtlfX1gLGw9MCxzPSExKTtsZXQgdT1zPyJdIjoifSIsYz1lLmxhc3RJbmRleE9mKHUpO2lmKGM9PT0tMSl7ZVtlLmxlbmd0aC0xXT09PSIsIiYmKGU9ZS5zdWJzdHJpbmcoMCxlLmxlbmd0aC0xKSk7bGV0IGQ9ZS5pbmNsdWRlcygiWyIpJiYhZS5pbmNsdWRlcygiXSIpLHA9ZS5pbmNsdWRlcygieyIpJiYhZS5pbmNsdWRlcygifSIpO2QmJnA/ZSs9In1dIjpkP2UrPSJdIjpwP2UrPSJ9IjplPXM/YCR7ZX1dYDpgJHtlfX1gfWVsc2UgZT1lLnN1YnN0cmluZyhsLGMrMSk7dHJ5e3JldHVybiB0PUpTT04ucGFyc2UoZSksdH1jYXRjaChkKXtsZXQgcD1lO2U9blMoZSksXyhgRmFpbGVkIHRvIHBhcnNlIGpzb25UZXh0IFNUQVJUOgoke3B9CkVORAogZHVlIHRvICR7ZH0uIEF0dGVtcHRlZCByZWJhbGFuY2UgeWllbGRlZDogJHtlfSAob3JpZ2luYWwgc2l6ZSAke3AubGVuZ3RofHwiKG51bGwpIn0sIHJlYmFsYW5jZSBzaXplICR7ZT8ubGVuZ3RofHwiKDApIn0pYCk7dHJ5e3JldHVybiB0PUpTT04ucGFyc2UoZSksdH1jYXRjaChoKXtfKCJSZWJhbGFuY2VkIGpzb25UZXh0IHN0aWxsIGZhaWxzIixoKX1sZXQgeT1lLnJlcGxhY2UoLyIiIi9nLCciXFwiIicpLnJlcGxhY2UoLyJcbi9nLCciXFxuJyk7aWYoeT15LnJlcGxhY2UoLyhbeyxdXHMqKShbYS16QS1aXyRdW2EtekEtWjAtOV8kXSopIjovZywnJDEiJDIiOicpLHk9eS5yZXBsYWNlKC9cblxzKlsn4oCc4oCdXS9nLGAKImApLnJlcGxhY2UoL1sn4oCc4oCdXSxccypcbi9nLGAiLApgKS5yZXBsYWNlKC9bJ+KAnOKAnV1ccyooW1xuXF1dKS8sJyIkMScpLHkhPT1lKXRyeXtyZXR1cm4gdD1KU09OLnBhcnNlKHkpLHR9Y2F0Y2goaCl7XygiUmVmb3JtYXR0ZWQgdGV4dCBzdGlsbCBmYWlscyIsaCl9fXJldHVybiBudWxsfWZ1bmN0aW9uIG5TKGUpe2xldCB0PWUuaW5kZXhPZigieyIpO2lmKHQ9PT0tMSlyZXR1cm4gbnVsbDtsZXQgbj1lLnN1YnN0cmluZyh0KS50cmltKCkscj1bXSxvPSIiO2ZvcihsZXQgYSBvZiBuKWlmKG8rPWEsYT09PSJ7Ij9yLnB1c2goIn0iKTphPT09In0iP3Jbci5sZW5ndGgtMV09PT0ifSImJnIucG9wKCk6YT09PSJbIj9yLnB1c2goIl0iKTphPT09Il0iJiZyW3IubGVuZ3RoLTFdPT09Il0iJiZyLnBvcCgpLHIubGVuZ3RoPT09MClicmVhaztyZXR1cm4gci5sZW5ndGgmJihfKCJGb3VuZCIsci5sZW5ndGgsImNoYXJhY3RlcnMgdG8gYXBwZW5kIHRvIGJhbGFuY2UiLG8sIi4gQWRkaW5nICIsci5yZXZlcnNlKCkuam9pbigiIikpLG8rPXIucmV2ZXJzZSgpLmpvaW4oIiIpKSxvfXZhciBidj0yO2Z1bmN0aW9uIGhsKGUpe2xldCB0PWUudHJpbSgpO3QuaW5kZXhPZigieyIpPT09LTEmJih0PSJ7Iit0KTtsZXQgcjt0LnNwbGl0KCJ9eyIpLmxlbmd0aD4xPyhyPXQuc3BsaXQoIn17IikubWFwKGk9PmAke2lbMF09PT0ieyI/IiI6InsifSR7aX0ke2lbaS5sZW5ndGgtMV09PT0ifSI/IiI6In0ifWApLF8oIlJlY2VpdmVkIG11bHRpcGxlIHJlc3BvbnNlcyBmcm9tIEFJLCBldmFsdWF0aW5nIGVhY2ggb2YiLHIpKTpyPVt0XTtsZXQgYT1yLm1hcChpPT53dihpKSkuZmlsdGVyKGk9PmkpO2lmKGEubGVuZ3RoKWlmKGEubGVuZ3RoPjEpe2xldCBpPWFbMF07cmV0dXJuIE9iamVjdC5lbnRyaWVzKGkpLmZvckVhY2goKFtzLGxdKT0+e2ZvcihsZXQgdSBvZiBhLnNsaWNlKDEpKXtsZXQgYz11W3NdO2MmJkFycmF5LmlzQXJyYXkoYykmJkFycmF5LmlzQXJyYXkobCkmJihpW3NdPVsuLi5uZXcgU2V0KFsuLi5sLC4uLmNdKV0uZmlsdGVyKGQ9PmQpKX19KSxpfWVsc2UgcmV0dXJuIGFbMF07cmV0dXJuIG51bGx9ZnVuY3Rpb24gclMoZSx0KXtsZXQgbjtzd2l0Y2goZSl7Y2FzZSJhbnRocm9waWMiOm49dD8uY29udGVudD8uYXQoMCk/LnRleHQ7YnJlYWs7Y2FzZSJnZW1pbmkiOm49dD8uY2FuZGlkYXRlcz8uYXQoMCk/LmNvbnRlbnQ/LnBhcnRzPy5hdCgwKT8udGV4dDticmVhaztjYXNlIm9sbGFtYSI6bj10Py5tZXNzYWdlPy5jb250ZW50fHx0Py5yZXNwb25zZTticmVhaztjYXNlImRlZXBzZWVrIjpjYXNlImdyb2siOmNhc2Uib3BlbmFpIjpjYXNlInBlcnBsZXhpdHkiOmRlZmF1bHQ6bj10Py5jaG9pY2VzPy5hdCgwKT8ubWVzc2FnZT8uY29udGVudHx8dD8uY2hvaWNlcz8uYXQoMCk/Lm1lc3NhZ2U/LnRvb2xfY2FsbHM/LmF0KDApPy5mdW5jdGlvbj8uYXJndW1lbnRzO2JyZWFrfXJldHVybiBufHxfKGBDb3VsZCBub3QgZXh0cmFjdCBjb250ZW50IGZyb20gJHtlfSByZXNwb25zZTpgLEpTT04uc3RyaW5naWZ5KHQsbnVsbCwyKSksbnx8bnVsbH1hc3luYyBmdW5jdGlvbiB4dihlLHQsbixyLG8sYSx7dGltZW91dFNlY29uZHM6aT0zMH09e30pe2xldCBzPWJyKG4pLGw7aWYobylsPWF3YWl0IG9TKGUsdCxuLCEwLG8pLGUuYWxlcnQobCx7c2Nyb2xsVG9FbmQ6ITB9KTtlbHNlIHRyeXthd2FpdCBQcm9taXNlLnJhY2UoW25ldyBQcm9taXNlKGFzeW5jKGMsZCk9PntsZXQgcD1hd2FpdCB0Lmpzb24oKTtsPXJTKHMscCksYyhsKX0pLG5ldyBQcm9taXNlKChjLGQpPT5zZXRUaW1lb3V0KCgpPT5kKG5ldyBFcnJvcihgJHtzfSBUaW1lb3V0YCkpLGkqMWUzKSldKX1jYXRjaChjKXt0aHJvdyBfKCJGYWlsZWQgdG8gcGFyc2UgcmVzcG9uc2UgZnJvbSIsbiwiZXJyb3IiLGMpLGN9bGV0IHU9bDtyZXR1cm4gbD1obChsKSwhYXx8YShsKT9sOih1JiZfKCJSZWNlaXZlZCIsdSwiYnV0IGNvdWxkIG5vdCBwYXJzZSBhcyBhIHZhbGlkIHJlc3VsdCIpLG51bGwpfWFzeW5jIGZ1bmN0aW9uIG9TKGUsdCxuLHIsbyl7cmV0dXJuIHR5cGVvZiBnbG9iYWw8InUiJiZ0eXBlb2YgZ2xvYmFsLmZldGNoPCJ1Ij9hd2FpdCBhUyhlLHQsbixyLG8pOmF3YWl0IGlTKGUsdCxuLHIsbyl9YXN5bmMgZnVuY3Rpb24gYVMoZSx0LG4scixvKXtsZXQgYT10LmJvZHksaT0hMSxzPSIiLGwsdTtyZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKGMsZCk9PntsZXQgcD0oKT0+e2xldCB5PTAsaD0oKT0+e2xldCB3PWEucmVhZCgpO2lmKHcpe3k9MDtsZXQgYj13LnRvU3RyaW5nKCk7aWYoe2Fib3J0OmksZmFpbGVkUGFyc2VDb250ZW50OmwsaW5jcmVtZW50YWxDb250ZW50czp1LHJlY2VpdmVkQ29udGVudDpzfT1vKGUsYixzLG4scixsKSxpfHwha3YodSxzKSl7YygpO3JldHVybn1oKCl9ZWxzZSB5Kz0xLHk8Mz9zZXRUaW1lb3V0KGgsYnYqMWUzKTpjKCl9O2goKX07YS5vbigicmVhZGFibGUiLHApfSksc31hc3luYyBmdW5jdGlvbiBpUyhlLHQsbixyLG8pe2xldCBhPXQuYm9keS5nZXRSZWFkZXIoKSxpPW5ldyBUZXh0RGVjb2RlcixzLGwsdSxjLGQ9MCxwPSIiO2Zvcig7IWw7KXtsZXQgeT1udWxsLGg9ITE7dHJ5e2F3YWl0IFByb21pc2UucmFjZShbe2RvbmU6aCx2YWx1ZTp5fT1hd2FpdCBhLnJlYWQoKSxuZXcgUHJvbWlzZSgodyxiKT0+c2V0VGltZW91dCgoKT0+YihuZXcgRXJyb3IoIlRpbWVvdXQiKSksYnYqMWUzKSldKX1jYXRjaCh3KXtsPXcsXygiRmFpbGVkIHRvIHJlY2VpdmUgZnVydGhlciBzdHJlYW0gZGF0YSBpbiB0aW1lIix3KTticmVha31pZihofHxkPjMpe18oIkNvbXBsZXRlZCBnZW5lcmF0aW5nIHJlc3BvbnNlIGxlbmd0aCIpO2JyZWFrfWVsc2UgaWYoeSl7bGV0IHc9aS5kZWNvZGUoeSx7c3RyZWFtOiEwfSk7dHJ5e2lmKHR5cGVvZiB3PT0ic3RyaW5nIil7ZD0wO2xldCBiPW8oZSx3LHAsbixyLHUpO2lmKGIpe2lmKHthYm9ydDpzLGZhaWxlZFBhcnNlQ29udGVudDp1LGluY3JlbWVudGFsQ29udGVudHM6YyxyZWNlaXZlZENvbnRlbnQ6cH09YixzfHwha3YoYyxwKSlicmVha31lbHNlIF8oIkZhaWxlZCB0byBwYXJzZSBzdHJlYW0gZnJvbSIseSwiYXMgSlNPTiIpLGQrPTF9ZWxzZSBfKCJGYWlsZWQgdG8gcGFyc2Ugc3RyZWFtIGZyb20iLHksImFzIEpTT04iKSxkKz0xfWNhdGNoKGIpe18oIlRoZXJlIHdhcyBhbiBlcnJvciBwYXJzaW5nIHRoZSByZXNwb25zZSBmcm9tIHN0cmVhbToiLGIpO2JyZWFrfX1lbHNlIGQrPTF9cmV0dXJuIHB9ZnVuY3Rpb24ga3YoZSx0KXtsZXQgbjtpZihlPy5sZW5ndGgmJih0Py5sZW5ndGh8fDApPj1aYyl7bGV0IHI9dC5yZXBsYWNlKC9cbi9nLCIgIik7bj1yLnN1YnN0cmluZyhyLmxlbmd0aC1aYykudHJpbSgpPT09IiIsbiYmXygiUmVzcG9uc2UgZXhjZWVkcyBlbXB0eSBzcGFjZSB0aHJlc2hvbGQuIEFib3J0aW5nIil9cmV0dXJuIW59dmFyIHNTPTMwO2FzeW5jIGZ1bmN0aW9uIGxTKGUsdCxuLHthaU1vZGVsOnI9bnVsbCxhcGlLZXk6bz1udWxsLGNvbmN1cnJlbmN5OmE9MSxqc29uUmVzcG9uc2U6aT0hMSx0aW1lb3V0U2Vjb25kczpzPW51bGx9PXt9KXtsZXQgbD1tbChlKTtyJiYobD1sLmZpbHRlcih3PT53IT09ciksbC51bnNoaWZ0KHIpKTtsZXQgdT1sLnNoaWZ0KCksYz1be3JvbGU6InVzZXIiLGNvbnRlbnQ6bn1dLGQ9cz97dGltZW91dFNlY29uZHM6c306e307byYmKGQuYXBpS2V5PW8pO2xldCBwPWF3YWl0IGRTKGUsYyx1LGQpLGg9YXdhaXQgeHYoZSxwLHUsaT8ibGxtUHJvbXB0SnNvbiI6bnVsbCxudWxsLG51bGwpO3JldHVybiBoJiZpJiZ0eXBlb2YgaD09InN0cmluZyI/aGwoaCk6aH1hc3luYyBmdW5jdGlvbiBTdihlLHQsbj17fSl7dHJ5e2xldCByPWF3YWl0IGUuY2FsbFBsdWdpbih7dXVpZDpndn0sdCk7aWYocilyZXR1cm4gXygiW2xsbVByb21wdFdpdGhQbHVnaW5GYWxsYmFja10gY2FsbFBsdWdpbiByZXR1cm5lZCIsciwiLCBza2lwcGluZyBMTE0gZmFsbGJhY2siKSxuLmpzb25SZXNwb25zZSYmdHlwZW9mIHI9PSJzdHJpbmciP2hsKHIpOnI7XygiW2xsbVByb21wdFdpdGhQbHVnaW5GYWxsYmFja10gY2FsbFBsdWdpbiByZXR1cm5lZCBmYWxzeSwgZmFsbGluZyBiYWNrIHRvIGxsbVByb21wdCIpfWNhdGNoKHIpe18oIltsbG1Qcm9tcHRXaXRoUGx1Z2luRmFsbGJhY2tdIGNhbGxQbHVnaW4gZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gbGxtUHJvbXB0OiIscil9cmV0dXJuIGxTKGUsbnVsbCx0LG4pfWZ1bmN0aW9uIHVTKGUsdCl7bGV0IG49eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn07c3dpdGNoKGUpe2Nhc2UiYW50aHJvcGljIjpyZXR1cm57Li4ubiwieC1hcGkta2V5Ijp0LCJhbnRocm9waWMtZGFuZ2Vyb3VzLWRpcmVjdC1icm93c2VyLWFjY2VzcyI6InRydWUiLCJhbnRocm9waWMtdmVyc2lvbiI6IjIwMjMtMDYtMDEifTtjYXNlImdlbWluaSI6cmV0dXJuIG47ZGVmYXVsdDpyZXR1cm57Li4ubixBdXRob3JpemF0aW9uOmBCZWFyZXIgJHt0fWB9fX1mdW5jdGlvbiBjUyhlLHQsbixyLHtwcm9tcHRLZXk6bz1udWxsfT17fSl7bGV0IGE7c3dpdGNoKGJyKHQpKXtjYXNlImFudGhyb3BpYyI6e2xldCBzPWUuZmluZCh1PT51LnJvbGU9PT0ic3lzdGVtIiksbD1lLmZpbHRlcih1PT51LnJvbGUhPT0ic3lzdGVtIik7YT17bWF4X3Rva2Vuczo0MDk2LG1vZGVsOnQsbWVzc2FnZXM6bH0sbiYmKGEuc3RyZWFtPW4pLHMmJihhLnN5c3RlbT1zLmNvbnRlbnQpO2JyZWFrfWNhc2UiZ2VtaW5pIjp7bGV0IHM9ZS5maW5kKHU9PnUucm9sZT09PSJzeXN0ZW0iKTthPXtjb250ZW50czplLmZpbHRlcih1PT51LnJvbGUhPT0ic3lzdGVtIikubWFwKHU9Pih7cm9sZTp1LnJvbGU9PT0iYXNzaXN0YW50Ij8ibW9kZWwiOiJ1c2VyIixwYXJ0czpbe3RleHQ6dS5jb250ZW50fV19KSl9LHMmJihhLnN5c3RlbUluc3RydWN0aW9uPXtwYXJ0czpbe3RleHQ6cy5jb250ZW50fV19KSxhLmdlbmVyYXRpb25Db25maWc9e3Jlc3BvbnNlTWltZVR5cGU6ImFwcGxpY2F0aW9uL2pzb24ifTticmVha31jYXNlImdyb2siOmNhc2UicGVycGxleGl0eSI6YT17bW9kZWw6dCxtZXNzYWdlczplfSxuJiYoYS5zdHJlYW09biksciYmKGEudG9vbHM9cik7YnJlYWs7Y2FzZSJkZWVwc2VlayI6e2E9e21vZGVsOnQsbWVzc2FnZXM6ZX0sbiYmKGEuc3RyZWFtPW4pLHImJihhLnRvb2xzPXIpLGEucmVzcG9uc2VfZm9ybWF0PXt0eXBlOiJqc29uX29iamVjdCJ9O2JyZWFrfWNhc2Uib3BlbmFpIjpkZWZhdWx0OnthPXttb2RlbDp0LG1lc3NhZ2VzOmV9LG4mJihhLnN0cmVhbT1uKSxyJiYoYS50b29scz1yKSxhLnJlc3BvbnNlX2Zvcm1hdD17dHlwZToianNvbl9vYmplY3QifTticmVha319cmV0dXJuIGF9YXN5bmMgZnVuY3Rpb24gZFMoZSx0LG4se2FwaUtleTpyPW51bGwsYXR0ZW1wdE51bWJlcjpvPTEscHJvbXB0S2V5OmE9bnVsbCxzdHJlYW06aT1udWxsLHRpbWVvdXRTZWNvbmRzOnM9c1MsdG9vbHM6bD1udWxsfT17fSl7bGV0IHU9YnIobik7bz4wJiZfKGBBdHRlbXB0ICMke299OiBUcnlpbmcgJHtufSB3aXRoICR7YXx8Im5vIHByb21wdEtleSJ9YCkscnx8KHI9eXYoZSx1KSk7bGV0IGM9Y1ModCxuLGksbCx7cHJvbXB0S2V5OmF9KSxkPXZ2KG4scik7XyhgQ2FsbGluZyAke3V9IGF0ICR7ZH0gd2l0aCBib2R5ICR7SlNPTi5zdHJpbmdpZnkoYyl9IGF0ICR7bmV3IERhdGV9YCk7bGV0IHA9dVModSxyKSx5PWF3YWl0IFByb21pc2UucmFjZShbZmV0Y2goZCx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnAsYm9keTpKU09OLnN0cmluZ2lmeShjKX0pLG5ldyBQcm9taXNlKChoLHcpPT5zZXRUaW1lb3V0KCgpPT53KG5ldyBFcnJvcigiVGltZW91dCIpKSxzKjFlMykpXSk7aWYoIXkub2spe2xldCBoPW5ldyBFcnJvcihgUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgJHt5LnN0YXR1c31gKTt0aHJvdyBoLnJlc3BvbnNlPXksaH1yZXR1cm4geX12YXIgcFM9WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdLGZTPTUwLG1TPTJlMyxoUz0zZTMsZ1M9MWUzLHlTPTFlMyxEdj01MDAsRXY9ODY0MDAsdWk9MWUxMCx2Uz02MCxUdj0zLHdTPTIwMCxiUz00MDEseFM9NDAzLGtTPTEsU1M9MTAsRVM9NSxUUz03LE5TPTUsRFM9LjUsX1M9MyxBUz0yMCxDUz0xNSxPUz0xNSxNUz04LFJTPTI1LElTPTIwLFBTPTEyLExTPTUselM9NSxGUz0zLFVTPTE1LCRTPTEwLEJTPTUsTnY9MSxXUz0zLEhTPTcsalM9InN1ZyIsVlM9MWU2LEdTPS4xO2FzeW5jIGZ1bmN0aW9uIF92KGUsdD17fSl7bGV0IG49Y0UodCkscj1uZXcgRGF0ZSxvPXBTW3IuZ2V0RGF5KCldLGE9SGFbci5nZXRNb250aCgpXSxpPXIuZ2V0RGF5KCk9PT0wfHxyLmdldERheSgpPT09NixzPWF3YWl0IFlTKGUsbiksbD1hd2FpdCBRUyhlKSx1PWVFKG4scyxsKTtpZih1KXJldHVybiB1O2xldCBjPXRFKG4scy5jYWNoZWQudGFza3MubGVuZ3RoKSxkPW5FKGwub3BlblRhc2tzLG4uZXhjbHVkZVV1aWRzKSxwPWF3YWl0IHJFKGUsYSxzLmV4aXN0aW5nQ29udGVudCkseT1LUyhyLG8sYSk7aWYoISEhKHAucXVhcnRlcmx5Q29udGVudHx8cC5tb250aGx5Q29udGVudHx8cC53ZWVrbHlDb250ZW50KSYmZC5sZW5ndGg9PT0wKXJldHVybnt0YXNrczpbXSxlcnJvcjoiTm8gcGxhbm5pbmcgZGF0YSBvciB0YXNrcyBmb3VuZCB0byBnZW5lcmF0ZSBzdWdnZXN0aW9ucyBmcm9tLiBQb3B1bGF0ZSB5b3VyIHF1YXJ0ZXJseSBhbmQvb3IgbW9udGhseSBwbGFuIHRvIHJlY2VpdmUgQUktc3VnZ2VzdGVkIHRhc2tzLiIsZXJyb3JDb2RlOiJub19wbGFubmluZ19kYXRhIixub3RlVVVJRDpzLm5vdGVIYW5kbGUudXVpZH07bGV0IHc9YXdhaXQgb0Uoe2FwcDplLGNhbmRpZGF0ZVRhc2tzOmQsZGF0ZUhlYWRpbmc6eSxkYXlOYW1lOm8saXNXZWVrZW5kOmksbm90ZVV1aWRGcm9tVGFza1V1aWQ6bC5ub3RlVXVpZEZyb21UYXNrVXVpZCxwYXJzZWRPcHRpb25zOm4scGxhbm5pbmdDb250ZXh0OnAscmVxdWVzdGVkU3VnZ2VzdGlvbkNvdW50OmMucmVxdWVzdGVkU3VnZ2VzdGlvbkNvdW50fSk7cmV0dXJuIHcuZXJyb3I/e3Rhc2tzOltdLGVycm9yOncuZXJyb3IsZXJyb3JDb2RlOncuZXJyb3JDb2RlLGVycm9yRGV0YWlsOncuZXJyb3JEZXRhaWwsbm90ZVVVSUQ6cy5ub3RlSGFuZGxlLnV1aWR9Oihhd2FpdCBsRShlLHMuZXhpc3RpbmdDb250ZW50LHcuZ29hbHNTdW1tYXJ5LHcubGxtQXR0cmlidXRpb25Gb290ZXIscy5ub3RlSGFuZGxlLHcuZW5mb3JjZWRUYXNrcyksdUUocyxsLHcpKX1mdW5jdGlvbiBLUyhlLHQsbil7cmV0dXJuYCR7dH0gJHtufSAke2UuZ2V0RGF0ZSgpfSwgJHtlLmdldEZ1bGxZZWFyKCl9YH1hc3luYyBmdW5jdGlvbiBZUyhlLHQpe2xldCBuPWF3YWl0IHFTKGUsdC5ub3RlTmFtZSx0LmV4aXN0aW5nTm90ZUhhbmRsZSkscj1hd2FpdCBlLmdldE5vdGVDb250ZW50KHt1dWlkOm4udXVpZH0pLG89dHlwZW9mIHI9PSJzdHJpbmciP3IucmVwbGFjZSgvXHJcbi9nLGAKYCk6IiI7cmV0dXJue25vdGVIYW5kbGU6bixleGlzdGluZ0NvbnRlbnQ6byxjYWNoZWQ6bUUobyl9fWFzeW5jIGZ1bmN0aW9uIHFTKGUsdCxuKXtsZXQgcj1uPy51dWlkP246YXdhaXQgZS5maW5kTm90ZSh7bmFtZTp0LHRhZ3M6W1hlXX0pO2lmKHIpcmV0dXJuIHI7bGV0IG89YXdhaXQgZS5jcmVhdGVOb3RlKHQsW1hlXSx7YXJjaGl2ZTohMH0pO3JldHVybiBfKGBbZHJlYW0tdGFza10gQ3JlYXRlZCBkYWlseSBub3RlICIke3R9IiB3aXRoIHV1aWQgJHtvfWApLHt1dWlkOm99fWFzeW5jIGZ1bmN0aW9uIFFTKGUpe2xldCB0PWF3YWl0IHBFKGUpLG49dD9hd2FpdCBlLmdldFRhc2tEb21haW5UYXNrcyh0KTpbXSxyPW4uZmlsdGVyKGw9PiFsLmNvbXBsZXRlZEF0JiYhbC5kaXNtaXNzZWRBdCk7XyhgW2RyZWFtLXRhc2tdIEZvdW5kICR7ci5sZW5ndGh9IG9wZW4gdGFza3MgZnJvbSBkb21haW4gJHt0fWApO2xldCBvPWF3YWl0IEpTKGUsciksYT1aUyhyKSxpPVhTKHIpLHM9ZkUobik7cmV0dXJuIF8oYFtkcmVhbS10YXNrXSBEZWZhdWx0IG5vdGUgZm9yIG5ldyB0YXNrczogJHtzfWApLHthbGxUYXNrczpuLGRlZmF1bHROb3RlVVVJRDpzLGRvbWFpblV1aWQ6dCxuYXRpdmVUYXNrRnJvbVRhc2tVdWlkOmEsbm90ZU5hbWVGcm9tTm90ZVV1aWQ6byxub3RlVXVpZEZyb21UYXNrVXVpZDppLG9wZW5UYXNrczpyfX1hc3luYyBmdW5jdGlvbiBKUyhlLHQpe2xldCBuPW5ldyBTZXQ7Zm9yKGxldCBvIG9mIHQpby5ub3RlVVVJRCYmbi5hZGQoby5ub3RlVVVJRCk7bGV0IHI9bmV3IE1hcDtmb3IobGV0IG8gb2YgdCl7aWYoIW8ubm90ZVVVSUQpY29udGludWU7bGV0IGE9KG8ubm90ZU5hbWV8fG8ubm90ZVRpdGxlfHwiIikudHJpbSgpO2EmJnIuc2V0KG8ubm90ZVVVSUQsYSl9cmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKFsuLi5uXS5tYXAoYXN5bmMgbz0+e2lmKCFyLmhhcyhvKSl0cnl7bGV0IGE9YXdhaXQgZS5maW5kTm90ZSh7dXVpZDpvfSk7YT8ubmFtZSYmci5zZXQobyxhLm5hbWUpfWNhdGNoKGEpe18oIltkcmVhbS10YXNrXSBmaW5kTm90ZSh7IHV1aWQgfSkgZmFpbGVkOiIsbyxhKX19KSkscn1mdW5jdGlvbiBYUyhlKXtsZXQgdD1uZXcgTWFwO2ZvcihsZXQgbiBvZiBlKW4udXVpZCYmbi5ub3RlVVVJRCYmdC5zZXQobi51dWlkLG4ubm90ZVVVSUQpO3JldHVybiB0fWZ1bmN0aW9uIFpTKGUpe2xldCB0PW5ldyBNYXA7Zm9yKGxldCBuIG9mIGUpbi51dWlkJiZ0LnNldChuLnV1aWQsbik7cmV0dXJuIHR9ZnVuY3Rpb24gZUUoZSx0LG4pe2xldCByPU1hdGgubWF4KDEsZS5taW5pbXVtVGFza0NvdW50fHwxKTtpZihlLmZvcmNlUmVmcmVzaHx8dC5jYWNoZWQudGFza3MubGVuZ3RoPHIpcmV0dXJuIG51bGw7XyhgW2RyZWFtLXRhc2tdIFVzaW5nICR7dC5jYWNoZWQudGFza3MubGVuZ3RofSBjYWNoZWQgZGFpbHkgc3VnZ2VzdGlvbnMgZnJvbSBub3RlYCk7bGV0e25hdGl2ZVRhc2tGcm9tVGFza1V1aWQ6byxub3RlTmFtZUZyb21Ob3RlVXVpZDphLG5vdGVVdWlkRnJvbVRhc2tVdWlkOml9PW47cmV0dXJue3Rhc2tzOnQuY2FjaGVkLnRhc2tzLmZpbHRlcihsPT4hT3YobCkpLm1hcChsPT5BdihNdihsKSx7bmF0aXZlVGFza0Zyb21UYXNrVXVpZDpvLG5vdGVOYW1lRnJvbU5vdGVVdWlkOmEsbm90ZVV1aWRGcm9tVGFza1V1aWQ6aX0pKSxnb2Fsc1N1bW1hcnk6dC5jYWNoZWQuZ29hbHNTdW1tYXJ5LGNhY2hlZDohMCxub3RlVVVJRDp0Lm5vdGVIYW5kbGUudXVpZCxkZWZhdWx0Tm90ZVVVSUQ6bi5kZWZhdWx0Tm90ZVVVSUQsc2hvd25VdWlkczpbXSxsbG1BdHRyaWJ1dGlvbkZvb3RlcjpzRSh0LmV4aXN0aW5nQ29udGVudCl9fWZ1bmN0aW9uIEF2KGUse25hdGl2ZVRhc2tGcm9tVGFza1V1aWQ6dCxub3RlTmFtZUZyb21Ob3RlVXVpZDpuLG5vdGVVdWlkRnJvbVRhc2tVdWlkOnJ9KXtsZXQgbz1lLnV1aWQmJnQuZ2V0KGUudXVpZCl8fG51bGwsYT1lLnV1aWQmJnIuZ2V0KGUudXVpZCl8fG51bGwsaT1lLmlzRXhpc3RpbmchPT12b2lkIDA/ZS5pc0V4aXN0aW5nOiEhZS51dWlkLHM9YSYmbiYmbi5nZXQoYSl8fG51bGw7cmV0dXJuey4uLmUsbm90ZVVVSUQ6YSxpc0V4aXN0aW5nOmksbmF0aXZlVGFzazpvLHNvdXJjZU5vdGVOYW1lOnN9fWZ1bmN0aW9uIHRFKGUsdCl7bGV0IG49TWF0aC5tYXgoMSxlLm1pbmltdW1UYXNrQ291bnR8fDEpLHI9TWF0aC5tYXgoMCxuLXQpO3JldHVybntyZXF1ZXN0ZWRTdWdnZXN0aW9uQ291bnQ6ZS5mb3JjZVJlZnJlc2g/TWF0aC5tYXgoVHYsbik6TWF0aC5tYXgoVHYscil9fWZ1bmN0aW9uIG5FKGUsdCl7bGV0IG49dCYmdC5zaXplPjA/ZS5maWx0ZXIocj0+IXQuaGFzKHIudXVpZCkpOmU7cmV0dXJuIF8oYFtkcmVhbS10YXNrXSBBZnRlciBleGNsdXNpb246ICR7bi5sZW5ndGh9IGNhbmRpZGF0ZSB0YXNrcyAoJHtlLmxlbmd0aC1uLmxlbmd0aH0gZXhjbHVkZWQpYCksbn1hc3luYyBmdW5jdGlvbiByRShlLHQsbil7bGV0IG89YCR7aWQoKS5sYWJlbH0gUGxhbmAsaT0oYXdhaXQgZS5maWx0ZXJOb3Rlcyh7cXVlcnk6b30pKS5maW5kKGQ9PmQubmFtZT09PW8pLHM9bnVsbCxsPW51bGwsdT1udWxsO2lmKGkpe2xldCBkPWF3YWl0IGUuZ2V0Tm90ZUNvbnRlbnQoe3V1aWQ6aS51dWlkfSk7aWYoZCl7cz1kLGw9Rm8oZCx0KTtsZXQgcD1HcyhWcygpKTt1PUZvKGQscCl9fWxldCBjPW4/bi5zdWJzdHJpbmcoMCxtUyk6bnVsbDtyZXR1cm57cXVhcnRlcmx5Q29udGVudDpzLG1vbnRobHlDb250ZW50Omwsd2Vla2x5Q29udGVudDp1LHByZXZpb3VzQW5hbHlzZXM6Y319YXN5bmMgZnVuY3Rpb24gb0UoZSl7bGV0e2FwcDp0LGNhbmRpZGF0ZVRhc2tzOm4sZGF0ZUhlYWRpbmc6cixkYXlOYW1lOm8saXNXZWVrZW5kOmEsbm90ZVV1aWRGcm9tVGFza1V1aWQ6aSxwYXJzZWRPcHRpb25zOnMscGxhbm5pbmdDb250ZXh0OmwscmVxdWVzdGVkU3VnZ2VzdGlvbkNvdW50OnV9PWUsYz13RShuKSxkPWMubWFwKG09PmJFKG0pKTtfKGBbZHJlYW0tdGFza10gU2VsZWN0ZWQgJHtkLmxlbmd0aH0gdG9wIHRhc2tzIGZyb20gJHtuLmxlbmd0aH0gY2FuZGlkYXRlIHRhc2tzIGZvciBMTE0gYW5hbHlzaXNgKTtsZXQgcD14RSh7ZGF0ZUhlYWRpbmc6cixkYXlOYW1lOm8saXNXZWVrZW5kOmEsdGFza0pzb25PYmplY3RzOmQscXVhcnRlcmx5Q29udGVudDpsLnF1YXJ0ZXJseUNvbnRlbnQsbW9udGhseUNvbnRlbnQ6bC5tb250aGx5Q29udGVudCx3ZWVrbHlDb250ZW50Omwud2Vla2x5Q29udGVudCxwcmV2aW91c0FuYWx5c2VzOmwucHJldmlvdXNBbmFseXNlcyxvcGVuVGFza0NvdW50Om4ubGVuZ3RoLHJlcXVlc3RlZFN1Z2dlc3Rpb25Db3VudDp1fSkseTt0cnl7XygiW2RyZWFtLXRhc2tdIFNlbmRpbmcgcHJvbXB0IHRvIExMTSwgbGVuZ3RoOiIscC5sZW5ndGgpLHk9YXdhaXQgU3YodCxwLEN2KHQscykpfWNhdGNoKG0pe18oIltkcmVhbS10YXNrXSBMTE0gY2FsbCBmYWlsZWQ6IixtKTtsZXQgdj1tLnJlc3BvbnNlPy5zdGF0dXM7cmV0dXJuIHY9PT1iU3x8dj09PXhTP3tlcnJvcjoiVGhlIEFQSSBrZXkgYXBwZWFycyB0byBiZSBpbnZhbGlkIG9yIHVuYXV0aG9yaXplZC4iLGVycm9yQ29kZToiaW52YWxpZF9hcGlfa2V5In06e2Vycm9yOmBMTE0gcmVxdWVzdCBmYWlsZWQgKCR7bS5tZXNzYWdlfHwidW5rbm93biBlcnJvciJ9KS4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci5gLGVycm9yQ29kZToibGxtX2Vycm9yIixlcnJvckRldGFpbDptLm1lc3NhZ2V8fG51bGx9fWlmKCF5fHwheS50YXNrcylyZXR1cm4gXygiW2RyZWFtLXRhc2tdIExMTSByZXR1cm5lZCBpbnZhbGlkIHJlc3BvbnNlOiIseSkse2Vycm9yOiJVbmFibGUgdG8gcHJvY2VzcyB0aGUgQUkgcHJvdmlkZXIncyByZXNwb25zZSBpbnRvIHRhc2sgc3VnZ2VzdGlvbnMuIixlcnJvckNvZGU6InBhcnNlX2Vycm9yIixlcnJvckRldGFpbDp5P0pTT04uc3RyaW5naWZ5KHkpLnN1YnN0cmluZygwLHdTKToiZW1wdHkgcmVzcG9uc2UifTtsZXQgaD1uZXcgU2V0KG4ubWFwKG09Pm0udXVpZCkuZmlsdGVyKEJvb2xlYW4pKSx3PWhFKHkudGFza3MsaCx1KSxiPWdFKHZFKGksdyxjKSksZz15RSh5LmdvYWxzU3VtbWFyeSk7cmV0dXJue2VuZm9yY2VkVGFza3M6Yixnb2Fsc1N1bW1hcnk6ZyxsbG1BdHRyaWJ1dGlvbkZvb3RlcjppRSh0LHMpfX1mdW5jdGlvbiBDdihlLHQ9e30pe2xldCBuPXtqc29uUmVzcG9uc2U6ITAsdGltZW91dFNlY29uZHM6dlN9LHI9dC5wcm92aWRlckVtT3ZlcnJpZGV8fG51bGw7aWYocil7bGV0IHM9WnJbcl18fG51bGwsbD1vbihyKSx1PWw/KGUuc2V0dGluZ3M/LltsXXx8IiIpLnRyaW0oKToiIjtpZihzJiZ1KXJldHVybiBuLmFpTW9kZWw9cyxuLmFwaUtleT11LG59bGV0IG89ZS5zZXR0aW5ncz8uW1ouTExNX1BST1ZJREVSX01PREVMXSxhPWhyKG8pO3JldHVybiBMbiYmcHJvY2Vzcy5lbnYuT1BFTl9BSV9BQ0NFU1NfVE9LRU4mJmE9PT0ib3BlbmFpIiYmKG4uYWlNb2RlbD1aci5vcGVuYWksbi5hcGlLZXk9cHJvY2Vzcy5lbnYuT1BFTl9BSV9BQ0NFU1NfVE9LRU4sXygiW2RyZWFtLXRhc2tdIERldiBtb2RlOiB1c2luZyBPUEVOX0FJX0FDQ0VTU19UT0tFTiB3aXRoIE9wZW5BSSAoZGFzaGJvYXJkIHByb3ZpZGVyIGlzIE9wZW5BSSkiKSksbn1mdW5jdGlvbiBhRShlLHQ9e30pe2xldCBuPUN2KGUsdCkscj1tbChlKSxvPW4uYWlNb2RlbD8/bnVsbDtyZXR1cm4gbyYmKHI9ci5maWx0ZXIoYT0+YSE9PW8pLHIudW5zaGlmdChvKSksclswXT8/bnVsbH1mdW5jdGlvbiBpRShlLHQ9e30pe2xldCBuPWFFKGUsdCk7aWYoIW4pcmV0dXJuIG51bGw7dHJ5e2xldCByPWJyKG4pO3JldHVybmBHZW5lcmF0ZWQgYnkgJHt4cihyKX0gXHhCNyAke259YH1jYXRjaHtyZXR1cm5gR2VuZXJhdGVkIGJ5ICR7bn1gfX1mdW5jdGlvbiBzRShlKXtpZighZXx8dHlwZW9mIGUhPSJzdHJpbmciKXJldHVybiBudWxsO2xldCBuPWUucmVwbGFjZSgvXHJcbi9nLGAKYCkubWF0Y2goL1xuLS0tXHMqXG5cbj5ccyooW15cbl0rKS8pO3JldHVybiBuP25bMV0udHJpbSgpOm51bGx9YXN5bmMgZnVuY3Rpb24gbEUoZSx0LG4scixvLGEpe2xldCBpPWBEcmVhbVRhc2sgc3VnZ2VzdGlvbnMgZ2VuZXJhdGVkICR7bmV3IERhdGUoKS50b0xvY2FsZVN0cmluZyhbXSx7aG91cjoiMi1kaWdpdCIsbWludXRlOiIyLWRpZ2l0IixzZWNvbmQ6IjItZGlnaXQifSl9YCxzPWtFKGksbixyLGEpLGw9ZEUocyx0KTt0cnl7YXdhaXQgZS5yZXBsYWNlTm90ZUNvbnRlbnQobyxsKSxfKCJbZHJlYW0tdGFza10gUHJlcGVuZGVkIGdlbmVyYXRlZCBzdWdnZXN0aW9ucyB0byBkYWlseSBub3RlIiksXygiW2RyZWFtLXRhc2tdIFBlcnNpc3RlZCBMTE0gYXR0cmlidXRpb24gaW4gZGFpbHkgbm90ZSAoZGF0YSBzdG9yZSk6IixyPz8iKG5vbmUpIil9Y2F0Y2godSl7XygiW2RyZWFtLXRhc2tdIEZhaWxlZCB0byB3cml0ZSB0byBkYWlseSBub3RlOiIsdSl9fWZ1bmN0aW9uIHVFKGUsdCxuKXtsZXQgcj1uLmVuZm9yY2VkVGFza3MuZmlsdGVyKGw9PmwudXVpZCkubWFwKGw9PmwudXVpZCkse25hdGl2ZVRhc2tGcm9tVGFza1V1aWQ6byxub3RlTmFtZUZyb21Ob3RlVXVpZDphLG5vdGVVdWlkRnJvbVRhc2tVdWlkOml9PXQ7cmV0dXJue3Rhc2tzOlsuLi5uLmVuZm9yY2VkVGFza3MsLi4uZS5jYWNoZWQudGFza3NdLmZpbHRlcihsPT4hT3YobCkpLm1hcChsPT5BdihNdihsKSx7bmF0aXZlVGFza0Zyb21UYXNrVXVpZDpvLG5vdGVOYW1lRnJvbU5vdGVVdWlkOmEsbm90ZVV1aWRGcm9tVGFza1V1aWQ6aX0pKSxnb2Fsc1N1bW1hcnk6bi5nb2Fsc1N1bW1hcnksY2FjaGVkOiExLG5vdGVVVUlEOmUubm90ZUhhbmRsZS51dWlkLGRlZmF1bHROb3RlVVVJRDp0LmRlZmF1bHROb3RlVVVJRCxzaG93blV1aWRzOnIsbGxtQXR0cmlidXRpb25Gb290ZXI6bi5sbG1BdHRyaWJ1dGlvbkZvb3Rlcj8/bnVsbH19ZnVuY3Rpb24gT3YoZSl7cmV0dXJuISEoZT8uY29tcGxldGVkQXR8fGU/LnJlbW92ZWRBdCl9ZnVuY3Rpb24gTXYoZSl7cmV0dXJuIGU/LnN1Z2dlc3Rpb25JZD9lOnsuLi5lLHN1Z2dlc3Rpb25JZDpSdigpfX1mdW5jdGlvbiBjRShlKXtpZihlIGluc3RhbmNlb2YgU2V0KXJldHVybntleGNsdWRlVXVpZHM6ZSxmb3JjZVJlZnJlc2g6ITEsbWluaW11bVRhc2tDb3VudDoxLG5vdGVOYW1lOmBEYXNoYm9hcmQgcHJvcG9zZWQgdGFza3MgZm9yICR7bmV3IERhdGUoKS50b0xvY2FsZVN0cmluZyhbXSx7eWVhcjoibnVtZXJpYyIsbW9udGg6ImxvbmciLGRheToibnVtZXJpYyJ9KX1gLGV4aXN0aW5nTm90ZUhhbmRsZTpudWxsfTtsZXQgdD1lJiZ0eXBlb2YgZT09Im9iamVjdCI/ZTp7fTtyZXR1cm57ZXhjbHVkZVV1aWRzOnQuZXhjbHVkZVV1aWRzIGluc3RhbmNlb2YgU2V0P3QuZXhjbHVkZVV1aWRzOm51bGwsZm9yY2VSZWZyZXNoOiEhdC5mb3JjZVJlZnJlc2gsbWluaW11bVRhc2tDb3VudDpNYXRoLm1heCgxLHBhcnNlSW50KHQubWluaW11bVRhc2tDb3VudCwxMCl8fDEpLHByb3ZpZGVyRW1PdmVycmlkZTp0LnByb3ZpZGVyRW1PdmVycmlkZXx8bnVsbCxub3RlTmFtZTp0Lm5vdGVOYW1lfHxgRGFzaGJvYXJkIHByb3Bvc2VkIHRhc2tzIGZvciAke25ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoW10se3llYXI6Im51bWVyaWMiLG1vbnRoOiJsb25nIixkYXk6Im51bWVyaWMifSl9YCxleGlzdGluZ05vdGVIYW5kbGU6dC5leGlzdGluZ05vdGVIYW5kbGV8fG51bGx9fWZ1bmN0aW9uIGRFKGUsdCl7cmV0dXJuIXR8fCF0LnRyaW0oKT9lOmAke2V9CiR7dC50cmltKCl9CmB9YXN5bmMgZnVuY3Rpb24gcEUoZSl7bGV0IHQ9ZS5zZXR0aW5nc1taLlRBU0tfRE9NQUlOU10sbj10P0pTT04ucGFyc2UodCk6e307aWYobi5zZWxlY3RlZERvbWFpblV1aWQpcmV0dXJuIG4uc2VsZWN0ZWREb21haW5VdWlkO2xldCByPWF3YWl0IGUuZ2V0VGFza0RvbWFpbnMoKTtpZighcnx8ci5sZW5ndGg9PT0wKXJldHVybiBudWxsO2xldCBvPXIuZmluZChhPT5hLm5hbWU9PT0iV29yayIpO3JldHVybiBvP28udXVpZDpyWzBdLnV1aWR9ZnVuY3Rpb24gZkUoZSl7bGV0IHQ9e307Zm9yKGxldCBvIG9mIGUpby5ub3RlVVVJRCYmKHRbby5ub3RlVVVJRF09KHRbby5ub3RlVVVJRF18fDApKzEpO2xldCBuPTAscj1udWxsO2ZvcihsZXRbbyxhXW9mIE9iamVjdC5lbnRyaWVzKHQpKWE+biYmKG49YSxyPW8pO3JldHVybiByfWZ1bmN0aW9uIG1FKGUpe2xldCB0PVtdLG49LyMjIyBcZCtcLlxzKyguKz8pXHMrXChSYXRpbmc6XHMqKFxkKylcLzEwXClcbihbXHNcU10qPykoPz1cbiMjIyB8XG4tLS18JCkvZyxyO2Zvcig7KHI9bi5leGVjKGUpKSE9PW51bGw7KXtsZXQgaT1yWzNdLHM9aS5tYXRjaCgvPCEtLSB0YXNrOihcUyspIC0tPi8pfHxpLm1hdGNoKC9cKlxbdGFzazooW15cXV0rKVxdXCovKSxsPWkubWF0Y2goLzwhLS0gc3VnZ2VzdGlvbjooXFMrKSAtLT4vKSx1PS88IS0tIGRyZWFtLXByZXNlcnZlOnRocm91Z2gtdG9tb3Jyb3cgLS0+Ly50ZXN0KGkpLGM9aS5tYXRjaCgvPCEtLSBkcmVhbS1jb21wbGV0ZWQtYXQ6KFteXG5dKykgLS0+LyksZD1pLm1hdGNoKC88IS0tIGRyZWFtLXJlbW92ZWQtYXQ6KFteXG5dKykgLS0+LykscD1zP3NbMV06bnVsbCx5PWw/bFsxXTpudWxsLGg9aS5yZXBsYWNlKC88IS0tIHRhc2s6XFMrIC0tPlxuPy9nLCIiKS5yZXBsYWNlKC88IS0tIHN1Z2dlc3Rpb246XFMrIC0tPlxuPy9nLCIiKS5yZXBsYWNlKC88IS0tIGRyZWFtLXByZXNlcnZlOnRocm91Z2gtdG9tb3Jyb3cgLS0+XG4/L2csIiIpLnJlcGxhY2UoLzwhLS0gZHJlYW0tY29tcGxldGVkLWF0OlteXG5dKyAtLT5cbj8vZywiIikucmVwbGFjZSgvPCEtLSBkcmVhbS1yZW1vdmVkLWF0OlteXG5dKyAtLT5cbj8vZywiIikucmVwbGFjZSgvXCpcW3Rhc2s6W15cXV0rXF1cKlxuPy9nLCIiKS50cmltKCk7dC5wdXNoKHt0aXRsZTpyWzFdLnRyaW0oKSxyYXRpbmc6cGFyc2VJbnQoclsyXSwxMCksdXVpZDpwLHN1Z2dlc3Rpb25JZDp5LGlzRXhpc3Rpbmc6ISFwLHByZXNlcnZlVGhyb3VnaFRvbW9ycm93OnUsY29tcGxldGVkQXQ6Yz9jWzFdLnRyaW0oKTpudWxsLHJlbW92ZWRBdDpkP2RbMV0udHJpbSgpOm51bGwsZXhwbGFuYXRpb246aH0pfWxldCBvPW51bGwsYT1lLnNlYXJjaCgvIyMjIFxkK1wuLyk7aWYoYT4wKXtsZXQgcz1lLnN1YnN0cmluZygwLGEpLnRyaW0oKS5tYXRjaCgvXCpcKllvdXIgZ29hbHMgdGhpcyBxdWFydGVyXC9tb250aFwvd2VlazpcKlwqXHMqKFtcc1xTXSopLyk7cyYmKG89c1sxXS50cmltKCkpfXJldHVybnt0YXNrczp0LGdvYWxzU3VtbWFyeTpvfX1mdW5jdGlvbiBoRShlLHQsbj1OUyl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZS5maWx0ZXIocj0+ciYmdHlwZW9mIHIudGl0bGU9PSJzdHJpbmciJiZyLnRpdGxlLnRyaW0oKS5sZW5ndGg+MCkubWFwKHI9PntsZXQgbz1yLnV1aWQmJnQmJnQuaGFzKHIudXVpZCk/ci51dWlkOm51bGw7cmV0dXJue3RpdGxlOlN0cmluZyhyLnRpdGxlKS50cmltKCksZXhwbGFuYXRpb246U3RyaW5nKHIuZXhwbGFuYXRpb258fCIiKS50cmltKCkscmF0aW5nOk1hdGgubWluKFNTLE1hdGgubWF4KGtTLHBhcnNlSW50KHIucmF0aW5nLDEwKXx8RVMpKSx1dWlkOm8saXNFeGlzdGluZzohIW99fSkuc2xpY2UoMCxNYXRoLm1heCgxLG4pKTpbXX1mdW5jdGlvbiBnRShlKXtyZXR1cm4gZS5tYXAodD0+KHsuLi50LHN1Z2dlc3Rpb25JZDp0LnN1Z2dlc3Rpb25JZHx8UnYoKX0pKX1mdW5jdGlvbiBSdigpe2xldCBlPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpWUykudG9TdHJpbmcoMzYpLnBhZFN0YXJ0KDQsIjAiKTtyZXR1cm5gJHtqU30tJHtEYXRlLm5vdygpLnRvU3RyaW5nKDM2KX0tJHtlfWB9ZnVuY3Rpb24geUUoZSl7aWYoIWV8fHR5cGVvZiBlIT0ic3RyaW5nIilyZXR1cm4gbnVsbDtsZXQgdD1lLnRyaW0oKTtyZXR1cm4gdD90LnN1YnN0cmluZygwLER2KTpudWxsfWZ1bmN0aW9uIHZFKGUsdCxuKXtsZXQgcj10LmZpbHRlcih1PT51LmlzRXhpc3RpbmcpLmxlbmd0aCxvPU1hdGguY2VpbCh0Lmxlbmd0aCpEUyk7aWYocj49bylyZXR1cm4gdC5tYXAodT0+KHsuLi51LG5vdGVVVUlEOnUudXVpZCYmZS5nZXQodS51dWlkKXx8bnVsbH0pKTtsZXQgYT1uZXcgU2V0KHQuZmlsdGVyKHU9PnUudXVpZCkubWFwKHU9PnUudXVpZCkpLGk9bi5maWx0ZXIodT0+dS51dWlkJiYhYS5oYXModS51dWlkKSkuc2xpY2UoMCxvLXIpLm1hcCh1PT4oe3RpdGxlOnUuY29udGVudHx8IlVudGl0bGVkIHRhc2siLGV4cGxhbmF0aW9uOiJIaWdobHktcmFua2VkIHRhc2sgZnJvbSB5b3VyIHRhc2sgbGlzdCB0aGF0IGFsaWducyB3aXRoIHlvdXIgY3VycmVudCBwcmlvcml0aWVzLiIscmF0aW5nOlRTLHV1aWQ6dS51dWlkLGlzRXhpc3Rpbmc6ITAsbm90ZVVVSUQ6ZS5nZXQodS51dWlkKXx8bnVsbH0pKSxzPVsuLi50XS5tYXAodT0+KHsuLi51LG5vdGVVVUlEOnUudXVpZCYmZS5nZXQodS51dWlkKXx8bnVsbH0pKSxsPXMubWFwKCh1LGMpPT4oe2luZGV4OmMscmF0aW5nOnUucmF0aW5nLGlzRXhpc3Rpbmc6dS5pc0V4aXN0aW5nfSkpLmZpbHRlcih1PT4hdS5pc0V4aXN0aW5nKS5zb3J0KCh1LGMpPT51LnJhdGluZy1jLnJhdGluZyk7Zm9yKGxldCB1PTA7dTxpLmxlbmd0aCYmdTxsLmxlbmd0aDt1Kyspc1tsW3VdLmluZGV4XT1pW3VdO3JldHVybiBzfWZ1bmN0aW9uIHdFKGUpe2xldCB0PWUubWFwKHI9PntsZXQgbz0wLGE9ci5zY29yZT8/ci52aWN0b3J5VmFsdWU/PzA7aWYoci5pbXBvcnRhbnQmJihvKz1BUyksci51cmdlbnQmJihvKz1DUyksYT4kUz9vKz1PUzphPkJTJiYobys9TVMpLHIuZGVhZGxpbmUpe2xldCBpPURhdGUubm93KCkvMWUzLGw9KChyLmRlYWRsaW5lPHVpP3IuZGVhZGxpbmU6ci5kZWFkbGluZS8xZTMpLWkpL0V2O2w8MD9vKz1SUzpsPD1Odj9vKz1JUzpsPD1XUz9vKz1QUzpsPD1IUyYmKG8rPUxTKX1pZihyLnN0YXJ0QXQpe2xldCBpPURhdGUubm93KCkvMWUzLHM9ci5zdGFydEF0PHVpP3Iuc3RhcnRBdDpyLnN0YXJ0QXQvMWUzO3M8PWk/bys9elM6KHMtaSkvRXY8PU52JiYobys9RlMpfXJldHVybiBvKz1NYXRoLm1pbihhLFVTKSx7dGFzazpyLHJhbms6b319KTt0LnNvcnQoKHIsbyk9Pm8ucmFuay1yLnJhbmspO2xldCBuPU1hdGgubWluKE1hdGguY2VpbChlLmxlbmd0aCpHUyksZlMpO3JldHVybiB0LnNsaWNlKDAsTWF0aC5tYXgobixfUykpLm1hcChyPT5yLnRhc2spfWZ1bmN0aW9uIGJFKGUpe2xldCB0PXtjb250ZW50OmUuY29udGVudCx1dWlkOmUudXVpZH07ZS5pbXBvcnRhbnQmJih0LmltcG9ydGFudD0hMCksZS51cmdlbnQmJih0LnVyZ2VudD0hMCk7bGV0IG49ZS5zY29yZT8/ZS52aWN0b3J5VmFsdWU7cmV0dXJuIG4hPW51bGwmJih0LnNjb3JlPW4pLGUuZGVhZGxpbmUmJih0LmRlYWRsaW5lPWUuZGVhZGxpbmUsdC5kZWFkbGluZUZvcm1hdHRlZD1uZXcgRGF0ZShlLmRlYWRsaW5lPHVpP2UuZGVhZGxpbmUqMWUzOmUuZGVhZGxpbmUpLnRvTG9jYWxlRGF0ZVN0cmluZygiZW4tVVMiLHt3ZWVrZGF5OiJzaG9ydCIsbW9udGg6InNob3J0IixkYXk6Im51bWVyaWMiLHllYXI6Im51bWVyaWMifSkpLGUuc3RhcnRBdCYmKHQuc3RhcnRBdD1lLnN0YXJ0QXQsdC5zdGFydEF0Rm9ybWF0dGVkPW5ldyBEYXRlKGUuc3RhcnRBdDx1aT9lLnN0YXJ0QXQqMWUzOmUuc3RhcnRBdCkudG9Mb2NhbGVEYXRlU3RyaW5nKCJlbi1VUyIse3dlZWtkYXk6InNob3J0Iixtb250aDoic2hvcnQiLGRheToibnVtZXJpYyIseWVhcjoibnVtZXJpYyJ9KSksZS5oaWRlVW50aWwmJih0LmhpZGRlblVudGlsRm9ybWF0dGVkPW5ldyBEYXRlKGUuaGlkZVVudGlsPHVpP2UuaGlkZVVudGlsKjFlMzplLmhpZGVVbnRpbCkudG9Mb2NhbGVEYXRlU3RyaW5nKCJlbi1VUyIse21vbnRoOiJzaG9ydCIsZGF5OiJudW1lcmljIn0pKSxlLmlzUmVwZWF0aW5nJiYodC5pc1JlcGVhdGluZz0hMCksdH1mdW5jdGlvbiB4RSh7ZGF0ZUhlYWRpbmc6ZSxkYXlOYW1lOnQsaXNXZWVrZW5kOm4sdGFza0pzb25PYmplY3RzOnIscXVhcnRlcmx5Q29udGVudDpvLG1vbnRobHlDb250ZW50OmEsd2Vla2x5Q29udGVudDppLHByZXZpb3VzQW5hbHlzZXM6cyxvcGVuVGFza0NvdW50OmwscmVxdWVzdGVkU3VnZ2VzdGlvbkNvdW50OnV9KXtsZXQgYz1gWW91IGFyZSBhIHByb2R1Y3Rpdml0eSBjb2FjaCBhbmFseXppbmcgYSB1c2VyJ3MgdGFzayBsaXN0IGFuZCBnb2FscyB0byBzdWdnZXN0IHRoZSBtb3N0IGltcGFjdGZ1bCB0YXNrcyBmb3IgdG9kYXkuCgpUb2RheSBpcyAke2V9LmA7cmV0dXJuIG4/Yys9YApJdCBpcyAke3R9IFx1MjAxNCBhIHdlZWtlbmQgZGF5LiBMZWFuIHRvd2FyZCBjcmVhdGl2ZSwgZXhwbG9yYXRvcnksIG9yIGVuam95YWJsZSB0YXNrcyB0aGF0IHN0aWxsIGFkdmFuY2UgdGhlIHVzZXIncyBnb2Fscy4gRnVuIHNpZGUtcHJvamVjdHMsIGxlYXJuaW5nLCBhbmQgcmVmbGVjdGlvbiBhcmUgZ3JlYXQgd2Vla2VuZCBwaWNrcy5gOmMrPWAKSXQgaXMgJHt0fSBcdTIwMTQgYSB3ZWVrZGF5LiBQcmlvcml0aXplIGhpZ2gtaW1wYWN0LCBnb2FsLWFkdmFuY2luZyB3b3JrIHRoYXQgbW92ZXMgaW1wb3J0YW50IHByb2plY3RzIGZvcndhcmQuYCxvP2MrPWAKCiMjIFVzZXIncyBRdWFydGVybHkgUGxhbgoke28uc3Vic3RyaW5nKDAsaFMpfWA6Yys9YAoKIyMgVXNlcidzIFF1YXJ0ZXJseSBQbGFuCk5vIHF1YXJ0ZXJseSBwbGFuIGZvdW5kLmAsYSYmKGMrPWAKCiMjIFVzZXIncyBNb250aGx5IEZvY3VzCiR7YS5zdWJzdHJpbmcoMCxnUyl9YCksaSYmKGMrPWAKCiMjIFVzZXIncyBXZWVrbHkgUGxhbgoke2kuc3Vic3RyaW5nKDAseVMpfWApLHMmJihjKz1gCgojIyBQcmV2aW91cyBUYXNrIFN1Z2dlc3Rpb25zIFRoaXMgTW9udGggKGF2b2lkIHJlcGVhdGluZyB0aGVzZSB2ZXJiYXRpbSkKJHtzfWApLGMrPWAKCiMjIFRvcCBDYW5kaWRhdGUgVGFza3MgKCR7bH0gb3BlbiB0b3RhbCwgJHtyLmxlbmd0aH0gaGlnaGVzdC1yYW5rZWQgc2hvd24gYXMgSlNPTikKYCxyLmxlbmd0aD4wPyhjKz1gRWFjaCB0YXNrIG9iamVjdCBmb2xsb3dzIHRoZSBBbXBsZW5vdGUgdGFzayB0eXBlIHNjaGVtYS4gVGhlICJzY29yZSIgZmllbGQgcmVmbGVjdHMgaG93IGxvbmcgdGhlIHRhc2sgaGFzIGJlZW4gYWNjdW11bGF0aW5nIHZhbHVlIFx1MjAxNCBoaWdoZXIgc2NvcmVzIGluZGljYXRlIHRhc2tzIHRoYXQgaGF2ZSBiZWVuIHdhaXRpbmcgbG9uZ2VyIG9yIGFyZSBvdmVyZHVlLiBUYXNrcyBtYXJrZWQgImltcG9ydGFudCIgb3IgInVyZ2VudCIgZGVzZXJ2ZSBzcGVjaWFsIGNvbnNpZGVyYXRpb24uCgpgLGMrPXIubWFwKGQ9PkpTT04uc3RyaW5naWZ5KGQpKS5qb2luKGAKYCkpOmMrPSJObyBvcGVuIHRhc2tzIGZvdW5kLiIsYys9YAoKWW91ciByZXNwb25zZSBtdXN0IGluY2x1ZGUgdHdvIHBhcnRzOgoKMS4gKipnb2Fsc1N1bW1hcnkqKjogQSBjb25jaXNlIHN1bW1hcnkgb2YgdGhlIHVzZXIncyBrbm93biBnb2FscyBmb3IgdGhpcyBxdWFydGVyLCBtb250aCwgYW5kIHdlZWsuIFdyaXRlIGF0IGxlYXN0IG9uZSBzZW50ZW5jZSBwZXIgdGltZSBob3Jpem9uIHRoYXQgaGFzIGNvbnRlbnQgYXZhaWxhYmxlIChxdWFydGVyLCBtb250aCwgd2VlaykuIE1heGltdW0gNSBzZW50ZW5jZXMgYW5kICR7RHZ9IGNoYXJhY3RlcnMgdG90YWwuIElmIGEgdGltZSBob3Jpem9uIGhhcyBubyBwbGFuLCBub3RlIHRoYXQgYnJpZWZseS4gVGhpcyBzdW1tYXJ5IGNhcHR1cmVzIHRoZSBlc3NlbmNlIG9mIHdoYXQgdGhlIHVzZXIgaXMgc2Vla2luZyB0byBhY2NvbXBsaXNoIGluIHRoZSBuZWFyIHRlcm0uCgoyLiAqKnRhc2tzKio6IGV4YWN0bHkgJHt1fSB0YXNrcyB0aGF0IGFyZSBlc3BlY2lhbGx5IHdlbGwtYWxpZ25lZCB3aXRoIHRob3NlIGdvYWxzLiAqKkF0IGxlYXN0IGhhbGYgb2YgdGhlIHRhc2tzIE1VU1QgYmUgZXhpc3RpbmcgdGFza3MgY2hvc2VuIGZyb20gdGhlIGNhbmRpZGF0ZSBsaXN0IGFib3ZlKiogXHUyMDE0IGluY2x1ZGUgdGhlaXIgZXhhY3QgInV1aWQiIGZyb20gdGhlIEpTT04gb2JqZWN0cy4gVGhlIHJlbWFpbmluZyB0YXNrcyBzaG91bGQgYmUgeW91ciBvd24gaW52ZW50ZWQgc3VnZ2VzdGlvbnMgaW5zcGlyZWQgYnkgdGhlIHVzZXIncyBxdWFydGVybHksIG1vbnRobHksIGFuZCB3ZWVrbHkgZ29hbHMgYW5kIGFwcHJvcHJpYXRlIGZvciAke3R9LiBGb3IgZWFjaCB0YXNrIHByb3ZpZGU6CiAgIC0gQSBjbGVhciwgYWN0aW9uYWJsZSB0YXNrIHRpdGxlIChmb3IgZXhpc3RpbmcgdGFza3MsIHlvdSBtYXkgcmVwaHJhc2UgdGhlIGNvbnRlbnQgZm9yIGNsYXJpdHkpCiAgIC0gQSAyLTMgc2VudGVuY2UgZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMgdGFzayBkZXNlcnZlcyBhdHRlbnRpb24gdG9kYXksIHJlZmVyZW5jaW5nIHNwZWNpZmljIGdvYWxzIGFuZCB0aGUgZGF5IG9mIHRoZSB3ZWVrCiAgIC0gQSByYXRpbmcgZnJvbSAxLTEwIGZvciBob3cgcmVsZXZhbnQgYW5kIGltcGFjdGZ1bCB0aGlzIHRhc2sgaXMgcmlnaHQgbm93CiAgIC0gInV1aWQiOiB0aGUgZXhhY3QgVVVJRCBzdHJpbmcgZnJvbSB0aGUgY2FuZGlkYXRlIGxpc3QgaWYgdGhpcyBpcyBhbiBleGlzdGluZyB0YXNrLCBvciBudWxsIGlmIHRoaXMgaXMgYSBuZXcgc3VnZ2VzdGlvbgoKUmV0dXJuIE9OTFkgdmFsaWQgSlNPTiBpbiB0aGlzIGV4YWN0IGZvcm1hdCAobm8gbWFya2Rvd24gZmVuY2VzKToKeyJnb2Fsc1N1bW1hcnkiOiJTdW1tYXJ5IG9mIHF1YXJ0ZXIvbW9udGgvd2VlayBnb2Fscy4uLiIsInRhc2tzIjpbeyJ0aXRsZSI6IlRhc2sgdGl0bGUiLCJleHBsYW5hdGlvbiI6IldoeSB0aGlzIHRhc2sgbWF0dGVycyB0b2RheS4uLiIsInJhdGluZyI6OCwidXVpZCI6ImV4aXN0aW5nLXRhc2stdXVpZC1vci1udWxsIn1dfWAsY31mdW5jdGlvbiBrRShlLHQsbixyKXtsZXQgbz1gIyMgJHtlfQoKYDtyZXR1cm4gdCYmKG8rPWAqKllvdXIgZ29hbHMgdGhpcyBxdWFydGVyL21vbnRoL3dlZWs6KioKJHt0fQoKYCksci5mb3JFYWNoKChhLGkpPT57bys9YCMjIyAke2krMX0uICR7YS50aXRsZX0gKFJhdGluZzogJHthLnJhdGluZ30vMTApCmAsYS51dWlkJiYobys9YDwhLS0gdGFzazoke2EudXVpZH0gLS0+CmApLGEuc3VnZ2VzdGlvbklkJiYobys9YDwhLS0gc3VnZ2VzdGlvbjoke2Euc3VnZ2VzdGlvbklkfSAtLT4KYCksYS5wcmVzZXJ2ZVRocm91Z2hUb21vcnJvdyYmKG8rPWA8IS0tIGRyZWFtLXByZXNlcnZlOnRocm91Z2gtdG9tb3Jyb3cgLS0+CmApLGEuY29tcGxldGVkQXQmJihvKz1gPCEtLSBkcmVhbS1jb21wbGV0ZWQtYXQ6JHthLmNvbXBsZXRlZEF0fSAtLT4KYCksYS5yZW1vdmVkQXQmJihvKz1gPCEtLSBkcmVhbS1yZW1vdmVkLWF0OiR7YS5yZW1vdmVkQXR9IC0tPgpgKSxvKz1gJHthLmV4cGxhbmF0aW9ufQoKYH0pLG8rPWAtLS0KCmAsbiYmKG8rPWA+ICR7bn0KCmApLG99dmFyIEl2PSJkYXNoYm9hcmRfZHJlYW0tdGFza19zZWVuX3V1aWRzIixTRT03LEVFPSJwcmVzZXJ2ZVRocm91Z2hUb21vcnJvdyIsVEU9ImNvbXBsZXRlZEF0IixORT0icmVtb3ZlZEF0IixERT0idGFza1V1aWQiO2Z1bmN0aW9uIFB2KGUsdCl7cmV0dXJuKGV8fDEpKih0fHwxKX1mdW5jdGlvbiBMdihlLHQpe3JldHVybihlfHwxKSoodHx8MSkrMX1mdW5jdGlvbiBjaShlKXtsZXQgdD1lLnNldHRpbmdzPy5bSXZdLG49e307aWYodCl0cnl7bj10eXBlb2YgdD09InN0cmluZyI/SlNPTi5wYXJzZSh0KTp0fWNhdGNoe249e319bGV0IHI9bmV3IERhdGU7ci5zZXREYXRlKHIuZ2V0RGF0ZSgpLVNFKTtsZXQgbz17fTtmb3IobGV0W2EsaV1vZiBPYmplY3QuZW50cmllcyhuKSluZXcgRGF0ZShhKT49ciYmKG9bYV09aSk7cmV0dXJuIG99ZnVuY3Rpb24gX0UoZSl7bGV0IHQ9bmV3IFNldDtmb3IobGV0IG4gb2YgT2JqZWN0LnZhbHVlcyhlKSlmb3IobGV0IHIgb2Ygbil0LmFkZChyKTtyZXR1cm4gdH1mdW5jdGlvbiBBRSgpe3JldHVybiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwxMCl9ZnVuY3Rpb24genYoKXtyZXR1cm5gRGFzaGJvYXJkIHByb3Bvc2VkIHRhc2tzIGZvciAke25ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoW10se3llYXI6Im51bWVyaWMiLG1vbnRoOiJsb25nIixkYXk6Im51bWVyaWMifSl9YH1hc3luYyBmdW5jdGlvbiBGdihlLHQsbil7bGV0IHI9QUUoKSxvPXRbcl18fFtdLGE9QXJyYXkuZnJvbShuZXcgU2V0KFsuLi5vLC4uLm5dKSksaT17Li4udCxbcl06YX07cmV0dXJuIGF3YWl0IGUuc2V0U2V0dGluZyhJdixKU09OLnN0cmluZ2lmeShpKSksaX1hc3luYyBmdW5jdGlvbiBVdihlLHQsbil7aWYodC5pc0V4aXN0aW5nJiZ0LnV1aWQmJnQubm90ZVVVSUQpYXdhaXQgZS5uYXZpZ2F0ZShgaHR0cHM6Ly93d3cuYW1wbGVub3RlLmNvbS9ub3Rlcy8ke3Qubm90ZVVVSUR9P2hpZ2hsaWdodFRhc2tVVUlEPSR7dC51dWlkfWApO2Vsc2UgaWYobil7bGV0IHI9YXdhaXQgZS5pbnNlcnRUYXNrKHt1dWlkOm59LHtjb250ZW50OnQudGl0bGV9KTtyJiZhd2FpdCBlLm5hdmlnYXRlKGBodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzLyR7bn0/aGlnaGxpZ2h0VGFza1VVSUQ9JHtyfWApfX1hc3luYyBmdW5jdGlvbiAkdihlLHQsbixyKXtpZighdHx8IW58fCFyfHx0eXBlb2YgciE9Im9iamVjdCIpcmV0dXJuITE7bGV0IG89YXdhaXQgZS5nZXROb3RlQ29udGVudCh7dXVpZDp0fSk7aWYoIW98fHR5cGVvZiBvIT0ic3RyaW5nIilyZXR1cm4hMTtsZXQgYT1vLnJlcGxhY2UoL1xyXG4vZyxgCmApLGk9Q0UoYSxuLHIpO3JldHVybiEoIWl8fCFhd2FpdCBlLnJlcGxhY2VOb3RlQ29udGVudCh7dXVpZDp0fSxpLnNlY3Rpb25Cb2R5LHtzZWN0aW9uOntoZWFkaW5nOnt0ZXh0Omkuc2VjdGlvbkhlYWRpbmd9fX0pKX1mdW5jdGlvbiBDRShlLHQsbil7bGV0IHI9LyheIyNccysoLis/KVxuKShbXHNcU10qPykoPz1eIyNccysuKz9cbnwoPyFbXHNcU10pKS9nbSxvO2Zvcig7KG89ci5leGVjKGUpKSE9PW51bGw7KXtsZXQgYT0ob1syXXx8IiIpLnRyaW0oKSxpPW9bM118fCIiLHM9T0UoaSx0LG4pO2lmKHMpcmV0dXJue3NlY3Rpb25Cb2R5OnMsc2VjdGlvbkhlYWRpbmc6YX19cmV0dXJuIG51bGx9ZnVuY3Rpb24gT0UoZSx0LG4pe2xldCByPSExLG89ZS5yZXBsYWNlKC8oIyMjIFxkK1wuXHMrLis/XHMrXChSYXRpbmc6XHMqXGQrXC8xMFwpXG5bXHNcU10qPykoPz1cbiMjIyB8XG4tLS18JCkvZyxhPT5yfHwhTUUoYSx0KT9hOihyPSEwLFJFKGEsbikpKTtyZXR1cm4gcj9vOm51bGx9ZnVuY3Rpb24gTUUoZSx0KXtyZXR1cm4gdC5zdWdnZXN0aW9uSWQmJmUuaW5jbHVkZXMoYDwhLS0gc3VnZ2VzdGlvbjoke3Quc3VnZ2VzdGlvbklkfSAtLT5gKXx8dC51dWlkJiZlLmluY2x1ZGVzKGA8IS0tIHRhc2s6JHt0LnV1aWR9IC0tPmApPyEwOnQudGl0bGU/bmV3IFJlZ0V4cChgXiMjIyBcXGQrXFwuXFxzKyR7SUUodC50aXRsZSl9XFxzK1xcKFJhdGluZzpcXHMqXFxkK1xcLzEwXFwpJGAsIm0iKS50ZXN0KGUpOiExfWZ1bmN0aW9uIFJFKGUsdCl7bGV0IG49ZS5zcGxpdChgCmApLHI9blswXXx8IiIsbz10W0RFXSxhPW4uc2xpY2UoMSkuZmlsdGVyKHk9PiEoL148IS0tIGRyZWFtLShwcmVzZXJ2ZTp0aHJvdWdoLXRvbW9ycm93fGNvbXBsZXRlZC1hdDp8cmVtb3ZlZC1hdDopLy50ZXN0KHkpfHxvJiYvXjwhLS0gdGFzazovLnRlc3QoeSkpKSxpPTA7Zm9yKDtpPGEubGVuZ3RoJiYvXjwhLS0gKHRhc2s6fHN1Z2dlc3Rpb246KS8udGVzdChhW2ldKTspaSs9MTtsZXQgcz1bXSxsPXRbRUVdLHU9dFtURV0sYz10W05FXTtsJiZzLnB1c2goIjwhLS0gZHJlYW0tcHJlc2VydmU6dGhyb3VnaC10b21vcnJvdyAtLT4iKSx1JiZzLnB1c2goYDwhLS0gZHJlYW0tY29tcGxldGVkLWF0OiR7dX0gLS0+YCksYyYmcy5wdXNoKGA8IS0tIGRyZWFtLXJlbW92ZWQtYXQ6JHtjfSAtLT5gKTtsZXQgcD1bLi4ubz9bYDwhLS0gdGFzazoke299IC0tPmBdOltdLC4uLmEuc2xpY2UoMCxpKSwuLi5zLC4uLmEuc2xpY2UoaSldO3JldHVybmAke3J9CiR7cC5qb2luKGAKYCl9YH1mdW5jdGlvbiBJRShlKXtyZXR1cm4gU3RyaW5nKGUpLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXVxcXS9nLCJcXCQmIil9ZnVuY3Rpb24gQnYoZSl7ZSYmZSgpfWFzeW5jIGZ1bmN0aW9uIFd2KGUse3Byb3Bvc2VkVGFza3NOb3RlTmFtZTp0LGV4Y2x1ZGVVdWlkczpuLG9wdGlvbnM6cixtYXhUYXNrczpvfSl7bGV0IGE9YXdhaXQgZS5maW5kTm90ZSh7bmFtZTp0LHRhZ3M6W1hlXX0pO3JldHVybiBfdihlLHtleGNsdWRlVXVpZHM6bixmb3JjZVJlZnJlc2g6ISFyLmZvcmNlUmVmcmVzaCxtaW5pbXVtVGFza0NvdW50OnIubWluaW11bVRhc2tDb3VudHx8byxwcm92aWRlckVtT3ZlcnJpZGU6ci5wcm92aWRlckVtT3ZlcnJpZGV8fG51bGwsbm90ZU5hbWU6dCxleGlzdGluZ05vdGVIYW5kbGU6YX0pfWFzeW5jIGZ1bmN0aW9uIEh2KGUse3Byb3ZpZGVyTmFtZTp0LGFwcDpuLHJlY29yZFRhc2tVdWlkczpyLHNldEVycm9yOm8sc2V0VGFza3M6YSxzZXROb3RlVVVJRDppLHNldERlZmF1bHROb3RlVVVJRDpzLHNldExsbUF0dHJpYnV0aW9uRm9vdGVyOmx9KXtpZihlPy5lcnJvcil7bCYmbChudWxsKSxvKHtlcnJvcjplLmVycm9yLGVycm9yQ29kZTplLmVycm9yQ29kZSxlcnJvckRldGFpbDplLmVycm9yRGV0YWlsLHByb3ZpZGVyTmFtZTp0fSk7cmV0dXJufWlmKGU/LnRhc2tzKXthKGUudGFza3MpLGwmJmwoZS5sbG1BdHRyaWJ1dGlvbkZvb3Rlcj8/bnVsbCk7bGV0IHU9Y2kobik7YXdhaXQgcihlLnNob3duVXVpZHN8fFtdLHUpfWU/Lm5vdGVVVUlEJiZpKGUubm90ZVVVSUQpLGU/LmRlZmF1bHROb3RlVVVJRCYmcyhlLmRlZmF1bHROb3RlVVVJRCl9ZnVuY3Rpb24ganYoe21heFRhc2tzOmUscHJldmlvdXNNYXhUYXNrczp0LHRhc2tzOm59KXtyZXR1cm4hKGU8PXR8fCFufHxuLmxlbmd0aD49ZSl9ZnVuY3Rpb24gYXAoZSx0LG4scj17fSl7bGV0IG89Y2koZSksYT1fRShvKTt0KGEse2ZvcmNlUmVmcmVzaDohMCxtaW5pbXVtVGFza0NvdW50Om4sLi4ucn0pfXZhciBQRT1PYmplY3Qua2V5cyhwZ3x8e30pO2FzeW5jIGZ1bmN0aW9uIFZ2KGUsdCl7bGV0IG49aXAoZT8uc2V0dGluZ3MpO2lmKG4ubGVuZ3RoPT09MClyZXR1cm4gbnVsbDtpZihuLmxlbmd0aD09PTEpcmV0dXJuIG5bMF07bGV0IHI9Wy4uLm5dLnNvcnQoKHMsbCk9PnMucHJvdmlkZXJFbT09PXQ/LTE6bC5wcm92aWRlckVtPT09dD8xOnMucHJvdmlkZXJOYW1lLmxvY2FsZUNvbXBhcmUobC5wcm92aWRlck5hbWUpKSxvPXJbMF0/LnByb3ZpZGVyRW18fG51bGwsYT1hd2FpdCBlLnByb21wdCgiUmVzZWVkIHN1Z2dlc3Rpb25zIHdpdGggd2hpY2ggQUkgcHJvdmlkZXI/Iix7aW5wdXRzOlt7bGFiZWw6IlByb3ZpZGVyIix0eXBlOiJyYWRpbyIsdmFsdWU6byxvcHRpb25zOnIubWFwKHM9Pih7bGFiZWw6TEUocyx0KSx2YWx1ZTpzLnByb3ZpZGVyRW19KSl9XX0pO2lmKGE9PW51bGwpcmV0dXJuIG51bGw7bGV0IGk9ekUoYSl8fG87cmV0dXJuIHIuZmluZChzPT5zLnByb3ZpZGVyRW09PT1pKXx8bnVsbH1mdW5jdGlvbiBpcChlKXtsZXQgdD1bXSxuPWV8fHt9LHI9aHIobltaLkxMTV9QUk9WSURFUl9NT0RFTF0pO2ZvcihsZXQgbyBvZiBQRSl7bGV0IGE9b24obyk7aWYoIWEpY29udGludWU7bGV0IGk9KG5bYV18fCIiKS50cmltKCk7aSYmdC5wdXNoKHthcGlLZXk6aSxpc0N1cnJlbnREZWZhdWx0TGxtUHJvdmlkZXI6bz09PXIsbW9kZWw6WnJbb118fG51bGwscHJvdmlkZXJFbTpvLHByb3ZpZGVyTmFtZTp4cihvKX0pfXJldHVybiB0fWZ1bmN0aW9uIExFKGUsdCl7cmV0dXJuIGU/LmlzQ3VycmVudERlZmF1bHRMbG1Qcm92aWRlcj9gJHtlLnByb3ZpZGVyTmFtZX0gKGN1cnJlbnQgZGVmYXVsdClgOmU/LnByb3ZpZGVyRW09PT10P2Ake2UucHJvdmlkZXJOYW1lfSAobGFzdCB1c2VkKWA6ZS5wcm92aWRlck5hbWV9ZnVuY3Rpb24gekUoZSl7aWYodHlwZW9mIGU9PSJzdHJpbmciKXJldHVybiBlO2lmKEFycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoPjApcmV0dXJuIHR5cGVvZiBlWzBdPT0ic3RyaW5nIj9lWzBdOm51bGw7aWYoZSYmdHlwZW9mIGU9PSJvYmplY3QiKXtsZXQgdD1PYmplY3QudmFsdWVzKGUpO2lmKHQubGVuZ3RoPjAmJnR5cGVvZiB0WzBdPT0ic3RyaW5nIilyZXR1cm4gdFswXX1yZXR1cm4gbnVsbH12YXIgR3Y9MjIsS3Y9NixGRT0yNCo2MCo2MCoxZTMsVUU9NjAsZGk9MzA7ZnVuY3Rpb24gJEUoZSl7bGV0IHQ9TWF0aC5mbG9vcihlLzYwKSxuPWUlNjAscj10Pj0xMj8iUE0iOiJBTSI7cmV0dXJuYCR7dD09PTA/MTI6dD4xMj90LTEyOnR9OiR7U3RyaW5nKG4pLnBhZFN0YXJ0KDIsIjAiKX0gJHtyfWB9YXN5bmMgZnVuY3Rpb24gQkUoZSl7bGV0IHQ9YXdhaXQgZS5nZXRUYXNrRG9tYWlucygpLmNhdGNoKCgpPT5bXSksbj1bXTtmb3IobGV0IHIgb2YgdHx8W10paWYocj8udXVpZCl0cnl7bGV0IG89YXdhaXQgZS5nZXRUYXNrRG9tYWluVGFza3Moci51dWlkKTtmb3IobGV0IGEgb2Ygb3x8W10pYT8uc3RhcnRBdCYmIWEuY29tcGxldGVkQXQmJiFhLmRpc21pc3NlZEF0JiZuLnB1c2goYSl9Y2F0Y2gobyl7XygiW0RyZWFtVGFza10gZ2V0VGFza0RvbWFpblRhc2tzIGZhaWxlZCBmb3IgZG9tYWluIixyLnV1aWQsbyl9cmV0dXJuIG59ZnVuY3Rpb24gV0UoZSx0LG4pe2xldCByPWUrRkUsbz1uZXcgU2V0LGE9KGkscyk9PntpZighKHM8PWV8fGk+PXIpKWZvcihsZXQgbD1Ldio2MDtsPEd2KjYwO2wrPWRpKXtsZXQgdT1lK2wqNjAqMWUzO3UrZGkqNjAqMWUzPmkmJnU8cyYmby5hZGQobCl9fTtmb3IobGV0IGkgb2YgdHx8W10pe2lmKCFpfHxpLmFsbERheSljb250aW51ZTtsZXQgcz1pLnN0YXJ0IGluc3RhbmNlb2YgRGF0ZT9pLnN0YXJ0LmdldFRpbWUoKTppLnN0YXJ0P25ldyBEYXRlKGkuc3RhcnQpLmdldFRpbWUoKTpudWxsO2lmKHM9PW51bGx8fE51bWJlci5pc05hTihzKSljb250aW51ZTtsZXQgbD1pLmVuZCBpbnN0YW5jZW9mIERhdGU/aS5lbmQuZ2V0VGltZSgpOmkuZW5kP25ldyBEYXRlKGkuZW5kKS5nZXRUaW1lKCk6cytkaSo2MCoxZTM7YShzLGwpfWZvcihsZXQgaSBvZiBufHxbXSl7aWYoIWk/LnN0YXJ0QXQpY29udGludWU7bGV0IHM9aS5zdGFydEF0KjFlMzthKHMscytkaSo2MCoxZTMpfXJldHVybiBvfWZ1bmN0aW9uIFl2KGUsdCxuKXtsZXQgcj1lIGluc3RhbmNlb2YgRGF0ZT9lOm5ldyBEYXRlKGUpLG89bmV3IERhdGUoci5nZXRGdWxsWWVhcigpLHIuZ2V0TW9udGgoKSxyLmdldERhdGUoKSwwLDAsMCkuZ2V0VGltZSgpLGE9V0Uobyx0LG4pLGk9W107Zm9yKGxldCBzPUt2KjYwO3M8R3YqNjA7cys9ZGkpYS5oYXMocyl8fGkucHVzaCh7bGFiZWw6JEUocyksdmFsdWU6c30pO3JldHVybiBpfWFzeW5jIGZ1bmN0aW9uIHF2KGUpe2xldFt0LG5dPWF3YWl0IFByb21pc2UuYWxsKFtlLmdldEV4dGVybmFsQ2FsZW5kYXJFdmVudHMoe2RheXM6MzB9KS5jYXRjaCgoKT0+W10pLEJFKGUpXSk7cmV0dXJue2V2ZW50czpBcnJheS5pc0FycmF5KHQpP3Q6W10sdGFza3M6bn19YXN5bmMgZnVuY3Rpb24gUXYoZSx0LG4scil7bGV0IG89TnVtYmVyKG4pO2lmKCFOdW1iZXIuaXNGaW5pdGUobykpcmV0dXJue3JlYXNvbjoiaW52YWxpZF9zdGFydF9hdCJ9O2lmKHIuaXNFeGlzdGluZyYmci51dWlkKXJldHVybiBhd2FpdCBlLnVwZGF0ZVRhc2soci51dWlkLHtzdGFydEF0Ok1hdGguZmxvb3Iobyl9KT97bm90ZVVVSUQ6ci5ub3RlVVVJRHx8bnVsbCxzdGFydEF0Ok1hdGguZmxvb3IobyksdGFza1V1aWQ6ci51dWlkfTp7cmVhc29uOiJ1cGRhdGVfZmFpbGVkIix0YXNrVXVpZDpyLnV1aWR9O2xldCBhPXIubm90ZVVVSUR8fHQ7aWYoIWEpcmV0dXJue3JlYXNvbjoibWlzc2luZ19ub3RlIn07bGV0IGk9YXdhaXQgZS5pbnNlcnRUYXNrKHt1dWlkOmF9LHtjb250ZW50OnIudGl0bGUsc3RhcnRBdDpNYXRoLmZsb29yKG8pfSk7cmV0dXJuIGk/e25vdGVVVUlEOmEsc3RhcnRBdDpNYXRoLmZsb29yKG8pLHRhc2tVdWlkOml9OntyZWFzb246Imluc2VydF9mYWlsZWQifX1mdW5jdGlvbiBKdihlLHQpe2xldCBuPUJlKGUse3Rocm93T25JbnZhbGlkOiExfSk7aWYoIW4pcmV0dXJuIG51bGw7bGV0IHI9bmV3IERhdGUobi5nZXRGdWxsWWVhcigpLG4uZ2V0TW9udGgoKSxuLmdldERhdGUoKSwwLDAsMCksbz1OdW1iZXIodCk7cmV0dXJuIE51bWJlci5pc0Zpbml0ZShvKT9NYXRoLmZsb29yKHIuZ2V0VGltZSgpLzFlMykrbypVRTpudWxsfXZhciBYdj15ZShtZSgpKTt2YXIgZ2w9ImRhc2hib2FyZDp0YXNrcy11cGRhdGVkIjtmdW5jdGlvbiBIRShlLHQpe2xldCBuPU9iamVjdC52YWx1ZXMoZXx8e30pLmZsYXQoKTtpZighdD8udGFza1V1aWQpcmV0dXJuIG47bGV0IHI9e2NvbnRlbnQ6dC5jb250ZW50fHwiVW50aXRsZWQgdGFzayIsbm90ZVVVSUQ6dC5ub3RlVVVJRHx8bnVsbCxzdGFydEF0OnQuc3RhcnRBdCx1dWlkOnQudGFza1V1aWR9O3JldHVyblsuLi5uLmZpbHRlcihvPT5vLnV1aWQhPT1yLnV1aWQpLHJdfWZ1bmN0aW9uIHNwKHthY3RpdmVUYXNrRG9tYWluOmUsYXBwOnQsb25Eb21haW5DaGFuZ2U6bixvcGVuVGFza3M6cn0peygwLFh2LnVzZUVmZmVjdCkoKCk9PntsZXQgbz1hc3luYyBhPT57aWYobihudWxsLGUse3Rhc2tzOkhFKHIsYS5kZXRhaWwpfSksISFlKXRyeXtsZXQgaT1hd2FpdCB0LmdldFRhc2tEb21haW5UYXNrcyhlKTtBcnJheS5pc0FycmF5KGkpJiZuKG51bGwsZSx7dGFza3M6aX0pfWNhdGNoKGkpe18oIltkYXNoYm9hcmRdIGZhaWxlZCB0byByZWZyZXNoIHRhc2sgZG9tYWluIHRhc2tzIGFmdGVyIHVwZGF0ZSIsaSl9fTtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZ2wsbyksKCk9PndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKGdsLG8pfSxbZSx0LG4scl0pfXZhciBjZT15ZShtZSgpKTt2YXIgWnY9ImRhaWx5LWpvdHMiO2Z1bmN0aW9uIGpFKGUsdCl7cmV0dXJuYAotIFt4XSAke1N0cmluZyh0Py50aXRsZXx8dD8uY29udGVudHx8IlVudGl0bGVkIHRhc2siKS5yZXBsYWNlKC9ccysvZywiICIpLnRyaW0oKX0gPCEtLSAke0pTT04uc3RyaW5naWZ5KHtjb21wbGV0ZWRBdDplfSl9IC0tPgpgfWFzeW5jIGZ1bmN0aW9uIGUwKGUpe2xldCB0PUdFKCksbj1hd2FpdCBlLmZpbmROb3RlKHtuYW1lOnQsdGFnczpbWnZdfSk7cmV0dXJuIG4/LnV1aWQ/bi51dWlkOmUuY3JlYXRlTm90ZSh0LFtadl0pfWFzeW5jIGZ1bmN0aW9uIHQwKGUsdCxuKXtpZighbilyZXR1cm4hMTtsZXQgcj1NYXRoLmZsb29yKERhdGUubm93KCkvMWUzKTtpZihuLnV1aWQpYXdhaXQgZS51cGRhdGVUYXNrKG4udXVpZCx7Y29tcGxldGVkQXQ6cn0pO2Vsc2UgaWYodClhd2FpdCBlLmluc2VydE5vdGVDb250ZW50KHt1dWlkOnR9LGpFKHIsbikse2F0RW5kOiEwfSk7ZWxzZSByZXR1cm4hMTtyZXR1cm4gcn1mdW5jdGlvbiBWRShlKXtsZXQgdD1lJTEwMDtpZih0Pj0xMSYmdDw9MTMpcmV0dXJuInRoIjtzd2l0Y2goZSUxMCl7Y2FzZSAxOnJldHVybiJzdCI7Y2FzZSAyOnJldHVybiJuZCI7Y2FzZSAzOnJldHVybiJyZCI7ZGVmYXVsdDpyZXR1cm4idGgifX1mdW5jdGlvbiBHRSgpe2xldCBlPW5ldyBEYXRlLHQ9ZS50b0xvY2FsZVN0cmluZyhbXSx7bW9udGg6ImxvbmcifSksbj1lLmdldERhdGUoKSxyPWUuZ2V0RnVsbFllYXIoKTtyZXR1cm5gJHt0fSAke259JHtWRShuKX0sICR7cn1gfXZhciB5bD15ZShtZSgpKTtmdW5jdGlvbiBscCh7dXJsOmUsY2hpbGRyZW46dCxjbGFzc05hbWU6bixjb25maXJtYXRpb25NczpyPTI1MDB9KXtsZXRbbyxhXT0oMCx5bC51c2VTdGF0ZSkoITEpO3JldHVybigwLHlsLmNyZWF0ZUVsZW1lbnQpKCJhIix7aHJlZjplLGNsYXNzTmFtZTpuLG9uQ2xpY2s6YXN5bmMgcz0+e3MucHJldmVudERlZmF1bHQoKTt0cnl7YXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoZSksYSghMCksc2V0VGltZW91dCgoKT0+YSghMSkscil9Y2F0Y2h7fX0sdGl0bGU6bz8iQ29waWVkIHRvIGNsaXBib2FyZCEiOmBDbGljayB0byBjb3B5OiAke2V9YH0sbz8iXHUyNzEzIExpbmsgY29waWVkISI6dCl9dmFyIEtFPTIzMCxkbj0iZHJlYW0tdGFzayIsWUU9MjgwO2Z1bmN0aW9uIHFFKGUsdCl7cmV0dXJuWy4uLmVdLnNvcnQoKHIsbyk9Pm8ucmF0aW5nLXIucmF0aW5nKS5zbGljZSgwLHQpfWZ1bmN0aW9uIFFFKGUpe3JldHVybiBlPj04PyJoaWdoIjplPj01PyJtZWRpdW0iOiJsb3cifWZ1bmN0aW9uIGtyKGUpe3JldHVybiBlPy5zdWdnZXN0aW9uSWR8fGU/LnV1aWR8fGAke2U/LnRpdGxlfHwidW50aXRsZWQifTo6JHtlPy5yYXRpbmd8fDB9Ojoke2U/LmV4cGxhbmF0aW9ufHwiIn1gfWZ1bmN0aW9uIHBpKCl7cmV0dXJuIGhnKGRuKS5pY29ufWZ1bmN0aW9uIEpFKGUsdCxuKXtyZXR1cm4gbi5pc0V4aXN0aW5nJiZuLnNvdXJjZU5vdGVOYW1lP2UoInNwYW4iLHtjbGFzc05hbWU6ImRyZWFtLXRhc2stc291cmNlLW5vdGUtYmFkZ2UiLHRpdGxlOm4uc291cmNlTm90ZU5hbWU/YFRhc2sgaW4gbm90ZTogJHtuLnNvdXJjZU5vdGVOYW1lfWA6Ik9wZW4gdGhpcyB0YXNrIn0sbi5zb3VyY2VOb3RlTmFtZSk6IW4uaXNFeGlzdGluZyYmdD9lKCJzcGFuIix7Y2xhc3NOYW1lOiJkcmVhbS10YXNrLW5ldy1iYWRnZSIsdGl0bGU6Ik5ldyB0YXNrIFx1MjAxNCBjbGljayB0byBjcmVhdGUifSwiK25ldyIpOm51bGx9ZnVuY3Rpb24gbjAoZSx0LG4pe3JldHVybiB0P2UoImEiLHtocmVmOiIjIixjbGFzc05hbWU6IndpZGdldC1oZWFkZXItYWN0aW9uIixvbkNsaWNrOm4sdGl0bGU6Ik9wZW4gdG9kYXkncyBwcm9wb3NlZCB0YXNrcyBub3RlIn0sIlx1ezFGNUQyfVx1RkUwRiBOb3RlIik6bnVsbH1mdW5jdGlvbiBYRShlLHQpe3JldHVybiBlKCJhIix7aHJlZjoiIyIsY2xhc3NOYW1lOiJ3aWRnZXQtaGVhZGVyLWFjdGlvbiIsb25DbGljazp0LHRpdGxlOiJHZXQgbmV3IHRhc2sgc3VnZ2VzdGlvbnMgKGV4Y2x1ZGVzIHRhc2tzIHNob3duIHRvZGF5KSJ9LCJcdXsxRjUwNH0gUmVzZWVkIil9ZnVuY3Rpb24gWkUoZSl7cmV0dXJuIGUoZmUse3RpdGxlOmRlKGRuKSxpY29uOnBpKCksd2lkZ2V0SWQ6ZG59LGUoImRpdiIse2NsYXNzTmFtZToiZHJlYW0tdGFzay1sb2FkaW5nIn0sZSgiZGl2Iix7Y2xhc3NOYW1lOiJkcmVhbS10YXNrLXNwaW5uZXIifSksZSgicCIsbnVsbCwiQW5hbHl6aW5nIHRoZSBmaW5lc3QgdGFza3MgXHUyMDI2IikpKX1mdW5jdGlvbiBlVChlLHQsbil7bGV0IHI9bj9gTm8gQVBJIGtleSBpcyBhdmFpbGFibGUgZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgQUkgcHJvdmlkZXIsICR7bn0uYDpgRHJlYW1UYXNrIHVzZXMgQUkgdG8gc3VnZ2VzdCB0YXNrcyBhbGlnbmVkIHdpdGggeW91ciBnb2FscyAoYXMgZGVmaW5lZCBpbiB0aGUgZGFzaGJvYXJkJ3MgIiR7ZGUoInBsYW5uaW5nIil9IiBjb21wb25lbnQpLiBBbiBMTE0gcHJvdmlkZXIgYW5kIEFQSSBrZXkgYXJlIHJlcXVpcmVkYDtyZXR1cm4gZShmZSx7dGl0bGU6ZGUoZG4pLGljb246cGkoKSx3aWRnZXRJZDpkbn0sZSgiZGl2Iix7Y2xhc3NOYW1lOiJkcmVhbS10YXNrLW5vLWNvbmZpZyJ9LGUoInAiLHtjbGFzc05hbWU6ImRyZWFtLXRhc2stbm8tY29uZmlnLXRleHQifSxyKSxlKCJwIix7Y2xhc3NOYW1lOiJkcmVhbS10YXNrLW5vLWNvbmZpZy10ZXh0In0sIk5vIEFQSSBrZXk/IEluc3RhbGwgIixlKGxwLHt1cmw6Imh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vcGx1Z2lucy9hbXBsZV9hZ2VudF9wcm8iLGNsYXNzTmFtZToiZHJlYW0tdGFzay1zZXR0aW5ncy1saW5rIn0sIkFtcGxlbm90ZVx1MjAxOXMgQUkgaW50ZWdyYXRpb24iKSwiIHRvIGVuYWJsZSBzdWdnZXN0ZWQgdGFza3MgYW5kIDEwKyBvdGhlciBBSSBmZWF0dXJlcyBcdTIwMTQgbm8gQVBJIGtleSByZXF1aXJlZC4iKSxlKCJwIix7Y2xhc3NOYW1lOiJkcmVhbS10YXNrLW5vLWNvbmZpZy10ZXh0In0sZSgiYSIse2hyZWY6IiMiLGNsYXNzTmFtZToiZHJlYW0tdGFzay1zZXR0aW5ncy1saW5rIixvbkNsaWNrOnR9LCJDb25maWd1cmUgQUkgc2V0dGluZ3MgXHUyMTkyIikpKSl9ZnVuY3Rpb24gdFQoZSx0LG4scixvKXtsZXR7ZXJyb3I6YSxlcnJvckNvZGU6aSxlcnJvckRldGFpbDpzLHByb3ZpZGVyTmFtZTpsfT10LHU7c3dpdGNoKGkpe2Nhc2UiaW52YWxpZF9hcGlfa2V5Ijp1PVtlKCJwIixudWxsLGBUaGUgQVBJIGtleSBmb3IgJHtsfHwieW91ciBBSSBwcm92aWRlciJ9IGFwcGVhcnMgdG8gYmUgaW52YWxpZCBvciB1bmF1dGhvcml6ZWQuYCksZSgicCIsbnVsbCwiUGxlYXNlIGNoZWNrIHlvdXIgQVBJIGtleSBpbiAiLGUoImEiLHtocmVmOiIjIixjbGFzc05hbWU6ImRyZWFtLXRhc2stc2V0dGluZ3MtbGluayIsb25DbGljazpvfSwiQUkgc2V0dGluZ3MiKSwiLiIpXTticmVhaztjYXNlIm5vX3BsYW5uaW5nX2RhdGEiOnU9W2UoInAiLG51bGwsIkRyZWFtVGFzayBuZWVkcyBwbGFubmluZyBjb250ZXh0IHRvIGdlbmVyYXRlIHN1Z2dlc3Rpb25zLiIpLGUoInAiLG51bGwsIlBvcHVsYXRlIHlvdXIgcXVhcnRlcmx5IGFuZC9vciBtb250aGx5IHBsYW4gdG8gcmVjZWl2ZSBBSS1zdWdnZXN0ZWQgdGFza3MuIildO2JyZWFrO2Nhc2UicGFyc2VfZXJyb3IiOnU9W2UoInAiLG51bGwsIlVuYWJsZSB0byBzdWNjZXNzZnVsbHkgcHJvY2VzcyB0aGUgQUkgcHJvdmlkZXIncyByZXNwb25zZS4iKSxlKCJwIix7Y2xhc3NOYW1lOiJkcmVhbS10YXNrLWVycm9yLWRldGFpbCJ9LCJJZiB0aGlzIHBlcnNpc3RzLCBwbGVhc2UgY29udGFjdCBzdXBwb3J0QGFtcGxlbm90ZS5jb20iLHM/YCB3aXRoIHRoaXMgZGV0YWlsOiAke3N9YDoiIildO2JyZWFrO2RlZmF1bHQ6dT1bZSgicCIsbnVsbCxhfHwiQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZC4iKV19cmV0dXJuIGUoZmUse3RpdGxlOmRlKGRuKSxpY29uOnBpKCksd2lkZ2V0SWQ6ZG4saGVhZGVyQWN0aW9uczpufSxlKCJkaXYiLHtjbGFzc05hbWU6ImRyZWFtLXRhc2stZXJyb3IifSwuLi51LGUoImJ1dHRvbiIse2NsYXNzTmFtZToiZHJlYW0tdGFzay1yZXRyeSIsb25DbGljazpyfSwiUmV0cnkiKSkpfWZ1bmN0aW9uIG5UKGUsdCxuKXtyZXR1cm4gZShmZSx7dGl0bGU6ZGUoZG4pLGljb246cGkoKSx3aWRnZXRJZDpkbixoZWFkZXJBY3Rpb25zOnR9LGUoImRpdiIse2NsYXNzTmFtZToiZHJlYW0tdGFzay1lbXB0eSJ9LGUoInAiLG51bGwsIk5vIHRhc2sgc3VnZ2VzdGlvbnMgYXZhaWxhYmxlLiIpLGUoImJ1dHRvbiIse2NsYXNzTmFtZToiZHJlYW0tdGFzay1yZXRyeSIsb25DbGljazpufSwiUmVmcmVzaCIpKSl9ZnVuY3Rpb24gclQoZSx0LG4scixvLGEsaSxzKXtsZXQgbD1xRSh0LG4pLHtkaXNtaXNzaW5nVGFza0tleXM6dSxleHBhbmRlZEV4cGxhbmF0aW9uS2V5czpjLG9uQ29tcGxldGU6ZCxvblByZXNlcnZlOnAsb25SZW1vdmU6eSxvblNjaGVkdWxlOmgsb25Ub2dnbGVFeHBsYW5hdGlvbjp3fT1zO3JldHVybiBlKGZlLHtoZWFkZXJBY3Rpb25zOnIsc3VidGl0bGU6IldoYXQgaWYgeW91IGRpZCBpdCB0b2RheT8iLHRpdGxlOmRlKGRuKSxpY29uOnBpKCksd2lkZ2V0SWQ6ZG59LGUoImRpdiIse2NsYXNzTmFtZToiZHJlYW0tdGFzay1saXN0IixyZWY6YX0sLi4ubC5tYXAoKGIsZyk9PntsZXQgbT0hIW8sdj1iLm5hdGl2ZVRhc2t8fG51bGwsZj12Py5zdGFydEF0IT1udWxsfHxiLnN0YXJ0QXQhPW51bGwsRT1rcihiKSxrPXUuaGFzKEUpO3JldHVybiBfKCJSZW5kZXJpbmcgZHJlYW1UYXNrIix7Li4uYixpc0NsaWNrYWJsZTptLGlzRGlzbWlzc2luZzprLHRhc2s6dn0pLGUoImRpdiIse2tleTpFfHxnLGNsYXNzTmFtZTpgZHJlYW0tdGFzay1jYXJkJHtiLmlzRXhpc3Rpbmc/IiI6IiBkcmVhbS10YXNrLWNhcmQtLWludmVudGVkIn0ke2s/IiBkcmVhbS10YXNrLWNhcmQtLWRpc21pc3NpbmciOiIifWB9LGUoImRpdiIse2NsYXNzTmFtZToiZHJlYW0tdGFzay1jYXJkLWhlYWRlciJ9LGUoInNwYW4iLHtjbGFzc05hbWU6YGRyZWFtLXRhc2stY2FyZC10aXRsZSR7bT8iIGRyZWFtLXRhc2stY2FyZC10aXRsZS0tY2xpY2thYmxlIjoiIn1gLG9uQ2xpY2s6bT8oKT0+byhiKTp2b2lkIDAscm9sZTptPyJidXR0b24iOnZvaWQgMCx0YWJJbmRleDptPzA6dm9pZCAwLG9uS2V5RG93bjptP049PnsoTi5rZXk9PT0iRW50ZXIifHxOLmtleT09PSIgIikmJihOLnByZXZlbnREZWZhdWx0KCksbyhiKSl9OnZvaWQgMCx0aXRsZTpiLmlzRXhpc3Rpbmc/Ik9wZW4gdGhpcyB0YXNrIjoiQ2xpY2sgdG8gY3JlYXRlIHRoaXMgdGFzayIsZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6e19faHRtbDpzaShiLnRpdGxlKXx8Yi50aXRsZX19KSxKRShlLG0sYiksZSgic3BhbiIse2NsYXNzTmFtZTpgZHJlYW0tdGFzay1yYXRpbmcgZHJlYW0tdGFzay1yYXRpbmctLSR7UUUoYi5yYXRpbmcpfWAsdGl0bGU6YFJlbGV2YW5jZTogJHtiLnJhdGluZ30vMTBgfSxgJHtiLnJhdGluZ30vMTBgKSksZSgicCIse2NsYXNzTmFtZTpgZHJlYW0tdGFzay1jYXJkLWV4cGxhbmF0aW9uJHtjLmhhcyhFKT8iIGRyZWFtLXRhc2stY2FyZC1leHBsYW5hdGlvbi0tZXhwYW5kZWQiOiIifWAsdGl0bGU6Yi5leHBsYW5hdGlvbj8ubGVuZ3RoPktFP2IuZXhwbGFuYXRpb246bnVsbCxvbkNsaWNrOigpPT53KGIpLGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOntfX2h0bWw6c2koYi5leHBsYW5hdGlvbil8fCIifX0pLGUoImRpdiIse2NsYXNzTmFtZToiZHJlYW0tdGFzay1jYXJkLWFjdGlvbnMifSxlKCJhIix7aHJlZjoiIyIsY2xhc3NOYW1lOiJkcmVhbS10YXNrLWNhcmQtYWN0aW9uIixvbkNsaWNrOk49PnAoTixiKSx0aXRsZTpiLnByZXNlcnZlVGhyb3VnaFRvbW9ycm93PyJDbGlja2luZyB0aGlzIHdpbGwgcmVtb3ZlIHByZXNlcnZlIHN0YXR1cyBzbyB0aGUgdGFzayBjYW4gcmVzZWVkIG5vcm1hbGx5IjoiQ2xpY2tpbmcgdGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSB0YXNrIHJlbWFpbnMgcHJlc2VudCBpbiB5b3VyIERyZWFtIFRhc2sgbGlzdCB0aHJvdWdoIHRvbW9ycm93IChub3JtYWxseSB0YXNrcyByZXNlZWQgZGFpbHkpIn0sYi5wcmVzZXJ2ZVRocm91Z2hUb21vcnJvdz8iXHV7MUY2QUJ9IFJlbW92ZSBwcmVzZXJ2ZSBzdGF0dXMiOiJcdXsxRjQ0RH0gUHJlc2VydmUgdGhyb3VnaCB0b21vcnJvdyIpLGUoImEiLHtocmVmOiIjIixjbGFzc05hbWU6ImRyZWFtLXRhc2stY2FyZC1hY3Rpb24iLG9uQ2xpY2s6Tj0+ZChOLGIpLHRpdGxlOiJNYXJrIHRoaXMgdGFzayBjb21wbGV0ZSBhbmQgcmVwbGFjZSBpdCB3aXRoIGFub3RoZXIgc3VnZ2VzdGlvbiB3aGVuIGF2YWlsYWJsZSJ9LCJcdTI3MDUgQ29tcGxldGVkIiksZj9udWxsOmUoImEiLHtocmVmOiIjIixjbGFzc05hbWU6ImRyZWFtLXRhc2stY2FyZC1hY3Rpb24iLG9uQ2xpY2s6Tj0+aChOLGIpLHRpdGxlOiJTY2hlZHVsZSB0aGlzIHRhc2sgZm9yIGEgc3BlY2lmaWMgZGF0ZSBhbmQgdGltZSJ9LCJcdXsxRjRDNX0gU2NoZWR1bGUiKSxlKCJhIix7aHJlZjoiIyIsY2xhc3NOYW1lOiJkcmVhbS10YXNrLWNhcmQtYWN0aW9uIixvbkNsaWNrOk49PnkoTixiKSx0aXRsZToiUmVtb3ZlIHRoaXMgdGFzayBhbmQgcmVwbGFjZSBpdCB3aXRoIGFub3RoZXIgc3VnZ2VzdGlvbiB3aGVuIGF2YWlsYWJsZSJ9LCJcdTI3NEMgUmVtb3ZlIikpKX0pLGk/ZSgicCIse2NsYXNzTmFtZToiZHJlYW0tdGFzay1sbG0tYXR0cmlidXRpb24ifSxpKTpudWxsKSl9ZnVuY3Rpb24gb1QoZSx7bG9hZGluZzp0LGVycm9yOm4sdGFza3M6cixtYXhUYXNrczpvLG5vdGVMaW5rOmEsaGVhZGVyQWN0aW9uczppLG9uU2V0dGluZ3NDbGljazpzLHJ1bkFuYWx5c2lzOmwsb25UYXNrQ2xpY2s6dSxsaXN0UmVmOmMsbGxtQXR0cmlidXRpb25Gb290ZXI6ZCxhY3Rpb25IYW5kbGVyczpwfSl7cmV0dXJuIHQ/WkUoZSk6bj90VChlLG4sYSwoKT0+bChudWxsKSxzKTohcnx8ci5sZW5ndGg9PT0wP25UKGUsYSwoKT0+bChudWxsKSk6clQoZSxyLG8saSx1LGMsZCxwKX1mdW5jdGlvbiBhVChlLHtub3RlVVVJRDp0LG9uT3Blbk5vdGU6bixvblJlc2VlZDpyfSl7cmV0dXJuIGUoInNwYW4iLHtjbGFzc05hbWU6ImRyZWFtLXRhc2staGVhZGVyLWFjdGlvbnMifSxYRShlLHIpLG4wKGUsdCxuKSl9ZnVuY3Rpb24gaVQoZSx0LG4scil7bGV0W28sYV09KDAsY2UudXNlU3RhdGUpKCgpPT5uZXcgU2V0KSxbaSxzXT0oMCxjZS51c2VTdGF0ZSkoKCk9Pm5ldyBTZXQpLGw9KDAsY2UudXNlQ2FsbGJhY2spKCgpPT57YShuZXcgU2V0KSxzKG5ldyBTZXQpfSxbXSksdT0oMCxjZS51c2VDYWxsYmFjaykoYXN5bmMoZyxtKT0+e2F3YWl0ICR2KGUsbixnLG0pfSxbZSxuXSksYz0oMCxjZS51c2VDYWxsYmFjaykoZz0+e2xldCBtPWtyKGcpO2Eodj0+e2xldCBmPW5ldyBTZXQodik7cmV0dXJuIGYuYWRkKG0pLGZ9KSxzZXRUaW1lb3V0KCgpPT57cih2PT4odnx8W10pLmZpbHRlcihmPT5rcihmKSE9PW0pKSxhKHY9PntsZXQgZj1uZXcgU2V0KHYpO3JldHVybiBmLmRlbGV0ZShtKSxmfSkscyh2PT57bGV0IGY9bmV3IFNldCh2KTtyZXR1cm4gZi5kZWxldGUobSksZn0pfSxZRSl9LFtyXSksZD0oMCxjZS51c2VDYWxsYmFjaykoZz0+e2xldCBtPWcuY3VycmVudFRhcmdldD8uY2xvc2VzdD8uKCIuZHJlYW0tdGFzay1jYXJkIik7aWYoIW18fHR5cGVvZiB3aW5kb3c+InUiKXJldHVybjtsZXQgdj1tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOyF2LndpZHRofHwhdi5oZWlnaHR8fGh2KHtvcmlnaW46e3g6KHYubGVmdCt2LndpZHRoLzIpL3dpbmRvdy5pbm5lcldpZHRoLHk6KHYudG9wK3YuaGVpZ2h0LzIpL3dpbmRvdy5pbm5lckhlaWdodH0scGFydGljbGVDb3VudDo5MCxzcHJlYWQ6NzUsc3RhcnRWZWxvY2l0eTo0Mn0pfSxbXSkscD0oMCxjZS51c2VDYWxsYmFjaykoYXN5bmMoZyxtKT0+e2cucHJldmVudERlZmF1bHQoKSxkKGcpO2xldCB2PW0udXVpZD9udWxsOmF3YWl0IGUwKGUpLGY9YXdhaXQgdDAoZSx2LG0pO2YmJmF3YWl0IHUobSx7Y29tcGxldGVkQXQ6ZixyZW1vdmVkQXQ6bnVsbH0pLGMobSl9LFtlLGQsdSxjXSkseT0oMCxjZS51c2VDYWxsYmFjaykoYXN5bmMoZyxtKT0+e2cucHJldmVudERlZmF1bHQoKTtsZXQgdj1rcihtKSxmPSFtLnByZXNlcnZlVGhyb3VnaFRvbW9ycm93O3IoRT0+KEV8fFtdKS5tYXAoaz0+a3Ioayk9PT12P3suLi5rLHByZXNlcnZlVGhyb3VnaFRvbW9ycm93OmZ9OmspKSxhd2FpdCB1KG0se3ByZXNlcnZlVGhyb3VnaFRvbW9ycm93OmZ9KX0sW3Uscl0pLGg9KDAsY2UudXNlQ2FsbGJhY2spKGFzeW5jKGcsbSk9PntnLnByZXZlbnREZWZhdWx0KCk7bGV0IHY9bmV3IERhdGUoKS50b0lTT1N0cmluZygpO2F3YWl0IHUobSx7Y29tcGxldGVkQXQ6bnVsbCxyZW1vdmVkQXQ6dn0pLGMobSl9LFt1LGNdKSx3PSgwLGNlLnVzZUNhbGxiYWNrKShhc3luYyhnLG0pPT57Zy5wcmV2ZW50RGVmYXVsdCgpO2xldHtldmVudHM6dix0YXNrczpmfT1hd2FpdCBxdihlKSxFPW5ldyBEYXRlLGs9bmV3IERhdGUoRS5nZXRGdWxsWWVhcigpLEUuZ2V0TW9udGgoKSxFLmdldERhdGUoKSwwLDAsMCksTj1NYXRoLmZsb29yKGsuZ2V0VGltZSgpLzFlMyksRD1ZdihFLHYsZik7aWYoRC5sZW5ndGg9PT0wKXthd2FpdCBlLmFsZXJ0KCJObyBhdmFpbGFibGUgMzAtbWludXRlIHNsb3RzIHRvZGF5LiBQbGVhc2Ugc2NoZWR1bGUgbWFudWFsbHkuIik7cmV0dXJufWxldCBPPWF3YWl0IGUucHJvbXB0KCJQaWNrIHdoZW4gdG8gc2NoZWR1bGUgdGhpcyB0YXNrLiBUaW1lcyBsaXN0ZWQgYXJlIGZyZWUgdG9kYXk7IGNob29zZSBhIGRpZmZlcmVudCBkYXRlIG9ubHkgaWYgdGhvc2UgY29uZmxpY3RzIGFyZSBhY2NlcHRhYmxlLiIse2lucHV0czpbe2xhYmVsOiJEYXRlIix0eXBlOiJkYXRlIix2YWx1ZTpOfSx7bGFiZWw6IlRpbWUiLG9wdGlvbnM6RCx0eXBlOiJzZWxlY3QiLHZhbHVlOkRbMF0udmFsdWV9XX0pO2lmKCFPKXJldHVybjtsZXRbVCx6XT1PO2lmKFQ9PW51bGx8fHo9PW51bGwpcmV0dXJuO2xldCBQPUp2KFQseik7aWYoUD09bnVsbCl7XygiW0RyZWFtVGFza10gU2NoZWR1bGU6IGludmFsaWQgZGF0ZS90aW1lIHJldHVybmVkIGJ5IHByb21wdCIse2RhdGVTZWM6VCx0aW1lTWludXRlczp6fSksYXdhaXQgZS5hbGVydCgiQ291bGQgbm90IHNjaGVkdWxlOiB0aGUgc2VsZWN0ZWQgZGF0ZSBvciB0aW1lIHdhcyBpbnZhbGlkLiIpO3JldHVybn1sZXQgQz1hd2FpdCBRdihlLHQsUCxtKTtpZighQy50YXNrVXVpZCl7XygiW0RyZWFtVGFza10gU2NoZWR1bGUgZmFpbGVkIixDKTtsZXQgJD1DLnJlYXNvbj09PSJtaXNzaW5nX25vdGUiPyJDb3VsZCBub3Qgc2NoZWR1bGU6IG5vIHRhcmdldCBub3RlIGlzIGF2YWlsYWJsZSBmb3IgdGhpcyBzdWdnZXN0aW9uLiI6IkNvdWxkIG5vdCBzY2hlZHVsZSB0aGlzIHRhc2suIFBsZWFzZSB0cnkgYWdhaW4gb3Igc2NoZWR1bGUgaXQgbWFudWFsbHkuIjthd2FpdCBlLmFsZXJ0KCQpO3JldHVybn1hd2FpdCB1KG0se3Rhc2tVdWlkOkMudGFza1V1aWR9KTtsZXQgTD1rcihtKTtpZihyKCQ9PigkfHxbXSkubWFwKFc9PmtyKFcpPT09TD97Li4uVyxpc0V4aXN0aW5nOiEwLG5vdGVVVUlEOkMubm90ZVVVSUR8fFcubm90ZVVVSUR8fHQsc3RhcnRBdDpDLnN0YXJ0QXR8fFAsdXVpZDpDLnRhc2tVdWlkfTpXKSksdHlwZW9mIHdpbmRvdzwidSIpe2xldCAkPW5ldyBDdXN0b21FdmVudChnbCx7Y29udGVudDptLnRpdGxlLG5vdGVVVUlEOkMubm90ZVVVSUR8fG0ubm90ZVVVSUR8fHQsc3RhcnRBdDpQLHRhc2tVdWlkOkMudGFza1V1aWR9KTt3aW5kb3cuZGlzcGF0Y2hFdmVudCgkKX19LFtlLHQsdSxyXSksYj0oMCxjZS51c2VDYWxsYmFjaykoZz0+e2xldCBtPWtyKGcpO3Modj0+e2xldCBmPW5ldyBTZXQodik7cmV0dXJuIGYuaGFzKG0pP2YuZGVsZXRlKG0pOmYuYWRkKG0pLGZ9KX0sW10pO3JldHVybntkaXNtaXNzaW5nVGFza0tleXM6byxleHBhbmRlZEV4cGxhbmF0aW9uS2V5czppLG9uQ29tcGxldGVUYXNrOnAsb25QcmVzZXJ2ZVRhc2s6eSxvblJlbW92ZVRhc2s6aCxvblNjaGVkdWxlVGFzazp3LG9uVG9nZ2xlRXhwbGFuYXRpb246YixyZXNldEFjdGlvblN0YXRlOmx9fWZ1bmN0aW9uIHVwKHthcHA6ZSxncmlkSGVpZ2h0U2l6ZTp0LGdyaWRXaWR0aFNpemU6bixvbk9wZW5TZXR0aW5nczpyLHByb3ZpZGVyQXBpS2V5Om8scHJvdmlkZXJFbTphfSl7bGV0IGk9Y2UuY3JlYXRlRWxlbWVudCxbcyxsXT0oMCxjZS51c2VTdGF0ZSkoITEpLFt1LGNdPSgwLGNlLnVzZVN0YXRlKShudWxsKSxbZCxwXT0oMCxjZS51c2VTdGF0ZSkobnVsbCksW3ksaF09KDAsY2UudXNlU3RhdGUpKG51bGwpLFt3LGJdPSgwLGNlLnVzZVN0YXRlKShudWxsKSxbZyxtXT0oMCxjZS51c2VTdGF0ZSkobnVsbCksWyx2XT0oMCxjZS51c2VTdGF0ZSkoKCk9PmNpKGUpKSxmPSgwLGNlLnVzZVJlZikobnVsbCksaz0hISh0eXBlb2YgcHJvY2VzczwidSImJnByb2Nlc3MuZW52Py5PUEVOX0FJX0FDQ0VTU19UT0tFTnx8IiJ8fG8pLE49YT94cihhKTpudWxsLEQ9UHYobix0KSxPPUx2KG4sdCksVD16digpLHo9KDAsY2UudXNlUmVmKShPKSx7ZGlzbWlzc2luZ1Rhc2tLZXlzOlAsZXhwYW5kZWRFeHBsYW5hdGlvbktleXM6QyxvbkNvbXBsZXRlVGFzazpMLG9uUHJlc2VydmVUYXNrOiQsb25SZW1vdmVUYXNrOlcsb25TY2hlZHVsZVRhc2s6TSxvblRvZ2dsZUV4cGxhbmF0aW9uOksscmVzZXRBY3Rpb25TdGF0ZTpvZX09aVQoZSx3LHksYyksUz0oMCxjZS51c2VDYWxsYmFjaykoYXN5bmMoUSxuZSk9PntsZXQgdGU9KFF8fFtdKS5maWx0ZXIoQm9vbGVhbik7aWYodGUubGVuZ3RoPT09MClyZXR1cm4gbmU7bGV0IGllPWF3YWl0IEZ2KGUsbmUsdGUpO3JldHVybiB2KGllKSxpZX0sW2VdKSx4PSgwLGNlLnVzZUNhbGxiYWNrKShhc3luYyhRLG5lPXt9KT0+e2lmKCFrKXJldHVybjtsZXQgdGU9bmUucHJvdmlkZXJFbU92ZXJyaWRlP3hyKG5lLnByb3ZpZGVyRW1PdmVycmlkZSk6TjtsKCEwKSxwKG51bGwpLG0obnVsbCk7dHJ5e2xldCBpZT1hd2FpdCBXdihlLHtleGNsdWRlVXVpZHM6USxvcHRpb25zOm5lLHByb3Bvc2VkVGFza3NOb3RlTmFtZTpULG1heFRhc2tzOk99KTthd2FpdCBIdihpZSx7cHJvdmlkZXJOYW1lOnRlLGFwcDplLHJlY29yZFRhc2tVdWlkczpTLHNldEVycm9yOnAsc2V0VGFza3M6YyxzZXROb3RlVVVJRDpoLHNldERlZmF1bHROb3RlVVVJRDpiLHNldExsbUF0dHJpYnV0aW9uRm9vdGVyOm19KX1jYXRjaChpZSl7cCh7ZXJyb3I6aWUubWVzc2FnZXx8IkFuYWx5c2lzIGZhaWxlZCIsZXJyb3JDb2RlOiJsbG1fZXJyb3IiLHByb3ZpZGVyTmFtZTp0ZX0pfWZpbmFsbHl7bCghMSl9fSxbayxlLFMsTyxULE5dKTsoMCxjZS51c2VFZmZlY3QpKCgpPT57bGV0IFE9Y2koZSk7dihRKSx4KG51bGwse21pbmltdW1UYXNrQ291bnQ6T30pfSxbXSksKDAsY2UudXNlRWZmZWN0KSgoKT0+e2lmKCFrKXJldHVybjtsZXQgUT16LmN1cnJlbnQ7ei5jdXJyZW50PU8sanYoe21heFRhc2tzOk8scHJldmlvdXNNYXhUYXNrczpRLHRhc2tzOnV9KSYmYXAoZSx4LE8pfSxbZSxrLE8seCx1XSk7bGV0IFI9KDAsY2UudXNlUmVmKShrKTsoMCxjZS51c2VFZmZlY3QpKCgpPT57bGV0IFE9Ui5jdXJyZW50O1IuY3VycmVudD1rLCFRJiZrJiYhdSYmeChudWxsLHttaW5pbXVtVGFza0NvdW50Ok99KX0sW2ssdSx4LE9dKSwoMCxjZS51c2VFZmZlY3QpKCgpPT57ZGwoZi5jdXJyZW50KX0pO2xldCBCPWFzeW5jIFE9PntRLnByZXZlbnREZWZhdWx0KCkseSYmYXdhaXQgZS5uYXZpZ2F0ZShgaHR0cHM6Ly93d3cuYW1wbGVub3RlLmNvbS9ub3Rlcy8ke3l9YCl9LEg9UT0+e1EucHJldmVudERlZmF1bHQoKSxCdihyKX0sWT1hc3luYyBRPT57US5wcmV2ZW50RGVmYXVsdCgpO2xldCBuZT1pcChlLnNldHRpbmdzKSx0ZT17fTtpZihuZS5sZW5ndGg+MSl7bGV0IGllPWF3YWl0IFZ2KGUsYSk7aWYoIWllKXJldHVybjt0ZT17cHJvdmlkZXJFbU92ZXJyaWRlOmllLnByb3ZpZGVyRW19fWVsc2UgbmUubGVuZ3RoPT09MSYmKHRlPXtwcm92aWRlckVtT3ZlcnJpZGU6bmVbMF0ucHJvdmlkZXJFbX0pO2MobnVsbCksb2UoKSxtKG51bGwpLGFwKGUseCxPLHRlKX07aWYoIWspcmV0dXJuIF8oYGhhc0xsbUNvbmZpZyBpcyAke2t9IHdoZXJlYXMgcHJvdmlkZXJOYW1lIGlzICR7Tn0gYW5kIHByb3ZpZGVyQXBpS2V5IGlzICR7b31gKSxlVChpLEgsTik7bGV0IHE9YVQoaSx7bm90ZVVVSUQ6eSxvbk9wZW5Ob3RlOkIsb25SZXNlZWQ6WX0pLFY9bjAoaSx5LEIpO3JldHVybiBvVChpLHtlcnJvcjpkLGhlYWRlckFjdGlvbnM6cSxsaXN0UmVmOmYsbG9hZGluZzpzLGxsbUF0dHJpYnV0aW9uRm9vdGVyOmcsbWF4VGFza3M6RCxub3RlTGluazpWLG9uVGFza0NsaWNrOlE9PlV2KGUsUSx3KSx0YXNrczp1LG9uU2V0dGluZ3NDbGljazpILHJ1bkFuYWx5c2lzOngsYWN0aW9uSGFuZGxlcnM6e2Rpc21pc3NpbmdUYXNrS2V5czpQLGV4cGFuZGVkRXhwbGFuYXRpb25LZXlzOkMsb25Db21wbGV0ZTpMLG9uUHJlc2VydmU6JCxvblJlbW92ZTpXLG9uU2NoZWR1bGU6TSxvblRvZ2dsZUV4cGxhbmF0aW9uOkt9fSl9dmFyIE1lPXllKG1lKCkpO3ZhciByMD0iZGF5LXNrZXRjaCIsbzA9NixzVD0yMSxsVD0xZTQsdVQ9MzAwLFNyPUFycmF5LmZyb20oe2xlbmd0aDpzVC1vMCsxfSwoZSx0KT0+bzArdCk7ZnVuY3Rpb24gaTAoZSl7cmV0dXJuIGUudG9Mb2NhbGVEYXRlU3RyaW5nKCJlbi1VUyIse3dlZWtkYXk6ImxvbmciLG1vbnRoOiJsb25nIixkYXk6Im51bWVyaWMiLHllYXI6Im51bWVyaWMifSl9ZnVuY3Rpb24gY1QoZSl7cmV0dXJuYERheSBTa2V0Y2ggJHtpMChlKX1gfWZ1bmN0aW9uIGRUKGUpe2xldCB0PXt9O2lmKCFlKXJldHVybiB0O2ZvcihsZXQgbiBvZiBlLnNwbGl0KGAKYCkpe2xldCByPW4ubWF0Y2goL14oXGR7MSwyfSg/OmFtfHBtKSk6XHMqKC4qKS9pKTtpZighciljb250aW51ZTtsZXQgbz1yWzFdLnRvTG93ZXJDYXNlKCksYT1yWzJdLnJlcGxhY2UoL1xcKyQvLCIiKS50cmltKCksaT1wVChvKTtpIT09bnVsbCYmU3IuaW5jbHVkZXMoaSkmJih0W2ldPWEpfXJldHVybiB0fWZ1bmN0aW9uIHBUKGUpe2xldCB0PWUubWF0Y2goL14oXGR7MSwyfSkoYW18cG0pJC9pKTtpZighdClyZXR1cm4gbnVsbDtsZXQgbj1wYXJzZUludCh0WzFdLDEwKSxyPXRbMl0udG9Mb3dlckNhc2UoKTtyZXR1cm4gcj09PSJhbSImJm49PT0xMj9uPTA6cj09PSJwbSImJm4hPT0xMiYmKG4rPTEyKSxufWZ1bmN0aW9uIGZUKGUpe3JldHVybiBTci5tYXAodD0+e2xldCBuPVZvKHQpLHI9ZVt0XXx8IiI7cmV0dXJuYCR7bn06ICR7cn1gfSkuam9pbihgCmApfWZ1bmN0aW9uIHZsKCl7bGV0IGU9e307cmV0dXJuIFNyLmZvckVhY2godD0+e2VbdF09IiJ9KSxlfWZ1bmN0aW9uIGEwKGUpe3JldHVybiBlP2UgaW5zdGFuY2VvZiBEYXRlP2UuZ2V0VGltZSgpOnR5cGVvZiBlPT0ibnVtYmVyIj9lPDFlMTA/ZSoxZTM6ZTpudWxsOm51bGx9ZnVuY3Rpb24gbVQoZSl7bGV0IHQ9YTAoZT8uc3RhcnRBdCk7aWYoIXQpcmV0dXJuW107bGV0IG49bmV3IERhdGUodCkuZ2V0SG91cnMoKSxyPVtuXSxvPWEwKGU/LmVuZEF0KTtpZighb3x8bzw9dClyZXR1cm4gcjtsZXQgYT1NYXRoLmZsb29yKChvLXQpLyg2MCo2MCoxZTMpKTtmb3IobGV0IGk9MTtpPGE7aSs9MSlyLnB1c2gobitpKTtyZXR1cm4gcn1mdW5jdGlvbiBoVChlKXtpZighZT8uc3RhcnR8fCEoZS5zdGFydCBpbnN0YW5jZW9mIERhdGUpfHxlLmFsbERheSlyZXR1cm5bXTtsZXQgdD1lLnN0YXJ0LmdldEhvdXJzKCk7aWYoIWUuZW5kfHwhKGUuZW5kIGluc3RhbmNlb2YgRGF0ZSl8fGUuZW5kPD1lLnN0YXJ0KXJldHVyblt0XTtsZXQgbj1lLmVuZC5nZXRIb3VycygpKyhlLmVuZC5nZXRNaW51dGVzKCk+MD8xOjApLHI9W107Zm9yKGxldCBvPXQ7bzxuO28rKylyLnB1c2gobyk7cmV0dXJuIHIubGVuZ3RoPjA/cjpbdF19ZnVuY3Rpb24gZ1QoZSl7bGV0IHQ9KGU/LmNvbnRlbnR8fCIiKS5zcGxpdChgCmApWzBdO3JldHVybiBqeSh0KX1mdW5jdGlvbiB5VChlLHQpe3JldHVybiB0IT09bnVsbCYmSlNPTi5zdHJpbmdpZnkoZSkhPT1KU09OLnN0cmluZ2lmeSh0KX1mdW5jdGlvbiB2VChlLHQpe2xldCBuPXsuLi5lfTtyZXR1cm4gdC5mb3JFYWNoKHI9PntsZXQgbz1nVChyKTtvJiZtVChyKS5mb3JFYWNoKGE9PntTci5pbmNsdWRlcyhhKSYmIW5bYV0mJihuW2FdPW8pfSl9KSxufWZ1bmN0aW9uIHdUKGUsdCxuKXtpZighQXJyYXkuaXNBcnJheSh0KXx8dC5sZW5ndGg9PT0wKXJldHVybiBlO2xldCByPSRlKG4pLG89ey4uLmV9O3JldHVybiB0LmZvckVhY2goYT0+eyFhPy50aXRsZXx8YS5hbGxEYXl8fCEoYS5zdGFydCBpbnN0YW5jZW9mIERhdGUpfHwkZShhLnN0YXJ0KSE9PXJ8fGhUKGEpLmZvckVhY2goaT0+e1NyLmluY2x1ZGVzKGkpJiYhb1tpXSYmKG9baV09YS50aXRsZSl9KX0pLG99ZnVuY3Rpb24gYlQoe2FwcDplLG5vdGVOYW1lOnR9KXtsZXRbbixyXT0oMCxNZS51c2VTdGF0ZSkodmwpLFtvLGFdPSgwLE1lLnVzZVN0YXRlKSghMCksW2ksc109KDAsTWUudXNlU3RhdGUpKG51bGwpLFtsLHVdPSgwLE1lLnVzZVN0YXRlKShudWxsKSxjPSgwLE1lLnVzZVJlZikobnVsbCksZD0oMCxNZS51c2VSZWYpKG4pO2QuY3VycmVudD1uO2xldCBwPSgwLE1lLnVzZUNhbGxiYWNrKShhc3luYyB3PT57aWYoIWUpcmV0dXJuO2xldCBiPWZUKHcpO3RyeXtsZXQgZz1pO2d8fChnPShhd2FpdCBlLmZpbmROb3RlKHtuYW1lOnR9KSk/LnV1aWR8fGF3YWl0IGUuY3JlYXRlTm90ZSh0LFtYZV0pLHMoZykpLGF3YWl0IGUucmVwbGFjZU5vdGVDb250ZW50KHt1dWlkOmd9LGIpLHUoey4uLnd9KSxfKGBbRGF5U2tldGNoXSBwZXJzaXN0ZWQgJHt0fWApfWNhdGNoKGcpe18oIltEYXlTa2V0Y2hdIHNhdmUgZmFpbGVkIixnKX19LFtlLHQsaV0pLHk9KDAsTWUudXNlQ2FsbGJhY2spKCh3PWxUKT0+e2MuY3VycmVudCYmY2xlYXJUaW1lb3V0KGMuY3VycmVudCksYy5jdXJyZW50PXNldFRpbWVvdXQoKCk9PntwKGQuY3VycmVudCl9LHcpfSxbcF0pLGg9KDAsTWUudXNlQ2FsbGJhY2spKCgpPT57Yy5jdXJyZW50JiZjbGVhclRpbWVvdXQoYy5jdXJyZW50KSxwKGQuY3VycmVudCl9LFtwXSk7cmV0dXJuKDAsTWUudXNlRWZmZWN0KSgoKT0+e2xldCB3PSExO3JldHVybihhc3luYygpPT57YSghMCk7dHJ5e2xldCBiPWF3YWl0IGUuZmluZE5vdGUoe25hbWU6dH0pO2lmKHcpcmV0dXJuO2lmKGI/LnV1aWQpe3MoYi51dWlkKTtsZXQgZz1hd2FpdCBlLmdldE5vdGVDb250ZW50KHt1dWlkOmIudXVpZH0pO2lmKHcpcmV0dXJuO2xldCBtPXsuLi52bCgpLC4uLmRUKGcpfTtyKG0pLHUobSl9ZWxzZXtsZXQgZz12bCgpO3IoZyksdShnKX19Y2F0Y2goYil7aWYoXygiW0RheVNrZXRjaF0gbG9hZCBmYWlsZWQiLGIpLCF3KXtsZXQgZz12bCgpO3IoZyksdShnKX19ZmluYWxseXt3fHxhKCExKX19KSgpLCgpPT57dz0hMH19LFtlLHRdKSwoMCxNZS51c2VFZmZlY3QpKCgpPT4oKT0+e2MuY3VycmVudCYmY2xlYXJUaW1lb3V0KGMuY3VycmVudCl9LFtdKSx7ZW50cmllczpuLGlzRGlydHk6eVQobixsKSxsb2FkaW5nOm8sc2F2ZU5vdzpoLHNjaGVkdWxlU2F2ZTp5LHNldEVudHJpZXM6cn19ZnVuY3Rpb24geFQoe2FnZW5kYVRhc2tzOmUsY3VycmVudERhdGU6dCxsb2FkaW5nOm4sc2V0RW50cmllczpyfSl7KDAsTWUudXNlRWZmZWN0KSgoKT0+e2lmKCFlfHwhdHx8bilyZXR1cm47bGV0IG89JGUodCksYT1lW29dfHxbXTthLmxlbmd0aCE9PTAmJnIoaT0+e2xldCBzPXZUKGksYSk7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHMpPT09SlNPTi5zdHJpbmdpZnkoaSk/aTpzfSl9LFtlLHQsbixyXSl9ZnVuY3Rpb24ga1Qoe2NhbGVuZGFyRXZlbnRzOmUsY3VycmVudERhdGU6dCxsb2FkaW5nOm4sc2V0RW50cmllczpyfSl7KDAsTWUudXNlRWZmZWN0KSgoKT0+eyFlfHwhdHx8bnx8cihvPT57bGV0IGE9d1QobyxlLHQpO3JldHVybiBKU09OLnN0cmluZ2lmeShhKT09PUpTT04uc3RyaW5naWZ5KG8pP286YX0pfSxbZSx0LG4scl0pfWZ1bmN0aW9uIFNUKCl7bGV0IGU9KDAsTWUudXNlUmVmKSh7fSksdD0oMCxNZS51c2VDYWxsYmFjaykoKHIsbyk9PntvP2UuY3VycmVudFtyXT1vOmRlbGV0ZSBlLmN1cnJlbnRbcl19LFtdKTtyZXR1cm57aGFuZGxlSW5wdXRLZXlEb3duOigwLE1lLnVzZUNhbGxiYWNrKSgocixvKT0+e2lmKG8ua2V5IT09IkFycm93RG93biImJm8ua2V5IT09IkFycm93VXAiKXJldHVybjtpZihvLnByZXZlbnREZWZhdWx0KCksby5zaGlmdEtleSl7bGV0IHc9by5jdXJyZW50VGFyZ2V0LGI9dy52YWx1ZS5sZW5ndGg7by5rZXk9PT0iQXJyb3dVcCI/dy5zZXRTZWxlY3Rpb25SYW5nZSgwLGIsImJhY2t3YXJkIik6dy5zZXRTZWxlY3Rpb25SYW5nZSgwLGIsImZvcndhcmQiKTtyZXR1cm59bGV0IGE9U3IuaW5kZXhPZihyKTtpZihhPT09LTEpcmV0dXJuO2xldCBpPW8ua2V5PT09IkFycm93RG93biI/MTotMSxzPVNyW2EraV07aWYoIXMpcmV0dXJuO2xldCBsPW8uY3VycmVudFRhcmdldCx1PWUuY3VycmVudFtzXTtpZighdSlyZXR1cm47bGV0IGM9bC5zZWxlY3Rpb25TdGFydCxkPWwuc2VsZWN0aW9uRW5kLHA9dS52YWx1ZS5sZW5ndGgseT1jPT09bnVsbD9wOk1hdGgubWluKGMscCksaD1kPT09bnVsbD95Ok1hdGgubWluKGQscCk7dS5mb2N1cygpLHUuc2V0U2VsZWN0aW9uUmFuZ2UoeSxoKX0sW10pLHNldElucHV0UmVmOnR9fWZ1bmN0aW9uIEVUKHtlbnRyaWVzOmUsaDp0LGhhbmRsZUJsdXI6bixoYW5kbGVJbnB1dENoYW5nZTpyLGhhbmRsZUlucHV0S2V5RG93bjpvLGhvdXI6YSxzZXRJbnB1dFJlZjppLHRpbWVGb3JtYXQ6c30pe3JldHVybiB0KCJkaXYiLHtrZXk6YSxjbGFzc05hbWU6ImRheS1za2V0Y2gtbGluZSJ9LHQoInNwYW4iLHtjbGFzc05hbWU6ImRheS1za2V0Y2gtaG91ci1sYWJlbCJ9LFZvKGEscykpLHQoImlucHV0Iix7dHlwZToidGV4dCIsY2xhc3NOYW1lOiJkYXktc2tldGNoLWlucHV0Iix2YWx1ZTplW2FdfHwiIixyZWY6bD0+aShhLGwpLG9uQ2hhbmdlOmw9PnIoYSxsLnRhcmdldC52YWx1ZSksb25LZXlEb3duOmw9Pm8oYSxsKSxvbkJsdXI6bixwbGFjZWhvbGRlcjoiIiwiYXJpYS1sYWJlbCI6YCR7Vm8oYSxzKX0gZW50cnlgfSkpfWZ1bmN0aW9uIFRUKGUsdCxuKXtyZXR1cm4gZSgiYnV0dG9uIix7Y2xhc3NOYW1lOmBkYXktc2tldGNoLXNhdmUtYnRuJHt0PyIiOiIgZGF5LXNrZXRjaC1zYXZlLWJ0bi0tZGlzYWJsZWQifWAsZGlzYWJsZWQ6IXQsb25DbGljazpuLHRpdGxlOnQ/IlNhdmUgY2hhbmdlcyI6Ik5vIHVuc2F2ZWQgY2hhbmdlcyJ9LHQ/IlNhdmUiOiJTYXZlZCIpfWZ1bmN0aW9uIGNwKHthZ2VuZGFUYXNrczplLGFwcDp0LGNhbGVuZGFyRXZlbnRzOm4sY3VycmVudERhdGU6cix0aW1lRm9ybWF0Om99KXtsZXQgYT1NZS5jcmVhdGVFbGVtZW50LGk9QmUocikscz1jVChpKSx7aGFuZGxlSW5wdXRLZXlEb3duOmwsc2V0SW5wdXRSZWY6dX09U1QoKSx7ZW50cmllczpjLGlzRGlydHk6ZCxsb2FkaW5nOnAsc2F2ZU5vdzp5LHNjaGVkdWxlU2F2ZTpoLHNldEVudHJpZXM6d309YlQoe2FwcDp0LG5vdGVOYW1lOnN9KTt4VCh7YWdlbmRhVGFza3M6ZSxjdXJyZW50RGF0ZTpyLGxvYWRpbmc6cCxzZXRFbnRyaWVzOnd9KSxrVCh7Y2FsZW5kYXJFdmVudHM6bixjdXJyZW50RGF0ZTpyLGxvYWRpbmc6cCxzZXRFbnRyaWVzOnd9KTtsZXQgYj0oMCxNZS51c2VDYWxsYmFjaykoKCk9PntoKHVUKX0sW2hdKSxnPSgwLE1lLnVzZUNhbGxiYWNrKSgobSx2KT0+e3coZj0+KHsuLi5mLFttXTp2fSkpLGgoKX0sW2gsd10pO3JldHVybiBhKGZlLHt0aXRsZTpkZShyMCksc3VidGl0bGU6aTAoaSksaWNvbjoiXHV7MUY1RDJ9XHVGRTBGIix3aWRnZXRJZDpyMCxoZWFkZXJBY3Rpb25zOlRUKGEsZCx5KX0sYSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXktc2tldGNoLW5vdGVib29rIn0scD9hKCJkaXYiLHtjbGFzc05hbWU6ImRheS1za2V0Y2gtbG9hZGluZyJ9LCJMb2FkaW5nXHUyMDI2Iik6U3IubWFwKG09PkVUKHtlbnRyaWVzOmMsaDphLGhhbmRsZUJsdXI6YixoYW5kbGVJbnB1dENoYW5nZTpnLGhhbmRsZUlucHV0S2V5RG93bjpsLGhvdXI6bSxzZXRJbnB1dFJlZjp1LHRpbWVGb3JtYXQ6b30pKSkpfXZhciBTbj15ZShtZSgpKTtmdW5jdGlvbiBOVChlKXtsZXQgdD17fTtmb3IobGV0e2RhdGVLZXk6bix0YXNrczpyfW9mIGUpdFtuXT1yO3JldHVybiB0fWZ1bmN0aW9uIGRwKGUpe2xldFt0LG5dPSgwLFNuLnVzZVN0YXRlKSh7fSkscj0oMCxTbi51c2VSZWYpKCExKSxvPSgwLFNuLnVzZVJlZikobnVsbCksYT0oMCxTbi51c2VSZWYpKG5ldyBTZXQpLGk9KDAsU24udXNlUmVmKShudWxsKSxzPSgwLFNuLnVzZVJlZikoe30pLGw9KDAsU24udXNlQ2FsbGJhY2spKGFzeW5jKHUsYyk9PntpLmN1cnJlbnQhPT1jJiYoaS5jdXJyZW50PWMsYS5jdXJyZW50PW5ldyBTZXQscy5jdXJyZW50PXt9KTtsZXR7Ym91bmRhcmllczpkLHdlZWtTdGFydEtleTpwfT1keSh1KSx5PWAke3B9Ojoke2N8fCIifWA7aWYoYS5jdXJyZW50Lmhhcyh5KSlyZXR1cm4gcy5jdXJyZW50O3IuY3VycmVudD0hMCxvLmN1cnJlbnQ9bnVsbDt0cnl7bGV0IGg9YXdhaXQgUHJvbWlzZS5hbGwoZC5tYXAoYXN5bmMoe2Zyb206Zyx0bzptLGRhdGVLZXk6dn0pPT57bGV0IGY9YXdhaXQgZS5nZXRDb21wbGV0ZWRUYXNrcyhnLG0pO3JldHVybntkYXRlS2V5OnYsdGFza3M6Znx8W119fSkpLHc9TlQoaCksYj17Li4ucy5jdXJyZW50LC4uLnd9O3JldHVybiBuKGIpLHMuY3VycmVudD1iLGEuY3VycmVudC5hZGQoeSksYn1jYXRjaChoKXtyZXR1cm4gXygidXNlQ29tcGxldGVkVGFza3M6IGZhaWxlZCB0byBmZXRjaCBjb21wbGV0ZWQgdGFza3MiLGgpLG8uY3VycmVudD1oLHMuY3VycmVudH1maW5hbGx5e3IuY3VycmVudD0hMX19LFtdKTtyZXR1cm57Y29tcGxldGVkVGFza3NCeURhdGU6dCxnZXQgbG9hZGluZygpe3JldHVybiByLmN1cnJlbnR9LGdldCBlcnJvcigpe3JldHVybiBvLmN1cnJlbnR9LGZldGNoQ29tcGxldGVkVGFza3M6bH19dmFyIEVuPXllKG1lKCkpO2Z1bmN0aW9uIHdsKGUpe3JldHVybiBlLnN0YXJ0QXR8fGUuZGVhZGxpbmV9ZnVuY3Rpb24gcHAoZSx0LG49KCk9PiEwKXtsZXQgcj17fSxvPTAsYT1uZXcgRGF0ZTtyZXR1cm4gZS5mb3JFYWNoKGk9PntpZihvKz0xLCFuKGkpKXJldHVybjtsZXQgcz10KGkpO2lmKCFzKXJldHVybjtsZXQgbD0kbihzKTtyW2xdfHwocltsXT1bXSkscltsXS5wdXNoKGkpfSksXyhgQW5hbHl6ZWQgJHtvfSB0YXNrcywgZ3JvdXBlZCBpbnRvICR7T2JqZWN0LmtleXMocikubGVuZ3RofSBkYXRlIGtleXMgaW4gJHtuZXcgRGF0ZS1hfW1zYCkscn1mdW5jdGlvbiBzMChlKXtyZXR1cm4gcHAoZSx3bCx0PT4hdC5jb21wbGV0ZWRBdCYmIXQuZGlzbWlzc2VkQXQpfWZ1bmN0aW9uIGwwKGUpe3JldHVybiBwcChlLHQ9PnQuY29tcGxldGVkQXQsdD0+ISF0LmNvbXBsZXRlZEF0KX1mdW5jdGlvbiBEVChlLHQpe2xldCBuPWUuZmlsdGVyKG89Pm8+dCkscj1lLmZpbHRlcihvPT5vPHQpO3JldHVybnt1cGNvbWluZ0RhdGVLZXlzOm4sb2xkZXJEYXRlS2V5czpyfX1mdW5jdGlvbiBfVChlLHQpe2xldCBuPXt9O3JldHVybiB0LmZvckVhY2gocj0+e25bcl09ZVtyXXx8W119KSxufWZ1bmN0aW9uIGZwKCl7bGV0W2UsdF09KDAsRW4udXNlU3RhdGUpKFtdKSxbbixyXT0oMCxFbi51c2VTdGF0ZSkobnVsbCksW28sYV09KDAsRW4udXNlU3RhdGUpKG51bGwpLFtpLHNdPSgwLEVuLnVzZVN0YXRlKSh7fSksW2wsdV09KDAsRW4udXNlU3RhdGUpKHt9KSxjPW5ldyBEYXRlLGQ9KDAsRW4udXNlQ2FsbGJhY2spKGg9PntpZighaClyZXR1cm47dChoLnRhc2tEb21haW5zfHxbXSkscihoLmFjdGl2ZVRhc2tEb21haW58fG51bGwpO2xldCB3PWgudGFza3N8fFtdO3MoczAodykpLHUobDAodykpLGEoRGF0ZS5ub3coKSl9LFtdKSxwPSgwLEVuLnVzZUNhbGxiYWNrKSgoaCx3LGIpPT57aWYoaCYmdChoKSx3JiZyKHcpLGIpe2xldCBnPWIudGFza3N8fFtdO3MoczAoZykpLHUobDAoZykpLGEoRGF0ZS5ub3coKSl9fSxbXSkseT0oMCxFbi51c2VDYWxsYmFjaykoaD0+e2xldCB3PWg/bmV3IERhdGUoaCk6bmV3IERhdGUsYj0kbih3KSxnPU9iamVjdC52YWx1ZXMoaSkuZmxhdCgpLG09Zy5maWx0ZXIoTj0+ISEoTi5zdGFydEF0fHxOLmRlYWRsaW5lKSkuc29ydCgoTixEKT0+d2woTiktd2woRCkpO18oYEFnZW5kYSB3aWxsIHJldmlld2VkICR7Zy5sZW5ndGh9IG9wZW4gdGFza3NgLGcubWFwKE49Pih7ZGVhZGxpbmVUZXh0Ok4uZGVhZGxpbmU/JG4oTi5kZWFkbGluZSk6Ik4vQSIsc3RhcnRUZXh0Ok4uc3RhcnRBdD8kbihOLnN0YXJ0QXQpOiJOb25lIiwuLi5OfSkpKSxfKGAke20ubGVuZ3RofSByZWxldmFudCAod2l0aCBzdGFydEF0KWAsbSk7bGV0IHY9cHAobSx3bCksZj1PYmplY3Qua2V5cyh2KS5zb3J0KCkse3VwY29taW5nRGF0ZUtleXM6RX09RFQoZixiKSxrPVtiLC4uLkVdO3JldHVybiBfVCh2LGspfSxbaV0pO3JldHVybiBfKGB1c2VEb21haW5UYXNrcyBpbml0aWFsaXplZCB3aXRoIGFjdGl2ZSBkb21haW4gJHtufSBpbiAke25ldyBEYXRlLWN9bXNgKSx7dGFza0RvbWFpbnM6ZSxhY3RpdmVUYXNrRG9tYWluOm4sdGFza3NGZXRjaGVkQXQ6byxvcGVuVGFza3M6aSxjb21wbGV0ZWRUYXNrczpsLGluaXRpYWxpemVEb21haW5UYXNrczpkLG9uRG9tYWluQ2hhbmdlOnAsYnVpbGRBZ2VuZGFUYXNrc0J5RGF0ZTp5fX12YXIgYmw9eWUobWUoKSk7ZnVuY3Rpb24gdTAoZSl7aWYoIWUpcmV0dXJuIG51bGw7aWYoZSBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIE51bWJlci5pc05hTihlLmdldFRpbWUoKSk/bnVsbDpuZXcgRGF0ZShlLmdldFRpbWUoKSk7aWYodHlwZW9mIGUhPSJudW1iZXIiJiZ0eXBlb2YgZSE9InN0cmluZyIpcmV0dXJuIG51bGw7bGV0IHQ9dHlwZW9mIGU9PSJudW1iZXIiJiZlPDFlMTA/bmV3IERhdGUoZSoxZTMpOm5ldyBEYXRlKGUpO3JldHVybiBOdW1iZXIuaXNOYU4odC5nZXRUaW1lKCkpP251bGw6dH1mdW5jdGlvbiBBVChlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lLmZpbHRlcih0PT50JiZ0eXBlb2YgdD09Im9iamVjdCIpLm1hcCh0PT4oey4uLnQsZW5kOnUwKHQuZW5kKSxzdGFydDp1MCh0LnN0YXJ0KX0pKTpbXX1mdW5jdGlvbiBjMChlLHQsbil7ZS5nZXRFeHRlcm5hbENhbGVuZGFyRXZlbnRzKHtkYXlzOjMsdGFza0RvbWFpblVVSUQ6dH0pLnRoZW4ocj0+e18oIlt1c2VFeHRlcm5hbENhbGVuZGFyRXZlbnRzXSBSZWNlaXZlZCBjYWxlbmRhciBldmVudHMiLHIpLG4oQVQocikpfSkuY2F0Y2goKCk9PntuKFtdKX0pfWZ1bmN0aW9uIG1wKGUsdCl7bGV0W24scl09KDAsYmwudXNlU3RhdGUpKG51bGwpO3JldHVybigwLGJsLnVzZUVmZmVjdCkoKCk9PntyKG51bGwpLGMwKGUsdCxyKTtmdW5jdGlvbiBvKCl7ZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlPT09InZpc2libGUiJiZjMChlLHQscil9cmV0dXJuIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLG8pLCgpPT5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIixvKX0sW2UsdF0pLHtjYWxlbmRhckV2ZW50czpuLGNhbGVuZGFyRXZlbnRzTG9hZGVkOm4hPT1udWxsfX12YXIgRWU9eWUobWUoKSk7dmFyIENUPTVlMyxnMD03LE9UPTMseGU9MjIwLHkwPTE0LHYwPTIsTVQ9NCxSVD03OCxJVD00MCxkMD00LFBUPTQ4LExUPTk1LHpUPTE2LEZUPS4wNCxVVD0xMiwkVD0xMixwMD0uNSxCVD0xLjgsV1Q9LTQsSFQ9NSxmMD0uNyxqVD0zLjMsVlQ9MTgsR1Q9MjIsS1Q9LTUsWVQ9MTEscVQ9MTMsUVQ9MjYsSlQ9MTAsWFQ9MzAsWlQ9NDQsZU49NSx4bD0xLzMsdE49MS4zLG5OPVtbMCwiIzI3QUU2MDUwIl0sWy41LCIjRjJDOTRDMjAiXSxbMSwiI0U4NDUzQzA4Il1dLHJOPTIsb049My41LGFOPTEuMixpTj04LG0wPS4zLHNOPTIsbE49MSx1Tj0xNixjTj0yOCxoMD0uNyxkTj0zLHBOPS0xMSxmTj0xNCxtTj01NixoTj00NixnTj0xNix5Tj04LHZOPTMzLHdOPTEyLGJOPS4yNSx4Tj0uNzUsa049MjUsU049MTIwMCxFTj0xZTMsdzA9MyxrbD1be3ZhbHVlOi0yLGVtb2ppOiJcdXsxRjYzNX1cdTIwMERcdXsxRjRBQn0iLGxhYmVsOiJBd2Z1bCJ9LHt2YWx1ZTotMSxlbW9qaToiXHV7MUZBRTR9IixsYWJlbDoiQmFkIn0se3ZhbHVlOjAsZW1vamk6Ilx1ezFGNjQyfSIsbGFiZWw6Ik9rYXkifSx7dmFsdWU6MSxlbW9qaToiXHV7MUY2MDB9IixsYWJlbDoiR29vZCJ9LHt2YWx1ZToyLGVtb2ppOiJcdXsxRjkyOX0iLGxhYmVsOiJHcmVhdCJ9XSxUTj17Ii0yIjoiI0U4NDUzQyIsIi0xIjoiI0YyOTk0QSIsMDoiI0YyQzk0QyIsMToiIzZGQ0Y5NyIsMjoiIzI3QUU2MCJ9LE5OPU9iamVjdC5mcm9tRW50cmllcyhrbC5tYXAoZT0+W2UudmFsdWUsZS5lbW9qaV0pKTtmdW5jdGlvbiBZbyhlKXtyZXR1cm4gVE5bTWF0aC5yb3VuZChlKV18fCIjY2NjIn1mdW5jdGlvbiBiMChlKXtyZXR1cm4gTk5bTWF0aC5yb3VuZChlKV18fCJcdTI3NTMifWZ1bmN0aW9uIEROKGUpe2xldCB0PWtsLmZpbmQobj0+bi52YWx1ZT09PWUpO3JldHVybiB0P3QubGFiZWw6IiJ9ZnVuY3Rpb24geDAoZSl7aWYoIWUpcmV0dXJuIiI7bGV0e2Z1bGxEYXRlOnQsZW50cmllczpufT1lLHI9W2A8ZGl2IGNsYXNzPSJtb29kLXZpei10b29sdGlwLWRhdGUiPiR7dH08L2Rpdj5gXTtmb3IobGV0IG8gb2Ygbil7bGV0IGE9a2wuZmluZChsPT5sLnZhbHVlPT09by5yYXRpbmcpPy5lbW9qaXx8Ilx1Mjc1MyIsaT1ETihvLnJhdGluZykscz1gPGRpdiBjbGFzcz0ibW9vZC12aXotdG9vbHRpcC1lbnRyeSI+PHNwYW4gY2xhc3M9Im1vb2Qtdml6LXRvb2x0aXAtdGltZSI+JHtvLnRpbWV9PC9zcGFuPjxzcGFuIGNsYXNzPSJtb29kLXZpei10b29sdGlwLW1vb2QiPiR7YX0gPHNwYW4gY2xhc3M9Im1vb2Qtdml6LWxhYmVsIj4ke2l9ICgke28ucmF0aW5nPjA/YCske28ucmF0aW5nfWA6by5yYXRpbmd9KTwvc3Bhbj48L3NwYW4+YDtvLm5vdGVzJiYocys9YDxkaXYgY2xhc3M9Im1vb2Qtdml6LXRvb2x0aXAtbm90ZSI+JHtvLm5vdGVzfTwvZGl2PmApLHMrPSI8L2Rpdj4iLHIucHVzaChzKX1yZXR1cm4gci5qb2luKCIiKX1mdW5jdGlvbiBfTihlLHQsbixyKXt0fHxufHxyKGUpfWZ1bmN0aW9uIEFOKGUsdCxuLHIsbyxhLGkpe3Qua2V5PT09IkVudGVyIiYmKHQuY3RybEtleXx8dC5tZXRhS2V5KSYmKHQucHJldmVudERlZmF1bHQoKSxrMChlLG4scixvLGEsaSkpfWFzeW5jIGZ1bmN0aW9uIGswKGUsdCxuLHIsbyxhKXtyKCEwKTt0cnl7bGV0IGk9YXdhaXQgZS5yZWNvcmRNb29kUmF0aW5nKHQudmFsdWUpLHM9bi50cmltKCk7cyYmYXdhaXQgZS51cGRhdGVNb29kUmF0aW5nKGkse25vdGU6c30pLG8oITApLGEmJmEoe3JhdGluZzp0LnZhbHVlLHRpbWVzdGFtcDpNYXRoLmZsb29yKERhdGUubm93KCkvMWUzKSxub3RlOnN8fG51bGx9KX1jYXRjaChpKXtfKCJGYWlsZWQgdG8gcmVjb3JkIG1vb2Q6IixpKX1maW5hbGx5e3IoITEpfX1mdW5jdGlvbiBDTihlKXtsZXQgdD0oZXx8W10pLnNsaWNlKC1nMCk7aWYoIXQubGVuZ3RoKXJldHVybntyZWNlbnRNb29kczp0LGF2ZXJhZ2VNb29kOiJcdTIwMTQifTtsZXQgbj0odC5yZWR1Y2UoKHIsbyk9PnIrby5yYXRpbmcsMCkvdC5sZW5ndGgpLnRvRml4ZWQoMSk7cmV0dXJue3JlY2VudE1vb2RzOnQsYXZlcmFnZU1vb2Q6bn19ZnVuY3Rpb24gUzAoKXtsZXQgZT1nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCksdD1uPT5lLmdldFByb3BlcnR5VmFsdWUobikudHJpbSgpO3JldHVybntiZ0NhcmQ6dCgiLS1kYXNoYm9hcmQtY29sb3ItYmctY2FyZCIpLGJnUGFnZTp0KCItLWRhc2hib2FyZC1jb2xvci1iZy1wYWdlIiksYm9yZGVyOnQoIi0tZGFzaGJvYXJkLWNvbG9yLWJvcmRlciIpLHRleHRTZWNvbmRhcnk6dCgiLS1kYXNoYm9hcmQtY29sb3ItdGV4dC1zZWNvbmRhcnkiKSx0ZXh0TXV0ZWQ6dCgiLS1kYXNoYm9hcmQtY29sb3ItdGV4dC1tdXRlZCIpfX1mdW5jdGlvbiBocChlLHQpe3JldHVybiBlLnN0YXJ0c1dpdGgoIiMiKSYmZS5sZW5ndGg9PT03P2UrdDplfWZ1bmN0aW9uIE9OKHttb29kRGF0YTplfSl7bGV0IHQ9RWUuY3JlYXRlRWxlbWVudCxuPSgwLEVlLnVzZVJlZikobnVsbCkscj0oMCxFZS51c2VSZWYpKG51bGwpLFtvLGFdPSgwLEVlLnVzZVN0YXRlKSgwKSxpPWVpKCkscz1KU09OLnN0cmluZ2lmeShlKTtyZXR1cm4oMCxFZS51c2VFZmZlY3QpKCgpPT57YSgwKTtsZXQgYyxkPW51bGwscD1TTix5PWg9PntkfHwoZD1oKTtsZXQgdz1NYXRoLm1pbigoaC1kKS9wLDEpLGI9MS1NYXRoLnBvdygxLXcsdzApO2EoYiksdzwxJiYoYz1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoeSkpfTtyZXR1cm4gYz1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoeSksKCk9PmNhbmNlbEFuaW1hdGlvbkZyYW1lKGMpfSxbc10pLCgwLEVlLnVzZUVmZmVjdCkoKCk9PntsZXQgYz1uLmN1cnJlbnQ7aWYoIWMpcmV0dXJuO2xldCBkPWMuZ2V0Q29udGV4dCgiMmQiKSxwPXdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfHx2MDtjLndpZHRoPXhlKnAsYy5oZWlnaHQ9eGUqcCxkLnNjYWxlKHAscCksZC5jbGVhclJlY3QoMCwwLHhlLHhlKTtsZXQgeT1TMCgpLGg9eGUvMix3PXhlLzIrTVQsYj1SVCxnPUlUO2QuZmlsbFN0eWxlPXkuYmdDYXJkLGQuYmVnaW5QYXRoKCksZC5yb3VuZFJlY3QoMCwwLHhlLHhlLHkwKSxkLmZpbGwoKSxkLnN0cm9rZVN0eWxlPWhwKHkuYm9yZGVyLCIyOCIpLGQubGluZVdpZHRoPTE7Zm9yKGxldCBrPVBUO2s8PUxUO2srPXpUKWQuYmVnaW5QYXRoKCksZC5hcmMoaCx3LGssMCxNYXRoLlBJKjIpLGQuc3Ryb2tlKCk7bGV0IG09ZS5tYXAoaz0+KHtsYWJlbDprLmRheUxhYmVsLGRhdGVMYWJlbDprLmRhdGVMYWJlbCx2YWw6ay5yYXRpbmd9KSksdj1NYXRoLm1heChtLmxlbmd0aCwxKSxmPU1hdGguUEkqMi92LEU9bS5sZW5ndGg+MT9GVDowO2lmKHIuY3VycmVudD17Y2VudGVyWDpoLGNlbnRlclk6dyxpbm5lclJhZGl1czpnLG91dGVyUmFkaXVzOmIsc2VnbWVudENvdW50Om0ubGVuZ3RoLHNlZ21lbnRBbmdsZTpmLGdhcEFuZ2xlOkV9LG0uZm9yRWFjaCgoe2xhYmVsOmssZGF0ZUxhYmVsOk4sdmFsOkR9LE8pPT57bGV0IFQ9LU1hdGguUEkvMitPKmYrRSx6PVQrKGYtRSoyKSpvLFA9WW8oRCk7ZC5zaGFkb3dDb2xvcj1QLGQuc2hhZG93Qmx1cj1VVCpvLGQuYmVnaW5QYXRoKCksZC5hcmMoaCx3LGIsVCx6KSxkLmFyYyhoLHcsZyx6LFQsITApLGQuY2xvc2VQYXRoKCk7bGV0IEM9ZC5jcmVhdGVSYWRpYWxHcmFkaWVudChoLHcsZyxoLHcsYik7aWYoQy5hZGRDb2xvclN0b3AoMCxQKyI5OSIpLEMuYWRkQ29sb3JTdG9wKDEsUCsiZmYiKSxkLmZpbGxTdHlsZT1DLGQuZmlsbCgpLGQuc2hhZG93Qmx1cj0wLG8+cDApe2xldCBMPVQrKGYtRSoyKS8yLCQ9YiskVCxXPWgrTWF0aC5jb3MoTCkqJCxNPXcrTWF0aC5zaW4oTCkqJDtkLmZpbGxTdHlsZT15LnRleHRTZWNvbmRhcnksZC5nbG9iYWxBbHBoYT0oby1wMCkqQlQsZC5mb250PSJib2xkIDhweCAtYXBwbGUtc3lzdGVtLCBzYW5zLXNlcmlmIixkLnRleHRBbGlnbj0iY2VudGVyIixkLnRleHRCYXNlbGluZT0ibWlkZGxlIixkLmZpbGxUZXh0KGssVyxNK1dUKSxkLmZvbnQ9IjdweCAtYXBwbGUtc3lzdGVtLCBzYW5zLXNlcmlmIixkLmZpbGxTdHlsZT15LnRleHRNdXRlZCxkLmZpbGxUZXh0KE4sVyxNK0hUKSxkLmdsb2JhbEFscGhhPTF9aWYobz5mMCl7bGV0IEw9VCsoZi1FKjIpLzIsJD0oYitnKS8yLFc9aCtNYXRoLmNvcyhMKSokLE09dytNYXRoLnNpbihMKSokO2QuZm9udD0iMTNweCBzZXJpZiIsZC50ZXh0QWxpZ249ImNlbnRlciIsZC50ZXh0QmFzZWxpbmU9Im1pZGRsZSIsZC5nbG9iYWxBbHBoYT1NYXRoLm1pbigoby1mMCkqalQsMSksZC5maWxsVGV4dChiMChEKSxXLE0pLGQuZ2xvYmFsQWxwaGE9MX19KSxkLmJlZ2luUGF0aCgpLGQuYXJjKGgsdyxnLWQwLDAsTWF0aC5QSSoyKSxkLmZpbGxTdHlsZT15LmJnUGFnZSxkLmZpbGwoKSxtLmxlbmd0aD4wKXtsZXQgaz0obS5yZWR1Y2UoKE4sRCk9Pk4rRC52YWwsMCkvbS5sZW5ndGgpLnRvRml4ZWQoMSk7ZC5maWxsU3R5bGU9WW8oTWF0aC5yb3VuZChOdW1iZXIoaykpKSxkLmZvbnQ9YGJvbGQgJHtHVH1weCAtYXBwbGUtc3lzdGVtLCBzYW5zLXNlcmlmYCxkLnRleHRBbGlnbj0iY2VudGVyIixkLnRleHRCYXNlbGluZT0ibWlkZGxlIixkLmdsb2JhbEFscGhhPW8sZC5maWxsVGV4dChrLGgsdytLVCksZC5maWxsU3R5bGU9eS50ZXh0TXV0ZWQsZC5mb250PSJib2xkIDdweCAtYXBwbGUtc3lzdGVtLCBzYW5zLXNlcmlmIixkLmZpbGxUZXh0KCI3LURBWSBBVkciLGgsdytZVCksZC5nbG9iYWxBbHBoYT0xfWQuZmlsbFN0eWxlPXkudGV4dE11dGVkLGQuZm9udD0iYm9sZCA4cHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZiIsZC50ZXh0QWxpZ249ImNlbnRlciIsZC50ZXh0QmFzZWxpbmU9ImFscGhhYmV0aWMiLGQuZmlsbFRleHQoIlcgRSBFIEsgICBSIEkgTiBHIixoLHFUKX0sW3Msb10pLHQoImRpdiIse3N0eWxlOntwb3NpdGlvbjoicmVsYXRpdmUiLGxpbmVIZWlnaHQ6MH19LHQoImNhbnZhcyIse3JlZjpuLGNsYXNzTmFtZToibW9vZC12aXotY2FudmFzIixvbk1vdXNlTW92ZTpjPT57bGV0IGQ9ci5jdXJyZW50LHA9bi5jdXJyZW50O2lmKCFkfHwhZC5zZWdtZW50Q291bnR8fCFwKXtpLmhpZGUoKTtyZXR1cm59bGV0IHk9cC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxoPShjLmNsaWVudFgteS5sZWZ0KSooeGUveS53aWR0aCksdz0oYy5jbGllbnRZLXkudG9wKSooeGUveS5oZWlnaHQpLGI9aC1kLmNlbnRlclgsZz13LWQuY2VudGVyWSxtPU1hdGguc3FydChiKmIrZypnKTtpZihtPGQuaW5uZXJSYWRpdXMtZDB8fG0+ZC5vdXRlclJhZGl1cytWVCl7aS5oaWRlKCk7cmV0dXJufWxldCB2PU1hdGguYXRhbjIoZyxiKStNYXRoLlBJLzI7djwwJiYodis9TWF0aC5QSSoyKTtsZXQgZj1NYXRoLmZsb29yKHYvZC5zZWdtZW50QW5nbGUpO2lmKGY+PTAmJmY8ZC5zZWdtZW50Q291bnQpe2xldCBFPWVbZl0saz15LmxlZnQraC94ZSp5LndpZHRoLE49eS50b3Ardy94ZSp5LmhlaWdodDtpLnNob3coeDAoe2Z1bGxEYXRlOkUuZnVsbERhdGUsZW50cmllczpFLmVudHJpZXN8fFtFXX0pLGssTil9ZWxzZSBpLmhpZGUoKX0sb25Nb3VzZUxlYXZlOigpPT5pLmhpZGUoKX0pKX1mdW5jdGlvbiBNTih7bW9vZERhdGE6ZX0pe2xldCB0PUVlLmNyZWF0ZUVsZW1lbnQsbj0oMCxFZS51c2VSZWYpKG51bGwpLHI9KDAsRWUudXNlUmVmKShbXSksW28sYV09KDAsRWUudXNlU3RhdGUpKDApLGk9ZWkoKSxzPUpTT04uc3RyaW5naWZ5KGUpO3JldHVybigwLEVlLnVzZUVmZmVjdCkoKCk9PnthKDApO2xldCBjLGQ9bnVsbCxwPUVOLHk9aD0+e2R8fChkPWgpO2xldCB3PU1hdGgubWluKChoLWQpL3AsMSk7YSgxLU1hdGgucG93KDEtdyx3MCkpLHc8MSYmKGM9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHkpKX07cmV0dXJuIGM9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHkpLCgpPT5jYW5jZWxBbmltYXRpb25GcmFtZShjKX0sW3NdKSwoMCxFZS51c2VFZmZlY3QpKCgpPT57bGV0IGM9bi5jdXJyZW50O2lmKCFjKXJldHVybjtsZXQgZD1jLmdldENvbnRleHQoIjJkIikscD13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8djA7Yy53aWR0aD14ZSpwLGMuaGVpZ2h0PXhlKnAsZC5zY2FsZShwLHApLGQuY2xlYXJSZWN0KDAsMCx4ZSx4ZSk7bGV0IHk9UzAoKTtkLmJlZ2luUGF0aCgpLGQucm91bmRSZWN0KDAsMCx4ZSx4ZSx5MCksZC5maWxsU3R5bGU9eS5iZ0NhcmQsZC5maWxsKCk7bGV0IGg9UVQsdz1KVCxiPVhULGc9WlQsbT14ZS1oLXcsdj14ZS1iLWcsZj1iK3Y7Zm9yKGxldCBUPS0yO1Q8PTI7VCsrKXtsZXQgej1iK3YtKFQrMikvNCp2O2Quc3Ryb2tlU3R5bGU9aHAoeS5ib3JkZXIsIjUwIiksZC5saW5lV2lkdGg9MSxkLmJlZ2luUGF0aCgpLGQubW92ZVRvKGgseiksZC5saW5lVG8oeGUtdyx6KSxkLnN0cm9rZSgpLGQuZmlsbFN0eWxlPXkudGV4dE11dGVkLGQuZm9udD0iYm9sZCA4cHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZiIsZC50ZXh0QWxpZ249InJpZ2h0IixkLnRleHRCYXNlbGluZT0ibWlkZGxlIixkLmZpbGxUZXh0KFQ+MD9gKyR7VH1gOlQsaC1lTix6KX1sZXQgRT1lLm1hcChUPT4oe2xhYmVsOlQuZGF5TGFiZWwsZGF0ZUxhYmVsOlQuZGF0ZUxhYmVsLHZhbDpULnJhdGluZ30pKSxrPShULHopPT56PT09MT9oK20vMjp6PT09Mj9oK20qKFQ9PT0wP2JOOnhOKTpoK1QvKHotMSkqbSxOPUUubWFwKChULHopPT4oe3g6ayh6LEUubGVuZ3RoKSx5OmIrdi0oVC52YWwrMikvNCp2LHZhbDpULnZhbCxsYWJlbDpULmxhYmVsLGRhdGVMYWJlbDpULmRhdGVMYWJlbH0pKTtyLmN1cnJlbnQ9TjtsZXQgRD1OLm1hcChUPT4oey4uLlQseTpiK3YtKFQudmFsKzIpLzQqdipNYXRoLm1pbihvKnROLDEpfSkpLE89KFQseik9PntkLmJlZ2luUGF0aCgpLGQubW92ZVRvKFRbMF0ueCxUWzBdLnkpO2ZvcihsZXQgUD0wO1A8VC5sZW5ndGgtMTtQKyspe2xldCBDPVRbUCsxXS54LVRbUF0ueCxMPVRbUF0ueCtDKnhsLCQ9VFtQKzFdLngtQyp4bDtkLmJlemllckN1cnZlVG8oTCxUW1BdLnksJCxUW1ArMV0ueSxUW1ArMV0ueCxUW1ArMV0ueSl9eiYmKGQubGluZVRvKFRbVC5sZW5ndGgtMV0ueCxmKSxkLmxpbmVUbyhUWzBdLngsZiksZC5jbG9zZVBhdGgoKSl9O2lmKEQubGVuZ3RoPj0yKXtsZXQgVD1kLmNyZWF0ZUxpbmVhckdyYWRpZW50KDAsYiwwLGYpO2ZvcihsZXRbeixQXW9mIG5OKVQuYWRkQ29sb3JTdG9wKHosUCk7TyhELCEwKSxkLmZpbGxTdHlsZT1ULGQuZmlsbCgpLGQubGluZVdpZHRoPXJOLGQubGluZUNhcD0icm91bmQiO2ZvcihsZXQgej0wO3o8RC5sZW5ndGgtMTt6Kyspe2xldCBQPURbel0sQz1EW3orMV0sTD1kLmNyZWF0ZUxpbmVhckdyYWRpZW50KFAueCxQLnksQy54LEMueSk7TC5hZGRDb2xvclN0b3AoMCxZbyhQLnZhbCkpLEwuYWRkQ29sb3JTdG9wKDEsWW8oQy52YWwpKSxkLnN0cm9rZVN0eWxlPUwsZC5iZWdpblBhdGgoKTtsZXQgJD1DLngtUC54LFc9UC54KyQqeGwsTT1DLngtJCp4bDtkLm1vdmVUbyhQLngsUC55KSxkLmJlemllckN1cnZlVG8oVyxQLnksTSxDLnksQy54LEMueSksZC5zdHJva2UoKX19aWYobz5tMCYmRC5mb3JFYWNoKFQ9PntsZXQgej1NYXRoLm1pbigoby1tMCkqc04sMSksUD1ZbyhULnZhbCk7ZC5zaGFkb3dDb2xvcj1QLGQuc2hhZG93Qmx1cj1pTixkLmJlZ2luUGF0aCgpLGQuYXJjKFQueCxULnksb04sMCxNYXRoLlBJKjIpLGQuZmlsbFN0eWxlPVAsZC5nbG9iYWxBbHBoYT16LGQuZmlsbCgpLGQuc2hhZG93Qmx1cj0wLGQuYmVnaW5QYXRoKCksZC5hcmMoVC54LFQueSxhTiwwLE1hdGguUEkqMiksZC5maWxsU3R5bGU9eS5iZ0NhcmQsZC5maWxsKCksZC5nbG9iYWxBbHBoYT0xLGQuZmlsbFN0eWxlPXkudGV4dFNlY29uZGFyeSxkLmdsb2JhbEFscGhhPXoqbE4sZC5mb250PSJib2xkIDEwcHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZiIsZC50ZXh0QWxpZ249ImNlbnRlciIsZC50ZXh0QmFzZWxpbmU9ImFscGhhYmV0aWMiLGQuZmlsbFRleHQoVC5sYWJlbCxULngsZit1TiksZC5mb250PSI5cHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZiIsZC5maWxsVGV4dChULmRhdGVMYWJlbCxULngsZitjTiksZC5nbG9iYWxBbHBoYT0xLG8+aDAmJihkLmdsb2JhbEFscGhhPU1hdGgubWluKChvLWgwKSpkTiwxKSxkLmZvbnQ9IjExcHggc2VyaWYiLGQuZmlsbFRleHQoYjAoVC52YWwpLFQueCxULnkrcE4pLGQuZ2xvYmFsQWxwaGE9MSl9KSxkLmZpbGxTdHlsZT15LnRleHRNdXRlZCxkLmZvbnQ9ImJvbGQgOHB4IC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYiLGQudGV4dEFsaWduPSJjZW50ZXIiLGQudGV4dEJhc2VsaW5lPSJhbHBoYWJldGljIixkLmZpbGxUZXh0KCJNIE8gTyBEICAgVyBBIFYgRSIseGUvMixmTiksRS5sZW5ndGg+MCl7bGV0IFQ9KEUucmVkdWNlKChQLEMpPT5QK0MudmFsLDApL0UubGVuZ3RoKS50b0ZpeGVkKDEpLHo9WW8oTWF0aC5yb3VuZChOdW1iZXIoVCkpKTtkLmZpbGxTdHlsZT1ocCh6LCIyMiIpLGQuYmVnaW5QYXRoKCksZC5yb3VuZFJlY3QoeGUtbU4sNCxoTixnTix5TiksZC5maWxsKCksZC5maWxsU3R5bGU9eixkLmZvbnQ9ImJvbGQgOHB4IC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYiLGQudGV4dEFsaWduPSJjZW50ZXIiLGQudGV4dEJhc2VsaW5lPSJtaWRkbGUiLGQuZmlsbFRleHQoYEF2ZyAke1R9YCx4ZS12Tix3Til9fSxbcyxvXSksdCgiZGl2Iix7c3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsbGluZUhlaWdodDowfX0sdCgiY2FudmFzIix7cmVmOm4sY2xhc3NOYW1lOiJtb29kLXZpei1jYW52YXMiLG9uTW91c2VNb3ZlOmM9PntsZXQgZD1uLmN1cnJlbnQ7aWYoIWQpcmV0dXJuO2xldCBwPWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkseT0oYy5jbGllbnRYLXAubGVmdCkqKHhlL3Aud2lkdGgpLGg9KGMuY2xpZW50WS1wLnRvcCkqKHhlL3AuaGVpZ2h0KSx3PXIuY3VycmVudDtpZighd3x8IXcubGVuZ3RoKXtpLmhpZGUoKTtyZXR1cm59bGV0IGI9LTEsZz1rTjtmb3IobGV0IG09MDttPHcubGVuZ3RoO20rKyl7bGV0IHY9eS13W21dLngsZj1oLXdbbV0ueSxFPU1hdGguc3FydCh2KnYrZipmKTtFPGcmJihnPUUsYj1tKX1pZihiPj0wKXtsZXQgbT13W2JdLHY9ZVtiXSxmPXAubGVmdCttLngveGUqcC53aWR0aCxFPXAudG9wK20ueS94ZSpwLmhlaWdodDtpLnNob3coeDAoe2Z1bGxEYXRlOnYuZnVsbERhdGUsZW50cmllczp2LmVudHJpZXN8fFt2XX0pLGYsRSl9ZWxzZSBpLmhpZGUoKX0sb25Nb3VzZUxlYXZlOigpPT5pLmhpZGUoKX0pKX1mdW5jdGlvbiBSTihlKXtsZXQgdD1bIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLG49Wy4uLmV8fFtdXS5zb3J0KChhLGkpPT4oYS50aW1lc3RhbXB8fDApLShpLnRpbWVzdGFtcHx8MCkpO2lmKG4ubGVuZ3RoKWNvbnNvbGUubG9nKCJGb3VuZCBleGlzdGluZyByYXRpbmdzIik7ZWxzZSByZXR1cm4gY29uc29sZS5sb2coIk5vIHJhdGluZ3MgZm91bmQsIHJldHVybmluZyBbXSIpLFtdO2xldCByPW5ldyBNYXA7Zm9yKGxldCBhIG9mIG4pe2xldCBpPWEudGltZXN0YW1wP25ldyBEYXRlKGEudGltZXN0YW1wKjFlMyk6bmV3IERhdGUscz1gJHtpLmdldEZ1bGxZZWFyKCl9LSR7aS5nZXRNb250aCgpKzF9LSR7aS5nZXREYXRlKCl9YDtyLmhhcyhzKXx8ci5zZXQocyx7ZGF5TGFiZWw6dFtpLmdldERheSgpXSxkYXRlTGFiZWw6YCR7aS5nZXRNb250aCgpKzF9LyR7aS5nZXREYXRlKCl9YCxkYXRlS2V5OnMsZnVsbERhdGU6aS50b0xvY2FsZURhdGVTdHJpbmcoImVuLVVTIix7d2Vla2RheToibG9uZyIseWVhcjoibnVtZXJpYyIsbW9udGg6ImxvbmciLGRheToibnVtZXJpYyJ9KSxlbnRyaWVzOltdLHJhdGluZ1N1bTowLHJhdGluZ0NvdW50OjB9KTtsZXQgbD1yLmdldChzKTtsLmVudHJpZXMucHVzaCh7cmF0aW5nOmEucmF0aW5nLHRpbWU6KGEudGltZXN0YW1wP25ldyBEYXRlKGEudGltZXN0YW1wKjFlMyk6bmV3IERhdGUpLnRvTG9jYWxlVGltZVN0cmluZygiZW4tVVMiLHtob3VyOiJudW1lcmljIixtaW51dGU6IjItZGlnaXQifSksbm90ZXM6YS5ub3Rlc3x8YS5ub3RlfHxudWxsLHRpbWVzdGFtcDphLnRpbWVzdGFtcH0pLGwucmF0aW5nU3VtKz1hLnJhdGluZyxsLnJhdGluZ0NvdW50Kz0xfXJldHVyblsuLi5yLnZhbHVlcygpXS5zbGljZSgtZzApLm1hcChhPT4oe3JhdGluZzphLnJhdGluZ1N1bS9hLnJhdGluZ0NvdW50LGRheUxhYmVsOmEuZGF5TGFiZWwsZGF0ZUxhYmVsOmEuZGF0ZUxhYmVsLGRhdGVLZXk6YS5kYXRlS2V5LGZ1bGxEYXRlOmEuZnVsbERhdGUsdGltZTphLmVudHJpZXNbYS5lbnRyaWVzLmxlbmd0aC0xXS50aW1lLHRpbWVzdGFtcDphLmVudHJpZXNbYS5lbnRyaWVzLmxlbmd0aC0xXS50aW1lc3RhbXAsbm90ZXM6YS5lbnRyaWVzW2EuZW50cmllcy5sZW5ndGgtMV0ubm90ZXMsZW50cmllczphLmVudHJpZXN9KSl9ZnVuY3Rpb24gSU4oZSx0LG4scixvLGEpe2xldCBpPWU7aWYoISh0fHxbXSkubGVuZ3RoKXJldHVybiBpKCJkaXYiLHtjbGFzc05hbWU6Im1vb2Qtc3VtbWFyeSJ9LGkoInNwYW4iLG51bGwsIkF2ZyBtb29kICg3ZCk6ICIrbikpO2xldCBzPVJOKHQpLGw9cj09PSJ3YXZlIj9pKE1OLHtrZXk6byxtb29kRGF0YTpzfSk6aShPTix7a2V5Om8sbW9vZERhdGE6c30pO3JldHVybiBpKCJkaXYiLHtjbGFzc05hbWU6Im1vb2Qtdml6LXNlY3Rpb24ifSxpKCJkaXYiLHtjbGFzc05hbWU6Im1vb2Qtdml6LWNhbnZhcy13cmFwIn0sbCksaSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJtb29kLXZpei1jb25maWd1cmUtbGluayIsb25DbGljazphfSwiXHUyNjk5IENvbmZpZ3VyZSIpKX1mdW5jdGlvbiBncCh7YXBwOmUsbW9vZFJhdGluZ3M6dCxvbk1vb2RSZWNvcmRlZDpufSl7bGV0IHI9RWUuY3JlYXRlRWxlbWVudCxbbyxhXT0oMCxFZS51c2VTdGF0ZSkobnVsbCksW2ksc109KDAsRWUudXNlU3RhdGUpKCIiKSxbbCx1XT0oMCxFZS51c2VTdGF0ZSkoITEpLFtjLGRdPSgwLEVlLnVzZVN0YXRlKSghMSkseT1XcyhlLCJtb29kIilbMF18fCJyaW5nIixbaCx3XT0oMCxFZS51c2VTdGF0ZSkoeSksW2IsZ109KDAsRWUudXNlU3RhdGUpKHkpLFttLHZdPSgwLEVlLnVzZVN0YXRlKSgwKSxbZixFXT0oMCxFZS51c2VTdGF0ZSkoITEpOygwLEVlLnVzZUVmZmVjdCkoKCk9PntpZighYylyZXR1cm47bGV0IEM9c2V0VGltZW91dCgoKT0+e2QoITEpLGEobnVsbCkscygiIil9LENUKTtyZXR1cm4oKT0+Y2xlYXJUaW1lb3V0KEMpfSxbY10pO2xldCBrPSgpPT57ZyhoKSxFKCEwKX0sTj0oKT0+e3coYiksdihDPT5DKzEpLEUoITEpLGUuc2V0U2V0dGluZyhQbygibW9vZCIpLEpTT04uc3RyaW5naWZ5KFtiXSkpfSxEPSgpPT57ZyhoKSxFKCExKX0sTz0oKT0+e2EobnVsbCkscygiIil9LHthdmVyYWdlTW9vZDpUfT1DTih0KSx6PUlOKHIsdCxULGgsbSxrKSxQPWY/cihYcix7dGl0bGU6Ik1vb2QgVmlzdWFsaXphdGlvbiIsb25TdWJtaXQ6TixvbkNhbmNlbDpELHN1Ym1pdExhYmVsOiJBcHBseSJ9LHIoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWZpZWxkIn0scigiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctZmllbGQtbGFiZWwifSwiRGlzcGxheSBzdHlsZSIpLFtbInJpbmciLCJSaW5nIl0sWyJ3YXZlIiwiV2F2ZSJdXS5tYXAoKFtDLExdKT0+cigibGFiZWwiLHtrZXk6QyxjbGFzc05hbWU6Im1vb2Qtdml6LWNvbmZpZy1vcHRpb24ifSxyKCJpbnB1dCIse3R5cGU6InJhZGlvIixuYW1lOiJtb29kLXZpei1tb2RlIix2YWx1ZTpDLGNoZWNrZWQ6Yj09PUMsb25DaGFuZ2U6KCk9PmcoQyl9KSxMKSkpKTpudWxsO3JldHVybiBjP3IoZmUse3RpdGxlOmRlKCJtb29kIiksaWNvbjoiXHV7MUYzQUR9Iix3aWRnZXRJZDoibW9vZCJ9LFAscigiZGl2Iix7Y2xhc3NOYW1lOiJtb29kLWNvbmZpcm1hdGlvbiJ9LHIoImRpdiIse2NsYXNzTmFtZToibW9vZC1jb25maXJtYXRpb24taWNvbiJ9LG8uZW1vamkpLHIoInAiLHtjbGFzc05hbWU6Im1vb2QtY29uZmlybWF0aW9uLXRleHQifSwiTW9vZCByYXRpbmcgcmVjb3JkZWQiKSkseik6cihmZSx7dGl0bGU6ZGUoIm1vb2QiKSxpY29uOiJcdXsxRjNBRH0iLHdpZGdldElkOiJtb29kIn0sUCxyKCJkaXYiLHtjbGFzc05hbWU6Im1vb2Qtc2VsZWN0b3IifSxrbC5tYXAoQz0+cigiYnV0dG9uIix7a2V5OkMudmFsdWUsY2xhc3NOYW1lOiJtb29kLWJ0biIrKG8/LnZhbHVlPT09Qy52YWx1ZT8iIG1vb2QtYnRuLS1zZWxlY3RlZCI6IiIpLHRpdGxlOkMubGFiZWwsb25DbGljazooKT0+X04oQyxsLGMsYSl9LHIoInNwYW4iLHtjbGFzc05hbWU6Im1vb2QtZW1vamkifSxDLmVtb2ppKSkpKSxvIT09bnVsbCYmcigiZGl2Iix7Y2xhc3NOYW1lOiJtb29kLWRldGFpbHMifSxyKCJsYWJlbCIse2NsYXNzTmFtZToibW9vZC1kZXRhaWxzLWxhYmVsIn0sIk1vcmUgZGV0YWlscyAob3B0aW9uYWwpIikscigidGV4dGFyZWEiLHtjbGFzc05hbWU6Im1vb2QtZGV0YWlscy10ZXh0YXJlYSIsdmFsdWU6aSxvbkNoYW5nZTpDPT5zKEMudGFyZ2V0LnZhbHVlKSxvbktleURvd246Qz0+QU4oZSxDLG8saSx1LGQsbikscGxhY2Vob2xkZXI6IldoYXQncyBvbiB5b3VyIG1pbmQ/Iixyb3dzOk9UfSkpLG8hPT1udWxsJiZyKCJkaXYiLHtjbGFzc05hbWU6Im1vb2Qtc3VibWl0LXJvdyJ9LHIoImJ1dHRvbiIse2NsYXNzTmFtZToibW9vZC1jYW5jZWwtYnRuIixvbkNsaWNrOk8sZGlzYWJsZWQ6bH0sIkNhbmNlbCIpLHIoImJ1dHRvbiIse2NsYXNzTmFtZToibW9vZC1zdWJtaXQtYnRuIixvbkNsaWNrOigpPT5rMChlLG8saSx1LGQsbiksZGlzYWJsZWQ6bH0sbD8iUmVjb3JkaW5nLi4uIjoiU3VibWl0IikpLG89PT1udWxsJiZ6KX12YXIgYXQ9eWUobWUoKSk7dmFyIFNsPSJwZWFrLWhvdXJzIjtmdW5jdGlvbiBQTihlKXtyZXR1cm4gQXJyYXkuZnJvbSh7bGVuZ3RoOjI0fSwodCxuKT0+Vm8obixlKSl9ZnVuY3Rpb24gRTAoZSl7cmV0dXJuIGU/ZSBpbnN0YW5jZW9mIERhdGU/ZTp0eXBlb2YgZT09Im51bWJlciI/bmV3IERhdGUoZTwxZTEyP2UqMWUzOmUpOm5ldyBEYXRlKGUpOm51bGx9ZnVuY3Rpb24gTE4oZSl7bGV0IHQ9QmUoZSksbj10LmdldEZ1bGxZZWFyKCkscj10LmdldE1vbnRoKCksbz1uZXcgRGF0ZShuLHIsMSwwLDAsMCwwKSxhPW5ldyBEYXRlKG4scisxLDEsMCwwLDAsMCk7cmV0dXJue2Zyb206TWF0aC5mbG9vcihvLmdldFRpbWUoKS8xZTMpLHRvOk1hdGguZmxvb3IoYS5nZXRUaW1lKCkvMWUzKSxtb250aEtleTpgJHtufS0ke1N0cmluZyhyKzEpLnBhZFN0YXJ0KDIsIjAiKX1gfX1mdW5jdGlvbiB6TihlKXtsZXQgdD1uZXcgQXJyYXkoMjQpLmZpbGwoMCksbj1uZXcgQXJyYXkoMjQpLmZpbGwoMCkscj0wO2ZvcihsZXQgaSBvZiBlKXtsZXQgcz1pLnZpY3RvcnlWYWx1ZXx8MSxsPUUwKGkuY3JlYXRlZEF0fHxpLnN0YXJ0QXQpO2wmJiFpc05hTihsKSYmKHRbbC5nZXRIb3VycygpXSs9cyxyKyspO2xldCB1PUUwKGkuY29tcGxldGVkQXQpO3UmJiFpc05hTih1KSYmKG5bdS5nZXRIb3VycygpXSs9cyl9bGV0IG89dC5pbmRleE9mKE1hdGgubWF4KC4uLnQpKSxhPW4uaW5kZXhPZihNYXRoLm1heCguLi5uKSk7cmV0dXJue2NvbXBsZXRlZEJ5SG91cjpuLGNyZWF0ZWRCeUhvdXI6dCxwZWFrQ29tcGxldGVIb3VySW5kZXg6YSxwZWFrQ3JlYXRlSG91ckluZGV4Om8sdG90YWxUYXNrczpyfX1mdW5jdGlvbiBGTihlKXtsZXQgdD1nZXRDb21wdXRlZFN0eWxlKGUpO3JldHVybntiYXJDcmVhdGVkOnQuZ2V0UHJvcGVydHlWYWx1ZSgiLS1kYXNoYm9hcmQtY29sb3ItYmx1ZSIpLnRyaW0oKXx8IiM1YjdiYmYiLGJhckNvbXBsZXRlZDp0LmdldFByb3BlcnR5VmFsdWUoIi0tZGFzaGJvYXJkLWNvbG9yLWFjY2VudCIpLnRyaW0oKXx8IiNlODg1M2QiLGF4aXNUZXh0OnQuZ2V0UHJvcGVydHlWYWx1ZSgiLS1kYXNoYm9hcmQtY29sb3ItdGV4dC1zZWNvbmRhcnkiKS50cmltKCl8fCIjN2E4Njk5IixncmlkTGluZTp0LmdldFByb3BlcnR5VmFsdWUoIi0tZGFzaGJvYXJkLWNvbG9yLWJvcmRlciIpLnRyaW0oKXx8IiNkOGRkZTYifX1mdW5jdGlvbiBUMChlLHQsbixyKXtsZXQgbz1lLmdldENvbnRleHQoIjJkIiksYT13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8MSxpPWUucGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxzPWkud2lkdGgsbD1pLmhlaWdodDtpZihzPD0wfHxsPD0wKXJldHVybjtlLndpZHRoPXMqYSxlLmhlaWdodD1sKmEsZS5zdHlsZS53aWR0aD1gJHtzfXB4YCxlLnN0eWxlLmhlaWdodD1gJHtsfXB4YCxvLnNjYWxlKGEsYSk7bGV0IHU9Rk4oZSksYz00OCxkPTEyLHA9MTIseT00MCxoPXMtYy1kLHc9bC1wLXksYj1NYXRoLm1heCguLi50LC4uLm4sMSksZz1NYXRoLmNlaWwoYi8xMCkqMTB8fDEwO28uY2xlYXJSZWN0KDAsMCxzLGwpO2xldCBtPTU7by5mb250PSIxMXB4IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmIixvLnRleHRBbGlnbj0icmlnaHQiLG8udGV4dEJhc2VsaW5lPSJtaWRkbGUiO2ZvcihsZXQgRD0wO0Q8PW07RCsrKXtsZXQgTz1NYXRoLnJvdW5kKGcvbSpEKSxUPXArdy13KkQvbTtvLmZpbGxTdHlsZT11LmF4aXNUZXh0LG8uZmlsbFRleHQoYCR7T31gLGMtOCxUKSxEPjAmJihvLnN0cm9rZVN0eWxlPXUuZ3JpZExpbmUsby5nbG9iYWxBbHBoYT0uNCxvLmxpbmVXaWR0aD0uNSxvLmJlZ2luUGF0aCgpLG8ubW92ZVRvKGMsVCksby5saW5lVG8oYytoLFQpLG8uc3Ryb2tlKCksby5nbG9iYWxBbHBoYT0xKX1sZXQgdj0yNCxmPWgvdixFPWYqLjMyLGs9ZiouMDQ7Zm9yKGxldCBEPTA7RDx2O0QrKyl7bGV0IE89YytEKmYrKGYtRSoyLWspLzIsVD10W0RdL2cqdyx6PW5bRF0vZyp3O28uZmlsbFN0eWxlPXUuYmFyQ3JlYXRlZCxOMChvLE8scCt3LVQsRSxULDIpLG8uZmlsbFN0eWxlPXUuYmFyQ29tcGxldGVkLE4wKG8sTytFK2sscCt3LXosRSx6LDIpfW8uZmlsbFN0eWxlPXUuYXhpc1RleHQsby5mb250PSIxMHB4IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmIixvLnRleHRBbGlnbj0iY2VudGVyIixvLnRleHRCYXNlbGluZT0idG9wIjtsZXQgTj1oPDMwMD80OjI7Zm9yKGxldCBEPTA7RDx2O0QrPU4pe2xldCBPPWMrRCpmK2YvMjtvLmZpbGxUZXh0KHJbRF0sTyxwK3crOCl9fWZ1bmN0aW9uIE4wKGUsdCxuLHIsbyxhKXtvPDF8fChhPU1hdGgubWluKGEsby8yLHIvMiksZS5iZWdpblBhdGgoKSxlLm1vdmVUbyh0K2EsbiksZS5saW5lVG8odCtyLWEsbiksZS5hcmNUbyh0K3Isbix0K3IsbithLGEpLGUubGluZVRvKHQrcixuK28pLGUubGluZVRvKHQsbitvKSxlLmxpbmVUbyh0LG4rYSksZS5hcmNUbyh0LG4sdCthLG4sYSksZS5jbG9zZVBhdGgoKSxlLmZpbGwoKSl9ZnVuY3Rpb24gVU4oZSx0KXtsZXQgbj1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHI9dC5jbGllbnRYLW4ubGVmdCxvPW4ud2lkdGgsYT00OCxzPW8tYS0xMixsPXItYTtyZXR1cm4gbDwwfHxsPnM/LTE6TWF0aC5mbG9vcihsL3MqMjQpfWZ1bmN0aW9uIHlwKGUsdCxuKXtyZXR1cm4gZSgiZGl2Iix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLW1ldHJpYy1jYXJkIixrZXk6dH0sZSgiZGl2Iix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLW1ldHJpYy1sYWJlbCJ9LHQpLGUoImRpdiIse2NsYXNzTmFtZToicGVhay1ob3Vycy1tZXRyaWMtdmFsdWUifSxuKSl9ZnVuY3Rpb24gRDAoZSx0LG4pe3JldHVybiBlKCJzcGFuIix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLWxlZ2VuZC1pdGVtIixrZXk6bn0sZSgic3BhbiIse2NsYXNzTmFtZTpgcGVhay1ob3Vycy1sZWdlbmQtc3dhdGNoICR7dH1gfSksbil9ZnVuY3Rpb24gdnAoe2FwcDplLGN1cnJlbnREYXRlOnQsc2VsZWN0ZWREYXRlOm4sdGltZUZvcm1hdDpyfSl7bGV0IG89YXQuY3JlYXRlRWxlbWVudCxhPSgwLGF0LnVzZVJlZikobnVsbCksW2ksc109KDAsYXQudXNlU3RhdGUpKG51bGwpLFtsLHVdPSgwLGF0LnVzZVN0YXRlKShbXSksYz0oMCxhdC51c2VSZWYpKG51bGwpLGQ9bnx8dDsoMCxhdC51c2VFZmZlY3QpKCgpPT57aWYoIWR8fCFlKXJldHVybjtsZXR7ZnJvbTpELHRvOk8sbW9udGhLZXk6VH09TE4oZCk7aWYoYy5jdXJyZW50PT09VClyZXR1cm47Yy5jdXJyZW50PVQ7bGV0IHo9ITE7cmV0dXJuIGUuZ2V0Q29tcGxldGVkVGFza3MoRCxPKS50aGVuKFA9Pnt6fHx1KEFycmF5LmlzQXJyYXkoUCk/UDpbXSl9KS5jYXRjaChQPT57XygiW3BlYWstaG91cnNdIGZhaWxlZCB0byBmZXRjaCBtb250aCB0YXNrcyIsUCksenx8dShbXSl9KSwoKT0+e3o9ITB9fSxbZSxkXSk7bGV0IHA9UE4ocikse2NvbXBsZXRlZEJ5SG91cjp5LGNyZWF0ZWRCeUhvdXI6aCxwZWFrQ29tcGxldGVIb3VySW5kZXg6dyxwZWFrQ3JlYXRlSG91ckluZGV4OmIsdG90YWxUYXNrczpnfT0oMCxhdC51c2VNZW1vKSgoKT0+ek4obCksW2xdKSxtPXBbYl0sdj1wW3ddLHttb250aFN1YnRpdGxlOmYsZGF0ZVJhbmdlOkV9PSgwLGF0LnVzZU1lbW8pKCgpPT57aWYoIWQpcmV0dXJue21vbnRoU3VidGl0bGU6bnVsbCxkYXRlUmFuZ2U6bnVsbH07bGV0IEQ9QmUoZCksTz1ELmdldEZ1bGxZZWFyKCksVD1ELmdldE1vbnRoKCk7cmV0dXJue21vbnRoU3VidGl0bGU6RC50b0xvY2FsZURhdGVTdHJpbmcodm9pZCAwLHttb250aDoibG9uZyIseWVhcjoibnVtZXJpYyJ9KSxkYXRlUmFuZ2U6e3N0YXJ0Om5ldyBEYXRlKE8sVCwxKSxlbmQ6bmV3IERhdGUoTyxUKzEsMCl9fX0sW2RdKTsoMCxhdC51c2VFZmZlY3QpKCgpPT57aWYoIWEuY3VycmVudClyZXR1cm47VDAoYS5jdXJyZW50LGgseSxwKTtsZXQgRD0oKT0+e2EuY3VycmVudCYmVDAoYS5jdXJyZW50LGgseSxwKX07cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLEQpLCgpPT53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIixEKX0sW3ksaCxwXSk7bGV0IGs9KDAsYXQudXNlQ2FsbGJhY2spKEQ9PntsZXQgTz1VTihhLmN1cnJlbnQsRCk7aWYoTzwwfHxPPjIzKXtzKG51bGwpO3JldHVybn1sZXQgVD1hLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cyh7eDpELmNsaWVudFgtVC5sZWZ0LHk6RC5jbGllbnRZLVQudG9wLTYwLGhvdXI6cFtPXSxjcmVhdGVkOmhbT10sY29tcGxldGVkOnlbT119KX0sW2gseV0pLE49KDAsYXQudXNlQ2FsbGJhY2spKCgpPT5zKG51bGwpLFtdKTtyZXR1cm4gZz09PTA/byhmZSx7dGl0bGU6ZGUoU2wpLGljb246Ilx1MjNGMCIsd2lkZ2V0SWQ6U2wsc3VidGl0bGU6Zn0sbygiZGl2Iix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLWVtcHR5In0sbygicCIsbnVsbCwiTm8gY29tcGxldGVkIHRhc2sgZGF0YSBhdmFpbGFibGUgeWV0LiIpKSk6byhmZSx7dGl0bGU6ZGUoU2wpLGljb246Ilx1MjNGMCIsd2lkZ2V0SWQ6U2wsc3VidGl0bGU6Zn0sbygiZGl2Iix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLW1ldHJpY3MtZ3JpZCJ9LHlwKG8sIlRhc2tzIGFuYWx5emVkIixnKSx5cChvLCJQZWFrIGNyZWF0ZSBob3VyIixtKSx5cChvLCJQZWFrIGNvbXBsZXRlIGhvdXIiLHYpKSxvKCJkaXYiLHtjbGFzc05hbWU6InBlYWstaG91cnMtbGVnZW5kIn0sRDAobywicGVhay1ob3Vycy1sZWdlbmQtc3dhdGNoLS1jcmVhdGVkIiwiQ3JlYXRlZCB2YWx1ZSIpLEQwKG8sInBlYWstaG91cnMtbGVnZW5kLXN3YXRjaC0tY29tcGxldGVkIiwiQ29tcGxldGVkIHZhbHVlIikpLG8oImRpdiIse2NsYXNzTmFtZToicGVhay1ob3Vycy1jaGFydC1jb250YWluZXIifSxvKCJjYW52YXMiLHtyZWY6YSxjbGFzc05hbWU6InBlYWstaG91cnMtY2FudmFzIixvbk1vdXNlTW92ZTprLG9uTW91c2VMZWF2ZTpOfSksaSYmbygiZGl2Iix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLXRvb2x0aXAiLHN0eWxlOntsZWZ0OmkueCx0b3A6aS55LHRyYW5zZm9ybToidHJhbnNsYXRlWCgtNTAlKSJ9fSxvKCJkaXYiLHtjbGFzc05hbWU6InBlYWstaG91cnMtdG9vbHRpcC1oZWFkZXIifSxpLmhvdXIpLG8oImRpdiIse2NsYXNzTmFtZToicGVhay1ob3Vycy10b29sdGlwLXJvdyJ9LG8oInNwYW4iLHtjbGFzc05hbWU6InBlYWstaG91cnMtdG9vbHRpcC1sYWJlbCBwZWFrLWhvdXJzLXRvb2x0aXAtbGFiZWwtLWNyZWF0ZWQifSwiQ3JlYXRlZDoiKSxgICR7aS5jcmVhdGVkfSBwdHNgKSxvKCJkaXYiLHtjbGFzc05hbWU6InBlYWstaG91cnMtdG9vbHRpcC1yb3cifSxvKCJzcGFuIix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLXRvb2x0aXAtbGFiZWwgcGVhay1ob3Vycy10b29sdGlwLWxhYmVsLS1jb21wbGV0ZWQifSwiQ29tcGxldGVkOiIpLGAgJHtpLmNvbXBsZXRlZH0gcHRzYCkpKSxFJiZvKCJkaXYiLHtjbGFzc05hbWU6InBlYWstaG91cnMtZm9vdGVyIn0sZikpfXZhciBWbj15ZShtZSgpKTt2YXIgJE49W3t0ZXh0OiJUaGUgc2VjcmV0IG9mIGdldHRpbmcgYWhlYWQgaXMgZ2V0dGluZyBzdGFydGVkLiIsYXV0aG9yOiJNYXJrIFR3YWluIn0se3RleHQ6IllvdSBkb24ndCBoYXZlIHRvIGJlIGdyZWF0IHRvIHN0YXJ0LCBidXQgeW91IGhhdmUgdG8gc3RhcnQgdG8gYmUgZ3JlYXQuIixhdXRob3I6IlppZyBaaWdsYXIifSx7dGV4dDoiQWN0aW9uIGlzIHRoZSBmb3VuZGF0aW9uYWwga2V5IHRvIGFsbCBzdWNjZXNzLiIsYXV0aG9yOiJQYWJsbyBQaWNhc3NvIn0se3RleHQ6IkRvbmUgaXMgYmV0dGVyIHRoYW4gcGVyZmVjdC4iLGF1dGhvcjoiU2hlcnlsIFNhbmRiZXJnIn0se3RleHQ6IkFtYXRldXJzIHNpdCBhbmQgd2FpdCBmb3IgaW5zcGlyYXRpb247IHRoZSByZXN0IG9mIHVzIGp1c3QgZ2V0IHVwIGFuZCBnbyB0byB3b3JrLiIsYXV0aG9yOiJTdGVwaGVuIEtpbmcifSx7dGV4dDoiVGhlIHdheSB0byBnZXQgc3RhcnRlZCBpcyB0byBxdWl0IHRhbGtpbmcgYW5kIGJlZ2luIGRvaW5nLiIsYXV0aG9yOiJXYWx0IERpc25leSJ9LHt0ZXh0OiJGb2N1cyBvbiBiZWluZyBwcm9kdWN0aXZlIGluc3RlYWQgb2YgYnVzeS4iLGF1dGhvcjoiVGltIEZlcnJpc3MifSx7dGV4dDoiSXQncyBub3QgYWJvdXQgaGF2aW5nIHRpbWUuIEl0J3MgYWJvdXQgbWFraW5nIHRpbWUuIixhdXRob3I6IiJ9LHt0ZXh0OiJXb3JrIGV4cGFuZHMgdG8gZmlsbCB0aGUgdGltZSBhdmFpbGFibGUgZm9yIGl0cyBjb21wbGV0aW9uLiIsYXV0aG9yOiJDeXJpbCBOb3J0aGNvdGUgUGFya2luc29uIn0se3RleHQ6IlN0b3Agd2FpdGluZyBmb3IgdGhlIHJpZ2h0IHRpbWUuIFRoZSB0aW1lIHdpbGwgbmV2ZXIgYmUganVzdCByaWdodC4iLGF1dGhvcjoiTmFwb2xlb24gSGlsbCJ9LHt0ZXh0OiJNb3RpdmF0aW9uIGlzIHdoYXQgZ2V0cyB5b3Ugc3RhcnRlZC4gSGFiaXQgaXMgd2hhdCBrZWVwcyB5b3UgZ29pbmcuIixhdXRob3I6IkppbSBSeXVuIn0se3RleHQ6IklmIHlvdSBzcGVuZCB0b28gbXVjaCB0aW1lIHRoaW5raW5nIGFib3V0IGEgdGhpbmcsIHlvdSdsbCBuZXZlciBnZXQgaXQgZG9uZS4iLGF1dGhvcjoiQnJ1Y2UgTGVlIn0se3RleHQ6IlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gb3JkaW5hcnkgYW5kIGV4dHJhb3JkaW5hcnkgaXMgdGhhdCBsaXR0bGUgJ2V4dHJhJy4iLGF1dGhvcjoiIn0se3RleHQ6IkVmZmljaWVuY3kgaXMgZG9pbmcgdGhpbmdzIHJpZ2h0LiBFZmZlY3RpdmVuZXNzIGlzIGRvaW5nIHRoZSByaWdodCB0aGluZ3MuIixhdXRob3I6IlBldGVyIERydWNrZXIifSx7dGV4dDoiWW91IGFyZSBuZXZlciB0b28gb2xkIHRvIHNldCBhbm90aGVyIGdvYWwgb3IgdG8gZHJlYW0gYSBuZXcgZHJlYW0uIixhdXRob3I6IkMuUy4gTGV3aXMifSx7dGV4dDoiU21hbGwgZGFpbHkgaW1wcm92ZW1lbnRzIGFyZSB0aGUga2V5IHRvIHN0YWdnZXJpbmcgbG9uZy10ZXJtIHJlc3VsdHMuIixhdXRob3I6IlJvYmluIFNoYXJtYSJ9LHt0ZXh0OiJEcmVhbXMgZG9uJ3Qgd29yayB1bmxlc3MgeW91IGRvLiIsYXV0aG9yOiJKb2huIEMuIE1heHdlbGwifSx7dGV4dDoiVGhlIG1vc3QgZWZmZWN0aXZlIHdheSB0byBkbyBpdCBpcyB0byBkbyBpdC4iLGF1dGhvcjoiQW1lbGlhIEVhcmhhcnQifSx7dGV4dDoiVGFrZSB0aW1lIHRvIGRlbGliZXJhdGUsIGJ1dCB3aGVuIHRoZSB0aW1lIGZvciBhY3Rpb24gYXJyaXZlcywgc3RvcCB0aGlua2luZyBhbmQgZ28gaW4uIixhdXRob3I6Ik5hcG9sZW9uIEJvbmFwYXJ0ZSJ9LHt0ZXh0OiJTdHJpdmluZyBmb3IgZXhjZWxsZW5jZSBtb3RpdmF0ZXMgeW91OyBzdHJpdmluZyBmb3IgcGVyZmVjdGlvbiBpcyBkZW1vcmFsaXppbmcuIixhdXRob3I6IkhhcnJpZXQgQnJhaWtlciJ9LHt0ZXh0OiJUaGUgam91cm5leSBvZiBhIHRob3VzYW5kIG1pbGVzIGJlZ2lucyB3aXRoIGEgc2luZ2xlIHN0ZXAuIixhdXRob3I6IkxhbyBUenUifSx7dGV4dDoiQSB5ZWFyIGZyb20gbm93IHlvdSBtYXkgd2lzaCB5b3UgaGFkIHN0YXJ0ZWQgdG9kYXkuIixhdXRob3I6IkthcmVuIExhbWIifSx7dGV4dDoiVGhlIGJlZ2lubmluZyBpcyB0aGUgbW9zdCBpbXBvcnRhbnQgcGFydCBvZiB0aGUgd29yay4iLGF1dGhvcjoiUGxhdG8ifSx7dGV4dDoiWW91IGRvbid0IG5lZWQgdG8gc2VlIHRoZSB3aG9sZSBzdGFpcmNhc2UsIGp1c3QgdGFrZSB0aGUgZmlyc3Qgc3RlcC4iLGF1dGhvcjoiTWFydGluIEx1dGhlciBLaW5nIEpyLiJ9LHt0ZXh0OiJTdGFydCB3aGVyZSB5b3UgYXJlLiBVc2Ugd2hhdCB5b3UgaGF2ZS4gRG8gd2hhdCB5b3UgY2FuLiIsYXV0aG9yOiJBcnRodXIgQXNoZSJ9LHt0ZXh0OiJUaGUgZmlyc3Qgc3RlcCBpcyB5b3UgaGF2ZSB0byBzYXkgdGhhdCB5b3UgY2FuLiIsYXV0aG9yOiJXaWxsIFNtaXRoIn0se3RleHQ6IkluIHRoZSBtaWRkbGUgb2YgZXZlcnkgZGlmZmljdWx0eSBsaWVzIG9wcG9ydHVuaXR5LiIsYXV0aG9yOiJBbGJlcnQgRWluc3RlaW4ifSx7dGV4dDoiRXZlbiB0aGUgbG9uZ2VzdCBqb3VybmV5IHN0YXJ0cyB3aXRoIHB1dHRpbmcgb25lIGZvb3QgaW4gZnJvbnQgb2YgdGhlIG90aGVyLiIsYXV0aG9yOiIifSx7dGV4dDoiWW91IGRvbid0IGhhdmUgdG8gYmUgcGVyZmVjdCB0byBzdGFydCwgYnV0IHlvdSBoYXZlIHRvIHN0YXJ0IHRvIGJlIHBlcmZlY3QuIixhdXRob3I6IiJ9LHt0ZXh0OiJDb3VyYWdlIGlzIG5vdCB0aGUgYWJzZW5jZSBvZiBmZWFyLCBidXQgdGhlIGp1ZGdtZW50IHRoYXQgc29tZXRoaW5nIGVsc2UgaXMgbW9yZSBpbXBvcnRhbnQuIixhdXRob3I6IkFtYnJvc2UgUmVkbW9vbiJ9LHt0ZXh0OiJXaGF0ZXZlciB5b3UgY2FuIGRvLCBvciBkcmVhbSB5b3UgY2FuIFx1MjAxNCBiZWdpbiBpdC4gQm9sZG5lc3MgaGFzIGdlbml1cywgcG93ZXIsIGFuZCBtYWdpYyBpbiBpdC4iLGF1dGhvcjoiSm9oYW5uIFdvbGZnYW5nIHZvbiBHb2V0aGUifSx7dGV4dDoiVGhlIGhhcmRlc3QgcGFydCBpcyBzdGFydGluZy4gT25jZSB5b3UgZ2V0IHRoYXQgb3V0IG9mIHRoZSB3YXksIHlvdSdsbCBmaW5kIHRoZSByZXN0IG9mIHRoZSBqb3VybmV5IG11Y2ggZWFzaWVyLiIsYXV0aG9yOiIifSx7dGV4dDoiSW5hY3Rpb24gYnJlZWRzIGRvdWJ0IGFuZCBmZWFyLiBBY3Rpb24gYnJlZWRzIGNvbmZpZGVuY2UgYW5kIGNvdXJhZ2UuIixhdXRob3I6IkRhbGUgQ2FybmVnaWUifSx7dGV4dDoiVGhlIGJlc3QgdGltZSB0byBwbGFudCBhIHRyZWUgd2FzIHR3ZW50eSB5ZWFycyBhZ28uIFRoZSBzZWNvbmQgYmVzdCB0aW1lIGlzIG5vdy4iLGF1dGhvcjoiQ2hpbmVzZSBQcm92ZXJiIn0se3RleHQ6IllvdSBkb24ndCBoYXZlIHRvIGJlIGZlYXJsZXNzLiBKdXN0IGRvbid0IGxldCBmZWFyIHN0b3AgeW91LiIsYXV0aG9yOiIifSx7dGV4dDoiUHJvZ3Jlc3MsIG5vdCBwZXJmZWN0aW9uLCBpcyB0aGUgZ29hbC4iLGF1dGhvcjoiIn0se3RleHQ6Ik5vdGhpbmcgd2lsbCB3b3JrIHVubGVzcyB5b3UgZG8uIixhdXRob3I6Ik1heWEgQW5nZWxvdSJ9LHt0ZXh0OiJMZWFwIGFuZCB0aGUgbmV0IHdpbGwgYXBwZWFyLiIsYXV0aG9yOiJKb2huIEJ1cnJvdWdocyJ9LHt0ZXh0OiJUaGUgZmlyc3Qgc3RlcCBiaW5kcyBvbmUgdG8gdGhlIHNlY29uZC4iLGF1dGhvcjoiRnJlbmNoIFByb3ZlcmIifSx7dGV4dDoiVGFrZSB0aGUgZmlyc3Qgc3RlcCBpbiBmYWl0aC4gWW91IGRvbid0IGhhdmUgdG8gc2VlIHRoZSB3aG9sZSBzdGFpcmNhc2UuIixhdXRob3I6Ik1hcnRpbiBMdXRoZXIgS2luZyBKci4ifSx7dGV4dDoiVG9kYXkgaXMgYSBuZXcgZGF5LiBEb24ndCBsZXQgeWVzdGVyZGF5J3MgZmFpbHVyZXMgaGF1bnQgaXQuIixhdXRob3I6IiJ9LHt0ZXh0OiJFdmVyeSBtb3JuaW5nIHdlIGFyZSBib3JuIGFnYWluLiBXaGF0IHdlIGRvIHRvZGF5IG1hdHRlcnMgbW9zdC4iLGF1dGhvcjoiQnVkZGhhIn0se3RleHQ6IldpdGggdGhlIG5ldyBkYXkgY29tZXMgbmV3IHN0cmVuZ3RoIGFuZCBuZXcgdGhvdWdodHMuIixhdXRob3I6IkVsZWFub3IgUm9vc2V2ZWx0In0se3RleHQ6IlRvZGF5IGlzIGFub3RoZXIgY2hhbmNlIHRvIGdldCBiZXR0ZXIuIixhdXRob3I6IiJ9LHt0ZXh0OiJZZXN0ZXJkYXkgaXMgbm90IG91cnMgdG8gcmVjb3ZlciwgYnV0IHRvbW9ycm93IGlzIG91cnMgdG8gd2luIG9yIGxvc2UuIixhdXRob3I6Ikx5bmRvbiBCLiBKb2huc29uIn0se3RleHQ6IlRoZSBzdW4gaXMgYSBkYWlseSByZW1pbmRlciB0aGF0IHdlIHRvbyBjYW4gcmlzZSBhZ2FpbiBmcm9tIHRoZSBkYXJrbmVzcy4iLGF1dGhvcjoiUy4gQWpuYSJ9LHt0ZXh0OiJFdmVyeSBkYXkgaXMgYSBzZWNvbmQgY2hhbmNlLiIsYXV0aG9yOiIifSx7dGV4dDoiVG9kYXkncyBhY2NvbXBsaXNobWVudHMgd2VyZSB5ZXN0ZXJkYXkncyBpbXBvc3NpYmlsaXRpZXMuIixhdXRob3I6IlJvYmVydCBILiBTY2h1bGxlciJ9LHt0ZXh0OiJFYWNoIG5ldyBkYXkgaXMgYSBibGFuayBwYWdlIGluIHRoZSBkaWFyeSBvZiB5b3VyIGxpZmUuIixhdXRob3I6IiJ9LHt0ZXh0OiJBbiBvcHRpbWlzdCBzZWVzIGFuIG9wcG9ydHVuaXR5IGluIGV2ZXJ5IGNhbGFtaXR5OyBhIHBlc3NpbWlzdCBzZWVzIGEgY2FsYW1pdHkgaW4gZXZlcnkgb3Bwb3J0dW5pdHkuIixhdXRob3I6IldpbnN0b24gQ2h1cmNoaWxsIn0se3RleHQ6Ik9wcG9ydHVuaXRpZXMgZG9uJ3QgaGFwcGVuLiBZb3UgY3JlYXRlIHRoZW0uIixhdXRob3I6IkNocmlzIEdyb3NzZXIifSx7dGV4dDoiVGhpcyBpcyBhIHdvbmRlcmZ1bCBkYXkuIEkndmUgbmV2ZXIgc2VlbiB0aGlzIG9uZSBiZWZvcmUuIixhdXRob3I6Ik1heWEgQW5nZWxvdSJ9LHt0ZXh0OiJZb3UgaGF2ZSBleGFjdGx5IG9uZSBsaWZlIGluIHdoaWNoIHRvIGRvIGV2ZXJ5dGhpbmcgeW91J2xsIGV2ZXIgZG8uIEFjdCBhY2NvcmRpbmdseS4iLGF1dGhvcjoiQ29saW4gV3JpZ2h0In0se3RleHQ6IkxpZmUgaXMgd2hhdCBoYXBwZW5zIHdoZW4geW91J3JlIGJ1c3kgbWFraW5nIG90aGVyIHBsYW5zLiIsYXV0aG9yOiJKb2huIExlbm5vbiJ9LHt0ZXh0OiJZb3VyIGxpZmUgZG9lcyBub3QgZ2V0IGJldHRlciBieSBjaGFuY2UsIGl0IGdldHMgYmV0dGVyIGJ5IGNoYW5nZS4iLGF1dGhvcjoiSmltIFJvaG4ifSx7dGV4dDoiRG9uJ3Qgd2F0Y2ggdGhlIGNsb2NrOyBkbyB3aGF0IGl0IGRvZXMuIEtlZXAgZ29pbmcuIixhdXRob3I6IlNhbSBMZXZlbnNvbiJ9LHt0ZXh0OiJCZWxpZXZlIHlvdSBjYW4gYW5kIHlvdSdyZSBoYWxmd2F5IHRoZXJlLiIsYXV0aG9yOiJUaGVvZG9yZSBSb29zZXZlbHQifSx7dGV4dDoiSXQgZG9lcyBub3QgbWF0dGVyIGhvdyBzbG93bHkgeW91IGdvIGFzIGxvbmcgYXMgeW91IGRvIG5vdCBzdG9wLiIsYXV0aG9yOiJDb25mdWNpdXMifSx7dGV4dDoiVGhlIG9ubHkgbGltaXQgdG8gb3VyIHJlYWxpemF0aW9uIG9mIHRvbW9ycm93IHdpbGwgYmUgb3VyIGRvdWJ0cyBvZiB0b2RheS4iLGF1dGhvcjoiRnJhbmtsaW4gRC4gUm9vc2V2ZWx0In0se3RleHQ6IlRoZSBmdXR1cmUgYmVsb25ncyB0byB0aG9zZSB3aG8gYmVsaWV2ZSBpbiB0aGUgYmVhdXR5IG9mIHRoZWlyIGRyZWFtcy4iLGF1dGhvcjoiRWxlYW5vciBSb29zZXZlbHQifSx7dGV4dDoiSWYgeW91J3JlIGdvaW5nIHRocm91Z2ggaGVsbCwga2VlcCBnb2luZy4iLGF1dGhvcjoiV2luc3RvbiBDaHVyY2hpbGwifSx7dGV4dDoiUGVyc2lzdGVuY2UgZ3VhcmFudGVlcyB0aGF0IHJlc3VsdHMgYXJlIGluZXZpdGFibGUuIixhdXRob3I6IlBhcmFtYWhhbnNhIFlvZ2FuYW5kYSJ9LHt0ZXh0OiJTdWNjZXNzIGlzIG5vdCBmaW5hbCwgZmFpbHVyZSBpcyBub3QgZmF0YWw6IGl0IGlzIHRoZSBjb3VyYWdlIHRvIGNvbnRpbnVlIHRoYXQgY291bnRzLiIsYXV0aG9yOiJXaW5zdG9uIENodXJjaGlsbCJ9LHt0ZXh0OiJZb3UgbWlzcyAxMDAlIG9mIHRoZSBzaG90cyB5b3UgZG9uJ3QgdGFrZS4iLGF1dGhvcjoiV2F5bmUgR3JldHpreSJ9LHt0ZXh0OiJJdCBhbHdheXMgc2VlbXMgaW1wb3NzaWJsZSB1bnRpbCBpdCdzIGRvbmUuIixhdXRob3I6Ik5lbHNvbiBNYW5kZWxhIn0se3RleHQ6IldlIG1heSBlbmNvdW50ZXIgbWFueSBkZWZlYXRzLCBidXQgd2UgbXVzdCBub3QgYmUgZGVmZWF0ZWQuIixhdXRob3I6Ik1heWEgQW5nZWxvdSJ9LHt0ZXh0OiJJIG5ldmVyIGRyZWFtZWQgYWJvdXQgc3VjY2Vzcy4gSSB3b3JrZWQgZm9yIGl0LiIsYXV0aG9yOiJFc3RceEU5ZSBMYXVkZXIifSx7dGV4dDoiVGhlIG9ubHkgd2F5IG91dCBpcyB0aHJvdWdoLiIsYXV0aG9yOiJSb2JlcnQgRnJvc3QifSx7dGV4dDoiSGFyZHNoaXBzIG9mdGVuIHByZXBhcmUgb3JkaW5hcnkgcGVvcGxlIGZvciBhbiBleHRyYW9yZGluYXJ5IGRlc3RpbnkuIixhdXRob3I6IkMuUy4gTGV3aXMifSx7dGV4dDoiQWN0IGFzIGlmIHdoYXQgeW91IGRvIG1ha2VzIGEgZGlmZmVyZW5jZS4gSXQgZG9lcy4iLGF1dGhvcjoiV2lsbGlhbSBKYW1lcyJ9LHt0ZXh0OiJJbiB0aGUgbWlkZGxlIG9mIGRpZmZpY3VsdHkgbGllcyBvcHBvcnR1bml0eS4iLGF1dGhvcjoiQWxiZXJ0IEVpbnN0ZWluIn0se3RleHQ6IllvdSBhcmUgYnJhdmVyIHRoYW4geW91IGJlbGlldmUsIHN0cm9uZ2VyIHRoYW4geW91IHNlZW0sIGFuZCBzbWFydGVyIHRoYW4geW91IHRoaW5rLiIsYXV0aG9yOiJBLkEuIE1pbG5lIn0se3RleHQ6IktlZXAgeW91ciBleWVzIG9uIHRoZSBzdGFycyBhbmQgeW91ciBmZWV0IG9uIHRoZSBncm91bmQuIixhdXRob3I6IlRoZW9kb3JlIFJvb3NldmVsdCJ9LHt0ZXh0OiJXaGF0IHlvdSBkbyB0b2RheSBjYW4gaW1wcm92ZSBhbGwgeW91ciB0b21vcnJvd3MuIixhdXRob3I6IlJhbHBoIE1hcnN0b24ifSx7dGV4dDoiRG9uJ3QgYmUgcHVzaGVkIGFyb3VuZCBieSB0aGUgZmVhcnMgaW4geW91ciBtaW5kLiBCZSBsZWQgYnkgdGhlIGRyZWFtcyBpbiB5b3VyIGhlYXJ0LiIsYXV0aG9yOiJSb3kgVC4gQmVubmV0dCJ9LHt0ZXh0OiJUaGUgb25seSBwZXJzb24geW91IHNob3VsZCB0cnkgdG8gYmUgYmV0dGVyIHRoYW4gaXMgd2hvIHlvdSB3ZXJlIHllc3RlcmRheS4iLGF1dGhvcjoiIn0se3RleHQ6IklmIHlvdSB3YW50IHRvIGFjaGlldmUgZ3JlYXRuZXNzLCBzdG9wIGFza2luZyBmb3IgcGVybWlzc2lvbi4iLGF1dGhvcjoiIn0se3RleHQ6IlRoaW5ncyB3b3JrIG91dCBiZXN0IGZvciB0aG9zZSB3aG8gbWFrZSB0aGUgYmVzdCBvZiBob3cgdGhpbmdzIHdvcmsgb3V0LiIsYXV0aG9yOiJKb2huIFdvb2RlbiJ9LHt0ZXh0OiJUbyBsaXZlIGEgY3JlYXRpdmUgbGlmZSwgd2UgbXVzdCBsb3NlIG91ciBmZWFyIG9mIGJlaW5nIHdyb25nLiIsYXV0aG9yOiJKb3NlcGggQ2hpbHRvbiBQZWFyY2UifSx7dGV4dDoiSWYgeW91IGFyZSBub3Qgd2lsbGluZyB0byByaXNrIHRoZSB1c3VhbCwgeW91IHdpbGwgaGF2ZSB0byBzZXR0bGUgZm9yIHRoZSBvcmRpbmFyeS4iLGF1dGhvcjoiSmltIFJvaG4ifSx7dGV4dDoiVHJ1c3QgeW91cnNlbGYuIFlvdSBrbm93IG1vcmUgdGhhbiB5b3UgdGhpbmsgeW91IGRvLiIsYXV0aG9yOiJCZW5qYW1pbiBTcG9jayJ9LHt0ZXh0OiJXaGF0IHNlZW1zIHRvIHVzIGFzIGJpdHRlciB0cmlhbHMgYXJlIG9mdGVuIGJsZXNzaW5ncyBpbiBkaXNndWlzZS4iLGF1dGhvcjoiT3NjYXIgV2lsZGUifSx7dGV4dDoiVGhlIG9ubHkgcGxhY2Ugd2hlcmUgc3VjY2VzcyBjb21lcyBiZWZvcmUgd29yayBpcyBpbiB0aGUgZGljdGlvbmFyeS4iLGF1dGhvcjoiVmlkYWwgU2Fzc29vbiJ9LHt0ZXh0OiJUb28gbWFueSBvZiB1cyBhcmUgbm90IGxpdmluZyBvdXIgZHJlYW1zIGJlY2F1c2Ugd2UgYXJlIGxpdmluZyBvdXIgZmVhcnMuIixhdXRob3I6IkxlcyBCcm93biJ9LHt0ZXh0OiJJIGZpbmQgdGhhdCB0aGUgaGFyZGVyIEkgd29yaywgdGhlIG1vcmUgbHVjayBJIHNlZW0gdG8gaGF2ZS4iLGF1dGhvcjoiVGhvbWFzIEplZmZlcnNvbiJ9LHt0ZXh0OiJTdWNjZXNzIHVzdWFsbHkgY29tZXMgdG8gdGhvc2Ugd2hvIGFyZSB0b28gYnVzeSB0byBiZSBsb29raW5nIGZvciBpdC4iLGF1dGhvcjoiSGVucnkgRGF2aWQgVGhvcmVhdSJ9LHt0ZXh0OiJJZiB5b3UgcmVhbGx5IGxvb2sgY2xvc2VseSwgbW9zdCBvdmVybmlnaHQgc3VjY2Vzc2VzIHRvb2sgYSBsb25nIHRpbWUuIixhdXRob3I6IlN0ZXZlIEpvYnMifSx7dGV4dDoiTmV2ZXIgZ2l2ZSB1cCBvbiBhIGRyZWFtIGp1c3QgYmVjYXVzZSBvZiB0aGUgdGltZSBpdCB3aWxsIHRha2UgdG8gYWNjb21wbGlzaCBpdC4iLGF1dGhvcjoiRWFybCBOaWdodGluZ2FsZSJ9LHt0ZXh0OiJZb3UndmUgZ290IHRvIGdldCB1cCBldmVyeSBtb3JuaW5nIHdpdGggZGV0ZXJtaW5hdGlvbiBpZiB5b3UncmUgZ29pbmcgdG8gZ28gdG8gYmVkIHdpdGggc2F0aXNmYWN0aW9uLiIsYXV0aG9yOiJHZW9yZ2UgTG9yaW1lciJ9LHt0ZXh0OiJUaGUgc2VjcmV0IG9mIHlvdXIgc3VjY2VzcyBpcyBkZXRlcm1pbmVkIGJ5IHlvdXIgZGFpbHkgYWdlbmRhLiIsYXV0aG9yOiJKb2huIEMuIE1heHdlbGwifV07ZnVuY3Rpb24gZmkoZT0yKXtyZXR1cm5bLi4uJE5dLnNvcnQoKCk9Pk1hdGgucmFuZG9tKCktLjUpLnNsaWNlKDAsZSl9dmFyIF8wPVsiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1MDY5MDU5MjUzNDYtMjFiZGE0ZDMyZGY0IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NzAwNzE0NTk2MDQtM2I1ZWMzYTdmZTA1IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1MDE3ODU4ODgwNDEtYWYzZWYyODViNDcwIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NjQ4MjI3NTkwMjMtZmVkNjIyZmYyYzNiIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1MTk2ODEzOTM3ODQtZDEyMDI2NzkzM2JhIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NzU5MjQxNTY3MzQtNDk2ZjZjYWM2ZWMxIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0OTA3MzAxNDExMDMtNmNhYzI3YWFhYjk0IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0MzMwODY5NjYzNTgtNTQ4NTlkMGVkNzE2IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NzIyMTQxMDM0NTEtOTM3NGJkMWM3OThlIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0MTQ2MDkyNDUyMjQtYWZhMDJiZmIzZmRhIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0Njk0NzQ5NjgwMjgtNTY2MjNmMDJlNDJlIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0MjY2MDQ5NjY4NDgtZDdhZGFjNDAyYmZmIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NjUxNDYzNDQ0MjUtZjAwZDVmNWM4ZjA3IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0OTE1NTM4OTU5MTEtMDA1NWVjYTY0MDJkIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NzA3NzA4NDEwNzItZjk3OGNmNGQwMTllIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NjQ4MjMwNjM1MzAtMDhmMTBlZDFhMmRkIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0Mzk4NTM5NDkxMjctZmE2NDc4MjFlYmEwIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NzIzOTY5NjE2OTMtMTQyZTZlMjY5MDI3IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0MzE3OTQwNjIyMzItMmE5OWE1NDMxYzZjIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NDY3NzY4MTE5NTMtYjIzZDU3YmQyMWFhIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1MDY3NDQwMzgxMzYtNDYyNzM4MzRiM2ZiIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0OTMyNDQwNDA2MjktNDk2ZjZkMTM2Y2MzIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0MTgwNjU0NjA0ODctM2U0MWE2Yzg0ZGM1IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NzAyNDY5NzM5MTgtMjlhOTMyMjFjNDU1IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NzMxMTY3NjMyNDktMmZhYWVmODFjY2RhIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0Mzk3OTI2NzUxMDUtNzAxZTZhNGFiNmYwIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NjMzMjA3MjYyODEtNjk2YTQ4NTkyOGM3IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0OTkwMDIyMzg0NDAtZDI2NGVkZDU5NmVjIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1MTA3OTg4MzE5NzEtNjYxZWIwNGIzNzM5IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1MDc1MjU0MjgwMzQtYjcyM2NmOTYxZDNlIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NDE5NzQyMzE1MzEtYzYyMjdkYjc2YjZlIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NTAxMDE0OTkxNjMtYzg4NDhjNjZjYTg1IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NTg2NjgzODM5NzAtOGRkZDM5MjdkZWVkIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NzA3NzA5MDM2NzYtNjliOTgyMDFlYTFjIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NjQwMzc4NjY1NTYtNjgxMmM5ZDFjNzJlIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NTUyMTg4NzM1MDktODA5NzMwNWVlMzc4IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NjU5MTkyOTIyNzUtYzYwYmE0OWRhNmFlIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NDgzNzUyNDA1ODYtODgyNzA3ZGI4ODhiIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NTExODc1ODA0NTktNDM0OTAyNzljMGZhIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NjUxMDEwNDY1MzAtNzMzOThjN2YyOGNhIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0MjE3ODk2NjUyMDktYzliMmE0MzVlM2RjIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0Nzc0MTQzNDg0NjMtYzBlYjdmMTM1OWI2IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1MDA1MzA4NTU2OTctYjU4NmQ4OWJhM2VlIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NTUxNTYyMTgzODgtNWU2MWI1MjY4MThiIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NDc3NTI4NzUyMTUtYjI3NjFhY2IzYzVkIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NDM4OTA5MjM0MjItNzgxOWVkNDEwMWMwIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0OTQ3ODMzNjcxOTMtMTQ5MDM0YzA1ZThmIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1MTc4MjEzNjUyMDEtMjBhMzdkNWYzZjZmIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1MDIwODI1NTMwNDgtZjAwOWMzNzEyOWI5IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1MTk5MDQ5ODEwNjMtYjBjZjQ0OGQ0NzllIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NzYyMzE2ODI4MjgtMzdlNTcxYmMxNzJmIl0sQTA9e3NtYWxsOnt3aWR0aDo2MDAsaGVpZ2h0OjYwMH0sbGFyZ2U6e3dpZHRoOjE5MjAsaGVpZ2h0OjEwODB9fTtmdW5jdGlvbiBCTihlKXtsZXQgdD1TdHJpbmcoZT8/ImRlZmF1bHQtc2VlZCIpLG49MDtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrPTEpbj0objw8NSktbit0LmNoYXJDb2RlQXQociksbnw9MDtyZXR1cm4gTWF0aC5hYnMobil9ZnVuY3Rpb24gRWwoZT0ic21hbGwiLHQ9ImRlZmF1bHQiLG49MCl7bGV0IHI9QTBbZV18fEEwLnNtYWxsLG89YCR7dH06JHtufWAsYT1CTihvKSVfMC5sZW5ndGgsaT1fMFthXSxzPWA/dz0ke3Iud2lkdGh9Jmg9JHtyLmhlaWdodH0mZml0PWNyb3AmYXV0bz1mb3JtYXRgO3JldHVybmAke2l9JHtzfWB9ZnVuY3Rpb24gd3Aoe2FwcDplLGdyaWRIZWlnaHRTaXplOnQscGxhbkNvbnRlbnQ6bixwcm92aWRlckFwaUtleTpyLHF1b3RlczpvfSl7bGV0IGE9Vm4uY3JlYXRlRWxlbWVudCxpPSh0fHwxKT49Mj80OjIsW3MsbF09KDAsVm4udXNlU3RhdGUpKG98fChuP1tdOmZpKGkpKSksW3UsY109KDAsVm4udXNlU3RhdGUpKCFvJiYhIW4pLFtkXT0oMCxWbi51c2VTdGF0ZSkoKCk9PmAke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKX1gKTsoMCxWbi51c2VFZmZlY3QpKCgpPT57IW8mJm4mJihjKCEwKSx5eShlLG4se2FwaUtleTpyfSkudGhlbihoPT57bChoJiZoLmxlbmd0aD9oOmZpKGkpKSxjKCExKX0pKX0sW10pLCgwLFZuLnVzZUVmZmVjdCkoKCk9PnshdSYmcy5sZW5ndGg8aSYmbChmaShpKSl9LFtpXSk7bGV0IHk9YSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJ3aWRnZXQtaGVhZGVyLWFjdGlvbiIsb25DbGljazooKT0+e2woZmkoaSkpfSx0aXRsZToiUmVzZWVkIHF1b3RlcyJ9LCJcdTIxQkIgUmVzZWVkIik7cmV0dXJuIHU/YShmZSx7dGl0bGU6ZGUoInF1b3RlcyIpLGljb246Ilx1ezFGNEExfSIsd2lkZ2V0SWQ6InF1b3RlcyJ9LGEoImRpdiIse2NsYXNzTmFtZToicXVvdGVzLWxvYWRpbmcifSwiR2VuZXJhdGluZyBxdW90ZXMuLi4iKSk6YShmZSx7dGl0bGU6ZGUoInF1b3RlcyIpLGljb246Ilx1ezFGNEExfSIsd2lkZ2V0SWQ6InF1b3RlcyIsaGVhZGVyQWN0aW9uczp5fSxhKCJkaXYiLHtjbGFzc05hbWU6InF1b3Rlcy1ncmlkIn0scy5zbGljZSgwLGkpLm1hcCgoaCx3KT0+YSgiZGl2Iix7a2V5OncsY2xhc3NOYW1lOiJxdW90ZS10aWxlIixzdHlsZTp7YmFja2dyb3VuZEltYWdlOiJsaW5lYXItZ3JhZGllbnQocmdiYSgwLDAsMCwwLjUpLCByZ2JhKDAsMCwwLDAuNikpLCB1cmwoIitFbCgic21hbGwiLGQsdykrIikifX0sYSgicCIse2NsYXNzTmFtZToicXVvdGUtdGV4dCJ9LCciJytoLnRleHQrJyInKSxoLmF1dGhvcj9hKCJzcGFuIix7Y2xhc3NOYW1lOiJxdW90ZS1hdXRob3IifSwiXHUyMDE0ICIraC5hdXRob3IpOm51bGwpKSkpfXZhciBDMD15ZShtZSgpKTt2YXIgV049e2RhaWx5Sm90OiJodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzL2pvdHMiLGpvdXJuYWw6Imh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vbm90ZXMvam90cyIsY2FsZW5kYXI6Imh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vbm90ZXMvY2FsZW5kYXIifTthc3luYyBmdW5jdGlvbiBITihlKXtsZXQgdDt0cnl7dD1hd2FpdCBlLmdldFRhc2tEb21haW5zKCl9Y2F0Y2h7cmV0dXJufWxldCBuPShBcnJheS5pc0FycmF5KHQpP3Q6W10pLmZpbHRlcihvPT5vIT1udWxsKS5mbGF0TWFwKG89Pm8ubm90ZXN8fFtdKTtpZighbi5sZW5ndGgpcmV0dXJuO2xldCByPW5bTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKm4ubGVuZ3RoKV07cj8udXVpZCYmYXdhaXQgZS5uYXZpZ2F0ZShgaHR0cHM6Ly93d3cuYW1wbGVub3RlLmNvbS9ub3Rlcy8ke3IudXVpZH1gKX1mdW5jdGlvbiBicCh7YXBwOmV9KXtsZXQgdD1DMC5jcmVhdGVFbGVtZW50LG49W3tsYWJlbDoiRGFpbHkgSm90IixpY29uOiJcdXsxRjRERH0iLGFjdGlvbjoiZGFpbHlKb3QifSx7bGFiZWw6IkpvdXJuYWwiLGljb246Ilx1ezFGNEQzfSIsYWN0aW9uOiJqb3VybmFsIn0se2xhYmVsOiJDYWxlbmRhciIsaWNvbjoiXHV7MUY0QzV9IixhY3Rpb246ImNhbGVuZGFyIn0se2xhYmVsOiJSYW5kb20gTm90ZSIsaWNvbjoiXHV7MUYzQjJ9IixhY3Rpb246InJhbmRvbU5vdGUifV0scj1hc3luYyBvPT57aWYobz09PSJyYW5kb21Ob3RlIil7YXdhaXQgSE4oZSk7cmV0dXJufWxldCBhPVdOW29dO2EmJmF3YWl0IGUubmF2aWdhdGUoYSl9O3JldHVybiB0KGZlLHt0aXRsZTpkZSgicXVpY2stYWN0aW9ucyIpLGljb246Ilx1MjZBMSIsd2lkZ2V0SWQ6InF1aWNrLWFjdGlvbnMifSx0KCJkaXYiLHtjbGFzc05hbWU6InFhLWdyaWQifSxuLm1hcChvPT50KCJidXR0b24iLHtrZXk6by5hY3Rpb24sY2xhc3NOYW1lOiJxYS1idXR0b24iLG9uQ2xpY2s6KCk9PnIoby5hY3Rpb24pfSx0KCJzcGFuIix7Y2xhc3NOYW1lOiJxYS1pY29uIn0sby5pY29uKSx0KCJzcGFuIix7Y2xhc3NOYW1lOiJxYS1sYWJlbCJ9LG8ubGFiZWwpKSkpKX12YXIgVG49eWUobWUoKSk7dmFyIGpOPTcqMjQqNjAqNjAqMWUzLFIwPTMsVk49NSxHTj01LEkwPTUwLEtOPTI1MCx4cD0yNTAsUDA9NyxZTj0xO2Z1bmN0aW9uIEwwKGUpe3JldHVybiBRTihgJHskZShuZXcgRGF0ZSl9LSR7ZX1gKX1hc3luYyBmdW5jdGlvbiBxTihlLHQ9bmV3IFNldCl7bGV0IG47dHJ5e249YXdhaXQgZS5nZXRUYXNrRG9tYWlucygpfWNhdGNoKGEpe3JldHVybiBfKCJbUmVjZW50Tm90ZXNdIGdldFRhc2tEb21haW5zIGZhaWxlZDoiLGEpLFtdfWlmKCFBcnJheS5pc0FycmF5KG4pfHxuLmxlbmd0aD09PTApcmV0dXJuW107bGV0IHI9bmV3IFNldCxvPVtdO2ZvcihsZXQgYSBvZiBuKWlmKGEpe2ZvcihsZXQgaSBvZiBhLm5vdGVzfHxbXSlpZighdC5oYXMoaT8udXVpZCkmJmk/LnV1aWQmJiFyLmhhcyhpLnV1aWQpJiYoci5hZGQoaS51dWlkKSxvLnB1c2goaSksby5sZW5ndGg+PUtOKSlyZXR1cm4gb31yZXR1cm4gb31hc3luYyBmdW5jdGlvbiB6MChlLHQsbil7bGV0IHI9QmUobi5kYXRlS2V5KSxvPVhOKG4sVTAocikpO2F3YWl0IGUucmVwbGFjZU5vdGVDb250ZW50KHQsbyl9YXN5bmMgZnVuY3Rpb24gRjAoZSx0LG49e30pe2xldCByPW4ubWF4Tm90ZXN8fFZOLG89YXdhaXQgWk4oZSksYT1vLnN0YXRlLnNlbGVjdGVkTm90ZXM7aWYoIW4uZm9yY2VSZWZyZXNoJiZhLmxlbmd0aD49TWF0aC5taW4oUjAscikpcmV0dXJuIE8wKGUsYS5zbGljZSgwLHIpKTtsZXQgaT1vLnN0YXRlLHM9YXdhaXQgckQoZSxpKSxsPVRsKFsuLi5pLnN0YWxlQ2FuZGlkYXRlcywuLi5zLnN0YWxlQ2FuZGlkYXRlc10pLHU9aS5oaXN0b3J5QnlEYXksYz1sLmZpbHRlcih3PT4hVzAodSkuaGFzKHcudXVpZCkpO2wubGVuZ3RoPjAmJmMubGVuZ3RoPT09MCYmKHU9e30sYz1sKTtsZXQgZD10RChjLHIsdCkscD1hd2FpdCBPMChlLGQpLHk9bkQocCksaD15Lm1hcCh3PT53LnV1aWQpLmZpbHRlcihCb29sZWFuKTtpPW1pKHsuLi5pLGhpc3RvcnlCeURheTpNMCh1LGkuZGF0ZUtleSxoLHhwKSxzZWxlY3RlZE5vdGVzOnksc3RhbGVDYW5kaWRhdGVzOmwsdmlzaXRlZEJ5RGF5Ok0wKGkudmlzaXRlZEJ5RGF5LGkuZGF0ZUtleSxzLnZpc2l0ZWRVdWlkcyx4cCl9LGkuZGF0ZUtleSk7dHJ5e2F3YWl0IHowKGUsby5ub3RlSGFuZGxlLGkpfWNhdGNoKHcpe18oIltSZWNlbnROb3Rlc10gRmFpbGVkIHRvIHBlcnNpc3QgcmVjZW50LW5vdGUgc3RhdGU6Iix3KX1yZXR1cm4gcH1mdW5jdGlvbiBRTihlKXtsZXQgdD0wO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXQ9KHQrZS5jaGFyQ29kZUF0KG4pKihuKzEpKSUxMDAwMDAzO3JldHVybiB0fWFzeW5jIGZ1bmN0aW9uIE8wKGUsdCl7bGV0IG49QXJyYXkuaXNBcnJheSh0KT90OltdO3JldHVybiBQcm9taXNlLmFsbChuLm1hcChyPT5lLmZpbmROb3RlKHt1dWlkOnIudXVpZH0pLnRoZW4obz0+KHtsYXRlc3RUYXNrVGltZXN0YW1wOnIubGF0ZXN0VGFza1RpbWVzdGFtcCxub3RlSGFuZGxlOm98fHtuYW1lOnIubmFtZSx1dWlkOnIudXVpZH0sdGFza0NvdW50OnIudGFza0NvdW50fSkpLmNhdGNoKCgpPT4oe2xhdGVzdFRhc2tUaW1lc3RhbXA6ci5sYXRlc3RUYXNrVGltZXN0YW1wLG5vdGVIYW5kbGU6e25hbWU6ci5uYW1lLHV1aWQ6ci51dWlkfSx0YXNrQ291bnQ6ci50YXNrQ291bnR9KSkpKX1mdW5jdGlvbiBKTihlKXtsZXQgdD1OdW1iZXIuaXNGaW5pdGUoZSk/TWF0aC5hYnMoTWF0aC5mbG9vcihlKSk6MTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdD0odCo5MzAxKzQ5Mjk3KSUyMzMyODAsdC8yMzMyODB9fWZ1bmN0aW9uIE0wKGUsdCxuLHIpe2xldCBvPU5sKGUsdCksYT1vW3RdfHxbXSxpPShBcnJheS5pc0FycmF5KG4pP246W10pLmZpbHRlcihsPT50eXBlb2YgbD09InN0cmluZyImJmwubGVuZ3RoPjApLHM9Wy4uLm5ldyBTZXQoWy4uLmEsLi4uaV0pXS5zbGljZSgtcik7cmV0dXJuIE5sKHsuLi5vLFt0XTpzfSx0KX1mdW5jdGlvbiBUbChlKXtsZXQgdD1uZXcgU2V0LG49W107Zm9yKGxldCByIG9mIEFycmF5LmlzQXJyYXkoZSk/ZTpbXSl7bGV0IG89cj8udXVpZHx8cj8ubm90ZUhhbmRsZT8udXVpZDtpZighKCFvfHx0LmhhcyhvKSkmJih0LmFkZChvKSxuLnB1c2goe2xhdGVzdFRhc2tUaW1lc3RhbXA6TnVtYmVyKHIubGF0ZXN0VGFza1RpbWVzdGFtcCl8fDAsbmFtZTpyLm5hbWV8fHIubm90ZUhhbmRsZT8ubmFtZXx8IlVudGl0bGVkIix0YXNrQ291bnQ6TnVtYmVyKHIudGFza0NvdW50KXx8MCx1dWlkOm99KSxuLmxlbmd0aD49STApKWJyZWFrfXJldHVybiBufWZ1bmN0aW9uIE5sKGUsdCl7aWYoIWV8fHR5cGVvZiBlIT0ib2JqZWN0Inx8QXJyYXkuaXNBcnJheShlKSlyZXR1cm57fTtsZXQgbj1CZSh0KTtuLnNldERhdGUobi5nZXREYXRlKCktUDArMSk7bGV0IHI9JGUobiksbz17fTtmb3IobGV0W2EsaV1vZiBPYmplY3QuZW50cmllcyhlKSl7aWYoIS9eXGR7NH0tXGR7Mn0tXGR7Mn0kLy50ZXN0KGEpfHxhPHIpY29udGludWU7bGV0IHM9QXJyYXkuaXNBcnJheShpKT9pLmZpbHRlcihsPT50eXBlb2YgbD09InN0cmluZyImJmwubGVuZ3RoPjApOltdO29bYV09Wy4uLm5ldyBTZXQocyldLnNsaWNlKC14cCl9cmV0dXJuIG99ZnVuY3Rpb24gbWkoZSx0KXtsZXQgbj1lJiZ0eXBlb2YgZT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KGUpP2U6e307cmV0dXJue2RhdGVLZXk6dCxoaXN0b3J5QnlEYXk6Tmwobi5oaXN0b3J5QnlEYXksdCksc2NoZW1hVmVyc2lvbjpZTixzZWxlY3RlZE5vdGVzOlRsKG4uc2VsZWN0ZWROb3Rlcyksc3RhbGVDYW5kaWRhdGVzOlRsKG4uc3RhbGVDYW5kaWRhdGVzKSx2aXNpdGVkQnlEYXk6Tmwobi52aXNpdGVkQnlEYXksdCl9fWZ1bmN0aW9uIFUwKGUpe3JldHVybiBlLnRvTG9jYWxlU3RyaW5nKFtdLHtkYXk6Im51bWVyaWMiLG1vbnRoOiJsb25nIix5ZWFyOiJudW1lcmljIn0pfWZ1bmN0aW9uIFhOKGUsdCl7cmV0dXJuW2AjIFJlY2VudCBOb3RlcyBkYXRhIGZvciAke3R9YCwiIiwiVGhpcyBhcmNoaXZlZCBub3RlIGlzIG1haW50YWluZWQgYnkgdGhlIGRhc2hib2FyZCBwbHVnaW4uIiwiIiwiYGBganNvbiIsSlNPTi5zdHJpbmdpZnkoZSxudWxsLDIpLCJgYGAiLCIiXS5qb2luKGAKYCl9ZnVuY3Rpb24gJDAoZSl7cmV0dXJuYERhc2hib2FyZCByZWNlbnQgbm90ZXMgZm9yICR7VTAoZSl9YH1mdW5jdGlvbiBCMChlLHQpe2lmKCFlfHx0eXBlb2YgZSE9InN0cmluZyIpcmV0dXJuIG1pKHt9LHQpO2xldCBuPWUubWF0Y2goL2BgYGpzb25ccyooW1xzXFNdKj8pYGBgL2kpLHI9bj9uWzFdOmU7dHJ5e3JldHVybiBtaShKU09OLnBhcnNlKHIpLHQpfWNhdGNoe3JldHVybiBtaSh7fSx0KX19YXN5bmMgZnVuY3Rpb24gWk4oZSl7bGV0IHQ9bmV3IERhdGUsbj0kZSh0KSxyPSQwKHQpLG89YXdhaXQgZS5maW5kTm90ZSh7bmFtZTpyLHRhZ3M6W1hlXX0pO2lmKG8/LnV1aWQpe2xldCBsPWF3YWl0IGUuZ2V0Tm90ZUNvbnRlbnQoe3V1aWQ6by51dWlkfSk7cmV0dXJue25vdGVIYW5kbGU6byxzdGF0ZTpCMChsLG4pfX1sZXQgYT1hd2FpdCBlRChlLHQpLGk9bWkoey4uLmEsc2VsZWN0ZWROb3RlczpbXX0sbikscz1hd2FpdCBlLmNyZWF0ZU5vdGUocixbWGVdLHthcmNoaXZlOiEwfSk7cmV0dXJuIG89e3V1aWQ6dHlwZW9mIHM9PSJvYmplY3QiP3MudXVpZDpzfSxhd2FpdCB6MChlLG8saSksXyhgW1JlY2VudE5vdGVzXSBDcmVhdGVkIGRhaWx5IG5vdGUgIiR7cn0iIHdpdGggdXVpZCAke28udXVpZH1gKSx7bm90ZUhhbmRsZTpvLHN0YXRlOml9fWFzeW5jIGZ1bmN0aW9uIGVEKGUsdCl7Zm9yKGxldCBuPTE7bjw9UDA7bisrKXtsZXQgcj1uZXcgRGF0ZSh0KTtyLnNldERhdGUoci5nZXREYXRlKCktbik7bGV0IG89YXdhaXQgZS5maW5kTm90ZSh7bmFtZTokMChyKSx0YWdzOltYZV19KTtpZighbz8udXVpZCljb250aW51ZTtsZXQgYT1hd2FpdCBlLmdldE5vdGVDb250ZW50KHt1dWlkOm8udXVpZH0pO3JldHVybiBCMChhLCRlKHQpKX1yZXR1cm57fX1mdW5jdGlvbiB0RChlLHQsbil7bGV0IHI9Sk4obiksbz1bXSxhPVtdO2ZvcihsZXQgaSBvZiBlKXtpZihvLmxlbmd0aD49dClicmVhazthLmxlbmd0aDxHTiYmcigpPC41P2EucHVzaChpKTpvLnB1c2goaSl9cmV0dXJuIG8ubGVuZ3RoPj1SMD9vOlsuLi5vLC4uLmFdLnNsaWNlKDAsdCl9ZnVuY3Rpb24gbkQoZSl7cmV0dXJuIFRsKChBcnJheS5pc0FycmF5KGUpP2U6W10pLm1hcCh0PT4oe2xhdGVzdFRhc2tUaW1lc3RhbXA6dC5sYXRlc3RUYXNrVGltZXN0YW1wLG5hbWU6dC5ub3RlSGFuZGxlPy5uYW1lfHwiVW50aXRsZWQiLHRhc2tDb3VudDp0LnRhc2tDb3VudCx1dWlkOnQubm90ZUhhbmRsZT8udXVpZH0pKSl9YXN5bmMgZnVuY3Rpb24gckQoZSx0KXtsZXQgbj1XMCh0LnZpc2l0ZWRCeURheSkscj1hd2FpdCBxTihlLG4pLG89W10sYT1bXSxpPW5ldyBTZXQodC5zdGFsZUNhbmRpZGF0ZXMubWFwKHM9PnMudXVpZCkpO2ZvcihsZXQgcyBvZiByKWlmKCEoIXM/LnV1aWR8fG4uaGFzKHMudXVpZCkpKXRyeXtsZXQgbD1hd2FpdCBlLmdldE5vdGVUYXNrcyh7dXVpZDpzLnV1aWR9LHtpbmNsdWRlRG9uZTohMX0pO2lmKGEucHVzaChzLnV1aWQpLCFBcnJheS5pc0FycmF5KGwpfHxsLmxlbmd0aD09PTApY29udGludWU7bGV0IHU9bC5yZWR1Y2UoKGMsZCk9PntsZXQgcD1kLnN0YXJ0QXQ/ZC5zdGFydEF0KjFlMzowO3JldHVybiBNYXRoLm1heChjLHApfSwwKTtpZih1IT09MCYmdT49RGF0ZS5ub3coKS1qTiljb250aW51ZTtpZihpLmhhcyhzLnV1aWQpfHwoby5wdXNoKHtsYXRlc3RUYXNrVGltZXN0YW1wOnUsbmFtZTpzLm5hbWUsdGFza0NvdW50OmwubGVuZ3RoLHV1aWQ6cy51dWlkfSksaS5hZGQocy51dWlkKSksdC5zdGFsZUNhbmRpZGF0ZXMubGVuZ3RoK28ubGVuZ3RoPj1JMClicmVha31jYXRjaChsKXtfKGBbUmVjZW50Tm90ZXNdIEZhaWxlZCB0byBmZXRjaCB0YXNrcyBmb3Igbm90ZSAke3MudXVpZH06YCxsKX1yZXR1cm57c3RhbGVDYW5kaWRhdGVzOm8sdmlzaXRlZFV1aWRzOmF9fWZ1bmN0aW9uIFcwKGUpe2xldCB0PW5ldyBTZXQ7Zm9yKGxldCBuIG9mIE9iamVjdC52YWx1ZXMoZXx8e30pKUFycmF5LmlzQXJyYXkobikmJm4uZm9yRWFjaChyPT50LmFkZChyKSk7cmV0dXJuIHR9dmFyIG9EPTMsYUQ9NTtmdW5jdGlvbiBrcCh7YXBwOmUsZ3JpZEhlaWdodFNpemU6dD0xfSl7bGV0IG49VG4uY3JlYXRlRWxlbWVudCxbcixvXT0oMCxUbi51c2VTdGF0ZSkoMCksW2EsaV09KDAsVG4udXNlU3RhdGUpKG51bGwpLFtzLGxdPSgwLFRuLnVzZVN0YXRlKShudWxsKSx1PXQ+PTI/MTA6YUQsYz0oMCxUbi51c2VNZW1vKSgoKT0+TDAociksW3JdKTsoMCxUbi51c2VFZmZlY3QpKCgpPT57bGV0IGg9ITA7cmV0dXJuIGkobnVsbCksbChudWxsKSxGMChlLGMse2ZvcmNlUmVmcmVzaDpyPjAsbWF4Tm90ZXM6dX0pLnRoZW4odz0+e2gmJihpKHcpLF8oIltSZWNlbnROb3Rlc10gc3RhbGVOb3RlczoiLHcsInNlZWQ6IixjLCJyZXNlZWRDb3VudDoiLHIpKX0pLmNhdGNoKHc9PntoJiYoXygiW1JlY2VudE5vdGVzXSBmZXRjaCBlcnJvcjoiLHcpLGwody5tZXNzYWdlfHwiRmFpbGVkIHRvIGxvYWQgbm90ZXMiKSl9KSwoKT0+e2g9ITF9fSxbZSx1LHIsY10pO2xldCBwPW4oImJ1dHRvbiIse2NsYXNzTmFtZToid2lkZ2V0LWhlYWRlci1hY3Rpb24iLHR5cGU6ImJ1dHRvbiIsb25DbGljazooKT0+byhoPT5oKzEpLHRpdGxlOiJTaG93IGEgZGlmZmVyZW50IHNldCBvZiBub3RlcyJ9LCJcdTIxQkIgUmVzZWVkIikseT0oKT0+cz9uKCJwIix7Y2xhc3NOYW1lOiJub3RlLWVycm9yIn0sYEVycm9yOiAke3N9YCk6YT09PW51bGw/bigicCIse2NsYXNzTmFtZToibm90ZS1sb2FkaW5nIn0sIkxvYWRpbmdcdTIwMjYiKTphLmxlbmd0aDxvRD9uKCJwIix7Y2xhc3NOYW1lOiJub3RlLWVtcHR5In0sIk5vIG5vdGVzIHdpdGggc3RhbGUgdGFza3MgZm91bmQuIik6bigidWwiLHtjbGFzc05hbWU6Im5vdGUtbGlzdCJ9LGEubWFwKCh7bm90ZUhhbmRsZTpoLHRhc2tDb3VudDp3fSk9Pm4oImxpIix7a2V5OmgudXVpZCxjbGFzc05hbWU6Im5vdGUtaXRlbSJ9LG4oImJ1dHRvbiIse2NsYXNzTmFtZToibm90ZS1saW5rIix0eXBlOiJidXR0b24iLG9uQ2xpY2s6KCk9PmUubmF2aWdhdGUoYGh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vbm90ZXMvJHtoLnV1aWR9YCksdGl0bGU6YE9wZW4gIiR7aC5uYW1lfHwiVW50aXRsZWQifSJgfSxuKCJzcGFuIix7Y2xhc3NOYW1lOiJub3RlLW5hbWUifSxoLm5hbWV8fCJVbnRpdGxlZCIpLG4oInNwYW4iLHtjbGFzc05hbWU6Im5vdGUtY291bnQifSxgJHt3fSBvcGVuIHRhc2ske3chPT0xPyJzIjoiIn1gKSkpKSk7cmV0dXJuIG4oZmUse2hlYWRlckFjdGlvbnM6cCxpY29uOiJcdXsxRjRERH0iLHRpdGxlOmRlKCJyZWNlbnQtbm90ZXMiKSx3aWRnZXRJZDoicmVjZW50LW5vdGVzIn0seSgpKX12YXIgRGw9eWUobWUoKSk7ZnVuY3Rpb24gU3Aoe2FjdGl2ZVRhc2tEb21haW46ZSxhcHA6dCxkb21haW5zOm4sb25Eb21haW5DaGFuZ2U6cn0pe2xldCBvPURsLmNyZWF0ZUVsZW1lbnQsW2EsaV09KDAsRGwudXNlU3RhdGUpKCExKSxzPWFzeW5jKCk9PntfKCJbVGFza0RvbWFpbnNdIFJlZnJlc2ggdHJpZ2dlcmVkIiksaSghMCk7dHJ5e2xldCBjPWF3YWl0IGh5KHQpO18oIltUYXNrRG9tYWluc10gUmVmcmVzaCByZXN1bHQiLGMpLGMmJnImJnIoYy5kb21haW5zLGMuYWN0aXZlVGFza0RvbWFpbil9Y2F0Y2goYyl7dGhyb3cgXygiW1Rhc2tEb21haW5zXSBSZWZyZXNoIGZhaWxlZCIsYyksY31maW5hbGx5e2koITEpfX0sbD1hc3luYyBjPT57aWYoYz09PWUpcmV0dXJuO2xldCBkPWF3YWl0IG15KHQsYyk7ZCYmciYmcihudWxsLGMsZCl9LHU9YXN5bmMgYz0+e2Muc3RvcFByb3BhZ2F0aW9uKCksYXdhaXQgdC5uYXZpZ2F0ZSgiaHR0cHM6Ly93d3cuYW1wbGVub3RlLmNvbS9ub3Rlcz90YWc9dGFza19jYWxlbmRhciIpfTtyZXR1cm4hbnx8bi5sZW5ndGg9PT0wP28oImRpdiIse2NsYXNzTmFtZToidGFzay1kb21haW5zIHRhc2stZG9tYWlucy0tZW1wdHkifSxvKCJkaXYiLHtjbGFzc05hbWU6InRhc2stZG9tYWlucy1lbXB0eSJ9LCdWaXNpdCAiU2V0dGluZ3MiID4gIlRhc2sgQ2FsZW5kYXIiIHRvIGNyZWF0ZSBhIHRhc2sgZG9tYWluLCBlbmFibGluZyBEYXNoYm9hcmQuJyksbygiYnV0dG9uIix7Y2xhc3NOYW1lOiJ0YXNrLWRvbWFpbnMtcmVmcmVzaCIsb25DbGljazpzLGRpc2FibGVkOmEsdHlwZToiYnV0dG9uIn0sYT8iUmVmcmVzaGluZy4uLiI6Ilx1MjFCQiBSZWZyZXNoIikpOm8oImRpdiIse2NsYXNzTmFtZToidGFzay1kb21haW5zIn0sbygiZGl2Iix7Y2xhc3NOYW1lOiJ0YXNrLWRvbWFpbnMtbGlzdCJ9LG4ubWFwKGM9Pm8oImRpdiIse2tleTpjLnV1aWQsY2xhc3NOYW1lOiJ0YXNrLWRvbWFpbi1pdGVtIisoYy51dWlkPT09ZT8iIGFjdGl2ZSI6IiIpLG9uQ2xpY2s6KCk9PmwoYy51dWlkKX0sbygic3BhbiIse2NsYXNzTmFtZToidGFzay1kb21haW4tbmFtZSJ9LGMubmFtZSkpKSksbygiYnV0dG9uIix7Y2xhc3NOYW1lOiJ0YXNrLWRvbWFpbnMtcmVmcmVzaCIsb25DbGljazpzLGRpc2FibGVkOmF9LGE/IlJlZnJlc2hpbmcuLi4iOiJcdTIxQkIgUmVmcmVzaCBUYXNrIERvbWFpbnMiKSl9dmFyIF9sPXllKG1lKCkpO2Z1bmN0aW9uIEgwKGUpe2xldCB0PSgwLF9sLnVzZVJlZikobnVsbCk7dC5jdXJyZW50PT09bnVsbCYmKHQuY3VycmVudD1wZXJmb3JtYW5jZS5ub3coKSxfKGBbZGFzaGJvYXJkXSBXaWRnZXQgIiR7ZX0iIGxvYWRpbmcuLi5gKSksKDAsX2wudXNlRWZmZWN0KSgoKT0+e3QuY3VycmVudCE9PW51bGwmJihfKGBbZGFzaGJvYXJkXSBXaWRnZXQgIiR7ZX0iIGZpbmlzaGVkIGxvYWRpbmcgaW4gJHsocGVyZm9ybWFuY2Uubm93KCktdC5jdXJyZW50KS50b0ZpeGVkKDEpfW1zYCksdC5jdXJyZW50PW51bGwpfSxbXSl9dmFyIEt0PXllKG1lKCkpO3ZhciBpRD1be3ZhbHVlOi0yLGVtb2ppOiJcdXsxRjYyMn0iLGxhYmVsOiJBd2Z1bCJ9LHt2YWx1ZTotMSxlbW9qaToiXHV7MUY2MUZ9IixsYWJlbDoiQmFkIn0se3ZhbHVlOjAsZW1vamk6Ilx1ezFGNjEwfSIsbGFiZWw6Ik9rYXkifSx7dmFsdWU6MSxlbW9qaToiXHV7MUY2NDJ9IixsYWJlbDoiR29vZCJ9LHt2YWx1ZToyLGVtb2ppOiJcdXsxRjYwNH0iLGxhYmVsOiJHcmVhdCJ9XTtmdW5jdGlvbiBzRChlKXtpZighZXx8ZS5sZW5ndGg8NylyZXR1cm4iIjtsZXQgdD1CZShlWzBdLmRhdGUpLG49QmUoZVs2XS5kYXRlKSxyPW89Pm8udG9Mb2NhbGVEYXRlU3RyaW5nKHZvaWQgMCx7bW9udGg6InNob3J0IixkYXk6Im51bWVyaWMifSk7cmV0dXJuYCR7cih0KX0gXHUyMDEzICR7cihuKX1gfWZ1bmN0aW9uIGowKGUsdCl7bGV0IG49QmUoZSk7cmV0dXJuIG4uc2V0RGF0ZShuLmdldERhdGUoKSt0KjcpLCRlKG4pfWZ1bmN0aW9uIGxEKGUsdCl7bGV0IG49R3QoZSx0KSxyPUd0KG5ldyBEYXRlLHQpO3JldHVybiBuPj1yfWZ1bmN0aW9uIHVEKGUsdCl7cmV0dXJuIUFycmF5LmlzQXJyYXkoZSl8fGUubGVuZ3RoPT09MD9bXTohdHx8dHlwZW9mIHQhPSJvYmplY3QiP2U6ZS5tYXAobj0+e2xldCByPSRlKG4uZGF0ZSksbz1BcnJheS5pc0FycmF5KHRbcl0pP3Rbcl06W10sYT1vLnJlZHVjZSgoaSxzKT0+aSsocy52aWN0b3J5VmFsdWV8fDApLDApO3JldHVybnsuLi5uLHZhbHVlOmEsdGFza0NvdW50Om8ubGVuZ3RofX0pfWZ1bmN0aW9uIGNEKGUsdCxuLHIpe2xldCBvPXB5KGUscik7cmV0dXJuIW58fHR5cGVvZiBuIT0ib2JqZWN0Ij91RCh0LG4pOm8ubWFwKGE9PntsZXQgaT1BcnJheS5pc0FycmF5KG5bYS5kYXRlS2V5XSk/blthLmRhdGVLZXldOltdLHM9aS5yZWR1Y2UoKGwsdSk9PmwrKHUudmljdG9yeVZhbHVlfHwwKSwwKTtyZXR1cm57ZGF5OmEuZGF5LGRhdGU6YS5kYXRlLHZhbHVlOnMsdGFza0NvdW50OmkubGVuZ3RofX0pfWFzeW5jIGZ1bmN0aW9uIGREKGUsdCxuLHIpe2xldCBvPVt0LFN0cmluZyhuKV07YXdhaXQgZS5zZXRTZXR0aW5nKFBvKCJ2aWN0b3J5LXZhbHVlIiksSlNPTi5zdHJpbmdpZnkobykpLHIoITEpfWZ1bmN0aW9uIFYwKGUpe3JldHVybiBlPT1udWxsPyEwOmU9PT0idHJ1ZSJ8fGU9PT0hMH1mdW5jdGlvbiBwRChlLHQsbixyKXt0KGVbMF18fCJ3ZWVrIiksbihWMChlWzFdKSkscighMSl9ZnVuY3Rpb24gZkQoZSx0LG4pe2xldCByPWUuY3VycmVudDtpZighcilyZXR1cm47bGV0IG89ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxhPW4uY2xpZW50WC1vLmxlZnQscz0oby53aWR0aC04MCkvNztmb3IobGV0IGw9MDtsPDc7bCsrKXtsZXQgdT00MCtsKnMsYz11K3M7aWYoYT49dSYmYTxjKXt0KGwpO3JldHVybn19dChudWxsKX1mdW5jdGlvbiBtRChlLHQpe2xldCBuPWUuY3VycmVudDtpZighbilyZXR1cm4gMDtsZXQgbz0obi5vZmZzZXRXaWR0aC04MCkvNztyZXR1cm4gNDArdCpvK28qLjV9ZnVuY3Rpb24gaEQoZSx0LG4scil7bGV0IG89ZS5jdXJyZW50O2lmKCFvKXJldHVybiAwO2xldCBhPW8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscz1vLm9mZnNldEhlaWdodC01MCx1PShuW3RdPy52YWx1ZXx8MCkvcipzKi44NTtyZXR1cm4gYS50b3Arcy11KzEwfWZ1bmN0aW9uIGdEKGUsdCxuKXtpZighbnx8IXRbZV0pcmV0dXJuW107bGV0IHI9JGUodFtlXS5kYXRlKTtyZXR1cm4obltyXXx8W10pLnNsaWNlKCkuc29ydCgobyxhKT0+KGEudmljdG9yeVZhbHVlfHwwKS0oby52aWN0b3J5VmFsdWV8fDApKX1mdW5jdGlvbiB5RChlLHQpe2lmKCFlfHwhQXJyYXkuaXNBcnJheShlKXx8IXQpcmV0dXJuW107bGV0IG49e307Zm9yKGxldCByIG9mIGUpe2lmKCFyfHxyLnRpbWVzdGFtcD09bnVsbCljb250aW51ZTtsZXQgbz1uZXcgRGF0ZShyLnRpbWVzdGFtcCoxZTMpLGE9JGUobyk7KCFuW2FdfHxyLnRpbWVzdGFtcD5uW2FdLnRpbWVzdGFtcCkmJihuW2FdPXIpfXJldHVybiB0Lm1hcChyPT57bGV0IG89JGUoci5kYXRlKTtyZXR1cm4gbltvXXx8bnVsbH0pfWZ1bmN0aW9uIHZEKGUsdCxuKXtpZighdHx8IXRbZV0pcmV0dXJuIG51bGw7aWYobiYmbltlXSl7bGV0IG89bmV3IERhdGU7aWYoby5zZXRIb3VycygyMyw1OSw1OSw5OTkpLEJlKG5bZV0uZGF0ZSk+bylyZXR1cm4gbnVsbH1sZXQgcj10W2VdLnJhdGluZztyZXR1cm4gaUQuZmluZChvPT5vLnZhbHVlPT09cil8fG51bGx9ZnVuY3Rpb24gd0QoZSx0LG4scixvLGEpe3QuZm9yRWFjaCgoaSxzKT0+e2xldCBsPWkudmFsdWUvbipvKi44NSx1PTQwK3MqcityKi4xNSxjPW8tbCsxMDtlLmZpbGxTdHlsZT1pLnZhbHVlPjA/IiM2MzY2ZjEiOiIjZTVlN2ViIixlLmJlZ2luUGF0aCgpLGUucm91bmRSZWN0KHUsYyxyKi43LGwsWzQsNCwwLDBdKSxlLmZpbGwoKSxlLmZpbGxTdHlsZT0iIzZiNzI4MCIsZS5mb250PSIxMXB4IHN5c3RlbS11aSIsZS50ZXh0QWxpZ249ImNlbnRlciIsZS5maWxsVGV4dChpLmRheSx1K3IqLjM1LGEtMTUpO2xldCBwPUJlKGkuZGF0ZSkudG9Mb2NhbGVEYXRlU3RyaW5nKHZvaWQgMCx7bW9udGg6InNob3J0IixkYXk6Im51bWVyaWMifSk7ZS5maWxsU3R5bGU9IiM5Y2EzYWYiLGUuZm9udD0iOXB4IHN5c3RlbS11aSIsZS5maWxsVGV4dChwLHUrciouMzUsYS0zKSxpLnZhbHVlPjAmJihlLmZpbGxTdHlsZT0iI2ZmZmZmZiIsZS5mb250PSJib2xkIDEwcHggc3lzdGVtLXVpIixlLmZpbGxUZXh0KGJEKGkudmFsdWUpLHUrciouMzUsYysxNCkpfSl9ZnVuY3Rpb24gYkQoZSl7cmV0dXJuKE1hdGgucm91bmQoKGV8fDApKjEwKS8xMCkudG9GaXhlZCgxKX1mdW5jdGlvbiB4RChlLHQsbixyLG8pe2xldCBhPW5ldyBEYXRlO2Euc2V0SG91cnMoMjMsNTksNTksOTk5KTtsZXQgaT1bXTtpZih0LmZvckVhY2goKHMsbCk9PntpZighc3x8IW5bbF18fEJlKG5bbF0uZGF0ZSk+YSlyZXR1cm47bGV0IGM9by0ocy5yYXRpbmcrMikvNCpvKzEwLGQ9NDArbCpyK3IqLjU7aS5wdXNoKHtpbmRleDpsLHg6ZCx5OmN9KX0pLGkubGVuZ3RoIT09MCl7ZS5zdHJva2VTdHlsZT0iI2Y1OWUwYiIsZS5saW5lV2lkdGg9Mjtmb3IobGV0IHM9MTtzPGkubGVuZ3RoO3MrKyl7bGV0IGw9aVtzLTFdLHU9aVtzXTtlLnNldExpbmVEYXNoKHUuaW5kZXg9PT1sLmluZGV4KzE/W106WzMsNF0pLGUuYmVnaW5QYXRoKCksZS5tb3ZlVG8obC54LGwueSksZS5saW5lVG8odS54LHUueSksZS5zdHJva2UoKX1lLnNldExpbmVEYXNoKFtdKSxpLmZvckVhY2goKHt4OnMseTpsfSk9PntlLmZpbGxTdHlsZT0iI2Y1OWUwYiIsZS5iZWdpblBhdGgoKSxlLmFyYyhzLGwsMywwLE1hdGguUEkqMiksZS5maWxsKCl9KX19ZnVuY3Rpb24ga0QoZSx0LG4scixvKXtsZXQgYT1lLmN1cnJlbnQ7aWYoIWEpcmV0dXJuO2xldCBpPWEuZ2V0Q29udGV4dCgiMmQiKSxzPWEud2lkdGg9YS5vZmZzZXRXaWR0aCoyLGw9YS5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQqMjtpLnNjYWxlKDIsMik7bGV0IHU9cy8yLGM9bC8yLGQ9KHUtODApLzcscD1jLTUwO2kuY2xlYXJSZWN0KDAsMCx1LGMpLHdEKGksdCxuLGQscCxjKSxvJiZyJiZyLnNvbWUoeT0+eSE9PW51bGwpJiZ4RChpLHIsdCxkLHApfWZ1bmN0aW9uIFNEKGUsdCxuLHIpe2xldCBvPWdEKGUsdCxuKSxhPXZEKGUscix0KSxzPVtgPGRpdiBjbGFzcz0iZGFzaGJvYXJkLXRvb2x0aXAtaGVhZGVyIj4ke3RbZV0/ZnkodFtlXS5kYXRlKToiIn08L2Rpdj5gXTtpZihhJiZzLnB1c2goYDxkaXYgY2xhc3M9ImRhc2hib2FyZC10b29sdGlwLXNlY3Rpb24iPiR7YS5lbW9qaX0gJHthLmxhYmVsfTwvZGl2PmApLG8ubGVuZ3RoPjApZm9yKGxldCBsIG9mIG8pcy5wdXNoKGA8ZGl2IGNsYXNzPSJkYXNoYm9hcmQtdG9vbHRpcC1yb3ciPjxzcGFuIGNsYXNzPSJkYXNoYm9hcmQtdG9vbHRpcC1yb3ctbGFiZWwiPiR7R28obC5jb250ZW50KX08L3NwYW4+PHNwYW4gY2xhc3M9ImRhc2hib2FyZC10b29sdGlwLXJvdy12YWx1ZSI+JHtsLnZpY3RvcnlWYWx1ZXx8MH0gcHRzPC9zcGFuPjwvZGl2PmApO2Vsc2Ugcy5wdXNoKCc8ZGl2IGNsYXNzPSJkYXNoYm9hcmQtdG9vbHRpcC1lbXB0eSI+Tm8gY29tcGxldGVkIHRhc2tzPC9kaXY+Jyk7cmV0dXJuIHMuam9pbigiIil9ZnVuY3Rpb24gRUQoZSx0LG4pe3JldHVyblsid2VlayIsIm1vbnRoIiwiMzBkYXlzIl0ubWFwKHI9PmUoImxhYmVsIix7a2V5OnJ9LGUoImlucHV0Iix7dHlwZToicmFkaW8iLG5hbWU6InZ2LXRpbWUtcmFuZ2UiLHZhbHVlOnIsY2hlY2tlZDp0PT09cixvbkNoYW5nZTpuLmJpbmQobnVsbCxyKX0pLHI9PT0id2VlayI/IlRoaXMgd2VlayI6cj09PSJtb250aCI/IlRoaXMgbW9udGgiOiJMYXN0IDMwIGRheXMiKSl9ZnVuY3Rpb24gRXAoe2FwcDplLGNvbXBsZXRlZFRhc2tzQnlEYXRlOnQsZGFpbHlWYWx1ZXM6bixtb29kUmF0aW5nczpyLG9uUmVmZXJlbmNlRGF0ZUNoYW5nZTpvLHJlZmVyZW5jZURhdGU6YSx3ZWVrRm9ybWF0Omksd2Vla2x5VG90YWw6c30pe2xldCBsPUt0LmNyZWF0ZUVsZW1lbnQsdT0oMCxLdC51c2VSZWYpKG51bGwpLGM9bmwoaSksZD1jRChhLG4sdCxjKSxwPU1hdGgubWF4KC4uLmQubWFwKFc9PlcudmFsdWUpLDEpLHk9ZC5yZWR1Y2UoKFcsTSk9PlcrKE0udmFsdWV8fDApLDApLGg9TWF0aC5yb3VuZCh5fHxzfHwwKSx3PXlEKHIsZCksW2IsZ109KDAsS3QudXNlU3RhdGUpKCExKSxbbSx2XT0oMCxLdC51c2VTdGF0ZSkobnVsbCksZj1XcyhlLCJ2aWN0b3J5LXZhbHVlIiksW0Usa109KDAsS3QudXNlU3RhdGUpKGZbMF18fCJ3ZWVrIiksW04sRF09KDAsS3QudXNlU3RhdGUpKFYwKGZbMV0pKSxPPWcuYmluZChudWxsLCEwKSxUPWRELmJpbmQobnVsbCxlLEUsTixnKSx6PXBELmJpbmQobnVsbCxmLGssRCxnKSxQPXNEKGQpLEM9ZWkoe2ludGVyYWN0aXZlOiEwfSksTD1XPT57Qy5jYW5jZWxTY2hlZHVsZWRIaWRlKCksZkQodSx2LFcpfSwkPSgpPT5DLnNjaGVkdWxlSGlkZSgzMDAsKCk9PnYobnVsbCkpO3JldHVybigwLEt0LnVzZUVmZmVjdCkoKCk9PntrRCh1LGQscCx3LE4pfSxbZCxwLHcsTl0pLCgwLEt0LnVzZUVmZmVjdCkoKCk9PntpZihtPT09bnVsbCl7Qy5oaWRlKCk7cmV0dXJufWxldCBXPXUuY3VycmVudDtpZighVylyZXR1cm47bGV0IE09Vy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxLPW1EKHUsbSksb2U9TS5sZWZ0K0ssUz1oRCh1LG0sZCxwKSx4PVMsUj13aW5kb3cuaW5uZXJIZWlnaHQtTS5ib3R0b20sQj1TRChtLGQsdCx3KTtSPng/Qy5zaG93KEIsb2UsTS5ib3R0b20se3BsYWNlbWVudDoiYm90dG9tIixiZWxvd0NoYXJ0OiEwfSk6Qy5zaG93KEIsb2UsUyx7cGxhY2VtZW50OiJ0b3AifSl9LFttXSksbChmZSx7dGl0bGU6ZGUoInZpY3RvcnktdmFsdWUiKSxpY29uOiJcdXsxRjNDNn0iLHdpZGdldElkOiJ2aWN0b3J5LXZhbHVlIixjb25maWd1cmFibGU6ITAsb25Db25maWd1cmU6T30sYj9sKFhyLHt0aXRsZToiQ29uZmlndXJlIFZpY3RvcnkgVmFsdWUiLG9uU3VibWl0OlQsb25DYW5jZWw6en0sbCgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctZmllbGQifSxsKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1maWVsZC1sYWJlbCJ9LCJUaW1lIHJhbmdlIiksRUQobCxFLGspKSxsKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1maWVsZCJ9LGwoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWZpZWxkLWxhYmVsIn0sIk1vb2Qgb3ZlcmxheSIpLGwoImxhYmVsIixudWxsLGwoImlucHV0Iix7dHlwZToiY2hlY2tib3giLGNoZWNrZWQ6TixvbkNoYW5nZTpXPT5EKFcudGFyZ2V0LmNoZWNrZWQpfSksIlNob3cgbW9vZCBvdmVybGF5IikpKTpudWxsLGwoImRpdiIse2NsYXNzTmFtZToidnYtaGVhZGVyIn0sbCgic3BhbiIse2NsYXNzTmFtZToidnYtdG90YWwifSxoKSxsKCJzcGFuIix7Y2xhc3NOYW1lOiJ2di1sYWJlbCJ9LGBwb2ludHMgJHtQfWApKSxsKCJkaXYiLHtjbGFzc05hbWU6InZ2LWNoYXJ0LWNvbnRhaW5lciJ9LGwoImJ1dHRvbiIse2NsYXNzTmFtZToidnYtbmF2LWFycm93Iix0eXBlOiJidXR0b24iLG9uQ2xpY2s6KCk9Pm8mJm8oajAoYSwtMSkpLHRpdGxlOiJQcmV2aW91cyB3ZWVrIiwiYXJpYS1sYWJlbCI6IlByZXZpb3VzIHdlZWsifSwiXHUyMDM5IiksbCgiZGl2Iix7Y2xhc3NOYW1lOiJ2di1jaGFydC13cmFwIn0sbCgiY2FudmFzIix7cmVmOnUsY2xhc3NOYW1lOiJ2di1jaGFydCIsb25Nb3VzZU1vdmU6TCxvbk1vdXNlTGVhdmU6JH0pKSxsKCJidXR0b24iLHtjbGFzc05hbWU6InZ2LW5hdi1hcnJvdyIsdHlwZToiYnV0dG9uIixkaXNhYmxlZDpsRChhLGMpLG9uQ2xpY2s6KCk9Pm8mJm8oajAoYSwxKSksdGl0bGU6Ik5leHQgd2VlayIsImFyaWEtbGFiZWwiOiJOZXh0IHdlZWsifSwiXHUyMDNBIikpKX1mdW5jdGlvbiBURChlKXtsZXQgdD1OdW1iZXIoZT8uZ3JpZFdpZHRoU2l6ZSk+MD9OdW1iZXIoZS5ncmlkV2lkdGhTaXplKToxLG49TnVtYmVyKGU/LmdyaWRIZWlnaHRTaXplKT4wP051bWJlcihlLmdyaWRIZWlnaHRTaXplKToxO3JldHVybmBncmlkLWNlbGwgaG9yaXpvbnRhbC0ke3R9LWNlbGwgdmVydGljYWwtJHtufS1jZWxsYH1mdW5jdGlvbiBORChlLHQpe2xldCBuPWU/LndpZGdldElkO3JldHVybntjbGFzc05hbWU6W1REKGUpLHQ/ImdyaWQtY2VsbC0tZHJhZy1hY3RpdmUiOiIiLHQmJnQ9PT1uPyJncmlkLWNlbGwtLWRyYWdnaW5nLXJlYWR5IjoiIix0JiZ0IT09bj8iZ3JpZC1jZWxsLS1kcmFnLXNoaWZ0IjoiIl0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oIiAiKSwiZGF0YS13aWRnZXQtaWQiOm59fXZhciBUcD1jbGFzcyBleHRlbmRzIHJlLkNvbXBvbmVudHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLnN0YXRlPXtoYXNFcnJvcjohMSxlcnJvcjpudWxsfX1zdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKHQpe3JldHVybntoYXNFcnJvcjohMCxlcnJvcjp0fX1jb21wb25lbnREaWRDYXRjaCh0LG4pe18oYFtXaWRnZXRFcnJvckJvdW5kYXJ5XSBXaWRnZXQgIiR7dGhpcy5wcm9wcy53aWRnZXRJZH0iIGNyYXNoZWQ6YCx0LG4pfXJlbmRlcigpe3JldHVybiB0aGlzLnN0YXRlLmhhc0Vycm9yPygwLHJlLmNyZWF0ZUVsZW1lbnQpKCJkaXYiLHtjbGFzc05hbWU6IndpZGdldC1lcnJvci1mYWxsYmFjayJ9LCgwLHJlLmNyZWF0ZUVsZW1lbnQpKCJwIix7Y2xhc3NOYW1lOiJ3aWRnZXQtZXJyb3ItZmFsbGJhY2stdGl0bGUifSxgXHUyNkEwICR7dGhpcy5wcm9wcy53aWRnZXRJZH1gKSwoMCxyZS5jcmVhdGVFbGVtZW50KSgicCIse2NsYXNzTmFtZToid2lkZ2V0LWVycm9yLWZhbGxiYWNrLW1lc3NhZ2UifSx0aGlzLnN0YXRlLmVycm9yPy5tZXNzYWdlfHwiQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCIpLCgwLHJlLmNyZWF0ZUVsZW1lbnQpKCJidXR0b24iLHtjbGFzc05hbWU6IndpZGdldC1lcnJvci1mYWxsYmFjay1yZXRyeSIsb25DbGljazooKT0+dGhpcy5zZXRTdGF0ZSh7aGFzRXJyb3I6ITEsZXJyb3I6bnVsbH0pfSwiUmV0cnkiKSk6dGhpcy5wcm9wcy5jaGlsZHJlbn19O2Z1bmN0aW9uIHBuKGUsdCxuKXtyZXR1cm4oMCxyZS5tZW1vKShmdW5jdGlvbihvKXtIMChlKTtsZXR7Y29uZmlnOmEsZHJhZ2dpbmdXaWRnZXRJZDppfT1vO3JldHVybigwLHJlLmNyZWF0ZUVsZW1lbnQpKCJkaXYiLE5EKGEsaSksKDAscmUuY3JlYXRlRWxlbWVudCkoVHAse3dpZGdldElkOmV9LCgwLHJlLmNyZWF0ZUVsZW1lbnQpKHQsbihvKSkpKX0pfWZ1bmN0aW9uIEFsKC4uLmUpe3JldHVybiB0PT57bGV0IG49e307Zm9yKGxldCByIG9mIGUpbltyXT10W3JdO3JldHVybiBufX12YXIgREQ9cG4oImFnZW5kYSIsSmQsKHthZ2VuZGFUYXNrczplLGFwcDp0LGNhbGVuZGFyRXZlbnRzOm4sY2FsZW5kYXJFdmVudHNMb2FkZWQ6cixjdXJyZW50RGF0ZTpvLHNlbGVjdGVkRGF0ZTphLHRpbWVGb3JtYXQ6aX0pPT4oe2FwcDp0LGNhbGVuZGFyRXZlbnRzOnI/bjpudWxsLGN1cnJlbnREYXRlOm8sc2VsZWN0ZWREYXRlOmEsdGFza3M6ZSx0aW1lRm9ybWF0Oml9KSksX0Q9cG4oImRheS1za2V0Y2giLGNwLCh7YWdlbmRhVGFza3M6ZSxhcHA6dCxjYWxlbmRhckV2ZW50czpuLGNhbGVuZGFyRXZlbnRzTG9hZGVkOnIsY3VycmVudERhdGU6byx0aW1lRm9ybWF0OmF9KT0+KHthZ2VuZGFUYXNrczplLGFwcDp0LGNhbGVuZGFyRXZlbnRzOnI/bjpudWxsLGN1cnJlbnREYXRlOm8sdGltZUZvcm1hdDphfSkpLEFEPXBuKCJkcmVhbS10YXNrIix1cCwoe2FwcDplLGNvbmZpZzp0LG9uT3BlblNldHRpbmdzOm4scHJvdmlkZXJBcGlLZXk6cixwcm92aWRlckVtOm99KT0+KHthcHA6ZSxncmlkSGVpZ2h0U2l6ZTpOdW1iZXIodD8uZ3JpZEhlaWdodFNpemUpfHwxLGdyaWRXaWR0aFNpemU6TnVtYmVyKHQ/LmdyaWRXaWR0aFNpemUpfHwyLG9uT3BlblNldHRpbmdzOm4scHJvdmlkZXJBcGlLZXk6cixwcm92aWRlckVtOm99KSksQ0Q9cG4oImNhbGVuZGFyIixYZCwoe2FwcDplLGNvbXBsZXRlZFRhc2tzQnlEYXRlOnQsY29uZmlnOm4sY3VycmVudERhdGU6cixvbkRhdGVTZWxlY3Q6byxvbk9wZW5TZXR0aW5nczphLG9wZW5UYXNrczppLHNlbGVjdGVkRGF0ZTpzLHdlZWtGb3JtYXQ6bH0pPT4oe2FwcDplLGNvbXBsZXRlZFRhc2tzQnlEYXRlOnQsY3VycmVudERhdGU6cixncmlkSGVpZ2h0U2l6ZTpuPy5ncmlkSGVpZ2h0U2l6ZSxncmlkV2lkdGhTaXplOm4/LmdyaWRXaWR0aFNpemUsb25EYXRlU2VsZWN0Om8sb25PcGVuU2V0dGluZ3M6YSxvcGVuVGFza3M6aSxzZWxlY3RlZERhdGU6cyx3ZWVrRm9ybWF0Omx9KSksT0Q9cG4oIm1vb2QiLGdwLEFsKCJhcHAiLCJtb29kUmF0aW5ncyIsIm9uTW9vZFJlY29yZGVkIikpLE1EPXBuKCJwZWFrLWhvdXJzIix2cCxBbCgiYXBwIiwiY3VycmVudERhdGUiLCJzZWxlY3RlZERhdGUiLCJ0aW1lRm9ybWF0IikpLFJEPXBuKCJwbGFubmluZyIscWQsKHthcHA6ZSxjb25maWc6dCxxdWFydGVybHlQbGFuczpufSk9Pih7YXBwOmUsZ3JpZEhlaWdodFNpemU6TnVtYmVyKHQ/LmdyaWRIZWlnaHRTaXplKXx8MSxxdWFydGVybHlQbGFuczpufSkpLElEPXBuKCJxdWljay1hY3Rpb25zIixicCxBbCgiYXBwIikpLFBEPXBuKCJxdW90ZXMiLHdwLCh7YXBwOmUsY29uZmlnOnQscHJvdmlkZXJBcGlLZXk6bn0pPT4oe2FwcDplLGdyaWRIZWlnaHRTaXplOk51bWJlcih0Py5ncmlkSGVpZ2h0U2l6ZSl8fDEscGxhbkNvbnRlbnQ6bnVsbCxwcm92aWRlckFwaUtleTpuLHF1b3RlczpudWxsfSkpLExEPXBuKCJyZWNlbnQtbm90ZXMiLGtwLCh7YXBwOmUsY29uZmlnOnR9KT0+KHthcHA6ZSxncmlkSGVpZ2h0U2l6ZTpOdW1iZXIodD8uZ3JpZEhlaWdodFNpemUpfHwxfSkpLHpEPXBuKCJ2aWN0b3J5LXZhbHVlIixFcCxBbCgiYXBwIiwiY29tcGxldGVkVGFza3NCeURhdGUiLCJkYWlseVZhbHVlcyIsIm1vb2RSYXRpbmdzIiwib25SZWZlcmVuY2VEYXRlQ2hhbmdlIiwicmVmZXJlbmNlRGF0ZSIsIndlZWtGb3JtYXQiLCJ3ZWVrbHlUb3RhbCIpKSxGRD17YWdlbmRhOkRELGNhbGVuZGFyOkNELG1vb2Q6T0QscGxhbm5pbmc6UkQsInF1aWNrLWFjdGlvbnMiOklELHF1b3RlczpQRCwicmVjZW50LW5vdGVzIjpMRCwidmljdG9yeS12YWx1ZSI6ekQsImRyZWFtLXRhc2siOkFELCJwZWFrLWhvdXJzIjpNRCwiZGF5LXNrZXRjaCI6X0R9O2Z1bmN0aW9uIFVEKGUse2luaXREYXRhRnJlc2hSZWY6dCxpbml0aWFsaXplRG9tYWluVGFza3M6bixzZXRDb25maWdQYXJhbXM6cixzZXRDdXJyZW50RGF0ZTpvLHNldERhaWx5VmljdG9yeVZhbHVlczphLHNldE1vb2RSYXRpbmdzOmksc2V0UGx1Z2luTm90ZVVVSUQ6cyxzZXRRdWFydGVybHlQbGFuczpsLHNldFdlZWtseVZpY3RvcnlWYWx1ZTp1fSl7dGQoZS5zZXR0aW5ncz8uW1ouQ09OU09MRV9MT0dHSU5HXSksXygiSW5pdCByZXR1cm5zIixlLCJpbmNsdWRpbmcgbW9vZFJhdGluZ3MiLGUubW9vZFJhdGluZ3MpLG4oZSksaShlLm1vb2RSYXRpbmdzKSxsKGUucXVhcnRlcmx5UGxhbnMpLHIoZS5zZXR0aW5ncyksYShlLmRhaWx5VmljdG9yeVZhbHVlcyksdShlLndlZWtseVZpY3RvcnlWYWx1ZSksbyhlLmN1cnJlbnREYXRlKSxlLnBsdWdpbk5vdGVVVUlEJiZzKGUucGx1Z2luTm90ZVVVSUQpLHQuY3VycmVudD0hMH1mdW5jdGlvbiBHMChlKXtsZXQgdD1uZXcgRGF0ZSxuPUd0KHQsZSk7cmV0dXJuIHQuZ2V0VGltZSgpLW4uZ2V0VGltZSgpPDMqMjQqNjAqNjAqMWUzfWZ1bmN0aW9uICREKGUsdCl7bGV0IG49bmV3IE1hcDtmb3IobGV0IHIgb2ZbLi4uZXx8W10sLi4udHx8W11dKXtpZighcnx8ci50aW1lc3RhbXA9PW51bGwpY29udGludWU7bGV0IG89ci51dWlkfHxgJHtyLnRpbWVzdGFtcH06JHtyLnJhdGluZ306JHtyLm5vdGV8fCIifWA7bi5zZXQobyxyKX1yZXR1cm4gQXJyYXkuZnJvbShuLnZhbHVlcygpKS5zb3J0KChyLG8pPT4oci50aW1lc3RhbXB8fDApLShvLnRpbWVzdGFtcHx8MCkpfWFzeW5jIGZ1bmN0aW9uIEJEKGUsdCxuLHIpe2xldCBvPUd0KHQscik7RzAocikmJihvPW5ldyBEYXRlKG8pLG8uc2V0RGF0ZShvLmdldERhdGUoKS03KSk7bGV0IGE9TWF0aC5mbG9vcihvLmdldFRpbWUoKS8xZTMpO3RyeXtsZXQgaT1hd2FpdCBlLmdldE1vb2RSYXRpbmdzKGEpO0FycmF5LmlzQXJyYXkoaSkmJm4ocz0+JEQocyxpKSl9Y2F0Y2goaSl7XygiZmV0Y2hNb29kUmF0aW5nczogZmFpbGVkIHRvIGxvYWQgbW9vZCByYXRpbmdzIixpKX19ZnVuY3Rpb24gV0QoZSx0LG4scixvLGEpe2UocixvLGEpLGEmJih0KGEuZGFpbHlWaWN0b3J5VmFsdWVzKSxuKGEud2Vla2x5VmljdG9yeVZhbHVlKSl9YXN5bmMgZnVuY3Rpb24gSEQoZSx0LG4scixvLHtpc1Jlc2V0OmEsc2l6aW5nOml9PXt9KXtsZXQgcz1BcnJheS5pc0FycmF5KHQ/LltaLkRBU0hCT0FSRF9DT01QT05FTlRTXSk/dFtaLkRBU0hCT0FSRF9DT01QT05FTlRTXTpMbyxsPXt9O2F8fHMuZm9yRWFjaChjPT57bFtjLndpZGdldElkXT1jfSk7bGV0IHU9by5tYXAoYz0+e2xldCBkPWxbY10scD1ibi5maW5kKGg9Pmgud2lkZ2V0SWQ9PT1jKSx5PWk/LltjXTtyZXR1cm57d2lkZ2V0SWQ6YyxncmlkV2lkdGhTaXplOnk/LmdyaWRXaWR0aFNpemU/P2Q/LmdyaWRXaWR0aFNpemU/P3A/LmRlZmF1bHRHcmlkV2lkdGhTaXplPz8xLGdyaWRIZWlnaHRTaXplOnk/LmdyaWRIZWlnaHRTaXplPz9kPy5ncmlkSGVpZ2h0U2l6ZT8/MSxzZXR0aW5nczpkPy5zZXR0aW5nc3x8e319fSk7YXdhaXQgZS5zZXRTZXR0aW5nKFouREFTSEJPQVJEX0NPTVBPTkVOVFMsSlNPTi5zdHJpbmdpZnkodSkpLG4oYz0+KHsuLi5jLFtaLkRBU0hCT0FSRF9DT01QT05FTlRTXTp1fSkpLHIocm4uREVGQVVMVCl9YXN5bmMgZnVuY3Rpb24gakQoZSx0LG4scixvLGEse2FwaUtleTppLGFwaUtleVByb3ZpZGVyOnMsYmFja2dyb3VuZEltYWdlVXJsOmwsYmFja2dyb3VuZE1vZGU6dSxsbG1Qcm92aWRlcjpjLHRpbWVGb3JtYXQ6ZCx3ZWVrRm9ybWF0OnB9KXtfKCJbZGFzaGJvYXJkXSBoYW5kbGVTZXR0aW5nc1NhdmUgY2FsbGVkIHdpdGg6Iix7bGxtUHJvdmlkZXI6YyxhcGlLZXlQcm92aWRlcjpzLGJhY2tncm91bmRNb2RlOnUsYmFja2dyb3VuZEltYWdlVXJsOmwhPW51bGw/IihzZXQpIjoiKHVuY2hhbmdlZCkiLHRpbWVGb3JtYXQ6ZCx3ZWVrRm9ybWF0OnB9KTtsZXQgeT1vbihzfHxjKSxoPVtlLnNldFNldHRpbmcoWi5MTE1fUFJPVklERVJfTU9ERUwsYyksZS5zZXRTZXR0aW5nKFouQkFDS0dST1VORF9JTUFHRV9VUkwsbHx8IiIpXTt5JiZpJiZoLnB1c2goZS5zZXRTZXR0aW5nKHksaSkpLGwmJnUmJmgucHVzaChlLnNldFNldHRpbmcoWi5CQUNLR1JPVU5EX0lNQUdFX01PREUsdSkpLHQuY3VycmVudCYmKGR8fHApJiZoLnB1c2godC5jdXJyZW50LnNhdmUoe3RpbWVGb3JtYXQ6ZCx3ZWVrRm9ybWF0OnB9KSk7dHJ5e2F3YWl0IFByb21pc2UuYWxsKGgpLF8oIltkYXNoYm9hcmRdIHNldHRpbmdzIHNhdmUgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSIpfWNhdGNoKGIpe18oIltkYXNoYm9hcmRdIHNldHRpbmdzIHNhdmUgRkFJTEVEOiIsYil9ZS5zZXR0aW5nc1taLkxMTV9QUk9WSURFUl9NT0RFTF09Yyx5JiYoZS5zZXR0aW5nc1t5XT1pKTtsZXQgdz17W1ouTExNX1BST1ZJREVSX01PREVMXTpjLFtaLkJBQ0tHUk9VTkRfSU1BR0VfVVJMXTpsfHwiIixbWi5CQUNLR1JPVU5EX0lNQUdFX01PREVdOmw/dXx8ImNvdmVyIjoiIn07eSYmKHdbeV09aSksbihiPT4oey4uLmIsLi4ud30pKSxkJiZvKGQpLHAmJmEocCkscihybi5ERUZBVUxUKX1mdW5jdGlvbiBWRChlLHQpe2Uobj0+Wy4uLm58fFtdLHRdKX1mdW5jdGlvbiBOcCh7YXBwOmV9KXtsZXQgdD1yZS5jcmVhdGVFbGVtZW50LHthY3RpdmVUYXNrRG9tYWluOm4sYnVpbGRBZ2VuZGFUYXNrc0J5RGF0ZTpyLGluaXRpYWxpemVEb21haW5UYXNrczpvLG9uRG9tYWluQ2hhbmdlOmEsb3BlblRhc2tzOmksdGFza0RvbWFpbnM6c309ZnAoKSx7Y29tcGxldGVkVGFza3NCeURhdGU6bCxmZXRjaENvbXBsZXRlZFRhc2tzOnV9PWRwKGUpLHtjYWxlbmRhckV2ZW50czpjLGNhbGVuZGFyRXZlbnRzTG9hZGVkOmR9PW1wKGUsbj8udXVpZCksW3AseV09KDAscmUudXNlU3RhdGUpKG51bGwpLFtoLHddPSgwLHJlLnVzZVN0YXRlKShudWxsKSxbYixnXT0oMCxyZS51c2VTdGF0ZSkobnVsbCksW20sdl09KDAscmUudXNlU3RhdGUpKG51bGwpLFtmLEVdPSgwLHJlLnVzZVN0YXRlKShybi5ERUZBVUxUKSxbayxOXT0oMCxyZS51c2VTdGF0ZSkobnVsbCksW0QsT109KDAscmUudXNlU3RhdGUpKG51bGwpLFtULHpdPSgwLHJlLnVzZVN0YXRlKShudWxsKSxbUCxDXT0oMCxyZS51c2VTdGF0ZSkobnVsbCksW0wsJF09KDAscmUudXNlU3RhdGUpKCJtZXJpZGlhbiIpLFtXLE1dPSgwLHJlLnVzZVN0YXRlKSgic3VuZGF5IiksW0ssb2VdPSgwLHJlLnVzZVN0YXRlKShudWxsKSxTPSgwLHJlLnVzZVJlZikobnVsbCkseD0oMCxyZS51c2VSZWYpKCExKSxSPW5sKFcpOygwLHJlLnVzZUVmZmVjdCkoKCk9PntlLmluaXQoKS50aGVuKGFzeW5jIFg9PntpZihYPy5lcnJvcil2KFguZXJyb3IpO2Vsc2V7WD8uc2V0dGluZ3MmJihlLnNldHRpbmdzPVguc2V0dGluZ3MpLFVEKFgse2luaXREYXRhRnJlc2hSZWY6eCxpbml0aWFsaXplRG9tYWluVGFza3M6byxzZXRDb25maWdQYXJhbXM6eSxzZXRDdXJyZW50RGF0ZTp3LHNldERhaWx5VmljdG9yeVZhbHVlczpnLHNldE1vb2RSYXRpbmdzOk4sc2V0UGx1Z2luTm90ZVVVSUQ6TyxzZXRRdWFydGVybHlQbGFuczp6LHNldFdlZWtseVZpY3RvcnlWYWx1ZTpvZX0pLFMuY3VycmVudD1uZXcgbGkoZSk7bGV0e3RpbWVGb3JtYXQ6TmUsd2Vla0Zvcm1hdDp3ZX09YXdhaXQgUy5jdXJyZW50LmxvYWQoKTtOZSYmJChOZSksd2UmJk0od2UpfX0pLmNhdGNoKFg9PnYoWC5tZXNzYWdlKSl9LFtdKTtsZXQgQj0oMCxyZS51c2VNZW1vKSgoKT0+e2lmKFApcmV0dXJuIFA7aWYoIWgpcmV0dXJuIG51bGw7aWYoRzAoUikpe2xldCBYPUd0KGgsUiksTmU9bmV3IERhdGUoWCk7cmV0dXJuIE5lLnNldERhdGUoTmUuZ2V0RGF0ZSgpLTEpLCRlKE5lKX1yZXR1cm4gaH0sW2gsUCxSXSksSD0oMCxyZS51c2VDYWxsYmFjaykoWD0+QkQoZSxYLE4sUiksW2UsUl0pOygwLHJlLnVzZUVmZmVjdCkoKCk9PntsZXQgWD1QfHxoO1gmJih4LmN1cnJlbnQ/eC5jdXJyZW50PSExOkgoWCksbiYmKHUoWCxuKSxCJiZCIT09WCYmdShCLG4pKSl9LFtuLGgsdSxILFAsQl0pO2xldCBZPSgwLHJlLnVzZUNhbGxiYWNrKSgoWCxOZSx3ZSk9PldEKGEsZyxvZSxYLE5lLHdlKSxbYV0pLHE9KDAscmUudXNlQ2FsbGJhY2spKChYLE5lKT0+SEQoZSxwLHksRSxYLE5lKSxbZSxwXSksVj0oMCxyZS51c2VDYWxsYmFjaykoWD0+akQoZSxTLHksRSwkLE0sWCksW2VdKSxKPSgwLHJlLnVzZUNhbGxiYWNrKShYPT5WRChOLFgpLFtdKTtzcCh7YWN0aXZlVGFza0RvbWFpbjpuLGFwcDplLG9uRG9tYWluQ2hhbmdlOmEsb3BlblRhc2tzOml9KTtsZXQgUT0oMCxyZS51c2VNZW1vKSgoKT0+aD9yKGgpOnt9LFtyLGhdKSxuZT0oMCxyZS51c2VNZW1vKSgoKT0+e2xldCBYPXA/LltaLkRBU0hCT0FSRF9DT01QT05FTlRTXTtyZXR1cm4gQXJyYXkuaXNBcnJheShYKSYmWC5sZW5ndGg+MD9YOkxvfSxbcF0pLHtkcmFnZ2luZ1dpZGdldElkOnRlLGRpc3BsYXllZENvbXBvbmVudHM6aWV9PUt5KG5lLHEpLFRlPSgwLHJlLnVzZUNhbGxiYWNrKSgoKT0+RShybi5TRVRUSU5HU19DT05GSUcpLFtdKTtpZihtKXJldHVybiB0KCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1lcnJvciJ9LHQoImgyIixudWxsLCJEYXNoYm9hcmQgRXJyb3IiKSx0KCJwIixudWxsLG0pKTtpZighcClyZXR1cm4gdCgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtb3V0ZXItY29udGFpbmVyIn0sdCgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbG9hZGluZyJ9LHQoImRpdiIse2NsYXNzTmFtZToic3Bpbm5lciJ9KSx0KCJwIixudWxsLCJMb2FkaW5nIGRhc2hib2FyZC4uLiIpKSk7bGV0IGFlPXA/LltaLkJBQ0tHUk9VTkRfSU1BR0VfVVJMXSxBZT1wPy5bWi5CQUNLR1JPVU5EX0lNQUdFX01PREVdfHwiY292ZXIiLFdlPWFlfHxFbCgibGFyZ2UiLCRlKGh8fG5ldyBEYXRlKSk7YWUmJl8oIltkYXNoYm9hcmRdIGJhY2tncm91bmQgaW1hZ2UgVVJMIGZyb20gc2V0dGluZ3M6IixhZSwibW9kZToiLEFlKTtsZXQgVmU9V2U/KCgpPT57bGV0IFg9QWUuc3RhcnRzV2l0aCgicmVwZWF0Iik7cmV0dXJue2JhY2tncm91bmRJbWFnZTpgdXJsKCR7V2V9KWAsYmFja2dyb3VuZFNpemU6WD8iYXV0byI6QWUsYmFja2dyb3VuZFJlcGVhdDpYP0FlOiJuby1yZXBlYXQiLGJhY2tncm91bmRQb3NpdGlvbjoiY2VudGVyIixiYWNrZ3JvdW5kQXR0YWNobWVudDoiZml4ZWQifX0pKCk6dm9pZCAwO3JldHVybiB0KCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1vdXRlci1jb250YWluZXIiLHN0eWxlOlZlfSxmPT09cm4uTEFZT1VUX0NPTkZJRz90KFpkLHtjdXJyZW50TGF5b3V0OkFycmF5LmlzQXJyYXkocD8uW1ouREFTSEJPQVJEX0NPTVBPTkVOVFNdKT9wW1ouREFTSEJPQVJEX0NPTVBPTkVOVFNdOkxvLG9uU2F2ZTpxLG9uQ2FuY2VsOigpPT5FKHJuLkRFRkFVTFQpfSk6bnVsbCxmPT09cm4uU0VUVElOR1NfQ09ORklHPyhfKCJbZGFzaGJvYXJkXSByZW5kZXJpbmcgRGFzaGJvYXJkU2V0dGluZ3NQb3B1cCwgYmdVcmw6IixwPy5bWi5CQUNLR1JPVU5EX0lNQUdFX1VSTF0pLHQocnAse2FwcDplLGNvbmZpZ1BhcmFtczpwLG9uQ2FuY2VsOigpPT5FKHJuLkRFRkFVTFQpLG9uU2F2ZTpWLHBsdWdpbk5vdGVVVUlEOkQsdGltZUZvcm1hdDpMLHdlZWtGb3JtYXQ6V30pKTpudWxsLHQoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWNvbnRlbnQifSx0KCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC10b29sYmFyIn0sdChTcCx7YWN0aXZlVGFza0RvbWFpbjpuLGFwcDplLGRvbWFpbnM6cyxvbkRvbWFpbkNoYW5nZTpZfSksdCgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtdG9vbGJhci1hY3Rpb25zIn0sdCgiYnV0dG9uIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtY29uZmlndXJlLWJ1dHRvbiIsdHlwZToiYnV0dG9uIixvbkNsaWNrOigpPT57XygiW2Rhc2hib2FyZF0gb3BlbmluZyBTZXR0aW5ncyBwb3B1cCIpLEUocm4uU0VUVElOR1NfQ09ORklHKX0sdGl0bGU6IkNvbmZpZ3VyZSBMTE0gcHJvdmlkZXIgYW5kIEFQSSBrZXkgZm9yIEFJLXBvd2VyZWQgZmVhdHVyZXMifSwiXHUyNjk5XHVGRTBGIFNldHRpbmdzIiksdCgiYnV0dG9uIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtY29uZmlndXJlLWJ1dHRvbiIsdHlwZToiYnV0dG9uIixvbkNsaWNrOigpPT5FKHJuLkxBWU9VVF9DT05GSUcpLHRpdGxlOiJDb25maWd1cmUgd2hpY2ggd2lkZ2V0cyBhcmUgc2hvd24gYW5kIGluIHdoYXQgb3JkZXIifSwiXHUyNjMwIExheW91dCIpKSksdCgiZGl2Iix7Y2xhc3NOYW1lOmBkYXNoYm9hcmQtZ3JpZCR7dGU/IiBkYXNoYm9hcmQtZ3JpZC0tZHJhZ2dpbmciOiIifWB9LC4uLmllLm1hcCgoWCxOZSk9PntsZXQgd2U9WD8ud2lkZ2V0SWR8fExvW05lXT8ud2lkZ2V0SWQsVHQ9RkRbd2VdO2lmKCFUdClyZXR1cm4gbnVsbDtsZXQgZm49cD8uW1ouTExNX1BST1ZJREVSX01PREVMXSxOdD1ocihmbiksWXQ9TnQ/b24oTnQpOm51bGwsR249WXQmJnA/LltZdF18fCIiO3JldHVybiB0KFR0LHtrZXk6d2UsYWdlbmRhVGFza3M6USxhcHA6ZSxjYWxlbmRhckV2ZW50czpjLGNhbGVuZGFyRXZlbnRzTG9hZGVkOmQsY29tcGxldGVkVGFza3NCeURhdGU6bCxjb25maWc6WCxjdXJyZW50RGF0ZTpoLGRhaWx5VmFsdWVzOmIsZHJhZ2dpbmdXaWRnZXRJZDp0ZSxtb29kUmF0aW5nczprLG9uRGF0ZVNlbGVjdDpDLG9uTW9vZFJlY29yZGVkOkosb25PcGVuU2V0dGluZ3M6VGUsb25SZWZlcmVuY2VEYXRlQ2hhbmdlOkMsb3BlblRhc2tzOmkscHJvdmlkZXJBcGlLZXk6R24scHJvdmlkZXJFbTpOdHx8Zm58fG51bGwscXVhcnRlcmx5UGxhbnM6VCxyZWZlcmVuY2VEYXRlOkIsc2VsZWN0ZWREYXRlOlAsdGltZUZvcm1hdDpMLHdlZWtGb3JtYXQ6Vyx3ZWVrbHlUb3RhbDpLfSl9KS5maWx0ZXIoQm9vbGVhbikpKSl9dmFyIEdEPTQzMCxLRD0iZGFzaGJvYXJkLWxhcmdlLXBob25lLXZpZXdwb3J0IjsoZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7bGV0IG49TWF0aC5taW4oc2NyZWVuLndpZHRoLHNjcmVlbi5oZWlnaHQpLHI9d2luZG93Lm1hdGNoTWVkaWEoIihvcmllbnRhdGlvbjogbGFuZHNjYXBlKSIpLm1hdGNoZXM/TWF0aC5tYXgoc2NyZWVuLndpZHRoLHNjcmVlbi5oZWlnaHQpOm47aWYoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoS0Qscjw9R0QpLHI+PXdpbmRvdy5pbm5lcldpZHRoKXtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUubWF4V2lkdGg9IiIsZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93WD0iIixkb2N1bWVudC5ib2R5LnN0eWxlLm1heFdpZHRoPSIiLGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3dYPSIiO3JldHVybn1sZXQgbz1yKyJweCI7ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm1heFdpZHRoPW8sZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93WD0iaGlkZGVuIixkb2N1bWVudC5ib2R5LnN0eWxlLm1heFdpZHRoPW8sZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvd1g9ImhpZGRlbiJ9dCgpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHQpfSkoKTt2YXIgWUQ9TG4/b2QoKTpuZXcgUHJveHkoe3NldHRpbmdzOnt9fSx7Z2V0KGUsdCl7aWYodD09PSJzZXR0aW5ncyIpcmV0dXJuIGUuc2V0dGluZ3M7aWYodHlwZW9mIHQhPSJzeW1ib2wiKXJldHVybiguLi5uKT0+d2luZG93LmNhbGxBbXBsZW5vdGVQbHVnaW4odCwuLi5uKX0sc2V0KGUsdCxuKXtyZXR1cm4gZVt0XT1uLCEwfX0pLHFEPSgwLFkwLmNyZWF0ZVJvb3QpKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkYXNoYm9hcmQtcm9vdCIpKTtxRC5yZW5kZXIoKDAsSzAuY3JlYXRlRWxlbWVudCkoTnAse2FwcDpZRH0pKTt9KSgpOwovKiEgQnVuZGxlZCBsaWNlbnNlIGluZm9ybWF0aW9uOgoKcmVhY3QvY2pzL3JlYWN0LnByb2R1Y3Rpb24ubWluLmpzOgogICgqKgogICAqIEBsaWNlbnNlIFJlYWN0CiAgICogcmVhY3QucHJvZHVjdGlvbi5taW4uanMKICAgKgogICAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLgogICAqCiAgICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAgICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLgogICAqKQoKc2NoZWR1bGVyL2Nqcy9zY2hlZHVsZXIucHJvZHVjdGlvbi5taW4uanM6CiAgKCoqCiAgICogQGxpY2Vuc2UgUmVhY3QKICAgKiBzY2hlZHVsZXIucHJvZHVjdGlvbi5taW4uanMKICAgKgogICAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLgogICAqCiAgICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAgICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLgogICAqKQoKcmVhY3QtZG9tL2Nqcy9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanM6CiAgKCoqCiAgICogQGxpY2Vuc2UgUmVhY3QKICAgKiByZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMKICAgKgogICAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLgogICAqCiAgICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAgICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLgogICAqKQoqLwo=";
var compiledCSS = `[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{border-radius:6px;font-size:.75rem;line-height:1.4;outline:0;position:relative;transition-property:transform,visibility,opacity;white-space:normal}.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}.tippy-content{padding:8px 12px;position:relative;z-index:1}.tippy-arrow{color:var(--dashboard-color-tooltip-bg);height:16px;width:16px}.tippy-arrow:before{border-color:#0000;border-style:solid;content:"";position:absolute}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{border-top-color:initial;border-width:8px 8px 0;bottom:-7px;left:0;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:initial;border-width:0 8px 8px;left:0;top:-7px;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-left-color:initial;border-width:8px 0 8px 8px;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{border-right-color:initial;border-width:8px 8px 8px 0;left:-7px;transform-origin:center right}.tippy-box[data-theme~=dashboard]{background:var(--dashboard-color-tooltip-bg);box-shadow:0 4px 12px var(--dashboard-color-tooltip-shadow);color:var(--dashboard-color-tooltip-text);max-width:260px;min-width:180px}.tippy-box[data-theme~=dashboard]>.tippy-arrow{color:var(--dashboard-color-tooltip-bg)}.tippy-box[data-theme~=dashboard].below-chart>.tippy-content{max-height:40vh;overflow-y:auto}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-header{border-bottom:1px solid var(--dashboard-color-tooltip-border);font-weight:600;margin-bottom:4px;padding-bottom:4px}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-section{border-bottom:1px solid var(--dashboard-color-tooltip-border);margin-bottom:4px;padding-bottom:4px}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-row{align-items:baseline;display:flex;gap:8px;justify-content:space-between;padding:2px 0}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-row-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-row-label p{display:inline;margin:0}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-row-value{color:var(--dashboard-color-tooltip-accent);flex-shrink:0;font-weight:600}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-empty{color:var(--dashboard-color-tooltip-text-muted);font-style:italic}.tippy-box[data-theme~=dashboard] .mood-viz-tooltip-date{border-bottom:1px solid var(--dashboard-color-tooltip-border);font-weight:600;margin-bottom:4px;padding-bottom:4px}.tippy-box[data-theme~=dashboard] .mood-viz-tooltip-entry{align-items:baseline;display:flex;flex-wrap:wrap;gap:4px 6px;padding:2px 0}.tippy-box[data-theme~=dashboard] .mood-viz-tooltip-time{color:var(--dashboard-color-tooltip-text-muted);font-size:.7rem;min-width:52px}.tippy-box[data-theme~=dashboard] .mood-viz-tooltip-mood .mood-viz-label{color:var(--dashboard-color-tooltip-text-muted)}.tippy-box[data-theme~=dashboard] .mood-viz-tooltip-note{color:var(--dashboard-color-tooltip-text);flex-basis:100%;font-size:.7rem;font-style:italic;overflow:hidden;text-overflow:ellipsis;white-space:normal;word-break:break-word}.widget .widget-body{overflow-y:auto}.widget-planning .planning-quarters{display:flex;flex-wrap:wrap;gap:16px;margin-bottom:16px}.widget-planning .quarter-card{border:2px dashed var(--dashboard-color-border);border-radius:10px;cursor:pointer;display:flex;flex:1 1 140px;flex-direction:column;gap:4px;min-width:0;padding:12px 16px;transition:background .15s,border-color .15s}.widget-planning .quarter-card:hover{border-color:var(--dashboard-color-blue)}.widget-planning .quarter-card--has-plan{background:var(--dashboard-color-plan-created-bg);border-color:var(--dashboard-color-plan-created-border);border-style:solid}.widget-planning .quarter-card--has-plan:hover{border-color:var(--dashboard-color-plan-created-border);filter:brightness(.97)}.widget-planning .quarter-card .quarter-label{color:var(--dashboard-color-navy);font-size:.95rem;font-weight:700}.widget-planning .quarter-card .quarter-status-row{align-items:center;display:flex;gap:8px;justify-content:space-between}.widget-planning .quarter-card .quarter-status{color:var(--dashboard-color-text-secondary);font-size:.75rem}.widget-planning .quarter-card .quarter-plan-indicator{cursor:default;flex-shrink:0;font-size:.85rem;line-height:1}.widget-planning .month-tabs{display:flex;flex-wrap:wrap;gap:4px}.widget-planning .month-tab{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;flex:1;font-size:.8rem;padding:8px 12px;transition:background .15s,color .15s}.widget-planning .month-tab:hover{background:var(--dashboard-color-blue-light)}.widget-planning .month-tab.active{background:var(--dashboard-color-accent);border-color:var(--dashboard-color-accent);color:var(--dashboard-color-text-on-accent);font-weight:600}.widget-planning .month-content-area{border:1px solid var(--dashboard-color-border);border-radius:6px;margin-top:12px;overflow:hidden;padding:12px 16px}.widget-planning .month-content-loading{color:var(--dashboard-color-text-muted);font-size:.8rem;font-style:italic}.widget-planning .month-content-header{color:var(--dashboard-color-navy);font-size:.85rem;font-weight:700;margin-bottom:8px}.widget-planning .month-content-text{color:var(--dashboard-color-text);font-size:.8rem;line-height:1.4}.widget-planning .month-content-text p{margin:0 0 4px}.widget-planning .month-content-text ol,.widget-planning .month-content-text ul{margin:0 0 4px;padding-left:16px}.widget-planning .month-content-text li{margin:0;padding:0}.widget-planning .month-content-text strong{color:var(--dashboard-color-navy)}.widget-planning .month-content-text>:last-child{margin-bottom:0}.widget-planning .month-content-empty{text-align:center}.widget-planning .create-month-plan-link{background:none;border:2px dashed var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-link);cursor:pointer;font-size:.8rem;padding:8px 16px;transition:border-color .15s,color .15s}.widget-planning .create-month-plan-link:hover{border-color:var(--dashboard-color-blue);color:var(--dashboard-color-navy)}.widget-planning .planning-empty{color:var(--dashboard-color-text-muted);font-size:.85rem;font-style:italic;padding:16px 0;text-align:center}.widget-planning .weekly-plan-section{border-top:1px solid var(--dashboard-color-border);margin-top:16px;padding-top:12px}.widget-planning .weekly-plan-header{color:var(--dashboard-color-navy);font-size:.85rem;font-weight:700;margin-bottom:8px}.widget-planning .weekly-plan-loading{color:var(--dashboard-color-text-muted);font-size:.8rem;font-style:italic}.widget-planning .create-week-plan-link{background:none;border:2px dashed var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-link);cursor:pointer;font-size:.8rem;padding:8px 16px;transition:border-color .15s,color .15s;width:100%}.widget-planning .create-week-plan-link:hover{border-color:var(--dashboard-color-blue);color:var(--dashboard-color-navy)}.widget-planning .note-editor{display:flex;flex-direction:column;gap:8px;height:100%}.widget-planning .note-editor-loading{color:var(--dashboard-color-text-muted);font-size:.8rem;font-style:italic;padding:12px}.widget-planning .note-editor-toolbar{display:flex;gap:8px}.widget-planning .note-editor-btn{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;cursor:pointer;font-size:.8rem;padding:4px 12px;transition:background .15s}.widget-planning .note-editor-btn:hover{background:var(--dashboard-color-blue-light)}.widget-planning .note-editor-btn--save{background:var(--dashboard-color-accent);border-color:var(--dashboard-color-accent);color:var(--dashboard-color-text-on-accent);font-weight:600}.widget-planning .note-editor-btn--save:hover{filter:brightness(.92)}.widget-planning .note-editor-btn--save:disabled{cursor:default;opacity:.6}.widget-planning .note-editor-textarea{border:1px solid var(--dashboard-color-border);border-radius:6px;flex:1;font-family:monospace;font-size:.8rem;line-height:1.5;min-height:180px;padding:12px;resize:vertical}.rich-footnote-wrap{display:inline}.rich-footnote-indicator{cursor:default;display:inline-block;font-size:.65em;margin-left:2px;opacity:.65;vertical-align:super}.rich-footnote-indicator:hover{opacity:1}.tippy-box[data-theme~=rich-footnote]{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:10px;box-shadow:0 4px 16px var(--dashboard-color-overlay-shadow);color:var(--dashboard-color-text);font-size:.85rem;line-height:1.5;max-width:420px;min-width:200px}.tippy-box[data-theme~=rich-footnote]>.tippy-arrow{color:var(--dashboard-color-bg-card)}.tippy-box[data-theme~=rich-footnote]>.tippy-content{padding:12px}.rich-footnote-popup{display:flex;flex-direction:column;gap:8px}.rich-footnote-popup-url{align-items:center;display:flex;gap:4px}.rich-footnote-popup-url svg{color:var(--dashboard-color-accent);flex-shrink:0}.rich-footnote-popup-url a{color:var(--dashboard-color-link);overflow:hidden;text-decoration:none;text-overflow:ellipsis;white-space:nowrap}.rich-footnote-popup-url a:hover{text-decoration:underline}.rich-footnote-popup-text{color:var(--dashboard-color-text)}.rich-footnote-popup-media{border-radius:6px;overflow:hidden}.rich-footnote-popup-media img,.rich-footnote-popup-media video,.rich-footnote-popup-media iframe{display:block;max-width:100%;width:100%}.rich-footnote-popup-media iframe{aspect-ratio:16/9;border:0}.rich-footnote-popup-actions{border-top:1px solid var(--dashboard-color-border);display:flex;justify-content:flex-end;padding-top:8px}.rich-footnote-popup-close{background:none;border:none;color:var(--dashboard-color-accent);cursor:pointer;font-size:.8rem;font-weight:600;letter-spacing:.5px;padding:4px 8px}.rich-footnote-popup-close:hover{opacity:.8}.widget-agenda a{color:var(--dashboard-color-link);text-decoration:none}.widget-agenda a:hover{text-decoration:underline}.widget-agenda img{max-width:100%}.widget-agenda .widget-body{display:flex;flex-direction:column;overflow:hidden}.widget-agenda .agenda-list{display:flex;flex:1;flex-direction:column;gap:12px;min-height:0;overflow-x:hidden;overflow-y:auto;padding-right:4px}.widget-agenda .agenda-day{display:flex;flex-direction:column;gap:4px}.widget-agenda .agenda-date-label{color:var(--dashboard-color-text-secondary);font-size:.75rem;font-weight:700;letter-spacing:.02em;text-transform:uppercase}.widget-agenda .agenda-empty-day{color:var(--dashboard-color-text-muted);font-size:.8rem;font-style:italic;padding:4px 0}.widget-agenda .agenda-item{align-items:center;display:flex;gap:12px;padding:8px 0}.widget-agenda .agenda-item .agenda-indicator{border-radius:2px;flex-shrink:0;height:36px;width:4px}.widget-agenda .agenda-item .agenda-indicator.priority-critical{background-color:var(--dashboard-color-agenda-priority-critical)}.widget-agenda .agenda-item .agenda-indicator.priority-important{background-color:var(--dashboard-color-agenda-priority-important)}.widget-agenda .agenda-item .agenda-indicator.priority-urgent{background-color:var(--dashboard-color-agenda-priority-urgent)}.widget-agenda .agenda-item .agenda-indicator.priority-normal{background-color:var(--dashboard-color-agenda-priority-normal)}.widget-agenda .agenda-item .agenda-content{display:flex;flex:1;flex-direction:column;gap:4px}.widget-agenda .agenda-item .agenda-content .agenda-time{color:var(--dashboard-color-text-secondary);font-size:.75rem;font-weight:600}.widget-agenda .agenda-item .agenda-content .agenda-text{color:var(--dashboard-color-text);font-size:.85rem;overflow:hidden;white-space:nowrap}.widget-agenda .agenda-item .agenda-content .agenda-note-link{background:#0000;border:0;color:var(--dashboard-color-link);cursor:pointer;font-size:.72rem;margin:0;padding:0;text-align:left;text-decoration:underline}.widget-agenda .agenda-item .agenda-duration{color:var(--dashboard-color-text-muted);font-size:.7rem}.widget-agenda .agenda-task-row{border-radius:6px;cursor:pointer;padding:8px;transition:background-color .12s ease}.widget-agenda .agenda-task-row:hover{background:var(--dashboard-color-bg-page)}.widget-agenda .agenda-empty{color:var(--dashboard-color-text-secondary);font-size:.85rem;padding:24px 0;text-align:center}.widget-agenda .agenda-pagination{align-items:center;display:flex;gap:4px}.widget-agenda .agenda-page-arrow{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.65rem;line-height:1;padding:2px 4px}.widget-agenda .agenda-page-arrow:hover:not(:disabled){color:var(--dashboard-color-navy)}.widget-agenda .agenda-page-arrow:disabled{cursor:default;opacity:.3}.widget-agenda .agenda-page-indicator{color:var(--dashboard-color-text-muted);font-size:.7rem;white-space:nowrap}.widget-calendar.vertical-2-cell .cal-arrow{font-size:.9rem}.widget-calendar.vertical-2-cell .cal-month{font-size:1.1rem}.widget-calendar.vertical-2-cell .cal-header{font-size:.85rem}.widget-calendar.vertical-2-cell .cal-cell{padding-top:0}.widget-calendar.vertical-2-cell .cal-cell .cal-day{font-size:16px;top:0}.widget-calendar.vertical-2-cell .cal-cell .cal-dot{bottom:18%;height:6px;width:6px}.widget-calendar.horizontal-2-cell.vertical-1-cell .widget-body{display:flex;flex-direction:column;padding:8px 16px}.widget-calendar.horizontal-2-cell.vertical-1-cell .cal-nav{margin-bottom:8px}.widget-calendar.horizontal-2-cell.vertical-1-cell .cal-grid{flex:1}.widget-calendar.horizontal-2-cell.vertical-1-cell .cal-header{padding:2px 0}.widget-calendar.horizontal-2-cell.vertical-1-cell .cal-cell{aspect-ratio:auto;border-radius:12px}.widget-calendar .cal-nav{align-items:center;display:flex;justify-content:space-between;margin-bottom:12px}.widget-calendar .cal-arrow{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.75rem;padding:4px}.widget-calendar .cal-arrow:hover{color:var(--dashboard-color-navy)}.widget-calendar .cal-month{color:var(--dashboard-color-navy);font-size:.85rem;font-weight:700}.widget-calendar .cal-grid{display:grid;gap:2px;grid-template-columns:repeat(7,1fr);text-align:center}.widget-calendar .cal-header{color:var(--dashboard-color-text-muted);font-size:.7rem;font-weight:600;padding:4px 0}.widget-calendar .cal-cell{align-items:center;aspect-ratio:1;border-radius:50%;cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:4px 0;position:relative;transition:background-color .12s ease}.widget-calendar .cal-cell:not(.empty):hover{background:var(--dashboard-color-blue-light)}.widget-calendar .cal-cell.empty{cursor:default;visibility:hidden}.widget-calendar .cal-cell.today{background:var(--dashboard-color-blue)}.widget-calendar .cal-cell.today .cal-day{color:var(--dashboard-color-text-on-accent);font-weight:700}.widget-calendar .cal-cell.today:hover{background:var(--dashboard-color-navy)}.widget-calendar .cal-cell.selected{outline:2px solid var(--dashboard-color-accent);outline-offset:0}.widget-calendar .cal-cell.today.selected{outline-color:var(--dashboard-color-accent)}.widget-calendar .cal-cell .cal-day{color:var(--dashboard-color-text);font-size:.8rem;position:relative;top:-2px}.widget-calendar .cal-cell .cal-dot{border-radius:50%;bottom:6px;height:4px;position:absolute;width:4px}@media (max-width: 430px){.widget-calendar .cal-cell{aspect-ratio:auto;min-height:32px}.widget-calendar .cal-cell .cal-dot{bottom:auto;margin-top:6px;position:static}}.dashboard-large-phone-viewport .widget-calendar .cal-cell{aspect-ratio:auto;min-height:32px}.dashboard-large-phone-viewport .widget-calendar .cal-cell .cal-dot{bottom:auto;margin-top:6px;position:static}.dashboard-layout-popup{display:flex;flex-direction:column;margin:16px;max-height:min(800px,100vh - 32px);max-width:min(800px,100vw - 32px);min-width:0;width:100%}.dashboard-layout-popup .dashboard-layout-popup-tabs{display:flex;gap:4px;margin-top:12px}.dashboard-layout-popup .dashboard-layout-popup-tab{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;flex:1;font-size:.8rem;padding:8px 12px;transition:background .15s ease,color .15s ease}.dashboard-layout-popup .dashboard-layout-popup-tab:hover{background:var(--dashboard-color-blue-light)}.dashboard-layout-popup .dashboard-layout-popup-tab.active{background:var(--dashboard-color-accent);border-color:var(--dashboard-color-accent);color:var(--dashboard-color-text-on-accent);font-weight:600}.dashboard-layout-popup .dashboard-layout-popup-body{display:flex;flex:1;flex-direction:column;gap:16px;overflow-y:auto;padding:16px}.dashboard-layout-popup .dashboard-layout-popup-section{border:2px dashed rgba(0,0,0,0);border-radius:10px;padding:4px;transition:border-color .15s ease,background .15s ease}.dashboard-layout-popup .dashboard-layout-popup-section--drag-over{background:var(--dashboard-color-blue-light);border-color:var(--dashboard-color-accent)}.dashboard-layout-popup .dashboard-layout-popup-section-header{align-items:center;border-bottom:1px solid var(--dashboard-color-border);display:flex;gap:8px;margin-bottom:8px;padding-bottom:8px}.dashboard-layout-popup .dashboard-layout-popup-section-icon{flex-shrink:0;font-size:.9rem;line-height:1}.dashboard-layout-popup .dashboard-layout-popup-section-title{color:var(--dashboard-color-text-secondary);font-size:.72rem;font-weight:700;letter-spacing:.05em;margin:0;text-transform:uppercase}.dashboard-layout-popup .dashboard-layout-popup-list{display:flex;flex-direction:column;gap:4px}.dashboard-layout-popup .dashboard-layout-popup-item{align-items:center;background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;cursor:grab;display:flex;gap:8px;padding:8px 12px;transition:opacity .12s ease,box-shadow .12s ease,background .12s ease;-webkit-user-select:none;user-select:none}.dashboard-layout-popup .dashboard-layout-popup-item:active{cursor:grabbing}.dashboard-layout-popup .dashboard-layout-popup-item--dragging{opacity:.35}.dashboard-layout-popup .dashboard-layout-popup-item--drag-over{background:var(--dashboard-color-bg-card);box-shadow:0 -2px 0 var(--dashboard-color-accent)}.dashboard-layout-popup .dashboard-layout-popup-item-handle{color:var(--dashboard-color-text-muted);cursor:grab;flex-shrink:0;font-size:1rem;line-height:1}.dashboard-layout-popup .dashboard-layout-popup-item-handle:active{cursor:grabbing}.dashboard-layout-popup .dashboard-layout-popup-item-icon{flex-shrink:0;font-size:1rem;line-height:1}.dashboard-layout-popup .dashboard-layout-popup-item-info{display:flex;flex:1;flex-direction:column;gap:1px;min-width:0;overflow:hidden}.dashboard-layout-popup .dashboard-layout-popup-item-name{color:var(--dashboard-color-text);font-size:.875rem;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dashboard-layout-popup .dashboard-layout-popup-item-description{color:var(--dashboard-color-text-secondary);font-size:.75rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dashboard-layout-popup .dashboard-layout-popup-item-actions{display:flex;flex-shrink:0;gap:2px}.dashboard-layout-popup .dashboard-layout-popup-arrow-button{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.8rem;line-height:1;padding:3px 7px;transition:background .1s ease,color .1s ease}.dashboard-layout-popup .dashboard-layout-popup-arrow-button:hover:not(:disabled){background:var(--dashboard-color-bg-card);color:var(--dashboard-color-text)}.dashboard-layout-popup .dashboard-layout-popup-arrow-button:disabled{cursor:not-allowed;opacity:.3}.dashboard-layout-popup .dashboard-layout-popup-empty{color:var(--dashboard-color-text-muted);font-size:.8rem;font-style:italic;padding:12px 8px;text-align:center}.dashboard-layout-popup .dashboard-layout-popup-sizing{display:flex;flex-direction:column;gap:8px}.dashboard-layout-popup .dashboard-layout-popup-sizing-item{background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;display:flex;align-items:center;gap:12px;padding:8px 12px}.dashboard-layout-popup .dashboard-layout-popup-sizing-item-header{align-items:center;display:flex;gap:8px;flex:1;min-width:0}.dashboard-layout-popup .dashboard-layout-popup-sizing-item-controls{display:flex;flex-shrink:0;gap:16px}.dashboard-layout-popup .dashboard-layout-popup-sizing-field{align-items:center;display:flex;gap:4px}.dashboard-layout-popup .dashboard-layout-popup-sizing-label{color:var(--dashboard-color-text-secondary);font-size:.72rem;font-weight:600;letter-spacing:.03em;text-transform:uppercase;white-space:nowrap}.dashboard-layout-popup .dashboard-layout-popup-sizing-select{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);cursor:pointer;font-size:.8rem;padding:4px 8px}.dashboard-layout-popup .config-popup-actions .config-popup-link{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.8rem;margin-right:auto;padding:0;text-decoration:underline}.dashboard-layout-popup .config-popup-actions .config-popup-link:hover{color:var(--dashboard-color-text)}.dashboard-toolbar{align-items:center;display:flex;flex-wrap:wrap;gap:12px;justify-content:space-between;margin-bottom:16px}.dashboard-toolbar .dashboard-toolbar-actions{align-items:center;display:flex;background-color:var(--dashboard-color-bg-card);border-radius:6px;border:1px solid var(--dashboard-color-border);color:var(--dashboard-color-text-secondary);flex-shrink:0;padding:8px}.dashboard-toolbar .dashboard-configure-button{background-color:var(--dashboard-color-bg-card);border:1px solid rgba(0,0,0,0);border-radius:6px;color:var(--dashboard-color-text);cursor:pointer;font-size:.8rem;font-weight:500;padding:4px 12px;transition:background .15s ease,color .15s ease,border-color .15s ease;white-space:nowrap}.dashboard-toolbar .dashboard-configure-button:hover{background:var(--dashboard-color-bg-page);border-color:var(--dashboard-color-accent);color:var(--dashboard-color-text)}.config-popup-overlay{align-items:center;background:var(--dashboard-color-overlay-backdrop);display:flex;inset:0;justify-content:center;position:fixed;z-index:1000}.config-popup-container{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:14px;box-shadow:0 8px 32px var(--dashboard-color-overlay-shadow);max-width:90%;min-width:320px;width:650px}.config-popup-container .explanation-paragraph{font-size:14px;margin:12px 0 20px}.config-popup-container .config-popup-header{border-bottom:1px solid var(--dashboard-color-border);padding:16px}.config-popup-container .config-popup-title{color:var(--dashboard-color-navy);font-size:.95rem;font-weight:700;margin:0}.config-popup-container .config-popup-body{padding:16px}.config-popup-container .config-popup-body label{align-items:center;color:var(--dashboard-color-text);cursor:pointer;display:flex;font-size:.85rem;gap:8px;padding:4px 0}.config-popup-container .config-popup-body input[type=radio],.config-popup-container .config-popup-body input[type=checkbox]{accent-color:var(--dashboard-color-accent)}.config-popup-container .config-popup-body .config-field{margin-bottom:12px}.config-popup-container .config-popup-body .config-field .config-line{margin-bottom:10px;margin-top:10px}.config-popup-container .config-popup-body .config-field:last-child{margin-bottom:0}.config-popup-container .config-popup-body .config-field-label{color:var(--dashboard-color-text-secondary);font-size:.75rem;font-weight:600;letter-spacing:.03em;margin-bottom:4px;text-transform:uppercase}.config-popup-container .config-popup-actions{border-top:1px solid var(--dashboard-color-border);display:flex;gap:8px;justify-content:flex-end;padding:12px 16px}.config-popup-container .config-popup-actions>button{padding-left:8px;padding-right:8px}.config-popup-container .config-popup-btn{border:1px solid var(--dashboard-color-border);border-radius:6px;cursor:pointer;font-size:.8rem;font-weight:600;padding:8px 16px}.config-popup-container .config-popup-btn--cancel{background:#0000;color:var(--dashboard-color-text-secondary)}.config-popup-container .config-popup-btn--cancel:hover{background:var(--dashboard-color-bg-page-hover)}.config-popup-container .config-popup-btn--submit{background:var(--dashboard-color-accent);border-color:var(--dashboard-color-accent);color:var(--dashboard-color-text-on-accent)}.config-popup-container .config-popup-btn--submit:hover{opacity:.9}.dashboard-settings-container .dashboard-settings-section{display:flex;flex-direction:column}.dashboard-settings-container .dashboard-settings-section.section:not(:first-child){border-top:1px solid var(--dashboard-color-border);margin-top:16px;padding-top:16px}.dashboard-settings-container .dashboard-settings-section-header{display:flex;flex-direction:column;gap:4px}.dashboard-settings-container .dashboard-settings-section-title{color:var(--dashboard-color-navy);font-size:.85rem;font-weight:700;letter-spacing:.02em;margin:0}.dashboard-settings-container .dashboard-settings-section-desc{color:var(--dashboard-color-text-secondary);font-size:.8rem;line-height:1.5;margin:0}.dashboard-settings-container .dashboard-settings-select{-webkit-appearance:none;appearance:none;background:var(--dashboard-color-bg-page);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%23999' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");background-position:right 8px center;background-repeat:no-repeat;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);cursor:pointer;font-size:.85rem;padding:8px 24px 8px 8px;transition:border-color .15s ease;width:100%}.dashboard-settings-container .dashboard-settings-select:focus{border-color:var(--dashboard-color-accent);outline:none}.dashboard-settings-container .dashboard-settings-dropzone{align-items:center;background:var(--dashboard-color-bg-page);border:2px dashed var(--dashboard-color-border);border-radius:6px;cursor:pointer;display:flex;flex-direction:column;gap:8px;justify-content:center;min-height:120px;padding:16px;text-align:center;transition:border-color .15s ease,background .15s ease}.dashboard-settings-container .dashboard-settings-dropzone:hover{border-color:var(--dashboard-color-accent)}.dashboard-settings-container .dashboard-settings-dropzone--active{background:#00000008;border-color:var(--dashboard-color-accent);border-style:solid}.dashboard-settings-container .dashboard-settings-dropzone--uploading{cursor:wait;opacity:.7}.dashboard-settings-container .dashboard-settings-dropzone-input{display:none}.dashboard-settings-container .dashboard-settings-dropzone-text{color:var(--dashboard-color-text-muted);font-size:.8rem}.dashboard-settings-container .dashboard-settings-dropzone-preview{align-items:center;display:flex;flex-direction:column;gap:8px}.dashboard-settings-container .dashboard-settings-dropzone-preview-img{border-radius:6px;max-height:80px;max-width:100%;object-fit:contain}.dashboard-settings-container .dashboard-settings-remove-image{color:var(--dashboard-color-danger);cursor:pointer;display:inline-block;font-size:.8rem;margin-top:4px;text-decoration:none}.dashboard-settings-container .dashboard-settings-remove-image:hover{text-decoration:underline}.dashboard-settings-container .dashboard-settings-api-key-hint{color:var(--dashboard-color-text-secondary);font-size:.8rem;line-height:1.45;margin:0 0 4px}.dashboard-settings-container .dashboard-settings-api-key-link{color:var(--dashboard-color-link);display:inline-block;font-size:.8rem;margin-bottom:4px;text-decoration:none}.dashboard-settings-container .dashboard-settings-api-key-link:hover{text-decoration:underline}.dashboard-settings-container .dashboard-settings-api-key-input-row{align-items:center;display:flex;gap:4px}.dashboard-settings-container .dashboard-settings-api-key-input{background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);flex:1;font-family:monospace;font-size:.82rem;min-width:0;padding:8px;transition:border-color .15s ease}.dashboard-settings-container .dashboard-settings-api-key-input::placeholder{color:var(--dashboard-color-text-muted)}.dashboard-settings-container .dashboard-settings-api-key-input:focus{border-color:var(--dashboard-color-accent);outline:none}.dashboard-settings-container .dashboard-settings-api-key-toggle{background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;flex-shrink:0;font-size:.9rem;line-height:1;padding:8px;transition:background .1s ease,color .1s ease}.dashboard-settings-container .dashboard-settings-api-key-toggle:hover{background:var(--dashboard-color-bg-card);color:var(--dashboard-color-text)}.dashboard-outer-container .widget-dream-task .dream-task-header-actions{align-items:center;display:flex;gap:8px}.dashboard-outer-container .widget-dream-task .dream-task-list{display:flex;flex-direction:column;gap:12px}.dashboard-outer-container .widget-dream-task .dream-task-llm-attribution{color:var(--dashboard-color-text-secondary);font-size:.7rem;line-height:1.4;padding-top:8px}.dashboard-outer-container .widget-dream-task .widget-title{align-items:center;display:flex}@media (max-width: 430px){.dashboard-outer-container .widget-dream-task .widget-title .widget-title__subtitle{display:none}}.dashboard-large-phone-viewport .dashboard-outer-container .widget-dream-task .widget-title .widget-title__subtitle{display:none}.dashboard-outer-container .widget-dream-task .dream-task-goals-summary{border-bottom:1px solid var(--dashboard-color-border);margin-bottom:8px;padding-bottom:12px}.dashboard-outer-container .widget-dream-task .dream-task-goals-text{color:var(--dashboard-color-text-secondary);font-size:.8rem;font-style:italic;line-height:1.5;margin:0}.dashboard-outer-container .widget-dream-task .dream-task-card{border:1px solid var(--dashboard-color-border);border-radius:10px;opacity:1;padding:12px 16px;transition:border-color .15s ease,opacity .28s ease,transform .28s ease}.dashboard-outer-container .widget-dream-task .dream-task-card:hover{border-color:var(--dashboard-color-blue-light)}.dashboard-outer-container .widget-dream-task .dream-task-card--dismissing{opacity:0;pointer-events:none;transform:translateY(6px) scale(.98)}.dashboard-outer-container .widget-dream-task .dream-task-card-header{align-items:flex-start;display:flex;gap:8px;justify-content:space-between;margin-bottom:8px}.dashboard-outer-container .widget-dream-task .dream-task-card-title{color:var(--dashboard-color-navy);font-size:.9rem;font-weight:600;line-height:1.3}.dashboard-outer-container .widget-dream-task .dream-task-card-title--clickable{cursor:pointer}.dashboard-outer-container .widget-dream-task .dream-task-card-title--clickable:hover{color:var(--dashboard-color-blue);text-decoration:underline}.dashboard-outer-container .widget-dream-task .dream-task-rating{border-radius:6px;flex-shrink:0}.dashboard-outer-container .widget-dream-task .dream-task-rating--high{background:#22c55e1f;color:var(--dashboard-color-success)}.dashboard-outer-container .widget-dream-task .dream-task-rating--medium{background:#eab3081f;color:var(--dashboard-color-warning)}.dashboard-outer-container .widget-dream-task .dream-task-rating--low{background:#ef44441f;color:var(--dashboard-color-danger)}.dashboard-outer-container .widget-dream-task .dream-task-card--invented{border-left:2px solid var(--dashboard-color-blue-light)}.dashboard-outer-container .widget-dream-task .dream-task-new-badge{background:#4a9eff1f;border-radius:6px;color:var(--dashboard-color-blue);flex-shrink:0}.dashboard-outer-container .widget-dream-task .dream-task-source-note-badge{background:#7c3aed1a;border-radius:6px;color:var(--dashboard-color-navy);flex-shrink:0;font-size:11px;font-weight:600;max-width:11rem;overflow:hidden;padding:2px 4px;text-overflow:ellipsis;text-transform:none;white-space:nowrap}.dashboard-outer-container .widget-dream-task .dream-task-new-badge,.dashboard-outer-container .widget-dream-task .dream-task-rating{font-size:11px;font-weight:700;padding:2px 4px;text-transform:uppercase;white-space:nowrap}@media (max-width: 430px){.dashboard-outer-container .widget-dream-task .dream-task-card-header{gap:4px;justify-content:flex-start}.dashboard-outer-container .widget-dream-task .dream-task-card-title{flex:1 0 100%;min-width:0;order:1}.dashboard-outer-container .widget-dream-task .dream-task-new-badge,.dashboard-outer-container .widget-dream-task .dream-task-source-note-badge,.dashboard-outer-container .widget-dream-task .dream-task-rating{display:none}}.dashboard-large-phone-viewport .dashboard-outer-container .widget-dream-task .dream-task-card-header{gap:4px;justify-content:flex-start}.dashboard-large-phone-viewport .dashboard-outer-container .widget-dream-task .dream-task-card-title{flex:1 0 100%;min-width:0;order:1}.dashboard-large-phone-viewport .dashboard-outer-container .widget-dream-task .dream-task-new-badge,.dashboard-large-phone-viewport .dashboard-outer-container .widget-dream-task .dream-task-source-note-badge,.dashboard-large-phone-viewport .dashboard-outer-container .widget-dream-task .dream-task-rating{display:none}.dashboard-outer-container .widget-dream-task .dream-task-card-explanation{color:var(--dashboard-color-text-secondary);cursor:pointer;display:-webkit-box;font-size:.8rem;line-height:1.5;margin:0;overflow:hidden;text-overflow:ellipsis;line-clamp:3;-webkit-box-orient:vertical;-webkit-line-clamp:3}.dashboard-outer-container .widget-dream-task .dream-task-card-explanation--expanded{display:block;overflow:visible;text-overflow:clip;line-clamp:initial;-webkit-box-orient:initial;-webkit-line-clamp:initial}.dashboard-outer-container .widget-dream-task .dream-task-card-actions{align-items:center;display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}.dashboard-outer-container .widget-dream-task .dream-task-card-action{color:var(--dashboard-color-link);cursor:pointer;font-size:.75rem;font-weight:600;text-decoration:none}.dashboard-outer-container .widget-dream-task .dream-task-card-action:hover{text-decoration:underline}.dashboard-outer-container .widget-dream-task .dream-task-no-config{align-items:center;display:flex;flex-direction:column;gap:12px;padding:24px 16px;text-align:center}.dashboard-outer-container .widget-dream-task .dream-task-no-config-text{color:var(--dashboard-color-text-secondary);font-size:.85rem;line-height:1.5;margin:0}.dashboard-outer-container .widget-dream-task .dream-task-settings-link{color:var(--dashboard-color-link);font-weight:600;text-decoration:none}.dashboard-outer-container .widget-dream-task .dream-task-settings-link:hover{text-decoration:underline}.dashboard-outer-container .widget-dream-task .dream-task-loading{align-items:center;display:flex;flex-direction:column;gap:12px;padding:24px;text-align:center}.dashboard-outer-container .widget-dream-task .dream-task-loading p{color:var(--dashboard-color-text-secondary);font-size:.85rem;margin:0}.dashboard-outer-container .widget-dream-task .dream-task-spinner{animation:spin .8s linear infinite;border:3px solid var(--dashboard-color-border);border-radius:50%;border-top-color:var(--dashboard-color-blue);height:24px;width:24px}.dashboard-outer-container .widget-dream-task .dream-task-error{padding:16px;text-align:center}.dashboard-outer-container .widget-dream-task .dream-task-error p{color:var(--dashboard-color-danger);font-size:.85rem;margin:0 0 12px}.dashboard-outer-container .widget-dream-task .dream-task-empty{padding:16px;text-align:center}.dashboard-outer-container .widget-dream-task .dream-task-empty p{color:var(--dashboard-color-text-secondary);font-size:.85rem;margin:0 0 12px}.dashboard-outer-container .widget-dream-task .dream-task-retry{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.8rem;padding:4px 12px}.dashboard-outer-container .widget-dream-task .dream-task-retry:hover{border-color:var(--dashboard-color-blue);color:var(--dashboard-color-blue)}.widget-day-sketch .widget-body{display:flex;flex-direction:column;overflow:hidden;padding:0}.widget-day-sketch .day-sketch-notebook{background-color:#fffef5;background-image:repeating-linear-gradient(transparent,transparent 33px,#b8d4e8 33px,#b8d4e8 34px);background-attachment:local;background-position:0 0;background-size:100% 34px;border-left:3px solid #e88e8e;flex:1;margin-left:0;min-height:0;overflow-y:auto;padding:0 8px 0 0}.widget-day-sketch .day-sketch-line{align-items:center;display:flex;height:34px;padding-left:4px;position:relative}.widget-day-sketch .day-sketch-hour-label{color:#a0a0a0;flex-shrink:0;font-family:Segoe Script,Bradley Hand,Comic Sans MS,cursive,-apple-system,BlinkMacSystemFont,Segoe UI,system-ui,sans-serif;font-size:.78rem;font-weight:700;letter-spacing:.02em;text-align:right;text-transform:lowercase;-webkit-user-select:none;user-select:none;width:64px;padding-right:8px}.widget-day-sketch .day-sketch-input{background:#0000;border:none;color:#333;flex:1;font-family:Segoe Script,Bradley Hand,Comic Sans MS,cursive,-apple-system,BlinkMacSystemFont,Segoe UI,system-ui,sans-serif;font-size:.88rem;height:100%;line-height:34px;outline:none;padding:0 4px}.widget-day-sketch .day-sketch-input::placeholder{color:#0000}.widget-day-sketch .day-sketch-input:focus{background:#b8d4e81f}.widget-day-sketch .day-sketch-loading{align-items:center;color:var(--dashboard-color-text-muted);display:flex;font-size:.85rem;height:100%;justify-content:center;padding:24px}.widget-day-sketch .day-sketch-save-btn{background:none;border:1px solid var(--dashboard-color-blue);border-radius:6px;color:var(--dashboard-color-blue);cursor:pointer;font-size:.72rem;font-weight:600;padding:2px 8px;transition:background .15s ease,color .15s ease}.widget-day-sketch .day-sketch-save-btn:hover:not(:disabled){background:var(--dashboard-color-blue);color:var(--dashboard-color-text-on-accent)}.widget-day-sketch .day-sketch-save-btn--disabled{border-color:var(--dashboard-color-text-muted);color:var(--dashboard-color-text-muted);cursor:default;opacity:.5}@media (prefers-color-scheme: dark){.widget-day-sketch .day-sketch-notebook{background-color:#2a2923;background-image:repeating-linear-gradient(transparent,transparent 33px,#4a5568 33px,#4a5568 34px);border-left-color:#7c4444}.widget-day-sketch .day-sketch-hour-label{color:#6b7280}.widget-day-sketch .day-sketch-input{color:#e2e0d8}.widget-day-sketch .day-sketch-input:focus{background:#4a556826}}@keyframes mood-fadeout{0%{opacity:1}to{opacity:0}}.widget-mood .mood-selector{display:flex;gap:8px;justify-content:center;margin-bottom:16px}.widget-mood .mood-btn{align-items:center;background:none;border:2px solid rgba(0,0,0,0);border-radius:50%;cursor:pointer;display:flex;height:44px;justify-content:center;transition:border-color .15s,transform .15s;width:44px}.widget-mood .mood-btn:hover{border-color:var(--dashboard-color-blue);transform:scale(1.15)}.widget-mood .mood-btn--selected{border-color:var(--dashboard-color-blue);background:var(--dashboard-color-blue-light);transform:scale(1.15)}.widget-mood .mood-btn .mood-emoji{font-size:1.5rem}.widget-mood .mood-details{margin-bottom:12px}.widget-mood .mood-details-label{color:var(--dashboard-color-text-secondary);display:block;font-size:.8rem;margin-bottom:4px}.widget-mood .mood-details-textarea{background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,system-ui,sans-serif;font-size:.85rem;padding:8px;resize:vertical;width:100%}.widget-mood .mood-details-textarea:focus{border-color:var(--dashboard-color-blue);outline:none}.widget-mood .mood-details-textarea::placeholder{color:var(--dashboard-color-text-muted)}.widget-mood .mood-submit-row{display:flex;gap:8px;margin-bottom:16px}.widget-mood .mood-submit-btn{background:var(--dashboard-color-blue);border:none;border-radius:6px;color:var(--dashboard-color-text-on-accent);cursor:pointer;flex:1;font-size:.85rem;font-weight:600;padding:8px 16px;transition:opacity .15s}.widget-mood .mood-submit-btn:hover:not(:disabled){opacity:.9}.widget-mood .mood-submit-btn:disabled{cursor:not-allowed;opacity:.6}.widget-mood .mood-cancel-btn{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.85rem;font-weight:600;padding:8px 16px;transition:border-color .15s,color .15s}.widget-mood .mood-cancel-btn:hover:not(:disabled){border-color:var(--dashboard-color-text-secondary);color:var(--dashboard-color-text)}.widget-mood .mood-cancel-btn:disabled{cursor:not-allowed;opacity:.6}.widget-mood .mood-confirmation{align-items:center;animation:mood-fadeout 1s ease-out 4s forwards;display:flex;flex-direction:column;gap:8px;margin-bottom:16px;padding:16px 0}.widget-mood .mood-confirmation-icon{font-size:2.5rem}.widget-mood .mood-confirmation-text{color:var(--dashboard-color-success);font-size:.9rem;font-weight:600}.widget-mood .mood-summary{color:var(--dashboard-color-text-secondary);font-size:.8rem;text-align:center}.widget-mood .mood-sparkline{align-items:flex-end;display:flex;gap:3px;height:24px;justify-content:center;margin-top:8px}.widget-mood .mood-dot{background:var(--dashboard-color-blue);border-radius:2px;min-height:4px;position:relative;width:4px}.widget-mood .mood-viz-section{align-items:center;display:flex;flex-direction:column;gap:4px;margin-top:8px}.widget-mood .mood-viz-canvas-wrap{border-radius:10px;line-height:0;overflow:visible;position:relative}.widget-mood .mood-viz-canvas{border-radius:10px;display:block;height:220px;width:220px}.widget-mood .mood-viz-configure-link{background:none;border:none;color:var(--dashboard-color-text-muted);cursor:pointer;font-size:.75rem;padding:4px 8px;transition:color .15s}.widget-mood .mood-viz-configure-link:hover{color:var(--dashboard-color-text-secondary)}.widget-mood .mood-viz-config-option{align-items:center;cursor:pointer;display:flex;font-size:.9rem;gap:8px;padding:4px 0}.widget-mood .mood-viz-config-option input[type=radio]{accent-color:var(--dashboard-color-blue);cursor:pointer}.widget-peak-hours .peak-hours-metrics-grid{display:grid;gap:12px;grid-template-columns:repeat(3,1fr);margin-bottom:16px}.widget-peak-hours .peak-hours-metric-card{background:var(--dashboard-color-bg-page);border-radius:10px;padding:12px 16px}.widget-peak-hours .peak-hours-metric-label{color:var(--dashboard-color-text-secondary);font-size:.8rem;margin-bottom:4px}.widget-peak-hours .peak-hours-metric-value{color:var(--dashboard-color-navy);font-size:1.25rem;font-weight:600}.widget-peak-hours .peak-hours-legend{color:var(--dashboard-color-text-secondary);display:flex;flex-wrap:wrap;font-size:.75rem;gap:16px;margin-bottom:8px}.widget-peak-hours .peak-hours-legend-item{align-items:center;display:flex;gap:4px}.widget-peak-hours .peak-hours-legend-swatch{border-radius:2px;display:inline-block;height:10px;width:10px}.widget-peak-hours .peak-hours-legend-swatch--created{background:var(--dashboard-color-blue)}.widget-peak-hours .peak-hours-legend-swatch--completed{background:var(--dashboard-color-accent)}.widget-peak-hours .peak-hours-chart-container{height:220px;position:relative;width:100%}.widget-peak-hours .peak-hours-canvas{display:block;height:100%;width:100%}.widget-peak-hours .peak-hours-tooltip{background:var(--dashboard-color-tooltip-bg);border:1px solid var(--dashboard-color-tooltip-border);border-radius:6px;box-shadow:0 2px 8px var(--dashboard-color-tooltip-shadow);color:var(--dashboard-color-tooltip-text);font-size:.75rem;padding:8px 12px;pointer-events:none;position:absolute;white-space:nowrap;z-index:10}.widget-peak-hours .peak-hours-tooltip-header{font-weight:600;margin-bottom:4px}.widget-peak-hours .peak-hours-tooltip-label--created{color:var(--dashboard-color-tooltip-accent)}.widget-peak-hours .peak-hours-tooltip-label--completed{color:var(--dashboard-color-accent)}.widget-peak-hours .peak-hours-footer{color:var(--dashboard-color-text-muted);font-size:.75rem;margin-top:12px;text-align:center}.widget-peak-hours .peak-hours-empty{padding:24px;text-align:center}.widget-peak-hours .peak-hours-empty p{color:var(--dashboard-color-text-secondary);font-size:.85rem;margin:0}.vertical-1-cell .widget-peak-hours .peak-hours-metrics-grid{gap:8px}.vertical-1-cell .widget-peak-hours .peak-hours-metric-card{padding:4px 8px}.vertical-1-cell .widget-peak-hours .peak-hours-metric-label{font-size:.7rem;margin-bottom:0}.vertical-1-cell .widget-peak-hours .peak-hours-metric-value{font-size:1rem}.vertical-1-cell .widget-peak-hours .peak-hours-legend{margin-bottom:4px}.vertical-1-cell .widget-peak-hours .peak-hours-chart-container{height:160px}.vertical-1-cell .widget-peak-hours .peak-hours-footer{margin-top:8px}.horizontal-2-cell .widget-peak-hours .peak-hours-chart-container{height:220px}.vertical-2-cell .widget-peak-hours .peak-hours-chart-container{height:380px}.horizontal-2-cell.vertical-2-cell .widget-peak-hours .peak-hours-chart-container{height:440px}.widget-quotes .widget-body{display:flex;flex-direction:column}.widget-quotes .quotes-grid{display:grid;flex:1;gap:16px;grid-template-columns:1fr 1fr}.widget-quotes .quote-tile{background-position:center;background-size:cover;border-radius:10px;color:var(--dashboard-color-text-on-accent);display:flex;flex-direction:column;justify-content:flex-end;min-height:150px;padding:24px 16px}.widget-quotes .quote-tile .quote-text{font-family:Georgia,Times New Roman,serif;font-size:.95rem;font-style:italic;line-height:1.5;margin:0 0 8px}.widget-quotes .quote-tile .quote-author{font-size:.75rem;opacity:.85}.widget-quotes .quotes-loading{color:var(--dashboard-color-text-secondary);font-size:.85rem;padding:24px 0;text-align:center}.widget-quick-actions .qa-grid{display:grid;gap:8px;grid-template-columns:1fr 1fr}.widget-quick-actions .qa-button{align-items:center;background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:10px;cursor:pointer;display:flex;flex-direction:column;gap:8px;padding:16px 8px;transition:background .15s}.widget-quick-actions .qa-button:hover{background:var(--dashboard-color-bg-page-hover)}.widget-quick-actions .qa-button .qa-icon{font-size:1.4rem}.widget-quick-actions .qa-button .qa-label{color:var(--dashboard-color-text);font-size:.75rem;font-weight:500}.widget-recent-notes .widget-body{display:flex;flex-direction:column;overflow:hidden}.widget-recent-notes .note-list{display:flex;flex:1;flex-direction:column;gap:4px;list-style:none;min-height:0;overflow-y:auto}.widget-recent-notes .note-item{display:flex}.widget-recent-notes .note-item:hover{background-color:var(--dashboard-color-bg-page)}.widget-recent-notes .note-link{align-items:center;background:none;border:none;border-radius:6px;color:inherit;cursor:pointer;display:flex;font-family:inherit;gap:8px;justify-content:space-between;padding:8px 12px;text-align:left;width:100%}.widget-recent-notes .note-name{color:var(--dashboard-color-text);flex:1;font-size:.85rem;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.widget-recent-notes .note-count{color:var(--dashboard-color-text-muted);flex-shrink:0;font-size:.75rem;white-space:nowrap}.widget-recent-notes .note-loading,.widget-recent-notes .note-empty,.widget-recent-notes .note-error{color:var(--dashboard-color-text-secondary);font-size:.85rem;padding:12px 0;text-align:center}.widget-recent-notes .note-error{color:var(--dashboard-color-danger)}.dashboard-toolbar .task-domains{align-items:center;background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:6px;display:flex;gap:12px;padding:8px 12px}.dashboard-toolbar .task-domains-list{align-items:center;display:flex;flex:1;flex-wrap:wrap;gap:8px}.dashboard-toolbar .task-domain-item{align-items:center;border:1px solid rgba(0,0,0,0);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;display:inline-flex;font-size:.8rem;font-weight:500;gap:4px;padding:4px 12px;transition:all .15s ease}.dashboard-toolbar .task-domain-item:hover{background:var(--dashboard-color-blue-light);color:var(--dashboard-color-navy)}.dashboard-toolbar .task-domain-item.active{background:var(--dashboard-color-navy);border-color:var(--dashboard-color-navy);color:var(--dashboard-color-bg-card)}.dashboard-toolbar .task-domain-item.active .task-domain-settings{color:var(--dashboard-color-text-on-accent-muted)}.dashboard-toolbar .task-domain-item.active .task-domain-settings:hover{color:var(--dashboard-color-text-on-accent)}.dashboard-toolbar .task-domain-name{-webkit-user-select:none;user-select:none}.dashboard-toolbar .task-domain-settings{background:none;border:none;color:var(--dashboard-color-text-muted);cursor:pointer;font-size:.85rem;line-height:1;padding:0}.dashboard-toolbar .task-domain-settings:hover{color:var(--dashboard-color-navy)}.dashboard-toolbar .task-domains-refresh{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.75rem;padding:4px 8px;white-space:nowrap}@media (max-width: 800px){.dashboard-toolbar .task-domains-refresh{display:none}}.dashboard-toolbar .task-domains-refresh:hover{color:var(--dashboard-color-navy)}.dashboard-toolbar .task-domains-refresh:disabled{cursor:default;opacity:.5}.dashboard-toolbar .task-domains-empty{color:var(--dashboard-color-text-muted);font-size:.8rem}.dashboard-toolbar .task-domains--empty .task-domains-empty{flex:1 1 100%;font-weight:500}.widget-victory-value .widget-body{display:flex;flex-direction:column;justify-content:space-between}.widget-victory-value .vv-header{align-items:baseline;display:flex;gap:8px;margin-bottom:8px}.widget-victory-value .vv-header .vv-total{color:var(--dashboard-color-navy);font-size:2rem;font-weight:700}.widget-victory-value .vv-header .vv-label{color:var(--dashboard-color-text-secondary);font-size:.8rem}.widget-victory-value .vv-date-range{color:var(--dashboard-color-text-secondary);font-size:.75rem;font-weight:400}.widget-victory-value .vv-chart-container{align-items:center;display:flex;gap:4px}.widget-victory-value .vv-chart-wrap{flex:1;min-width:0;position:relative}.widget-victory-value .vv-chart{border-radius:6px;display:block;width:100%}.widget-victory-value .vv-nav-arrow{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;flex-shrink:0;font-size:1.25rem;line-height:1;padding:4px 8px;transition:background .15s,color .15s}.widget-victory-value .vv-nav-arrow:hover:not(:disabled){background:var(--dashboard-color-bg-page-hover);color:var(--dashboard-color-navy)}.widget-victory-value .vv-nav-arrow:disabled{cursor:not-allowed;opacity:.3}.vertical-1-cell .widget-victory-value .vv-chart{height:180px}.horizontal-2-cell .widget-victory-value .vv-chart{height:260px}.vertical-2-cell .widget-victory-value .vv-chart{height:380px}.horizontal-2-cell.vertical-2-cell .widget-victory-value .vv-chart{height:460px}:root{--dashboard-color-accent: #e8853d;--dashboard-color-agenda-priority-critical: #e85353;--dashboard-color-agenda-priority-important: #e8853d;--dashboard-color-agenda-priority-normal: #7a8699;--dashboard-color-agenda-priority-urgent: #5b7bbf;--dashboard-color-bg-card: #ffffff;--dashboard-color-bg-page: #eef1f5;--dashboard-color-bg-page-hover: #e6ebf2;--dashboard-color-blue: #5b7bbf;--dashboard-color-blue-light: #e8edf5;--dashboard-color-border: #d8dde6;--dashboard-color-danger: #e85353;--dashboard-color-info: #5b7bbf;--dashboard-color-link: #5b7bbf;--dashboard-color-navy: #2c3e6b;--dashboard-color-overlay-backdrop: rgba(0, 0, 0, .4);--dashboard-color-overlay-shadow: rgba(0, 0, 0, .15);--dashboard-color-success: #4caf80;--dashboard-color-text: #1e2a3a;--dashboard-color-text-muted: #a3aebb;--dashboard-color-text-on-accent: #ffffff;--dashboard-color-text-on-accent-muted: rgba(255, 255, 255, .6);--dashboard-color-text-secondary: #7a8699;--dashboard-color-tooltip-accent: #5b7bbf;--dashboard-color-tooltip-bg: #1f2937;--dashboard-color-tooltip-border: rgba(255, 255, 255, .15);--dashboard-color-tooltip-shadow: rgba(0, 0, 0, .3);--dashboard-color-tooltip-text: #f9fafb;--dashboard-color-tooltip-text-muted: rgba(255, 255, 255, .5);--dashboard-color-warning: #e8853d;--dashboard-color-plan-created-bg: rgba(76, 175, 128, .08);--dashboard-color-plan-created-border: #4caf80}@media (prefers-color-scheme: dark){:root{--dashboard-color-accent: #ffb36b;--dashboard-color-agenda-priority-critical: #ff7a7a;--dashboard-color-agenda-priority-important: #ffb36b;--dashboard-color-agenda-priority-normal: #a3b0c4;--dashboard-color-agenda-priority-urgent: #8fb2ff;--dashboard-color-bg-card: #1f2937;--dashboard-color-bg-page: #111827;--dashboard-color-bg-page-hover: #1a2436;--dashboard-color-blue: #8fb2ff;--dashboard-color-blue-light: #253553;--dashboard-color-border: #374151;--dashboard-color-danger: #ff7a7a;--dashboard-color-info: #8fb2ff;--dashboard-color-link: #60a5fa;--dashboard-color-navy: #c5d8ff;--dashboard-color-overlay-backdrop: rgba(0, 0, 0, .5);--dashboard-color-overlay-shadow: rgba(0, 0, 0, .4);--dashboard-color-success: #73d4a3;--dashboard-color-text: #e5ecf5;--dashboard-color-text-muted: #95a3b8;--dashboard-color-text-on-accent: #ffffff;--dashboard-color-text-on-accent-muted: rgba(255, 255, 255, .6);--dashboard-color-text-secondary: #b6c0cf;--dashboard-color-tooltip-accent: #a5b4fc;--dashboard-color-tooltip-bg: #1f2937;--dashboard-color-tooltip-border: rgba(255, 255, 255, .15);--dashboard-color-tooltip-shadow: rgba(0, 0, 0, .5);--dashboard-color-tooltip-text: #f9fafb;--dashboard-color-tooltip-text-muted: rgba(255, 255, 255, .5);--dashboard-color-warning: #ffb36b;--dashboard-color-plan-created-bg: rgba(115, 212, 163, .1);--dashboard-color-plan-created-border: #73d4a3}}html{overflow-y:scroll}html *,html *:before,html *:after{box-sizing:border-box;margin:0;padding:0}html body{-webkit-font-smoothing:antialiased;background:var(--dashboard-color-bg-page);color:var(--dashboard-color-text);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,system-ui,sans-serif}.dashboard-outer-container{min-height:100vh;overflow-x:hidden;position:relative;width:100%}.dashboard-outer-container .dashboard-content{margin:0 auto;max-width:1200px;padding:24px}.dashboard-outer-container .dashboard-content .dashboard-grid{display:grid;gap:16px;grid-template-columns:repeat(4,1fr)}.dashboard-outer-container .dashboard-content .grid-cell{--drag-scale: 1;--flip-x: 0px;--flip-y: 0px;opacity:.95;min-width:0;transform:translate(var(--flip-x),var(--flip-y)) scale(var(--drag-scale));transition:opacity .3s ease,transform .22s ease;will-change:transform}.dashboard-outer-container .dashboard-content .grid-cell:hover{opacity:1}.dashboard-outer-container .dashboard-content .grid-cell.horizontal-2-cell{grid-column:span 2}.dashboard-outer-container .dashboard-content .grid-cell.horizontal-3-cell{grid-column:span 3}.dashboard-outer-container .dashboard-content .grid-cell.horizontal-4-cell{grid-column:span 4}.dashboard-outer-container .dashboard-content .grid-cell.vertical-1-cell{max-height:400px;min-height:300px}.dashboard-outer-container .dashboard-content .grid-cell.vertical-2-cell{grid-row:span 2;max-height:800px;min-height:600px}.dashboard-outer-container .dashboard-content .grid-cell.grid-cell--drag-active{cursor:grabbing}.dashboard-outer-container .dashboard-content .grid-cell.grid-cell--dragging-ready{animation:widget-wobble .35s ease-in-out infinite alternate;opacity:1;z-index:3}.dashboard-outer-container .dashboard-content .grid-cell.grid-cell--drag-shift{--drag-scale: .985}@media (max-width: 800px){.dashboard-outer-container .dashboard-content{padding:12px}.dashboard-outer-container .dashboard-content .dashboard-grid{grid-template-columns:1fr}.dashboard-outer-container .dashboard-content .grid-cell.horizontal-2-cell,.dashboard-outer-container .dashboard-content .grid-cell.horizontal-3-cell,.dashboard-outer-container .dashboard-content .grid-cell.horizontal-4-cell{grid-column:span 1}.dashboard-outer-container .dashboard-content .grid-cell.vertical-1-cell,.dashboard-outer-container .dashboard-content .grid-cell.vertical-2-cell{grid-row:span 1;max-height:none;min-height:auto}}.dashboard-outer-container .widget{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:14px;display:flex;flex-direction:column;height:100%;max-width:100%;overflow:hidden}.dashboard-outer-container .widget-header{align-items:center;border-bottom:1px solid var(--dashboard-color-border);display:flex;gap:8px;padding:12px 16px}.dashboard-outer-container .widget-heading-bar{-webkit-user-select:none;user-select:none}.dashboard-outer-container .widget-heading-bar.widget-heading-bar--drag-ready{cursor:grabbing}.dashboard-outer-container .widget-icon{font-size:1rem}.dashboard-outer-container .widget-title{align-items:baseline;color:var(--dashboard-color-navy);display:flex;flex:1;font-size:.85rem;font-weight:700;gap:8px;letter-spacing:.03em;margin:0;text-transform:uppercase}.dashboard-outer-container .widget-title__subtitle{color:var(--dashboard-color-text-muted);font-size:.75rem;font-weight:400;letter-spacing:.01em;text-transform:none}.dashboard-outer-container .widget-configure,.dashboard-outer-container .widget-header-action{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.75rem;padding:4px 8px}.dashboard-outer-container .widget-configure:hover,.dashboard-outer-container .widget-header-action:hover{color:var(--dashboard-color-navy)}.dashboard-outer-container .widget-body{flex:1;padding:16px}.dashboard-outer-container .dashboard-loading{align-items:center;color:var(--dashboard-color-text-secondary);display:flex;flex-direction:column;gap:16px;height:100vh;justify-content:center;width:100%}.dashboard-outer-container .dashboard-loading .spinner{animation:spin .8s linear infinite;border:3px solid var(--dashboard-color-border);border-radius:50%;border-top-color:var(--dashboard-color-blue);height:32px;width:32px}.dashboard-outer-container .dashboard-error{color:var(--dashboard-color-danger);padding:40px;text-align:center}.dashboard-outer-container .dashboard-error p{color:var(--dashboard-color-text-secondary);margin-top:8px}.dashboard-outer-container .widget-error-fallback{align-items:center;background:var(--dashboard-color-bg-card);border:1px dashed var(--dashboard-color-danger);border-radius:10px;display:flex;flex-direction:column;gap:8px;height:100%;justify-content:center;padding:24px;text-align:center}.dashboard-outer-container .widget-error-fallback-title{color:var(--dashboard-color-danger);font-size:.9rem;font-weight:700}.dashboard-outer-container .widget-error-fallback-message{color:var(--dashboard-color-text-muted);font-size:.8rem;max-width:280px;word-break:break-word}.dashboard-outer-container .widget-error-fallback-retry{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.75rem;margin-top:4px;padding:4px 12px;transition:color .15s ease,border-color .15s ease}.dashboard-outer-container .widget-error-fallback-retry:hover{border-color:var(--dashboard-color-navy);color:var(--dashboard-color-navy)}@keyframes spin{to{transform:rotate(360deg)}}@keyframes widget-wobble{0%{transform:rotate(-1.5deg)}to{transform:rotate(1.5deg)}}
`;
function buildEmbedHTML() {
return `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>${compiledCSS}</style>
</head>
<body>
<div id="dashboard-root"></div>
<script type="text/javascript" src="data:text/javascript;base64,${clientBase64}"><\/script>
</body>
</html>`;
}
var SETTING_KEYS = {
BACKGROUND_IMAGE_URL: "Background Image URL",
BACKGROUND_IMAGE_MODE: "Background Image Mode",
CONSOLE_LOGGING: "Console logging",
DASHBOARD_COMPONENTS: "dashboard_elements",
LLM_API_KEY_ANTHROPIC: "Anthropic API Key",
LLM_API_KEY_GEMINI: "Gemini API Key",
LLM_API_KEY_GROK: "Grok API Key",
LLM_API_KEY_OPENAI: "OpenAI API Key",
LLM_PROVIDER_MODEL: "LLM Provider",
TASK_DOMAINS: "dashboard_task_domains",
PLANNING_NOTE_TAG: "Tag to apply to planning notes"
};
var API_KEY_FROM_PROVIDER = {
anthropic: SETTING_KEYS.LLM_API_KEY_ANTHROPIC,
gemini: SETTING_KEYS.LLM_API_KEY_GEMINI,
grok: SETTING_KEYS.LLM_API_KEY_GROK,
openai: SETTING_KEYS.LLM_API_KEY_OPENAI
};
function widgetConfigKey(widgetId) {
return `dashboard_${widgetId}_config`;
}
var DASHBOARD_COMPONENTS = SETTING_KEYS.DASHBOARD_COMPONENTS;
var TASK_DOMAIN_SETTING = SETTING_KEYS.TASK_DOMAINS;
var PLANNING_NOTE_TAG_LABEL = SETTING_KEYS.PLANNING_NOTE_TAG;
var TASK_DOMAIN_STALE_MS = 24 * 60 * 60 * 1e3;
var WIDGET_REGISTRY = [
{
widgetId: "planning",
name: "Quarterly Planning",
description: "Plan and track your quarterly goals and priorities",
icon: "\u{1F4CB}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "victory-value",
name: "Victory Value",
description: "Celebrate wins and track high-value task completions",
icon: "\u{1F3C6}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "mood",
name: "Mood Tracker",
visibleTitle: "How are you feeling?",
description: "Log your daily mood and visualize trends over time",
icon: "\u{1F3AD}",
defaultGridWidthSize: 1,
maxHorizontalTiles: 2,
maxVerticalTiles: 2
},
{
widgetId: "calendar",
name: "Calendar",
description: "See upcoming events and appointments at a glance",
icon: "\u{1F4C5}",
defaultGridWidthSize: 1,
maxHorizontalTiles: 2,
maxVerticalTiles: 2
},
{
widgetId: "agenda",
name: "Task Agenda",
description: "View and manage your prioritized task list",
icon: "\u{1F4CC}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "quotes",
name: "Inspiration Quotes",
description: "Rotating inspirational quotes to keep you motivated",
icon: "\u{1F4A1}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "recent-notes",
name: "Revisit Candidate",
description: "Notes with open tasks that have not had a new task in over a week",
icon: "\u{1F4DD}",
defaultGridWidthSize: 1,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "quick-actions",
name: "Quick Actions",
description: "Shortcuts for your most frequently used dashboard actions",
icon: "\u26A1",
defaultGridWidthSize: 1,
maxHorizontalTiles: 2,
maxVerticalTiles: 2
},
{
widgetId: "dream-task",
name: "Goal Coach",
description: "Get task suggestions that blend quarterly/monthly goals with day-of-week preferences",
icon: "\u{1F52E}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "peak-hours",
name: "Peak Hours",
description: "Hourly distribution of task creation and completion activity",
icon: "\u23F0",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "day-sketch",
name: "Day Sketcher",
description: "Notebook-paper day planner with hour-by-hour entries saved to a note",
icon: "\u{1F5D2}\uFE0F",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
}
];
var DEFAULT_DASHBOARD_COMPONENTS = WIDGET_REGISTRY.map((w) => ({
widgetId: w.widgetId,
gridWidthSize: w.defaultGridWidthSize,
gridHeightSize: 1,
settings: {}
}));
var FULL_MONTH_NAMES = [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
];
function getCurrentQuarter() {
const now = new Date();
const year = now.getFullYear();
const month = now.getMonth();
const quarter = Math.floor(month / 3) + 1;
return { year, quarter, label: `Q${quarter} ${year}` };
}
function getNextQuarter() {
let { year, quarter } = getCurrentQuarter();
quarter++;
if (quarter > 4) {
quarter = 1;
year++;
}
return { year, quarter, label: `Q${quarter} ${year}` };
}
var _enabled = false;
function setLoggingEnabled(settingValue) {
if (typeof settingValue === "boolean") {
_enabled = settingValue;
return;
}
const normalized = String(settingValue || "").trim().toLowerCase();
_enabled = ["true", "yes", "1", "on", "enabled"].includes(normalized);
}
function logIfEnabled(...args) {
if (_enabled) {
console.log(...args);
}
}
function dateFromDateInput(dateInput, { throwOnInvalid = true } = {}) {
const fail = () => {
if (!throwOnInvalid)
return null;
throw new TypeError(`Invalid date input: ${String(dateInput)}`);
};
if (dateInput == null || dateInput === "")
return fail();
if (dateInput instanceof Date) {
const date = new Date(dateInput);
return Number.isNaN(date.getTime()) ? fail() : date;
}
if (typeof dateInput === "number") {
if (!Number.isFinite(dateInput))
return fail();
const millis = Math.abs(dateInput) < 1e10 ? dateInput * 1e3 : dateInput;
const parsed2 = new Date(millis);
return Number.isNaN(parsed2.getTime()) ? fail() : parsed2;
}
if (typeof dateInput === "string") {
const trimmed = dateInput.trim();
if (!trimmed)
return fail();
if (/^\d{4}-\d{2}-\d{2}$/.test(dateInput)) {
const [year, month, day] = dateInput.split("-").map(Number);
return new Date(year, month - 1, day);
}
const numericValue = Number(trimmed);
if (!Number.isNaN(numericValue))
return dateFromDateInput(numericValue, { throwOnInvalid });
const parsed2 = new Date(trimmed);
return Number.isNaN(parsed2.getTime()) ? fail() : parsed2;
}
const parsed = new Date(dateInput);
return Number.isNaN(parsed.getTime()) ? fail() : parsed;
}
function weekStartFromDateInput(dateInput, weekStartDay = 1) {
const date = dateFromDateInput(dateInput);
const dayOfWeek = date.getDay();
const delta = (dayOfWeek - weekStartDay + 7) % 7;
const weekStart = new Date(date.getFullYear(), date.getMonth(), date.getDate() - delta);
weekStart.setHours(0, 0, 0, 0);
return weekStart;
}
function weekEndFromDateInput(dateInput, weekStartDay = 1) {
const weekStart = weekStartFromDateInput(dateInput, weekStartDay);
const weekEnd = new Date(weekStart);
weekEnd.setDate(weekEnd.getDate() + 6);
weekEnd.setHours(23, 59, 59, 999);
return weekEnd;
}
async function fetchDashboardData(app) {
setLoggingEnabled(app.settings[SETTING_KEYS.CONSOLE_LOGGING]);
const now = new Date();
const weekStart = weekStartFromDateInput(now);
const weekEnd = weekEndFromDateInput(now);
let taskDomainInfo = { domains: [], selectedDomainUuid: null };
try {
taskDomainInfo = await _resolveTaskDomains(app);
} catch (err) {
logIfEnabled("[fetchDashboardData] _resolveTaskDomains failed, continuing with empty domains:", err);
}
const twoWeeksAgoUnixSeconds = Math.floor(Date.now() / 1e3) - 60 * 60 * 24 * 14;
const results = await Promise.allSettled([
_safeMoodRatings(app, twoWeeksAgoUnixSeconds),
_findQuarterlyPlans(app),
_readDashboardSettings(app),
_fetchTasksForDomain(app, taskDomainInfo.selectedDomainUuid)
]);
const moodRatings = _settledValueOr(results[0], [], "moodRatings");
const quarterlyPlans = _settledValueOr(results[1], null, "quarterlyPlans");
const settings = _settledValueOr(results[2], {}, "settings");
const domainTasks = _settledValueOr(results[3], [], "domainTasks");
return {
activeTaskDomain: taskDomainInfo.selectedDomainUuid,
completedThisWeek: _filterCompletedInRange(domainTasks, weekStart, weekEnd),
currentDate: now.toISOString(),
dailyVictoryValues: _calculateDailyVictoryValues(domainTasks, weekStart),
moodRatings,
pluginNoteUUID: app.context?.noteUUID || null,
quarterlyPlans,
settings,
tasks: domainTasks,
todayTasks: _filterTodayTasks(domainTasks, now),
taskDomains: taskDomainInfo.domains,
weeklyVictoryValue: _calculateWeeklyVictoryValue(domainTasks, weekStart, weekEnd)
};
}
async function _resolveTaskDomains(app) {
const raw = app.settings[SETTING_KEYS.TASK_DOMAINS];
let stored = {};
try {
stored = raw ? JSON.parse(raw) : {};
} catch {
stored = {};
}
const isStale = !stored.lastRetrieved || Date.now() - stored.lastRetrieved > TASK_DOMAIN_STALE_MS;
const hasDomains = Array.isArray(stored.domains) && stored.domains.length > 0;
if (!hasDomains || isStale) {
const freshDomains = await app.getTaskDomains();
stored.domains = (Array.isArray(freshDomains) ? freshDomains : []).filter((d) => d && d.uuid).map((d) => ({ name: d.name, uuid: d.uuid }));
stored.lastRetrieved = Date.now();
const selectedStillExists = stored.selectedDomainUuid && stored.domains.some((d) => d.uuid === stored.selectedDomainUuid);
if (!selectedStillExists) {
stored.selectedDomainUuid = _pickDefaultDomain(stored.domains);
}
await app.setSetting(SETTING_KEYS.TASK_DOMAINS, JSON.stringify(stored));
}
if (!stored.selectedDomainUuid && stored.domains.length > 0) {
stored.selectedDomainUuid = _pickDefaultDomain(stored.domains);
await app.setSetting(SETTING_KEYS.TASK_DOMAINS, JSON.stringify(stored));
}
return stored;
}
function _settledValueOr(result, fallback, label) {
if (result.status === "fulfilled")
return result.value;
logIfEnabled(`[fetchDashboardData] ${label} fetch failed, using fallback:`, result.reason);
return fallback;
}
function _pickDefaultDomain(domains) {
if (!domains || domains.length === 0)
return null;
const work = domains.find((d) => d.name === "Work");
return work ? work.uuid : domains[0].uuid;
}
async function _fetchTasksForDomain(app, domainUuid) {
if (!domainUuid)
return [];
try {
const tasks = await app.getTaskDomainTasks(domainUuid);
return Array.isArray(tasks) ? tasks : [];
} catch (err) {
logIfEnabled(`[_fetchTasksForDomain] getTaskDomainTasks failed for domain ${domainUuid}:`, err);
return [];
}
}
function _filterTodayTasks(tasks, now) {
const dayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();
const dayEnd = dayStart + 864e5;
return tasks.filter(
(t) => !t.completedAt && !t.dismissedAt && _millisFromTimestamp(t.startAt) && _millisFromTimestamp(t.startAt) >= dayStart && _millisFromTimestamp(t.startAt) < dayEnd
).sort((a, b) => (_millisFromTimestamp(a.startAt) || 0) - (_millisFromTimestamp(b.startAt) || 0));
}
function _filterCompletedInRange(tasks, start, end) {
const startMs = start.getTime();
const endMs = end.getTime();
return tasks.filter(
(t) => _millisFromTimestamp(t.completedAt) && _millisFromTimestamp(t.completedAt) >= startMs && _millisFromTimestamp(t.completedAt) <= endMs
);
}
function _calculateWeeklyVictoryValue(tasks, weekStart, weekEnd) {
return _filterCompletedInRange(tasks, weekStart, weekEnd).reduce((sum, t) => sum + (t.victoryValue || 0), 0);
}
function _calculateDailyVictoryValues(tasks, weekStart) {
const days = Array.from({ length: 7 }, (_, i) => {
const dayStart = new Date(weekStart);
dayStart.setDate(dayStart.getDate() + i);
const dayEnd = new Date(dayStart);
dayEnd.setDate(dayEnd.getDate() + 1);
const dayTasks = tasks.filter(
(t) => _millisFromTimestamp(t.completedAt) && _millisFromTimestamp(t.completedAt) >= dayStart.getTime() && _millisFromTimestamp(t.completedAt) < dayEnd.getTime()
);
return {
day: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"][i],
date: dayStart.toISOString(),
value: dayTasks.reduce((sum, t) => sum + (t.victoryValue || 0), 0),
taskCount: dayTasks.length
};
});
return days;
}
async function _safeMoodRatings(app, fromUnixSeconds) {
const moodRatings = await app.getMoodRatings(fromUnixSeconds);
logIfEnabled("Mood ratings", moodRatings, "from", fromUnixSeconds);
return moodRatings;
}
async function _findQuarterlyPlans(app) {
const current = getCurrentQuarter();
const next = getNextQuarter();
logIfEnabled(`[_findQuarterlyPlans] querying: "${current.label} Plan", "${next.label} Plan"`);
const [currentPlans, nextPlans] = await Promise.all([
app.filterNotes({ query: `${current.label} Plan` }),
app.filterNotes({ query: `${next.label} Plan` })
]);
logIfEnabled(`[_findQuarterlyPlans] filterNotes results \u2014 current:`, currentPlans, `next:`, nextPlans);
const currentNoteUUID = currentPlans.find((n) => n.name === `${current.label} Plan`)?.uuid;
const nextNoteUUID = nextPlans.find((n) => n.name === `${next.label} Plan`)?.uuid;
logIfEnabled(`[_findQuarterlyPlans] resolved UUIDs \u2014 current: ${currentNoteUUID}, next: ${nextNoteUUID}`);
const currentMonths = _quarterMonthNames(current.quarter);
const nextMonths = _quarterMonthNames(next.quarter);
const [currentHasAll, nextHasAll] = await Promise.all([
currentNoteUUID ? _hasAllMonthSections(app, currentNoteUUID, currentMonths) : Promise.resolve(false),
nextNoteUUID ? _hasAllMonthSections(app, nextNoteUUID, nextMonths) : Promise.resolve(false)
]);
logIfEnabled(`[_findQuarterlyPlans] hasAllMonthlyDetails \u2014 current: ${currentHasAll}, next: ${nextHasAll}`);
return {
current: { ...current, noteUUID: currentNoteUUID, hasAllMonthlyDetails: currentHasAll },
next: { ...next, noteUUID: nextNoteUUID, hasAllMonthlyDetails: nextHasAll }
};
}
function _quarterMonthNames(quarter) {
const start = (quarter - 1) * 3;
return [0, 1, 2].map((i) => FULL_MONTH_NAMES[(start + i) % 12]);
}
async function _hasAllMonthSections(app, noteUUID, monthNames) {
try {
const sections = await app.getNoteSections({ uuid: noteUUID });
return monthNames.every(
(name) => sections.some((s) => s.heading?.text?.trim().toLowerCase() === name.toLowerCase())
);
} catch {
return false;
}
}
async function _readDashboardSettings(app) {
const keys = [
widgetConfigKey("victory-value"),
widgetConfigKey("calendar"),
widgetConfigKey("quotes"),
widgetConfigKey("mood"),
widgetConfigKey("recent-notes")
];
const settings = {};
for (const key of keys) {
try {
const val = app.settings[key];
settings[key] = val ? JSON.parse(val) : null;
} catch {
settings[key] = null;
}
}
settings[SETTING_KEYS.BACKGROUND_IMAGE_URL] = app.settings[SETTING_KEYS.BACKGROUND_IMAGE_URL] || "";
settings[SETTING_KEYS.BACKGROUND_IMAGE_MODE] = app.settings[SETTING_KEYS.BACKGROUND_IMAGE_MODE] || "cover";
settings[SETTING_KEYS.CONSOLE_LOGGING] = app.settings[SETTING_KEYS.CONSOLE_LOGGING] || "";
settings[SETTING_KEYS.LLM_PROVIDER_MODEL] = app.settings[SETTING_KEYS.LLM_PROVIDER_MODEL] || "";
settings[SETTING_KEYS.LLM_API_KEY_ANTHROPIC] = app.settings[SETTING_KEYS.LLM_API_KEY_ANTHROPIC] || "";
settings[SETTING_KEYS.LLM_API_KEY_GEMINI] = app.settings[SETTING_KEYS.LLM_API_KEY_GEMINI] || "";
settings[SETTING_KEYS.LLM_API_KEY_GROK] = app.settings[SETTING_KEYS.LLM_API_KEY_GROK] || "";
settings[SETTING_KEYS.LLM_API_KEY_OPENAI] = app.settings[SETTING_KEYS.LLM_API_KEY_OPENAI] || "";
let componentLayout = null;
try {
componentLayout = app.settings[SETTING_KEYS.DASHBOARD_COMPONENTS] ? JSON.parse(app.settings[SETTING_KEYS.DASHBOARD_COMPONENTS]) : null;
} catch {
componentLayout = null;
}
if (!Array.isArray(componentLayout) || componentLayout.length === 0) {
componentLayout = DEFAULT_DASHBOARD_COMPONENTS.map((component) => ({ ...component }));
await app.setSetting(SETTING_KEYS.DASHBOARD_COMPONENTS, JSON.stringify(componentLayout));
}
settings[SETTING_KEYS.DASHBOARD_COMPONENTS] = componentLayout;
return settings;
}
function _millisFromTimestamp(timestamp) {
if (timestamp == null)
return null;
if (typeof timestamp !== "number") {
const parsed = Number(timestamp);
if (!Number.isFinite(parsed))
return null;
return parsed < 1e10 ? parsed * 1e3 : parsed;
}
return timestamp < 1e10 ? timestamp * 1e3 : timestamp;
}
var plugin = {
constants: {},
appOption: {
"Open Dashboard": async function(app) {
await app.openSidebarEmbed(1.5);
},
"Open Dashboard (Full)": async function(app) {
await app.openEmbed();
}
},
async renderEmbed(app) {
try {
return buildEmbedHTML();
} catch (error) {
logIfEnabled("Dashboard renderEmbed error:", error);
return `<div style="padding:20px;color:red;">Dashboard failed to load: ${error.message}</div>`;
}
},
async onEmbedCall(app, actionType, ...args) {
setLoggingEnabled(app.settings[SETTING_KEYS.CONSOLE_LOGGING]);
try {
switch (actionType) {
case "attachNoteMedia":
const noteHandle = { uuid: app.context.noteUUID };
logIfEnabled(`[plugin] attachNoteMedia called \u2014 uploading to plugin note ${noteHandle.uuid}`);
const result = await app.attachNoteMedia(noteHandle, args[1]);
logIfEnabled(`[plugin] attachNoteMedia result:`, result ? "(URL received)" : "(no URL)");
return result;
case "configure":
return await this._handleConfigure(app, args[0]);
case "init":
return await fetchDashboardData(app);
default:
if (typeof app[actionType] === "function") {
return await app[actionType](...args);
}
logIfEnabled(`Unknown embed action: ${actionType}`);
return null;
}
} catch (error) {
logIfEnabled(`onEmbedCall error (${actionType}):`, error);
return { error: error.message };
}
},
async _handleConfigure(app, widgetId) {
const configs = {
"victory-value": {
title: "Configure Victory Value",
inputs: [
{ label: "Time range", type: "radio", options: [
{ label: "This week", value: "week" },
{ label: "This month", value: "month" },
{ label: "Last 30 days", value: "30days" }
] },
{ label: "Show mood overlay", type: "checkbox", value: true }
]
},
"calendar": {
title: "Configure Calendar",
inputs: [
{ label: "Week starts on", type: "radio", options: [
{ label: "Sunday", value: "0" },
{ label: "Monday", value: "1" }
] }
]
},
"quotes": {
title: "Configure Quotes",
inputs: [
{ label: "Quote style", type: "radio", options: [
{ label: "Motivational", value: "motivational" },
{ label: "Philosophical", value: "philosophical" },
{ label: "From quarterly goals", value: "goals" }
] }
]
}
};
const config = configs[widgetId];
if (!config)
return null;
const result = await app.prompt(config.title, { inputs: config.inputs });
if (!result)
return null;
await app.setSetting(widgetConfigKey(widgetId), JSON.stringify(
Array.isArray(result) ? result : [result]
));
return result;
}
};
return plugin;
})()