Калькулятор концентрации после разбавления
Рассчитайте начальную или конечную концентрацию, объём раствора либо количество добавляемого растворителя по классической формуле разбавления C₁V₁ = C₂V₂.
Как пользоваться
1
Выберите в выпадающем списке «Что нужно найти?» искомую величину: начальную либо конечную концентрацию или объём. Соответствующее поле станет неактивным — именно его мы и рассчитаем.
2
Введите три известных значения в оставшиеся поля. Например: C₁ = 2 моль/л, V₁ = 50 мл, V₂ = 200 мл — чтобы найти конечную концентрацию C₂.
3
Выберите подходящие единицы измерения концентрации (моль/л, г/л, % и др.) и объёма (л, мл, мкл). Важно: C₁ и C₂ должны быть в одинаковых единицах, как и V₁ с V₂.
4
Нажмите «Рассчитать». Результат появится в выделенной карточке справа (на мобильном — ниже формы) и автоматически отобразится в заблокированном поле. Дополнительно будет показан объём добавленного растворителя, если он определён.
Примеры использования
Приготовление рабочего раствора кислоты
Требуется приготовить 500 мл 0.1 M раствора HCl из 1 M исходного раствора.
Дано: C₁ = 1 M, C₂ = 0.1 M, V₂ = 500 мл.
Найти V₁: V₁ = (C₂ × V₂) / C₁ = (0.1 × 500) / 1 = 50 мл.
Добавить растворителя: 500 − 50 = 450 мл воды.
Определение концентрации после разбавления пробы
Лаборант взял 25 мл 2 M раствора NaOH и довёл объём до 200 мл дистиллированной водой.
Дано: C₁ = 2 M, V₁ = 25 мл, V₂ = 200 мл.
Найти C₂: C₂ = (C₁ × V₁) / V₂ = (2 × 25) / 200 = 0.25 M.
Фактор разбавления: DF = 200 / 25 = 8.
Расчёт объёма маточного раствора для микроразбавлений
Нужно получить 100 мкл 5 мкмоль/л раствора из 1 ммоль/л исходного.
Дано: C₁ = 1 ммоль/л = 1000 мкмоль/л, C₂ = 5 мкмоль/л, V₂ = 100 мкл.
Найти V₁: V₁ = (5 × 100) / 1000 = 0.5 мкл.
Добавить: 99.5 мкл растворителя.
Важные нюансы
- Формула C₁V₁ = C₂V₂ справедлива только при одинаковых единицах измерения для обеих концентраций и обоих объёмов. Перед расчётом убедитесь в согласованности единиц.
- При разбавлении концентрированных кислот (серной, азотной, соляной) всегда добавляйте кислоту в воду, а не наоборот. Это предотвращает бурное разогревание и разбрызгивание агрессивной жидкости.
- Объёмы жидкостей зависят от температуры. Для прецизионных лабораторных расчётов измерения проводят при стандартной температуре (обычно 20 °C или 25 °C), а мерную посуду калибруют при той же температуре.
- Формула предполагает аддитивность объёмов. В реальности для концентрированных растворов возможна контракция — конечный объём может быть немного меньше суммы исходных объёмов. Для растворов с концентрацией ниже 0.1 M эффект, как правило, пренебрежимо мал.
- Не используйте нулевой или отрицательный объём. Если исходные данные дают V₁ ≥ V₂ при поиске добавленного объёма, значит, конечная концентрация не может быть достигнута простым разбавлением — проверьте введённые числа.
- Концентрации 0 (чистый растворитель) допустимы. Однако поиск объёма при нулевой концентрации приводит к неопределённости — калькулятор сообщит об ошибке.
Источники данных
- IUPAC Gold Book — стандартные определения концентрации, разбавления и молярности (IUPAC Compendium of Chemical Terminology).
- NIST Chemistry WebBook — справочные данные по физико-химическим свойствам веществ, используемые для верификации расчётов концентраций.
- CRC Handbook of Chemistry and Physics — фундаментальный справочник химических и физических констант, включая плотности растворов и таблицы разбавления.
- Расчёт основан на стандартных химических формулах и школьно-вузовских справочных значениях, принятых в общей и аналитической химии.
Калькулятор концентрации после разбавления помогает быстро рассчитать любую из четырёх ключевых величин — начальную или конечную концентрацию, начальный или конечный объём раствора — по трём известным параметрам на основе фундаментального уравнения C₁V₁ = C₂V₂. Инструмент предназначен для студентов химических специальностей, лаборантов, фармацевтов и технологов, работающих с приготовлением и разбавлением растворов. Интуитивный интерфейс, поддержка различных единиц измерения (моль/л, ммоль/л, г/л, проценты, ppm, литры, миллилитры, микролитры) и мгновенный вывод результата с дополнительным расчётом объёма добавленного растворителя делают рутинные вычисления простыми и безошибочными.
CihmdW5jdGlvbigpewogIC8vIC0tLSDQrdC70LXQvNC10L3RgtGLIERPTSAtLS0KICB2YXIgZmluZFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaWwtZmluZCcpOwogIHZhciBjb25jVW5pdFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaWwtY29uYy11bml0Jyk7CiAgdmFyIHZvbFVuaXRTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlsLXZvbC11bml0Jyk7CgogIHZhciBjMUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RpbC1jMScpOwogIHZhciB2MUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RpbC12MScpOwogIHZhciBjMklucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RpbC1jMicpOwogIHZhciB2MklucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RpbC12MicpOwoKICB2YXIgY2FsY0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaWwtY2FsYy1idG4nKTsKICB2YXIgcmVzZXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlsLXJlc2V0LWJ0bicpOwogIHZhciBlcnJvck1zZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaWwtZXJyb3InKTsKCiAgdmFyIHJlc3VsdFZhbHVlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RpbC1yZXN1bHQtdmFsdWUnKTsKICB2YXIgcmVzdWx0TGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlsLXJlc3VsdC1sYWJlbCcpOwogIHZhciByZXN1bHRVbml0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RpbC1yZXN1bHQtdW5pdCcpOwoKICB2YXIgZXh0cmFCbG9jayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaWwtZXh0cmEtYmxvY2snKTsKICB2YXIgZXh0cmFWYWx1ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaWwtZXh0cmEtdmFsdWUnKTsKICB2YXIgZXh0cmFVbml0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RpbC1leHRyYS11bml0Jyk7CgogIC8vIC0tLSDQk9GA0YPQv9C/0Ysg0YHQvtCy0LzQtdGB0YLQuNC80L7RgdGC0Lgg0LrQvtC90YbQtdC90YLRgNCw0YbQuNC5IC0tLQogIHZhciBjb25jR3JvdXBzID0gewogICAgJ21vbC9sJzogJ21vbGFyJywKICAgICdtbW9sL2wnOiAnbW9sYXInLAogICAgJ3Vtb2wvbCc6ICdtb2xhcicsCiAgICAnZy9sJzogJ21hc3MnLAogICAgJ21nL2wnOiAnbWFzcycsCiAgICAnJSc6ICdwZXJjZW50JywKICAgICdwcG0nOiAncHBtJwogIH07CgogIC8vIC0tLSDQmtC+0Y3RhNGE0LjRhtC40LXQvdGC0Ysg0LTQu9GPINC60L7QvdCy0LXRgNGC0LDRhtC40Lgg0LIg0LHQsNC30L7QstGL0LUgKNC80L7Qu9GML9C7LCDQuykgLS0tCiAgdmFyIGNvbmNGYWN0b3JzID0gewogICAgJ21vbC9sJzogMSwKICAgICdtbW9sL2wnOiAwLjAwMSwKICAgICd1bW9sL2wnOiAxZS02LAogICAgJ2cvbCc6IDEsCiAgICAnbWcvbCc6IDAuMDAxLAogICAgJyUnOiAxLAogICAgJ3BwbSc6IDEKICB9OwoKICB2YXIgdm9sRmFjdG9ycyA9IHsKICAgICdsJzogMSwKICAgICdtbCc6IDAuMDAxLAogICAgJ3VsJzogMWUtNgogIH07CgogIC8vIC0tLSDQodC+0YHRgtC+0Y/QvdC40LUgLS0tCiAgdmFyIHByZXZDb25jVW5pdCA9IGNvbmNVbml0U2VsZWN0LnZhbHVlOwogIHZhciBwcmV2Vm9sVW5pdCA9IHZvbFVuaXRTZWxlY3QudmFsdWU7CgogIC8vIC0tLSDQktGB0L/QvtC80L7Qs9Cw0YLQtdC70YzQvdGL0LUg0YTRg9C90LrRhtC40LggLS0tCiAgZnVuY3Rpb24gZ2V0Q29uY0dyb3VwKHVuaXQpIHsKICAgIHJldHVybiBjb25jR3JvdXBzW3VuaXRdIHx8IHVuaXQ7CiAgfQoKICBmdW5jdGlvbiBwYXJzZUlucHV0VmFsdWUoaW5wdXRFbCkgewogICAgdmFyIHJhdyA9IGlucHV0RWwudmFsdWUudHJpbSgpOwogICAgaWYgKHJhdyA9PT0gJycpIHJldHVybiBudWxsOwogICAgdmFyIHZhbCA9IHBhcnNlRmxvYXQocmF3KTsKICAgIGlmIChpc05hTih2YWwpIHx8ICFpc0Zpbml0ZSh2YWwpKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiB2YWw7CiAgfQoKICBmdW5jdGlvbiBzZXRJbnB1dFZhbHVlKGlucHV0RWwsIHZhbCkgewogICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCB8fCBpc05hTih2YWwpIHx8ICFpc0Zpbml0ZSh2YWwpKSB7CiAgICAgIGlucHV0RWwudmFsdWUgPSAnJzsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8g0J7QutGA0YPQs9C70Y/QtdC8INC00L4g0YDQsNC30YPQvNC90L7Qs9C+INC60L7Qu9C40YfQtdGB0YLQstCwINC30L3QsNC60L7QsgogICAgdmFyIHJvdW5kZWQgPSBwYXJzZUZsb2F0KHZhbC50b0ZpeGVkKDgpKTsKICAgIGlucHV0RWwudmFsdWUgPSByb3VuZGVkOwogIH0KCiAgZnVuY3Rpb24gc2hvd0Vycm9yKG1zZykgewogICAgZXJyb3JNc2cudGV4dENvbnRlbnQgPSBtc2c7CiAgICBlcnJvck1zZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICB9CgogIGZ1bmN0aW9uIGhpZGVFcnJvcigpIHsKICAgIGVycm9yTXNnLnRleHRDb250ZW50ID0gJyc7CiAgICBlcnJvck1zZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogIH0KCiAgZnVuY3Rpb24gY2xlYXJSZXN1bHQoKSB7CiAgICByZXN1bHRWYWx1ZS50ZXh0Q29udGVudCA9ICfigJQnOwogICAgcmVzdWx0TGFiZWwudGV4dENvbnRlbnQgPSAn0JLRi9GH0LjRgdC70LjRgtC1INC30L3QsNGH0LXQvdC40LUnOwogICAgcmVzdWx0VW5pdC50ZXh0Q29udGVudCA9ICcnOwogICAgZXh0cmFCbG9jay5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgZXh0cmFWYWx1ZS50ZXh0Q29udGVudCA9ICfigJQnOwogICAgZXh0cmFVbml0LnRleHRDb250ZW50ID0gJyc7CiAgfQoKICBmdW5jdGlvbiBkaXNwbGF5UmVzdWx0KHZhbHVlLCBsYWJlbCwgdW5pdCkgewogICAgaWYgKHZhbHVlID09PSBudWxsIHx8IGlzTmFOKHZhbHVlKSB8fCAhaXNGaW5pdGUodmFsdWUpKSB7CiAgICAgIGNsZWFyUmVzdWx0KCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciByb3VuZGVkID0gcGFyc2VGbG9hdCh2YWx1ZS50b0ZpeGVkKDgpKTsKICAgIHJlc3VsdFZhbHVlLnRleHRDb250ZW50ID0gcm91bmRlZDsKICAgIHJlc3VsdExhYmVsLnRleHRDb250ZW50ID0gbGFiZWw7CiAgICByZXN1bHRVbml0LnRleHRDb250ZW50ID0gdW5pdDsKICB9CgogIGZ1bmN0aW9uIGRpc3BsYXlFeHRyYSh2YWx1ZSwgdW5pdCkgewogICAgaWYgKHZhbHVlID09PSBudWxsIHx8IGlzTmFOKHZhbHVlKSB8fCAhaXNGaW5pdGUodmFsdWUpIHx8IHZhbHVlIDwgMCkgewogICAgICBleHRyYUJsb2NrLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciByb3VuZGVkID0gcGFyc2VGbG9hdCh2YWx1ZS50b0ZpeGVkKDgpKTsKICAgIGV4dHJhVmFsdWUudGV4dENvbnRlbnQgPSByb3VuZGVkOwogICAgZXh0cmFVbml0LnRleHRDb250ZW50ID0gdW5pdDsKICAgIGV4dHJhQmxvY2suc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgfQoKICBmdW5jdGlvbiBoaWRlRXh0cmEoKSB7CiAgICBleHRyYUJsb2NrLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgfQoKICAvLyAtLS0g0JrQvtC90LLQtdGA0YLQsNGG0LjRjyDQt9C90LDRh9C10L3QuNC5INC/0YDQuCDRgdC80LXQvdC1INC10LTQuNC90LjRhiAtLS0KICBmdW5jdGlvbiBjb252ZXJ0Q29uY2VudHJhdGlvblZhbHVlKHZhbCwgZnJvbVVuaXQsIHRvVW5pdCkgewogICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCB8fCBpc05hTih2YWwpKSByZXR1cm4gbnVsbDsKICAgIHZhciBmcm9tR3JvdXAgPSBnZXRDb25jR3JvdXAoZnJvbVVuaXQpOwogICAgdmFyIHRvR3JvdXAgPSBnZXRDb25jR3JvdXAodG9Vbml0KTsKICAgIGlmIChmcm9tR3JvdXAgIT09IHRvR3JvdXApIHJldHVybiBudWxsOyAvLyDQvdC10YHQvtCy0LzQtdGB0YLQuNC80YsKICAgIHZhciBmYWN0b3IgPSBjb25jRmFjdG9yc1tmcm9tVW5pdF0gLyBjb25jRmFjdG9yc1t0b1VuaXRdOwogICAgcmV0dXJuIHZhbCAqIGZhY3RvcjsKICB9CgogIGZ1bmN0aW9uIGNvbnZlcnRWb2x1bWVWYWx1ZSh2YWwsIGZyb21Vbml0LCB0b1VuaXQpIHsKICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQgfHwgaXNOYU4odmFsKSkgcmV0dXJuIG51bGw7CiAgICB2YXIgZmFjdG9yID0gdm9sRmFjdG9yc1tmcm9tVW5pdF0gLyB2b2xGYWN0b3JzW3RvVW5pdF07CiAgICByZXR1cm4gdmFsICogZmFjdG9yOwogIH0KCiAgLy8gLS0tINCj0L/RgNCw0LLQu9C10L3QuNC1INCx0LvQvtC60LjRgNC+0LLQutC+0Lkg0L/QvtC70LXQuSAtLS0KICBmdW5jdGlvbiB1cGRhdGVEaXNhYmxlZEZpZWxkcygpIHsKICAgIHZhciBmaW5kID0gZmluZFNlbGVjdC52YWx1ZTsKICAgIGMxSW5wdXQuZGlzYWJsZWQgPSAoZmluZCA9PT0gJ2MxJyk7CiAgICB2MUlucHV0LmRpc2FibGVkID0gKGZpbmQgPT09ICd2MScpOwogICAgYzJJbnB1dC5kaXNhYmxlZCA9IChmaW5kID09PSAnYzInKTsKICAgIHYySW5wdXQuZGlzYWJsZWQgPSAoZmluZCA9PT0gJ3YyJyk7CiAgfQoKICAvLyAtLS0g0J7RgdC90L7QstC90L7QuSDRgNCw0YHRh9GR0YIgLS0tCiAgZnVuY3Rpb24gY2FsY3VsYXRlKCkgewogICAgaGlkZUVycm9yKCk7CiAgICBjbGVhclJlc3VsdCgpOwogICAgaGlkZUV4dHJhKCk7CgogICAgdmFyIGZpbmQgPSBmaW5kU2VsZWN0LnZhbHVlOwoKICAgIC8vINCf0L7Qu9GD0YfQsNC10Lwg0LfQvdCw0YfQtdC90LjRjyDQuNC3INC/0L7Qu9C10LkKICAgIHZhciBjMVZhbCA9IHBhcnNlSW5wdXRWYWx1ZShjMUlucHV0KTsKICAgIHZhciB2MVZhbCA9IHBhcnNlSW5wdXRWYWx1ZSh2MUlucHV0KTsKICAgIHZhciBjMlZhbCA9IHBhcnNlSW5wdXRWYWx1ZShjMklucHV0KTsKICAgIHZhciB2MlZhbCA9IHBhcnNlSW5wdXRWYWx1ZSh2MklucHV0KTsKCiAgICB2YXIgY29uY1VuaXQgPSBjb25jVW5pdFNlbGVjdC52YWx1ZTsKICAgIHZhciB2b2xVbml0ID0gdm9sVW5pdFNlbGVjdC52YWx1ZTsKCiAgICAvLyDQntC/0YDQtdC00LXQu9GP0LXQvCwg0LrQsNC60LjQtSDRgtGA0Lgg0L/QvtC70Y8g0LTQvtC70LbQvdGLINCx0YvRgtGMINC30LDQv9C+0LvQvdC10L3RiwogICAgdmFyIGtub3duRmllbGRzID0gW107CiAgICBpZiAoZmluZCAhPT0gJ2MxJykga25vd25GaWVsZHMucHVzaCh7IG5hbWU6ICdD4oKBJywgdmFsOiBjMVZhbCwgZWw6IGMxSW5wdXQgfSk7CiAgICBpZiAoZmluZCAhPT0gJ3YxJykga25vd25GaWVsZHMucHVzaCh7IG5hbWU6ICdW4oKBJywgdmFsOiB2MVZhbCwgZWw6IHYxSW5wdXQgfSk7CiAgICBpZiAoZmluZCAhPT0gJ2MyJykga25vd25GaWVsZHMucHVzaCh7IG5hbWU6ICdD4oKCJywgdmFsOiBjMlZhbCwgZWw6IGMySW5wdXQgfSk7CiAgICBpZiAoZmluZCAhPT0gJ3YyJykga25vd25GaWVsZHMucHVzaCh7IG5hbWU6ICdW4oKCJywgdmFsOiB2MlZhbCwgZWw6IHYySW5wdXQgfSk7CgogICAgLy8g0J/RgNC+0LLQtdGA0LrQsCDQt9Cw0L/QvtC70L3QtdC90L3QvtGB0YLQuAogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrbm93bkZpZWxkcy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoa25vd25GaWVsZHNbaV0udmFsID09PSBudWxsKSB7CiAgICAgICAgc2hvd0Vycm9yKCfQl9Cw0L/QvtC70L3QuNGC0LUg0L/QvtC70LUgwqsnICsga25vd25GaWVsZHNbaV0ubmFtZSArICfCuy4g0JLRgdC1INGC0YDQuCDQuNC30LLQtdGB0YLQvdGL0YUg0LLQtdC70LjRh9C40L3RiyDQtNC+0LvQttC90Ysg0LHRi9GC0Ywg0YPQutCw0LfQsNC90YsuJyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CgogICAgLy8g0J/RgNC+0LLQtdGA0LrQsCDQvdCwINC+0YLRgNC40YbQsNGC0LXQu9GM0L3Ri9C1INC30L3QsNGH0LXQvdC40Y8KICAgIGlmIChjMVZhbCAhPT0gbnVsbCAmJiBjMVZhbCA8IDApIHsgc2hvd0Vycm9yKCfQndCw0YfQsNC70YzQvdCw0Y8g0LrQvtC90YbQtdC90YLRgNCw0YbQuNGPIEPigoEg0L3QtSDQvNC+0LbQtdGCINCx0YvRgtGMINC+0YLRgNC40YbQsNGC0LXQu9GM0L3QvtC5LicpOyByZXR1cm47IH0KICAgIGlmICh2MVZhbCAhPT0gbnVsbCAmJiB2MVZhbCA8PSAwKSB7IHNob3dFcnJvcign0J3QsNGH0LDQu9GM0L3Ri9C5INC+0LHRitGR0LwgVuKCgSDQtNC+0LvQttC10L0g0LHRi9GC0Ywg0L/QvtC70L7QttC40YLQtdC70YzQvdGL0Lwg0YfQuNGB0LvQvtC8LicpOyByZXR1cm47IH0KICAgIGlmIChjMlZhbCAhPT0gbnVsbCAmJiBjMlZhbCA8IDApIHsgc2hvd0Vycm9yKCfQmtC+0L3QtdGH0L3QsNGPINC60L7QvdGG0LXQvdGC0YDQsNGG0LjRjyBD4oKCINC90LUg0LzQvtC20LXRgiDQsdGL0YLRjCDQvtGC0YDQuNGG0LDRgtC10LvRjNC90L7QuS4nKTsgcmV0dXJuOyB9CiAgICBpZiAodjJWYWwgIT09IG51bGwgJiYgdjJWYWwgPD0gMCkgeyBzaG93RXJyb3IoJ9Ca0L7QvdC10YfQvdGL0Lkg0L7QsdGK0ZHQvCBW4oKCINC00L7Qu9C20LXQvSDQsdGL0YLRjCDQv9C+0LvQvtC20LjRgtC10LvRjNC90YvQvCDRh9C40YHQu9C+0LwuJyk7IHJldHVybjsgfQoKICAgIHZhciByZXN1bHQgPSBudWxsOwogICAgdmFyIHJlc3VsdExhYmVsVGV4dCA9ICcnOwogICAgdmFyIGV4dHJhVm9sID0gbnVsbDsKCiAgICBzd2l0Y2ggKGZpbmQpIHsKICAgICAgY2FzZSAnYzInOgogICAgICAgIC8vIEPigoIgPSBD4oKBIMOXIFbigoEgLyBW4oKCCiAgICAgICAgaWYgKHYyVmFsID09PSAwIHx8IHYyVmFsID09PSBudWxsKSB7CiAgICAgICAgICBzaG93RXJyb3IoJ9Ca0L7QvdC10YfQvdGL0Lkg0L7QsdGK0ZHQvCBW4oKCINC90LUg0LzQvtC20LXRgiDQsdGL0YLRjCDRgNCw0LLQtdC9INC90YPQu9GOINC/0YDQuCDQv9C+0LjRgdC60LUgQ+KCgi4nKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgcmVzdWx0ID0gKGMxVmFsICogdjFWYWwpIC8gdjJWYWw7CiAgICAgICAgcmVzdWx0TGFiZWxUZXh0ID0gJ9Ca0L7QvdC10YfQvdCw0Y8g0LrQvtC90YbQtdC90YLRgNCw0YbQuNGPIEPigoInOwogICAgICAgIGlmICh2MlZhbCA+IHYxVmFsKSB7CiAgICAgICAgICBleHRyYVZvbCA9IHYyVmFsIC0gdjFWYWw7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAndjInOgogICAgICAgIC8vIFbigoIgPSBD4oKBIMOXIFbigoEgLyBD4oKCCiAgICAgICAgaWYgKGMyVmFsID09PSAwIHx8IGMyVmFsID09PSBudWxsKSB7CiAgICAgICAgICBzaG93RXJyb3IoJ9Ca0L7QvdC10YfQvdCw0Y8g0LrQvtC90YbQtdC90YLRgNCw0YbQuNGPIEPigoIg0L3QtSDQvNC+0LbQtdGCINCx0YvRgtGMINGA0LDQstC90LAg0L3Rg9C70Y4g0L/RgNC4INC/0L7QuNGB0LrQtSBW4oKCLicpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICByZXN1bHQgPSAoYzFWYWwgKiB2MVZhbCkgLyBjMlZhbDsKICAgICAgICByZXN1bHRMYWJlbFRleHQgPSAn0JrQvtC90LXRh9C90YvQuSDQvtCx0YrRkdC8IFbigoInOwogICAgICAgIGlmIChyZXN1bHQgPiB2MVZhbCkgewogICAgICAgICAgZXh0cmFWb2wgPSByZXN1bHQgLSB2MVZhbDsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdjMSc6CiAgICAgICAgLy8gQ+KCgSA9IEPigoIgw5cgVuKCgiAvIFbigoEKICAgICAgICBpZiAodjFWYWwgPT09IDAgfHwgdjFWYWwgPT09IG51bGwpIHsKICAgICAgICAgIHNob3dFcnJvcign0J3QsNGH0LDQu9GM0L3Ri9C5INC+0LHRitGR0LwgVuKCgSDQvdC1INC80L7QttC10YIg0LHRi9GC0Ywg0YDQsNCy0LXQvSDQvdGD0LvRjiDQv9GA0Lgg0L/QvtC40YHQutC1IEPigoEuJyk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IChjMlZhbCAqIHYyVmFsKSAvIHYxVmFsOwogICAgICAgIHJlc3VsdExhYmVsVGV4dCA9ICfQndCw0YfQsNC70YzQvdCw0Y8g0LrQvtC90YbQtdC90YLRgNCw0YbQuNGPIEPigoEnOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAndjEnOgogICAgICAgIC8vIFbigoEgPSBD4oKCIMOXIFbigoIgLyBD4oKBCiAgICAgICAgaWYgKGMxVmFsID09PSAwIHx8IGMxVmFsID09PSBudWxsKSB7CiAgICAgICAgICBzaG93RXJyb3IoJ9Cd0LDRh9Cw0LvRjNC90LDRjyDQutC+0L3RhtC10L3RgtGA0LDRhtC40Y8gQ+KCgSDQvdC1INC80L7QttC10YIg0LHRi9GC0Ywg0YDQsNCy0L3QsCDQvdGD0LvRjiDQv9GA0Lgg0L/QvtC40YHQutC1IFbigoEuJyk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IChjMlZhbCAqIHYyVmFsKSAvIGMxVmFsOwogICAgICAgIHJlc3VsdExhYmVsVGV4dCA9ICfQndCw0YfQsNC70YzQvdGL0Lkg0L7QsdGK0ZHQvCBW4oKBJzsKICAgICAgICBpZiAodjJWYWwgPiByZXN1bHQpIHsKICAgICAgICAgIGV4dHJhVm9sID0gdjJWYWwgLSByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgfQoKICAgIC8vINCf0YDQvtCy0LXRgNC60LAg0YDQtdC30YPQu9GM0YLQsNGC0LAKICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgaXNOYU4ocmVzdWx0KSB8fCAhaXNGaW5pdGUocmVzdWx0KSB8fCByZXN1bHQgPCAwKSB7CiAgICAgIHNob3dFcnJvcign0J3QtdC60L7RgNGA0LXQutGC0L3Ri9C5INGA0LXQt9GD0LvRjNGC0LDRgi4g0J/RgNC+0LLQtdGA0YzRgtC1INCy0LLQtdC00ZHQvdC90YvQtSDQtNCw0L3QvdGL0LUg4oCUINCy0L7Qt9C80L7QttC90L4sINC60L7QvdC10YfQvdCw0Y8g0LrQvtC90YbQtdC90YLRgNCw0YbQuNGPINC/0YDQtdCy0YvRiNCw0LXRgiDQvdCw0YfQsNC70YzQvdGD0Y4sINGH0YLQviDQvdC10LLQvtC30LzQvtC20L3QviDQv9GA0Lgg0YDQsNC30LHQsNCy0LvQtdC90LjQuC4nKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vINCX0LDQv9C40YHRi9Cy0LDQtdC8INGA0LXQt9GD0LvRjNGC0LDRgiDQsiDQt9Cw0LHQu9C+0LrQuNGA0L7QstCw0L3QvdC+0LUg0L/QvtC70LUKICAgIHN3aXRjaCAoZmluZCkgewogICAgICBjYXNlICdjMSc6IHNldElucHV0VmFsdWUoYzFJbnB1dCwgcmVzdWx0KTsgYnJlYWs7CiAgICAgIGNhc2UgJ3YxJzogc2V0SW5wdXRWYWx1ZSh2MUlucHV0LCByZXN1bHQpOyBicmVhazsKICAgICAgY2FzZSAnYzInOiBzZXRJbnB1dFZhbHVlKGMySW5wdXQsIHJlc3VsdCk7IGJyZWFrOwogICAgICBjYXNlICd2Mic6IHNldElucHV0VmFsdWUodjJJbnB1dCwgcmVzdWx0KTsgYnJlYWs7CiAgICB9CgogICAgLy8g0J7RgtC+0LHRgNCw0LbQsNC10Lwg0YDQtdC30YPQu9GM0YLQsNGCCiAgICBkaXNwbGF5UmVzdWx0KHJlc3VsdCwgcmVzdWx0TGFiZWxUZXh0LCBjb25jVW5pdCk7CgogICAgLy8g0J7RgtC+0LHRgNCw0LbQsNC10Lwg0LTQvtCx0LDQstC70LXQvdC90YvQuSDQvtCx0YrRkdC8LCDQtdGB0LvQuCDQv9GA0LjQvNC10L3QuNC80L4KICAgIGlmIChleHRyYVZvbCAhPT0gbnVsbCAmJiBpc0Zpbml0ZShleHRyYVZvbCkgJiYgZXh0cmFWb2wgPiAwKSB7CiAgICAgIGRpc3BsYXlFeHRyYShleHRyYVZvbCwgdm9sVW5pdCk7CiAgICB9IGVsc2UgewogICAgICBoaWRlRXh0cmEoKTsKICAgIH0KICB9CgogIC8vIC0tLSDQodCx0YDQvtGBIC0tLQogIGZ1bmN0aW9uIHJlc2V0QWxsKCkgewogICAgaGlkZUVycm9yKCk7CiAgICBjbGVhclJlc3VsdCgpOwogICAgaGlkZUV4dHJhKCk7CiAgICBjMUlucHV0LnZhbHVlID0gJyc7CiAgICB2MUlucHV0LnZhbHVlID0gJyc7CiAgICBjMklucHV0LnZhbHVlID0gJyc7CiAgICB2MklucHV0LnZhbHVlID0gJyc7CiAgICBjMUlucHV0LmRpc2FibGVkID0gZmFsc2U7CiAgICB2MUlucHV0LmRpc2FibGVkID0gZmFsc2U7CiAgICBjMklucHV0LmRpc2FibGVkID0gZmFsc2U7CiAgICB2MklucHV0LmRpc2FibGVkID0gZmFsc2U7CiAgICBmaW5kU2VsZWN0LnZhbHVlID0gJ2MyJzsKICAgIHVwZGF0ZURpc2FibGVkRmllbGRzKCk7CiAgICBwcmV2Q29uY1VuaXQgPSBjb25jVW5pdFNlbGVjdC52YWx1ZTsKICAgIHByZXZWb2xVbml0ID0gdm9sVW5pdFNlbGVjdC52YWx1ZTsKICB9CgogIC8vIC0tLSDQntCx0YDQsNCx0L7RgtGH0LjQutC4INGB0L7QsdGL0YLQuNC5IC0tLQogIGNhbGNCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKSB7CiAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICBjYWxjdWxhdGUoKTsKICB9KTsKCiAgcmVzZXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKSB7CiAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICByZXNldEFsbCgpOwogIH0pOwoKICBmaW5kU2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uKCkgewogICAgdXBkYXRlRGlzYWJsZWRGaWVsZHMoKTsKICAgIC8vINCe0YfQuNGJ0LDQtdC8INC30L3QsNGH0LXQvdC40LUg0LIg0YLQvtC70YzQutC+INGH0YLQviDQt9Cw0LHQu9C+0LrQuNGA0L7QstCw0L3QvdC+0Lwg0L/QvtC70LUKICAgIHZhciBmaW5kID0gZmluZFNlbGVjdC52YWx1ZTsKICAgIHN3aXRjaCAoZmluZCkgewogICAgICBjYXNlICdjMSc6IGMxSW5wdXQudmFsdWUgPSAnJzsgYnJlYWs7CiAgICAgIGNhc2UgJ3YxJzogdjFJbnB1dC52YWx1ZSA9ICcnOyBicmVhazsKICAgICAgY2FzZSAnYzInOiBjMklucHV0LnZhbHVlID0gJyc7IGJyZWFrOwogICAgICBjYXNlICd2Mic6IHYySW5wdXQudmFsdWUgPSAnJzsgYnJlYWs7CiAgICB9CiAgICBoaWRlRXJyb3IoKTsKICAgIGNsZWFyUmVzdWx0KCk7CiAgICBoaWRlRXh0cmEoKTsKICB9KTsKCiAgLy8g0KHQvNC10L3QsCDQtdC00LjQvdC40YYg0LrQvtC90YbQtdC90YLRgNCw0YbQuNC4CiAgY29uY1VuaXRTZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24oKSB7CiAgICB2YXIgbmV3VW5pdCA9IGNvbmNVbml0U2VsZWN0LnZhbHVlOwogICAgdmFyIG9sZFVuaXQgPSBwcmV2Q29uY1VuaXQ7CgogICAgLy8g0JrQvtC90LLQtdGA0YLQuNGA0YPQtdC8INC40LvQuCDRgdCx0YDQsNGB0YvQstCw0LXQvCBD4oKBINC4IEPigoIKICAgIHZhciBjMVBhcnNlZCA9IHBhcnNlSW5wdXRWYWx1ZShjMUlucHV0KTsKICAgIHZhciBjMlBhcnNlZCA9IHBhcnNlSW5wdXRWYWx1ZShjMklucHV0KTsKCiAgICB2YXIgbmV3QzEgPSBjb252ZXJ0Q29uY2VudHJhdGlvblZhbHVlKGMxUGFyc2VkLCBvbGRVbml0LCBuZXdVbml0KTsKICAgIHZhciBuZXdDMiA9IGNvbnZlcnRDb25jZW50cmF0aW9uVmFsdWUoYzJQYXJzZWQsIG9sZFVuaXQsIG5ld1VuaXQpOwoKICAgIGlmIChnZXRDb25jR3JvdXAob2xkVW5pdCkgIT09IGdldENvbmNHcm91cChuZXdVbml0KSkgewogICAgICAvLyDQndC10YHQvtCy0LzQtdGB0YLQuNC80YvQtSDQs9GA0YPQv9C/0Ysg4oCUINGB0LHRgNCw0YHRi9Cy0LDQtdC8INC/0L7Qu9GPINC60L7QvdGG0LXQvdGC0YDQsNGG0LjQuQogICAgICBjMUlucHV0LnZhbHVlID0gJyc7CiAgICAgIGMySW5wdXQudmFsdWUgPSAnJzsKICAgICAgLy8g0J7Rh9C40YnQsNC10Lwg0YDQtdC30YPQu9GM0YLQsNGCLCDQtdGB0LvQuCDQvtC9INCx0YvQuyDQsiDQtdC00LjQvdC40YbQsNGFINC60L7QvdGG0LXQvdGC0YDQsNGG0LjQuAogICAgICBpZiAoZmluZFNlbGVjdC52YWx1ZSA9PT0gJ2MxJyB8fCBmaW5kU2VsZWN0LnZhbHVlID09PSAnYzInKSB7CiAgICAgICAgY2xlYXJSZXN1bHQoKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy8g0KHQvtCy0LzQtdGB0YLQuNC80YvQtSDigJQg0LrQvtC90LLQtdGA0YLQuNGA0YPQtdC8CiAgICAgIHNldElucHV0VmFsdWUoYzFJbnB1dCwgbmV3QzEpOwogICAgICBzZXRJbnB1dFZhbHVlKGMySW5wdXQsIG5ld0MyKTsKICAgICAgLy8g0JXRgdC70Lgg0YDQtdC30YPQu9GM0YLQsNGCINCx0YvQuyDQsiDQtdC00LjQvdC40YbQsNGFINC60L7QvdGG0LXQvdGC0YDQsNGG0LjQuCwg0L/QtdGA0LXRgdGH0LjRgtGL0LLQsNC10LwKICAgICAgaWYgKGZpbmRTZWxlY3QudmFsdWUgPT09ICdjMScgfHwgZmluZFNlbGVjdC52YWx1ZSA9PT0gJ2MyJykgewogICAgICAgIC8vINCf0YDQvtGB0YLQviDQt9Cw0L/Rg9GB0LrQsNC10Lwg0YDQsNGB0YfRkdGCINC30LDQvdC+0LLQviwg0LXRgdC70Lgg0LLRgdC1INC00LDQvdC90YvQtSDQtdGB0YLRjAogICAgICAgIGNhbGN1bGF0ZSgpOwogICAgICB9CiAgICB9CgogICAgcHJldkNvbmNVbml0ID0gbmV3VW5pdDsKICB9KTsKCiAgLy8g0KHQvNC10L3QsCDQtdC00LjQvdC40YYg0L7QsdGK0ZHQvNCwCiAgdm9sVW5pdFNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHsKICAgIHZhciBuZXdVbml0ID0gdm9sVW5pdFNlbGVjdC52YWx1ZTsKICAgIHZhciBvbGRVbml0ID0gcHJldlZvbFVuaXQ7CgogICAgdmFyIHYxUGFyc2VkID0gcGFyc2VJbnB1dFZhbHVlKHYxSW5wdXQpOwogICAgdmFyIHYyUGFyc2VkID0gcGFyc2VJbnB1dFZhbHVlKHYySW5wdXQpOwoKICAgIHZhciBuZXdWMSA9IGNvbnZlcnRWb2x1bWVWYWx1ZSh2MVBhcnNlZCwgb2xkVW5pdCwgbmV3VW5pdCk7CiAgICB2YXIgbmV3VjIgPSBjb252ZXJ0Vm9sdW1lVmFsdWUodjJQYXJzZWQsIG9sZFVuaXQsIG5ld1VuaXQpOwoKICAgIHNldElucHV0VmFsdWUodjFJbnB1dCwgbmV3VjEpOwogICAgc2V0SW5wdXRWYWx1ZSh2MklucHV0LCBuZXdWMik7CgogICAgLy8g0JXRgdC70Lgg0YDQtdC30YPQu9GM0YLQsNGCINCx0YvQuyDQsiDQtdC00LjQvdC40YbQsNGFINC+0LHRitGR0LzQsCwg0L/QtdGA0LXRgdGH0LjRgtGL0LLQsNC10LwKICAgIGlmIChmaW5kU2VsZWN0LnZhbHVlID09PSAndjEnIHx8IGZpbmRTZWxlY3QudmFsdWUgPT09ICd2MicpIHsKICAgICAgY2FsY3VsYXRlKCk7CiAgICB9CiAgICAvLyDQntCx0L3QvtCy0LvRj9C10LwgZXh0cmEsINC10YHQu9C4INC+0L0g0L/QvtC60LDQt9Cw0L0KICAgIGlmIChleHRyYUJsb2NrLnN0eWxlLmRpc3BsYXkgIT09ICdub25lJykgewogICAgICB2YXIgZXh0cmFQYXJzZWQgPSBwYXJzZUZsb2F0KGV4dHJhVmFsdWUudGV4dENvbnRlbnQpOwogICAgICBpZiAoIWlzTmFOKGV4dHJhUGFyc2VkKSAmJiBpc0Zpbml0ZShleHRyYVBhcnNlZCkpIHsKICAgICAgICB2YXIgbmV3RXh0cmEgPSBjb252ZXJ0Vm9sdW1lVmFsdWUoZXh0cmFQYXJzZWQsIG9sZFVuaXQsIG5ld1VuaXQpOwogICAgICAgIGlmIChuZXdFeHRyYSAhPT0gbnVsbCAmJiBpc0Zpbml0ZShuZXdFeHRyYSkpIHsKICAgICAgICAgIGV4dHJhVmFsdWUudGV4dENvbnRlbnQgPSBwYXJzZUZsb2F0KG5ld0V4dHJhLnRvRml4ZWQoOCkpOwogICAgICAgICAgZXh0cmFVbml0LnRleHRDb250ZW50ID0gbmV3VW5pdDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBwcmV2Vm9sVW5pdCA9IG5ld1VuaXQ7CiAgfSk7CgogIC8vINCe0LHRgNCw0LHQvtGC0LrQsCDQvdCw0LbQsNGC0LjRjyBFbnRlciDQsiDQv9C+0LvRj9GFINCy0LLQvtC00LAKICB2YXIgYWxsSW5wdXRzID0gW2MxSW5wdXQsIHYxSW5wdXQsIGMySW5wdXQsIHYySW5wdXRdOwogIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsSW5wdXRzLmxlbmd0aDsgaSsrKSB7CiAgICBhbGxJbnB1dHNbaV0uYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGNhbGN1bGF0ZSgpOwogICAgICB9CiAgICB9KTsKICB9CgogIC8vIC0tLSDQmNC90LjRhtC40LDQu9C40LfQsNGG0LjRjyAtLS0KICB1cGRhdGVEaXNhYmxlZEZpZWxkcygpOwogIHByZXZDb25jVW5pdCA9IGNvbmNVbml0U2VsZWN0LnZhbHVlOwogIHByZXZWb2xVbml0ID0gdm9sVW5pdFNlbGVjdC52YWx1ZTsKfSkoKTsK