Калькулятор пересчёта химических единиц концентрации
Мгновенный перевод между молярной, массовой, процентной, нормальной концентрациями, ppm и моляльностью с учётом молярной массы и плотности раствора.
—
Молярная концентрация
моль/л
—
Массовая концентрация
г/л
Как пользоваться
1
Выберите исходную единицу концентрации из выпадающего списка — например, «моль/л», если у вас молярная концентрация.
2
Выберите целевую единицу — ту, в которую нужно пересчитать. Например, «г/л» для приготовления раствора по навеске.
3
Введите числовое значение концентрации и укажите молярную массу вещества. Для пересчётов с процентами также потребуется плотность раствора, для нормальной концентрации — фактор эквивалентности. Ненужные поля автоматически скрываются.
4
Нажмите «Рассчитать». Результат появится в правой панели, а в дополнительных ячейках отобразятся пересчёты в альтернативные единицы.
Примеры использования
Приготовление физиологического раствора NaCl
Требуется 0,9% раствор хлорида натрия. Молярная масса NaCl = 58,44 г/моль, плотность 0,9% раствора ≈ 1,005 г/мл.
Пересчёт: 0,9% → 9,045 г/л (массовая) → 0,155 моль/л (молярная).
Концентрированная соляная кислота (HCl)
Продажная HCl: 37%, плотность 1,19 г/мл, M = 36,46 г/моль.
Пересчёт: 37% → 440,3 г/л → 12,08 моль/л. Именно такое значение используют в лабораторной практике для концентрированной HCl.
Нормальность серной кислоты для титрования
Раствор H2SO4 с концентрацией 0,5 моль/л. Фактор эквивалентности fэкв = 2 (двухосновная кислота).
Пересчёт: 0,5 моль/л → 1,0 н (нормальная концентрация).
Важные нюансы
- Молярная масса зависит от формулы. Убедитесь, что используете точную молекулярную массу вашего вещества (сумма атомных масс). Для кристаллогидратов (например, CuSO4·5H2O) учитывайте воду в формуле.
- Плотность раствора непостоянна. Она зависит от концентрации и температуры. Для точных расчётов используйте справочные таблицы плотности при нужной температуре (обычно 20°C или 25°C). Приближённо для разбавленных водных растворов ρ ≈ 1,0 г/мл.
- ppm для водных растворов. В разбавленных водных растворах 1 ppm ≈ 1 мг/л (плотность принимается за 1,0 г/мл). Для неводных растворителей или концентрированных растворов это приближение не работает.
- Нормальная концентрация зависит от реакции. Фактор эквивалентности определяется числом ионов H+ (для кислот), OH− (для оснований) или числом электронов (для окислительно-восстановительных реакций). Одно и то же вещество может иметь разную нормальность в разных реакциях.
- Техника безопасности. При работе с концентрированными кислотами, щелочами и летучими растворителями обязательно используйте защитные очки, перчатки и вытяжной шкаф. Теоретические расчёты всегда проверяйте экспериментально — фактическая концентрация может отличаться из-за примесей, гигроскопичности или частичного разложения вещества.
Источники данных
- IUPAC Gold Book — Международный союз теоретической и прикладной химии: стандартные определения концентраций (молярность, моляльность, нормальность, массовая доля). doi:10.1351/goldbook
- NIST Chemistry WebBook — Национальный институт стандартов и технологий США: справочные данные по молярным массам и плотностям растворов. webbook.nist.gov/chemistry
- PubChem (NCBI) — Национальный центр биотехнологической информации: молекулярные массы и физико-химические свойства веществ. pubchem.ncbi.nlm.nih.gov
- CRC Handbook of Chemistry and Physics — авторитетный справочник: таблицы плотности водных растворов неорганических веществ при различных температурах и концентрациях. CRC Press, 104th Edition, 2023
- ГОСТ 8.417-2002 — Государственный стандарт РФ: единицы физических величин, включая единицы концентрации и правила их обозначения.
- Для стандартных учебных расчётов используются справочные значения атомных масс элементов (периодическая таблица Д. И. Менделеева) и таблицы плотности растворов из практикумов по общей и аналитической химии.
Калькулятор пересчёта химических единиц концентрации — это онлайн-инструмент для быстрого и точного преобразования между молярной концентрацией (моль/л), массовой концентрацией (г/л), процентной концентрацией (массовая доля, %), нормальной концентрацией (н, N), миллионными долями (ppm) и моляльной концентрацией (моль/кг). Расчёт основан на стандартных химических формулах с использованием молярной массы вещества (г/моль) и плотности раствора (г/мл). Инструмент полезен студентам, лаборантам, инженерам-химикам и преподавателям для приготовления растворов, титрования, аналитической химии и проверки учебных задач.
CihmdW5jdGlvbigpewogIHZhciB3cmFwcGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtY2FsY3VsYXRvci1pZD0iY2hlbS1jb25jZW50cmF0aW9uIl0nKTsKICBpZiAoIXdyYXBwZXIpIHJldHVybjsKCiAgdmFyIGZyb21TZWxlY3QgPSB3cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJy5qcy1mcm9tLXVuaXQnKTsKICB2YXIgdG9TZWxlY3QgPSB3cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJy5qcy10by11bml0Jyk7CiAgdmFyIGlucHV0VmFsdWUgPSB3cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJy5qcy1pbnB1dC12YWx1ZScpOwogIHZhciBtb2xhck1hc3MgPSB3cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJy5qcy1tb2xhci1tYXNzJyk7CiAgdmFyIGRlbnNpdHkgPSB3cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJy5qcy1kZW5zaXR5Jyk7CiAgdmFyIGZhY3RvciA9IHdyYXBwZXIucXVlcnlTZWxlY3RvcignLmpzLWZhY3RvcicpOwogIHZhciBmaWVsZE1vbGFyTWFzcyA9IHdyYXBwZXIucXVlcnlTZWxlY3RvcignLmpzLWZpZWxkLW1vbGFyLW1hc3MnKTsKICB2YXIgZmllbGREZW5zaXR5ID0gd3JhcHBlci5xdWVyeVNlbGVjdG9yKCcuanMtZmllbGQtZGVuc2l0eScpOwogIHZhciBmaWVsZEZhY3RvciA9IHdyYXBwZXIucXVlcnlTZWxlY3RvcignLmpzLWZpZWxkLWZhY3RvcicpOwogIHZhciBlcnJvclZhbHVlID0gd3JhcHBlci5xdWVyeVNlbGVjdG9yKCcuanMtZXJyb3ItdmFsdWUnKTsKICB2YXIgZXJyb3JNb2xhck1hc3MgPSB3cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJy5qcy1lcnJvci1tb2xhci1tYXNzJyk7CiAgdmFyIGVycm9yRGVuc2l0eSA9IHdyYXBwZXIucXVlcnlTZWxlY3RvcignLmpzLWVycm9yLWRlbnNpdHknKTsKICB2YXIgZXJyb3JGYWN0b3IgPSB3cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJy5qcy1lcnJvci1mYWN0b3InKTsKICB2YXIgcmVzdWx0TWFpbiA9IHdyYXBwZXIucXVlcnlTZWxlY3RvcignLmpzLXJlc3VsdC1tYWluJyk7CiAgdmFyIHJlc3VsdE1haW5Vbml0ID0gd3JhcHBlci5xdWVyeVNlbGVjdG9yKCcuanMtcmVzdWx0LW1haW4tdW5pdCcpOwogIHZhciByZXN1bHRNb2xhciA9IHdyYXBwZXIucXVlcnlTZWxlY3RvcignLmpzLXJlc3VsdC1tb2xhcicpOwogIHZhciByZXN1bHRNYXNzID0gd3JhcHBlci5xdWVyeVNlbGVjdG9yKCcuanMtcmVzdWx0LW1hc3MnKTsKICB2YXIgcmVzdWx0UGVyY2VudCA9IHdyYXBwZXIucXVlcnlTZWxlY3RvcignLmpzLXJlc3VsdC1wZXJjZW50Jyk7CiAgdmFyIGNhbGN1bGF0ZUJ0biA9IHdyYXBwZXIucXVlcnlTZWxlY3RvcignLmpzLWNhbGN1bGF0ZS1idG4nKTsKICB2YXIgcmVzZXRCdG4gPSB3cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoJy5qcy1yZXNldC1idG4nKTsKCiAgdmFyIHVuaXRMYWJlbHMgPSB7CiAgICAnbW9sX2wnOiAn0LzQvtC70Ywv0LsnLAogICAgJ2dfbCc6ICfQsy/QuycsCiAgICAncGVyY2VudCc6ICclJywKICAgICdub3JtJzogJ9C9JywKICAgICdwcG0nOiAncHBtJywKICAgICdtb2xfa2cnOiAn0LzQvtC70Ywv0LrQsycKICB9OwoKICBmdW5jdGlvbiBjbGVhckVycm9ycygpIHsKICAgIGVycm9yVmFsdWUudGV4dENvbnRlbnQgPSAnJzsKICAgIGVycm9yTW9sYXJNYXNzLnRleHRDb250ZW50ID0gJyc7CiAgICBlcnJvckRlbnNpdHkudGV4dENvbnRlbnQgPSAnJzsKICAgIGVycm9yRmFjdG9yLnRleHRDb250ZW50ID0gJyc7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVGaWVsZFZpc2liaWxpdHkoKSB7CiAgICB2YXIgZnJvbSA9IGZyb21TZWxlY3QudmFsdWU7CiAgICB2YXIgdG8gPSB0b1NlbGVjdC52YWx1ZTsKICAgIHZhciB1bml0cyA9IFtmcm9tLCB0b107CgogICAgdmFyIG5lZWRzTW9sYXJNYXNzID0gdHJ1ZTsKICAgIGlmICgoZnJvbSA9PT0gJ2dfbCcgJiYgdG8gPT09ICdwZXJjZW50JykgfHwgKGZyb20gPT09ICdwZXJjZW50JyAmJiB0byA9PT0gJ2dfbCcpKSB7CiAgICAgIG5lZWRzTW9sYXJNYXNzID0gZmFsc2U7CiAgICB9CiAgICBpZiAobmVlZHNNb2xhck1hc3MpIHsKICAgICAgZmllbGRNb2xhck1hc3MuY2xhc3NMaXN0LnJlbW92ZSgnbm4tZ2VuLWZpZWxkLWhpZGRlbicpOwogICAgfSBlbHNlIHsKICAgICAgZmllbGRNb2xhck1hc3MuY2xhc3NMaXN0LmFkZCgnbm4tZ2VuLWZpZWxkLWhpZGRlbicpOwogICAgICBtb2xhck1hc3MudmFsdWUgPSAnJzsKICAgICAgZXJyb3JNb2xhck1hc3MudGV4dENvbnRlbnQgPSAnJzsKICAgIH0KCiAgICB2YXIgbmVlZHNEZW5zaXR5ID0gKHVuaXRzLmluZGV4T2YoJ3BlcmNlbnQnKSAhPT0gLTEgfHwgdW5pdHMuaW5kZXhPZignbW9sX2tnJykgIT09IC0xKTsKICAgIGlmIChuZWVkc0RlbnNpdHkpIHsKICAgICAgZmllbGREZW5zaXR5LmNsYXNzTGlzdC5yZW1vdmUoJ25uLWdlbi1maWVsZC1oaWRkZW4nKTsKICAgIH0gZWxzZSB7CiAgICAgIGZpZWxkRGVuc2l0eS5jbGFzc0xpc3QuYWRkKCdubi1nZW4tZmllbGQtaGlkZGVuJyk7CiAgICAgIGRlbnNpdHkudmFsdWUgPSAnJzsKICAgICAgZXJyb3JEZW5zaXR5LnRleHRDb250ZW50ID0gJyc7CiAgICB9CgogICAgdmFyIG5lZWRzRmFjdG9yID0gKHVuaXRzLmluZGV4T2YoJ25vcm0nKSAhPT0gLTEpOwogICAgaWYgKG5lZWRzRmFjdG9yKSB7CiAgICAgIGZpZWxkRmFjdG9yLmNsYXNzTGlzdC5yZW1vdmUoJ25uLWdlbi1maWVsZC1oaWRkZW4nKTsKICAgIH0gZWxzZSB7CiAgICAgIGZpZWxkRmFjdG9yLmNsYXNzTGlzdC5hZGQoJ25uLWdlbi1maWVsZC1oaWRkZW4nKTsKICAgICAgZmFjdG9yLnZhbHVlID0gJyc7CiAgICAgIGVycm9yRmFjdG9yLnRleHRDb250ZW50ID0gJyc7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBnZXROdW1lcmljVmFsdWUoZWwpIHsKICAgIHZhciB2ID0gcGFyc2VGbG9hdChlbC52YWx1ZSk7CiAgICByZXR1cm4gaXNOYU4odikgPyBudWxsIDogdjsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdE51bWJlcihudW0pIHsKICAgIGlmIChudW0gPT09IG51bGwgfHwgbnVtID09PSB1bmRlZmluZWQgfHwgIWlzRmluaXRlKG51bSkpIHJldHVybiAn4oCUJzsKICAgIGlmIChudW0gPT09IDApIHJldHVybiAnMCc7CiAgICB2YXIgYWJzTnVtID0gTWF0aC5hYnMobnVtKTsKICAgIGlmIChhYnNOdW0gPCAxZS0xMCkgcmV0dXJuICcwJzsKICAgIGlmIChhYnNOdW0gPCAwLjAwMDEgfHwgYWJzTnVtID49IDEwMDAwMCkgewogICAgICByZXR1cm4gbnVtLnRvRXhwb25lbnRpYWwoNCk7CiAgICB9CiAgICBpZiAoYWJzTnVtIDwgMC4wMSkgcmV0dXJuIG51bS50b1ByZWNpc2lvbigzKTsKICAgIGlmIChhYnNOdW0gPCAxKSByZXR1cm4gbnVtLnRvUHJlY2lzaW9uKDQpOwogICAgaWYgKGFic051bSA8IDEwMDApIHJldHVybiBudW0udG9QcmVjaXNpb24oNSk7CiAgICByZXR1cm4gbnVtLnRvUHJlY2lzaW9uKDYpOwogIH0KCiAgZnVuY3Rpb24gY29udmVydFRvTW9sYXIodmFsdWUsIGZyb21Vbml0LCBNLCByaG8sIGZlcSkgewogICAgc3dpdGNoIChmcm9tVW5pdCkgewogICAgICBjYXNlICdtb2xfbCc6IHJldHVybiB2YWx1ZTsKICAgICAgY2FzZSAnZ19sJzogcmV0dXJuIChNICYmIE0gPiAwKSA/IHZhbHVlIC8gTSA6IG51bGw7CiAgICAgIGNhc2UgJ3BlcmNlbnQnOiByZXR1cm4gKE0gJiYgTSA+IDAgJiYgcmhvICYmIHJobyA+IDApID8gKHZhbHVlICogMTAgKiByaG8pIC8gTSA6IG51bGw7CiAgICAgIGNhc2UgJ25vcm0nOiByZXR1cm4gKGZlcSAmJiBmZXEgPiAwKSA/IHZhbHVlIC8gZmVxIDogbnVsbDsKICAgICAgY2FzZSAncHBtJzogcmV0dXJuIChNICYmIE0gPiAwKSA/IHZhbHVlIC8gKE0gKiAxMDAwKSA6IG51bGw7CiAgICAgIGNhc2UgJ21vbF9rZyc6CiAgICAgICAgaWYgKE0gJiYgTSA+IDAgJiYgcmhvICYmIHJobyA+IDApIHsKICAgICAgICAgIHZhciBkZW5vbSA9IDEgKyB2YWx1ZSAqIE0gLyAxMDAwOwogICAgICAgICAgaWYgKGRlbm9tIDw9IDApIHJldHVybiBudWxsOwogICAgICAgICAgcmV0dXJuICh2YWx1ZSAqIHJobykgLyBkZW5vbTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY29udmVydEZyb21Nb2xhcihtb2xhclZhbHVlLCB0b1VuaXQsIE0sIHJobywgZmVxKSB7CiAgICBzd2l0Y2ggKHRvVW5pdCkgewogICAgICBjYXNlICdtb2xfbCc6IHJldHVybiBtb2xhclZhbHVlOwogICAgICBjYXNlICdnX2wnOiByZXR1cm4gKE0gJiYgTSA+IDApID8gbW9sYXJWYWx1ZSAqIE0gOiBudWxsOwogICAgICBjYXNlICdwZXJjZW50JzogcmV0dXJuIChNICYmIE0gPiAwICYmIHJobyAmJiByaG8gPiAwKSA/IChtb2xhclZhbHVlICogTSkgLyAoMTAgKiByaG8pIDogbnVsbDsKICAgICAgY2FzZSAnbm9ybSc6IHJldHVybiAoZmVxICYmIGZlcSA+IDApID8gbW9sYXJWYWx1ZSAqIGZlcSA6IG51bGw7CiAgICAgIGNhc2UgJ3BwbSc6IHJldHVybiAoTSAmJiBNID4gMCkgPyBtb2xhclZhbHVlICogTSAqIDEwMDAgOiBudWxsOwogICAgICBjYXNlICdtb2xfa2cnOgogICAgICAgIGlmIChNICYmIE0gPiAwICYmIHJobyAmJiByaG8gPiAwKSB7CiAgICAgICAgICB2YXIgZGVub20gPSByaG8gLSBtb2xhclZhbHVlICogTSAvIDEwMDA7CiAgICAgICAgICBpZiAoZGVub20gPD0gMWUtMTApIHJldHVybiBudWxsOwogICAgICAgICAgcmV0dXJuIG1vbGFyVmFsdWUgLyBkZW5vbTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY2FsY3VsYXRlKCkgewogICAgY2xlYXJFcnJvcnMoKTsKICAgIHZhciBmcm9tID0gZnJvbVNlbGVjdC52YWx1ZTsKICAgIHZhciB0byA9IHRvU2VsZWN0LnZhbHVlOwogICAgdmFyIHZhbHVlID0gZ2V0TnVtZXJpY1ZhbHVlKGlucHV0VmFsdWUpOwogICAgdmFyIE0gPSBnZXROdW1lcmljVmFsdWUobW9sYXJNYXNzKTsKICAgIHZhciByaG8gPSBnZXROdW1lcmljVmFsdWUoZGVuc2l0eSk7CiAgICB2YXIgZmVxID0gZ2V0TnVtZXJpY1ZhbHVlKGZhY3Rvcik7CgogICAgdmFyIGhhc0Vycm9yID0gZmFsc2U7CgogICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlIDwgMCkgewogICAgICBlcnJvclZhbHVlLnRleHRDb250ZW50ID0gJ9CS0LLQtdC00LjRgtC1INC90LXQvtGC0YDQuNGG0LDRgtC10LvRjNC90L7QtSDRh9C40YHQu9C+JzsKICAgICAgaGFzRXJyb3IgPSB0cnVlOwogICAgfQogICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlIDwgMCkgewogICAgICBlcnJvclZhbHVlLnRleHRDb250ZW50ID0gJ9Ca0L7QvdGG0LXQvdGC0YDQsNGG0LjRjyDQvdC1INC80L7QttC10YIg0LHRi9GC0Ywg0L7RgtGA0LjRhtCw0YLQtdC70YzQvdC+0LknOwogICAgICBoYXNFcnJvciA9IHRydWU7CiAgICB9CgogICAgdmFyIG5lZWRzTW9sYXJNYXNzID0gISgoZnJvbSA9PT0gJ2dfbCcgJiYgdG8gPT09ICdwZXJjZW50JykgfHwgKGZyb20gPT09ICdwZXJjZW50JyAmJiB0byA9PT0gJ2dfbCcpKTsKICAgIGlmIChuZWVkc01vbGFyTWFzcykgewogICAgICBpZiAoTSA9PT0gbnVsbCB8fCBNIDw9IDApIHsKICAgICAgICBlcnJvck1vbGFyTWFzcy50ZXh0Q29udGVudCA9ICfQktCy0LXQtNC40YLQtSDQv9C+0LvQvtC20LjRgtC10LvRjNC90L7QtSDQt9C90LDRh9C10L3QuNC1INC80L7Qu9GP0YDQvdC+0Lkg0LzQsNGB0YHRiyc7CiAgICAgICAgaGFzRXJyb3IgPSB0cnVlOwogICAgICB9CiAgICB9CgogICAgdmFyIHVuaXRzID0gW2Zyb20sIHRvXTsKICAgIHZhciBuZWVkc0RlbnNpdHkgPSAodW5pdHMuaW5kZXhPZigncGVyY2VudCcpICE9PSAtMSB8fCB1bml0cy5pbmRleE9mKCdtb2xfa2cnKSAhPT0gLTEpOwogICAgaWYgKG5lZWRzRGVuc2l0eSkgewogICAgICBpZiAocmhvID09PSBudWxsIHx8IHJobyA8PSAwKSB7CiAgICAgICAgZXJyb3JEZW5zaXR5LnRleHRDb250ZW50ID0gJ9CS0LLQtdC00LjRgtC1INC/0L7Qu9C+0LbQuNGC0LXQu9GM0L3QvtC1INC30L3QsNGH0LXQvdC40LUg0L/Qu9C+0YLQvdC+0YHRgtC4JzsKICAgICAgICBoYXNFcnJvciA9IHRydWU7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgbmVlZHNGYWN0b3IgPSAodW5pdHMuaW5kZXhPZignbm9ybScpICE9PSAtMSk7CiAgICBpZiAobmVlZHNGYWN0b3IpIHsKICAgICAgaWYgKGZlcSA9PT0gbnVsbCB8fCBmZXEgPD0gMCkgewogICAgICAgIGVycm9yRmFjdG9yLnRleHRDb250ZW50ID0gJ9CS0LLQtdC00LjRgtC1INC/0L7Qu9C+0LbQuNGC0LXQu9GM0L3Ri9C5INGE0LDQutGC0L7RgCDRjdC60LLQuNCy0LDQu9C10L3RgtC90L7RgdGC0LgnOwogICAgICAgIGhhc0Vycm9yID0gdHJ1ZTsKICAgICAgfQogICAgfQoKICAgIGlmIChoYXNFcnJvcikgewogICAgICByZXN1bHRNYWluLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICAgIHJlc3VsdE1haW5Vbml0LnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICAgIHJlc3VsdE1vbGFyLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICAgIHJlc3VsdE1hc3MudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgcmVzdWx0UGVyY2VudC50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKHZhbHVlID09PSBudWxsKSB2YWx1ZSA9IDA7CiAgICBpZiAobmVlZHNNb2xhck1hc3MgJiYgTSA9PT0gbnVsbCkgTSA9IDE7CiAgICBpZiAobmVlZHNEZW5zaXR5ICYmIHJobyA9PT0gbnVsbCkgcmhvID0gMTsKICAgIGlmIChuZWVkc0ZhY3RvciAmJiBmZXEgPT09IG51bGwpIGZlcSA9IDE7CgogICAgdmFyIG1vbGFySW50ZXJtZWRpYXRlID0gY29udmVydFRvTW9sYXIodmFsdWUsIGZyb20sIE0sIHJobywgZmVxKTsKICAgIGlmIChtb2xhckludGVybWVkaWF0ZSA9PT0gbnVsbCB8fCAhaXNGaW5pdGUobW9sYXJJbnRlcm1lZGlhdGUpKSB7CiAgICAgIHJlc3VsdE1haW4udGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgcmVzdWx0TWFpblVuaXQudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgcmVzdWx0TW9sYXIudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgcmVzdWx0TWFzcy50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICByZXN1bHRQZXJjZW50LnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICAgIGVycm9yVmFsdWUudGV4dENvbnRlbnQgPSAn0J7RiNC40LHQutCwINGA0LDRgdGH0ZHRgtCwOiDQv9GA0L7QstC10YDRjNGC0LUg0LLQstC10LTRkdC90L3Ri9C1INC00LDQvdC90YvQtSc7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgbWFpblJlc3VsdCA9IGNvbnZlcnRGcm9tTW9sYXIobW9sYXJJbnRlcm1lZGlhdGUsIHRvLCBNLCByaG8sIGZlcSk7CiAgICBpZiAobWFpblJlc3VsdCA9PT0gbnVsbCB8fCAhaXNGaW5pdGUobWFpblJlc3VsdCkpIHsKICAgICAgcmVzdWx0TWFpbi50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICByZXN1bHRNYWluVW5pdC50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICByZXN1bHRNb2xhci50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICByZXN1bHRNYXNzLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICAgIHJlc3VsdFBlcmNlbnQudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgZXJyb3JWYWx1ZS50ZXh0Q29udGVudCA9ICfQntGI0LjQsdC60LAg0YDQsNGB0YfRkdGC0LA6INCy0L7Qt9C80L7QttC90L4sINC30L3QsNC80LXQvdCw0YLQtdC70Ywg0L7QsdGA0LDRgtC40LvRgdGPINCyINC90L7Qu9GMICjRgdC70LjRiNC60L7QvCDQstGL0YHQvtC60LDRjyDQutC+0L3RhtC10L3RgtGA0LDRhtC40Y8g0LTQu9GPINC80L7Qu9GP0LvRjNC90L7Qs9C+INC/0LXRgNC10YHRh9GR0YLQsCknOwogICAgICByZXR1cm47CiAgICB9CgogICAgcmVzdWx0TWFpbi50ZXh0Q29udGVudCA9IGZvcm1hdE51bWJlcihtYWluUmVzdWx0KTsKICAgIHJlc3VsdE1haW5Vbml0LnRleHRDb250ZW50ID0gdW5pdExhYmVsc1t0b10gfHwgdG87CgogICAgdmFyIG1vbGFyRGlzcGxheSA9IG51bGw7CiAgICBpZiAodG8gPT09ICdtb2xfbCcpIHsKICAgICAgbW9sYXJEaXNwbGF5ID0gbWFpblJlc3VsdDsKICAgIH0gZWxzZSB7CiAgICAgIG1vbGFyRGlzcGxheSA9IGNvbnZlcnRGcm9tTW9sYXIobW9sYXJJbnRlcm1lZGlhdGUsICdtb2xfbCcsIE0sIHJobywgZmVxKTsKICAgIH0KICAgIHJlc3VsdE1vbGFyLnRleHRDb250ZW50ID0gZm9ybWF0TnVtYmVyKG1vbGFyRGlzcGxheSk7CgogICAgdmFyIG1hc3NEaXNwbGF5ID0gbnVsbDsKICAgIGlmICh0byA9PT0gJ2dfbCcpIHsKICAgICAgbWFzc0Rpc3BsYXkgPSBtYWluUmVzdWx0OwogICAgfSBlbHNlIHsKICAgICAgbWFzc0Rpc3BsYXkgPSBjb252ZXJ0RnJvbU1vbGFyKG1vbGFySW50ZXJtZWRpYXRlLCAnZ19sJywgTSwgcmhvLCBmZXEpOwogICAgfQogICAgcmVzdWx0TWFzcy50ZXh0Q29udGVudCA9IGZvcm1hdE51bWJlcihtYXNzRGlzcGxheSk7CgogICAgdmFyIHBlcmNlbnREaXNwbGF5ID0gbnVsbDsKICAgIGlmICh0byA9PT0gJ3BlcmNlbnQnKSB7CiAgICAgIHBlcmNlbnREaXNwbGF5ID0gbWFpblJlc3VsdDsKICAgIH0gZWxzZSB7CiAgICAgIHBlcmNlbnREaXNwbGF5ID0gY29udmVydEZyb21Nb2xhcihtb2xhckludGVybWVkaWF0ZSwgJ3BlcmNlbnQnLCBNLCByaG8sIGZlcSk7CiAgICB9CiAgICByZXN1bHRQZXJjZW50LnRleHRDb250ZW50ID0gZm9ybWF0TnVtYmVyKHBlcmNlbnREaXNwbGF5KTsKICB9CgogIGZ1bmN0aW9uIHJlc2V0QWxsKCkgewogICAgaW5wdXRWYWx1ZS52YWx1ZSA9ICcnOwogICAgbW9sYXJNYXNzLnZhbHVlID0gJyc7CiAgICBkZW5zaXR5LnZhbHVlID0gJyc7CiAgICBmYWN0b3IudmFsdWUgPSAnJzsKICAgIGNsZWFyRXJyb3JzKCk7CiAgICByZXN1bHRNYWluLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICByZXN1bHRNYWluVW5pdC50ZXh0Q29udGVudCA9ICfigJQnOwogICAgcmVzdWx0TW9sYXIudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgIHJlc3VsdE1hc3MudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgIHJlc3VsdFBlcmNlbnQudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgIGZyb21TZWxlY3QudmFsdWUgPSAnbW9sX2wnOwogICAgdG9TZWxlY3QudmFsdWUgPSAnZ19sJzsKICAgIHVwZGF0ZUZpZWxkVmlzaWJpbGl0eSgpOwogIH0KCiAgZnJvbVNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHsKICAgIHVwZGF0ZUZpZWxkVmlzaWJpbGl0eSgpOwogICAgY2xlYXJFcnJvcnMoKTsKICB9KTsKCiAgdG9TZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24oKSB7CiAgICB1cGRhdGVGaWVsZFZpc2liaWxpdHkoKTsKICAgIGNsZWFyRXJyb3JzKCk7CiAgfSk7CgogIGNhbGN1bGF0ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgY2FsY3VsYXRlKCk7CiAgfSk7CgogIHJlc2V0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICByZXNldEFsbCgpOwogIH0pOwoKICB1cGRhdGVGaWVsZFZpc2liaWxpdHkoKTsKfSkoKTsK