Калькулятор плотности раствора
Расчёт плотности жидкого раствора по массе и объёму либо по массовой доле и плотностям компонентов с допущением аддитивности объёмов.
—
Плотность раствора
г/мл
—
Плотность раствора
кг/м³
—
Масса 1 литра раствора
кг
Как пользоваться калькулятором
1
Выберите режим расчёта: «По массе и объёму» — если вы experimentally измерили массу и объём готового раствора; «По составу и плотностям компонентов» — если знаете массовую долю вещества и табличные плотности чистых компонентов при нужной температуре.
2
Заполните поля ввода. Для режима по массе и объёму укажите, например, массу 250 г и объём 215 мл. Для режима по составу: массовая доля 40%, плотность растворителя (вода при 20°C — 0.9982 г/мл), плотность вещества (сахароза — 1.59 г/мл). Все значения должны быть положительными числами. Поля, отмеченные *, обязательны для заполнения.
3
Нажмите кнопку «Рассчитать». Результат появится в правой панели: плотность в г/мл и кг/м³, а также масса одного литра раствора в килограммах. При некорректных данных появится сообщение об ошибке.
4
Кнопка «Сбросить» очищает все поля и возвращает результат к исходному состоянию. Вы можете повторять расчёт многократно с разными параметрами.
Примеры использования
Солевой раствор (режим «По массе и объёму»)
Масса раствора: 250 г, объём: 215 мл. Результат: плотность ≈ 1.163 г/мл (1163 кг/м³), масса 1 литра ≈ 1.163 кг. Типичный рассол для маринования.
Сахарный сироп (режим «По составу»)
Массовая доля сахарозы: 40%, плотность сахарозы: 1.59 г/мл, плотность воды: 0.9982 г/мл (20°C). Результат: плотность ≈ 1.173 г/мл (1173 кг/м³), масса 1 литра ≈ 1.173 кг. Оценка без учёта контракции объёма; реальная плотность немного выше.
Водно-этанольная смесь (режим «По составу»)
Массовая доля этанола: 40%, плотность этанола: 0.789 г/мл, плотность воды: 0.9982 г/мл (20°C). Результат: плотность ≈ 0.902 г/мл (902 кг/м³), масса 1 литра ≈ 0.902 кг. Реальная плотность ~0.935 г/мл из-за значительной контракции; калькулятор даёт нижнюю оценку.
Важные нюансы
- Допущение об аддитивности объёмов. В режиме «По составу» калькулятор предполагает, что объём раствора равен сумме объёмов компонентов. В реальности при смешивании может происходить контракция (уменьшение общего объёма) или расширение. Для растворов спиртов, кислот и щелочей отклонения могут достигать нескольких процентов. Используйте результат как оценочный; для точных значений обращайтесь к справочным таблицам плотности.
- Температурная зависимость. Плотность жидкостей существенно зависит от температуры. Калькулятор не учитывает температуру напрямую — вы должны ввести плотности компонентов при интересующей вас температуре. Плотность воды при 20°C составляет ~0.9982 г/мл, при 25°C — ~0.9970 г/мл, при 4°C — ровно 1.0000 г/мл.
- Массовая доля от 0 до 100%. Калькулятор принимает значения массовой доли строго в интервале от 0 до 100 процентов. Значение 0% соответствует чистому растворителю, 100% — чистому растворённому веществу. При 0% плотность раствора равна плотности растворителя.
- Единицы измерения. Все входные плотности ожидаются в г/мл (что численно равно г/см³ и кг/л). Масса — в граммах, объём — в миллилитрах. Результат выводится в г/мл, кг/м³ и в виде массы 1 литра (кг). 1 г/мл = 1000 кг/м³.
- Предупреждение по технике безопасности. При работе с химическими веществами всегда используйте средства индивидуальной защиты (очки, перчатки, халат). Некоторые вещества (концентрированные кислоты, щёлочи, органические растворители) требуют работы в вытяжном шкафу. Данный калькулятор не заменяет справочные таблицы для ответственных лабораторных расчётов и приготовления растворов точной концентрации.
Источники данных
- IUPAC Gold Book — Международный союз теоретической и прикладной химии (IUPAC). Compendium of Chemical Terminology, 2nd ed. DOI: 10.1351/goldbook. Термины: density, mass fraction, solution. goldbook.iupac.org
- NIST Chemistry WebBook — National Institute of Standards and Technology, США. База данных термохимических и физико-химических свойств веществ, включая плотности чистых жидкостей при различных температурах. webbook.nist.gov/chemistry/
- CRC Handbook of Chemistry and Physics — Справочник под редакцией W. M. Haynes, 97th Edition, CRC Press. Таблицы плотности водных растворов неорганических и органических веществ, концентрационные таблицы.
- Справочник химика (под ред. Б. П. Никольского), том 3 — Фундаментальный советский/российский справочник с обширными таблицами плотности растворов солей, кислот, щелочей и органических веществ. Издательство «Химия».
Калькулятор плотности раствора позволяет быстро оценить плотность жидкой смеси двумя способами: прямым делением массы на объём либо расчётным путём через массовую долю и справочные плотности компонентов. Инструмент полезен студентам-химикам, лаборантам, технологам пищевых производств и всем, кто работает с приготовлением растворов. Для точных лабораторных работ рекомендуется сверять результаты с сертифицированными справочными таблицами, учитывающими нелинейные эффекты смешивания и температурные поправки.
CiAgKGZ1bmN0aW9uKCkgewogICAgdmFyIG1vZGVSYWRpb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPSJjYWxjLW1vZGUiXScpOwogICAgdmFyIG1vZGVGaWVsZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubm4tZ2VuLWNhbC1tb2RlLWZpZWxkcycpOwogICAgdmFyIG1hc3NJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXNzLWlucHV0Jyk7CiAgICB2YXIgdm9sdW1lSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndm9sdW1lLWlucHV0Jyk7CiAgICB2YXIgbWFzc0ZyYWN0aW9uSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFzcy1mcmFjdGlvbi1pbnB1dCcpOwogICAgdmFyIHNvbHZlbnREZW5zaXR5SW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc29sdmVudC1kZW5zaXR5LWlucHV0Jyk7CiAgICB2YXIgc29sdXRlRGVuc2l0eUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NvbHV0ZS1kZW5zaXR5LWlucHV0Jyk7CiAgICB2YXIgY2FsY3VsYXRlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbGN1bGF0ZS1idG4nKTsKICAgIHZhciByZXNldEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXNldC1idG4nKTsKICAgIHZhciBlcnJvck1zZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWxjLWVycm9yJyk7CiAgICB2YXIgcmVzdWx0RGVuc2l0eU1haW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0LWRlbnNpdHktbWFpbicpOwogICAgdmFyIHJlc3VsdERlbnNpdHlLZ20zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdC1kZW5zaXR5LWtnbTMnKTsKICAgIHZhciByZXN1bHRMaXRlck1hc3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0LWxpdGVyLW1hc3MnKTsKCiAgICBmdW5jdGlvbiBnZXRDdXJyZW50TW9kZSgpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlUmFkaW9zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKG1vZGVSYWRpb3NbaV0uY2hlY2tlZCkgewogICAgICAgICAgcmV0dXJuIG1vZGVSYWRpb3NbaV0udmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiAnbWFzcy12b2x1bWUnOwogICAgfQoKICAgIGZ1bmN0aW9uIHN3aXRjaE1vZGVGaWVsZHMobW9kZSkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVGaWVsZHMubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAobW9kZUZpZWxkc1tpXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtbW9kZScpID09PSBtb2RlKSB7CiAgICAgICAgICBtb2RlRmllbGRzW2ldLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBtb2RlRmllbGRzW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpOwogICAgICAgIH0KICAgICAgfQogICAgICBoaWRlRXJyb3IoKTsKICAgICAgcmVzZXRSZXN1bHRzKCk7CiAgICB9CgogICAgZnVuY3Rpb24gaGlkZUVycm9yKCkgewogICAgICBlcnJvck1zZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICBlcnJvck1zZy50ZXh0Q29udGVudCA9ICcnOwogICAgfQoKICAgIGZ1bmN0aW9uIHNob3dFcnJvcihtZXNzYWdlKSB7CiAgICAgIGVycm9yTXNnLnRleHRDb250ZW50ID0gbWVzc2FnZTsKICAgICAgZXJyb3JNc2cuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICB9CgogICAgZnVuY3Rpb24gcmVzZXRSZXN1bHRzKCkgewogICAgICByZXN1bHREZW5zaXR5TWFpbi50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICByZXN1bHREZW5zaXR5S2dtMy50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICByZXN1bHRMaXRlck1hc3MudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgIH0KCiAgICBmdW5jdGlvbiBpc1ZhbGlkUG9zaXRpdmVOdW1iZXIodmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09ICcnICYmICFpc05hTih2YWx1ZSkgJiYgaXNGaW5pdGUodmFsdWUpICYmIHZhbHVlID4gMDsKICAgIH0KCiAgICBmdW5jdGlvbiBpc1ZhbGlkTm9uTmVnYXRpdmVOdW1iZXIodmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09ICcnICYmICFpc05hTih2YWx1ZSkgJiYgaXNGaW5pdGUodmFsdWUpICYmIHZhbHVlID49IDA7CiAgICB9CgogICAgZnVuY3Rpb24gY2FsY3VsYXRlTWFzc1ZvbHVtZSgpIHsKICAgICAgdmFyIG1hc3NSYXcgPSBtYXNzSW5wdXQudmFsdWUudHJpbSgpOwogICAgICB2YXIgdm9sdW1lUmF3ID0gdm9sdW1lSW5wdXQudmFsdWUudHJpbSgpOwoKICAgICAgaWYgKG1hc3NSYXcgPT09ICcnIHx8IHZvbHVtZVJhdyA9PT0gJycpIHsKICAgICAgICBzaG93RXJyb3IoJ9Cf0L7QttCw0LvRg9C50YHRgtCwLCDQt9Cw0L/QvtC70L3QuNGC0LUg0L7QsdCwINC/0L7Qu9GPOiDQvNCw0YHRgdGDINC4INC+0LHRitGR0Lwg0YDQsNGB0YLQstC+0YDQsC4nKTsKICAgICAgICByZXNldFJlc3VsdHMoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHZhciBtYXNzID0gcGFyc2VGbG9hdChtYXNzUmF3KTsKICAgICAgdmFyIHZvbHVtZSA9IHBhcnNlRmxvYXQodm9sdW1lUmF3KTsKCiAgICAgIGlmICghaXNWYWxpZFBvc2l0aXZlTnVtYmVyKG1hc3MpKSB7CiAgICAgICAgc2hvd0Vycm9yKCfQnNCw0YHRgdCwINGA0LDRgdGC0LLQvtGA0LAg0LTQvtC70LbQvdCwINCx0YvRgtGMINC/0L7Qu9C+0LbQuNGC0LXQu9GM0L3Ri9C8INGH0LjRgdC70L7QvC4nKTsKICAgICAgICByZXNldFJlc3VsdHMoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKCFpc1ZhbGlkUG9zaXRpdmVOdW1iZXIodm9sdW1lKSkgewogICAgICAgIHNob3dFcnJvcign0J7QsdGK0ZHQvCDRgNCw0YHRgtCy0L7RgNCwINC00L7Qu9C20LXQvSDQsdGL0YLRjCDQv9C+0LvQvtC20LjRgtC10LvRjNC90YvQvCDRh9C40YHQu9C+0LwuJyk7CiAgICAgICAgcmVzZXRSZXN1bHRzKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICB2YXIgZGVuc2l0eSA9IG1hc3MgLyB2b2x1bWU7CiAgICAgIGlmICghaXNGaW5pdGUoZGVuc2l0eSkgfHwgZGVuc2l0eSA8PSAwKSB7CiAgICAgICAgc2hvd0Vycm9yKCfQndC10LrQvtGA0YDQtdC60YLQvdGL0Lkg0YDQtdC30YPQu9GM0YLQsNGCLiDQn9GA0L7QstC10YDRjNGC0LUg0LLQstC10LTRkdC90L3Ri9C1INC30L3QsNGH0LXQvdC40Y8uJyk7CiAgICAgICAgcmVzZXRSZXN1bHRzKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBkaXNwbGF5UmVzdWx0cyhkZW5zaXR5KTsKICAgICAgaGlkZUVycm9yKCk7CiAgICB9CgogICAgZnVuY3Rpb24gY2FsY3VsYXRlQ29tcG9zaXRpb24oKSB7CiAgICAgIHZhciBtYXNzRnJhY1JhdyA9IG1hc3NGcmFjdGlvbklucHV0LnZhbHVlLnRyaW0oKTsKICAgICAgdmFyIHNvbHZEZW5zUmF3ID0gc29sdmVudERlbnNpdHlJbnB1dC52YWx1ZS50cmltKCk7CiAgICAgIHZhciBzb2x1RGVuc1JhdyA9IHNvbHV0ZURlbnNpdHlJbnB1dC52YWx1ZS50cmltKCk7CgogICAgICBpZiAobWFzc0ZyYWNSYXcgPT09ICcnIHx8IHNvbHZEZW5zUmF3ID09PSAnJyB8fCBzb2x1RGVuc1JhdyA9PT0gJycpIHsKICAgICAgICBzaG93RXJyb3IoJ9Cf0L7QttCw0LvRg9C50YHRgtCwLCDQt9Cw0L/QvtC70L3QuNGC0LUg0LLRgdC1INC/0L7Qu9GPOiDQvNCw0YHRgdC+0LLRg9GOINC00L7Qu9GOINC4INC/0LvQvtGC0L3QvtGB0YLQuCDQutC+0LzQv9C+0L3QtdC90YLQvtCyLicpOwogICAgICAgIHJlc2V0UmVzdWx0cygpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgdmFyIHcgPSBwYXJzZUZsb2F0KG1hc3NGcmFjUmF3KTsKICAgICAgdmFyIHJob1NvbHZlbnQgPSBwYXJzZUZsb2F0KHNvbHZEZW5zUmF3KTsKICAgICAgdmFyIHJob1NvbHV0ZSA9IHBhcnNlRmxvYXQoc29sdURlbnNSYXcpOwoKICAgICAgaWYgKCFpc1ZhbGlkTm9uTmVnYXRpdmVOdW1iZXIodykgfHwgdyA+IDEwMCkgewogICAgICAgIHNob3dFcnJvcign0JzQsNGB0YHQvtCy0LDRjyDQtNC+0LvRjyDQtNC+0LvQttC90LAg0LHRi9GC0Ywg0YfQuNGB0LvQvtC8INC+0YIgMCDQtNC+IDEwMCDQv9GA0L7RhtC10L3RgtC+0LIuJyk7CiAgICAgICAgcmVzZXRSZXN1bHRzKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICghaXNWYWxpZFBvc2l0aXZlTnVtYmVyKHJob1NvbHZlbnQpKSB7CiAgICAgICAgc2hvd0Vycm9yKCfQn9C70L7RgtC90L7RgdGC0Ywg0YDQsNGB0YLQstC+0YDQuNGC0LXQu9GPINC00L7Qu9C20L3QsCDQsdGL0YLRjCDQv9C+0LvQvtC20LjRgtC10LvRjNC90YvQvCDRh9C40YHQu9C+0LwuJyk7CiAgICAgICAgcmVzZXRSZXN1bHRzKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICghaXNWYWxpZFBvc2l0aXZlTnVtYmVyKHJob1NvbHV0ZSkpIHsKICAgICAgICBzaG93RXJyb3IoJ9Cf0LvQvtGC0L3QvtGB0YLRjCDRgNCw0YHRgtCy0L7RgNGR0L3QvdC+0LPQviDQstC10YnQtdGB0YLQstCwINC00L7Qu9C20L3QsCDQsdGL0YLRjCDQv9C+0LvQvtC20LjRgtC10LvRjNC90YvQvCDRh9C40YHQu9C+0LwuJyk7CiAgICAgICAgcmVzZXRSZXN1bHRzKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBpZiAodyA9PT0gMCkgewogICAgICAgIGRpc3BsYXlSZXN1bHRzKHJob1NvbHZlbnQpOwogICAgICAgIGhpZGVFcnJvcigpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAodyA9PT0gMTAwKSB7CiAgICAgICAgZGlzcGxheVJlc3VsdHMocmhvU29sdXRlKTsKICAgICAgICBoaWRlRXJyb3IoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHZhciB2U29sdXRlID0gdyAvIHJob1NvbHV0ZTsKICAgICAgdmFyIHZTb2x2ZW50ID0gKDEwMCAtIHcpIC8gcmhvU29sdmVudDsKICAgICAgdmFyIHRvdGFsVm9sdW1lID0gdlNvbHV0ZSArIHZTb2x2ZW50OwoKICAgICAgaWYgKHRvdGFsVm9sdW1lIDw9IDAgfHwgIWlzRmluaXRlKHRvdGFsVm9sdW1lKSkgewogICAgICAgIHNob3dFcnJvcign0J3QtdC60L7RgNGA0LXQutGC0L3Ri9C5INGA0LXQt9GD0LvRjNGC0LDRgi4g0J/RgNC+0LLQtdGA0YzRgtC1INC30L3QsNGH0LXQvdC40Y8g0L/Qu9C+0YLQvdC+0YHRgtC10Lkg0LrQvtC80L/QvtC90LXQvdGC0L7Qsi4nKTsKICAgICAgICByZXNldFJlc3VsdHMoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHZhciBkZW5zaXR5ID0gMTAwIC8gdG90YWxWb2x1bWU7CiAgICAgIGlmICghaXNGaW5pdGUoZGVuc2l0eSkgfHwgZGVuc2l0eSA8PSAwKSB7CiAgICAgICAgc2hvd0Vycm9yKCfQndC10LrQvtGA0YDQtdC60YLQvdGL0Lkg0YDQtdC30YPQu9GM0YLQsNGCINCy0YvRh9C40YHQu9C10L3QuNGPINC/0LvQvtGC0L3QvtGB0YLQuC4nKTsKICAgICAgICByZXNldFJlc3VsdHMoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGRpc3BsYXlSZXN1bHRzKGRlbnNpdHkpOwogICAgICBoaWRlRXJyb3IoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkaXNwbGF5UmVzdWx0cyhkZW5zaXR5R21sKSB7CiAgICAgIHZhciBkZW5zaXR5S2dtMyA9IGRlbnNpdHlHbWwgKiAxMDAwOwogICAgICB2YXIgbGl0ZXJNYXNzID0gZGVuc2l0eUdtbDsKCiAgICAgIHJlc3VsdERlbnNpdHlNYWluLnRleHRDb250ZW50ID0gZm9ybWF0TnVtYmVyKGRlbnNpdHlHbWwsIDQpOwogICAgICByZXN1bHREZW5zaXR5S2dtMy50ZXh0Q29udGVudCA9IGZvcm1hdE51bWJlcihkZW5zaXR5S2dtMywgMSk7CiAgICAgIHJlc3VsdExpdGVyTWFzcy50ZXh0Q29udGVudCA9IGZvcm1hdE51bWJlcihsaXRlck1hc3MsIDMpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdE51bWJlcihudW0sIGRlY2ltYWxzKSB7CiAgICAgIGlmICghaXNGaW5pdGUobnVtKSkgcmV0dXJuICfigJQnOwogICAgICB2YXIgcm91bmRlZCA9IE51bWJlcihudW0udG9GaXhlZChkZWNpbWFscykpOwogICAgICByZXR1cm4gcm91bmRlZC50b1N0cmluZygpOwogICAgfQoKICAgIGZ1bmN0aW9uIGhhbmRsZUNhbGN1bGF0ZSgpIHsKICAgICAgaGlkZUVycm9yKCk7CiAgICAgIHZhciBtb2RlID0gZ2V0Q3VycmVudE1vZGUoKTsKICAgICAgaWYgKG1vZGUgPT09ICdtYXNzLXZvbHVtZScpIHsKICAgICAgICBjYWxjdWxhdGVNYXNzVm9sdW1lKCk7CiAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2NvbXBvc2l0aW9uJykgewogICAgICAgIGNhbGN1bGF0ZUNvbXBvc2l0aW9uKCk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBoYW5kbGVSZXNldCgpIHsKICAgICAgbWFzc0lucHV0LnZhbHVlID0gJyc7CiAgICAgIHZvbHVtZUlucHV0LnZhbHVlID0gJyc7CiAgICAgIG1hc3NGcmFjdGlvbklucHV0LnZhbHVlID0gJyc7CiAgICAgIHNvbHZlbnREZW5zaXR5SW5wdXQudmFsdWUgPSAnMC45OTgyJzsKICAgICAgc29sdXRlRGVuc2l0eUlucHV0LnZhbHVlID0gJyc7CiAgICAgIGhpZGVFcnJvcigpOwogICAgICByZXNldFJlc3VsdHMoKTsKICAgICAgdmFyIGZpcnN0UmFkaW8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPSJjYWxjLW1vZGUiXVt2YWx1ZT0ibWFzcy12b2x1bWUiXScpOwogICAgICBpZiAoZmlyc3RSYWRpbykgewogICAgICAgIGZpcnN0UmFkaW8uY2hlY2tlZCA9IHRydWU7CiAgICAgIH0KICAgICAgc3dpdGNoTW9kZUZpZWxkcygnbWFzcy12b2x1bWUnKTsKICAgIH0KCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVSYWRpb3MubGVuZ3RoOyBpKyspIHsKICAgICAgbW9kZVJhZGlvc1tpXS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHsKICAgICAgICBzd2l0Y2hNb2RlRmllbGRzKGdldEN1cnJlbnRNb2RlKCkpOwogICAgICAgIGhpZGVFcnJvcigpOwogICAgICB9KTsKICAgIH0KCiAgICBjYWxjdWxhdGVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVDYWxjdWxhdGUpOwogICAgcmVzZXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVSZXNldCk7CgogICAgc3dpdGNoTW9kZUZpZWxkcyhnZXRDdXJyZW50TW9kZSgpKTsKICB9KSgpOwo=