Анализ страницы https://www.mann-ivanov-ferber.ru/courses/
Основное Готовность: 100%
Домен
mann-ivanov-ferber.ru
Состояние доменного имени
?
Проверяем корректность доменного имени и наличие технических проблем на уровне домена.
Длина домена велика. Но если вы продвигаете запрос, входящий в название домена, то это хорошо.
Домен второго уровня идеален для продвижения.
Регистратор домена - REGRU-RU
Дата регистрации домена 27.10.2004 (более 20 лет назад)
Ответ сервера
200 Успешный ответ
HTTP-код ответа и цепочка редиректов
?
Код 200 — страница доступна. Коды 3xx — редиректы (цепочки замедляют загрузку и размывают ссылочный вес). Коды 4xx/5xx — ошибки, поисковик не сможет проиндексировать страницу.
Сервер настроен корректно.
Безопасность
Сайт безопасен
Использование HTTPS и SSL-сертификат
?
HTTPS — обязательный стандарт. Google и Яндекс отдают предпочтение защищённым сайтам. Отсутствие SSL или просроченный сертификат ведут к предупреждениям в браузере и снижению позиций.
Не настроен HSTS (Strict-Transport-Security) — рекомендуется включить.
На сайте работает защищенный протокол ssl и сайт открывается по https.
Ssl-сертификат действителен до 08.11.2026 2:13:48.
Поздравляем! Сайт не содержится в реестре РКН.
Кодировка
UTF-8
Кодировка символов страницы
?
Стандарт — UTF-8. Неправильная кодировка вызывает нечитаемые символы и мешает поисковику корректно распознать текст страницы.
Указана кодировка на странице UTF-8.
Язык
ru
Атрибут lang в HTML-теге
?
Атрибут lang (<html lang="ru">) сообщает поисковикам и браузерам, на каком языке написана страница. Помогает при ранжировании в региональном поиске.
Указан язык документа ru.
Скорость загрузки
~0,37сек
Время отклика сервера (TTFB)
?
Time To First Byte — время до получения первого байта от сервера. Норма до 200 мс. Медленный отклик ухудшает пользовательский опыт и ранжирование: Яндекс и Google учитывают скорость страниц.
Скорость загрузки сайта 0,37сек оптимальна.
Объем документа
2056Кб
Размер HTML-кода страницы
?
Слишком большой HTML замедляет парсинг браузером и сканирование поисковым роботом. Рекомендуется не более 200 Кб.
Объем html-документа 2056Кб оптимален.
Структура html-документа корректна.
Ресурсы
Ресурсы: 10
Внешние ресурсы страницы (CSS, JS, изображения)
?
Количество и тип подключённых ресурсов влияют на скорость загрузки. Большое число запросов увеличивает время рендеринга страницы.
Кол-во файлов ресурсов 10 достаточно.
Показать полный список ресурсов
| Тип | Название | Значение |
|---|---|---|
| stylesheet | https://fonts.googleapis.com/css?family=PT+Sans:400,400i,700,700i%7CPT+Serif:400,400i,700,700i&subset=cyrillic | |
| stylesheet | /assets/new/build/page-list.css?31381d5b6ea6 | |
| stylesheet | text/css | https://fonts.googleapis.com/css2?family=Cormorant:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700 |
| js | https://yookassa.ru/checkout-widget/v1/checkout-widget.js | |
| js | /_next/static/widgets/header.js | |
| js | /assets/new/src/js/cookie-consent.js | |
| js | data:text/html;base64,LyohIGpRdWVyeSB2MS4xMC4yIHwgKGMpIDIwMDUsIDIwMTMgalF1ZXJ5IEZvdW5kYXRpb24sIEluYy4gfCBqcXVlcnkub3JnL2xpY2Vuc2UKKi8KKGZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPXR5cGVvZiB0LG89ZS5sb2NhdGlvbixhPWUuZG9jdW1lbnQscz1hLmRvY3VtZW50RWxlbWVudCxsPWUualF1ZXJ5LHU9ZS4kLGM9e30scD1bXSxmPSIxLjEwLjIiLGQ9cC5jb25jYXQsaD1wLnB1c2gsZz1wLnNsaWNlLG09cC5pbmRleE9mLHk9Yy50b1N0cmluZyx2PWMuaGFzT3duUHJvcGVydHksYj1mLnRyaW0seD1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgeC5mbi5pbml0KGUsdCxyKX0sdz0vWystXT8oPzpcZCpcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvLnNvdXJjZSxUPS9cUysvZyxDPS9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4QTBdKyQvZyxOPS9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKikpJC8saz0vXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT58KSQvLEU9L15bXF0sOnt9XHNdKiQvLFM9Lyg/Ol58OnwsKSg/OlxzKlxbKSsvZyxBPS9cXCg/OlsiXFxcL2JmbnJ0XXx1W1xkYS1mQS1GXXs0fSkvZyxqPS8iW14iXFxcclxuXSoifHRydWV8ZmFsc2V8bnVsbHwtPyg/OlxkK1wufClcZCsoPzpbZUVdWystXT9cZCt8KS9nLEQ9L14tbXMtLyxMPS8tKFtcZGEtel0pL2dpLEg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpfSxxPWZ1bmN0aW9uKGUpeyhhLmFkZEV2ZW50TGlzdGVuZXJ8fCJsb2FkIj09PWUudHlwZXx8ImNvbXBsZXRlIj09PWEucmVhZHlTdGF0ZSkmJihfKCkseC5yZWFkeSgpKX0sXz1mdW5jdGlvbigpe2EuYWRkRXZlbnRMaXN0ZW5lcj8oYS5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixxLCExKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLHEsITEpKTooYS5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixxKSxlLmRldGFjaEV2ZW50KCJvbmxvYWQiLHEpKX07eC5mbj14LnByb3RvdHlwZT17anF1ZXJ5OmYsY29uc3RydWN0b3I6eCxpbml0OmZ1bmN0aW9uKGUsbixyKXt2YXIgaSxvO2lmKCFlKXJldHVybiB0aGlzO2lmKCJzdHJpbmciPT10eXBlb2YgZSl7aWYoaT0iPCI9PT1lLmNoYXJBdCgwKSYmIj4iPT09ZS5jaGFyQXQoZS5sZW5ndGgtMSkmJmUubGVuZ3RoPj0zP1tudWxsLGUsbnVsbF06Ti5leGVjKGUpLCFpfHwhaVsxXSYmbilyZXR1cm4hbnx8bi5qcXVlcnk/KG58fHIpLmZpbmQoZSk6dGhpcy5jb25zdHJ1Y3RvcihuKS5maW5kKGUpO2lmKGlbMV0pe2lmKG49biBpbnN0YW5jZW9mIHg/blswXTpuLHgubWVyZ2UodGhpcyx4LnBhcnNlSFRNTChpWzFdLG4mJm4ubm9kZVR5cGU/bi5vd25lckRvY3VtZW50fHxuOmEsITApKSxrLnRlc3QoaVsxXSkmJnguaXNQbGFpbk9iamVjdChuKSlmb3IoaSBpbiBuKXguaXNGdW5jdGlvbih0aGlzW2ldKT90aGlzW2ldKG5baV0pOnRoaXMuYXR0cihpLG5baV0pO3JldHVybiB0aGlzfWlmKG89YS5nZXRFbGVtZW50QnlJZChpWzJdKSxvJiZvLnBhcmVudE5vZGUpe2lmKG8uaWQhPT1pWzJdKXJldHVybiByLmZpbmQoZSk7dGhpcy5sZW5ndGg9MSx0aGlzWzBdPW99cmV0dXJuIHRoaXMuY29udGV4dD1hLHRoaXMuc2VsZWN0b3I9ZSx0aGlzfXJldHVybiBlLm5vZGVUeXBlPyh0aGlzLmNvbnRleHQ9dGhpc1swXT1lLHRoaXMubGVuZ3RoPTEsdGhpcyk6eC5pc0Z1bmN0aW9uKGUpP3IucmVhZHkoZSk6KGUuc2VsZWN0b3IhPT10JiYodGhpcy5zZWxlY3Rvcj1lLnNlbGVjdG9yLHRoaXMuY29udGV4dD1lLmNvbnRleHQpLHgubWFrZUFycmF5KGUsdGhpcykpfSxzZWxlY3RvcjoiIixsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIGcuY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP3RoaXMudG9BcnJheSgpOjA+ZT90aGlzW3RoaXMubGVuZ3RoK2VdOnRoaXNbZV19LHB1c2hTdGFjazpmdW5jdGlvbihlKXt2YXIgdD14Lm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxlKTtyZXR1cm4gdC5wcmV2T2JqZWN0PXRoaXMsdC5jb250ZXh0PXRoaXMuY29udGV4dCx0fSxlYWNoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHguZWFjaCh0aGlzLGUsdCl9LHJlYWR5OmZ1bmN0aW9uKGUpe3JldHVybiB4LnJlYWR5LnByb21pc2UoKS5kb25lKGUpLHRoaXN9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGcuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXE6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5sZW5ndGgsbj0rZSsoMD5lP3Q6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4+PTAmJnQ+bj9bdGhpc1tuXV06W10pfSxtYXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHgubWFwKHRoaXMsZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5jYWxsKHQsbix0KX0pKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcihudWxsKX0scHVzaDpoLHNvcnQ6W10uc29ydCxzcGxpY2U6W10uc3BsaWNlfSx4LmZuLmluaXQucHJvdG90eXBlPXguZm4seC5leHRlbmQ9eC5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgZSxuLHIsaSxvLGEscz1hcmd1bWVudHNbMF18fHt9LGw9MSx1PWFyZ3VtZW50cy5sZW5ndGgsYz0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgcyYmKGM9cyxzPWFyZ3VtZW50c1sxXXx8e30sbD0yKSwib2JqZWN0Ij09dHlwZW9mIHN8fHguaXNGdW5jdGlvbihzKXx8KHM9e30pLHU9PT1sJiYocz10aGlzLC0tbCk7dT5sO2wrKylpZihudWxsIT0obz1hcmd1bWVudHNbbF0pKWZvcihpIGluIG8pZT1zW2ldLHI9b1tpXSxzIT09ciYmKGMmJnImJih4LmlzUGxhaW5PYmplY3Qocil8fChuPXguaXNBcnJheShyKSkpPyhuPyhuPSExLGE9ZSYmeC5pc0FycmF5KGUpP2U6W10pOmE9ZSYmeC5pc1BsYWluT2JqZWN0KGUpP2U6e30sc1tpXT14LmV4dGVuZChjLGEscikpOnIhPT10JiYoc1tpXT1yKSk7cmV0dXJuIHN9LHguZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKyhmK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLG5vQ29uZmxpY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIGUuJD09PXgmJihlLiQ9dSksdCYmZS5qUXVlcnk9PT14JiYoZS5qUXVlcnk9bCkseH0saXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oZSl7ZT94LnJlYWR5V2FpdCsrOngucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihlKXtpZihlPT09ITA/IS0teC5yZWFkeVdhaXQ6IXguaXNSZWFkeSl7aWYoIWEuYm9keSlyZXR1cm4gc2V0VGltZW91dCh4LnJlYWR5KTt4LmlzUmVhZHk9ITAsZSE9PSEwJiYtLXgucmVhZHlXYWl0PjB8fChuLnJlc29sdmVXaXRoKGEsW3hdKSx4LmZuLnRyaWdnZXImJngoYSkudHJpZ2dlcigicmVhZHkiKS5vZmYoInJlYWR5IikpfX0saXNGdW5jdGlvbjpmdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT09eC50eXBlKGUpfSxpc0FycmF5OkFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJhcnJheSI9PT14LnR5cGUoZSl9LGlzV2luZG93OmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lJiZlPT1lLndpbmRvd30saXNOdW1lcmljOmZ1bmN0aW9uKGUpe3JldHVybiFpc05hTihwYXJzZUZsb2F0KGUpKSYmaXNGaW5pdGUoZSl9LHR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/ZSsiIjoib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlP2NbeS5jYWxsKGUpXXx8Im9iamVjdCI6dHlwZW9mIGV9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIG47aWYoIWV8fCJvYmplY3QiIT09eC50eXBlKGUpfHxlLm5vZGVUeXBlfHx4LmlzV2luZG93KGUpKXJldHVybiExO3RyeXtpZihlLmNvbnN0cnVjdG9yJiYhdi5jYWxsKGUsImNvbnN0cnVjdG9yIikmJiF2LmNhbGwoZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsImlzUHJvdG90eXBlT2YiKSlyZXR1cm4hMX1jYXRjaChyKXtyZXR1cm4hMX1pZih4LnN1cHBvcnQub3duTGFzdClmb3IobiBpbiBlKXJldHVybiB2LmNhbGwoZSxuKTtmb3IobiBpbiBlKTtyZXR1cm4gbj09PXR8fHYuY2FsbChlLG4pfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0IGluIGUpcmV0dXJuITE7cmV0dXJuITB9LGVycm9yOmZ1bmN0aW9uKGUpe3Rocm93IEVycm9yKGUpfSxwYXJzZUhUTUw6ZnVuY3Rpb24oZSx0LG4pe2lmKCFlfHwic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIG51bGw7ImJvb2xlYW4iPT10eXBlb2YgdCYmKG49dCx0PSExKSx0PXR8fGE7dmFyIHI9ay5leGVjKGUpLGk9IW4mJltdO3JldHVybiByP1t0LmNyZWF0ZUVsZW1lbnQoclsxXSldOihyPXguYnVpbGRGcmFnbWVudChbZV0sdCxpKSxpJiZ4KGkpLnJlbW92ZSgpLHgubWVyZ2UoW10sci5jaGlsZE5vZGVzKSl9LHBhcnNlSlNPTjpmdW5jdGlvbihuKXtyZXR1cm4gZS5KU09OJiZlLkpTT04ucGFyc2U/ZS5KU09OLnBhcnNlKG4pOm51bGw9PT1uP246InN0cmluZyI9PXR5cGVvZiBuJiYobj14LnRyaW0obiksbiYmRS50ZXN0KG4ucmVwbGFjZShBLCJAIikucmVwbGFjZShqLCJdIikucmVwbGFjZShTLCIiKSkpP0Z1bmN0aW9uKCJyZXR1cm4gIituKSgpOih4LmVycm9yKCJJbnZhbGlkIEpTT046ICIrbiksdCl9LHBhcnNlWE1MOmZ1bmN0aW9uKG4pe3ZhciByLGk7aWYoIW58fCJzdHJpbmciIT10eXBlb2YgbilyZXR1cm4gbnVsbDt0cnl7ZS5ET01QYXJzZXI/KGk9bmV3IERPTVBhcnNlcixyPWkucGFyc2VGcm9tU3RyaW5nKG4sInRleHQveG1sIikpOihyPW5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MRE9NIiksci5hc3luYz0iZmFsc2UiLHIubG9hZFhNTChuKSl9Y2F0Y2gobyl7cj10fXJldHVybiByJiZyLmRvY3VtZW50RWxlbWVudCYmIXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RofHx4LmVycm9yKCJJbnZhbGlkIFhNTDogIituKSxyfSxub29wOmZ1bmN0aW9uKCl7fSxnbG9iYWxFdmFsOmZ1bmN0aW9uKHQpe3QmJngudHJpbSh0KSYmKGUuZXhlY1NjcmlwdHx8ZnVuY3Rpb24odCl7ZS5ldmFsLmNhbGwoZSx0KX0pKHQpfSxjYW1lbENhc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShELCJtcy0iKS5yZXBsYWNlKEwsSCl9LG5vZGVOYW1lOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXQudG9Mb3dlckNhc2UoKX0sZWFjaDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT0wLG89ZS5sZW5ndGgsYT1NKGUpO2lmKG4pe2lmKGEpe2Zvcig7bz5pO2krKylpZihyPXQuYXBwbHkoZVtpXSxuKSxyPT09ITEpYnJlYWt9ZWxzZSBmb3IoaSBpbiBlKWlmKHI9dC5hcHBseShlW2ldLG4pLHI9PT0hMSlicmVha31lbHNlIGlmKGEpe2Zvcig7bz5pO2krKylpZihyPXQuY2FsbChlW2ldLGksZVtpXSkscj09PSExKWJyZWFrfWVsc2UgZm9yKGkgaW4gZSlpZihyPXQuY2FsbChlW2ldLGksZVtpXSkscj09PSExKWJyZWFrO3JldHVybiBlfSx0cmltOmImJiFiLmNhbGwoIlx1ZmVmZlx1MDBhMCIpP2Z1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lPyIiOmIuY2FsbChlKX06ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6KGUrIiIpLnJlcGxhY2UoQywiIil9LG1ha2VBcnJheTpmdW5jdGlvbihlLHQpe3ZhciBuPXR8fFtdO3JldHVybiBudWxsIT1lJiYoTShPYmplY3QoZSkpP3gubWVyZ2Uobiwic3RyaW5nIj09dHlwZW9mIGU/W2VdOmUpOmguY2FsbChuLGUpKSxufSxpbkFycmF5OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZih0KXtpZihtKXJldHVybiBtLmNhbGwodCxlLG4pO2ZvcihyPXQubGVuZ3RoLG49bj8wPm4/TWF0aC5tYXgoMCxyK24pOm46MDtyPm47bisrKWlmKG4gaW4gdCYmdFtuXT09PWUpcmV0dXJuIG59cmV0dXJuLTF9LG1lcmdlOmZ1bmN0aW9uKGUsbil7dmFyIHI9bi5sZW5ndGgsaT1lLmxlbmd0aCxvPTA7aWYoIm51bWJlciI9PXR5cGVvZiByKWZvcig7cj5vO28rKyllW2krK109bltvXTtlbHNlIHdoaWxlKG5bb10hPT10KWVbaSsrXT1uW28rK107cmV0dXJuIGUubGVuZ3RoPWksZX0sZ3JlcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT1bXSxvPTAsYT1lLmxlbmd0aDtmb3Iobj0hIW47YT5vO28rKylyPSEhdChlW29dLG8pLG4hPT1yJiZpLnB1c2goZVtvXSk7cmV0dXJuIGl9LG1hcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT0wLG89ZS5sZW5ndGgsYT1NKGUpLHM9W107aWYoYSlmb3IoO28+aTtpKyspcj10KGVbaV0saSxuKSxudWxsIT1yJiYoc1tzLmxlbmd0aF09cik7ZWxzZSBmb3IoaSBpbiBlKXI9dChlW2ldLGksbiksbnVsbCE9ciYmKHNbcy5sZW5ndGhdPXIpO3JldHVybiBkLmFwcGx5KFtdLHMpfSxndWlkOjEscHJveHk6ZnVuY3Rpb24oZSxuKXt2YXIgcixpLG87cmV0dXJuInN0cmluZyI9PXR5cGVvZiBuJiYobz1lW25dLG49ZSxlPW8pLHguaXNGdW5jdGlvbihlKT8ocj1nLmNhbGwoYXJndW1lbnRzLDIpLGk9ZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseShufHx0aGlzLHIuY29uY2F0KGcuY2FsbChhcmd1bWVudHMpKSl9LGkuZ3VpZD1lLmd1aWQ9ZS5ndWlkfHx4Lmd1aWQrKyxpKTp0fSxhY2Nlc3M6ZnVuY3Rpb24oZSxuLHIsaSxvLGEscyl7dmFyIGw9MCx1PWUubGVuZ3RoLGM9bnVsbD09cjtpZigib2JqZWN0Ij09PXgudHlwZShyKSl7bz0hMDtmb3IobCBpbiByKXguYWNjZXNzKGUsbixsLHJbbF0sITAsYSxzKX1lbHNlIGlmKGkhPT10JiYobz0hMCx4LmlzRnVuY3Rpb24oaSl8fChzPSEwKSxjJiYocz8obi5jYWxsKGUsaSksbj1udWxsKTooYz1uLG49ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBjLmNhbGwoeChlKSxuKX0pKSxuKSlmb3IoO3U+bDtsKyspbihlW2xdLHIscz9pOmkuY2FsbChlW2xdLGwsbihlW2xdLHIpKSk7cmV0dXJuIG8/ZTpjP24uY2FsbChlKTp1P24oZVswXSxyKTphfSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sc3dhcDpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGE9e307Zm9yKG8gaW4gdClhW29dPWUuc3R5bGVbb10sZS5zdHlsZVtvXT10W29dO2k9bi5hcHBseShlLHJ8fFtdKTtmb3IobyBpbiB0KWUuc3R5bGVbb109YVtvXTtyZXR1cm4gaX19KSx4LnJlYWR5LnByb21pc2U9ZnVuY3Rpb24odCl7aWYoIW4paWYobj14LkRlZmVycmVkKCksImNvbXBsZXRlIj09PWEucmVhZHlTdGF0ZSlzZXRUaW1lb3V0KHgucmVhZHkpO2Vsc2UgaWYoYS5hZGRFdmVudExpc3RlbmVyKWEuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIscSwhMSksZS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixxLCExKTtlbHNle2EuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIscSksZS5hdHRhY2hFdmVudCgib25sb2FkIixxKTt2YXIgcj0hMTt0cnl7cj1udWxsPT1lLmZyYW1lRWxlbWVudCYmYS5kb2N1bWVudEVsZW1lbnR9Y2F0Y2goaSl7fXImJnIuZG9TY3JvbGwmJmZ1bmN0aW9uIG8oKXtpZigheC5pc1JlYWR5KXt0cnl7ci5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGUpe3JldHVybiBzZXRUaW1lb3V0KG8sNTApfV8oKSx4LnJlYWR5KCl9fSgpfXJldHVybiBuLnByb21pc2UodCl9LHguZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe2NbIltvYmplY3QgIit0KyJdIl09dC50b0xvd2VyQ2FzZSgpfSk7ZnVuY3Rpb24gTShlKXt2YXIgdD1lLmxlbmd0aCxuPXgudHlwZShlKTtyZXR1cm4geC5pc1dpbmRvdyhlKT8hMToxPT09ZS5ub2RlVHlwZSYmdD8hMDoiYXJyYXkiPT09bnx8ImZ1bmN0aW9uIiE9PW4mJigwPT09dHx8Im51bWJlciI9PXR5cGVvZiB0JiZ0PjAmJnQtMSBpbiBlKX1yPXgoYSksZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhLHMsbCx1LGMscCxmLGQsaCxnLG0seSx2LGI9InNpenpsZSIrLW5ldyBEYXRlLHc9ZS5kb2N1bWVudCxUPTAsQz0wLE49c3QoKSxrPXN0KCksRT1zdCgpLFM9ITEsQT1mdW5jdGlvbihlLHQpe3JldHVybiBlPT09dD8oUz0hMCwwKTowfSxqPXR5cGVvZiB0LEQ9MTw8MzEsTD17fS5oYXNPd25Qcm9wZXJ0eSxIPVtdLHE9SC5wb3AsXz1ILnB1c2gsTT1ILnB1c2gsTz1ILnNsaWNlLEY9SC5pbmRleE9mfHxmdW5jdGlvbihlKXt2YXIgdD0wLG49dGhpcy5sZW5ndGg7Zm9yKDtuPnQ7dCsrKWlmKHRoaXNbdF09PT1lKXJldHVybiB0O3JldHVybi0xfSxCPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsUD0iW1xceDIwXFx0XFxyXFxuXFxmXSIsUj0iKD86XFxcXC58W1xcdy1dfFteXFx4MDAtXFx4YTBdKSsiLFc9Ui5yZXBsYWNlKCJ3IiwidyMiKSwkPSJcXFsiK1ArIiooIitSKyIpIitQKyIqKD86KFsqXiR8IX5dPz0pIitQKyIqKD86KFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcM3woIitXKyIpfCl8KSIrUCsiKlxcXSIsST0iOigiK1IrIikoPzpcXCgoKFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcM3woKD86XFxcXC58W15cXFxcKClbXFxdXXwiKyQucmVwbGFjZSgzLDgpKyIpKil8LiopXFwpfCkiLHo9UmVnRXhwKCJeIitQKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK1ArIiskIiwiZyIpLFg9UmVnRXhwKCJeIitQKyIqLCIrUCsiKiIpLFU9UmVnRXhwKCJeIitQKyIqKFs+K35dfCIrUCsiKSIrUCsiKiIpLFY9UmVnRXhwKFArIipbK35dIiksWT1SZWdFeHAoIj0iK1ArIiooW15cXF0nXCJdKikiK1ArIipcXF0iLCJnIiksSj1SZWdFeHAoSSksRz1SZWdFeHAoIl4iK1crIiQiKSxRPXtJRDpSZWdFeHAoIl4jKCIrUisiKSIpLENMQVNTOlJlZ0V4cCgiXlxcLigiK1IrIikiKSxUQUc6UmVnRXhwKCJeKCIrUi5yZXBsYWNlKCJ3IiwidyoiKSsiKSIpLEFUVFI6UmVnRXhwKCJeIiskKSxQU0VVRE86UmVnRXhwKCJeIitJKSxDSElMRDpSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrUCsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrUCsiKig/OihbKy1dfCkiK1ArIiooXFxkKyl8KSkiK1ArIipcXCl8KSIsImkiKSxib29sOlJlZ0V4cCgiXig/OiIrQisiKSQiLCJpIiksbmVlZHNDb250ZXh0OlJlZ0V4cCgiXiIrUCsiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitQKyIqKCg/Oi1cXGQpP1xcZCopIitQKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxLPS9eW157XStce1xzKlxbbmF0aXZlIFx3LyxaPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sZXQ9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSx0dD0vXmhcZCQvaSxudD0vJ3xcXC9nLHJ0PVJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitQKyI/fCgiK1ArIil8LikiLCJpZyIpLGl0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0iMHgiK3QtNjU1MzY7cmV0dXJuIHIhPT1yfHxuP3Q6MD5yP1N0cmluZy5mcm9tQ2hhckNvZGUocis2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxyPj4xMCw1NjMyMHwxMDIzJnIpfTt0cnl7TS5hcHBseShIPU8uY2FsbCh3LmNoaWxkTm9kZXMpLHcuY2hpbGROb2RlcyksSFt3LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChvdCl7TT17YXBwbHk6SC5sZW5ndGg/ZnVuY3Rpb24oZSx0KXtfLmFwcGx5KGUsTy5jYWxsKHQpKX06ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmxlbmd0aCxyPTA7d2hpbGUoZVtuKytdPXRbcisrXSk7ZS5sZW5ndGg9bi0xfX19ZnVuY3Rpb24gYXQoZSx0LG4saSl7dmFyIG8sYSxzLGwsdSxjLGQsbSx5LHg7aWYoKHQ/dC5vd25lckRvY3VtZW50fHx0OncpIT09ZiYmcCh0KSx0PXR8fGYsbj1ufHxbXSwhZXx8InN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBuO2lmKDEhPT0obD10Lm5vZGVUeXBlKSYmOSE9PWwpcmV0dXJuW107aWYoaCYmIWkpe2lmKG89Wi5leGVjKGUpKWlmKHM9b1sxXSl7aWYoOT09PWwpe2lmKGE9dC5nZXRFbGVtZW50QnlJZChzKSwhYXx8IWEucGFyZW50Tm9kZSlyZXR1cm4gbjtpZihhLmlkPT09cylyZXR1cm4gbi5wdXNoKGEpLG59ZWxzZSBpZih0Lm93bmVyRG9jdW1lbnQmJihhPXQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChzKSkmJnYodCxhKSYmYS5pZD09PXMpcmV0dXJuIG4ucHVzaChhKSxufWVsc2V7aWYob1syXSlyZXR1cm4gTS5hcHBseShuLHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSkpLG47aWYoKHM9b1szXSkmJnIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBNLmFwcGx5KG4sdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHMpKSxufWlmKHIucXNhJiYoIWd8fCFnLnRlc3QoZSkpKXtpZihtPWQ9Yix5PXQseD05PT09bCYmZSwxPT09bCYmIm9iamVjdCIhPT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpe2M9bXQoZSksKGQ9dC5nZXRBdHRyaWJ1dGUoImlkIikpP209ZC5yZXBsYWNlKG50LCJcXCQmIik6dC5zZXRBdHRyaWJ1dGUoImlkIixtKSxtPSJbaWQ9JyIrbSsiJ10gIix1PWMubGVuZ3RoO3doaWxlKHUtLSljW3VdPW0reXQoY1t1XSk7eT1WLnRlc3QoZSkmJnQucGFyZW50Tm9kZXx8dCx4PWMuam9pbigiLCIpfWlmKHgpdHJ5e3JldHVybiBNLmFwcGx5KG4seS5xdWVyeVNlbGVjdG9yQWxsKHgpKSxufWNhdGNoKFQpe31maW5hbGx5e2R8fHQucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGt0KGUucmVwbGFjZSh6LCIkMSIpLHQsbixpKX1mdW5jdGlvbiBzdCgpe3ZhciBlPVtdO2Z1bmN0aW9uIHQobixyKXtyZXR1cm4gZS5wdXNoKG4rPSIgIik+by5jYWNoZUxlbmd0aCYmZGVsZXRlIHRbZS5zaGlmdCgpXSx0W25dPXJ9cmV0dXJuIHR9ZnVuY3Rpb24gbHQoZSl7cmV0dXJuIGVbYl09ITAsZX1mdW5jdGlvbiB1dChlKXt2YXIgdD1mLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RyeXtyZXR1cm4hIWUodCl9Y2F0Y2gobil7cmV0dXJuITF9ZmluYWxseXt0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0PW51bGx9fWZ1bmN0aW9uIGN0KGUsdCl7dmFyIG49ZS5zcGxpdCgifCIpLHI9ZS5sZW5ndGg7d2hpbGUoci0tKW8uYXR0ckhhbmRsZVtuW3JdXT10fWZ1bmN0aW9uIHB0KGUsdCl7dmFyIG49dCYmZSxyPW4mJjE9PT1lLm5vZGVUeXBlJiYxPT09dC5ub2RlVHlwZSYmKH50LnNvdXJjZUluZGV4fHxEKS0ofmUuc291cmNlSW5kZXh8fEQpO2lmKHIpcmV0dXJuIHI7aWYobil3aGlsZShuPW4ubmV4dFNpYmxpbmcpaWYobj09PXQpcmV0dXJuLTE7cmV0dXJuIGU/MTotMX1mdW5jdGlvbiBmdChlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1uJiZ0LnR5cGU9PT1lfX1mdW5jdGlvbiBkdChlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybigiaW5wdXQiPT09bnx8ImJ1dHRvbiI9PT1uKSYmdC50eXBlPT09ZX19ZnVuY3Rpb24gaHQoZSl7cmV0dXJuIGx0KGZ1bmN0aW9uKHQpe3JldHVybiB0PSt0LGx0KGZ1bmN0aW9uKG4scil7dmFyIGksbz1lKFtdLG4ubGVuZ3RoLHQpLGE9by5sZW5ndGg7d2hpbGUoYS0tKW5baT1vW2FdXSYmKG5baV09IShyW2ldPW5baV0pKX0pfSl9cz1hdC5pc1hNTD1mdW5jdGlvbihlKXt2YXIgdD1lJiYoZS5vd25lckRvY3VtZW50fHxlKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIHQ/IkhUTUwiIT09dC5ub2RlTmFtZTohMX0scj1hdC5zdXBwb3J0PXt9LHA9YXQuc2V0RG9jdW1lbnQ9ZnVuY3Rpb24oZSl7dmFyIG49ZT9lLm93bmVyRG9jdW1lbnR8fGU6dyxpPW4uZGVmYXVsdFZpZXc7cmV0dXJuIG4hPT1mJiY5PT09bi5ub2RlVHlwZSYmbi5kb2N1bWVudEVsZW1lbnQ/KGY9bixkPW4uZG9jdW1lbnRFbGVtZW50LGg9IXMobiksaSYmaS5hdHRhY2hFdmVudCYmaSE9PWkudG9wJiZpLmF0dGFjaEV2ZW50KCJvbmJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXtwKCl9KSxyLmF0dHJpYnV0ZXM9dXQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xhc3NOYW1lPSJpIiwhZS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksci5nZXRFbGVtZW50c0J5VGFnTmFtZT11dChmdW5jdGlvbihlKXtyZXR1cm4gZS5hcHBlbmRDaGlsZChuLmNyZWF0ZUNvbW1lbnQoIiIpKSwhZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLHIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT11dChmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxkaXYgY2xhc3M9J2EnPjwvZGl2PjxkaXYgY2xhc3M9J2EgaSc+PC9kaXY+IixlLmZpcnN0Q2hpbGQuY2xhc3NOYW1lPSJpIiwyPT09ZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJpIikubGVuZ3RofSksci5nZXRCeUlkPXV0KGZ1bmN0aW9uKGUpe3JldHVybiBkLmFwcGVuZENoaWxkKGUpLmlkPWIsIW4uZ2V0RWxlbWVudHNCeU5hbWV8fCFuLmdldEVsZW1lbnRzQnlOYW1lKGIpLmxlbmd0aH0pLHIuZ2V0QnlJZD8oby5maW5kLklEPWZ1bmN0aW9uKGUsdCl7aWYodHlwZW9mIHQuZ2V0RWxlbWVudEJ5SWQhPT1qJiZoKXt2YXIgbj10LmdldEVsZW1lbnRCeUlkKGUpO3JldHVybiBuJiZuLnBhcmVudE5vZGU/W25dOltdfX0sby5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKHJ0LGl0KTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlKCJpZCIpPT09dH19KTooZGVsZXRlIG8uZmluZC5JRCxvLmZpbHRlci5JRD1mdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UocnQsaXQpO3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj10eXBlb2YgZS5nZXRBdHRyaWJ1dGVOb2RlIT09aiYmZS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBuJiZuLnZhbHVlPT09dH19KSxvLmZpbmQuVEFHPXIuZ2V0RWxlbWVudHNCeVRhZ05hbWU/ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdHlwZW9mIG4uZ2V0RWxlbWVudHNCeVRhZ05hbWUhPT1qP24uZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk6dH06ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9MCxvPXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk7aWYoIioiPT09ZSl7d2hpbGUobj1vW2krK10pMT09PW4ubm9kZVR5cGUmJnIucHVzaChuKTtyZXR1cm4gcn1yZXR1cm4gb30sby5maW5kLkNMQVNTPXIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oZSxuKXtyZXR1cm4gdHlwZW9mIG4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSE9PWomJmg/bi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGUpOnR9LG09W10sZz1bXSwoci5xc2E9Sy50ZXN0KG4ucXVlcnlTZWxlY3RvckFsbCkpJiYodXQoZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9IjxzZWxlY3Q+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGUucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8Zy5wdXNoKCJcXFsiK1ArIiooPzp2YWx1ZXwiK0IrIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxnLnB1c2goIjpjaGVja2VkIil9KSx1dChmdW5jdGlvbihlKXt2YXIgdD1uLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7dC5zZXRBdHRyaWJ1dGUoInR5cGUiLCJoaWRkZW4iKSxlLmFwcGVuZENoaWxkKHQpLnNldEF0dHJpYnV0ZSgidCIsIiIpLGUucXVlcnlTZWxlY3RvckFsbCgiW3RePScnXSIpLmxlbmd0aCYmZy5wdXNoKCJbKl4kXT0iK1ArIiooPzonJ3xcIlwiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGh8fGcucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSxnLnB1c2goIiwuKjoiKX0pKSwoci5tYXRjaGVzU2VsZWN0b3I9Sy50ZXN0KHk9ZC53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fGQubW96TWF0Y2hlc1NlbGVjdG9yfHxkLm9NYXRjaGVzU2VsZWN0b3J8fGQubXNNYXRjaGVzU2VsZWN0b3IpKSYmdXQoZnVuY3Rpb24oZSl7ci5kaXNjb25uZWN0ZWRNYXRjaD15LmNhbGwoZSwiZGl2IikseS5jYWxsKGUsIltzIT0nJ106eCIpLG0ucHVzaCgiIT0iLEkpfSksZz1nLmxlbmd0aCYmUmVnRXhwKGcuam9pbigifCIpKSxtPW0ubGVuZ3RoJiZSZWdFeHAobS5qb2luKCJ8IikpLHY9Sy50ZXN0KGQuY29udGFpbnMpfHxkLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2Z1bmN0aW9uKGUsdCl7dmFyIG49OT09PWUubm9kZVR5cGU/ZS5kb2N1bWVudEVsZW1lbnQ6ZSxyPXQmJnQucGFyZW50Tm9kZTtyZXR1cm4gZT09PXJ8fCEoIXJ8fDEhPT1yLm5vZGVUeXBlfHwhKG4uY29udGFpbnM/bi5jb250YWlucyhyKTplLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHIpKSl9OmZ1bmN0aW9uKGUsdCl7aWYodCl3aGlsZSh0PXQucGFyZW50Tm9kZSlpZih0PT09ZSlyZXR1cm4hMDtyZXR1cm4hMX0sQT1kLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2Z1bmN0aW9uKGUsdCl7aWYoZT09PXQpcmV0dXJuIFM9ITAsMDt2YXIgaT10LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpO3JldHVybiBpPzEmaXx8IXIuc29ydERldGFjaGVkJiZ0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGUpPT09aT9lPT09bnx8dih3LGUpPy0xOnQ9PT1ufHx2KHcsdCk/MTpjP0YuY2FsbChjLGUpLUYuY2FsbChjLHQpOjA6NCZpPy0xOjE6ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj8tMToxfTpmdW5jdGlvbihlLHQpe3ZhciByLGk9MCxvPWUucGFyZW50Tm9kZSxhPXQucGFyZW50Tm9kZSxzPVtlXSxsPVt0XTtpZihlPT09dClyZXR1cm4gUz0hMCwwO2lmKCFvfHwhYSlyZXR1cm4gZT09PW4/LTE6dD09PW4/MTpvPy0xOmE/MTpjP0YuY2FsbChjLGUpLUYuY2FsbChjLHQpOjA7aWYobz09PWEpcmV0dXJuIHB0KGUsdCk7cj1lO3doaWxlKHI9ci5wYXJlbnROb2RlKXMudW5zaGlmdChyKTtyPXQ7d2hpbGUocj1yLnBhcmVudE5vZGUpbC51bnNoaWZ0KHIpO3doaWxlKHNbaV09PT1sW2ldKWkrKztyZXR1cm4gaT9wdChzW2ldLGxbaV0pOnNbaV09PT13Py0xOmxbaV09PT13PzE6MH0sbik6Zn0sYXQubWF0Y2hlcz1mdW5jdGlvbihlLHQpe3JldHVybiBhdChlLG51bGwsbnVsbCx0KX0sYXQubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGUsdCl7aWYoKGUub3duZXJEb2N1bWVudHx8ZSkhPT1mJiZwKGUpLHQ9dC5yZXBsYWNlKFksIj0nJDEnXSIpLCEoIXIubWF0Y2hlc1NlbGVjdG9yfHwhaHx8bSYmbS50ZXN0KHQpfHxnJiZnLnRlc3QodCkpKXRyeXt2YXIgbj15LmNhbGwoZSx0KTtpZihufHxyLmRpc2Nvbm5lY3RlZE1hdGNofHxlLmRvY3VtZW50JiYxMSE9PWUuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIG59Y2F0Y2goaSl7fXJldHVybiBhdCh0LGYsbnVsbCxbZV0pLmxlbmd0aD4wfSxhdC5jb250YWlucz1mdW5jdGlvbihlLHQpe3JldHVybihlLm93bmVyRG9jdW1lbnR8fGUpIT09ZiYmcChlKSx2KGUsdCl9LGF0LmF0dHI9ZnVuY3Rpb24oZSxuKXsoZS5vd25lckRvY3VtZW50fHxlKSE9PWYmJnAoZSk7dmFyIGk9by5hdHRySGFuZGxlW24udG9Mb3dlckNhc2UoKV0sYT1pJiZMLmNhbGwoby5hdHRySGFuZGxlLG4udG9Mb3dlckNhc2UoKSk/aShlLG4sIWgpOnQ7cmV0dXJuIGE9PT10P3IuYXR0cmlidXRlc3x8IWg/ZS5nZXRBdHRyaWJ1dGUobik6KGE9ZS5nZXRBdHRyaWJ1dGVOb2RlKG4pKSYmYS5zcGVjaWZpZWQ/YS52YWx1ZTpudWxsOmF9LGF0LmVycm9yPWZ1bmN0aW9uKGUpe3Rocm93IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2UpfSxhdC51bmlxdWVTb3J0PWZ1bmN0aW9uKGUpe3ZhciB0LG49W10saT0wLG89MDtpZihTPSFyLmRldGVjdER1cGxpY2F0ZXMsYz0hci5zb3J0U3RhYmxlJiZlLnNsaWNlKDApLGUuc29ydChBKSxTKXt3aGlsZSh0PWVbbysrXSl0PT09ZVtvXSYmKGk9bi5wdXNoKG8pKTt3aGlsZShpLS0pZS5zcGxpY2UobltpXSwxKX1yZXR1cm4gZX0sYT1hdC5nZXRUZXh0PWZ1bmN0aW9uKGUpe3ZhciB0LG49IiIscj0wLGk9ZS5ub2RlVHlwZTtpZihpKXtpZigxPT09aXx8OT09PWl8fDExPT09aSl7aWYoInN0cmluZyI9PXR5cGVvZiBlLnRleHRDb250ZW50KXJldHVybiBlLnRleHRDb250ZW50O2ZvcihlPWUuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZyluKz1hKGUpfWVsc2UgaWYoMz09PWl8fDQ9PT1pKXJldHVybiBlLm5vZGVWYWx1ZX1lbHNlIGZvcig7dD1lW3JdO3IrKyluKz1hKHQpO3JldHVybiBufSxvPWF0LnNlbGVjdG9ycz17Y2FjaGVMZW5ndGg6NTAsY3JlYXRlUHNldWRvOmx0LG1hdGNoOlEsYXR0ckhhbmRsZTp7fSxmaW5kOnt9LHJlbGF0aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVbMV0ucmVwbGFjZShydCxpdCksZVszXT0oZVs0XXx8ZVs1XXx8IiIpLnJlcGxhY2UocnQsaXQpLCJ+PSI9PT1lWzJdJiYoZVszXT0iICIrZVszXSsiICIpLGUuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS50b0xvd2VyQ2FzZSgpLCJudGgiPT09ZVsxXS5zbGljZSgwLDMpPyhlWzNdfHxhdC5lcnJvcihlWzBdKSxlWzRdPSsoZVs0XT9lWzVdKyhlWzZdfHwxKToyKigiZXZlbiI9PT1lWzNdfHwib2RkIj09PWVbM10pKSxlWzVdPSsoZVs3XStlWzhdfHwib2RkIj09PWVbM10pKTplWzNdJiZhdC5lcnJvcihlWzBdKSxlfSxQU0VVRE86ZnVuY3Rpb24oZSl7dmFyIG4scj0hZVs1XSYmZVsyXTtyZXR1cm4gUS5DSElMRC50ZXN0KGVbMF0pP251bGw6KGVbM10mJmVbNF0hPT10P2VbMl09ZVs0XTpyJiZKLnRlc3QocikmJihuPW10KHIsITApKSYmKG49ci5pbmRleE9mKCIpIixyLmxlbmd0aC1uKS1yLmxlbmd0aCkmJihlWzBdPWVbMF0uc2xpY2UoMCxuKSxlWzJdPXIuc2xpY2UoMCxuKSksZS5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZShydCxpdCkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1lP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGUpe3JldHVybiBlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10fX0sQ0xBU1M6ZnVuY3Rpb24oZSl7dmFyIHQ9TltlKyIgIl07cmV0dXJuIHR8fCh0PVJlZ0V4cCgiKF58IitQKyIpIitlKyIoIitQKyJ8JCkiKSkmJk4oZSxmdW5jdGlvbihlKXtyZXR1cm4gdC50ZXN0KCJzdHJpbmciPT10eXBlb2YgZS5jbGFzc05hbWUmJmUuY2xhc3NOYW1lfHx0eXBlb2YgZS5nZXRBdHRyaWJ1dGUhPT1qJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfSl9LEFUVFI6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBmdW5jdGlvbihyKXt2YXIgaT1hdC5hdHRyKHIsZSk7cmV0dXJuIG51bGw9PWk/IiE9Ij09PXQ6dD8oaSs9IiIsIj0iPT09dD9pPT09bjoiIT0iPT09dD9pIT09bjoiXj0iPT09dD9uJiYwPT09aS5pbmRleE9mKG4pOiIqPSI9PT10P24mJmkuaW5kZXhPZihuKT4tMToiJD0iPT09dD9uJiZpLnNsaWNlKC1uLmxlbmd0aCk9PT1uOiJ+PSI9PT10PygiICIraSsiICIpLmluZGV4T2Yobik+LTE6Inw9Ij09PXQ/aT09PW58fGkuc2xpY2UoMCxuLmxlbmd0aCsxKT09PW4rIi0iOiExKTohMH19LENISUxEOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG89Im50aCIhPT1lLnNsaWNlKDAsMyksYT0ibGFzdCIhPT1lLnNsaWNlKC00KSxzPSJvZi10eXBlIj09PXQ7cmV0dXJuIDE9PT1yJiYwPT09aT9mdW5jdGlvbihlKXtyZXR1cm4hIWUucGFyZW50Tm9kZX06ZnVuY3Rpb24odCxuLGwpe3ZhciB1LGMscCxmLGQsaCxnPW8hPT1hPyJuZXh0U2libGluZyI6InByZXZpb3VzU2libGluZyIsbT10LnBhcmVudE5vZGUseT1zJiZ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksdj0hbCYmIXM7aWYobSl7aWYobyl7d2hpbGUoZyl7cD10O3doaWxlKHA9cFtnXSlpZihzP3Aubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXk6MT09PXAubm9kZVR5cGUpcmV0dXJuITE7aD1nPSJvbmx5Ij09PWUmJiFoJiYibmV4dFNpYmxpbmcifXJldHVybiEwfWlmKGg9W2E/bS5maXJzdENoaWxkOm0ubGFzdENoaWxkXSxhJiZ2KXtjPW1bYl18fChtW2JdPXt9KSx1PWNbZV18fFtdLGQ9dVswXT09PVQmJnVbMV0sZj11WzBdPT09VCYmdVsyXSxwPWQmJm0uY2hpbGROb2Rlc1tkXTt3aGlsZShwPSsrZCYmcCYmcFtnXXx8KGY9ZD0wKXx8aC5wb3AoKSlpZigxPT09cC5ub2RlVHlwZSYmKytmJiZwPT09dCl7Y1tlXT1bVCxkLGZdO2JyZWFrfX1lbHNlIGlmKHYmJih1PSh0W2JdfHwodFtiXT17fSkpW2VdKSYmdVswXT09PVQpZj11WzFdO2Vsc2Ugd2hpbGUocD0rK2QmJnAmJnBbZ118fChmPWQ9MCl8fGgucG9wKCkpaWYoKHM/cC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09eToxPT09cC5ub2RlVHlwZSkmJisrZiYmKHYmJigocFtiXXx8KHBbYl09e30pKVtlXT1bVCxmXSkscD09PXQpKWJyZWFrO3JldHVybiBmLT1pLGY9PT1yfHwwPT09ZiVyJiZmL3I+PTB9fX0sUFNFVURPOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1vLnBzZXVkb3NbZV18fG8uc2V0RmlsdGVyc1tlLnRvTG93ZXJDYXNlKCldfHxhdC5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2UpO3JldHVybiByW2JdP3IodCk6ci5sZW5ndGg+MT8obj1bZSxlLCIiLHRdLG8uc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpP2x0KGZ1bmN0aW9uKGUsbil7dmFyIGksbz1yKGUsdCksYT1vLmxlbmd0aDt3aGlsZShhLS0paT1GLmNhbGwoZSxvW2FdKSxlW2ldPSEobltpXT1vW2FdKX0pOmZ1bmN0aW9uKGUpe3JldHVybiByKGUsMCxuKX0pOnJ9fSxwc2V1ZG9zOntub3Q6bHQoZnVuY3Rpb24oZSl7dmFyIHQ9W10sbj1bXSxyPWwoZS5yZXBsYWNlKHosIiQxIikpO3JldHVybiByW2JdP2x0KGZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBvLGE9cihlLG51bGwsaSxbXSkscz1lLmxlbmd0aDt3aGlsZShzLS0pKG89YVtzXSkmJihlW3NdPSEodFtzXT1vKSl9KTpmdW5jdGlvbihlLGksbyl7cmV0dXJuIHRbMF09ZSxyKHQsbnVsbCxvLG4pLCFuLnBvcCgpfX0pLGhhczpsdChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGF0KGUsdCkubGVuZ3RoPjB9fSksY29udGFpbnM6bHQoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybih0LnRleHRDb250ZW50fHx0LmlubmVyVGV4dHx8YSh0KSkuaW5kZXhPZihlKT4tMX19KSxsYW5nOmx0KGZ1bmN0aW9uKGUpe3JldHVybiBHLnRlc3QoZXx8IiIpfHxhdC5lcnJvcigidW5zdXBwb3J0ZWQgbGFuZzogIitlKSxlPWUucmVwbGFjZShydCxpdCkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbih0KXt2YXIgbjtkbyBpZihuPWg/dC5sYW5nOnQuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHx0LmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybiBuPW4udG9Mb3dlckNhc2UoKSxuPT09ZXx8MD09PW4uaW5kZXhPZihlKyItIik7d2hpbGUoKHQ9dC5wYXJlbnROb2RlKSYmMT09PXQubm9kZVR5cGUpO3JldHVybiExfX0pLHRhcmdldDpmdW5jdGlvbih0KXt2YXIgbj1lLmxvY2F0aW9uJiZlLmxvY2F0aW9uLmhhc2g7cmV0dXJuIG4mJm4uc2xpY2UoMSk9PT10LmlkfSxyb290OmZ1bmN0aW9uKGUpe3JldHVybiBlPT09ZH0sZm9jdXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1mLmFjdGl2ZUVsZW1lbnQmJighZi5oYXNGb2N1c3x8Zi5oYXNGb2N1cygpKSYmISEoZS50eXBlfHxlLmhyZWZ8fH5lLnRhYkluZGV4KX0sZW5hYmxlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5kaXNhYmxlZD09PSExfSxkaXNhYmxlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5kaXNhYmxlZD09PSEwfSxjaGVja2VkOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09dCYmISFlLmNoZWNrZWR8fCJvcHRpb24iPT09dCYmISFlLnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxlLnNlbGVjdGVkPT09ITB9LGVtcHR5OmZ1bmN0aW9uKGUpe2ZvcihlPWUuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZylpZihlLm5vZGVOYW1lPiJAInx8Mz09PWUubm9kZVR5cGV8fDQ9PT1lLm5vZGVUeXBlKXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIW8ucHNldWRvcy5lbXB0eShlKX0saGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiB0dC50ZXN0KGUubm9kZU5hbWUpfSxpbnB1dDpmdW5jdGlvbihlKXtyZXR1cm4gZXQudGVzdChlLm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09dCYmImJ1dHRvbiI9PT1lLnR5cGV8fCJidXR0b24iPT09dH0sdGV4dDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4iaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT1lLnR5cGUmJihudWxsPT0odD1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8dC50b0xvd2VyQ2FzZSgpPT09ZS50eXBlKX0sZmlyc3Q6aHQoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0Omh0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuW3QtMV19KSxlcTpodChmdW5jdGlvbihlLHQsbil7cmV0dXJuWzA+bj9uK3Q6bl19KSxldmVuOmh0KGZ1bmN0aW9uKGUsdCl7dmFyIG49MDtmb3IoO3Q+bjtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLG9kZDpodChmdW5jdGlvbihlLHQpe3ZhciBuPTE7Zm9yKDt0Pm47bis9MillLnB1c2gobik7cmV0dXJuIGV9KSxsdDpodChmdW5jdGlvbihlLHQsbil7dmFyIHI9MD5uP24rdDpuO2Zvcig7LS1yPj0wOyllLnB1c2gocik7cmV0dXJuIGV9KSxndDpodChmdW5jdGlvbihlLHQsbil7dmFyIHI9MD5uP24rdDpuO2Zvcig7dD4rK3I7KWUucHVzaChyKTtyZXR1cm4gZX0pfX0sby5wc2V1ZG9zLm50aD1vLnBzZXVkb3MuZXE7Zm9yKG4gaW57cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pby5wc2V1ZG9zW25dPWZ0KG4pO2ZvcihuIGlue3N1Ym1pdDohMCxyZXNldDohMH0pby5wc2V1ZG9zW25dPWR0KG4pO2Z1bmN0aW9uIGd0KCl7fWd0LnByb3RvdHlwZT1vLmZpbHRlcnM9by5wc2V1ZG9zLG8uc2V0RmlsdGVycz1uZXcgZ3Q7ZnVuY3Rpb24gbXQoZSx0KXt2YXIgbixyLGksYSxzLGwsdSxjPWtbZSsiICJdO2lmKGMpcmV0dXJuIHQ/MDpjLnNsaWNlKDApO3M9ZSxsPVtdLHU9by5wcmVGaWx0ZXI7d2hpbGUocyl7KCFufHwocj1YLmV4ZWMocykpKSYmKHImJihzPXMuc2xpY2UoclswXS5sZW5ndGgpfHxzKSxsLnB1c2goaT1bXSkpLG49ITEsKHI9VS5leGVjKHMpKSYmKG49ci5zaGlmdCgpLGkucHVzaCh7dmFsdWU6bix0eXBlOnJbMF0ucmVwbGFjZSh6LCIgIil9KSxzPXMuc2xpY2Uobi5sZW5ndGgpKTtmb3IoYSBpbiBvLmZpbHRlcikhKHI9UVthXS5leGVjKHMpKXx8dVthXSYmIShyPXVbYV0ocikpfHwobj1yLnNoaWZ0KCksaS5wdXNoKHt2YWx1ZTpuLHR5cGU6YSxtYXRjaGVzOnJ9KSxzPXMuc2xpY2Uobi5sZW5ndGgpKTtpZighbilicmVha31yZXR1cm4gdD9zLmxlbmd0aDpzP2F0LmVycm9yKGUpOmsoZSxsKS5zbGljZSgwKX1mdW5jdGlvbiB5dChlKXt2YXIgdD0wLG49ZS5sZW5ndGgscj0iIjtmb3IoO24+dDt0Kyspcis9ZVt0XS52YWx1ZTtyZXR1cm4gcn1mdW5jdGlvbiB2dChlLHQsbil7dmFyIHI9dC5kaXIsbz1uJiYicGFyZW50Tm9kZSI9PT1yLGE9QysrO3JldHVybiB0LmZpcnN0P2Z1bmN0aW9uKHQsbixpKXt3aGlsZSh0PXRbcl0paWYoMT09PXQubm9kZVR5cGV8fG8pcmV0dXJuIGUodCxuLGkpfTpmdW5jdGlvbih0LG4scyl7dmFyIGwsdSxjLHA9VCsiICIrYTtpZihzKXt3aGlsZSh0PXRbcl0paWYoKDE9PT10Lm5vZGVUeXBlfHxvKSYmZSh0LG4scykpcmV0dXJuITB9ZWxzZSB3aGlsZSh0PXRbcl0paWYoMT09PXQubm9kZVR5cGV8fG8paWYoYz10W2JdfHwodFtiXT17fSksKHU9Y1tyXSkmJnVbMF09PT1wKXtpZigobD11WzFdKT09PSEwfHxsPT09aSlyZXR1cm4gbD09PSEwfWVsc2UgaWYodT1jW3JdPVtwXSx1WzFdPWUodCxuLHMpfHxpLHVbMV09PT0hMClyZXR1cm4hMH19ZnVuY3Rpb24gYnQoZSl7cmV0dXJuIGUubGVuZ3RoPjE/ZnVuY3Rpb24odCxuLHIpe3ZhciBpPWUubGVuZ3RoO3doaWxlKGktLSlpZighZVtpXSh0LG4scikpcmV0dXJuITE7cmV0dXJuITB9OmVbMF19ZnVuY3Rpb24geHQoZSx0LG4scixpKXt2YXIgbyxhPVtdLHM9MCxsPWUubGVuZ3RoLHU9bnVsbCE9dDtmb3IoO2w+cztzKyspKG89ZVtzXSkmJighbnx8bihvLHIsaSkpJiYoYS5wdXNoKG8pLHUmJnQucHVzaChzKSk7cmV0dXJuIGF9ZnVuY3Rpb24gd3QoZSx0LG4scixpLG8pe3JldHVybiByJiYhcltiXSYmKHI9d3QocikpLGkmJiFpW2JdJiYoaT13dChpLG8pKSxsdChmdW5jdGlvbihvLGEscyxsKXt2YXIgdSxjLHAsZj1bXSxkPVtdLGg9YS5sZW5ndGgsZz1vfHxOdCh0fHwiKiIscy5ub2RlVHlwZT9bc106cyxbXSksbT0hZXx8IW8mJnQ/Zzp4dChnLGYsZSxzLGwpLHk9bj9pfHwobz9lOmh8fHIpP1tdOmE6bTtpZihuJiZuKG0seSxzLGwpLHIpe3U9eHQoeSxkKSxyKHUsW10scyxsKSxjPXUubGVuZ3RoO3doaWxlKGMtLSkocD11W2NdKSYmKHlbZFtjXV09IShtW2RbY11dPXApKX1pZihvKXtpZihpfHxlKXtpZihpKXt1PVtdLGM9eS5sZW5ndGg7d2hpbGUoYy0tKShwPXlbY10pJiZ1LnB1c2gobVtjXT1wKTtpKG51bGwseT1bXSx1LGwpfWM9eS5sZW5ndGg7d2hpbGUoYy0tKShwPXlbY10pJiYodT1pP0YuY2FsbChvLHApOmZbY10pPi0xJiYob1t1XT0hKGFbdV09cCkpfX1lbHNlIHk9eHQoeT09PWE/eS5zcGxpY2UoaCx5Lmxlbmd0aCk6eSksaT9pKG51bGwsYSx5LGwpOk0uYXBwbHkoYSx5KX0pfWZ1bmN0aW9uIFR0KGUpe3ZhciB0LG4scixpPWUubGVuZ3RoLGE9by5yZWxhdGl2ZVtlWzBdLnR5cGVdLHM9YXx8by5yZWxhdGl2ZVsiICJdLGw9YT8xOjAsYz12dChmdW5jdGlvbihlKXtyZXR1cm4gZT09PXR9LHMsITApLHA9dnQoZnVuY3Rpb24oZSl7cmV0dXJuIEYuY2FsbCh0LGUpPi0xfSxzLCEwKSxmPVtmdW5jdGlvbihlLG4scil7cmV0dXJuIWEmJihyfHxuIT09dSl8fCgodD1uKS5ub2RlVHlwZT9jKGUsbixyKTpwKGUsbixyKSl9XTtmb3IoO2k+bDtsKyspaWYobj1vLnJlbGF0aXZlW2VbbF0udHlwZV0pZj1bdnQoYnQoZiksbildO2Vsc2V7aWYobj1vLmZpbHRlcltlW2xdLnR5cGVdLmFwcGx5KG51bGwsZVtsXS5tYXRjaGVzKSxuW2JdKXtmb3Iocj0rK2w7aT5yO3IrKylpZihvLnJlbGF0aXZlW2Vbcl0udHlwZV0pYnJlYWs7cmV0dXJuIHd0KGw+MSYmYnQoZiksbD4xJiZ5dChlLnNsaWNlKDAsbC0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWVbbC0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKHosIiQxIiksbixyPmwmJlR0KGUuc2xpY2UobCxyKSksaT5yJiZUdChlPWUuc2xpY2UocikpLGk+ciYmeXQoZSkpfWYucHVzaChuKX1yZXR1cm4gYnQoZil9ZnVuY3Rpb24gQ3QoZSx0KXt2YXIgbj0wLHI9dC5sZW5ndGg+MCxhPWUubGVuZ3RoPjAscz1mdW5jdGlvbihzLGwsYyxwLGQpe3ZhciBoLGcsbSx5PVtdLHY9MCxiPSIwIix4PXMmJltdLHc9bnVsbCE9ZCxDPXUsTj1zfHxhJiZvLmZpbmQuVEFHKCIqIixkJiZsLnBhcmVudE5vZGV8fGwpLGs9VCs9bnVsbD09Qz8xOk1hdGgucmFuZG9tKCl8fC4xO2Zvcih3JiYodT1sIT09ZiYmbCxpPW4pO251bGwhPShoPU5bYl0pO2IrKyl7aWYoYSYmaCl7Zz0wO3doaWxlKG09ZVtnKytdKWlmKG0oaCxsLGMpKXtwLnB1c2goaCk7YnJlYWt9dyYmKFQ9ayxpPSsrbil9ciYmKChoPSFtJiZoKSYmdi0tLHMmJngucHVzaChoKSl9aWYodis9YixyJiZiIT09dil7Zz0wO3doaWxlKG09dFtnKytdKW0oeCx5LGwsYyk7aWYocyl7aWYodj4wKXdoaWxlKGItLSl4W2JdfHx5W2JdfHwoeVtiXT1xLmNhbGwocCkpO3k9eHQoeSl9TS5hcHBseShwLHkpLHcmJiFzJiZ5Lmxlbmd0aD4wJiZ2K3QubGVuZ3RoPjEmJmF0LnVuaXF1ZVNvcnQocCl9cmV0dXJuIHcmJihUPWssdT1DKSx4fTtyZXR1cm4gcj9sdChzKTpzfWw9YXQuY29tcGlsZT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9W10saT1bXSxvPUVbZSsiICJdO2lmKCFvKXt0fHwodD1tdChlKSksbj10Lmxlbmd0aDt3aGlsZShuLS0pbz1UdCh0W25dKSxvW2JdP3IucHVzaChvKTppLnB1c2gobyk7bz1FKGUsQ3QoaSxyKSl9cmV0dXJuIG99O2Z1bmN0aW9uIE50KGUsdCxuKXt2YXIgcj0wLGk9dC5sZW5ndGg7Zm9yKDtpPnI7cisrKWF0KGUsdFtyXSxuKTtyZXR1cm4gbn1mdW5jdGlvbiBrdChlLHQsbixpKXt2YXIgYSxzLHUsYyxwLGY9bXQoZSk7aWYoIWkmJjE9PT1mLmxlbmd0aCl7aWYocz1mWzBdPWZbMF0uc2xpY2UoMCkscy5sZW5ndGg+MiYmIklEIj09PSh1PXNbMF0pLnR5cGUmJnIuZ2V0QnlJZCYmOT09PXQubm9kZVR5cGUmJmgmJm8ucmVsYXRpdmVbc1sxXS50eXBlXSl7aWYodD0oby5maW5kLklEKHUubWF0Y2hlc1swXS5yZXBsYWNlKHJ0LGl0KSx0KXx8W10pWzBdLCF0KXJldHVybiBuO2U9ZS5zbGljZShzLnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1hPVEubmVlZHNDb250ZXh0LnRlc3QoZSk/MDpzLmxlbmd0aDt3aGlsZShhLS0pe2lmKHU9c1thXSxvLnJlbGF0aXZlW2M9dS50eXBlXSlicmVhaztpZigocD1vLmZpbmRbY10pJiYoaT1wKHUubWF0Y2hlc1swXS5yZXBsYWNlKHJ0LGl0KSxWLnRlc3Qoc1swXS50eXBlKSYmdC5wYXJlbnROb2RlfHx0KSkpe2lmKHMuc3BsaWNlKGEsMSksZT1pLmxlbmd0aCYmeXQocyksIWUpcmV0dXJuIE0uYXBwbHkobixpKSxuO2JyZWFrfX19cmV0dXJuIGwoZSxmKShpLHQsIWgsbixWLnRlc3QoZSkpLG59ci5zb3J0U3RhYmxlPWIuc3BsaXQoIiIpLnNvcnQoQSkuam9pbigiIik9PT1iLHIuZGV0ZWN0RHVwbGljYXRlcz1TLHAoKSxyLnNvcnREZXRhY2hlZD11dChmdW5jdGlvbihlKXtyZXR1cm4gMSZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGYuY3JlYXRlRWxlbWVudCgiZGl2IikpfSksdXQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT1lLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8Y3QoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gcj90OmUuZ2V0QXR0cmlidXRlKG4sInR5cGUiPT09bi50b0xvd2VyQ2FzZSgpPzE6Mil9KSxyLmF0dHJpYnV0ZXMmJnV0KGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD0iPGlucHV0Lz4iLGUuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1lLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGN0KCJ2YWx1ZSIsZnVuY3Rpb24oZSxuLHIpe3JldHVybiByfHwiaW5wdXQiIT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP3Q6ZS5kZWZhdWx0VmFsdWV9KSx1dChmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZS5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIil9KXx8Y3QoQixmdW5jdGlvbihlLG4scil7dmFyIGk7cmV0dXJuIHI/dDooaT1lLmdldEF0dHJpYnV0ZU5vZGUobikpJiZpLnNwZWNpZmllZD9pLnZhbHVlOmVbbl09PT0hMD9uLnRvTG93ZXJDYXNlKCk6bnVsbH0pLHguZmluZD1hdCx4LmV4cHI9YXQuc2VsZWN0b3JzLHguZXhwclsiOiJdPXguZXhwci5wc2V1ZG9zLHgudW5pcXVlPWF0LnVuaXF1ZVNvcnQseC50ZXh0PWF0LmdldFRleHQseC5pc1hNTERvYz1hdC5pc1hNTCx4LmNvbnRhaW5zPWF0LmNvbnRhaW5zfShlKTt2YXIgTz17fTtmdW5jdGlvbiBGKGUpe3ZhciB0PU9bZV09e307cmV0dXJuIHguZWFjaChlLm1hdGNoKFQpfHxbXSxmdW5jdGlvbihlLG4pe3Rbbl09ITB9KSx0fXguQ2FsbGJhY2tzPWZ1bmN0aW9uKGUpe2U9InN0cmluZyI9PXR5cGVvZiBlP09bZV18fEYoZSk6eC5leHRlbmQoe30sZSk7dmFyIG4scixpLG8sYSxzLGw9W10sdT0hZS5vbmNlJiZbXSxjPWZ1bmN0aW9uKHQpe2ZvcihyPWUubWVtb3J5JiZ0LGk9ITAsYT1zfHwwLHM9MCxvPWwubGVuZ3RoLG49ITA7bCYmbz5hO2ErKylpZihsW2FdLmFwcGx5KHRbMF0sdFsxXSk9PT0hMSYmZS5zdG9wT25GYWxzZSl7cj0hMTticmVha31uPSExLGwmJih1P3UubGVuZ3RoJiZjKHUuc2hpZnQoKSk6cj9sPVtdOnAuZGlzYWJsZSgpKX0scD17YWRkOmZ1bmN0aW9uKCl7aWYobCl7dmFyIHQ9bC5sZW5ndGg7KGZ1bmN0aW9uIGkodCl7eC5lYWNoKHQsZnVuY3Rpb24odCxuKXt2YXIgcj14LnR5cGUobik7ImZ1bmN0aW9uIj09PXI/ZS51bmlxdWUmJnAuaGFzKG4pfHxsLnB1c2gobik6biYmbi5sZW5ndGgmJiJzdHJpbmciIT09ciYmaShuKX0pfSkoYXJndW1lbnRzKSxuP289bC5sZW5ndGg6ciYmKHM9dCxjKHIpKX1yZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIGwmJnguZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oZSx0KXt2YXIgcjt3aGlsZSgocj14LmluQXJyYXkodCxsLHIpKT4tMSlsLnNwbGljZShyLDEpLG4mJihvPj1yJiZvLS0sYT49ciYmYS0tKX0pLHRoaXN9LGhhczpmdW5jdGlvbihlKXtyZXR1cm4gZT94LmluQXJyYXkoZSxsKT4tMTohKCFsfHwhbC5sZW5ndGgpfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBsPVtdLG89MCx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGw9dT1yPXQsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hbH0sbG9jazpmdW5jdGlvbigpe3JldHVybiB1PXQscnx8cC5kaXNhYmxlKCksdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuIXV9LGZpcmVXaXRoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIWx8fGkmJiF1fHwodD10fHxbXSx0PVtlLHQuc2xpY2U/dC5zbGljZSgpOnRdLG4/dS5wdXNoKHQpOmModCkpLHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtyZXR1cm4gcC5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyksdGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWl9fTtyZXR1cm4gcH0seC5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKGUpe3ZhciB0PVtbInJlc29sdmUiLCJkb25lIix4LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwicmVzb2x2ZWQiXSxbInJlamVjdCIsImZhaWwiLHguQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZWplY3RlZCJdLFsibm90aWZ5IiwicHJvZ3Jlc3MiLHguQ2FsbGJhY2tzKCJtZW1vcnkiKV1dLG49InBlbmRpbmciLHI9e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIG59LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBpLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sdGhlbjpmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cztyZXR1cm4geC5EZWZlcnJlZChmdW5jdGlvbihuKXt4LmVhY2godCxmdW5jdGlvbih0LG8pe3ZhciBhPW9bMF0scz14LmlzRnVuY3Rpb24oZVt0XSkmJmVbdF07aVtvWzFdXShmdW5jdGlvbigpe3ZhciBlPXMmJnMuYXBwbHkodGhpcyxhcmd1bWVudHMpO2UmJnguaXNGdW5jdGlvbihlLnByb21pc2UpP2UucHJvbWlzZSgpLmRvbmUobi5yZXNvbHZlKS5mYWlsKG4ucmVqZWN0KS5wcm9ncmVzcyhuLm5vdGlmeSk6blthKyJXaXRoIl0odGhpcz09PXI/bi5wcm9taXNlKCk6dGhpcyxzP1tlXTphcmd1bWVudHMpfSl9KSxlPW51bGx9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWU/eC5leHRlbmQoZSxyKTpyfX0saT17fTtyZXR1cm4gci5waXBlPXIudGhlbix4LmVhY2godCxmdW5jdGlvbihlLG8pe3ZhciBhPW9bMl0scz1vWzNdO3Jbb1sxXV09YS5hZGQscyYmYS5hZGQoZnVuY3Rpb24oKXtuPXN9LHRbMV5lXVsyXS5kaXNhYmxlLHRbMl1bMl0ubG9jayksaVtvWzBdXT1mdW5jdGlvbigpe3JldHVybiBpW29bMF0rIldpdGgiXSh0aGlzPT09aT9yOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxpW29bMF0rIldpdGgiXT1hLmZpcmVXaXRofSksci5wcm9taXNlKGkpLGUmJmUuY2FsbChpLGkpLGl9LHdoZW46ZnVuY3Rpb24oZSl7dmFyIHQ9MCxuPWcuY2FsbChhcmd1bWVudHMpLHI9bi5sZW5ndGgsaT0xIT09cnx8ZSYmeC5pc0Z1bmN0aW9uKGUucHJvbWlzZSk/cjowLG89MT09PWk/ZTp4LkRlZmVycmVkKCksYT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKHIpe3RbZV09dGhpcyxuW2VdPWFyZ3VtZW50cy5sZW5ndGg+MT9nLmNhbGwoYXJndW1lbnRzKTpyLG49PT1zP28ubm90aWZ5V2l0aCh0LG4pOi0taXx8by5yZXNvbHZlV2l0aCh0LG4pfX0scyxsLHU7aWYocj4xKWZvcihzPUFycmF5KHIpLGw9QXJyYXkociksdT1BcnJheShyKTtyPnQ7dCsrKW5bdF0mJnguaXNGdW5jdGlvbihuW3RdLnByb21pc2UpP25bdF0ucHJvbWlzZSgpLmRvbmUoYSh0LHUsbikpLmZhaWwoby5yZWplY3QpLnByb2dyZXNzKGEodCxsLHMpKTotLWk7cmV0dXJuIGl8fG8ucmVzb2x2ZVdpdGgodSxuKSxvLnByb21pc2UoKX19KSx4LnN1cHBvcnQ9ZnVuY3Rpb24odCl7dmFyIG4scixvLHMsbCx1LGMscCxmLGQ9YS5jcmVhdGVFbGVtZW50KCJkaXYiKTtpZihkLnNldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIiwidCIpLGQuaW5uZXJIVE1MPSIgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPScvYSc+YTwvYT48aW5wdXQgdHlwZT0nY2hlY2tib3gnLz4iLG49ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpfHxbXSxyPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSwhcnx8IXIuc3R5bGV8fCFuLmxlbmd0aClyZXR1cm4gdDtzPWEuY3JlYXRlRWxlbWVudCgic2VsZWN0IiksdT1zLmFwcGVuZENoaWxkKGEuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLG89ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKVswXSxyLnN0eWxlLmNzc1RleHQ9InRvcDoxcHg7ZmxvYXQ6bGVmdDtvcGFjaXR5Oi41Iix0LmdldFNldEF0dHJpYnV0ZT0idCIhPT1kLmNsYXNzTmFtZSx0LmxlYWRpbmdXaGl0ZXNwYWNlPTM9PT1kLmZpcnN0Q2hpbGQubm9kZVR5cGUsdC50Ym9keT0hZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsdC5odG1sU2VyaWFsaXplPSEhZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCx0LnN0eWxlPS90b3AvLnRlc3Qoci5nZXRBdHRyaWJ1dGUoInN0eWxlIikpLHQuaHJlZk5vcm1hbGl6ZWQ9Ii9hIj09PXIuZ2V0QXR0cmlidXRlKCJocmVmIiksdC5vcGFjaXR5PS9eMC41Ly50ZXN0KHIuc3R5bGUub3BhY2l0eSksdC5jc3NGbG9hdD0hIXIuc3R5bGUuY3NzRmxvYXQsdC5jaGVja09uPSEhby52YWx1ZSx0Lm9wdFNlbGVjdGVkPXUuc2VsZWN0ZWQsdC5lbmN0eXBlPSEhYS5jcmVhdGVFbGVtZW50KCJmb3JtIikuZW5jdHlwZSx0Lmh0bWw1Q2xvbmU9Ijw6bmF2PjwvOm5hdj4iIT09YS5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCx0LmlubGluZUJsb2NrTmVlZHNMYXlvdXQ9ITEsdC5zaHJpbmtXcmFwQmxvY2tzPSExLHQucGl4ZWxQb3NpdGlvbj0hMSx0LmRlbGV0ZUV4cGFuZG89ITAsdC5ub0Nsb25lRXZlbnQ9ITAsdC5yZWxpYWJsZU1hcmdpblJpZ2h0PSEwLHQuYm94U2l6aW5nUmVsaWFibGU9ITAsby5jaGVja2VkPSEwLHQubm9DbG9uZUNoZWNrZWQ9by5jbG9uZU5vZGUoITApLmNoZWNrZWQscy5kaXNhYmxlZD0hMCx0Lm9wdERpc2FibGVkPSF1LmRpc2FibGVkO3RyeXtkZWxldGUgZC50ZXN0fWNhdGNoKGgpe3QuZGVsZXRlRXhwYW5kbz0hMX1vPWEuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxvLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSx0LmlucHV0PSIiPT09by5nZXRBdHRyaWJ1dGUoInZhbHVlIiksby52YWx1ZT0idCIsby5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLHQucmFkaW9WYWx1ZT0idCI9PT1vLnZhbHVlLG8uc2V0QXR0cmlidXRlKCJjaGVja2VkIiwidCIpLG8uc2V0QXR0cmlidXRlKCJuYW1lIiwidCIpLGw9YS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksbC5hcHBlbmRDaGlsZChvKSx0LmFwcGVuZENoZWNrZWQ9by5jaGVja2VkLHQuY2hlY2tDbG9uZT1sLmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCxkLmF0dGFjaEV2ZW50JiYoZC5hdHRhY2hFdmVudCgib25jbGljayIsZnVuY3Rpb24oKXt0Lm5vQ2xvbmVFdmVudD0hMX0pLGQuY2xvbmVOb2RlKCEwKS5jbGljaygpKTtmb3IoZiBpbntzdWJtaXQ6ITAsY2hhbmdlOiEwLGZvY3VzaW46ITB9KWQuc2V0QXR0cmlidXRlKGM9Im9uIitmLCJ0IiksdFtmKyJCdWJibGVzIl09YyBpbiBlfHxkLmF0dHJpYnV0ZXNbY10uZXhwYW5kbz09PSExO2Quc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixkLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIsdC5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWQuc3R5bGUuYmFja2dyb3VuZENsaXA7Zm9yKGYgaW4geCh0KSlicmVhaztyZXR1cm4gdC5vd25MYXN0PSIwIiE9PWYseChmdW5jdGlvbigpe3ZhciBuLHIsbyxzPSJwYWRkaW5nOjA7bWFyZ2luOjA7Ym9yZGVyOjA7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDstd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7IixsPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXTtsJiYobj1hLmNyZWF0ZUVsZW1lbnQoImRpdiIpLG4uc3R5bGUuY3NzVGV4dD0iYm9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0Oi05OTk5cHg7bWFyZ2luLXRvcDoxcHgiLGwuYXBwZW5kQ2hpbGQobikuYXBwZW5kQ2hpbGQoZCksZC5pbm5lckhUTUw9Ijx0YWJsZT48dHI+PHRkPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLG89ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSxvWzBdLnN0eWxlLmNzc1RleHQ9InBhZGRpbmc6MDttYXJnaW46MDtib3JkZXI6MDtkaXNwbGF5Om5vbmUiLHA9MD09PW9bMF0ub2Zmc2V0SGVpZ2h0LG9bMF0uc3R5bGUuZGlzcGxheT0iIixvWzFdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHQucmVsaWFibGVIaWRkZW5PZmZzZXRzPXAmJjA9PT1vWzBdLm9mZnNldEhlaWdodCxkLmlubmVySFRNTD0iIixkLnN0eWxlLmNzc1RleHQ9ImJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDstd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjFweDtib3JkZXI6MXB4O2Rpc3BsYXk6YmxvY2s7d2lkdGg6NHB4O21hcmdpbi10b3A6MSU7cG9zaXRpb246YWJzb2x1dGU7dG9wOjElOyIseC5zd2FwKGwsbnVsbCE9bC5zdHlsZS56b29tP3t6b29tOjF9Ont9LGZ1bmN0aW9uKCl7dC5ib3hTaXppbmc9ND09PWQub2Zmc2V0V2lkdGh9KSxlLmdldENvbXB1dGVkU3R5bGUmJih0LnBpeGVsUG9zaXRpb249IjElIiE9PShlLmdldENvbXB1dGVkU3R5bGUoZCxudWxsKXx8e30pLnRvcCx0LmJveFNpemluZ1JlbGlhYmxlPSI0cHgiPT09KGUuZ2V0Q29tcHV0ZWRTdHlsZShkLG51bGwpfHx7d2lkdGg6IjRweCJ9KS53aWR0aCxyPWQuYXBwZW5kQ2hpbGQoYS5jcmVhdGVFbGVtZW50KCJkaXYiKSksci5zdHlsZS5jc3NUZXh0PWQuc3R5bGUuY3NzVGV4dD1zLHIuc3R5bGUubWFyZ2luUmlnaHQ9ci5zdHlsZS53aWR0aD0iMCIsZC5zdHlsZS53aWR0aD0iMXB4Iix0LnJlbGlhYmxlTWFyZ2luUmlnaHQ9IXBhcnNlRmxvYXQoKGUuZ2V0Q29tcHV0ZWRTdHlsZShyLG51bGwpfHx7fSkubWFyZ2luUmlnaHQpKSx0eXBlb2YgZC5zdHlsZS56b29tIT09aSYmKGQuaW5uZXJIVE1MPSIiLGQuc3R5bGUuY3NzVGV4dD1zKyJ3aWR0aDoxcHg7cGFkZGluZzoxcHg7ZGlzcGxheTppbmxpbmU7em9vbToxIix0LmlubGluZUJsb2NrTmVlZHNMYXlvdXQ9Mz09PWQub2Zmc2V0V2lkdGgsZC5zdHlsZS5kaXNwbGF5PSJibG9jayIsZC5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IixkLmZpcnN0Q2hpbGQuc3R5bGUud2lkdGg9IjVweCIsdC5zaHJpbmtXcmFwQmxvY2tzPTMhPT1kLm9mZnNldFdpZHRoLHQuaW5saW5lQmxvY2tOZWVkc0xheW91dCYmKGwuc3R5bGUuem9vbT0xKSksbC5yZW1vdmVDaGlsZChuKSxuPWQ9bz1yPW51bGwpfSksbj1zPWw9dT1yPW89bnVsbCx0Cn0oe30pO3ZhciBCPS8oPzpce1tcc1xTXSpcfXxcW1tcc1xTXSpcXSkkLyxQPS8oW0EtWl0pL2c7ZnVuY3Rpb24gUihlLG4scixpKXtpZih4LmFjY2VwdERhdGEoZSkpe3ZhciBvLGEscz14LmV4cGFuZG8sbD1lLm5vZGVUeXBlLHU9bD94LmNhY2hlOmUsYz1sP2Vbc106ZVtzXSYmcztpZihjJiZ1W2NdJiYoaXx8dVtjXS5kYXRhKXx8ciE9PXR8fCJzdHJpbmciIT10eXBlb2YgbilyZXR1cm4gY3x8KGM9bD9lW3NdPXAucG9wKCl8fHguZ3VpZCsrOnMpLHVbY118fCh1W2NdPWw/e306e3RvSlNPTjp4Lm5vb3B9KSwoIm9iamVjdCI9PXR5cGVvZiBufHwiZnVuY3Rpb24iPT10eXBlb2YgbikmJihpP3VbY109eC5leHRlbmQodVtjXSxuKTp1W2NdLmRhdGE9eC5leHRlbmQodVtjXS5kYXRhLG4pKSxhPXVbY10saXx8KGEuZGF0YXx8KGEuZGF0YT17fSksYT1hLmRhdGEpLHIhPT10JiYoYVt4LmNhbWVsQ2FzZShuKV09ciksInN0cmluZyI9PXR5cGVvZiBuPyhvPWFbbl0sbnVsbD09byYmKG89YVt4LmNhbWVsQ2FzZShuKV0pKTpvPWEsb319ZnVuY3Rpb24gVyhlLHQsbil7aWYoeC5hY2NlcHREYXRhKGUpKXt2YXIgcixpLG89ZS5ub2RlVHlwZSxhPW8/eC5jYWNoZTplLHM9bz9lW3guZXhwYW5kb106eC5leHBhbmRvO2lmKGFbc10pe2lmKHQmJihyPW4/YVtzXTphW3NdLmRhdGEpKXt4LmlzQXJyYXkodCk/dD10LmNvbmNhdCh4Lm1hcCh0LHguY2FtZWxDYXNlKSk6dCBpbiByP3Q9W3RdOih0PXguY2FtZWxDYXNlKHQpLHQ9dCBpbiByP1t0XTp0LnNwbGl0KCIgIikpLGk9dC5sZW5ndGg7d2hpbGUoaS0tKWRlbGV0ZSByW3RbaV1dO2lmKG4/IUkocik6IXguaXNFbXB0eU9iamVjdChyKSlyZXR1cm59KG58fChkZWxldGUgYVtzXS5kYXRhLEkoYVtzXSkpKSYmKG8/eC5jbGVhbkRhdGEoW2VdLCEwKTp4LnN1cHBvcnQuZGVsZXRlRXhwYW5kb3x8YSE9YS53aW5kb3c/ZGVsZXRlIGFbc106YVtzXT1udWxsKX19fXguZXh0ZW5kKHtjYWNoZTp7fSxub0RhdGE6e2FwcGxldDohMCxlbWJlZDohMCxvYmplY3Q6ImNsc2lkOkQyN0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0NDU1MzU0MDAwMCJ9LGhhc0RhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZS5ub2RlVHlwZT94LmNhY2hlW2VbeC5leHBhbmRvXV06ZVt4LmV4cGFuZG9dLCEhZSYmIUkoZSl9LGRhdGE6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBSKGUsdCxuKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe3JldHVybiBXKGUsdCl9LF9kYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gUihlLHQsbiwhMCl9LF9yZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFcoZSx0LCEwKX0sYWNjZXB0RGF0YTpmdW5jdGlvbihlKXtpZihlLm5vZGVUeXBlJiYxIT09ZS5ub2RlVHlwZSYmOSE9PWUubm9kZVR5cGUpcmV0dXJuITE7dmFyIHQ9ZS5ub2RlTmFtZSYmeC5ub0RhdGFbZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXTtyZXR1cm4hdHx8dCE9PSEwJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3NpZCIpPT09dH19KSx4LmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihlLG4pe3ZhciByLGksbz1udWxsLGE9MCxzPXRoaXNbMF07aWYoZT09PXQpe2lmKHRoaXMubGVuZ3RoJiYobz14LmRhdGEocyksMT09PXMubm9kZVR5cGUmJiF4Ll9kYXRhKHMsInBhcnNlZEF0dHJzIikpKXtmb3Iocj1zLmF0dHJpYnV0ZXM7ci5sZW5ndGg+YTthKyspaT1yW2FdLm5hbWUsMD09PWkuaW5kZXhPZigiZGF0YS0iKSYmKGk9eC5jYW1lbENhc2UoaS5zbGljZSg1KSksJChzLGksb1tpXSkpO3guX2RhdGEocywicGFyc2VkQXR0cnMiLCEwKX1yZXR1cm4gb31yZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGU/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7eC5kYXRhKHRoaXMsZSl9KTphcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7eC5kYXRhKHRoaXMsZSxuKX0pOnM/JChzLGUseC5kYXRhKHMsZSkpOm51bGx9LHJlbW92ZURhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3gucmVtb3ZlRGF0YSh0aGlzLGUpfSl9fSk7ZnVuY3Rpb24gJChlLG4scil7aWYocj09PXQmJjE9PT1lLm5vZGVUeXBlKXt2YXIgaT0iZGF0YS0iK24ucmVwbGFjZShQLCItJDEiKS50b0xvd2VyQ2FzZSgpO2lmKHI9ZS5nZXRBdHRyaWJ1dGUoaSksInN0cmluZyI9PXR5cGVvZiByKXt0cnl7cj0idHJ1ZSI9PT1yPyEwOiJmYWxzZSI9PT1yPyExOiJudWxsIj09PXI/bnVsbDorcisiIj09PXI/K3I6Qi50ZXN0KHIpP3gucGFyc2VKU09OKHIpOnJ9Y2F0Y2gobyl7fXguZGF0YShlLG4scil9ZWxzZSByPXR9cmV0dXJuIHJ9ZnVuY3Rpb24gSShlKXt2YXIgdDtmb3IodCBpbiBlKWlmKCgiZGF0YSIhPT10fHwheC5pc0VtcHR5T2JqZWN0KGVbdF0pKSYmInRvSlNPTiIhPT10KXJldHVybiExO3JldHVybiEwfXguZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihlLG4scil7dmFyIGk7cmV0dXJuIGU/KG49KG58fCJmeCIpKyJxdWV1ZSIsaT14Ll9kYXRhKGUsbiksciYmKCFpfHx4LmlzQXJyYXkocik/aT14Ll9kYXRhKGUsbix4Lm1ha2VBcnJheShyKSk6aS5wdXNoKHIpKSxpfHxbXSk6dH0sZGVxdWV1ZTpmdW5jdGlvbihlLHQpe3Q9dHx8ImZ4Ijt2YXIgbj14LnF1ZXVlKGUsdCkscj1uLmxlbmd0aCxpPW4uc2hpZnQoKSxvPXguX3F1ZXVlSG9va3MoZSx0KSxhPWZ1bmN0aW9uKCl7eC5kZXF1ZXVlKGUsdCl9OyJpbnByb2dyZXNzIj09PWkmJihpPW4uc2hpZnQoKSxyLS0pLGkmJigiZngiPT09dCYmbi51bnNoaWZ0KCJpbnByb2dyZXNzIiksZGVsZXRlIG8uc3RvcCxpLmNhbGwoZSxhLG8pKSwhciYmbyYmby5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dCsicXVldWVIb29rcyI7cmV0dXJuIHguX2RhdGEoZSxuKXx8eC5fZGF0YShlLG4se2VtcHR5OnguQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpe3guX3JlbW92ZURhdGEoZSx0KyJxdWV1ZSIpLHguX3JlbW92ZURhdGEoZSxuKX0pfSl9fSkseC5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGUsbil7dmFyIHI9MjtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGUmJihuPWUsZT0iZngiLHItLSkscj5hcmd1bWVudHMubGVuZ3RoP3gucXVldWUodGhpc1swXSxlKTpuPT09dD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PXgucXVldWUodGhpcyxlLG4pO3guX3F1ZXVlSG9va3ModGhpcyxlKSwiZngiPT09ZSYmImlucHJvZ3Jlc3MiIT09dFswXSYmeC5kZXF1ZXVlKHRoaXMsZSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7eC5kZXF1ZXVlKHRoaXMsZSl9KX0sZGVsYXk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT14LmZ4P3guZnguc3BlZWRzW2VdfHxlOmUsdD10fHwiZngiLHRoaXMucXVldWUodCxmdW5jdGlvbih0LG4pe3ZhciByPXNldFRpbWVvdXQodCxlKTtuLnN0b3A9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQocil9fSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucXVldWUoZXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oZSxuKXt2YXIgcixpPTEsbz14LkRlZmVycmVkKCksYT10aGlzLHM9dGhpcy5sZW5ndGgsbD1mdW5jdGlvbigpey0taXx8by5yZXNvbHZlV2l0aChhLFthXSl9OyJzdHJpbmciIT10eXBlb2YgZSYmKG49ZSxlPXQpLGU9ZXx8ImZ4Ijt3aGlsZShzLS0pcj14Ll9kYXRhKGFbc10sZSsicXVldWVIb29rcyIpLHImJnIuZW1wdHkmJihpKyssci5lbXB0eS5hZGQobCkpO3JldHVybiBsKCksby5wcm9taXNlKG4pfX0pO3ZhciB6LFgsVT0vW1x0XHJcblxmXS9nLFY9L1xyL2csWT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0KSQvaSxKPS9eKD86YXxhcmVhKSQvaSxHPS9eKD86Y2hlY2tlZHxzZWxlY3RlZCkkL2ksUT14LnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRlLEs9eC5zdXBwb3J0LmlucHV0O3guZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHguYWNjZXNzKHRoaXMseC5hdHRyLGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt4LnJlbW92ZUF0dHIodGhpcyxlKX0pfSxwcm9wOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHguYWNjZXNzKHRoaXMseC5wcm9wLGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGUpe3JldHVybiBlPXgucHJvcEZpeFtlXXx8ZSx0aGlzLmVhY2goZnVuY3Rpb24oKXt0cnl7dGhpc1tlXT10LGRlbGV0ZSB0aGlzW2VdfWNhdGNoKG4pe319KX0sYWRkQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhPTAscz10aGlzLmxlbmd0aCxsPSJzdHJpbmciPT10eXBlb2YgZSYmZTtpZih4LmlzRnVuY3Rpb24oZSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbih0KXt4KHRoaXMpLmFkZENsYXNzKGUuY2FsbCh0aGlzLHQsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGwpZm9yKHQ9KGV8fCIiKS5tYXRjaChUKXx8W107cz5hO2ErKylpZihuPXRoaXNbYV0scj0xPT09bi5ub2RlVHlwZSYmKG4uY2xhc3NOYW1lPygiICIrbi5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKFUsIiAiKToiICIpKXtvPTA7d2hpbGUoaT10W28rK10pMD5yLmluZGV4T2YoIiAiK2krIiAiKSYmKHIrPWkrIiAiKTtuLmNsYXNzTmFtZT14LnRyaW0ocil9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG8sYT0wLHM9dGhpcy5sZW5ndGgsbD0wPT09YXJndW1lbnRzLmxlbmd0aHx8InN0cmluZyI9PXR5cGVvZiBlJiZlO2lmKHguaXNGdW5jdGlvbihlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3godGhpcykucmVtb3ZlQ2xhc3MoZS5jYWxsKHRoaXMsdCx0aGlzLmNsYXNzTmFtZSkpfSk7aWYobClmb3IodD0oZXx8IiIpLm1hdGNoKFQpfHxbXTtzPmE7YSsrKWlmKG49dGhpc1thXSxyPTE9PT1uLm5vZGVUeXBlJiYobi5jbGFzc05hbWU/KCIgIituLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoVSwiICIpOiIiKSl7bz0wO3doaWxlKGk9dFtvKytdKXdoaWxlKHIuaW5kZXhPZigiICIraSsiICIpPj0wKXI9ci5yZXBsYWNlKCIgIitpKyIgIiwiICIpO24uY2xhc3NOYW1lPWU/eC50cmltKHIpOiIifXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihlLHQpe3ZhciBuPXR5cGVvZiBlO3JldHVybiJib29sZWFuIj09dHlwZW9mIHQmJiJzdHJpbmciPT09bj90P3RoaXMuYWRkQ2xhc3MoZSk6dGhpcy5yZW1vdmVDbGFzcyhlKTp4LmlzRnVuY3Rpb24oZSk/dGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3godGhpcykudG9nZ2xlQ2xhc3MoZS5jYWxsKHRoaXMsbix0aGlzLmNsYXNzTmFtZSx0KSx0KX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe2lmKCJzdHJpbmciPT09bil7dmFyIHQscj0wLG89eCh0aGlzKSxhPWUubWF0Y2goVCl8fFtdO3doaWxlKHQ9YVtyKytdKW8uaGFzQ2xhc3ModCk/by5yZW1vdmVDbGFzcyh0KTpvLmFkZENsYXNzKHQpfWVsc2Uobj09PWl8fCJib29sZWFuIj09PW4pJiYodGhpcy5jbGFzc05hbWUmJnguX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIsdGhpcy5jbGFzc05hbWUpLHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lfHxlPT09ITE/IiI6eC5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKX0pfSxoYXNDbGFzczpmdW5jdGlvbihlKXt2YXIgdD0iICIrZSsiICIsbj0wLHI9dGhpcy5sZW5ndGg7Zm9yKDtyPm47bisrKWlmKDE9PT10aGlzW25dLm5vZGVUeXBlJiYoIiAiK3RoaXNbbl0uY2xhc3NOYW1lKyIgIikucmVwbGFjZShVLCIgIikuaW5kZXhPZih0KT49MClyZXR1cm4hMDtyZXR1cm4hMX0sdmFsOmZ1bmN0aW9uKGUpe3ZhciBuLHIsaSxvPXRoaXNbMF07e2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGk9eC5pc0Z1bmN0aW9uKGUpLHRoaXMuZWFjaChmdW5jdGlvbihuKXt2YXIgbzsxPT09dGhpcy5ub2RlVHlwZSYmKG89aT9lLmNhbGwodGhpcyxuLHgodGhpcykudmFsKCkpOmUsbnVsbD09bz9vPSIiOiJudW1iZXIiPT10eXBlb2Ygbz9vKz0iIjp4LmlzQXJyYXkobykmJihvPXgubWFwKG8sZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6ZSsiIn0pKSxyPXgudmFsSG9va3NbdGhpcy50eXBlXXx8eC52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLHImJiJzZXQiaW4gciYmci5zZXQodGhpcyxvLCJ2YWx1ZSIpIT09dHx8KHRoaXMudmFsdWU9bykpfSk7aWYobylyZXR1cm4gcj14LnZhbEhvb2tzW28udHlwZV18fHgudmFsSG9va3Nbby5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxyJiYiZ2V0ImluIHImJihuPXIuZ2V0KG8sInZhbHVlIikpIT09dD9uOihuPW8udmFsdWUsInN0cmluZyI9PXR5cGVvZiBuP24ucmVwbGFjZShWLCIiKTpudWxsPT1uPyIiOm4pfX19KSx4LmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PXguZmluZC5hdHRyKGUsInZhbHVlIik7cmV0dXJuIG51bGwhPXQ/dDplLnRleHR9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihlKXt2YXIgdCxuLHI9ZS5vcHRpb25zLGk9ZS5zZWxlY3RlZEluZGV4LG89InNlbGVjdC1vbmUiPT09ZS50eXBlfHwwPmksYT1vP251bGw6W10scz1vP2krMTpyLmxlbmd0aCxsPTA+aT9zOm8/aTowO2Zvcig7cz5sO2wrKylpZihuPXJbbF0sISghbi5zZWxlY3RlZCYmbCE9PWl8fCh4LnN1cHBvcnQub3B0RGlzYWJsZWQ/bi5kaXNhYmxlZDpudWxsIT09bi5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikpfHxuLnBhcmVudE5vZGUuZGlzYWJsZWQmJngubm9kZU5hbWUobi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYodD14KG4pLnZhbCgpLG8pcmV0dXJuIHQ7YS5wdXNoKHQpfXJldHVybiBhfSxzZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9ZS5vcHRpb25zLG89eC5tYWtlQXJyYXkodCksYT1pLmxlbmd0aDt3aGlsZShhLS0pcj1pW2FdLChyLnNlbGVjdGVkPXguaW5BcnJheSh4KHIpLnZhbCgpLG8pPj0wKSYmKG49ITApO3JldHVybiBufHwoZS5zZWxlY3RlZEluZGV4PS0xKSxvfX19LGF0dHI6ZnVuY3Rpb24oZSxuLHIpe3ZhciBvLGEscz1lLm5vZGVUeXBlO2lmKGUmJjMhPT1zJiY4IT09cyYmMiE9PXMpcmV0dXJuIHR5cGVvZiBlLmdldEF0dHJpYnV0ZT09PWk/eC5wcm9wKGUsbixyKTooMT09PXMmJnguaXNYTUxEb2MoZSl8fChuPW4udG9Mb3dlckNhc2UoKSxvPXguYXR0ckhvb2tzW25dfHwoeC5leHByLm1hdGNoLmJvb2wudGVzdChuKT9YOnopKSxyPT09dD9vJiYiZ2V0ImluIG8mJm51bGwhPT0oYT1vLmdldChlLG4pKT9hOihhPXguZmluZC5hdHRyKGUsbiksbnVsbD09YT90OmEpOm51bGwhPT1yP28mJiJzZXQiaW4gbyYmKGE9by5zZXQoZSxyLG4pKSE9PXQ/YTooZS5zZXRBdHRyaWJ1dGUobixyKyIiKSxyKTooeC5yZW1vdmVBdHRyKGUsbiksdCkpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPTAsbz10JiZ0Lm1hdGNoKFQpO2lmKG8mJjE9PT1lLm5vZGVUeXBlKXdoaWxlKG49b1tpKytdKXI9eC5wcm9wRml4W25dfHxuLHguZXhwci5tYXRjaC5ib29sLnRlc3Qobik/SyYmUXx8IUcudGVzdChuKT9lW3JdPSExOmVbeC5jYW1lbENhc2UoImRlZmF1bHQtIituKV09ZVtyXT0hMTp4LmF0dHIoZSxuLCIiKSxlLnJlbW92ZUF0dHJpYnV0ZShRP246cil9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGUsdCl7aWYoIXguc3VwcG9ydC5yYWRpb1ZhbHVlJiYicmFkaW8iPT09dCYmeC5ub2RlTmFtZShlLCJpbnB1dCIpKXt2YXIgbj1lLnZhbHVlO3JldHVybiBlLnNldEF0dHJpYnV0ZSgidHlwZSIsdCksbiYmKGUudmFsdWU9biksdH19fX0scHJvcEZpeDp7ImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSJ9LHByb3A6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpLG8sYSxzPWUubm9kZVR5cGU7aWYoZSYmMyE9PXMmJjghPT1zJiYyIT09cylyZXR1cm4gYT0xIT09c3x8IXguaXNYTUxEb2MoZSksYSYmKG49eC5wcm9wRml4W25dfHxuLG89eC5wcm9wSG9va3Nbbl0pLHIhPT10P28mJiJzZXQiaW4gbyYmKGk9by5zZXQoZSxyLG4pKSE9PXQ/aTplW25dPXI6byYmImdldCJpbiBvJiZudWxsIT09KGk9by5nZXQoZSxuKSk/aTplW25dfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9eC5maW5kLmF0dHIoZSwidGFiaW5kZXgiKTtyZXR1cm4gdD9wYXJzZUludCh0LDEwKTpZLnRlc3QoZS5ub2RlTmFtZSl8fEoudGVzdChlLm5vZGVOYW1lKSYmZS5ocmVmPzA6LTF9fX19KSxYPXtzZXQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0PT09ITE/eC5yZW1vdmVBdHRyKGUsbik6SyYmUXx8IUcudGVzdChuKT9lLnNldEF0dHJpYnV0ZSghUSYmeC5wcm9wRml4W25dfHxuLG4pOmVbeC5jYW1lbENhc2UoImRlZmF1bHQtIituKV09ZVtuXT0hMCxufX0seC5lYWNoKHguZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKGUsbil7dmFyIHI9eC5leHByLmF0dHJIYW5kbGVbbl18fHguZmluZC5hdHRyO3guZXhwci5hdHRySGFuZGxlW25dPUsmJlF8fCFHLnRlc3Qobik/ZnVuY3Rpb24oZSxuLGkpe3ZhciBvPXguZXhwci5hdHRySGFuZGxlW25dLGE9aT90Oih4LmV4cHIuYXR0ckhhbmRsZVtuXT10KSE9cihlLG4saSk/bi50b0xvd2VyQ2FzZSgpOm51bGw7cmV0dXJuIHguZXhwci5hdHRySGFuZGxlW25dPW8sYX06ZnVuY3Rpb24oZSxuLHIpe3JldHVybiByP3Q6ZVt4LmNhbWVsQ2FzZSgiZGVmYXVsdC0iK24pXT9uLnRvTG93ZXJDYXNlKCk6bnVsbH19KSxLJiZRfHwoeC5hdHRySG9va3MudmFsdWU9e3NldDpmdW5jdGlvbihlLG4scil7cmV0dXJuIHgubm9kZU5hbWUoZSwiaW5wdXQiKT8oZS5kZWZhdWx0VmFsdWU9bix0KTp6JiZ6LnNldChlLG4scil9fSksUXx8KHo9e3NldDpmdW5jdGlvbihlLG4scil7dmFyIGk9ZS5nZXRBdHRyaWJ1dGVOb2RlKHIpO3JldHVybiBpfHxlLnNldEF0dHJpYnV0ZU5vZGUoaT1lLm93bmVyRG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKHIpKSxpLnZhbHVlPW4rPSIiLCJ2YWx1ZSI9PT1yfHxuPT09ZS5nZXRBdHRyaWJ1dGUocik/bjp0fX0seC5leHByLmF0dHJIYW5kbGUuaWQ9eC5leHByLmF0dHJIYW5kbGUubmFtZT14LmV4cHIuYXR0ckhhbmRsZS5jb29yZHM9ZnVuY3Rpb24oZSxuLHIpe3ZhciBpO3JldHVybiByP3Q6KGk9ZS5nZXRBdHRyaWJ1dGVOb2RlKG4pKSYmIiIhPT1pLnZhbHVlP2kudmFsdWU6bnVsbH0seC52YWxIb29rcy5idXR0b249e2dldDpmdW5jdGlvbihlLG4pe3ZhciByPWUuZ2V0QXR0cmlidXRlTm9kZShuKTtyZXR1cm4gciYmci5zcGVjaWZpZWQ/ci52YWx1ZTp0fSxzZXQ6ei5zZXR9LHguYXR0ckhvb2tzLmNvbnRlbnRlZGl0YWJsZT17c2V0OmZ1bmN0aW9uKGUsdCxuKXt6LnNldChlLCIiPT09dD8hMTp0LG4pfX0seC5lYWNoKFsid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihlLG4pe3guYXR0ckhvb2tzW25dPXtzZXQ6ZnVuY3Rpb24oZSxyKXtyZXR1cm4iIj09PXI/KGUuc2V0QXR0cmlidXRlKG4sImF1dG8iKSxyKTp0fX19KSkseC5zdXBwb3J0LmhyZWZOb3JtYWxpemVkfHx4LmVhY2goWyJocmVmIiwic3JjIl0sZnVuY3Rpb24oZSx0KXt4LnByb3BIb29rc1t0XT17Z2V0OmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSh0LDQpfX19KSx4LnN1cHBvcnQuc3R5bGV8fCh4LmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1bmN0aW9uKGUpe3JldHVybiBlLnN0eWxlLmNzc1RleHR8fHR9LHNldDpmdW5jdGlvbihlLHQpe3JldHVybiBlLnN0eWxlLmNzc1RleHQ9dCsiIn19KSx4LnN1cHBvcnQub3B0U2VsZWN0ZWR8fCh4LnByb3BIb29rcy5zZWxlY3RlZD17Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmKHQuc2VsZWN0ZWRJbmRleCx0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KSxudWxsfX0pLHguZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7eC5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pLHguc3VwcG9ydC5lbmN0eXBlfHwoeC5wcm9wRml4LmVuY3R5cGU9ImVuY29kaW5nIikseC5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7eC52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGUsbil7cmV0dXJuIHguaXNBcnJheShuKT9lLmNoZWNrZWQ9eC5pbkFycmF5KHgoZSkudmFsKCksbik+PTA6dH19LHguc3VwcG9ydC5jaGVja09ufHwoeC52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PT1lLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmUudmFsdWV9KX0pO3ZhciBaPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhKSQvaSxldD0vXmtleS8sdHQ9L14oPzptb3VzZXxjb250ZXh0bWVudSl8Y2xpY2svLG50PS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxydD0vXihbXi5dKikoPzpcLiguKyl8KSQvO2Z1bmN0aW9uIGl0KCl7cmV0dXJuITB9ZnVuY3Rpb24gb3QoKXtyZXR1cm4hMX1mdW5jdGlvbiBhdCgpe3RyeXtyZXR1cm4gYS5hY3RpdmVFbGVtZW50fWNhdGNoKGUpe319eC5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbihlLG4scixvLGEpe3ZhciBzLGwsdSxjLHAsZixkLGgsZyxtLHksdj14Ll9kYXRhKGUpO2lmKHYpe3IuaGFuZGxlciYmKGM9cixyPWMuaGFuZGxlcixhPWMuc2VsZWN0b3IpLHIuZ3VpZHx8KHIuZ3VpZD14Lmd1aWQrKyksKGw9di5ldmVudHMpfHwobD12LmV2ZW50cz17fSksKGY9di5oYW5kbGUpfHwoZj12LmhhbmRsZT1mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIHg9PT1pfHxlJiZ4LmV2ZW50LnRyaWdnZXJlZD09PWUudHlwZT90OnguZXZlbnQuZGlzcGF0Y2guYXBwbHkoZi5lbGVtLGFyZ3VtZW50cyl9LGYuZWxlbT1lKSxuPShufHwiIikubWF0Y2goVCl8fFsiIl0sdT1uLmxlbmd0aDt3aGlsZSh1LS0pcz1ydC5leGVjKG5bdV0pfHxbXSxnPXk9c1sxXSxtPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZyYmKHA9eC5ldmVudC5zcGVjaWFsW2ddfHx7fSxnPShhP3AuZGVsZWdhdGVUeXBlOnAuYmluZFR5cGUpfHxnLHA9eC5ldmVudC5zcGVjaWFsW2ddfHx7fSxkPXguZXh0ZW5kKHt0eXBlOmcsb3JpZ1R5cGU6eSxkYXRhOm8saGFuZGxlcjpyLGd1aWQ6ci5ndWlkLHNlbGVjdG9yOmEsbmVlZHNDb250ZXh0OmEmJnguZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChhKSxuYW1lc3BhY2U6bS5qb2luKCIuIil9LGMpLChoPWxbZ10pfHwoaD1sW2ddPVtdLGguZGVsZWdhdGVDb3VudD0wLHAuc2V0dXAmJnAuc2V0dXAuY2FsbChlLG8sbSxmKSE9PSExfHwoZS5hZGRFdmVudExpc3RlbmVyP2UuYWRkRXZlbnRMaXN0ZW5lcihnLGYsITEpOmUuYXR0YWNoRXZlbnQmJmUuYXR0YWNoRXZlbnQoIm9uIitnLGYpKSkscC5hZGQmJihwLmFkZC5jYWxsKGUsZCksZC5oYW5kbGVyLmd1aWR8fChkLmhhbmRsZXIuZ3VpZD1yLmd1aWQpKSxhP2guc3BsaWNlKGguZGVsZWdhdGVDb3VudCsrLDAsZCk6aC5wdXNoKGQpLHguZXZlbnQuZ2xvYmFsW2ddPSEwKTtlPW51bGx9fSxyZW1vdmU6ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsbCx1LGMscCxmLGQsaCxnLG09eC5oYXNEYXRhKGUpJiZ4Ll9kYXRhKGUpO2lmKG0mJihjPW0uZXZlbnRzKSl7dD0odHx8IiIpLm1hdGNoKFQpfHxbIiJdLHU9dC5sZW5ndGg7d2hpbGUodS0tKWlmKHM9cnQuZXhlYyh0W3VdKXx8W10sZD1nPXNbMV0saD0oc1syXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLGQpe3A9eC5ldmVudC5zcGVjaWFsW2RdfHx7fSxkPShyP3AuZGVsZWdhdGVUeXBlOnAuYmluZFR5cGUpfHxkLGY9Y1tkXXx8W10scz1zWzJdJiZSZWdFeHAoIihefFxcLikiK2guam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIiksbD1vPWYubGVuZ3RoO3doaWxlKG8tLSlhPWZbb10sIWkmJmchPT1hLm9yaWdUeXBlfHxuJiZuLmd1aWQhPT1hLmd1aWR8fHMmJiFzLnRlc3QoYS5uYW1lc3BhY2UpfHxyJiZyIT09YS5zZWxlY3RvciYmKCIqKiIhPT1yfHwhYS5zZWxlY3Rvcil8fChmLnNwbGljZShvLDEpLGEuc2VsZWN0b3ImJmYuZGVsZWdhdGVDb3VudC0tLHAucmVtb3ZlJiZwLnJlbW92ZS5jYWxsKGUsYSkpO2wmJiFmLmxlbmd0aCYmKHAudGVhcmRvd24mJnAudGVhcmRvd24uY2FsbChlLGgsbS5oYW5kbGUpIT09ITF8fHgucmVtb3ZlRXZlbnQoZSxkLG0uaGFuZGxlKSxkZWxldGUgY1tkXSl9ZWxzZSBmb3IoZCBpbiBjKXguZXZlbnQucmVtb3ZlKGUsZCt0W3VdLG4sciwhMCk7eC5pc0VtcHR5T2JqZWN0KGMpJiYoZGVsZXRlIG0uaGFuZGxlLHguX3JlbW92ZURhdGEoZSwiZXZlbnRzIikpfX0sdHJpZ2dlcjpmdW5jdGlvbihuLHIsaSxvKXt2YXIgcyxsLHUsYyxwLGYsZCxoPVtpfHxhXSxnPXYuY2FsbChuLCJ0eXBlIik/bi50eXBlOm4sbT12LmNhbGwobiwibmFtZXNwYWNlIik/bi5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZih1PWY9aT1pfHxhLDMhPT1pLm5vZGVUeXBlJiY4IT09aS5ub2RlVHlwZSYmIW50LnRlc3QoZyt4LmV2ZW50LnRyaWdnZXJlZCkmJihnLmluZGV4T2YoIi4iKT49MCYmKG09Zy5zcGxpdCgiLiIpLGc9bS5zaGlmdCgpLG0uc29ydCgpKSxsPTA+Zy5pbmRleE9mKCI6IikmJiJvbiIrZyxuPW5beC5leHBhbmRvXT9uOm5ldyB4LkV2ZW50KGcsIm9iamVjdCI9PXR5cGVvZiBuJiZuKSxuLmlzVHJpZ2dlcj1vPzI6MyxuLm5hbWVzcGFjZT1tLmpvaW4oIi4iKSxuLm5hbWVzcGFjZV9yZT1uLm5hbWVzcGFjZT9SZWdFeHAoIihefFxcLikiK20uam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxuLnJlc3VsdD10LG4udGFyZ2V0fHwobi50YXJnZXQ9aSkscj1udWxsPT1yP1tuXTp4Lm1ha2VBcnJheShyLFtuXSkscD14LmV2ZW50LnNwZWNpYWxbZ118fHt9LG98fCFwLnRyaWdnZXJ8fHAudHJpZ2dlci5hcHBseShpLHIpIT09ITEpKXtpZighbyYmIXAubm9CdWJibGUmJiF4LmlzV2luZG93KGkpKXtmb3IoYz1wLmRlbGVnYXRlVHlwZXx8ZyxudC50ZXN0KGMrZyl8fCh1PXUucGFyZW50Tm9kZSk7dTt1PXUucGFyZW50Tm9kZSloLnB1c2godSksZj11O2Y9PT0oaS5vd25lckRvY3VtZW50fHxhKSYmaC5wdXNoKGYuZGVmYXVsdFZpZXd8fGYucGFyZW50V2luZG93fHxlKX1kPTA7d2hpbGUoKHU9aFtkKytdKSYmIW4uaXNQcm9wYWdhdGlvblN0b3BwZWQoKSluLnR5cGU9ZD4xP2M6cC5iaW5kVHlwZXx8ZyxzPSh4Ll9kYXRhKHUsImV2ZW50cyIpfHx7fSlbbi50eXBlXSYmeC5fZGF0YSh1LCJoYW5kbGUiKSxzJiZzLmFwcGx5KHUscikscz1sJiZ1W2xdLHMmJnguYWNjZXB0RGF0YSh1KSYmcy5hcHBseSYmcy5hcHBseSh1LHIpPT09ITEmJm4ucHJldmVudERlZmF1bHQoKTtpZihuLnR5cGU9ZywhbyYmIW4uaXNEZWZhdWx0UHJldmVudGVkKCkmJighcC5fZGVmYXVsdHx8cC5fZGVmYXVsdC5hcHBseShoLnBvcCgpLHIpPT09ITEpJiZ4LmFjY2VwdERhdGEoaSkmJmwmJmlbZ10mJiF4LmlzV2luZG93KGkpKXtmPWlbbF0sZiYmKGlbbF09bnVsbCkseC5ldmVudC50cmlnZ2VyZWQ9Zzt0cnl7aVtnXSgpfWNhdGNoKHkpe314LmV2ZW50LnRyaWdnZXJlZD10LGYmJihpW2xdPWYpfXJldHVybiBuLnJlc3VsdH19LGRpc3BhdGNoOmZ1bmN0aW9uKGUpe2U9eC5ldmVudC5maXgoZSk7dmFyIG4scixpLG8sYSxzPVtdLGw9Zy5jYWxsKGFyZ3VtZW50cyksdT0oeC5fZGF0YSh0aGlzLCJldmVudHMiKXx8e30pW2UudHlwZV18fFtdLGM9eC5ldmVudC5zcGVjaWFsW2UudHlwZV18fHt9O2lmKGxbMF09ZSxlLmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWMucHJlRGlzcGF0Y2h8fGMucHJlRGlzcGF0Y2guY2FsbCh0aGlzLGUpIT09ITEpe3M9eC5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMsZSx1KSxuPTA7d2hpbGUoKG89c1tuKytdKSYmIWUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSl7ZS5jdXJyZW50VGFyZ2V0PW8uZWxlbSxhPTA7d2hpbGUoKGk9by5oYW5kbGVyc1thKytdKSYmIWUuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSkoIWUubmFtZXNwYWNlX3JlfHxlLm5hbWVzcGFjZV9yZS50ZXN0KGkubmFtZXNwYWNlKSkmJihlLmhhbmRsZU9iaj1pLGUuZGF0YT1pLmRhdGEscj0oKHguZXZlbnQuc3BlY2lhbFtpLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8aS5oYW5kbGVyKS5hcHBseShvLmVsZW0sbCksciE9PXQmJihlLnJlc3VsdD1yKT09PSExJiYoZS5wcmV2ZW50RGVmYXVsdCgpLGUuc3RvcFByb3BhZ2F0aW9uKCkpKX1yZXR1cm4gYy5wb3N0RGlzcGF0Y2gmJmMucG9zdERpc3BhdGNoLmNhbGwodGhpcyxlKSxlLnJlc3VsdH19LGhhbmRsZXJzOmZ1bmN0aW9uKGUsbil7dmFyIHIsaSxvLGEscz1bXSxsPW4uZGVsZWdhdGVDb3VudCx1PWUudGFyZ2V0O2lmKGwmJnUubm9kZVR5cGUmJighZS5idXR0b258fCJjbGljayIhPT1lLnR5cGUpKWZvcig7dSE9dGhpczt1PXUucGFyZW50Tm9kZXx8dGhpcylpZigxPT09dS5ub2RlVHlwZSYmKHUuZGlzYWJsZWQhPT0hMHx8ImNsaWNrIiE9PWUudHlwZSkpe2ZvcihvPVtdLGE9MDtsPmE7YSsrKWk9blthXSxyPWkuc2VsZWN0b3IrIiAiLG9bcl09PT10JiYob1tyXT1pLm5lZWRzQ29udGV4dD94KHIsdGhpcykuaW5kZXgodSk+PTA6eC5maW5kKHIsdGhpcyxudWxsLFt1XSkubGVuZ3RoKSxvW3JdJiZvLnB1c2goaSk7by5sZW5ndGgmJnMucHVzaCh7ZWxlbTp1LGhhbmRsZXJzOm99KX1yZXR1cm4gbi5sZW5ndGg+bCYmcy5wdXNoKHtlbGVtOnRoaXMsaGFuZGxlcnM6bi5zbGljZShsKX0pLHN9LGZpeDpmdW5jdGlvbihlKXtpZihlW3guZXhwYW5kb10pcmV0dXJuIGU7dmFyIHQsbixyLGk9ZS50eXBlLG89ZSxzPXRoaXMuZml4SG9va3NbaV07c3x8KHRoaXMuZml4SG9va3NbaV09cz10dC50ZXN0KGkpP3RoaXMubW91c2VIb29rczpldC50ZXN0KGkpP3RoaXMua2V5SG9va3M6e30pLHI9cy5wcm9wcz90aGlzLnByb3BzLmNvbmNhdChzLnByb3BzKTp0aGlzLnByb3BzLGU9bmV3IHguRXZlbnQobyksdD1yLmxlbmd0aDt3aGlsZSh0LS0pbj1yW3RdLGVbbl09b1tuXTtyZXR1cm4gZS50YXJnZXR8fChlLnRhcmdldD1vLnNyY0VsZW1lbnR8fGEpLDM9PT1lLnRhcmdldC5ub2RlVHlwZSYmKGUudGFyZ2V0PWUudGFyZ2V0LnBhcmVudE5vZGUpLGUubWV0YUtleT0hIWUubWV0YUtleSxzLmZpbHRlcj9zLmZpbHRlcihlLG8pOmV9LHByb3BzOiJhbHRLZXkgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3VycmVudFRhcmdldCBldmVudFBoYXNlIG1ldGFLZXkgcmVsYXRlZFRhcmdldCBzaGlmdEtleSB0YXJnZXQgdGltZVN0YW1wIHZpZXcgd2hpY2giLnNwbGl0KCIgIiksZml4SG9va3M6e30sa2V5SG9va3M6e3Byb3BzOiJjaGFyIGNoYXJDb2RlIGtleSBrZXlDb2RlIi5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihlLHQpe3JldHVybiBudWxsPT1lLndoaWNoJiYoZS53aGljaD1udWxsIT10LmNoYXJDb2RlP3QuY2hhckNvZGU6dC5rZXlDb2RlKSxlfX0sbW91c2VIb29rczp7cHJvcHM6ImJ1dHRvbiBidXR0b25zIGNsaWVudFggY2xpZW50WSBmcm9tRWxlbWVudCBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgc2NyZWVuWCBzY3JlZW5ZIHRvRWxlbWVudCIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oZSxuKXt2YXIgcixpLG8scz1uLmJ1dHRvbixsPW4uZnJvbUVsZW1lbnQ7cmV0dXJuIG51bGw9PWUucGFnZVgmJm51bGwhPW4uY2xpZW50WCYmKGk9ZS50YXJnZXQub3duZXJEb2N1bWVudHx8YSxvPWkuZG9jdW1lbnRFbGVtZW50LHI9aS5ib2R5LGUucGFnZVg9bi5jbGllbnRYKyhvJiZvLnNjcm9sbExlZnR8fHImJnIuc2Nyb2xsTGVmdHx8MCktKG8mJm8uY2xpZW50TGVmdHx8ciYmci5jbGllbnRMZWZ0fHwwKSxlLnBhZ2VZPW4uY2xpZW50WSsobyYmby5zY3JvbGxUb3B8fHImJnIuc2Nyb2xsVG9wfHwwKS0obyYmby5jbGllbnRUb3B8fHImJnIuY2xpZW50VG9wfHwwKSksIWUucmVsYXRlZFRhcmdldCYmbCYmKGUucmVsYXRlZFRhcmdldD1sPT09ZS50YXJnZXQ/bi50b0VsZW1lbnQ6bCksZS53aGljaHx8cz09PXR8fChlLndoaWNoPTEmcz8xOjImcz8zOjQmcz8yOjApLGV9fSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzIT09YXQoKSYmdGhpcy5mb2N1cyl0cnl7cmV0dXJuIHRoaXMuZm9jdXMoKSwhMX1jYXRjaChlKXt9fSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM9PT1hdCgpJiZ0aGlzLmJsdXI/KHRoaXMuYmx1cigpLCExKTp0fSxkZWxlZ2F0ZVR5cGU6ImZvY3Vzb3V0In0sY2xpY2s6e3RyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4geC5ub2RlTmFtZSh0aGlzLCJpbnB1dCIpJiYiY2hlY2tib3giPT09dGhpcy50eXBlJiZ0aGlzLmNsaWNrPyh0aGlzLmNsaWNrKCksITEpOnR9LF9kZWZhdWx0OmZ1bmN0aW9uKGUpe3JldHVybiB4Lm5vZGVOYW1lKGUudGFyZ2V0LCJhIil9fSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbihlKXtlLnJlc3VsdCE9PXQmJihlLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9ZS5yZXN1bHQpfX19LHNpbXVsYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXguZXh0ZW5kKG5ldyB4LkV2ZW50LG4se3R5cGU6ZSxpc1NpbXVsYXRlZDohMCxvcmlnaW5hbEV2ZW50Ont9fSk7cj94LmV2ZW50LnRyaWdnZXIoaSxudWxsLHQpOnguZXZlbnQuZGlzcGF0Y2guY2FsbCh0LGkpLGkuaXNEZWZhdWx0UHJldmVudGVkKCkmJm4ucHJldmVudERlZmF1bHQoKX19LHgucmVtb3ZlRXZlbnQ9YS5yZW1vdmVFdmVudExpc3RlbmVyP2Z1bmN0aW9uKGUsdCxuKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXImJmUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4sITEpfTpmdW5jdGlvbihlLHQsbil7dmFyIHI9Im9uIit0O2UuZGV0YWNoRXZlbnQmJih0eXBlb2YgZVtyXT09PWkmJihlW3JdPW51bGwpLGUuZGV0YWNoRXZlbnQocixuKSl9LHguRXZlbnQ9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIHguRXZlbnQ/KGUmJmUudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWUsdGhpcy50eXBlPWUudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1lLmRlZmF1bHRQcmV2ZW50ZWR8fGUucmV0dXJuVmFsdWU9PT0hMXx8ZS5nZXRQcmV2ZW50RGVmYXVsdCYmZS5nZXRQcmV2ZW50RGVmYXVsdCgpP2l0Om90KTp0aGlzLnR5cGU9ZSxuJiZ4LmV4dGVuZCh0aGlzLG4pLHRoaXMudGltZVN0YW1wPWUmJmUudGltZVN0YW1wfHx4Lm5vdygpLHRoaXNbeC5leHBhbmRvXT0hMCx0KTpuZXcgeC5FdmVudChlLG4pfSx4LkV2ZW50LnByb3RvdHlwZT17aXNEZWZhdWx0UHJldmVudGVkOm90LGlzUHJvcGFnYXRpb25TdG9wcGVkOm90LGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOm90LHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPWl0LGUmJihlLnByZXZlbnREZWZhdWx0P2UucHJldmVudERlZmF1bHQoKTplLnJldHVyblZhbHVlPSExKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9aXQsZSYmKGUuc3RvcFByb3BhZ2F0aW9uJiZlLnN0b3BQcm9wYWdhdGlvbigpLGUuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1pdCx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0seC5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0sZnVuY3Rpb24oZSx0KXt4LmV2ZW50LnNwZWNpYWxbZV09e2RlbGVnYXRlVHlwZTp0LGJpbmRUeXBlOnQsaGFuZGxlOmZ1bmN0aW9uKGUpe3ZhciBuLHI9dGhpcyxpPWUucmVsYXRlZFRhcmdldCxvPWUuaGFuZGxlT2JqO3JldHVybighaXx8aSE9PXImJiF4LmNvbnRhaW5zKHIsaSkpJiYoZS50eXBlPW8ub3JpZ1R5cGUsbj1vLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudHlwZT10KSxufX19KSx4LnN1cHBvcnQuc3VibWl0QnViYmxlc3x8KHguZXZlbnQuc3BlY2lhbC5zdWJtaXQ9e3NldHVwOmZ1bmN0aW9uKCl7cmV0dXJuIHgubm9kZU5hbWUodGhpcywiZm9ybSIpPyExOih4LmV2ZW50LmFkZCh0aGlzLCJjbGljay5fc3VibWl0IGtleXByZXNzLl9zdWJtaXQiLGZ1bmN0aW9uKGUpe3ZhciBuPWUudGFyZ2V0LHI9eC5ub2RlTmFtZShuLCJpbnB1dCIpfHx4Lm5vZGVOYW1lKG4sImJ1dHRvbiIpP24uZm9ybTp0O3ImJiF4Ll9kYXRhKHIsInN1Ym1pdEJ1YmJsZXMiKSYmKHguZXZlbnQuYWRkKHIsInN1Ym1pdC5fc3VibWl0IixmdW5jdGlvbihlKXtlLl9zdWJtaXRfYnViYmxlPSEwfSkseC5fZGF0YShyLCJzdWJtaXRCdWJibGVzIiwhMCkpfSksdCl9LHBvc3REaXNwYXRjaDpmdW5jdGlvbihlKXtlLl9zdWJtaXRfYnViYmxlJiYoZGVsZXRlIGUuX3N1Ym1pdF9idWJibGUsdGhpcy5wYXJlbnROb2RlJiYhZS5pc1RyaWdnZXImJnguZXZlbnQuc2ltdWxhdGUoInN1Ym1pdCIsdGhpcy5wYXJlbnROb2RlLGUsITApKX0sdGVhcmRvd246ZnVuY3Rpb24oKXtyZXR1cm4geC5ub2RlTmFtZSh0aGlzLCJmb3JtIik/ITE6KHguZXZlbnQucmVtb3ZlKHRoaXMsIi5fc3VibWl0IiksdCl9fSkseC5zdXBwb3J0LmNoYW5nZUJ1YmJsZXN8fCh4LmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBaLnRlc3QodGhpcy5ub2RlTmFtZSk/KCgiY2hlY2tib3giPT09dGhpcy50eXBlfHwicmFkaW8iPT09dGhpcy50eXBlKSYmKHguZXZlbnQuYWRkKHRoaXMsInByb3BlcnR5Y2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGUpeyJjaGVja2VkIj09PWUub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5hbWUmJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITApfSkseC5ldmVudC5hZGQodGhpcywiY2xpY2suX2NoYW5nZSIsZnVuY3Rpb24oZSl7dGhpcy5fanVzdF9jaGFuZ2VkJiYhZS5pc1RyaWdnZXImJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITEpLHguZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcyxlLCEwKX0pKSwhMSk6KHguZXZlbnQuYWRkKHRoaXMsImJlZm9yZWFjdGl2YXRlLl9jaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0O1oudGVzdCh0Lm5vZGVOYW1lKSYmIXguX2RhdGEodCwiY2hhbmdlQnViYmxlcyIpJiYoeC5ldmVudC5hZGQodCwiY2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGUpeyF0aGlzLnBhcmVudE5vZGV8fGUuaXNTaW11bGF0ZWR8fGUuaXNUcmlnZ2VyfHx4LmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMucGFyZW50Tm9kZSxlLCEwKX0pLHguX2RhdGEodCwiY2hhbmdlQnViYmxlcyIsITApKX0pLHQpfSxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIG49ZS50YXJnZXQ7cmV0dXJuIHRoaXMhPT1ufHxlLmlzU2ltdWxhdGVkfHxlLmlzVHJpZ2dlcnx8InJhZGlvIiE9PW4udHlwZSYmImNoZWNrYm94IiE9PW4udHlwZT9lLmhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0fSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiB4LmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpLCFaLnRlc3QodGhpcy5ub2RlTmFtZSl9fSkseC5zdXBwb3J0LmZvY3VzaW5CdWJibGVzfHx4LmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGUsdCl7dmFyIG49MCxyPWZ1bmN0aW9uKGUpe3guZXZlbnQuc2ltdWxhdGUodCxlLnRhcmdldCx4LmV2ZW50LmZpeChlKSwhMCl9O3guZXZlbnQuc3BlY2lhbFt0XT17c2V0dXA6ZnVuY3Rpb24oKXswPT09bisrJiZhLmFkZEV2ZW50TGlzdGVuZXIoZSxyLCEwKX0sdGVhcmRvd246ZnVuY3Rpb24oKXswPT09LS1uJiZhLnJlbW92ZUV2ZW50TGlzdGVuZXIoZSxyLCEwKX19fSkseC5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGUsbixyLGksbyl7dmFyIGEscztpZigib2JqZWN0Ij09dHlwZW9mIGUpeyJzdHJpbmciIT10eXBlb2YgbiYmKHI9cnx8bixuPXQpO2ZvcihhIGluIGUpdGhpcy5vbihhLG4scixlW2FdLG8pO3JldHVybiB0aGlzfWlmKG51bGw9PXImJm51bGw9PWk/KGk9bixyPW49dCk6bnVsbD09aSYmKCJzdHJpbmciPT10eXBlb2Ygbj8oaT1yLHI9dCk6KGk9cixyPW4sbj10KSksaT09PSExKWk9b3Q7ZWxzZSBpZighaSlyZXR1cm4gdGhpcztyZXR1cm4gMT09PW8mJihzPWksaT1mdW5jdGlvbihlKXtyZXR1cm4geCgpLm9mZihlKSxzLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0saS5ndWlkPXMuZ3VpZHx8KHMuZ3VpZD14Lmd1aWQrKykpLHRoaXMuZWFjaChmdW5jdGlvbigpe3guZXZlbnQuYWRkKHRoaXMsZSxpLHIsbil9KX0sb25lOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLm9uKGUsdCxuLHIsMSl9LG9mZjpmdW5jdGlvbihlLG4scil7dmFyIGksbztpZihlJiZlLnByZXZlbnREZWZhdWx0JiZlLmhhbmRsZU9iailyZXR1cm4gaT1lLmhhbmRsZU9iaix4KGUuZGVsZWdhdGVUYXJnZXQpLm9mZihpLm5hbWVzcGFjZT9pLm9yaWdUeXBlKyIuIitpLm5hbWVzcGFjZTppLm9yaWdUeXBlLGkuc2VsZWN0b3IsaS5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgZSl7Zm9yKG8gaW4gZSl0aGlzLm9mZihvLG4sZVtvXSk7cmV0dXJuIHRoaXN9cmV0dXJuKG49PT0hMXx8ImZ1bmN0aW9uIj09dHlwZW9mIG4pJiYocj1uLG49dCkscj09PSExJiYocj1vdCksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7eC5ldmVudC5yZW1vdmUodGhpcyxlLHIsbil9KX0sdHJpZ2dlcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt4LmV2ZW50LnRyaWdnZXIoZSx0LHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGUsbil7dmFyIHI9dGhpc1swXTtyZXR1cm4gcj94LmV2ZW50LnRyaWdnZXIoZSxuLHIsITApOnR9fSk7dmFyIHN0PS9eLlteOiNcW1wuLF0qJC8sbHQ9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sdXQ9eC5leHByLm1hdGNoLm5lZWRzQ29udGV4dCxjdD17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTt4LmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihlKXt2YXIgdCxuPVtdLHI9dGhpcyxpPXIubGVuZ3RoO2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gdGhpcy5wdXNoU3RhY2soeChlKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodD0wO2k+dDt0KyspaWYoeC5jb250YWlucyhyW3RdLHRoaXMpKXJldHVybiEwfSkpO2Zvcih0PTA7aT50O3QrKyl4LmZpbmQoZSxyW3RdLG4pO3JldHVybiBuPXRoaXMucHVzaFN0YWNrKGk+MT94LnVuaXF1ZShuKTpuKSxuLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3I/dGhpcy5zZWxlY3RvcisiICIrZTplLG59LGhhczpmdW5jdGlvbihlKXt2YXIgdCxuPXgoZSx0aGlzKSxyPW4ubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih0PTA7cj50O3QrKylpZih4LmNvbnRhaW5zKHRoaXMsblt0XSkpcmV0dXJuITB9KX0sbm90OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhmdCh0aGlzLGV8fFtdLCEwKSl9LGZpbHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZnQodGhpcyxlfHxbXSwhMSkpfSxpczpmdW5jdGlvbihlKXtyZXR1cm4hIWZ0KHRoaXMsInN0cmluZyI9PXR5cGVvZiBlJiZ1dC50ZXN0KGUpP3goZSk6ZXx8W10sITEpLmxlbmd0aH0sY2xvc2VzdDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXRoaXMubGVuZ3RoLG89W10sYT11dC50ZXN0KGUpfHwic3RyaW5nIiE9dHlwZW9mIGU/eChlLHR8fHRoaXMuY29udGV4dCk6MDtmb3IoO2k+cjtyKyspZm9yKG49dGhpc1tyXTtuJiZuIT09dDtuPW4ucGFyZW50Tm9kZSlpZigxMT5uLm5vZGVUeXBlJiYoYT9hLmluZGV4KG4pPi0xOjE9PT1uLm5vZGVUeXBlJiZ4LmZpbmQubWF0Y2hlc1NlbGVjdG9yKG4sZSkpKXtuPW8ucHVzaChuKTticmVha31yZXR1cm4gdGhpcy5wdXNoU3RhY2soby5sZW5ndGg+MT94LnVuaXF1ZShvKTpvKX0saW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/InN0cmluZyI9PXR5cGVvZiBlP3guaW5BcnJheSh0aGlzWzBdLHgoZSkpOnguaW5BcnJheShlLmpxdWVyeT9lWzBdOmUsdGhpcyk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj0ic3RyaW5nIj09dHlwZW9mIGU/eChlLHQpOngubWFrZUFycmF5KGUmJmUubm9kZVR5cGU/W2VdOmUpLHI9eC5tZXJnZSh0aGlzLmdldCgpLG4pO3JldHVybiB0aGlzLnB1c2hTdGFjayh4LnVuaXF1ZShyKSl9LGFkZEJhY2s6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PWU/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoZSkpfX0pO2Z1bmN0aW9uIHB0KGUsdCl7ZG8gZT1lW3RdO3doaWxlKGUmJjEhPT1lLm5vZGVUeXBlKTtyZXR1cm4gZX14LmVhY2goe3BhcmVudDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJjExIT09dC5ub2RlVHlwZT90Om51bGx9LHBhcmVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuIHguZGlyKGUsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4geC5kaXIoZSwicGFyZW50Tm9kZSIsbil9LG5leHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHB0KGUsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oZSl7cmV0dXJuIHB0KGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGUpe3JldHVybiB4LmRpcihlLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGUpe3JldHVybiB4LmRpcihlLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4geC5kaXIoZSwibmV4dFNpYmxpbmciLG4pfSxwcmV2VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB4LmRpcihlLCJwcmV2aW91c1NpYmxpbmciLG4pfSxzaWJsaW5nczpmdW5jdGlvbihlKXtyZXR1cm4geC5zaWJsaW5nKChlLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGUpfSxjaGlsZHJlbjpmdW5jdGlvbihlKXtyZXR1cm4geC5zaWJsaW5nKGUuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiB4Lm5vZGVOYW1lKGUsImlmcmFtZSIpP2UuY29udGVudERvY3VtZW50fHxlLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ6eC5tZXJnZShbXSxlLmNoaWxkTm9kZXMpfX0sZnVuY3Rpb24oZSx0KXt4LmZuW2VdPWZ1bmN0aW9uKG4scil7dmFyIGk9eC5tYXAodGhpcyx0LG4pO3JldHVybiJVbnRpbCIhPT1lLnNsaWNlKC01KSYmKHI9biksciYmInN0cmluZyI9PXR5cGVvZiByJiYoaT14LmZpbHRlcihyLGkpKSx0aGlzLmxlbmd0aD4xJiYoY3RbZV18fChpPXgudW5pcXVlKGkpKSxsdC50ZXN0KGUpJiYoaT1pLnJldmVyc2UoKSkpLHRoaXMucHVzaFN0YWNrKGkpfX0pLHguZXh0ZW5kKHtmaWx0ZXI6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRbMF07cmV0dXJuIG4mJihlPSI6bm90KCIrZSsiKSIpLDE9PT10Lmxlbmd0aCYmMT09PXIubm9kZVR5cGU/eC5maW5kLm1hdGNoZXNTZWxlY3RvcihyLGUpP1tyXTpbXTp4LmZpbmQubWF0Y2hlcyhlLHguZ3JlcCh0LGZ1bmN0aW9uKGUpe3JldHVybiAxPT09ZS5ub2RlVHlwZX0pKX0sZGlyOmZ1bmN0aW9uKGUsbixyKXt2YXIgaT1bXSxvPWVbbl07d2hpbGUobyYmOSE9PW8ubm9kZVR5cGUmJihyPT09dHx8MSE9PW8ubm9kZVR5cGV8fCF4KG8pLmlzKHIpKSkxPT09by5ub2RlVHlwZSYmaS5wdXNoKG8pLG89b1tuXTtyZXR1cm4gaX0sc2libGluZzpmdW5jdGlvbihlLHQpe3ZhciBuPVtdO2Zvcig7ZTtlPWUubmV4dFNpYmxpbmcpMT09PWUubm9kZVR5cGUmJmUhPT10JiZuLnB1c2goZSk7cmV0dXJuIG59fSk7ZnVuY3Rpb24gZnQoZSx0LG4pe2lmKHguaXNGdW5jdGlvbih0KSlyZXR1cm4geC5ncmVwKGUsZnVuY3Rpb24oZSxyKXtyZXR1cm4hIXQuY2FsbChlLHIsZSkhPT1ufSk7aWYodC5ub2RlVHlwZSlyZXR1cm4geC5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10IT09bn0pO2lmKCJzdHJpbmciPT10eXBlb2YgdCl7aWYoc3QudGVzdCh0KSlyZXR1cm4geC5maWx0ZXIodCxlLG4pO3Q9eC5maWx0ZXIodCxlKX1yZXR1cm4geC5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuIHguaW5BcnJheShlLHQpPj0wIT09bn0pfWZ1bmN0aW9uIGR0KGUpe3ZhciB0PWh0LnNwbGl0KCJ8Iiksbj1lLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihuLmNyZWF0ZUVsZW1lbnQpd2hpbGUodC5sZW5ndGgpbi5jcmVhdGVFbGVtZW50KHQucG9wKCkpO3JldHVybiBufXZhciBodD0iYWJicnxhcnRpY2xlfGFzaWRlfGF1ZGlvfGJkaXxjYW52YXN8ZGF0YXxkYXRhbGlzdHxkZXRhaWxzfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnxoZWFkZXJ8aGdyb3VwfG1hcmt8bWV0ZXJ8bmF2fG91dHB1dHxwcm9ncmVzc3xzZWN0aW9ufHN1bW1hcnl8dGltZXx2aWRlbyIsZ3Q9LyBqUXVlcnlcZCs9Iig/Om51bGx8XGQrKSIvZyxtdD1SZWdFeHAoIjwoPzoiK2h0KyIpW1xccy8+XSIsImkiKSx5dD0vXlxzKy8sdnQ9LzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Ol0rKVtePl0qKVwvPi9naSxidD0vPChbXHc6XSspLyx4dD0vPHRib2R5L2ksd3Q9Lzx8JiM/XHcrOy8sVHQ9LzwoPzpzY3JpcHR8c3R5bGV8bGluaykvaSxDdD0vXig/OmNoZWNrYm94fHJhZGlvKSQvaSxOdD0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxrdD0vXiR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksRXQ9L150cnVlXC8oLiopLyxTdD0vXlxzKjwhKD86XFtDREFUQVxbfC0tKXwoPzpcXVxdfC0tKT5ccyokL2csQXQ9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLGxlZ2VuZDpbMSwiPGZpZWxkc2V0PiIsIjwvZmllbGRzZXQ+Il0sYXJlYTpbMSwiPG1hcD4iLCI8L21hcD4iXSxwYXJhbTpbMSwiPG9iamVjdD4iLCI8L29iamVjdD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLF9kZWZhdWx0Onguc3VwcG9ydC5odG1sU2VyaWFsaXplP1swLCIiLCIiXTpbMSwiWDxkaXY+IiwiPC9kaXY+Il19LGp0PWR0KGEpLER0PWp0LmFwcGVuZENoaWxkKGEuY3JlYXRlRWxlbWVudCgiZGl2IikpO0F0Lm9wdGdyb3VwPUF0Lm9wdGlvbixBdC50Ym9keT1BdC50Zm9vdD1BdC5jb2xncm91cD1BdC5jYXB0aW9uPUF0LnRoZWFkLEF0LnRoPUF0LnRkLHguZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGUpe3JldHVybiB4LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dD94LnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHxhKS5jcmVhdGVUZXh0Tm9kZShlKSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGUpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgdD1MdCh0aGlzLGUpO3QuYXBwZW5kQ2hpbGQoZSl9fSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oZSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciB0PUx0KHRoaXMsZSk7dC5pbnNlcnRCZWZvcmUoZSx0LmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcy5uZXh0U2libGluZyl9KX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1lP3guZmlsdGVyKGUsdGhpcyk6dGhpcyxpPTA7Zm9yKDtudWxsIT0obj1yW2ldKTtpKyspdHx8MSE9PW4ubm9kZVR5cGV8fHguY2xlYW5EYXRhKEZ0KG4pKSxuLnBhcmVudE5vZGUmJih0JiZ4LmNvbnRhaW5zKG4ub3duZXJEb2N1bWVudCxuKSYmX3QoRnQobiwic2NyaXB0IikpLG4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKSk7cmV0dXJuIHRoaXN9LGVtcHR5OmZ1bmN0aW9uKCl7dmFyIGUsdD0wO2Zvcig7bnVsbCE9KGU9dGhpc1t0XSk7dCsrKXsxPT09ZS5ub2RlVHlwZSYmeC5jbGVhbkRhdGEoRnQoZSwhMSkpO3doaWxlKGUuZmlyc3RDaGlsZCllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7ZS5vcHRpb25zJiZ4Lm5vZGVOYW1lKGUsInNlbGVjdCIpJiYoZS5vcHRpb25zLmxlbmd0aD0wKX1yZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1udWxsPT1lPyExOmUsdD1udWxsPT10P2U6dCx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB4LmNsb25lKHRoaXMsZSx0KX0pfSxodG1sOmZ1bmN0aW9uKGUpe3JldHVybiB4LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGUpe3ZhciBuPXRoaXNbMF18fHt9LHI9MCxpPXRoaXMubGVuZ3RoO2lmKGU9PT10KXJldHVybiAxPT09bi5ub2RlVHlwZT9uLmlubmVySFRNTC5yZXBsYWNlKGd0LCIiKTp0O2lmKCEoInN0cmluZyIhPXR5cGVvZiBlfHxUdC50ZXN0KGUpfHwheC5zdXBwb3J0Lmh0bWxTZXJpYWxpemUmJm10LnRlc3QoZSl8fCF4LnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2UmJnl0LnRlc3QoZSl8fEF0WyhidC5leGVjKGUpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSkpe2U9ZS5yZXBsYWNlKHZ0LCI8JDE+PC8kMj4iKTt0cnl7Zm9yKDtpPnI7cisrKW49dGhpc1tyXXx8e30sMT09PW4ubm9kZVR5cGUmJih4LmNsZWFuRGF0YShGdChuLCExKSksbi5pbm5lckhUTUw9ZSk7bj0wfWNhdGNoKG8pe319biYmdGhpcy5lbXB0eSgpLmFwcGVuZChlKX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciBlPXgubWFwKHRoaXMsZnVuY3Rpb24oZSl7cmV0dXJuW2UubmV4dFNpYmxpbmcsZS5wYXJlbnROb2RlXX0pLHQ9MDtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24obil7dmFyIHI9ZVt0KytdLGk9ZVt0KytdO2kmJihyJiZyLnBhcmVudE5vZGUhPT1pJiYocj10aGlzLm5leHRTaWJsaW5nKSx4KHRoaXMpLnJlbW92ZSgpLGkuaW5zZXJ0QmVmb3JlKG4scikpfSwhMCksdD90aGlzOnRoaXMucmVtb3ZlKCl9LGRldGFjaDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZW1vdmUoZSwhMCl9LGRvbU1hbmlwOmZ1bmN0aW9uKGUsdCxuKXtlPWQuYXBwbHkoW10sZSk7dmFyIHIsaSxvLGEscyxsLHU9MCxjPXRoaXMubGVuZ3RoLHA9dGhpcyxmPWMtMSxoPWVbMF0sZz14LmlzRnVuY3Rpb24oaCk7aWYoZ3x8ISgxPj1jfHwic3RyaW5nIiE9dHlwZW9mIGh8fHguc3VwcG9ydC5jaGVja0Nsb25lKSYmTnQudGVzdChoKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHIpe3ZhciBpPXAuZXEocik7ZyYmKGVbMF09aC5jYWxsKHRoaXMscixpLmh0bWwoKSkpLGkuZG9tTWFuaXAoZSx0LG4pfSk7aWYoYyYmKGw9eC5idWlsZEZyYWdtZW50KGUsdGhpc1swXS5vd25lckRvY3VtZW50LCExLCFuJiZ0aGlzKSxyPWwuZmlyc3RDaGlsZCwxPT09bC5jaGlsZE5vZGVzLmxlbmd0aCYmKGw9cikscikpe2ZvcihhPXgubWFwKEZ0KGwsInNjcmlwdCIpLEh0KSxvPWEubGVuZ3RoO2M+dTt1KyspaT1sLHUhPT1mJiYoaT14LmNsb25lKGksITAsITApLG8mJngubWVyZ2UoYSxGdChpLCJzY3JpcHQiKSkpLHQuY2FsbCh0aGlzW3VdLGksdSk7aWYobylmb3Iocz1hW2EubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQseC5tYXAoYSxxdCksdT0wO28+dTt1KyspaT1hW3VdLGt0LnRlc3QoaS50eXBlfHwiIikmJiF4Ll9kYXRhKGksImdsb2JhbEV2YWwiKSYmeC5jb250YWlucyhzLGkpJiYoaS5zcmM/eC5fZXZhbFVybChpLnNyYyk6eC5nbG9iYWxFdmFsKChpLnRleHR8fGkudGV4dENvbnRlbnR8fGkuaW5uZXJIVE1MfHwiIikucmVwbGFjZShTdCwiIikpKTtsPXI9bnVsbH1yZXR1cm4gdGhpc319KTtmdW5jdGlvbiBMdChlLHQpe3JldHVybiB4Lm5vZGVOYW1lKGUsInRhYmxlIikmJngubm9kZU5hbWUoMT09PXQubm9kZVR5cGU/dDp0LmZpcnN0Q2hpbGQsInRyIik/ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8ZS5hcHBlbmRDaGlsZChlLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6ZX1mdW5jdGlvbiBIdChlKXtyZXR1cm4gZS50eXBlPShudWxsIT09eC5maW5kLmF0dHIoZSwidHlwZSIpKSsiLyIrZS50eXBlLGV9ZnVuY3Rpb24gcXQoZSl7dmFyIHQ9RXQuZXhlYyhlLnR5cGUpO3JldHVybiB0P2UudHlwZT10WzFdOmUucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksZX1mdW5jdGlvbiBfdChlLHQpe3ZhciBuLHI9MDtmb3IoO251bGwhPShuPWVbcl0pO3IrKyl4Ll9kYXRhKG4sImdsb2JhbEV2YWwiLCF0fHx4Ll9kYXRhKHRbcl0sImdsb2JhbEV2YWwiKSl9ZnVuY3Rpb24gTXQoZSx0KXtpZigxPT09dC5ub2RlVHlwZSYmeC5oYXNEYXRhKGUpKXt2YXIgbixyLGksbz14Ll9kYXRhKGUpLGE9eC5fZGF0YSh0LG8pLHM9by5ldmVudHM7aWYocyl7ZGVsZXRlIGEuaGFuZGxlLGEuZXZlbnRzPXt9O2ZvcihuIGluIHMpZm9yKHI9MCxpPXNbbl0ubGVuZ3RoO2k+cjtyKyspeC5ldmVudC5hZGQodCxuLHNbbl1bcl0pfWEuZGF0YSYmKGEuZGF0YT14LmV4dGVuZCh7fSxhLmRhdGEpKX19ZnVuY3Rpb24gT3QoZSx0KXt2YXIgbixyLGk7aWYoMT09PXQubm9kZVR5cGUpe2lmKG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCF4LnN1cHBvcnQubm9DbG9uZUV2ZW50JiZ0W3guZXhwYW5kb10pe2k9eC5fZGF0YSh0KTtmb3IociBpbiBpLmV2ZW50cyl4LnJlbW92ZUV2ZW50KHQscixpLmhhbmRsZSk7dC5yZW1vdmVBdHRyaWJ1dGUoeC5leHBhbmRvKX0ic2NyaXB0Ij09PW4mJnQudGV4dCE9PWUudGV4dD8oSHQodCkudGV4dD1lLnRleHQscXQodCkpOiJvYmplY3QiPT09bj8odC5wYXJlbnROb2RlJiYodC5vdXRlckhUTUw9ZS5vdXRlckhUTUwpLHguc3VwcG9ydC5odG1sNUNsb25lJiZlLmlubmVySFRNTCYmIXgudHJpbSh0LmlubmVySFRNTCkmJih0LmlubmVySFRNTD1lLmlubmVySFRNTCkpOiJpbnB1dCI9PT1uJiZDdC50ZXN0KGUudHlwZSk/KHQuZGVmYXVsdENoZWNrZWQ9dC5jaGVja2VkPWUuY2hlY2tlZCx0LnZhbHVlIT09ZS52YWx1ZSYmKHQudmFsdWU9ZS52YWx1ZSkpOiJvcHRpb24iPT09bj90LmRlZmF1bHRTZWxlY3RlZD10LnNlbGVjdGVkPWUuZGVmYXVsdFNlbGVjdGVkOigiaW5wdXQiPT09bnx8InRleHRhcmVhIj09PW4pJiYodC5kZWZhdWx0VmFsdWU9ZS5kZWZhdWx0VmFsdWUpfX14LmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihlLHQpe3guZm5bZV09ZnVuY3Rpb24oZSl7dmFyIG4scj0wLGk9W10sbz14KGUpLGE9by5sZW5ndGgtMTtmb3IoO2E+PXI7cisrKW49cj09PWE/dGhpczp0aGlzLmNsb25lKCEwKSx4KG9bcl0pW3RdKG4pLGguYXBwbHkoaSxuLmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soaSl9fSk7ZnVuY3Rpb24gRnQoZSxuKXt2YXIgcixvLGE9MCxzPXR5cGVvZiBlLmdldEVsZW1lbnRzQnlUYWdOYW1lIT09aT9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKG58fCIqIik6dHlwZW9mIGUucXVlcnlTZWxlY3RvckFsbCE9PWk/ZS5xdWVyeVNlbGVjdG9yQWxsKG58fCIqIik6dDtpZighcylmb3Iocz1bXSxyPWUuY2hpbGROb2Rlc3x8ZTtudWxsIT0obz1yW2FdKTthKyspIW58fHgubm9kZU5hbWUobyxuKT9zLnB1c2gobyk6eC5tZXJnZShzLEZ0KG8sbikpO3JldHVybiBuPT09dHx8biYmeC5ub2RlTmFtZShlLG4pP3gubWVyZ2UoW2VdLHMpOnN9ZnVuY3Rpb24gQnQoZSl7Q3QudGVzdChlLnR5cGUpJiYoZS5kZWZhdWx0Q2hlY2tlZD1lLmNoZWNrZWQpfXguZXh0ZW5kKHtjbG9uZTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyxsPXguY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpO2lmKHguc3VwcG9ydC5odG1sNUNsb25lfHx4LmlzWE1MRG9jKGUpfHwhbXQudGVzdCgiPCIrZS5ub2RlTmFtZSsiPiIpP289ZS5jbG9uZU5vZGUoITApOihEdC5pbm5lckhUTUw9ZS5vdXRlckhUTUwsRHQucmVtb3ZlQ2hpbGQobz1EdC5maXJzdENoaWxkKSksISh4LnN1cHBvcnQubm9DbG9uZUV2ZW50JiZ4LnN1cHBvcnQubm9DbG9uZUNoZWNrZWR8fDEhPT1lLm5vZGVUeXBlJiYxMSE9PWUubm9kZVR5cGV8fHguaXNYTUxEb2MoZSkpKWZvcihyPUZ0KG8pLHM9RnQoZSksYT0wO251bGwhPShpPXNbYV0pOysrYSlyW2FdJiZPdChpLHJbYV0pO2lmKHQpaWYobilmb3Iocz1zfHxGdChlKSxyPXJ8fEZ0KG8pLGE9MDtudWxsIT0oaT1zW2FdKTthKyspTXQoaSxyW2FdKTtlbHNlIE10KGUsbyk7cmV0dXJuIHI9RnQobywic2NyaXB0Iiksci5sZW5ndGg+MCYmX3QociwhbCYmRnQoZSwic2NyaXB0IikpLHI9cz1pPW51bGwsb30sYnVpbGRGcmFnbWVudDpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscyxsLHUsYyxwPWUubGVuZ3RoLGY9ZHQodCksZD1bXSxoPTA7Zm9yKDtwPmg7aCsrKWlmKG89ZVtoXSxvfHwwPT09bylpZigib2JqZWN0Ij09PXgudHlwZShvKSl4Lm1lcmdlKGQsby5ub2RlVHlwZT9bb106byk7ZWxzZSBpZih3dC50ZXN0KG8pKXtzPXN8fGYuYXBwZW5kQ2hpbGQodC5jcmVhdGVFbGVtZW50KCJkaXYiKSksbD0oYnQuZXhlYyhvKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSxjPUF0W2xdfHxBdC5fZGVmYXVsdCxzLmlubmVySFRNTD1jWzFdK28ucmVwbGFjZSh2dCwiPCQxPjwvJDI+IikrY1syXSxpPWNbMF07d2hpbGUoaS0tKXM9cy5sYXN0Q2hpbGQ7aWYoIXguc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSYmeXQudGVzdChvKSYmZC5wdXNoKHQuY3JlYXRlVGV4dE5vZGUoeXQuZXhlYyhvKVswXSkpLCF4LnN1cHBvcnQudGJvZHkpe289InRhYmxlIiE9PWx8fHh0LnRlc3Qobyk/Ijx0YWJsZT4iIT09Y1sxXXx8eHQudGVzdChvKT8wOnM6cy5maXJzdENoaWxkLGk9byYmby5jaGlsZE5vZGVzLmxlbmd0aDt3aGlsZShpLS0peC5ub2RlTmFtZSh1PW8uY2hpbGROb2Rlc1tpXSwidGJvZHkiKSYmIXUuY2hpbGROb2Rlcy5sZW5ndGgmJm8ucmVtb3ZlQ2hpbGQodSl9eC5tZXJnZShkLHMuY2hpbGROb2Rlcykscy50ZXh0Q29udGVudD0iIjt3aGlsZShzLmZpcnN0Q2hpbGQpcy5yZW1vdmVDaGlsZChzLmZpcnN0Q2hpbGQpO3M9Zi5sYXN0Q2hpbGR9ZWxzZSBkLnB1c2godC5jcmVhdGVUZXh0Tm9kZShvKSk7cyYmZi5yZW1vdmVDaGlsZChzKSx4LnN1cHBvcnQuYXBwZW5kQ2hlY2tlZHx8eC5ncmVwKEZ0KGQsImlucHV0IiksQnQpLGg9MDt3aGlsZShvPWRbaCsrXSlpZigoIXJ8fC0xPT09eC5pbkFycmF5KG8scikpJiYoYT14LmNvbnRhaW5zKG8ub3duZXJEb2N1bWVudCxvKSxzPUZ0KGYuYXBwZW5kQ2hpbGQobyksInNjcmlwdCIpLGEmJl90KHMpLG4pKXtpPTA7d2hpbGUobz1zW2krK10pa3QudGVzdChvLnR5cGV8fCIiKSYmbi5wdXNoKG8pfXJldHVybiBzPW51bGwsZn0sY2xlYW5EYXRhOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixvLGEscz0wLGw9eC5leHBhbmRvLHU9eC5jYWNoZSxjPXguc3VwcG9ydC5kZWxldGVFeHBhbmRvLGY9eC5ldmVudC5zcGVjaWFsO2Zvcig7bnVsbCE9KG49ZVtzXSk7cysrKWlmKCh0fHx4LmFjY2VwdERhdGEobikpJiYobz1uW2xdLGE9byYmdVtvXSkpe2lmKGEuZXZlbnRzKWZvcihyIGluIGEuZXZlbnRzKWZbcl0/eC5ldmVudC5yZW1vdmUobixyKTp4LnJlbW92ZUV2ZW50KG4scixhLmhhbmRsZSk7CnVbb10mJihkZWxldGUgdVtvXSxjP2RlbGV0ZSBuW2xdOnR5cGVvZiBuLnJlbW92ZUF0dHJpYnV0ZSE9PWk/bi5yZW1vdmVBdHRyaWJ1dGUobCk6bltsXT1udWxsLHAucHVzaChvKSl9fSxfZXZhbFVybDpmdW5jdGlvbihlKXtyZXR1cm4geC5hamF4KHt1cmw6ZSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGFzeW5jOiExLGdsb2JhbDohMSwidGhyb3dzIjohMH0pfX0pLHguZm4uZXh0ZW5kKHt3cmFwQWxsOmZ1bmN0aW9uKGUpe2lmKHguaXNGdW5jdGlvbihlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3godGhpcykud3JhcEFsbChlLmNhbGwodGhpcyx0KSl9KTtpZih0aGlzWzBdKXt2YXIgdD14KGUsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCk7dGhpc1swXS5wYXJlbnROb2RlJiZ0Lmluc2VydEJlZm9yZSh0aGlzWzBdKSx0Lm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXM7d2hpbGUoZS5maXJzdENoaWxkJiYxPT09ZS5maXJzdENoaWxkLm5vZGVUeXBlKWU9ZS5maXJzdENoaWxkO3JldHVybiBlfSkuYXBwZW5kKHRoaXMpfXJldHVybiB0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHguaXNGdW5jdGlvbihlKT90aGlzLmVhY2goZnVuY3Rpb24odCl7eCh0aGlzKS53cmFwSW5uZXIoZS5jYWxsKHRoaXMsdCkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9eCh0aGlzKSxuPXQuY29udGVudHMoKTtuLmxlbmd0aD9uLndyYXBBbGwoZSk6dC5hcHBlbmQoZSl9KX0sd3JhcDpmdW5jdGlvbihlKXt2YXIgdD14LmlzRnVuY3Rpb24oZSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihuKXt4KHRoaXMpLndyYXBBbGwodD9lLmNhbGwodGhpcyxuKTplKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7eC5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fHgodGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfX0pO3ZhciBQdCxSdCxXdCwkdD0vYWxwaGFcKFteKV0qXCkvaSxJdD0vb3BhY2l0eVxzKj1ccyooW14pXSopLyx6dD0vXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC8sWHQ9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFV0PS9ebWFyZ2luLyxWdD1SZWdFeHAoIl4oIit3KyIpKC4qKSQiLCJpIiksWXQ9UmVnRXhwKCJeKCIrdysiKSg/IXB4KVthLXolXSskIiwiaSIpLEp0PVJlZ0V4cCgiXihbKy1dKT0oIit3KyIpIiwiaSIpLEd0PXtCT0RZOiJibG9jayJ9LFF0PXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxLdD17bGV0dGVyU3BhY2luZzowLGZvbnRXZWlnaHQ6NDAwfSxadD1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLGVuPVsiV2Via2l0IiwiTyIsIk1veiIsIm1zIl07ZnVuY3Rpb24gdG4oZSx0KXtpZih0IGluIGUpcmV0dXJuIHQ7dmFyIG49dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpLHI9dCxpPWVuLmxlbmd0aDt3aGlsZShpLS0paWYodD1lbltpXStuLHQgaW4gZSlyZXR1cm4gdDtyZXR1cm4gcn1mdW5jdGlvbiBubihlLHQpe3JldHVybiBlPXR8fGUsIm5vbmUiPT09eC5jc3MoZSwiZGlzcGxheSIpfHwheC5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSl9ZnVuY3Rpb24gcm4oZSx0KXt2YXIgbixyLGksbz1bXSxhPTAscz1lLmxlbmd0aDtmb3IoO3M+YTthKyspcj1lW2FdLHIuc3R5bGUmJihvW2FdPXguX2RhdGEociwib2xkZGlzcGxheSIpLG49ci5zdHlsZS5kaXNwbGF5LHQ/KG9bYV18fCJub25lIiE9PW58fChyLnN0eWxlLmRpc3BsYXk9IiIpLCIiPT09ci5zdHlsZS5kaXNwbGF5JiZubihyKSYmKG9bYV09eC5fZGF0YShyLCJvbGRkaXNwbGF5IixsbihyLm5vZGVOYW1lKSkpKTpvW2FdfHwoaT1ubihyKSwobiYmIm5vbmUiIT09bnx8IWkpJiZ4Ll9kYXRhKHIsIm9sZGRpc3BsYXkiLGk/bjp4LmNzcyhyLCJkaXNwbGF5IikpKSk7Zm9yKGE9MDtzPmE7YSsrKXI9ZVthXSxyLnN0eWxlJiYodCYmIm5vbmUiIT09ci5zdHlsZS5kaXNwbGF5JiYiIiE9PXIuc3R5bGUuZGlzcGxheXx8KHIuc3R5bGUuZGlzcGxheT10P29bYV18fCIiOiJub25lIikpO3JldHVybiBlfXguZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oZSxuKXtyZXR1cm4geC5hY2Nlc3ModGhpcyxmdW5jdGlvbihlLG4scil7dmFyIGksbyxhPXt9LHM9MDtpZih4LmlzQXJyYXkobikpe2ZvcihvPVJ0KGUpLGk9bi5sZW5ndGg7aT5zO3MrKylhW25bc11dPXguY3NzKGUsbltzXSwhMSxvKTtyZXR1cm4gYX1yZXR1cm4gciE9PXQ/eC5zdHlsZShlLG4scik6eC5jc3MoZSxuKX0sZSxuLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHNob3c6ZnVuY3Rpb24oKXtyZXR1cm4gcm4odGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gcm4odGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihlKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBlP2U/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7bm4odGhpcyk/eCh0aGlzKS5zaG93KCk6eCh0aGlzKS5oaWRlKCl9KX19KSx4LmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihlLHQpe2lmKHQpe3ZhciBuPVd0KGUsIm9wYWNpdHkiKTtyZXR1cm4iIj09PW4/IjEiOm59fX19LGNzc051bWJlcjp7Y29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZm9udFdlaWdodDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnsiZmxvYXQiOnguc3VwcG9ydC5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oZSxuLHIsaSl7aWYoZSYmMyE9PWUubm9kZVR5cGUmJjghPT1lLm5vZGVUeXBlJiZlLnN0eWxlKXt2YXIgbyxhLHMsbD14LmNhbWVsQ2FzZShuKSx1PWUuc3R5bGU7aWYobj14LmNzc1Byb3BzW2xdfHwoeC5jc3NQcm9wc1tsXT10bih1LGwpKSxzPXguY3NzSG9va3Nbbl18fHguY3NzSG9va3NbbF0scj09PXQpcmV0dXJuIHMmJiJnZXQiaW4gcyYmKG89cy5nZXQoZSwhMSxpKSkhPT10P286dVtuXTtpZihhPXR5cGVvZiByLCJzdHJpbmciPT09YSYmKG89SnQuZXhlYyhyKSkmJihyPShvWzFdKzEpKm9bMl0rcGFyc2VGbG9hdCh4LmNzcyhlLG4pKSxhPSJudW1iZXIiKSwhKG51bGw9PXJ8fCJudW1iZXIiPT09YSYmaXNOYU4ocil8fCgibnVtYmVyIiE9PWF8fHguY3NzTnVtYmVyW2xdfHwocis9InB4IikseC5zdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZXx8IiIhPT1yfHwwIT09bi5pbmRleE9mKCJiYWNrZ3JvdW5kIil8fCh1W25dPSJpbmhlcml0IikscyYmInNldCJpbiBzJiYocj1zLnNldChlLHIsaSkpPT09dCkpKXRyeXt1W25dPXJ9Y2F0Y2goYyl7fX19LGNzczpmdW5jdGlvbihlLG4scixpKXt2YXIgbyxhLHMsbD14LmNhbWVsQ2FzZShuKTtyZXR1cm4gbj14LmNzc1Byb3BzW2xdfHwoeC5jc3NQcm9wc1tsXT10bihlLnN0eWxlLGwpKSxzPXguY3NzSG9va3Nbbl18fHguY3NzSG9va3NbbF0scyYmImdldCJpbiBzJiYoYT1zLmdldChlLCEwLHIpKSxhPT09dCYmKGE9V3QoZSxuLGkpKSwibm9ybWFsIj09PWEmJm4gaW4gS3QmJihhPUt0W25dKSwiIj09PXJ8fHI/KG89cGFyc2VGbG9hdChhKSxyPT09ITB8fHguaXNOdW1lcmljKG8pP298fDA6YSk6YX19KSxlLmdldENvbXB1dGVkU3R5bGU/KFJ0PWZ1bmN0aW9uKHQpe3JldHVybiBlLmdldENvbXB1dGVkU3R5bGUodCxudWxsKX0sV3Q9ZnVuY3Rpb24oZSxuLHIpe3ZhciBpLG8sYSxzPXJ8fFJ0KGUpLGw9cz9zLmdldFByb3BlcnR5VmFsdWUobil8fHNbbl06dCx1PWUuc3R5bGU7cmV0dXJuIHMmJigiIiE9PWx8fHguY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfHwobD14LnN0eWxlKGUsbikpLFl0LnRlc3QobCkmJlV0LnRlc3QobikmJihpPXUud2lkdGgsbz11Lm1pbldpZHRoLGE9dS5tYXhXaWR0aCx1Lm1pbldpZHRoPXUubWF4V2lkdGg9dS53aWR0aD1sLGw9cy53aWR0aCx1LndpZHRoPWksdS5taW5XaWR0aD1vLHUubWF4V2lkdGg9YSkpLGx9KTphLmRvY3VtZW50RWxlbWVudC5jdXJyZW50U3R5bGUmJihSdD1mdW5jdGlvbihlKXtyZXR1cm4gZS5jdXJyZW50U3R5bGV9LFd0PWZ1bmN0aW9uKGUsbixyKXt2YXIgaSxvLGEscz1yfHxSdChlKSxsPXM/c1tuXTp0LHU9ZS5zdHlsZTtyZXR1cm4gbnVsbD09bCYmdSYmdVtuXSYmKGw9dVtuXSksWXQudGVzdChsKSYmIXp0LnRlc3QobikmJihpPXUubGVmdCxvPWUucnVudGltZVN0eWxlLGE9byYmby5sZWZ0LGEmJihvLmxlZnQ9ZS5jdXJyZW50U3R5bGUubGVmdCksdS5sZWZ0PSJmb250U2l6ZSI9PT1uPyIxZW0iOmwsbD11LnBpeGVsTGVmdCsicHgiLHUubGVmdD1pLGEmJihvLmxlZnQ9YSkpLCIiPT09bD8iYXV0byI6bH0pO2Z1bmN0aW9uIG9uKGUsdCxuKXt2YXIgcj1WdC5leGVjKHQpO3JldHVybiByP01hdGgubWF4KDAsclsxXS0obnx8MCkpKyhyWzJdfHwicHgiKTp0fWZ1bmN0aW9uIGFuKGUsdCxuLHIsaSl7dmFyIG89bj09PShyPyJib3JkZXIiOiJjb250ZW50Iik/NDoid2lkdGgiPT09dD8xOjAsYT0wO2Zvcig7ND5vO28rPTIpIm1hcmdpbiI9PT1uJiYoYSs9eC5jc3MoZSxuK1p0W29dLCEwLGkpKSxyPygiY29udGVudCI9PT1uJiYoYS09eC5jc3MoZSwicGFkZGluZyIrWnRbb10sITAsaSkpLCJtYXJnaW4iIT09biYmKGEtPXguY3NzKGUsImJvcmRlciIrWnRbb10rIldpZHRoIiwhMCxpKSkpOihhKz14LmNzcyhlLCJwYWRkaW5nIitadFtvXSwhMCxpKSwicGFkZGluZyIhPT1uJiYoYSs9eC5jc3MoZSwiYm9yZGVyIitadFtvXSsiV2lkdGgiLCEwLGkpKSk7cmV0dXJuIGF9ZnVuY3Rpb24gc24oZSx0LG4pe3ZhciByPSEwLGk9IndpZHRoIj09PXQ/ZS5vZmZzZXRXaWR0aDplLm9mZnNldEhlaWdodCxvPVJ0KGUpLGE9eC5zdXBwb3J0LmJveFNpemluZyYmImJvcmRlci1ib3giPT09eC5jc3MoZSwiYm94U2l6aW5nIiwhMSxvKTtpZigwPj1pfHxudWxsPT1pKXtpZihpPVd0KGUsdCxvKSwoMD5pfHxudWxsPT1pKSYmKGk9ZS5zdHlsZVt0XSksWXQudGVzdChpKSlyZXR1cm4gaTtyPWEmJih4LnN1cHBvcnQuYm94U2l6aW5nUmVsaWFibGV8fGk9PT1lLnN0eWxlW3RdKSxpPXBhcnNlRmxvYXQoaSl8fDB9cmV0dXJuIGkrYW4oZSx0LG58fChhPyJib3JkZXIiOiJjb250ZW50IikscixvKSsicHgifWZ1bmN0aW9uIGxuKGUpe3ZhciB0PWEsbj1HdFtlXTtyZXR1cm4gbnx8KG49dW4oZSx0KSwibm9uZSIhPT1uJiZufHwoUHQ9KFB0fHx4KCI8aWZyYW1lIGZyYW1lYm9yZGVyPScwJyB3aWR0aD0nMCcgaGVpZ2h0PScwJy8+IikuY3NzKCJjc3NUZXh0IiwiZGlzcGxheTpibG9jayAhaW1wb3J0YW50IikpLmFwcGVuZFRvKHQuZG9jdW1lbnRFbGVtZW50KSx0PShQdFswXS5jb250ZW50V2luZG93fHxQdFswXS5jb250ZW50RG9jdW1lbnQpLmRvY3VtZW50LHQud3JpdGUoIjwhZG9jdHlwZSBodG1sPjxodG1sPjxib2R5PiIpLHQuY2xvc2UoKSxuPXVuKGUsdCksUHQuZGV0YWNoKCkpLEd0W2VdPW4pLG59ZnVuY3Rpb24gdW4oZSx0KXt2YXIgbj14KHQuY3JlYXRlRWxlbWVudChlKSkuYXBwZW5kVG8odC5ib2R5KSxyPXguY3NzKG5bMF0sImRpc3BsYXkiKTtyZXR1cm4gbi5yZW1vdmUoKSxyfXguZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oZSxuKXt4LmNzc0hvb2tzW25dPXtnZXQ6ZnVuY3Rpb24oZSxyLGkpe3JldHVybiByPzA9PT1lLm9mZnNldFdpZHRoJiZYdC50ZXN0KHguY3NzKGUsImRpc3BsYXkiKSk/eC5zd2FwKGUsUXQsZnVuY3Rpb24oKXtyZXR1cm4gc24oZSxuLGkpfSk6c24oZSxuLGkpOnR9LHNldDpmdW5jdGlvbihlLHQscil7dmFyIGk9ciYmUnQoZSk7cmV0dXJuIG9uKGUsdCxyP2FuKGUsbixyLHguc3VwcG9ydC5ib3hTaXppbmcmJiJib3JkZXItYm94Ij09PXguY3NzKGUsImJveFNpemluZyIsITEsaSksaSk6MCl9fX0pLHguc3VwcG9ydC5vcGFjaXR5fHwoeC5jc3NIb29rcy5vcGFjaXR5PXtnZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gSXQudGVzdCgodCYmZS5jdXJyZW50U3R5bGU/ZS5jdXJyZW50U3R5bGUuZmlsdGVyOmUuc3R5bGUuZmlsdGVyKXx8IiIpPy4wMSpwYXJzZUZsb2F0KFJlZ0V4cC4kMSkrIiI6dD8iMSI6IiJ9LHNldDpmdW5jdGlvbihlLHQpe3ZhciBuPWUuc3R5bGUscj1lLmN1cnJlbnRTdHlsZSxpPXguaXNOdW1lcmljKHQpPyJhbHBoYShvcGFjaXR5PSIrMTAwKnQrIikiOiIiLG89ciYmci5maWx0ZXJ8fG4uZmlsdGVyfHwiIjtuLnpvb209MSwodD49MXx8IiI9PT10KSYmIiI9PT14LnRyaW0oby5yZXBsYWNlKCR0LCIiKSkmJm4ucmVtb3ZlQXR0cmlidXRlJiYobi5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpLCIiPT09dHx8ciYmIXIuZmlsdGVyKXx8KG4uZmlsdGVyPSR0LnRlc3Qobyk/by5yZXBsYWNlKCR0LGkpOm8rIiAiK2kpfX0pLHgoZnVuY3Rpb24oKXt4LnN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodHx8KHguY3NzSG9va3MubWFyZ2luUmlnaHQ9e2dldDpmdW5jdGlvbihlLG4pe3JldHVybiBuP3guc3dhcChlLHtkaXNwbGF5OiJpbmxpbmUtYmxvY2sifSxXdCxbZSwibWFyZ2luUmlnaHQiXSk6dH19KSwheC5zdXBwb3J0LnBpeGVsUG9zaXRpb24mJnguZm4ucG9zaXRpb24mJnguZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihlLG4pe3guY3NzSG9va3Nbbl09e2dldDpmdW5jdGlvbihlLHIpe3JldHVybiByPyhyPVd0KGUsbiksWXQudGVzdChyKT94KGUpLnBvc2l0aW9uKClbbl0rInB4IjpyKTp0fX19KX0pLHguZXhwciYmeC5leHByLmZpbHRlcnMmJih4LmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oZSl7cmV0dXJuIDA+PWUub2Zmc2V0V2lkdGgmJjA+PWUub2Zmc2V0SGVpZ2h0fHwheC5zdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyYmIm5vbmUiPT09KGUuc3R5bGUmJmUuc3R5bGUuZGlzcGxheXx8eC5jc3MoZSwiZGlzcGxheSIpKX0seC5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihlKXtyZXR1cm4heC5leHByLmZpbHRlcnMuaGlkZGVuKGUpfSkseC5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oZSx0KXt4LmNzc0hvb2tzW2UrdF09e2V4cGFuZDpmdW5jdGlvbihuKXt2YXIgcj0wLGk9e30sbz0ic3RyaW5nIj09dHlwZW9mIG4/bi5zcGxpdCgiICIpOltuXTtmb3IoOzQ+cjtyKyspaVtlK1p0W3JdK3RdPW9bcl18fG9bci0yXXx8b1swXTtyZXR1cm4gaX19LFV0LnRlc3QoZSl8fCh4LmNzc0hvb2tzW2UrdF0uc2V0PW9uKX0pO3ZhciBjbj0vJTIwL2cscG49L1xbXF0kLyxmbj0vXHI/XG4vZyxkbj0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksaG49L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO3guZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4geC5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPXgucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBlP3gubWFrZUFycmF5KGUpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgZT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIXgodGhpcykuaXMoIjpkaXNhYmxlZCIpJiZobi50ZXN0KHRoaXMubm9kZU5hbWUpJiYhZG4udGVzdChlKSYmKHRoaXMuY2hlY2tlZHx8IUN0LnRlc3QoZSkpfSkubWFwKGZ1bmN0aW9uKGUsdCl7dmFyIG49eCh0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09bj9udWxsOnguaXNBcnJheShuKT94Lm1hcChuLGZ1bmN0aW9uKGUpe3JldHVybntuYW1lOnQubmFtZSx2YWx1ZTplLnJlcGxhY2UoZm4sIlxyXG4iKX19KTp7bmFtZTp0Lm5hbWUsdmFsdWU6bi5yZXBsYWNlKGZuLCJcclxuIil9fSkuZ2V0KCl9fSkseC5wYXJhbT1mdW5jdGlvbihlLG4pe3ZhciByLGk9W10sbz1mdW5jdGlvbihlLHQpe3Q9eC5pc0Z1bmN0aW9uKHQpP3QoKTpudWxsPT10PyIiOnQsaVtpLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGUpKyI9IitlbmNvZGVVUklDb21wb25lbnQodCl9O2lmKG49PT10JiYobj14LmFqYXhTZXR0aW5ncyYmeC5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLHguaXNBcnJheShlKXx8ZS5qcXVlcnkmJiF4LmlzUGxhaW5PYmplY3QoZSkpeC5lYWNoKGUsZnVuY3Rpb24oKXtvKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKHIgaW4gZSlnbihyLGVbcl0sbixvKTtyZXR1cm4gaS5qb2luKCImIikucmVwbGFjZShjbiwiKyIpfTtmdW5jdGlvbiBnbihlLHQsbixyKXt2YXIgaTtpZih4LmlzQXJyYXkodCkpeC5lYWNoKHQsZnVuY3Rpb24odCxpKXtufHxwbi50ZXN0KGUpP3IoZSxpKTpnbihlKyJbIisoIm9iamVjdCI9PXR5cGVvZiBpP3Q6IiIpKyJdIixpLG4scil9KTtlbHNlIGlmKG58fCJvYmplY3QiIT09eC50eXBlKHQpKXIoZSx0KTtlbHNlIGZvcihpIGluIHQpZ24oZSsiWyIraSsiXSIsdFtpXSxuLHIpfXguZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe3guZm5bdF09ZnVuY3Rpb24oZSxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24odCxudWxsLGUsbik6dGhpcy50cmlnZ2VyKHQpfX0pLHguZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoZSkubW91c2VsZWF2ZSh0fHxlKX0sYmluZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub24oZSxudWxsLHQsbil9LHVuYmluZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm9mZihlLG51bGwsdCl9LGRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLm9uKHQsZSxuLHIpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYoZSwiKioiKTp0aGlzLm9mZih0LGV8fCIqKiIsbil9fSk7dmFyIG1uLHluLHZuPXgubm93KCksYm49L1w/Lyx4bj0vIy4qJC8sd249LyhbPyZdKV89W14mXSovLFRuPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvZ20sQ249L14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sTm49L14oPzpHRVR8SEVBRCkkLyxrbj0vXlwvXC8vLEVuPS9eKFtcdy4rLV0rOikoPzpcL1wvKFteXC8/IzpdKikoPzo6KFxkKyl8KXwpLyxTbj14LmZuLmxvYWQsQW49e30sam49e30sRG49IiovIi5jb25jYXQoIioiKTt0cnl7eW49by5ocmVmfWNhdGNoKExuKXt5bj1hLmNyZWF0ZUVsZW1lbnQoImEiKSx5bi5ocmVmPSIiLHluPXluLmhyZWZ9bW49RW4uZXhlYyh5bi50b0xvd2VyQ2FzZSgpKXx8W107ZnVuY3Rpb24gSG4oZSl7cmV0dXJuIGZ1bmN0aW9uKHQsbil7InN0cmluZyIhPXR5cGVvZiB0JiYobj10LHQ9IioiKTt2YXIgcixpPTAsbz10LnRvTG93ZXJDYXNlKCkubWF0Y2goVCl8fFtdO2lmKHguaXNGdW5jdGlvbihuKSl3aGlsZShyPW9baSsrXSkiKyI9PT1yWzBdPyhyPXIuc2xpY2UoMSl8fCIqIiwoZVtyXT1lW3JdfHxbXSkudW5zaGlmdChuKSk6KGVbcl09ZVtyXXx8W10pLnB1c2gobil9fWZ1bmN0aW9uIHFuKGUsbixyLGkpe3ZhciBvPXt9LGE9ZT09PWpuO2Z1bmN0aW9uIHMobCl7dmFyIHU7cmV0dXJuIG9bbF09ITAseC5lYWNoKGVbbF18fFtdLGZ1bmN0aW9uKGUsbCl7dmFyIGM9bChuLHIsaSk7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBjfHxhfHxvW2NdP2E/ISh1PWMpOnQ6KG4uZGF0YVR5cGVzLnVuc2hpZnQoYykscyhjKSwhMSl9KSx1fXJldHVybiBzKG4uZGF0YVR5cGVzWzBdKXx8IW9bIioiXSYmcygiKiIpfWZ1bmN0aW9uIF9uKGUsbil7dmFyIHIsaSxvPXguYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IoaSBpbiBuKW5baV0hPT10JiYoKG9baV0/ZTpyfHwocj17fSkpW2ldPW5baV0pO3JldHVybiByJiZ4LmV4dGVuZCghMCxlLHIpLGV9eC5mbi5sb2FkPWZ1bmN0aW9uKGUsbixyKXtpZigic3RyaW5nIiE9dHlwZW9mIGUmJlNuKXJldHVybiBTbi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGksbyxhLHM9dGhpcyxsPWUuaW5kZXhPZigiICIpO3JldHVybiBsPj0wJiYoaT1lLnNsaWNlKGwsZS5sZW5ndGgpLGU9ZS5zbGljZSgwLGwpKSx4LmlzRnVuY3Rpb24obik/KHI9bixuPXQpOm4mJiJvYmplY3QiPT10eXBlb2YgbiYmKGE9IlBPU1QiKSxzLmxlbmd0aD4wJiZ4LmFqYXgoe3VybDplLHR5cGU6YSxkYXRhVHlwZToiaHRtbCIsZGF0YTpufSkuZG9uZShmdW5jdGlvbihlKXtvPWFyZ3VtZW50cyxzLmh0bWwoaT94KCI8ZGl2PiIpLmFwcGVuZCh4LnBhcnNlSFRNTChlKSkuZmluZChpKTplKX0pLmNvbXBsZXRlKHImJmZ1bmN0aW9uKGUsdCl7cy5lYWNoKHIsb3x8W2UucmVzcG9uc2VUZXh0LHQsZV0pfSksdGhpc30seC5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oZSx0KXt4LmZuW3RdPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9uKHQsZSl9fSkseC5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9LGFqYXhTZXR0aW5nczp7dXJsOnluLHR5cGU6IkdFVCIsaXNMb2NhbDpDbi50ZXN0KG1uWzFdKSxnbG9iYWw6ITAscHJvY2Vzc0RhdGE6ITAsYXN5bmM6ITAsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsYWNjZXB0czp7IioiOkRuLHRleHQ6InRleHQvcGxhaW4iLGh0bWw6InRleHQvaHRtbCIseG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQifSxjb250ZW50czp7eG1sOi94bWwvLGh0bWw6L2h0bWwvLGpzb246L2pzb24vfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6eC5wYXJzZUpTT04sInRleHQgeG1sIjp4LnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0dXA6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9fbihfbihlLHguYWpheFNldHRpbmdzKSx0KTpfbih4LmFqYXhTZXR0aW5ncyxlKX0sYWpheFByZWZpbHRlcjpIbihBbiksYWpheFRyYW5zcG9ydDpIbihqbiksYWpheDpmdW5jdGlvbihlLG4peyJvYmplY3QiPT10eXBlb2YgZSYmKG49ZSxlPXQpLG49bnx8e307dmFyIHIsaSxvLGEscyxsLHUsYyxwPXguYWpheFNldHVwKHt9LG4pLGY9cC5jb250ZXh0fHxwLGQ9cC5jb250ZXh0JiYoZi5ub2RlVHlwZXx8Zi5qcXVlcnkpP3goZik6eC5ldmVudCxoPXguRGVmZXJyZWQoKSxnPXguQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLG09cC5zdGF0dXNDb2RlfHx7fSx5PXt9LHY9e30sYj0wLHc9ImNhbmNlbGVkIixDPXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoMj09PWIpe2lmKCFjKXtjPXt9O3doaWxlKHQ9VG4uZXhlYyhhKSljW3RbMV0udG9Mb3dlckNhc2UoKV09dFsyXX10PWNbZS50b0xvd2VyQ2FzZSgpXX1yZXR1cm4gbnVsbD09dD9udWxsOnR9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiAyPT09Yj9hOm51bGx9LHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGJ8fChlPXZbbl09dltuXXx8ZSx5W2VdPXQpLHRoaXN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGJ8fChwLm1pbWVUeXBlPWUpLHRoaXN9LHN0YXR1c0NvZGU6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoZSlpZigyPmIpZm9yKHQgaW4gZSltW3RdPVttW3RdLGVbdF1dO2Vsc2UgQy5hbHdheXMoZVtDLnN0YXR1c10pO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihlKXt2YXIgdD1lfHx3O3JldHVybiB1JiZ1LmFib3J0KHQpLGsoMCx0KSx0aGlzfX07aWYoaC5wcm9taXNlKEMpLmNvbXBsZXRlPWcuYWRkLEMuc3VjY2Vzcz1DLmRvbmUsQy5lcnJvcj1DLmZhaWwscC51cmw9KChlfHxwLnVybHx8eW4pKyIiKS5yZXBsYWNlKHhuLCIiKS5yZXBsYWNlKGtuLG1uWzFdKyIvLyIpLHAudHlwZT1uLm1ldGhvZHx8bi50eXBlfHxwLm1ldGhvZHx8cC50eXBlLHAuZGF0YVR5cGVzPXgudHJpbShwLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkubWF0Y2goVCl8fFsiIl0sbnVsbD09cC5jcm9zc0RvbWFpbiYmKHI9RW4uZXhlYyhwLnVybC50b0xvd2VyQ2FzZSgpKSxwLmNyb3NzRG9tYWluPSEoIXJ8fHJbMV09PT1tblsxXSYmclsyXT09PW1uWzJdJiYoclszXXx8KCJodHRwOiI9PT1yWzFdPyI4MCI6IjQ0MyIpKT09PShtblszXXx8KCJodHRwOiI9PT1tblsxXT8iODAiOiI0NDMiKSkpKSxwLmRhdGEmJnAucHJvY2Vzc0RhdGEmJiJzdHJpbmciIT10eXBlb2YgcC5kYXRhJiYocC5kYXRhPXgucGFyYW0ocC5kYXRhLHAudHJhZGl0aW9uYWwpKSxxbihBbixwLG4sQyksMj09PWIpcmV0dXJuIEM7bD1wLmdsb2JhbCxsJiYwPT09eC5hY3RpdmUrKyYmeC5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKSxwLnR5cGU9cC50eXBlLnRvVXBwZXJDYXNlKCkscC5oYXNDb250ZW50PSFObi50ZXN0KHAudHlwZSksbz1wLnVybCxwLmhhc0NvbnRlbnR8fChwLmRhdGEmJihvPXAudXJsKz0oYm4udGVzdChvKT8iJiI6Ij8iKStwLmRhdGEsZGVsZXRlIHAuZGF0YSkscC5jYWNoZT09PSExJiYocC51cmw9d24udGVzdChvKT9vLnJlcGxhY2Uod24sIiQxXz0iK3ZuKyspOm8rKGJuLnRlc3Qobyk/IiYiOiI/IikrIl89Iit2bisrKSkscC5pZk1vZGlmaWVkJiYoeC5sYXN0TW9kaWZpZWRbb10mJkMuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLHgubGFzdE1vZGlmaWVkW29dKSx4LmV0YWdbb10mJkMuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIseC5ldGFnW29dKSksKHAuZGF0YSYmcC5oYXNDb250ZW50JiZwLmNvbnRlbnRUeXBlIT09ITF8fG4uY29udGVudFR5cGUpJiZDLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIscC5jb250ZW50VHlwZSksQy5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLHAuZGF0YVR5cGVzWzBdJiZwLmFjY2VwdHNbcC5kYXRhVHlwZXNbMF1dP3AuYWNjZXB0c1twLmRhdGFUeXBlc1swXV0rKCIqIiE9PXAuZGF0YVR5cGVzWzBdPyIsICIrRG4rIjsgcT0wLjAxIjoiIik6cC5hY2NlcHRzWyIqIl0pO2ZvcihpIGluIHAuaGVhZGVycylDLnNldFJlcXVlc3RIZWFkZXIoaSxwLmhlYWRlcnNbaV0pO2lmKHAuYmVmb3JlU2VuZCYmKHAuYmVmb3JlU2VuZC5jYWxsKGYsQyxwKT09PSExfHwyPT09YikpcmV0dXJuIEMuYWJvcnQoKTt3PSJhYm9ydCI7Zm9yKGkgaW57c3VjY2VzczoxLGVycm9yOjEsY29tcGxldGU6MX0pQ1tpXShwW2ldKTtpZih1PXFuKGpuLHAsbixDKSl7Qy5yZWFkeVN0YXRlPTEsbCYmZC50cmlnZ2VyKCJhamF4U2VuZCIsW0MscF0pLHAuYXN5bmMmJnAudGltZW91dD4wJiYocz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Qy5hYm9ydCgidGltZW91dCIpfSxwLnRpbWVvdXQpKTt0cnl7Yj0xLHUuc2VuZCh5LGspfWNhdGNoKE4pe2lmKCEoMj5iKSl0aHJvdyBOO2soLTEsTil9fWVsc2UgaygtMSwiTm8gVHJhbnNwb3J0Iik7ZnVuY3Rpb24gayhlLG4scixpKXt2YXIgYyx5LHYsdyxULE49bjsyIT09YiYmKGI9MixzJiZjbGVhclRpbWVvdXQocyksdT10LGE9aXx8IiIsQy5yZWFkeVN0YXRlPWU+MD80OjAsYz1lPj0yMDAmJjMwMD5lfHwzMDQ9PT1lLHImJih3PU1uKHAsQyxyKSksdz1PbihwLHcsQyxjKSxjPyhwLmlmTW9kaWZpZWQmJihUPUMuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSxUJiYoeC5sYXN0TW9kaWZpZWRbb109VCksVD1DLmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIiksVCYmKHguZXRhZ1tvXT1UKSksMjA0PT09ZXx8IkhFQUQiPT09cC50eXBlP049Im5vY29udGVudCI6MzA0PT09ZT9OPSJub3Rtb2RpZmllZCI6KE49dy5zdGF0ZSx5PXcuZGF0YSx2PXcuZXJyb3IsYz0hdikpOih2PU4sKGV8fCFOKSYmKE49ImVycm9yIiwwPmUmJihlPTApKSksQy5zdGF0dXM9ZSxDLnN0YXR1c1RleHQ9KG58fE4pKyIiLGM/aC5yZXNvbHZlV2l0aChmLFt5LE4sQ10pOmgucmVqZWN0V2l0aChmLFtDLE4sdl0pLEMuc3RhdHVzQ29kZShtKSxtPXQsbCYmZC50cmlnZ2VyKGM/ImFqYXhTdWNjZXNzIjoiYWpheEVycm9yIixbQyxwLGM/eTp2XSksZy5maXJlV2l0aChmLFtDLE5dKSxsJiYoZC50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFtDLHBdKSwtLXguYWN0aXZlfHx4LmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpKX1yZXR1cm4gQ30sZ2V0SlNPTjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHguZ2V0KGUsdCxuLCJqc29uIil9LGdldFNjcmlwdDpmdW5jdGlvbihlLG4pe3JldHVybiB4LmdldChlLHQsbiwic2NyaXB0Iil9fSkseC5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGUsbil7eFtuXT1mdW5jdGlvbihlLHIsaSxvKXtyZXR1cm4geC5pc0Z1bmN0aW9uKHIpJiYobz1vfHxpLGk9cixyPXQpLHguYWpheCh7dXJsOmUsdHlwZTpuLGRhdGFUeXBlOm8sZGF0YTpyLHN1Y2Nlc3M6aX0pfX0pO2Z1bmN0aW9uIE1uKGUsbixyKXt2YXIgaSxvLGEscyxsPWUuY29udGVudHMsdT1lLmRhdGFUeXBlczt3aGlsZSgiKiI9PT11WzBdKXUuc2hpZnQoKSxvPT09dCYmKG89ZS5taW1lVHlwZXx8bi5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1UeXBlIikpO2lmKG8pZm9yKHMgaW4gbClpZihsW3NdJiZsW3NdLnRlc3Qobykpe3UudW5zaGlmdChzKTticmVha31pZih1WzBdaW4gcilhPXVbMF07ZWxzZXtmb3IocyBpbiByKXtpZighdVswXXx8ZS5jb252ZXJ0ZXJzW3MrIiAiK3VbMF1dKXthPXM7YnJlYWt9aXx8KGk9cyl9YT1hfHxpfXJldHVybiBhPyhhIT09dVswXSYmdS51bnNoaWZ0KGEpLHJbYV0pOnR9ZnVuY3Rpb24gT24oZSx0LG4scil7dmFyIGksbyxhLHMsbCx1PXt9LGM9ZS5kYXRhVHlwZXMuc2xpY2UoKTtpZihjWzFdKWZvcihhIGluIGUuY29udmVydGVycyl1W2EudG9Mb3dlckNhc2UoKV09ZS5jb252ZXJ0ZXJzW2FdO289Yy5zaGlmdCgpO3doaWxlKG8paWYoZS5yZXNwb25zZUZpZWxkc1tvXSYmKG5bZS5yZXNwb25zZUZpZWxkc1tvXV09dCksIWwmJnImJmUuZGF0YUZpbHRlciYmKHQ9ZS5kYXRhRmlsdGVyKHQsZS5kYXRhVHlwZSkpLGw9byxvPWMuc2hpZnQoKSlpZigiKiI9PT1vKW89bDtlbHNlIGlmKCIqIiE9PWwmJmwhPT1vKXtpZihhPXVbbCsiICIrb118fHVbIiogIitvXSwhYSlmb3IoaSBpbiB1KWlmKHM9aS5zcGxpdCgiICIpLHNbMV09PT1vJiYoYT11W2wrIiAiK3NbMF1dfHx1WyIqICIrc1swXV0pKXthPT09ITA/YT11W2ldOnVbaV0hPT0hMCYmKG89c1swXSxjLnVuc2hpZnQoc1sxXSkpO2JyZWFrfWlmKGEhPT0hMClpZihhJiZlWyJ0aHJvd3MiXSl0PWEodCk7ZWxzZSB0cnl7dD1hKHQpfWNhdGNoKHApe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmE/cDoiTm8gY29udmVyc2lvbiBmcm9tICIrbCsiIHRvICIrb319fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTp0fX14LmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6Lyg/OmphdmF8ZWNtYSlzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGUpe3JldHVybiB4Lmdsb2JhbEV2YWwoZSksZX19fSkseC5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGUpe2UuY2FjaGU9PT10JiYoZS5jYWNoZT0hMSksZS5jcm9zc0RvbWFpbiYmKGUudHlwZT0iR0VUIixlLmdsb2JhbD0hMSl9KSx4LmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24oZSl7aWYoZS5jcm9zc0RvbWFpbil7dmFyIG4scj1hLmhlYWR8fHgoImhlYWQiKVswXXx8YS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24odCxpKXtuPWEuY3JlYXRlRWxlbWVudCgic2NyaXB0Iiksbi5hc3luYz0hMCxlLnNjcmlwdENoYXJzZXQmJihuLmNoYXJzZXQ9ZS5zY3JpcHRDaGFyc2V0KSxuLnNyYz1lLnVybCxuLm9ubG9hZD1uLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihlLHQpeyh0fHwhbi5yZWFkeVN0YXRlfHwvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KG4ucmVhZHlTdGF0ZSkpJiYobi5vbmxvYWQ9bi5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxuLnBhcmVudE5vZGUmJm4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKSxuPW51bGwsdHx8aSgyMDAsInN1Y2Nlc3MiKSl9LHIuaW5zZXJ0QmVmb3JlKG4sci5maXJzdENoaWxkKX0sYWJvcnQ6ZnVuY3Rpb24oKXtuJiZuLm9ubG9hZCh0LCEwKX19fX0pO3ZhciBGbj1bXSxCbj0vKD0pXD8oPz0mfCQpfFw/XD8vO3guYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXt2YXIgZT1Gbi5wb3AoKXx8eC5leHBhbmRvKyJfIit2bisrO3JldHVybiB0aGlzW2VdPSEwLGV9fSkseC5hamF4UHJlZmlsdGVyKCJqc29uIGpzb25wIixmdW5jdGlvbihuLHIsaSl7dmFyIG8sYSxzLGw9bi5qc29ucCE9PSExJiYoQm4udGVzdChuLnVybCk/InVybCI6InN0cmluZyI9PXR5cGVvZiBuLmRhdGEmJiEobi5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiZCbi50ZXN0KG4uZGF0YSkmJiJkYXRhIik7cmV0dXJuIGx8fCJqc29ucCI9PT1uLmRhdGFUeXBlc1swXT8obz1uLmpzb25wQ2FsbGJhY2s9eC5pc0Z1bmN0aW9uKG4uanNvbnBDYWxsYmFjayk/bi5qc29ucENhbGxiYWNrKCk6bi5qc29ucENhbGxiYWNrLGw/bltsXT1uW2xdLnJlcGxhY2UoQm4sIiQxIitvKTpuLmpzb25wIT09ITEmJihuLnVybCs9KGJuLnRlc3Qobi51cmwpPyImIjoiPyIpK24uanNvbnArIj0iK28pLG4uY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiBzfHx4LmVycm9yKG8rIiB3YXMgbm90IGNhbGxlZCIpLHNbMF19LG4uZGF0YVR5cGVzWzBdPSJqc29uIixhPWVbb10sZVtvXT1mdW5jdGlvbigpe3M9YXJndW1lbnRzfSxpLmFsd2F5cyhmdW5jdGlvbigpe2Vbb109YSxuW29dJiYobi5qc29ucENhbGxiYWNrPXIuanNvbnBDYWxsYmFjayxGbi5wdXNoKG8pKSxzJiZ4LmlzRnVuY3Rpb24oYSkmJmEoc1swXSkscz1hPXR9KSwic2NyaXB0Iik6dH0pO3ZhciBQbixSbixXbj0wLCRuPWUuQWN0aXZlWE9iamVjdCYmZnVuY3Rpb24oKXt2YXIgZTtmb3IoZSBpbiBQbilQbltlXSh0LCEwKX07ZnVuY3Rpb24gSW4oKXt0cnl7cmV0dXJuIG5ldyBlLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKHQpe319ZnVuY3Rpb24gem4oKXt0cnl7cmV0dXJuIG5ldyBlLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2godCl7fX14LmFqYXhTZXR0aW5ncy54aHI9ZS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNMb2NhbCYmSW4oKXx8em4oKX06SW4sUm49eC5hamF4U2V0dGluZ3MueGhyKCkseC5zdXBwb3J0LmNvcnM9ISFSbiYmIndpdGhDcmVkZW50aWFscyJpbiBSbixSbj14LnN1cHBvcnQuYWpheD0hIVJuLFJuJiZ4LmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24obil7aWYoIW4uY3Jvc3NEb21haW58fHguc3VwcG9ydC5jb3JzKXt2YXIgcjtyZXR1cm57c2VuZDpmdW5jdGlvbihpLG8pe3ZhciBhLHMsbD1uLnhocigpO2lmKG4udXNlcm5hbWU/bC5vcGVuKG4udHlwZSxuLnVybCxuLmFzeW5jLG4udXNlcm5hbWUsbi5wYXNzd29yZCk6bC5vcGVuKG4udHlwZSxuLnVybCxuLmFzeW5jKSxuLnhockZpZWxkcylmb3IocyBpbiBuLnhockZpZWxkcylsW3NdPW4ueGhyRmllbGRzW3NdO24ubWltZVR5cGUmJmwub3ZlcnJpZGVNaW1lVHlwZSYmbC5vdmVycmlkZU1pbWVUeXBlKG4ubWltZVR5cGUpLG4uY3Jvc3NEb21haW58fGlbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGlbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTt0cnl7Zm9yKHMgaW4gaSlsLnNldFJlcXVlc3RIZWFkZXIocyxpW3NdKX1jYXRjaCh1KXt9bC5zZW5kKG4uaGFzQ29udGVudCYmbi5kYXRhfHxudWxsKSxyPWZ1bmN0aW9uKGUsaSl7dmFyIHMsdSxjLHA7dHJ5e2lmKHImJihpfHw0PT09bC5yZWFkeVN0YXRlKSlpZihyPXQsYSYmKGwub25yZWFkeXN0YXRlY2hhbmdlPXgubm9vcCwkbiYmZGVsZXRlIFBuW2FdKSxpKTQhPT1sLnJlYWR5U3RhdGUmJmwuYWJvcnQoKTtlbHNle3A9e30scz1sLnN0YXR1cyx1PWwuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCksInN0cmluZyI9PXR5cGVvZiBsLnJlc3BvbnNlVGV4dCYmKHAudGV4dD1sLnJlc3BvbnNlVGV4dCk7dHJ5e2M9bC5zdGF0dXNUZXh0fWNhdGNoKGYpe2M9IiJ9c3x8IW4uaXNMb2NhbHx8bi5jcm9zc0RvbWFpbj8xMjIzPT09cyYmKHM9MjA0KTpzPXAudGV4dD8yMDA6NDA0fX1jYXRjaChkKXtpfHxvKC0xLGQpfXAmJm8ocyxjLHAsdSl9LG4uYXN5bmM/ND09PWwucmVhZHlTdGF0ZT9zZXRUaW1lb3V0KHIpOihhPSsrV24sJG4mJihQbnx8KFBuPXt9LHgoZSkudW5sb2FkKCRuKSksUG5bYV09ciksbC5vbnJlYWR5c3RhdGVjaGFuZ2U9cik6cigpfSxhYm9ydDpmdW5jdGlvbigpe3ImJnIodCwhMCl9fX19KTt2YXIgWG4sVW4sVm49L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLFluPVJlZ0V4cCgiXig/OihbKy1dKT18KSgiK3crIikoW2EteiVdKikkIiwiaSIpLEpuPS9xdWV1ZUhvb2tzJC8sR249W25yXSxRbj17IioiOltmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuY3JlYXRlVHdlZW4oZSx0KSxyPW4uY3VyKCksaT1Zbi5leGVjKHQpLG89aSYmaVszXXx8KHguY3NzTnVtYmVyW2VdPyIiOiJweCIpLGE9KHguY3NzTnVtYmVyW2VdfHwicHgiIT09byYmK3IpJiZZbi5leGVjKHguY3NzKG4uZWxlbSxlKSkscz0xLGw9MjA7aWYoYSYmYVszXSE9PW8pe289b3x8YVszXSxpPWl8fFtdLGE9K3J8fDE7ZG8gcz1zfHwiLjUiLGEvPXMseC5zdHlsZShuLmVsZW0sZSxhK28pO3doaWxlKHMhPT0ocz1uLmN1cigpL3IpJiYxIT09cyYmLS1sKX1yZXR1cm4gaSYmKGE9bi5zdGFydD0rYXx8K3J8fDAsbi51bml0PW8sbi5lbmQ9aVsxXT9hKyhpWzFdKzEpKmlbMl06K2lbMl0pLG59XX07ZnVuY3Rpb24gS24oKXtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe1huPXR9KSxYbj14Lm5vdygpfWZ1bmN0aW9uIFpuKGUsdCxuKXt2YXIgcixpPShRblt0XXx8W10pLmNvbmNhdChRblsiKiJdKSxvPTAsYT1pLmxlbmd0aDtmb3IoO2E+bztvKyspaWYocj1pW29dLmNhbGwobix0LGUpKXJldHVybiByfWZ1bmN0aW9uIGVyKGUsdCxuKXt2YXIgcixpLG89MCxhPUduLmxlbmd0aCxzPXguRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgbC5lbGVtfSksbD1mdW5jdGlvbigpe2lmKGkpcmV0dXJuITE7dmFyIHQ9WG58fEtuKCksbj1NYXRoLm1heCgwLHUuc3RhcnRUaW1lK3UuZHVyYXRpb24tdCkscj1uL3UuZHVyYXRpb258fDAsbz0xLXIsYT0wLGw9dS50d2VlbnMubGVuZ3RoO2Zvcig7bD5hO2ErKyl1LnR3ZWVuc1thXS5ydW4obyk7cmV0dXJuIHMubm90aWZ5V2l0aChlLFt1LG8sbl0pLDE+byYmbD9uOihzLnJlc29sdmVXaXRoKGUsW3VdKSwhMSl9LHU9cy5wcm9taXNlKHtlbGVtOmUscHJvcHM6eC5leHRlbmQoe30sdCksb3B0czp4LmV4dGVuZCghMCx7c3BlY2lhbEVhc2luZzp7fX0sbiksb3JpZ2luYWxQcm9wZXJ0aWVzOnQsb3JpZ2luYWxPcHRpb25zOm4sc3RhcnRUaW1lOlhufHxLbigpLGR1cmF0aW9uOm4uZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKHQsbil7dmFyIHI9eC5Ud2VlbihlLHUub3B0cyx0LG4sdS5vcHRzLnNwZWNpYWxFYXNpbmdbdF18fHUub3B0cy5lYXNpbmcpO3JldHVybiB1LnR3ZWVucy5wdXNoKHIpLHJ9LHN0b3A6ZnVuY3Rpb24odCl7dmFyIG49MCxyPXQ/dS50d2VlbnMubGVuZ3RoOjA7aWYoaSlyZXR1cm4gdGhpcztmb3IoaT0hMDtyPm47bisrKXUudHdlZW5zW25dLnJ1bigxKTtyZXR1cm4gdD9zLnJlc29sdmVXaXRoKGUsW3UsdF0pOnMucmVqZWN0V2l0aChlLFt1LHRdKSx0aGlzfX0pLGM9dS5wcm9wcztmb3IodHIoYyx1Lm9wdHMuc3BlY2lhbEVhc2luZyk7YT5vO28rKylpZihyPUduW29dLmNhbGwodSxlLGMsdS5vcHRzKSlyZXR1cm4gcjtyZXR1cm4geC5tYXAoYyxabix1KSx4LmlzRnVuY3Rpb24odS5vcHRzLnN0YXJ0KSYmdS5vcHRzLnN0YXJ0LmNhbGwoZSx1KSx4LmZ4LnRpbWVyKHguZXh0ZW5kKGwse2VsZW06ZSxhbmltOnUscXVldWU6dS5vcHRzLnF1ZXVlfSkpLHUucHJvZ3Jlc3ModS5vcHRzLnByb2dyZXNzKS5kb25lKHUub3B0cy5kb25lLHUub3B0cy5jb21wbGV0ZSkuZmFpbCh1Lm9wdHMuZmFpbCkuYWx3YXlzKHUub3B0cy5hbHdheXMpfWZ1bmN0aW9uIHRyKGUsdCl7dmFyIG4scixpLG8sYTtmb3IobiBpbiBlKWlmKHI9eC5jYW1lbENhc2UobiksaT10W3JdLG89ZVtuXSx4LmlzQXJyYXkobykmJihpPW9bMV0sbz1lW25dPW9bMF0pLG4hPT1yJiYoZVtyXT1vLGRlbGV0ZSBlW25dKSxhPXguY3NzSG9va3Nbcl0sYSYmImV4cGFuZCJpbiBhKXtvPWEuZXhwYW5kKG8pLGRlbGV0ZSBlW3JdO2ZvcihuIGluIG8pbiBpbiBlfHwoZVtuXT1vW25dLHRbbl09aSl9ZWxzZSB0W3JdPWl9eC5BbmltYXRpb249eC5leHRlbmQoZXIse3R3ZWVuZXI6ZnVuY3Rpb24oZSx0KXt4LmlzRnVuY3Rpb24oZSk/KHQ9ZSxlPVsiKiJdKTplPWUuc3BsaXQoIiAiKTt2YXIgbixyPTAsaT1lLmxlbmd0aDtmb3IoO2k+cjtyKyspbj1lW3JdLFFuW25dPVFuW25dfHxbXSxRbltuXS51bnNoaWZ0KHQpfSxwcmVmaWx0ZXI6ZnVuY3Rpb24oZSx0KXt0P0duLnVuc2hpZnQoZSk6R24ucHVzaChlKX19KTtmdW5jdGlvbiBucihlLHQsbil7dmFyIHIsaSxvLGEscyxsLHU9dGhpcyxjPXt9LHA9ZS5zdHlsZSxmPWUubm9kZVR5cGUmJm5uKGUpLGQ9eC5fZGF0YShlLCJmeHNob3ciKTtuLnF1ZXVlfHwocz14Ll9xdWV1ZUhvb2tzKGUsImZ4IiksbnVsbD09cy51bnF1ZXVlZCYmKHMudW5xdWV1ZWQ9MCxsPXMuZW1wdHkuZmlyZSxzLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXtzLnVucXVldWVkfHxsKCl9KSxzLnVucXVldWVkKyssdS5hbHdheXMoZnVuY3Rpb24oKXt1LmFsd2F5cyhmdW5jdGlvbigpe3MudW5xdWV1ZWQtLSx4LnF1ZXVlKGUsImZ4IikubGVuZ3RofHxzLmVtcHR5LmZpcmUoKX0pfSkpLDE9PT1lLm5vZGVUeXBlJiYoImhlaWdodCJpbiB0fHwid2lkdGgiaW4gdCkmJihuLm92ZXJmbG93PVtwLm92ZXJmbG93LHAub3ZlcmZsb3dYLHAub3ZlcmZsb3dZXSwiaW5saW5lIj09PXguY3NzKGUsImRpc3BsYXkiKSYmIm5vbmUiPT09eC5jc3MoZSwiZmxvYXQiKSYmKHguc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0JiYiaW5saW5lIiE9PWxuKGUubm9kZU5hbWUpP3Auem9vbT0xOnAuZGlzcGxheT0iaW5saW5lLWJsb2NrIikpLG4ub3ZlcmZsb3cmJihwLm92ZXJmbG93PSJoaWRkZW4iLHguc3VwcG9ydC5zaHJpbmtXcmFwQmxvY2tzfHx1LmFsd2F5cyhmdW5jdGlvbigpe3Aub3ZlcmZsb3c9bi5vdmVyZmxvd1swXSxwLm92ZXJmbG93WD1uLm92ZXJmbG93WzFdLHAub3ZlcmZsb3dZPW4ub3ZlcmZsb3dbMl19KSk7Zm9yKHIgaW4gdClpZihpPXRbcl0sVm4uZXhlYyhpKSl7aWYoZGVsZXRlIHRbcl0sbz1vfHwidG9nZ2xlIj09PWksaT09PShmPyJoaWRlIjoic2hvdyIpKWNvbnRpbnVlO2Nbcl09ZCYmZFtyXXx8eC5zdHlsZShlLHIpfWlmKCF4LmlzRW1wdHlPYmplY3QoYykpe2Q/ImhpZGRlbiJpbiBkJiYoZj1kLmhpZGRlbik6ZD14Ll9kYXRhKGUsImZ4c2hvdyIse30pLG8mJihkLmhpZGRlbj0hZiksZj94KGUpLnNob3coKTp1LmRvbmUoZnVuY3Rpb24oKXt4KGUpLmhpZGUoKX0pLHUuZG9uZShmdW5jdGlvbigpe3ZhciB0O3guX3JlbW92ZURhdGEoZSwiZnhzaG93Iik7Zm9yKHQgaW4gYyl4LnN0eWxlKGUsdCxjW3RdKX0pO2ZvcihyIGluIGMpYT1abihmP2Rbcl06MCxyLHUpLHIgaW4gZHx8KGRbcl09YS5zdGFydCxmJiYoYS5lbmQ9YS5zdGFydCxhLnN0YXJ0PSJ3aWR0aCI9PT1yfHwiaGVpZ2h0Ij09PXI/MTowKSl9fWZ1bmN0aW9uIHJyKGUsdCxuLHIsaSl7cmV0dXJuIG5ldyByci5wcm90b3R5cGUuaW5pdChlLHQsbixyLGkpfXguVHdlZW49cnIscnIucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjpycixpbml0OmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt0aGlzLmVsZW09ZSx0aGlzLnByb3A9bix0aGlzLmVhc2luZz1pfHwic3dpbmciLHRoaXMub3B0aW9ucz10LHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1yLHRoaXMudW5pdD1vfHwoeC5jc3NOdW1iZXJbbl0/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBlPXJyLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBlJiZlLmdldD9lLmdldCh0aGlzKTpyci5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oZSl7dmFyIHQsbj1yci5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5wb3M9dD10aGlzLm9wdGlvbnMuZHVyYXRpb24/eC5lYXNpbmdbdGhpcy5lYXNpbmddKGUsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmUsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6ZSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqdCt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxuJiZuLnNldD9uLnNldCh0aGlzKTpyci5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSxyci5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9cnIucHJvdG90eXBlLHJyLnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gbnVsbD09ZS5lbGVtW2UucHJvcF18fGUuZWxlbS5zdHlsZSYmbnVsbCE9ZS5lbGVtLnN0eWxlW2UucHJvcF0/KHQ9eC5jc3MoZS5lbGVtLGUucHJvcCwiIiksdCYmImF1dG8iIT09dD90OjApOmUuZWxlbVtlLnByb3BdfSxzZXQ6ZnVuY3Rpb24oZSl7eC5meC5zdGVwW2UucHJvcF0/eC5meC5zdGVwW2UucHJvcF0oZSk6ZS5lbGVtLnN0eWxlJiYobnVsbCE9ZS5lbGVtLnN0eWxlW3guY3NzUHJvcHNbZS5wcm9wXV18fHguY3NzSG9va3NbZS5wcm9wXSk/eC5zdHlsZShlLmVsZW0sZS5wcm9wLGUubm93K2UudW5pdCk6ZS5lbGVtW2UucHJvcF09ZS5ub3d9fX0scnIucHJvcEhvb2tzLnNjcm9sbFRvcD1yci5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGUpe2UuZWxlbS5ub2RlVHlwZSYmZS5lbGVtLnBhcmVudE5vZGUmJihlLmVsZW1bZS5wcm9wXT1lLm5vdyl9fSx4LmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGUsdCl7dmFyIG49eC5mblt0XTt4LmZuW3RdPWZ1bmN0aW9uKGUscixpKXtyZXR1cm4gbnVsbD09ZXx8ImJvb2xlYW4iPT10eXBlb2YgZT9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUoaXIodCwhMCksZSxyLGkpfX0pLHguZm4uZXh0ZW5kKHtmYWRlVG86ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMuZmlsdGVyKG5uKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OnR9LGUsbixyKX0sYW5pbWF0ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIgaT14LmlzRW1wdHlPYmplY3QoZSksbz14LnNwZWVkKHQsbixyKSxhPWZ1bmN0aW9uKCl7dmFyIHQ9ZXIodGhpcyx4LmV4dGVuZCh7fSxlKSxvKTsoaXx8eC5fZGF0YSh0aGlzLCJmaW5pc2giKSkmJnQuc3RvcCghMCl9O3JldHVybiBhLmZpbmlzaD1hLGl8fG8ucXVldWU9PT0hMT90aGlzLmVhY2goYSk6dGhpcy5xdWV1ZShvLnF1ZXVlLGEpfSxzdG9wOmZ1bmN0aW9uKGUsbixyKXt2YXIgaT1mdW5jdGlvbihlKXt2YXIgdD1lLnN0b3A7ZGVsZXRlIGUuc3RvcCx0KHIpfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGUmJihyPW4sbj1lLGU9dCksbiYmZSE9PSExJiZ0aGlzLnF1ZXVlKGV8fCJmeCIsW10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PSEwLG49bnVsbCE9ZSYmZSsicXVldWVIb29rcyIsbz14LnRpbWVycyxhPXguX2RhdGEodGhpcyk7aWYobilhW25dJiZhW25dLnN0b3AmJmkoYVtuXSk7ZWxzZSBmb3IobiBpbiBhKWFbbl0mJmFbbl0uc3RvcCYmSm4udGVzdChuKSYmaShhW25dKTtmb3Iobj1vLmxlbmd0aDtuLS07KW9bbl0uZWxlbSE9PXRoaXN8fG51bGwhPWUmJm9bbl0ucXVldWUhPT1lfHwob1tuXS5hbmltLnN0b3AociksdD0hMSxvLnNwbGljZShuLDEpKTsodHx8IXIpJiZ4LmRlcXVldWUodGhpcyxlKX0pfSxmaW5pc2g6ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT0hMSYmKGU9ZXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQsbj14Ll9kYXRhKHRoaXMpLHI9bltlKyJxdWV1ZSJdLGk9bltlKyJxdWV1ZUhvb2tzIl0sbz14LnRpbWVycyxhPXI/ci5sZW5ndGg6MDtmb3Iobi5maW5pc2g9ITAseC5xdWV1ZSh0aGlzLGUsW10pLGkmJmkuc3RvcCYmaS5zdG9wLmNhbGwodGhpcywhMCksdD1vLmxlbmd0aDt0LS07KW9bdF0uZWxlbT09PXRoaXMmJm9bdF0ucXVldWU9PT1lJiYob1t0XS5hbmltLnN0b3AoITApLG8uc3BsaWNlKHQsMSkpO2Zvcih0PTA7YT50O3QrKylyW3RdJiZyW3RdLmZpbmlzaCYmclt0XS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgbi5maW5pc2h9KX19KTtmdW5jdGlvbiBpcihlLHQpe3ZhciBuLHI9e2hlaWdodDplfSxpPTA7Zm9yKHQ9dD8xOjA7ND5pO2krPTItdCluPVp0W2ldLHJbIm1hcmdpbiIrbl09clsicGFkZGluZyIrbl09ZTtyZXR1cm4gdCYmKHIub3BhY2l0eT1yLndpZHRoPWUpLHJ9eC5lYWNoKHtzbGlkZURvd246aXIoInNob3ciKSxzbGlkZVVwOmlyKCJoaWRlIiksc2xpZGVUb2dnbGU6aXIoInRvZ2dsZSIpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24oZSx0KXt4LmZuW2VdPWZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gdGhpcy5hbmltYXRlKHQsZSxuLHIpfX0pLHguc3BlZWQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUmJiJvYmplY3QiPT10eXBlb2YgZT94LmV4dGVuZCh7fSxlKTp7Y29tcGxldGU6bnx8IW4mJnR8fHguaXNGdW5jdGlvbihlKSYmZSxkdXJhdGlvbjplLGVhc2luZzpuJiZ0fHx0JiYheC5pc0Z1bmN0aW9uKHQpJiZ0fTtyZXR1cm4gci5kdXJhdGlvbj14LmZ4Lm9mZj8wOiJudW1iZXIiPT10eXBlb2Ygci5kdXJhdGlvbj9yLmR1cmF0aW9uOnIuZHVyYXRpb24gaW4geC5meC5zcGVlZHM/eC5meC5zcGVlZHNbci5kdXJhdGlvbl06eC5meC5zcGVlZHMuX2RlZmF1bHQsKG51bGw9PXIucXVldWV8fHIucXVldWU9PT0hMCkmJihyLnF1ZXVlPSJmeCIpLHIub2xkPXIuY29tcGxldGUsci5jb21wbGV0ZT1mdW5jdGlvbigpe3guaXNGdW5jdGlvbihyLm9sZCkmJnIub2xkLmNhbGwodGhpcyksci5xdWV1ZSYmeC5kZXF1ZXVlKHRoaXMsci5xdWV1ZSl9LHJ9LHguZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHN3aW5nOmZ1bmN0aW9uKGUpe3JldHVybi41LU1hdGguY29zKGUqTWF0aC5QSSkvMn19LHgudGltZXJzPVtdLHguZng9cnIucHJvdG90eXBlLmluaXQseC5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGUsbj14LnRpbWVycyxyPTA7Zm9yKFhuPXgubm93KCk7bi5sZW5ndGg+cjtyKyspZT1uW3JdLGUoKXx8bltyXSE9PWV8fG4uc3BsaWNlKHItLSwxKTtuLmxlbmd0aHx8eC5meC5zdG9wKCksWG49dH0seC5meC50aW1lcj1mdW5jdGlvbihlKXtlKCkmJngudGltZXJzLnB1c2goZSkmJnguZnguc3RhcnQoKX0seC5meC5pbnRlcnZhbD0xMyx4LmZ4LnN0YXJ0PWZ1bmN0aW9uKCl7VW58fChVbj1zZXRJbnRlcnZhbCh4LmZ4LnRpY2sseC5meC5pbnRlcnZhbCkpfSx4LmZ4LnN0b3A9ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKFVuKSxVbj1udWxsfSx4LmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSx4LmZ4LnN0ZXA9e30seC5leHByJiZ4LmV4cHIuZmlsdGVycyYmKHguZXhwci5maWx0ZXJzLmFuaW1hdGVkPWZ1bmN0aW9uKGUpe3JldHVybiB4LmdyZXAoeC50aW1lcnMsZnVuY3Rpb24odCl7cmV0dXJuIGU9PT10LmVsZW19KS5sZW5ndGh9KSx4LmZuLm9mZnNldD1mdW5jdGlvbihlKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBlPT09dD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbih0KXt4Lm9mZnNldC5zZXRPZmZzZXQodGhpcyxlLHQpfSk7dmFyIG4scixvPXt0b3A6MCxsZWZ0OjB9LGE9dGhpc1swXSxzPWEmJmEub3duZXJEb2N1bWVudDtpZihzKXJldHVybiBuPXMuZG9jdW1lbnRFbGVtZW50LHguY29udGFpbnMobixhKT8odHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0IT09aSYmKG89YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSkscj1vcihzKSx7dG9wOm8udG9wKyhyLnBhZ2VZT2Zmc2V0fHxuLnNjcm9sbFRvcCktKG4uY2xpZW50VG9wfHwwKSxsZWZ0Om8ubGVmdCsoci5wYWdlWE9mZnNldHx8bi5zY3JvbGxMZWZ0KS0obi5jbGllbnRMZWZ0fHwwKX0pOm99LHgub2Zmc2V0PXtzZXRPZmZzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXguY3NzKGUsInBvc2l0aW9uIik7InN0YXRpYyI9PT1yJiYoZS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKTt2YXIgaT14KGUpLG89aS5vZmZzZXQoKSxhPXguY3NzKGUsInRvcCIpLHM9eC5jc3MoZSwibGVmdCIpLGw9KCJhYnNvbHV0ZSI9PT1yfHwiZml4ZWQiPT09cikmJnguaW5BcnJheSgiYXV0byIsW2Esc10pPi0xLHU9e30sYz17fSxwLGY7bD8oYz1pLnBvc2l0aW9uKCkscD1jLnRvcCxmPWMubGVmdCk6KHA9cGFyc2VGbG9hdChhKXx8MCxmPXBhcnNlRmxvYXQocyl8fDApLHguaXNGdW5jdGlvbih0KSYmKHQ9dC5jYWxsKGUsbixvKSksbnVsbCE9dC50b3AmJih1LnRvcD10LnRvcC1vLnRvcCtwKSxudWxsIT10LmxlZnQmJih1LmxlZnQ9dC5sZWZ0LW8ubGVmdCtmKSwidXNpbmciaW4gdD90LnVzaW5nLmNhbGwoZSx1KTppLmNzcyh1KX19LHguZm4uZXh0ZW5kKHtwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciBlLHQsbj17dG9wOjAsbGVmdDowfSxyPXRoaXNbMF07cmV0dXJuImZpeGVkIj09PXguY3NzKHIsInBvc2l0aW9uIik/dD1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOihlPXRoaXMub2Zmc2V0UGFyZW50KCksdD10aGlzLm9mZnNldCgpLHgubm9kZU5hbWUoZVswXSwiaHRtbCIpfHwobj1lLm9mZnNldCgpKSxuLnRvcCs9eC5jc3MoZVswXSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxuLmxlZnQrPXguY3NzKGVbMF0sImJvcmRlckxlZnRXaWR0aCIsITApKSx7dG9wOnQudG9wLW4udG9wLXguY3NzKHIsIm1hcmdpblRvcCIsITApLGxlZnQ6dC5sZWZ0LW4ubGVmdC14LmNzcyhyLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vZmZzZXRQYXJlbnR8fHM7d2hpbGUoZSYmIXgubm9kZU5hbWUoZSwiaHRtbCIpJiYic3RhdGljIj09PXguY3NzKGUsInBvc2l0aW9uIikpZT1lLm9mZnNldFBhcmVudDtyZXR1cm4gZXx8c30pfX0pLHguZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbihlLG4pe3ZhciByPS9ZLy50ZXN0KG4pO3guZm5bZV09ZnVuY3Rpb24oaSl7cmV0dXJuIHguYWNjZXNzKHRoaXMsZnVuY3Rpb24oZSxpLG8pe3ZhciBhPW9yKGUpO3JldHVybiBvPT09dD9hP24gaW4gYT9hW25dOmEuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W2ldOmVbaV06KGE/YS5zY3JvbGxUbyhyP3goYSkuc2Nyb2xsTGVmdCgpOm8scj9vOngoYSkuc2Nyb2xsVG9wKCkpOmVbaV09byx0KX0sZSxpLGFyZ3VtZW50cy5sZW5ndGgsbnVsbCl9fSk7ZnVuY3Rpb24gb3IoZSl7cmV0dXJuIHguaXNXaW5kb3coZSk/ZTo5PT09ZS5ub2RlVHlwZT9lLmRlZmF1bHRWaWV3fHxlLnBhcmVudFdpbmRvdzohMX14LmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihlLG4pe3guZWFjaCh7cGFkZGluZzoiaW5uZXIiK2UsY29udGVudDpuLCIiOiJvdXRlciIrZX0sZnVuY3Rpb24ocixpKXt4LmZuW2ldPWZ1bmN0aW9uKGksbyl7dmFyIGE9YXJndW1lbnRzLmxlbmd0aCYmKHJ8fCJib29sZWFuIiE9dHlwZW9mIGkpLHM9cnx8KGk9PT0hMHx8bz09PSEwPyJtYXJnaW4iOiJib3JkZXIiKTtyZXR1cm4geC5hY2Nlc3ModGhpcyxmdW5jdGlvbihuLHIsaSl7dmFyIG87cmV0dXJuIHguaXNXaW5kb3cobik/bi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrZV06OT09PW4ubm9kZVR5cGU/KG89bi5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgobi5ib2R5WyJzY3JvbGwiK2VdLG9bInNjcm9sbCIrZV0sbi5ib2R5WyJvZmZzZXQiK2VdLG9bIm9mZnNldCIrZV0sb1siY2xpZW50IitlXSkpOmk9PT10P3guY3NzKG4scixzKTp4LnN0eWxlKG4scixpLHMpfSxuLGE/aTp0LGEsbnVsbCl9fSl9KSx4LmZuLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LHguZm4uYW5kU2VsZj14LmZuLmFkZEJhY2ssIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz14OihlLmpRdWVyeT1lLiQ9eCwiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoImpxdWVyeSIsW10sZnVuY3Rpb24oKXtyZXR1cm4geH0pKX0pKHdpbmRvdyk7CgpmdW5jdGlvbiB0X29uUmVhZHkodCl7ImxvYWRpbmciIT1kb2N1bWVudC5yZWFkeVN0YXRlP3QoKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIix0KX1mdW5jdGlvbiB0X2FkZENsYXNzKHQsZSl7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3Q/dC5jbGFzc0xpc3QuYWRkKGUpOnQuY2xhc3NOYW1lKz0odC5jbGFzc05hbWU/IiAiOiIiKStlfWZ1bmN0aW9uIHRfcmVtb3ZlQ2xhc3ModCxlKXtkb2N1bWVudC5ib2R5LmNsYXNzTGlzdD90LmNsYXNzTGlzdC5yZW1vdmUoZSk6dC5jbGFzc05hbWU9dC5jbGFzc05hbWUucmVwbGFjZShuZXcgUmVnRXhwKCIoXnxcXHMrKSIrZSsiKFxccyt8JCkiKSwiICIpLnJlcGxhY2UoL15ccysvLCIiKS5yZXBsYWNlKC9ccyskLywiIil9ZnVuY3Rpb24gdF9yZW1vdmVFbCh0KXt0JiZ0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KX1mdW5jdGlvbiB0X291dGVyV2lkdGgodCl7dmFyIGU9Z2V0Q29tcHV0ZWRTdHlsZSh0KSxuPWUud2lkdGgsbz1lLm1hcmdpbkxlZnQsaT1lLm1hcmdpblJpZ2h0O3JldHVybiJhdXRvIj09PW4mJihuPTApLCJhdXRvIj09PW8mJihvPTApLCJhdXRvIj09PWkmJihpPTApLG49cGFyc2VJbnQobikrcGFyc2VJbnQobykrcGFyc2VJbnQoaSl9dmFyIHZlcnNpb24sdmVyc2lvbjsod2luZG93LmlzU2VhcmNoQm90PSExLC9Cb3QvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYod2luZG93LmlzU2VhcmNoQm90PSEwKSx3aW5kb3cuaXNNb2JpbGU9ITEsd2luZG93LiRpc01vYmlsZT0hMSwvQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJih3aW5kb3cuaXNNb2JpbGU9ITAsd2luZG93LiRpc01vYmlsZT0hMCksd2luZG93LmlzVGFibGV0PS8oaXBhZHx0YWJsZXR8KGFuZHJvaWQoPyEuKm1vYmlsZSkpfCh3aW5kb3dzKD8hLipwaG9uZSkoLip0b3VjaCkpfGtpbmRsZXxwbGF5Ym9va3xzaWxrfChwdWZmaW4oPyEuKihJUHxBUHxXUCkpKSkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHdpbmRvdy5pc2lPUz0hMSwvaVBob25lfGlQYWR8aVBvZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJih3aW5kb3cuaXNpT1M9ITApLHdpbmRvdy5pc2lPU0Nocm9tZT0hIW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goIkNyaU9TIiksd2luZG93LmlzRmlyZWZveD0vZmlyZWZveC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksd2luZG93LmlzT3BlcmE9ISF3aW5kb3cub3ByJiYhIXdpbmRvdy5vcHIuYWRkb25zfHwhIXdpbmRvdy5vcGVyYXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCIgT1BSLyIpPj0wLHdpbmRvdy5pc2lPU1ZlcnNpb249IiIsd2luZG93LmlzaU9TKSYmKG51bGwhPT0odmVyc2lvbj1uYXZpZ2F0b3IuYXBwVmVyc2lvbi5tYXRjaCgvT1MgKFxkKylfKFxkKylfPyhcZCspPy8pKSYmKHdpbmRvdy5pc2lPU1ZlcnNpb249W3BhcnNlSW50KHZlcnNpb25bMV0sMTApLHBhcnNlSW50KHZlcnNpb25bMl0sMTApLHBhcnNlSW50KHZlcnNpb25bM118fDAsMTApXSkpOyh3aW5kb3cuaXNTYWZhcmk9ITEsL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKHdpbmRvdy5pc1NhZmFyaT0hMCksd2luZG93LmlzSUU9ISFkb2N1bWVudC5kb2N1bWVudE1vZGUsd2luZG93LmlzU2FmYXJpVmVyc2lvbj0iIix3aW5kb3cuaXNTYWZhcmkpJiYobnVsbCE9PSh2ZXJzaW9uPW5hdmlnYXRvci5hcHBWZXJzaW9uLm1hdGNoKC9WZXJzaW9uXC8oXGQrKVwuKFxkKylcLj8oXGQrKT8gU2FmYXJpLykpJiYod2luZG93LmlzU2FmYXJpVmVyc2lvbj1bcGFyc2VJbnQodmVyc2lvblsxXSwxMCkscGFyc2VJbnQodmVyc2lvblsyXSwxMCkscGFyc2VJbnQodmVyc2lvblszXXx8MCwxMCldKSk7ZnVuY3Rpb24gdF90aHJvdHRsZSh0LGUsbil7dmFyIG8saTtyZXR1cm4gZXx8KGU9MjUwKSxmdW5jdGlvbigpe3ZhciByPW58fHRoaXMsYT0rbmV3IERhdGUsbD1hcmd1bWVudHM7byYmYTxvK2U/KGNsZWFyVGltZW91dChpKSxpPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bz1hLHQuYXBwbHkocixsKX0pLGUpKToobz1hLHQuYXBwbHkocixsKSl9fWZ1bmN0aW9uIHRfZGVib3VuY2UodCxlLG4pe3ZhciBvO3JldHVybiBlfHwoZT0yNTApLGZ1bmN0aW9uKCl7dmFyIGk9bnx8dGhpcyxyPWFyZ3VtZW50cztjbGVhclRpbWVvdXQobyksbz1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuYXBwbHkoaSxyKX0pLGUpfX1mdW5jdGlvbiB0X29uRnVuY0xvYWQodCxlLG4pe3ZhciBvPTE1ZTMsaT10X2NoZWNrSXNFZGl0TW9kZSgpLHI9ZnVuY3Rpb24gdCgpe3JldHVybiFpfHxpJiZ0X2NoZWNrRWRpdG9ySXNSZWFkeSgpfSxhPWZ1bmN0aW9uIHQoZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvd1tlXXx8Im9iamVjdCI9PXR5cGVvZiB3aW5kb3dbZV19O2lmKGEodCkmJnIoKSllKCk7ZWxzZXt2YXIgbD1EYXRlLm5vdygpLGQ9bmV3IEVycm9yKHQrIiBpcyB1bmRlZmluZWQiKSxzPWZ1bmN0aW9uIHQoKXt0aHJvdyBkfTtzZXRUaW1lb3V0KChmdW5jdGlvbiBpKCl7dmFyIGQ9RGF0ZS5ub3coKTthKHQpJiZyKCk/ZSgpOigiY29tcGxldGUiPT09ZG9jdW1lbnQucmVhZHlTdGF0ZSYmZC1sPm8mJiFhKHQpJiZzKCksc2V0VGltZW91dChpLG58fDEwMCkpfSkpfX1mdW5jdGlvbiB0X2NoZWNrSXNFZGl0TW9kZSgpe3ZhciB0PSExLGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKTtpZighZSlyZXR1cm4hMTt2YXIgbj1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tb2RlIik7cmV0dXJuISEodD1uJiYiZWRpdCI9PT1uKX1mdW5jdGlvbiB0X2NoZWNrRWRpdG9ySXNSZWFkeSgpe3ZhciB0PSExO2lmKCF0X2NoZWNrSXNFZGl0TW9kZSgpKXJldHVybiExO3ZhciBlPWRvY3VtZW50LmJvZHkuZ2V0QXR0cmlidXRlKCJkYXRhLXJlYWR5LXN0YXR1cyIpO3JldHVybiEhKHQ9ZSYmInJlYWR5Ij09PWUpfWZ1bmN0aW9uIHRfc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcl9fc2V0T2JqZWN0KCl7d2luZG93LnNjcm9sbEJhcldpZHRoQ29tcGVuc2F0b3I9e307dmFyIHQ9d2luZG93LnNjcm9sbEJhcldpZHRoQ29tcGVuc2F0b3I7dC5pc0luaXRlZD0hMSx0LnNjcm9sbEJhcldpZHRoPU1hdGguYWJzKHdpbmRvdy5pbm5lcldpZHRoLWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCksdC5kZWxheT0wLHQuY2FuY2VsVGltZW91dD1udWxsO3ZhciBlPVsidDQ1MCIsInQyODJfX2NvbnRhaW5lciIsInQyODJfX2NvbnRhaW5lcl9fYmdfb3BlbmVkIiwidDI4Ml9fbWVudV9fY29udGFpbmVyIiwidDgzMG0iLCJ0ODMwX19wYW5lbCIsInQ0NTFtIiwidDIwNF9fbWVudSIsInRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIiLCJ0LW1lbnUtcG9wb3Zlcl9fYnVyZ2VybWVudV9fc2lkZWJhcl9yaWdodCIsInQtbWVudS1wb3BvdmVyX2Z1bGxzY3JlZW4iXSxuPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIioiKTtuPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChuLChmdW5jdGlvbih0KXtyZXR1cm4hdC5jbG9zZXN0KCIudDEwOTMiKSYmIWUuc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKGUpfSkpfSkpLHQuZml4ZWRFbGVtZW50cz1bXSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG4sKGZ1bmN0aW9uKGUpe2lmKCFlLmNsYXNzTGlzdC5jb250YWlucygidDk3NSIpKXt2YXIgbj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKSxvPW4uZ2V0UHJvcGVydHlWYWx1ZSgicG9zaXRpb24iKSxpPXRfc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcl9fY2hlY2tTaXplKG4sdC5zY3JvbGxCYXJXaWR0aCkscj1pLmlzRnVsbHNjcmVlbldpZHRoLGE9aS5pc0Z1bGxzY3JlZW5IZWlnaHQ7KCJmaXhlZCI9PT1vfHwiYWJzb2x1dGUiPT09byYmciYmIWEpJiZ0LmZpeGVkRWxlbWVudHMucHVzaCh7ZWw6ZSxjb21wdXRlZFN0eWxlOm59KX19KSl9ZnVuY3Rpb24gdF9zY3JvbGxCYXJXaWR0aENvbXBlbnNhdG9yX19pbml0KCl7aWYoIXdpbmRvdy5pc01vYmlsZSYmIXRfY2hlY2tJc0VkaXRNb2RlKCkpe3dpbmRvdy5zY3JvbGxCYXJXaWR0aENvbXBlbnNhdG9yfHx0X3Njcm9sbEJhcldpZHRoQ29tcGVuc2F0b3JfX3NldE9iamVjdCgpO3ZhciB0PXdpbmRvdy5zY3JvbGxCYXJXaWR0aENvbXBlbnNhdG9yO2lmKHQuc2Nyb2xsQmFyV2lkdGg9TWF0aC5hYnMod2luZG93LmlubmVyV2lkdGgtZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSx0LmNhbmNlbFRpbWVvdXQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHQuY2FuY2VsVGltZW91dCksdC5jYW5jZWxUaW1lb3V0PW51bGwpLCF0LmlzSW5pdGVkJiZ0LnNjcm9sbEJhcldpZHRoKXt0LmlzSW5pdGVkPSEwO3ZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmdldFByb3BlcnR5VmFsdWUoInBhZGRpbmctcmlnaHQiKTtlPXBhcnNlSW50KGUucmVwbGFjZSgicHgiLCIiKSwxMCk7dmFyIG49ZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ7biYmZG9jdW1lbnQuYm9keS5zZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtaW5pdGlhbC1wYWRkaW5nLXJpZ2h0IixuKSxkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD10LnNjcm9sbEJhcldpZHRoK2UrInB4Iixkb2N1bWVudC5ib2R5LnN0eWxlLmhlaWdodD0iMTAwdmgiLGRvY3VtZW50LmJvZHkuc3R5bGUubWluSGVpZ2h0PSIxMDB2aCIsZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIjt2YXIgbz1bXTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQuZml4ZWRFbGVtZW50cywoZnVuY3Rpb24oZSl7dmFyIG49ZS5lbDtpZihkb2N1bWVudC5ib2R5LmNvbnRhaW5zKG4pJiYhbi5jbGFzc0xpc3QuY29udGFpbnMoInQ5NzUiKSYmIW4uY2xhc3NMaXN0LmNvbnRhaW5zKCJ0OTc1Iikpe3ZhciBpPW4uY2xvc2VzdCgiLnIiKSxyPWUuY29tcHV0ZWRTdHlsZSxhPXIuZ2V0UHJvcGVydHlWYWx1ZSgicG9zaXRpb24iKTtpZigiZml4ZWQiPT09YXx8ImFic29sdXRlIj09PWEpe3ZhciBsPXIuZ2V0UHJvcGVydHlWYWx1ZSgidHJhbnNpdGlvbi1kdXJhdGlvbiIpO2wuaW5kZXhPZigibXMiKSsxPyhsPXBhcnNlSW50KGwucmVwbGFjZSgibXMiLCIiKSwxMCksby5wdXNoKGwpKTpsLmluZGV4T2YoInMiKSsxJiYobD0xZTMqcGFyc2VGbG9hdChsLnJlcGxhY2UoInMiLCIiKSksby5wdXNoKGwpKTt2YXIgZD1yLmdldFByb3BlcnR5VmFsdWUoInJpZ2h0Iik7ZD1wYXJzZUludChkLnJlcGxhY2UoInB4IiwiIiksMTApO3ZhciBzPW4uc3R5bGUucmlnaHQ7cyYmbi5zZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtaW5pdGlhbC1yaWdodCIscyk7dmFyIGM9bi5zdHlsZS53aWR0aDtjJiZuLnNldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1pbml0aWFsLXdpZHRoIixjKTt2YXIgdT1pJiZwYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUoaSkuZ2V0UHJvcGVydHlWYWx1ZSgiem9vbSIpKXx8MSxtPXQuc2Nyb2xsQmFyV2lkdGgvdSxwPXRfc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcl9fY2hlY2tTaXplKHIsdC5zY3JvbGxCYXJXaWR0aCksaD1wLmlzRnVsbHNjcmVlbldpZHRoLGY9cC5pc0Z1bGxzY3JlZW5IZWlnaHQsZz1wLmNvbXB1dGVkTWFyZ2luTnVtO2g9aHx8bi5jbGFzc0xpc3QuY29udGFpbnMoInQtbWVudS1wb3BvdmVyX2Z1bGx3aWR0aCIpfHxuLmNsYXNzTGlzdC5jb250YWlucygidC1tZW51LXBvcG92ZXIiKSYmdT4xLCFkJiYwIT09ZHx8ImF1dG8iPT09bi5zdHlsZS5yaWdodHx8ImFic29sdXRlIj09PWF8fGg/aCYmIWYmJihuLnN0eWxlLndpZHRoPSJjYWxjKDEwMHZ3IC8gIisod2luZG93LmlzU2FmYXJpPzE6dSkrIiAtICIrZysicHggLSAiK20rInB4KSIpOm4uc3R5bGUucmlnaHQ9bStkKyJweCJ9fX0pKSxvLmxlbmd0aCYmKHQuZGVsYXk9TWF0aC5tYXguYXBwbHkobnVsbCxvKSl9fX1mdW5jdGlvbiB0X3Njcm9sbEJhcldpZHRoQ29tcGVuc2F0b3JfX2NoZWNrU2l6ZSh0LGUpe3ZhciBuPXdpbmRvdyxvPW4uaW5uZXJXaWR0aCxpPW4uaW5uZXJIZWlnaHQscj10LmdldFByb3BlcnR5VmFsdWUoIndpZHRoIiksYT1wYXJzZUZsb2F0KHIpfHwwLGw9dC5nZXRQcm9wZXJ0eVZhbHVlKCJoZWlnaHQiKSxkPXBhcnNlRmxvYXQobCl8fDAscz10LmdldFByb3BlcnR5VmFsdWUoIm1hcmdpbi1sZWZ0IiksYz1wYXJzZUZsb2F0KHMpfHwwLHU9dC5nZXRQcm9wZXJ0eVZhbHVlKCJtYXJnaW4tcmlnaHQiKSxtLHA9YysocGFyc2VGbG9hdCh1KXx8MCksaCxmO3JldHVybntpc0Z1bGxzY3JlZW5XaWR0aDoiMTAwJSI9PT1yfHwiMTAwdnciPT09cnx8YT09PW98fGE9PT1vLWV8fGE9PT1vLXB8fGE9PT1vLXAtZSxpc0Z1bGxzY3JlZW5IZWlnaHQ6IjEwMCUiPT09bHx8IjEwMHZoIj09PWx8fCJhdXRvIj09PWx8fGQ9PT1pfHxkPT09aS1lLGNvbXB1dGVkTWFyZ2luTnVtOnB9fWZ1bmN0aW9uIHRfc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcl9fY2FuY2VsKCl7dmFyIHQ9d2luZG93LnNjcm9sbEJhcldpZHRoQ29tcGVuc2F0b3I7dCYmdC5pc0luaXRlZCYmKHQuaXNJbml0ZWQ9ITEsdC5kZWxheT0wLGRvY3VtZW50LmJvZHkuaGFzQXR0cmlidXRlKCJkYXRhLXRpbGRhLWluaXRpYWwtcGFkZGluZy1yaWdodCIpPyhkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD1kb2N1bWVudC5ib2R5LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1pbml0aWFsLXBhZGRpbmctcmlnaHQiKSxkb2N1bWVudC5ib2R5LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS10aWxkYS1pbml0aWFsLXBhZGRpbmctcmlnaHQiKSk6ZG9jdW1lbnQuYm9keS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgicGFkZGluZy1yaWdodCIpLGRvY3VtZW50LmJvZHkuc3R5bGUucmVtb3ZlUHJvcGVydHkoImhlaWdodCIpLGRvY3VtZW50LmJvZHkuc3R5bGUucmVtb3ZlUHJvcGVydHkoIm1pbi1oZWlnaHQiKSxkb2N1bWVudC5ib2R5LnN0eWxlLnJlbW92ZVByb3BlcnR5KCJvdmVyZmxvdyIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodC5maXhlZEVsZW1lbnRzLChmdW5jdGlvbih0KXt2YXIgZT10LmVsLG49ZS5jbGFzc0xpc3QuY29udGFpbnMoInRuLWF0b21fX3N0aWNreS13cmFwcGVyIil8fGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIik7ZS5oYXNBdHRyaWJ1dGUoImRhdGEtdGlsZGEtaW5pdGlhbC1yaWdodCIpPyhlLnN0eWxlLnJpZ2h0PWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWluaXRpYWwtcmlnaHQiKSxlLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS10aWxkYS1pbml0aWFsLXJpZ2h0IikpOmUuc3R5bGUucmVtb3ZlUHJvcGVydHkoInJpZ2h0IiksZS5oYXNBdHRyaWJ1dGUoImRhdGEtdGlsZGEtaW5pdGlhbC13aWR0aCIpPyhlLnN0eWxlLndpZHRoPWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWluaXRpYWwtd2lkdGgiKSxlLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS10aWxkYS1pbml0aWFsLXdpZHRoIikpOihlLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJ3aWR0aCIpLG4mJihlLnN0eWxlLndpZHRoPSJpbmhlcml0IikpfSkpKX1mdW5jdGlvbiB0X3RyaWdnZXJFdmVudCh0LGUpe3ZhciBuO2RvY3VtZW50LmNyZWF0ZUV2ZW50PyhuPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJIVE1MRXZlbnRzIikpLmluaXRFdmVudChlLCEwLCExKTpkb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCYmKChuPWRvY3VtZW50LmNyZWF0ZUV2ZW50T2JqZWN0KCkpLmV2ZW50VHlwZT1lKSxuLmV2ZW50TmFtZT1lLHQuZGlzcGF0Y2hFdmVudD90LmRpc3BhdGNoRXZlbnQobik6dC5maXJlRXZlbnQ/dC5maXJlRXZlbnQoIm9uIituLmV2ZW50VHlwZSxuKTp0W2VdP3RbZV0oKTp0WyJvbiIrZV0mJnRbIm9uIitlXSgpfWZ1bmN0aW9uIHRfZ2V0Um9vdFpvbmUoKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLGU7cmV0dXJuIHQmJnQuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLXJvb3Qtem9uZSIpfHwiY29tIn1mdW5jdGlvbiB0X21vZGlmeVJvb3Rab25lKHQpe3JldHVybiB0JiZ0LmluY2x1ZGVzKCJzdGF0aWMudGlsZGFjZG4uY29tIik/dC5yZXBsYWNlKCJzdGF0aWMudGlsZGFjZG4uY29tIiwic3RhdGljLnRpbGRhY2RuLiIrdF9nZXRSb290Wm9uZSgpKTp0fWZ1bmN0aW9uIHRfbG9hZEpzRmlsZSh0LGUsbil7dm9pZCAwPT09biYmKG49MCk7dmFyIG89MyxpPTFlMyxyPXRfbW9kaWZ5Um9vdFpvbmUodCk7aWYoZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3NyY149IicrcisnIl0nKSllJiZlKCk7ZWxzZXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnR5cGU9InRleHQvamF2YXNjcmlwdCIsYS5zcmM9cixlJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe2UoKX0pKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwoZnVuY3Rpb24odCl7aWYoIShuPD0zKSl7dmFyIG89dC5tZXNzYWdlfHwiPG5vIGVycm9yIG1lc3NhZ2U+Ijt0aHJvdyBuZXcgRXJyb3IoIkZhaWxlZCB0byBsb2FkICIrcisiIHNjcmlwdDogIitvLHtjYXVzZTp0fSl9c2V0VGltZW91dCgoZnVuY3Rpb24oKXthLnJlbW92ZSgpLHRfbG9hZEpzRmlsZShyLGUsbisxKSxjb25zb2xlLndhcm4oIlJldHJ5aW5nIHRvIGxvYWQgIityKyIuIFJldHJ5OiAiKyhuKzEpKX0pLG4qaSl9KSksZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChhKX19ZnVuY3Rpb24gdF9sb2FkQ1NTRmlsZSh0LGUsbil7dm9pZCAwPT09biYmKG49MCk7dmFyIG89MyxpPTFlMyxyPXRfbW9kaWZ5Um9vdFpvbmUodCk7aWYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbGlua1tocmVmXj0iJytyKyciXScpKWUmJmUoKTtlbHNle3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKTthLnJlbD0ic3R5bGVzaGVldCIsYS50eXBlPSJ0ZXh0L2NzcyIsYS5tZWRpYT0iYWxsIixhLmhyZWY9cixhLmNyb3NzT3JpZ2luPSJhbm9ueW1vdXMiLGUmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsKGZ1bmN0aW9uKHQpe2lmKCEobjw9Mykpe3ZhciBvPXQubWVzc2FnZXx8IjxubyBlcnJvciBtZXNzYWdlPiI7dGhyb3cgbmV3IEVycm9yKCJGYWlsZWQgdG8gbG9hZCAiK3IrIiBzdHlsZTogIitvLHtjYXVzZTp0fSl9c2V0VGltZW91dCgoZnVuY3Rpb24oKXthLnJlbW92ZSgpLHRfbG9hZENTU0ZpbGUocixlLG4rMSksY29uc29sZS53YXJuKCJSZXRyeWluZyB0byBsb2FkICIrcisiLiBSZXRyeTogIisobisxKSl9KSxuKmkpfSkpLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYSl9fWZ1bmN0aW9uIHRfc2Nyb2xsVG8odCxlKXtpZih0KXt2YXIgbj1lfHx7fSxvPW4udXNlTmF0aXZlU2Nyb2xsVG8saT1uLmR1cmF0aW9uLHI9bi5iZWhhdmlvcixhPXZvaWQgMD09PXI/Imluc3RhbnQiOnIsbD1uLm9mZnNldCxkPXZvaWQgMD09PWw/MDpsLHM9TWF0aC5tYXgocGFyc2VJbnQodC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnNjcm9sbFktZCwxMCksMCk7b3x8Imluc3RhbnQiPT09YT93aW5kb3cuc2Nyb2xsVG8oe2xlZnQ6MCx0b3A6cyxiZWhhdmlvcjphfSk6dF9zbW9vdGhTY3JvbGxUbyhzLGkpfX1mdW5jdGlvbiB0X3Ntb290aFNjcm9sbFRvKHQsZSl7dm9pZCAwPT09ZSYmKGU9NTAwKTt2YXIgbj1kb2N1bWVudC5ib2R5LG89d2luZG93LnNjcm9sbFl8fHdpbmRvdy5wYWdlWU9mZnNldCxpPXQtbyxyPXBlcmZvcm1hbmNlLm5vdygpO2Z1bmN0aW9uIGEodCl7cmV0dXJuIE1hdGgucG93KHQsMil9ZnVuY3Rpb24gbCgpe3ZhciBkPXBlcmZvcm1hbmNlLm5vdygpLHM9TWF0aC5taW4oKGQtcikvZSwxKSxjPWEocyk7d2luZG93LnNjcm9sbFRvKDAsbytpKmMpLHM8MT9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobCk6KG4ucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXNjcm9sbCIpLG4ucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXNjcm9sbGFibGUiKSx3aW5kb3cuc2Nyb2xsVG8oMCx0KSl9bi5zZXRBdHRyaWJ1dGUoImRhdGEtc2Nyb2xsIiwidHJ1ZSIpLG4uc2V0QXR0cmlidXRlKCJkYXRhLXNjcm9sbGFibGUiLCJ0cnVlIikscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGwpfXdpbmRvdy5icm93c2VyTGFuZz0od2luZG93Lm5hdmlnYXRvci51c2VyTGFuZ3VhZ2V8fHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2UpLnRvVXBwZXJDYXNlKCkuc2xpY2UoMCwyKSx3aW5kb3cudGlsZGFCcm93c2VyTGFuZz13aW5kb3cuYnJvd3NlckxhbmcsdF9vblJlYWR5KChmdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIik7aWYodCl2YXIgZT10LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1wcm9qZWN0LWxhbmciKTtlJiYod2luZG93LmJyb3dzZXJMYW5nPWUpfSkpLHRfb25SZWFkeSgoZnVuY3Rpb24oKXt2YXIgdD13aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCxlPS0xIT09dC5pbmRleE9mKCJJbnN0YWdyYW0iKSxuPS0xIT09dC5pbmRleE9mKCJGQkFWIiksbz0tMSE9PXQuaW5kZXhPZigiWWFTZWFyY2hCcm93c2VyIiksaT0tMSE9PXQuaW5kZXhPZigiU2Ftc3VuZ0Jyb3dzZXIiKSxyPS0xIT09dC5pbmRleE9mKCJEdWNrRHVja0dvIiksYTtpZigtMSE9PXQuaW5kZXhPZigiQW5kcm9pZCIpJiYobnx8ZXx8b3x8aXx8cikpe3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInAiKTtsLnN0eWxlLmxpbmVIZWlnaHQ9IjEwMHB4IixsLnN0eWxlLnBhZGRpbmc9IjAiLGwuc3R5bGUubWFyZ2luPSIwIixsLnN0eWxlLmhlaWdodD0iYXV0byIsbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUub3BhY2l0eT0iMC4wMDEiLGwuaW5uZXJUZXh0PSJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIixkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpO3ZhciBkPTEwMC9sLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobCksZDwuOTgmJmRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLCc8c3R5bGU+LnQzOTYgW2RhdGEtZWxlbS10eXBlPSJ0ZXh0Il0gLnRuLWF0b20ge3pvb206ICcrMTAwKmQrIiU7fTwvc3R5bGU+Iil9d2luZG93LmlzaU9TJiYhd2luZG93Lk1TU3RyZWFtJiYoZG9jdW1lbnQuYm9keS5zdHlsZS5zZXRQcm9wZXJ0eSgiLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0IiwiMTAwJSIpLGRvY3VtZW50LmJvZHkuc3R5bGUuc2V0UHJvcGVydHkoInRleHQtc2l6ZS1hZGp1c3QiLCIxMDAlIikpfSkpLHRfb25SZWFkeSgoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImh0bWwiKSxlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXRpbGRhbGFiZWwiKSxuPXQub2Zmc2V0SGVpZ2h0O2lmKGRvY3VtZW50LmJvZHkmJihuPU1hdGgubWF4KGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0LGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0LGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0LHQub2Zmc2V0SGVpZ2h0KSksKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0aWxkYWNvcHkiKXx8ZSkmJmUucXVlcnlTZWxlY3RvckFsbCgiZGl2Iikpbis3MD53aW5kb3cuaW5uZXJIZWlnaHQmJmUmJmUuc2V0QXR0cmlidXRlKCJzdHlsZSIsImRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7IHZpc2liaWxpdHk6IHZpc2libGUgIWltcG9ydGFudDsgcG9zaXRpb246IHJlbGF0aXZlICFpbXBvcnRhbnQ7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IHBvaW50ZXItZXZlbnRzOiBhbGwgIWltcG9ydGFudDsgb3BhY2l0eTogMSAhaW1wb3J0YW50OyBtYXJnaW46IDAgIWltcG9ydGFudDsgei1pbmRleDogMSAhaW1wb3J0YW50Iik7ZWxzZXtmb3IodmFyIG89ZG9jdW1lbnQuYm9keS5jaGlsZE5vZGVzLGk9W10scj0wO3I8by5sZW5ndGg7cisrKXt2YXIgYT1vW3JdOzg9PT1hLm5vZGVUeXBlJiZpLnB1c2goYSl9Zm9yKHZhciByPTA7cjxpLmxlbmd0aDtyKyspLTEhPT1pW3JdLm5vZGVWYWx1ZS5pbmRleE9mKCIndCByZW1vdmUgdGhpcyBsIikmJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJhZnRlcmVuZCIsJzxkaXYgY2xhc3M9InQtdGlsZGFsYWJlbCB0LXRpbGRhbGFiZWwtZnJlZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7IHZpc2liaWxpdHk6IHZpc2libGUgIWltcG9ydGFudDsgcG9zaXRpb246IHJlbGF0aXZlICFpbXBvcnRhbnQ7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IHBvaW50ZXItZXZlbnRzOiBhbGwgIWltcG9ydGFudDsgb3BhY2l0eTogMSAhaW1wb3J0YW50OyBtYXJnaW46IDAgIWltcG9ydGFudDsgei1pbmRleDogOTk5MDAgIWltcG9ydGFudCI+PGRpdiBjbGFzcz0idC10aWxkYWxhYmVsLWZyZWVfX21haW4iPjxhIGhyZWY9Imh0dHBzOi8vdGlsZGEuY2MiIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0icGFkZGluZy1ib3R0b206MTJweDsgZGlzcGxheTogYmxvY2s7Ij48aW1nIHN0eWxlPSJ3aWR0aDo0MHB4OyIgc3JjPSJodHRwczovL3N0YXRpYy50aWxkYWNkbi4nK3RfZ2V0Um9vdFpvbmUoKSsnL2ltZy90aWxkYWNvcHkucG5nIj48L2E+PGRpdiBzdHlsZT0icGFkZGluZy1ib3R0b206IDE1cHg7Ij5UaGlzIHNpdGUgd2FzIG1hZGUgb24gPGEgaHJlZj0iaHR0cHM6Ly90aWxkYS5jYyIgdGFyZ2V0PSJfYmxhbmsiIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246IG5vbmU7IGNvbG9yOmluaGVyaXQ7Ij5UaWxkYSDigJQgYSB3ZWJzaXRlIGJ1aWxkZXI8L2E+IHRoYXQgaGVscHMgdG8mbmJzcDtjcmVhdGUgYSZuYnNwO3dlYnNpdGUgd2l0aG91dCBhbnkgY29kZTwvZGl2PjxhIGhyZWY9Imh0dHBzOi8vdGlsZGEuY2MvcmVnaXN0cmF0aW9uLyIgdGFyZ2V0PSJfYmxhbmsiIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmc6IDEwcHggMjBweDsgZm9udC1zaXplOiAxM3B4OyBib3JkZXItcmFkaXVzOiA1MHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmE4NjY5OyBjb2xvcjogI2ZmZjsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyI+Q3JlYXRlIGEgd2Vic2l0ZTwvYT48L2Rpdj48ZGl2IGNsYXNzPSJ0LXRpbGRhbGFiZWwtZnJlZV9fbGlua3Mtd3IiPjxhIGNsYXNzPSJ0LXRpbGRhbGFiZWwtZnJlZV9fdHh0LWxpbmsiIGhyZWY9Imh0dHBzOi8vaGVscCcrKCJSVSI9PT13aW5kb3cuYnJvd3Nlckxhbmc/Ii1ydSI6IiIpKycudGlsZGEuY2Mvd2hpdGUtbGFiZWwiIHRhcmdldD0iX2JsYW5rIj4nKygiUlUiPT09d2luZG93LmJyb3dzZXJMYW5nPyLQmtCw0Log0YPQtNCw0LvQuNGC0Ywg0Y3RgtC+0YIg0LvQtdC50LHQuyI6IkhvdyB0byByZW1vdmUgdGhpcyBibG9jayIpKyI/PC9hPjwvZGl2PjwvZGl2PiIpfX0pLDUwMCl9KSksdF9vblJlYWR5KChmdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIik7aWYoIXdpbmRvdy5pc01vYmlsZSYmdCYmInllcyIhPT10LmdldEF0dHJpYnV0ZSgiZGF0YS1ibG9ja3MtYW5pbWF0aW9ub2ZmIikmJiExPT09d2luZG93LmlzU2VhcmNoQm90KXtmb3IodmFyIGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnIiKSxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBvLGk9KG89ZVtuXSkuZ2V0QXR0cmlidXRlKCJzdHlsZSIpO2kmJi0xIT09aS5pbmRleE9mKCJiYWNrZ3JvdW5kIikmJm8uc2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGlvbmFwcGVhciIsIm9mZiIpfWZvcih2YXIgcj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiF0LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRpb25hcHBlYXIiKSYmIXQuZ2V0QXR0cmlidXRlKCJkYXRhLXNjcmVlbi1taW4iKSYmIXQuZ2V0QXR0cmlidXRlKCJkYXRhLXNjcmVlbi1tYXgiKX0pKSxuPTA7bjxyLmxlbmd0aDtuKyspe3ZhciBvLGE9KG89cltuXSkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldCxsPXdpbmRvdy5wYWdlWU9mZnNldCt3aW5kb3cuaW5uZXJIZWlnaHQrMzAwO3RfYWRkQ2xhc3MobyxhPjFlMyYmYT5sPyJyX2hpZGRlbiI6InJfc2hvd2VkIiksdF9hZGRDbGFzcyhvLCJyX2FuaW0iKX1pZihyLmxlbmd0aCl7ZnVuY3Rpb24gZCgpe2Zvcih2YXIgdD1yLmxlbmd0aC0xO3Q+PTA7dC0tKXt2YXIgZT1yW3RdLG4sbz0wO2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldDwobz1lLm9mZnNldEhlaWdodDw9MTAwP3dpbmRvdy5wYWdlWU9mZnNldCt3aW5kb3cuaW5uZXJIZWlnaHQ6d2luZG93LnBhZ2VZT2Zmc2V0K3dpbmRvdy5pbm5lckhlaWdodC0xMDApJiYodF9yZW1vdmVDbGFzcyhlLCJyX2hpZGRlbiIpLHRfYWRkQ2xhc3MoZSwicl9zaG93ZWQiKSwocj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChyKSkuc3BsaWNlKHQsMSkpfX12YXIgcz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1yZWNvcmQtdHlwZT0iNDAwIl0sIFtkYXRhLXBhcmVudHRwbGlkPSI0MDAiXScpO2lmKHMubGVuZ3RoPjApdmFyIGM9MCx1PTAsbT1zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXszMDA9PT0odSs9MSkmJmNsZWFySW50ZXJ2YWwobSk7Zm9yKHZhciB0PTA7dDxzLmxlbmd0aDt0Kyspe3ZhciBlOyJ5ZXMiPT09c1t0XS5nZXRBdHRyaWJ1dGUoImRhdGEtaGlkaW5nLWNvbXBsZXRlZCIpJiYoYys9MSl9Yz09PXMubGVuZ3RoJiYoZCgpLGNsZWFySW50ZXJ2YWwobSkpfSksMTAwKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0X3Rocm90dGxlKChmdW5jdGlvbigpe2QoKX0pLDIwMCkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0aWxkYXRhYjpjaGFuZ2UiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7ZCgpfSksMjAwKSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtkKCl9KSl9fXZhciBwPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImh0bWwiKSxoPWRvY3VtZW50LmJvZHk7Im5vbmUiPT09cC5zdHlsZS5kaXNwbGF5JiYocC5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3ZhciBmPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXRpbGRhbGFiZWwiKSxnOyhnPWg/TWF0aC5tYXgoaC5zY3JvbGxIZWlnaHQsaC5vZmZzZXRIZWlnaHQsaC5jbGllbnRIZWlnaHQscC5vZmZzZXRIZWlnaHQpOnAub2Zmc2V0SGVpZ2h0KSs3MDx3aW5kb3cuaW5uZXJIZWlnaHQ/ZiYmKGYuc3R5bGUuZGlzcGxheT0ibm9uZSIpOmYmJmYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQiKX0pKSxmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt3aW5kb3cud2luV2lkdGg9d2luZG93LmlubmVyV2lkdGgsd2luZG93LndpbkhlaWdodD13aW5kb3cuaW5uZXJIZWlnaHR9ZnVuY3Rpb24gZSgpe3ZhciB0PXdpbmRvdy5pc01vYmlsZT9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg6d2luZG93LmlubmVyV2lkdGgsZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucltkYXRhLXNjcmVlbi1tYXhdLCAucltkYXRhLXNjcmVlbi1taW5dIiksbixvLGk7LTEhPT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkluc3RhZ3JhbSIpJiYodD1zY3JlZW4ud2lkdGgpO2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgYT1lW3JdLGw9YS5pZC5yZXBsYWNlKCJyZWMiLCIiKTtpZigieWVzIj09PWEuZ2V0QXR0cmlidXRlKCJkYXRhLWNvbm5lY3Qtd2l0aC10YWIiKXx8ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcG9wdXAtcmVjLWlkcz0iJytsKyciXScpKXJldHVybjtpPWdldENvbXB1dGVkU3R5bGUoYSkuZGlzcGxheSwobj1hLmdldEF0dHJpYnV0ZSgiZGF0YS1zY3JlZW4tbWF4IikpfHwobj0xZTQpLChvPWEuZ2V0QXR0cmlidXRlKCJkYXRhLXNjcmVlbi1taW4iKSl8fChvPTApLG49cGFyc2VJbnQobiksKG89cGFyc2VJbnQobykpPD1uJiYodDw9biYmdD5vPyJibG9jayIhPT1pJiYoYS5zdHlsZS5kaXNwbGF5PSJibG9jayIpOiJub25lIiE9PWkmJihhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSl9fXRfb25SZWFkeSgoZnVuY3Rpb24oKXt0KCksZSgpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dCgpfSksMjAwKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXtlKCl9KSwyMDApKX0pKX0oKSxmdW5jdGlvbigpe3ZhciB0PS0xIT09bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJJbnN0YWdyYW0iKTtmdW5jdGlvbiBlKCl7Zm9yKHZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWNvdmVyX19jYXJyaWVyIiksZT0wLG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIG8saTtpZigoaT0obz10W25dKS5zdHlsZSkuaGVpZ2h0LmluZGV4T2YoInZoIik+LTEpe2U9cGFyc2VJbnQoaS5oZWlnaHQsMTApLzEwMDt2YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyLmlkPSJ0ZW1wRGl2IixyLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDB2aDt2aXNpYmlsaXR5OmhpZGRlbjsiLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocik7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRlbXBEaXYiKSxsPXBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoYSkuaGVpZ2h0LnJlcGxhY2UoInB4IiwiIikpO3RfcmVtb3ZlRWwoYSk7dmFyIGQ9TWF0aC5yb3VuZChsKmUpKyJweCIscz1vLmNsb3Nlc3QoIi50LWNvdmVyIik7aWYocyl7dmFyIGM9cy5xdWVyeVNlbGVjdG9yKCIudC1jb3Zlcl9fZmlsdGVyIiksdT1zLnF1ZXJ5U2VsZWN0b3IoIi50LWNvdmVyX193cmFwcGVyIik7cy5zdHlsZS5oZWlnaHQ9ZCxjJiYoYy5zdHlsZS5oZWlnaHQ9ZCksdSYmKHUuc3R5bGUuaGVpZ2h0PWQpfWkuaGVpZ2h0PWR9fXZhciBtPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWhlaWdodC1jb3JyZWN0LXZoXSIpLHA9d2luZG93LmlubmVySGVpZ2h0O2U9MDtmb3IodmFyIG49MDtuPG0ubGVuZ3RoO24rKyl7dmFyIG8saTsoaT0obz1tW25dKS5zdHlsZSkuaGVpZ2h0LmluZGV4T2YoInZoIik+LTEmJihlPXBhcnNlSW50KGkuaGVpZ2h0KS8xMDAsZD1wKihpc05hTihlKT8xOmUpKyJweCIsaS5oZWlnaHQ9ZCl9fWZ1bmN0aW9uIG4oKXt2YXIgZT10P3NjcmVlbi53aWR0aDp3aW5kb3cuaW5uZXJXaWR0aDt3aW5kb3cuaXNNb2JpbGUmJiF0JiYoZT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpO2Zvcih2YXIgbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucjpub3QoW2RhdGEtcmVjb3JkLXR5cGU9IjM5NiJdLCBbZGF0YS1yZWNvcmQtdHlwZT0iMTAwMyJdLCBbZGF0YS1wYXJlbnR0cGxpZD0iMzk2Il0sIFtkYXRhLXBhcmVudHRwbGlkPSIxMDAzIl0pJyksbz1bXSxpPTA7aTxuLmxlbmd0aDtpKyspe3ZhciByPW5baV0sYT1nZXRDb21wdXRlZFN0eWxlKHIpOyJub25lIiE9PWEuZGlzcGxheSYmImhpZGRlbiIhPT1hLnZpc2liaWxpdHkmJiIwIiE9PWEub3BhY2l0eSYmby5wdXNoKHIpfWZvcih2YXIgbD0wO2w8by5sZW5ndGg7bCsrKWZvcih2YXIgZD1vW2xdLHM9ZC5xdWVyeVNlbGVjdG9yQWxsKCdkaXY6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1tb2JpbGUtd2lkdGg9ImZhbHNlIl0pOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoLnRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIpOm5vdCgudG4tYXRvbV9fcHJ4LXdyYXBwZXIpOm5vdCgudG4tYXRvbV9fdmlkZW9pZnJhbWUpOm5vdCgudG4tYXRvbV9fc3RpY2t5LXdyYXBwZXIpOm5vdCgudC1jYXRhbG9nX19yZWxldmFudHNfX2NvbnRhaW5lcik6bm90KC50LXNsZHNfX2l0ZW1zLXdyYXBwZXIpOm5vdCguanMtcHJvZHVjdC1jb250cm9scy13cmFwcGVyKTpub3QoLnQtc3RvcmVfX3JlbGV2YW50c19fY29udGFpbmVyKTpub3QoLnQtc2xkc19faXRlbXMtd3JhcHBlcik6bm90KC5qcy1wcm9kdWN0LWNvbnRyb2xzLXdyYXBwZXIpOm5vdCguanMtcHJvZHVjdC1lZGl0aW9uLW9wdGlvbik6bm90KC50LXByb2R1Y3RfX29wdGlvbi12YXJpYW50cyknKSxjPTA7YzxzLmxlbmd0aDtjKyspe3ZhciB1PXNbY107ZC5zdHlsZS53b3JkQnJlYWs9IiI7dmFyIG09dF9vdXRlcldpZHRoKHUpO2lmKG0+ZSl7aWYoInllcyI9PT11LmdldEF0dHJpYnV0ZSgiW2RhdGEtY3VzdG9tc3R5bGVdIikmJiJmYWxzZSI9PT11LnBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCJbZGF0YS1hdXRvLWNvcnJlY3QtbW9iaWxlLXdpZHRoXSIpKXJldHVybjtjb25zb2xlLmxvZygiQmxvY2sgbm90IG9wdGltaXplZCBmb3IgbW9iaWxlIHdpZHRoLiBCbG9jayB3aWR0aDoiK20rIiBCbG9jayBpZDoiK2QuZ2V0QXR0cmlidXRlKCJpZCIpKSxjb25zb2xlLmxvZyh1KSxkLnN0eWxlLm92ZXJmbG93PSJhdXRvIixkLnN0eWxlLndvcmRCcmVhaz1tLTM+ZT8iYnJlYWstd29yZCI6IiJ9fX1mdW5jdGlvbiBvKHQpe2Zvcih2YXIgZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudC10ZXh0Om5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtbmFtZTpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LXRpdGxlOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtZGVzY3I6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pLCAudC1oZWFkaW5nOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtdGV4dC1pbXBhY3Q6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pLCAudC1zdWJ0aXRsZTpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LXVwdGl0bGU6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pJyksbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgbz1lW25dLGk9by5nZXRBdHRyaWJ1dGUoInN0eWxlIik7aWYoaSl7dmFyIHI9InJlbSI9PT1vLmdldEF0dHJpYnV0ZSgiZGF0YS1hdXRvLWNvcnJlY3QtZm9udC1zaXplIiksYTtpZihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg+dClhPShhPWkucmVwbGFjZSgibGluZWhlaWdodCIsImxpbmUtaGVpZ2h0IikpLnJlcGxhY2UoImZvbnRzaXplIiwiZm9udC1zaXplIiksby5zZXRBdHRyaWJ1dGUoInN0eWxlIixhKTtlbHNle2lmKC0xPT09aS5pbmRleE9mKCJmb250LXNpemUiKSljb250aW51ZTtpZihwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKG8pLmZvbnRTaXplLnJlcGxhY2UoInB4IiwiIikpPDI2KWNvbnRpbnVlO2E9aS5yZXBsYWNlKCJsaW5lLWhlaWdodCIsImxpbmVoZWlnaHQiKSxhPXI/YS5yZXBsYWNlKC9mb250LXNpemUuKnB4Oy9naSwiZm9udC1zaXplOiAxLjZyZW07Iik6YS5yZXBsYWNlKCJmb250LXNpemUiLCJmb250c2l6ZSIpLG8uc2V0QXR0cmlidXRlKCJzdHlsZSIsYSl9fX19KHdpbmRvdy5pc01vYmlsZXx8d2luZG93LnBhcmVudC5pc1BhZ2VQcmV2aWV3KSYmKHRfb25SZWFkeSgoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGUsNDAwKX0pKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKGZ1bmN0aW9uKCl7c2V0VGltZW91dChlLDQwMCl9KSksd2luZG93LmlubmVyV2lkdGg8NDgwfHx3aW5kb3cuaXNNb2JpbGUmJmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDw0ODB8fHQmJnNjcmVlbi53aWR0aDw0ODA/KHRfb25SZWFkeSgoZnVuY3Rpb24oKXtmb3IodmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtY3VzdG9tc3R5bGU9InllcyJdJyksZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbZmllbGRdIHNwYW4sIFtmaWVsZF0gc3Ryb25nLCBbZmllbGRdIGVtLCBbZmllbGRdIGEiKSxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBpPXRbbl07cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShpKS5mb250U2l6ZS5yZXBsYWNlKCJweCIsIiIpKT4yNiYmKGkuc3R5bGUuZm9udFNpemU9bnVsbCxpLnN0eWxlLmxpbmVIZWlnaHQ9bnVsbCl9Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpPWVbbl07cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShpKS5mb250U2l6ZS5yZXBsYWNlKCJweCIsIiIpKT4yNiYmKGkuc3R5bGUuZm9udFNpemU9bnVsbCl9byg0ODApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJvcmllbnRhdGlvbmNoYW5nZSIsKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXtvKDQ4MCl9KSw1MDApfSkpfSkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixuKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigib3JpZW50YXRpb25jaGFuZ2UiLChmdW5jdGlvbigpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bigpfSksNTAwKX0pKSk6KHdpbmRvdy5pbm5lcldpZHRoPDkwMHx8d2luZG93LmlzTW9iaWxlJiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg8OTAwfHx0JiZzY3JlZW4ud2lkdGg8OTAwKSYmdF9vblJlYWR5KChmdW5jdGlvbigpe2Zvcih2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1jdXN0b21zdHlsZT0ieWVzIl0nKSxlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltmaWVsZF0gc3BhbiwgW2ZpZWxkXSBzdHJvbmcsIFtmaWVsZF0gZW0sIFtmaWVsZF0gYSIpLG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIG89dFtuXTtwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKG8pLmZvbnRTaXplLnJlcGxhY2UoInB4IiwiIikpPjMwJiYoby5zdHlsZS5mb250U2l6ZT1udWxsLG8uc3R5bGUubGluZUhlaWdodD1udWxsKX1mb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIG89ZVtuXTtwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKG8pLmZvbnRTaXplLnJlcGxhY2UoInB4IiwiIikpPjMwJiYoby5zdHlsZS5mb250U2l6ZT1udWxsKX1mb3IodmFyIGk9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnQtdGV4dDpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LW5hbWU6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pLCAudC10aXRsZTpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LWRlc2NyOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtaGVhZGluZzpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LXRleHQtaW1wYWN0Om5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtc3VidGl0bGU6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pLCAudC11cHRpdGxlOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKScpLG49MDtuPGkubGVuZ3RoO24rKyl7dmFyIG8scj0obz1pW25dKS5nZXRBdHRyaWJ1dGUoInN0eWxlIik7aWYociYmci5pbmRleE9mKCJmb250LXNpemUiKT4tMSYmcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShvKS5mb250U2l6ZS5yZXBsYWNlKCJweCIsIiIpKT4zMClpZigicmVtIj09PW8uZ2V0QXR0cmlidXRlKCJkYXRhLWF1dG8tY29ycmVjdC1mb250LXNpemUiKSl7dmFyIGE9ci5yZXBsYWNlKC9mb250LXNpemUuKnB4Oy9naSwiZm9udC1zaXplOiAxLjZyZW07IikucmVwbGFjZSgibGluZS1oZWlnaHQiLCJsaW5laGVpZ2h0Iik7by5zZXRBdHRyaWJ1dGUoInN0eWxlIixhKX1lbHNle3ZhciBhPXIucmVwbGFjZSgiZm9udC1zaXplIiwiZm9udHNpemUiKS5yZXBsYWNlKCJsaW5lLWhlaWdodCIsImxpbmVoZWlnaHQiKTtvLnNldEF0dHJpYnV0ZSgic3R5bGUiLGEpfX19KSkpfSgpLHRfb25SZWFkeSgoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2Zvcih2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdhW2hyZWZePSJodHRwIl1bdGFyZ2V0PSJfYmxhbmsiXScpLGU9MDtlPHQubGVuZ3RoO2UrKyl7dmFyIG49dFtlXSxvPW4uZ2V0QXR0cmlidXRlKCJyZWwiKXx8IiI7IiI9PT1vP24uc2V0QXR0cmlidXRlKCJyZWwiLCJub29wZW5lciIpOi0xPT09by5pbmRleE9mKCJub29wZW5lciIpJiZuLnNldEF0dHJpYnV0ZSgicmVsIixvKyIgbm9vcGVuZXIiKX19KSwyNTAwKX0pKSxmdW5jdGlvbih0LGUpe3Qub25lcnJvcj1mdW5jdGlvbihlLG4sbyxpLHIpeyJvYmplY3QiIT10eXBlb2YgdC50X2pzZXJyb3JzJiYodC50X2pzZXJyb3JzPVtdKSx0LnRfanNlcnJvcnMucHVzaCh7bWVzc2FnZTplLGZpbGVuYW1lOm4sbGluZW5vOm8sY29sbm86aSxlcnJvcjpyfSl9fSh3aW5kb3csTWF0aCksdF9vblJlYWR5KChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigicG9wdXBTaG93ZWQiLHRfc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcl9faW5pdCksZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJwb3B1cEhpZGRlbiIsKGZ1bmN0aW9uKCl7dmFyIHQ9d2luZG93LnNjcm9sbEJhcldpZHRoQ29tcGVuc2F0b3I7dCYmKHQuY2FuY2VsVGltZW91dCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodC5jYW5jZWxUaW1lb3V0KSx0LmNhbmNlbFRpbWVvdXQ9bnVsbCksdC5jYW5jZWxUaW1lb3V0PXdpbmRvdy5zZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuY2FuY2VsVGltZW91dD1udWxsLHRfc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcl9fY2FuY2VsKCl9KSxNYXRoLm1pbigzMDAsdC5kZWxheSkpKX0pKX0pKSx3aW5kb3cuc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcjsKCndpbmRvdy5pc01vYmlsZT0hMTtpZigvQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpe3dpbmRvdy5pc01vYmlsZT0hMH0Kd2luZG93LmlzaU9TPSExO2lmKC9pUGhvbmV8aVBhZHxpUG9kL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSl7d2luZG93LmlzaU9TPSEwfQp3aW5kb3cuaXNpT1NWZXJzaW9uPScnO2lmKHdpbmRvdy5pc2lPUyl7dmFyIHZlcnNpb249KG5hdmlnYXRvci5hcHBWZXJzaW9uKS5tYXRjaCgvT1MgKFxkKylfKFxkKylfPyhcZCspPy8pO2lmKHZlcnNpb24hPT1udWxsKXt3aW5kb3cuaXNpT1NWZXJzaW9uPVtwYXJzZUludCh2ZXJzaW9uWzFdLDEwKSxwYXJzZUludCh2ZXJzaW9uWzJdLDEwKSxwYXJzZUludCh2ZXJzaW9uWzNdfHwwLDEwKV19fQp3aW5kb3cuYnJvd3Nlckxhbmc9KHdpbmRvdy5uYXZpZ2F0b3IudXNlckxhbmd1YWdlfHx3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlKS50b1VwcGVyQ2FzZSgpLnNsaWNlKDAsMik7d2luZG93LnRpbGRhQnJvd3Nlckxhbmc9d2luZG93LmJyb3dzZXJMYW5nO2Z1bmN0aW9uIHRfdGhyb3R0bGUoZm4sdGhyZXNoaG9sZCxzY29wZSl7dmFyIGxhc3Q7dmFyIGRlZmVyVGltZXI7dGhyZXNoaG9sZHx8KHRocmVzaGhvbGQ9MjUwKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgY29udGV4dD1zY29wZXx8dGhpczt2YXIgbm93PStuZXcgRGF0ZSgpO3ZhciBhcmdzPWFyZ3VtZW50cztpZihsYXN0JiZub3c8bGFzdCt0aHJlc2hob2xkKXtjbGVhclRpbWVvdXQoZGVmZXJUaW1lcik7ZGVmZXJUaW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bGFzdD1ub3c7Zm4uYXBwbHkoY29udGV4dCxhcmdzKX0sdGhyZXNoaG9sZCl9ZWxzZXtsYXN0PW5vdztmbi5hcHBseShjb250ZXh0LGFyZ3MpfX19CmZ1bmN0aW9uIHQ4NjhfaW5pdFBvcHVwKHJlY2lkKXt2YXIgcmVjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWMnK3JlY2lkKTtpZighcmVjKXJldHVybjtyZWMuc2V0QXR0cmlidXRlKCdkYXRhLWFuaW1hdGlvbmFwcGVhcicsJ29mZicpO3JlYy5zdHlsZS5vcGFjaXR5PScxJzt2YXIgcG9wdXA9cmVjLnF1ZXJ5U2VsZWN0b3IoJy50LXBvcHVwJyk7aWYoIXBvcHVwKXJldHVybjt2YXIgaG9vaz1wb3B1cC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdG9vbHRpcC1ob29rJyk7aWYoIWhvb2spcmV0dXJuO3ZhciBhbmFsaXRpY3M9cG9wdXAuZ2V0QXR0cmlidXRlKCdkYXRhLXRyYWNrLXBvcHVwJyk7dmFyIGN1c3RvbUNvZGVIVE1MPXQ4NjhfX3JlYWRDdXN0b21Db2RlKHJlYyk7dmFyIHJlY0Jsb2Nrcz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucicpO2Zvcih2YXIgaT0wO2k8cmVjQmxvY2tzLmxlbmd0aDtpKyspe3JlY0Jsb2Nrc1tpXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZXZlbnQpe3ZhciB0YXJnZXQ9ZXZlbnQudGFyZ2V0O3ZhciBocmVmPXRhcmdldC5jbG9zZXN0KCdhW2hyZWYkPSInK2hvb2srJyJdJyk/dGFyZ2V0OiExO2lmKCFocmVmKXJldHVybjtldmVudC5wcmV2ZW50RGVmYXVsdCgpO3Q4Njhfc2hvd1BvcHVwKHJlYyxjdXN0b21Db2RlSFRNTCk7dF9vbkZ1bmNMb2FkKCd0X3BvcHVwX19yZXNpemVQb3B1cCcsZnVuY3Rpb24oKXt0X3BvcHVwX19yZXNpemVQb3B1cChyZWNpZCl9KTtpZihob29rLnN1YnN0cmluZygwLDcpPT09JyNwb3B1cDonJiZhbmFsaXRpY3MmJndpbmRvdy5UaWxkYSl7dmFyIHZpcnRUaXRsZT1ob29rO3ZpcnRUaXRsZT12aXJ0VGl0bGUuc3Vic3RyaW5nKDcpO1RpbGRhLnNlbmRFdmVudFRvU3RhdGlzdGljcyhhbmFsaXRpY3MsdmlydFRpdGxlKX19KX0KaWYoIXBvcHVwLmdldEF0dHJpYnV0ZSgnZGF0YS1wb3B1cC1pbml0ZWQnKSYmJ011dGF0aW9uT2JzZXJ2ZXInIGluIHdpbmRvdyl7cG9wdXAuc2V0QXR0cmlidXRlKCdkYXRhLXBvcHVwLWluaXRlZCcsJ3llcycpO3ZhciBzdG9yZXM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYm9keSAudC1zdG9yZScpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoc3RvcmVzLGZ1bmN0aW9uKHN0b3JlKXtuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihtdXRhdGlvbnNMaXN0KXtmb3IodmFyIG11dGF0aW9uIGluIG11dGF0aW9uc0xpc3Qpe3ZhciBldmVudD1tdXRhdGlvbnNMaXN0W211dGF0aW9uXTtpZihldmVudC50eXBlPT09J2F0dHJpYnV0ZXMnKXtpZihldmVudC50YXJnZXQuY2xhc3NOYW1lLmluZGV4T2YoJ3QtcG9wdXBfc2hvdycpIT09LTEpe3BvcHVwLnN0eWxlLnpJbmRleD0nOTk5OTk5OTknO3Q4NjhfaW5pdFBvcHVwKHJlY2lkKTt9fX19KS5vYnNlcnZlKHN0b3JlLHthdHRyaWJ1dGVzOiEwLGF0dHJpYnV0ZUZpbHRlcjpbJ2NsYXNzJ10sc3VidHJlZTohMCx9KX0pfX0KZnVuY3Rpb24gdDg2OF9fcmVhZEN1c3RvbUNvZGUocmVjKXt2YXIgY29kZVdyYXA9cmVjLnF1ZXJ5U2VsZWN0b3IoJy50ODY4IC50ODY4X19jb2RlLXdyYXAnKTtpZighY29kZVdyYXApcmV0dXJuO3ZhciBjdXN0b21Db2RlPWNvZGVXcmFwLmlubmVySFRNTDtyZXR1cm4gY3VzdG9tQ29kZX0KZnVuY3Rpb24gdDg2OF9zaG93UG9wdXAocmVjKXt2YXIgcG9wdXA9cmVjLnF1ZXJ5U2VsZWN0b3IoJy50LXBvcHVwJyk7aWYoIXBvcHVwKXJldHVybjt2YXIgcG9wdXBDb250YWluZXI9cG9wdXAucXVlcnlTZWxlY3RvcignLnQtcG9wdXBfX2NvbnRhaW5lcicpO2lmKCFwb3B1cENvbnRhaW5lcilyZXR1cm47dmFyIGNvZGVXcmFwPXBvcHVwLnF1ZXJ5U2VsZWN0b3IoJy50ODY4X19jb2RlLXdyYXAnKTtpZighY29kZVdyYXApcmV0dXJuO3ZhciB3aW5kb3dXaWR0aD13aW5kb3cuaW5uZXJXaWR0aDt2YXIgc2NyZWVuTWluPXJlYy5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2NyZWVuLW1pbicpO3ZhciBzY3JlZW5NYXg9cmVjLmdldEF0dHJpYnV0ZSgnZGF0YS1zY3JlZW4tbWF4Jyk7aWYoc2NyZWVuTWluJiZ3aW5kb3dXaWR0aDxwYXJzZUludChzY3JlZW5NaW4sMTApKXJldHVybjtpZihzY3JlZW5NYXgmJndpbmRvd1dpZHRoPnBhcnNlSW50KHNjcmVlbk1heCwxMCkpcmV0dXJuO3BvcHVwLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJztjb2RlV3JhcC5zdHlsZS5kaXNwbGF5PSdibG9jayc7dDg2OF9zZXRIZWlnaHQocmVjKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cG9wdXBDb250YWluZXIuY2xhc3NMaXN0LmFkZCgndC1wb3B1cF9fY29udGFpbmVyLWFuaW1hdGVkJyk7cG9wdXAuY2xhc3NMaXN0LmFkZCgndC1wb3B1cF9zaG93Jyl9LDEwMCk7aWYodHlwZW9mIHRfdHJpZ2dlckV2ZW50PT09J2Z1bmN0aW9uJyl0X3RyaWdnZXJFdmVudChkb2N1bWVudC5ib2R5LCdwb3B1cFNob3dlZCcpO2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgndC1ib2R5X3BvcHVwc2hvd2VkJyk7cG9wdXAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGV2ZW50KXt2YXIgY29udGFpbmVyPWV2ZW50LnRhcmdldC5jbG9zZXN0KCcudC1wb3B1cF9fY29udGFpbmVyJyk7aWYoIWNvbnRhaW5lcil0ODY4X2Nsb3NlUG9wdXAocmVjKX0pO3ZhciBjbG9zZUJ1dHRvbj1yZWMucXVlcnlTZWxlY3RvcignLnQtcG9wdXBfX2Nsb3NlJyk7aWYoY2xvc2VCdXR0b24pe2Nsb3NlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpe3Q4NjhfY2xvc2VQb3B1cChyZWMpfSl9CnZhciBidXR0b25zPXJlYy5xdWVyeVNlbGVjdG9yQWxsKCdhW2hyZWYqPSIjIl0nKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGJ1dHRvbnMsZnVuY3Rpb24oYnV0dG9uKXtidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7dmFyIHVybD1idXR0b24uZ2V0QXR0cmlidXRlKCdocmVmJyk7aWYodXJsLmluZGV4T2YoJyNvcmRlcicpIT09LTEpe3ZhciBwb3B1cENvbnRhaW5lcj1yZWMucXVlcnlTZWxlY3RvcignLnQtcG9wdXBfX2NvbnRhaW5lcicpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt3aGlsZShwb3B1cENvbnRhaW5lci5maXJzdENoaWxkKXtwb3B1cENvbnRhaW5lci5yZW1vdmVDaGlsZChwb3B1cENvbnRhaW5lci5maXJzdENoaWxkKX19LDYwMCl9CmlmKCF1cmx8fHVybC5zdWJzdHJpbmcoMCw3KSE9PScjcHJpY2U6Jyl7dDg2OF9jbG9zZVBvcHVwKHJlYyk7aWYoIXVybHx8dXJsLnN1YnN0cmluZygwLDcpPT09JyNwb3B1cDonKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYodHlwZW9mIHRfdHJpZ2dlckV2ZW50PT09J2Z1bmN0aW9uJyl0X3RyaWdnZXJFdmVudChkb2N1bWVudC5ib2R5LCdwb3B1cFNob3dlZCcpO2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgndC1ib2R5X3BvcHVwc2hvd2VkJyl9LDMwMCl9fX0pfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsZnVuY3Rpb24oZXZlbnQpe2lmKGV2ZW50LmtleUNvZGU9PT0yNyl7dDg2OF9jbG9zZVBvcHVwKHJlYyl9fSl9CmZ1bmN0aW9uIHQ4NjhfY2xvc2VQb3B1cChyZWMpe3ZhciBwb3B1cD1yZWMucXVlcnlTZWxlY3RvcignLnQtcG9wdXAnKTt2YXIgY29kZVdyYXA9cmVjLnF1ZXJ5U2VsZWN0b3IoJy50ODY4IC50ODY4X19jb2RlLXdyYXAnKTtpZih0eXBlb2YgdF90cmlnZ2VyRXZlbnQ9PT0nZnVuY3Rpb24nKXRfdHJpZ2dlckV2ZW50KGRvY3VtZW50LmJvZHksJ3BvcHVwSGlkZGVuJyk7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCd0LWJvZHlfcG9wdXBzaG93ZWQnKTtwb3B1cC5jbGFzc0xpc3QucmVtb3ZlKCd0LXBvcHVwX3Nob3cnKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYoIXBvcHVwLmNsYXNzTGlzdC5jb250YWlucygnLnQtcG9wdXBfc2hvdycpKXtwb3B1cC5zdHlsZS5kaXNwbGF5PSdub25lJztpZihjb2RlV3JhcCl7Y29kZVdyYXAuc3R5bGUuZGlzcGxheT0nbm9uZSd9fX0sMzAwKX0KZnVuY3Rpb24gdDg2OF9zZXRIZWlnaHQocmVjKXt2YXIgdmlkZW9DYXJpZXI9cmVjLnF1ZXJ5U2VsZWN0b3IoJy50ODY4X192aWRlby1jYXJpZXInKTtpZighdmlkZW9DYXJpZXIpcmV0dXJuO3ZhciBwYWRkaW5nTGVmdD1wYXJzZUludCh2aWRlb0Nhcmllci5zdHlsZS5wYWRkaW5nTGVmdCwxMCl8fDA7dmFyIHBhZGRpbmdSaWdodD1wYXJzZUludCh2aWRlb0Nhcmllci5zdHlsZS5wYWRkaW5nUmlnaHQsMTApfHwwO3ZhciBoZWlnaHQ9KHZpZGVvQ2FyaWVyLmNsaWVudFdpZHRoLShwYWRkaW5nTGVmdCtwYWRkaW5nUmlnaHQpKS8oMTYvOSk7dmlkZW9DYXJpZXIuc3R5bGUuaGVpZ2h0PWhlaWdodDtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHZpZGVvQ2FyaWVyLmNsb3Nlc3QsZnVuY3Rpb24ocGFyZW50KXtwYXJlbnQuc3R5bGUuaGVpZ2h0PWhlaWdodH0pfQppZighRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcyl7RWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcz1FbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzU2VsZWN0b3J8fEVsZW1lbnQucHJvdG90eXBlLm1zTWF0Y2hlc1NlbGVjdG9yfHxFbGVtZW50LnByb3RvdHlwZS5tb3pNYXRjaGVzU2VsZWN0b3J8fEVsZW1lbnQucHJvdG90eXBlLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8RWxlbWVudC5wcm90b3R5cGUub01hdGNoZXNTZWxlY3Rvcn0KaWYoIUVsZW1lbnQucHJvdG90eXBlLmNsb3Nlc3Qpe0VsZW1lbnQucHJvdG90eXBlLmNsb3Nlc3Q9ZnVuY3Rpb24ocyl7dmFyIGVsPXRoaXM7d2hpbGUoZWwmJmVsLm5vZGVUeXBlPT09MSl7aWYoRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcy5jYWxsKGVsLHMpKXtyZXR1cm4gZWx9CmVsPWVsLnBhcmVudEVsZW1lbnR8fGVsLnBhcmVudE5vZGV9CnJldHVybiBudWxsfX0KdmFyIHQ3ODZfUE9QVVBfU0hPV0VEX0VWRU5UX05BTUU9J2NhdGFsb2c6cG9wdXBTaG93ZWQnO3ZhciB0Nzg2X1BPUFVQX0NMT1NFRF9FVkVOVF9OQU1FPSdjYXRhbG9nOnBvcHVwQ2xvc2VkJztmdW5jdGlvbiB0Nzg2X19pbml0KHJlY2lkKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dF9vbkZ1bmNMb2FkKCd0X3Byb2RfX2luaXQnLGZ1bmN0aW9uKCl7dF9wcm9kX19pbml0KHJlY2lkKX0pO3Q3ODZfaW5pdFBvcHVwKHJlY2lkKTt0Nzg2X19ob3Zlclpvb21faW5pdChyZWNpZCk7dDc4Nl9fdXBkYXRlTGF6eUxvYWQocmVjaWQpO3Rfb25GdW5jTG9hZCgndF9zdG9yZV9hZGRQcm9kdWN0UXVhbnRpdHlFdmVudHMnLGZ1bmN0aW9uKCl7dDc4Nl9pbml0UHJvZHVjdFF1YW50aXR5KHJlY2lkKX0pO3ZhciBldmVudD1kb2N1bWVudC5jcmVhdGVFdmVudCgnSFRNTEV2ZW50cycpO2V2ZW50LmluaXRFdmVudCgndHdpc2hsaXN0X2FkZGJ0bicsITAsITEpO2RvY3VtZW50LmJvZHkuZGlzcGF0Y2hFdmVudChldmVudCl9LDUwMCl9CmZ1bmN0aW9uIHQ3ODZfaW5pdFByb2R1Y3RRdWFudGl0eShyZWNpZCl7dmFyIHJlYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjJytyZWNpZCk7aWYoIXJlYylyZXR1cm47dmFyIHByb2R1Y3RMaXN0PXJlYy5xdWVyeVNlbGVjdG9yQWxsKCcudDc4Nl9fY29sLCAudDc4Nl9fcHJvZHVjdC1mdWxsJyk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChwcm9kdWN0TGlzdCxmdW5jdGlvbihwcm9kdWN0KXt0X3N0b3JlX2FkZFByb2R1Y3RRdWFudGl0eUV2ZW50cyhwcm9kdWN0KX0pfQpmdW5jdGlvbiB0Nzg2X19zaG93TW9yZShyZWNpZCl7dmFyIHJlYz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcmVjJytyZWNpZCsnIC50Nzg2Jyk7aWYoIXJlYylyZXR1cm47dmFyIGNhcmRzU2hvd0xpbWl0PXBhcnNlSW50KHJlYy5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2hvdy1jb3VudCcpLDEwKTtpZihpc05hTihjYXJkc1Nob3dMaW1pdCl8fGNhcmRzU2hvd0xpbWl0PD0wKXJldHVybjt2YXIgc2hvd01vcmVCdXR0b249cmVjLnF1ZXJ5U2VsZWN0b3IoJy50Nzg2X19zaG93bW9yZScpO2lmKCFzaG93TW9yZUJ1dHRvbilyZXR1cm47Y29uc3Qgc2hvd01vcmVUZXh0Q29udGFpbmVyPXNob3dNb3JlQnV0dG9uLnF1ZXJ5U2VsZWN0b3IoJy5qcy1idG4tdHh0Jyk7aWYoc2hvd01vcmVUZXh0Q29udGFpbmVyKXtzaG93TW9yZVRleHRDb250YWluZXIudGV4dENvbnRlbnQ9dDc4Nl9fZGljdCgpfQpzaG93TW9yZUJ1dHRvbi5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnZGlzcGxheScpO3ZhciBhbGxQcm9kdWN0Q2FyZHM9cmVjLnF1ZXJ5U2VsZWN0b3JBbGwoJy50Nzg2X19jb2wnKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGFsbFByb2R1Y3RDYXJkcyxmdW5jdGlvbihwcm9kdWN0Q2FyZCl7cHJvZHVjdENhcmQuc3R5bGUuZGlzcGxheT0nbm9uZSd9KTt2YXIgY2FyZHNOdW1iZXI9YWxsUHJvZHVjdENhcmRzLmxlbmd0aDt0Nzg2X19zaG93U2VwYXJhdG9yKHJlYyxjYXJkc1Nob3dMaW1pdCk7Zm9yKHZhciBpPTA7aTxjYXJkc1Nob3dMaW1pdDtpKyspe2lmKGFsbFByb2R1Y3RDYXJkc1tpXSl7YWxsUHJvZHVjdENhcmRzW2ldLnN0eWxlLmRpc3BsYXk9J2lubGluZS1ibG9jayd9fQpzaG93TW9yZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXt2YXIgYWxsQ3VycmVudFByb2R1Y3RzPXJlYy5xdWVyeVNlbGVjdG9yQWxsKCcudDc4Nl9fY29sJyk7dmFyIGN1cnJlbnRwcm9kdWN0c1Nob3dlZD0wO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYWxsQ3VycmVudFByb2R1Y3RzLGZ1bmN0aW9uKHByb2R1Y3Qpe2lmKHByb2R1Y3Quc3R5bGUuZGlzcGxheT09PSdpbmxpbmUtYmxvY2snKXsrK2N1cnJlbnRwcm9kdWN0c1Nob3dlZH19KTtmb3IodmFyIGk9MDtpPGNhcmRzU2hvd0xpbWl0K2N1cnJlbnRwcm9kdWN0c1Nob3dlZDtpKyspe2lmKGFsbFByb2R1Y3RDYXJkc1tpXSl7YWxsUHJvZHVjdENhcmRzW2ldLnN0eWxlLmRpc3BsYXk9J2lubGluZS1ibG9jayd9fQp2YXIgZGlzcGxheUNoYW5nZWRFdmVudD1kb2N1bWVudC5jcmVhdGVFdmVudCgnSFRNTEV2ZW50cycpO2Rpc3BsYXlDaGFuZ2VkRXZlbnQuaW5pdEV2ZW50KCdkaXNwbGF5Q2hhbmdlZCcsITAsITEpO3JlYy5kaXNwYXRjaEV2ZW50KGRpc3BsYXlDaGFuZ2VkRXZlbnQpO3ZhciBhZGRCdG5FdmVudD1kb2N1bWVudC5jcmVhdGVFdmVudCgnSFRNTEV2ZW50cycpO2FkZEJ0bkV2ZW50LmluaXRFdmVudCgndHdpc2hsaXN0X2FkZGJ0bicsITAsITEpO2RvY3VtZW50LmJvZHkuZGlzcGF0Y2hFdmVudChhZGRCdG5FdmVudCk7aWYoY2FyZHNTaG93TGltaXQrY3VycmVudHByb2R1Y3RzU2hvd2VkPj1jYXJkc051bWJlcil7c2hvd01vcmVCdXR0b24uc3R5bGUuZGlzcGxheT0nbm9uZSd9CnQ3ODZfX3Nob3dTZXBhcmF0b3IocmVjLGNhcmRzU2hvd0xpbWl0K2N1cnJlbnRwcm9kdWN0c1Nob3dlZCk7aWYod2luZG93Lmxhenk9PT0neSd8fGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbGxyZWNvcmRzJykuZ2V0QXR0cmlidXRlKCdkYXRhLXRpbGRhLWxhenknKT09PSd5ZXMnKXt0X29uRnVuY0xvYWQoJ3RfbGF6eWxvYWRfdXBkYXRlJyxmdW5jdGlvbigpe3RfbGF6eWxvYWRfdXBkYXRlKCl9KX19KX0KZnVuY3Rpb24gdDc4Nl9fZGljdCgpe3ZhciBkaWN0aW9uYXJ5PXtFTjonTG9hZCBtb3JlJyxSVTon0JfQsNCz0YDRg9C30LjRgtGMINC10YnRkScsRlI6J0NoYXJnZXIgcGx1cycsREU6J01laHIgbGFkZW4nLEVTOidDYXJnYSBtw6FzJyxQVDonQ2FycmVndWUgbWFpcycsVUs6J9CX0LDQstCw0L3RgtCw0LbQuNGC0Lgg0YnQtScsSkE6J+OCguOBo+OBqOiqreOBv+i+vOOCgCcsWkg6J+ijnei8ieabtOWkmicsfTt2YXIgYWxsUmVjb3Jkcz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWxscmVjb3JkcycpO3ZhciBsYW5ndWFnZT0nRU4nO2lmKGFsbFJlY29yZHMpe3ZhciBwcm9qZWN0TGFuZz1hbGxSZWNvcmRzLmdldEF0dHJpYnV0ZSgnZGF0YS10aWxkYS1wcm9qZWN0LWxhbmcnKTtsYW5ndWFnZT1wcm9qZWN0TGFuZ3x8d2luZG93LmJyb3dzZXJMYW5nfQpyZXR1cm4gZGljdGlvbmFyeVtsYW5ndWFnZV0/ZGljdGlvbmFyeVtsYW5ndWFnZV06ZGljdGlvbmFyeS5FTn0KZnVuY3Rpb24gdDc4Nl9fc2hvd1NlcGFyYXRvcihyZWMsY2FyZHNTaG93TGltaXQpe2lmKHdpbmRvdy5qUXVlcnkmJnJlYyBpbnN0YW5jZW9mIGpRdWVyeSl7cmVjPXJlYy5nZXQoMCl9CnZhciBhbGxTZXBhcmF0b3JzPXJlYy5xdWVyeVNlbGVjdG9yQWxsKCcudDc4Nl9fc2VwYXJhdG9yX251bWJlcicpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYWxsU2VwYXJhdG9ycyxmdW5jdGlvbihzZXBhcmF0b3Ipe3NlcGFyYXRvci5jbGFzc0xpc3QuYWRkKCd0Nzg2X19zZXBhcmF0b3JfaGlkZScpO2lmKHNlcGFyYXRvci5nZXRBdHRyaWJ1dGUoJ2RhdGEtcHJvZHVjdC1zZXBhcmF0b3ItbnVtYmVyJyk8PWNhcmRzU2hvd0xpbWl0KXtzZXBhcmF0b3IuY2xhc3NMaXN0LnJlbW92ZSgndDc4Nl9fc2VwYXJhdG9yX2hpZGUnKX19KX0KZnVuY3Rpb24gdDc4Nl9faG92ZXJab29tX2luaXQocmVjaWQpe2lmKHdpbmRvdy5pc01vYmlsZSlyZXR1cm47dmFyIHJlYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjJytyZWNpZCk7aWYoIXJlYylyZXR1cm47dHJ5e2lmKCFyZWMucXVlcnlTZWxlY3RvcignW2RhdGEtaG92ZXItem9vbV0nKSl7cmV0dXJufQp2YXIgaG92ZXJTY3JpcHQ9J2h0dHBzOi8vc3RhdGljLnRpbGRhY2RuLmNvbS9qcy90aWxkYS1ob3Zlci16b29tLTEuMC5taW4uanMnO2lmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtzcmNePSciK2hvdmVyU2NyaXB0KyInXSIpKXt0X29uRnVuY0xvYWQoJ3RfaG92ZXJab29tX2luaXQnLGZ1bmN0aW9uKCl7dF9ob3Zlclpvb21faW5pdChyZWNpZCl9KX1lbHNle3ZhciBzY3JpcHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7c2NyaXB0LnR5cGU9J3RleHQvamF2YXNjcmlwdCc7c2NyaXB0LnNyYz1ob3ZlclNjcmlwdDtzY3JpcHQub25sb2FkPWZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3RfaG92ZXJab29tX2luaXQocmVjaWQpfSw1MDApfTtzY3JpcHQub25lcnJvcj1mdW5jdGlvbihlcnJvcil7Y29uc29sZS5sb2coJ1VwbG9hZCBzY3JpcHQgZXJyb3I6ICcsZXJyb3IpfTtkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCl9fWNhdGNoKGVycm9yKXtjb25zb2xlLmxvZygnWm9vbSBpbWFnZSBpbml0IGVycm9yOiAnK2Vycm9yLm1lc3NhZ2UpfX0KZnVuY3Rpb24gdDc4Nl9fdXBkYXRlTGF6eUxvYWQocmVjaWQpe3ZhciByZWM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlYycrcmVjaWQpO2lmKCFyZWMpcmV0dXJuO3ZhciBzY3JvbGxDb250YWluZXI9cmVjLnF1ZXJ5U2VsZWN0b3IoJyAudDc4Nl9fY29udGFpbmVyX21vYmlsZS1mbGV4Jyk7dmFyIGN1cnJlbnRNb2RlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50LXJlY29yZHMnKS5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGlsZGEtbW9kZScpO2lmKHNjcm9sbENvbnRhaW5lciYmY3VycmVudE1vZGUhPT0nZWRpdCcmJmN1cnJlbnRNb2RlIT09J3ByZXZpZXcnKXtzY3JvbGxDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJyx0X3Rocm90dGxlKGZ1bmN0aW9uKCl7aWYod2luZG93Lmxhenk9PT0neSd8fGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbGxyZWNvcmRzJykuZ2V0QXR0cmlidXRlKCdkYXRhLXRpbGRhLWxhenknKT09PSd5ZXMnKXt0X29uRnVuY0xvYWQoJ3RfbGF6eWxvYWRfdXBkYXRlJyxmdW5jdGlvbigpe3RfbGF6eWxvYWRfdXBkYXRlKCl9KX19KSl9fQpmdW5jdGlvbiB0Nzg2X2luaXRQb3B1cChyZWNpZCl7dmFyIHJlYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjJytyZWNpZCk7aWYoIXJlYylyZXR1cm47dmFyIG9wZW5lckxpbms9cmVjLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tocmVmXj0iI3Byb2Rwb3B1cCJdJyk7dmFyIHBvcHVwPXJlYy5xdWVyeVNlbGVjdG9yKCcudC1wb3B1cCcpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwob3BlbmVyTGluayxmdW5jdGlvbihsaW5rKXtsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxjbGlja09uY2VIYW5kbGVyLCExKTtmdW5jdGlvbiBjbGlja09uY2VIYW5kbGVyKGV2ZW50KXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO3ZhciBwcm9kdWN0PWxpbmsuY2xvc2VzdCgnLmpzLXByb2R1Y3QnKTt2YXIgcHJvZHVjdExpZD1wcm9kdWN0LmdldEF0dHJpYnV0ZSgnZGF0YS1wcm9kdWN0LWxpZCcpO3Rfb25GdW5jTG9hZCgndF9zbGRzSW5pdCcsZnVuY3Rpb24oKXt0X3NsZHNJbml0KHJlY2lkKycgI3Q3ODZfX3Byb2R1Y3QtJytwcm9kdWN0TGlkKycnKX0pO2xpbmsucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLGNsaWNrT25jZUhhbmRsZXIsITEpfQpsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxzaG93UG9wdXBIYW5kbGVyLCExKTtmdW5jdGlvbiBzaG93UG9wdXBIYW5kbGVyKGV2ZW50KXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO2lmKGV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ3QxMDAyX19hZGRCdG4nKXx8ZXZlbnQudGFyZ2V0LnBhcmVudE5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCd0MTAwMl9fYWRkQnRuJykpe3JldHVybn0KdDc4Nl9zaG93UG9wdXAocmVjaWQpO3ZhciBwcm9kdWN0PWxpbmsuY2xvc2VzdCgnLmpzLXByb2R1Y3QnKTt2YXIgcHJvZHVjdExpZD1wcm9kdWN0LmdldEF0dHJpYnV0ZSgnZGF0YS1wcm9kdWN0LWxpZCcpO3ZhciBhbGxQcm9kdWN0cz1wb3B1cC5xdWVyeVNlbGVjdG9yQWxsKCcuanMtcHJvZHVjdCcpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYWxsUHJvZHVjdHMsZnVuY3Rpb24ocHJvZHVjdCl7cHJvZHVjdC5zdHlsZS5kaXNwbGF5PSdub25lJ30pO3ZhciBwcm9kdWN0RnVsbD1wb3B1cC5xdWVyeVNlbGVjdG9yKCcuanMtcHJvZHVjdFtkYXRhLXByb2R1Y3QtbGlkPSInK3Byb2R1Y3RMaWQrJyJdJyk7cHJvZHVjdEZ1bGwuc3R5bGUuZGlzcGxheT0nYmxvY2snO3ZhciBhbmFsaXRpY3M9cG9wdXAuZ2V0QXR0cmlidXRlKCdkYXRhLXRyYWNrLXBvcHVwJyk7aWYoYW5hbGl0aWNzJiZwcm9kdWN0RnVsbCYmd2luZG93LlRpbGRhKXt2YXIgcHJvZHVjdE5hbWU9cHJvZHVjdEZ1bGwucXVlcnlTZWxlY3RvcignLmpzLXByb2R1Y3QtbmFtZScpO2lmKHByb2R1Y3ROYW1lKXt2YXIgdmlydHVhbFRpdGxlPXByb2R1Y3ROYW1lLnRleHRDb250ZW50O2lmKCF2aXJ0dWFsVGl0bGUpe3ZpcnR1YWxUaXRsZT0ncHJvZCcrcHJvZHVjdExpZH0KVGlsZGEuc2VuZEV2ZW50VG9TdGF0aXN0aWNzKGFuYWxpdGljcyx2aXJ0dWFsVGl0bGUpfX0KdmFyIGN1cnJlbnRVcmw9d2luZG93LmxvY2F0aW9uLmhyZWY7aWYoY3VycmVudFVybC5pbmRleE9mKCcjIS90cHJvZHVjdC8nKT09PS0xJiZjdXJyZW50VXJsLmluZGV4T2YoJyUyMyEvdHByb2R1Y3QvJyk9PT0tMSl7aWYodHlwZW9mIGhpc3RvcnkucmVwbGFjZVN0YXRlIT09J3VuZGVmaW5lZCcpe3dpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSgnJywnJyx3aW5kb3cubG9jYXRpb24uaHJlZisnIyEvdHByb2R1Y3QvJytyZWNpZCsnLScrcHJvZHVjdExpZCl9fQp0Nzg2X3VwZGF0ZVNsaWRlcihyZWNpZCsnICN0Nzg2X19wcm9kdWN0LScrcHJvZHVjdExpZCk7aWYod2luZG93Lmxhenk9PT0neSd8fGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbGxyZWNvcmRzJykuZ2V0QXR0cmlidXRlKCdkYXRhLXRpbGRhLWxhenknKT09PSd5ZXMnKXt0X29uRnVuY0xvYWQoJ3RfbGF6eWxvYWRfdXBkYXRlJyxmdW5jdGlvbigpe3RfbGF6eWxvYWRfdXBkYXRlKCl9KX19fSk7aWYoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3JlY29yZCcrcmVjaWQpLmxlbmd0aD09PTApe3Q3ODZfY2hlY2tVcmwocmVjaWQpfQppZihwb3B1cCYmcG9wdXAuaGFzQXR0cmlidXRlKCdkYXRhLWZpeGVkLWJ1dHRvbicpKXt0Nzg2X2ZpeGVkUG9wdXBCdXR0b24ocmVjaWQpfX0KZnVuY3Rpb24gdDc4Nl9jaGVja1VybChyZWNpZCl7aWYod2luZG93LmNhdGFsb2dVcmxQcm9jZXNzZWQpcmV0dXJuO3ZhciBjdXJyZW50VXJsPXdpbmRvdy5sb2NhdGlvbi5ocmVmO3ZhciB0cHJvZEluZGV4PShjdXJyZW50VXJsLmluZGV4T2YoJyMhL3Rwcm9kdWN0LycpKzF8fGN1cnJlbnRVcmwuaW5kZXhPZignJTIzIS90cHJvZHVjdC8nKSsxfHxjdXJyZW50VXJsLmluZGV4T2YoJyMlMjElMkZ0cHJvZHVjdCUyRicpKzF8fGN1cnJlbnRVcmwuaW5kZXhPZignIyElMkZ0cHJvZHVjdCUyRicpKzF8fGN1cnJlbnRVcmwuaW5kZXhPZignJTIzJTIxJTJGdHByb2R1Y3QlMkYnKSsxKS0xO2lmKHRwcm9kSW5kZXghPT0tMSl7dmFyIGN1cnJlbnRVcmw9Y3VycmVudFVybC5zdWJzdHJpbmcodHByb2RJbmRleCxjdXJyZW50VXJsLmxlbmd0aCk7dmFyIGN1clByb2RMaWQ9Y3VycmVudFVybC5zdWJzdHJpbmcoY3VycmVudFVybC5pbmRleE9mKCctJykrMSxjdXJyZW50VXJsLmxlbmd0aCk7aWYoY3VyUHJvZExpZCl7dmFyIGN1clByb2RMaWRNYXRjaD1jdXJQcm9kTGlkLm1hdGNoKC8oWzAtOV0rKS9nKTtpZihjdXJQcm9kTGlkTWF0Y2gpe2N1clByb2RMaWQ9Y3VyUHJvZExpZE1hdGNoWzBdfX0KaWYoY3VycmVudFVybC5pbmRleE9mKHJlY2lkKT09PS0xKXJldHVybjt2YXIgcmVjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWMnK3JlY2lkKTtpZighcmVjKXJldHVybjtpZihjdXJyZW50VXJsLmluZGV4T2YocmVjaWQpIT09MCYmcmVjLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXByb2R1Y3QtbGlkPSInK2N1clByb2RMaWQrJyJdJykpe3ZhciBjdXJyZW50TGluaz1yZWMucXVlcnlTZWxlY3RvcignW2RhdGEtcHJvZHVjdC1saWQ9IicrY3VyUHJvZExpZCsnIl0gW2hyZWZePSIjcHJvZHBvcHVwIl0nKTt2YXIgZXZlbnQ9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0hUTUxFdmVudHMnKTtldmVudC5pbml0RXZlbnQoJ2NsaWNrJywhMCwhMSk7aWYoY3VycmVudExpbmspe2N1cnJlbnRMaW5rLmRpc3BhdGNoRXZlbnQoZXZlbnQpfQppZih0eXBlb2YgcmVjLnNjcm9sbEludG9WaWV3PT09J2Z1bmN0aW9uJyl7cmVjLnNjcm9sbEludG9WaWV3KHtibG9jazonc3RhcnQnfSl9CndpbmRvdy5jYXRhbG9nVXJsUHJvY2Vzc2VkPSEwfX19CmZ1bmN0aW9uIHQ3ODZfdXBkYXRlU2xpZGVyKHJlY2lkKXt2YXIgcmVjPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNyZWMnK3JlY2lkKTtpZighcmVjKXJldHVybjt0X29uRnVuY0xvYWQoJ3Rfc2xkc19TbGlkZXJXaWR0aCcsZnVuY3Rpb24oKXt0X3NsZHNfU2xpZGVyV2lkdGgocmVjaWQpfSk7dmFyIHNsaWRlcj1yZWMucXVlcnlTZWxlY3RvcignLnQtc2xkc19fY29udGFpbmVyJyk7dmFyIHBhZGRpbmdMZWZ0PXBhcnNlSW50KHNsaWRlci5zdHlsZS5wYWRkaW5nTGVmdCl8fDA7dmFyIHBhZGRpbmdSaWdodD1wYXJzZUludChzbGlkZXIuc3R5bGUucGFkZGluZ1JpZ2h0KXx8MDt2YXIgc2xpZGVyV3JhcHBlcj1yZWMucXVlcnlTZWxlY3RvcignLnQtc2xkc19faXRlbXMtd3JhcHBlcicpO3ZhciBzbGlkZXJXaWR0aD1zbGlkZXIuY2xpZW50V2lkdGgtKHBhZGRpbmdMZWZ0K3BhZGRpbmdSaWdodCk7dmFyIHBvc2l0aW9uPXBhcnNlRmxvYXQoc2xpZGVyV3JhcHBlci5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2xpZGVyLXBvcycpKTtzbGlkZXJXcmFwcGVyLnN0eWxlLnRyYW5zZm9ybT0ndHJhbnNsYXRlM2QoLScrc2xpZGVyV2lkdGgqcG9zaXRpb24rJ3B4LCAwLCAwKSc7dF9vbkZ1bmNMb2FkKCd0X3NsZHNfVXBkYXRlU2xpZGVySGVpZ2h0JyxmdW5jdGlvbigpe3Rfc2xkc19VcGRhdGVTbGlkZXJIZWlnaHQocmVjaWQpfSk7dF9vbkZ1bmNMb2FkKCd0X3NsZHNfVXBkYXRlU2xpZGVyQXJyb3dzSGVpZ2h0JyxmdW5jdGlvbigpe3Rfc2xkc19VcGRhdGVTbGlkZXJBcnJvd3NIZWlnaHQocmVjaWQpfSl9CmZ1bmN0aW9uIHQ3ODZfc2hvd1BvcHVwKHJlY2lkKXt2YXIgcmVjPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNyZWMnK3JlY2lkKTtpZighcmVjKXJldHVybjt2YXIgcG9wdXA9cmVjLnF1ZXJ5U2VsZWN0b3IoJy50LXBvcHVwJyk7cG9wdXAuc3R5bGUuZGlzcGxheT0nYmxvY2snO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtwb3B1cC5xdWVyeVNlbGVjdG9yKCcudC1wb3B1cF9fY29udGFpbmVyJykuY2xhc3NMaXN0LmFkZCgndC1wb3B1cF9fY29udGFpbmVyLWFuaW1hdGVkJyk7cG9wdXAuY2xhc3NMaXN0LmFkZCgndC1wb3B1cF9zaG93Jyk7dF90cmlnZ2VyRXZlbnQocG9wdXAsdDc4Nl9QT1BVUF9TSE9XRURfRVZFTlRfTkFNRSl9LDUwKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYod2luZG93Lmxhenk9PT0neSd8fGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbGxyZWNvcmRzJykuZ2V0QXR0cmlidXRlKCdkYXRhLXRpbGRhLWxhenknKT09PSd5ZXMnKXt0X29uRnVuY0xvYWQoJ3RfbGF6eWxvYWRfdXBkYXRlJyxmdW5jdGlvbigpe3RfbGF6eWxvYWRfdXBkYXRlKCl9KX19LDMwMCk7dmFyIGJvZHk9ZG9jdW1lbnQuYm9keTtpZih0eXBlb2YgdF90cmlnZ2VyRXZlbnQ9PT0nZnVuY3Rpb24nKXRfdHJpZ2dlckV2ZW50KGRvY3VtZW50LmJvZHksJ3BvcHVwU2hvd2VkJyk7Ym9keS5jbGFzc0xpc3QuYWRkKCd0LWJvZHlfcG9wdXBzaG93ZWQnKTt2YXIgZXZlbnQ9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0hUTUxFdmVudHMnKTtldmVudC5pbml0RXZlbnQoJ3R3aXNobGlzdF9hZGRidG4nLCEwLCExKTtib2R5LmRpc3BhdGNoRXZlbnQoZXZlbnQpO3BvcHVwLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsZnVuY3Rpb24oZXZlbnQpe3ZhciB3aW5kb3dXaWR0aD13aW5kb3cuaW5uZXJXaWR0aDt2YXIgbWF4U2Nyb2xsQmFyV2lkdGg9MTc7dmFyIHdpbmRvd1dpdGhvdXRTY3JvbGxCYXI9d2luZG93V2lkdGgtbWF4U2Nyb2xsQmFyV2lkdGg7aWYoZXZlbnQuY2xpZW50WD53aW5kb3dXaXRob3V0U2Nyb2xsQmFyKXtyZXR1cm59CmlmKGV2ZW50LnRhcmdldD09PXRoaXMpe3Q3ODZfY2xvc2VQb3B1cChib2R5LHBvcHVwKX19KTt2YXIgY2xvc2VCdXR0b25zPXJlYy5xdWVyeVNlbGVjdG9yQWxsKCcudC1wb3B1cF9fY2xvc2UsIC50Nzg2X19jbG9zZS10ZXh0Jyk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChjbG9zZUJ1dHRvbnMsZnVuY3Rpb24oYnV0dG9uKXtidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7dDc4Nl9jbG9zZVBvcHVwKGJvZHkscG9wdXApfSl9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyxmdW5jdGlvbihldmVudCl7dmFyIGlzR2FsbGVyeVNob3dlZE9sZExpYj1kb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygndC16b29tZXJfX3Nob3cnKTtpZihpc0dhbGxlcnlTaG93ZWRPbGRMaWIpcmV0dXJuO3ZhciBpc0dhbGxlcnlTaG93ZWROZXdMaWI9ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoJ3Qtem9vbWVyX19hY3RpdmUnKTtpZihpc0dhbGxlcnlTaG93ZWROZXdMaWIpcmV0dXJuO3ZhciBpc1BvcHVwU2hvd2VkPWRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCd0LWJvZHlfcG9wdXBzaG93ZWQnKTtpZighaXNQb3B1cFNob3dlZClyZXR1cm47aWYocG9wdXAmJnBvcHVwLmNsYXNzTGlzdC5jb250YWlucygndC1wb3B1cF9zaG93Jykpe2lmKGV2ZW50LmtleUNvZGU9PT0yNyl7dDc4Nl9jbG9zZVBvcHVwKGJvZHkscG9wdXApfX19KX0KZnVuY3Rpb24gdDc4Nl9jbG9zZVBvcHVwKGJvZHkscG9wdXApe2lmKHR5cGVvZiB0X3RyaWdnZXJFdmVudD09PSdmdW5jdGlvbicpdF90cmlnZ2VyRXZlbnQoZG9jdW1lbnQuYm9keSwncG9wdXBIaWRkZW4nKTtib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ3QtYm9keV9wb3B1cHNob3dlZCcpO3BvcHVwLmNsYXNzTGlzdC5yZW1vdmUoJ3QtcG9wdXBfc2hvdycpO3ZhciBldmVudD1kb2N1bWVudC5jcmVhdGVFdmVudCgnSFRNTEV2ZW50cycpO2V2ZW50LmluaXRFdmVudCgndHdpc2hsaXN0X2FkZGJ0bicsITAsITEpO2JvZHkuZGlzcGF0Y2hFdmVudChldmVudCk7dmFyIGN1cnJlbnRVcmw9d2luZG93LmxvY2F0aW9uLmhyZWY7dmFyIGluZGV4VG9SZW1vdmU9Y3VycmVudFVybC5pbmRleE9mKCcjIS90cHJvZHVjdC8nKTtpZigvaVBob25lfGlQYWR8aVBvZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJmluZGV4VG9SZW1vdmU8MCl7aW5kZXhUb1JlbW92ZT1jdXJyZW50VXJsLmluZGV4T2YoJyUyMyEvdHByb2R1Y3QvJyl9CmN1cnJlbnRVcmw9Y3VycmVudFVybC5zdWJzdHJpbmcoMCxpbmRleFRvUmVtb3ZlKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cG9wdXAuc2Nyb2xsVG9wPTA7cG9wdXAuc3R5bGUuZGlzcGxheT0nbm9uZSc7aWYodHlwZW9mIGhpc3RvcnkucmVwbGFjZVN0YXRlIT09J3VuZGVmaW5lZCcpe3dpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSgnJywnJyxjdXJyZW50VXJsKX19LDMwMCk7dF90cmlnZ2VyRXZlbnQocG9wdXAsdDc4Nl9QT1BVUF9DTE9TRURfRVZFTlRfTkFNRSl9CmZ1bmN0aW9uIHQ3ODZfZml4ZWRQb3B1cEJ1dHRvbihyZWNJZCl7dmFyIHJlYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjJytyZWNJZCk7aWYoIXJlYylyZXR1cm47dmFyIE1PQklMRV9NQVhfV0lEVEg9NTYwO3ZhciBwb3B1cD1yZWMucXVlcnlTZWxlY3RvcignLnQtcG9wdXAnKTt2YXIgcG9wdXBDb250YWluZXI9cG9wdXAucXVlcnlTZWxlY3RvcignLnQtcG9wdXBfX2NvbnRhaW5lcicpO3ZhciBidG5XcmFwcGVycz1yZWMucXVlcnlTZWxlY3RvckFsbCgnLnQ3ODZfX2J0bi13cmFwcGVyJyk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChidG5XcmFwcGVycyxmdW5jdGlvbihlbCl7ZWwuY2xhc3NMaXN0LmFkZCgndDc4Nl9fYnRuLXdyYXBwZXItZml4ZWQnKX0pO2Z1bmN0aW9uIGFkZFN0eWxlKCl7cG9wdXBDb250YWluZXIuc3R5bGUucGFkZGluZ0JvdHRvbT0nOTBweCc7cG9wdXBDb250YWluZXIuc3R5bGUuY3NzVGV4dCs9Jzt0cmFuc2Zvcm06bm9uZSAhaW1wb3J0YW50Oyd9CmZ1bmN0aW9uIHJlc2V0U3R5bGUoKXtwb3B1cENvbnRhaW5lci5zdHlsZS5wYWRkaW5nQm90dG9tPScnO3BvcHVwQ29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybT0nJ30KZnVuY3Rpb24gaGFuZGxlUmVzaXplKCl7aWYod2luZG93LmlubmVyV2lkdGg+TU9CSUxFX01BWF9XSURUSCl7cmVzZXRTdHlsZSgpO3JldHVybn0KYWRkU3R5bGUoKX0KaWYod2luZG93LmlzTW9iaWxlKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignb3JpZW50YXRpb25jaGFuZ2UnLGhhbmRsZVJlc2l6ZSl9CnBvcHVwLmFkZEV2ZW50TGlzdGVuZXIodDc4Nl9QT1BVUF9TSE9XRURfRVZFTlRfTkFNRSxmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoYW5kbGVSZXNpemUoKX0pfSk7cG9wdXAuYWRkRXZlbnRMaXN0ZW5lcih0Nzg2X1BPUFVQX0NMT1NFRF9FVkVOVF9OQU1FLGZ1bmN0aW9uKCl7cmVzZXRTdHlsZSgpfSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsaGFuZGxlUmVzaXplKX0KZnVuY3Rpb24gdDk1OF9pbml0KHJlY0lkKXt2YXIgcmVjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWMnK3JlY0lkKTtpZighcmVjKXJldHVybjt2YXIgY29udGFpbmVyPXJlYy5xdWVyeVNlbGVjdG9yKCcudDk1OCcpO2lmKCFjb250YWluZXIpcmV0dXJuO3ZhciBzbGlkZXJDb250YWluZXI9cmVjLnF1ZXJ5U2VsZWN0b3IoJy50OTU4X19zbGlkZWNvbnRhaW5lcicpO3ZhciBpdGVtcz1yZWMucXVlcnlTZWxlY3RvckFsbCgnLnQ5NThfX2l0ZW0nKTt2YXIgY2FyZHM9cmVjLnF1ZXJ5U2VsZWN0b3JBbGwoJy50OTU4X19jYXJkJyk7dmFyIHRvdGFsU2xpZGVzPWl0ZW1zLmxlbmd0aDtpZighdG90YWxTbGlkZXMpe3JldHVybn0KdmFyIHNsaWRlcldpZHRoPXBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZShpdGVtc1swXSxudWxsKS53aWR0aC5yZXBsYWNlKCdweCcsJycpKTt0OTU4X2NoZWNrU2l6ZShyZWMpO3NsaWRlckNvbnRhaW5lci5zdHlsZS53aWR0aD1zbGlkZXJXaWR0aCp0b3RhbFNsaWRlcysncHgnO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLHRfdGhyb3R0bGUoZnVuY3Rpb24oKXt0OTU4X2ZpbmRWaXNpYmxlQ2FyZHMocmVjKTt0OTU4X2luaXRQb3B1cChyZWMpO3Q5NThfY2hlY2tTaXplKHJlYyk7c2xpZGVyV2lkdGg9cGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKGl0ZW1zWzBdLG51bGwpLndpZHRoLnJlcGxhY2UoJ3B4JywnJykpO3NsaWRlckNvbnRhaW5lci5zdHlsZS53aWR0aD1zbGlkZXJXaWR0aCp0b3RhbFNsaWRlcysncHgnO3ZhciBtYXRyaXg9KGdldENvbXB1dGVkU3R5bGUoc2xpZGVyQ29udGFpbmVyLG51bGwpLnRyYW5zZm9ybXx8JycpLnJlcGxhY2UoL1teMC05XC0uLF0vZywnJykuc3BsaXQoJywnKTt2YXIgeD1tYXRyaXhbMTJdfHxtYXRyaXhbNF07aWYoLSgodG90YWxTbGlkZXMtMSkqc2xpZGVyV2lkdGgpPngpe3NsaWRlckNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm09J3RyYW5zbGF0ZSgtJysodG90YWxTbGlkZXMtMSkqc2xpZGVyV2lkdGgrJ3B4LCAwKSd9fSkpO2lmKHR5cGVvZiBqUXVlcnkhPT0ndW5kZWZpbmVkJyl7JChjb250YWluZXIpLmJpbmQoJ2Rpc3BsYXlDaGFuZ2VkJyxmdW5jdGlvbigpe3NsaWRlckNvbnRhaW5lci5zdHlsZS53aWR0aD0nMTAwJSc7c2V0VGltZW91dChmdW5jdGlvbigpe3NsaWRlcldpZHRoPXBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZShpdGVtc1swXSxudWxsKS53aWR0aC5yZXBsYWNlKCdweCcsJycpKTtzbGlkZXJDb250YWluZXIuc3R5bGUud2lkdGg9c2xpZGVyV2lkdGgqdG90YWxTbGlkZXMrJ3B4Jzt0OTU4X2NoZWNrU2l6ZShyZWMpO3Q5NThfZmluZFZpc2libGVDYXJkcyhyZWMpO3Q5NThfaW5pdFBvcHVwKHJlYyl9LDMwMCl9KX1lbHNle2NvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdkaXNwbGF5Q2hhbmdlZCcsZnVuY3Rpb24oKXtzbGlkZXJDb250YWluZXIuc3R5bGUud2lkdGg9JzEwMCUnO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtzbGlkZXJXaWR0aD1wYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUoaXRlbXNbMF0sbnVsbCkud2lkdGgucmVwbGFjZSgncHgnLCcnKSk7c2xpZGVyQ29udGFpbmVyLnN0eWxlLndpZHRoPXNsaWRlcldpZHRoKnRvdGFsU2xpZGVzKydweCc7dDk1OF9jaGVja1NpemUocmVjKTt0OTU4X2ZpbmRWaXNpYmxlQ2FyZHMocmVjKTt0OTU4X2luaXRQb3B1cChyZWMpfSwzMDApfSl9CnJlYy5xdWVyeVNlbGVjdG9yKCcudDk1OF9fbmV4dCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpe3Q5NThfc2xpZGUocmVjLCdyaWdodCcpfSk7cmVjLnF1ZXJ5U2VsZWN0b3IoJy50OTU4X19wcmV2aW91cycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpe3Q5NThfc2xpZGUocmVjLCdsZWZ0Jyl9KTtpZih3aW5kb3cuaW5uZXJXaWR0aD42NDApe3Q5NThfZmluZFZpc2libGVDYXJkcyhyZWMpfWVsc2V7dF9vbkZ1bmNMb2FkKCdIYW1tZXInLGZ1bmN0aW9uKCl7dDk1OF9pbml0U2xpZGVyU3dpcGUocmVjKX0pO2Zvcih2YXIgaT0wO2k8Y2FyZHMubGVuZ3RoO2krKyl7Y2FyZHNbaV0uY2xhc3NMaXN0LmFkZCgndDk1OF9fY2FyZC12aXNpYmxlJyl9fQp0OTU4X2luaXRQb3B1cChyZWMpO3ZhciBpc2lPUz0vaVBob25lfGlQYWR8aVBvZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl8fChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ01hY2ludG9zaCcpJiYnb250b3VjaGVuZCcgaW4gZG9jdW1lbnQpO2lmKGlzaU9TKXt2YXIgYWN0aXZlSW5kZXg7dmFyIGFjdGl2ZVNsaWRlO2lmKGRvY3VtZW50LnJlYWR5U3RhdGU9PT0nY29tcGxldGUnKXthY3RpdmVJbmRleD1jb250YWluZXIuZ2V0QXR0cmlidXRlKCdkYXRhLXNsaWRlLXBvcycpO2lmKGFjdGl2ZUluZGV4KWFjdGl2ZUluZGV4PXBhcnNlSW50KGFjdGl2ZUluZGV4LDEwKTthY3RpdmVTbGlkZT10eXBlb2YgYWN0aXZlSW5kZXg9PT0nbnVtYmVyJz9pdGVtc1thY3RpdmVJbmRleF06bnVsbDtpZihhY3RpdmVTbGlkZSl0OTU4X19oaWRlTW9iaWxlU2xpZGVzKGFjdGl2ZVNsaWRlKX1lbHNle3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJyxmdW5jdGlvbigpe2FjdGl2ZUluZGV4PWNvbnRhaW5lci5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2xpZGUtcG9zJyk7aWYoYWN0aXZlSW5kZXgpYWN0aXZlSW5kZXg9cGFyc2VJbnQoYWN0aXZlSW5kZXgsMTApO2FjdGl2ZVNsaWRlPXR5cGVvZiBhY3RpdmVJbmRleD09PSdudW1iZXInP2l0ZW1zW2FjdGl2ZUluZGV4XTpudWxsO2FjdGl2ZVNsaWRlPWl0ZW1zW2FjdGl2ZUluZGV4XTtpZihhY3RpdmVTbGlkZSl0OTU4X19oaWRlTW9iaWxlU2xpZGVzKGFjdGl2ZVNsaWRlKX0pfX19CmZ1bmN0aW9uIHQ5NThfY2hlY2tTaXplKHJlYyl7dmFyIGNhcmRzPXJlYy5xdWVyeVNlbGVjdG9yQWxsKCcudDk1OF9fY2FyZF9wcmV2aWV3Jyk7dmFyIG1vcmVzPXJlYy5xdWVyeVNlbGVjdG9yQWxsKCcudDk1OF9fbW9yZS13cmFwcGVyJyk7dmFyIGJsb2NrSGVpZ2h0PXJlYy5xdWVyeVNlbGVjdG9yKCcudDk1OF9faGVpZ2h0Jyk7dmFyIG1heFdpZHRoPXBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZShibG9ja0hlaWdodCxudWxsKS53aWR0aC5yZXBsYWNlKCdweCcsJycpKTt2YXIgd2luZG93TWFyZ2luPTgwO3ZhciB3aW5kb3dXaWR0aD13aW5kb3cuaW5uZXJXaWR0aDt2YXIgY2FyZE1heFdpZHRoPXdpbmRvd1dpZHRoLXdpbmRvd01hcmdpbjtpZihtYXhXaWR0aD53aW5kb3dXaWR0aCl7Zm9yKHZhciBpPTA7aTxjYXJkcy5sZW5ndGg7aSsrKXtjYXJkc1tpXS5zdHlsZS5tYXhXaWR0aD1jYXJkTWF4V2lkdGgrJ3B4J30KZm9yKHZhciBpPTA7aTxtb3Jlcy5sZW5ndGg7aSsrKXttb3Jlc1tpXS5zdHlsZS5tYXhXaWR0aD1jYXJkTWF4V2lkdGgrJ3B4J319ZWxzZXtmb3IodmFyIGk9MDtpPGNhcmRzLmxlbmd0aDtpKyspe2NhcmRzW2ldLnN0eWxlLm1heFdpZHRoPScnfQpmb3IodmFyIGk9MDtpPG1vcmVzLmxlbmd0aDtpKyspe21vcmVzW2ldLnN0eWxlLm1heFdpZHRoPScnfX0KZm9yKHZhciBpPTA7aTxjYXJkcy5sZW5ndGg7aSsrKXt2YXIgY2FyZD1jYXJkc1tpXTt2YXIgY2FyZFN0eWxlPWdldENvbXB1dGVkU3R5bGUoY2FyZCxudWxsKTt2YXIgY2FyZFBhZGRpbmdUb3A9cGFyc2VJbnQoY2FyZFN0eWxlLnBhZGRpbmdUb3ApfHwwO3ZhciBjYXJkUGFkZGluZ0JvdHRvbT1wYXJzZUludChjYXJkU3R5bGUucGFkZGluZ0JvdHRvbSl8fDA7dmFyIGNhcmRIZWlnaHQ9Y2FyZC5jbGllbnRIZWlnaHQtKGNhcmRQYWRkaW5nVG9wK2NhcmRQYWRkaW5nQm90dG9tKTt2YXIgY2FyZElubmVyPWNhcmQucXVlcnlTZWxlY3RvcignLnQ5NThfX2NhcmQtaW5uZXInKTt2YXIgY2FyZElubmVySGVpZ2h0PWNhcmRJbm5lci5vZmZzZXRIZWlnaHQ7aWYoY2FyZEhlaWdodDw9Y2FyZElubmVySGVpZ2h0KXtjYXJkLmNsYXNzTGlzdC5hZGQoJ3Q5NThfX2NhcmRfZmFkZScpfWVsc2V7Y2FyZC5jbGFzc0xpc3QucmVtb3ZlKCd0OTU4X19jYXJkX2ZhZGUnKX19fQpmdW5jdGlvbiB0OTU4X2luaXRTbGlkZXJTd2lwZShyZWMpe3ZhciBzbGlkZXJXcmFwcGVyPXJlYy5xdWVyeVNlbGVjdG9yKCcudDk1OF9fZ2FsbGVyeScpO3ZhciB0b3RhbFNsaWRlcz1yZWMucXVlcnlTZWxlY3RvckFsbCgnLnQ5NThfX2l0ZW0nKS5sZW5ndGg7dmFyIHRpbWVvdXQ7dmFyIGlzU2Nyb2xsaW5nPSExO2lmKHR5cGVvZiBIYW1tZXIhPT0ndW5kZWZpbmVkJyl7ZGVsZXRlIEhhbW1lci5kZWZhdWx0cy5jc3NQcm9wcy51c2VyU2VsZWN0O3ZhciBoYW1tZXI9bmV3IEhhbW1lcihzbGlkZXJXcmFwcGVyLHtkb21FdmVudHM6ITAsaW5wdXRDbGFzczpIYW1tZXIuVG91Y2hJbnB1dCxyZWNvZ25pemVyczpbW0hhbW1lci5Td2lwZSx7ZGlyZWN0aW9uOkhhbW1lci5ESVJFQ1RJT05fSE9SSVpPTlRBTCx9LF0sXSx9KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJyxmdW5jdGlvbigpe2lzU2Nyb2xsaW5nPSEwO2NsZWFyVGltZW91dCh0aW1lb3V0KTt0aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtpc1Njcm9sbGluZz0hMX0sMjUwKX0pO2lmKHRvdGFsU2xpZGVzPT0xKXJldHVybiExO2hhbW1lci5vbignc3dpcGVsZWZ0JyxmdW5jdGlvbihldmVudCl7aWYoaXNTY3JvbGxpbmcpcmV0dXJuITE7c2xpZGVyV3JhcHBlci5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2xpZGVyLXRvdWNoJywneWVzJyk7aWYoZXZlbnQuaXNGaW5hbCl7dDk1OF9zbGlkZShyZWMsJ3JpZ2h0Jyk7c2xpZGVyV3JhcHBlci5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2xpZGVyLXRvdWNoJywnJyl9fSk7aGFtbWVyLm9uKCdzd2lwZXJpZ2h0JyxmdW5jdGlvbihldmVudCl7aWYoaXNTY3JvbGxpbmcpcmV0dXJuITE7c2xpZGVyV3JhcHBlci5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2xpZGVyLXRvdWNoJywneWVzJyk7aWYoZXZlbnQuaXNGaW5hbCl7dDk1OF9zbGlkZShyZWMsJ2xlZnQnKTtzbGlkZXJXcmFwcGVyLnNldEF0dHJpYnV0ZSgnZGF0YS1zbGlkZXItdG91Y2gnLCcnKX19KX19CmZ1bmN0aW9uIHQ5NThfc2xpZGUocmVjLGRpcmVjdGlvbil7dmFyIGFsbHJlY29yZHM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FsbHJlY29yZHMnKTt2YXIgY29udGFpbmVyPXJlYy5xdWVyeVNlbGVjdG9yKCcudDk1OF9fc2xpZGVjb250YWluZXInKTt2YXIgaXRlbXM9cmVjLnF1ZXJ5U2VsZWN0b3JBbGwoJy50OTU4X19pdGVtJyk7dmFyIHRvdGFsU2xpZGVzPWl0ZW1zLmxlbmd0aDt2YXIgc2xpZGVyV2lkdGg9cGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKGl0ZW1zWzBdLG51bGwpLndpZHRoLnJlcGxhY2UoJ3B4JywnJykpO3ZhciBwb3NpdGlvbj1wYXJzZUludChjb250YWluZXIuZ2V0QXR0cmlidXRlKCdkYXRhLXNsaWRlLXBvcycpLDEwKTt2YXIgaXNpT1M9L2lQaG9uZXxpUGFkfGlQb2QvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHwobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdNYWNpbnRvc2gnKSYmJ29udG91Y2hlbmQnIGluIGRvY3VtZW50KTtpZihkaXJlY3Rpb249PT0ncmlnaHQnKXtjb250YWluZXIuc2V0QXR0cmlidXRlKCdkYXRhLXNsaWRlLXBvcycsKytwb3NpdGlvbik7aWYocG9zaXRpb24+PXRvdGFsU2xpZGVzKXtwb3NpdGlvbj0wO2NvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2xpZGUtcG9zJyxwb3NpdGlvbil9fWVsc2V7Y29udGFpbmVyLnNldEF0dHJpYnV0ZSgnZGF0YS1zbGlkZS1wb3MnLC0tcG9zaXRpb24pO2lmKHBvc2l0aW9uPD0tMSl7cG9zaXRpb249dG90YWxTbGlkZXMtMTtjb250YWluZXIuc2V0QXR0cmlidXRlKCdkYXRhLXNsaWRlLXBvcycscG9zaXRpb24pfX0KY29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybT0ndHJhbnNsYXRlKC0nK3NsaWRlcldpZHRoKnBvc2l0aW9uKydweCwgMCknO2NvbnRhaW5lci5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249Jy4zcyc7c2V0VGltZW91dChmdW5jdGlvbigpe3Q5NThfZmluZFZpc2libGVDYXJkcyhyZWMpO2lmKGlzaU9TKXt2YXIgYWN0aXZlSW5kZXg9Y29udGFpbmVyLmdldEF0dHJpYnV0ZSgnZGF0YS1zbGlkZS1wb3MnKTtpZihhY3RpdmVJbmRleClhY3RpdmVJbmRleD1wYXJzZUludChhY3RpdmVJbmRleCwxMCk7dmFyIGFjdGl2ZVNsaWRlPXR5cGVvZiBhY3RpdmVJbmRleD09PSdudW1iZXInP2l0ZW1zW2FjdGl2ZUluZGV4XTpudWxsO2lmKGFjdGl2ZVNsaWRlKXQ5NThfX2hpZGVNb2JpbGVTbGlkZXMoYWN0aXZlU2xpZGUpfX0sMzUwKTtpZih3aW5kb3cubGF6eT09PSd5J3x8YWxscmVjb3Jkcy5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGlsZGEtbGF6eScpPT09J3llcycpe3Rfb25GdW5jTG9hZCgndF9sYXp5bG9hZF91cGRhdGUnLGZ1bmN0aW9uKCl7dF9sYXp5bG9hZF91cGRhdGUoKX0pfX0KZnVuY3Rpb24gdDk1OF9maW5kVmlzaWJsZUNhcmRzKHJlYyl7dmFyIGNhcmRzPXJlYy5xdWVyeVNlbGVjdG9yQWxsKCcudDk1OF9fY2FyZCcpO3ZhciBwcmV2Q29udHJvbD1yZWMucXVlcnlTZWxlY3RvcignLnQ5NThfX3ByZXZpb3VzJyk7dmFyIG5leHRDb250cm9sPXJlYy5xdWVyeVNlbGVjdG9yKCcudDk1OF9fbmV4dCcpO2Zvcih2YXIgaT0wO2k8Y2FyZHMubGVuZ3RoO2krKyl7dmFyIGNhcmQ9Y2FyZHNbaV07Y2FyZC5jbGFzc0xpc3QucmVtb3ZlKCd0OTU4X19jYXJkLWxlZnQnKTtjYXJkLmNsYXNzTGlzdC5yZW1vdmUoJ3Q5NThfX2NhcmQtcmlnaHQnKTtjYXJkLmNsYXNzTGlzdC5yZW1vdmUoJ3Q5NThfX2NhcmQtdmlzaWJsZScpO3ZhciB3aW5kb3dXaWR0aD13aW5kb3cuaW5uZXJXaWR0aDt2YXIgY2FyZExlZnRQb3M9Y2FyZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O3ZhciBjYXJkUmlnaHRQb3M9Y2FyZExlZnRQb3MrcGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKGNhcmQsbnVsbCkud2lkdGgucmVwbGFjZSgncHgnLCcnKSk7aWYoY2FyZExlZnRQb3M8PTAmJmNhcmRSaWdodFBvcz49MCl7Y2FyZC5jbGFzc0xpc3QuYWRkKCd0OTU4X19jYXJkLWxlZnQnKX1lbHNlIGlmKGNhcmRMZWZ0UG9zPD13aW5kb3dXaWR0aCYmY2FyZFJpZ2h0UG9zPj13aW5kb3dXaWR0aCl7Y2FyZC5jbGFzc0xpc3QuYWRkKCd0OTU4X19jYXJkLXJpZ2h0Jyl9ZWxzZSBpZihjYXJkTGVmdFBvcz49MCYmY2FyZFJpZ2h0UG9zPD13aW5kb3dXaWR0aCl7Y2FyZC5jbGFzc0xpc3QuYWRkKCd0OTU4X19jYXJkLXZpc2libGUnKX19CnZhciBsZWZ0Q2FyZD1yZWMucXVlcnlTZWxlY3RvcignLnQ5NThfX2NhcmQtbGVmdCcpO3ZhciByaWdodENhcmQ9cmVjLnF1ZXJ5U2VsZWN0b3IoJy50OTU4X19jYXJkLXJpZ2h0Jyk7aWYobGVmdENhcmQpe3ZhciBsZWZ0Q2FyZFJlY3Q9bGVmdENhcmQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDt2YXIgbGVmdENhcmRXaWR0aD1wYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUobGVmdENhcmQsbnVsbCkud2lkdGgucmVwbGFjZSgncHgnLCcnKSk7dmFyIGxlZnRDYXJkT2Zmc2V0PWxlZnRDYXJkV2lkdGgtTWF0aC5hYnMobGVmdENhcmRSZWN0KTtpZihsZWZ0Q2FyZE9mZnNldD49MzApe3ByZXZDb250cm9sLnN0eWxlLndpZHRoPWxlZnRDYXJkT2Zmc2V0KydweCd9ZWxzZXtwcmV2Q29udHJvbC5zdHlsZS53aWR0aD0xMDArJ3B4J319CmlmKHJpZ2h0Q2FyZCl7dmFyIHJpZ2h0Q2FyZFJlY3Q9cmlnaHRDYXJkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7dmFyIHJpZ2h0Q2FyZFN0eWxlPWdldENvbXB1dGVkU3R5bGUocmlnaHRDYXJkLG51bGwpO3ZhciBwYWRkaW5nTGVmdD1wYXJzZUludChyaWdodENhcmRTdHlsZS5wYWRkaW5nTGVmdCl8fDA7dmFyIHBhZGRpbmdSaWdodD1wYXJzZUludChyaWdodENhcmRTdHlsZS5wYWRkaW5nUmlnaHQpfHwwO3ZhciByaWdodENhcmRXaWR0aD1yaWdodENhcmQuY2xpZW50V2lkdGgtKHBhZGRpbmdMZWZ0K3BhZGRpbmdSaWdodCk7dmFyIHJpZ2h0Q2FyZE9mZnNldD1yaWdodENhcmRXaWR0aC0ocmlnaHRDYXJkUmVjdCtyaWdodENhcmRXaWR0aC13aW5kb3cuaW5uZXJXaWR0aCk7aWYocmlnaHRDYXJkT2Zmc2V0Pj0zMCl7bmV4dENvbnRyb2wuc3R5bGUud2lkdGg9cmlnaHRDYXJkT2Zmc2V0KydweCd9ZWxzZXtuZXh0Q29udHJvbC5zdHlsZS53aWR0aD0xMDArJ3B4J319fQpmdW5jdGlvbiB0OTU4X2luaXRQb3B1cChyZWMpe2lmKHJlYy5xdWVyeVNlbGVjdG9yKCcudDk1OCcpLmNsYXNzTGlzdC5jb250YWlucygndDk1OF9wcmV2aWV3JykpcmV0dXJuO3ZhciBmYWRlQ2FyZHM9cmVjLnF1ZXJ5U2VsZWN0b3JBbGwoJy50OTU4X19jYXJkX2ZhZGVbZGF0YS1yZXZpZXctYmxvY2tePSJyZXZpZXciXScpO2Zvcih2YXIgaT0wO2k8ZmFkZUNhcmRzLmxlbmd0aDtpKyspe2ZhZGVDYXJkc1tpXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXt2YXIgY2FyZD10aGlzO2lmKGNhcmQuY2xhc3NMaXN0LmNvbnRhaW5zKCd0OTU4X19jYXJkLXZpc2libGUnKSl7dDk1OF9zaG93UG9wdXAocmVjKTt2YXIgcG9wdXA9cmVjLnF1ZXJ5U2VsZWN0b3IoJy50LXBvcHVwJyk7dmFyIHJldmlld0lkPWNhcmQuZ2V0QXR0cmlidXRlKCdkYXRhLXJldmlldy1ibG9jaycpLnJlcGxhY2UoJ3JldmlldycsJycpO3ZhciByZXZpZXdQb3B1cD1wb3B1cC5xdWVyeVNlbGVjdG9yKCcudDk1OF9fcG9wdXAtaXRlbVtkYXRhLXJldmlldy1pbmRleD0iJytyZXZpZXdJZCsnIl0nKTt2YXIgcG9wdXBJdGVtcz1wb3B1cC5xdWVyeVNlbGVjdG9yQWxsKCcudDk1OF9fcG9wdXAtaXRlbScpO2Zvcih2YXIgaT0wO2k8cG9wdXBJdGVtcy5sZW5ndGg7aSsrKXtwb3B1cEl0ZW1zW2ldLnN0eWxlLmRpc3BsYXk9J25vbmUnfQpyZXZpZXdQb3B1cC5zdHlsZS5kaXNwbGF5PSdibG9jayd9fSl9fQpmdW5jdGlvbiB0OTU4X2NoZWNrUG9wdXBTaXplKHJlYyl7dmFyIHBvcHVwQ29udGFpbmVyPXJlYy5xdWVyeVNlbGVjdG9yKCcudC1wb3B1cF9fY29udGFpbmVyJyk7dmFyIHBvcHVwSGVpZ2h0PXBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZShwb3B1cENvbnRhaW5lcixudWxsKS5oZWlnaHQucmVwbGFjZSgncHgnLCcnKSk7dmFyIHdpbmRvd01hcmdpbj0xMjA7dmFyIHdpbmRvd0hlaWdodD13aW5kb3cuaW5uZXJIZWlnaHQtd2luZG93TWFyZ2luO2lmKHBvcHVwSGVpZ2h0PndpbmRvd0hlaWdodCl7cG9wdXBDb250YWluZXIuY2xhc3NMaXN0LmFkZCgndC1wb3B1cF9fY29udGFpbmVyLXN0YXRpYycpfWVsc2V7cG9wdXBDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgndC1wb3B1cF9fY29udGFpbmVyLXN0YXRpYycpfX0KZnVuY3Rpb24gdDk1OF9zaG93UG9wdXAocmVjKXt2YXIgYWxscmVjb3Jkcz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWxscmVjb3JkcycpO3ZhciBwb3B1cD1yZWMucXVlcnlTZWxlY3RvcignLnQtcG9wdXAnKTt2YXIgcG9wdXBDb250YWluZXI9cmVjLnF1ZXJ5U2VsZWN0b3IoJy50LXBvcHVwX19jb250YWluZXInKTt2YXIgcG9wdXBDbG9zZT1yZWMucXVlcnlTZWxlY3RvcignLnQtcG9wdXBfX2Nsb3NlJyk7cG9wdXAuc3R5bGUuZGlzcGxheT0nYmxvY2snO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtwb3B1cENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCd0LXBvcHVwX19jb250YWluZXItYW5pbWF0ZWQnKTtwb3B1cC5jbGFzc0xpc3QuYWRkKCd0LXBvcHVwX3Nob3cnKTt0OTU4X2NoZWNrUG9wdXBTaXplKHJlYyk7aWYod2luZG93Lmxhenk9PT0neSd8fGFsbHJlY29yZHMuZ2V0QXR0cmlidXRlKCdkYXRhLXRpbGRhLWxhenknKT09PSd5ZXMnKXt0X29uRnVuY0xvYWQoJ3RfbGF6eWxvYWRfdXBkYXRlJyxmdW5jdGlvbigpe3RfbGF6eWxvYWRfdXBkYXRlKCl9KX19LDUwKTtpZih0eXBlb2YgdF90cmlnZ2VyRXZlbnQ9PT0nZnVuY3Rpb24nKXRfdHJpZ2dlckV2ZW50KGRvY3VtZW50LmJvZHksJ3BvcHVwU2hvd2VkJyk7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCd0LWJvZHlfcG9wdXBzaG93ZWQnKTtwb3B1cC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLHQ5NThfbW91c2Vkb3duRXZlbnQpO3BvcHVwLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsdDk1OF9tb3VzZWRvd25FdmVudCk7cG9wdXBDbG9zZS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsdDk1OF9jbG9zZVBvcHVwKTtwb3B1cENsb3NlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0OTU4X2Nsb3NlUG9wdXApO2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLHQ5NThfa2V5ZG93bkV2ZW50KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyx0OTU4X2tleWRvd25FdmVudCl9CmZ1bmN0aW9uIHQ5NThfbW91c2Vkb3duRXZlbnQoZXZlbnQpe3ZhciB3aW5kb3dXaWR0aD13aW5kb3cuaW5uZXJXaWR0aDt2YXIgbWF4U2Nyb2xsQmFyV2lkdGg9MTc7dmFyIHdpbmRvd1dpdGhvdXRTY3JvbGxCYXI9d2luZG93V2lkdGgtbWF4U2Nyb2xsQmFyV2lkdGg7aWYoZXZlbnQuY2xpZW50WD53aW5kb3dXaXRob3V0U2Nyb2xsQmFyKXJldHVybjtpZihldmVudC50YXJnZXQ9PXRoaXMpdDk1OF9jbG9zZVBvcHVwKCl9CmZ1bmN0aW9uIHQ5NThfa2V5ZG93bkV2ZW50KGV2ZW50KXtpZihldmVudC5rZXlDb2RlPT0yNyl0OTU4X2Nsb3NlUG9wdXAoKX0KZnVuY3Rpb24gdDk1OF9jbG9zZVBvcHVwKCl7dmFyIHBvcHVwU2hvdz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudC1wb3B1cC50LXBvcHVwX3Nob3cnKTtpZihwb3B1cFNob3cpe2lmKHR5cGVvZiB0X3RyaWdnZXJFdmVudD09PSdmdW5jdGlvbicpdF90cmlnZ2VyRXZlbnQoZG9jdW1lbnQuYm9keSwncG9wdXBIaWRkZW4nKTtkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ3QtYm9keV9wb3B1cHNob3dlZCcpO3BvcHVwU2hvdy5jbGFzc0xpc3QucmVtb3ZlKCd0LXBvcHVwX3Nob3cnKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIHBvcHVwcz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudC1wb3B1cDpub3QoLnQtcG9wdXBfc2hvdyknKTtkb2N1bWVudC5ib2R5LnNjcm9sbFRvcD0wO2Zvcih2YXIgaT0wO2k8cG9wdXBzLmxlbmd0aDtpKyspe3BvcHVwc1tpXS5zdHlsZS5kaXNwbGF5PSdub25lJ319LDMwMCl9fQpmdW5jdGlvbiB0OTU4X19oaWRlTW9iaWxlU2xpZGVzKGFjdGl2ZVNsaWRlKXtpZighYWN0aXZlU2xpZGUpcmV0dXJuO3ZhciBzbGlkZVdyYXBwZXI9YWN0aXZlU2xpZGUuY2xvc2VzdCgnLnQ5NThfX3NsaWRlY29udGFpbmVyJyk7dmFyIHNsaWRlcz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChzbGlkZVdyYXBwZXIucXVlcnlTZWxlY3RvckFsbCgnLnQtc2xkc19faXRlbTpub3QoLnQtc2xkc19faXRlbV9kdW1teSk6bm90KFthcmlhLWhpZGRlbj0idHJ1ZSJdKScpKTt2YXIgc2xpZGVXaWR0aD1nZXRDb21wdXRlZFN0eWxlKGFjdGl2ZVNsaWRlKS53aWR0aDt2YXIgbWF4U2xpZGVzVmlld2VkPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aD45NjA/NTozO2lmKHNsaWRlcy5sZW5ndGg8PW1heFNsaWRlc1ZpZXdlZCoyKXJldHVybjt2YXIgYWN0aXZlU2xpZGVJbmRleD1hY3RpdmVTbGlkZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2xpZGUtaW5kZXgnKTthY3RpdmVTbGlkZUluZGV4PXBhcnNlSW50KGFjdGl2ZVNsaWRlSW5kZXgsMTApO3ZhciBhY3RpdmVJbmRleExpc3Q9W2FjdGl2ZVNsaWRlSW5kZXhdO2Zvcih2YXIgaT0xO2k8bWF4U2xpZGVzVmlld2VkO2krKyl7aWYoYWN0aXZlU2xpZGVJbmRleCtpPD1zbGlkZXMubGVuZ3RoKXthY3RpdmVJbmRleExpc3QucHVzaChhY3RpdmVTbGlkZUluZGV4K2kpfWVsc2V7YWN0aXZlSW5kZXhMaXN0LnB1c2goaSl9CmlmKGFjdGl2ZVNsaWRlSW5kZXgtaT4wKXthY3RpdmVJbmRleExpc3QucHVzaChhY3RpdmVTbGlkZUluZGV4LWkpfWVsc2V7YWN0aXZlSW5kZXhMaXN0LnB1c2goc2xpZGVzLmxlbmd0aCsxLWkpfX0KdmFyIGlubmFjdGl2ZUNsYXNzPSd0LXNsZHNfX2l0ZW0taW5uYWN0aXZlJztzbGlkZXMuZm9yRWFjaChmdW5jdGlvbihzbGlkZSl7dmFyIGlzQWN0aXZlSW5kZXhTbGlkZT1hY3RpdmVJbmRleExpc3Quc29tZShmdW5jdGlvbihpbmRleCl7cmV0dXJuIHBhcnNlSW50KHNsaWRlLmdldEF0dHJpYnV0ZSgnZGF0YS1zbGlkZS1pbmRleCcpLDEwKT09PWluZGV4fSk7aXNBY3RpdmVJbmRleFNsaWRlP3NsaWRlLmNsYXNzTGlzdC5yZW1vdmUoaW5uYWN0aXZlQ2xhc3MpOnNsaWRlLmNsYXNzTGlzdC5hZGQoaW5uYWN0aXZlQ2xhc3MpO3NsaWRlLnN0eWxlLndpZHRoPXNsaWRlV2lkdGgmJiFpc0FjdGl2ZUluZGV4U2xpZGU/c2xpZGVXaWR0aDonJ30pfQpmdW5jdGlvbiB0ODQ5X2luaXQocmVjSWQpe3ZhciByZWM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlYycrcmVjSWQpO2lmKCFyZWMpcmV0dXJuO3ZhciB0b2dnbGVycz1yZWMucXVlcnlTZWxlY3RvckFsbCgnLnQ4NDlfX2hlYWRlcicpO3ZhciBpc0xhenk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FsbHJlY29yZHMnKS5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGlsZGEtbGF6eScpO3ZhciBhY2NvcmRpb249cmVjLnF1ZXJ5U2VsZWN0b3IoJy50ODQ5X19hY2NvcmRpb24nKTtpZihhY2NvcmRpb24pe2FjY29yZGlvbj1hY2NvcmRpb24uZ2V0QXR0cmlidXRlKCdkYXRhLWFjY29yZGlvbicpfWVsc2V7YWNjb3JkaW9uPSdmYWxzZSd9CnZhciBjYWNoZWRIZWlnaHQ9MDt2YXIgY2FjaGVkVG9wPTA7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0b2dnbGVycyxmdW5jdGlvbih0b2dnbGVyKXt0b2dnbGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpe3ZhciB0YXJnZXQ9dG9nZ2xlcjt2YXIgY29udGVudD10YXJnZXQubmV4dEVsZW1lbnRTaWJsaW5nO3ZhciB0cmlnZ2VyQnV0dG9uPXRhcmdldC5xdWVyeVNlbGVjdG9yKCcudDg0OV9fdHJpZ2dlci1idXR0b24nKTtpZihhY2NvcmRpb249PT0ndHJ1ZScpe0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodG9nZ2xlcnMsZnVuY3Rpb24oaGVhZGVyKXtpZih0YXJnZXQhPT1oZWFkZXIpe2hlYWRlci5jbGFzc0xpc3QucmVtb3ZlKCd0ODQ5X19vcGVuZWQnKTt0ODQ5X3NsaWRlVXAoaGVhZGVyLm5leHRFbGVtZW50U2libGluZyx0YXJnZXQpfX0pfQppZih0cmlnZ2VyQnV0dG9uKXt2YXIgaXNFeHBhbmRlZD10cmlnZ2VyQnV0dG9uLmdldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcpPT09J3RydWUnO3RyaWdnZXJCdXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywhaXNFeHBhbmRlZCk7Y29udGVudC5oaWRkZW49aXNFeHBhbmRlZH0KdGFyZ2V0LmNsYXNzTGlzdC50b2dnbGUoJ3Q4NDlfX29wZW5lZCcpO3RhcmdldC5zdHlsZS5wb2ludGVyRXZlbnRzPSdub25lJzt0ODQ5X3NsaWRlVG9nZ2xlKHRhcmdldC5uZXh0RWxlbWVudFNpYmxpbmcsdGFyZ2V0KTtpZih3aW5kb3cubGF6eT09PSd5J3x8aXNMYXp5PT09J3llcycpe3Rfb25GdW5jTG9hZCgndF9sYXp5bG9hZF91cGRhdGUnLGZ1bmN0aW9uKCl7dF9sYXp5bG9hZF91cGRhdGUoKX0pfX0pfSk7ZnVuY3Rpb24gdDg0OV9zbGlkZVRvZ2dsZSh0YXJnZXQsdHJpZ2dlckVsZW1lbnQsZHVyYXRpb24pe2lmKCF0YXJnZXQpcmV0dXJuO2lmKCFkdXJhdGlvbiYmZHVyYXRpb24hPT0wKWR1cmF0aW9uPTMwMDtpZih3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLmRpc3BsYXk9PT0nbm9uZScpe3JldHVybiB0ODQ5X3NsaWRlRG93bih0YXJnZXQsdHJpZ2dlckVsZW1lbnQsZHVyYXRpb24pfWVsc2V7Y2FjaGVkSGVpZ2h0PTA7cmV0dXJuIHQ4NDlfc2xpZGVVcCh0YXJnZXQsdHJpZ2dlckVsZW1lbnQsZHVyYXRpb24pfX0KZnVuY3Rpb24gdDg0OV9zbGlkZVVwKHRhcmdldCx0cmlnZ2VyRWxlbWVudCxkdXJhdGlvbil7aWYoIXRhcmdldClyZXR1cm47aWYoIWR1cmF0aW9uJiZkdXJhdGlvbiE9PTApZHVyYXRpb249MzAwO3RhcmdldC5zdHlsZS50cmFuc2l0aW9uUHJvcGVydHk9J2hlaWdodCwgbWFyZ2luLCBwYWRkaW5nJzt0YXJnZXQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPWR1cmF0aW9uKydtcyc7dGFyZ2V0LnN0eWxlLmJveFNpemluZz0nYm9yZGVyLWJveCc7dGFyZ2V0LnN0eWxlLmhlaWdodD10YXJnZXQub2Zmc2V0SGVpZ2h0KydweCc7dGFyZ2V0Lm9mZnNldEhlaWdodDt0YXJnZXQuc3R5bGUub3ZlcmZsb3c9J2hpZGRlbic7dGFyZ2V0LnN0eWxlLmhlaWdodD0nMCc7dGFyZ2V0LnN0eWxlLnBhZGRpbmdUb3A9JzAnO3RhcmdldC5zdHlsZS5wYWRkaW5nQm90dG9tPScwJzt0YXJnZXQuc3R5bGUubWFyZ2luVG9wPScwJzt0YXJnZXQuc3R5bGUubWFyZ2luQm90dG9tPScwJztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJpZ2dlckVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cz0nYXV0byc7dGFyZ2V0LnN0eWxlLmRpc3BsYXk9J25vbmUnO3RhcmdldC5zdHlsZS5oZWlnaHQ9Jyc7dGFyZ2V0LnN0eWxlLnBhZGRpbmdUb3A9Jyc7dGFyZ2V0LnN0eWxlLnBhZGRpbmdCb3R0b209Jyc7dGFyZ2V0LnN0eWxlLm1hcmdpblRvcD0nJzt0YXJnZXQuc3R5bGUubWFyZ2luQm90dG9tPScnO3RhcmdldC5zdHlsZS5vdmVyZmxvdz0nJzt0YXJnZXQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPScnO3RhcmdldC5zdHlsZS50cmFuc2l0aW9uUHJvcGVydHk9Jyd9LGR1cmF0aW9uKX0KZnVuY3Rpb24gdDg0OV9zbGlkZURvd24odGFyZ2V0LHRyaWdnZXJFbGVtZW50LGR1cmF0aW9uKXtpZighdGFyZ2V0KXJldHVybjtpZighZHVyYXRpb24mJmR1cmF0aW9uIT09MClkdXJhdGlvbj0zMDA7dGFyZ2V0LnN0eWxlLmRpc3BsYXk9Jyc7dmFyIGNhc2hlZERpc3BsYXk9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGFyZ2V0KS5kaXNwbGF5O2lmKGNhc2hlZERpc3BsYXk9PT0nbm9uZScpY2FzaGVkRGlzcGxheT0nYmxvY2snO3RhcmdldC5zdHlsZS5kaXNwbGF5PWNhc2hlZERpc3BsYXk7dmFyIHRhcmdldEhlaWdodD10YXJnZXQub2Zmc2V0SGVpZ2h0O3ZhciB0YXJnZXRUb3A9dGFyZ2V0Lm9mZnNldFRvcDtpZih3aW5kb3cudmlzdWFsVmlld3BvcnQpe3ZhciB2aXNpYmxlVG9wPXRhcmdldFRvcC13aW5kb3cudmlzdWFsVmlld3BvcnQucGFnZVRvcDtpZihjYWNoZWRUb3AmJmFjY29yZGlvbj09PSd0cnVlJyYmdGFyZ2V0VG9wPmNhY2hlZFRvcCYmd2luZG93LnNjcm9sbFk+Y2FjaGVkVG9wKXt3aW5kb3cuc2Nyb2xsVG8od2luZG93LnNjcm9sbFgsdGFyZ2V0VG9wLWNhY2hlZEhlaWdodC12aXNpYmxlVG9wKX19CnRhcmdldC5zdHlsZS5vdmVyZmxvdz0naGlkZGVuJzt0YXJnZXQuc3R5bGUuaGVpZ2h0PScwJzt0YXJnZXQuc3R5bGUucGFkZGluZ1RvcD0nMCc7dGFyZ2V0LnN0eWxlLnBhZGRpbmdCb3R0b209JzAnO3RhcmdldC5zdHlsZS5tYXJnaW5Ub3A9JzAnO3RhcmdldC5zdHlsZS5tYXJnaW5Cb3R0b209JzAnO3RhcmdldC5vZmZzZXRIZWlnaHQ7dGFyZ2V0LnN0eWxlLmJveFNpemluZz0nYm9yZGVyLWJveCc7dGFyZ2V0LnN0eWxlLnRyYW5zaXRpb25Qcm9wZXJ0eT0naGVpZ2h0LCBtYXJnaW4sIHBhZGRpbmcnO3RhcmdldC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249ZHVyYXRpb24rJ21zJzt0YXJnZXQuc3R5bGUuaGVpZ2h0PXRhcmdldEhlaWdodCsncHgnO3RhcmdldC5zdHlsZS5wYWRkaW5nVG9wPScnO3RhcmdldC5zdHlsZS5wYWRkaW5nQm90dG9tPScnO3RhcmdldC5zdHlsZS5tYXJnaW5Ub3A9Jyc7dGFyZ2V0LnN0eWxlLm1hcmdpbkJvdHRvbT0nJztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJpZ2dlckVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cz0nYXV0byc7dGFyZ2V0LnN0eWxlLmhlaWdodD0nJzt0YXJnZXQuc3R5bGUub3ZlcmZsb3c9Jyc7dGFyZ2V0LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj0nJzt0YXJnZXQuc3R5bGUudHJhbnNpdGlvblByb3BlcnR5PScnO2NhY2hlZEhlaWdodD10YXJnZXRIZWlnaHQ7Y2FjaGVkVG9wPXRhcmdldFRvcH0sZHVyYXRpb24pfX0KZnVuY3Rpb24gdDM5N19pbml0KHJlY2lkKXt2YXIgcmVjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWMnK3JlY2lkKTtpZighcmVjKXJldHVybjt2YXIgYWxsUmVjb3Jkcz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWxscmVjb3JkcycpO3ZhciB0aWxkYU1vZGU9YWxsUmVjb3Jkcz9hbGxSZWNvcmRzLmdldEF0dHJpYnV0ZSgnZGF0YS10aWxkYS1tb2RlJyk6Jyc7dmFyIHRpbGRhTGF6eU1vZGU9YWxsUmVjb3Jkcz9hbGxSZWNvcmRzLmdldEF0dHJpYnV0ZSgnZGF0YS10aWxkYS1sYXp5Jyk6Jyc7dmFyIHRhYnM9cmVjP3JlYy5xdWVyeVNlbGVjdG9yQWxsKCcudDM5N19fdGFiJyk6W107aWYodGlsZGFNb2RlIT09J2VkaXQnJiZ0aWxkYU1vZGUhPT0ncHJldmlldycpe3QzOTdfc2Nyb2xsVG9UYWJzKHJlY2lkKTt2YXIgYWN0aXZlVGFiPXJlYy5xdWVyeVNlbGVjdG9yKCcudDM5N19fdGFiX2FjdGl2ZScpO2lmKGFjdGl2ZVRhYil7dmFyIGN1cnJlbnRCdXR0b249YWN0aXZlVGFiLnF1ZXJ5U2VsZWN0b3IoJy50Mzk3X190aXRsZScpO2lmKGN1cnJlbnRCdXR0b24pe2N1cnJlbnRCdXR0b24uc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsMCk7Y3VycmVudEJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCEwKX0KdmFyIGN1cnJlbnRUYWJJbmRleD1hY3RpdmVUYWIuZ2V0QXR0cmlidXRlKCdkYXRhLXRhYi1udW1iZXInKTt2YXIgd3JhcHBlcj1yZWMucXVlcnlTZWxlY3RvcignLnQzOTdfX3dyYXBwZXInKTt3cmFwcGVyLnNldEF0dHJpYnV0ZSgnZGF0YS10YWItY3VycmVudCcsY3VycmVudFRhYkluZGV4KX19CnQzOTdfYWRkQXR0cmlidXRlc1RvQmxvY2tzSW5zaWRlVGFicyhyZWNpZCx0YWJzKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHRhYnMsZnVuY3Rpb24odGFiLGkpe3RhYi5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGFiLWluZGV4JyxpKTt0YWIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGV2ZW50KXt2YXIgdGFiTnVtYmVyPWkrMTt2YXIgdGFyZ2V0VGFiPWV2ZW50LnRhcmdldC5jbG9zZXN0KCcudDM5N19fdGFiJyk7aWYodGFyZ2V0VGFiJiZ0YXJnZXRUYWIuY2xhc3NMaXN0LmNvbnRhaW5zKCd0Mzk3X190YWJfYWN0aXZlJykmJiFldmVudC5pc1RydXN0ZWQpcmV0dXJuO3QzOTdfc3dpdGNoQmV0d2VlblRhYnMocmVjaWQsdGFiTnVtYmVyLHRhcmdldFRhYix0aWxkYU1vZGUsdGlsZGFMYXp5TW9kZSl9KTt0YWIuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsZnVuY3Rpb24oZXZlbnQpe3ZhciBjdXJyZW50SW5kZXg9TnVtYmVyKHJlYy5xdWVyeVNlbGVjdG9yKCcudDM5N19fd3JhcHBlcicpLmdldEF0dHJpYnV0ZSgnZGF0YS10YWItY3VycmVudCcpKTt2YXIgdGFyZ2V0VGFiPWV2ZW50LnRhcmdldC5jbG9zZXN0KCcudDM5N19fdGFiJyk7aWYodGFyZ2V0VGFiJiZ0YXJnZXRUYWIuY2xhc3NMaXN0LmNvbnRhaW5zKCd0Mzk3X190YWJfYWN0aXZlJykmJiFldmVudC5pc1RydXN0ZWQpcmV0dXJuO3ZhciBwcmV2ZW50PSExO3N3aXRjaChldmVudC5rZXkpe2Nhc2UgJ0xlZnQnOmNhc2UgJ0Fycm93TGVmdCc6Y3VycmVudEluZGV4PWN1cnJlbnRJbmRleD09PTE/dGFicy5sZW5ndGg6Y3VycmVudEluZGV4LTE7dGFyZ2V0VGFiPXJlYy5xdWVyeVNlbGVjdG9yKCdbZGF0YS10YWItbnVtYmVyPSInK2N1cnJlbnRJbmRleCsnIl0nKTt0Mzk3X3N3aXRjaEJldHdlZW5UYWJzKHJlY2lkLGN1cnJlbnRJbmRleCx0YXJnZXRUYWIsdGlsZGFNb2RlLHRpbGRhTGF6eU1vZGUpO3QzOTdfc2hvd0FjdGl2ZVRhYkZyb21LZXlib2FyZChyZWNpZCxjdXJyZW50SW5kZXgsdGFicyk7cHJldmVudD0hMDticmVhaztjYXNlICdSaWdodCc6Y2FzZSAnQXJyb3dSaWdodCc6Y3VycmVudEluZGV4PWN1cnJlbnRJbmRleD09PXRhYnMubGVuZ3RoPzE6Y3VycmVudEluZGV4KzE7dGFyZ2V0VGFiPXJlYy5xdWVyeVNlbGVjdG9yKCdbZGF0YS10YWItbnVtYmVyPSInK2N1cnJlbnRJbmRleCsnIl0nKTt0Mzk3X3N3aXRjaEJldHdlZW5UYWJzKHJlY2lkLGN1cnJlbnRJbmRleCx0YXJnZXRUYWIsdGlsZGFNb2RlLHRpbGRhTGF6eU1vZGUpO3QzOTdfc2hvd0FjdGl2ZVRhYkZyb21LZXlib2FyZChyZWNpZCxjdXJyZW50SW5kZXgsdGFicyk7cHJldmVudD0hMDticmVhaztkZWZhdWx0OmJyZWFrfQppZihwcmV2ZW50KXtldmVudC5zdG9wUHJvcGFnYXRpb24oKTtldmVudC5wcmV2ZW50RGVmYXVsdCgpfX0pfSk7aWYodGFicy5sZW5ndGgpe3QzOTdfYWxsdGFic191cGRhdGVDb250ZW50KHJlY2lkKTt0Mzk3X3VwZGF0ZUNvbnRlbnRCeVNlbGVjdChyZWNpZCk7dmFyIGJnQ29sb3I9cmVjP3JlYy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I6JyNmZmZmZmYnO3ZhciBiZ0NvbG9yVGFyZ2V0cz1yZWMucXVlcnlTZWxlY3RvckFsbCgnLnQzOTdfX3NlbGVjdCwgLnQzOTdfX2ZpcmVmb3hmaXgnKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGJnQ29sb3JUYXJnZXRzLGZ1bmN0aW9uKHRhcmdldCl7dGFyZ2V0LnN0eWxlLmJhY2tncm91bmQ9YmdDb2xvcn0pfQpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSl7aWYoZS50YXJnZXQuY2xvc2VzdCgnW2hyZWYqPSIjIS90YWIvJytyZWNpZCsnIl0nKSl7dmFyIGN1cnJlbnRMaW5rPWUudGFyZ2V0LmNsb3Nlc3QoJ1tocmVmKj0iIyEvdGFiLycrcmVjaWQrJyJdJyk7dmFyIGhhc2g9Y3VycmVudExpbmsuaGFzaDt0Mzk3X3Njcm9sbFRvVGFicyhyZWNpZCxoYXNoKX19KX0KZnVuY3Rpb24gdDM5N19hZGRBdHRyaWJ1dGVzVG9CbG9ja3NJbnNpZGVUYWJzKHJlY2lkLHRhYnMpe2lmKHRhYnMubGVuZ3RoPjApe0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodGFicyxmdW5jdGlvbih0YWIsaSl7dmFyIGZpcnN0QmxvY2tJbnNpZGVUYWJJZD10YWIuZ2V0QXR0cmlidXRlKCdkYXRhLXRhYi1yZWMtaWRzJykuc3BsaXQoJywnKVswXTt2YXIgZmlyc3RCbG9ja0luc2lkZVRhYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcmVjJytmaXJzdEJsb2NrSW5zaWRlVGFiSWQpO2lmKGZpcnN0QmxvY2tJbnNpZGVUYWImJiFmaXJzdEJsb2NrSW5zaWRlVGFiLmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbGxlZGJ5Jykpe2ZpcnN0QmxvY2tJbnNpZGVUYWIuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsbGVkYnknLCd0YWInKyhpKzEpKydfJytyZWNpZCl9CmlmKGZpcnN0QmxvY2tJbnNpZGVUYWImJiFmaXJzdEJsb2NrSW5zaWRlVGFiLmdldEF0dHJpYnV0ZSgncm9sZScpKXtmaXJzdEJsb2NrSW5zaWRlVGFiLnNldEF0dHJpYnV0ZSgncm9sZScsJ3RhYnBhbmVsJyl9CmlmKGZpcnN0QmxvY2tJbnNpZGVUYWImJiFmaXJzdEJsb2NrSW5zaWRlVGFiLmdldEF0dHJpYnV0ZSgndGFiaW5kZXgnKSl7Zmlyc3RCbG9ja0luc2lkZVRhYi5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywnMCcpfX0pfX0KZnVuY3Rpb24gdDM5N19zd2l0Y2hCZXR3ZWVuVGFicyhyZWNpZCx0YWJOdW1iZXIsdGFyZ2V0VGFiLHRpbGRhTW9kZSx0aWxkYUxhenlNb2RlKXt2YXIgcmVjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWMnK3JlY2lkKTtpZighcmVjKXJldHVybjt2YXIgYWN0aXZlVGFiPXJlYy5xdWVyeVNlbGVjdG9yKCcudDM5N19fdGFiX2FjdGl2ZScpO2lmKGFjdGl2ZVRhYil7YWN0aXZlVGFiLmNsYXNzTGlzdC5yZW1vdmUoJ3QzOTdfX3RhYl9hY3RpdmUnKTt2YXIgYWN0aXZlQnV0dG9uPWFjdGl2ZVRhYi5xdWVyeVNlbGVjdG9yKCcudDM5N19fdGl0bGUnKTtpZihhY3RpdmVCdXR0b24pe2FjdGl2ZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywtMSk7YWN0aXZlQnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsITEpfX0KdGFyZ2V0VGFiLmNsYXNzTGlzdC5hZGQoJ3QzOTdfX3RhYl9hY3RpdmUnKTt2YXIgdGFyZ2V0QnV0dG9uPXRhcmdldFRhYi5xdWVyeVNlbGVjdG9yKCcudDM5N19fdGl0bGUnKTtpZih0YXJnZXRCdXR0b24pe3RhcmdldEJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywwKTt0YXJnZXRCdXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywhMCl9CnQzOTdfcmVtb3ZlVXJsKCk7aWYodGlsZGFNb2RlIT09J2VkaXQnJiZ0aWxkYU1vZGUhPT0ncHJldmlldycmJnRhYk51bWJlciYmdHlwZW9mIGhpc3RvcnkucmVwbGFjZVN0YXRlIT09J3VuZGVmaW5lZCcpe3RyeXt3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoJycsJycsd2luZG93LmxvY2F0aW9uLm9yaWdpbit3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUrJyMhL3RhYi8nK3JlY2lkKyctJyt0YWJOdW1iZXIpfWNhdGNoKGVycil7fX0KcmVjLnF1ZXJ5U2VsZWN0b3IoJy50Mzk3X193cmFwcGVyJykuc2V0QXR0cmlidXRlKCdkYXRhLXRhYi1jdXJyZW50Jyx0YWJOdW1iZXIpO3QzOTdfYWxsdGFic191cGRhdGVDb250ZW50KHJlY2lkKTt0Mzk3X3VwZGF0ZVNlbGVjdChyZWNpZCk7dmFyIGhvb2tCbG9ja3M9dGFyZ2V0VGFiLmdldEF0dHJpYnV0ZSgnZGF0YS10YWItcmVjLWlkcycpLnNwbGl0KCcsJyk7dmFyIGV2ZW50PWRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO2V2ZW50LmluaXRFdmVudCgnZGlzcGxheUNoYW5nZWQnLCEwLCEwKTt2YXIgaG9va3NDb3B5PWhvb2tCbG9ja3Muc2xpY2UoKTtob29rc0NvcHkuZm9yRWFjaChmdW5jdGlvbihyZWNpZCl7dmFyIGN1cnJlbnRSZWM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlYycrcmVjaWQpO2lmKCFjdXJyZW50UmVjKXJldHVybjt2YXIgcmVjb3JkVHlwZT1jdXJyZW50UmVjLmdldEF0dHJpYnV0ZSgnZGF0YS1wYXJlbnR0cGxpZCcpfHxjdXJyZW50UmVjLmdldEF0dHJpYnV0ZSgnZGF0YS1yZWNvcmQtdHlwZScpO2lmKHJlY29yZFR5cGU9PT0nMzk1J3x8cmVjb3JkVHlwZT09PSczOTcnKXt2YXIgc2VsZWN0b3I9Jy50JytyZWNvcmRUeXBlKydfX3RhYl9hY3RpdmUnO3ZhciBhY3RpdmVJRHM9Y3VycmVudFJlYy5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKS5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGFiLXJlYy1pZHMnKTthY3RpdmVJRHM9YWN0aXZlSURzLnNwbGl0KCcsJyk7aG9va0Jsb2Nrcz1ob29rQmxvY2tzLmNvbmNhdChhY3RpdmVJRHMpfX0pO2hvb2tCbG9ja3MuZm9yRWFjaChmdW5jdGlvbihjdXJSZWNpZCl7dmFyIGN1cnJlbnRSZWM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlYycrY3VyUmVjaWQpO2lmKCFjdXJyZW50UmVjKXJldHVybjt2YXIgY3VycmVudFJlY0NoaWxkcmVuPWN1cnJlbnRSZWMucXVlcnlTZWxlY3RvckFsbCgnLnQtZmVlZCwgLnQtc3RvcmUsIC50LXN0b3JlX19wcm9kdWN0LXNuaXBwZXQsIC50MTE3LCAudDEyMSwgLnQxMzIsIC50MjIzLCAudDIyNiwgLnQyMjgsIC50MjI5LCAudDIzMCwgLnQyNjgsIC50Mjc5LCAudDM0MSwgLnQzNDYsIC50MzQ3LCAudDM0OSwgLnQzNTEsIC50MzUzLCAudDM4NCwgLnQzODUsIC50Mzg2LCAudDM5NiwgLnQ0MDAsIC50NDA0LCAudDQwOSwgLnQ0MTAsIC50NDEyLCAudDQxOCwgLnQ0MjIsIC50NDI1LCAudDQyOCwgLnQ0MzMsIC50NDQ4LCAudDQ1NiwgLnQ0NzcsIC50NDc4LCAudDQ4MCwgLnQ0ODYsIC50NDk4LCAudDUwNCwgLnQ1MDYsIC50NTA5LCAudDUxMSwgLnQ1MTcsIC50NTE4LCAudDUxOSwgLnQ1MjAsIC50NTMyLCAudDUzMywgLnQ1MzgsIC50NTM5LCAudDU0NCwgLnQ1NDUsIC50NTUyLCAudDU1NCwgLnQ1NjksIC50NTcwLCAudDU3NywgLnQ1OTIsIC50NTk4LCAudDU5OSwgLnQ2MDEsIC50NjA0LCAudDYwNSwgLnQ2MDksIC50NjE1LCAudDYxNiwgLnQ2NTAsIC50NjU5LCAudDY3MCwgLnQ2NzUsIC50Njg2LCAudDY4OCwgLnQ2OTQsIC50Njk4LCAudDcwMCwgLnQ3MjYsIC50NzI4LCAudDczMCwgLnQ3MzQsIC50NzM4LCAudDc0MCwgLnQ3NDQsIC50NzU0LCAudDc2MCwgLnQ3NjIsIC50NzY0LCAudDc3NCwgLnQ3NzYsIC50Nzc4LCAudDc4MCwgLnQ3ODYsIC50Nzk4LCAudDc5OSwgLnQ4MDEsIC50ODEzLCAudDgxNCwgLnQ4MjIsIC50ODI2LCAudDgyNywgLnQ4MjksIC50ODQyLCAudDg0MywgLnQ4NDksIC50ODUwLCAudDg1MSwgLnQ4NTYsIC50ODU4LCAudDg1OSwgLnQ4NjAsIC50ODgxLCAudDg4OSwgLnQ5MDIsIC50OTEyLCAudDkyMywgLnQ5MzcsIC50OTU4LCAudDk1OSwgLnQ5NzksIC50OTgyLCAudDk4MywgLnQ5ODksIC50OTk0LCAudDEwNjcsIC50MTA2OCwgLnQxMDY5LCAudDEwNzAsIC50MTA3MSwgLnQxMDcyLCAudDEwNTMsIC50MTE4NiwgLnQzNjgnKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGN1cnJlbnRSZWNDaGlsZHJlbixmdW5jdGlvbihjaGlsZCl7Y2hpbGQuZGlzcGF0Y2hFdmVudChldmVudCl9KTt2YXIgZGlzcGxheUNoYW5nZWRCbG9jaz1jdXJyZW50UmVjLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWRpc3BsYXktY2hhbmdlZD0idHJ1ZSJdJyk7aWYoZGlzcGxheUNoYW5nZWRCbG9jaylkaXNwbGF5Q2hhbmdlZEJsb2NrLmRpc3BhdGNoRXZlbnQoZXZlbnQpfSk7dmFyIGdhbGF4eUVmZmVjdEJsb2Nrcz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudDgyNicpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZ2FsYXh5RWZmZWN0QmxvY2tzLGZ1bmN0aW9uKGdhbGF4eUVmZmVjdEJsb2NrKXtnYWxheHlFZmZlY3RCbG9jay5kaXNwYXRjaEV2ZW50KGV2ZW50KX0pO2lmKHdpbmRvdy5sYXp5PT09J3knfHx0aWxkYUxhenlNb2RlPT09J3llcycpe3Rfb25GdW5jTG9hZCgndF9sYXp5bG9hZF91cGRhdGUnLGZ1bmN0aW9uKCl7dF9sYXp5bG9hZF91cGRhdGUoKX0pfX0KZnVuY3Rpb24gdDM5N19zaG93QWN0aXZlVGFiRnJvbUtleWJvYXJkKHJlY2lkLGN1cnJlbnRJbmRleCx0YWJzKXt2YXIgcmVjPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNyZWMnK3JlY2lkKTt2YXIgY3VycmVudFRhYj1yZWMucXVlcnlTZWxlY3RvcignW2RhdGEtdGFiLW51bWJlcj0iJytjdXJyZW50SW5kZXgrJyJdJyk7aWYoIWN1cnJlbnRUYWIpcmV0dXJuO3ZhciBjdXJyZW50QnV0dG9uPWN1cnJlbnRUYWIucXVlcnlTZWxlY3RvcignLnQzOTdfX3RpdGxlJyk7aWYoY3VycmVudEJ1dHRvbil7Y3VycmVudEJ1dHRvbi5mb2N1cygpfQp2YXIgdGFiTGlzdD1yZWMucXVlcnlTZWxlY3RvcignLnQzOTdfX3dyYXBwZXInKTtpZih0YWJMaXN0KXRhYkxpc3Quc2V0QXR0cmlidXRlKCdkYXRhLXRhYi1jdXJyZW50JyxjdXJyZW50SW5kZXgpfQpmdW5jdGlvbiB0Mzk3X2FsbHRhYnNfdXBkYXRlQ29udGVudChyZWNpZCl7dmFyIHJlYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjJytyZWNpZCk7aWYoIXJlYylyZXR1cm47dmFyIHRhYnM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocmVjLnF1ZXJ5U2VsZWN0b3JBbGwoJy50Mzk3X190YWI6bm90KC50Mzk3X190YWJfYWN0aXZlKScpKTt2YXIgYWN0aXZlVGFiPXJlYy5xdWVyeVNlbGVjdG9yKCcudDM5N19fdGFiX2FjdGl2ZScpO3ZhciBzZWxlY3Q9cmVjLnF1ZXJ5U2VsZWN0b3IoJy50Mzk3X19zZWxlY3QnKTtpZighYWN0aXZlVGFiKXJldHVybjt2YXIgaG9va0Jsb2Nrcz1hY3RpdmVUYWIuZ2V0QXR0cmlidXRlKCdkYXRhLXRhYi1yZWMtaWRzJykuc3BsaXQoJywnKTt2YXIgbm9BY3RpdmU9W107dmFyIHBvcHVwQmxvY2tzPVsxOTAsMjE3LDMxMiwzMzEsMzU4LDM2NCwzNjUsMzkwLDcwMiw3MDYsNzQ2LDc1MCw3NTYsNzY4LDg2Miw4NjgsODkwLDk0NSwxMDEzLDEwMTQsXTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHRhYnMsZnVuY3Rpb24odGFiKXtpZih0YWIhPT1hY3RpdmVUYWIpe3ZhciBub0FjdGl2ZUhvb2tzPXRhYi5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGFiLXJlYy1pZHMnKS5zcGxpdCgnLCcpO25vQWN0aXZlSG9va3MuZm9yRWFjaChmdW5jdGlvbihob29rKXtpZihub0FjdGl2ZS5pbmRleE9mKGhvb2spPT09LTEmJmhvb2tCbG9ja3MuaW5kZXhPZihob29rKT09PS0xKW5vQWN0aXZlLnB1c2goaG9vayk7dmFyIHRhYkJsb2NrPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWMnK2hvb2spO3ZhciB0YWJCbG9ja0lkPXRhYkJsb2NrP3RhYkJsb2NrLmdldEF0dHJpYnV0ZSgnZGF0YS1wYXJlbnR0cGxpZCcpfHx0YWJCbG9jay5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVjb3JkLXR5cGUnKTpudWxsO2lmKHRhYkJsb2NrSWQ9PT0nMzk3J3x8dGFiQmxvY2tJZD09PSczOTUnKXt2YXIgYWN0aXZlVGFiPXRhYkJsb2NrLnF1ZXJ5U2VsZWN0b3IoJy50Mzk3X190YWJfYWN0aXZlLCAudDM5NV9fdGFiX2FjdGl2ZScpO2lmKGFjdGl2ZVRhYil7dmFyIG5vQWN0aXZlU3ViSG9va3M9YWN0aXZlVGFiLmdldEF0dHJpYnV0ZSgnZGF0YS10YWItcmVjLWlkcycpLnNwbGl0KCcsJyk7bm9BY3RpdmVTdWJIb29rcy5mb3JFYWNoKGZ1bmN0aW9uKHN1Ymhvb2spe2lmKG5vQWN0aXZlLmluZGV4T2Yoc3ViaG9vayk9PT0tMSYmaG9va0Jsb2Nrcy5pbmRleE9mKHN1Ymhvb2spPT09LTEpCm5vQWN0aXZlLnB1c2goc3ViaG9vayl9KX19fSl9fSk7aWYodDM5N19jaGVja1Zpc2liaWxsaXR5RWwoYWN0aXZlVGFiKXx8dDM5N19jaGVja1Zpc2liaWxsaXR5RWwoc2VsZWN0KSl7aG9va0Jsb2Nrcy5mb3JFYWNoKGZ1bmN0aW9uKGhvb2spe2lmKCFob29rKXJldHVybjt2YXIgaG9va0VsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWMnK2hvb2spO3ZhciBob29rRWxSZWNvcmRUeXBlPWhvb2tFbD9ob29rRWwuZ2V0QXR0cmlidXRlKCdkYXRhLXBhcmVudHRwbGlkJyl8fGhvb2tFbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVjb3JkLXR5cGUnKTonJztpZihob29rRWwpe2hvb2tFbC5jbGFzc0xpc3QucmVtb3ZlKCd0Mzk3X19vZmYnKTtob29rRWwuY2xhc3NMaXN0LnJlbW92ZSgndDM5NV9fb2ZmJyk7aG9va0VsLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCExKTtob29rRWwuc3R5bGUub3BhY2l0eT0nJ30KdDM5N191cGRhdGVUYWJzQnlIb29rKGhvb2tFbFJlY29yZFR5cGUsaG9va0VsLGhvb2sscmVjaWQpfSl9ZWxzZXtob29rQmxvY2tzLmZvckVhY2goZnVuY3Rpb24oaG9vayl7dmFyIGhvb2tFbD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjJytob29rKTt2YXIgaG9va0VsUmVjb3JkVHlwZT1ob29rRWw/aG9va0VsLmdldEF0dHJpYnV0ZSgnZGF0YS1wYXJlbnR0cGxpZCcpfHxob29rRWwuZ2V0QXR0cmlidXRlKCdkYXRhLXJlY29yZC10eXBlJyk6Jyc7dmFyIGlzUG9wdXBCbG9jaz1wb3B1cEJsb2Nrcy5zb21lKGZ1bmN0aW9uKGlkKXtyZXR1cm4gaG9va0VsUmVjb3JkVHlwZT09aWR9KTtpZihob29rRWwmJiFpc1BvcHVwQmxvY2spe2hvb2tFbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYW5pbWF0aW9uYXBwZWFyJywnb2ZmJyk7aG9va0VsLmNsYXNzTGlzdC5hZGQoJ3QzOTdfX29mZicpO2hvb2tFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywhMCl9CnQzOTdfdXBkYXRlVGFic0J5SG9vayhob29rRWxSZWNvcmRUeXBlLGhvb2tFbCxob29rLHJlY2lkKX0pfQpub0FjdGl2ZS5mb3JFYWNoKGZ1bmN0aW9uKG5vQWN0aXZlSUQpe2lmKCFub0FjdGl2ZUlEKXJldHVybjt2YXIgaG9va0VsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWMnK25vQWN0aXZlSUQpO3ZhciBob29rRWxSZWNvcmRUeXBlPWhvb2tFbD9ob29rRWwuZ2V0QXR0cmlidXRlKCdkYXRhLXBhcmVudHRwbGlkJyl8fGhvb2tFbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVjb3JkLXR5cGUnKTonJzt2YXIgaXNQb3B1cEJsb2NrPXBvcHVwQmxvY2tzLnNvbWUoZnVuY3Rpb24oaWQpe3JldHVybiBob29rRWxSZWNvcmRUeXBlPT1pZH0pO2lmKGhvb2tFbCYmIWlzUG9wdXBCbG9jayl7aG9va0VsLnNldEF0dHJpYnV0ZSgnZGF0YS1jb25uZWN0LXdpdGgtdGFiJywneWVzJyk7aG9va0VsLnNldEF0dHJpYnV0ZSgnZGF0YS1hbmltYXRpb25hcHBlYXInLCdvZmYnKTtob29rRWwuY2xhc3NMaXN0LmFkZCgndDM5N19fb2ZmJyk7aG9va0VsLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCEwKX0KdDM5N191cGRhdGVUYWJzQnlIb29rKGhvb2tFbFJlY29yZFR5cGUsaG9va0VsLG5vQWN0aXZlSUQscmVjaWQpfSk7dmFyIHNjcm9sbEhlaWdodD1NYXRoLm1heChkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0LGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRIZWlnaHQsZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQsZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCk7aWYoc2Nyb2xsSGVpZ2h0LXdpbmRvdy5pbm5lckhlaWdodDx3aW5kb3cucGFnZVlPZmZzZXQpe3dpbmRvdy5zY3JvbGxUbygwLHNjcm9sbEhlaWdodC13aW5kb3cuaW5uZXJIZWlnaHQpfX0KZnVuY3Rpb24gdDM5N191cGRhdGVUYWJzQnlIb29rKGhvb2tFbFJlY29yZFR5cGUsaG9va0VsLGN1cnJlbnRJRCxyZWNpZCl7dmFyIGhvb2tFbFRhYjtzd2l0Y2goaG9va0VsUmVjb3JkVHlwZSl7Y2FzZSAnMzk1JzppZih3aW5kb3cudDM5NV9hbGx0YWJzX3VwZGF0ZUNvbnRlbnQmJndpbmRvdy50Mzk1X3VwZGF0ZVNlbGVjdCYmcmVjaWQhPT1jdXJyZW50SUQpe3dpbmRvdy50Mzk1X2FsbHRhYnNfdXBkYXRlQ29udGVudChjdXJyZW50SUQpO3dpbmRvdy50Mzk1X3VwZGF0ZVNlbGVjdChjdXJyZW50SUQpO2hvb2tFbFRhYj1ob29rRWw/aG9va0VsLnF1ZXJ5U2VsZWN0b3IoJy50Mzk1X190YWInKTpudWxsO2lmKGhvb2tFbFRhYilob29rRWxUYWIuY2xpY2soKX0KYnJlYWs7Y2FzZSAnMzk3JzppZihyZWNpZCE9PWN1cnJlbnRJRCl7dDM5N19hbGx0YWJzX3VwZGF0ZUNvbnRlbnQoY3VycmVudElEKTt0Mzk3X3VwZGF0ZVNlbGVjdChjdXJyZW50SUQpO2hvb2tFbFRhYj1ob29rRWw/aG9va0VsLnF1ZXJ5U2VsZWN0b3IoJy50Mzk3X190YWInKTpudWxsO2lmKGhvb2tFbFRhYilob29rRWxUYWIuY2xpY2soKX0KYnJlYWt9fQpmdW5jdGlvbiB0Mzk3X2NoZWNrVmlzaWJpbGxpdHlFbChlbCl7cmV0dXJuISEoZWwmJihlbC5vZmZzZXRXaWR0aHx8ZWwub2Zmc2V0SGVpZ2h0fHxlbC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCkpfQpmdW5jdGlvbiB0Mzk3X3VwZGF0ZUNvbnRlbnRCeVNlbGVjdChyZWNpZCl7dmFyIHJlYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjJytyZWNpZCk7aWYoIXJlYylyZXR1cm4hMTt2YXIgc2VsZWN0PXJlYy5xdWVyeVNlbGVjdG9yKCcudDM5N19fc2VsZWN0Jyk7aWYoc2VsZWN0KXtzZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJyxmdW5jdGlvbigpe3ZhciB0YWJJbmRleD1yZWMucXVlcnlTZWxlY3RvcigiLnQzOTdfX3RhYltkYXRhLXRhYi1yZWMtaWRzPSciK3NlbGVjdC52YWx1ZSsnXCddW2RhdGEtdGFiLWluZGV4PSInK3NlbGVjdC5zZWxlY3RlZEluZGV4KyciXScpO2lmKHRhYkluZGV4KXRhYkluZGV4LmNsaWNrKCl9KX19CmZ1bmN0aW9uIHQzOTdfdXBkYXRlU2VsZWN0KHJlY2lkKXt2YXIgcmVjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWMnK3JlY2lkKTtpZighcmVjKXJldHVybiExO3ZhciBhY3RpdmVUYWI9cmVjLnF1ZXJ5U2VsZWN0b3IoJy50Mzk3X190YWJfYWN0aXZlJyk7dmFyIGN1cnJlbnRUYWJIb29rcz1hY3RpdmVUYWI/YWN0aXZlVGFiLmdldEF0dHJpYnV0ZSgnZGF0YS10YWItaW5kZXgnKTonJzt2YXIgc2VsZWN0PXJlYy5xdWVyeVNlbGVjdG9yKCcudDM5N19fc2VsZWN0Jyk7aWYoc2VsZWN0KXNlbGVjdC5zZWxlY3RlZEluZGV4PWN1cnJlbnRUYWJIb29rc30KZnVuY3Rpb24gdDM5N19zY3JvbGxUb1RhYnMocmVjaWQsaGFzaCl7dmFyIHJlYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjJytyZWNpZCk7dmFyIGN1clVybD1oYXNofHxkZWNvZGVVUkkod2luZG93LmxvY2F0aW9uLmhyZWYpO3ZhciB0YWJJbmRleE51bWJlcj1jdXJVcmwuaW5kZXhPZignIyEvdGFiLycpO2lmKHRhYkluZGV4TnVtYmVyPT09LTEpcmV0dXJuITE7dmFyIHRhYkluZGV4TnVtYmVyU3RhcnQ9Y3VyVXJsLmluZGV4T2YoJ3RhYi8nKTt2YXIgZmlyc3RPcHRpb25TZWxlY3Q9cmVjP3JlYy5xdWVyeVNlbGVjdG9yKCcudDM5N19fd3JhcHBlcl9tb2JpbGUgLnQzOTdfX3NlbGVjdCBvcHRpb24nKTpudWxsO2lmKGZpcnN0T3B0aW9uU2VsZWN0KWZpcnN0T3B0aW9uU2VsZWN0LnNlbGVjdGVkPSExO3ZhciB0YWJSZWM9Y3VyVXJsLnN1YnN0cmluZyh0YWJJbmRleE51bWJlclN0YXJ0KzQsdGFiSW5kZXhOdW1iZXJTdGFydCs0K3JlY2lkLmxlbmd0aCk7aWYodGFiUmVjIT09cmVjaWQpcmV0dXJuITE7dmFyIHRhYkJsb2NrPXJlYz9yZWMucXVlcnlTZWxlY3RvcignLnQzOTcnKTpudWxsO3ZhciB0YWJOdW1iZXI9cGFyc2VJbnQoY3VyVXJsLnNsaWNlKHRhYkluZGV4TnVtYmVyU3RhcnQrNCtyZWNpZC5sZW5ndGgrMSksMTApO3ZhciB0YWJzPXJlYy5xdWVyeVNlbGVjdG9yQWxsKCcudDM5N19fdGFiJyk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0YWJzLGZ1bmN0aW9uKHRhYixpKXtpZihpPT09dGFiTnVtYmVyLTEpe3RhYi5jbGljaygpO3RhYi5jbGFzc0xpc3QuYWRkKCd0Mzk3X190YWJfYWN0aXZlJyl9ZWxzZXt0YWIuY2xhc3NMaXN0LnJlbW92ZSgndDM5N19fdGFiX2FjdGl2ZScpfX0pO3ZhciB0YWJzTW9iPXJlYy5xdWVyeVNlbGVjdG9yQWxsKCcudDM5N19fd3JhcHBlcl9tb2JpbGUgLnQzOTdfX3NlbGVjdCBvcHRpb24nKTt2YXIgYWN0aXZlVGFiTW9iPXRhYnNNb2IubGVuZ3RoP3RhYnNNb2JbdGFiTnVtYmVyLTFdOm51bGw7aWYoYWN0aXZlVGFiTW9iKWFjdGl2ZVRhYk1vYi5zZWxlY3RlZD0hMDtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dDM5N19zY3JvbGxUb0VsKHRhYkJsb2NrKX0sNTApfQpmdW5jdGlvbiB0Mzk3X3Njcm9sbFRvRWwoZWwpe2Z1bmN0aW9uIGdldEVsVG9wUG9zKCl7dmFyIGVsVG9wUG9zPWVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQ7ZWxUb3BQb3M9d2luZG93LmlubmVyV2lkdGg+OTYwP2VsVG9wUG9zLTIwMDplbFRvcFBvcy0xMDA7aWYoZWxUb3BQb3M8MCllbFRvcFBvcz0wO3ZhciBkb2N1bWVudEhlaWdodD1NYXRoLm1heChkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0LGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRIZWlnaHQsZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQsZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCk7dmFyIGJvdHRvbVZpZXdwb3J0UG9pbnQ9ZG9jdW1lbnRIZWlnaHQtZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtpZihlbFRvcFBvcz5ib3R0b21WaWV3cG9ydFBvaW50KWVsVG9wUG9zPWJvdHRvbVZpZXdwb3J0UG9pbnQ7cmV0dXJuIGVsVG9wUG9zfQp2YXIgc3RhcnRQb3NpdGlvbj13aW5kb3cucGFnZVlPZmZzZXQ7dmFyIHN0YXJ0VGltZT1udWxsO3ZhciBkdXJhdGlvbj0zMDA7ZnVuY3Rpb24gc2Nyb2xsQW5pbWF0aW9uKGN1cnJlbnRUaW1lKXtpZihzdGFydFRpbWU9PT1udWxsKXN0YXJ0VGltZT1jdXJyZW50VGltZTt2YXIgdGltZUVsYXBzZWQ9Y3VycmVudFRpbWUtc3RhcnRUaW1lO3ZhciBlbFRvcFBvcz1nZXRFbFRvcFBvcygpO3ZhciBkaXN0YW5jZT1lbFRvcFBvcy1zdGFydFBvc2l0aW9uO3ZhciBydW49ZWFzZUluUXVhZCh0aW1lRWxhcHNlZCxzdGFydFBvc2l0aW9uLGRpc3RhbmNlLGR1cmF0aW9uKTt3aW5kb3cuc2Nyb2xsVG8oMCxydW4pO2RvY3VtZW50LmJvZHkuc2V0QXR0cmlidXRlKCdkYXRhLXNjcm9sbGFibGUnLCd0cnVlJyk7aWYodGltZUVsYXBzZWQ8ZHVyYXRpb24pe3JlcXVlc3RBbmltYXRpb25GcmFtZShzY3JvbGxBbmltYXRpb24pfWVsc2V7d2luZG93LnNjcm9sbFRvKDAsZWxUb3BQb3MpO2RvY3VtZW50LmJvZHkucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXNjcm9sbGFibGUnKX19CmZ1bmN0aW9uIGVhc2VJblF1YWQodGltZUVsYXBzZWQsc3RhcnRQb3NpdGlvbixkaXN0YW5jZSxkdXJhdGlvbil7dGltZUVsYXBzZWQvPWR1cmF0aW9uO3JldHVybiBkaXN0YW5jZSp0aW1lRWxhcHNlZCp0aW1lRWxhcHNlZCtzdGFydFBvc2l0aW9ufQpyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc2Nyb2xsQW5pbWF0aW9uKX0KZnVuY3Rpb24gdDM5N19yZW1vdmVVcmwoKXt2YXIgY3VyVXJsPXdpbmRvdy5sb2NhdGlvbi5ocmVmO3ZhciBpbmRleFRvUmVtb3ZlPWN1clVybC5pbmRleE9mKCcjIS90YWIvJyk7aWYoaW5kZXhUb1JlbW92ZT09PS0xKXtpbmRleFRvUmVtb3ZlPWN1clVybC5pbmRleE9mKCclMjMhL3RhYi8nKX0KY3VyVXJsPWN1clVybC5zdWJzdHJpbmcoMCxpbmRleFRvUmVtb3ZlKTtpZihpbmRleFRvUmVtb3ZlIT09LTEpe2lmKHR5cGVvZiBoaXN0b3J5LnJlcGxhY2VTdGF0ZSE9J3VuZGVmaW5lZCcpe3RyeXt3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoJycsJycsY3VyVXJsKX1jYXRjaChlcnIpe319fX0KZnVuY3Rpb24gdDcwMl9pbml0UG9wdXAocmVjSWQpe3ZhciByZWM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlYycrcmVjSWQpO2lmKCFyZWMpcmV0dXJuO3ZhciBjb250YWluZXI9cmVjLnF1ZXJ5U2VsZWN0b3IoJy50NzAyJyk7aWYoIWNvbnRhaW5lcilyZXR1cm47cmVjLnNldEF0dHJpYnV0ZSgnZGF0YS1hbmltYXRpb25hcHBlYXInLCdvZmYnKTtyZWMuc2V0QXR0cmlidXRlKCdkYXRhLXBvcHVwLXN1YnNjcmliZS1pbml0ZWQnLCd5Jyk7cmVjLnN0eWxlLm9wYWNpdHk9MTt2YXIgZG9jdW1lbnRCb2R5PWRvY3VtZW50LmJvZHk7dmFyIHBvcHVwPXJlYy5xdWVyeVNlbGVjdG9yKCcudC1wb3B1cCcpO3ZhciBwb3B1cFRvb2x0aXBIb29rPXBvcHVwLmdldEF0dHJpYnV0ZSgnZGF0YS10b29sdGlwLWhvb2snKTt2YXIgYW5hbGl0aWNzPXBvcHVwLmdldEF0dHJpYnV0ZSgnZGF0YS10cmFjay1wb3B1cCcpO3ZhciBwb3B1cENsb3NlQnRuPXBvcHVwLnF1ZXJ5U2VsZWN0b3IoJy50LXBvcHVwX19jbG9zZScpO3ZhciBocmVmcz1yZWMucXVlcnlTZWxlY3RvckFsbCgnYVtocmVmKj0iIyJdJyk7dmFyIHN1Ym1pdEhyZWY9cmVjLnF1ZXJ5U2VsZWN0b3IoJy50LXN1Ym1pdFtocmVmKj0iIyJdJyk7aWYocG9wdXBUb29sdGlwSG9vayl7dF9vbkZ1bmNMb2FkKCd0X3BvcHVwX19hZGRBdHRyaWJ1dGVzRm9yQWNjZXNzaWJpbGl0eScsZnVuY3Rpb24oKXt0X3BvcHVwX19hZGRBdHRyaWJ1dGVzRm9yQWNjZXNzaWJpbGl0eShwb3B1cFRvb2x0aXBIb29rKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihldmVudCl7dmFyIHRhcmdldD1ldmVudC50YXJnZXQ7dmFyIGhyZWY9dGFyZ2V0LmNsb3Nlc3QoJ2FbaHJlZiQ9IicrcG9wdXBUb29sdGlwSG9vaysnIl0nKT90YXJnZXQ6ITE7aWYoIWhyZWYpcmV0dXJuO2V2ZW50LnByZXZlbnREZWZhdWx0KCk7dDcwMl9zaG93UG9wdXAocmVjSWQpO3Rfb25GdW5jTG9hZCgndF9wb3B1cF9fcmVzaXplUG9wdXAnLGZ1bmN0aW9uKCl7dF9wb3B1cF9fcmVzaXplUG9wdXAocmVjSWQpfSk7dDcwMl9fbGF6eUxvYWQoKTtpZihhbmFsaXRpY3MmJndpbmRvdy5UaWxkYSl7VGlsZGEuc2VuZEV2ZW50VG9TdGF0aXN0aWNzKGFuYWxpdGljcyxwb3B1cFRvb2x0aXBIb29rKX19KTt0X29uRnVuY0xvYWQoJ3RfcG9wdXBfX2FkZENsYXNzT25UcmlnZ2VyQnV0dG9uJyxmdW5jdGlvbigpe3RfcG9wdXBfX2FkZENsYXNzT25UcmlnZ2VyQnV0dG9uKGRvY3VtZW50LHBvcHVwVG9vbHRpcEhvb2spfSl9CnBvcHVwLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsdF90aHJvdHRsZShmdW5jdGlvbigpe3Q3MDJfX2xhenlMb2FkKCl9KSk7cG9wdXAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGV2ZW50KXt2YXIgd2luZG93V2l0aG91dFNjcm9sbEJhcj13aW5kb3cuaW5uZXJXaWR0aC0xNztpZihldmVudC5jbGllbnRYPndpbmRvd1dpdGhvdXRTY3JvbGxCYXIpcmV0dXJuO2lmKGV2ZW50LnRhcmdldD09PXRoaXMpdDcwMl9jbG9zZVBvcHVwKHJlY0lkKX0pO3BvcHVwQ2xvc2VCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7dDcwMl9jbG9zZVBvcHVwKHJlY0lkKX0pO2lmKHN1Ym1pdEhyZWYpe3N1Ym1pdEhyZWYuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7aWYoZG9jdW1lbnRCb2R5LmNsYXNzTGlzdC5jb250YWlucygndC1ib2R5X3Njcm9sbC1sb2NrZWQnKSl7ZG9jdW1lbnRCb2R5LmNsYXNzTGlzdC5yZW1vdmUoJ3QtYm9keV9zY3JvbGwtbG9ja2VkJyl9fSl9CmZvcih2YXIgaT0wO2k8aHJlZnMubGVuZ3RoO2krKyl7aHJlZnNbaV0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7dmFyIHVybD10aGlzLmdldEF0dHJpYnV0ZSgnaHJlZicpO2lmKCF1cmx8fHVybC5zdWJzdHJpbmcoMCw3KSE9JyNwcmljZTonKXt0NzAyX2Nsb3NlUG9wdXAocmVjSWQpO2lmKCF1cmx8fHVybC5zdWJzdHJpbmcoMCw3KT09JyNwb3B1cDonKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYodHlwZW9mIHRfdHJpZ2dlckV2ZW50PT09J2Z1bmN0aW9uJyl0X3RyaWdnZXJFdmVudChkb2N1bWVudC5ib2R5LCdwb3B1cFNob3dlZCcpO2RvY3VtZW50Qm9keS5jbGFzc0xpc3QuYWRkKCd0LWJvZHlfcG9wdXBzaG93ZWQnKX0sMzAwKX19fSl9CmZ1bmN0aW9uIHQ3MDJfZXNjQ2xvc2VQb3B1cChldmVudCl7aWYoZXZlbnQua2V5PT09J0VzY2FwZScpdDcwMl9jbG9zZVBvcHVwKHJlY0lkKX0KcG9wdXAuYWRkRXZlbnRMaXN0ZW5lcigndGlsZGFtb2RhbDpzaG93Jytwb3B1cFRvb2x0aXBIb29rLGZ1bmN0aW9uKCl7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsdDcwMl9lc2NDbG9zZVBvcHVwKX0pO3BvcHVwLmFkZEV2ZW50TGlzdGVuZXIoJ3RpbGRhbW9kYWw6Y2xvc2UnK3BvcHVwVG9vbHRpcEhvb2ssZnVuY3Rpb24oKXtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJyx0NzAyX2VzY0Nsb3NlUG9wdXApfSk7cmVjLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbmRpdGlvbmFsLWZvcm0taW5pdCcsZnVuY3Rpb24oKXt0X29uRnVuY0xvYWQoJ3RfZm9ybV9fY29uZGl0aW9uYWxzX2FkZEZpZWxkc0xpc3RlbmVycycsZnVuY3Rpb24oKXt0X2Zvcm1fX2NvbmRpdGlvbmFsc19hZGRGaWVsZHNMaXN0ZW5lcnMocmVjSWQsZnVuY3Rpb24oKXt0X3BvcHVwX19yZXNpemVQb3B1cChyZWNJZCl9KX0pfSx7b25jZTohMH0pfQpmdW5jdGlvbiB0NzAyX2xvY2tTY3JvbGwoKXt2YXIgZG9jdW1lbnRCb2R5PWRvY3VtZW50LmJvZHk7aWYoIWRvY3VtZW50Qm9keS5jbGFzc0xpc3QuY29udGFpbnMoJ3QtYm9keV9zY3JvbGwtbG9ja2VkJykpe3ZhciBib2R5U2Nyb2xsVG9wPXR5cGVvZiB3aW5kb3cucGFnZVlPZmZzZXQhPT0ndW5kZWZpbmVkJz93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnRCb2R5LnBhcmVudE5vZGV8fGRvY3VtZW50Qm9keSkuc2Nyb2xsVG9wO2RvY3VtZW50Qm9keS5jbGFzc0xpc3QuYWRkKCd0LWJvZHlfc2Nyb2xsLWxvY2tlZCcpO2RvY3VtZW50Qm9keS5zdHlsZS50b3A9Jy0nK2JvZHlTY3JvbGxUb3ArJ3B4Jztkb2N1bWVudEJvZHkuc2V0QXR0cmlidXRlKCdkYXRhLXBvcHVwLXNjcm9sbHRvcCcsYm9keVNjcm9sbFRvcCl9fQpmdW5jdGlvbiB0NzAyX3VubG9ja1Njcm9sbCgpe3ZhciBkb2N1bWVudEJvZHk9ZG9jdW1lbnQuYm9keTtpZihkb2N1bWVudEJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCd0LWJvZHlfc2Nyb2xsLWxvY2tlZCcpKXt2YXIgYm9keVNjcm9sbFRvcD1kb2N1bWVudEJvZHkuZ2V0QXR0cmlidXRlKCdkYXRhLXBvcHVwLXNjcm9sbHRvcCcpO2RvY3VtZW50Qm9keS5jbGFzc0xpc3QucmVtb3ZlKCd0LWJvZHlfc2Nyb2xsLWxvY2tlZCcpO2RvY3VtZW50Qm9keS5zdHlsZS50b3A9bnVsbDtkb2N1bWVudEJvZHkucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXBvcHVwLXNjcm9sbHRvcCcpO2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A9cGFyc2VJbnQoYm9keVNjcm9sbFRvcCl9fQpmdW5jdGlvbiB0NzAyX3Nob3dQb3B1cChyZWNJZCl7dmFyIHJlYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjJytyZWNJZCk7aWYoIXJlYylyZXR1cm47dmFyIGNvbnRhaW5lcj1yZWMucXVlcnlTZWxlY3RvcignLnQ3MDInKTtpZighY29udGFpbmVyKXJldHVybjt2YXIgd2luZG93V2lkdGg9d2luZG93LmlubmVyV2lkdGg7dmFyIHNjcmVlbk1pbj1yZWMuZ2V0QXR0cmlidXRlKCdkYXRhLXNjcmVlbi1taW4nKTt2YXIgc2NyZWVuTWF4PXJlYy5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2NyZWVuLW1heCcpO2lmKHNjcmVlbk1pbiYmd2luZG93V2lkdGg8cGFyc2VJbnQoc2NyZWVuTWluLDEwKSlyZXR1cm47aWYoc2NyZWVuTWF4JiZ3aW5kb3dXaWR0aD5wYXJzZUludChzY3JlZW5NYXgsMTApKXJldHVybjt2YXIgcG9wdXA9cmVjLnF1ZXJ5U2VsZWN0b3IoJy50LXBvcHVwJyk7dmFyIHBvcHVwVG9vbHRpcEhvb2s9cG9wdXAuZ2V0QXR0cmlidXRlKCdkYXRhLXRvb2x0aXAtaG9vaycpO3ZhciByYW5nZXM9cmVjLnF1ZXJ5U2VsZWN0b3JBbGwoJy50LXJhbmdlJyk7dmFyIGRvY3VtZW50Qm9keT1kb2N1bWVudC5ib2R5O2lmKHJhbmdlcy5sZW5ndGgpe0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwocmFuZ2VzLGZ1bmN0aW9uKHJhbmdlKXt0NzAyX190cmlnZ2VyRXZlbnQocmFuZ2UsJ3BvcHVwT3BlbmVkJyl9KX0KdF9vbkZ1bmNMb2FkKCd0X3BvcHVwX19zaG93UG9wdXAnLGZ1bmN0aW9uKCl7dF9wb3B1cF9fc2hvd1BvcHVwKHBvcHVwKX0pO2lmKHR5cGVvZiB0X3RyaWdnZXJFdmVudD09PSdmdW5jdGlvbicpdF90cmlnZ2VyRXZlbnQoZG9jdW1lbnQuYm9keSwncG9wdXBTaG93ZWQnKTtkb2N1bWVudEJvZHkuY2xhc3NMaXN0LmFkZCgndC1ib2R5X3BvcHVwc2hvd2VkJyk7ZG9jdW1lbnRCb2R5LmNsYXNzTGlzdC5hZGQoJ3Q3MDJfX2JvZHlfcG9wdXBzaG93ZWQnKTtpZigvaVBob25lfGlQYWR8aVBvZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiF3aW5kb3cuTVNTdHJlYW0mJndpbmRvdy5pc2lPU1ZlcnNpb24mJndpbmRvdy5pc2lPU1ZlcnNpb25bMF09PT0xMSl7c2V0VGltZW91dChmdW5jdGlvbigpe3Q3MDJfbG9ja1Njcm9sbCgpfSw1MDApfQp0NzAyX19sYXp5TG9hZCgpO3Q3MDJfX3RyaWdnZXJFdmVudChwb3B1cCwndGlsZGFtb2RhbDpzaG93Jytwb3B1cFRvb2x0aXBIb29rKTt0X29uRnVuY0xvYWQoJ3RfZm9ybXNfX2NhbGN1bGF0ZUlucHV0c1dpZHRoJyxmdW5jdGlvbigpe3RfZm9ybXNfX2NhbGN1bGF0ZUlucHV0c1dpZHRoKHJlY0lkKX0pfQpmdW5jdGlvbiB0NzAyX2Nsb3NlUG9wdXAocmVjSWQpe3ZhciByZWM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlYycrcmVjSWQpO3ZhciBwb3B1cD1yZWMucXVlcnlTZWxlY3RvcignLnQtcG9wdXAnKTt2YXIgcG9wdXBUb29sdGlwSG9vaz1wb3B1cC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdG9vbHRpcC1ob29rJyk7dmFyIHBvcHVwQWxsPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50LXBvcHVwX3Nob3c6bm90KC50LWZlZWRfX3Bvc3QtcG9wdXApOm5vdCgudDk0NV9fcG9wdXApJyk7aWYocG9wdXBBbGwubGVuZ3RoPT0xKXtpZih0eXBlb2YgdF90cmlnZ2VyRXZlbnQ9PT0nZnVuY3Rpb24nKXRfdHJpZ2dlckV2ZW50KGRvY3VtZW50LmJvZHksJ3BvcHVwSGlkZGVuJyk7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCd0LWJvZHlfcG9wdXBzaG93ZWQnKX1lbHNle3ZhciBuZXdQb3B1cD1bXTtmb3IodmFyIGk9MDtpPHBvcHVwQWxsLmxlbmd0aDtpKyspe2lmKHBvcHVwQWxsW2ldLmdldEF0dHJpYnV0ZSgnZGF0YS10b29sdGlwLWhvb2snKT09PXBvcHVwVG9vbHRpcEhvb2spe3BvcHVwQWxsW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ3QtcG9wdXBfc2hvdycpO25ld1BvcHVwLnB1c2gocG9wdXBBbGxbaV0pfX0KaWYobmV3UG9wdXAubGVuZ3RoPT09cG9wdXBBbGwubGVuZ3RoKXtpZih0eXBlb2YgdF90cmlnZ2VyRXZlbnQ9PT0nZnVuY3Rpb24nKXRfdHJpZ2dlckV2ZW50KGRvY3VtZW50LmJvZHksJ3BvcHVwSGlkZGVuJyk7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCd0LWJvZHlfcG9wdXBzaG93ZWQnKX19CmlmKHR5cGVvZiB0X3RyaWdnZXJFdmVudD09PSdmdW5jdGlvbicpdF90cmlnZ2VyRXZlbnQoZG9jdW1lbnQuYm9keSwncG9wdXBIaWRkZW4nKTtwb3B1cC5jbGFzc0xpc3QucmVtb3ZlKCd0LXBvcHVwX3Nob3cnKTtkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ3Q3MDJfX2JvZHlfcG9wdXBzaG93ZWQnKTtpZigvaVBob25lfGlQYWR8aVBvZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiF3aW5kb3cuTVNTdHJlYW0mJndpbmRvdy5pc2lPU1ZlcnNpb24mJndpbmRvdy5pc2lPU1ZlcnNpb25bMF09PT0xMSl7dDcwMl91bmxvY2tTY3JvbGwoKX0KdF9vbkZ1bmNMb2FkKCd0X3BvcHVwX19hZGRGb2N1c09uVHJpZ2dlckJ1dHRvbicsZnVuY3Rpb24oKXt0X3BvcHVwX19hZGRGb2N1c09uVHJpZ2dlckJ1dHRvbigpfSk7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBwb3B1cEhpZGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnQtcG9wdXA6bm90KC50LXBvcHVwX3Nob3cpJyk7Zm9yKHZhciBpPTA7aTxwb3B1cEhpZGUubGVuZ3RoO2krKyl7cG9wdXBIaWRlW2ldLnN0eWxlLmRpc3BsYXk9J25vbmUnfX0sMzAwKTt0NzAyX190cmlnZ2VyRXZlbnQocG9wdXAsJ3RpbGRhbW9kYWw6Y2xvc2UnK3BvcHVwVG9vbHRpcEhvb2spfQpmdW5jdGlvbiB0NzAyX3NlbmRQb3B1cEV2ZW50VG9TdGF0aXN0aWNzKHBvcHVwTmFtZSl7dmFyIHZpcnRQYWdlPScvdGlsZGEvcG9wdXAvJzt2YXIgdmlydFRpdGxlPSdQb3B1cDogJztpZihwb3B1cE5hbWUuc3Vic3RyaW5nKDAsNyk9PScjcG9wdXA6Jyl7cG9wdXBOYW1lPXBvcHVwTmFtZS5zdWJzdHJpbmcoNyl9CnZpcnRQYWdlKz1wb3B1cE5hbWU7dmlydFRpdGxlKz1wb3B1cE5hbWU7aWYod2luZG93LlRpbGRhJiZ0eXBlb2YgVGlsZGEuc2VuZEV2ZW50VG9TdGF0aXN0aWNzPT0nZnVuY3Rpb24nKXtUaWxkYS5zZW5kRXZlbnRUb1N0YXRpc3RpY3ModmlydFBhZ2UsdmlydFRpdGxlLCcnLDApfWVsc2V7aWYoZ2Epe2lmKHdpbmRvdy5tYWluVHJhY2tlciE9J3RpbGRhJyl7Z2EoJ3NlbmQnLHtoaXRUeXBlOidwYWdldmlldycscGFnZTp2aXJ0UGFnZSx0aXRsZTp2aXJ0VGl0bGV9KX19CmlmKHdpbmRvdy5tYWluTWV0cmlrYSYmd2luZG93W3dpbmRvdy5tYWluTWV0cmlrYV0pe3dpbmRvd1t3aW5kb3cubWFpbk1ldHJpa2FdLmhpdCh2aXJ0UGFnZSx7dGl0bGU6dmlydFRpdGxlLHJlZmVyZXI6d2luZG93LmxvY2F0aW9uLmhyZWZ9KX19fQpmdW5jdGlvbiB0NzAyX29uU3VjY2Vzcyhmb3JtKXt0X29uRnVuY0xvYWQoJ3RfZm9ybXNfX29uU3VjY2VzcycsZnVuY3Rpb24oKXt0X2Zvcm1zX19vblN1Y2Nlc3MoZm9ybSl9KX0KZnVuY3Rpb24gdDcwMl9fbGF6eUxvYWQoKXtpZih3aW5kb3cubGF6eT09PSd5J3x8ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FsbHJlY29yZHMnKS5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGlsZGEtbGF6eScpPT09J3llcycpe3Rfb25GdW5jTG9hZCgndF9sYXp5bG9hZF91cGRhdGUnLGZ1bmN0aW9uKCl7dF9sYXp5bG9hZF91cGRhdGUoKX0pfX0KZnVuY3Rpb24gdDcwMl9fdHJpZ2dlckV2ZW50KGVsLGV2ZW50TmFtZSl7dmFyIGV2ZW50O2lmKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ9PT0nZnVuY3Rpb24nKXtldmVudD1uZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lKX1lbHNlIGlmKGRvY3VtZW50LmNyZWF0ZUV2ZW50KXtldmVudD1kb2N1bWVudC5jcmVhdGVFdmVudCgnSFRNTEV2ZW50cycpO2V2ZW50LmluaXRFdmVudChldmVudE5hbWUsITAsITEpfWVsc2UgaWYoZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3Qpe2V2ZW50PWRvY3VtZW50LmNyZWF0ZUV2ZW50T2JqZWN0KCk7ZXZlbnQuZXZlbnRUeXBlPWV2ZW50TmFtZX0KZXZlbnQuZXZlbnROYW1lPWV2ZW50TmFtZTtpZihlbC5kaXNwYXRjaEV2ZW50KXtlbC5kaXNwYXRjaEV2ZW50KGV2ZW50KX1lbHNlIGlmKGVsLmZpcmVFdmVudCl7ZWwuZmlyZUV2ZW50KCdvbicrZXZlbnQuZXZlbnRUeXBlLGV2ZW50KX1lbHNlIGlmKGVsW2V2ZW50TmFtZV0pe2VsW2V2ZW50TmFtZV0oKX1lbHNlIGlmKGVsWydvbicrZXZlbnROYW1lXSl7ZWxbJ29uJytldmVudE5hbWVdKCl9fQpmdW5jdGlvbiB0X2xhenlsb2FkX3VwZGF0ZSgpeyJ1bmRlZmluZWQiIT10eXBlb2YgbGF6eWxvYWRfY292ZXImJmxhenlsb2FkX2NvdmVyLnVwZGF0ZSgpLCJ1bmRlZmluZWQiIT10eXBlb2YgbGF6eWxvYWRfaW1nJiZsYXp5bG9hZF9pbWcudXBkYXRlKCksInVuZGVmaW5lZCIhPXR5cGVvZiBsYXp5bG9hZF9iZ2ltZyYmbGF6eWxvYWRfYmdpbWcudXBkYXRlKCksInVuZGVmaW5lZCIhPXR5cGVvZiBsYXp5bG9hZF9pZnJhbWUmJmxhenlsb2FkX2lmcmFtZS51cGRhdGUoKX1mdW5jdGlvbiB0X2xhenlsb2FkX3VwZGF0ZVJlc2l6ZV9lbGVtKGUpe2lmKHdpbmRvdy5qUXVlcnkmJmUgaW5zdGFuY2VvZiBqUXVlcnkpe2lmKDA9PWUubGVuZ3RoKXJldHVybjtlPWUuZ2V0KDApfWlmKG51bGwhPWUpe3ZhciB0PWUudGFnTmFtZTtpZigiSU1HIj09dCl2YXIgbz1lLmdldEF0dHJpYnV0ZSgic3JjIiksbj0iLS9yZXNpemUvIjtlbHNlIGlmKCJ1bmRlZmluZWQiIT10eXBlb2YgZ2V0Q29tcHV0ZWRTdHlsZSl7dmFyIG89Z2V0Q29tcHV0ZWRTdHlsZShlKVsiYmFja2dyb3VuZC1pbWFnZSJdLnJlcGxhY2UoInVybCgiLCIiKS5yZXBsYWNlKCIpIiwiIikucmVwbGFjZSgvIi9naSwiIiksaTtpZigiY29udGFpbiI9PWdldENvbXB1dGVkU3R5bGUoZSlbImJhY2tncm91bmQtc2l6ZSJdKXZhciBuPSItL2NvbnRhaW4vIjtlbHNlIHZhciBuPSItL2NvdmVyLyJ9ZWxzZSB2YXIgbj0iLS9jb3Zlci8iO2lmKCEobnVsbD09b3x8LTE9PT1vLmluZGV4T2Yobil8fG8uaW5kZXhPZigiLnN2ZyIpPjB8fG8uaW5kZXhPZigiLmdpZiIpPjB8fG8uaW5kZXhPZigiLmljbyIpPjB8fC0xPT09by5pbmRleE9mKCJ0aHVtYi50aWxkYWNkbi5jb20iKXx8by5pbmRleE9mKCItL2VtcHR5LyIpPjAmJm8uaW5kZXhPZigiLS9yZXNpemViLyIpPjApKXt2YXIgbD1vLmluZGV4T2Yobikrbi5sZW5ndGgsYT1vLmluZGV4T2YoIi8iLGwpO2lmKGw+MCYmYT4wKXt2YXIgcj1vLnNsaWNlKGwsYSkuc3BsaXQoIngiKSxzPWUuY2xpZW50V2lkdGgsYz1lLmNsaWVudEhlaWdodDtpZihzPjAmJmM+MCYmKHJbMF0+MHx8clsxXT4wKSYmKHJbMF0+MCYmcz5yWzBdfHxyWzFdPjAmJmM+clsxXSkmJihyWzBdPjAmJnMtclswXT4xMDB8fHJbMV0+MCYmYy1yWzFdPjEwMCkpe3ZhciBkPW8uc2xpY2UoMCxsKSsoclswXT4wP3M6IiIpKyJ4IisoclsxXT4wP2M6IiIpK28uc3Vic3RyaW5nKGEpOyJJTUciPT10P2Uuc2V0QXR0cmlidXRlKCJzcmMiLGQpOmUuc3R5bGUuYmFja2dyb3VuZEltYWdlPSJ1cmwoJyIrZCsiJykifX19fX0hZnVuY3Rpb24oZSx0KXsiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXSx0KToib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9dCgpOmUuTGF6eUxvYWQ9dCgpfSh3aW5kb3csKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe218fChoPXtlbGVtZW50c19zZWxlY3RvcjoiaW1nIixjb250YWluZXI6d2luZG93LHRocmVzaG9sZDozMDAsdGhyb3R0bGU6NTAsZGF0YV9zcmM6Im9yaWdpbmFsIixkYXRhX3NyY3NldDoib3JpZ2luYWwtc2V0IixjbGFzc19sb2FkaW5nOiJsb2FkaW5nIixjbGFzc19sb2FkZWQ6ImxvYWRlZCIsc2tpcF9pbnZpc2libGU6ITAsc2hvd193aGlsZV9sb2FkaW5nOiEwLGNhbGxiYWNrX2xvYWQ6bnVsbCxjYWxsYmFja19lcnJvcjpudWxsLGNhbGxiYWNrX3NldDpudWxsLGNhbGxiYWNrX3Byb2Nlc3NlZDpudWxsLHBsYWNlaG9sZGVyOiJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUlBQUFBQUFBUC8vL3lINUJBRUFBQUFBTEFBQUFBQUJBQUVBQUFJQlJBQTcifSxwPSEhd2luZG93LmFkZEV2ZW50TGlzdGVuZXIsZj0hIXdpbmRvdy5hdHRhY2hFdmVudCxnPSEhZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QsbT0hMCl9ZnVuY3Rpb24gdChlLHQsbyl7dmFyIG47cD9lLmFkZEV2ZW50TGlzdGVuZXIodCxvKTpmJiYoZS5hdHRhY2hFdmVudCgib24iK3QsKG49ZSxmdW5jdGlvbigpe28uY2FsbChuLHdpbmRvdy5ldmVudCl9KSksZT1udWxsKX1mdW5jdGlvbiBvKGUsdCxvKXtwP2UucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG8pOmYmJmUuZGV0YWNoRXZlbnQoIm9uIit0LG8pfWZ1bmN0aW9uIG4oZSx0LG8pe3ZhciBuLGksbDtmdW5jdGlvbiBhKCl7cmV0dXJuIHdpbmRvdy5pbm5lcldpZHRofHxuLmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aHx8ZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aH1mdW5jdGlvbiByKCl7cmV0dXJuIHdpbmRvdy5pbm5lckhlaWdodHx8bi5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0fHxkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodH1mdW5jdGlvbiBzKGUpe3JldHVybiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCtpLW4uZG9jdW1lbnRFbGVtZW50LmNsaWVudFRvcH1mdW5jdGlvbiBjKGUpe3JldHVybiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQrbC1uLmRvY3VtZW50RWxlbWVudC5jbGllbnRMZWZ0fWZ1bmN0aW9uIGQoKXt2YXIgbjtyZXR1cm4obj10PT09d2luZG93P3IoKStpOnModCkrdC5vZmZzZXRIZWlnaHQpPD1zKGUpLW99ZnVuY3Rpb24gdSgpe3ZhciBuO3JldHVybihuPXQ9PT13aW5kb3c/YSgpK3dpbmRvdy5wYWdlWE9mZnNldDpjKHQpK2EoKSk8PWMoZSktb31mdW5jdGlvbiBfKCl7dmFyIG8sbj0xMjAwO3JldHVybihvPXQ9PT13aW5kb3c/aTpzKHQpKT49cyhlKStuK2Uub2Zmc2V0SGVpZ2h0fWZ1bmN0aW9uIGgoKXt2YXIgbjtyZXR1cm4obj10PT09d2luZG93P2w6Yyh0KSk+PWMoZSkrbytlLm9mZnNldFdpZHRofXJldHVybiBuPWUub3duZXJEb2N1bWVudCxpPXdpbmRvdy5wYWdlWU9mZnNldHx8bi5ib2R5LnNjcm9sbFRvcCxsPXdpbmRvdy5wYWdlWE9mZnNldHx8bi5ib2R5LnNjcm9sbExlZnQsImZpeGVkIj09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLWNvbnRlbnQtY292ZXItcGFyYWxsYXgiKSYmZS5jbG9zZXN0JiZlLmNsb3Nlc3QoIi50LWNvdmVyX19jb250YWluZXIiKSYmKGU9ZS5jbG9zZXN0KCIudC1jb3Zlcl9fY29udGFpbmVyIikpLCEoZCgpfHxfKCl8fHUoKXx8aCgpKX1mdW5jdGlvbiBpKCl7dmFyIGU7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9ZnVuY3Rpb24gbChlLHQpe3ZhciBvPXt9LG47Zm9yKG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYob1tuXT1lW25dKTtmb3IobiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJihvW25dPXRbbl0pO3JldHVybiBvfWZ1bmN0aW9uIGEoZSl7dmFyIHQ7dHJ5e3Q9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZSl9Y2F0Y2gobCl7dmFyIG89W10sbixpPWUubGVuZ3RoO2ZvcihuPTA7bjxpO24rKylvLnB1c2goZVtuXSk7dD1vfXJldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuaXNTa2lwQnlQb3NpdGlvbj1udWxsPT09ZS5vZmZzZXRQYXJlbnQmJjA9PT1yKGUsIi50Mzk2X19jYXJyaWVyLXdyYXBwZXIiKS5sZW5ndGgmJiJmaXhlZCIhPT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1jb250ZW50LWNvdmVyLXBhcmFsbGF4IiksZS5pc05vdFVuZGVyU2NyZWVuUmFuZ2U9MD09PXIoZSwiLnQtcmVjW2RhdGEtc2NyZWVuLW1heF0iKS5sZW5ndGgmJjA9PT1yKGUsIi50LXJlY1tkYXRhLXNjcmVlbi1taW5dIikubGVuZ3RofSkpLHR9ZnVuY3Rpb24gcihlLHQpe2Zvcih2YXIgbz1bXTsoZT1lLnBhcmVudE5vZGUpJiZlIT09ZG9jdW1lbnQ7KXQmJiFlLm1hdGNoZXModCl8fG8udW5zaGlmdChlKTtyZXR1cm4gb31mdW5jdGlvbiBzKGUsdCl7Zz9lLmNsYXNzTGlzdC5hZGQodCk6ZS5jbGFzc05hbWUrPShlLmNsYXNzTmFtZT8iICI6IiIpK3R9ZnVuY3Rpb24gYyhlLHQpe2c/ZS5jbGFzc0xpc3QucmVtb3ZlKHQpOmUuY2xhc3NOYW1lPWUuY2xhc3NOYW1lLnJlcGxhY2UobmV3IFJlZ0V4cCgiKF58XFxzKykiK3QrIihcXHMrfCQpIiksIiAiKS5yZXBsYWNlKC9eXHMrLywiIikucmVwbGFjZSgvXHMrJC8sIiIpfWZ1bmN0aW9uIGQoZSx0LG8sbil7dmFyIGk9dC5nZXRBdHRyaWJ1dGUoImRhdGEtIituKSxsPXQuZ2V0QXR0cmlidXRlKCJkYXRhLSIrbyksYT1lLnRhZ05hbWU7cmV0dXJuIklNRyI9PT1hPyhsJiZlLnNldEF0dHJpYnV0ZSgic3Jjc2V0IixsKSx2b2lkKGkmJmUuc2V0QXR0cmlidXRlKCJzcmMiLGkpKSk6IklGUkFNRSI9PT1hP3ZvaWQoaSYmZS5zZXRBdHRyaWJ1dGUoInNyYyIsaSkpOnZvaWQoZS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2U9InVybCgiK2krIikiKX1mdW5jdGlvbiB1KGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodCxhcmd1bWVudHMpfX1mdW5jdGlvbiBfKG8pe2UoKSx0aGlzLl9zZXR0aW5ncz1sKGgsbyksdGhpcy5fcXVlcnlPcmlnaW5Ob2RlPXRoaXMuX3NldHRpbmdzLmNvbnRhaW5lcj09PXdpbmRvdz9kb2N1bWVudDp0aGlzLl9zZXR0aW5ncy5jb250YWluZXIsdGhpcy5fcHJldmlvdXNMb29wVGltZT0wLHRoaXMuX2xvb3BUaW1lb3V0PW51bGwsdGhpcy5faGFuZGxlU2Nyb2xsRm49dSh0aGlzLmhhbmRsZVNjcm9sbCx0aGlzKSx0KHdpbmRvdywicmVzaXplIix0aGlzLl9oYW5kbGVTY3JvbGxGbiksdGhpcy51cGRhdGUoKX13aW5kb3cudF9sYXp5bG9hZF9zZXRTb3VyY2VzPWQ7dmFyIGgscCxmLGcsbT0hMTtyZXR1cm4gXy5wcm90b3R5cGUuX3Nob3dPbkxvYWQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbigpe251bGwhPT1sJiYobC5jYWxsYmFja19sb2FkJiZsLmNhbGxiYWNrX2xvYWQoZSksZChlLGUsbC5kYXRhX3NyY3NldCxsLmRhdGFfc3JjKSxsLmNhbGxiYWNrX3NldCYmbC5jYWxsYmFja19zZXQoZSksYyhlLGwuY2xhc3NfbG9hZGluZykscyhlLGwuY2xhc3NfbG9hZGVkKSxvKGksImxvYWQiLG4pKX12YXIgaSxsPXRoaXMuX3NldHRpbmdzO2UuZ2V0QXR0cmlidXRlKCJzcmMiKXx8ZS5zZXRBdHRyaWJ1dGUoInNyYyIsbC5wbGFjZWhvbGRlciksdChpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLCJsb2FkIixuKSx0KGksImVycm9yIiwoZnVuY3Rpb24oKXtjKGUsbC5jbGFzc19sb2FkaW5nKSxsLmNhbGxiYWNrX2Vycm9yJiZsLmNhbGxiYWNrX2Vycm9yKGUpfSkpLHMoZSxsLmNsYXNzX2xvYWRpbmcpLGQoaSxlLGwuZGF0YV9zcmNzZXQsbC5kYXRhX3NyYyl9LF8ucHJvdG90eXBlLl9zaG93T25BcHBlYXI9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbigpe251bGwhPT1pJiYoaS5jYWxsYmFja19sb2FkJiZpLmNhbGxiYWNrX2xvYWQoZSksYyhlLGkuY2xhc3NfbG9hZGluZykscyhlLGkuY2xhc3NfbG9hZGVkKSxvKGUsImxvYWQiLG4pKX12YXIgaT10aGlzLl9zZXR0aW5nczsoIklNRyI9PT1lLnRhZ05hbWV8fCJJRlJBTUUiPT09ZS50YWdOYW1lKSYmKHQoZSwibG9hZCIsbiksdChlLCJlcnJvciIsKGZ1bmN0aW9uKCl7byhlLCJsb2FkIixuKSxjKGUsaS5jbGFzc19sb2FkaW5nKSxpLmNhbGxiYWNrX2Vycm9yJiZpLmNhbGxiYWNrX2Vycm9yKGUpfSkpLHMoZSxpLmNsYXNzX2xvYWRpbmcpKSxkKGUsZSxpLmRhdGFfc3Jjc2V0LGkuZGF0YV9zcmMpLGkuY2FsbGJhY2tfc2V0JiZpLmNhbGxiYWNrX3NldChlKX0sXy5wcm90b3R5cGUuX2xvb3BUaHJvdWdoRWxlbWVudHM9ZnVuY3Rpb24oKXt2YXIgZSx0LG89dGhpcy5fc2V0dGluZ3MsaT10aGlzLl9lbGVtZW50cyxsPWk/aS5sZW5ndGg6MCxhPVtdO2ZvcihlPTA7bD5lO2UrKyl0PWlbZV0sby5za2lwX2ludmlzaWJsZSYmdC5pc1NraXBCeVBvc2l0aW9ufHxuKHQsby5jb250YWluZXIsby50aHJlc2hvbGQpJiYoby5zaG93X3doaWxlX2xvYWRpbmc/dGhpcy5fc2hvd09uQXBwZWFyKHQpOnRoaXMuX3Nob3dPbkxvYWQodCksYS5wdXNoKGUpLHQud2FzUHJvY2Vzc2VkPSEwKTtmb3IoO2EubGVuZ3RoPjA7KWkuc3BsaWNlKGEucG9wKCksMSksby5jYWxsYmFja19wcm9jZXNzZWQmJm8uY2FsbGJhY2tfcHJvY2Vzc2VkKGkubGVuZ3RoKTswPT09bCYmdGhpcy5fc3RvcFNjcm9sbEhhbmRsZXIoKX0sXy5wcm90b3R5cGUuX3B1cmdlRWxlbWVudHM9ZnVuY3Rpb24oKXt2YXIgZSx0LG89dGhpcy5fZWxlbWVudHMsbj1vLmxlbmd0aCxpPVtdO2ZvcihlPTA7bj5lO2UrKykodD1vW2VdKS53YXNQcm9jZXNzZWQmJmkucHVzaChlKTtmb3IoO2kubGVuZ3RoPjA7KW8uc3BsaWNlKGkucG9wKCksMSl9LF8ucHJvdG90eXBlLl9zdGFydFNjcm9sbEhhbmRsZXI9ZnVuY3Rpb24oKXt0aGlzLl9pc0hhbmRsaW5nU2Nyb2xsfHwodGhpcy5faXNIYW5kbGluZ1Njcm9sbD0hMCx0KHRoaXMuX3NldHRpbmdzLmNvbnRhaW5lciwic2Nyb2xsIix0aGlzLl9oYW5kbGVTY3JvbGxGbikpfSxfLnByb3RvdHlwZS5fc3RvcFNjcm9sbEhhbmRsZXI9ZnVuY3Rpb24oKXt0aGlzLl9pc0hhbmRsaW5nU2Nyb2xsJiYodGhpcy5faXNIYW5kbGluZ1Njcm9sbD0hMSxvKHRoaXMuX3NldHRpbmdzLmNvbnRhaW5lciwic2Nyb2xsIix0aGlzLl9oYW5kbGVTY3JvbGxGbikpfSxfLnByb3RvdHlwZS5oYW5kbGVTY3JvbGw9ZnVuY3Rpb24oKXt2YXIgZSx0LG87dGhpcy5fc2V0dGluZ3MmJih0PWkoKSwwIT09KG89dGhpcy5fc2V0dGluZ3MudGhyb3R0bGUpPzA+PShlPW8tKHQtdGhpcy5fcHJldmlvdXNMb29wVGltZSkpfHxlPm8/KHRoaXMuX2xvb3BUaW1lb3V0JiYoY2xlYXJUaW1lb3V0KHRoaXMuX2xvb3BUaW1lb3V0KSx0aGlzLl9sb29wVGltZW91dD1udWxsKSx0aGlzLl9wcmV2aW91c0xvb3BUaW1lPXQsdGhpcy5fbG9vcFRocm91Z2hFbGVtZW50cygpKTp0aGlzLl9sb29wVGltZW91dHx8KHRoaXMuX2xvb3BUaW1lb3V0PXNldFRpbWVvdXQodSgoZnVuY3Rpb24oKXt0aGlzLl9wcmV2aW91c0xvb3BUaW1lPWkoKSx0aGlzLl9sb29wVGltZW91dD1udWxsLHRoaXMuX2xvb3BUaHJvdWdoRWxlbWVudHMoKX0pLHRoaXMpLGUpKTp0aGlzLl9sb29wVGhyb3VnaEVsZW1lbnRzKCkpfSxfLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl9lbGVtZW50cz1hKHRoaXMuX3F1ZXJ5T3JpZ2luTm9kZS5xdWVyeVNlbGVjdG9yQWxsKHRoaXMuX3NldHRpbmdzLmVsZW1lbnRzX3NlbGVjdG9yKSksdGhpcy5fcHVyZ2VFbGVtZW50cygpLHRoaXMuX2xvb3BUaHJvdWdoRWxlbWVudHMoKSx0aGlzLl9zdGFydFNjcm9sbEhhbmRsZXIoKX0sXy5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe28od2luZG93LCJyZXNpemUiLHRoaXMuX2hhbmRsZVNjcm9sbEZuKSx0aGlzLl9sb29wVGltZW91dCYmKGNsZWFyVGltZW91dCh0aGlzLl9sb29wVGltZW91dCksdGhpcy5fbG9vcFRpbWVvdXQ9bnVsbCksdGhpcy5fc3RvcFNjcm9sbEhhbmRsZXIoKSx0aGlzLl9lbGVtZW50cz1udWxsLHRoaXMuX3F1ZXJ5T3JpZ2luTm9kZT1udWxsLHRoaXMuX3NldHRpbmdzPW51bGx9LF99KSksd2luZG93Lmxhenk9InkiLHRfb25SZWFkeSgoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2xhenlsb2FkX2NvdmVyPW5ldyBMYXp5TG9hZCh7ZWxlbWVudHNfc2VsZWN0b3I6Ii50LWNvdmVyX19jYXJyaWVyIixzaG93X3doaWxlX2xvYWRpbmc6ITEsZGF0YV9zcmM6ImNvbnRlbnQtY292ZXItYmciLHBsYWNlaG9sZGVyOiIiLHRocmVzaG9sZDo3MDB9KX0pLDEwMCksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtpZihsYXp5bG9hZF9pbWc9bmV3IExhenlMb2FkKHtlbGVtZW50c19zZWxlY3RvcjoiLnQtaW1nIix0aHJlc2hvbGQ6ODAwfSksbGF6eWxvYWRfYmdpbWc9bmV3IExhenlMb2FkKHtlbGVtZW50c19zZWxlY3RvcjoiLnQtYmdpbWciLHNob3dfd2hpbGVfbG9hZGluZzohMSxwbGFjZWhvbGRlcjoiIix0aHJlc2hvbGQ6ODAwfSksbGF6eWxvYWRfaWZyYW1lPW5ldyBMYXp5TG9hZCh7ZWxlbWVudHNfc2VsZWN0b3I6Ii50LWlmcmFtZSJ9KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzbGlkZS5icy5jYXJvdXNlbCIsKGZ1bmN0aW9uKGUpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bGF6eWxvYWRfY292ZXIudXBkYXRlKCksbGF6eWxvYWRfaW1nLnVwZGF0ZSgpLGxhenlsb2FkX2JnaW1nLnVwZGF0ZSgpfSksNTAwKX0pKSwvQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiFkb2N1bWVudC5ib2R5LmNsYXNzTGlzdCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5jbGFzc0xpc3QuYWRkKCJ0LW1iZml4IiksZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1tYmZpeCIpO3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dC5jbGFzc0xpc3QuYWRkKCJ0LW1iZml4X2hpZGUiKX0pLDUwKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe251bGwhPT10LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KX0pLDFlMyl9fSksNTAwKX0pKTsKCmZ1bmN0aW9uIHRfYW5pbWF0ZV9faW5pdCgpe3RfYW5pbWF0ZV9fY2hlY2tBbmltYXRpb25BdmFpbGFiaWxpdHkoKSYmKHRfYW5pbWF0ZV9fZ2VuZXJhdGVTdHlsZXMoKSx0X2FuaW1hdGVfX3dyYXBUZXh0V2l0aE9wYWNpdHkoKSx0X2FuaW1hdGVfX2FkZE5vSG92ZXJDbGFzc1RvQnRucygpLHRfYW5pbWF0ZV9fcHJldmVudEhvcml6b250YWxTY3JvbGwoKSxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg+PTEyMDAmJnRfYW5pbWF0ZV9fcGFyc2VOdW1iZXJUZXh0KCksc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0X2FuaW1hdGVfX3N0YXJ0QW5pbWF0aW9uKCl9KSwxNTAwKSl9ZnVuY3Rpb24gdF9hbmltYXRlX19jaGVja01vYmlsZSh0KXtyZXR1cm4gdC5maWx0ZXIoKGZ1bmN0aW9uKHQpe3ZhciBlPXQuY2xvc2VzdCgiLnQzOTZfX2VsZW0sIC50Mzk2X19ncm91cCIpLGEsbjtyZXR1cm4hKCFlfHwieSIhPT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLW1vYmlsZSIpKXx8KHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJyIik/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGUiKSwoZnVuY3Rpb24odCl7dF9hbmltYXRlX19yZW1vdmVBbmltYXRpb25DbGFzcyh0LCIiKX0pKTp0X2FuaW1hdGVfX3JlbW92ZUFuaW1hdGlvbkNsYXNzKHQsIiIpLCExKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX3JlbW92ZUFuaW1hdGlvbkNsYXNzKHQsZSl7aWYodCl7dmFyIGE9InQtYW5pbWF0ZSI7dC5jbGFzc0xpc3QucmVtb3ZlKGEpLGUmJigic3RyaW5nIj09dHlwZW9mIGUmJihlPVtlXSksZS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1hKyJfIitlO3QuY2xhc3NMaXN0LnJlbW92ZShuKX0pKSl9fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fcHJldmVudEhvcml6b250YWxTY3JvbGwoKXt2YXIgdCxlPUFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWlubGVmdCJdJykpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkLCAudC1jb3ZlciIpJiZ0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0PndpbmRvdy5pbm5lcldpZHRofSkpOyFlLmxlbmd0aHx8d2luZG93LmlubmVyV2lkdGg8OTgwfHxlLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlO3QuY2xvc2VzdCgiLnIiKS5jbGFzc0xpc3QuYWRkKCJ0LWFuaW1hdGVfX292ZXJmbG93LXgtaGlkZGVuIil9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19jaGVja0FuaW1hdGlvbkF2YWlsYWJpbGl0eSgpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXJlY29yZHMiKSxlPXQ/dC5nZXRBdHRyaWJ1dGUoImRhdGEtYmxvY2tzLWFuaW1hdGlvbm9mZiIpOm51bGwsYT10P3QuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKTpudWxsO2lmKC9Cb3QvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHwieWVzIj09PWV8fHRfYW5pbWF0ZV9fY2hlY2tJRSgpfHwiZWRpdCI9PT1hKXt2YXIgbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlIik7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24odCl7dF9hbmltYXRlX19yZW1vdmVBbmltYXRpb25DbGFzcyh0LCIiKX0pKSwhMX1yZXR1cm4hMH1mdW5jdGlvbiB0X2FuaW1hdGVfX2dlbmVyYXRlU3R5bGVzKCl7dmFyIHQ7aWYoISFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudDM5NiIpKXtmb3IodmFyIGU9dF9hbmltYXRlX19nZXRCcmVha3BvaW50c0FycigpLGE9Jy50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW4iXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWludXAiXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWluZG93biJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW5sZWZ0Il0sLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbnJpZ2h0Il0sLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9Inpvb21pbiJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJ6b29tb3V0Il0ge29wYWNpdHk6IDA7LXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5LCB0cmFuc2Zvcm07dHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eSwgdHJhbnNmb3JtOy13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogMXM7dHJhbnNpdGlvbi1kdXJhdGlvbjogMXM7LXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTksIDEsIDAuMjIsIDEpO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4xOSwgMSwgMC4yMiwgMSk7LXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47YmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO30nLG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIi50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbiJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0nK2kubWluUmVzKyc9ImZhZGVpbnVwIl0sLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLScraS5taW5SZXMrJz0iZmFkZWluZG93biJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0nK2kubWluUmVzKyc9ImZhZGVpbmxlZnQiXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtJytpLm1pblJlcysnPSJmYWRlaW5yaWdodCJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0nK2kubWluUmVzKyc9Inpvb21pbiJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0nK2kubWluUmVzKyc9Inpvb21vdXQiXSB7b3BhY2l0eTogMDstd2Via2l0LXRyYW5zaXRpb24tcHJvcGVydHk6IG9wYWNpdHksIHRyYW5zZm9ybTt0cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5LCB0cmFuc2Zvcm07LXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAxczt0cmFuc2l0aW9uLWR1cmF0aW9uOiAxczstd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4xOSwgMSwgMC4yMiwgMSk7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjE5LCAxLCAwLjIyLCAxKTstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47fX0nKX1hKz0nLnQzOTYgLnQtdGl0bGUudC1hbmltYXRlIHstd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDEuMnM7dHJhbnNpdGlvbi1kdXJhdGlvbjogMS4yczt9LnQzOTYgLnQtZGVzY3IudC1hbmltYXRlLC50Mzk2IC50LXVwdGl0bGUudC1hbmltYXRlLC50Mzk2IC50LXN1YnRpdGxlLnQtYW5pbWF0ZSwudDM5NiAudC10ZXh0LnQtYW5pbWF0ZSB7LXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjdzO3RyYW5zaXRpb24tZHVyYXRpb246IDAuN3M7fS50Mzk2IC50LWl0ZW0udC1hbmltYXRlIHstd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDAuNXM7dHJhbnNpdGlvbi1kdXJhdGlvbjogMC41czt9LnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbiJdIHtvcGFjaXR5OiAwO3RyYW5zZm9ybTogbm9uZTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbiJdIHtvcGFjaXR5OiAwO3RyYW5zZm9ybTogbm9uZTt9fScpfWErPScudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW4iXSB7b3BhY2l0eTogMTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iZmFkZWluIl0ge29wYWNpdHk6IDE7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbnVwIl0gey13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMTAwcHgpO3RyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDEwMHB4KTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbnVwIl0gey13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMTAwcHgpO3RyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDEwMHB4KTt9fScpfWErPScudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW51cCJdIHtvcGFjaXR5OiAxOy13ZWJraXQtdHJhbnNmb3JtOiBub25lO3RyYW5zZm9ybTogbm9uZTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iZmFkZWludXAiXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogbm9uZTt0cmFuc2Zvcm06IG5vbmU7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbmRvd24iXSB7LXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAtMTAwcHgpO3RyYW5zZm9ybTogdHJhbnNsYXRlKDAsIC0xMDBweCk7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJmYWRlaW5kb3duIl0gey13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgLTEwMHB4KTt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAtMTAwcHgpO319Jyl9YSs9Jy50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbmRvd24iXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogbm9uZTt0cmFuc2Zvcm06IG5vbmU7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbmRvd24iXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogbm9uZTt0cmFuc2Zvcm06IG5vbmU7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbmxlZnQiXSB7LXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgxMDBweCwgMCk7dHJhbnNmb3JtOiB0cmFuc2xhdGUoMTAwcHgsIDApO30nO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iZmFkZWlubGVmdCJdIHstd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDEwMHB4LCAwKTt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgxMDBweCwgMCk7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWlubGVmdCJdIHtvcGFjaXR5OiAxOy13ZWJraXQtdHJhbnNmb3JtOiBub25lO3RyYW5zZm9ybTogbm9uZTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iZmFkZWlubGVmdCJdIHtvcGFjaXR5OiAxOy13ZWJraXQtdHJhbnNmb3JtOiBub25lO3RyYW5zZm9ybTogbm9uZTt9fScpfWErPScudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWlucmlnaHQiXSB7LXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMTAwcHgsIDApO3RyYW5zZm9ybTogdHJhbnNsYXRlKC0xMDBweCwgMCk7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJmYWRlaW5yaWdodCJdIHstd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKC0xMDBweCwgMCk7dHJhbnNmb3JtOiB0cmFuc2xhdGUoLTEwMHB4LCAwKTt9fScpfWErPScudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW5yaWdodCJdIHtvcGFjaXR5OiAxOy13ZWJraXQtdHJhbnNmb3JtOiBub25lO3RyYW5zZm9ybTogbm9uZTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iZmFkZWlucmlnaHQiXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogbm9uZTt0cmFuc2Zvcm06IG5vbmU7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9Inpvb21pbiJdIHstd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC45KTt0cmFuc2Zvcm06IHNjYWxlKDAuOSk7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJ6b29taW4iXSB7LXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuOSk7dHJhbnNmb3JtOiBzY2FsZSgwLjkpO319Jyl9YSs9Jy50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGU9Inpvb21pbiJdIHtvcGFjaXR5OiAxOy13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTt0cmFuc2Zvcm06IHNjYWxlKDEpO30nO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJ6b29taW4iXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7dHJhbnNmb3JtOiBzY2FsZSgxKTt9fScpfWErPScudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZT0iem9vbW91dCJdIHstd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4yKTt0cmFuc2Zvcm06IHNjYWxlKDEuMik7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJ6b29tb3V0Il0gey13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxLjIpO3RyYW5zZm9ybTogc2NhbGUoMS4yKTt9fScpfWErPScudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlPSJ6b29tb3V0Il0ge29wYWNpdHk6IDE7LXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO3RyYW5zZm9ybTogc2NhbGUoMSk7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9Inpvb21vdXQiXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7dHJhbnNmb3JtOiBzY2FsZSgxKTt9fScpfWErPSIudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLWRpc3RhbmNlXSwudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXNjYWxlXXstd2Via2l0LXRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50O3RyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50O30iO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1kaXN0YW5jZS1yZXMtIitpLm1pblJlcysiXSwjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9Inpvb21vdXQiXSB7LXdlYmtpdC10cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDt0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDt9fScpfXZhciByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIiksbz1kb2N1bWVudC5oZWFkfHxkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJoZWFkIik7ci50ZXh0Q29udGVudD1hLG8uYXBwZW5kQ2hpbGQocil9fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fZ2V0QnJlYWtwb2ludHNBcnIoKXt2YXIgdD1bXSxlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yW2RhdGEtcmVjb3JkLXR5cGU9IjM5NiJdOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQsIC5yW2RhdGEtcGFyZW50dHBsaWQ9IjM5NiJdOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQnKSk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSwoZnVuY3Rpb24oZSl7aWYoZS5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2FydGJvYXJkIikpe3ZhciBhPWUuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXNjcmVlbnMiKSxuPShhPShhPWE/YS5zcGxpdCgiLCIpOlsxMjAwLDk2MCw2NDAsNDgwLDMyMF0pLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHBhcnNlSW50KHQsMTApfSkpKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybi0xPT09dC5pbmRleE9mKGUpfSkpO3Q9dC5jb25jYXQobil9fSkpLHQ9dF9hbmltYXRlX19zb3J0QXJyKHQpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeSh0LGUpe3ZhciBhPSIiLG49ITEsaT10W2UrMV0scj10W2VdLTEsbz1lPT09dC5sZW5ndGgtMSxzPWU9PT10Lmxlbmd0aC0yO3JldHVybiBvP249ITA6YSs9cz8iQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogIityKyJweCkgeyI6IkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6ICIraSsicHgpIGFuZCAobWF4LXdpZHRoOiAiK3IrInB4KSB7Iix7dGV4dDphLGlzQ29udGludWU6bixtaW5SZXM6aX19ZnVuY3Rpb24gdF9hbmltYXRlX19zb3J0QXJyKHQpe3JldHVybiB0LnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUtdH0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX3N0YXJ0QW5pbWF0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnIiKSxlPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbCh0LChmdW5jdGlvbih0KXtyZXR1cm4gdC5xdWVyeVNlbGVjdG9yKCIudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1ncm91cD15ZXNdIil9KSksYT1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwodCwoZnVuY3Rpb24odCl7cmV0dXJuIHQucXVlcnlTZWxlY3RvcignLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtY2hhaW49InllcyJdJyl9KSksbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlIik7aWYobj1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwobiwoZnVuY3Rpb24odCl7cmV0dXJuISgieWVzIj09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtZ3JvdXAiKXx8InllcyI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLWNoYWluIil8fHQuZ2V0QXR0cmlidXRlKCJvYnNlcnZlci1yZWFkeSIpKX0pKSx3aW5kb3cuaW5uZXJXaWR0aDwxMjAwJiYoZT10X2FuaW1hdGVfX2NoZWNrTW9iaWxlKGUpLGE9dF9hbmltYXRlX19jaGVja01vYmlsZShhKSxuPXRfYW5pbWF0ZV9fY2hlY2tNb2JpbGUobikpLGUubGVuZ3RofHxuLmxlbmd0aHx8YS5sZW5ndGgpe3RfYW5pbWF0ZV9fc2V0QW5pbWF0aW9uU3RhdGUoZSxhLG4pLGU9dF9hbmltYXRlX19oYXNXYWl0QW5pbWF0aW9uKGUpLG49dF9hbmltYXRlX19oYXNXYWl0QW5pbWF0aW9uKG4pLGE9dF9hbmltYXRlX19oYXNXYWl0QW5pbWF0aW9uKGEpO3ZhciBpPSJ1bmRlZmluZWQiIT10eXBlb2YgbmF2aWdhdG9yJiYvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSooc2FmYXJpfG1vYmlsZSkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYvKG9zIHx2ZXJzaW9uXC8pMTUoLnxfKVs0LTldL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtpZigiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiaW4gd2luZG93JiYhaSl7aWYoZS5sZW5ndGgpe3ZhciByPVtdO2UuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudC1hbmltYXRlIiksYSxuO2lmKCJmYWRlaW5kb3duIj09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc3R5bGUiKSYmZS5jbG9zZXN0KCIudC1jb3ZlciIpKXt2YXIgaT10LnF1ZXJ5U2VsZWN0b3IoIi50LWFuaW1hdGU6bm90KDpmaXJzdC1jaGlsZCkiKTtpJiYoZT1pKX1yLnB1c2goZSl9KSksci5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT17cm9vdE1hcmdpbjp0Lm9mZnNldEhlaWdodC81Ki0xKyJweCAwcHgifSxhO25ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZnVuY3Rpb24odCxlKXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKHQuaXNJbnRlcnNlY3Rpbmcpe3ZhciBhPXQudGFyZ2V0O2UudW5vYnNlcnZlKGEpO3ZhciBuPWEuY2xvc2VzdCgiLnIiKS5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlIik7bj1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwobiwoZnVuY3Rpb24odCl7cmV0dXJuISh0LmNsYXNzTGlzdC5jb250YWlucygidC1hbmltYXRlX19idG4td2FpdC1jaGFpbiIpfHwieWVzIj09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtY2hhaW4iKSl9KSksdF9hbmltYXRlX19tYWtlU2VjdGlvbkJ1dHRvbldhaXQoYSksdF9hbmltYXRlX19zYXZlU2VjdGlvbkhlYWRlclN0YXJ0VGltZShhKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG4sKGZ1bmN0aW9uKHQpe3QuY2xhc3NMaXN0LnJlbW92ZSgidC1hbmltYXRlX3dhaXQiKSx0X2FuaW1hdGVfX3JlbW92ZU5vSG92ZXJDbGFzc0Zyb21CdG5zKHQpLHRfYW5pbWF0ZV9fc2V0U3RhcnRBbmltYXRpb25DbGFzcyh0LCExKX0pKX19KSl9KSxlKS5vYnNlcnZlKHQpfSkpfXZhciBvO2lmKG4ubGVuZ3RoJiZuLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXt9LGE9dF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKHQsInRyaWdnZXItb2Zmc2V0Iik7YSYmKGUucm9vdE1hcmdpbj0iMHB4IDBweCAiKy0xKmEucmVwbGFjZSgicHgiLCIiKSsicHggMHB4Iik7dmFyIG49bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChmdW5jdGlvbih0LGUpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGE9dC50YXJnZXQ7aWYoIWEuZGVtYW5kVHJhbnNmb3JtJiZhLnN0eWxlLnRyYW5zZm9ybSlhLmRlbWFuZFRyYW5zZm9ybT1hLnN0eWxlLnRyYW5zZm9ybSxhLnN0eWxlLnRyYW5zZm9ybT0idW5zZXQiO2Vsc2V7dmFyIG49d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkudHJhbnNmb3JtO2Euc3R5bGUudHJhbnNmb3JtfHwibm9uZSI9PT1ufHwoYS5kZW1hbmRUcmFuc2Zvcm09bixhLnN0eWxlLnRyYW5zZm9ybT0idW5zZXQiKX1pZih0LmlzSW50ZXJzZWN0aW5nKXthLmNsb3Nlc3QoIi50MTA5MyIpfHxlLnVub2JzZXJ2ZShhKTt2YXIgaT1hLnN0eWxlLnRyYW5zaXRpb25EZWxheXx8IjBtcyI7aT0tMSE9PWkuaW5kZXhPZigibXMiKT9wYXJzZUludChpKSsyNTA6MWUzKnBhcnNlRmxvYXQoaSkrMjUwO3ZhciByPWZ1bmN0aW9uIHQoKXthLmNsYXNzTGlzdC5yZW1vdmUoInQtYW5pbWF0ZV93YWl0IiksdF9hbmltYXRlX19yZW1vdmVOb0hvdmVyQ2xhc3NGcm9tQnRucyhhKSx0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3MoYSwhMCksImFuaW1hdGVkbnVtYmVyIj09PXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZShhLCJzdHlsZSIpJiZ0X2FuaW1hdGVfX2FuaW1hdGVOdW1iZXJzKGEpfTthLmRlbWFuZFRyYW5zZm9ybSYmLTEhPT1hLmRlbWFuZFRyYW5zZm9ybS5pbmRleE9mKCJtYXRyaXgiKSYmKGEuc3R5bGUudHJhbnNmb3JtPSIiKSxhLmRlbWFuZFRyYW5zZm9ybSYmInVuc2V0Ij09PWEuc3R5bGUudHJhbnNmb3JtJiYoYS5zdHlsZS50cmFuc2Zvcm09YS5kZW1hbmRUcmFuc2Zvcm0sZGVsZXRlIGEuZGVtYW5kVHJhbnNmb3JtKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3IoKX0pLGkpfX0pKX0pLGUpO3QuZGF0YXNldC5vYnNlcnZlclJlYWR5PSEwLG4ub2JzZXJ2ZSh0KX0pKSxhLmxlbmd0aCkobz1mdW5jdGlvbiB0KCl7dF9hbmltYXRlX19nZXRDaGFpbk9mZnNldHMoYSl9KSgpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7bygpfSkpKSxzZXRJbnRlcnZhbChvLDVlMyksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXt2YXIgdCxlPXdpbmRvdy5wYWdlWU9mZnNldCt3aW5kb3cuaW5uZXJIZWlnaHQ7dF9hbmltYXRlX19hbmltYXRlQ2hhaW5zQmxvY2tzKGEsZSl9KSkpfWVsc2V7dmFyIG87KG89ZnVuY3Rpb24gdCgpe3RfYW5pbWF0ZV9fZ2V0R3JvdXBzT2Zmc2V0cyhlKSx0X2FuaW1hdGVfX2dldENoYWluT2Zmc2V0cyhhKSx0X2FuaW1hdGVfX2dldEVsZW1zT2Zmc2V0cyhuKX0pKCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdF90aHJvdHRsZShvKSksc2V0SW50ZXJ2YWwobyw1ZTMpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dmFyIHQ9dF9hbmltYXRlX19kZWxldGVBbmltYXRlZEVscyhlLG4pO249dFswXTt2YXIgaT10X2FuaW1hdGVfX2FuaW1hdGVPblNjcm9sbChlPXRbMV0sYSxuKTtpJiZpLmxlbmd0aCYmKGU9aVswXSxhPWlbMV0sbj1pWzJdKX0pKSl9QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50LXBvcHVwIik7ZSYmZS5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dmFyIHQ9d2luZG93LnBhZ2VZT2Zmc2V0K3dpbmRvdy5pbm5lckhlaWdodDtpZihlLmNsYXNzTGlzdC5jb250YWlucygidC1hbmltYXRlIikmJiJ5ZXMiPT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1jaGFpbiIpfHxlLnF1ZXJ5U2VsZWN0b3IoIi50LWFuaW1hdGVbZGF0YS1hbmltYXRlLWNoYWluPXllc10iKSl7dmFyIGE9W2VdO3RfYW5pbWF0ZV9fc2V0QW5pbWF0aW9uU3RhdGVDaGFpbnMoYSksdF9hbmltYXRlX19nZXRDaGFpbk9mZnNldHMoYT1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoYSwoZnVuY3Rpb24odCl7cmV0dXJuIHQucXVlcnlTZWxlY3RvcigiLnQtYW5pbWF0ZV93YWl0Iil9KSkpLHRfYW5pbWF0ZV9fYW5pbWF0ZUNoYWluc0Jsb2NrcyhhLHQpfX0pKSl9KSl9fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fYW5pbWF0ZU9uU2Nyb2xsKHQsZSxhKXtpZih0Lmxlbmd0aHx8ZS5sZW5ndGh8fGEubGVuZ3RoKXt2YXIgbj13aW5kb3cucGFnZVlPZmZzZXQsaT1uK3dpbmRvdy5pbm5lckhlaWdodCxyLG8scztyZXR1cm5bdF9hbmltYXRlX19hbmltYXRlR3JvdXBzKHQsaSxuKSx0X2FuaW1hdGVfX2FuaW1hdGVDaGFpbnNCbG9ja3MoZSxpLG4pLHRfYW5pbWF0ZV9fYW5pbWF0ZUVsZW1zKGEsaSxuKV19fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fYW5pbWF0ZUdyb3Vwcyh0LGUpe3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKHQuY3VyVG9wT2Zmc2V0PGUpe3ZhciBhPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZSIpO2E9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGEsKGZ1bmN0aW9uKHQpe3JldHVybiEodC5jbGFzc0xpc3QuY29udGFpbnMoInQtYW5pbWF0ZV9fYnRuLXdhaXQtY2hhaW4iKXx8InllcyI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLWNoYWluIikpfSkpLHRfYW5pbWF0ZV9fbWFrZVNlY3Rpb25CdXR0b25XYWl0KHQpLHRfYW5pbWF0ZV9fc2F2ZVNlY3Rpb25IZWFkZXJTdGFydFRpbWUodCksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5yZW1vdmUoInQtYW5pbWF0ZV93YWl0IiksdF9hbmltYXRlX19yZW1vdmVOb0hvdmVyQ2xhc3NGcm9tQnRucyh0KSx0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3ModCwhMSl9KSl9fSkpLHR9ZnVuY3Rpb24gdF9hbmltYXRlX19hbmltYXRlQ2hhaW5zQmxvY2tzKHQsZSl7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5pdGVtc09mZnNldHNbMF08ZSYmdC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlX3dhaXQiKS5sZW5ndGgmJih0X2FuaW1hdGVfX2FuaW1hdGVDaGFpbkl0ZW1zT25TY3JvbGwodCxlKSx0Lml0ZW1zT2Zmc2V0cy5sZW5ndGgmJnRfYW5pbWF0ZV9fY2hlY2tTZWN0aW9uQnV0dG9uQW5pbWF0aW9uX19vdXRPZlR1cm4odCkpfSkpLHR9ZnVuY3Rpb24gdF9hbmltYXRlX19hbmltYXRlRWxlbXModCxlLGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwodCwoZnVuY3Rpb24odCl7dmFyIG49dF9hbmltYXRlX19kZXRlY3RFbGVtVHJpZ2dlck9mZnNldCh0LGUpO3JldHVybiB0LmN1clRvcE9mZnNldDxuPyh0LmNsYXNzTGlzdC5yZW1vdmUoInQtYW5pbWF0ZV93YWl0IiksdF9hbmltYXRlX19yZW1vdmVOb0hvdmVyQ2xhc3NGcm9tQnRucyh0KSx0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3ModCwhMSksImFuaW1hdGVkbnVtYmVyIj09PXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LCJzdHlsZSIpJiZ0X2FuaW1hdGVfX2FuaW1hdGVOdW1iZXJzKHQpLCEwKTohKHQuY3VyVG9wT2Zmc2V0PGEpJiZ2b2lkIDB9KSksdH1mdW5jdGlvbiB0X2FuaW1hdGVfX2RlbGV0ZUFuaW1hdGVkRWxzKHQsZSl7dmFyIGE9d2luZG93LnBhZ2VZT2Zmc2V0LG49W10saT1bXTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZih0LmN1clRvcE9mZnNldDw9YSl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLChmdW5jdGlvbih0KXt0X2FuaW1hdGVfX3JlbW92ZUFuaW1hdGlvbkNsYXNzKHQsWyJ3YWl0Iiwibm8taG92ZXIiXSl9KSl9ZWxzZSBuLnB1c2godCl9KSksZS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmN1clRvcE9mZnNldDw9YT8odF9hbmltYXRlX19yZW1vdmVBbmltYXRpb25DbGFzcyh0LFsid2FpdCIsIm5vLWhvdmVyIl0pLHRfYW5pbWF0ZV9fc2V0U3RhcnRBbmltYXRpb25DbGFzcyh0LCExKSk6aS5wdXNoKHQpfSkpLFtpLG5dfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fYW5pbWF0ZUNoYWluSXRlbXNPblNjcm9sbCh0LGUpe3ZhciBhPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZV93YWl0W2RhdGEtYW5pbWF0ZS1jaGFpbj15ZXNdIik7YT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhKTt2YXIgbj0wLGk9MCxyPXQuaXRlbXNPZmZzZXRzWzBdLG89LjE2LHM9dF9hbmltYXRlX19nZXREZWxheUZyb21QcmV2aW91c1Njcm9sbEV2ZW50KHQsbyksbD10X2FuaW1hdGVfX2dldFNlY3Rpb25IZWFkRGVhbHkodCk7YS5sZW5ndGgmJmFbMF0uY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX19jaGFpbl9maXJzdC1pbi1yb3ciKTtmb3IodmFyIG09MDttPGEubGVuZ3RoO20rKyl7dmFyIGM9YVttXSxfPXQuaXRlbXNPZmZzZXRzW21dO2lmKCEoXzxlKSlicmVhaztfIT09ciYmKGMuY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX19jaGFpbl9maXJzdC1pbi1yb3ciKSxuPSsraSxyPV8pO3ZhciBmPW4qbytzK2w7Yy5zdHlsZS50cmFuc2l0aW9uRGVsYXk9ZisicyIsYy5jbGFzc0xpc3QucmVtb3ZlKCJ0LWFuaW1hdGVfd2FpdCIpLHRfYW5pbWF0ZV9fc2V0U3RhcnRBbmltYXRpb25DbGFzcyhjLCExKSxjLnNldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXN0YXJ0LXRpbWUiLERhdGUubm93KCkrMWUzKmYpLGNbMF09PT1hW2EubGVuZ3RoLTFdJiZ0X2FuaW1hdGVfX2NoZWNrU2VjdGlvbkJ1dHRvbkFuaW1hdGlvbih0LGYpLCtfPT0rciYmbisrLGEuc3BsaWNlKG0sMSksdC5pdGVtc09mZnNldHMuc3BsaWNlKG0sMSksbS0tfXRfYW5pbWF0ZV9fY2F0Y2hUcmFuc2l0aW9uRW5kRXZlbnQodCl9ZnVuY3Rpb24gdF9hbmltYXRlX19nZXRTZWN0aW9uSGVhZERlYWx5KHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQtc2VjdGlvbl9fdGl0bGUudC1hbmltYXRlIiksYT10LnF1ZXJ5U2VsZWN0b3IoIi50LXNlY3Rpb25fX2Rlc2NyLnQtYW5pbWF0ZSIpLG49MDtpZihlKXt2YXIgaT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXN0YXJ0LXRpbWUiKXx8MDtpZihEYXRlLm5vdygpLWk8PTE2MClyZXR1cm4gbj0uMTZ9aWYoYSl7dmFyIHI9YS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zdGFydC10aW1lIil8fDA7aWYoRGF0ZS5ub3coKS1yPD0xNjApcmV0dXJuIG49LjE2fXJldHVybiBufWZ1bmN0aW9uIHRfYW5pbWF0ZV9fZ2V0RGVsYXlGcm9tUHJldmlvdXNTY3JvbGxFdmVudCh0LGUpe3ZhciBhPSF0LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGVfc3RhcnRlZCIpLmxlbmd0aCxuPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZV9fY2hhaW5fZmlyc3QtaW4tcm93LnQtYW5pbWF0ZV9zdGFydGVkIik7aWYobj1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwobiwoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWFuaW1hdGVfX2NoYWluX3Nob3dlZCIpfSkpLGF8fCFuLmxlbmd0aClyZXR1cm4gMDtpZihuLmxlbmd0aCl7dmFyIGkscixvPShuW24ubGVuZ3RoLTFdLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXN0YXJ0LXRpbWUiKXx8MCktRGF0ZS5ub3coKTtyZXR1cm4gbzw9MD9lOm8vMWUzK2V9fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fc2V0U3RhcnRBbmltYXRpb25DbGFzcyh0LGUpe2lmKHQpe2lmKGUpe3ZhciBhPSJ0LWFuaW1hdGUtZm9yLXdyYXBwZXIiLG49dC5jbG9zZXN0KCIuIithKTtuJiZuLmNsYXNzTGlzdC5yZW1vdmUoYSl9dmFyIGk7aWYodC5jbGFzc0xpc3QuYWRkKCJ0LWFuaW1hdGVfc3RhcnRlZCIpLCJmYWRlaW5sZWZ0Ij09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc3R5bGUiKSl7dmFyIHI9dC5jbG9zZXN0KCIudC1hbmltYXRlX19vdmVyZmxvdy14LWhpZGRlbiIpO3ImJiFyLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbmxlZnQiXTpub3QoLnQtYW5pbWF0ZV9zdGFydGVkKScpJiZyLmNsYXNzTGlzdC5yZW1vdmUoInQtYW5pbWF0ZV9fb3ZlcmZsb3cteC1oaWRkZW4iKX19fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fY2F0Y2hUcmFuc2l0aW9uRW5kRXZlbnQodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlX19jaGFpbl9maXJzdC1pbi1yb3cudC1hbmltYXRlX3N0YXJ0ZWQiKTtlPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChlLChmdW5jdGlvbih0KXtyZXR1cm4hdC5jbGFzc0xpc3QuY29udGFpbnMoInQtYW5pbWF0ZV9fY2hhaW5fc2hvd2VkIil9KSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLChmdW5jdGlvbih0KXt2YXIgZTtbInRyYW5zaXRpb25lbmQiLCJ3ZWJraXRUcmFuc2l0aW9uRW5kIiwib1RyYW5zaXRpb25FbmQiLCJvdHJhbnNpdGlvbmVuZCIsIk1TVHJhbnNpdGlvbkVuZCJdLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuYWRkRXZlbnRMaXN0ZW5lcihlLChmdW5jdGlvbigpe3RfYW5pbWF0ZV9fYWRkRXZlbnRPbkFuaW1hdGVDaGFpbih0KX0pKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSwoZnVuY3Rpb24oKXt0X2FuaW1hdGVfX2FkZEV2ZW50T25BbmltYXRlQ2hhaW4odCl9KSl9KSl9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19wYXJzZU51bWJlclRleHQoKXt2YXIgdD13aW5kb3cucGFnZVlPZmZzZXQsZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZT0nYW5pbWF0ZWRudW1iZXInXSIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSwoZnVuY3Rpb24oZSl7dmFyIGEsbj0iIixpPWUucXVlcnlTZWxlY3RvckFsbCgic3BhbiIpO2lmKEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaSwoZnVuY3Rpb24odCl7bis9dC5nZXRBdHRyaWJ1dGUoInN0eWxlIil8fCIiLHQucmVtb3ZlQXR0cmlidXRlKCJzdHlsZSIpLHQucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXJlZGFjdG9yLXN0eWxlIil9KSksZS5xdWVyeVNlbGVjdG9yQWxsKCdkaXZbZGF0YS1jdXN0b21zdHlsZT0ieWVzIl0nKS5sZW5ndGgpe3ZhciByPWUucXVlcnlTZWxlY3RvcignZGl2W2RhdGEtY3VzdG9tc3R5bGU9InllcyJdJyk7YT1yP3IuaW5uZXJIVE1MOiIiO3ZhciBvPWUuZ2V0QXR0cmlidXRlKCJzdHlsZSIpfHwiIixzPWUucXVlcnlTZWxlY3RvcigiZGl2W2RhdGEtY3VzdG9tc3R5bGVdIiksbD1zP3MuZ2V0QXR0cmlidXRlKCJzdHlsZSIpOiIiO2wmJihvKz1sKSxlLnNldEF0dHJpYnV0ZSgic3R5bGUiLG8pfWVsc2UgYT1lLmlubmVySFRNTDtpZihuPW4uc3BsaXQoIjsiKS5maWx0ZXIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4uc3BsaXQoIjsiKS5pbmRleE9mKHQpPT09ZX0pKS5qb2luKCI7IiksIShlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQ8dC01MDApJiZhLmxlbmd0aCl7dmFyIG09YS5yZXBsYWNlKC88YnI+L2csIiAiKS5yZXBsYWNlKC9bXlxkLiwgXSsvZywiIikucmVwbGFjZSgvIChcLnwsKS9nLCIiKS5yZXBsYWNlKC8oXGQpKD89XGQpIC9nLCIkMSIpLnRyaW0oKSxjPW07aWYoLTE9PT1hLmluZGV4T2YobSkmJihjPW09bS5zcGxpdCgiICIpWzBdKSwiIiE9PW0pe2Uuc2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtbnVtYmVyLWNvdW50IixhKSx0X2FuaW1hdGVfX2NoYW5nZU51bWJlck9uWmVybyhlLGEucmVwbGFjZShjLCJudW0iKSk7dmFyIF89ZS5xdWVyeVNlbGVjdG9yQWxsKCJzcGFuIik7Xz1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoXywoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCIudC1hbmltYXRlX19udW1iZXIiKX0pKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKF8sKGZ1bmN0aW9uKHQpe3Quc2V0QXR0cmlidXRlKCJzdHlsZSIsbil9KSl9fX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX2NoYW5nZU51bWJlck9uWmVybyh0LGUpe3QuaW5uZXJIVE1MPWUucmVwbGFjZSgvbnVtL2csJzxzcGFuIGNsYXNzPSJ0LWFuaW1hdGVfX251bWJlciI+MDwvc3Bhbj4nKX1mdW5jdGlvbiB0X2FuaW1hdGVfX2FuaW1hdGVOdW1iZXJzKHQpe2lmKCF0KXJldHVybiExO3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtbnVtYmVyLWNvdW50IiksYT1bXSxuPXQucXVlcnlTZWxlY3RvckFsbCgic3BhbiIpOyhuPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChuLChmdW5jdGlvbih0KXtyZXR1cm4hdC5jbGFzc0xpc3QuY29udGFpbnMoIi50LWFuaW1hdGVfX251bWJlciIpfSkpKS5sZW5ndGgmJihhPW5bMF0uZ2V0QXR0cmlidXRlKCJzdHlsZSIpfHwiIik7dmFyIGk9W10scj1udWxsO2lmKGUpe3I9ZS5tYXRjaCgvXGQrXC5cZCt8XGQrLFxkKy9nKTt2YXIgbz1lLm1hdGNoKC9cZCsvZykscyxsO2UucmVwbGFjZSgvKFxkKSg/PSBcZCkgL2csIiQxIikuc3BsaXQoIiAiKS5mb3JFYWNoKChmdW5jdGlvbih0KXtpc05hTihwYXJzZUludCh0LnJlcGxhY2UoL1teXGQuLCBdKy9nLCIiKSwxMCkpfHxpLnB1c2godC5yZXBsYWNlKC9bXlxkLiwgXSsvZywiIikpfSkpfXZhciBtPTAsYz0hMSxfPSExO3QucmVtb3ZlQXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtbnVtYmVyLWNvdW50IiksbnVsbCE9PXImJihfPS0xIT09clswXS5pbmRleE9mKCIsIikpLGkuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXt2YXIgYTtudWxsIT09ciYmKC0xIT09dC5pbmRleE9mKCIsIikmJihhPXQuc3BsaXQoIiwiKSksLTEhPT10LmluZGV4T2YoIi4iKSYmKGE9dC5zcGxpdCgiLiIpKSwtMT09PXQuaW5kZXhPZigiLCIpJiYtMT09PXQuaW5kZXhPZigiLiIpfHwobT1hWzFdLmxlbmd0aCxpW2VdPSthLmpvaW4oIi4iKSxjPSEwKSl9KSk7dmFyIGY9dC5xdWVyeVNlbGVjdG9yKCIudC1hbmltYXRlX19udW1iZXIiKTtpZihpWzBdKXt2YXIgZD1OdW1iZXIoaVswXSl8fDAsdT0wLHk9TWF0aC5wb3coMTAsbSk7YyYmKGQqPXksdSo9eSk7dmFyIHA9MTIsaD0wLGc9c2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7aWYodSs9ZC8xMDgsaD1jPyhNYXRoLnJvdW5kKHUpL3kpLnRvRml4ZWQobSkrIiI6TWF0aC5mbG9vcih1KSsiIixvLmxlbmd0aD4xJiYoaD1oLnJlcGxhY2UoLyhcZCkoPz0oXGR7M30pKyhbXlxkXXwkKSkvZywiJDEgIikpLF8mJihoPWgucmVwbGFjZSgvXC4vZywiLCIpKSxmJiYoZi50ZXh0Q29udGVudD1oKSx1Pj1kKXtjbGVhckludGVydmFsKGcpLHQuaW5uZXJIVE1MPWU7dmFyIG49dC5xdWVyeVNlbGVjdG9yQWxsKCJzcGFuIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbih0KXt0LnNldEF0dHJpYnV0ZSgic3R5bGUiLGEpfSkpfX0pLHApfX1mdW5jdGlvbiB0X2FuaW1hdGVfX3NldEFuaW1hdGlvblN0YXRlKHQsZSxhKXt2YXIgbj13aW5kb3cucGFnZVlPZmZzZXQsaT1uK3dpbmRvdy5pbm5lckhlaWdodDt0X2FuaW1hdGVfX3NldEdyb3Vwc0Jsb2Nrc1N0YXRlKHQsbixpKSxlLmZvckVhY2goKGZ1bmN0aW9uKHQpe3RfYW5pbWF0ZV9fYXNzaWduQ2hhaW5EZWxheSh0LGksbiksdF9hbmltYXRlX19jaGVja1NlY3Rpb25CdXR0b25BbmltYXRpb25fX291dE9mVHVybih0KX0pKSx0X2FuaW1hdGVfX3NldEFuaW1FTGVtc1N0YXRlKGEsbixpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIix0X3Rocm90dGxlKHRfYW5pbWF0ZV9fcmVtb3ZlSW5saW5lQW5pbVN0eWxlcykpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fc2V0QW5pbUVMZW1zU3RhdGUodCxlLGEpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIG49dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0O2lmKG48ZS01MDApcmV0dXJuIHRfYW5pbWF0ZV9fcmVtb3ZlQW5pbWF0aW9uQ2xhc3ModCwibm8taG92ZXIiKSwiYW5pbWF0ZWRudW1iZXIiPT09dF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKHQsInN0eWxlIikmJnRfYW5pbWF0ZV9fYW5pbWF0ZU51bWJlcnModCksITA7dmFyIGk9dF9hbmltYXRlX19kZXRlY3RFbGVtVHJpZ2dlck9mZnNldCh0LGEpO3RfYW5pbWF0ZV9fc2V0Q3VzdG9tQW5pbVNldHRpbmdzKHQsbixhKSxuPGkmJiF0LmNsb3Nlc3QoIi50MTA5MyIpJiYodF9hbmltYXRlX19yZW1vdmVOb0hvdmVyQ2xhc3NGcm9tQnRucyh0KSx0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3ModCwhMCksImFuaW1hdGVkbnVtYmVyIj09PXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LCJzdHlsZSIpJiZ0X2FuaW1hdGVfX2FuaW1hdGVOdW1iZXJzKHQpKSwobj49aXx8dC5jbG9zZXN0KCIudDEwOTMiKSkmJnQuY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX3dhaXQiKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX3NldEdyb3Vwc0Jsb2Nrc1N0YXRlKHQsZSxhKXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZSIpO249QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKG4sKGZ1bmN0aW9uKHQpe3JldHVybiEoInllcyI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLWNoYWluIikpfSkpO3ZhciBpPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldDt0X2FuaW1hdGVfX3JlbW92ZUFuaW1Gcm9tSGlkZGVuU2xpZGVzKHQpO3ZhciByPXRfYW5pbWF0ZV9fYXNzaWduU2VjdGlvbkRlbGF5KHQpO3RfYW5pbWF0ZV9fYXNzaWduR3JvdXBEZWxheSh0LHIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24obil7dmFyIHI9bi5jbG9zZXN0KCIudDM5N19fb2ZmIil8fG4uY2xvc2VzdCgiLnQzOTVfX29mZiIpfHxuLmNsb3Nlc3QoIi50NDAwX19vZmYiKTtpZihuLmNsYXNzTGlzdC5jb250YWlucygidC1hbmltYXRlX25vLWhvdmVyIikmJnImJm4uY2xhc3NMaXN0LnJlbW92ZSgidC1hbmltYXRlX25vLWhvdmVyIiksaTw9ZS0xMDApcmV0dXJuIHRfYW5pbWF0ZV9fc2F2ZVNlY3Rpb25IZWFkZXJTdGFydFRpbWUodCksdF9hbmltYXRlX19yZW1vdmVBbmltYXRpb25DbGFzcyhuLCJuby1ob3ZlciIpLG4uc3R5bGUudHJhbnNpdGlvbkRlbGF5PSIiLCEwO2k8YSYmaT5lLTEwMCYmKHRfYW5pbWF0ZV9fbWFrZVNlY3Rpb25CdXR0b25XYWl0KHQpLG4uY2xhc3NMaXN0LmNvbnRhaW5zKCIudC1hbmltYXRlX19idG4td2FpdC1jaGFpbiIpfHwodF9hbmltYXRlX19yZW1vdmVOb0hvdmVyQ2xhc3NGcm9tQnRucyhuKSxyP24uY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX3dhaXQiKTp0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3MobiwhMSkpKSxpPj1hJiZuLmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV93YWl0Iil9KSl9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19zZXRBbmltYXRpb25TdGF0ZUNoYWlucyh0KXtpZighdHx8IXQubGVuZ3RoKXJldHVybiExO3ZhciBlPXdpbmRvdy5wYWdlWU9mZnNldCxhPWUrd2luZG93LmlubmVySGVpZ2h0O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodCwoZnVuY3Rpb24odCl7dF9hbmltYXRlX19hc3NpZ25DaGFpbkRlbGF5KHQsYSxlKSx0X2FuaW1hdGVfX2NoZWNrU2VjdGlvbkJ1dHRvbkFuaW1hdGlvbl9fb3V0T2ZUdXJuKHQpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fYXNzaWduU2VjdGlvbkRlbGF5KHQpe3ZhciBlPTAsYT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNlY3Rpb25fX3RpdGxlLnQtYW5pbWF0ZSIpLG49dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zZWN0aW9uX19kZXNjci50LWFuaW1hdGUiKTtyZXR1cm4gYS5sZW5ndGgmJihlPS4xNiksbi5sZW5ndGgmJihBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG4sKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWUrInMifSkpLGUrPS4xNiksZX1mdW5jdGlvbiB0X2FuaW1hdGVfX2Fzc2lnbkdyb3VwRGVsYXkodCxlKXt2YXIgYT0wO2lmKHQucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtYW5pbWF0ZS1vcmRlcl0iKS5sZW5ndGgpdF9hbmltYXRlX19hc3NpZ25PcmRlcmVkRWxlbXNEZWxheSh0LGUpO2Vsc2V7dmFyIG49dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1pbWcudC1hbmltYXRlIiksaT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXVwdGl0bGUudC1hbmltYXRlIikscj10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXRpdGxlLnQtYW5pbWF0ZSIpO3I9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKHIsKGZ1bmN0aW9uKHQpe3JldHVybiF0LmNsYXNzTGlzdC5jb250YWlucygidC1zZWN0aW9uX190aXRsZSIpfSkpO3ZhciBvPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtZGVzY3IudC1hbmltYXRlIik7bz1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwobywoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNlY3Rpb25fX2Rlc2NyIil9KSk7dmFyIHM9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1idG4udC1hbmltYXRlLCAudC1idG53cmFwcGVyLnQtYW5pbWF0ZSIpO3M9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKHMsKGZ1bmN0aW9uKHQpe3JldHVybiF0LmNsb3Nlc3QoIi50LXNlY3Rpb25fX2JvdHRvbXdyYXBwZXIiKX0pKTt2YXIgbD10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXRpbWVyLnQtYW5pbWF0ZSIpLG09dC5xdWVyeVNlbGVjdG9yQWxsKCJmb3JtLnQtYW5pbWF0ZSIpO24ubGVuZ3RoJiYoYT0uNSksci5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwociwoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSksci5sZW5ndGgmJihhKz0uMyksby5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobywoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSksby5sZW5ndGgmJihhKz0uMyksaS5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaSwoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSksaS5sZW5ndGgmJihhKz0uMyksKGkubGVuZ3RofHxyLmxlbmd0aHx8by5sZW5ndGgpJiYoYSs9LjIpLGwubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGwsKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpLGwubGVuZ3RoJiYoYSs9LjUpLHMubGVuZ3RoJiYoc1swXS5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyIpLDI9PT1zLmxlbmd0aCYmKGErPS40KSwyPT09cy5sZW5ndGgmJihzWzFdLnN0eWxlLnRyYW5zaXRpb25EZWxheT1hKyJzIiksMCE9PW0ubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG0sKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpfX1mdW5jdGlvbiB0X2FuaW1hdGVfX2Fzc2lnbk9yZGVyZWRFbGVtc0RlbGF5KHQsZSl7dmFyIGE9MDtlJiYoYT1lKTt2YXIgbj10LnF1ZXJ5U2VsZWN0b3JBbGwoJy50LWFuaW1hdGVbZGF0YS1hbmltYXRlLW9yZGVyPSIxIl0nKSxpPXQucXVlcnlTZWxlY3RvckFsbCgnLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtb3JkZXI9IjIiXScpLHI9dC5xdWVyeVNlbGVjdG9yQWxsKCcudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1vcmRlcj0iMyJdJyksbz10LnF1ZXJ5U2VsZWN0b3JBbGwoJy50LWFuaW1hdGVbZGF0YS1hbmltYXRlLW9yZGVyPSI0Il0nKSxzPXQucXVlcnlTZWxlY3RvckFsbCgnLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtb3JkZXI9IjUiXScpLGw9dC5xdWVyeVNlbGVjdG9yQWxsKCcudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1vcmRlcj0iNiJdJyksbT10LnF1ZXJ5U2VsZWN0b3JBbGwoJy50LWFuaW1hdGVbZGF0YS1hbmltYXRlLW9yZGVyPSI3Il0nKSxjPXQucXVlcnlTZWxlY3RvckFsbCgnLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtb3JkZXI9IjgiXScpLF89dC5xdWVyeVNlbGVjdG9yQWxsKCcudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1vcmRlcj0iOSJdJyk7bi5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSksbi5sZW5ndGgmJmkubGVuZ3RoJiYoYSs9MSp0X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UoaVswXSwiZGVsYXkiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpKSwobi5sZW5ndGh8fGkubGVuZ3RoKSYmci5sZW5ndGgmJihhKz0xKnRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZShyWzBdLCJkZWxheSIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwociwoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSkpLChuLmxlbmd0aHx8aS5sZW5ndGh8fHIubGVuZ3RoKSYmby5sZW5ndGgmJihhKz0xKnRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZShvWzBdLCJkZWxheSIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobywoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSkpLChuLmxlbmd0aHx8aS5sZW5ndGh8fHIubGVuZ3RofHxvLmxlbmd0aCkmJnMubGVuZ3RoJiYoYSs9MSp0X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2Uoc1swXSwiZGVsYXkiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHMsKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpKSwobi5sZW5ndGh8fGkubGVuZ3RofHxyLmxlbmd0aHx8by5sZW5ndGh8fHMubGVuZ3RoKSYmbC5sZW5ndGgmJihhKz0xKnRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZShsWzBdLCJkZWxheSIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobCwoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSkpLChuLmxlbmd0aHx8aS5sZW5ndGh8fHIubGVuZ3RofHxvLmxlbmd0aHx8cy5sZW5ndGh8fGwubGVuZ3RoKSYmbS5sZW5ndGgmJihhKz0xKnRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZShtWzBdLCJkZWxheSIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobSwoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSkpLChuLmxlbmd0aHx8aS5sZW5ndGh8fHIubGVuZ3RofHxvLmxlbmd0aHx8cy5sZW5ndGh8fGwubGVuZ3RofHxtLmxlbmd0aCkmJmMubGVuZ3RoJiYoYSs9MSp0X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UoY1swXSwiZGVsYXkiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGMsKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpKSwobi5sZW5ndGh8fGkubGVuZ3RofHxyLmxlbmd0aHx8by5sZW5ndGh8fHMubGVuZ3RofHxsLmxlbmd0aHx8bS5sZW5ndGh8fGMubGVuZ3RoKSYmXy5sZW5ndGgmJihhKz0xKnRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZShfWzBdLCJkZWxheSIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoXywoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fYXNzaWduQ2hhaW5EZWxheSh0LGUsYSl7dmFyIG49dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1jaGFpbj15ZXNdIiksaT0wO2lmKG4ubGVuZ3RoKXt2YXIgcj1uWzBdLG89ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0O3IuY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX19jaGFpbl9maXJzdC1pbi1yb3ciKTt2YXIgcz10X2FuaW1hdGVfX2dldEN1ckJsb2NrU2VjdGlvbkhlYWREZWxheSh0KTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG4sKGZ1bmN0aW9uKGwpe3ZhciBtPWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldDtpZihtPGEpcmV0dXJuIHRfYW5pbWF0ZV9fcmVtb3ZlQW5pbWF0aW9uQ2xhc3MobCwiIiksITA7aWYobTxlKXttIT09byYmKGwuY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX19jaGFpbl9maXJzdC1pbi1yb3ciKSxvPW0pO3ZhciBjPS4xNippK3MsXztsLnN0eWxlLnRyYW5zaXRpb25EZWxheT1jKyJzIix0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3MobCwhMSksbC5zZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zdGFydC10aW1lIixEYXRlLm5vdygpKzFlMypjKSxyPT09bltuLmxlbmd0aC0xXSYmdF9hbmltYXRlX19jaGVja1NlY3Rpb25CdXR0b25BbmltYXRpb24odCxjKSxpKyssWyJ0cmFuc2l0aW9uZW5kIiwid2Via2l0VHJhbnNpdGlvbkVuZCIsIm9UcmFuc2l0aW9uRW5kIiwib3RyYW5zaXRpb25lbmQiLCJNU1RyYW5zaXRpb25FbmQiXS5mb3JFYWNoKChmdW5jdGlvbih0KXtsLmFkZEV2ZW50TGlzdGVuZXIodCwoZnVuY3Rpb24oKXt0X2FuaW1hdGVfX2FkZEV2ZW50T25BbmltYXRlQ2hhaW4obCl9KSksbC5yZW1vdmVFdmVudExpc3RlbmVyKHQsKGZ1bmN0aW9uKCl7dF9hbmltYXRlX19hZGRFdmVudE9uQW5pbWF0ZUNoYWluKGwpfSkpfSkpfWVsc2UgbC5jbGFzc0xpc3QuYWRkKCJ0LWFuaW1hdGVfd2FpdCIpfSkpfX1mdW5jdGlvbiB0X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UodCxlKXt2YXIgYSxuPXQuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIik7aWYoIW4pcmV0dXJuIHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtIitlKTt2YXIgaSxyPSJhYiIrbi5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKSxvLHMsbDt2b2lkIDAhPT13aW5kb3cudG5bcl0/KG89d2luZG93LnRuW3JdLmN1clJlc29sdXRpb24scz13aW5kb3cudG5bcl0uY3VyUmVzb2x1dGlvbl9tYXgsbD13aW5kb3cudG5bcl0uc2NyZWVucy5zbGljZSgpKToobz13aW5kb3cudG4uY3VyUmVzb2x1dGlvbixzPTEyMDAsbD1bMzIwLDQ4MCw2NDAsOTYwLDEyMDBdKTt2YXIgbT10LmNsb3Nlc3QoIi50Mzk2X19lbGVtLCAudDM5Nl9fZ3JvdXAiKSxjPW0mJm0uZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtbW9iaWxlIik7aWYobz09PXMpYT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLSIrZSk7ZWxzZXtpZigieSIhPT1jJiZvPDEyMDApcmV0dXJuIHQuc3R5bGUudHJhbnNpdGlvbj0ibm9uZSIsbnVsbDthPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtIitlKyItcmVzLSIrbyl9aWYoIWEmJiIiIT09YSlmb3IodmFyIF89MDtfPGwubGVuZ3RoO18rKyl7dmFyIGY9bFtfXTtpZighKGY8PW8pJiYoYT1mPT09cz90LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLSIrZSk6dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS0iK2UrIi1yZXMtIitmKSkpYnJlYWt9cmV0dXJuIGF9ZnVuY3Rpb24gdF9hbmltYXRlX19oYXNXYWl0QW5pbWF0aW9uKHQpe3JldHVybiB0LmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWFuaW1hdGVfd2FpdCIpfHx0LnF1ZXJ5U2VsZWN0b3IoIi50LWFuaW1hdGVfd2FpdCIpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fYWRkRXZlbnRPbkFuaW1hdGVDaGFpbih0KXt0LmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV9fY2hhaW5fc2hvd2VkIil9ZnVuY3Rpb24gdF9hbmltYXRlX19zZXRDdXN0b21BbmltU2V0dGluZ3ModCxlLGEpe3ZhciBuPXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LCJzdHlsZSIpLGk9dF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKHQsImRpc3RhbmNlIik7aWYoaSYmIiIhPT1pKXtzd2l0Y2goaT1pLnJlcGxhY2UoInB4IiwiIiksdC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249IjBzIix0LnN0eWxlLnRyYW5zaXRpb25EZWxheT0iMHMiLG4pe2Nhc2UiZmFkZWludXAiOnQuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGUzZCgwLCIraSsicHgsMCkiO2JyZWFrO2Nhc2UiZmFkZWluZG93biI6dC5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZTNkKDAsLSIraSsicHgsMCkiO2JyZWFrO2Nhc2UiZmFkZWlubGVmdCI6dC5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZTNkKCIraSsicHgsMCwwKSI7YnJlYWs7Y2FzZSJmYWRlaW5yaWdodCI6dC5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZTNkKC0iK2krInB4LDAsMCkifXRfYW5pbWF0ZV9fZm9yY2VFbGVtSW5WaWV3UG9ydFJlcGFpbnQodCxlLGEpLHQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPSIiLHQuc3R5bGUudHJhbnNpdGlvbkRlbGF5PSIifXZhciByPXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LCJzY2FsZSIpO3ImJih0LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj0iMHMiLHQuc3R5bGUudHJhbnNpdGlvbkRlbGF5PSIwcyIsdC5zdHlsZS50cmFuc2Zvcm09InNjYWxlKCIrcisiKSIsdF9hbmltYXRlX19mb3JjZUVsZW1JblZpZXdQb3J0UmVwYWludCh0LGUsYSksdC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249IiIsdC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9IiIpO3ZhciBvPXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LCJkZWxheSIpO28mJih0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1vKyJzIik7dmFyIHM9dF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKHQsImR1cmF0aW9uIik7cyYmKHQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPXMrInMiKX1mdW5jdGlvbiB0X2FuaW1hdGVfX3JlbW92ZUlubGluZUFuaW1TdHlsZXMoKXtpZih3aW5kb3cuaW5uZXJXaWR0aDw5ODApe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50Mzk2X19lbGVtLnQtYW5pbWF0ZTpub3QoLnQtYW5pbWF0ZV93YWl0KSIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodCwoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2Zvcm09IiIsdC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249IiIsdC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9IiJ9KSl9fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fZm9yY2VFbGVtSW5WaWV3UG9ydFJlcGFpbnQodCxlLGEpe3QmJmU8YSs1MDAmJnQub2Zmc2V0SGVpZ2h0fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fZGV0ZWN0RWxlbVRyaWdnZXJPZmZzZXQodCxlKXt2YXIgYT10X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UodCwidHJpZ2dlci1vZmZzZXQiKSxuPWU7cmV0dXJuIGEmJihuPWUtMSooYT1hLnJlcGxhY2UoInB4IiwiIikpKSxufWZ1bmN0aW9uIHRfYW5pbWF0ZV9fc2F2ZVNlY3Rpb25IZWFkZXJTdGFydFRpbWUodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zZWN0aW9uX190aXRsZS50LWFuaW1hdGUiKSxhPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtc2VjdGlvbl9fZGVzY3IudC1hbmltYXRlIik7ZS5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSwoZnVuY3Rpb24odCl7dC5zZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zdGFydC10aW1lIixEYXRlLm5vdygpKX0pKSxhLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLChmdW5jdGlvbih0KXt0LnNldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXN0YXJ0LXRpbWUiLERhdGUubm93KCkrMTYwKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX2dldEN1ckJsb2NrU2VjdGlvbkhlYWREZWxheSh0KXt2YXIgZT0wO3JldHVybiB0LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNlY3Rpb25fX3RpdGxlLnQtYW5pbWF0ZSIpLmxlbmd0aCYmKGUrPS4xNiksdC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zZWN0aW9uX19kZXNjci50LWFuaW1hdGUiKS5sZW5ndGgmJihlKz0uMTYpLGV9ZnVuY3Rpb24gdF9hbmltYXRlX19tYWtlU2VjdGlvbkJ1dHRvbldhaXQodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1jaGFpbj15ZXNdIikubGVuZ3RoLGE9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zZWN0aW9uX19ib3R0b213cmFwcGVyIC50LWJ0bi50LWFuaW1hdGUiKTtlLmxlbmd0aCYmYS5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYSwoZnVuY3Rpb24odCl7dC5jbGFzc0xpc3QuYWRkKCJ0LWFuaW1hdGVfX2J0bi13YWl0LWNoYWluIil9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19jaGVja1NlY3Rpb25CdXR0b25BbmltYXRpb24odCxlKXt2YXIgYT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGVfX2J0bi13YWl0LWNoYWluIik7YS5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYSwoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9ZSsuMTYrInMiLHRfYW5pbWF0ZV9fcmVtb3ZlTm9Ib3ZlckNsYXNzRnJvbUJ0bnModCksdC5jbGFzc0xpc3QucmVtb3ZlKCJ0LWFuaW1hdGVfX2J0bi13YWl0LWNoYWluIiksdF9hbmltYXRlX19zZXRTdGFydEFuaW1hdGlvbkNsYXNzKHQsITEpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fY2hlY2tTZWN0aW9uQnV0dG9uQW5pbWF0aW9uX19vdXRPZlR1cm4odCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1jaGFpbj15ZXNdIiksYTsoZT1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoZSwoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWFuaW1hdGVfc3RhcnRlZCIpfSkpKS5sZW5ndGh8fHRfYW5pbWF0ZV9fY2hlY2tTZWN0aW9uQnV0dG9uQW5pbWF0aW9uKHQsLjE2KX1mdW5jdGlvbiB0X2FuaW1hdGVfX2FkZE5vSG92ZXJDbGFzc1RvQnRucygpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWJ0bi50LWFuaW1hdGUiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQsKGZ1bmN0aW9uKHQpe3QuY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX25vLWhvdmVyIil9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19yZW1vdmVOb0hvdmVyQ2xhc3NGcm9tQnRucyh0KXtpZighdClyZXR1cm4hMTt2YXIgZT10LmNsYXNzTGlzdC5jb250YWlucygidC1idG4iKT90Om51bGw7ZSYmKGUub250cmFuc2l0aW9uZW5kPWZ1bmN0aW9uKHQpeyJvcGFjaXR5IiE9PXQucHJvcGVydHlOYW1lJiYidHJhbnNmb3JtIiE9PXQucHJvcGVydHlOYW1lfHwoZS5jbGFzc0xpc3QucmVtb3ZlKCJ0LWFuaW1hdGVfbm8taG92ZXIiKSxlLnN0eWxlLnRyYW5zaXRpb25EZWxheT0iIixlLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj0iIix0aGlzLm9udHJhbnNpdGlvbmVuZD1udWxsKX0pfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fZ2V0R3JvdXBzT2Zmc2V0cyh0KXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQtYW5pbWF0ZSIpO2lmKGUpe3QuY3VyVG9wT2Zmc2V0PWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldDt2YXIgYT10X2FuaW1hdGlvbl9fZ2V0Wm9vbSh0KTt3aW5kb3cuaXNPbmx5U2NhbGFibGV8fCh0LmN1clRvcE9mZnNldCo9YSl9fSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uX19nZXRab29tKHQpe2lmKHZvaWQgMCE9PXQuc2NhbGVGYWN0b3IpcmV0dXJuIHQuc2NhbGVGYWN0b3I7dmFyIGU9dC5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKTtpZighZSlyZXR1cm4gMTt2YXIgYT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbc3JjKj0idGlsZGEtYmxvY2tzLTIuNyJdJyk7cmV0dXJuIGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19hcnRib2FyZF9zY2FsZSIpfHwhYSYmInVuZGVmaW5lZCIhPXR5cGVvZiB0Mzk2X2FiX19nZXRGaWVsZFZhbHVlJiYid2luZG93Ij09PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUoZSwidXBzY2FsZSIpP3dpbmRvdy50bl9zY2FsZV9mYWN0b3I6MX1mdW5jdGlvbiB0X2FuaW1hdGVfX2dldENoYWluT2Zmc2V0cyh0KXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZV93YWl0W2RhdGEtYW5pbWF0ZS1jaGFpbj15ZXNdIik7dC5pdGVtc09mZnNldHM9W10sQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLChmdW5jdGlvbihlLGEpe3QuaXRlbXNPZmZzZXRzW2FdPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldH0pKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX2dldEVsZW1zT2Zmc2V0cyh0KXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuY3VyVG9wT2Zmc2V0PXdpbmRvdy5wYWdlWU9mZnNldCt0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDt2YXIgZT10X2FuaW1hdGlvbl9fZ2V0Wm9vbSh0KTt3aW5kb3cuaXNPbmx5U2NhbGFibGV8fCh0LmN1clRvcE9mZnNldCo9ZSl9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19yZW1vdmVBbmltRnJvbUhpZGRlblNsaWRlcyh0KXt2YXIgZTtpZih0LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsaWRlcyIpLmxlbmd0aCl7dmFyIGE9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGlkZXNfX2l0ZW0iKTthPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLChmdW5jdGlvbih0KXtyZXR1cm4hdC5jbGFzc0xpc3QuY29udGFpbnMoInQtc2xpZGVzX19pdGVtX2FjdGl2ZSIpfSkpO3ZhciBuPVtdO2EuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudC1hbmltYXRlIik7ZSYmbi5wdXNoKGUpfSkpLG4uZm9yRWFjaCgoZnVuY3Rpb24odCl7dF9hbmltYXRlX19yZW1vdmVBbmltYXRpb25DbGFzcyh0LCJuby1ob3ZlciIpfSkpfX1mdW5jdGlvbiB0X2FuaW1hdGVfX3dyYXBUZXh0V2l0aE9wYWNpdHkoKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC10aXRsZS50LWFuaW1hdGUsIC50LWRlc2NyLnQtYW5pbWF0ZSwgLnQtdXB0aXRsZS50LWFuaW1hdGUsIC50LXRleHQudC1hbmltYXRlIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt2YXIgZT10LmdldEF0dHJpYnV0ZSgic3R5bGUiKTtpZihlJiYtMSE9PWUuaW5kZXhPZigib3BhY2l0eSIpKXt2YXIgYT10LnN0eWxlLm9wYWNpdHk7aWYoYSYmYT4wKXt0LnN0eWxlLm9wYWNpdHk9IiI7dmFyIG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bi5zdHlsZS5vcGFjaXR5PWE7dmFyIGk9dC5jaGlsZE5vZGVzO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaSwoZnVuY3Rpb24odCl7dmFyIGU9dC5jbG9uZU5vZGUoITApO24uYXBwZW5kQ2hpbGQoZSl9KSksdC5pbm5lckhUTUw9IiIsdC5hcHBlbmRDaGlsZChuKX19fSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fY2hlY2tJRSgpe3ZhciB0PXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LGU9dC5pbmRleE9mKCJNU0lFIiksYT0iIixuPSExO3JldHVybiBlPjAmJig4IT09KGE9cGFyc2VJbnQodC5zdWJzdHJpbmcoZSs1LHQuaW5kZXhPZigiLiIsZSkpKSkmJjkhPT1hfHwobj0hMCkpLG59ImxvYWRpbmciIT09ZG9jdW1lbnQucmVhZHlTdGF0ZT90X2FuaW1hdGVfX2luaXQoKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIix0X2FuaW1hdGVfX2luaXQpOwoKZnVuY3Rpb24gdDM5Nl9fcGFyc2VHbG9iYWxTdHlsZUNTU1Zhcih0KXt0cnl7dmFyIGUsaT0vdmFyXCgoLS11Yy0oW14tXSspLShbXi1dKyktKFteLF0rKSksXHM/KC4qKVwpLy5leGVjKHQpO2lmKCFpKXJldHVybjt2YXIgcj1pWzBdLG89aVsxXSxuPWlbMl0sYT1pWzNdLGw9aVs0XSxkPWlbNV0sXyxzO2lmKCEociYmbiYmYSYmbCYmZCkpcmV0dXJuO3JldHVybntwYXJlbnQ6e2lkOmwsdHlwZTpufSxmYWxsYmFjazp3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKG8pfHxkLGZpZWxkOmF9fWNhdGNoKHUpe2NvbnNvbGUuZXJyb3IoIkVycm9yIHRyeWluZyB0byBwYXJzZSBDU1MgVmFyaWFibGUiKX19ZnVuY3Rpb24gdDM5Nl9faGV4MnJnYmEodCxlKXtpZighdClyZXR1cm4hMTt2YXIgaT10Mzk2X19wYXJzZUdsb2JhbFN0eWxlQ1NTVmFyKHQpO2kmJih0PWkuZmFsbGJhY2spO3ZhciByPXQucmVwbGFjZSgvIy8sIiIpO2lmKDM9PT1yLmxlbmd0aCl7dmFyIG89clswXSxuPXJbMV0sYT1yWzJdO3Q9IiMiK28rbytuK24rYSthfXZhciBsPXBhcnNlSW50KHQuc3Vic3RyaW5nKDEpLDE2KSxkLF8scztyZXR1cm5bKDE2NzExNjgwJmwpPj4xNiwoNjUyODAmbCk+PjgsMjU1JmwscGFyc2VGbG9hdChlKV19ZnVuY3Rpb24gdDM5Nl9faXNFbGVtZW50VXNpbmdDYWxjWm9vbSh0KXt2YXIgZT1bImdhbGxlcnkiXSxpPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpO3JldHVybiBlLmluY2x1ZGVzKGkpfWZ1bmN0aW9uIHQzOTZfX2lzRmxleCh0KXt2YXIgZT10LmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fYXJ0Ym9hcmQtZmxleCIpLGk9dC5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2dyb3VwLWZsZXgiKTtyZXR1cm4gZXx8aX1mdW5jdGlvbiB0Mzk2X19zZXRPdmVyZmxvd1RvQWxsUmVjb3Jkcygpe3ZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIik7aWYodCl7dmFyIGU9WyIudDk1MV9fc2lkZWJhcl9zdGlja3kiLCIudDEyMDZfX2NvbnRlbnRfc3RpY2t5IiwiLnQ3NTRfX2NvbF9maXhlZCIsIi50Nzc2X19jb2xfZml4ZWQiLCIudDc4Nl9fY29sX2ZpeGVkIiwiLnQtc3RvcmVfX3Byb2QtcG9wdXBfX2NvbF9maXhlZCIsIi50LWNhdGFsb2dfX3NpZGViYXJfc3RpY2t5Il07dDM5Nl9fZ2VuZXJhdGVPdmVyZmxvd1N0eWxlKCk7dmFyIGk9Qm9vbGVhbihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGUuam9pbigiLCAiKSkpO3QuY2xhc3NMaXN0LnJlbW92ZSgidC1yZWNvcmRzX19vdmVyZmxvdy1jbGlwIiwidC1yZWNvcmRzX19vdmVyZmxvdy1oaWRkZW4iKSx0LmNsYXNzTGlzdC5hZGQoaT8idC1yZWNvcmRzX19vdmVyZmxvdy1jbGlwIjoidC1yZWNvcmRzX19vdmVyZmxvdy1oaWRkZW4iKX19ZnVuY3Rpb24gdDM5Nl9fZ2VuZXJhdGVPdmVyZmxvd1N0eWxlKCl7aWYoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0Mzk2X19vdmVyZmxvdy1zdHlsZXMiKSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTt0LmlkPSJ0Mzk2X19vdmVyZmxvdy1zdHlsZXMiLHQuaW5uZXJIVE1MPSIudC1yZWNvcmRzX19vdmVyZmxvdy1jbGlwIHsgb3ZlcmZsb3c6IGNsaXA7IH1cblx0XHRcdFx0XHRcdC50LXJlY29yZHNfX292ZXJmbG93LWhpZGRlbiB7IG92ZXJmbG93OiBoaWRkZW47IH0iLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodCl9fWZ1bmN0aW9uIHQzOTZfX2dldEFydGJvYXJkcyh0KXt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLGkscj1lJiYiZWRpdCI9PT1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tb2RlIik/Jy5yZWNvcmRbZGF0YS1yZWNvcmQtdHlwZT0iJyt0KyciXSAucjpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkLCAucmVjb3JkW2RhdGEtcGFyZW50dHBsaWQ9IicrdCsnIl0gLnI6bm90KC50Mzk3X19vZmYsIC50Mzk1X19vZmYsIC50NDAwX19vZmYpIC50Mzk2X19hcnRib2FyZCc6Jy5yW2RhdGEtcmVjb3JkLXR5cGU9IicrdCsnIl06bm90KC50Mzk3X19vZmYsIC50Mzk1X19vZmYsIC50NDAwX19vZmYpIC50Mzk2X19hcnRib2FyZCwgLnJbZGF0YS1wYXJlbnR0cGxpZD0iJyt0KyciXTpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkJztyZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHIpKX1mdW5jdGlvbiB0Mzk2X19nZXRaZXJvQmxvY2tzKCl7dmFyIHQ9W10uY29uY2F0KHQzOTZfX2dldEFydGJvYXJkcygiMzk2IiksdDM5Nl9fZ2V0QXJ0Ym9hcmRzKCIxMjEiKSksZTtyZXR1cm4gdC5sZW5ndGg/dC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybntyZWNvcmQ6dC5jbG9zZXN0KCIucjpub3QoLnQzOTdfX29mZik6bm90KC50Mzk1X19vZmYpOm5vdCgudDQwMF9fb2ZmKSIpLGFydGJvYXJkOnR9fSkpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQucmVjb3JkfSkpOltdfWZ1bmN0aW9uIHQzOTZfX2lzSW5zaWRlR3JvdXBXaXRoWm9vbSh0KXtmb3IodmFyIGU9dC5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKTtlOyl7dmFyIGk7aWYoZS5zdHlsZS56b29tKXJldHVybiEwO2U9bnVsbD09KGk9ZS5wYXJlbnRFbGVtZW50KT92b2lkIDA6aS5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKX1yZXR1cm4hMX12YXIgdDM5Nl9fdW5pcXVlSWRfX2dlbmVyYXRvcj1mdW5jdGlvbiB0KCl7dmFyIGU9MDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD1TdHJpbmcoZSs9MSkucGFkU3RhcnQoNiwiMCIpO3JldHVybiIiK0RhdGUubm93KCkrdH19LHQzOTZfX2dldFVuaXF1ZUlkPXQzOTZfX3VuaXF1ZUlkX19nZW5lcmF0b3IoKTtmdW5jdGlvbiB0Mzk2X2lzQmxvY2tWaXNpYmxlKHQpe3ZhciBlPXdpbmRvdy5pbm5lcldpZHRoLGk9dC5nZXRBdHRyaWJ1dGUoImRhdGEtc2NyZWVuLW1pbiIpLHI9dC5nZXRBdHRyaWJ1dGUoImRhdGEtc2NyZWVuLW1heCIpO3JldHVybiEoaSYmZTxwYXJzZUludChpLDEwKSkmJiEociYmZT5wYXJzZUludChyLDEwKSl9dmFyIHQzOTZfX29uUmVhZHk9ZnVuY3Rpb24gdChlKXsibG9hZGluZyIhPT1kb2N1bWVudC5yZWFkeVN0YXRlP2UoKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixlKX0sdDM5Nl9faHRtbFRleHREZWNvZGVyO2Z1bmN0aW9uIHQzOTZfX2RlY29kZUh0bWxUZXh0KHQpe3JldHVybiB0Pyh0Mzk2X19odG1sVGV4dERlY29kZXJ8fCh0Mzk2X19odG1sVGV4dERlY29kZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiKSksdDM5Nl9faHRtbFRleHREZWNvZGVyLmlubmVySFRNTD10LHQzOTZfX2h0bWxUZXh0RGVjb2Rlci52YWx1ZSk6IiJ9ZnVuY3Rpb24gdDM5Nl9lbGVtX19nZXRGb3JtSW5wdXRzVmFsdWUodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9faW5wdXRzLWRhdGEiKTtpZihlKXt2YXIgaT1lLmdldEF0dHJpYnV0ZSgiZGF0YS12YWx1ZSIpO2lmKGkpdHJ5e3JldHVybiBKU09OLnBhcnNlKGkpfWNhdGNoKG4pe3JldHVybiBjb25zb2xlLmVycm9yKCJFcnJvciBwYXJzaW5nIGZvcm0gaW5wdXRzIGRhdGE6IixuLGkpLFtdfX12YXIgcj10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19pbnB1dHMtdGV4dGFyZWEiKTtpZihyKXt2YXIgbz1yLnZhbHVlO2lmKG8pdHJ5e3JldHVybiBKU09OLnBhcnNlKG8pfWNhdGNoKG4pe3JldHVybiBjb25zb2xlLmVycm9yKCJFcnJvciBwYXJzaW5nIGZvcm0gaW5wdXRzIHRleHRhcmVhIHZhbHVlOiIsbixvKSxbXX19cmV0dXJuW119ZnVuY3Rpb24gdDM5Nl9nZXRFbCh0KXtyZXR1cm4gd2luZG93LmpRdWVyeSYmdCBpbnN0YW5jZW9mIGpRdWVyeT90Lmxlbmd0aD90LmdldCgwKTpudWxsOnR9ZnVuY3Rpb24gdDM5Nl9fZG9lc0NsaWVudFJlY3RJbmNsdWRlWm9vbSgpe3RyeXt2YXIgdD0yLGU9NTAsaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtpLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDt0b3A6MDt2aXNpYmlsaXR5OmhpZGRlbjtwb2ludGVyLWV2ZW50czpub25lO3dpZHRoOjUwcHg7aGVpZ2h0OjUwcHg7em9vbToyOyIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpKTt2YXIgcixvPWkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7cmV0dXJuIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaSksMTAwPT09b31jYXRjaChuKXtyZXR1cm59fWZ1bmN0aW9uIHQzOTZfX2luaXRTY2FsZUZhY3RvckZsYWdzKCl7aWYodm9pZCAwPT09d2luZG93LnNob3VsZFVzZVNjYWxlRmFjdG9yKXt2b2lkIDA9PT13aW5kb3cudDM5Nl9fY2xpZW50UmVjdEluY2x1ZGVzWm9vbSYmKHdpbmRvdy50Mzk2X19jbGllbnRSZWN0SW5jbHVkZXNab29tPXQzOTZfX2RvZXNDbGllbnRSZWN0SW5jbHVkZVpvb20oKSk7dmFyIHQ9d2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0ZpcmVmb3hcLyhbMC05XSspXC4vKSxlPXQ/cGFyc2VJbnQodFsxXSwxMCk6MTI2LGk9d2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0Nocm9tZVwvKFswLTldKylcLi8pLHIsbz0oaSYmcGFyc2VJbnQoaVsxXSwxMCl8fDApPjEyN3x8d2luZG93LnQzOTZfX2NsaWVudFJlY3RJbmNsdWRlc1pvb207d2luZG93LmlzT25seVNjYWxhYmxlPWU8MTI2LHdpbmRvdy5zaG91bGRVc2VTY2FsZUZhY3Rvcj0hd2luZG93LmlzT25seVNjYWxhYmxlJiYhdCYmIW99fWZ1bmN0aW9uIHQzOTZfaW5pdCh0KXt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIit0KSxpPWU/ZS5xdWVyeVNlbGVjdG9yKCIudDM5NiIpOm51bGwscj1lP2UucXVlcnlTZWxlY3RvcigiLnQzOTZfX2FydGJvYXJkIik6bnVsbDtpZihyKXt0Mzk2X2luaXRUTm9iaih0LHIpLHQzOTZfX2luaXRTY2FsZUZhY3RvckZsYWdzKCk7dmFyIG89IiIsbj10Mzk2X2RldGVjdFJlc29sdXRpb24odCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLGw9YSYmImVkaXQiPT09YS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpO3ZvaWQgMD09PXdpbmRvdy50bi5pc0VkaXRNb2RlJiYod2luZG93LnRuLmlzRWRpdE1vZGU9bCksdDM5Nl9zd2l0Y2hSZXNvbHV0aW9uKHQsbik7dmFyIGQ9IndpbmRvdyI9PT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHIsInVwc2NhbGUiKSxfPXQzOTZfX3NldEdsb2JhbFNjYWxlVmFyaWFibGVzKHQsbixkKTtpZih0Mzk2X19zZXRTY2FsZUZhY3RvckZvckVsZW1lbnRzKHQsXyksdDM5Nl91cGRhdGVUTm9iaih0KSx0Mzk2X2FydGJvYXJkX2J1aWxkKG8sdCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe3QzOTZfYWxsZWxlbXNfX3JlbmRlclZpZXcociksdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXcociksdDM5Nl9faW5pdGlhbGl6ZUFydGJvYXJkT3ZlcmZsb3coYSxyKX0pKSx3aW5kb3cudGlsZGFNZW1iZXJzJiYiTXV0YXRpb25PYnNlcnZlciJpbiB3aW5kb3cpe3ZhciBzPW5ldyBNdXRhdGlvbk9ic2VydmVyKChmdW5jdGlvbihlKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpeyJhdHRyaWJ1dGVzIj09PWUudHlwZSYmImNsYXNzIj09PWUuYXR0cmlidXRlTmFtZSYmZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bGstY291cnNlc19wYWdlIikmJih0Mzk2X2RvUmVzaXplKHQsITApLHMuZGlzY29ubmVjdCgpKX0pKX0pKTtzLm9ic2VydmUoZG9jdW1lbnQuYm9keSx7YXR0cmlidXRlczohMH0pfWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50ODMwIikmJnRfb25SZWFkeSgoZnVuY3Rpb24oKXt2YXIgZSxpO1sidDgzMF9fYWxscmVjb3Jkc19wYWRkIiwidDgzMF9fYWxscmVjb3Jkc19wYWRkLXNtYWxsIl0uc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIGEuY2xhc3NMaXN0LmNvbnRhaW5zKHQpfSkpP3QzOTZfZG9SZXNpemUodCwhMCk6YS5hZGRFdmVudExpc3RlbmVyKCJhbGxSZWNQYWRkaW5nSW5pdCIsKGZ1bmN0aW9uKCl7dDM5Nl9kb1Jlc2l6ZSh0LCEwKX0pKX0pKSxlJiZpJiZyJiYieWVzIj09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLWNvbm5lY3Qtd2l0aC10YWIiKSYmaS5hZGRFdmVudExpc3RlbmVyKCJkaXNwbGF5Q2hhbmdlZCIsKGZ1bmN0aW9uKCl7dDM5Nl9hbGxlbGVtc19fcmVuZGVyVmlldyhyKSx0Mzk2X2FsbGdyb3Vwc19fcmVuZGVyVmlldyhyKSx0Mzk2X2RvUmVzaXplKHQsITApfSkpO3ZhciB1PSJodWciPT09ci5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtaGVpZ2h0bW9kZSIpLGM7aWYodSl7dmFyIGY9dF90aHJvdHRsZSgoZnVuY3Rpb24oKXt0Mzk2X191cGRhdGVBdXRvSGVpZ2h0KHIpfSksMTAwKTtmKCksc2V0SW50ZXJ2YWwoZiwzZTMpLGRvY3VtZW50LmZvbnRzJiZkb2N1bWVudC5mb250cy5yZWFkeS50aGVuKGYpLHIucXVlcnlTZWxlY3RvckFsbCgiaW1nIikuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5vbmxvYWQ9Zn0pKSxuZXcgTXV0YXRpb25PYnNlcnZlcihmKS5vYnNlcnZlKHIse3N1YnRyZWU6ITAsY2hhcmFjdGVyRGF0YTohMCxjaGFyYWN0ZXJEYXRhT2xkVmFsdWU6ITB9KSxuZXcgTXV0YXRpb25PYnNlcnZlcigoZnVuY3Rpb24odCl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZTsiY2hpbGRMaXN0Ij09PXQudHlwZSYmKEFycmF5LmZyb20odC5hZGRlZE5vZGVzKS5jb25jYXQoQXJyYXkuZnJvbSh0LnJlbW92ZWROb2RlcykpLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiAzIT09dC5ub2RlVHlwZSYmKHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19lbGVtIil8fHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19ncm91cCIpKX0pKSYmZigpKX0pKX0pKS5vYnNlcnZlKHIse3N1YnRyZWU6ITAsY2hpbGRMaXN0OiEwfSl9KGEuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0MjM1X19iZWZvcmVyZWFkeSIpfHxlJiZlLmNsb3Nlc3QoIiNhbGxyZWNvcmRzdGFibGUiKXx8YS5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yZWNvcmQtdHlwZT0iMjYzIl0nKSkmJmkmJnImJmkuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcGxheUNoYW5nZWQiLChmdW5jdGlvbigpe3QzOTZfYWxsZWxlbXNfX3JlbmRlclZpZXcociksdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXcociksdDM5Nl9kb1Jlc2l6ZSh0LCEwKX0pKTt2YXIgZz0hIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50NjM1X190ZXh0aG9sZGVyIik7ZSYmZyYmaSYmciYmaS5hZGRFdmVudExpc3RlbmVyKCJhbmltYXRpb25Jbml0ZWQiLChmdW5jdGlvbigpe3QzOTZfYWxsZWxlbXNfX3JlbmRlclZpZXcociksdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXcociksdDM5Nl9kb1Jlc2l6ZSh0LCEwKX0pKSxlJiZkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudDQzMSIpJiZpJiZyJiZ0X29uUmVhZHkoKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0Mzk2X2RvUmVzaXplKHQsITApfSkpfSkpLC9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJmkmJmkuY2xhc3NMaXN0LmFkZCgidDM5Nl9zYWZhcmkiKSxkJiYhbCYmdF9vbkZ1bmNMb2FkKCJ0Mzk2X3NjYWxlQmxvY2siLChmdW5jdGlvbigpe3QzOTZfc2NhbGVCbG9jayh0KX0pKSxsfHwieSIhPT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHIsImZpeGVkLW5lZWQtanMiKXx8dF9vbkZ1bmNMb2FkKCJ0Mzk2X19wcm9jZXNzRml4ZWRBcnRCb2FyZCIsKGZ1bmN0aW9uKCl7dDM5Nl9fcHJvY2Vzc0ZpeGVkQXJ0Qm9hcmQocil9KSksdDM5Nl9fcHJvY2Vzc0Fic29sdXRlQXJ0Qm9hcmQociksdDM5Nl9fcHJvY2Vzc1RvcFNoaWZ0KHIsdCwhMSksd2luZG93LnQzOTZfX2lzTW9iaWxlfHx1fHx0Mzk2X19yZW1vdmVJbmxpbmVIZWlnaHQoW3Isci5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fY2FycmllciIpLHIucXVlcnlTZWxlY3RvcigiLnQzOTZfX2ZpbHRlciIpXSksbHx8dDM5Nl9faW50aWFsaXplVW5kZXJjdXQoZSl9fXdpbmRvdy50Mzk2X19pc01vYmlsZT0vQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl8fG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiSW5zdGFncmFtIik+LTEsd2luZG93LnQzOTZfX2lzSVBhZD0ib250b3VjaGVuZCJpbiBkb2N1bWVudCYmLTEhPT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkFwcGxlV2ViS2l0Iiksd2luZG93LnQzOTZfX2lzU2FmYXJpPS9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksd2luZG93LnQzOTZfX2lzVG91Y2hEZXZpY2U9Im9udG91Y2hlbmQiaW4gZG9jdW1lbnQsd2luZG93LnQzOTZfX2lzSW5BcHBCcm93c2VyPS9XZWJWaWV3fChpUGhvbmV8aVBvZHxpUGFkKSg/IS4qU2FmYXJpKS9naS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHdpbmRvdy50Mzk2X19pc0ZhY2Vib29rTWVzc2VuZ2VySW5BcHA9L0ZCQU58RkJBVi9naS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiZ3aW5kb3cudDM5Nl9faXNJbkFwcEJyb3dzZXIsd2luZG93LnQzOTZfX2lzSW5zdGFncmFtSW5BcHA9L1xiSW5zdGFncmFtL2dpLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJndpbmRvdy50Mzk2X19pc0luQXBwQnJvd3Nlcix0X29uUmVhZHkodDM5Nl9fZ2xvYmFsSW5pdCk7dmFyIHQzOTZfd2FpdEZvckZpbmFsRXZlbnQ9ZnVuY3Rpb24oKXt2YXIgdD17fTtyZXR1cm4gZnVuY3Rpb24oZSxpLHIpe3ZhciBvPXJ8fCJEb24ndCBjYWxsIHRoaXMgdHdpY2Ugd2l0aG91dCBhIHVuaXF1ZUlkIjt0W29dJiZjbGVhclRpbWVvdXQodFtvXSksdFtvXT1zZXRUaW1lb3V0KGUsaSl9fSgpO2Z1bmN0aW9uIHQzOTZfX2hhbmRsZVJlc2l6ZU9wZW5lZFBvcHVwKCl7dDM5Nl9fd2FpdEZvclBvcHVwKCkudGhlbigoZnVuY3Rpb24odCl7aWYodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fYXJ0Ym9hcmQiKTtlJiZ0Mzk2X2RvUmVzaXplKGUuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIikpfX0pKX1mdW5jdGlvbiB0Mzk2X19pbml0UG9wdXBSZXNpemUoKXtkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvcHVwU2hvd2VkIix0Mzk2X19oYW5kbGVSZXNpemVPcGVuZWRQb3B1cCksZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJwb3B1cFNob3dlZCIsdDM5Nl9faGFuZGxlUmVzaXplT3BlbmVkUG9wdXApfWZ1bmN0aW9uIHQzOTZfYWJfX2dldFdpbmRvd0hlaWdodCh0KXtyZXR1cm4gdDM5Nl9fc2hvdWxkVXNlVmlzdWFsVmlld3BvcnRIZWlnaHQoKSYmdDM5Nl9faXNJblBvcHVwKHQpP3dpbmRvdy52aXN1YWxWaWV3cG9ydC5oZWlnaHQ6dDM5Nl9fZ2V0V2luZG93RGltZW5zaW9ucygpLmhlaWdodDt2YXIgZSxpfWZ1bmN0aW9uIHQzOTZfYWJfX2dldFdpbmRvd1dpZHRoKHQpe3JldHVybiB0Mzk2X19pc0luUG9wdXAodCk/ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoOnQzOTZfX2dldFdpbmRvd0RpbWVuc2lvbnMoKS53aWR0aDt2YXIgZSxpfWZ1bmN0aW9uIHQzOTZfX2dldFROV2luZG93SGVpZ2h0KCl7cmV0dXJuIHdpbmRvdy50Mzk2X19pc01vYmlsZXx8d2luZG93LnQzOTZfX2lzSVBhZD9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0OndpbmRvdy5pbm5lckhlaWdodH1mdW5jdGlvbiB0Mzk2X19nZXRUTldpbmRvd1dpZHRoKCl7dmFyIHQ9dDM5Nl9fZ2V0QmxvY2tFZGl0b3JXaWR0aCgpO2lmKHQpcmV0dXJuIHQ7dmFyIGU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLGk9dDM5Nl9fZ2V0QXhpc1hQYWRkaW5nKCk7cmV0dXJuIGkmJihlLT1pKSxlfWZ1bmN0aW9uIHQzOTZfX2dldENTU1dpbmRvd1dpZHRoKCl7dmFyIHQ9dDM5Nl9fZ2V0QmxvY2tFZGl0b3JXaWR0aCgpLGU7cmV0dXJuIHR8fCh3aW5kb3cudDM5Nl9faXNNb2JpbGV8fHdpbmRvdy50Mzk2X19pc0lQYWR8fHdpbmRvdy50Mzk2X19pc1NhZmFyaT9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg6d2luZG93LmlubmVyV2lkdGgpfWZ1bmN0aW9uIHQzOTZfX2dldFdpbmRvd0RpbWVuc2lvbnModCl7dmFyIGUsaT0odHx8e30pLmZvcmNlVXBkYXRlLHI9dm9pZCAwIT09aSYmaSxvPSF3aW5kb3cudG4ud2luZG93X3dpZHRofHwhd2luZG93LnRuLndpbmRvd19oZWlnaHR8fCF3aW5kb3cudG4ud2luZG93X3dpZHRoX2NzcyxuO3JldHVybihyfHxvKSYmdDM5Nl9fdXBkYXRlV2luZG93RGltZW5zaW9ucygpLHt3aWR0aDp3aW5kb3cudG4ud2luZG93X3dpZHRoLGhlaWdodDp3aW5kb3cudG4ud2luZG93X2hlaWdodCxjc3NXaWR0aDp3aW5kb3cudG4ud2luZG93X3dpZHRoX2Nzc319ZnVuY3Rpb24gdDM5Nl9fdXBkYXRlV2luZG93RGltZW5zaW9ucygpe3dpbmRvdy50bi53aW5kb3dfd2lkdGg9dDM5Nl9fZ2V0VE5XaW5kb3dXaWR0aCgpLHdpbmRvdy50bi53aW5kb3dfaGVpZ2h0PXQzOTZfX2dldFROV2luZG93SGVpZ2h0KCksd2luZG93LnRuLndpbmRvd193aWR0aF9jc3M9dDM5Nl9fZ2V0Q1NTV2luZG93V2lkdGgoKX1mdW5jdGlvbiB0Mzk2X19yZXZhbGlkYXRlRGltZW5zaW9ucygpe3ZhciB0LGU9dDM5Nl9fZ2V0V2luZG93RGltZW5zaW9ucygpLndpZHRoLGkscjtyZXR1cm4gdDM5Nl9fdXBkYXRlV2luZG93RGltZW5zaW9ucygpLGUhPT10Mzk2X19nZXRXaW5kb3dEaW1lbnNpb25zKCkud2lkdGh9ZnVuY3Rpb24gdDM5Nl9fcmVtb3ZlSW5saW5lSGVpZ2h0KHQpeyIxLjAiIT09d2luZG93LlROX1NDQUxFX0lOSVRJQUxfVkVSJiZ0LmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKChmdW5jdGlvbih0KXt0JiYodC5zdHlsZS5oZWlnaHQ9IiIpfSkpfWZ1bmN0aW9uIHQzOTZfX2NsZWFySW5pdGlhbFNjYWxlU3R5bGVzKCl7aWYoIjEuMCI9PT13aW5kb3cuVE5fU0NBTEVfSU5JVElBTF9WRVIpe3ZhciB0PWZ1bmN0aW9uIHQoZSl7dmFyIGk7ZSYmKCJ2YXIoLS1pbml0aWFsLXNjYWxlLWhlaWdodCkiPT09ZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCJoZWlnaHQiKSYmZS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgiaGVpZ2h0IikpfSxlO3QzOTZfX2dldFplcm9CbG9ja3MoKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgaT1lLmFydGJvYXJkO2kmJihpLnN0eWxlLnJlbW92ZVByb3BlcnR5KCItLWluaXRpYWwtc2NhbGUtaGVpZ2h0IiksdChpKSx0KGkucXVlcnlTZWxlY3RvcigiLnQzOTZfX2NhcnJpZXIiKSksdChpLnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19maWx0ZXIiKSkpfSkpfX1mdW5jdGlvbiB0Mzk2X19nbG9iYWxJbml0KCl7d2luZG93LnRufHx0Mzk2X2luaXRUTm9ial9fY3JlYXRlRGVmYXVsdCgpLHQzOTZfX2lzQWxsWmVyb0Jsb2Nrc1JlbmRlcmVkKChmdW5jdGlvbigpe3QzOTZfX2FwcGx5Rml4ZXNGb3JBbGxFbGVtZW50cygpLHQzOTZfX2luaXRpYWxpemVBbmNob3JMaW5rT3ZlcmZsb3dGaXgoKSx0Mzk2X19pbml0UG9wdXBSZXNpemUoKSx0Mzk2X19jbGVhckluaXRpYWxTY2FsZVN0eWxlcygpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHQzOTZfX29uUmVzaXplKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigib3JpZW50YXRpb25jaGFuZ2UiLHQzOTZfX29uT3JpZW50YXRpb25DaGFuZ2UpfSkpfWZ1bmN0aW9uIHQzOTZfX29uUmVzaXplKCl7dDM5Nl93YWl0Rm9yRmluYWxFdmVudCgoZnVuY3Rpb24oKXt2YXIgdDt0Mzk2X19yZXZhbGlkYXRlRGltZW5zaW9ucygpJiYodDM5Nl9fZ2V0WmVyb0Jsb2NrcygpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXQucmVjb3JkO2lmKGUmJnQzOTZfaXNCbG9ja1Zpc2libGUoZSkpdHJ5e3QzOTZfZG9SZXNpemUoZS5pZC5yZXBsYWNlKCJyZWMiLCIiKSl9Y2F0Y2goaSl7Y29uc29sZS5lcnJvcigiRXJyb3IgdHJ5aW5nIHRvIHJlc2l6ZSAiK2UuaWQsaSl9fSkpLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJ6ZXJvOndpbmRvdy13aWR0aC1jaGFuZ2VkIikpKX0pLDUwMCwiZ2xvYmFsX3Jlc2l6ZV96ZXJvX3VuaXF1ZV9pZCIpfWZ1bmN0aW9uIHQzOTZfX29uT3JpZW50YXRpb25DaGFuZ2UoKXt0Mzk2X3dhaXRGb3JGaW5hbEV2ZW50KChmdW5jdGlvbigpe3QzOTZfX3VwZGF0ZVdpbmRvd0RpbWVuc2lvbnMoKSx0Mzk2X19nZXRaZXJvQmxvY2tzKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5yZWNvcmQ7ZSYmdDM5Nl9pc0Jsb2NrVmlzaWJsZShlKSYmdDM5Nl9kb1Jlc2l6ZShlLmlkLnJlcGxhY2UoInJlYyIsIiIpKX0pKX0pLDYwMCwiZ2xvYmFsX29yaWVudGF0aW9uY2hhbmdlX3plcm9fdW5pcXVlX2lkIil9ZnVuY3Rpb24gdDM5Nl9pc09ubHlTY2FsYWJsZUJyb3dzZXIoKXtyZXR1cm4gd2luZG93LmlzT25seVNjYWxhYmxlfWZ1bmN0aW9uIHQzOTZfX3NldEdsb2JhbFNjYWxlVmFyaWFibGVzKHQsZSxpKXt2YXIgcj0xLG89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrdCksbj1vP28ucXVlcnlTZWxlY3RvcigiLnQzOTZfX2FydGJvYXJkIik6bnVsbDtpZighbilyZXR1cm4gMTt2YXIgYT10Mzk2X2FiX19nZXRXaW5kb3dXaWR0aChuKSxsPWk/cGFyc2VGbG9hdCgoYS9lKS50b0ZpeGVkKDMpKToxLGQ9ImFiIit0O3dpbmRvdy50bltkXS5zY2FsZUZhY3Rvcj1sLHdpbmRvdy50bl9zY2FsZV9mYWN0b3I9bDt2YXIgXz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIit0KTtyZXR1cm4gXyYmIXdpbmRvdy50bi5pc0VkaXRNb2RlJiZfLnN0eWxlLnNldFByb3BlcnR5KCItLXpvb20iLGwudG9TdHJpbmcoKSksbH1mdW5jdGlvbiB0Mzk2X19wcm9jZXNzVG9wU2hpZnQodCxlLGkpeyJmdW5jdGlvbiIhPXR5cGVvZiB3aW5kb3cudDM5Nl9fdXBkYXRlVG9wU2hpZnR8fCJ5IiE9PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwic2hpZnQtcHJvY2Vzc2VkIikmJiJ5IiE9PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwiZml4ZWQtc2hpZnQiKXx8d2luZG93LnQzOTZfX3VwZGF0ZVRvcFNoaWZ0KGUsaSl9ZnVuY3Rpb24gdDM5Nl9kb1Jlc2l6ZSh0LGUpe2UmJnQzOTZfX3VwZGF0ZVdpbmRvd0RpbWVuc2lvbnMoKTt2YXIgaT10Mzk2X2lzT25seVNjYWxhYmxlQnJvd3NlcigpLHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrdCksbz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLG49dDM5Nl9kZXRlY3RSZXNvbHV0aW9uKHQpLGE7aWYodDM5Nl9yZW1vdmVFbGVtZW50RnJvbURPTShyP3IucXVlcnlTZWxlY3RvcigiLnQzOTZfX3NjYWxlLXN0eWxlIik6bnVsbCksaSl7dmFyIGw9cj9yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50bi1tb2xlY3VsZSwgLnRuLWF0b20iKTpbXTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGwsKGZ1bmN0aW9uKHQpe2lmKCF0LmNsYXNzTGlzdC5jb250YWlucygidG4tYXRvbSIpfHwhdC5jbG9zZXN0KCIudG4tbW9sZWN1bGUiKSl7dmFyIGU9dC5jbG9zZXN0KCIudG4tYXRvbV9fc2NhbGUtd3JhcHBlciIpLGk9ZT9lLnBhcmVudE5vZGU6bnVsbDtpJiZpLnJlbW92ZUNoaWxkKGUpLGkmJmkuYXBwZW5kQ2hpbGQodCl9fSkpfWVsc2V7dmFyIGQ9cj9yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50Mzk2X19lbGVtLCAudDM5Nl9fZ3JvdXAiKTpbXTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGQsKGZ1bmN0aW9uKHQpe3Quc3R5bGUuem9vbT0iIjt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tIik7ZSYmKGUuc3R5bGUudHJhbnNmb3JtT3JpZ2luPSIiLGUuc3R5bGUuZm9udFNpemU9IiIsZS5zdHlsZS53ZWJraXRUZXh0U2l6ZUFkanVzdD0iIil9KSl9dDM5Nl9zd2l0Y2hSZXNvbHV0aW9uKHQsbik7dmFyIF89cj9yLnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19hcnRib2FyZCIpOm51bGwscz0id2luZG93Ij09PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUoXywidXBzY2FsZSIpLHU9dDM5Nl9fc2V0R2xvYmFsU2NhbGVWYXJpYWJsZXModCxuLHMpO3QzOTZfX3NldFNjYWxlRmFjdG9yRm9yRWxlbWVudHModCx1KSx0Mzk2X3VwZGF0ZVROb2JqKHQpLHQzOTZfYWJfX3JlbmRlclZpZXcoXyk7dmFyIGM9bz9vLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tb2RlIik6IiI7cyYmImVkaXQiIT09YyYmdF9vbkZ1bmNMb2FkKCJ0Mzk2X3NjYWxlQmxvY2siLChmdW5jdGlvbigpe3QzOTZfc2NhbGVCbG9jayh0KX0pKSwiZWRpdCIhPT1jJiYieSI9PT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKF8sImZpeGVkLW5lZWQtanMiKSYmdF9vbkZ1bmNMb2FkKCJ0Mzk2X19wcm9jZXNzRml4ZWRBcnRCb2FyZCIsKGZ1bmN0aW9uKCl7dDM5Nl9fcHJvY2Vzc0ZpeGVkQXJ0Qm9hcmQoXyl9KSksdDM5Nl9fcHJvY2Vzc0Fic29sdXRlQXJ0Qm9hcmQoXyksdDM5Nl9fcHJvY2Vzc1RvcFNoaWZ0KF8sdCwhMCksdDM5Nl9hbGxlbGVtc19fcmVuZGVyVmlldyhfKSx0Mzk2X2FsbGdyb3Vwc19fcmVuZGVyVmlldyhfKSx0Mzk2X19hcHBseUZpeGVzRm9yQWxsRWxlbWVudHMoKSx0Mzk2X191cGRhdGVBdXRvSGVpZ2h0KF8pLF8mJl8uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImFydEJvYXJkUmVzaXplZCIpKTt2YXIgZj0iaHVnIj09PV8uZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLWhlaWdodG1vZGUiKTtfJiYhZiYmKHdpbmRvdy50Mzk2X19pc01vYmlsZXx8dDM5Nl9fcmVtb3ZlSW5saW5lSGVpZ2h0KFtfLF8ucXVlcnlTZWxlY3RvcigiLnQzOTZfX2NhcnJpZXIiKSxfLnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19maWx0ZXIiKV0pKX1mdW5jdGlvbiB0Mzk2X191cGRhdGVBdXRvSGVpZ2h0KHQpe3ZhciBlLGk7aWYoImh1ZyI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1oZWlnaHRtb2RlIikpe3ZhciByPXQzOTZfX2dldEF1dG9IZWlnaHQodCksbz10Lm9mZnNldEhlaWdodDtpZighKE1hdGguYWJzKHItbyk8PS43KSl7dmFyIG4sYT0iYWIiK3QuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIiksbD13aW5kb3cudG5bYV0uY3VyUmVzb2x1dGlvbixkO2w9PT13aW5kb3cudG5bYV0uY3VyUmVzb2x1dGlvbl9tYXg/dC5zZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtaGVpZ2h0IixyKTp0LnNldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1oZWlnaHQtcmVzLSIrbCxyKSx0Mzk2X2FiX19yZW5kZXJWaWV3KHQpLG51bGw9PShlPXQuY2xvc2VzdCgiLnQzOTYiKSl8fGUuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInplcm86aGVpZ2h0LWNoYW5nZWQiKSl9fX1mdW5jdGlvbiB0Mzk2X19nZXRBdXRvSGVpZ2h0KHQpe3ZhciBlLGk9dC5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2FydGJvYXJkLWZsZXgiKSxyPUFycmF5LmZyb20odC5xdWVyeVNlbGVjdG9yQWxsKCI6c2NvcGUgPiAudG4tZ3JvdXAsIDpzY29wZSA+IC50bi1lbGVtIikpLG89dC5zdHlsZS5oZWlnaHQsbjtpZih0Mzk2X19hdXRvSGVpZ2h0X19jYW5BdXRvY2FsY3VsYXRlSGVpZ2h0KHQscikmJm8pe3ZhciBhPXQuc3R5bGUuaGVpZ2h0O3Quc3R5bGUuaGVpZ2h0PSJhdXRvIixlPXQub2Zmc2V0SGVpZ2h0LHQuc3R5bGUuaGVpZ2h0PWF9ZWxzZSBlPXIucmVkdWNlKChmdW5jdGlvbihlLHIpe3ZhciBvPXQzOTZfY29yZV9fZ2V0RmllbGRWYWx1ZShyLCJheGlzeSIpLG49dDM5Nl9jb3JlX19nZXRGaWVsZFZhbHVlKHIsInRvcHVuaXRzIiksYT10Mzk2X2NvcmVfX2dldEZpZWxkVmFsdWUociwiaGVpZ2h0dW5pdHMiKTtpZigiJSI9PT1ufHwiJSI9PT1hfHwiYm90dG9tIj09PW98fCJjZW50ZXIiPT09bylyZXR1cm4gZTt2YXIgbD0wO2lmKCJnYWxsZXJ5Ij09PXIuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpJiYobD10Mzk2X19hdXRvSGVpZ2h0X19nZXRBZGRpdGlvbmFsT2Zmc2V0Rm9yR2FsbGVyeShyKSksaSl7dmFyIGQ9dDM5Nl9fYWJfX2dldFBhZGRpbmdWYWx1ZSh0LCJwYWRkaW5nYm90dG9tIik7bCs9cGFyc2VJbnQoZCwxMCl9dmFyIF89ci5vZmZzZXRUb3Arci5vZmZzZXRIZWlnaHQrbCxzLHUsYzsid2luZG93IiE9PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwidXBzY2FsZSIpfHx3aW5kb3cudG4uaXNFZGl0TW9kZXx8dDM5Nl9fYXV0b0hlaWdodF9faXNFbGVtZW50UHJlc2NhbGVkKHIpfHwoXyo9dDM5Nl9fZ2V0Q3VycmVudFNjYWxlRmFjdG9yKHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIikpKTtyZXR1cm4gXz5lP186ZX0pLC0xLzApO3JldHVybiBlPT09LTEvMD8wOmV9ZnVuY3Rpb24gdDM5Nl9fYXV0b0hlaWdodF9faXNFbGVtZW50UHJlc2NhbGVkKHQpe3JldHVybiEhdDM5Nl9faXNFbGVtZW50VXNpbmdDYWxjWm9vbSh0KXx8InllcyI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1zY2FsZS1vZmYiKX1mdW5jdGlvbiB0Mzk2X19hdXRvSGVpZ2h0X19nZXRBZGRpdGlvbmFsT2Zmc2V0Rm9yR2FsbGVyeSh0KXt2YXIgZT0wLGk9dC5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX190aXRsZSIpLHI9Im5vbmUiIT09dDM5Nl9jb3JlX19nZXRGaWVsZFZhbHVlKHQsInNsZHNfZG90c2NvbnRyb2xzIiksbz0idW5kZXIiPT09dDM5Nl9jb3JlX19nZXRGaWVsZFZhbHVlKHQsInNsZHNfYXJyb3djb250cm9scyIpO2lmKGl8fHJ8fG8pe3ZhciBuPXQucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fdGl0bGUiKSxhPW4/bi5vZmZzZXRIZWlnaHQ6MCxsPXQucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY2FwdGlvbi50LXNsZHNfX2NhcHRpb24tYWN0aXZlIiksZD1nZXRDb21wdXRlZFN0eWxlKGwpLF87ZSs9cGFyc2VJbnQoZC5tYXJnaW5Ub3AsMTApK2F9cmV0dXJuIGl8fCFyJiYhb3x8KGUtPTIwKSxlfWZ1bmN0aW9uIHQzOTZfX2F1dG9IZWlnaHRfX2NhbkF1dG9jYWxjdWxhdGVIZWlnaHQodCxlKXt2YXIgaSxyO2lmKCF0LmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fYXJ0Ym9hcmQtZmxleCIpKXJldHVybiExO2lmKGUuc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuImdhbGxlcnkiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIil9KSkpe3ZhciBvPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwiZmxleGRpcmVjdGlvbiIpLG49dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJmbGV4YWxpZ25pdGVtcyIpLGE9dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJmbGV4anVzdGlmeWNvbnRlbnQiKSxsO3JldHVybiJyb3ciPT09byYmImZsZXgtZW5kIj09PW58fCJjb2x1bW4iPT09byYmImZsZXgtZW5kIj09PWF9cmV0dXJuITB9ZnVuY3Rpb24gdDM5Nl9fYWJfX2dldFBhZGRpbmdWYWx1ZSh0LGUpe3ZhciBpPSh0Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsInBhZGRpbmciKXx8IjBweCAwcHggMHB4IDBweCIpLnNwbGl0KCIgIikscj17cGFkZGluZ3RvcDppWzBdLHBhZGRpbmdyaWdodDppWzFdLHBhZGRpbmdib3R0b206aVsyXSxwYWRkaW5nbGVmdDppWzNdfTtyZXR1cm4gcGFyc2VJbnQocltlXSwxMCl8fDB9ZnVuY3Rpb24gdDM5Nl9fcHJvY2Vzc0Fic29sdXRlQXJ0Qm9hcmQodCl7aWYodCl7dmFyIGU9dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJwb3MiKTtpZigiZml4ZWQiIT09ZSl7dmFyIGk9InQzOTZfX2FydGJvYXJkLWZpeGVkLW5vLWJnIjtpZigiYWJzb2x1dGUiPT09ZSl7dmFyIHI9Z2V0Q29tcHV0ZWRTdHlsZSh0KSxvPXQucXVlcnlTZWxlY3RvcigiLnQzOTZfX2ZpbHRlciIpLG49IW98fCJub25lIj09PWdldENvbXB1dGVkU3R5bGUobykuYmFja2dyb3VuZEltYWdlLGEsbD0icmdiYSgwLCAwLCAwLCAwKSI9PT1yLmJhY2tncm91bmRDb2xvciYmIm5vbmUiPT09ci5iYWNrZ3JvdW5kSW1hZ2UmJm4/ImFkZCI6InJlbW92ZSI7dC5jbGFzc0xpc3RbbF0oaSl9ZWxzZSB0LmNsYXNzTGlzdC5yZW1vdmUoaSl9fX1mdW5jdGlvbiB0Mzk2X2RldGVjdFJlc29sdXRpb24odCl7aWYoIXQpcmV0dXJuIG51bGw7dmFyIGUsaT10Mzk2X19nZXRXaW5kb3dEaW1lbnNpb25zKCkuY3NzV2lkdGgscj0iYWIiK3QsbztyZXR1cm4gd2luZG93LnRuW3JdLnNjcmVlbnMuZm9yRWFjaCgoZnVuY3Rpb24odCl7aT49dCYmKG89dCl9KSksdm9pZCAwPT09byYmKG89d2luZG93LnRuW3JdLnNjcmVlbnNbMF0pLG99ZnVuY3Rpb24gdDM5Nl9pbml0VE5vYmpfX2NyZWF0ZURlZmF1bHQoKXt3aW5kb3cudG49e30sd2luZG93LnRuLmFiX2ZpZWxkcz1bImhlaWdodCIsIndpZHRoIiwiYmdjb2xvciIsImJnaW1nIiwiYmdhdHRhY2htZW50IiwiYmdwb3NpdGlvbiIsImZpbHRlcm9wYWNpdHkiLCJmaWx0ZXJjb2xvciIsImZpbHRlcm9wYWNpdHkyIiwiZmlsdGVyY29sb3IyIiwiaGVpZ2h0X3ZoIiwidmFsaWduIl19ZnVuY3Rpb24gdDM5Nl9pbml0VE5vYmoodCxlKXtlJiYod2luZG93LnRufHx0Mzk2X2luaXRUTm9ial9fY3JlYXRlRGVmYXVsdCgpLHQzOTZfc2V0U2NyZWVuc1ROb2JqKHQsZSkpfWZ1bmN0aW9uIHQzOTZfc2V0U2NyZWVuc1ROb2JqKHQsZSl7dmFyIGk9ImFiIit0O3dpbmRvdy50bltpXT17fSx3aW5kb3cudG5baV0uc2NyZWVucz1bXTt2YXIgcj1lLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1zY3JlZW5zIik7cj8ocj1yLnNwbGl0KCIsIikpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3dpbmRvdy50bltpXS5zY3JlZW5zLnB1c2gocGFyc2VJbnQodCwxMCkpfSkpOndpbmRvdy50bltpXS5zY3JlZW5zPVszMjAsNDgwLDY0MCw5NjAsMTIwMF19ZnVuY3Rpb24gdDM5Nl9fZ2V0QXhpc1hQYWRkaW5nKCl7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxlPUJvb2xlYW4od2luZG93LnRpbGRhTWVtYmVycyl8fCJhbGxyZWNvcmRzIj09PXdpbmRvdy56ZXJvX3dpbmRvd193aWR0aF9ob29rLGkscjtyZXR1cm4gdCYmZSYmW2RvY3VtZW50LmJvZHksdF0ucmVkdWNlKChmdW5jdGlvbih0LGUpe3ZhciBpPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLnBhZGRpbmdMZWZ0LHI9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSkucGFkZGluZ1JpZ2h0O3JldHVybiB0K3BhcnNlSW50KGksMTApK3BhcnNlSW50KHIsMTApfSksMCl8fDB9ZnVuY3Rpb24gdDM5Nl91cGRhdGVUTm9iaih0KXtmb3IodmFyIGUsaT10Mzk2X19nZXRXaW5kb3dEaW1lbnNpb25zKCkud2lkdGgscj0iYWIiK3Qsbz13aW5kb3cudG5bcl0uc2NyZWVucy5zbGljZSgpLnJldmVyc2UoKSxuPTA7bjxvLmxlbmd0aDtuKyspd2luZG93LnRuW3JdLmN1clJlc29sdXRpb249PT1vW25dJiYod2luZG93LnRuW3JdLmNhbnZhc19taW5fd2lkdGg9b1tuXSx3aW5kb3cudG5bcl0uY2FudmFzX21heF93aWR0aD0wPT09bj9pOm9bbi0xXSk7dmFyIGE9ImFsbHJlY29yZHMiPT09d2luZG93Lnplcm9fd2luZG93X3dpZHRoX2hvb2s7d2luZG93LnRuW3JdLmdyaWRfd2lkdGg9d2luZG93LnRuW3JdLmNhbnZhc19taW5fd2lkdGg7dmFyIGw9KGktd2luZG93LnRuW3JdLmdyaWRfd2lkdGgpLzI7d2luZG93LnRuW3JdLmdyaWRfb2Zmc2V0X2xlZnQ9bDwwJiZhPzA6bH1mdW5jdGlvbiB0Mzk2X3N3aXRjaFJlc29sdXRpb24odCxlKXt2YXIgaT0iYWIiK3Qscj13aW5kb3cudG5baV0uc2NyZWVuc1t3aW5kb3cudG5baV0uc2NyZWVucy5sZW5ndGgtMV07d2luZG93LnRuW2ldLmN1clJlc29sdXRpb249ZSx3aW5kb3cudG5baV0uY3VyUmVzb2x1dGlvbl9tYXg9cix3aW5kb3cudG4uY3VyUmVzb2x1dGlvbj1lLHdpbmRvdy50bi5jdXJSZXNvbHV0aW9uX21heD1yfWZ1bmN0aW9uIHQzOTZfYXJ0Ym9hcmRfYnVpbGQodCxlKXt2YXIgaT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIitlKSxyPWk/aS5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fYXJ0Ym9hcmQiKTpudWxsO2lmKHIpe3QzOTZfYWJfX3JlbmRlclZpZXcociksdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXcocik7dmFyIG89ci5xdWVyeVNlbGVjdG9yQWxsKCIudG4tZWxlbSIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobywoZnVuY3Rpb24odCl7dmFyIGk7c3dpdGNoKHQuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpKXtjYXNlInRleHQiOnQzOTZfYWRkVGV4dChyLHQpO2JyZWFrO2Nhc2UiaW1hZ2UiOnQzOTZfYWRkSW1hZ2Uocix0KTticmVhaztjYXNlInNoYXBlIjp0Mzk2X2FkZFNoYXBlKHIsdCk7YnJlYWs7Y2FzZSJidXR0b24iOnQzOTZfYWRkQnV0dG9uKHIsdCk7YnJlYWs7Y2FzZSJ2aWRlbyI6dDM5Nl9hZGRWaWRlbyhyLHQpO2JyZWFrO2Nhc2UiaHRtbCI6dDM5Nl9hZGRIdG1sKHIsdCk7YnJlYWs7Y2FzZSJ0b29sdGlwIjp0Mzk2X2FkZFRvb2x0aXAocix0KTticmVhaztjYXNlImZvcm0iOnQzOTZfYWRkRm9ybShyLHQsZSk7YnJlYWs7Y2FzZSJnYWxsZXJ5Ijp0Mzk2X2FkZEdhbGxlcnkocix0LGUpO2JyZWFrO2Nhc2UidmVjdG9yIjp0Mzk2X2FkZFZlY3RvcihyLHQpfX0pKSxyLmNsYXNzTGlzdC5yZW1vdmUoInJlbmRlcmluZyIpLHIuY2xhc3NMaXN0LmFkZCgicmVuZGVyZWQiKSxyLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJhcnRCb2FyZFJlbmRlcmVkIix7YnViYmxlczohMCxjYW5jZWxhYmxlOiEwfSkpO3ZhciBuPXIuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLW92cmZsdyIpO2lmKFsidmlzaWJsZSIsInZpc2libGVYIl0uaW5jbHVkZXMobikmJih0Mzk2X19zZXRPdmVyZmxvd1RvQWxsUmVjb3JkcygpLGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigidFN0b3JlR2FsbGVyeUluaXRpYWxpemVkIiwoZnVuY3Rpb24oKXt0Mzk2X19zZXRPdmVyZmxvd1RvQWxsUmVjb3JkcygpfSkpKSwiYXV0byI9PT1uKXt2YXIgYT1NYXRoLmFicyhyLm9mZnNldEhlaWdodC1yLmNsaWVudEhlaWdodCk7MCE9PWEmJihyLnN0eWxlLnBhZGRpbmdCb3R0b209YSsicHgiKX1pZih3aW5kb3cudDM5Nl9faXNNb2JpbGV8fHdpbmRvdy50Mzk2X19pc0lQYWQpe3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7bC50ZXh0Q29udGVudD0iQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOjEzNjZweCkgYW5kIChvcmllbnRhdGlvbjpsYW5kc2NhcGUpIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOjIpIHsudDM5Nl9fY2FycmllciB7YmFja2dyb3VuZC1hdHRhY2htZW50OnNjcm9sbCFpbXBvcnRhbnQ7fX0iLGkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLGwpfX19ZnVuY3Rpb24gdDM5Nl9hYl9fcmVuZGVyVmlldyh0KXtpZih0KXtmb3IodmFyIGU9d2luZG93LnRuLmFiX2ZpZWxkcyxpPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIikscixvPTA7bzxlLmxlbmd0aDtvKyspdDM5Nl9hYl9fcmVuZGVyVmlld09uZUZpZWxkKHQsZVtvXSk7dmFyIG49dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJoZWlnaHQiKSxhPXQzOTZfYWJfX2dldEhlaWdodCh0KSxsLGQ9dDM5Nl9fZ2V0Q3VycmVudFNjYWxlRmFjdG9yKHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIikpLF89ISFpJiYiZWRpdCI9PT1pLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tb2RlIikscz0id2luZG93Ij09PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwidXBzY2FsZSIpLHUsYyxmO2lmKHI9dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJoZWlnaHRfdmgiKSxzJiYhXyYmciYmKHU9cGFyc2VJbnQobiwxMCkqZCksbj09PWF8fHUmJnU+PWEpYz0wO2Vsc2Ugc3dpdGNoKHQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwidmFsaWduIikpe2Nhc2UidG9wIjpkZWZhdWx0OmM9MDticmVhaztjYXNlImNlbnRlciI6Yz11P3BhcnNlRmxvYXQoKChhLXUpLzIpLnRvRml4ZWQoMSkpOnBhcnNlRmxvYXQoKChhLW4pLzIpLnRvRml4ZWQoMSkpO2JyZWFrO2Nhc2UiYm90dG9tIjpjPXU/cGFyc2VGbG9hdCgoYS11KS50b0ZpeGVkKDEpKTpwYXJzZUZsb2F0KChhLW4pLnRvRml4ZWQoMSkpO2JyZWFrO2Nhc2Uic3RyZXRjaCI6Yz0wLG49YX10LnNldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1wcm94eS1taW4tb2Zmc2V0LXRvcCIsYyksdC5zZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcHJveHktbWluLWhlaWdodCIsbiksdC5zZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcHJveHktbWF4LWhlaWdodCIsYSk7dmFyIGc9dC5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fZmlsdGVyIiksdz10LnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19jYXJyaWVyIikscDtpZihyPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwiaGVpZ2h0X3ZoIikscj1wYXJzZUZsb2F0KHIpLCh3aW5kb3cudDM5Nl9faXNNb2JpbGV8fHdpbmRvdy50Mzk2X19pc0lQYWQpJiZyKXt2YXIgaD10Mzk2X2FiX19nZXRXaW5kb3dIZWlnaHQodCkqci8xMDA7dC5zdHlsZS5oZWlnaHQ9aCsicHgiLGcmJihnLnN0eWxlLmhlaWdodD1oKyJweCIpLHcmJih3LnN0eWxlLmhlaWdodD1oKyJweCIpfSJodWciPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtaGVpZ2h0bW9kZSIpJiYhciYmKHQuc3R5bGUuaGVpZ2h0PW4rInB4IixnJiYoZy5zdHlsZS5oZWlnaHQ9bisicHgiKSx3JiYody5zdHlsZS5oZWlnaHQ9bisicHgiKSl9fWZ1bmN0aW9uIHQzOTZfX2dldEN1cnJlbnRTY2FsZUZhY3Rvcih0KXt2YXIgZT0iYWIiK3QsaTtyZXR1cm4gd2luZG93LnRuJiZ3aW5kb3cudG5bZV0mJndpbmRvdy50bltlXS5zY2FsZUZhY3Rvcnx8d2luZG93LnRuX3NjYWxlX2ZhY3Rvcn1mdW5jdGlvbiB0Mzk2X19zZXRTY2FsZUZhY3RvckZvckVsZW1lbnRzKHQsZSl7dmFyIGk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrdCkscj1pP2kucXVlcnlTZWxlY3RvcigiLnQzOTZfX2FydGJvYXJkIik6bnVsbDtpZihyKXt2YXIgbz1yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50Mzk2X19lbGVtLCAudG4tZ3JvdXAiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG8sKGZ1bmN0aW9uKHQpe3Quc2NhbGVGYWN0b3I9ZX0pKX19ZnVuY3Rpb24gdDM5Nl9hZGRUZXh0KHQsZSl7dmFyIGk9dDM5Nl9nZXRFbChlKTtpZihpKXt2YXIgcj0idG9wLGxlZnQsd2lkdGgsaGVpZ2h0LGNvbnRhaW5lcixheGlzeCxheGlzeSx3aWR0aHVuaXRzLGxlZnR1bml0cyx0b3B1bml0cyI7aS5zZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIixyKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXcoaSl9fWZ1bmN0aW9uIHQzOTZfYWRkSW1hZ2UodCxlKXt2YXIgaT10Mzk2X2dldEVsKGUpO2lmKGkpe3ZhciByPSJpbWcsd2lkdGgsZmlsZXdpZHRoLGZpbGVoZWlnaHQsdG9wLGxlZnQsY29udGFpbmVyLGF4aXN4LGF4aXN5LHdpZHRodW5pdHMsbGVmdHVuaXRzLHRvcHVuaXRzIjtpLnNldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiLHIpLHQzOTZfZWxlbV9fcmVuZGVyVmlldyhpKTt2YXIgbz1pLnF1ZXJ5U2VsZWN0b3IoImltZyIpO28mJihvLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe2RvY3VtZW50LmNvbnRhaW5zKG8pJiYodDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoaSwidG9wIiksby5zcmMmJnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZG9jdW1lbnQuY29udGFpbnMobykmJih0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChpLCJ0b3AiKSx0Mzk2X191cGRhdGVBdXRvSGVpZ2h0KHQpKX0pLDJlMykpfSkpLG8uY29tcGxldGUmJih0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChpLCJ0b3AiKSxvLnNyYyYmc2V0VGltZW91dCgoZnVuY3Rpb24oKXtkb2N1bWVudC5jb250YWlucyhvKSYmKHQzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKGksInRvcCIpLHQzOTZfX3VwZGF0ZUF1dG9IZWlnaHQodCkpfSksMmUzKSksby5hZGRFdmVudExpc3RlbmVyKCJ0dXdpZGdldF9kb25lIiwoZnVuY3Rpb24oKXt0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChpLCJ0b3AiKX0pKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3QzOTZfY2hhbmdlRmlsdGVyT25TYWZhcmkoaSl9KSkpfX1mdW5jdGlvbiB0Mzk2X2FkZFNoYXBlKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbChlKTtpZihpKXt2YXIgcj0id2lkdGgsaGVpZ2h0LHRvcCxsZWZ0LCI7cis9ImNvbnRhaW5lcixheGlzeCxheGlzeSx3aWR0aHVuaXRzLGhlaWdodHVuaXRzLGxlZnR1bml0cyx0b3B1bml0cyIsaS5zZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIixyKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXcoaSl9fWZ1bmN0aW9uIHQzOTZfY2hhbmdlRmlsdGVyT25TYWZhcmkodCl7dmFyIGU7aWYoL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKHQzOTZfX2NoZWNrQ29udGFpbkJhY2tkcm9wRmlsdGVyKHQpJiYiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiaW4gd2luZG93KSl7dmFyIGk9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbSIpLHI7bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChmdW5jdGlvbihlLGkpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYoZS5pc0ludGVyc2VjdGluZyl7dmFyIHI9ZS50YXJnZXQ7aS51bm9ic2VydmUociksdDM5Nl9fcHJvY2Vzc0JhY2tkcm9wRmlsdGVyT25JbWFnZSh0KX19KSl9KSkub2JzZXJ2ZShpKX19ZnVuY3Rpb24gdDM5Nl9fY2hlY2tDb250YWluQmFja2Ryb3BGaWx0ZXIodCl7aWYoIXQpcmV0dXJuITE7dmFyIGU9d2luZG93LmdldENvbXB1dGVkU3R5bGUodCkud2Via2l0QmFja2Ryb3BGaWx0ZXI7aWYoZSYmIm5vbmUiIT09ZSlyZXR1cm4hMDt2YXIgaT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyLCAudG4tYXRvbV9fcHJ4LXdyYXBwZXIsIC50bi1hdG9tX19zdGlja3ktd3JhcHBlciIpO2lmKCFpKXJldHVybiExO3ZhciByPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGkpLndlYmtpdEJhY2tkcm9wRmlsdGVyO3JldHVybiByJiYibm9uZSIhPT1yfWZ1bmN0aW9uIHQzOTZfX3Byb2Nlc3NCYWNrZHJvcEZpbHRlck9uSW1hZ2UodCl7aWYodCl7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtb3B0cyIpLGk9dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1wcngiKXx8dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1maXgiKSxyPWV8fGksbz10LmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fZWxlbS0tYmFja2Ryb3AtZmlsdGVyLWltZy13cmFwcGVyZWQiKTtyJiZvfHwhcj90Mzk2X191cGRhdGVCYWNrZHJvcEZpbHRlck9uSW1hZ2UodCk6dC5hZGRFdmVudExpc3RlbmVyKCJiYWNrZHJvcEZpbHRlckltZ1dyYXBwZXJlZCIsKGZ1bmN0aW9uKCl7dDM5Nl9fdXBkYXRlQmFja2Ryb3BGaWx0ZXJPbkltYWdlKHQpfSkpfX1mdW5jdGlvbiB0Mzk2X191cGRhdGVCYWNrZHJvcEZpbHRlck9uSW1hZ2UodCl7aWYodCl7dmFyIGU9dCxpPWUucXVlcnlTZWxlY3RvcigiaW1nIikscj1lLnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyLCAudG4tYXRvbV9fcHJ4LXdyYXBwZXIsIC50bi1hdG9tX19zdGlja3ktd3JhcHBlciIpLG89IiI7ciYmKGU9cixvPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLndlYmtpdEJhY2tkcm9wRmlsdGVyfHwiIiksZS5zdHlsZS53ZWJraXRCYWNrZHJvcEZpbHRlcj0ibm9uZSIsdDM5Nl93YWl0Rm9yVXBsb2FkSW1nKGksKGZ1bmN0aW9uKCl7ZS5zdHlsZS53ZWJraXRCYWNrZHJvcEZpbHRlcj1vfSkpfX1mdW5jdGlvbiB0Mzk2X3dhaXRGb3JVcGxvYWRJbWcodCxlKXtpZigieSI9PT13aW5kb3cubGF6eSl2YXIgaT1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuY2xhc3NMaXN0LmNvbnRhaW5zKCJsb2FkZWQiKSYmdC5jbGllbnRXaWR0aCYmdC5zcmM/KGUoKSxjbGVhclRpbWVvdXQoaSkpOnQzOTZfd2FpdEZvclVwbG9hZEltZyh0LGUpfSksMzAwKTtlbHNlIGUoKX1mdW5jdGlvbiB0Mzk2X2FkZEJ1dHRvbih0LGUpe3ZhciBpPXQzOTZfZ2V0RWwoZSk7aWYoIWkpcmV0dXJuIG51bGw7dmFyIHI9InRvcCxsZWZ0LHdpZHRoLGhlaWdodCxjb250YWluZXIsYXhpc3gsYXhpc3ksY2FwdGlvbixsZWZ0dW5pdHMsdG9wdW5pdHMiO3JldHVybiBpLnNldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiLHIpLHQzOTZfZWxlbV9fcmVuZGVyVmlldyhpKSxpfWZ1bmN0aW9uIHQzOTZfYWRkVmlkZW8odCxlKXt2YXIgaT10Mzk2X2dldEVsKGUpO2lmKGkpe3ZhciByPSJ3aWR0aCxoZWlnaHQsdG9wLGxlZnQsIjtyKz0iY29udGFpbmVyLGF4aXN4LGF4aXN5LHdpZHRodW5pdHMsaGVpZ2h0dW5pdHMsbGVmdHVuaXRzLHRvcHVuaXRzIixpLnNldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiLHIpLHQzOTZfZWxlbV9fcmVuZGVyVmlldyhpKSx0X29uRnVuY0xvYWQoInQzOTZfaW5pdFZpZGVvIiwoZnVuY3Rpb24oKXt0Mzk2X2luaXRWaWRlbyhpKX0pKX19ZnVuY3Rpb24gdDM5Nl9hZGRIdG1sKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbChlKTtpZihpKXt2YXIgcj0id2lkdGgsaGVpZ2h0LHRvcCxsZWZ0LCI7cis9ImNvbnRhaW5lcixheGlzeCxheGlzeSx3aWR0aHVuaXRzLGhlaWdodHVuaXRzLGxlZnR1bml0cyx0b3B1bml0cyIsaS5zZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIixyKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXcoaSl9fWZ1bmN0aW9uIHQzOTZfYWRkVG9vbHRpcCh0LGUpe3ZhciBpPXQzOTZfZ2V0RWwoZSk7aWYoaSl7dmFyIHI9IndpZHRoLGhlaWdodCx0b3AsbGVmdCwiO3IrPSJjb250YWluZXIsYXhpc3gsYXhpc3ksd2lkdGh1bml0cyxoZWlnaHR1bml0cyxsZWZ0dW5pdHMsdG9wdW5pdHMsdGlwcG9zaXRpb24iLGkuc2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkcyIsciksdDM5Nl9lbGVtX19yZW5kZXJWaWV3KGkpLHRfb25GdW5jTG9hZCgidDM5Nl9pbml0VG9vbHRpcCIsKGZ1bmN0aW9uKCl7dDM5Nl9pbml0VG9vbHRpcChpKX0pKX19ZnVuY3Rpb24gdDM5Nl9hZGRGb3JtKHQsZSxpKXt2YXIgcj10Mzk2X2dldEVsKGUpO2lmKHIpe3ZhciBvPSJ3aWR0aCx0b3AsbGVmdCwiO28rPSJpbnB1dHMsY29udGFpbmVyLGF4aXN4LGF4aXN5LHdpZHRodW5pdHMsbGVmdHVuaXRzLHRvcHVuaXRzIixyLnNldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiLG8pO3ZhciBuPXQzOTZfZWxlbV9fZ2V0Rm9ybUlucHV0c1ZhbHVlKHIpLGE9ci5nZXRBdHRyaWJ1dGUoImRhdGEtZmUtZWxlbS1pZCIpfHxyLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLWlkIik7dF9vbkZ1bmNMb2FkKCJ0X3plcm9Gb3Jtc19faW5pdCIsKGZ1bmN0aW9uKCl7dDM5Nl9lbGVtX19yZW5kZXJWaWV3KHIpLHRfemVyb0Zvcm1zX19pbml0KGksYSxuKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXcocil9KSl9fWZ1bmN0aW9uIHQzOTZfYWRkR2FsbGVyeSh0LGUsaSl7dmFyIHI9dDM5Nl9nZXRFbChlKTtpZihyKXt2YXIgbz0id2lkdGgsaGVpZ2h0LHRvcCxsZWZ0LCI7bys9ImltZ3MsY29udGFpbmVyLGF4aXN4LGF4aXN5LHdpZHRodW5pdHMsaGVpZ2h0dW5pdHMsbGVmdHVuaXRzLHRvcHVuaXRzIixyLnNldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiLG8pLHQzOTZfZWxlbV9fcmVuZGVyVmlldyhyKTt2YXIgbj1yLmdldEF0dHJpYnV0ZSgiZGF0YS1mZS1lbGVtLWlkIil8fHIuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0taWQiKTt0X29uRnVuY0xvYWQoInRfemVyb0dhbGxlcnlfX2luaXQiLChmdW5jdGlvbigpe3RfemVyb0dhbGxlcnlfX2luaXQoaSxuKX0pKX19ZnVuY3Rpb24gdDM5Nl9hZGRWZWN0b3IodCxlKXt2YXIgaT10Mzk2X2dldEVsKGUpO2lmKGkpe3ZhciByPSJ3aWR0aCxmaWxld2lkdGgsZmlsZWhlaWdodCx0b3AsbGVmdCxjb250YWluZXIsYXhpc3gsYXhpc3ksd2lkdGh1bml0cyxsZWZ0dW5pdHMsdG9wdW5pdHMiO2kuc2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkcyIsciksdDM5Nl9lbGVtX19yZW5kZXJWaWV3KGkpfX1mdW5jdGlvbiB0Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUodCxlKXt2YXIgaT10Mzk2X2dldEVsKHQpO2lmKCFpKXJldHVybiBudWxsO2lmKGkuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bi1ncm91cCIpKXJldHVybiB0Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKGksZSk7dmFyIHI9aS5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKSxvPXIuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIiksbj0iYWIiK28sYTt2b2lkIDA9PT13aW5kb3cudG5bbl0mJih0Mzk2X2luaXRUTm9iaihvLHIpLHQzOTZfc3dpdGNoUmVzb2x1dGlvbihvLHQzOTZfZGV0ZWN0UmVzb2x1dGlvbihvKSkpO3ZhciBsPXdpbmRvdy50bltuXS5jdXJSZXNvbHV0aW9uLGQ9d2luZG93LnRuW25dLmN1clJlc29sdXRpb25fbWF4LF89d2luZG93LnRuW25dLnNjcmVlbnMscztpZighKHM9bD09PWQ/aS5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGQtIitlKyItdmFsdWUiKTppLmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZC0iK2UrIi1yZXMtIitsKyItdmFsdWUiKSkmJiIiIT09cylmb3IodmFyIHU9MDt1PF8ubGVuZ3RoO3UrKyl7dmFyIGM9X1t1XTtpZighKGM8PWwpJiYocz1jPT09ZD9pLmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZC0iK2UrIi12YWx1ZSIpOmkuZ2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkLSIrZSsiLXJlcy0iK2MrIi12YWx1ZSIpKSlicmVha312YXIgZj10Mzk2X19wYXJzZUdsb2JhbFN0eWxlQ1NTVmFyKHMpO3JldHVybiBmJiYocz1mLmZhbGxiYWNrKSxzfWZ1bmN0aW9uIHQzOTZfZWxlbV9fcmVuZGVyVmlldyh0KXt2YXIgZT10Mzk2X2dldEVsKHQpLGk9ZT9lLmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiKToiIjtpJiYoaT1pLnNwbGl0KCIsIikpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCl9KSl9ZnVuY3Rpb24gdDM5Nl9ncm91cF9fcmVuZGVyVmlldyh0KXt2YXIgZT10P3QuZ2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkcyIpOiIiO2UmJihlPWUuc3BsaXQoIiwiKSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIGk9dDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZSh0LGUpO3N3aXRjaChlKXtjYXNlImxlZnQiOmk9dDM5Nl9lbGVtX19jb252ZXJ0UG9zaXRpb25fX0xvY2FsX190b0Fic29sdXRlKHQsZSxpKSx0LnN0eWxlLmxlZnQ9cGFyc2VGbG9hdChpKS50b0ZpeGVkKDEpKyJweCI7YnJlYWs7Y2FzZSJ0b3AiOmk9dDM5Nl9lbGVtX19jb252ZXJ0UG9zaXRpb25fX0xvY2FsX190b0Fic29sdXRlKHQsZSxpKSx0LnN0eWxlLnRvcD1wYXJzZUZsb2F0KGkpLnRvRml4ZWQoMSkrInB4IjticmVhaztjYXNlImNvbnRhaW5lciI6dDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQodCwibGVmdCIpLHQzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKHQsInRvcCIpfX0pKX1mdW5jdGlvbiB0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZCh0LGUpe3ZhciBpPXQzOTZfZ2V0RWwodCk7aWYoaSl7dmFyIHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxvPXI/ci5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpOiIiLG4sYT0id2luZG93Ij09PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUoaS5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKSwidXBzY2FsZSIpO2lmKCJ5ZXMiIT09aS5nZXRBdHRyaWJ1dGUoImRhdGEtc2NhbGUtb2ZmIil8fCFhfHwiZWRpdCI9PT1vKXt2YXIgbD10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoaSxlKSxkLF89WyJmaWxsIiwiaHVnIl0scz10Mzk2X19pc0VsZW1lbnRVc2luZ0NhbGNab29tKGkpO3N3aXRjaChlKXtjYXNlImxlZnQiOmw9dDM5Nl9lbGVtX19jb252ZXJ0UG9zaXRpb25fX0xvY2FsX190b0Fic29sdXRlKGksZSxsKSxsPXM/dDM5Nl9fem9vbWlmeVZhbHVlKGksbCk6cGFyc2VGbG9hdChsKS50b0ZpeGVkKDEpKyJweCIsaS5zdHlsZS5sZWZ0PWw7YnJlYWs7Y2FzZSJ0b3AiOmw9dDM5Nl9lbGVtX19jb252ZXJ0UG9zaXRpb25fX0xvY2FsX190b0Fic29sdXRlKGksZSxsKSxsPXM/dDM5Nl9fem9vbWlmeVZhbHVlKGksbCk6cGFyc2VGbG9hdChsKS50b0ZpeGVkKDEpKyJweCIsaS5zdHlsZS50b3A9bDticmVhaztjYXNlIndpZHRoIjpkPWkuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpO3ZhciB1PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLCJ3aWR0aG1vZGUiKSxjO2lmKChjPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLCJ0ZXh0Zml0IikpfHwoImJ1dHRvbiI9PT1kP2M9ImZpeGVkc2l6ZSI6InRleHQiPT09ZCYmKGM9ImF1dG9oZWlnaHQiKSksKCJ0ZXh0Ij09PWR8fCJidXR0b24iPT09ZCkmJiJhdXRvd2lkdGgiPT09YylyZXR1cm4gdm9pZChpLnN0eWxlLndpZHRoPSJhdXRvIik7aWYoXy5pbmNsdWRlcyh1KSlyZXR1cm4gdm9pZChpLnN0eWxlLndpZHRoPSIiKTtzd2l0Y2gobD10Mzk2X2VsZW1fX2dldFdpZHRoKGksbCksaS5zdHlsZS53aWR0aD1wYXJzZUZsb2F0KGwpLnRvRml4ZWQoMSkrInB4IixkKXtjYXNlInRvb2x0aXAiOnZhciBmPWkucXVlcnlTZWxlY3RvckFsbCgiLnRuLWF0b21fX3Bpbi1pY29uIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChmLChmdW5jdGlvbih0KXt2YXIgZT1wYXJzZUZsb2F0KGwpLnRvRml4ZWQoMSkrInB4Ijt0LnN0eWxlLndpZHRoPWUsdC5zdHlsZS5oZWlnaHQ9ZX0pKSxpLnN0eWxlLmhlaWdodD1wYXJzZUludChsKS50b0ZpeGVkKDEpKyJweCI7YnJlYWs7Y2FzZSJnYWxsZXJ5Ijp0Mzk2X2VsZW1fX3NldEdhbGxlcnlTaXplKGksIndpZHRoIixsKX1icmVhaztjYXNlImhlaWdodCI6ZD1pLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKTt2YXIgZz10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoaSwiaGVpZ2h0bW9kZSIpLGM7aWYoKGM9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGksInRleHRmaXQiKSl8fCgiYnV0dG9uIj09PWQ/Yz0iZml4ZWRzaXplIjoidGV4dCI9PT1kJiYoYz0iYXV0b2hlaWdodCIpKSwoInRleHQiPT09ZHx8ImJ1dHRvbiI9PT1kKSYmWyJhdXRvd2lkdGgiLCJhdXRvaGVpZ2h0Iiwic2luZ2xlbGluZSJdLmluY2x1ZGVzKGMpKXJldHVybiB2b2lkKGkuc3R5bGUuaGVpZ2h0PSJhdXRvIik7aWYoXy5pbmNsdWRlcyhnKSYmInRvb2x0aXAiIT09ZClyZXR1cm4gdm9pZChpLnN0eWxlLmhlaWdodD0iIik7aWYoInRvb2x0aXAiPT09ZClyZXR1cm47bD10Mzk2X2VsZW1fX2dldEhlaWdodChpLGwpLGkuc3R5bGUuaGVpZ2h0PXBhcnNlRmxvYXQobCkudG9GaXhlZCgxKSsicHgiLCJnYWxsZXJ5Ij09PWQmJnQzOTZfZWxlbV9fc2V0R2FsbGVyeVNpemUoaSwiaGVpZ2h0IixsKTticmVhaztjYXNlImNvbnRhaW5lciI6dDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoaSwibGVmdCIpLHQzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKGksInRvcCIpO2JyZWFrO2Nhc2UiaW5wdXRzIjp0cnl7bD10Mzk2X2VsZW1fX2dldEZvcm1JbnB1dHNWYWx1ZShpKSx3aW5kb3cudF96ZXJvRm9ybXNfX3JlbmRlckZvcm0oaSxsKX1jYXRjaCh3KXt9fSJ3aWR0aCIhPT1lJiYiaGVpZ2h0IiE9PWUmJiJmb250c2l6ZSIhPT1lJiYiZm9udGZhbWlseSIhPT1lJiYibGV0dGVyc3BhY2luZyIhPT1lJiYiZm9udHdlaWdodCIhPT1lJiYiaW1nIiE9PWV8fCh0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChpLCJsZWZ0IiksdDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoaSwidG9wIikpfX19ZnVuY3Rpb24gdDM5Nl9lbGVtX19zZXRHYWxsZXJ5U2l6ZSh0LGUsaSl7dmFyIHI9aSxvPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZSh0LCJib3JkZXJ3aWR0aCIpLG49dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHQsImJvcmRlcnN0eWxlIik7biYmbyYmIm5vbmUiIT09bnx8KG89MCksci09MipvO3ZhciBhPU1hdGgucm91bmQocGFyc2VGbG9hdChyKSkrInB4IjthPSJ3aWR0aCI9PT1lfHwiaGVpZ2h0Ij09PWU/dDM5Nl9fem9vbWlmeVZhbHVlKHQsYSx7cm91bmQ6ITB9KTp0Mzk2X196b29taWZ5VmFsdWUodCxhKTt2YXIgbD10LnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX21haW4iKSxkPXQucXVlcnlTZWxlY3RvckFsbCgiLnRuLWF0b21fX3NsZHMtaW1nIik7dC5zdHlsZVtlXT1hLGwmJihsLnN0eWxlW2VdPWEpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZCwoZnVuY3Rpb24odCl7dC5zdHlsZVtlXT1hfSkpfWZ1bmN0aW9uIHQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZSh0LGUsaSl7dmFyIHI9dDM5Nl9nZXRFbCh0KTtpZighcilyZXR1cm4gbnVsbDt2YXIgbz1yLmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpLG49by5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKSxhPSJhYiIrbixsPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUobywidmFsaWduIiksZD0id2luZG93Ij09PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUobywidXBzY2FsZSIpLF89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxzLHU9ImVkaXQiPT09KF8/Xy5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpOiIiKSxjPXQzOTZfaXNPbmx5U2NhbGFibGVCcm93c2VyKCksZj0hdSYmZCYmYyxnPSF1JiZkJiYhYyx3PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShyLCJheGlzeSIpLHA9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHIsImF4aXN4IiksaD10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUociwiY29udGFpbmVyIiksbT1yLmNsYXNzTGlzdC5jb250YWlucygidG4tZ3JvdXAiKSYmInBoeXNpY2FsIj09PXQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUociwidHlwZSIpLGI9ci5wYXJlbnROb2RlLmNsb3Nlc3QoIi50bi1ncm91cCIpLHY9InBoeXNpY2FsIj09PXQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUoYiwidHlwZSIpO20mJihoPWh8fCJncmlkIik7dmFyIHk9cGFyc2VJbnQoaSksRixBLHgsUyxWLEUsSSxrPXQzOTZfX2dldEN1cnJlbnRTY2FsZUZhY3RvcihuKTtzd2l0Y2goZSl7Y2FzZSJsZWZ0Ijp2YXIgeixMPXQzOTZfX2dldFdpbmRvd0RpbWVuc2lvbnMoKS53aWR0aCxCO2lmKEY9ImdyaWQiPT09aD8iZ3JpZCI6IndpbmRvdyIsQT0iZ3JpZCI9PT1oP3dpbmRvdy50blthXS5ncmlkX29mZnNldF9sZWZ0OjAsVj0iZ3JpZCI9PT1oP3dpbmRvdy50blthXS5ncmlkX3dpZHRoOkwsIiUiPT09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHIsImxlZnR1bml0cyIpJiYoeT10Mzk2X3JvdW5kRmxvYXQoVip5LzEwMCkpLHYpe3ZhciBSPXBhcnNlSW50KHQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUoYiwibGVmdCIpLDEwKSxUOyIlIj09PXQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUoYiwibGVmdHVuaXRzIikmJihSPXQzOTZfcm91bmRGbG9hdChWKlIvMTAwKSkseS09UjticmVha30hdSYmZD8iZ3JpZCI9PT1oJiZjJiYoeSo9ayk6eT1BK3ksImNlbnRlciI9PT1wJiYoUz10Mzk2X2VsZW1fX2dldFdpZHRoKHIpLGYmJiJ3aW5kb3ciIT09RiYmKFYqPWssUyo9aykseT1WLzItUy8yK3kpLCJyaWdodCI9PT1wJiYoUz10Mzk2X2VsZW1fX2dldFdpZHRoKHIpLGYmJiJ3aW5kb3ciIT09RiYmKFYqPWssUyo9aykseT1WLVMreSksZiYmIndpbmRvdyIhPT1GJiYoeSs9KChTPXQzOTZfZWxlbV9fZ2V0V2lkdGgocikpKmstUykvMik7YnJlYWs7Y2FzZSJ0b3AiOnZhciBPPXIuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIikscT1PP08uZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXByb3h5LW1pbi1vZmZzZXQtdG9wIik6IjAiLEg9Tz9PLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1wcm94eS1taW4taGVpZ2h0Iik6IjAiLEM9Tz9PLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1wcm94eS1tYXgtaGVpZ2h0Iik6IjAiLFc9ZnVuY3Rpb24gdChlKXt2YXIgaT10Mzk2X2VsZW1fX2dldEhlaWdodChlKTtpZihlJiYiaW1hZ2UiPT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIikpe3ZhciByPXQzOTZfZWxlbV9fZ2V0V2lkdGgoZSksbz10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZSwiZmlsZXdpZHRoIiksbj10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZSwiZmlsZWhlaWdodCIpLGE9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGUsImltYWdlZml0Iil8fCJhdXRvIixsO2lmKG8mJm4mJiJhdXRvIj09PWEpaT1yLyhwYXJzZUludChvKS9wYXJzZUludChuKSl9cmV0dXJuIGl9LFA7aWYoRj0iZ3JpZCI9PT1oPyJncmlkIjoid2luZG93Iix4PSJncmlkIj09PWg/cGFyc2VGbG9hdChxKTowLEk9ImdyaWQiPT09aD9wYXJzZUZsb2F0KEgpOnBhcnNlRmxvYXQoQyksIiUiPT09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHIsInRvcHVuaXRzIikmJih5PUkqKHkvMTAwKSksdil7dmFyIE09cGFyc2VJbnQodDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZShiLCJ0b3AiKSwxMCksTjsiJSI9PT10Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKGIsInRvcHVuaXRzIikmJihNPXQzOTZfcm91bmRGbG9hdChJKk0vMTAwKSkseS09TTticmVha31mJiYid2luZG93IiE9PUYmJih5Kj1rKSxnJiYid2luZG93IiE9PUYmJih4PSJzdHJldGNoIj09PWw/MDp4L2spLHk9eCt5O3ZhciBEPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUoTywiaGVpZ2h0X3ZoIiksaj10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKE8sImhlaWdodCIpLEc9dDM5Nl9hYl9fZ2V0SGVpZ2h0KE8pLFo7aWYoZCYmIXUmJkQmJihaPXBhcnNlSW50KGosMTApKmspLCJjZW50ZXIiPT09dyYmKEU9VyhyKSxmJiYid2luZG93IiE9PUYmJigic3RyZXRjaCIhPT1sP0kqPWs6ST1aP1o+Rz9aOkc6Ty5jbGllbnRIZWlnaHQsRSo9ayksdXx8IWR8fGN8fCJ3aW5kb3ciPT09Rnx8InN0cmV0Y2giIT09bHx8KEk9Wj9aPkc/WjpHOk8uY2xpZW50SGVpZ2h0LEkvPWspLHk9SS8yLUUvMit5KSwiYm90dG9tIj09PXcmJihFPVcociksZiYmIndpbmRvdyIhPT1GJiYoInN0cmV0Y2giIT09bD9JKj1rOkk9Wj9aPkc/WjpHOk8uY2xpZW50SGVpZ2h0LEUqPWspLHV8fCFkfHxjfHwid2luZG93Ij09PUZ8fCJzdHJldGNoIiE9PWx8fChJPVo/Wj5HP1o6RzpPLmNsaWVudEhlaWdodCxJLz1rKSx5PUktRSt5KSxmJiYid2luZG93IiE9PUYpe3ZhciBVPSgoRT1XKHIpKSprLUUpLzI7eSs9VT1NYXRoLnJvdW5kKFUpfX1yZXR1cm4geX1mdW5jdGlvbiB0Mzk2X2VsZW1fZmluZEZpcnN0TGV2ZWxQYXJlbnRHcm91cCh0KXtmb3IodmFyIGU9dC5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKTtlOyl7dmFyIGk9ZS5wYXJlbnRFbGVtZW50LmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpO2lmKCFpKWJyZWFrO2U9aX1yZXR1cm4gZX1mdW5jdGlvbiB0Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsZSl7aWYoIXQpcmV0dXJuIG51bGw7dmFyIGkscj10LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpLG89ImFiIityLG47dm9pZCAwPT09d2luZG93LnRuW29dJiYodDM5Nl9pbml0VE5vYmoocix0KSx0Mzk2X3N3aXRjaFJlc29sdXRpb24ocix0Mzk2X2RldGVjdFJlc29sdXRpb24ocikpKTt2YXIgYT13aW5kb3cudG5bb10uY3VyUmVzb2x1dGlvbixsPXdpbmRvdy50bltvXS5jdXJSZXNvbHV0aW9uX21heCxkPXdpbmRvdy50bltvXS5zY3JlZW5zO2lmKG51bGw9PT0oaT1hPT09bD90LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC0iK2UpOnQuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLSIrZSsiLXJlcy0iK2EpKSlmb3IodmFyIF89MDtfPGQubGVuZ3RoO18rKyl7dmFyIHM9ZFtfXTtpZighKHM8PWEpJiZudWxsIT09KGk9cz09PWw/dC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtIitlKTp0LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC0iK2UrIi1yZXMtIitzKSkpYnJlYWt9dmFyIHU9dDM5Nl9fcGFyc2VHbG9iYWxTdHlsZUNTU1ZhcihpKTtyZXR1cm4gdSYmKGk9dS5mYWxsYmFjayksaX1mdW5jdGlvbiB0Mzk2X2FiX19yZW5kZXJWaWV3T25lRmllbGQodCxlKXt0Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsZSl9ZnVuY3Rpb24gdDM5Nl9jb3JlX19nZXRGaWVsZFZhbHVlKHQsZSl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19lbGVtIik/dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHQsZSk6dDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZSh0LGUpfWZ1bmN0aW9uIHQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUodCxlKXtpZighdClyZXR1cm4gbnVsbDt2YXIgaSxyLG89ImFiIit0LmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpLG49d2luZG93LnRuW29dLmN1clJlc29sdXRpb24sYT13aW5kb3cudG5bb10uY3VyUmVzb2x1dGlvbl9tYXgsbD13aW5kb3cudG5bb10uc2NyZWVucyxkPVsid2lkdGhtb2RlIiwiaGVpZ2h0bW9kZSIsImZsZXgiXS5pbmNsdWRlcyhlKT8iIjoiLXZhbHVlIjtpZihudWxsPT09KGk9bj09PWE/dC5nZXRBdHRyaWJ1dGUoImRhdGEtZ3JvdXAtIitlK2QpOnQuZ2V0QXR0cmlidXRlKCJkYXRhLWdyb3VwLSIrZSsiLXJlcy0iK24rZCkpKWZvcih2YXIgXz0wO188bC5sZW5ndGg7XysrKXt2YXIgcz1sW19dO2lmKCEoczw9bikmJm51bGwhPT0oaT1zPT09YT90LmdldEF0dHJpYnV0ZSgiZGF0YS1ncm91cC0iK2UrZCk6dC5nZXRBdHRyaWJ1dGUoImRhdGEtZ3JvdXAtIitlKyItcmVzLSIrcytkKSkpYnJlYWt9dmFyIHU9dDM5Nl9fcGFyc2VHbG9iYWxTdHlsZUNTU1ZhcihpKTtyZXR1cm4gdSYmKGk9dS5mYWxsYmFjayksaX1mdW5jdGlvbiB0Mzk2X2FsbGdyb3Vwc19fcmVuZGVyVmlldyh0KXtpZih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50bi1ncm91cCIpLGk9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGUsKGZ1bmN0aW9uKHQpe3JldHVybiJwaHlzaWNhbCI9PT10Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKHQsInR5cGUiKX0pKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe3QzOTZfZ3JvdXBfX3JlbmRlclZpZXcodCksdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXdBdXRvbGF5b3V0KHQpfSkpfX1mdW5jdGlvbiB0Mzk2X2FsbGdyb3Vwc19fcmVuZGVyVmlld0F1dG9sYXlvdXQodCl7aWYodCYmdC5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2dyb3VwLWZsZXgiKSl7dmFyIGU9dDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZSh0LCJ3aWR0aG1vZGUiKSxpPXQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUodCwiaGVpZ2h0bW9kZSIpOyJmaWxsIj09PWU/KHQuc3R5bGUud2lkdGg9IjEwMCUiLHQuc3R5bGUuZmxleFNocmluaz0iMSIpOih0LnN0eWxlLndpZHRoPSJodWciPT09ZT8ibWluLWNvbnRlbnQiOiIiLHQuc3R5bGUuaGVpZ2h0PSJodWciPT09aT8iaW5pdGlhbCI6IiIsdC5zdHlsZS5mbGV4U2hyaW5rPSIiKX19ZnVuY3Rpb24gdDM5Nl9hbGxlbGVtc19fcmVuZGVyVmlldyh0KXtpZih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50bi1lbGVtIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLChmdW5jdGlvbih0KXt0Mzk2X2VsZW1fX3JlbmRlclZpZXcodCl9KSl9fWZ1bmN0aW9uIHQzOTZfYWJfX2dldEhlaWdodCh0LGUpe3ZhciBpPWU7aXx8KGk9dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJoZWlnaHQiKSksaT1wYXJzZUZsb2F0KGkpO3ZhciByPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwiaGVpZ2h0X3ZoIik7aWYociYmKHI9cGFyc2VGbG9hdChyKSwhaXNOYU4ocikpKXt2YXIgbz10Mzk2X2FiX19nZXRXaW5kb3dIZWlnaHQodCkqci8xMDA7aTxvJiYoaT1vKX1yZXR1cm4gaX1mdW5jdGlvbiB0Mzk2X2VsZW1fX2dldFdpZHRoKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbCh0KSxyLG8sbj0iYWIiK2kuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIikuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIiksYT1lLGwsZCxfLHM7KGF8fChhPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLCJ3aWR0aCIpKSxhPXBhcnNlRmxvYXQoYSksIiUiPT09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGksIndpZHRodW5pdHMiKSkmJihhPSJ3aW5kb3ciPT09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGksImNvbnRhaW5lciIpP3QzOTZfX2dldFdpbmRvd0RpbWVuc2lvbnMoKS53aWR0aCphLzEwMDp3aW5kb3cudG5bbl0uZ3JpZF93aWR0aCphLzEwMCk7cmV0dXJuIGF9ZnVuY3Rpb24gdDM5Nl9lbGVtX19nZXRIZWlnaHQodCxlKXt2YXIgaT10Mzk2X2dldEVsKHQpLHI9ZTtyfHwocj10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoaSwiaGVpZ2h0IikpLHI9cGFyc2VGbG9hdChyKTt2YXIgbz1pLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKSxuPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLCJ0ZXh0Zml0IiksYTtpZihufHwoImJ1dHRvbiI9PT1vP249ImZpeGVkc2l6ZSI6InRleHQiPT09byYmKG49ImF1dG9oZWlnaHQiKSksInNoYXBlIj09PW98fCJ2aWRlbyI9PT1vfHwiaHRtbCI9PT1vfHwiZ2FsbGVyeSI9PT1vfHwoInRleHQiPT09b3x8ImJ1dHRvbiI9PT1vKSYmImZpeGVkc2l6ZSI9PT1uKXt2YXIgbDtpZigiJSI9PT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoaSwiaGVpZ2h0dW5pdHMiKSl7dmFyIGQ9aS5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKSxfPWQ/ZC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcHJveHktbWluLWhlaWdodCIpOiIwIixzPWQ/ZC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcHJveHktbWF4LWhlaWdodCIpOiIwIix1PXBhcnNlRmxvYXQoXyksYz1wYXJzZUZsb2F0KHMpLGY7cj0id2luZG93Ij09PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLCJjb250YWluZXIiKT9jKihyLzEwMCk6dSooci8xMDApfXJldHVybiByfWlmKCJ0ZXh0Ij09PW8pe3ZhciBnPWkucXVlcnlTZWxlY3RvcigiLnRuLWF0b20iKTtnJiYoZy5zdHlsZS5saW5lSGVpZ2h0PSIiKX1yZXR1cm4gaS5jbGllbnRIZWlnaHR9ZnVuY3Rpb24gdDM5Nl9yb3VuZEZsb2F0KHQpe3JldHVybiBNYXRoLnJvdW5kKDEwMCp0KS8xMDB9ZnVuY3Rpb24gdDM5Nl9yZW1vdmVFbGVtZW50RnJvbURPTSh0KXt2YXIgZT10Mzk2X2dldEVsKHQpO2UmJmUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpfWZ1bmN0aW9uIHQzOTZfX2dldEJsb2NrRWRpdG9yV2lkdGgoKXtpZighd2luZG93LnRuLmlzRWRpdE1vZGUpcmV0dXJuIDA7dmFyIHQsZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKCItLXBhZ2Utdmlldy13aWR0aCIpO3JldHVybiBlJiYiMTAwJSIhPT1lP3BhcnNlSW50KGUsMTApOjB9ZnVuY3Rpb24gdDM5Nl9faXNBbGxaZXJvQmxvY2tzUmVuZGVyZWQodCxlKXt2b2lkIDA9PT1lJiYoZT0wKTt2YXIgaT10Mzk2X19nZXRaZXJvQmxvY2tzKCkscj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLG89ciYmImVkaXQiPT09ci5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpLG49InJlYWR5Ij09PWRvY3VtZW50LmJvZHkuZ2V0QXR0cmlidXRlKCJkYXRhLXJlYWR5LXN0YXR1cyIpLGE9ITE7aWYoaS5sZW5ndGh8fCFvfHxuKXtpZighaS5sZW5ndGgmJm8mJm4pcmV0dXJuIGU+MzA/dm9pZCB0KCk6dm9pZCBzZXRUaW1lb3V0KChmdW5jdGlvbigpe3QzOTZfX2lzQWxsWmVyb0Jsb2Nrc1JlbmRlcmVkKHQsZSsxKX0pLDEwMCk7dmFyIGw9aS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmFydGJvYXJkfSkpLGQ7aWYobC5sZW5ndGg+MCYmbC5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZW5kZXJlZCIpfSkpKXQoKTtlbHNle3ZhciBfPWwuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5jbGFzc0xpc3QuY29udGFpbnMoInJlbmRlcmVkIil9KSk7bC5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmNsYXNzTGlzdC5jb250YWlucygicmVuZGVyZWQiKXx8ZS5hZGRFdmVudExpc3RlbmVyKCJhcnRCb2FyZFJlbmRlcmVkIiwoZnVuY3Rpb24oKXtfLnB1c2goZSksXy5sZW5ndGghPT1sLmxlbmd0aHx8YXx8dCgpfSkpfSkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7YT0hMCxfLmxlbmd0aCE9PWwubGVuZ3RoJiZ0KCl9KSwzZTMpfX1lbHNle3ZhciBzPW5ldyBNdXRhdGlvbk9ic2VydmVyKChmdW5jdGlvbihlKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpeyJyZWFkeSI9PT1lLnRhcmdldC5nZXRBdHRyaWJ1dGUoImRhdGEtcmVhZHktc3RhdHVzIikmJihzLmRpc2Nvbm5lY3QoKSx0Mzk2X19pc0FsbFplcm9CbG9ja3NSZW5kZXJlZCh0KSl9KSl9KSk7cy5vYnNlcnZlKGRvY3VtZW50LmJvZHkse2F0dHJpYnV0ZXM6ITAsYXR0cmlidXRlRmlsdGVyOlsiZGF0YS1yZWFkeS1zdGF0dXMiXX0pfX1mdW5jdGlvbiB0Mzk2X19wcm9jZXNzRWxlbWVudHNUcmFuc2Zvcm0odCl7dmFyIGU9dDM5Nl9faW5pdEZhc3RET00oKSxpPVtdO2UucmVhZCgoZnVuY3Rpb24oKXtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQsKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpO2lmKCJ0ZXh0Ij09PWV8fCJpbWFnZSI9PT1lfHwic2hhcGUiPT09ZXx8ImJ1dHRvbiI9PT1lfHwidmVjdG9yIj09PWUpe3ZhciByPWdldENvbXB1dGVkU3R5bGUodCksbz1yLmJhY2tkcm9wRmlsdGVyJiYibm9uZSIhPT1yLmJhY2tkcm9wRmlsdGVyfHxyLndlYmtpdEJhY2tkcm9wRmlsdGVyJiYibm9uZSIhPT1yLndlYmtpdEJhY2tkcm9wRmlsdGVyLG49dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zdHlsZSIpO2lmKG8mJiFuKXt2YXIgYT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tIiksbD1hP3dpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnRyYW5zZm9ybToibm9uZSI7Im1hdHJpeCgxLCAwLCAwLCAxLCAwLCAwKSI9PT1sJiYobD0ibm9uZSIpLCJub25lIiE9PWwmJmkucHVzaCh7ZWxlbWVudDp0LGF0b206YSxhdG9tVHJhbnNmb3JtOmx9KX19fSkpfSkpLGUud3JpdGUoKGZ1bmN0aW9uKCl7aS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmF0b20uc3R5bGUudHJhbnNmb3JtPSJub25lIix0LmVsZW1lbnQuc3R5bGUudHJhbnNmb3JtPXQuYXRvbVRyYW5zZm9ybX0pKX0pKX1mdW5jdGlvbiB0Mzk2X19maXhFbGVtZW50c0xpbmVIZWlnaHRzKHQpe3ZhciBlPXQzOTZfX2luaXRGYXN0RE9NKCksaT1bXTtlLnJlYWQoKGZ1bmN0aW9uKCl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt2YXIgZTtpZigidGV4dCI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKSl7dmFyIHI9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbSIpO2lmKHImJiF0Mzk2X19pc0luc2lkZUdyb3VwV2l0aFpvb20odCkpe3ZhciBvPXQuc3R5bGUuem9vbSxuPXIuc3R5bGUud2Via2l0VGV4dFNpemVBZGp1c3QsYT1yLnN0eWxlLmZvbnRTaXplLGw9dC5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGQtbGluZWhlaWdodHVuaXRzLXZhbHVlIil8fCIiO2kucHVzaCh7ZWxlbWVudDp0LGF0b206cix6b29tOm8sdGV4dFNpemVBZGp1c3Q6bixmb250U2l6ZTphLGlzUmVsYXRpdmVMaW5lSGVpZ2h0OiIlIj09PWx9KX19fSkpfSkpLGUud3JpdGUoKGZ1bmN0aW9uKCl7aS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmF0b20uc3R5bGUucmVtb3ZlUHJvcGVydHkoImxpbmUtaGVpZ2h0Iiksd2luZG93LnQzOTZfX2lzU2FmYXJpJiZ0Lnpvb20mJih0LmF0b20uc3R5bGUud2Via2l0VGV4dFNpemVBZGp1c3Q9Im5vbmUiLHQuYXRvbS5zdHlsZS5mb250U2l6ZT0iIix0LmVsZW1lbnQuc3R5bGUuem9vbT0iIil9KSl9KSksZS5yZWFkKChmdW5jdGlvbigpe2kuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5jb21wdXRlZExpbmVIZWlnaHQ9cGFyc2VGbG9hdCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0LmF0b20pLmxpbmVIZWlnaHQpfSkpfSkpLGUud3JpdGUoKGZ1bmN0aW9uKCl7aS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT10LmNvbXB1dGVkTGluZUhlaWdodDt3aW5kb3cudDM5Nl9faXNTYWZhcmkmJnQuem9vbSYmKHQuYXRvbS5zdHlsZS53ZWJraXRUZXh0U2l6ZUFkanVzdD10LnRleHRTaXplQWRqdXN0LHQuYXRvbS5zdHlsZS5mb250U2l6ZT10LmZvbnRTaXplLHQuem9vbSYmKHQuZWxlbWVudC5zdHlsZS56b29tPXQuem9vbSkpLGUmJiFpc05hTihlKSYmKHQuYXRvbS5zdHlsZS5zZXRQcm9wZXJ0eSgiLS1saC1weCIsTWF0aC5yb3VuZChlKSsicHgiKSx0LmlzUmVsYXRpdmVMaW5lSGVpZ2h0fHwodC5hdG9tLnN0eWxlLmxpbmVIZWlnaHQ9TWF0aC5yb3VuZChlKSsicHgiKSl9KSl9KSl9ZnVuY3Rpb24gdDM5Nl9fZml4RWxlbWVudHNGb250U2l6ZXModCl7dmFyIGU7aWYoIXdpbmRvdy50Mzk2X19pc01vYmlsZSYmd2luZG93LnQzOTZfX2lzSVBhZHx8d2luZG93LnQzOTZfX2lzRmFjZWJvb2tNZXNzZW5nZXJJbkFwcHx8d2luZG93LnQzOTZfX2lzSW5zdGFncmFtSW5BcHApe3ZhciBpPXQzOTZfX2luaXRGYXN0RE9NKCkscj1bXTtpLnJlYWQoKGZ1bmN0aW9uKCl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt2YXIgZT10LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKTtpZigidGV4dCI9PT1lfHwiYnV0dG9uIj09PWUpe3ZhciBpPXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b20iKTtpZihpKXt2YXIgbz10Mzk2X2VsZW1fZmluZEZpcnN0TGV2ZWxQYXJlbnRHcm91cCh0KSxuPXtlbGVtZW50OnQsYXRvbTppLHpvb206MSxlbGVtZW50VHlwZTplfTtpZihvJiZvLnN0eWxlLnpvb20mJihuLnpvb209cGFyc2VGbG9hdChvLnN0eWxlLnpvb20pKSwxIT09bi56b29tKXt2YXIgYT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUodCwiZm9udHNpemUiKTthJiYobi5maWVsZEZvbnRTaXplPXBhcnNlRmxvYXQoYSkpLHIucHVzaChuKX19fX0pKX0pKSxpLndyaXRlKChmdW5jdGlvbigpe3IuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5hdG9tLnN0eWxlLmZvbnRTaXplPSIifSkpfSkpLGkucmVhZCgoZnVuY3Rpb24oKXtyLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXBhcnNlRmxvYXQod2luZG93LmdldENvbXB1dGVkU3R5bGUodC5hdG9tKS5mb250U2l6ZSksaT10LmZpZWxkRm9udFNpemUmJk1hdGguYWJzKHQuZmllbGRGb250U2l6ZS1lKTw9LjAxLHI9TnVtYmVyLmlzSW50ZWdlcihlKTt0LmNvcnJlY3RGb250U2l6ZT1pfHxyPyJjYWxjKCIrZSsicHggKiB2YXIoLS16b29tLCAxKSkiOiJjYWxjKCIrZSsicHggKiB2YXIoLS16b29tLCAxKSAqIHZhcigtLXpvb20sIDEpKSJ9KSl9KSksaS53cml0ZSgoZnVuY3Rpb24oKXtyLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuYXRvbS5zdHlsZS5mb250U2l6ZT10LmNvcnJlY3RGb250U2l6ZX0pKX0pKX19ZnVuY3Rpb24gdDM5Nl9faW5pdEZhc3RET00oKXtyZXR1cm57cmVhZDpmdW5jdGlvbiB0KGUpe2UoKX0sd3JpdGU6ZnVuY3Rpb24gdChlKXtlKCl9fX1mdW5jdGlvbiB0Mzk2X19hcHBseUZpeGVzRm9yQWxsRWxlbWVudHMoKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudDM5Nl9fZWxlbSIpLGU9d2luZG93LnQzOTZfX2lzU2FmYXJpfHx3aW5kb3cudDM5Nl9faXNGYWNlYm9va01lc3NlbmdlckluQXBwfHx3aW5kb3cudDM5Nl9faXNJbnN0YWdyYW1JbkFwcDtkb2N1bWVudC5mb250cyYmZT9kb2N1bWVudC5mb250cy5yZWFkeS50aGVuKChmdW5jdGlvbigpe3QzOTZfX2ZpeEVsZW1lbnRzRm9udFNpemVzKHQpLHQzOTZfX2ZpeEVsZW1lbnRzTGluZUhlaWdodHModCl9KSk6dDM5Nl9fZml4RWxlbWVudHNMaW5lSGVpZ2h0cyh0KSx0Mzk2X19wcm9jZXNzRWxlbWVudHNUcmFuc2Zvcm0odCl9ZnVuY3Rpb24gdDM5Nl9fem9vbWlmeVZhbHVlKHQsZSxpKXt2b2lkIDA9PT1pJiYoaT17fSk7dmFyIHIsbz1lKyhTdHJpbmcoZSkuZW5kc1dpdGgoInB4Iik/IiI6InB4IiksbjtpZih0Mzk2X19pc0luc2lkZUdyb3VwV2l0aFpvb20odCkpcmV0dXJuIG87dmFyIGE9d2luZG93LkNTUyYmd2luZG93LkNTUy5zdXBwb3J0cyYmQ1NTLnN1cHBvcnRzKCJ3aWR0aCIsInJvdW5kKDEwcHgsIDFweCkiKTtyZXR1cm4gaS5yb3VuZCYmYT8icm91bmQoIitvKyIgKiB2YXIoLS16b29tLCAxKSwgMXB4KSI6ImNhbGMoIitvKyIgKiB2YXIoLS16b29tLCAxKSkifWZ1bmN0aW9uIHQzOTZfX2lzSW5Qb3B1cCh0KXtpZighdClyZXR1cm4hMTt2YXIgZT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpLGkscjtyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrZSkucGFyZW50Tm9kZS5jbGFzc0xpc3QuY29udGFpbnMoInQtcG9wdXBfX2NvbnRhaW5lciIpfWZ1bmN0aW9uIHQzOTZfX3dhaXRGb3JQb3B1cCgpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCl7dmFyIGU9MCxpPTU7ZnVuY3Rpb24gcigpe3ZhciBpPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXBvcHVwX3Nob3ciKTtpP3QoaSk6ZT49NT90KG51bGwpOihlKyssc2V0VGltZW91dChyLDEwMCplKSl9cigpfSkpfWZ1bmN0aW9uIHQzOTZfX3Nob3VsZFVzZVZpc3VhbFZpZXdwb3J0SGVpZ2h0KCl7cmV0dXJuInZpc3VhbFZpZXdwb3J0ImluIHdpbmRvdyYmd2luZG93LnQzOTZfX2lzTW9iaWxlJiZ3aW5kb3cudDM5Nl9faXNTYWZhcml9ZnVuY3Rpb24gdDM5Nl9fZ2V0Um9vdFpvbmUoKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLGU7cmV0dXJuIHQmJnQuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLXJvb3Qtem9uZSIpfHwiY29tIn1mdW5jdGlvbiB0Mzk2X19pbnRpYWxpemVVbmRlcmN1dCh0KXtpZih0JiZ0LnF1ZXJ5U2VsZWN0b3IoIi5xbC11bmRlcmN1dCIpKXt2YXIgZSxpPSJodHRwczovL3N0YXRpYy50aWxkYWNkbi4iK3QzOTZfX2dldFJvb3Rab25lKCkrIi9qcy90aWxkYS11bmRlcmN1dC0xLjAubWluLmpzIjt0X29uRnVuY0xvYWQoInRfbG9hZEpzRmlsZSIsKGZ1bmN0aW9uKCl7dF9sb2FkSnNGaWxlKGksKGZ1bmN0aW9uKCl7dF9vbkZ1bmNMb2FkKCJ0X3F1aWxsVW5kZXJjdXRfcGFyc2VOb2RlcyIsKGZ1bmN0aW9uKCl7dF9xdWlsbFVuZGVyY3V0X3BhcnNlTm9kZXModCl9KSl9KSl9KSl9fWZ1bmN0aW9uIHQzOTZfX2luaXRpYWxpemVBcnRib2FyZE92ZXJmbG93KHQsZSl7aWYoZSYmdCl7dmFyIGk9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSkuZ2V0UHJvcGVydHlWYWx1ZSgib3ZlcmZsb3ciKTtpZigiYXV0byI9PT1pKXt2YXIgcj10LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1sYXp5Iik7InkiIT09d2luZG93LmxhenkmJiJ5ZXMiIT09cnx8dF9vbkZ1bmNMb2FkKCJ0X2xhenlsb2FkX3VwZGF0ZSIsKGZ1bmN0aW9uKCl7ZS5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRfdGhyb3R0bGUod2luZG93LnRfbGF6eWxvYWRfdXBkYXRlLDUwMCkpfSkpfSIiIT09d2luZG93LmxvY2F0aW9uLmhhc2gmJiJ2aXNpYmxlIj09PWkmJihlLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZS5zdHlsZS5vdmVyZmxvdz0idmlzaWJsZSJ9KSwxKSl9fWZ1bmN0aW9uIHQzOTZfX2luaXRpYWxpemVBbmNob3JMaW5rT3ZlcmZsb3dGaXgoKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1hcnRib2FyZC1vdnJmbHc9InZpc2libGUiXScpO3QubGVuZ3RoJiZkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKGZ1bmN0aW9uKGUpe3ZhciBpO2UudGFyZ2V0LmNsb3Nlc3QoJ2FbaHJlZl49IiMiXScpJiYodC5mb3JFYWNoKChmdW5jdGlvbih0KXt0LnN0eWxlLm92ZXJmbG93PSJoaWRkZW4ifSkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt0LnN0eWxlLm92ZXJmbG93PSJ2aXNpYmxlIn0pKX0pKSl9KSl9CgovKiEgSGFtbWVyLkpTIC0gdjIuMC44IC0gMjAxNi0wNC0yMwogKiBodHRwOi8vaGFtbWVyanMuZ2l0aHViLmlvLwogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTYgSm9yaWsgVGFuZ2VsZGVyOwogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgKi8KIWZ1bmN0aW9uKGEsYixjLGQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBlKGEsYixjKXtyZXR1cm4gc2V0VGltZW91dChqKGEsYyksYil9ZnVuY3Rpb24gZihhLGIsYyl7cmV0dXJuIEFycmF5LmlzQXJyYXkoYSk/KGcoYSxjW2JdLGMpLCEwKTohMX1mdW5jdGlvbiBnKGEsYixjKXt2YXIgZTtpZihhKWlmKGEuZm9yRWFjaClhLmZvckVhY2goYixjKTtlbHNlIGlmKGEubGVuZ3RoIT09ZClmb3IoZT0wO2U8YS5sZW5ndGg7KWIuY2FsbChjLGFbZV0sZSxhKSxlKys7ZWxzZSBmb3IoZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIuY2FsbChjLGFbZV0sZSxhKX1mdW5jdGlvbiBoKGIsYyxkKXt2YXIgZT0iREVQUkVDQVRFRCBNRVRIT0Q6ICIrYysiXG4iK2QrIiBBVCBcbiI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGM9bmV3IEVycm9yKCJnZXQtc3RhY2stdHJhY2UiKSxkPWMmJmMuc3RhY2s/Yy5zdGFjay5yZXBsYWNlKC9eW15cKF0rP1tcbiRdL2dtLCIiKS5yZXBsYWNlKC9eXHMrYXRccysvZ20sIiIpLnJlcGxhY2UoL15PYmplY3QuPGFub255bW91cz5ccypcKC9nbSwie2Fub255bW91c30oKUAiKToiVW5rbm93biBTdGFjayBUcmFjZSIsZj1hLmNvbnNvbGUmJihhLmNvbnNvbGUud2Fybnx8YS5jb25zb2xlLmxvZyk7cmV0dXJuIGYmJmYuY2FsbChhLmNvbnNvbGUsZSxkKSxiLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gaShhLGIsYyl7dmFyIGQsZT1iLnByb3RvdHlwZTtkPWEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSksZC5jb25zdHJ1Y3Rvcj1hLGQuX3N1cGVyPWUsYyYmbGEoZCxjKX1mdW5jdGlvbiBqKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkoYixhcmd1bWVudHMpfX1mdW5jdGlvbiBrKGEsYil7cmV0dXJuIHR5cGVvZiBhPT1vYT9hLmFwcGx5KGI/YlswXXx8ZDpkLGIpOmF9ZnVuY3Rpb24gbChhLGIpe3JldHVybiBhPT09ZD9iOmF9ZnVuY3Rpb24gbShhLGIsYyl7ZyhxKGIpLGZ1bmN0aW9uKGIpe2EuYWRkRXZlbnRMaXN0ZW5lcihiLGMsITEpfSl9ZnVuY3Rpb24gbihhLGIsYyl7ZyhxKGIpLGZ1bmN0aW9uKGIpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpfSl9ZnVuY3Rpb24gbyhhLGIpe2Zvcig7YTspe2lmKGE9PWIpcmV0dXJuITA7YT1hLnBhcmVudE5vZGV9cmV0dXJuITF9ZnVuY3Rpb24gcChhLGIpe3JldHVybiBhLmluZGV4T2YoYik+LTF9ZnVuY3Rpb24gcShhKXtyZXR1cm4gYS50cmltKCkuc3BsaXQoL1xzKy9nKX1mdW5jdGlvbiByKGEsYixjKXtpZihhLmluZGV4T2YmJiFjKXJldHVybiBhLmluZGV4T2YoYik7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDspe2lmKGMmJmFbZF1bY109PWJ8fCFjJiZhW2RdPT09YilyZXR1cm4gZDtkKyt9cmV0dXJuLTF9ZnVuY3Rpb24gcyhhKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSwwKX1mdW5jdGlvbiB0KGEsYixjKXtmb3IodmFyIGQ9W10sZT1bXSxmPTA7ZjxhLmxlbmd0aDspe3ZhciBnPWI/YVtmXVtiXTphW2ZdO3IoZSxnKTwwJiZkLnB1c2goYVtmXSksZVtmXT1nLGYrK31yZXR1cm4gYyYmKGQ9Yj9kLnNvcnQoZnVuY3Rpb24oYSxjKXtyZXR1cm4gYVtiXT5jW2JdfSk6ZC5zb3J0KCkpLGR9ZnVuY3Rpb24gdShhLGIpe2Zvcih2YXIgYyxlLGY9YlswXS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSksZz0wO2c8bWEubGVuZ3RoOyl7aWYoYz1tYVtnXSxlPWM/YytmOmIsZSBpbiBhKXJldHVybiBlO2crK31yZXR1cm4gZH1mdW5jdGlvbiB2KCl7cmV0dXJuIHVhKyt9ZnVuY3Rpb24gdyhiKXt2YXIgYz1iLm93bmVyRG9jdW1lbnR8fGI7cmV0dXJuIGMuZGVmYXVsdFZpZXd8fGMucGFyZW50V2luZG93fHxhfWZ1bmN0aW9uIHgoYSxiKXt2YXIgYz10aGlzO3RoaXMubWFuYWdlcj1hLHRoaXMuY2FsbGJhY2s9Yix0aGlzLmVsZW1lbnQ9YS5lbGVtZW50LHRoaXMudGFyZ2V0PWEub3B0aW9ucy5pbnB1dFRhcmdldCx0aGlzLmRvbUhhbmRsZXI9ZnVuY3Rpb24oYil7ayhhLm9wdGlvbnMuZW5hYmxlLFthXSkmJmMuaGFuZGxlcihiKX0sdGhpcy5pbml0KCl9ZnVuY3Rpb24geShhKXt2YXIgYixjPWEub3B0aW9ucy5pbnB1dENsYXNzO3JldHVybiBuZXcoYj1jP2M6eGE/TTp5YT9QOndhP1I6TCkoYSx6KX1mdW5jdGlvbiB6KGEsYixjKXt2YXIgZD1jLnBvaW50ZXJzLmxlbmd0aCxlPWMuY2hhbmdlZFBvaW50ZXJzLmxlbmd0aCxmPWImRWEmJmQtZT09PTAsZz1iJihHYXxIYSkmJmQtZT09PTA7Yy5pc0ZpcnN0PSEhZixjLmlzRmluYWw9ISFnLGYmJihhLnNlc3Npb249e30pLGMuZXZlbnRUeXBlPWIsQShhLGMpLGEuZW1pdCgiaGFtbWVyLmlucHV0IixjKSxhLnJlY29nbml6ZShjKSxhLnNlc3Npb24ucHJldklucHV0PWN9ZnVuY3Rpb24gQShhLGIpe3ZhciBjPWEuc2Vzc2lvbixkPWIucG9pbnRlcnMsZT1kLmxlbmd0aDtjLmZpcnN0SW5wdXR8fChjLmZpcnN0SW5wdXQ9RChiKSksZT4xJiYhYy5maXJzdE11bHRpcGxlP2MuZmlyc3RNdWx0aXBsZT1EKGIpOjE9PT1lJiYoYy5maXJzdE11bHRpcGxlPSExKTt2YXIgZj1jLmZpcnN0SW5wdXQsZz1jLmZpcnN0TXVsdGlwbGUsaD1nP2cuY2VudGVyOmYuY2VudGVyLGk9Yi5jZW50ZXI9RShkKTtiLnRpbWVTdGFtcD1yYSgpLGIuZGVsdGFUaW1lPWIudGltZVN0YW1wLWYudGltZVN0YW1wLGIuYW5nbGU9SShoLGkpLGIuZGlzdGFuY2U9SChoLGkpLEIoYyxiKSxiLm9mZnNldERpcmVjdGlvbj1HKGIuZGVsdGFYLGIuZGVsdGFZKTt2YXIgaj1GKGIuZGVsdGFUaW1lLGIuZGVsdGFYLGIuZGVsdGFZKTtiLm92ZXJhbGxWZWxvY2l0eVg9ai54LGIub3ZlcmFsbFZlbG9jaXR5WT1qLnksYi5vdmVyYWxsVmVsb2NpdHk9cWEoai54KT5xYShqLnkpP2oueDpqLnksYi5zY2FsZT1nP0soZy5wb2ludGVycyxkKToxLGIucm90YXRpb249Zz9KKGcucG9pbnRlcnMsZCk6MCxiLm1heFBvaW50ZXJzPWMucHJldklucHV0P2IucG9pbnRlcnMubGVuZ3RoPmMucHJldklucHV0Lm1heFBvaW50ZXJzP2IucG9pbnRlcnMubGVuZ3RoOmMucHJldklucHV0Lm1heFBvaW50ZXJzOmIucG9pbnRlcnMubGVuZ3RoLEMoYyxiKTt2YXIgaz1hLmVsZW1lbnQ7byhiLnNyY0V2ZW50LnRhcmdldCxrKSYmKGs9Yi5zcmNFdmVudC50YXJnZXQpLGIudGFyZ2V0PWt9ZnVuY3Rpb24gQihhLGIpe3ZhciBjPWIuY2VudGVyLGQ9YS5vZmZzZXREZWx0YXx8e30sZT1hLnByZXZEZWx0YXx8e30sZj1hLnByZXZJbnB1dHx8e307Yi5ldmVudFR5cGUhPT1FYSYmZi5ldmVudFR5cGUhPT1HYXx8KGU9YS5wcmV2RGVsdGE9e3g6Zi5kZWx0YVh8fDAseTpmLmRlbHRhWXx8MH0sZD1hLm9mZnNldERlbHRhPXt4OmMueCx5OmMueX0pLGIuZGVsdGFYPWUueCsoYy54LWQueCksYi5kZWx0YVk9ZS55KyhjLnktZC55KX1mdW5jdGlvbiBDKGEsYil7dmFyIGMsZSxmLGcsaD1hLmxhc3RJbnRlcnZhbHx8YixpPWIudGltZVN0YW1wLWgudGltZVN0YW1wO2lmKGIuZXZlbnRUeXBlIT1IYSYmKGk+RGF8fGgudmVsb2NpdHk9PT1kKSl7dmFyIGo9Yi5kZWx0YVgtaC5kZWx0YVgsaz1iLmRlbHRhWS1oLmRlbHRhWSxsPUYoaSxqLGspO2U9bC54LGY9bC55LGM9cWEobC54KT5xYShsLnkpP2wueDpsLnksZz1HKGosayksYS5sYXN0SW50ZXJ2YWw9Yn1lbHNlIGM9aC52ZWxvY2l0eSxlPWgudmVsb2NpdHlYLGY9aC52ZWxvY2l0eVksZz1oLmRpcmVjdGlvbjtiLnZlbG9jaXR5PWMsYi52ZWxvY2l0eVg9ZSxiLnZlbG9jaXR5WT1mLGIuZGlyZWN0aW9uPWd9ZnVuY3Rpb24gRChhKXtmb3IodmFyIGI9W10sYz0wO2M8YS5wb2ludGVycy5sZW5ndGg7KWJbY109e2NsaWVudFg6cGEoYS5wb2ludGVyc1tjXS5jbGllbnRYKSxjbGllbnRZOnBhKGEucG9pbnRlcnNbY10uY2xpZW50WSl9LGMrKztyZXR1cm57dGltZVN0YW1wOnJhKCkscG9pbnRlcnM6YixjZW50ZXI6RShiKSxkZWx0YVg6YS5kZWx0YVgsZGVsdGFZOmEuZGVsdGFZfX1mdW5jdGlvbiBFKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDE9PT1iKXJldHVybnt4OnBhKGFbMF0uY2xpZW50WCkseTpwYShhWzBdLmNsaWVudFkpfTtmb3IodmFyIGM9MCxkPTAsZT0wO2I+ZTspYys9YVtlXS5jbGllbnRYLGQrPWFbZV0uY2xpZW50WSxlKys7cmV0dXJue3g6cGEoYy9iKSx5OnBhKGQvYil9fWZ1bmN0aW9uIEYoYSxiLGMpe3JldHVybnt4OmIvYXx8MCx5OmMvYXx8MH19ZnVuY3Rpb24gRyhhLGIpe3JldHVybiBhPT09Yj9JYTpxYShhKT49cWEoYik/MD5hP0phOkthOjA+Yj9MYTpNYX1mdW5jdGlvbiBIKGEsYixjKXtjfHwoYz1RYSk7dmFyIGQ9YltjWzBdXS1hW2NbMF1dLGU9YltjWzFdXS1hW2NbMV1dO3JldHVybiBNYXRoLnNxcnQoZCpkK2UqZSl9ZnVuY3Rpb24gSShhLGIsYyl7Y3x8KGM9UWEpO3ZhciBkPWJbY1swXV0tYVtjWzBdXSxlPWJbY1sxXV0tYVtjWzFdXTtyZXR1cm4gMTgwKk1hdGguYXRhbjIoZSxkKS9NYXRoLlBJfWZ1bmN0aW9uIEooYSxiKXtyZXR1cm4gSShiWzFdLGJbMF0sUmEpK0koYVsxXSxhWzBdLFJhKX1mdW5jdGlvbiBLKGEsYil7cmV0dXJuIEgoYlswXSxiWzFdLFJhKS9IKGFbMF0sYVsxXSxSYSl9ZnVuY3Rpb24gTCgpe3RoaXMuZXZFbD1UYSx0aGlzLmV2V2luPVVhLHRoaXMucHJlc3NlZD0hMSx4LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBNKCl7dGhpcy5ldkVsPVhhLHRoaXMuZXZXaW49WWEseC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5zdG9yZT10aGlzLm1hbmFnZXIuc2Vzc2lvbi5wb2ludGVyRXZlbnRzPVtdfWZ1bmN0aW9uIE4oKXt0aGlzLmV2VGFyZ2V0PSRhLHRoaXMuZXZXaW49X2EsdGhpcy5zdGFydGVkPSExLHguYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIE8oYSxiKXt2YXIgYz1zKGEudG91Y2hlcyksZD1zKGEuY2hhbmdlZFRvdWNoZXMpO3JldHVybiBiJihHYXxIYSkmJihjPXQoYy5jb25jYXQoZCksImlkZW50aWZpZXIiLCEwKSksW2MsZF19ZnVuY3Rpb24gUCgpe3RoaXMuZXZUYXJnZXQ9YmIsdGhpcy50YXJnZXRJZHM9e30seC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gUShhLGIpe3ZhciBjPXMoYS50b3VjaGVzKSxkPXRoaXMudGFyZ2V0SWRzO2lmKGImKEVhfEZhKSYmMT09PWMubGVuZ3RoKXJldHVybiBkW2NbMF0uaWRlbnRpZmllcl09ITAsW2MsY107dmFyIGUsZixnPXMoYS5jaGFuZ2VkVG91Y2hlcyksaD1bXSxpPXRoaXMudGFyZ2V0O2lmKGY9Yy5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIG8oYS50YXJnZXQsaSl9KSxiPT09RWEpZm9yKGU9MDtlPGYubGVuZ3RoOylkW2ZbZV0uaWRlbnRpZmllcl09ITAsZSsrO2ZvcihlPTA7ZTxnLmxlbmd0aDspZFtnW2VdLmlkZW50aWZpZXJdJiZoLnB1c2goZ1tlXSksYiYoR2F8SGEpJiZkZWxldGUgZFtnW2VdLmlkZW50aWZpZXJdLGUrKztyZXR1cm4gaC5sZW5ndGg/W3QoZi5jb25jYXQoaCksImlkZW50aWZpZXIiLCEwKSxoXTp2b2lkIDB9ZnVuY3Rpb24gUigpe3guYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBhPWoodGhpcy5oYW5kbGVyLHRoaXMpO3RoaXMudG91Y2g9bmV3IFAodGhpcy5tYW5hZ2VyLGEpLHRoaXMubW91c2U9bmV3IEwodGhpcy5tYW5hZ2VyLGEpLHRoaXMucHJpbWFyeVRvdWNoPW51bGwsdGhpcy5sYXN0VG91Y2hlcz1bXX1mdW5jdGlvbiBTKGEsYil7YSZFYT8odGhpcy5wcmltYXJ5VG91Y2g9Yi5jaGFuZ2VkUG9pbnRlcnNbMF0uaWRlbnRpZmllcixULmNhbGwodGhpcyxiKSk6YSYoR2F8SGEpJiZULmNhbGwodGhpcyxiKX1mdW5jdGlvbiBUKGEpe3ZhciBiPWEuY2hhbmdlZFBvaW50ZXJzWzBdO2lmKGIuaWRlbnRpZmllcj09PXRoaXMucHJpbWFyeVRvdWNoKXt2YXIgYz17eDpiLmNsaWVudFgseTpiLmNsaWVudFl9O3RoaXMubGFzdFRvdWNoZXMucHVzaChjKTt2YXIgZD10aGlzLmxhc3RUb3VjaGVzLGU9ZnVuY3Rpb24oKXt2YXIgYT1kLmluZGV4T2YoYyk7YT4tMSYmZC5zcGxpY2UoYSwxKX07c2V0VGltZW91dChlLGNiKX19ZnVuY3Rpb24gVShhKXtmb3IodmFyIGI9YS5zcmNFdmVudC5jbGllbnRYLGM9YS5zcmNFdmVudC5jbGllbnRZLGQ9MDtkPHRoaXMubGFzdFRvdWNoZXMubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5sYXN0VG91Y2hlc1tkXSxmPU1hdGguYWJzKGItZS54KSxnPU1hdGguYWJzKGMtZS55KTtpZihkYj49ZiYmZGI+PWcpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gVihhLGIpe3RoaXMubWFuYWdlcj1hLHRoaXMuc2V0KGIpfWZ1bmN0aW9uIFcoYSl7aWYocChhLGpiKSlyZXR1cm4gamI7dmFyIGI9cChhLGtiKSxjPXAoYSxsYik7cmV0dXJuIGImJmM/amI6Ynx8Yz9iP2tiOmxiOnAoYSxpYik/aWI6aGJ9ZnVuY3Rpb24gWCgpe2lmKCFmYilyZXR1cm4hMTt2YXIgYj17fSxjPWEuQ1NTJiZhLkNTUy5zdXBwb3J0cztyZXR1cm5bImF1dG8iLCJtYW5pcHVsYXRpb24iLCJwYW4teSIsInBhbi14IiwicGFuLXggcGFuLXkiLCJub25lIl0uZm9yRWFjaChmdW5jdGlvbihkKXtiW2RdPWM/YS5DU1Muc3VwcG9ydHMoInRvdWNoLWFjdGlvbiIsZCk6ITB9KSxifWZ1bmN0aW9uIFkoYSl7dGhpcy5vcHRpb25zPWxhKHt9LHRoaXMuZGVmYXVsdHMsYXx8e30pLHRoaXMuaWQ9digpLHRoaXMubWFuYWdlcj1udWxsLHRoaXMub3B0aW9ucy5lbmFibGU9bCh0aGlzLm9wdGlvbnMuZW5hYmxlLCEwKSx0aGlzLnN0YXRlPW5iLHRoaXMuc2ltdWx0YW5lb3VzPXt9LHRoaXMucmVxdWlyZUZhaWw9W119ZnVuY3Rpb24gWihhKXtyZXR1cm4gYSZzYj8iY2FuY2VsIjphJnFiPyJlbmQiOmEmcGI/Im1vdmUiOmEmb2I/InN0YXJ0IjoiIn1mdW5jdGlvbiAkKGEpe3JldHVybiBhPT1NYT8iZG93biI6YT09TGE/InVwIjphPT1KYT8ibGVmdCI6YT09S2E/InJpZ2h0IjoiIn1mdW5jdGlvbiBfKGEsYil7dmFyIGM9Yi5tYW5hZ2VyO3JldHVybiBjP2MuZ2V0KGEpOmF9ZnVuY3Rpb24gYWEoKXtZLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBiYSgpe2FhLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnBYPW51bGwsdGhpcy5wWT1udWxsfWZ1bmN0aW9uIGNhKCl7YWEuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGRhKCl7WS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fdGltZXI9bnVsbCx0aGlzLl9pbnB1dD1udWxsfWZ1bmN0aW9uIGVhKCl7YWEuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGZhKCl7YWEuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGdhKCl7WS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5wVGltZT0hMSx0aGlzLnBDZW50ZXI9ITEsdGhpcy5fdGltZXI9bnVsbCx0aGlzLl9pbnB1dD1udWxsLHRoaXMuY291bnQ9MH1mdW5jdGlvbiBoYShhLGIpe3JldHVybiBiPWJ8fHt9LGIucmVjb2duaXplcnM9bChiLnJlY29nbml6ZXJzLGhhLmRlZmF1bHRzLnByZXNldCksbmV3IGlhKGEsYil9ZnVuY3Rpb24gaWEoYSxiKXt0aGlzLm9wdGlvbnM9bGEoe30saGEuZGVmYXVsdHMsYnx8e30pLHRoaXMub3B0aW9ucy5pbnB1dFRhcmdldD10aGlzLm9wdGlvbnMuaW5wdXRUYXJnZXR8fGEsdGhpcy5oYW5kbGVycz17fSx0aGlzLnNlc3Npb249e30sdGhpcy5yZWNvZ25pemVycz1bXSx0aGlzLm9sZENzc1Byb3BzPXt9LHRoaXMuZWxlbWVudD1hLHRoaXMuaW5wdXQ9eSh0aGlzKSx0aGlzLnRvdWNoQWN0aW9uPW5ldyBWKHRoaXMsdGhpcy5vcHRpb25zLnRvdWNoQWN0aW9uKSxqYSh0aGlzLCEwKSxnKHRoaXMub3B0aW9ucy5yZWNvZ25pemVycyxmdW5jdGlvbihhKXt2YXIgYj10aGlzLmFkZChuZXcgYVswXShhWzFdKSk7YVsyXSYmYi5yZWNvZ25pemVXaXRoKGFbMl0pLGFbM10mJmIucmVxdWlyZUZhaWx1cmUoYVszXSl9LHRoaXMpfWZ1bmN0aW9uIGphKGEsYil7dmFyIGM9YS5lbGVtZW50O2lmKGMuc3R5bGUpe3ZhciBkO2coYS5vcHRpb25zLmNzc1Byb3BzLGZ1bmN0aW9uKGUsZil7ZD11KGMuc3R5bGUsZiksYj8oYS5vbGRDc3NQcm9wc1tkXT1jLnN0eWxlW2RdLGMuc3R5bGVbZF09ZSk6Yy5zdHlsZVtkXT1hLm9sZENzc1Byb3BzW2RdfHwiIn0pLGJ8fChhLm9sZENzc1Byb3BzPXt9KX19ZnVuY3Rpb24ga2EoYSxjKXt2YXIgZD1iLmNyZWF0ZUV2ZW50KCJFdmVudCIpO2QuaW5pdEV2ZW50KGEsITAsITApLGQuZ2VzdHVyZT1jLGMudGFyZ2V0LmRpc3BhdGNoRXZlbnQoZCl9dmFyIGxhLG1hPVsiIiwid2Via2l0IiwiTW96IiwiTVMiLCJtcyIsIm8iXSxuYT1iLmNyZWF0ZUVsZW1lbnQoImRpdiIpLG9hPSJmdW5jdGlvbiIscGE9TWF0aC5yb3VuZCxxYT1NYXRoLmFicyxyYT1EYXRlLm5vdztsYT0iZnVuY3Rpb24iIT10eXBlb2YgT2JqZWN0LmFzc2lnbj9mdW5jdGlvbihhKXtpZihhPT09ZHx8bnVsbD09PWEpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Iik7Zm9yKHZhciBiPU9iamVjdChhKSxjPTE7Yzxhcmd1bWVudHMubGVuZ3RoO2MrKyl7dmFyIGU9YXJndW1lbnRzW2NdO2lmKGUhPT1kJiZudWxsIT09ZSlmb3IodmFyIGYgaW4gZSllLmhhc093blByb3BlcnR5KGYpJiYoYltmXT1lW2ZdKX1yZXR1cm4gYn06T2JqZWN0LmFzc2lnbjt2YXIgc2E9aChmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBlPU9iamVjdC5rZXlzKGIpLGY9MDtmPGUubGVuZ3RoOykoIWN8fGMmJmFbZVtmXV09PT1kKSYmKGFbZVtmXV09YltlW2ZdXSksZisrO3JldHVybiBhfSwiZXh0ZW5kIiwiVXNlIGBhc3NpZ25gLiIpLHRhPWgoZnVuY3Rpb24oYSxiKXtyZXR1cm4gc2EoYSxiLCEwKX0sIm1lcmdlIiwiVXNlIGBhc3NpZ25gLiIpLHVhPTEsdmE9L21vYmlsZXx0YWJsZXR8aXAoYWR8aG9uZXxvZCl8YW5kcm9pZC9pLHdhPSJvbnRvdWNoc3RhcnQiaW4gYSx4YT11KGEsIlBvaW50ZXJFdmVudCIpIT09ZCx5YT13YSYmdmEudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx6YT0idG91Y2giLEFhPSJwZW4iLEJhPSJtb3VzZSIsQ2E9ImtpbmVjdCIsRGE9MjUsRWE9MSxGYT0yLEdhPTQsSGE9OCxJYT0xLEphPTIsS2E9NCxMYT04LE1hPTE2LE5hPUphfEthLE9hPUxhfE1hLFBhPU5hfE9hLFFhPVsieCIsInkiXSxSYT1bImNsaWVudFgiLCJjbGllbnRZIl07eC5wcm90b3R5cGU9e2hhbmRsZXI6ZnVuY3Rpb24oKXt9LGluaXQ6ZnVuY3Rpb24oKXt0aGlzLmV2RWwmJm0odGhpcy5lbGVtZW50LHRoaXMuZXZFbCx0aGlzLmRvbUhhbmRsZXIpLHRoaXMuZXZUYXJnZXQmJm0odGhpcy50YXJnZXQsdGhpcy5ldlRhcmdldCx0aGlzLmRvbUhhbmRsZXIpLHRoaXMuZXZXaW4mJm0odyh0aGlzLmVsZW1lbnQpLHRoaXMuZXZXaW4sdGhpcy5kb21IYW5kbGVyKX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZXZFbCYmbih0aGlzLmVsZW1lbnQsdGhpcy5ldkVsLHRoaXMuZG9tSGFuZGxlciksdGhpcy5ldlRhcmdldCYmbih0aGlzLnRhcmdldCx0aGlzLmV2VGFyZ2V0LHRoaXMuZG9tSGFuZGxlciksdGhpcy5ldldpbiYmbih3KHRoaXMuZWxlbWVudCksdGhpcy5ldldpbix0aGlzLmRvbUhhbmRsZXIpfX07dmFyIFNhPXttb3VzZWRvd246RWEsbW91c2Vtb3ZlOkZhLG1vdXNldXA6R2F9LFRhPSJtb3VzZWRvd24iLFVhPSJtb3VzZW1vdmUgbW91c2V1cCI7aShMLHgse2hhbmRsZXI6ZnVuY3Rpb24oYSl7dmFyIGI9U2FbYS50eXBlXTtiJkVhJiYwPT09YS5idXR0b24mJih0aGlzLnByZXNzZWQ9ITApLGImRmEmJjEhPT1hLndoaWNoJiYoYj1HYSksdGhpcy5wcmVzc2VkJiYoYiZHYSYmKHRoaXMucHJlc3NlZD0hMSksdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsYix7cG9pbnRlcnM6W2FdLGNoYW5nZWRQb2ludGVyczpbYV0scG9pbnRlclR5cGU6QmEsc3JjRXZlbnQ6YX0pKX19KTt2YXIgVmE9e3BvaW50ZXJkb3duOkVhLHBvaW50ZXJtb3ZlOkZhLHBvaW50ZXJ1cDpHYSxwb2ludGVyY2FuY2VsOkhhLHBvaW50ZXJvdXQ6SGF9LFdhPXsyOnphLDM6QWEsNDpCYSw1OkNhfSxYYT0icG9pbnRlcmRvd24iLFlhPSJwb2ludGVybW92ZSBwb2ludGVydXAgcG9pbnRlcmNhbmNlbCI7YS5NU1BvaW50ZXJFdmVudCYmIWEuUG9pbnRlckV2ZW50JiYoWGE9Ik1TUG9pbnRlckRvd24iLFlhPSJNU1BvaW50ZXJNb3ZlIE1TUG9pbnRlclVwIE1TUG9pbnRlckNhbmNlbCIpLGkoTSx4LHtoYW5kbGVyOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuc3RvcmUsYz0hMSxkPWEudHlwZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoIm1zIiwiIiksZT1WYVtkXSxmPVdhW2EucG9pbnRlclR5cGVdfHxhLnBvaW50ZXJUeXBlLGc9Zj09emEsaD1yKGIsYS5wb2ludGVySWQsInBvaW50ZXJJZCIpO2UmRWEmJigwPT09YS5idXR0b258fGcpPzA+aCYmKGIucHVzaChhKSxoPWIubGVuZ3RoLTEpOmUmKEdhfEhhKSYmKGM9ITApLDA+aHx8KGJbaF09YSx0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlcixlLHtwb2ludGVyczpiLGNoYW5nZWRQb2ludGVyczpbYV0scG9pbnRlclR5cGU6ZixzcmNFdmVudDphfSksYyYmYi5zcGxpY2UoaCwxKSl9fSk7dmFyIFphPXt0b3VjaHN0YXJ0OkVhLHRvdWNobW92ZTpGYSx0b3VjaGVuZDpHYSx0b3VjaGNhbmNlbDpIYX0sJGE9InRvdWNoc3RhcnQiLF9hPSJ0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbCI7aShOLHgse2hhbmRsZXI6ZnVuY3Rpb24oYSl7dmFyIGI9WmFbYS50eXBlXTtpZihiPT09RWEmJih0aGlzLnN0YXJ0ZWQ9ITApLHRoaXMuc3RhcnRlZCl7dmFyIGM9Ty5jYWxsKHRoaXMsYSxiKTtiJihHYXxIYSkmJmNbMF0ubGVuZ3RoLWNbMV0ubGVuZ3RoPT09MCYmKHRoaXMuc3RhcnRlZD0hMSksdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsYix7cG9pbnRlcnM6Y1swXSxjaGFuZ2VkUG9pbnRlcnM6Y1sxXSxwb2ludGVyVHlwZTp6YSxzcmNFdmVudDphfSl9fX0pO3ZhciBhYj17dG91Y2hzdGFydDpFYSx0b3VjaG1vdmU6RmEsdG91Y2hlbmQ6R2EsdG91Y2hjYW5jZWw6SGF9LGJiPSJ0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbCI7aShQLHgse2hhbmRsZXI6ZnVuY3Rpb24oYSl7dmFyIGI9YWJbYS50eXBlXSxjPVEuY2FsbCh0aGlzLGEsYik7YyYmdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsYix7cG9pbnRlcnM6Y1swXSxjaGFuZ2VkUG9pbnRlcnM6Y1sxXSxwb2ludGVyVHlwZTp6YSxzcmNFdmVudDphfSl9fSk7dmFyIGNiPTI1MDAsZGI9MjU7aShSLHgse2hhbmRsZXI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWMucG9pbnRlclR5cGU9PXphLGU9Yy5wb2ludGVyVHlwZT09QmE7aWYoIShlJiZjLnNvdXJjZUNhcGFiaWxpdGllcyYmYy5zb3VyY2VDYXBhYmlsaXRpZXMuZmlyZXNUb3VjaEV2ZW50cykpe2lmKGQpUy5jYWxsKHRoaXMsYixjKTtlbHNlIGlmKGUmJlUuY2FsbCh0aGlzLGMpKXJldHVybjt0aGlzLmNhbGxiYWNrKGEsYixjKX19LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLnRvdWNoLmRlc3Ryb3koKSx0aGlzLm1vdXNlLmRlc3Ryb3koKX19KTt2YXIgZWI9dShuYS5zdHlsZSwidG91Y2hBY3Rpb24iKSxmYj1lYiE9PWQsZ2I9ImNvbXB1dGUiLGhiPSJhdXRvIixpYj0ibWFuaXB1bGF0aW9uIixqYj0ibm9uZSIsa2I9InBhbi14IixsYj0icGFuLXkiLG1iPVgoKTtWLnByb3RvdHlwZT17c2V0OmZ1bmN0aW9uKGEpe2E9PWdiJiYoYT10aGlzLmNvbXB1dGUoKSksZmImJnRoaXMubWFuYWdlci5lbGVtZW50LnN0eWxlJiZtYlthXSYmKHRoaXMubWFuYWdlci5lbGVtZW50LnN0eWxlW2ViXT1hKSx0aGlzLmFjdGlvbnM9YS50b0xvd2VyQ2FzZSgpLnRyaW0oKX0sdXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5zZXQodGhpcy5tYW5hZ2VyLm9wdGlvbnMudG91Y2hBY3Rpb24pfSxjb21wdXRlOmZ1bmN0aW9uKCl7dmFyIGE9W107cmV0dXJuIGcodGhpcy5tYW5hZ2VyLnJlY29nbml6ZXJzLGZ1bmN0aW9uKGIpe2soYi5vcHRpb25zLmVuYWJsZSxbYl0pJiYoYT1hLmNvbmNhdChiLmdldFRvdWNoQWN0aW9uKCkpKX0pLFcoYS5qb2luKCIgIikpfSxwcmV2ZW50RGVmYXVsdHM6ZnVuY3Rpb24oYSl7dmFyIGI9YS5zcmNFdmVudCxjPWEub2Zmc2V0RGlyZWN0aW9uO2lmKHRoaXMubWFuYWdlci5zZXNzaW9uLnByZXZlbnRlZClyZXR1cm4gdm9pZCBiLnByZXZlbnREZWZhdWx0KCk7dmFyIGQ9dGhpcy5hY3Rpb25zLGU9cChkLGpiKSYmIW1iW2piXSxmPXAoZCxsYikmJiFtYltsYl0sZz1wKGQsa2IpJiYhbWJba2JdO2lmKGUpe3ZhciBoPTE9PT1hLnBvaW50ZXJzLmxlbmd0aCxpPWEuZGlzdGFuY2U8MixqPWEuZGVsdGFUaW1lPDI1MDtpZihoJiZpJiZqKXJldHVybn1yZXR1cm4gZyYmZj92b2lkIDA6ZXx8ZiYmYyZOYXx8ZyYmYyZPYT90aGlzLnByZXZlbnRTcmMoYik6dm9pZCAwfSxwcmV2ZW50U3JjOmZ1bmN0aW9uKGEpe3RoaXMubWFuYWdlci5zZXNzaW9uLnByZXZlbnRlZD0hMCxhLnByZXZlbnREZWZhdWx0KCl9fTt2YXIgbmI9MSxvYj0yLHBiPTQscWI9OCxyYj1xYixzYj0xNix0Yj0zMjtZLnByb3RvdHlwZT17ZGVmYXVsdHM6e30sc2V0OmZ1bmN0aW9uKGEpe3JldHVybiBsYSh0aGlzLm9wdGlvbnMsYSksdGhpcy5tYW5hZ2VyJiZ0aGlzLm1hbmFnZXIudG91Y2hBY3Rpb24udXBkYXRlKCksdGhpc30scmVjb2duaXplV2l0aDpmdW5jdGlvbihhKXtpZihmKGEsInJlY29nbml6ZVdpdGgiLHRoaXMpKXJldHVybiB0aGlzO3ZhciBiPXRoaXMuc2ltdWx0YW5lb3VzO3JldHVybiBhPV8oYSx0aGlzKSxiW2EuaWRdfHwoYlthLmlkXT1hLGEucmVjb2duaXplV2l0aCh0aGlzKSksdGhpc30sZHJvcFJlY29nbml6ZVdpdGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGYoYSwiZHJvcFJlY29nbml6ZVdpdGgiLHRoaXMpP3RoaXM6KGE9XyhhLHRoaXMpLGRlbGV0ZSB0aGlzLnNpbXVsdGFuZW91c1thLmlkXSx0aGlzKX0scmVxdWlyZUZhaWx1cmU6ZnVuY3Rpb24oYSl7aWYoZihhLCJyZXF1aXJlRmFpbHVyZSIsdGhpcykpcmV0dXJuIHRoaXM7dmFyIGI9dGhpcy5yZXF1aXJlRmFpbDtyZXR1cm4gYT1fKGEsdGhpcyksLTE9PT1yKGIsYSkmJihiLnB1c2goYSksYS5yZXF1aXJlRmFpbHVyZSh0aGlzKSksdGhpc30sZHJvcFJlcXVpcmVGYWlsdXJlOmZ1bmN0aW9uKGEpe2lmKGYoYSwiZHJvcFJlcXVpcmVGYWlsdXJlIix0aGlzKSlyZXR1cm4gdGhpczthPV8oYSx0aGlzKTt2YXIgYj1yKHRoaXMucmVxdWlyZUZhaWwsYSk7cmV0dXJuIGI+LTEmJnRoaXMucmVxdWlyZUZhaWwuc3BsaWNlKGIsMSksdGhpc30saGFzUmVxdWlyZUZhaWx1cmVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVxdWlyZUZhaWwubGVuZ3RoPjB9LGNhblJlY29nbml6ZVdpdGg6ZnVuY3Rpb24oYSl7cmV0dXJuISF0aGlzLnNpbXVsdGFuZW91c1thLmlkXX0sZW1pdDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIpe2MubWFuYWdlci5lbWl0KGIsYSl9dmFyIGM9dGhpcyxkPXRoaXMuc3RhdGU7cWI+ZCYmYihjLm9wdGlvbnMuZXZlbnQrWihkKSksYihjLm9wdGlvbnMuZXZlbnQpLGEuYWRkaXRpb25hbEV2ZW50JiZiKGEuYWRkaXRpb25hbEV2ZW50KSxkPj1xYiYmYihjLm9wdGlvbnMuZXZlbnQrWihkKSl9LHRyeUVtaXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuY2FuRW1pdCgpP3RoaXMuZW1pdChhKTp2b2lkKHRoaXMuc3RhdGU9dGIpfSxjYW5FbWl0OmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLnJlcXVpcmVGYWlsLmxlbmd0aDspe2lmKCEodGhpcy5yZXF1aXJlRmFpbFthXS5zdGF0ZSYodGJ8bmIpKSlyZXR1cm4hMTthKyt9cmV0dXJuITB9LHJlY29nbml6ZTpmdW5jdGlvbihhKXt2YXIgYj1sYSh7fSxhKTtyZXR1cm4gayh0aGlzLm9wdGlvbnMuZW5hYmxlLFt0aGlzLGJdKT8odGhpcy5zdGF0ZSYocmJ8c2J8dGIpJiYodGhpcy5zdGF0ZT1uYiksdGhpcy5zdGF0ZT10aGlzLnByb2Nlc3MoYiksdm9pZCh0aGlzLnN0YXRlJihvYnxwYnxxYnxzYikmJnRoaXMudHJ5RW1pdChiKSkpOih0aGlzLnJlc2V0KCksdm9pZCh0aGlzLnN0YXRlPXRiKSl9LHByb2Nlc3M6ZnVuY3Rpb24oYSl7fSxnZXRUb3VjaEFjdGlvbjpmdW5jdGlvbigpe30scmVzZXQ6ZnVuY3Rpb24oKXt9fSxpKGFhLFkse2RlZmF1bHRzOntwb2ludGVyczoxfSxhdHRyVGVzdDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMucG9pbnRlcnM7cmV0dXJuIDA9PT1ifHxhLnBvaW50ZXJzLmxlbmd0aD09PWJ9LHByb2Nlc3M6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5zdGF0ZSxjPWEuZXZlbnRUeXBlLGQ9YiYob2J8cGIpLGU9dGhpcy5hdHRyVGVzdChhKTtyZXR1cm4gZCYmKGMmSGF8fCFlKT9ifHNiOmR8fGU/YyZHYT9ifHFiOmImb2I/YnxwYjpvYjp0Yn19KSxpKGJhLGFhLHtkZWZhdWx0czp7ZXZlbnQ6InBhbiIsdGhyZXNob2xkOjEwLHBvaW50ZXJzOjEsZGlyZWN0aW9uOlBhfSxnZXRUb3VjaEFjdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucy5kaXJlY3Rpb24sYj1bXTtyZXR1cm4gYSZOYSYmYi5wdXNoKGxiKSxhJk9hJiZiLnB1c2goa2IpLGJ9LGRpcmVjdGlvblRlc3Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLGM9ITAsZD1hLmRpc3RhbmNlLGU9YS5kaXJlY3Rpb24sZj1hLmRlbHRhWCxnPWEuZGVsdGFZO3JldHVybiBlJmIuZGlyZWN0aW9ufHwoYi5kaXJlY3Rpb24mTmE/KGU9MD09PWY/SWE6MD5mP0phOkthLGM9ZiE9dGhpcy5wWCxkPU1hdGguYWJzKGEuZGVsdGFYKSk6KGU9MD09PWc/SWE6MD5nP0xhOk1hLGM9ZyE9dGhpcy5wWSxkPU1hdGguYWJzKGEuZGVsdGFZKSkpLGEuZGlyZWN0aW9uPWUsYyYmZD5iLnRocmVzaG9sZCYmZSZiLmRpcmVjdGlvbn0sYXR0clRlc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGFhLnByb3RvdHlwZS5hdHRyVGVzdC5jYWxsKHRoaXMsYSkmJih0aGlzLnN0YXRlJm9ifHwhKHRoaXMuc3RhdGUmb2IpJiZ0aGlzLmRpcmVjdGlvblRlc3QoYSkpfSxlbWl0OmZ1bmN0aW9uKGEpe3RoaXMucFg9YS5kZWx0YVgsdGhpcy5wWT1hLmRlbHRhWTt2YXIgYj0kKGEuZGlyZWN0aW9uKTtiJiYoYS5hZGRpdGlvbmFsRXZlbnQ9dGhpcy5vcHRpb25zLmV2ZW50K2IpLHRoaXMuX3N1cGVyLmVtaXQuY2FsbCh0aGlzLGEpfX0pLGkoY2EsYWEse2RlZmF1bHRzOntldmVudDoicGluY2giLHRocmVzaG9sZDowLHBvaW50ZXJzOjJ9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuW2piXX0sYXR0clRlc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3N1cGVyLmF0dHJUZXN0LmNhbGwodGhpcyxhKSYmKE1hdGguYWJzKGEuc2NhbGUtMSk+dGhpcy5vcHRpb25zLnRocmVzaG9sZHx8dGhpcy5zdGF0ZSZvYil9LGVtaXQ6ZnVuY3Rpb24oYSl7aWYoMSE9PWEuc2NhbGUpe3ZhciBiPWEuc2NhbGU8MT8iaW4iOiJvdXQiO2EuYWRkaXRpb25hbEV2ZW50PXRoaXMub3B0aW9ucy5ldmVudCtifXRoaXMuX3N1cGVyLmVtaXQuY2FsbCh0aGlzLGEpfX0pLGkoZGEsWSx7ZGVmYXVsdHM6e2V2ZW50OiJwcmVzcyIscG9pbnRlcnM6MSx0aW1lOjI1MSx0aHJlc2hvbGQ6OX0sZ2V0VG91Y2hBY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm5baGJdfSxwcm9jZXNzOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucyxjPWEucG9pbnRlcnMubGVuZ3RoPT09Yi5wb2ludGVycyxkPWEuZGlzdGFuY2U8Yi50aHJlc2hvbGQsZj1hLmRlbHRhVGltZT5iLnRpbWU7aWYodGhpcy5faW5wdXQ9YSwhZHx8IWN8fGEuZXZlbnRUeXBlJihHYXxIYSkmJiFmKXRoaXMucmVzZXQoKTtlbHNlIGlmKGEuZXZlbnRUeXBlJkVhKXRoaXMucmVzZXQoKSx0aGlzLl90aW1lcj1lKGZ1bmN0aW9uKCl7dGhpcy5zdGF0ZT1yYix0aGlzLnRyeUVtaXQoKX0sYi50aW1lLHRoaXMpO2Vsc2UgaWYoYS5ldmVudFR5cGUmR2EpcmV0dXJuIHJiO3JldHVybiB0Yn0scmVzZXQ6ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpfSxlbWl0OmZ1bmN0aW9uKGEpe3RoaXMuc3RhdGU9PT1yYiYmKGEmJmEuZXZlbnRUeXBlJkdhP3RoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCsidXAiLGEpOih0aGlzLl9pbnB1dC50aW1lU3RhbXA9cmEoKSx0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQsdGhpcy5faW5wdXQpKSl9fSksaShlYSxhYSx7ZGVmYXVsdHM6e2V2ZW50OiJyb3RhdGUiLHRocmVzaG9sZDowLHBvaW50ZXJzOjJ9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuW2piXX0sYXR0clRlc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3N1cGVyLmF0dHJUZXN0LmNhbGwodGhpcyxhKSYmKE1hdGguYWJzKGEucm90YXRpb24pPnRoaXMub3B0aW9ucy50aHJlc2hvbGR8fHRoaXMuc3RhdGUmb2IpfX0pLGkoZmEsYWEse2RlZmF1bHRzOntldmVudDoic3dpcGUiLHRocmVzaG9sZDoxMCx2ZWxvY2l0eTouMyxkaXJlY3Rpb246TmF8T2EscG9pbnRlcnM6MX0sZ2V0VG91Y2hBY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4gYmEucHJvdG90eXBlLmdldFRvdWNoQWN0aW9uLmNhbGwodGhpcyl9LGF0dHJUZXN0OmZ1bmN0aW9uKGEpe3ZhciBiLGM9dGhpcy5vcHRpb25zLmRpcmVjdGlvbjtyZXR1cm4gYyYoTmF8T2EpP2I9YS5vdmVyYWxsVmVsb2NpdHk6YyZOYT9iPWEub3ZlcmFsbFZlbG9jaXR5WDpjJk9hJiYoYj1hLm92ZXJhbGxWZWxvY2l0eVkpLHRoaXMuX3N1cGVyLmF0dHJUZXN0LmNhbGwodGhpcyxhKSYmYyZhLm9mZnNldERpcmVjdGlvbiYmYS5kaXN0YW5jZT50aGlzLm9wdGlvbnMudGhyZXNob2xkJiZhLm1heFBvaW50ZXJzPT10aGlzLm9wdGlvbnMucG9pbnRlcnMmJnFhKGIpPnRoaXMub3B0aW9ucy52ZWxvY2l0eSYmYS5ldmVudFR5cGUmR2F9LGVtaXQ6ZnVuY3Rpb24oYSl7dmFyIGI9JChhLm9mZnNldERpcmVjdGlvbik7YiYmdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50K2IsYSksdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LGEpfX0pLGkoZ2EsWSx7ZGVmYXVsdHM6e2V2ZW50OiJ0YXAiLHBvaW50ZXJzOjEsdGFwczoxLGludGVydmFsOjMwMCx0aW1lOjI1MCx0aHJlc2hvbGQ6OSxwb3NUaHJlc2hvbGQ6MTB9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuW2liXX0scHJvY2VzczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMsYz1hLnBvaW50ZXJzLmxlbmd0aD09PWIucG9pbnRlcnMsZD1hLmRpc3RhbmNlPGIudGhyZXNob2xkLGY9YS5kZWx0YVRpbWU8Yi50aW1lO2lmKHRoaXMucmVzZXQoKSxhLmV2ZW50VHlwZSZFYSYmMD09PXRoaXMuY291bnQpcmV0dXJuIHRoaXMuZmFpbFRpbWVvdXQoKTtpZihkJiZmJiZjKXtpZihhLmV2ZW50VHlwZSE9R2EpcmV0dXJuIHRoaXMuZmFpbFRpbWVvdXQoKTt2YXIgZz10aGlzLnBUaW1lP2EudGltZVN0YW1wLXRoaXMucFRpbWU8Yi5pbnRlcnZhbDohMCxoPSF0aGlzLnBDZW50ZXJ8fEgodGhpcy5wQ2VudGVyLGEuY2VudGVyKTxiLnBvc1RocmVzaG9sZDt0aGlzLnBUaW1lPWEudGltZVN0YW1wLHRoaXMucENlbnRlcj1hLmNlbnRlcixoJiZnP3RoaXMuY291bnQrPTE6dGhpcy5jb3VudD0xLHRoaXMuX2lucHV0PWE7dmFyIGk9dGhpcy5jb3VudCViLnRhcHM7aWYoMD09PWkpcmV0dXJuIHRoaXMuaGFzUmVxdWlyZUZhaWx1cmVzKCk/KHRoaXMuX3RpbWVyPWUoZnVuY3Rpb24oKXt0aGlzLnN0YXRlPXJiLHRoaXMudHJ5RW1pdCgpfSxiLmludGVydmFsLHRoaXMpLG9iKTpyYn1yZXR1cm4gdGJ9LGZhaWxUaW1lb3V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RpbWVyPWUoZnVuY3Rpb24oKXt0aGlzLnN0YXRlPXRifSx0aGlzLm9wdGlvbnMuaW50ZXJ2YWwsdGhpcyksdGJ9LHJlc2V0OmZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKX0sZW1pdDpmdW5jdGlvbigpe3RoaXMuc3RhdGU9PXJiJiYodGhpcy5faW5wdXQudGFwQ291bnQ9dGhpcy5jb3VudCx0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQsdGhpcy5faW5wdXQpKX19KSxoYS5WRVJTSU9OPSIyLjAuOCIsaGEuZGVmYXVsdHM9e2RvbUV2ZW50czohMSx0b3VjaEFjdGlvbjpnYixlbmFibGU6ITAsaW5wdXRUYXJnZXQ6bnVsbCxpbnB1dENsYXNzOm51bGwscHJlc2V0OltbZWEse2VuYWJsZTohMX1dLFtjYSx7ZW5hYmxlOiExfSxbInJvdGF0ZSJdXSxbZmEse2RpcmVjdGlvbjpOYX1dLFtiYSx7ZGlyZWN0aW9uOk5hfSxbInN3aXBlIl1dLFtnYV0sW2dhLHtldmVudDoiZG91YmxldGFwIix0YXBzOjJ9LFsidGFwIl1dLFtkYV1dLGNzc1Byb3BzOnt1c2VyU2VsZWN0OiJub25lIix0b3VjaFNlbGVjdDoibm9uZSIsdG91Y2hDYWxsb3V0OiJub25lIixjb250ZW50Wm9vbWluZzoibm9uZSIsdXNlckRyYWc6Im5vbmUiLHRhcEhpZ2hsaWdodENvbG9yOiJyZ2JhKDAsMCwwLDApIn19O3ZhciB1Yj0xLHZiPTI7aWEucHJvdG90eXBlPXtzZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGxhKHRoaXMub3B0aW9ucyxhKSxhLnRvdWNoQWN0aW9uJiZ0aGlzLnRvdWNoQWN0aW9uLnVwZGF0ZSgpLGEuaW5wdXRUYXJnZXQmJih0aGlzLmlucHV0LmRlc3Ryb3koKSx0aGlzLmlucHV0LnRhcmdldD1hLmlucHV0VGFyZ2V0LHRoaXMuaW5wdXQuaW5pdCgpKSx0aGlzfSxzdG9wOmZ1bmN0aW9uKGEpe3RoaXMuc2Vzc2lvbi5zdG9wcGVkPWE/dmI6dWJ9LHJlY29nbml6ZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnNlc3Npb247aWYoIWIuc3RvcHBlZCl7dGhpcy50b3VjaEFjdGlvbi5wcmV2ZW50RGVmYXVsdHMoYSk7dmFyIGMsZD10aGlzLnJlY29nbml6ZXJzLGU9Yi5jdXJSZWNvZ25pemVyOyghZXx8ZSYmZS5zdGF0ZSZyYikmJihlPWIuY3VyUmVjb2duaXplcj1udWxsKTtmb3IodmFyIGY9MDtmPGQubGVuZ3RoOyljPWRbZl0sYi5zdG9wcGVkPT09dmJ8fGUmJmMhPWUmJiFjLmNhblJlY29nbml6ZVdpdGgoZSk/Yy5yZXNldCgpOmMucmVjb2duaXplKGEpLCFlJiZjLnN0YXRlJihvYnxwYnxxYikmJihlPWIuY3VyUmVjb2duaXplcj1jKSxmKyt9fSxnZXQ6ZnVuY3Rpb24oYSl7aWYoYSBpbnN0YW5jZW9mIFkpcmV0dXJuIGE7Zm9yKHZhciBiPXRoaXMucmVjb2duaXplcnMsYz0wO2M8Yi5sZW5ndGg7YysrKWlmKGJbY10ub3B0aW9ucy5ldmVudD09YSlyZXR1cm4gYltjXTtyZXR1cm4gbnVsbH0sYWRkOmZ1bmN0aW9uKGEpe2lmKGYoYSwiYWRkIix0aGlzKSlyZXR1cm4gdGhpczt2YXIgYj10aGlzLmdldChhLm9wdGlvbnMuZXZlbnQpO3JldHVybiBiJiZ0aGlzLnJlbW92ZShiKSx0aGlzLnJlY29nbml6ZXJzLnB1c2goYSksYS5tYW5hZ2VyPXRoaXMsdGhpcy50b3VjaEFjdGlvbi51cGRhdGUoKSxhfSxyZW1vdmU6ZnVuY3Rpb24oYSl7aWYoZihhLCJyZW1vdmUiLHRoaXMpKXJldHVybiB0aGlzO2lmKGE9dGhpcy5nZXQoYSkpe3ZhciBiPXRoaXMucmVjb2duaXplcnMsYz1yKGIsYSk7LTEhPT1jJiYoYi5zcGxpY2UoYywxKSx0aGlzLnRvdWNoQWN0aW9uLnVwZGF0ZSgpKX1yZXR1cm4gdGhpc30sb246ZnVuY3Rpb24oYSxiKXtpZihhIT09ZCYmYiE9PWQpe3ZhciBjPXRoaXMuaGFuZGxlcnM7cmV0dXJuIGcocShhKSxmdW5jdGlvbihhKXtjW2FdPWNbYV18fFtdLGNbYV0ucHVzaChiKX0pLHRoaXN9fSxvZmY6ZnVuY3Rpb24oYSxiKXtpZihhIT09ZCl7dmFyIGM9dGhpcy5oYW5kbGVycztyZXR1cm4gZyhxKGEpLGZ1bmN0aW9uKGEpe2I/Y1thXSYmY1thXS5zcGxpY2UocihjW2FdLGIpLDEpOmRlbGV0ZSBjW2FdfSksdGhpc319LGVtaXQ6ZnVuY3Rpb24oYSxiKXt0aGlzLm9wdGlvbnMuZG9tRXZlbnRzJiZrYShhLGIpO3ZhciBjPXRoaXMuaGFuZGxlcnNbYV0mJnRoaXMuaGFuZGxlcnNbYV0uc2xpY2UoKTtpZihjJiZjLmxlbmd0aCl7Yi50eXBlPWEsYi5wcmV2ZW50RGVmYXVsdD1mdW5jdGlvbigpe2Iuc3JjRXZlbnQucHJldmVudERlZmF1bHQoKX07Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDspY1tkXShiKSxkKyt9fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50JiZqYSh0aGlzLCExKSx0aGlzLmhhbmRsZXJzPXt9LHRoaXMuc2Vzc2lvbj17fSx0aGlzLmlucHV0LmRlc3Ryb3koKSx0aGlzLmVsZW1lbnQ9bnVsbH19LGxhKGhhLHtJTlBVVF9TVEFSVDpFYSxJTlBVVF9NT1ZFOkZhLElOUFVUX0VORDpHYSxJTlBVVF9DQU5DRUw6SGEsU1RBVEVfUE9TU0lCTEU6bmIsU1RBVEVfQkVHQU46b2IsU1RBVEVfQ0hBTkdFRDpwYixTVEFURV9FTkRFRDpxYixTVEFURV9SRUNPR05JWkVEOnJiLFNUQVRFX0NBTkNFTExFRDpzYixTVEFURV9GQUlMRUQ6dGIsRElSRUNUSU9OX05PTkU6SWEsRElSRUNUSU9OX0xFRlQ6SmEsRElSRUNUSU9OX1JJR0hUOkthLERJUkVDVElPTl9VUDpMYSxESVJFQ1RJT05fRE9XTjpNYSxESVJFQ1RJT05fSE9SSVpPTlRBTDpOYSxESVJFQ1RJT05fVkVSVElDQUw6T2EsRElSRUNUSU9OX0FMTDpQYSxNYW5hZ2VyOmlhLElucHV0OngsVG91Y2hBY3Rpb246VixUb3VjaElucHV0OlAsTW91c2VJbnB1dDpMLFBvaW50ZXJFdmVudElucHV0Ok0sVG91Y2hNb3VzZUlucHV0OlIsU2luZ2xlVG91Y2hJbnB1dDpOLFJlY29nbml6ZXI6WSxBdHRyUmVjb2duaXplcjphYSxUYXA6Z2EsUGFuOmJhLFN3aXBlOmZhLFBpbmNoOmNhLFJvdGF0ZTplYSxQcmVzczpkYSxvbjptLG9mZjpuLGVhY2g6ZyxtZXJnZTp0YSxleHRlbmQ6c2EsYXNzaWduOmxhLGluaGVyaXQ6aSxiaW5kRm46aixwcmVmaXhlZDp1fSk7dmFyIHdiPSJ1bmRlZmluZWQiIT10eXBlb2YgYT9hOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnt9O3diLkhhbW1lcj1oYSwiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShmdW5jdGlvbigpe3JldHVybiBoYX0pOiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1oYTphW2NdPWhhfSh3aW5kb3csZG9jdW1lbnQsIkhhbW1lciIpOwpmdW5jdGlvbiB0X3BvcHVwX190cmFwRm9jdXModCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCdhLCBidXR0b24sIGlucHV0Om5vdChbdHlwZT0iaGlkZGVuIl0pOm5vdCguanMtZm9ybS1zcGVjLWNvbW1lbnRzKSwgc2VsZWN0LCB0ZXh0YXJlYSwgZW1iZWQsIHZpZGVvLCBpZnJhbWUsIFt0YWJpbmRleD0iMCJdJyksbz1lWzBdLHA9ZVtlLmxlbmd0aC0xXTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwoZnVuY3Rpb24odCl7aWYoZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoInQtYm9keV9wb3B1cHNob3dlZCIpKXt2YXIgZT0iVGFiIj09PXQua2V5fHw5PT09dC5rZXlDb2RlLG47KGV8fGUmJnQuc2hpZnRLZXkpJiYodC5zaGlmdEtleSYmZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoInQtcG9wdXBfc2hvdyIpJiZwLmZvY3VzKCksIlRhYiIhPT10LmtleXx8dC5zaGlmdEtleXx8ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9PXB8fCh0LnByZXZlbnREZWZhdWx0KCksby5mb2N1cygpKSwiVGFiIj09PXQua2V5JiZ0LnNoaWZ0S2V5JiZkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09byYmKHQucHJldmVudERlZmF1bHQoKSxwLmZvY3VzKCkpKX19KSl9ZnVuY3Rpb24gdF9wb3B1cF9fYWRkQXR0cmlidXRlc0ZvckFjY2Vzc2liaWxpdHkodCl7dmFyIGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYVtocmVmPSInK3QrJyJdJyk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLChmdW5jdGlvbih0KXt0JiYodC5zZXRBdHRyaWJ1dGUoInJvbGUiLCJidXR0b24iKSx0LnNldEF0dHJpYnV0ZSgiYXJpYS1oYXNwb3B1cCIsImRpYWxvZyIpKX0pKX1mdW5jdGlvbiB0X3BvcHVwX19yZXNpemVQb3B1cCh0KXt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIit0KTtpZihlKXt2YXIgbz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXBvcHVwX19jb250YWluZXIiKTtpZihvKXt2YXIgcD1nZXRDb21wdXRlZFN0eWxlKG8sbnVsbCksbj1wYXJzZUludChwLnBhZGRpbmdUb3ApfHwwLHI9cGFyc2VJbnQocC5wYWRkaW5nQm90dG9tKXx8MCxzPW8uY2xpZW50SGVpZ2h0LShuK3IpLGM9MTIwLHU9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtcGFyZW50dHBsaWQiKXx8ZS5nZXRBdHRyaWJ1dGUoImRhdGEtcmVjb3JkLXR5cGUiKSxhLGk9IjEwOTMiPT09dXx8IjEyMSI9PT11JiZlLnF1ZXJ5U2VsZWN0b3IoIi50MTA5MyIpOyIzNjQiIT09dSYmIjM2NSIhPT11fHwoYz0zMCksKCI4NjgiPT09dXx8IjMzMSI9PT11fHwiMzU4Ij09PXV8fCIxMDEzIj09PXV8fCI3NDYiPT09dXx8aSkmJihjPTApLHM+d2luZG93LmlubmVySGVpZ2h0LWM/by5jbGFzc0xpc3QuYWRkKCJ0LXBvcHVwX19jb250YWluZXItc3RhdGljIik6by5jbGFzc0xpc3QucmVtb3ZlKCJ0LXBvcHVwX19jb250YWluZXItc3RhdGljIil9fX1mdW5jdGlvbiB0X3BvcHVwX19zaG93UG9wdXAodCl7dCYmKHQuc3R5bGUuZGlzcGxheT0iYmxvY2siKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuZm9jdXMoKTt2YXIgZT10P3QucXVlcnlTZWxlY3RvcigiLnQtcG9wdXBfX2NvbnRhaW5lciIpOm51bGw7ZSYmZS5jbGFzc0xpc3QuYWRkKCJ0LXBvcHVwX19jb250YWluZXItYW5pbWF0ZWQiKSx0JiZ0LmNsYXNzTGlzdC5hZGQoInQtcG9wdXBfc2hvdyIpLHRfb25GdW5jTG9hZCgidF9wb3B1cF9fdHJhcEZvY3VzIiwoZnVuY3Rpb24oKXt0X3BvcHVwX190cmFwRm9jdXModCl9KSl9KSw1MCl9ZnVuY3Rpb24gdF9wb3B1cF9fY2xvc2VQb3B1cCh0KXt2YXIgZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1wb3B1cC50LXBvcHVwX3Nob3ciKSxvPXQucXVlcnlTZWxlY3RvcigiLnQtcG9wdXBfX2NvbnRhaW5lciIpO2lmKHQ9PT1lKXt2YXIgcD1kb2N1bWVudC5ib2R5O3AuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInBvcHVwSGlkZGVuIikpLHAuY2xhc3NMaXN0LnJlbW92ZSgidC1ib2R5X3BvcHVwc2hvd2VkIikscC5jbGFzc0xpc3QucmVtb3ZlKCJ0LXF1aXpfX2JvZHlfcG9wdXBzaG93ZWQiKX10LmNsYXNzTGlzdC5yZW1vdmUoInQtcG9wdXBfc2hvdyIpLG8uc3R5bGUucmVtb3ZlUHJvcGVydHkoInRyYW5zaXRpb24iKSxvLmNsYXNzTGlzdC5yZW1vdmUoInQtcG9wdXBfX2NvbnRhaW5lcl9uby10cmFuc2Zvcm0iKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3ZhciB0O2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXBvcHVwOm5vdCgudC1wb3B1cF9zaG93KSIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3Quc3R5bGUuZGlzcGxheT0ibm9uZSJ9KSl9KSwzMDApLHRfcG9wdXBfX2FkZEZvY3VzT25UcmlnZ2VyQnV0dG9uKCl9ZnVuY3Rpb24gdF9wb3B1cF9fYWRkQ2xhc3NPblRyaWdnZXJCdXR0b24odCxlKXt2YXIgbz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC1wb3B1cF9fdHJpZ2dlcmVkLWJ0biIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobywoZnVuY3Rpb24odCl7dC5jbGFzc0xpc3QucmVtb3ZlKCJ0LXBvcHVwX190cmlnZ2VyZWQtYnRuIil9KSksdC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwoZnVuY3Rpb24odCl7aWYoMTM9PT10LmtleUNvZGUpe3ZhciBvPXQudGFyZ2V0LHA9ISFvLmNsb3Nlc3QoJ2FbaHJlZj0iJytlKyciXScpJiZvO2lmKCFwKXJldHVybjt3aW5kb3cuaXNNb2JpbGV8fHAuY2xhc3NMaXN0LmFkZCgidC1wb3B1cF9fdHJpZ2dlcmVkLWJ0biIpfX0pKX1mdW5jdGlvbiB0X3BvcHVwX19hZGRGb2N1c09uVHJpZ2dlckJ1dHRvbigpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXBvcHVwX190cmlnZ2VyZWQtYnRuIik7dCYmIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0NzI0X19vcGVuZXIiKSYmKHQuZm9jdXMoKSx0LmNsYXNzTGlzdC5yZW1vdmUoInQtcG9wdXBfX3RyaWdnZXJlZC1idG4iKSl9RWxlbWVudC5wcm90b3R5cGUubWF0Y2hlc3x8KEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXM9RWxlbWVudC5wcm90b3R5cGUubWF0Y2hlc1NlbGVjdG9yfHxFbGVtZW50LnByb3RvdHlwZS5tc01hdGNoZXNTZWxlY3Rvcnx8RWxlbWVudC5wcm90b3R5cGUubW96TWF0Y2hlc1NlbGVjdG9yfHxFbGVtZW50LnByb3RvdHlwZS53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fEVsZW1lbnQucHJvdG90eXBlLm9NYXRjaGVzU2VsZWN0b3IpLEVsZW1lbnQucHJvdG90eXBlLmNsb3Nlc3R8fChFbGVtZW50LnByb3RvdHlwZS5jbG9zZXN0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzO2UmJjE9PT1lLm5vZGVUeXBlOyl7aWYoRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcy5jYWxsKGUsdCkpcmV0dXJuIGU7ZT1lLnBhcmVudEVsZW1lbnR8fGUucGFyZW50Tm9kZX1yZXR1cm4gbnVsbH0pOwoKZnVuY3Rpb24gdF9zbGRzSW5pdCh0LGUpe3ZhciBzPXRfc2xkc19fZ2V0UmVjKHQpO2lmKHMpe3ZhciByPXMucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpLGk7aWYocilpZighci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWluaXRpYWxpemVkIikpe3ZhciBhPXIuY2xhc3NMaXN0LmNvbnRhaW5zKCJqcy1mZWVkLWNvbnRhaW5lciIpLGw9cy5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtOm5vdCgudC1zbGRzX19pdGVtX2R1bW15KSIpO2lmKGwpe2UmJmUucmFuZG9tU29ydCYmKGw9dF9zbGRzX3JhbmRvbVNvcnRFbGVtZW50cyhsKSk7dmFyIGQ9bC5sZW5ndGgsbz1sWzBdLG49bFtsLmxlbmd0aC0xXSxjPXdpbmRvdy5pbm5lcldpZHRoLF89cGFyc2VJbnQoci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIpLDEwKXx8MCx1PXIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci13aXRoLWN5Y2xlIikscD1wYXJzZUZsb2F0KHIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10cmFuc2l0aW9uIikpLGY7aWYoQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChsLChmdW5jdGlvbih0LGUpe3Quc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWluZGV4IixlKzEpfSkpLCJ0cnVlIiE9PXIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wIikpe3B8fDA9PT1wfHwocD0zMDApLGlzTmFOKHApJiZyLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdHJhbnNpdGlvbiIsIjMwMCIpLHIuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNsZHNfYW5pbWF0ZWQtZmFzdCIpfHxyLmNsYXNzTGlzdC5jb250YWlucygidC1zbGRzX2FuaW1hdGVkLXNsb3ciKXx8ci5jbGFzc0xpc3QuY29udGFpbnMoInQtc2xkc19hbmltYXRlZC1ub25lIil8fHIuY2xhc3NMaXN0LmFkZCgidC1zbGRzX2FuaW1hdGVkLWZhc3QiKTt2YXIgbT1fO3Rfc2xkc19zZXRJdGVtc0luUm93KHQpLHRfc2xkc19jaGFuZ2VJbWFnZVVybCh0KTt2YXIgeT04PT09ZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHw5PT09ZG9jdW1lbnQuZG9jdW1lbnRNb2RlO3kmJihyLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19hbmltYXRlZC1mYXN0Iiksci5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfYW5pbWF0ZWQtc2xvdyIpLHIuY2xhc3NMaXN0LmFkZCgidC1zbGRzX2FuaW1hdGVkLW5vbmUiKSxyLmNsYXNzTGlzdC5hZGQoInQtc2xkc19pZSIpLHIuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1jb3JyZWN0LWhlaWdodCIsInRydWUiKSxyLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93IiwxKSksci5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWluaXRpYWxpemVkIiwidHJ1ZSIpLHIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10b3RhbHNsaWRlcyIpfHxyLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdG90YWxzbGlkZXMiLGQpO3ZhciB2PTEsZz1yLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIik7Zz92PXBhcnNlSW50KGcsMTApOnIuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiLDEpLHIuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1jeWNsZSIsIiIpLHIuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1hbmltYXRlZCIsIiIpLGF8fHRfc2xkc19fY3JlYXRlRHVtbWllcyhvLG4sciksXz1wYXJzZUludChyLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93IiksMTApfHwwO3ZhciBiPXMucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19fYXJyb3dfd3JhcHBlci1yaWdodCIpO2IubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsKGZ1bmN0aW9uKHQpe3Quc3R5bGUuZGlzcGxheT0iZmFsc2UiPT09dSYmZC1fPD0wPyJub25lIjoiIn0pKSxhfHx0X3NsZHNfU2xpZGVyV2lkdGgodCksInRydWUiPT1yLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY29ycmVjdC1oZWlnaHQiKSYmdF9zbGRzX1NsaWRlckhlaWdodCh0KSx0X3NsZHNfU2xpZGVyQXJyb3dzSGVpZ2h0KHQpLHRfc2xkc19BY3RpdmVTbGlkZSh0LHYsZCksdF9zbGRzX0FjdGl2ZUNhcHRpb24odCx2LGQpLGE/Yz45NjAmJigidHJ1ZSI9PT1yLmdldEF0dHJpYnV0ZSgiZGF0YS1mZWVkcy1wb3N0cy1sb2FkZWQiKT8odF9zbGRzX19pbml0RmVlZHNTbGlkZXIodCxzLGUpLHRfc2xkc19pbml0U2xpZGVyQ29udHJvbHModCxlKSk6ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZmVlZHNMb2FkUG9zdHMiLChmdW5jdGlvbigpe3Rfc2xkc19faW5pdEZlZWRzU2xpZGVyKHQscyxlKSx0X3NsZHNfaW5pdFNsaWRlckNvbnRyb2xzKHQsZSl9KSkpOih5fHx0X3NsZHNfb25IYW1tZXJMb2FkKCJIYW1tZXIiLChmdW5jdGlvbigpe3Rfc2xkc19pbml0U2xpZGVyU3dpcGUodCxkLGMpfSkpLHRfc2xkc19pbml0U2xpZGVyQ29udHJvbHModCxlKSx0X3NsZHNfdXBkYXRlU2xpZGVyKHQpKSxyLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdGltZW91dCIpPjA/dF9zbGRzX2luaXRBdXRvUGxheSh0LHYsZCxlKTpyLmFkZEV2ZW50TGlzdGVuZXIoInNsaWRlQXV0b3BsYXlUaW1lclJlYWR5IiwoZnVuY3Rpb24oKXtyLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdGltZW91dCIpPjAmJnRfc2xkc19pbml0QXV0b1BsYXkodCx2LGQsZSl9KSkscy5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtLWxvYWRlZCIpLmxlbmd0aDxkKzImJnRfc2xkc19VcGRhdGVJbWFnZXModCx2KSwieWVzIj09ci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWFycm93cy1uZWFycGljIikmJnRfc2xkc19wb3NpdGlvbkFycm93cyh0KTt2YXIgaD1zLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHMiKTtoLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChoLChmdW5jdGlvbih0KXt0LnN0eWxlLnZpc2liaWxpdHk9IiJ9KSksdF9zbGRzX19zZXRUYWJpbmRleEZvckZvY3VzYWJsZUVsZW1lbnRzKHQpLHMucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcGxheUNoYW5nZWQiLHRfc2xkc191cGRhdGVPbkRpc3BsYXlDaGFuZ2UpLHMuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcGxheUNoYW5nZWQiLHRfc2xkc191cGRhdGVPbkRpc3BsYXlDaGFuZ2UodCxtKSksYSYmKHMucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcGxheUNoYW5nZWQiLHRfc2xkc191cGRhdGVGZWVkc1NsaWRlck9uUmVzaXplKSxzLmFkZEV2ZW50TGlzdGVuZXIoImRpc3BsYXlDaGFuZ2VkIiwoZnVuY3Rpb24oKXt0X3NsZHNfdXBkYXRlRmVlZHNTbGlkZXJPblJlc2l6ZSh0LHMsZSl9KSkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0X3NsZHNfc2V0SXRlbXNJblJvdyh0LG0pLHRfc2xkc191cGRhdGVTbGlkZXIodCksdF9zbGRzX3Bvc2l0aW9uQXJyb3dzKHQpLGEmJnRfc2xkc191cGRhdGVGZWVkc1NsaWRlck9uUmVzaXplKHQscyxlKX0pLDEwMCl9KSkpLHdpbmRvdy50X3NsZHNfX2lzaU9TJiYoImNvbXBsZXRlIj09PWRvY3VtZW50LnJlYWR5U3RhdGU/dF9zbGRzX19oaWRlTW9iaWxlU2xpZGVzKHMucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbV9hY3RpdmUiKSk6d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe3Rfc2xkc19faGlkZU1vYmlsZVNsaWRlcyhzLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1fYWN0aXZlIikpfSkpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKGZ1bmN0aW9uKCl7InRydWUiPT1yLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY29ycmVjdC1oZWlnaHQiKSYmdF9zbGRzX1VwZGF0ZVNsaWRlckhlaWdodCh0KSx0X3NsZHNfVXBkYXRlU2xpZGVyQXJyb3dzSGVpZ2h0KHQpfSkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dF9zbGRzX1VwZGF0ZVNsaWRlckFycm93c0hlaWdodCh0KX0pLDUwMCk7dmFyIEE9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2FsbHJlY29yZHMiKTtBJiZBLmFkZEV2ZW50TGlzdGVuZXIoImFsbFJlY1BhZGRpbmdJbml0IiwoZnVuY3Rpb24oKXt0X3NsZHNfdXBkYXRlU2xpZGVyKHQpfSkpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIix0X3NsZHNfX3JlbW92ZUF1dG9wbGF5QnlWaWRlbyksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfc2xkc19fcmVtb3ZlQXV0b3BsYXlCeVZpZGVvKX19fX19ZnVuY3Rpb24gdF9zbGRzX19yZW1vdmVBdXRvcGxheUJ5VmlkZW8odCl7dmFyIGU9dC50YXJnZXQuY2xvc2VzdCgiLnQtc2xkc19faXRlbSIpLHM9bnVsbD09ZT92b2lkIDA6ZS5xdWVyeVNlbGVjdG9yKCJbZGF0YS1zbGlkZXItdmlkZW8tdHlwZV0sIFtkYXRhLXZpZGVvbGF6eS10eXBlXSwgaWZyYW1lIik7aWYocyl7dmFyIHI9cy5jbG9zZXN0KCIudC1zbGRzX19pdGVtcy13cmFwcGVyIiksaTtpZihyKXIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pbnRlcnZhbC1pZCIpJiYoci5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQiLCJ5ZXMiKSxyLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcHBlZC1ieS12aWRlbyIsInkiKSl9fWZ1bmN0aW9uIHRfc2xkc19faW5pdEZlZWRzU2xpZGVyKHQsZSl7dmFyIHM9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIik7aWYocyl7dmFyIHI9ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtOm5vdCgudC1zbGRzX19pdGVtX2R1bW15KSIpLGk9cGFyc2VJbnQocy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRvdGFsc2xpZGVzIiksMTApfHwwLGE9clswXSxsPXJbci5sZW5ndGgtMV0sZD1zLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItd2l0aC1jeWNsZSIpO3Rfc2xkc19fY3JlYXRlRHVtbWllcyhhLGwscyksdF9zbGRzX3VwZGF0ZVNsaWRlcih0KTt2YXIgbz1wYXJzZUludChzLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93IiksMTApfHwwLG49ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19hcnJvd193cmFwcGVyLXJpZ2h0Iik7bi5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24odCl7dC5zdHlsZS5kaXNwbGF5PSJmYWxzZSI9PT1kJiZpLW88PTA/Im5vbmUiOiIifSkpLCJ0cnVlIj09cy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWNvcnJlY3QtaGVpZ2h0IikmJnRfc2xkc19TbGlkZXJIZWlnaHQodCl9fWZ1bmN0aW9uIHRfc2xkc19fY3JlYXRlRHVtbWllcyh0LGUscyl7dmFyIHIsaT1zLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW06bm90KC50LXNsZHNfX2l0ZW1fZHVtbXkpIikubGVuZ3RoLGE9cGFyc2VJbnQocy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIpLDEwKXx8MCxsPXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci13aXRoLWN5Y2xlIiksZD1zLmNsYXNzTGlzdC5jb250YWlucygianMtZmVlZC1jb250YWluZXIiKSxvPSExLG49ITEsYyxfO2lmKHQmJihjPXQucXVlcnlTZWxlY3RvcignW2RhdGEtem9vbWFibGU9InllcyJdJykpJiYobz0hMCxjLmNsYXNzTGlzdC5jb250YWlucygidC16b29tYWJsZSIpJiZjLmNsYXNzTGlzdC5yZW1vdmUoInQtem9vbWFibGUiKSxjLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS16b29tYWJsZSIpKSxlJiYoXz1lLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXpvb21hYmxlPSJ5ZXMiXScpKSYmKG49ITAsXy5jbGFzc0xpc3QuY29udGFpbnMoInQtem9vbWFibGUiKSYmXy5jbGFzc0xpc3QucmVtb3ZlKCJ0LXpvb21hYmxlIiksXy5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtem9vbWFibGUiKSksZSYmMD09cy5xdWVyeVNlbGVjdG9yQWxsKCcudC1zbGRzX19pdGVtW2RhdGEtc2xpZGUtaW5kZXg9IjAiXScpLmxlbmd0aCl7dmFyIHU9ZS5jbG9uZU5vZGUoITApO3Uuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWluZGV4IiwiMCIpLHUuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsInRydWUiKTt2YXIgcD10LnBhcmVudE5vZGU7cC5pbnNlcnRCZWZvcmUodSx0KTt2YXIgZj1wLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXNsaWRlLWluZGV4PSIwIl0gW2ZpZWxkXScpO2YubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGYsKGZ1bmN0aW9uKHQpe3QucmVtb3ZlQXR0cmlidXRlKCJmaWVsZCIpfSkpfWlmKCFkJiZ0JiYhcy5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19pdGVtW2RhdGEtc2xpZGUtaW5kZXg9IicrKGkrMSkrJyJdJykpe3ZhciBtPXQuY2xvbmVOb2RlKCEwKTtpZihtLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZS1pbmRleCIsaSsxKSxtLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19faXRlbV9hY3RpdmUiKSxtLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJ0cnVlIiksZS5pbnNlcnRBZGphY2VudEVsZW1lbnQoImFmdGVyZW5kIixtKSxlLmNsYXNzTGlzdC5hZGQoInQtc2xkc19faXRlbS1sb2FkZWQiKSxhPjAmJiJ0cnVlIj09PWwpZm9yKHZhciB5PXQsdj1lLGc9MDtnPGEtMTtnKyspe3ZhciBiPXkubmV4dEVsZW1lbnRTaWJsaW5nLmNsb25lTm9kZSghMCk7Yi5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGUtaW5kZXgiLGkrZysxKSx2Lm5leHRFbGVtZW50U2libGluZy5pbnNlcnRBZGphY2VudEVsZW1lbnQoImFmdGVyZW5kIixiKSx2PXYubmV4dEVsZW1lbnRTaWJsaW5nLHk9eS5uZXh0RWxlbWVudFNpYmxpbmd9fW8mJmMmJihjLmNsYXNzTGlzdC5hZGQoInQtem9vbWFibGUiKSxjLnNldEF0dHJpYnV0ZSgiZGF0YS16b29tYWJsZSIsInllcyIpKSxuJiZfJiYoXy5jbGFzc0xpc3QuYWRkKCJ0LXpvb21hYmxlIiksXy5zZXRBdHRyaWJ1dGUoImRhdGEtem9vbWFibGUiLCJ5ZXMiKSl9ZnVuY3Rpb24gdF9zbGRzX19oaWRlTW9iaWxlU2xpZGVzKHQpe2lmKHQpe3ZhciBlPXQuY2xvc2VzdCgiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpLHM9ZSYmZ2V0Q29tcHV0ZWRTdHlsZShlKTtpZighc3x8InNjcm9sbCIhPT1zLm92ZXJmbG93WHx8ImZsZXgiIT09cy5kaXNwbGF5KXt2YXIgcj0idC1zbGRzX19pdGVtLWlubmFjdGl2ZSIsaTtpZigocGFyc2VJbnQoZS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIpLDEwKXx8MCk+MSl7dmFyIGE7ZS5xdWVyeVNlbGVjdG9yQWxsKCIuIityKS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5yZW1vdmUocil9KSl9ZWxzZXt2YXIgbD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW06bm90KC50LXNsZHNfX2l0ZW1fZHVtbXkpIikpLGQ9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoPjk2MD81OjM7aWYoIShsLmxlbmd0aDw9MipkKSl7Zm9yKHZhciBvPXQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWluZGV4Iiksbj1bbz1wYXJzZUludChvLDEwKV0sYz0xO2M8ZDtjKyspbytjPD1sLmxlbmd0aD9uLnB1c2gobytjKTpuLnB1c2goYyksby1jPjA/bi5wdXNoKG8tYyk6bi5wdXNoKGwubGVuZ3RoKzEtYyk7bC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZTtuLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiBwYXJzZUludCh0LmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZS1pbmRleCIpLDEwKT09PWV9KSk/dC5jbGFzc0xpc3QucmVtb3ZlKHIpOnQuY2xhc3NMaXN0LmFkZChyKX0pKX19fX19ZnVuY3Rpb24gdF9zbGRzX3VwZGF0ZU9uRGlzcGxheUNoYW5nZSh0LGUpe3RfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dF9zbGRzX3NldEl0ZW1zSW5Sb3codCxlKSx0X3NsZHNfdXBkYXRlU2xpZGVyKHQpLHRfc2xkc19wb3NpdGlvbkFycm93cyh0KX0pKX1mdW5jdGlvbiB0X3NsZHNfdXBkYXRlRmVlZHNTbGlkZXJPblJlc2l6ZSh0LGUscyl7dmFyIHI9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIiksaTtyJiYoci5jbGFzc0xpc3QuY29udGFpbnMoImpzLWZlZWQtY29udGFpbmVyIikmJih3aW5kb3cuaW5uZXJXaWR0aD45NjA/InRydWUiPT09ci5nZXRBdHRyaWJ1dGUoImRhdGEtZmVlZHMtcG9zdHMtbG9hZGVkIik/KHRfc2xkc19faW5pdEZlZWRzU2xpZGVyKHQsZSxzKSx0X3NsZHNfaW5pdFNsaWRlckNvbnRyb2xzKHQscykpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZlZWRzTG9hZFBvc3RzIiwoZnVuY3Rpb24oKXt0X3NsZHNfX2luaXRGZWVkc1NsaWRlcih0LGUscyksdF9zbGRzX2luaXRTbGlkZXJDb250cm9scyh0LHMpfSkpOnIuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVYKDApIikpfWZ1bmN0aW9uIHRfc2xkc19zZXRJdGVtc0luUm93KHQsZSl7dmFyIHM9dF9zbGRzX19nZXRSZWModCk7aWYocyl7dmFyIHI9cy5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIiksaSxhO2lmKHIpKHIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pdGVtcy1pbi1yb3ciKXx8MCkmJih3aW5kb3cuaW5uZXJXaWR0aDw9OTYwJiYoYT0yKSx3aW5kb3cuaW5uZXJXaWR0aDw9NjQwJiYoYT0xKSx3aW5kb3cuaW5uZXJXaWR0aD45NjAmJihhPWUpKSxhJiZyLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93IixhKX19ZnVuY3Rpb24gdF9zbGRzX2luaXRTbGlkZXJDb250cm9scyh0LGUpe3ZhciBzPXRfc2xkc19fZ2V0UmVjKHQpO2lmKHMpe3ZhciByPXMucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpO2lmKHIpe3ZhciBpPXIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pdGVtcy1pbi1yb3ciKXx8MCxhPXMucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIC50LXNsZHNfX2l0ZW0iKSxsPXMucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIiksZD1pPjAmJmEmJmw/YS5vZmZzZXRXaWR0aDpsLm9mZnNldFdpZHRoLG87aWYoInRydWUiIT09ci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3AiKSl7ci5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZVgoLSIrZCsicHgpIjt2YXIgbj1zLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2Fycm93X3dyYXBwZXIiKTtuLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbihpKXtpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoZnVuY3Rpb24oaSl7aS50YXJnZXQuY2xvc2VzdCgiYSIpJiZpLnByZXZlbnREZWZhdWx0KCk7dmFyIGE9dF9zbGRzX2dldEN1cnJlbnRUcmFuc2xhdGUocyksbD1yLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItYW5pbWF0ZWQiKSxkPXBhcnNlRmxvYXQoci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIpKSxvPXBhcnNlRmxvYXQoci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRvdGFsc2xpZGVzIikpLG49ci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXdpdGgtY3ljbGUiKSxjPSIiLF87IiI9PWwmJihyLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItYW5pbWF0ZWQiLCJ5ZXMiKSwibGVmdCI9PT10aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZS1kaXJlY3Rpb24iKT8iZmFsc2UiPT1uJiYxPT1kP2Q9MTpkLS06ImZhbHNlIj09biYmZD09bz9kPW86ZCsrLHIuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiLGQpLGQhPW8rMSYmMCE9ZHx8KGM9InllcyIpLHIuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1jeWNsZSIsYyksdF9zbGlkZU1vdmVXaXRob3V0QW5pbWF0aW9uKHQsITEsZSxhKSk7dF9zbGRzX3VwZGF0ZVNsaWRlcih0KX0pKX0pKTt2YXIgYz1zLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2J1bGxldCIpO2MubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGMsKGZ1bmN0aW9uKGkpe2kuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLChmdW5jdGlvbigpe3ZhciBhPXBhcnNlSW50KGkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWJ1bGxldC1mb3IiKSwxMCksbDtpZihwYXJzZUludChyLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIiksMTApIT09YSl7dmFyIGQ9dF9zbGRzX2dldEN1cnJlbnRUcmFuc2xhdGUocyk7ci5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIsYSksdF9zbGlkZU1vdmVXaXRob3V0QW5pbWF0aW9uKHQsITEsZSxkKSx0X3NsZHNfdXBkYXRlU2xpZGVyKHQpfX0pKX0pKX19fX1mdW5jdGlvbiB0X3NsZHNfYW5pbWF0ZSh0LGUscyl7dmFyIHI9cGVyZm9ybWFuY2Uubm93KCk7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKChmdW5jdGlvbiBpKGEpe3ZhciBsPShhLXIpL3M7bD4xJiYobD0xKTt2YXIgZD10KGwpO2UoZCksbDwxP3JlcXVlc3RBbmltYXRpb25GcmFtZShpKToieSIhPT13aW5kb3cubGF6eSYmInllcyIhPT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjYWxscmVjb3JkcyIpLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1sYXp5Iil8fHRfc2xkc19vbkhhbW1lckxvYWQoInRfbGF6eWxvYWRfdXBkYXRlIiwoZnVuY3Rpb24oKXt0X2xhenlsb2FkX3VwZGF0ZSgpfSkpfSkpfWZ1bmN0aW9uIHRfc2xpZGVfTW92ZUFuaW1hdGlvbih0LGUscyxyKXtpZih0KXt0LnN0eWxlLnRyYW5zaXRpb249ImhlaWdodCBlYXNlLWluLW91dCAuNXMsIHRyYW5zZm9ybSBlYXNlLWluLW91dCAwcyI7dmFyIGk9LU1hdGguYWJzKGUqcyksYT0tcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZSh0KS50cmFuc2Zvcm0ubWF0Y2goL1xkKy8pWzBdKSxsPWEtaTswIT09bCYmdF9zbGRzX2FuaW1hdGUoKGZ1bmN0aW9uKHQpe3JldHVybiB0fSksKGZ1bmN0aW9uKGUpe3Quc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVYKCIrKGEtbCplKSsicHgpIn0pLHIpfX1mdW5jdGlvbiB0X3NsaWRlTW92ZVdpdGhvdXRBbmltYXRpb24odCxlLHMpe3ZhciByPXRfc2xkc19fZ2V0UmVjKHQpO2lmKHIpe3ZhciBpPXIucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpO2lmKGkpe3ZhciBhPXBhcnNlRmxvYXQoaS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIpKSxsLGQ9KGkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pdGVtcy1pbi1yb3ciKXx8MCk+MD9yLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NvbnRhaW5lciAudC1zbGRzX19pdGVtIikub2Zmc2V0V2lkdGg6ci5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19jb250YWluZXIiKS5vZmZzZXRXaWR0aCxvPXBhcnNlRmxvYXQoaS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRvdGFsc2xpZGVzIikpLG49aS5jbGFzc0xpc3QuY29udGFpbnMoInQtc2xkc19hbmltYXRlZC1ub25lIik7YT5vKzEmJihhPTEpO3ZhciBjPXIuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19lbGVtIiksXz10X3NsZHNfZ2V0RXZlbnRzRm9yWmVyb0Jsb2NrKCksdT1fLm1vdmVTbGlkZVN0YXJ0RXZlbnQscD1fLm1vdmVTbGlkZUVuZEV2ZW50O2lmKGMmJnIuZGlzcGF0Y2hFdmVudCh1KSxuKXt2YXIgZj1yLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1fYWN0aXZlIiksbT1yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW0iKTtpZihmJiYwPT09ci5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtX2R1bW15IikubGVuZ3RoKXt2YXIgeT1mLmNsb25lTm9kZSghMCksdjt5LmNsYXNzTGlzdC5hZGQoInQtc2xkc19faXRlbV9kdW1teSIpLHkuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix5LnN0eWxlLmxlZnQ9ZCphKyJweCIsaS5hcHBlbmRDaGlsZCh5KSwodj1yLmNsYXNzTGlzdC5jb250YWlucygianMtcHJvZHVjdCIpP3I6ci5xdWVyeVNlbGVjdG9yKCIudC1jYXRhbG9nLCAudC1zdG9yZSIpfHxyLnF1ZXJ5U2VsZWN0b3IoIi5qcy1wcm9kdWN0IikpPyh0X3NsZHNfZmFkZU91dCh5LDE1MCwoZnVuY3Rpb24oKXtudWxsIT09eS5wYXJlbnROb2RlJiZ5LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoeSl9KSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChtLChmdW5jdGlvbih0KXt0X3NsZHNfZmFkZUluKHQsMTUwKX0pKSk6KEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobSwoZnVuY3Rpb24odCl7dC5zdHlsZS5vcGFjaXR5PTB9KSksdF9zbGRzX2ZhZGVPdXQoeSw0MDAsKGZ1bmN0aW9uKCl7bnVsbCE9PXkucGFyZW50Tm9kZSYmeS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHkpfSkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChtLChmdW5jdGlvbih0KXt0X3NsZHNfZmFkZUluKHQpfSkpLGMmJnIuZGlzcGF0Y2hFdmVudChwKX0pLDUwKSl9aS5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfYW5pbWF0ZWQtY2FuY2VsIil9dF9zbGlkZU1vdmUodCxlLHMpLG4mJmkuY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX2FuaW1hdGVkLWNhbmNlbCIpLGMmJnIuZGlzcGF0Y2hFdmVudChwKX19fWZ1bmN0aW9uIHRfc2xpZGVNb3ZlSW5zdGFudGx5KHQsZSxzKXt2YXIgcj10X3NsZHNfX2dldFJlYyh0KTtpZihyKXt2YXIgaT1yLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKTtpZihpKXt2YXIgYT1wYXJzZUZsb2F0KGkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiKSksbCxkPShpLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93Iil8fDApPjA/ci5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19jb250YWluZXIgLnQtc2xkc19faXRlbSIpLm9mZnNldFdpZHRoOnIucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIikub2Zmc2V0V2lkdGgsbz1wYXJzZUZsb2F0KGkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10b3RhbHNsaWRlcyIpKSxuPWkuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNsZHNfYW5pbWF0ZWQtbm9uZSIpO2lmKGE+bysxJiYoYT0xKSxuKXt2YXIgYz1yLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1fYWN0aXZlIik7aWYoYyYmMD09PXIucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faXRlbV9kdW1teSIpLmxlbmd0aCl7dmFyIF89Yy5jbG9uZU5vZGUoITApO18uY2xhc3NMaXN0LmFkZCgidC1zbGRzX19pdGVtX2R1bW15IiksXy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLF8uc3R5bGUubGVmdD1kKmErInB4IixpLmFwcGVuZENoaWxkKF8pLHRfc2xkc19mYWRlT3V0KF8sNDAwLChmdW5jdGlvbigpe251bGwhPT1fLnBhcmVudE5vZGUmJl8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChfKX0pKX1pLmNsYXNzTGlzdC5hZGQoInQtc2xkc19hbmltYXRlZCIpLGkuY2xhc3NMaXN0LmFkZCgidC1zbGRzX2FuaW1hdGVkLWNhbmNlbCIpfWVsc2UgaS5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfYW5pbWF0ZWQiKSxpLmNsYXNzTGlzdC5hZGQoInQtc2xkc19hbmltYXRlZC1jYW5jZWwiKTt0X3NsaWRlTW92ZSh0LGUscyksaS5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfYW5pbWF0ZWQiKSxpLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19hbmltYXRlZC1jYW5jZWwiKX19fWZ1bmN0aW9uIHRfc2xpZGVNb3ZlKHQsZSxzKXt2YXIgcj10X3NsZHNfX2dldFJlYyh0KTtpZihyKXt2YXIgaT1yLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKTtpZihpKXt2YXIgYT1yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW06bm90KC50LXNsZHNfX2l0ZW1fZHVtbXkpIiksbD1pLmNsYXNzTGlzdC5jb250YWlucygianMtZmVlZC1jb250YWluZXIiKSxkPXBhcnNlSW50KGkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pdGVtcy1pbi1yb3ciKXx8MCksbz1wYXJzZUludChpLmdldEF0dHJpYnV0ZSgiZGF0YS1mZWVkLXNob3ctY291bnQiKXx8MCksbj1kPjA/ci5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19jb250YWluZXIgLnQtc2xkc19faXRlbSIpLm9mZnNldFdpZHRoOnIucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIikub2Zmc2V0V2lkdGgsYz1wYXJzZUZsb2F0KGkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10cmFuc2l0aW9uIikpLF89cGFyc2VGbG9hdChpLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIikpLHU9cGFyc2VGbG9hdChpLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdG90YWxzbGlkZXMiKSkscD1pLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY3ljbGUiKSxmPWkuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNsZHNfYW5pbWF0ZWQtbm9uZSIpLG09aS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRpbWVvdXQiKT4wLHk9ci5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvd193cmFwcGVyLXJpZ2h0Iiksdj1yLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2Fycm93X3dyYXBwZXItbGVmdCIpLGc7Im9mZiI9PT1pLmdldEF0dHJpYnV0ZSgiYXJpYS1saXZlIikmJmkuc2V0QXR0cmlidXRlKCJhcmlhLWxpdmUiLCJwb2xpdGUiKTt2YXIgYj0wO2lmKC9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpe3ZhciBoPW5hdmlnYXRvci5hcHBWZXJzaW9uLm1hdGNoKC9WZXJzaW9uXC8oXGQrKVwuKFxkKylcLj8oXGQrKT8gU2FmYXJpLyk7bnVsbCE9PWgmJihiPXBhcnNlSW50KGhbMV0sMTApKX12YXIgQT0hIW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goIkNyaU9TIiksUztpZihjfHwwPT09Y3x8KGM9MzAwKSxfPnUrMSYmKF89MSxpLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIiwxKSksInRydWUiIT09aS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3AiKSl7aWYoeSlpZihsKXt2YXIgdz1hW2EubGVuZ3RoLTFdLEU9cGFyc2VJbnQody5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGUtaW5kZXgiKSwxMCk7aWYoZDx1JiZ0X3NsZHNfZmFkZUluKHksMzAwKSxFPHUmJmQ+MCYmKF89PUUtbysxfHxFPT09bykpe3ZhciBxPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpO3EuaW5pdEV2ZW50KCJmZWVkc0xhc3RTbGlkZSIsITAsITApLGkuZGlzcGF0Y2hFdmVudChxKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmZWVkc0xvYWRTbGlkZSIsKGZ1bmN0aW9uKCl7dF9zbGRzX3VwZGF0ZVNsaWRlcih0KSwiZnVuY3Rpb24iPT10eXBlb2YgdF9hbmltYXRlX19zdGFydEFuaW1hdGlvbiYmdF9hbmltYXRlX19zdGFydEFuaW1hdGlvbigpfSkpLHRfc2xkc19mYWRlSW4oeSwzMDApfWVsc2UgRT09PXUmJl89PT11LWQrMSYmdF9zbGRzX2ZhZGVPdXQoeSwzMDApfWVsc2UiZmFsc2UiPT1pLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItd2l0aC1jeWNsZSIpJiYoXz09dXx8ZD4xJiZfPT11LWQrMSk/dF9zbGRzX2ZhZGVPdXQoeSwzMDApOnRfc2xkc19mYWRlSW4oeSwzMDApO3YmJigiZmFsc2UiPT1pLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItd2l0aC1jeWNsZSIpJiYxPT1fP3Rfc2xkc19mYWRlT3V0KHYsMzAwKTp0X3NsZHNfZmFkZUluKHYsMzAwKSksaS5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfYW5pbWF0ZWQiKSxiPj0xMyYmQSYmIWY/dF9zbGlkZV9Nb3ZlQW5pbWF0aW9uKGksXyxuLGMpOmkuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVYKC0iK24qXysicHgpIix0X3RyaWdnZXJFdmVudChpLCJzbGlkZUNoYW5nZVN0YXJ0Iiksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtpLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19hbmltYXRlZCIpLGkuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1hbmltYXRlZCIsIiIpLCJ5ZXMiPT0ocD1pLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY3ljbGUiKSkmJihfPT11KzEmJihfPTEpLDA9PV8mJihfPXUpLGI+PTEzJiZBJiYhZj90X3NsaWRlX01vdmVBbmltYXRpb24oaSxfLG4sMCk6aS5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZVgoLSIrbipfKyJweCkiLCEwIT09ZiYmdF9zbGRzX0FjdGl2ZVNsaWRlKHQsXyx1LHMpLGkuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiLF8pKSwoInkiPT09d2luZG93Lmxhenl8fGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNhbGxyZWNvcmRzIikmJiJ5ZXMiPT09ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2FsbHJlY29yZHMiKS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbGF6eSIpKSYmdF9zbGRzX29uSGFtbWVyTG9hZCgidF9sYXp5bG9hZF91cGRhdGUiLChmdW5jdGlvbigpe3RfbGF6eWxvYWRfdXBkYXRlKCl9KSksIWUmJm0mJnRfc2xkc19pbml0QXV0b1BsYXkodCxfLHUscyl9KSxjKSx0X3NsZHNfQWN0aXZlQnVsbGV0KHQsXyx1LHMpLHRfc2xkc19BY3RpdmVTbGlkZSh0LF8sdSksInRydWUiPT1pLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY29ycmVjdC1oZWlnaHQiKSYmdF9zbGRzX1NsaWRlckhlaWdodCh0KSx0X3NsZHNfU2xpZGVyQXJyb3dzSGVpZ2h0KHQpLHRfc2xkc19BY3RpdmVDYXB0aW9uKHQsXyx1KSxyLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW0tbG9hZGVkIikubGVuZ3RoPHUrMiYmdF9zbGRzX1VwZGF0ZUltYWdlcyh0LF8pLHRfdHJpZ2dlckV2ZW50KGksInNsaWRlQ2hhbmdlRW5kIil9fX19ZnVuY3Rpb24gdF9zbGRzX3VwZGF0ZVNsaWRlcih0KXt2YXIgZT10X3NsZHNfX2dldFJlYyh0KTtpZihlKXt0X3NsZHNfU2xpZGVyV2lkdGgodCk7dmFyIHM9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIik7aWYocyl7dmFyIHI9cGFyc2VJbnQocy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIpLDEwKXx8MSxpPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIC50LXNsZHNfX2l0ZW0iKSxhPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIiksbD1yPjAmJmEmJmk/aS5vZmZzZXRXaWR0aDphLm9mZnNldFdpZHRoLGQ9cGFyc2VJbnQocy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIpLDEwKSxvPXBhcnNlSW50KHMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10b3RhbHNsaWRlcyIpLDEwKSxuPXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci13aXRoLWN5Y2xlIiksYz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2Fycm93X3dyYXBwZXItcmlnaHQiKTtpZihkPm8rMSYmKGQ9MSxzLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIiwxKSksYyYmImZhbHNlIj09PW4pe3ZhciBfLHU9by1yPD0wfHxkK3ItMT09PW87Yy5zdHlsZS5kaXNwbGF5PXU/Im5vbmUiOiIifXMuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVYKC0iK2wqZCsicHgpIiwidHJ1ZSI9PXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1jb3JyZWN0LWhlaWdodCIpJiZ0X3NsZHNfVXBkYXRlU2xpZGVySGVpZ2h0KHQpLHRfc2xkc19VcGRhdGVTbGlkZXJBcnJvd3NIZWlnaHQodCksInkiPT09cy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQtYnktdmlkZW8iKSYmcy5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQtYnktdmlkZW8iLCIiKX19fWZ1bmN0aW9uIHRfc2xkc19VcGRhdGVJbWFnZXModCxlKXt2YXIgcz10X3NsZHNfX2dldFJlYyh0KTtpZihzKXt2YXIgcj1zLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2l0ZW1bZGF0YS1zbGlkZS1pbmRleD0iJytlKyciXScpO3ImJihyLmNsYXNzTGlzdC5hZGQoInQtc2xkc19faXRlbS1sb2FkZWQiKSxyLm5leHRFbGVtZW50U2libGluZyYmci5uZXh0RWxlbWVudFNpYmxpbmcuY2xhc3NMaXN0LmFkZCgidC1zbGRzX19pdGVtLWxvYWRlZCIpLHIucHJldmlvdXNFbGVtZW50U2libGluZyYmci5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLmNsYXNzTGlzdC5hZGQoInQtc2xkc19faXRlbS1sb2FkZWQiKSl9fWZ1bmN0aW9uIHRfc2xkc19BY3RpdmVDYXB0aW9uKHQsZSxzKXt2YXIgcj10X3NsZHNfX2dldFJlYyh0KTtpZihyKXt2YXIgaT1yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2NhcHRpb24iKSxhPXIucXVlcnlTZWxlY3RvcignLnQtc2xkc19fY2FwdGlvbltkYXRhLXNsaWRlLWNhcHRpb249IicrZSsnIl0nKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe3QuY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX19jYXB0aW9uLWFjdGl2ZSIpfSkpLDA9PWU/YT1yLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2NhcHRpb25bZGF0YS1zbGlkZS1jYXB0aW9uPSInK3MrJyJdJyk6ZT09cysxJiYoYT1yLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2NhcHRpb25bZGF0YS1zbGlkZS1jYXB0aW9uPSIxIl0nKSksYSYmYS5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfX2NhcHRpb24tYWN0aXZlIil9fWZ1bmN0aW9uIHRfc2xkc19zY3JvbGxJbWFnZXModCxlKXt2YXIgcz10X3NsZHNfX2dldFJlYyh0KTtpZihzKXt2YXIgcj0oZTwwPyIiOiItIikrTWF0aC5hYnMoZSkudG9TdHJpbmcoKTtzLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKS5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZVgoIityKyJweCkifX1mdW5jdGlvbiB0X3NsZHNfQWN0aXZlQnVsbGV0KHQsZSxzLHIpe3ZhciBpO2lmKHImJnIudGh1bWJzYnVsbGV0R2FsbGVyeSl7dmFyIGE9cGFyc2VJbnQoci5zdG9yZU9wdGlvbnMucG9wdXBfb3B0cy5jb2x1bW5zKSxsPStyLnN0b3JlT3B0aW9ucy5zbGlkZXJfc2xpZGVzT3B0cy5yYXRpbzsidF9zdG9yZV9wcm9kUG9wdXBfZ2FsbGVyeV9jYWxjTWF4VGh1bWJzQ291bnQiaW4gd2luZG93P2k9dF9zdG9yZV9wcm9kUG9wdXBfZ2FsbGVyeV9jYWxjTWF4VGh1bWJzQ291bnQoYSxsLDYwLDEwKToidF9jYXRhbG9nX3Byb2RQb3B1cF9nYWxsZXJ5X2NhbGNNYXhUaHVtYnNDb3VudCJpbiB3aW5kb3cmJihpPXRfY2F0YWxvZ19wcm9kUG9wdXBfZ2FsbGVyeV9jYWxjTWF4VGh1bWJzQ291bnQoYSxsLDYwLDEwKSl9dmFyIGQ9dF9zbGRzX19nZXRSZWModCk7aWYoZCl7dmFyIG89ZC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19idWxsZXQiKSxuPWQucXVlcnlTZWxlY3RvcignLnQtc2xkc19fYnVsbGV0W2RhdGEtc2xpZGUtYnVsbGV0LWZvcj0iJytlKyciXScpO2lmKEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobywoZnVuY3Rpb24odCl7dC5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfX2J1bGxldF9hY3RpdmUiKTt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2J1bGxldF9ib2R5Iik7ZSYmZS5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtY3VycmVudCIpfSkpLHImJnIudGh1bWJzYnVsbGV0R2FsbGVyeSYmZT49aSYmZSE9cysxfHxzPj1pJiYwPT1lP249ZC5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19idWxsZXRbZGF0YS1zbGlkZS1idWxsZXQtZm9yPSInK2krJyJdJyk6MD09ZT9uPWQucXVlcnlTZWxlY3RvcignLnQtc2xkc19fYnVsbGV0W2RhdGEtc2xpZGUtYnVsbGV0LWZvcj0iJytzKyciXScpOmU9PXMrMSYmKG49ZC5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19idWxsZXRbZGF0YS1zbGlkZS1idWxsZXQtZm9yPSIxIl0nKSksbil7bi5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfX2J1bGxldF9hY3RpdmUiKTt2YXIgYz1uLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2J1bGxldF9ib2R5Iik7YyYmYy5zZXRBdHRyaWJ1dGUoImFyaWEtY3VycmVudCIsITApfX19ZnVuY3Rpb24gdF9zbGRzX0FjdGl2ZVNsaWRlKHQsZSxzKXt2YXIgcj10X3NsZHNfX2dldFJlYyh0KTtpZihyKXt2YXIgaT1yLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKSxhPXIucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faXRlbSIpLGw9ci5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19pdGVtW2RhdGEtc2xpZGUtaW5kZXg9IicrZSsnIl0nKSxkPSEhaSYmaS5jbGFzc0xpc3QuY29udGFpbnMoInQtc2xkc19hbmltYXRlZC1ub25lIiksbz1yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXZpZGVvLWxhenlsb2FkIik7aWYoby5sZW5ndGgpdF9vbkZ1bmNMb2FkKCJ0X3ZpZGVvX19nZXRQbGF5ZXIiLChmdW5jdGlvbigpe28uZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU7aWYoImZhbHNlIiE9PXQuZ2V0QXR0cmlidXRlKCJkYXRhLXZpZGVvbGF6eS1sb2FkIikpe3ZhciBzPXQuY2xvc2VzdCgiLnQtc2xkc19faXRlbTpub3QoLnQtc2xkc19faXRlbV9kdW1teSkiKTtpZihzKXt2YXIgcj10X3ZpZGVvX19nZXRQbGF5ZXIocyk7cj9yLnBhdXNlKCk6dF9zbGRzX19wcm9jY2Vzc1ZpZGVvKHMpLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiB0LnBhdXNlKCl9KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe3JldHVybiB0fSkpfX19KSl9KSk7ZWxzZXt2YXIgbj1yLnF1ZXJ5U2VsZWN0b3JBbGwoImlmcmFtZSIpLGM9ci5xdWVyeVNlbGVjdG9yQWxsKCJ2aWRlbyIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24odCl7dC5zcmMmJigtMSE9PXQuc3JjLmluZGV4T2YoIiZlbmFibGVqc2FwaT0xIikmJnQuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSgneyJldmVudCI6ImNvbW1hbmQiLCJmdW5jIjoicGF1c2VWaWRlbyIsImFyZ3MiOiIifScsIioiKSwtMT09PXQuc3JjLmluZGV4T2YoInZpbWVvIil8fC0xPT09dC5zcmMuaW5kZXhPZigiJmFtcDthcGk9MSIpJiYtMT09PXQuc3JjLmluZGV4T2YoIiZhcGk9MSIpfHx0LmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoJ3sibWV0aG9kIjoicGF1c2UiLCJ2YWx1ZSI6InRydWUifScsIioiKSl9KSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChjLChmdW5jdGlvbih0KXt0LnBhdXNlKCl9KSl9aWYoQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19faXRlbV9hY3RpdmUiKSx0LnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJ0cnVlIil9KSksMD09ZSYmITE9PT1kKXIucXVlcnlTZWxlY3RvcignLnQtc2xkc19faXRlbVtkYXRhLXNsaWRlLWluZGV4PSInK3MrJyJdJykuY2xhc3NMaXN0LmFkZCgidC1zbGRzX19pdGVtX2FjdGl2ZSIpLHIuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsImZhbHNlIik7ZWxzZSBpZigwPT1lJiYhMD09PWQpbD1yLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2l0ZW1bZGF0YS1zbGlkZS1pbmRleD0iJytzKyciXScpO2Vsc2UgaWYoZT09cysxJiYhMT09PWQpe3ZhciBfPXIucXVlcnlTZWxlY3RvcignLnQtc2xkc19faXRlbVtkYXRhLXNsaWRlLWluZGV4PSIxIl0nKTtfJiYoXy5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfX2l0ZW1fYWN0aXZlIiksXy5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwiZmFsc2UiKSl9ZWxzZSBlPT1zKzEmJiEwPT09ZCYmKGw9ci5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19pdGVtW2RhdGEtc2xpZGUtaW5kZXg9IjEiXScpKTtsJiYobC5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfX2l0ZW1fYWN0aXZlIiksbC5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwiZmFsc2UiKSksd2luZG93LnRfc2xkc19faXNpT1MmJnRfc2xkc19faGlkZU1vYmlsZVNsaWRlcyhsKSx0X3NsZHNfX3NldFRhYmluZGV4Rm9yRm9jdXNhYmxlRWxlbWVudHModCl9fWZ1bmN0aW9uIHRfc2xkc19fc2V0VGFiaW5kZXhGb3JGb2N1c2FibGVFbGVtZW50cyh0KXt2YXIgZT10X3NsZHNfX2dldFJlYyh0KTtpZihlKXt2YXIgcz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKSxyPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbV9hY3RpdmUiKTtpZihyKXt2YXIgaT0nYSwgYnV0dG9uLCBpbnB1dDpub3QoW3R5cGU9ImhpZGRlbiJdKSwgc2VsZWN0LCB0ZXh0YXJlYSwgdmlkZW8sIGlmcmFtZScsYT1zLnF1ZXJ5U2VsZWN0b3JBbGwoaSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLChmdW5jdGlvbih0KXt0LnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCItMSIpfSkpO3ZhciBsPXIucXVlcnlTZWxlY3RvckFsbChpKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGwsKGZ1bmN0aW9uKHQpe3Quc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsIjAiKX0pKX19fWZ1bmN0aW9uIHRfc2xkc19TbGlkZXJXaWR0aCh0KXt2YXIgZT10X3NsZHNfX2dldFJlYyh0KTtpZihlKXt2YXIgcz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NvbnRhaW5lciIpO2lmKHMpe3ZhciByPWdldENvbXB1dGVkU3R5bGUocyksaT1wYXJzZUludChyLnBhZGRpbmdMZWZ0KXx8MCxhPXBhcnNlSW50KHIucGFkZGluZ1JpZ2h0KXx8MCxsPXMuY2xpZW50V2lkdGgtKGkrYSksZD1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW06bm90KC50LXNsZHNfX2l0ZW1fZHVtbXkpIikubGVuZ3RoLG89ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIiksbjtpZigidHJ1ZSIhPW8uZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wIikpe3ZhciBjPTA7byYmKGM9by5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIpLG8uc3R5bGUud2lkdGg9bCpkKyJweCIpLHdpbmRvdy5pbm5lcldpZHRoPD02NDA/Yz0xOndpbmRvdy5pbm5lcldpZHRoPD05NjAmJmM+MSYmKGM9Mik7dmFyIF89Yz4xP2wvYzpsO2lmKF8+MCl7dmFyIHU9ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtIik7byYmKHU9by5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtIikpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodSwoZnVuY3Rpb24odCl7dC5zdHlsZS53aWR0aD1fKyJweCJ9KSl9fX19fWZ1bmN0aW9uIHRfc2xkc19TbGlkZXJIZWlnaHQodCl7dmFyIGU9dF9zbGRzX19nZXRSZWModCk7aWYoZSl7dmFyIHM9ZS5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19pdGVtcy13cmFwcGVyOm5vdChbZGF0YS1zbGlkZXItY29ycmVjdC1oZWlnaHQ9ImZhbHNlIl0pJyk7aWYocyl7dmFyIHI9cy5jbGFzc0xpc3QuY29udGFpbnMoImpzLWZlZWQtY29udGFpbmVyIiksaT1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1fYWN0aXZlIiksYTtpZihpKXt2YXIgbD1wYXJzZUludChnZXRDb21wdXRlZFN0eWxlKGkpLnBhZGRpbmdUb3ApfHwwLGQ9cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShpKS5wYWRkaW5nQm90dG9tKXx8MDthPWkuY2xpZW50SGVpZ2h0LShsK2QpfWEmJnMmJihzLnN0eWxlLmhlaWdodD1yPyIiOmErInB4Iil9fX1mdW5jdGlvbiB0X3NsZHNfVXBkYXRlU2xpZGVySGVpZ2h0KHQpe3ZhciBlPXRfc2xkc19fZ2V0UmVjKHQpO2lmKGUpe3ZhciBzPWUucXVlcnlTZWxlY3RvcignLnQtc2xkc19faXRlbXMtd3JhcHBlcjpub3QoW2RhdGEtc2xpZGVyLWNvcnJlY3QtaGVpZ2h0PSJmYWxzZSJdKScpO2lmKHMpe3ZhciByPXMuY2xhc3NMaXN0LmNvbnRhaW5zKCJqcy1mZWVkLWNvbnRhaW5lciIpLGk9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtX2FjdGl2ZSIpLGE7aWYoaSl7dmFyIGw9cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShpKS5wYWRkaW5nVG9wKXx8MCxkPXBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoaSkucGFkZGluZ0JvdHRvbSl8fDA7YT1pLmNsaWVudEhlaWdodC0obCtkKX0wIT09YSYmcyYmKHMuc3R5bGUuaGVpZ2h0PXI/IiI6YSsicHgiKX19fWZ1bmN0aW9uIHRfc2xkc19TbGlkZXJBcnJvd3NIZWlnaHQodCl7dmFyIGU9dF9zbGRzX19nZXRSZWModCk7aWYoZSl7dmFyIHM9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtX2FjdGl2ZSIpLHI9L0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLGksYT0wO2lmKHMpe3ZhciBsO3MucXVlcnlTZWxlY3RvcigiW2RhdGEtc2xpZGVyLXZpZGVvLXR5cGVdIikmJnImJihhPTQwKTt2YXIgZD1wYXJzZUludChnZXRDb21wdXRlZFN0eWxlKHMpLnBhZGRpbmdUb3ApfHwwLG89cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShzKS5wYWRkaW5nQm90dG9tKXx8MDtpPXMuY2xpZW50SGVpZ2h0LShkK28pLWF9dmFyIG49ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19hcnJvd193cmFwcGVyIik7aSYmbi5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24odCl7dC5zdHlsZS5oZWlnaHQ9aSsicHgiO3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3ciKTtlJiYoZS5zdHlsZS5tYXJnaW5Ub3A9YS8yKyJweCIpfSkpLHRfc2xkc19maXhBcnJvd3NJbkNhdGFsb2coZSxzLG4scil9fWZ1bmN0aW9uIHRfc2xkc19VcGRhdGVTbGlkZXJBcnJvd3NIZWlnaHQodCl7dmFyIGU9dF9zbGRzX19nZXRSZWModCk7aWYoZSl7dmFyIHM9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtX2FjdGl2ZSIpLHI9L0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLGksYT0wO2lmKHMpe3ZhciBsO3MucXVlcnlTZWxlY3RvcigiW2RhdGEtc2xpZGVyLXZpZGVvLXR5cGVdIikmJnImJihhPTQwKTt2YXIgZD1wYXJzZUludChnZXRDb21wdXRlZFN0eWxlKHMpLnBhZGRpbmdUb3ApfHwwLG89cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShzKS5wYWRkaW5nQm90dG9tKXx8MDtpPXMuY2xpZW50SGVpZ2h0LShkK28pLWF9dmFyIG49ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19hcnJvd193cmFwcGVyIik7aSYmbi5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24odCl7dC5zdHlsZS5oZWlnaHQ9aSsicHgiO3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3ciKTtlJiYoZS5zdHlsZS5tYXJnaW5Ub3A9YS8yKyJweCIpfSkpLHRfc2xkc19maXhBcnJvd3NJbkNhdGFsb2coZSxzLG4scil9fWZ1bmN0aW9uIHRfc2xkc19maXhBcnJvd3NJbkNhdGFsb2codCxlLHMscil7aWYoZSYmciYmKHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWNhdGFsb2dfX3JlbGV2YW50cy1ncmlkLWNvbnQiKXx8dC5jbGFzc0xpc3QuY29udGFpbnMoInQtc3RvcmVfX3JlbGV2YW50cy1ncmlkLWNvbnQiKSkpe3ZhciBpPWUucXVlcnlTZWxlY3RvcigiLmpzLXByb2R1Y3QtaW1nIik7aWYoaSl7dmFyIGE9d2luZG93LmdldENvbXB1dGVkU3R5bGUoaSksbD0ocGFyc2VGbG9hdChhLm1hcmdpblRvcCl8fDApKyhwYXJzZUZsb2F0KGEubWFyZ2luQm90dG9tKXx8MCksZD1NYXRoLmNlaWwoaS5vZmZzZXRIZWlnaHQrbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChzLChmdW5jdGlvbih0KXt2YXIgZT10Lm9mZnNldEhlaWdodCxzPShkLWUpLzI7dC5zdHlsZS50b3A9cysicHgiLHQuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVZKDApIn0pKX19fWZ1bmN0aW9uIHRfc2xkc19pbml0QXV0b1BsYXkodCxlLHMscil7dmFyIGk9Im9iamVjdCI9PXR5cGVvZiB0LGE9aT90WzBdOmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNyZWMiK3QpO2lmKGEpe3ZhciBsPWEucXVlcnlTZWxlY3RvcigiLnQtc2xkcyIpLGQ9YS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIik7aWYoZCl7dmFyIG89cGFyc2VGbG9hdChkLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdGltZW91dCIpKSxuPSIiLGM9ZC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWludGVydmFsLWlkIiksXz1lLHU7aWYoYyYmY2xlYXJJbnRlcnZhbChjKSwidHJ1ZSIhPT1kLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcCIpKXt2YXIgcDshL0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiZsJiYobC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLChmdW5jdGlvbigpe2Quc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkIiwieWVzIil9KSksbC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsKGZ1bmN0aW9uKCl7InkiIT09ZC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQtYnktdmlkZW8iKSYmZC5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQiLCIiKX0pKSk7dmFyIGY9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0LG09ZithLm9mZnNldEhlaWdodCx5LHY7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXtmPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldCxtPWYrYS5vZmZzZXRIZWlnaHR9KSkpLHZvaWQgMCE9PWRvY3VtZW50LmhpZGRlbj8oeT0iaGlkZGVuIix2PSJ2aXNpYmlsaXR5Y2hhbmdlIik6dm9pZCAwIT09ZG9jdW1lbnQubXNIaWRkZW4/KHk9Im1zSGlkZGVuIix2PSJtc3Zpc2liaWxpdHljaGFuZ2UiKTp2b2lkIDAhPT1kb2N1bWVudC53ZWJraXRIaWRkZW4mJih5PSJ3ZWJraXRIaWRkZW4iLHY9IndlYmtpdHZpc2liaWxpdHljaGFuZ2UiKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHYsKGZ1bmN0aW9uKCl7aWYoZG9jdW1lbnRbeV0pZC5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQiLCJ5ZXMiKTtlbHNle3ZhciB0PWdldENvbXB1dGVkU3R5bGUoYSkuZGlzcGxheSxlPXdpbmRvdy5wYWdlWU9mZnNldCxzPWUrd2luZG93LmlubmVySGVpZ2h0O2Y9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0LChtPWYrYS5vZmZzZXRIZWlnaHQpPmUmJmY8cyYmIm5vbmUiIT09dCYmInkiIT09ZC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQtYnktdmlkZW8iKSYmZC5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQiLCIiKX19KSwhMSksMT09PWEubGVuZ3RoJiZ3aW5kb3cuYmluZCgic2Nyb2xsIix0X3Rocm90dGxlKChmdW5jdGlvbigpe3ZhciB0PWdldENvbXB1dGVkU3R5bGUoYSkuZGlzcGxheSxlPXdpbmRvdy5wYWdlWU9mZnNldCxzPWUrd2luZG93LmlubmVySGVpZ2h0OyJub25lIiE9PXQ/KGY9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0LChtPWYrYS5vZmZzZXRIZWlnaHQpPmUmJmY8cyYmInkiIT09ZC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQtYnktdmlkZW8iKT9kLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcHBlZCIsIiIpOiIiPT09ZC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQiKSYmZC5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQiLCJ5ZXMiKSk6aXx8ZC5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQiLCJ5ZXMiKX0pKSk7dmFyIGc9c2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7dmFyIGU9ZC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQiKSxpPWQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1hdXRvcGxheS1pZ25vcmUtaG92ZXIiKSxsPWQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10b3VjaCIpLG89dF9zbGRzX2dldEN1cnJlbnRUcmFuc2xhdGUoYSk7InllcyIhPWUmJiJ5ZXMiIT1pJiYieWVzIiE9bCYmKCJmYWxzZSI9PWQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci13aXRoLWN5Y2xlIikmJl89PXM/Xz1zOl8rKyxkLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIixfKSxfIT1zKzEmJjAhPV98fChuPSJ5ZXMiKSx0X3NsaWRlTW92ZVdpdGhvdXRBbmltYXRpb24odCwhMCxyLG8pLHRfc2xkc191cGRhdGVTbGlkZXIodCksInllcyI9PW4mJihfPT1zKzEmJihfPTEpLDA9PV8mJihfPXMpLGQuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiLF8pKSxkLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY3ljbGUiLG4pKX0pLG8pO2Quc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pbnRlcnZhbC1pZCIsZyl9fX19ZnVuY3Rpb24gdF9zbGRzX3Bvc2l0aW9uQXJyb3dzKHQpe3ZhciBlPXRfc2xkc19fZ2V0UmVjKHQpO2lmKGUpe3ZhciBzPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3dfY29udGFpbmVyLW91dHNpZGUiKSxyPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbSIpO2lmKHIpe3ZhciBpPXIub2Zmc2V0V2lkdGgsYT1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2Fycm93LWxlZnQiKT9lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2Fycm93LWxlZnQiKS5vZmZzZXRXaWR0aDowLGw9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvdy1yaWdodCIpP2UucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3ctcmlnaHQiKS5vZmZzZXRXaWR0aDowO3MmJihzLnN0eWxlLm1heFdpZHRoPWErbCtpKzEyMCsicHgiKX19fWZ1bmN0aW9uIHRfc2xkc19pbml0U2xpZGVyU3dpcGUodCxlLHMscil7dmFyIGk9dF9zbGRzX19nZXRSZWModCk7aWYoaSl7dmFyIGE9aS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19tYWluIik7aWYoYSl7dmFyIGw9aS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIik7aWYobCl7dmFyIGQsbz0hMSxuPSExLGMsXztpZigidHJ1ZSIhPT1sLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcCIpKWlmKCJ0cnVlIiE9PWwuZ2V0QXR0cmlidXRlKCJkYXRhLXN3aXBlci1pbml0aWFsaXplZCIpKXtkZWxldGUgSGFtbWVyLmRlZmF1bHRzLmNzc1Byb3BzLnVzZXJTZWxlY3Qsd2luZG93LmhhbW1lcj1uZXcgSGFtbWVyKGEse2RvbUV2ZW50czohMCxpbnB1dENsYXNzOkhhbW1lci5Ub3VjaElucHV0LHJlY29nbml6ZXJzOltbSGFtbWVyLlBhbix7ZGlyZWN0aW9uOkhhbW1lci5ESVJFQ1RJT05fSE9SSVpPTlRBTH1dXX0pLGwuc2V0QXR0cmlidXRlKCJkYXRhLXN3aXBlci1pbml0aWFsaXplZCIsInRydWUiKTt2YXIgdT1mdW5jdGlvbiB0KGUpe3dpbmRvdy5wYWdlWU9mZnNldD5pLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSt3aW5kb3cucGFnZVlPZmZzZXR8fHdpbmRvdy5wYWdlWU9mZnNldCtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0PGkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldD9sLnNldEF0dHJpYnV0ZShlLCJ5ZXMiKToieSIhPT1sLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcHBlZC1ieS12aWRlbyIpJiZsLnNldEF0dHJpYnV0ZShlLCIiKX0scD0ib250b3VjaGVuZCJpbiBkb2N1bWVudD8iZGF0YS1zbGlkZXItdG91Y2giOiJkYXRhLXNsaWRlci1zdG9wcGVkIixmO2lmKCJJbnRlcnNlY3Rpb25PYnNlcnZlciJpbiB3aW5kb3cpbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChmdW5jdGlvbih0KXt2YXIgZT10WzBdO2wuc2V0QXR0cmlidXRlKHAsZS5pc0ludGVyc2VjdGluZz8iIjoieWVzIil9KSkub2JzZXJ2ZShpKTtlbHNlIHUocCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsKGZ1bmN0aW9uKCl7bz0hMCxjbGVhclRpbWVvdXQoZCksZD1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3UocCksbz0hMX0pLDI1MCl9KSk7aWYoMSE9ZSl7dmFyIG09ZnVuY3Rpb24gdChlKXtyZXR1cm4hbnx8KGUucHJldmVudERlZmF1bHQoKSwhMSl9LHk9aS5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2VsZW0iKSx2PXRfc2xkc19nZXRFdmVudHNGb3JaZXJvQmxvY2soKSxnPXYubW92ZVNsaWRlU3RhcnRFdmVudCxiPXYubW92ZVNsaWRlRW5kRXZlbnQ7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsbSx7cGFzc2l2ZTohMX0pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLG0se3Bhc3NpdmU6ITF9KSx3aW5kb3cuaGFtbWVyLm9uKCJwYW4iLChmdW5jdGlvbihlKXtpZihvKXJldHVybiExO249ITAseSYmaS5kaXNwYXRjaEV2ZW50KGcpO3ZhciBzPWkucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpLGE9cy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIpfHwwLGw9YT4xLGQ9bD9pLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NvbnRhaW5lciAudC1zbGRzX19pdGVtIikub2Zmc2V0V2lkdGg6aS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19jb250YWluZXIiKS5vZmZzZXRXaWR0aCxjPXBhcnNlRmxvYXQocy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIpKSxfPXBhcnNlRmxvYXQocy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRvdGFsc2xpZGVzIikpLHU9IiIscD1lLmRlbHRhWCxmPTEwMC9fKmUuZGVsdGFYL3dpbmRvdy5pbm5lcldpZHRoLG09MzAsdjtpZigidHJ1ZSI9PT1zLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcCIpKXJldHVybiExO2lmKHMuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10b3VjaCIsInllcyIpLHRfc2xkc19zY3JvbGxJbWFnZXModCxkKmMtcCksZS5pc0ZpbmFsKXtpZihlLnZlbG9jaXR5WD4uNCkiZmFsc2UiPT1zLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItd2l0aC1jeWNsZSIpJiYxPT1jP2M9MTpjLS0scy5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIsYyksMD09YyYmKHU9InllcyIpLHMuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1jeWNsZSIsdSksdF9zbGlkZU1vdmUodCwhMSxyKTtlbHNlIGlmKGUudmVsb2NpdHlYPC0uNCl7aWYoImZhbHNlIj09cy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXdpdGgtY3ljbGUiKSYmKGM9PV98fGwmJmM9PV8tYSsxKSljPWw/Xy1hOl87ZWxzZXt2YXIgYj1pLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW06bm90KC50LXNsZHNfX2l0ZW1fZHVtbXkpIiksaD1iW2IubGVuZ3RoLTFdLEE9cGFyc2VGbG9hdChoLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZS1pbmRleCIpLDEwKTtpZihBPF8mJmM9PUEpe3ZhciBTPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpO1MuaW5pdEV2ZW50KCJmZWVkc0xhc3RTbGlkZSIsITAsITApLHMuZGlzcGF0Y2hFdmVudChTKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmZWVkc0xvYWRTbGlkZSIsKGZ1bmN0aW9uKCl7dF9zbGRzX3VwZGF0ZVNsaWRlcih0KX0pKX1jKyt9cy5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIsYyksYz09XysxJiYodT0ieWVzIikscy5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWN5Y2xlIix1KSx0X3NsaWRlTW92ZSh0LCExLHIpfWVsc2UgZjw9LTMwL18/KCJmYWxzZSI9PXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci13aXRoLWN5Y2xlIikmJihjPT1ffHxsJiZjPT1fLWErMSk/Yz1sP18tYTpfOmMrKyxzLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIixjKSxjPT1fKzEmJih1PSJ5ZXMiKSxzLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY3ljbGUiLHUpLHRfc2xpZGVNb3ZlKHQsITEscikpOmY+PW0vXz8oImZhbHNlIj09cy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXdpdGgtY3ljbGUiKSYmMT09Yz9jPTE6Yy0tLHMuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiLGMpLDA9PWMmJih1PSJ5ZXMiKSxzLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY3ljbGUiLHUpLHRfc2xpZGVNb3ZlKHQsITEscikpOnRfc2xpZGVNb3ZlKHQsITEscik7cy5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRvdWNoIiwiIiksbj0hMX1yZXR1cm4hMH0pKSx3aW5kb3cuaGFtbWVyLm9uKCJwYW5lbmQiLChmdW5jdGlvbigpe3kmJmkuZGlzcGF0Y2hFdmVudChiKSx0X3NsaWRlTW92ZSh0LCExLHIpLG49ITF9KSl9fX19fX1mdW5jdGlvbiB0X3NsZHNfZ2V0Q3VycmVudFRyYW5zbGF0ZSh0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKTtpZihlKXt2YXIgcz1nZXRDb21wdXRlZFN0eWxlKGUpLnRyYW5zZm9ybTtpZih2b2lkIDAhPT1zJiYiIiE9PXMpe3ZhciByPXMubWF0Y2goL1xkKy9nKTtpZihudWxsIT09cilyZXR1cm4gcGFyc2VJbnQoclswXSwxMCl9fX1mdW5jdGlvbiB0X3NsZHNfY2hhbmdlSW1hZ2VVcmwodCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxzPWUmJiJ5ZXMiPT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbGF6eSIpLHI9dF9zbGRzX19nZXRSZWModCksaTtyJiYoaT1zP3IucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faW1nOm5vdChbZGF0YS1vcmlnaW5hbF0pIik6ci5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pbWciKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJkYXRhLXNyYyIpO2UmJih0LnNldEF0dHJpYnV0ZSgic3JjIixlKSx0LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1zcmMiKSl9KSkpfWZ1bmN0aW9uIHRfc2xkc19vbkhhbW1lckxvYWQodCxlLHMpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3dbdF0pZSgpO2Vsc2UgdmFyIHI9RGF0ZS5ub3coKSxpPXNldFRpbWVvdXQoKGZ1bmN0aW9uIGEoKXt2YXIgbD1EYXRlLm5vdygpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB3aW5kb3dbdF0pe2lmKGwtcj43ZTMpdGhyb3cgbmV3IEVycm9yKHQrIiBpcyB1bmRlZmluZWQiKTtpPXNldFRpbWVvdXQoYSxzfHwxMDApfWVsc2UgZSgpfSkpfWZ1bmN0aW9uIHRfc2xkc19mYWRlT3V0KHQsZSxzKXtpZigibm9uZSIhPT10LnN0eWxlLmRpc3BsYXkmJiF0LmdldEF0dHJpYnV0ZSgiZGF0YS1mYWRlb3V0LXRpbWVvdXQiKSl7dmFyIHI9MSxpPXBhcnNlSW50KGUpLGEsbD1zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXt0LnN0eWxlLm9wYWNpdHk9ciwoci09LjEpPD0uMSYmKGNsZWFySW50ZXJ2YWwobCksdC5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtZmFkZW91dC10aW1lb3V0IiksdC5zdHlsZS5kaXNwbGF5PSJub25lIiwiZnVuY3Rpb24iPT10eXBlb2YgcyYmcygpKX0pLGk+MD9pLzEwOjQwKTt0LnNldEF0dHJpYnV0ZSgiZGF0YS1mYWRlb3V0LXRpbWVvdXQiLGwpfX1mdW5jdGlvbiB0X3NsZHNfZmFkZUluKHQsZSxzKXtpZigoIjEiIT09Z2V0Q29tcHV0ZWRTdHlsZSh0KS5vcGFjaXR5JiYiIiE9PWdldENvbXB1dGVkU3R5bGUodCkub3BhY2l0eXx8Im5vbmUiPT09Z2V0Q29tcHV0ZWRTdHlsZSh0KS5kaXNwbGF5KSYmIXQuZ2V0QXR0cmlidXRlKCJkYXRhLWZhZGVpbi10aW1lb3V0Iikpe3ZhciByPTAsaT1wYXJzZUludChlKSxhPWk+MD9pLzEwOjQwO3Quc3R5bGUub3BhY2l0eT1yLHQuc3R5bGUuZGlzcGxheT0iYmxvY2siO3ZhciBsPXNldEludGVydmFsKChmdW5jdGlvbigpe3Quc3R5bGUub3BhY2l0eT1yLChyKz0uMSk+PTEmJihjbGVhckludGVydmFsKGwpLHQucmVtb3ZlQXR0cmlidXRlKCJkYXRhLWZhZGVpbi10aW1lb3V0IiksImZ1bmN0aW9uIj09dHlwZW9mIHMmJnMoKSl9KSxhKTt0LnNldEF0dHJpYnV0ZSgiZGF0YS1mYWRlaW4tdGltZW91dCIsbCl9fWZ1bmN0aW9uIHRfc2xkc19yYW5kb21Tb3J0RWxlbWVudHModCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCk7aWYoIWUubGVuZ3RoKXJldHVybltdO2Uuc29ydCgoZnVuY3Rpb24oKXtyZXR1cm4uNS1NYXRoLnJhbmRvbSgpfSkpO3ZhciBzPXRbMF0ucGFyZW50Tm9kZTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbih0KXtzLmFwcGVuZENoaWxkKHQpfSkpLGV9ZnVuY3Rpb24gdF9zbGRzX19wcm9jY2Vzc1ZpZGVvKHQpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSxzKXt0X29uRnVuY0xvYWQoInRfdmlkZW9fX2NyZWF0ZVBsYXllciIsKGZ1bmN0aW9uKCl7dF92aWRlb19fY3JlYXRlUGxheWVyKHQpLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiBlKHQpfSkpLmNhdGNoKChmdW5jdGlvbih0KXtyZXR1cm4gcyh0KX0pKX0pKX0pKX1mdW5jdGlvbiB0X3NsZHNfZ2V0RXZlbnRzRm9yWmVyb0Jsb2NrKCl7dmFyIHQsZTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50Pyh0PW5ldyBDdXN0b21FdmVudCgidGlsZGFTbGRzTW92ZVNsaWRlU3RhcnQiKSxlPW5ldyBDdXN0b21FdmVudCgidGlsZGFTbGRzTW92ZVNsaWRlRW5kIikpOigodD1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSkuaW5pdEN1c3RvbUV2ZW50KCJ0aWxkYVNsZHNNb3ZlU2xpZGVTdGFydCIsITAsITApLChlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpKS5pbml0Q3VzdG9tRXZlbnQoInRpbGRhU2xkc01vdmVTbGlkZUVuZCIsITAsITApKSx7bW92ZVNsaWRlU3RhcnRFdmVudDp0LG1vdmVTbGlkZUVuZEV2ZW50OmV9fWZ1bmN0aW9uIHRfc2xkc19fZ2V0UmVjKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjcmVjIit0KTp0IGluc3RhbmNlb2YgRWxlbWVudD90OnRbMF19ZnVuY3Rpb24gdF90cmlnZ2VyRXZlbnQodCxlKXt2YXIgcztkb2N1bWVudC5jcmVhdGVFdmVudD8ocz1kb2N1bWVudC5jcmVhdGVFdmVudCgiSFRNTEV2ZW50cyIpKS5pbml0RXZlbnQoZSwhMCwhMSk6ZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3QmJigocz1kb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCgpKS5ldmVudFR5cGU9ZSkscy5ldmVudE5hbWU9ZSx0LmRpc3BhdGNoRXZlbnQ/dC5kaXNwYXRjaEV2ZW50KHMpOnQuZmlyZUV2ZW50P3QuZmlyZUV2ZW50KCJvbiIrcy5ldmVudFR5cGUscyk6dFtlXT90W2VdKCk6dFsib24iK2VdJiZ0WyJvbiIrZV0oKX13aW5kb3cudF9zbGRzX19pc2lPUz0vaVBob25lfGlQYWR8aVBvZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl8fG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTWFjaW50b3NoIikmJiJvbnRvdWNoZW5kImluIGRvY3VtZW50O3ZhciBERUJVRz0hMTtmdW5jdGlvbiBzZXRJbXBvcnRhbnRTdHlsZSh0LGUscyl7dC5zdHlsZS5zZXRQcm9wZXJ0eShlLHMsImltcG9ydGFudCIpfWZ1bmN0aW9uIGdldEdhbGxlcnlDb250YWluZXIoKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1wb3B1cCIpO2lmKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQtY2F0YWxvZ19fcmVsZXZhbnRzX19jb250YWluZXIsIC50LXN0b3JlX19yZWxldmFudHNfX2NvbnRhaW5lciIpO2lmKGUpcmV0dXJuIGV9cmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LWNhdGFsb2dfX3JlbGV2YW50c19fY29udGFpbmVyLCAudC1zdG9yZV9fcmVsZXZhbnRzX19jb250YWluZXIiKX1mdW5jdGlvbiBhcHBseUJhc2VTdHlsZXModCl7Zm9yKHZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLmpzLXByb2R1Y3QiKSxzPTA7czxlLmxlbmd0aDtzKyspZm9yKHZhciByLGk9ZVtzXS5xdWVyeVNlbGVjdG9yQWxsKCIudC1jYXRhbG9nX19jYXJkX190ZXh0d3JhcHBlciwgLnQtc3RvcmVfX2NhcmRfX3RleHR3cmFwcGVyIiksYT0wO2E8aS5sZW5ndGg7YSsrKXt2YXIgbD1pW2FdO3NldEltcG9ydGFudFN0eWxlKGwsIm1hcmdpbi1ib3R0b20iLCIwcHgiKSxzZXRJbXBvcnRhbnRTdHlsZShsLCJtYXJnaW4tdG9wIiwiYXV0byIpLHNldEltcG9ydGFudFN0eWxlKGwsImp1c3RpZnktY29udGVudCIsImZsZXgtc3RhcnQiKTt2YXIgZD1sLnF1ZXJ5U2VsZWN0b3IoIi5qcy1jYXRhbG9nLXByb2QtbmFtZSwgLmpzLXN0b3JlLXByb2QtbmFtZSIpO2QmJihzZXRJbXBvcnRhbnRTdHlsZShkLCJkaXNwbGF5IiwiLXdlYmtpdC1ib3giKSxzZXRJbXBvcnRhbnRTdHlsZShkLCItd2Via2l0LWJveC1vcmllbnQiLCJ2ZXJ0aWNhbCIpLHNldEltcG9ydGFudFN0eWxlKGQsIi13ZWJraXQtbGluZS1jbGFtcCIsIjIiKSxzZXRJbXBvcnRhbnRTdHlsZShkLCJvdmVyZmxvdyIsImhpZGRlbiIpLHNldEltcG9ydGFudFN0eWxlKGQsInRleHQtb3ZlcmZsb3ciLCJlbGxpcHNpcyIpLHNldEltcG9ydGFudFN0eWxlKGQsIm1heC1oZWlnaHQiLCJjYWxjKDEuNWVtICogMikiKSxzZXRJbXBvcnRhbnRTdHlsZShkLCJwYWRkaW5nLWJvdHRvbSIsInVuc2V0IikpO3ZhciBvPWwucXVlcnlTZWxlY3RvcigiLmpzLWNhdGFsb2ctcHJvZC1kZXNjciwgLmpzLXN0b3JlLXByb2QtZGVzY3IiKTtvJiYoc2V0SW1wb3J0YW50U3R5bGUobywiZGlzcGxheSIsIi13ZWJraXQtYm94Iiksc2V0SW1wb3J0YW50U3R5bGUobywiLXdlYmtpdC1ib3gtb3JpZW50IiwidmVydGljYWwiKSxzZXRJbXBvcnRhbnRTdHlsZShvLCItd2Via2l0LWxpbmUtY2xhbXAiLCIxIiksc2V0SW1wb3J0YW50U3R5bGUobywib3ZlcmZsb3ciLCJoaWRkZW4iKSxzZXRJbXBvcnRhbnRTdHlsZShvLCJ0ZXh0LW92ZXJmbG93IiwiZWxsaXBzaXMiKSxzZXRJbXBvcnRhbnRTdHlsZShvLCJwYWRkaW5nLWJvdHRvbSIsInVuc2V0IikpfURFQlVHJiZjb25zb2xlLmluZm8oItCR0LDQt9C+0LLRi9C1INGB0YLQuNC70Lgg0L/RgNC40LzQtdC90LXQvdGLLiIpfWZ1bmN0aW9uIGdldFJlZmVyZW5jZUhlaWdodCgpe3ZhciB0PWdldEdhbGxlcnlDb250YWluZXIoKTtpZighdClyZXR1cm4gMDt0Lm9mZnNldEhlaWdodDtmb3IodmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIuanMtcHJvZHVjdCIpLHM9MDtzPGUubGVuZ3RoO3MrKyl7dmFyIHI9ZVtzXTtpZigibm9uZSIhPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShyKS5kaXNwbGF5JiYwIT09ci5vZmZzZXRIZWlnaHQmJnIucXVlcnlTZWxlY3RvcigiLmpzLXByb2R1Y3QtaW1nIikpe3ZhciBpPXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O3JldHVybiBERUJVRyYmY29uc29sZS5pbmZvKCLQntC/0L7RgNC90LDRjyDQutCw0YDRgtC+0YfQutCwINC90LDQudC00LXQvdCwLiDQktGL0YHQvtGC0LA6IixpKSxpfX1yZXR1cm4gREVCVUcmJmNvbnNvbGUuaW5mbygi0J3QtSDQvdCw0LnQtNC10L3QsCDQstC40LTQuNC80LDRjyDQutCw0YDRgtC+0YfQutCwINGBINC40LfQvtCx0YDQsNC20LXQvdC40LXQvC4iKSwwfWZ1bmN0aW9uIHVwZGF0ZU5vSW1hZ2VDYXJkSGVpZ2h0cygpe3JlcXVlc3RBbmltYXRpb25GcmFtZSgoZnVuY3Rpb24oKXt2YXIgdD1nZXRSZWZlcmVuY2VIZWlnaHQoKTtpZighKHQ8PTApKXt2YXIgZT1nZXRHYWxsZXJ5Q29udGFpbmVyKCk7aWYoZSlmb3IodmFyIHM9ZS5xdWVyeVNlbGVjdG9yQWxsKCIuanMtcHJvZHVjdCIpLHI9MDtyPHMubGVuZ3RoO3IrKyl7dmFyIGk9c1tyXTtpLnF1ZXJ5U2VsZWN0b3IoIi5qcy1wcm9kdWN0LWltZyIpP2kuc3R5bGUuaGVpZ2h0PSIiOihpLnN0eWxlLmNzc1RleHQrPSI7IGhlaWdodDogIit0KyJweCAhaW1wb3J0YW50OyIsREVCVUcmJmNvbnNvbGUuaW5mbygi0KPRgdGC0LDQvdC+0LLQu9C10L3QsCDQstGL0YHQvtGC0LAg0LTQu9GPINC60LDRgNGC0L7Rh9C60Lgg0LHQtdC3INC40LfQvtCx0YDQsNC20LXQvdC40Y86Iix0KSl9fX0pKX1mdW5jdGlvbiBhdHRhY2hJbWFnZUxvYWRMaXN0ZW5lcnMoKXt2YXIgdD1nZXRHYWxsZXJ5Q29udGFpbmVyKCk7aWYodClmb3IodmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIuanMtcHJvZHVjdC1pbWciKSxzPTA7czxlLmxlbmd0aDtzKyspe3ZhciByPWVbc107ci5jb21wbGV0ZXx8ci5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoZnVuY3Rpb24oKXtERUJVRyYmY29uc29sZS5pbmZvKCLQmNC30L7QsdGA0LDQttC10L3QuNC1INC30LDQs9GA0YPQt9C40LvQvtGB0YwsINC+0LHQvdC+0LLQu9GP0LXQvCDQstGL0YHQvtGC0YMiKSx1cGRhdGVOb0ltYWdlQ2FyZEhlaWdodHMoKX0pKX19ZnVuY3Rpb24gYWRkRW1wdHlEZXNjclBsYWNlaG9sZGVyKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLmpzLWNhdGFsb2ctcHJvZC1kZXNjci50LWNhdGFsb2dfX2NhcmRfX2Rlc2NyLCAuanMtc3RvcmUtcHJvZC1kZXNjci50LXN0b3JlX19jYXJkX19kZXNjciIpO2lmKGUpe3ZhciBzPWdldENvbXB1dGVkU3R5bGUoZSkscj1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCxpPXMucGFkZGluZ1RvcDt0LnF1ZXJ5U2VsZWN0b3JBbGwoIi5qcy1wcm9kdWN0IikuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoIXQucXVlcnlTZWxlY3RvcigiLmpzLWNhdGFsb2ctcHJvZC1kZXNjci50LWNhdGFsb2dfX2NhcmRfX2Rlc2NyLCAuanMtc3RvcmUtcHJvZC1kZXNjci50LXN0b3JlX19jYXJkX19kZXNjciIpKXt2YXIgcz10LnF1ZXJ5U2VsZWN0b3IoIi50LWNhdGFsb2dfX2NhcmRfX3RleHR3cmFwcGVyLCAudC1zdG9yZV9fY2FyZF9fdGV4dHdyYXBwZXIiKSxhPXMmJnMucXVlcnlTZWxlY3RvcigiLmpzLWNhdGFsb2ctcHJpY2Utd3JhcHBlciwgLmpzLXN0b3JlLXByaWNlLXdyYXBwZXIiKTtpZihzJiZhKXt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtsLmNsYXNzTmFtZT1lLmNsYXNzTmFtZSxsLnN0eWxlLnNldFByb3BlcnR5KCJoZWlnaHQiLHIrInB4IiwiaW1wb3J0YW50IiksbC5zdHlsZS5zZXRQcm9wZXJ0eSgicGFkZGluZy10b3AiLGksImltcG9ydGFudCIpLGwuc3R5bGUuc2V0UHJvcGVydHkoIm1hcmdpbi1ib3R0b20iLCIwcHgiLCJpbXBvcnRhbnQiKSxsLnN0eWxlLnNldFByb3BlcnR5KCJkaXNwbGF5IiwiLXdlYmtpdC1ib3giLCJpbXBvcnRhbnQiKSxsLnN0eWxlLnNldFByb3BlcnR5KCItd2Via2l0LWJveC1vcmllbnQiLCJ2ZXJ0aWNhbCIsImltcG9ydGFudCIpLGwuc3R5bGUuc2V0UHJvcGVydHkoIi13ZWJraXQtbGluZS1jbGFtcCIsIjEiLCJpbXBvcnRhbnQiKSxsLnN0eWxlLnNldFByb3BlcnR5KCJvdmVyZmxvdyIsImhpZGRlbiIsImltcG9ydGFudCIpLGwuc3R5bGUuc2V0UHJvcGVydHkoInRleHQtb3ZlcmZsb3ciLCJlbGxpcHNpcyIsImltcG9ydGFudCIpLHMuaW5zZXJ0QmVmb3JlKGwsYSl9fX0pKX19ZnVuY3Rpb24gaW5pdEdhbGxlcnkoKXt2YXIgdD1nZXRHYWxsZXJ5Q29udGFpbmVyKCk7aWYodCl7dC5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtc3R5bGVzLWFwcGxpZWQiKSxhcHBseUJhc2VTdHlsZXModCksdC5kYXRhc2V0LnN0eWxlc0FwcGxpZWQ9InRydWUiLGFkZEVtcHR5RGVzY3JQbGFjZWhvbGRlcih0KSxERUJVRyYmY29uc29sZS5pbmZvKCLQmNC90LjRhtC40LDQu9C40LfQsNGG0LjRjyDQs9Cw0LvQtdGA0LXQuCDQt9Cw0LLQtdGA0YjQtdC90LAuIik7Zm9yKHZhciBlPVs1MDAsMWUzLDE1MDBdLHM9MDtzPGUubGVuZ3RoO3MrKyl7dmFyIHI7c2V0VGltZW91dCgoZnVuY3Rpb24oKXthdHRhY2hJbWFnZUxvYWRMaXN0ZW5lcnMoKSx1cGRhdGVOb0ltYWdlQ2FyZEhlaWdodHMoKX0pLGVbc10pfX1lbHNlIERFQlVHJiZjb25zb2xlLmluZm8oItCa0L7QvdGC0LXQudC90LXRgCDQs9Cw0LvQtdGA0LXQuCDQvdC1INC90LDQudC00LXQvS4iKX1mdW5jdGlvbiBvYnNlcnZlUG9wdXAoKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1wb3B1cCIpLGU7dCYmKCJJbnRlcnNlY3Rpb25PYnNlcnZlciJpbiB3aW5kb3c/bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChmdW5jdGlvbih0LGUpe2Zvcih2YXIgcz0wO3M8dC5sZW5ndGg7cysrKXt2YXIgcjtpZih0W3NdLmlzSW50ZXJzZWN0aW5nKXtERUJVRyYmY29uc29sZS5pbmZvKCLQn9C+0L/QsNC/INCy0LjQtNC40LwuINCY0L3QuNGG0LjQsNC70LjQt9Cw0YbQuNGPINCz0LDQu9C10YDQtdC4INGH0LXRgNC10LcgMTUwMCDQvNGBIiksZS5kaXNjb25uZWN0KCksc2V0VGltZW91dChpbml0R2FsbGVyeSwxNTAwKTticmVha319fSkpLm9ic2VydmUodCk6c2V0VGltZW91dChpbml0R2FsbGVyeSwxNTAwKSl9ZnVuY3Rpb24gb25SZXNpemUoKXtERUJVRyYmY29uc29sZS5pbmZvKCJSZXNpemUg4oCTINC+0LHQvdC+0LLQu9C10L3QuNC1INCy0YvRgdC+0YLRiyDQutCw0YDRgtC+0YfQtdC6IiksdXBkYXRlTm9JbWFnZUNhcmRIZWlnaHRzKCl9ZnVuY3Rpb24gb25Qb3BzdGF0ZSgpe0RFQlVHJiZjb25zb2xlLmluZm8oIlBvcHN0YXRlIOKAkyDQuNC90LjRhtC40LDQu9C40LfQsNGG0LjRjyDQs9Cw0LvQtdGA0LXQuCIpLHNldFRpbWVvdXQoaW5pdEdhbGxlcnksNTAwKX1mdW5jdGlvbiBvblBhZ2VzaG93KHQpe3QucGVyc2lzdGVkJiYoREVCVUcmJmNvbnNvbGUuaW5mbygiUGFnZXNob3cgKNC40Lcg0LrRjdGI0LApIOKAkyDQuNC90LjRhtC40LDQu9C40LfQsNGG0LjRjyDQs9Cw0LvQtdGA0LXQuCIpLGluaXRHYWxsZXJ5KCkpfWZ1bmN0aW9uIG9uV2luZG93TG9hZCgpe2luaXRHYWxsZXJ5KCksb2JzZXJ2ZVBvcHVwKCl9aWYod2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsb25SZXNpemUpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJwb3BzdGF0ZSIsb25Qb3BzdGF0ZSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInBhZ2VzaG93IixvblBhZ2VzaG93KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsb25XaW5kb3dMb2FkKSxkb2N1bWVudC5ib2R5JiYiTXV0YXRpb25PYnNlcnZlciJpbiB3aW5kb3cpe3ZhciBkb21PYnNlcnZlcj1uZXcgTXV0YXRpb25PYnNlcnZlcigoZnVuY3Rpb24oKXtpbml0R2FsbGVyeSgpfSkpO2RvbU9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KX12YXIgcG9sbENvdW50PTAscG9sbEludGVydmFsPXNldEludGVydmFsKChmdW5jdGlvbigpe2luaXRHYWxsZXJ5KCksKytwb2xsQ291bnQ+PTIwJiZjbGVhckludGVydmFsKHBvbGxJbnRlcnZhbCl9KSw1MDApOwoKZnVuY3Rpb24gdF9wcm9kX19pbml0KHQpe3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNyZWMiK3QpO2lmKGUpe3ZhciByPWUucXVlcnlTZWxlY3RvckFsbCgiLmpzLXByb2R1Y3QiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHIsKGZ1bmN0aW9uKHQpe3QucXVlcnlTZWxlY3RvcigiLmpzLXByb2R1Y3Qtb3B0aW9uLCAuanMtcHJvZHVjdC1tdWx0aW9wdGlvbiIpJiZ0X3Byb2RfX2luaXRQcm9kdWN0KHQpfSkpfX1mdW5jdGlvbiB0X3Byb2RfX2luaXRQcm9kdWN0KHQsZSl7dmFyIHI9dDsic3RyaW5nIj09dHlwZW9mIHImJihyPWUpLHRfcHJvZF9faW5pdFByaWNlKHIpLHRfcHJvZF9fYWRkRXZlbnRzX19vcHRpb25zKHIpLHRfcHJvZF9fdXBkYXRlUHJpY2UocixlKX1mdW5jdGlvbiB0X3Byb2RfX2luaXRQcmljZSh0KXt2YXIgZT10O2lmKGUgaW5zdGFuY2VvZiBFbGVtZW50fHwoZT1lWzBdKSxlKXt2YXIgcj1lLnF1ZXJ5U2VsZWN0b3IoIi5qcy1wcm9kdWN0LXByaWNlIik7cnx8KGUuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLCc8ZGl2IHN0eWxlPSJkaXNwbGF5Om5vbmU7IiBjbGFzcz0ianMtcHJvZHVjdC1wcmljZSI+PC9kaXY+Jykscj1lLnF1ZXJ5U2VsZWN0b3IoIi5qcy1wcm9kdWN0LXByaWNlIikpO3ZhciBpPXIudGV4dENvbnRlbnQsbj1yLmdldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LXByaWNlLWRlZiIpLGM9ci5nZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC1wcmljZS1kZWYtc3RyIik7aWYoaSl7aWYoIW4mJiFjKXt2YXIgbz10X3Byb2RfX2NsZWFuUHJpY2UoaSk7ci5zZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC1wcmljZS1kZWYiLG8pLHIuc2V0QXR0cmlidXRlKCJkYXRhLXByb2R1Y3QtcHJpY2UtZGVmLXN0ciIsaS5yZXBsYWNlKC8iL2csIiIpKX19ZWxzZSByLnNldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LXByaWNlLWRlZiIsMCl9fWZ1bmN0aW9uIHRfcHJvZF9fdXBkYXRlUHJpY2UodCxlKXt2YXIgcixpLG4sYz10O2lmKGMgaW5zdGFuY2VvZiBFbGVtZW50fHwoYz1jWzBdKSxjKXt2YXIgbz1jLnF1ZXJ5U2VsZWN0b3IoIi5qcy1wcm9kdWN0LXByaWNlIiksYT1jLnF1ZXJ5U2VsZWN0b3JBbGwoIi5qcy1wcm9kdWN0LW9wdGlvbi12YXJpYW50cyIpLGQscD0wO2lmKG8pe3ZhciBzPW8ucGFyZW50Tm9kZSx1LGw9bnVsbD09KGk9cz0obnVsbD09KHI9cyk/dm9pZCAwOnIuY2xhc3NMaXN0LnZhbHVlLnNwbGl0KC9ccysvKS5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gdC5lbmRzV2l0aCgiX19wcmljZSIpfSkpKT9zOm51bGwpP3ZvaWQgMDppLnBhcmVudE5vZGUsXztsPShudWxsPT0obj1sKT92b2lkIDA6bi5jbGFzc0xpc3QudmFsdWUuc3BsaXQoL1xzKy8pLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmVuZHNXaXRoKCJfX3ByaWNlLXdyYXBwZXIiKX0pKSk/bDpudWxsO3ZhciB2PW8uZ2V0QXR0cmlidXRlKCJkYXRhLXByb2R1Y3QtcHJpY2UtZGVmIik7dio9MTt2YXIgZj0wLHk9ZnVuY3Rpb24gdChlKXtpZihlKXt2YXIgcj10X3Byb2RfX2NsZWFuUHJpY2UoZSk7LTEhPT1lLmluZGV4T2YoIisiKT9wKz1yOjAhPT1wYXJzZUZsb2F0KHIpJiYodj1yKX1lbHNlIGYrPTF9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYSwoZnVuY3Rpb24odCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCJvcHRpb246Y2hlY2tlZCIpLmdldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LXZhcmlhbnQtcHJpY2UiKTt5KGUpfSkpO3ZhciBnPWMucXVlcnlTZWxlY3RvckFsbCgnLmpzLXByb2R1Y3QtbXVsdGlvcHRpb24gaW5wdXRbdHlwZT0iY2hlY2tib3giXTpjaGVja2VkJyksYjtpZihBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGcsKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJkYXRhLXByb2R1Y3QtdmFyaWFudC1wcmljZSIpO3koZSl9KSksZD12K3Asby5jbGFzc0xpc3QuY29udGFpbnMoImpzLXN0b3JlLXByb2QtcHJpY2UtcmFuZ2UtdmFsIil8fG8uY2xhc3NMaXN0LmNvbnRhaW5zKCJqcy1jYXRhbG9nLXByb2QtcHJpY2UtcmFuZ2UtdmFsIikpby5zZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC1wcmljZS1yYW5nZS12YWwiLHRfcHJvZF9fcm91bmRQcmljZShkKSk7ZWxzZSBpZihkPjApe2wmJiJoaWRkZW4iPT09bC5zdHlsZS52aXNpYmlsaXR5JiYobC5zdHlsZS52aXNpYmlsaXR5PSIiKSxzJiYibm9uZSI9PT1zLnN0eWxlLmRpc3BsYXkmJihzLnN0eWxlLmRpc3BsYXk9IiIpO3ZhciBFPXRfcHJvZF9fc2hvd1ByaWNlKHRfcHJvZF9fcm91bmRQcmljZShkKSxlKSxoPW8uZ2V0QXR0cmlidXRlKCJkYXRhLXByb2R1Y3QtcHJpY2UtZGVmLXN0ciIpLHc9Zj09PWEubGVuZ3RoLEE9Yy5jbGFzc0xpc3QuY29udGFpbnMoImpzLXN0b3JlLXByb2R1Y3QiKXx8Yy5jbGFzc0xpc3QuY29udGFpbnMoImpzLWNhdGFsb2ctcHJvZHVjdCIpO2lmKHcmJiFBKXt2YXIgaj10X3Byb2RfX3NhdmVVc2VySW5wdXRJblByaWNlKGQsRSxoKTtvLmlubmVySFRNTD1qfWVsc2Ugby5pbm5lckhUTUw9RX1lbHNlIGwmJiIiPT09bC5zdHlsZS52aXNpYmlsaXR5JiYobC5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iKSxzJiYiIj09PXMuc3R5bGUuZGlzcGxheSYmKHMuc3R5bGUuZGlzcGxheT0ibm9uZSIpLG8uaW5uZXJIVE1MPW8uZ2V0QXR0cmlidXRlKCJkYXRhLXByb2R1Y3QtcHJpY2UtZGVmLXN0ciIpfX19ZnVuY3Rpb24gdF9wcm9kX19zYXZlVXNlcklucHV0SW5QcmljZSh0LGUscil7aWYoIXIpcmV0dXJuIGU7aWYoLTEhPT1yLmluZGV4T2YoZSkpcmV0dXJuIHI7dmFyIGk9dC50b1N0cmluZygpO2lmKGUhPT1yKWlmKHdpbmRvdy50Y2FydCYmIjAwIj09PXdpbmRvdy50Y2FydC5jdXJyZW5jeV9kZWMpe3ZhciBuPXdpbmRvdy50Y2FydC5jdXJyZW5jeV9zZXAsYz1lLnJlcGxhY2UobisiMDAiLCIiKTtpZigtMSE9PXIuaW5kZXhPZihjKSlyZXR1cm4gci5yZXBsYWNlKGMsZSk7aWYoLTEhPT1yLmluZGV4T2YoaSkpcmV0dXJuIHIucmVwbGFjZShpLGUpfWVsc2UgaWYoLTEhPT1yLmluZGV4T2YoaSkpcmV0dXJuIHIucmVwbGFjZShpLGUpO3JldHVybiBlfWZ1bmN0aW9uIHRfcHJvZF9fYWRkRXZlbnRzX19vcHRpb25zKHQpe3ZhciBlPXQ7aWYoZSBpbnN0YW5jZW9mIEVsZW1lbnR8fChlPWVbMF0pLGUpe3ZhciByPWUucXVlcnlTZWxlY3RvckFsbCgiLmpzLXByb2R1Y3Qtb3B0aW9uLXZhcmlhbnRzIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChyLChmdW5jdGlvbih0KXt2YXIgZT10LmNsb3Nlc3QoIi5qcy1wcm9kdWN0Iik7dC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLChmdW5jdGlvbigpe3RfcHJvZF9fdXBkYXRlUHJpY2UoZSksdF90cmlnZ2VyRXZlbnQoZG9jdW1lbnQuYm9keSwidHdpc2hsaXN0X2FkZGJ0biIpfSkpfSkpO3ZhciBpPWUucXVlcnlTZWxlY3RvckFsbCgnLmpzLXByb2R1Y3QtbXVsdGlvcHRpb24gaW5wdXRbdHlwZT0iY2hlY2tib3giXScpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaSwoZnVuY3Rpb24odCl7dmFyIGU9dC5jbG9zZXN0KCIuanMtcHJvZHVjdCIpO3QuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwoZnVuY3Rpb24oKXt0X3Byb2RfX3VwZGF0ZVByaWNlKGUpLHRfdHJpZ2dlckV2ZW50KGRvY3VtZW50LmJvZHksInR3aXNobGlzdF9hZGRidG4iKX0pKX0pKX19ZnVuY3Rpb24gdF9wcm9kX19jbGVhblByaWNlKHQpe3ZhciBlPXQ7cmV0dXJuIGU/KGU9KGU9ZS50b1N0cmluZygpKS5yZXBsYWNlKCIsIiwiLiIpLnJlcGxhY2UoL1teMC05Ll0vZywiIiksZT1wYXJzZUZsb2F0KGUpLnRvRml4ZWQoMiksaXNOYU4oZSkmJihlPTApLGU9cGFyc2VGbG9hdChlKSwoZSo9MSk8MCYmKGU9MCkpOmU9MCxlfWZ1bmN0aW9uIHRfcHJvZF9fcm91bmRQcmljZSh0KXt2YXIgZT10O3JldHVybiBlPyhlPXBhcnNlRmxvYXQoZSkudG9GaXhlZCgyKSxlPXBhcnNlRmxvYXQoZSksKGUqPTEpPDAmJihlPTApKTplPTAsZX1mdW5jdGlvbiB0X3Byb2RfX3Nob3dQcmljZSh0LGUpe3ZhciByPXQ7aWYocil7dmFyIGk7aWYocj1yLnRvU3RyaW5nKCksd2luZG93LnRjYXJ0JiZ3aW5kb3cudGNhcnQuY3VycmVuY3lfZGVjJiYiMDAiPT09d2luZG93LnRjYXJ0LmN1cnJlbmN5X2RlY3x8ZSYmZS5jdXJyZW5jeURlY2ltYWwmJiIwMCI9PT1lLmN1cnJlbmN5RGVjaW1hbClpZigtMT09PXIuaW5kZXhPZigiLiIpJiYtMT09PXIuaW5kZXhPZigiLCIpKXIrPSIuMDAiO2Vsc2UgMT09PXIuc3Vic3RyKHIuaW5kZXhPZigiLiIpKzEpLmxlbmd0aCYmKHIrPSIwIik7cj1yLnJlcGxhY2UoL1xCKD89KFxkezN9KSsoPyFcZCkpL2csIiAiKSxyPXdpbmRvdy50Y2FydCYmd2luZG93LnRjYXJ0LmN1cnJlbmN5X3NlcCYmIi4iPT09d2luZG93LnRjYXJ0LmN1cnJlbmN5X3NlcHx8ZSYmZS5jdXJyZW5jeVNlcGFyYXRvciYmIi4iPT09ZS5jdXJyZW5jeVNlcGFyYXRvcj9yLnJlcGxhY2UoIiwiLCIuIik6ci5yZXBsYWNlKCIuIiwiLCIpfWVsc2Ugcj0iIjtyZXR1cm4gcn1mdW5jdGlvbiB0X3RyaWdnZXJFdmVudCh0LGUpe3ZhciByO2RvY3VtZW50LmNyZWF0ZUV2ZW50PyhyPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJIVE1MRXZlbnRzIikpLmluaXRFdmVudChlLCEwLCExKTpkb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCYmKChyPWRvY3VtZW50LmNyZWF0ZUV2ZW50T2JqZWN0KCkpLmV2ZW50VHlwZT1lKSxyLmV2ZW50TmFtZT1lLHQuZGlzcGF0Y2hFdmVudD90LmRpc3BhdGNoRXZlbnQocik6dC5maXJlRXZlbnQ/dC5maXJlRXZlbnQoIm9uIityLmV2ZW50VHlwZSxyKTp0W2VdP3RbZV0oKTp0WyJvbiIrZV0mJnRbIm9uIitlXSgpfQoKZnVuY3Rpb24gX092ZXJsb2FkWWllbGQodCxlKXt0aGlzLnY9dCx0aGlzLms9ZX1mdW5jdGlvbiBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKHQsZSxyLG8sbil7dmFyIGk9e307cmV0dXJuIE9iamVjdC5rZXlzKG8pLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lbdF09b1t0XX0pKSxpLmVudW1lcmFibGU9ISFpLmVudW1lcmFibGUsaS5jb25maWd1cmFibGU9ISFpLmNvbmZpZ3VyYWJsZSwoInZhbHVlImluIGl8fGkuaW5pdGlhbGl6ZXIpJiYoaS53cml0YWJsZT0hMCksaT1yLnNsaWNlKCkucmV2ZXJzZSgpLnJlZHVjZSgoZnVuY3Rpb24ocixvKXtyZXR1cm4gbyh0LGUscil8fHJ9KSxpKSxuJiZ2b2lkIDAhPT1pLmluaXRpYWxpemVyJiYoaS52YWx1ZT1pLmluaXRpYWxpemVyP2kuaW5pdGlhbGl6ZXIuY2FsbChuKTp2b2lkIDAsaS5pbml0aWFsaXplcj12b2lkIDApLHZvaWQgMD09PWkuaW5pdGlhbGl6ZXI/KE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsaSksbnVsbCk6aX1mdW5jdGlvbiBfYXBwbHlEZWNzMjMxMSh0LGUscixvLG4saSl7dmFyIHMsYSxjLGwsZCxwLHUsXz1TeW1ib2wubWV0YWRhdGF8fFN5bWJvbC5mb3IoIlN5bWJvbC5tZXRhZGF0YSIpLGY9T2JqZWN0LmRlZmluZVByb3BlcnR5LHk9T2JqZWN0LmNyZWF0ZSx2PVt5KG51bGwpLHkobnVsbCldLGc9ZS5sZW5ndGg7ZnVuY3Rpb24gbShlLHIsbyl7cmV0dXJuIGZ1bmN0aW9uKG4saSl7ciYmKGk9bixuPXQpO2Zvcih2YXIgcz0wO3M8ZS5sZW5ndGg7cysrKWk9ZVtzXS5hcHBseShuLG8/W2ldOltdKTtyZXR1cm4gbz9pOm59fWZ1bmN0aW9uIGgodCxlLHIsbyl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJihvfHx2b2lkIDAhPT10KSl0aHJvdyBuZXcgVHlwZUVycm9yKGUrIiBtdXN0ICIrKHJ8fCJiZSIpKyIgYSBmdW5jdGlvbiIrKG8/IiI6IiBvciB1bmRlZmluZWQiKSk7cmV0dXJuIHR9ZnVuY3Rpb24gYih0LGUscixvLG4saSxjLGwsZCxwLHUpe2Z1bmN0aW9uIF8odCl7aWYoIXUodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXR0ZW1wdGVkIHRvIGFjY2VzcyBwcml2YXRlIGVsZW1lbnQgb24gbm9uLWluc3RhbmNlIil9dmFyIHk9W10uY29uY2F0KGVbMF0pLGc9ZVszXSxiPSFjLHc9MT09PW4sUz0zPT09bixFPTQ9PT1uLFA9Mj09PW47ZnVuY3Rpb24geChlLHIsbyl7cmV0dXJuIGZ1bmN0aW9uKG4saSl7cmV0dXJuIHImJihpPW4sbj10KSxvJiZvKG4pLENbZV0uY2FsbChuLGkpfX1pZighYil7dmFyIEM9e30sQT1bXSxqPVM/ImdldCI6RXx8dz8ic2V0IjoidmFsdWUiO2lmKGQ/KHB8fHc/Qz17Z2V0Ol9zZXRGdW5jdGlvbk5hbWUoKGZ1bmN0aW9uKCl7cmV0dXJuIGcodGhpcyl9KSxvLCJnZXQiKSxzZXQ6ZnVuY3Rpb24odCl7ZVs0XSh0aGlzLHQpfX06Q1tqXT1nLHB8fF9zZXRGdW5jdGlvbk5hbWUoQ1tqXSxvLFA/IiI6aikpOnB8fChDPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxvKSksIXAmJiFkKXtpZigoYT12WytsXVtvXSkmJjchPShhXm4pKXRocm93IEVycm9yKCJEZWNvcmF0aW5nIHR3byBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIG5hbWUgKCIrQ1tqXS5uYW1lKyIpIGlzIG5vdCBzdXBwb3J0ZWQgeWV0Iik7dlsrbF1bb109bjwzPzE6bn19Zm9yKHZhciBPPXQsaz15Lmxlbmd0aC0xO2s+PTA7ay09cj8yOjEpe3ZhciBMPWgoeVtrXSwiQSBkZWNvcmF0b3IiLCJiZSIsITApLFQ9cj95W2stMV06dm9pZCAwLHE9e30sST17a2luZDpbImZpZWxkIiwiYWNjZXNzb3IiLCJtZXRob2QiLCJnZXR0ZXIiLCJzZXR0ZXIiLCJjbGFzcyJdW25dLG5hbWU6byxtZXRhZGF0YTpzLGFkZEluaXRpYWxpemVyOmZ1bmN0aW9uKHQsZSl7aWYodC52KXRocm93IG5ldyBUeXBlRXJyb3IoImF0dGVtcHRlZCB0byBjYWxsIGFkZEluaXRpYWxpemVyIGFmdGVyIGRlY29yYXRpb24gd2FzIGZpbmlzaGVkIik7aChlLCJBbiBpbml0aWFsaXplciIsImJlIiwhMCksaS5wdXNoKGUpfS5iaW5kKG51bGwscSl9O2lmKGIpYT1MLmNhbGwoVCxPLEkpLHEudj0xLGgoYSwiY2xhc3MgZGVjb3JhdG9ycyIsInJldHVybiIpJiYoTz1hKTtlbHNlIGlmKEkuc3RhdGljPWwsSS5wcml2YXRlPWQsYT1JLmFjY2Vzcz17aGFzOmQ/dS5iaW5kKCk6ZnVuY3Rpb24odCl7cmV0dXJuIG8gaW4gdH19LEV8fChhLmdldD1kP1A/ZnVuY3Rpb24odCl7cmV0dXJuIF8odCksQy52YWx1ZX06eCgiZ2V0IiwwLF8pOmZ1bmN0aW9uKHQpe3JldHVybiB0W29dfSksUHx8U3x8KGEuc2V0PWQ/eCgic2V0IiwwLF8pOmZ1bmN0aW9uKHQsZSl7dFtvXT1lfSksTz1MLmNhbGwoVCx3P3tnZXQ6Qy5nZXQsc2V0OkMuc2V0fTpDW2pdLEkpLHEudj0xLHcpe2lmKCJvYmplY3QiPT10eXBlb2YgTyYmTykoYT1oKE8uZ2V0LCJhY2Nlc3Nvci5nZXQiKSkmJihDLmdldD1hKSwoYT1oKE8uc2V0LCJhY2Nlc3Nvci5zZXQiKSkmJihDLnNldD1hKSwoYT1oKE8uaW5pdCwiYWNjZXNzb3IuaW5pdCIpKSYmQS51bnNoaWZ0KGEpO2Vsc2UgaWYodm9pZCAwIT09Tyl0aHJvdyBuZXcgVHlwZUVycm9yKCJhY2Nlc3NvciBkZWNvcmF0b3JzIG11c3QgcmV0dXJuIGFuIG9iamVjdCB3aXRoIGdldCwgc2V0LCBvciBpbml0IHByb3BlcnRpZXMgb3IgdW5kZWZpbmVkIil9ZWxzZSBoKE8sKHA/ImZpZWxkIjoibWV0aG9kIikrIiBkZWNvcmF0b3JzIiwicmV0dXJuIikmJihwP0EudW5zaGlmdChPKTpDW2pdPU8pfXJldHVybiBuPDImJmMucHVzaChtKEEsbCwxKSxtKGksbCwwKSkscHx8Ynx8KGQ/dz9jLnNwbGljZSgtMSwwLHgoImdldCIsbCkseCgic2V0IixsKSk6Yy5wdXNoKFA/Q1tqXTpoLmNhbGwuYmluZChDW2pdKSk6Zih0LG8sQykpLE99ZnVuY3Rpb24gdyh0KXtyZXR1cm4gZih0LF8se2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOnN9KX1yZXR1cm4gdm9pZCAwIT09aSYmKHM9aVtfXSkscz15KG51bGw9PXM/bnVsbDpzKSxkPVtdLHA9ZnVuY3Rpb24odCl7dCYmZC5wdXNoKG0odCkpfSx1PWZ1bmN0aW9uKGUsbyl7Zm9yKHZhciBpPTA7aTxyLmxlbmd0aDtpKyspe3ZhciBzPXJbaV0sYT1zWzFdLHA9NyZhO2lmKCg4JmEpPT1lJiYhcD09byl7dmFyIHU9c1syXSxfPSEhc1szXSxmPTE2JmE7YihlP3Q6dC5wcm90b3R5cGUscyxmLF8/IiMiK3U6X3RvUHJvcGVydHlLZXkodSkscCxwPDI/W106ZT9sPWx8fFtdOmM9Y3x8W10sZCwhIWUsXyxvLGUmJl8/ZnVuY3Rpb24oZSl7cmV0dXJuIF9jaGVja0luUkhTKGUpPT09dH06bil9fX0sdSg4LDApLHUoMCwwKSx1KDgsMSksdSgwLDEpLHAoYykscChsKSxhPWQsZ3x8dyh0KSx7ZTphLGdldCBjKCl7dmFyIHI9W107cmV0dXJuIGcmJlt3KHQ9Yih0LFtlXSxvLHQubmFtZSw1LHIpKSxtKHIsMSldfX19ZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkodCxlKXsobnVsbD09ZXx8ZT50Lmxlbmd0aCkmJihlPXQubGVuZ3RoKTtmb3IodmFyIHI9MCxvPUFycmF5KGUpO3I8ZTtyKyspb1tyXT10W3JdO3JldHVybiBvfWZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyh0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0fWZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyh0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiBfYXJyYXlMaWtlVG9BcnJheSh0KX1mdW5jdGlvbiBfYXNzZXJ0Q2xhc3NCcmFuZCh0LGUscil7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQ/dD09PWU6dC5oYXMoZSkpcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mz9lOnI7dGhyb3cgbmV3IFR5cGVFcnJvcigiUHJpdmF0ZSBlbGVtZW50IGlzIG5vdCBwcmVzZW50IG9uIHRoaXMgb2JqZWN0Iil9ZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZCh0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIHR9ZnVuY3Rpb24gX2FzeW5jR2VuZXJhdG9yRGVsZWdhdGUodCl7dmFyIGU9e30scj0hMTtmdW5jdGlvbiBvKGUsbyl7cmV0dXJuIHI9ITAsbz1uZXcgUHJvbWlzZSgoZnVuY3Rpb24ocil7cih0W2VdKG8pKX0pKSx7ZG9uZTohMSx2YWx1ZTpuZXcgX092ZXJsb2FkWWllbGQobywxKX19cmV0dXJuIGVbInVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvcnx8IkBAaXRlcmF0b3IiXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxlLm5leHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHI/KHI9ITEsdCk6bygibmV4dCIsdCl9LCJmdW5jdGlvbiI9PXR5cGVvZiB0LnRocm93JiYoZS50aHJvdz1mdW5jdGlvbih0KXtpZihyKXRocm93IHI9ITEsdDtyZXR1cm4gbygidGhyb3ciLHQpfSksImZ1bmN0aW9uIj09dHlwZW9mIHQucmV0dXJuJiYoZS5yZXR1cm49ZnVuY3Rpb24odCl7cmV0dXJuIHI/KHI9ITEsdCk6bygicmV0dXJuIix0KX0pLGV9ZnVuY3Rpb24gX2FzeW5jSXRlcmF0b3IodCl7dmFyIGUscixvLG49Mjtmb3IoInVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJihyPVN5bWJvbC5hc3luY0l0ZXJhdG9yLG89U3ltYm9sLml0ZXJhdG9yKTtuLS07KXtpZihyJiZudWxsIT0oZT10W3JdKSlyZXR1cm4gZS5jYWxsKHQpO2lmKG8mJm51bGwhPShlPXRbb10pKXJldHVybiBuZXcgQXN5bmNGcm9tU3luY0l0ZXJhdG9yKGUuY2FsbCh0KSk7cj0iQEBhc3luY0l0ZXJhdG9yIixvPSJAQGl0ZXJhdG9yIn10aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QgaXMgbm90IGFzeW5jIGl0ZXJhYmxlIil9ZnVuY3Rpb24gQXN5bmNGcm9tU3luY0l0ZXJhdG9yKHQpe2Z1bmN0aW9uIGUodCl7aWYoT2JqZWN0KHQpIT09dClyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFR5cGVFcnJvcih0KyIgaXMgbm90IGFuIG9iamVjdC4iKSk7dmFyIGU9dC5kb25lO3JldHVybiBQcm9taXNlLnJlc29sdmUodC52YWx1ZSkudGhlbigoZnVuY3Rpb24odCl7cmV0dXJue3ZhbHVlOnQsZG9uZTplfX0pKX1yZXR1cm4gQXN5bmNGcm9tU3luY0l0ZXJhdG9yPWZ1bmN0aW9uKHQpe3RoaXMucz10LHRoaXMubj10Lm5leHR9LEFzeW5jRnJvbVN5bmNJdGVyYXRvci5wcm90b3R5cGU9e3M6bnVsbCxuOm51bGwsbmV4dDpmdW5jdGlvbigpe3JldHVybiBlKHRoaXMubi5hcHBseSh0aGlzLnMsYXJndW1lbnRzKSl9LHJldHVybjpmdW5jdGlvbih0KXt2YXIgcj10aGlzLnMucmV0dXJuO3JldHVybiB2b2lkIDA9PT1yP1Byb21pc2UucmVzb2x2ZSh7dmFsdWU6dCxkb25lOiEwfSk6ZShyLmFwcGx5KHRoaXMucyxhcmd1bWVudHMpKX0sdGhyb3c6ZnVuY3Rpb24odCl7dmFyIHI9dGhpcy5zLnJldHVybjtyZXR1cm4gdm9pZCAwPT09cj9Qcm9taXNlLnJlamVjdCh0KTplKHIuYXBwbHkodGhpcy5zLGFyZ3VtZW50cykpfX0sbmV3IEFzeW5jRnJvbVN5bmNJdGVyYXRvcih0KX1mdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAodCxlLHIsbyxuLGkscyl7dHJ5e3ZhciBhPXRbaV0ocyksYz1hLnZhbHVlfWNhdGNoKHQpe3JldHVybiB2b2lkIHIodCl9YS5kb25lP2UoYyk6UHJvbWlzZS5yZXNvbHZlKGMpLnRoZW4obyxuKX1mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLHI9YXJndW1lbnRzO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24obyxuKXt2YXIgaT10LmFwcGx5KGUscik7ZnVuY3Rpb24gcyh0KXthc3luY0dlbmVyYXRvclN0ZXAoaSxvLG4scyxhLCJuZXh0Iix0KX1mdW5jdGlvbiBhKHQpe2FzeW5jR2VuZXJhdG9yU3RlcChpLG8sbixzLGEsInRocm93Iix0KX1zKHZvaWQgMCl9KSl9fWZ1bmN0aW9uIF9hd2FpdEFzeW5jR2VuZXJhdG9yKHQpe3JldHVybiBuZXcgX092ZXJsb2FkWWllbGQodCwwKX1mdW5jdGlvbiBfY2FsbFN1cGVyKHQsZSxyKXtyZXR1cm4gZT1fZ2V0UHJvdG90eXBlT2YoZSksX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odCxfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk/UmVmbGVjdC5jb25zdHJ1Y3QoZSxyfHxbXSxfZ2V0UHJvdG90eXBlT2YodCkuY29uc3RydWN0b3IpOmUuYXBwbHkodCxyKSl9ZnVuY3Rpb24gX2NoZWNrSW5SSFModCl7aWYoT2JqZWN0KHQpIT09dCl0aHJvdyBUeXBlRXJyb3IoInJpZ2h0LWhhbmQgc2lkZSBvZiAnaW4nIHNob3VsZCBiZSBhbiBvYmplY3QsIGdvdCAiKyhudWxsIT09dD90eXBlb2YgdDoibnVsbCIpKTtyZXR1cm4gdH1mdW5jdGlvbiBfY2hlY2tQcml2YXRlUmVkZWNsYXJhdGlvbih0LGUpe2lmKGUuaGFzKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBpbml0aWFsaXplIHRoZSBzYW1lIHByaXZhdGUgZWxlbWVudHMgdHdpY2Ugb24gYW4gb2JqZWN0Iil9ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gX2NsYXNzTmFtZVREWkVycm9yKHQpe3Rocm93IG5ldyBSZWZlcmVuY2VFcnJvcignQ2xhc3MgIicrdCsnIiBjYW5ub3QgYmUgcmVmZXJlbmNlZCBpbiBjb21wdXRlZCBwcm9wZXJ0eSBrZXlzLicpfWZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVGaWVsZEdldDIodCxlKXtyZXR1cm4gdC5nZXQoX2Fzc2VydENsYXNzQnJhbmQodCxlKSl9ZnVuY3Rpb24gX2NsYXNzUHJpdmF0ZUZpZWxkSW5pdFNwZWModCxlLHIpe19jaGVja1ByaXZhdGVSZWRlY2xhcmF0aW9uKHQsZSksZS5zZXQodCxyKX1mdW5jdGlvbiBfY2xhc3NQcml2YXRlRmllbGRMb29zZUJhc2UodCxlKXtpZighe30uaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpKXRocm93IG5ldyBUeXBlRXJyb3IoImF0dGVtcHRlZCB0byB1c2UgcHJpdmF0ZSBmaWVsZCBvbiBub24taW5zdGFuY2UiKTtyZXR1cm4gdH12YXIgaWQ9MCxSRUFDVF9FTEVNRU5UX1RZUEUsYXBwbHlEZWNzMjIwM0ltcGw7ZnVuY3Rpb24gX2NsYXNzUHJpdmF0ZUZpZWxkTG9vc2VLZXkodCl7cmV0dXJuIl9fcHJpdmF0ZV8iK2lkKysrIl8iK3R9ZnVuY3Rpb24gX2NsYXNzUHJpdmF0ZUZpZWxkU2V0Mih0LGUscil7cmV0dXJuIHQuc2V0KF9hc3NlcnRDbGFzc0JyYW5kKHQsZSkscikscn1mdW5jdGlvbiBfY2xhc3NQcml2YXRlR2V0dGVyKHQsZSxyKXtyZXR1cm4gcihfYXNzZXJ0Q2xhc3NCcmFuZCh0LGUpKX1mdW5jdGlvbiBfY2xhc3NQcml2YXRlTWV0aG9kSW5pdFNwZWModCxlKXtfY2hlY2tQcml2YXRlUmVkZWNsYXJhdGlvbih0LGUpLGUuYWRkKHQpfWZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVTZXR0ZXIodCxlLHIsbyl7cmV0dXJuIGUoX2Fzc2VydENsYXNzQnJhbmQodCxyKSxvKSxvfWZ1bmN0aW9uIF9jbGFzc1N0YXRpY1ByaXZhdGVNZXRob2RHZXQodCxlLHIpe3JldHVybiBfYXNzZXJ0Q2xhc3NCcmFuZChlLHQpLHJ9ZnVuY3Rpb24gX2NvbnN0cnVjdCh0LGUscil7aWYoX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpKXJldHVybiBSZWZsZWN0LmNvbnN0cnVjdC5hcHBseShudWxsLGFyZ3VtZW50cyk7dmFyIG89W251bGxdO28ucHVzaC5hcHBseShvLGUpO3ZhciBuPW5ldyh0LmJpbmQuYXBwbHkodCxvKSk7cmV0dXJuIHImJl9zZXRQcm90b3R5cGVPZihuLHIucHJvdG90eXBlKSxufWZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHQsZSl7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBvPWVbcl07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxfdG9Qcm9wZXJ0eUtleShvLmtleSksbyl9fWZ1bmN0aW9uIF9jcmVhdGVDbGFzcyh0LGUscil7cmV0dXJuIGUmJl9kZWZpbmVQcm9wZXJ0aWVzKHQucHJvdG90eXBlLGUpLHImJl9kZWZpbmVQcm9wZXJ0aWVzKHQsciksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksdH1mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0LGUpe3ZhciByPSJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZ0W1N5bWJvbC5pdGVyYXRvcl18fHRbIkBAaXRlcmF0b3IiXTtpZighcil7aWYoQXJyYXkuaXNBcnJheSh0KXx8KHI9X3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHQpKXx8ZSYmdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCl7ciYmKHQ9cik7dmFyIG89MCxuPWZ1bmN0aW9uKCl7fTtyZXR1cm57czpuLG46ZnVuY3Rpb24oKXtyZXR1cm4gbz49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbbysrXX19LGU6ZnVuY3Rpb24odCl7dGhyb3cgdH0sZjpufX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIGkscz0hMCxhPSExO3JldHVybntzOmZ1bmN0aW9uKCl7cj1yLmNhbGwodCl9LG46ZnVuY3Rpb24oKXt2YXIgdD1yLm5leHQoKTtyZXR1cm4gcz10LmRvbmUsdH0sZTpmdW5jdGlvbih0KXthPSEwLGk9dH0sZjpmdW5jdGlvbigpe3RyeXtzfHxudWxsPT1yLnJldHVybnx8ci5yZXR1cm4oKX1maW5hbGx5e2lmKGEpdGhyb3cgaX19fX1mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlckxvb3NlKHQsZSl7dmFyIHI9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJnRbU3ltYm9sLml0ZXJhdG9yXXx8dFsiQEBpdGVyYXRvciJdO2lmKHIpcmV0dXJuKHI9ci5jYWxsKHQpKS5uZXh0LmJpbmQocik7aWYoQXJyYXkuaXNBcnJheSh0KXx8KHI9X3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHQpKXx8ZSYmdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCl7ciYmKHQ9cik7dmFyIG89MDtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbz49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbbysrXX19fXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKX1mdW5jdGlvbiBfY3JlYXRlU3VwZXIodCl7dmFyIGU9X2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpO3JldHVybiBmdW5jdGlvbigpe3ZhciByLG89X2dldFByb3RvdHlwZU9mKHQpO2lmKGUpe3ZhciBuPV9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjtyPVJlZmxlY3QuY29uc3RydWN0KG8sYXJndW1lbnRzLG4pfWVsc2Ugcj1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcyxyKX19ZnVuY3Rpb24gX2RlY29yYXRlKHQsZSxyLG8pe3ZhciBuPV9nZXREZWNvcmF0b3JzQXBpKCk7aWYobylmb3IodmFyIGk9MDtpPG8ubGVuZ3RoO2krKyluPW9baV0obik7dmFyIHM9ZSgoZnVuY3Rpb24odCl7bi5pbml0aWFsaXplSW5zdGFuY2VFbGVtZW50cyh0LGEuZWxlbWVudHMpfSksciksYT1uLmRlY29yYXRlQ2xhc3MoX2NvYWxlc2NlQ2xhc3NFbGVtZW50cyhzLmQubWFwKF9jcmVhdGVFbGVtZW50RGVzY3JpcHRvcikpLHQpO3JldHVybiBuLmluaXRpYWxpemVDbGFzc0VsZW1lbnRzKHMuRixhLmVsZW1lbnRzKSxuLnJ1bkNsYXNzRmluaXNoZXJzKHMuRixhLmZpbmlzaGVycyl9ZnVuY3Rpb24gX2dldERlY29yYXRvcnNBcGkoKXtfZ2V0RGVjb3JhdG9yc0FwaT1mdW5jdGlvbigpe3JldHVybiB0fTt2YXIgdD17ZWxlbWVudHNEZWZpbml0aW9uT3JkZXI6W1sibWV0aG9kIl0sWyJmaWVsZCJdXSxpbml0aWFsaXplSW5zdGFuY2VFbGVtZW50czpmdW5jdGlvbih0LGUpe1sibWV0aG9kIiwiZmllbGQiXS5mb3JFYWNoKChmdW5jdGlvbihyKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpe2Uua2luZD09PXImJiJvd24iPT09ZS5wbGFjZW1lbnQmJnRoaXMuZGVmaW5lQ2xhc3NFbGVtZW50KHQsZSl9KSx0aGlzKX0pLHRoaXMpfSxpbml0aWFsaXplQ2xhc3NFbGVtZW50czpmdW5jdGlvbih0LGUpe3ZhciByPXQucHJvdG90eXBlO1sibWV0aG9kIiwiZmllbGQiXS5mb3JFYWNoKChmdW5jdGlvbihvKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuPWUucGxhY2VtZW50O2lmKGUua2luZD09PW8mJigic3RhdGljIj09PW58fCJwcm90b3R5cGUiPT09bikpe3ZhciBpPSJzdGF0aWMiPT09bj90OnI7dGhpcy5kZWZpbmVDbGFzc0VsZW1lbnQoaSxlKX19KSx0aGlzKX0pLHRoaXMpfSxkZWZpbmVDbGFzc0VsZW1lbnQ6ZnVuY3Rpb24odCxlKXt2YXIgcj1lLmRlc2NyaXB0b3I7aWYoImZpZWxkIj09PWUua2luZCl7dmFyIG89ZS5pbml0aWFsaXplcjtyPXtlbnVtZXJhYmxlOnIuZW51bWVyYWJsZSx3cml0YWJsZTpyLndyaXRhYmxlLGNvbmZpZ3VyYWJsZTpyLmNvbmZpZ3VyYWJsZSx2YWx1ZTp2b2lkIDA9PT1vP3ZvaWQgMDpvLmNhbGwodCl9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUua2V5LHIpfSxkZWNvcmF0ZUNsYXNzOmZ1bmN0aW9uKHQsZSl7dmFyIHI9W10sbz1bXSxuPXtzdGF0aWM6W10scHJvdG90eXBlOltdLG93bjpbXX07aWYodC5mb3JFYWNoKChmdW5jdGlvbih0KXt0aGlzLmFkZEVsZW1lbnRQbGFjZW1lbnQodCxuKX0pLHRoaXMpLHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoIV9oYXNEZWNvcmF0b3JzKHQpKXJldHVybiByLnB1c2godCk7dmFyIGU9dGhpcy5kZWNvcmF0ZUVsZW1lbnQodCxuKTtyLnB1c2goZS5lbGVtZW50KSxyLnB1c2guYXBwbHkocixlLmV4dHJhcyksby5wdXNoLmFwcGx5KG8sZS5maW5pc2hlcnMpfSksdGhpcyksIWUpcmV0dXJue2VsZW1lbnRzOnIsZmluaXNoZXJzOm99O3ZhciBpPXRoaXMuZGVjb3JhdGVDb25zdHJ1Y3RvcihyLGUpO3JldHVybiBvLnB1c2guYXBwbHkobyxpLmZpbmlzaGVycyksaS5maW5pc2hlcnM9byxpfSxhZGRFbGVtZW50UGxhY2VtZW50OmZ1bmN0aW9uKHQsZSxyKXt2YXIgbz1lW3QucGxhY2VtZW50XTtpZighciYmLTEhPT1vLmluZGV4T2YodC5rZXkpKXRocm93IG5ldyBUeXBlRXJyb3IoIkR1cGxpY2F0ZWQgZWxlbWVudCAoIit0LmtleSsiKSIpO28ucHVzaCh0LmtleSl9LGRlY29yYXRlRWxlbWVudDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj1bXSxvPVtdLG49dC5kZWNvcmF0b3JzLGk9bi5sZW5ndGgtMTtpPj0wO2ktLSl7dmFyIHM9ZVt0LnBsYWNlbWVudF07cy5zcGxpY2Uocy5pbmRleE9mKHQua2V5KSwxKTt2YXIgYT10aGlzLmZyb21FbGVtZW50RGVzY3JpcHRvcih0KSxjPXRoaXMudG9FbGVtZW50RmluaXNoZXJFeHRyYXMoKDAsbltpXSkoYSl8fGEpO3Q9Yy5lbGVtZW50LHRoaXMuYWRkRWxlbWVudFBsYWNlbWVudCh0LGUpLGMuZmluaXNoZXImJm8ucHVzaChjLmZpbmlzaGVyKTt2YXIgbD1jLmV4dHJhcztpZihsKXtmb3IodmFyIGQ9MDtkPGwubGVuZ3RoO2QrKyl0aGlzLmFkZEVsZW1lbnRQbGFjZW1lbnQobFtkXSxlKTtyLnB1c2guYXBwbHkocixsKX19cmV0dXJue2VsZW1lbnQ6dCxmaW5pc2hlcnM6byxleHRyYXM6cn19LGRlY29yYXRlQ29uc3RydWN0b3I6ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9W10sbz1lLmxlbmd0aC0xO28+PTA7by0tKXt2YXIgbj10aGlzLmZyb21DbGFzc0Rlc2NyaXB0b3IodCksaT10aGlzLnRvQ2xhc3NEZXNjcmlwdG9yKCgwLGVbb10pKG4pfHxuKTtpZih2b2lkIDAhPT1pLmZpbmlzaGVyJiZyLnB1c2goaS5maW5pc2hlciksdm9pZCAwIT09aS5lbGVtZW50cyl7dD1pLmVsZW1lbnRzO2Zvcih2YXIgcz0wO3M8dC5sZW5ndGgtMTtzKyspZm9yKHZhciBhPXMrMTthPHQubGVuZ3RoO2ErKylpZih0W3NdLmtleT09PXRbYV0ua2V5JiZ0W3NdLnBsYWNlbWVudD09PXRbYV0ucGxhY2VtZW50KXRocm93IG5ldyBUeXBlRXJyb3IoIkR1cGxpY2F0ZWQgZWxlbWVudCAoIit0W3NdLmtleSsiKSIpfX1yZXR1cm57ZWxlbWVudHM6dCxmaW5pc2hlcnM6cn19LGZyb21FbGVtZW50RGVzY3JpcHRvcjpmdW5jdGlvbih0KXt2YXIgZT17a2luZDp0LmtpbmQsa2V5OnQua2V5LHBsYWNlbWVudDp0LnBsYWNlbWVudCxkZXNjcmlwdG9yOnQuZGVzY3JpcHRvcn07cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6IkRlc2NyaXB0b3IiLGNvbmZpZ3VyYWJsZTohMH0pLCJmaWVsZCI9PT10LmtpbmQmJihlLmluaXRpYWxpemVyPXQuaW5pdGlhbGl6ZXIpLGV9LHRvRWxlbWVudERlc2NyaXB0b3JzOmZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQpcmV0dXJuIF90b0FycmF5KHQpLm1hcCgoZnVuY3Rpb24odCl7dmFyIGU9dGhpcy50b0VsZW1lbnREZXNjcmlwdG9yKHQpO3JldHVybiB0aGlzLmRpc2FsbG93UHJvcGVydHkodCwiZmluaXNoZXIiLCJBbiBlbGVtZW50IGRlc2NyaXB0b3IiKSx0aGlzLmRpc2FsbG93UHJvcGVydHkodCwiZXh0cmFzIiwiQW4gZWxlbWVudCBkZXNjcmlwdG9yIiksZX0pLHRoaXMpfSx0b0VsZW1lbnREZXNjcmlwdG9yOmZ1bmN0aW9uKHQpe3ZhciBlPXQua2luZCsiIjtpZigibWV0aG9kIiE9PWUmJiJmaWVsZCIhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoJ0FuIGVsZW1lbnQgZGVzY3JpcHRvclwncyAua2luZCBwcm9wZXJ0eSBtdXN0IGJlIGVpdGhlciAibWV0aG9kIiBvciAiZmllbGQiLCBidXQgYSBkZWNvcmF0b3IgY3JlYXRlZCBhbiBlbGVtZW50IGRlc2NyaXB0b3Igd2l0aCAua2luZCAiJytlKyciJyk7dmFyIHI9X3RvUHJvcGVydHlLZXkodC5rZXkpLG89dC5wbGFjZW1lbnQrIiI7aWYoInN0YXRpYyIhPT1vJiYicHJvdG90eXBlIiE9PW8mJiJvd24iIT09byl0aHJvdyBuZXcgVHlwZUVycm9yKCdBbiBlbGVtZW50IGRlc2NyaXB0b3JcJ3MgLnBsYWNlbWVudCBwcm9wZXJ0eSBtdXN0IGJlIG9uZSBvZiAic3RhdGljIiwgInByb3RvdHlwZSIgb3IgIm93biIsIGJ1dCBhIGRlY29yYXRvciBjcmVhdGVkIGFuIGVsZW1lbnQgZGVzY3JpcHRvciB3aXRoIC5wbGFjZW1lbnQgIicrbysnIicpO3ZhciBuPXQuZGVzY3JpcHRvcjt0aGlzLmRpc2FsbG93UHJvcGVydHkodCwiZWxlbWVudHMiLCJBbiBlbGVtZW50IGRlc2NyaXB0b3IiKTt2YXIgaT17a2luZDplLGtleTpyLHBsYWNlbWVudDpvLGRlc2NyaXB0b3I6T2JqZWN0LmFzc2lnbih7fSxuKX07cmV0dXJuImZpZWxkIiE9PWU/dGhpcy5kaXNhbGxvd1Byb3BlcnR5KHQsImluaXRpYWxpemVyIiwiQSBtZXRob2QgZGVzY3JpcHRvciIpOih0aGlzLmRpc2FsbG93UHJvcGVydHkobiwiZ2V0IiwiVGhlIHByb3BlcnR5IGRlc2NyaXB0b3Igb2YgYSBmaWVsZCBkZXNjcmlwdG9yIiksdGhpcy5kaXNhbGxvd1Byb3BlcnR5KG4sInNldCIsIlRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIG9mIGEgZmllbGQgZGVzY3JpcHRvciIpLHRoaXMuZGlzYWxsb3dQcm9wZXJ0eShuLCJ2YWx1ZSIsIlRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIG9mIGEgZmllbGQgZGVzY3JpcHRvciIpLGkuaW5pdGlhbGl6ZXI9dC5pbml0aWFsaXplciksaX0sdG9FbGVtZW50RmluaXNoZXJFeHRyYXM6ZnVuY3Rpb24odCl7cmV0dXJue2VsZW1lbnQ6dGhpcy50b0VsZW1lbnREZXNjcmlwdG9yKHQpLGZpbmlzaGVyOl9vcHRpb25hbENhbGxhYmxlUHJvcGVydHkodCwiZmluaXNoZXIiKSxleHRyYXM6dGhpcy50b0VsZW1lbnREZXNjcmlwdG9ycyh0LmV4dHJhcyl9fSxmcm9tQ2xhc3NEZXNjcmlwdG9yOmZ1bmN0aW9uKHQpe3ZhciBlPXtraW5kOiJjbGFzcyIsZWxlbWVudHM6dC5tYXAodGhpcy5mcm9tRWxlbWVudERlc2NyaXB0b3IsdGhpcyl9O3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOiJEZXNjcmlwdG9yIixjb25maWd1cmFibGU6ITB9KSxlfSx0b0NsYXNzRGVzY3JpcHRvcjpmdW5jdGlvbih0KXt2YXIgZT10LmtpbmQrIiI7aWYoImNsYXNzIiE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcignQSBjbGFzcyBkZXNjcmlwdG9yXCdzIC5raW5kIHByb3BlcnR5IG11c3QgYmUgImNsYXNzIiwgYnV0IGEgZGVjb3JhdG9yIGNyZWF0ZWQgYSBjbGFzcyBkZXNjcmlwdG9yIHdpdGggLmtpbmQgIicrZSsnIicpO3RoaXMuZGlzYWxsb3dQcm9wZXJ0eSh0LCJrZXkiLCJBIGNsYXNzIGRlc2NyaXB0b3IiKSx0aGlzLmRpc2FsbG93UHJvcGVydHkodCwicGxhY2VtZW50IiwiQSBjbGFzcyBkZXNjcmlwdG9yIiksdGhpcy5kaXNhbGxvd1Byb3BlcnR5KHQsImRlc2NyaXB0b3IiLCJBIGNsYXNzIGRlc2NyaXB0b3IiKSx0aGlzLmRpc2FsbG93UHJvcGVydHkodCwiaW5pdGlhbGl6ZXIiLCJBIGNsYXNzIGRlc2NyaXB0b3IiKSx0aGlzLmRpc2FsbG93UHJvcGVydHkodCwiZXh0cmFzIiwiQSBjbGFzcyBkZXNjcmlwdG9yIik7dmFyIHI9X29wdGlvbmFsQ2FsbGFibGVQcm9wZXJ0eSh0LCJmaW5pc2hlciIpO3JldHVybntlbGVtZW50czp0aGlzLnRvRWxlbWVudERlc2NyaXB0b3JzKHQuZWxlbWVudHMpLGZpbmlzaGVyOnJ9fSxydW5DbGFzc0ZpbmlzaGVyczpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgbz0oMCxlW3JdKSh0KTtpZih2b2lkIDAhPT1vKXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbyl0aHJvdyBuZXcgVHlwZUVycm9yKCJGaW5pc2hlcnMgbXVzdCByZXR1cm4gYSBjb25zdHJ1Y3Rvci4iKTt0PW99fXJldHVybiB0fSxkaXNhbGxvd1Byb3BlcnR5OmZ1bmN0aW9uKHQsZSxyKXtpZih2b2lkIDAhPT10W2VdKXRocm93IG5ldyBUeXBlRXJyb3IocisiIGNhbid0IGhhdmUgYSAuIitlKyIgcHJvcGVydHkuIil9fTtyZXR1cm4gdH1mdW5jdGlvbiBfY3JlYXRlRWxlbWVudERlc2NyaXB0b3IodCl7dmFyIGUscj1fdG9Qcm9wZXJ0eUtleSh0LmtleSk7Im1ldGhvZCI9PT10LmtpbmQ/ZT17dmFsdWU6dC52YWx1ZSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMX06ImdldCI9PT10LmtpbmQ/ZT17Z2V0OnQudmFsdWUsY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITF9OiJzZXQiPT09dC5raW5kP2U9e3NldDp0LnZhbHVlLGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExfToiZmllbGQiPT09dC5raW5kJiYoZT17Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITB9KTt2YXIgbz17a2luZDoiZmllbGQiPT09dC5raW5kPyJmaWVsZCI6Im1ldGhvZCIsa2V5OnIscGxhY2VtZW50OnQuc3RhdGljPyJzdGF0aWMiOiJmaWVsZCI9PT10LmtpbmQ/Im93biI6InByb3RvdHlwZSIsZGVzY3JpcHRvcjplfTtyZXR1cm4gdC5kZWNvcmF0b3JzJiYoby5kZWNvcmF0b3JzPXQuZGVjb3JhdG9ycyksImZpZWxkIj09PXQua2luZCYmKG8uaW5pdGlhbGl6ZXI9dC52YWx1ZSksb31mdW5jdGlvbiBfY29hbGVzY2VHZXR0ZXJTZXR0ZXIodCxlKXt2b2lkIDAhPT10LmRlc2NyaXB0b3IuZ2V0P2UuZGVzY3JpcHRvci5nZXQ9dC5kZXNjcmlwdG9yLmdldDplLmRlc2NyaXB0b3Iuc2V0PXQuZGVzY3JpcHRvci5zZXR9ZnVuY3Rpb24gX2NvYWxlc2NlQ2xhc3NFbGVtZW50cyh0KXtmb3IodmFyIGU9W10scj1mdW5jdGlvbih0KXtyZXR1cm4ibWV0aG9kIj09PXQua2luZCYmdC5rZXk9PT1pLmtleSYmdC5wbGFjZW1lbnQ9PT1pLnBsYWNlbWVudH0sbz0wO288dC5sZW5ndGg7bysrKXt2YXIgbixpPXRbb107aWYoIm1ldGhvZCI9PT1pLmtpbmQmJihuPWUuZmluZChyKSkpaWYoX2lzRGF0YURlc2NyaXB0b3IoaS5kZXNjcmlwdG9yKXx8X2lzRGF0YURlc2NyaXB0b3Iobi5kZXNjcmlwdG9yKSl7aWYoX2hhc0RlY29yYXRvcnMoaSl8fF9oYXNEZWNvcmF0b3JzKG4pKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigiRHVwbGljYXRlZCBtZXRob2RzICgiK2kua2V5KyIpIGNhbid0IGJlIGRlY29yYXRlZC4iKTtuLmRlc2NyaXB0b3I9aS5kZXNjcmlwdG9yfWVsc2V7aWYoX2hhc0RlY29yYXRvcnMoaSkpe2lmKF9oYXNEZWNvcmF0b3JzKG4pKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigiRGVjb3JhdG9ycyBjYW4ndCBiZSBwbGFjZWQgb24gZGlmZmVyZW50IGFjY2Vzc29ycyB3aXRoIGZvciB0aGUgc2FtZSBwcm9wZXJ0eSAoIitpLmtleSsiKS4iKTtuLmRlY29yYXRvcnM9aS5kZWNvcmF0b3JzfV9jb2FsZXNjZUdldHRlclNldHRlcihpLG4pfWVsc2UgZS5wdXNoKGkpfXJldHVybiBlfWZ1bmN0aW9uIF9oYXNEZWNvcmF0b3JzKHQpe3JldHVybiB0LmRlY29yYXRvcnMmJnQuZGVjb3JhdG9ycy5sZW5ndGh9ZnVuY3Rpb24gX2lzRGF0YURlc2NyaXB0b3IodCl7cmV0dXJuIHZvaWQgMCE9PXQmJiEodm9pZCAwPT09dC52YWx1ZSYmdm9pZCAwPT09dC53cml0YWJsZSl9ZnVuY3Rpb24gX29wdGlvbmFsQ2FsbGFibGVQcm9wZXJ0eSh0LGUpe3ZhciByPXRbZV07aWYodm9pZCAwIT09ciYmImZ1bmN0aW9uIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgJyIrZSsiJyB0byBiZSBhIGZ1bmN0aW9uIik7cmV0dXJuIHJ9ZnVuY3Rpb24gX2RlZmF1bHRzKHQsZSl7Zm9yKHZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpLG89MDtvPHIubGVuZ3RoO28rKyl7dmFyIG49cltvXSxpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSxuKTtpJiZpLmNvbmZpZ3VyYWJsZSYmdm9pZCAwPT09dFtuXSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbixpKX1yZXR1cm4gdH1mdW5jdGlvbiBfZGVmaW5lQWNjZXNzb3IodCxlLHIsbyl7dmFyIG49e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwfTtyZXR1cm4gblt0XT1vLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIsbil9ZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KHQsZSxyKXtyZXR1cm4oZT1fdG9Qcm9wZXJ0eUtleShlKSlpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOnIsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPXIsdH1mdW5jdGlvbiBfZXh0ZW5kcygpe3JldHVybiBfZXh0ZW5kcz1PYmplY3QuYXNzaWduP09iamVjdC5hc3NpZ24uYmluZCgpOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciByPWFyZ3VtZW50c1tlXTtmb3IodmFyIG8gaW4gcikoe30pLmhhc093blByb3BlcnR5LmNhbGwocixvKSYmKHRbb109cltvXSl9cmV0dXJuIHR9LF9leHRlbmRzLmFwcGx5KG51bGwsYXJndW1lbnRzKX1mdW5jdGlvbiBfZ2V0KCl7cmV0dXJuIF9nZXQ9InVuZGVmaW5lZCIhPXR5cGVvZiBSZWZsZWN0JiZSZWZsZWN0LmdldD9SZWZsZWN0LmdldC5iaW5kKCk6ZnVuY3Rpb24odCxlLHIpe3ZhciBvPV9zdXBlclByb3BCYXNlKHQsZSk7aWYobyl7dmFyIG49T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvLGUpO3JldHVybiBuLmdldD9uLmdldC5jYWxsKGFyZ3VtZW50cy5sZW5ndGg8Mz90OnIpOm4udmFsdWV9fSxfZ2V0LmFwcGx5KG51bGwsYXJndW1lbnRzKX1mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YodCl7cmV0dXJuIF9nZXRQcm90b3R5cGVPZj1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KX0sX2dldFByb3RvdHlwZU9mKHQpfWZ1bmN0aW9uIF9pZGVudGl0eSh0KXtyZXR1cm4gdH1mdW5jdGlvbiBfaW1wb3J0RGVmZXJQcm94eSh0KXt2YXIgZT1udWxsLHI9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSxvPWZ1bmN0aW9uKHIpe3JldHVybiBmdW5jdGlvbihvLG4saSl7cmV0dXJuIG51bGw9PT1lJiYoZT10KCkpLHIoZSxuLGkpfX07cmV0dXJuIG5ldyBQcm94eSh7fSx7ZGVmaW5lUHJvcGVydHk6cighMSksZGVsZXRlUHJvcGVydHk6cighMSksZ2V0Om8oUmVmbGVjdC5nZXQpLGdldE93blByb3BlcnR5RGVzY3JpcHRvcjpvKFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKSxnZXRQcm90b3R5cGVPZjpyKG51bGwpLGlzRXh0ZW5zaWJsZTpyKCExKSxoYXM6byhSZWZsZWN0Lmhhcyksb3duS2V5czpvKFJlZmxlY3Qub3duS2V5cykscHJldmVudEV4dGVuc2lvbnM6cighMCksc2V0OnIoITEpLHNldFByb3RvdHlwZU9mOnIoITEpfSl9ZnVuY3Rpb24gX2luaGVyaXRzKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJwcm90b3R5cGUiLHt3cml0YWJsZTohMX0pLGUmJl9zZXRQcm90b3R5cGVPZih0LGUpfWZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlKHQsZSl7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSksdC5wcm90b3R5cGUuY29uc3RydWN0b3I9dCxfc2V0UHJvdG90eXBlT2YodCxlKX1mdW5jdGlvbiBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSh0LGUscixvKXtyJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHtlbnVtZXJhYmxlOnIuZW51bWVyYWJsZSxjb25maWd1cmFibGU6ci5jb25maWd1cmFibGUsd3JpdGFibGU6ci53cml0YWJsZSx2YWx1ZTpyLmluaXRpYWxpemVyP3IuaW5pdGlhbGl6ZXIuY2FsbChvKTp2b2lkIDB9KX1mdW5jdGlvbiBfaW5pdGlhbGl6ZXJXYXJuaW5nSGVscGVyKHQsZSl7dGhyb3cgRXJyb3IoIkRlY29yYXRpbmcgY2xhc3MgcHJvcGVydHkgZmFpbGVkLiBQbGVhc2UgZW5zdXJlIHRoYXQgdHJhbnNmb3JtLWNsYXNzLXByb3BlcnRpZXMgaXMgZW5hYmxlZCBhbmQgcnVucyBhZnRlciB0aGUgZGVjb3JhdG9ycyB0cmFuc2Zvcm0uIil9ZnVuY3Rpb24gX2luc3RhbmNlb2YodCxlKXtyZXR1cm4gbnVsbCE9ZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJmVbU3ltYm9sLmhhc0luc3RhbmNlXT8hIWVbU3ltYm9sLmhhc0luc3RhbmNlXSh0KTp0IGluc3RhbmNlb2YgZX1mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCh0LGUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBXZWFrTWFwKXZhciByPW5ldyBXZWFrTWFwLG89bmV3IFdlYWtNYXA7cmV0dXJuKF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkPWZ1bmN0aW9uKHQsZSl7aWYoIWUmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgbixpLHM9e19fcHJvdG9fXzpudWxsLGRlZmF1bHQ6dH07aWYobnVsbD09PXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQpcmV0dXJuIHM7aWYobj1lP286cil7aWYobi5oYXModCkpcmV0dXJuIG4uZ2V0KHQpO24uc2V0KHQscyl9Zm9yKGNvbnN0IHIgaW4gdCkiZGVmYXVsdCIhPT1yJiZ7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQscikmJigoaT0obj1PYmplY3QuZGVmaW5lUHJvcGVydHkpJiZPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQscikpJiYoaS5nZXR8fGkuc2V0KT9uKHMscixpKTpzW3JdPXRbcl0pO3JldHVybiBzfSkodCxlKX1mdW5jdGlvbiBfaXNOYXRpdmVGdW5jdGlvbih0KXt0cnl7cmV0dXJuLTEhPT1GdW5jdGlvbi50b1N0cmluZy5jYWxsKHQpLmluZGV4T2YoIltuYXRpdmUgY29kZV0iKX1jYXRjaChlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdH19ZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpe3RyeXt2YXIgdD0hQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sW10sKGZ1bmN0aW9uKCl7fSkpKX1jYXRjaCh0KXt9cmV0dXJuKF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3Q9ZnVuY3Rpb24oKXtyZXR1cm4hIXR9KSgpfWZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkodCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJm51bGwhPXRbU3ltYm9sLml0ZXJhdG9yXXx8bnVsbCE9dFsiQEBpdGVyYXRvciJdKXJldHVybiBBcnJheS5mcm9tKHQpfWZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdCh0LGUpe3ZhciByPW51bGw9PXQ/bnVsbDoidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmdFtTeW1ib2wuaXRlcmF0b3JdfHx0WyJAQGl0ZXJhdG9yIl07aWYobnVsbCE9cil7dmFyIG8sbixpLHMsYT1bXSxjPSEwLGw9ITE7dHJ5e2lmKGk9KHI9ci5jYWxsKHQpKS5uZXh0LDA9PT1lKXtpZihPYmplY3QocikhPT1yKXJldHVybjtjPSExfWVsc2UgZm9yKDshKGM9KG89aS5jYWxsKHIpKS5kb25lKSYmKGEucHVzaChvLnZhbHVlKSxhLmxlbmd0aCE9PWUpO2M9ITApO31jYXRjaCh0KXtsPSEwLG49dH1maW5hbGx5e3RyeXtpZighYyYmbnVsbCE9ci5yZXR1cm4mJihzPXIucmV0dXJuKCksT2JqZWN0KHMpIT09cykpcmV0dXJufWZpbmFsbHl7aWYobCl0aHJvdyBufX1yZXR1cm4gYX19ZnVuY3Rpb24gX2pzeCh0LGUscixvKXtSRUFDVF9FTEVNRU5UX1RZUEV8fChSRUFDVF9FTEVNRU5UX1RZUEU9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLmZvciYmU3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpfHw2MDEwMyk7dmFyIG49dCYmdC5kZWZhdWx0UHJvcHMsaT1hcmd1bWVudHMubGVuZ3RoLTM7aWYoZXx8MD09PWl8fChlPXtjaGlsZHJlbjp2b2lkIDB9KSwxPT09aSllLmNoaWxkcmVuPW87ZWxzZSBpZihpPjEpe2Zvcih2YXIgcz1BcnJheShpKSxhPTA7YTxpO2ErKylzW2FdPWFyZ3VtZW50c1thKzNdO2UuY2hpbGRyZW49c31pZihlJiZuKWZvcih2YXIgYyBpbiBuKXZvaWQgMD09PWVbY10mJihlW2NdPW5bY10pO2Vsc2UgZXx8KGU9bnx8e30pO3JldHVybnskJHR5cGVvZjpSRUFDVF9FTEVNRU5UX1RZUEUsdHlwZTp0LGtleTp2b2lkIDA9PT1yP251bGw6IiIrcixyZWY6bnVsbCxwcm9wczplLF9vd25lcjpudWxsfX1mdW5jdGlvbiBfbWF5YmVBcnJheUxpa2UodCxlLHIpe2lmKGUmJiFBcnJheS5pc0FycmF5KGUpJiYibnVtYmVyIj09dHlwZW9mIGUubGVuZ3RoKXt2YXIgbz1lLmxlbmd0aDtyZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkoZSx2b2lkIDAhPT1yJiZyPG8/cjpvKX1yZXR1cm4gdChlLHIpfWZ1bmN0aW9uIF9uZXdBcnJvd0NoZWNrKHQsZSl7aWYodCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGluc3RhbnRpYXRlIGFuIGFycm93IGZ1bmN0aW9uIil9ZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9ZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9ZnVuY3Rpb24gX251bGxpc2hSZWNlaXZlckVycm9yKHQpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBzZXQgcHJvcGVydHkgb2YgbnVsbCBvciB1bmRlZmluZWQuIil9ZnVuY3Rpb24gX29iamVjdERlc3RydWN0dXJpbmdFbXB0eSh0KXtpZihudWxsPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBkZXN0cnVjdHVyZSAiK3QpfWZ1bmN0aW9uIG93bktleXModCxlKXt2YXIgcj1PYmplY3Qua2V5cyh0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgbz1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO2UmJihvPW8uZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpLmVudW1lcmFibGV9KSkpLHIucHVzaC5hcHBseShyLG8pfXJldHVybiByfWZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciByPW51bGwhPWFyZ3VtZW50c1tlXT9hcmd1bWVudHNbZV06e307ZSUyP293bktleXMoT2JqZWN0KHIpLCEwKS5mb3JFYWNoKChmdW5jdGlvbihlKXtfZGVmaW5lUHJvcGVydHkodCxlLHJbZV0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocikpOm93bktleXMoT2JqZWN0KHIpKS5mb3JFYWNoKChmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocixlKSl9KSl9cmV0dXJuIHR9ZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHQsZSl7aWYobnVsbD09dClyZXR1cm57fTt2YXIgcixvLG49X29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UodCxlKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgaT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO2ZvcihvPTA7bzxpLmxlbmd0aDtvKyspcj1pW29dLC0xPT09ZS5pbmRleE9mKHIpJiZ7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQscikmJihuW3JdPXRbcl0pfXJldHVybiBufWZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHQsZSl7aWYobnVsbD09dClyZXR1cm57fTt2YXIgcj17fTtmb3IodmFyIG8gaW4gdClpZih7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbykpe2lmKC0xIT09ZS5pbmRleE9mKG8pKWNvbnRpbnVlO3Jbb109dFtvXX1yZXR1cm4gcn1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0LGUpe2lmKGUmJigib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlKSlyZXR1cm4gZTtpZih2b2lkIDAhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkIik7cmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQodCl9ZnVuY3Rpb24gX3JlYWRPbmx5RXJyb3IodCl7dGhyb3cgbmV3IFR5cGVFcnJvcignIicrdCsnIiBpcyByZWFkLW9ubHknKX1mdW5jdGlvbiBfcmVnZW5lcmF0b3IoKXsKLyohIHJlZ2VuZXJhdG9yLXJ1bnRpbWUgLS0gQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuIC0tIGxpY2Vuc2UgKE1JVCk6IGh0dHBzOi8vZ2l0aHViLmNvbS9iYWJlbC9iYWJlbC9ibG9iL21haW4vcGFja2FnZXMvYmFiZWwtaGVscGVycy9MSUNFTlNFICovCnZhciB0LGUscj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sP1N5bWJvbDp7fSxvPXIuaXRlcmF0b3J8fCJAQGl0ZXJhdG9yIixuPXIudG9TdHJpbmdUYWd8fCJAQHRvU3RyaW5nVGFnIjtmdW5jdGlvbiBpKHIsbyxuLGkpe3ZhciBjPW8mJm8ucHJvdG90eXBlIGluc3RhbmNlb2YgYT9vOmEsbD1PYmplY3QuY3JlYXRlKGMucHJvdG90eXBlKTtyZXR1cm4gX3JlZ2VuZXJhdG9yRGVmaW5lKGwsIl9pbnZva2UiLGZ1bmN0aW9uKHIsbyxuKXt2YXIgaSxhLGMsbD0wLGQ9bnx8W10scD0hMSx1PXtwOjAsbjowLHY6dCxhOl8sZjpfLmJpbmQodCw0KSxkOmZ1bmN0aW9uKGUscil7cmV0dXJuIGk9ZSxhPTAsYz10LHUubj1yLHN9fTtmdW5jdGlvbiBfKHIsbyl7Zm9yKGE9cixjPW8sZT0wOyFwJiZsJiYhbiYmZTxkLmxlbmd0aDtlKyspe3ZhciBuLGk9ZFtlXSxfPXUucCxmPWlbMl07cj4zPyhuPWY9PT1vKSYmKGM9aVsoYT1pWzRdKT81OihhPTMsMyldLGlbNF09aVs1XT10KTppWzBdPD1fJiYoKG49cjwyJiZfPGlbMV0pPyhhPTAsdS52PW8sdS5uPWlbMV0pOl88ZiYmKG49cjwzfHxpWzBdPm98fG8+ZikmJihpWzRdPXIsaVs1XT1vLHUubj1mLGE9MCkpfWlmKG58fHI+MSlyZXR1cm4gczt0aHJvdyBwPSEwLG99cmV0dXJuIGZ1bmN0aW9uKG4sZCxmKXtpZihsPjEpdGhyb3cgVHlwZUVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nIik7Zm9yKHAmJjE9PT1kJiZfKGQsZiksYT1kLGM9ZjsoZT1hPDI/dDpjKXx8IXA7KXtpfHwoYT9hPDM/KGE+MSYmKHUubj0tMSksXyhhLGMpKTp1Lm49Yzp1LnY9Yyk7dHJ5e2lmKGw9MixpKXtpZihhfHwobj0ibmV4dCIpLGU9aVtuXSl7aWYoIShlPWUuY2FsbChpLGMpKSl0aHJvdyBUeXBlRXJyb3IoIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0Iik7aWYoIWUuZG9uZSlyZXR1cm4gZTtjPWUudmFsdWUsYTwyJiYoYT0wKX1lbHNlIDE9PT1hJiYoZT1pLnJldHVybikmJmUuY2FsbChpKSxhPDImJihjPVR5cGVFcnJvcigiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAnIituKyInIG1ldGhvZCIpLGE9MSk7aT10fWVsc2UgaWYoKGU9KHA9dS5uPDApP2M6ci5jYWxsKG8sdSkpIT09cylicmVha31jYXRjaChlKXtpPXQsYT0xLGM9ZX1maW5hbGx5e2w9MX19cmV0dXJue3ZhbHVlOmUsZG9uZTpwfX19KHIsbixpKSwhMCksbH12YXIgcz17fTtmdW5jdGlvbiBhKCl7fWZ1bmN0aW9uIGMoKXt9ZnVuY3Rpb24gbCgpe31lPU9iamVjdC5nZXRQcm90b3R5cGVPZjt2YXIgZD1bXVtvXT9lKGUoW11bb10oKSkpOihfcmVnZW5lcmF0b3JEZWZpbmUoZT17fSxvLChmdW5jdGlvbigpe3JldHVybiB0aGlzfSkpLGUpLHA9bC5wcm90b3R5cGU9YS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShkKTtmdW5jdGlvbiB1KHQpe3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHQsbCk6KHQuX19wcm90b19fPWwsX3JlZ2VuZXJhdG9yRGVmaW5lKHQsbiwiR2VuZXJhdG9yRnVuY3Rpb24iKSksdC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShwKSx0fXJldHVybiBjLnByb3RvdHlwZT1sLF9yZWdlbmVyYXRvckRlZmluZShwLCJjb25zdHJ1Y3RvciIsbCksX3JlZ2VuZXJhdG9yRGVmaW5lKGwsImNvbnN0cnVjdG9yIixjKSxjLmRpc3BsYXlOYW1lPSJHZW5lcmF0b3JGdW5jdGlvbiIsX3JlZ2VuZXJhdG9yRGVmaW5lKGwsbiwiR2VuZXJhdG9yRnVuY3Rpb24iKSxfcmVnZW5lcmF0b3JEZWZpbmUocCksX3JlZ2VuZXJhdG9yRGVmaW5lKHAsbiwiR2VuZXJhdG9yIiksX3JlZ2VuZXJhdG9yRGVmaW5lKHAsbywoZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pKSxfcmVnZW5lcmF0b3JEZWZpbmUocCwidG9TdHJpbmciLChmdW5jdGlvbigpe3JldHVybiJbb2JqZWN0IEdlbmVyYXRvcl0ifSkpLChfcmVnZW5lcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm57dzppLG06dX19KSgpfWZ1bmN0aW9uIF9yZWdlbmVyYXRvckFzeW5jKHQsZSxyLG8sbil7dmFyIGk9X3JlZ2VuZXJhdG9yQXN5bmNHZW4odCxlLHIsbyxuKTtyZXR1cm4gaS5uZXh0KCkudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIHQuZG9uZT90LnZhbHVlOmkubmV4dCgpfSkpfWZ1bmN0aW9uIF9yZWdlbmVyYXRvckFzeW5jR2VuKHQsZSxyLG8sbil7cmV0dXJuIG5ldyBfcmVnZW5lcmF0b3JBc3luY0l0ZXJhdG9yKF9yZWdlbmVyYXRvcigpLncodCxlLHIsbyksbnx8UHJvbWlzZSl9ZnVuY3Rpb24gX3JlZ2VuZXJhdG9yQXN5bmNJdGVyYXRvcih0LGUpe2Z1bmN0aW9uIHIobyxuLGkscyl7dHJ5e3ZhciBhPXRbb10obiksYz1hLnZhbHVlO3JldHVybiBjIGluc3RhbmNlb2YgX092ZXJsb2FkWWllbGQ/ZS5yZXNvbHZlKGMudikudGhlbigoZnVuY3Rpb24odCl7cigibmV4dCIsdCxpLHMpfSksKGZ1bmN0aW9uKHQpe3IoInRocm93Iix0LGkscyl9KSk6ZS5yZXNvbHZlKGMpLnRoZW4oKGZ1bmN0aW9uKHQpe2EudmFsdWU9dCxpKGEpfSksKGZ1bmN0aW9uKHQpe3JldHVybiByKCJ0aHJvdyIsdCxpLHMpfSkpfWNhdGNoKHQpe3ModCl9fXZhciBvO3RoaXMubmV4dHx8KF9yZWdlbmVyYXRvckRlZmluZShfcmVnZW5lcmF0b3JBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSksX3JlZ2VuZXJhdG9yRGVmaW5lKF9yZWdlbmVyYXRvckFzeW5jSXRlcmF0b3IucHJvdG90eXBlLCJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5hc3luY0l0ZXJhdG9yfHwiQGFzeW5jSXRlcmF0b3IiLChmdW5jdGlvbigpe3JldHVybiB0aGlzfSkpKSxfcmVnZW5lcmF0b3JEZWZpbmUodGhpcywiX2ludm9rZSIsKGZ1bmN0aW9uKHQsbixpKXtmdW5jdGlvbiBzKCl7cmV0dXJuIG5ldyBlKChmdW5jdGlvbihlLG8pe3IodCxpLGUsbyl9KSl9cmV0dXJuIG89bz9vLnRoZW4ocyxzKTpzKCl9KSwhMCl9ZnVuY3Rpb24gX3JlZ2VuZXJhdG9yRGVmaW5lKHQsZSxyLG8pe3ZhciBuPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt0cnl7bih7fSwiIix7fSl9Y2F0Y2godCl7bj0wfV9yZWdlbmVyYXRvckRlZmluZT1mdW5jdGlvbih0LGUscixvKXtmdW5jdGlvbiBpKGUscil7X3JlZ2VuZXJhdG9yRGVmaW5lKHQsZSwoZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2ludm9rZShlLHIsdCl9KSl9ZT9uP24odCxlLHt2YWx1ZTpyLGVudW1lcmFibGU6IW8sY29uZmlndXJhYmxlOiFvLHdyaXRhYmxlOiFvfSk6dFtlXT1yOihpKCJuZXh0IiwwKSxpKCJ0aHJvdyIsMSksaSgicmV0dXJuIiwyKSl9LF9yZWdlbmVyYXRvckRlZmluZSh0LGUscixvKX1mdW5jdGlvbiBfcmVnZW5lcmF0b3JLZXlzKHQpe3ZhciBlPU9iamVjdCh0KSxyPVtdO2Zvcih2YXIgbyBpbiBlKXIudW5zaGlmdChvKTtyZXR1cm4gZnVuY3Rpb24gdCgpe2Zvcig7ci5sZW5ndGg7KWlmKChvPXIucG9wKCkpaW4gZSlyZXR1cm4gdC52YWx1ZT1vLHQuZG9uZT0hMSx0O3JldHVybiB0LmRvbmU9ITAsdH19ZnVuY3Rpb24gX3JlZ2VuZXJhdG9yVmFsdWVzKHQpe2lmKG51bGwhPXQpe3ZhciBlPXRbImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yfHwiQEBpdGVyYXRvciJdLHI9MDtpZihlKXJldHVybiBlLmNhbGwodCk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQubmV4dClyZXR1cm4gdDtpZighaXNOYU4odC5sZW5ndGgpKXJldHVybntuZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIHQmJnI+PXQubGVuZ3RoJiYodD12b2lkIDApLHt2YWx1ZTp0JiZ0W3IrK10sZG9uZTohdH19fX10aHJvdyBuZXcgVHlwZUVycm9yKHR5cGVvZiB0KyIgaXMgbm90IGl0ZXJhYmxlIil9ZnVuY3Rpb24gc2V0KHQsZSxyLG8pe3JldHVybiBzZXQ9InVuZGVmaW5lZCIhPXR5cGVvZiBSZWZsZWN0JiZSZWZsZWN0LnNldD9SZWZsZWN0LnNldDpmdW5jdGlvbih0LGUscixvKXt2YXIgbixpPV9zdXBlclByb3BCYXNlKHQsZSk7aWYoaSl7aWYoKG49T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpLGUpKS5zZXQpcmV0dXJuIG4uc2V0LmNhbGwobyxyKSwhMDtpZighbi53cml0YWJsZSlyZXR1cm4hMX1pZihuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobyxlKSl7aWYoIW4ud3JpdGFibGUpcmV0dXJuITE7bi52YWx1ZT1yLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLGUsbil9ZWxzZSBfZGVmaW5lUHJvcGVydHkobyxlLHIpO3JldHVybiEwfSxzZXQodCxlLHIsbyl9ZnVuY3Rpb24gX3NldCh0LGUscixvLG4pe2lmKCFzZXQodCxlLHIsb3x8dCkmJm4pdGhyb3cgbmV3IFR5cGVFcnJvcigiZmFpbGVkIHRvIHNldCBwcm9wZXJ0eSIpO3JldHVybiByfWZ1bmN0aW9uIF9zZXRGdW5jdGlvbk5hbWUodCxlLHIpeyJzeW1ib2wiPT10eXBlb2YgZSYmKGU9KGU9ZS5kZXNjcmlwdGlvbik/IlsiK2UrIl0iOiIiKTt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIm5hbWUiLHtjb25maWd1cmFibGU6ITAsdmFsdWU6cj9yKyIgIitlOmV9KX1jYXRjaCh0KXt9cmV0dXJuIHR9ZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKHQsZSl7cmV0dXJuIF9zZXRQcm90b3R5cGVPZj1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbih0LGUpe3JldHVybiB0Ll9fcHJvdG9fXz1lLHR9LF9zZXRQcm90b3R5cGVPZih0LGUpfWZ1bmN0aW9uIF9za2lwRmlyc3RHZW5lcmF0b3JOZXh0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBlLm5leHQoKSxlfX1mdW5jdGlvbiBfc2xpY2VkVG9BcnJheSh0LGUpe3JldHVybiBfYXJyYXlXaXRoSG9sZXModCl8fF9pdGVyYWJsZVRvQXJyYXlMaW1pdCh0LGUpfHxfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkodCxlKXx8X25vbkl0ZXJhYmxlUmVzdCgpfWZ1bmN0aW9uIF9zdXBlclByb3BCYXNlKHQsZSl7Zm9yKDshe30uaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpJiZudWxsIT09KHQ9X2dldFByb3RvdHlwZU9mKHQpKTspO3JldHVybiB0fWZ1bmN0aW9uIF9zdXBlclByb3BHZXQodCxlLHIsbyl7dmFyIG49X2dldChfZ2V0UHJvdG90eXBlT2YoMSZvP3QucHJvdG90eXBlOnQpLGUscik7cmV0dXJuIDImbyYmImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24odCl7cmV0dXJuIG4uYXBwbHkocix0KX06bn1mdW5jdGlvbiBfc3VwZXJQcm9wU2V0KHQsZSxyLG8sbixpKXtyZXR1cm4gX3NldChfZ2V0UHJvdG90eXBlT2YoaT90LnByb3RvdHlwZTp0KSxlLHIsbyxuKX1mdW5jdGlvbiBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKHQsZSl7cmV0dXJuIGV8fChlPXQuc2xpY2UoMCkpLE9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnRpZXModCx7cmF3Ont2YWx1ZTpPYmplY3QuZnJlZXplKGUpfX0pKX1mdW5jdGlvbiBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2UodCxlKXtyZXR1cm4gZXx8KGU9dC5zbGljZSgwKSksdC5yYXc9ZSx0fWZ1bmN0aW9uIF90ZHoodCl7dGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKHQrIiBpcyBub3QgZGVmaW5lZCAtIHRlbXBvcmFsIGRlYWQgem9uZSIpfWZ1bmN0aW9uIF90ZW1wb3JhbFJlZih0LGUpe3JldHVybiB0PT09X3RlbXBvcmFsVW5kZWZpbmVkP190ZHooZSk6dH1mdW5jdGlvbiBfdGVtcG9yYWxVbmRlZmluZWQoKXt9ZnVuY3Rpb24gX3RvQXJyYXkodCl7cmV0dXJuIF9hcnJheVdpdGhIb2xlcyh0KXx8X2l0ZXJhYmxlVG9BcnJheSh0KXx8X3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHQpfHxfbm9uSXRlcmFibGVSZXN0KCl9ZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KHQpe3JldHVybiBfYXJyYXlXaXRob3V0SG9sZXModCl8fF9pdGVyYWJsZVRvQXJyYXkodCl8fF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSh0KXx8X25vbkl0ZXJhYmxlU3ByZWFkKCl9ZnVuY3Rpb24gX3RvUHJpbWl0aXZlKHQsZSl7aWYoIm9iamVjdCIhPXR5cGVvZiB0fHwhdClyZXR1cm4gdDt2YXIgcj10W1N5bWJvbC50b1ByaW1pdGl2ZV07aWYodm9pZCAwIT09cil7dmFyIG89ci5jYWxsKHQsZXx8ImRlZmF1bHQiKTtpZigib2JqZWN0IiE9dHlwZW9mIG8pcmV0dXJuIG87dGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKX1yZXR1cm4oInN0cmluZyI9PT1lP1N0cmluZzpOdW1iZXIpKHQpfWZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KHQpe3ZhciBlPV90b1ByaW1pdGl2ZSh0LCJzdHJpbmciKTtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIGU/ZTplKyIifWZ1bmN0aW9uIF90b1NldHRlcih0LGUscil7ZXx8KGU9W10pO3ZhciBvPWUubGVuZ3RoKys7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwiXyIse3NldDpmdW5jdGlvbihuKXtlW29dPW4sdC5hcHBseShyLGUpfX0pfWZ1bmN0aW9uIF90c1Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbnModCxlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJi9eXC5cLj9cLy8udGVzdCh0KT90LnJlcGxhY2UoL1wuKHRzeCkkfCgoPzpcLmQpPykoKD86XC5bXi4vXSspPylcLihbY21dPyl0cyQvaSwoZnVuY3Rpb24odCxyLG8sbixpKXtyZXR1cm4gcj9lPyIuanN4IjoiLmpzIjohb3x8biYmaT9vK24rIi4iK2kudG9Mb3dlckNhc2UoKSsianMiOnR9KSk6dH1mdW5jdGlvbiBfdHlwZW9mKHQpe3JldHVybiBfdHlwZW9mPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSxfdHlwZW9mKHQpfWZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSh0LGUpe2lmKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkodCxlKTt2YXIgcj17fS50b1N0cmluZy5jYWxsKHQpLnNsaWNlKDgsLTEpO3JldHVybiJPYmplY3QiPT09ciYmdC5jb25zdHJ1Y3RvciYmKHI9dC5jb25zdHJ1Y3Rvci5uYW1lKSwiTWFwIj09PXJ8fCJTZXQiPT09cj9BcnJheS5mcm9tKHQpOiJBcmd1bWVudHMiPT09cnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3Qocik/X2FycmF5TGlrZVRvQXJyYXkodCxlKTp2b2lkIDB9fWZ1bmN0aW9uIF91c2luZ0N0eCgpe3ZhciB0PSJmdW5jdGlvbiI9PXR5cGVvZiBTdXBwcmVzc2VkRXJyb3I/U3VwcHJlc3NlZEVycm9yOmZ1bmN0aW9uKHQsZSl7dmFyIHI9RXJyb3IoKTtyZXR1cm4gci5uYW1lPSJTdXBwcmVzc2VkRXJyb3IiLHIuZXJyb3I9dCxyLnN1cHByZXNzZWQ9ZSxyfSxlPXt9LHI9W107ZnVuY3Rpb24gbyh0LGUpe2lmKG51bGwhPWUpe2lmKE9iamVjdChlKSE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigidXNpbmcgZGVjbGFyYXRpb25zIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBvYmplY3RzLCBmdW5jdGlvbnMsIG51bGwsIG9yIHVuZGVmaW5lZC4iKTtpZih0KXZhciBvPWVbU3ltYm9sLmFzeW5jRGlzcG9zZXx8U3ltYm9sLmZvcigiU3ltYm9sLmFzeW5jRGlzcG9zZSIpXTtpZih2b2lkIDA9PT1vJiYobz1lW1N5bWJvbC5kaXNwb3NlfHxTeW1ib2wuZm9yKCJTeW1ib2wuZGlzcG9zZSIpXSx0KSl2YXIgbj1vO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBvKXRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdCBpcyBub3QgZGlzcG9zYWJsZS4iKTtuJiYobz1mdW5jdGlvbigpe3RyeXtuLmNhbGwoZSl9Y2F0Y2godCl7cmV0dXJuIFByb21pc2UucmVqZWN0KHQpfX0pLHIucHVzaCh7djplLGQ6byxhOnR9KX1lbHNlIHQmJnIucHVzaCh7ZDplLGE6dH0pO3JldHVybiBlfXJldHVybntlOmUsdTpvLmJpbmQobnVsbCwhMSksYTpvLmJpbmQobnVsbCwhMCksZDpmdW5jdGlvbigpe3ZhciBvLG49dGhpcy5lLGk9MDtmdW5jdGlvbiBzKCl7Zm9yKDtvPXIucG9wKCk7KXRyeXtpZighby5hJiYxPT09aSlyZXR1cm4gaT0wLHIucHVzaChvKSxQcm9taXNlLnJlc29sdmUoKS50aGVuKHMpO2lmKG8uZCl7dmFyIHQ9by5kLmNhbGwoby52KTtpZihvLmEpcmV0dXJuIGl8PTIsUHJvbWlzZS5yZXNvbHZlKHQpLnRoZW4ocyxhKX1lbHNlIGl8PTF9Y2F0Y2godCl7cmV0dXJuIGEodCl9aWYoMT09PWkpcmV0dXJuIG4hPT1lP1Byb21pc2UucmVqZWN0KG4pOlByb21pc2UucmVzb2x2ZSgpO2lmKG4hPT1lKXRocm93IG59ZnVuY3Rpb24gYShyKXtyZXR1cm4gbj1uIT09ZT9uZXcgdChyLG4pOnIscygpfXJldHVybiBzKCl9fX1mdW5jdGlvbiBfd3JhcEFzeW5jR2VuZXJhdG9yKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgQXN5bmNHZW5lcmF0b3IodC5hcHBseSh0aGlzLGFyZ3VtZW50cykpfX1mdW5jdGlvbiBBc3luY0dlbmVyYXRvcih0KXt2YXIgZSxyO2Z1bmN0aW9uIG8oZSxyKXt0cnl7dmFyIGk9dFtlXShyKSxzPWkudmFsdWUsYT1zIGluc3RhbmNlb2YgX092ZXJsb2FkWWllbGQ7UHJvbWlzZS5yZXNvbHZlKGE/cy52OnMpLnRoZW4oKGZ1bmN0aW9uKHIpe2lmKGEpe3ZhciBjPSJyZXR1cm4iPT09ZSYmcy5rP2U6Im5leHQiO2lmKCFzLmt8fHIuZG9uZSlyZXR1cm4gbyhjLHIpO3I9dFtjXShyKS52YWx1ZX1uKCEhaS5kb25lLHIpfSksKGZ1bmN0aW9uKHQpe28oInRocm93Iix0KX0pKX1jYXRjaCh0KXtuKDIsdCl9fWZ1bmN0aW9uIG4odCxuKXsyPT09dD9lLnJlamVjdChuKTplLnJlc29sdmUoe3ZhbHVlOm4sZG9uZTp0fSksKGU9ZS5uZXh0KT9vKGUua2V5LGUuYXJnKTpyPW51bGx9dGhpcy5faW52b2tlPWZ1bmN0aW9uKHQsbil7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihpLHMpe3ZhciBhPXtrZXk6dCxhcmc6bixyZXNvbHZlOmkscmVqZWN0OnMsbmV4dDpudWxsfTtyP3I9ci5uZXh0PWE6KGU9cj1hLG8odCxuKSl9KSl9LCJmdW5jdGlvbiIhPXR5cGVvZiB0LnJldHVybiYmKHRoaXMucmV0dXJuPXZvaWQgMCl9ZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcih0KXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgTWFwP25ldyBNYXA6dm9pZCAwO3JldHVybiBfd3JhcE5hdGl2ZVN1cGVyPWZ1bmN0aW9uKHQpe2lmKG51bGw9PT10fHwhX2lzTmF0aXZlRnVuY3Rpb24odCkpcmV0dXJuIHQ7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTtpZih2b2lkIDAhPT1lKXtpZihlLmhhcyh0KSlyZXR1cm4gZS5nZXQodCk7ZS5zZXQodCxyKX1mdW5jdGlvbiByKCl7cmV0dXJuIF9jb25zdHJ1Y3QodCxhcmd1bWVudHMsX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yKX1yZXR1cm4gci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnIsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksX3NldFByb3RvdHlwZU9mKHIsdCl9LF93cmFwTmF0aXZlU3VwZXIodCl9ZnVuY3Rpb24gX3dyYXBSZWdFeHAoKXtfd3JhcFJlZ0V4cD1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgcih0LHZvaWQgMCxlKX07dmFyIHQ9UmVnRXhwLnByb3RvdHlwZSxlPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIHIodCxvLG4pe3ZhciBpPVJlZ0V4cCh0LG8pO3JldHVybiBlLnNldChpLG58fGUuZ2V0KHQpKSxfc2V0UHJvdG90eXBlT2YoaSxyLnByb3RvdHlwZSl9ZnVuY3Rpb24gbyh0LHIpe3ZhciBvPWUuZ2V0KHIpO3JldHVybiBPYmplY3Qua2V5cyhvKS5yZWR1Y2UoKGZ1bmN0aW9uKGUscil7dmFyIG49b1tyXTtpZigibnVtYmVyIj09dHlwZW9mIG4pZVtyXT10W25dO2Vsc2V7Zm9yKHZhciBpPTA7dm9pZCAwPT09dFtuW2ldXSYmaSsxPG4ubGVuZ3RoOylpKys7ZVtyXT10W25baV1dfXJldHVybiBlfSksT2JqZWN0LmNyZWF0ZShudWxsKSl9cmV0dXJuIF9pbmhlcml0cyhyLFJlZ0V4cCksci5wcm90b3R5cGUuZXhlYz1mdW5jdGlvbihlKXt2YXIgcj10LmV4ZWMuY2FsbCh0aGlzLGUpO2lmKHIpe3IuZ3JvdXBzPW8ocix0aGlzKTt2YXIgbj1yLmluZGljZXM7biYmKG4uZ3JvdXBzPW8obix0aGlzKSl9cmV0dXJuIHJ9LHIucHJvdG90eXBlW1N5bWJvbC5yZXBsYWNlXT1mdW5jdGlvbihyLG4pe2lmKCJzdHJpbmciPT10eXBlb2Ygbil7dmFyIGk9ZS5nZXQodGhpcyk7cmV0dXJuIHRbU3ltYm9sLnJlcGxhY2VdLmNhbGwodGhpcyxyLG4ucmVwbGFjZSgvXCQ8KFtePl0rKSg+fCQpL2csKGZ1bmN0aW9uKHQsZSxyKXtpZigiIj09PXIpcmV0dXJuIHQ7dmFyIG89aVtlXTtyZXR1cm4gQXJyYXkuaXNBcnJheShvKT8iJCIrby5qb2luKCIkIik6Im51bWJlciI9PXR5cGVvZiBvPyIkIitvOiIifSkpKX1pZigiZnVuY3Rpb24iPT10eXBlb2Ygbil7dmFyIHM9dGhpcztyZXR1cm4gdFtTeW1ib2wucmVwbGFjZV0uY2FsbCh0aGlzLHIsKGZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzO3JldHVybiJvYmplY3QiIT10eXBlb2YgdFt0Lmxlbmd0aC0xXSYmKHQ9W10uc2xpY2UuY2FsbCh0KSkucHVzaChvKHQscykpLG4uYXBwbHkodGhpcyx0KX0pKX1yZXR1cm4gdFtTeW1ib2wucmVwbGFjZV0uY2FsbCh0aGlzLHIsbil9LF93cmFwUmVnRXhwLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBfd3JpdGVPbmx5RXJyb3IodCl7dGhyb3cgbmV3IFR5cGVFcnJvcignIicrdCsnIiBpcyB3cml0ZS1vbmx5Jyl9ZnVuY3Rpb24gX0F3YWl0VmFsdWUodCl7dGhpcy53cmFwcGVkPXR9ZnVuY3Rpb24gb2xkX2NyZWF0ZU1ldGFkYXRhTWV0aG9kc0ZvclByb3BlcnR5KHQsZSxyLG8pe3JldHVybntnZXRNZXRhZGF0YTpmdW5jdGlvbihuKXtvbGRfYXNzZXJ0Tm90RmluaXNoZWQobywiZ2V0TWV0YWRhdGEiKSxvbGRfYXNzZXJ0TWV0YWRhdGFLZXkobik7dmFyIGk9dFtuXTtpZih2b2lkIDAhPT1pKWlmKDE9PT1lKXt2YXIgcz1pLnB1YmxpYztpZih2b2lkIDAhPT1zKXJldHVybiBzW3JdfWVsc2UgaWYoMj09PWUpe3ZhciBhPWkucHJpdmF0ZTtpZih2b2lkIDAhPT1hKXJldHVybiBhLmdldChyKX1lbHNlIGlmKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGksImNvbnN0cnVjdG9yIikpcmV0dXJuIGkuY29uc3RydWN0b3J9LHNldE1ldGFkYXRhOmZ1bmN0aW9uKG4saSl7b2xkX2Fzc2VydE5vdEZpbmlzaGVkKG8sInNldE1ldGFkYXRhIiksb2xkX2Fzc2VydE1ldGFkYXRhS2V5KG4pO3ZhciBzPXRbbl07aWYodm9pZCAwPT09cyYmKHM9dFtuXT17fSksMT09PWUpe3ZhciBhPXMucHVibGljO3ZvaWQgMD09PWEmJihhPXMucHVibGljPXt9KSxhW3JdPWl9ZWxzZSBpZigyPT09ZSl7dmFyIGM9cy5wcml2O3ZvaWQgMD09PWMmJihjPXMucHJpdmF0ZT1uZXcgTWFwKSxjLnNldChyLGkpfWVsc2Ugcy5jb25zdHJ1Y3Rvcj1pfX19ZnVuY3Rpb24gb2xkX2NvbnZlcnRNZXRhZGF0YU1hcFRvRmluYWwodCxlKXt2YXIgcj10W1N5bWJvbC5tZXRhZGF0YXx8U3ltYm9sLmZvcigiU3ltYm9sLm1ldGFkYXRhIildLG89T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtpZigwIT09by5sZW5ndGgpe2Zvcih2YXIgbj0wO248by5sZW5ndGg7bisrKXt2YXIgaT1vW25dLHM9ZVtpXSxhPXI/cltpXTpudWxsLGM9cy5wdWJsaWMsbD1hP2EucHVibGljOm51bGw7YyYmbCYmT2JqZWN0LnNldFByb3RvdHlwZU9mKGMsbCk7dmFyIGQ9cy5wcml2YXRlO2lmKGQpe3ZhciBwPUFycmF5LmZyb20oZC52YWx1ZXMoKSksdT1hP2EucHJpdmF0ZTpudWxsO3UmJihwPXAuY29uY2F0KHUpKSxzLnByaXZhdGU9cH1hJiZPYmplY3Quc2V0UHJvdG90eXBlT2YocyxhKX1yJiZPYmplY3Quc2V0UHJvdG90eXBlT2YoZSxyKSx0W1N5bWJvbC5tZXRhZGF0YXx8U3ltYm9sLmZvcigiU3ltYm9sLm1ldGFkYXRhIildPWV9fWZ1bmN0aW9uIG9sZF9jcmVhdGVBZGRJbml0aWFsaXplck1ldGhvZCh0LGUpe3JldHVybiBmdW5jdGlvbihyKXtvbGRfYXNzZXJ0Tm90RmluaXNoZWQoZSwiYWRkSW5pdGlhbGl6ZXIiKSxvbGRfYXNzZXJ0Q2FsbGFibGUociwiQW4gaW5pdGlhbGl6ZXIiKSx0LnB1c2gocil9fWZ1bmN0aW9uIG9sZF9tZW1iZXJEZWModCxlLHIsbyxuLGkscyxhLGMpe3ZhciBsO3N3aXRjaChpKXtjYXNlIDE6bD0iYWNjZXNzb3IiO2JyZWFrO2Nhc2UgMjpsPSJtZXRob2QiO2JyZWFrO2Nhc2UgMzpsPSJnZXR0ZXIiO2JyZWFrO2Nhc2UgNDpsPSJzZXR0ZXIiO2JyZWFrO2RlZmF1bHQ6bD0iZmllbGQifXZhciBkLHAsdT17a2luZDpsLG5hbWU6YT8iIyIrZTpfdG9Qcm9wZXJ0eUtleShlKSxpc1N0YXRpYzpzLGlzUHJpdmF0ZTphfSxfPXt2OiExfTtpZigwIT09aSYmKHUuYWRkSW5pdGlhbGl6ZXI9b2xkX2NyZWF0ZUFkZEluaXRpYWxpemVyTWV0aG9kKG4sXykpLGEpe2Q9MixwPVN5bWJvbChlKTt2YXIgZj17fTswPT09aT8oZi5nZXQ9ci5nZXQsZi5zZXQ9ci5zZXQpOjI9PT1pP2YuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHIudmFsdWV9OigxIT09aSYmMyE9PWl8fChmLmdldD1mdW5jdGlvbigpe3JldHVybiByLmdldC5jYWxsKHRoaXMpfSksMSE9PWkmJjQhPT1pfHwoZi5zZXQ9ZnVuY3Rpb24odCl7ci5zZXQuY2FsbCh0aGlzLHQpfSkpLHUuYWNjZXNzPWZ9ZWxzZSBkPTEscD1lO3RyeXtyZXR1cm4gdChjLE9iamVjdC5hc3NpZ24odSxvbGRfY3JlYXRlTWV0YWRhdGFNZXRob2RzRm9yUHJvcGVydHkobyxkLHAsXykpKX1maW5hbGx5e18udj0hMH19ZnVuY3Rpb24gb2xkX2Fzc2VydE5vdEZpbmlzaGVkKHQsZSl7aWYodC52KXRocm93IEVycm9yKCJhdHRlbXB0ZWQgdG8gY2FsbCAiK2UrIiBhZnRlciBkZWNvcmF0aW9uIHdhcyBmaW5pc2hlZCIpfWZ1bmN0aW9uIG9sZF9hc3NlcnRNZXRhZGF0YUtleSh0KXtpZigic3ltYm9sIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiTWV0YWRhdGEga2V5cyBtdXN0IGJlIHN5bWJvbHMsIHJlY2VpdmVkOiAiK3QpfWZ1bmN0aW9uIG9sZF9hc3NlcnRDYWxsYWJsZSh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoZSsiIG11c3QgYmUgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIG9sZF9hc3NlcnRWYWxpZFJldHVyblZhbHVlKHQsZSl7dmFyIHI9dHlwZW9mIGU7aWYoMT09PXQpe2lmKCJvYmplY3QiIT09cnx8bnVsbD09PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiYWNjZXNzb3IgZGVjb3JhdG9ycyBtdXN0IHJldHVybiBhbiBvYmplY3Qgd2l0aCBnZXQsIHNldCwgb3IgaW5pdCBwcm9wZXJ0aWVzIG9yIHZvaWQgMCIpO3ZvaWQgMCE9PWUuZ2V0JiZvbGRfYXNzZXJ0Q2FsbGFibGUoZS5nZXQsImFjY2Vzc29yLmdldCIpLHZvaWQgMCE9PWUuc2V0JiZvbGRfYXNzZXJ0Q2FsbGFibGUoZS5zZXQsImFjY2Vzc29yLnNldCIpLHZvaWQgMCE9PWUuaW5pdCYmb2xkX2Fzc2VydENhbGxhYmxlKGUuaW5pdCwiYWNjZXNzb3IuaW5pdCIpLHZvaWQgMCE9PWUuaW5pdGlhbGl6ZXImJm9sZF9hc3NlcnRDYWxsYWJsZShlLmluaXRpYWxpemVyLCJhY2Nlc3Nvci5pbml0aWFsaXplciIpfWVsc2UgaWYoImZ1bmN0aW9uIiE9PXIpdGhyb3cgbmV3IFR5cGVFcnJvcigoMD09PXQ/ImZpZWxkIjoxMD09PXQ/ImNsYXNzIjoibWV0aG9kIikrIiBkZWNvcmF0b3JzIG11c3QgcmV0dXJuIGEgZnVuY3Rpb24gb3Igdm9pZCAwIil9ZnVuY3Rpb24gb2xkX2dldEluaXQodCl7dmFyIGU7cmV0dXJuIG51bGw9PShlPXQuaW5pdCkmJihlPXQuaW5pdGlhbGl6ZXIpJiZ2b2lkIDAhPT1jb25zb2xlJiZjb25zb2xlLndhcm4oIi5pbml0aWFsaXplciBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbml0IGFzIG9mIE1hcmNoIDIwMjIiKSxlfWZ1bmN0aW9uIG9sZF9hcHBseU1lbWJlckRlYyh0LGUscixvLG4saSxzLGEsYyl7dmFyIGwsZCxwLHUsXyxmLHksdj1yWzBdO2lmKHM/KDA9PT1ufHwxPT09bj8obD17Z2V0OnJbM10sc2V0OnJbNF19LHA9ImdldCIpOjM9PT1uPyhsPXtnZXQ6clszXX0scD0iZ2V0Iik6ND09PW4/KGw9e3NldDpyWzNdfSxwPSJzZXQiKTpsPXt2YWx1ZTpyWzNdfSwwIT09biYmKDE9PT1uJiZfc2V0RnVuY3Rpb25OYW1lKHJbNF0sIiMiK28sInNldCIpLF9zZXRGdW5jdGlvbk5hbWUoclszXSwiIyIrbyxwKSkpOjAhPT1uJiYobD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsbykpLDE9PT1uP3U9e2dldDpsLmdldCxzZXQ6bC5zZXR9OjI9PT1uP3U9bC52YWx1ZTozPT09bj91PWwuZ2V0OjQ9PT1uJiYodT1sLnNldCksImZ1bmN0aW9uIj09dHlwZW9mIHYpdm9pZCAwIT09KF89b2xkX21lbWJlckRlYyh2LG8sbCxhLGMsbixpLHMsdSkpJiYob2xkX2Fzc2VydFZhbGlkUmV0dXJuVmFsdWUobixfKSwwPT09bj9kPV86MT09PW4/KGQ9b2xkX2dldEluaXQoXyksZj1fLmdldHx8dS5nZXQseT1fLnNldHx8dS5zZXQsdT17Z2V0OmYsc2V0Onl9KTp1PV8pO2Vsc2UgZm9yKHZhciBnPXYubGVuZ3RoLTE7Zz49MDtnLS0pe3ZhciBtO3ZvaWQgMCE9PShfPW9sZF9tZW1iZXJEZWModltnXSxvLGwsYSxjLG4saSxzLHUpKSYmKG9sZF9hc3NlcnRWYWxpZFJldHVyblZhbHVlKG4sXyksMD09PW4/bT1fOjE9PT1uPyhtPW9sZF9nZXRJbml0KF8pLGY9Xy5nZXR8fHUuZ2V0LHk9Xy5zZXR8fHUuc2V0LHU9e2dldDpmLHNldDp5fSk6dT1fLHZvaWQgMCE9PW0mJih2b2lkIDA9PT1kP2Q9bToiZnVuY3Rpb24iPT10eXBlb2YgZD9kPVtkLG1dOmQucHVzaChtKSkpfWlmKDA9PT1ufHwxPT09bil7aWYodm9pZCAwPT09ZClkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV9O2Vsc2UgaWYoImZ1bmN0aW9uIiE9dHlwZW9mIGQpe3ZhciBoPWQ7ZD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj1lLG89MDtvPGgubGVuZ3RoO28rKylyPWhbb10uY2FsbCh0LHIpO3JldHVybiByfX1lbHNle3ZhciBiPWQ7ZD1mdW5jdGlvbih0LGUpe3JldHVybiBiLmNhbGwodCxlKX19dC5wdXNoKGQpfTAhPT1uJiYoMT09PW4/KGwuZ2V0PXUuZ2V0LGwuc2V0PXUuc2V0KToyPT09bj9sLnZhbHVlPXU6Mz09PW4/bC5nZXQ9dTo0PT09biYmKGwuc2V0PXUpLHM/MT09PW4/KHQucHVzaCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdS5nZXQuY2FsbCh0LGUpfSkpLHQucHVzaCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdS5zZXQuY2FsbCh0LGUpfSkpKToyPT09bj90LnB1c2godSk6dC5wdXNoKChmdW5jdGlvbih0LGUpe3JldHVybiB1LmNhbGwodCxlKX0pKTpPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxvLGwpKX1mdW5jdGlvbiBvbGRfYXBwbHlNZW1iZXJEZWNzKHQsZSxyLG8sbil7Zm9yKHZhciBpLHMsYT1uZXcgTWFwLGM9bmV3IE1hcCxsPTA7bDxuLmxlbmd0aDtsKyspe3ZhciBkPW5bbF07aWYoQXJyYXkuaXNBcnJheShkKSl7dmFyIHAsdSxfLGY9ZFsxXSx5PWRbMl0sdj1kLmxlbmd0aD4zLGc9Zj49NTtpZihnPyhwPWUsdT1vLDAhPShmLT01KSYmKF89cz1zfHxbXSkpOihwPWUucHJvdG90eXBlLHU9ciwwIT09ZiYmKF89aT1pfHxbXSkpLDAhPT1mJiYhdil7dmFyIG09Zz9jOmEsaD1tLmdldCh5KXx8MDtpZighMD09PWh8fDM9PT1oJiY0IT09Znx8ND09PWgmJjMhPT1mKXRocm93IEVycm9yKCJBdHRlbXB0ZWQgdG8gZGVjb3JhdGUgYSBwdWJsaWMgbWV0aG9kL2FjY2Vzc29yIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgYXMgYSBwcmV2aW91c2x5IGRlY29yYXRlZCBwdWJsaWMgbWV0aG9kL2FjY2Vzc29yLiBUaGlzIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IHRoZSBkZWNvcmF0b3JzIHBsdWdpbi4gUHJvcGVydHkgbmFtZSB3YXM6ICIreSk7IWgmJmY+Mj9tLnNldCh5LGYpOm0uc2V0KHksITApfW9sZF9hcHBseU1lbWJlckRlYyh0LHAsZCx5LGYsZyx2LHUsXyl9fW9sZF9wdXNoSW5pdGlhbGl6ZXJzKHQsaSksb2xkX3B1c2hJbml0aWFsaXplcnModCxzKX1mdW5jdGlvbiBvbGRfcHVzaEluaXRpYWxpemVycyh0LGUpe2UmJnQucHVzaCgoZnVuY3Rpb24odCl7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspZVtyXS5jYWxsKHQpO3JldHVybiB0fSkpfWZ1bmN0aW9uIG9sZF9hcHBseUNsYXNzRGVjcyh0LGUscixvKXtpZihvLmxlbmd0aD4wKXtmb3IodmFyIG49W10saT1lLHM9ZS5uYW1lLGE9by5sZW5ndGgtMTthPj0wO2EtLSl7dmFyIGM9e3Y6ITF9O3RyeXt2YXIgbD1PYmplY3QuYXNzaWduKHtraW5kOiJjbGFzcyIsbmFtZTpzLGFkZEluaXRpYWxpemVyOm9sZF9jcmVhdGVBZGRJbml0aWFsaXplck1ldGhvZChuLGMpfSxvbGRfY3JlYXRlTWV0YWRhdGFNZXRob2RzRm9yUHJvcGVydHkociwwLHMsYykpLGQ9b1thXShpLGwpfWZpbmFsbHl7Yy52PSEwfXZvaWQgMCE9PWQmJihvbGRfYXNzZXJ0VmFsaWRSZXR1cm5WYWx1ZSgxMCxkKSxpPWQpfXQucHVzaChpLChmdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8bi5sZW5ndGg7dCsrKW5bdF0uY2FsbChpKX0pKX19ZnVuY3Rpb24gX2FwcGx5RGVjcyh0LGUscil7dmFyIG89W10sbj17fSxpPXt9O3JldHVybiBvbGRfYXBwbHlNZW1iZXJEZWNzKG8sdCxpLG4sZSksb2xkX2NvbnZlcnRNZXRhZGF0YU1hcFRvRmluYWwodC5wcm90b3R5cGUsaSksb2xkX2FwcGx5Q2xhc3NEZWNzKG8sdCxuLHIpLG9sZF9jb252ZXJ0TWV0YWRhdGFNYXBUb0ZpbmFsKHQsbiksb31mdW5jdGlvbiBhcHBseURlY3MyMjAzRmFjdG9yeSgpe2Z1bmN0aW9uIHQodCxlKXtyZXR1cm4gZnVuY3Rpb24obyl7IWZ1bmN0aW9uKHQpe2lmKHQudil0aHJvdyBFcnJvcigiYXR0ZW1wdGVkIHRvIGNhbGwgYWRkSW5pdGlhbGl6ZXIgYWZ0ZXIgZGVjb3JhdGlvbiB3YXMgZmluaXNoZWQiKX0oZSkscihvLCJBbiBpbml0aWFsaXplciIpLHQucHVzaChvKX19ZnVuY3Rpb24gZShlLHIsbyxuLGkscyxhLGMpe3ZhciBsO3N3aXRjaChpKXtjYXNlIDE6bD0iYWNjZXNzb3IiO2JyZWFrO2Nhc2UgMjpsPSJtZXRob2QiO2JyZWFrO2Nhc2UgMzpsPSJnZXR0ZXIiO2JyZWFrO2Nhc2UgNDpsPSJzZXR0ZXIiO2JyZWFrO2RlZmF1bHQ6bD0iZmllbGQifXZhciBkLHAsdT17a2luZDpsLG5hbWU6YT8iIyIrcjpyLHN0YXRpYzpzLHByaXZhdGU6YX0sXz17djohMX07MCE9PWkmJih1LmFkZEluaXRpYWxpemVyPXQobixfKSksMD09PWk/YT8oZD1vLmdldCxwPW8uc2V0KTooZD1mdW5jdGlvbigpe3JldHVybiB0aGlzW3JdfSxwPWZ1bmN0aW9uKHQpe3RoaXNbcl09dH0pOjI9PT1pP2Q9ZnVuY3Rpb24oKXtyZXR1cm4gby52YWx1ZX06KDEhPT1pJiYzIT09aXx8KGQ9ZnVuY3Rpb24oKXtyZXR1cm4gby5nZXQuY2FsbCh0aGlzKX0pLDEhPT1pJiY0IT09aXx8KHA9ZnVuY3Rpb24odCl7by5zZXQuY2FsbCh0aGlzLHQpfSkpLHUuYWNjZXNzPWQmJnA/e2dldDpkLHNldDpwfTpkP3tnZXQ6ZH06e3NldDpwfTt0cnl7cmV0dXJuIGUoYyx1KX1maW5hbGx5e18udj0hMH19ZnVuY3Rpb24gcih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoZSsiIG11c3QgYmUgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIG8odCxlKXt2YXIgbz10eXBlb2YgZTtpZigxPT09dCl7aWYoIm9iamVjdCIhPT1vfHxudWxsPT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJhY2Nlc3NvciBkZWNvcmF0b3JzIG11c3QgcmV0dXJuIGFuIG9iamVjdCB3aXRoIGdldCwgc2V0LCBvciBpbml0IHByb3BlcnRpZXMgb3Igdm9pZCAwIik7dm9pZCAwIT09ZS5nZXQmJnIoZS5nZXQsImFjY2Vzc29yLmdldCIpLHZvaWQgMCE9PWUuc2V0JiZyKGUuc2V0LCJhY2Nlc3Nvci5zZXQiKSx2b2lkIDAhPT1lLmluaXQmJnIoZS5pbml0LCJhY2Nlc3Nvci5pbml0Iil9ZWxzZSBpZigiZnVuY3Rpb24iIT09byl0aHJvdyBuZXcgVHlwZUVycm9yKCgwPT09dD8iZmllbGQiOjEwPT09dD8iY2xhc3MiOiJtZXRob2QiKSsiIGRlY29yYXRvcnMgbXVzdCByZXR1cm4gYSBmdW5jdGlvbiBvciB2b2lkIDAiKX1mdW5jdGlvbiBuKHQscixuLGkscyxhLGMsbCl7dmFyIGQscCx1LF8sZix5LHY9blswXTtpZihjP2Q9MD09PXN8fDE9PT1zP3tnZXQ6blszXSxzZXQ6bls0XX06Mz09PXM/e2dldDpuWzNdfTo0PT09cz97c2V0Om5bM119Ont2YWx1ZTpuWzNdfTowIT09cyYmKGQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLGkpKSwxPT09cz91PXtnZXQ6ZC5nZXQsc2V0OmQuc2V0fToyPT09cz91PWQudmFsdWU6Mz09PXM/dT1kLmdldDo0PT09cyYmKHU9ZC5zZXQpLCJmdW5jdGlvbiI9PXR5cGVvZiB2KXZvaWQgMCE9PShfPWUodixpLGQsbCxzLGEsYyx1KSkmJihvKHMsXyksMD09PXM/cD1fOjE9PT1zPyhwPV8uaW5pdCxmPV8uZ2V0fHx1LmdldCx5PV8uc2V0fHx1LnNldCx1PXtnZXQ6ZixzZXQ6eX0pOnU9Xyk7ZWxzZSBmb3IodmFyIGc9di5sZW5ndGgtMTtnPj0wO2ctLSl7dmFyIG07dm9pZCAwIT09KF89ZSh2W2ddLGksZCxsLHMsYSxjLHUpKSYmKG8ocyxfKSwwPT09cz9tPV86MT09PXM/KG09Xy5pbml0LGY9Xy5nZXR8fHUuZ2V0LHk9Xy5zZXR8fHUuc2V0LHU9e2dldDpmLHNldDp5fSk6dT1fLHZvaWQgMCE9PW0mJih2b2lkIDA9PT1wP3A9bToiZnVuY3Rpb24iPT10eXBlb2YgcD9wPVtwLG1dOnAucHVzaChtKSkpfWlmKDA9PT1zfHwxPT09cyl7aWYodm9pZCAwPT09cClwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV9O2Vsc2UgaWYoImZ1bmN0aW9uIiE9dHlwZW9mIHApe3ZhciBoPXA7cD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj1lLG89MDtvPGgubGVuZ3RoO28rKylyPWhbb10uY2FsbCh0LHIpO3JldHVybiByfX1lbHNle3ZhciBiPXA7cD1mdW5jdGlvbih0LGUpe3JldHVybiBiLmNhbGwodCxlKX19dC5wdXNoKHApfTAhPT1zJiYoMT09PXM/KGQuZ2V0PXUuZ2V0LGQuc2V0PXUuc2V0KToyPT09cz9kLnZhbHVlPXU6Mz09PXM/ZC5nZXQ9dTo0PT09cyYmKGQuc2V0PXUpLGM/MT09PXM/KHQucHVzaCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdS5nZXQuY2FsbCh0LGUpfSkpLHQucHVzaCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdS5zZXQuY2FsbCh0LGUpfSkpKToyPT09cz90LnB1c2godSk6dC5wdXNoKChmdW5jdGlvbih0LGUpe3JldHVybiB1LmNhbGwodCxlKX0pKTpPYmplY3QuZGVmaW5lUHJvcGVydHkocixpLGQpKX1mdW5jdGlvbiBpKHQsZSl7ZSYmdC5wdXNoKChmdW5jdGlvbih0KXtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyllW3JdLmNhbGwodCk7cmV0dXJuIHR9KSl9cmV0dXJuIGZ1bmN0aW9uKGUscixzKXt2YXIgYT1bXTtyZXR1cm4gZnVuY3Rpb24odCxlLHIpe2Zvcih2YXIgbyxzLGE9bmV3IE1hcCxjPW5ldyBNYXAsbD0wO2w8ci5sZW5ndGg7bCsrKXt2YXIgZD1yW2xdO2lmKEFycmF5LmlzQXJyYXkoZCkpe3ZhciBwLHUsXz1kWzFdLGY9ZFsyXSx5PWQubGVuZ3RoPjMsdj1fPj01O2lmKHY/KHA9ZSwwIT0oXy09NSkmJih1PXM9c3x8W10pKToocD1lLnByb3RvdHlwZSwwIT09XyYmKHU9bz1vfHxbXSkpLDAhPT1fJiYheSl7dmFyIGc9dj9jOmEsbT1nLmdldChmKXx8MDtpZighMD09PW18fDM9PT1tJiY0IT09X3x8ND09PW0mJjMhPT1fKXRocm93IEVycm9yKCJBdHRlbXB0ZWQgdG8gZGVjb3JhdGUgYSBwdWJsaWMgbWV0aG9kL2FjY2Vzc29yIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgYXMgYSBwcmV2aW91c2x5IGRlY29yYXRlZCBwdWJsaWMgbWV0aG9kL2FjY2Vzc29yLiBUaGlzIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IHRoZSBkZWNvcmF0b3JzIHBsdWdpbi4gUHJvcGVydHkgbmFtZSB3YXM6ICIrZik7IW0mJl8+Mj9nLnNldChmLF8pOmcuc2V0KGYsITApfW4odCxwLGQsZixfLHYseSx1KX19aSh0LG8pLGkodCxzKX0oYSxlLHIpLGZ1bmN0aW9uKGUscixuKXtpZihuLmxlbmd0aD4wKXtmb3IodmFyIGk9W10scz1yLGE9ci5uYW1lLGM9bi5sZW5ndGgtMTtjPj0wO2MtLSl7dmFyIGw9e3Y6ITF9O3RyeXt2YXIgZD1uW2NdKHMse2tpbmQ6ImNsYXNzIixuYW1lOmEsYWRkSW5pdGlhbGl6ZXI6dChpLGwpfSl9ZmluYWxseXtsLnY9ITB9dm9pZCAwIT09ZCYmKG8oMTAsZCkscz1kKX1lLnB1c2gocywoZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PGkubGVuZ3RoO3QrKylpW3RdLmNhbGwocyl9KSl9fShhLGUscyksYX19ZnVuY3Rpb24gX2FwcGx5RGVjczIyMDModCxlLHIpe3JldHVybihhcHBseURlY3MyMjAzSW1wbD1hcHBseURlY3MyMjAzSW1wbHx8YXBwbHlEZWNzMjIwM0ZhY3RvcnkoKSkodCxlLHIpfWZ1bmN0aW9uIGFwcGx5RGVjczIyMDNSRmFjdG9yeSgpe2Z1bmN0aW9uIHQodCxlKXtyZXR1cm4gZnVuY3Rpb24obyl7IWZ1bmN0aW9uKHQpe2lmKHQudil0aHJvdyBFcnJvcigiYXR0ZW1wdGVkIHRvIGNhbGwgYWRkSW5pdGlhbGl6ZXIgYWZ0ZXIgZGVjb3JhdGlvbiB3YXMgZmluaXNoZWQiKX0oZSkscihvLCJBbiBpbml0aWFsaXplciIpLHQucHVzaChvKX19ZnVuY3Rpb24gZShlLHIsbyxuLGkscyxhLGMpe3ZhciBsO3N3aXRjaChpKXtjYXNlIDE6bD0iYWNjZXNzb3IiO2JyZWFrO2Nhc2UgMjpsPSJtZXRob2QiO2JyZWFrO2Nhc2UgMzpsPSJnZXR0ZXIiO2JyZWFrO2Nhc2UgNDpsPSJzZXR0ZXIiO2JyZWFrO2RlZmF1bHQ6bD0iZmllbGQifXZhciBkLHAsdT17a2luZDpsLG5hbWU6YT8iIyIrcjpfdG9Qcm9wZXJ0eUtleShyKSxzdGF0aWM6cyxwcml2YXRlOmF9LF89e3Y6ITF9OzAhPT1pJiYodS5hZGRJbml0aWFsaXplcj10KG4sXykpLDA9PT1pP2E/KGQ9by5nZXQscD1vLnNldCk6KGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tyXX0scD1mdW5jdGlvbih0KXt0aGlzW3JdPXR9KToyPT09aT9kPWZ1bmN0aW9uKCl7cmV0dXJuIG8udmFsdWV9OigxIT09aSYmMyE9PWl8fChkPWZ1bmN0aW9uKCl7cmV0dXJuIG8uZ2V0LmNhbGwodGhpcyl9KSwxIT09aSYmNCE9PWl8fChwPWZ1bmN0aW9uKHQpe28uc2V0LmNhbGwodGhpcyx0KX0pKSx1LmFjY2Vzcz1kJiZwP3tnZXQ6ZCxzZXQ6cH06ZD97Z2V0OmR9OntzZXQ6cH07dHJ5e3JldHVybiBlKGMsdSl9ZmluYWxseXtfLnY9ITB9fWZ1bmN0aW9uIHIodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKGUrIiBtdXN0IGJlIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBvKHQsZSl7dmFyIG89dHlwZW9mIGU7aWYoMT09PXQpe2lmKCJvYmplY3QiIT09b3x8bnVsbD09PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiYWNjZXNzb3IgZGVjb3JhdG9ycyBtdXN0IHJldHVybiBhbiBvYmplY3Qgd2l0aCBnZXQsIHNldCwgb3IgaW5pdCBwcm9wZXJ0aWVzIG9yIHZvaWQgMCIpO3ZvaWQgMCE9PWUuZ2V0JiZyKGUuZ2V0LCJhY2Nlc3Nvci5nZXQiKSx2b2lkIDAhPT1lLnNldCYmcihlLnNldCwiYWNjZXNzb3Iuc2V0Iiksdm9pZCAwIT09ZS5pbml0JiZyKGUuaW5pdCwiYWNjZXNzb3IuaW5pdCIpfWVsc2UgaWYoImZ1bmN0aW9uIiE9PW8pdGhyb3cgbmV3IFR5cGVFcnJvcigoMD09PXQ/ImZpZWxkIjoxMD09PXQ/ImNsYXNzIjoibWV0aG9kIikrIiBkZWNvcmF0b3JzIG11c3QgcmV0dXJuIGEgZnVuY3Rpb24gb3Igdm9pZCAwIil9ZnVuY3Rpb24gbih0LHIsbixpLHMsYSxjLGwpe3ZhciBkLHAsdSxfLGYseSx2LGc9blswXTtpZihjPygwPT09c3x8MT09PXM/KGQ9e2dldDpuWzNdLHNldDpuWzRdfSx1PSJnZXQiKTozPT09cz8oZD17Z2V0Om5bM119LHU9ImdldCIpOjQ9PT1zPyhkPXtzZXQ6blszXX0sdT0ic2V0Iik6ZD17dmFsdWU6blszXX0sMCE9PXMmJigxPT09cyYmX3NldEZ1bmN0aW9uTmFtZShuWzRdLCIjIitpLCJzZXQiKSxfc2V0RnVuY3Rpb25OYW1lKG5bM10sIiMiK2ksdSkpKTowIT09cyYmKGQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLGkpKSwxPT09cz9fPXtnZXQ6ZC5nZXQsc2V0OmQuc2V0fToyPT09cz9fPWQudmFsdWU6Mz09PXM/Xz1kLmdldDo0PT09cyYmKF89ZC5zZXQpLCJmdW5jdGlvbiI9PXR5cGVvZiBnKXZvaWQgMCE9PShmPWUoZyxpLGQsbCxzLGEsYyxfKSkmJihvKHMsZiksMD09PXM/cD1mOjE9PT1zPyhwPWYuaW5pdCx5PWYuZ2V0fHxfLmdldCx2PWYuc2V0fHxfLnNldCxfPXtnZXQ6eSxzZXQ6dn0pOl89Zik7ZWxzZSBmb3IodmFyIG09Zy5sZW5ndGgtMTttPj0wO20tLSl7dmFyIGg7dm9pZCAwIT09KGY9ZShnW21dLGksZCxsLHMsYSxjLF8pKSYmKG8ocyxmKSwwPT09cz9oPWY6MT09PXM/KGg9Zi5pbml0LHk9Zi5nZXR8fF8uZ2V0LHY9Zi5zZXR8fF8uc2V0LF89e2dldDp5LHNldDp2fSk6Xz1mLHZvaWQgMCE9PWgmJih2b2lkIDA9PT1wP3A9aDoiZnVuY3Rpb24iPT10eXBlb2YgcD9wPVtwLGhdOnAucHVzaChoKSkpfWlmKDA9PT1zfHwxPT09cyl7aWYodm9pZCAwPT09cClwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV9O2Vsc2UgaWYoImZ1bmN0aW9uIiE9dHlwZW9mIHApe3ZhciBiPXA7cD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj1lLG89MDtvPGIubGVuZ3RoO28rKylyPWJbb10uY2FsbCh0LHIpO3JldHVybiByfX1lbHNle3ZhciB3PXA7cD1mdW5jdGlvbih0LGUpe3JldHVybiB3LmNhbGwodCxlKX19dC5wdXNoKHApfTAhPT1zJiYoMT09PXM/KGQuZ2V0PV8uZ2V0LGQuc2V0PV8uc2V0KToyPT09cz9kLnZhbHVlPV86Mz09PXM/ZC5nZXQ9Xzo0PT09cyYmKGQuc2V0PV8pLGM/MT09PXM/KHQucHVzaCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gXy5nZXQuY2FsbCh0LGUpfSkpLHQucHVzaCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gXy5zZXQuY2FsbCh0LGUpfSkpKToyPT09cz90LnB1c2goXyk6dC5wdXNoKChmdW5jdGlvbih0LGUpe3JldHVybiBfLmNhbGwodCxlKX0pKTpPYmplY3QuZGVmaW5lUHJvcGVydHkocixpLGQpKX1mdW5jdGlvbiBpKHQsZSl7Zm9yKHZhciByLG8saT1bXSxhPW5ldyBNYXAsYz1uZXcgTWFwLGw9MDtsPGUubGVuZ3RoO2wrKyl7dmFyIGQ9ZVtsXTtpZihBcnJheS5pc0FycmF5KGQpKXt2YXIgcCx1LF89ZFsxXSxmPWRbMl0seT1kLmxlbmd0aD4zLHY9Xz49NTtpZih2PyhwPXQsMCE9KF8tPTUpJiYodT1vPW98fFtdKSk6KHA9dC5wcm90b3R5cGUsMCE9PV8mJih1PXI9cnx8W10pKSwwIT09XyYmIXkpe3ZhciBnPXY/YzphLG09Zy5nZXQoZil8fDA7aWYoITA9PT1tfHwzPT09bSYmNCE9PV98fDQ9PT1tJiYzIT09Xyl0aHJvdyBFcnJvcigiQXR0ZW1wdGVkIHRvIGRlY29yYXRlIGEgcHVibGljIG1ldGhvZC9hY2Nlc3NvciB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIGEgcHJldmlvdXNseSBkZWNvcmF0ZWQgcHVibGljIG1ldGhvZC9hY2Nlc3Nvci4gVGhpcyBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBieSB0aGUgZGVjb3JhdG9ycyBwbHVnaW4uIFByb3BlcnR5IG5hbWUgd2FzOiAiK2YpOyFtJiZfPjI/Zy5zZXQoZixfKTpnLnNldChmLCEwKX1uKGkscCxkLGYsXyx2LHksdSl9fXJldHVybiBzKGkscikscyhpLG8pLGl9ZnVuY3Rpb24gcyh0LGUpe2UmJnQucHVzaCgoZnVuY3Rpb24odCl7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspZVtyXS5jYWxsKHQpO3JldHVybiB0fSkpfXJldHVybiBmdW5jdGlvbihlLHIsbil7cmV0dXJue2U6aShlLHIpLGdldCBjKCl7cmV0dXJuIGZ1bmN0aW9uKGUscil7aWYoci5sZW5ndGg+MCl7Zm9yKHZhciBuPVtdLGk9ZSxzPWUubmFtZSxhPXIubGVuZ3RoLTE7YT49MDthLS0pe3ZhciBjPXt2OiExfTt0cnl7dmFyIGw9clthXShpLHtraW5kOiJjbGFzcyIsbmFtZTpzLGFkZEluaXRpYWxpemVyOnQobixjKX0pfWZpbmFsbHl7Yy52PSEwfXZvaWQgMCE9PWwmJihvKDEwLGwpLGk9bCl9cmV0dXJuW2ksZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PG4ubGVuZ3RoO3QrKyluW3RdLmNhbGwoaSl9XX19KGUsbil9fX19ZnVuY3Rpb24gX2FwcGx5RGVjczIyMDNSKHQsZSxyKXtyZXR1cm4oX2FwcGx5RGVjczIyMDNSPWFwcGx5RGVjczIyMDNSRmFjdG9yeSgpKSh0LGUscil9ZnVuY3Rpb24gYXBwbHlEZWNzMjMwMUZhY3RvcnkoKXtmdW5jdGlvbiB0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpeyFmdW5jdGlvbih0KXtpZih0LnYpdGhyb3cgRXJyb3IoImF0dGVtcHRlZCB0byBjYWxsIGFkZEluaXRpYWxpemVyIGFmdGVyIGRlY29yYXRpb24gd2FzIGZpbmlzaGVkIil9KGUpLG8ociwiQW4gaW5pdGlhbGl6ZXIiKSx0LnB1c2gocil9fWZ1bmN0aW9uIGUodCxlKXtpZighdChlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBdHRlbXB0ZWQgdG8gYWNjZXNzIHByaXZhdGUgZWxlbWVudCBvbiBub24taW5zdGFuY2UiKX1mdW5jdGlvbiByKHIsbyxuLGkscyxhLGMsbCxkKXt2YXIgcDtzd2l0Y2gocyl7Y2FzZSAxOnA9ImFjY2Vzc29yIjticmVhaztjYXNlIDI6cD0ibWV0aG9kIjticmVhaztjYXNlIDM6cD0iZ2V0dGVyIjticmVhaztjYXNlIDQ6cD0ic2V0dGVyIjticmVhaztkZWZhdWx0OnA9ImZpZWxkIn12YXIgdSxfLGY9e2tpbmQ6cCxuYW1lOmM/IiMiK286X3RvUHJvcGVydHlLZXkobyksc3RhdGljOmEscHJpdmF0ZTpjfSx5PXt2OiExfTtpZigwIT09cyYmKGYuYWRkSW5pdGlhbGl6ZXI9dChpLHkpKSxjfHwwIT09cyYmMiE9PXMpaWYoMj09PXMpdT1mdW5jdGlvbih0KXtyZXR1cm4gZShkLHQpLG4udmFsdWV9O2Vsc2V7dmFyIHY9MD09PXN8fDE9PT1zOyh2fHwzPT09cykmJih1PWM/ZnVuY3Rpb24odCl7cmV0dXJuIGUoZCx0KSxuLmdldC5jYWxsKHQpfTpmdW5jdGlvbih0KXtyZXR1cm4gbi5nZXQuY2FsbCh0KX0pLCh2fHw0PT09cykmJihfPWM/ZnVuY3Rpb24odCxyKXtlKGQsdCksbi5zZXQuY2FsbCh0LHIpfTpmdW5jdGlvbih0LGUpe24uc2V0LmNhbGwodCxlKX0pfWVsc2UgdT1mdW5jdGlvbih0KXtyZXR1cm4gdFtvXX0sMD09PXMmJihfPWZ1bmN0aW9uKHQsZSl7dFtvXT1lfSk7dmFyIGc9Yz9kLmJpbmQoKTpmdW5jdGlvbih0KXtyZXR1cm4gbyBpbiB0fTtmLmFjY2Vzcz11JiZfP3tnZXQ6dSxzZXQ6XyxoYXM6Z306dT97Z2V0OnUsaGFzOmd9OntzZXQ6XyxoYXM6Z307dHJ5e3JldHVybiByKGwsZil9ZmluYWxseXt5LnY9ITB9fWZ1bmN0aW9uIG8odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKGUrIiBtdXN0IGJlIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBuKHQsZSl7dmFyIHI9dHlwZW9mIGU7aWYoMT09PXQpe2lmKCJvYmplY3QiIT09cnx8bnVsbD09PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiYWNjZXNzb3IgZGVjb3JhdG9ycyBtdXN0IHJldHVybiBhbiBvYmplY3Qgd2l0aCBnZXQsIHNldCwgb3IgaW5pdCBwcm9wZXJ0aWVzIG9yIHZvaWQgMCIpO3ZvaWQgMCE9PWUuZ2V0JiZvKGUuZ2V0LCJhY2Nlc3Nvci5nZXQiKSx2b2lkIDAhPT1lLnNldCYmbyhlLnNldCwiYWNjZXNzb3Iuc2V0Iiksdm9pZCAwIT09ZS5pbml0JiZvKGUuaW5pdCwiYWNjZXNzb3IuaW5pdCIpfWVsc2UgaWYoImZ1bmN0aW9uIiE9PXIpdGhyb3cgbmV3IFR5cGVFcnJvcigoMD09PXQ/ImZpZWxkIjoxMD09PXQ/ImNsYXNzIjoibWV0aG9kIikrIiBkZWNvcmF0b3JzIG11c3QgcmV0dXJuIGEgZnVuY3Rpb24gb3Igdm9pZCAwIil9ZnVuY3Rpb24gaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dCh0aGlzLGUpfX1mdW5jdGlvbiBzKHQsZSxvLHMsYSxjLGwsZCxwKXt2YXIgdSxfLGYseSx2LGcsbSxoLGI9b1swXTtpZihsPygwPT09YXx8MT09PWE/KHU9e2dldDoodj1vWzNdLGZ1bmN0aW9uKCl7cmV0dXJuIHYodGhpcyl9KSxzZXQ6aShvWzRdKX0sZj0iZ2V0Iik6Mz09PWE/KHU9e2dldDpvWzNdfSxmPSJnZXQiKTo0PT09YT8odT17c2V0Om9bM119LGY9InNldCIpOnU9e3ZhbHVlOm9bM119LDAhPT1hJiYoMT09PWEmJl9zZXRGdW5jdGlvbk5hbWUodS5zZXQsIiMiK3MsInNldCIpLF9zZXRGdW5jdGlvbk5hbWUodVtmfHwidmFsdWUiXSwiIyIrcyxmKSkpOjAhPT1hJiYodT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUscykpLDE9PT1hP3k9e2dldDp1LmdldCxzZXQ6dS5zZXR9OjI9PT1hP3k9dS52YWx1ZTozPT09YT95PXUuZ2V0OjQ9PT1hJiYoeT11LnNldCksImZ1bmN0aW9uIj09dHlwZW9mIGIpdm9pZCAwIT09KGc9cihiLHMsdSxkLGEsYyxsLHkscCkpJiYobihhLGcpLDA9PT1hP189ZzoxPT09YT8oXz1nLmluaXQsbT1nLmdldHx8eS5nZXQsaD1nLnNldHx8eS5zZXQseT17Z2V0Om0sc2V0Omh9KTp5PWcpO2Vsc2UgZm9yKHZhciB3PWIubGVuZ3RoLTE7dz49MDt3LS0pe3ZhciBTO3ZvaWQgMCE9PShnPXIoYlt3XSxzLHUsZCxhLGMsbCx5LHApKSYmKG4oYSxnKSwwPT09YT9TPWc6MT09PWE/KFM9Zy5pbml0LG09Zy5nZXR8fHkuZ2V0LGg9Zy5zZXR8fHkuc2V0LHk9e2dldDptLHNldDpofSk6eT1nLHZvaWQgMCE9PVMmJih2b2lkIDA9PT1fP189UzoiZnVuY3Rpb24iPT10eXBlb2YgXz9fPVtfLFNdOl8ucHVzaChTKSkpfWlmKDA9PT1hfHwxPT09YSl7aWYodm9pZCAwPT09XylfPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV9O2Vsc2UgaWYoImZ1bmN0aW9uIiE9dHlwZW9mIF8pe3ZhciBFPV87Xz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj1lLG89MDtvPEUubGVuZ3RoO28rKylyPUVbb10uY2FsbCh0LHIpO3JldHVybiByfX1lbHNle3ZhciBQPV87Xz1mdW5jdGlvbih0LGUpe3JldHVybiBQLmNhbGwodCxlKX19dC5wdXNoKF8pfTAhPT1hJiYoMT09PWE/KHUuZ2V0PXkuZ2V0LHUuc2V0PXkuc2V0KToyPT09YT91LnZhbHVlPXk6Mz09PWE/dS5nZXQ9eTo0PT09YSYmKHUuc2V0PXkpLGw/MT09PWE/KHQucHVzaCgoZnVuY3Rpb24odCxlKXtyZXR1cm4geS5nZXQuY2FsbCh0LGUpfSkpLHQucHVzaCgoZnVuY3Rpb24odCxlKXtyZXR1cm4geS5zZXQuY2FsbCh0LGUpfSkpKToyPT09YT90LnB1c2goeSk6dC5wdXNoKChmdW5jdGlvbih0LGUpe3JldHVybiB5LmNhbGwodCxlKX0pKTpPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxzLHUpKX1mdW5jdGlvbiBhKHQsZSxyKXtmb3IodmFyIG8sbixpLGE9W10sbD1uZXcgTWFwLGQ9bmV3IE1hcCxwPTA7cDxlLmxlbmd0aDtwKyspe3ZhciB1PWVbcF07aWYoQXJyYXkuaXNBcnJheSh1KSl7dmFyIF8sZix5PXVbMV0sdj11WzJdLGc9dS5sZW5ndGg+MyxtPXk+PTUsaD1yO2lmKG0/KF89dCwwIT0oeS09NSkmJihmPW49bnx8W10pLGcmJiFpJiYoaT1mdW5jdGlvbihlKXtyZXR1cm4gX2NoZWNrSW5SSFMoZSk9PT10fSksaD1pKTooXz10LnByb3RvdHlwZSwwIT09eSYmKGY9bz1vfHxbXSkpLDAhPT15JiYhZyl7dmFyIGI9bT9kOmwsdz1iLmdldCh2KXx8MDtpZighMD09PXd8fDM9PT13JiY0IT09eXx8ND09PXcmJjMhPT15KXRocm93IEVycm9yKCJBdHRlbXB0ZWQgdG8gZGVjb3JhdGUgYSBwdWJsaWMgbWV0aG9kL2FjY2Vzc29yIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgYXMgYSBwcmV2aW91c2x5IGRlY29yYXRlZCBwdWJsaWMgbWV0aG9kL2FjY2Vzc29yLiBUaGlzIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IHRoZSBkZWNvcmF0b3JzIHBsdWdpbi4gUHJvcGVydHkgbmFtZSB3YXM6ICIrdik7IXcmJnk+Mj9iLnNldCh2LHkpOmIuc2V0KHYsITApfXMoYSxfLHUsdix5LG0sZyxmLGgpfX1yZXR1cm4gYyhhLG8pLGMoYSxuKSxhfWZ1bmN0aW9uIGModCxlKXtlJiZ0LnB1c2goKGZ1bmN0aW9uKHQpe2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKWVbcl0uY2FsbCh0KTtyZXR1cm4gdH0pKX1yZXR1cm4gZnVuY3Rpb24oZSxyLG8saSl7cmV0dXJue2U6YShlLHIsaSksZ2V0IGMoKXtyZXR1cm4gZnVuY3Rpb24oZSxyKXtpZihyLmxlbmd0aD4wKXtmb3IodmFyIG89W10saT1lLHM9ZS5uYW1lLGE9ci5sZW5ndGgtMTthPj0wO2EtLSl7dmFyIGM9e3Y6ITF9O3RyeXt2YXIgbD1yW2FdKGkse2tpbmQ6ImNsYXNzIixuYW1lOnMsYWRkSW5pdGlhbGl6ZXI6dChvLGMpfSl9ZmluYWxseXtjLnY9ITB9dm9pZCAwIT09bCYmKG4oMTAsbCksaT1sKX1yZXR1cm5baSxmdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8by5sZW5ndGg7dCsrKW9bdF0uY2FsbChpKX1dfX0oZSxvKX19fX1mdW5jdGlvbiBfYXBwbHlEZWNzMjMwMSh0LGUscixvKXtyZXR1cm4oX2FwcGx5RGVjczIzMDE9YXBwbHlEZWNzMjMwMUZhY3RvcnkoKSkodCxlLHIsbyl9ZnVuY3Rpb24gX2FwcGx5RGVjczIzMDUodCxlLHIsbyxuLGkpe2Z1bmN0aW9uIHModCxlLHIpe3JldHVybiBmdW5jdGlvbihvLG4pe3JldHVybiByJiZyKG8pLHRbZV0uY2FsbChvLG4pfX1mdW5jdGlvbiBhKHQsZSl7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspdFtyXS5jYWxsKGUpO3JldHVybiBlfWZ1bmN0aW9uIGModCxlLHIsbyl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJihvfHx2b2lkIDAhPT10KSl0aHJvdyBuZXcgVHlwZUVycm9yKGUrIiBtdXN0ICIrKHJ8fCJiZSIpKyIgYSBmdW5jdGlvbiIrKG8/IiI6IiBvciB1bmRlZmluZWQiKSk7cmV0dXJuIHR9ZnVuY3Rpb24gbCh0LGUscixvLG4saSxhLGwsZCxwLHUsXyxmKXtmdW5jdGlvbiB5KHQpe2lmKCFmKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkF0dGVtcHRlZCB0byBhY2Nlc3MgcHJpdmF0ZSBlbGVtZW50IG9uIG5vbi1pbnN0YW5jZSIpfXZhciB2LGc9ZVswXSxtPWVbM10saD0hbDtpZighaCl7cnx8QXJyYXkuaXNBcnJheShnKXx8KGc9W2ddKTt2YXIgYj17fSx3PVtdLFM9Mz09PW4/ImdldCI6ND09PW58fF8/InNldCI6InZhbHVlIjtwPyh1fHxfP2I9e2dldDpfc2V0RnVuY3Rpb25OYW1lKChmdW5jdGlvbigpe3JldHVybiBtKHRoaXMpfSksbywiZ2V0Iiksc2V0OmZ1bmN0aW9uKHQpe2VbNF0odGhpcyx0KX19OmJbU109bSx1fHxfc2V0RnVuY3Rpb25OYW1lKGJbU10sbywyPT09bj8iIjpTKSk6dXx8KGI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LG8pKX1mb3IodmFyIEU9dCxQPWcubGVuZ3RoLTE7UD49MDtQLT1yPzI6MSl7dmFyIHg9Z1tQXSxDPXI/Z1tQLTFdOnZvaWQgMCxBPXt9LGo9e2tpbmQ6WyJmaWVsZCIsImFjY2Vzc29yIiwibWV0aG9kIiwiZ2V0dGVyIiwic2V0dGVyIiwiY2xhc3MiXVtuXSxuYW1lOm8sbWV0YWRhdGE6aSxhZGRJbml0aWFsaXplcjpmdW5jdGlvbih0LGUpe2lmKHQudil0aHJvdyBFcnJvcigiYXR0ZW1wdGVkIHRvIGNhbGwgYWRkSW5pdGlhbGl6ZXIgYWZ0ZXIgZGVjb3JhdGlvbiB3YXMgZmluaXNoZWQiKTtjKGUsIkFuIGluaXRpYWxpemVyIiwiYmUiLCEwKSxhLnB1c2goZSl9LmJpbmQobnVsbCxBKX07dHJ5e2lmKGgpKHY9Yyh4LmNhbGwoQyxFLGopLCJjbGFzcyBkZWNvcmF0b3JzIiwicmV0dXJuIikpJiYoRT12KTtlbHNle3ZhciBPLGs7ai5zdGF0aWM9ZCxqLnByaXZhdGU9cCxwPzI9PT1uP089ZnVuY3Rpb24odCl7cmV0dXJuIHkodCksYi52YWx1ZX06KG48NCYmKE89cyhiLCJnZXQiLHkpKSwzIT09biYmKGs9cyhiLCJzZXQiLHkpKSk6KE89ZnVuY3Rpb24odCl7cmV0dXJuIHRbb119LChuPDJ8fDQ9PT1uKSYmKGs9ZnVuY3Rpb24odCxlKXt0W29dPWV9KSk7dmFyIEw9ai5hY2Nlc3M9e2hhczpwP2YuYmluZCgpOmZ1bmN0aW9uKHQpe3JldHVybiBvIGluIHR9fTtpZihPJiYoTC5nZXQ9TyksayYmKEwuc2V0PWspLEU9eC5jYWxsKEMsXz97Z2V0OmIuZ2V0LHNldDpiLnNldH06YltTXSxqKSxfKXtpZigib2JqZWN0Ij09dHlwZW9mIEUmJkUpKHY9YyhFLmdldCwiYWNjZXNzb3IuZ2V0IikpJiYoYi5nZXQ9diksKHY9YyhFLnNldCwiYWNjZXNzb3Iuc2V0IikpJiYoYi5zZXQ9diksKHY9YyhFLmluaXQsImFjY2Vzc29yLmluaXQiKSkmJncucHVzaCh2KTtlbHNlIGlmKHZvaWQgMCE9PUUpdGhyb3cgbmV3IFR5cGVFcnJvcigiYWNjZXNzb3IgZGVjb3JhdG9ycyBtdXN0IHJldHVybiBhbiBvYmplY3Qgd2l0aCBnZXQsIHNldCwgb3IgaW5pdCBwcm9wZXJ0aWVzIG9yIHZvaWQgMCIpfWVsc2UgYyhFLCh1PyJmaWVsZCI6Im1ldGhvZCIpKyIgZGVjb3JhdG9ycyIsInJldHVybiIpJiYodT93LnB1c2goRSk6YltTXT1FKX19ZmluYWxseXtBLnY9ITB9fXJldHVybih1fHxfKSYmbC5wdXNoKChmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj13Lmxlbmd0aC0xO3I+PTA7ci0tKWU9d1tyXS5jYWxsKHQsZSk7cmV0dXJuIGV9KSksdXx8aHx8KHA/Xz9sLnB1c2gocyhiLCJnZXQiKSxzKGIsInNldCIpKTpsLnB1c2goMj09PW4/YltTXTpzLmNhbGwuYmluZChiW1NdKSk6T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbyxiKSksRX1mdW5jdGlvbiBkKHQsZSl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFN5bWJvbC5tZXRhZGF0YXx8U3ltYm9sLmZvcigiU3ltYm9sLm1ldGFkYXRhIikse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmV9KX1pZihhcmd1bWVudHMubGVuZ3RoPj02KXZhciBwPWlbU3ltYm9sLm1ldGFkYXRhfHxTeW1ib2wuZm9yKCJTeW1ib2wubWV0YWRhdGEiKV07dmFyIHU9T2JqZWN0LmNyZWF0ZShudWxsPT1wP251bGw6cCksXz1mdW5jdGlvbih0LGUscixvKXt2YXIgbixpLHM9W10sYz1mdW5jdGlvbihlKXtyZXR1cm4gX2NoZWNrSW5SSFMoZSk9PT10fSxkPW5ldyBNYXA7ZnVuY3Rpb24gcCh0KXt0JiZzLnB1c2goYS5iaW5kKG51bGwsdCkpfWZvcih2YXIgdT0wO3U8ZS5sZW5ndGg7dSsrKXt2YXIgXz1lW3VdO2lmKEFycmF5LmlzQXJyYXkoXykpe3ZhciBmPV9bMV0seT1fWzJdLHY9Xy5sZW5ndGg+MyxnPTE2JmYsbT0hISg4JmYpLGg9MD09KGYmPTcpLGI9eSsiLyIrbTtpZighaCYmIXYpe3ZhciB3PWQuZ2V0KGIpO2lmKCEwPT09d3x8Mz09PXcmJjQhPT1mfHw0PT09dyYmMyE9PWYpdGhyb3cgRXJyb3IoIkF0dGVtcHRlZCB0byBkZWNvcmF0ZSBhIHB1YmxpYyBtZXRob2QvYWNjZXNzb3IgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSBhcyBhIHByZXZpb3VzbHkgZGVjb3JhdGVkIHB1YmxpYyBtZXRob2QvYWNjZXNzb3IuIFRoaXMgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgdGhlIGRlY29yYXRvcnMgcGx1Z2luLiBQcm9wZXJ0eSBuYW1lIHdhczogIit5KTtkLnNldChiLCEoZj4yKXx8Zil9bChtP3Q6dC5wcm90b3R5cGUsXyxnLHY/IiMiK3k6X3RvUHJvcGVydHlLZXkoeSksZixvLG0/aT1pfHxbXTpuPW58fFtdLHMsbSx2LGgsMT09PWYsbSYmdj9jOnIpfX1yZXR1cm4gcChuKSxwKGkpLHN9KHQsZSxuLHUpO3JldHVybiByLmxlbmd0aHx8ZCh0LHUpLHtlOl8sZ2V0IGMoKXt2YXIgZT1bXTtyZXR1cm4gci5sZW5ndGgmJltkKGwodCxbcl0sbyx0Lm5hbWUsNSx1LGUpLHUpLGEuYmluZChudWxsLGUsdCldfX19ZnVuY3Rpb24gX2NsYXNzQXBwbHlEZXNjcmlwdG9yRGVzdHJ1Y3R1cmVTZXQodCxlKXtpZihlLnNldClyZXR1cm4iX19kZXN0ck9iaiJpbiBlfHwoZS5fX2Rlc3RyT2JqPXtzZXQgdmFsdWUocil7ZS5zZXQuY2FsbCh0LHIpfX0pLGUuX19kZXN0ck9iajtpZighZS53cml0YWJsZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJhdHRlbXB0ZWQgdG8gc2V0IHJlYWQgb25seSBwcml2YXRlIGZpZWxkIik7cmV0dXJuIGV9ZnVuY3Rpb24gX2NsYXNzQXBwbHlEZXNjcmlwdG9yR2V0KHQsZSl7cmV0dXJuIGUuZ2V0P2UuZ2V0LmNhbGwodCk6ZS52YWx1ZX1mdW5jdGlvbiBfY2xhc3NBcHBseURlc2NyaXB0b3JTZXQodCxlLHIpe2lmKGUuc2V0KWUuc2V0LmNhbGwodCxyKTtlbHNle2lmKCFlLndyaXRhYmxlKXRocm93IG5ldyBUeXBlRXJyb3IoImF0dGVtcHRlZCB0byBzZXQgcmVhZCBvbmx5IHByaXZhdGUgZmllbGQiKTtlLnZhbHVlPXJ9fWZ1bmN0aW9uIF9jbGFzc0NoZWNrUHJpdmF0ZVN0YXRpY0FjY2Vzcyh0LGUscil7cmV0dXJuIF9hc3NlcnRDbGFzc0JyYW5kKGUsdCxyKX1mdW5jdGlvbiBfY2xhc3NDaGVja1ByaXZhdGVTdGF0aWNGaWVsZERlc2NyaXB0b3IodCxlKXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBUeXBlRXJyb3IoImF0dGVtcHRlZCB0byAiK2UrIiBwcml2YXRlIHN0YXRpYyBmaWVsZCBiZWZvcmUgaXRzIGRlY2xhcmF0aW9uIil9ZnVuY3Rpb24gX2NsYXNzRXh0cmFjdEZpZWxkRGVzY3JpcHRvcih0LGUpe3JldHVybiBfY2xhc3NQcml2YXRlRmllbGRHZXQyKGUsdCl9ZnVuY3Rpb24gX2NsYXNzUHJpdmF0ZUZpZWxkRGVzdHJ1Y3R1cmVTZXQodCxlKXt2YXIgcjtyZXR1cm4gX2NsYXNzQXBwbHlEZXNjcmlwdG9yRGVzdHJ1Y3R1cmVTZXQodCxfY2xhc3NQcml2YXRlRmllbGRHZXQyKGUsdCkpfWZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVGaWVsZEdldCh0LGUpe3ZhciByO3JldHVybiBfY2xhc3NBcHBseURlc2NyaXB0b3JHZXQodCxfY2xhc3NQcml2YXRlRmllbGRHZXQyKGUsdCkpfWZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVGaWVsZFNldCh0LGUscil7dmFyIG87cmV0dXJuIF9jbGFzc0FwcGx5RGVzY3JpcHRvclNldCh0LF9jbGFzc1ByaXZhdGVGaWVsZEdldDIoZSx0KSxyKSxyfWZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVNZXRob2RHZXQodCxlLHIpe3JldHVybiBfYXNzZXJ0Q2xhc3NCcmFuZChlLHQpLHJ9ZnVuY3Rpb24gX2NsYXNzUHJpdmF0ZU1ldGhvZFNldCgpe3Rocm93IG5ldyBUeXBlRXJyb3IoImF0dGVtcHRlZCB0byByZWFzc2lnbiBwcml2YXRlIG1ldGhvZCIpfWZ1bmN0aW9uIF9jbGFzc1N0YXRpY1ByaXZhdGVGaWVsZERlc3RydWN0dXJlU2V0KHQsZSxyKXtyZXR1cm4gX2Fzc2VydENsYXNzQnJhbmQoZSx0KSxfY2xhc3NDaGVja1ByaXZhdGVTdGF0aWNGaWVsZERlc2NyaXB0b3Iociwic2V0IiksX2NsYXNzQXBwbHlEZXNjcmlwdG9yRGVzdHJ1Y3R1cmVTZXQodCxyKX1mdW5jdGlvbiBfY2xhc3NTdGF0aWNQcml2YXRlRmllbGRTcGVjR2V0KHQsZSxyKXtyZXR1cm4gX2Fzc2VydENsYXNzQnJhbmQoZSx0KSxfY2xhc3NDaGVja1ByaXZhdGVTdGF0aWNGaWVsZERlc2NyaXB0b3IociwiZ2V0IiksX2NsYXNzQXBwbHlEZXNjcmlwdG9yR2V0KHQscil9ZnVuY3Rpb24gX2NsYXNzU3RhdGljUHJpdmF0ZUZpZWxkU3BlY1NldCh0LGUscixvKXtyZXR1cm4gX2Fzc2VydENsYXNzQnJhbmQoZSx0KSxfY2xhc3NDaGVja1ByaXZhdGVTdGF0aWNGaWVsZERlc2NyaXB0b3Iociwic2V0IiksX2NsYXNzQXBwbHlEZXNjcmlwdG9yU2V0KHQscixvKSxvfWZ1bmN0aW9uIF9jbGFzc1N0YXRpY1ByaXZhdGVNZXRob2RTZXQoKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJhdHRlbXB0ZWQgdG8gc2V0IHJlYWQgb25seSBzdGF0aWMgcHJpdmF0ZSBmaWVsZCIpfWZ1bmN0aW9uIF9kZWZpbmVFbnVtZXJhYmxlUHJvcGVydGllcyh0LGUpe2Zvcih2YXIgciBpbiBlKXt2YXIgbz1lW3JdO28uY29uZmlndXJhYmxlPW8uZW51bWVyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIsbyl9aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scylmb3IodmFyIG49T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKSxpPTA7aTxuLmxlbmd0aDtpKyspe3ZhciBzPW5baV07KG89ZVtzXSkuY29uZmlndXJhYmxlPW8uZW51bWVyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHMsbyl9cmV0dXJuIHR9ZnVuY3Rpb24gZGlzcG9zZV9TdXBwcmVzc2VkRXJyb3IodCxlKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIFN1cHByZXNzZWRFcnJvcj9kaXNwb3NlX1N1cHByZXNzZWRFcnJvcj1TdXBwcmVzc2VkRXJyb3I6KGRpc3Bvc2VfU3VwcHJlc3NlZEVycm9yPWZ1bmN0aW9uKHQsZSl7dGhpcy5zdXBwcmVzc2VkPWUsdGhpcy5lcnJvcj10LHRoaXMuc3RhY2s9RXJyb3IoKS5zdGFja30sZGlzcG9zZV9TdXBwcmVzc2VkRXJyb3IucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZGlzcG9zZV9TdXBwcmVzc2VkRXJyb3Isd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pKSxuZXcgZGlzcG9zZV9TdXBwcmVzc2VkRXJyb3IodCxlKX1mdW5jdGlvbiBfZGlzcG9zZSh0LGUscil7ZnVuY3Rpb24gbygpe2Zvcig7dC5sZW5ndGg+MDspdHJ5e3ZhciBpPXQucG9wKCkscz1pLmQuY2FsbChpLnYpO2lmKGkuYSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHMpLnRoZW4obyxuKX1jYXRjaCh0KXtyZXR1cm4gbih0KX1pZihyKXRocm93IGV9ZnVuY3Rpb24gbih0KXtyZXR1cm4gZT1yP25ldyBkaXNwb3NlX1N1cHByZXNzZWRFcnJvcihlLHQpOnQscj0hMCxvKCl9cmV0dXJuIG8oKX1mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciByPW51bGwhPWFyZ3VtZW50c1tlXT9PYmplY3QoYXJndW1lbnRzW2VdKTp7fSxvPU9iamVjdC5rZXlzKHIpOyJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzJiZvLnB1c2guYXBwbHkobyxPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHIpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iocix0KS5lbnVtZXJhYmxlfSkpKSxvLmZvckVhY2goKGZ1bmN0aW9uKGUpe19kZWZpbmVQcm9wZXJ0eSh0LGUscltlXSl9KSl9cmV0dXJuIHR9ZnVuY3Rpb24gX3JlZ2VuZXJhdG9yUnVudGltZSgpeyJ1c2Ugc3RyaWN0Ijt2YXIgdD1fcmVnZW5lcmF0b3IoKSxlPXQubShfcmVnZW5lcmF0b3JSdW50aW1lKSxyPShPYmplY3QuZ2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpOmUuX19wcm90b19fKS5jb25zdHJ1Y3RvcjtmdW5jdGlvbiBvKHQpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0LmNvbnN0cnVjdG9yO3JldHVybiEhZSYmKGU9PT1yfHwiR2VuZXJhdG9yRnVuY3Rpb24iPT09KGUuZGlzcGxheU5hbWV8fGUubmFtZSkpfXZhciBuPXt0aHJvdzoxLHJldHVybjoyLGJyZWFrOjMsY29udGludWU6M307ZnVuY3Rpb24gaSh0KXt2YXIgZSxyO3JldHVybiBmdW5jdGlvbihvKXtlfHwoZT17c3RvcDpmdW5jdGlvbigpe3JldHVybiByKG8uYSwyKX0sY2F0Y2g6ZnVuY3Rpb24oKXtyZXR1cm4gby52fSxhYnJ1cHQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcihvLmEsblt0XSxlKX0sZGVsZWdhdGVZaWVsZDpmdW5jdGlvbih0LG4saSl7cmV0dXJuIGUucmVzdWx0TmFtZT1uLHIoby5kLF9yZWdlbmVyYXRvclZhbHVlcyh0KSxpKX0sZmluaXNoOmZ1bmN0aW9uKHQpe3JldHVybiByKG8uZix0KX19LHI9ZnVuY3Rpb24odCxyLG4pe28ucD1lLnByZXYsby5uPWUubmV4dDt0cnl7cmV0dXJuIHQocixuKX1maW5hbGx5e2UubmV4dD1vLm59fSksZS5yZXN1bHROYW1lJiYoZVtlLnJlc3VsdE5hbWVdPW8udixlLnJlc3VsdE5hbWU9dm9pZCAwKSxlLnNlbnQ9by52LGUubmV4dD1vLm47dHJ5e3JldHVybiB0LmNhbGwodGhpcyxlKX1maW5hbGx5e28ucD1lLnByZXYsby5uPWUubmV4dH19fXJldHVybihfcmVnZW5lcmF0b3JSdW50aW1lPWZ1bmN0aW9uKCl7cmV0dXJue3dyYXA6ZnVuY3Rpb24oZSxyLG8sbil7cmV0dXJuIHQudyhpKGUpLHIsbyxuJiZuLnJldmVyc2UoKSl9LGlzR2VuZXJhdG9yRnVuY3Rpb246byxtYXJrOnQubSxhd3JhcDpmdW5jdGlvbih0LGUpe3JldHVybiBuZXcgX092ZXJsb2FkWWllbGQodCxlKX0sQXN5bmNJdGVyYXRvcjpfcmVnZW5lcmF0b3JBc3luY0l0ZXJhdG9yLGFzeW5jOmZ1bmN0aW9uKHQsZSxyLG4scyl7cmV0dXJuKG8oZSk/X3JlZ2VuZXJhdG9yQXN5bmNHZW46X3JlZ2VuZXJhdG9yQXN5bmMpKGkodCksZSxyLG4scyl9LGtleXM6X3JlZ2VuZXJhdG9yS2V5cyx2YWx1ZXM6X3JlZ2VuZXJhdG9yVmFsdWVzfX0pKCl9ZnVuY3Rpb24gX3VzaW5nKHQsZSxyKXtpZihudWxsPT1lKXJldHVybiBlO2lmKE9iamVjdChlKSE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigidXNpbmcgZGVjbGFyYXRpb25zIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBvYmplY3RzLCBmdW5jdGlvbnMsIG51bGwsIG9yIHVuZGVmaW5lZC4iKTtpZihyKXZhciBvPWVbU3ltYm9sLmFzeW5jRGlzcG9zZXx8U3ltYm9sLmZvcigiU3ltYm9sLmFzeW5jRGlzcG9zZSIpXTtpZihudWxsPT1vJiYobz1lW1N5bWJvbC5kaXNwb3NlfHxTeW1ib2wuZm9yKCJTeW1ib2wuZGlzcG9zZSIpXSksImZ1bmN0aW9uIiE9dHlwZW9mIG8pdGhyb3cgbmV3IFR5cGVFcnJvcigiUHJvcGVydHkgW1N5bWJvbC5kaXNwb3NlXSBpcyBub3QgYSBmdW5jdGlvbi4iKTtyZXR1cm4gdC5wdXNoKHt2OmUsZDpvLGE6cn0pLGV9QXN5bmNHZW5lcmF0b3IucHJvdG90eXBlWyJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5hc3luY0l0ZXJhdG9yfHwiQEBhc3luY0l0ZXJhdG9yIl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sQXN5bmNHZW5lcmF0b3IucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2ludm9rZSgibmV4dCIsdCl9LEFzeW5jR2VuZXJhdG9yLnByb3RvdHlwZS50aHJvdz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faW52b2tlKCJ0aHJvdyIsdCl9LEFzeW5jR2VuZXJhdG9yLnByb3RvdHlwZS5yZXR1cm49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2ludm9rZSgicmV0dXJuIix0KX07dmFyIHRfY2FydF9fdXNlUm9vdFpvbmU9ZnVuY3Rpb24oKXt2YXIgdDtmdW5jdGlvbiBlKCl7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxlO3JldHVybiBudWxsPT10P3ZvaWQgMDp0LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1yb290LXpvbmUiKX1mdW5jdGlvbiByKCl7cmV0dXJuIHR8fGUoKXx8ImNvbSJ9ZnVuY3Rpb24gbyhlKXt0PWV9cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJue2dldFJvb3Rab25lOnIsc2V0Um9vdFpvbmU6b319fSgpO3dpbmRvdy50U3RvcmVJc1NlYXJjaEJvdD0vQm90L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx3aW5kb3cudFN0b3JlSXNNb2JpbGU9L0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHdpbmRvdy50U3RvcmVCcm93c2VyTGFuZz0od2luZG93Lm5hdmlnYXRvci51c2VyTGFuZ3VhZ2V8fHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2UpLnRvVXBwZXJDYXNlKCkuc2xpY2UoMCwyKSx3aW5kb3cudF9zdG9yZV9lbmRwb2ludD0ic3RvcmUudGlsZGFhcGkuY29tIjt2YXIgdF9zdG9yZV9QT1BVUF9TSE9XRURfRVZFTlRfTkFNRT0iY2F0YWxvZzpwb3B1cFNob3dlZCIsdF9zdG9yZV9QT1BVUF9DTE9TRURfRVZFTlRfTkFNRT0iY2F0YWxvZzpwb3B1cENsb3NlZCI7ZnVuY3Rpb24gdF9zdG9yZV9maXhJbWdzKCl7dmFyIHQsZTsvVmVyc2lvblwvMTZcLjMvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJi9TYWZhcmkvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJlsiNzU0IiwiNzc2IiwiNzc4IiwiNzg2IiwiMTAyNSJdLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXJlY29yZC10eXBlPSInK3QrJyJdIC50LWltZywgW2RhdGEtcGFyZW50dHBsaWQ9IicrdCsnIl0gLnQtaW1nJyk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLChmdW5jdGlvbih0KXt0LnN0eWxlLm9iamVjdEZpdD0iY29udGFpbiJ9KSl9KSl9ZnVuY3Rpb24gdF9zdG9yZV9pbml0KHQsZSl7dF9vblJlYWR5KChmdW5jdGlvbigpe3ZhciByPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK3QpLG8sbjtyJiYod2luZG93LnRTdG9yZUluaXR8fCh3aW5kb3cudFN0b3JlSW5pdD17fSksd2luZG93LnRTdG9yZUluaXRbdF09ITAsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSYmdF9zdG9yZV9fc2V0dXBFbmRwb2ludCgpLCJJbnRlcnNlY3Rpb25PYnNlcnZlciJpbiB3aW5kb3cmJk9iamVjdC5rZXlzKHdpbmRvdy50U3RvcmVJbml0KS5sZW5ndGg+Nz8od2luZG93LnRTdG9yZUluaXRbdF09ImxhenkiLG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZnVuY3Rpb24ocixvKXtyLmZvckVhY2goKGZ1bmN0aW9uKHIpe2lmKHIuaXNJbnRlcnNlY3Rpbmcpe3ZhciBuPXIudGFyZ2V0O28udW5vYnNlcnZlKG4pLCJsYXp5Ij09PXdpbmRvdy50U3RvcmVJbml0W3RdJiYodF9zdG9yZV9sYXp5SW5pdCh0LGUpLHdpbmRvdy50U3RvcmVJbml0W3RdPSEwKX19KSl9KSx7cm9vdE1hcmdpbjoiMTUwcHggMHB4In0pLm9ic2VydmUocikpOnRfc3RvcmVfbGF6eUluaXQodCxlKSl9KSl9ZnVuY3Rpb24gdF9zdG9yZV9sYXp5SW5pdCh0LGUpe3ZhciByPWUsbz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIit0KSxuO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIikhPT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1zdG9yZV9fcHJvZHVjdC1zbmlwcGV0IikmJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIikuY29udGFpbnMoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX3Byb2R1Y3Qtc25pcHBldCIpKXx8dF9zdG9yZV9pbml0Um91dGluZygpLHdpbmRvdy50U3RvcmVEaWN0fHx0X3N0b3JlX2dldERpY3RPYmooKTt2YXIgaT1vLnF1ZXJ5U2VsZWN0b3IoIi5qcy1zdG9yZSIpLHM9dF9zdG9yZV9nZXRfcHJvZHVjdFBvcHVwX2h0bWwodCxyKTtpJiZpLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIixzKTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tb2RlIik7ci5pc1B1Ymxpc2hlZFBhZ2U9ImVkaXQiIT09YSYmInByZXZpZXciIT09YSxyLmlzUHVibGlzaGVkUGFnZSYmdF9zdG9yZV9jaGVja1VybChyLHQpO3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWNvcmQiK3QpLGw7aWYoYyYmIXIuaXNQdWJsaXNoZWRQYWdlJiYieSI9PWMuZ2V0QXR0cmlidXRlKCJvZmYiKSlyZXR1cm47dmFyIGQ9by5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtZ3JpZC1jb250LXByZWxvYWRlciIpO2lmKCIiIT09ci5zdG9yZXBhcnQpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZCYmZC5jbGFzc0xpc3QucmVtb3ZlKCJ0LXN0b3JlX19ncmlkLWNvbnQtcHJlbG9hZGVyX2hpZGRlbiIpfSksMWUzKTt2YXIgcD0xLHU9dF9zdG9yZV9wYXJhbXNUb09iaih0LHIpLF87aWYodVt0XSYmKF89dF9zdG9yZV91cGRhdGVPcHRpb25zQmFzZWRPblVybChyLHUsdCkpJiYocj1fKSxyLnNpZGViYXIpe3ZhciBmPW8ucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLXBhcnRzLXNlbGVjdC1jb250YWluZXIiKSx5O2lmKGYpZi5xdWVyeVNlbGVjdG9yKCIudDk1MV9fc2lkZWJhciIpfHxmLmluc2VydEFkamFjZW50SFRNTCgiYWZ0ZXJiZWdpbiIsJzxkaXYgY2xhc3M9InQ5NTFfX3NpZGViYXItd3JhcHBlciI+PC9kaXY+Jyl9dmFyIHY9ZnVuY3Rpb24gZSgpe3VbdF0mJnVbdF0ucGFnZSYmKHA9QXJyYXkuaXNBcnJheSh1W3RdLnBhZ2UpP3VbdF0ucGFnZS5qb2luKCIiKTp1W3RdLnBhZ2UpLHRfc3RvcmVfbG9hZFByb2R1Y3RzKCIiLHQscixwKSx0X3N0b3JlX21vYmlsZUhvcml6X2NoZWNrQnRuVmlzaWJpbGl0eSh0LHIpfSxnPWZ1bmN0aW9uIGUoKXt1W3RdJiZfJiZvLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRyb2xzRHJhd24iLChmdW5jdGlvbigpe3Rfc3RvcmVfZmlsdGVyc19yZW5kZXJfc2VsZWN0ZWQocix0KX0pKSxyLnNpZGViYXImJm8uYWRkRXZlbnRMaXN0ZW5lcigiY29udHJvbHNEcmF3biIsKGZ1bmN0aW9uKCl7dF9zdG9yZV9maWx0ZXJzX29wdHNfc29ydChyLHQpfSkpLHA9MSx2KCl9LG09ZnVuY3Rpb24gZShyKXtpZih3aW5kb3cudFN0b3JlRmlsdGVyc3x8KHdpbmRvdy50U3RvcmVGaWx0ZXJzPXt9KSxyJiYoci5maWx0ZXJzJiZyLmZpbHRlcnMubGVuZ3RoPjB8fHIuc2VhcmNofHxyLnNvcnQpKXt3aW5kb3cudFN0b3JlRmlsdGVyc1t0XT1yO3ZhciBvPXRfc3RvcmVfX2dldFJvb3Rab25lKCksbj0idGlsZGEtY2F0YWxvZy1maWx0ZXJzLTEuMCI7aWYoZG9jdW1lbnQuaGVhZC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbc3JjKj0iJytuKyciXScpKXRfc3RvcmVfb25GdW5jTG9hZCgidF9zdG9yZV9maWx0ZXJzX2luaXQiLChmdW5jdGlvbigpe2coKX0pKTtlbHNle3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2kudHlwZT0idGV4dC9qYXZhc2NyaXB0IixpLnNyYz0iaHR0cHM6Ly9zdGF0aWMudGlsZGFjZG4uIitvKyIvanMvIituKyIubWluLmpzIixpLm9ubG9hZD1nLGkub25lcnJvcj1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBsb2FkIHRpbGRhLWNhdGFsb2ctZmlsdGVyczogIix0aGlzLnNyYyksdigpfSxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGkpfWlmKCFkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbaHJlZio9IicrbisnIl0nKSl7dmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGluayIpO3MucmVsPSJzdHlsZXNoZWV0IixzLnR5cGU9InRleHQvY3NzIixzLmhyZWY9Imh0dHBzOi8vc3RhdGljLnRpbGRhY2RuLiIrbysiL2Nzcy8iK24rIi5taW4uY3NzIixzLm1lZGlhPSJhbGwiLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQocyl9dF9zdG9yZV9fbG9hZEpTRmlsZSgiaHR0cHM6Ly9zdGF0aWMudGlsZGFjZG4uIitvKyIvanMvdGlsZGEtdG9vbHRpcC0xLjAubWluLmpzIiksdF9zdG9yZV9fbG9hZENTU0ZpbGUoImh0dHBzOi8vc3RhdGljLnRpbGRhY2RuLiIrbysiL2Nzcy90b29sdGlwc3Rlci5taW4uY3NzIil9ZWxzZSB2KCl9LGgsYix3O2lmKHRfc3RvcmVfbG9hZEZpbHRlcnMocixtLChmdW5jdGlvbih0KXt0X3N0b3JlX2NoYW5nZUVuZHBvaW50KHQsKGZ1bmN0aW9uKCl7dF9zdG9yZV9sb2FkRmlsdGVycyhyLG0pfSkpfSkpLHIuaXNIb3Jpek9uTW9iKXt2YXIgUz10X3N0b3JlX2dldF9oYW5kSWNvbl9odG1sKHQsci5ob3Jpem9udGFsU2Nyb2xsSGludCk7ZCYmZC5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWJlZ2luIixTKX1yLnRhYnMmJihoPSJ0aWxkYS1jYXRhbG9nLXRhYnMtMS4wIixkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtzcmMqPSInK2grJyJdJyl8fCgoYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSkudHlwZT0idGV4dC9qYXZhc2NyaXB0IixiLnNyYz0iaHR0cHM6Ly9zdGF0aWMudGlsZGFjZG4uIit0X3N0b3JlX19nZXRSb290Wm9uZSgpKyIvanMvIitoKyIubWluLmpzIixiLm9uZXJyb3I9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gbG9hZCB0aWxkYS1jYXRhbG9nLXRhYnM6ICIsdGhpcy5zcmMpfSxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGIpKSxkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbaHJlZio9IicraCsnIl0nKXx8KCh3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKSkucmVsPSJzdHlsZXNoZWV0Iix3LnR5cGU9InRleHQvY3NzIix3LmhyZWY9Imh0dHBzOi8vc3RhdGljLnRpbGRhY2RuLiIrdF9zdG9yZV9fZ2V0Um9vdFpvbmUoKSsiL2Nzcy8iK2grIi5taW4uY3NzIix3Lm1lZGlhPSJhbGwiLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodykpKSxyLnNob3dQYWdpbmF0aW9uJiYib24iPT09ci5zaG93UGFnaW5hdGlvbiYmKGg9InRpbGRhLWNhdGFsb2ctcGFnaW5hdGlvbi0xLjAiLGRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3NyYyo9IicraCsnIl0nKXx8KChiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpKS50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiLGIuc3JjPSJodHRwczovL3N0YXRpYy50aWxkYWNkbi4iK3Rfc3RvcmVfX2dldFJvb3Rab25lKCkrIi9qcy8iK2grIi5taW4uanMiLGIub25lcnJvcj1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBsb2FkIHRpbGRhLWNhdGFsb2ctcGFnaW5hdGlvbjogIix0aGlzLnNyYyl9LGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYikpLGRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcignbGlua1tocmVmKj0iJytoKyciXScpfHwoKHc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGluayIpKS5yZWw9InN0eWxlc2hlZXQiLHcudHlwZT0idGV4dC9jc3MiLHcuaHJlZj0iaHR0cHM6Ly9zdGF0aWMudGlsZGFjZG4uIit0X3N0b3JlX19nZXRSb290Wm9uZSgpKyIvY3NzLyIraCsiLm1pbi5jc3MiLHcubWVkaWE9ImFsbCIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh3KSkpLHRfb25GdW5jTG9hZCgidF90aHJvdHRsZSIsKGZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXtvJiYoci5wcm9kQ2FyZCYmIjEwMjUiPT1yLnByb2RDYXJkLmJsb2NrSWQmJnRfc3RvcmVfdW5pZnlDYXJkc1dpZHRoKHQpLHRfc3RvcmVfbG9hZE1vcmVCdG5fZGlzcGxheSh0KSwoci5zaWRlYmFyfHxPYmplY3Qua2V5cyhyLmZpbHRlcnN8fHt9KS5sZW5ndGg+MSkmJnRfc3RvcmVfbW92ZVNlYXJoU29ydCh0LHIpLHIuc2hvd1BhZ2luYXRpb24mJiJvbiI9PT1yLnNob3dQYWdpbmF0aW9uJiZ0X3N0b3JlX29uRnVuY0xvYWQoInRfc3RvcmVfcGFnaW5hdGlvbl9kaXNwbGF5IiwoZnVuY3Rpb24oKXt0X3N0b3JlX3BhZ2luYXRpb25fZGlzcGxheSh0KX0pKSl9KSkpfSkpO3ZhciBFPW8ucXVlcnlTZWxlY3RvcigiLnQtc3RvcmUiKTtFJiZFLmFkZEV2ZW50TGlzdGVuZXIoImRpc3BsYXlDaGFuZ2VkIiwoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3Rfc3RvcmVfdW5pZnlDYXJkc1dpZHRoKHQpfSkpfSkpLHIucG9wdXBfb3B0cy5maXhlZEJ1dHRvbiYmdF9zdG9yZV9maXhlZFBvcHVwQnV0dG9uKHQscil9ZWxzZSBpZihkLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHIuc2lkZWJhcil7dmFyIFA9by5xdWVyeVNlbGVjdG9yKCIudDk1MV9fZ3JpZC1jb250Iik7UCYmUC5jbGFzc0xpc3QucmVtb3ZlKCJ0OTUxX19ncmlkLWNvbnRfaGlkZGVuIil9fWZ1bmN0aW9uIHRfc3RvcmVfaGlzdG9yeV9wdXNoU3RhdGUodCxlLHIpe3RyeXt2b2lkIDAhPT1oaXN0b3J5LnB1c2hTdGF0ZSYmd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKHQsZSxyKX1jYXRjaChvKXtjb25zb2xlLmVycm9yKG8pfX1mdW5jdGlvbiB0X3N0b3JlX3Byb2R1Y3RJbml0KHQsZSxyKXt0X29uUmVhZHkoKGZ1bmN0aW9uKCl7dmFyIG87ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSYmdF9zdG9yZV9fc2V0dXBFbmRwb2ludCgpLHRfc3RvcmVfc25pcHBldF9pbml0UHJvZHVjdCh0LGUscil9KSl9ZnVuY3Rpb24gdF9zdG9yZV9zbmlwcGV0X2luaXRQcm9kdWN0KHQsZSxyKXt2YXIgbz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjcmVjIit0KSxuPW8ucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX3Byb2R1Y3Qtc25pcHBldC5qcy1zdG9yZS1wcm9kdWN0Iik7bi5zZXRBdHRyaWJ1dGUoImRhdGEtY2FyZC1zaXplIiwibGFyZ2UiKTt2YXIgaT10X3N0b3JlX3NuaXBwZXRfZ2V0SnNvbkZyb21VcmwoKTtpZigiMTAwIj09PWUucG9wdXBfb3B0cy5wb3B1cENvbnRhaW5lcil7dmFyIHM9bi5xdWVyeVNlbGVjdG9yKCIudC1jb250YWluZXIiKTtzLmNsYXNzTGlzdC5hZGQoInQtY29udGFpbmVyX2ZsdWlkIikscy5zdHlsZS5tYXhXaWR0aD0iMTAwJSIscy5maXJzdEVsZW1lbnRDaGlsZCYmcy5maXJzdEVsZW1lbnRDaGlsZC5jbGFzc0xpc3QuYWRkKCJ0LWNvbnRhaW5lcl9mbHVpZCIpfXRfc3RvcmVfc25pcHBldF9jb3B5VHlwb2dyYXBoeVRvU25pcHBldCh0LGUpLHRfc3RvcmVfZHJhd1Byb2RQb3B1cF9kcmF3R2FsbGVyeSh0LG4scixlKTt2YXIgYT1mdW5jdGlvbiBvKCl7dF9zdG9yZV9hZGRQcm9kdWN0T3B0aW9ucyh0LHIsbixlLCJsYXJnZWNhcmQiKSx0X3N0b3JlX3NuaXBwZXRfY2hvb3NlRWRpdGlvbkZyb21VcmwodCxyLG4sZSksdF9zdG9yZV9vbkZ1bmNMb2FkKCJ0X3Byb2RfX2luaXQiLChmdW5jdGlvbigpe3RfcHJvZF9faW5pdCh0KX0pKX0sYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpO2lmKGMpe3ZhciBsPWMuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLXByb2plY3QtbGFuZyIpO2wmJih3aW5kb3cudFN0b3JlQnJvd3Nlckxhbmc9bCl9d2luZG93LnRTdG9yZURpY3R8fHRfc3RvcmVfZ2V0RGljdE9iaigpO3ZhciBkPW4ucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLXByb2Qtc2t1Iik7aWYoZCYmIm5vbmUiIT09ZC5zdHlsZS5kaXNwbGF5JiZkLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlYmVnaW4iLHdpbmRvdy50U3RvcmVEaWN0LnNrdSsiOiAiKSxuLnNldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LWdlbi11aWQiLHIudWlkKSxuLnNldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LXBhcnQtdWlkIixyLnBhcnR1aWRzP3IucGFydHVpZHMuam9pbigiLCIpOiIiKSxlLnRhYnMpe3ZhciBwPSJ0aWxkYS1jYXRhbG9nLXRhYnMtMS4wIjtpZihkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtzcmMqPSInK3ArJyJdJykpdF9vbkZ1bmNMb2FkKCJ0X3N0b3JlX3RhYnNfaW5pdFNuaXBwZXQiLChmdW5jdGlvbigpe3Rfc3RvcmVfdGFic19pbml0U25pcHBldCh0LGUsbixyKSxhKCl9KSk7ZWxzZXt2YXIgdT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTt1LnR5cGU9InRleHQvamF2YXNjcmlwdCIsdS5zcmM9Imh0dHBzOi8vc3RhdGljLnRpbGRhY2RuLiIrdF9zdG9yZV9fZ2V0Um9vdFpvbmUoKSsiL2pzLyIrcCsiLm1pbi5qcyIsdS5vbmxvYWQ9ZnVuY3Rpb24oKXt0X29uRnVuY0xvYWQoInRfc3RvcmVfdGFic19pbml0U25pcHBldCIsKGZ1bmN0aW9uKCl7dF9zdG9yZV90YWJzX2luaXRTbmlwcGV0KHQsZSxuLHIpLGEoKX0pKX0sdS5vbmVycm9yPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiRmFpbGVkIHRvIGxvYWQgdGlsZGEtY2F0YWxvZy10YWJzOiAiLHRoaXMuc3JjKX0sZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh1KX1pZighZG9jdW1lbnQuaGVhZC5xdWVyeVNlbGVjdG9yKCdsaW5rW2hyZWYqPSInK3ArJyJdJykpe3ZhciBfPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKTtfLnJlbD0ic3R5bGVzaGVldCIsXy50eXBlPSJ0ZXh0L2NzcyIsXy5ocmVmPSJodHRwczovL3N0YXRpYy50aWxkYWNkbi4iK3Rfc3RvcmVfX2dldFJvb3Rab25lKCkrIi9jc3MvIitwKyIubWluLmNzcyIsXy5tZWRpYT0iYWxsIixkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKF8pfX1lbHNlIHRfc3RvcmVfaW5pdFRleHRBbmRDaGFyYWN0ZXJpc3RpY3MobixyKSxhKCk7aWYodF9zdG9yZV90cmlnZ2VyRXZlbnQoZG9jdW1lbnQuYm9keSwidHdpc2hsaXN0X2FkZGJ0biIpLCFlLnJlbGV2YW50c19zbGlkZXIpe3ZhciBmPW8ucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX3JlbGV2YW50cy1ncmlkLWNvbnQudC1zdG9yZV9fZ3JpZC1jb250X21vYmlsZS1vbmUtcm93Iik7aWYoZil7dmFyIHk9dF9zdG9yZV9nZXRfaGFuZEljb25faHRtbCh0LGUuaG9yaXpvbnRhbFNjcm9sbEhpbnQpO2YuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmViZWdpbiIseSl9fWUucG9wdXBfb3B0cy5maXhlZEJ1dHRvbiYmdF9zdG9yZV9maXhlZFBvcHVwQnV0dG9uKHQsZSksdF9zdG9yZV9hcHBseUJ1dHRvblN0eWxlcyh0LGUpLHRfc3RvcmVfcmVuZGVyU25pcHBldEJ1dHRvbkljb24odCxlKSx0X3N0b3JlX2hvdmVyWm9vbV9pbml0KHQpLHRfc3RvcmVfZ2V0X3Byb2R1Y3RQb3B1cF9jbG9zZUljb25fY29sb3IodCxlKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpeyF3aW5kb3cudFN0b3JlSXNTZWFyY2hCb3QmJndpbmRvdy5UaWxkYSYmImZ1bmN0aW9uIj09dHlwZW9mIFRpbGRhLnNlbmRFY29tbWVyY2VFdmVudCYmKGkuZWRpdGlvbnVpZD9yLmVkaXRpb25zLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QudWlkPT09aS5lZGl0aW9udWlkJiZUaWxkYS5zZW5kRWNvbW1lcmNlRXZlbnQoImRldGFpbCIsW3tpZDoiIit0LnVpZCx1aWQ6IiIrdC51aWQscHJpY2U6IiIrdC5wcmljZSxza3U6dC5za3U/dC5za3U6IiIsbmFtZTpyLnRpdGxlfV0pfSkpOlRpbGRhLnNlbmRFY29tbWVyY2VFdmVudCgiZGV0YWlsIixbe2lkOiIiKyhyLmlkP3IuaWQ6ci51aWQpLHVpZDoiIityLnVpZCxwcmljZToiIisoci5wcmljZV9taW4/ci5wcmljZV9taW46ci5wcmljZSksc2t1OnIuc2t1P3Iuc2t1OiIiLG5hbWU6ci50aXRsZX1dKSl9KSwzZTMpfWZ1bmN0aW9uIHRfc3RvcmVfaW5pdFJvdXRpbmcoKXt3aW5kb3cub25wb3BzdGF0ZT1mdW5jdGlvbigpe2lmKHdpbmRvdy5oaXN0b3J5LnN0YXRlJiZ3aW5kb3cuaGlzdG9yeS5zdGF0ZS5wcm9kdWN0RGF0YSl7dmFyIHQ9d2luZG93Lmhpc3Rvcnkuc3RhdGUucHJvZHVjdERhdGEsZSxyLG8sbjt0X3N0b3JlX29wZW5Qcm9kdWN0UG9wdXAodC5yZWNpZCx0Lm9wdHMsdC5wcm9kdWN0T2JqLHQuaXNSZWxldmFudHNTaG93KX19fWZ1bmN0aW9uIHRfc3RvcmVfZ2V0U25pcHBldE1haW5CdXR0b24odCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrdCk7cmV0dXJuIGU/ZS5xdWVyeVNlbGVjdG9yKCIudC1zdG9yZV9fcHJvZC1wb3B1cF9fYnRuLXdyYXBwZXIgLnQtc3RvcmVfX3Byb2QtcG9wdXBfX2J0biIpOm51bGx9ZnVuY3Rpb24gdF9zdG9yZV9idWlsZEJhc2VCdXR0b25Dc3NSdWxlcyh0LGUpe3ZhciByPVtdO09iamVjdC5rZXlzKHQpLmZvckVhY2goKGZ1bmN0aW9uKG8pe3ZhciBuPXRbb10saT1lW29dO2kmJigiYmdjb2xvciI9PT1vP3Rfc3RvcmVfaXNHcmFkaWVudChpKT8odF9zdG9yZV9hZGRSdWxlKHIsImJhY2tncm91bmQtaW1hZ2UiLGkpLHRfc3RvcmVfYWRkUnVsZShyLCJiYWNrZ3JvdW5kLWNvbG9yIiwidHJhbnNwYXJlbnQiKSk6KHRfc3RvcmVfYWRkUnVsZShyLCJiYWNrZ3JvdW5kLWNvbG9yIixpKSx0X3N0b3JlX2FkZFJ1bGUociwiYmFja2dyb3VuZC1pbWFnZSIsIm5vbmUiKSk6dF9zdG9yZV9hZGRSdWxlKHIsbixpKSl9KSk7dmFyIG89ZS5ib3JkZXJzaXplfHwiMCIsbj1lLmJvcmRlcmNvbG9yfHwidHJhbnNwYXJlbnQiO3JldHVybihlLmJvcmRlcnNpemV8fGUuYm9yZGVyY29sb3IpJiYoL14wKCR8W14wLTldKS9pLnRlc3Qobyl8fCIwcHgiPT09bz90X3N0b3JlX2FkZFJ1bGUociwiYm9yZGVyIiwibm9uZSIpOnRfc3RvcmVfYWRkUnVsZShyLCJib3JkZXIiLG8rIiBzb2xpZCAiK24pKSx0X3N0b3JlX2FkZFJ1bGUociwidHJhbnNpdGlvbi1kdXJhdGlvbiIsZS5zcGVlZGhvdmVyfHwiMC4ycyIpLHRfc3RvcmVfYWRkUnVsZShyLCJ0cmFuc2l0aW9uLXByb3BlcnR5IiwiYmFja2dyb3VuZC1jb2xvciwgY29sb3IsIGJvcmRlci1jb2xvciwgYm94LXNoYWRvdywgb3BhY2l0eSwgdHJhbnNmb3JtIiksdF9zdG9yZV9hZGRSdWxlKHIsInRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uIiwiZWFzZS1pbi1vdXQiKSxlLmJnY29sb3Job3ZlciYmKHRfc3RvcmVfaXNHcmFkaWVudChlLmJnY29sb3Job3Zlcik/dF9zdG9yZV9hZGRSdWxlKHIsIi0tYnV0dG9uLWFmdGVyLWJhY2tncm91bmQtaW1hZ2UtaG92ZXIiLGUuYmdjb2xvcmhvdmVyKTp0X3N0b3JlX2FkZFJ1bGUociwiLS1idXR0b24tYWZ0ZXItYmFja2dyb3VuZC1jb2xvci1ob3ZlciIsZS5iZ2NvbG9yaG92ZXIpKSxyfWZ1bmN0aW9uIHRfc3RvcmVfYnVpbGRIb3ZlckNzc1J1bGVzKHQpe3ZhciBlPVtdO2lmKHQuc2hhZG93aG92ZXImJnRfc3RvcmVfYWRkUnVsZShlLCJib3gtc2hhZG93Iix0LnNoYWRvd2hvdmVyKSx0LmJvcmRlcnNpemV8fHQuYm9yZGVyY29sb3Job3Zlcil7dmFyIHI9dC5ib3JkZXJzaXplfHwiMCIsbz10LmJvcmRlcmNvbG9yaG92ZXJ8fHQuYm9yZGVyY29sb3J8fCJ0cmFuc3BhcmVudCI7L14wKCR8W14wLTldKS9pLnRlc3Qocil8fCIwcHgiPT09cj90X3N0b3JlX2FkZFJ1bGUoZSwiYm9yZGVyIiwibm9uZSIpOnRfc3RvcmVfYWRkUnVsZShlLCJib3JkZXIiLHIrIiBzb2xpZCAiK28pfXJldHVybiB0LmJnY29sb3Job3ZlciYmdF9zdG9yZV9hZGRSdWxlKGUsImJhY2tncm91bmQtY29sb3IiLHQuYmdjb2xvcmhvdmVyKSxlfWZ1bmN0aW9uIHRfc3RvcmVfYnVpbGRNb2JpbGVDc3NSdWxlcyh0LGUpe3ZhciByPSJfcmVzXzQ4MCIsbz1bXTtyZXR1cm4gT2JqZWN0LmtleXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24obil7aWYobi5pbmNsdWRlcyhyKSl7dmFyIGk9bi5yZXBsYWNlKHIsIiIpLHM9dFtpXTtzJiZ0X3N0b3JlX2FkZFJ1bGUobyxzLGVbbl0pfX0pKSxlLnBhZGRpbmdfcmVzXzQ4MCYmdF9zdG9yZV9hZGRSdWxlKG8sInBhZGRpbmciLGUucGFkZGluZ19yZXNfNDgwKSxvfWZ1bmN0aW9uIHRfc3RvcmVfY3JlYXRlQnV0dG9uVGV4dENzcyh0LGUscil7dmFyIG89W10sbj1bXSxpPVtdO3IuY29sb3ImJnRfc3RvcmVfYWRkVGV4dENvbG9yUnVsZShvLHIuY29sb3IpLHIuY29sb3Job3ZlciYmdF9zdG9yZV9hZGRUZXh0Q29sb3JSdWxlKG4sci5jb2xvcmhvdmVyKSxyLmNvbG9yX3Jlc180ODAmJnRfc3RvcmVfYWRkVGV4dENvbG9yUnVsZShpLHIuY29sb3JfcmVzXzQ4MCk7dmFyIHM9ZSsiIC50LWJ0bmZsZXhfX3RleHQsICIrZSsiIC50LXN0b3JlX19jYXJkX19idG4tdGV4dCIsYT1lKyI6aG92ZXIgLnQtYnRuZmxleF9fdGV4dCwgIitlKyI6aG92ZXIgLnQtc3RvcmVfX2NhcmRfX2J0bi10ZXh0IixjPSIiO3JldHVybiBudWxsIT1vJiZvLmxlbmd0aCYmKGMrPXMrInsiK28uam9pbigiIikrIn0iKSxudWxsIT1uJiZuLmxlbmd0aCYmKGMrPSJcbiIrYSsieyIrbi5qb2luKCIiKSsifSIpLG51bGwhPWkmJmkubGVuZ3RoJiYoYys9IlxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDo0ODBweCl7IitzKyJ7IitpLmpvaW4oIiIpKyJ9fSIpLGN9ZnVuY3Rpb24gdF9zdG9yZV9jcmVhdGVCdXR0b25BcHBlcmVhbmNlQ3NzKHQsZSxyLG8pe3ZhciBuPXtiZ2NvbG9yOiJiYWNrZ3JvdW5kLWNvbG9yIixyYWRpdXM6ImJvcmRlci1yYWRpdXMiLHdyYXA6IndoaXRlLXNwYWNlIixzaGFkb3c6ImJveC1zaGFkb3ciLGZvbnR3ZWlnaHQ6ImZvbnQtd2VpZ2h0Iix1cHBlcmNhc2U6InRleHQtdHJhbnNmb3JtIixmb250c2l6ZToiZm9udC1zaXplIixmb250ZmFtaWx5OiJmb250LWZhbWlseSIsbGluZWhlaWdodDoibGluZS1oZWlnaHQiLGxldHRlcnNwYWNpbmc6ImxldHRlci1zcGFjaW5nIixnYXA6ImdhcCIscGFkZGluZzoicGFkZGluZyIsaWNvbnBvc2l0aW9uOiJmbGV4LWRpcmVjdGlvbiJ9O2lmKEFycmF5LmlzQXJyYXkobykmJm8ubGVuZ3RoKXt2YXIgaT1uZXcgU2V0KG8pO2Zvcih2YXIgcyBpbiBuKWkuaGFzKHMpJiZkZWxldGUgbltzXX12YXIgYT10X3N0b3JlX2J1aWxkQmFzZUJ1dHRvbkNzc1J1bGVzKG4sciksYz10X3N0b3JlX2J1aWxkSG92ZXJDc3NSdWxlcyhyKSxsPXRfc3RvcmVfYnVpbGRNb2JpbGVDc3NSdWxlcyhuLHIpLGQ9IiNyZWMiK3QrIiAiK2UscD0iI3JlYyIrdCsiICIrZSsiOmhvdmVyIix1PSIiO3JldHVybiBudWxsIT1hJiZhLmxlbmd0aCYmKHUrPWQrInsiK2Euam9pbigiIikrIn0iKSxudWxsIT1jJiZjLmxlbmd0aCYmKHUrPSJcbiIrcCsieyIrYy5qb2luKCIiKSsifSIpLG51bGwhPWwmJmwubGVuZ3RoJiYodSs9IlxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDo0ODBweCl7IitkKyJ7IitsLmpvaW4oIiIpKyJ9fSIpLHV9ZnVuY3Rpb24gdF9zdG9yZV9jcmVhdGXQoXNzU3R5bGVUYWcodCxlKXt2YXIgcj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0KTtyfHwoKHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKSkuaWQ9dCwoZG9jdW1lbnQuaGVhZHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5hcHBlbmRDaGlsZChyKSksci5zdHlsZVNoZWV0P3Iuc3R5bGVTaGVldC5jc3NUZXh0PWU6ci50ZXh0Q29udGVudD1lfWZ1bmN0aW9uIHRfc3RvcmVfYXBwbHlCdXR0b25TdHlsZXModCxlKXt0cnl7aWYoIWV8fCFlLmJ1dHRvbl9zdHlsZXMpcmV0dXJuO3ZhciByPXRfc3RvcmVfZ2V0U25pcHBldE1haW5CdXR0b24odCk7aWYocil7dmFyIG89ci5jbGFzc0xpc3QuY29udGFpbnMoInRfY2F0YWxvZ19fcHJvZC1wb3B1cF9fYnRuLXJlcGxhY2VkIik7ci5yZW1vdmVBdHRyaWJ1dGUoInN0eWxlIiksbyYmKHIuc3R5bGUuZGlzcGxheT0ibm9uZSIpLHRfc3RvcmVfYXBwbHlCdXR0b25DbGFzc2VzKHIpfXZhciBuPXRfc3RvcmVfY3JlYXRlQnV0dG9uU3R5bGVDc3ModCwiLnQtc3RvcmVfX3Byb2QtcG9wdXBfX2J0bi13cmFwcGVyIC50LXN0b3JlX19wcm9kLXBvcHVwX19idG4iLGUuYnV0dG9uX3N0eWxlcyk7aWYoZS5zaG93UmVsZXZhbnRzJiYobis9dF9zdG9yZV9jcmVhdGVCdXR0b25TdHlsZUNzcyh0LCIudC1zdG9yZV9fcmVsZXZhbnRzX19jb250YWluZXIgLnQtc3RvcmVfX2NhcmRfX2J0bjpub3QoLnQtc3RvcmVfX2NhcmRfX2J0bl9zZWNvbmQpIixlLmJ1dHRvbl9zdHlsZXMsWyJwYWRkaW5nIl0pLGUuYnV0dG9uMl9zdHlsZXMmJihuKz10X3N0b3JlX2NyZWF0ZUJ1dHRvblN0eWxlQ3NzKHQsIi50LXN0b3JlX19yZWxldmFudHNfX2NvbnRhaW5lciAudC1zdG9yZV9fY2FyZF9fYnRuX3NlY29uZCIsZS5idXR0b24yX3N0eWxlcyxbInBhZGRpbmciXSkpKSx0X3N0b3JlX2NyZWF0ZdChc3NTdHlsZVRhZygianMtc3RvcmUtYnRuLXN0eWxlcy0iK3QsbiksbnVsbCE9ciYmci5wYXJlbnROb2RlKXJldHVybiB2b2lkKHIucGFyZW50Tm9kZS5zdHlsZS5vcGFjaXR5PTEpO3ZhciBpPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19wcm9kdWN0LXNuaXBwZXQgLnQtc3RvcmVfX3Byb2QtcG9wdXBfX2J0bi13cmFwcGVyIik7aWYoIWkpcmV0dXJuO2kuc3R5bGUuZGlzcGxheT0ibm9uZSJ9Y2F0Y2gocyl7Y29uc29sZS5lcnJvcigi0J7RiNC40LHQutCwINC/0YDQuCDQv9GA0LjQvNC10L3QtdC90LjQuNC4INGB0YLQuNC70LXQuSDQuiDQutC90L7Qv9C60LUgKHJlZmFjdG9yZWQpOiAiK3MpfX1mdW5jdGlvbiB0X3N0b3JlX2FwcGx5QnV0dG9uQ2xhc3Nlcyh0KXt2YXIgZTt0LmNsYXNzTGlzdC5hZGQoInQtYnRuZmxleCIpLHQuY2xhc3NMaXN0LmFkZCgidC1idG5mbGV4X3R5cGVfYnV0dG9uIiksdC5jbGFzc0xpc3QuY29udGFpbnMoInQtYnRuX3NtIikmJnQuY2xhc3NMaXN0LnJlcGxhY2UoInQtYnRuX3NtIiwidC1idG5mbGV4X3NtIiksdC5xdWVyeVNlbGVjdG9yKCJ0ZCIpLmNsYXNzTGlzdC5hZGQoInQtYnRuZmxleF9fdGV4dCIpfWZ1bmN0aW9uIHRfc3RvcmVfY3JlYXRlQnV0dG9uU3R5bGVDc3ModCxlLHIsbyl7dHJ5e3ZhciBuPUpTT04ucGFyc2UociksaT10X3N0b3JlX2NyZWF0ZUJ1dHRvbkFwcGVyZWFuY2VDc3ModCxlLG4sbyk7cmV0dXJuIGkrPXRfc3RvcmVfY3JlYXRlQnV0dG9uVGV4dENzcyh0LGUsbiksbi5iZ2NvbG9yJiZuLmJnY29sb3Job3ZlciYmKGk9dF9zdG9yZV9hcHBlbmRNYWluQnV0dG9uQmdIb3ZlclN0eWxlKGkpKSxuLmljb25zaXplJiYoaSs9IlxuXG5cdFx0XHRcdC50LWJ0bmZsZXgudC1idG5mbGV4X3R5cGVfYnV0dG9uIC50LWJ0bmZsZXhfX2ljb24ge1xuXHRcdFx0XHRcdHdpZHRoOiAiK24uaWNvbnNpemUrIjtcblx0XHRcdFx0XHRoZWlnaHQ6IituLmljb25zaXplKyI7XG5cdFx0XHRcdH0iKSxpfWNhdGNoKHMpe3JldHVybiBjb25zb2xlLmVycm9yKCLQntGI0LjQsdC60LAg0L/RgNC4INGB0L7Qt9C00LDQvdC40LggY3NzLdC/0YDQsNCy0LjQuyDQtNC70Y8g0LrQvdC+0L/QutC4ICIscyksIiJ9fWZ1bmN0aW9uIHRfc3RvcmVfcmVuZGVyU25pcHBldEJ1dHRvbkljb24odCxlKXt0cnl7dmFyIHI9ZS5idXR0b25pY29uLG89ZS5idXR0b25pY29uaG92ZXI7aWYoIXImJiFvKXJldHVybjt2YXIgbj10X3N0b3JlX2dldFNuaXBwZXRNYWluQnV0dG9uKHQpO2lmKCFuKXJldHVybjt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7aS5jbGFzc05hbWU9InQtYnRuZmxleF9faWNvbiI7dmFyIHM9IiI7ciYmKHMrPSctLWljb246dXJsKCInK3IucmVwbGFjZSgvIi9nLCImcXVvdDsiKSsnIik7XG4nLHIuaW5jbHVkZXMoIi9saWIvaWNvbnMvYnV0dG9uLyIpJiZpLmNsYXNzTGlzdC5hZGQoInQtYnRuZmxleF9faWNvbl9kZWZhdWx0X2dseXBoIikpLG8mJihpLmNsYXNzTGlzdC5hZGQoInQtYnRuZmxleF9faWNvbl9oYXNfaG92ZXIiKSxzKz0nLS1pY29uLWhvdmVyOnVybCgiJytvLnJlcGxhY2UoLyIvZywiJnF1b3Q7IikrJyIpO1xuJyxvLmluY2x1ZGVzKCIvbGliL2ljb25zL2J1dHRvbi8iKSYmaS5jbGFzc0xpc3QuYWRkKCJ0LWJ0bmZsZXhfX2ljb25faG92ZXJfZ2x5cGgiKSkscyYmaS5zZXRBdHRyaWJ1dGUoInN0eWxlIixzKSxuLmluc2VydEFkamFjZW50RWxlbWVudCgiYWZ0ZXJiZWdpbiIsaSl9Y2F0Y2goYSl7Y29uc29sZS5lcnJvcigi0J7RiNC40LHQutCwINC/0YDQuCDRgNC10L3QtNC10YDQtSDQuNC60L7QvdC60Lgg0LIg0LrQvdC+0L/QutC1OiAiK2EpfX1mdW5jdGlvbiB0X3N0b3JlX2NyZWF0ZUNzc1Byb3BlcnR5KHQsZSl7cmV0dXJuIHQrIjogIitlKyI7In1mdW5jdGlvbiB0X3N0b3JlX2FkZFJ1bGUodCxlLHIpe251bGwhPXImJiIiIT09ciYmdC5wdXNoKHRfc3RvcmVfY3JlYXRlQ3NzUHJvcGVydHkoZSxyKSl9ZnVuY3Rpb24gdF9zdG9yZV9hZGRUZXh0Q29sb3JSdWxlKHQsZSl7dF9zdG9yZV9pc0dyYWRpZW50KGUpPyh0X3N0b3JlX2FkZFJ1bGUodCwiYmFja2dyb3VuZC1pbWFnZSIsZSksdF9zdG9yZV9hZGRSdWxlKHQsImNvbG9yIiwidHJhbnNwYXJlbnQiKSx0X3N0b3JlX2FkZFJ1bGUodCwiLXdlYmtpdC1iYWNrZ3JvdW5kLWNsaXAiLCJ0ZXh0IiksdF9zdG9yZV9hZGRSdWxlKHQsImJhY2tncm91bmQtY2xpcCIsInRleHQiKSk6dF9zdG9yZV9hZGRSdWxlKHQsImNvbG9yIixlKX1mdW5jdGlvbiB0X3N0b3JlX2lzR3JhZGllbnQodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiYtMSE9PXQuaW5kZXhPZigiZ3JhZGllbnQiKX1mdW5jdGlvbiB0X3N0b3JlX2FwcGVuZE1haW5CdXR0b25CZ0hvdmVyU3R5bGUodCl7cmV0dXJuIHQrIlxuXHRcdFxuXG5cdFx0QG1lZGlhIChob3ZlcjogaG92ZXIpIHtcblx0XHRcdC50LXN0b3JlX19wcm9kLXNuaXBwZXRfX2NvbnRhaW5lciAudC1zdG9yZV9fcHJvZC1wb3B1cF9fYnRuOmhvdmVyIHtcblx0XHRcdFx0YW5pbWF0aW9uLW5hbWU6IHQtYnV0dG9uLWhvdmVyLWFuaW1hdGlvbjtcblx0XHRcdFx0YW5pbWF0aW9uLWR1cmF0aW9uOiAwcztcblx0XHRcdFx0YW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7XG5cdFx0XHRcdGFuaW1hdGlvbi1kZWxheTogMXM7XG5cdFx0XHRcdGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGxpbmVhcjtcblx0XHRcdH1cblx0XHR9XG5cdCJ9ZnVuY3Rpb24gdF9zdG9yZV9fY2hhbmdlU25pcHBldEJ1dHRvbkJsb2NrVmlzaWJpbGl0eSh0KXt2YXIgZTsobnVsbD09dHx8bnVsbD09KGU9dC5jaGlsZHJlbik/dm9pZCAwOmUubGVuZ3RoKT4wfHwodC5zdHlsZS5vcGFjaXR5PTEpfWZ1bmN0aW9uIHRfc3RvcmVfaG92ZXJab29tX2luaXQodCl7dmFyIGU9Imh0dHBzOi8vc3RhdGljLnRpbGRhY2RuLiIrdF9zdG9yZV9fZ2V0Um9vdFpvbmUoKSsiL2pzL3RpbGRhLWhvdmVyLXpvb20tMS4wLm1pbi5qcyIscjt3aW5kb3cudFN0b3JlSXNNb2JpbGV8fGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK3QpLnF1ZXJ5U2VsZWN0b3IoIltkYXRhLWhvdmVyLXpvb21dIikmJnRfc3RvcmVfX2xvYWRKU0ZpbGUoZSwoZnVuY3Rpb24oKXt0X2hvdmVyWm9vbV9pbml0KHQpfSkpfWZ1bmN0aW9uIHRfc3RvcmVfbG9hZFByb2R1Y3RzKHQsZSxyLG8sbil7d2luZG93LnRTdG9yZVByb2R1Y3RzUmVxdWVzdGVkPSEwO3ZhciBpPSJyZWxldmFudHMiPT09dCxzPURhdGUubm93KCksYT1yLnN0b3JlcGFydCxjPSFvfHwxPT09cGFyc2VJbnQobywxMCksbD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIitlKTtpZihsKXt2YXIgZD1pP2wucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLXJlbGV2YW50cy1ncmlkLWNvbnQiKTpsLnF1ZXJ5U2VsZWN0b3IoIi5qcy1zdG9yZS1ncmlkLWNvbnQiKSxwPSI5NzMiPT09bC5nZXRBdHRyaWJ1dGUoImRhdGEtcmVjb3JkLXR5cGUiKXx8Ijk3MyI9PT1sLmdldEF0dHJpYnV0ZSgiZGF0YS1wYXJlbnR0cGxpZCIpLHU7aT8odT17c3RvcmVwYXJ0dWlkOmEscHJvZHVjdHVpZDpuLmN1cnJlbnRQcm9kdWN0VWlkLHF1YW50aXR5Om4ucmVsZXZhbnRzUXVhbnRpdHksbWV0aG9kOm4ucmVsZXZhbnRzTWV0aG9kLHNvcnQ6bi5yZWxldmFudHNTb3J0fSwoZD1sLnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19yZWxldmFudHMtZ3JpZC1jb250IikpJiYoZC5zdHlsZS5vcGFjaXR5PTApKTp1PXtzdG9yZXBhcnR1aWQ6YSxyZWNpZDplLGM6c30sYyYmKHUuZ2V0cGFydHM9ITAsdS5nZXRvcHRpb25zPSEwKSxvJiYodS5zbGljZT1vKSxyLmZpbHRlcnMmJih1LmZpbHRlcnM9ci5maWx0ZXJzLHUuZ2V0cGFydHM9ITApLHIuc29ydCYmIWkmJih1LnNvcnQ9ci5zb3J0KSxyLnNpemUmJnIuc2l6ZT4wJiYodS5zaXplPXIuc2l6ZSksciYmci5kZWZhdWx0U29ydCYmci5kZWZhdWx0U29ydC5pbl9zdG9jayYmaSYmKHUuZmlsdGVyc3x8KHUuZmlsdGVycz17fSksdS5maWx0ZXJzLnF1YW50aXR5PSJ5IiksdS5mbGFnX3Jvb3Q9IndpdGhyb290Ijt2YXIgXz0iaHR0cHM6Ly8iK3dpbmRvdy50X3N0b3JlX2VuZHBvaW50KyIvYXBpIisoaT8iL2dldHJlbGV2YW50cHJvZHVjdHMvIjoiL2dldHByb2R1Y3RzbGlzdC8iKTtpZighci5pc1B1Ymxpc2hlZFBhZ2Upe3ZhciBmPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZS5zcGxpdCgiLiIpLHk9InRpbGRhLiIrZltmLmxlbmd0aC0xXTt1LnByb2plY3RpZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1wcm9qZWN0LWlkIiksXz0iaHR0cHM6Ly8iK3krIi9wcm9qZWN0cy9zdG9yZSIrKGk/Ii9nZXRyZWxldmFudHByb2R1Y3RzLyI6Ii9nZXRwcm9kdWN0c2xpc3QvIil9dmFyIHY9RGF0ZS5ub3coKTt3aW5kb3cudFN0b3JlWEhSfHwod2luZG93LnRTdG9yZVhIUj17fSksd2luZG93LnRTdG9yZVhIUltlXSYmKHdpbmRvdy50U3RvcmVYSFJbZV0uYWJvcnQoKSxkZWxldGUgd2luZG93LnRTdG9yZVhIUltlXSk7dmFyIGc9bmV3IFhNTEh0dHBSZXF1ZXN0O3dpbmRvdy50U3RvcmVYSFJbZV09ZyxnLm9ubG9hZD1mdW5jdGlvbigpe2lmKGcucmVhZHlTdGF0ZT09PWcuRE9ORSYmMjAwPT09Zy5zdGF0dXMpe3ZhciBzPWcucmVzcG9uc2VUZXh0O2lmKHRfc3RvcmVfX2hhbmRsZVJvb3R6b25lUmVkaXJlY3QoZy5yZXNwb25zZVRleHQsXykpcmV0dXJuIHZvaWQgdF9zdG9yZV9sb2FkUHJvZHVjdHModCxlLHIsbyxuKTtjbGVhclRpbWVvdXQobC5nZXRBdHRyaWJ1dGUoImRhdGEtcHJlbG9hZGVyLXRpbWVvdXQiKSk7dmFyIGE9bC5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtZ3JpZC1jb250LXByZWxvYWRlciIpO2lmKGEmJihhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxyLnNpZGViYXIpe3ZhciB1PWwucXVlcnlTZWxlY3RvcigiLnQ5NTFfX2dyaWQtY29udCIpO3UmJnUuY2xhc3NMaXN0LnJlbW92ZSgidDk1MV9fZ3JpZC1jb250X2hpZGRlbiIpfWlmKGMmJmQmJihkLmlubmVySFRNTD0iIiksInN0cmluZyI9PXR5cGVvZiBzJiYieyIhPT1zLnN1YnN0cmluZygwLDEpJiYoLTEhPT1zLmluZGV4T2YoIkVSUk9SOiIpfHwtMSE9PXMuaW5kZXhPZigiV3JvbmciKSkpe3ZhciBmPXRfc3RvcmVfZ2V0X2Vycm9yQm94KHIscyk7cmV0dXJuIGQuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLGYpLHZvaWQgdF9zdG9yZV9fZmFkZUluKGwucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLWVycm9yLW1zZyIpKX1pZigiIj09PXMpcmV0dXJuO3ZhciB5PXt9O3RyeXsoeT1KU09OLnBhcnNlKHMpKS5wYXJ0bGlua3MmJihyLmxpbmtzU2l6ZUNoYXJ0PXkucGFydGxpbmtzKX1jYXRjaChSKXtjb25zb2xlLmVycm9yKFIpfWlmKCJvYmplY3QiIT10eXBlb2YgeSlyZXR1cm47dmFyIHY9aT95LnJlbGV2YW50czp5LnByb2R1Y3RzO2lmKHkub3B0aW9ucyYmeS5vcHRpb25zLmxlbmd0aD49MSYmKHdpbmRvdy50U3RvcmVPcHRpb25zTGlzdD15Lm9wdGlvbnMpLHRfc3RvcmVfcHJvY2Vzcyh2LGUsciwhIW8saSx5KSx5LnBhcnRzJiZ5LnBhcnRzLmxlbmd0aD4xJiYhbC5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtcGFydHMtc3dpdGNoZXIiKSYmIXIuaGlkZVN0b3JlUGFydHMpe3ZhciBtPWZ1bmN0aW9uIHQoKXt0X3N0b3JlX29uRnVuY0xvYWQoInRfc3RvcmVfYWRkU3RvcmVQYXJ0cyIsKGZ1bmN0aW9uKCl7dF9zdG9yZV9hZGRTdG9yZVBhcnRzKGUscix5LnBhcnRzKSx0X3N0b3JlX3NldEFjdGl2ZVN0b3JlUGFydChlKX0pKX0saD0idGlsZGEtY2F0YWxvZy1maWx0ZXJzLTEuMCI7aWYoZG9jdW1lbnQuaGVhZC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbc3JjKj0iJytoKyciXScpKW0oKTtlbHNle3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2IudHlwZT0idGV4dC9qYXZhc2NyaXB0IixiLnNyYz0iaHR0cHM6Ly9zdGF0aWMudGlsZGFjZG4uIit0X3N0b3JlX19nZXRSb290Wm9uZSgpKyIvanMvIitoKyIubWluLmpzIixiLm9ubG9hZD1tLGIub25lcnJvcj1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBsb2FkIHRpbGRhLWNhdGFsb2ctZmlsdGVyczogIix0aGlzLnNyYyl9LGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYil9aWYoIWRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcignbGlua1tocmVmKj0iJytoKyciXScpKXt2YXIgdz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaW5rIik7dy5yZWw9InN0eWxlc2hlZXQiLHcudHlwZT0idGV4dC9jc3MiLHcuaHJlZj0iaHR0cHM6Ly9zdGF0aWMudGlsZGFjZG4uIit0X3N0b3JlX19nZXRSb290Wm9uZSgpKyIvY3NzLyIraCsiLm1pbi5jc3MiLHcubWVkaWE9ImFsbCIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh3KX19d2luZG93LnRTdG9yZUZpbHRlcnN8fCh3aW5kb3cudFN0b3JlRmlsdGVycz17fSk7dmFyIHM9d2luZG93LnRTdG9yZUZpbHRlcnNbZV07aWYoInkiPT09eS5maWx0ZXImJiFyLmhpZGVGaWx0ZXJzJiZzKXMmJihzLmZpbHRlcnMmJnMuZmlsdGVycy5sZW5ndGg+MHx8cy5zZWFyY2h8fHMuc29ydCkmJnRfc3RvcmVfb25GdW5jTG9hZCgidF9zdG9yZV9maWx0ZXJzX2luaXQiLChmdW5jdGlvbigpe3Rfc3RvcmVfZmlsdGVyc19pbml0KGUscixzKSxpfHx0X3N0b3JlX2ZpbHRlcnNfcHJvZHNOdW1iZXJfdXBkYXRlKGwscix5KX0pKTtlbHNlIGlmKHIuc2lkZWJhciYmIWkmJnkucGFydHMmJjA9PT15LnBhcnRzLmxlbmd0aCl7dmFyIFM9bC5xdWVyeVNlbGVjdG9yKCIudDk1MV9fc2lkZWJhciIpO2lmKFMpe1MuY2xhc3NMaXN0LmFkZCgidDk1MV9fc2lkZWJhcl9lbXB0eSIpO3ZhciBFPSJSVSI9PT13aW5kb3cudFN0b3JlQnJvd3Nlckxhbmc/J9Cf0L7QttCw0LvRg9C50YHRgtCwLCDQtNC+0LHQsNCy0YzRgtC1INGF0L7RgtGPINCx0Ysg0L7QtNC40L0g0YTQuNC70YzRgtGAINC60LDRgtCw0LvQvtCz0LAg0LTQu9GPINC+0YLQvtCx0YDQsNC20LXQvdC40Y8g0LHQvtC60L7QstC+0Lkg0L/QsNC90LXQu9C4INC80LDQs9Cw0LfQuNC90LAuIDxhIGhyZWY9Imh0dHBzOi8vaGVscC1ydS50aWxkYS5jYy9vbmxpbmUtc3RvcmUtcGF5bWVudHMvZmlsdGVycyIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9mb2xsb3cgbm9vcGVuZXIiPtCh0L/RgNCw0LLQutCwPC9hPic6J1BsZWFzZSA8YSBocmVmPSJodHRwczovL2hlbHAudGlsZGEuY2Mvb25saW5lLXN0b3JlLXBheW1lbnRzL2ZpbHRlcnMiIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vZm9sbG93IG5vb3BlbmVyIj5hZGQgYXQgbGVhc3Qgb25lIGNhdGFsb2cgZmlsdGVyPC9hPiB0byBkaXNwbGF5IHRoZSBzdG9yZSBzaWRlYmFyJztTLmlubmVySFRNTD0nPHNwYW4gY2xhc3M9InQtdGV4dCB0LXRleHRfeHhzIj4nK0UrIjwvc3Bhbj4ifX1pZih0X3N0b3JlX2lzUXVlcnlJbkFkZHJlc3NCYXIoInRzdG9yZSIpJiZ3aW5kb3cudF9zdG9yZV9fc2Nyb2xsVG9CbG9jayl7dmFyIFA9ZGVjb2RlVVJJKHdpbmRvdy5sb2NhdGlvbi5oYXNoKS5zcGxpdCgiLyIpLHg9UC5pbmRleE9mKCJyIikrMSxDO1BbeF09PT1lJiYoInNjcm9sbEJlaGF2aW9yImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZT93aW5kb3cuc2Nyb2xsVG8oe2xlZnQ6MCx0b3A6bC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0LTUwLGJlaGF2aW9yOiJzbW9vdGgifSk6d2luZG93LnNjcm9sbFRvKDAsbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0LTUwKSx3aW5kb3cudF9zdG9yZV9fc2Nyb2xsVG9CbG9jaz1udWxsKX12YXIgQT1sLnF1ZXJ5U2VsZWN0b3IoIi5qcy1zdG9yZS1sb2FkLW1vcmUtYnRuIiksajtBJiZBLmNsYXNzTGlzdC5yZW1vdmUoInQtYnRuX3NlbmRpbmciKSx0X29uRnVuY0xvYWQoInRfdGhyb3R0bGUiLChmdW5jdGlvbigpe2o9dF90aHJvdHRsZSgoZnVuY3Rpb24oKXtpZighd2luZG93LnRTdG9yZVByb2R1Y3RzUmVxdWVzdGVkJiZ3aW5kb3cuaW5uZXJXaWR0aDw5NjApe3ZhciB0PWQuc2Nyb2xsV2lkdGgsZT1kLnNjcm9sbExlZnQscjtkLm9mZnNldFdpZHRoK2UrMjA+dCYmIm5vbmUiIT09QS5zdHlsZS5kaXNwbGF5JiYoQS5jbGljaygpLGQucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixqKSl9fSkpfSkpO3ZhciBPPWQmJmQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXN0b3JlX19ncmlkLWNvbnRfbW9iaWxlLW9uZS1yb3ciKTtpZih5Lm5leHRzbGljZSl7aWYoIUEpe3ZhciBrO2lmKEE9dF9zdG9yZV9nZXRfbG9hZE1vcmVCdG5faHRtbChsLHIpLHIuc2lkZWJhcilsLnF1ZXJ5U2VsZWN0b3IoIi50OTUxX19jb250LXctZmlsdGVyIC50OTUxX19jb250LXdyYXBwZXIgKyAudC1zdG9yZV9fcGFnaW5hdGlvbiIpfHxsLnF1ZXJ5U2VsZWN0b3IoIi50OTUxX19jb250LXctZmlsdGVyIikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLEEpO2Vsc2UgaWYoIWkpe3ZhciBMPWwucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLWdyaWQtY29udCIpO0wmJkwuaW5zZXJ0QWRqYWNlbnRIVE1MKCJhZnRlcmVuZCIsQSl9QT1sLnF1ZXJ5U2VsZWN0b3IoIi5qcy1zdG9yZS1sb2FkLW1vcmUtYnRuIil9aWYoQSl7QS5zdHlsZS5kaXNwbGF5PSIiO3ZhciBUPWZ1bmN0aW9uIHQoKXt3aW5kb3cudFN0b3JlUHJvZHVjdHNSZXF1ZXN0ZWR8fChBLmNsYXNzTGlzdC5hZGQoInQtYnRuX3NlbmRpbmciKSx0X3N0b3JlX2xvYWRQcm9kdWN0cygiIixlLHIseS5uZXh0c2xpY2UpKX07QS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChBLmNsb25lTm9kZSghMCksQSksKEE9bC5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtbG9hZC1tb3JlLWJ0biIpKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsVCl9TyYmZC5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLGopfWVsc2UgaXx8KEEmJihBLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxkJiZkLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsaikpO2lmKHIuc2hvd1BhZ2luYXRpb24mJiJvbiI9PT1yLnNob3dQYWdpbmF0aW9uJiYhaSYmdF9zdG9yZV9vbkZ1bmNMb2FkKCJ0X3N0b3JlX3BhZ2luYXRpb25fZHJhdyIsKGZ1bmN0aW9uKCl7dF9zdG9yZV9wYWdpbmF0aW9uX2RyYXcoZSxyLG8seS50b3RhbCl9KSksTyl7dmFyIHE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpO2QmJiJlZGl0IiE9PXEmJiJwcmV2aWV3IiE9PXEmJigieSIhPT13aW5kb3cubGF6eSYmInllcyIhPT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1sYXp5Iil8fHRfc3RvcmVfb25GdW5jTG9hZCgidF9sYXp5bG9hZF91cGRhdGUiLChmdW5jdGlvbigpe3Rfb25GdW5jTG9hZCgidF90aHJvdHRsZSIsKGZ1bmN0aW9uKCl7ZC5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dF9sYXp5bG9hZF91cGRhdGUoKX0pKSl9KSl9KSkpfWlmKGkpe2wucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX3JlbGV2YW50cy1ncmlkLWNvbnQiKS5zdHlsZS5vcGFjaXR5PTE7dmFyIEk9NDtyLnJlbGV2YW50c19zbGlkZXImJih2Lmxlbmd0aD40fHx3aW5kb3cuaW5uZXJXaWR0aDw9OTYwKSYmdF9zdG9yZV9vbkZ1bmNMb2FkKCJ0X3NsZHNJbml0IiwoZnVuY3Rpb24oKXt0X3NsZHNJbml0KGUrIiAuanMtc3RvcmUtcmVsZXZhbnRzLWdyaWQtY29udCIpfSkpfXAmJiFpJiZ0X3N0b3JlX29uRnVuY0xvYWQoInRfc2xkc0luaXQiLChmdW5jdGlvbigpe3Rfc2xkc0luaXQoZSsiIC5qcy1zdG9yZS1ncmlkLWNvbnQiKX0pKSxyLml0ZW1zQW5pbSYmci5wcmV2aWV3bW9kZSYmdF9zdG9yZV9vbkZ1bmNMb2FkKCJ0X2FuaW1hdGVfX3N0YXJ0QW5pbWF0aW9uIiwoZnVuY3Rpb24oKXt0X2FuaW1hdGVfX3N0YXJ0QW5pbWF0aW9uKCl9KSksZC5zdHlsZS5oZWlnaHQ9IiIsdF9zdG9yZV90cmlnZ2VyRXZlbnQoZG9jdW1lbnQuYm9keSwidHdpc2hsaXN0X2FkZGJ0biIpLHRfc3RvcmVfdHJpZ2dlckV2ZW50KGQsInRTdG9yZVJlbmRlcmVkIiksd2luZG93LnRTdG9yZVByb2R1Y3RzUmVxdWVzdGVkPSExfX0sZy5vbnRpbWVvdXQ9bSxnLm9uZXJyb3I9bSxnLm9wZW4oIkdFVCIsXysiPyIrdF9zdG9yZV9fc2VyaWFsaXplRGF0YSh1KSksZy50aW1lb3V0PTJlNCxnLnNlbmQoKX1mdW5jdGlvbiBtKGkpe2lmKC0xIT09d2luZG93LnRfc3RvcmVfZW5kcG9pbnQuaW5kZXhPZigic3RvcmUudGlsZGEiKSl0X3N0b3JlX2NoYW5nZUVuZHBvaW50KGksKGZ1bmN0aW9uKCl7dF9zdG9yZV9sb2FkUHJvZHVjdHModCxlLHIsbyxuKX0pKTtlbHNle3ZhciBzPWwucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLWxvYWQtbW9yZS1idG4iKTtzJiZzLmNsYXNzTGlzdC5yZW1vdmUoInQtYnRuX3NlbmRpbmciKTt2YXIgYT1EYXRlLm5vdygpLXY7MD09PWcuc3RhdHVzJiZhPDEwMCYmY29uc29sZS5lcnJvcigiUmVxdWVzdCBlcnJvciAoZ2V0IHN0b3JlIHByb2R1Y3RzKS4gUGxlYXNlIGNoZWNrIGludGVybmV0IGNvbm5lY3Rpb24uLi4iKSx3aW5kb3cudFN0b3JlUHJvZHVjdHNSZXF1ZXN0ZWQ9ITE7dmFyIGM9bC5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtZ3JpZC1jb250LXByZWxvYWRlciIpO2MmJihjLnN0eWxlLmRpc3BsYXk9Im5vbmUiKTt2YXIgcD10X3N0b3JlX2dldF9lcnJvckJveChyLCdSZXF1ZXN0IHRpbWVvdXQgKDQwcykuIFBsZWFzZSBjaGVjayBpbnRlcm5ldCBjb25uZWN0aW9uIGFuZCA8YSBocmVmPSJqYXZhc2NyaXB0OndpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTsiIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lIj5yZWxvYWQgdGhlIHBhZ2U8L2E+LiBJZiB0aGUgc2l0dWF0aW9uIGhhcyBub3QgY2hhbmdlZCwgcGxlYXNlIGNvbnRhY3Qgc3VwcG9ydCA8YSBocmVmPSJtYWlsdG86dGVhbUB0aWxkYS5jYz9zdWJqZWN0PVVuYWJsZSB0byBnZXQgYSBjYXRhbG9nIiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSI+dGVhbUB0aWxkYS5jYzwvYT4uJyk7ZC5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWVuZCIscCksdF9zdG9yZV9fZmFkZUluKGwucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLWVycm9yLW1zZyIpKX19fWZ1bmN0aW9uIHRfc3RvcmVfbG9hZE9uZVByb2R1Y3QodCxlLHIsbyxuKXt2YXIgaT1EYXRlLm5vdygpLHMsYT17c3RvcmVwYXJ0dWlkOmUuc3RvcmVwYXJ0LHJlY2lkOnQscHJvZHVjdHVpZDpyLGM6aX0sYz0iaHR0cHM6Ly8iK3dpbmRvdy50X3N0b3JlX2VuZHBvaW50KyIvYXBpL2dldHByb2R1Y3QvPyIrdF9zdG9yZV9fc2VyaWFsaXplRGF0YShhKSxsPW5ldyBYTUxIdHRwUmVxdWVzdDtmdW5jdGlvbiBkKHQpe2NvbnNvbGUuZXJyb3IoIkNhbid0IGdldCBwcm9kdWN0IHdpdGggdWlkID0gIityKyIgaW4gc3RvcmVwYXJ0ID0gIitlLnN0b3JlcGFydCksImZ1bmN0aW9uIj09dHlwZW9mIG4mJm4odCl9bC5vbmxvYWQ9ZnVuY3Rpb24oKXtpZihsLnJlYWR5U3RhdGU9PT1sLkRPTkUmJjIwMD09PWwuc3RhdHVzKXtpZih0X3N0b3JlX19oYW5kbGVSb290em9uZVJlZGlyZWN0KGwucmVzcG9uc2VUZXh0LGMpKXJldHVybiB2b2lkIHRfc3RvcmVfbG9hZE9uZVByb2R1Y3QodCxlLHIsbyxuKTtvKCl9fSxsLm9udGltZW91dD1kLGwub25lcnJvcj1kLGwub3BlbigiR0VUIixjKSxsLnRpbWVvdXQ9MmU0LGwuc2VuZCgpfWZ1bmN0aW9uIHRfc3RvcmVfbG9hZFByb2R1Y3RzX2J5SWQodCxlLHIsbyl7dmFyIG49RGF0ZS5ub3coKSxpPXtwcm9kdWN0c3VpZDp0LGM6bn0scz0iaHR0cHM6Ly8iK3dpbmRvdy50X3N0b3JlX2VuZHBvaW50KyIvYXBpL2dldHByb2R1Y3RzYnl1aWQvIjtpZihlJiYhZS5pc1B1Ymxpc2hlZFBhZ2Upe2kucHJvamVjdGlkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIikuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLXByb2plY3QtaWQiKTt2YXIgYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUuc3BsaXQoIi4iKSxjPSJ0aWxkYS4iK2FbYS5sZW5ndGgtMV07cz0iaHR0cHM6Ly8iK2MrIi9wcm9qZWN0cy9zdG9yZS9nZXRwcm9kdWN0c2J5dWlkLyJ9aT1KU09OLnN0cmluZ2lmeShpKTt2YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7ZnVuY3Rpb24gZChlKXtjb25zb2xlLmVycm9yKCJDYW4ndCBnZXQgZ2V0cHJvZHVjdHNieXVpZC4gUmVxdWVzdGluZyBpZEFycjogIit0KSwiZnVuY3Rpb24iPT10eXBlb2YgbyYmbyhlKX1sLm9ubG9hZD1mdW5jdGlvbigpe2lmKGwucmVhZHlTdGF0ZT09PWwuRE9ORSYmMjAwPT09bC5zdGF0dXMpe2lmKCJzdHJpbmciPT10eXBlb2YgbC5yZXNwb25zZVRleHQmJiJ7Ij09PWwucmVzcG9uc2VUZXh0LnN1YnN0cmluZygwLDEpfHxjb25zb2xlLmVycm9yKCJDYW4ndCBnZXQgcHJvZHVjdHMgYXJyYXkgYnkgdWlkIGxpc3QiKSx0X3N0b3JlX19oYW5kbGVSb290em9uZVJlZGlyZWN0KGwucmVzcG9uc2VUZXh0LHMpKXJldHVybiB2b2lkIHRfc3RvcmVfbG9hZFByb2R1Y3RzX2J5SWQodCxlLHIsbyk7cihKU09OLnBhcnNlKGwucmVzcG9uc2VUZXh0KSl9fSxsLm9udGltZW91dD1kLGwub25lcnJvcj1kLGwub3BlbigiUE9TVCIscyksbC50aW1lb3V0PTJlNCxsLnNlbmQoaSl9ZnVuY3Rpb24gdF9zdG9yZV9sb2FkRmlsdGVycyh0LGUscil7dmFyIG89RGF0ZS5ub3coKSxuLGk9e3N0b3JlcGFydHVpZDp0LnN0b3JlcGFydCxjOm99LHM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKTt0JiZ0LmRlZmF1bHRTb3J0JiZ0LmRlZmF1bHRTb3J0LmluX3N0b2NrJiYoaS5maWx0ZXJzfHwoaS5maWx0ZXJzPXt9KSxpLmZpbHRlcnMucXVhbnRpdHk9InkiKTt2YXIgYT0iaHR0cHM6Ly8iK3dpbmRvdy50X3N0b3JlX2VuZHBvaW50KyIvYXBpL2dldGZpbHRlcnMvIjtpZighdC5pc1B1Ymxpc2hlZFBhZ2Upe3MmJihpLnByb2plY3RpZD1zLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1wcm9qZWN0LWlkIikpO3ZhciBjPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZS5zcGxpdCgiLiIpLGw9InRpbGRhLiIrY1tjLmxlbmd0aC0xXTthPSJodHRwczovLyIrbCsiL3Byb2plY3RzL3N0b3JlL2dldGZpbHRlcnMvIn12YXIgZD1uZXcgWE1MSHR0cFJlcXVlc3Q7ZnVuY3Rpb24gcChlKXtjb25zb2xlLmVycm9yKCJDYW4ndCBnZXQgZmlsdGVycyBpbiBzdG9yZXBhcnQgPSAiK3Quc3RvcmVwYXJ0KSwiZnVuY3Rpb24iPT10eXBlb2YgciYmcihlKX1kLm9ubG9hZD1mdW5jdGlvbigpe2lmKGQucmVhZHlTdGF0ZT09PWQuRE9ORSYmMjAwPT09ZC5zdGF0dXMpe2lmKHRfc3RvcmVfX2hhbmRsZVJvb3R6b25lUmVkaXJlY3QoZC5yZXNwb25zZVRleHQsYSkpcmV0dXJuIHZvaWQgdF9zdG9yZV9sb2FkRmlsdGVycyh0LGUscik7dHJ5e2UoSlNPTi5wYXJzZShkLnJlc3BvbnNlVGV4dCkpfWNhdGNoKG8pe2NvbnNvbGUuZXJyb3IobyksZSgpfX19LGQub250aW1lb3V0PXAsZC5vbmVycm9yPXAsZC5vcGVuKCJHRVQiLGErIj8iK3Rfc3RvcmVfX3NlcmlhbGl6ZURhdGEoaSkpLGQudGltZW91dD0yZTQsZC5zZW5kKCl9ZnVuY3Rpb24gdF9zdG9yZV9wcm9jZXNzKHQsZSxyLG8sbixpKXt2YXIgcz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIitlKTtpZihzKXt2YXIgYT1zLnF1ZXJ5U2VsZWN0b3IoIi5qcy1zdG9yZS1ncmlkLWNvbnQiKTtpZihhKXt2YXIgYz0iOTczIj09PXMuZ2V0QXR0cmlidXRlKCJkYXRhLXJlY29yZC10eXBlIil8fCI5NzMiPT09cy5nZXRBdHRyaWJ1dGUoImRhdGEtcGFyZW50dHBsaWQiKSxsPXIucHJvZENhcmQmJiIxMDI1Ij09PXIucHJvZENhcmQuYmxvY2tJZCxkPXIucHJvZENhcmQmJiEhci5wcm9kQ2FyZC5oYXNXcmFwLHA9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSE9PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19wcm9kdWN0LXNuaXBwZXQiKSYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKS5jb250YWlucyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1zdG9yZV9fcHJvZHVjdC1zbmlwcGV0IikpO24mJihhPXMucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLXJlbGV2YW50cy1ncmlkLWNvbnQiKSk7dmFyIHU9dF9zdG9yZV9nZXRfaG9yaXpTZXBhcmF0b3JfaHRtbChyKSxfPXt9LGY9YS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zdG9yZV9fY2FyZCIpLmxlbmd0aDtpZigwPT09dC5sZW5ndGgpe3ZhciB5PXRfc3RvcmVfZ2V0X2VtcHR5TXNnX2h0bWwocik7cmV0dXJuIGEuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLHkpLHZvaWQgdF9zdG9yZV9fZmFkZUluKHMucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLWVtcHR5LXBhcnQtbXNnIikpfWlmKG4mJnIucHJvZENhcmQpe3ZhciB2PXIucHJvZENhcmQuc2hhZG93U2l6ZSxnPXIucHJvZENhcmQuc2hhZG93LG09ci5wcm9kQ2FyZC5zaGFkb3dIb3ZlcixoPXIucHJvZENhcmQuc2hhZG93U2l6ZUhvdmVyLGI9ci5wcm9kQ2FyZC5zaGFkb3dPcGFjaXR5SG92ZXIsdz1yLnByb2RDYXJkLnNoYWRvd1NoaWZ0eUhvdmVyLFM9cGFyc2VJbnQodiwxMCl8fDA7Uz1NYXRoLm1pbihTLDEwKTt2YXIgRT1oP3BhcnNlSW50KGgsMTApOjIwO0U9TWF0aC5taW4oRSw0MCk7dmFyIFA9Yj9wYXJzZUludChiLDEwKS8xMDA6LjMseD1nfHxtPzIwOk1hdGgubWF4KEUsUyksQz0iIjtpZihtKUM9ImJveC1zaGFkb3c6ICIrbSsiICFpbXBvcnRhbnQ7IjtlbHNlIGlmKGh8fGIpe3ZhciBBLGo7Qz0iYm94LXNoYWRvdzogMHB4ICIrKHtzbToxMCxtZDoyMH1bd118fDApKyJweCAiK0UrInB4IHJnYmEoMCwwLDAsIitQKyIpICFpbXBvcnRhbnQ7In12YXIgTz0iIjtDJiZkJiYoTys9IiNyZWMiK2UrIiAudC1zdG9yZSAudC1zdG9yZV9fcmVsZXZhbnRzX19jb250YWluZXIgLnQtc3RvcmVfX3JlbGV2YW50cy1ncmlkLWNvbnQgLnQtc3RvcmVfX2NhcmRfX3dyYXBfYWxsOmhvdmVyIHsiLE8rPUMsTys9In1cbiIpLChTfHxofHxnfHxtKSYmKE8rPSJAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjk2MHB4KSB7XG4iLE8rPSIjcmVjIitlKyIgLnQtc3RvcmUgLnQtc3RvcmVfX3JlbGV2YW50c19fY29udGFpbmVyIC50LXN0b3JlX19yZWxldmFudHMtZ3JpZC1jb250IC50LXN0b3JlX19jYXJkX193cmFwX2FsbCB7XG4iLE8rPSJtYXJnaW46ICIreCsicHg7XG4iLE8rPSJ9XG4iLE8rPSJ9XG4iLE8rPSJAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOjk2MXB4KSB7XG4iLE8rPSIjcmVjIitlKyIgLnQtc3RvcmUgLnQtc3RvcmVfX3JlbGV2YW50c19fY29udGFpbmVyIC50LXN0b3JlX19yZWxldmFudHMtZ3JpZC1jb250IC50LXNsZHNfX2l0ZW1zLXdyYXBwZXIgLnQtc2xkc19faXRlbSB7XG4iLE8rPSJwYWRkaW5nLXRvcDogIit4KyJweDtcbiIsTys9InBhZGRpbmctYm90dG9tOiAiK3grInB4O1xuIixPKz0ifVxuIixPKz0iI3JlYyIrZSsiIC50LXN0b3JlIC50LXN0b3JlX19yZWxldmFudHNfX2NvbnRhaW5lciAudC1zdG9yZV9fcmVsZXZhbnRzX190aXRsZS13cmFwcGVyIC50LXN0b3JlX19yZWxldmFudHNfX3RpdGxlIHtcbiIsTys9Im1hcmdpbi1ib3R0b206ICIrKDQwLXgpKyJweDtcbiIsTys9In1cbiIsTys9In1cbiIpO3ZhciBrPXMucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX3Byb2R1Y3Qtc25pcHBldCArIC50LXN0b3JlX19yZWxldmFudHNfX2NvbnRhaW5lciIpLEw9cy5xdWVyeVNlbGVjdG9yKCIudC1wb3B1cCAudC1zdG9yZV9fcmVsZXZhbnRzX19jb250YWluZXIiKTtPJiYoTz0iPHN0eWxlPiIrTysiPC9zdHlsZT4iLEwmJkwuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmViZWdpbiIsTykscCYmayYmay5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWJlZ2luIixPKSkscCYmayYmci5pc0ZsZXhDb2xzP2suY2xhc3NMaXN0LmFkZCgidC1zdG9yZV9fZ3JpZC1jb250X2NvbC13aWR0aF9zdHJldGNoIik6TCYmci5pc0ZsZXhDb2xzJiZMLmNsYXNzTGlzdC5hZGQoInQtc3RvcmVfX2dyaWQtY29udF9jb2wtd2lkdGhfc3RyZXRjaCIpfXZhciBUPSIiLHE9NCxJPW4/NDpyLmJsb2Nrc0luUm93O2lmKG4mJnIucmVsZXZhbnRzX3NsaWRlciYmKHQubGVuZ3RoPjR8fHdpbmRvdy5pbm5lcldpZHRoPD05NjApfHwhbiYmYyl7dmFyIFI9IiIsRD0iMzAwIjsiZmFzdCI9PT1yLnNsaWRlcl9vcHRzLmFuaW1fc3BlZWQmJihSPSJ0LXNsZHNfYW5pbWF0ZWQtZmFzdCIpLCJzbG93Ij09PXIuc2xpZGVyX29wdHMuYW5pbV9zcGVlZCYmKFI9InQtc2xkc19hbmltYXRlZC1zbG93IixEPSI1MDAiKSxUKz0nPGRpdiBjbGFzcz0idC1zbGRzIiBzdHlsZT0idmlzaWJpbGl0eTogaGlkZGVuOyI+JyxUKz0nPGRpdiBjbGFzcz0idC1zbGRzX19tYWluIHQtY29udGFpbmVyIj4nLFQrPSc8ZGl2IGNsYXNzPSJ0LXNsZHNfX2NvbnRhaW5lciI+JyxUPShUKz0nPGRpdiBjbGFzcz0idC1zbGRzX19pdGVtcy13cmFwcGVyICcrUisnIiBkYXRhLXNsaWRlci1pdGVtcy1pbi1yb3c9IicrKCFuJiZjP0k6NCkrJyIgZGF0YS1zbGlkZXItdHJhbnNpdGlvbj0iJytEKyciIGRhdGEtc2xpZGVyLXdpdGgtY3ljbGU9InRydWUiIGRhdGEtc2xpZGVyLWN5Y2xlPSJ5ZXMiIGRhdGEtc2xpZGVyLWNvcnJlY3QtaGVpZ2h0PSInKyghbiYmYz8idHJ1ZSI6ImZhbHNlIikrJyIgZGF0YS1hdXRvLWNvcnJlY3QtbW9iaWxlLXdpZHRoPSJmYWxzZSI+JykucmVwbGFjZSgiW1tub0N5Y2xlQ2xhc3NdXSIsci5zbGlkZXJfb3B0cy5jeWNsZT8iIjoidC1zbGRzX19ub2N5Y2xlIikucmVwbGFjZSgiW1tpc0N5Y2xlZF1dIixyLnNsaWRlcl9vcHRzLmN5Y2xlPyJ0cnVlIjoiZmFsc2UiKX1BcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQsKGZ1bmN0aW9uKHQpe3ZhciBlPW51bGwscj1udWxsO3Rfc3RvcmVfb25GdW5jTG9hZCgidF9zdG9yZV9fY2xlYW5QcmljZSIsKGZ1bmN0aW9uKCl7dC5lZGl0aW9ucy5mb3JFYWNoKChmdW5jdGlvbih0KXtpZih0LnByaWNlJiYiIiE9PXQucHJpY2Upe3ZhciBvPXRfc3RvcmVfX2NsZWFuUHJpY2UodC5wcmljZSk7ZT1udWxsPT09ZT9vOk1hdGgubWluKGUsbykscj1udWxsPT09cj9vOk1hdGgubWF4KHIsbyl9fSkpfSkpLHQubWluUHJpY2U9ZSx0Lm1heFByaWNlPXJ9KSk7dmFyIHo9YS5xdWVyeVNlbGVjdG9yKCIudC1zdG9yZV9fY2FyZC1saXN0IiksQjtpZih6fHwoVCs9JzxkaXYgY2xhc3M9InQtc3RvcmVfX2NhcmQtbGlzdCAnKyhyLnZlcnRpY2FsQWxpZ25CdXR0b25zPyJ0LXN0b3JlX19jYXJkLWxpc3RfX3ZlcnRpY2FsLWFsaWduLWJ1dHRvbnMiOiIiKSsnIiAnKyhyLnZpbmRlbnQ/J3N0eWxlPSJyb3ctZ2FwOiAnK3IudmluZGVudCsnOyInOiIiKSsiPiIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodCwoZnVuY3Rpb24oZSxvKXsoIW4mJiFjJiYhbHx8biYmIXIucmVsZXZhbnRzX3NsaWRlcikmJmY+MCYmZiVJPT0wJiYhci52aW5kZW50JiYoVCs9dSksVCs9dF9zdG9yZV9nZXRfcHJvZHVjdENhcmRfaHRtbChzLGUscixuLG8sdCksX1tlLnVpZF09ZSxmKyt9KSksenx8KFQrPSI8L2Rpdj4iKSxuJiZyLnJlbGV2YW50c19zbGlkZXImJih0Lmxlbmd0aD40fHx3aW5kb3cuaW5uZXJXaWR0aDw9OTYwKXx8IW4mJmMpe3ZhciBNLEY9cy5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtdHBsLXNsaWRlci1hcnJvd3MiKS5pbm5lckhUTUw7aWYoVCs9IjwvZGl2PiIsVCs9IjwvZGl2PiIsRiYmIW4mJmMmJihUKz1GLGEuY2xhc3NMaXN0LnJlbW92ZSgidC1jb250YWluZXIiKSxhLmNsYXNzTGlzdC5yZW1vdmUoInQtc3RvcmVfX2dyaWQtY29udF9tb2JpbGUtZ3JpZCIpKSwhbiYmYyl7dmFyIE49JzxkaXYgY2xhc3M9InQtc2xkc19fYnVsbGV0X3dyYXBwZXIiPic7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0LGUpe3ZhciByPWUrMTtOKz0nPGRpdiBjbGFzcz0idC1zbGRzX19idWxsZXQnKygxPT09cj8iIHQtc2xkc19fYnVsbGV0X2FjdGl2ZSI6IiIpKyciIGRhdGEtc2xpZGUtYnVsbGV0LWZvcj0iJytyKyciPjxkaXYgY2xhc3M9InQtc2xkc19fYnVsbGV0X2JvZHkiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsiPjwvZGl2PjwvZGl2Pid9KSksVCs9Tis9IjwvZGl2PiJ9VCs9IjwvZGl2PiIsVCs9IjwvZGl2PiIsRiYmbiYmKFQrPUYpfWlmKHRfc3RvcmVfcHJvY2Vzc19hcHBlbmRBbmRTaG93UHJvZHVjdHMocyx6fHxhLFQpLC0xPT09VC5pbmRleE9mKCdkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbmxlZnQiJyl8fGEuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXN0b3JlX19ncmlkLWNvbnRfbW9iaWxlLW9uZS1yb3ciKXx8KGEuc3R5bGUub3ZlcmZsb3dYPSJoaWRkZW4iKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQsKGZ1bmN0aW9uKHQpe3ZhciBvPXQsaT1uP3MucXVlcnlTZWxlY3RvcignLnQtc3RvcmVfX3JlbGV2YW50c19fY29udGFpbmVyIC5qcy1wcm9kdWN0LnQtaXRlbVtkYXRhLXByb2R1Y3QtZ2VuLXVpZD0iJytvLnVpZCsnIl0nKTpzLnF1ZXJ5U2VsZWN0b3IoJy50LXN0b3JlX19ncmlkLWNvbnQgLmpzLXByb2R1Y3QudC1pdGVtW2RhdGEtcHJvZHVjdC1nZW4tdWlkPSInK28udWlkKyciXScpLGE7aS5zZXRBdHRyaWJ1dGUoImRhdGEtY2FyZC1zaXplIiwic21hbGwiKSxvPV9bby51aWRdLHBhcnNlSW50KG8ucXVhbnRpdHksMTApPD0wfHwiYm90aCIhPT1yLnNob3dTdG9yZUJ0blF1YW50aXR5JiYibGlzdCIhPT1yLnNob3dTdG9yZUJ0blF1YW50aXR5fHx0X3N0b3JlX2FkZFByb2R1Y3RRdWFudGl0eShpLG8sciksdF9zdG9yZV9hZGRQcm9kdWN0T3B0aW9ucyhlLG8saSxyKSx0X3N0b3JlX29wdGlvbl9oYW5kbGVPbkNoYW5nZShpKSx0X3N0b3JlX29wdGlvbl9oYW5kbGVPbkNoYW5nZV9jdXN0b20oZSxpLHIpLHRfc3RvcmVfb25GdW5jTG9hZCgidF9wcm9kX19pbml0UHJvZHVjdCIsKGZ1bmN0aW9uKCl7dF9wcm9kX19pbml0UHJvZHVjdChpLHIpfSkpfSkpLCFuJiZ3aW5kb3cudFN0b3JlRmlsdGVycyYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cudFN0b3JlRmlsdGVycyYmd2luZG93LnRTdG9yZUZpbHRlcnNbZV0mJiJvYmplY3QiPT10eXBlb2Ygd2luZG93LnRTdG9yZUZpbHRlcnNbZV0mJndpbmRvdy50U3RvcmVDdXN0b21VcmxQYXJhbXMmJiJvYmplY3QiPT10eXBlb2Ygd2luZG93LnRTdG9yZUN1c3RvbVVybFBhcmFtcyYmd2luZG93LnRTdG9yZUN1c3RvbVVybFBhcmFtc1tlXSYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cudFN0b3JlQ3VzdG9tVXJsUGFyYW1zW2VdJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQsKGZ1bmN0aW9uKHQpe3ZhciByPXMucXVlcnlTZWxlY3RvcignLnQtc3RvcmVfX2dyaWQtY29udCAuanMtcHJvZHVjdC50LWl0ZW1bZGF0YS1wcm9kdWN0LWdlbi11aWQ9IicrdC51aWQrJyJdJyk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChyLnF1ZXJ5U2VsZWN0b3JBbGwoIi5qcy1wcm9kdWN0LWVkaXRpb24tb3B0aW9uIiksKGZ1bmN0aW9uIHQocil7dmFyIG89ci5xdWVyeVNlbGVjdG9yKCJzZWxlY3QiKTtpZihvKXt2YXIgbj13aW5kb3cudFN0b3JlQ3VzdG9tVXJsUGFyYW1zW2VdO2lmKG4pZm9yKHZhciBpPTAscz1PYmplY3Qua2V5cyhuKTtpPHMubGVuZ3RoO2krKyl7dmFyIGE9c1tpXSxjPXdpbmRvdy50U3RvcmVGaWx0ZXJzW2VdLmZpbHRlcnM7aWYoIWMpcmV0dXJuO2Zvcih2YXIgbD0wLGQ9W10uY29uY2F0KGMpO2w8ZC5sZW5ndGg7bCsrKXt2YXIgcD1kW2xdO2lmKHAubmFtZT09PWEmJnAubmFtZS5pbmRleE9mKCJjaGFyYWN0Iik8MCl7dmFyIHU9d2luZG93LnRTdG9yZUN1c3RvbVVybFBhcmFtc1tlXVthXTtpZigib2JqZWN0Ij09dHlwZW9mIHUpZm9yKHZhciBfPV9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyTG9vc2UoW10uY29uY2F0KHUpLnJldmVyc2UoKSksZjshKGY9XygpKS5kb25lOyl7dmFyIHk9Zi52YWx1ZTtpZih5PT09by52YWx1ZSlyZXR1cm4gdm9pZCB0X3N0b3JlX3RyaWdnZXJFdmVudChvLCJjaGFuZ2UiKTt2YXIgdj1vLnF1ZXJ5U2VsZWN0b3IoJ1t2YWx1ZT0iJyt0X3N0b3JlX2VzY2FwZVF1b3RlKHkpKyciXScpO2lmKHYmJiF2LmRpc2FibGVkKXJldHVybiBvLnZhbHVlPXksdm9pZCB0X3N0b3JlX3RyaWdnZXJFdmVudChvLCJjaGFuZ2UiKX19fX19fSkpfSkpLCFvJiZyLmlzRmxleENvbHMmJnIuaXNIb3Jpek9uTW9iKXRfc3RvcmVfX3JlbW92ZUVsZW1lbnQoYS5xdWVyeVNlbGVjdG9yKCIudC1zdG9yZV9fdGFpbC1nYXAiKSksYS5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWVuZCIsJzxkaXYgY2xhc3M9InQtc3RvcmVfX3RhaWwtZ2FwIj48L2Rpdj4nKTtpZigieSIhPT13aW5kb3cubGF6eSYmInllcyIhPT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1sYXp5Iil8fChyLnJlbGV2YW50c19zbGlkZXI/c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0X3N0b3JlX29uRnVuY0xvYWQoInRfbGF6eWxvYWRfdXBkYXRlIiwoZnVuY3Rpb24oKXt0X2xhenlsb2FkX3VwZGF0ZSgpfSkpfSksMTAwKTp0X3N0b3JlX29uRnVuY0xvYWQoInRfbGF6eWxvYWRfdXBkYXRlIiwoZnVuY3Rpb24oKXt0X2xhenlsb2FkX3VwZGF0ZSgpfSkpKSxkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudDcwNl9fY2FydHdpbiIpfHxkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudDcwNl9fc2lkZWJhciIpPyJmdW5jdGlvbiI9PXR5cGVvZiB0Y2FydF9fYWRkRXZlbnRfX2xpbmtzJiZ0Y2FydF9fYWRkRXZlbnRfX2xpbmtzKGUpOmNvbnNvbGUud2FybigiV2FybmluZzogY2FydCBibG9jayBpcyBub3QgYWRkZWQgdG8gdGhpcyBwYWdlIiksdF9zdG9yZV9pbml0UG9wdXAoZSxfLHIsbixpKSwiMTAyNSI9PXIucHJvZENhcmQuYmxvY2tJZCYmc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0X3N0b3JlX3VuaWZ5Q2FyZHNXaWR0aChlKX0pLDFlMyksIXIucHJldmlld21vZGUpdHJ5e3dpbmRvdy50cF9fcmVjb3JkX19hZGRFZGl0RmllbGRFdmVudHMoZSl9Y2F0Y2goVSl7Y29uc29sZS5lcnJvcihVLm1lc3NhZ2UpfX19fWZ1bmN0aW9uIHRfc3RvcmVfcHJvY2Vzc19hcHBlbmRBbmRTaG93UHJvZHVjdHModCxlLHIpe2UuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLHIpLCEwPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtYWxyZWFkeS1sb2FkZWQtZmlyc3QtcHJvZHVjdHMiKT9zZXRUaW1lb3V0KChmdW5jdGlvbigpe0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zdG9yZV9fY2FyZCIpLChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5yZW1vdmUoInQtc3RvcmVfX2NhcmRfaGlkZGVuIil9KSl9KSwxMCk6KEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zdG9yZV9fY2FyZCIpLChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5yZW1vdmUoInQtc3RvcmVfX2NhcmRfaGlkZGVuIil9KSksdC5zZXRBdHRyaWJ1dGUoImRhdGEtYWxyZWFkeS1sb2FkZWQtZmlyc3QtcHJvZHVjdHMiLCEwKSl9ZnVuY3Rpb24gdF9zdG9yZV9tb2JpbGVIb3Jpel9jaGVja0J0blZpc2liaWxpdHkodCxlKXt2YXIgcj1mdW5jdGlvbiB0KGUscil7dmFyIG89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrZSksbjt3aW5kb3cuaW5uZXJXaWR0aDw5NjAmJnIuaGFzTW9iaWxlSG9yaXpTY3JvbGwmJnRfc3RvcmVfX3JlbW92ZUVsZW1lbnQoby5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtbG9hZC1tb3JlLWJ0biIpKX07cih0LGUpLHRfb25GdW5jTG9hZCgidF90aHJvdHRsZSIsKGZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXtyKHQsZSl9KSw1MDApKX0pKX1mdW5jdGlvbiB0X3N0b3JlX2dldF9wcm9kdWN0UG9wdXBfaHRtbCh0LGUpe3ZhciByPSIiLG89ZS5wb3B1cF9vcHRzLnBvcHVwU3RhdD8nZGF0YS10cmFjay1wb3B1cD0iJytlLnBvcHVwX29wdHMucG9wdXBTdGF0KyciJzoiIixuPWUucG9wdXBfb3B0cy5vdmVybGF5QmdDb2xvclJnYmE/J3N0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOicrZS5wb3B1cF9vcHRzLm92ZXJsYXlCZ0NvbG9yUmdiYSsnIic6IiIsaT0idC1wb3B1cF9fY29udGFpbmVyIHQtcG9wdXBfX2NvbnRhaW5lci1zdGF0aWMgIixzPWUudmVydGljYWxBbGlnbkJ1dHRvbnM/InQtc3RvcmVfX3ZhbGlnbi1idXR0b25zIjoiIixhPWUuc2hvd1JlbGV2YW50cyxjPWUudGl0bGVSZWxldmFudHM/ZS50aXRsZVJlbGV2YW50czp3aW5kb3cudFN0b3JlRGljdC5zZWVBbHNvLGw9ZS5yZWxldmFudHNfc2xpZGVyPyIiOiJ0LXN0b3JlX19ncmlkLWNvbnRfbW9iaWxlLW9uZS1yb3ciO2UucG9wdXBfb3B0cy5pc1ZlcnRpY2FsJiYoaSs9InQtc3RvcmVfX3BvcHVwLWNvbnRhaW5lcl84LWNvbHMgIik7dmFyIGQ9IiIscD1lLnBvcHVwX29wdHMuaXNWZXJ0aWNhbD8iIjoidC1zdG9yZV9fcHJvZC1wb3B1cF9fY29sLWxlZnQgdC1jb2wgdC1jb2xfIitlLnBvcHVwX29wdHMuY29sdW1ucyx1LF89InQtYWxpZ25fIisoImNlbnRlciI9PT1lLnBvcHVwX29wdHMuYWxpZ24/ImNlbnRlciI6ImxlZnQiKSsiICIrKGUucG9wdXBfb3B0cy5pc1ZlcnRpY2FsPyIiOiJ0LXN0b3JlX19wcm9kLXBvcHVwX19jb2wtcmlnaHQgdC1jb2wgdC1jb2xfIitlLnBvcHVwX29wdHMuY29sdW1uczIpLGY9ImpzLXN0b3JlLXByb2R1Y3QganMtcHJvZHVjdCB0LXN0b3JlX19wcm9kdWN0LXBvcHVwICI7ZS5wb3B1cF9vcHRzLmNvbnRhaW5lckJnQ29sb3ImJihkKz0iYmFja2dyb3VuZC1jb2xvcjoiK2UucG9wdXBfb3B0cy5jb250YWluZXJCZ0NvbG9yKyI7IiksIjEwMCI9PT1lLnBvcHVwX29wdHMucG9wdXBDb250YWluZXImJihkKz0ibWF4LXdpZHRoOjEwMCU7IixmKz0idC1jb250YWluZXJfZmx1aWQgIikscis9JzxkaXYgY2xhc3M9InQtcG9wdXAiICcrbysiICIrbisiPiIscis9dF9zdG9yZV9nZXRfcHJvZHVjdFBvcHVwX2Nsb3NlSWNvbl9odG1sKGUpLHIrPXRfc3RvcmVfZ2V0X3Byb2R1Y3RQb3B1cF9jbG9zZVRleHRfaHRtbChlKSxyKz0nPGRpdiBjbGFzcz0iJytpKyciIHN0eWxlPSInK2QrJyIgPicscis9IjxkaXY+IixyKz0nPGRpdiBjbGFzcz0idC1zdG9yZV9fcHJvZC1wb3B1cF9fY29udGFpbmVyIj4nLHIrPSc8ZGl2IGNsYXNzPSInK2YrJyI+Jzt2YXIgeT1bXTtyZXR1cm4iMTAwIj09PWUucG9wdXBfb3B0cy5wb3B1cENvbnRhaW5lciYmeS5wdXNoKCJ0LWNvbnRhaW5lcl9mbHVpZCIpLHIrPXkubGVuZ3RoPyc8ZGl2IGNsYXNzPSInK3kuam9pbigiICIpKyciPic6IjxkaXY+IixyKz0nPGRpdiBjbGFzcz0idC1zdG9yZV9fcHJvZC1wb3B1cF9fc2xpZGVyIGpzLXN0b3JlLXByb2Qtc2xpZGVyICcrcCsnIj48L2Rpdj4nLHIrPSc8ZGl2IGNsYXNzPSJ0LXN0b3JlX19wcm9kLXBvcHVwX19pbmZvICcrXysnIj4nLHIrPXRfc3RvcmVfZ2V0X3Byb2R1Y3RQb3B1cF90aXRsZVRleHRfaHRtbCgpLHIrPSc8ZGl2IGNsYXNzPSJqcy1zdG9yZS1wcmljZS13cmFwcGVyIHQtc3RvcmVfX3Byb2QtcG9wdXBfX3ByaWNlLXdyYXBwZXIiPicscis9dF9zdG9yZV9nZXRfcHJvZHVjdFBvcHVwX29uZVByaWNlX2h0bWwoZSwiY3VycmVudCIpLHIrPXRfc3RvcmVfZ2V0X3Byb2R1Y3RQb3B1cF9vbmVQcmljZV9odG1sKGUsIm9sZCIpLHIrPSI8L2Rpdj4iLHIrPSc8ZGl2IGNsYXNzPSJqcy1wcm9kdWN0LWNvbnRyb2xzLXdyYXBwZXIiPjwvZGl2Picscis9dF9zdG9yZV9nZXRfcHJvZHVjdFBvcHVwX2xpbmtzU2l6ZUNoYXJ0X2h0bWwoKSxyKz10X3N0b3JlX2dldF9wcm9kdWN0UG9wdXBfYnV5QnRuX2h0bWwoZSkscis9dF9zdG9yZV9nZXRfcHJvZHVjdFBvcHVwX3RleHRfaHRtbCgpLHIrPSI8L2Rpdj4iLHIrPSI8L2Rpdj4iLHIrPSI8L2Rpdj4iLGEmJihyKz0nICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InQtc3RvcmVfX3JlbGV2YW50c19fY29udGFpbmVyIj4nLHIrPScgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InQtc3RvcmVfX3JlbGV2YW50c19fdGl0bGUtd3JhcHBlciI+JyxyKz0nICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idC1zdG9yZV9fcmVsZXZhbnRzX190aXRsZSB0LXVwdGl0bGUgdC11cHRpdGxlX3h4bCInKyhPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZS50eXBvLCJ0aXRsZSIpPydzdHlsZSA9ICInK2UudHlwby50aXRsZSsnIic6IiIpKyI+IitjKyI8L2Rpdj4iLHIrPSIgICAgICAgICAgICAgICAgICAgIDwvZGl2PiIsZS5yZWxldmFudHNfc2xpZGVyfHwocis9dF9zdG9yZV9nZXRfaGFuZEljb25faHRtbCh0LGUuaG9yaXpvbnRhbFNjcm9sbEhpbnQpKSxyKz0nICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0LXN0b3JlX19yZWxldmFudHMtZ3JpZC1jb250IGpzLXN0b3JlLXJlbGV2YW50cy1ncmlkLWNvbnQgJytzKyIgIitsKyciPjwvZGl2Picscis9IiAgICAgICAgICAgICAgICA8L2Rpdj4iKSxyKz0iICAgICAgICAgICAgPC9kaXY+IixyKz0iICAgICAgICA8L2Rpdj4iLHIrPSIgICAgPC9kaXY+IixyKz0iPC9kaXY+In1mdW5jdGlvbiB0X3N0b3JlX2dldF9wcm9kdWN0UG9wdXBfdGV4dF9odG1sKCl7dmFyIHQ9IiI7cmV0dXJuIHQrPSc8ZGl2IGNsYXNzPSJqcy1zdG9yZS1wcm9kLXRleHQgdC1zdG9yZV9fcHJvZC1wb3B1cF9fdGV4dCB0LXR5cG9ncmFwaHlfX2Rlc2NyIHQtZGVzY3IgdC1kZXNjcl94eHMiPjwvZGl2Pid9ZnVuY3Rpb24gdF9zdG9yZV9nZXRfcHJvZHVjdFBvcHVwX2xpbmtzU2l6ZUNoYXJ0X2h0bWwoKXt2YXIgdD0iIjtyZXR1cm4gdCs9JzxkaXYgY2xhc3M9InQtc3RvcmVfX3Byb2QtcG9wdXBfX2xpbmtzLXdyYXBwZXIiPjwvZGl2Pid9ZnVuY3Rpb24gdF9zdG9yZV9nZXRfcHJvZHVjdFBvcHVwX2J1eUJ0bl9odG1sKHQpe3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidXR0b25fYnV5XyIrdC5yZWNpZCkscjtyZXR1cm4gZSYmZS5jb250ZW50Pydcblx0XHQ8ZGl2IGNsYXNzPSJ0LXN0b3JlX19wcm9kLXBvcHVwX19idG4td3JhcHBlciBqcy1zdG9yZS1idXR0b25zLXdyYXBwZXIiPlxuXHRcdFx0JytlLmNvbnRlbnQuY2xvbmVOb2RlKCEwKS5maXJzdEVsZW1lbnRDaGlsZC5vdXRlckhUTUwrIlxuXHRcdDwvZGl2PlxuXHQiOnRfc3RvcmVfZ2V0X3Byb2R1Y3RQb3B1cF9idXlCdG5faHRtbF9sZWdhY3kodCl9ZnVuY3Rpb24gdF9zdG9yZV9nZXRfcHJvZHVjdFBvcHVwX2J1eUJ0bl9odG1sX2xlZ2FjeSh0KXt2YXIgZT0iIixyPXQuYnRuMV9zdHlsZSxvPXQucG9wdXBfb3B0cy5idG5UaXRsZTtyZXR1cm4iIiE9PW8mJihlKz0nPGRpdiBjbGFzcz0idC1zdG9yZV9fcHJvZC1wb3B1cF9fYnRuLXdyYXBwZXIganMtc3RvcmUtYnV0dG9ucy13cmFwcGVyIj4nLGUrPSc8YSBocmVmPSIjb3JkZXIiIGNsYXNzPSJ0LXN0b3JlX19wcm9kLXBvcHVwX19idG4gdC1idG4gdC1idG5fc20iIHN0eWxlPSInK3IrJyI+JyxlKz0nPHRhYmxlIHN0eWxlPSJ3aWR0aDoxMDAlOyBoZWlnaHQ6MTAwJTsiPjx0cj48dGQgY2xhc3M9ImpzLXN0b3JlLXByb2QtcG9wdXAtYnV5LWJ0bi10eHQiPicsZSs9byxlKz0iPC90ZD48L3RyPjwvdGFibGU+IixlKz0iPC9hPiIsZSs9IjwvZGl2PiIpLGV9ZnVuY3Rpb24gdF9zdG9yZV9nZXRfcHJvZHVjdFBvcHVwX29uZVByaWNlX2h0bWwodCxlKXt2YXIgcj0iIixvPSJjdXJyZW50Ij09PWU/ImpzLXN0b3JlLXByb2QtcHJpY2UgdC1zdG9yZV9fcHJvZC1wb3B1cF9fcHJpY2UiOiJqcy1zdG9yZS1wcm9kLXByaWNlLW9sZCB0LXN0b3JlX19wcm9kLXBvcHVwX19wcmljZV9vbGQiLG49T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQucHJpY2UsImZvbnRXZWlnaHQiKSYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQucHJpY2UsImZvbnRTaXplIiksaSxzPSIiLGE9ImN1cnJlbnQiPT09ZT90LnByaWNlLmNvbG9yOnQucHJpY2UuY29sb3JPbGQsYz10LnBvcHVwX29wdHMuY29udGFpbmVyQmdDb2xvcjswPT09TWF0aC5hYnModF9zdG9yZV9nZXRMaWdodG5lc3NDb2xvcihhKS10X3N0b3JlX2dldExpZ2h0bmVzc0NvbG9yKGMpKSYmKGE9dF9zdG9yZV9sdW1hX3JnYihjKSxufHwocys9YT8iY29sb3I6IithKyI7IjoiIikpLG4mJihzKz1hPyJjb2xvcjoiK2ErIjsiOiIiLHMrPXQucHJpY2UuZm9udFdlaWdodD8iZm9udC13ZWlnaHQ6Iit0LnByaWNlLmZvbnRXZWlnaHQrIjsiOiIiKSxpPSIiIT09cz8nc3R5bGUgPSAiJytzKyciJzoiIjt2YXIgbD10LmN1cnJlbmN5VHh0Pyc8ZGl2IGNsYXNzPSJ0LXN0b3JlX19wcm9kLXBvcHVwX19wcmljZS1jdXJyZW5jeSIgdHJhbnNsYXRlPSJubyI+Jyt0LmN1cnJlbmN5VHh0KyI8L2Rpdj4iOiIiLGQ9ImN1cnJlbnQiPT09ZT8ianMtcHJvZHVjdC1wcmljZSBqcy1zdG9yZS1wcm9kLXByaWNlLXZhbCI6ImpzLXN0b3JlLXByb2QtcHJpY2Utb2xkLXZhbCI7cmV0dXJuIHIrPSc8ZGl2IGNsYXNzPSInK28rJyB0LXN0b3JlX19wcm9kLXBvcHVwX19wcmljZS1pdGVtIHQtbmFtZSB0LW5hbWVfbWQiICcraSsiPiIscis9InIiIT09dC5jdXJyZW5jeVNpZGUmJmw/bDoiIixyKz0nPGRpdiBjbGFzcz0iJytkKycgdC1zdG9yZV9fcHJvZC1wb3B1cF9fcHJpY2UtdmFsdWUiIHRyYW5zbGF0ZT0ibm8iPjwvZGl2Picscis9InIiPT09dC5jdXJyZW5jeVNpZGUmJmw/bDoiIixyKz0iPC9kaXY+In1mdW5jdGlvbiB0X3N0b3JlX2dldF9wcm9kdWN0UG9wdXBfdGl0bGVUZXh0X2h0bWwoKXt2YXIgdD0iIjtyZXR1cm4gdCs9JzxkaXYgY2xhc3M9InQtc3RvcmVfX3Byb2QtcG9wdXBfX3RpdGxlLXdyYXBwZXIiPicsdCs9JyAgICA8ZGl2IGNsYXNzPSJqcy1zdG9yZS1wcm9kLW5hbWUganMtcHJvZHVjdC1uYW1lIHQtc3RvcmVfX3Byb2QtcG9wdXBfX25hbWUgdC10eXBvZ3JhcGh5X190aXRsZSB0LW5hbWUgdC1uYW1lX3hsIj48L2Rpdj4nLHQrPScgICAgPGRpdiBjbGFzcz0idC1zdG9yZV9fcHJvZC1wb3B1cF9fYnJhbmQgdC10eXBvZ3JhcGh5X19za3UgdC1kZXNjciB0LWRlc2NyX3h4cyI+PC9kaXY+Jyx0Kz0nICAgIDxkaXYgY2xhc3M9InQtc3RvcmVfX3Byb2QtcG9wdXBfX3NrdSB0LXR5cG9ncmFwaHlfX3NrdSB0LWRlc2NyIHQtZGVzY3JfeHhzIj4nLHQrPXdpbmRvdy50U3RvcmVEaWN0LnNrdSsiOiAiLHQrPSc8c3BhbiBjbGFzcz0ianMtc3RvcmUtcHJvZC1za3UganMtcHJvZHVjdC1za3UiPicsdCs9Ijwvc3Bhbj4iLHQrPSIgICAgPC9kaXY+Iix0Kz0iPC9kaXY+In1mdW5jdGlvbiB0X3N0b3JlX2dldF9wcm9kdWN0UG9wdXBfY2xvc2VJY29uX2h0bWwodCl7dmFyIGU9IiIscj10LnBvcHVwX29wdHMuaWNvbkNvbG9yP3QucG9wdXBfb3B0cy5pY29uQ29sb3I6IiMwMDAwMDAiLG89dC5wb3B1cF9vcHRzLm92ZXJsYXlCZ0NvbG9yUmdiYT90X3N0b3JlX3JlbW92ZVJnYk9wYWNpdHkodC5wb3B1cF9vcHRzLm92ZXJsYXlCZ0NvbG9yUmdiYSk6dC5wb3B1cF9vcHRzLmNvbnRhaW5lckJnQ29sb3Isbj1vJiZvLmxlbmd0aD9vOiIjZmZmZmZmIixpO3QucG9wdXBfb3B0cy5vdmVybGF5QmdDb2xvclJnYmEmJiF0LnBvcHVwX29wdHMuaWNvbkNvbG9yJiYocj10X3N0b3JlX2x1bWFfcmdiKHRfc3RvcmVfcmVtb3ZlUmdiT3BhY2l0eSh0LnBvcHVwX29wdHMub3ZlcmxheUJnQ29sb3JSZ2JhKSkpO3JldHVybiBlKz0nPGRpdiBjbGFzcz0idC1wb3B1cF9fY2xvc2UiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAnK24rJyI+JyxlKz0nICAgIDxkaXYgY2xhc3M9InQtcG9wdXBfX2Nsb3NlLXdyYXBwZXIiPicsZSs9JzxzdmcgY2xhc3M9InQtcG9wdXBfX2Nsb3NlLWljb24gdC1wb3B1cF9fY2xvc2UtaWNvbl9hcnJvdyIgd2lkdGg9IjI2cHgiIGhlaWdodD0iMjZweCIgdmlld0JveD0iMCAwIDI2IDI2IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPicsZSs9JzxwYXRoIGQ9Ik0xMC40MTQyMTM2LDUgTDExLjgyODQyNzEsNi40MTQyMTM1NiBMNS44MjksMTIuNDE0IEwyMy40MTQyMTM2LDEyLjQxNDIxMzYgTDIzLjQxNDIxMzYsMTQuNDE0MjEzNiBMNS44MjksMTQuNDE0IEwxMS44Mjg0MjcxLDIwLjQxNDIxMzYgTDEwLjQxNDIxMzYsMjEuODI4NDI3MSBMMiwxMy40MTQyMTM2IEwxMC40MTQyMTM2LDUgWiIgZmlsbD0iJytyKyciPjwvcGF0aD4nLGUrPSI8L3N2Zz4iLGUrPScgICAgICAgIDxzdmcgY2xhc3M9InQtcG9wdXBfX2Nsb3NlLWljb24gdC1wb3B1cF9fY2xvc2UtaWNvbl9jcm9zcyIgd2lkdGg9IjIzcHgiIGhlaWdodD0iMjNweCIgdmlld0JveD0iMCAwIDIzIDIzIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPicsZSs9JyAgICAgICAgICAgIDxnIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSInK3IrJyIgZmlsbC1ydWxlPSJldmVub2RkIj4nLGUrPScgICAgICAgICAgICAgICAgPHJlY3QgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTEuMzEzNzA4LCAxMS4zMTM3MDgpIHJvdGF0ZSgtNDUuMDAwMDAwKSB0cmFuc2xhdGUoLTExLjMxMzcwOCwgLTExLjMxMzcwOCkgIiB4PSIxMC4zMTM3MDg1IiB5PSItMy42ODYyOTE1IiB3aWR0aD0iMiIgaGVpZ2h0PSIzMCI+PC9yZWN0PicsZSs9JyAgICAgICAgICAgICAgICA8cmVjdCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMS4zMTM3MDgsIDExLjMxMzcwOCkgcm90YXRlKC0zMTUuMDAwMDAwKSB0cmFuc2xhdGUoLTExLjMxMzcwOCwgLTExLjMxMzcwOCkgIiB4PSIxMC4zMTM3MDg1IiB5PSItMy42ODYyOTE1IiB3aWR0aD0iMiIgaGVpZ2h0PSIzMCI+PC9yZWN0PicsZSs9IiAgICAgICAgICAgIDwvZz4iLGUrPSIgICAgICAgIDwvc3ZnPiIsZSs9IiAgICA8L2Rpdj4iLGUrPSI8L2Rpdj4ifWZ1bmN0aW9uIHRfc3RvcmVfZ2V0X3Byb2R1Y3RQb3B1cF9jbG9zZUljb25fY29sb3IodCxlKXt2YXIgcj1lLnBvcHVwX29wdHMuaWNvbkNvbG9yP2UucG9wdXBfb3B0cy5pY29uQ29sb3I6IiMwMDAwMDAiLG89ZS5wb3B1cF9vcHRzLm92ZXJsYXlCZ0NvbG9yUmdiYT90X3N0b3JlX3JlbW92ZVJnYk9wYWNpdHkoZS5wb3B1cF9vcHRzLm92ZXJsYXlCZ0NvbG9yUmdiYSk6ZS5wb3B1cF9vcHRzLmNvbnRhaW5lckJnQ29sb3Isbj1vJiZvLmxlbmd0aD9vOiIjZmZmZmZmIixpO2UucG9wdXBfb3B0cy5vdmVybGF5QmdDb2xvclJnYmEmJiFlLnBvcHVwX29wdHMuaWNvbkNvbG9yJiYocj10X3N0b3JlX2x1bWFfcmdiKGk9dF9zdG9yZV9yZW1vdmVSZ2JPcGFjaXR5KGUucG9wdXBfb3B0cy5vdmVybGF5QmdDb2xvclJnYmEpKSk7dmFyIHM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrdCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpIT09ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX3Byb2R1Y3Qtc25pcHBldCIpJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLmNvbnRhaW5zKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19wcm9kdWN0LXNuaXBwZXQiKSksYz1hP3MucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX3Byb2Qtc25pcHBldF9fY29udGFpbmVyIik6cy5xdWVyeVNlbGVjdG9yKCIudC1wb3B1cCIpLGw7Yy5xdWVyeVNlbGVjdG9yKCIudC1wb3B1cF9fY2xvc2UiKS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9bjt2YXIgZD1jLnF1ZXJ5U2VsZWN0b3IoIi50LXBvcHVwX19jbG9zZS1pY29uX2Nyb3NzIikscDthJiYhZS5wb3B1cF9vcHRzLmljb25Db2xvciYmTWF0aC5hYnModF9zdG9yZV9nZXRMaWdodG5lc3NDb2xvcihyKS10X3N0b3JlX2dldExpZ2h0bmVzc0NvbG9yKHRfc3RvcmVfcmVtb3ZlUmdiT3BhY2l0eShuKSkpPi4xPyhpPXRfc3RvcmVfcmVtb3ZlUmdiT3BhY2l0eShlLnBvcHVwX29wdHMuY29udGFpbmVyQmdDb2xvcil8fCJyZ2IoMjU1LDI1NSwyNTUpIixkLnF1ZXJ5U2VsZWN0b3IoImciKS5zZXRBdHRyaWJ1dGUoImZpbGwiLHRfc3RvcmVfbHVtYV9yZ2IoaSkpKTpkLnF1ZXJ5U2VsZWN0b3IoImciKS5zZXRBdHRyaWJ1dGUoImZpbGwiLHIpLGMucXVlcnlTZWxlY3RvcigiLnQtcG9wdXBfX2Nsb3NlLWljb25fYXJyb3ciKS5xdWVyeVNlbGVjdG9yKCJwYXRoIikuc2V0QXR0cmlidXRlKCJmaWxsIixyKX1mdW5jdGlvbiB0X3N0b3JlX2dldF9wcm9kdWN0UG9wdXBfY2xvc2VUZXh0X2h0bWwodCl7aWYoIXQucG9wdXBfb3B0cy5jbG9zZVRleHQpcmV0dXJuIiI7dmFyIGU9dF9zdG9yZV91bmVzY2FwZUh0bWwodC5wb3B1cF9vcHRzLmNsb3NlVGV4dCkscj10LnBvcHVwX29wdHMuaWNvbkNvbG9yP3QucG9wdXBfb3B0cy5pY29uQ29sb3I6IiMwMDAwMDAiLG89dC5wb3B1cF9vcHRzLmNvbnRhaW5lckJnQ29sb3ImJnQucG9wdXBfb3B0cy5jb250YWluZXJCZ0NvbG9yLmxlbmd0aD90LnBvcHVwX29wdHMuY29udGFpbmVyQmdDb2xvcjoiI2ZmZmZmZiIsbjt0LnBvcHVwX29wdHMuY29udGFpbmVyQmdDb2xvciYmIXQucG9wdXBfb3B0cy5pY29uQ29sb3ImJihyPXRfc3RvcmVfbHVtYV9yZ2IodF9zdG9yZV9oZXhUb1JnYihvKSkpO3ZhciBpLHM9IiI7cmV0dXJuIHMrPSc8ZGl2IGNsYXNzPSJ0LXN0b3JlX19wcm9kLXBvcHVwX19jbG9zZS10eHQtd3IiPicscys9JyAgICA8ZGl2IGNsYXNzPSJqcy1zdG9yZS1jbG9zZS10ZXh0IHQtc3RvcmVfX3Byb2QtcG9wdXBfX2Nsb3NlLXR4dCB0LWRlc2NyIHQtZGVzY3JfeHhzIiAnKygnc3R5bGU9ImNvbG9yOicrcisnIicpKyI+IixzKz1lLHMrPSIgICAgPC9kaXY+IixzKz0iPC9kaXY+In1mdW5jdGlvbiB0X3N0b3JlX2dldF9sb2FkTW9yZUJ0bl9odG1sKHQsZSl7dmFyIHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbl9sb2FkbW9yZV8iK2UucmVjaWQpO2lmKCFyfHwhci5jb250ZW50KXJldHVybiB0X3N0b3JlX2dldF9sb2FkTW9yZUJ0bl9odG1sX2xlZ2FjeSh0LGUpO3ZhciBvPXIuY29udGVudC5jbG9uZU5vZGUoITApLG49by5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtbG9hZC1tb3JlLWJ0bi10ZXh0IiksaSxzO3JldHVybiBuJiYobi50ZXh0Q29udGVudD13aW5kb3cudFN0b3JlRGljdC5sb2FkbW9yZSksJ1xuXHRcdDxkaXYgY2xhc3M9IicrKCEhKHdpbmRvdy5pbm5lcldpZHRoPDk2MCYmdC5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtZ3JpZC1jb250LnQtc3RvcmVfX2dyaWQtY29udF9tb2JpbGUtb25lLXJvdyIpKT8idC1zdG9yZV9fbG9hZC1tb3JlLWJ0bi13cmFwIHQtYWxpZ25fY2VudGVyIHQtc3RvcmVfX2xvYWQtbW9yZS1idG4td3JhcF9oaWRkZW4iOiJ0LXN0b3JlX19sb2FkLW1vcmUtYnRuLXdyYXAgdC1hbGlnbl9jZW50ZXIiKSsnIj5cblx0XHRcdCcrby5maXJzdEVsZW1lbnRDaGlsZC5vdXRlckhUTUwrIlxuXHRcdDwvZGl2PlxuXHQifWZ1bmN0aW9uIHRfc3RvcmVfZ2V0X2xvYWRNb3JlQnRuX2h0bWxfbGVnYWN5KHQsZSl7dmFyIHI9IiIsbyxuLGk7cmV0dXJuIHIrPSc8ZGl2IGNsYXNzPSJ0LXN0b3JlX19sb2FkLW1vcmUtYnRuLXdyYXAgdC1hbGlnbl9jZW50ZXInKyghISh3aW5kb3cuaW5uZXJXaWR0aDw5NjAmJnQucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLWdyaWQtY29udC50LXN0b3JlX19ncmlkLWNvbnRfbW9iaWxlLW9uZS1yb3ciKSk/IiB0LXN0b3JlX19sb2FkLW1vcmUtYnRuLXdyYXBfaGlkZGVuICI6IiIpKyciPicscis9JyAgICA8ZGl2IGNsYXNzPSJqcy1zdG9yZS1sb2FkLW1vcmUtYnRuIHQtc3RvcmVfX2xvYWQtbW9yZS1idG4gdC1idG4gJysoInNtIj09PWUuYnRuU2l6ZT8idC1idG5feHMiOiJ0LWJ0bl9zbSIpKyciIHN0eWxlPSInK2UuYnRuMV9zdHlsZSsnZGlzcGxheTpub25lOyI+JyxyKz0nICAgICAgICA8dGFibGUgc3R5bGU9IndpZHRoOjEwMCU7IGhlaWdodDoxMDAlOyI+PHRyPjx0ZD4nK3dpbmRvdy50U3RvcmVEaWN0LmxvYWRtb3JlKyI8L3RkPjwvdHI+PC90YWJsZT4iLHIrPSIgICAgPC9kaXY+IixyKz0iPC9kaXY+In1mdW5jdGlvbiB0X3N0b3JlX2dldF9oYW5kSWNvbl9odG1sKHQsZSl7dmFyIHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrdCksbz0icmdiYSgxOTAsMTkwLDE5MCwwLjMpIixuPSJyZ2JhKDE5MCwxOTAsMTkwLDEpIixpPSJyZ2JhKDE5MCwxOTAsMTkwLDAuMykiLHM9Im1peC1ibGVuZC1tb2RlOiBtdWx0aXBseTsiLGEsYz1yLmdldEF0dHJpYnV0ZSgiZGF0YS1iZy1jb2xvciIpLGwsZCxwLHU7KGMmJihhPS0xIT09Yy5pbmRleE9mKCItZ3JhZGllbnQoIik/dF9zdG9yZV9nZXRGaXJzdENvbG9yRnJvbUdyYWRpZW50KGMpOnRfc3RvcmVfaGV4VG9SZ2IoYykpLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIikhPT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1zdG9yZV9fcHJvZHVjdC1zbmlwcGV0IikmJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIikuY29udGFpbnMoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX3Byb2R1Y3Qtc25pcHBldCIpKSYmKGE9ci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IpLGEpJiYoIndoaXRlIj09PXRfc3RvcmVfbHVtYV9yZ2IoYSkmJihzPSJtaXgtYmxlbmQtbW9kZTogbGlnaHRlbjsiLG89InJnYmEoMjU1LDI1NSwyNTUsMC4yKSIsbj0icmdiYSgyNTUsMjU1LDI1NSwxKSIsaT0icmdiYSgyNTUsMjU1LDI1NSwwLjIpIikpO3JldHVybiJoYW5kIiE9PWUmJmU/ImNpcmNsZSI9PT1lPyc8ZGl2IGNsYXNzPSJ0LXN0b3JlX19zY3JvbGwtaWNvbi13cmFwcGVyIiBzdHlsZT0iJytzKyciPjxzdmcgcm9sZT0icHJlc2VudGF0aW9uIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAxNiIgaGVpZ2h0PSIxNiIgd2lkdGg9IjM4Ij48cmVjdCBjbGFzcz0idG9vbHRpcC1ob3Jpem9udGFsLXNjcm9sbC1pY29uX2NpcmNsZSIgeD0iMjIiIHk9IjAiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgcng9IjgiIGZpbGw9IicraSsnIj48L3JlY3Q+PHN0eWxlPi50b29sdGlwLWhvcml6b250YWwtc2Nyb2xsLWljb25fY2lyY2xlIHthbmltYXRpb246IHRvb2x0aXAtaG9yaXpvbnRhbC1zY3JvbGwtaWNvbl9hbmltLXNjcm9sbC1jaXJjbGUgMi45cyBpbmZpbml0ZSBsaW5lYXI7fUBrZXlmcmFtZXMgdG9vbHRpcC1ob3Jpem9udGFsLXNjcm9sbC1pY29uX2FuaW0tc2Nyb2xsLWNpcmNsZSB7MCUgeyBvcGFjaXR5OiAxO3RyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTt3aWR0aDogMTZweDthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluLW91dDsgfTI3JSB7IG9wYWNpdHk6IDE7dHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0yMHB4KTt3aWR0aDogMjFweDthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDsgfTM3JSB7IG9wYWNpdHk6IDE7dHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0yMnB4KTt3aWR0aDogMTZweDthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluLW91dDsgfTU0JSB7IG9wYWNpdHk6IDA7dHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0yMnB4KTt3aWR0aDogMTZweDthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluLW91dDsgfTEwMCUgeyBvcGFjaXR5OiAwO3RyYW5zZm9ybTogdHJhbnNsYXRlWCgtMjJweCk7d2lkdGg6IDE2cHg7IH19PC9zdHlsZT48L3N2Zz48L2Rpdj4nOiIiOic8ZGl2IGNsYXNzPSJ0LXN0b3JlX19zY3JvbGwtaWNvbi13cmFwcGVyIiBzdHlsZT0iJytzKyciPjxzdmcgcm9sZT0icHJlc2VudGF0aW9uIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMjAgMzAwIiBoZWlnaHQ9IjQyIiB3aWR0aD0iNDIiPjxyZWN0IGNsYXNzPSJ0b29sdGlwLWhvcml6b250YWwtc2Nyb2xsLWljb25fY2FyZCIgeD0iNDgwIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgcng9IjUiIGZpbGw9IicrbysnIj48L3JlY3Q+PHJlY3QgY2xhc3M9InRvb2x0aXAtaG9yaXpvbnRhbC1zY3JvbGwtaWNvbl9jYXJkIiB5PSIwIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgcng9IjUiIGZpbGw9IicrbysnIj48L3JlY3Q+PHJlY3QgY2xhc3M9InRvb2x0aXAtaG9yaXpvbnRhbC1zY3JvbGwtaWNvbl9jYXJkIiB4PSIyNDAiIHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIiByeD0iNSIgZmlsbD0iJytvKyciPjwvcmVjdD48cGF0aCBjbGFzcz0idG9vbHRpcC1ob3Jpem9udGFsLXNjcm9sbC1pY29uX2hhbmQiIGQ9Ik03OC45NTc5IDI4NS43Qzc4Ljk1NzkgMjg1LjcgMzcuODU3OSAyMTIuNSAyMC41NTc5IDE4MC44Qy0yLjQ0MjA5IDEzOC42IC02LjI0MjIgMTIwLjggOS42NTc5IDExMkMxOS41NTc5IDEwNi41IDMzLjI1NzkgMTA4LjggNDEuNjU3OSAxMjMuNEw2MS4yNTc5IDE1NC42VjMyLjNDNjEuMjU3OSAzMi4zIDYwLjA1NzkgMCA4My4wNTc5IDBDMTA3LjU1OCAwIDEwNS40NTggMzIuMyAxMDUuNDU4IDMyLjNWOTEuN0MxMDUuNDU4IDkxLjcgMTE4LjM1OCA4Mi40IDEzMy40NTggODYuNkMxNDEuMTU4IDg4LjcgMTUwLjE1OCA5Mi40IDE1NC45NTggMTA0LjZDMTU0Ljk1OCAxMDQuNiAxODUuNjU4IDg5LjcgMjAwLjk1OCAxMjEuNEMyMDAuOTU4IDEyMS40IDIzNi4zNTggMTE0LjQgMjM2LjM1OCAxNTEuMUMyMzYuMzU4IDE4Ny44IDE5Mi4xNTggMjg1LjcgMTkyLjE1OCAyODUuN0g3OC45NTc5WiIgZmlsbD0iJytuKyciPjwvcGF0aD48c3R5bGU+LnRvb2x0aXAtaG9yaXpvbnRhbC1zY3JvbGwtaWNvbl9oYW5kIHthbmltYXRpb246IHRvb2x0aXAtaG9yaXpvbnRhbC1zY3JvbGwtaWNvbl9hbmltLXNjcm9sbC1oYW5kIDJzIGluZmluaXRlfS50b29sdGlwLWhvcml6b250YWwtc2Nyb2xsLWljb25fY2FyZCB7YW5pbWF0aW9uOiB0b29sdGlwLWhvcml6b250YWwtc2Nyb2xsLWljb25fYW5pbS1zY3JvbGwtY2FyZCAycyBpbmZpbml0ZX1Aa2V5ZnJhbWVzIHRvb2x0aXAtaG9yaXpvbnRhbC1zY3JvbGwtaWNvbl9hbmltLXNjcm9sbC1oYW5kIHswJSB7IHRyYW5zZm9ybTogdHJhbnNsYXRlWCg4MHB4KSBzY2FsZSgxKTsgb3BhY2l0eTogMCB9MTAlIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDgwcHgpIHNjYWxlKDEpOyBvcGFjaXR5OiAxIH0yMCUsNjAlIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDE3NXB4KSBzY2FsZSguNik7IG9wYWNpdHk6IDEgfTgwJSB7IHRyYW5zZm9ybTogdHJhbnNsYXRlWCg1cHgpIHNjYWxlKC42KTsgb3BhY2l0eTogMSB9IHRvIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDVweCkgc2NhbGUoLjYpOyBvcGFjaXR5OiAwIH19QGtleWZyYW1lcyB0b29sdGlwLWhvcml6b250YWwtc2Nyb2xsLWljb25fYW5pbS1zY3JvbGwtY2FyZCB7MCUsNjAlIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApIH04MCUsdG8geyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTI0MHB4KSB9fTwvc3R5bGU+PC9zdmc+PC9kaXY+J31mdW5jdGlvbiB0X3N0b3JlX2dldF9lbXB0eU1zZ19odG1sKHQpe3ZhciBlPSIiLHI9dC50eXBvLnRpdGxlQ29sb3I/ImNvbG9yOiIrdC50eXBvLnRpdGxlQ29sb3IrIjtib3JkZXItY29sb3I6Iit0LnR5cG8udGl0bGVDb2xvcisiOyI6IiIsbz0ianMtc3RvcmUtZW1wdHktcGFydC1tc2cgdC1zdG9yZV9fZW1wdHktcGFydC1tc2ctY29udCI7cmV0dXJuIGUrPSc8ZGl2IGNsYXNzPSInKyhvKz10LmNvbENsYXNzRnVsbFdpZHRoPyIgIit0LmNvbENsYXNzRnVsbFdpZHRoOiIiKSsnIiBzdHlsZT0iZGlzcGxheTpub25lOyI+JyxlKz0nICAgIDxkaXYgY2xhc3M9IiB0LXN0b3JlX19lbXB0eS1wYXJ0LW1zZy13cmFwcGVyIHQtZGVzY3IgdC1kZXNjcl9zbSIgc3R5bGU9IicrcisnIj4nLGUrPScgICAgICAgIDxkaXYgY2xhc3M9InQtc3RvcmVfX2VtcHR5LXBhcnQtbXNnIj4nLGUrPSIgICAgICAgICIrd2luZG93LnRTdG9yZURpY3QuZW1wdHlwYXJ0bXNnLGUrPSIgICAgICAgIDwvZGl2PiIsZSs9IiAgICA8L2Rpdj4iLGUrPSI8L2Rpdj4ifWZ1bmN0aW9uIHRfc3RvcmVfZ2V0X2Vycm9yQm94KHQsZSl7dmFyIHI9IiIsbz10LnR5cG8udGl0bGVDb2xvcj8iY29sb3I6Iit0LnR5cG8udGl0bGVDb2xvcisiO2JvcmRlci1jb2xvcjoiK3QudHlwby50aXRsZUNvbG9yKyI7IjoiIixuPSJqcy1zdG9yZS1lcnJvci1tc2cgdC1zdG9yZV9fZXJyb3ItbXNnLWNvbnQiO3JldHVybiByKz0iXHgzYyEtLWdvb2dsZW9mZjogYWxsLS1ceDNlIixyKz0iXHgzYyEtLW5vaW5kZXgtLVx4M2UiLHIrPSc8ZGl2IGNsYXNzPSInKyhuKz10LmNvbENsYXNzRnVsbFdpZHRoPyIgIit0LmNvbENsYXNzRnVsbFdpZHRoOiIiKSsnIiBzdHlsZT0iZGlzcGxheTpub25lOyI+JyxyKz0nICAgIDxkaXYgY2xhc3M9InQtc3RvcmVfX2Vycm9yLW1zZy13cmFwcGVyIHQtZGVzY3IgdC1kZXNjcl9zbSIgc3R5bGU9IicrbysnIj4nLHIrPScgICAgICAgIDxkaXYgY2xhc3M9InQtc3RvcmVfX2Vycm9yLW1zZyI+JyxyKz0iICAgICAgICAiK2Uscis9IiAgICAgICAgPC9kaXY+IixyKz0iICAgIDwvZGl2PiIscis9IjwvZGl2PiIscis9Ilx4M2MhLS0vbm9pbmRleC0tXHgzZSIscis9Ilx4M2MhLS1nb29nbGVvbjogYWxsLS1ceDNlIn1mdW5jdGlvbiB0X3N0b3JlX2dldF9wcm9kdWN0Q2FyZF9odG1sKHQsZSxyLG8sbixpKXt2YXIgcz1vPyJ0LWNvbCB0LWNvbF8zIjpyLmNvbENsYXNzLGE9dF9zdG9yZV9wcm9kdWN0X2dldEZpcnN0QXZhaWxhYmxlRWRpdGlvbkRhdGEoZS5lZGl0aW9ucyksYz0iIixsPSJsZWZ0Ij09PXIuYWxpZ24/InQtYWxpZ25fbGVmdCI6InQtYWxpZ25fY2VudGVyIixkPXIuaXRlbXNBbmltJiZyLnByZXZpZXdtb2RlPyJ0LWFuaW1hdGUiOiIiO2lmKHdpbmRvdy50U3RvcmVJc01vYmlsZSl7dmFyIHA9bmF2aWdhdG9yLmNvbm5lY3Rpb258fG5hdmlnYXRvci5tb3pDb25uZWN0aW9ufHxuYXZpZ2F0b3Iud2Via2l0Q29ubmVjdGlvbjtwJiYoInNsb3ctMmciIT09cC5lZmZlY3RpdmVUeXBlJiYiMmciIT09cC5lZmZlY3RpdmVUeXBlJiYiM2ciIT09cC5lZmZlY3RpdmVUeXBlfHwoZD0iIikpfXZhciB1PXIuaXRlbXNBbmltPydkYXRhLWFuaW1hdGUtc3R5bGU9Iicrci5pdGVtc0FuaW0rJyIgZGF0YS1hbmltYXRlLWNoYWluPSJ5ZXMiICc6IiIsXz1hLnF1YW50aXR5JiZwYXJzZUludChhLnF1YW50aXR5LDEwKTw9MCxmPSdkYXRhLXByb2R1Y3QtaW52PSInKyhhLnF1YW50aXR5fHwiIikrJyIgJyx5PSIxMDI1Ij09PXIucHJvZENhcmQuYmxvY2tJZCx2PXIucHJvZENhcmQuYnRuTGluazEsZz10X3N0b3JlX2dldF9wcm9kdWN0Q2FyZF9saW5rKHYsZSxvLHQpLG09dF9zdG9yZV9nZXRfcHJvZHVjdENhcmRfdGFyZ2V0QXR0cih2LGUpLGg9e29wZW46ci5wcmV2aWV3bW9kZT8nPGEgaHJlZj0iJytnKyciICcrbSsiPiI6IiIsY2xvc2U6ci5wcmV2aWV3bW9kZT8iPC9hPiI6IiJ9OyhfJiYiI29yZGVyIj09PWd8fCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudDcwNl9fY2FydHdpbiIpJiYhZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQ3MDZfX3NpZGViYXIiKSYmIiNvcmRlciI9PT1nKSYmKGgub3Blbj0iIixoLmNsb3NlPSIiKTt2YXIgYj0iIjtvJiYoYj0ianMtcHJvZHVjdC1yZWxldmFudCIpO3ZhciB3PTQsUz1lLnBhY2tfbGFiZWwsRT1lLnBhY2tfbSxQPWUucGFja194LHg9ZS5wYWNrX3ksQz1lLnBhY2tfeixBPXBhcnNlSW50KG4sMTApKzEsaj0oIjk3MyI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1yZWNvcmQtdHlwZSIpfHwiOTczIj09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLXBhcmVudHRwbGlkIikpJiYhbyxPPW8mJnIucmVsZXZhbnRzX3NsaWRlciYmKGkubGVuZ3RoPjR8fHdpbmRvdy5pbm5lcldpZHRoPD05NjApOyhPfHxqKSYmKGMrPSc8ZGl2IGNsYXNzPSJ0LXNsZHNfX2l0ZW0gdC1hbmltYXRlIiBkYXRhLXNsaWRlLWluZGV4PSInK0ErJyI+JyxjKz0nPGRpdiBjbGFzcz0idF9fc2xkcy13cmFwcGVyIHQtc2xkc19fd3JhcHBlciB0LXNsZHNfX3dyYXBwZXJfMTAwIj4nKTt2YXIgaz1lLnVybHx8IiIsTD0iIjt5JiYoIjIiPT09ci5wcm9kQ2FyZC5zdHlsZT9MKz0iIHQtc3RvcmVfX2NhcmRfaW4tcm93IjoiMyI9PT1yLnByb2RDYXJkLnN0eWxlP0wrPSIgdC1zdG9yZV9fY2FyZF91bmRlci1kZXNjcmlwdGlvbiI6TCs9IiB0LXN0b3JlX19jYXJkX2luLWNvbHVtbiIsTCs9ci5wcm9kQ2FyZC5oYXNTZXBhcmF0b3I/IiI6IiB0LXN0b3JlX19jYXJkX25vLXNlcGFyYXRvciIsTCs9cGFyc2VJbnQoci5yaWdodENvbHVtbldpZHRoLDEwKT8iIHQtc3RvcmVfX2NhcmRfZml4ZWQtd2lkdGgiOiIiLEwrPXIudmVydGljYWxBbGlnbj8iIHQtc3RvcmVfX2NhcmRfdmVydGljYWxBbGlnbl8iK3IudmVydGljYWxBbGlnbjoiIik7dmFyIFQ9W107dHJ5e1Q9SlNPTi5wYXJzZShlLnBhcnR1aWRzKX1jYXRjaChxKXtjb25zb2xlLmVycm9yKHEpfXJldHVybiBjKz0nPGRpdiBjbGFzcz0ianMtcHJvZHVjdCB0LXN0b3JlX19jYXJkIHQtc3RvcmVfX2NhcmRfaGlkZGVuICcrTCsiICIrcysiICIrbCsiICIrYisiIHQtaXRlbSAiK2QrJyIgJyt1K2YrJ2RhdGEtcHJvZHVjdC1saWQ9IicrZS51aWQrJyIgZGF0YS1wcm9kdWN0LXVpZD0iJytlLnVpZCsnIiBkYXRhLXByb2R1Y3QtZ2VuLXVpZD0iJytlLnVpZCsnIiBkYXRhLXByb2R1Y3QtcGFjay1sYWJlbD0iJytTKyciIGRhdGEtcHJvZHVjdC1wYWNrLW09IicrRSsnIiBkYXRhLXByb2R1Y3QtcGFjay14PSInK1ArJyIgZGF0YS1wcm9kdWN0LXBhY2steT0iJyt4KyciIGRhdGEtcHJvZHVjdC1wYWNrLXo9IicrQysnIiBkYXRhLXByb2R1Y3QtdXJsPSInK2srJyIgZGF0YS1wcm9kdWN0LXBhcnQtdWlkPSInK1Quam9pbigiLCIpKyciID4nLHIucHJvZENhcmQuaGFzV3JhcD9jKz10X3N0b3JlX2dldF9wcm9kdWN0Q2FyZF93cmFwcGVyU3RydWN0dXJlKGUsYSxyLGgsbyx0KTpjKz15JiYhbz90X3N0b3JlX2dldF9wcm9kdWN0Q2FyZF9ob3Jpem9udGFsU3RydWN0dXJlKGUsYSxyLGgsbyx0KTp0X3N0b3JlX2dldF9wcm9kdWN0Q2FyZF9zaW1wbGVTdHJ1Y3R1cmUoZSxhLHIsaCxvLHQpLGMrPSI8L2Rpdj4iLChPfHxqKSYmKGMrPSI8L2Rpdj4iLGMrPSI8L2Rpdj4iKSxjfWZ1bmN0aW9uIHRfc3RvcmVfZ2V0X3Byb2R1Y3RDYXJkX3NpbXBsZVN0cnVjdHVyZSh0LGUscixvLG4saSl7dmFyIHM9ci5wcm9kQ2FyZCYmci5wcm9kQ2FyZC5zaG93T3B0cz8iIjonc3R5bGU9ImRpc3BsYXk6bm9uZTsiJyxhPXRfc3RvcmVfZ2V0X3Byb2R1Y3RDYXJkX2ltZ19odG1sKHQsciksYz10X3N0b3JlX2dldF9wcm9kdWN0Q2FyZF9idG5faHRtbCh0LHIsbixpKSxsPWMmJmMubGVuZ3RoPjA/InN0b3JlX19jYXJkX19oYXMtYnRucyI6IiI7cmV0dXJuIlxuXHRcdCIrby5vcGVuKyJcblx0XHRcdCIrYSsiXG5cdFx0IitvLmNsb3NlKydcblx0XHQ8ZGl2IGNsYXNzPSJ0LXN0b3JlX19jYXJkX193cmFwX3R4dC1hbmQtYnRucyI+XG5cdFx0XHQ8ZGl2IGNsYXNzPSJzdG9yZV9fY2FyZF9fd3JhcF90eHQtYW5kLW9wdHMgJytsKyciPlxuXHRcdFx0XHQnK28ub3BlbisiXG5cdFx0XHRcdFx0Iit0X3N0b3JlX2dldF9wcm9kdWN0Q2FyZF90eHRBbmRQcmljZV9odG1sKHQsZSxyLGEpKyJcblx0XHRcdFx0IitvLmNsb3NlKydcblx0XHRcdFx0PGRpdiBjbGFzcz0ianMtcHJvZHVjdC1jb250cm9scy13cmFwcGVyIHQtc3RvcmVfX2NhcmRfX3Byb2QtY29udHJvbHMtd3JhcHBlciIgJytzKyI+PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcdCIrYysiXG5cdFx0PC9kaXY+XG5cdCJ9ZnVuY3Rpb24gdF9zdG9yZV9nZXRfcHJvZHVjdENhcmRfd3JhcHBlclN0cnVjdHVyZSh0LGUscixvLG4saSl7dmFyIHM9dF9zdG9yZV9nZXRfcHJvZHVjdENhcmRfZ2V0V3JhcHBlclN0eWxlc1N0cihyKSxhPXIucHJvZENhcmQmJnIucHJvZENhcmQuc2hvd09wdHM/IiI6J3N0eWxlPSJkaXNwbGF5Om5vbmU7IicsYz1yLnByb2RDYXJkJiZyLnByb2RDYXJkLnR4dFBhZD8idC1zdG9yZV9fY2FyZF9fd3JhcF9wYWQtIityLnByb2RDYXJkLnR4dFBhZDoiIixsPXIudmVydGljYWxBbGlnbkJ1dHRvbnM/InQtc3RvcmVfX2NhcmRfX3dyYXBfdHh0LWFuZC1idG5zX192ZXJ0aWNhbC1hbGlnbiI6IiIsZD10X3N0b3JlX2dldF9wcm9kdWN0Q2FyZF9idG5faHRtbCh0LHIsbixpKSxwPWQmJmQubGVuZ3RoPjA/InN0b3JlX19jYXJkX19oYXMtYnRucyI6IiI7cmV0dXJuJ1xuXHRcdDxkaXYgY2xhc3M9InQtc3RvcmVfX2NhcmRfX3dyYXBfYWxsIiBzdHlsZT0iJytzKyciPlxuXHRcdFx0JytvLm9wZW4rIlxuXHRcdFx0XHQiK3Rfc3RvcmVfZ2V0X3Byb2R1Y3RDYXJkX2ltZ19odG1sKHQscikrIlxuXHRcdFx0IitvLmNsb3NlKydcblx0XHRcdDxkaXYgY2xhc3M9InQtc3RvcmVfX2NhcmRfX3dyYXBfdHh0LWFuZC1idG5zICcrYysiICIrbCsnIiI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9InN0b3JlX19jYXJkX193cmFwX3R4dC1hbmQtb3B0cyAnK3ArJyI+XG5cdFx0XHRcdFx0JytvLm9wZW4rIlxuXHRcdFx0XHRcdFx0Iit0X3N0b3JlX2dldF9wcm9kdWN0Q2FyZF90eHRBbmRQcmljZV9odG1sKHQsZSxyKSsiXG5cdFx0XHRcdFx0IitvLmNsb3NlKydcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPSJqcy1wcm9kdWN0LWNvbnRyb2xzLXdyYXBwZXIgdC1zdG9yZV9fY2FyZF9fcHJvZC1jb250cm9scy13cmFwcGVyIiAnK2ErIj48L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdCIrZCsiXG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2Rpdj5cblx0In1mdW5jdGlvbiB0X3N0b3JlX2dldF9wcm9kdWN0Q2FyZF9nZXRXcmFwcGVyU3R5bGVzU3RyKHQpe3ZhciBlPSIiO2UrPXQucHJvZENhcmQuYmdDb2xvcj8iYmFja2dyb3VuZC1jb2xvcjoiK3QucHJvZENhcmQuYmdDb2xvcisiOyI6IiIsZSs9dC5wcm9kQ2FyZC5ib3JkZXJSYWRpdXM/ImJvcmRlci1yYWRpdXM6IitwYXJzZUludCh0LnByb2RDYXJkLmJvcmRlclJhZGl1cywxMCkrInB4OyI6IiI7dmFyIHI9dC5wcm9kQ2FyZC5zaGFkb3dPcGFjaXR5LG89dC5wcm9kQ2FyZC5zaGFkb3dTaXplLG49dC5wcm9kQ2FyZC5zaGFkb3csaT0iIjtyZXR1cm4gbj9pPSJib3gtc2hhZG93OiIrbisiOyI6KHJ8fG8pJiYocj1yP3BhcnNlSW50KHIsMTApLzEwMDouMyxpPSJib3gtc2hhZG93OiAwcHggMHB4ICIrKG89bz9wYXJzZUludChvLDEwKToxMCkrInB4IHJnYmEoMCwwLDAsIityKyIpOyIpLGUrPWl9ZnVuY3Rpb24gdF9zdG9yZV9nZXRfcHJvZHVjdENhcmRfaW1nX2h0bWwodCxlLHIpe3ZhciBvPSIxMDI1Ij09PWUucHJvZENhcmQuYmxvY2tJZDtpZihvJiYhZS5wcm9kQ2FyZC5oYXNJbWcpcmV0dXJuIiI7dmFyIG49IiIsaT1lLmhhc09yaWdpbmFsQXNwZWN0UmF0aW8mJiFlLmlzSG9yaXpPbk1vYj8idC1zdG9yZV9fY2FyZF9faW1nd3JhcHBlcl9vcmlnaW5hbC1yYXRpbyI6IiIscz0idC1zdG9yZV9fY2FyZF9faW1nd3JhcHBlciAiLGE7aWYocys9bz9lLmltYWdlUmF0aW9DbGFzczppKyhlLmlzRmxleENvbHM/IiAiK2UuaW1hZ2VSYXRpb0NsYXNzOiIiKSxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpIT09ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX3Byb2R1Y3Qtc25pcHBldCIpJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLmNvbnRhaW5zKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19wcm9kdWN0LXNuaXBwZXQiKSkmJiFlLmNvbFdpZHRoKXt2YXIgYz17MTo3NjAsMjo1NjAsMzozNjAsNDoyNjB9O2UuY29sV2lkdGg9Y1tlLmJsb2Nrc0luUm93XX12YXIgbD0hZS5pbWFnZUhlaWdodHx8ZS5pc0ZsZXhDb2xzfHxvPyIiOiJwYWRkaW5nLWJvdHRvbToiKzEwMCpwYXJzZUludChlLmltYWdlSGVpZ2h0LDEwKS8oZS5jb2xXaWR0aHx8MzYwKSsiJTsiO2lmKGUuaGFzT3JpZ2luYWxBc3BlY3RSYXRpbyYmZS5wcm9kQ2FyZC5ib3JkZXJSYWRpdXMpe3ZhciBkPXBhcnNlSW50KGUucHJvZENhcmQuYm9yZGVyUmFkaXVzLDEwKTtsKz0iYm9yZGVyLXJhZGl1czoiK2QrInB4ICIrZCsicHggMHB4IDBweDsgb3ZlcmZsb3c6IGhpZGRlbjsifXZhciBwPXRfc3RvcmVfZ2V0X3Byb2R1Y3RDYXJkX2ltZ0VsSG92ZXJfaHRtbCh0LGUsciksdT1lLmltYWdlSG92ZXImJnAsXyxmPXJ8fHRfc3RvcmVfZ2V0UHJvZHVjdEZpcnN0SW1nKHQpO2lmKCIiIT09KGY9Zi5yZXBsYWNlKC8mYW1wO2FtcDsvLCImYW1wOyIpKSl7dmFyIHk7aWYoZS5oYXNPcmlnaW5hbEFzcGVjdFJhdGlvKShfPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpKS5jbGFzc0xpc3QuYWRkKCJqcy1wcm9kdWN0LWltZyIpLF8uY2xhc3NMaXN0LmFkZCgidC1zdG9yZV9fY2FyZF9faW1nIiksdSYmXy5jbGFzc0xpc3QuYWRkKCJ0LXN0b3JlX19jYXJkX19pbWdfaG92ZXIiKSwvVmVyc2lvblwvMTZcLjMgU2FmYXJpLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoXy5zdHlsZS5vYmplY3RGaXQ9ImNvbnRhaW4iKSxfLmNsYXNzTGlzdC5hZGQoInQtaW1nIiksXy5zZXRBdHRyaWJ1dGUoImRhdGEtb3JpZ2luYWwiLGYpLF8uc3JjPXRfc3RvcmVfZ2V0TGF6eVNyYyhlLGYpO2Vsc2UoXz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuY2xhc3NMaXN0LmFkZCgianMtcHJvZHVjdC1pbWciKSxfLmNsYXNzTGlzdC5hZGQoInQtc3RvcmVfX2NhcmRfX2JnaW1nIiksdSYmXy5jbGFzc0xpc3QuYWRkKCJ0LXN0b3JlX19jYXJkX19iZ2ltZ19ob3ZlciIpLF8uY2xhc3NMaXN0LmFkZCgidC1iZ2ltZyIpLF8uc2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsIixmKSxfLnN0eWxlLmJhY2tncm91bmRJbWFnZT0ndXJsKCInK3Rfc3RvcmVfZ2V0TGF6eVVybChlLGYpKyciKScsdF9zdG9yZV9nZXRfcHJvZHVjdENhcmRfZ2V0SW1nU3R5bGVzKF8sZSk7aWYoMT09PXQuZWRpdGlvbnMubGVuZ3RoKXt2YXIgdj10X3N0b3JlX3Byb2R1Y3RfZ2V0Rmlyc3RBdmFpbGFibGVFZGl0aW9uRGF0YSh0LmVkaXRpb25zKTt2LnVpZCYmXy5zZXRBdHRyaWJ1dGUoZS5oYXNPcmlnaW5hbEFzcGVjdFJhdGlvPyJpbWdmaWVsZCI6ImJnaW1nZmllbGQiLCJzdF9nYWxsZXJ5X18iK3YudWlkKyI6OjowIil9cmV0dXJuIG4rPSc8ZGl2IGNsYXNzPSInK3MrJyIgc3R5bGU9IicrbCsnIj4nLG4rPSIgICAgIit0X3N0b3JlX2dldF9wcm9kdWN0Q2FyZF9tYXJrX2h0bWwodCxlKSxuKz0iICAgICIrXy5vdXRlckhUTUwsbis9IiAgICAiKyhlLmltYWdlSG92ZXI/cDoiIiksbis9IjwvZGl2PiJ9cmV0dXJuIiJ9ZnVuY3Rpb24gdF9zdG9yZV9nZXRfcHJvZHVjdENhcmRfaW1nX3JlcGxhY2VXaXRoKHQsZSxyLG8pe3ZhciBuPWUucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX2NhcmRfX2ltZ3dyYXBwZXIiKSxpPXRfc3RvcmVfZ2V0X3Byb2R1Y3RDYXJkX2ltZ19odG1sKHQscixvKTtuJiYobi5vdXRlckhUTUw9aSksdF9zdG9yZV9wb3B1cF91cGRhdGVMYXp5TG9hZCgpLHRfc3RvcmVfdHJpZ2dlckV2ZW50KGRvY3VtZW50LmJvZHksInR3aXNobGlzdF9hZGRidG4iKX1mdW5jdGlvbiB0X3N0b3JlX2dldF9wcm9kdWN0Q2FyZF9pbWdFbEhvdmVyX2h0bWwodCxlLHIpe2lmKHQuZ2FsbGVyeSYmIlsiPT09dC5nYWxsZXJ5WzBdKXt2YXIgbz1KU09OLnBhcnNlKHQuZ2FsbGVyeSk7aWYodm9pZCAwIT09b1sxXSl7dmFyIG49b1sxXS5pbWcsaSxzO2lmKHImJnIubGVuZ3RoKWZvcih2YXIgYT0wO2E8by5sZW5ndGg7YSsrKXt2YXIgYz1vW2FdLmltZztpZihjIT09cil7bj1jO2JyZWFrfX1pZihlLmhhc09yaWdpbmFsQXNwZWN0UmF0aW8pKGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIikpLmNsYXNzTGlzdC5hZGQoInQtc3RvcmVfX2NhcmRfX2ltZyIpLGkuY2xhc3NMaXN0LmFkZCgidC1zdG9yZV9fY2FyZF9faW1nX3NlY29uZCIpLGkuY2xhc3NMaXN0LmFkZCgidC1pbWciKSxpLnNldEF0dHJpYnV0ZSgiZGF0YS1vcmlnaW5hbCIsbiksaS5zcmM9dF9zdG9yZV9nZXRMYXp5U3JjKGUsbiksL1ZlcnNpb25cLzE2XC4zIFNhZmFyaS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGkuc3R5bGUub2JqZWN0Rml0PSJjb250YWluIik7ZWxzZShpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKS5jbGFzc0xpc3QuYWRkKCJ0LXN0b3JlX19jYXJkX19iZ2ltZyIsInQtc3RvcmVfX2NhcmRfX2JnaW1nX3NlY29uZCIpLGkuY2xhc3NMaXN0LmFkZCgidC1iZ2ltZyIpLGkuc2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsIixuKSxpLnN0eWxlLmJhY2tncm91bmRJbWFnZT0ndXJsKCInK3Rfc3RvcmVfZ2V0TGF6eVVybChlLG4pKyciKScsdF9zdG9yZV9nZXRfcHJvZHVjdENhcmRfZ2V0SW1nU3R5bGVzKGksZSk7cmV0dXJuIGkub3V0ZXJIVE1MfX1yZXR1cm4iIn1mdW5jdGlvbiB0X3N0b3JlX2dldF9wcm9kdWN0Q2FyZF9nZXRJbWdTdHlsZXModCxlKXtpZihlJiZlLnByb2RDYXJkJiZlLnByb2RDYXJkLmJvcmRlclJhZGl1cyl7dmFyIHI9cGFyc2VJbnQoZS5wcm9kQ2FyZC5ib3JkZXJSYWRpdXMsMTApO3Quc3R5bGUuYm9yZGVyUmFkaXVzPXIrInB4ICIrcisicHggMHB4IDBweCIscj4wJiYhd2luZG93LnRTdG9yZUlzTW9iaWxlJiYodC5zdHlsZS50b3A9Ii0ycHgiKX19ZnVuY3Rpb24gdF9zdG9yZV9nZXRfcHJvZHVjdENhcmRfbWFya19odG1sKHQsZSl7aWYoIXQubWFyaylyZXR1cm4iIjt2YXIgcj0iIjtyKz1lLm1hcmtDb2xvcj8iY29sb3I6IitlLm1hcmtDb2xvcisiOyI6IiI7dmFyIG8sbj0iIjtyZXR1cm4gbis9JzxkaXYgY2xhc3M9InQtc3RvcmVfX2NhcmRfX21hcmstd3JhcHBlciI+JyxuKz0nPGRpdiBjbGFzcz0idC1zdG9yZV9fY2FyZF9fbWFyayIgJysoKHIrPWUubWFya0JnQ29sb3I/ImJhY2tncm91bmQtY29sb3I6IitlLm1hcmtCZ0NvbG9yKyI7IjoiIik/J3N0eWxlPSInK3IrJyInOiIiKSsiPiIsbis9dC5tYXJrLG4rPSI8L2Rpdj4iLG4rPSI8L2Rpdj4ifWZ1bmN0aW9uIHRfc3RvcmVfZ2V0X3Byb2R1Y3RDYXJkX3R4dEFuZFByaWNlX2h0bWwodCxlLHIsbyl7dmFyIG49IiIsaTtyZXR1cm4gbis9JzxkaXYgY2xhc3M9InQtc3RvcmVfX2NhcmRfX3RleHR3cmFwcGVyIiAnKygiIj09PW8/J3N0eWxlPSJwYWRkaW5nLXRvcDowcHg7Iic6IiIpKyI+IixuKz10X3N0b3JlX2dldF9wcm9kdWN0Q2FyZF90eHRfaHRtbCh0LGUsciksbis9IjwvZGl2PiJ9ZnVuY3Rpb24gdF9zdG9yZV9nZXRfcHJvZHVjdENhcmRfdHh0X2h0bWwodCxlLHIpe3ZhciBvPSIiLG47aWYoImF0Ij09PXIucHJpY2UucG9zaXRpb24mJihvKz10X3N0b3JlX2dldF9wcm9kdWN0Q2FyZF9QcmljZV9odG1sKHQsZSxyKSksdC50aXRsZSl7bj00PT09cGFyc2VJbnQoci5ibG9ja3NJblJvdywxMCk/InQtbmFtZV94cyI6Mj09PXBhcnNlSW50KHIuYmxvY2tzSW5Sb3csMTApPyJ0LW5hbWVfeGwiOiJ0LW5hbWVfbWQiO3ZhciBpPTE9PT10LmVkaXRpb25zLmxlbmd0aCYmZS51aWQ/J2ZpZWxkPSJzdF90aXRsZV9fJytlLnVpZCsnIiBkYXRhLXJlZGFjdG9yLXRvb2xiYXI9Im5vIic6IiI7bys9JzxkaXYgY2xhc3M9ImpzLXN0b3JlLXByb2QtbmFtZSBqcy1wcm9kdWN0LW5hbWUgdC1zdG9yZV9fY2FyZF9fdGl0bGUgdC10eXBvZ3JhcGh5X190aXRsZSB0LW5hbWUgJytuKyciJysoIXIudGl0bGVfdHlwbyYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIudHlwbywidGl0bGUiKT8nc3R5bGU9Iicrci50eXBvLnRpdGxlKyciJzoiIikraSsiPiIsbys9dC50aXRsZSxvKz0iPC9kaXY+In1pZigiYnQiPT09ci5wcmljZS5wb3NpdGlvbiYmKG8rPXRfc3RvcmVfZ2V0X3Byb2R1Y3RDYXJkX1ByaWNlX2h0bWwodCxlLHIpKSxlLnNrdSl7dmFyIHMsYSxjPSdzdHlsZT0iJysoci5wcm9kQ2FyZC5zaG93T3B0cz8iIjoiZGlzcGxheTpub25lOyIpKyhyLnR5cG8uZGVzY3JDb2xvcj8iY29sb3I6IityLnR5cG8uZGVzY3JDb2xvcisiOyI6IiIpKyciJyxsPTE9PT10LmVkaXRpb25zLmxlbmd0aCYmZS51aWQ/J2ZpZWxkPSJzdF9za3VfXycrZS51aWQrJyIgZGF0YS1yZWRhY3Rvci10b29sYmFyPSJubyInOiIiO28rPSc8ZGl2IGNsYXNzPSJ0LXN0b3JlX19jYXJkX19za3UgdC1kZXNjciB0LWRlc2NyX3h4cyIgJytjKyI+IixvKz13aW5kb3cudFN0b3JlRGljdC5za3UrIjogIixvKz0nPHNwYW4gY2xhc3M9ImpzLXN0b3JlLXByb2Qtc2t1IGpzLXByb2R1Y3Qtc2t1IiB0cmFuc2xhdGU9Im5vIiAnK2wrIj4iLG8rPWUuc2t1LG8rPSI8L3NwYW4+IixvKz0iPC9kaXY+In1pZih0LmRlc2NyKXt2YXIgZD0xPT09dC5lZGl0aW9ucy5sZW5ndGgmJmUudWlkPydmaWVsZD0ic3RfZGVzY3JfXycrZS51aWQrJyIgZGF0YS1yZWRhY3Rvci10b29sYmFyPSJ5ZXMiJzoiIjtvKz0nPGRpdiBjbGFzcz0ianMtc3RvcmUtcHJvZC1kZXNjciB0LXN0b3JlX19jYXJkX19kZXNjciB0LXR5cG9ncmFwaHlfX2Rlc2NyIHQtZGVzY3IgdC1kZXNjcl94eHMiICcrKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyLnR5cG8sImRlc2NyIik/J3N0eWxlPSInK3IudHlwby5kZXNjcisnIic6IiIpK2QrIj4iLG8rPXQuZGVzY3Isbys9IjwvZGl2PiJ9cmV0dXJuIHIucHJpY2UucG9zaXRpb258fChvKz10X3N0b3JlX2dldF9wcm9kdWN0Q2FyZF9QcmljZV9odG1sKHQsZSxyKSksb31mdW5jdGlvbiB0X3N0b3JlX2dldF9wcm9kdWN0Q2FyZF9QcmljZV9odG1sKHQsZSxyKXt2YXIgbz0iIixuPSIiLGk9dF9zdG9yZV9fZ2V0Rm9ybWF0dGVkUHJpY2VSYW5nZShyLHQpLHM7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyLnByaWNlLCJwb3NpdGlvbiIpJiYoImF0Ij09PXIucHJpY2UucG9zaXRpb24/bj0iIHQtc3RvcmVfX2NhcmRfX3ByaWNlLXdyYXBwZXJfYWJvdmUtdGl0bGUiOiJidCI9PT1yLnByaWNlLnBvc2l0aW9uJiYobj0iIHQtc3RvcmVfX2NhcmRfX3ByaWNlLXdyYXBwZXJfYmVsb3ctdGl0bGUiKSksbys9JzxkaXYgY2xhc3M9ImpzLXN0b3JlLXByaWNlLXdyYXBwZXIgdC1zdG9yZV9fY2FyZF9fcHJpY2Utd3JhcHBlcicrbisnIicsZS5wcmljZSYmISErZS5wcmljZS5yZXBsYWNlKC9ccy9nLCIiKXx8KG8rPScgc3R5bGU9InZpc2liaWxpdHk6IGhpZGRlbjsiJyksbys9IiA+IixvKz10X3N0b3JlX2dldF9wcm9kdWN0Q2FyZF9vbmVQcmljZV9odG1sKHQsZSxyLCJjdXJyZW50IiksaXx8KG8rPXRfc3RvcmVfZ2V0X3Byb2R1Y3RDYXJkX29uZVByaWNlX2h0bWwodCxlLHIsIm9sZCIpKSxvKz0iPC9kaXY+In1mdW5jdGlvbiB0X3N0b3JlX2dldF9wcm9kdWN0Q2FyZF9vbmVQcmljZV9odG1sKHQsZSxyLG8pe3ZhciBuPSJjdXJyZW50Ij09PW8/ZS5wcmljZTplLnByaWNlb2xkLGk9dF9zdG9yZV9fZ2V0Rm9ybWF0dGVkUHJpY2UocixuKSxzPXIucHJpY2UucHJpY2VSYW5nZSxhPXRfc3RvcmVfX2dldEZvcm1hdHRlZFByaWNlUmFuZ2Uocix0KTthJiYicmFuZ2UiPT09cyYmKGk9YSk7dmFyIGM9ImN1cnJlbnQiPT09bz8icHJpY2UiOiJwcmljZW9sZCIsbD0iIixkPSJjdXJyZW50Ij09PW8/InQtc3RvcmVfX2NhcmRfX3ByaWNlIjoidC1zdG9yZV9fY2FyZF9fcHJpY2Vfb2xkIixwLHU9IiIsXztpZih1Kz1uJiYrbi5yZXBsYWNlKC9ccy9nLCIiKT8iIjoiZGlzcGxheTogbm9uZTsiLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyLnByaWNlLCJmb250V2VpZ2h0IikmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyLnByaWNlLCJmb250U2l6ZSIpKXt2YXIgZj0iY3VycmVudCI9PT1vP3IucHJpY2UuY29sb3I6ci5wcmljZS5jb2xvck9sZDt1Kz1mPyJjb2xvcjoiK2YrIjsiOiIiLHUrPXIucHJpY2UuZm9udFNpemU/ImZvbnQtc2l6ZToiK3IucHJpY2UuZm9udFNpemUrIjsiOiIiLHUrPXIucHJpY2UuZm9udFdlaWdodD8iZm9udC13ZWlnaHQ6IityLnByaWNlLmZvbnRXZWlnaHQrIjsiOiIifXA9IiIhPT11PydzdHlsZSA9ICInK3UrJyInOiIiO3ZhciB5PTE9PT10LmVkaXRpb25zLmxlbmd0aCYmZS51aWQ/J2ZpZWxkPSJzdF8nK2MrIl9fIitlLnVpZCsnIiBkYXRhLXJlZGFjdG9yLXRvb2xiYXI9Im5vIic6IiIsdj1yLmN1cnJlbmN5VHh0Pyc8ZGl2IGNsYXNzPSJ0LXN0b3JlX19jYXJkX19wcmljZS1jdXJyZW5jeSIgdHJhbnNsYXRlPSJubyI+JytyLmN1cnJlbmN5VHh0KyI8L2Rpdj4iOiIiLGc9ImN1cnJlbnQiPT09bz8ianMtcHJvZHVjdC1wcmljZSBqcy1zdG9yZS1wcm9kLXByaWNlLXZhbCI6ImpzLXN0b3JlLXByb2QtcHJpY2Utb2xkLXZhbCIsbTtpZihhJiYoZys9IiBqcy1zdG9yZS1wcm9kLXByaWNlLXJhbmdlLXZhbCIpLGwrPSc8ZGl2IGNsYXNzPSInK2QrIiB0LXN0b3JlX19jYXJkX19wcmljZS1pdGVtIHQtbmFtZSB0LW5hbWVfIisoIjEwMjUiPT09ci5wcm9kQ2FyZC5ibG9ja0lkPyJtZCI6InhzIikrJyIgJytwKyI+IixhJiYiZnJvbSI9PT1zKXtsKz0nPGRpdiBjbGFzcz0idC1zdG9yZV9fY2FyZF9fcHJpY2UtZnJvbSB0LXN0b3JlX19jYXJkX19wcmljZS12YWx1ZSIgdHJhbnNsYXRlPSJubyIgJyt5KyI+Iit3aW5kb3cudFN0b3JlRGljdC5mcm9tKyI8L2Rpdj4iO3ZhciBoPXRfc3RvcmVfX2dldEZvcm1hdHRlZE1pblByaWNlKHIsdCk7bnVsbCE9PWgmJihpPWgpfXJldHVybiBsKz0iciIhPT1yLmN1cnJlbmN5U2lkZSYmdj92OiIiLGwrPSc8ZGl2IGNsYXNzPSInK2crJyB0LXN0b3JlX19jYXJkX19wcmljZS12YWx1ZSIgdHJhbnNsYXRlPSJubyIgJyt5KyI+IitpKyI8L2Rpdj4iLGwrPSJyIj09PXIuY3VycmVuY3lTaWRlJiZ2P3Y6IiIsdC51bml0JiZ0LnBvcnRpb24+MCYmKGwrPSc8ZGl2IGNsYXNzPSJ0LXN0b3JlX19wcm9kX19wcmljZS1wb3J0aW9uIj48c3BhbiBjbGFzcz0idC1zdG9yZV9fcHJvZF9fcHJpY2UtcG9ydGlvbi1zbGFzaCI+Lzwvc3Bhbj4nLCIxIiE9PXQucG9ydGlvbiYmKGwrPSt0LnBvcnRpb24rIiAiKSxsKz13aW5kb3cudFN0b3JlRGljdFt0LnVuaXRdKyI8L2Rpdj4iKSxsKz0iPC9kaXY+In1mdW5jdGlvbiB0X3N0b3JlX2dldF9wcm9kdWN0Q2FyZF9idG5faHRtbCh0LGUscixvKXt2YXIgbj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnV0dG9uX2NhcmRmaXJzdF8iK2UucmVjaWQpLGk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1dHRvbl9jYXJkc2Vjb25kXyIrZS5yZWNpZCk7aWYoIShuJiZuLmNvbnRlbnR8fGkmJmkuY29udGVudCkpcmV0dXJuIHRfc3RvcmVfZ2V0X3Byb2R1Y3RDYXJkX2J0bl9odG1sX2xlZ2FjeSh0LGUscixvKTt2YXIgcz0iMTAyNSI9PT1lLnByb2RDYXJkLmJsb2NrSWQsYT0iIjtpZihuJiZuLmNvbnRlbnQpe3ZhciBjPXRfc3RvcmVfZ2V0X3Byb2R1Y3RDYXJkX2xpbmsoZS5wcm9kQ2FyZC5idG5MaW5rMSx0LHIsbyksbD10X3N0b3JlX2dldF9wcm9kdWN0Q2FyZF90YXJnZXRBdHRyKGUucHJvZENhcmQuYnRuTGluazEsdCksZD1uLmNvbnRlbnQuY2xvbmVOb2RlKCEwKS5maXJzdEVsZW1lbnRDaGlsZDtkLnNldEF0dHJpYnV0ZSgiaHJlZiIsYy5yZXBsYWNlQWxsKCImYW1wOyIsIiYiKSksbCYmZC5zZXRBdHRyaWJ1dGUoInRhcmdldCIsIl9ibGFuayIpLGE9cz8nXG5cdFx0XHRcdDxkaXYgY2xhc3M9InQtc3RvcmVfX2NhcmRfX2J0bi1yb3cgdC1zdG9yZV9fY2FyZF9fYnRuLWZpcnN0X3dyYXBwZXIiPlxuXHRcdFx0XHRcdCcrZC5vdXRlckhUTUwrIlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdCI6ZC5vdXRlckhUTUx9dmFyIHA9IiI7aWYoaSYmaS5jb250ZW50KXt2YXIgdT10X3N0b3JlX2dldF9wcm9kdWN0Q2FyZF9saW5rKGUucHJvZENhcmQuYnRuTGluazIsdCxyLG8pLF89dF9zdG9yZV9nZXRfcHJvZHVjdENhcmRfdGFyZ2V0QXR0cihlLnByb2RDYXJkLmJ0bkxpbmsyLHQpLGY9aS5jb250ZW50LmNsb25lTm9kZSghMCkuZmlyc3RFbGVtZW50Q2hpbGQ7Zi5zZXRBdHRyaWJ1dGUoImhyZWYiLHUucmVwbGFjZUFsbCgiJmFtcDsiLCImIikpLF8mJmYuc2V0QXR0cmlidXRlKCJ0YXJnZXQiLCJfYmxhbmsiKSxwPXM/J1xuXHRcdFx0XHQ8ZGl2IGNsYXNzPSJ0LXN0b3JlX19jYXJkX19idG4tcm93IHQtc3RvcmVfX2NhcmRfX2J0bi1zZWNvbmRfd3JhcHBlciI+XG5cdFx0XHRcdFx0JytmLm91dGVySFRNTCsiXG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0IjpmLm91dGVySFRNTH1yZXR1cm4nXG5cdFx0PGRpdiBjbGFzcz0idC1zdG9yZV9fY2FyZF9fYnRucy13cmFwcGVyIGpzLXN0b3JlLWJ1dHRvbnMtd3JhcHBlciI+XG5cdFx0XHQnK2ErcCsiXG5cdFx0PC9kaXY+XG5cdCJ9ZnVuY3Rpb24gdF9zdG9yZV9nZXRfcHJvZHVjdENhcmRfYnRuX2h0bWxfbGVnYWN5KHQsZSxyLG8pe2lmKCFlLnByb2RDYXJkLmJ0blRpdGxlMSYmIWUucHJvZENhcmQuYnRuVGl0bGUyKXJldHVybiIiO3ZhciBuPSIxMDI1Ij09PWUucHJvZENhcmQuYmxvY2tJZCxpPSIiLHMsYSxjPSJzbSI9PT1lLmJ0blNpemU/InQtYnRuX3hzIjoidC1idG5fc20iO3JldHVybiBpKz0nPGRpdiBjbGFzcz0idC1zdG9yZV9fY2FyZF9fYnRucy13cmFwcGVyIGpzLXN0b3JlLWJ1dHRvbnMtd3JhcHBlciI+JyxlLnByb2RDYXJkLmJ0blRpdGxlMSYmKG4mJihpKz0nPGRpdiBjbGFzcz0idC1zdG9yZV9fY2FyZF9fYnRuLXJvdyB0LXN0b3JlX19jYXJkX19idG4tZmlyc3Rfd3JhcHBlciI+JyksaSs9JzxhIGhyZWY9IicrKHM9dF9zdG9yZV9nZXRfcHJvZHVjdENhcmRfbGluayhlLnByb2RDYXJkLmJ0bkxpbmsxLHQscixvKSkrJyIgJysoYT10X3N0b3JlX2dldF9wcm9kdWN0Q2FyZF90YXJnZXRBdHRyKGUucHJvZENhcmQuYnRuTGluazEsdCkpKycgY2xhc3M9ImpzLXN0b3JlLXByb2QtYnRuIHQtc3RvcmVfX2NhcmRfX2J0biB0LWJ0biAnK2MrJyInKyhlLmJ1dHRvbl9zdHlsZXM/IiI6JyBzdHlsZT0iJytlLmJ0bjFfc3R5bGUrJyInKSsnPjxzcGFuIGNsYXNzPSJ0LXN0b3JlX19jYXJkX19idG4tdGV4dCB0LWJ0bmZsZXhfX3RleHQiPicrZS5wcm9kQ2FyZC5idG5UaXRsZTErIjwvc3Bhbj48L2E+IixuJiYoaSs9IjwvZGl2PiIpKSxlLnByb2RDYXJkLmJ0blRpdGxlMiYmKG4mJihpKz0nPGRpdiBjbGFzcz0idC1zdG9yZV9fY2FyZF9fYnRuLXJvdyB0LXN0b3JlX19jYXJkX19idG4tc2Vjb25kX3dyYXBwZXIiPicpLGkrPSc8YSBocmVmPSInKyhzPXRfc3RvcmVfZ2V0X3Byb2R1Y3RDYXJkX2xpbmsoZS5wcm9kQ2FyZC5idG5MaW5rMix0LHIsbykpKyciICcrKGE9dF9zdG9yZV9nZXRfcHJvZHVjdENhcmRfdGFyZ2V0QXR0cihlLnByb2RDYXJkLmJ0bkxpbmsyLHQpKSsnIGNsYXNzPSJqcy1zdG9yZS1wcm9kLWJ0bjIgdC1zdG9yZV9fY2FyZF9fYnRuIHQtc3RvcmVfX2NhcmRfX2J0bl9zZWNvbmQgdC1idG4gJytjKyciJysoZS5idXR0b24yX3N0eWxlcz8iIjonIHN0eWxlPSInK2UuYnRuMl9zdHlsZSsnIicpKyciPjxzcGFuIGNsYXNzPSJ0LXN0b3JlX19jYXJkX19idG4tdGV4dCB0LWJ0bmZsZXhfX3RleHQiPicrZS5wcm9kQ2FyZC5idG5UaXRsZTIrIjwvc3Bhbj48L2E+IixuJiYoaSs9IjwvZGl2PiIpKSxpKz0iPC9kaXY+In1mdW5jdGlvbiB0X3N0b3JlX2dldF9wcm9kdWN0Q2FyZF9saW5rKHQsZSxyLG8pe3ZhciBuO2lmKG9bMF0mJihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpIT09ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX3Byb2R1Y3Qtc25pcHBldCIpJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLmNvbnRhaW5zKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19wcm9kdWN0LXNuaXBwZXQiKSkmJiJwb3B1cCI9PT10KSlyZXR1cm4gdF9zdG9yZV9nZW5lcmF0ZVVybChlKTtpZigib3JkZXIiPT09dClyZXR1cm4iI29yZGVyIjtpZihyKXJldHVybiBlLmJ1dHRvbmxpbms/ZS5idXR0b25saW5rOiIjcHJvZHBvcHVwIjtpZigicG9wdXAiPT09dCl7aWYoZS5idXR0b25saW5rKXt2YXIgaT1lLmJ1dHRvbmxpbms7cmV0dXJuLTE9PT1pLmluZGV4T2YoIi8vIikmJiIvIiE9PWkuc2xpY2UoMCwxKSYmIiMiIT09aS5zbGljZSgwLDEpJiYoaT0iaHR0cDovLyIraSksaX1yZXR1cm4iI3Byb2Rwb3B1cCJ9cmV0dXJuIiNwcm9kcG9wdXAifWZ1bmN0aW9uIHRfc3RvcmVfZ2V0X3Byb2R1Y3RDYXJkX3RhcmdldEF0dHIodCxlKXtyZXR1cm4icG9wdXAiPT09dCYmZS5idXR0b25saW5rJiYiX2JsYW5rIj09PWUuYnV0dG9udGFyZ2V0Pyd0YXJnZXQ9Il9ibGFuayInOiIifWZ1bmN0aW9uIHRfc3RvcmVfZ2V0X2hvcml6U2VwYXJhdG9yX2h0bWwodCl7dmFyIGU9JzxkaXYgY2xhc3M9InQtY2xlYXIgdC1zdG9yZV9fZ3JpZC1zZXBhcmF0b3IiIFtbc3R5bGVdXT48L2Rpdj4nO3JldHVybiBlPWUucmVwbGFjZSgiW1tzdHlsZV1dIix0LnZpbmRlbnQ/J3N0eWxlPSJtYXJnaW4tYm90dG9tOicrdC52aW5kZW50Kyc7Iic6IiIpfWZ1bmN0aW9uIHRfc3RvcmVfdW5pZnlDYXJkc0hlaWdodHNfZ2V0QmxvY2tzSW5Sb3codCxlKXtyZXR1cm4gd2luZG93LmlubmVyV2lkdGg8PTk2MCYmdC5pc0hvcml6T25Nb2I/ZS5sZW5ndGg6d2luZG93LmlubmVyV2lkdGg8PTk2MD8yOnBhcnNlSW50KHQuYmxvY2tzSW5Sb3csMTApfWZ1bmN0aW9uIHRfc3RvcmVfdW5pZnlDYXJkc1dpZHRoKHQpe3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK3QpO2lmKGUpe3ZhciByPWUucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX2dyaWQtY29udF9pdGVtd3JhcHBlciIpO2lmKHIpe3ZhciBvPXIucXVlcnlTZWxlY3RvckFsbCgiLmpzLXByb2R1Y3QiKTtpZighb3x8IW8ubGVuZ3RofHwhb1swXS5jbGFzc0xpc3QuY29udGFpbnMoInQtc3RvcmVfX2NhcmRfZml4ZWQtd2lkdGgiKSYmIW9bMF0uY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXN0b3JlX19jYXJkX3VuZGVyLWRlc2NyaXB0aW9uIikpe3ZhciBuPTAsaT0wLHM9MDtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG8sKGZ1bmN0aW9uKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX2NhcmRfX3ByaWNlLWJ1dHRvbnMiKTtpZihlKWlmKGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXN0b3JlX19jYXJkX19wcmljZS1idXR0b25zX2luLXJvdyIpKXt2YXIgcj1lLnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19jYXJkX19wcmljZS13cmFwcGVyIiksbz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19jYXJkX19idG5zLXdyYXBwZXIiKTtyJiYoci5zdHlsZS53aWR0aD1udWxsKSxvJiYoby5zdHlsZS53aWR0aD1udWxsKSxlLnN0eWxlLndpZHRoPW51bGx9ZWxzZSBlLnN0eWxlLndpZHRoPW51bGx9KSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChvLChmdW5jdGlvbih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19jYXJkX19wcmljZS1idXR0b25zIik7aWYoZSlpZihlLmNsYXNzTGlzdC5jb250YWlucygidC1zdG9yZV9fY2FyZF9fcHJpY2UtYnV0dG9uc19pbi1yb3ciKSl7dmFyIHI9ZS5xdWVyeVNlbGVjdG9yKCIudC1zdG9yZV9fY2FyZF9fcHJpY2Utd3JhcHBlciIpLG89ZS5xdWVyeVNlbGVjdG9yKCIudC1zdG9yZV9fY2FyZF9fYnRucy13cmFwcGVyIik7aWYocil7dmFyIGE9d2luZG93LmdldENvbXB1dGVkU3R5bGUociksYz1NYXRoLmNlaWwocGFyc2VGbG9hdChhLndpZHRoKSkrTWF0aC5jZWlsKHBhcnNlRmxvYXQoYS5tYXJnaW5SaWdodCkpO2M+aSYmKGk9Yyl9aWYobyl7dmFyIGw9TWF0aC5jZWlsKHBhcnNlRmxvYXQod2luZG93LmdldENvbXB1dGVkU3R5bGUobykud2lkdGgpKTtsPnMmJihzPWwpfX1lbHNle3ZhciBkPU1hdGguY2VpbChwYXJzZUZsb2F0KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLndpZHRoKSk7ZD5uJiYobj1kKX19KSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChvLChmdW5jdGlvbih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19jYXJkX19wcmljZS1idXR0b25zIik7aWYoZSlpZihlLmNsYXNzTGlzdC5jb250YWlucygidC1zdG9yZV9fY2FyZF9fcHJpY2UtYnV0dG9uc19pbi1yb3ciKSl7dmFyIHI9ZS5xdWVyeVNlbGVjdG9yKCIudC1zdG9yZV9fY2FyZF9fcHJpY2Utd3JhcHBlciIpLG89ZS5xdWVyeVNlbGVjdG9yKCIudC1zdG9yZV9fY2FyZF9fYnRucy13cmFwcGVyIik7ciYmKHIuc3R5bGUud2lkdGg9aSsicHgiKSxvJiYoby5zdHlsZS53aWR0aD1zKyJweCIpLGUuc3R5bGUud2lkdGg9aStzKyJweCJ9ZWxzZSBlLnN0eWxlLndpZHRoPW4rInB4In0pKX19fX1mdW5jdGlvbiB0X3N0b3JlX2luaXRQb3B1cCh0LGUscixvLG4pe298fCh3aW5kb3cudXJsQmVmb3JlUG9wdXBPcGVuPXdpbmRvdy5sb2NhdGlvbi5ocmVmLHdpbmRvdy50aXRsZUJlZm9yZVBvcHVwT3Blbj1kb2N1bWVudC50aXRsZSk7dmFyIGk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSE9PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19wcm9kdWN0LXNuaXBwZXQiKSYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKS5jb250YWlucyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1zdG9yZV9fcHJvZHVjdC1zbmlwcGV0IikpLHM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrdCk7Zm9yKHZhciBhIGluIGUpe3ZhciBjPW8/cy5xdWVyeVNlbGVjdG9yKCcuanMtcHJvZHVjdC1yZWxldmFudFtkYXRhLXByb2R1Y3QtZ2VuLXVpZD0iJythKyciXScpOnMucXVlcnlTZWxlY3RvcignW2RhdGEtcHJvZHVjdC1nZW4tdWlkPSInK2ErJyJdJyksbD1jLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tocmVmXj0iI3Byb2Rwb3B1cCJdJyk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChsLChmdW5jdGlvbihzKXt2YXIgYT1jLmNsb3Nlc3QoIi5qcy1wcm9kdWN0IiksbD1hLmdldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LWdlbi11aWQiKSxkPWVbbF07ZCYmcy5zZXRBdHRyaWJ1dGUoImhyZWYiLGQudXJsKTt2YXIgcD1mdW5jdGlvbiBpKHMpe2lmKHMucHJldmVudERlZmF1bHQoKSwhcy50YXJnZXQuY2xvc2VzdCgiLnQxMDAyX19hZGRCdG4iKSl7YT10aGlzLmNsb3Nlc3QoIi5qcy1wcm9kdWN0IiksbD1hLmdldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LWdlbi11aWQiKSxkPWVbbF07dmFyIGM9cy5jdHJsS2V5LHA9cy5tZXRhS2V5JiYtMSE9PW5hdmlnYXRvci5wbGF0Zm9ybS5pbmRleE9mKCJNYWMiKTtjfHxwP3dpbmRvdy5vcGVuKGQudXJsKToobi5oZWFkZXJ8fG4uZm9vdGVyKSYmbi5kaXNhYmxlcG9wdXA/bG9jYXRpb24uaHJlZj1kLnVybDp0X3N0b3JlX29wZW5Qcm9kdWN0UG9wdXAodCxyLGQsbywhMSwhIW8pfX07aXx8cy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIscCl9KSl9ci5pc1B1Ymxpc2hlZFBhZ2UmJnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dF9zdG9yZV9jaGVja1VybChyLHQpfSksMzAwKSx0X3N0b3JlX2NvcHlUeXBvZ3JhcGh5RnJvbUxlYWRUb1BvcHVwKHQscil9ZnVuY3Rpb24gdF9zdG9yZV9vcGVuUHJvZHVjdFBvcHVwKHQsZSxyLG8sbixpKXt2YXIgcz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpIT09ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX3Byb2R1Y3Qtc25pcHBldCIpJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLmNvbnRhaW5zKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19wcm9kdWN0LXNuaXBwZXQiKSk7c3x8dF9zdG9yZV9vcGVuX3BvcHVwX3JvdXRpbmdfaW5pdCh0LGUpO3ZhciBhPWUuc2hvd1JlbGV2YW50cyxjLGw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrdCkucXVlcnlTZWxlY3RvcigiLnQtcG9wdXAiKSxkLHA7aWYobCYmdF9zdG9yZV9kcmF3UHJvZFBvcHVwKHQsbCxyLGUsaSksdF9zdG9yZV9zaG93UG9wdXAodCxuLGkpLHdpbmRvdy5UaWxkYSYmKFRpbGRhLnNlbmRFY29tbWVyY2VFdmVudCYmKHdpbmRvdy50U3RvcmVEZXRhaWxFdmVudHx8KHdpbmRvdy50U3RvcmVEZXRhaWxFdmVudD17fSksd2luZG93LnRTdG9yZURldGFpbEV2ZW50W3IuaWQ/ci5pZDpyLnVpZF18fChUaWxkYS5zZW5kRWNvbW1lcmNlRXZlbnQoImRldGFpbCIsW3tpZDoiIisoci5pZD9yLmlkOnIudWlkKSx1aWQ6IiIrci51aWQscHJpY2U6IiIrKHIucHJpY2VfbWluP3IucHJpY2VfbWluOnIucHJpY2UpLHNrdTpyLnNrdT9yLnNrdToiIixuYW1lOnIudGl0bGV9XSksd2luZG93LnRTdG9yZURldGFpbEV2ZW50W3IuaWQ/ci5pZDpyLnVpZF09ITApKSxUaWxkYS5zZW5kRXZlbnRUb1N0YXRpc3RpY3MpKXt2YXIgdT1sLmdldEF0dHJpYnV0ZSgiZGF0YS10cmFjay1wb3B1cCIpO2lmKHUpe3ZhciBfPSJQb3B1cDogIityLnRpdGxlO1RpbGRhLnNlbmRFdmVudFRvU3RhdGlzdGljcyh1LF8sIiIsMCl9fWlmKGUuaXNQdWJsaXNoZWRQYWdlJiYhbiYmdF9zdG9yZV9jaGFuZ2VVcmwodCxyLG8sZSksYSYmIXMpe3ZhciBmLHk9e2NjOiJjdXJyZW50X2NhdGVnb3J5IixhbGw6ImFsbF9jYXRlZ29yaWVzIn1bYV18fCJjYXRlZ29yeV8iK2Esdj0icmFuZG9tIixnPWUucmVsZXZhbnRzX3F1YW50aXR5fHw0O3Rfc3RvcmVfbG9hZFByb2R1Y3RzKCJyZWxldmFudHMiLHQsZSwhMSx7Y3VycmVudFByb2R1Y3RVaWQ6ci51aWQscmVsZXZhbnRzUXVhbnRpdHk6ZyxyZWxldmFudHNNZXRob2Q6eSxyZWxldmFudHNTb3J0OnZ9KX0oInkiIT09d2luZG93LmxhenkmJiJ5ZXMiIT09ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbGF6eSIpfHx0X3N0b3JlX3BvcHVwX3VwZExhenlPblNjcm9sbCh0KSxwYXJzZUludChyLnF1YW50aXR5LDEwKTw9MHx8ImJvdGgiIT09ZS5zaG93U3RvcmVCdG5RdWFudGl0eSYmInBvcHVwIiE9PWUuc2hvd1N0b3JlQnRuUXVhbnRpdHkpfHx0X3N0b3JlX2FkZFByb2R1Y3RRdWFudGl0eShkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjcmVjIit0KyIgLnQtcG9wdXAgLmpzLXN0b3JlLXByb2R1Y3QiKSxyLGUpO3Rfc3RvcmVfaG92ZXJab29tX2luaXQodCksZS5pdGVtc0FuaW0mJmUucHJldmlld21vZGUmJnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dF9zdG9yZV9vbkZ1bmNMb2FkKCJ0X2FuaW1hdGVfX3NldEFuaW1hdGlvblN0YXRlQ2hhaW5zIiwoZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuciIpLGU9W107QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt0LnF1ZXJ5U2VsZWN0b3IoIi50LWFuaW1hdGVbZGF0YS1hbmltYXRlLWNoYWluPXllc10iKSYmZS5wdXNoKHQpfSkpLGUubGVuZ3RoJiZ0X2FuaW1hdGVfX3NldEFuaW1hdGlvblN0YXRlQ2hhaW5zKGUpfSkpfSksMzAwKX1mdW5jdGlvbiB0X3N0b3JlX2FkZFByb2R1Y3RRdWFudGl0eSh0LGUscil7dmFyIG89dCxuPXJ8fHt9O2lmKHdpbmRvdy5qUXVlcnkmJm8gaW5zdGFuY2VvZiBqUXVlcnkpe2lmKDA9PT1vLmxlbmd0aClyZXR1cm47bz0kKG8pLmdldCgwKX12YXIgaT1vLnF1ZXJ5U2VsZWN0b3IoJy50LXN0b3JlX19wcm9kLXBvcHVwX19idG4td3JhcHBlciBhW2hyZWY9IiNvcmRlciJdOm5vdCgudC1zdG9yZV9fcHJvZC1wb3B1cF9fYnRuX2Rpc2FibGVkKScpLHM9by5xdWVyeVNlbGVjdG9yKCcudC1zdG9yZV9fY2FyZF9fYnRucy13cmFwcGVyIGFbaHJlZj0iI29yZGVyIl06bm90KFtzdHlsZSo9ImRpc3BsYXk6IG5vbmUiXSknKSxhPXBhcnNlSW50KGUucXVhbnRpdHksMTApLGMsbDtpZihpc05hTihhKSYmZS5lZGl0aW9ucyl7dmFyIGQ9dF9zdG9yZV9wcm9kdWN0X2dldEZpcnN0QXZhaWxhYmxlRWRpdGlvbkRhdGEoZS5lZGl0aW9ucyk7YT1wYXJzZUludChkLnF1YW50aXR5LDEwKX1pZigoc3x8aSkmJjAhPT1hJiYxIT09YSYmIiIhPT1uLnNob3dTdG9yZUJ0blF1YW50aXR5JiZuLnNob3dTdG9yZUJ0blF1YW50aXR5KXtpZigibGlzdCI9PT1uLnNob3dTdG9yZUJ0blF1YW50aXR5JiZvLmNsYXNzTGlzdC5jb250YWlucygidC1zdG9yZV9fY2FyZCIpfHwicG9wdXAiPT09bi5zaG93U3RvcmVCdG5RdWFudGl0eSYmby5jbGFzc0xpc3QuY29udGFpbnMoInQtc3RvcmVfX3Byb2R1Y3Qtc25pcHBldCIpfHwicG9wdXAiPT09bi5zaG93U3RvcmVCdG5RdWFudGl0eSYmby5jbGFzc0xpc3QuY29udGFpbnMoInQtc3RvcmVfX3Byb2R1Y3QtcG9wdXAiKXx8ImJvdGgiPT09bi5zaG93U3RvcmVCdG5RdWFudGl0eSl7aWYobnx8KG49e30pLChjPW8ucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX3Byb2RfX3F1YW50aXR5IikpJiYobD1jLnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19wcm9kX19xdWFudGl0eS1pbnB1dCIpKSxjKXt2YXIgcD1sLm1pbnx8MTtsLnZhbHVlPXAsdF9zdG9yZV90cmlnZ2VyRXZlbnQobCwiY2hhbmdlIik7dmFyIHU9bC52YWx1ZTtpc05hTihhKT9jLmNsYXNzTGlzdC5yZW1vdmUoInQtc3RvcmVfX3Byb2QtcG9wdXBfX2J0bl9kaXNhYmxlZCIpOmE+MT8oYy5jbGFzc0xpc3QucmVtb3ZlKCJ0LXN0b3JlX19wcm9kLXBvcHVwX19idG5fZGlzYWJsZWQiKSwwPT09cGFyc2VJbnQodSwxMCkmJihsLnZhbHVlPXApKTpjLmNsYXNzTGlzdC5hZGQoInQtc3RvcmVfX3Byb2QtcG9wdXBfX2J0bl9kaXNhYmxlZCIpfWVsc2V7dmFyIF89IiIsZj1uLmJ0bjFfc3R5bGUseT1uLmJ1dHRvblJhZGl1cyx2PSIiO2lmKG8uY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXN0b3JlX19jYXJkIikpe3ZhciBnPXt4czoidC1zdG9yZV9fcHJvZF9fcXVhbnRpdHlfeHMiLHNtOiJ0LXN0b3JlX19wcm9kX19xdWFudGl0eV9zbSIsc21kOiJ0LXN0b3JlX19wcm9kX19xdWFudGl0eV9zbWQiLG1kOiJ0LXN0b3JlX19wcm9kX19xdWFudGl0eV9tZCIsbGc6InQtc3RvcmVfX3Byb2RfX3F1YW50aXR5X2xnIix4bDoidC1zdG9yZV9fcHJvZF9fcXVhbnRpdHlfeGwiLHh4bDoidC1zdG9yZV9fcHJvZF9fcXVhbnRpdHlfeHhsIn07dj1nW24uYnRuU2l6ZV18fGcuc219aWYoZiYmInN0cmluZyIhPXR5cGVvZiB5KXt2YXIgbT1mLmluZGV4T2YoImJvcmRlci1yYWRpdXMiKTtpZigtMSE9PW0pe3ZhciBoPWYuc2xpY2UobSkuaW5kZXhPZigiOyIpO3k9Zi5zbGljZShtKzE0LG0raCl9fXZhciBiPSIiO2lmKHkmJihiPSJib3JkZXItcmFkaXVzOiIreSsiOyIpLF8rPSc8ZGl2IGNsYXNzPSJ0LXN0b3JlX19wcm9kX19xdWFudGl0eSAnK3YrJyIgc3R5bGU9IicrYisnIj4nLF8rPSc8ZGl2IGNsYXNzPSJ0LXN0b3JlX19wcm9kX19xdWFudGl0eV9fbWludXMtd3JhcHBlciI+JyxfKz0nPHNwYW4gY2xhc3M9InQtc3RvcmVfX3Byb2RfX3F1YW50aXR5X19taW51cyI+PC9zcGFuPicsXys9IjwvZGl2PiIsXys9JzxpbnB1dCBjbGFzcz0idC1zdG9yZV9fcHJvZF9fcXVhbnRpdHktaW5wdXQgdC1kZXNjciB0LWRlc2NyX3h4cyIgdHlwZT0ibnVtYmVyIiBtaW49IjEiIG1heD0iOTk5OSIgc3RlcD0iMSIgdmFsdWU9IjEiIHNpemU9IjQiIG1heGxlbmd0aD0iNCIgLz4nLF8rPSc8ZGl2IGNsYXNzPSJ0LXN0b3JlX19wcm9kX19xdWFudGl0eV9fcGx1cy13cmFwcGVyIj4nLF8rPSc8c3BhbiBjbGFzcz0idC1zdG9yZV9fcHJvZF9fcXVhbnRpdHlfX3BsdXMiPjwvc3Bhbj4nLF8rPSI8L2Rpdj4iLF8rPSI8L2Rpdj4iLGk/aS5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWJlZ2luIixfKTpzJiZzLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlYmVnaW4iLF8pLHRfc3RvcmVfYWRkUHJvZHVjdFF1YW50aXR5RXZlbnRzKG8pLGw9KGM9by5xdWVyeVNlbGVjdG9yKCIudC1zdG9yZV9fcHJvZF9fcXVhbnRpdHkiKSkucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX3Byb2RfX3F1YW50aXR5LWlucHV0Iikscyl7dmFyIHc9cy5wYXJlbnROb2RlO2lmKHcucXVlcnlTZWxlY3RvckFsbCgnYTpub3QoW2hyZWZePSIjb3JkZXIiXSknKS5sZW5ndGg+MCYmRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcy5jYWxsKHcucGFyZW50Tm9kZSwiZGl2W2NsYXNzXSIpKXt2YXIgUz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtmb3IoUy5jbGFzc0xpc3QuYWRkKCJ0LXN0b3JlX19jYXJkX19idG5zLXdyYXBwZXItLXF1YW50aXR5Iiksdy5hcHBlbmRDaGlsZChTKTt3LmZpcnN0Q2hpbGQmJncuZmlyc3RDaGlsZCE9PVM7KVMuYXBwZW5kQ2hpbGQody5maXJzdENoaWxkKX19fWwmJihpc05hTihhKT9sLm1heD05OTk5OTphPjAmJihsLm1heD1hKSl9fWVsc2UoYz1vLnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19wcm9kX19xdWFudGl0eSIpKSYmKGMucGFyZW50Tm9kZS5jbGFzc0xpc3QucmVtb3ZlKCJ0LXN0b3JlX19jYXJkX19idG5zLXdyYXBwZXItLXF1YW50aXR5IiksdF9zdG9yZV9fcmVtb3ZlRWxlbWVudChjKSl9ZnVuY3Rpb24gdF9zdG9yZV9hZGRQcm9kdWN0UXVhbnRpdHlFdmVudHModCl7dmFyIGU9dDtpZih3aW5kb3cualF1ZXJ5JiZlIGluc3RhbmNlb2YgalF1ZXJ5KXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuO2U9ZVswXX12YXIgcj1lLnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19wcm9kX19xdWFudGl0eSIpO2lmKHIpe3ZhciBvPXIucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX3Byb2RfX3F1YW50aXR5LWlucHV0Iiksbj1mdW5jdGlvbiB0KCl7by5zdGVwRG93bigpfSxpPWUucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX3Byb2RfX3F1YW50aXR5X19taW51cy13cmFwcGVyIik7aSYmKGkucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLG4pLGkuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLG4pKTt2YXIgcz1mdW5jdGlvbiB0KCl7by5zdGVwVXAoKX0sYT1lLnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19wcm9kX19xdWFudGl0eV9fcGx1cy13cmFwcGVyIik7YSYmKGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHMpLGEuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHMpKTt2YXIgYz1mdW5jdGlvbiB0KCl7dmFyIGU9by5taW58fDEscj1vLm1heHx8OTk5OSxuPXBhcnNlSW50KG8udmFsdWV8fDEsMTApO248MXx8aXNOYU4obik/by52YWx1ZT1lOm8udmFsdWU9bj5yP3I6bn0sbD1lLnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19wcm9kX19xdWFudGl0eS1pbnB1dCIpO2wmJihsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsYyksbC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLGMpKX19ZnVuY3Rpb24gdF9zdG9yZV9yZW1vdmVQcm9kdWN0UXVhbnRpdHkodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCcudC1zdG9yZV9fcHJvZC1wb3B1cF9fYnRuLXdyYXBwZXIgYVtocmVmPSIjb3JkZXIiXTpub3QoLnQtc3RvcmVfX3Byb2QtcG9wdXBfX2J0bl9kaXNhYmxlZCknKSxyO2lmKHQucXVlcnlTZWxlY3RvcignLnQtc3RvcmVfX2NhcmRfX2J0bnMtd3JhcHBlciBhW2hyZWY9IiNvcmRlciJdOm5vdChbc3R5bGUqPSJkaXNwbGF5OiBub25lIl0pJyl8fGUpe3ZhciBvPXQucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX3Byb2RfX3F1YW50aXR5Iik7byYmKG8ucGFyZW50Tm9kZS5jbGFzc0xpc3QucmVtb3ZlKCJ0LXN0b3JlX19jYXJkX19idG5zLXdyYXBwZXItLXF1YW50aXR5IiksdF9zdG9yZV9fcmVtb3ZlRWxlbWVudChvKSl9fWZ1bmN0aW9uIHRfc3RvcmVfb3Blbl9wb3B1cF9yb3V0aW5nX2luaXQodCxlKXt3aW5kb3cub25wb3BzdGF0ZT1mdW5jdGlvbigpe2lmKHdpbmRvdy5oaXN0b3J5LnN0YXRlKWlmKHdpbmRvdy5oaXN0b3J5LnN0YXRlLnByb2R1Y3REYXRhKXt2YXIgcj13aW5kb3cuaGlzdG9yeS5zdGF0ZS5wcm9kdWN0RGF0YSxvLG4saSxzO3Rfc3RvcmVfb3BlblByb2R1Y3RQb3B1cChyLnJlY2lkLHIub3B0cyxyLnByb2R1Y3RPYmosci5pc1JlbGV2YW50c1Nob3csITApfWVsc2UgdF9zdG9yZV9jbG9zZVBvcHVwKCEwLHQsZSk7ZWxzZSB0X3N0b3JlX2Nsb3NlUG9wdXAoITAsdCxlKX19ZnVuY3Rpb24gdF9zdG9yZV9wb3B1cF91cGRMYXp5T25TY3JvbGwodCl7dmFyIGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3JlYyIrdCsiIC50LXBvcHVwIikscj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tb2RlIik7ZSYmImVkaXQiIT09ciYmInByZXZpZXciIT09ciYmdF9vbkZ1bmNMb2FkKCJ0X3Rocm90dGxlIiwoZnVuY3Rpb24oKXtlLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXt0X3N0b3JlX29uRnVuY0xvYWQoInRfbGF6eWxvYWRfdXBkYXRlIiwoZnVuY3Rpb24oKXt0X2xhenlsb2FkX3VwZGF0ZSgpfSkpfSkpKX0pKX1mdW5jdGlvbiB0X3N0b3JlX2NoYW5nZVVybCh0LGUscixvKXt2YXIgbj0vaVBob25lfGlQYWR8aVBvZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksaT0vXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHM9d2luZG93LmxvY2F0aW9uLmhyZWYsYT17cHJvZHVjdE9iajplLG9wdHM6byxpc1JlbGV2YW50c1Nob3c6cixyZWNpZDp0fSxjLGw9ZG9jdW1lbnQudGl0bGUrIiDigJMgIitlLnRpdGxlO3MuaW5kZXhPZigiL3Rwcm9kdWN0LyIpPDAmJnMuaW5kZXhPZigiJTJGdHByb2R1Y3QlMkYiKTwwPyh0X3N0b3JlX2hpc3RvcnlfcHVzaFN0YXRlKHtwcm9kdWN0RGF0YTphfSxsLGM9dF9zdG9yZV9nZW5lcmF0ZVVybChlKSksbiYmaSYmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2hlYWQgbGlua1tyZWw9ImNhbm9uaWNhbCJdJykuc2V0QXR0cmlidXRlKCJocmVmIixjKSxkb2N1bWVudC50aXRsZT1sKSk6ciYmdF9zdG9yZV9oaXN0b3J5X3B1c2hTdGF0ZSh7cHJvZHVjdERhdGE6YX0sbCxjPXRfc3RvcmVfZ2VuZXJhdGVVcmwoZSkpfWZ1bmN0aW9uIHRfc3RvcmVfZ2VuZXJhdGVVcmwodCl7dmFyIGU9d2luZG93LmxvY2F0aW9uLnByb3RvY29sLHI9d2luZG93LmxvY2F0aW9uLmhvc3QsbztyZXR1cm4obz0obz10LnVybC5zcGxpdCgiOi8vIilbMV0pLnNwbGl0KCIvIikpLnNoaWZ0KCksZSsiLy8iK3IrIi8iKyhvPW8uam9pbigiLyIpKX1mdW5jdGlvbiB0X3N0b3JlX2RyYXdQcm9kUG9wdXAodCxlLHIsbyxuKXtlLnNjcm9sbFRvcD0wO3ZhciBpPWUucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLXByb2R1Y3QuanMtcHJvZHVjdCIpO2kuc2V0QXR0cmlidXRlKCJkYXRhLWNhcmQtc2l6ZSIsImxhcmdlIiksdF9zdG9yZV9kcmF3UHJvZFBvcHVwX2RyYXdHYWxsZXJ5KHQsZSxyLG8pLHdpbmRvdy50U3RvcmVEZWZQYWNrT2JqfHwod2luZG93LnRTdG9yZURlZlBhY2tPYmo9e30pO3ZhciBzPWUucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLXByb2R1Y3QiKTtzLnNldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LWxpZCIsci51aWQpLHMuc2V0QXR0cmlidXRlKCJkYXRhLXByb2R1Y3QtdWlkIixyLnVpZCkscy5zZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC1nZW4tdWlkIixyLnVpZCk7dmFyIGE9ZS5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtcHJvZC1uYW1lIik7ci50aXRsZT8oYS5pbm5lckhUTUw9ci50aXRsZSxhLnN0eWxlLmRpc3BsYXk9IiIpOihhLmlubmVySFRNTD0iIixhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKTt2YXIgYz1bXTt0cnl7Yz1KU09OLnBhcnNlKHIucGFydHVpZHMpfWNhdGNoKGYpe2NvbnNvbGUuZXJyb3IoZil9aWYocy5zZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC1wYXJ0LXVpZCIsYy5qb2luKCIsIikpLG8ubGlua3NTaXplQ2hhcnQmJmMubGVuZ3RoPjApe2Zvcih2YXIgbD0iIixkPVtdLHA9MDtwPGMubGVuZ3RoO3ArKyl7dmFyIHU9Y1twXTtvLmxpbmtzU2l6ZUNoYXJ0W3VdJiZvLmxpbmtzU2l6ZUNoYXJ0W3VdLmluZm90ZXh0JiZvLmxpbmtzU2l6ZUNoYXJ0W3VdLmluZm91cmwmJi0xPT09ZC5pbmRleE9mKG8ubGlua3NTaXplQ2hhcnRbdV0uaW5mb3VybCkmJihsKz0nPGRpdiBjbGFzcz0idC1zdG9yZV9fcHJvZC1wb3B1cF9fbGluayB0LWRlc2NyIHQtZGVzY3JfeHhzIj4nLGwrPSc8YSBocmVmPSInK28ubGlua3NTaXplQ2hhcnRbdV0uaW5mb3VybC5yZXBsYWNlKC8iL2csIiZxdW90OyIpKyciIHRhcmdldD0iX2JsYW5rIj4nLGwrPW8ubGlua3NTaXplQ2hhcnRbdV0uaW5mb3RleHQsbCs9IjwvYT4iLGwrPSI8L2Rpdj4iLGQucHVzaChvLmxpbmtzU2l6ZUNoYXJ0W3VdLmluZm91cmwpKX1lLnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19wcm9kLXBvcHVwX19saW5rcy13cmFwcGVyIikuaW5uZXJIVE1MPWx9ZWxzZSBlLnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19wcm9kLXBvcHVwX19saW5rcy13cmFwcGVyIikuaW5uZXJIVE1MPSIiO3Rfc3RvcmVfaW5pdFRleHRBbmRDaGFyYWN0ZXJpc3RpY3MoZSxyKTt2YXIgXz1mdW5jdGlvbiBzKCl7dF9zdG9yZV9hZGRQcm9kdWN0T3B0aW9ucyh0LHIsaSxvKSx0X3N0b3JlX29wdGlvbl9oYW5kbGVPbkNoYW5nZShpKSx0X3N0b3JlX29wdGlvbl9oYW5kbGVPbkNoYW5nZV9jdXN0b20odCxpLG8pLHRfc3RvcmVfb25GdW5jTG9hZCgidF9wcm9kX19pbml0UHJvZHVjdCIsKGZ1bmN0aW9uKCl7dF9wcm9kX19pbml0UHJvZHVjdChpLG8pfSkpLHRfc3RvcmVfbm90aWZ5QnV0dG9uX2FwcGx5RWZmZWN0cyhlKSx3aW5kb3cudF9zdG9yZV9wcm9kUG9wdXBfdXBkYXRlR2FsbGVyeVRodW1ic0V2ZW50PWZ1bmN0aW9uKCl7dF9zdG9yZV9wcm9kUG9wdXBfdXBkYXRlR2FsbGVyeVRodW1icyh0LGUscixvKX0sbiYmd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsd2luZG93LnRfc3RvcmVfcHJvZFBvcHVwX3VwZGF0ZUdhbGxlcnlUaHVtYnNFdmVudCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsd2luZG93LnRfc3RvcmVfcHJvZFBvcHVwX3VwZGF0ZUdhbGxlcnlUaHVtYnNFdmVudCl9O18oKSxvLnRhYnMmJnRfc3RvcmVfb25GdW5jTG9hZCgidF9zdG9yZV90YWJzX2luaXQiLChmdW5jdGlvbigpe3Rfc3RvcmVfdGFic19pbml0KHQsbyxyLGksZSxfKX0pKX1mdW5jdGlvbiB0X3N0b3JlX25vdGlmeUJ1dHRvbl9hcHBseUVmZmVjdHModCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudF9jYXRhbG9nX19wcm9kLXBvcHVwX19idG4tcmVwbGFjZWQiKTtpZihlKXt2YXIgcj0obnVsbD09ZT92b2lkIDA6ZS5xdWVyeVNlbGVjdG9yKCIudC1idG5fd3JhcC1lZmZlY3RzIikpfHwobnVsbD09ZT92b2lkIDA6ZS5xdWVyeVNlbGVjdG9yKCIudC1idG4tZWZmZWN0cyIpKTtpZihyKXt2YXIgbz1lLm5leHRFbGVtZW50U2libGluZyxuOyhudWxsPT1vP3ZvaWQgMDpvLnF1ZXJ5U2VsZWN0b3IoIi50LWJ0bl93cmFwLWVmZmVjdHMiKSl8fChudWxsPT1vP3ZvaWQgMDpvLnF1ZXJ5U2VsZWN0b3IoIi50LWJ0bi1lZmZlY3RzIikpfHxvLmFwcGVuZENoaWxkKHIuY2xvbmVOb2RlKCEwKSl9fX1mdW5jdGlvbiB0X3N0b3JlX2luaXRUZXh0QW5kQ2hhcmFjdGVyaXN0aWNzKHQsZSl7dmFyIHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSE9PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19wcm9kdWN0LXNuaXBwZXQiKSYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKS5jb250YWlucyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1zdG9yZV9fcHJvZHVjdC1zbmlwcGV0IikpLG89dC5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtcHJvZC10ZXh0Iik7aWYobyl7Zm9yKDtvLmZpcnN0Q2hpbGQ7KW8ucmVtb3ZlQ2hpbGQoby5maXJzdENoaWxkKTtvLnN0eWxlLmRpc3BsYXk9Im5vbmUifXZhciBuPWUucGFja19sYWJlbHx8IiIsaT1wYXJzZUludChlLnBhY2tfbSwxMCl8fDAscz1wYXJzZUludChlLnBhY2tfeCwxMCl8fDAsYT1wYXJzZUludChlLnBhY2tfeSwxMCl8fDAsYz1wYXJzZUludChlLnBhY2tfeiwxMCl8fDAsbD1lLnVybHx8IiIsZD1uJiZzJiZhJiZjLHA9aSx1PWUuY2hhcmFjdGVyaXN0aWNzJiZlLmNoYXJhY3RlcmlzdGljcy5sZW5ndGg+MHx8ZHx8cCxfPSEwLGY9dSx5O3QucXVlcnlTZWxlY3RvckFsbCgnLnQtc3RvcmVfX3RhYnMgLnQtc3RvcmVfX3RhYnNfX2l0ZW1bZGF0YS10YWItdHlwZT0idGV4dCJdJykubGVuZ3RoJiYoXz0hMSk7dmFyIHY9dC5xdWVyeVNlbGVjdG9yQWxsKCcudC1zdG9yZV9fdGFicyAudC1zdG9yZV9fdGFic19faXRlbVtkYXRhLXRhYi10eXBlPSJjaGFycyJdJyk7di5sZW5ndGgmJihmPSExKTt2YXIgZz0nPGRpdiBjbGFzcz0ianMtc3RvcmUtcHJvZC1hbGwtdGV4dCInKyhfPyIiOicgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IicpKyI+IjtnKz1lLnRleHR8fGUuZGVzY3J8fCIiLGcrPSI8L2Rpdj4iO3ZhciBtPV8/Im1hcmdpbi10b3A6IDIwcHg7IjoiIixoPSc8ZGl2IGNsYXNzPSJqcy1zdG9yZS1wcm9kLWFsbC1jaGFyY3MiJysoKG0rPWY/IiI6ImRpc3BsYXk6IG5vbmU7IikubGVuZ3RoPycgc3R5bGU9IicrbSsnIic6IiIpKyI+IixiPSIiO2lmKHUmJmUuY2hhcmFjdGVyaXN0aWNzLmZvckVhY2goKGZ1bmN0aW9uKHQpe2IrPSc8cCBjbGFzcz0idC10eXBvZ3JhcGh5X19jaGFyYWN0ZXJpc3RpY3MganMtc3RvcmUtcHJvZC1jaGFyY3MiPicrdC50aXRsZSsiOiAiK3QudmFsdWUrIjwvcD4ifSkpLGIrPSc8cCBjbGFzcz0ianMtc3RvcmUtcHJvZC1kaW1lbnNpb25zIHQtdHlwb2dyYXBoeV9fY2hhcmFjdGVyaXN0aWNzIj48L3A+JyxoKz1iKz0nPHAgY2xhc3M9ImpzLXN0b3JlLXByb2Qtd2VpZ2h0IHQtdHlwb2dyYXBoeV9fY2hhcmFjdGVyaXN0aWNzIj48L3A+JyxoKz0iPC9kaXY+IixvJiYoby5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWVuZCIsZyksby5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWVuZCIsaCksby5zdHlsZS5kaXNwbGF5PSIiKSxyJiZ2Lmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh2LChmdW5jdGlvbih0LGUpe3ZhciByPXQucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX3RhYnNfX2NvbnRlbnQiKTtpZihyKXtmb3IoO3IuZmlyc3RDaGlsZDspci5yZW1vdmVDaGlsZChyLmZpcnN0Q2hpbGQpO3IuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLGIpLDAhPT1lJiYoci5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtcHJvZC1kaW1lbnNpb25zIikucGFyZW50Tm9kZS5zdHlsZS5kaXNwbGF5PSIiKX19KSksZCl7dmFyIHc9cysieCIrYSsieCIrYyxTPXdpbmRvdy50U3RvcmVEaWN0WyJwcm9kdWN0LSIrbl0rIjogIit3KyImbmJzcDsiK3dpbmRvdy50U3RvcmVEaWN0Lm1tLEU9dC5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtcHJvZC1kaW1lbnNpb25zIik7RSYmKEUuaW5uZXJIVE1MPVMpLHImJihBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHYsKGZ1bmN0aW9uKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLXByb2QtZGltZW5zaW9ucyIpO2UmJihlLmlubmVySFRNTD1TKX0pKSx0LnNldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LXBhY2stbGFiZWwiLG4pLHQuc2V0QXR0cmlidXRlKCJkYXRhLXByb2R1Y3QtcGFjay14IixzKSx0LnNldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LXBhY2steSIsYSksdC5zZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC1wYWNrLXoiLGMpKX1pZihwKXt2YXIgUD13aW5kb3cudFN0b3JlRGljdFsicHJvZHVjdC13ZWlnaHQiXSsiOiAiK2krIiZuYnNwOyIrd2luZG93LnRTdG9yZURpY3QuZzt0LnF1ZXJ5U2VsZWN0b3IoIi5qcy1zdG9yZS1wcm9kLXdlaWdodCIpLmlubmVySFRNTD1QLHImJih2Lmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh2LChmdW5jdGlvbih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi5qcy1zdG9yZS1wcm9kLXdlaWdodCIpO2UmJihlLmlubmVySFRNTD1QKX0pKSx0LnNldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LXBhY2stbSIsaSkpfXZhciB4PXQucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLXByb2R1Y3QiKTtyJiZ0LmNsYXNzTGlzdC5jb250YWlucygianMtc3RvcmUtcHJvZHVjdCIpJiYoeD10KSx4JiYoeC5zZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC1wYWNrLWxhYmVsIixuKSx4LnNldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LXBhY2stbSIsaSkseC5zZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC1wYWNrLXgiLHMpLHguc2V0QXR0cmlidXRlKCJkYXRhLXByb2R1Y3QtcGFjay15IixhKSx4LnNldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LXBhY2steiIsYykseC5zZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC11cmwiLGwpKX1mdW5jdGlvbiB0X3N0b3JlX2FkZFByb2R1Y3RPcHRpb25zKHQsZSxyLG8pe3ZhciBuPXI7aWYod2luZG93LmpRdWVyeSYmbiBpbnN0YW5jZW9mIGpRdWVyeSl7aWYoMD09PW4ubGVuZ3RoKXJldHVybjtuPW5bMF19dmFyIGk9bi5xdWVyeVNlbGVjdG9yKCIuanMtcHJvZHVjdC1jb250cm9scy13cmFwcGVyIik7aWYoaSl7aS5pbm5lckhUTUw9IiI7dmFyIHM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSE9PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19wcm9kdWN0LXNuaXBwZXQiKSYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKS5jb250YWlucyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1zdG9yZV9fcHJvZHVjdC1zbmlwcGV0IikpLGE9dF9zdG9yZV9wcm9kdWN0X2dldEZpcnN0QXZhaWxhYmxlRWRpdGlvbkRhdGEoZS5lZGl0aW9ucyksYyxsO2lmKHRfc3RvcmVfcHJvZHVjdF9pbml0RWRpdGlvbnModCxlLG4sbyksZS5wcm9kX29wdGlvbnx8ZS5wcm9kX29wdGlvbjJ8fGUucHJvZF9vcHRpb24zfHxlLnByb2Rfb3B0aW9uNHx8ZS5wcm9kX29wdGlvbjUpWyIiLDIsMyw0LDVdLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJue25hbWU6ZVsicHJvZF9vcHRpb24iK3RdLHZhbHVlczplWyJwcm9kX3ZhcmlhbnRzIit0XX19KSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dF9zdG9yZV9wcm9kdWN0X2FkZE9uZU9wdGlvbnNDb250cm9sKCJtb2RpZmljYXRvciIsZSxpLG8sYSx0KX0pKTtlbHNlIGUucHJvcGVydGllcyYmZS5wcm9wZXJ0aWVzLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKCJzaW5nbGUiPT09ZS5wYXJhbXMudHlwZSl7dmFyIHI7dF9zdG9yZV9wcm9kdWN0X2FkZE9uZU9wdGlvbnNDb250cm9sKCJtb2RpZmljYXRvciIse25hbWU6ZS50aXRsZSx2YWx1ZXM6ZS52YWx1ZXN9LGksbyxhLHQpfWVsc2V7dmFyIG49dF9zdG9yZV9wcm9kdWN0X2dldE11bHRpb3B0aW9uQ2hlY2tib3hlc0VsKHQsZSxvKTtpLmFwcGVuZChuKX19KSk7aWYocyl7dF9zdG9yZV9vcHRpb25faGFuZGxlT25DaGFuZ2Uobik7dmFyIGQ9bi5jbG9zZXN0KCIudC1yZWNvcmRzIikscD1kJiZkLmdldEF0dHJpYnV0ZSgiaWQiKSx1PSFuLmNsb3Nlc3QoIi50LXN0b3JlX19yZWxldmFudHNfX2NvbnRhaW5lciIpLF87ZCYmdSYmKCJ0LWhlYWRlciIhPT1wJiYidC1mb290ZXIiIT09cCkmJnRfc3RvcmVfb3B0aW9uX2hhbmRsZU9uQ2hhbmdlX2N1c3RvbSh0LG4sbyl9fX1mdW5jdGlvbiB0X3N0b3JlX3Byb2R1Y3RfZ2V0TXVsdGlvcHRpb25DaGVja2JveGVzRWwodCxlLHIpe3ZhciBvPXRfc3RvcmVfb3B0aW9uX2dldFN0eWxlKHIpLG49ci50eXBvJiZyLnR5cG8ub3B0aW9uc0NvbG9yP286IiIsaT1mdW5jdGlvbiB0KGUscil7dmFyIG87cmV0dXJuJzxsYWJlbCBjbGFzcz0idC1jaGVja2JveF9fY29udHJvbCB0LWNoZWNrYm94X19jb250cm9sX2ZsZXggdC1kZXNjciB0LWRlc2NyX3h4cyI+ICAgIDxpbnB1dCBjbGFzcz0idC1jaGVja2JveCIgdHlwZT0iY2hlY2tib3giIG5hbWU9IicrdF9zdG9yZV9lc2NhcGVRdW90ZShlKSsnIiBkYXRhLXByb2R1Y3QtdmFyaWFudC1wcmljZT0iJytyKyciPiAgICA8ZGl2IGNsYXNzPSJ0LWNoZWNrYm94X19pbmRpY2F0b3IiPjwvZGl2PiAgICA8c3BhbiBjbGFzcz0iIiAnK24rIj4iK2UrIjwvc3Bhbj48L2xhYmVsPiJ9LHMsYT1lLnZhbHVlcy5zcGxpdCgiXG4iKS5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7dmFyIHI9ZS5zcGxpdCgiPSIpLG89clswXSxuPXJbMV07cmV0dXJuIHQraShvLG4pfSksIiIpLGM9JzxkaXYgY2xhc3M9InQtcHJvZHVjdF9fb3B0aW9uIGpzLXByb2R1Y3QtbXVsdGlvcHRpb24iPiAgICA8ZGl2IGNsYXNzPSJqcy1wcm9kdWN0LW9wdGlvbi1uYW1lIHQtcHJvZHVjdF9fb3B0aW9uLXRpdGxlIHQtdHlwb2dyYXBoeV9fb3B0aW9ucyB0LWRlc2NyIHQtZGVzY3JfeHhzIiAnK28rIj4gIitlLnRpdGxlKyc8L2Rpdj4gICAgPGRpdiBjbGFzcz0idC1wcm9kdWN0X19jaGVja2JveC13cmFwIj4gICAgICAgICcrYSsiICAgIDwvZGl2PjwvZGl2PiIsbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gbC5pbm5lckhUTUw9YyxsfWZ1bmN0aW9uIHRfc3RvcmVfZ2V0X2NvbnRyb2xfb3B0aW9uX2h0bWwodCl7dmFyIGU9IiIscjtyZXR1cm4gZSs9JzxkaXYgY2xhc3M9ImpzLXByb2R1Y3Qtb3B0aW9uIHQtcHJvZHVjdF9fb3B0aW9uIj4nLGUrPSc8ZGl2IGNsYXNzPSJqcy1wcm9kdWN0LW9wdGlvbi1uYW1lIHQtcHJvZHVjdF9fb3B0aW9uLXRpdGxlIHQtdHlwb2dyYXBoeV9fb3B0aW9ucyB0LWRlc2NyIHQtZGVzY3JfeHhzIiAnK3Rfc3RvcmVfb3B0aW9uX2dldFN0eWxlKHQpKyI+W1tuYW1lXV08L2Rpdj4iLGUrPSc8ZGl2IGNsYXNzPSJ0LXByb2R1Y3RfX29wdGlvbi12YXJpYW50cyB0LXByb2R1Y3RfX29wdGlvbi12YXJpYW50c19yZWd1bGFyIj4gPHNlbGVjdCBjbGFzcz0ianMtcHJvZHVjdC1vcHRpb24tdmFyaWFudHMgdC1wcm9kdWN0X19vcHRpb24tc2VsZWN0IHQtdHlwb2dyYXBoeV9fb3B0aW9ucyB0LWRlc2NyIHQtZGVzY3JfeHhzIj4gW1tvcHRpb250YWdzXV0gPC9zZWxlY3Q+IDwvZGl2PicsZSs9IjwvZGl2PiJ9ZnVuY3Rpb24gdF9zdG9yZV9nZXRfY29udHJvbF9lZGl0aW9uT3B0aW9uX2h0bWwodCxlKXt2YXIgcj0iIixvPXRfc3RvcmVfb3B0aW9uX2dldFN0eWxlKHQpLG49IiIsaSxzPXRfc3RvcmVfb3B0aW9uX2NoZWNrSWZDdXN0b20oZSk/JyBzdHlsZT0iZGlzcGxheTogbm9uZTsiJzoiIjtyZXR1cm4gZS5wYXJhbXMmJihlLnBhcmFtcy52aWV3JiYobis9JyBkYXRhLXZpZXctdHlwZT0iJytlLnBhcmFtcy52aWV3KyciJyksZS5wYXJhbXMuaGFzQ29sb3I/bis9JyBkYXRhLW9wdGlvbi10eXBlPSJjb2xvciInOm4rPScgZGF0YS1vcHRpb24tdHlwZT0icmVndWxhciInKSxyKz0nPGRpdiBjbGFzcz0ianMtcHJvZHVjdC1lZGl0aW9uLW9wdGlvbiB0LXByb2R1Y3RfX29wdGlvbiIgZGF0YS1lZGl0aW9uLW9wdGlvbi1pZD0iW1tpZF1dIicrbisiPiIscis9JzxkaXYgY2xhc3M9ImpzLXByb2R1Y3QtZWRpdGlvbi1vcHRpb24tbmFtZSB0LXByb2R1Y3RfX29wdGlvbi10aXRsZSB0LXR5cG9ncmFwaHlfX29wdGlvbnMgdC1kZXNjciB0LWRlc2NyX3h4cyIgJytvKyI+W1tuYW1lXV08L2Rpdj4iLHIrPSc8ZGl2IGNsYXNzPSJ0LXByb2R1Y3RfX29wdGlvbi12YXJpYW50cyB0LXByb2R1Y3RfX29wdGlvbi12YXJpYW50c19yZWd1bGFyIicrcysnPiA8c2VsZWN0IGNsYXNzPSJqcy1wcm9kdWN0LWVkaXRpb24tb3B0aW9uLXZhcmlhbnRzIHQtcHJvZHVjdF9fb3B0aW9uLXNlbGVjdCB0LXR5cG9ncmFwaHlfX29wdGlvbnMgdC1kZXNjciB0LWRlc2NyX3h4cyI+IFtbb3B0aW9udGFnc11dIDwvc2VsZWN0PiA8L2Rpdj4nLHIrPSI8L2Rpdj4ifWZ1bmN0aW9uIHRfc3RvcmVfb3B0aW9uX2dldFN0eWxlKHQpe3ZhciBlLHIsbz0iIjt0LnR5cG8mJnQudHlwby5kZXNjckNvbG9yJiYhdC50eXBvLm9wdGlvbnNDb2xvcj9vPXQudHlwby5kZXNjckNvbG9yOnQudHlwbyYmdC50eXBvLm9wdGlvbnNDb2xvciYmKG89dC50eXBvLm9wdGlvbnNDb2xvcik7dmFyIG49by5zdGFydHNXaXRoKCJsaW5lYXItZ3JhZGllbnQiKXx8by5zdGFydHNXaXRoKCJyYWRpYWwtZ3JhZGllbnQiKTtyZXR1cm4gdC5vcHRpb25zX3R5cG98fG4/biYmKGU9IiIhPT0ocj0iIiE9PW8/ImNvbG9yOiB0cmFuc3BhcmVudDsgYmFja2dyb3VuZC1jbGlwOiB0ZXh0OyBiYWNrZ3JvdW5kLWltYWdlOiIrbysiOyI6IiIpPydzdHlsZSA9ICInK3IrJyInOiIiKTplPSIiIT09KHI9IiIhPT1vPyJjb2xvcjoiK28rIjsiOiIiKT8nc3R5bGUgPSAiJytyKyciJzoiIixlfWZ1bmN0aW9uIHRfc3RvcmVfb3B0aW9uX3N0eWxlQ3VzdG9tQ29udHJvbCh0LGUscixvLG4pe3ZhciBpPSIiLHM9by5xdWVyeVNlbGVjdG9yKCcuanMtcHJvZHVjdC1lZGl0aW9uLW9wdGlvbltkYXRhLWVkaXRpb24tb3B0aW9uLWlkPSInK3IuaWQrJyJdJyk7aWYocyl7dmFyIGE9ci5wYXJhbXMmJiJzZWxlY3QiPT09ci5wYXJhbXMudmlldyxjPXIucGFyYW1zJiZyLnBhcmFtcy5oYXNDb2xvciYmIXIucGFyYW1zLmxpbmtJbWFnZSxsPXIucGFyYW1zJiZyLnBhcmFtcy5saW5rSW1hZ2UsZD1yLnZhbHVlc1swXSxwPXRfc3RvcmVfb3B0aW9uX2dldENsYXNzTW9kaWZpY2F0b3Iociwic2VsZWN0IiwidC1wcm9kdWN0X19vcHRpb24tdmFyaWFudHMiKSx1PXRfc3RvcmVfb3B0aW9uX2dldENsYXNzTW9kaWZpY2F0b3Iociwic2VsZWN0IiwidC1wcm9kdWN0X19vcHRpb24taXRlbSIpLF89dF9zdG9yZV9vcHRpb25fZ2V0Q2xhc3NNb2RpZmljYXRvcihyLCJzZWxlY3QiLCJ0LXByb2R1Y3RfX29wdGlvbi1pbnB1dCIpLGY9dF9zdG9yZV9vcHRpb25fZ2V0Q2xhc3NNb2RpZmljYXRvcihyLCJzZWxlY3QiLCJ0LXByb2R1Y3RfX29wdGlvbi1jaGVja21hcmsiKSx5PXRfc3RvcmVfb3B0aW9uX2dldENsYXNzTW9kaWZpY2F0b3Iociwic2VsZWN0IiwidC1wcm9kdWN0X19vcHRpb24tdGl0bGUiKSx2LGcsbTtpZihhKXt2YXIgaCxiO2lmKGkrPSc8ZGl2IGNsYXNzPSJ0LXByb2R1Y3RfX29wdGlvbi1zZWxlY3RlZCAnK3Rfc3RvcmVfb3B0aW9uX2dldENsYXNzTW9kaWZpY2F0b3Iociwic2VsZWN0IiwidC1wcm9kdWN0X19vcHRpb24tc2VsZWN0ZWQiKSsnIHQtZGVzY3IgdC1kZXNjcl94eHMiPicsYylpKz0nPHNwYW4gY2xhc3M9InQtcHJvZHVjdF9fb3B0aW9uLXNlbGVjdGVkLWNoZWNrbWFyayInKygnIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAnK3Rfc3RvcmVfb3B0aW9uX2dldENvbG9yVmFsdWUoci52YWx1ZXNPYmosZCkrJzsiJykrIj48L3NwYW4+IjtlbHNlIGlmKGwpe3ZhciB3O3Y9ci52YWx1ZXNbMF0saSs9JzxkaXYgY2xhc3M9InQtcHJvZHVjdF9fb3B0aW9uLXNlbGVjdGVkLWNoZWNrbWFyayB0LWJnaW1nIiBkYXRhLW9yaWdpbmFsPSInKyhnPXIuaW1hZ2VzT2JqW3ZdKSsnIicrKChtPXRfc3RvcmVfZ2V0TGF6eVVybChlLGcpKT8iIHN0eWxlPVwiYmFja2dyb3VuZC1pbWFnZTogdXJsKCciK20rIicpO1wiIjoiIikrIj48L2Rpdj4ifWkrPSc8c3BhbiBjbGFzcz0idC1wcm9kdWN0X19vcHRpb24tc2VsZWN0ZWQtdGl0bGUiPicrZCsiPC9zcGFuPiIsaSs9IjwvZGl2PiIscCs9IiB0LXByb2R1Y3RfX29wdGlvbi12YXJpYW50c19oaWRkZW4ifWkrPSc8Zm9ybSBjbGFzcz0idC1wcm9kdWN0X19vcHRpb24tdmFyaWFudHMgdC1wcm9kdWN0X19vcHRpb24tdmFyaWFudHNfY3VzdG9tICcrcCsnIj4nO2Zvcih2YXIgUz0wO1M8ci52YWx1ZXMubGVuZ3RoO1MrKylpZigiIiE9PSh2PXIudmFsdWVzW1NdKSl7dmFyIEU9bltyLm5hbWVdPT09dixQPUU/IiBjaGVja2VkIjoiIix4PUU/IiB0LXByb2R1Y3RfX29wdGlvbi1pdGVtX2FjdGl2ZSAiOiIiLEM9Yz8nIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAnK3Rfc3RvcmVfb3B0aW9uX2dldENvbG9yVmFsdWUoci52YWx1ZXNPYmosdikrJzsiJzoiIjtpKz0nPGxhYmVsIGNsYXNzPSJ0LXByb2R1Y3RfX29wdGlvbi1pdGVtICcreCt1KyciPicsaSs9JzxpbnB1dCBjbGFzcz0idC1wcm9kdWN0X19vcHRpb24taW5wdXQgJytfKyciIHR5cGU9InJhZGlvIiBuYW1lPSInK3IubmFtZSsnIiB2YWx1ZT0iJyt0X3N0b3JlX2VzY2FwZVF1b3RlKHYpKyciJytQKyI+IixsJiZyLmltYWdlc09iaj9pKz0nPGRpdiBjbGFzcz0idC1wcm9kdWN0X19vcHRpb24tY2hlY2ttYXJrIHQtYmdpbWcgJytmKyciJysoQz0obT10X3N0b3JlX2dldExhenlVcmwoZSxnPXIuaW1hZ2VzT2JqW3ZdKSk/IiBzdHlsZT1cImJhY2tncm91bmQtaW1hZ2U6IHVybCgnIittKyInKTtcIiI6IiIpKycgZGF0YS1vcmlnaW5hbD0iJytnKyciPjwvZGl2Pic6aSs9JzxkaXYgY2xhc3M9InQtcHJvZHVjdF9fb3B0aW9uLWNoZWNrbWFyayAnK2YrJyInK0MrIj48L2Rpdj4iLGkrPSc8c3BhbiBjbGFzcz0idC1wcm9kdWN0X19vcHRpb24tdGl0bGUgJyt5KycgdC10eXBvZ3JhcGh5X19vcHRpb25zIHQtZGVzY3IgdC1kZXNjcl94eHMiPicrdisiPC9zcGFuPiIsaSs9IjwvbGFiZWw+In1pKz0iPC9mb3JtPiIscy5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWVuZCIsaSl9fWZ1bmN0aW9uIHRfc3RvcmVfb3B0aW9uX2dldENvbG9yVmFsdWUodCxlKXt2YXIgcj0iI2ZmZmZmZiI7Zm9yKHZhciBvIGluIHQpe3ZhciBuPXRbb107aWYobi52YWx1ZT09PWUudG9TdHJpbmcoKSl7cj1uLmNvbG9yO2JyZWFrfX1yZXR1cm4gcn1mdW5jdGlvbiB0X3N0b3JlX29wdGlvbl9nZXRDbGFzc01vZGlmaWNhdG9yKHQsZSxyKXtpZighdClyZXR1cm4iIjt2YXIgbz10LnBhcmFtcyxuPXIrIl8iK28udmlldztyZXR1cm4gby5oYXNDb2xvciYmby5saW5rSW1hZ2U/ImZpbHRlciI9PT1lPyhuPXIrIl9idXR0b25zIixuKz0iICIrcisiX2NvbG9yIik6bis9IiAiK3IrIl9pbWFnZSI6by5oYXNDb2xvcj9uKz0iICIrcisiX2NvbG9yIjpvLmxpbmtJbWFnZT9uKz0iICIrcisiX2ltYWdlIjpuKz0iICIrcisiX3NpbXBsZSIsbn1mdW5jdGlvbiB0X3N0b3JlX2NoZWNrVXJsKHQsZSl7dmFyIHI9d2luZG93LmxvY2F0aW9uLmhyZWYsbz1yLmluZGV4T2YoIi90cHJvZHVjdC8iKTtpZigvaVBob25lfGlQYWR8aVBvZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJm88MCYmKG89ci5pbmRleE9mKCIvdHByb2R1Y3QvIikpPDAmJihvPXIuaW5kZXhPZigiJTJGdHByb2R1Y3QlMkYiKSksbz49MCl7dmFyIG49KHI9ci5zdWJzdHJpbmcobyxyLmxlbmd0aCkpLnNwbGl0KCItIik7aWYodm9pZCAwPT09blsxXSlyZXR1cm47dmFyIGk9blsxXSxzPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK2UpLGE9cy5xdWVyeVNlbGVjdG9yKCcuanMtc3RvcmUtZ3JpZC1jb250IFtkYXRhLXByb2R1Y3QtZ2VuLXVpZD0iJytpKyciXScpLGM9cy5xdWVyeVNlbGVjdG9yKCIudC1wb3B1cCIpO2lmKHIuaW5kZXhPZihlKT49MCYmYSl7aWYoIWMuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXBvcHVwX3Nob3ciKSl7dmFyIGw9YS5xdWVyeVNlbGVjdG9yKCdbaHJlZl49IiNwcm9kcG9wdXAiXScpO2wmJmwuY2xpY2soKX19ZWxzZSBpZihyLmluZGV4T2YoZSk+PTAmJmMpe2lmKGMuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXBvcHVwX3Nob3ciKSlyZXR1cm47dmFyIGQ7aWYoIShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpIT09ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX3Byb2R1Y3Qtc25pcHBldCIpJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLmNvbnRhaW5zKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19wcm9kdWN0LXNuaXBwZXQiKSkpKXt2YXIgcD1mdW5jdGlvbiByKG8pe2lmKCJzdHJpbmciPT10eXBlb2YgbyYmInsiPT09by5zdWJzdHJpbmcoMCwxKSl7dmFyIG47dHJ5e3ZhciBzO249SlNPTi5wYXJzZShvKS5wcm9kdWN0fWNhdGNoKGEpe2NvbnNvbGUuZXJyb3IoYSl9aWYoIW4pcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiQ2FuJ3QgZ2V0IHByb2R1Y3Qgd2l0aCB1aWQgPSAiK2krIiBpbiBzdG9yZXBhcnQgPSAiK3Quc3RvcmVwYXJ0KTt0X3N0b3JlX29wZW5Qcm9kdWN0UG9wdXAoZSx0LG4pfWVsc2UgY29uc29sZS5lcnJvcigiQ2FuJ3QgZ2V0IHByb2R1Y3Qgd2l0aCB1aWQgPSAiK2krIiBpbiBzdG9yZXBhcnQgPSAiK3Quc3RvcmVwYXJ0KX07dF9zdG9yZV9sb2FkT25lUHJvZHVjdChlLHQsaSxwLChmdW5jdGlvbihyKXt0X3N0b3JlX2NoYW5nZUVuZHBvaW50KHIsKGZ1bmN0aW9uKCl7dF9zdG9yZV9sb2FkT25lUHJvZHVjdChlLHQsaSxwKX0pKX0pKX19fX1mdW5jdGlvbiB0X3N0b3JlX3Nob3dQb3B1cCh0LGUscil7dmFyIG89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrdCksbj1vLnF1ZXJ5U2VsZWN0b3IoIi50LXBvcHVwIik7dF9zdG9yZV9yZXNldE5hdlN0eWxlcyh0KSx0X3N0b3JlX3RyaWdnZXJFdmVudChkb2N1bWVudC5ib2R5LCJwb3B1cFNob3dlZCIpLGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgidC1ib2R5X3BvcHVwc2hvd2VkIiksbi5zdHlsZS5kaXNwbGF5PSJibG9jayI7dmFyIGk9bi5zY3JvbGxIZWlnaHQ+ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtpfHwobi5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIiksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtuLnF1ZXJ5U2VsZWN0b3IoIi50LXBvcHVwX19jb250YWluZXIiKS5jbGFzc0xpc3QuYWRkKCJ0LXBvcHVwX19jb250YWluZXItYW5pbWF0ZWQiKSxuLmNsYXNzTGlzdC5hZGQoInQtcG9wdXBfc2hvdyIpLHRfc3RvcmVfdHJpZ2dlckV2ZW50KGRvY3VtZW50LmJvZHksInR3aXNobGlzdF9hZGRidG4iKSx0X3N0b3JlX3BvcHVwX3VwZGF0ZUxhenlMb2FkKCksaT8obi5zY3JvbGxUb3A9MCx0X3N0b3JlX3RyaWdnZXJFdmVudChuLHRfc3RvcmVfUE9QVVBfU0hPV0VEX0VWRU5UX05BTUUpKTpzZXRUaW1lb3V0KChmdW5jdGlvbigpe24uc3R5bGUub3ZlcmZsb3c9ImF1dG8iLHRfc3RvcmVfdHJpZ2dlckV2ZW50KG4sdF9zdG9yZV9QT1BVUF9TSE9XRURfRVZFTlRfTkFNRSl9KSwzMDApfSksNTApLG4uYWRkRXZlbnRMaXN0ZW5lcih0X3N0b3JlX1BPUFVQX1NIT1dFRF9FVkVOVF9OQU1FLHRfc3RvcmVfcG9wdXBfdXBkYXRlTGF6eUxvYWQpLHJ8fGFkZFBvcHVwRXZlbnRzKG8sdCl9ZnVuY3Rpb24gdF9zdG9yZV9wb3B1cF91cGRhdGVMYXp5TG9hZCgpeyJ5IiE9PXdpbmRvdy5sYXp5JiYieWVzIiE9PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIikuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWxhenkiKXx8dF9zdG9yZV9vbkZ1bmNMb2FkKCJ0X2xhenlsb2FkX3VwZGF0ZSIsKGZ1bmN0aW9uKCl7dF9sYXp5bG9hZF91cGRhdGUoKX0pKX1mdW5jdGlvbiB0X3N0b3JlX2Nsb3NlUG9wdXBLZXlEb3duKHQpe3ZhciBlLHI7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoInQtem9vbWVyX19zaG93Iil8fChkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygidC16b29tZXJfX2FjdGl2ZSIpfHwyNz09PXQua2V5Q29kZSYmdF9zdG9yZV9jbG9zZVBvcHVwKCExKSl9ZnVuY3Rpb24gYWRkUG9wdXBFdmVudHModCl7dmFyIGU9ZnVuY3Rpb24gdChlKXtlLnRhcmdldD09PXRoaXMmJnRfc3RvcmVfY2xvc2VQb3B1cCghMSl9O3QucXVlcnlTZWxlY3RvcigiLnQtcG9wdXAiKS5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsZSksdC5xdWVyeVNlbGVjdG9yKCIudC1wb3B1cCIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixlKTt2YXIgcj1mdW5jdGlvbiB0KCl7dF9zdG9yZV9jbG9zZVBvcHVwKCExKX07QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXBvcHVwX19jbG9zZSwgLmpzLXN0b3JlLWNsb3NlLXRleHQiKSwoZnVuY3Rpb24odCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsciksdC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIscil9KSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdF9zdG9yZV9jbG9zZVBvcHVwS2V5RG93bik7dmFyIG89MzAsbj0yMDAsaT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXBvcHVwX19jbG9zZS1vcGFjaXR5LXNjcm9sbCIpO2lmKGkubGVuZ3RoKXt2YXIgcz1mdW5jdGlvbiB0KGUpe3ZhciByPWUuc2Nyb2xsVG9wKCkscztzPXI+PW4/MTpyPD1vPzA6ci9uLGkuc3R5bGUuYmFja2dyb3VuZENsb3I9InJnYmEoMjU1LDI1NSwyNTUsIitzKyIpIn07dC5xdWVyeVNlbGVjdG9yKCIudC1wb3B1cCIpLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIscyksdC5xdWVyeVNlbGVjdG9yKCIudC1wb3B1cCIpLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIscyl9fWZ1bmN0aW9uIHRfc3RvcmVfcmVzZXROYXZTdHlsZXModCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrdCkucXVlcnlTZWxlY3RvcigiLnQtcG9wdXBfX2Nsb3NlIik7ZS5jbGFzc0xpc3QuY29udGFpbnMoInQtcG9wdXBfX2Nsb3NlLXNvbGlkIik/ZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9InJnYmEoMjU1LDI1NSwyNTUsMSkiOmUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXBvcHVwX19jbG9zZS1vcGFjaXR5LXNjcm9sbCIpJiYoZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9InJnYmEoMjU1LDI1NSwyNTUsMCkiKX1mdW5jdGlvbiB0X3N0b3JlX2Nsb3NlUG9wdXAodCxlLHIpe3ZhciBvPWUsbj1yLGk9L2lQaG9uZXxpUGFkfGlQb2QvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHM9L14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxhLGMsbCxkO2lmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIikhPT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1zdG9yZV9fcHJvZHVjdC1zbmlwcGV0IikmJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIikuY29udGFpbnMoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX3Byb2R1Y3Qtc25pcHBldCIpKXx8dF9zdG9yZV9jbG9zZVBvcHVwX3JvdXRpbmcoKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXBvcHVwIiksKGZ1bmN0aW9uKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbV9hY3RpdmUgLnQtc2xkc19fZnJhbWUiKTtlJiZlLnNyYyYmLTEhPT1lLnNyYy5pbmRleE9mKCImZW5hYmxlanNhcGk9MSIpJiZlLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoJ3siZXZlbnQiOiJjb21tYW5kIiwiZnVuYyI6InBhdXNlVmlkZW8iLCJhcmdzIjoiIn0nLCIqIiksdC5jbGFzc0xpc3QucmVtb3ZlKCJ0LXBvcHVwX3Nob3ciKTt2YXIgcj10Lm5leHRFbGVtZW50U2libGluZztyJiZyLmNsYXNzTGlzdC5jb250YWlucygidC1wb3B1cF9fYmctYWN0aXZlIikmJnIuY2xhc3NMaXN0LnJlbW92ZSgidC1wb3B1cF9fYmctYWN0aXZlIil9KSksdF9zdG9yZV90cmlnZ2VyRXZlbnQoZG9jdW1lbnQuYm9keSwicG9wdXBIaWRkZW4iKSxkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoInQtYm9keV9wb3B1cHNob3dlZCIpLHQpaWYodF9zdG9yZV9pc1F1ZXJ5SW5BZGRyZXNzQmFyKCJ0c3RvcmUiKSl7dmFyIHA9ZGVjb2RlVVJJKHdpbmRvdy5sb2NhdGlvbi5oYXNoKS5zcGxpdCgiLyIpLHU9cC5pbmRleE9mKCJjIikrMSxfPXAuaW5kZXhPZigiciIpKzEsZj1wW19dO2M9LTEhPT1wW3VdLmluZGV4T2YoIi0iKT9wW3VdLnNsaWNlKDAscFt1XS5pbmRleE9mKCItIikpOnBbdV0sd2luZG93Lmhpc3Rvcnkuc3RhdGUmJigobD13aW5kb3cuaGlzdG9yeS5zdGF0ZS5vcHRzKS5zdG9yZXBhcnQ9YyksdF9zdG9yZV9pc1N0b3JlcGFydEZyb21IaXN0b3J5QWN0aXZlKGMsbyxuKXx8dF9zdG9yZV9sb2FkUHJvZHVjdHMoIiIsZixsKX1lbHNlIHRfc3RvcmVfaXNTdG9yZXBhcnRGcm9tSGlzdG9yeUFjdGl2ZShuLnN0b3JlcGFydCxvLG4pfHx0X3N0b3JlX2xvYWRQcm9kdWN0cygiIixvLG4pO2Vsc2UgaWYod2luZG93Lmhpc3Rvcnkuc3RhdGUmJndpbmRvdy5oaXN0b3J5LnN0YXRlLnByb2R1Y3REYXRhKXRyeXt2YXIgeT13aW5kb3cudXJsQmVmb3JlUG9wdXBPcGVuLHY9d2luZG93LnRpdGxlQmVmb3JlUG9wdXBPcGVuO3Rfc3RvcmVfaGlzdG9yeV9wdXNoU3RhdGUoe3N0b3JlcGFydHVpZDpjPShkPXdpbmRvdy5oaXN0b3J5LnN0YXRlLnByb2R1Y3REYXRhKS5vcHRzLnN0b3JlcGFydCxvcHRzOm49ZC5vcHRzLHJlY2lkOm89ZC5yZWNpZH0sbnVsbCx5KSxpJiZzJiYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaGVhZCBsaW5rW3JlbD0iY2Fub25pY2FsIl0nKS5zZXRBdHRyaWJ1dGUoImhyZWYiLHkpLGRvY3VtZW50LnRpdGxlPXYpfWNhdGNoKG0pe2NvbnNvbGUuZXJyb3IobSl9byYmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK28pLnF1ZXJ5U2VsZWN0b3IoIi5qcy1zdG9yZS1wYXJ0cy1zd2l0Y2hlciIpJiYhbi5oaWRlU3RvcmVQYXJ0cyYmdF9zdG9yZV9zZXRBY3RpdmVTdG9yZVBhcnQobyksbi50YWJzJiZ0X3N0b3JlX29uRnVuY0xvYWQoInRfc3RvcmVfdGFic192aWRlb0NsZWFyRnJhbWUiLChmdW5jdGlvbigpe3Rfc3RvcmVfdGFic192aWRlb0NsZWFyRnJhbWUobyl9KSkpO3ZhciBnPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXBvcHVwIik7c2V0VGltZW91dCgoZnVuY3Rpb24oKXtnLnNjcm9sbFRvcD0wLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQtcG9wdXA6bm90KC50LXBvcHVwX3Nob3cpIiksKGZ1bmN0aW9uKHQpe3Quc3R5bGUuZGlzcGxheT0ibm9uZSJ9KSl9KSwzMDApLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRfc3RvcmVfY2xvc2VQb3B1cEtleURvd24pLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJyZXNpemUiLHdpbmRvdy50X3N0b3JlX3Byb2RQb3B1cF91cGRhdGVHYWxsZXJ5VGh1bWJzRXZlbnQpLHRfc3RvcmVfdHJpZ2dlckV2ZW50KGRvY3VtZW50LmJvZHksInR3aXNobGlzdF9hZGRidG4iKSx0X3N0b3JlX3RyaWdnZXJFdmVudChnLHRfc3RvcmVfUE9QVVBfQ0xPU0VEX0VWRU5UX05BTUUpfWZ1bmN0aW9uIHRfc3RvcmVfaXNTdG9yZXBhcnRGcm9tSGlzdG9yeUFjdGl2ZSh0LGUscil7dmFyIG8sbj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIitlKTtpZihyJiYhci5zdG9yZVBhcnRzQXJyKXJldHVybiEwO2lmKCF0KXJldHVybiExO3ZhciBpPW51bGw9PShvPW4ucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLXBhcnRzLXN3aXRjaGVyLnQtYWN0aXZlIikpP3ZvaWQgMDpvLmdldEF0dHJpYnV0ZSgiZGF0YS1zdG9yZXBhcnQtdWlkIik7cmV0dXJuIHBhcnNlSW50KGksMTApPT09cGFyc2VJbnQodCwxMCl9ZnVuY3Rpb24gdF9zdG9yZV9jbG9zZVBvcHVwX3JvdXRpbmcoKXt3aW5kb3cub25wb3BzdGF0ZT1mdW5jdGlvbigpe3ZhciB0O2lmKHdpbmRvdy5oaXN0b3J5LnN0YXRlKXtpZih3aW5kb3cuaGlzdG9yeS5zdGF0ZS5wcm9kdWN0RGF0YSl7dmFyIGU9d2luZG93Lmhpc3Rvcnkuc3RhdGUucHJvZHVjdERhdGEscj1lLnJlY2lkLG89ZS5wcm9kdWN0T2JqLG49ZS5pc1JlbGV2YW50c1Nob3c7dF9zdG9yZV9vcGVuUHJvZHVjdFBvcHVwKHIsdD1lLm9wdHMsbyxuLCEwKX1pZih3aW5kb3cuaGlzdG9yeS5zdGF0ZS5zdG9yZXBhcnR1aWQpe3ZhciBpPXdpbmRvdy5oaXN0b3J5LnN0YXRlLm9wdHMscz13aW5kb3cuaGlzdG9yeS5zdGF0ZS5yZWNpZDt0LmlzUHVibGlzaGVkUGFnZT0hMCx0X3N0b3JlX2xvYWRQcm9kdWN0cygiIixzLGkpfX19fWZ1bmN0aW9uIHRfc3RvcmVfYXBwbHlDb250cmFzdENvbG9ySWZOZWNlc3NhcnkodCxlLHIpe3ZhciBvOzA9PT1NYXRoLmFicyh0X3N0b3JlX2dldExpZ2h0bmVzc0NvbG9yKGUpLXRfc3RvcmVfZ2V0TGlnaHRuZXNzQ29sb3IocikpJiYodC5zdHlsZS5jb2xvcj10X3N0b3JlX2x1bWFfcmdiKHIpKX1mdW5jdGlvbiB0X3N0b3JlX2NvcHlUeXBvZ3JhcGh5RnJvbUxlYWRUb1BvcHVwKHQsZSl7dmFyIHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrdCksbz1yLnF1ZXJ5U2VsZWN0b3IoIi5qcy1zdG9yZS1ncmlkLWNvbnQgLmpzLXN0b3JlLXByb2QtbmFtZSIpLG49ci5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtZ3JpZC1jb250IC5qcy1zdG9yZS1wcm9kLWRlc2NyIiksaT1yLnF1ZXJ5U2VsZWN0b3IoIi50LXBvcHVwIC50LXBvcHVwX19jb250YWluZXIiKSxzLGE7aWYoaSYmKHM9aS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IpLG8pe3ZhciBjPW8uZ2V0QXR0cmlidXRlKCJzdHlsZSIpLGw9ci5xdWVyeVNlbGVjdG9yKCIudC1wb3B1cCAuanMtc3RvcmUtcHJvZC1uYW1lIiksZDtpZihsKWlmKGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsdF9zdG9yZV9yZW1vdmVTaXplc0Zyb21TdHlsZXNMaW5lKGMpKSxzKXRfc3RvcmVfYXBwbHlDb250cmFzdENvbG9ySWZOZWNlc3NhcnkobCxlLnR5cG8udGl0bGVDb2xvcixzKX1uJiYoYT1uLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksIWEmJmUmJmUudHlwbyYmZS50eXBvLmRlc2NyJiYoYT0oYT1lLnR5cG8uZGVzY3IpLnJlcGxhY2UoImxpbmUtaGVpZ2h0OjA7IiwiIikpO3ZhciBwPXIucXVlcnlTZWxlY3RvcigiLnQtcG9wdXAgLmpzLXN0b3JlLXByb2QtdGV4dCIpLHU7cCYmKHAuc2V0QXR0cmlidXRlKCJzdHlsZSIsdF9zdG9yZV9yZW1vdmVTaXplc0Zyb21TdHlsZXNMaW5lKGEpKSxzJiZ0X3N0b3JlX2FwcGx5Q29udHJhc3RDb2xvcklmTmVjZXNzYXJ5KHAsZS50eXBvLmRlc2NyQ29sb3IscykpfWZ1bmN0aW9uIHRfc3RvcmVfc2V0UHJvZHVjdE5hbWVTdHlsZXModCxlLHIsbyl7dmFyIG49dC5xdWVyeVNlbGVjdG9yKCIudC1zdG9yZV9fcHJvZC1wb3B1cF9fdGl0bGUtd3JhcHBlciAuanMtc3RvcmUtcHJvZC1uYW1lIik7aWYobilpZihyLnRpdGxlX3R5cG8pdF9zdG9yZV9wYXJzZVR5cG9TdHlsZXNDb25maWcoZSwiLnQtc3RvcmVfX3Byb2QtcG9wdXBfX25hbWUiLHIudGl0bGVfdHlwbywianMtc3RvcmUtdGl0bGUtdHlwby1zdHlsZXMtIitlKTtlbHNle3ZhciBpPW4uZ2V0QXR0cmlidXRlKCJzdHlsZSIpLHM7aWYobi5zZXRBdHRyaWJ1dGUoInN0eWxlIix0X3N0b3JlX3JlbW92ZVNpemVzRnJvbVN0eWxlc0xpbmUoaSkpLG8pdF9zdG9yZV9hcHBseUNvbnRyYXN0Q29sb3JJZk5lY2Vzc2FyeShuLHIudHlwby50aXRsZUNvbG9yLG8pfX1mdW5jdGlvbiB0X3N0b3JlX3NldFJlbGV2YW50c1NsaWRlclN0eWxlcyh0LGUpe2Uuc2hvd1JlbGV2YW50cyYmKGUudGl0bGVfdHlwbyYmKHRfc3RvcmVfcGFyc2VUeXBvU3R5bGVzQ29uZmlnKHQsIi50LXN0b3JlX19yZWxldmFudHNfX3RpdGxlIixlLnRpdGxlX3R5cG8sImpzLXN0b3JlLXJlbGV2YW50cy10aXRsZS10eXBvLXN0eWxlcy0iK3Qse2NvbG9yOiEwLCJmb250LXNpemUiOiEwLCJmb250LWZhbWlseSI6ITAsImxpbmUtaGVpZ2h0IjohMCwiZm9udC13ZWlnaHQiOiEwLCJsZXR0ZXItc3BhY2luZyI6ITAsb3BhY2l0eTohMCwidGV4dC10cmFuc2Zvcm0iOiEwLCJ0ZXh0LXNoYWRvdyI6ITB9KSx0X3N0b3JlX3BhcnNlVHlwb1N0eWxlc0NvbmZpZyh0LCIudC1zdG9yZV9fY2FyZF9fdGl0bGUiLGUudGl0bGVfdHlwbywianMtc3RvcmUtcmVsZXZhbnRzLWRlc2NyLXR5cG8tc3R5bGVzLSIrdCkpLGUuZGVzY3JfdHlwbyYmdF9zdG9yZV9wYXJzZVR5cG9TdHlsZXNDb25maWcodCwiLnQtc3RvcmVfX2NhcmRfX2Rlc2NyIixlLmRlc2NyX3R5cG8sImpzLXN0b3JlLXJlbGV2YW50cy1pdGVtLWRlc2NyLXR5cG8tc3R5bGVzLSIrdCksZS5wcmljZV90eXBvJiZ0X3N0b3JlX3BhcnNlVHlwb1N0eWxlc0NvbmZpZyh0LCIudC1zdG9yZV9fY2FyZF9fcHJpY2UiLGUucHJpY2VfdHlwbywianMtc3RvcmUtcmVsZXZhbnRzLXByaWNlLXR5cG8tc3R5bGVzLSIrdCksZS5wcmljZV9vbGRfdHlwbyYmdF9zdG9yZV9wYXJzZVR5cG9TdHlsZXNDb25maWcodCwiLnQtc3RvcmVfX2NhcmRfX3ByaWNlX29sZCIsZS5wcmljZV9vbGRfdHlwbywianMtc3RvcmUtcmVsZXZhbnRzLW9sZC1wcmljZS10eXBvLXN0eWxlcy0iK3QpKX1mdW5jdGlvbiB0X3N0b3JlX3NldFByb2R1Y3REZXNjcmlwdGlvblN0eWxlcyh0LGUscixvKXt2YXIgbj10LnF1ZXJ5U2VsZWN0b3IoIi5qcy1zdG9yZS1wcm9kLXRleHQiKTtpZihuKWlmKHIuZGVzY3JfdHlwbyl0X3N0b3JlX3BhcnNlVHlwb1N0eWxlc0NvbmZpZyhlLCIudC1zdG9yZV9fcHJvZC1wb3B1cF9fdGV4dCIsci5kZXNjcl90eXBvLCJqcy1zdG9yZS1kZXNjci10eXBvLXN0eWxlcy0iK2UpO2Vsc2V7dmFyIGk9bi5nZXRBdHRyaWJ1dGUoInN0eWxlIikscztpZihuLnNldEF0dHJpYnV0ZSgic3R5bGUiLHRfc3RvcmVfcmVtb3ZlU2l6ZXNGcm9tU3R5bGVzTGluZShpKSksbyl0X3N0b3JlX2FwcGx5Q29udHJhc3RDb2xvcklmTmVjZXNzYXJ5KG4sci50eXBvLmRlc2NyQ29sb3Isbyl9fWZ1bmN0aW9uIHRfc3RvcmVfc2V0UHJvZHVjdFByaWNlU3R5bGVzKHQsZSxyLG8pe3ZhciBuPXQucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLXByb2QtcHJpY2UiKSxpO24mJihyLnByaWNlX3R5cG8/dF9zdG9yZV9wYXJzZVR5cG9TdHlsZXNDb25maWcoZSwiLnQtc3RvcmVfX3Byb2QtcG9wdXBfX3ByaWNlIixyLnByaWNlX3R5cG8sImpzLXN0b3JlLXByaWNlLXR5cG8tc3R5bGVzLSIrZSk6byYmdF9zdG9yZV9hcHBseUNvbnRyYXN0Q29sb3JJZk5lY2Vzc2FyeShuLHIucHJpY2UuY29sb3IsbykpfWZ1bmN0aW9uIHRfc3RvcmVfc2V0UHJvZHVjdE9sZFByaWNlU3R5bGVzKHQsZSxyLG8pe3ZhciBuPXQucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLXByb2QtcHJpY2Utb2xkIiksaTtuJiYoci5wcmljZV9vbGRfdHlwbz90X3N0b3JlX3BhcnNlVHlwb1N0eWxlc0NvbmZpZyhlLCIudC1zdG9yZV9fcHJvZC1wb3B1cF9fcHJpY2Vfb2xkIixyLnByaWNlX29sZF90eXBvLCJqcy1zdG9yZS1vbGQtcHJpY2UtdHlwby1zdHlsZXMtIitlKTpvJiZ0X3N0b3JlX2FwcGx5Q29udHJhc3RDb2xvcklmTmVjZXNzYXJ5KG4sci5wcmljZS5jb2xvck9sZCxvKSl9ZnVuY3Rpb24gdF9zdG9yZV9zZXRQcm9kdWN0T3B0aW9uc1N0eWxlcyh0LGUpe2lmKGUub3B0aW9uc190eXBvKXt2YXIgcjt0cnl7cj1KU09OLnBhcnNlKGUub3B0aW9uc190eXBvKX1jYXRjaChsKXtyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJFcnJvciB3aGVuIHBhcnNlIG9wdGlvbnNfdHlwbyBwYXJzZSBlcnJvciIsbCl9ZGVsZXRlIHIuc2hhZG93c2l6ZSxkZWxldGUgci5zaGFkb3dvcGFjaXR5O3ZhciBvPUpTT04uc3RyaW5naWZ5KHIpLG49Ii50LXByb2R1Y3RfX29wdGlvbi10aXRsZTpub3QoLnQtcHJvZHVjdF9fb3B0aW9uLXRpdGxlX3NlbGVjdCk6bm90KC50LXByb2R1Y3RfX29wdGlvbi10aXRsZV9yYWRpbyk6bm90KC50LXByb2R1Y3RfX29wdGlvbi10aXRsZV9idXR0b25zKSI7aWYodF9zdG9yZV9wYXJzZVR5cG9TdHlsZXNDb25maWcodCxuLGUub3B0aW9uc190eXBvLCJqcy1zdG9yZS1vcHRpb25zLXRpdGxlLXR5cG8tc3R5bGVzLSIrdCksZS5kZXNjcl90eXBvKXRyeXt2YXIgaSxzLGE9dF9zdG9yZV9vcHRpb25fZ2V0U3R5bGVJblNuaXBwZXQoSlNPTi5wYXJzZShlLmRlc2NyX3R5cG8pLmNvbG9yLEpTT04ucGFyc2UoZS5vcHRpb25zX3R5cG8pLmNvbG9yKSxjO2lmKCIiIT09YSl0X3N0b3JlX2NyZWF0ZdChc3NTdHlsZVRhZygianMtc3RvcmUtb3B0aW9ucy10aXRsZS1jb2xvci1yZXdyaXRlLXR5cG8tc3R5bGVzLSIrdCwiI3JlYyIrdCsiICIrbisiIHsgIithKyI7IH0iKX1jYXRjaChkKXtjb25zb2xlLmVycm9yKCJFcnJvciB3aGVuIHBhcnNlIGRlc2NyX3R5cG8gY29uZmlnIixkKX10X3N0b3JlX3BhcnNlVHlwb1N0eWxlc0NvbmZpZyh0LCIudC1wcm9kdWN0X19vcHRpb24tc2VsZWN0ZWQtdGl0bGUiLG8sImpzLXN0b3JlLW9wdGlvbnMtc2VsZWN0ZWQtdGl0bGUtdHlwby1zdHlsZXMtIit0KSx0X3N0b3JlX3BhcnNlVHlwb1N0eWxlc0NvbmZpZyh0LCIudC1wcm9kdWN0X19vcHRpb24tdGl0bGVfc2VsZWN0IixvLCJqcy1zdG9yZS1vcHRpb25zLXRpdGxlLXNlbGVjdC10eXBvLXN0eWxlcy0iK3QpLHRfc3RvcmVfcGFyc2VUeXBvU3R5bGVzQ29uZmlnKHQsIi50LXByb2R1Y3RfX29wdGlvbi1zZWxlY3QiLG8sImpzLXN0b3JlLW9wdGlvbnMtc2VsZWN0LXR5cG8tc3R5bGVzLSIrdCksdF9zdG9yZV9wYXJzZVR5cG9TdHlsZXNDb25maWcodCwiLnQtcHJvZHVjdF9fb3B0aW9uLXRpdGxlX3JhZGlvIixvLCJqcy1zdG9yZS1vcHRpb25zLXRpdGxlLXJhZGlvLXR5cG8tc3R5bGVzLSIrdCksdF9zdG9yZV9wYXJzZVR5cG9TdHlsZXNDb25maWcodCwiLnQtcHJvZHVjdF9fb3B0aW9uLXRpdGxlX2J1dHRvbnMiLG8sImpzLXN0b3JlLW9wdGlvbnMtdGl0bGUtYnV0dG9ucy10eXBvLXN0eWxlcy0iK3QpfX1mdW5jdGlvbiB0X3N0b3JlX29wdGlvbl9nZXRTdHlsZUluU25pcHBldCh0LGUpe3ZhciByLG89IiI7dCYmIWU/bz10OmUmJihvPWUpO3ZhciBuPW8uc3RhcnRzV2l0aCgibGluZWFyLWdyYWRpZW50Iil8fG8uc3RhcnRzV2l0aCgicmFkaWFsLWdyYWRpZW50Iik7cmV0dXJuIG4/biYmKHI9IiIhPT1vPyJjb2xvcjogdHJhbnNwYXJlbnQ7IGJhY2tncm91bmQtY2xpcDogdGV4dDsgYmFja2dyb3VuZC1pbWFnZToiK28rIjsiOiIiKTpyPSIiIT09bz8iY29sb3I6IitvKyI7IjoiIixyfWZ1bmN0aW9uIHRfc3RvcmVfc2V0UHJvZHVjdENoYXJhY3RlcmlzdGljc1N0eWxlcyh0LGUscil7dmFyIG87dC5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtcHJvZC1hbGwtY2hhcmNzIikmJnIuY2hhcmFjdGVyaXN0aWNzX3R5cG8mJnRfc3RvcmVfcGFyc2VUeXBvU3R5bGVzQ29uZmlnKGUsIi50LXR5cG9ncmFwaHlfX2NoYXJhY3RlcmlzdGljcyIsci5jaGFyYWN0ZXJpc3RpY3NfdHlwbywianMtc3RvcmUtY2hhcmFjdGVyaXN0aWNzLXR5cG8tc3R5bGVzLSIrZSl9ZnVuY3Rpb24gdF9zdG9yZV9zZXRQcm9kdWN0QnJhbmRTdHlsZXModCxlLHIpe3ZhciBvO3QucXVlcnlTZWxlY3RvcigiLmpzLXByb2R1Y3QtYnJhbmQiKSYmci5za3VfdHlwbyYmdF9zdG9yZV9wYXJzZVR5cG9TdHlsZXNDb25maWcoZSwiLnQtc3RvcmVfX3Byb2QtcG9wdXBfX2JyYW5kIixyLnNrdV90eXBvLCJqcy1zdG9yZS1icmFuZC10eXBvLXN0eWxlcy0iK2UpfWZ1bmN0aW9uIHRfc3RvcmVfc2V0UHJvZHVjdFNrdVN0eWxlcyh0LGUscil7dmFyIG87dC5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtcHJvZC1za3UiKSYmci5za3VfdHlwbyYmdF9zdG9yZV9wYXJzZVR5cG9TdHlsZXNDb25maWcoZSwiLnQtc3RvcmVfX3Byb2QtcG9wdXBfX3NrdSIsci5za3VfdHlwbywianMtc3RvcmUtc2t1LXR5cG8tc3R5bGVzLSIrZSl9ZnVuY3Rpb24gdF9zdG9yZV9zZXRQcm9kdWN0VGFic1N0eWxlcyh0LGUscil7dmFyIG87aWYodC5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtdGFicyIpKXtyLnRpdGxlX3R5cG8mJnRfc3RvcmVfcGFyc2VUeXBvU3R5bGVzQ29uZmlnKGUsIi50LXN0b3JlX190YWJzX19idXR0b24tdGl0bGUsIC50LXN0b3JlX190YWJzX19pdGVtLXRpdGxlIixyLnRpdGxlX3R5cG8sImpzLXN0b3JlLXRhYnMtdHlwby10aXRsZS1zdHlsZXMtIitlLHtjb2xvcjohMH0pLHIuZGVzY3JfdHlwbyYmdF9zdG9yZV9wYXJzZVR5cG9TdHlsZXNDb25maWcoZSwiLnQtc3RvcmVfX3RhYnNfX2NvbnRlbnQiLHIuZGVzY3JfdHlwbywianMtc3RvcmUtdGFicy10eXBvLWNvbnRlbnQtc3R5bGVzLSIrZSx7Y29sb3I6ITB9KTt0cnl7dmFyIG49ci50aXRsZV90eXBvP0pTT04ucGFyc2Uoci50aXRsZV90eXBvKTpudWxsLGk9bnVsbD09bj92b2lkIDA6bi5jb2xvcixzPWk/dF9zdG9yZV9oZXhUb1JnYihpKTpudWxsLGE7aWYocyl0X3N0b3JlX2NyZWF0ZdChc3NTdHlsZVRhZygianMtc3RvcmUtdGFicy1pdGVtcy1zdHlsZXMtIitlLCJcblx0XHRcdFx0I3JlYyIrZSsiIC50LXN0b3JlX190YWJzX19idXR0b24geyBcblx0XHRcdFx0XHRib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgiK3Muam9pbigiLCIpKyIsIDAuMyk7IFxuXHRcdFx0XHR9XG5cdFx0XHRcdCNyZWMiK2UrIiAudC1zdG9yZV9fdGFic19fYnV0dG9uX2FjdGl2ZSxcblx0XHRcdFx0I3JlYyIrZSsiIC50LXN0b3JlX190YWJzX19idXR0b246aG92ZXIgeyBcblx0XHRcdFx0XHRib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgiK3Muam9pbigiLCIpKyIsIDEuMCk7IFxuXHRcdFx0XHR9XG5cdFx0XHRcdCNyZWMiK2UrIiAudC1zdG9yZV9fdGFic19faXRlbS1idXR0b24geyBcblx0XHRcdFx0XHRib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgiK3Muam9pbigiLCIpKyIsIDEuMCk7IFxuXHRcdFx0XHR9XG5cdFx0XHRcdCNyZWMiK2UrIiAudC1zdG9yZV9fdGFic19faXRlbS1idXR0b246bm90KC50LXN0b3JlX190YWJzX19pdGVtLWJ1dHRvbl9hY3RpdmUpIHsgXG5cdFx0XHRcdFx0Ym9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoIitzLmpvaW4oIiwiKSsiLCAxLjApOyBcblx0XHRcdFx0fVxuXHRcdFx0Iil9Y2F0Y2goYyl7Y29uc29sZS5lcnJvcigiRXJyb3Igd2hlbiBwYXJzZSB0aXRsZV90eXBvIGNvbmZpZyIsYyl9fX1mdW5jdGlvbiB0X3N0b3JlX3NuaXBwZXRfY29weVR5cG9ncmFwaHlUb1NuaXBwZXQodCxlKXt2YXIgcixvPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK3QpLnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19wcm9kdWN0LXNuaXBwZXQiKSxuPWUucG9wdXBfb3B0cy5jb250YWluZXJCZ0NvbG9yO3Rfc3RvcmVfc2V0UHJvZHVjdE5hbWVTdHlsZXMobyx0LGUsbiksdF9zdG9yZV9zZXRQcm9kdWN0RGVzY3JpcHRpb25TdHlsZXMobyx0LGUsbiksdF9zdG9yZV9zZXRQcm9kdWN0UHJpY2VTdHlsZXMobyx0LGUsbiksdF9zdG9yZV9zZXRQcm9kdWN0T2xkUHJpY2VTdHlsZXMobyx0LGUsbiksdF9zdG9yZV9zZXRQcm9kdWN0T3B0aW9uc1N0eWxlcyh0LGUpLHRfc3RvcmVfc2V0UHJvZHVjdENoYXJhY3RlcmlzdGljc1N0eWxlcyhvLHQsZSksdF9zdG9yZV9zZXRQcm9kdWN0QnJhbmRTdHlsZXMobyx0LGUpLHRfc3RvcmVfc2V0UHJvZHVjdFNrdVN0eWxlcyhvLHQsZSksdF9zdG9yZV9zZXRSZWxldmFudHNTbGlkZXJTdHlsZXModCxlKSx0X3N0b3JlX3NldFByb2R1Y3RUYWJzU3R5bGVzKG8sdCxlKX1mdW5jdGlvbiB0X3N0b3JlX3BhcnNlVHlwb1N0eWxlc0NvbmZpZyh0LGUscixvLG4pe2lmKHImJm8pdHJ5e3ZhciBpPUpTT04ucGFyc2Uocik7aWYoIWl8fCJvYmplY3QiIT10eXBlb2YgaSlyZXR1cm47dmFyIHM9e30sYT17fTtPYmplY3Qua2V5cyhpKS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT1pW3RdO3QuaW5jbHVkZXMoImxpbmVoZWlnaHQiKSYmIjAiPT09ZXx8dF9zdG9yZV9pc0VtcHR5VmFsdWUoZSl8fCgvX3Jlc180ODAkLy50ZXN0KHQpP2FbdC5yZXBsYWNlKC9fcmVzXzQ4MCQvLCIiKV09ZTpzW3RdPWUpfSkpO3ZhciBjPVtdLGw9W10sZD17Y29sb3I6ImNvbG9yIixmb250c2l6ZToiZm9udC1zaXplIixmb250ZmFtaWx5OiJmb250LWZhbWlseSIsbGluZWhlaWdodDoibGluZS1oZWlnaHQiLGZvbnR3ZWlnaHQ6ImZvbnQtd2VpZ2h0IixsZXR0ZXJzcGFjaW5nOiJsZXR0ZXItc3BhY2luZyIsbWFyZ2ludG9wOiJwYWRkaW5nLXRvcCIsbWFyZ2luYm90dG9tOiJwYWRkaW5nLWJvdHRvbSIsb3BhY2l0eToib3BhY2l0eSIsdXBwZXJjYXNlOiJ0ZXh0LXRyYW5zZm9ybSJ9O2lmKHRfc3RvcmVfYXBwbHlUeXBvQ29uZmlnKHMsYyxkLG4pLHRfc3RvcmVfYXBwbHlUeXBvQ29uZmlnKGEsbCxkLG4pLCFjLmxlbmd0aCYmIWwubGVuZ3RoKXJldHVybjt2YXIgcD0iI3JlYyIrdCsiICIrZSx1PSIiO2MubGVuZ3RoJiYodSs9cCsieyIrYy5qb2luKCIiKSsifSIpLGwubGVuZ3RoJiYodSs9IlxuQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDo0ODBweCl7IitwKyJ7IitsLmpvaW4oIiIpKyJ9fSIpLHRfc3RvcmVfY3JlYXRl0KFzc1N0eWxlVGFnKG8sdSl9Y2F0Y2goXyl7Y29uc29sZS5lcnJvcigidF9zdG9yZV9wYXJzZVR5cG9TdHlsZXNDb25maWcgZXJyb3IiLF8pfX1mdW5jdGlvbiB0X3N0b3JlX2lzRW1wdHlWYWx1ZSh0KXtyZXR1cm4gbnVsbD09dHx8IiI9PT10fWZ1bmN0aW9uIHRfc3RvcmVfaXNQZXJjZW50VmFsdWUodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiYvJSQvLnRlc3QodC50cmltKCkpfWZ1bmN0aW9uIHRfc3RvcmVfcGVyY2VudFRvRmxvYXQodCl7aWYodF9zdG9yZV9pc1BlcmNlbnRWYWx1ZSh0KSl7dmFyIGU9cGFyc2VGbG9hdCh0KTtyZXR1cm4gaXNOYU4oZSk/IiI6KGUvMTAwKS50b1N0cmluZygpfXJldHVybiB0fWZ1bmN0aW9uIHRfc3RvcmVfYnVpbGRUZXh0U2hhZG93KHQpe3ZhciBlPXQuc2hhZG93U2l6ZSxyPXQuc2hhZG93T3BhY2l0eTtpZighZXx8IXIpcmV0dXJuIG51bGw7dmFyIG89dF9zdG9yZV9wZXJjZW50VG9GbG9hdChyKSxuPXBhcnNlRmxvYXQobyk7cmV0dXJuIGlzTmFOKG4pJiYobj0xKSwiMCAwICIrZSsiIHJnYmEoMCwwLDAsIituKyIpIn1mdW5jdGlvbiB0X3N0b3JlX2FwcGx5VHlwb0NvbmZpZyh0LGUscixvKXt2YXIgbj17c2hhZG93U2l6ZTpudWxsLHNoYWRvd09wYWNpdHk6bnVsbH0saT1vfHxudWxsLHM9ZnVuY3Rpb24gdChlKXtyZXR1cm4haXx8aVtlXX07T2JqZWN0LmtleXModCkuZm9yRWFjaCgoZnVuY3Rpb24obyl7dmFyIGk9dFtvXTtzd2l0Y2gobyl7Y2FzZSJzaGFkb3dzaXplIjpuLnNoYWRvd1NpemU9aTticmVhaztjYXNlInNoYWRvd29wYWNpdHkiOm4uc2hhZG93T3BhY2l0eT1pO2JyZWFrO2Nhc2Uib3BhY2l0eSI6cygib3BhY2l0eSIpJiZ0X3N0b3JlX2FkZFJ1bGUoZSxyW29dLHRfc3RvcmVfcGVyY2VudFRvRmxvYXQoaSkpO2JyZWFrO2Nhc2UiY29sb3IiOnMoImNvbG9yIikmJnRfc3RvcmVfYWRkVGV4dENvbG9yUnVsZShlLGkpO2JyZWFrO2RlZmF1bHQ6cltvXSYmcyhyW29dKSYmdF9zdG9yZV9hZGRSdWxlKGUscltvXSxpKX19KSk7dmFyIGE9dF9zdG9yZV9idWlsZFRleHRTaGFkb3cobik7YSYmcygidGV4dC1zaGFkb3ciKSYmdF9zdG9yZV9hZGRSdWxlKGUsInRleHQtc2hhZG93IixhKX1mdW5jdGlvbiB0X3N0b3JlX3JlbW92ZVNpemVzRnJvbVN0eWxlc0xpbmUodCl7dmFyIGUscjtyZXR1cm4gdD90LnNwbGl0KCI7IikuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4hdC5tYXRjaCgvKGZvbnQtc2l6ZXxwYWRkaW5nLSh0b3B8Ym90dG9tKXxsaW5lLWhlaWdodCkvKX0pKS5qb2luKCI7Iik6IiJ9ZnVuY3Rpb24gdF9zdG9yZV9kcmF3UHJvZFBvcHVwX2RyYXdHYWxsZXJ5KHQsZSxyLG8pe3ZhciBuPTk4MCxpPSJodHRwczovL3N0YXRpYy50aWxkYWNkbi4iK3Rfc3RvcmVfX2dldFJvb3Rab25lKCkrIi9qcy90aWxkYS1jYXRhbG9nLXNsZHMtMS4wLm1pbi5qcyIscz1lO2lmKHdpbmRvdy5qUXVlcnkmJnMgaW5zdGFuY2VvZiBqUXVlcnkpe2lmKDA9PT1zLmxlbmd0aClyZXR1cm47cz1zWzBdfWlmKHMpe3ZhciBhPXMucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLXByb2Qtc2xpZGVyIiksYztpZihyLmdhbGxlcnkpaWYoMCE9PShjPSJzdHJpbmciPT10eXBlb2Ygci5nYWxsZXJ5P0pTT04ucGFyc2Uoci5nYWxsZXJ5KTpyLmdhbGxlcnkpLmxlbmd0aCl7dmFyIGw9ZnVuY3Rpb24gZSgpe3ZhciBhPXtyZWNpZDp0LGVsX3BvcHVwOnMscHJvZHVjdDpyLG9wdGlvbnM6byxnYWxsZXJ5QXJyOmN9LGwsZD13aW5kb3cuaXNNb2JpbGV8fCJvbnRvdWNoZW5kImluIGRvY3VtZW50JiYtMSE9PW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQXBwbGVXZWJLaXQiKT9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg6d2luZG93LmlubmVyV2lkdGg7aWYoby5nYWxsZXJ5U3R5bGUmJmQ+bnx8by5wb3B1cF9vcHRzLm1vYmlsZUdhbGxlcnlTdHlsZSYmZDw9bil0X3N0b3JlX19sb2FkSlNGaWxlKGksKGZ1bmN0aW9uKCl7dF9vbkZ1bmNMb2FkKCJ0X3N0b3JlX19pbml0Q3VzdG9tR2FsbGVyeSIsKGZ1bmN0aW9uKCl7dF9zdG9yZV9faW5pdEN1c3RvbUdhbGxlcnkoYSl9KSl9KSk7ZWxzZXtpZihvLmdhbGxlcnlTdHlsZSl7dmFyIHA9cy5xdWVyeVNlbGVjdG9yKCIudC1zdG9yZV9fcHJvZC1wb3B1cF9faW5mbyIpO3AmJnAuY2xhc3NMaXN0LnJlbW92ZSgidC1zdG9yZV9fcHJvZC1wb3B1cF9fY29sX2ZpeGVkIil9dF9zdG9yZV9faW5pdERlZmF1bHRHYWxsZXJ5KGEpfX07bCgpLHdpbmRvdy50X3N0b3JlX2RyYXdQcm9kUG9wdXBfcmVzaXplR2FsbGVyeUV2ZW50JiZ3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIix3aW5kb3cudF9zdG9yZV9kcmF3UHJvZFBvcHVwX3Jlc2l6ZUdhbGxlcnlFdmVudCksd2luZG93LnRfc3RvcmVfZHJhd1Byb2RQb3B1cF9yZXNpemVHYWxsZXJ5RXZlbnQ9ZnVuY3Rpb24oKXt2YXIgdCxlPXdpbmRvdy5pc01vYmlsZXx8Im9udG91Y2hlbmQiaW4gZG9jdW1lbnQmJi0xIT09bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJBcHBsZVdlYktpdCIpP2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDp3aW5kb3cuaW5uZXJXaWR0aCxyPSIuanMtc3RvcmUtZGVza3RvcC1jdXN0b20tZ2FsbGVyeSIsaT0iLmpzLXN0b3JlLW1vYmlsZS1jdXN0b20tZ2FsbGVyeSIscz1vLmdhbGxlcnlTdHlsZXx8IiIsYyxkLHA9cyYmLTEhPT1bImNvbDFfZml4ZWQiLCJjb2wyX2ZpeGVkIl0uaW5kZXhPZihzKSYmZT5uLHUsXz0oby5wb3B1cF9vcHRzLm1vYmlsZUdhbGxlcnlTdHlsZXx8IiIpJiZlPD1uO2lmKG8uZ2FsbGVyeVN0eWxlJiZlPj1ufHxvLnBvcHVwX29wdHMubW9iaWxlR2FsbGVyeVN0eWxlJiZlPG4pe2lmKGEucXVlcnlTZWxlY3RvcihyKSYmcHx8YS5xdWVyeVNlbGVjdG9yKGkpJiZfKXJldHVybn1lbHNlIGlmKGEucXVlcnlTZWxlY3RvcigiLnQtc2xkcyIpKXJldHVybjtsKCl9LHRfb25GdW5jTG9hZCgidF90aHJvdHRsZSIsKGZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdF90aHJvdHRsZSh3aW5kb3cudF9zdG9yZV9kcmF3UHJvZFBvcHVwX3Jlc2l6ZUdhbGxlcnlFdmVudCkpfSkpfWVsc2UgYSYmKGEuaW5uZXJIVE1MPSIiKTtlbHNlIGEmJihhLmlubmVySFRNTD0iIil9fWZ1bmN0aW9uIHRfc3RvcmVfX2luaXREZWZhdWx0R2FsbGVyeSh0KXt2YXIgZT10LmVsX3BvcHVwO2lmKGUpe3ZhciByPXQub3B0aW9ucztpZihyKXt2YXIgbz10LmdhbGxlcnlBcnI7aWYobyl7dmFyIG49dC5wcm9kdWN0O2lmKG4pe3ZhciBpPXQucmVjaWR8fCIiLHM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIraSksYT10X3N0b3JlX2dldF9wcm9kdWN0Y2FyZF9zbGlkZXJfaHRtbChzLHIpLGM9IiIsbD0iIixkPSJ0aHVtYnMiPT09ci5zbGlkZXJfb3B0cy5jb250cm9sc3x8ImFycm93c3RodW1icyI9PT1yLnNsaWRlcl9vcHRzLmNvbnRyb2xzfHwiZG90cyI9PT1yLnNsaWRlcl9vcHRzLmNvbnRyb2xzfHwiIj09PXIuc2xpZGVyX29wdHMuY29udHJvbHMscD0idGh1bWJzIj09PXIuc2xpZGVyX29wdHMuY29udHJvbHN8fCJhcnJvd3N0aHVtYnMiPT09ci5zbGlkZXJfb3B0cy5jb250cm9scyx1PXBhcnNlSW50KHIucG9wdXBfb3B0cy5jb2x1bW5zLDEwKSxfPStyLnNsaWRlcl9zbGlkZXNPcHRzLnJhdGlvLGY9NjAseT0xMCx2LGc7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChvLChmdW5jdGlvbih0LGUpe3ZhciBuPXRfc3RvcmVfZ2V0X3Byb2R1Y3RjYXJkX29uZVNsaWRlX2h0bWwocix0LGUpO2lmKGMrPW4ucmVwbGFjZSgiW1thY3RpdmVDbGFzc11dIiwwPT09ZT8idC1zbGRzX19pdGVtX2FjdGl2ZSI6IiIpLnJlcGxhY2UoIltbcHJvZHVjdENsYXNzXV0iLDA9PT1lPyJqcy1wcm9kdWN0LWltZyI6IiIpLnJlcGxhY2UoL1xbXFtpbmRleFxdXF0vZyxlKzEpLnJlcGxhY2UoL1xbXFtpbWdzb3VyY2VfbGF6eVxdXF0vZyx0X3N0b3JlX2dldExhenlVcmwocix0LmltZykpLnJlcGxhY2UoL1xbXFtpbWdzb3VyY2VcXVxdL2csdC5pbWcpLnJlcGxhY2UoL1xbXFtpbWdhbHR0ZXh0XF1cXS9nLHRfc3RvcmVfZXNjYXBlUXVvdGUodC5hbHQpKS5yZXBsYWNlKCJbW2ltYWdlQ2xhc3NdXSIsZTw9MT8idC1iZ2ltZyI6IiIpLGQpaWYocCYmImwiPT09ci5zbGlkZXJ0aHVtYnNzaWRlKXt2YXIgaT10X3N0b3JlX3Byb2RQb3B1cF9nYWxsZXJ5X2NhbGNNYXhUaHVtYnNDb3VudCh1LF8sZix5KTtlPD1pLTEmJihlPD1pLTJ8fGU9PT1vLmxlbmd0aC0xPyh2PXRfc3RvcmVfZ2V0X3Byb2R1Y3RjYXJkX29uZVNsaWRlckJ1bGxldF9odG1sKHIpLGc9di5yZXBsYWNlKCJbW3ZpZGVvUGxheUljb25dXSIsIiIpLnJlcGxhY2UoIltbYWN0aXZlQ2xhc3NdXSIsMD09PWU/InQtc2xkc19fYnVsbGV0X2FjdGl2ZSI6IiIpLnJlcGxhY2UoL1xbXFtpbmRleFxdXF0vZyxlKzEpLnJlcGxhY2UoL1xbXFtpbWdzb3VyY2VfbGF6eVxdXF0vZyx0X3N0b3JlX2dldExhenlVcmwocix0LmltZykpLnJlcGxhY2UoL1xbXFtpbWdzb3VyY2VcXVxdL2csdC5pbWcpLnJlcGxhY2UoL1xbXFtpbWdhbHR0ZXh0XF1cXS9nLHRfc3RvcmVfZXNjYXBlUXVvdGUodC5hbHQpKSk6KHY9dF9zdG9yZV9nZXRfcHJvZHVjdGNhcmRfdGh1bWJzR2FsbGVyeV9odG1sKHIsby5sZW5ndGgsaSksZz12LnJlcGxhY2UoIltbYWN0aXZlQ2xhc3NdXSIsMD09PWU/InQtc2xkc19fYnVsbGV0X2FjdGl2ZSI6IiIpLnJlcGxhY2UoL1xbXFtpbmRleFxdXF0vZyxlKzEpLnJlcGxhY2UoL1xbXFtpbWdzb3VyY2VfbGF6eVxdXF0vZyx0X3N0b3JlX2dldExhenlVcmwocix0LmltZykpLnJlcGxhY2UoL1xbXFtpbWdzb3VyY2VcXVxdL2csdC5pbWcpLnJlcGxhY2UoL1xbXFtpbWdhbHR0ZXh0XF1cXS9nLHRfc3RvcmVfZXNjYXBlUXVvdGUodC5hbHQpKSksbCs9Zyl9ZWxzZSB2PXRfc3RvcmVfZ2V0X3Byb2R1Y3RjYXJkX29uZVNsaWRlckJ1bGxldF9odG1sKHIpLGc9di5yZXBsYWNlKCJbW3ZpZGVvUGxheUljb25dXSIsdC52aWRlbz8nPGRpdiBjbGFzcz0idC1zbGRzX19wbGF5X2ljb24iPicrdF9zdG9yZV9zdmdWaWRlb0ljb24ocikrIjwvZGl2PiI6IiIpLnJlcGxhY2UoIltbYWN0aXZlQ2xhc3NdXSIsMD09PWU/InQtc2xkc19fYnVsbGV0X2FjdGl2ZSI6IiIpLnJlcGxhY2UoL1xbXFtpbmRleFxdXF0vZyxlKzEpLnJlcGxhY2UoL1xbXFtpbWdzb3VyY2VfbGF6eVxdXF0vZyx0X3N0b3JlX2dldExhenlVcmwocix0LmltZykpLnJlcGxhY2UoL1xbXFtpbWdzb3VyY2VcXVxdL2csdC5pbWcpLnJlcGxhY2UoL1xbXFtpbWdhbHR0ZXh0XF1cXS9nLHRfc3RvcmVfZXNjYXBlUXVvdGUodC5hbHQpKSxsKz1nfSkpLGE9YS5yZXBsYWNlKCJbW3NsaWRlc11dIixjKSxkJiYoYT1hLnJlcGxhY2UoIltbYnVsbGV0c11dIixsKSk7dmFyIG09ZS5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtcHJvZC1zbGlkZXIiKTttJiYobS5pbm5lckhUTUw9YSksdF9zdG9yZV9nYWxsZXJ5VmlkZW9IYW5kbGUoaSk7dmFyIGg9Ii50LXNsZHNfX2Fycm93X2NvbnRhaW5lciwgLnQtc2xkc19fYnVsbGV0X3dyYXBwZXIsIC50LXNsZHNfX3RodW1ic2J1bGxldC13cmFwcGVyIixiPWUucXVlcnlTZWxlY3RvckFsbChoKSx3O2ImJigxPT09by5sZW5ndGg/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLChmdW5jdGlvbih0KXt0LnN0eWxlLmRpc3BsYXk9Im5vbmUifSkpOkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYiwoZnVuY3Rpb24odCl7dC5zdHlsZS5kaXNwbGF5PSIifSkpKSwibCI9PT1yLnNsaWRlcnRodW1ic3NpZGUmJih3PXt0aHVtYnNidWxsZXRHYWxsZXJ5OiEwLHN0b3JlT3B0aW9uczpyfSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0X3N0b3JlX29uRnVuY0xvYWQoInRfc2xkc0luaXQiLChmdW5jdGlvbigpe3Rfc2xkc0luaXQoaSsiIC5qcy1zdG9yZS1wcm9kdWN0Iix3KSx0X3N0b3JlX19hZGRTbGlkZUNoYW5nZUxpc3RlbmVyKGkpO3ZhciB0PXRfc3RvcmVfcHJvZHVjdF9kZXRlY3RFZGl0aW9uQnlDb250cm9scyhlLG4pO3QmJnRfc3RvcmVfcHJvZHVjdF91cGRhdGVFZGl0aW9uX21vdmVTbGlkZXIoaSxlLHQpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dF9zbGRzX3VwZGF0ZVNsaWRlcihzKX0pLDIwMCl9KSl9KSwyMDApfX19fX1mdW5jdGlvbiB0X3N0b3JlX2dhbGxlcnlWaWRlb0hhbmRsZSh0KXt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIit0KTtpZihlKXt2YXIgcj1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX3BsYXlfaWNvbiIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwociwoZnVuY3Rpb24odCl7dCYmdC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlLHI9dC5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19mcmFtZS13cmFwcGVyIik7cnx8KChyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKS5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfX2ZyYW1lLXdyYXBwZXIiKSx0aGlzLmluc2VydEFkamFjZW50RWxlbWVudCgiYWZ0ZXJlbmQiLHIpKSxyLnN0eWxlLnpJbmRleD0zO3ZhciBvPXRoaXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci12aWRlby10eXBlIiksbj10aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdmlkZW8tdXJsIiksaT10aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdmlkZW8taGFzaCIpLHM9dGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXZpZGVvLXRpbWUiKSxhPXRoaXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci12aWRlby1wYXJhbXMiKSxjLGw9dF9zdG9yZV9fZ2V0VmlkZW9FbGVtZW50KG8se3ZpZGVvSWQ6bix2aWRlb0hhc2g6aSx2aWRlb1RpbWU6cyx2a09JRDp0aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdmlkZW8tb2lkIiksdmlkZW9QYXJhbXM6YX0pO2lmKGwpe3IuaW5ucmVIdG1sPSIiLHIuYXBwZW5kQ2hpbGQobCk7dmFyIGQ9ZnVuY3Rpb24gdCgpe2wucmVtb3ZlKCksci5zdHlsZS56SW5kZXg9IiJ9O2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInBvcHVwSGlkZGVuIixkLHtvbmNlOiEwfSk7dmFyIHA9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIik7cCYmcC5hZGRFdmVudExpc3RlbmVyKCJzbGlkZUNoYW5nZVN0YXJ0IixkLHtvbmNlOiEwfSk7dmFyIHU9dC5jbG9zZXN0KCIuanMtcHJvZHVjdCIpO3UmJnUuYWRkRXZlbnRMaXN0ZW5lcigidFN0b3JlVmFyaWFudENoYW5nZSIsZCx7b25jZTohMH0pfX0pKX0pKX19ZnVuY3Rpb24gdF9zdG9yZV9fZ2V0VmlkZW9FbGVtZW50KHQsZSl7aWYoIXQpcmV0dXJuIG51bGw7dmFyIHI9ZS52aWRlb0lkLG89ZS52aWRlb0hhc2gsbj1lLnZpZGVvVGltZSxpPWUudmtPSUQscz1lLnZpZGVvUGFyYW1zLGEsYyxsPXt5b3V0dWJlOntiYXNlVXJsOiJodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8iK3IscGFyYW1zOlsicmVsPTAiLCJmbXQ9MTgiLCJodG1sNT0xIiwic2hvd2luZm89MCIsImF1dG9wbGF5PTEiLCJtdXRlZD0xIiwiZW5hYmxlIixuJiYic3RhcnQ9IituXX0sdmltZW86e2Jhc2VVcmw6Imh0dHBzOi8vcGxheWVyLnZpbWVvLmNvbS92aWRlby8iK3IscGFyYW1zOlsidGl0bGU9MCIsImJ5bGluZT0wIiwicG9ydHJhaXQ9MCIsImJhZGdlPTAiLCJjb2xvcj1mZmZmZmYiLCJhdXRvcGxheT0xIiwibXV0ZWQ9MSIsbyYmImg9IitvXSxoYXNodGFnOm4/IiN0PSIrbjoiIn0sa2luZXNjb3BlOntiYXNlVXJsOiJodHRwczovL2tpbmVzY29wZS5pby9lbWJlZC8iK3IscGFyYW1zOlsiYXV0b3BsYXk9MSIsIm11dGVkPTEiLG4mJiJ0PSIrbl19LHJ1dHViZTp7YmFzZVVybDoiaHR0cHM6Ly9ydXR1YmUucnUvZW1iZWQvIityLHBhcmFtczpbImF1dG9wbGF5PTEiLCJtdXRlZD0xIixuJiYidD0iK24sbyYmInA9IitvXX0sdms6e2Jhc2VVcmw6Imh0dHBzOi8vdmt2aWRlby5ydS92aWRlb19leHQucGhwIixwYXJhbXM6WyJqc19hcGk9MSIsImhkPTIiLCJhdXRvcGxheT0xIiwibXV0ZWQ9MSIsImlkPSIrciwib2lkPSIraSxvJiYiaGFzaD0iK28sbiYmInQ9IituXX19W3QucmVwbGFjZSgvXC5jb20vLCIiKV07aWYoIWwpcmV0dXJuIG51bGw7dmFyIGQ9bC5iYXNlVXJsLHA9bC5wYXJhbXMsdT1sLmhhc2h0YWcsXz12b2lkIDA9PT11PyIiOnUsZix5O3JldHVybiBzJiZwLnB1c2gocyksdihkKyI/IitwLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHR9KSkuam9pbigiJiIpK18pO2Z1bmN0aW9uIHYodCxlKXt2YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmb3IodmFyIG8gaW4gci5zcmM9dCxyLmNsYXNzTGlzdC5hZGQoInQtc2xkc19fZnJhbWUiKSxyLndpZHRoPSIxMDAlIixyLmhlaWdodD0iMTAwJSIsci5mcmFtZUJvcmRlcj0iMCIsci5hbGxvd0Z1bGxzY3JlZW49ITAsci5zZXRBdHRyaWJ1dGUoIm1vemFsbG93ZnVsbHNjcmVlbiIsInRydWUiKSxyLnNldEF0dHJpYnV0ZSgibXNhbGxvd2Z1bGxzY3JlZW4iLCJ0cnVlIiksci5zZXRBdHRyaWJ1dGUoIm9hbGxvd2Z1bGxzY3JlZW4iLCJ0cnVlIiksci5zZXRBdHRyaWJ1dGUoIndlYmtpdGFsbG93ZnVsbHNjcmVlbiIsInRydWUiKSxyLnNjcm9sbGluZz0ibm8iLHIuYWxsb3c9ImNsaXBib2FyZC13cml0ZTsgYXV0b3BsYXk7IGZ1bGxzY3JlZW47IHBpY3R1cmUtaW4tcGljdHVyZTsgZW5jcnlwdGVkLW1lZGlhOyBneXJvc2NvcGU7IGFjY2VsZXJvbWV0ZXI7IixlKWUuaGFzT3duUHJvcGVydHkobykmJnIuc2V0QXR0cmlidXRlKG8sZVtvXSk7cmV0dXJuIHJ9fWZ1bmN0aW9uIHRfc3RvcmVfYWRkVmlkZW9JY29uRm9yR2FsbGVyeSh0LGUpe3ZhciByPSIiLG89ZS52aWRlbztpZihvKXt2YXIgbj1lLnZpZGVvaWQsaT12b2lkIDA9PT1uPyIiOm4scz1lLnZ0eXBlLGE9dm9pZCAwPT09cz8iIjpzLGM9ZS52aGFzaCxsPXZvaWQgMD09PWM/IiI6YyxkPWUudnRpbWUscD12b2lkIDA9PT1kPyIiOmQsdT1lLnZvaWR8fCIiLF89IiI7InlvdXR1YmUuY29tIj09PWUudnR5cGUmJi0xIT09by5pbmRleE9mKCI/dj0iK2UudmlkZW9pZCkmJi0xIT09KF89KF89by5zcGxpdCgiP3Y9IitlLnZpZGVvaWQpWzFdKS5yZXBsYWNlKC8mYW1wOy9nLCImIikpLmluZGV4T2YoImxvb3A9MSIpJiYtMT09PV8uaW5kZXhPZigiJnBsYXlsaXN0PSIpJiYoXys9IiZwbGF5bGlzdD0iK2UudmlkZW9pZCkscis9J1xuICAgICAgICAgICAgPGRpdiBjbGFzcz0idC1zbGRzX192aWRlb3dyYXBwZXIiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InQtc2xkc19fcGxheV9pY29uIlxuICAgICAgICAgICAgICAgICAgICBkYXRhLXNsaWRlci12aWRlby11cmw9IicraSsnIlxuICAgICAgICAgICAgICAgICAgICBkYXRhLXNsaWRlci12aWRlby10eXBlPSInK2ErJyJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1zbGlkZXItdmlkZW8taGFzaD0iJytsKyciXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtc2xpZGVyLXZpZGVvLW9pZD0iJyt1KyciXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtc2xpZGVyLXZpZGVvLXRpbWU9IicrcCsnIlxuICAgICAgICAgICAgICAgICAgICBkYXRhLXNsaWRlci12aWRlby1wYXJhbXM9IicrXysnIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICcrdF9zdG9yZV9zdmdWaWRlb0ljb24odCkrJ1xuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InQtc2xkc19fZnJhbWUtd3JhcHBlciI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj4nfXJldHVybiByfWZ1bmN0aW9uIHRfc3RvcmVfc3ZnVmlkZW9JY29uKHQpe3ZhciBlPSIiLHI7cmV0dXJuIGUrPSc8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjcwcHgiIGhlaWdodD0iNzBweCIgdmlld0JveD0iMCAwIDYwIDYwIiBzdHlsZT0id2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTsiPicsZSs9JzxnIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSIiIGZpbGwtcnVsZT0iZXZlbm9kZCI+JyxlKz0nPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTY5MS4wMDAwMDAsIC0zNTE0LjAwMDAwMCkiIGZpbGw9IicrKHQuc2xpZGVyX29wdHMudmlkZW9QbGF5ZXJJY29uQ29sb3J8fCIjZmZmIikrJyI+JyxlKz0nPHBhdGggZD0iTTcyMSwzNTc0IEM3MzcuNTY4NTQyLDM1NzQgNzUxLDM1NjAuNTY4NTQgNzUxLDM1NDQgQzc1MSwzNTI3LjQzMTQ2IDczNy41Njg1NDIsMzUxNCA3MjEsMzUxNCBDNzA0LjQzMTQ1OCwzNTE0IDY5MSwzNTI3LjQzMTQ2IDY5MSwzNTQ0IEM2OTEsMzU2MC41Njg1NCA3MDQuNDMxNDU4LDM1NzQgNzIxLDM1NzQgWiBNNzE1LDM1MzQgTDczMiwzNTQ0LjUgTDcxNSwzNTU1IEw3MTUsMzUzNCBaIj48L3BhdGg+JyxlKz0iPC9nPiIsZSs9IjwvZz4iLGUrPSI8L3N2Zz4ifWZ1bmN0aW9uIHRfc3RvcmVfcHJvZFBvcHVwX3VwZGF0ZUdhbGxlcnlUaHVtYnModCxlLHIsbyl7dmFyIG49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrdCksaSxzO2lmKCEoInRodW1icyI9PT1vLnNsaWRlcl9vcHRzLmNvbnRyb2xzfHwiYXJyb3dzdGh1bWJzIj09PW8uc2xpZGVyX29wdHMuY29udHJvbHMpJiYibCI9PT1vLnNsaWRlcnRodW1ic3NpZGUmJnIuZ2FsbGVyeSl7aT0ic3RyaW5nIj09dHlwZW9mIHIuZ2FsbGVyeT9KU09OLnBhcnNlKHIuZ2FsbGVyeSk6ci5nYWxsZXJ5O3ZhciBhPWUucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLXByb2Qtc2xpZGVyIik7aWYoMCE9PWkubGVuZ3RoKXt2YXIgYz1wYXJzZUludChvLnBvcHVwX29wdHMuY29sdW1ucywxMCksbD0rby5zbGlkZXJfc2xpZGVzT3B0cy5yYXRpbyxkPTYwLHA9MTAsdT1uLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX3RodW1ic2J1bGxldCIpLmxlbmd0aCxfPXRfc3RvcmVfcHJvZFBvcHVwX2dhbGxlcnlfY2FsY01heFRodW1ic0NvdW50KGMsbCxkLHApLGYseSx2LGcsbTtpZih1IT09XyYmaS5sZW5ndGg+PV98fHU8XyYmdSE9PWkubGVuZ3RoKUFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaSwoZnVuY3Rpb24odCxlKXtlPD1fLTEmJihlPD1fLTJ8fGU9PT1pLmxlbmd0aC0xPyh5PXRfc3RvcmVfZ2V0X3Byb2R1Y3RjYXJkX29uZVNsaWRlckJ1bGxldF9odG1sKG8pLHY9eS5yZXBsYWNlKCJbW3ZpZGVvUGxheUljb25dXSIsIiIpLnJlcGxhY2UoIltbYWN0aXZlQ2xhc3NdXSIsMD09PWU/InQtc2xkc19fYnVsbGV0X2FjdGl2ZSI6IiIpLnJlcGxhY2UoL1xbXFtpbmRleFxdXF0vZyxlKzEpLnJlcGxhY2UoL1xbXFtpbWdzb3VyY2VfbGF6eVxdXF0vZyx0X3N0b3JlX2dldExhenlVcmwobyx0LmltZykpLnJlcGxhY2UoL1xbXFtpbWdzb3VyY2VcXVxdL2csdC5pbWcpLnJlcGxhY2UoL1xbXFtpbWdhbHR0ZXh0XF1cXS9nLHRfc3RvcmVfZXNjYXBlUXVvdGUodC5hbHQpKSk6KHk9dF9zdG9yZV9nZXRfcHJvZHVjdGNhcmRfdGh1bWJzR2FsbGVyeV9odG1sKG8saS5sZW5ndGgsXyksdj15LnJlcGxhY2UoIltbYWN0aXZlQ2xhc3NdXSIsMD09PWU/InQtc2xkc19fYnVsbGV0X2FjdGl2ZSI6IiIpLnJlcGxhY2UoL1xbXFtpbmRleFxdXF0vZyxlKzEpLnJlcGxhY2UoL1xbXFtpbWdzb3VyY2VfbGF6eVxdXF0vZyx0X3N0b3JlX2dldExhenlVcmwobyx0LmltZykpLnJlcGxhY2UoL1xbXFtpbWdzb3VyY2VcXVxdL2csdC5pbWcpLnJlcGxhY2UoL1xbXFtpbWdhbHR0ZXh0XF1cXS9nLHRfc3RvcmVfZXNjYXBlUXVvdGUodC5hbHQpKSksZis9dil9KSksbi5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX190aHVtYnNidWxsZXQtd3JhcHBlciIpLmlubmVySFRNTD1mLCJsIj09PW8uc2xpZGVydGh1bWJzc2lkZSYmKG09e3RodW1ic2J1bGxldEdhbGxlcnk6ITAsc3RvcmVPcHRpb25zOm99KSx0X3NsZHNJbml0KHQrIiAuanMtc3RvcmUtcHJvZHVjdCIsbSksdF9zdG9yZV9wb3B1cF91cGRhdGVMYXp5TG9hZCgpfWVsc2UgYSYmKGEuaW5uZXJIVE1MPSIiKX19ZnVuY3Rpb24gdF9zdG9yZV9wcm9kUG9wdXBfZ2FsbGVyeV9jYWxjTWF4VGh1bWJzQ291bnQodCxlLHIsbyl7dmFyIG49dF9zdG9yZV9nZXRDb2x1bW5XaWR0aCh0KSxpPXdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGh8fGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGg7aT49OTYwJiZpPD0xMjQwJiYobj00NDApO3ZhciBzPU1hdGguZmxvb3IoMTAwKmUpLGE9TWF0aC5mbG9vcihzKihuLShyK28pKS8xMDApLGM9TWF0aC5mbG9vcihhLyhyK28pKTtyZXR1cm4ocitvKSooYysxKS1vPD1hJiYoYys9MSksY31mdW5jdGlvbiB0X3N0b3JlX2dldF9wcm9kdWN0Y2FyZF9zbGlkZXJfaHRtbCh0LGUpe3ZhciByPSIiLG89InQtc2xkc19hbmltYXRlZC1ub25lIixuPSIzMDAiOyJmYXN0Ij09PWUuc2xpZGVyX29wdHMuYW5pbV9zcGVlZCYmKG89InQtc2xkc19hbmltYXRlZC1mYXN0IiksInNsb3ciPT09ZS5zbGlkZXJfb3B0cy5hbmltX3NwZWVkJiYobz0idC1zbGRzX2FuaW1hdGVkLXNsb3ciLG49IjUwMCIpO3ZhciBpPSIiLHM7aWYoKCJ0aHVtYnMiPT09ZS5zbGlkZXJfb3B0cy5jb250cm9sc3x8ImFycm93c3RodW1icyI9PT1lLnNsaWRlcl9vcHRzLmNvbnRyb2xzKSYmImwiPT09ZS5zbGlkZXJ0aHVtYnNzaWRlJiYoaT0idC1zbGRzX190aHVtYnNidWxsZXRzLXdpdGgtZ2FsbGVyeSIpLHIrPSc8ZGl2IGNsYXNzPSJ0LXNsZHMgJytpKyciIHN0eWxlPSJ2aXNpYmlsaXR5OiBoaWRkZW47Ij4nLHIrPScgICAgPGRpdiBjbGFzcz0idC1zbGRzX19tYWluIj4nLHIrPScgICAgICAgIDxkaXYgY2xhc3M9InQtc2xkc19fY29udGFpbmVyIiBbW2NvbnRhaW5lclN0eWxlc11dPicscis9JyAgICAgICAgICAgIDxkaXYgY2xhc3M9InQtc2xkc19faXRlbXMtd3JhcHBlciAnK28rJyBbW25vQ3ljbGVDbGFzc11dIiBkYXRhLXNsaWRlci10cmFuc2l0aW9uPSInK24rJyIgZGF0YS1zbGlkZXItd2l0aC1jeWNsZT0iW1tpc0N5Y2xlZF1dIiBkYXRhLXNsaWRlci1jb3JyZWN0LWhlaWdodD0idHJ1ZSIgZGF0YS1hdXRvLWNvcnJlY3QtbW9iaWxlLXdpZHRoPSJmYWxzZSI+JyxyKz0iICAgICAgICAgICAgICAgIFtbc2xpZGVzXV0iLHIrPSIgICAgICAgICAgICA8L2Rpdj4iLHIrPSIgICAgICAgICAgICBbW2Fycm93c11dIixyKz0iICAgICAgICA8L2Rpdj4iLHIrPSIgICAgPC9kaXY+IixyKz0iICAgIFtbYnVsbGV0c11dIixyKz0iPC9kaXY+IiwiYXJyb3dzIj09PWUuc2xpZGVyX29wdHMuY29udHJvbHN8fCJhcnJvd3N0aHVtYnMiPT09ZS5zbGlkZXJfb3B0cy5jb250cm9sc3x8IiI9PT1lLnNsaWRlcl9vcHRzLmNvbnRyb2xzKXt2YXIgYSxjPXQucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLXRwbC1zbGlkZXItYXJyb3dzIikuaW5uZXJIVE1MLGw7Yz0nPGRpdiBjbGFzcz0iJysoInQtc2xkc19fYXJyb3dfY29udGFpbmVyICIrKCIiPT09ZS5zbGlkZXJfb3B0cy5jeWNsZT8idC1zbGRzX19ub2N5Y2xlIjoiIikpKyciPicrYysiPC9kaXY+IixyPXIucmVwbGFjZSgiW1thcnJvd3NdXSIsYyl9ZWxzZSByPXIucmVwbGFjZSgiW1thcnJvd3NdXSIsIiIpO2lmKCJ0aHVtYnMiPT09ZS5zbGlkZXJfb3B0cy5jb250cm9sc3x8ImFycm93c3RodW1icyI9PT1lLnNsaWRlcl9vcHRzLmNvbnRyb2xzKXt2YXIgZD0nPGRpdiBjbGFzcz0idC1zbGRzX190aHVtYnNidWxsZXQtd3JhcHBlciAnKygiY29udGFpbiI9PT1lLnNsaWRlcl9zbGlkZXNPcHRzLmJnc2l6ZT8idC1hbGlnbl9jZW50ZXIiOiIiKSsnIj5bW2J1bGxldHNdXTwvZGl2Pic7cj1yLnJlcGxhY2UoIltbYnVsbGV0c11dIixkKX1lbHNlIHI9ImRvdHMiPT09ZS5zbGlkZXJfb3B0cy5jb250cm9sc3x8IiI9PT1lLnNsaWRlcl9vcHRzLmNvbnRyb2xzP3IucmVwbGFjZSgiW1tidWxsZXRzXV0iLCc8ZGl2IGNsYXNzPSJ0LXNsZHNfX2J1bGxldF93cmFwcGVyIj5bW2J1bGxldHNdXTwvZGl2PicpOnIucmVwbGFjZSgiW1tidWxsZXRzXV0iLCIiKTtyZXR1cm4gcj1yLnJlcGxhY2UoIltbY29udGFpbmVyU3R5bGVzXV0iLGUuc2xpZGVyX29wdHMuYmdjb2xvcj8nc3R5bGU9ImJhY2tncm91bmQtY29sb3I6JytlLnNsaWRlcl9vcHRzLmJnY29sb3IrJzsiJzoiIikucmVwbGFjZSgiW1tub0N5Y2xlQ2xhc3NdXSIsZS5zbGlkZXJfb3B0cy5jeWNsZT8iIjoidC1zbGRzX19ub2N5Y2xlIikucmVwbGFjZSgiW1tpc0N5Y2xlZF1dIixlLnNsaWRlcl9vcHRzLmN5Y2xlPyJ0cnVlIjoiZmFsc2UiKX1mdW5jdGlvbiB0X3N0b3JlX2dldF9wcm9kdWN0Y2FyZF9vbmVTbGlkZV9odG1sKHQsZSl7dmFyIHI9IiI7cmV0dXJuIHIrPSc8ZGl2IGNsYXNzPSJ0LXNsZHNfX2l0ZW0gW1thY3RpdmVDbGFzc11dIiBkYXRhLXNsaWRlLWluZGV4PSJbW2luZGV4XV0iPicscis9JyAgICA8ZGl2IGNsYXNzPSJ0LXNsZHNfX3dyYXBwZXIiIGl0ZW1zY29wZSBpdGVtdHlwZT0iaHR0cHM6Ly9zY2hlbWEub3JnL0ltYWdlT2JqZWN0Ij4nLHIrPScgICAgICAgIDxtZXRhIGl0ZW1wcm9wPSJpbWFnZSIgY29udGVudD0iW1tpbWdzb3VyY2VdXSI+JyxyKz0nICAgICAgICA8bWV0YSBpdGVtcHJvcD0iY2FwdGlvbiIgY29udGVudD0iW1tpbWdhbHR0ZXh0XV0iPicscis9JyAgICAgICAgPGRpdiBjbGFzcz0idC1zbGRzX19pbWd3cmFwcGVyIFtbem9vbUNsYXNzXV0iIFtbem9vbUF0dHJzXV0+JyxyKz0nICAgICAgICAgICAgPGRpdiBjbGFzcz0idC1zbGRzX19iZ2ltZyBbW2NvbnRhaW5DbGFzc11dIFtbaW1hZ2VDbGFzc11dIFtbcHJvZHVjdENsYXNzXV0iIGRhdGEtb3JpZ2luYWw9IltbaW1nc291cmNlXV0iIHN0eWxlPSJwYWRkaW5nLWJvdHRvbTpbW3BhZGRpbmdCb3R0b21WYWxdXTsgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwnW1tpbWdzb3VyY2VfbGF6eV1dXCcpOyI+JyxyKz0iICAgICAgICAgICAgPC9kaXY+IixyKz0iICAgICAgICA8L2Rpdj4iLHIrPXRfc3RvcmVfYWRkVmlkZW9JY29uRm9yR2FsbGVyeSh0LGUpLHIrPSIgICAgPC9kaXY+IixyPShyKz0iPC9kaXY+IikucmVwbGFjZSgiW1t6b29tQXR0cnNdXSIsdC5zbGlkZXJfc2xpZGVzT3B0cy56b29tYWJsZT8nZGF0YS16b29tLXRhcmdldD0iW1tpbmRleF1dIiBkYXRhLXpvb21hYmxlPSJ5ZXMiIGRhdGEtaW1nLXpvb20tdXJsPSJbW2ltZ3NvdXJjZV1dIic6IiIpLnJlcGxhY2UoIltbem9vbUNsYXNzXV0iLHQuc2xpZGVyX3NsaWRlc09wdHMuem9vbWFibGU/InQtem9vbWFibGUiOiIiKS5yZXBsYWNlKCJbW2NvbnRhaW5DbGFzc11dIiwiY29udGFpbiI9PT10LnNsaWRlcl9zbGlkZXNPcHRzLmJnc2l6ZT8idC1zbGRzX19iZ2ltZy1jb250YWluIjoiIikucmVwbGFjZSgiW1twYWRkaW5nQm90dG9tVmFsXV0iLDEwMCp0LnNsaWRlcl9zbGlkZXNPcHRzLnJhdGlvKyIlIil9ZnVuY3Rpb24gdF9zdG9yZV9nZXRfcHJvZHVjdGNhcmRfb25lU2xpZGVyQnVsbGV0X2h0bWwodCl7dmFyIGU9IiI7aWYoInRodW1icyIhPT10LnNsaWRlcl9vcHRzLmNvbnRyb2xzJiYiYXJyb3dzdGh1bWJzIiE9PXQuc2xpZGVyX29wdHMuY29udHJvbHN8fChlKz0nPGRpdiBjbGFzcz0idC1zbGRzX190aHVtYnNidWxsZXQgdC1zbGRzX19idWxsZXQgW1thY3RpdmVDbGFzc11dIiBkYXRhLXNsaWRlLWJ1bGxldC1mb3I9IltbaW5kZXhdXSI+JyxlKz0iICAgIFtbdmlkZW9QbGF5SWNvbl1dIixlKz0nICAgIDxkaXYgY2xhc3M9InQtc2xkc19fYmdpbWcgdC1iZ2ltZyIgZGF0YS1vcmlnaW5hbD0iW1tpbWdzb3VyY2VdXSIgc3R5bGU9InBhZGRpbmctYm90dG9tOiAxMDAlOyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCdbW2ltZ3NvdXJjZV9sYXp5XV1cJyk7Ij48L2Rpdj4nLGUrPScgICAgPGRpdiBjbGFzcz0idC1zbGRzX190aHVtYnNidWxsZXQtYm9yZGVyIj48L2Rpdj4nLGUrPSI8L2Rpdj4iKSwiZG90cyI9PT10LnNsaWRlcl9vcHRzLmNvbnRyb2xzfHwiIj09PXQuc2xpZGVyX29wdHMuY29udHJvbHMpe2UrPSc8ZGl2IGNsYXNzPSJ0LXNsZHNfX2J1bGxldCBbW2FjdGl2ZUNsYXNzXV0iIGRhdGEtc2xpZGUtYnVsbGV0LWZvcj0iW1tpbmRleF1dIj4nLGUrPScgICAgPGRpdiBjbGFzcz0idC1zbGRzX19idWxsZXRfYm9keSIgW1tzdHlsZXNdXT48L2Rpdj4nLGUrPSI8L2Rpdj4iO3ZhciByPSIiO2lmKHQuc2xpZGVyX2RvdHNPcHRzLnNpemUpe3ZhciBvPXBhcnNlSW50KHQuc2xpZGVyX2RvdHNPcHRzLnNpemUsMTApO3IrPSJ3aWR0aDoiKyhvPW8+MjA/MjA6bykrInB4O2hlaWdodDoiK28rInB4OyJ9aWYodC5zbGlkZXJfZG90c09wdHMuYmdjb2xvciYmKHIrPSJiYWNrZ3JvdW5kLWNvbG9yOiIrdC5zbGlkZXJfZG90c09wdHMuYmdjb2xvcisiOyIpLHQuc2xpZGVyX2RvdHNPcHRzLmJvcmRlcnNpemUpe3ZhciBuPXQuc2xpZGVyX2RvdHNPcHRzLmJnY29sb3JhY3RpdmU/dC5zbGlkZXJfZG90c09wdHMuYmdjb2xvcmFjdGl2ZToiIzIyMiI7cis9ImJvcmRlcjogIit0LnNsaWRlcl9kb3RzT3B0cy5ib3JkZXJzaXplKyIgc29saWQgIituKyI7In1lPWUucmVwbGFjZSgiW1tzdHlsZXNdXSIsIiIhPT1yPydzdHlsZT0iJytyKyciJzoiIil9cmV0dXJuIGV9ZnVuY3Rpb24gdF9zdG9yZV9nZXRfcHJvZHVjdGNhcmRfdGh1bWJzR2FsbGVyeV9odG1sKHQsZSxyKXt2YXIgbz0iIixuPWUtcjtpZigidGh1bWJzIj09PXQuc2xpZGVyX29wdHMuY29udHJvbHN8fCJhcnJvd3N0aHVtYnMiPT09dC5zbGlkZXJfb3B0cy5jb250cm9scyl7dmFyIGk9InQtc2xkc19fdGh1bWJzYnVsbGV0IHQtc2xkc19fYnVsbGV0IHQtc2xkc19fdGh1bWJzX2dhbGxlcnkgW1thY3RpdmVDbGFzc11dIjt0LnNsaWRlcl9zbGlkZXNPcHRzLnpvb21hYmxlJiYoaSs9IiB0LXNsZHNfX3RodW1ic19nYWxsZXJ5LXpvb21hYmxlIiksbys9JzxkaXYgY2xhc3M9IicraSsnIiBbW3pvb21BdHRyc11dIGRhdGEtZ2FsbGVyeS1sZW5ndGg9IicrbisnIiBkYXRhLXNsaWRlLWJ1bGxldC1mb3I9IicrcisnIj4nLG8rPScgICAgPGRpdiBjbGFzcz0idC1zbGRzX19iZ2ltZyB0LWJnaW1nIiBkYXRhLW9yaWdpbmFsPSJbW2ltZ3NvdXJjZV1dIiBzdHlsZT0icGFkZGluZy1ib3R0b206IDEwMCU7IGJhY2tncm91bmQtaW1hZ2U6IHVybChcJ1tbaW1nc291cmNlX2xhenldXVwnKTsiPjwvZGl2Picsbys9JyAgICA8ZGl2IGNsYXNzPSJ0LXNsZHNfX3RodW1ic2J1bGxldC1ib3JkZXIiPjwvZGl2Picsbz0obys9IjwvZGl2PiIpLnJlcGxhY2UoIltbem9vbUF0dHJzXV0iLHQuc2xpZGVyX3NsaWRlc09wdHMuem9vbWFibGU/J2RhdGEtem9vbS10YXJnZXQ9IltbaW5kZXhdXSIgZGF0YS16b29tYWJsZT0ieWVzIiBkYXRhLWltZy16b29tLXVybD0iW1tpbWdzb3VyY2VdXSInOiIiKX1yZXR1cm4gb31mdW5jdGlvbiB0X3N0b3JlX2dldExhenlVcmwodCxlKXtpZighdC5pc1B1Ymxpc2hlZFBhZ2V8fCJ5IiE9PXdpbmRvdy5sYXp5KXJldHVybiBlO2lmKC0xPT09ZS5pbmRleE9mKCJzdGF0aWMudGlsZGFjZG4uIit0X3N0b3JlX19nZXRSb290Wm9uZSgpKSlyZXR1cm4gZTt2YXIgcj1lLnNwbGl0KCIvIik7cmV0dXJuIHIuc3BsaWNlKGUuc3BsaXQoIi8iKS5sZW5ndGgtMSwwLCItL3Jlc2l6ZWIveDIwIiksci5qb2luKCIvIil9ZnVuY3Rpb24gdF9zdG9yZV9nZXRMYXp5U3JjKHQsZSl7aWYoIXQuaXNQdWJsaXNoZWRQYWdlfHwieSIhPT13aW5kb3cubGF6eSlyZXR1cm4gZTtpZigtMT09PWUuaW5kZXhPZigiLnRpbGRhY2RuLmNvbSIpfHwtMSE9PWUuaW5kZXhPZigiLS9lbXB0eS8iKXx8LTEhPT1lLmluZGV4T2YoIi0vcmVzaXplLyIpKXJldHVybiBlO3ZhciByPWUuc3BsaXQoIi8iKTtyZXR1cm4gci5zcGxpY2UoZS5zcGxpdCgiLyIpLmxlbmd0aC0xLDAsIi0vZW1wdHkiKSxyLmpvaW4oIi8iKX1mdW5jdGlvbiB0X3N0b3JlX2RpY3QodCl7cmV0dXJuIHdpbmRvdy50U3RvcmVEaWN0fHx0X3N0b3JlX2dldERpY3RPYmooKSx3aW5kb3cudFN0b3JlRGljdFt0XXx8J1RleHQgbm90IGZvdW5kIGZvciAiJyt0KyciJ31mdW5jdGlvbiB0X3N0b3JlX2VzY2FwZVF1b3RlKHQpe2lmKCF0KXJldHVybiIiO3ZhciBlPXsnIic6IiZxdW90OyIsIiciOiImIzAzOTsifTtyZXR1cm4gdC5yZXBsYWNlKC9bIiddL2csKGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfSkpfWZ1bmN0aW9uIHRfc3RvcmVfcHJvZHVjdF9pbml0RWRpdGlvbnModCxlLHIsbyl7dmFyIG49ci5xdWVyeVNlbGVjdG9yKCIuanMtcHJvZHVjdC1jb250cm9scy13cmFwcGVyIiksaTtpZih0X3N0b3JlX3Byb2R1Y3RfYWRkRWRpdGlvbkNvbnRyb2xzKGUsbixvLHQpLHRfc3RvcmVfcHJvZHVjdF9zZWxlY3RBdmFpbGFibGVFZGl0aW9uKHQsZSxyLG8pKXt0X3N0b3JlX3Byb2R1Y3RfdHJpZ2dlclNvbGRPdXRNc2codCxyLCExLG8pO3ZhciBzPXRfc3RvcmVfcHJvZHVjdF9nZXRGaXJzdEF2YWlsYWJsZUVkaXRpb25EYXRhKGUuZWRpdGlvbnMpO3MmJnRfc3RvcmVfYWRkUHJvZHVjdFF1YW50aXR5KHIscyxvKSx0X3N0b3JlX3Byb2R1Y3RfX3ZlcmlmeU9wdGlvbkNvbnNpc2VuY3kocixlKSx0X3N0b3JlX3Byb2R1Y3RfZGlzYWJsZVVuYXZhaWxlT3B0aW9ucyhyLGUpfWVsc2UgdF9zdG9yZV9wcm9kdWN0X3RyaWdnZXJTb2xkT3V0TXNnKHQsciwhMCxvKSx0X3N0b3JlX3JlbW92ZVByb2R1Y3RRdWFudGl0eShyKSx0X3N0b3JlX3Byb2R1Y3RfZGlzYWJsZVVuYXZhaWxlT3B0aW9ucyhyLGUpO3ZhciBhLGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrdCkucXVlcnlTZWxlY3RvcigiLnQtc3RvcmUiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHIucXVlcnlTZWxlY3RvckFsbCgiLmpzLXByb2R1Y3QtZWRpdGlvbi1vcHRpb24iKSwoZnVuY3Rpb24obil7bi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLChmdW5jdGlvbigpe3ZhciBuPXRfc3RvcmVfcHJvZHVjdF9kZXRlY3RFZGl0aW9uQnlDb250cm9scyhyLGUpLGk9ITA7aWYobil7dF9zdG9yZV9wcm9kdWN0X3VwZGF0ZUVkaXRpb24odCxyLG4sZSxvLGkpLHRfcHJvZF9fdXBkYXRlUHJpY2UocixvKTt2YXIgcz1wYXJzZUludChuLnF1YW50aXR5LDEwKTw9MDt0X3N0b3JlX3Byb2R1Y3RfdHJpZ2dlclNvbGRPdXRNc2codCxyLHMsbykscz90X3N0b3JlX3JlbW92ZVByb2R1Y3RRdWFudGl0eShyKTp0X3N0b3JlX2FkZFByb2R1Y3RRdWFudGl0eShyLG4sbyksd2luZG93LlRpbGRhJiZUaWxkYS5zZW5kRWNvbW1lcmNlRXZlbnQmJih3aW5kb3cudFN0b3JlRGV0YWlsRXZlbnR8fCh3aW5kb3cudFN0b3JlRGV0YWlsRXZlbnQ9e30pLHdpbmRvdy50U3RvcmVEZXRhaWxFdmVudFtuLmlkP24uaWQ6bi51aWRdfHwoVGlsZGEuc2VuZEVjb21tZXJjZUV2ZW50KCJkZXRhaWwiLFt7aWQ6IiIrKG4uaWQ/bi5pZDpuLnVpZCksdWlkOiIiK24udWlkLHByaWNlOiIiKyhuLnByaWNlX21pbj9uLnByaWNlX21pbjpuLnByaWNlKSxza3U6bi5za3U/bi5za3U6IiIsbmFtZTplLnRpdGxlfV0pLHdpbmRvdy50U3RvcmVEZXRhaWxFdmVudFtuLmlkP24uaWQ6bi51aWRdPSEwKSl9ZWxzZXtmb3IodmFyIGE9dGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtZWRpdGlvbi1vcHRpb24taWQiKSxsPVtdLGQ9MDtkPGUuZWRpdGlvbk9wdGlvbnMubGVuZ3RoO2QrKyl7dmFyIHA9ZS5lZGl0aW9uT3B0aW9uc1tkXTtpZihsLnB1c2gocCkscC5uYW1lPT09YSlicmVha312YXIgdT10X3N0b3JlX3Byb2R1Y3Rfc2VsZWN0QXZhaWxhYmxlRWRpdGlvbih0LGUscixvLGwsaSk7dF9wcm9kX191cGRhdGVQcmljZShyLG8pLHRfc3RvcmVfcHJvZHVjdF90cmlnZ2VyU29sZE91dE1zZyh0LHIsIXUsbyksdF9zdG9yZV9hZGRQcm9kdWN0UXVhbnRpdHkocixlLG8pfWMmJnRfc3RvcmVfdHJpZ2dlckV2ZW50KGMsImRpc3BsYXlDaGFuZ2VkIiksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChyLnF1ZXJ5U2VsZWN0b3JBbGwoIi5qcy1wcm9kdWN0LWVkaXRpb24tb3B0aW9uLXZhcmlhbnRzIG9wdGlvbiIpLChmdW5jdGlvbih0KXt0LnJlbW92ZUF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pKSx0X3N0b3JlX3Byb2R1Y3RfX3ZlcmlmeU9wdGlvbkNvbnNpc2VuY3kocixlKSx0X3N0b3JlX3Byb2R1Y3RfZGlzYWJsZVVuYXZhaWxlT3B0aW9ucyhyLGUpfSkpfSkpfWZ1bmN0aW9uIHRfc3RvcmVfcHJvZHVjdF9kZXRlY3RFZGl0aW9uQnlDb250cm9scyh0LGUpe2Zvcih2YXIgcj10X3N0b3JlX29wdGlvbl9nZXRPcHRpb25zRGF0YSgpLG89MDtvPGUuZWRpdGlvbnMubGVuZ3RoO28rKyl7dmFyIG49ZS5lZGl0aW9uc1tvXSxpPSEwO2UuZWRpdGlvbk9wdGlvbnN8fChlLmVkaXRpb25PcHRpb25zPXRfc3RvcmVfcHJvZHVjdF9nZXRFZGl0aW9uT3B0aW9uc0FycihlLHIpKTtmb3IodmFyIHM9MDtzPGUuZWRpdGlvbk9wdGlvbnMubGVuZ3RoO3MrKyl7dmFyIGE9ZS5lZGl0aW9uT3B0aW9uc1tzXSxjPXRfc3RvcmVfcHJvZHVjdF9nZXRFZGl0aW9uU2VsZWN0RWwodCxhKSxsLGQ7aWYoYyljLnF1ZXJ5U2VsZWN0b3IoIi5qcy1wcm9kdWN0LWVkaXRpb24tb3B0aW9uLXZhcmlhbnRzIikudmFsdWUhPT1uW2EubmFtZV0mJihpPSExKX1pZihpKXJldHVybiBufXJldHVybiBudWxsfWZ1bmN0aW9uIHRfc3RvcmVfcHJvZHVjdF9hZGRFZGl0aW9uQ29udHJvbHModCxlLHIsbyl7dmFyIG49dF9zdG9yZV9vcHRpb25fZ2V0T3B0aW9uc0RhdGEoKSxpPXRfc3RvcmVfcHJvZHVjdF9nZXRGaXJzdEF2YWlsYWJsZUVkaXRpb25EYXRhKHQuZWRpdGlvbnMpO3QuZWRpdGlvbk9wdGlvbnN8fCh0LmVkaXRpb25PcHRpb25zPXRfc3RvcmVfcHJvZHVjdF9nZXRFZGl0aW9uT3B0aW9uc0Fycih0LG4pKSx0LmVkaXRpb25PcHRpb25zLmZvckVhY2goKGZ1bmN0aW9uKHQpe3Rfc3RvcmVfcHJvZHVjdF9hZGRPbmVPcHRpb25zQ29udHJvbCgiZWRpdGlvbm9wdCIsdCxlLHIsaSxvKX0pKX1mdW5jdGlvbiB0X3N0b3JlX3Byb2R1Y3Rfc2VsZWN0QXZhaWxhYmxlRWRpdGlvbih0LGUscixvLG4saSl7dmFyIHM9biYmbi5sZW5ndGg+MD90X3N0b3JlX3Byb2R1Y3RfZ2V0Rmlyc3RBdmFpbGFibGVFZGl0aW9uRGF0YV9mb3JDZXJ0YWluVmFscyhlLmVkaXRpb25zLG4scik6dF9zdG9yZV9wcm9kdWN0X2dldEZpcnN0QXZhaWxhYmxlRWRpdGlvbkRhdGEoZS5lZGl0aW9ucyk7aWYoIXMpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIk5vIGF2YWlsYWJsZSBlZGl0aW9uIGZvciB1aWQgPSAiK2UudWlkKyIgd2l0aCBzZWxlY3RlZCBvcHRpb25zIHZhbHVlcyIpLCExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksYz1hJiYiZWRpdCI9PT1hLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tb2RlIiksbD1wYXJzZUludChzLnF1YW50aXR5LDEwKT4wfHwiIj09PXMucXVhbnRpdHksZD1pO2lmKEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZS5lZGl0aW9uT3B0aW9ucywoZnVuY3Rpb24odCl7dmFyIGU9c1t0Lm5hbWVdLG49dF9zdG9yZV9wcm9kdWN0X2dldEVkaXRpb25TZWxlY3RFbChyLHQpO2lmKG4pe3ZhciBpPW4ucXVlcnlTZWxlY3RvcigiLmpzLXByb2R1Y3QtZWRpdGlvbi1vcHRpb24tdmFyaWFudHMiKSxhO2Z1bmN0aW9uIGwodCxlLHIpe3ZhciBuO3QucXVlcnlTZWxlY3RvckFsbCgiLnQtcHJvZHVjdF9fb3B0aW9uLWl0ZW0iKS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbj10LnF1ZXJ5U2VsZWN0b3IoIi50LXByb2R1Y3RfX29wdGlvbi1pbnB1dCIpO2lmKG4pe3ZhciBpPShlfHwiIikucmVwbGFjZSgvJmFtcDsvZywiJiIpO24udmFsdWU9PT1pPyh0LmNsYXNzTGlzdC5hZGQoInQtcHJvZHVjdF9fb3B0aW9uLWl0ZW1fYWN0aXZlIiksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtuLmNoZWNrZWQ9ITAscnx8bi5jbGljaygpfSkpLG8ucHJvZENhcmQmJm8ucHJvZENhcmQuc2hvd09wdHMmJihkPSEwKSk6KG4uY2hlY2tlZD0hMSx0LmNsYXNzTGlzdC5yZW1vdmUoInQtcHJvZHVjdF9fb3B0aW9uLWl0ZW1fYWN0aXZlIikpfX0pKX1pJiYoaS52YWx1ZT0oZXx8IiIpLnJlcGxhY2UoLyZndDsvZywiPiIpLnJlcGxhY2UoLyZsdDsvZywiPCIpLnJlcGxhY2UoLyYjOTI7L2csIlxcIiksby5wcm9kQ2FyZCYmby5wcm9kQ2FyZC5zaG93T3B0cyYmKGQ9ITApKSxuLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXByb2R1Y3RfX29wdGlvbi12YXJpYW50c19jdXN0b20iKS5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gbCh0LGUsYyl9KSl9fSkpLHIuY2xhc3NMaXN0LmNvbnRhaW5zKCJqcy1wcm9kdWN0LXJlbGV2YW50IikpdF9zdG9yZV9wcm9kdWN0X3VwZGF0ZUVkaXRpb24odCxyLHMsZSxvLGQpO2Vsc2V7dmFyIHAsdT10X3N0b3JlX3NuaXBwZXRfZ2V0SnNvbkZyb21VcmwoKS5lZGl0aW9udWlkLF87dSYmZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3JlYyIrdCsiIC5qcy1wcm9kdWN0IikuZ2V0QXR0cmlidXRlKCJkYXRhLXByb2R1Y3QtdWlkIikhPT11JiZlLmVkaXRpb25zLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QudWlkPT09dSYmKF89dCl9KSksdF9zdG9yZV9wcm9kdWN0X3VwZGF0ZUVkaXRpb24odCxyLF98fHMsZSxvLGQpfXJldHVybiBsfWZ1bmN0aW9uIHRfc3RvcmVfcHJvZHVjdF9fdmVyaWZ5T3B0aW9uQ29uc2lzZW5jeSh0LGUpe3ZhciByPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksbz1yJiYiZWRpdCI9PT1yLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tb2RlIiksbj1bXTtlLmVkaXRpb25PcHRpb25zLmxlbmd0aD4wJiZuLnB1c2goZS5lZGl0aW9uT3B0aW9uc1swXSk7Zm9yKHZhciBpPTE7aTxlLmVkaXRpb25PcHRpb25zLmxlbmd0aDtpKyspe3ZhciBzPWUuZWRpdGlvbk9wdGlvbnNbaV0sYT10X3N0b3JlX3Byb2R1Y3RfZ2V0RWRpdGlvblNlbGVjdEVsKHQscyk7aWYoIWEpcmV0dXJuO24ucHVzaChzKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHMudmFsdWVzLChmdW5jdGlvbihyKXt2YXIgaT10X3N0b3JlX3Byb2R1Y3RfZ2V0Rmlyc3RBdmFpbGFibGVFZGl0aW9uRGF0YV9mb3JDZXJ0YWluVmFscyhlLmVkaXRpb25zLG4sdCxyKSxzPShyfHwiIikucmVwbGFjZSgvXFwvZywiXFxcXCIpLnJlcGxhY2UoLyZhbXA7L2csIiYiKS5yZXBsYWNlKC8iL2csJ1xcIicpLGM9YS5xdWVyeVNlbGVjdG9yKCdvcHRpb25bdmFsdWU9IicrcysnIl0nKSxsPWEucXVlcnlTZWxlY3RvcignLnQtcHJvZHVjdF9fb3B0aW9uLWlucHV0W3ZhbHVlPSInK3MrJyJdJyksZDtpZihpKWMmJmMucmVtb3ZlQXR0cmlidXRlKCJkaXNhYmxlZCIpLGwmJigoZD1sLmNsb3Nlc3QoIi50LXByb2R1Y3RfX29wdGlvbi1pdGVtIikpLmNsYXNzTGlzdC5yZW1vdmUoInQtcHJvZHVjdF9fb3B0aW9uLWl0ZW1fZGlzYWJsZWQiKSxjJiZjLnBhcmVudE5vZGUudmFsdWU9PT1zJiYob3x8bC5jbGljaygpKSk7ZWxzZXtpZihjJiYoYy5zZXRBdHRyaWJ1dGUoImRpc2FibGVkIiwiZGlzYWJsZWQiKSxjLnNlbGVjdGVkKSl7Yy5zZWxlY3RlZD0hMTt2YXIgcD1jLmNsb3Nlc3QoIi5qcy1wcm9kdWN0LWVkaXRpb24tb3B0aW9uLXZhcmlhbnRzIik7cCYmdF9zdG9yZV90cmlnZ2VyRXZlbnQocCwiY2hhbmdlIil9bCYmKChkPWwuY2xvc2VzdCgiLnQtcHJvZHVjdF9fb3B0aW9uLWl0ZW0iKSkuY2xhc3NMaXN0LmFkZCgidC1wcm9kdWN0X19vcHRpb24taXRlbV9kaXNhYmxlZCIpLGQuY2xhc3NMaXN0LnJlbW92ZSgidC1wcm9kdWN0X19vcHRpb24taXRlbV9hY3RpdmUiKSxsLmNoZWNrZWQ9ITEpfX0pKX19ZnVuY3Rpb24gdF9zdG9yZV9wcm9kdWN0X2Rpc2FibGVVbmF2YWlsZU9wdGlvbnModCxlKXt2YXIgcjtpZighZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQxMTIyIikmJjAhPT1lLmVkaXRpb25PcHRpb25zLmxlbmd0aCl7dmFyIG89dC5nZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC1nZW4tdWlkIik7KCF3aW5kb3cudFN0b3JlRGlzYWJsZWRPcHRpb25zTGlzdHx8d2luZG93LnRTdG9yZURpc2FibGVkT3B0aW9uc0xpc3QmJiF3aW5kb3cudFN0b3JlRGlzYWJsZWRPcHRpb25zTGlzdFtvXSkmJnRfc3RvcmVfcHJvZHVjdF9nZW5lcmF0ZU9wdGlvbnNMaXN0Rm9yRGlzYWJsZSh0LGUpO3ZhciBuPXdpbmRvdy50U3RvcmVEaXNhYmxlZE9wdGlvbnNMaXN0W29dO24mJjAhPT1uLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbihlKXtPYmplY3Qua2V5cyhlKS5mb3JFYWNoKChmdW5jdGlvbihyKXt2YXIgbz10LnF1ZXJ5U2VsZWN0b3IoJy5qcy1wcm9kdWN0LWVkaXRpb24tb3B0aW9uW2RhdGEtZWRpdGlvbi1vcHRpb24taWQ9IicrKHJ8fCIiKS5yZXBsYWNlKC8iL2csJ1xcIicpKyciXScpO2lmKG8pe3ZhciBuLGk9by5xdWVyeVNlbGVjdG9yKCIuanMtcHJvZHVjdC1lZGl0aW9uLW9wdGlvbi12YXJpYW50cyIpO2lmKGkpe249KGVbcl18fCIiKS5yZXBsYWNlKC8iL2csJ1xcIicpO3ZhciBzPWkucXVlcnlTZWxlY3Rvcignb3B0aW9uW3ZhbHVlPSInK24rJyJdJyk7cyYmcy5zZXRBdHRyaWJ1dGUoImRpc2FibGVkIiwiZGlzYWJsZWQiKX12YXIgYT1vLnF1ZXJ5U2VsZWN0b3IoJy50LXByb2R1Y3RfX29wdGlvbi1pbnB1dFt2YWx1ZT0iJytuKyciXScpO2lmKGEpe3ZhciBjPWEuY2xvc2VzdCgiLnQtcHJvZHVjdF9fb3B0aW9uLWl0ZW0iKTtjLmNsYXNzTGlzdC5hZGQoInQtcHJvZHVjdF9fb3B0aW9uLWl0ZW1fZGlzYWJsZWQiKSxjLmNsYXNzTGlzdC5yZW1vdmUoInQtcHJvZHVjdF9fb3B0aW9uLWl0ZW1fYWN0aXZlIil9fX0pKX0pKX19ZnVuY3Rpb24gdF9zdG9yZV9wcm9kdWN0X2dlbmVyYXRlT3B0aW9uc0xpc3RGb3JEaXNhYmxlKHQsZSl7dmFyIHI9dC5nZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC1nZW4tdWlkIik7d2luZG93LnRTdG9yZURpc2FibGVkT3B0aW9uc0xpc3Q9d2luZG93LnRTdG9yZURpc2FibGVkT3B0aW9uc0xpc3R8fHt9LHdpbmRvdy50U3RvcmVEaXNhYmxlZE9wdGlvbnNMaXN0W3JdPVtdLGUuZWRpdGlvbk9wdGlvbnMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC52YWx1ZXMuZm9yRWFjaCgoZnVuY3Rpb24obyl7dmFyIG89KG98fCIiKS5yZXBsYWNlKC8mZ3Q7L2csIj4iKS5yZXBsYWNlKC8mbHQ7L2csIjwiKSxuO2lmKCFlLmVkaXRpb25zLnNvbWUoKGZ1bmN0aW9uKGUpe3ZhciByO3JldHVybihlW3QubmFtZV18fCIiKS5yZXBsYWNlKC8mZ3Q7L2csIj4iKS5yZXBsYWNlKC8mbHQ7L2csIjwiKT09PW8mJiIwIiE9PWUucXVhbnRpdHl9KSkpe3ZhciBpPXt9O2lbdC5uYW1lXT1vLHdpbmRvdy50U3RvcmVEaXNhYmxlZE9wdGlvbnNMaXN0W3JdLnB1c2goaSl9fSkpfSkpLDA9PT13aW5kb3cudFN0b3JlRGlzYWJsZWRPcHRpb25zTGlzdFtyXS5sZW5ndGgmJmRlbGV0ZSB3aW5kb3cudFN0b3JlRGlzYWJsZWRPcHRpb25zTGlzdFtyXX1mdW5jdGlvbiB0X3N0b3JlX3Byb2R1Y3RfdXBkYXRlRWRpdGlvbih0LGUscixvLG4saSl7dmFyIHM9dF9zdG9yZV9zbmlwcGV0X2dldEpzb25Gcm9tVXJsKCk7cy5lZGl0aW9udWlkPXBhcnNlSW50KHMuZWRpdGlvbnVpZCwxMCk7dmFyIGE9ZSxjPXI7d2luZG93LmpRdWVyeSYmYSBpbnN0YW5jZW9mIGpRdWVyeSYmKGE9YVswXSksY3x8by5lZGl0aW9ucy5mb3JFYWNoKChmdW5jdGlvbih0KXt0LnVpZD09PXMuZWRpdGlvbnVpZCYmKGM9dCl9KSkscy5lZGl0aW9udWlkPT09Yy51aWQmJihBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5qcy1zdG9yZS1wcm9kdWN0IiksKGZ1bmN0aW9uKHQpe3Quc2V0QXR0cmlidXRlKCJkYXRhLXByb2R1Y3QtbGlkIixjLnVpZCksdC5zZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC11aWQiLGMudWlkKSx0LnNldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LXVybCIsd2luZG93LmxvY2F0aW9uKSx0LnNldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LWltZyIsYy5pbWcpfSkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dF9zdG9yZV9wcm9kdWN0X3VwZGF0ZUVkaXRpb25fbW92ZVNsaWRlcih0LGEsYyl9KSwyMDApLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoby5lZGl0aW9uT3B0aW9ucywoZnVuY3Rpb24odCl7dmFyIGU9Y1t0Lm5hbWVdLHI9dF9zdG9yZV9wcm9kdWN0X2dldEVkaXRpb25TZWxlY3RFbChhLHQpO2lmKHIpe3ZhciBvPXIucXVlcnlTZWxlY3RvcigiLmpzLXByb2R1Y3QtZWRpdGlvbi1vcHRpb24tdmFyaWFudHMiKTtvJiZvLnZhbHVlIT09ZSYmKG8udmFsdWU9KGV8fCIiKS5yZXBsYWNlKC8mZ3Q7L2csIj4iKS5yZXBsYWNlKC8mbHQ7L2csIjwiKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3Rfc3RvcmVfdHJpZ2dlckV2ZW50KG8sImNoYW5nZSIpfSkpKX19KSkpO3ZhciBsPWEucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLXByaWNlLXdyYXBwZXIiKSxkLHAsdSxfLGYseSx2O2lmKGwmJihkPWwucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX2NhcmRfX3ByaWNlIikscD1sLnF1ZXJ5U2VsZWN0b3IoIi5qcy1zdG9yZS1wcm9kLXByaWNlIiksdT1sLnF1ZXJ5U2VsZWN0b3IoIi5qcy1zdG9yZS1wcm9kLXByaWNlLXZhbCIpLF89bC5xdWVyeVNlbGVjdG9yKCIuanMtcHJvZHVjdC1wcmljZSIpKSxjLnByaWNlJiYwIT09cGFyc2VGbG9hdChjLnByaWNlKSl7dmFyIGc9dF9zdG9yZV9fZ2V0Rm9ybWF0dGVkUHJpY2UobixjLnByaWNlKSxtPXRfc3RvcmVfX2dldEZvcm1hdHRlZFByaWNlUmFuZ2UobixvKTtpZihuLnByaWNlKXt2YXIgaD1uLnByaWNlLnByaWNlUmFuZ2U7aWYobSYmInJhbmdlIj09PWgmJihnPW0pLG0mJiJmcm9tIj09PWgpe3ZhciBiPXRfc3RvcmVfX2dldEZvcm1hdHRlZE1pblByaWNlKG4sbyk7bnVsbCE9PWImJihnPWIpfX11JiYodS50ZXh0Q29udGVudD1nKSxkJiYoZC5zdHlsZS5kaXNwbGF5PSIiKSxwJiYocC5zdHlsZS5kaXNwbGF5PSIiKSxsJiYobC5zdHlsZS52aXNpYmlsaXR5PSIiKTt2YXIgdz10X3N0b3JlX19jbGVhblByaWNlKGMucHJpY2UpO2lmKF8mJihfLnNldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LXByaWNlLWRlZiIsdyksXy5zZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC1wcmljZS1kZWYtc3RyIix3KSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXN0b3JlX19wcm9kX19wcmljZS1wb3J0aW9uIiksKGZ1bmN0aW9uKHQpe3Rfc3RvcmVfX3JlbW92ZUVsZW1lbnQodCl9KSksby51bml0JiZvLnBvcnRpb24+MCl7dmFyIFM9JzxkaXYgY2xhc3M9InQtc3RvcmVfX3Byb2RfX3ByaWNlLXBvcnRpb24iPjxzcGFuIGNsYXNzPSJ0LXN0b3JlX19wcm9kX19wcmljZS1wb3J0aW9uLXNsYXNoIj4vPC9zcGFuPic7IjEiIT09by5wb3J0aW9uJiYoUys9K28ucG9ydGlvbisiICIpLFMrPXdpbmRvdy50U3RvcmVEaWN0W28udW5pdF0rIjwvZGl2PiI7dmFyIEU9WyIudC1zdG9yZV9fY2FyZF9fcHJpY2UtY3VycmVuY3kgKyAuanMtcHJvZHVjdC1wcmljZSIsIi50LXN0b3JlX19jYXJkX19wcmljZS1jdXJyZW5jeSArIC5qcy1zdG9yZS1wcm9kLXByaWNlLW9sZC12YWwiLCIuanMtcHJvZHVjdC1wcmljZSArIC50LXN0b3JlX19jYXJkX19wcmljZS1jdXJyZW5jeSIsIi5qcy1zdG9yZS1wcm9kLXByaWNlLW9sZC12YWwgKyAudC1zdG9yZV9fY2FyZF9fcHJpY2UtY3VycmVuY3kiLCIudC1zdG9yZV9fcHJvZC1wb3B1cF9fcHJpY2UtY3VycmVuY3kgKyAuanMtcHJvZHVjdC1wcmljZSIsIi5qcy1wcm9kdWN0LXByaWNlICsgLnQtc3RvcmVfX3Byb2QtcG9wdXBfX3ByaWNlLWN1cnJlbmN5IiwiLnQtc3RvcmVfX3Byb2QtcG9wdXBfX3ByaWNlLWN1cnJlbmN5ICsgLmpzLXN0b3JlLXByb2QtcHJpY2Utb2xkLXZhbCIsIi5qcy1zdG9yZS1wcm9kLXByaWNlLW9sZC12YWwgKyAudC1zdG9yZV9fcHJvZC1wb3B1cF9fcHJpY2UtY3VycmVuY3kiLCIuanMtcHJvZHVjdC1wcmljZS1jdXJyZW5jeSArIC5qcy1wcm9kdWN0LXByaWNlIiwiLmpzLXByb2R1Y3QtcHJpY2UgKyAuanMtcHJvZHVjdC1wcmljZS1jdXJyZW5jeSIsIi5qcy1wcm9kdWN0LXByaWNlLWN1cnJlbmN5ICsgLmpzLXN0b3JlLXByb2QtcHJpY2Utb2xkLXZhbCIsIi5qcy1zdG9yZS1wcm9kLXByaWNlLW9sZC12YWwgKyAuanMtcHJvZHVjdC1wcmljZS1jdXJyZW5jeSJdO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYS5xdWVyeVNlbGVjdG9yQWxsKEUuam9pbigiLCIpKSwoZnVuY3Rpb24odCl7dC5pbnNlcnRBZGphY2VudEhUTUwoImFmdGVyZW5kIixTKX0pKX19ZWxzZSBsJiYobC5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iKSxkJiYoZC5zdHlsZS5kaXNwbGF5PSJub25lIikscCYmKHAuc3R5bGUuZGlzcGxheT0ibm9uZSIpLHUmJih1LnRleHRDb250ZW50PSIiKSxfJiYoXy5zZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC1wcmljZS1kZWYiLCIiKSxfLnNldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LXByaWNlLWRlZi1zdHIiLCIiKSksdF9zdG9yZV9fcmVtb3ZlRWxlbWVudChhLnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19wcm9kX19wcmljZS1wb3J0aW9uIikpO2lmKGMucHJpY2VvbGQmJiIwIiE9PWMucHJpY2VvbGQmJnRfc3RvcmVfX2NsZWFuUHJpY2UoYy5wcmljZSkhPT10X3N0b3JlX19jbGVhblByaWNlKGMucHJpY2VvbGQpKXt2YXIgUD10X3N0b3JlX19nZXRGb3JtYXR0ZWRQcmljZShuLGMucHJpY2VvbGQpOyhmPWEucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLXByb2QtcHJpY2Utb2xkIikpJiYoZi5zdHlsZS5kaXNwbGF5PSIiKSwoeT1hLnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19jYXJkX19wcmljZV9vbGQiKSkmJih5LnN0eWxlLmRpc3BsYXk9IiIpLCh2PWEucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLXByb2QtcHJpY2Utb2xkLXZhbCIpKSYmKHYuaW5uZXJIVE1MPVApfWVsc2UoZj1hLnF1ZXJ5U2VsZWN0b3IoIi5qcy1zdG9yZS1wcm9kLXByaWNlLW9sZCIpKSYmKGYuc3R5bGUuZGlzcGxheT0ibm9uZSIpLCh5PWEucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX2NhcmRfX3ByaWNlX29sZCIpKSYmKHkuc3R5bGUuZGlzcGxheT0ibm9uZSIpLCh2PWEucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLXByb2QtcHJpY2Utb2xkLXZhbCIpKSYmKHYuaW5uZXJIVE1MPSIiKTt2YXIgeD1hLnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19wcm9kLXBvcHVwX19icmFuZCIpO28uYnJhbmQmJm8uYnJhbmQ+IiImJngmJigxPT09eC5xdWVyeVNlbGVjdG9yQWxsKCJzcGFuW2l0ZW1wcm9wPWJyYW5kXSIpLmxlbmd0aD94LnF1ZXJ5U2VsZWN0b3IoInNwYW5baXRlbXByb3A9YnJhbmRdIikuaW5uZXJIVE1MPW8uYnJhbmQ6eC5pbm5lckhUTUw9JzxzcGFuIGl0ZW1wcm9wPSJicmFuZCIgY2xhc3M9ImpzLXByb2R1Y3QtYnJhbmQiPicrby5icmFuZCsiPC9zcGFuPiIpLCFvLmJyYW5kJiZ4JiYoeC5zdHlsZS5kaXNwbGF5PSJub25lIik7dmFyIEM9YS5xdWVyeVNlbGVjdG9yKCIudC1zdG9yZV9fcHJvZC1wb3B1cF9fc2t1IiksQT1hLnF1ZXJ5U2VsZWN0b3IoIi5qcy1zdG9yZS1wcm9kLXNrdSIpLGo7Yy5za3U/KEEmJihBLmlubmVySFRNTD1jLnNrdSksImxhcmdlIj09PWEuZ2V0QXR0cmlidXRlKCJkYXRhLWNhcmQtc2l6ZSIpJiYoQS5zdHlsZS5kaXNwbGF5PSIiLEMmJihDLnN0eWxlLmRpc3BsYXk9IiIpKSk6KEEmJihBLmlubmVySFRNTD0iIixBLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxDJiYoQy5zdHlsZS5kaXNwbGF5PSJub25lIikpLGEuc2V0QXR0cmlidXRlKCJkYXRhLXByb2R1Y3QtaW52IixjLnF1YW50aXR5KSxhLnNldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LWxpZCIsYy51aWQpLGEuc2V0QXR0cmlidXRlKCJkYXRhLXByb2R1Y3QtdWlkIixjLnVpZCksd2luZG93LnRTdG9yZURlZlBhY2tPYmp8fCh3aW5kb3cudFN0b3JlRGVmUGFja09iaj17fSk7dHJ5e3ZhciBPPXdpbmRvdy50U3RvcmVEZWZQYWNrT2JqW28udWlkXSxrPWEucXVlcnlTZWxlY3RvckFsbCgnLnQtc3RvcmVfX3RhYnMgLnQtc3RvcmVfX3RhYnNfX2l0ZW1bZGF0YS10YWItdHlwZT0iY2hhcnMiXScpLEw9IiIsVCxxO2MucGFja194JiZjLnBhY2tfeSYmYy5wYWNrX3o/KE98fChPPXtwYWNrX3g6YS5nZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC1wYWNrLXgiKXx8MCxwYWNrX3k6YS5nZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC1wYWNrLXkiKXx8MCxwYWNrX3o6YS5nZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC1wYWNrLXoiKXx8MCxwYWNrX2xhYmVsOmEuZ2V0QXR0cmlidXRlKCJkYXRhLXByb2R1Y3QtcGFjay1sYWJlbCIpfHxvLnBhY2tfbGFiZWx8fCJsd2giLHBhY2tfbTphLmdldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LXBhY2stbSIpfHwwfSx3aW5kb3cudFN0b3JlRGVmUGFja09ialtvLnVpZF09TyksYS5zZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC1wYWNrLXgiLGMucGFja194KSxhLnNldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LXBhY2steSIsYy5wYWNrX3kpLGEuc2V0QXR0cmlidXRlKCJkYXRhLXByb2R1Y3QtcGFjay16IixjLnBhY2tfeiksYS5zZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC1wYWNrLWxhYmVsIixPLnBhY2tfbGFiZWwpLFQ9Yy5wYWNrX3grIngiK2MucGFja195KyJ4IitjLnBhY2tfeixxPWEucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLXByb2QtZGltZW5zaW9ucyIpLEw9d2luZG93LnRTdG9yZURpY3RbInByb2R1Y3QtIitPLnBhY2tfbGFiZWxdKyI6ICIrVCsiJm5ic3A7Iit3aW5kb3cudFN0b3JlRGljdC5tbSxxJiYoYS5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtcHJvZC1kaW1lbnNpb25zIikuaW5uZXJIVE1MPUwpKTpPJiZPLnBhY2tfeCYmKGEuc2V0QXR0cmlidXRlKCJkYXRhLXByb2R1Y3QtcGFjay14IixPLnBhY2tfeCksYS5zZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC1wYWNrLXkiLE8ucGFja195KSxhLnNldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LXBhY2steiIsTy5wYWNrX3opLGEuc2V0QXR0cmlidXRlKCJkYXRhLXByb2R1Y3QtcGFjay1sYWJlbCIsTy5wYWNrX2xhYmVsKSxUPU8ucGFja194KyJ4IitPLnBhY2tfeSsieCIrTy5wYWNrX3osTD13aW5kb3cudFN0b3JlRGljdFsicHJvZHVjdC0iK08ucGFja19sYWJlbF0rIjogIitUKyImbmJzcDsiK3dpbmRvdy50U3RvcmVEaWN0Lm1tLChxPWEucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLXByb2QtZGltZW5zaW9ucyIpKSYmKHEuaW5uZXJIVE1MPUwpKSxMJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGssKGZ1bmN0aW9uKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLXByb2QtZGltZW5zaW9ucyIpO2UmJihlLmlubmVySFRNTD1MKX0pKTt2YXIgST0iIixSO2MucGFja19tPyhhLnNldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LXBhY2stbSIsYy5wYWNrX20pLEk9d2luZG93LnRTdG9yZURpY3RbInByb2R1Y3Qtd2VpZ2h0Il0rIjogIitjLnBhY2tfbSsiJm5ic3A7Iit3aW5kb3cudFN0b3JlRGljdC5nLChSPWEucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLXByb2Qtd2VpZ2h0IikpJiYoUi5pbm5lckhUTUw9SSkpOk8mJnBhcnNlRmxvYXQoTy5wYWNrX20pPjAmJihhLnNldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LXBhY2stbSIsTy5wYWNrX20pLEk9d2luZG93LnRTdG9yZURpY3RbInByb2R1Y3Qtd2VpZ2h0Il0rIjogIitPLnBhY2tfbSsiJm5ic3A7Iit3aW5kb3cudFN0b3JlRGljdC5nLChSPWEucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLXByb2Qtd2VpZ2h0IikpJiYoUi5pbm5lckhUTUw9SSkpLEkmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaywoZnVuY3Rpb24odCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtcHJvZC13ZWlnaHQiKTtlJiYoZS5pbm5lckhUTUw9SSl9KSl9Y2F0Y2goRCl7Y29uc29sZS5lcnJvcihEKX1jLmltZz8oYS5zZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC1pbWciLGMuaW1nKSwibGFyZ2UiPT09YS5nZXRBdHRyaWJ1dGUoImRhdGEtY2FyZC1zaXplIik/dF9zdG9yZV9wcm9kdWN0X3VwZGF0ZUVkaXRpb25fbW92ZVNsaWRlcih0LGEsYyk6aSYmdF9zdG9yZV9nZXRfcHJvZHVjdENhcmRfaW1nX3JlcGxhY2VXaXRoKG8sYSxuLGMuaW1nKSk6YS5nZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC1pbWciKSYmImxhcmdlIj09PWEuZ2V0QXR0cmlidXRlKCJkYXRhLWNhcmQtc2l6ZSIpJiYodF9zdG9yZV9wcm9kdWN0X3VwZGF0ZUVkaXRpb25fbW92ZVNsaWRlcih0LGEsYyksYS5zZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC1pbWciLCIiKSk7by51bml0JiZvLnBvcnRpb24+MD8oYS5zZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC11bml0IixvLnVuaXQpLGEuc2V0QXR0cmlidXRlKCJkYXRhLXByb2R1Y3QtcG9ydGlvbiIsby5wb3J0aW9uKSxhLnNldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LXNpbmdsZSIsby5zaW5nbGUpKTooYS5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC11bml0IiksYS5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC1wb3J0aW9uIiksYS5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC1zaW5nbGUiKSl9ZnVuY3Rpb24gdF9zdG9yZV9wcm9kdWN0X3VwZGF0ZUVkaXRpb25fbW92ZVNsaWRlcih0LGUscil7aWYoZSYmciYmci5pbWcpe3ZhciBvPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpO2lmKG8pe3ZhciBuPTEsaT1wYXJzZUludChvLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdG90YWxzbGlkZXMiKSwxMCkscz1yLmltZy5yZXBsYWNlKC8mYW1wOy9nLCImIiksYSxjPUFycmF5LmZyb20oZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtIikpLmZpbmQoKGZ1bmN0aW9uKHQpe3ZhciBlPXBhcnNlSW50KHQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWluZGV4Iil8fCIiLDEwKTtyZXR1cm4gMD09PWV8fGU9PT1pKzE/bnVsbDp0LnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2JnaW1nW2RhdGEtb3JpZ2luYWw9IicrcysnIl0nKX0pKTtpZighYyl7dmFyIGw9ZnVuY3Rpb24oKXt0cnl7dmFyIHQ7cmV0dXJuIG51bGw9PSh0PW5ldyBVUkwocykpP3ZvaWQgMDp0LnBhdGhuYW1lfWNhdGNoKGUpe3JldHVybiIifX0oKTtpZihsJiYiLyIhPT1sKXt2YXIgZD1lLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2l0ZW0gLnQtc2xkc19fYmdpbWdbZGF0YS1vcmlnaW5hbCQ9IicrbCsnIl0nKTtkJiYoYz1kLmNsb3Nlc3QoIi50LXNsZHNfX2l0ZW0iKSl9fWlmKC0xIT09cy5pbmRleE9mKCJodHRwOi8vIil8fC0xIT09cy5pbmRleE9mKCJodHRwczovLyIpKXRyeXt2YXIgcCx1PW5ldyBVUkwocykucGF0aG5hbWU7Ii8iPT09dVswXSYmKHU9dS5zbGljZSgxKS5yZXBsYWNlKC9cLy8sIl9fIikpO3ZhciBfPWUucXVlcnlTZWxlY3RvcignLnQtc2xkc19faXRlbSAudC1zbGRzX19iZ2ltZ1tkYXRhLW9yaWdpbmFsJD0iJyt1KyciXScpOyFjJiZfJiYoYz1fLmNsb3Nlc3QoIi50LXNsZHNfX2l0ZW0iKSl9Y2F0Y2goZil7Y29uc29sZS5lcnJvcihmKX1jJiYwPT09KG49cGFyc2VJbnQoYy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGUtaW5kZXgiKSwxMCkpJiYobj1pKSxvLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIixuLnRvU3RyaW5nKCkpLGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0OTIyIil8fHRfc3RvcmVfb25GdW5jTG9hZCgidF9zbGlkZU1vdmVJbnN0YW50bHkiLChmdW5jdGlvbigpe3Rfc2xpZGVNb3ZlSW5zdGFudGx5KHQrIiAuanMtc3RvcmUtcHJvZHVjdCIpfSkpfX19ZnVuY3Rpb24gdF9zdG9yZV9wcm9kdWN0X3RyaWdnZXJTb2xkT3V0TXNnKHQsZSxyLG8pe3ZhciBuPWU7dF9zdG9yZV9fcmVtb3ZlRWxlbWVudChuLnF1ZXJ5U2VsZWN0b3IoIi5qcy1zdG9yZS1wcm9kLXNvbGQtb3V0IikpO3ZhciBpPW4ucXVlcnlTZWxlY3RvckFsbCgnLnQtc3RvcmVfX2NhcmRfX2J0bnMtd3JhcHBlciBbaHJlZj0iI29yZGVyIl0sIC50LXN0b3JlX19wcm9kLXBvcHVwX19idG4td3JhcHBlciBbaHJlZj0iI29yZGVyIl0nKTswPT09aS5sZW5ndGgmJihpPW4ucXVlcnlTZWxlY3RvckFsbCgnW2hyZWY9IiNvcmRlciJdJykpLHdpbmRvdy5qUXVlcnkmJm4gaW5zdGFuY2VvZiBqUXVlcnkmJihuPSQobikuZ2V0KDApKTt2YXIgcz1vLnByb2RDYXJkJiYib3JkZXIiPT09by5wcm9kQ2FyZC5idG5MaW5rMSxhPW8ucHJvZENhcmQmJiJvcmRlciI9PT1vLnByb2RDYXJkLmJ0bkxpbmsyLGM7aWYoaVswXSYmKGM9aVswXS5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtcHJvZC1wb3B1cC1idXktYnRuLXR4dCIpLCJzbWFsbCI9PT1uLmdldEF0dHJpYnV0ZSgiZGF0YS1jYXJkLXNpemUiKSYmKGM9aVswXS5xdWVyeVNlbGVjdG9yKCIudC1zdG9yZV9fY2FyZF9fYnRuLXRleHQiKSksY3x8KGM9aVswXS5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtcHJvZC1idXktYnRuLXR4dCIpKSkscil7dmFyIGw9ZnVuY3Rpb24gdCgpe3ZhciBlPW4ucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLXByaWNlLXdyYXBwZXIiKTtpZihlKXt2YXIgcj0nPGRpdiBjbGFzcz0ianMtc3RvcmUtcHJvZC1zb2xkLW91dCB0LXN0b3JlX19jYXJkX19zb2xkLW91dC1tc2cgdC1uYW1lIHQtbmFtZV94cyI+Jyt3aW5kb3cudFN0b3JlRGljdC5zb2xkT3V0KyI8L2Rpdj4iLG87ZS5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWVuZCIsciksImhpZGRlbiI9PT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS52aXNpYmlsaXR5JiYoZS5zdHlsZS52aXNpYmlsaXR5PSJ2aXNpYmxlIil9fTtpLmxlbmd0aHx8bCgpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaSwoZnVuY3Rpb24odCl7dC5jbGFzc0xpc3QuYWRkKCJ0LXN0b3JlX19wcm9kLXBvcHVwX19idG5fZGlzYWJsZWQiKX0pKSxjJiYoYy50ZXh0Q29udGVudD13aW5kb3cudFN0b3JlRGljdC5zb2xkT3V0KSx0X3N0b3JlX3RyaWdnZXJFdmVudChuLCJ0U3RvcmVTb2xkT3V0Iix7cHJvZHVjdDp0X3N0b3JlX19jb2xsZWN0UHJvZHVjdERhdGFCeUVsZW1lbnQobiksYnV0dG9uQnV5RWxlbWVudDppWzBdLHJlbmRlclNvbGRPdXRNZXNzYWdlOmwscmVjSWQ6dH0pfWVsc2V7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChpLChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5yZW1vdmUoInQtc3RvcmVfX3Byb2QtcG9wdXBfX2J0bl9kaXNhYmxlZCIpfSkpO3ZhciBkPW8uYnV5QnRuVGl0bGV8fG8ucG9wdXBfb3B0cyYmby5wb3B1cF9vcHRzLmJ0blRpdGxlfHx3aW5kb3cudFN0b3JlRGljdC5hZGR0b2NhcnQ7InNtYWxsIj09PW4uZ2V0QXR0cmlidXRlKCJkYXRhLWNhcmQtc2l6ZSIpJiYocyYmby5wcm9kQ2FyZC5idG5UaXRsZTEmJihkPW8ucHJvZENhcmQuYnRuVGl0bGUxKSxhJiZvLnByb2RDYXJkLmJ0blRpdGxlMiYmKGQ9by5wcm9kQ2FyZC5idG5UaXRsZTIpKSxjJiYoYy50ZXh0Q29udGVudD1kKSx0X3N0b3JlX3RyaWdnZXJFdmVudChuLCJ0U3RvcmVBdmFpbGFibGUiLHtwcm9kdWN0OnRfc3RvcmVfX2NvbGxlY3RQcm9kdWN0RGF0YUJ5RWxlbWVudChuKSxidXR0b25CdXlFbGVtZW50OmlbMF19KX19ZnVuY3Rpb24gdF9zdG9yZV9wcm9kdWN0X2FkZE9uZU9wdGlvbnNDb250cm9sKHQsZSxyLG8sbixpKXtpZihlLm5hbWUpe3ZhciBzLGEsYyxsPSIiLGQ7aWYoIm1vZGlmaWNhdG9yIj09PXQpe2lmKHZvaWQgMD09PWUudmFsdWVzKXJldHVybiBudWxsO2E9JzxvcHRpb24gdmFsdWU9IltbdmFsdWVdXSIgZGF0YS1wcm9kdWN0LXZhcmlhbnQtcHJpY2U9IltbcHJpY2VdXSI+W1t0ZXh0XV08L29wdGlvbj4nO3ZhciBwPWUudmFsdWVzLnNwbGl0KCJcbiIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwocCwoZnVuY3Rpb24odCl7dmFyIGU9dC5zcGxpdCgiPSIpWzBdLHI9dC5zcGxpdCgiPSIpWzFdO2wrPWEucmVwbGFjZSgvXFtcW3ZhbHVlXF1cXS9nLHRfc3RvcmVfZXNjYXBlUXVvdGUoZSkucmVwbGFjZSgvJmFtcDsvZywiJmFtcDthbXA7IikpLnJlcGxhY2UoL1xbXFt0ZXh0XF1cXS9nLHRfc3RvcmVfZXNjYXBlUXVvdGUoZSkpLnJlcGxhY2UoL1xbXFtwcmljZVxdXF0vZyxyfHwiIil9KSkscz0oYz10X3N0b3JlX2dldF9jb250cm9sX29wdGlvbl9odG1sKG8pKS5yZXBsYWNlKC9cW1xbbmFtZVxdXF0vZyxlLm5hbWUpLnJlcGxhY2UoL1xbXFtvcHRpb250YWdzXF1cXS9nLGwpfWVsc2UgYT0nPG9wdGlvbiB2YWx1ZT0iW1t2YWx1ZV1dIj5bW3RleHRdXTwvb3B0aW9uPicsQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLnZhbHVlcywoZnVuY3Rpb24odCl7IiIhPT10JiYobCs9YS5yZXBsYWNlKC9cW1xbdmFsdWVcXVxdL2csdF9zdG9yZV9lc2NhcGVRdW90ZSh0KS5yZXBsYWNlKC8mYW1wOy9nLCImYW1wO2FtcDsiKSkucmVwbGFjZSgvXFtcW3RleHRcXVxdL2csdF9zdG9yZV9lc2NhcGVRdW90ZSh0KSkpfSkpLCIiIT09bCYmKHM9KGM9dF9zdG9yZV9nZXRfY29udHJvbF9lZGl0aW9uT3B0aW9uX2h0bWwobyxlKSkucmVwbGFjZSgvXFtcW2lkXF1cXS9nLGUuaWQucmVwbGFjZSgvJmFtcDsvZywiJmFtcDthbXA7IikucmVwbGFjZSgvJiM5MjsvZywiJmFtcDsjOTI7IikpLnJlcGxhY2UoL1xbXFtuYW1lXF1cXS9nLGUubmFtZSkucmVwbGFjZSgvXFtcW29wdGlvbnRhZ3NcXVxdL2csbCkpO2lmKHMmJnIuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLHMpLHRfc3RvcmVfb3B0aW9uX2NoZWNrSWZDdXN0b20oZSkmJnRfc3RvcmVfb3B0aW9uX3N0eWxlQ3VzdG9tQ29udHJvbChpLG8sZSxyLG4pLCJlZGl0aW9ub3B0Ij09PXQpe3ZhciB1PXIucXVlcnlTZWxlY3RvckFsbCgiLmpzLXByb2R1Y3QtZWRpdGlvbi1vcHRpb24iKSxfLGY9dVt1Lmxlbmd0aC0xXTtpZihmKXJldHVybiBmfX1yZXR1cm4gbnVsbH1mdW5jdGlvbiB0X3N0b3JlX3Byb2R1Y3RfZ2V0RWRpdGlvbk9wdGlvbnNBcnIodCxlKXt2YXIgcj10LmVkaXRpb25zLG89WyJxdWFudGl0eSIsInByaWNlIiwicHJpY2VvbGQiLCJnYWxsZXJ5Iiwic2t1IiwidWlkIiwiaW1nIiwiZXh0ZXJuYWxpZCIsImV4dGVybmFsaWRzIiwicGFja194IiwicGFja195IiwicGFja196IiwicGFja19tIl0sbj17fSxpPVtdO3JldHVybiByLmZvckVhY2goKGZ1bmN0aW9uKHQpe09iamVjdC5rZXlzKHQpLmZvckVhY2goKGZ1bmN0aW9uKHQpey0xIT09by5pbmRleE9mKHQpfHxuW3RdfHwoblt0XT0hMCl9KSl9KSksT2JqZWN0LmtleXMobikuZm9yRWFjaCgoZnVuY3Rpb24obyl7dmFyIG49e25hbWU6byxpZDp0X3N0b3JlX2NvbWJpbmVPcHRpb25JZEJ5TmFtZShvKSxwYXJhbXM6dF9zdG9yZV9wcm9kdWN0X2dldEVkaXRpb25PcHRpb25zQXJyX2dldFBhcmFtcyhvLHQsZSksdmFsdWVzOnRfc3RvcmVfcHJvZHVjdF9nZXRFZGl0aW9uT3B0aW9uc0Fycl9nZXRWYWx1ZXMobyxyKSxpbWFnZXNPYmo6dF9zdG9yZV9wcm9kdWN0X2dldEVkaXRpb25PcHRpb25zQXJyX2dldEltZ1ZhbHVlcyhvLHIpLHZhbHVlc09iajplJiZlW29dP2Vbb10udmFsdWVzOnt9fTtpLnB1c2gobil9KSksaX1mdW5jdGlvbiB0X3N0b3JlX3Byb2R1Y3RfZ2V0Rmlyc3RBdmFpbGFibGVFZGl0aW9uRGF0YSh0KXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKyl7dmFyIHI9dFtlXTtpZigwIT09cGFyc2VJbnQoci5xdWFudGl0eSwxMCkpcmV0dXJuIHJ9cmV0dXJuIHRbMF19ZnVuY3Rpb24gdF9zdG9yZV9wcm9kdWN0X2dldEZpcnN0QXZhaWxhYmxlRWRpdGlvbkRhdGFfZm9yQ2VydGFpblZhbHModCxlLHIsbyl7Zm9yKHZhciBuPSIiLGk9MDtpPHQubGVuZ3RoO2krKyl7Zm9yKHZhciBzPXRbaV0sYT0hMCxjPTA7YzxlLmxlbmd0aDtjKyspe3ZhciBsPWVbY10ubmFtZSxkLHA9dF9zdG9yZV9wcm9kdWN0X2dldEN1ckVkaXRpb25PcHRWYWxCeUlkKHIsZVtjXS5pZCk7aWYoc1tsXT0oc1tsXXx8IiIpLnJlcGxhY2UoLyYjOTI7L2csIlxcIikucmVwbGFjZSgvJmd0Oy9nLCI+IikucmVwbGFjZSgvJmx0Oy9nLCI8IiksbyYmYz09PWUubGVuZ3RoLTEmJihwPW8pLHNbbF0hPT1wKXthPSExO2JyZWFrfX1pZihhKXtpZigwIT09cGFyc2VJbnQocy5xdWFudGl0eSwxMCkpcmV0dXJuIHM7bnx8KG49cyl9fWlmKG4pe3ZhciB1O2lmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50MTEyMiIpKXJldHVybiBuOzA9PT1wYXJzZUludChuLnF1YW50aXR5LDEwKSYmKG49IiIpfXJldHVybiBufWZ1bmN0aW9uIHRfc3RvcmVfcHJvZHVjdF9nZXRDdXJFZGl0aW9uT3B0VmFsQnlJZCh0LGUpe3ZhciByPXQucXVlcnlTZWxlY3RvcignLmpzLXByb2R1Y3QtZWRpdGlvbi1vcHRpb25bZGF0YS1lZGl0aW9uLW9wdGlvbi1pZD0iJytlKyciXScpO3JldHVybiByP3IucXVlcnlTZWxlY3RvcigiLmpzLXByb2R1Y3QtZWRpdGlvbi1vcHRpb24tdmFyaWFudHMiKS52YWx1ZToiIn1mdW5jdGlvbiB0X3N0b3JlX3Byb2R1Y3RfZ2V0RWRpdGlvbk9wdGlvbnNBcnJfZ2V0VmFsdWVzKHQsZSl7dmFyIHI9W107cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG89ZVt0XTt2b2lkIDAhPT1vJiYtMT09PXIuaW5kZXhPZihvKSYmci5wdXNoKG8pfSkpLHI9dF9zdG9yZV9wcm9kdWN0X3NvcnRWYWx1ZXMocil9ZnVuY3Rpb24gdF9zdG9yZV9wcm9kdWN0X3NvcnRWYWx1ZXNCeU9yZGVyKHQsZSxyKXtyZXR1cm4gdC5zb3J0KChmdW5jdGlvbih0LG8pe3ZhciBuPSJmaWx0ZXIiPT09ZT90LnZhbHVlOnQsaT0iZmlsdGVyIj09PWU/by52YWx1ZTpvO3JldHVybiBuPW4udG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpLGk9aS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCksci5pbmRleE9mKG4pLXIuaW5kZXhPZihpKX0pKX1mdW5jdGlvbiB0X3N0b3JlX3Byb2R1Y3RfaXNTaW1wbGVPcmRlclZhbGlkKHQsZSl7cmV0dXJuIHQuZXZlcnkoKGZ1bmN0aW9uKHQpe3ZhciByPXQ7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiByJiYic3RyaW5nIj09dHlwZW9mIHIudmFsdWUmJihyPXIudmFsdWUpLCJzdHJpbmciPT10eXBlb2YgciYmKHI9ci50cmltKCkudG9VcHBlckNhc2UoKSxlLmluZGV4T2Yocik+PTApfSkpfWZ1bmN0aW9uIHRfc3RvcmVfcHJvZHVjdF9pc0RhdGVPcmRlclZhbGlkKHQpe3ZhciBlPS8oXGR7Mn0pXC4oXGR7Mn0pXC4oXGR7NH0pLztyZXR1cm4gdC5ldmVyeSgoZnVuY3Rpb24odCl7dmFyIHI9dDtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHImJiJzdHJpbmciPT10eXBlb2Ygci52YWx1ZSYmKHI9ci52YWx1ZSksInN0cmluZyI9PXR5cGVvZiByJiYocj1yLnRyaW0oKS50b1VwcGVyQ2FzZSgpKS5tYXRjaChlKX0pKX10X29uUmVhZHkoKGZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKTtpZih0KXt2YXIgZT10LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1wcm9qZWN0LWxhbmciKTtlJiYod2luZG93LnRTdG9yZUJyb3dzZXJMYW5nPWUpLHRfc3RvcmVfX3NldHVwRW5kcG9pbnQoKX10X3N0b3JlX2dldERpY3RPYmooKSx0X3N0b3JlX2ZpeEltZ3MoKX0pKTt2YXIgcmFuZ2VSZWdleEFycmF5PVtuZXcgUmVnRXhwKCJeXFxkKyg/OlsuLF1cXGQrKT9cXHMqW+KAk+KAlC1dXFxzKlxcZCsoPzpbLixdXFxkKyk/KD86XFxzKy4rKT8kIiwiaSIpLG5ldyBSZWdFeHAoIl4o0L7Rgnxmcm9tKVxccytcXGQrKD86Wy4sXVxcZCspP1xccyso0LTQvnx0bylcXHMrXFxkKyg/OlsuLF1cXGQrKT8oPzpcXHMrLispPyQiLCJpIiksbmV3IFJlZ0V4cCgiXijQvNC10L3QtdC1fNC80LXQvdGM0YjQtXxsZXNzXFxzK3RoYW4pXFxzK1xcZCsoPzpbLixdXFxkKyk/KD86XFxzKy4rKT8kIiwiaSIpLG5ldyBSZWdFeHAoIl4o0LHQvtC70LXQtXzQsdC+0LvRjNGI0LV8bW9yZVxccyt0aGFuKVxccytcXGQrKD86Wy4sXVxcZCspPyg/OlxccysuKyk/JCIsImkiKSxuZXcgUmVnRXhwKCJeKNC00L58dXBcXHMrdG8pXFxzK1xcZCsoPzpbLixdXFxkKyk/KD86XFxzKy4rKT8kIiwiaSIpLG5ldyBSZWdFeHAoIl4o0L7Rgnxmcm9tKVxccytcXGQrKD86Wy4sXVxcZCspPyg/OlxccysuKyk/JCIsImkiKSxuZXcgUmVnRXhwKCJeflxccypcXGQrKD86Wy4sXVxcZCspPyg/OlxccysuKyk/JCIsImkiKSxuZXcgUmVnRXhwKCJeKNC+0LrQvtC70L58YWJvdXQpXFxzK1xcZCsoPzpbLixdXFxkKyk/KD86XFxzKy4rKT8kIiwiaSIpXTtmdW5jdGlvbiB0X3N0b3JlX3Byb2R1Y3RfaXNSYW5nZVZhbGlkKHQpe3JldHVybiB0LmV2ZXJ5KChmdW5jdGlvbih0KXt2YXIgZT10LGU7cmV0dXJuInN0cmluZyI9PXR5cGVvZihlPSJvYmplY3QiPT10eXBlb2YgdCYmdC52YWx1ZXx8dCkmJihlPWUudHJpbSgpLnRvTG93ZXJDYXNlKCkscmFuZ2VSZWdleEFycmF5LnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnRlc3QoZSl9KSkpfSkpfXZhciByYW5nZVJlZ2V4PS9eKNC+0YJ8ZnJvbXzQvNC10L3QtdC1fNC80LXQvdGM0YjQtXxsZXNzXHMrdGhhbnzQsdC+0LvQtdC1fNCx0L7Qu9GM0YjQtXxtb3JlXHMrdGhhbnzQtNC+fHVwXHMrdG980L7QutC+0LvQvnxhYm91dHx+KVxzKy9pLHVuaXRzPVt7cGF0dGVybjovKNGB0LXQutGD0L3QtHzRgdC10LrRg9C90LTQsHzRgdC10LrRg9C90LTRi3xzZWN8c2Vjb25kc3xzZWNvbmQpL2ksd2VpZ2h0OjF9LHtwYXR0ZXJuOi8o0LzQuNC90YPRgnzQvNC40L3Rg9GC0LB80LzQuNC90YPRgtGLfG1pbnxtaW51dGVzfG1pbnV0ZSkvaSx3ZWlnaHQ6NjB9LHtwYXR0ZXJuOi8o0YfQsNGB0L7QsnzRh9Cw0YHQsHzRh9Cw0YF8aG91cnN8aG91cnxocikvaSx3ZWlnaHQ6MzYwMH0se3BhdHRlcm46LyjQtNC90LXQuXzQtNC90Y980LTQtdC90Yx8ZGF5c3xkYXkpL2ksd2VpZ2h0Ojg2NDAwfV07ZnVuY3Rpb24gdF9zdG9yZV9wcm9kdWN0X3BhcnNlVGltZVJhbmdlVmFsdWUodCl7dmFyIGU9dC50b1N0cmluZygpLnJlcGxhY2UocmFuZ2VSZWdleCwiIikscj1wYXJzZUZsb2F0KGUucmVwbGFjZSgiLCIsIi4iKSk7aWYocilmb3IodmFyIG89MDtvPHVuaXRzLmxlbmd0aDtvKyspaWYodW5pdHNbb10ucGF0dGVybi50ZXN0KGUpKXJldHVybiByKnVuaXRzW29dLndlaWdodDtyZXR1cm4gcn1mdW5jdGlvbiB0X3N0b3JlX3Byb2R1Y3Rfc29ydFZhbHVlcyh0LGUscil7dmFyIG89dCxuPW98fFtdO2lmKG8ubGVuZ3RoPDIpcmV0dXJuIG47dmFyIGk9ImZpbHRlciI9PT1lP29bMF0udmFsdWUudG9TdHJpbmcoKTpvWzBdLnRvU3RyaW5nKCkscz0iZmlsdGVyIj09PWU/b1sxXS52YWx1ZS50b1N0cmluZygpOm9bMV0udG9TdHJpbmcoKSxhPVsiWFhYUyIsIjNYUyIsIlhYUyIsIjJYUyIsIlhTIiwiWFMtUyIsIlMiLCJTLU0iLCJNIiwiTS1MIiwiTCIsIkwtWEwiLCJYTCIsIlhMLVhYTCIsIlhYTCIsIjJYTCIsIlhYWEwiLCIzWEwiLCJYWFhYTCIsIkJYTCIsIjRYTCIsIkJYWEwiLCI1WEwiLCJCWFhYTCIsIjZYTCIsIjdYTCIsIjhYTCIsIk9ORSBTSVpFIiwi0J7QlNCY0J0g0KDQkNCX0JzQldCgIiwi0KPQndCY0JLQldCg0KHQkNCb0KzQndCr0JkiXSxjPVsi0J/QntCd0JXQlNCV0JvQrNCd0JjQmiIsIk1PTkRBWSIsItCS0KLQntCg0J3QmNCaIiwiVFVFU0RBWSIsItCh0KDQldCU0JAiLCJXRURORVNEQVkiLCLQp9CV0KLQktCV0KDQkyIsIlRIVVJTREFZIiwi0J/Qr9Ci0J3QmNCm0JAiLCJGUklEQVkiLCLQodCj0JHQkdCe0KLQkCIsIlNBVFVSREFZIiwi0JLQntCh0JrQoNCV0KHQldCd0KzQlSIsIlNVTkRBWSJdLGw9WyLQr9Cd0JLQkNCg0KwiLCLQpNCV0JLQoNCQ0JvQrCIsItCc0JDQoNCiIiwi0JDQn9Cg0JXQm9CsIiwi0JzQkNCZIiwi0JjQrtCd0KwiLCLQmNCu0JvQrCIsItCQ0JLQk9Cj0KHQoiIsItCh0JXQndCi0K/QkdCg0KwiLCLQntCa0KLQr9CR0KDQrCIsItCd0J7Qr9CR0KDQrCIsItCU0JXQmtCQ0JHQoNCsIiwiSkFOVUFSWSIsIkZFQlJVQVJZIiwiTUFSQ0giLCJBUFJJTCIsIk1BWSIsIkpVTkUiLCJKVUxZIiwiQVVHVVNUIiwiU0VQVEVNQkVSIiwiT0NUT0JFUiIsIk5PVkVNQkVSIiwiREVDRU1CRVIiXSxkLHAsdSxfLGYseSx2PXt3YXR0Olsi0JLRgiIsIlciLCLQtNCw0JLRgiIsImRhVyIsItCz0JLRgiIsImhXIiwi0LrQktGCIiwia1ciLCLQvNCS0YIiLCJtVyIsItCT0JLRgiIsIkdXIiwi0KLQktGCIiwiVFciLCLQn9CS0YIiLCJQVyJdLGJ5dGVzOlsi0JrQsSIsItCa0LHQsNC50YIiLCJLaUIiLCJLQiIsItCc0LHQsNC50YIiLCLQnNCxIiwiTWlCIiwiTUIiLCJNYiIsItCT0LHQsNC50YIiLCLQk9CxIiwiR2lCIiwiR0IiLCJHYiIsItCi0LHQsNC50YIiLCLQotCxIiwiVGlCIiwiVEIiXSx3ZWlnaHQ6WyLQvNC60LMiLCJtY2ciLCLQvNCzIiwibWciLCLQsyIsImciLCLQutCzIiwia2ciLCLRgiIsInQiLCLRhiJdLGxlbmd0aDpbItC80LrQvCIsItC80LwiLCJtbSIsItC00LwiLCJkbSIsItGB0LwiLCJjbSIsItC8IiwibSIsItC60LwiLCJrbSJdLGxpdHJlOlsi0LzQuyIsItC7Il0sbGFyZ2VOdW1zOlsi0YLRi9GBIiwi0LzQu9C9Iiwi0LzQu9GA0LQiXX0sZz1yfHxvLG09LyhcZHsyfSlcLihcZHsyfSlcLihcZHs0fSkvO2lmKHRfc3RvcmVfcHJvZHVjdF9pc1NpbXBsZU9yZGVyVmFsaWQoZyxhKSluPXRfc3RvcmVfcHJvZHVjdF9zb3J0VmFsdWVzQnlPcmRlcihuLGUsYSk7ZWxzZSBpZih0X3N0b3JlX3Byb2R1Y3RfaXNTaW1wbGVPcmRlclZhbGlkKGcsYykpbj10X3N0b3JlX3Byb2R1Y3Rfc29ydFZhbHVlc0J5T3JkZXIobixlLGMpO2Vsc2UgaWYodF9zdG9yZV9wcm9kdWN0X2lzU2ltcGxlT3JkZXJWYWxpZChnLGwpKW49dF9zdG9yZV9wcm9kdWN0X3NvcnRWYWx1ZXNCeU9yZGVyKG4sZSxsKTtlbHNlIGlmKHRfc3RvcmVfcHJvZHVjdF9pc1JhbmdlVmFsaWQoZykpbj1vLnNvcnQoKGZ1bmN0aW9uKHQscil7dmFyIG89ImZpbHRlciI9PT1lP3QudmFsdWU6dCxuPSJmaWx0ZXIiPT09ZT9yLnZhbHVlOnIsaT10X3N0b3JlX3Byb2R1Y3RfcGFyc2VUaW1lUmFuZ2VWYWx1ZShvLnRvU3RyaW5nKCkpLHM9dF9zdG9yZV9wcm9kdWN0X3BhcnNlVGltZVJhbmdlVmFsdWUobi50b1N0cmluZygpKTtyZXR1cm4gaSYmcz9pLXM6MH0pKTtlbHNlIGlmKHRfc3RvcmVfcHJvZHVjdF9pc0RhdGVPcmRlclZhbGlkKGcpKW49by5zb3J0KChmdW5jdGlvbih0LHIpe3ZhciBvPSJmaWx0ZXIiPT09ZT90LnZhbHVlOnQsbj0iZmlsdGVyIj09PWU/ci52YWx1ZTpyO3JldHVybiBvPW5ldyBEYXRlKG8udG9TdHJpbmcoKS5yZXBsYWNlKG0sIiQyLyQxLyQzIikudHJpbSgpKSxuPW5ldyBEYXRlKG4udG9TdHJpbmcoKS5yZXBsYWNlKG0sIiQyLyQxLyQzIikudHJpbSgpKSxpc05hTihvKXx8aXNOYU4obik/MDpvLW59KSk7ZWxzZXt0cnl7bj1vLnNvcnQoKGZ1bmN0aW9uKHQsbyl7dmFyIG49ImZpbHRlciI9PT1lP3QudmFsdWU6dCxpPSJmaWx0ZXIiPT09ZT9vLnZhbHVlOm8scz1uLnRvU3RyaW5nKCkucmVwbGFjZSgvXijQvtGCfGZyb20pXHMrL2ksIiIpLGE9aS50b1N0cmluZygpLnJlcGxhY2UoL14o0L7Rgnxmcm9tKVxzKy9pLCIiKTtpZihzPXBhcnNlRmxvYXQocy50b1N0cmluZygpLnJlcGxhY2UoIiwiLCIuIikudHJpbSgpLDEwKSxhPXBhcnNlRmxvYXQoYS50b1N0cmluZygpLnJlcGxhY2UoIiwiLCIuIikudHJpbSgpLDEwKSxpc05hTihzKXx8aXNOYU4oYSkpcmV0dXJuIHI/ci5pbmRleE9mKG4pLXIuaW5kZXhPZihpKTowO2lmKHM9PT1hKXt2YXIgYz0iZmlsdGVyIj09PWU/dC52YWx1ZTp0LGw9ImZpbHRlciI9PT1lP28udmFsdWU6bztjPWMudG9TdHJpbmcoKS5yZXBsYWNlKC9eKNC+0YJ8ZnJvbSlccysvaSwiIikucmVwbGFjZSgiLCIsIi4iKS50cmltKCksbD1sLnRvU3RyaW5nKCkucmVwbGFjZSgvXijQvtGCfGZyb20pXHMrL2ksIiIpLnJlcGxhY2UoIiwiLCIuIikudHJpbSgpO3ZhciBkPS8oXGQrKVxzPyh4fNGFfMOXKVxzPyhcZCspL2dpLHA9Yy5tYXRjaChkKSx1PWwubWF0Y2goZCk7cmV0dXJuIHAmJnUmJihjPXBbMl0sbD11WzJdKSxjPmw/MTpsPmM/LTE6MH1yZXR1cm4gcy1hfSkpfWNhdGNoKEUpe2NvbnNvbGUuZXJyb3IoRSl9dHJ5e2Zvcih2YXIgaCBpbiB2KXt2YXIgYj12W2hdLHc9dF9zdG9yZV9wcm9kdWN0X2hhc01lYXN1cmVVbml0KGIsaSkmJnRfc3RvcmVfcHJvZHVjdF9oYXNNZWFzdXJlVW5pdChiLHMpLFM9bmV3IFJlZ0V4cCgvXlxkKiw/XC4/XGQrXHMqLywiZ2kiKTtpZih3KXJldHVybiBuPW4uc29ydCgoZnVuY3Rpb24odCxyKXt2YXIgbz0iZmlsdGVyIj09PWU/dC52YWx1ZTp0LG49ImZpbHRlciI9PT1lP3IudmFsdWU6cjtyZXR1cm4gbz1vLnRvU3RyaW5nKCkucmVwbGFjZShTLCIiKS50cmltKCksbj1uLnRvU3RyaW5nKCkucmVwbGFjZShTLCIiKS50cmltKCksYi5pbmRleE9mKG8pLWIuaW5kZXhPZihuKX0pKX19Y2F0Y2goRSl7Y29uc29sZS5lcnJvcihFKX19cmV0dXJuIG59ZnVuY3Rpb24gdF9zdG9yZV9wcm9kdWN0X2hhc01lYXN1cmVVbml0KHQsZSl7dmFyIHI9ZS5yZXBsYWNlKC9ccy9nLCIiKTtyZXR1cm4gdC5zb21lKChmdW5jdGlvbih0KXt2YXIgZSxvO3JldHVybiBuZXcgUmVnRXhwKCJeW1xcZC4sXSsoIit0KyIpezF9JCIsImkiKS50ZXN0KHIpfSkpfWZ1bmN0aW9uIHRfc3RvcmVfcHJvZHVjdF9nZXRFZGl0aW9uT3B0aW9uc0Fycl9nZXRQYXJhbXModCxlLHIpe3ZhciBvPXt9O2lmKHIpbz1yW3RdP3JbdF0ucGFyYW1zOnt9O2Vsc2UgdHJ5e3ZhciBuPUpTT04ucGFyc2UoZS5qc29uX29wdGlvbnMpO24mJm4uZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5wYXJhbXMmJmUudGl0bGUmJmUudGl0bGU9PT10JiYobz1lLnBhcmFtcyl9KSl9Y2F0Y2goaSl7Y29uc29sZS5lcnJvcihpKX1yZXR1cm4gb31mdW5jdGlvbiB0X3N0b3JlX3Byb2R1Y3RfZ2V0RWRpdGlvbk9wdGlvbnNBcnJfZ2V0SW1nVmFsdWVzKHQsZSl7dmFyIHI9e307cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG89ZVt0XTtyW29dfHwocltvXT1lLmltZyl9KSkscn1mdW5jdGlvbiB0X3N0b3JlX3Byb2R1Y3RfZ2V0RWRpdGlvblNlbGVjdEVsKHQsZSl7cmV0dXJuIHQucXVlcnlTZWxlY3RvcignLmpzLXByb2R1Y3QtZWRpdGlvbi1vcHRpb25bZGF0YS1lZGl0aW9uLW9wdGlvbi1pZD0iJytlLmlkKyciXScpfWZ1bmN0aW9uIHRfc3RvcmVfY29tYmluZU9wdGlvbklkQnlOYW1lKHQpe3JldHVybiB0LnJlcGxhY2UoL1tcXCciPD57fV0vZywiIil9ZnVuY3Rpb24gdF9zdG9yZV9nZXRQcm9kdWN0Rmlyc3RJbWcodCl7aWYodC5nYWxsZXJ5JiYiWyI9PT10LmdhbGxlcnlbMF0pe3ZhciBlPUpTT04ucGFyc2UodC5nYWxsZXJ5KTtpZihlWzBdJiZlWzBdLmltZylyZXR1cm4gZVswXS5pbWd9cmV0dXJuIiJ9ZnVuY3Rpb24gdF9zdG9yZV9fZ2V0Rm9ybWF0dGVkUHJpY2UodCxlKXtpZihudWxsPT1lfHwiIj09PWUpcmV0dXJuIiI7dmFyIHI9dF9zdG9yZV9fY2xlYW5QcmljZShlKTtyPXIudG9TdHJpbmcoKTt2YXIgbz0hMSxuPSExLGk7KHQuY3VycmVuY3lEZWNpbWFsP289IjAwIj09PXQuY3VycmVuY3lEZWNpbWFsOnZvaWQgMCE9PXdpbmRvdy50Y2FydCYmdm9pZCAwIT09d2luZG93LnRjYXJ0LmN1cnJlbmN5X2RlYyYmKG89IjAwIj09PXdpbmRvdy50Y2FydC5jdXJyZW5jeV9kZWMpLHQuY3VycmVuY3lTZXBhcmF0b3I/bj0iLiI9PT10LmN1cnJlbmN5U2VwYXJhdG9yOnZvaWQgMCE9PXdpbmRvdy50Y2FydCYmdm9pZCAwIT09d2luZG93LnRjYXJ0LmN1cnJlbmN5X3NlcCYmKG49Ii4iPT09d2luZG93LnRjYXJ0LmN1cnJlbmN5X3NlcCksbykmJigtMT09PXIuaW5kZXhPZigiLiIpJiYtMT09PXIuaW5kZXhPZigiLCIpP3IrPSIuMDAiOjE9PT1yLnN1YnN0cmluZyhyLmluZGV4T2YoIi4iKSsxKS5sZW5ndGgmJihyKz0iMCIpKTtyZXR1cm4gcj0ocj1uP3IucmVwbGFjZSgiLCIsIi4iKTpyLnJlcGxhY2UoIi4iLCIsIikpLnRvU3RyaW5nKCkucmVwbGFjZSgvXEIoPz0oXGR7M30pKyg/IVxkKSkvZywiICIpfWZ1bmN0aW9uIHRfc3RvcmVfX2dldEZvcm1hdHRlZE1pblByaWNlKHQsZSl7dmFyIHI9ZS5taW5QcmljZTtyZXR1cm4gbnVsbCE9ciYmKHI9dF9zdG9yZV9fZ2V0Rm9ybWF0dGVkUHJpY2UodCxyKSkscn1mdW5jdGlvbiB0X3N0b3JlX19nZXRGb3JtYXR0ZWRQcmljZVJhbmdlKHQsZSl7aWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJwcm9kQ2FyZCIpfHx0LnByb2RDYXJkLnNob3dPcHRzfHwhdC5wcmljZS5wcmljZVJhbmdlfHwiIj09PXQucHJpY2UucHJpY2VSYW5nZXx8IU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCJtaW5QcmljZSIpfHwhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIm1heFByaWNlIikpcmV0dXJuIG51bGw7dmFyIHI9ZS5taW5QcmljZSxvPWUubWF4UHJpY2U7aWYobnVsbD09PXJ8fG51bGw9PT1vfHxyPT09bylyZXR1cm4gbnVsbDtyPXRfc3RvcmVfX2dldEZvcm1hdHRlZFByaWNlKHQsciksbz10X3N0b3JlX19nZXRGb3JtYXR0ZWRQcmljZSh0LG8pO3ZhciBuPXQucHJpY2UucHJpY2VSYW5nZTtyZXR1cm4icmFuZ2UiPT09bj9yKyLigJQiK286ImZyb20iPT09bj93aW5kb3cudFN0b3JlRGljdC5mcm9tKyIgIityOm51bGx9ZnVuY3Rpb24gdF9zdG9yZV9sb2FkTW9yZUJ0bl9kaXNwbGF5KHQpe3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK3QpO2lmKGUpe3ZhciByPWUucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX2xvYWQtbW9yZS1idG4td3JhcCIpLG89ZS5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtZ3JpZC1jb250LnQtc3RvcmVfX2dyaWQtY29udF9tb2JpbGUtb25lLXJvdyIpLG49ISEod2luZG93LmlubmVyV2lkdGg8OTYwJiZvKTtyJiZyLmNsYXNzTGlzdC50b2dnbGUoInQtc3RvcmVfX2xvYWQtbW9yZS1idG4td3JhcF9oaWRkZW4iLG4pfX1mdW5jdGlvbiB0X3N0b3JlX29uZVByb2R1Y3RfaW5pdCh0LGUpe3ZhciByPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNyZWMiK3QrIiAuanMtc3RvcmUtcHJvZHVjdF9zaW5nbGUiKTtpZihyKXt2YXIgbz1yLmdldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LWdlbi11aWQiKTtvPXRfc3RvcmVfb25lUHJvZHVjdF9jbGVhclVpZChvKSxyLnNldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LWdlbi11aWQiLG8pLHdpbmRvdy50U3RvcmVJc1NlYXJjaEJvdHx8dF9zdG9yZV9vbmVQcm9kdWN0X3ByZWxvYWRlcl9hZGQodCk7dmFyIG49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpO2UuaXNQdWJsaXNoZWRQYWdlPSJlZGl0IiE9PW4mJiJwcmV2aWV3IiE9PW47dmFyIGk9d2luZG93LnRTdG9yZVNpbmdsZVByb2RzT2JqJiYhZS5wcmV2aWV3bW9kZTshd2luZG93LnRTdG9yZVNpbmdsZVByb2R1Y3RzSXNSZXF1ZXN0ZWR8fGk/KHRfc3RvcmVfb25lUHJvZHVjdF9yZXF1ZXN0QWxsU2luZ2xlKGUpLHdpbmRvdy50U3RvcmVTaW5nbGVQcm9kdWN0c0lzUmVxdWVzdGVkPSEwLHIuYWRkRXZlbnRMaXN0ZW5lcigidFN0b3JlU2luZ2xlUHJvZHVjdHNMb2FkZWQiLChmdW5jdGlvbigpe3Rfc3RvcmVfb25lUHJvZHVjdF9maWxsKHQsd2luZG93LnRTdG9yZVNpbmdsZVByb2RzT2JqW29dLGUpfSkpKTp3aW5kb3cudFN0b3JlU2luZ2xlUHJvZHNPYmo/dF9zdG9yZV9vbmVQcm9kdWN0X2ZpbGwodCx3aW5kb3cudFN0b3JlU2luZ2xlUHJvZHNPYmpbb10sZSk6ci5hZGRFdmVudExpc3RlbmVyKCJ0U3RvcmVTaW5nbGVQcm9kdWN0c0xvYWRlZCIsKGZ1bmN0aW9uKCl7dF9zdG9yZV9vbmVQcm9kdWN0X2ZpbGwodCx3aW5kb3cudFN0b3JlU2luZ2xlUHJvZHNPYmpbb10sZSl9KSl9fWZ1bmN0aW9uIHRfc3RvcmVfb25lUHJvZHVjdF9jbGVhclVpZCh0KXtyZXR1cm4gdC5yZXBsYWNlKCJwcm9kdWN0IGlkOiAiLCIiKX1mdW5jdGlvbiB0X3N0b3JlX29uZVByb2R1Y3RfcHJlbG9hZGVyX2FkZCh0KXt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIit0KSxyPWUucXVlcnlTZWxlY3RvcigiLmpzLXN0b3JlLXByb2R1Y3Rfc2luZ2xlIik7aWYocil7dmFyIG89ci5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtc2luZ2xlLXByb2R1Y3QtaW5mbyIpO28uc3R5bGUuZGlzcGxheT0ibm9uZSIsY2xlYXJUaW1lb3V0KGUuZ2V0QXR0cmlidXRlKCJkYXRhLXByZWxvYWRlci10aW1lb3V0IikpO3ZhciBuPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dmFyIHQ9IiI7dCs9JzxkaXYgY2xhc3M9InQtc3RvcmVfX3NpbmdsZS1wcm9kLXByZWxvYWRlciIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPic7Zm9yKHZhciBlPSc8ZGl2IGNsYXNzPSJ0LXN0b3JlX19zaW5nbGUtcHJvZC1wcmVsb2FkZXJfX3RleHQiPjwvZGl2Picsbj0wO248NjtuKyspdCs9ZTt0Kz0iPC9kaXY+IixvLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlYmVnaW4iLHQpLHRfc3RvcmVfX2ZhZGVJbihyLnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19zaW5nbGUtcHJvZC1wcmVsb2FkZXIiKSl9KSwxZTMpO2Uuc2V0QXR0cmlidXRlKCJkYXRhLXByZWxvYWRlci10aW1lb3V0IixuKX19ZnVuY3Rpb24gdF9zdG9yZV9vbmVQcm9kdWN0X3ByZWxvYWRlcl9oaWRlKHQpe3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK3QpLHI9ZS5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtcHJvZHVjdF9zaW5nbGUiKTtpZihyKXtjbGVhclRpbWVvdXQoZS5nZXRBdHRyaWJ1dGUoImRhdGEtcHJlbG9hZGVyLXRpbWVvdXQiKSk7dmFyIG89ci5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtc2luZ2xlLXByb2R1Y3QtaW5mbyIpO28mJihvLnN0eWxlLmRpc3BsYXk9IiIpO3ZhciBuPXIucXVlcnlTZWxlY3RvcignYS50LWJ0bltocmVmPSIjb3JkZXIiXScpLGk9bj9uLnBhcmVudEVsZW1lbnR8fG4ucGFyZW50Tm9kZToiIjtpJiYoaS5zdHlsZS5wb2ludGVyRXZlbnRzPSJpbmhlcml0IiksdF9zdG9yZV9fcmVtb3ZlRWxlbWVudChyLnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19zaW5nbGUtcHJvZC1wcmVsb2FkZXIiKSl9fWZ1bmN0aW9uIHRfc3RvcmVfb25lUHJvZHVjdF9yZXF1ZXN0QWxsU2luZ2xlKHQpe3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5qcy1zdG9yZS1wcm9kdWN0X3NpbmdsZSIpLHI9W107QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLChmdW5jdGlvbih0KXt2YXIgZT10LmdldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LWdlbi11aWQiKTtlPXRfc3RvcmVfb25lUHJvZHVjdF9jbGVhclVpZChlKSxyLnB1c2goZSl9KSk7dmFyIG89ZnVuY3Rpb24gdChyKXt2YXIgbz1yLnByb2R1Y3RzOyIiIT09bz8oci5vcHRpb25zJiZyLm9wdGlvbnMubGVuZ3RoJiYhd2luZG93LnRTdG9yZU9wdGlvbnNMaXN0JiYod2luZG93LnRTdG9yZU9wdGlvbnNMaXN0PXIub3B0aW9ucyksd2luZG93LnRTdG9yZVNpbmdsZVByb2RzT2JqPXRfc3RvcmVfb25lUHJvZHVjdF9wcm9kc0FyclRvQXNzb2NpYXRpdmUobyksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLChmdW5jdGlvbih0KXt0X3N0b3JlX3RyaWdnZXJFdmVudCh0LCJ0U3RvcmVTaW5nbGVQcm9kdWN0c0xvYWRlZCIpfSkpKTpjb25zb2xlLmVycm9yKCJTb21ldGhpbmcgd2VudCB3cm9uZy4gQ2FuJ3QgZ2V0IHByb2R1Y3RzIGFycmF5IGJ5IHVpZCBsaXN0LiBQbGVhc2UgY2hlY2sgcHJvZHVjdHMgVUlELiIpfTt0X3N0b3JlX2xvYWRQcm9kdWN0c19ieUlkKHIsdCxvLChmdW5jdGlvbihlKXt0X3N0b3JlX2NoYW5nZUVuZHBvaW50KGUsKGZ1bmN0aW9uKCl7dF9zdG9yZV9sb2FkUHJvZHVjdHNfYnlJZChyLHQsbyl9KSl9KSl9ZnVuY3Rpb24gdF9zdG9yZV9vbmVQcm9kdWN0X3Byb2RzQXJyVG9Bc3NvY2lhdGl2ZSh0KXt2YXIgZT17fTtpZighdClyZXR1cm4gZTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIG89dFtyXTtlW28udWlkXT1vfXJldHVybiBlfWZ1bmN0aW9uIHRfc3RvcmVfb25lUHJvZHVjdF9maWxsKHQsZSxyKXt2YXIgbyxuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK3QpLnF1ZXJ5U2VsZWN0b3IoIi5qcy1wcm9kdWN0Iik7aWYobil7aWYodF9zdG9yZV9vbmVQcm9kdWN0X3ByZWxvYWRlcl9oaWRlKHQpLG4uc2V0QXR0cmlidXRlKCJkYXRhLWNhcmQtc2l6ZSIsImxhcmdlIiksIWUpcmV0dXJuIHRfc3RvcmVfb25lUHJvZHVjdF9lcnJvcl9zaG93KHQsciksdF9zdG9yZV9wcm9kdWN0X3RyaWdnZXJTb2xkT3V0TXNnKHQsbiwhMCxyKSx2b2lkKCIiPT09bi5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtcHJvZC1wcmljZS1vbGQtdmFsIikudGV4dENvbnRlbnQmJihuLnF1ZXJ5U2VsZWN0b3IoIi5qcy1zdG9yZS1wcm9kLXByaWNlLW9sZCIpLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk7dF9zdG9yZV9vbmVQcm9kdWN0X3N1Y2Nlc3NNc2dfc2hvdyh0LGUsciksbi5zZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC1wYWNrLWxhYmVsIixlLnBhY2tfbGFiZWwpLG4uc2V0QXR0cmlidXRlKCJkYXRhLXByb2R1Y3QtcGFjay1tIixlLnBhY2tfbSksbi5zZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC1wYWNrLXgiLGUucGFja194KSxuLnNldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LXBhY2steSIsZS5wYWNrX3kpLG4uc2V0QXR0cmlidXRlKCJkYXRhLXByb2R1Y3QtcGFjay16IixlLnBhY2tfeiksbi5zZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC11cmwiLGUudXJsfHwiIik7dmFyIGk9ZS5wYXJ0dWlkcyYmSlNPTi5wYXJzZShlLnBhcnR1aWRzKTtuLnNldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LXBhcnQtdWlkIixpfHwiIiksdF9zdG9yZV9hZGRQcm9kdWN0T3B0aW9ucyh0LGUsbixyLCJsYXJnZWNhcmQiKSx0X3N0b3JlX3NuaXBwZXRfY2hvb3NlRWRpdGlvbkZyb21VcmwodCxlLG4sciksdF9zdG9yZV9vbkZ1bmNMb2FkKCJ0X3Byb2RfX2luaXQiLChmdW5jdGlvbigpe3RfcHJvZF9faW5pdCh0KX0pKTt2YXIgcz1uLnF1ZXJ5U2VsZWN0b3IoIi5qcy1zdG9yZS1wcm9kLXNrdSIpO2lmKHMmJiJub25lIiE9PXMuc3R5bGUuZGlzcGxheSl7dmFyIGE9cy5wYXJlbnROb2RlO2EmJmEuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWRlc2NyIikmJnMuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmViZWdpbiIsd2luZG93LnRTdG9yZURpY3Quc2t1KyI6ICIpfXRfc3RvcmVfb3B0aW9uX2hhbmRsZU9uQ2hhbmdlKG4pLHRfc3RvcmVfb3B0aW9uX2hhbmRsZU9uQ2hhbmdlX2N1c3RvbSh0LG4scil9fWZ1bmN0aW9uIHRfc3RvcmVfb25lUHJvZHVjdF9zdWNjZXNzTXNnX3Nob3codCxlLHIpe2lmKCFyLnByZXZpZXdtb2RlKXt2YXIgbz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIit0KSxuPSJSVSI9PT13aW5kb3cudFN0b3JlQnJvd3Nlckxhbmc/ItCi0L7QstCw0YAg0YPRgdC/0LXRiNC90L4g0YHQstGP0LfQsNC9INGBINC60LDRgtCw0LvQvtCz0L7QvC4g0J3QsNC30LLQsNC90LjQtSDRgtC+0LLQsNGA0LAg0LIg0LrQsNGC0LDQu9C+0LPQtTogIjoiUHJvZHVjdCBpcyBjb25uZWN0ZWQgdG8gY2F0YWxvZy4gUHJvZHVjdCBuYW1lIGluIGNhdGFsb2cgaXMgIjt0X3N0b3JlX3Nob3dNc2dJblJlZGFjdG9yKG8sbis9IjxiPiIrZS50aXRsZSsiPC9iPiIsInN1Y2Nlc3MiKX19ZnVuY3Rpb24gdF9zdG9yZV9vbmVQcm9kdWN0X2Vycm9yX3Nob3codCxlKXt2YXIgcixvO2UucHJldmlld21vZGV8fHRfc3RvcmVfc2hvd01zZ0luUmVkYWN0b3IoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrdCksIlJVIj09PXdpbmRvdy50U3RvcmVCcm93c2VyTGFuZz8i0J3QtSDRg9C00LDQtdGC0YHRjyDQv9C+0LvRg9GH0LjRgtGMINGC0L7QstCw0YAg0LjQtyDQutCw0YLQsNC70L7Qs9CwLiDQktC+0LfQvNC+0LbQvdC+INC+0L0g0LHRi9C7INGD0LTQsNC70LXQvSDQuNC70Lgg0L7RgtC60LvRjtGH0LXQvS4g0J/QvtC20LDQu9GD0LnRgdGC0LAsINC/0YDQvtCy0LXRgNGM0YLQtSwg0YfRgtC+INGC0L7QstCw0YAg0YEg0YLQsNC60LjQvCBJRCDRgdGD0YnQtdGB0YLQstGD0LXRgi4iOiJDYW4ndCBmaW5kIGEgcHJvZHVjdCBpbiB0aGUgY2F0YWxvZy4gSXQgbWF5IGhhdmUgYmVlbiBkZWxldGVkIG9yIGRpc2FibGVkLiBQbGVhc2UgY2hlY2sgdGhhdCB0aGUgcHJvZHVjdCB3aXRoIHRoaXMgSUQgZXhpc3RzLiIsImVycm9yIil9ZnVuY3Rpb24gdF9zdG9yZV9zaG93TXNnSW5SZWRhY3Rvcih0LGUscil7dmFyIG87dF9zdG9yZV9fcmVtb3ZlRWxlbWVudCh0LnF1ZXJ5U2VsZWN0b3IoIi5qcy1zdG9yZS1tc2ciKSk7dmFyIG4saT0ic3VjY2VzcyI9PT1yPyIjNjJDNTg0IjoieWVsbG93IixzPSIiO3MrPSc8ZGl2IGNsYXNzPSJqcy1zdG9yZS1tc2ciIHN0eWxlPSJtYXJnaW46IDA7dGV4dC1hbGlnbjogbGVmdDsgZm9udC1mYW1pbHk6IHRmdXR1cmEsQXJpYWwsc2Fucy1zZXJpZjsgY29sb3I6ICcrKCJzdWNjZXNzIj09PXI/IiNmZmYiOiIjMDAwIikrJzsiPicscys9JyAgIDxkaXYgc3R5bGU9ImJhY2tncm91bmQ6ICcraSsnOyBwYWRkaW5nOiAxNnB4IDIwcHg7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IG1hcmdpbi1ib3R0b206IDMwcHg7IHBvc2l0aW9uOiByZWxhdGl2ZTsiIGNsYXNzPSJ0LWNvbnRhaW5lciI+JyxzKz0nICAgICAgIDxkaXYgc3R5bGU9IndpZHRoOiA0MHB4OyBoZWlnaHQ6IDQwcHg7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMjBweDsgYm90dG9tOiAtNDBweDsiPicscys9JyAgICAgICA8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4xIiBoZWlnaHQ9IjQwcHgiIHdpZHRoPSI0MHB4Ij48cG9seWdvbiBmaWxsPSInK2krJyIgc3Ryb2tlPSInK2krJyIgc3Ryb2tlLXdpZHRoPSIwIiBwb2ludHM9IjAsMCA0MCwwIDAsMjAgMCwwIj48L3BvbHlnb24+PC9zdmc+JyxzKz0iICAgICAgIDwvZGl2PiIscys9ZSxzKz0iICAgPC9kaXY+IixzKz0iPC9kaXY+Iix0Lmluc2VydEFkamFjZW50SFRNTCgiYWZ0ZXJiZWdpbiIscyl9ZnVuY3Rpb24gdF9zdG9yZV9pc1F1ZXJ5SW5BZGRyZXNzQmFyKHQpe3ZhciBlO3RyeXtlPWRlY29kZVVSSSh3aW5kb3cubG9jYXRpb24uaHJlZil9Y2F0Y2gocil7Y29uc29sZS5lcnJvcihyKSxlPXdpbmRvdy5sb2NhdGlvbi5ocmVmfXJldHVybiEhZSYmLTEhPT1lLmluZGV4T2YodCl9ZnVuY3Rpb24gdF9zdG9yZV9nZXRDb2x1bW5XaWR0aCh0KXt2YXIgZSxyLG87cmV0dXJue21pbldpZHRoMTIwMDp7Y29sXzE6NjAsY29sXzI6MTYwLGNvbF8zOjI2MCxjb2xfNDozNjAsY29sXzU6NDYwLGNvbF82OjU2MCxjb2xfNzo2NjAsY29sXzg6NzYwLGNvbF85Ojg2MCxjb2xfMTA6OTYwLGNvbF8xMToxMDYwLGNvbF8xMjoxMTYwfSxtYXhXaWR0aDEyMDA6e2NvbF8xOjYwLGNvbF8yOjE0MCxjb2xfMzoyMjAsY29sXzQ6MzAwLGNvbF81OjM4MCxjb2xfNjo0NjAsY29sXzc6NTQwLGNvbF84OjYyMCxjb2xfOTo3MDAsY29sXzEwOjc4MCxjb2xfMTE6ODYwLGNvbF8xMjo5NDB9fVsod2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aHx8ZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCk+MTIwMD8ibWluV2lkdGgxMjAwIjoibWF4V2lkdGgxMjAwIl1bImNvbF8iK3RdfWZ1bmN0aW9uIHRfc3RvcmVfb3B0aW9uX2dldE9wdGlvbnNEYXRhKCl7dmFyIHQ9d2luZG93LnRTdG9yZU9wdGlvbnNMaXN0O2lmKCF0KXJldHVybiBudWxsO2Zvcih2YXIgZT17fSxyPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBvPXRbcl0sbj1vLnRpdGxlO28ucGFyYW1zJiYic3RyaW5nIj09dHlwZW9mIG8ucGFyYW1zJiYoby5wYXJhbXM9SlNPTi5wYXJzZShvLnBhcmFtcykpLG8udmFsdWVzJiYic3RyaW5nIj09dHlwZW9mIG8udmFsdWVzJiYoby52YWx1ZXM9SlNPTi5wYXJzZShvLnZhbHVlcykpLGVbbl09b31yZXR1cm4gZX1mdW5jdGlvbiB0X3N0b3JlX29wdGlvbl9jaGVja0lmQ3VzdG9tKHQpe3ZhciBlPXQucGFyYW1zO3JldHVybiEoIWV8fEFycmF5LmlzQXJyYXkoZSkpJiYoISghZS52aWV3fHwic2VsZWN0Ij09PWUudmlldyl8fCEoIWUuaGFzQ29sb3ImJiFlLmxpbmtJbWFnZSkpfWZ1bmN0aW9uIHRfc3RvcmVfb3B0aW9uX2hhbmRsZU9uQ2hhbmdlX2N1c3RvbSh0LGUscil7dmFyIG89ZnVuY3Rpb24gdCgpe3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIikscj1lJiYiZWRpdCI9PT1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tb2RlIiksbz10aGlzLmNsb3Nlc3QoIi5qcy1wcm9kdWN0LWVkaXRpb24tb3B0aW9uIiksbj1vLnF1ZXJ5U2VsZWN0b3IoIi50LXByb2R1Y3RfX29wdGlvbi12YXJpYW50c19jdXN0b20iKTtpZihvJiZuKXt2YXIgaT10aGlzLnZhbHVlLHM9bi5xdWVyeVNlbGVjdG9yKCIudC1wcm9kdWN0X19vcHRpb24taXRlbV9hY3RpdmUiKTtpZihzKXt2YXIgYT1zLnF1ZXJ5U2VsZWN0b3IoIi50LXByb2R1Y3RfX29wdGlvbi1pbnB1dCIpO2lmKGEudmFsdWUhPT1pKXthLmNoZWNrZWQ9ITEsaT0oaXx8IiIpLnJlcGxhY2UoLyIvZywnXFwiJyk7dmFyIGM9bi5xdWVyeVNlbGVjdG9yKCcudC1wcm9kdWN0X19vcHRpb24taW5wdXRbdmFsdWU9IicraSsnIl0nKTtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3ImJmMuY2xpY2soKSxjLmNoZWNrZWQ9ITB9KSkscy5jbGFzc0xpc3QucmVtb3ZlKCJ0LXByb2R1Y3RfX29wdGlvbi1pdGVtX2FjdGl2ZSIpLGMucGFyZW50Tm9kZS5jbGFzc0xpc3QuYWRkKCJ0LXByb2R1Y3RfX29wdGlvbi1pdGVtX2FjdGl2ZSIpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dF9zdG9yZV90cmlnZ2VyRXZlbnQoZG9jdW1lbnQuYm9keSwidHdpc2hsaXN0X2FkZGJ0biIpfSksNTApfX19ZWxzZSBzZXRUaW1lb3V0KChmdW5jdGlvbigpe3Rfc3RvcmVfdHJpZ2dlckV2ZW50KGRvY3VtZW50LmJvZHksInR3aXNobGlzdF9hZGRidG4iKX0pLDUwKX07ZnVuY3Rpb24gbih0KXt0LmNsYXNzTGlzdC5yZW1vdmUoInQtcHJvZHVjdF9fb3B0aW9uLWl0ZW1fYWN0aXZlIil9QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLnF1ZXJ5U2VsZWN0b3JBbGwoIi5qcy1wcm9kdWN0LWVkaXRpb24tb3B0aW9uLXZhcmlhbnRzIiksKGZ1bmN0aW9uKHQpe3ZhciBlLHI7dC5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLG8pLHQuY2xvc2VzdCgiLmpzLXByb2R1Y3QtZWRpdGlvbi1vcHRpb24iKS5xdWVyeVNlbGVjdG9yKCIudC1wcm9kdWN0X19vcHRpb24tdmFyaWFudHNfY3VzdG9tIikmJnQuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIixvKX0pKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUucXVlcnlTZWxlY3RvckFsbCgiLnQtcHJvZHVjdF9fb3B0aW9uLXZhcmlhbnRzX2N1c3RvbSIpLChmdW5jdGlvbih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXByb2R1Y3RfX29wdGlvbi1pbnB1dCIpLHI9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1wcm9kdWN0X19vcHRpb24taXRlbSIpLG89dC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3IoIi50LXByb2R1Y3RfX29wdGlvbi12YXJpYW50c19yZWd1bGFyIC5qcy1wcm9kdWN0LWVkaXRpb24tb3B0aW9uLXZhcmlhbnRzIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLChmdW5jdGlvbih0KXt0LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsKGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy52YWx1ZS5yZXBsYWNlKC8mL2csIiZhbXA7Iik7by52YWx1ZT10LHRfdHJpZ2dlckV2ZW50KG8sImNoYW5nZSIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwocixuKSx0aGlzLnBhcmVudE5vZGUuY2xhc3NMaXN0LmFkZCgidC1wcm9kdWN0X19vcHRpb24taXRlbV9hY3RpdmUiKX0pKX0pKX0pKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUucXVlcnlTZWxlY3RvckFsbCgiLnQtcHJvZHVjdF9fb3B0aW9uLXNlbGVjdGVkX3NlbGVjdCIpLChmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbiB0KCl7dGhpcy5uZXh0RWxlbWVudFNpYmxpbmcuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXByb2R1Y3RfX29wdGlvbi12YXJpYW50c19jdXN0b20iKSYmdGhpcy5uZXh0RWxlbWVudFNpYmxpbmcuY2xhc3NMaXN0LnRvZ2dsZSgidC1wcm9kdWN0X19vcHRpb24tdmFyaWFudHNfaGlkZGVuIiksInkiPT09d2luZG93LmxhenkmJnRfbGF6eWxvYWRfdXBkYXRlKCl9O3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLGUpLHQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGUpO3ZhciByPXQucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yKCIudC1wcm9kdWN0X19vcHRpb24tdmFyaWFudHNfY3VzdG9tIiksbz1yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXByb2R1Y3RfX29wdGlvbi1pdGVtIiksbj1mdW5jdGlvbiB0KCl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChvLChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5yZW1vdmUoInQtcHJvZHVjdF9fb3B0aW9uLWl0ZW1fYWN0aXZlIil9KSksdGhpcy5jbGFzc0xpc3QuYWRkKCJ0LXByb2R1Y3RfX29wdGlvbi1pdGVtX2FjdGl2ZSIpLHRoaXMuY2xvc2VzdCgiLnQtcHJvZHVjdF9fb3B0aW9uLXZhcmlhbnRzX2N1c3RvbSIpLmNsYXNzTGlzdC5hZGQoInQtcHJvZHVjdF9fb3B0aW9uLXZhcmlhbnRzX2hpZGRlbiIpO3ZhciBlPXRoaXMucXVlcnlTZWxlY3RvcigiLnQtcHJvZHVjdF9fb3B0aW9uLXRpdGxlIikudGV4dENvbnRlbnQscjt0aGlzLmNsb3Nlc3QoIi50LXByb2R1Y3RfX29wdGlvbiIpLnF1ZXJ5U2VsZWN0b3IoIi50LXByb2R1Y3RfX29wdGlvbi1zZWxlY3RlZC10aXRsZSIpLnRleHRDb250ZW50PWU7dmFyIG49dGhpcy5jbG9zZXN0KCIudC1wcm9kdWN0X19vcHRpb24iKS5xdWVyeVNlbGVjdG9yKCIudC1wcm9kdWN0X19vcHRpb24tc2VsZWN0ZWQudC1wcm9kdWN0X19vcHRpb24tc2VsZWN0ZWRfY29sb3IiKSxpO2lmKG4pe3ZhciBzPXRoaXMucXVlcnlTZWxlY3RvcigiLnQtcHJvZHVjdF9fb3B0aW9uLWNoZWNrbWFya19jb2xvciIpLnN0eWxlLmJhY2tncm91bmRDb2xvcjsoaT1uLnF1ZXJ5U2VsZWN0b3IoIi50LXByb2R1Y3RfX29wdGlvbi1zZWxlY3RlZC1jaGVja21hcmsiKSkuc3R5bGUuYmFja2dyb3VuZENvbG9yPXN9dmFyIGE9dGhpcy5jbG9zZXN0KCIudC1wcm9kdWN0X19vcHRpb24iKS5xdWVyeVNlbGVjdG9yKCIudC1wcm9kdWN0X19vcHRpb24tc2VsZWN0ZWQudC1wcm9kdWN0X19vcHRpb24tc2VsZWN0ZWRfaW1hZ2UiKTtpZihhKXt2YXIgYz10aGlzLnF1ZXJ5U2VsZWN0b3IoIi50LXByb2R1Y3RfX29wdGlvbi1jaGVja21hcmtfaW1hZ2UiKS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UsbD10aGlzLnF1ZXJ5U2VsZWN0b3IoIi50LXByb2R1Y3RfX29wdGlvbi1jaGVja21hcmtfaW1hZ2UiKS5nZXRBdHRyaWJ1dGUoImRhdGEtb3JpZ2luYWwiKTsoaT1hLnF1ZXJ5U2VsZWN0b3IoIi50LXByb2R1Y3RfX29wdGlvbi1zZWxlY3RlZC1jaGVja21hcmsiKSkuc2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsIixsKSxpLnN0eWxlLmJhY2tncm91bmRJbWFnZT0ibm9uZSIsaS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2U9Y319O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobywoZnVuY3Rpb24odCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsbiksdC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsbil9KSk7dmFyIGk9ZnVuY3Rpb24gdChlKXt2YXIgbz1lLnRhcmdldCxuO3IuY2xvc2VzdCgiLmpzLXByb2R1Y3QtZWRpdGlvbi1vcHRpb24iKS5jb250YWlucyhvKXx8ci5jbGFzc0xpc3QuYWRkKCJ0LXByb2R1Y3RfX29wdGlvbi12YXJpYW50c19oaWRkZW4iKX07QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChbImNsaWNrIiwib3V0c2lkZUN1c3RvbURyb3Bkb3duIl0sKGZ1bmN0aW9uKHQpe2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodCxpKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHQsaSl9KSl9KSl9ZnVuY3Rpb24gdF9zdG9yZV9vcHRpb25faGFuZGxlT25DaGFuZ2UodCl7dmFyIGU9ZnVuY3Rpb24gZSgpe3ZhciByPXRoaXMuY2xvc2VzdCgiLmpzLXByb2R1Y3QtZWRpdGlvbi1vcHRpb24iKTtyJiZ0X3N0b3JlX3RyaWdnZXJFdmVudChyLCJjaGFuZ2UiKSx0X3N0b3JlX3RyaWdnZXJFdmVudCh0LCJ0U3RvcmVWYXJpYW50Q2hhbmdlIil9O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodC5xdWVyeVNlbGVjdG9yQWxsKCIuanMtcHJvZHVjdC1lZGl0aW9uLW9wdGlvbi12YXJpYW50cyIpLChmdW5jdGlvbih0KXt0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsZSksdC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLGUpfSkpfWZ1bmN0aW9uIHRfc3RvcmVfdW5lc2NhcGVIdG1sKHQpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRleHRhcmVhIik7cmV0dXJuIGUuaW5uZXJIVE1MPXQsZS52YWx1ZX1mdW5jdGlvbiB0X3N0b3JlX29uRnVuY0xvYWQodCxlLHIpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3dbdF0pZSgpO2Vsc2V7dmFyIG89RGF0ZS5ub3coKSxuPW5ldyBFcnJvcih0KyIgaXMgdW5kZWZpbmVkIiksaT1mdW5jdGlvbiB0KCl7dGhyb3cgbn07c2V0VGltZW91dCgoZnVuY3Rpb24gbigpe3ZhciBzPURhdGUubm93KCk7ImZ1bmN0aW9uIiE9dHlwZW9mIHdpbmRvd1t0XT8oImNvbXBsZXRlIj09PWRvY3VtZW50LnJlYWR5U3RhdGUmJnMtbz43ZTMmJiJmdW5jdGlvbiIhPXR5cGVvZiB3aW5kb3dbdF0mJmkoKSxzZXRUaW1lb3V0KG4scnx8MTAwKSk6ZSgpfSkpfX1mdW5jdGlvbiB0X3N0b3JlX2hleFRvUmdiKHQpe3ZhciBlPS9eIz8oW2EtZlxkXSkoW2EtZlxkXSkoW2EtZlxkXSkkL2kscj10LnJlcGxhY2UoZSwoZnVuY3Rpb24odCxlLHIsbyl7cmV0dXJuIGUrZStyK3IrbytvfSkpLG89L14jPyhbYS1mXGRdezJ9KShbYS1mXGRdezJ9KShbYS1mXGRdezJ9KSQvaS5leGVjKHIpLG49bz97cjpwYXJzZUludChvWzFdLDE2KSxnOnBhcnNlSW50KG9bMl0sMTYpLGI6cGFyc2VJbnQob1szXSwxNil9Om51bGw7cmV0dXJuIG8/W24ucixuLmcsbi5iXTpudWxsfWZ1bmN0aW9uIHRfc3RvcmVfZ2V0Rmlyc3RDb2xvckZyb21HcmFkaWVudCh0KXt2YXIgZT0vcmdiYVwoXGQrLFxkKyxcZCssXGQrXCkvZ2kscj0vKFxkKyksKFxkKyksKFxkKykvaSxvPXQubWF0Y2goZSksbj1vP29bMF06bnVsbCxpPXIuZXhlYyhuKSxzPWk/e3I6aVsxXSxnOmlbMl0sYjppWzNdfTpudWxsO3JldHVybiBpP1tzLnIscy5nLHMuYl06bnVsbH1mdW5jdGlvbiB0X3N0b3JlX3BhcnNlY29sb3IodCl7aWYoQXJyYXkuaXNBcnJheSh0KSYmMz09PXQubGVuZ3RoKXJldHVybiB0O2lmKCF0fHwic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIG51bGw7dmFyIGUscj0vXnZhclwoKC0tdWMtY29sb3ItY29sb3ItW2EtekEtWjAtOV0rKSxccyooLispXCkkLy5leGVjKHQpLG89dDtpZihyJiZyWzFdKXt2YXIgbj1yWzFdLGk7bz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKG4pfHxyWzJdfXZhciBzPS9ecmdiYT9cKChbMC05XSspLFxzKihbMC05XSspLFxzKihbMC05XSspKD86LFxzKlswLTkuJV0rKT9cKSQvaS5leGVjKG8pLGE9L14jKFthLWZBLUYwLTldezJ9KShbYS1mQS1GMC05XXsyfSkoW2EtZkEtRjAtOV17Mn0pJC9pLmV4ZWMobyksYyxsO3JldHVybiBzP3Muc3BsaWNlKDEpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHBhcnNlSW50KHQsMTApfSkpOmE/YS5zcGxpY2UoMSkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gcGFyc2VJbnQodCwxNil9KSk6bnVsbH1mdW5jdGlvbiB0X3N0b3JlX2x1bWFfcmdiKHQpe3ZhciBlPSJibGFjayIscj1mdW5jdGlvbiB0KGUpe3JldHVybi4yMTI2KmVbMF0rLjcxNTIqZVsxXSsuMDcyMiplWzJdPjEyOD8iYmxhY2siOiJ3aGl0ZSJ9LG89dF9zdG9yZV9wYXJzZWNvbG9yKHQpO3JldHVybiBvP3Iobyk6ZX1mdW5jdGlvbiB0X3N0b3JlX2dldExpZ2h0bmVzc0NvbG9yKHQpe3ZhciBlLHI9KHRfc3RvcmVfcGFyc2Vjb2xvcih0KXx8WzAsMCwwXSkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC8yNTV9KSk7cmV0dXJuKE1hdGgubWF4LmFwcGx5KE1hdGgscikrTWF0aC5taW4uYXBwbHkoTWF0aCxyKSkvMn1mdW5jdGlvbiB0X3N0b3JlX3JlbW92ZVJnYk9wYWNpdHkodCl7aWYoIXR8fCF0Lmxlbmd0aClyZXR1cm4gbnVsbDt2YXIgZT10LnNwbGl0KCIsIik7cmV0dXJuIGVbM10mJihlWzNdPSIxKSIpLGUuam9pbigpfWZ1bmN0aW9uIHRfc3RvcmVfc25pcHBldF9nZXRKc29uRnJvbVVybCgpe3ZhciB0LGU9d2luZG93LmxvY2F0aW9uLnNlYXJjaC5zdWJzdHJpbmcoMSkscj17fTtyZXR1cm4gZS5zcGxpdCgiJiIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXQuc3BsaXQoIj0iKTt0cnl7cltlWzBdXT1kZWNvZGVVUklDb21wb25lbnQoZVsxXSl9Y2F0Y2gobyl7Y29uc29sZS5lcnJvcihvKSxyW2VbMF1dPWVbMV19fSkpLHJ9ZnVuY3Rpb24gdF9zdG9yZV9fY2xlYW5QcmljZSh0KXt2YXIgZT10O3JldHVybiBlPyhlPShlPWUudG9TdHJpbmcoKSkucmVwbGFjZSgiLCIsIi4iKS5yZXBsYWNlKC9bXjAtOS5dL2csIiIpLGU9cGFyc2VGbG9hdChlKS50b0ZpeGVkKDIpLGlzTmFOKGUpJiYoZT0wKSxlPXBhcnNlRmxvYXQoZSksKGUqPTEpPDAmJihlPTApKTplPTAsZX1mdW5jdGlvbiB0X3N0b3JlX19yZW1vdmVFbGVtZW50KHQpe3QmJnQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpfWZ1bmN0aW9uIHRfc3RvcmVfX2ZhZGVJbih0LGUpe2lmKCgiMSI9PT1nZXRDb21wdXRlZFN0eWxlKHQpLm9wYWNpdHl8fCIiPT09Z2V0Q29tcHV0ZWRTdHlsZSh0KS5vcGFjaXR5KSYmIm5vbmUiIT09Z2V0Q29tcHV0ZWRTdHlsZSh0KS5kaXNwbGF5KXJldHVybiExO3ZhciByPTAsbz1lO298fChvPTIwMCk7dmFyIG49KG89cGFyc2VJbnQobykpPjA/by8xMDo0MDt0LnN0eWxlLm9wYWNpdHk9cix0LnN0eWxlLmRpc3BsYXk9ImJsb2NrIjt2YXIgaT1zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXt0LnN0eWxlLm9wYWNpdHk9ciwocis9LjEpPj0xJiZjbGVhckludGVydmFsKGkpfSksbik7cmV0dXJuITB9ZnVuY3Rpb24gdF9zdG9yZV9fc2VyaWFsaXplRGF0YSh0LGUpe3ZhciByPVtdO2Zvcih2YXIgbyBpbiB0KWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LG8pKXt2YXIgbj1lP2UrIlsiK28rIl0iOm8saT10W29dLHM7Int9IiE9PUpTT04uc3RyaW5naWZ5KGkpJiZudWxsIT09aSYmci5wdXNoKG51bGwhPT1pJiYib2JqZWN0Ij09dHlwZW9mIGk/dF9zdG9yZV9fc2VyaWFsaXplRGF0YShpLG4pOmVuY29kZVVSSUNvbXBvbmVudChuKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGkpKX1yZXR1cm4gci5qb2luKCImIil9ZnVuY3Rpb24gdF9zdG9yZV9jaGFuZ2VFbmRwb2ludCh0LGUpe2lmKHQmJih0LnN0YXR1cz49NTAwfHw0MDg9PXQuc3RhdHVzfHw0MTA9PXQuc3RhdHVzfHw0Mjk9PXQuc3RhdHVzfHwidGltZW91dCI9PT10LnR5cGUpJiYtMSE9PXdpbmRvdy50X3N0b3JlX2VuZHBvaW50LmluZGV4T2YoInN0b3JlLnRpbGRhIikpe3ZhciByPXRfc3RvcmVfX2dldFJvb3Rab25lKCk7d2luZG93LnRfc3RvcmVfZW5kcG9pbnQ9InN0b3JlMi50aWxkYWFwaS4iK3IsImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUoKX1lbHNle3ZhciBvO289dCYmdC5yZXNwb25zZVRleHQ+IiI/IlsiK3Quc3RhdHVzKyJdICIrdC5yZXNwb25zZVRleHQ6dCYmdC5zdGF0dXNUZXh0PyJFcnJvciBbIit0LnN0YXR1cysiLCAiK3Quc3RhdHVzVGV4dCsiXSI6IkVycm9yIHR5cGUgWyIrdC50eXBlKyJdIixjb25zb2xlLmVycm9yKG8rIi4gUGxlYXNlLCB0cnkgYWdhaW4gbGF0ZXIuIil9fWZ1bmN0aW9uIHRfc3RvcmVfX2hhbmRsZVJvb3R6b25lUmVkaXJlY3QodCxlKXt2YXIgcixvPXQ7aWYoInN0cmluZyI9PXR5cGVvZiB0KXRyeXtvPUpTT04ucGFyc2UodCl9Y2F0Y2goYSl7cmV0dXJuITF9dmFyIG49bnVsbD09KHI9byk/dm9pZCAwOnIucmVkaXJlY3R0bztpZighbilyZXR1cm4hMTt2YXIgaSxzPXRfc3RvcmVfX2dldFJvb3Rab25lRnJvbUVuZHBvaW50KGUpIT09bjtyZXR1cm4gcyYmKHdpbmRvdy50X3N0b3JlX2VuZHBvaW50PXdpbmRvdy50X3N0b3JlX2VuZHBvaW50LnNwbGl0KCIuIikuc2xpY2UoMCwtMSkuam9pbigiLiIpKyIuIituKSx0X3N0b3JlX19zZXRSb290Wm9uZShuKSxzfWZ1bmN0aW9uIHRfc3RvcmVfX2dldFJvb3Rab25lRnJvbUVuZHBvaW50KHQpe3ZhciBlPXQubWF0Y2goL1wuKFthLXpdezIsfSkoPzpbXC86XXwkKS9pKTtyZXR1cm4gZT9lWzFdOiIifWZ1bmN0aW9uIHRfc3RvcmVfcGFyYW1zVG9PYmoodCxlKXt2YXIgcj13aW5kb3cubG9jYXRpb24uc2VhcmNoO3RyeXtyPShyPXIucmVwbGFjZSgvJTI1L2csIiUiKSkucmVwbGFjZSgvJTJCL2dpLCJfX1RQTFVTX18iKSxyPWRlY29kZVVSSUNvbXBvbmVudChyKX1jYXRjaChkKXtjb25zb2xlLmVycm9yKGQpfXZhciBvPXtvdGhlclBhcmFtczpbXX07b1t0XT17fTt0cnl7cj1yLnJlcGxhY2UoLyZhbXA7L2csIiUyNmFtcCIpfWNhdGNoKHApe2NvbnNvbGUuZXJyb3IocCl9dmFyIG49ci5zbGljZSgxKS5zcGxpdCgiJiIpLGk7KG49bi5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnJlcGxhY2UoLyUyNmFtcC9nLCImYW1wOyIpfSkpLG8ub3RoZXJQYXJhbXM9bi5maWx0ZXIoKGZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiEoL150ZmNfL2kudGVzdCh0KXx8L15zXy9pLnRlc3QodCkpJiZ0fSkpLC0xIT09d2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigic19yZWNpZD0iKSk/d2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoInNfcmVjaWQ9IilbMV0uc3BsaXQoIiYiKVswXT09PXQmJm4uc3BsaWNlKDEpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3RyeXt2YXIgcj0vXnNfL2kudGVzdChlKSxuO2lmKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjcmVjIit0KSlyZXR1cm47aWYob1t0XXx8KG9bdF09e30pLHIpe3ZhciBpPWUucmVwbGFjZSgvXnNfL2ksInRmY18iKSxzPShpPWkucmVwbGFjZSgvJTNBL2dpLCI6IikpLnNwbGl0KCI9IiksYT1zWzBdLGM9c1sxXS5yZXBsYWNlKC9cKy9nLCIgIikuc3BsaXQoIjo6OiIpLGw9YS5yZXBsYWNlKC9edGZjXy9pLCIiKTtvW3RdW2xdPW9bdF1bbF0/b1t0XVtsXS5jb25jYXQoYyk6Y319Y2F0Y2gocCl7Y29uc29sZS5lcnJvcihwKX19KSk6LTEhPT13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCJ0ZmNfIikmJm4uZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5zcGxpdCgiPSIpO3RyeXt2YXIgcjtpZigvXnRmY18vaS50ZXN0KHQpJiYidGZjX2RpdiIhPT1lWzBdKXt2YXIgbj1lWzBdLGk7aT0tMSE9PXdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoInRmY19kaXYiKT9lWzFdLnJlcGxhY2UoL1wrL2csIiAiKS5yZXBsYWNlKC9fX1RQTFVTX18vZywiKyIpLnNwbGl0KCI6OjoiKTplWzFdLnJlcGxhY2UoL1wrL2csIiAiKS5yZXBsYWNlKC9fX1RQTFVTX18vZywiKyIpLnNwbGl0KCIlMkIiKTt2YXIgcz1uZXcgUmVnRXhwKC9cW1xkLipcXSQvLCJnaSIpLGE9bi5tYXRjaChzKSxjPWE/TnVtYmVyKEpTT04ucGFyc2UoYVswXSkpOm51bGwsbDtpZighYylyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJDYW4ndCBmaW5kIHJlY2lkIGluIFVSTCBwYXJhbSIpO2lmKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjcmVjIitjKSlyZXR1cm47dmFyIGQ9bi5yZXBsYWNlKHMsIiIpLnJlcGxhY2UoInRmY18iLCIiKTtvW2NdfHwob1tjXT17fSksb1tjXVtkXT1vW2NdW2RdP29bY11bZF0uY29uY2F0KGkpOml9fWNhdGNoKHApe2NvbnNvbGUuZXJyb3IocCl9fSkpO3dpbmRvdy50U3RvcmVDdXN0b21VcmxQYXJhbXM9byx0X3N0b3JlX3BhcmFtc1RvT2JqX3VwZGF0ZVVybChvKTt2YXIgcz10X3N0b3JlX3BhcmFtc1RvT2JqX2dldERlZmF1bHRTb3J0KHQsZS5kZWZhdWx0U29ydCk7Zm9yKHZhciBhIGluIHMpe3ZhciBjPXNbYV0uc29ydCxsPXNbYV0ucXVhbnRpdHk7KGN8fGwpJiYob1thXSYmb1thXS5zb3J0JiZlLnByZXZpZXdtb2RlfHxjJiYob1thXXx8KG9bYV09e30pLG9bYV0uc29ydD1jKSxvW2FdJiZvW2FdLnF1YW50aXR5JiYib2JqZWN0Ij09dHlwZW9mIG9bYV0ucXVhbnRpdHkmJiJ5Ij09PW9bYV0ucXVhbnRpdHlbMF0mJmUucHJldmlld21vZGV8fGwmJihvW2FdfHwob1thXT17fSksb1t0XS5xdWFudGl0eXx8KG9bYV0ucXVhbnRpdHk9WyJ5Il0pKSl9cmV0dXJuIHdpbmRvdy50U3RvcmVDdXN0b21VcmxQYXJhbXM9byxvfWZ1bmN0aW9uIHRfc3RvcmVfcGFyYW1zVG9PYmpfdXBkYXRlVXJsKHQpe3ZhciBlPXRfc3RvcmVfY3VzdG9tVVJMUGFyYW1zVG9TdHJpbmcodCk7d2luZG93LmxvY2F0aW9uLmhhc2gmJihlKz13aW5kb3cubG9jYXRpb24uaGFzaCk7dHJ5e3dpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLG51bGwsZW5jb2RlVVJJKGUpKX1jYXRjaChyKXtjb25zb2xlLmVycm9yKHIpfX1mdW5jdGlvbiB0X3N0b3JlX3BhcmFtc1RvT2JqX2dldERlZmF1bHRTb3J0KHQsZSl7dmFyIHI9d2luZG93LnRTdG9yZURlZmF1bHRTb3J0P3dpbmRvdy50U3RvcmVEZWZhdWx0U29ydDp7fTtpZighZSlyZXR1cm4gcjtpZihlLmRlZmF1bHQpe3ZhciBvPXsic29ydC1wcmljZS1hc2MiOiJwcmljZTphc2MiLCJzb3J0LXByaWNlLWRlc2MiOiJwcmljZTpkZXNjIiwic29ydC1uYW1lLWFzYyI6InRpdGxlOmFzYyIsInNvcnQtbmFtZS1kZXNjIjoidGl0bGU6ZGVzYyIsInNvcnQtY3JlYXRlZC1hc2MiOiJjcmVhdGVkOmFzYyIsInNvcnQtY3JlYXRlZC1kZXNjIjoiY3JlYXRlZDpkZXNjIn07clt0XXx8KHJbdF09e30pLHJbdF0uc29ydD1uZXcgQXJyYXkob1tlLmRlZmF1bHRdKX1yZXR1cm4gZS5pbl9zdG9jayYmKHJbdF18fChyW3RdPXt9KSxyW3RdLnF1YW50aXR5fHwoclt0XS5xdWFudGl0eT1bInkiXSkpLHdpbmRvdy50U3RvcmVEZWZhdWx0U29ydD1yLHJ9ZnVuY3Rpb24gdF9zdG9yZV9jdXN0b21VUkxQYXJhbXNUb1N0cmluZyh0KXt2YXIgZT0iIixyPSIiO2Zvcih2YXIgbyBpbiB0KXt2YXIgbj10W29dO2lmKCJvdGhlclBhcmFtcyIhPT1vKWZvcih2YXIgaSBpbiBuKXRyeXt2YXIgcz1BcnJheS5pc0FycmF5KG5baV0pP25baV0uam9pbigiW1tQTFVTXV0iKTpuW2ldLnRvU3RyaW5nKCk7cz0ocz0ocz0ocz0ocz0ocz1zLnJlcGxhY2UoLyUvZywiJTI1IikpLnJlcGxhY2UoLyMvZywiJTIzIikpLnJlcGxhY2UoL1wrL2csIiUyQiIpKS5yZXBsYWNlKC9cW1xbUExVU1xdXF0vZywiOjo6IikpLnJlcGxhY2UoLyUyNmFtcC9nLCImYW1wOyIpKS5yZXBsYWNlKC9ccy9naSwiKyIpLGUrPWUubGVuZ3RoPyImIjoiPyIsZSs9InRmY18iK2krIlsiK28rIl09IitzfWNhdGNoKGEpe2NvbnNvbGUuZXJyb3IoYSl9fXJldHVybiBlJiYoZSs9IiZ0ZmNfZGl2PTo6OiIpLHQub3RoZXJQYXJhbXMmJnQub3RoZXJQYXJhbXMubGVuZ3RoJiYodC5vdGhlclBhcmFtcy5mb3JFYWNoKChmdW5jdGlvbih0KXt0Lmxlbmd0aCYmKHIrPSImIit0KX0pKSxlPWUubGVuZ3RoP2UrcjoiPyIrci5zbGljZSgxKSksZS5sZW5ndGg/ZTp3aW5kb3cubG9jYXRpb24ub3JpZ2luK3dpbmRvdy5sb2NhdGlvbi5wYXRobmFtZX1mdW5jdGlvbiB0X3N0b3JlX3VwZGF0ZU9wdGlvbnNCYXNlZE9uVXJsKHQsZSxyKXt0cnl7dmFyIG89ZVtyXTtmb3IodmFyIG4gaW4gdC5maWx0ZXJzPXt9LG8paWYoInNvcnQiIT09bil7dmFyIGk9LTEhPT1uLmluZGV4T2YoInByaWNlOm0iKXx8LTEhPT1uLmluZGV4T2YoInF1YW50aXR5Iik7dC5maWx0ZXJzW25dPWk/b1tuXS50b1N0cmluZygpOm9bbl19ZWxzZXt0LnNvcnQ9e307dmFyIHM9b1tuXS5qb2luKCkuc3BsaXQoIjoiKSxhPXNbMF0sYz1zWzFdO3Quc29ydFthXT1jfXJldHVybiB0fWNhdGNoKGwpe3JldHVybiBjb25zb2xlLmVycm9yKCJzb21ldGhpbmcgd3JvbmcgaW4gdF9zdG9yZV91cGRhdGVPcHRpb25zQmFzZWRPblVybCIsbCksbnVsbH19ZnVuY3Rpb24gdF9zdG9yZV9zbmlwcGV0X2Nob29zZUVkaXRpb25Gcm9tVXJsKHQsZSxyLG8pe3RyeXt2YXIgbixpPXRfc3RvcmVfc25pcHBldF9nZXRKc29uRnJvbVVybCgpLmVkaXRpb251aWQ7aWYoaSYmci5nZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC11aWQiKSE9PWkpe2NvbnNvbGUuaW5mbygic2hvdyBwcm9kdWN0IGJ5IHVpZCBmcm9tIHVybCA9ICIraSk7dmFyIHM9IiIsYTtpZihlLmVkaXRpb25zLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QudWlkPT09cGFyc2VJbnQoaSwxMCkmJihzPXQpfSkpLCFzKXJldHVybjt0X3N0b3JlX3Byb2R1Y3RfdXBkYXRlRWRpdGlvbih0LHIscyxlLG8pLHRfc3RvcmVfcHJvZHVjdF90cmlnZ2VyU29sZE91dE1zZyh0LHIsMD09PXBhcnNlSW50KHMucXVhbnRpdHkpLG8pfX1jYXRjaChjKXtjb25zb2xlLmVycm9yKCJFcnJvciBkZWNvZGUgdXJsOiIrYyl9fWZ1bmN0aW9uIHRfc3RvcmVfbW92ZVNlYXJoU29ydCh0LGUpe3ZhciByPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK3QpO2lmKHIpe3ZhciBvPXIucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX2ZpbHRlcl9fc2VhcmNoLWFuZC1zb3J0Iik7aWYod2luZG93LmlubmVyV2lkdGg+OTYwJiZvJiYibm9uZSI9PT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShvKS5kaXNwbGF5JiYoby5zdHlsZS5kaXNwbGF5PSIiKSxlLnNpZGViYXIpe3ZhciBuPXIucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX2ZpbHRlcl9fY29udHJvbHMtd3JhcHBlciIpLGk9ci5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtY29udC13LWZpbHRlciIpO2lmKG8pe3ZhciBzPW8ucGFyZW50Tm9kZS5jbGFzc0xpc3QuY29udGFpbnMoImpzLXN0b3JlLWNvbnQtdy1maWx0ZXIiKTt3aW5kb3cuaW5uZXJXaWR0aDw5NjA/cyYmKHRfc3RvcmVfX3JlbW92ZUVsZW1lbnQobyksbi5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsbykpOnN8fCh0X3N0b3JlX19yZW1vdmVFbGVtZW50KG8pLGkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJhZnRlcmJlZ2luIixvKSl9fX19ZnVuY3Rpb24gdF9zdG9yZV9nZXRfcHJvZHVjdENhcmRfaG9yaXpvbnRhbFN0cnVjdHVyZSh0LGUscixvLG4saSl7dmFyIHM9IiI7cmV0dXJuKHQuZ2FsbGVyeVswXSYmIiIhPT10LmdhbGxlcnlbMF18fHQuZ2FsbGVyeVswXSYmIiIhPT10LmdhbGxlcnlbMF0pJiZyLnByb2RDYXJkJiZyLnByb2RDYXJkLmhhc0ltZyYmKHMrPSc8ZGl2IGNsYXNzPSJ0LXN0b3JlX19jYXJkX19pbWd3cmFwcGVyX2NvbHVtbiInKyhyLmltYWdlV2lkdGgmJiIwIiE9PXIuaW1hZ2VXaWR0aD8nIHN0eWxlPSJ3aWR0aDogJytyLmltYWdlV2lkdGgrJ3B4OyInOiIiKSsiPiIrby5vcGVuK3Rfc3RvcmVfZ2V0X3Byb2R1Y3RDYXJkX2ltZ19odG1sKHQscikrby5jbG9zZSsiPC9kaXY+Iikscys9JzxkaXYgY2xhc3M9InQtc3RvcmVfX2NhcmRfX2NvbnRlbnR3cmFwcGVyIj4nK3Rfc3RvcmVfZ2V0X2hvcml6b250YWxQcm9kdWN0Q2FyZF90eHRfaHRtbCh0LHIsbyxlLG4saSkrdF9zdG9yZV9nZXRfaG9yaXpvbnRhbFByb2R1Y3RDYXJkX3ByaWNlQW5kQnV0dG9ucyh0LHIsZSxuLGkpKyI8L2Rpdj4ifWZ1bmN0aW9uIHRfc3RvcmVfZ2V0X2hvcml6b250YWxQcm9kdWN0Q2FyZF90eHRfaHRtbCh0LGUscixvKXt2YXIgbj10LnRpdGxlLGk7ZS5pc1RpdGxlQ2xpcCYmKG49dC50aXRsZS5sZW5ndGg+NTA/dC50aXRsZS5zbGljZSgwLDUwKSsiLi4uIjp0LnRpdGxlKSx0LnRpdGxlJiYoaT0nPGRpdiBjbGFzcz0idC1zdG9yZV9fY2FyZF9fdGl0bGUgdC10eXBvZ3JhcGh5X190aXRsZSB0LW5hbWUgdC1uYW1lX21kIGpzLXN0b3JlLXByb2QtbmFtZSBqcy1wcm9kdWN0LW5hbWUiJysoIWUudGl0bGVfdHlwbyYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUudHlwbywidGl0bGUiKT8nIGRhdGEtYXV0by1jb3JyZWN0LWZvbnQtc2l6ZT0icmVtIiBzdHlsZT0iJytlLnR5cG8udGl0bGUrJyInOiIiKSsiPiIrbisiPC9kaXY+Iik7dmFyIHM9IiI7dC5kZXNjciYmZS5wcm9kQ2FyZCYmZS5wcm9kQ2FyZC5oYXNEZXNjciYmKHM9JzxkaXYgY2xhc3M9InQtc3RvcmVfX2NhcmRfX2Rlc2NyIHQtdHlwb2dyYXBoeV9fZGVzY3IgdC1kZXNjciB0LWRlc2NyX3h4cyBqcy1zdG9yZS1wcm9kLWRlc2NyIicrKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLnR5cG8sImRlc2NyIik/JyBzdHlsZT0iJytlLnR5cG8uZGVzY3IrJyInOiIiKSsiPiIrdC5kZXNjcisiPC9kaXY+Iik7dmFyIGE9IiIsYztyZXR1cm4gby5za3UmJihhPSc8ZGl2IGNsYXNzPSJqcy1zdG9yZS1wcm9kLXNrdSBqcy1wcm9kdWN0LXNrdSIgdHJhbnNsYXRlPSJubyIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPicrdC5za3UrIjwvZGl2PiIpLCc8ZGl2IGNsYXNzPSJ0LXN0b3JlX19jYXJkX190ZXh0d3JhcHBlciI+JytyLm9wZW4raStyLmNsb3NlK3MrYSsnPGRpdiBjbGFzcz0ianMtcHJvZHVjdC1jb250cm9scy13cmFwcGVyIHQtc3RvcmVfX2NhcmRfX3Byb2QtY29udHJvbHMtd3JhcHBlciIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjwvZGl2PjwvZGl2Pid9ZnVuY3Rpb24gdF9zdG9yZV9nZXRfaG9yaXpvbnRhbFByb2R1Y3RDYXJkX3ByaWNlQW5kQnV0dG9ucyh0LGUscixvLG4pe3ZhciBpPXBhcnNlSW50KGUucmlnaHRDb2x1bW5XaWR0aCwxMCkscz1pPydzdHlsZT0id2lkdGg6ICcraSsncHg7Iic6IiIsYTtyZXR1cm4nPGRpdiBjbGFzcz0idC1zdG9yZV9fY2FyZF9fcHJpY2UtYnV0dG9ucycrKGUucHJvZENhcmQmJiIyIj09PWUucHJvZENhcmQuc3R5bGU/IiB0LXN0b3JlX19jYXJkX19wcmljZS1idXR0b25zX2luLXJvdyI6IiIpKyciJytzKyI+Iit0X3N0b3JlX2dldF9wcm9kdWN0Q2FyZF9QcmljZV9odG1sKHQscixlKSt0X3N0b3JlX2dldF9wcm9kdWN0Q2FyZF9idG5faHRtbCh0LGUsbyxuKSsiPC9kaXY+In1mdW5jdGlvbiB0X3N0b3JlX2dldERpY3RPYmooKXt2YXIgdD17c2t1OntFTjoiU0tVIixSVToi0JDRgNGC0LjQutGD0LsiLEZSOiJVR1MiLERFOiJTS1UiLEVTOiJTS1UiLFBUOiJTS1UiLFVLOiLQmtC+0LQg0YLQvtCy0LDRgNGDIixKQToiU0tVIixaSDoiU0tVIixQTDoiU0tVIixLSzoiU0tVIixJVDoiU0tVIixMVjoiU0tVIn0sc29sZE91dDp7RU46Ik91dCBvZiBzdG9jayIsUlU6ItCd0LXRgiDQsiDQvdCw0LvQuNGH0LjQuCIsRlI6IkVuIHJ1cHR1cmUgZGUgc3RvY2siLERFOiJBdXN2ZXJrYXVmdCIsRVM6IkFnb3RhZG8iLFBUOiJGb3JhIGRlIGVzdG9xdWUiLFVLOiLQndC10LzQsNGUINCyINC90LDRj9Cy0L3QvtGB0YLRliIsSkE6IuWcqOW6q+WIh+OCjCIsWkg6Iue8uui0pyIsUEw6Ik5pZSBtYSBuYSBzdGFuaWUiLEtLOiLSmtC+0YDQtNCwINC20L7SmyIsSVQ6IkVzYXVyaXRvIixMVjoiTmF2IG5vbGlrdGF2xIEifSxhbGw6e0VOOiJBbGwiLFJVOiLQktGB0LUiLEZSOiJUb3V0IixERToiQWxsZXMiLEVTOiJUb2RvcyIsUFQ6IlRvZG9zIixVSzoi0JLRgdGWIixKQToi44GZ44G544GmIixaSDoi5omA5pyJIixQTDoiV3N6eXN0a2llIixLSzoi0JHQsNGA0LvRi9KbIixJVDoiVHV0dGkiLExWOiJWaXNpIn0sZnJvbTp7RU46ImZyb20iLFJVOiLQvtGCIixGUjoiZGUiLERFOiJ2b24iLEVTOiJkZSIsUFQ6ImRlIixKQToi44GL44KJIixaSDoi5LuOIixVSzoi0LLRltC0IixQTDoib2QiLEtLOiLQsdCw0YHRgtCw0L8iLElUOiJkYSIsTFY6Im5vIn0sZW1wdHlwYXJ0bXNnOntFTjoiTm90aGluZyBmb3VuZCIsUlU6ItCd0LjRh9C10LPQviDQvdC1INC90LDQudC00LXQvdC+IixGUjoiUmllbiB0cm91dsOpIixERToiTmljaHRzIGdlZnVuZGVuIixFUzoiTmFkYSBlbmNvbnRyYWRvIixQVDoiTmFkYSBlbmNvbnRyYWRvIixVSzoi0J3RltGH0L7Qs9C+INC90LUg0LfQvdCw0LnQtNC10L3QviIsSkE6IuS9leOCguimi+OBpOOBi+OCiuOBvuOBm+OCk+OBp+OBl+OBnyIsWkg6IuS7gOS5iOmDveayoeaJvuWIsCIsUEw6Ik5pYyBuaWUgem5hbGV6aW9ubyIsS0s6ItCV0YjRgtC10qPQtSDRgtCw0LHRi9C70LzQsNC00YsiLElUOiJOb24gYWJiaWFtbyB0cm92YXRvIG51bGxhIixMVjoiTmVrYXMgbmF2IGF0cmFzdHMifSxzZWVvdGhlcnByb2R1Y3RzOntFTjoiU2VlIG90aGVyIixSVToi0JTRgNGD0LPQuNC1INGC0L7QstCw0YDRiyIsRlI6IkF1dHJlcyBwcm9kdWl0cyIsREU6IkFuZGVyZSBwcm9kdWt0ZSIsRVM6Ik90cm9zIHByb2R1Y3RvcyIsUFQ6Ik91dHJvcyBwcm9kdXRvcyIsVUs6ItCG0L3RiNGWINGC0L7QstCw0YDQuCIsSkE6IuOBneOBruS7luOBruWVhuWTgSIsWkg6IuWFtuS7luS6p+WTgSIsUEw6IklubmUgcHJvZHVrdHkiLEtLOiLQkdCw0YHSm9CwINKb0LDRgNCw0qPRi9C3IixJVDoiVmVkaSBhbHRyaSIsTFY6IlNrYXRpZXQgY2l0YXMifSxzZWVBbHNvOntFTjoiU2VlIGFsc28iLFJVOiLQodC80L7RgtGA0LjRgtC1INGC0LDQutC20LUiLEZSOiJWb2lyIMOpZ2FsZW1lbnQiLERFOiJTaWVoZSBhdWNoIixFUzoiVmVyIHRhbWJpw6luIixQVDoiVmVqYSB0YW1iw6ltIixVSzoi0JTQuNCy0LjRgdGMINGC0LDQutC+0LYiLEpBOiLjgb7jgZ/opovjgarjgZXjgYQiLFpIOiLkuZ/lj6/ku6XnnIvnnIsiLFBMOiJQYXRyeiByw7N3bmllxbwiLEtLOiLQodC+0L3QtNCw0Lkt0LDSmywg0pvQsNGA0LDSo9GL0LciLElUOiJHdWFyZGEgYW5jaGUiLExWOiJTa2F0xKt0IGFyxKsifSxhZGR0b2NhcnQ6e0VOOiJCdXkgbm93IixSVToi0JrRg9C/0LjRgtGMIixGUjoiQWNoZXRlciIsREU6Ilp1IGthdWZlbiIsRVM6IlBhcmEgY29tcHJhciIsUFQ6IkNvbXByYXIiLFVLOiLQmtGD0L/QuNGC0LgiLEpBOiLos7zlhaXjgZnjgosiLFpIOiLopoHkubAiLFBMOiJLdXAiLEtLOiLSmtCw0LfRltGAINGB0LDRgtGL0L8g0JDQuyIsSVQ6IkFjcXVpc3RhIG9yYSIsTFY6IlDEk3JjIHRhZ2FkIn0sbG9hZG1vcmU6e0VOOiJMb2FkIG1vcmUiLFJVOiLQl9Cw0LPRgNGD0LfQuNGC0Ywg0LXRidGRIixGUjoiQ2hhcmdlciBwbHVzIixERToiTWVociBsYWRlbiIsRVM6IkNhcmdhIG3DoXMiLFBUOiJDYXJyZWd1ZSBtYWlzIixVSzoi0JfQsNCy0LDQvdGC0LDQttC40YLQuCDRidC1IixKQToi44KC44Gj44Go6Kqt44G/6L6844KAIixaSDoi6KOd6LyJ5pu05aSaIixQTDoiUG9rYcW8IHdpxJljZWoiLEtLOiLQotCw0pPRiyDQttKv0LrRgtC10YMiLElUOiJDYXJpY2EgYW5jb3JhIixMVjoiSWVsxIFkxJN0IHZhaXLEgWsifSxQQ0U6e0VOOiJwYyIsUlU6ItGI0YIiLFVLOiLRiNGCIixLSzoi0YjRgiJ9LE5NUDp7RU46InBhY2siLFJVOiLRg9C/IixVSzoi0YPQvyIsS0s6ItGD0L8ifSxNR006e0VOOiJtZyIsUlU6ItC80LMiLFVLOiLQvNCzIixLSzoi0LzQsyJ9fSxlPXtFTjoiZyIsUlU6ItCzIixVSzoi0LMiLEtLOiLQsyJ9O3QuZz1lLHQuR1JNPWUsdC5LR009e0VOOiJrZyIsUlU6ItC60LMiLFVLOiLQutCzIixLSzoi0LrQsyJ9LHQuVE5FPXtFTjoidCIsUlU6ItGCIixVSzoi0YIiLEtLOiLRgiJ9LHQuTUxUPXtFTjoibWwiLFJVOiLQvNC7IixVSzoi0LzQuyIsS0s6ItC80LsifSx0LkxUUj17RU46ImwiLFJVOiLQuyIsVUs6ItC7IixLSzoi0LsifTt2YXIgcj17RU46Im1tIixSVToi0LzQvCIsVUs6ItC80LwiLEtLOiLQvNC8In07dC5tbT1yLHQuTU1UPXIsdC5DTVQ9e0VOOiJjbSIsUlU6ItGB0LwiLFVLOiLRgdC8IixLSzoi0YHQvCJ9LHQuRE1UPXtFTjoiZG0iLFJVOiLQtNC8IixVSzoi0LTQvCIsS0s6ItC00LwifSx0Lk1UUj17RU46Im0iLFJVOiLQvCIsVUs6ItC8IixLSzoi0LwifSx0Lk1USz17RU46Im3CsiIsUlU6ItC8wrIiLFVLOiLQvMKyIixLSzoi0LzCsiJ9LHQuTVRRPXtFTjoibcKzIixSVToi0LzCsyIsVUs6ItC8wrMiLEtLOiLQvMKzIn0sdC5MTVQ9e0VOOiJsbSIsUlU6ItC/0L7Qsy4g0LwiLFVLOiLQv9C+0LMuINC8IixLSzoi0L/QvtCzLiDQvCJ9LHQuSEFSPXtFTjoiaGEiLFJVOiLQs9CwIixVSzoi0LPQsCIsS0s6ItCz0LAifSx0LkFDUj17RU46ImFjcmUifSx0LllSRD17RU46InlkIn0sdC5MQlI9e0VOOiJsYiJ9LHQuT05aPXtFTjoib3oifSx0LklOSD17RU46ImluIn0sdC5GT1Q9e0VOOiJmdCJ9LHRbInByb2R1Y3QtbHdoIl09e0VOOiJMeFd4SCIsUlU6ItCUeNCoeNCSIixERToiTHhCeEgiLEVTOiJQeEx4SyIsVUs6ItCUeNCoeNCSIn0sdFsicHJvZHVjdC13aHQiXT17RU46Ild4SHhUIixSVToi0Kh40JJ40KIiLEZSOiJMeEh4w4kiLERFOiJCeEh4RCIsRVM6Ikx4S3hQIixQVDoiTHhBeEUiLFVLOiLQqHjQknjQoiJ9LHRbInByb2R1Y3Qtd2hkIl09e0VOOiJXeEh4RCIsUlU6ItCoeNCSeNCTIixGUjoiTHhIeFAiLERFOiJCeEh4VCIsRVM6Ikx4S3hTIixQVDoiTHhBeFAiLFVLOiLQqHjQknjQkyJ9LHRbInByb2R1Y3Qtd2VpZ2h0Il09e0VOOiJXZWlnaHQiLFJVOiLQktC10YEiLEZSOiJQb2lkcyIsREU6Ikdld2ljaHQiLEVTOiJLYWFsIixQVDoiUGVzbyIsVUs6ItCS0LDQs9CwIixKQToi6YeN44GVIixaSDoi5qmf6YeNIixQTDoiV2FnYSIsS0s6ItCh0LDQu9C80LDSmyIsSVQ6IlBlc28iLExWOiJTdmFycyJ9O3ZhciBvPXdpbmRvdy50U3RvcmVCcm93c2VyTGFuZzt3aW5kb3cudFN0b3JlRGljdHx8KHdpbmRvdy50U3RvcmVEaWN0PXt9KSxPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChmdW5jdGlvbihlKXt3aW5kb3cudFN0b3JlRGljdFtlXT10W2VdW29dP3RbZV1bb106dFtlXS5FTn0pKX1mdW5jdGlvbiB0X3N0b3JlX3RyaWdnZXJFdmVudCh0LGUscil7dmFyIG87ciYmd2luZG93LkN1c3RvbUV2ZW50PyhvPW5ldyBDdXN0b21FdmVudChlLHtkZXRhaWw6cixidWJibGVzOiEwLGNhbmNlbGFibGU6ITF9KSx0LmRpc3BhdGNoRXZlbnQobykpOmRvY3VtZW50LmNyZWF0ZUV2ZW50Pygobz1kb2N1bWVudC5jcmVhdGVFdmVudCgiSFRNTEV2ZW50cyIpKS5pbml0RXZlbnQoZSwhMCwhMSksby5ldmVudE5hbWU9ZSx0LmRpc3BhdGNoRXZlbnQobykpOmRvY3VtZW50LmNyZWF0ZUV2ZW50T2JqZWN0Pygobz1kb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCgpKS5ldmVudFR5cGU9ZSxvLmV2ZW50TmFtZT1lLHQuZmlyZUV2ZW50KCJvbiIrby5ldmVudFR5cGUsbykpOnRbZV0/dFtlXSgpOnRbIm9uIitlXSYmdFsib24iK2VdKCl9ZnVuY3Rpb24gdF9zdG9yZV9fY29sbGVjdFByb2R1Y3REYXRhQnlFbGVtZW50KHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLmpzLXByb2R1Y3QtbmFtZSIpLHI9ZT9lLnRleHRDb250ZW50LnRyaW0oKToiIixvO3I9dF9zdG9yZV9lc2NhcGVRdW90ZShyKTt2YXIgbj10LnF1ZXJ5U2VsZWN0b3IoIi5qcy1wcm9kdWN0LXByaWNlIiksaTtuJiYobz1uLmdldEF0dHJpYnV0ZSgiZGF0YS1wcm9kdWN0LXByaWNlLWRlZiIpKSxvPXRfc3RvcmVfX2NsZWFuUHJpY2Uobyk7dmFyIHM9dC5nZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC1pbWciKTtpZihzKWk9cztlbHNle3ZhciBhPXQucXVlcnlTZWxlY3RvcigiLmpzLXByb2R1Y3QtaW1nIik7aWYoYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImRhdGEtb3JpZ2luYWwiKTtjJiYoaT1jKX19dmFyIGw9dC5nZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC11aWQiKSxkPXQuZ2V0QXR0cmlidXRlKCJkYXRhLXByb2R1Y3QtaW52IikscDtkPXBhcnNlSW50KGQsMTApfHwiIjt2YXIgdT10LnF1ZXJ5U2VsZWN0b3IoIi5qcy1zdG9yZS1wcm9kLXNrdSIpO3UmJihwPXRfc3RvcmVfZXNjYXBlUXVvdGUocD11LnRleHRDb250ZW50LnRyaW0oKSkpO3ZhciBfPXRfc3RvcmVfX2NvbGxlY3RPcHRpb25zQnlFbGVtZW50KHQpLGY9e25hbWU6cixwcmljZTpvLHVpZDpsLGludjpkfTtyZXR1cm4gaSYmKGYuaW1nPWkpLHAmJihmLnNrdT1wKSxfJiZfLmxlbmd0aD4wJiYoZi5vcHRpb25zPV8pLGZ9ZnVuY3Rpb24gdF9zdG9yZV9fY29sbGVjdE9wdGlvbnNCeUVsZW1lbnQodCl7dmFyIGU9W10scj10LnF1ZXJ5U2VsZWN0b3JBbGwoIi5qcy1wcm9kdWN0LWVkaXRpb24tb3B0aW9uIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChyLChmdW5jdGlvbih0KXt2YXIgcj10LnF1ZXJ5U2VsZWN0b3IoIi5qcy1wcm9kdWN0LWVkaXRpb24tb3B0aW9uLW5hbWUiKS50ZXh0Q29udGVudCxvPXQucXVlcnlTZWxlY3Rvcigib3B0aW9uOmNoZWNrZWQiKTtpZihvKXt2YXIgbj1vLnZhbHVlLGk9by5nZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC1lZGl0aW9uLXZhcmlhbnQtcHJpY2UiKTtpZihpPXBhcnNlRmxvYXQoaSksciYmbil7dmFyIHM9e307IiIhPXImJihyPXRfc3RvcmVfZXNjYXBlUXVvdGUocikpLCIiIT1uJiYobj0obj10X3N0b3JlX2VzY2FwZVF1b3RlKG4pKS5yZXBsYWNlKC8oPzpcclxufFxyfFxuKS9nLCIiKSksci5sZW5ndGg+MSYmIjoiPT1yLmNoYXJBdChyLmxlbmd0aC0xKSYmKHI9ci5zdWJzdHJpbmcoMCxyLmxlbmd0aC0xKSkscy5vcHRpb249cixzLnZhcmlhbnQ9bixzLnByaWNlPWksZS5wdXNoKHMpfX19KSk7dmFyIG89dC5xdWVyeVNlbGVjdG9yQWxsKCIuanMtcHJvZHVjdC1vcHRpb24iKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG8sKGZ1bmN0aW9uKHQpe3ZhciByPXQucXVlcnlTZWxlY3RvcigiLmpzLXByb2R1Y3Qtb3B0aW9uLW5hbWUiKS50ZXh0Q29udGVudCxvPXQucXVlcnlTZWxlY3Rvcigib3B0aW9uOmNoZWNrZWQiKTtpZihvKXt2YXIgbj1vLnZhbHVlLGk9by5nZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC12YXJpYW50LXByaWNlIik7aWYoaT1wYXJzZUZsb2F0KGkpLHZvaWQgMCE9PXImJnZvaWQgMCE9PW4pe3ZhciBzPXt9OyIiIT1yJiYocj10X3N0b3JlX2VzY2FwZVF1b3RlKHIpKSwiIiE9biYmKG49KG49dF9zdG9yZV9lc2NhcGVRdW90ZShuKSkucmVwbGFjZSgvKD86XHJcbnxccnxcbikvZywiIikpLHIubGVuZ3RoPjEmJiI6Ij09ci5jaGFyQXQoci5sZW5ndGgtMSkmJihyPXIuc3Vic3RyaW5nKDAsci5sZW5ndGgtMSkpLHMub3B0aW9uPXIscy52YXJpYW50PW4scy5wcmljZT1pLGUucHVzaChzKX19fSkpO3ZhciBuPXQucXVlcnlTZWxlY3RvckFsbCgiLmpzLXByb2R1Y3QtbXVsdGlvcHRpb24iKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbih0KXt2YXIgcj10LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZCcpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwociwoZnVuY3Rpb24ocil7dmFyIG89dC5xdWVyeVNlbGVjdG9yKCIuanMtcHJvZHVjdC1vcHRpb24tbmFtZSIpLnRleHRDb250ZW50O28mJihvPXRfc3RvcmVfZXNjYXBlUXVvdGUobykpLG8ubGVuZ3RoPjEmJiI6Ij09by5jaGFyQXQoby5sZW5ndGgtMSkmJihvPW8uc3Vic3RyaW5nKDAsby5sZW5ndGgtMSkpO3ZhciBuPXIubmFtZTtuJiYobj0obj10X3N0b3JlX2VzY2FwZVF1b3RlKG4pKS5yZXBsYWNlKC8oPzpcclxufFxyfFxuKS9nLCIiKSk7dmFyIGk9ci5nZXRBdHRyaWJ1dGUoImRhdGEtcHJvZHVjdC12YXJpYW50LXByaWNlIik7aSYmKGk9cGFyc2VGbG9hdChpKSk7dmFyIHM9e29wdGlvbjpvLHZhcmlhbnQ6bixwcmljZTppfTtlLnB1c2gocyl9KSl9KSksZX1mdW5jdGlvbiB0X3N0b3JlX2ZpeGVkUG9wdXBCdXR0b24odCxlKXt2YXIgcixvPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK3QpO2lmKG8pe3ZhciBuPTEzMCxpPTkwLHM9NTYwLGE9InQtc3RvcmVfX3Byb2QtcG9wdXBfX2J0bi13cmFwcGVyLWZpeGVkIixjPW51bGw9PWV8fG51bGw9PShyPWUucG9wdXBfb3B0cyk/dm9pZCAwOnIuY29udGFpbmVyQmdDb2xvcixsPW8ucXVlcnlTZWxlY3RvckFsbCgiLnQtc3RvcmVfX3Byb2QtcG9wdXBfX2J0bi13cmFwcGVyIiksZDtpZihBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGwsKGZ1bmN0aW9uKHQpe3QuY2xhc3NMaXN0LmFkZChhKSxjJiYodC5zdHlsZS5iYWNrZ3JvdW5kPWMpfSkpLCEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSE9PW8ucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX3Byb2R1Y3Qtc25pcHBldCIpJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLmNvbnRhaW5zKG8ucXVlcnlTZWxlY3RvcigiLnQtc3RvcmVfX3Byb2R1Y3Qtc25pcHBldCIpKSkpe3ZhciBwPW8ucXVlcnlTZWxlY3RvcigiLnQtcG9wdXAiKSx1PXAucXVlcnlTZWxlY3RvcigiLnQtcG9wdXBfX2NvbnRhaW5lciIpLF89ZnVuY3Rpb24gdCgpe3Uuc3R5bGUucGFkZGluZ0JvdHRvbT0iMjIwcHgiLHUuc3R5bGUuY3NzVGV4dCs9Ijt0cmFuc2Zvcm06bm9uZSAhaW1wb3J0YW50OyJ9LGY9ZnVuY3Rpb24gdCgpe3Uuc3R5bGUucGFkZGluZ0JvdHRvbT0iIix1LnN0eWxlLnRyYW5zZm9ybT0iIn0seT1mdW5jdGlvbiB0KCl7d2luZG93LmlubmVyV2lkdGg+cz9mKCk6XygpfTt3aW5kb3cuaXNNb2JpbGUmJndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJvcmllbnRhdGlvbmNoYW5nZSIseSkscC5hZGRFdmVudExpc3RlbmVyKHRfc3RvcmVfUE9QVVBfU0hPV0VEX0VWRU5UX05BTUUsKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXt5KCl9KSwwKX0pKSxwLmFkZEV2ZW50TGlzdGVuZXIodF9zdG9yZV9QT1BVUF9DTE9TRURfRVZFTlRfTkFNRSwoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2YoKX0pLDApfSkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHkpfX19ZnVuY3Rpb24gdF9zdG9yZV9fbG9hZEpTRmlsZSh0LGUpe2lmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtzcmNePSInK3QrJyJdJykpZSYmZSgpO2Vsc2V7dmFyIHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ci50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiLHIuc3JjPXQsZSYmKHIub25sb2FkPWUpLHIub25lcnJvcj1mdW5jdGlvbih0KXtjb25zb2xlLmVycm9yKCJVcGxvYWQgc2NyaXB0IGVycm9yOiAiK3QpfSxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHIpfX1mdW5jdGlvbiB0X3N0b3JlX19sb2FkQ1NTRmlsZSh0LGUpe2lmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbaHJlZl49IicrdCsnIl0nKSllJiZlKCk7ZWxzZXt2YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaW5rIik7ci5yZWw9InN0eWxlc2hlZXQiLHIudHlwZT0idGV4dC9jc3MiLHIubWVkaWE9ImFsbCIsci5ocmVmPXQsZSYmKHIub25sb2FkPWUpLHIub25lcnJvcj1mdW5jdGlvbih0KXtjb25zb2xlLmVycm9yKCJVcGxvYWQgc3R5bGUgZXJyb3I6ICIrdCl9LGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQocil9fWZ1bmN0aW9uIHRfc3RvcmVfX2dldFJvb3Rab25lKCl7cmV0dXJuIHRfY2FydF9fdXNlUm9vdFpvbmUoKS5nZXRSb290Wm9uZSgpfWZ1bmN0aW9uIHRfc3RvcmVfX3NldFJvb3Rab25lKHQpe3RfY2FydF9fdXNlUm9vdFpvbmUoKS5zZXRSb290Wm9uZSh0KX1mdW5jdGlvbiB0X3N0b3JlX19nZXRTbGlkZXJXcmFwcGVyKHQpe3JldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjcmVjIit0KyIgLmpzLXN0b3JlLXByb2R1Y3QgLnQtc2xkc19faXRlbXMtd3JhcHBlciIpfWZ1bmN0aW9uIHRfc3RvcmVfX2FkZFNsaWRlQ2hhbmdlTGlzdGVuZXIodCl7dmFyIGU9dF9zdG9yZV9fZ2V0U2xpZGVyV3JhcHBlcih0KTtlJiZlLmFkZEV2ZW50TGlzdGVuZXIoInNsaWRlQ2hhbmdlRW5kIiwoZnVuY3Rpb24oKXt2YXIgcj1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1fYWN0aXZlIik7aWYociYmIjEiIT09ci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGUtaW5kZXgiKSl7dmFyIG89ci5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19iZ2ltZyIpO28uY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWJnaW1nIil8fG8uY2xhc3NMaXN0LmFkZCgidC1iZ2ltZyIpO3ZhciBuPW51bGw9PXI/dm9pZCAwOnIubmV4dEVsZW1lbnRTaWJsaW5nO2lmKG4pe3ZhciBpPW4ucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYmdpbWciKTtpZihpKXtpLmNsYXNzTGlzdC5hZGQoInQtYmdpbWciKSx0X29uRnVuY0xvYWQoInRfbGF6eWxvYWRfdXBkYXRlIiwoZnVuY3Rpb24oKXt0X2xhenlsb2FkX3VwZGF0ZSgpfSkpO3ZhciBzPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK3QpO3Rfc2xkc191cGRhdGVTbGlkZXIocyl9fX19KSl9ZnVuY3Rpb24gdF9zdG9yZV9fc2V0dXBFbmRwb2ludCgpe3ZhciB0PXRfc3RvcmVfX2dldFJvb3Rab25lKCk7d2luZG93LnRfc3RvcmVfZW5kcG9pbnQ9InN0b3JlLnRpbGRhYXBpLiIrdH1BcnJheS5wcm90b3R5cGUuc29tZXx8KEFycmF5LnByb3RvdHlwZS5zb21lPWZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0IjtpZihudWxsPT09dGhpcyl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcnJheS5wcm90b3R5cGUuc29tZSBjYWxsZWQgb24gbnVsbCBvciB1bmRlZmluZWQiKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yO2Zvcih2YXIgZT1PYmplY3QodGhpcykscj1lLmxlbmd0aD4+PjAsbz1hcmd1bWVudHMubGVuZ3RoPj0yP2FyZ3VtZW50c1sxXTp2b2lkIDAsbj0wO248cjtuKyspaWYobiBpbiBlJiZ0LmNhbGwobyxlW25dLG4sZSkpcmV0dXJuITA7cmV0dXJuITF9KSxmdW5jdGlvbih0KXt2YXIgZT10Lm1hdGNoZXN8fHQubWF0Y2hlc1NlbGVjdG9yfHx0LndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8dC5tb3pNYXRjaGVzU2VsZWN0b3J8fHQubXNNYXRjaGVzU2VsZWN0b3J8fHQub01hdGNoZXNTZWxlY3Rvcjt0Lm1hdGNoZXM9dC5tYXRjaGVzU2VsZWN0b3I9ZXx8ZnVuY3Rpb24gdChlKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGUpLHI9dGhpcztyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNvbWUuY2FsbCh0LChmdW5jdGlvbih0KXtyZXR1cm4gdD09PXJ9KSl9fShFbGVtZW50LnByb3RvdHlwZSksRWxlbWVudC5wcm90b3R5cGUuY2xvc2VzdHx8KEVsZW1lbnQucHJvdG90eXBlLmNsb3Nlc3Q9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXM7ZSYmMT09PWUubm9kZVR5cGU7KXtpZihFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzLmNhbGwoZSx0KSlyZXR1cm4gZTtlPWUucGFyZW50RWxlbWVudHx8ZS5wYXJlbnROb2RlfXJldHVybiBudWxsfSksU3RyaW5nLnByb3RvdHlwZS50cmltfHwoU3RyaW5nLnByb3RvdHlwZS50cmltPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVwbGFjZSgvXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2csIiIpfSk7CgpmdW5jdGlvbiBfY2F0Y2gkMSh0LGUpe3RyeXt2YXIgcj10KCl9Y2F0Y2gobyl7cmV0dXJuIGUobyl9cmV0dXJuIHImJnIudGhlbj9yLnRoZW4odm9pZCAwLGUpOnJ9dmFyIEZPUk1TX0FQSV9GSUVMRD17RU1BSUw6ImVtIixQSE9ORToicGgiLE5BTUU6Im5tIixDT05UQUNUX01FVEhPRDoiY29udGFjdF9tZXRob2QiLElOUFVUOiJpbiIsVEVYVEFSRUE6InRhIixEQVRFOiJkYSIsVEVYVDoidHgiLFVSTDoidXIiLEhJRERFTjoiaGQiLFNFTEVDVDoic2IiLFRJTUU6InRtIixWQVJJQU5UUzoicmQiLElNQUdFX1ZBUklBTlRTOiJyaSIsUkFUSU5HOiJycyIsQ0hFQ0tCT1g6ImNiIixGSUxFOiJ1dyIsVVBMT0FEQ0FSRV9GSUxFOiJ1YyIsREVMSVZFUlk6ImRsIixTQVZFX0NPTlRBQ1Q6InNmIixQUk9NT0NPREU6InBjIixRVUFOVElUWToicW4iLFJBTkdFOiJyZyIsQ0FMQzoiZnIiLFdISVRFU1BBQ0U6IndzIn0sdF9mb3Jtc0FwaV9fc2FmZVZhbHVlPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIGU/ZS52YWx1ZToiIn0sdF9mb3Jtc0FwaV9fc2FmZUZvY3VzPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIGUmJmUuZm9jdXMoKX0sdF9mb3Jtc0FwaV9fc2VuZENoYW5nZT1mdW5jdGlvbiB0KGUpe3JldHVybiBlJiZlLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJjaGFuZ2UiKSl9LHRfZm9ybXNBcGlfX3NlbmRSZXNldD1mdW5jdGlvbiB0KGUpe3JldHVybiBlJiZlLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJyZXNldCIpKX0sdF9mb3Jtc0FwaV9fc2FmZVNldFZhbHVlPWZ1bmN0aW9uIHQoZSxyLG8pe3ZhciBuLGE9KG98fHt9KS5zaWxlbnQsaT12b2lkIDAhPT1hJiZhO3JldHVybiBlJiZlLnZhbHVlIT09ciYmKGUudmFsdWU9cixpfHx0X2Zvcm1zQXBpX19zZW5kQ2hhbmdlKGUpKSxyfSx0X2Zvcm1zQXBpX19ndWVzc0ZpZWxkTmFtZT1mdW5jdGlvbiB0KGUpe3ZhciByPWUucXVlcnlTZWxlY3RvcigiLmpzLXRpbGRhLXJ1bGVbbmFtZV0iKTtyZXR1cm4gcj9yLm5hbWU6IiJ9LHRfZm9ybXNBcGlfX2dldEZpZWxkRGF0YT1mdW5jdGlvbiB0KGUpe3ZhciByPWUuZGF0YXNldCxvPXIuaW5wdXRMaWQsbj1yLmZpZWxkVHlwZSxhPXIuZmllbGROYW1lLGk9ci5maWVsZEFzeW5jLHM9ci5kZWZhdWx0VmFsdWUsbDtyZXR1cm57bGlkOm8sZmllbGRUeXBlOm4sZmllbGROYW1lOmF8fHRfZm9ybXNBcGlfX2d1ZXNzRmllbGROYW1lKGUpLGlzQXN5bmM6InRydWUiPT09aSxkZWZhdWx0VmFsdWU6c319LHRfZm9ybXNBcGlfX3dhaXRGb3JGaWVsZFJlYWR5U3RhdGU9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHQpe3ZhciByPWZ1bmN0aW9uIHIoKXtlLmVsZW1lbnQuc2V0QXR0cmlidXRlKCJkYXRhLWlucHV0LXJlYWR5IiwidHJ1ZSIpLHQoZSl9LG89InRydWUiPT09ZS5lbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS1pbnB1dC1yZWFkeSIpO2UuZGF0YS5pc0FzeW5jJiYhbz9lLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXRSZWFkeSIscix7b25jZTohMH0pOnIoKX0pKX0sdF9mb3Jtc0FwaV9fc29ydEZpZWxkc0JlZm9yZUNsZWFyPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIGUuZGF0YS5maWVsZFR5cGU9PT1GT1JNU19BUElfRklFTEQuQ0FMQz8xOi0xfSx0X2Zvcm1zQXBpX19pc0NvbmRpdGlvbmFsRm9ybT1mdW5jdGlvbiB0KGUpe3JldHVybiBlLmNsYXNzTGlzdC5jb250YWlucygidC1jb25kaXRpb25hbC1mb3JtIil8fGUucXVlcnlTZWxlY3RvcigiLnQtY29uZGl0aW9uYWwiKX0sdF9mb3Jtc0FwaV9fZ2V0VGlsZGFGaWVsZD1mdW5jdGlvbiB0KGUpe2lmKCFlKXRocm93IG5ldyBFcnJvcigiaW5wdXRHcm91cCBlbGVtZW50IGlzIG1pc3NpbmciKTt2YXIgcj10X2Zvcm1zQXBpX19nZXRGaWVsZERhdGEoZSksbz1yLmxpZCxuPXIuZmllbGRUeXBlLGE9ci5maWVsZE5hbWU7aWYoIW98fCFufHwhYSl0aHJvdyBuZXcgRXJyb3IoIlBsZWFzZSwgc2V0IGFsbCB0aGUgcmVxdWlyZWQgZGF0YS1hdHRycyB0byBpbml0aWFsaXplIEZvcm1JbnB1dC4iKTt2YXIgaT1mdW5jdGlvbiB0KCl7cmV0dXJuIGUucXVlcnlTZWxlY3RvcignW25hbWU9IicrYSsnIl0nKX0scz1mdW5jdGlvbiB0KCl7dmFyIGU9aSgpO3JldHVybnt2YWx1ZTp0X2Zvcm1zQXBpX19zYWZlVmFsdWUoZSl9fSxsPVtdLGM9bmV3IE1hcCx1LGQsbSxfPXtlbGVtZW50OmUsZGF0YTpyLGdldFZhbHVlOnMsb25DaGFuZ2U6ZnVuY3Rpb24gdChlLHIpe3ZhciBvLG49KHJ8fHt9KS51bmlxdWVLZXk7aWYobil7dmFyIGE7aWYoYy5oYXMobikpcmV0dXJuO2Muc2V0KG4sZSl9ZWxzZSBsLnB1c2goZSl9LGZvY3VzOmZ1bmN0aW9uIHQoKXt2YXIgZT1pKCk7dF9mb3Jtc0FwaV9fc2FmZUZvY3VzKGUpfSxyZXNldDpmdW5jdGlvbiB0KCl7dmFyIGU9aSgpLG89ci5kZWZhdWx0VmFsdWV8fCIiO3RfZm9ybXNBcGlfX3NhZmVTZXRWYWx1ZShlLG8se3NpbGVudDohMH0pfSxvbkZpZWxkUmVhZHk6ZnVuY3Rpb24gdCgpe3JldHVybiB0X2Zvcm1zQXBpX193YWl0Rm9yRmllbGRSZWFkeVN0YXRlKF8pfSxfb25DaGFuZ2VDYWxsYmFja3M6bCxfdW5pcXVlT25DaGFuZ2VDYWxsYmFja3M6Y30sZj1mdW5jdGlvbiB0KGUpe2wuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHQoe2V2ZW50OmUsZmllbGQ6X30pfSkpLGMuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHQoe2V2ZW50OmUsZmllbGQ6X30pfSkpfTtyZXR1cm4gZS5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLGYpLGUudF9maWVsZD1fLF99LHRfZm9ybXNBcGlfX3JhZGlvRmllbGRNaXhpbj1mdW5jdGlvbiB0KGUpe3JldHVybiBlLmRhdGEuaW5wdXRzPUFycmF5LmZyb20oZS5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1t0eXBlPSJyYWRpbyJdJykpLGUuZ2V0VmFsdWU9ZnVuY3Rpb24oKXt2YXIgdD1lLmRhdGEuaW5wdXRzLmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNoZWNrZWR9KSk7cmV0dXJue3ZhbHVlOnRfZm9ybXNBcGlfX3NhZmVWYWx1ZSh0KX19LGUucmVzZXQ9ZnVuY3Rpb24oKXt2YXIgdD1OdW1iZXIoZS5kYXRhLmRlZmF1bHRWYWx1ZSkscj1udWxsIT10JiZ0PjA7ZS5kYXRhLmlucHV0cy5mb3JFYWNoKChmdW5jdGlvbihlLG8pe2UuY2hlY2tlZD0hKCFyfHx0IT09bysxKX0pKSxlLmRhdGEub3duVmFyaWFudElucHV0JiZ0X2Zvcm1zQXBpX19zZW5kUmVzZXQoZS5kYXRhLm93blZhcmlhbnRJbnB1dCl9LGV9LHRfZm9ybXNBcGlfX293blZhcmlhbnRNaXhpbj1mdW5jdGlvbiB0KGUpe3JldHVybiBlLm9uRmllbGRSZWFkeT1mdW5jdGlvbigpe3JldHVybiB0X2Zvcm1zQXBpX193YWl0Rm9yRmllbGRSZWFkeVN0YXRlKGUpLnRoZW4oKGZ1bmN0aW9uKCl7dmFyIHQ9ZS5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXJhZGlvLW93bmFuc3dlciwgLnQtY2hlY2tib3gtb3duYW5zd2VyIikscj10P3QuZ2V0QXR0cmlidXRlKCJkYXRhLW93bi12YXJpYW50LXRpdGxlIik6IiI7cmV0dXJuIGUuZGF0YS5vd25WYXJpYW50SW5wdXQ9dCxlLmRhdGEub3duVmFyaWFudFRpdGxlPXIsZX0pKX0sZX0sdF9mb3Jtc0FwaV9fY2hlY2tib3hlc01peGluPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIGUuZGF0YS5pbnB1dHM9QXJyYXkuZnJvbShlLmVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3R5cGU9ImNoZWNrYm94Il0nKSksZS5mb2N1cz1mdW5jdGlvbigpe3ZhciB0PWUuZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdbdHlwZT0iY2hlY2tib3giXScpO3RfZm9ybXNBcGlfX3NhZmVGb2N1cyh0KX0sZS5yZXNldD1mdW5jdGlvbigpe3ZhciB0PWUuZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdbbmFtZT0iJytlLmRhdGEuZmllbGROYW1lKyciXScpLHI9TnVtYmVyKGUuZGF0YS5kZWZhdWx0VmFsdWUpLG89bnVsbCE9ciYmcj4wO3RfZm9ybXNBcGlfX3NhZmVTZXRWYWx1ZSh0LCIiLHtzaWxlbnQ6ITB9KSxlLmRhdGEub3duVmFyaWFudElucHV0JiZ0X2Zvcm1zQXBpX19zZW5kUmVzZXQoZS5kYXRhLm93blZhcmlhbnRJbnB1dCksZS5kYXRhLmlucHV0cy5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gdC5jaGVja2VkPSExfSkpLGUuZGF0YS5pbnB1dHMuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXt2YXIgbjtvJiZyPT09ZSsxJiZ0LmNsaWNrKCl9KSl9LGV9LHRfZm9ybXNBcGlfX2dldFVwbG9hZFdpZGdldEZpZWxkPWZ1bmN0aW9uIHQoZSl7dmFyIHI9dF9mb3Jtc0FwaV9fZ2V0VGlsZGFGaWVsZChlKTtyZXR1cm4gci5vbkZpZWxkUmVhZHk9ZnVuY3Rpb24oKXtyZXR1cm4gdF9mb3Jtc0FwaV9fd2FpdEZvckZpZWxkUmVhZHlTdGF0ZShyKS50aGVuKChmdW5jdGlvbigpe3JldHVybiByLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidXdGaWxlVXBsb2FkZWQiLChmdW5jdGlvbigpe3JldHVybiB0X2Zvcm1zQXBpX19zZW5kQ2hhbmdlKHIuZWxlbWVudCl9KSksci5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInV3RmlsZVJlbW92ZWQiLChmdW5jdGlvbigpe3JldHVybiB0X2Zvcm1zQXBpX19zZW5kQ2hhbmdlKHIuZWxlbWVudCl9KSkscn0pKX0sci5nZXRWYWx1ZT1mdW5jdGlvbigpe3ZhciB0LG87cmV0dXJue3ZhbHVlOkFycmF5LmZyb20oZS5xdWVyeVNlbGVjdG9yQWxsKCdbbmFtZV49Iicrci5kYXRhLmZpZWxkTmFtZSsnIl0nKSkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdF9mb3Jtc0FwaV9fc2FmZVZhbHVlKHQpfSkpLmZpbHRlcihCb29sZWFuKS5qb2luKCI7ICIpfX0sci5mb2N1cz1mdW5jdGlvbigpe3IuZWxlbWVudC5zY3JvbGxJbnRvVmlldyh7YmxvY2s6ImNlbnRlciJ9KX0sci5yZXNldD1mdW5jdGlvbigpe3RfZm9ybXNBcGlfX3NlbmRSZXNldChyLmVsZW1lbnQpfSxyfSx0X2Zvcm1zQXBpX19nZXRVcGxvYWRDYXJlRmllbGQ9ZnVuY3Rpb24gdChlKXt0cnl7dmFyIHI9dF9mb3Jtc0FwaV9fZ2V0VGlsZGFGaWVsZChlKTtyZXR1cm4gci5vbkZpZWxkUmVhZHk9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHQpe3Rfb25GdW5jTG9hZCgidXBsb2FkY2FyZSIsKGZ1bmN0aW9uKCl7ci5kYXRhLndpZGdldD13aW5kb3cudXBsb2FkY2FyZS5XaWRnZXQoJ1tkYXRhLWlucHV0LWxpZD0iJytyLmRhdGEubGlkKyciXSBbcm9sZT0idXBsb2FkY2FyZS11cGxvYWRlciJdJyksci5kYXRhLndpZGdldC5vblVwbG9hZENvbXBsZXRlLmFkZCgoZnVuY3Rpb24oKXtyZXR1cm4gdF9mb3Jtc0FwaV9fc2VuZENoYW5nZShyLmVsZW1lbnQpfSkpLHQocil9KSl9KSl9LHIuZm9jdXM9ZnVuY3Rpb24oKXtyLmVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiJjZW50ZXIifSl9LHIucmVzZXQ9ZnVuY3Rpb24oKXt2YXIgdD1yLmRhdGEud2lkZ2V0O3RfZm9ybXNBcGlfX3NhZmVTZXRWYWx1ZSh0LmlucHV0RWxlbWVudCwiIix7c2lsZW50OiEwfSksdC5yZWxvYWRJbmZvKCl9LHJ9Y2F0Y2gobyl7cmV0dXJuIGNvbnNvbGUuZXJyb3IobyksbnVsbH19LHRfZm9ybXNBcGlfX2dldENvbnRhY3RNZXRob2RGaWVsZD1mdW5jdGlvbiB0KGUpe3ZhciByPXRfZm9ybXNBcGlfX2dldFRpbGRhRmllbGQoZSksbz0oci5kYXRhLmZpZWxkTmFtZXx8IiIpLnNwbGl0KCI7Iiksbj1vWzBdLGE9b1sxXTtyLmRhdGEuaXNDb250YWN0TWV0aG9kPSEwLHIuZGF0YS50eXBlSW5wdXROYW1lPW4sci5kYXRhLmlkSW5wdXROYW1lPWE7dmFyIGkscz1BcnJheS5mcm9tKGUucXVlcnlTZWxlY3RvckFsbCgiLnQtY29udGFjdC1tZXRob2RfX3R5cGUiKSkubWFwKChmdW5jdGlvbih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIltuYW1lPSIrci5kYXRhLnR5cGVJbnB1dE5hbWUrIl0iKTtyZXR1cm57d3JhcHBlcjp0LGlucHV0OmUsZGlzcGxheVRleHQ6dC50ZXh0Q29udGVudC50cmltKCl9fSkpO3JldHVybiByLmdldFZhbHVlPWZ1bmN0aW9uKCl7dmFyIHQsbz10X2Zvcm1zQXBpX19zYWZlVmFsdWUoZS5xdWVyeVNlbGVjdG9yKCdbbmFtZT0iJytyLmRhdGEuaWRJbnB1dE5hbWUrJyJdOm5vdChbZGlzYWJsZWRdKScpKSxuPXMuZmluZCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuaW5wdXQuY2hlY2tlZH0pKSxhPXRfZm9ybXNBcGlfX3NhZmVWYWx1ZShuLmlucHV0KSxpPW4/bi5kaXNwbGF5VGV4dDoiIjtyZXR1cm57dmFsdWU6KHQ9e30sdFtyLmRhdGEuaWRJbnB1dE5hbWVdPXt2YWx1ZTpvfSx0W3IuZGF0YS50eXBlSW5wdXROYW1lXT17dmFsdWU6YSx0eXBlSW5wdXREaXNwbGF5VGV4dDppfSx0KX19LHIuZm9jdXM9ZnVuY3Rpb24oKXt2YXIgdCxlPXIuZWxlbWVudC5xdWVyeVNlbGVjdG9yKCIudC1jb250YWN0LW1ldGhvZF9fdmFsdWUtY29udGFpbmVyID4gOm5vdCgudC1jb250YWN0LW1ldGhvZF9faGlkZGVuKSIpLnF1ZXJ5U2VsZWN0b3IoIi50LWlucHV0LWJsb2NrOm5vdCgudC1jb250YWN0LW1ldGhvZF9faGlkZGVuKSIpLG89ZS5xdWVyeVNlbGVjdG9yKCIuanMtdXNlcm5hbWUtaW5wdXQiKTtpZihvKXRfZm9ybXNBcGlfX3NhZmVGb2N1cyhvKTtlbHNle3ZhciBuPWUucXVlcnlTZWxlY3RvcignLnQtaW5wdXRbdHlwZT0idGVsIl0nKTt0X2Zvcm1zQXBpX19zYWZlRm9jdXMobil9fSxyLnJlc2V0PWZ1bmN0aW9uKCl7dF9mb3Jtc0FwaV9fc2VuZFJlc2V0KHIuZWxlbWVudCl9LHJ9LHRfZm9ybXNBcGlfX2dldENoZWNrYm94RmllbGQ9ZnVuY3Rpb24gdChlKXt2YXIgcj10X2Zvcm1zQXBpX19nZXRUaWxkYUZpZWxkKGUpO3JldHVybiByLmdldFZhbHVlPWZ1bmN0aW9uKCl7dmFyIHQ9ZS5xdWVyeVNlbGVjdG9yKCdbbmFtZT0iJytyLmRhdGEuZmllbGROYW1lKyciXScpO3JldHVybnt2YWx1ZTp0JiZ0LmNoZWNrZWQ/InllcyI6Im5vIn19LHIucmVzZXQ9ZnVuY3Rpb24oKXt2YXIgdD1lLnF1ZXJ5U2VsZWN0b3IoJ1tuYW1lPSInK3IuZGF0YS5maWVsZE5hbWUrJyJdJyksbz1yLmRhdGEuZGVmYXVsdFZhbHVlO3QuY2hlY2tlZD0ieSI9PT1vfSxyfSx0X2Zvcm1zQXBpX19nZXRSYWRpb0J1dHRvbnNGaWVsZD1mdW5jdGlvbiB0KGUpe3JldHVybiB0X2Zvcm1zQXBpX19vd25WYXJpYW50TWl4aW4odF9mb3Jtc0FwaV9fcmFkaW9GaWVsZE1peGluKHRfZm9ybXNBcGlfX2dldFRpbGRhRmllbGQoZSkpKX0sdF9mb3Jtc0FwaV9fZ2V0Q2hlY2tib3hlc0ZpZWxkPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIHRfZm9ybXNBcGlfX293blZhcmlhbnRNaXhpbih0X2Zvcm1zQXBpX19jaGVja2JveGVzTWl4aW4odF9mb3Jtc0FwaV9fZ2V0VGlsZGFGaWVsZChlKSkpfSx0X2Zvcm1zQXBpX19nZXRSYWRpb0ltYWdlc0ZpZWxkPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIHRfZm9ybXNBcGlfX3JhZGlvRmllbGRNaXhpbih0X2Zvcm1zQXBpX19nZXRUaWxkYUZpZWxkKGUpKX0sdF9mb3Jtc0FwaV9fZ2V0Q2hlY2tib3hJbWFnZXNGaWVsZD1mdW5jdGlvbiB0KGUpe3JldHVybiB0X2Zvcm1zQXBpX19jaGVja2JveGVzTWl4aW4odF9mb3Jtc0FwaV9fZ2V0VGlsZGFGaWVsZChlKSl9LHRfZm9ybXNBcGlfX2dldFJhdGluZ0ZpZWxkPWZ1bmN0aW9uIHQoZSl7dmFyIHI9dF9mb3Jtc0FwaV9fcmFkaW9GaWVsZE1peGluKHRfZm9ybXNBcGlfX2dldFRpbGRhRmllbGQoZSkpLG89ci5yZXNldDtyZXR1cm4gci5yZXNldD1mdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO28uY2FsbC5hcHBseShvLFt0aGlzXS5jb25jYXQoZSkpLHRfZm9ybXNBcGlfX3NlbmRSZXNldChyLmVsZW1lbnQpfSxyfSx0X2Zvcm1zQXBpX19nZXRCYXNpY0RlbGl2ZXJ5RmllbGQ9ZnVuY3Rpb24gdChlKXt2YXIgcj10X2Zvcm1zQXBpX19yYWRpb0ZpZWxkTWl4aW4odF9mb3Jtc0FwaV9fZ2V0VGlsZGFGaWVsZChlKSk7cmV0dXJuIHIuZ2V0VmFsdWU9ZnVuY3Rpb24oKXt2YXIgdD1yLmRhdGEuaW5wdXRzLmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNoZWNrZWR9KSksZT10P3QuZ2V0QXR0cmlidXRlKCJkYXRhLWRlbGl2ZXJ5LXByaWNlIik6bnVsbCxvPXRfZm9ybXNBcGlfX3NhZmVWYWx1ZSh0KTtyZXR1cm4gZSYmKG89by5zcGxpdCgiPSIpWzBdKSx7dmFsdWU6byxkZWxpdmVyeVByaWNlOmV9fSxyfSx0X2Zvcm1zQXBpX19nZXRQaG9uZUZpZWxkPWZ1bmN0aW9uIHQoZSl7dmFyIHI9dF9mb3Jtc0FwaV9fZ2V0VGlsZGFGaWVsZChlKTtyZXR1cm4gci5mb2N1cz1mdW5jdGlvbigpe3ZhciB0PXIuZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcudC1pbnB1dFt0eXBlPSJ0ZWwiXScpO3RfZm9ybXNBcGlfX3NhZmVGb2N1cyh0KX0sci5yZXNldD1mdW5jdGlvbigpe3RfZm9ybXNBcGlfX3NlbmRSZXNldChyLmVsZW1lbnQpO3ZhciB0PXIuZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcudC1pbnB1dFt0eXBlPSJ0ZWwiXScpO3RfZm9ybXNBcGlfX3NhZmVTZXRWYWx1ZSh0LCIiLHtzaWxlbnQ6ITB9KX0scn0sdF9mb3Jtc0FwaV9fZ2V0U2VsZWN0Ym94RmllbGQ9ZnVuY3Rpb24gdChlKXt0cnl7dmFyIHI9dF9mb3Jtc0FwaV9fZ2V0VGlsZGFGaWVsZChlKSxvPXIuZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdbbmFtZT0iJytyLmRhdGEuZmllbGROYW1lKyciXScpO3JldHVybiByLnJlc2V0PWZ1bmN0aW9uKCl7aWYobyl7dmFyIHQ9by5vcHRpb25zWzBdLGU9dCYmIiI9PT10LnZhbHVlLG49TnVtYmVyKHIuZGF0YS5kZWZhdWx0VmFsdWUpfHwwLGE9TWF0aC5tYXgoMCxlP246bi0xKSxpO28ub3B0aW9uc1thXS5zZWxlY3RlZD0hMH19LHJ9Y2F0Y2gobil7cmV0dXJuIGNvbnNvbGUuZXJyb3IobiksbnVsbH19LHRfZm9ybXNBcGlfX2dldENhbGN1bGF0b3JGaWVsZD1mdW5jdGlvbiB0KGUpe3RyeXt2YXIgcj10X2Zvcm1zQXBpX19nZXRUaWxkYUZpZWxkKGUpO3JldHVybiByLnJlc2V0PWZ1bmN0aW9uKCl7ci5lbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJyZWNhbGN1bGF0ZSIpKX0scn1jYXRjaChvKXtyZXR1cm4gY29uc29sZS5lcnJvcihvKSxudWxsfX0sdF9mb3Jtc0FwaV9fZ2V0UmFuZ2VGaWVsZD1mdW5jdGlvbiB0KGUpe3RyeXt2YXIgcj10X2Zvcm1zQXBpX19nZXRUaWxkYUZpZWxkKGUpLG89ci5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXJhbmdlIiksbj1yLnJlc2V0O3JldHVybiByLnJlc2V0PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsZT1uZXcgQXJyYXkodCkscj0wO3I8dDtyKyspZVtyXT1hcmd1bWVudHNbcl07bi5jYWxsLmFwcGx5KG4sW3RoaXNdLmNvbmNhdChlKSksbnVsbD09b3x8by5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiZGlzcGxheUNoYW5nZWQiKSl9LHJ9Y2F0Y2goYSl7cmV0dXJuIGNvbnNvbGUuZXJyb3IoYSksbnVsbH19LHRfZm9ybXNBcGlfX2dldEZpZWxkQ29uc3RydWN0b3I9ZnVuY3Rpb24gdChlKXt2YXIgcj1lLmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZC10eXBlIiksbz0iY2IiPT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGQtcmFkY2IiKTtzd2l0Y2gocil7Y2FzZSBGT1JNU19BUElfRklFTEQuVkFSSUFOVFM6cmV0dXJuIG8/dF9mb3Jtc0FwaV9fZ2V0Q2hlY2tib3hlc0ZpZWxkKGUpOnRfZm9ybXNBcGlfX2dldFJhZGlvQnV0dG9uc0ZpZWxkKGUpO2Nhc2UgRk9STVNfQVBJX0ZJRUxELklNQUdFX1ZBUklBTlRTOnJldHVybiBvP3RfZm9ybXNBcGlfX2dldENoZWNrYm94SW1hZ2VzRmllbGQoZSk6dF9mb3Jtc0FwaV9fZ2V0UmFkaW9JbWFnZXNGaWVsZChlKTtjYXNlIEZPUk1TX0FQSV9GSUVMRC5GSUxFOnJldHVybiB0X2Zvcm1zQXBpX19nZXRVcGxvYWRXaWRnZXRGaWVsZChlKTtjYXNlIEZPUk1TX0FQSV9GSUVMRC5DT05UQUNUX01FVEhPRDpyZXR1cm4gdF9mb3Jtc0FwaV9fZ2V0Q29udGFjdE1ldGhvZEZpZWxkKGUpO2Nhc2UgRk9STVNfQVBJX0ZJRUxELkNIRUNLQk9YOnJldHVybiB0X2Zvcm1zQXBpX19nZXRDaGVja2JveEZpZWxkKGUpO2Nhc2UgRk9STVNfQVBJX0ZJRUxELlVQTE9BRENBUkVfRklMRTpyZXR1cm4gdF9mb3Jtc0FwaV9fZ2V0VXBsb2FkQ2FyZUZpZWxkKGUpO2Nhc2UgRk9STVNfQVBJX0ZJRUxELlJBVElORzpyZXR1cm4gdF9mb3Jtc0FwaV9fZ2V0UmF0aW5nRmllbGQoZSk7Y2FzZSBGT1JNU19BUElfRklFTEQuREVMSVZFUlk6cmV0dXJuIHRfZm9ybXNBcGlfX2dldEJhc2ljRGVsaXZlcnlGaWVsZChlKTtjYXNlIEZPUk1TX0FQSV9GSUVMRC5QSE9ORTpyZXR1cm4gdF9mb3Jtc0FwaV9fZ2V0UGhvbmVGaWVsZChlKTtjYXNlIEZPUk1TX0FQSV9GSUVMRC5TRUxFQ1Q6cmV0dXJuIHRfZm9ybXNBcGlfX2dldFNlbGVjdGJveEZpZWxkKGUpO2Nhc2UgRk9STVNfQVBJX0ZJRUxELkNBTEM6cmV0dXJuIHRfZm9ybXNBcGlfX2dldENhbGN1bGF0b3JGaWVsZChlKTtjYXNlIEZPUk1TX0FQSV9GSUVMRC5SQU5HRTpyZXR1cm4gdF9mb3Jtc0FwaV9fZ2V0UmFuZ2VGaWVsZChlKTtkZWZhdWx0OnJldHVybiB0X2Zvcm1zQXBpX19nZXRUaWxkYUZpZWxkKGUpfX0sdF9mb3Jtc0FwaV9faW5pdFRpbGRhRmllbGQ9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHQscil7dmFyIG89ZS50X2ZpZWxkO2lmKG8pcmV0dXJuIHQobyk7dmFyIG49dF9mb3Jtc0FwaV9fZ2V0RmllbGRDb25zdHJ1Y3RvcihlKTtyZXR1cm4gbnx8cihuZXcgRXJyb3IoIkVycm9yIHdoaWxlIHRyeWluZyB0byBpbml0aWFsaXplIFRpbGRhRmllbGQgQXBpLiIpKSxuLm9uRmllbGRSZWFkeSgpLnRoZW4odCl9KSl9LHRfZm9ybXNBcGlfX2NsZWFyRm9ybT1mdW5jdGlvbiB0KGUpe3RyeXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKF9jYXRjaCQxKChmdW5jdGlvbigpe2lmKCEoZSBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkpdGhyb3cgbmV3IEVycm9yKCJNdXN0IGJlIGNhbGxlZCBvbiBhIGZvcm0gZWxlbWVudCIpO3ZhciB0PWUuY2xvc2VzdCgiLnQtcmVjIikscixvPUFycmF5LmZyb20oZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1pbnB1dC1ncm91cCIpKS5tYXAodF9mb3Jtc0FwaV9faW5pdFRpbGRhRmllbGQpO3JldHVybiBQcm9taXNlLnJlc29sdmUoUHJvbWlzZS5hbGxTZXR0bGVkKG8pKS50aGVuKChmdW5jdGlvbihyKXt2YXIgbyxuO3IuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4iZnVsZmlsbGVkIj09PXQuc3RhdHVzfSkpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQudmFsdWV9KSkuc29ydCh0X2Zvcm1zQXBpX19zb3J0RmllbGRzQmVmb3JlQ2xlYXIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiB0LnJlc2V0JiZ0LnJlc2V0KCl9KSksdF9mb3Jtc0FwaV9faXNDb25kaXRpb25hbEZvcm0oZSkmJnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInN5bmMtY29uZGl0aW9uYWxzIix7ZGV0YWlsOntzaG91bGRQcmV2ZW50U3VibWl0OiExfX0pKX0pKX0pLChmdW5jdGlvbih0KXtjb25zb2xlLmVycm9yKCJFcnJvciB0cnlpbmcgdG8gY2xlYXIgZm9ybToiLHQpfSkpKX1jYXRjaChyKXtyZXR1cm4gUHJvbWlzZS5yZWplY3Qocil9fTtmdW5jdGlvbiBfY2F0Y2godCxlKXt0cnl7dmFyIHI9dCgpfWNhdGNoKG8pe3JldHVybiBlKG8pfXJldHVybiByJiZyLnRoZW4/ci50aGVuKHZvaWQgMCxlKTpyfXZhciB0X2Zvcm1zX191cGRhdGVBbGxWYXJpYWJsZXM9ZnVuY3Rpb24gdChlKXt0cnl7dmFyIHI9X2NhdGNoKChmdW5jdGlvbigpe3ZhciB0PWUuY2xvc2VzdCgiLnQtcmVjIikscj10X2Zvcm1zX19nZXRVc2VkVmFyaWFibGVzKFt0XSx7dW5pcXVlOiEwfSksbztyLmZpbHRlcih0X2Zvcm1zX19pc1N5c3RlbVZhcmlhYmxlKS5mb3JFYWNoKChmdW5jdGlvbihlKXtyZXR1cm4gdF9mb3Jtc19fdXBkYXRlU3lzdGVtVmFyaWFibGUodCx0LGUpfSkpO3ZhciBuLGE9ci5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiF0X2Zvcm1zX19pc1N5c3RlbVZhcmlhYmxlKHQpfSkpLm1hcCgoZnVuY3Rpb24oZSl7dHJ5e3ZhciByPXRfZm9ybXNfX2ZpbmRGb3JtRmllbGQodCxlLm5hbWUpO3JldHVybiByP1Byb21pc2UucmVzb2x2ZSh0X2Zvcm1zQXBpX19pbml0VGlsZGFGaWVsZChyKSkudGhlbigoZnVuY3Rpb24ocil7cmV0dXJuIHI/KHRfZm9ybXNfX3VwZGF0ZUlucHV0VmFyaWFibGUodCxlLHIpLFByb21pc2UucmVzb2x2ZSgpKTpQcm9taXNlLnJlc29sdmUoKX0pKTpQcm9taXNlLnJlc29sdmUoKX1jYXRjaChvKXtyZXR1cm4gUHJvbWlzZS5yZWplY3Qobyl9fSkpO3JldHVybiBQcm9taXNlLnJlc29sdmUoUHJvbWlzZS5hbGwoYSkpLnRoZW4oKGZ1bmN0aW9uKCl7fSkpfSksKGZ1bmN0aW9uKHQpe2NvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byB1cGRhdGUgdmFyaWFibHMgaW4gcmVjOiIsdCl9KSk7cmV0dXJuIFByb21pc2UucmVzb2x2ZShyJiZyLnRoZW4/ci50aGVuKChmdW5jdGlvbigpe30pKTp2b2lkIDApfWNhdGNoKG8pe3JldHVybiBQcm9taXNlLnJlamVjdChvKX19LHRfZm9ybXNfX2ZvY3VzSW5wdXQ9ZnVuY3Rpb24gdChlKXt0cnl7aWYoIWUpcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO3ZhciByPWUuY2xvc2VzdCgiLnQtaW5wdXQtZ3JvdXAiKTtpZighcilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7dmFyIG89X2NhdGNoKChmdW5jdGlvbigpe3JldHVybiBQcm9taXNlLnJlc29sdmUodF9mb3Jtc0FwaV9faW5pdFRpbGRhRmllbGQocikpLnRoZW4oKGZ1bmN0aW9uKHQpe3QuZm9jdXMoKX0pKX0pLChmdW5jdGlvbigpe2UuZm9jdXMoKX0pKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG8mJm8udGhlbj9vLnRoZW4oKGZ1bmN0aW9uKCl7fSkpOnZvaWQgMCl9Y2F0Y2gobil7cmV0dXJuIFByb21pc2UucmVqZWN0KG4pfX07ZnVuY3Rpb24gdF9mb3Jtc19fc2V0dXBDbG9zZUhhbmRsZXJzKHQsZSl7dmFyIHI9ZG9jdW1lbnQuYm9keSxvPXQucXVlcnlTZWxlY3RvcigiLnQtZm9ybS1zdWNjZXNzLXBvcHVwX19jbG9zZS1pY29uIiksbj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGlsZGFmb3Jtc3VjY2Vzc3BvcHVwYnRuLW5ldyIpO2Z1bmN0aW9uIGEoKXtvJiZvLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIix3aW5kb3cudGlsZGFGb3JtLmhhbmRsZUNsb3NlUG9wdXApLG4mJm4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHdpbmRvdy50aWxkYUZvcm0uaGFuZGxlQ2xvc2VQb3B1cCksci5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixpKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIixzKX1mdW5jdGlvbiBpKHQpeyJFc2NhcGUiIT09dC5rZXkmJjI3IT10LmtleUNvZGV8fHdpbmRvdy50aWxkYUZvcm0uaGFuZGxlQ2xvc2VQb3B1cCgpfWZ1bmN0aW9uIHMoZSl7ZS50YXJnZXQ9PT10JiZ3aW5kb3cudGlsZGFGb3JtLmhhbmRsZUNsb3NlUG9wdXAoKX13aW5kb3cudGlsZGFGb3JtLmN1cnJlbnRSZW1vdmVDbG9zZUhhbmRsZXJzPWEsbyYmby5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsd2luZG93LnRpbGRhRm9ybS5oYW5kbGVDbG9zZVBvcHVwKSxuJiZuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix3aW5kb3cudGlsZGFGb3JtLmhhbmRsZUNsb3NlUG9wdXApLGV8fChyLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGkpLHQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHMpKX1mdW5jdGlvbiB0X2Zvcm1zX19pbml0Rm9ybXMoKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucjpub3QoW2RhdGEtcmVjb3JkLXR5cGU9IjEwOTMiXSwgW2RhdGEtcGFyZW50dHBsaWQ9IjEwOTMiXSknKTt3aW5kb3cudF9mb3Jtc19faW5wdXREYXRhPXt9LHRfZm9ybXNfX2FkZFJlY2FwdGNoYSgpO3ZhciBlPXRfZm9ybXNfX2dldENhbm9uaWNhbFVybCgpLHI9dF9mb3Jtc19faXNDYWNoZWRQYWdlKCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt2YXIgbz10LmlkO2lmKCF3aW5kb3cuaW5pdEZvcm1zW29dKXt2YXIgbj10X2Zvcm1zX19nZXRSZWNGb3JtKHQpO2lmKHImJm4pcmV0dXJuIHRfZm9ybXNfX29uQ2FjaGVkUGFnZUFjdGlvbihuLGUpLHZvaWQgdF9mb3Jtc19fb2ZmSW5wdXRzQXV0b2NvbXBsZXRlKG4pO2lmKHRfZm9ybXNfX2luaXRGb3JtRmllbGRzKHQpLHRfZm9ybXNfX2luaXRFdmVudFBsYWNlaG9sZGVyKHQpLHRfZm9ybXNfX2FkZElucHV0SXRzR29vZCh0KSx0X2Zvcm1zX19hZGRBdHRyQWN0aW9uKHQpLHRfZm9ybXNfX29uU3VibWl0KHQpLHRfZm9ybXNfX29uQ2xpY2sodCksdF9mb3Jtc19fb25SZW5kZXIodCksbiYmdF9mb3Jtc19faW5pdEZvcm1NdXRhdGlvbkxpc3RlbmVycyh0KSx0X2Zvcm1zX19hZGRGb2N1c09uVGFiKHQpLHRfb25GdW5jTG9hZCgidF90aHJvdHRsZSIsKGZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXt0X2Zvcm1zX19jYWxjdWxhdGVJbnB1dHNXaWR0aChvKX0pKSl9KSksd2luZG93LmluaXRGb3Jtc1tvXT0hMCxuJiZ0X2Zvcm1zX19pc05ld1N1Y2Nlc3NCb3gobikpe24uc2V0QXR0cmlidXRlKCJkYXRhLXN1Y2Nlc3MtcG9wdXAiLCJ5Iik7dmFyIGE9bi5xdWVyeVNlbGVjdG9yKCIudC1mb3JtX19zdWNjZXNzYm94Iik7YSYmYS5jbGFzc0xpc3QuYWRkKCJ0LWZvcm0tc3VjY2Vzcy1wb3B1cCIpfX19KSl9ZnVuY3Rpb24gdF9mb3Jtc19fdmFsaWRhdGVPd25WYXJpYW50KHQpe3ZhciBlO3QmJih0LnZhbHVlJiYodC52YWx1ZT0iIiksdC5jbG9zZXN0KCIudG4tYXRvbV9fZm9ybSIpfHwodC50aW1lcklEJiZjbGVhclRpbWVvdXQodC50aW1lcklEKSx0LnRpbWVySUQ9c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0LmNsYXNzTGlzdC5hZGQoInQtaW5wdXQtb3duYW5zd2VyX2FjdGl2ZSIpLHQuc3R5bGUuZGlzcGxheT0iZmxleCIsY2xlYXJUaW1lb3V0KHQudGltZXJJRCl9KSw1MDApKSl9ZnVuY3Rpb24gdF9mb3Jtc19fYWRkRm9jdXNPblRhYih0KXtpZighd2luZG93LmlzTW9iaWxlKXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWlucHV0LCAudC1zZWxlY3QiKTtpZihlKXt2YXIgcj1udWxsO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLChmdW5jdGlvbigpe3I9ImtleWJvYXJkIn0pKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLChmdW5jdGlvbigpe3I9Im1vdXNlIn0pKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIiwoZnVuY3Rpb24oKXtyPSJtb3VzZSJ9KSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLChmdW5jdGlvbih0KXt0LmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIiwoZnVuY3Rpb24oKXtpZigia2V5Ym9hcmQiPT09cil7dmFyIGU9dDsoZS5jbGFzc0xpc3QuY29udGFpbnMoInQtaW5wdXRfcHZpcyIpfHxlLmNsYXNzTGlzdC5jb250YWlucygidC1pbnB1dC1waG9uZW1hc2siKSkmJihlPWUucGFyZW50RWxlbWVudCksZS5jbGFzc0xpc3QuYWRkKCJ0LWZvY3VzYWJsZSIpLHI9bnVsbH19KSksdC5hZGRFdmVudExpc3RlbmVyKCJibHVyIiwoZnVuY3Rpb24oKXt0LmNsYXNzTGlzdC5yZW1vdmUoInQtZm9jdXNhYmxlIil9KSl9KSl9fX1mdW5jdGlvbiB0X2Zvcm1zX19pbml0RXZlbnRQbGFjZWhvbGRlcih0KXt2YXIgZT0iZm9jdXMiLHI9ImJsdXIiO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXJ8fChlPSJmb2N1c2luIixyPSJmb2N1c291dCIpLHRfcmVtb3ZlRXZlbnRMaXN0ZW5lcih0LGUsdF9mb3Jtc19fcmVtb3ZlUGxhY2Vob2xkZXIpLHRfYWRkRXZlbnRMaXN0ZW5lcih0LGUsdF9mb3Jtc19fcmVtb3ZlUGxhY2Vob2xkZXIsITApLHRfcmVtb3ZlRXZlbnRMaXN0ZW5lcih0LHIsdF9mb3Jtc19fYWRkUGxhY2Vob2xkZXIpLHRfYWRkRXZlbnRMaXN0ZW5lcih0LHIsdF9mb3Jtc19fYWRkUGxhY2Vob2xkZXIsITApfWZ1bmN0aW9uIHRfZm9ybXNfX3JlbW92ZVBsYWNlaG9sZGVyKHQpe3ZhciBlPXR8fHdpbmRvdy5ldmVudCxyPWUudGFyZ2V0fHxlLnNyY0VsZW1lbnQ7aWYoIklOUFVUIj09PXIudGFnTmFtZSl7dmFyIG89ci5jbG9zZXN0KCJbZGF0YS1pbnB1dC1saWRdIiksbj1yLmdldEF0dHJpYnV0ZSgicGxhY2Vob2xkZXIiKSxhPSIiO2lmKG8pYT1vLmdldEF0dHJpYnV0ZSgiZGF0YS1pbnB1dC1saWQiKTtlbHNle3ZhciBpPXIuY2xvc2VzdCgiZm9ybSIpO2kmJihhPWkuZ2V0QXR0cmlidXRlKCJkYXRhLWlucHV0LWxpZCIpKX1uJiZhJiYod2luZG93LnRfZm9ybXNfX2lucHV0RGF0YVthXT1uLHIuc2V0QXR0cmlidXRlKCJwbGFjZWhvbGRlciIsIiIpKX19ZnVuY3Rpb24gdF9mb3Jtc19fYWRkTW92ZVRvSW5wdXRXaXRoRXJyb3JDbGlja0hhbmRsZXIodCxlKXtlJiZ0JiYoZS5URWxlbWVudFRvRm9jdXM9dCxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIix0X2Zvcm1zX19oYW5kbGVDbGlja09uRXJyb3IpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfZm9ybXNfX2hhbmRsZUNsaWNrT25FcnJvcikpfWZ1bmN0aW9uIHRfZm9ybXNfX2hhbmRsZUNsaWNrT25FcnJvcih0KXt0LnByZXZlbnREZWZhdWx0KCk7dmFyIGU9dC50YXJnZXQuY2xvc2VzdCgiLnQtZm9ybV9fZXJyb3Jib3gtaXRlbSIpO2lmKGUpe3ZhciByPWUuVEVsZW1lbnRUb0ZvY3VzO3RfZm9ybXNfX2ZvY3VzSW5wdXQocil9fWZ1bmN0aW9uIHRfZm9ybXNfX2FkZFBsYWNlaG9sZGVyKHQpe3ZhciBlPXR8fHdpbmRvdy5ldmVudCxyPWUudGFyZ2V0fHxlLnNyY0VsZW1lbnQsbz1yLmNsb3Nlc3QoIltkYXRhLWlucHV0LWxpZF0iKSxuPSIiO2lmKG8pbj1vLmdldEF0dHJpYnV0ZSgiZGF0YS1pbnB1dC1saWQiKTtlbHNle3ZhciBhPXIuY2xvc2VzdCgiZm9ybSIpO2EmJihuPWEuZ2V0QXR0cmlidXRlKCJkYXRhLWlucHV0LWxpZCIpKX12YXIgaT13aW5kb3cudF9mb3Jtc19faW5wdXREYXRhW25dfHwiIjtpJiZuJiYoci5zZXRBdHRyaWJ1dGUoInBsYWNlaG9sZGVyIixpKSx3aW5kb3cudF9mb3Jtc19faW5wdXREYXRhW25dPSIiKX1mdW5jdGlvbiB0X2Zvcm1zX19hZGRJbnB1dEl0c0dvb2QodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIuanMtZm9ybS1wcm9jY2Vzc1tkYXRhLWZvcm1hY3Rpb250eXBlXSIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSwoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoImRhdGEtZm9ybWFjdGlvbnR5cGUiKSxyPXQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT0iZm9ybS1zcGVjLWNvbW1lbnRzIl0nKTsiMSI9PT1lfHxyfHx0Lmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIiwnPGRpdiBzdHlsZT0icG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAtNTAwMHB4OyBib3R0b206IDA7IGRpc3BsYXk6IG5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZm9ybS1zcGVjLWNvbW1lbnRzIiB2YWx1ZT0iSXRzIGdvb2QiIGNsYXNzPSJqcy1mb3JtLXNwZWMtY29tbWVudHMiIHRhYmluZGV4PSItMSIgLz48L2Rpdj4nKX0pKX1mdW5jdGlvbiB0X2Zvcm1zX19hZGRBdHRyQWN0aW9uKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLmpzLWZvcm0tcHJvY2Nlc3MiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUsKGZ1bmN0aW9uKHQpe3ZhciBlOyIyIj09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWZvcm1hY3Rpb250eXBlIikmJnQuc2V0QXR0cmlidXRlKCJhY3Rpb24iLCIjIil9KSl9ZnVuY3Rpb24gdF9mb3Jtc19fY2FsY3VsYXRlSW5wdXRzV2lkdGgodCl7dmFyIGU9dDtlJiYoZT1lLnJlcGxhY2UoInJlYyIsIiIpKTt2YXIgcj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjcmVjIitlKTtpZihlfHwhZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoInQ3MDZfX2JvZHlfY2FydHdpbnNob3dlZCIpJiYhZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoInQ3MDZfX2JvZHlfY2FydHBhZ2VzaG93ZWQiKXx8KHI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQ3MDYiKSkscil7dmFyIG89ci5xdWVyeVNlbGVjdG9yKCIudC1mb3JtX19pbnB1dHNib3giKTtpZihvKXtvLmNsb3Nlc3QoIi50NzA2IikmJm8uY2xhc3NMaXN0LmFkZCgidC1mb3JtX19pbnB1dHNib3hfaW5yb3ciKTt2YXIgbj1yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWlucHV0LWdyb3VwX3dpZHRoZGVmLCAudC1pbnB1dC1ncm91cF9pbnJvdyIpO2lmKG8uY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWZvcm1fX2lucHV0c2JveF9pbnJvdyIpfHwobj1yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWlucHV0LWJsb2NrX3dpZHRoIikpLDAhPT1uLmxlbmd0aCl7KG8uY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWZvcm1fX2lucHV0c2JveF92ZXJ0aWNhbC1mb3JtIil8fG8uY2xvc2VzdCgiLnQ3MDYiKSkmJm8uY2xhc3NMaXN0LmFkZCgidC1mb3JtX19pbnB1dHNib3hfZmxleCIpO3ZhciBhPW8ub2Zmc2V0V2lkdGgsaT1bInJkIiwicmkiLCJ1YyIsIndzIiwiaGQiLCJmciIsInN0Il07QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbih0KXt2YXIgZT10LHI7aWYoby5jbGFzc0xpc3QuY29udGFpbnMoInQtZm9ybV9faW5wdXRzYm94X2lucm93Iil8fChlPWUuY2xvc2VzdCgiLnQtaW5wdXQtZ3JvdXAiKSksZSYmZS5jbGFzc0xpc3QuY29udGFpbnMoInQtaW5wdXQtZ3JvdXBfaW5yb3ctd2l0aHNpYmxpbmciKSl7cj1lLm5leHRFbGVtZW50U2libGluZzt2YXIgbj1pLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHIuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWlucHV0LWdyb3VwXyIrdCl9KSk7aWYoIXJ8fDAhPT1uLmxlbmd0aHx8IShyLmNsYXNzTGlzdC5jb250YWlucygidC1pbnB1dC1ncm91cF9pbnJvdyIpJiYhZS5jbGFzc0xpc3QuY29udGFpbnMoInQtaW5wdXQtZ3JvdXBfd2lkdGhkZWYiKXx8ZS5jbGFzc0xpc3QuY29udGFpbnMoInQtaW5wdXQtZ3JvdXBfd2lkdGhkZWYiKSYmci5jbGFzc0xpc3QuY29udGFpbnMoInQtaW5wdXQtZ3JvdXAiKSYmIXIuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWlucHV0LWdyb3VwX2lucm93IikpKXJldHVybiBlLmNsYXNzTGlzdC5yZW1vdmUoInQtaW5wdXQtZ3JvdXBfaW5yb3ctd2l0aHNpYmxpbmciKSx2b2lkIGUuY2xhc3NMaXN0LmFkZCgidC1pbnB1dC1ncm91cF9pbnJvdy1sYXN0Iik7ci5jbGFzc0xpc3QuYWRkKCJ0LWlucHV0LWdyb3VwX2lub25lcm93Iil9ZWxzZSBlLmNsYXNzTGlzdC5hZGQoInQtaW5wdXQtZ3JvdXBfaW5yb3ctbGFzdCIpO3ImJmUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWlucHV0LWdyb3VwX3dpZHRoZGVmIikmJmUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWlucHV0LWdyb3VwX2lucm93LXdpdGhzaWJsaW5nIikmJnIuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWlucHV0LWdyb3VwX2lub25lcm93IikmJiFyLmNsYXNzTGlzdC5jb250YWlucygidC1pbnB1dC1ncm91cF9pbnJvdyIpJiYoci5jbGFzc0xpc3QuYWRkKCJ0LWlucHV0LWdyb3VwX3dpZHRoZGVmIiksci5jbGFzc0xpc3QuY29udGFpbnMoInQtaW5wdXQtZ3JvdXBfaW5yb3ctd2l0aHNpYmxpbmciKXx8ci5jbGFzc0xpc3QuYWRkKCJ0LWlucHV0LWdyb3VwX2lucm93LWxhc3QiKSxyLmNsYXNzTGlzdC5jb250YWlucygidC1pbnB1dC1ncm91cF9pbnJvdyIpJiZlLmNsYXNzTGlzdC5hZGQoInQtaW5wdXQtZ3JvdXBfaW5yb3ctbGFzdCIpKSxvLmNsYXNzTGlzdC5jb250YWlucygidC1mb3JtX19pbnB1dHNib3hfaW5yb3ciKXx8dF9mb3Jtc19fY2FsY3VsYXRlRmllbGRzV2lkdGhJbkpTKGUsYSl9KSk7dmFyIHM9ci5xdWVyeVNlbGVjdG9yQWxsKCIudC1pbnB1dC1ncm91cF9pbnJvdy50LWlucHV0LWdyb3VwX2lub25lcm93LnQtaW5wdXQtZ3JvdXBfaW5yb3ctbGFzdCIpO3MubGVuZ3RoPjAmJnRfZm9ybXNfX21vdmVGaWVsZFRvTmV4dFJvdyhzKTt2YXIgbD1yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWlucHV0LWdyb3VwX3dpZHRoZGVmLnQtaW5wdXQtZ3JvdXBfaW5yb3ctbGFzdCIpO28uY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWZvcm1fX2lucHV0c2JveF9pbnJvdyIpJiZsLmxlbmd0aD4wJiZ0X2Zvcm1zX19jb21iaW5lRmllbGRzV2l0aERlZldpZHRoKGwsZSl9fX19ZnVuY3Rpb24gdF9mb3Jtc19fbW92ZUZpZWxkVG9OZXh0Um93KHQpe3ZhciBlO3RfZm9ybXNfX2NyZWF0ZUFycldpdGhBbGxSb3dzKHQsInQtaW5wdXQtZ3JvdXBfaW5yb3ciKS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT0hMTtpZih0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWlucHV0LWdyb3VwX2lucm93LWxhc3QiKSYmdC5uZXh0RWxlbWVudFNpYmxpbmcmJiF0Lm5leHRFbGVtZW50U2libGluZy5jbGFzc0xpc3QuY29udGFpbnMoInQtaW5wdXQtZ3JvdXBfaW5vbmVyb3ciKSYmKGU9ITApfSkpLCFlKXt2YXIgcj10LnJlZHVjZSgoZnVuY3Rpb24odCxlKXt2YXIgcixvPWUuY2xhc3NMaXN0LnZhbHVlLnNwbGl0KCIgIikuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4tMSE9PXQuaW5kZXhPZigidC1pbnB1dC1ncm91cF93aWR0aCIpfSkpLG49MixhO3JldHVybi0xIT09KG89b1swXSkuaW5kZXhPZigiMTAwIikmJihuPTMpLHQrTnVtYmVyKG8uc3Vic3RyKG8ubGVuZ3RoLTIsbikpfSksMCk7cjw9MTAwfHx0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWlucHV0LWdyb3VwX2lucm93LWxhc3QiKSYmKHQuc3R5bGUubWFyZ2luUmlnaHQ9ImNhbGMoMTAwJSAtICgiKyhyLTEwMCkrIiUpIix0LnN0eWxlLmZsZXg9IjAgMCBhdXRvIil9KSl9fSkpfWZ1bmN0aW9uIHRfZm9ybXNfX2NvbWJpbmVGaWVsZHNXaXRoRGVmV2lkdGgodCxlKXt2YXIgcj1bXSxvO3RfZm9ybXNfX2NyZWF0ZUFycldpdGhBbGxSb3dzKHQsInQtaW5wdXQtZ3JvdXBfd2lkdGhkZWYiKS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT00O2lmKHQubGVuZ3RoPjQpZm9yKHZhciBvPTA7bzx0Lmxlbmd0aDtvKz00KXt2YXIgbj10LnNsaWNlKG8sbys0KTtyLnB1c2gobil9ZWxzZSByLnB1c2godCl9KSksci5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgcixvPSJ0LWlucHV0LWdyb3VwX3dpZHRoIisoezQ6IjI1IiwzOiIzMyIsMjoiNTAifVt0Lmxlbmd0aF18fCIxMDAiKTt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKHQuY2xhc3NMaXN0LmFkZChvKSx0LmNsYXNzTGlzdC5jb250YWlucygidC1pbnB1dC1ncm91cF9yZyIpKXt2YXIgcj10LmdldEF0dHJpYnV0ZSgiZGF0YS1pbnB1dC1saWQiKTt3aW5kb3cudF9pbnB1dF9yYW5nZV9pbml0KGUscil9fSkpfSkpfWZ1bmN0aW9uIHRfZm9ybXNfX2NyZWF0ZUFycldpdGhBbGxSb3dzKHQsZSl7dmFyIHI9W10sbz1bXTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt2YXIgbj10O2ZvcihvLnB1c2gobik7bi5wcmV2aW91c0VsZW1lbnRTaWJsaW5nJiZuLnByZXZpb3VzRWxlbWVudFNpYmxpbmcuY2xhc3NMaXN0LmNvbnRhaW5zKGUpJiYhbi5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLmNsYXNzTGlzdC5jb250YWlucygidC1pbnB1dC1ncm91cF9pbnJvdy1sYXN0Iik7KW49bi5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLG8ucHVzaChuKTtyLnB1c2goby5yZXZlcnNlKCkpLG89W119KSkscn1mdW5jdGlvbiB0X2Zvcm1zX19jYWxjdWxhdGVGaWVsZHNXaWR0aEluSlModCxlKXt2YXIgcj0xNSxvPXsxOiJ0LWlucHV0LWJsb2NrX3dpZHRoMTAwIiwyOiJ0LWlucHV0LWJsb2NrX3dpZHRoNTAiLDM6InQtaW5wdXQtYmxvY2tfd2lkdGgzMyIsNDoidC1pbnB1dC1ibG9ja193aWR0aDI1In07Zm9yKHZhciBuIGluIG8paWYodC5jbGFzc0xpc3QuY29udGFpbnMob1tuXSkpe3Quc3R5bGUud2lkdGg9KGUtcioobi0xKSkvbisicHgiO3ZhciBhPXQucHJldmlvdXNFbGVtZW50U2libGluZzthJiZhLmNsYXNzTGlzdC5jb250YWlucygidC1pbnB1dC10aXRsZSIpJiYoYS5zdHlsZS53aWR0aD0oZS1yKihuLTEpKS9uKyJweCIpLHdpbmRvdy5pbm5lcldpZHRoPDQ4MCYmKHQmJih0LnN0eWxlLndpZHRoPSIxMDAlIiksYSYmKGEuc3R5bGUud2lkdGg9IjEwMCUiKSl9fWZ1bmN0aW9uIHRfZm9ybXNfX29uU3VibWl0KHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLmpzLWZvcm0tcHJvY2Nlc3MiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUsKGZ1bmN0aW9uKHQpe3RfcmVtb3ZlRXZlbnRMaXN0ZW5lcih0LCJzdWJtaXQiLHRfZm9ybXNfX3N1Ym1pdEV2ZW50KSx0X2FkZEV2ZW50TGlzdGVuZXIodCwic3VibWl0Iix0X2Zvcm1zX19zdWJtaXRFdmVudCl9KSl9ZnVuY3Rpb24gdF9mb3Jtc19fb25DbGljayh0KXt0X2FkZEV2ZW50TGlzdGVuZXIodCwiZGJsY2xpY2siLHRfZm9ybXNfX2luaXRCdG5EYmxDbGljayksdF9yZW1vdmVFdmVudExpc3RlbmVyKHQsImNsaWNrIix0X2Zvcm1zX19pbml0QnRuQ2xpY2spLHRfYWRkRXZlbnRMaXN0ZW5lcih0LCJjbGljayIsdF9mb3Jtc19faW5pdEJ0bkNsaWNrKX1mdW5jdGlvbiB0X2Zvcm1zX19vbkNhY2hlZFBhZ2VBY3Rpb24odCxlKXt0X2FkZEV2ZW50TGlzdGVuZXIodCwiY2xpY2siLChmdW5jdGlvbigpe3RfZm9ybXNfX3Nob3dXcm9uZ1BhZ2VVcmxNZXNzYWdlKGUpfSkpLHRfYWRkRXZlbnRMaXN0ZW5lcih0LCJzdWJtaXQiLChmdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSx0X2Zvcm1zX19zaG93V3JvbmdQYWdlVXJsTWVzc2FnZShlKX0pKX1mdW5jdGlvbiB0X2Zvcm1zX19vZmZJbnB1dHNBdXRvY29tcGxldGUodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1pbnB1dCIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSwoZnVuY3Rpb24odCl7dC5zZXRBdHRyaWJ1dGUoImF1dG9jb21wbGV0ZSIsIm9mZiIpfSkpfWZ1bmN0aW9uIHRfZm9ybXNfX2luaXRCdG5EYmxDbGljayh0KXt2YXIgZT10fHx3aW5kb3cuZXZlbnQscjsoZS50YXJnZXR8fGUuc3JjRWxlbWVudCkuY2xvc2VzdCgnW3R5cGU9InN1Ym1pdCJdJykmJihlLnByZXZlbnREZWZhdWx0P2UucHJldmVudERlZmF1bHQoKTplLnJldHVyblZhbHVlPSExKX1mdW5jdGlvbiB0X2Zvcm1zX19pbml0QnRuQ2xpY2sodCl7dmFyIGU9dHx8d2luZG93LmV2ZW50LHI9ZS50YXJnZXR8fGUuc3JjRWxlbWVudCxvPSEhci5jbG9zZXN0KCdbdHlwZT0ic3VibWl0Il0nKSYmcjtpZihvKXt2YXIgbj1vLmNsb3Nlc3QoIi5qcy1mb3JtLXByb2NjZXNzIik7aWYobil7ZS5wcmV2ZW50RGVmYXVsdD9lLnByZXZlbnREZWZhdWx0KCk6ZS5yZXR1cm5WYWx1ZT0hMTt2YXIgYT1uLmdldEF0dHJpYnV0ZSgiaWQiKSxpLHM9IiI7aWYoby50aWxkYVNlbmRpbmdTdGF0dXMmJihzPW8udGlsZGFTZW5kaW5nU3RhdHVzKSwhKHMmJnM+PTF8fHRfaGFzQ2xhc3MobywidDcwNl9fc3VibWl0X2Rpc2FibGUiKSkpaWYodF9hZGRDbGFzcyhvLCJ0LWJ0bl9zZW5kaW5nIiksby50aWxkYVNlbmRpbmdTdGF0dXM9IjEiLHdpbmRvdy50aWxkYUZvcm0uaGlkZUVycm9ycyhuKSxpPXdpbmRvdy50aWxkYUZvcm0udmFsaWRhdGUobiksd2luZG93LnRpbGRhRm9ybS5zaG93RXJyb3JzKG4saSkpdF9yZW1vdmVDbGFzcyhvLCJ0LWJ0bl9zZW5kaW5nIiksby50aWxkYVNlbmRpbmdTdGF0dXM9IjAiO2Vsc2V7dmFyIGwsYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1mb3Jtc2tleSIpLHU9cGFyc2VJbnQobi5nZXRBdHRyaWJ1dGUoImRhdGEtZm9ybWFjdGlvbnR5cGUiKSksZDtpZighbi5xdWVyeVNlbGVjdG9yQWxsKCIuanMtZm9ybWFjdGlvbi1zZXJ2aWNlcyIpLmxlbmd0aCYmMSE9PXUmJiFjKXt2YXIgbT10X2Zvcm1zX19nZXRFcnJvckNvbnRhaW5lcnMobiwiIiksXz1tLmVycm9yQm94ZXMsZj1tLmFsbEVycm9yO3JldHVybiBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGYsKGZ1bmN0aW9uKHQpe3QuaW5uZXJIVE1MPSJQbGVhc2Ugc2V0IHJlY2VpdmVyIGluIGJsb2NrIHdpdGggZm9ybXMiLHQuc3R5bGUuZGlzcGxheT0iYmxvY2sifSkpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoXywoZnVuY3Rpb24odCl7dC5zdHlsZS5kaXNwbGF5PSJibG9jayJ9KSksdF9hZGRDbGFzcyhuLCJqcy1zZW5kLWZvcm0tZXJyb3IiKSx0X3JlbW92ZUNsYXNzKG8sInQtYnRuX3NlbmRpbmciKSxvLnRpbGRhU2VuZGluZ1N0YXR1cz0iMCIsdm9pZCB0X3RyaWdnZXJFdmVudChuLCJ0aWxkYWZvcm06YWZ0ZXJlcnJvciIpfWlmKG4ucXVlcnlTZWxlY3RvcigiLmctcmVjYXB0Y2hhIikmJndpbmRvdy5ncmVjYXB0Y2hhKXt3aW5kb3cudGlsZGFGb3JtLmN1cnJlbnRGb3JtUHJvY2Nlc3Npbmc9e2Zvcm06bixidG46byxmb3JtdHlwZTp1LGZvcm1za2V5OmN9O3ZhciBwPW4udGlsZGFDYXB0Y2hhQ2xpZW50SWQ7aWYocCl3aW5kb3cuZ3JlY2FwdGNoYS5yZXNldChwKTtlbHNle3ZhciB3PXtzaXplOiJpbnZpc2libGUiLHNpdGVrZXk6bi5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtY2FwdGNoYWtleSIpLGNhbGxiYWNrOndpbmRvdy50aWxkYUZvcm0uY2FwdGNoYUNhbGxiYWNrfTtwPXdpbmRvdy5ncmVjYXB0Y2hhLnJlbmRlcihhKyJyZWNhcHRjaGEiLHcpLG4udGlsZGFDYXB0Y2hhQ2xpZW50SWQ9cH1yZXR1cm4gdm9pZCB3aW5kb3cuZ3JlY2FwdGNoYS5leGVjdXRlKHApfXdpbmRvdy50aWxkYUZvcm0uc2VuZChuLG8sdSxjKX19fX1mdW5jdGlvbiB0X2Zvcm1zX19vblJlbmRlcih0KXt2YXIgZTshIXQucXVlcnlTZWxlY3RvcigiLnQzOTYiKSYmKHRfcmVtb3ZlRXZlbnRMaXN0ZW5lcih0LCJyZW5kZXIiLHRfZm9ybXNfX3JlbmRlckV2ZW50KSx0X2FkZEV2ZW50TGlzdGVuZXIodCwicmVuZGVyIix0X2Zvcm1zX19yZW5kZXJFdmVudCkpfWZ1bmN0aW9uIHRfZm9ybXNfX3JlbmRlckV2ZW50KCl7dF9mb3Jtc19fb25TdWJtaXQodGhpcyl9ZnVuY3Rpb24gdF9mb3Jtc19faW5pdEZvcm1NdXRhdGlvbkxpc3RlbmVycyh0KXt0JiYodF9yZW1vdmVFdmVudExpc3RlbmVyKHQsInRpbGRhZm9ybTpjb250ZW50Y2hhbmdlZCIsdF9mb3Jtc19fb25Gb3JtQ29udGVudENoYW5nZWQpLHRfYWRkRXZlbnRMaXN0ZW5lcih0LCJ0aWxkYWZvcm06Y29udGVudGNoYW5nZWQiLHRfZm9ybXNfX29uRm9ybUNvbnRlbnRDaGFuZ2VkKSl9ZnVuY3Rpb24gdF9mb3Jtc19fb25Gb3JtQ29udGVudENoYW5nZWQodCl7dmFyIGU7dF9mb3Jtc19fcmVjYWxjQ292ZXJIZWlnaHRCeUZvcm1NdXRhdGlvbih0JiZ0LnRhcmdldD90LnRhcmdldDp0aGlzKX1mdW5jdGlvbiB0X2Zvcm1zX19yZWNhbGNDb3ZlckhlaWdodEJ5Rm9ybU11dGF0aW9uKHQpe3ZhciBlPXQmJnQuY2xvc2VzdD90LmNsb3Nlc3QoImZvcm0iKTpudWxsLHI7aWYoKCFlJiZ0JiZ0LnF1ZXJ5U2VsZWN0b3ImJihlPXQucXVlcnlTZWxlY3RvcigiZm9ybSIpKSxlKSYmZS5jbG9zZXN0KCIudC1jb3ZlciIpKXt2YXIgbz1lLmNsb3Nlc3QoIi5yIik7aWYobyYmby5pZCYmMD09PW8uaWQuaW5kZXhPZigicmVjIikpe3ZhciBuPW8uaWQucmVwbGFjZSgicmVjIiwiIik7biYmdF9vbkZ1bmNMb2FkKCJ0X2NvdmVyX19yZWNhbGNDb250ZW50SGVpZ2h0IiwoZnVuY3Rpb24oKXt0X2NvdmVyX19yZWNhbGNDb250ZW50SGVpZ2h0KG4sITEsMCl9KSl9fX1mdW5jdGlvbiB0X2Zvcm1zX19zdWJtaXRFdmVudCh0KXt2YXIgZT10O2lmKHQudGFyZ2V0JiYoZT10LnRhcmdldCksZSl7dmFyIHI9ZS5xdWVyeVNlbGVjdG9yKCdbdHlwZT0ic3VibWl0Il0nKSxvPSIiO3ImJnIudGlsZGFTZW5kaW5nU3RhdHVzJiYobz1yLnRpbGRhU2VuZGluZ1N0YXR1cyksbyYmIjMiPT09bz9yLnRpbGRhU2VuZGluZ1N0YXR1cz0iIjoociYmIXRfaGFzQ2xhc3MociwidDcwNl9fc3VibWl0X2Rpc2FibGUiKSYmci5jbGljaygpLHQucHJldmVudERlZmF1bHQ/dC5wcmV2ZW50RGVmYXVsdCgpOnQucmV0dXJuVmFsdWU9ITEpfX1mdW5jdGlvbiB0X2FzeW5jTG9hZCh0KXt2YXIgZT10LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tYXNrIikscj10LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tYXNrLWhvbGRlciIpLG89dC5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbWFzay1pbml0Iik7ZSYmIW8mJihyP3Rfb25GdW5jTG9hZCgidF9jdXN0b21NYXNrX19tYXNrIiwoZnVuY3Rpb24oKXt0X2N1c3RvbU1hc2tfX21hc2sodCxlLHtwbGFjZWhvbGRlcjpyfSl9KSk6dF9vbkZ1bmNMb2FkKCJ0X2N1c3RvbU1hc2tfX21hc2siLChmdW5jdGlvbigpe3RfY3VzdG9tTWFza19fbWFzayh0LGUpfSkpLHQuc2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1hc2staW5pdCIsIjEiKSl9ZnVuY3Rpb24gdF9mb3Jtc19fZ2V0RXJyb3JDb250YWluZXJzKHQsZSl7dmFyIHI9dC5xdWVyeVNlbGVjdG9yQWxsKCIuanMtZXJyb3Jib3gtYWxsIiksbz10LnF1ZXJ5U2VsZWN0b3JBbGwoIi5qcy1lcnJvcmJveC1hbGwgLmpzLXJ1bGUtZXJyb3ItYWxsIik7cmV0dXJuIHIubGVuZ3RofHwodC5pbnNlcnRBZGphY2VudEhUTUwoImFmdGVyYmVnaW4iLCc8ZGl2IGNsYXNzPSJqcy1lcnJvcmJveC1hbGwiPjwvZGl2PicpLHI9dC5xdWVyeVNlbGVjdG9yQWxsKCIuanMtZXJyb3Jib3gtYWxsIikpLG8ubGVuZ3RofHwoQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChyLChmdW5jdGlvbih0KXt0Lmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIiwnPHAgY2xhc3M9ImpzLXJ1bGUtZXJyb3ItYWxsIj4nK2UrIjwvcD4iKX0pKSxvPXQucXVlcnlTZWxlY3RvckFsbCgiLmpzLWVycm9yYm94LWFsbCAuanMtcnVsZS1lcnJvci1hbGwiKSkse2Vycm9yQm94ZXM6cixhbGxFcnJvcjpvfX1mdW5jdGlvbiB0X2Zvcm1zX19hZGRSZWNhcHRjaGEoKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuanMtdGlsZGEtY2FwdGNoYSIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodCwoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtY2FwdGNoYWtleSIpO2lmKGUpe3ZhciByPXQuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKCF3aW5kb3cudGlsZGFGb3JtLmlzUmVjYXB0Y2hhU2NyaXB0SW5pdCl7dmFyIG89ZG9jdW1lbnQuaGVhZCxuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO3dpbmRvdy50aWxkYUZvcm0uaXNSZWNhcHRjaGFTY3JpcHRJbml0PSEwLG4udHlwZT0idGV4dC9qYXZhc2NyaXB0IixuLnNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9yZWNhcHRjaGEvYXBpLmpzP3JlbmRlcj1leHBsaWNpdCIsbi5hc3luYz0hMCxvLmFwcGVuZENoaWxkKG4pLG8uaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLCc8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5qcy1zZW5kLWZvcm0tc3VjY2VzcyAuZ3JlY2FwdGNoYS1iYWRnZSB7ZGlzcGxheTogbm9uZTt9PC9zdHlsZT4nKX1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChyKyJyZWNhcHRjaGEiKXx8dC5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWVuZCIsJzxkaXYgaWQ9IicrcisncmVjYXB0Y2hhIiBjbGFzcz0iZy1yZWNhcHRjaGEiIGRhdGEtc2l0ZWtleT0iJytlKyciIGRhdGEtY2FsbGJhY2s9IndpbmRvdy50aWxkYUZvcm0uY2FwdGNoYUNhbGxiYWNrIiBkYXRhLXNpemU9ImludmlzaWJsZSI+PC9kaXY+Jyl9ZWxzZSB0X3JlbW92ZUNsYXNzKHQsImpzLXRpbGRhLWNhcHRjaGEiKX0pKX13aW5kb3cudF9mb3Jtc19fbGFuZz0od2luZG93Lm5hdmlnYXRvci51c2VyTGFuZ3VhZ2V8fHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2UpLnRvVXBwZXJDYXNlKCkuc2xpY2UoMCwyKSx3aW5kb3cuc2NyaXB0U3lzUGF5bWVudD17fSx3aW5kb3cuaGFuZGxlclN5c1BheW1lbnQ9e30sd2luZG93LmlzSW5pdEV2ZW50c1pCPXt9LHdpbmRvdy5pc0luaXRFdmVudHNDdXN0b21NYXNrPXt9LHdpbmRvdy5pbml0Rm9ybXM9e30sd2luZG93LnRpbGRhRm9ybT17dmVyc2lvbkxpYjoiMDIuMDAxIixlbmRwb2ludDoiZm9ybXMudGlsZGFjZG4uY29tIixpc1JlY2FwdGNoYVNjcmlwdEluaXQ6ITEsY3VycmVudEZvcm1Qcm9jY2Vzc2luZzohMX0sd2luZG93LnRfZm9ybXNfX2NsZWFyRm9ybT10X2Zvcm1zQXBpX19jbGVhckZvcm0sd2luZG93LnRfZm9ybXNfX3VwZGF0ZUFsbFZhcmlhYmxlcz10X2Zvcm1zX191cGRhdGVBbGxWYXJpYWJsZXMsd2luZG93LnRfZm9ybXNfX2ZpZWxkQXBpPXRfZm9ybXNBcGlfX2luaXRUaWxkYUZpZWxkLHRfb25SZWFkeSgoZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLGU7aWYodCl7dmFyIHI9dC5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtcHJvamVjdC1sYW5nIik7ciYmKHdpbmRvdy50X2Zvcm1zX19sYW5nPXIpO3ZhciBvPXQuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLXJvb3Qtem9uZSIpO28mJih3aW5kb3cudGlsZGFGb3JtLmVuZHBvaW50PSJmb3Jtcy50aWxkYWFwaS4iK28pfXRfZm9ybXNfX2luaXRGb3JtcygpLHRfZm9ybXNfX3Byb2Nlc3NHZXRQYXJhbWV0ZXJzKCksQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudDM5Nl9fZWxlbVtkYXRhLWVsZW0tdHlwZT0iZm9ybSJdOm5vdCguemVyby1mb3JtLXJlbmRlcmVkKScpKS5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gdC5hZGRFdmVudExpc3RlbmVyKCJyZW5kZXIiLHRfZm9ybXNfX3Byb2Nlc3NHZXRQYXJhbWV0ZXJzKX0pKTt2YXIgbj0hIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50NzA2IiksYT0hIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5qcy1wYXltZW50LXN5c3RlbWJveCIpLGk9ISFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJpbnB1dFtuYW1lPXRsZF9wcm9kdWN0XSIpO2lmKG58fGF8fGkpe3ZhciBzPSJ0aWxkYS1mb3Jtcy1wYXltZW50cy0xLjAiO2lmKCFkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtzcmMqPSInK3MrJyJdJykpe3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wudHlwZT0idGV4dC9qYXZhc2NyaXB0IixsLnNyYz0iaHR0cHM6Ly9zdGF0aWMudGlsZGFjZG4uIit0X2Zvcm1zX19nZXRSb290Wm9uZSgpKyIvanMvIitzKyIubWluLmpzIixsLm9uZXJyb3I9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gbG9hZCB0aWxkYS1mb3Jtcy1wYXltZW50czogIix0aGlzLnNyYyl9LGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCl9fXZhciBjPXdpbmRvdy50X2Zvcm1zX19sYW5nO2lmKCJSVSIhPT1jJiYiRU4iIT09Yyl7dmFyIHU9InRpbGRhLWZvcm1zLWRpY3QtMS4wIjtpZighZG9jdW1lbnQuaGVhZC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbc3JjKj0iJyt1KyciXScpKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9Imh0dHBzOi8vc3RhdGljLnRpbGRhY2RuLiIrdF9mb3Jtc19fZ2V0Um9vdFpvbmUoKSsiL2pzLyIrdSsiLm1pbi5qcyIsZC5vbmVycm9yPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiRmFpbGVkIHRvIGxvYWQgdGlsZGEtZm9ybXMtZGljdGlvbmFyeTogIix0aGlzLnNyYyl9LGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZCl9fX0pKSx3aW5kb3cudGlsZGFGb3JtLmNhcHRjaGFDYWxsYmFjaz1mdW5jdGlvbigpe3dpbmRvdy50aWxkYUZvcm0uY3VycmVudEZvcm1Qcm9jY2Vzc2luZyYmd2luZG93LnRpbGRhRm9ybS5jdXJyZW50Rm9ybVByb2NjZXNzaW5nLmZvcm0mJih3aW5kb3cudGlsZGFGb3JtLnNlbmQod2luZG93LnRpbGRhRm9ybS5jdXJyZW50Rm9ybVByb2NjZXNzaW5nLmZvcm0sd2luZG93LnRpbGRhRm9ybS5jdXJyZW50Rm9ybVByb2NjZXNzaW5nLmJ0bix3aW5kb3cudGlsZGFGb3JtLmN1cnJlbnRGb3JtUHJvY2Nlc3NpbmcuZm9ybXR5cGUsd2luZG93LnRpbGRhRm9ybS5jdXJyZW50Rm9ybVByb2NjZXNzaW5nLmZvcm1za2V5KSx3aW5kb3cudGlsZGFGb3JtLmN1cnJlbnRGb3JtUHJvY2Nlc3Npbmc9ITEpfSx3aW5kb3cudGlsZGFGb3JtX2N1c3RvbU1hc2tzTG9hZD1mdW5jdGlvbigpe2lmKCEwIT09d2luZG93LmlzSW5pdEV2ZW50c0N1c3RvbU1hc2spe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO3QudHlwZT0idGV4dC9qYXZhc2NyaXB0Iix0LnNyYz0iaHR0cHM6Ly9zdGF0aWMudGlsZGFjZG4uIit0X2Zvcm1zX19nZXRSb290Wm9uZSgpKyIvanMvdGlsZGEtZm9ybXMtY3VzdG9tbWFzay0xLjAubWluLmpzIixkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHQpLHQub25sb2FkPWZ1bmN0aW9uKCl7d2luZG93LmlzSW5pdEV2ZW50c0N1c3RvbU1hc2s9ITB9fX0sd2luZG93LnRpbGRhRm9ybV9pbml0TWFza3M9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuanMtdGlsZGEtbWFzayIpO2lmKHQubGVuZ3RoJiYhMCE9PXdpbmRvdy5pc0luaXRFdmVudHNDdXN0b21NYXNrKXJldHVybiB3aW5kb3cudGlsZGFGb3JtX2N1c3RvbU1hc2tzTG9hZCgpLHZvaWQgd2luZG93LnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7d2luZG93LnRpbGRhRm9ybV9pbml0TWFza3MoKX0pLDEwMCk7ITA9PT13aW5kb3cuaXNJbml0RXZlbnRzQ3VzdG9tTWFzayYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt0X2FzeW5jTG9hZCh0KX0pKX0sdF9vblJlYWR5KChmdW5jdGlvbigpe3dpbmRvdy50aWxkYUZvcm1faW5pdE1hc2tzKCl9KSksd2luZG93LnRpbGRhRm9ybS52YWxpZGF0ZT1mdW5jdGlvbih0KXtmb3IodmFyIGUscj10X2Zvcm1zX19nZXRFbGVtZW50KHQpLG89ci5xdWVyeVNlbGVjdG9yQWxsKCIuanMtdGlsZGEtcnVsZSIpLG49W10sYT0hMCxpPXIuZ2V0QXR0cmlidXRlKCJkYXRhLWZvcm1jYXJ0IikscyxsPXRfZm9ybXNfX2dldENvbmRpdGlvbkNoZWNrSGFuZGxlcihyKS5pc0hpZGRlbkJ5Q29uZGl0aW9uLGM9MDtjPG8ubGVuZ3RoO2MrKyl7dmFyIHU9b1tjXTtpZighbCh1KSl7dmFyIGQ9ISFwYXJzZUludCh1LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1yZXEiKXx8MCwxMCksbT11LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1ydWxlIil8fCJub25lIixfLGYscD11LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1ydWxlLW1pbmxlbmd0aCIpfHwwLHc9dS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtcnVsZS1tYXhsZW5ndGgiKXx8MCx2PXt9LGg9dS52YWx1ZSxnPSIiLHk9dS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxiPXUuZ2V0QXR0cmlidXRlKCJuYW1lIik7di5vYmo9dSx2LnR5cGU9W10saCYmaC5sZW5ndGgmJihnPWgucmVwbGFjZSgvW1xzXHUwMDAw4oCUXHUwMDFGXHUyMDAwLVx1MjAwRlx1RkVGRlx1MjAyOC1cdTIwMkZcdTIwNUYtXHUyMDZGXS9naSwiIiksaD1oLnRyaW0oKSkscCYmKHA9cGFyc2VJbnQocCwxMCkpLHcmJih3PXBhcnNlSW50KHcsMTApKTt2YXIgRT0haC5sZW5ndGgmJiFnLmxlbmd0aCxGPSJjaGVja2JveCI9PT15fHwicmFkaW8iPT09eSxBPXIucXVlcnlTZWxlY3RvckFsbCgnW25hbWU9IicrYisnIl06Y2hlY2tlZCcpLmxlbmd0aCx4PXUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWNoZWNrYm94ZXNfX2hpZGRlbmlucHV0Iik7aWYoeHx8InJhZGlvIj09PXkpe3ZhciBTPXg/ImNoZWNrYm94IjoicmFkaW8iLEM9dS5jbG9zZXN0KCIudC1pbnB1dC1ibG9jayIpLFQ9QyYmQy5xdWVyeVNlbGVjdG9yKCIudC1pbnB1dF9fb3duLWFuc3dlci1pbnB1dCwgLnQtIitTKyItb3duYW5zd2VyIik7aWYoVCYmVC5jaGVja2VkKXt2YXIgaz1DLnF1ZXJ5U2VsZWN0b3IoIi50LWlucHV0X19vd24tYW5zd2VyLCAudC1pbnB1dC1vd25hbnN3ZXIiKSxMO2smJiFrLnZhbHVlLnRyaW0oKSYmKHRfZm9ybXNfX3ZhbGlkYXRlT3duVmFyaWFudChrKSxFPSEwKX19aWYoKGgubGVuZ3RoJiYhRnx8RiYmQSkmJihhPSExKSxkJiYoRXx8RiYmIUEpKXYudHlwZS5wdXNoKCJyZXEiKTtlbHNle3N3aXRjaChtKXtjYXNlImVtYWlsIjpfPS9eKD8hXC4pKD8hLipcLlwuKVthLXpBLVrRkdCwLdGP0IHQkC3QrzAtOVx1MkU4MC1cdTJGRDVcdTMxOTAtXHUzMTlmXHUzNDAwLVx1NERCRlx1NEUwMC1cdTlGQ0NcdUY5MDAtXHVGQUFEX1wuXC1cK117MCw2M31bYS16QS1a0ZHQsC3Rj9CB0JAt0K8wLTlcdTJFODAtXHUyRkQ1XHUzMTkwLVx1MzE5Zlx1MzQwMC1cdTREQkZcdTRFMDAtXHU5RkNDXHVGOTAwLVx1RkFBRF9cLVwrXUBbYS16QS1a0ZHQsC3Rj9CB0JAt0K/QgdGRw6TDtsO8w4TDlsOcw5/DqMOpw7swLTldW2EtekEtWtGR0LAt0Y/QgdCQLdCv0IHRkcOkw7bDvMOEw5bDnMOfw6jDqcO7MC05XC5cLV17MCwyNTN9XC5bYS16QS1a0ZHQsC3Rj9CB0JAt0K9dezIsMTF9JC9naSxoLmxlbmd0aCYmIWgubWF0Y2goXykmJnYudHlwZS5wdXNoKCJlbWFpbCIpO2JyZWFrO2Nhc2UidXJsIjppZihfPS9eKChodHRwcz98ZnRwKTpcL1wvKT9bYS16QS1a0ZHQsC3Rj9CB0JAt0K/QgdGRw6TDtsO8w4TDlsOcw5/DqMOpw7vFn8OnMC05XVthLXpBLVrRkdCwLdGP0IHQkC3Qr9CB0ZHDpMO2w7zDhMOWw5zDn8Oow6nDu8Wfw6cwLTlfXC5cLV17MCwyNTN9XC5bYS16QS1a0ZHQsC3Rj9CB0JAt0K8wLTldW2EtekEtWtGR0LAt0Y/QgdCQLdCvXC0wLTldezEsMTB9XC8/JC9naSxoLmxlbmd0aClpZigoZj0oZj0oZj1oLnNwbGl0KCIvLyIpKSYmZi5sZW5ndGg+MT9mWzFdOmZbMF0pLnNwbGl0KCIvIikpJiZmLmxlbmd0aCYmZlswXSl7aWYoIShmPWZbMF0pLm1hdGNoKF8pKXt2YXIgST0vXlthLXpBLVrRkdCwLdGP0IHQkC3Qr9CB0ZHDpMO2w7zDhMOWw5zDn8Oow6nDu8Wfw6cwLTldKFthLXpBLVrRkdCwLdGP0IHQkC3Qr9CB0ZHDpMO2w7zDhMOWw5zDn8Oow6nDu8Wfw6cwLTlfXC1dfHhuLS0pKihcLlthLXpBLVrRkdCwLdGP0IHQkC3Qr9CB0ZHDpMO2w7zDhMOWw5zDn8Oow6nDu8Wfw6cwLTldW2EtekEtWtGR0LAt0Y/QgdCQLdCv0IHRkcOkw7bDvMOEw5bDnMOfw6jDqcO7xZ/DpzAtOVwtXSspKyQvaSxqOygveG4tLS8udGVzdChmKXx8L1teXHgwMC1ceDdGXS8udGVzdChmKSkmJmYubWF0Y2goSSl8fHYudHlwZS5wdXNoKCJ1cmwiKX19ZWxzZSBmJiYhZlswXXx8di50eXBlLnB1c2goInVybCIpO2JyZWFrO2Nhc2UicGhvbmUiOnZhciBEPXUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1hc2siKSxNPSJeWzAtOSgpKy0iO0QmJigtMSE9PUQuaW5kZXhPZigiKiIpP00rPSJhLXrRkdCwLdGPIjooLTEhPT1ELmluZGV4T2YoImEiKSYmKE0rPSJhLXoiKSwtMSE9PUQuaW5kZXhPZigi0LAiKSYmKE0rPSLQsC3Rj9GRIikpKSxNKz0iXSskIixfPW5ldyBSZWdFeHAoTSwiZ2kiKSwoZy5sZW5ndGgmJiFnLm1hdGNoKF8pfHwxPT0oZj1nLnJlcGxhY2UoL1teMC05XSsvZywiIikpLmluZGV4T2YoIjAwMCIpfHwxPT1mLmluZGV4T2YoIjExMSIpJiYiOSIhPWYuc3Vic3RyaW5nKDAsMSl8fDE9PWYuaW5kZXhPZigiMjIyIikmJiI1IiE9Zi5zdWJzdHJpbmcoMCwxKXx8MT09Zi5pbmRleE9mKCIzMzMiKXx8MT09Zi5pbmRleE9mKCI0NDQiKXx8MT09Zi5pbmRleE9mKCI1NTU1IikmJiIwIiE9Zi5zdWJzdHJpbmcoMCwxKXx8MT09Zi5pbmRleE9mKCI2NjYiKSYmIjAiIT1mLnN1YnN0cmluZygwLDEpfHwxPT1mLmluZGV4T2YoIjg4ODgiKSYmIjQiIT1mLnN1YnN0cmluZygwLDEpKSYmdi50eXBlLnB1c2goInBob25lIik7YnJlYWs7Y2FzZSJudW1iZXIiOl89L15bMC05XSskL2dpLGcubGVuZ3RoPjAmJiFnLm1hdGNoKF8pJiZ2LnR5cGUucHVzaCgibnVtYmVyIik7YnJlYWs7Y2FzZSJkYXRlIjp0X29uRnVuY0xvYWQoInRfZGF0ZXBpY2tlcl9fcmVhZERhdGVGcm9tSW5wdXQiLChmdW5jdGlvbigpe3ZhciB0PXRfZGF0ZXBpY2tlcl9fcmVhZERhdGVGcm9tSW5wdXQodSk7Zy5sZW5ndGg+MCYmIXdpbmRvdy50X2RhdGVwaWNrZXJfX2lzRGF0ZVZhbGlkKHQpJiZ2LnR5cGUucHVzaCgiZGF0ZSIpfSkpO2JyZWFrO2Nhc2UidGltZSI6Xz0vXlswLTldezJ9WzpcLl1bMC05XXsyfSQvZ2ksLy8hIFRPRE86IDAwOjAwIC0gMjM6NTkuINCX0LDQvNC10L3QuNGC0Ywg0L3QsApnLmxlbmd0aD4wJiYhZy5tYXRjaChfKSYmdi50eXBlLnB1c2goInRpbWUiKTticmVhaztjYXNlIm5hbWUiOl89L14oW9CB0ZHDpMO2w7zDhMOWw5zDn8Oow6nDu9KQ0pHQhNGU0IbRltCH0ZfTkNOR0JnQudCazIbQusyG04PMhtOEzIbUmsyG1JvMhtCTzIbQs8yG0pTMhtKVzIbTltOX0aLMhtGjzIbTgdOC6pqEzIbqmoXMhtKK0ovQnsyG0L7MhtOozIbTqcyG6pqMzIbqmo3MhtCO0Z7QpcyG0YXMhtCPzIbRn8yG6pqOzIbqmo/MhuqahsyG6pqHzIbSvMyG0r3MhtCozIbRiMyG6pqWzIbqmpfMhtCpzIbRicyG0KvMhtGLzIbQrcyG0Y3MhtCuzIbRjsyG0K/MhtGPzIbQkMyB0LDMgdCD0ZPQlMyB0LTMgdCVzIHQtcyB0IHMgdGR05jMgdOZzIHQl8yB0LfMgdCYzIHQuMyB0IbMgdGWzIHQh8yB0ZfMgdCM0ZzQm8yB0LvMgdCdzIHQvcyB0J7MgdC+zIHQoMyB0YDMgdChzIHRgcyB0KLMgdGCzIHQo8yB0YPMgdOwzIHTscyB0q7MgdKvzIHQpcyB0YXMgdCmzIHRhsyB0KvMgdGLzIHQrcyB0Y3MgdOszIHTrcyB0K7MgdGOzIHQrsyIzIHRjsyIzIHQr8yB0Y/MgdGizIHRo8yB0pLSk9O607vSksyM0pPMjNCIzLXRmMy10p7Sn9Kc0p3UntSf06jTqdKO0o/SsNKx077Tv9K40rnSjNKN0qLSo9Ka0pvSktKT05jTmdK60rvQhtGW0rDSsdKu0q/TqNOpyLrisaXqnLrqnLvGgsaDyYPGgMi7yLzqnpLqnpPGi8aMxJDEkcmGyYfHpMel6p6g6p6hxKbEp8aXyajGl8yByajMgcaXzIDJqMyAxpfMgsmozILGl8yMyajMjMaXzIPJqMyDxpfMhMmozITGl8yIyajMiMaXzIvJqMyLxpfMj8mozI/Gl8ynyajMp8aXzKfMgMmozKfMgMaXzKfMgsmozKfMgsaXzKfMjMmozKfMjOG1vMmIyYnJn8mfzJ/KhMqEzIrKhMylS8y1a8y16p2A6p2B6p2C6p2D6p2E6p2F6p6i6p6jxYHFgsWCzJPFgcyjxYLMo+G0jMi9xprisaDisaHqnYjqnYnGm8abzJPqnqTqnqXqnYrqnYvDmMO4x77Hv8OYzIDDuMyAw5jMgsO4w5jMjMO4zIzDmMyEw7jMhMOYzIPDuMyDw5jMqMO4zKjDmOG3jsO44beO4bST4rGj4bW96p2Q6p2R6p2W6p2X6p2Y6p2ZyYzJjeqepuqep+qeqOqeqeG6nOG6ncWmxafIvuKxpuG1uuqdpOqdpeqdpuqdp8mEyonJhMyByonMgcmEzIDKicyAyYTMgsqJzILJhMyMyonMjMmEzITKicyEyYTMg8qJzIPJhMyDzIHKicyDzIHJhMyIyonMiMqJzJ7htb5VzLh1zLjhtb/qnZ7qnZ93zLjJjsmPxrXGtkEtWmEtelx1MDBDMFx1MDBDMC1cdTAwQzNcdTAwQzgtXHUwMENBXHUwMENDXHUwMENEXHUwMEQyLVx1MDBEOVx1MDBEQVx1MDBERFx1MDBFMC1cdTAwRTNcdTAwRThcdTAwRTlcdTAwRUFcdTAwRUNcdTAwRURcdTAwRjItXHUwMEY1XHUwMEY5XHUwMEZBXHUwMEZEXHUwMTAyXHUwMTAzXHUwMTEwXHUwMTExXHUwMTI4XHUwMTI5XHUwMTY4XHUwMTY5XHUwMUEwXHUwMUExXHUwMUFGXHUwMUIwXHUxRUEwXHUxRUExLVx1MUVGOVx1MDAyN1x1MjAxOVx1MDMwMC1cdTAzRkZcdTA0MDAtXHUwNEZGXHUwNTAwLVx1MDVGRlx1MDYwMC1cdTA2RkZcdTMwNDAtXHUzMEZGXHUwMDQxLVx1MDA3QVx1MDBDMC1cdTAyQjhcdUZCMUQtXHVGQjFGXHVGQjJBLVx1RkI0RVx1MEUwMC1cdTBFN0ZcdTEwQTAtXHUxMEZGXHUzMDQwLVx1MzA5Rlx1MzBBMC1cdTMwRkZcdTJFODAtXHUyRkQ1XHUzMTkwLVx1MzE5Zlx1MzQwMC1cdTREQkZcdTRFMDAtXHU5RkNDXHVGOTAwLVx1RkFBRF17MSx9KShb0IHRkcOkw7bDvMOEw5bDnMOfw6jDqcO70pDSkdCE0ZTQhtGW0IfRl9OQ05HQmdC50JrMhtC6zIbTg8yG04TMhtSazIbUm8yG0JPMhtCzzIbSlMyG0pXMhtOW05fRosyG0aPMhtOB04LqmoTMhuqahcyG0orSi9CezIbQvsyG06jMhtOpzIbqmozMhuqajcyG0I7RntClzIbRhcyG0I/MhtGfzIbqmo7Mhuqaj8yG6pqGzIbqmofMhtK8zIbSvcyG0KjMhtGIzIbqmpbMhuqal8yG0KnMhtGJzIbQq8yG0YvMhtCtzIbRjcyG0K7MhtGOzIbQr8yG0Y/MhtCQzIHQsMyB0IPRk9CUzIHQtMyB0JXMgdC1zIHQgcyB0ZHTmMyB05nMgdCXzIHQt8yB0JjMgdC4zIHQhsyB0ZbMgdCHzIHRl8yB0IzRnNCbzIHQu8yB0J3MgdC9zIHQnsyB0L7MgdCgzIHRgMyB0KHMgdGBzIHQosyB0YLMgdCjzIHRg8yB07DMgdOxzIHSrsyB0q/MgdClzIHRhcyB0KbMgdGGzIHQq8yB0YvMgdCtzIHRjcyB06zMgdOtzIHQrsyB0Y7MgdCuzIjMgdGOzIjMgdCvzIHRj8yB0aLMgdGjzIHSktKT07rTu9KSzIzSk8yM0IjMtdGYzLXSntKf0pzSndSe1J/TqNOp0o7Sj9Kw0rHTvtO/0rjSudKM0o3SotKj0prSm9KS0pPTmNOZ0rrSu9CG0ZbSsNKx0q7Sr9Oo06nIuuKxpeqcuuqcu8aCxoPJg8aAyLvIvOqekuqek8aLxozEkMSRyYbJh8ekx6XqnqDqnqHEpsSnxpfJqMaXzIHJqMyBxpfMgMmozIDGl8yCyajMgsaXzIzJqMyMxpfMg8mozIPGl8yEyajMhMaXzIjJqMyIxpfMi8mozIvGl8yPyajMj8aXzKfJqMynxpfMp8yAyajMp8yAxpfMp8yCyajMp8yCxpfMp8yMyajMp8yM4bW8yYjJicmfyZ/Mn8qEyoTMisqEzKVLzLVrzLXqnYDqnYHqnYLqnYPqnYTqnYXqnqLqnqPFgcWCxYLMk8WBzKPFgsyj4bSMyL3GmuKxoOKxoeqdiOqdicabxpvMk+qepOqepeqdiuqdi8OYw7jHvse/w5jMgMO4zIDDmMyCw7jDmMyMw7jMjMOYzITDuMyEw5jMg8O4zIPDmMyow7jMqMOY4beOw7jht47htJPisaPhtb3qnZDqnZHqnZbqnZfqnZjqnZnJjMmN6p6m6p6n6p6o6p6p4bqc4bqdxabFp8i+4rGm4bW66p2k6p2l6p2m6p2nyYTKicmEzIHKicyByYTMgMqJzIDJhMyCyonMgsmEzIzKicyMyYTMhMqJzITJhMyDyonMg8mEzIPMgcqJzIPMgcmEzIjKicyIyonMnuG1vlXMuHXMuOG1v+qdnuqdn3fMuMmOyY/Gtca2QS1aYS16XHUwMEMwXHUwMEMwLVx1MDBDM1x1MDBDOC1cdTAwQ0FcdTAwQ0NcdTAwQ0RcdTAwRDItXHUwMEQ5XHUwMERBXHUwMEREXHUwMEUwLVx1MDBFM1x1MDBFOFx1MDBFOVx1MDBFQVx1MDBFQ1x1MDBFRFx1MDBGMi1cdTAwRjVcdTAwRjlcdTAwRkFcdTAwRkRcdTAxMDJcdTAxMDNcdTAxMTBcdTAxMTFcdTAxMjhcdTAxMjlcdTAxNjhcdTAxNjlcdTAxQTBcdTAxQTFcdTAxQUZcdTAxQjBcdTFFQTBcdTFFQTEtXHUxRUY5XHUwMDQxLVx1MDA3QVx1MDBDMC1cdTAyQjhcdTAzMDAtXHUwM0ZGXHUwNDAwLVx1MDRGRlx1MDUwMC1cdTA1RkZcdTA2MDAtXHUwNkZGXHUzMDQwLVx1MzBGRlx1RkIxRC1cdUZCMUZcdUZCMkEtXHVGQjRFXHUwRTAwLVx1MEU3Rlx1MTBBMC1cdTEwRkZcdTMwNDAtXHUzMDlGXHUzMEEwLVx1MzBGRlx1MkU4MC1cdTJGRDVcdTMxOTAtXHUzMTlmXHUzNDAwLVx1NERCRlx1NEUwMC1cdTlGQ0NcdUY5MDAtXHVGQUFEXC1cJ+KAmMq8XHNcLl17MCx9KSQvZ2ksaC5sZW5ndGgmJiFoLm1hdGNoKF8pJiZ2LnR5cGUucHVzaCgibmFtZSIpO2JyZWFrO2Nhc2UibmFtZWVuZyI6Xz0vXihbQS1aYS16XHNdezEsfSgoXC0pP1tBLVphLXpcLlxzXShcJyk/KXswLH0pKiQvaSxoLmxlbmd0aCYmIWgubWF0Y2goXykmJnYudHlwZS5wdXNoKCJuYW1lZW5nIik7YnJlYWs7Y2FzZSJuYW1lcnVzIjpfPS9eKFvQkC3Qr9CwLdGP0IHRkVxzXXsxLH0oKFwtKT9b0JAt0K/QsC3Rj9CB0ZFcLlxzXShcJyk/KXswLH0pKiQvaSxoLmxlbmd0aCYmIWgubWF0Y2goXykmJnYudHlwZS5wdXNoKCJuYW1lcnVzIik7YnJlYWs7Y2FzZSJzdHJpbmciOl89L15bQS1aYS160JAt0K/QsC3RjzAtOdCB0ZHQgdGRw6TDtsO8w4TDlsOcw5/DqMOpw7vTkNOR0JnQudCazIbQusyG04PMhtOEzIbUmsyG1JvMhtCTzIbQs8yG0pTMhtKVzIbTltOX0aLMhtGjzIbTgdOC6pqEzIbqmoXMhtKK0ovQnsyG0L7MhtOozIbTqcyG6pqMzIbqmo3MhtCO0Z7QpcyG0YXMhtCPzIbRn8yG6pqOzIbqmo/MhuqahsyG6pqHzIbSvMyG0r3MhtCozIbRiMyG6pqWzIbqmpfMhtCpzIbRicyG0KvMhtGLzIbQrcyG0Y3MhtCuzIbRjsyG0K/MhtGPzIbQkMyB0LDMgdCD0ZPQlMyB0LTMgdCVzIHQtcyB0IHMgdGR05jMgdOZzIHQl8yB0LfMgdCYzIHQuMyB0IbMgdGWzIHQh8yB0ZfMgdCM0ZzQm8yB0LvMgdCdzIHQvcyB0J7MgdC+zIHQoMyB0YDMgdChzIHRgcyB0KLMgdGCzIHQo8yB0YPMgdOwzIHTscyB0q7MgdKvzIHQpcyB0YXMgdCmzIHRhsyB0KvMgdGLzIHQrcyB0Y3MgdOszIHTrcyB0K7MgdGOzIHQrsyIzIHRjsyIzIHQr8yB0Y/MgdGizIHRo8yB0pLSk9O607vSksyM0pPMjNCIzLXRmMy10p7Sn9Kc0p3UntSf06jTqdKO0o/SsNKx077Tv9K40rnSjNKN0qLSo9Ka0pvSktKT05jTmdK60rvQhtGW0rDSsdKu0q/TqNOpyLrisaXqnLrqnLvGgsaDyYPGgMi7yLzqnpLqnpPGi8aMxJDEkcmGyYfHpMel6p6g6p6hxKbEp8aXyajGl8yByajMgcaXzIDJqMyAxpfMgsmozILGl8yMyajMjMaXzIPJqMyDxpfMhMmozITGl8yIyajMiMaXzIvJqMyLxpfMj8mozI/Gl8ynyajMp8aXzKfMgMmozKfMgMaXzKfMgsmozKfMgsaXzKfMjMmozKfMjOG1vMmIyYnJn8mfzJ/KhMqEzIrKhMylS8y1a8y16p2A6p2B6p2C6p2D6p2E6p2F6p6i6p6jxYHFgsWCzJPFgcyjxYLMo+G0jMi9xprisaDisaHqnYjqnYnGm8abzJPqnqTqnqXqnYrqnYvDmMO4x77Hv8OYzIDDuMyAw5jMgsO4w5jMjMO4zIzDmMyEw7jMhMOYzIPDuMyDw5jMqMO4zKjDmOG3jsO44beO4bST4rGj4bW96p2Q6p2R6p2W6p2X6p2Y6p2ZyYzJjeqepuqep+qeqOqeqeG6nOG6ncWmxafIvuKxpuG1uuqdpOqdpeqdpuqdp8mEyonJhMyByonMgcmEzIDKicyAyYTMgsqJzILJhMyMyonMjMmEzITKicyEyYTMg8qJzIPJhMyDzIHKicyDzIHJhMyIyonMiMqJzJ7htb5VzLh1zLjhtb/qnZ7qnZ93zLjJjsmPxrXGtlx1MDA0MS1cdTAwN0FcdTAwQzAtXHUwMkI4XHUwMzAwLVx1MDNGRlx1MDQwMC1cdTA0RkZcdTA1MDAtXHUwNUZGXHUwNjAwLVx1MDZGRlx1MzA0MC1cdTMwRkZcdUZCMUQtXHVGQjFGXHVGQjJBLVx1RkI0RVx1MEUwMC1cdTBFN0ZcdTEwQTAtXHUxMEZGXHUzMDQwLVx1MzA5Rlx1MzBBMC1cdTMwRkZcdTJFODAtXHUyRkQ1XHUzMTkwLVx1MzE5Zlx1MzQwMC1cdTREQkZcdTRFMDAtXHU5RkNDXHVGOTAwLVx1RkFBRCxcLjo7XCJcJ1xgXC1cX1wrXD9cIVwlXCRcQFwqXCZcXlxzK10rJC9pLGgubGVuZ3RoJiYhaC5tYXRjaChfKSYmdi50eXBlLnB1c2goInN0cmluZyIpO2JyZWFrO2Nhc2UiY2hvc2V2YWx1ZSI6dmFyIHEsUCxSLEIsTztpZigiU0VMRUNUIj09PShudWxsPT0oZT11KT92b2lkIDA6ZS50YWdOYW1lLnRvVXBwZXJDYXNlKCkpKShudWxsPT0oUD11KT92b2lkIDA6UC52YWx1ZS5sZW5ndGgpPjB8fHYudHlwZS5wdXNoKCJjaG9zZXZhbHVlIik7ZWxzZSJ0cnVlIj09PShudWxsPT0oQj11KT92b2lkIDA6Qi5nZXRBdHRyaWJ1dGUoImRhdGEtb3B0aW9uLXNlbGVjdGVkIikpfHx2LnR5cGUucHVzaCgiY2hvc2V2YWx1ZSIpO2JyZWFrO2Nhc2UicHJvbW9jb2RlIjoieSIhPT1pfHwhZy5sZW5ndGh8fCF3aW5kb3cudGNhcnR8fHdpbmRvdy50Y2FydC5wcm9tb2NvZGUmJndpbmRvdy50Y2FydC5wcm9kYW1vdW50X2Rpc2NvdW50c3VtfHx2LnR5cGUucHVzaCgicHJvbW9jb2RlIik7YnJlYWs7Y2FzZSJkZWxpdmVyeXJlcSI6di50eXBlLnB1c2goImRlbGl2ZXJ5cmVxIik7YnJlYWs7Y2FzZSJ1bmF1dGhvcml6ZWRfb3JkZXIiOnYudHlwZS5wdXNoKCJ1bmF1dGhvcml6ZWRfb3JkZXIiKX1wPjAmJmgubGVuZ3RoJiZoLmxlbmd0aDxwJiZ2LnR5cGUucHVzaCgibWlubGVuZ3RoIiksdz4wJiZoLmxlbmd0aCYmaC5sZW5ndGg+dyYmdi50eXBlLnB1c2goIm1heGxlbmd0aCIpfXYudHlwZSYmdi50eXBlLmxlbmd0aCYmKG5bbi5sZW5ndGhdPXYpfX1pZigieSI9PT1pKXt2YXIgSD13aW5kb3cudGNhcnRfbWlub3JkZXI+MCxWPXdpbmRvdy50Y2FydF9taW5jbnRvcmRlcj4wLE47aWYoSClpZigoTj13aW5kb3cudGNhcnQucHJvZGFtb3VudF93aXRoZGlzY291bnQ+MD93aW5kb3cudGNhcnQucHJvZGFtb3VudF93aXRoZGlzY291bnQ6dm9pZCAwIT09d2luZG93LnRjYXJ0LnByb2RhbW91bnRfd2l0aGR5bmRpc2NvdW50JiZ3aW5kb3cudF9jYXJ0X19kaXNjb3VudHMmJndpbmRvdy50X2NhcnRfX2Rpc2NvdW50cy5sZW5ndGg+MD93aW5kb3cudGNhcnQucHJvZGFtb3VudF93aXRoZHluZGlzY291bnQ6dm9pZCAwIT09d2luZG93LnRjYXJ0LnByb2RhbW91bnRfd2l0aGRpc2NvdW50JiZ3aW5kb3cudGNhcnQucHJvbW9jb2RlJiYiT0siPT09d2luZG93LnRjYXJ0LnByb21vY29kZS5tZXNzYWdlP3dpbmRvdy50Y2FydC5wcm9kYW1vdW50X3dpdGhkaXNjb3VudDp3aW5kb3cudGNhcnQucHJvZGFtb3VudCk8d2luZG93LnRjYXJ0X21pbm9yZGVyKXt2YXIgVT17b2JqOnt9LHR5cGU6W119O1UudHlwZS5wdXNoKCJtaW5vcmRlciIpLG4ucHVzaChVKX1pZihWJiZ3aW5kb3cudGNhcnQudG90YWw8d2luZG93LnRjYXJ0X21pbmNudG9yZGVyKXt2YXIgej17b2JqOnt9LHR5cGU6W119O3oudHlwZS5wdXNoKCJtaW5xdWFudGl0eSIpLG4ucHVzaCh6KX19cmV0dXJuIGEmJiFuLmxlbmd0aCYmby5sZW5ndGgmJihuPVt7b2JqOiJub25lIix0eXBlOlsiZW1wdHlmaWxsIl19XSksbn0sd2luZG93LnRpbGRhRm9ybS5oaWRlRXJyb3JzPWZ1bmN0aW9uKHQpe2lmKCJvYmplY3QiIT10eXBlb2YgdHx8dC5sZW5ndGgpe3ZhciBlPXRfZm9ybXNfX2dldEVsZW1lbnQodCkscj1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi5qcy1lcnJvcmJveC1hbGwiKSxvPWUucXVlcnlTZWxlY3RvckFsbCgiLmpzLXJ1bGUtZXJyb3IiKSxuPWUucXVlcnlTZWxlY3RvckFsbCgiLmpzLWVycm9yLXJ1bGUtYWxsIiksYT1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi5qcy1zdWNjZXNzYm94IiksaT1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi5qcy1lcnJvci1jb250cm9sLWJveCIpLHM9ZS5xdWVyeVNlbGVjdG9yQWxsKCIuanMtZXJyb3ItY29udHJvbC1ib3ggLnQtaW5wdXQtZXJyb3IiKSxsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0aWxkYS1wb3B1cC1mb3ItZXJyb3IiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHIsKGZ1bmN0aW9uKHQpe3Quc3R5bGUuZGlzcGxheT0ibm9uZSJ9KSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChvLChmdW5jdGlvbih0KXt0LnN0eWxlLmRpc3BsYXk9Im5vbmUifSkpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24odCl7dC5pbm5lckhUTUw9IiJ9KSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLChmdW5jdGlvbih0KXt0LnN0eWxlLmRpc3BsYXk9Im5vbmUifSkpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwocywoZnVuY3Rpb24odCl7dC5pbm5lckhUTUw9IiJ9KSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChpLChmdW5jdGlvbih0KXt0X3JlbW92ZUNsYXNzKHQsImpzLWVycm9yLWNvbnRyb2wtYm94Iil9KSksdF9yZW1vdmVDbGFzcyhlLCJqcy1zZW5kLWZvcm0tZXJyb3IiKSx0X3JlbW92ZUNsYXNzKGUsImpzLXNlbmQtZm9ybS1zdWNjZXNzIiksbCYmdF9mYWRlT3V0KGwpfX0sd2luZG93LnRpbGRhRm9ybS5zaG93RXJyb3JJblBvcHVwPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dF9mb3Jtc19fZ2V0RWxlbWVudCh0KTtpZighZXx8IWUubGVuZ3RoKXJldHVybiExO3ZhciBvPXIuZ2V0QXR0cmlidXRlKCJpZCIpLG49ci5nZXRBdHRyaWJ1dGUoImRhdGEtaW5wdXRib3giKTtufHwobj0iLmJsb2NraW5wdXQiKTt2YXIgYT0iIixpPSExLHM9ITAsbCxjPSIiLHU9IiIsZD0iIixtPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0aWxkYS1wb3B1cC1mb3ItZXJyb3IiKSxfO218fChkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIiwnPGRpdiBpZD0idGlsZGEtcG9wdXAtZm9yLWVycm9yIiBjbGFzcz0ianMtZm9ybS1wb3B1cC1lcnJvcmJveCB0bi1mb3JtX19lcnJvcmJveC1wb3B1cCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4gPGRpdiBjbGFzcz0idC1mb3JtX19lcnJvcmJveC10ZXh0IHQtdGV4dCB0LXRleHRfeHMiPiBlcnJvciA8L2Rpdj4gPGRpdiBjbGFzcz0idG4tZm9ybV9fZXJyb3Jib3gtY2xvc2UganMtZXJyb3Jib3gtY2xvc2UiPiA8ZGl2IGNsYXNzPSJ0bi1mb3JtX19lcnJvcmJveC1jbG9zZS1saW5lIHRuLWZvcm1fX2Vycm9yYm94LWNsb3NlLWxpbmUtbGVmdCI+PC9kaXY+IDxkaXYgY2xhc3M9InRuLWZvcm1fX2Vycm9yYm94LWNsb3NlLWxpbmUgdG4tZm9ybV9fZXJyb3Jib3gtY2xvc2UtbGluZS1yaWdodCI+PC9kaXY+IDwvZGl2PiA8L2Rpdj4nKSx0X2FkZEV2ZW50TGlzdGVuZXIobT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGlsZGEtcG9wdXAtZm9yLWVycm9yIiksImNsaWNrIiwoZnVuY3Rpb24odCl7dmFyIGU9dHx8d2luZG93LmV2ZW50LHIsbzsoZS50YXJnZXR8fGUuc3JjRWxlbWVudCkuY2xvc2VzdCgiLmpzLWVycm9yYm94LWNsb3NlIikmJihlLnByZXZlbnREZWZhdWx0P2UucHJldmVudERlZmF1bHQoKTplLnJldHVyblZhbHVlPSExLHRfZmFkZU91dChtKSl9KSkpO2Zvcih2YXIgZj0wO2Y8ZS5sZW5ndGg7ZisrKWlmKGVbZl0mJmVbZl0ub2JqKXtpZigwPT09ZiYmIm5vbmUiPT09ZVtmXS5vYmope2Q9JzxwIGNsYXNzPSJ0LWZvcm1fX2Vycm9yYm94LWl0ZW0iPicrdF9mb3Jtc19fZ2V0TXNnKCJlbXB0eWZpbGwiKSsiPC9wPiI7YnJlYWt9dmFyIHA9dF9mb3Jtc19fZ2V0RWxlbWVudChlW2ZdLm9iaik7cCYmKGE9cC5jbG9zZXN0KG4pKSxhJiYoYz1hLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWlucHV0LWVycm9yIiksdF9hZGRDbGFzcyhhLCJqcy1lcnJvci1jb250cm9sLWJveCIpLGMubGVuZ3RoJiYoaT0hMCkpO2Zvcih2YXIgdz0wO3c8ZVtmXS50eXBlLmxlbmd0aDt3Kyspe3ZhciB2PWVbZl0udHlwZVt3XSxoPXRfZm9ybXNfX2dldE1zZyh2KTt1PSIiLChsPXIucXVlcnlTZWxlY3RvcigiLmpzLXJ1bGUtZXJyb3ItIit2KSk/bC50ZXh0Q29udGVudCYmbC5pbm5lclRleHR8fCFofHwtMSE9PWQuaW5kZXhPZihoKT8odT1sLnRleHRDb250ZW50fHxsLmlubmVyVGV4dCwtMT09PWQuaW5kZXhPZih1KSYmKGQ9ZCsnPHAgY2xhc3M9InQtZm9ybV9fZXJyb3Jib3gtaXRlbSI+Jyt1KyI8L3A+IikpOmQ9ZCsnPHAgY2xhc3M9InQtZm9ybV9fZXJyb3Jib3gtaXRlbSI+JytoKyI8L3A+IjpoJiYtMT09PWQuaW5kZXhPZihoKSYmKGQ9ZCsnPHAgY2xhc3M9InQtZm9ybV9fZXJyb3Jib3gtaXRlbSI+JytoKyI8L3A+IiksaSYmKCF1JiZ0X2Zvcm1zX19nZXRNc2codisiZmllbGQiKSYmKHU9dF9mb3Jtc19fZ2V0TXNnKHYrImZpZWxkIikpLCF1JiZoJiYodT1oKSx1JiZhJiYoYz1hLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWlucHV0LWVycm9yIiksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChjLChmdW5jdGlvbih0KXt0LmlubmVySFRNTD11LHRfZmFkZUluKHQpfSkpKSl9fWlmKGQpe20ucXVlcnlTZWxlY3RvcigiLnQtZm9ybV9fZXJyb3Jib3gtdGV4dCIpLmlubmVySFRNTD1kO3ZhciBnPW0ucXVlcnlTZWxlY3RvckFsbCgiLnQtZm9ybV9fZXJyb3Jib3gtaXRlbSIpO2lmKEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZywoZnVuY3Rpb24odCl7dC5zdHlsZS5kaXNwbGF5PSJibG9jayJ9KSksZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnQxMDkzIFtkYXRhLWVsZW0tdHlwZT0iZm9ybSJdJykpe3ZhciB5PXdpbmRvdy50UG9wdXBPYmomJndpbmRvdy50UG9wdXBPYmoub3BlblBvcFVwTGlzdDtpZih5JiZ5Lmxlbmd0aCl7dmFyIGIsRT0nLnQxMDkzIC50LXBvcHVwW2RhdGEtdG9vbHRpcC1ob29rPSInK3lbeS5sZW5ndGgtMV0rJyJdJyxGPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoRSksQT1GP2dldENvbXB1dGVkU3R5bGUoRikuekluZGV4OjAseDtBPjFlNCYmKG0uc3R5bGUuekluZGV4PUErMSl9ZWxzZSBtLnN0eWxlLnpJbmRleD0iIn10X2ZhZGVJbihtKX1mdW5jdGlvbiBTKHQpe3ZhciBlPXR8fHdpbmRvdy5ldmVudCxyO2lmKCJJTlBVVCI9PT0oZS50YXJnZXR8fGUuc3JjRWxlbWVudCkudGFnTmFtZSYmXyl7dmFyIG49Xy5xdWVyeVNlbGVjdG9yQWxsKCJmb3JtIC50LWlucHV0LWVycm9yIik7dF9mYWRlT3V0KG0pLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24odCl7dC5pbm5lckhUTUw9IiIsdF9mYWRlT3V0KHQpfSkpLHdpbmRvdy50X2Zvcm1zX19lcnJvclRpbWVySUQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHdpbmRvdy50X2Zvcm1zX19lcnJvclRpbWVySUQpLHdpbmRvdy50X2Zvcm1zX19lcnJvclRpbWVySUQ9MCksd2luZG93LmlzSW5pdEV2ZW50c1pCW29dPSEwfX1pZih3aW5kb3cudF9mb3Jtc19fZXJyb3JUaW1lcklEJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHdpbmRvdy50X2Zvcm1zX19lcnJvclRpbWVySUQpLHdpbmRvdy50X2Zvcm1zX19lcnJvclRpbWVySUQ9d2luZG93LnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dF9mYWRlT3V0KG0pLGM9ci5xdWVyeVNlbGVjdG9yQWxsKCIudC1pbnB1dC1lcnJvciIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYywoZnVuY3Rpb24odCl7dC5pbm5lckhUTUw9IiIsdF9mYWRlT3V0KHQpfSkpLHdpbmRvdy50X2Zvcm1zX19lcnJvclRpbWVySUQ9MH0pLDFlNCksIXdpbmRvdy5pc0luaXRFdmVudHNaQltvXSl7Xz1yLmNsb3Nlc3QoIi5yIik7dmFyIEM9ImZvY3VzIjtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyfHwoQz0iZm9jdXNpbiIpLHRfcmVtb3ZlRXZlbnRMaXN0ZW5lcihfLEMsUyksdF9hZGRFdmVudExpc3RlbmVyKF8sQyxTLCEwKSx0X3JlbW92ZUV2ZW50TGlzdGVuZXIoXywiY2hhbmdlIixTKSx0X2FkZEV2ZW50TGlzdGVuZXIoXywiY2hhbmdlIixTLCEwKX1yZXR1cm4gdF90cmlnZ2VyRXZlbnQociwidGlsZGFmb3JtOmFmdGVyZXJyb3IiKSwhMH0sd2luZG93LnRpbGRhRm9ybS5zaG93RXJyb3JzPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbz10X2Zvcm1zX19nZXRFbGVtZW50KHQpO2lmKCFlfHwhZS5sZW5ndGgpcmV0dXJuITE7aWYoInkiPT09by5nZXRBdHRyaWJ1dGUoImRhdGEtZXJyb3ItcG9wdXAiKSlyZXR1cm4gd2luZG93LnRpbGRhRm9ybS5zaG93RXJyb3JJblBvcHVwKG8sZSk7Zm9yKHZhciBuLGE9KHJ8fHt9KS5pbnB1dEJveFNlbGVjdG9yLGkscz12b2lkIDA9PT1hP28uZ2V0QXR0cmlidXRlKCJkYXRhLWlucHV0Ym94Iil8fCIuYmxvY2tpbnB1dCI6YSxsPXRfZm9ybXNfX2NyZWF0ZUVycm9yRm9jdXNIYXNoKCksYz0wO2M8ZS5sZW5ndGg7YysrKXt2YXIgdT0wPT09YyxkPWVbY107aWYoZCYmZC5vYmope3ZhciBtPWQub2JqO2lmKCJub25lIj09PW0mJnUpe3RfZm9ybXNfX3Nob3dFbXB0eUZvcm1FcnJvcihvKTticmVha312YXIgXz10X2Zvcm1zX19nZXRFbGVtZW50KG0pLGY7aWYoXyYmXyBpbnN0YW5jZW9mIEVsZW1lbnQpdF9mb3Jtc19fc2hvd0lucHV0RXJyb3JzKG8sXy5jbG9zZXN0KHMpLGQpO3RfZm9ybXNfX3Nob3dGb3JtRXJyb3JzKG8sZCxsKX19cmV0dXJuIHRfZm9ybXNfX3Njcm9sbFRvSW5wdXRXaXRoRXJyb3IoZVswXSksdF9mb3Jtc19fc2hvd0Zvcm1FcnJvcnNDb250YWluZXJzKG8pLHRfdHJpZ2dlckV2ZW50KG8sInRpbGRhZm9ybTphZnRlcmVycm9yIiksITB9LHdpbmRvdy50aWxkYUZvcm0uYWRkVGlsZGFDYXB0Y2hhPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dF9mb3Jtc19fZ2V0RWxlbWVudCh0KSxvPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0aWxkYWZvcm1jYXB0Y2hhYm94Iiksbj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgianMtdGlsZGFzcGVjLWNhcHRjaGEiKSxhO28mJnRfcmVtb3ZlRWwobyksbiYmdF9yZW1vdmVFbChuKSxyLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIiwnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idGlsZGFzcGVjLXRpbGRhY2FwdGNoYSIgaWQ9ImpzLXRpbGRhc3BlYy1jYXB0Y2hhIj4nKTt0cnl7YT0obmV3IERhdGUpLmdldFRpbWUoKSsiPSIrcGFyc2VJbnQoOCpNYXRoLnJhbmRvbSgpLDEwKX1jYXRjaChzKXthPSJybmQ9IitwYXJzZUludCg4Kk1hdGgucmFuZG9tKCksMTApfXZhciBpPSc8ZGl2IGlkPSJ0aWxkYWZvcm1jYXB0Y2hhYm94IiB0YWJpbmRleD0iLTEiIHN0eWxlPSJ6LWluZGV4OiA5OTk5OTk5OTk5OTsgcG9zaXRpb246Zml4ZWQ7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgdG9wOiAwcHg7IGxlZnQ6MHB4OyBib3R0b206IDBweDsgcmlnaHQ6IDBweDsgYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwwLjk3KTsiPjxpZnJhbWUgaWQ9ImNhcHRjaGFJZnJhbWVCb3giIHNyYz0iLy8nK3dpbmRvdy50aWxkYUZvcm0uZW5kcG9pbnQrIi9wcm9jY2VzL2NhcHRjaGEvP3RpbGRhc3BlYy1mb3JtaWQ9IityLmdldEF0dHJpYnV0ZSgiaWQiKSsiJnRpbGRhc3BlYy1mb3Jtc2tleT0iK2UrIiYiK2ErJyIgZnJhbWVib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiPjwvaWZyYW1lPjwvZGl2Pic7ZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWVuZCIsaSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGNoZWNrVmVyaWZ5VGlsZGFDYXB0Y2hhKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsY2hlY2tWZXJpZnlUaWxkYUNhcHRjaGEpLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0aWxkYWZvcm1jYXB0Y2hhYm94IikuZm9jdXMoKX0sd2luZG93LnRpbGRhRm9ybS5hZGRNZW1iZXJzSW5mb1RvRm9ybT1mdW5jdGlvbih0KXt2YXIgZT10X2Zvcm1zX19nZXRFbGVtZW50KHQpO2lmKGUpdHJ5e3ZhciByPWUucXVlcnlTZWxlY3RvcigiLmpzLXRpbGRhLW1hdXNlcmluZm8iKTtpZihyJiZ0X3JlbW92ZUVsKHIpLCF3aW5kb3cubWF1c2VyKXJldHVybjt3aW5kb3cudGlsZGFGb3JtLnRpbGRhbWVtYmVyPXt9LHdpbmRvdy5tYXVzZXIubmFtZSYmKHdpbmRvdy50aWxkYUZvcm0udGlsZGFtZW1iZXIubmFtZT13aW5kb3cubWF1c2VyLm5hbWUpLHdpbmRvdy5tYXVzZXIuY29kZSYmd2luZG93Lm1hdXNlci5lbWFpbCYmKHdpbmRvdy50aWxkYUZvcm0udGlsZGFtZW1iZXIuZW1haWw9d2luZG93Lm1hdXNlci5lbWFpbCx3aW5kb3cudGlsZGFGb3JtLnRpbGRhbWVtYmVyLmNvZGU9d2luZG93Lm1hdXNlci5jb2RlKSx3aW5kb3cubWF1c2VyLnBob25lY29kZSYmd2luZG93Lm1hdXNlci5waG9uZSYmKHdpbmRvdy50aWxkYUZvcm0udGlsZGFtZW1iZXIucGhvbmU9d2luZG93Lm1hdXNlci5waG9uZSx3aW5kb3cudGlsZGFGb3JtLnRpbGRhbWVtYmVyLnBob25lY29kZT13aW5kb3cubWF1c2VyLnBob25lY29kZSksd2luZG93Lm1hdXNlci50b2tlbiYmKHdpbmRvdy50aWxkYUZvcm0udGlsZGFtZW1iZXIudG9rZW49d2luZG93Lm1hdXNlci50b2tlbil9Y2F0Y2gobyl7Y29uc29sZS5lcnJvcigiYWRkTWVtYmVyc0luZm9Ub0Zvcm0gZXhjZXB0aW9uOiAiLG8pfX0sd2luZG93LnRpbGRhRm9ybS5jbG9zZVN1Y2Nlc3NQb3B1cD1mdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0aWxkYWZvcm1zdWNjZXNzcG9wdXAtbmV3IiksZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGlsZGFmb3Jtc3VjY2Vzc3BvcHVwIikscixvPWUmJiJibG9jayI9PT1nZXRDb21wdXRlZFN0eWxlKGUpLmRpc3BsYXk/ZTp0O2lmKG8pe3RfcmVtb3ZlQ2xhc3MoZG9jdW1lbnQuYm9keSwidC1ib2R5X3N1Y2Nlc3MtcG9wdXAtc2hvd2VkIiksdF9mb3Jtc19faXNJT1MoKSYmd2luZG93LnRpbGRhRm9ybS51bmxvY2tCb2R5U2Nyb2xsKCksdF9mYWRlT3V0KG8pLG8uY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWZvcm0tc3VjY2Vzcy1wb3B1cF9uZXciKSYmby5jbGFzc0xpc3QucmVtb3ZlKCJ0LXBvcHVwX3Nob3ciKTt2YXIgbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJzdHlsZS50LXN1Y2Nlc3MtcG9wdXAiKTtuJiZuLnJlbW92ZSgpfX0sd2luZG93LnRpbGRhRm9ybS5sb2NrQm9keVNjcm9sbD1mdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LmJvZHk7aWYoIXRfaGFzQ2xhc3ModCwidC1ib2R5X3Njcm9sbC1sb2NrZWQiKSl7dmFyIGU9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcDt0X2FkZENsYXNzKHQsInQtYm9keV9zY3JvbGwtbG9ja2VkIiksdC5zdHlsZS50b3A9Ii0iK2UrInB4Iix0LnNldEF0dHJpYnV0ZSgiZGF0YS1wb3B1cC1zY3JvbGx0b3AiLGUpfX0sd2luZG93LnRpbGRhRm9ybS51bmxvY2tCb2R5U2Nyb2xsPWZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuYm9keTtpZih0X2hhc0NsYXNzKHQsInQtYm9keV9zY3JvbGwtbG9ja2VkIikpe3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJkYXRhLXBvcHVwLXNjcm9sbHRvcCIpO3RfcmVtb3ZlQ2xhc3ModCwidC1ib2R5X3Njcm9sbC1sb2NrZWQiKSx0LnN0eWxlLnRvcD1udWxsLHQucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXBvcHVwLXNjcm9sbHRvcCIpLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A9cGFyc2VJbnQoZSl9fSx3aW5kb3cudGlsZGFGb3JtLnNob3dTdWNjZXNzUG9wdXA9ZnVuY3Rpb24odCl7dmFyIGU9IiIscj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGlsZGFmb3Jtc3VjY2Vzc3BvcHVwIiksbz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGlsZGFmb3Jtc3VjY2Vzc3BvcHVwdGV4dCIpLG49ZG9jdW1lbnQuYm9keTtpZighcil7ZSs9JzxzdHlsZSBtZWRpYT0ic2NyZWVuIj4gLnQtZm9ybS1zdWNjZXNzLXBvcHVwIHsgZGlzcGxheTogbm9uZTsgcG9zaXRpb246IGZpeGVkOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsMCwwLC44KTsgdG9wOiAwcHg7IGxlZnQ6IDBweDsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgei1pbmRleDogMTAwMDA7IG92ZXJmbG93LXk6IGF1dG87IGN1cnNvcjogcG9pbnRlcjsgfSAudC1ib2R5X3N1Y2Nlc3MtcG9wdXAtc2hvd2VkIHsgaGVpZ2h0OiAxMDB2aDsgbWluLWhlaWdodDogMTAwdmg7IG92ZXJmbG93OiBoaWRkZW47IH0gLnQtZm9ybS1zdWNjZXNzLXBvcHVwX193aW5kb3cgeyB3aWR0aDogMTAwJTsgbWF4LXdpZHRoOiA0MDBweDsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDUwJTsgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTsgbGVmdDogMHB4OyByaWdodDogMHB4OyBtYXJnaW46IDAgYXV0bzsgcGFkZGluZzogMjBweDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgfSAudC1mb3JtLXN1Y2Nlc3MtcG9wdXBfX3dyYXBwZXIgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOyBwYWRkaW5nOiA0MHB4IDQwcHggNTBweDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgYm9yZGVyLXJhZGl1czogNXB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBvc2l0aW9uOiByZWxhdGl2ZTsgY3Vyc29yOiBkZWZhdWx0OyB9IC50LWZvcm0tc3VjY2Vzcy1wb3B1cF9fdGV4dCB7IHBhZGRpbmctdG9wOiAyMHB4OyB3b3JkLWJyZWFrOiBicmVhay13b3JkOyB9IC50LWZvcm0tc3VjY2Vzcy1wb3B1cF9fY2xvc2UtaWNvbiB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAxNHB4OyByaWdodDogMTRweDsgY3Vyc29yOiBwb2ludGVyOyB9IEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4MHB4KSB7IC50LWZvcm0tc3VjY2Vzcy1wb3B1cF9fdGV4dCB7IHBhZGRpbmctdG9wOiAxMHB4OyB9IC50LWZvcm0tc3VjY2Vzcy1wb3B1cF9fd3JhcHBlciB7IHBhZGRpbmctbGVmdDogMjBweDsgcGFkZGluZy1yaWdodDogMjBweDsgfSB9IDwvc3R5bGU+JyxlKz0nPGRpdiBjbGFzcz0idC1mb3JtLXN1Y2Nlc3MtcG9wdXAiIHN0eWxlPSJkaXNwbGF5Om5vbmU7IiBpZD0idGlsZGFmb3Jtc3VjY2Vzc3BvcHVwIj4gPGRpdiBjbGFzcz0idC1mb3JtLXN1Y2Nlc3MtcG9wdXBfX3dpbmRvdyI+IDxkaXYgY2xhc3M9InQtZm9ybS1zdWNjZXNzLXBvcHVwX193cmFwcGVyIj4gPHN2ZyBjbGFzcz0idC1mb3JtLXN1Y2Nlc3MtcG9wdXBfX2Nsb3NlLWljb24iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjE0IiBoZWlnaHQ9IjE0IiBjbGFzcz0idDY1N19faWNvbi1jbG9zZSIgdmlld0JveD0iMCAwIDIzIDIzIj4gPGcgZmlsbC1ydWxlPSJldmVub2RkIj4gPHBhdGggZD0iTTAgMS40MUwxLjQgMGwyMS4yMiAyMS4yMS0xLjQxIDEuNDJ6Ii8+IDxwYXRoIGQ9Ik0yMS4yMSAwbDEuNDIgMS40TDEuNCAyMi42MyAwIDIxLjIxeiIvPiA8L2c+IDwvc3ZnPiA8c3ZnIHdpZHRoPSI1MCIgaGVpZ2h0PSI1MCIgZmlsbD0iIzYyQzU4NCI+IDxwYXRoIGQ9Ik0yNS4xIDQ5LjI4QTI0LjY0IDI0LjY0IDAgMCAxIC41IDI0LjY4IDI0LjY0IDI0LjY0IDAgMCAxIDI1LjEuMDdhMjQuNjQgMjQuNjQgMCAwIDEgMjQuNiAyNC42IDI0LjY0IDI0LjY0IDAgMCAxLTI0LjYgMjQuNjF6bTAtNDcuNDVBMjIuODcgMjIuODcgMCAwIDAgMi4yNiAyNC42OCAyMi44NyAyMi44NyAwIDAgMCAyNS4xIDQ3LjUyYTIyLjg3IDIyLjg3IDAgMCAwIDIyLjg0LTIyLjg0QTIyLjg3IDIyLjg3IDAgMCAwIDI1LjEgMS44M3oiLz4gPHBhdGggZD0iTTIyLjg0IDMwLjUzbC00LjQ0LTQuNDVhLjg4Ljg4IDAgMSAxIDEuMjQtMS4yNGwzLjIgMy4yIDguODktOC45YS44OC44OCAwIDEgMSAxLjI1IDEuMjZMMjIuODQgMzAuNTN6Ii8+IDwvc3ZnPiA8ZGl2IGNsYXNzPSJ0LWZvcm0tc3VjY2Vzcy1wb3B1cF9fdGV4dCB0LWRlc2NyIHQtZGVzY3Jfc20iIGlkPSJ0aWxkYWZvcm1zdWNjZXNzcG9wdXB0ZXh0Ij4gVGhhbmsgWW91ISA8L2Rpdj4gPC9kaXY+IDwvZGl2PiA8L2Rpdj4nLG4uaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLGUpLHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRpbGRhZm9ybXN1Y2Nlc3Nwb3B1cCIpLG89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRpbGRhZm9ybXN1Y2Nlc3Nwb3B1cHRleHQiKTt2YXIgYT1yLnF1ZXJ5U2VsZWN0b3IoIi50LWZvcm0tc3VjY2Vzcy1wb3B1cF9fY2xvc2UtaWNvbiIpO3RfYWRkRXZlbnRMaXN0ZW5lcihyLCJjbGljayIsKGZ1bmN0aW9uKHQpe3ZhciBlPXR8fHdpbmRvdy5ldmVudCxyOyhlLnRhcmdldHx8ZS5zcmNFbGVtZW50KT09PXRoaXMmJndpbmRvdy50aWxkYUZvcm0uY2xvc2VTdWNjZXNzUG9wdXAoKX0pKSx0X2FkZEV2ZW50TGlzdGVuZXIoYSwiY2xpY2siLChmdW5jdGlvbigpe3dpbmRvdy50aWxkYUZvcm0uY2xvc2VTdWNjZXNzUG9wdXAoKX0pKSx0X2FkZEV2ZW50TGlzdGVuZXIobiwia2V5ZG93biIsKGZ1bmN0aW9uKHQpe3ZhciBlPXR8fHdpbmRvdy5ldmVudCxyOzI3PT0oZS5rZXlDb2RlfHxlLndoaWNoKSYmd2luZG93LnRpbGRhRm9ybS5jbG9zZVN1Y2Nlc3NQb3B1cCgpfSkpfW8uaW5uZXJIVE1MPXQsdF9mYWRlSW4ociksdF9hZGRDbGFzcyhuLCJ0LWJvZHlfc3VjY2Vzcy1wb3B1cC1zaG93ZWQiKSx0X2Zvcm1zX19pc0lPUygpJiZzZXRUaW1lb3V0KChmdW5jdGlvbigpe3dpbmRvdy50aWxkYUZvcm0ubG9ja0JvZHlTY3JvbGwoKX0pLDUwMCl9LHdpbmRvdy50aWxkYUZvcm0uc2hvd1N1Y2Nlc3NQb3B1cE5ldz1mdW5jdGlvbih0LGUscixvKXt2YXIgbj0idGlsZGFmb3Jtc3VjY2Vzc3BvcHVwLW5ldyIsYT1kb2N1bWVudC5ib2R5LGk9dC5nZXRBdHRyaWJ1dGUoImRhdGEtc3VjY2Vzcy11cmwiKSxzPSEhaTtpZih3aW5kb3cuaXNSZWRpcmVjdEVycm9yfHwhc3x8ZXx8cil7dmFyIGw9d2luZG93LmlzUmVkaXJlY3RFcnJvciYmcyYmIWUmJiFyLGM9IXImJiFlLHU9ZCgpO3AoKSx3KCksdF9mb3Jtc19fc2V0dXBDbG9zZUhhbmRsZXJzKHUscyksbSgpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dS5mb2N1cygpLHRfZm9ybXNfX3RyYXBGb2N1cyh1KX0pLDUwKX1mdW5jdGlvbiBkKCl7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobik7cmV0dXJuIHR8fChhLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIix0X2Zvcm1zX19kcmF3TmV3U3VjY2Vzc1BvcHVwKCkpLHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobikpLHR9ZnVuY3Rpb24gbSgpe3RfZmFkZUluKHUpLHRfYWRkQ2xhc3MoYSwidC1ib2R5X3N1Y2Nlc3MtcG9wdXAtc2hvd2VkIiksdS5jbGFzc0xpc3QuYWRkKCJ0LXBvcHVwX3Nob3ciKSxfKHUpLHRfZm9ybXNfX2lzSU9TKCkmJnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7d2luZG93LnRpbGRhRm9ybS5sb2NrQm9keVNjcm9sbCgpfSksNTAwKX1mdW5jdGlvbiBfKCl7dmFyIHQ9MTIwLGU9d2luZG93LmlubmVySGVpZ2h0LXQscj11LnF1ZXJ5U2VsZWN0b3IoIi50LWZvcm0tc3VjY2Vzcy1wb3B1cF9fd3JhcHBlciIpLG89Z2V0Q29tcHV0ZWRTdHlsZShyLG51bGwpLG49cGFyc2VJbnQoby5wYWRkaW5nVG9wKXx8MCxhPXBhcnNlSW50KG8ucGFkZGluZ0JvdHRvbSl8fDAsaSxzLGw7ci5jbGllbnRIZWlnaHQtKG4rYSk8PWU/ci5jbGFzc0xpc3QucmVtb3ZlKCJ0LXBvcHVwX19jb250YWluZXItc3RhdGljIik6ci5jbGFzc0xpc3QuYWRkKCJ0LXBvcHVwX19jb250YWluZXItc3RhdGljIil9ZnVuY3Rpb24gZigpe3JldHVybnt0aXRsZTp7ZWxlbWVudDpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGlsZGFmb3Jtc3VjY2Vzc3BvcHVwdGl0bGUtbmV3IiksY29udGVudDpjP3RfZm9ybXNfX2dldE1zZygic3VjY2Vzc190aXRsZSIpOnIsc2hvdzohIWN8fCEhcn0sdGV4dDp7ZWxlbWVudDpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGlsZGFmb3Jtc3VjY2Vzc3BvcHVwdGV4dC1uZXciKSxjb250ZW50OmM/dF9mb3Jtc19fZ2V0TXNnKCJzdWNjZXNzX3RleHQiKTplLHNob3c6ISFjfHwhIWV9LGxpbmtCdXR0b246e2VsZW1lbnQ6ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRpbGRhZm9ybXN1Y2Nlc3Nwb3B1cGxpbmstbmV3IiksY29udGVudDpvfHx0X2Zvcm1zX19nZXRNc2cocz8ic3VjY2Vzc19idG5fcmVkaXJlY3QiOiJzdWNjZXNzX2J0biIpLHNob3c6c30sY2xvc2VCdXR0b246e2VsZW1lbnQ6ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRpbGRhZm9ybXN1Y2Nlc3Nwb3B1cGJ0bi1uZXciKSxjb250ZW50Om98fHRfZm9ybXNfX2dldE1zZyhzPyJzdWNjZXNzX2J0bl9yZWRpcmVjdCI6InN1Y2Nlc3NfYnRuIiksc2hvdzohc30saW5mbzp7ZWxlbWVudDpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGlsZGFmb3Jtc3VjY2Vzc3BvcHVwaW5mby1uZXciKSxjb250ZW50Om51bGwsc2hvdzpzfSxpbmZvVGV4dDp7ZWxlbWVudDpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGlsZGFmb3Jtc3VjY2Vzc3BvcHVwaW5mb3RleHQtbmV3IiksY29udGVudDp0X2Zvcm1zX19nZXRNc2cobD8ic3VjY2Vzc19pbmZvX3JlZGlyZWN0X2Vycm9yIjoic3VjY2Vzc19pbmZvIiksc2hvdzpzfSxpbmZvRGlnaXQ6e2VsZW1lbnQ6ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRpbGRhZm9ybXN1Y2Nlc3Nwb3B1cGluZm9kaWdpdC1uZXciKSxjb250ZW50Omw/IiI6IjMiLHNob3c6c30sY2xvc2VJY29uOntlbGVtZW50OmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0aWxkYWZvcm1zdWNjZXNzcG9wdXBjbG9zZS1uZXciKSxjb250ZW50Om51bGwsc2hvdzohc319fWZ1bmN0aW9uIHAoKXt2YXIgdD1mKCk7T2JqZWN0LmtleXModCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHI9dFtlXSxvPXIuZWxlbWVudCxuPXIuY29udGVudCxhPXIuc2hvdztvJiYoby5jbGFzc0xpc3QudG9nZ2xlKCJ0LWZvcm0tc3VjY2Vzcy1wb3B1cF9oaWRkZW4iLCFhKSxhJiZuJiYoby5pbm5lckhUTUw9biksImxpbmtCdXR0b24iPT09ZSYmcyYmby5zZXRBdHRyaWJ1dGUoImhyZWYiLGkpKX0pKX1mdW5jdGlvbiB3KCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtZm9ybS1zdWNjZXNzLXBvcHVwX19jb250ZW50LWljb24iKTtpZih0KXt2YXIgZT10LmNsb25lTm9kZSghMCk7dC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlLHQpfX19LHdpbmRvdy50aWxkYUZvcm0uaGFuZGxlQ2xvc2VQb3B1cD1mdW5jdGlvbigpe3dpbmRvdy50aWxkYUZvcm0uY2xvc2VTdWNjZXNzUG9wdXAoKSx3aW5kb3cudGlsZGFGb3JtLmN1cnJlbnRSZW1vdmVDbG9zZUhhbmRsZXJzJiYiZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93LnRpbGRhRm9ybS5jdXJyZW50UmVtb3ZlQ2xvc2VIYW5kbGVycyYmd2luZG93LnRpbGRhRm9ybS5jdXJyZW50UmVtb3ZlQ2xvc2VIYW5kbGVycygpfSx3aW5kb3cudGlsZGFGb3JtLnN1Y2Nlc3NFbmQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBvPXRfZm9ybXNfX2dldEVsZW1lbnQodCk7dF9hZGRDbGFzcyhvLCJqcy1zZW5kLWZvcm0tc3VjY2VzcyIpLHRfZm9ybXNfX3VwZGF0ZUFsbFN5c3RlbVZhcmlhYmxlcyhvKTt2YXIgbj1vLmNsb3Nlc3QoIi50LXBvcHVwIiksYT1vLmNsb3Nlc3QoIi50MTA5MyIpLGk9dF9mb3Jtc19faXNOZXdTdWNjZXNzQm94KG8pJiZuJiYhYSxzPSJ5Ij09PW8uZ2V0QXR0cmlidXRlKCJkYXRhLXN1Y2Nlc3MtcG9wdXAiKTtmdW5jdGlvbiBsKCl7dF9mb3Jtc19faGFuZGxlU3VjY2VzcyhvLHtzdWNjZXNzQ2FsbGJhY2s6cixzdWNjZXNzVXJsOmV9KSx3aW5kb3cudGlsZGFGb3JtLmNsZWFyVENhcnQobyksdF9mb3Jtc19fY2xlYXJGb3JtSW5wdXRzKG8pLHRfZm9ybXNfX2NsZWFyRm9ybURhdGEobyksKHRfZm9ybXNfX2lzTmV3U3VjY2Vzc0JveChvKXx8cykmJndpbmRvdy50X2Zvcm1zX19jbGVhckZvcm0obyl9ZnVuY3Rpb24gYygpe3RfZm9ybXNfX3Nob3dTdWNjZXNzYm94KG8pLmZpbmFsbHkoKGZ1bmN0aW9uKCl7bCgpfSkpfWlmKGkpe3ZhciB1PTMyMDtyZXR1cm4gdF9mb3Jtc19fcHJvY2Vzc0Zvcm1zSW5Qb3B1cChuLG8pLHZvaWQgc2V0VGltZW91dChjLHUpfWMoKX0sd2luZG93LnRpbGRhRm9ybS5jbGVhclRDYXJ0PWZ1bmN0aW9uKHQpe3ZhciBlO2lmKCJ5Ij09PXRfZm9ybXNfX2dldEVsZW1lbnQodCkuZ2V0QXR0cmlidXRlKCJkYXRhLWZvcm1jYXJ0Iikpe2lmKHdpbmRvdy5jbGVhclRDYXJ0PSEwLHdpbmRvdy50Y2FydD17YW1vdW50OjAsY3VycmVuY3k6IiIsc3lzdGVtOiIiLHByb2R1Y3RzOltdfSx3aW5kb3cudGNhcnQuc3lzdGVtPSJub25lIiwib2JqZWN0Ij09dHlwZW9mIGxvY2FsU3RvcmFnZSl0cnl7bG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oInRjYXJ0Iil9Y2F0Y2gocil7Y29uc29sZS5lcnJvcigiWW91ciB3ZWIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IGxvY2FsU3RvcmFnZS4gQ29kZSBzdGF0dXM6ICIscil9dHJ5e2RlbGV0ZSB3aW5kb3cudGNhcnQsd2luZG93LnRjYXJ0X19sb2FkTG9jYWxPYmooKX1jYXRjaChyKXt9d2luZG93LnRjYXJ0X3N1Y2Nlc3M9InllcyJ9fSx3aW5kb3cudGlsZGFGb3JtLnNlbmQ9ZnVuY3Rpb24oZm9ybU5vZGUsYnRuU3VibWl0Tm9kZSxmb3JtVHlwZSxmb3JtS2V5KXt2YXIgZm9ybT10X2Zvcm1zX19nZXRFbGVtZW50KGZvcm1Ob2RlKSxidG5TdWJtaXQ9dF9mb3Jtc19fZ2V0RWxlbWVudChidG5TdWJtaXROb2RlKSxhbGxSZWNvcmRzPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIikscGFnZUlkPWFsbFJlY29yZHMuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLXBhZ2UtaWQiKSxwcm9qZWN0SWQ9YWxsUmVjb3Jkcy5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtcHJvamVjdC1pZCIpLGZvcm1JZD1mb3JtLmdldEF0dHJpYnV0ZSgiaWQiKSxkYXRhRm9ybUNhcnQ9Zm9ybS5nZXRBdHRyaWJ1dGUoImRhdGEtZm9ybWNhcnQiKSxtc2dDb250YWluZXJzLGVycm9yQm94ZXMsYWxsRXJyb3I7d2luZG93LnRpbGRhRm9ybS50aWxkYXBheW1lbnQ9ITEsKCJ5Ij09PWRhdGFGb3JtQ2FydHx8Zm9ybS5jbG9zZXN0KCIudDcwNl9fb3JkZXJmb3JtIikpJiZ3aW5kb3cudGlsZGFGb3JtLmFkZFBheW1lbnRJbmZvVG9Gb3JtKGZvcm0pO3RyeXt3aW5kb3cubWF1c2VyJiZ3aW5kb3cudGlsZGFGb3JtLmFkZE1lbWJlcnNJbmZvVG9Gb3JtKGZvcm0pfWNhdGNoKGVycm9yKXt9dmFyIGlucHV0SXRzR29vZD1mb3JtLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9ImZvcm0tc3BlYy1jb21tZW50cyJdJyk7aWYoaW5wdXRJdHNHb29kfHxmb3JtLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIiwnPGRpdiBzdHlsZT0icG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAtNTAwMHB4OyBib3R0b206IDA7IGRpc3BsYXk6IG5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iZm9ybS1zcGVjLWNvbW1lbnRzIiB2YWx1ZT0iSXRzIGdvb2QiIGNsYXNzPSJqcy1mb3JtLXNwZWMtY29tbWVudHMiIHRhYmluZGV4PSItMSIgLz48L2Rpdj4nKSwyPT09Zm9ybVR5cGV8fCFmb3JtVHlwZSYmZm9ybUtleSl7dmFyIHRpbGRhU3BlY3M9eyJ0aWxkYXNwZWMtY29va2llIjpkb2N1bWVudC5jb29raWUsInRpbGRhc3BlYy1yZWZlcmVyIjp3aW5kb3cubG9jYXRpb24uaHJlZiwidGlsZGFzcGVjLWZvcm1pZCI6Zm9ybUlkLCJ0aWxkYXNwZWMtZm9ybXNrZXkiOmZvcm1LZXksInRpbGRhc3BlYy12ZXJzaW9uLWxpYiI6d2luZG93LnRpbGRhRm9ybS52ZXJzaW9uTGliLCJ0aWxkYXNwZWMtcGFnZWlkIjpwYWdlSWQsInRpbGRhc3BlYy1wcm9qZWN0aWQiOnByb2plY3RJZCwidGlsZGFzcGVjLWxhbmciOndpbmRvdy50X2Zvcm1zX19sYW5nfSxoaWRkZW5JbnB1dDtmb3IodmFyIHNwZWMgaW4gdGlsZGFTcGVjcyloaWRkZW5JbnB1dD1mb3JtLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9Iicrc3BlYysnIl0nKSxoaWRkZW5JbnB1dHx8KGZvcm0uaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLCc8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSInK3NwZWMrJyIgdmFsdWU9IiI+JyksaGlkZGVuSW5wdXQ9Zm9ybS5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPSInK3NwZWMrJyJdJyksaGlkZGVuSW5wdXQudmFsdWU9dGlsZGFTcGVjc1tzcGVjXSk7dHJ5e2hpZGRlbklucHV0PWZvcm0ucXVlcnlTZWxlY3RvcigiaW5wdXRbbmFtZT10aWxkYXNwZWMtZnBdIiksaGlkZGVuSW5wdXR8fChmb3JtLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIiwnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idGlsZGFzcGVjLWZwIiB2YWx1ZT0iIj4nKSxoaWRkZW5JbnB1dD1mb3JtLnF1ZXJ5U2VsZWN0b3IoImlucHV0W25hbWU9dGlsZGFzcGVjLWZwXSIpKSx3aW5kb3cudGlsZGFzdGF0P2hpZGRlbklucHV0LnZhbHVlPXdpbmRvdy50aWxkYXN0YXQoImZpbmdlcnByaW50Iik6aGlkZGVuSW5wdXQudmFsdWU9InN0Iit3aW5kb3cucGFnZVlPZmZzZXQrInciK3dpbmRvdy5pbm5lcldpZHRoKyJoIit3aW5kb3cuaW5uZXJIZWlnaHQrImZ0Iitmb3JtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXR9Y2F0Y2goZXJyb3Ipe31pbnB1dEl0c0dvb2Q9Zm9ybS5xdWVyeVNlbGVjdG9yKCIuanMtZm9ybS1zcGVjLWNvbW1lbnRzIiksaW5wdXRJdHNHb29kJiYoaW5wdXRJdHNHb29kLnZhbHVlPSIiKTt2YXIgX3RfZm9ybXNfX2dldEZvcm1EYXRhPXRfZm9ybXNfX2dldEZvcm1EYXRhKGZvcm0pLHN0YXR1cz1fdF9mb3Jtc19fZ2V0Rm9ybURhdGEuc3RhdHVzLGZvcm1EYXRhPV90X2Zvcm1zX19nZXRGb3JtRGF0YS5kYXRhLGNvbnRlbnRUeXBlPV90X2Zvcm1zX19nZXRGb3JtRGF0YS5jb250ZW50VHlwZTtpZigiaW52YWxpZCI9PT1zdGF0dXMpcmV0dXJuITE7dmFyIHN0YXJ0UmVxdWVzdD1EYXRlLm5vdygpO3RfdHJpZ2dlckV2ZW50KGZvcm0sInRpbGRhZm9ybTpiZWZvcmVzZW5kIik7dmFyIGZvcm1Vcmw9Imh0dHBzOi8vIit3aW5kb3cudGlsZGFGb3JtLmVuZHBvaW50KyIvcHJvY2Nlcy8iLHNlY29uZEZvcm1UeXBlWGhyPW5ldyBYTUxIdHRwUmVxdWVzdDtyZXR1cm4gc2Vjb25kRm9ybVR5cGVYaHIub3BlbigiUE9TVCIsZm9ybVVybCwhMCksc2Vjb25kRm9ybVR5cGVYaHIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixjb250ZW50VHlwZSksc2Vjb25kRm9ybVR5cGVYaHIuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IiwiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0LCAqLyo7IHE9MC4wMSIpLHNlY29uZEZvcm1UeXBlWGhyLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2lmKDQ9PT1zZWNvbmRGb3JtVHlwZVhoci5yZWFkeVN0YXRlKWlmKHNlY29uZEZvcm1UeXBlWGhyLnN0YXR1cz49MjAwJiZzZWNvbmRGb3JtVHlwZVhoci5zdGF0dXM8NDAwKXt2YXIgZGF0YT1zZWNvbmRGb3JtVHlwZVhoci5yZXNwb25zZVRleHQ7aWYoZGF0YSl7dmFyIG9iakRhdGE9SlNPTi5wYXJzZShkYXRhKTtpZigib2JqZWN0Ij09dHlwZW9mIG9iakRhdGEpe3ZhciBkYXRhU3VjY2Vzc1VybD1mb3JtLmdldEF0dHJpYnV0ZSgiZGF0YS1zdWNjZXNzLXVybCIpLGRhdGFTdWNjZXNzQ2FsbGJhY2s9Zm9ybS5nZXRBdHRyaWJ1dGUoImRhdGEtc3VjY2Vzcy1jYWxsYmFjayIpLGRhdGFGb3JtU2VuZGVkQ2FsbGJhY2s9Zm9ybS5nZXRBdHRyaWJ1dGUoImRhdGEtZm9ybXNlbmRlZC1jYWxsYmFjayIpO3RfcmVtb3ZlQ2xhc3MoYnRuU3VibWl0LCJ0LWJ0bl9zZW5kaW5nIiksYnRuU3VibWl0LnRpbGRhU2VuZGluZ1N0YXR1cz0iMCI7dHJ5e2lmKG9iakRhdGEmJm9iakRhdGEucmVkaXJlY3R0byYmMz09b2JqRGF0YS5yZWRpcmVjdHRvLmxlbmd0aCYmd2luZG93LnRpbGRhRm9ybS5lbmRwb2ludC5zdWJzdHJpbmcod2luZG93LnRpbGRhRm9ybS5lbmRwb2ludC5sZW5ndGgtMykhPW9iakRhdGEucmVkaXJlY3R0bylyZXR1cm4gd2luZG93LnRpbGRhRm9ybS5lbmRwb2ludD0iZm9ybXMudGlsZGFhcGkuIitvYmpEYXRhLnJlZGlyZWN0dG8sd2luZG93LnRpbGRhRm9ybS5zZW5kKGZvcm0sYnRuU3VibWl0LGZvcm1UeXBlLGZvcm1LZXkpLCExfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoImVycm9yIGluIGRjIGFjdGlvbi4iKX1pZihvYmpEYXRhJiZvYmpEYXRhLmVycm9yKW1zZ0NvbnRhaW5lcnM9dF9mb3Jtc19fZ2V0RXJyb3JDb250YWluZXJzKGZvcm0sIiIpLGVycm9yQm94ZXM9bXNnQ29udGFpbmVycy5lcnJvckJveGVzLGFsbEVycm9yPW1zZ0NvbnRhaW5lcnMuYWxsRXJyb3IsQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhbGxFcnJvciwoZnVuY3Rpb24odCl7dC5zdHlsZS5kaXNwbGF5PSJibG9jayJ9KSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlcnJvckJveGVzLChmdW5jdGlvbih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50LWZvcm1fX2Vycm9yYm94LXRleHQiKTtlP2UuaW5uZXJIVE1MPW9iakRhdGEuZXJyb3I6dC5pbm5lckhUTUw9b2JqRGF0YS5lcnJvcix0LnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0pKSx0X2FkZENsYXNzKGZvcm0sImpzLXNlbmQtZm9ybS1lcnJvciIpLHRfdHJpZ2dlckV2ZW50KGZvcm0sInRpbGRhZm9ybTphZnRlcmVycm9yIiksd2luZG93LnRfY2FydF9fZGlzY291bnRzJiZ3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oInRjYXJ0X2Rpc2NvdW50cyIpO2Vsc2V7dmFyIF9vYmpEYXRhJG1lbWJlcjtpZihvYmpEYXRhJiZvYmpEYXRhLm5lZWRjYXB0Y2hhKXJldHVybiBmb3JtS2V5Pyh3aW5kb3cudGlsZGFGb3JtLmFkZFRpbGRhQ2FwdGNoYShmb3JtLGZvcm1LZXkpLCExKTooYWxlcnQoIlNlcnZlciBidXN5LiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLiIpLCExKTt2YXIgZm9ybVJlc3VsdD17fTtpZihvYmpEYXRhJiZvYmpEYXRhLnJlc3VsdHMmJm9iakRhdGEucmVzdWx0c1swXSl7dmFyIHN0clZhbHVlPW9iakRhdGEucmVzdWx0c1swXTtzdHJWYWx1ZT1zdHJWYWx1ZS5zcGxpdCgiOiIpLGZvcm1SZXN1bHQudHJhbklkPXN0clZhbHVlWzBdKyI6IitzdHJWYWx1ZVsxXSxmb3JtUmVzdWx0Lm9yZGVySWQ9c3RyVmFsdWVbMl0/c3RyVmFsdWVbMl06IjAiLGZvcm1SZXN1bHQub3JkZXJJZCYmIjAiIT09Zm9ybVJlc3VsdC5vcmRlcklkJiYod2luZG93LnRpbGRhRm9ybS5vcmRlcklkRm9yU3RhdD1mb3JtUmVzdWx0Lm9yZGVySWQpfWVsc2UgZm9ybVJlc3VsdC50cmFuSWQ9IjAiLGZvcm1SZXN1bHQub3JkZXJJZD0iMCI7InVuZGVmaW5lZCIhPXR5cGVvZiBqUXVlcnkmJmpRdWVyeShmb3JtKS5kYXRhKCJ0aWxkYWZvcm1yZXN1bHQiLGZvcm1SZXN1bHQpLGZvcm0udGlsZGFUcmFuSWQ9Zm9ybVJlc3VsdC50cmFuSWQsZm9ybS50aWxkYU9yZGVySWQ9Zm9ybVJlc3VsdC5vcmRlcklkO3ZhciBkYXRhRXZlbnROYW1lPWZvcm0uZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWV2ZW50LW5hbWUiKXx8IiI7ZGF0YUV2ZW50TmFtZXx8KGRhdGFFdmVudE5hbWU9InkiPT09ZGF0YUZvcm1DYXJ0JiZvYmpEYXRhJiYob2JqRGF0YS5uZXh0JiZvYmpEYXRhLm5leHQudHlwZSYmKCJmdW5jdGlvbiIhPT1vYmpEYXRhLm5leHQudHlwZXx8b2JqRGF0YS5uZXh0LnZhbHVlJiYoInN0cmlwZXYzIj09PW9iakRhdGEubmV4dC52YWx1ZS5zeXNuYW1lfHwib3V0ZXJzaXRlIj09PW9iakRhdGEubmV4dC52YWx1ZS5pbnN0YWxsYXRpb24pKXx8IW9iakRhdGEubmV4dCk/Ii90aWxkYS8iK2Zvcm1JZCsiL3BheW1lbnQvIjoiL3RpbGRhLyIrZm9ybUlkKyIvc3VibWl0dGVkLyIpO3ZhciB0aXRsZT0iU2VuZCBkYXRhIGZyb20gZm9ybSAiK2Zvcm1JZCxwcmljZT0wLHByb2R1Y3Q9IiIscHJpY2VFbD1mb3JtLnF1ZXJ5U2VsZWN0b3IoIi5qcy10aWxkYS1wcmljZSIpO2lmKHdpbmRvdy5UaWxkYSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5UaWxkYS5zZW5kRXZlbnRUb1N0YXRpc3RpY3Mpe3dpbmRvdy50aWxkYUZvcm0udGlsZGFwYXltZW50JiZ3aW5kb3cudGlsZGFGb3JtLnRpbGRhcGF5bWVudC5hbW91bnQ/KHByaWNlPXdpbmRvdy50aWxkYUZvcm0udGlsZGFwYXltZW50LmFtb3VudCxwYXJzZUZsb2F0KHByaWNlKT4wJiYodGl0bGU9Ik9yZGVyICIrZm9ybVJlc3VsdC5vcmRlcklkKSk6cHJpY2VFbCYmKHByaWNlPXByaWNlRWwudmFsdWUscGFyc2VGbG9hdChwcmljZSk+MCYmKHRpdGxlPSJPcmRlciAiK2Zvcm1SZXN1bHQub3JkZXJJZCkpO3RyeXt3aW5kb3cuVGlsZGEuc2VuZEV2ZW50VG9TdGF0aXN0aWNzKGRhdGFFdmVudE5hbWUsdGl0bGUscHJvZHVjdCxwcmljZSl9Y2F0Y2goZXJyb3Ipe2NvbnNvbGUuZXJyb3IoIkVycm9yIHdoaWxlIHNlbmRpbmcgc3RhdGlzdGljcy4gQ29kZSBzdGF0dXM6ICIsZXJyb3IpfXdpbmRvdy5kYXRhTGF5ZXImJndpbmRvdy5kYXRhTGF5ZXIucHVzaCh7ZXZlbnQ6InN1Ym1pdF8iK2Zvcm1JZH0pfWVsc2V7dHJ5eyJ1bmRlZmluZWQiIT10eXBlb2YgZ2EmJiJ0aWxkYSIhPT13aW5kb3cubWFpblRyYWNrZXImJmdhKCJzZW5kIix7aGl0VHlwZToicGFnZXZpZXciLHBhZ2U6ZGF0YUV2ZW50TmFtZSx0aXRsZTp0aXRsZX0pLHdpbmRvdy5tYWluTWV0cmlrYSYmd2luZG93W3dpbmRvdy5tYWluTWV0cmlrYV0mJndpbmRvd1t3aW5kb3cubWFpbk1ldHJpa2FdLmhpdChkYXRhRXZlbnROYW1lLHt0aXRsZTp0aXRsZSxyZWZlcmVyOndpbmRvdy5sb2NhdGlvbi5ocmVmfSl9Y2F0Y2goZXJyb3Ipe2NvbnNvbGUuZXJyb3IoIkVycm9yIHdoaWxlIHNlbmRpbmcgbWFpbiBtZXRyaWNhLiBDb2RlIHN0YXR1czogIixlcnJvcil9d2luZG93LmRhdGFMYXllciYmd2luZG93LmRhdGFMYXllci5wdXNoKHtldmVudDoic3VibWl0XyIrZm9ybUlkfSl9aWYoInkiPT09ZGF0YUZvcm1DYXJ0JiZudWxsIT0oX29iakRhdGEkbWVtYmVyPW9iakRhdGEubWVtYmVyKSYmX29iakRhdGEkbWVtYmVyLnRva2VuKXt2YXIgX29iakRhdGEkbWVtYmVyMixwcm9maWxlTmFtZT0idGlsZGFfbWVtYmVyc19wcm9maWxlIitwcm9qZWN0SWQsbWVtYmVySW5mbz17dG9rZW46bnVsbD09KF9vYmpEYXRhJG1lbWJlcjI9b2JqRGF0YS5tZW1iZXIpP3ZvaWQgMDpfb2JqRGF0YSRtZW1iZXIyLnRva2VuLHByb2plY3RpZDpwcm9qZWN0SWR9O2xvY2FsU3RvcmFnZS5zZXRJdGVtKHByb2ZpbGVOYW1lLEpTT04uc3RyaW5naWZ5KG1lbWJlckluZm8pKSxsb2NhbFN0b3JhZ2Uuc2V0SXRlbShwcm9maWxlTmFtZSsiX3RpbWVzdGFtcCIsTWF0aC5mbG9vcihEYXRlLm5vdygpLzFlMykudG9TdHJpbmcoKSksdF9vbkZ1bmNMb2FkKCJ0X2JkX19pbml0IiwoZnVuY3Rpb24oKXt0X2JkX19pbml0KCksd2luZG93LnRjYXJ0X19pbml0QXV0aEFuZERlbGl2ZXJ5KCEwLCExKX0pKX10cnl7dF90cmlnZ2VyRXZlbnQoZm9ybSwidGlsZGFmb3JtOmFmdGVyc3VjY2VzcyIpLGRhdGFGb3JtU2VuZGVkQ2FsbGJhY2smJiJmdW5jdGlvbiI9PXR5cGVvZiBqUXVlcnk/ZXZhbChkYXRhRm9ybVNlbmRlZENhbGxiYWNrKyIoalF1ZXJ5KGZvcm0pKTsiKTpkYXRhRm9ybVNlbmRlZENhbGxiYWNrJiZldmFsKGRhdGFGb3JtU2VuZGVkQ2FsbGJhY2srIihmb3JtKTsiKX1jYXRjaChlcnJvcil7Y29uc29sZS5lcnJvcigiRXJyb3Igd2hpbGUgY2FsbCBzdWNjZXNzIGNhbGxiYWNrLiBDb2RlIHN0YXR1czogIixlcnJvcil9aWYob2JqRGF0YSYmb2JqRGF0YS5uZXh0JiZvYmpEYXRhLm5leHQudHlwZSlyZXR1cm4gd2luZG93LnRpbGRhRm9ybS5wYXltZW50KGZvcm0sb2JqRGF0YS5uZXh0KSwhMTt3aW5kb3cudGlsZGFGb3JtLnN1Y2Nlc3NFbmQoZm9ybSxkYXRhU3VjY2Vzc1VybCxkYXRhU3VjY2Vzc0NhbGxiYWNrKX19fX1lbHNle3ZhciB0c0RlbHRhPURhdGUubm93KCktc3RhcnRSZXF1ZXN0O2lmKHRfcmVtb3ZlQ2xhc3MoYnRuU3VibWl0LCJ0LWJ0bl9zZW5kaW5nIiksYnRuU3VibWl0LnRpbGRhU2VuZGluZ1N0YXR1cz0iMCIsbXNnQ29udGFpbmVycz10X2Zvcm1zX19nZXRFcnJvckNvbnRhaW5lcnMoZm9ybSwiIiksZXJyb3JCb3hlcz1tc2dDb250YWluZXJzLmVycm9yQm94ZXMsYWxsRXJyb3I9bXNnQ29udGFpbmVycy5hbGxFcnJvciwhc2Vjb25kRm9ybVR5cGVYaHJ8fDA9PXNlY29uZEZvcm1UeXBlWGhyLnN0YXR1cyYmdHNEZWx0YTwxMDApQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhbGxFcnJvciwoZnVuY3Rpb24odCl7dC5pbm5lckhUTUw9IlJlcXVlc3QgZXJyb3IgKHNlbmRpbmcgZm9ybSBkYXRhKS4gUGxlYXNlIGNoZWNrIGludGVybmV0IGNvbm5lY3Rpb24uLi4ifSkpO2Vsc2V7aWYoc2Vjb25kRm9ybVR5cGVYaHImJihzZWNvbmRGb3JtVHlwZVhoci5zdGF0dXM+PTUwMHx8NDA4PT1zZWNvbmRGb3JtVHlwZVhoci5zdGF0dXN8fDQxMD09c2Vjb25kRm9ybVR5cGVYaHIuc3RhdHVzfHw0Mjk9PXNlY29uZEZvcm1UeXBlWGhyLnN0YXR1c3x8InRpbWVvdXQiPT1zZWNvbmRGb3JtVHlwZVhoci5zdGF0dXNUZXh0KSYmLTEhPT13aW5kb3cudGlsZGFGb3JtLmVuZHBvaW50LmluZGV4T2YoImZvcm1zLnRpbGRhIikpcmV0dXJuIHdpbmRvdy50aWxkYUZvcm0uZW5kcG9pbnQ9ImZvcm1zMi50aWxkYWNkbi5jb20iLHdpbmRvdy50aWxkYUZvcm0uc2VuZChmb3JtLGJ0blN1Ym1pdCxmb3JtVHlwZSxmb3JtS2V5KSwhMTtzZWNvbmRGb3JtVHlwZVhociYmc2Vjb25kRm9ybVR5cGVYaHIucmVzcG9uc2VUZXh0P0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYWxsRXJyb3IsKGZ1bmN0aW9uKHQpe3QuaW5uZXJIVE1MPSJbIitzZWNvbmRGb3JtVHlwZVhoci5zdGF0dXMrIl0gIitzZWNvbmRGb3JtVHlwZVhoci5yZXNwb25zZVRleHQrIi4gUGxlYXNlLCB0cnkgYWdhaW4gbGF0ZXIuIn0pKTpzZWNvbmRGb3JtVHlwZVhociYmc2Vjb25kRm9ybVR5cGVYaHIuc3RhdHVzVGV4dD9BcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGFsbEVycm9yLChmdW5jdGlvbih0KXt0LmlubmVySFRNTD0iRXJyb3IgWyIrc2Vjb25kRm9ybVR5cGVYaHIuc3RhdHVzKyIsICIrc2Vjb25kRm9ybVR5cGVYaHIuc3RhdHVzVGV4dCsiXS4gUGxlYXNlLCB0cnkgYWdhaW4gbGF0ZXIuIn0pKTpBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGFsbEVycm9yLChmdW5jdGlvbih0KXt0LmlubmVySFRNTD0iWyIrc2Vjb25kRm9ybVR5cGVYaHIuc3RhdHVzKyJdIFVua25vd24gZXJyb3IuIFBsZWFzZSwgdHJ5IGFnYWluIGxhdGVyLiJ9KSl9QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhbGxFcnJvciwoZnVuY3Rpb24odCl7dC5zdHlsZS5kaXNwbGF5PSJibG9jayJ9KSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlcnJvckJveGVzLChmdW5jdGlvbih0KXt0LnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0pKSx0X2FkZENsYXNzKGZvcm0sImpzLXNlbmQtZm9ybS1lcnJvciIpLHRfdHJpZ2dlckV2ZW50KGZvcm0sInRpbGRhZm9ybTphZnRlcmVycm9yIil9cmV0dXJuITB9LHNlY29uZEZvcm1UeXBlWGhyLnNlbmQoZm9ybURhdGEpLCExfWlmKCJ5Ij09PWZvcm0uZ2V0QXR0cmlidXRlKCJkYXRhLWlzLWZvcm1hamF4Iikpe3ZhciBfdF9mb3Jtc19fZ2V0Rm9ybURhdGEyPXRfZm9ybXNfX2dldEZvcm1EYXRhKGZvcm0pLF9zdGF0dXM9X3RfZm9ybXNfX2dldEZvcm1EYXRhMi5zdGF0dXMsX2NvbnRlbnRUeXBlPV90X2Zvcm1zX19nZXRGb3JtRGF0YTIuY29udGVudFR5cGUsZGF0YUZvcm09X3RfZm9ybXNfX2dldEZvcm1EYXRhMi5kYXRhO2lmKCJpbnZhbGlkIj09PV9zdGF0dXMpcmV0dXJuITE7dmFyIGZvcm1BamF4WGhyPW5ldyBYTUxIdHRwUmVxdWVzdDtyZXR1cm4gZm9ybUFqYXhYaHIub3BlbigiUE9TVCIsZm9ybS5nZXRBdHRyaWJ1dGUoImFjdGlvbiIpLCEwKSxmb3JtQWpheFhoci5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLF9jb250ZW50VHlwZSksZm9ybUFqYXhYaHIuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IiwidGV4dC9wbGFpbiwgKi8qOyBxPTAuMDEiKSxmb3JtQWpheFhoci5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtpZig0PT09Zm9ybUFqYXhYaHIucmVhZHlTdGF0ZSlpZihmb3JtQWpheFhoci5zdGF0dXM+PTIwMCYmZm9ybUFqYXhYaHIuc3RhdHVzPDQwMCl7dmFyIHQ9Zm9ybS5xdWVyeVNlbGVjdG9yKCIuanMtc3VjY2Vzc2JveCIpLGU9Zm9ybS5nZXRBdHRyaWJ1dGUoImRhdGEtc3VjY2Vzcy11cmwiKSxyPWZvcm0uZ2V0QXR0cmlidXRlKCJkYXRhLXN1Y2Nlc3MtY2FsbGJhY2siKTt0X3JlbW92ZUNsYXNzKGJ0blN1Ym1pdCwidC1idG5fc2VuZGluZyIpLGJ0blN1Ym1pdC50aWxkYVNlbmRpbmdTdGF0dXM9IjAiO3ZhciBvPWZvcm1BamF4WGhyLnJlc3BvbnNlVGV4dDtpZihvKWlmKCJ7Ij09by5zdWJzdHJpbmcoMCwxKSl7dmFyIG49SlNPTi5wYXJzZShvKTtpZigib2JqZWN0Ij09dHlwZW9mIG4paWYobiYmbi5tZXNzYWdlJiYiT0siIT09bi5tZXNzYWdlKXQuaW5uZXJIVE1MPW4ubWVzc2FnZTtlbHNlIGlmKG4mJm4uZXJyb3IpcmV0dXJuIG1zZ0NvbnRhaW5lcnM9dF9mb3Jtc19fZ2V0RXJyb3JDb250YWluZXJzKGZvcm0sIlVua25vd24gZXJyb3IuIFBsZWFzZSwgdHJ5IGFnYWluIGxhdGVyLiIpLGVycm9yQm94ZXM9bXNnQ29udGFpbmVycy5lcnJvckJveGVzLGFsbEVycm9yPW1zZ0NvbnRhaW5lcnMuYWxsRXJyb3IsQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhbGxFcnJvciwoZnVuY3Rpb24odCl7dC5zdHlsZS5kaXNwbGF5PSJibG9jayIsdC5pbm5lckhUTUw9bi5lcnJvcn0pKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGVycm9yQm94ZXMsKGZ1bmN0aW9uKHQpe3Quc3R5bGUuZGlzcGxheT0iYmxvY2sifSkpLHRfYWRkQ2xhc3MoZm9ybSwianMtc2VuZC1mb3JtLWVycm9yIiksdF90cmlnZ2VyRXZlbnQoZm9ybSwidGlsZGFmb3JtOmFmdGVyZXJyb3IiKSwhMX1lbHNlIHQuaW5uZXJIVE1MPW8sdF9wYXJzZVNjcmlwdHModCwiIik7dmFyIGE9Ii90aWxkYS8iK2Zvcm1JZCsiL3N1Ym1pdHRlZC8iLGk9IlNlbmQgZGF0YSBmcm9tIGZvcm0gIitmb3JtSWQ7d2luZG93LlRpbGRhJiYiZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93LlRpbGRhLnNlbmRFdmVudFRvU3RhdGlzdGljcz93aW5kb3cuVGlsZGEuc2VuZEV2ZW50VG9TdGF0aXN0aWNzKGEsaSwiIiwwKToidW5kZWZpbmVkIiE9dHlwZW9mIGdhJiYidGlsZGEiIT09d2luZG93Lm1haW5UcmFja2VyP2dhKCJzZW5kIix7aGl0VHlwZToicGFnZXZpZXciLHBhZ2U6YSx0aXRsZTppfSk6d2luZG93Lm1haW5NZXRyaWthPiIiJiZ3aW5kb3dbd2luZG93Lm1haW5NZXRyaWthXSYmd2luZG93W3dpbmRvdy5tYWluTWV0cmlrYV0uaGl0KGEse3RpdGxlOmkscmVmZXJlcjp3aW5kb3cubG9jYXRpb24uaHJlZn0pLHRfdHJpZ2dlckV2ZW50KGZvcm0sInRpbGRhZm9ybTphZnRlcnN1Y2Nlc3MiKSx3aW5kb3cudGlsZGFGb3JtLnN1Y2Nlc3NFbmQoZm9ybSxlLHIpfWVsc2V7dF9yZW1vdmVDbGFzcyhidG5TdWJtaXQsInQtYnRuX3NlbmRpbmciKSxidG5TdWJtaXQudGlsZGFTZW5kaW5nU3RhdHVzPSIwIixtc2dDb250YWluZXJzPXRfZm9ybXNfX2dldEVycm9yQ29udGFpbmVycyhmb3JtLCIiKSxlcnJvckJveGVzPW1zZ0NvbnRhaW5lcnMuZXJyb3JCb3hlcyxhbGxFcnJvcj1tc2dDb250YWluZXJzLmFsbEVycm9yO3ZhciBzPWZvcm1BamF4WGhyLnJlc3BvbnNlVGV4dDtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGFsbEVycm9yLChmdW5jdGlvbih0KXtzP3QuaW5uZXJIVE1MPXMrIi4gUGxlYXNlLCB0cnkgYWdhaW4gbGF0ZXIuIFsiK2Zvcm1BamF4WGhyLnN0YXR1cysiXSI6Zm9ybUFqYXhYaHIuc3RhdHVzVGV4dD90LmlubmVySFRNTD0iRXJyb3IgWyIrZm9ybUFqYXhYaHIuc3RhdHVzVGV4dCsiXS4gUGxlYXNlLCB0cnkgYWdhaW4gbGF0ZXIuIFsiK2Zvcm1BamF4WGhyLnN0YXR1cysiXSI6dC5pbm5lckhUTUw9IlVua25vd24gZXJyb3IuIFBsZWFzZSwgdHJ5IGFnYWluIGxhdGVyLiBbIitmb3JtQWpheFhoci5zdGF0dXMrIl0iLHQuc3R5bGUuZGlzcGxheT0iYmxvY2sifSkpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZXJyb3JCb3hlcywoZnVuY3Rpb24odCl7dC5zdHlsZS5kaXNwbGF5PSJibG9jayJ9KSksdF9hZGRDbGFzcyhmb3JtLCJqcy1zZW5kLWZvcm0tZXJyb3IiKSx0X3RyaWdnZXJFdmVudChmb3JtLCJ0aWxkYWZvcm06YWZ0ZXJlcnJvciIpfXJldHVybiEwfSxmb3JtQWpheFhoci5zZW5kKGRhdGFGb3JtKSwhMX1yZXR1cm4tMT09Zm9ybS5nZXRBdHRyaWJ1dGUoImFjdGlvbiIpLmluZGV4T2Yod2luZG93LnRpbGRhRm9ybS5lbmRwb2ludCkmJih0X3JlbW92ZUNsYXNzKGJ0blN1Ym1pdCwidC1idG5fc2VuZGluZyIpLGJ0blN1Ym1pdC50aWxkYVNlbmRpbmdTdGF0dXM9IjMiLGZvcm0uc3VibWl0KCksITApfSx3aW5kb3cudmFsaWRhdGVGb3JtPWZ1bmN0aW9uKHQpe3JldHVybiB3aW5kb3cudGlsZGFGb3JtLnZhbGlkYXRlKHQpfSxmdW5jdGlvbigpe3RyeXt2YXIgdD13aW5kb3cubG9jYXRpb24uaHJlZixlLHI9IiI7aWYoLTEhPT10LnRvTG93ZXJDYXNlKCkuaW5kZXhPZigidXRtXyIpJiYic3RyaW5nIj09dHlwZW9mKGU9KGU9KHQ9dC50b0xvd2VyQ2FzZSgpKS5zcGxpdCgiPyIpKVsxXSkpe3ZhciBvLG4sYT1lLnNwbGl0KCImIik7Zm9yKG4gaW4gYSkiZnVuY3Rpb24iIT10eXBlb2YgYVtuXSYmInV0bV8iPT0obz1hW25dLnNwbGl0KCI9IikpWzBdLnN1YnN0cmluZygwLDQpJiYocj1yK2Fbbl0rInx8fCIpO2lmKHIubGVuZ3RoPjAmJighd2luZG93LnRpbGRhc3RhdGNvb2tpZXx8Im5vIiE9d2luZG93LnRpbGRhc3RhdGNvb2tpZSkpe3ZhciBpPW5ldyBEYXRlO2kuc2V0RGF0ZShpLmdldERhdGUoKSszMCksZG9jdW1lbnQuY29va2llPSJUSUxEQVVUTT0iK2VuY29kZVVSSUNvbXBvbmVudChyKSsiOyBwYXRoPS87IGV4cGlyZXM9IitpLnRvVVRDU3RyaW5nKCl9fX1jYXRjaChzKXt9fSgpO3ZhciB0X2Zvcm1zX19zZXRGb3JtRXJyb3JNc2c9ZnVuY3Rpb24gdChlLHIpe2UuZ2V0QXR0cmlidXRlKCJkYXRhLXJ1bGUtZmlsbGVkIik/ZS5zdHlsZS5kaXNwbGF5PSJibG9jayI6ciYmKGUuaW5uZXJIVE1MPSc8YSBocmVmPSIjIiBjbGFzcz0idC1mb3JtX19lcnJvcmJveC1saW5rIj4nK3IrIjwvYT4iLGUuc3R5bGUuZGlzcGxheT0iYmxvY2siKX07ZnVuY3Rpb24gdF9mb3Jtc19fc2hvd0VtcHR5Rm9ybUVycm9yKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLmpzLXJ1bGUtZXJyb3ItYWxsIikscj10X2Zvcm1zX19nZXRNc2coImVtcHR5ZmlsbCIpLG87ZS5mb3JFYWNoKChmdW5jdGlvbih0KXt0X2Zvcm1zX19zZXRGb3JtRXJyb3JNc2codCxyKX0pKSx0X2Zvcm1zX19hZGRNb3ZlVG9JbnB1dFdpdGhFcnJvckNsaWNrSGFuZGxlcih0LnF1ZXJ5U2VsZWN0b3IoIi50LWlucHV0LWdyb3VwIiksZVswXSl9ZnVuY3Rpb24gdF9mb3Jtc19fc2hvd0lucHV0RXJyb3JzKHQsZSxyKXtpZihlJiYibm9uZSIhPT1yLm9iail7ZS5jbGFzc0xpc3QuYWRkKCJqcy1lcnJvci1jb250cm9sLWJveCIpO3ZhciBvPWUucXVlcnlTZWxlY3RvckFsbCgiLnQtaW5wdXQtZXJyb3IiKTtyLnR5cGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHIsbj10X2Zvcm1zX19nZXRDdXN0b21NZXNzYWdlKHQsZSl8fHRfZm9ybXNfX2dldEZpZWxkRXJyb3JUZXh0KGUpO24mJm8uZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5pbm5lckhUTUw9bn0pKX0pKX19ZnVuY3Rpb24gdF9mb3Jtc19fc2hvd0Zvcm1FcnJvcnModCxlLHIpe2UudHlwZS5mb3JFYWNoKChmdW5jdGlvbihvKXt2YXIgbj10LnF1ZXJ5U2VsZWN0b3JBbGwoIi5qcy1ydWxlLWVycm9yLSIrbyksYSxpPXRfZm9ybXNfX2dldEN1c3RvbU1lc3NhZ2UodCxvKXx8dF9mb3Jtc19fZ2V0TXNnKG8pLHM7KG4ubGVuZ3RoP246dC5xdWVyeVNlbGVjdG9yQWxsKCIuanMtcnVsZS1lcnJvci1hbGwiKSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dF9mb3Jtc19fc2V0Rm9ybUVycm9yTXNnKHQsaSxvKSxyLmFkZChvLGUub2JqLHQpfSkpfSkpfWZ1bmN0aW9uIHRfZm9ybXNfX2dldEZpZWxkRXJyb3JUZXh0KHQpe3ZhciBlPXRfZm9ybXNfX2dldE1zZyh0KyJmaWVsZCIpLHI7cmV0dXJuIGV8fHRfZm9ybXNfX2dldE1zZyh0KX1mdW5jdGlvbiB0X2Zvcm1zX19nZXRDdXN0b21NZXNzYWdlKHQsZSl7dmFyIHI9dC5xdWVyeVNlbGVjdG9yKCIuanMtcnVsZS1lcnJvci0iK2UpO2lmKCFyKXJldHVybiIiO3ZhciBvPXIuZ2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsLW1zZyIpLG49bz9vLnJlcGxhY2UoL1xcXCcvZywiJiMzOTsiKTpvO2lmKG51bGwhPW4pcmV0dXJuIG47dmFyIGE9cj9yLnRleHRDb250ZW50LnJlcGxhY2UoL1xcXCcvZywiJiMzOTsiKToiIjtyZXR1cm4gci5zZXRBdHRyaWJ1dGUoImRhdGEtb3JpZ2luYWwtbXNnIixhKSxhfWZ1bmN0aW9uIHRfZm9ybXNfX2NyZWF0ZUVycm9yRm9jdXNIYXNoKCl7dmFyIHQ9e307cmV0dXJue2FkZDpmdW5jdGlvbiBlKHIsbyxuKXt2YXIgYT1vIGluc3RhbmNlb2YgRWxlbWVudDshdFtyXSYmbyYmYSYmKHRfZm9ybXNfX2FkZE1vdmVUb0lucHV0V2l0aEVycm9yQ2xpY2tIYW5kbGVyKG8sbiksdFtyXT1vKX19fWZ1bmN0aW9uIHRfZm9ybXNfX3Njcm9sbFRvSW5wdXRXaXRoRXJyb3IodCl7aWYodCl7dmFyIGU9dC5vYmoscj1lIGluc3RhbmNlb2YgRWxlbWVudDtpZigibm9uZSIhPT1lJiZyKXtpZih3aW5kb3cuaXNNb2JpbGUpe3ZhciBvPWUucXVlcnlTZWxlY3RvcigiaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QiKXx8ZTt0X29uRnVuY0xvYWQoInRfc2Nyb2xsVG8iLChmdW5jdGlvbigpe3Rfc2Nyb2xsVG8obyl9KSl9dF9mb3Jtc19fZm9jdXNJbnB1dChlKX19fWZ1bmN0aW9uIHRfZm9ybXNfX3Nob3dGb3JtRXJyb3JzQ29udGFpbmVycyh0KXt2YXIgZTt0LnF1ZXJ5U2VsZWN0b3JBbGwoIi5qcy1lcnJvcmJveC1hbGwiKS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0pKX1mdW5jdGlvbiB0X2Zvcm1zX19nZXRFbGVtZW50KHQpe3JldHVybiB0IGluc3RhbmNlb2YgRWxlbWVudD90OnRbMF19ZnVuY3Rpb24gdF9mb3Jtc19fZ2V0TXNnKHQpe3ZhciBlPVtdLHI9d2luZG93LnRfZm9ybXNfX2xhbmc7cmV0dXJuIGUuRU49e3N1Y2Nlc3NfdGl0bGU6IlRoYW5rIHlvdSEiLHN1Y2Nlc3NfdGV4dDoiRGF0YSBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5IixzdWNjZXNzX2J0bjoiRG9uZSIsc3VjY2Vzc19idG5fcmVkaXJlY3Q6IkNvbnRpbnVlIixzdWNjZXNzX2luZm86IllvdSdsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZGlyZWN0ZWQgaW46IixzdWNjZXNzX2luZm9fcmVkaXJlY3RfZXJyb3I6IlJlZGlyZWN0aW5nLi4uIixzdWNjZXNzOiJUaGFuayB5b3UhIFlvdXIgZGF0YSBoYXMgYmVlbiBzdWJtaXR0ZWQuIixzdWNjZXNzb3JkZXI6IlRoYW5rIHlvdSEgT3JkZXIgY3JlYXRlZC4gUGxlYXNlIHdhaXQgd2hpbGUgeW91IGFyZSByZWRpcmVjdGVkIHRvIHRoZSBwYXltZW50IHBhZ2UuLi4iLGVtYWlsOiJQbGVhc2UgZW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzIix1cmw6IlBsZWFzZSBwdXQgYSBjb3JyZWN0IFVSTCIscGhvbmU6IlBsZWFzZSBwdXQgYSBjb3JyZWN0IHBob25lIG51bWJlciIsbnVtYmVyOiJQbGVhc2UgcHV0IGEgY29ycmVjdCBudW1iZXIiLGRhdGU6IlBsZWFzZSBwdXQgYSBjb3JyZWN0IGRhdGUiLHRpbWU6IlBsZWFzZSBwdXQgYSBjb3JyZWN0IHRpbWUgKEhIOm1tKSIsbmFtZToiUGxlYXNlIHB1dCBhIG5hbWUiLG5hbWVydXM6IlBsZWFzZSBwdXQgYSBjb3JyZWN0IG5hbWUgKG9ubHkgY3lyaWxsaWMgbGV0dGVycykiLG5hbWVlbmc6IlBsZWFzZSBwdXQgYSBjb3JyZWN0IG5hbWUgKG9ubHkgbGF0aW4gbGV0dGVycykiLHN0cmluZzoiWW91IHB1dCBpbmNvcnJlY3Qgc3ltYm9scy4gT25seSBsZXR0ZXJzLCBudW1iZXJzIGFuZCBwdW5jdHVhdGlvbiBzeW1ib2xzIGFyZSBhbGxvd2VkIixyZXE6IlBsZWFzZSBmaWxsIG91dCBhbGwgcmVxdWlyZWQgZmllbGRzIixyZXFmaWVsZDoiUmVxdWlyZWQgZmllbGQiLG1pbmxlbmd0aDoiVmFsdWUgaXMgdG9vIHNob3J0IixtYXhsZW5ndGg6IlZhbHVlIHRvbyBiaWciLGVtcHR5ZmlsbDoiTm9uZSBvZiB0aGUgZmllbGRzIGFyZSBmaWxsZWQgaW4iLGNob3NldmFsdWU6IlBsZWFzZSBzZWxlY3QgYW4gYWRkcmVzcyBmcm9tIHRoZSBvcHRpb25zIixkZWxpdmVyeXJlcToiSXQgaXMgbm90IHBvc3NpYmxlIHRvIHBsYWNlIGFuIG9yZGVyIHdpdGhvdXQgZGVsaXZlcnkuIFBsZWFzZSByZWZyZXNoIHRoZSBwYWdlIGFuZCB0cnkgYWdhaW4iLHVuYXV0aG9yaXplZF9vcmRlcjoiUGxlYXNlIGxvZyBpbiB0byBwcm9jZWVkIHdpdGggeW91ciBvcmRlciIscHJvbW9jb2RlOiJQbGVhc2UgYWN0aXZhdGUgcHJvbW8gY29kZSBvciBjbGVhciBpbnB1dCBmaWVsZCIsY2FjaGVkX3BhZ2VfcG9wdXBfdGl0bGU6IkZvcm0gc3VibWlzc2lvbiBhdmFpbGFibGUgb24gb3JpZ2luYWwgcGFnZSIsY2FjaGVkX3BhZ2VfcG9wdXBfdGV4dDoiVG8gZmlsbCBvdXQgYW5kIHN1Ym1pdCB0aGUgZm9ybSwgZ28gdG8gdGhlIG9yaWdpbmFsIHBhZ2UiLGNhY2hlZF9wYWdlX3BvcHVwX2J0bjoiUHJvY2VlZCJ9LGUuUlU9e3N1Y2Nlc3NfdGl0bGU6ItCh0L/QsNGB0LjQsdC+ISIsc3VjY2Vzc190ZXh0OiLQlNCw0L3QvdGL0LUg0YPRgdC/0LXRiNC90L4g0L7RgtC/0YDQsNCy0LvQtdC90YsuIixzdWNjZXNzX2J0bjoi0KXQvtGA0L7RiNC+IixzdWNjZXNzX2J0bl9yZWRpcmVjdDoi0J/RgNC+0LTQvtC70LbQuNGC0YwiLHN1Y2Nlc3NfaW5mbzoi0JDQstGC0L7QvNCw0YLQuNGH0LXRgdC60LjQuSDQv9C10YDQtdGF0L7QtCDRh9C10YDQtdC3OiIsc3VjY2Vzc19pbmZvX3JlZGlyZWN0X2Vycm9yOiLQn9C10YDQtdC90LDQv9GA0LDQstC70LXQvdC40LUuLi4iLHN1Y2Nlc3M6ItCh0L/QsNGB0LjQsdC+ISDQlNCw0L3QvdGL0LUg0YPRgdC/0LXRiNC90L4g0L7RgtC/0YDQsNCy0LvQtdC90YsuIixzdWNjZXNzb3JkZXI6ItCh0L/QsNGB0LjQsdC+ISDQl9Cw0LrQsNC3INC+0YTQvtGA0LzQu9C10L0uINCf0L7QttCw0LvRg9C50YHRgtCwLCDQv9C+0LTQvtC20LTQuNGC0LUuINCY0LTQtdGCINC/0LXRgNC10YXQvtC0INC6INC+0L/Qu9Cw0YLQtS4uLiIsZW1haWw6ItCj0LrQsNC20LjRgtC1LCDQv9C+0LbQsNC70YPQudGB0YLQsCwg0LrQvtGA0YDQtdC60YLQvdGL0LkgZW1haWwiLHVybDoi0KPQutCw0LbQuNGC0LUsINC/0L7QttCw0LvRg9C50YHRgtCwLCDQutC+0YDRgNC10LrRgtC90YvQuSBVUkwiLHBob25lOiLQo9C60LDQttC40YLQtSwg0L/QvtC20LDQu9GD0LnRgdGC0LAsINC60L7RgNGA0LXQutGC0L3Ri9C5INC90L7QvNC10YAg0YLQtdC70LXRhNC+0L3QsCIsbnVtYmVyOiLQo9C60LDQttC40YLQtSwg0L/QvtC20LDQu9GD0LnRgdGC0LAsINC60L7RgNGA0LXQutGC0L3Ri9C5INC90L7QvNC10YAiLGRhdGU6ItCj0LrQsNC20LjRgtC1LCDQv9C+0LbQsNC70YPQudGB0YLQsCwg0LrQvtGA0YDQtdC60YLQvdGD0Y4g0LTQsNGC0YMiLHRpbWU6ItCj0LrQsNC20LjRgtC1LCDQv9C+0LbQsNC70YPQudGB0YLQsCwg0LrQvtGA0YDQtdC60YLQvdC+0LUg0LLRgNC10LzRjyAo0KfQpzrQnNCcKSIsbmFtZToi0KPQutCw0LbQuNGC0LUsINC/0L7QttCw0LvRg9C50YHRgtCwLCDQuNC80Y8iLG5hbWVydXM6ItCj0LrQsNC20LjRgtC1LCDQv9C+0LbQsNC70YPQudGB0YLQsCwg0LjQvNGPICjRgtC+0LvRjNC60L4g0LrQuNGA0LjQu9C70LjRhtCwKSIsbmFtZWVuZzoi0KPQutCw0LbQuNGC0LUsINC/0L7QttCw0LvRg9C50YHRgtCwLCDQuNC80Y8gKNGC0L7Qu9GM0LrQviDQu9Cw0YLQuNC90LjRhtCwKSIsc3RyaW5nOiLQktGLINC90LDQv9C40YHQsNC70Lgg0L3QtdC60L7RgNGA0LXQutGC0L3Ri9C1INGB0LjQvNCy0L7Qu9GLLiDQoNCw0LfRgNC10YjQtdC90Ysg0YLQvtC70YzQutC+INCx0YPQutCy0YssINGH0LjRgdC70LAg0Lgg0LfQvdCw0LrQuCDQv9GD0L3QutGC0YPQsNGG0LjQuCIscmVxOiLQn9C+0LbQsNC70YPQudGB0YLQsCwg0LfQsNC/0L7Qu9C90LjRgtC1INCy0YHQtSDQvtCx0Y/Qt9Cw0YLQtdC70YzQvdGL0LUg0L/QvtC70Y8iLHJlcWZpZWxkOiLQntCx0Y/Qt9Cw0YLQtdC70YzQvdC+0LUg0L/QvtC70LUiLG1pbmxlbmd0aDoi0KHQu9C40YjQutC+0Lwg0LrQvtGA0L7RgtC60L7QtSDQt9C90LDRh9C10L3QuNC1IixtYXhsZW5ndGg6ItCh0LvQuNGI0LrQvtC8INC00LvQuNC90L3QvtC1IixlbXB0eWZpbGw6ItCd0Lgg0L7QtNC90L4g0L/QvtC70LUg0L3QtSDQt9Cw0L/QvtC70L3QtdC90L4iLGNob3NldmFsdWU6ItCf0L7QttCw0LvRg9C50YHRgtCwLCDQstGL0LHQtdGA0LjRgtC1INCw0LTRgNC10YEg0LjQtyDQv9GA0LXQtNC70L7QttC10L3QvdGL0YUg0LLQsNGA0LjQsNC90YLQvtCyIixkZWxpdmVyeXJlcToi0J3QtdCy0L7Qt9C80L7QttC90L4g0L7RhNC+0YDQvNC40YLRjCDQt9Cw0LrQsNC3INCx0LXQtyDQtNC+0YHRgtCw0LLQutC4LiDQn9C+0LbQsNC70YPQudGB0YLQsCwg0L/QtdGA0LXQt9Cw0LPRgNGD0LfQuNGC0LUg0YHRgtGA0LDQvdC40YbRgyDQuCDQv9C+0L/RgNC+0LHRg9C50YLQtSDQtdGJ0LUg0YDQsNC3LiIsdW5hdXRob3JpemVkX29yZGVyOiLQn9C+0LbQsNC70YPQudGB0YLQsCwg0LDQstGC0L7RgNC40LfRg9C50YLQtdGB0Ywg0LTQu9GPINC+0YTQvtGA0LzQu9C10L3QuNGPINC30LDQutCw0LfQsCIscHJvbW9jb2RlOiLQkNC60YLQuNCy0LjRgNGD0LnRgtC1LCDQv9C+0LbQsNC70YPQudGB0YLQsCwg0L/RgNC+0LzQvtC60L7QtCDQuNC70Lgg0L7Rh9C40YHRgtC40YLQtSDQv9C+0LvQtSIsY2FjaGVkX3BhZ2VfcG9wdXBfdGl0bGU6ItCe0YLQv9GA0LDQstC60LAg0YTQvtGA0LzRiyDQtNC+0YHRgtGD0L/QvdCwINC90LAg0L7RgNC40LPQuNC90LDQu9GM0L3QvtC5INGB0YLRgNCw0L3QuNGG0LUiLGNhY2hlZF9wYWdlX3BvcHVwX3RleHQ6ItCn0YLQvtCx0Ysg0LfQsNC/0L7Qu9C90LjRgtGMINC4INC+0YLQv9GA0LDQstC40YLRjCDRhNC+0YDQvNGDINC/0LXRgNC10LnQtNC40YLQtSDQvdCwINC+0YDQuNCz0LjQvdCw0LvRjNC90YPRjiDRgdGC0YDQsNC90LjRhtGDIixjYWNoZWRfcGFnZV9wb3B1cF9idG46ItCf0LXRgNC10LnRgtC4In0sImZ1bmN0aW9uIj09dHlwZW9mIHRfZm9ybXNfX2dldERpY3QmJiJSVSIhPT1yJiYiRU4iIT09ciYmKGU9d2luZG93LnRfZm9ybXNfX2dldERpY3QoKSksZVtyXT9lW3JdW3RdOmUuRU5bdF19ZnVuY3Rpb24gY2hlY2tWZXJpZnlUaWxkYUNhcHRjaGEodCl7dmFyIGU9dHx8d2luZG93LmV2ZW50O2lmKC0xIT09ZS5vcmlnaW4uaW5kZXhPZih3aW5kb3cudGlsZGFGb3JtLmVuZHBvaW50KSl7dmFyIHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImpzLXRpbGRhc3BlYy1jYXB0Y2hhIiksbz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGlsZGFmb3JtY2FwdGNoYWJveCIpO2lmKCJjbG9zZWlmcmFtZSI9PWUuZGF0YSlyZXR1cm4gbyYmdF9yZW1vdmVFbChvKSx2b2lkKHImJnRfcmVtb3ZlRWwocikpO3ZhciBuPWUuZGF0YTtpZigib2JqZWN0Ij09dHlwZW9mIG4mJihuPUpTT04uc3RyaW5naWZ5KG4pLEFycmF5LmlzQXJyYXkod2luZG93LnRfanNlcnJvcnMpfHwod2luZG93LnRfanNlcnJvcnM9W10pLHdpbmRvdy50X2pzZXJyb3JzLnB1c2goe21lc3NhZ2U6IlJlY2FwdGNoYSByZXR1cm5lZCBvYmplY3QsIGluc3RlYWQgb2Ygc3RyaW5nOiAiK24sZmlsZW5hbWU6InRpbGRhLWZvcm0tMS4wIixsaW5lbm86MCxjb2xubzowfSkpLHIpe3IudmFsdWU9bixvJiZ0X3JlbW92ZUVsKG8pO3ZhciBhPXIuY2xvc2VzdCgiZm9ybSIpO2EmJnRfZm9ybXNfX3N1Ym1pdEV2ZW50KGEpfX19ZnVuY3Rpb24gdF9wYXJzZVNjcmlwdHModCxlKXt2YXIgcj10LnF1ZXJ5U2VsZWN0b3JBbGwoZSsic2NyaXB0Iik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChyLChmdW5jdGlvbihlKXtmb3IodmFyIHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iiksbz0wO288ZS5hdHRyaWJ1dGVzLmxlbmd0aDtvKyspe3ZhciBuPWUuYXR0cmlidXRlc1tvXTtyLnNldEF0dHJpYnV0ZShuLm5hbWUsbi52YWx1ZSl9aWYoZS5pbm5lckhUTUwubGVuZ3RoKXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZS5pbm5lckhUTUwpKSxlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHIsZSk7ZWxzZXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1lLmF0dHJpYnV0ZXMuc3JjLnZhbHVlLHQuYXBwZW5kQ2hpbGQoYSksdF9yZW1vdmVFbChlKX19KSl9ZnVuY3Rpb24gdF9mb3Jtc19fb25TdWNjZXNzKHQpe3dpbmRvdy5pc1JlZGlyZWN0RXJyb3I9ITE7dmFyIGU9dF9mb3Jtc19fZ2V0RWxlbWVudCh0KSxyPWUuY2xvc2VzdCgiLnIiKSxvPXIuZ2V0QXR0cmlidXRlKCJkYXRhLXBhcmVudHRwbGlkIil8fHIuZ2V0QXR0cmlidXRlKCJkYXRhLXJlY29yZC10eXBlIiksbj1lLnF1ZXJ5U2VsZWN0b3IoIi50LWZvcm1fX2lucHV0c2JveCIpLGE9Z2V0Q29tcHV0ZWRTdHlsZShuLG51bGwpLGk9cGFyc2VJbnQoYS5wYWRkaW5nVG9wKXx8MCxzPXBhcnNlSW50KGEucGFkZGluZ0JvdHRvbSl8fDAsbCxjLHU9bi5jbGllbnRIZWlnaHQtKGkrcykrKG4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldCksZD1lLnF1ZXJ5U2VsZWN0b3IoIi50LWZvcm1fX3N1Y2Nlc3Nib3giKSxtPWQ/ZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0OjAsXyxmPXdpbmRvdy5pbm5lckhlaWdodCxwPWRvY3VtZW50LmJvZHksdz1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsdj1NYXRoLm1heChwLnNjcm9sbEhlaWdodCxwLm9mZnNldEhlaWdodCx3LmNsaWVudEhlaWdodCx3LnNjcm9sbEhlaWdodCx3Lm9mZnNldEhlaWdodCk7aWYoMTIxPT1vKXt2YXIgaD1lLmdldEF0dHJpYnV0ZSgiZGF0YS1zdWNjZXNzLWNhbGxiYWNrIik7aCYmKG89aC5zcGxpdCgiX29uU3VjY2VzcyIpWzBdLnJlcGxhY2UoInQiLCIiKSl9dmFyIGc9InQiK28rIl9faW5wdXRzYm94X2hpZGRlbiIseT1bNzAyLDcwOCw4NjIsOTQ1LDEwMTQsMTExNF0sYj0hMDtfPXdpbmRvdy5pbm5lcldpZHRoPjk2MD9tLTIwMDptLTEwMDt2YXIgRT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC10aWxkYWxhYmVsIiksRj10X2Zvcm1zX19pc05ld1N1Y2Nlc3NCb3goZSk7aWYobT53aW5kb3cuc2Nyb2xsWXx8di11PGYtMTAwKUZ8fG4uY2xhc3NMaXN0LmFkZChnKSxmPnYmJkUmJnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dF9mYWRlT3V0KEUpfSksMzAwKTtlbHNle2Zvcih2YXIgQT0wO0E8eS5sZW5ndGg7QSsrKWlmKHlbQV09PW8pe2I9ITE7YnJlYWt9YiYmdF9mb3Jtc19fc2Nyb2xsQmVnaW5Gb3JtKF8pLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7Rnx8bi5jbGFzc0xpc3QuYWRkKGcpfSksNDAwKX12YXIgeD1lLmdldEF0dHJpYnV0ZSgiZGF0YS1zdWNjZXNzLXVybCIpO2lmKHgmJnRfZm9ybXNfX2hhbmRsZVJlZGlyZWN0KGUseCxkKSw4MzU9PW98fDg2Mj09byl7dmFyIFM9ci5xdWVyeVNlbGVjdG9yKCIudCIrbysiX19idG5fcHJldiIpLEM9ci5xdWVyeVNlbGVjdG9yKCIudCIrbysiX193cmFwcGVyIiksVD1yLnF1ZXJ5U2VsZWN0b3IoIi50IitvKyJfX3F1aXotZm9ybS13cmFwcGVyIik7UyYmKFMuc3R5bGUuZGlzcGxheT0ibm9uZSIpLEMmJihDLnN0eWxlLm1pbkhlaWdodD0iIiksVCYmKFQuc3R5bGUubWluSGVpZ2h0PSIiKX19ZnVuY3Rpb24gdF9mb3Jtc19faGFuZGxlUmVkaXJlY3QodCxlLHIpe3ZhciBvPTUwMDtpZih0X2Zvcm1zX19pc05ld1N1Y2Nlc3NCb3godCkpe3ZhciBuPShudWxsPT1yP3ZvaWQgMDpyLmdldEF0dHJpYnV0ZSgiZGF0YS1zdWNjZXNzLXRpdGxlIikpfHwiIixhPShudWxsPT1yP3ZvaWQgMDpyLmdldEF0dHJpYnV0ZSgiZGF0YS1zdWNjZXNzLW1lc3NhZ2UiKSl8fCIiLGk9Qm9vbGVhbihufHxhKSxzPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0aWxkYWZvcm1zdWNjZXNzcG9wdXBpbmZvZGlnaXQtbmV3Iik7aSYmZihvPTVlMyk7dmFyIGw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRpbGRhZm9ybXN1Y2Nlc3Nwb3B1cGxpbmstbmV3Iik7bCYmKGwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLGQpLGwuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGQpKTt2YXIgYz1udWxsLHU9bnVsbDtmdW5jdGlvbiBkKHQpe3ZhciBlO3QucHJldmVudERlZmF1bHQoKSxjbGVhclRpbWVvdXQoYyksbSh0LmN1cnJlbnRUYXJnZXQuZ2V0QXR0cmlidXRlKCJocmVmIikpfWZ1bmN0aW9uIG0odCl7d2luZG93LnRpbGRhRm9ybS5oYW5kbGVDbG9zZVBvcHVwKCksd2luZG93LmxvY2F0aW9uLmhyZWY9dH1mdW5jdGlvbiBfKCl7d2luZG93LmlzUmVkaXJlY3RFcnJvcj0hMCxzLnRleHRDb250ZW50PSIiLHRfZm9ybXNfX3Nob3dTdWNjZXNzYm94KHQpLG5ldyBNdXRhdGlvbk9ic2VydmVyKChmdW5jdGlvbih0LGUpeyhsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0aWxkYWZvcm1zdWNjZXNzcG9wdXBsaW5rLW5ldyIpKSYmKGUuZGlzY29ubmVjdCgpLGwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLGQpLGwuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGQpKX0pKS5vYnNlcnZlKGRvY3VtZW50LmJvZHkse2NoaWxkTGlzdDohMH0pfWZ1bmN0aW9uIGYodCl7dmFyIGU9dC8xZTM7cy50ZXh0Q29udGVudD1lO3ZhciByPXNldEludGVydmFsKChmdW5jdGlvbigpe2UtLSxzLnRleHRDb250ZW50PWUsZTw9MCYmY2xlYXJJbnRlcnZhbChyKX0pLDFlMyl9Yz1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3RyeXt2YXIgdD13aW5kb3cubG9jYXRpb24uaHJlZjttKGUpLGl8fCh3aW5kb3cudGlsZGFGb3JtLmhhbmRsZUNsb3NlUG9wdXAoKSx1PXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dHJ5e3dpbmRvdy5sb2NhdGlvbi5ocmVmPT09dCYmXygpfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoZSl9fSksMmUzKSl9Y2F0Y2gocil7Y29uc29sZS5lcnJvcihyKX19KSxvKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicGFnZXNob3ciLChmdW5jdGlvbigpe2NsZWFyVGltZW91dChjKSxjbGVhclRpbWVvdXQodSl9KSl9ZWxzZSBzZXRUaW1lb3V0KChmdW5jdGlvbigpe3dpbmRvdy5sb2NhdGlvbi5ocmVmPWV9KSxvKX1mdW5jdGlvbiB0X2Zvcm1zX19zY3JvbGxCZWdpbkZvcm0odCl7dmFyIGU9NDAwLHI9KHdpbmRvdy5wYWdlWU9mZnNldHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCktKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRUb3B8fDApLG89dC1yLG49MCxhPTE2O2Z1bmN0aW9uIGkodCl7dmFyIGU9dDtyZXR1cm4oZS89MjAwKTwxP28vMiplKmUqZStyOm8vMiooKGUtPTIpKmUqZSsyKStyfWZ1bmN0aW9uIHMoKXtuKz1hLHdpbmRvdy5zY3JvbGxUbygwLGkobikpLG48ZT9zZXRUaW1lb3V0KHMsYSk6ZG9jdW1lbnQuYm9keS5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtc2Nyb2xsYWJsZSIpfWRvY3VtZW50LmJvZHkuc2V0QXR0cmlidXRlKCJkYXRhLXNjcm9sbGFibGUiLCJ0cnVlIikscygpfWZ1bmN0aW9uIHRfZm9ybXNfX2dldENvbmRpdGlvbkNoZWNrSGFuZGxlcih0KXt2YXIgZT1BcnJheS5mcm9tKHQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtaGlkZGVuLWJ5LWNvbmRpdGlvbj0idHJ1ZSJdJykpLHI7cmV0dXJue2lzSGlkZGVuQnlDb25kaXRpb246ZnVuY3Rpb24gdChyKXtyZXR1cm4gZS5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gdD09PXJ8fHQuY29udGFpbnMocil9KSl9fX1mdW5jdGlvbiB0X2Zvcm1zX19nZXRSZWNGb3JtKHQpe3JldHVybiB0LnF1ZXJ5U2VsZWN0b3IoIi50LWZvcm0iKX1mdW5jdGlvbiB0X2Zvcm1zX19oYXNGb3JtSW5SZWModCl7cmV0dXJuISF0X2Zvcm1zX19nZXRSZWNGb3JtKHQpfWZ1bmN0aW9uIHRfZm9ybXNfX2luaXRGb3JtRmllbGRzKHQpe3ZhciBlO3RfZm9ybXNfX2dldFJlY0Zvcm0odCkmJnRfZm9ybXNfX3BhcnNlVmFyaWFibGVzKHQpfWZ1bmN0aW9uIHRfZm9ybXNfX2dldFZhcmlhYmxlUmVnZXhwKCl7cmV0dXJuL3t7KGZvcm18dGlsZGEpLihbQS160JAt0Y8wLTlfLV0rKSg/Oj0oW157fV0rKSk/fX0vZ31mdW5jdGlvbiB0X2Zvcm1zX19lbGVtZW50SGFzVmFyaWFibGVzKHQpe3ZhciBlO3JldHVybiB0X2Zvcm1zX19nZXRWYXJpYWJsZVJlZ2V4cCgpLnRlc3QodC50ZXh0Q29udGVudCl9ZnVuY3Rpb24gdF9mb3Jtc19fcmVwbGFjZVZhcmlhYmxlc1dpdGhQbGFjZWhvbGRlcnModCl7dmFyIGU9dF9mb3Jtc19fZmluZE1hdGNoaW5nVGV4dE5vZGVzKHQsdF9mb3Jtc19fZWxlbWVudEhhc1ZhcmlhYmxlcyk7cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5pbm5lckhUTUw9dC5pbm5lckhUTUwucmVwbGFjZSh0X2Zvcm1zX19nZXRWYXJpYWJsZVJlZ2V4cCgpLChmdW5jdGlvbih0LGUscixvKXtyZXR1cm4gdF9mb3Jtc19fYnVpbGRWYXJpYWJsZVBsYWNlaG9sZGVySFRNTCh0LGUscixvKX0pKX0pKSxlfWZ1bmN0aW9uIHRfZm9ybXNfX2J1aWxkVmFyaWFibGVQbGFjZWhvbGRlckhUTUwodCxlLHIsbyl7dmFyIG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO3JldHVybiBuLmNsYXNzTGlzdC5hZGQoInQtdmFyaWFibGUtcGxhY2Vob2xkZXIiKSxuLnNldEF0dHJpYnV0ZSgiZGF0YS12YXJpYWJsZSIsciksbi5zZXRBdHRyaWJ1dGUoImRhdGEtdmFyaWFibGUtZG9tYWluIixlKSxuLnNldEF0dHJpYnV0ZSgiZGF0YS1vcmlnaW5hbCIsdCksbyYmbi5zZXRBdHRyaWJ1dGUoImRhdGEtZGVmYXVsdC12YWx1ZSIsbyksbi50ZXh0Q29udGVudD1vfHxyLG4ub3V0ZXJIVE1MfWZ1bmN0aW9uIHRfZm9ybXNfX2ZpbmRNYXRjaGluZ1RleHROb2Rlcyh0LGUpe2Zvcih2YXIgcj1bXSxvPWRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIodCxOb2RlRmlsdGVyLlNIT1dfVEVYVCx7YWNjZXB0Tm9kZTpmdW5jdGlvbiB0KHIpe3JldHVybiBlKHIpP05vZGVGaWx0ZXIuRklMVEVSX0FDQ0VQVDpOb2RlRmlsdGVyLkZJTFRFUl9SRUpFQ1R9fSk7by5uZXh0Tm9kZSgpOyl7dmFyIG49by5jdXJyZW50Tm9kZTtbIlNDUklQVCIsIlNUWUxFIl0uaW5jbHVkZXMobi5wYXJlbnRFbGVtZW50LnRhZ05hbWUpfHxuLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bi1hdG9tX19pbnB1dHMtdGV4dGFyZWEiKXx8ci5wdXNoKG4ucGFyZW50RWxlbWVudCl9cmV0dXJuIHRfZm9ybXNfX3JlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKHIpfWZ1bmN0aW9uIHRfZm9ybXNfX2JpbmRGb3JtVmFyaWFibGVzVG9QbGFjZWhvbGRlcnModCxlKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIpe3ZhciBvLG49dF9mb3Jtc19fZ2V0VXNlZFZhcmlhYmxlcyhlLHt1bmlxdWU6ITB9KS5tYXAoKGZ1bmN0aW9uKHIpe2lmKHRfZm9ybXNfX2lzU3lzdGVtVmFyaWFibGUocikpcmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIHRfZm9ybXNfX3VwZGF0ZVN5c3RlbVZhcmlhYmxlKHQsZSxyKX0pKSxQcm9taXNlLnJlc29sdmUoKTt2YXIgbz10X2Zvcm1zX19maW5kRm9ybUZpZWxkKHQsci5uYW1lKTtyZXR1cm4gbz90X2Zvcm1zQXBpX19pbml0VGlsZGFGaWVsZChvKS50aGVuKChmdW5jdGlvbihvKXt2YXIgbj1mdW5jdGlvbiB0KGUpe3JldHVybiB0X2Zvcm1zX191cGRhdGVJbnB1dFZhcmlhYmxlKGUscixvKX07by5vbkNoYW5nZSgoZnVuY3Rpb24oKXtyZXR1cm4gbih0KX0pLHt1bmlxdWVLZXk6ci5uYW1lfSksZS5mb3JFYWNoKG4pfSkpOlByb21pc2UucmVzb2x2ZSgpfSkpO1Byb21pc2UuYWxsKG4pLnRoZW4ocil9KSl9ZnVuY3Rpb24gdF9mb3Jtc19fZ2V0U3lzdGVtVmFyaWFibGVzKCl7cmV0dXJue0xFQURfSUQ6ImxlYWRfaWQifX1mdW5jdGlvbiB0X2Zvcm1zX19pc1N5c3RlbVZhcmlhYmxlKHQpe3JldHVybiJ0aWxkYSI9PT10LmRvbWFpbiYmT2JqZWN0LnZhbHVlcyh0X2Zvcm1zX19nZXRTeXN0ZW1WYXJpYWJsZXMoKSkuaW5jbHVkZXModC5uYW1lKX1mdW5jdGlvbiB0X2Zvcm1zX191cGRhdGVWYXJpYWJsZXModCxlLHIpe3ZhciBvPXQucXVlcnlTZWxlY3RvckFsbCgnLnQtdmFyaWFibGUtcGxhY2Vob2xkZXJbZGF0YS12YXJpYWJsZT0iJytlLm5hbWUrJyJdW2RhdGEtdmFyaWFibGUtZG9tYWluPSInK2UuZG9tYWluKyciXScpO28ubGVuZ3RoJiZvLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZGF0YXNldCxvPWUudmFyaWFibGUsbj1lLmRlZmF1bHRWYWx1ZTt0LnRleHRDb250ZW50PXJ8fG58fG99KSl9ZnVuY3Rpb24gdF9mb3Jtc19fdXBkYXRlSW5wdXRWYXJpYWJsZSh0LGUscil7dmFyIG89ci5nZXRWYWx1ZSxuPXIuZGF0YSxhLGk9bygpLnZhbHVlO2lmKG4ub3duVmFyaWFudFRpdGxlJiZpJiYoaT1pLnJlcGxhY2Uobi5vd25WYXJpYW50VGl0bGUrIjogIiwiIikpLG4uaXNDb250YWN0TWV0aG9kKXt2YXIgcz1pW2UubmFtZV07aT1zLnR5cGVJbnB1dERpc3BsYXlUZXh0P3MudHlwZUlucHV0RGlzcGxheVRleHQ6aVtlLm5hbWVdLnZhbHVlfXRfZm9ybXNfX3VwZGF0ZVZhcmlhYmxlcyh0LGUsaSl9ZnVuY3Rpb24gdF9mb3Jtc19fdXBkYXRlU3lzdGVtVmFyaWFibGUodCxlLHIpe3ZhciBvPXRfZm9ybXNfX2dldFN5c3RlbVZhcmlhYmxlcygpLG49dC5xdWVyeVNlbGVjdG9yKCIudC1mb3JtIik7aWYobil7dmFyIGE9ci5uYW1lLGkscyxsO2lmKHIubmFtZT09PW8uTEVBRF9JRClhPShuLnRpbGRhVHJhbklkfHwiIikuc3BsaXQoIjoiKVsxXXx8IjAiO3RfZm9ybXNfX3VwZGF0ZVZhcmlhYmxlcyhlLHIsYSl9fWZ1bmN0aW9uIHRfZm9ybXNfX3VwZGF0ZUFsbFN5c3RlbVZhcmlhYmxlcyh0KXt2YXIgZT10LmNsb3Nlc3QoIi50LXJlYyIpLHIsbzt0X2Zvcm1zX19nZXRVc2VkVmFyaWFibGVzKFtlXSx7dW5pcXVlOiEwfSkuZmlsdGVyKHRfZm9ybXNfX2lzU3lzdGVtVmFyaWFibGUpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3RfZm9ybXNfX3VwZGF0ZVN5c3RlbVZhcmlhYmxlKGUsZSx0KX0pKX1mdW5jdGlvbiB0X2Zvcm1zX19nZXRVc2VkVmFyaWFibGVzKHQsZSl7dm9pZCAwPT09ZSYmKGU9e30pO3ZhciByLG89ZS51bmlxdWUsbj1BcnJheS5mcm9tKHQpLmZsYXRNYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBBcnJheS5mcm9tKHQucXVlcnlTZWxlY3RvckFsbCgiLnQtdmFyaWFibGUtcGxhY2Vob2xkZXIiKSkubWFwKChmdW5jdGlvbih0KXtyZXR1cm57bmFtZTp0LmdldEF0dHJpYnV0ZSgiZGF0YS12YXJpYWJsZSIpLGRvbWFpbjp0LmdldEF0dHJpYnV0ZSgiZGF0YS12YXJpYWJsZS1kb21haW4iKX19KSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5uYW1lJiZ0LmRvbWFpbn0pKX0pKTtpZihvKXt2YXIgYT17fTtyZXR1cm4gbi5maWx0ZXIoKGZ1bmN0aW9uKHQpe3ZhciBlPXQubmFtZSsifCIrdC5kb21haW47cmV0dXJuIWFbZV0mJihhW2VdPSEwLCEwKX0pKX1yZXR1cm4gbn1mdW5jdGlvbiB0X2Zvcm1zX19wYXJzZVZhcmlhYmxlcyh0KXt2YXIgZT10X2Zvcm1zX19yZXBsYWNlVmFyaWFibGVzV2l0aFBsYWNlaG9sZGVycyh0KSxyO3JldHVybiBlLmxlbmd0aD90X2Zvcm1zX19iaW5kRm9ybVZhcmlhYmxlc1RvUGxhY2Vob2xkZXJzKHQuY2xvc2VzdCgiLnQtcmVjIiksZSk6UHJvbWlzZS5yZXNvbHZlKCl9ZnVuY3Rpb24gdF9mb3Jtc19fZmluZEZvcm1GaWVsZCh0LGUpe3ZhciByPXQucXVlcnlTZWxlY3RvcignLnQtaW5wdXQtZ3JvdXBbZGF0YS1maWVsZC1uYW1lPSInK2UrJyJdJyksbztyZXR1cm4gcnx8QXJyYXkuZnJvbSh0LnF1ZXJ5U2VsZWN0b3JBbGwoJy50LWlucHV0LWdyb3VwW2RhdGEtZmllbGQtbmFtZSo9IicrZSsnIl0nKSkuZmluZCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkLW5hbWUiKS5zcGxpdCgiOyIpLmluY2x1ZGVzKGUpfSkpfWZ1bmN0aW9uIHRfZm9ybXNfX2NsZWFyRm9ybUlucHV0cyh0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXVwd2lkZ2V0LWNvbnRhaW5lcl9fZGF0YV90YWJsZV9hY3Rpb25zX3JlbW92ZSBzdmciKSxyPXQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT0idGV4dCJdJyksbz10LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9Im51bWJlciJdJyksbj10LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9ImVtYWlsIl0nKSxhPXQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT0idGVsIl0sIGlucHV0W3R5cGU9ImhpZGRlbiJdW2RhdGEtdGlsZGEtcnVsZT0icGhvbmUiXScpLGk9dC5xdWVyeVNlbGVjdG9yQWxsKCJ0ZXh0YXJlYSIpO2UuZm9yRWFjaCgoZnVuY3Rpb24odCl7dF90cmlnZ2VyRXZlbnQodCwiY2xpY2siKX0pKSxyLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QudmFsdWU9IiJ9KSksby5mb3JFYWNoKChmdW5jdGlvbih0KXt0LnZhbHVlPSIifSkpLG4uZm9yRWFjaCgoZnVuY3Rpb24odCl7dC52YWx1ZT0iIn0pKSxhLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QudmFsdWU9IiJ9KSksaS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmlubmVySFRNTD0iIix0LnZhbHVlPSIifSkpfWZ1bmN0aW9uIHRfZm9ybXNfX2NsZWFyRm9ybURhdGEodCl7InVuZGVmaW5lZCIhPXR5cGVvZiBqUXVlcnkmJmpRdWVyeSh0KS5kYXRhKCJ0aWxkYWZvcm1yZXN1bHQiLHt0cmFuSWQ6IjAiLG9yZGVySWQ6IjAifSksdC50aWxkYVRyYW5JZD0iMCIsdC50aWxkYU9yZGVySWQ9IjAifWZ1bmN0aW9uIHRfZm9ybXNfX3Nob3dTdWNjZXNzYm94KHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLmpzLXN1Y2Nlc3Nib3giKTtpZighZSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7dmFyIHI9dF9mb3Jtc19faXNOZXdTdWNjZXNzQm94KHQpLG89dF9mb3Jtc19fZ2V0U3VjY2Vzc0JveENvbnRlbnQoZSxyKTtyZXR1cm4gZS5pbm5lckhUTUw9cj8nXG5cdFx0XHQ8ZGl2IGNsYXNzPSJ0LWZvcm1fX3N1Y2Nlc3Nib3gtdGl0bGUiPicrby50aXRsZSsnPC9kaXY+XG5cdFx0XHQ8ZGl2IGNsYXNzPSJ0LWZvcm1fX3N1Y2Nlc3Nib3gtdGV4dCI+JytvLnRleHQrJzwvZGl2PlxuXHRcdFx0PGRpdiBjbGFzcz0idC1mb3JtX19zdWNjZXNzYm94LWJ0biI+JytvLmJ1dHRvbisiPC9kaXY+XG5cdFx0IjpvLnRleHQsdF9mb3Jtc19fcGFyc2VWYXJpYWJsZXMoZSkuZmluYWxseSgoZnVuY3Rpb24oKXsieSIhPT10LmdldEF0dHJpYnV0ZSgiZGF0YS1zdWNjZXNzLXBvcHVwIik/ZS5zdHlsZS5kaXNwbGF5PSJibG9jayI6dF9mb3Jtc19fc2hvd1N1Y2Nlc3NQb3B1cCh0LGUpfSkpfWZ1bmN0aW9uIHRfZm9ybXNfX2dldFN1Y2Nlc3NCb3hDb250ZW50KHQsZSl7dmFyIHI9dF9mb3Jtc19fZ2V0TXNnKCJzdWNjZXNzIiksbz10LmdldEF0dHJpYnV0ZSgiZGF0YS1zdWNjZXNzLW1lc3NhZ2UiKSxuPXt0ZXh0OiIiLHRpdGxlOiIiLGJ1dHRvbjoiIn07cmV0dXJuIG8/bi50ZXh0PW86dC50ZXh0Q29udGVudCYmdC5pbm5lclRleHR8fG98fCFyP24udGV4dD10LmlubmVySFRNTDpuLnRleHQ9cixlJiYob3x8KG4udGV4dD0iIiksbi50aXRsZT10LmdldEF0dHJpYnV0ZSgiZGF0YS1zdWNjZXNzLXRpdGxlIil8fCIiLG4uYnV0dG9uPXQuZ2V0QXR0cmlidXRlKCJkYXRhLXN1Y2Nlc3MtYnRuIil8fCIiKSxufWZ1bmN0aW9uIHRfZm9ybXNfX3Nob3dTdWNjZXNzUG9wdXAodCxlKXt2YXIgcixvLG4sYTtpZighIXQuY2xvc2VzdCgiLnQzOTYiKSl3aW5kb3cudGlsZGFGb3JtLnNob3dTdWNjZXNzUG9wdXAoZS5pbm5lckhUTUwpO2Vsc2V7dmFyIGk9e3RpdGxlOmUucXVlcnlTZWxlY3RvcigiLnQtZm9ybV9fc3VjY2Vzc2JveC10aXRsZSIpLHRleHQ6ZS5xdWVyeVNlbGVjdG9yKCIudC1mb3JtX19zdWNjZXNzYm94LXRleHQiKSxidG46ZS5xdWVyeVNlbGVjdG9yKCIudC1mb3JtX19zdWNjZXNzYm94LWJ0biIpfTt3aW5kb3cudGlsZGFGb3JtLnNob3dTdWNjZXNzUG9wdXBOZXcodCwobnVsbD09KHI9aS50ZXh0KT92b2lkIDA6ci5pbm5lckhUTUwpfHwiIiwobnVsbD09KG89aS50aXRsZSk/dm9pZCAwOm8uaW5uZXJIVE1MKXx8IiIsKG51bGw9PShuPWkuYnRuKT92b2lkIDA6bi5pbm5lckhUTUwpfHwiIil9fWZ1bmN0aW9uIHRfZm9ybXNfX2hhbmRsZVN1Y2Nlc3MoZm9ybSxvcHRpb25zKXt2YXIgX3JlZjI9b3B0aW9uc3x8e30sc3VjY2Vzc1VybD1fcmVmMi5zdWNjZXNzVXJsLF9yZWYyJHN1Y2Nlc3NDYWxsYmFjaz1fcmVmMi5zdWNjZXNzQ2FsbGJhY2ssc3VjY2Vzc0NhbGxiYWNrPXZvaWQgMD09PV9yZWYyJHN1Y2Nlc3NDYWxsYmFjaz8iIjpfcmVmMiRzdWNjZXNzQ2FsbGJhY2ssY2FsbGJhY2s9KHN1Y2Nlc3NDYWxsYmFja3x8IiIpLnJlcGxhY2UoIndpbmRvdy4iLCIiKTtpZihjYWxsYmFjayYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvd1tjYWxsYmFja10pInVuZGVmaW5lZCIhPXR5cGVvZiBqUXVlcnk/ZXZhbChjYWxsYmFjaysiKGpRdWVyeShmb3JtKSkiKTpldmFsKGNhbGxiYWNrKyIoZm9ybSkiKTtlbHNlIGlmKHN1Y2Nlc3NVcmwpe3ZhciBzdWNjZXNzQm94PWZvcm0ucXVlcnlTZWxlY3RvcigiLnQtZm9ybV9fc3VjY2Vzc2JveCIpO3RfZm9ybXNfX2hhbmRsZVJlZGlyZWN0KGZvcm0sc3VjY2Vzc1VybCxzdWNjZXNzQm94KX19ZnVuY3Rpb24gdF9mb3Jtc19fZ2V0Um9vdFpvbmUoKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLGU7cmV0dXJuIHQmJnQuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLXJvb3Qtem9uZSIpfHwiY29tIn1mdW5jdGlvbiB0X2Zvcm1zX19pc1Rlc3RlclBhZ2UoKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLGU7cmV0dXJuIHQmJiJ5Ij09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLXRzIil9ZnVuY3Rpb24gdF9mb3Jtc19faXNUZWFtKCl7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKTtyZXR1cm4gdCYmInkiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtdGUiKX1mdW5jdGlvbiB0X2Zvcm1zX19pc1F1aXoodCl7cmV0dXJuIHQmJnQuY2xvc2VzdCgiLnQtcXVpeiIpfWZ1bmN0aW9uIHRfZm9ybXNfX2lzSU9TKCl7cmV0dXJuL2lQaG9uZXxpUGFkfGlQb2QvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhd2luZG93Lk1TU3RyZWFtfWZ1bmN0aW9uIHRfZm9ybXNfX2lzTmV3U3VjY2Vzc0JveCh0KXtyZXR1cm4hIXQmJighdF9mb3Jtc19faXNRdWl6KHQpJiYhWyJ0Mzk2IiwidDQ0NyIsInQ2NTEiLCJ0NjUzIiwidDcwNiIsInQ3MDgiLCJ0OTQ1IiwidDExMjIiXS5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4gdC5jbG9zZXN0KCIuIitlKX0pKSk7dmFyIGUscn1mdW5jdGlvbiB0X2Zvcm1zX19yZW1vdmVEdXBsaWNhdGVFbGVtZW50cyh0KXt2YXIgZT1uZXcgTWFwO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBlLnNldCh0LCEwKX0pKSxBcnJheS5mcm9tKGUua2V5cygpKX1mdW5jdGlvbiB0X2Zvcm1zX19nZXRGb3JtRGF0YSh0KXt2YXIgZT0idGV4dC9wbGFpbiIscj0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04Ijt0cnl7dmFyIG87aWYodF9mb3Jtc19fc2hvdWxkRW5hYmxlRm9ybUFzSlNPTigpKXt2YXIgbj10X2Zvcm1zX19nZXRGb3JtRGF0YUpTT04odCksYT13aW5kb3cudGlsZGFGb3JtLnRpbGRhcGF5bWVudCYmd2luZG93LnRpbGRhRm9ybS50aWxkYXBheW1lbnQucHJvZHVjdHMsaT13aW5kb3cudGlsZGFGb3JtLnRpbGRhbWVtYmVyJiZPYmplY3Qua2V5cyh3aW5kb3cudGlsZGFGb3JtLnRpbGRhbWVtYmVyKS5sZW5ndGg+MDtyZXR1cm4hYSYmdC5jbG9zZXN0KCIudDcwNl9fb3JkZXJmb3JtIik/e3N0YXR1czoiaW52YWxpZCIsZGF0YToiIixjb250ZW50VHlwZToiIn06KE9iamVjdC5rZXlzKG4pLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuaW5jbHVkZXMoInRpbGRhZGVsaXZlcnktIikmJmRlbGV0ZSBuW3RdfSkpLGEmJihuLnRpbGRhcGF5bWVudD13aW5kb3cudGlsZGFGb3JtLnRpbGRhcGF5bWVudCksaSYmKG4udGlsZGFtZW1iZXI9d2luZG93LnRpbGRhRm9ybS50aWxkYW1lbWJlcikse3N0YXR1czoidmFsaWQiLGRhdGE6SlNPTi5zdHJpbmdpZnkobiksY29udGVudFR5cGU6ZX0pfXZhciBzLGw9dF9zZXJpYWxpemVBcnJheSh0KS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybi0xPT09dC5uYW1lLmluZGV4T2YoInRpbGRhZGVsaXZlcnktIil9KSk7aWYod2luZG93LnRpbGRhRm9ybS50aWxkYXBheW1lbnQmJndpbmRvdy50aWxkYUZvcm0udGlsZGFwYXltZW50LnByb2R1Y3RzKWwucHVzaCh7bmFtZToidGlsZGFwYXltZW50Iix2YWx1ZTpKU09OLnN0cmluZ2lmeSh3aW5kb3cudGlsZGFGb3JtLnRpbGRhcGF5bWVudCl9KTtlbHNlIGlmKHQuY2xvc2VzdCgiLnQ3MDZfX29yZGVyZm9ybSIpKXJldHVybntzdGF0dXM6ImludmFsaWQiLGRhdGE6IiIsY29udGVudFR5cGU6IiJ9O3JldHVybiB3aW5kb3cudGlsZGFGb3JtLnRpbGRhbWVtYmVyJiZPYmplY3Qua2V5cyh3aW5kb3cudGlsZGFGb3JtLnRpbGRhbWVtYmVyKS5sZW5ndGg+MCYmbC5wdXNoKHtuYW1lOiJ0aWxkYW1lbWJlciIsdmFsdWU6SlNPTi5zdHJpbmdpZnkod2luZG93LnRpbGRhRm9ybS50aWxkYW1lbWJlcil9KSx7c3RhdHVzOiJ2YWxpZCIsZGF0YTp0X2Zvcm1zX19mb3JtRGF0YShsKSxjb250ZW50VHlwZTpyfX1jYXRjaChjKXtyZXR1cm4gY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIHByZXBhcmUgZm9ybSBkYXRhIGZvciBwcm9jZXNzLiBFcnJvcjoiLGMpLHtzdGF0dXM6ImludmFsaWQiLGRhdGE6IiIsY29udGVudFR5cGU6IiJ9fX1mdW5jdGlvbiB0X2Zvcm1zX19zaG91bGRFbmFibGVGb3JtQXNKU09OKCl7dHJ5e3ZhciB0O3JldHVybiJ0cnVlIj09PW5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCkuZ2V0KCJzZW5kanNvbiIpfWNhdGNoKGUpe3JldHVybiExfX1mdW5jdGlvbiB0X3JlbW92ZUVsKHQpe3QmJnQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpfXZhciB0X2Zvcm1zX19odG1sRXZlbnRzPXtvbmJsdXI6MSxvbmNoYW5nZToxLG9uZm9jdXM6MSxvbnN1Ym1pdDoxLG9uY2xpY2s6MSxvbmRibGNsaWNrOjEsb25rZXlkb3duOjEsb25rZXlwcmVzczoxLG9ucGFzdGU6MSxvbmlucHV0OjF9O2Z1bmN0aW9uIHRfcmVtb3ZlRXZlbnRMaXN0ZW5lcih0LGUscil7dC5yZW1vdmVFdmVudExpc3RlbmVyP3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHIsITEpOnQuZGV0YWNoRXZlbnQmJnRfZm9ybXNfX2h0bWxFdmVudHNbIm9uIitlXT90LmRldGFjaEV2ZW50KCJvbiIrZSxyKTp0WyJvbiIrZV09bnVsbH1mdW5jdGlvbiB0X2FkZEV2ZW50TGlzdGVuZXIodCxlLHIsbyl7dC5hZGRFdmVudExpc3RlbmVyP3QuYWRkRXZlbnRMaXN0ZW5lcihlLHIsbyk6dC5hdHRhY2hFdmVudCYmdF9mb3Jtc19faHRtbEV2ZW50c1sib24iK2VdP3QuYXR0YWNoRXZlbnQoIm9uIitlLHIpOnRbIm9uIitlXT1yfWZ1bmN0aW9uIHRfc2VyaWFsaXplQXJyYXkodCl7Zm9yKHZhciBlPVtdLHI9dC5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dCwgdGV4dGFyZWEsIGJ1dHRvbiwgc2VsZWN0IiksbyxuPXRfZm9ybXNfX2dldENvbmRpdGlvbkNoZWNrSGFuZGxlcih0KS5pc0hpZGRlbkJ5Q29uZGl0aW9uLGE9MDthPHIubGVuZ3RoO2ErKylpZighKCFyW2FdLm5hbWV8fHJbYV0uZGlzYWJsZWR8fFsiZmlsZSIsInJlc2V0Iiwic3VibWl0IiwiYnV0dG9uIl0uaW5kZXhPZihyW2FdLnR5cGUpPi0xfHxuKHJbYV0pKSlpZigic2VsZWN0LW11bHRpcGxlIiE9PXJbYV0udHlwZSl7aWYoIShbImNoZWNrYm94IiwicmFkaW8iXS5pbmRleE9mKHJbYV0udHlwZSk+LTEpfHxyW2FdLmNoZWNrZWQpe3ZhciBpPXJbYV0ubmFtZSxzPXJbYV0udmFsdWU7ZS5wdXNoKHtuYW1lOmksdmFsdWU6c30pfX1lbHNlIGZvcih2YXIgbD1yW2FdLm9wdGlvbnMsYz0wO2M8bC5sZW5ndGg7YysrKWxbY10uc2VsZWN0ZWQmJmUucHVzaCh7bmFtZTpsW2NdLm5hbWUsdmFsdWU6bFtjXS52YWx1ZX0pO3JldHVybiBlfWZ1bmN0aW9uIHRfZm9ybXNfX2dldEZvcm1EYXRhSlNPTih0KXt2YXIgZT17fSxyPXQucXVlcnlTZWxlY3RvckFsbCgiaW5wdXQsIHRleHRhcmVhLCBidXR0b24sIHNlbGVjdCIpLG8sbj10X2Zvcm1zX19nZXRDb25kaXRpb25DaGVja0hhbmRsZXIodCkuaXNIaWRkZW5CeUNvbmRpdGlvbixhPWZ1bmN0aW9uIHQocixvKXtBcnJheS5pc0FycmF5KGVbcl0pfHwoZVtyXT1bXSksZVtyXS5wdXNoKG8pfTtyZXR1cm4gci5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgcj10Lm5hbWUsbz10LnR5cGUsaT10LmRpc2FibGVkLHM9dC52YWx1ZSxsPXQuY2hlY2tlZCxjPXQub3B0aW9ucztpZihyJiYhaSYmIW4odCkmJiFbImZpbGUiLCJyZXNldCIsInN1Ym1pdCIsImJ1dHRvbiJdLmluY2x1ZGVzKG8pJiYoIVsiY2hlY2tib3giLCJyYWRpbyJdLmluY2x1ZGVzKG8pfHxsKSlpZigic2VsZWN0LW11bHRpcGxlIiE9PW8paWYoci5pbmNsdWRlcygiW10iKSl7dmFyIHU9ci5yZXBsYWNlKCJbXSIsIiIpO2EodSxzKX1lbHNlIGVbcl09cztlbHNlIEFycmF5LmZyb20oY3x8W10pLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQuc2VsZWN0ZWR9KSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIGEocix0LnZhbHVlKX0pKX0pKSxlfWZ1bmN0aW9uIHRfYWRkQ2xhc3ModCxlKXtkb2N1bWVudC5ib2R5LmNsYXNzTGlzdD90LmNsYXNzTGlzdC5hZGQoZSk6dC5jbGFzc05hbWUrPSh0LmNsYXNzTmFtZT8iICI6IiIpK2V9ZnVuY3Rpb24gdF9yZW1vdmVDbGFzcyh0LGUpe2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0P3QuY2xhc3NMaXN0LnJlbW92ZShlKTp0LmNsYXNzTmFtZT10LmNsYXNzTmFtZS5yZXBsYWNlKG5ldyBSZWdFeHAoIihefFxccyspIitlKyIoXFxzK3wkKSIpLCIgIikucmVwbGFjZSgvXlxzKy8sIiIpLnJlcGxhY2UoL1xzKyQvLCIiKX1mdW5jdGlvbiB0X2hhc0NsYXNzKHQsZSl7cmV0dXJuIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0P3QuY2xhc3NMaXN0LmNvbnRhaW5zKGUpOm5ldyBSZWdFeHAoIihcXHN8XikiK2UrIihcXHN8JCkiKS50ZXN0KHQuY2xhc3NOYW1lKX1mdW5jdGlvbiB0X2Zvcm1zX19mb3JtRGF0YSh0KXtmb3IodmFyIGU9IiIscj0wO3I8dC5sZW5ndGg7cisrKSIiIT09ZSYmKGUrPSImIiksZSs9ZW5jb2RlVVJJQ29tcG9uZW50KHRbcl0ubmFtZSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudCh0W3JdLnZhbHVlKTtyZXR1cm4gZS5yZXBsYWNlKC8lMjAvZywiKyIpfWZ1bmN0aW9uIHRfZmFkZU91dCh0KXtpZigibm9uZSIhPT10LnN0eWxlLmRpc3BsYXkpdmFyIGU9MSxyPXNldEludGVydmFsKChmdW5jdGlvbigpe3Quc3R5bGUub3BhY2l0eT1lLChlLT0uMSk8PS4xJiYoY2xlYXJJbnRlcnZhbChyKSx0LnN0eWxlLmRpc3BsYXk9Im5vbmUiLHQuc3R5bGUub3BhY2l0eT1udWxsKX0pLDMwKX1mdW5jdGlvbiB0X2ZhZGVJbih0KXtpZigiYmxvY2siIT09dC5zdHlsZS5kaXNwbGF5KXt2YXIgZT0wO3Quc3R5bGUub3BhY2l0eT1lLHQuc3R5bGUuZGlzcGxheT0iYmxvY2siO3ZhciByPXNldEludGVydmFsKChmdW5jdGlvbigpe3Quc3R5bGUub3BhY2l0eT1lLChlKz0uMSk+PTEmJmNsZWFySW50ZXJ2YWwocil9KSwzMCl9fWZ1bmN0aW9uIHRfdHJpZ2dlckV2ZW50KHQsZSl7dmFyIHI7ZG9jdW1lbnQuY3JlYXRlRXZlbnQ/KHI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkhUTUxFdmVudHMiKSkuaW5pdEV2ZW50KGUsITAsITEpOmRvY3VtZW50LmNyZWF0ZUV2ZW50T2JqZWN0JiYoKHI9ZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3QoKSkuZXZlbnRUeXBlPWUpLHIuZXZlbnROYW1lPWUsdC5kaXNwYXRjaEV2ZW50P3QuZGlzcGF0Y2hFdmVudChyKTp0LmZpcmVFdmVudD90LmZpcmVFdmVudCgib24iK3IuZXZlbnRUeXBlLHIpOnRbZV0/dFtlXSgpOnRbIm9uIitlXSYmdFsib24iK2VdKCl9ZnVuY3Rpb24gdF9mb3Jtc19fcHJvY2Vzc0Zvcm1zSW5Qb3B1cCh0LGUpe2lmKHQuc3R5bGUuYmFja2dyb3VuZENvbG9yKXt2YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO3IuY2xhc3NOYW1lPSJ0LXN1Y2Nlc3MtcG9wdXAiO3ZhciBvPSJcblx0XHRcdCN0aWxkYWZvcm1zdWNjZXNzcG9wdXAtbmV3IHtcblx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogIit0LnN0eWxlLmJhY2tncm91bmRDb2xvcisiO1xuXHRcdFx0fSI7ci50ZXh0Q29udGVudD1vLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQocil9dmFyIG49ZS5jbG9zZXN0KCIudC1yZWMiKSxhPW4uZ2V0QXR0cmlidXRlKCJkYXRhLXBhcmVudHRwbGlkIil8fG4uZ2V0QXR0cmlidXRlKCJkYXRhLXJlY29yZC10eXBlIiksaTsiMTIxIj09PWEmJihhPXQucXVlcnlTZWxlY3RvcigiLnQtcG9wdXBfX2NvbnRhaW5lciIpLmdldEF0dHJpYnV0ZSgiZGF0YS1wb3B1cC10eXBlIil8fCIxMjEiKTt2YXIgcz0idCIrYSsiX2Nsb3NlUG9wdXAiLGw9bi5pZC5yZXBsYWNlKCJyZWMiLCIiKSxjPXdpbmRvd1tzXTsiZnVuY3Rpb24iPT10eXBlb2YgYyYmYyhsKX1mdW5jdGlvbiB0X2Zvcm1zX19kcmF3TmV3U3VjY2Vzc1BvcHVwKCl7cmV0dXJuJ1xuXHRcdDxkaXYgY2xhc3M9InQtZm9ybS1zdWNjZXNzLXBvcHVwIHQtZm9ybS1zdWNjZXNzLXBvcHVwX25ldyIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiIGlkPSJ0aWxkYWZvcm1zdWNjZXNzcG9wdXAtbmV3IlxuXHRcdFx0cm9sZT0iZGlhbG9nIlxuXHRcdFx0YXJpYS1tb2RhbD0idHJ1ZSJcblx0XHRcdHRhYmluZGV4PSItMSJcblx0XHRcdGFyaWEtbGFiZWw9IlN1Y2Nlc3MiXG5cdFx0PlxuXHRcdFx0PGRpdiBjbGFzcz0idC1mb3JtLXN1Y2Nlc3MtcG9wdXBfX3dyYXBwZXIiPlxuXG5cdFx0XHRcdDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0idC1mb3JtLXN1Y2Nlc3MtcG9wdXBfX2Nsb3NlLWljb24iIGlkPSJ0aWxkYWZvcm1zdWNjZXNzcG9wdXBjbG9zZS1uZXciIGFyaWEtbGFiZWw9ItCX0LDQutGA0YvRgtGMINC00LjQsNC70L7Qs9C+0LLQvtC1INC+0LrQvdC+Ij5cblx0XHRcdFx0XHQ8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjE0IiBoZWlnaHQ9IjE0IiB2aWV3Qm94PSIwIDAgMTQgMTQiIGZpbGw9Im5vbmUiPlxuXHRcdFx0XHRcdFx0PHBhdGggZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNyA1Ljg2MyAxLjEzOCAwIDAgMS4xMzggNS44NjIgNyAwIDEyLjg2MiAxLjEzNyAxNCA3IDguMTM3IDEyLjg2MyAxNCAxNCAxMi44NjIgOC4xMzggNyAxNCAxLjEzOCAxMi44NjMgMCA3LjAwMSA1Ljg2M1oiIGNsaXAtcnVsZT0iZXZlbm9kZCIgb3BhY2l0eT0iLjQiLz5cblx0XHRcdFx0XHQ8L3N2Zz5cblx0XHRcdFx0PC9idXR0b24+XG5cblx0XHRcdFx0PHN2ZyBjbGFzcz0idC1mb3JtLXN1Y2Nlc3MtcG9wdXBfX2NvbnRlbnQtaWNvbiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDEiIGhlaWdodD0iNDEiIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCAyMTAgMjEwIj5cblx0XHRcdFx0XHQ8cGF0aCBjbGFzcz0idC1mb3JtLXN1Y2Nlc3MtcG9wdXBfX2NvbnRlbnQtaWNvbi1iYWNrZ3JvdW5kIlxuXHRcdFx0XHRcdFx0ZD0iTSA4Ni4wNjk2IDEwLjI3NzcgQyA5Ny43NDQzIC0wLjk3Mzg1MSAxMTYuMTA0IC0wLjk3Mzg1MSAxMjcuNzc5IDEwLjI3NzcgTCAxMjcuNzc5IDEwLjI3NzcgQyAxMzMuODgxIDE2LjE1ODUgMTQyLjEzNiAxOS4xOTU0IDE1MC41NTEgMTguNjU0NyBMIDE1MC41NTEgMTguNjU0NyBDIDE2Ni42NSAxNy42MjAzIDE4MC43MTQgMjkuNTQ4MiAxODIuNTAyIDQ1Ljc1MjEgTCAxODIuNTAyIDQ1Ljc1MjEgQyAxODMuNDM2IDU0LjIyMTQgMTg3LjgyOSA2MS45MTExIDE5NC42MTkgNjYuOTYzNiBMIDE5NC42MTkgNjYuOTYzNiBDIDIwNy42MDkgNzYuNjMwMiAyMTAuNzk4IDk0LjkwNDkgMjAxLjg2MiAxMDguNDc5IEwgMjAxLjg2MiAxMDguNDc5IEMgMTk3LjE5MSAxMTUuNTc0IDE5NS42NjUgMTI0LjMxOCAxOTcuNjUzIDEzMi42IEwgMTk3LjY1MyAxMzIuNiBDIDIwMS40NTcgMTQ4LjQ0NSAxOTIuMjc3IDE2NC41MTUgMTc2Ljc5OSAxNjkuMTA4IEwgMTc2Ljc5OSAxNjkuMTA4IEMgMTY4LjcwOSAxNzEuNTA5IDE2MS45NzkgMTc3LjIxNiAxNTguMjM1IDE4NC44NTIgTCAxNTguMjM1IDE4NC44NTIgQyAxNTEuMDcyIDE5OS40NjEgMTMzLjgxOSAyMDUuODA3IDExOS4wNDEgMTk5LjI3IEwgMTE5LjA0MSAxOTkuMjcgQyAxMTEuMzE3IDE5NS44NTMgMTAyLjUzMiAxOTUuODUzIDk0LjgwNzUgMTk5LjI3IEwgOTQuODA3NSAxOTkuMjcgQyA4MC4wMjk0IDIwNS44MDcgNjIuNzc2NiAxOTkuNDYxIDU1LjYxMzUgMTg0Ljg1MiBMIDU1LjYxMzUgMTg0Ljg1MiBDIDUxLjg2OTUgMTc3LjIxNiA0NS4xMzk2IDE3MS41MDkgMzcuMDQ5NSAxNjkuMTA4IEwgMzcuMDQ5NSAxNjkuMTA4IEMgMjEuNTcxNCAxNjQuNTE1IDEyLjM5MTMgMTQ4LjQ0NSAxNi4xOTQ4IDEzMi42IEwgMTYuMTk0OCAxMzIuNiBDIDE4LjE4MjggMTI0LjMxOCAxNi42NTczIDExNS41NzQgMTEuOTg2NyAxMDguNDc5IEwgMTEuOTg2NyAxMDguNDc5IEMgMy4wNTA4NCA5NC45MDQ5IDYuMjM5MDIgNzYuNjMwMiAxOS4yMjk1IDY2Ljk2MzYgTCAxOS4yMjk1IDY2Ljk2MzYgQyAyNi4wMTk0IDYxLjkxMTEgMzAuNDExOSA1NC4yMjE0IDMxLjM0NjIgNDUuNzUyMSBMIDMxLjM0NjIgNDUuNzUyMSBDIDMzLjEzMzkgMjkuNTQ4MiA0Ny4xOTg0IDE3LjYyMDMgNjMuMjk3NiAxOC42NTQ3IEwgNjMuMjk3NiAxOC42NTQ3IEMgNzEuNzEyMiAxOS4xOTU0IDc5Ljk2NzYgMTYuMTU4NSA4Ni4wNjk2IDEwLjI3NzcgTCA4Ni4wNjk2IDEwLjI3NzcgWiJcblx0XHRcdFx0XHRcdGZpbGw9IiMzMEM1NDYiPlxuXHRcdFx0XHRcdDwvcGF0aD5cblx0XHRcdFx0XHQ8cGF0aCBjbGFzcz0idC1mb3JtLXN1Y2Nlc3MtcG9wdXBfX2NvbnRlbnQtaWNvbi1jaGVjayJcblx0XHRcdFx0XHRcdGQ9Ik0gNjYuNzY0NSAxMDcuMjU4IEwgOTAuNjYxNyAxMjkuODQzIEwgMTQzLjIzNSA4MC4xNTciXG5cdFx0XHRcdFx0XHRzdHJva2U9IndoaXRlIlxuXHRcdFx0XHRcdFx0c3Ryb2tlLXdpZHRoPSIxNC43MDU5IlxuXHRcdFx0XHRcdFx0c3Ryb2tlLWxpbmVjYXA9InJvdW5kIlxuXHRcdFx0XHRcdFx0c3Ryb2tlLWxpbmVqb2luPSJyb3VuZCJcblx0XHRcdFx0XHRcdGZpbGw9Im5vbmUiXG5cdFx0XHRcdFx0XHRwYXRoTGVuZ3RoPSIxIj5cblx0XHRcdFx0XHQ8L3BhdGg+XG5cdFx0XHRcdDwvc3ZnPlxuXG5cdFx0XHRcdDxkaXYgY2xhc3M9InQtZm9ybS1zdWNjZXNzLXBvcHVwX190aXRsZSB0LXRpdGxlIiBpZD0idGlsZGFmb3Jtc3VjY2Vzc3BvcHVwdGl0bGUtbmV3Ij48L2Rpdj5cblxuXHRcdFx0XHQ8ZGl2IGNsYXNzPSJ0LWZvcm0tc3VjY2Vzcy1wb3B1cF9fdGV4dCB0LXRleHQiIGlkPSJ0aWxkYWZvcm1zdWNjZXNzcG9wdXB0ZXh0LW5ldyI+PC9kaXY+XG5cblx0XHRcdFx0PGEgaHJlZj0iIiBjbGFzcz0idC1mb3JtLXN1Y2Nlc3MtcG9wdXBfX2J1dHRvbiB0LWJ0biB0LWZvcm0tc3VjY2Vzcy1wb3B1cF9oaWRkZW4iIGlkPSJ0aWxkYWZvcm1zdWNjZXNzcG9wdXBsaW5rLW5ldyI+PC9hPlxuXG5cdFx0XHRcdDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0idC1mb3JtLXN1Y2Nlc3MtcG9wdXBfX2J1dHRvbiB0LWJ0biB0LWZvcm0tc3VjY2Vzcy1wb3B1cF9oaWRkZW4iIGlkPSJ0aWxkYWZvcm1zdWNjZXNzcG9wdXBidG4tbmV3Ij48L2J1dHRvbj5cblxuXHRcdFx0XHQ8ZGl2IGNsYXNzPSJ0LWZvcm0tc3VjY2Vzcy1wb3B1cF9faW5mbyB0LWZvcm0tc3VjY2Vzcy1wb3B1cF9oaWRkZW4iIGlkPSJ0aWxkYWZvcm1zdWNjZXNzcG9wdXBpbmZvLW5ldyI+XG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9InQtZm9ybS1zdWNjZXNzLXBvcHVwX19pbmZvLXRleHQgdC10ZXh0IiBpZD0idGlsZGFmb3Jtc3VjY2Vzc3BvcHVwaW5mb3RleHQtbmV3Ij48L3NwYW4+XG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9InQtZm9ybS1zdWNjZXNzLXBvcHVwX19pbmZvLXRpbWVyIHQtdGV4dCI+XG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz0idC1mb3JtLXN1Y2Nlc3MtcG9wdXBfX2luZm8tZGlnaXQiIGlkPSJ0aWxkYWZvcm1zdWNjZXNzcG9wdXBpbmZvZGlnaXQtbmV3Ij48L3NwYW4+XG5cblx0XHRcdFx0XHRcdDxzdmcgd2lkdGg9IjE4IiBoZWlnaHQ9IjE4IiB2aWV3Qm94PSIwIDAgMTggMTgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+XG5cdFx0XHRcdFx0XHRcdDxwYXRoIGQ9Ik05IDAuNkM3LjMzODY0IDAuNiA1LjcxNDU4IDEuMDkyNjUgNC4zMzMyMSAyLjAxNTY2QzIuOTUxODQgMi45Mzg2NiAxLjg3NTE5IDQuMjUwNTYgMS4yMzk0MSA1Ljc4NTQ2QzAuNjAzNjM2IDcuMzIwMzYgMC40MzcyODggOS4wMDkzMiAwLjc2MTQwNCAxMC42Mzg4QzEuMDg1NTIgMTIuMjY4MiAxLjg4NTU0IDEzLjc2NDkgMy4wNjAzIDE0LjkzOTdDNC4yMzUwNiAxNi4xMTQ1IDUuNzMxOCAxNi45MTQ1IDcuMzYxMjQgMTcuMjM4NkM4Ljk5MDY4IDE3LjU2MjcgMTAuNjc5NiAxNy4zOTY0IDEyLjIxNDUgMTYuNzYwNkMxMy43NDk0IDE2LjEyNDggMTUuMDYxMyAxNS4wNDgyIDE1Ljk4NDMgMTMuNjY2OEMxNi45MDczIDEyLjI4NTQgMTcuNCAxMC42NjE0IDE3LjQgOSIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLXdpZHRoPSIxLjIiLz5cblx0XHRcdFx0XHRcdDwvc3ZnPlxuXHRcdFx0XHRcdDwvc3Bhbj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2Rpdj4nfWZ1bmN0aW9uIHRfZm9ybXNfX3RyYXBGb2N1cyh0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoJ2EsIGJ1dHRvbiwgaW5wdXQ6bm90KFt0eXBlPSJoaWRkZW4iXSk6bm90KC5qcy1mb3JtLXNwZWMtY29tbWVudHMpLCBzZWxlY3QsIHRleHRhcmVhLCBlbWJlZCwgdmlkZW8sIGlmcmFtZSwgW3RhYmluZGV4PSIwIl0nKSxyPWVbMF0sbz1lW2UubGVuZ3RoLTFdO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLChmdW5jdGlvbih0KXtpZihkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygidC1ib2R5X3BvcHVwc2hvd2VkIikpe3ZhciBlPSJUYWIiPT09dC5rZXl8fDk9PT10LmtleUNvZGUsbjsoZXx8ZSYmdC5zaGlmdEtleSkmJih0LnNoaWZ0S2V5JiZkb2N1bWVudC5hY3RpdmVFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygidC1wb3B1cF9zaG93IikmJm8uZm9jdXMoKSwiVGFiIiE9PXQua2V5fHx0LnNoaWZ0S2V5fHxkb2N1bWVudC5hY3RpdmVFbGVtZW50IT09b3x8KHQucHJldmVudERlZmF1bHQoKSxyLmZvY3VzKCkpLCJUYWIiPT09dC5rZXkmJnQuc2hpZnRLZXkmJmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT1yJiYodC5wcmV2ZW50RGVmYXVsdCgpLG8uZm9jdXMoKSkpfX0pKX1mdW5jdGlvbiB0X2Zvcm1zX19pc0NhY2hlZFBhZ2UoKXt0cnl7Zm9yKHZhciB0PW5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpLGU9dC5ob3N0bmFtZSxyPXQuaHJlZixvLG49MCxhPVt7ZG9tYWluczpbIndlYmNhY2hlLmdvb2dsZXVzZXJjb250ZW50LmNvbSJdLHVybFBhdHRlcm46LyhefCZ8XD8pcT1jYWNoZTovfSx7ZG9tYWluczpbInd3dy5nb29nbGUuY29tIl0sdXJsUGF0dGVybjovXC9hbXBcL3NcLy99LHtkb21haW5zOlsidC5tZSJdLHVybFBhdHRlcm46L1wvd2ViXC8vfSx7ZG9tYWluczpbImR6ZW4ucnUiXSx1cmxQYXR0ZXJuOi9cL2F3YXlcPy99LHtkb21haW5zOlsieWFuZGV4LnJ1IiwieWFuZGV4d2ViY2FjaGUubmV0IiwiYXJjaGl2ZS50b2RheSIsImFyY2hpdmUucGgiLCJhcmNoaXZlLmlzIiwid2ViLmFyY2hpdmUub3JnIiwiZ2hvc3RhcmNoaXZlLm9yZyIsImNhY2hlZHZpZXcuY29tIl19XTtuPGEubGVuZ3RoO24rKyl7dmFyIGk9YVtuXSxzPWkuZG9tYWlucy5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gZT09PXR9KSksbD0haS51cmxQYXR0ZXJufHxpLnVybFBhdHRlcm4udGVzdChyKTtpZihzJiZsKXJldHVybiEwfXJldHVybiExfWNhdGNoKGMpe3JldHVybiExfX1mdW5jdGlvbiB0X2Zvcm1zX19nZXRDYW5vbmljYWxVcmwoKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdsaW5rW3JlbD0iY2Fub25pY2FsIl0nKTtyZXR1cm4gdD90LmdldEF0dHJpYnV0ZSgiaHJlZiIpOiIifWZ1bmN0aW9uIHRfZm9ybXNfX3Nob3dXcm9uZ1BhZ2VVcmxNZXNzYWdlKHQpe2lmKHQpe3ZhciBlPSJ0aWxkYWZvcm1zLW9yaWdpbi11cmwtcG9wdXAtbm90aWZpY2F0aW9uIixyPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpO2lmKHIpaShyKTtlbHNle3ZhciBvPSdcblx0XHQ8ZGl2IGlkPSInK2UrJyIgY2xhc3M9InQtZm9ybS1zdWNjZXNzLXBvcHVwIHQtZm9ybS1zdWNjZXNzLXBvcHVwX25ldyIgcm9sZT0iZGlhbG9nIiBhcmlhLW1vZGFsPSJ0cnVlIiB0YWJpbmRleD0iLTEiIGFyaWEtbGFiZWw9Ildyb25nIFBhZ2UgVVJMIj5cblx0XHRcdDxkaXYgY2xhc3M9InQtZm9ybS1zdWNjZXNzLXBvcHVwX193cmFwcGVyIj5cblxuXHRcdFx0XHQ8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InQtZm9ybS1zdWNjZXNzLXBvcHVwX19jbG9zZS1pY29uIiBhcmlhLWxhYmVsPSLQl9Cw0LrRgNGL0YLRjCDQtNC40LDQu9C+0LPQvtCy0L7QtSDQvtC60L3QviI+XG5cdFx0XHRcdFx0PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNCIgaGVpZ2h0PSIxNCIgdmlld0JveD0iMCAwIDE0IDE0IiBmaWxsPSJub25lIj5cblx0XHRcdFx0XHRcdDxwYXRoIGZpbGw9IiMwMDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTcgNS44NjMgMS4xMzggMCAwIDEuMTM4IDUuODYyIDcgMCAxMi44NjIgMS4xMzcgMTQgNyA4LjEzNyAxMi44NjMgMTQgMTQgMTIuODYyIDguMTM4IDcgMTQgMS4xMzggMTIuODYzIDAgNy4wMDEgNS44NjNaIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIG9wYWNpdHk9Ii40Ij48L3BhdGg+XG5cdFx0XHRcdFx0PC9zdmc+XG5cdFx0XHRcdDwvYnV0dG9uPlxuXG5cdFx0XHRcdDxzdmcgY2xhc3M9InQtZm9ybS1zdWNjZXNzLXBvcHVwX19jb250ZW50LWljb24iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQxIiBoZWlnaHQ9IjQxIiB2aWV3Qm94PSIwIDAgMjEgMjEiIGZpbGw9Im5vbmUiIGRhdGEtYXBwPSJYeXJpcyI+XG5cdFx0XHRcdFx0PGNpcmNsZSBjeD0iMTAuNSIgY3k9IjEwLjUiIHI9IjEwLjUiIGZpbGw9IiNGODdBNjEiLz5cblx0XHRcdFx0XHQ8cGF0aCBkPSJNMTAuMDc4MSAxMy4xNTYyTDkuNjQ4NDQgNy4wODU5NFY0LjU0Njg4SDExLjM5MDZWNy4wODU5NEwxMC45ODQ0IDEzLjE1NjJIMTAuMDc4MVpNOS43MTA5NCAxNlYxNC4zOTg0SDExLjMyODFWMTZIOS43MTA5NFoiIGZpbGw9IndoaXRlIi8+XG5cdFx0XHRcdDwvc3ZnPlxuXG5cdFx0XHRcdDxkaXYgY2xhc3M9InQtZm9ybS1zdWNjZXNzLXBvcHVwX190aXRsZSB0LXRpdGxlIj4nK3RfZm9ybXNfX2dldE1zZygiY2FjaGVkX3BhZ2VfcG9wdXBfdGl0bGUiKSsnPC9kaXY+XG5cblx0XHRcdFx0PGRpdiBjbGFzcz0idC1mb3JtLXN1Y2Nlc3MtcG9wdXBfX3RleHQgdC10ZXh0Ij4nK3RfZm9ybXNfX2dldE1zZygiY2FjaGVkX3BhZ2VfcG9wdXBfdGV4dCIpKyc8L2Rpdj5cblxuXHRcdFx0XHQ8YSBocmVmPSInK3QrJyIgY2xhc3M9InQtZm9ybS1zdWNjZXNzLXBvcHVwX19idXR0b24gdC1idG4iPicrdF9mb3Jtc19fZ2V0TXNnKCJjYWNoZWRfcGFnZV9wb3B1cF9idG4iKSsiPC9hPlxuXHRcdFx0PC9kaXY+XG5cdFx0PC9kaXY+XG5cdCI7ZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWVuZCIsbyk7dmFyIG49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSksYT1uLnF1ZXJ5U2VsZWN0b3IoIi50LWZvcm0tc3VjY2Vzcy1wb3B1cF9fY2xvc2UtaWNvbiIpO3RfYWRkRXZlbnRMaXN0ZW5lcihuLCJjbGljayIsKGZ1bmN0aW9uKHQpe3ZhciBlPXR8fHdpbmRvdy5ldmVudCxyOyhlLnRhcmdldHx8ZS5zcmNFbGVtZW50KT09PXRoaXMmJnMobil9KSksdF9hZGRFdmVudExpc3RlbmVyKGEsImNsaWNrIiwoZnVuY3Rpb24oKXtzKG4pfSkpLGkobil9fWZ1bmN0aW9uIGkodCl7dF9mYWRlSW4odCksdF9hZGRDbGFzcyhkb2N1bWVudC5ib2R5LCJ0LWJvZHlfc3VjY2Vzcy1wb3B1cC1zaG93ZWQiKSx0X2Zvcm1zX19pc0lPUygpJiZzZXRUaW1lb3V0KChmdW5jdGlvbigpe3dpbmRvdy50aWxkYUZvcm0ubG9ja0JvZHlTY3JvbGwoKX0pLDUwMCksdF9mb3Jtc19fdHJhcEZvY3VzKHQpfWZ1bmN0aW9uIHModCl7dF9yZW1vdmVDbGFzcyhkb2N1bWVudC5ib2R5LCJ0LWJvZHlfc3VjY2Vzcy1wb3B1cC1zaG93ZWQiKSx0X2Zvcm1zX19pc0lPUygpJiZ3aW5kb3cudGlsZGFGb3JtLnVubG9ja0JvZHlTY3JvbGwoKSx0X2ZhZGVPdXQodCl9fWZ1bmN0aW9uIHRfZm9ybXNfX3Byb2Nlc3NHZXRQYXJhbWV0ZXJzKHQpe2lmKHZvaWQgMD09PXQmJih0PXt9KSx3aW5kb3cuVVJMU2VhcmNoUGFyYW1zJiYicHVibGlzaGVkIj09PXRfZm9ybXNfX2dldFRpbGRhTW9kZSgpKXt2YXIgZT1uZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO2lmKG51bGwhPWUmJmUuc2l6ZSl7dmFyIHIsbz10LmN1cnJlbnRUYXJnZXQsbj1bIi50LXNlbGVjdCIsIi50LWlucHV0IiwiLnQtcmF0ZSIsIi50LXJhZGlvIiwiLnQtY2hlY2tib3giLCIudC1pbWctc2VsZWN0IiwiLnQtcmFuZ2UiLCIudC1jaGVja2JveGVzX19oaWRkZW5pbnB1dCIsIi50LWltZy1zZWxlY3RfX2hpZGRlbmlucHV0IiwnW3R5cGU9ImhpZGRlbiJdJ107b3x8KG49bi5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiIuanMtZm9ybS1wcm9jY2VzcyAiK3R9KSkpO3ZhciBhPW98fGRvY3VtZW50LGk9QXJyYXkuZnJvbShhLnF1ZXJ5U2VsZWN0b3JBbGwobikpLHM7aWYoaS5sZW5ndGgpbmV3IFNldChpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0QXR0cmlidXRlKCJuYW1lIil9KSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdH0pKSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIHI9ZS5nZXQoImZvcm0tc2V0dGVyLSIrdCk7aWYocil7dmFyIG89aS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSgibmFtZSIpPT09dH0pKTsobz10X2Zvcm1zX19pbmNsdWRlQ2hlY2tib3hlc0ZvcklucHV0TGlzdChvKSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHRfZm9ybXNfX3NldEdldFBhcmFtZXRlclRvRmllbGQodCxyKX0pKX19KSl9fX1mdW5jdGlvbiB0X2Zvcm1zX19pbmNsdWRlQ2hlY2tib3hlc0ZvcklucHV0TGlzdCh0KXtyZXR1cm4gdC5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7aWYoZS5jbGFzc0xpc3QuY29udGFpbnMoInQtY2hlY2tib3hlc19faGlkZGVuaW5wdXQiKXx8ZS5jbGFzc0xpc3QuY29udGFpbnMoInQtaW1nLXNlbGVjdF9faGlkZGVuaW5wdXQiKSl7dmFyIHI9ZS5jbG9zZXN0KCIudC1pbnB1dC1ibG9jayIpLG89QXJyYXkuZnJvbSgobnVsbD09cj92b2lkIDA6ci5xdWVyeVNlbGVjdG9yQWxsKCIudC1jaGVja2JveCwgLnQtaW1nLXNlbGVjdCIpKXx8W10pO3QucHVzaC5hcHBseSh0LG8pfWVsc2UgdC5wdXNoKGUpO3JldHVybiB0fSksW10pfWZ1bmN0aW9uIHRfZm9ybXNfX3NldEdldFBhcmFtZXRlclRvRmllbGQodCxlKXtpZighWyJ0ZWwiLCJudW1iZXIiLCJyYW5nZSJdLmluY2x1ZGVzKHQudHlwZSl8fCFpc05hTihlKSl7dmFyIHI9NTAwO1siY2hlY2tib3giLCJyYWRpbyJdLmluY2x1ZGVzKHQudHlwZSk/bCgoZnVuY3Rpb24oKXt2YXIgbixzPWUuc3BsaXQoIiwiKSxsPShudWxsPT10fHxudWxsPT0obj10LnZhbHVlKT92b2lkIDA6bi50cmltKCkpfHwiIjtzLmluY2x1ZGVzKGwpJiYodC5jaGVja2VkPSEwLCJjaGVja2JveCI9PT10LnR5cGUmJm8oKSx0LmNsYXNzTGlzdC5jb250YWlucygidC1yYXRlIikmJmEoKSwicmFkaW8iPT09dC50eXBlJiZ0LmNsb3Nlc3QoIi50LWNvbnRhY3QtbWV0aG9kX190eXBlcy1jb250YWluZXIiKSYmaShyKSl9KSk6InNlbGVjdC1vbmUiPT09dC50eXBlP24oKToodC52YWx1ZT1lLHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXJhbmdlIikmJmkoKSwidGVsIj09PXQudHlwZSYmcygpKSxsKGksITEpfWZ1bmN0aW9uIG8oKXt2YXIgZT10LmNsb3Nlc3QoIi50bi1lbGVtIC50LWNoZWNrYm94X19jb250cm9sIiksbz0vXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO2lmKGUpc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJpbnB1dCIpKX0pLHIpO2Vsc2V7dmFyIG49dC5jbG9zZXN0KCIudC1jaGVja2JveF9fY29udHJvbCwgLnQtaW1nLXNlbGVjdF9fY29udHJvbCIpO24mJm8mJih0LmNoZWNrZWQ9ITEpLG4mJm4uZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoImNsaWNrIikpfX1mdW5jdGlvbiBuKCl7dmFyIHIsbz1BcnJheS5mcm9tKHQub3B0aW9ucykuZmluZCgoZnVuY3Rpb24odCl7cmV0dXJuIHQudmFsdWUudHJpbSgpPT09ZX0pKTtvJiYoby5zZWxlY3RlZD0hMCl9ZnVuY3Rpb24gYSgpe3ZhciBlO251bGw9PShlPXQuY2xvc2VzdCgiLnQtcmF0ZV9fd3JhcHBlciIpKXx8ZS5jbGFzc0xpc3QuYWRkKCJ0LXJhdGVfX3dyYXBwZXJfYWN0aXZlIil9ZnVuY3Rpb24gaShlKXt2YXIgcj1mdW5jdGlvbiBlKCl7cmV0dXJuIHQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoImNoYW5nZSIpKX07ZT9zZXRUaW1lb3V0KHIsZSk6cigpfWZ1bmN0aW9uIHMoKXt2YXIgZT10LmdldEF0dHJpYnV0ZSgiZGF0YS1waG9uZW1hc2stbGlkIik7ZSYmKGU9ImlucHV0XyIrZSksZXx8KGU9dC5pZCksZSYmc2V0VGltZW91dCgoZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKTtudWxsPT10fHx0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJpbnB1dCIpKX0pLHIpfWZ1bmN0aW9uIGwodCxlKXt2b2lkIDA9PT1lJiYoZT0hMCk7dmFyIHI9YygpOyhlfHxyKSYmKHImJiJ5IiE9PXIuZ2V0QXR0cmlidXRlKCJkYXRhLWluaXQtY2FsYyIpP3IuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXRSZWFkeSIsdCk6dCgpKX1mdW5jdGlvbiBjKCl7dmFyIGU9dC5jbG9zZXN0KCIudC1mb3JtIik7aWYoIWUpcmV0dXJuIG51bGw7dmFyIHI9QXJyYXkuZnJvbShlLnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWNhbGMtZXhwcl0iKSk7aWYoIXIubGVuZ3RoKXJldHVybiBudWxsO3ZhciBvPXIuZmluZCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlKCJkYXRhLWNhbGMtZXhwciIpLmluY2x1ZGVzKHQubmFtZSl9KSk7cmV0dXJuKG51bGw9PW8/dm9pZCAwOm8uY2xvc2VzdCgiLnQtaW5wdXQtZ3JvdXAiKSl8fG51bGx9fWZ1bmN0aW9uIHRfZm9ybXNfX2dldFRpbGRhTW9kZSgpe2lmKHZvaWQgMCE9PXdpbmRvdy50aWxkYW1vZGUpcmV0dXJuIHdpbmRvdy50aWxkYW1vZGU7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKTtyZXR1cm4gdD8od2luZG93LnRpbGRhbW9kZT10LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tb2RlIil8fCJwdWJsaXNoZWQiLHdpbmRvdy50aWxkYW1vZGUpOiJub3RkZWZpbmVkIn0KCmZ1bmN0aW9uIHQzOTZfX3BhcnNlR2xvYmFsU3R5bGVDU1NWYXIodCl7dHJ5e3ZhciBlLG49L3ZhclwoKC0tdWMtKFteLV0rKS0oW14tXSspLShbXixdKykpLFxzPyguKilcKS8uZXhlYyh0KTtpZighbilyZXR1cm47dmFyIGk9blswXSxhPW5bMV0scj1uWzJdLG89blszXSxzPW5bNF0sXz1uWzVdLGwsYztpZighKGkmJnImJm8mJnMmJl8pKXJldHVybjtyZXR1cm57cGFyZW50OntpZDpzLHR5cGU6cn0sZmFsbGJhY2s6d2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZ2V0UHJvcGVydHlWYWx1ZShhKXx8XyxmaWVsZDpvfX1jYXRjaChtKXtjb25zb2xlLmVycm9yKCJFcnJvciB0cnlpbmcgdG8gcGFyc2UgQ1NTIFZhcmlhYmxlIil9fWZ1bmN0aW9uIHQzOTZfX2hleDJyZ2JhKHQsZSl7aWYoIXQpcmV0dXJuITE7dmFyIG49dDM5Nl9fcGFyc2VHbG9iYWxTdHlsZUNTU1Zhcih0KTtuJiYodD1uLmZhbGxiYWNrKTt2YXIgaT10LnJlcGxhY2UoLyMvLCIiKTtpZigzPT09aS5sZW5ndGgpe3ZhciBhPWlbMF0scj1pWzFdLG89aVsyXTt0PSIjIithK2ErcityK28rb312YXIgcz1wYXJzZUludCh0LnN1YnN0cmluZygxKSwxNiksXyxsLGM7cmV0dXJuWygxNjcxMTY4MCZzKT4+MTYsKDY1MjgwJnMpPj44LDI1NSZzLHBhcnNlRmxvYXQoZSldfWZ1bmN0aW9uIHQzOTZfX2lzRWxlbWVudFVzaW5nQ2FsY1pvb20odCl7dmFyIGU9WyJnYWxsZXJ5Il0sbj10LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKTtyZXR1cm4gZS5pbmNsdWRlcyhuKX1mdW5jdGlvbiB0Mzk2X19pc0ZsZXgodCl7dmFyIGU9dC5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2FydGJvYXJkLWZsZXgiKSxuPXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19ncm91cC1mbGV4Iik7cmV0dXJuIGV8fG59ZnVuY3Rpb24gdDM5Nl9fc2V0T3ZlcmZsb3dUb0FsbFJlY29yZHMoKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpO2lmKHQpe3ZhciBlPVsiLnQ5NTFfX3NpZGViYXJfc3RpY2t5IiwiLnQxMjA2X19jb250ZW50X3N0aWNreSIsIi50NzU0X19jb2xfZml4ZWQiLCIudDc3Nl9fY29sX2ZpeGVkIiwiLnQ3ODZfX2NvbF9maXhlZCIsIi50LXN0b3JlX19wcm9kLXBvcHVwX19jb2xfZml4ZWQiLCIudC1jYXRhbG9nX19zaWRlYmFyX3N0aWNreSJdO3QzOTZfX2dlbmVyYXRlT3ZlcmZsb3dTdHlsZSgpO3ZhciBuPUJvb2xlYW4oZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlLmpvaW4oIiwgIikpKTt0LmNsYXNzTGlzdC5yZW1vdmUoInQtcmVjb3Jkc19fb3ZlcmZsb3ctY2xpcCIsInQtcmVjb3Jkc19fb3ZlcmZsb3ctaGlkZGVuIiksdC5jbGFzc0xpc3QuYWRkKG4/InQtcmVjb3Jkc19fb3ZlcmZsb3ctY2xpcCI6InQtcmVjb3Jkc19fb3ZlcmZsb3ctaGlkZGVuIil9fWZ1bmN0aW9uIHQzOTZfX2dlbmVyYXRlT3ZlcmZsb3dTdHlsZSgpe2lmKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidDM5Nl9fb3ZlcmZsb3ctc3R5bGVzIikpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7dC5pZD0idDM5Nl9fb3ZlcmZsb3ctc3R5bGVzIix0LmlubmVySFRNTD0iLnQtcmVjb3Jkc19fb3ZlcmZsb3ctY2xpcCB7IG92ZXJmbG93OiBjbGlwOyB9XG5cdFx0XHRcdFx0XHQudC1yZWNvcmRzX19vdmVyZmxvdy1oaWRkZW4geyBvdmVyZmxvdzogaGlkZGVuOyB9Iixkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHQpfX1mdW5jdGlvbiB0Mzk2X19nZXRBcnRib2FyZHModCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxuLGk9ZSYmImVkaXQiPT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpPycucmVjb3JkW2RhdGEtcmVjb3JkLXR5cGU9IicrdCsnIl0gLnI6bm90KC50Mzk3X19vZmYsIC50Mzk1X19vZmYsIC50NDAwX19vZmYpIC50Mzk2X19hcnRib2FyZCwgLnJlY29yZFtkYXRhLXBhcmVudHRwbGlkPSInK3QrJyJdIC5yOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQnOicucltkYXRhLXJlY29yZC10eXBlPSInK3QrJyJdOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQsIC5yW2RhdGEtcGFyZW50dHBsaWQ9IicrdCsnIl06bm90KC50Mzk3X19vZmYsIC50Mzk1X19vZmYsIC50NDAwX19vZmYpIC50Mzk2X19hcnRib2FyZCc7cmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChpKSl9ZnVuY3Rpb24gdDM5Nl9fZ2V0WmVyb0Jsb2Nrcygpe3ZhciB0PVtdLmNvbmNhdCh0Mzk2X19nZXRBcnRib2FyZHMoIjM5NiIpLHQzOTZfX2dldEFydGJvYXJkcygiMTIxIikpLGU7cmV0dXJuIHQubGVuZ3RoP3QubWFwKChmdW5jdGlvbih0KXtyZXR1cm57cmVjb3JkOnQuY2xvc2VzdCgiLnI6bm90KC50Mzk3X19vZmYpOm5vdCgudDM5NV9fb2ZmKTpub3QoLnQ0MDBfX29mZikiKSxhcnRib2FyZDp0fX0pKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnJlY29yZH0pKTpbXX1mdW5jdGlvbiB0Mzk2X19pc0luc2lkZUdyb3VwV2l0aFpvb20odCl7Zm9yKHZhciBlPXQuY2xvc2VzdCgiLnQzOTZfX2dyb3VwIik7ZTspe3ZhciBuO2lmKGUuc3R5bGUuem9vbSlyZXR1cm4hMDtlPW51bGw9PShuPWUucGFyZW50RWxlbWVudCk/dm9pZCAwOm4uY2xvc2VzdCgiLnQzOTZfX2dyb3VwIil9cmV0dXJuITF9dmFyIHQzOTZfX3VuaXF1ZUlkX19nZW5lcmF0b3I9ZnVuY3Rpb24gdCgpe3ZhciBlPTA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9U3RyaW5nKGUrPTEpLnBhZFN0YXJ0KDYsIjAiKTtyZXR1cm4iIitEYXRlLm5vdygpK3R9fSx0Mzk2X19nZXRVbmlxdWVJZD10Mzk2X191bmlxdWVJZF9fZ2VuZXJhdG9yKCk7ZnVuY3Rpb24gdDM5Nl9pc0Jsb2NrVmlzaWJsZSh0KXt2YXIgZT13aW5kb3cuaW5uZXJXaWR0aCxuPXQuZ2V0QXR0cmlidXRlKCJkYXRhLXNjcmVlbi1taW4iKSxpPXQuZ2V0QXR0cmlidXRlKCJkYXRhLXNjcmVlbi1tYXgiKTtyZXR1cm4hKG4mJmU8cGFyc2VJbnQobiwxMCkpJiYhKGkmJmU+cGFyc2VJbnQoaSwxMCkpfXZhciB0Mzk2X19vblJlYWR5PWZ1bmN0aW9uIHQoZSl7ImxvYWRpbmciIT09ZG9jdW1lbnQucmVhZHlTdGF0ZT9lKCk6ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsZSl9LHQzOTZfX2h0bWxUZXh0RGVjb2RlcjtmdW5jdGlvbiB0Mzk2X19kZWNvZGVIdG1sVGV4dCh0KXtyZXR1cm4gdD8odDM5Nl9faHRtbFRleHREZWNvZGVyfHwodDM5Nl9faHRtbFRleHREZWNvZGVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRleHRhcmVhIikpLHQzOTZfX2h0bWxUZXh0RGVjb2Rlci5pbm5lckhUTUw9dCx0Mzk2X19odG1sVGV4dERlY29kZXIudmFsdWUpOiIifWZ1bmN0aW9uIHQzOTZfZWxlbV9fZ2V0Rm9ybUlucHV0c1ZhbHVlKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX2lucHV0cy1kYXRhIik7aWYoZSl7dmFyIG49ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdmFsdWUiKTtpZihuKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShuKX1jYXRjaChyKXtyZXR1cm4gY29uc29sZS5lcnJvcigiRXJyb3IgcGFyc2luZyBmb3JtIGlucHV0cyBkYXRhOiIscixuKSxbXX19dmFyIGk9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9faW5wdXRzLXRleHRhcmVhIik7aWYoaSl7dmFyIGE9aS52YWx1ZTtpZihhKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShhKX1jYXRjaChyKXtyZXR1cm4gY29uc29sZS5lcnJvcigiRXJyb3IgcGFyc2luZyBmb3JtIGlucHV0cyB0ZXh0YXJlYSB2YWx1ZToiLHIsYSksW119fXJldHVybltdfWZ1bmN0aW9uIHQzOTZfZ2V0RWwodCl7cmV0dXJuIHdpbmRvdy5qUXVlcnkmJnQgaW5zdGFuY2VvZiBqUXVlcnk/dC5sZW5ndGg/dC5nZXQoMCk6bnVsbDp0fWZ1bmN0aW9uIHQzOTZfX2RvZXNDbGllbnRSZWN0SW5jbHVkZVpvb20oKXt0cnl7dmFyIHQ9MixlPTUwLG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bi5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7dG9wOjA7dmlzaWJpbGl0eTpoaWRkZW47cG9pbnRlci1ldmVudHM6bm9uZTt3aWR0aDo1MHB4O2hlaWdodDo1MHB4O3pvb206MjsiLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobik7dmFyIGksYT1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO3JldHVybiBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKG4pLDEwMD09PWF9Y2F0Y2gocil7cmV0dXJufX1mdW5jdGlvbiB0Mzk2X19pbml0U2NhbGVGYWN0b3JGbGFncygpe2lmKHZvaWQgMD09PXdpbmRvdy5zaG91bGRVc2VTY2FsZUZhY3Rvcil7dm9pZCAwPT09d2luZG93LnQzOTZfX2NsaWVudFJlY3RJbmNsdWRlc1pvb20mJih3aW5kb3cudDM5Nl9fY2xpZW50UmVjdEluY2x1ZGVzWm9vbT10Mzk2X19kb2VzQ2xpZW50UmVjdEluY2x1ZGVab29tKCkpO3ZhciB0PXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9GaXJlZm94XC8oWzAtOV0rKVwuLyksZT10P3BhcnNlSW50KHRbMV0sMTApOjEyNixuPXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9DaHJvbWVcLyhbMC05XSspXC4vKSxpLGE9KG4mJnBhcnNlSW50KG5bMV0sMTApfHwwKT4xMjd8fHdpbmRvdy50Mzk2X19jbGllbnRSZWN0SW5jbHVkZXNab29tO3dpbmRvdy5pc09ubHlTY2FsYWJsZT1lPDEyNix3aW5kb3cuc2hvdWxkVXNlU2NhbGVGYWN0b3I9IXdpbmRvdy5pc09ubHlTY2FsYWJsZSYmIXQmJiFhfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fY2hlY2tWaXNpYmlsaXR5UGFnZSgpeyJ2aXNpYmxlIj09PWRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSYmKHRfYW5pbWF0aW9uU0JTX19vblJlYWR5KHRfYW5pbWF0aW9uU0JTX19pbml0KSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0X2FuaW1hdGlvblNCU19fY2hlY2tWaXNpYmlsaXR5UGFnZSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19vblJlYWR5KHQpeyJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGU/dCgpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLHQpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19pbml0KCl7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxlPXQ/ImVkaXQiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpOm51bGw7ZXx8KGU9Qm9vbGVhbihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZm9yX3JlZGFjdG9yX3Rvb2xiYXIiKSkpLC9Cb3QvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHxkb2N1bWVudC5kb2N1bWVudE1vZGU8MTF8fGV8fCh0X2FuaW1hdGlvblNCU19fcHJvY2Vzc0hvcml6b250YWxTY3JvbGwoKSx0X2FuaW1hdGlvblNCU19faXNaZXJvQmxvY2tzUmVuZGVyZWQoKGZ1bmN0aW9uKCl7dF9hbmltYXRpb25TQlNfaXNJbnN0YWdyYW1SZW5kZXJlZCgoZnVuY3Rpb24oKXt2YXIgdDt0Mzk2X19pbml0U2NhbGVGYWN0b3JGbGFncygpLHRfYW5pbWF0aW9uU0JTX193cmFwQW5kVXBkYXRlRWxzKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWFuaW1hdGUtc2JzLWV2ZW50XSIpKSksdF9hbmltYXRpb25TQlNfX2luaXRBbGxSZXMoZSl9KSl9KSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19wcm9jZXNzSG9yaXpvbnRhbFNjcm9sbCgpe3ZhciB0PSdbZGF0YS1hbmltYXRlLXNicy1ldmVudD0ic2Nyb2xsIl0nLGU9QXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHQpKSxuLGk7ZS5sZW5ndGgmJihlLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIil9KSkuc29tZSgoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtb3ZyZmx3Iik7cmV0dXJuWyJ2aXNpYmxlIiwidmlzaWJsZVgiXS5pbmNsdWRlcyhlKX0pKT90Mzk2X19zZXRPdmVyZmxvd1RvQWxsUmVjb3JkcygpOih0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVPdmVyZmxvd1N0eWxlcygpLGUuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU7dC5jbG9zZXN0KCIuciIpLmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0aW9uLXNic19fb3ZlcmZsb3cteCIpfSkpKSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlT3ZlcmZsb3dTdHlsZXMoKXtpZighZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNicy1hbmltYXRpb24tYmxvY2stb3ZlcmZsb3ciKSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTt0LmlkPSJzYnMtYW5pbWF0aW9uLWJsb2NrLW92ZXJmbG93Iix0LmlubmVySFRNTD0iLnQtYW5pbWF0aW9uLXNic19fb3ZlcmZsb3cteCB7IG92ZXJmbG93LXg6IGhpZGRlbjsgfSIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0KX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2lzWmVyb0Jsb2Nrc1JlbmRlcmVkKHQpe3ZhciBlPXRfYW5pbWF0aW9uU0JTX19nZXRBcnRib2FyZHMoIjM5NiIpLG49dF9hbmltYXRpb25TQlNfX2dldEFydGJvYXJkcygiMTIxIiksaT1bXS5jb25jYXQoZSxuKTtpZihpLmxlbmd0aCl7dmFyIGE9ITE7aWYoaS5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZW5kZXJlZCIpfSkpKXQoKTtlbHNlIGlmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdFtzcmMqPSJ0aWxkYS1ibG9ja3MtMiJdLCBzY3JpcHRbc3JjKj0idGlsZGEtYmxvY2tzLTEiXScpLmxlbmd0aCl0X2FuaW1hdGlvblNCU19fYmFja3dhcmRDb21wYXRpYmlsaXR5V2FpdChpLERhdGUubm93KCksdCk7ZWxzZXt2YXIgcj1pLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZW5kZXJlZCIpfSkpO2kuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5jbGFzc0xpc3QuY29udGFpbnMoInJlbmRlcmVkIil8fGUuYWRkRXZlbnRMaXN0ZW5lcigiYXJ0Qm9hcmRSZW5kZXJlZCIsKGZ1bmN0aW9uKCl7ci5wdXNoKGUpLHIubGVuZ3RoIT09aS5sZW5ndGh8fGF8fHQoKX0pKX0pKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2E9ITAsci5sZW5ndGghPT1pLmxlbmd0aCYmdCgpfSksM2UzKX19fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRBcnRib2FyZHModCl7dmFyIGU9Jy5yW2RhdGEtcmVjb3JkLXR5cGU9IicrdCsnIl06bm90KC50Mzk3X19vZmYsIC50Mzk1X19vZmYsIC50NDAwX19vZmYpIC50Mzk2X19hcnRib2FyZCwgLnJbZGF0YS1wYXJlbnR0cGxpZD0iJyt0KyciXTpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkJztyZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGUpKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fYmFja3dhcmRDb21wYXRpYmlsaXR5V2FpdCh0LGUsbil7aWYodC5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZW5kZXJlZCIpfSkpKW4oKTtlbHNle2lmKERhdGUubm93KCktZT4xZTQpcmV0dXJuIHZvaWQgY29uc29sZS53YXJuKCJhbGwgemVyby1ibG9ja3MgY2FuJ3QgYmUgcmVuZGVyZWQiKTtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3RfYW5pbWF0aW9uU0JTX19iYWNrd2FyZENvbXBhdGliaWxpdHlXYWl0KHQsZSxuKX0pLDUwMCl9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX2lzSW5zdGFncmFtUmVuZGVyZWQodCl7aWYod2luZG93LmFuaW1hdGlvblNCU19faXNJT1MmJi0xIT09bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJJbnN0YWdyYW0iKSl2YXIgZT1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3dpbmRvdy5pbm5lcldpZHRoIT09c2NyZWVuLndpZHRoJiZ3aW5kb3cuaW5uZXJIZWlnaHQ+d2luZG93LmlubmVyV2lkdGg/dF9hbmltYXRpb25TQlNfaXNJbnN0YWdyYW1SZW5kZXJlZCh0KTooY2xlYXJUaW1lb3V0KGUpLHQoKSl9KSwxMDApO2Vsc2UgdCgpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX193cmFwQW5kVXBkYXRlRWxzKHQpe3ZhciBlPS0xIT09bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKTt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuPXQucXVlcnlTZWxlY3RvcigiLnRuLW1vbGVjdWxlLCAudG4tYXRvbSIpO2lmKG4pey0xPT09bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSYmKG4uc3R5bGUuV2Via2l0QmFja2ZhY2VWaXNpYmlsaXR5PSJoaWRkZW4iLG4uc3R5bGUuYmFja2ZhY2VWaXNpYmlsaXR5PSJoaWRkZW4iKTt2YXIgaT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIiksYT10X2FuaW1hdGlvblNCU19fZ2V0QW5pbU9wdGlvbnModCwicHVibGlzaGVkIixudWxsKTtpZighaSYmYSl7dmFyIHI9Z2V0Q29tcHV0ZWRTdHlsZShuKS5kaXNwbGF5LG87bi5jbGFzc0xpc3QuY29udGFpbnMoInRuLW1vbGVjdWxlIikmJiJmbGV4IiE9PXImJihuLnN0eWxlLmRpc3BsYXk9ImluaGVyaXQiKTt2YXIgcz10X2FuaW1hdGlvblNCU19fZ2V0U2NhbGVXcmFwcGVyKG4pLF89dC5zdHlsZS50cmFuc2Zvcm0sbDtfJiYtMSE9PV8uaW5kZXhPZigibWF0cml4KCIpJiYodF9hbmltYXRpb25TQlNfX3dyYXBFbChzfHxuLCJ0bi1hdG9tX19zYnMtdHJhbnNmb3JtLXdyYXBwZXIiKSwobD10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zYnMtdHJhbnNmb3JtLXdyYXBwZXIiKSkuc3R5bGUudHJhbnNmb3JtPV8sdC5zdHlsZS50cmFuc2Zvcm09IiIpLHRfYW5pbWF0aW9uU0JTX193cmFwRWwoKGw9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLXRyYW5zZm9ybS13cmFwcGVyIikpfHxzfHxuLCJ0bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIiksaT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIiksdF9hbmltYXRpb25TQlNfX3VwZGF0ZVN0eWxlc0FmdGVyV3JhcHBpbmcodCxsfHxpLGUpfX19KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dldFNjYWxlV3JhcHBlcih0KXtpZighdClyZXR1cm4gbnVsbDt2YXIgZT10LmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpLG49dC5jbGFzc0xpc3QuY29udGFpbnMoInRuLWF0b20iKTtyZXR1cm4gZSYmbj9udWxsOnQuY2xvc2VzdCgiLnRuLWF0b21fX3NjYWxlLXdyYXBwZXIiKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fd3JhcEFuZFVwZGF0ZUVsT25SZXNpemUodCl7aWYodC5sZW5ndGgpe3ZhciBlPXQuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4hdC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpfSkpO2UubGVuZ3RoJiZ0X2FuaW1hdGlvblNCU19fd3JhcEFuZFVwZGF0ZUVscyhlKX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dldEZpbHRlclZhbHVlKHQsZSl7dmFyIG49dC5nZXRQcm9wZXJ0eVZhbHVlKGUpO3JldHVybiBuJiYibm9uZSIhPT1ufHwobj10LmdldFByb3BlcnR5VmFsdWUoIi13ZWJraXQtIitlKSksbiYmIm5vbmUiIT09bj9uOiIifWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX191cGRhdGVTdHlsZXNBZnRlcldyYXBwaW5nKHQsZSxuKXt2YXIgaT10LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKSxhPWdldENvbXB1dGVkU3R5bGUodCkscj10LnF1ZXJ5U2VsZWN0b3IoIi50bi1tb2xlY3VsZSwgLnRuLWF0b20iKSxvPWdldENvbXB1dGVkU3R5bGUocikscz1hLmdldFByb3BlcnR5VmFsdWUoImJvcmRlci1yYWRpdXMiKTsic2hhcGUiIT09aSYmImJ1dHRvbiIhPT1pJiYiaW1hZ2UiIT09aXx8IXBhcnNlSW50KHMsMTApfHwoZS5zdHlsZS5ib3JkZXJSYWRpdXM9cyk7dmFyIF89W107WyJmaWx0ZXIiLCJiYWNrZHJvcC1maWx0ZXIiXS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj10X2FuaW1hdGlvblNCU19fZ2V0RmlsdGVyVmFsdWUoYSxlKSxpPW4/IiI6dF9hbmltYXRpb25TQlNfX2dldEZpbHRlclZhbHVlKG8sZSkscz1ufHxpO3MmJl8ucHVzaCh7ZmlsdGVyOmUsd2Via2l0RmlsdGVyOiItd2Via2l0LSIrZSx2YWx1ZTpzLHNvdXJjZTpuP3Q6cn0pfSkpO3ZhciBsPW8udHJhbnNmb3JtLGM9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50Iik7Yy5pbml0RXZlbnQoImJhY2tkcm9wRmlsdGVySW1nV3JhcHBlcmVkIiwhMCwhMCksXy5mb3JFYWNoKChmdW5jdGlvbihhKXt3aW5kb3cudF9hbmltYXRpb25TQlNfX2lzRmlyZWZveCYmKGUuc3R5bGUuYmFja2ZhY2VWaXNpYmlsaXR5PSJ2aXNpYmxlIiksZS5zdHlsZVthLndlYmtpdEZpbHRlcl09YS52YWx1ZSxlLnN0eWxlW2EuZmlsdGVyXT1hLnZhbHVlLGEuc291cmNlLnN0eWxlW2Eud2Via2l0RmlsdGVyXT0ibm9uZSIsYS5zb3VyY2Uuc3R5bGVbYS5maWx0ZXJdPSJub25lIiwiaW1hZ2UiPT09aSYmd2luZG93LnRfYW5pbWF0aW9uU0JTX19pc1NhZmFyaSYmKHQuZGlzcGF0Y2hFdmVudChjKSx0LmNsYXNzTGlzdC5hZGQoInQzOTZfX2VsZW0tLWJhY2tkcm9wLWZpbHRlci1pbWctd3JhcHBlcmVkIikpLG4mJiJiYWNrZHJvcC1maWx0ZXIiPT09YS5maWx0ZXImJihyLnN0eWxlW2Eud2Via2l0RmlsdGVyXT0iaW5oZXJpdCIsci5zdHlsZVthLmZpbHRlcl09ImluaGVyaXQiKSwibm9uZSI9PT1sJiYoci5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZVooMCkiKX0pKTt2YXIgbT1fLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiJiYWNrZHJvcC1maWx0ZXIiPT09dC5maWx0ZXJ9KSk7biYmbSYmdF9hbmltYXRpb25TQlNfX2Nocm9tZUZpeEJhY2tkcm9wRmlsdGVyKHIsZSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2Nocm9tZUZpeEJhY2tkcm9wRmlsdGVyKHQsZSl7dmFyIG49Z2V0Q29tcHV0ZWRTdHlsZSh0KSxpPW4uZ2V0UHJvcGVydHlWYWx1ZSgiYmFja2dyb3VuZC1jb2xvciIpLGE9bi5nZXRQcm9wZXJ0eVZhbHVlKCJvcGFjaXR5Iikscj1uLmdldFByb3BlcnR5VmFsdWUoImJveC1zaGFkb3ciKTtpZigicmdiYSgwLCAwLCAwLCAwKSIhPT1pJiYiMSIhPT1hKXt2YXIgbz1pLnN1YnN0cmluZyhpLmluZGV4T2YoIigiKSsxLGkuaW5kZXhPZigiKSIpKSxzPXRfYW5pbWF0aW9uU0JTX19wcm9jZXNzQm94U2hhZG93UkdCKHIsYSk7cyYmKGUuc3R5bGUuYm94U2hhZG93PXMsdC5zdHlsZS5ib3hTaGFkb3c9Im5vbmUiKSxlLnN0eWxlLmJhY2tncm91bmRDb2xvcj0icmdiYSgiK28rIiwiK2ErIikiLHQuc3R5bGUub3BhY2l0eT0iMSIsdC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9InRyYW5zcGFyZW50Iix0LnN0eWxlLmJhY2tkcm9wRmlsdGVyPSJpbml0aWFsIix0LnN0eWxlLldlYmtpdEJhY2tkcm9wRmlsdGVyPSJpbml0aWFsIn19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3Byb2Nlc3NCb3hTaGFkb3dSR0IodCxlKXtpZighdClyZXR1cm4hMTtpZigtMT09PXQuaW5kZXhPZigicmdiYSIpJiYtMT09PXQuaW5kZXhPZigicmdiIil8fCIxIj09PWUpcmV0dXJuITE7dmFyIG49dC5zdWJzdHJpbmcodC5pbmRleE9mKCIoIikrMSx0LmluZGV4T2YoIikiKSksaT1uLnNwbGl0KCIsICIpOzM9PT1pLmxlbmd0aD9pLnB1c2goZSk6aVszXSo9ZTt2YXIgYT10LnJlcGxhY2UobixpLmpvaW4oIiwgIikpO3JldHVybi0xIT09YS5pbmRleE9mKCJyZ2IoIikmJihhPWEucmVwbGFjZSgicmdiKCIsInJnYmEoIikpLGF9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2luaXRBbGxSZXModCl7dmFyIGU9e2VsZW1lbnRzOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWFuaW1hdGUtc2JzLWV2ZW50XSIpKSxzY3JvbGxUb3A6d2luZG93LnBhZ2VZT2Zmc2V0LGlzRWRpdE1vZGU6dCxjbGlja2VkVHJpZ2dlckVsczpbXSxob3ZlclRyaWdnZXJFbHM6W119O2lmKGUuZWxlbWVudHMubGVuZ3RoKXt0X2FuaW1hdGlvblNCU19fY2FjaGVBbmRTZXREYXRhKGUpLHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lcyhlKTt2YXIgbj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLGk9ISFuJiYieWVzIj09PW4uZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWxhenkiKTsoInkiPT09d2luZG93Lmxhenl8fGkpJiZ0X29uRnVuY0xvYWQoInRfbGF6eWxvYWRfdXBkYXRlIiwoZnVuY3Rpb24oKXt0X2xhenlsb2FkX3VwZGF0ZSgpfSkpO3ZhciBhPXRfYW5pbWF0aW9uU0JTX19nZXRBbmltRWxzT25WaWV3KGUuZWxlbWVudHMpLHIsbz0vQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7aWYoIlJlc2l6ZU9ic2VydmVyImluIHdpbmRvdyl7dmFyIHM9dF9hbmltYXRpb25TQlNfX2dldEFsbEJyZWFrcG9pbnRzKCksXzt0X2FuaW1hdGlvblNCU19fY3JlYXRlUmVzaXplT2JzZXJ2ZXIoe2JyZWFrcG9pbnRzOnMsY3VycmVudFJlczp0X2FuaW1hdGlvblNCU19fZ2V0Q3VycmVudFJlcyhzLG8pLGlzTW9iaWxlOm99LGQpfWVsc2Ugbz93aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigib3JpZW50YXRpb25jaGFuZ2UiLChmdW5jdGlvbigpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZCgpfSksMzAwKX0pKTp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIixkKTt2YXIgbD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudDM5NiIpLGM7aWYoQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChsLChmdW5jdGlvbih0KXt0LmFkZEV2ZW50TGlzdGVuZXIoImRpc3BsYXlDaGFuZ2VkIixkKX0pKSx3aW5kb3cudF9hbmltYXRpb25TQlNfX2lzU2FmYXJpKXtmdW5jdGlvbiBtKCl7MCE9PXdpbmRvdy5wYWdlWU9mZnNldCYmZCgpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLG0pfXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLG0pfXRfYW5pbWF0aW9uU0JTX190cmlnZ2VyTm9TY3JvbGxBbmltYXRpb24oZSxhKSxkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1hbmltYXRlLXNicy1ldmVudD0ic2Nyb2xsIl0nKS5sZW5ndGgmJih0X2FuaW1hdGlvblNCU19fdHJpZ2dlclNjcm9sbEFuaW0oZSksdF9hbmltYXRpb25TQlNfX2NoZWNrRnJhbWUoZSkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoZnVuY3Rpb24oKXt0X2FuaW1hdGlvblNCU19fY2hhbmdlRWxWYWx1ZXMoZSl9KSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXsiY29tcGxldGUiIT09ZG9jdW1lbnQucmVhZHlTdGF0ZSYmdF9hbmltYXRpb25TQlNfX2NoYW5nZUVsVmFsdWVzKGUpfSksM2UzKX1mdW5jdGlvbiBkKCl7Y2xlYXJUaW1lb3V0KHIpLHI9c2V0VGltZW91dCgoZnVuY3Rpb24oKXt2YXIgdD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1hbmltYXRlLXNicy1ldmVudF0iKSk7dF9hbmltYXRpb25TQlNfX3VwZGF0ZUFuaW1hdGVkT2JqZWN0U3RhdGUoZSwiZWxlbWVudHMiLHQpLHRfYW5pbWF0aW9uU0JTX193cmFwQW5kVXBkYXRlRWxPblJlc2l6ZShlLmVsZW1lbnRzKSx0X2FuaW1hdGlvblNCU19fY2FjaGVBbmRTZXREYXRhKGUpLHRfYW5pbWF0aW9uU0JTX190cmlnZ2VyU2Nyb2xsQW5pbShlKSxhPXRfYW5pbWF0aW9uU0JTX19nZXRBbmltRWxzT25WaWV3KGUuZWxlbWVudHMpLHRfYW5pbWF0aW9uU0JTX190cmlnZ2VyTm9TY3JvbGxBbmltYXRpb24oZSxhKSx0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXMoZSl9KSw1MDApfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2V0QW5pbUVsc09uVmlldyh0KXtyZXR1cm4gdC5maWx0ZXIoKGZ1bmN0aW9uKHQpe3ZhciBlPSJkYXRhLWFuaW1hdGUtc2JzLWV2ZW50IjtyZXR1cm4iaW50b3ZpZXciPT09dC5nZXRBdHRyaWJ1dGUoZSl8fCJibG9ja2ludG92aWV3Ij09PXQuZ2V0QXR0cmlidXRlKGUpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRBbGxCcmVha3BvaW50cygpe3ZhciB0PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5yIC50Mzk2X19hcnRib2FyZCIpKSxlPVtdO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuPXRfYW5pbWF0aW9uU0JTX19nZXRSZXNPcHRzKHQpLGk9bi5icmVha3BvaW50cy5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybi0xPT09ZS5pbmRleE9mKHQpfSkpOy0xPT09KGU9ZS5jb25jYXQoaSkpLmluZGV4T2Yobi5yZXNNYXgpJiZlLnB1c2gobi5yZXNNYXgpfSkpLGUuc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS10fSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRDdXJyZW50UmVzKHQsZSl7dmFyIG4saT1lfHwib250b3VjaGVuZCJpbiBkb2N1bWVudCYmLTEhPT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkFwcGxlV2ViS2l0Iik/ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoOndpbmRvdy5pbm5lcldpZHRoO3JldHVybiB0LmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVybiBpPnR9KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3VwZGF0ZUFuaW1hdGVkT2JqZWN0U3RhdGUodCxlLG4pe3RbZV09bn1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fc2V0S2V5Rm9yQW5pbWF0ZWRPYmplY3QodCxlLG4pe3RbZV18fHRfYW5pbWF0aW9uU0JTX191cGRhdGVBbmltYXRlZE9iamVjdFN0YXRlKHQsZSxuKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fY3JlYXRlUmVzaXplT2JzZXJ2ZXIodCxlKXt2YXIgbj1kb2N1bWVudC5ib2R5LmdldENsaWVudFJlY3RzKCksaT1uWzBdLmhlaWdodCxhO25ldyBSZXNpemVPYnNlcnZlcigoZnVuY3Rpb24oYSl7YS5mb3JFYWNoKChmdW5jdGlvbihhKXtpZighZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoInQtYm9keV9zY3JvbGwtbG9ja2VkIikmJiFkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygidC1ib2R5X3BvcHVwc2hvd2VkIikpe3ZhciByPXRfYW5pbWF0aW9uU0JTX19nZXRDdXJyZW50UmVzKHQuYnJlYWtwb2ludHMsdC5pc01vYmlsZSk7YS5jb250ZW50UmVjdC5oZWlnaHQ9PT1pJiZ0LmN1cnJlbnRSZXM9PT1yfHwodC5jdXJyZW50UmVzPXIsaT1uWzBdLmhlaWdodCxlKCkpfX0pKX0pKS5vYnNlcnZlKGRvY3VtZW50LmJvZHkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19jaGFuZ2VFbFZhbHVlcyh0KXt0LmVsZW1lbnRzLmZvckVhY2goKGZ1bmN0aW9uKGUpe2RvY3VtZW50LmNvbnRhaW5zKGUpJiYodF9hbmltYXRpb25TQlNfX3NldEFuZENhY2hlRWxUb3BQb3MoZSx0KSwic2Nyb2xsIj09PWUuYW5pbVR5cGUmJnRfYW5pbWF0aW9uU0JTX191cGRhdGVTdGVwc1ZhbHVlcyhlKSl9KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2NoZWNrRnJhbWUodCl7dmFyIGU7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUmJih0X2FuaW1hdGlvblNCU19fY2hlY2tQb3NDaGFuZ2VzKHQpJiZ0X2FuaW1hdGlvblNCU19fdHJpZ2dlclNjcm9sbEFuaW0odCkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKChmdW5jdGlvbigpe3RfYW5pbWF0aW9uU0JTX19jaGVja0ZyYW1lKHQpfSkpKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fY2hlY2tQb3NDaGFuZ2VzKHQpe3ZhciBlPXQuc2Nyb2xsVG9wLG49d2luZG93LnBhZ2VZT2Zmc2V0O3JldHVybiBuPDAmJndpbmRvdy50X2FuaW1hdGlvblNCU19faXNTYWZhcmkmJihuPTApLHRfYW5pbWF0aW9uU0JTX191cGRhdGVBbmltYXRlZE9iamVjdFN0YXRlKHQsInNjcm9sbFRvcCIsbiksZSE9PW59ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3RyaWdnZXJTY3JvbGxBbmltKHQpe3QuZWxlbWVudHMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYoInNjcm9sbCI9PT1lLmFuaW1UeXBlKXt2YXIgbj17b3BhY2l0eToxLGJsdXI6MCxmaXg6ITEsZml4ZWRTaGlmdFk6MCx0cmFuc2xhdGVYOjAsdHJhbnNsYXRlWTowLHNjYWxlWDoxLHNjYWxlWToxLHJvdGF0ZTowfTt0X2FuaW1hdGlvblNCU19fc2Nyb2xsQW5pbWF0aW9uQ2hlY2tTdGVwcyh0LGUsbiksdF9hbmltYXRpb25TQlNfX3Njcm9sbEFuaW1hdGlvblVwZGF0ZVRyYW5zZm9ybShlLG4pfX0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fc2Nyb2xsQW5pbWF0aW9uQ2hlY2tTdGVwcyh0LGUsbil7ZS5zdGVwcy5mb3JFYWNoKChmdW5jdGlvbihpLGEpe3ZhciByPXQuc2Nyb2xsVG9wK2UudHJpZ2dlck9mZnNldCxvPXRfYW5pbWF0aW9uU0JTX19nZXRab29tKGUpO2Uuc2NhbGVkRGlmZmVyZW5jZSYmKHIrPWUuc2NhbGVkRGlmZmVyZW5jZSk7dmFyIHM9cj49aS5zdGFydCxfPXI8aS5zdGFydCxsPWkuZW5kPD1yLGM9aS5lbmQ+cjtpZihzJiZjKXtpLnN0YXRlPSJzdGFydGVkIixlLndyYXBwZXJFbCYmKGUud3JhcHBlckVsLnN0eWxlLndpbGxDaGFuZ2U9InRyYW5zZm9ybSIpO3ZhciBtPXItaS5zdGFydCxkPTA9PT1pLmRpc3Q/MTptL2kuZGlzdDtuLnByZXZVbmZpeGVkRGlzdD1pLnByZXZVbmZpeGVkRGlzdCx0X2FuaW1hdGlvblNCU19fc2Nyb2xsQW5pbWF0aW9uQ2FsY1N0ZXBTdHlsZXMobixpLGQsYSxvKX1sJiYoaS5zdGF0ZT0iZmluaXNoZWQiLGUud3JhcHBlckVsJiYoZS53cmFwcGVyRWwuc3R5bGUud2lsbENoYW5nZT0iIiksdF9hbmltYXRpb25TQlNfX3Njcm9sbEFuaW1hdGlvbkNhbGNTdGVwU3R5bGVzKG4saSwxLGEsbykpLCFffHwic3RhcnRlZCIhPT1pLnN0YXRlJiYiZmluaXNoZWQiIT09aS5zdGF0ZXx8KGkuc3RhdGU9InVuYWN0aXZlIixlLndyYXBwZXJFbCYmKGUud3JhcHBlckVsLnN0eWxlLndpbGxDaGFuZ2U9IiIpLHRfYW5pbWF0aW9uU0JTX19zY3JvbGxBbmltYXRpb25DYWxjU3RlcFN0eWxlcyhuLGksMCxhLG8pKX0pKSxlLmNsYXNzTGlzdC5yZW1vdmUoInQzOTZfX2VsZW0tLWFuaW0taGlkZGVuIiksZS5zdGVwc1sxXSYmMD09PWUuc3RlcHNbMV0uZGlzdCYmMD09PWUuc3RlcHNbMV0uc3R5bGVzLm9wYWNpdHkmJiJ1bmFjdGl2ZSI9PT1lLnN0ZXBzWzFdLnN0YXRlJiYobi5vcGFjaXR5PTApfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19zY3JvbGxBbmltYXRpb25DYWxjU3RlcFN0eWxlcyh0LGUsbixpLGEpe2lmKCEwPT09ZS5zdHlsZXMuZml4JiYic3RhcnRlZCI9PT1lLnN0YXRlJiYodC5maXg9ITAsdC5maXhlZFNoaWZ0WT0wKSwhMD09PWUuc3R5bGVzLmZpeCYmImZpbmlzaGVkIj09PWUuc3RhdGUmJih0LmZpeD0hMSx0LmZpeGVkU2hpZnRZKz1lLmRpc3QvYSksITA9PT1lLnN0eWxlcy5maXgmJiJ1bmFjdGl2ZSI9PT1lLnN0YXRlKXtpZihpPjAmJiEwPT09dC5maXgpcmV0dXJuO3QuZml4PSExfXQub3BhY2l0eSs9biooZS5zdHlsZXMub3BhY2l0eS10Lm9wYWNpdHkpLHQuYmx1cis9biooZS5zdHlsZXMuYmx1ci10LmJsdXIpLHQudHJhbnNsYXRlWCs9biplLnN0eWxlcy5tb3ZlWCx0LnRyYW5zbGF0ZVkrPW4qZS5zdHlsZXMubW92ZVksdC5zY2FsZVgrPW4qKGUuc3R5bGVzLnNjYWxlWC10LnNjYWxlWCksdC5zY2FsZVkrPW4qKGUuc3R5bGVzLnNjYWxlWS10LnNjYWxlWSksdC5yb3RhdGUrPW4qZS5zdHlsZXMucm90YXRlfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19zY3JvbGxBbmltYXRpb25VcGRhdGVUcmFuc2Zvcm0odCxlKXtpZih0LndyYXBwZXJFbCl7dmFyIG49dF9hbmltYXRpb25TQlNfX2dldFpvb20odCksaT1nZXRDb21wdXRlZFN0eWxlKHQpLndpbGxDaGFuZ2UsYT13aW5kb3cuaXNPbmx5U2NhbGFibGV8fHQzOTZfX2lzRWxlbWVudFVzaW5nQ2FsY1pvb20odCk7aWYoITA9PT1lLmZpeCYmImZpeGVkIiE9PXQud3JhcHBlckVsLnN0eWxlLnBvc2l0aW9uKXt2YXIgcj10LnRyaWdnZXJPZmZzZXQtZS5wcmV2VW5maXhlZERpc3Q7YXx8KHIvPW4pLHQuc2NhbGVkRGlmZmVyZW5jZSYmKHIrPXQuc2NhbGVkRGlmZmVyZW5jZSksdC53cmFwcGVyRWwuc3R5bGUudG9wPXIrInB4Iix0LndyYXBwZXJFbC5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiLGkmJiJhdXRvIiE9PWkmJih0LnN0eWxlLndpbGxDaGFuZ2U9InVuc2V0IiksdC56SW5kZXgmJih0LndyYXBwZXJFbC5zdHlsZS56SW5kZXg9dC56SW5kZXgpfSExPT09ZS5maXgmJiJmaXhlZCI9PT10LndyYXBwZXJFbC5zdHlsZS5wb3NpdGlvbiYmKHQud3JhcHBlckVsLnN0eWxlLnBvc2l0aW9uPSIiLHQud3JhcHBlckVsLnN0eWxlLnRvcD0iIix0LndyYXBwZXJFbC5zdHlsZS56SW5kZXg9IiIsdC56SW5kZXgmJih0LnN0eWxlLnpJbmRleD10LnpJbmRleCksdC5zdHlsZS53aWxsQ2hhbmdlPSIiKSx0LndyYXBwZXJFbC5zdHlsZS5vcGFjaXR5PWUub3BhY2l0eS50b1N0cmluZygpO3ZhciBvPSIiO2lmKGUudHJhbnNsYXRlWCl7dmFyIHM9ZS50cmFuc2xhdGVYO2EmJihzKj1uKSxvKz0idHJhbnNsYXRlWCgiK3MudG9GaXhlZCgyKSsicHgpIn1pZigwIT09ZS50cmFuc2xhdGVZfHwwIT09ZS5maXhlZFNoaWZ0WSl7dmFyIF89ZS50cmFuc2xhdGVZK2UuZml4ZWRTaGlmdFk7YSYmKF8qPW4pLG8rPSJ0cmFuc2xhdGVZKCIrXy50b0ZpeGVkKDIpKyJweCkifTE9PT1lLnNjYWxlWCYmMT09PWUuc2NhbGVZfHwobys9InNjYWxlKCIrZS5zY2FsZVgrIiwiK2Uuc2NhbGVZKyIpIiksMCE9PWUucm90YXRlJiYobys9InJvdGF0ZSgiK2Uucm90YXRlKyJkZWcpIiksdC53cmFwcGVyRWwuc3R5bGUudHJhbnNmb3JtPW98fCJzY2FsZSgxKSJ9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lcyh0KXt2YXIgZT0iIjtpZih0LmVsZW1lbnRzLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKCJzY3JvbGwiIT09dC5hbmltVHlwZSl7dmFyIG49e3RpbWVEdXJhdGlvbjowfSxpPVtdLGE9dF9hbmltYXRpb25TQlNfX2NyZWF0ZUVtcHR5U3R5bGVPcHRpb25zRm9yS2V5ZnJhbWVzKHQuc3RlcHMpO3RfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fY29tYmluZU9iamVjdHModC5zdGVwcyxpLG4sYSksdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19jb3JyZWN0RnJhbWVzKGkpLHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fY291bnRQZXJjZW50KGksbiksdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19jb3JyZWN0T3BhY2l0eU9uRmlyc3RTdGVwKHQsaSk7dmFyIHI9dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19nZXRUeHRTdHlsZXModCxpKSxvO2lmKG4udGltZUR1cmF0aW9uLz0xZTMscilpZihlKz10X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2dldEZpbmFsQ3NzKHQsbixyKSwiaG92ZXIiPT09dC5hbmltVHlwZXx8ImNsaWNrIj09PXQuYW5pbVR5cGUpKCF0Lmxvb3B8fCJsb29wd2l0aHJldmVyc2UiPT09dC5sb29wKSYmKGUrPXRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fZ2V0UmV2ZXJzZUFuaW0odCkpfX0pKSxlKXtpZih0LmlzRWRpdE1vZGUpcmV0dXJuIGU7dmFyIG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnNicy1hbmltLWtleWZyYW1lcyIpO24/bi50ZXh0Q29udGVudCE9PWUmJihuLnRleHRDb250ZW50PWUpOigobj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpKS5jbGFzc0xpc3QuYWRkKCJzYnMtYW5pbS1rZXlmcmFtZXMiKSxuLnRleHRDb250ZW50PWUsZG9jdW1lbnQuaGVhZC5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsbikpfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fY3JlYXRlRW1wdHlTdHlsZU9wdGlvbnNGb3JLZXlmcmFtZXModCl7cmV0dXJue21vdmVYOnQuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiAwPT09dC5zdHlsZXMubW92ZVh9KSksbW92ZVk6dC5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10LnN0eWxlcy5tb3ZlWX0pKSxzY2FsZVg6dC5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10LnN0eWxlcy5zY2FsZVh9KSksc2NhbGVZOnQuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiAxPT09dC5zdHlsZXMuc2NhbGVZfSkpLHJvdGF0ZTp0LmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gMD09PXQuc3R5bGVzLnJvdGF0ZX0pKSxibHVyOnQuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiAwPT09dC5zdHlsZXMuYmx1cn0pKSxvcGFjaXR5OnQuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiAxPT09dC5zdHlsZXMub3BhY2l0eX0pKSxmaXg6dC5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuITE9PT10LnN0eWxlcy5maXh9KSl9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fY29tYmluZU9iamVjdHModCxlLG4saSl7dC5mb3JFYWNoKChmdW5jdGlvbihhLHIpe3ZhciBvPXt9O2Zvcih2YXIgcyBpbiBvLnN0eWxlcz1hLnN0eWxlcyxpKWlbc10mJmRlbGV0ZSBvLnN0eWxlc1tzXTsie30iIT09SlNPTi5zdHJpbmdpZnkoby5zdHlsZXMpJiYoby50aW1lPTEqYS50aW1lfHwwLHIhPT10Lmxlbmd0aC0xJiYoby5lYXNlPXRbcisxXS5lYXNlKSxlLnB1c2gobyksbi50aW1lRHVyYXRpb24rPW8udGltZSl9KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19jb3JyZWN0RnJhbWVzKHQpe3QuZm9yRWFjaCgoZnVuY3Rpb24oZSxuKXt2YXIgaT1uPT09dC5sZW5ndGgtMSxhPTA9PT1uLHI9aT9udWxsOnRbbisxXSxvPWE/bnVsbDp0W24tMV07Zm9yKHZhciBzIGluIGUuc3R5bGVzKWF8fHMgaW4gby5zdHlsZXN8fHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fYWRkU3R5bGVUb0tleWZyYW1lKGUsbyxzLDApLGl8fChzIGluIHIuc3R5bGVzPyJtb3ZlWCIhPT1zJiYibW92ZVkiIT09cyYmInJvdGF0ZSIhPT1zfHx0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX3JlY2FsY3VsYXRlVmFsdWUoZSxyLHMpOnRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fYWRkU3R5bGVUb0tleWZyYW1lKGUscixzLDEpKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2FkZFN0eWxlVG9LZXlmcmFtZSh0LGUsbixpKXsiYmx1ciIhPT1uJiYicm90YXRlIiE9PW4mJiJtb3ZlWCIhPT1uJiYibW92ZVkiIT09bnx8KGUuc3R5bGVzW25dPTA9PT1pPzA6dC5zdHlsZXNbbl0pLCJvcGFjaXR5IiE9PW4mJiJzY2FsZVgiIT09biYmInNjYWxlWSIhPT1ufHwoZS5zdHlsZXNbbl09MD09PWk/MTp0LnN0eWxlc1tuXSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19yZWNhbGN1bGF0ZVZhbHVlKHQsZSxuKXtzd2l0Y2gobil7Y2FzZSJyb3RhdGUiOmUuc3R5bGVzLnJvdGF0ZSs9dC5zdHlsZXMucm90YXRlO2JyZWFrO2Nhc2UibW92ZVgiOmUuc3R5bGVzLm1vdmVYKz10LnN0eWxlcy5tb3ZlWDticmVhaztjYXNlIm1vdmVZIjplLnN0eWxlcy5tb3ZlWSs9dC5zdHlsZXMubW92ZVl9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fY291bnRQZXJjZW50KHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBpPXRbbl0sYTtpZigwPT09bikwPT09ZS50aW1lRHVyYXRpb24/aS5wZXJjZW50PTA6KGE9KDEwMCppLnRpbWUvZS50aW1lRHVyYXRpb24pLnRvRml4ZWQoMiksaS5wZXJjZW50PXBhcnNlRmxvYXQoYSkpO2Vsc2UgaWYobj09PXQubGVuZ3RoLTEpaS5wZXJjZW50PTEwMDtlbHNle3ZhciByPXRbbi0xXS5wZXJjZW50O2lmKDA9PT1lLnRpbWVEdXJhdGlvbilpLnBlcmNlbnQ9MDtlbHNle2lmKGE9KDEwMCppLnRpbWUvZS50aW1lRHVyYXRpb24rcikudG9GaXhlZCgyKSwxMDA9PT1wYXJzZUludChhLDEwKSYmbj09PXQubGVuZ3RoLTImJjAhPT1uKWNvbnRpbnVlO2kucGVyY2VudD1wYXJzZUZsb2F0KGEpfWkucGVyY2VudD09PXImJihpLnBlcmNlbnQrPTEpLGkucGVyY2VudD4xMDAmJihpLnBlcmNlbnQ9OTkpfX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19jb3JyZWN0T3BhY2l0eU9uRmlyc3RTdGVwKHQsZSl7dmFyIG49ZVsxXTt0JiZ0LmNsYXNzTGlzdC5yZW1vdmUoInQzOTZfX2VsZW0tLWFuaW0taGlkZGVuIik7dmFyIGk9dD90LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIik6bnVsbDtuJiYwPT09bi50aW1lJiYwPT09bi5zdHlsZXMub3BhY2l0eT8oaSYmKGkuc3R5bGUub3BhY2l0eT0iMCIpLGVbMF0uc3R5bGVzLm9wYWNpdHk9MCk6aSYmIjAiPT09aS5zdHlsZS5vcGFjaXR5JiZpJiYoaS5zdHlsZS5vcGFjaXR5PSIiKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2dldE1vdmVCYXNlKHQpe2lmKHRfYW5pbWF0aW9uU0JTX19pc0ZpcmVmb3gmJnQud3JhcHBlckVsKXt2YXIgZT1nZXRDb21wdXRlZFN0eWxlKHQud3JhcHBlckVsKSxuPXBhcnNlRmxvYXQoZS53aWR0aCksaT1wYXJzZUZsb2F0KGUuaGVpZ2h0KTtyZXR1cm57d2lkdGg6TnVtYmVyLmlzRmluaXRlKG4pP246MCxoZWlnaHQ6TnVtYmVyLmlzRmluaXRlKGkpP2k6MH19cmV0dXJuIG51bGx9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19nZXRUcmFuc2xhdGUodCxlLG4pe3JldHVybiBuPyJ0cmFuc2xhdGUiK3QrIigiK01hdGgucm91bmQoZS9uKjEwMCkrIiUpIjoidHJhbnNsYXRlIit0KyIoIitNYXRoLnJvdW5kKGUpKyJweCkifWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fZ2V0VHh0U3R5bGVzKHQsZSl7dmFyIG49IiIsaT10X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2dldE1vdmVCYXNlKHQpO3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuY2hhbmdlc3x8KGUuY2hhbmdlcz10X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2dldEZyYW1lQ2hhbmdlcyh0LGUsaSkpLG4rPSJudW1iZXIiPT10eXBlb2YgZS5wZXJjZW50P2UucGVyY2VudCsiJSB7IitlLmNoYW5nZXMrIn1cbiI6IiJ9KSksbn1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX3Nob3VsZFVzZVpvb20odCxlKXt2YXIgbixpO2lmKHQzOTZfX2lzRWxlbWVudFVzaW5nQ2FsY1pvb20odCkpcmV0dXJuIXQzOTZfX2lzSW5zaWRlR3JvdXBXaXRoWm9vbSh0KTt2YXIgYSxyPXRfYW5pbWF0aW9uU0JTX19nZXRTY2FsZVdyYXBwZXIodC5xdWVyeVNlbGVjdG9yKCIudG4tbW9sZWN1bGUsIC50bi1hdG9tIikpO3JldHVybiEoMSE9PWUmJiFyKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2dldEZyYW1lQ2hhbmdlcyh0LGUsbil7dmFyIGk9IiIsYT0iIixyPXt4OjEseToxLGNoYW5nZWQ6ITF9LG89MSxzPXQzOTZfX2lzRWxlbWVudFVzaW5nQ2FsY1pvb20odCk7KHdpbmRvdy5pc09ubHlTY2FsYWJsZXx8cykmJihvPXRfYW5pbWF0aW9uU0JTX19nZXRab29tKHQpKTt2YXIgXz10X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX3Nob3VsZFVzZVpvb20odCxvKTtmb3IodmFyIGwgaW4gX3x8KG89MSksZS5zdHlsZXMpc3dpdGNoKGwpe2Nhc2Uib3BhY2l0eSI6aSs9Im9wYWNpdHk6IitlLnN0eWxlcy5vcGFjaXR5KyI7IjticmVhaztjYXNlInNjYWxlWCI6ci54PWUuc3R5bGVzLnNjYWxlWCxyLmNoYW5nZWQ9ITA7YnJlYWs7Y2FzZSJzY2FsZVkiOnIueT1lLnN0eWxlcy5zY2FsZVksci5jaGFuZ2VkPSEwO2JyZWFrO2Nhc2UibW92ZVgiOmErPXRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fZ2V0VHJhbnNsYXRlKCJYIixlLnN0eWxlcy5tb3ZlWCpvLG4mJm4ud2lkdGgpO2JyZWFrO2Nhc2UibW92ZVkiOmErPXRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fZ2V0VHJhbnNsYXRlKCJZIixlLnN0eWxlcy5tb3ZlWSpvLG4mJm4uaGVpZ2h0KTticmVhaztjYXNlInJvdGF0ZSI6YSs9InJvdGF0ZSgiK2Uuc3R5bGVzLnJvdGF0ZSsiZGVnKSJ9aWYoITA9PT1yLmNoYW5nZWQmJihhKz0ic2NhbGUoIityLngrIiwiK3IueSsiKSIpLCIiIT09YSYmKGkrPSJ0cmFuc2Zvcm06IithKyI7Iiksdm9pZCAwIT09ZS5lYXNlKXN3aXRjaChpKz0iYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjoiLGUuZWFzZSl7Y2FzZSJlYXNlSW4iOmkrPSJlYXNlLWluOyI7YnJlYWs7Y2FzZSJlYXNlT3V0IjppKz0iZWFzZS1vdXQ7IjticmVhaztjYXNlImVhc2VJbk91dCI6aSs9ImVhc2UtaW4tb3V0OyI7YnJlYWs7Y2FzZSJib3VuY2VGaW4iOmkrPSJjdWJpYy1iZXppZXIoMC4zNCwxLjYxLDAuNywxKTsiO2JyZWFrO2RlZmF1bHQ6aSs9IiI9PT1lLmVhc2UudHJpbSgpPyJsaW5lYXI7IjplLmVhc2UrIjsifXJldHVybiBpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fZ2V0RmluYWxDc3ModCxlLG4pe3ZhciBpPSIiLGE9dC51bmlxdWVJRCxyPSIudC1zYnMtYW5pbV9zdGFydGVkICMiK3QudW5pcXVlSUQsbzsicHVibGlzaGVkIiE9PXdpbmRvdy50aWxkYW1vZGUmJih0LnRpbWVEdXJhdGlvbj1lLnRpbWVEdXJhdGlvbiksaSs9cisiIHtcbmFuaW1hdGlvbjogIithKyIgIisoMD09PWUudGltZUR1cmF0aW9uPzFlLTU6ZS50aW1lRHVyYXRpb24pKyJzIjt2YXIgcz10Lmxvb3AmJi0xIT09dC5sb29wLmluZGV4T2YoImxvb3AiKTtyZXR1cm4gcyYmKGkrPSIgaW5maW5pdGUiKSxpKz0iIGxpbmVhciIscz8ibG9vcHdpdGhyZXZlcnNlIj09PXQubG9vcCYmKGkrPSIgYWx0ZXJuYXRlIik6aSs9IiBmb3J3YXJkcyIsaSs9IjtcbmJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbn1cblxuQGtleWZyYW1lcyAiK2ErIiB7XG4iK24rIn1cblxuIn1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2dldFJldmVyc2VBbmltKHQpe3ZhciBlPXRfYW5pbWF0aW9uU0JTX19nZXRBdHRyaWJ1dGVTZWxlY3Rvcih0KSxuLGksYT0iWyIrZS5hdHRyaWJ1dGUrJz0iJytlLmlkKyciXScscjtyZXR1cm4iIyIrKHQuY2xvc2VzdCgiLnQtcmVjIik/dC5jbG9zZXN0KCIudC1yZWMiKS5nZXRBdHRyaWJ1dGUoImlkIik6IiIpKyIgIithKyIudC1zYnMtYW5pbV9zdGFydGVkLnQtc2JzLWFuaW1fcmV2ZXJzZWQgLnRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIgey13ZWJraXQtYW5pbWF0aW9uLWRpcmVjdGlvbjogcmV2ZXJzZTthbmltYXRpb24tZGlyZWN0aW9uOiByZXZlcnNlO30ifWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRBdHRyaWJ1dGVTZWxlY3Rvcih0KXt2YXIgZT17ZmVlZDoiZGF0YS1mZS1lbGVtLWlkIixncm91cDoiZGF0YS1ncm91cC1pZCIsZWxlbWVudDoiZGF0YS1lbGVtLWlkIn0sbj1PYmplY3Qua2V5cyhlKS5maW5kKChmdW5jdGlvbihuKXtyZXR1cm4gdC5oYXNBdHRyaWJ1dGUoZVtuXSl9KSk7cmV0dXJuIG4mJmVbbl0/e2F0dHJpYnV0ZTplW25dLGlkOnQuZ2V0QXR0cmlidXRlKGVbbl0pfHwiIn06e2F0dHJpYnV0ZToiIixpZDoiIn19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dldEFuaW1PcHRpb25zKHQsZSxuKXtpZighdClyZXR1cm4iIjt2YXIgaT1bInNicyIsIm9wdHMiXTtufHwobj0iZWRpdCI9PT1lP2kuam9pbigiIik6aS5qb2luKCItIikpO3ZhciBhPSJlZGl0Ij09PWU/ImZpZWxkIjoiYW5pbWF0ZSIscj0iZWRpdCI9PT1lPyItdmFsdWUiOiIiLG89ImVkaXQiPT09ZT8iZGF0YS1maWVsZC1hbmltbW9iaWxlLXZhbHVlIjoiZGF0YS1hbmltYXRlLW1vYmlsZSIscz0ieSI9PT10LmdldEF0dHJpYnV0ZShvKSxfLGw9dF9hbmltYXRpb25TQlNfX2dldFJlc09wdHModC5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKSksYz10X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVBdHRyKGEsbixyLCExKTtpZihsLnJlcz09PWwucmVzTWF4KXJldHVybiB0LmdldEF0dHJpYnV0ZShjKTtpZighcyYmImVkaXQiIT09ZSYmbC5yZXM8MTIwMClyZXR1cm4gdC5zdHlsZS50cmFuc2l0aW9uPSJub25lIix0LmNsYXNzTGlzdC5yZW1vdmUoInQzOTZfX2VsZW0tLWFuaW0taGlkZGVuIiksIiI7dmFyIG09dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlQXR0cihhLG4scixsLnJlcyksZD10LmdldEF0dHJpYnV0ZShtKTtyZXR1cm4gZHx8KGwuYnJlYWtwb2ludHMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYoIShlPD1sLnJlc3x8ZCkpe3ZhciBpPXRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUF0dHIoYSxuLHIsZSk7ZD10LmdldEF0dHJpYnV0ZShpKX19KSksZHx8dC5nZXRBdHRyaWJ1dGUoYyl8fCIiKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVBdHRyKHQsZSxuLGkpe3ZhciBhPSJkYXRhLSIrdCsiLSIrZTtyZXR1cm4gaSYmKGErPSItcmVzLSIraSksYSs9bn1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2V0UmVzT3B0cyh0KXt2YXIgZT1bMTIwMCw5NjAsNjQwLDQ4MCwzMjBdO2lmKCF3aW5kb3cudG4pe3ZhciBuLGk9d2luZG93LmlubmVyV2lkdGg7cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24odCl7bnx8aT49dCYmKG49dCl9KSkse3JlczpufHwzMjAscmVzTWF4OjEyMDAsYnJlYWtwb2ludHM6WzMyMCw0ODAsNjQwLDk2MF19fXZhciBhPXQ/dC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKToiIixuO3JldHVybiBhJiZ3aW5kb3cudG5bImFiIithXT97cmVzOndpbmRvdy50Mzk2X2RldGVjdFJlc29sdXRpb24/dDM5Nl9kZXRlY3RSZXNvbHV0aW9uKGEpOndpbmRvdy50blsiYWIiK2FdLmN1clJlc29sdXRpb24scmVzTWF4OndpbmRvdy50blsiYWIiK2FdLmN1clJlc29sdXRpb25fbWF4LGJyZWFrcG9pbnRzOndpbmRvdy50blsiYWIiK2FdLnNjcmVlbnMuc2xpY2UoMCwtMSl9OndpbmRvdy50bi5zY3JlZW5zP3tyZXM6d2luZG93LnRuLmN1clJlc29sdXRpb24scmVzTWF4OndpbmRvdy50bi50b3BSZXNvbHV0aW9uLGJyZWFrcG9pbnRzOndpbmRvdy50bi5zY3JlZW5zLnNsaWNlKDAsLTEpfTp7cmVzOm49dF9hbmltYXRpb25TQlNfX2dldEN1cnJlbnRSZXMoZSx3aW5kb3cuaXNNb2JpbGUpLHJlc01heDoxMjAwLGJyZWFrcG9pbnRzOlszMjAsNDgwLDY0MCw5NjBdfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fY2FjaGVBbmRTZXREYXRhKHQpe3QuZWxlbWVudHMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49ZS5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKTtpZigic2Nyb2xsIiE9PWUuYW5pbVR5cGV8fCFufHwiZml4ZWQiIT09dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZShuLCJwb3MiKSl7dmFyIGk9dC5pc0VkaXRNb2RlPyJkYXRhLWZpZWxkLXNic2V2ZW50LXZhbHVlIjoiZGF0YS1hbmltYXRlLXNicy1ldmVudCI7ZS5hbmltVHlwZT1lLmdldEF0dHJpYnV0ZShpKTt2YXIgYT10LmlzRWRpdE1vZGU/ImRhdGEtZmllbGQtc2JzdHJnLXZhbHVlIjoiZGF0YS1hbmltYXRlLXNicy10cmciO2UudHJpZ2dlcj1wYXJzZUZsb2F0KGUuZ2V0QXR0cmlidXRlKGEpKSxpc05hTihlLnRyaWdnZXIpJiYoZS50cmlnZ2VyPTEpLGUudHJpZ2dlckVsZW1zPXRfYW5pbWF0aW9uU0JTX19nZXRBbmltT3B0aW9ucyhlLCJwdWJsaXNoZWQiLCJzYnMtdHJnZWxzIiksZS53cmFwcGVyRWw9ZS5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpO3ZhciByPXRfYW5pbWF0aW9uU0JTX19nZXRBbmltT3B0aW9ucyhlLHQuaXNFZGl0TW9kZT8iZWRpdCI6InB1Ymxpc2hlZCIsbnVsbCk7aWYoZS5zdGF0dXM9ciYmIm51bGwiIT09cj8iYWN0aXZlIjoiaW5uYWN0aXZlIiwiaW5uYWN0aXZlIiE9PWUuc3RhdHVzKXstMSE9PXIuaW5kZXhPZigiZml4ZWQiKSYmKGUuekluZGV4PWdldENvbXB1dGVkU3R5bGUoZSkuZ2V0UHJvcGVydHlWYWx1ZSgiei1pbmRleCIpKSxyPXIucmVwbGFjZSgvJy9nLCciJyksdF9hbmltYXRpb25TQlNfX2FkZERlbGF5VG9TdGVwcyhyPUpTT04ucGFyc2UocikpO3ZhciBvPXQuaXNFZGl0TW9kZT8iZGF0YS1maWVsZC1zYnNsb29wLXZhbHVlIjoiZGF0YS1hbmltYXRlLXNicy1sb29wIjtlLmxvb3A9ZS5nZXRBdHRyaWJ1dGUobyl8fCIiLHRfYW5pbWF0aW9uU0JTX19zZXRBbmRDYWNoZUVsVG9wUG9zKGUsdCk7dmFyIHM9dF9hbmltYXRpb25TQlNfX2dldFpvb20oZSk7ZS5zdGVwcz1bXTt2YXIgXz0wO3IuZm9yRWFjaCgoZnVuY3Rpb24odCxuKXt2YXIgaT17c3RhdGU6InVuYWN0aXZlIn07aS5zdHlsZXM9dF9hbmltYXRpb25TQlNfX2NyZWF0ZVN0ZXBTdHlsZXModCksInNjcm9sbCI9PT1lLmFuaW1UeXBlPyhpLnByZXZVbmZpeGVkRGlzdD1fLGkuZGlzdD10LmRpKnMsITE9PT1pLnN0eWxlcy5maXgmJihfKz1pLmRpc3QpLGkuc3RhcnQ9MD09PW4/ZS50b3BPZmZzZXQ6ZS5zdGVwc1tuLTFdLmVuZCxpLmVuZD1pLnN0YXJ0K2kuZGlzdCk6KGkudGltZT10LnRpLGkuZWFzZT10LmVhKSxlLnN0ZXBzLnB1c2goaSl9KSksIWUud3JhcHBlckVsfHxlLndyYXBwZXJFbC5pZCYmZS51bmlxdWVJRHx8dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlVW5pcXVlSURGb3JFbChlKSx0X2FuaW1hdGlvblNCU19fdXBkYXRlSW5mb09uSW1nTG9hZChlLHQpLHRfYW5pbWF0aW9uU0JTX191cGRhdGVNb3ZlQW5kUm90YXRlU3RlcHNTdHlsZXMoZS5zdGVwcyl9fX0pKTt2YXIgZT10LmVsZW1lbnRzLmZpbHRlcigoZnVuY3Rpb24odCl7aWYoImlubmFjdGl2ZSI9PT10LnN0YXR1cyl7dmFyIGU9dF9hbmltYXRpb25TQlNfX2dldFNpemVCYXNlZE9uRGltZW5zaW9uTW9kZSh0KSxuPWUud2lkdGgsaT1lLmhlaWdodDt0LndyYXBwZXJFbCYmdC53cmFwcGVyRWwucmVtb3ZlQXR0cmlidXRlKCJzdHlsZSIpLHQud3JhcHBlckVsJiYodC53cmFwcGVyRWwuc3R5bGUuZGlzcGxheT0iaW5oZXJpdCIpLHQud3JhcHBlckVsJiYodC53cmFwcGVyRWwuc3R5bGUud2lkdGg9biksdC53cmFwcGVyRWwmJih0LndyYXBwZXJFbC5zdHlsZS5oZWlnaHQ9aSl9cmV0dXJuImlubmFjdGl2ZSIhPT10LnN0YXR1c30pKTt0X2FuaW1hdGlvblNCU19fdXBkYXRlQW5pbWF0ZWRPYmplY3RTdGF0ZSh0LCJlbGVtZW50cyIsZSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlVW5pcXVlSURGb3JFbCh0KXt2YXIgZT10LmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCwgLnRuLWFydGJvYXJkIiksbj0iIjtlJiYobj1lLmdldEF0dHJpYnV0ZSgiZGF0YS1yZWNvcmQtaWQiKXx8ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKSk7dmFyIGksYT10X2FuaW1hdGlvblNCU19fZ2V0QXR0cmlidXRlU2VsZWN0b3IodCkuaWQ7dC51bmlxdWVJRD0ic2JzLSIrbisiLSIrYSx0LndyYXBwZXJFbC5pZD10LnVuaXF1ZUlEfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX191cGRhdGVJbmZvT25JbWdMb2FkKHQsZSl7dmFyIG49dC5xdWVyeVNlbGVjdG9yKCJpbWciKTtuJiYobi5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoZnVuY3Rpb24oKXt0X2FuaW1hdGlvblNCU19fdXBkYXRlVmFsdWVzQXRlcklNR0xvYWRpbmcodCxlKX0pKSxuLmNvbXBsZXRlJiZ0X2FuaW1hdGlvblNCU19fdXBkYXRlVmFsdWVzQXRlcklNR0xvYWRpbmcodCxlKSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3VwZGF0ZVZhbHVlc0F0ZXJJTUdMb2FkaW5nKHQsZSl7dF9hbmltYXRpb25TQlNfX3NldEFuZENhY2hlRWxUb3BQb3ModCxlKSwic2Nyb2xsIj09PXQuYW5pbVR5cGUmJnRfYW5pbWF0aW9uU0JTX191cGRhdGVTdGVwc1ZhbHVlcyh0KX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fdXBkYXRlU3RlcHNWYWx1ZXModCl7dC5zdGVwcy5mb3JFYWNoKChmdW5jdGlvbihlLG4pe2Uuc3RhcnQ9MD09PW4/dC50b3BPZmZzZXQ6dC5zdGVwc1tuLTFdLmVuZCxlLmVuZD1lLnN0YXJ0K2UuZGlzdH0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fc2V0QW5kQ2FjaGVFbFRvcFBvcyh0LGUpe3ZhciBuPXRfYW5pbWF0aW9uU0JTX19nZXRab29tKHQpLGksYT1bInNjcm9sbCIsImludG92aWV3IiwiYmxvY2tpbnRvdmlldyJdLmV2ZXJ5KChmdW5jdGlvbihlKXtyZXR1cm4gdC5hbmltVHlwZSE9PWV9KSk7aWYoIWUuaXNFZGl0TW9kZSYmIWEpe3ZhciByPXRfYW5pbWF0aW9uU0JTX19nZXRUb3BPZmZzZXQodCk7cis9dF9hbmltYXRpb25TQlNfX2FjY3VtdWxhdGVQYXJlbnRHcm91cE9mZnNldCh0KSwic2Nyb2xsIiE9PXQuYW5pbVR5cGUmJiJpbnRvdmlldyIhPT10LmFuaW1UeXBlfHx3aW5kb3cuaXNPbmx5U2NhbGFibGV8fHQzOTZfX2lzRWxlbWVudFVzaW5nQ2FsY1pvb20odCl8fChyKj1uKTt2YXIgbz10LmNsb3Nlc3QoIi5yIikscz1vP28uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldDowLF89byYmcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShvKS5wYWRkaW5nVG9wLDEwKXx8MDt0LnBhcmVudFJlY1RvcFBvcz1zLHQudG9wT2Zmc2V0PXMrcitfLHRfYW5pbWF0aW9uU0JTX19zZXRTY2FsZWREaWZmZXJlbmNlKHQsbiksdF9hbmltYXRpb25TQlNfX3NldFRyaWdnZXJPZmZzZXQodCl9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRUb3BPZmZzZXQodCl7aWYoIXQpcmV0dXJuIDA7aWYodC5nZXRBdHRyaWJ1dGUoImRhdGEtZmUtZWxlbS1pZCIpKXJldHVybiB0Lm9mZnNldFRvcDt2YXIgZT1wYXJzZUludCh0LnN0eWxlLnRvcCwxMCk7cmV0dXJuIGlzTmFOKGUpP3Qub2Zmc2V0VG9wfHwwOmV9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2FjY3VtdWxhdGVQYXJlbnRHcm91cE9mZnNldCh0KXtmb3IodmFyIGU9MCxuPXQucGFyZW50RWxlbWVudC5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKTtuOyllKz10X2FuaW1hdGlvblNCU19fZ2V0VG9wT2Zmc2V0KG4pLG49bi5wYXJlbnRFbGVtZW50LmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpO3JldHVybiBlfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19zZXRTY2FsZWREaWZmZXJlbmNlKHQsZSl7aWYoIXQuc2NhbGVkRGlmZmVyZW5jZSYmd2luZG93LmlzT25seVNjYWxhYmxlJiYiZml4ZWQiIT09dC53cmFwcGVyRWwuc3R5bGUucG9zaXRpb24mJnQzOTZfX2lzRWxlbWVudFVzaW5nQ2FsY1pvb20odCkpe3ZhciBuPXQud3JhcHBlckVsP3Qud3JhcHBlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDowLGk9TWF0aC5hYnMoKG4qZS1uKS8yKTtpPU1hdGgucm91bmQoaSksdC5zY2FsZWREaWZmZXJlbmNlPWl9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19hZGREZWxheVRvU3RlcHModCl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspe3ZhciBuPXRbZV07aWYoMCE9PWUmJihwYXJzZUludChuLmRkLDEwKXx8cGFyc2VJbnQobi5kdCwxMCkpKXt2YXIgaT1PYmplY3QuY3JlYXRlKHRbZS0xXSk7dm9pZCAwIT09bi5kdD9pLnRpPW4uZHQ6aS5kaT1uLmRkLHQuc3BsaWNlKGUsMCxpKSxlKyt9fX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fdXBkYXRlTW92ZUFuZFJvdGF0ZVN0ZXBzU3R5bGVzKHQpe3ZhciBlPXRbMF0uc3R5bGVzLm1vdmVYLG49dFswXS5zdHlsZXMubW92ZVksaT10WzBdLnN0eWxlcy5yb3RhdGU7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgYT10LnN0eWxlczthLm1vdmVYLT1lLGUrPWEubW92ZVgsYS5tb3ZlWS09bixuKz1hLm1vdmVZLGEucm90YXRlLT1pLGkrPWEucm90YXRlfSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19jcmVhdGVTdGVwU3R5bGVzKHQpe3JldHVybnttb3ZlWDpwYXJzZUludCh0Lm14LDEwKXx8MCxtb3ZlWTpwYXJzZUludCh0Lm15LDEwKXx8MCxzY2FsZVg6aXNOYU4ocGFyc2VGbG9hdCh0LnN4KSk/MTpwYXJzZUZsb2F0KHQuc3gpLHNjYWxlWTppc05hTihwYXJzZUZsb2F0KHQuc3kpKT8xOnBhcnNlRmxvYXQodC5zeSksb3BhY2l0eTppc05hTihwYXJzZUZsb2F0KHQub3ApKT8xOnBhcnNlRmxvYXQodC5vcCkscm90YXRlOnBhcnNlSW50KHQucm8sMTApfHwwLGJsdXI6cGFyc2VJbnQodC5ibCwxMCl8fDAsZml4OiJmaXhlZCI9PT10LmZpfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fc2V0VHJpZ2dlck9mZnNldCh0KXt2YXIgZT13aW5kb3cuaW5uZXJIZWlnaHQsbj10X2FuaW1hdGlvblNCU19fZ2V0Wm9vbSh0KTt0LnRyaWdnZXJPZmZzZXQ9cGFyc2VJbnQodF9hbmltYXRpb25TQlNfX2dldEFuaW1PcHRpb25zKHQsInB1Ymxpc2hlZCIsInNicy10cmdvZnN0IiksMTApLCh3aW5kb3cuaXNPbmx5U2NhbGFibGV8fCJzY3JvbGwiPT09dC5hbmltVHlwZXx8dDM5Nl9faXNFbGVtZW50VXNpbmdDYWxjWm9vbSh0KSkmJih0LnRyaWdnZXJPZmZzZXQqPW4pLHQudHJpZ2dlck9mZnNldHx8KHQudHJpZ2dlck9mZnNldD0wKSwuNSE9PXQudHJpZ2dlciYmMSE9PXQudHJpZ2dlcnx8KHQudHJpZ2dlck9mZnNldCs9ZSp0LnRyaWdnZXIsKCJpbnRvdmlldyI9PT10LmFuaW1UeXBlfHwic2Nyb2xsIj09PXQuYW5pbVR5cGUpJiZ0LnRyaWdnZXJPZmZzZXQ+dC50b3BPZmZzZXQmJnQudHJpZ2dlck9mZnNldDw9ZSp0LnRyaWdnZXImJih0LnRyaWdnZXJPZmZzZXQ9dC50b3BPZmZzZXQsdC5zY2FsZWREaWZmZXJlbmNlJiYodC50cmlnZ2VyT2Zmc2V0PDB8fHQudHJpZ2dlck9mZnNldD09PXQuc2NhbGVkRGlmZmVyZW5jZSkmJih0LnNjYWxlZERpZmZlcmVuY2U9MCkpLCJibG9ja2ludG92aWV3Ij09PXQuYW5pbVR5cGUmJnQudHJpZ2dlck9mZnNldD50LnBhcmVudFJlY1RvcFBvcyYmdC50cmlnZ2VyT2Zmc2V0PD1lKnQudHJpZ2dlciYmKHQudHJpZ2dlck9mZnNldD10LnBhcmVudFJlY1RvcFBvcykpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX190cmlnZ2VyTm9TY3JvbGxBbmltYXRpb24odCxlKXt0X2FuaW1hdGlvblNCU19fcHJvY2Vzc0Vsc0ludG9WaWV3KHQsZSksdF9hbmltYXRpb25TQlNfX3JlbW92ZUhvdmVyQ2xpY2tUcmlnZ2Vycyh0KSx0X2FuaW1hdGlvblNCU19faW5pdENsaWNrVHJpZ2dlcnModCksdF9hbmltYXRpb25TQlNfX2luaXRIb3ZlclRyaWdnZXJzKHQpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19wcm9jZXNzRWxzSW50b1ZpZXcodCxlKXt0X2FuaW1hdGlvblNCU19fdXBkYXRlSW50b1ZpZXdFbHNTdGF0ZShlKTt2YXIgbj0wO3RfYW5pbWF0aW9uU0JTX19zZXRLZXlGb3JBbmltYXRlZE9iamVjdCh0LCJvblNjcm9sbFVwZGF0ZUVsc0ludG9WaWV3IiwoZnVuY3Rpb24oKXtufHwobj1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3ZhciBlO3RfYW5pbWF0aW9uU0JTX191cGRhdGVJbnRvVmlld0Vsc1N0YXRlKHRfYW5pbWF0aW9uU0JTX19nZXRBbmltRWxzT25WaWV3KHQuZWxlbWVudHMpKSxuPTB9KSwyMDApKX0pKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0Lm9uU2Nyb2xsVXBkYXRlRWxzSW50b1ZpZXcpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHQub25TY3JvbGxVcGRhdGVFbHNJbnRvVmlldyl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3JlbW92ZUhvdmVyQ2xpY2tUcmlnZ2Vycyh0KXt2YXIgZT1bImpzLXNicy1hbmltLXRyaWdnZXJfY2xpY2siLCJqcy1zYnMtYW5pbS10cmlnZ2VyX2hvdmVyIl0sbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuIitlLmpvaW4oIiwgLiIpKTtuLmxlbmd0aCYmKChuPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG4pKS5mb3JFYWNoKChmdW5jdGlvbih0KXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuY2xhc3NMaXN0LnJlbW92ZShlKX0pKX0pKSx0LmNsaWNrZWRUcmlnZ2VyRWxzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfYW5pbWF0aW9uU0JTX19pbml0Q2xpY2tDYWxsYmFjayksdF9hbmltYXRpb25TQlNfX3JlbW92ZVRyaWdnZXJMaXN0KHQsImNsaWNrIil9KSksdC5ob3ZlclRyaWdnZXJFbHMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsdF9hbmltYXRpb25TQlNfX2luaXRIb3ZlclRyaWdnZXIpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsdF9hbmltYXRpb25TQlNfX2luaXRIb3ZlclRyaWdnZXIpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsdF9hbmltYXRpb25TQlNfX2luaXRIb3ZlclRyaWdnZXIpLHRfYW5pbWF0aW9uU0JTX19yZW1vdmVUcmlnZ2VyTGlzdCh0LCJob3ZlciIpfSkpLHRfYW5pbWF0aW9uU0JTX191cGRhdGVBbmltYXRlZE9iamVjdFN0YXRlKHQsImNsaWNrZWRUcmlnZ2VyRWxzIixbXSksdF9hbmltYXRpb25TQlNfX3VwZGF0ZUFuaW1hdGVkT2JqZWN0U3RhdGUodCwiaG92ZXJUcmlnZ2VyRWxzIixbXSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19yZW1vdmVUcmlnZ2VyTGlzdCh0LGUpe3RbInRyaWdnZXJMaXN0LW9uLSIrZV0mJih0WyJ0cmlnZ2VyTGlzdC1vbi0iK2VdPVtdKSx0WyJ0cmlnZ2VyT25jZUxpc3Qtb24tIitlXSYmKHRbInRyaWdnZXJPbmNlTGlzdC1vbi0iK2VdPVtdKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19faW5pdENsaWNrVHJpZ2dlcnModCl7dmFyIGU9dC5lbGVtZW50cy5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiJjbGljayI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXNicy1ldmVudCIpfSkpO2lmKGUubGVuZ3RoKXt0X2FuaW1hdGlvblNCU19fY29ubmVjdFRyaWdnZXJzV2l0aEFuaW1FbHMoZSk7dmFyIG49QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmpzLXNicy1hbmltLXRyaWdnZXJfY2xpY2siKSk7aWYobi5sZW5ndGgpe2lmKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgianMtc2JzLWFuaW0tdHJpZ2dlci1zdHlsZXMiKSl7dmFyIGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtpLmlkPSJqcy1zYnMtYW5pbS10cmlnZ2VyLXN0eWxlcyIsaS50ZXh0Q29udGVudD0iLmpzLXNicy1hbmltLXRyaWdnZXJfY2xpY2sgeyBjdXJzb3I6IHBvaW50ZXI7IH0iLGRvY3VtZW50LmhlYWQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLGkpfXQuY2xpY2tlZFRyaWdnZXJFbHM9bixuLmZvckVhY2goKGZ1bmN0aW9uKHQpe3RfYW5pbWF0aW9uU0JTX19wcmV2ZW50QW5pbWF0ZWRQYXJlbnRUcmlnZ2VyKHQpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfYW5pbWF0aW9uU0JTX19pbml0Q2xpY2tDYWxsYmFjayksdC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdF9hbmltYXRpb25TQlNfX2luaXRDbGlja0NhbGxiYWNrKX0pKX19fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19pbml0Q2xpY2tDYWxsYmFjaygpe3ZhciB0PXRoaXNbInRyaWdnZXJMaXN0LW9uLWNsaWNrIl18fFtdLGU9dGhpc1sidHJpZ2dlck9uY2VMaXN0LW9uLWNsaWNrIl18fFtdOyh0Lmxlbmd0aHx8ZS5sZW5ndGgpJiYodF9hbmltYXRpb25TQlNfX3BsYXlPbmNlQW5pbWF0aW9uKHRoaXMsZSwiY2xpY2siKSx0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNicy1hbmltX3N0YXJ0ZWQiKSYmIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNicy1hbmltX3JldmVyc2VkIik/dF9hbmltYXRpb25TQlNfX3NldEFjdGlvbk9uRW5kKHQpOnRfYW5pbWF0aW9uU0JTX19zZXRBY3Rpb25PblN0YXJ0KHQpfSkpKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fcGxheU9uY2VBbmltYXRpb24odCxlLG4pe2lmKGUmJmUubGVuZ3RoKXt0X2FuaW1hdGlvblNCU19fYWN0aW9uT25TdGFydChlKTt2YXIgaT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTtpLmluaXRFdmVudCgidXBkYXRlQW5pbU9uY2UiLCEwLCEwKSxlLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuZGlzcGF0Y2hFdmVudChpKX0pKSx0WyJ0cmlnZ2VyT25jZUxpc3Qtb24tIituXT1bXX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2luaXRIb3ZlclRyaWdnZXJzKHQpe3ZhciBlPXQuZWxlbWVudHMuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4iaG92ZXIiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtZXZlbnQiKX0pKTtpZihlLmxlbmd0aCl7dF9hbmltYXRpb25TQlNfX2Nvbm5lY3RUcmlnZ2Vyc1dpdGhBbmltRWxzKGUpO3ZhciBuPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5qcy1zYnMtYW5pbS10cmlnZ2VyX2hvdmVyIik7bj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChuKSx0LmhvdmVyVHJpZ2dlckVscz1uLG4uZm9yRWFjaCgoZnVuY3Rpb24odCl7dF9hbmltYXRpb25TQlNfX3ByZXZlbnRBbmltYXRlZFBhcmVudFRyaWdnZXIodCksd2luZG93LmFuaW1hdGlvblNCU19faXNJT1M/KHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2VyKSx0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0X2FuaW1hdGlvblNCU19faW5pdEhvdmVyVHJpZ2dlcikpOih0LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2VyKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2VyKSx0LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2VyKSx0LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2VyKSl9KSl9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19wcmV2ZW50QW5pbWF0ZWRQYXJlbnRUcmlnZ2VyKHQpe2lmKCJub25lIiE9PWdldENvbXB1dGVkU3R5bGUodCkucG9pbnRlckV2ZW50cyl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudG4tbW9sZWN1bGUsIC50bi1hdG9tIik7ZSYmKHQuc3R5bGUucG9pbnRlckV2ZW50cz0ibm9uZSIsZS5zdHlsZS5wb2ludGVyRXZlbnRzPSJhdXRvIil9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2VyKHQpe3ZhciBlPXQuY3VycmVudFRhcmdldCxuPXQuY3VycmVudFRhcmdldFsidHJpZ2dlckxpc3Qtb24taG92ZXIiXSxpPXQuY3VycmVudFRhcmdldFsidHJpZ2dlck9uY2VMaXN0LW9uLWhvdmVyIl07ZnVuY3Rpb24gYSh0KXtlLmNsb3Nlc3QoIi50Mzk2X19lbGVtIikhPT10LnRhcmdldC5jbG9zZXN0KCIudDM5Nl9fZWxlbSIpJiYodF9hbmltYXRpb25TQlNfX2FjdGlvbk9uRW5kKG4pLGUuY2xhc3NMaXN0LnJlbW92ZSgidC1ob3Zlci1tb2ItYWN0aXZlIiksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLGEpKX0obiYmbi5sZW5ndGh8fGkmJmkubGVuZ3RoKSYmKHRfYW5pbWF0aW9uU0JTX19wbGF5T25jZUFuaW1hdGlvbihlLGksImhvdmVyIiksbiYmbi5sZW5ndGgmJigibW91c2VlbnRlciI9PT10LnR5cGUmJnRfYW5pbWF0aW9uU0JTX19hY3Rpb25PblN0YXJ0KG4pLCJtb3VzZWxlYXZlIj09PXQudHlwZSYmdF9hbmltYXRpb25TQlNfX2FjdGlvbk9uRW5kKG4pLCJjbGljayI9PT10LnR5cGUmJihlLmNsYXNzTGlzdC5jb250YWlucygidC1ob3Zlci1tb2ItYWN0aXZlIil8fChzZXRUaW1lb3V0KChmdW5jdGlvbigpe3RfYW5pbWF0aW9uU0JTX19hY3Rpb25PblN0YXJ0KG4pLGUuY2xhc3NMaXN0LmFkZCgidC1ob3Zlci1tb2ItYWN0aXZlIil9KSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsYSl9KSkpKSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19jb25uZWN0VHJpZ2dlcnNXaXRoQW5pbUVscyh0KXt2YXIgZT10WzBdLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXNicy1ldmVudCIpO3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIG49dC50cmlnZ2VyRWxlbXM7aWYobil7dmFyIGk9bj9uLnNwbGl0KCIsIik6W10sYT10LmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpLHI9YT9hLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpOiIiO2kuZm9yRWFjaCgoZnVuY3Rpb24obil7dmFyIGk9cituLGE7dF9hbmltYXRpb25TQlNfX3Byb2Nlc3NUcmlnZ2Vyc0VsZW1MaXN0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50bi1lbGVtX18iK2krIiwgLnRuLWdyb3VwX18iK2kpLHQsZSl9KSl9ZWxzZXt2YXIgbzt0X2FuaW1hdGlvblNCU19fcHJvY2Vzc1RyaWdnZXJzRWxlbUxpc3QodC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpLHQsZSl9fSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19wcm9jZXNzVHJpZ2dlcnNFbGVtTGlzdCh0LGUsbil7dmFyIGk7dCYmKCJvbmNlIj09PWUubG9vcD9lLmNsYXNzTGlzdC5jb250YWlucygidC1zYnMtYW5pbV9zdGFydGVkIil8fHRfYW5pbWF0aW9uU0JTX19pbml0VHJpZ2dlcnNMaXN0KHQsInRyaWdnZXJPbmNlTGlzdCIsbixlKTp0X2FuaW1hdGlvblNCU19faW5pdFRyaWdnZXJzTGlzdCh0LCJ0cmlnZ2VyTGlzdCIsbixlKSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2luaXRUcmlnZ2Vyc0xpc3QodCxlLG4saSl7dFtlKyItb24tIituXT8tMT09PXRbZSsiLW9uLSIrbl0uaW5kZXhPZihpKSYmdFtlKyItb24tIituXS5wdXNoKGkpOnRbZSsiLW9uLSIrbl09W2ldLHRbZSsiLW9uLSIrbl0ubGVuZ3RoJiYhdC5jbGFzc0xpc3QuY29udGFpbnMoImpzLXNicy1hbmltLXRyaWdnZXJfIituKSYmdC5jbGFzc0xpc3QuYWRkKCJqcy1zYnMtYW5pbS10cmlnZ2VyXyIrbiksaS5hZGRFdmVudExpc3RlbmVyKCJ1cGRhdGVBbmltT25jZSIsKGZ1bmN0aW9uKCl7dFtlKyItb24tIituXT10W2UrIi1vbi0iK25dLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQhPT1pfSkpLHRbInRyaWdnZXJMaXN0LW9uLSIrbl0mJnRbInRyaWdnZXJMaXN0LW9uLSIrbl0ubGVuZ3RofHx0LmNsYXNzTGlzdC5yZW1vdmUoImpzLXNicy1hbmltLXRyaWdnZXJfIituKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fYWN0aW9uT25TdGFydCh0KXt0LmZvckVhY2godF9hbmltYXRpb25TQlNfX3NldEFjdGlvbk9uU3RhcnQpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19zZXRBY3Rpb25PblN0YXJ0KHQpe3QuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNicy1hbmltX3BsYXlpbmciKT90LnNldEF0dHJpYnV0ZSgiZGF0YS1wbGFubmVkLWRpciIsInBsYXkiKTp0X2FuaW1hdGlvblNCU19fcGxheUFuaW1hdGlvbih0LCExKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fYWN0aW9uT25FbmQodCl7dC5mb3JFYWNoKHRfYW5pbWF0aW9uU0JTX19zZXRBY3Rpb25PbkVuZCl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3NldEFjdGlvbk9uRW5kKHQpe3ZhciBlPXQubG9vcCxuPSJub3JldmVyc2UiPT09ZSYmImhvdmVyIj09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc2JzLWV2ZW50Iik7ZSYmLTEhPT1lLmluZGV4T2YoImxvb3AiKT90LmFkZEV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbml0ZXJhdGlvbiIsdF9hbmltYXRpb25TQlNfX3NldEl0ZXJhdGlvbkFuaW1hdGlvbik6dC5jbGFzc0xpc3QuY29udGFpbnMoInQtc2JzLWFuaW1fcGxheWluZyIpJiYhbj90LnNldEF0dHJpYnV0ZSgiZGF0YS1wbGFubmVkLWRpciIsInJldmVyc2UiKTpufHx0X2FuaW1hdGlvblNCU19fcGxheUFuaW1hdGlvbih0LCEwKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fc2V0SXRlcmF0aW9uQW5pbWF0aW9uKHQpe3ZhciBlPXQudGFyZ2V0LmNsb3Nlc3QoIi50Mzk2X19lbGVtIik7aWYoZSl7aWYoImxvb3B3aXRocmV2ZXJzZSI9PT1lLmxvb3Ape3ZhciBuPXRfYW5pbWF0aW9uU0JTX19nZXRBbmltYXRpb25GdWxsVGltZShlLCEwKSxpLGE7aWYoMWUzKnQuZWxhcHNlZFRpbWUvbiUyIT0wKXJldHVybn1lLmNsYXNzTGlzdC5yZW1vdmUoInQtc2JzLWFuaW1fc3RhcnRlZCIpLGUuY2xhc3NMaXN0LnJlbW92ZSgidC1zYnMtYW5pbV9yZXZlcnNlZCIpLGUuY2xhc3NMaXN0LnJlbW92ZSgidC1zYnMtYW5pbV9wbGF5aW5nIiksZS5yZW1vdmVFdmVudExpc3RlbmVyKCJhbmltYXRpb25pdGVyYXRpb24iLHRfYW5pbWF0aW9uU0JTX19zZXRJdGVyYXRpb25BbmltYXRpb24pfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fYW5pbWF0aW9uRW5kKHQpe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uZW5kIix0X2FuaW1hdGlvblNCU19fYW5pbWF0aW9uRW5kaW5nRXZlbnQpLHQuYWRkRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uZW5kIix0X2FuaW1hdGlvblNCU19fYW5pbWF0aW9uRW5kaW5nRXZlbnQpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19hbmltYXRpb25FbmRpbmdFdmVudCgpe3RoaXMuY2xhc3NMaXN0LnJlbW92ZSgidC1zYnMtYW5pbV9wbGF5aW5nIik7dmFyIHQ9dGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtcGxhbm5lZC1kaXIiKTsicGxheSI9PT10JiZ0aGlzLmNsYXNzTGlzdC5jb250YWlucygidC1zYnMtYW5pbV9yZXZlcnNlZCIpP3RfYW5pbWF0aW9uU0JTX19wbGF5QW5pbWF0aW9uKHRoaXMsITEpOiJyZXZlcnNlIiE9PXR8fHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNicy1hbmltX3JldmVyc2VkIil8fHRfYW5pbWF0aW9uU0JTX19wbGF5QW5pbWF0aW9uKHRoaXMsITApLHRoaXMuc2V0QXR0cmlidXRlKCJkYXRhLXBsYW5uZWQtZGlyIiwiIil9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dldEFuaW1hdGlvbkZ1bGxUaW1lKHQsZSl7dmFyIG4saTtyZXR1cm4gdC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtb3B0cyIpP0pTT04ucGFyc2UodC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtb3B0cyIpLnNwbGl0KCInIikuam9pbignIicpKS5yZWR1Y2UoKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUmJih0Kz1wYXJzZUludChuLmR0LDEwKXx8MCksdCsocGFyc2VJbnQobi50aSwxMCl8fDApfSksMCk6MH1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fcGxheUFuaW1hdGlvbih0LGUpe3QuY2xhc3NMaXN0LnJlbW92ZSgidC1zYnMtYW5pbV9zdGFydGVkIiksZXx8dC5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNicy1hbmltX3JldmVyc2VkIiksdF9hbmltYXRpb25TQlNfX2ZvcmNlUmVwYWludCh0KTt2YXIgbj10X2FuaW1hdGlvblNCU19fZ2V0QW5pbWF0aW9uRnVsbFRpbWUodCwhMSksaT1bInQtc2JzLWFuaW1fc3RhcnRlZCJdO2UmJmkucHVzaCgidC1zYnMtYW5pbV9yZXZlcnNlZCIpLG4+MCYmaS5wdXNoKCJ0LXNicy1hbmltX3BsYXlpbmciKSxpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuY2xhc3NMaXN0LmFkZChlKX0pKSx0X2FuaW1hdGlvblNCU19fYW5pbWF0aW9uRW5kKHQpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19mb3JjZVJlcGFpbnQodCl7dC5vZmZzZXRXaWR0aH1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fdXBkYXRlSW50b1ZpZXdFbHNTdGF0ZSh0KXt0JiZ0Lmxlbmd0aCYmdC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZihkb2N1bWVudC5jb250YWlucyh0KSl7dmFyIGU9d2luZG93LnBhZ2VZT2Zmc2V0K3QudHJpZ2dlck9mZnNldCxuPSJibG9ja2ludG92aWV3Ij09PXQuYW5pbVR5cGU/ZT49dC5wYXJlbnRSZWNUb3BQb3M6ZT49dC50b3BPZmZzZXQsaT10LmNsb3Nlc3QoIi50Mzk2IikucGFyZW50RWxlbWVudCxhLHI9WyJ0Mzk3X19vZmYiLCJ0Mzk1X19vZmYiLCJ0NDAwX19vZmYiXS5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gaS5jbGFzc0xpc3QuY29udGFpbnModCl9KSk7biYmIXImJih0LmNsYXNzTGlzdC5jb250YWlucygidC1zYnMtYW5pbV9zdGFydGVkIil8fHQuY2xhc3NMaXN0LmFkZCgidC1zYnMtYW5pbV9zdGFydGVkIikpfX0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2V0Wm9vbSh0KXtpZih2b2lkIDAhPT10LnNjYWxlRmFjdG9yKXJldHVybiB0LnNjYWxlRmFjdG9yO3ZhciBlPXQuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIik7aWYoIWUpcmV0dXJuIDE7dmFyIG49ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKTtyZXR1cm4gZS5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2FydGJvYXJkX3NjYWxlIil8fCF3aW5kb3cuYW5pbWF0aW9uU0JTX19pc09sZFBhZ2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgdDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSYmIndpbmRvdyI9PT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKGUsInVwc2NhbGUiKT9uJiZ3aW5kb3cudG5bImFiIituXSYmd2luZG93LnRuWyJhYiIrbl0uc2NhbGVGYWN0b3J8fHdpbmRvdy50bl9zY2FsZV9mYWN0b3I6MX1mdW5jdGlvbiB0X2FuaW1hdGVTYnNfX3dyYXBBdG9tRWxzKCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtYW5pbWF0ZS1zYnMtZXZlbnRdIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tIik7aWYoZSYmIWUuY2xvc2VzdCgiLnRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIiKSl7dF9hbmltYXRpb25TQlNfX3dyYXBFbChlLCJ0bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIik7dmFyIG49dC5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIiksaT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KS5nZXRQcm9wZXJ0eVZhbHVlKCJib3JkZXItcmFkaXVzIik7aWYoInNoYXBlIj09PW4mJmkmJnBhcnNlSW50KGkpKXt2YXIgYT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIik7YSYmKGEuc3R5bGUuYm9yZGVyUmFkaXVzPWkpfX19KSl9ZnVuY3Rpb24gdF9hbmltYXRlU2JzX19jYXNoRWxzSW5mbyh0KXt2YXIgZT10LmVsczt0LnRyaWdnZXJFbGVtc0F0dHJOYW1lPSJlZGl0Ij09PXQubW9kZT8iZGF0YS1maWVsZC1zYnN0cmdlbHMtdmFsdWUiOiJkYXRhLWFuaW1hdGUtc2JzLXRyZ2VscyIsQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLChmdW5jdGlvbihlKXtlLnN0YXRlPSJ1bmFjdGl2ZSIsZS5hbmltVHlwZT0iZWRpdCI9PT10Lm1vZGU/ZS5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGQtc2JzZXZlbnQtdmFsdWUiKTplLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXNicy1ldmVudCIpLGUuY2hhbmdlVHlwZT0ic2Nyb2xsIj09PWUuYW5pbVR5cGU/InNjcm9sbCI6InRpbWUiLGUudHJpZ2dlcj0iZWRpdCI9PT10Lm1vZGU/ZS5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGQtc2JzdHJnLXZhbHVlIik6ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtdHJnIiksZS50cmlnZ2VyPWUudHJpZ2dlcj9lLnRyaWdnZXI6MSxlLnRyaWdnZXJFbGVtcz1lLmdldEF0dHJpYnV0ZSh0LnRyaWdnZXJFbGVtc0F0dHJOYW1lKSxlLndyYXBwZXJFbD1lLnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIiksZS5zdGVwcz1bXTt2YXIgbj0iZWRpdCI9PT10Lm1vZGU/ZS5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGQtc2Jzb3B0cy12YWx1ZSIpOmUuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc2JzLW9wdHMiKTtpZihuKXstMSE9PW4uaW5kZXhPZigiZml4ZWQiKSYmKGUuekluZGV4PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLmdldFByb3BlcnR5VmFsdWUoInotaW5kZXgiKSksbj1uLnJlcGxhY2UoLycvZywnIicpO3ZhciBpPUpTT04ucGFyc2Uobik7dF9hbmltYXRpb25TQlNfX2FkZERlbGF5VG9TdGVwcyhpKSxlLmxvb3A9ImVkaXQiPT09dC5tb2RlP2UuZ2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkLXNic2xvb3AtdmFsdWUiKTplLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXNicy1sb29wIiksdF9hbmltYXRpb25TQlNfX3NldEFuZENhY2hlRWxUb3BQb3MoZSx0KTtmb3IodmFyIGE9MCxyPTA7cjxpLmxlbmd0aDtyKyspe3ZhciBvPXtzdGF0ZToidW5hY3RpdmUifTtvLnN0eWxlcz10X2FuaW1hdGlvblNCU19fY3JlYXRlU3RlcFN0eWxlcyhpW3JdKSwic2Nyb2xsIj09PWUuY2hhbmdlVHlwZT8oby5wcmV2VW5maXhlZERpc3Q9YSxvLmRpc3Q9aVtyXS5kaSwhMT09PW8uc3R5bGVzLmZpeCYmKGErPU51bWJlcihvLmRpc3QpKSxvLnN0YXJ0PTA9PT1yP2UudG9wT2Zmc2V0OmUuc3RlcHNbci0xXS5lbmQsby5lbmQ9by5zdGFydCsxKm8uZGlzdCk6KG8udGltZT1pW3JdLnRpLG8uZWFzZT1pW3JdLmVhKSxlLnN0ZXBzLnB1c2gobyl9dF9hbmltYXRpb25TQlNfX3VwZGF0ZUluZm9PbkltZ0xvYWQoZSx0KSx0X2FuaW1hdGlvblNCU19fdXBkYXRlTW92ZUFuZFJvdGF0ZVN0ZXBzU3R5bGVzKGUuc3RlcHMpfX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVTYnNfX3Jlc2V0KHQpe2Zvcih2YXIgZT10LmVscyxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpPWVbbl0uYW5pbVR5cGU7aWYoImludG92aWV3Ij09PWl8fCJibG9ja2ludG92aWV3Ij09PWl8fCJjbGljayI9PT1pfHwiaG92ZXIiPT09aSl7ZVtuXS5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNicy1hbmltX3N0YXJ0ZWQiKTt2YXIgYT1lW25dLnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIik7YSYmKGEuc3R5bGUub3BhY2l0eT0iIil9ZWxzZXtlW25dLnN0YXRlPSJyZXNldGVkIjt2YXIgcj1lW25dLndyYXBwZXJFbDtyJiYoci5zdHlsZS50cmFuc2Zvcm09IiIsci5zdHlsZS5wb3NpdGlvbj0iIixyLnN0eWxlLnRvcD0iIixyLnN0eWxlLm9wYWNpdHk9IiIpfX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dldFNpemVCYXNlZE9uRGltZW5zaW9uTW9kZSh0KXtpZighdClyZXR1cm57d2lkdGg6ImluaGVyaXQiLGhlaWdodDoiaW5oZXJpdCJ9O3ZhciBlPXQucGFyZW50Tm9kZS5jbG9zZXN0KCIudG4tZ3JvdXAiKXx8dC5wYXJlbnROb2RlLG4saSxhO3JldHVybiBlJiZ0Mzk2X19pc0ZsZXgoZSk/e3dpZHRoOiJmaWxsIj09PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZSh0LCJ3aWR0aG1vZGUiKT8iMTAwJSI6ImluaGVyaXQiLGhlaWdodDoiZmlsbCI9PT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUodCwiaGVpZ2h0bW9kZSIpPyIxMDAlIjoiaW5oZXJpdCJ9Ont3aWR0aDoiaW5oZXJpdCIsaGVpZ2h0OiJpbmhlcml0In19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3dyYXBFbCh0LGUpe2lmKCF0KXJldHVybiExO3ZhciBuPXQucGFyZW50Tm9kZSxpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGE9dF9hbmltYXRpb25TQlNfX2dldFNpemVCYXNlZE9uRGltZW5zaW9uTW9kZShuKSxyPWEud2lkdGgsbz1hLmhlaWdodDsic3RyaW5nIj09dHlwZW9mIGU/aS5jbGFzc0xpc3QuYWRkKGUpOmUuZm9yRWFjaCgoZnVuY3Rpb24odCl7aS5jbGFzc0xpc3QuYWRkKHQpfSkpLGkuc3R5bGUuZGlzcGxheT0iaW5oZXJpdCIsaS5zdHlsZS53aWR0aD1yLGkuc3R5bGUuaGVpZ2h0PW8saS5hcHBlbmRDaGlsZCh0KSxuJiZuLmFwcGVuZENoaWxkKGkpfXdpbmRvdy50X2FuaW1hdGlvblNCU19faXNGaXJlZm94PS0xIT09bmF2aWdhdG9yLnVzZXJBZ2VudC5zZWFyY2goIkZpcmVmb3giKSx3aW5kb3cudF9hbmltYXRpb25TQlNfX2lzU2FmYXJpPS9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksd2luZG93LmFuaW1hdGlvblNCU19faXNJT1M9L2lQaG9uZXxpUGFkfGlQb2QvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHwib250b3VjaGVuZCJpbiBkb2N1bWVudCYmL01hY2ludG9zaC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx3aW5kb3cuYW5pbWF0aW9uU0JTX19pc09sZFBhZ2U9Qm9vbGVhbihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbc3JjKj0idGlsZGEtYmxvY2tzLTIuNyJdJykpLCJ2aXNpYmxlIj09PWRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZT8ibG9hZGluZyIhPT1kb2N1bWVudC5yZWFkeVN0YXRlP3RfYW5pbWF0aW9uU0JTX19pbml0KCk6ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsdF9hbmltYXRpb25TQlNfX2luaXQpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLHRfYW5pbWF0aW9uU0JTX19jaGVja1Zpc2liaWxpdHlQYWdlKTsKCmZ1bmN0aW9uIHRfZ2V0Wm9vbVN0YXRlKCl7cmV0dXJuIHdpbmRvdy50X3pvb21TdGF0ZXx8KHdpbmRvdy50X3pvb21TdGF0ZT17aXNNb2JpbGU6dCgpLG5lZWRMb2NrOmUoKSxoYXNMYXp5Om8oKSxpc1NhZmFyaTovXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLGlzT3BlbjohMSxpc0luaXRlZDohMSxpc0RvdWJsZVRhcEFjdGl2YXRlZDohMX0pLHdpbmRvdy50X3pvb21TdGF0ZTtmdW5jdGlvbiB0KCl7dmFyIHQ9L0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO3JldHVybiB0fHwodD1uYXZpZ2F0b3IudXNlckFnZW50LmluY2x1ZGVzKCJNYWNpbnRvc2giKSYmIm9udG91Y2hlbmQiaW4gZG9jdW1lbnQpLHR9ZnVuY3Rpb24gZSgpe3ZhciB0O2lmKC8oYW5kcm9pZCkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKXJldHVybiEwO3ZhciBlPS9pUGhvbmV8aVBhZHxpUG9kL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtpZighZSlyZXR1cm4hMTt2YXIgbz1uYXZpZ2F0b3IuYXBwVmVyc2lvbi5tYXRjaCgvT1MgKFxkKylfKFxkKylfPyhcZCspPy8pLHI9byYmcGFyc2VJbnQob1sxXSwxMCk7cmV0dXJuIGUmJjExPT09ciYmIXdpbmRvdy5NU1N0cmVhbX1mdW5jdGlvbiBvKCl7aWYoInkiPT09d2luZG93LmxhenkpcmV0dXJuITA7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKTtyZXR1cm4gdCYmInllcyI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1sYXp5Iil9fWZ1bmN0aW9uIHRfc2V0Wm9vbVN0YXRlVmFsdWUodCxlKXt2YXIgbz10X2dldFpvb21TdGF0ZSgpO3QmJk9iamVjdC5rZXlzKG8pLmluY2x1ZGVzKHQpJiYob1t0XT1lKX1mdW5jdGlvbiB0X2luaXRab29tKCl7dmFyIHQsZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC16b29tZXJfX3dyYXBwZXIiKSxvLHI9dF9nZXRab29tU3RhdGUoKS5pc0luaXRlZDtpZighZSYmIXIpe3ZhciBuLGE7dF9zZXRab29tU3RhdGVWYWx1ZSgiaXNJbml0ZWQiLCEwKSxBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLXpvb21hYmxlXSIpKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiJ5ZXMiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtem9vbWFibGUiKSYmIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNsZHNfX3RodW1ic19nYWxsZXJ5IikmJiIiIT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtaW1nLXpvb20tdXJsIil9KSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmFkZCgidC16b29tYWJsZSIpfSkpO3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2kuY2xhc3NMaXN0LmFkZCgidC16b29tZXJfX3dyYXBwZXIiKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmNsYXNzTGlzdC5hZGQoInQtem9vbWVyX19jb250YWluZXIiKTt2YXIgcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtzLmNsYXNzTGlzdC5hZGQoInQtem9vbWVyX19iZyIpO3ZhciBsPXRfem9vbV9fY3JlYXRlQ2xvc2VCdG4oKSxkPXRfem9vbV9fY3JlYXRlU2NhbGVCdG4oKTtpLmFwcGVuZENoaWxkKGMpLGkuYXBwZW5kQ2hpbGQocyk7dmFyIF89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Xy5jbGFzc0xpc3QuYWRkKCJ0LXpvb21lcl9fdWktd3JhcHBlciIpLF8uYXBwZW5kQ2hpbGQoZCksXy5hcHBlbmRDaGlsZChsKSxpLmFwcGVuZENoaWxkKF8pLG51bGw9PSh0PWRvY3VtZW50LmJvZHkpfHx0Lmluc2VydEFkamFjZW50RWxlbWVudCgiYmVmb3JlZW5kIixpKSx0X3pvb21fX3NldEV2ZW50cygpfX1mdW5jdGlvbiB0X3pvb21fX2FwcGVuZFByZWxvYWRlclRvRWxlbWVudCh0KXt2YXIgZSxvPXRfZ2V0Wm9vbVN0YXRlKCkuaGFzTGF6eTtpZih0JiZvKXt2YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyLmNsYXNzTGlzdC5hZGQoInQtem9vbWVyLWxvYWRlciIpLHIuaW5uZXJIVE1MPXRfem9vbV9fZ2V0SWNvbkhUTUwoImxvYWRlciIpLHQuYXBwZW5kKHIpfX1mdW5jdGlvbiB0X3pvb21fX2NyZWF0ZUNsb3NlQnRuKCl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cmV0dXJuIHQuY2xhc3NMaXN0LmFkZCgidC16b29tZXJfX2Nsb3NlIiwidC16b29tZXJfX3VpLWl0ZW0iKSx0Lmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIix0X3pvb21fX2dldEljb25IVE1MKCJjbG9zZSIpKSx0fWZ1bmN0aW9uIHRfem9vbV9fY3JlYXRlU2NhbGVCdG4oKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gdC5jbGFzc0xpc3QuYWRkKCJ0LXpvb21lcl9fc2NhbGUiLCJ0LXpvb21lcl9fdWktaXRlbSIpLHQuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLHRfem9vbV9fZ2V0SWNvbkhUTUwoImljb24taW5jcmVhc2UiKSksdC5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWVuZCIsdF96b29tX19nZXRJY29uSFRNTCgiaWNvbi1kZWNyZWFzZSIpKSx0fWZ1bmN0aW9uIHRfem9vbV9fZ2V0SWNvbkhUTUwodCl7cmV0dXJuImljb24taW5jcmVhc2UiPT09dD8nPHN2Z1xuXHRcdGNsYXNzPSJpY29uLWluY3JlYXNlIlxuXHRcdHdpZHRoPSIxNyJcblx0XHRoZWlnaHQ9IjE3IlxuXHRcdHZpZXdCb3g9IjAgMCAxNyAxNyJcblx0XHRmaWxsPSJub25lIlxuXHRcdHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyJcblx0PlxuXHRcdDxwYXRoXG5cdFx0XHRmaWxsPSJibGFjayJcblx0XHRcdGZpbGwtcnVsZT0iZXZlbm9kZCJcblx0XHRcdGNsaXAtcnVsZT0iZXZlbm9kZCJcblx0XHRcdGQ9Ik03LjM4NzggNC43Nzg2NkM3LjM4Nzg2IDQuNDQ3MzUgNy42NTU4NiA0LjE3OTI5IDcuOTg3MTggNC4xNzkyN0M4LjMxODUyIDQuMTc5MjcgOC41ODY1MSA0LjQ0NzM0IDguNTg2NTcgNC43Nzg2Nkw4LjU4NTg4IDcuMzI3NDJIMTEuMTM1M0MxMS40NjY1IDcuMzI3NDIgMTEuNzM1OCA3LjU5NTcxIDExLjczNjEgNy45MjY4QzExLjczNjEgOC4yNTgwMSAxMS40NjcyIDguNTI2NjEgMTEuMTM2IDguNTI2ODhIOC41ODY1N0w4LjU4NzI2IDExLjA3NTZDOC41ODcyNiAxMS40MDcgOC4zMTg1NSAxMS42NzU3IDcuOTg3MTggMTEuNjc1N0M3LjY1NTgyIDExLjY3NTcgNy4zODcxMSAxMS40MDcgNy4zODcxMSAxMS4wNzU2TDcuMzg2NDIgOC41MjY4OEw0LjgzODM1IDguNTI2ODhDNC41MDcxNSA4LjUyNjcyIDQuMjM5MDIgOC4yNTg3MiA0LjIzODk2IDcuOTI3NDlDNC4yMzg5NiA3LjU5NjIyIDQuNTA3MTEgNy4zMjgyNyA0LjgzODM1IDcuMzI4MTFMNy4zODcxMSA3LjMyNzQyTDcuMzg3OCA0Ljc3ODY2WiJcblx0XHQvPlxuXHRcdDxwYXRoXG5cdFx0XHRzdHJva2U9ImJsYWNrIlxuXHRcdFx0ZD0iTTEyLjk4NjUgMTIuOTg2NkMxMC4xNTI5IDE1LjgyMDIgNS41NTg3MiAxNS44MjAyIDIuNzI1MTIgMTIuOTg2NkMtMC4xMDg0ODQgMTAuMTUzIC0wLjEwODQ4NCA1LjU1ODc5IDIuNzI1MTIgMi43MjUxOUM1LjU1ODcyIC0wLjEwODQxNiAxMC4xNTI5IC0wLjEwODQxNSAxMi45ODY1IDIuNzI1MTlDMTUuODIwMSA1LjU1ODc5IDE1LjgyMDEgMTAuMTUzIDEyLjk4NjUgMTIuOTg2NlpNMTIuOTg2NSAxMi45ODY2TDE2LjMwOCAxNi4zMDgxIlxuXHRcdFx0c3Ryb2tlLXdpZHRoPSIxLjIiXG5cdFx0XHRzdHJva2UtbGluZWNhcD0icm91bmQiXG5cdFx0Lz5cblx0PC9zdmc+JzoiaWNvbi1kZWNyZWFzZSI9PT10Pyc8c3ZnXG5cdFx0Y2xhc3M9Imljb24tZGVjcmVhc2UiXG5cdFx0d2lkdGg9IjE3IlxuXHRcdGhlaWdodD0iMTciXG5cdFx0dmlld0JveD0iMCAwIDE3IDE3IlxuXHRcdGZpbGw9Im5vbmUiXG5cdFx0eG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIlxuXHQ+XG5cdFx0PHBhdGhcblx0XHRcdGZpbGw9ImJsYWNrIlxuXHRcdFx0ZmlsbC1ydWxlPSJldmVub2RkIlxuXHRcdFx0Y2xpcC1ydWxlPSJldmVub2RkIlxuXHRcdFx0ZD0iTTQuMjM4ODMgNy45Mjc1N0M0LjIzODgzIDcuNTk2MyA0LjUwNjk4IDcuMzI4MzUgNC44MzgyMiA3LjMyODE5TDExLjEzNTIgNy4zMjc1QzExLjQ2NjQgNy4zMjc1IDExLjczNTYgNy41OTU3OSAxMS43MzYgNy45MjY4OEMxMS43MzYgOC4yNTgwOSAxMS40NjcgOC41MjY2OSAxMS4xMzU5IDguNTI2OTZMNC44MzgyMiA4LjUyNjk2QzQuNTA3MDIgOC41MjY4IDQuMjM4ODkgOC4yNTg4IDQuMjM4ODMgNy45Mjc1N1oiXG5cdFx0Lz5cblx0XHQ8cGF0aFxuXHRcdFx0c3Ryb2tlPSJibGFjayJcblx0XHRcdGQ9Ik0xMi45ODY1IDEyLjk4NjZDMTAuMTUyOSAxNS44MjAyIDUuNTU4NzIgMTUuODIwMiAyLjcyNTEyIDEyLjk4NjZDLTAuMTA4NDg0IDEwLjE1MyAtMC4xMDg0ODQgNS41NTg4MiAyLjcyNTEyIDIuNzI1MjJDNS41NTg3MiAtMC4xMDgzODYgMTAuMTUyOSAtMC4xMDgzODUgMTIuOTg2NSAyLjcyNTIyQzE1LjgyMDEgNS41NTg4MiAxNS44MjAxIDEwLjE1MyAxMi45ODY1IDEyLjk4NjZaTTEyLjk4NjUgMTIuOTg2NkwxNi4zMDggMTYuMzA4MSJcblx0XHRcdHN0cm9rZS13aWR0aD0iMS4yIlxuXHRcdFx0c3Ryb2tlLWxpbmVjYXA9InJvdW5kIlxuXHRcdC8+XG5cdDwvc3ZnPic6ImNsb3NlIj09PXQ/J1xuXHRcdDxzdmcgd2lkdGg9IjE0IiBoZWlnaHQ9IjE0IiB2aWV3Qm94PSIwIDAgMTQgMTQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+XG5cdFx0XHQ8cGF0aFxuXHRcdFx0XHRmaWxsPSJibGFjayJcblx0XHRcdFx0ZmlsbC1ydWxlPSJldmVub2RkIlxuXHRcdFx0XHRjbGlwLXJ1bGU9ImV2ZW5vZGQiXG5cdFx0XHRcdGQ9Ik0xMi4xNzU3IDAuMTc1NzMyQzEyLjQxMDEgLTAuMDU4NTc0OCAxMi43ODkxIC0wLjA1ODU3OTkgMTMuMDIzNCAwLjE3NTczMkMxMy4yNTc2IDAuNDEwMDUzIDEzLjI1NzcgMC43ODkxMTEgMTMuMDIzNCAxLjAyMzM5TDcuNDQ3MjIgNi41OTk1NkwxMy4wMjM0IDEyLjE3NTdDMTMuMjU3NiAxMi40MTAxIDEzLjI1NzcgMTIuNzg5MSAxMy4wMjM0IDEzLjAyMzRDMTIuNzg5MSAxMy4yNTc3IDEyLjQxMDEgMTMuMjU3NiAxMi4xNzU3IDEzLjAyMzRMNi41OTk1NiA3LjQ0NzIyTDEuMDIzMzkgMTMuMDIzNEMwLjc4OTEwNyAxMy4yNTc2IDAuNDEwMDI2IDEzLjI1NzYgMC4xNzU3MzYgMTMuMDIzNEMtMC4wNTg1NDU0IDEyLjc4OTEgLTAuMDU4NDc5MSAxMi40MTAxIDAuMTc1NzM2IDEyLjE3NTdMNS43NTE5MSA2LjU5OTU2TDAuMTc1NzM2IDEuMDIzMzlDLTAuMDU4NTc4NiAwLjc4OTA3NCAtMC4wNTg1Nzg2IDAuNDEwMDQ3IDAuMTc1NzM2IDAuMTc1NzMyQzAuNDEwMDUxIC0wLjA1ODU3NDggMC43ODkwOCAtMC4wNTg1Nzk5IDEuMDIzMzkgMC4xNzU3MzJMNi41OTk1NiA1Ljc1MTlMMTIuMTc1NyAwLjE3NTczMloiXG5cdFx0XHQvPlxuXHRcdDwvc3ZnPic6ImxvYWRlciI9PT10Pydcblx0XHQ8c3ZnIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDMyIDMyIiB3aWR0aD0iNDAiIGhlaWdodD0iNDAiPlxuXHRcdFx0PGcgZmlsbD0iI2M1YzVjNSI+XG5cdFx0XHRcdDxyZWN0IGNsYXNzPSJ0LWljb24tbG9hZGVyLXJlY3QiIHg9IjE0IiB3aWR0aD0iNCIgaGVpZ2h0PSIxMSIgcng9IjIiIC8+XG5cdFx0XHRcdDxyZWN0IGNsYXNzPSJ0LWljb24tbG9hZGVyLXJlY3QiIHg9IjE0IiB3aWR0aD0iNCIgaGVpZ2h0PSIxMSIgcng9IjIiIHRyYW5zZm9ybT0icm90YXRlKDQ1IDE2IDE2KSIgLz5cblx0XHRcdFx0PHJlY3QgY2xhc3M9InQtaWNvbi1sb2FkZXItcmVjdCIgeD0iMTQiIHdpZHRoPSI0IiBoZWlnaHQ9IjExIiByeD0iMiIgdHJhbnNmb3JtPSJyb3RhdGUoOTAgMTYgMTYpIiAvPlxuXHRcdFx0XHQ8cmVjdCBjbGFzcz0idC1pY29uLWxvYWRlci1yZWN0IiB4PSIxNCIgd2lkdGg9IjQiIGhlaWdodD0iMTEiIHJ4PSIyIiB0cmFuc2Zvcm09InJvdGF0ZSgxMzUgMTYgMTYpIiAvPlxuXHRcdFx0XHQ8cmVjdCBjbGFzcz0idC1pY29uLWxvYWRlci1yZWN0IiB4PSIxNCIgd2lkdGg9IjQiIGhlaWdodD0iMTEiIHJ4PSIyIiB0cmFuc2Zvcm09InJvdGF0ZSgxODAgMTYgMTYpIiAvPlxuXHRcdFx0XHQ8cmVjdCBjbGFzcz0idC1pY29uLWxvYWRlci1yZWN0IiB4PSIxNCIgd2lkdGg9IjQiIGhlaWdodD0iMTEiIHJ4PSIyIiB0cmFuc2Zvcm09InJvdGF0ZSgyMjUgMTYgMTYpIiAvPlxuXHRcdFx0XHQ8cmVjdCBjbGFzcz0idC1pY29uLWxvYWRlci1yZWN0IiB4PSIxNCIgd2lkdGg9IjQiIGhlaWdodD0iMTEiIHJ4PSIyIiB0cmFuc2Zvcm09InJvdGF0ZSgyNzAgMTYgMTYpIiAvPlxuXHRcdFx0XHQ8cmVjdCBjbGFzcz0idC1pY29uLWxvYWRlci1yZWN0IiB4PSIxNCIgd2lkdGg9IjQiIGhlaWdodD0iMTEiIHJ4PSIyIiB0cmFuc2Zvcm09InJvdGF0ZSgzMTUgMTYgMTYpIiAvPlxuXHRcdFx0PC9nPlxuXHRcdDwvc3ZnPic6ImFycm93LWxlZnQiPT09dD8nPHN2ZyB3aWR0aD0iOSIgaGVpZ2h0PSIxNCIgdmlld0JveD0iMCAwIDkgMTQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+XG5cdFx0XHRcdDxwYXRoIGQ9Ik03LjYyOTM5IDAuNjAwMDA2TDAuODc5Mzk1IDYuOTAwMDFMNy42MjkzOSAxMy4yIiBzdHJva2U9ImJsYWNrIiBzdHJva2Utd2lkdGg9IjEuMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+XG5cdFx0XHRcdDwvc3ZnPic6ImFycm93LXJpZ2h0Ij09PXQ/Jzxzdmcgd2lkdGg9IjkiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCA5IDE0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPlxuXHRcdFx0XHQ8cGF0aCBkPSJNMC41OTk5NzYgMC42MDAwMDZMNy4zNDk5OCA2LjkwMDAxTDAuNTk5OTc2IDEzLjIiIHN0cm9rZT0iYmxhY2siIHN0cm9rZS13aWR0aD0iMS4yIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz5cblx0XHRcdFx0PC9zdmc+JzoiIn1mdW5jdGlvbiB0X3pvb21fX3NldEV2ZW50cygpe3ZhciB0LGU9dF9nZXRab29tU3RhdGUoKS5pc01vYmlsZSxvPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXpvb21lcl9fY2xvc2UiKTtudWxsPT1vfHxvLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoZnVuY3Rpb24oKXtyZXR1cm4gdF96b29tX2Nsb3NlKCl9KSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsKGZ1bmN0aW9uKHQpe3ZhciBlLG87aWYodF9nZXRab29tU3RhdGUoKS5pc09wZW4pc3dpdGNoKHQua2V5KXtjYXNlIkVzY2FwZSI6dC5wcmV2ZW50RGVmYXVsdCgpLHRfem9vbV9jbG9zZSgpO2JyZWFrO2Nhc2UiQXJyb3dMZWZ0Ijp0LnByZXZlbnREZWZhdWx0KCksdF96b29tX19zZXRFdmVudE9uQnRuKCJwcmV2Iik7YnJlYWs7Y2FzZSJBcnJvd1JpZ2h0Ijp0LnByZXZlbnREZWZhdWx0KCksdF96b29tX19zZXRFdmVudE9uQnRuKCJuZXh0Iil9fSkpO3ZhciByPScudC16b29tYWJsZTpub3QoW2RhdGEtaW1nLXpvb20tdXJsPSIiXSksIC50LXNsZHNfX3RodW1ic19nYWxsZXJ5LXpvb21hYmxlJztkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKGZ1bmN0aW9uKHQpe3ZhciBlPXQudGFyZ2V0LmNsb3Nlc3Qocik7ZSYmdF96b29tX29wZW5HYWxsZXJ5KGUpfSkpO3ZhciBuPWU/Im9yaWVudGF0aW9uY2hhbmdlIjoicmVzaXplIjt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihuLHRfem9vbV9jaGVja0ZvclNjYWxlKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihuLHRfem9vbV9fdXBkYXRlQWN0aXZlU2xpZGVQb3MpLHRfem9vbV9faGlkZUdhbGxlcnlVSSgpfWZ1bmN0aW9uIHRfem9vbV9fcGxheUFuaW1hdGVkT3Blbih0LGUpe2lmKHQmJmUpaWYoZS5zcmMpcihlLnNyYyk7ZWxzZXt2YXIgbz1uZXcgTXV0YXRpb25PYnNlcnZlcigoZnVuY3Rpb24odCl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXsiYXR0cmlidXRlcyI9PT10LnR5cGUmJiJzcmMiPT09dC5hdHRyaWJ1dGVOYW1lJiYocihlLnNyYyksby5kaXNjb25uZWN0KCkpfSkpfSkpO28ub2JzZXJ2ZShlLHthdHRyaWJ1dGVzOiEwfSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtvLmRpc2Nvbm5lY3QoKX0pLDVlMyl9ZnVuY3Rpb24gcihlKXt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtvLmNsYXNzTGlzdC5hZGQoInRfem9vbWVyX19hbmltYXRlZC13cmFwcGVyIik7dmFyIHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIik7ci5zcmM9ZSxyLmNsYXNzTGlzdC5hZGQoInRfem9vbWVyX19hbmltYXRlZC1pbWFnZSIpO3ZhciBhPWkodCksYz1hLnRvcCxzPWEubGVmdCxsPWEud2lkdGgsZD1hLmhlaWdodDtvLnN0eWxlLmNzc1RleHQ9IlxuXHRcdFx0dG9wOiAiK2MrInB4O1xuXHRcdFx0bGVmdDogIitzKyJweDtcblx0XHRcdHdpZHRoOiAiK2wrInB4O1xuXHRcdFx0aGVpZ2h0OiAiK2QrInB4O1xuXHRcdCIsby5hcHBlbmRDaGlsZChyKSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG8pLHIuY29tcGxldGU/bihvKTpyLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe3JldHVybiBuKG8pfSkpfWZ1bmN0aW9uIG4odCl7dC5jbGFzc0xpc3QuYWRkKCJ0X3pvb21lcl9fYW5pbWF0ZWQtd3JhcHBlci0tbG9hZGVkIiksYShlLChmdW5jdGlvbihlKXt2YXIgbz1lLnRvcCxyPWUubGVmdCxuPWUud2lkdGgsYT1lLmhlaWdodDt0LnN0eWxlLmNzc1RleHQ9IlxuXHRcdFx0XHR0b3A6ICIrbysicHg7XG5cdFx0XHRcdGxlZnQ6ICIrcisicHg7XG5cdFx0XHRcdHdpZHRoOiAiK24rInB4O1xuXHRcdFx0XHRoZWlnaHQ6ICIrYSsicHg7XG5cdFx0XHQiLHQuYWRkRXZlbnRMaXN0ZW5lcigidHJhbnNpdGlvbmVuZCIsKGZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwOnQucmVtb3ZlKCl9KSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtudWxsPT10fHx0LnJlbW92ZSgpfSksMWU0KX0pKX1mdW5jdGlvbiBhKHQsZSl7IklNRyIhPT10LnRhZ05hbWV8fHQuY29tcGxldGUmJnQub2Zmc2V0SGVpZ2h0JiZ0Lm9mZnNldFdpZHRoP2UodC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk6dC5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoZnVuY3Rpb24oKXtlKHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpfSkpfWZ1bmN0aW9uIGkodCl7dmFyIGU9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxvPWUudG9wLHI9ZS5sZWZ0LG49ZS53aWR0aCxhPWUuaGVpZ2h0LGkscztpZihvKz13aW5kb3cuc2Nyb2xsWSxyKz13aW5kb3cuc2Nyb2xsWCx0X2dldFpvb21TdGF0ZSgpLmlzU2FmYXJpKXt2YXIgbD1jKHQpO28qPWwscio9bCxuKj1sLGEqPWx9cmV0dXJue3RvcDpvLT13aW5kb3cuc2Nyb2xsWSxsZWZ0OnItPXdpbmRvdy5zY3JvbGxYLHdpZHRoOm4saGVpZ2h0OmF9fWZ1bmN0aW9uIGModCl7dmFyIGU9dC5jbG9zZXN0KCIuciIpO2lmKCFlKXJldHVybiAxO3ZhciBvLHI9WyItLXQtem9vbSIsIi0tem9vbSJdLmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVybiBnZXRDb21wdXRlZFN0eWxlKGUpLmdldFByb3BlcnR5VmFsdWUodCl9KSk7aWYoIXIpcmV0dXJuIDE7dmFyIG49Z2V0Q29tcHV0ZWRTdHlsZShlKS5nZXRQcm9wZXJ0eVZhbHVlKHIpO3JldHVybiBwYXJzZUZsb2F0KG4pfHwxfX1mdW5jdGlvbiB0X3pvb21fb3BlbkdhbGxlcnkodCl7dmFyIGU9dF9nZXRab29tU3RhdGUoKSxvPWUuaXNNb2JpbGUscjtpZighZS5pc09wZW4pe2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgidC16b29tZXJfX3Nob3ciKSx0X3RyaWdnZXJFdmVudChkb2N1bWVudC5ib2R5LCJwb3B1cFNob3dlZCIpLHRfc2V0Wm9vbVN0YXRlVmFsdWUoImlzT3BlbiIsITApO3ZhciBuPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXpvb21lcl9fd3JhcHBlciIpLGE7biYmbi5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgiem9vbTpvcGVuIikpLGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXBvcHVwX3Nob3ciKSYmZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJ0LXpvb21lcl9fYWN0aXZlIik7dmFyIGk9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtem9vbWVyX19jb250YWluZXIiKTtvJiZpLmNsYXNzTGlzdC5hZGQoInQtem9vbWVyX19jb250YWluZXItLW1vYmlsZSIpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2MuY2xhc3NMaXN0LmFkZCgidC1jYXJvdXNlbF9fem9vbWVkIik7dmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cy5jbGFzc0xpc3QuYWRkKCJ0LWNhcm91c2VsX196b29tZXJfX3NsaWRlcyIpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2wuY2xhc3NMaXN0LmFkZCgidC1jYXJvdXNlbF9fem9vbWVyX19pbm5lciIpO3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuY2xhc3NMaXN0LmFkZCgidC1jYXJvdXNlbF9fem9vbWVyX190cmFjayIpLGwuYXBwZW5kQ2hpbGQoZCksdF96b29tX19hcHBlbmRQcmVsb2FkZXJUb0VsZW1lbnQobCk7dmFyIF89dF96b29tX2NyZWF0ZVNsaWRlckFycm93KCJsZWZ0IiksbT10X3pvb21fY3JlYXRlU2xpZGVyQXJyb3coInJpZ2h0Iik7cy5hcHBlbmRDaGlsZChfKSxzLmFwcGVuZENoaWxkKG0pLHMuYXBwZW5kQ2hpbGQobCksYy5hcHBlbmRDaGlsZChzKSxpJiYoaS5pbm5lckhUTUw9IiIpLGkmJmkuYXBwZW5kQ2hpbGQoYyk7dmFyIHU9dC5jbG9zZXN0KCIuciIpLGY9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtY2Fyb3VzZWxfX3pvb21lcl9fdHJhY2siKSx2O2lmKGYmJnUpdF96b29tX19hZGRpbmdJbWdzSW50b0Nhcm91c2VsKHQpLHRfem9vbV9fc2V0TW9kYWxDb2xvcnModSx0KSx0X3pvb21fX3Nob3dBY3RpdmVTbGlkZU9uSW5pdCh0KSx0X3pvb21fX3BsYXlBbmltYXRlZE9wZW4odCxmLnF1ZXJ5U2VsZWN0b3IoIi50LWNhcm91c2VsX196b29tZXJfX2l0ZW0uYWN0aXZlIGltZyIpKSx0X3pvb21fX2dldEV2ZW50T25CdG4oKSxkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoInQtem9vbWVyX19zaG93X2ZpeGVkIiksdF96b29tX19pbml0U2luZ2xlWm9vbSgpLHRfem9vbV9jaGVja0ZvclNjYWxlKCksdF96b29tX19wcm9jZXNzU2Nyb2xsTG9jaygib24iKSxvJiYodF96b29tX2luaXRTd2lwZSgpLHRfem9vbV9pbml0Q2xvc2VTd2lwZSgpKSx3aW5kb3cudHpvb21vcGVub25jZT0hMH19ZnVuY3Rpb24gdF96b29tX191cGRhdGVBY3RpdmVTbGlkZVBvcygpe3ZhciB0LGU7dF9nZXRab29tU3RhdGUoKS5pc09wZW4mJnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtY2Fyb3VzZWxfX3pvb21lcl9fdHJhY2siKTtpZih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50LWNhcm91c2VsX196b29tZXJfX2l0ZW0uYWN0aXZlIikub2Zmc2V0TGVmdDt0LnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlWCgiKy1lKyJweCkifX0pLDMwMCl9ZnVuY3Rpb24gdF96b29tX2NyZWF0ZVNsaWRlckFycm93KHQpe3ZhciBlPXRfem9vbV9fZ2V0SWNvbkhUTUwoImFycm93LSIrdCksbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtvLmNsYXNzTGlzdC5hZGQoInQtY2Fyb3VzZWxfX3pvb21lcl9fY29udHJvbCIpLG8uY2xhc3NMaXN0LmFkZCgidC1jYXJvdXNlbF9fem9vbWVyX19jb250cm9sXyIrdCksby5zZXRBdHRyaWJ1dGUoImRhdGEtem9vbWVyLXNsaWRlIiwibGVmdCI9PT10PyJwcmV2IjoibmV4dCIpO3ZhciByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiByLmNsYXNzTGlzdC5hZGQoInQtem9vbWVyX191aS1pdGVtIiksci5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWVuZCIsZSksby5hcHBlbmRDaGlsZChyKSxvfWZ1bmN0aW9uIHRfem9vbV9pbml0U3dpcGUoKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC1jYXJvdXNlbF9fem9vbWVyX19pdGVtIiksZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC16b29tZXJfX3dyYXBwZXIiKTtpZih0Lmxlbmd0aD4xKXt2YXIgbz1uZXcgSGFtbWVyKGUse2RvbUV2ZW50czohMCxpbnB1dENsYXNzOkhhbW1lci5Ub3VjaElucHV0LGNzc1Byb3BzOnt0b3VjaENvbGxvdXQ6ImRlZmF1bHQifSxyZWNvZ25pemVyczpbW0hhbW1lci5QYW4se2RpcmVjdGlvbjpIYW1tZXIuRElSRUNUSU9OX0hPUklaT05UQUx9XV19KSxyPW51bGwsbj0hMTt3aW5kb3cudHpvb21vcGVub25jZXx8KG8ub24oInBhbnN0YXJ0IiwoZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1jYXJvdXNlbF9fem9vbWVyX190cmFjayIpLG87InkiIT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtb24tdHJhbnNpdGlvbiIpP3QmJihyPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCx0LnN0eWxlLnRyYW5zaXRpb249Im5vbmUiKTpyPW51bGwsbj10X3pvb21fX2lzU2NhbGVkKGUpfSkpLG8ub24oInBhbm1vdmUiLChmdW5jdGlvbih0KXt2YXIgbz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1jYXJvdXNlbF9fem9vbWVyX190cmFjayIpLGE9by5nZXRBdHRyaWJ1dGUoImRhdGEtb24tdHJhbnNpdGlvbiIpLGk9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtb24tZHJhZyIpLGM7aWYoInkiIT09YSYmInkiIT09aSYmMT09PXQubWF4UG9pbnRlcnMmJiFuJiYoTWF0aC5hYnModC5kZWx0YVgpPjQwJiZvLnNldEF0dHJpYnV0ZSgiZGF0YS1vbi1kcmFnIiwieSIpLHIpKXt2YXIgcz1yK3QuZGVsdGFYO28uc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVYKCIrcysicHgpIn19KSksby5vbigicGFuZW5kIiwoZnVuY3Rpb24obyl7dmFyIHI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtY2Fyb3VzZWxfX3pvb21lcl9fdHJhY2siKTtyLnNldEF0dHJpYnV0ZSgiZGF0YS1vbi1kcmFnIiwiIik7dmFyIGE9ci5nZXRBdHRyaWJ1dGUoImRhdGEtb24tdHJhbnNpdGlvbiIpLGk9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtb24tZHJhZyIpO2lmKCJ5IiE9PWEmJiJ5IiE9PWkmJjE9PT1vLm1heFBvaW50ZXJzJiYhbil7ci5zdHlsZS50cmFuc2l0aW9uPSIiO3ZhciBjPU1hdGguYWJzKG8udmVsb2NpdHlYKSxzPXIub2Zmc2V0TGVmdCxsPXRbMF0ub2Zmc2V0V2lkdGgsZD1yLnF1ZXJ5U2VsZWN0b3IoIi50LWNhcm91c2VsX196b29tZXJfX2l0ZW0uYWN0aXZlIikub2Zmc2V0TGVmdCxfLG09KGwtTWF0aC5hYnMocytkKSkvYy8xZTM7bT4uNj9tPS42Om08LjImJihtPS4yKSxyLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj1tKyJzIixvLnZlbG9jaXR5WDwtLjV8fG8uZGVsdGFYPC04MD8odF96b29tX3Vuc2NhbGUoKSx0X3pvb21fc2hvd1NsaWRlKCJuZXh0IiksdF96b29tX2NoZWNrRm9yU2NhbGUoKSk6by52ZWxvY2l0eVg+LjV8fG8uZGVsdGFYPjgwPyh0X3pvb21fdW5zY2FsZSgpLHRfem9vbV9zaG93U2xpZGUoInByZXYiKSx0X3pvb21fY2hlY2tGb3JTY2FsZSgpKTp0X3pvb21fc2hvd1NsaWRlKCl9fSkpKX19ZnVuY3Rpb24gdF96b29tX19oaWRlR2FsbGVyeVVJKCl7dmFyIHQ9MCxlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXpvb21lcl9fd3JhcHBlciIpLG87ZnVuY3Rpb24gcigpe3QmJmNsZWFyVGltZW91dCh0KSxuKCJyZW1vdmUiKSx0PXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dmFyIGUsbztuKHRfZ2V0Wm9vbVN0YXRlKCkuaXNPcGVuPyJhZGQiOiJyZW1vdmUiKSx0PTB9KSwyZTMpfWZ1bmN0aW9uIG4odCl7dmFyIGU9InQtem9vbWVyX19oaWRlLWFuaW1hdGlvbiIsbztkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC16b29tZXJfX3VpLWl0ZW0sIC50LXpvb21lcl9fY29tbWVudHMiKS5mb3JFYWNoKChmdW5jdGlvbihvKXtyZXR1cm4gby5jbGFzc0xpc3RbdF0oZSl9KSl9WyJ0b3VjaHN0YXJ0IiwidG91Y2htb3ZlIiwidG91Y2hlbmQiLCJtb3VzZW1vdmUiLCJjbGljayIsInpvb206b3BlbiJdLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBlLmFkZEV2ZW50TGlzdGVuZXIodCxyKX0pKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwoZnVuY3Rpb24odCl7dmFyIGUsbzt0X2dldFpvb21TdGF0ZSgpLmlzT3BlbiYmWyJBcnJvd0xlZnQiLCJBcnJvd1JpZ2h0Il0uaW5jbHVkZXModC5rZXkpJiZyKCl9KSksZS5hZGRFdmVudExpc3RlbmVyKCJ6b29tOmNsb3NlIiwoZnVuY3Rpb24oKXt0JiZjbGVhclRpbWVvdXQodCksbigicmVtb3ZlIil9KSl9ZnVuY3Rpb24gdF96b29tX19pbml0U2luZ2xlWm9vbSgpe3ZhciB0LGU7MT09PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWNhcm91c2VsX196b29tZXJfX2l0ZW0iKS5sZW5ndGgmJmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWNhcm91c2VsX196b29tZXJfX2NvbnRyb2wiKS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LnN0eWxlLmRpc3BsYXk9Im5vbmUifSkpfWZ1bmN0aW9uIHRfem9vbV9fZ2V0RXZlbnRPbkJ0bigpe3ZhciB0O1t7bmFtZToicmlnaHQiLGRpcmVjdGlvbjoibmV4dCJ9LHtuYW1lOiJsZWZ0IixkaXJlY3Rpb246InByZXYifV0uZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5uYW1lLG89dC5kaXJlY3Rpb24scj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1jYXJvdXNlbF9fem9vbWVyX19jb250cm9sXyIrZSk7bnVsbD09cnx8ci5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKGZ1bmN0aW9uKCl7cmV0dXJuIHRfem9vbV9fc2V0RXZlbnRPbkJ0bihvKX0pKX0pKX1mdW5jdGlvbiB0X3pvb21fX3NldEV2ZW50T25CdG4odCl7dmFyIGU7aWYoIShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC1jYXJvdXNlbF9fem9vbWVyX19pdGVtIikubGVuZ3RoPD0xKSl7dmFyIG89ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtY2Fyb3VzZWxfX3pvb21lcl9fdHJhY2siKSxyPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXpvb21lcl9fd3JhcHBlciIpLG49by5nZXRBdHRyaWJ1dGUoImRhdGEtb24tdHJhbnNpdGlvbiIpLGE9ci5nZXRBdHRyaWJ1dGUoImRhdGEtb24tZHJhZyIpOyJ5IiE9PW4mJiJ5IiE9PWEmJih0X3pvb21fdW5zY2FsZSgpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dF96b29tX3Nob3dTbGlkZSh0KX0pKSl9fWZ1bmN0aW9uIHRfem9vbV9fYWRkaW5nSW1nc0ludG9DYXJvdXNlbCh0KXt2YXIgZT10LmNsb3Nlc3QoIi5yIiksbyxyPXRfZ2V0Wm9vbVN0YXRlKCkuaGFzTGF6eSxuPSIudC16b29tYWJsZTpub3QoLnQtc2xkc19fdGh1bWJzX2dhbGxlcnkpOm5vdCgudG4tYXRvbV9fc2xkcy1pbWcpIixhPShudWxsPT1lP3ZvaWQgMDplLnF1ZXJ5U2VsZWN0b3JBbGwobikpfHxbXSxpPXQuY2xvc2VzdCgiLnQtc2xkcyIpO2kmJihhPUFycmF5LmZyb20oaS5xdWVyeVNlbGVjdG9yQWxsKCIudC16b29tYWJsZTpub3QoLnQtc2xkc19fdGh1bWJzX2dhbGxlcnkpIikpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xvc2VzdCgiLnRuLWVsZW1fX2dhbGxlcnlfX3ZpZGVvLXdyYXBwZXIiKX0pKSk7dmFyIGM9dF96b29tX19nZXRab29tRGVzY3JpcHRpb25Gb250RmFtaWx5KGUpLHM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtY2Fyb3VzZWxfX3pvb21lcl9fdHJhY2siKTtBcnJheS5mcm9tKGEpLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7dmFyIG89dC5nZXRBdHRyaWJ1dGUoImRhdGEtaW1nLXpvb20tdXJsIiksbj0iIixpPSIiLGw9bz9vLnNwbGl0KCIsIik6IiIsZCxfOyJJTUciIT09dC5ub2RlTmFtZSYmIkRJViIhPT10Lm5vZGVOYW1lfHwobj10LmdldEF0dHJpYnV0ZSgidGl0bGUiKXx8IiIsaT10LmdldEF0dHJpYnV0ZSgiZGF0YS1pbWctem9vbS1kZXNjciIpfHwiIiksbiYmKChkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKS5jbGFzc0xpc3QuYWRkKCJ0LXpvb21lcl9fdGl0bGUiLCJ0LWRlc2NyIiwidC1kZXNjcl94eHMiKSxkLnRleHRDb250ZW50PW4sbnVsbCE9YyYmYy50aXRsZUZvbnRGYW1pbHkmJihkLnN0eWxlLmZvbnRGYW1pbHk9Yy50aXRsZUZvbnRGYW1pbHkpKSxpJiYoKF89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpLmNsYXNzTGlzdC5hZGQoInQtem9vbWVyX19kZXNjciIsInQtZGVzY3IiLCJ0LWRlc2NyX3h4cyIpLF8udGV4dENvbnRlbnQ9aSxudWxsIT1jJiZjLmRlc2NyRm9udEZhbWlseSYmKF8uc3R5bGUuZm9udEZhbWlseT1jLmRlc2NyRm9udEZhbWlseSkpO3ZhciBtPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO20uY2xhc3NMaXN0LmFkZCgidC1jYXJvdXNlbF9fem9vbWVyX19pdGVtIik7dmFyIHU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dS5jbGFzc0xpc3QuYWRkKCJ0LWNhcm91c2VsX196b29tZXJfX3dyYXBwZXIiKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTtpZihmLmNsYXNzTGlzdC5hZGQoInQtY2Fyb3VzZWxfX3pvb21lcl9faW1nIikscj8oZi5jbGFzc0xpc3QuYWRkKCJ0LWltZyIpLGYuc2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsIixsKSwwIT09ZSYmZSE9PWEubGVuZ3RoLTF8fGYuc2V0QXR0cmlidXRlKCJkYXRhLWxhenktcnVsZSIsInNraXAiKSk6Zi5zcmM9bCxtLmFwcGVuZENoaWxkKHUpLHUuYXBwZW5kQ2hpbGQoZiksbnx8aSl7dmFyIHY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7di5jbGFzc0xpc3QuYWRkKCJ0LXpvb21lcl9fY29tbWVudHMiKSxuJiZ2LmFwcGVuZENoaWxkKGQpLGkmJnYuYXBwZW5kQ2hpbGQoXyksdS5hcHBlbmRDaGlsZCh2KX1zLmFwcGVuZENoaWxkKG0pfSkpfWZ1bmN0aW9uIHRfem9vbV9fZ2V0Wm9vbURlc2NyaXB0aW9uRm9udEZhbWlseSh0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoJy50ODI3X19vdmVybGF5LXRpdGxlLCAudDk3OV9fb3ZlcmxheS10aXRsZSwgLnQtc2xkc19fdGl0bGUsIC50NjAzX190aXRsZSwgW2l0ZW1wcm9wPSJuYW1lIl0nKSxvPXQucXVlcnlTZWxlY3RvcignLnQ4MjdfX292ZXJsYXktZGVzY3IsIC50OTc5X19vdmVybGF5LWRlc2NyLCAudC1zbGRzX19kZXNjciwgLnQ2MDNfX2Rlc2NyLCBbaXRlbXByb3A9ImRlc2NyaXB0aW9uIl0nKSxyLG47cmV0dXJue3RpdGxlRm9udEZhbWlseTplJiZnZXRDb21wdXRlZFN0eWxlKGUpLmZvbnRGYW1pbHl8fCIiLGRlc2NyRm9udEZhbWlseTpvJiZnZXRDb21wdXRlZFN0eWxlKG8pLmZvbnRGYW1pbHl8fCIifX1mdW5jdGlvbiB0X3pvb21fX3Nob3dBY3RpdmVTbGlkZU9uSW5pdCh0KXt2YXIgZSxvPXRfZ2V0Wm9vbVN0YXRlKCkuaGFzTGF6eSxyPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LWNhcm91c2VsX196b29tZXJfX3RyYWNrIiksbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC16b29tZXJfX3dyYXBwZXIiKSxhPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWNhcm91c2VsX196b29tZXJfX2l0ZW0iKTtpZihuJiZhLmxlbmd0aCl7YS5mb3JFYWNoKChmdW5jdGlvbih0LGUpe3JldHVybiB0LnNldEF0dHJpYnV0ZSgiZGF0YS16b29tZXItc2xpZGUtbnVtYmVyIixlKX0pKSxhLmxlbmd0aD4xJiZ0X3pvb21fbG9vcFNsaWRlcigpO3ZhciBpPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWltZy16b29tLXVybCIpLGMscz0iLnQtY2Fyb3VzZWxfX3pvb21lcl9faW1nWyIrKG8/ImRhdGEtb3JpZ2luYWwiOiJzcmMiKSsnPSInK2krJyJdJyxsPWkmJmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocyksZD1udWxsPT1sP3ZvaWQgMDpsLmNsb3Nlc3QoIi50LWNhcm91c2VsX196b29tZXJfX2l0ZW0iKTtkJiYoZC5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKSx0X3pvb21fX2hpZGVJbm5hY3RpdmVTbGlkZXMoZCxyKSxyLnN0eWxlLnRyYW5zaXRpb249Im5vbmUiLHIuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVYKCIrLWQub2Zmc2V0TGVmdCsicHgpIixzZXRUaW1lb3V0KChmdW5jdGlvbigpe3Iuc3R5bGUudHJhbnNpdGlvbj0iIn0pLDIwMCkpLG8mJih0X29uRnVuY0xvYWQoInRfbGF6eWxvYWRfdXBkYXRlIix0X2xhenlsb2FkX3VwZGF0ZSksZCYmdF96b29tX19wcmVsb2FkTmV4dFNsaWRlKGQscikpfX1mdW5jdGlvbiB0X3pvb21fX2hpZGVJbm5hY3RpdmVTbGlkZXModCxlKXtpZih0KXt2YXIgbz10X3pvb21fX2dldFNsaWRlTGlzdChlKTtpZighKG8ubGVuZ3RoPD02KSl7dmFyIHI9dF96b29tX19nZXRDdXJyZW50U2xpZGVJbmRleCh0KSxuPVtyXTtuLnB1c2goMD09PXI/by5sZW5ndGg6ci0xKSxuLnB1c2gocj09PW8ubGVuZ3RoPzA6cisxKTt2YXIgYT0idC1jYXJvdXNlbF9fem9vbWVyX19pdGVtLWlubmFjdGl2ZSI7by5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT10X3pvb21fX2dldEN1cnJlbnRTbGlkZUluZGV4KHQpLG89bi5pbmNsdWRlcyhlKT8icmVtb3ZlIjoiYWRkIjt0LmNsYXNzTGlzdFtvXShhKX0pKX19fWZ1bmN0aW9uIHRfem9vbV9fZ2V0U2xpZGVMaXN0KHQpe3JldHVybiBBcnJheS5mcm9tKHQucXVlcnlTZWxlY3RvckFsbCgiLnQtY2Fyb3VzZWxfX3pvb21lcl9faXRlbTpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpIikpfWZ1bmN0aW9uIHRfem9vbV9fcHJlbG9hZE5leHRTbGlkZSh0LGUpe3ZhciBvPXRfem9vbV9fZ2V0Q3VycmVudFNsaWRlSW5kZXgodCkscj10X3pvb21fX2dldFNsaWRlTGlzdChlKSxuPXJbbysxXXx8clswXTtpZihuKXt2YXIgYT1uLnF1ZXJ5U2VsZWN0b3IoIi50LWNhcm91c2VsX196b29tZXJfX2ltZyIpLGk9ImxvYWRlZCI7YSYmIWEuY2xhc3NMaXN0LmNvbnRhaW5zKGkpJiZ0X29uRnVuY0xvYWQoInRfbGF6eWxvYWRfc2V0U291cmNlcyIsKGZ1bmN0aW9uKCl7dF9sYXp5bG9hZF9zZXRTb3VyY2VzKGEsYSwib3JpZ2luYWwtc2V0Iiwib3JpZ2luYWwiKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe2EuY2xhc3NMaXN0LmFkZChpKX0pKX0pKX19ZnVuY3Rpb24gdF96b29tX19nZXRDdXJyZW50U2xpZGVJbmRleCh0KXtyZXR1cm4gdCYmcGFyc2VJbnQodC5nZXRBdHRyaWJ1dGUoImRhdGEtem9vbWVyLXNsaWRlLW51bWJlciIpLDEwKXx8MH1mdW5jdGlvbiB0X3pvb21fc2hvd1NsaWRlKHQpe3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LWNhcm91c2VsX196b29tZXJfX3RyYWNrIiksbz1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWNhcm91c2VsX196b29tZXJfX2l0ZW0iKSxyPWUucXVlcnlTZWxlY3RvcigiLnQtY2Fyb3VzZWxfX3pvb21lcl9faXRlbS5hY3RpdmUiKSxuPTAsYT0ieSI9PT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1jYWNoZWQtem9vbSIpLGk9dF9nZXRab29tU3RhdGUoKSxjPWkuaXNNb2JpbGUscz1pLmhhc0xhenk7aWYoQXJyYXkuZnJvbShvKS5mb3JFYWNoKChmdW5jdGlvbih0LGUpe3Q9PT1yJiYobj1lKX0pKSwibmV4dCI9PT10fHwicHJldiI9PT10KXt2YXIgbD0ibmV4dCI9PT10P24rMTpvLmxlbmd0aCsobi0xKTtuPWwlby5sZW5ndGgsZS5zZXRBdHRyaWJ1dGUoImRhdGEtb24tdHJhbnNpdGlvbiIsInkiKSxjJiYiMHMiPT09Z2V0Q29tcHV0ZWRTdHlsZShlKS50cmFuc2l0aW9uRHVyYXRpb24mJiFhJiYoZS5zdHlsZS50cmFuc2l0aW9uPSIiKX12YXIgZD1vW25dLF89ZC5vZmZzZXRMZWZ0O2Z1bmN0aW9uIG0oKXtpZihkLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpLGUuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVYKCIrLV8rInB4KSIsdF96b29tX19oaWRlSW5uYWN0aXZlU2xpZGVzKGQsZSksdF96b29tX2NoZWNrRm9yU2NhbGUoKSxhKXtlLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1jYWNoZWQtem9vbSIpO3ZhciB0PW5ldyBFdmVudCgidHJhbnNpdGlvbmVuZCIpO2UuZGlzcGF0Y2hFdmVudCh0KX1pZihzKXt0X3pvb21fX3ByZWxvYWROZXh0U2xpZGUoZCxlKSx0X29uRnVuY0xvYWQoInRfbGF6eWxvYWRfdXBkYXRlIix0X2xhenlsb2FkX3VwZGF0ZSk7dmFyIG89ZC5xdWVyeVNlbGVjdG9yKCJpbWciKTtvJiYhby5zcmMmJnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dF9vbkZ1bmNMb2FkKCJ0X2xhenlsb2FkX3VwZGF0ZSIsdF9sYXp5bG9hZF91cGRhdGUpfSksMjAwKX19ci5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSxjP20oKTpyLmFkZEV2ZW50TGlzdGVuZXIoInRyYW5zaXRpb25lbmQiLChmdW5jdGlvbih0KXt0LnRhcmdldD09PXImJm0oKX0pLHtvbmNlOiEwfSl9ZnVuY3Rpb24gdF96b29tX3RyYW5zaXRGb3JMb29wKHQpe3ZhciBlLG89dF9nZXRab29tU3RhdGUoKS5oYXNMYXp5LHI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtY2Fyb3VzZWxfX3pvb21lcl9fdHJhY2siKSxuPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWNhcm91c2VsX196b29tZXJfX2l0ZW0iKSxhLGk7dCYmKCJzdGFydCI9PT10JiYoYT1uLmxlbmd0aC0yKSwiZW5kIj09PXQmJihhPTEpLGk9blthXS5vZmZzZXRMZWZ0LEFycmF5LmZyb20obikuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXtlPT09YT90LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpOnQuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIil9KSksci5zdHlsZS50cmFuc2l0aW9uPSJub25lIixyLnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlWCgiKy1pKyJweCkiLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ci5zdHlsZS50cmFuc2l0aW9uPSIiLG8mJnRfb25GdW5jTG9hZCgidF9sYXp5bG9hZF91cGRhdGUiLHRfbGF6eWxvYWRfdXBkYXRlKX0pKSl9ZnVuY3Rpb24gdF96b29tX19hcHBlbmRDbG9uZWRTbGlkZXMoKXt2YXIgdCxlO2lmKHRfZ2V0Wm9vbVN0YXRlKCkuaXNNb2JpbGUpe3ZhciBvPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LWNhcm91c2VsX196b29tZXJfX3RyYWNrIikscj1vLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWNhcm91c2VsX196b29tZXJfX2l0ZW0iKSxuPXJbMF0uY2xvbmVOb2RlKCEwKSxhPXJbci5sZW5ndGgtMV0uY2xvbmVOb2RlKCEwKTtuLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpLGEuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIiksdF96b29tX191cGRhdGVDbG9uZWRJbWdTcmMoclswXSxyW3IubGVuZ3RoLTFdLG4sYSksby5pbnNlcnRCZWZvcmUoYSxvLmZpcnN0Q2hpbGQpLG8uYXBwZW5kQ2hpbGQobil9fWZ1bmN0aW9uIHRfem9vbV9sb29wU2xpZGVyKCl7dF96b29tX19hcHBlbmRDbG9uZWRTbGlkZXMoKTt2YXIgdCxlPXRfZ2V0Wm9vbVN0YXRlKCkuaXNNb2JpbGUsbz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1jYXJvdXNlbF9fem9vbWVyX190cmFjayIpLHI9QXJyYXkuZnJvbShvLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWNhcm91c2VsX196b29tZXJfX2l0ZW0iKSk7by5hZGRFdmVudExpc3RlbmVyKCJ0cmFuc2l0aW9uZW5kIiwoZnVuY3Rpb24oKXt2YXIgdD1yLmZpbmRJbmRleCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJhY3RpdmUiKX0pKTshZXx8MCE9PXQmJnQhPT1yLmxlbmd0aC0xfHx0X3pvb21fdHJhbnNpdEZvckxvb3AoMD09PXQ/InN0YXJ0IjoiZW5kIiksby5zZXRBdHRyaWJ1dGUoImRhdGEtb24tdHJhbnNpdGlvbiIsIiIpfSkpfWZ1bmN0aW9uIHRfem9vbV9fdXBkYXRlQ2xvbmVkSW1nU3JjKHQsZSxvLHIpe3ZhciBuLGE7aWYodF9nZXRab29tU3RhdGUoKS5oYXNMYXp5KXt2YXIgaT10LnF1ZXJ5U2VsZWN0b3IoImltZyIpLGM9ZS5xdWVyeVNlbGVjdG9yKCJpbWciKSxzPW8ucXVlcnlTZWxlY3RvcigiaW1nIiksbD1yLnF1ZXJ5U2VsZWN0b3IoImltZyIpLGQ9W2ksYyxzLGxdO2lmKCFkLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiF0fSkpKXt2YXIgXz1uZXcgTXV0YXRpb25PYnNlcnZlcigoZnVuY3Rpb24odCl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZTsiYXR0cmlidXRlcyI9PT10LnR5cGUmJiJzcmMiPT09dC5hdHRyaWJ1dGVOYW1lJiYodC50YXJnZXQ9PT1pJiYoZT1zKSx0LnRhcmdldD09PWMmJihlPWwpLHQudGFyZ2V0PT09cyYmKGU9aSksdC50YXJnZXQ9PT1sJiYoZT1jKSx0LnRhcmdldC5zcmMmJiFlLnNyYyYmKGUuc3JjPXQudGFyZ2V0LnNyYykpfSkpfSkpO2QuZm9yRWFjaCgoZnVuY3Rpb24odCl7Xy5vYnNlcnZlKHQse2F0dHJpYnV0ZXM6ITB9KX0pKX19fWZ1bmN0aW9uIHRfem9vbV9pbml0Q2xvc2VTd2lwZSgpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXpvb21lcl9fd3JhcHBlciIpLGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtY2Fyb3VzZWxfX3pvb21lcl9fdHJhY2siKSxvPSExLHIsbj1uZXcgSGFtbWVyKHQse2RvbUV2ZW50czohMCxpbnB1dENsYXNzOkhhbW1lci5Ub3VjaElucHV0LGNzc1Byb3BzOnt0b3VjaENvbGxvdXQ6ImRlZmF1bHQifSxyZWNvZ25pemVyczpbW0hhbW1lci5QYW4se2RpcmVjdGlvbjpIYW1tZXIuRElSRUNUSU9OX1ZFUlRJQ0FMfV1dfSk7bi5vbigicGFuc3RhcnQiLChmdW5jdGlvbigpe3I9dC5vZmZzZXRUb3AsdC5zdHlsZS5wb3NpdGlvbj0ibm9uZSIsbz10X3pvb21fX2lzU2NhbGVkKHQpfSkpLG4ub24oInBhbm1vdmUiLChmdW5jdGlvbihuKXt2YXIgYT1NYXRoLmFicyhuLmRlbHRhWSk7aWYoKCJ5IiE9PWUuZ2V0QXR0cmlidXRlKCJkYXRhLW9uLWRyYWciKXx8InkiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtb24tZHJhZyIpKSYmKG4uYW5nbGU+LTEyMCYmbi5hbmdsZTwtNjB8fG4uYW5nbGU8MTIwJiZuLmFuZ2xlPjYwKSYmMT09PW4ubWF4UG9pbnRlcnMmJiFvKXthPjQwJiZ0LnNldEF0dHJpYnV0ZSgiZGF0YS1vbi1kcmFnIiwieSIpO3ZhciBpPXIrbi5kZWx0YVk7dC5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZVkoIitpKyJweCkifX0pKSxuLm9uKCJwYW5lbmQiLHRfem9vbV9jbG9zZVN3aXBlSGFuZGxlcil9ZnVuY3Rpb24gdF96b29tX2Nsb3NlU3dpcGVIYW5kbGVyKHQpe3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXpvb21lcl9fd3JhcHBlciIpLG89MzAwLHI9dF96b29tX19pc1NjYWxlZChlKTtlLnN0eWxlLnRyYW5zaXRpb249InRyYW5zZm9ybSAzMDBtcyBlYXNlLW91dCIsTWF0aC5hYnModC5kZWx0YVkpPDQwJiYoZS5zdHlsZS50cmFuc2Zvcm09IiIpLCJ5IiE9PWUuZ2V0QXR0cmlidXRlKCJkYXRhLW9uLWRyYWciKXx8MSE9PXQubWF4UG9pbnRlcnN8fHJ8fCh0LmRlbHRhWTwtMjAwfHx0LnZlbG9jaXR5WTwtLjM/KGUuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVZKC0xMDB2aCkiLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dF96b29tX2Nsb3NlKCEwKSxlLnN0eWxlLnRyYW5zZm9ybT0iIn0pLG8pKTp0LmRlbHRhWT4yMDB8fHQudmVsb2NpdHlZPi4zPyhlLnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlWSgxMDB2aCkiLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dF96b29tX2Nsb3NlKCEwKSxlLnN0eWxlLnRyYW5zZm9ybT0iIn0pLG8pKTplLnN0eWxlLnRyYW5zZm9ybT0iIiksZS5zZXRBdHRyaWJ1dGUoImRhdGEtb24tZHJhZyIsIiIpfWZ1bmN0aW9uIHRfem9vbV9jaGVja0ZvclNjYWxlKCl7dmFyIHQ9dF9nZXRab29tU3RhdGUoKSxlPXQuaXNPcGVuLG89dC5oYXNMYXp5O2lmKGUpe3ZhciByPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LWNhcm91c2VsX196b29tZXJfX2l0ZW0uYWN0aXZlIC50LWNhcm91c2VsX196b29tZXJfX2ltZyIpO2lmKHIpaWYobyYmIXIuY2xhc3NMaXN0LmNvbnRhaW5zKCJsb2FkZWQiKSl7dmFyIG49RGF0ZS5ub3coKTt0X3pvb21fX3dhaXRJbWdGb3JTY2FsZShyLG4sKGZ1bmN0aW9uKCl7dF96b29tX2NoZWNrVG9TY2FsZUluaXQocil9KSl9ZWxzZSByLmNvbXBsZXRlP3Rfem9vbV9jaGVja1RvU2NhbGVJbml0KHIpOnIub25sb2FkPWZ1bmN0aW9uKCl7dF96b29tX2NoZWNrVG9TY2FsZUluaXQocil9fX1mdW5jdGlvbiB0X3pvb21fX3dhaXRJbWdGb3JTY2FsZSh0LGUsbyl7aWYodC5zcmMmJnQubmF0dXJhbFdpZHRoJiZ0Lm5hdHVyYWxIZWlnaHQpbygpO2Vsc2UgaWYoRGF0ZS5ub3coKS1lPDNlMylzZXRUaW1lb3V0KChmdW5jdGlvbigpe3Rfem9vbV9fd2FpdEltZ0ZvclNjYWxlKHQsZSxvKX0pLDUwMCk7ZWxzZXt2YXIgcj10Lm5hdHVyYWxXaWR0aCxuPXQubmF0dXJhbEhlaWdodDtjb25zb2xlLndhcm4oInpvb21lZCBpbWFnZSBpc24ndCBjb21wbGV0ZSwgbmF0dXJhbCB3aWR0aDogIityKyIsIG5hdHVyYWwgaGVpZ2h0OiAiK24pLG8oKX19ZnVuY3Rpb24gdF96b29tX2NoZWNrVG9TY2FsZUluaXQodCl7dmFyIGU9d2luZG93LmlubmVyV2lkdGgsbz13aW5kb3cuaW5uZXJIZWlnaHQscj10X2dldFpvb21TdGF0ZSgpLG49ci5pc01vYmlsZSxhPXIuaXNEb3VibGVUYXBBY3RpdmF0ZWQsaT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC16b29tZXJfX3dyYXBwZXIiKTtpLmNsYXNzTGlzdC5yZW1vdmUoInpvb21lci1uby1zY2FsZSIpO3ZhciBjPXQuaGFzQXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsLXN2Zy1oZWlnaHQiKXx8dC5oYXNBdHRyaWJ1dGUoImRhdGEtb3JpZ2luYWwtc3ZnLXdpZHRoIikscz1wYXJzZUludCh0LmdldEF0dHJpYnV0ZSgiZGF0YS1vcmlnaW5hbC1zdmctaGVpZ2h0IiksMTApfHx0Lm5hdHVyYWxIZWlnaHQsbD1wYXJzZUludCh0LmdldEF0dHJpYnV0ZSgiZGF0YS1vcmlnaW5hbC1zdmctd2lkdGgiKSwxMCl8fHQubmF0dXJhbFdpZHRoOyF0LnNyYy5pbmNsdWRlcygiLnN2ZyIpfHx3aW5kb3cuaXNJRXx8Yz9vPHN8fGU8bD8oIWEmJm4mJnRfem9vbV9kb3VibGV0YXBTY2FsZUluaXQoKSx0X3pvb21fc2NhbGVfaW5pdCgpKTooZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtem9vbWVyX19zY2FsZSIpLmNsYXNzTGlzdC5hZGQoInQtem9vbWVyX19zY2FsZS0tZGlzYWJsZWQiKSxpLmNsYXNzTGlzdC5hZGQoInpvb21lci1uby1zY2FsZSIpKTp0X3pvb21fZmV0Y2hTVkcodCxvLGUpfWZ1bmN0aW9uIHRfem9vbV9mZXRjaFNWRyh0LGUsbyl7dmFyIHI9dC5zcmMsbj10X2dldFpvb21TdGF0ZSgpLGE9bi5pc01vYmlsZSxpPW4uaXNEb3VibGVUYXBBY3RpdmF0ZWQ7ZmV0Y2gocikudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIHQudGV4dCgpfSkpLnRoZW4oKGZ1bmN0aW9uKHIpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2RvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLG4pLG4uaW5uZXJIVE1MPXI7dmFyIGM9bi5xdWVyeVNlbGVjdG9yKCJzdmciKSxzPU1hdGgucm91bmQoYy5nZXRCQm94KCkud2lkdGgpLGw9TWF0aC5yb3VuZChjLmdldEJCb3goKS5oZWlnaHQpLGQ9cy9sLF89NWUzO3M+XyYmKHM9XyxsPU1hdGgucm91bmQocy9kKSksdC5zZXRBdHRyaWJ1dGUoImRhdGEtb3JpZ2luYWwtc3ZnLXdpZHRoIixzKSx0LnNldEF0dHJpYnV0ZSgiZGF0YS1vcmlnaW5hbC1zdmctaGVpZ2h0IixsKTt2YXIgbT1lPGx8fG88cyx1PWMuZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGY9Yy5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLHY7KHV8fGYpJiYhbXx8KHQuc3R5bGUud2lkdGg9cysicHgiLHQuc3R5bGUuaGVpZ2h0PWwrInB4IiksbT8oIWkmJmEmJnRfem9vbV9kb3VibGV0YXBTY2FsZUluaXQoKSx0X3pvb21fc2NhbGVfaW5pdCgpKTpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC16b29tZXJfX3NjYWxlIikuY2xhc3NMaXN0LmFkZCgidC16b29tZXJfX3NjYWxlLS1kaXNhYmxlZCIpLGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobil9KSl9ZnVuY3Rpb24gdF96b29tX3NjYWxlX2luaXQoKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC16b29tZXJfX3dyYXBwZXIiKSxlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXpvb21lcl9fc2NhbGUiKTtlLmNsYXNzTGlzdC5yZW1vdmUoInQtem9vbWVyX19zY2FsZS0tZGlzYWJsZWQiKSwieSIhPT1lLmdldEF0dHJpYnV0ZSgiZGF0YS16b29tLXNjYWxlLWluaXQiKSYmKGUuc2V0QXR0cmlidXRlKCJkYXRhLXpvb20tc2NhbGUtaW5pdCIsInkiKSx0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoZnVuY3Rpb24oZSl7dmFyIG89dF9nZXRab29tU3RhdGUoKSxyPW8uaXNNb2JpbGUsbjtpZihvLmlzT3Blbil7dmFyIGE9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtY2Fyb3VzZWxfX3pvb21lcl9faXRlbS5hY3RpdmUgLnQtY2Fyb3VzZWxfX3pvb21lcl9faW1nIiksaT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1jYXJvdXNlbF9fem9vbWVyX190cmFjayIpLGM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtY2Fyb3VzZWxfX3pvb21lcl9faW5uZXIiKSxzPSF0LmNsYXNzTGlzdC5jb250YWlucygiem9vbWVyLW5vLXNjYWxlIik7KHImJmUudGFyZ2V0LmNsb3Nlc3QoIi50LXpvb21lcl9fc2NhbGUiKSYmc3x8IXImJnMmJiFlLnRhcmdldC5jbG9zZXN0KCIudC16b29tZXJfX2Nsb3NlLCAudC1jYXJvdXNlbF9fem9vbWVyX19jb250cm9sIikpJiYoaS5zZXRBdHRyaWJ1dGUoImRhdGEtb24tdHJhbnNpdGlvbiIsIiIpLGkuc3R5bGUudHJhbnNpdGlvbj0ibm9uZSIsaS5zdHlsZS50cmFuc2Zvcm09Im5vbmUiLGEuc3R5bGUubWF4SGVpZ2h0PSIiLHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzY2FsZS1hY3RpdmUiKT90X3pvb21fdW5zY2FsZSgpOih0LmNsYXNzTGlzdC5hZGQoInNjYWxlLWFjdGl2ZSIpLGMuY2xhc3NMaXN0LmFkZCgic2NhbGUtYWN0aXZlIikscj90X3pvb21fbW9iaWxlWm9vbVBvc2l0aW9uaW5nSW5pdChhKTp0X3pvb21fZGVza3RvcFpvb21Qb3NpdGlvbmluZ0luaXQoYSxlKSkpfX0pLCExKSl9ZnVuY3Rpb24gdF96b29tX2RvdWJsZXRhcFNjYWxlSW5pdCgpe3Rfc2V0Wm9vbVN0YXRlVmFsdWUoImlzRG91YmxlVGFwQWN0aXZhdGVkIiwhMCk7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtem9vbWVyX193cmFwcGVyIiksZTtuZXcgSGFtbWVyKHQse2RvbUV2ZW50czohMCxpbnB1dENsYXNzOkhhbW1lci5Ub3VjaElucHV0LGNzc1Byb3BzOnt0b3VjaENvbGxvdXQ6ImRlZmF1bHQifSxyZWNvZ25pemVyczpbW0hhbW1lci5UYXBdXX0pLm9uKCJ0YXAiLChmdW5jdGlvbihlKXtpZigyPT09ZS50YXBDb3VudCYmZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoInQtem9vbWVyX19zaG93IikmJiFlLnRhcmdldC5jbG9zZXN0KCIudC1jYXJvdXNlbF9fem9vbWVyX19jb250cm9sIikpe3ZhciBvPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LWNhcm91c2VsX196b29tZXJfX2l0ZW0uYWN0aXZlIC50LWNhcm91c2VsX196b29tZXJfX2ltZyIpLHI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtY2Fyb3VzZWxfX3pvb21lcl9faW5uZXIiKSxuPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LWNhcm91c2VsX196b29tZXJfX3RyYWNrIik7by5zdHlsZS5tYXhIZWlnaHQ9IiIsbi5zdHlsZS50cmFuc2l0aW9uPSJub25lIixuLnN0eWxlLnRyYW5zZm9ybT0ibm9uZSIsdC5jbGFzc0xpc3QuY29udGFpbnMoInNjYWxlLWFjdGl2ZSIpP3Rfem9vbV91bnNjYWxlKCk6KHQuY2xhc3NMaXN0LmFkZCgic2NhbGUtYWN0aXZlIiksci5jbGFzc0xpc3QuYWRkKCJzY2FsZS1hY3RpdmUiKSx0X3pvb21fbW9iaWxlWm9vbVBvc2l0aW9uaW5nSW5pdChvKSl9fSkpfWZ1bmN0aW9uIHRfem9vbV9kZXNrdG9wWm9vbVBvc2l0aW9uaW5nSW5pdCh0LGUpe3ZhciBvLHI9dF9nZXRab29tU3RhdGUoKS5pc01vYmlsZSxuPSh3aW5kb3cuaW5uZXJXaWR0aC10Lm9mZnNldFdpZHRoKS8yLGE9KHdpbmRvdy5pbm5lckhlaWdodC10Lm9mZnNldEhlaWdodCkvMixpLGMscyxsLGQ9dC5nZXRBdHRyaWJ1dGUoImRhdGEtb3JpZ2luYWwtc3ZnLXdpZHRoIil8fHQubmF0dXJhbFdpZHRoLF89dC5nZXRBdHRyaWJ1dGUoImRhdGEtb3JpZ2luYWwtc3ZnLWhlaWdodCIpfHx0Lm5hdHVyYWxIZWlnaHQ7ZnVuY3Rpb24gbSh0LGUpe3M9MTAwKih2b2lkIDAhPT10LnRvdWNoZXM/dC50b3VjaGVzWzBdLmNsaWVudFg6dC5jbGllbnRYKS93aW5kb3cuaW5uZXJXaWR0aCxsPS1zKihlLm9mZnNldFdpZHRoLXdpbmRvdy5pbm5lcldpZHRoKS8xMDAsZS5zdHlsZS5sZWZ0PWwrInB4In1mdW5jdGlvbiB1KHQsZSl7aT0xMDAqKHZvaWQgMCE9PXQudG91Y2hlcz90LnRvdWNoZXNbMF0uY2xpZW50WTp0LmNsaWVudFkpL3dpbmRvdy5pbm5lckhlaWdodCxjPS1pKihlLm9mZnNldEhlaWdodC13aW5kb3cuaW5uZXJIZWlnaHQpLzEwMCxlLnN0eWxlLnRvcD1jKyJweCJ9dC5zdHlsZS5sZWZ0PW4rInB4Iix0LnN0eWxlLnRvcD1hKyJweCIsd2luZG93LmlubmVyV2lkdGg8ZCYmd2luZG93LmlubmVySGVpZ2h0PF8/KHM9MTAwKmUuY2xpZW50WC93aW5kb3cuaW5uZXJXaWR0aCxsPS1zKihkLXdpbmRvdy5pbm5lcldpZHRoKS8xMDAsaT0xMDAqZS5jbGllbnRZL3dpbmRvdy5pbm5lckhlaWdodCxjPS1pKihfLXdpbmRvdy5pbm5lckhlaWdodCkvMTAwLHQuc3R5bGUubGVmdD1sKyJweCIsdC5zdHlsZS50b3A9YysicHgiLHI/dC5vbnRvdWNobW92ZT1mdW5jdGlvbihlKXttKGUsdCksdShlLHQpfTp0Lm9ubW91c2Vtb3ZlPWZ1bmN0aW9uKGUpe20oZSx0KSx1KGUsdCl9KTp3aW5kb3cuaW5uZXJXaWR0aDxkPyhzPTEwMCplLmNsaWVudFgvd2luZG93LmlubmVyV2lkdGgsbD0tcyooZC13aW5kb3cuaW5uZXJXaWR0aCkvMTAwLHQuc3R5bGUubGVmdD1sKyJweCIscj90Lm9udG91Y2htb3ZlPWZ1bmN0aW9uKGUpe20oZSx0KX06dC5vbm1vdXNlbW92ZT1mdW5jdGlvbihlKXttKGUsdCl9KTp3aW5kb3cuaW5uZXJIZWlnaHQ8XyYmKGk9MTAwKmUuY2xpZW50WS93aW5kb3cuaW5uZXJIZWlnaHQsYz0taSooXy13aW5kb3cuaW5uZXJIZWlnaHQpLzEwMCx0LnN0eWxlLnRvcD1jKyJweCIscj90Lm9udG91Y2htb3ZlPWZ1bmN0aW9uKGUpe3UoZSx0KX06dC5vbm1vdXNlbW92ZT1mdW5jdGlvbihlKXt1KGUsdCl9KX1mdW5jdGlvbiB0X3pvb21fbW9iaWxlWm9vbVBvc2l0aW9uaW5nSW5pdCh0KXt2YXIgZT0od2luZG93LmlubmVyV2lkdGgtdC5vZmZzZXRXaWR0aCkvMixvPSh3aW5kb3cuaW5uZXJIZWlnaHQtdC5vZmZzZXRIZWlnaHQpLzI7dC5zdHlsZS5sZWZ0PWUrInB4Iix0LnN0eWxlLnRvcD1vKyJweCI7dmFyIHI9e3g6MCx5OjB9LG49e30sYT17fTt0Lm9udG91Y2hzdGFydD1mdW5jdGlvbih0KXtuPXRfem9vbV9nZXRUb3VjaEV2ZW50WFkodCl9LHQub250b3VjaG1vdmU9ZnVuY3Rpb24oaSl7dmFyIGM9dF96b29tX2dldFRvdWNoRXZlbnRYWShpKSxzPTEuNSxsPShjLngtbi54KSpzLGQ9KGMueS1uLnkpKnM7YS54PXIueCtsLGEueT1yLnkrZCxhLng+LWUmJihhLng9LWUpLGEueDxlJiYoYS54PWUpLGEueT4tbyYmKGEueT0tbyksYS55PG8mJihhLnk9byksdC5vZmZzZXRIZWlnaHQ8d2luZG93LmlubmVySGVpZ2h0JiYoYS55PTApLHQuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGUoIithLngrInB4LCAiK2EueSsicHgpIn0sdC5vbnRvdWNoZW5kPWZ1bmN0aW9uKCl7ci54PWEueCxyLnk9YS55fSx0Lm9udG91Y2hjYW5jZWw9ZnVuY3Rpb24oKXtyLng9YS54LHIueT1hLnl9fWZ1bmN0aW9uIHRfem9vbV9nZXRUb3VjaEV2ZW50WFkodCl7dmFyIGU9e3g6MCx5OjB9O2lmKFsidG91Y2hzdGFydCIsInRvdWNobW92ZSIsInRvdWNoZW5kIiwidG91Y2hjYW5jZWwiXS5pbmNsdWRlcyh0LnR5cGUpKXt2YXIgbz10LnRvdWNoZXNbMF18fHQuY2hhbmdlZFRvdWNoZXNbMF07ZS54PW8ucGFnZVgsZS55PW8ucGFnZVl9cmV0dXJuIGV9ZnVuY3Rpb24gdF96b29tX2Nsb3NlKHQpe3ZvaWQgMD09PXQmJih0PSExKTt2YXIgZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC16b29tZXJfX3dyYXBwZXIiKTtpZihlJiZlLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJ6b29tOmNsb3NlIikpLGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgidC16b29tZXJfX3Nob3dfZml4ZWQiKSx0KW4oKTtlbHNle3ZhciBvPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXpvb21lcl9fY29udGFpbmVyIikscj0wO28mJm8uY2xhc3NMaXN0LmFkZCgidC16b29tZXJfX2NvbnRhaW5lci0tb24tY2xvc2UiKSxudWxsPT1vfHxvLmFkZEV2ZW50TGlzdGVuZXIoInRyYW5zaXRpb25lbmQiLChmdW5jdGlvbih0KXt0LnRhcmdldD09PW8mJihjbGVhclRpbWVvdXQociksbigpKX0pLHtvbmNlOiEwfSkscj1zZXRUaW1lb3V0KChmdW5jdGlvbigpe24oKX0pLDUwMCl9ZnVuY3Rpb24gbigpe3ZhciB0O2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgidC16b29tZXJfX3Nob3ciLCJ0LXpvb21lcl9fYWN0aXZlIiksbnVsbD09KHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnRfem9vbWVyX19hbmltYXRlZC13cmFwcGVyIikpfHx0LnJlbW92ZSgpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXpvb21lcl9fY29udGFpbmVyIik7ZSYmKGUuaW5uZXJIVE1MPSIiKSxlJiZlLmNsYXNzTGlzdC5yZW1vdmUoInQtem9vbWVyX19jb250YWluZXItLW9uLWNsb3NlIiksdF96b29tX19wcm9jZXNzU2Nyb2xsTG9jaygib2ZmIiksdF96b29tX3Vuc2NhbGUoKSx0X3RyaWdnZXJFdmVudChkb2N1bWVudC5ib2R5LCJwb3B1cEhpZGRlbiIpLHRfc2V0Wm9vbVN0YXRlVmFsdWUoImlzT3BlbiIsITEpfX1mdW5jdGlvbiB0X3pvb21fdW5zY2FsZSgpe3ZhciB0PSJzY2FsZS1hY3RpdmUiLGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLiIrdCk7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXtyZXR1cm4gZS5jbGFzc0xpc3QucmVtb3ZlKHQpfSkpO3ZhciBvPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LWNhcm91c2VsX196b29tZXJfX2l0ZW0uYWN0aXZlIikscj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1jYXJvdXNlbF9fem9vbWVyX190cmFjayIpLG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtem9vbWVyX193cmFwcGVyIik7aWYobyYmciYmbil7dmFyIGE9by5xdWVyeVNlbGVjdG9yKCIudC1jYXJvdXNlbF9fem9vbWVyX19pbWciKTthLm9ubW91c2Vtb3ZlPW51bGwsYS5vbnRvdWNobW92ZT1udWxsLGEuc3R5bGUudHJhbnNmb3JtPSIiLGEuc3R5bGUubGVmdD0iIixhLnN0eWxlLnRvcD0iIixyLnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlWCgtIisoby5vZmZzZXRMZWZ0fHwwKSsicHgpIixlLmxlbmd0aCYmKG51bGw9PXJ8fHIuc2V0QXR0cmlidXRlKCJkYXRhLWNhY2hlZC16b29tIiwieSIpKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3ImJihyLnN0eWxlLnRyYW5zaXRpb249IiIpfSksMTAwKX19ZnVuY3Rpb24gdF96b29tX19wcm9jZXNzU2Nyb2xsTG9jayh0KXt2YXIgZT0idC1ib2R5X3Njcm9sbC1sb2NrZWQiLG89ImRhdGEtcG9wdXAtc2Nyb2xsdG9wIixyLG47aWYodF9nZXRab29tU3RhdGUoKS5uZWVkTG9jayl7dmFyIGE9ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoZSk7aWYoIm9uIiE9PXR8fGEpe2lmKCJvZmYiPT09dCYmYSl7dmFyIGk9cGFyc2VJbnQoZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUobyksMTApfHwwO2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZShlKSxkb2N1bWVudC5ib2R5LnN0eWxlLnRvcD0iIixkb2N1bWVudC5ib2R5LnJlbW92ZUF0dHJpYnV0ZShvKSx3aW5kb3cuc2Nyb2xsVG8oMCxpKX19ZWxzZXt2YXIgYz13aW5kb3cucGFnZVlPZmZzZXQ7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKGUpLGRvY3VtZW50LmJvZHkuc3R5bGUudG9wPSItIitjKyJweCIsZG9jdW1lbnQuYm9keS5zZXRBdHRyaWJ1dGUobyxjKX19fWZ1bmN0aW9uIHRfem9vbV9fZ2V0VGhlbWVQcmVzZXQodCxlKXt2b2lkIDA9PT10JiYodD0iI2ZmZmZmZiIpLHZvaWQgMD09PWUmJihlPSExKTt2YXIgbz0iI2ZmZmZmZiIscj0iIzAwMDAwMCIsbixhPSJibGFjayI9PT10X3pvb21fbHVtYV9yZ2JhKHQuaW5jbHVkZXMoIi1ncmFkaWVudCgiKT90X3pvb21fZ2V0Rmlyc3RDb2xvckZyb21HcmFkaWVudCh0KTp0X3pvb21faGV4VG9SR0JBKHQpKSxpPXQ7cmV0dXJuIGV8fChpPWE/cjpvKSx7aXNEYXJrOmEsYmdDb2xvcjppLHRleHRDb2xvcjphP286cn19ZnVuY3Rpb24gdF96b29tX19nZXRNb2RhbENvbG9ycyh0LGUpe3ZhciBvLHI9Z2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKCItLXQtem9vbS1nYWxsZXJ5LWJnLWNvbG9yIikudHJpbSgpO2lmKHIpcmV0dXJuIHRfem9vbV9fZ2V0VGhlbWVQcmVzZXQociwhMCk7dmFyIG49dC5nZXRBdHRyaWJ1dGUoImRhdGEtYmctY29sb3IiKXx8IiNmZmZmZmYiLGE7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSE9PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LWNhdGFsb2dfX3Byb2R1Y3Qtc25pcHBldCwgLnQtc3RvcmVfX3Byb2R1Y3Qtc25pcHBldCIpJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLmNvbnRhaW5zKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LWNhdGFsb2dfX3Byb2R1Y3Qtc25pcHBldCwgLnQtc3RvcmVfX3Byb2R1Y3Qtc25pcHBldCIpKSYmdCYmKG49dC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IpO3ZhciBpPWUuY2xvc2VzdCgiLnQtcG9wdXAiKTtpZihpKXt2YXIgYz1pLnN0eWxlLmJhY2tncm91bmRDb2xvcjtjJiYobj1jKX1yZXR1cm4gdF96b29tX19nZXRUaGVtZVByZXNldChuLCExKX1mdW5jdGlvbiB0X3pvb21fX3NldE1vZGFsQ29sb3JzKHQsZSl7dmFyIG89dF96b29tX19nZXRNb2RhbENvbG9ycyh0LGUpLHI9by5iZ0NvbG9yLG49by50ZXh0Q29sb3IsYT1vLmlzRGFyayxpPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXpvb21lcl9fY29udGFpbmVyIik7aWYoaSl7dmFyIGM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQtem9vbWVyX191aS1pdGVtIikscz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC16b29tZXJfX2NvbW1lbnRzIik7aS5zdHlsZS5iYWNrZ3JvdW5kPXIsaS5zdHlsZS5jb2xvcj1uO3ZhciBsPWE/ImFkZCI6InJlbW92ZSI7Yy5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gdC5jbGFzc0xpc3RbbF0oInQtem9vbWVyX191aS1pdGVtLS1kYXJrIil9KSkscy5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gdC5jbGFzc0xpc3RbbF0oInQtem9vbWVyX19jb21tZW50cy0tZGFyayIpfSkpfX1mdW5jdGlvbiB0X3pvb21fbHVtYV9yZ2JhKHQpe2lmKCF0fHwhQXJyYXkuaXNBcnJheSh0KXx8dC5sZW5ndGg8MylyZXR1cm4iYmxhY2siO3ZhciBlPXRbMF0sbz10WzFdLHI9dFsyXSxuPXQubGVuZ3RoPj00P3RbM106MSxhLGksYyxzO3JldHVybi4yMTI2KihlKm4rMjU1KigxLW4pKSsuNzE1MioobypuKzI1NSooMS1uKSkrLjA3MjIqKHIqbisyNTUqKDEtbikpPDEyOD8iYmxhY2siOiJ3aGl0ZSJ9ZnVuY3Rpb24gdF96b29tX2hleFRvUkdCQSh0KXt2YXIgZT1bMjU1LDI1NSwyNTUsMV07aWYoIXR8fCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gZTt2YXIgbyxyPS9edmFyXCgoLS11Yy1jb2xvci1jb2xvci1bYS16QS1aMC05XSspLFxzKiguKylcKSQvLmV4ZWModCksbj10LnRyaW0oKTtpZihyJiZyWzFdKXt2YXIgYT1yWzFdLGk7bj0od2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZ2V0UHJvcGVydHlWYWx1ZShhKXx8clsyXSkudHJpbSgpfXZhciBjPS9ecmdiYT9cKFxzKihbMC05XSspXHMqLFxzKihbMC05XSspXHMqLFxzKihbMC05XSspXHMqKD86LFxzKihbMC05Ll0rKVxzKik/XCkkL2kuZXhlYyhuKSxzLGwsZCxfO2lmKGMpcmV0dXJuW3BhcnNlSW50KGNbMV0sMTApLHBhcnNlSW50KGNbMl0sMTApLHBhcnNlSW50KGNbM10sMTApLHZvaWQgMCE9PWNbNF0/cGFyc2VGbG9hdChjWzRdKToxXTt2YXIgbT0vXiM/KFthLWYwLTldezJ9KShbYS1mMC05XXsyfSkoW2EtZjAtOV17Mn0pKFthLWYwLTldezJ9KSQvaS5leGVjKG4pLHUsZix2LHA7aWYobSlyZXR1cm5bcGFyc2VJbnQobVsxXSwxNikscGFyc2VJbnQobVsyXSwxNikscGFyc2VJbnQobVszXSwxNikscGFyc2VJbnQobVs0XSwxNikvMjU1XTt2YXIgZz0vXiM/KFthLWYwLTldezJ9KShbYS1mMC05XXsyfSkoW2EtZjAtOV17Mn0pJC9pLmV4ZWMobiksaCx6LHk7aWYoZylyZXR1cm5bcGFyc2VJbnQoZ1sxXSwxNikscGFyc2VJbnQoZ1syXSwxNikscGFyc2VJbnQoZ1szXSwxNiksMV07dmFyIHc9L14jPyhbYS1mMC05XSkoW2EtZjAtOV0pKFthLWYwLTldKSQvaS5leGVjKG4pLFMsYixMO2lmKHcpcmV0dXJuW3BhcnNlSW50KHdbMV0rd1sxXSwxNikscGFyc2VJbnQod1syXSt3WzJdLDE2KSxwYXJzZUludCh3WzNdK3dbM10sMTYpLDFdO3ZhciB4PS9eIz8oW2EtZjAtOV0pKFthLWYwLTldKShbYS1mMC05XSkoW2EtZjAtOV0pJC9pLmV4ZWMobiksQSxDLEUsSTtyZXR1cm4geD9bcGFyc2VJbnQoeFsxXSt4WzFdLDE2KSxwYXJzZUludCh4WzJdK3hbMl0sMTYpLHBhcnNlSW50KHhbM10reFszXSwxNikscGFyc2VJbnQoeFs0XSt4WzRdLDE2KS8yNTVdOmV9ZnVuY3Rpb24gdF96b29tX2dldEZpcnN0Q29sb3JGcm9tR3JhZGllbnQodCl7dmFyIGU9WzI1NSwyNTUsMjU1XTtpZighdHx8InN0cmluZyIhPXR5cGVvZiB0KXJldHVybiBlO3ZhciBvLHI9Lyg/OnZhclwoKC0tdWMtY29sb3ItY29sb3ItW2EtekEtWjAtOV0rKSwpPyg/OihyZ2IpYT9cKChbMC05XSspLChbMC05XSspLChbMC05XSspKD86LFswLTkuJV0rKT9cKSl8KD86KCMpKFthLWZBLUYwLTldezJ9KShbYS1mQS1GMC05XXsyfSkoW2EtZkEtRjAtOV17Mn0pKS8uZXhlYyh0KSxuLGE7aWYoIXIpcmV0dXJuIGU7aWYoclsyXSYmclszXSYmcls0XSYmcls1XSluPXJbMl0sYT1bclszXSxyWzRdLHJbNV1dO2Vsc2V7aWYoIShyWzZdJiZyWzddJiZyWzhdJiZyWzldKSlyZXR1cm4gZTtuPXJbNl0sYT1bcls3XSxyWzhdLHJbOV1dfXZhciBpPXJbMV07aWYoaSl7dmFyIGMscz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKGkpO2lmKHMpe3ZhciBsPS9ecmdiYT9cKChbMC05XSspLFxzKihbMC05XSspLFxzKihbMC05XSspKD86LFxzKlswLTkuJV0rKT9cKSQvaS5leGVjKHMpLGQ9L14jKFthLWZBLUYwLTldezJ9KShbYS1mQS1GMC05XXsyfSkoW2EtZkEtRjAtOV17Mn0pJC9pLmV4ZWMocyk7bCYmKGE9bC5zcGxpY2UoMSksbj0icmdiIiksZCYmKGE9ZC5zcGxpY2UoMSksbj0iIyIpfX1yZXR1cm4gYS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBwYXJzZUludCh0LCIjIj09PW4/MTY6MTApfSkpfWZ1bmN0aW9uIHRfem9vbV9faXNTY2FsZWQodCl7cmV0dXJuIHdpbmRvdy52aXN1YWxWaWV3cG9ydCYmMSE9PXdpbmRvdy52aXN1YWxWaWV3cG9ydC5zY2FsZXx8dC5jbGFzc0xpc3QuY29udGFpbnMoInNjYWxlLWFjdGl2ZSIpfXRfb25SZWFkeSh0X2luaXRab29tKTsKCmZ1bmN0aW9uIHQzOTZfc2NhbGVCbG9jayhlKXt2YXIgdD10Mzk2X2RldGVjdFJlc29sdXRpb24oZSksbD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIitlKTtpZihsKXt2YXIgYTsiZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93LnQzOTZfX2dldEN1cnJlbnRTY2FsZUZhY3Rvcj9hPXQzOTZfX2dldEN1cnJlbnRTY2FsZUZhY3RvcihlKTooYT13aW5kb3cudG4mJndpbmRvdy50blsiYWIiK2VdJiZ3aW5kb3cudG5bImFiIitlXS5zY2FsZUZhY3Rvcil8fChhPXdpbmRvdy50bl9zY2FsZV9mYWN0b3IpO3ZhciBvPWwucXVlcnlTZWxlY3RvcigiLnQzOTZfX2FydGJvYXJkIiksbj10Mzk2X3NjYWxlX19jb2xsZWN0U2NhbGVEYXRhKG8sYSk7aWYobyl7dmFyIHI9dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZShvLCJoZWlnaHQiKSxpPU1hdGguZmxvb3IociphKSxjLF87aWYodDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZShvLCJoZWlnaHRfdmgiKSl7dmFyIHM9dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZShvLCJoZWlnaHQiKSxkPXQzOTZfYWJfX2dldEhlaWdodChvKSxtPXMqYTtpPW0+PWQ/bTpkfWlmKHQzOTZfc2NhbGVfX3VwZGF0ZUFydGJvYXJkU3RhdGUobyxpKSwwIT09bi5sZW5ndGgpaWYodDM5Nl9pc09ubHlTY2FsYWJsZUJyb3dzZXIoKSl0Mzk2X3NjYWxlX19zY2FsZUlzT25seVNjYWxhYmxlQmxvY2sobik7ZWxzZXt2YXIgdT1uLmZpbHRlcigoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5lbGVtVHlwZTtyZXR1cm4idGV4dCI9PT10fHwiYnV0dG9uIj09PXR9KSksaD1uLmZpbHRlcigoZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuInNoYXBlIj09PWUuZWxlbVR5cGV9KSkscD0vXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLGY7cCYmdDM5Nl9zY2FsZV9fc2NoZWR1bGVfX3NjYWxlVGV4dEVsZW1lbnRzKHUpLHQzOTZfc2NhbGVfX3NjaGVkdWxlX19zY2FsZVNoYXBlRWxlbWVudHMoaCksbi5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbD1lLmVsZW1lbnQsbz1lLmVsZW1lbnRDb3JlLG49ZS5lbGVtVHlwZSxyPSJnYWxsZXJ5Ij09PW4saT0idmlkZW8iPT09bjsieWVzIj09PWwuZ2V0QXR0cmlidXRlKCJkYXRhLXNjYWxlLW9mZiIpfHxyfHwobC5zdHlsZS56b29tPWEpLHImJihsLnN0eWxlLnpvb209bnVsbCksInRleHQiPT09biYmdDwxMjAwJiZvJiYhcCYmKG8uc3R5bGUud2Via2l0VGV4dFNpemVBZGp1c3Q9ImF1dG8iKSxvJiYoby5zdHlsZS50cmFuc2Zvcm1PcmlnaW49ImNlbnRlciIpfSkpLEFycmF5LmZyb20oby5xdWVyeVNlbGVjdG9yQWxsKCI6c2NvcGUgPiAudDM5Nl9fZWxlbSwgOnNjb3BlID4gLnQzOTZfX2dyb3VwIikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0OygibGVmdCIhPT10Mzk2X2NvcmVfX2dldEZpZWxkVmFsdWUoZSwiYXhpc3giKXx8InRvcCIhPT10Mzk2X2NvcmVfX2dldEZpZWxkVmFsdWUoZSwiYXhpc3kiKSkmJih0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChlLCJsZWZ0IiksdDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoZSwidG9wIikpfSkpfX19fWZ1bmN0aW9uIHQzOTZfc2NhbGVfX3NjaGVkdWxlX19zY2FsZVRleHRFbGVtZW50cyhlKXt3aW5kb3cudG58fCh3aW5kb3cudG49e30pLHdpbmRvdy50bi5zY2hlZHVsZWRUZXh0RWxlbWVudHNGb3JTY2FsZXx8KHdpbmRvdy50bi5zY2hlZHVsZWRUZXh0RWxlbWVudHNGb3JTY2FsZT1bXSksd2luZG93LnRuLnNjaGVkdWxlZFRleHRFbGVtZW50c0ZvclNjYWxlPXdpbmRvdy50bi5zY2hlZHVsZWRUZXh0RWxlbWVudHNGb3JTY2FsZS5jb25jYXQoZSksY2xlYXJUaW1lb3V0KHdpbmRvdy50bi50ZXh0RWxlbWVudHNTY2FsZVRpbWVyKSx3aW5kb3cudG4udGV4dEVsZW1lbnRzU2NhbGVUaW1lcj1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3QzOTZfc2NhbGVfX3NjYWxlVGV4dEVsZW1lbnRzKHdpbmRvdy50bi5zY2hlZHVsZWRUZXh0RWxlbWVudHNGb3JTY2FsZSksd2luZG93LnRuLnNjaGVkdWxlZFRleHRFbGVtZW50c0ZvclNjYWxlPVtdfSksMSl9ZnVuY3Rpb24gdDM5Nl9zY2FsZV9fc2NhbGVUZXh0RWxlbWVudHMoZSl7dmFyIHQ9dDM5Nl9faW5pdEZhc3RET00oKTt0LndyaXRlKChmdW5jdGlvbigpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5lbGVtZW50Q29yZS5zdHlsZS5mb250U2l6ZT0iIixlLmVsZW1lbnRDb3JlLnN0eWxlLndlYmtpdFRleHRTaXplQWRqdXN0PSJub25lIixlLmNhY2hlZFpvb209ZS5lbGVtZW50LnN0eWxlLnpvb20sZS5zY2FsZUZhY3RvcjwxJiYoZS5lbGVtZW50LnN0eWxlLnpvb209IiIpfSkpfSkpLHQucmVhZCgoZnVuY3Rpb24oKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuZmllbGRGb250U2l6ZT1wYXJzZUZsb2F0KHQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShlLmVsZW1lbnQsImZvbnRzaXplIikpLGUuY3VycmVudEZvbnRTaXplPXBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZShlLmVsZW1lbnRDb3JlKS5mb250U2l6ZSl9KSl9KSksdC53cml0ZSgoZnVuY3Rpb24oKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpe2Uuc2NhbGVGYWN0b3I8MSYmKGUuZWxlbWVudC5zdHlsZS56b29tPWUuY2FjaGVkWm9vbSk7dmFyIHQ9IWlzTmFOKGUuZmllbGRGb250U2l6ZSksbD1NYXRoLmFicyhlLmN1cnJlbnRGb250U2l6ZS1NYXRoLnJvdW5kKGUuY3VycmVudEZvbnRTaXplKSksYTtpZih0P2UuZmllbGRGb250U2l6ZS1lLmN1cnJlbnRGb250U2l6ZT49MTpsPi4wMSl7dmFyIG89dD9lLmZpZWxkRm9udFNpemU6ZS5jdXJyZW50Rm9udFNpemUqZS5zY2FsZUZhY3RvcjtlLmVsZW1lbnRDb3JlLnN0eWxlLmZvbnRTaXplPU1hdGgucm91bmQobyplLnNjYWxlRmFjdG9yKSsicHgifWVsc2UgZS5lbGVtZW50Q29yZS5zdHlsZS53ZWJraXRUZXh0U2l6ZUFkanVzdD0iIn0pKX0pKX1mdW5jdGlvbiB0Mzk2X3NjYWxlX19zY2hlZHVsZV9fc2NhbGVTaGFwZUVsZW1lbnRzKGUpe3dpbmRvdy50bnx8KHdpbmRvdy50bj17fSksd2luZG93LnRuLnNjaGVkdWxlZFNoYXBlRWxlbWVudHNGb3JTY2FsZXx8KHdpbmRvdy50bi5zY2hlZHVsZWRTaGFwZUVsZW1lbnRzRm9yU2NhbGU9W10pLHdpbmRvdy50bi5zY2hlZHVsZWRTaGFwZUVsZW1lbnRzRm9yU2NhbGU9d2luZG93LnRuLnNjaGVkdWxlZFNoYXBlRWxlbWVudHNGb3JTY2FsZS5jb25jYXQoZSksY2xlYXJUaW1lb3V0KHdpbmRvdy50bi5zaGFwZUVsZW1lbnRzU2NhbGVUaW1lciksd2luZG93LnRuLnNoYXBlRWxlbWVudHNTY2FsZVRpbWVyPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dDM5Nl9zY2FsZV9fc2NhbGVTaGFwZUVsZW1lbnRzKHdpbmRvdy50bi5zY2hlZHVsZWRTaGFwZUVsZW1lbnRzRm9yU2NhbGUpLHdpbmRvdy50bi5zY2hlZHVsZWRTaGFwZUVsZW1lbnRzRm9yU2NhbGU9W119KSwxKX1mdW5jdGlvbiB0Mzk2X3NjYWxlX19zY2FsZVNoYXBlRWxlbWVudHMoZSl7dmFyIHQ9dDM5Nl9faW5pdEZhc3RET00oKTt0LnJlYWQoKGZ1bmN0aW9uKCl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgdD10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZS5lbGVtZW50LCJoZWlnaHQiKTt0PXQzOTZfZWxlbV9fZ2V0SGVpZ2h0KGUuZWxlbWVudCx0KSx0PXQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZShlLmVsZW1lbnQsImhlaWdodCIsdCk7dmFyIGw9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGUuZWxlbWVudCwid2lkdGgiKTtsPXQzOTZfZWxlbV9fZ2V0V2lkdGgoZS5lbGVtZW50LGwpLGw9dDM5Nl9lbGVtX19jb252ZXJ0UG9zaXRpb25fX0xvY2FsX190b0Fic29sdXRlKGUuZWxlbWVudCwid2lkdGgiLGwpO3ZhciBhPXBhcnNlRmxvYXQodDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGUuZWxlbWVudCwidG9wIikpO2E9dDM5Nl9lbGVtX19jb252ZXJ0UG9zaXRpb25fX0xvY2FsX190b0Fic29sdXRlKGUuZWxlbWVudCwidG9wIixhKTt2YXIgbz1wYXJzZUZsb2F0KHQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShlLmVsZW1lbnQsImxlZnQiKSk7bz10Mzk2X2VsZW1fX2NvbnZlcnRQb3NpdGlvbl9fTG9jYWxfX3RvQWJzb2x1dGUoZS5lbGVtZW50LCJsZWZ0IixvKSxlLnNoYXBlU2l6ZT17dG9wOmEsbGVmdDpvLHdpZHRoOmwsaGVpZ2h0OnR9fSkpfSkpO3ZhciBsPWUuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gZS5zaGFwZVNpemUud2lkdGg8PTJ8fGUuc2hhcGVTaXplLmhlaWdodDw9Mn0pKTt0LnJlYWQoKGZ1bmN0aW9uKCl7bC5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgdD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlLmVsZW1lbnRDb3JlKTtlLmJvcmRlcldpZHRoPXQuYm9yZGVyV2lkdGgsZS5pc0ltYWdlPSJub25lIiE9PXQuYmFja2dyb3VuZEltYWdlLGUuaXNBbmltYXRlZD1lLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc2JzLWV2ZW50Iil9KSl9KSksdC53cml0ZSgoZnVuY3Rpb24oKXtsLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKCIwcHgiPT09ZS5ib3JkZXJXaWR0aCYmIWUuaXNJbWFnZSYmIWUuaXNBbmltYXRlZCl7ZS5lbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCJ6b29tIik7dmFyIHQ9ZS5zaGFwZVNpemUud2lkdGgqZS5zY2FsZUZhY3RvcixsPWUuc2hhcGVTaXplLmhlaWdodCplLnNjYWxlRmFjdG9yLGE9ZS5zaGFwZVNpemUudG9wKmUuc2NhbGVGYWN0b3Isbz1lLnNoYXBlU2l6ZS5sZWZ0KmUuc2NhbGVGYWN0b3I7ZS5lbGVtZW50LnN0eWxlLndpZHRoPXBhcnNlRmxvYXQodCkrInB4IixlLmVsZW1lbnQuc3R5bGUuaGVpZ2h0PXBhcnNlRmxvYXQobCkrInB4IixlLmVsZW1lbnQuc3R5bGUudG9wPU1hdGgucm91bmQoYSkrInB4IixlLmVsZW1lbnQuc3R5bGUubGVmdD1NYXRoLnJvdW5kKG8pKyJweCIsZS5lbGVtZW50LnNldEF0dHJpYnV0ZSgiZGF0YS1zY2FsZS1vZmYiLCJ5ZXMiKX19KSl9KSl9ZnVuY3Rpb24gdDM5Nl9zY2FsZV9fY29sbGVjdFNjYWxlRGF0YShlLHQpe3ZhciBsO3JldHVybiB0Mzk2X3NjYWxlX19nZXRFbGVtZW50c1RvU2NhbGUoZSkubWFwKChmdW5jdGlvbihlKXt2YXIgbD1lLnF1ZXJ5U2VsZWN0b3IoIi50bi1tb2xlY3VsZSwgLnRuLWF0b20iKSxhPXQzOTZfc2NhbGVfX2dldEVsZW1lbnRUeXBlKGUpLG89dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGUsImNvbnRhaW5lciIpO2lmKG98fCJncm91cCIhPT1hfHwobz0iZ3JpZCIpLGwmJiJncmlkIj09PW8pcmV0dXJue2VsZW1lbnQ6ZSxlbGVtZW50Q29yZTpsLGVsZW1UeXBlOmEsc2NhbGVGYWN0b3I6dH19KSkuZmlsdGVyKEJvb2xlYW4pfWZ1bmN0aW9uIHQzOTZfc2NhbGVfX3NjYWxlSXNPbmx5U2NhbGFibGVCbG9jayhlKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZWxlbWVudCxsPWUuZWxlbWVudENvcmUsYT1lLmVsZW1UeXBlLG89bC5jbG9zZXN0KCIudG4tYXRvbV9fc2NhbGUtd3JhcHBlciIpO298fCh0Mzk2X3NjYWxlX193cmFwRWxlbWVudChsLGN1cnJlbnRTY2FsZUZhY3RvciwidG4tYXRvbV9fc2NhbGUtd3JhcHBlciIpLG89bC5jbG9zZXN0KCIudG4tYXRvbV9fc2NhbGUtd3JhcHBlciIpKSx0LnN0eWxlLnpvb209IiIsdDM5Nl9zY2FsZV9fcHJvY2Vzc0JhY2tkcm9wRmlsdGVyKHQsbCxvKSx0Mzk2X3NjYWxlX19wcm9jZXNzQmFja2dyb3VuZEZvclNoYXBlKHQsbCxhLGN1cnJlbnRTY2FsZUZhY3Rvcil9KSl9ZnVuY3Rpb24gdDM5Nl9zY2FsZV9fZ2V0RWxlbWVudHNUb1NjYWxlKGUpe3JldHVybiBlP0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUuY2hpbGRyZW4pLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGUmJihlLmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fZWxlbSIpfHxlLmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fZ3JvdXAiKSl9KSk6W119ZnVuY3Rpb24gdDM5Nl9zY2FsZV9fdXBkYXRlQXJ0Ym9hcmRTdGF0ZShlLHQpe2UuY2xhc3NMaXN0LmFkZCgidDM5Nl9fYXJ0Ym9hcmRfc2NhbGUiKTt2YXIgbD1lLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpLGE7aWYoISgiaHVnIj09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLWhlaWdodG1vZGUiKSkpe3ZhciBvPSc8c3R5bGUgY2xhc3M9InQzOTZfX3NjYWxlLXN0eWxlIj4udC1yZWMjcmVjJytsKyIgeyBvdmVyZmxvdzogdmlzaWJsZTsgfSNyZWMiK2wrIiAudDM5Nl9fYXJ0Ym9hcmQ6bm90KC50Mzk2X19hcnRib2FyZC1mbGV4KSwjcmVjIitsKyIgLnQzOTZfX2FydGJvYXJkOm5vdCgudDM5Nl9fYXJ0Ym9hcmQtZmxleCkgLnQzOTZfX2NhcnJpZXIsI3JlYyIrbCsiIC50Mzk2X19hcnRib2FyZDpub3QoLnQzOTZfX2FydGJvYXJkLWZsZXgpIC50Mzk2X19maWx0ZXIgeyB3aWR0aDogMTAwdncgIWltcG9ydGFudDsgbWF4LXdpZHRoOiAxMDAlO30jcmVjIitsKyIgLnQzOTZfX2NhcnJpZXIsI3JlYyIrbCsiIC50Mzk2X19maWx0ZXIsI3JlYyIrbCsiIC50Mzk2X19hcnRib2FyZCB7aGVpZ2h0OiAiK3QrInB4ICFpbXBvcnRhbnQ7fTwvc3R5bGU+IjtlLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIixvKX19ZnVuY3Rpb24gdDM5Nl9zY2FsZV9fd3JhcEVsZW1lbnQoZSx0LGwpe2lmKGUpe3ZhciBhPWUucGFyZW50Tm9kZTtpZihhKXt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtvLmNsYXNzTGlzdC5hZGQobCksby5zdHlsZS50cmFuc2Zvcm09InNjYWxlKCIrdCsiKSIsby5hcHBlbmRDaGlsZChlKSxhLmFwcGVuZENoaWxkKG8pfX19ZnVuY3Rpb24gdDM5Nl9zY2FsZV9fcHJvY2Vzc0JhY2tkcm9wRmlsdGVyKGUsdCxsKXsibm9uZSI9PT1lLnN0eWxlLmJhY2tkcm9wRmlsdGVyJiYoZS5zdHlsZS5iYWNrZHJvcEZpbHRlcj0iIik7dmFyIGE9Z2V0Q29tcHV0ZWRTdHlsZShlKS5iYWNrZHJvcEZpbHRlcjtpZihhKXtlLnN0eWxlLmJhY2tkcm9wRmlsdGVyPSJub25lIixsLnN0eWxlLmJhY2tkcm9wRmlsdGVyPWE7dmFyIG89Z2V0Q29tcHV0ZWRTdHlsZSh0KS5ib3JkZXJSYWRpdXM7IjBweCIhPT1vJiYobC5zdHlsZS5ib3JkZXJSYWRpdXM9byl9fWZ1bmN0aW9uIHQzOTZfc2NhbGVfX3Byb2Nlc3NCYWNrZ3JvdW5kRm9yU2hhcGUoZSx0LGwsYSl7aWYoInNoYXBlIj09PWwpe3ZhciBvPXQmJmdldENvbXB1dGVkU3R5bGUodCksbjtpZihvKWlmKChvJiZvLmJhY2tncm91bmRJbWFnZXx8dC5nZXRBdHRyaWJ1dGUoImRhdGEtb3JpZ2luYWwiKSkmJiJmaXhlZCI9PT1vLmJhY2tncm91bmRBdHRhY2htZW50KXtlLnJlbW92ZUNoaWxkKHQucGFyZW50Tm9kZSksZS5hcHBlbmRDaGlsZCh0KTt2YXIgcj10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZSwiaGVpZ2h0Iik7cj10Mzk2X2VsZW1fX2dldEhlaWdodChlLHIpLHI9dDM5Nl9lbGVtX19jb252ZXJ0UG9zaXRpb25fX0xvY2FsX190b0Fic29sdXRlKGUsImhlaWdodCIscik7dmFyIGk9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGUsIndpZHRoIik7aT10Mzk2X2VsZW1fX2dldFdpZHRoKGUsaSksaT10Mzk2X2VsZW1fX2NvbnZlcnRQb3NpdGlvbl9fTG9jYWxfX3RvQWJzb2x1dGUoZSwid2lkdGgiLGkpO3ZhciBjPXBhcnNlRmxvYXQodDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGUsInRvcCIpKSxfPXBhcnNlRmxvYXQodDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGUsImxlZnQiKSk7ZS5zdHlsZS50b3A9YyphKyJweCIsZS5zdHlsZS5sZWZ0PV8qYSsicHgiLGUuc3R5bGUuaGVpZ2h0PXIqYSsicHgiLGUuc3R5bGUud2lkdGg9aSphKyJweCIsZS5zZXRBdHRyaWJ1dGUoImRhdGEtc2NhbGUtb2ZmIiwieWVzIil9fX1mdW5jdGlvbiB0Mzk2X3NjYWxlX19nZXRFbGVtZW50VHlwZShlKXt2YXIgdD1lLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKTtyZXR1cm4hdCYmZS5jbGFzc0xpc3QuY29udGFpbnMoInRuLWdyb3VwIikmJih0PSJncm91cCIpLHR9d2luZG93LnQzOTZfaW5pdGlhbFNjYWxlfHwod2luZG93LnQzOTZfaW5pdGlhbFNjYWxlPWZ1bmN0aW9uKCl7fSk7Cgp3aW5kb3cuVGlsZGE9d2luZG93LlRpbGRhfHx7fSxmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt2YXIgZT1uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCksdD0tMSE9PWUuaW5kZXhPZigibXNpZSIpJiZwYXJzZUludChlLnNwbGl0KCJtc2llIilbMV0pO2lmKDg9PT10fHw5PT09dCl7dmFyIHI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQtYnRuIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChyLChmdW5jdGlvbihlKXt2YXIgdD1lLmdldEF0dHJpYnV0ZSgiaHJlZiIpO2UucXVlcnlTZWxlY3RvcigidGFibGUiKSYmdCYmLTE9PT10LmluZGV4T2YoIiNwb3B1cDoiKSYmLTE9PT10LmluZGV4T2YoIiNwcmljZToiKSYmZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKGZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0LmdldEF0dHJpYnV0ZSgiaHJlZiIpO2UucHJldmVudERlZmF1bHQoKSx3aW5kb3cubG9jYXRpb24uaHJlZj10fSkpfSkpfXRyeXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLGk9YT9hLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1jb29raWUiKTpudWxsO2EmJiJubyI9PT1pfHxUaWxkYS5zYXZlVVRNKCl9Y2F0Y2gobil7fXZhciBvPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5yIik7ZnVuY3Rpb24gYyhlKXt2YXIgdD1lLnRhcmdldC5jbG9zZXN0KCJhLmpzLWNsaWNrLXN0YXQiKXx8ZS50YXJnZXQuY2xvc2VzdCgiLmpzLWNsaWNrLXplcm8tc3RhdCIpO2lmKGUudGFyZ2V0JiZ0KXt2YXIgcj1lLmN1cnJlbnRUYXJnZXQsYTtpZih0LmNsb3Nlc3QoIi5yIikhPT1yKXJldHVybjt2YXIgaT10LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1ldmVudC1uYW1lIiksbz10LnRleHRDb250ZW50LGM9dC5nZXRBdHRyaWJ1dGUoImhyZWYiKXx8IiIsZD10LmdldEF0dHJpYnV0ZSgidGFyZ2V0IiksbjtpZighaSlpPSIvdGlsZGEvY2xpY2svIisocj9yLmdldEF0dHJpYnV0ZSgiaWQiKToiIikrIi8/dXJsPSIrYztpZihUaWxkYS5zZW5kRXZlbnRUb1N0YXRpc3RpY3MoaSxvKSwiaHR0cCI9PT1jLnN1YnN0cmluZygwLDQpJiYtMT09PWMuaW5kZXhPZigiLnR5cGVmb3JtLmNvbS8iKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7d2luZG93Lm9wZW4oYywiX2JsYW5rIj09PWQ/Il9ibGFuayI6Il9zZWxmIil9KSwiX2JsYW5rIj09PWQ/MDozMDApLGUucHJldmVudERlZmF1bHQoKSwhMX19QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChvLChmdW5jdGlvbihlKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIixjKSxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixjKX0pKTt2YXIgZD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dC5qcy1hbW91bnQiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGQsKGZ1bmN0aW9uKGUpe3ZhciB0PWUudmFsdWU7dD10LnJlcGxhY2UoLywvZywiLiIpLHQ9cGFyc2VGbG9hdCh0LnJlcGxhY2UoL1teMC05XC5dL2csIiIpKSxlLnZhbHVlPXR9KSl9VGlsZGEuc2VuZEVjb21tZXJjZUV2ZW50PWZ1bmN0aW9uKGUsdCl7aWYodm9pZCAwPT09dHx8MD09PXQubGVuZ3RoKXJldHVybiExO2lmKHZvaWQgMD09PWV8fCJhZGQiIT09ZSYmInJlbW92ZSIhPT1lJiYicHVyY2hhc2UiIT09ZSYmImRldGFpbCIhPT1lKXJldHVybiExO2Zvcih2YXIgcixhPSIiLGk9MCxvPVtdLGMsZCxuPSIiLG09IiIsbD0iIix1PTA7dTx0Lmxlbmd0aDt1Kyspe2E+IiImJihhKz0iLCAiKSxhKz0oZD10W3VdKS5uYW1lLGkrPWQucHJpY2UsYz0iIix2b2lkIDAhPT1kLm9wdGlvbnMmJmQub3B0aW9ucy5sZW5ndGg+MCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChkLm9wdGlvbnMsKGZ1bmN0aW9uKGUpe2MrPWUub3B0aW9uKyI6ICIrZS52YXJpYW50KyI7ICJ9KSk7dmFyIHA9e25hbWU6ZC5uYW1lLHByaWNlOmQucHJpY2UsdmFyaWFudDpjLHF1YW50aXR5OjF9O2QuaWQmJmQuaWQ+MCYmKGlkPWQuaWQscC5pZD1kLmlkKSxkLnVpZCYmZC51aWQ+MCYmKG09ZC51aWQscC51aWQ9ZC51aWQpLGQucmVjaWQmJmQucmVjaWQ+MCYmKG49ZC5yZWNpZCxwLnJlY2lkPWQucmVjaWQpLGQubGlkJiZkLmxpZD4wJiYobD1kLmxpZCxwLmxpZD1kLmxpZCksZC5za3UmJmQuc2t1PjAmJihwLnNrdT1kLnNrdSksb1tvLmxlbmd0aF09cH12YXIgcDsiYWRkIiE9PWUmJiJyZW1vdmUiIT09ZXx8KHI9Ii90aWxkYS9jYXJ0LyIrZSsiLyIsbj4wJiYocis9IiIrbiksbT4wP3IrPSItdSIrbTpsPjAmJihyKz0iLSIrbCkpLCJkZXRhaWwiPT09ZSYmKHI9Ii90aWxkYS9wcm9kdWN0L2RldGFpbC8iLG0+MD9yKz1tKyIvIjoobj4wJiYocis9InIiK24pLGw+MCYmKHIrPSItbCIrbCkpKSwicHVyY2hhc2UiPT09ZSYmKHI9Ii90aWxkYS9yZWMiK24rIi9wYXltZW50LyIpLChwPXtlY29tbWVyY2U6e319KS5lY29tbWVyY2VbZV09e3Byb2R1Y3RzOm99LFRpbGRhLnNlbmRFdmVudFRvU3RhdGlzdGljcyhyLGEscCxpKX0sVGlsZGEuc2VuZEV2ZW50VG9TdGF0aXN0aWNzPWZ1bmN0aW9uKGUsdCxyLGEpe3ZhciBpPSIvIj09PWUuc3Vic3RyaW5nKDAsMSksbz1bXSxjLGQ7KGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSkmJihkPW51bGwhPT1jLmdldEF0dHJpYnV0ZSgiZGF0YS1mYi1ldmVudCIpP2MuZ2V0QXR0cmlidXRlKCJkYXRhLWZiLWV2ZW50Iik6d2luZG93LmpRdWVyeSYmdm9pZCAwIT09alF1ZXJ5KCIjYWxscmVjb3JkcyIpLmRhdGEoImZiLWV2ZW50Iik/alF1ZXJ5KCIjYWxscmVjb3JkcyIpLmRhdGEoImZiLWV2ZW50Iik6bnVsbCk7dmFyIG49ISghZHx8Im5vc2VuZCIhPT1kKSxtPWM/Yy5nZXRBdHRyaWJ1dGUoImRhdGEtdmstZXZlbnQiKTpudWxsO2MmJihtPW51bGwhPT1jLmdldEF0dHJpYnV0ZSgiZGF0YS12ay1ldmVudCIpP2MuZ2V0QXR0cmlidXRlKCJkYXRhLXZrLWV2ZW50Iik6d2luZG93LmpRdWVyeSYmdm9pZCAwIT09alF1ZXJ5KCIjYWxscmVjb3JkcyIpLmRhdGEoInZrLWV2ZW50Iik/alF1ZXJ5KCIjYWxscmVjb3JkcyIpLmRhdGEoInZrLWV2ZW50Iik6bnVsbCk7dmFyIGw9ISghbXx8Im5vc2VuZCIhPT1tKSx1PSIiLHA9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQ3MDYiKTtpZih1PWMuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWN1cnJlbmN5Iik/Yy5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtY3VycmVuY3kiKTpwJiZwLmdldEF0dHJpYnV0ZSgiZGF0YS1wcm9qZWN0LWN1cnJlbmN5LWNvZGUiKT9wLmdldEF0dHJpYnV0ZSgiZGF0YS1wcm9qZWN0LWN1cnJlbmN5LWNvZGUiKToiUlVCIixyfHwocj13aW5kb3cubG9jYXRpb24uaHJlZiksKGE9YT9wYXJzZUZsb2F0KGEpOjApPjApaWYod2luZG93LmRhdGFMYXllcnx8KHdpbmRvdy5kYXRhTGF5ZXI9W10pLC0xIT09ZS5pbmRleE9mKCIvdGlsZGEvIikmJi0xIT09ZS5pbmRleE9mKCIvcGF5bWVudC8iKSYmd2luZG93LnRpbGRhRm9ybSYmd2luZG93LnRpbGRhRm9ybS5vcmRlcklkRm9yU3RhdD4iIilyPXtlY29tbWVyY2U6e3B1cmNoYXNlOnthY3Rpb25GaWVsZDp7aWQ6d2luZG93LnRpbGRhRm9ybS5vcmRlcklkRm9yU3RhdCxyZXZlbnVlOndpbmRvdy50aWxkYUZvcm0uYW1vdW50Rm9yU3RhdH0scHJvZHVjdHM6d2luZG93LnRpbGRhRm9ybS5hclByb2R1Y3RzRm9yU3RhdH19fSx3aW5kb3cudGlsZGFGb3JtLnRpbGRhcGF5bWVudCYmd2luZG93LnRpbGRhRm9ybS50aWxkYXBheW1lbnQucHJvbW9jb2RlJiYoci5lY29tbWVyY2UucHVyY2hhc2UuYWN0aW9uRmllbGQuY291cG9uPXdpbmRvdy50aWxkYUZvcm0udGlsZGFwYXltZW50LnByb21vY29kZSksci5ldmVudD0icHVyY2hhc2UiO2Vsc2UgaWYociYmci5lY29tbWVyY2UmJihyLmVjb21tZXJjZS5hZGQmJnIuZWNvbW1lcmNlLmFkZC5wcm9kdWN0cz9vPXIuZWNvbW1lcmNlLmFkZC5wcm9kdWN0czpyLmVjb21tZXJjZS5yZW1vdmUmJnIuZWNvbW1lcmNlLnJlbW92ZS5wcm9kdWN0cz9vPXIuZWNvbW1lcmNlLnJlbW92ZS5wcm9kdWN0czpyLmVjb21tZXJjZS5kZXRhaWwmJnIuZWNvbW1lcmNlLmRldGFpbC5wcm9kdWN0cyYmKG89ci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzKSxvJiZvLmxlbmd0aD4wKSl7Zm9yKHZhciBzPTA7czxvLmxlbmd0aDtzKyspb1tzXS5pZHx8KG9bc10udWlkP29bc10uaWQ9b1tzXS51aWQ6b1tzXS5za3U/b1tzXS5pZD1vW3NdLnNrdTpvW3NdLnJlY2lkJiZvW3NdLmxpZCYmKG9bc10uaWQ9b1tzXS5yZWNpZCsiXyIrb1tzXS5saWQpKTtyLmVjb21tZXJjZS5hZGQmJnIuZWNvbW1lcmNlLmFkZC5wcm9kdWN0cz8oci5lY29tbWVyY2UuYWRkLnByb2R1Y3RzPW8sci5ldmVudD0iYWRkVG9DYXJ0Iik6ci5lY29tbWVyY2UucmVtb3ZlJiZyLmVjb21tZXJjZS5yZW1vdmUucHJvZHVjdHM/KHIuZWNvbW1lcmNlLnJlbW92ZS5wcm9kdWN0cz1vLHIuZXZlbnQ9InJlbW92ZUZyb21DYXJ0Iik6ci5lY29tbWVyY2UuZGV0YWlsJiZyLmVjb21tZXJjZS5kZXRhaWwucHJvZHVjdHM/KHIuZWNvbW1lcmNlLmRldGFpbC5wcm9kdWN0cz1vLHIuZXZlbnQ9InZpZXdQcm9kdWN0Iik6KGk/KHIuZXZlbnQ9InBhZ2VWaWV3IixyLmV2ZW50QWN0aW9uPWUpOnIuZXZlbnQ9ZSxyLnRpdGxlPXQsci52YWx1ZT1hKX12b2lkIDAhPT13aW5kb3cuZGF0YUxheWVyJiYoaT9hPjA/ciYmci5lY29tbWVyY2U/d2luZG93LmRhdGFMYXllci5wdXNoKHIpOndpbmRvdy5kYXRhTGF5ZXIucHVzaCh7ZXZlbnQ6InBhZ2VWaWV3IixldmVudEFjdGlvbjplLHRpdGxlOnQsdmFsdWU6YSxwcm9kdWN0OnJ9KTp3aW5kb3cuZGF0YUxheWVyLnB1c2goe2V2ZW50OiJwYWdlVmlldyIsZXZlbnRBY3Rpb246ZSx0aXRsZTp0LHJlZmVyZXI6cn0pOnImJnIuZWNvbW1lcmNlP3dpbmRvdy5kYXRhTGF5ZXIucHVzaChyKTp3aW5kb3cuZGF0YUxheWVyLnB1c2goe2V2ZW50OmUsZXZlbnRBY3Rpb246dCx2YWx1ZTphLHJlZmVyZXI6cn0pKTt0cnl7dmFyIHY7aWYod2luZG93Lmd0YWdUcmFja2VySUQmJiJndGFnIj09PXdpbmRvdy5tYWluVHJhY2tlcilpZihpKWlmKHImJnIuZXZlbnQpaWYoInB1cmNoYXNlIj09PXIuZXZlbnQpe2Zvcih2YXIgbz1yLmVjb21tZXJjZS5wdXJjaGFzZS5wcm9kdWN0cyx3PTAsZz0wO2c8by5sZW5ndGg7ZysrKWlmKCJkZWxpdmVyeSI9PT1vW2ddLmlkKXt3PW9bZ107YnJlYWt9Z3RhZygiZXZlbnQiLCJwdXJjaGFzZSIse3RyYW5zYWN0aW9uX2lkOnIuZWNvbW1lcmNlLnB1cmNoYXNlLmFjdGlvbkZpZWxkLmlkLHZhbHVlOnBhcnNlRmxvYXQoYSkudG9GaXhlZCgyKSxjdXJyZW5jeTp1LHNoaXBwaW5nOncsaXRlbXM6ci5lY29tbWVyY2UucHVyY2hhc2UucHJvZHVjdHN9KX1lbHNlImFkZFRvQ2FydCI9PT1yLmV2ZW50JiZyLmVjb21tZXJjZS5hZGQ/Z3RhZygiZXZlbnQiLCJhZGRfdG9fY2FydCIse2l0ZW1zOnIuZWNvbW1lcmNlLmFkZC5wcm9kdWN0c30pOiJyZW1vdmVGcm9tQ2FydCI9PT1yLmV2ZW50JiZyLmVjb21tZXJjZS5yZW1vdmU/Z3RhZygiZXZlbnQiLCJyZW1vdmVfZnJvbV9jYXJ0Iix7aXRlbXM6ci5lY29tbWVyY2UucmVtb3ZlLnByb2R1Y3RzfSk6InZpZXdQcm9kdWN0Ij09PXIuZXZlbnQmJnIuZWNvbW1lcmNlLmRldGFpbCYmZ3RhZygiZXZlbnQiLCJ2aWV3X2l0ZW0iLHtpdGVtczpyLmVjb21tZXJjZS5kZXRhaWwucHJvZHVjdHN9KTtlbHNlISF3aW5kb3cuZ3RhZ1RyYWNrZXJJRCYmLTEhPT13aW5kb3cuZ3RhZ1RyYWNrZXJJRC5pbmRleE9mKCJVQS0iKT9ndGFnKCJjb25maWciLHdpbmRvdy5ndGFnVHJhY2tlcklELHtwYWdlX3RpdGxlOnQscGFnZV9wYXRoOmV9KTpndGFnKCJldmVudCIsd2luZG93Lmd0YWdUcmFja2VySUQse3BhZ2VfdGl0bGU6dCxwYWdlX3BhdGg6ZSxzZW5kX3RvOndpbmRvdy5ndGFnVHJhY2tlcklEfSk7ZWxzZSBndGFnKCJldmVudCIsZSx7ZXZlbnRfY2F0ZWdvcnk6InRpbGRhIixldmVudF9sYWJlbDp0LHZhbHVlOmF9KX1jYXRjaCh4KXt9aWYod2luZG93LmdhJiYidGlsZGEiIT09d2luZG93Lm1haW5UcmFja2VyJiYiZ3RhZyIhPT13aW5kb3cubWFpblRyYWNrZXIpaWYoaSlpZihyJiZyLmV2ZW50KXt0cnl7aWYod2luZG93LlRpbGRhLmlzTG9hZEdBRWNvbW1lcmNlfHwod2luZG93LlRpbGRhLmlzTG9hZEdBRWNvbW1lcmNlPSEwLGdhKCJyZXF1aXJlIiwiZWMiKSksZ2EoInNldCIsImN1cnJlbmN5Q29kZSIsdSksInB1cmNoYXNlIj09PXIuZXZlbnQpe2Zvcih2YXIgZix5PXIuZWNvbW1lcmNlLnB1cmNoYXNlLnByb2R1Y3RzLmxlbmd0aCxnPTA7Zzx5O2crKylmPXIuZWNvbW1lcmNlLnB1cmNoYXNlLnByb2R1Y3RzW2ddLGdhKCJlYzphZGRQcm9kdWN0Iix7aWQ6Zi5pZHx8ZyxuYW1lOmYubmFtZSxwcmljZTpwYXJzZUZsb2F0KGYucHJpY2UpLnRvRml4ZWQoMikscXVhbnRpdHk6Zi5xdWFudGl0eX0pO2dhKCJlYzpzZXRBY3Rpb24iLCJwdXJjaGFzZSIse2lkOnIuZWNvbW1lcmNlLnB1cmNoYXNlLmFjdGlvbkZpZWxkLmlkLHJldmVudWU6cGFyc2VGbG9hdChhKS50b0ZpeGVkKDIpfSl9ZWxzZSBpZigiYWRkVG9DYXJ0Ij09PXIuZXZlbnQmJnIuZWNvbW1lcmNlLmFkZCl7Zm9yKHZhciBmLHk9ci5lY29tbWVyY2UuYWRkLnByb2R1Y3RzLmxlbmd0aCxnPTA7Zzx5O2crKylmPXIuZWNvbW1lcmNlLmFkZC5wcm9kdWN0c1tnXSxnYSgiZWM6YWRkUHJvZHVjdCIse2lkOmYuaWR8fGcsbmFtZTpmLm5hbWUscHJpY2U6cGFyc2VGbG9hdChmLnByaWNlKS50b0ZpeGVkKDIpLHF1YW50aXR5OmYucXVhbnRpdHl9KTtnYSgiZWM6c2V0QWN0aW9uIiwiYWRkIil9ZWxzZSBpZigicmVtb3ZlRnJvbUNhcnQiPT09ci5ldmVudCYmci5lY29tbWVyY2UucmVtb3ZlKXtmb3IodmFyIGYseT1yLmVjb21tZXJjZS5yZW1vdmUucHJvZHVjdHMubGVuZ3RoLGc9MDtnPHk7ZysrKWY9ci5lY29tbWVyY2UucmVtb3ZlLnByb2R1Y3RzW2ddLGdhKCJlYzphZGRQcm9kdWN0Iix7aWQ6Zi5pZHx8ZyxuYW1lOmYubmFtZSxwcmljZTpwYXJzZUZsb2F0KGYucHJpY2UpLnRvRml4ZWQoMikscXVhbnRpdHk6Zi5xdWFudGl0eX0pO2dhKCJlYzpzZXRBY3Rpb24iLCJyZW1vdmUiKX1lbHNlIGlmKCJ2aWV3UHJvZHVjdCI9PT1yLmV2ZW50JiZyLmVjb21tZXJjZS5kZXRhaWwpe2Zvcih2YXIgZix5PXIuZWNvbW1lcmNlLmRldGFpbC5wcm9kdWN0cy5sZW5ndGgsZz0wO2c8eTtnKyspZj1yLmVjb21tZXJjZS5kZXRhaWwucHJvZHVjdHNbZ10sZ2EoImVjOmFkZFByb2R1Y3QiLHtpZDpmLmlkfHxnLG5hbWU6Zi5uYW1lLHByaWNlOnBhcnNlRmxvYXQoZi5wcmljZSkudG9GaXhlZCgyKSxxdWFudGl0eTpmLnF1YW50aXR5fSk7Z2EoImVjOnNldEFjdGlvbiIsImRldGFpbCIpfX1jYXRjaCh4KXt9Z2EoInNlbmQiLHtoaXRUeXBlOiJwYWdldmlldyIscGFnZTplLHRpdGxlOnQscGFyYW1zOnJ9KX1lbHNlIGdhKCJzZW5kIix7aGl0VHlwZToicGFnZXZpZXciLHBhZ2U6ZSx0aXRsZTp0fSk7ZWxzZSBnYSgic2VuZCIse2hpdFR5cGU6ImV2ZW50IixldmVudENhdGVnb3J5OiJ0aWxkYSIsZXZlbnRBY3Rpb246ZSxldmVudExhYmVsOnQsZXZlbnRWYWx1ZTphfSk7aWYod2luZG93Lm1haW5NZXRyaWthSWQmJndpbmRvdy5tYWluTWV0cmlrYUlkPjAmJiJmdW5jdGlvbiI9PXR5cGVvZiB5bSlpZihpKXt2YXIgaD17dGl0bGU6dH07YT4wPyhoLnBhcmFtcz17b3JkZXJfcHJpY2U6YX0sdSYmKGgucGFyYW1zLmN1cnJlbmN5PXUpLHltKHdpbmRvdy5tYWluTWV0cmlrYUlkLCJoaXQiLGUsaCkpOnltKHdpbmRvdy5tYWluTWV0cmlrYUlkLCJoaXQiLGUsaCl9ZWxzZSBhPjA/KGg9e29yZGVyX3ByaWNlOmF9LHUmJihoLmN1cnJlbmN5PXUpLHltKHdpbmRvdy5tYWluTWV0cmlrYUlkLCJyZWFjaEdvYWwiLGUsaCkpOnltKHdpbmRvdy5tYWluTWV0cmlrYUlkLCJyZWFjaEdvYWwiLGUpO2lmKHdpbmRvdy5tYWluTWV0cmlrYT4iIiYmd2luZG93W3dpbmRvdy5tYWluTWV0cmlrYV0mJihpP2E+MD93aW5kb3dbd2luZG93Lm1haW5NZXRyaWthXS5oaXQoZSx7dGl0bGU6dCxvcmRlcl9wcmljZTphLHBhcmFtczpyfSk6d2luZG93W3dpbmRvdy5tYWluTWV0cmlrYV0uaGl0KGUse3RpdGxlOnR9KTphPjA/d2luZG93W3dpbmRvdy5tYWluTWV0cmlrYV0ucmVhY2hHb2FsKGUse3RpdGxlOnQscGFyYW1zOnIsb3JkZXJfcHJpY2U6YX0pOndpbmRvd1t3aW5kb3cubWFpbk1ldHJpa2FdLnJlYWNoR29hbChlLHt0aXRsZTp0LHJlZmVyZXI6cn0pKSx2b2lkIDAhPT13aW5kb3cuZmJxJiYhMT09PW4pdHJ5e2lmKGkpaWYoLTE9PT1lLmluZGV4T2YoInRpbGRhLyIpfHwtMT09PWUuaW5kZXhPZigiL3BheW1lbnQvIikmJi0xPT09ZS5pbmRleE9mKCIvc3VibWl0dGVkLyIpKWlmKHImJnIuZXZlbnQmJmE+MClpZigiYWRkVG9DYXJ0Ij09PXIuZXZlbnQmJnIuZWNvbW1lcmNlLmFkZCl7Zm9yKHZhciBmLHk9ci5lY29tbWVyY2UuYWRkLnByb2R1Y3RzLmxlbmd0aCxrPVtdLGc9MDtnPHk7ZysrKWY9ci5lY29tbWVyY2UuYWRkLnByb2R1Y3RzW2ddLGsucHVzaChmLmlkfHxmLnVpZHx8Zi5uYW1lKTt3aW5kb3cuZmJxKCJ0cmFjayIsIkFkZFRvQ2FydCIse2NvbnRlbnRfaWRzOmssY29udGVudF90eXBlOiJwcm9kdWN0Iix2YWx1ZTphLGN1cnJlbmN5OnV9KX1lbHNlIGlmKCJ2aWV3UHJvZHVjdCI9PT1yLmV2ZW50JiZyLmVjb21tZXJjZS5kZXRhaWwpe2Zvcih2YXIgZix5PXIuZWNvbW1lcmNlLmRldGFpbC5wcm9kdWN0cy5sZW5ndGgsaz1bXSxnPTA7Zzx5O2crKylmPXIuZWNvbW1lcmNlLmRldGFpbC5wcm9kdWN0c1tnXSxrLnB1c2goZi5pZHx8Zi51aWR8fGYubmFtZSk7d2luZG93LmZicSgidHJhY2siLCJWaWV3Q29udGVudCIse2NvbnRlbnRfaWRzOmssY29udGVudF90eXBlOiJwcm9kdWN0Iix2YWx1ZTphLGN1cnJlbmN5OnV9KX1lbHNlIGUuaW5kZXhPZigidGlsZGEvcG9wdXAiKSx3aW5kb3cuZmJxKCJ0cmFjayIsIlZpZXdDb250ZW50Iix7Y29udGVudF9uYW1lOnQsY29udGVudF9jYXRlZ29yeTplfSk7ZWxzZSBlLmluZGV4T2YoInRpbGRhL3BvcHVwIiksd2luZG93LmZicSgidHJhY2siLCJWaWV3Q29udGVudCIse2NvbnRlbnRfbmFtZTp0LGNvbnRlbnRfY2F0ZWdvcnk6ZX0pO2Vsc2UgYT4wJiZ1P3dpbmRvdy5mYnEoInRyYWNrIiwiSW5pdGlhdGVDaGVja291dCIse2NvbnRlbnRfbmFtZTp0LGNvbnRlbnRfY2F0ZWdvcnk6ZSx2YWx1ZTphLGN1cnJlbmN5OnV9KTp3aW5kb3cuZmJxKCJ0cmFjayIsIkxlYWQiLHtjb250ZW50X25hbWU6dCxjb250ZW50X2NhdGVnb3J5OmV9KTtlbHNlIHdpbmRvdy5mYnEoInRyYWNrIixlLHtjb250ZW50X25hbWU6dCx2YWx1ZTphfSl9Y2F0Y2goeCl7fWlmKHZvaWQgMCE9PXdpbmRvdy5WSyYmdm9pZCAwIT09d2luZG93LlZLLlJldGFyZ2V0aW5nJiYhMT09PWwpdHJ5e2lmKGkpe3ZhciBjLF89KGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSk/Yy5nZXRBdHRyaWJ1dGUoImRhdGEtdmstcHJpY2UtbGlzdC1pZCIpOm51bGwsYj1fJiZwYXJzZUludChfKXx8MCxUPSIiLEE9ITEsRixGLEYsRixGO2lmKHImJnIuZXZlbnQpaWYoQT17cHJvZHVjdHM6W10sY3VycmVuY3lfY29kZToiIix0b3RhbF9wcmljZTowfSwicHVyY2hhc2UiPT09ci5ldmVudCYmci5lY29tbWVyY2UucHVyY2hhc2UpaWYoYT4wJiZiPjApe3ZhciBmO0EuY3VycmVuY3lfY29kZT11O2Zvcih2YXIgeT1yLmVjb21tZXJjZS5wdXJjaGFzZS5wcm9kdWN0cy5sZW5ndGgsaz1bXSxnPTA7Zzx5O2crKylmPXIuZWNvbW1lcmNlLnB1cmNoYXNlLnByb2R1Y3RzW2ddLEEucHJvZHVjdHMucHVzaCh7aWQ6Zi5pZHx8Zi51aWR8fGYubmFtZSxwcmljZTpmLnByaWNlP2YucHJpY2U6MH0pLEEudG90YWxfcHJpY2U9YTtUPSJpbml0X2NoZWNrb3V0In1lbHNlIFQ9InQtcHVyY2hhc2UiO2Vsc2UgaWYoImFkZFRvQ2FydCI9PT1yLmV2ZW50JiZyLmVjb21tZXJjZS5hZGQpaWYoYT4wJiZiPjApe3ZhciBmO0EuY3VycmVuY3lfY29kZT11O2Zvcih2YXIgeT1yLmVjb21tZXJjZS5hZGQucHJvZHVjdHMubGVuZ3RoLGs9W10sZz0wO2c8eTtnKyspZj1yLmVjb21tZXJjZS5hZGQucHJvZHVjdHNbZ10sQS5wcm9kdWN0cy5wdXNoKHtpZDpmLmlkfHxmLnVpZHx8Zi5uYW1lLHByaWNlOmYucHJpY2U/Zi5wcmljZTowfSksQS50b3RhbF9wcmljZT1hO1Q9ImFkZF90b19jYXJ0In1lbHNlIFQ9InQtYWRkLXRvLWNhcnQiLHIuZWNvbW1lcmNlLmFkZFswXSYmci5lY29tbWVyY2UuYWRkWzBdLnVpZCYmKFQrPSItIityLmVjb21tZXJjZS5hZGRbMF0udWlkKTtlbHNlIGlmKCJ2aWV3UHJvZHVjdCI9PT1yLmV2ZW50JiZyLmVjb21tZXJjZS5kZXRhaWwpaWYoYT4wJiZiPjApe3ZhciBmO0EuY3VycmVuY3lfY29kZT11O2Zvcih2YXIgeT1yLmVjb21tZXJjZS5kZXRhaWwucHJvZHVjdHMubGVuZ3RoLGs9W10sZz0wO2c8eTtnKyspZj1yLmVjb21tZXJjZS5kZXRhaWwucHJvZHVjdHNbZ10sQS5wcm9kdWN0cy5wdXNoKHtpZDpmLmlkfHxmLnVpZHx8Zi5uYW1lLHByaWNlOmYucHJpY2U/Zi5wcmljZTowfSksQS50b3RhbF9wcmljZT1hO1Q9InZpZXdfcHJvZHVjdCJ9ZWxzZSBUPSJ0LXZpZXctcHJvZHVjdCIsci5lY29tbWVyY2UuZGV0YWlsWzBdJiZyLmVjb21tZXJjZS5kZXRhaWxbMF0udWlkJiYoVCs9Ii0iK3IuZWNvbW1lcmNlLmRldGFpbFswXS51aWQpO2Vsc2UgaWYoInJlbW92ZUZyb21DYXJ0Ij09PXIuZXZlbnQmJnIuZWNvbW1lcmNlLnJlbW1vdmUpaWYoYT4wJiZiPjApe3ZhciBmO0EuY3VycmVuY3lfY29kZT11O2Zvcih2YXIgeT1yLmVjb21tZXJjZS5yZW1vdmUucHJvZHVjdHMubGVuZ3RoLGs9W10sZz0wO2c8eTtnKyspZj1yLmVjb21tZXJjZS5yZW1vdmUucHJvZHVjdHNbZ10sQS5wcm9kdWN0cy5wdXNoKHtpZDpmLmlkfHxmLnVpZHx8Zi5uYW1lLHByaWNlOmYucHJpY2U/Zi5wcmljZTowfSksQS50b3RhbF9wcmljZT1hO1Q9InJlbW92ZV9mcm9tX2NhcnQifWVsc2UgVD0idC1yZW1vdmUtcHJvZHVjdCIsci5lY29tbWVyY2UucmVtb3ZlWzBdJiZyLmVjb21tZXJjZS5yZW1vdmVbMF0udWlkJiYoVCs9Ii0iK3IuZWNvbW1lcmNlLnJlbW92ZVswXS51aWQpO2Vsc2UgVD1yLmV2ZW50O2Vsc2UgaWYoLTEhPT1lLmluZGV4T2YoInRpbGRhLyIpJiYtMSE9PWUuaW5kZXhPZigiL3BheW1lbnQvIikpVD0idC1wdXJjaGFzZS0iKyhGPShGPShGPWUucmVwbGFjZSgiL3RpbGRhLyIsIiIpKS5yZXBsYWNlKCJ0aWxkYS8iLCIiKSkucmVwbGFjZSgiL3BheW1lbnQvIiwiIikpO2Vsc2UgaWYoLTEhPT1lLmluZGV4T2YoInRpbGRhLyIpJiYtMSE9PWUuaW5kZXhPZigiL3N1Ym1pdHRlZC8iKSlUPSJ0LWxlYWQtIisoRj0oRj0oRj1lLnJlcGxhY2UoIi90aWxkYS8iLCIiKSkucmVwbGFjZSgidGlsZGEvIiwiIikpLnJlcGxhY2UoIi9zdWJtaXR0ZWQvIiwiIikpO2Vsc2UgaWYoLTEhPT1lLmluZGV4T2YoInRpbGRhL3BvcHVwIikpVD0idC0iKyhGPShGPWUucmVwbGFjZSgiL3RpbGRhLyIsIiIpKS5yZXBsYWNlKCIvIiwiLSIpKTtlbHNlIGlmKC0xIT09ZS5pbmRleE9mKCJ0aWxkYS9jbGljayIpKVQ9InQtIisoRj0oRj1lLnJlcGxhY2UoIi90aWxkYS8iLCIiKSkucmVwbGFjZSgiLyIsIi0iKSk7ZWxzZSBUPSJ0LSIrKEY9ZS5yZXBsYWNlKCIvIiwiLSIpKTtiPjAmJkEmJkEuY3VycmVuY3lfY29kZT8oVksuUmV0YXJnZXRpbmcuRXZlbnQoInB1cmNoYXNlIiksVksuUmV0YXJnZXRpbmcuUHJvZHVjdEV2ZW50KGIsVCxBKSk6KFZLLlJldGFyZ2V0aW5nLkV2ZW50KFQpLCJ0LXB1cmNoYXNlIj09PVQuc3Vic3RyaW5nKDAsMTApP1ZLLkdvYWwoInB1cmNoYXNlIik6InQtbGVhZCI9PT1ULnN1YnN0cmluZygwLDYpJiZWSy5Hb2FsKCJsZWFkIikpfWVsc2UgVksuUmV0YXJnZXRpbmcuRXZlbnQoZSl9Y2F0Y2goeCl7fWlmKHdpbmRvdy5tYWluTWFpbHJ1SWQ+IjAiKXt2YXIgRT13aW5kb3cuX3Rtcnx8KHdpbmRvdy5fdG1yPVtdKTtpP2E+MD9FLnB1c2goe2lkOiIiK3dpbmRvdy5tYWluTWFpbHJ1SWQsdHlwZToicGFnZVZpZXciLHVybDplLHZhbHVlOmEsc3RhcnQ6KG5ldyBEYXRlKS5nZXRUaW1lKCl9KTpFLnB1c2goe2lkOiIiK3dpbmRvdy5tYWluTWFpbHJ1SWQsdHlwZToicGFnZVZpZXciLHVybDplLHN0YXJ0OihuZXcgRGF0ZSkuZ2V0VGltZSgpfSk6YT4wP0UucHVzaCh7aWQ6IiIrd2luZG93Lm1haW5NYWlscnVJZCx0eXBlOiJyZWFjaEdvYWwiLGdvYWw6ZSx2YWx1ZTphfSk6RS5wdXNoKHtpZDoiIit3aW5kb3cubWFpbk1haWxydUlkLHR5cGU6InJlYWNoR29hbCIsZ29hbDplfSl9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50aWxkYXN0YXQmJihpPyhlLmluZGV4T2YoInBheW1lbnQiKT4wJiZlLmluZGV4T2YoInRpbGRhL2Zvcm0iKT4tMSYmKGU9ZS5yZXBsYWNlKCJ0aWxkYS9mb3JtIiwidGlsZGEvcmVjIikpLHdpbmRvdy50aWxkYXN0YXQoInBhZ2V2aWV3Iix7cGFnZTplfSkpOndpbmRvdy50aWxkYXN0YXQoInBhZ2V2aWV3Iix7cGFnZToiL3RpbGRhL2V2ZW50LyIrZX0pKX0sVGlsZGEuc2F2ZVVUTT1mdW5jdGlvbigpe3RyeXt2YXIgZT13aW5kb3cubG9jYXRpb24uaHJlZix0PSIiLHI9IiI7aWYoLTEhPT1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigidXRtXyIpJiYic3RyaW5nIj09dHlwZW9mKHQ9KHQ9KGU9ZS50b0xvd2VyQ2FzZSgpKS5zcGxpdCgiPyIpKVsxXSkpe3ZhciBhLGk9dC5zcGxpdCgiJiIpO2Zvcih2YXIgbyBpbiBpKSJhbXA7Ij09PShhPWlbb10uc3BsaXQoIj0iKSlbMF0uc3Vic3RyaW5nKDAsNCkmJihhWzBdPWFbMF0uc3Vic3RyaW5nKDQpKSwidXRtXyI9PT1hWzBdLnN1YnN0cmluZygwLDQpJiYocj1yK2lbb10rInx8fCIpO2lmKHIubGVuZ3RoPjApe3ZhciBjPW5ldyBEYXRlO2Muc2V0RGF0ZShjLmdldERhdGUoKSszMCksZG9jdW1lbnQuY29va2llPSJUSUxEQVVUTT0iK2VuY29kZVVSSUNvbXBvbmVudChyKSsiOyBwYXRoPS87IGV4cGlyZXM9IitjLnRvVVRDU3RyaW5nKCl9fX1jYXRjaChkKXt9fSwibG9hZGluZyIhPT1kb2N1bWVudC5yZWFkeVN0YXRlP2UoKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixlKX0oKSxFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzfHwoRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcz1FbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzU2VsZWN0b3J8fEVsZW1lbnQucHJvdG90eXBlLm1zTWF0Y2hlc1NlbGVjdG9yfHxFbGVtZW50LnByb3RvdHlwZS5tb3pNYXRjaGVzU2VsZWN0b3J8fEVsZW1lbnQucHJvdG90eXBlLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8RWxlbWVudC5wcm90b3R5cGUub01hdGNoZXNTZWxlY3RvciksRWxlbWVudC5wcm90b3R5cGUuY2xvc2VzdHx8KEVsZW1lbnQucHJvdG90eXBlLmNsb3Nlc3Q9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXM7dCYmMT09PXQubm9kZVR5cGU7KXtpZihFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzLmNhbGwodCxlKSlyZXR1cm4gdDt0PXQucGFyZW50RWxlbWVudHx8dC5wYXJlbnROb2RlfXJldHVybiBudWxsfSk7CgohZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpO2Z1bmN0aW9uIHQoKXt2YXIgZT1NYXRoLmZsb29yKDg5OTk5OSpNYXRoLnJhbmRvbSgpKSsxZTU7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCkrIi4iK2V9ZnVuY3Rpb24gbihlKXt2YXIgdD1lLnJlcGxhY2UoLyhbXC4kPyp8e31cKFwpXFtcXVxcXC9cK15dKS9nLCJcXCQxIiksbj1uZXcgUmVnRXhwKCIoPzpefDsgKSIrdCsiPShbXjtdKikiKSxvPWRvY3VtZW50LmNvb2tpZS5tYXRjaChuKTtpZihvKXJldHVybiBkZWNvZGVVUklDb21wb25lbnQob1sxXSl9ZnVuY3Rpb24gbyhlLHQsbil7dmFyIG89bi5leHBpcmVzO2lmKCFvKXJldHVybiExO2lmKCJudW1iZXIiPT10eXBlb2Ygbyl7dmFyIGk9KG5ldyBEYXRlKS5nZXRUaW1lKCkrMWUzKm87KG89bmV3IERhdGUoaSkpLnRvVVRDU3RyaW5nJiYobi5leHBpcmVzPW8udG9VVENTdHJpbmcoKSl9dmFyIGE9ZSsiPSIrKHQ9ZW5jb2RlVVJJQ29tcG9uZW50KHQpKTtmb3IodmFyIHIgaW4gbilhKz0iOyAiK3IsITAhPT1uW3JdJiYoYSs9Ij0iK25bcl0pO2RvY3VtZW50LmNvb2tpZT1hfWZ1bmN0aW9uIGkoZSx0KXtmb3IodmFyIG4gaW4gdCllW25dPXRbbl07cmV0dXJuIGV9ZnVuY3Rpb24gYShlKXt2YXIgdD0hMDtpZighZSl0aHJvdyBuZXcgRXJyb3IoIm5vIGNhbGxiYWNrIGdpdmVuIik7ZnVuY3Rpb24gbigpe3R8fGUodD0hMCl9ZnVuY3Rpb24gbygpe3QmJmUodD0hMSl9ImhpZGRlbiJpbiBkb2N1bWVudCYmZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsKGZ1bmN0aW9uKCl7KGRvY3VtZW50LmhpZGRlbj9vOm4pKCl9KSksIm1vekhpZGRlbiJpbiBkb2N1bWVudCYmZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW96dmlzaWJpbGl0eWNoYW5nZSIsKGZ1bmN0aW9uKCl7KGRvY3VtZW50Lm1vekhpZGRlbj9vOm4pKCl9KSksIndlYmtpdEhpZGRlbiJpbiBkb2N1bWVudCYmZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigid2Via2l0dmlzaWJpbGl0eWNoYW5nZSIsKGZ1bmN0aW9uKCl7KGRvY3VtZW50LndlYmtpdEhpZGRlbj9vOm4pKCl9KSksIm1zSGlkZGVuImluIGRvY3VtZW50JiZkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtc3Zpc2liaWxpdHljaGFuZ2UiLChmdW5jdGlvbigpeyhkb2N1bWVudC5tc0hpZGRlbj9vOm4pKCl9KSksIm9uZm9jdXNpbiJpbiBkb2N1bWVudCYmKGRvY3VtZW50Lm9uZm9jdXNpbj1uLGRvY3VtZW50Lm9uZm9jdXNvdXQ9byksd2luZG93Lm9ucGFnZXNob3c9d2luZG93Lm9uZm9jdXM9bix3aW5kb3cub25wYWdlaGlkZT13aW5kb3cub25ibHVyPW99ZnVuY3Rpb24gcigpe3ZhciBlPXdpbmRvdy5wYWdlWU9mZnNldCx0PXdpbmRvdy5pbm5lckhlaWdodCxuPU1hdGgubWF4KGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0LGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQsZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQsZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldEhlaWdodCxkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSxvPTAsaT0wO3Y9ITA7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInQtaGVhZGVyIikscj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidC1mb290ZXIiKSxkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0aWxkYWNvcHkiKTthJiYobz1hLm9mZnNldEhlaWdodCksciYmKGk9ci5vZmZzZXRIZWlnaHQpLGQmJihpKz1kLm9mZnNldEhlaWdodCk7dmFyIGM9TWF0aC5mbG9vcigxMDAqKGUtbyt0KS8obi1vLWkpKTtpZighKGM8MTApKWZvcih2YXIgcz1bMTAsMjUsNTAsNzUsOTBdLGw9MDtsPHMubGVuZ3RoO2wrKyl7dmFyIHU9c1tsXSxnPXMubGVuZ3RoLTE7aWYoMD09PWwmJmM+PXUmJiF3WyJwIit1XSltLnBhZ2U9Ii90aWxkYS9zY3JvbGwvIit1KyIvIix3aW5kb3cudGlsZGFzdGF0KCJwYWdldmlldyIpLHdbInAiK3VdPSEwO2Vsc2UgaWYoYz49dS0xKXtpZigwPT09d1sicCIrdV0pe20ucGFnZT0iL3RpbGRhL3Njcm9sbC8iK3UrIi8iLHdpbmRvdy50aWxkYXN0YXQoInBhZ2V2aWV3Iiksd1sicCIrdV09c2V0VGltZW91dCgoZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQod1sicCIrdV0pLHdbInAiK3VdPS0xfSksNWUzKTticmVha31pZigobCE9PWcmJmM8c1tsKzFdfHxsPT09ZykmJi0xPT09d1sicCIrdV0pe3dbInAiK3VdPTA7YnJlYWt9fX19ZnVuY3Rpb24gZCgpe3ZhciBlPTA9PT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUuaW5kZXhPZigid3d3LiIpP3dpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZS5zbGljZSg0KTp3aW5kb3cubG9jYXRpb24uaG9zdG5hbWU7cmV0dXJuIGUubGFzdEluZGV4T2YoIi4iKT09PWUubGVuZ3RoLTEmJihlPWUuc2xpY2UoMCwtMSkpLGUrd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lfWZ1bmN0aW9uIGMoZSl7Zm9yKHZhciB0PUFycmF5KGUubGVuZ3RoKSxuPTA7bjxlLmxlbmd0aDtuKyspdFtuXT1uO3JldHVybiBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwodCwoZnVuY3Rpb24odCl7cmV0dXJuIGUuY2hhckNvZGVBdCh0KS50b1N0cmluZygxNil9KSkuam9pbigiIil9ZnVuY3Rpb24gcygpe3ZhciBlPShuYXZpZ2F0b3IuY29va2llRW5hYmxlZD8iY1QiOiJjRiIpKyJ8IisobmF2aWdhdG9yLmRldmljZU1lbW9yeT8iZG0iK25hdmlnYXRvci5kZXZpY2VNZW1vcnk6ImRtIikrInwiKyhuYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeT8iaGMiK25hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5OiJoYyIpKyJ8IisobmF2aWdhdG9yLmxhbmd1YWdlcz8ibCIrbmF2aWdhdG9yLmxhbmd1YWdlcy5qb2luKCIsIik6ImwiKSsifCI7aWYobmF2aWdhdG9yLnBsYXRmb3JtfHxuYXZpZ2F0b3IuYXBwTmFtZT9lKz0obmF2aWdhdG9yLnBsYXRmb3JtPyJwIituYXZpZ2F0b3IucGxhdGZvcm06InAiKSsifCIrKG5hdmlnYXRvci52ZW5kb3I/InYiK25hdmlnYXRvci52ZW5kb3I6InYiKSsifCIrKG5hdmlnYXRvci5hcHBDb2RlTmFtZT8iYSIrbmF2aWdhdG9yLmFwcENvZGVOYW1lOiJhIikrInwiKyhuYXZpZ2F0b3IuYXBwTmFtZT8ibiIrbmF2aWdhdG9yLmFwcE5hbWU6Im4iKSsifCI6ZSs9KG5hdmlnYXRvci51c2VyQWdlbnQ/InVhIituYXZpZ2F0b3IudXNlckFnZW50OiJ1YSIpKyJ8IixuYXZpZ2F0b3IucGx1Z2lucyl7dmFyIHQsbixvPSIiO2ZvcihuPW5hdmlnYXRvci5wbHVnaW5zLmxlbmd0aD4yMD8yMDpuYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGgsdD0wO3Q8bjt0KyspbmF2aWdhdG9yLnBsdWdpbnNbdF0mJm5hdmlnYXRvci5wbHVnaW5zW3RdLmZpbGVuYW1lP28rPW5hdmlnYXRvci5wbHVnaW5zW3RdLmZpbGVuYW1lOm5hdmlnYXRvci5wbHVnaW5zW3RdJiZuYXZpZ2F0b3IucGx1Z2luc1t0XS5uYW1lJiYobys9bmF2aWdhdG9yLnBsdWdpbnNbdF0ubmFtZSk7ZSs9InBsIitvKyJ8In1yZXR1cm4gZSs9InByIit3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbysifCIsZSs9InciKyhzY3JlZW4mJnNjcmVlbi53aWR0aD9zY3JlZW4ud2lkdGg6d2luZG93LmlubmVyV2lkdGgpKyJoIisoc2NyZWVuJiZzY3JlZW4uaGVpZ2h0P3NjcmVlbi5oZWlnaHQ6d2luZG93LmlubmVySGVpZ2h0KSsifCIsZSs9ImNEIisoc2NyZWVuLmNvbG9yRGVwdGg/c2NyZWVuLmNvbG9yRGVwdGg6IiIpKyJ8IixlKz0idE8iKyhuZXcgRGF0ZSkuZ2V0VGltZXpvbmVPZmZzZXQoKSsifCIsZT1jKGUrPSJtVCIrKHZvaWQgMCE9PW5hdmlnYXRvci5tYXhUb3VjaFBvaW50cz9uYXZpZ2F0b3IubWF4VG91Y2hQb2ludHM6dm9pZCAwIT09bmF2aWdhdG9yLm1zTWF4VG91Y2hQb2ludHM/bmF2aWdhdG9yLm1zTWF4VG91Y2hQb2ludHM6IiIpKyJ8Iil9ZnVuY3Rpb24gbCgpe3g9bigidGlsZGF1aWQiKSxFPW4oInRpbGRhc2lkIiksaD8oeHx8KHg9InNpbXBsZSIpLEV8fChFPSJzaW1wbGUiKSk6KHh8fCh4PXQoKSksRXx8KEU9dCgpKSl9ZnVuY3Rpb24gdSgpe3ZhciBlO2h8fChvKCJ0aWxkYXVpZCIseCx7ZXhwaXJlczo3Nzc2ZTMscGF0aDoiLyJ9KSxvKCJ0aWxkYXNpZCIsRSx7ZXhwaXJlczoxODAwLHBhdGg6Ii8ifSkpfWZ1bmN0aW9uIGcodCl7aWYobS51c2VyX2FnZW50PiIiJiYtMSE9bS51c2VyX2FnZW50LmluZGV4T2YoImJvdCIpKXJldHVybiExO2lmKCJodHRwOiIhPXdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCYmImh0dHBzOiIhPXdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbClyZXR1cm4gY29uc29sZS5sb2coIlRpbGRhU3RhdDogY2Fubm90IHdvcmsgb24gbG9jYWwgcGFnZSIpLCExO3ZhciBuO2woKSx1KCksbS5wYWdlPWQoKSxtLnJlZmVycmVyPWRvY3VtZW50LnJlZmVycmVyfHwiIixtLnVzZXJpZD14LG0uc2Vzc2lvbmlkPUUsbS51c2VyX2FnZW50PXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LG0udXNlcl9sYW5ndWFnZT13aW5kb3cubmF2aWdhdG9yLnVzZXJMYW5ndWFnZXx8d2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZSxlJiYobS5wcm9qZWN0aWQ9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtcHJvamVjdC1pZCIpfHwiMCIsbS5wYWdlaWQ9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtcGFnZS1pZCIpfHwiMCIsbS5wYWdlYWxpYXM9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtcGFnZS1hbGlhcyIpfHwiIixtLmZvcm1za2V5PWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWZvcm1za2V5Iil8fCIiKSxtLnBhcmFtcz17fTt0cnl7bj1kZWNvZGVVUklDb21wb25lbnQod2luZG93LmxvY2F0aW9uLnNlYXJjaCl9Y2F0Y2goYyl7bj13aW5kb3cubG9jYXRpb24uc2VhcmNofWlmKG4+Ij8iJiYobS5wYWdlcXVlcnk9bi5zdWJzdHJpbmcoMSkudG9Mb3dlckNhc2UoKSx+bS5wYWdlcXVlcnkuaW5kZXhPZigidXRtXyIpKSl7dmFyIG8saT1tLnBhZ2VxdWVyeS5zcGxpdCgiJiIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaSwoZnVuY3Rpb24oZSl7KG89ZS5zcGxpdCgiPSIpKS5sZW5ndGg+MT8idXRtX3JlZmVycmVyIiE9PW9bMF18fG0ucmVmZXJyZXImJiF+bS5yZWZlcnJlci5pbmRleE9mKCJvaGlvOC52Iik/bS5wYXJhbXNbb1swXV09b1sxXTptLnJlZmVycmVyPW9bMV06bS5wYXJhbXNbb1swXV09IiJ9KSl9dmFyIHI9ITE7aWYoL0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYocj0hMCksbS5pc21vYmlsZT1yLGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0aWxkYXN0YXRzY3JpcHQiKSYmKG0udGlsZGFzdGF0Y29kZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGlsZGFzdGF0c2NyaXB0Iikua2V5KSxrKXRyeXthKChmdW5jdGlvbihlKXt2PSEhZX0pKSxkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNld2hlZWwiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dj0hMH0pLDFlMykpLGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix0X3Rocm90dGxlKChmdW5jdGlvbigpe3Y9ITB9KSwxZTMpKSxkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoImtleXByZXNzIix0X3Rocm90dGxlKChmdW5jdGlvbigpe3Y9ITB9KSwxZTMpKSxkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0X3Rocm90dGxlKChmdW5jdGlvbigpe3Y9ITB9KSwxZTMpKX1jYXRjaChjKXt9bS5maW5nZXJwcmludD1zKCksVD0hMH1mdW5jdGlvbiBwKGUpe3ZhciB0PSJodHRwczovL3N0YXQudGlsZGFhcGkuIitMKCkrIi9ldmVudC8iLGk7aHx8KG4oInRpbGRhc2lkIil8fCIiKSE9bS5zZXNzaW9uaWQmJm8oInRpbGRhc2lkIixtLnNlc3Npb25pZCx7ZXhwaXJlczoxODAwLHBhdGg6Ii8ifSk7IiI9PT1tLnJlZmVycmVyJiYobS5yZWZlcnJlcj1uKCJwcmV2aW91c1VybCIpfHwiIiksbS50aWxkYXV0bT1uKCJUSUxEQVVUTSIpfHwiIixtLnBhZ2V8fChjb25zb2xlLmxvZygiVGlsZGFTdGF0OiBwYWdlIGVtcHR5IiksbS5wYWdlPWQoKSx3aW5kb3cubG9jYXRpb24uaGFzaCYmMD09PXdpbmRvdy5sb2NhdGlvbi5oYXNoLmluZGV4T2YoIiMhIikmJihtLnBhZ2UrPXdpbmRvdy5sb2NhdGlvbi5oYXNoKSksIi8iPT09bS5wYWdlLnN1YnN0cmluZygwLDEpJiYobS5wYWdlPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSttLnBhZ2UpO3ZhciBhPWYobSkscj1uZXcgWE1MSHR0cFJlcXVlc3Q7ci5vcGVuKCJQT1NUIix0LCEwKSxyLndpdGhDcmVkZW50aWFscz0hMSxyLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIpLHIub25lcnJvcj1mdW5jdGlvbihlKXtjb25zb2xlLmVycm9yKCJUaWxkYVN0YXQ6IGZhaWwgcGFnZXZpZXcgIiksY29uc29sZS5lcnJvcihlKX0sci50aW1lb3V0PTNlMyxyLnNlbmQoYSksbS5wYWdlJiYtMT09PW0ucGFnZS5pbmRleE9mKCJ0aWxkYS9zY3JvbGwiKSYmLTE9PT1tLnBhZ2UuaW5kZXhPZigidGlsZGEvcmVhZHRpbWUiKSYmLTE9PT1tLnBhZ2UuaW5kZXhPZigidGlsZGEvY2xpY2siKSYmLTE9PT1tLnBhZ2UuaW5kZXhPZigidGlsZGEvY29va2llZW5hYmxlZCIpJiYobS5yZWZlcnJlcj1tLnBhZ2UsaHx8bygicHJldmlvdXNVcmwiLG0ucGFnZSx7cGF0aDoiLyIsZXhwaXJlczoxODAwfSkpLG0ucGFnZT0iIix3aW5kb3cudGlsZGFzdGF0bG9hZD0hMH1mdW5jdGlvbiBmKGUpe3ZhciB0PSIiO2Zvcih2YXIgbiBpbiBlKWlmKCIiIT10JiYib2JqZWN0IiE9dHlwZW9mIGVbbl0mJih0Kz0iJiIpLCJvYmplY3QiPT10eXBlb2YgZVtuXSl7aWYoT2JqZWN0LmtleXMoZVtuXSkubGVuZ3RoKWZvcih2YXIgbyBpbiBlW25dKXQrPSImIituKyJbIitvKyJdPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVbbl1bb10pfWVsc2UgdCs9bisiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVbbl0pO3JldHVybiB0fXdpbmRvdy50aWxkYXN0YXQ9ZnVuY3Rpb24oZSx0KXtpZighZSlyZXR1cm4hMTtpZigiY3JlYXRlIiE9PWUmJiFUKXJldHVybiBzZXRUaW1lb3V0KChmdW5jdGlvbigpe3dpbmRvdy50aWxkYXN0YXQoZSx0KX0pLDFlMyksITE7c3dpdGNoKHQmJmkobSx0KSxlKXtjYXNlImNyZWF0ZSI6Zyh0KTticmVhaztjYXNlInBhZ2V2aWV3IjpwKHQpO2JyZWFrO2Nhc2UicmVhZHRpbWUiOmsmJih2JiYobS5wYWdlPSIvdGlsZGEvcmVhZHRpbWUvIix2PSExLHAodCkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7d2luZG93LnRpbGRhc3RhdCgicmVhZHRpbWUiKX0pLDE1ZTMpKTticmVhaztjYXNlInNjcm9sbCI6ayYmImZ1bmN0aW9uIj09dHlwZW9mIHRfdGhyb3R0bGUmJndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7cigpfSksMWUzKSk7YnJlYWs7Y2FzZSJjb29raWVlbmFibGVkIjpoPSExLGwoKSx1KCksbS51c2VyaWQ9eCxtLnNlc3Npb25pZD1FLG0ucGFnZT0iL3RpbGRhL2Nvb2tpZWVuYWJsZWQvIixwKHQpO2JyZWFrO2Nhc2UiZmluZ2VycHJpbnQiOnJldHVybiBzKCl9fTt2YXIgbT17fSx3PXtwMTA6MCxwMjU6MCxwNTA6MCxwNzU6MCxwOTA6MH0sdj0hMCxoPSJubyI9PT13aW5kb3cudGlsZGFzdGF0Y29va2llLHk7aWYoKHdpbmRvdy50aWxkYXN0YXRjb29raWV8fGUmJihoPSJubyI9PT1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1jb29raWUiKSksInllcyI9PT13aW5kb3cudGlsZGFzdGF0Y29va2llZ2RwciYmITE9PT1oKSYmKGg9ITAsITA9PT1uKCJ0X2Nvb2tpZXNDb25zZW50R2l2ZW4iKSkpe3ZhciBiPW4oInRfY29va2llc0NhdGVnb3JpZXMiKTsic3RyaW5nIj09dHlwZW9mIGImJmIuaW5kZXhPZigiYW5hbHl0aWNzIik+LTEmJihoPSExKX12YXIgaz0ieWVzIj09PXdpbmRvdy50aWxkYXN0YXRzY3JvbGw7dm9pZCAwPT09d2luZG93LnRpbGRhc3RhdHNjcm9sbCYmZSYmKGs9InllcyI9PT1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1zdGF0LXNjcm9sbCIpKTt2YXIgeD0iIixFPSIiLFQ9ITE7d2luZG93LnRpbGRhc3RhdCgiY3JlYXRlIiksc2V0VGltZW91dCgoZnVuY3Rpb24oKXt3aW5kb3cudGlsZGFzdGF0KCJwYWdldmlldyIpLHdpbmRvdy50aWxkYXN0YXQoInJlYWR0aW1lIiksd2luZG93LnRpbGRhc3RhdCgic2Nyb2xsIil9KSw1MDApO3ZhciBqPXNldEludGVydmFsKChmdW5jdGlvbigpe2lmKCgib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy50X2pzZXJyb3JzJiZ3aW5kb3cudF9qc2Vycm9ycy5sZW5ndGg+MHx8Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cudF9jZG5lcnJvcnMmJndpbmRvdy50X2NkbmVycm9ycy5sZW5ndGg+MHx8Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cudF9hamF4ZXJyb3JzJiZ3aW5kb3cudF9hamF4ZXJyb3JzLmxlbmd0aD4wKSYmImZ1bmN0aW9uIiE9dHlwZW9mIHRfZXJyb3JzX19zZW5kSlNFcnJvcnMpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Uuc3JjPSJodHRwczovL3N0YXRpYy50aWxkYWNkbi4iK0woKSsiL2pzL3RpbGRhLWVycm9ycy0xLjAubWluLmpzIixlLmFzeW5jPSEwLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSksY2xlYXJJbnRlcnZhbChqKX19KSwyZTMpLE89ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigibGlua1tyZWwqPSdzaG9ydGN1dCBpY29uJ10iKSxfPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImxpbmtbaHJlZio9J3RpbGRhLndzL3Byb2plY3QnXSIpLmxlbmd0aDtffHwoXz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJsaW5rW2hyZWYqPSd3cy50aWxkYWNkbi5jb20vcHJvamVjdCddIikubGVuZ3RoKTt2YXIgQT1PP08uZ2V0QXR0cmlidXRlKCJocmVmIik6IiIsSD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJzY3JpcHRbc3JjKj0nanMvdGlsZGEtc2NyaXB0cyddIiksQz0hIUgmJi0xPT09SC5zcmMuaW5kZXhPZigidGlsZGFjZG4iKSxJOyhDfHwoQz1PJiYtMSE9PUEuaW5kZXhPZigic3RhdGljLnRpbGRhY2RuLiIrTCgpKSYmLTEhPT1BLmluZGV4T2YoInRpbGRhLiIpJiYtMSE9PUEuaW5kZXhPZigiL3RpbGRhZmF2aWNvbi5pY28iKSYmIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInRhYmxlI2FsbHJlY29yZHMiKSYmISgtMSE9PXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZS5pbmRleE9mKCIudGlsZGEud3MiKSkmJiFfKSx2b2lkIDA9PT1uYXZpZ2F0b3Iuc2VuZEJlYWNvbnx8L0JvdC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl8fEMpfHwxPT09TWF0aC5mbG9vcig1Kk1hdGgucmFuZG9tKCkpJiZTKChmdW5jdGlvbigpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2UuYXN5bmM9ITAsZS50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiLGUuc3JjPSJodHRwczovL3N0YXRpYy50aWxkYWNkbi4iK0woKSsiL2pzL3RpbGRhLXBlcmZvcm1hbmNlLTEuMC5taW4uanMiLGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLGUpfSkpO2Z1bmN0aW9uIFMoZSl7ImNvbXBsZXRlIj09PWRvY3VtZW50LnJlYWR5U3RhdGU/ZSgpOndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixlKX1mdW5jdGlvbiBMKCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSx0O3JldHVybiBlJiZlLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1yb290LXpvbmUiKXx8ImNvbSJ9fSgpOwoKdF9vblJlYWR5KGZ1bmN0aW9uKCkge3Rfb25GdW5jTG9hZCgndDM5Nl9pbml0JyxmdW5jdGlvbigpIHt0Mzk2X2luaXQoJzc4ODc4NzM3OScpO30pO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnNzg5MzQzMjQwJyk7fSk7fSk7CnRfb25SZWFkeShmdW5jdGlvbigpIHt0X29uRnVuY0xvYWQoJ3QzOTZfaW5pdCcsZnVuY3Rpb24oKSB7dDM5Nl9pbml0KCc3OTAxNjQwNDInKTt9KTt9KTsKdF9vblJlYWR5KGZ1bmN0aW9uKCkge3NldFRpbWVvdXQoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0ODY4X2luaXRQb3B1cCcsZnVuY3Rpb24oKSB7dDg2OF9pbml0UG9wdXAoJzIyOTI1NDk2MDEnKTt9KTt9LDUwMCk7fSk7CnRfb25SZWFkeShmdW5jdGlvbigpIHt0X29uRnVuY0xvYWQoJ3QzOTZfaW5pdCcsZnVuY3Rpb24oKSB7dDM5Nl9pbml0KCc3ODg4NDQ2MTInKTt9KTt9KTsKdF9vblJlYWR5KGZ1bmN0aW9uKCkge3Rfb25GdW5jTG9hZCgndDM5Nl9pbml0JyxmdW5jdGlvbigpIHt0Mzk2X2luaXQoJzc4ODk3MTkyOCcpO30pO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKXt2YXIgcHJvZGNhcmRfb3B0c09iaj17YmxvY2tJZDonJyxoYXNXcmFwOicnLHR4dFBhZDonJyxiZ0NvbG9yOicnLGJvcmRlclJhZGl1czonJyxzaGFkb3c6Jycsc2hhZG93U2l6ZTonJyxzaGFkb3dPcGFjaXR5OicnLHNoYWRvd0hvdmVyOicnLHNoYWRvd1NpemVIb3ZlcjonJyxzaGFkb3dPcGFjaXR5SG92ZXI6Jycsc2hhZG93U2hpZnR5SG92ZXI6JycsYnRuVGl0bGUxOicnLGJ0bkxpbmsxOidwb3B1cCcsYnRuVGl0bGUyOicnLGJ0bkxpbmsyOidwb3B1cCcsc2hvd09wdHM6ZmFsc2Usc3R5bGU6JycsaGFzSW1nOnRydWUsaGFzRGVzY3I6dHJ1ZSxoYXNTZXBhcmF0b3I6dHJ1ZX07dmFyIHByaWNlX29wdHNPYmo9e2NvbG9yOicjMDAwMDAwJyxjb2xvck9sZDonI2EzYTNhMycscG9zaXRpb246J2J0JyxwcmljZVJhbmdlOicnfTt2YXIgcG9wdXBfb3B0c09iaj17cG9wdXBDb250YWluZXI6JycsY29sdW1uczonNicsY29sdW1uczI6JzYnLGlzVmVydGljYWw6JycsYWxpZ246J2xlZnQnLGJ0blRpdGxlOidCVVkgTk9XJyxjbG9zZVRleHQ6J01vcmUgcHJvZHVjdHMnLGljb25Db2xvcjonIzAwMDAwMCcsY29udGFpbmVyQmdDb2xvcjonI2ZmZmZmZicsb3ZlcmxheUJnQ29sb3I6JyNmZmZmZmYnLG92ZXJsYXlCZ0NvbG9yUmdiYToncmdiYSgyNTUsMjU1LDI1NSwxKScscG9wdXBTdGF0OicnLHRhYnNQb3NpdGlvbjonJyxmaXhlZEJ1dHRvbjpmYWxzZSxtb2JpbGVHYWxsZXJ5U3R5bGU6Jyd9O3ZhciBzbGlkZXJfb3B0c09iaj17YW5pbV9zcGVlZDonJyx2aWRlb1BsYXllckljb25Db2xvcjonJyxjeWNsZTonJyxjb250cm9sczonYXJyb3dzdGh1bWJzJyxiZ2NvbG9yOicjZWJlYmViJ307dmFyIHNsaWRlcl9kb3RzT3B0c09iaj17c2l6ZTonJyxiZ2NvbG9yOicnLGJvcmRlcnNpemU6JycsYmdjb2xvcmFjdGl2ZTonJ307dmFyIHNsaWRlcl9zbGlkZXNPcHRzT2JqPXt6b29tYWJsZTp0cnVlLGJnc2l6ZTonY292ZXInLHJhdGlvOicxJ307dmFyIHR5cG9ncmFwaHlfb3B0c09iaj17ZGVzY3JDb2xvcjonJyx0aXRsZUNvbG9yOicnLG9wdGlvbnNDb2xvcjonJ307dmFyIGRlZmF1bHRfc29ydD17ZGVmYXVsdDpudWxsLGluX3N0b2NrOmZhbHNlfTt2YXIgb3B0aW9ucz17cmVjaWQ6Jzc4OTA3NjAzOCcsc3RvcmVwYXJ0OicxODgxOTY3NzExOTInLHByZXZpZXdtb2RlOid5ZXMnLHByb2RDYXJkOnByb2RjYXJkX29wdHNPYmoscG9wdXBfb3B0czpwb3B1cF9vcHRzT2JqLGRlZmF1bHRTb3J0OmRlZmF1bHRfc29ydCxnYWxsZXJ5U3R5bGU6Jycsc2xpZGVyX29wdHM6c2xpZGVyX29wdHNPYmosc2xpZGVyX2RvdHNPcHRzOnNsaWRlcl9kb3RzT3B0c09iaixzbGlkZXJfc2xpZGVzT3B0czpzbGlkZXJfc2xpZGVzT3B0c09iaix0eXBvOnR5cG9ncmFwaHlfb3B0c09iaixwcmljZTpwcmljZV9vcHRzT2JqLGJsb2Nrc0luUm93Oic0Jyxjb2xDbGFzczondC1zdG9yZV9fc3RyZXRjaC1jb2wgdC1zdG9yZV9fc3RyZXRjaC1jb2xfMjUnLHNpZGViYXI6ZmFsc2UsY29sV2lkdGg6JycsY29sQ2xhc3NGdWxsV2lkdGg6J3Qtc3RvcmVfX3N0cmV0Y2gtY29sIHQtc3RvcmVfX3N0cmV0Y2gtY29sXzEwMCcsaW1hZ2VIb3ZlcjpmYWxzZSxpbWFnZUhlaWdodDonJyxpbWFnZVdpZHRoOicnLGltYWdlUmF0aW86JzEnLGltYWdlUmF0aW9DbGFzczondC1zdG9yZV9fY2FyZF9faW1nd3JhcHBlcl8zLTQnLGFsaWduOidsZWZ0Jyx2aW5kZW50OiczMHB4Jyxpc0hvcml6T25Nb2I6dHJ1ZSxpdGVtc0FuaW06JycsaGFzT3JpZ2luYWxBc3BlY3RSYXRpbzpmYWxzZSxzaXplOjQsbWFya0NvbG9yOicjZmZmZmZmJyxtYXJrQmdDb2xvcjonI2ZmNGE0YScsY3VycmVuY3lTaWRlOidyJyxjdXJyZW5jeVR4dDon4oK9JyxjdXJyZW5jeVNlcGFyYXRvcjonLicsY3VycmVuY3lEZWNpbWFsOicnLGJ0blNpemU6J3NtJyxidXR0b25SYWRpdXM6JzhweCcsYnV0dG9uQmdDb2xvcjonJyxpc0ZsZXhDb2xzOid0cnVlJyxoaWRlU3RvcmVQYXJ0czpmYWxzZSx2ZXJ0aWNhbEFsaWduQnV0dG9uczpmYWxzZSxoaWRlRmlsdGVyczp0cnVlLHRpdGxlUmVsZXZhbnRzOicnLHNob3dSZWxldmFudHM6Jycsc2hvd1BhZ2luYXRpb246JycsdGFiczonJyxyZWxldmFudHNfc2xpZGVyOmZhbHNlLHJlbGV2YW50c19xdWFudGl0eTonNCcsc2xpZGVydGh1bWJzc2lkZTonJyxzaG93U3RvcmVCdG5RdWFudGl0eTonJyx2ZXJ0aWNhbEFsaWduOicnLHJpZ2h0Q29sdW1uV2lkdGg6JycsaXNUaXRsZUNsaXA6ZmFsc2UsaG9yaXpvbnRhbFNjcm9sbEhpbnQ6J2NpcmNsZSd9O3Rfb25GdW5jTG9hZCgndF9zdG9yZV9pbml0JyxmdW5jdGlvbigpIHt0X3N0b3JlX2luaXQoJzc4OTA3NjAzOCcsb3B0aW9ucyk7fSk7fSk7CnRfb25SZWFkeShmdW5jdGlvbigpIHt0X29uRnVuY0xvYWQoJ3QzOTZfaW5pdCcsZnVuY3Rpb24oKSB7dDM5Nl9pbml0KCc3ODg1OTMwNTUnKTt9KTt9KTsKdF9vblJlYWR5KGZ1bmN0aW9uKCl7dmFyIHByb2RjYXJkX29wdHNPYmo9e2Jsb2NrSWQ6JycsaGFzV3JhcDonJyx0eHRQYWQ6JycsYmdDb2xvcjonJyxib3JkZXJSYWRpdXM6Jycsc2hhZG93OicnLHNoYWRvd1NpemU6Jycsc2hhZG93T3BhY2l0eTonJyxzaGFkb3dIb3ZlcjonJyxzaGFkb3dTaXplSG92ZXI6Jycsc2hhZG93T3BhY2l0eUhvdmVyOicnLHNoYWRvd1NoaWZ0eUhvdmVyOicnLGJ0blRpdGxlMTonJyxidG5MaW5rMToncG9wdXAnLGJ0blRpdGxlMjonJyxidG5MaW5rMjoncG9wdXAnLHNob3dPcHRzOmZhbHNlLHN0eWxlOicnLGhhc0ltZzp0cnVlLGhhc0Rlc2NyOnRydWUsaGFzU2VwYXJhdG9yOnRydWV9O3ZhciBwcmljZV9vcHRzT2JqPXtjb2xvcjonIzAwMDAwMCcsY29sb3JPbGQ6JyNhM2EzYTMnLHBvc2l0aW9uOididCcscHJpY2VSYW5nZTonJ307dmFyIHBvcHVwX29wdHNPYmo9e3BvcHVwQ29udGFpbmVyOicnLGNvbHVtbnM6JzYnLGNvbHVtbnMyOic2Jyxpc1ZlcnRpY2FsOicnLGFsaWduOidsZWZ0JyxidG5UaXRsZTonQlVZIE5PVycsY2xvc2VUZXh0OidNb3JlIHByb2R1Y3RzJyxpY29uQ29sb3I6JyMwMDAwMDAnLGNvbnRhaW5lckJnQ29sb3I6JyNmZmZmZmYnLG92ZXJsYXlCZ0NvbG9yOicjZmZmZmZmJyxvdmVybGF5QmdDb2xvclJnYmE6J3JnYmEoMjU1LDI1NSwyNTUsMSknLHBvcHVwU3RhdDonJyx0YWJzUG9zaXRpb246JycsZml4ZWRCdXR0b246ZmFsc2UsbW9iaWxlR2FsbGVyeVN0eWxlOicnfTt2YXIgc2xpZGVyX29wdHNPYmo9e2FuaW1fc3BlZWQ6JycsdmlkZW9QbGF5ZXJJY29uQ29sb3I6JycsY3ljbGU6JycsY29udHJvbHM6J2Fycm93c3RodW1icycsYmdjb2xvcjonI2ViZWJlYid9O3ZhciBzbGlkZXJfZG90c09wdHNPYmo9e3NpemU6JycsYmdjb2xvcjonJyxib3JkZXJzaXplOicnLGJnY29sb3JhY3RpdmU6Jyd9O3ZhciBzbGlkZXJfc2xpZGVzT3B0c09iaj17em9vbWFibGU6dHJ1ZSxiZ3NpemU6J2NvdmVyJyxyYXRpbzonMSd9O3ZhciB0eXBvZ3JhcGh5X29wdHNPYmo9e2Rlc2NyQ29sb3I6JycsdGl0bGVDb2xvcjonJyxvcHRpb25zQ29sb3I6Jyd9O3ZhciBkZWZhdWx0X3NvcnQ9e2RlZmF1bHQ6bnVsbCxpbl9zdG9jazpmYWxzZX07dmFyIG9wdGlvbnM9e3JlY2lkOic3ODc5NjgxMzcnLHN0b3JlcGFydDonMTQxOTQwNDEzODEyJyxwcmV2aWV3bW9kZToneWVzJyxwcm9kQ2FyZDpwcm9kY2FyZF9vcHRzT2JqLHBvcHVwX29wdHM6cG9wdXBfb3B0c09iaixkZWZhdWx0U29ydDpkZWZhdWx0X3NvcnQsZ2FsbGVyeVN0eWxlOicnLHNsaWRlcl9vcHRzOnNsaWRlcl9vcHRzT2JqLHNsaWRlcl9kb3RzT3B0czpzbGlkZXJfZG90c09wdHNPYmosc2xpZGVyX3NsaWRlc09wdHM6c2xpZGVyX3NsaWRlc09wdHNPYmosdHlwbzp0eXBvZ3JhcGh5X29wdHNPYmoscHJpY2U6cHJpY2Vfb3B0c09iaixibG9ja3NJblJvdzonNCcsY29sQ2xhc3M6J3Qtc3RvcmVfX3N0cmV0Y2gtY29sIHQtc3RvcmVfX3N0cmV0Y2gtY29sXzI1JyxzaWRlYmFyOmZhbHNlLGNvbFdpZHRoOicnLGNvbENsYXNzRnVsbFdpZHRoOid0LXN0b3JlX19zdHJldGNoLWNvbCB0LXN0b3JlX19zdHJldGNoLWNvbF8xMDAnLGltYWdlSG92ZXI6ZmFsc2UsaW1hZ2VIZWlnaHQ6JycsaW1hZ2VXaWR0aDonJyxpbWFnZVJhdGlvOicxJyxpbWFnZVJhdGlvQ2xhc3M6J3Qtc3RvcmVfX2NhcmRfX2ltZ3dyYXBwZXJfMy00JyxhbGlnbjonbGVmdCcsdmluZGVudDonMzBweCcsaXNIb3Jpek9uTW9iOnRydWUsaXRlbXNBbmltOicnLGhhc09yaWdpbmFsQXNwZWN0UmF0aW86ZmFsc2Usc2l6ZTo0LG1hcmtDb2xvcjonI2ZmZmZmZicsbWFya0JnQ29sb3I6JyNmZjRhNGEnLGN1cnJlbmN5U2lkZToncicsY3VycmVuY3lUeHQ6J+KCvScsY3VycmVuY3lTZXBhcmF0b3I6Jy4nLGN1cnJlbmN5RGVjaW1hbDonJyxidG5TaXplOidzbScsYnV0dG9uUmFkaXVzOic4cHgnLGJ1dHRvbkJnQ29sb3I6JycsaXNGbGV4Q29sczondHJ1ZScsaGlkZVN0b3JlUGFydHM6ZmFsc2UsdmVydGljYWxBbGlnbkJ1dHRvbnM6ZmFsc2UsaGlkZUZpbHRlcnM6dHJ1ZSx0aXRsZVJlbGV2YW50czonJyxzaG93UmVsZXZhbnRzOicnLHNob3dQYWdpbmF0aW9uOicnLHRhYnM6JycscmVsZXZhbnRzX3NsaWRlcjpmYWxzZSxyZWxldmFudHNfcXVhbnRpdHk6JzQnLHNsaWRlcnRodW1ic3NpZGU6Jycsc2hvd1N0b3JlQnRuUXVhbnRpdHk6JycsdmVydGljYWxBbGlnbjonJyxyaWdodENvbHVtbldpZHRoOicnLGlzVGl0bGVDbGlwOmZhbHNlLGhvcml6b250YWxTY3JvbGxIaW50Oidub25lJ307dF9vbkZ1bmNMb2FkKCd0X3N0b3JlX2luaXQnLGZ1bmN0aW9uKCkge3Rfc3RvcmVfaW5pdCgnNzg3OTY4MTM3JyxvcHRpb25zKTt9KTt9KTsKdF9vblJlYWR5KGZ1bmN0aW9uKCkge3Rfb25GdW5jTG9hZCgndDM5Nl9pbml0JyxmdW5jdGlvbigpIHt0Mzk2X2luaXQoJzc4ODk3MzYwNScpO30pO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0OTU4X2luaXQnLGZ1bmN0aW9uKCkge3Q5NThfaW5pdCgnNzg4OTczMjc5Jyk7fSk7fSk7CnRfb25SZWFkeShmdW5jdGlvbigpIHt0X29uRnVuY0xvYWQoJ3QzOTZfaW5pdCcsZnVuY3Rpb24oKSB7dDM5Nl9pbml0KCc3ODg5OTcwOTAnKTt9KTt9KTsKdF9vblJlYWR5KGZ1bmN0aW9uKCkge3Rfb25GdW5jTG9hZCgndDM5Nl9pbml0JyxmdW5jdGlvbigpIHt0Mzk2X2luaXQoJzc4ODk4NjgyMCcpO30pO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0ODQ5X2luaXQnLGZ1bmN0aW9uKCkge3Q4NDlfaW5pdCgnNzg4OTc1MTc5Jyk7fSk7fSk7CnRfb25SZWFkeShmdW5jdGlvbigpIHt0X29uRnVuY0xvYWQoJ3QzOTdfaW5pdCcsZnVuY3Rpb24oKSB7dDM5N19pbml0KCc3ODkxMTExNDYnKTt9KTt9KTsKdF9vblJlYWR5KGZ1bmN0aW9uKCkge3Rfb25GdW5jTG9hZCgndDM5Nl9pbml0JyxmdW5jdGlvbigpIHt0Mzk2X2luaXQoJzc4OTEyMzUzMScpO30pO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnNzg5MTE0MzAwJyk7fSk7fSk7CnRfb25SZWFkeShmdW5jdGlvbigpIHt0X29uRnVuY0xvYWQoJ3QzOTZfaW5pdCcsZnVuY3Rpb24oKSB7dDM5Nl9pbml0KCc5Nzk0MDk0NDEnKTt9KTt9KTsKdF9vblJlYWR5KGZ1bmN0aW9uKCkge3Rfb25GdW5jTG9hZCgndDM5Nl9pbml0JyxmdW5jdGlvbigpIHt0Mzk2X2luaXQoJzc4OTEwOTk3NScpO30pO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0NzAyX2luaXRQb3B1cCcsZnVuY3Rpb24oKSB7dDcwMl9pbml0UG9wdXAoJzc4OTI0NjE4NScpO30pO30pOw== | |
| js | /_next/static/widgets/footer.js | |
| js | /_next/static/widgets/subscribe.js?31381d5b6ea6 | |
| js | /assets/new/build/main-page.js?31381d5b6ea6 |
Серверные заголовки
Кол-во: 9
HTTP-заголовки ответа сервера
?
Заголовки сервера передают браузеру и поисковику служебную информацию: кеширование, безопасность (CSP, HSTS), сжатие (gzip). Правильная настройка ускоряет загрузку и повышает защищённость.
Найдены серверные заголовки 9шт. Подробнее про серверные заголовки.
Показать полный список серверных заголовков
| Ключ | Значение |
|---|---|
| Server | ddos-guard |
| Set-Cookie | __ddg8_=FjSqC6hQVa13WfKA; Domain=.mann-ivanov-ferber.ru; Path=/; Expires=Thu, 20-Aug-2026 15:15:54 GMT |
| Content-Security-Policy | upgrade-insecure-requests; |
| Date | Thu, 20 Aug 2026 14:55:54 GMT |
| X-Powered-By | PHP/7.4.30 |
| Cache-Control | must-revalidate, max-age=0, private |
| x-test | GET |
| x-uuid | D9FoFhVcnVhtY8kb6VtQqg6OhJfxEOe1H |
| X-Frame-Options | SAMEORIGIN |
CMS
Система управления сайтом (движок)
?
CMS — это движок, на котором работает сайт (WordPress, 1C-Bitrix, Tilda и др.). Знание CMS помогает понять возможности SEO-оптимизации и подобрать подходящие инструменты. «Не определена» — вероятно, самописный сайт или нестандартная сборка.
Сайт работает на CMS Tilda.
Веб-сервер
Программное обеспечение сервера
?
Веб-сервер — это ПО, которое отдаёт страницы посетителям (nginx, Apache, IIS, LiteSpeed и др.). Определяется по серверным заголовкам ответа (Server, X-Powered-By и т.п.). «Не определён» — сервер намеренно скрывает эти заголовки, это нормальная практика безопасности.
Сайт работает на веб-сервере DDoS-Guard.
Мета-теги Готовность: 50%
Title
Курсы МИФа
Заголовок страницы в браузере и поисковой выдаче
?
Title — главный SEO-заголовок страницы. Влияет на CTR в поиске и ранжирование. Оптимальная длина: 50–70 символов. Ключевые слова — ближе к началу.
Необходимо увеличить число символов в title (текущее значение мало: 11, минимум: 25, оптимально: от 40 до 45)
Дублей словоформ в title не найдено.
Description
Мы в МИФе любим учиться. Особенно по книгам, которые сами издаем. В какой-то момент мы поняли, что нам самим есть чему научить. Для этого мы запустили курсы
Описание страницы в поисковой выдаче (сниппет)
?
Meta Description — текст под заголовком в выдаче. Напрямую на позиции не влияет, но влияет на CTR. Оптимальная длина: 120–160 символов.
Необходимо уменьшить число символов в description (текущее значение: 156, оптимально: от 120 до 130)
Keywords
Курсы МИФа, курсы по саморазвитию, soft skills
Список ключевых слов страницы (устаревший тег)
?
Meta Keywords не учитывается Яндексом и Google для ранжирования с 2009–2012 годов. Заполнение не обязательно, но не вредит. Конкурент может использовать содержимое для анализа.
Keywords установлены.
Канонический Url
Указывает поисковику основную версию страницы
?
Canonical (rel=canonical) предотвращает проблему дублей страниц. Должен точно совпадать с URL проверяемой страницы. Неправильный canonical может передать ссылочный вес на другую страницу.
Рекомендуем прописать канонический Url.
Robots
Ошибок нет
Директивы для поисковых роботов на уровне страницы
?
Meta Robots управляет индексацией конкретной страницы: index/noindex — индексировать ли, follow/nofollow — следовать ли по ссылкам. Noindex полностью исключает страницу из поиска.
Meta-тег robots не указан. Страница свободна для индексации.
Адаптивность
width=device-width, initial-scale=1.0
Настройка масштабирования на мобильных устройствах
?
Тег viewport (<meta name="viewport">) сообщает браузеру, как масштабировать страницу на мобильных. Стандарт: width=device-width, initial-scale=1. Отсутствие — признак отсутствия мобильной версии.
Meta-тег viewport со значением-константой width=device-width задаёт ширину страницы в соответствии с размером экрана.
Meta-тег viewport со значением initial-scale=1.0 определяет масштаб 1:1, т.е. «не масштабировать».
Разметка OpenGraph
Кол-во: 6
Мета-теги для красивых превью в соцсетях
?
OpenGraph (og:title, og:description, og:image) управляет тем, как страница выглядит при репосте в социальных сетях и мессенджерах. Отсутствие OG-тегов — невзрачный превью при шеринге.
Разметка OpenGraph задана. Страница оптимизирована под социальные сети.
Показать полный список og мета-тегов
| Тип | Значение |
|---|---|
| og:type | article |
| og:title | Курсы МИФа |
| og:description | Мы в МИФе любим учиться. Особенно по книгам, которые сами издаем. В какой-то момент мы поняли, что нам самим есть чему научить. Для этого мы запустили курсы |
| og:image | https://www.mann-ivanov-ferber.ru/assets/media/courses/courses-1000.jpg |
| og:site_name | Издательство &laquo;МИФ&raquo; |
| og:url | https://www.mann-ivanov-ferber.ru/courses/ |
Все мета-теги
Кол-во: 11
Полный список мета-тегов страницы
?
Таблица всех meta-тегов, включая нестандартные. Позволяет найти опечатки, дубли и лишние теги.
Найдены мета-теги 11шт. Мета-теги не видимы для человека и предназначены для обмена информацией между веб-страницей и поисковыми системами, браузерами и другими веб-службами. С ними роботы 🤖 и устройства ведут себя более ожидаемо.
Показать полный список мета-тегов
| Тип | Название | Значение |
|---|---|---|
| name | viewport | width=device-width, initial-scale=1.0 |
| name | description | Мы в МИФе любим учиться. Особенно по книгам, которые сами издаем. В какой-то момент мы поняли, что нам самим есть чему научить. Для этого мы запустили курсы |
| name | keywords | Курсы МИФа, курсы по саморазвитию, soft skills |
| name | yandex-verification | 439047a0861cf992 |
| property | og:type | article |
| property | og:title | Курсы МИФа |
| property | og:description | Мы в МИФе любим учиться. Особенно по книгам, которые сами издаем. В какой-то момент мы поняли, что нам самим есть чему научить. Для этого мы запустили курсы |
| property | og:image | https://www.mann-ivanov-ferber.ru/assets/media/courses/courses-1000.jpg |
| property | og:site_name | Издательство &laquo;МИФ&raquo; |
| property | og:url | https://www.mann-ivanov-ferber.ru/courses/ |
| property | fb:admins | 1093864394 |
Оптимизация Готовность: 50%
Структура
Ошибок нет
Семантические HTML-элементы страницы
?
Проверяет наличие основных структурных элементов: nav, header, footer, main. Корректная семантическая структура помогает поисковику понять архитектуру страницы.
Структура документа корректна (теги <html> и <body> присутствуют в одном экземпляре).
Контент
Есть ошибки
Объём и качество текстового содержимого
?
Анализирует объём полезного текста на странице. Слишком мало — страница может считаться малополезной. Слишком много — ухудшается читаемость и восприятие.
Слова из title 2 встречаются в тексте редко. Добавьте в контент страницы слова из тега <title>!
Абзацев с текстом 0 слишком мало. Добавьте больше абзацев с текстом (тег <p>)!
Среднее число слов в абзаце 0 слишком мало. Сделайте контент более читаемым!
Кол-во знаков контента 4826 на странице оптимально.
Кол-во слов 991 на странице оптимально.
Заголовки
Ошибок нет
Иерархия заголовков H1–H6
?
H1 должен быть один и содержать ключевой запрос. H2–H6 описывают подразделы. Пропуск уровней (H1 → H3) и несколько H1 — типичные ошибки, снижающие понятность страницы для поисковика.
На странице присутствуют заголовки <h1> 1. Это прекрасно.
Тошнота
2,65
Насколько одно слово доминирует в тексте
?
Классическая тошнота = √(частота самого повторяющегося слова). Норма до 7–8: текст воспринимается естественно. Выше — поисковик может счесть страницу переспамленной.
Тошнота страницы в пределах нормы 3.
Академич. тошнота
2,02%
Насколько текст перенасыщен ключевыми словами
?
Академическая тошнота = (частота слова / общее количество слов) × 100%. Показывает долю конкретного слова в тексте. Норма 5–15%.
Академическая тошнота не дотягивает до нормы 5-15%. Измените текст страницы!
Семантическое ядро
20
Наиболее часто встречающиеся слова на странице
?
Топ слов по частоте использования. Показывает, какие слова доминируют в тексте с точки зрения поисковика.
Контент страницы содержит осмысленный текст и слова.
Показать список слов
| Слово | Кол-во | Частота |
|---|---|---|
| комиксы | 7 | 0,71% |
| психология | 7 | 0,71% |
| литература | 5 | 0,50% |
| развитие | 5 | 0,50% |
| творчество | 5 | 0,50% |
| бизнес | 5 | 0,50% |
| подарки | 5 | 0,50% |
| mifcourses@m-i-f | 4 | 0,40% |
| обучение | 3 | 0,30% |
| подарочные | 3 | 0,30% |
| аудиокниги | 3 | 0,30% |
| истории | 3 | 0,30% |
| культура | 3 | 0,30% |
| искусство | 3 | 0,30% |
| саморазвитие | 3 | 0,30% |
| мышление | 3 | 0,30% |
| маркетинг | 3 | 0,30% |
| бизнеса | 3 | 0,30% |
| компаний | 3 | 0,30% |
| современная | 2 | 0,20% |
Индексация Готовность: 40%
Индексирование
Есть ошибки
Разрешено ли индексирование страницы
?
Проверяет, не закрыта ли страница от индексации через robots.txt, meta robots или X-Robots-Tag. Страница, закрытая от индексации, не появится в поисковой выдаче.
Анкоров на странице 275 слишком много. Проведите ревизию и оптимизацию ссылок сайта.
Robots.txt
Найден корректный robots.txt
Файл управления сканированием сайта роботами
?
Robots.txt указывает поисковым роботам, какие страницы сканировать, а какие — нет. Ошибки в файле могут случайно закрыть важные разделы от индексации.
Robots.txt настроен корректно. Размер файла: 1627 байт. Загружен за: 37мсек.
Проверяемая страница не запрещена в robots.txt.
Robots.txt доступен по постоянному адресу
Показать содержимое robots.txt
User-agent: *
Disallow: *?
Disallow: /login/
Disallow: /cart/
Disallow: /assets/components/
Disallow: /assets/snippets/
Disallow: /assets/templates/site/elements/
Disallow: /b2b/index.php
Disallow: /b2b/library/index.php
Disallow: /b2b/liga/newsletter/$
Disallow: /b2b/liga/office-library/$
Disallow: /b2b/liga/office-library/case/$
Disallow: /b2b/presents/index.php
Disallow: /b2b/sponsorship/index.php
Disallow: /black-friday-week/
Disallow: /book/export/yml/yandex/catalog.xml
Disallow: /cgi-bin/
Disallow: /children-books-new/
Disallow: /connectors/
Disallow: /core/
Disallow: /index.php
Disallow: /kvest1/
Disallow: /kvest2/
Disallow: /kvest3/
Disallow: /kvest4/
Disallow: /kvest5/
Disallow: /kvest6/
Disallow: /kvest7/
Disallow: /kvest8/
Disallow: /kvest9/
Disallow: /kvest10/
Disallow: /kvest11/
Disallow: /kvest12/
Disallow: /kvest13/
Disallow: /kvest14/
Disallow: /kvest-dyra/
Disallow: /kvest-dyra1/
Disallow: /kvest-dyra2/
Disallow: /kvest-dyra3/
Disallow: /kvest-dyra4/
Disallow: /kvest-dyra5/
Disallow: /kvest-dyra6/
Disallow: /kvest-dyra7/
Disallow: /kvest-dyra8/
Disallow: /kvest-spat/
Disallow: /kvest-spat1/
Disallow: /kvest-spat2/
Disallow: /kvest-spat3/
Disallow: /kvest-spat4/
Disallow: /kvest-spat5/
Disallow: /kvest-spat6/
Disallow: /kvest-spat7/
Disallow: /kvest-spat8/
Disallow: /main/
Disallow: /manager/
Disallow: /socialstat/
Disallow: /socialstat.html
Disallow: /book/book/download.ajax
Allow: /assets/new/build/
User-agent: AdsBot-Google
Allow: *?
Allow: /books/selection/
User-agent: AdsBot-Google-Mobile
Allow: *?
Allow: /books/selection/
Sitemap: https://www.mann-ivanov-ferber.ru/sitemap.xml
Sitemap
Кол-во: 1
XML-карта сайта для поисковиков
?
Sitemap.xml помогает поисковику быстрее находить и индексировать страницы. Особенно важен для крупных сайтов и новых страниц, на которые ещё нет входящих ссылок.
Robots.txt содержит карту сайта. Это прекрасно!
Robots.txt не содержит ошибок в карте сайта.
Показать карту сайта
| Url | Статус |
|---|---|
| https://www.mann-ivanov-ferber.ru/sitemap.xml |
|
Внутренние ссылки
Не найдено
Ссылки на другие страницы своего сайта
?
Внутренние ссылки распределяют ссылочный вес между страницами и помогают поисковику обходить сайт. Пустые анкоры и ссылки на запрещённые robots.txt страницы — типичные ошибки.
Внутренних ссылок на странице 0 оптимально.
Внешние ссылки
Кол-во: 254
Ссылки на сторонние сайты
?
Исходящие внешние ссылки передают часть ссылочного веса на чужие сайты. Ссылки на авторитетные ресурсы безопасны; ссылки на мусорные сайты могут навредить репутации страницы.
Внешних ссылок на странице 254 слишком много. Спрячьте лишние ссылки в тег noindex или атрибут rel='nofollow'!
На странице ссылки с атрибутом rel='nofollow' 1.
Показать первые 100 внешних ссылок
| Url | Анкор |
|---|---|
| mann-ivanov-ferber.ru |
Книги
|
| mann-ivanov-ferber.ru |
Проза
|
| mann-ivanov-ferber.ru |
Остросюжетная проза
|
| mann-ivanov-ferber.ru |
Молодёжная литература
|
| mann-ivanov-ferber.ru |
Современная зарубежная литература
|
| mann-ivanov-ferber.ru |
Классическая литература
|
| mann-ivanov-ferber.ru |
Интеллектуальная проза
|
| mann-ivanov-ferber.ru |
Романы взросления
|
| mann-ivanov-ferber.ru |
Детство
|
| mann-ivanov-ferber.ru |
Художественная литература для детей
|
| mann-ivanov-ferber.ru |
Научно-познавательные книги для детей
|
| mann-ivanov-ferber.ru |
KUMON
|
| mann-ivanov-ferber.ru |
Чевостик
|
| mann-ivanov-ferber.ru |
Развитие и обучение детей
|
| mann-ivanov-ferber.ru |
Досуг и творчество детей
|
| mann-ivanov-ferber.ru |
Книги для подростков
|
| mann-ivanov-ferber.ru |
Для родителей
|
| mann-ivanov-ferber.ru |
Комиксы для детей
|
| mann-ivanov-ferber.ru |
Детское творчество
|
| mann-ivanov-ferber.ru |
Умные книжки
|
| mann-ivanov-ferber.ru |
Подготовка к школе
|
| mann-ivanov-ferber.ru |
Необычный формат
|
| mann-ivanov-ferber.ru |
Подарочные
|
| mann-ivanov-ferber.ru |
Психология
|
| mann-ivanov-ferber.ru |
Популярная психология
|
| mann-ivanov-ferber.ru |
Стресс и эмоции
|
| mann-ivanov-ferber.ru |
Любовь и отношения
|
| mann-ivanov-ferber.ru |
Осознанность и медитация
|
| mann-ivanov-ferber.ru |
Книги для родителей
|
| mann-ivanov-ferber.ru |
Быть подростком
|
| mann-ivanov-ferber.ru |
Защита от токсичности
|
| mann-ivanov-ferber.ru |
Бизнес
|
| mann-ivanov-ferber.ru |
Аудиокниги
|
| mann-ivanov-ferber.ru |
Менеджмент
|
| mann-ivanov-ferber.ru |
Продажи
|
| mann-ivanov-ferber.ru |
Истории успеха
|
| mann-ivanov-ferber.ru |
Развитие сотрудников
|
| mann-ivanov-ferber.ru |
Предпринимателю
|
| mann-ivanov-ferber.ru |
Управление компанией
|
| mann-ivanov-ferber.ru |
Стратегия
|
| mann-ivanov-ferber.ru |
Управление проектами
|
| mann-ivanov-ferber.ru |
Переговоры
|
| mann-ivanov-ferber.ru |
Публичные выступления
|
| mann-ivanov-ferber.ru |
Подбор персонала
|
| mann-ivanov-ferber.ru |
Российский бизнес
|
| mann-ivanov-ferber.ru |
ИТ
|
| mann-ivanov-ferber.ru |
Культура
|
| mann-ivanov-ferber.ru |
Биографии
|
| mann-ivanov-ferber.ru |
Серия «Таро МИФ»
|
| mann-ivanov-ferber.ru |
Серия «Мифы от и до»
|
| mann-ivanov-ferber.ru |
Подарочные книги
|
| mann-ivanov-ferber.ru |
Культурные истории, страноведение
|
| mann-ivanov-ferber.ru |
Искусство и архитектура
|
| mann-ivanov-ferber.ru |
Театр и кино, музыка, литература
|
| mann-ivanov-ferber.ru |
Серия «Главное в истории»
|
| mann-ivanov-ferber.ru |
Саморазвитие
|
| mann-ivanov-ferber.ru |
Спокойствие и душевное равновесие
|
| mann-ivanov-ferber.ru |
Аудиокниги
|
| mann-ivanov-ferber.ru |
Мечты и цели
|
| mann-ivanov-ferber.ru |
Мотивация
|
| mann-ivanov-ferber.ru |
Мозг и интеллект
|
| mann-ivanov-ferber.ru |
Продуктивность
|
| mann-ivanov-ferber.ru |
Психология
|
| mann-ivanov-ferber.ru |
Общение
|
| mann-ivanov-ferber.ru |
Сила воли
|
| mann-ivanov-ferber.ru |
Тайм-менеджмент
|
| mann-ivanov-ferber.ru |
Деньги
|
| mann-ivanov-ferber.ru |
Обучение
|
| mann-ivanov-ferber.ru |
Выбор профессии
|
| mann-ivanov-ferber.ru |
Принятие решений
|
| mann-ivanov-ferber.ru |
Осознанность
|
| mann-ivanov-ferber.ru |
Стиль жизни
|
| mann-ivanov-ferber.ru |
Современная магия
|
| mann-ivanov-ferber.ru |
Дом и сад
|
| mann-ivanov-ferber.ru |
Кулинария
|
| mann-ivanov-ferber.ru |
Творчество
|
| mann-ivanov-ferber.ru |
Вдохновение и мотивация
|
| mann-ivanov-ferber.ru |
Творчество «своими руками»
|
| mann-ivanov-ferber.ru |
Рисование для начинающих
|
| mann-ivanov-ferber.ru |
Рисование для продолжающих
|
| mann-ivanov-ferber.ru |
Шрифты и каллиграфия
|
| mann-ivanov-ferber.ru |
Писательство
|
| mann-ivanov-ferber.ru |
Фотомастерская
|
| mann-ivanov-ferber.ru |
Раскраски для взрослых и альбомы
|
| mann-ivanov-ferber.ru |
Легендарная серия Барбары Шер
|
| mann-ivanov-ferber.ru |
Психология творчества
|
| mann-ivanov-ferber.ru |
Дизайн
|
| mann-ivanov-ferber.ru |
Развитие творчества
|
| mann-ivanov-ferber.ru |
Творческий бизнес
|
| mann-ivanov-ferber.ru |
Визуальное мышление
|
| mann-ivanov-ferber.ru |
Творческое мышление
|
| mann-ivanov-ferber.ru |
МАК МИФ
|
| mann-ivanov-ferber.ru |
Комиксы
|
| mann-ivanov-ferber.ru |
Детские комиксы
|
| mann-ivanov-ferber.ru |
Взрослые комиксы
|
| mann-ivanov-ferber.ru |
Молодежные комиксы
|
| mann-ivanov-ferber.ru |
Серии
|
| mann-ivanov-ferber.ru |
Познавательные комиксы
|
| mann-ivanov-ferber.ru |
Здоровье и медицина
|
| mann-ivanov-ferber.ru |
Правильное питание
|
Конкуренты Готовность: 6%
Конкуренты в Яндексе
Кол-во: 0
Топ сайтов-конкурентов в Яндексе
?
Сайты, чаще всего появляющиеся в ТОПе Яндекса по запросам из семантического ядра этой страницы.
Мы не нашли у вас конкурентов в Яндексе. Сайт или очень молодой или плохо продвигается.
Конкурентов в ТОП-10 Яндекса не нашлось.
Показать конкурентов в Яндексе
| Url | % в ТОПе |
|---|---|
| www.mann-ivanov-ferber.ru | 11,11% |
Конкуренты в Google
Найдены конкуренты: 39
Топ сайтов-конкурентов в Google
?
Сайты, чаще всего появляющиеся в ТОПе Google по запросам из семантического ядра этой страницы.
Конкурентов в ТОП-10 Google не нашлось.
У вас есть конкуренты, которые догоняют вас в ТОП-10 Google. Ваш % от ТОП'а составляет 11.
Показать конкурентов в Google
| Url | % в ТОПе |
|---|---|
| www.mann-ivanov-ferber.ru | 11,11% |
| www.ozon.ru | 11,11% |
| ru.wikipedia.org | 7,41% |
| www.nur.kz | 3,70% |
ФЗ-152: ПД Готовность: 40%
РКН
ОК
Сайт не заблокирован
Контакты
https://www.mann-ivanov-ferber.ru/about/contact/
Страница с контактами найдена
Политика ПД
https://www.mann-ivanov-ferber.ru/policy/
Страница политики обработки ПД найдена
Согласие
https://www.mann-ivanov-ferber.ru/personal/
Страница согласия на обработку ПД найдена
Чекбокс согласия
Не найден
Чекбокс согласия на обработку ПД в формах сайта не найден
Куки-баннер
Найден
Баннер согласия с использованием cookie найден
Счётчики до согласия
ОК
Счётчики аналитики не собирают данные до согласия пользователя
ЗоЗПП: права потребителей Готовность: 100%
Нарушения
Не выявлены
Признаков дистанционной продажи товаров (интернет-магазина) не обнаружено — требования ЗоЗПП о раскрытии информации продавца к сайту не применяются. Нарушений нет.
ФЗ-149: рекомендательные технологии Готовность: 100%
Нарушения
Не выявлены
Рекомендательные блоки («с этим покупают», «похожие товары» и т.п.) на сайте не обнаружены — требования ст. 10.7 ФЗ-149 к сайту не применяются. Нарушений нет.
ФЗ-38: реклама Готовность: 100%
Нарушения
Не выявлены
Рекламных тематик с обязательными оговорками (медицина, БАД, кредиты и займы, новостройки) на сайте не обнаружено. Нарушений нет.
ФЗ-436: защита детей Готовность: 0%
Возрастная маркировка
Нарушение
Знак возрастной категории (0+, 6+, 12+, 16+ или 18+)
?
Ст. 11–12 ФЗ-436: информационная продукция (новости, видео, книги, игры, курсы) должна сопровождаться знаком возрастной категории. Разместите знак на видном месте — обычно в шапке или подвале сайта.
Информационная продукция без возрастной маркировки (ст. 11 ФЗ-436)
Вердикт
Страница https://www.mann-ivanov-ferber.ru/courses/ готова к продвижению на 60%. Чтобы еще улучшить страницу и попасть на первые места поисковой выдачи необходимо:
Исправьте ошибки в мета-тегах.
Исправьте ошибки оптимизации.
Исправьте ошибки индексации.
Поделитесь с друзьями: