Немного отрефакторенная рабочая версия