AAYMA
RU
Войти

TASK FORGE

Одностраничное приложение на чистом JS в метафоре кузницы: ИИ уточняет бизнес-задачу, рейтинг готовности 0–100, каталог с Hunt Map, контракты…

Прототип
Команда «JASAI» 3💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: JASAI
Кейс HackAlem.ai: Образование — AI Sana
Стадия: Прототип

Задача кейса: Challenge Hub: превратить задачу бизнеса в задание для студенческих команд

Суть

Одностраничное приложение на чистом JS в метафоре кузницы: ИИ уточняет бизнес-задачу, рейтинг готовности 0–100, каталог с Hunt Map, контракты студенческих команд и ручной выбор бизнеса.

Как устроено

Бизнес вводит черновик, ai.js через провайдера Grok (xAI) → OpenAI → эвристика задаёт вопросы по JSON-схемам и делает факт-чек. scoring.js считает рейтинг по 9 полям с признаками полноты (длина, глаголы, наличие цифр, источника данных, контакта). Данные в localStorage, 33 автотеста в tests.html, автодемо-прогон. В дереве файлов видны только index.html/tests.html, конфиги Next.js и zip-архив — описанные js/-модули, вероятно, внутри архива.

Ключевые решения

  • rule-based scoring
  • provider fallback chain
  • JSON schema validation
  • heuristic fallback

Особенности

Геймификация как логика продукта (температура слитка = рейтинг, печать на свитке = решение бизнеса), Hunt Map «рейтинг × сложность»; но код загружен преимущественно zip-архивом через «Add files via upload».

Стек

JavaScript · HTML/CSS · localStorage · Web Audio

Модели

Grok (xAI) · OpenAI


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-e3809f66-jasai.

README

README.md

TASK FORGE

Бизнес не пишет задачи. Бизнес куёт их. Студенты не откликаются. Студенты берут контракт. Слабая задача — холодный слиток. Сильная — раскалённый клинок.

MVP по кейсу «Рейтинг качества бизнес-задач и открытый выбор команд». Интерфейс на трёх языках: русском, казахском и английском. Репозиторий: https://github.com/BAITC-Hacks/hack-e3809f66-jasai


1. Что это

Проблема. Бизнес приносит студентам задачи вроде «Хотим понять, почему клиенты уходят». В таком описании нет данных, критериев успеха, сроков и контакта. Студенты тратят недели на выяснение деталей или берутся за задачу, которую невозможно довести до результата.

Решение. Бизнес описывает потребность своими словами. ИИ находит пробелы и задаёт уточняющие вопросы, из ответов собирается карточка задачи с рейтингом готовности 0–100. Чем полнее задача, тем выше её позиция в открытом каталоге. Студенческие команды сами выбирают задачи и отправляют контракты, а бизнес сам, вручную, принимает или отклоняет их.

Метафора кузницы — это логика продукта, а не только оформление:

В продуктеВ кузницеКак видно в интерфейсе
Черновик с низким рейтингомХолодный серый слиток со ржавчинойСлиток на наковальне серый, ядро рейтинга тусклое, подпись «Слиток не закалён»
Ответ на вопрос ИИУдар молотаМолот бьёт, искры летят из поля ответа в ядро рейтинга, число растёт
Рост рейтингаНагрев металлаЦвет слитка: пепел → ржавчина → жар → янтарь → добела; шкала температуры в градусах
Задача уровня «Приоритетная» (90+)Готовый клинокЛаймовое свечение, пульсация, «Оружие готово»
ПубликацияГотовое изделие уходит из кузницыЭкран раскалывается трещиной, вспышка, задача улетает метеоритом в каталог
Отклик командыКонтракт с подписьюФорма с подписью от руки на canvas, отправленный контракт сворачивается в свиток и улетает
Решение бизнесаПечать на свиткеСвиток разворачивается, печать «ОТОБРЕНО» или «ОТКАЗАНО» с отскоком

2. Быстрый старт

Нужен только браузер: Chrome или Edge (рекомендуется), Firefox. Установка пакетов и сборка не требуются.

git clone https://github.com/BAITC-Hacks/hack-e3809f66-jasai.git
cd hack-e3809f66-jasai
start index.html        # Windows  (macOS: open index.html, Linux: xdg-open index.html)

Или через локальный сервер: python -m http.server 8000 → http://localhost:8000.

  1. На главной нажмите «▶ Смотреть демо»: весь сценарий ТЗ пройдёт сам через настоящий интерфейс (~1,5 минуты).
  2. Тесты: откройте tests.html. Ожидаемый результат: PASSED: 33 из 33.
  3. Язык: переключатель РУС / ҚАЗ / ENG в шапке. Выбор запоминается в браузере.
  4. Звук: кнопка «♪ звук выкл» в шапке (по умолчанию выключен, браузеры запрещают автозвук).
  5. ИИ-провайдер (необязательно): раздел ИИ → вставить XAI_API_KEY (Grok) и/или OPENAI_API_KEY → «Сохранить». Приоритет: Grok → OpenAI → эвристика. Без ключей всё работает на эвристике.
  6. Сброс данных: раздел ИИ → «Сбросить демо-данные» (нажать дважды).

3. Архитектура

Одностраничное приложение на чистом JavaScript, без сборки. Модули подключаются через <script> и общаются через глобальные объекты. Данные хранятся в localStorage.

index.html          оболочка: mesh-фон, шум, загрузчик, canvas для искр
js/i18n.js          словари интерфейса: русский, казахский, английский
css/style.css       дизайн-система «Industrial Occult»: палитра, шрифты, анимации
js/seed.js          сид-данные 5+5+5+5, достижения, сценарий демо
js/scoring.js       формула рейтинга, уровни, температура слитка, сложность для Hunt Map (чистые функции)
js/ai-provider.js   выбор провайдера по приоритету: Grok (xAI) → OpenAI → эвристика
js/ai.js            промпты, JSON-схемы, эвристика, вызов API, валидация, факт-чек, рекомендации
js/store.js         состояние и операции: подтвердить, опубликовать, контракт, печать, этап, достижения
js/fx.js            атмосфера: Web Audio, искры, курсор, загрузчик, ритуал публикации, «шёпот», View Transitions
js/app.js           экраны и роутер
js/demo.js          автоматический демо-прогон по кнопке «Смотреть демо»
js/apprentice/      аватар «Кот-кузнец»: реплики, SVG-кот, контроллер состояний (подключается отдельно)
css/apprentice.css  стили и анимации кота
data/prompts.md     AI-промпты, провайдеры, формат входа и выхода, обработка ошибок
data/apprentice-reactions.md   когда и что говорит кот-кузнец
tests.html, js/tests.js   33 автотеста
flowchart LR
    UI[app.js<br/>экраны] --> Store[store.js<br/>состояние]
    UI --> Scoring[scoring.js<br/>рейтинг]
    UI --> AI[ai.js<br/>подмастерье]
    UI --> FX[fx.js<br/>атмосфера]
    UI --> I18N[i18n.js<br/>РУС · ҚАЗ · ENG]
    Demo[demo.js] --> UI
    Store --> LS[(localStorage)]
    AI --> Prov[ai-provider.js]
    Prov -.->|XAI_API_KEY| Grok[Grok xAI]
    Prov -.->|OPENAI_API_KEY| OpenAI[OpenAI API]
    Cat[apprentice/<br/>кот-кузнец] -.->|читает экран| UI
    AI --> Scoring

Метафоры в коде. strike() — удар молота (анимация, звук hammer, искры). updateScene() при росте рейтинга вызывает FX.flyTo(), и искры летят от поля ввода в ядро. FX.ritual() отвечает за трещину, вспышку и метеорит при публикации. decide() ставит печать на свиток. heatColor() превращает рейтинг в цвет металла.

ЭкранРольЧто делает
Главная (bento)всеМанифест, живой слиток, статистика, уровни, кнопка демо
Кузница #/forgeбизнесЧерновик → удары-вопросы → карточка → подтверждение → публикация. Справа сцена со слитком, молотом, ядром рейтинга, температурой и расшифровкой
Мои сплавы #/businessбизнесЗадачи компании, свитки, ожидающие печати, зал достижений
Каталог #/catalogвсеСписок или Hunt Map, сортировка, фильтры
Задача #/task/:idвсеКарточка, история закалки. Для команды — форма контракта, для владельца — свитки и печати
Компас #/compassкоманда3–5 рекомендаций, стрелка указывает на лучшую
Контракты #/contractsкомандаСвои свитки с печатями и баллами за этапы
Гильдии #/teamsвсеКоманды и баллы за подтверждённый прогресс
ИИ #/aiвсеРежим, ключ, промпты, журнал, проверка плохих ответов

4. Формула рейтинга

Баллы засчитываются только за подтверждённую карточку. Во время редактирования рейтинг пересчитывается мгновенно как предварительный: «Подтверждено 62 → станет 87 (+25)».

ПоказательВесПоля
Контекст и потребность20контекст 10 + потребность 10
Данные и материалы20данные
Ожидаемый результат15ожидаемый результат
Критерии успеха15критерии успеха
Ограничения10ограничения
Пользователи10пользователи
Связь с бизнесом10контакт 5 + формат взаимодействия 5
для каждого поля:
  пусто                       → 0
  короче 20 символов           → 0.3 × вес   (кроме контакта)
  выполнен признак полноты     → 1.0 × вес
  иначе                        → 0.7 × вес
рейтинг = Σ round(вес × доля)                 (0–100)

Признаки полноты:

  • Контекст: не менее 80 символов.
  • Потребность: не менее 40 символов и глагол изменения («нужно», «сократить», «автоматизировать»).
  • Пользователи: названа роль или количество.
  • Данные: указан источник (CSV, Excel, API, выгрузка…) и цифра (объём, период) либо описание от 60 символов.
  • Ожидаемый результат: не менее 50 символов и артефакт (прототип, бот, дашборд, модель…).
  • Критерии успеха: есть число или процент.
  • Ограничения: указаны срок, технология, доступ, NDA или бюджет.
  • Контакт: email, телефон или t.me.
  • Формат взаимодействия: указаны регулярность или канал.

Примеры расчёта (сценарий демо и сид-данные):

СостояниеРейтингУровень
«Хотим понять, почему клиенты уходят.» — только потребность, частично (7)7Черновик
+ ответ про данные (выгрузка за 2 года в CSV)27Черновик
+ контекст, ожидаемый результат, пользователи62Рабочая
+ ручная правка: критерии с цифрами (+15), контакт (+5), формат связи (+5)87Готовая
Сид-задача «Аналитика оттока учеников» (ограничения описаны слишком кратко: 3 из 10)93Приоритетная
Сид-задача «Оптимизация маршрутов курьеров» (все поля полные)100Приоритетная
ДиапазонУровеньПодписьВлияние
0–39Черновик«Слиток не закалён»Виден в каталоге с пометкой, откликаться можно
40–69Рабочая«Ещё удар молота»Задача участвует в рекомендациях
70–89Готовая«Почти клинок»Повышенная позиция в каталоге
90–100Приоритетная«Оружие готово» (пульсирует)Выделена свечением

Для каждого незаполненного или слабого поля показывается прирост и подсказка (например, «Критерии успеха: +15. Добавьте измеримый показатель: число, процент, время»). Подсказки видны в панели «Что повысит рейтинг» и в рукописном «шёпоте» у курсора.

5. Правила каталога

  1. В каталоге все опубликованные задачи, включая черновики. Низкий рейтинг задачу не скрывает и контракт не запрещает.
  2. Сортировка по умолчанию — по рейтингу (при равенстве выше более свежая). Доступна сортировка по дате и по названию. Номер #N — всегда позиция по рейтингу.
  3. Фильтры: отрасль (chips, один выбор) и уровень готовности (chips, несколько).
  4. Два вида: Список (карточки-сплавы) и Hunt Map. На карте ось Y — рейтинг с зонами уровней, ось X — сложность 1–10 (оценивается по ключевым словам результата и ограничений), размер звезды — число контрактов.
  5. После публикации задача сразу встаёт на свою позицию и подсвечивается вспышкой.
  6. Рекомендации (компас) — только подсказка среди задач с рейтингом ≥ 40, каталог не ограничивается.
  7. Число контрактов не ограничено. Решение принимает только владелец задачи кнопками «Принять · печать» / «Отклонить» / «Снять печать». Можно принять 0, 1 или несколько команд. Задача с принятым контрактом помечается «В работе».
  8. Баллы команда получает, когда бизнес подтверждает этап по принятому контракту: прототип +20, промежуточный результат +30, финальная сдача +50.

6. AI-модуль

Полная документация: data/prompts.md.

  • analyze (analyzeCompleteness) разносит черновик по полям и задаёт 3–5 вопросов по самым весомым пробелам, каждый с подсказкой hint.
  • buildCard собирает карточку из черновика, полей и ответов. Ответ на вопрос о поле X попадает в поле X.
РежимКак работает

AI-провайдеры

ПриоритетПровайдерКлючКогда используется
1Grok (xAI) — https://api.x.ai/v1, модель grok-3-miniXAI_API_KEYЕсли ключ указан
2OpenAI — https://api.openai.com/v1, модель gpt-4o-miniOPENAI_API_KEYЕсли указан, а ключа Grok нет
3Эвристика — локальные правила по ключевым словам—Если ключей нет или выбран режим «Только локальная эвристика»

Grok API совместим с OpenAI Chat Completions, поэтому оба провайдера получают один и тот же промпт и response_format: json_schema (strict, temperature: 0). Для Grok схема дополнительно передаётся текстом в промпте. Валидация, факт-чек и fallback общие. Модели меняются в настройках.

Как подключить Grok: получить ключ на https://console.x.ai → раздел ИИ → поле XAI_API_KEY → «Сохранить». В разделе показано, какой провайдер работает сейчас, а в консоли видно [AI] Provider: Grok (xAI). OpenAI подключается так же через поле OPENAI_API_KEY.

Ключи хранятся только в localStorage браузера и отправляются напрямую в API (оба сервиса разрешают запросы из браузера). В коде ключей нет. Файла .env у проекта нет, потому что нет сервера.

Если провайдер упал (неверный ключ, сеть, битый JSON, нарушение схемы), работает эвристика, а причина видна в интерфейсе и журнале.

Обработка ответа модели: сеть/HTTP → отказ или обрезка → JSON.parse → проверка схемы → факт-чек (новые числа или больше 50% новых слов → поле заменяется словами пользователя) → минимум 3 вопроса → подсказки. При любой ошибке используется эвристика, причина показывается в интерфейсе и пишется в журнал. Каждый вызов логируется в консоль с префиксом [AI]. Кнопки «Не JSON», «Нарушена схема», «Выдуманные факты» в разделе ИИ показывают реакцию валидатора.

Этика. ИИ не добавляет фактов, текст правит и подтверждает человек, ИИ не выбирает команду, персональные признаки не используются, рекомендации не ограничивают каталог.

7. Креативные механики

#МеханикаГдеСмысл
1Mesh-фон из трёх градиентов (lime / plasma / ember), дрейф 40 с + SVG feTurbulenceвездеМеталлическая пыль кузницы
2Кастомный курсор: кольцо 24 px с mix-blend-mode: difference и лаймовая точка; на ссылках кольцо 56 px, клик выбивает 6 искрdesktop, отключён на touch и при reduced motionРука кузнеца
3Scroll-Driven Forge: прокрутка кузницы поднимает молот и раздувает жар сценыкузницаСкролл — замах молота
4Искры (canvas, гравитация, затухание 1,2 с)удар, рост рейтинга, публикация, печать, достижениеЖар передаётся в задачу
5Ритуал публикации: SVG-трещины от центра (800 мс), вспышка, слиток улетает метеоритомпубликацияИзделие покидает кузницу
6Звук Web Audio: гул 45/60/90 Гц с LFO; эффекты hammer, spark, rumble, paper, stamp синтезируются на лету, без mp3кнопка в шапкеЗвук кузницы
7Микровзаимодействия: кнопки 1.02/0.98, карточки меняют радиусы углов, ядро бьётся при росте, орбиты вращаются быстрее на высоких уровняхвездеЖивой металл
8View Transitions: ядро рейтинга и название перелетают из каталога в карточку задачиChrome/EdgeЗадача остаётся тем же предметом
9Загрузчик «Forge Ignites»: искра → три луча → вспышка, один раз за сессиюпервый заходГорн разжигается
10Шёпот ИИ: через 3 с бездействия у курсора появляется рукописная подсказка («Критерии успеха: +15. Добавьте измеримый показатель…»)кузницаПодмастерье подсказывает
11Слиток на наковальне: цвет по температуре, ржавчина исчезает с ростом рейтингакузница, главнаяРейтинг = температура
12Подпись на canvas сохраняется как SVG-path и показывается на свиткеконтрактКонтракт скреплён подписью
13Свитки раскручиваются, печать шлёпается с отскокомзадача (бизнес), контрактыРешение — ручная печать
14Hunt Map: звёзды мерцают в зонах уровнейкаталогОхотник выбирает цель
15Компас: стрелка раскручивается и замирает на лучшей задачекомпасРекомендация, не приказ
16Достижения: «Первый удар», «Мастер деталей», «Идеальный сплав», «Щедрый мастер», «Первый контракт»медали с искрами, зал славыГеймификация бизнеса
17Три языка: РУС / ҚАЗ / ENG, переключение с плавным переходом без перезагрузкишапкаКузница открыта для всех
18Кот-кузнец: рыжий кот в фартуке с молотом — визуальный агент ИИ. Четыре состояния (ждёт, думает, готово, ошибка), короткие реплики на трёх языках, дышит, моргает, машет хвостом. Над формой кузницы и над свитками; в углу сидит постоянно и отзывается на кликкузница, свитки, угол экранаПодмастерье, который не решает за мастера

Все анимации отключаются при prefers-reduced-motion.

8. Тестовые сценарии

Автотесты (tests.html, 33 проверки): веса 100, группы по шкале ТЗ, 0 и 100 баллов, границы 39/40, 69/70, 89/90, частичные баллы, рост после дополнения, сортировка, эвристика (≥3 вопросов, без выдуманных фактов), валидатор (не-JSON, схема, выдуманные цифры, корректный ответ), рекомендации только от 40, сид-данные 5+5+5+5, подписи уровней, температура, сложность, траектория демо, полнота словарей трёх языков, русское склонение, рейтинг английской и казахской карточек.

Ручные сценарии:

#ДействияОжидаемый результат
1Кузница → «Первый удар» с пустым или коротким черновикомОшибка «от 20 символов», анализ не запускается
2Черновик «Хотим понять, почему клиенты уходят.» → анализРейтинг 7, уровень «Черновик», 5 вопросов, медаль «Первый удар»
3Ответить на вопрос про данныеМолот бьёт, искры летят в ядро, рейтинг 7 → 27
4Собрать карточку → подтвердить → дописать критерии с цифрамиПанель «Подтверждено 62 → станет 77 (+15)», публикация заблокирована до повторного подтверждения
5Команда: контракт без подписи и с короткой идеейОшибки валидации, контракт не отправлен
6Бизнес: развернуть свиток → «Принять · печать» → «Подтвердить этап»Печать «ОТОБРЕНО», задача «В работе», команда получает +20 в «Гильдиях»
7ИИ → неверный ключ Grok или OpenAI → анализСообщение «ответ модели отклонён… → fallback», кот с красными глазами «Связь с горном потеряна», вопросы от эвристики
8Переключить язык на ҚАЗ, затем на ENG на любом экранеВесь интерфейс, подсказки, вопросы ИИ и подписи демо переводятся без перезагрузки; введённые данные сохраняются

9. Демо за 5 минут

ВремяЧто показать
0:00–0:20Главная: манифест, живой слиток. Загрузчик уже отыграл при входе
0:20–1:50«▶ Смотреть демо» — автопрогон шагов 1–8 с подписями внизу экрана. Можно остановить и пройти вручную
1:50–2:40Вручную: кузница, слабый черновик → ответы → искры и рост рейтинга → шёпот-подсказка → правка критериев → подтверждение
2:40–3:10Публикация: трещина, метеорит, задача на своей позиции, медаль «Идеальный сплав»
3:10–3:50Каталог: Список ↔ Hunt Map, фильтры, черновик виден. Роль команды: компас, контракт с подписью, свиток улетает
3:50–4:30Роль бизнеса: свиток разворачивается, печать «ОТОБРЕНО», этап +20. Роль команды: «Контракты»
4:30–5:00Раздел ИИ: промпты, журнал, кнопка «Выдуманные факты» — валидатор удаляет выдумку

10. Ограничения MVP

  • Нет сервера: данные хранятся в localStorage одного браузера (файла /data/db.json и API routes нет).
  • Нет регистрации и ролевой модели: роль и компания или команда выбираются в шапке.
  • Нет чата, уведомлений, календаря, файлового хранилища, полноценного трекера (вне рамок ТЗ, раздел 7).
  • Эвристика ИИ работает по ключевым словам и не понимает смысл так, как модель. Формула полноты проверяет признаки (длина, цифры, ключевые слова), а не качество текста.
  • Grok и OpenAI вызываются из браузера: ключи хранятся в localStorage. Для продакшена нужен серверный прокси. С живыми ключами провайдеры не проверялись; проверены выбор провайдера, ошибки неверного ключа, валидация и fallback. Названия моделей меняются в настройках.
  • Сложность на Hunt Map — эвристическая оценка, а не экспертная.
  • Desktop-first: на мобильных всё открывается, но эффекты рассчитаны на мышь.
  • Шрифты подключаются с Google Fonts; без интернета используются системные запасные.
  • Переводится интерфейс, а не контент: задачи, контракты и профили команд показываются на том языке, на котором их написали. Сценарий демо использует русские тексты задачи. Эвристика ИИ и формула полноты понимают ключевые слова на трёх языках, но лучше всего настроены на русский.

11. Технологии и почему

ТехнологияЗачем
Чистый JavaScript (ES2020), HTML, CSSПроект открывается двойным кликом: жюри не нужны Node.js и npm install, ничего не сломается на защите
CSS custom properties + color-mix()Один параметр --heat окрашивает слиток, ядро, свечение сцены и карточки — температура задачи проходит через весь интерфейс
Canvas 2DИскры с гравитацией и полётом к цели, подпись от руки
SVGСлиток, молот, наковальня, трещины ритуала, подписи в свитках, шум feTurbulence
Web Audio APIГул горна и звуки удара, искр, бумаги и печати синтезируются на лету — без аудиофайлов
View Transitions APIЯдро рейтинга перелетает из каталога в карточку; в других браузерах обычный переход
Grok (xAI) / OpenAI Chat Completions + structured outputsАнализ черновика и сборка карточки со строгой JSON-схемой; провайдер выбирается по приоритету, ответ дополнительно проверяется на клиенте
localStorageСостояние между перезапусками без сервера
Собственный модуль i18nСловари РУС / ҚАЗ / ENG с правилами склонения; тест проверяет, что во всех языках одинаковый набор ключей
Google Fonts: Space Grotesk, Inter Tight, JetBrains Mono, Caveat, UnboundedЗаголовки, текст, цифры рейтинга, рукописные подписи, логотип

Deployed-версия: пока нет. Проект статический, поэтому его можно опубликовать на GitHub Pages без изменений: Settings → Pages → Deploy from branch → main / root.


Начните с холодного слитка. Закончите клинком. Бизнес не пишет задачи — бизнес куёт их.

NEED TO DEPLOY!!!

Звёзды
⭐ 0
Форки
0
Язык
HTML
Последний push
в прошлом месяце
Коммиты
10
Авторы
2
Файлы
16
Ветки
1

Авторы коммитов

lolololo88 8ayauyoyo 2

История коммитов

  • 2026-09-23 17:49Update README.mdayauyoyo
  • 2026-09-23 17:41Add files via uploadlolololo88
  • 2026-09-23 17:40Fix heading formatting in README.mdlolololo88
  • 2026-09-23 17:40Add files via uploadlolololo88
  • 2026-09-23 15:27Fix header formatting in README.mdlolololo88
  • 2026-09-23 15:26Add files via uploadlolololo88
  • 2026-09-23 15:02Add files via uploadayauyoyo
  • 2026-09-23 15:01Add files via uploadlolololo88
Все коммиты (10)
  • 2026-09-23 15:00Add files via uploadlolololo88
  • 2026-09-23 14:15Enhance README with project details and usagelolololo88
Структура репозитория (16 файлов)
.env.example
.gitignore
README.md
hack-e3809f66-jasai-1 (2).zip
index.html
next-env.d.ts
next.config.mjs
package-lock.json
package.json
playwright.config.ts
postcss.config.mjs
tailwind.config.ts
tests.html
tsconfig.json
tsconfig.tsbuildinfo
vitest.config.ts

Обсуждение 0 комментариев

Войдите, чтобы комментировать

Пока нет комментариев — будьте первым.