Калькулятор нагрузки на сайт
Рассчитайте, какую нагрузку создают посетители на ваш сайт: объём трафика, пиковые значения и требуемую пропускную способность сервера.
—
Общий месячный трафик
ГБ / месяц
—
Средняя дневная нагрузка
посетителей / день
—
Пиковая часовая нагрузка
посетителей / час
—
Пиковая пропускная способность
Мбит/с
—
Рекомендуемая пропускная способность (с запасом 20%)
Мбит/с
Как пользоваться калькулятором
1
Введите количество посетителей в месяц. Например, 50 000 — это средний показатель для небольшого интернет-магазина.
2
Укажите среднее число страниц на посетителя. Обычно это 2–5. Для блога — около 2, для каталога товаров — 4–6.
3
Введите средний размер страницы в килобайтах. Современный сайт весит 2000–4000 КБ. Проверьте в инструментах разработчика (вкладка Network).
4
Установите коэффициент пиковой нагрузки. По умолчанию 2 — это значит, что в часы пик нагрузка вдвое выше средней. Для новостных сайтов ставьте 3–4.
5
Нажмите «Рассчитать» и получите пять ключевых показателей нагрузки на сайт.
Примеры расчёта
Небольшой блог (30 000 посетителей/мес)
30 000 посетителей × 2.2 страницы × 1800 КБ = 118.8 ГБ в месяц.
Средняя дневная нагрузка: 1 000 посетителей. Пиковая часовая: ~83 посетителя. Требуемая полоса: ~0.66 Мбит/с.
Интернет-магазин (200 000 посетителей/мес)
200 000 × 4.5 × 3200 КБ = 2 880 ГБ (≈2.88 ТБ) в месяц.
Средняя дневная: 6 667 посетителей. Пиковая часовая: ~556 посетителей. Требуемая полоса: ~7.9 Мбит/с.
Крупный новостной портал (2 000 000 посетителей/мес)
2 000 000 × 3.0 × 2800 КБ = 16 800 ГБ (≈16.8 ТБ) в месяц.
Средняя дневная: 66 667 посетителей. Пиковая часовая (коэф. 3): ~8 333 посетителя. Требуемая полоса: ~78 Мбит/с.
Формулы расчёта
Все расчёты выполняются по стандартным формулам теории нагрузки веб-серверов:
Общий трафик (ГБ/мес) = Посетители × Страниц_на_посетителя × Размер_страницы_КБ / (1024 × 1024)
Средняя дневная нагрузка = Посетители / 30 дней
Пиковая часовая нагрузка = (Посетители / 30) × Коэффициент / 24 часа
Пиковая пропускная способность (Мбит/с) = (Пиковая_часовая × Страниц_на_посетителя × Размер_КБ × 8) / 3600 / 1024
Рекомендуемая полоса = Пиковая_пропускная × 1.2 (запас 20%)
Формулы учитывают перевод килобайтов в мегабиты и усреднение по 30-дневному месяцу.
Пошаговое объяснение
Шаг 1: Вычисляем общий объём данных, который сайт передаёт посетителям за месяц. Умножаем число посетителей на среднее количество просмотренных страниц и на средний вес одной страницы. Результат переводим из килобайтов в гигабайты.
Шаг 2: Определяем среднюю дневную аудиторию — делим месячную на 30. Это базовая нагрузка, от которой отталкиваются при выборе тарифа хостинга.
Шаг 3: Рассчитываем пиковую часовую нагрузку. Делим дневную на 24 часа и умножаем на коэффициент пика (обычно 2). Учитываем, что посетители распределены неравномерно: утром и ночью их мало, днём и вечером — максимум.
Шаг 4: Переводим пиковую нагрузку в мегабиты в секунду — это ключевой показатель для выбора канала связи. Формула: посетители в час × страниц на посетителя × размер страницы в КБ × 8 бит / 3600 секунд / 1024.
Шаг 5: Добавляем запас 20% к пиковой пропускной способности. Это предохраняет сайт от кратковременных всплесков трафика и даёт комфортный резерв.
Где применяется
- Выбор хостинга и тарифа: Понимание месячного трафика и пиковой нагрузки помогает подобрать VPS или выделенный сервер с нужной полосой пропускания.
- Планирование инфраструктуры: Системные администраторы используют расчёт для заказа каналов связи у провайдера — от 10 Мбит/с до 1 Гбит/с и выше.
- Оптимизация производительности: Если расчётная полоса слишком высока, это сигнал уменьшить размер страниц (сжать изображения, убрать тяжёлые скрипты).
- Запуск рекламных кампаний: Перед запуском таргетинга или контекстной рекламы оценивают, выдержит ли сервер ожидаемый наплыв посетителей.
- Прогнозирование роста: Бизнес-аналитики закладывают расчётные цифры в модель роста: если аудитория вырастет вдвое, какой канал понадобится?
- Сравнение CDN-провайдеров: Зная объём трафика, можно точно рассчитать стоимость услуг CDN (Cloudflare, CDNVideo и др.) и выбрать оптимальный тариф.
Важные нюансы
- Коэффициент пиковой нагрузки зависит от тематики сайта. Для интернет-магазинов в сезон распродаж он может достигать 5–7. Для корпоративных сайтов обычно 1.5–2.
- Средний размер страницы со временем растёт. В 2015 году средняя страница весила ~800 КБ, в 2025 — уже около 2800–3500 КБ. Перепроверяйте этот показатель раз в полгода.
- Калькулятор считает исходящий трафик (от сервера к пользователю). Входящий трафик (запросы) обычно на порядок меньше и им можно пренебречь для оценки канала.
- Результат не учитывает кэширование браузера и CDN. При грамотной настройке кэша реальная нагрузка может быть на 20–40% ниже расчётной.
- Пиковая пропускная способность — это не средняя загрузка канала. Если ваш канал 100 Мбит/с, а расчёт показал 78 Мбит/с, канал будет загружен на 78% в пике — это нормально.
- Для сайтов с потоковым видео или большими файлами для скачивания методика расчёта иная — используйте специализированные калькуляторы трафика видео.
Частые ошибки
- Путаница с единицами измерения: Не переводите килобайты в мегабайты перед подстановкой в формулу. Калькулятор ожидает именно килобайты (1 КБ = 1024 байта). Если у вас размер в МБ, умножьте на 1024.
- Занижение числа страниц на посетителя: Новички часто ставят 1.5, забывая, что пользователь заходит в каталог, карточку товара, корзину, контакты. Реальное значение — 3–5.
- Игнорирование пикового коэффициента: Расчёт только по средним значениям приводит к тому, что сайт «падает» при пиковых нагрузках. Всегда закладывайте коэффициент 2 или выше.
- Неучёт ботов и краулеров: Поисковые роботы (Googlebot, YandexBot) создают дополнительную нагрузку — до 10–15% от общего трафика. Калькулятор считает только живых посетителей.
- Использование данных из счётчиков вместо серверных логов: Счётчики (Яндекс.Метрика, Google Analytics) могут занижать число посетителей из-за блокировщиков рекламы. Расхождение достигает 20–30%.
- Заказ канала «впритык»: Не берите тариф 10 Мбит/с при расчётной пиковой нагрузке 9.8 Мбит/с. Оставьте хотя бы 30% запаса на случай непредвиденных всплесков.
Ответы на частые вопросы
В: Откуда брать исходные данные для калькулятора?
О: Количество посетителей — из Яндекс.Метрики или Google Analytics (отчёт «Посещаемость»). Среднее число страниц — там же, показатель «Глубина просмотра». Размер страницы — в браузере: F12 → Network → Size, среднее по 5–10 загрузкам.
В: Почему результат в гигабайтах не совпадает с данными хостинга?
О: Хостинг считает весь трафик, включая служебный (SSH, почта, панель управления), плюс трафик ботов. Калькулятор даёт чистую оценку пользовательского трафика. Расхождение 15–25% — норма.
В: Какой коэффициент пика выбрать для интернет-магазина?
О: Для обычных дней — 2, для дней распродаж и акций — 3–4, для Чёрной пятницы — до 7. Проверьте статистику прошлых пиковых дней и установите коэффициент под свой проект.
В: Нужно ли учитывать мобильных посетителей отдельно?
О: Нет, если вы используете адаптивный дизайн. Размер страницы для мобильных и десктопных пользователей обычно одинаков при правильной вёрстке. Если у вас отдельная мобильная версия, посчитайте её отдельно.
В: Что делать, если расчётная полоса больше, чем может предоставить провайдер?
О: Три пути: 1) подключить CDN — это снимет до 70% нагрузки; 2) оптимизировать страницы — сжать изображения, включить gzip/brotli; 3) перейти на выделенный сервер с портом 1 Гбит/с.
В: Подходит ли калькулятор для сайтов на конструкторах (Tilda, Wix)?
О: Да, но учтите, что конструкторы уже включают CDN и оптимизацию. Реальная нагрузка на ваш тарифный план может быть ниже расчётной. Уточните у платформы, как они измеряют трафик.
Источники и справочные данные
Расчёт выполняется по методике, основанной на рекомендациях HTTP Archive (средние размеры веб-страниц), стандартах IETF RFC 2616 (протокол HTTP/1.1) и практических руководствах по нагрузочному тестированию веб-серверов. Коэффициенты пиковой нагрузки взяты из отраслевых исследований Akamai Technologies и Cloudflare по распределению трафика в течение суток. Формула перевода трафика в пропускную способность соответствует методике расчёта каналов связи, принятой в телекоммуникационной отрасли (ITU-T Recommendation E.500).
Подробное руководство: как оценить нагрузку на сайт и не ошибиться с хостингом
Почему важно знать нагрузку на сайт заранее
Представьте: вы запускаете рекламную кампанию, вкладываете бюджет, а сайт падает в первый же час. Причина — сервер не рассчитан на поток посетителей. Такая ситуация встречается у 40% небольших проектов при первом масштабировании.
Расчёт нагрузки на сайт — это не просто техническая формальность. Это основа для выбора хостинга, тарифа на интернет-канал и стратегии масштабирования. Ошибка в расчётах на 30–50% может привести либо к лишним расходам, либо к отказу сайта под нагрузкой.
Наш калькулятор даёт точную оценку по четырём ключевым метрикам: общий месячный трафик, дневная аудитория, пиковая часовая нагрузка и требуемая пропускная способность канала. Эти цифры напрямую соотносятся с тарифами хостинг-провайдеров.
Что такое «нагрузка на сайт» простыми словами
Нагрузка на сайт — это объём данных, который сервер передаёт посетителям за единицу времени. Каждый раз, когда пользователь открывает страницу, сервер отправляет HTML-код, изображения, стили, скрипты и шрифты. Всё это суммируется в килобайты и мегабайты.
За месяц небольшой блог с 30 тысячами посетителей может передать 100–150 ГБ данных. Интернет-магазин с 200 тысячами посетителей — уже 2–3 ТБ. А новостной портал-миллионник генерирует десятки терабайт ежемесячно.
Но объём трафика — не единственный параметр. Важно, как нагрузка распределена во времени. Если все 200 тысяч посетителей приходят равномерно, сервер работает спокойно. Но в реальности пик может быть в 3–5 раз выше среднего.
Ключевые параметры, которые нужно знать
Количество посетителей в месяц. Это базовая цифра, от которой всё отталкивается. Берите данные из систем аналитики за последние 3–6 месяцев. Не используйте данные одного месяца — может быть сезонный всплеск или провал.
Глубина просмотра (страниц на посетителя). Средний пользователь интернет-магазина просматривает 4–6 страниц за визит: главная, категория, 2–3 товара, корзина. Читатель блога — 1.5–2.5 страницы. Этот показатель критичен для расчёта трафика.
Размер страницы. Современная веб-страница весит в среднем 2800 КБ (данные HTTP Archive за 2024 год). Из них около 1000 КБ — изображения, 500 КБ — JavaScript, 300 КБ — CSS, остальное — шрифты и HTML. Проверьте свой сайт: откройте инструменты разработчика (F12), вкладка Network, обновите страницу и посмотрите число в строке «transferred».
Коэффициент пика. Хостинг-провайдеры часто указывают «среднюю нагрузку», но платить нужно за пиковую. Если у вас интернет-магазин игрушек, в декабре нагрузка может вырасти в 5 раз. Коэффициент 2 — это минимум для большинства проектов.
Как выбрать тариф хостинга по результатам расчёта
Итак, калькулятор выдал вам пять цифр. Как их применить? Месячный трафик — смотрите на лимиты тарифа. Если расчёт показал 500 ГБ/мес, а тариф включает 1 ТБ — отлично, запас есть. Если лимит 200 ГБ — сайт либо упрётся в ограничение, либо придётся доплачивать за перерасход.
Пиковая пропускная способность — самый важный показатель. Тарифы VPS обычно предлагают канал 10, 30, 50, 100 Мбит/с. Если ваш расчёт показал 25 Мбит/с, тариф с 30 Мбит/с подходит, но без запаса. Лучше взять 50 Мбит/с — запас в 2 раза даст спокойствие при всплесках.
Рекомендуемая полоса с запасом 20% — та цифра, на которую стоит ориентироваться при заказе выделенного сервера или канала у провайдера. Не берите «впритык»: кратковременные всплески могут длиться 10–30 минут, и сайт должен их выдерживать.
Практические советы по снижению нагрузки
- Сжатие изображений: Переведите все изображения в формат WebP или AVIF. Разница может быть колоссальной: JPEG-файл 200 КБ превращается в 40 КБ WebP без видимой потери качества. При 100 тысячах просмотров в день экономия трафика составит гигабайты.
- Включите gzip или brotli на сервере: Текстовые файлы (HTML, CSS, JS) сжимаются на 60–80%. Это бесплатно и настраивается за 5 минут в панели хостинга или в .htaccess.
- Используйте CDN: Сеть доставки контента (Cloudflare, CDNVideo) берёт на себя до 70% трафика. Пользователь из Владивостока получает картинки с сервера CDN в Хабаровске, а не с вашего сервера в Москве.
- Настройте кэширование браузера: Статические файлы (логотипы, CSS, JS) можно закэшировать на неделю или месяц. Повторные визиты одного пользователя не создают нагрузку.
- Ленивая загрузка изображений (lazy load): Картинки ниже экрана загружаются только когда пользователь до них докрутит. Это снижает пиковую нагрузку при первом заходе на страницу.
Реальные кейсы: как меняется нагрузка при росте проекта
Кейс 1: Блог о путешествиях. Старт — 5 000 посетителей/мес. Страниц — 2, размер — 2200 КБ. Трафик: ~21 ГБ/мес. Подходит самый дешёвый виртуальный хостинг. Через год — 50 000 посетителей. Трафик вырос до 210 ГБ/мес. Пришлось переезжать на VPS с каналом 30 Мбит/с, потому что виртуальный хостинг начал резать скорость при превышении лимита.
Кейс 2: Интернет-магазин электроники. 150 000 посетителей/мес, глубина 5 страниц, размер 3500 КБ (много фото товаров). Трафик — 2.5 ТБ/мес. Пиковая полоса — 14 Мбит/с. Магазин работал на VDS с каналом 20 Мбит/с. В чёрную пятницу трафик утроился — сайт лёг. Решение: переезд на выделенный сервер с портом 100 Мбит/с и подключение CDN. Сейчас запас по полосе — троекратный.
Кейс 3: Корпоративный сайт. 10 000 посетителей/мес, 1.8 страниц, 1800 КБ. Трафик смешной — 31 ГБ/мес. Но важна надёжность: даже 10 минут простоя недопустимы. Решение: хостинг с гарантированным каналом 10 Мбит/с (хотя расчёт показывает менее 1 Мбит/с) и ежедневным бэкапом. Здесь запас нужен не для пиков, а для стабильности.
Что делать, если ваш проект растёт экспоненциально
Рост в 2–3 раза за месяц — это стресс для инфраструктуры. Проверяйте показатели нагрузки еженедельно, а не раз в квартал. Настройте мониторинг: графики трафика в панели хостинга, уведомления о превышении порогов.
Планируйте переход на следующий уровень заранее. Если сейчас 800 ГБ/мес при лимите 1 ТБ, не ждите, пока счётчик перевалит за лимит. Миграция на новый сервер занимает от 2 часов до 2 дней — делайте это на опережение.
Держите в уме «правило 80/20»: 80% нагрузки создают 20% самых тяжёлых страниц. Найдите эти страницы в отчётах хостинга и оптимизируйте их в первую очередь. Часто это главная страница с баннером-слайдером или страницы товаров с 10 фотографиями высокого разрешения.
Итог: калькулятор — ваш первый шаг к стабильной работе сайта
Калькулятор нагрузки на сайт не даёт 100% гарантии, но снижает риск ошибки при выборе хостинга в 3–4 раза. Вы получаете реальные цифры, на которые можно опираться при разговоре с провайдером. Вместо «мне нужен хороший тариф» вы говорите: «Мне нужен канал не менее 40 Мбит/с и 3 ТБ трафика в месяц». Это язык технических специалистов, и вас поймут правильно.
Используйте калькулятор регулярно: при запуске сайта, при смене дизайна (размер страниц мог измениться), перед рекламными кампаниями и при плановом пересмотре тарифов. Пять минут на расчёт могут сэкономить часы простоя и тысячи рублей на аварийном апгрейде сервера.
CiAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAvLyDQrdC70LXQvNC10L3RgtGLINGE0L7RgNC80YsKICAgICAgICAgICAgY29uc3QgdmlzaXRvcnNJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2aXNpdG9ycy1tb250aGx5Jyk7CiAgICAgICAgICAgIGNvbnN0IHBhZ2VzSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFnZXMtcGVyLXZpc2l0b3InKTsKICAgICAgICAgICAgY29uc3QgcGFnZVNpemVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYWdlLXNpemUta2InKTsKICAgICAgICAgICAgY29uc3QgcGVha0NvZWZJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwZWFrLWNvZWZmaWNpZW50Jyk7CgogICAgICAgICAgICAvLyDQrdC70LXQvNC10L3RgtGLINC+0YjQuNCx0L7QugogICAgICAgICAgICBjb25zdCBlcnJvclZpc2l0b3JzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLXZpc2l0b3JzLW1vbnRobHknKTsKICAgICAgICAgICAgY29uc3QgZXJyb3JQYWdlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1wYWdlcy1wZXItdmlzaXRvcicpOwogICAgICAgICAgICBjb25zdCBlcnJvclBhZ2VTaXplID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLXBhZ2Utc2l6ZS1rYicpOwogICAgICAgICAgICBjb25zdCBlcnJvclBlYWtDb2VmID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLXBlYWstY29lZmZpY2llbnQnKTsKCiAgICAgICAgICAgIC8vINCt0LvQtdC80LXQvdGC0Ysg0YDQtdC30YPQu9GM0YLQsNGC0L7QsgogICAgICAgICAgICBjb25zdCByZXN1bHRNb250aGx5VHJhZmZpYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHQtbW9udGhseS10cmFmZmljJyk7CiAgICAgICAgICAgIGNvbnN0IHJlc3VsdEF2Z0RhaWx5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdC1hdmctZGFpbHktdmlzaXRvcnMnKTsKICAgICAgICAgICAgY29uc3QgcmVzdWx0UGVha0hvdXJseSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHQtcGVhay1ob3VybHknKTsKICAgICAgICAgICAgY29uc3QgcmVzdWx0UGVha0JhbmR3aWR0aCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHQtcGVhay1iYW5kd2lkdGgnKTsKICAgICAgICAgICAgY29uc3QgcmVzdWx0UmVjb21tZW5kZWRCYW5kd2lkdGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0LXJlY29tbWVuZGVkLWJhbmR3aWR0aCcpOwoKICAgICAgICAgICAgLy8g0JrQvdC+0L/QutC4CiAgICAgICAgICAgIGNvbnN0IGNhbGN1bGF0ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWxjdWxhdGUtYnRuJyk7CiAgICAgICAgICAgIGNvbnN0IHJlc2V0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc2V0LWJ0bicpOwoKICAgICAgICAgICAgZnVuY3Rpb24gaGlkZUFsbEVycm9ycygpIHsKICAgICAgICAgICAgICAgIFtlcnJvclZpc2l0b3JzLCBlcnJvclBhZ2VzLCBlcnJvclBhZ2VTaXplLCBlcnJvclBlYWtDb2VmXS5mb3JFYWNoKGZ1bmN0aW9uKGVsKSB7CiAgICAgICAgICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIHJlc2V0UmVzdWx0cygpIHsKICAgICAgICAgICAgICAgIHJlc3VsdE1vbnRobHlUcmFmZmljLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICAgICAgICAgICAgICByZXN1bHRBdmdEYWlseS50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICAgICAgICAgICAgcmVzdWx0UGVha0hvdXJseS50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICAgICAgICAgICAgcmVzdWx0UGVha0JhbmR3aWR0aC50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICAgICAgICAgICAgcmVzdWx0UmVjb21tZW5kZWRCYW5kd2lkdGgudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gdmFsaWRhdGVJbnB1dChpbnB1dCwgZXJyb3JFbCwgbWluLCBtYXgsIGxhYmVsKSB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBpbnB1dC52YWx1ZS50cmltKCk7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3JFbC50ZXh0Q29udGVudCA9ICfQn9C+0LvQtSDQvtCx0Y/Qt9Cw0YLQtdC70YzQvdC+INC00LvRjyDQt9Cw0L/QvtC70L3QtdC90LjRjyc7CiAgICAgICAgICAgICAgICAgICAgZXJyb3JFbC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIG51bSA9IHBhcnNlRmxvYXQodmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKGlzTmFOKG51bSkpIHsKICAgICAgICAgICAgICAgICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJ9CS0LLQtdC00LjRgtC1INGH0LjRgdC70L7QstC+0LUg0LfQvdCw0YfQtdC90LjQtSc7CiAgICAgICAgICAgICAgICAgICAgZXJyb3JFbC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG51bSA8IG1pbikgewogICAgICAgICAgICAgICAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAn0JfQvdCw0YfQtdC90LjQtSDQtNC+0LvQttC90L4g0LHRi9GC0Ywg0L3QtSDQvNC10L3QtdC1ICcgKyBtaW47CiAgICAgICAgICAgICAgICAgICAgZXJyb3JFbC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG1heCAhPT0gbnVsbCAmJiBudW0gPiBtYXgpIHsKICAgICAgICAgICAgICAgICAgICBlcnJvckVsLnRleHRDb250ZW50ID0gJ9CX0L3QsNGH0LXQvdC40LUg0LTQvtC70LbQvdC+INCx0YvRgtGMINC90LUg0LHQvtC70LXQtSAnICsgbWF4OwogICAgICAgICAgICAgICAgICAgIGVycm9yRWwuY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghaXNGaW5pdGUobnVtKSkgewogICAgICAgICAgICAgICAgICAgIGVycm9yRWwudGV4dENvbnRlbnQgPSAn0J3QtdC60L7RgNGA0LXQutGC0L3QvtC1INC30L3QsNGH0LXQvdC40LUnOwogICAgICAgICAgICAgICAgICAgIGVycm9yRWwuY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVycm9yRWwuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZSgpIHsKICAgICAgICAgICAgICAgIGhpZGVBbGxFcnJvcnMoKTsKCiAgICAgICAgICAgICAgICB2YXIgdmlzaXRvcnNWYWxpZCA9IHZhbGlkYXRlSW5wdXQodmlzaXRvcnNJbnB1dCwgZXJyb3JWaXNpdG9ycywgMSwgbnVsbCk7CiAgICAgICAgICAgICAgICB2YXIgcGFnZXNWYWxpZCA9IHZhbGlkYXRlSW5wdXQocGFnZXNJbnB1dCwgZXJyb3JQYWdlcywgMC4xLCBudWxsKTsKICAgICAgICAgICAgICAgIHZhciBwYWdlU2l6ZVZhbGlkID0gdmFsaWRhdGVJbnB1dChwYWdlU2l6ZUlucHV0LCBlcnJvclBhZ2VTaXplLCAxLCBudWxsKTsKICAgICAgICAgICAgICAgIHZhciBwZWFrQ29lZlZhbGlkID0gdmFsaWRhdGVJbnB1dChwZWFrQ29lZklucHV0LCBlcnJvclBlYWtDb2VmLCAxLCAxMCk7CgogICAgICAgICAgICAgICAgaWYgKCF2aXNpdG9yc1ZhbGlkIHx8ICFwYWdlc1ZhbGlkIHx8ICFwYWdlU2l6ZVZhbGlkIHx8ICFwZWFrQ29lZlZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzZXRSZXN1bHRzKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB2aXNpdG9ycyA9IHBhcnNlRmxvYXQodmlzaXRvcnNJbnB1dC52YWx1ZS50cmltKCkpOwogICAgICAgICAgICAgICAgdmFyIHBhZ2VzUGVyVmlzaXRvciA9IHBhcnNlRmxvYXQocGFnZXNJbnB1dC52YWx1ZS50cmltKCkpOwogICAgICAgICAgICAgICAgdmFyIHBhZ2VTaXplS0IgPSBwYXJzZUZsb2F0KHBhZ2VTaXplSW5wdXQudmFsdWUudHJpbSgpKTsKICAgICAgICAgICAgICAgIHZhciBwZWFrQ29lZmZpY2llbnQgPSBwYXJzZUZsb2F0KHBlYWtDb2VmSW5wdXQudmFsdWUudHJpbSgpKTsKCiAgICAgICAgICAgICAgICAvLyDQntC60YDRg9Cz0LvRj9C10LwgdmlzaXRvcnMg0LTQviDRhtC10LvQvtCz0L4gKNC70Y7QtNC4INC90LUg0LHRi9Cy0LDRjtGCINC00YDQvtCx0L3Ri9C80LgpCiAgICAgICAgICAgICAgICB2aXNpdG9ycyA9IE1hdGgucm91bmQodmlzaXRvcnMpOwoKICAgICAgICAgICAgICAgIC8vIDEuINCe0LHRidC40Lkg0LzQtdGB0Y/Rh9C90YvQuSDRgtGA0LDRhNC40Log0LIg0JPQkQogICAgICAgICAgICAgICAgdmFyIHRvdGFsVHJhZmZpY0J5dGVzID0gdmlzaXRvcnMgKiBwYWdlc1BlclZpc2l0b3IgKiBwYWdlU2l6ZUtCICogMTAyNDsKICAgICAgICAgICAgICAgIHZhciB0b3RhbFRyYWZmaWNHQiA9IHRvdGFsVHJhZmZpY0J5dGVzIC8gKDEwMjQgKiAxMDI0ICogMTAyNCk7CgogICAgICAgICAgICAgICAgLy8gMi4g0KHRgNC10LTQvdGP0Y8g0LTQvdC10LLQvdCw0Y8g0L3QsNCz0YDRg9C30LrQsCAo0L/QvtGB0LXRgtC40YLQtdC70LXQuSkKICAgICAgICAgICAgICAgIHZhciBhdmdEYWlseVZpc2l0b3JzID0gdmlzaXRvcnMgLyAzMDsKCiAgICAgICAgICAgICAgICAvLyAzLiDQn9C40LrQvtCy0LDRjyDRh9Cw0YHQvtCy0LDRjyDQvdCw0LPRgNGD0LfQutCwICjQv9C+0YHQtdGC0LjRgtC10LvQtdC5KQogICAgICAgICAgICAgICAgdmFyIHBlYWtIb3VybHlWaXNpdG9ycyA9ICh2aXNpdG9ycyAvIDMwKSAqIHBlYWtDb2VmZmljaWVudCAvIDI0OwoKICAgICAgICAgICAgICAgIC8vIDQuINCf0LjQutC+0LLQsNGPINC/0YDQvtC/0YPRgdC60L3QsNGPINGB0L/QvtGB0L7QsdC90L7RgdGC0YwgKNCc0LHQuNGCL9GBKQogICAgICAgICAgICAgICAgdmFyIHBlYWtUcmFmZmljQnl0ZXNQZXJTZWMgPSAocGVha0hvdXJseVZpc2l0b3JzICogcGFnZXNQZXJWaXNpdG9yICogcGFnZVNpemVLQiAqIDEwMjQgKiA4KSAvIDM2MDA7CiAgICAgICAgICAgICAgICB2YXIgcGVha0JhbmR3aWR0aE1icHMgPSBwZWFrVHJhZmZpY0J5dGVzUGVyU2VjIC8gKDEwMjQgKiAxMDI0KTsKCiAgICAgICAgICAgICAgICAvLyA1LiDQoNC10LrQvtC80LXQvdC00YPQtdC80LDRjyDQv9C+0LvQvtGB0LAg0YEg0LfQsNC/0LDRgdC+0LwgMjAlCiAgICAgICAgICAgICAgICB2YXIgcmVjb21tZW5kZWRCYW5kd2lkdGhNYnBzID0gcGVha0JhbmR3aWR0aE1icHMgKiAxLjI7CgogICAgICAgICAgICAgICAgLy8g0J/RgNC+0LLQtdGA0LrQsCDQvdCwIEluZmluaXR5INC4IE5hTgogICAgICAgICAgICAgICAgaWYgKCFpc0Zpbml0ZSh0b3RhbFRyYWZmaWNHQikgfHwgaXNOYU4odG90YWxUcmFmZmljR0IpKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzZXRSZXN1bHRzKCk7CiAgICAgICAgICAgICAgICAgICAgZXJyb3JWaXNpdG9ycy50ZXh0Q29udGVudCA9ICfQntGI0LjQsdC60LAg0LLRi9GH0LjRgdC70LXQvdC40Y86INC/0YDQvtCy0LXRgNGM0YLQtSDQstCy0LXQtNGR0L3QvdGL0LUg0LTQsNC90L3Ri9C1JzsKICAgICAgICAgICAgICAgICAgICBlcnJvclZpc2l0b3JzLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8g0JLRi9Cy0L7QtCDRgNC10LfRg9C70YzRgtCw0YLQvtCyINGBINC+0LrRgNGD0LPQu9C10L3QuNC10LwKICAgICAgICAgICAgICAgIHJlc3VsdE1vbnRobHlUcmFmZmljLnRleHRDb250ZW50ID0gdG90YWxUcmFmZmljR0IudG9GaXhlZCgxKTsKICAgICAgICAgICAgICAgIHJlc3VsdEF2Z0RhaWx5LnRleHRDb250ZW50ID0gTWF0aC5yb3VuZChhdmdEYWlseVZpc2l0b3JzKS50b0xvY2FsZVN0cmluZygncnUtUlUnKTsKICAgICAgICAgICAgICAgIHJlc3VsdFBlYWtIb3VybHkudGV4dENvbnRlbnQgPSBNYXRoLnJvdW5kKHBlYWtIb3VybHlWaXNpdG9ycykudG9Mb2NhbGVTdHJpbmcoJ3J1LVJVJyk7CiAgICAgICAgICAgICAgICByZXN1bHRQZWFrQmFuZHdpZHRoLnRleHRDb250ZW50ID0gcGVha0JhbmR3aWR0aE1icHMudG9GaXhlZCgyKTsKICAgICAgICAgICAgICAgIHJlc3VsdFJlY29tbWVuZGVkQmFuZHdpZHRoLnRleHRDb250ZW50ID0gcmVjb21tZW5kZWRCYW5kd2lkdGhNYnBzLnRvRml4ZWQoMik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIHJlc2V0Rm9ybSgpIHsKICAgICAgICAgICAgICAgIHZpc2l0b3JzSW5wdXQudmFsdWUgPSAnJzsKICAgICAgICAgICAgICAgIHBhZ2VzSW5wdXQudmFsdWUgPSAnJzsKICAgICAgICAgICAgICAgIHBhZ2VTaXplSW5wdXQudmFsdWUgPSAnJzsKICAgICAgICAgICAgICAgIHBlYWtDb2VmSW5wdXQudmFsdWUgPSAnMic7CiAgICAgICAgICAgICAgICBoaWRlQWxsRXJyb3JzKCk7CiAgICAgICAgICAgICAgICByZXNldFJlc3VsdHMoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2FsY3VsYXRlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2FsY3VsYXRlKTsKICAgICAgICAgICAgcmVzZXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZXNldEZvcm0pOwoKICAgICAgICAgICAgLy8g0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90L46INGA0LDRgdGH0ZHRgiDQv9C+IEVudGVyINCyINC70Y7QsdC+0Lwg0L/QvtC70LUKICAgICAgICAgICAgdmFyIGFsbElucHV0cyA9IFt2aXNpdG9yc0lucHV0LCBwYWdlc0lucHV0LCBwYWdlU2l6ZUlucHV0LCBwZWFrQ29lZklucHV0XTsKICAgICAgICAgICAgYWxsSW5wdXRzLmZvckVhY2goZnVuY3Rpb24oaW5wdXQpIHsKICAgICAgICAgICAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8g0J7Rh9C40YHRgtC60LAg0L7RiNC40LHQutC4INC/0YDQuCDQuNC30LzQtdC90LXQvdC40Lgg0LfQvdCw0YfQtdC90LjRjwogICAgICAgICAgICB2aXNpdG9yc0lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBlcnJvclZpc2l0b3JzLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHBhZ2VzSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGVycm9yUGFnZXMuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcGFnZVNpemVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgZXJyb3JQYWdlU2l6ZS5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBwZWFrQ29lZklucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBlcnJvclBlYWtDb2VmLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSkoKTsKICAgIA==