Калькулятор константы равновесия Kp
Расчёт константы равновесия Kp через равновесные парциальные давления компонентов газофазной реакции с возможностью определения ΔG°.
—
Константа равновесия Kp
Как пользоваться
1
Укажите стехиометрические коэффициенты (ν) и равновесные парциальные давления для каждого реагента и продукта. Например, для реакции N₂ + 3H₂ ⇌ 2NH₃: реагенты — N₂ (ν=1, P=0.5 атм) и H₂ (ν=3, P=1.2 атм), продукт — NH₃ (ν=2, P=0.8 атм).
2
При необходимости добавьте дополнительные реагенты или продукты кнопками «+ Добавить реагент» и «+ Добавить продукт». Минимум один реагент и один продукт обязательны.
3
Опционально укажите температуру в Кельвинах (например, 298.15 для 25 °C), чтобы дополнительно рассчитать стандартную энергию Гиббса ΔG° = –RT ln Kp.
4
Нажмите «Рассчитать». Результат покажет значение Kp, десятичный логарифм lg Kp и ΔG° (если задана температура). Кнопка «Сбросить» возвращает исходное состояние.
Примеры использования
Синтез аммиака: N₂ + 3H₂ ⇌ 2NH₃ при 500 °C
Реагенты: N₂ (ν=1, P=8.5 атм), H₂ (ν=3, P=25.5 атм). Продукт: NH₃ (ν=2, P=3.2 атм). Температура: 773 K. Результат: Kp ≈ 2.44×10⁻⁵, lg Kp ≈ –4.61, ΔG° ≈ +68.0 кДж/моль (реакция эндотермическая, равновесие смещено влево при высокой температуре).
Диссоциация иодоводорода: 2HI ⇌ H₂ + I₂ при 450 °C
Реагент: HI (ν=2, P=0.35 атм). Продукты: H₂ (ν=1, P=0.075 атм), I₂ (ν=1, P=0.075 атм). Температура: 723 K. Результат: Kp ≈ 0.046, lg Kp ≈ –1.34, ΔG° ≈ +18.5 кДж/моль.
Окисление сернистого газа: 2SO₂ + O₂ ⇌ 2SO₃ при 600 K
Реагенты: SO₂ (ν=2, P=0.8 атм), O₂ (ν=1, P=0.6 атм). Продукт: SO₃ (ν=2, P=1.05 атм). Температура: 600 K. Результат: Kp ≈ 3.59, lg Kp ≈ 0.555, ΔG° ≈ –6.4 кДж/моль (самопроизвольный процесс).
Важные нюансы
- Единицы давления. Все парциальные давления должны быть в одинаковых единицах (атм, бар, кПа). Kp будет иметь размерность (ед. давления)Δν, где Δν = сумма коэффициентов продуктов минус сумма коэффициентов реагентов. Если Δν = 0, Kp безразмерна.
- Температурная зависимость. Константа равновесия Kp существенно зависит от температуры. Расчёт ΔG° корректен только при указанной температуре. При изменении температуры Kp меняется согласно уравнению Вант-Гоффа.
- Газовая постоянная. В расчёте ΔG° используется R = 8.314 Дж/(моль·К) = 0.008314 кДж/(моль·К). Убедитесь, что температура указана в Кельвинах (T(K) = t(°C) + 273.15).
- Техника безопасности. Работа с газами под давлением требует осторожности. Всегда используйте аттестованное оборудование, соблюдайте предельно допустимые давления и проводите эксперименты в вытяжном шкафу при работе с токсичными или горючими газами.
- Идеальность газов. Расчёт предполагает поведение газов как идеальных. При высоких давлениях (более 10 атм) следует использовать коэффициент фугитивности (летучести) для корректировки Kp в Kf.
Источники данных
- IUPAC Gold Book — International Union of Pure and Applied Chemistry, определение константы равновесия и стандартных термодинамических величин (goldbook.iupac.org).
- NIST Chemistry WebBook — National Institute of Standards and Technology, стандартные термодинамические данные для тысяч соединений (webbook.nist.gov).
- CRC Handbook of Chemistry and Physics — авторитетный справочник физико-химических констант, включая газовую постоянную и стандартные энтальпии образования.
- PubChem — открытая база данных химических соединений Национального института здоровья США с термодинамическими свойствами (pubchem.ncbi.nlm.nih.gov).
Калькулятор константы равновесия Kp предназначен для быстрого и точного расчёта термодинамической константы равновесия газофазных реакций через равновесные парциальные давления компонентов. Инструмент автоматически вычисляет Kp, десятичный логарифм lg Kp и стандартную энергию Гиббса ΔG° при заданной температуре. Расчёт основан на законе действующих масс и уравнении изотермы химической реакции Вант-Гоффа. Калькулятор учитывает стехиометрические коэффициенты всех участников реакции и корректно определяет размерность итоговой константы равновесия.
CihmdW5jdGlvbigpewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vINCh0YfRkdGC0YfQuNC60Lgg0LTQu9GPINCz0LXQvdC10YDQsNGG0LjQuCDRg9C90LjQutCw0LvRjNC90YvRhSBpZAogICAgdmFyIHJlYWN0YW50Q291bnRlciA9IDE7CiAgICB2YXIgcHJvZHVjdENvdW50ZXIgPSAxOwoKICAgIC8vINCh0YHRi9C70LrQuCDQvdCwIERPTS3RjdC70LXQvNC10L3RgtGLCiAgICB2YXIgcmVhY3RhbnRzTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWFjdGFudHMtbGlzdCcpOwogICAgdmFyIHByb2R1Y3RzTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm9kdWN0cy1saXN0Jyk7CiAgICB2YXIgYWRkUmVhY3RhbnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRkLXJlYWN0YW50LWJ0bicpOwogICAgdmFyIGFkZFByb2R1Y3RCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRkLXByb2R1Y3QtYnRuJyk7CiAgICB2YXIgY2FsY3VsYXRlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbGN1bGF0ZS1idG4nKTsKICAgIHZhciByZXNldEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXNldC1idG4nKTsKICAgIHZhciBlcnJvck1zZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1tc2cnKTsKICAgIHZhciByZXN1bHRLcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHQta3AnKTsKICAgIHZhciByZXN1bHRMZ0twID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdC1sZ2twJyk7CiAgICB2YXIgcmVzdWx0RGVsdGFHID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdC1kZWx0YWcnKTsKICAgIHZhciByZXN1bHRLcFVuaXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0LWtwLXVuaXQnKTsKICAgIHZhciBkZWx0YUdJdGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlbHRhLWctaXRlbScpOwogICAgdmFyIHRlbXBlcmF0dXJlRmllbGQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVtcGVyYXR1cmUnKTsKCiAgICAvLyDQk9Cw0LfQvtCy0LDRjyDQv9C+0YHRgtC+0Y/QvdC90LDRjyDQsiDQutCU0LYvKNC80L7Qu9GMwrdLKQogICAgdmFyIFJfa0ogPSAwLjAwODMxNDsKCiAgICAvLyDQpNGD0L3QutGG0LjRjyDRgdC+0LfQtNCw0L3QuNGPINGB0YLRgNC+0LrQuCDQutC+0LzQv9C+0L3QtdC90YLQsCAo0YDQtdCw0LPQtdC90YIg0LjQu9C4INC/0YDQvtC00YPQutGCKQogICAgZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50Um93KHByZWZpeCwgaW5kZXgpIHsKICAgICAgICB2YXIgcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgcm93LmNsYXNzTmFtZSA9ICdubi1nZW4tY2FsLWNvbXAtcm93JzsKCiAgICAgICAgdmFyIGNvZWZJZCA9IHByZWZpeCArICctY29lZi0nICsgaW5kZXg7CiAgICAgICAgdmFyIHByZXNzSWQgPSBwcmVmaXggKyAnLXByZXNzLScgKyBpbmRleDsKCiAgICAgICAgdmFyIGxhYmVsQ29lZiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7CiAgICAgICAgbGFiZWxDb2VmLmNsYXNzTmFtZSA9ICdubi1nZW4tY2FsLWxhYmVsJzsKICAgICAgICBsYWJlbENvZWYuc2V0QXR0cmlidXRlKCdmb3InLCBjb2VmSWQpOwogICAgICAgIGxhYmVsQ29lZi50ZXh0Q29udGVudCA9ICfQodGC0LXRhdC40L7QvNC10YLRgNC40YfQtdGB0LrQuNC5INC60L7RjdGE0YTQuNGG0LjQtdC90YIgzr0nOwoKICAgICAgICB2YXIgaW5wdXRDb2VmID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTsKICAgICAgICBpbnB1dENvZWYuY2xhc3NOYW1lID0gJ25uLWdlbi1jYWwtZmllbGQnOwogICAgICAgIGlucHV0Q29lZi50eXBlID0gJ251bWJlcic7CiAgICAgICAgaW5wdXRDb2VmLmlkID0gY29lZklkOwogICAgICAgIGlucHV0Q29lZi52YWx1ZSA9ICcxJzsKICAgICAgICBpbnB1dENvZWYubWluID0gJzAuMDEnOwogICAgICAgIGlucHV0Q29lZi5zdGVwID0gJzAuMDEnOwogICAgICAgIGlucHV0Q29lZi5wbGFjZWhvbGRlciA9ICfOvSc7CgogICAgICAgIHZhciBsYWJlbFByZXNzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTsKICAgICAgICBsYWJlbFByZXNzLmNsYXNzTmFtZSA9ICdubi1nZW4tY2FsLWxhYmVsJzsKICAgICAgICBsYWJlbFByZXNzLnNldEF0dHJpYnV0ZSgnZm9yJywgcHJlc3NJZCk7CiAgICAgICAgbGFiZWxQcmVzcy50ZXh0Q29udGVudCA9ICfQn9Cw0YDRhtC40LDQu9GM0L3QvtC1INC00LDQstC70LXQvdC40LUgKNCw0YLQvCknOwoKICAgICAgICB2YXIgaW5wdXRQcmVzcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7CiAgICAgICAgaW5wdXRQcmVzcy5jbGFzc05hbWUgPSAnbm4tZ2VuLWNhbC1maWVsZCc7CiAgICAgICAgaW5wdXRQcmVzcy50eXBlID0gJ3RleHQnOwogICAgICAgIGlucHV0UHJlc3MuaWQgPSBwcmVzc0lkOwogICAgICAgIGlucHV0UHJlc3MudmFsdWUgPSAnMS4wJzsKICAgICAgICBpbnB1dFByZXNzLnBsYWNlaG9sZGVyID0gJ1AgKNCw0YLQvCknOwoKICAgICAgICB2YXIgcmVtb3ZlQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgICAgICAgcmVtb3ZlQnRuLnR5cGUgPSAnYnV0dG9uJzsKICAgICAgICByZW1vdmVCdG4uY2xhc3NOYW1lID0gJ25uLWdlbi1jYWwtY29tcC1yZW1vdmUnOwogICAgICAgIHJlbW92ZUJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAn0KPQtNCw0LvQuNGC0Ywg0LrQvtC80L/QvtC90LXQvdGCJyk7CiAgICAgICAgcmVtb3ZlQnRuLnRpdGxlID0gJ9Cj0LTQsNC70LjRgtGMINC60L7QvNC/0L7QvdC10L3Rgic7CiAgICAgICAgcmVtb3ZlQnRuLnRleHRDb250ZW50ID0gJ+KclSc7CgogICAgICAgIHJvdy5hcHBlbmRDaGlsZChsYWJlbENvZWYpOwogICAgICAgIHJvdy5hcHBlbmRDaGlsZChpbnB1dENvZWYpOwogICAgICAgIHJvdy5hcHBlbmRDaGlsZChsYWJlbFByZXNzKTsKICAgICAgICByb3cuYXBwZW5kQ2hpbGQoaW5wdXRQcmVzcyk7CiAgICAgICAgcm93LmFwcGVuZENoaWxkKHJlbW92ZUJ0bik7CgogICAgICAgIHJldHVybiByb3c7CiAgICB9CgogICAgLy8g0KTRg9C90LrRhtC40Y8g0L/QtdGA0LXQuNC90LTQtdC60YHQsNGG0LjQuCDQutC+0LzQv9C+0L3QtdC90YLQvtCyINCyINGB0L/QuNGB0LrQtQogICAgZnVuY3Rpb24gcmVpbmRleExpc3QobGlzdEVsZW1lbnQsIHByZWZpeCkgewogICAgICAgIHZhciByb3dzID0gbGlzdEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm5uLWdlbi1jYWwtY29tcC1yb3cnKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIHJvdyA9IHJvd3NbaV07CiAgICAgICAgICAgIHZhciBsYWJlbHMgPSByb3cucXVlcnlTZWxlY3RvckFsbCgnbGFiZWwnKTsKICAgICAgICAgICAgdmFyIGlucHV0cyA9IHJvdy5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCcpOwogICAgICAgICAgICBpZiAobGFiZWxzLmxlbmd0aCA+PSAyICYmIGlucHV0cy5sZW5ndGggPj0gMikgewogICAgICAgICAgICAgICAgdmFyIGNvZWZJZCA9IHByZWZpeCArICctY29lZi0nICsgaTsKICAgICAgICAgICAgICAgIHZhciBwcmVzc0lkID0gcHJlZml4ICsgJy1wcmVzcy0nICsgaTsKICAgICAgICAgICAgICAgIGxhYmVsc1swXS5zZXRBdHRyaWJ1dGUoJ2ZvcicsIGNvZWZJZCk7CiAgICAgICAgICAgICAgICBpbnB1dHNbMF0uaWQgPSBjb2VmSWQ7CiAgICAgICAgICAgICAgICBsYWJlbHNbMV0uc2V0QXR0cmlidXRlKCdmb3InLCBwcmVzc0lkKTsKICAgICAgICAgICAgICAgIGlucHV0c1sxXS5pZCA9IHByZXNzSWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLy8g0J7QsdGA0LDQsdC+0YLRh9C40Log0YPQtNCw0LvQtdC90LjRjyDQutC+0LzQv9C+0L3QtdC90YLQsAogICAgZnVuY3Rpb24gYXR0YWNoUmVtb3ZlSGFuZGxlcihsaXN0RWxlbWVudCwgcHJlZml4KSB7CiAgICAgICAgbGlzdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIGlmIChlLnRhcmdldCAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ25uLWdlbi1jYWwtY29tcC1yZW1vdmUnKSkgewogICAgICAgICAgICAgICAgdmFyIHJvd3MgPSBsaXN0RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubm4tZ2VuLWNhbC1jb21wLXJvdycpOwogICAgICAgICAgICAgICAgaWYgKHJvd3MubGVuZ3RoIDw9IDEpIHsKICAgICAgICAgICAgICAgICAgICBzaG93RXJyb3IoJ9Cd0LXQu9GM0LfRjyDRg9C00LDQu9C40YLRjCDQv9C+0YHQu9C10LTQvdC40Lkg0LrQvtC80L/QvtC90LXQvdGCLiDQnNC40L3QuNC80YPQvCDQvtC00LjQvSDRgNC10LDQs9C10L3RgiDQuCDQvtC00LjQvSDQv9GA0L7QtNGD0LrRgiDQvtCx0Y/Qt9Cw0YLQtdC70YzQvdGLLicpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciByb3cgPSBlLnRhcmdldC5jbG9zZXN0KCcubm4tZ2VuLWNhbC1jb21wLXJvdycpOwogICAgICAgICAgICAgICAgaWYgKHJvdykgewogICAgICAgICAgICAgICAgICAgIHJvdy5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICByZWluZGV4TGlzdChsaXN0RWxlbWVudCwgcHJlZml4KTsKICAgICAgICAgICAgICAgICAgICBoaWRlRXJyb3IoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIC8vINCU0L7QsdCw0LLQu9C10L3QuNC1INGA0LXQsNCz0LXQvdGC0LAKICAgIGZ1bmN0aW9uIGFkZFJlYWN0YW50KCkgewogICAgICAgIHZhciByb3dzID0gcmVhY3RhbnRzTGlzdC5xdWVyeVNlbGVjdG9yQWxsKCcubm4tZ2VuLWNhbC1jb21wLXJvdycpOwogICAgICAgIHZhciBuZXdJbmRleCA9IHJlYWN0YW50Q291bnRlcisrOwogICAgICAgIHZhciByb3cgPSBjcmVhdGVDb21wb25lbnRSb3coJ3InLCBuZXdJbmRleCk7CiAgICAgICAgcmVhY3RhbnRzTGlzdC5hcHBlbmRDaGlsZChyb3cpOwogICAgICAgIHJlaW5kZXhMaXN0KHJlYWN0YW50c0xpc3QsICdyJyk7CiAgICAgICAgaGlkZUVycm9yKCk7CiAgICB9CgogICAgLy8g0JTQvtCx0LDQstC70LXQvdC40LUg0L/RgNC+0LTRg9C60YLQsAogICAgZnVuY3Rpb24gYWRkUHJvZHVjdCgpIHsKICAgICAgICB2YXIgcm93cyA9IHByb2R1Y3RzTGlzdC5xdWVyeVNlbGVjdG9yQWxsKCcubm4tZ2VuLWNhbC1jb21wLXJvdycpOwogICAgICAgIHZhciBuZXdJbmRleCA9IHByb2R1Y3RDb3VudGVyKys7CiAgICAgICAgdmFyIHJvdyA9IGNyZWF0ZUNvbXBvbmVudFJvdygncCcsIG5ld0luZGV4KTsKICAgICAgICBwcm9kdWN0c0xpc3QuYXBwZW5kQ2hpbGQocm93KTsKICAgICAgICByZWluZGV4TGlzdChwcm9kdWN0c0xpc3QsICdwJyk7CiAgICAgICAgaGlkZUVycm9yKCk7CiAgICB9CgogICAgLy8g0J/QvtC60LDQt9Cw0YLRjCDQvtGI0LjQsdC60YMKICAgIGZ1bmN0aW9uIHNob3dFcnJvcihtZXNzYWdlKSB7CiAgICAgICAgZXJyb3JNc2cudGV4dENvbnRlbnQgPSBtZXNzYWdlOwogICAgICAgIGVycm9yTXNnLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgfQoKICAgIC8vINCh0LrRgNGL0YLRjCDQvtGI0LjQsdC60YMKICAgIGZ1bmN0aW9uIGhpZGVFcnJvcigpIHsKICAgICAgICBlcnJvck1zZy50ZXh0Q29udGVudCA9ICcnOwogICAgICAgIGVycm9yTXNnLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICB9CgogICAgLy8g0J/QsNGA0YHQuNC90LMg0YfQuNGB0LvQsCDRgSDQv9C+0LTQtNC10YDQttC60L7QuSDQt9Cw0L/Rj9GC0L7QuQogICAgZnVuY3Rpb24gcGFyc2VOdW1iZXIoc3RyKSB7CiAgICAgICAgaWYgKCFzdHIgfHwgc3RyLnRyaW0oKSA9PT0gJycpIHJldHVybiBOYU47CiAgICAgICAgdmFyIGNsZWFuZWQgPSBzdHIudHJpbSgpLnJlcGxhY2UoJywnLCAnLicpOwogICAgICAgIHZhciBudW0gPSBwYXJzZUZsb2F0KGNsZWFuZWQpOwogICAgICAgIHJldHVybiBudW07CiAgICB9CgogICAgLy8g0KHQsdC+0YAg0LTQsNC90L3Ri9GFINC40Lcg0YHQv9C40YHQutCwINC60L7QvNC/0L7QvdC10L3RgtC+0LIKICAgIGZ1bmN0aW9uIGNvbGxlY3RDb21wb25lbnRzKGxpc3RFbGVtZW50LCBwcmVmaXgpIHsKICAgICAgICB2YXIgY29tcG9uZW50cyA9IFtdOwogICAgICAgIHZhciByb3dzID0gbGlzdEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm5uLWdlbi1jYWwtY29tcC1yb3cnKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGlucHV0cyA9IHJvd3NbaV0ucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQnKTsKICAgICAgICAgICAgaWYgKGlucHV0cy5sZW5ndGggPj0gMikgewogICAgICAgICAgICAgICAgdmFyIGNvZWYgPSBwYXJzZU51bWJlcihpbnB1dHNbMF0udmFsdWUpOwogICAgICAgICAgICAgICAgdmFyIHByZXNzID0gcGFyc2VOdW1iZXIoaW5wdXRzWzFdLnZhbHVlKTsKICAgICAgICAgICAgICAgIGNvbXBvbmVudHMucHVzaCh7IGNvZWZmaWNpZW50OiBjb2VmLCBwcmVzc3VyZTogcHJlc3MgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7CiAgICB9CgogICAgLy8g0JLQsNC70LjQtNCw0YbQuNGPINC60L7QvNC/0L7QvdC10L3RgtC+0LIKICAgIGZ1bmN0aW9uIHZhbGlkYXRlQ29tcG9uZW50cyhyZWFjdGFudHMsIHByb2R1Y3RzKSB7CiAgICAgICAgaWYgKHJlYWN0YW50cy5sZW5ndGggPT09IDAgfHwgcHJvZHVjdHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiAn0JTQvtC70LbQtdC9INCx0YvRgtGMINGF0L7RgtGPINCx0Ysg0L7QtNC40L0g0YDQtdCw0LPQtdC90YIg0Lgg0L7QtNC40L0g0L/RgNC+0LTRg9C60YIuJzsKICAgICAgICB9CiAgICAgICAgdmFyIGFsbENvbXBvbmVudHMgPSByZWFjdGFudHMuY29uY2F0KHByb2R1Y3RzKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbENvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGMgPSBhbGxDb21wb25lbnRzW2ldOwogICAgICAgICAgICBpZiAoaXNOYU4oYy5jb2VmZmljaWVudCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAn0KHRgtC10YXQuNC+0LzQtdGC0YDQuNGH0LXRgdC60LjQuSDQutC+0Y3RhNGE0LjRhtC40LXQvdGCINC00L7Qu9C20LXQvSDQsdGL0YLRjCDRh9C40YHQu9C+0LwuJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYy5jb2VmZmljaWVudCA8PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ9Ch0YLQtdGF0LjQvtC80LXRgtGA0LjRh9C10YHQutC40Lkg0LrQvtGN0YTRhNC40YbQuNC10L3RgiDQtNC+0LvQttC10L0g0LHRi9GC0Ywg0L/QvtC70L7QttC40YLQtdC70YzQvdGL0Lwg0YfQuNGB0LvQvtC8Lic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGlzTmFOKGMucHJlc3N1cmUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ9Cf0LDRgNGG0LjQsNC70YzQvdC+0LUg0LTQsNCy0LvQtdC90LjQtSDQtNC+0LvQttC90L4g0LHRi9GC0Ywg0YfQuNGB0LvQvtC8Lic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGMucHJlc3N1cmUgPCAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ9Cf0LDRgNGG0LjQsNC70YzQvdC+0LUg0LTQsNCy0LvQtdC90LjQtSDQvdC1INC80L7QttC10YIg0LHRi9GC0Ywg0L7RgtGA0LjRhtCw0YLQtdC70YzQvdGL0LwuJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYy5wcmVzc3VyZSA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuICfQn9Cw0YDRhtC40LDQu9GM0L3QvtC1INC00LDQstC70LXQvdC40LUg0L3QtSDQvNC+0LbQtdGCINCx0YvRgtGMINGA0LDQstC90L4g0L3Rg9C70Y4gKNGN0YLQviDQvtC30L3QsNGH0LDQu9C+INCx0Ysg0L7RgtGB0YPRgtGB0YLQstC40LUg0LrQvtC80L/QvtC90LXQvdGC0LAg0LIg0YDQsNCy0L3QvtCy0LXRgdC90L7QuSDRgdC80LXRgdC4LCDRh9GC0L4g0LTQtdC70LDQtdGCIEtwINC90YPQu9C10LLQvtC5INC40LvQuCDQsdC10YHQutC+0L3QtdGH0L3QvtC5KS4nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8vINCg0LDRgdGH0ZHRgiBLcAogICAgZnVuY3Rpb24gY2FsY3VsYXRlS3AocmVhY3RhbnRzLCBwcm9kdWN0cykgewogICAgICAgIHZhciBudW1lcmF0b3IgPSAxOwogICAgICAgIHZhciBkZW5vbWluYXRvciA9IDE7CiAgICAgICAgdmFyIHN1bU51UHJvZHVjdHMgPSAwOwogICAgICAgIHZhciBzdW1OdVJlYWN0YW50cyA9IDA7CgogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvZHVjdHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIHAgPSBwcm9kdWN0c1tpXTsKICAgICAgICAgICAgbnVtZXJhdG9yICo9IE1hdGgucG93KHAucHJlc3N1cmUsIHAuY29lZmZpY2llbnQpOwogICAgICAgICAgICBzdW1OdVByb2R1Y3RzICs9IHAuY29lZmZpY2llbnQ7CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmVhY3RhbnRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIHZhciByID0gcmVhY3RhbnRzW2pdOwogICAgICAgICAgICBkZW5vbWluYXRvciAqPSBNYXRoLnBvdyhyLnByZXNzdXJlLCByLmNvZWZmaWNpZW50KTsKICAgICAgICAgICAgc3VtTnVSZWFjdGFudHMgKz0gci5jb2VmZmljaWVudDsKICAgICAgICB9CgogICAgICAgIGlmIChkZW5vbWluYXRvciA9PT0gMCB8fCAhaXNGaW5pdGUoZGVub21pbmF0b3IpKSB7CiAgICAgICAgICAgIHJldHVybiB7IGtwOiBJbmZpbml0eSwgZGVsdGFOdTogc3VtTnVQcm9kdWN0cyAtIHN1bU51UmVhY3RhbnRzLCBlcnJvcjogJ9CX0L3QsNC80LXQvdCw0YLQtdC70Ywg0YDQsNCy0LXQvSDQvdGD0LvRjiDQuNC70Lgg0LHQtdGB0LrQvtC90LXRh9C90L7RgdGC0LguJyB9OwogICAgICAgIH0KCiAgICAgICAgdmFyIGtwID0gbnVtZXJhdG9yIC8gZGVub21pbmF0b3I7CiAgICAgICAgdmFyIGRlbHRhTnUgPSBzdW1OdVByb2R1Y3RzIC0gc3VtTnVSZWFjdGFudHM7CgogICAgICAgIHJldHVybiB7IGtwOiBrcCwgZGVsdGFOdTogZGVsdGFOdSwgZXJyb3I6IG51bGwgfTsKICAgIH0KCiAgICAvLyDQpNC+0YDQvNCw0YLQuNGA0L7QstCw0L3QuNC1INGH0LjRgdC70LAg0LTQu9GPINC+0YLQvtCx0YDQsNC20LXQvdC40Y8KICAgIGZ1bmN0aW9uIGZvcm1hdE51bWJlcihudW0pIHsKICAgICAgICBpZiAoIWlzRmluaXRlKG51bSkpIHsKICAgICAgICAgICAgcmV0dXJuIG51bSA+IDAgPyAn4oieJyA6ICfigJPiiJ4nOwogICAgICAgIH0KICAgICAgICBpZiAoTWF0aC5hYnMobnVtKSA8IDFlLTEwICYmIG51bSAhPT0gMCkgewogICAgICAgICAgICByZXR1cm4gbnVtLnRvRXhwb25lbnRpYWwoNCk7CiAgICAgICAgfQogICAgICAgIGlmIChNYXRoLmFicyhudW0pID49IDFlMTApIHsKICAgICAgICAgICAgcmV0dXJuIG51bS50b0V4cG9uZW50aWFsKDQpOwogICAgICAgIH0KICAgICAgICBpZiAoTWF0aC5hYnMobnVtKSA+PSAxMDAwIHx8IChNYXRoLmFicyhudW0pIDwgMC4wMSAmJiBudW0gIT09IDApKSB7CiAgICAgICAgICAgIHJldHVybiBudW0udG9FeHBvbmVudGlhbCg0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQobnVtLnRvUHJlY2lzaW9uKDYpKS50b1N0cmluZygpOwogICAgfQoKICAgIC8vINCe0YHQvdC+0LLQvdCw0Y8g0YTRg9C90LrRhtC40Y8g0YDQsNGB0YfRkdGC0LAKICAgIGZ1bmN0aW9uIHBlcmZvcm1DYWxjdWxhdGlvbigpIHsKICAgICAgICBoaWRlRXJyb3IoKTsKCiAgICAgICAgdmFyIHJlYWN0YW50cyA9IGNvbGxlY3RDb21wb25lbnRzKHJlYWN0YW50c0xpc3QsICdyJyk7CiAgICAgICAgdmFyIHByb2R1Y3RzID0gY29sbGVjdENvbXBvbmVudHMocHJvZHVjdHNMaXN0LCAncCcpOwoKICAgICAgICB2YXIgdmFsaWRhdGlvbkVycm9yID0gdmFsaWRhdGVDb21wb25lbnRzKHJlYWN0YW50cywgcHJvZHVjdHMpOwogICAgICAgIGlmICh2YWxpZGF0aW9uRXJyb3IpIHsKICAgICAgICAgICAgc2hvd0Vycm9yKHZhbGlkYXRpb25FcnJvcik7CiAgICAgICAgICAgIHJlc3VsdEtwLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICAgICAgICAgIHJlc3VsdExnS3AudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgICAgICAgcmVzdWx0RGVsdGFHLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICAgICAgICAgIHJlc3VsdEtwVW5pdC50ZXh0Q29udGVudCA9ICcnOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB2YXIgY2FsY1Jlc3VsdCA9IGNhbGN1bGF0ZUtwKHJlYWN0YW50cywgcHJvZHVjdHMpOwogICAgICAgIGlmIChjYWxjUmVzdWx0LmVycm9yKSB7CiAgICAgICAgICAgIHNob3dFcnJvcihjYWxjUmVzdWx0LmVycm9yKTsKICAgICAgICAgICAgcmVzdWx0S3AudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgICAgICAgcmVzdWx0TGdLcC50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICAgICAgICByZXN1bHREZWx0YUcudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgICAgICAgcmVzdWx0S3BVbml0LnRleHRDb250ZW50ID0gJyc7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciBrcCA9IGNhbGNSZXN1bHQua3A7CiAgICAgICAgdmFyIGRlbHRhTnUgPSBjYWxjUmVzdWx0LmRlbHRhTnU7CgogICAgICAgIC8vINCe0YLQvtCx0YDQsNC20LXQvdC40LUgS3AKICAgICAgICByZXN1bHRLcC50ZXh0Q29udGVudCA9IGZvcm1hdE51bWJlcihrcCk7CgogICAgICAgIC8vINCg0LDQt9C80LXRgNC90L7RgdGC0YwKICAgICAgICBpZiAoZGVsdGFOdSA9PT0gMCkgewogICAgICAgICAgICByZXN1bHRLcFVuaXQudGV4dENvbnRlbnQgPSAn0LHQtdC30YDQsNC30LzQtdGA0L3QsNGPJzsKICAgICAgICB9IGVsc2UgaWYgKGRlbHRhTnUgPT09IDEpIHsKICAgICAgICAgICAgcmVzdWx0S3BVbml0LnRleHRDb250ZW50ID0gJ9Cw0YLQvCc7CiAgICAgICAgfSBlbHNlIGlmIChkZWx0YU51ID09PSAtMSkgewogICAgICAgICAgICByZXN1bHRLcFVuaXQudGV4dENvbnRlbnQgPSAn0LDRgtC84oG7wrknOwogICAgICAgIH0gZWxzZSBpZiAoZGVsdGFOdSA+IDApIHsKICAgICAgICAgICAgcmVzdWx0S3BVbml0LnRleHRDb250ZW50ID0gJ9Cw0YLQvCcgKyAnXicgKyBkZWx0YU51OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlc3VsdEtwVW5pdC50ZXh0Q29udGVudCA9ICfQsNGC0LwnICsgJ14oJyArIGRlbHRhTnUgKyAnKSc7CiAgICAgICAgfQoKICAgICAgICAvLyBsZyBLcAogICAgICAgIGlmIChrcCA+IDAgJiYgaXNGaW5pdGUoa3ApKSB7CiAgICAgICAgICAgIHZhciBsZ0twID0gTWF0aC5sb2cxMChrcCk7CiAgICAgICAgICAgIHJlc3VsdExnS3AudGV4dENvbnRlbnQgPSBwYXJzZUZsb2F0KGxnS3AudG9QcmVjaXNpb24oNikpLnRvU3RyaW5nKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzdWx0TGdLcC50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICAgIH0KCiAgICAgICAgLy8gzpRHwrAKICAgICAgICB2YXIgdGVtcFN0ciA9IHRlbXBlcmF0dXJlRmllbGQudmFsdWUudHJpbSgpOwogICAgICAgIGlmICh0ZW1wU3RyICE9PSAnJykgewogICAgICAgICAgICB2YXIgdGVtcGVyYXR1cmUgPSBwYXJzZU51bWJlcih0ZW1wU3RyKTsKICAgICAgICAgICAgaWYgKGlzTmFOKHRlbXBlcmF0dXJlKSkgewogICAgICAgICAgICAgICAgcmVzdWx0RGVsdGFHLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICAgICAgICAgICAgICBzaG93RXJyb3IoJ9Ci0LXQvNC/0LXRgNCw0YLRg9GA0LAg0LTQvtC70LbQvdCwINCx0YvRgtGMINGH0LjRgdC70L7QvC4nKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGVtcGVyYXR1cmUgPD0gMCkgewogICAgICAgICAgICAgICAgcmVzdWx0RGVsdGFHLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICAgICAgICAgICAgICBzaG93RXJyb3IoJ9Ci0LXQvNC/0LXRgNCw0YLRg9GA0LAg0LTQvtC70LbQvdCwINCx0YvRgtGMINC/0L7Qu9C+0LbQuNGC0LXQu9GM0L3QvtC5ICjQsiDQmtC10LvRjNCy0LjQvdCw0YUpLicpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChrcCA+IDAgJiYgaXNGaW5pdGUoa3ApKSB7CiAgICAgICAgICAgICAgICB2YXIgZGVsdGFHID0gLVJfa0ogKiB0ZW1wZXJhdHVyZSAqIE1hdGgubG9nKGtwKTsKICAgICAgICAgICAgICAgIHJlc3VsdERlbHRhRy50ZXh0Q29udGVudCA9IHBhcnNlRmxvYXQoZGVsdGFHLnRvUHJlY2lzaW9uKDUpKS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgZGVsdGFHSXRlbS5zdHlsZS5kaXNwbGF5ID0gJyc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXN1bHREZWx0YUcudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlc3VsdERlbHRhRy50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICAgIH0KICAgIH0KCiAgICAvLyDQodCx0YDQvtGBINGE0L7RgNC80YsKICAgIGZ1bmN0aW9uIHJlc2V0Rm9ybSgpIHsKICAgICAgICAvLyDQo9C00LDQu9GP0LXQvCDQstGB0LUg0YHRgtGA0L7QutC4LCDQutGA0L7QvNC1INC/0LXRgNCy0L7QuSDQsiDQutCw0LbQtNC+0Lwg0YHQv9C40YHQutC1CiAgICAgICAgdmFyIHJlYWN0YW50Um93cyA9IHJlYWN0YW50c0xpc3QucXVlcnlTZWxlY3RvckFsbCgnLm5uLWdlbi1jYWwtY29tcC1yb3cnKTsKICAgICAgICBmb3IgKHZhciBpID0gcmVhY3RhbnRSb3dzLmxlbmd0aCAtIDE7IGkgPj0gMTsgaS0tKSB7CiAgICAgICAgICAgIHJlYWN0YW50Um93c1tpXS5yZW1vdmUoKTsKICAgICAgICB9CiAgICAgICAgdmFyIHByb2R1Y3RSb3dzID0gcHJvZHVjdHNMaXN0LnF1ZXJ5U2VsZWN0b3JBbGwoJy5ubi1nZW4tY2FsLWNvbXAtcm93Jyk7CiAgICAgICAgZm9yICh2YXIgaiA9IHByb2R1Y3RSb3dzLmxlbmd0aCAtIDE7IGogPj0gMTsgai0tKSB7CiAgICAgICAgICAgIHByb2R1Y3RSb3dzW2pdLnJlbW92ZSgpOwogICAgICAgIH0KCiAgICAgICAgLy8g0KHQsdGA0LDRgdGL0LLQsNC10Lwg0LfQvdCw0YfQtdC90LjRjyDQv9C10YDQstGL0YUg0YHRgtGA0L7QugogICAgICAgIHZhciBmaXJzdFJlYWN0YW50Um93ID0gcmVhY3RhbnRzTGlzdC5xdWVyeVNlbGVjdG9yKCcubm4tZ2VuLWNhbC1jb21wLXJvdycpOwogICAgICAgIGlmIChmaXJzdFJlYWN0YW50Um93KSB7CiAgICAgICAgICAgIHZhciBySW5wdXRzID0gZmlyc3RSZWFjdGFudFJvdy5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCcpOwogICAgICAgICAgICBpZiAocklucHV0cy5sZW5ndGggPj0gMikgewogICAgICAgICAgICAgICAgcklucHV0c1swXS52YWx1ZSA9ICcxJzsKICAgICAgICAgICAgICAgIHJJbnB1dHNbMV0udmFsdWUgPSAnMS4wJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgZmlyc3RQcm9kdWN0Um93ID0gcHJvZHVjdHNMaXN0LnF1ZXJ5U2VsZWN0b3IoJy5ubi1nZW4tY2FsLWNvbXAtcm93Jyk7CiAgICAgICAgaWYgKGZpcnN0UHJvZHVjdFJvdykgewogICAgICAgICAgICB2YXIgcElucHV0cyA9IGZpcnN0UHJvZHVjdFJvdy5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCcpOwogICAgICAgICAgICBpZiAocElucHV0cy5sZW5ndGggPj0gMikgewogICAgICAgICAgICAgICAgcElucHV0c1swXS52YWx1ZSA9ICcxJzsKICAgICAgICAgICAgICAgIHBJbnB1dHNbMV0udmFsdWUgPSAnMS4wJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdGVtcGVyYXR1cmVGaWVsZC52YWx1ZSA9ICcnOwogICAgICAgIHJlaW5kZXhMaXN0KHJlYWN0YW50c0xpc3QsICdyJyk7CiAgICAgICAgcmVpbmRleExpc3QocHJvZHVjdHNMaXN0LCAncCcpOwogICAgICAgIHJlYWN0YW50Q291bnRlciA9IDE7CiAgICAgICAgcHJvZHVjdENvdW50ZXIgPSAxOwoKICAgICAgICByZXN1bHRLcC50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICAgIHJlc3VsdExnS3AudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgICByZXN1bHREZWx0YUcudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgICByZXN1bHRLcFVuaXQudGV4dENvbnRlbnQgPSAnJzsKICAgICAgICBoaWRlRXJyb3IoKTsKICAgIH0KCiAgICAvLyDQndCw0LLQtdGI0LjQstCw0L3QuNC1INC+0LHRgNCw0LHQvtGC0YfQuNC60L7QsgogICAgYWRkUmVhY3RhbnRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhZGRSZWFjdGFudCk7CiAgICBhZGRQcm9kdWN0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYWRkUHJvZHVjdCk7CiAgICBjYWxjdWxhdGVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBwZXJmb3JtQ2FsY3VsYXRpb24pOwogICAgcmVzZXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZXNldEZvcm0pOwoKICAgIC8vINCe0LHRgNCw0LHQvtGC0YfQuNC60Lgg0YPQtNCw0LvQtdC90LjRjyDQtNC70Y8g0L3QsNGH0LDQu9GM0L3Ri9GFINGB0L/QuNGB0LrQvtCyCiAgICBhdHRhY2hSZW1vdmVIYW5kbGVyKHJlYWN0YW50c0xpc3QsICdyJyk7CiAgICBhdHRhY2hSZW1vdmVIYW5kbGVyKHByb2R1Y3RzTGlzdCwgJ3AnKTsKCiAgICAvLyDQmNC90LjRhtC40LDQu9C40LfQsNGG0LjRjzog0YHQutGA0YvQstCw0LXQvCDQvtGI0LjQsdC60YMKICAgIGhpZGVFcnJvcigpOwp9KSgpOwo=