Калькулятор степени превращения реагента
Рассчитайте конверсию исходного вещества в химической реакции — долю реагента, вступившего в превращение, в процентах и абсолютных величинах.
—
Осталось непрореагировавшего
моль
Как пользоваться калькулятором
1
Выберите способ расчёта из выпадающего списка — по количествам вещества (моль), по массам (г) или по концентрациям (моль/л). Единицы измерения автоматически подстроятся под выбранный режим.
2
Введите начальное количество реагента до реакции (например, 5 моль или 250 г) и конечное количество после реакции (либо количество прореагировавшего вещества — зависит от режима).
3
Нажмите «Рассчитать». Калькулятор вычислит степень превращения в процентах, а также покажет абсолютные величины прореагировавшего и оставшегося реагента.
4
Для нового расчёта нажмите «Сбросить» — все поля очистятся, результаты обнулятся. При вводе некорректных значений (отрицательные числа, пустые поля) появится предупреждение.
Примеры использования
Омыление этилацетата в лабораторном практикуме
Начальное количество щёлочи — 0,100 моль. После завершения реакции титрованием установлено остаточное количество — 0,023 моль. Степень превращения: 77,0 %. Прореагировало 0,077 моль NaOH, осталось 0,023 моль.
Синтез аспирина (ацетилсалициловой кислоты)
В реакцию взято 5,00 г салициловой кислоты. После очистки выделено непрореагировавшей кислоты 1,25 г. Конверсия салициловой кислоты: 75,0 %. Масса прореагировавшего реагента — 3,75 г, остаток — 1,25 г.
Реакция этерификации в равновесной системе
Исходная концентрация уксусной кислоты — 2,00 моль/л. После установления равновесия концентрация кислоты — 0,70 моль/л. Степень превращения: 65,0 %. Прореагировало 1,30 моль/л, осталось 0,70 моль/л.
Важные нюансы
- Степень превращения (конверсия) не равна выходу продукта. Конверсия показывает долю израсходованного реагента, тогда как выход — долю теоретически возможного продукта, которая реально получена. При побочных реакциях конверсия может быть высокой, а выход целевого продукта — низким.
- Для обратимых реакций степень превращения ограничена равновесием. Даже при бесконечном времени конверсия не достигнет 100 %, если не смещать равновесие (по принципу Ле Шателье — удалением продукта или избытком второго реагента).
- При расчёте по массам убедитесь, что речь идёт об одном и том же веществе. Не путайте массу реагента с массой продукта — молярные массы различаются, и прямое сравнение масс приведёт к ошибке. Калькулятор предполагает, что вы измеряете количество одного и того же химического соединения.
- В режиме расчёта по концентрациям подразумевается, что объём реакционной смеси постоянен. Если объём изменяется в ходе реакции (например, газовыделение или добавление растворителя), необходимо делать поправку на изменение объёма — данный калькулятор её не учитывает.
- Техника безопасности: данный инструмент носит справочно-образовательный характер. При проведении реальных лабораторных работ обязательно соблюдайте правила техники безопасности вашего учебного заведения или лаборатории, используйте средства индивидуальной защиты и работайте под наблюдением квалифицированного руководителя.
- Точность вводимых данных определяет точность результата. Погрешности измерения начального и конечного количеств (взвешивание, титрование, спектрофотометрия) транслируются в погрешность степени превращения. Для ответственных расчётов проводите серию параллельных измерений.
Источники данных
- IUPAC Gold Book — Compendium of Chemical Terminology. Определение степени превращения (conversion, degree of conversion): doi:10.1351/goldbook.C01331.
- NIST Chemistry WebBook — National Institute of Standards and Technology. Справочные данные по термодинамике и кинетике химических реакций, используемые при интерпретации конверсии.
- CRC Handbook of Chemistry and Physics (104th Edition, 2023–2024). Фундаментальные физико-химические константы и методики расчёта.
- Общая и неорганическая химия: учебное пособие / под ред. Ю. Д. Третьякова. — М.: Академия. Стандартные формулы расчёта конверсии и выхода продукта в химической технологии.
- Расчёт основан на фундаментальных стехиометрических соотношениях и не требует дополнительных табличных значений, кроме вводимых пользователем экспериментальных данных.
Калькулятор степени превращения реагента предназначен для быстрого расчёта конверсии исходного вещества в химической реакции. Инструмент полезен студентам химических специальностей, инженерам-технологам, лаборантам и преподавателям — он позволяет по известным начальному и конечному (или прореагировавшему) количествам реагента вычислить процент превращения и абсолютные значения. Поддерживаются единицы: моль, граммы, моль/л. Расчёт применим для оценки эффективности синтеза, мониторинга кинетики реакций и контроля технологических процессов в химической промышленности.
CiAgKGZ1bmN0aW9uKCkgewogICAgLy8g0JjQt9C+0LvQuNGA0L7QstCw0L3QvdGL0Lkg0LrQvtC0INCyIElJRkUKICAgIHZhciBtb2RlU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbGMtbW9kZScpOwogICAgdmFyIGluaXRpYWxJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbml0aWFsLWFtb3VudCcpOwogICAgdmFyIHNlY29uZGFyeUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlY29uZGFyeS1hbW91bnQnKTsKICAgIHZhciBsYWJlbFNlY29uZGFyeSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYWJlbC1zZWNvbmRhcnknKTsKICAgIHZhciB1bml0SW5pdGlhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1bml0LWluaXRpYWwnKTsKICAgIHZhciB1bml0U2Vjb25kYXJ5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VuaXQtc2Vjb25kYXJ5Jyk7CiAgICB2YXIgZXJyb3JJbml0aWFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLWluaXRpYWwnKTsKICAgIHZhciBlcnJvclNlY29uZGFyeSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1zZWNvbmRhcnknKTsKICAgIHZhciBjYWxjQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbGMtYnRuJyk7CiAgICB2YXIgcmVzZXRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzZXQtYnRuJyk7CgogICAgdmFyIHJlc3VsdENvbnZlcnNpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0LWNvbnZlcnNpb24nKTsKICAgIHZhciByZXN1bHRSZWFjdGVkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdC1yZWFjdGVkJyk7CiAgICB2YXIgcmVzdWx0UmVtYWluaW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdC1yZW1haW5pbmcnKTsKICAgIHZhciB1bml0UmVhY3RlZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1bml0LXJlc3VsdC1yZWFjdGVkJyk7CiAgICB2YXIgdW5pdFJlbWFpbmluZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1bml0LXJlc3VsdC1yZW1haW5pbmcnKTsKCiAgICAvLyDQotC10LrRg9GJ0LjQtSDQtdC00LjQvdC40YbRiyDQuNC30LzQtdGA0LXQvdC40Y8KICAgIHZhciBjdXJyZW50VW5pdCA9ICfQvNC+0LvRjCc7CgogICAgZnVuY3Rpb24gdXBkYXRlVW5pdHMoKSB7CiAgICAgIHZhciBtb2RlID0gbW9kZVNlbGVjdC52YWx1ZTsKICAgICAgaWYgKG1vZGUgPT09ICdpbml0aWFsLWZpbmFsJyB8fCBtb2RlID09PSAnaW5pdGlhbC1yZWFjdGVkJykgewogICAgICAgIGN1cnJlbnRVbml0ID0gJ9C80L7Qu9GMJzsKICAgICAgICB1bml0SW5pdGlhbC50ZXh0Q29udGVudCA9ICfQvNC+0LvRjCc7CiAgICAgICAgdW5pdFNlY29uZGFyeS50ZXh0Q29udGVudCA9ICfQvNC+0LvRjCc7CiAgICAgICAgaWYgKG1vZGUgPT09ICdpbml0aWFsLWZpbmFsJykgewogICAgICAgICAgbGFiZWxTZWNvbmRhcnkudGV4dENvbnRlbnQgPSAn0JrQvtC90LXRh9C90L7QtSDQutC+0LvQuNGH0LXRgdGC0LLQviDRgNC10LDQs9C10L3RgtCwJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGFiZWxTZWNvbmRhcnkudGV4dENvbnRlbnQgPSAn0JrQvtC70LjRh9C10YHRgtCy0L4g0L/RgNC+0YDQtdCw0LPQuNGA0L7QstCw0LLRiNC10LPQviDRgNC10LDQs9C10L3RgtCwJzsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ21hc3MnKSB7CiAgICAgICAgY3VycmVudFVuaXQgPSAn0LMnOwogICAgICAgIHVuaXRJbml0aWFsLnRleHRDb250ZW50ID0gJ9CzJzsKICAgICAgICB1bml0U2Vjb25kYXJ5LnRleHRDb250ZW50ID0gJ9CzJzsKICAgICAgICBpZiAobW9kZVNlbGVjdC52YWx1ZSA9PT0gJ2luaXRpYWwtZmluYWwnKSB7CiAgICAgICAgICBsYWJlbFNlY29uZGFyeS50ZXh0Q29udGVudCA9ICfQmtC+0L3QtdGH0L3QsNGPINC80LDRgdGB0LAg0YDQtdCw0LPQtdC90YLQsCc7CiAgICAgICAgfSBlbHNlIGlmIChtb2RlU2VsZWN0LnZhbHVlID09PSAnaW5pdGlhbC1yZWFjdGVkJykgewogICAgICAgICAgbGFiZWxTZWNvbmRhcnkudGV4dENvbnRlbnQgPSAn0JzQsNGB0YHQsCDQv9GA0L7RgNC10LDQs9C40YDQvtCy0LDQstGI0LXQs9C+INGA0LXQsNCz0LXQvdGC0LAnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsYWJlbFNlY29uZGFyeS50ZXh0Q29udGVudCA9ICfQmtC+0L3QtdGH0L3QsNGPINC80LDRgdGB0LAg0YDQtdCw0LPQtdC90YLQsCc7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKG1vZGUgPT09ICdjb25jZW50cmF0aW9uJykgewogICAgICAgIGN1cnJlbnRVbml0ID0gJ9C80L7Qu9GML9C7JzsKICAgICAgICB1bml0SW5pdGlhbC50ZXh0Q29udGVudCA9ICfQvNC+0LvRjC/Quyc7CiAgICAgICAgdW5pdFNlY29uZGFyeS50ZXh0Q29udGVudCA9ICfQvNC+0LvRjC/Quyc7CiAgICAgICAgaWYgKG1vZGVTZWxlY3QudmFsdWUgPT09ICdpbml0aWFsLWZpbmFsJykgewogICAgICAgICAgbGFiZWxTZWNvbmRhcnkudGV4dENvbnRlbnQgPSAn0JrQvtC90LXRh9C90LDRjyDQutC+0L3RhtC10L3RgtGA0LDRhtC40Y8g0YDQtdCw0LPQtdC90YLQsCc7CiAgICAgICAgfSBlbHNlIGlmIChtb2RlU2VsZWN0LnZhbHVlID09PSAnaW5pdGlhbC1yZWFjdGVkJykgewogICAgICAgICAgbGFiZWxTZWNvbmRhcnkudGV4dENvbnRlbnQgPSAn0JrQvtC90YbQtdC90YLRgNCw0YbQuNGPINC/0YDQvtGA0LXQsNCz0LjRgNC+0LLQsNCy0YjQtdCz0L4g0YDQtdCw0LPQtdC90YLQsCc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGxhYmVsU2Vjb25kYXJ5LnRleHRDb250ZW50ID0gJ9Ca0L7QvdC10YfQvdCw0Y8g0LrQvtC90YbQtdC90YLRgNCw0YbQuNGPINGA0LXQsNCz0LXQvdGC0LAnOwogICAgICAgIH0KICAgICAgfQogICAgICB1bml0UmVhY3RlZC50ZXh0Q29udGVudCA9IGN1cnJlbnRVbml0OwogICAgICB1bml0UmVtYWluaW5nLnRleHRDb250ZW50ID0gY3VycmVudFVuaXQ7CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlU2Vjb25kYXJ5TGFiZWwoKSB7CiAgICAgIHZhciBtb2RlID0gbW9kZVNlbGVjdC52YWx1ZTsKICAgICAgdmFyIHVuaXQgPSBjdXJyZW50VW5pdDsKICAgICAgaWYgKG1vZGUgPT09ICdpbml0aWFsLWZpbmFsJykgewogICAgICAgIGlmICh1bml0ID09PSAn0LzQvtC70YwnKSBsYWJlbFNlY29uZGFyeS50ZXh0Q29udGVudCA9ICfQmtC+0L3QtdGH0L3QvtC1INC60L7Qu9C40YfQtdGB0YLQstC+INGA0LXQsNCz0LXQvdGC0LAnOwogICAgICAgIGVsc2UgaWYgKHVuaXQgPT09ICfQsycpIGxhYmVsU2Vjb25kYXJ5LnRleHRDb250ZW50ID0gJ9Ca0L7QvdC10YfQvdCw0Y8g0LzQsNGB0YHQsCDRgNC10LDQs9C10L3RgtCwJzsKICAgICAgICBlbHNlIGxhYmVsU2Vjb25kYXJ5LnRleHRDb250ZW50ID0gJ9Ca0L7QvdC10YfQvdCw0Y8g0LrQvtC90YbQtdC90YLRgNCw0YbQuNGPINGA0LXQsNCz0LXQvdGC0LAnOwogICAgICB9IGVsc2UgaWYgKG1vZGUgPT09ICdpbml0aWFsLXJlYWN0ZWQnKSB7CiAgICAgICAgaWYgKHVuaXQgPT09ICfQvNC+0LvRjCcpIGxhYmVsU2Vjb25kYXJ5LnRleHRDb250ZW50ID0gJ9Ca0L7Qu9C40YfQtdGB0YLQstC+INC/0YDQvtGA0LXQsNCz0LjRgNC+0LLQsNCy0YjQtdCz0L4g0YDQtdCw0LPQtdC90YLQsCc7CiAgICAgICAgZWxzZSBpZiAodW5pdCA9PT0gJ9CzJykgbGFiZWxTZWNvbmRhcnkudGV4dENvbnRlbnQgPSAn0JzQsNGB0YHQsCDQv9GA0L7RgNC10LDQs9C40YDQvtCy0LDQstGI0LXQs9C+INGA0LXQsNCz0LXQvdGC0LAnOwogICAgICAgIGVsc2UgbGFiZWxTZWNvbmRhcnkudGV4dENvbnRlbnQgPSAn0JrQvtC90YbQtdC90YLRgNCw0YbQuNGPINC/0YDQvtGA0LXQsNCz0LjRgNC+0LLQsNCy0YjQtdCz0L4g0YDQtdCw0LPQtdC90YLQsCc7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBoaWRlRXJyb3JzKCkgewogICAgICBlcnJvckluaXRpYWwuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgZXJyb3JJbml0aWFsLnRleHRDb250ZW50ID0gJyc7CiAgICAgIGVycm9yU2Vjb25kYXJ5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgIGVycm9yU2Vjb25kYXJ5LnRleHRDb250ZW50ID0gJyc7CiAgICB9CgogICAgZnVuY3Rpb24gc2hvd0Vycm9yKGZpZWxkLCBtZXNzYWdlKSB7CiAgICAgIGlmIChmaWVsZCA9PT0gJ2luaXRpYWwnKSB7CiAgICAgICAgZXJyb3JJbml0aWFsLnRleHRDb250ZW50ID0gbWVzc2FnZTsKICAgICAgICBlcnJvckluaXRpYWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgIH0gZWxzZSBpZiAoZmllbGQgPT09ICdzZWNvbmRhcnknKSB7CiAgICAgICAgZXJyb3JTZWNvbmRhcnkudGV4dENvbnRlbnQgPSBtZXNzYWdlOwogICAgICAgIGVycm9yU2Vjb25kYXJ5LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VQb3NpdGl2ZUZsb2F0KHZhbHVlKSB7CiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlLnRyaW0oKSA9PT0gJycpIHsKICAgICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIG51bWJlcjogTmFOLCByZWFzb246ICdlbXB0eScgfTsKICAgICAgfQogICAgICB2YXIgbnVtID0gcGFyc2VGbG9hdCh2YWx1ZSk7CiAgICAgIGlmIChpc05hTihudW0pKSB7CiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBudW1iZXI6IE5hTiwgcmVhc29uOiAnbmFuJyB9OwogICAgICB9CiAgICAgIGlmIChudW0gPCAwKSB7CiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBudW1iZXI6IG51bSwgcmVhc29uOiAnbmVnYXRpdmUnIH07CiAgICAgIH0KICAgICAgaWYgKCFpc0Zpbml0ZShudW0pKSB7CiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBudW1iZXI6IG51bSwgcmVhc29uOiAnaW5maW5pdGUnIH07CiAgICAgIH0KICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUsIG51bWJlcjogbnVtLCByZWFzb246IG51bGwgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBjYWxjdWxhdGUoKSB7CiAgICAgIGhpZGVFcnJvcnMoKTsKICAgICAgdmFyIG1vZGUgPSBtb2RlU2VsZWN0LnZhbHVlOwogICAgICB2YXIgaW5pdGlhbFBhcnNlID0gcGFyc2VQb3NpdGl2ZUZsb2F0KGluaXRpYWxJbnB1dC52YWx1ZSk7CiAgICAgIHZhciBzZWNvbmRhcnlQYXJzZSA9IHBhcnNlUG9zaXRpdmVGbG9hdChzZWNvbmRhcnlJbnB1dC52YWx1ZSk7CgogICAgICAvLyDQn9GA0L7QstC10YDQutCwINC90LDRh9Cw0LvRjNC90L7Qs9C+INC30L3QsNGH0LXQvdC40Y8KICAgICAgaWYgKCFpbml0aWFsUGFyc2UudmFsaWQpIHsKICAgICAgICBpZiAoaW5pdGlhbFBhcnNlLnJlYXNvbiA9PT0gJ2VtcHR5JykgewogICAgICAgICAgc2hvd0Vycm9yKCdpbml0aWFsJywgJ9CS0LLQtdC00LjRgtC1INC90LDRh9Cw0LvRjNC90L7QtSDQutC+0LvQuNGH0LXRgdGC0LLQviDRgNC10LDQs9C10L3RgtCwLicpOwogICAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbFBhcnNlLnJlYXNvbiA9PT0gJ25hbicpIHsKICAgICAgICAgIHNob3dFcnJvcignaW5pdGlhbCcsICfQndC10LrQvtGA0YDQtdC60YLQvdC+0LUg0YfQuNGB0LvQvtCy0L7QtSDQt9C90LDRh9C10L3QuNC1LicpOwogICAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbFBhcnNlLnJlYXNvbiA9PT0gJ25lZ2F0aXZlJykgewogICAgICAgICAgc2hvd0Vycm9yKCdpbml0aWFsJywgJ9Cd0LDRh9Cw0LvRjNC90L7QtSDQutC+0LvQuNGH0LXRgdGC0LLQviDQvdC1INC80L7QttC10YIg0LHRi9GC0Ywg0L7RgtGA0LjRhtCw0YLQtdC70YzQvdGL0LwuJyk7CiAgICAgICAgfSBlbHNlIGlmIChpbml0aWFsUGFyc2UucmVhc29uID09PSAnaW5maW5pdGUnKSB7CiAgICAgICAgICBzaG93RXJyb3IoJ2luaXRpYWwnLCAn0JfQvdCw0YfQtdC90LjQtSDRgdC70LjRiNC60L7QvCDQstC10LvQuNC60L4g0LjQu9C4INC90LUg0Y/QstC70Y/QtdGC0YHRjyDQutC+0L3QtdGH0L3Ri9C8INGH0LjRgdC70L7QvC4nKTsKICAgICAgICB9CiAgICAgICAgY2xlYXJSZXN1bHRzKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICAvLyDQn9GA0L7QstC10YDQutCwINCy0YLQvtGA0LjRh9C90L7Qs9C+INC30L3QsNGH0LXQvdC40Y8KICAgICAgaWYgKCFzZWNvbmRhcnlQYXJzZS52YWxpZCkgewogICAgICAgIGlmIChzZWNvbmRhcnlQYXJzZS5yZWFzb24gPT09ICdlbXB0eScpIHsKICAgICAgICAgIHNob3dFcnJvcignc2Vjb25kYXJ5JywgJ9CS0LLQtdC00LjRgtC1INC30L3QsNGH0LXQvdC40LUg0LTQu9GPINCy0YLQvtGA0L7Qs9C+INC/0L7Qu9GPLicpOwogICAgICAgIH0gZWxzZSBpZiAoc2Vjb25kYXJ5UGFyc2UucmVhc29uID09PSAnbmFuJykgewogICAgICAgICAgc2hvd0Vycm9yKCdzZWNvbmRhcnknLCAn0J3QtdC60L7RgNGA0LXQutGC0L3QvtC1INGH0LjRgdC70L7QstC+0LUg0LfQvdCw0YfQtdC90LjQtS4nKTsKICAgICAgICB9IGVsc2UgaWYgKHNlY29uZGFyeVBhcnNlLnJlYXNvbiA9PT0gJ25lZ2F0aXZlJykgewogICAgICAgICAgc2hvd0Vycm9yKCdzZWNvbmRhcnknLCAn0JfQvdCw0YfQtdC90LjQtSDQvdC1INC80L7QttC10YIg0LHRi9GC0Ywg0L7RgtGA0LjRhtCw0YLQtdC70YzQvdGL0LwuJyk7CiAgICAgICAgfSBlbHNlIGlmIChzZWNvbmRhcnlQYXJzZS5yZWFzb24gPT09ICdpbmZpbml0ZScpIHsKICAgICAgICAgIHNob3dFcnJvcignc2Vjb25kYXJ5JywgJ9CX0L3QsNGH0LXQvdC40LUg0YHQu9C40YjQutC+0Lwg0LLQtdC70LjQutC+INC40LvQuCDQvdC1INGP0LLQu9GP0LXRgtGB0Y8g0LrQvtC90LXRh9C90YvQvCDRh9C40YHQu9C+0LwuJyk7CiAgICAgICAgfQogICAgICAgIGNsZWFyUmVzdWx0cygpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgdmFyIG4wID0gaW5pdGlhbFBhcnNlLm51bWJlcjsKICAgICAgdmFyIG5TZWMgPSBzZWNvbmRhcnlQYXJzZS5udW1iZXI7CgogICAgICAvLyDQn9GA0L7QstC10YDQutCwINC00LXQu9C10L3QuNGPINC90LAg0L3QvtC70YwKICAgICAgaWYgKG4wID09PSAwKSB7CiAgICAgICAgc2hvd0Vycm9yKCdpbml0aWFsJywgJ9Cd0LDRh9Cw0LvRjNC90L7QtSDQutC+0LvQuNGH0LXRgdGC0LLQviDQvdC1INC80L7QttC10YIg0LHRi9GC0Ywg0YDQsNCy0L3QviDQvdGD0LvRjiAo0LTQtdC70LXQvdC40LUg0L3QsCDQvdC+0LvRjCkuJyk7CiAgICAgICAgY2xlYXJSZXN1bHRzKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICB2YXIgblJlYWN0ZWQsIG5SZW1haW5pbmcsIGNvbnZlcnNpb247CgogICAgICBpZiAobW9kZSA9PT0gJ2luaXRpYWwtZmluYWwnKSB7CiAgICAgICAgLy8g0J/QviDQvdCw0YfQsNC70YzQvdC+0LzRgyDQuCDQutC+0L3QtdGH0L3QvtC80YMg0LrQvtC70LjRh9C10YHRgtCy0YMKICAgICAgICBpZiAoblNlYyA+IG4wKSB7CiAgICAgICAgICBzaG93RXJyb3IoJ3NlY29uZGFyeScsICfQmtC+0L3QtdGH0L3QvtC1INC60L7Qu9C40YfQtdGB0YLQstC+INC90LUg0LzQvtC20LXRgiDQsdGL0YLRjCDQsdC+0LvRjNGI0LUg0L3QsNGH0LDQu9GM0L3QvtCz0L4uJyk7CiAgICAgICAgICBjbGVhclJlc3VsdHMoKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgblJlbWFpbmluZyA9IG5TZWM7CiAgICAgICAgblJlYWN0ZWQgPSBuMCAtIG5TZWM7CiAgICAgICAgY29udmVyc2lvbiA9IChuUmVhY3RlZCAvIG4wKSAqIDEwMDsKICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAnaW5pdGlhbC1yZWFjdGVkJykgewogICAgICAgIC8vINCf0L4g0L3QsNGH0LDQu9GM0L3QvtC80YMg0Lgg0L/RgNC+0YDQtdCw0LPQuNGA0L7QstCw0LLRiNC10LzRgyDQutC+0LvQuNGH0LXRgdGC0LLRgwogICAgICAgIGlmIChuU2VjID4gbjApIHsKICAgICAgICAgIHNob3dFcnJvcignc2Vjb25kYXJ5JywgJ9Ca0L7Qu9C40YfQtdGB0YLQstC+INC/0YDQvtGA0LXQsNCz0LjRgNC+0LLQsNCy0YjQtdCz0L4g0YDQtdCw0LPQtdC90YLQsCDQvdC1INC80L7QttC10YIg0L/RgNC10LLRi9GI0LDRgtGMINC90LDRh9Cw0LvRjNC90L7QtS4nKTsKICAgICAgICAgIGNsZWFyUmVzdWx0cygpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBuUmVhY3RlZCA9IG5TZWM7CiAgICAgICAgblJlbWFpbmluZyA9IG4wIC0gblNlYzsKICAgICAgICBjb252ZXJzaW9uID0gKG5SZWFjdGVkIC8gbjApICogMTAwOwogICAgICB9IGVsc2UgewogICAgICAgIC8vINCU0LvRjyBtYXNzINC4IGNvbmNlbnRyYXRpb24g4oCUINCw0L3QsNC70L7Qs9C40YfQvdC+IGluaXRpYWwtZmluYWwKICAgICAgICBpZiAoblNlYyA+IG4wKSB7CiAgICAgICAgICBzaG93RXJyb3IoJ3NlY29uZGFyeScsICfQktCy0LXQtNGR0L3QvdC+0LUg0LfQvdCw0YfQtdC90LjQtSDQvdC1INC80L7QttC10YIg0L/RgNC10LLRi9GI0LDRgtGMINC90LDRh9Cw0LvRjNC90L7QtS4nKTsKICAgICAgICAgIGNsZWFyUmVzdWx0cygpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBuUmVtYWluaW5nID0gblNlYzsKICAgICAgICBuUmVhY3RlZCA9IG4wIC0gblNlYzsKICAgICAgICBjb252ZXJzaW9uID0gKG5SZWFjdGVkIC8gbjApICogMTAwOwogICAgICB9CgogICAgICAvLyDQn9GA0L7QstC10YDQutCwINC90LAgTmFOL0luZmluaXR5INCyINGA0LXQt9GD0LvRjNGC0LDRgtC1CiAgICAgIGlmICghaXNGaW5pdGUoY29udmVyc2lvbikgfHwgaXNOYU4oY29udmVyc2lvbikpIHsKICAgICAgICBzaG93RXJyb3IoJ2luaXRpYWwnLCAn0J7RiNC40LHQutCwINCy0YvRh9C40YHQu9C10L3QuNGPLiDQn9GA0L7QstC10YDRjNGC0LUg0LLQstC10LTRkdC90L3Ri9C1INC00LDQvdC90YvQtS4nKTsKICAgICAgICBjbGVhclJlc3VsdHMoKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIC8vINCe0LPRgNCw0L3QuNGH0LXQvdC40LUg0YHQstC10YDRhdGDIOKAlCAxMDAlICjQtdGB0LvQuCDQutC+0L3QtdGH0L3QvtC1INCx0L7Qu9GM0YjQtSDQvdCw0YfQsNC70YzQvdC+0LPQviwg0LzRiyDRg9C20LUg0L7RgtGB0LXQutC70LgpCiAgICAgIGlmIChjb252ZXJzaW9uIDwgMCkgewogICAgICAgIGNvbnZlcnNpb24gPSAwOwogICAgICAgIG5SZWFjdGVkID0gMDsKICAgICAgICBuUmVtYWluaW5nID0gbjA7CiAgICAgIH0KICAgICAgaWYgKGNvbnZlcnNpb24gPiAxMDApIHsKICAgICAgICBjb252ZXJzaW9uID0gMTAwOwogICAgICAgIG5SZWFjdGVkID0gbjA7CiAgICAgICAgblJlbWFpbmluZyA9IDA7CiAgICAgIH0KCiAgICAgIC8vINCe0YLQvtCx0YDQsNC20LXQvdC40LUg0YDQtdC30YPQu9GM0YLQsNGC0L7QsgogICAgICByZXN1bHRDb252ZXJzaW9uLnRleHRDb250ZW50ID0gZm9ybWF0TnVtYmVyKGNvbnZlcnNpb24sIDEpOwogICAgICByZXN1bHRSZWFjdGVkLnRleHRDb250ZW50ID0gZm9ybWF0TnVtYmVyKG5SZWFjdGVkLCA0KTsKICAgICAgcmVzdWx0UmVtYWluaW5nLnRleHRDb250ZW50ID0gZm9ybWF0TnVtYmVyKG5SZW1haW5pbmcsIDQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdE51bWJlcih2YWx1ZSwgZGVjaW1hbHMpIHsKICAgICAgaWYgKCFpc0Zpbml0ZSh2YWx1ZSkgfHwgaXNOYU4odmFsdWUpKSByZXR1cm4gJ+KAlCc7CiAgICAgIC8vINCe0LrRgNGD0LPQu9GP0LXQvCDQtNC+INGD0LrQsNC30LDQvdC90L7Qs9C+INC60L7Qu9C40YfQtdGB0YLQstCwINC30L3QsNC60L7QsgogICAgICB2YXIgZmFjdG9yID0gTWF0aC5wb3coMTAsIGRlY2ltYWxzKTsKICAgICAgdmFyIHJvdW5kZWQgPSBNYXRoLnJvdW5kKHZhbHVlICogZmFjdG9yKSAvIGZhY3RvcjsKICAgICAgLy8g0KPQsdC40YDQsNC10Lwg0LvQuNGI0L3QuNC1INC90YPQu9C4INCyINC60L7QvdGG0LUsINC10YHQu9C4INGH0LjRgdC70L4g0YbQtdC70L7QtSDQuNC70Lgg0LjQvNC10LXRgiDQvNC10L3RjNGI0LUg0LfQvdCw0LrQvtCyCiAgICAgIHJldHVybiByb3VuZGVkLnRvU3RyaW5nKCk7CiAgICB9CgogICAgZnVuY3Rpb24gY2xlYXJSZXN1bHRzKCkgewogICAgICByZXN1bHRDb252ZXJzaW9uLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICAgIHJlc3VsdFJlYWN0ZWQudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgcmVzdWx0UmVtYWluaW5nLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICB9CgogICAgZnVuY3Rpb24gcmVzZXRBbGwoKSB7CiAgICAgIGluaXRpYWxJbnB1dC52YWx1ZSA9ICcnOwogICAgICBzZWNvbmRhcnlJbnB1dC52YWx1ZSA9ICcnOwogICAgICBoaWRlRXJyb3JzKCk7CiAgICAgIGNsZWFyUmVzdWx0cygpOwogICAgICB1cGRhdGVVbml0cygpOwogICAgICAvLyDQodCx0YDQvtGBINGA0LXQttC40LzQsCDQvdCwINC/0LXRgNCy0YvQuQogICAgICBtb2RlU2VsZWN0LnZhbHVlID0gJ2luaXRpYWwtZmluYWwnOwogICAgICB1cGRhdGVVbml0cygpOwogICAgICB1cGRhdGVTZWNvbmRhcnlMYWJlbCgpOwogICAgfQoKICAgIC8vINCe0LHRgNCw0LHQvtGC0YfQuNC60Lgg0YHQvtCx0YvRgtC40LkKICAgIG1vZGVTZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24oKSB7CiAgICAgIHVwZGF0ZVVuaXRzKCk7CiAgICAgIHVwZGF0ZVNlY29uZGFyeUxhYmVsKCk7CiAgICAgIGhpZGVFcnJvcnMoKTsKICAgICAgY2xlYXJSZXN1bHRzKCk7CiAgICAgIC8vINCe0YfQuNGJ0LDQtdC8INC/0L7Qu9GPINC/0YDQuCDRgdC80LXQvdC1INGA0LXQttC40LzQsCDQtNC70Y8g0YPQtNC+0LHRgdGC0LLQsAogICAgICBpbml0aWFsSW5wdXQudmFsdWUgPSAnJzsKICAgICAgc2Vjb25kYXJ5SW5wdXQudmFsdWUgPSAnJzsKICAgIH0pOwoKICAgIGNhbGNCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKSB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgY2FsY3VsYXRlKCk7CiAgICB9KTsKCiAgICByZXNldEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGUpIHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICByZXNldEFsbCgpOwogICAgfSk7CgogICAgLy8g0JfQsNGJ0LjRgtCwINC+0YIg0L7RgtC/0YDQsNCy0LrQuCDRhNC+0YDQvNGLINC/0L4gRW50ZXIgKNC10YHQu9C4INC+0LHRkdGA0L3Rg9GC0LAg0LIg0YTQvtGA0LzRgykKICAgIGluaXRpYWxJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGNhbGN1bGF0ZSgpOwogICAgICB9CiAgICB9KTsKICAgIHNlY29uZGFyeUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgZnVuY3Rpb24oZSkgewogICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgY2FsY3VsYXRlKCk7CiAgICAgIH0KICAgIH0pOwoKICAgIC8vINCY0L3QuNGG0LjQsNC70LjQt9Cw0YbQuNGPCiAgICB1cGRhdGVVbml0cygpOwogICAgdXBkYXRlU2Vjb25kYXJ5TGFiZWwoKTsKICAgIGNsZWFyUmVzdWx0cygpOwogIH0pKCk7Cg==