Немного изменен интерфейс.
Готовое решение не оптимально по памяти, грязный код
Сделана оптимизация
Почищен код