Калькулятор доходности акций
Рассчитайте полную доходность ваших инвестиций в акции с учётом дивидендов, комиссий и срока владения — онлайн, быстро и наглядно.
Как пользоваться калькулятором
1
Введите цену покупки одной акции — например, вы купили акции Сбербанка по 280 ₽ за штуку.
2
Укажите цену продажи (или текущую рыночную цену), количество акций и срок владения в месяцах — скажем, 150 акций за 2 года (24 месяца).
3
При необходимости добавьте дивиденды и комиссии брокера за покупку и продажу. Нажмите «Рассчитать» — и получите чистую прибыль, общую и годовую доходность.
4
Сравните годовую доходность с инфляцией и банковскими депозитами — цифры в результатах помогут принять взвешенное решение.
Примеры расчёта
Сценарий 1: долгосрочные инвестиции
Цена покупки: 1200 ₽, цена продажи: 3100 ₽, количество: 50 акций, дивиденды: 8000 ₽, комиссия покупки: 120 ₽, комиссия продажи: 120 ₽, срок: 36 месяцев. Итог: чистая прибыль 102 760 ₽, общая доходность 170,8%, годовая доходность 38,2%.
Сценарий 2: короткая спекулятивная сделка
Цена покупки: 5000 ₽, цена продажи: 5300 ₽, количество: 20 акций, без дивидендов, комиссии по 100 ₽, срок: 3 месяца. Итог: чистая прибыль 5800 ₽, общая доходность 5,8%, годовая доходность 25,1%.
Сценарий 3: убыточная сделка
Цена покупки: 800 ₽, цена продажи: 720 ₽, количество: 200 акций, дивиденды: 3000 ₽, комиссии по 200 ₽, срок: 18 месяцев. Итог: чистый убыток −13 400 ₽, общая доходность −8,3%, годовая доходность −5,6%.
Формулы расчёта
Чистая прибыль (₽) = (Цена продажи × Количество) − (Цена покупки × Количество) + Дивиденды − Комиссия покупки − Комиссия продажи
Общая доходность (%) = (Чистая прибыль / (Цена покупки × Количество + Комиссия покупки)) × 100
Годовая доходность (%) = ((1 + Общая доходность / 100)(12 / Срок в месяцах) − 1) × 100
Годовая доходность показывает, сколько процентов годовых вы заработали бы, если бы доходность была равномерной. Это позволяет сравнивать инвестиции с разным сроком.
Пошаговое объяснение
1. Сначала калькулятор определяет затраты на покупку: цена одной акции умножается на количество, плюс комиссия брокера за сделку. Это ваши реальные вложения.
2. Затем вычисляется выручка от продажи: цена продажи, умноженная на количество акций, минус комиссия за продажу.
3. К выручке прибавляются полученные дивиденды — это дополнительный доход, который часто не учитывают новички, но который может существенно повысить результат.
4. Чистая прибыль — разница между всем полученным и всем вложенным. Отрицательное число означает убыток.
5. Общая доходность в процентах показывает, насколько вы приумножили капитал относительно вложенной суммы. Годовая доходность пересчитывает этот результат на 12 месяцев по формуле сложного процента, что удобно для сравнения с другими инструментами.
Где применяется
Оценка портфеля. Инвесторы используют расчёт доходности, чтобы понять, насколько эффективно работает их портфель акций за отчётный период.
Сравнение с депозитами. Годовая доходность акций позволяет напрямую сравнить результат с банковским вкладом: если акции дают 18% годовых, а депозит — 12%, разница очевидна.
Налоговое планирование. Зная точную прибыль от продажи акций, можно рассчитать налог (НДФЛ 13% или 15% с превышения порога) и подать декларацию.
Анализ стратегии. Трейдеры и активные инвесторы вычисляют доходность каждой сделки, чтобы оценить эффективность торговой стратегии и скорректировать риски.
Дивидендные стратегии. Расчёт помогает понять реальную роль дивидендов в общей доходности — иногда акции с умеренным ростом цены, но высокими дивидендами оказываются выгоднее быстрорастущих бумаг.
Обучение инвестициям. Начинающие инвесторы на конкретных цифрах видят, как работают сложный процент, комиссии и срок владения.
Важные нюансы
- Калькулятор не учитывает налоги. В России с прибыли от продажи акций удерживается НДФЛ 13% (или 15% с дохода свыше 5 млн ₽ в год). Реальная чистая прибыль будет меньше на сумму налога.
- Годовая доходность рассчитывается по формуле сложного процента (CAGR) и предполагает реинвестирование прибыли. Если вы выводите прибыль, реальная доходность может отличаться.
- Комиссии брокера могут быть сложнее: некоторые брокеры берут процент от оборота, а не фиксированную сумму. Уточните тарифы вашего брокера и введите среднее значение.
- Дивиденды указываются суммарно за весь период владения. Если вы получали дивиденды несколько раз, сложите все выплаты — калькулятор учтёт их как дополнительный доход.
- При сроке владения менее 1 месяца годовая доходность может быть очень высокой в процентах — это математически верно, но на практике такую доходность сложно удержать.
- Результат округляется до двух знаков после запятой — для большинства практических задач этой точности достаточно.
Частые ошибки
- Не учитывают комиссии. Даже небольшая комиссия в 0,05% при большом обороте может съесть значительную часть прибыли. Всегда вводите реальные комиссии брокера и биржи.
- Забывают про дивиденды. Инвесторы часто смотрят только на рост цены акции и упускают дивидендную доходность, которая может составлять 5–10% годовых дополнительно.
- Путают общую и годовую доходность. Доходность 50% за 3 года — это не 50% годовых, а примерно 14,5% годовых. Используйте именно годовую доходность для сравнения.
- Сравнивают акции с депозитом без учёта риска. Акции могут показать высокую доходность на истории, но не гарантируют её в будущем. Депозит надёжнее, но обычно менее доходен.
- Не учитывают спреды и проскальзывания. На низколиквидных акциях разница между ценой покупки и продажи (спред) может быть существенной и влиять на итоговый результат.
Ответы на частые вопросы
Как учесть дробные акции? Калькулятор работает с целыми акциями. Если у вас есть дробные остатки (например, 10,7 акции), укажите точное число в поле «Количество акций» — расчёт будет корректным.
Почему годовая доходность не совпадает с доходностью за период, делённой на срок? Потому что используется формула сложного процента (CAGR), которая учитывает эффект реинвестирования. Простое деление занижает реальную среднегодовую доходность.
Можно ли использовать калькулятор для ETF и ПИФов? Да, принцип расчёта тот же. В поле «Дивиденды» можно ввести сумму всех купонных или дивидендных выплат по фонду за период владения.
Что делать, если я ещё не продал акции? Укажите текущую рыночную цену в поле «Цена продажи». Калькулятор покажет нереализованную (бумажную) прибыль — это полезно для оценки текущего состояния портфеля.
Учитывает ли калькулятор валютную переоценку? Нет, все расчёты ведутся в рублях. Если вы покупали акции в долларах или евро, переведите все суммы в рубли по курсу на момент сделки.
Источники и справочные данные
Расчёт основан на стандартных формулах инвестиционного анализа: абсолютная прибыль, простая доходность и среднегодовая доходность (CAGR — Compound Annual Growth Rate). Формула CAGR является отраслевым стандартом и используется CFA Institute, Московской биржей и ведущими брокерами для оценки эффективности инвестиций. Данные о налогообложении соответствуют Налоговому кодексу РФ (статьи 214.1 и 224) по состоянию на 2025 год. Рекомендуем уточнять актуальные ставки и тарифы у вашего брокера и налогового консультанта.
Доходность акций: что нужно знать каждому инвестору
Из чего складывается доходность акций
Доходность акций — это не просто разница между ценой покупки и продажи. Она состоит из двух главных компонентов: курсовой рост и дивиденды. Курсовой рост — это увеличение рыночной цены акции за время владения. Дивиденды — часть прибыли компании, которую она распределяет среди акционеров. Оба источника одинаково важны, и опытные инвесторы всегда смотрят на их совокупный эффект.
Например, акция компании Х стоила 2000 ₽, а через год продана за 2400 ₽ — курсовая доходность составила 20%. Но если за этот год компания выплатила 100 ₽ дивидендов на акцию, общая доходность вырастет до 25%. Игнорировать дивиденды — значит терять полную картину.
Почему годовая доходность важнее общей
Допустим, Петя заработал 60% за 5 лет, а Вася — 25% за 1 год. Кто из них эффективнее распорядился деньгами? На первый взгляд кажется, что Петя, ведь 60% больше 25%. Но если пересчитать на годовые проценты с учётом сложного процента, получится: у Пети — около 9,9% годовых, а у Васи — 25% годовых. Вася оказался в два с половиной раза эффективнее.
Именно для такого сравнения нужен показатель CAGR — Compound Annual Growth Rate. Он показывает, сколько процентов годовых вы заработали бы, если бы доходность была равномерной из года в год, а прибыль реинвестировалась. Это золотой стандарт оценки инвестиций, который используют управляющие фондами, аналитики и опытные частные инвесторы.
Как комиссии съедают прибыль
Начинающие инвесторы часто упускают из виду комиссионные расходы. Между тем даже скромные 0,3% за сделку при активной торговле могут превратиться в десятки тысяч рублей за год. Допустим, вы торгуете с оборотом 1 млн ₽ в месяц. Комиссия 0,3% в обе стороны — это 6000 ₽ в месяц, или 72 000 ₽ в год. Это 7,2% от оборота, которые нужно заработать только для покрытия издержек.
Современные российские брокеры предлагают тарифы от 0,01% до 0,3% за сделку. Выбор правильного тарифа может существенно повлиять на итоговую доходность. Если вы долгосрочный инвестор, совершающий несколько сделок в год, комиссии почти незаметны. Но для активного трейдера это критически важный параметр.
Налоги: что вычитают из прибыли
В России доход от операций с ценными бумагами облагается налогом на доходы физических лиц (НДФЛ). Базовая ставка — 13% с прибыли до 5 млн ₽ в год, и 15% с суммы превышения. Налог удерживает брокер при выводе средств или по итогам года. Важно помнить: налогом облагается чистая прибыль, а не вся выручка от продажи.
Существуют законные способы оптимизации налогов: индивидуальный инвестиционный счёт (ИИС) с вычетом на взнос или на доход, трёхлетняя льгота при владении бумагами (ЛДВ), перенос убытков прошлых лет. Калькулятор показывает прибыль до налогов — окончательную чистую сумму вы сможете рассчитать самостоятельно с учётом вашей налоговой ситуации.
Риск и доходность: обратная сторона медали
Акции исторически дают более высокую доходность, чем банковские депозиты и облигации. Среднегодовая доходность российского рынка акций за последние 20 лет составляла около 12–14% в рублях с учётом дивидендов. Но эта цифра — средняя температура по больнице. В отдельные годы рынок падал на 40–70%, и не каждый инвестор способен пережить такие просадки, не продав акции в панике.
Главное правило инвестиций: чем выше потенциальная доходность, тем выше риск. Акции компаний первого эшелона (голубые фишки) обычно менее волатильны, чем акции третьего эшелона. Но даже самые надёжные бумаги могут упасть в цене. Поэтому профессиональные инвесторы всегда оценивают не только ожидаемую доходность, но и возможные потери.
Практические советы для расчёта доходности
Первое: всегда считайте доходность в рублях, а не в процентах на графике. Проценты могут вводить в заблуждение, особенно когда база расчёта неочевидна. Второе: учитывайте все денежные потоки — входящие и исходящие. Каждый рубль комиссий, дивидендов и налогов меняет итоговый результат. Третье: сравнивайте доходность акций с альтернативными вложениями — депозитами, облигациями, недвижимостью.
Используйте калькулятор регулярно: при покупке новых акций, при получении дивидендов, при ребалансировке портфеля. Это дисциплинирует и помогает видеть реальную картину, а не эмоциональное восприятие рынка. Инвестиции — это марафон, а не спринт. Точный расчёт доходности на длинной дистанции показывает, работает ли ваша стратегия на самом деле.
CihmdW5jdGlvbigpewogIHZhciBwdXJjaGFzZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0b2NrLXB1cmNoYXNlLXByaWNlJyk7CiAgdmFyIHNhbGVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdG9jay1zYWxlLXByaWNlJyk7CiAgdmFyIHF1YW50aXR5SW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RvY2stcXVhbnRpdHknKTsKICB2YXIgZGl2aWRlbmRzSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RvY2stZGl2aWRlbmRzJyk7CiAgdmFyIGNvbW1pc3Npb25CdXlJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdG9jay1jb21taXNzaW9uLWJ1eScpOwogIHZhciBjb21taXNzaW9uU2VsbElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0b2NrLWNvbW1pc3Npb24tc2VsbCcpOwogIHZhciBwZXJpb2RJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdG9jay1wZXJpb2QnKTsKICB2YXIgY2FsY0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdG9jay1jYWxjdWxhdGUtYnRuJyk7CiAgdmFyIHJlc2V0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0b2NrLXJlc2V0LWJ0bicpOwoKICB2YXIgZXJyb3JQdXJjaGFzZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1wdXJjaGFzZS1wcmljZScpOwogIHZhciBlcnJvclNhbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3Itc2FsZS1wcmljZScpOwogIHZhciBlcnJvclF1YW50aXR5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLXF1YW50aXR5Jyk7CiAgdmFyIGVycm9yRGl2aWRlbmRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLWRpdmlkZW5kcycpOwogIHZhciBlcnJvckNvbW1pc3Npb25CdXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3ItY29tbWlzc2lvbi1idXknKTsKICB2YXIgZXJyb3JDb21taXNzaW9uU2VsbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1jb21taXNzaW9uLXNlbGwnKTsKICB2YXIgZXJyb3JQZXJpb2QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3ItcGVyaW9kJyk7CgogIHZhciByZXN1bHRBYnNvbHV0ZVByb2ZpdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHQtYWJzb2x1dGUtcHJvZml0Jyk7CiAgdmFyIHJlc3VsdFRvdGFsUmV0dXJuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdC10b3RhbC1yZXR1cm4nKTsKICB2YXIgcmVzdWx0QW5udWFsUmV0dXJuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdC1hbm51YWwtcmV0dXJuJyk7CiAgdmFyIHJlc3VsdFRvdGFsSW52ZXN0ZWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0LXRvdGFsLWludmVzdGVkJyk7CiAgdmFyIHJlc3VsdFRvdGFsUmVjZWl2ZWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0LXRvdGFsLXJlY2VpdmVkJyk7CiAgdmFyIHJlc3VsdENvbW1pc3Npb25Ub3RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHQtY29tbWlzc2lvbi10b3RhbCcpOwoKICBmdW5jdGlvbiBoaWRlQWxsRXJyb3JzKCkgewogICAgdmFyIGVycm9ycyA9IFtlcnJvclB1cmNoYXNlLCBlcnJvclNhbGUsIGVycm9yUXVhbnRpdHksIGVycm9yRGl2aWRlbmRzLCBlcnJvckNvbW1pc3Npb25CdXksIGVycm9yQ29tbWlzc2lvblNlbGwsIGVycm9yUGVyaW9kXTsKICAgIGVycm9ycy5mb3JFYWNoKGZ1bmN0aW9uKGVsKSB7IGlmIChlbCkgZWwuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpOyB9KTsKICB9CgogIGZ1bmN0aW9uIHNob3dFcnJvcihlbCwgbXNnKSB7CiAgICBpZiAoZWwpIHsKICAgICAgZWwudGV4dENvbnRlbnQgPSBtc2c7CiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHBhcnNlUG9zaXRpdmVGbG9hdCh2YWx1ZSwgZmllbGROYW1lKSB7CiAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuIHsgZXJyb3I6ICfQn9C+0LvQtSDCqycgKyBmaWVsZE5hbWUgKyAnwrsg0L3QtSDQvNC+0LbQtdGCINCx0YvRgtGMINC/0YPRgdGC0YvQvC4nIH07CiAgICB9CiAgICB2YXIgbnVtID0gcGFyc2VGbG9hdCh2YWx1ZSk7CiAgICBpZiAoaXNOYU4obnVtKSkgewogICAgICByZXR1cm4geyBlcnJvcjogJ9Cf0L7Qu9C1IMKrJyArIGZpZWxkTmFtZSArICfCuyDQtNC+0LvQttC90L4g0LHRi9GC0Ywg0YfQuNGB0LvQvtC8LicgfTsKICAgIH0KICAgIGlmIChudW0gPCAwKSB7CiAgICAgIHJldHVybiB7IGVycm9yOiAn0J/QvtC70LUgwqsnICsgZmllbGROYW1lICsgJ8K7INC90LUg0LzQvtC20LXRgiDQsdGL0YLRjCDQvtGC0YDQuNGG0LDRgtC10LvRjNC90YvQvC4nIH07CiAgICB9CiAgICBpZiAoIWlzRmluaXRlKG51bSkpIHsKICAgICAgcmV0dXJuIHsgZXJyb3I6ICfQn9C+0LvQtSDCqycgKyBmaWVsZE5hbWUgKyAnwrsg0YHQvtC00LXRgNC20LjRgiDQvdC10LrQvtGA0YDQtdC60YLQvdC+0LUg0LfQvdCw0YfQtdC90LjQtS4nIH07CiAgICB9CiAgICByZXR1cm4geyB2YWx1ZTogbnVtIH07CiAgfQoKICBmdW5jdGlvbiBwYXJzZVBvc2l0aXZlRmxvYXRSZXF1aXJlZCh2YWx1ZSwgZmllbGROYW1lKSB7CiAgICB2YXIgcmVzdWx0ID0gcGFyc2VQb3NpdGl2ZUZsb2F0KHZhbHVlLCBmaWVsZE5hbWUpOwogICAgaWYgKHJlc3VsdC5lcnJvcikgcmV0dXJuIHJlc3VsdDsKICAgIGlmIChyZXN1bHQudmFsdWUgPD0gMCkgewogICAgICByZXR1cm4geyBlcnJvcjogJ9Cf0L7Qu9C1IMKrJyArIGZpZWxkTmFtZSArICfCuyDQtNC+0LvQttC90L4g0LHRi9GC0Ywg0LHQvtC70YzRiNC1INC90YPQu9GPLicgfTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBmdW5jdGlvbiBwYXJzZVBvc2l0aXZlSW50KHZhbHVlLCBmaWVsZE5hbWUpIHsKICAgIGlmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICByZXR1cm4geyBlcnJvcjogJ9Cf0L7Qu9C1IMKrJyArIGZpZWxkTmFtZSArICfCuyDQvdC1INC80L7QttC10YIg0LHRi9GC0Ywg0L/Rg9GB0YLRi9C8LicgfTsKICAgIH0KICAgIHZhciBudW0gPSBwYXJzZUZsb2F0KHZhbHVlKTsKICAgIGlmIChpc05hTihudW0pKSB7CiAgICAgIHJldHVybiB7IGVycm9yOiAn0J/QvtC70LUgwqsnICsgZmllbGROYW1lICsgJ8K7INC00L7Qu9C20L3QviDQsdGL0YLRjCDRh9C40YHQu9C+0LwuJyB9OwogICAgfQogICAgaWYgKG51bSA8IDApIHsKICAgICAgcmV0dXJuIHsgZXJyb3I6ICfQn9C+0LvQtSDCqycgKyBmaWVsZE5hbWUgKyAnwrsg0L3QtSDQvNC+0LbQtdGCINCx0YvRgtGMINC+0YLRgNC40YbQsNGC0LXQu9GM0L3Ri9C8LicgfTsKICAgIH0KICAgIGlmICghaXNGaW5pdGUobnVtKSkgewogICAgICByZXR1cm4geyBlcnJvcjogJ9Cf0L7Qu9C1IMKrJyArIGZpZWxkTmFtZSArICfCuyDRgdC+0LTQtdGA0LbQuNGCINC90LXQutC+0YDRgNC10LrRgtC90L7QtSDQt9C90LDRh9C10L3QuNC1LicgfTsKICAgIH0KICAgIGlmIChudW0gPCAxKSB7CiAgICAgIHJldHVybiB7IGVycm9yOiAn0JrQvtC70LjRh9C10YHRgtCy0L4g0LDQutGG0LjQuSDQtNC+0LvQttC90L4g0LHRi9GC0Ywg0L3QtSDQvNC10L3QtdC1IDEuJyB9OwogICAgfQogICAgaWYgKE1hdGguZmxvb3IobnVtKSAhPT0gbnVtKSB7CiAgICAgIHJldHVybiB7IGVycm9yOiAn0JrQvtC70LjRh9C10YHRgtCy0L4g0LDQutGG0LjQuSDQtNC+0LvQttC90L4g0LHRi9GC0Ywg0YbQtdC70YvQvCDRh9C40YHQu9C+0LwuJyB9OwogICAgfQogICAgcmV0dXJuIHsgdmFsdWU6IG51bSB9OwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0Q3VycmVuY3kobnVtKSB7CiAgICByZXR1cm4gTWF0aC5yb3VuZChudW0gKiAxMDApIC8gMTAwOwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0UGVyY2VudChudW0pIHsKICAgIHJldHVybiBNYXRoLnJvdW5kKG51bSAqIDEwMCkgLyAxMDA7CiAgfQoKICBmdW5jdGlvbiBjYWxjdWxhdGUoKSB7CiAgICBoaWRlQWxsRXJyb3JzKCk7CgogICAgdmFyIHB1cmNoYXNlUmVzID0gcGFyc2VQb3NpdGl2ZUZsb2F0UmVxdWlyZWQocHVyY2hhc2VJbnB1dC52YWx1ZSwgJ9Cm0LXQvdCwINC/0L7QutGD0L/QutC4Jyk7CiAgICBpZiAocHVyY2hhc2VSZXMuZXJyb3IpIHsgc2hvd0Vycm9yKGVycm9yUHVyY2hhc2UsIHB1cmNoYXNlUmVzLmVycm9yKTsgcmV0dXJuOyB9CgogICAgdmFyIHNhbGVSZXMgPSBwYXJzZVBvc2l0aXZlRmxvYXRSZXF1aXJlZChzYWxlSW5wdXQudmFsdWUsICfQptC10L3QsCDQv9GA0L7QtNCw0LbQuCcpOwogICAgaWYgKHNhbGVSZXMuZXJyb3IpIHsgc2hvd0Vycm9yKGVycm9yU2FsZSwgc2FsZVJlcy5lcnJvcik7IHJldHVybjsgfQoKICAgIHZhciBxdWFudGl0eVJlcyA9IHBhcnNlUG9zaXRpdmVJbnQocXVhbnRpdHlJbnB1dC52YWx1ZSwgJ9Ca0L7Qu9C40YfQtdGB0YLQstC+INCw0LrRhtC40LknKTsKICAgIGlmIChxdWFudGl0eVJlcy5lcnJvcikgeyBzaG93RXJyb3IoZXJyb3JRdWFudGl0eSwgcXVhbnRpdHlSZXMuZXJyb3IpOyByZXR1cm47IH0KCiAgICB2YXIgZGl2aWRlbmRzUmVzID0gcGFyc2VQb3NpdGl2ZUZsb2F0KGRpdmlkZW5kc0lucHV0LnZhbHVlIHx8ICcwJywgJ9CU0LjQstC40LTQtdC90LTRiycpOwogICAgaWYgKGRpdmlkZW5kc1Jlcy5lcnJvcikgeyBzaG93RXJyb3IoZXJyb3JEaXZpZGVuZHMsIGRpdmlkZW5kc1Jlcy5lcnJvcik7IHJldHVybjsgfQoKICAgIHZhciBjb21taXNzaW9uQnV5UmVzID0gcGFyc2VQb3NpdGl2ZUZsb2F0KGNvbW1pc3Npb25CdXlJbnB1dC52YWx1ZSB8fCAnMCcsICfQmtC+0LzQuNGB0YHQuNGPINC/0YDQuCDQv9C+0LrRg9C/0LrQtScpOwogICAgaWYgKGNvbW1pc3Npb25CdXlSZXMuZXJyb3IpIHsgc2hvd0Vycm9yKGVycm9yQ29tbWlzc2lvbkJ1eSwgY29tbWlzc2lvbkJ1eVJlcy5lcnJvcik7IHJldHVybjsgfQoKICAgIHZhciBjb21taXNzaW9uU2VsbFJlcyA9IHBhcnNlUG9zaXRpdmVGbG9hdChjb21taXNzaW9uU2VsbElucHV0LnZhbHVlIHx8ICcwJywgJ9Ca0L7QvNC40YHRgdC40Y8g0L/RgNC4INC/0YDQvtC00LDQttC1Jyk7CiAgICBpZiAoY29tbWlzc2lvblNlbGxSZXMuZXJyb3IpIHsgc2hvd0Vycm9yKGVycm9yQ29tbWlzc2lvblNlbGwsIGNvbW1pc3Npb25TZWxsUmVzLmVycm9yKTsgcmV0dXJuOyB9CgogICAgdmFyIHBlcmlvZFJlcyA9IHBhcnNlUG9zaXRpdmVGbG9hdFJlcXVpcmVkKHBlcmlvZElucHV0LnZhbHVlLCAn0KHRgNC+0Log0LLQu9Cw0LTQtdC90LjRjycpOwogICAgaWYgKHBlcmlvZFJlcy5lcnJvcikgeyBzaG93RXJyb3IoZXJyb3JQZXJpb2QsIHBlcmlvZFJlcy5lcnJvcik7IHJldHVybjsgfQogICAgaWYgKHBlcmlvZFJlcy52YWx1ZSA8PSAwKSB7CiAgICAgIHNob3dFcnJvcihlcnJvclBlcmlvZCwgJ9Ch0YDQvtC6INCy0LvQsNC00LXQvdC40Y8g0LTQvtC70LbQtdC9INCx0YvRgtGMINCx0L7Qu9GM0YjQtSDQvdGD0LvRjy4nKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciBwdXJjaGFzZVByaWNlID0gcHVyY2hhc2VSZXMudmFsdWU7CiAgICB2YXIgc2FsZVByaWNlID0gc2FsZVJlcy52YWx1ZTsKICAgIHZhciBxdWFudGl0eSA9IHF1YW50aXR5UmVzLnZhbHVlOwogICAgdmFyIGRpdmlkZW5kcyA9IGRpdmlkZW5kc1Jlcy52YWx1ZTsKICAgIHZhciBjb21taXNzaW9uQnV5ID0gY29tbWlzc2lvbkJ1eVJlcy52YWx1ZTsKICAgIHZhciBjb21taXNzaW9uU2VsbCA9IGNvbW1pc3Npb25TZWxsUmVzLnZhbHVlOwogICAgdmFyIHBlcmlvZE1vbnRocyA9IHBlcmlvZFJlcy52YWx1ZTsKCiAgICB2YXIgdG90YWxJbnZlc3RlZCA9IHB1cmNoYXNlUHJpY2UgKiBxdWFudGl0eSArIGNvbW1pc3Npb25CdXk7CiAgICB2YXIgdG90YWxSZWNlaXZlZCA9IHNhbGVQcmljZSAqIHF1YW50aXR5IC0gY29tbWlzc2lvblNlbGwgKyBkaXZpZGVuZHM7CiAgICB2YXIgbmV0UHJvZml0ID0gdG90YWxSZWNlaXZlZCAtIHRvdGFsSW52ZXN0ZWQ7CgogICAgdmFyIHRvdGFsUmV0dXJuUGVyY2VudCA9IDA7CiAgICBpZiAodG90YWxJbnZlc3RlZCA+IDApIHsKICAgICAgdG90YWxSZXR1cm5QZXJjZW50ID0gKG5ldFByb2ZpdCAvIHRvdGFsSW52ZXN0ZWQpICogMTAwOwogICAgfQoKICAgIHZhciBhbm51YWxSZXR1cm5QZXJjZW50ID0gMDsKICAgIGlmICh0b3RhbEludmVzdGVkID4gMCAmJiBwZXJpb2RNb250aHMgPiAwICYmIHRvdGFsUmV0dXJuUGVyY2VudCA+IC0xMDApIHsKICAgICAgdmFyIHRvdGFsUmV0dXJuRGVjaW1hbCA9IHRvdGFsUmV0dXJuUGVyY2VudCAvIDEwMDsKICAgICAgdmFyIGJhc2UgPSAxICsgdG90YWxSZXR1cm5EZWNpbWFsOwogICAgICBpZiAoYmFzZSA+IDApIHsKICAgICAgICBhbm51YWxSZXR1cm5QZXJjZW50ID0gKE1hdGgucG93KGJhc2UsIDEyIC8gcGVyaW9kTW9udGhzKSAtIDEpICogMTAwOwogICAgICB9CiAgICB9CgogICAgdmFyIHRvdGFsQ29tbWlzc2lvbiA9IGNvbW1pc3Npb25CdXkgKyBjb21taXNzaW9uU2VsbDsKCiAgICByZXN1bHRBYnNvbHV0ZVByb2ZpdC50ZXh0Q29udGVudCA9IGZvcm1hdEN1cnJlbmN5KG5ldFByb2ZpdCk7CiAgICByZXN1bHRUb3RhbFJldHVybi50ZXh0Q29udGVudCA9IGZvcm1hdFBlcmNlbnQodG90YWxSZXR1cm5QZXJjZW50KTsKICAgIHJlc3VsdEFubnVhbFJldHVybi50ZXh0Q29udGVudCA9IGZvcm1hdFBlcmNlbnQoYW5udWFsUmV0dXJuUGVyY2VudCk7CiAgICByZXN1bHRUb3RhbEludmVzdGVkLnRleHRDb250ZW50ID0gZm9ybWF0Q3VycmVuY3kodG90YWxJbnZlc3RlZCk7CiAgICByZXN1bHRUb3RhbFJlY2VpdmVkLnRleHRDb250ZW50ID0gZm9ybWF0Q3VycmVuY3kodG90YWxSZWNlaXZlZCk7CiAgICByZXN1bHRDb21taXNzaW9uVG90YWwudGV4dENvbnRlbnQgPSBmb3JtYXRDdXJyZW5jeSh0b3RhbENvbW1pc3Npb24pOwogIH0KCiAgZnVuY3Rpb24gcmVzZXRGb3JtKCkgewogICAgcHVyY2hhc2VJbnB1dC52YWx1ZSA9ICcnOwogICAgc2FsZUlucHV0LnZhbHVlID0gJyc7CiAgICBxdWFudGl0eUlucHV0LnZhbHVlID0gJyc7CiAgICBkaXZpZGVuZHNJbnB1dC52YWx1ZSA9ICcwJzsKICAgIGNvbW1pc3Npb25CdXlJbnB1dC52YWx1ZSA9ICcwJzsKICAgIGNvbW1pc3Npb25TZWxsSW5wdXQudmFsdWUgPSAnMCc7CiAgICBwZXJpb2RJbnB1dC52YWx1ZSA9ICcxMic7CiAgICBoaWRlQWxsRXJyb3JzKCk7CiAgICByZXN1bHRBYnNvbHV0ZVByb2ZpdC50ZXh0Q29udGVudCA9ICcwJzsKICAgIHJlc3VsdFRvdGFsUmV0dXJuLnRleHRDb250ZW50ID0gJzAnOwogICAgcmVzdWx0QW5udWFsUmV0dXJuLnRleHRDb250ZW50ID0gJzAnOwogICAgcmVzdWx0VG90YWxJbnZlc3RlZC50ZXh0Q29udGVudCA9ICcwJzsKICAgIHJlc3VsdFRvdGFsUmVjZWl2ZWQudGV4dENvbnRlbnQgPSAnMCc7CiAgICByZXN1bHRDb21taXNzaW9uVG90YWwudGV4dENvbnRlbnQgPSAnMCc7CiAgfQoKICBjYWxjQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2FsY3VsYXRlKTsKICByZXNldEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHJlc2V0Rm9ybSk7CgogIHZhciBpbnB1dEZpZWxkcyA9IFtwdXJjaGFzZUlucHV0LCBzYWxlSW5wdXQsIHF1YW50aXR5SW5wdXQsIGRpdmlkZW5kc0lucHV0LCBjb21taXNzaW9uQnV5SW5wdXQsIGNvbW1pc3Npb25TZWxsSW5wdXQsIHBlcmlvZElucHV0XTsKICBpbnB1dEZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uKGZpZWxkKSB7CiAgICBmaWVsZC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24oZSkgewogICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgY2FsY3VsYXRlKCk7CiAgICAgIH0KICAgIH0pOwogIH0pOwp9KSgpOwo=