From 12a81c7c9741f07739f42d039617413b41b5231a Mon Sep 17 00:00:00 2001 From: Storozhenko Evgeny Vladimirovich aka kpa39l Date: Sun, 12 Apr 2026 19:06:59 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=81=D1=82=D0=B0=D1=82=D1=8C=D1=8F:=20=D0=9A?= =?UTF-8?q?=D0=BE=D0=BC=D0=BC=D1=83=D0=BD=D0=B8=D0=B7=D0=BC=20=D0=BD=D0=B5?= =?UTF-8?q?=20=D1=83=D1=82=D0=BE=D0=BF=D0=B8=D1=8F=20(12.04.2026)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .qwen/PROJECT_SUMMARY.md | 112 ++++ PAPERMOD_PARAMS.md | 625 ++++++++++++++++++ QWEN.md | 187 +++++- Telegram_frontend.md | 558 ++++++++++++++++ .../20260412 kommunizm ne utopia/index.md | 71 ++ favicon.png | Bin 0 -> 4230 bytes .../SmileDed/RedDed-20260307-145623.piskel | 1 + .../SmileDed/SmileDed-20260307-150124.piskel | 1 + .../SmileDed/SmileDed-20260307-150217.piskel | 1 + .../SmileDed/SmileDed-20260307-150416.piskel | 1 + .../SmileDed/SmileDed-20260307-150523.piskel | 1 + .../SmileDed16-20260307-151033.piskel | 1 + .../SmileDed16-20260307-151258.piskel | 1 + .../SmileDed512-20260307-150629.piskel | 1 + .../favicon/SmileDed/favicon-1024x1024.png | Bin 0 -> 27102 bytes .../favicon/SmileDed/favicon-128x128.png | Bin 0 -> 1083 bytes .../favicon/SmileDed/favicon-192x192.png | Bin 0 -> 1869 bytes .../favicon/SmileDed/favicon-256x256.png | Bin 0 -> 2961 bytes .../favicon/SmileDed/favicon-512x512.png | Bin 0 -> 9333 bytes .../images/favicon/SmileDed/favicon-64x64.png | Bin 0 -> 453 bytes static/images/favicon/favicon-16x16.png | Bin 0 -> 375 bytes static/images/favicon/favicon-32x32-3.png | Bin 0 -> 384 bytes static/images/favicon/favicon-32x32.png | Bin 0 -> 673 bytes static/images/favicon/favicon.ico | Bin 0 -> 15406 bytes static/images/favicon/favicon48x48.ico | Bin 0 -> 726 bytes 25 files changed, 1536 insertions(+), 25 deletions(-) create mode 100644 .qwen/PROJECT_SUMMARY.md create mode 100644 PAPERMOD_PARAMS.md create mode 100644 Telegram_frontend.md create mode 100644 content/posts/20260412 kommunizm ne utopia/index.md create mode 100644 favicon.png create mode 100644 static/images/favicon/SmileDed/RedDed-20260307-145623.piskel create mode 100644 static/images/favicon/SmileDed/SmileDed-20260307-150124.piskel create mode 100644 static/images/favicon/SmileDed/SmileDed-20260307-150217.piskel create mode 100644 static/images/favicon/SmileDed/SmileDed-20260307-150416.piskel create mode 100644 static/images/favicon/SmileDed/SmileDed-20260307-150523.piskel create mode 100644 static/images/favicon/SmileDed/SmileDed16-20260307-151033.piskel create mode 100644 static/images/favicon/SmileDed/SmileDed16-20260307-151258.piskel create mode 100644 static/images/favicon/SmileDed/SmileDed512-20260307-150629.piskel create mode 100644 static/images/favicon/SmileDed/favicon-1024x1024.png create mode 100644 static/images/favicon/SmileDed/favicon-128x128.png create mode 100644 static/images/favicon/SmileDed/favicon-192x192.png create mode 100644 static/images/favicon/SmileDed/favicon-256x256.png create mode 100644 static/images/favicon/SmileDed/favicon-512x512.png create mode 100644 static/images/favicon/SmileDed/favicon-64x64.png create mode 100644 static/images/favicon/favicon-16x16.png create mode 100644 static/images/favicon/favicon-32x32-3.png create mode 100644 static/images/favicon/favicon-32x32.png create mode 100644 static/images/favicon/favicon.ico create mode 100644 static/images/favicon/favicon48x48.ico diff --git a/.qwen/PROJECT_SUMMARY.md b/.qwen/PROJECT_SUMMARY.md new file mode 100644 index 0000000..36f363c --- /dev/null +++ b/.qwen/PROJECT_SUMMARY.md @@ -0,0 +1,112 @@ +The user wants me to create a comprehensive project summary in markdown format based on the conversation history. Let me analyze what has been done: + +1. This is a Hugo blog project with PaperMod theme +2. The site is deployed to a remote server via SFTP/WinSCP +3. Recent work included: + - Favicon configuration + - TOML structure fixes + - Russian localization + - Date format customization + - Git commits and deployment + +Let me create a comprehensive summary that captures all the important context for future sessions.# Project Summary + +## Overall Goal +Организация блога на основе Hugo с темой PaperMod для публикации контента на dedinit.ru с интеграцией Gitea (gitverse.ru) и деплоем на хостинг (myjino.ru). + +## Key Knowledge + +### Technology Stack +- **Hugo Extended** v0.155.1 (установлена через winget) +- **Тема**: PaperMod (форк `rDedInit` как submodule) +- **Хранение статей**: bundle format (папка с `index.md`) +- **Frontmatter**: YAML формат +- **Git**: Gitea сервер `gitverse.ru:kpa39l/dedinit.ru` (SSH порт 2222) +- **Деплой**: WinSCP через Makefile на `kpa39l.myjino.ru:2222` + +### Конфигурация (hugo.toml) +```toml +baseURL = 'https://dedinit.ru/' +languageCode = 'ru-ru' +timeZone = 'Europe/Moscow' +DateFormat = "02.01.2006 15:04" # формат: 06.03.2026 19:30 + +[languages.ru] + languageName = "Русский" + languageCode = "ru-ru" + weight = 1 + +[params.assets] + favicon = "images/favicon/favicon48x48.ico" + favicon16x16 = "images/favicon/favicon-16x16.png" + favicon32x32 = "images/favicon/favicon-32x32.png" +``` + +### Важные решения +1. Git-репозиторий инициализирован в папке Hugo-сайта (не во внешней папке) +2. Папка `public/` исключена из репозитория через `.gitignore` +3. Настройки PaperMod должны быть в `[params]`, а favicon — в `[params.assets]` +4. Для русификации требуется секция `[languages.ru]` (не только `languageCode`) + +### Команды +```bash +make build # собрать сайт +make deploy # собрать и задеплоить +make deploy-dry-run # симуляция деплоя +hugo server # локальный сервер разработки +``` + +## Recent Actions + +### Выполнено +1. **[DONE] Настройка favicon** + - Файлы: `static/images/favicon/*.ico`, `*.png` + - Конфигурация в `[params.assets]` + - `.gitignore` обновлён для исключения лишних файлов (zip, piscel, android-chrome) + +2. **[DONE] Исправление структуры hugo.toml** + - Объединены дублирующиеся секции `[params]` + - Настройки PaperMod перемещены в `[params]` (работает `disableSpecial1stPost`) + +3. **[DONE] Русификация темы** + - Добавлена секция `[languages.ru]` + - Формат даты: `02.01.2006 15:04` → `06.03.2026 19:30` + - Время чтения: "минута/минуты/минут" (склонение работает) + - Язык в сборке: `│ RU` + +4. **[DONE] Деплой** + - Коммит запушен в `gitverse.ru:kpa39l/dedinit.ru` + - Сайт загружен на `kpa39l.myjino.ru` через WinSCP + +### Статус репозитория +- Последний коммит: «Русификация сайта и настройка формата даты» +- Ветка: `main` (синхронизирована с origin) +- Untracked файлы: `favicon.png`, `static/` (требуют решения) + +## Current Plan + +### Текущий статус +1. **[DONE]** Установка Hugo Extended +2. **[DONE]** Создание сайта dedinit.ru +3. **[DONE]** Установка темы PaperMod (submodule) +4. **[DONE]** Настройка bundle формата статей +5. **[DONE]** Интеграция с Gitea (gitverse.ru) +6. **[DONE]** Настройка favicon +7. **[DONE]** Русификация (даты, время чтения) +8. **[DONE]** Первый деплой на myjino.ru + +### Следующие шаги [TODO] +1. Решить судьбу untracked файлов (`favicon.png`, `static/`) +2. Проверить работу сайта на dedinit.ru +3. Настроить CI/CD (опционально) +4. Добавить новые статьи в блог + +### Примечания +- После обновления Hugo требуется перезапуск терминала (обновление PATH) +- Для локальной разработки: `hugo server` +- Все изменения фиксируются в README.md и QWEN.md + +--- + +## Summary Metadata +**Update time**: 2026-03-06T11:03:13.225Z diff --git a/PAPERMOD_PARAMS.md b/PAPERMOD_PARAMS.md new file mode 100644 index 0000000..a6d26d4 --- /dev/null +++ b/PAPERMOD_PARAMS.md @@ -0,0 +1,625 @@ +# 📋 Полный справочник параметров темы rDedInit (PaperMod) + +## Описание + +Этот документ содержит **все параметры конфигурации** темы rDedInit (форк PaperMod), которые вы можете использовать в файле `hugo.toml` (или `hugo.yaml`/`config.yaml`) и во frontmatter постов. + +--- + +## 📁 Глобальные параметры (в hugo.toml) + +### Базовые параметры сайта + +| Параметр | Описание | Пример | +|----------|----------|--------| +| `baseURL` | Базовый URL сайта | `baseURL = 'https://dedinit.ru/'` | +| `languageCode` | Код языка сайта | `languageCode = 'ru-ru'` | +| `title` | Заголовок сайта | `title = 'dedinit()'` | +| `theme` | Используемая тема | `theme = 'rDedInit'` | +| `timeZone` | Часовой пояс для дат | `timeZone = 'Europe/Moscow'` | +| `preserveTaxonomyNames` | Сохранять имена таксономий | `preserveTaxonomyNames = true` | +| `metaDataFormat` | Формат frontmatter | `metaDataFormat = "yaml"` | + +--- + +## ⚙️ Параметры в секции [params] + +### 🎨 Тема и внешний вид + +| Параметр | Описание | Значения | По умолчанию | +|----------|----------|----------|--------------| +| `defaultTheme` | Тема по умолчанию | `"light"`, `"dark"`, `"auto"` | `"auto"` | +| `disableThemeToggle` | Отключить переключатель темы | `true`, `false` | `false` | +| `env` | Окружение (влияет на SEO, аналитику) | `"production"`, `"development"` | `"development"` | + +**Пример:** +```toml +[params] + defaultTheme = "auto" + disableThemeToggle = false + env = "production" +``` + +--- + +### 📝 Информация о сайте + +| Параметр | Описание | Пример | +|----------|----------|--------| +| `title` | Заголовок сайта (альтернативный) | `title = "dedinit.ru"` | +| `description` | Описание сайта для мета-тегов | `description = "Блог об_ops-ах..."` | +| `keywords` | Ключевые слова сайта | `keywords = ["блог", "программирование"]` | +| `author` | Автор сайта (по умолчанию для всех постов) | `author = "Кразя"` | +| `DateFormat` | Формат отображения даты | `DateFormat = "02.01.2006 15:04"` | +| `language` | Код языка | `language = "ru"` | +| `languageAlt` | Альтернативный код языка | `languageAlt = "ru"` | + +--- + +### 🏠 Главная страница (Home-Info Mode) + +| Параметр | Описание | Пример | +|----------|----------|--------| +| `homeInfoParams.Title` | Заголовок информационной секции | `Title = "Привет! 👋"` | +| `homeInfoParams.Content` | Содержимое информационной секции | `Content = "Добро пожаловать..."` | +| `homeInfoParams.AlignSocialIconsTo` | Выравнивание соц. иконок | `AlignSocialIconsTo = "center"` | + +**Пример:** +```toml +[params.homeInfoParams] + Title = "Привет! 👋" + Content = "Добро пожаловать в мой блог!" + AlignSocialIconsTo = "center" +``` + +--- + +### 👤 Режим профиля (Profile Mode) + +| Параметр | Описание | Значения | +|----------|----------|----------| +| `profileMode.enabled` | Включить режим профиля | `true`, `false` | +| `profileMode.title` | Заголовок профиля | Текст | +| `profileMode.subtitle` | Подзаголовок профиля | Текст | +| `profileMode.imageUrl` | Путь к изображению профиля | Путь или URL | +| `profileMode.imageTitle` | Alt-текст изображения | Текст | +| `profileMode.imageWidth` | Ширина изображения | Число (px) | +| `profileMode.imageHeight` | Высота изображения | Число (px) | +| `profileMode.buttons` | Кнопки действий | Массив `{name, url}` | + +**Пример:** +```toml +[params.profileMode] + enabled = true + title = "Имя Фамилия" + subtitle = "Разработчик, блогер, энтузиаст" + imageUrl = "/images/profile.jpg" + imageTitle = "Моё фото" + imageWidth = 150 + imageHeight = 150 + +[[params.profileMode.buttons]] + name = "Архив" + url = "/posts/" + +[[params.profileMode.buttons]] + name = "GitHub" + url = "https://github.com/username" +``` + +--- + +### 📱 Социальные иконки + +| Параметр | Описание | Пример | +|----------|----------|--------| +| `socialIcons` | Список соц. иконок | Массив `{name, url}` | + +**Пример:** +```toml +[[params.socialIcons]] + name = "telegram" + url = "https://t.me/username" + +[[params.socialIcons]] + name = "github" + url = "https://github.com/username" + +[[params.socialIcons]] + name = "linkedin" + url = "https://linkedin.com/in/username" +``` + +**Поддерживаемые платформы:** telegram, github, gitlab, twitter, x-twitter, linkedin, facebook, instagram, youtube, reddit, discord, stack-overflow, mastodon, и другие. + +--- + +### 📄 Параметры постов (глобальные) + +| Параметр | Описание | Значения | По умолчанию | +|----------|----------|----------|--------------| +| `ShowReadingTime` | Показывать время чтения | `true`, `false` | `false` | +| `ShowWordCount` | Показывать количество слов | `true`, `false` | `false` | +| `ShowShareButtons` | Показывать кнопки шеринга | `true`, `false` | `false` | +| `ShareButtons` | Какие кнопки шеринга показывать | Массив | `["twitter", "facebook", "linkedin"]` | +| `ShowBreadCrumbs` | Показывать хлебные крошки | `true`, `false` | `false` | +| `ShowPostNavLinks` | Показывать навигацию между постами | `true`, `false` | `false` | +| `ShowCodeCopyButtons` | Показывать кнопки копирования кода | `true`, `false` | `false` | +| `hideAuthor` | Скрывать информацию об авторе | `true`, `false` | `false` | +| `disableSpecial1stPost` | Отключить специальный стиль первого поста | `true`, `false` | `false` | +| `ShowAllPagesInArchive` | Показывать все страницы в архиве | `true`, `false` | `false` | +| `mainSections` | Основные секции для главной | Массив | `["posts"]` | + +**Пример:** +```toml +[params] + ShowReadingTime = true + ShowWordCount = true + ShowShareButtons = true + ShareButtons = ["telegram", "twitter", "linkedin", "reddit"] + ShowBreadCrumbs = true + ShowPostNavLinks = true + ShowCodeCopyButtons = true + mainSections = ["posts", "blog"] +``` + +--- + +### 🖼️ Обложки (Cover) + +| Параметр | Описание | Значения | +|----------|----------|----------| +| `cover.responsiveImages` | Генерировать адаптивные изображения | `true`, `false` | +| `cover.linkFullImages` | Ссылка на полное изображение | `true`, `false` | +| `cover.hidden` | Скрывать обложку в списках | `true`, `false` | +| `cover.hiddenInList` | Скрывать обложку только в списках | `true`, `false` | + +**Пример:** +```toml +[params.cover] + responsiveImages = true + linkFullImages = true +``` + +--- + +### ✏️ Редактирование постов + +| Параметр | Описание | Пример | +|----------|----------|--------| +| `editPost.URL` | URL репозитория для редактирования | `"https://github.com/user/repo/content"` | +| `editPost.Text` | Текст кнопки редактирования | `"Редактировать"` | +| `editPost.appendFilePath` | Добавлять путь к файлу в URL | `true`, `false` | + +**Пример:** +```toml +[params.editPost] + URL = "https://github.com/dedinit/dedinit.ru/content" + Text = "Предложить правки" + appendFilePath = true +``` + +--- + +### 🔍 Поиск (Fuse.js) + +| Параметр | Описание | Значения | +|----------|----------|----------| +| `fuseOpts.isCaseSensitive` | Чувствительность к регистру | `true`, `false` | +| `fuseOpts.shouldSort` | Сортировать результаты | `true`, `false` | +| `fuseOpts.location` | Позиция начала поиска | Число | +| `fuseOpts.distance` | Расстояние для поиска | Число | +| `fuseOpts.threshold` | Порог соответствия (0.0–1.0) | Число | +| `fuseOpts.minMatchCharLength` | Мин. длина совпадения | Число | +| `fuseOpts.limit` | Ограничение результатов | Число | +| `fuseOpts.keys` | Поля для поиска | Массив | + +**Пример:** +```toml +[params.fuseOpts] + isCaseSensitive = false + shouldSort = true + location = 0 + distance = 1000 + threshold = 0.4 + minMatchCharLength = 2 + limit = 10 + keys = ["title", "summary", "content"] +``` + +--- + +### 👥 Авторы + +| Параметр | Описание | Пример | +|----------|----------|--------| +| `author` | Авторы сайта по умолчанию | `author = ["Кразя"]` | + +Может быть переопределено во frontmatter поста: +```yaml +--- +author: ["Автор 1", "Автор 2"] +--- +``` + +--- + +### 📊 Footer (Подвал) + +| Параметр | Описание | Значения | +|----------|----------|----------| +| `footer.hideCopyright` | Скрыть информацию о копирайте | `true`, `false` | +| `footer.text` | Текст в подвале (до ссылки на Hugo) | Текст (markdown) | +| `hideFooter` | Полностью скрыть подвал | `true`, `false` | +| `disableScrollToTop` | Отключить кнопку "Наверх" | `true`, `false` | + +**Пример:** +```toml +[params.footer] + hideCopyright = false + text = "Сделано с ❤️" +``` + +--- + +### 🔗 Label (Логотип в шапке) + +| Параметр | Описание | Пример | +|----------|----------|--------| +| `label.text` | Текст логотипа | `text = "dedinit()"` | +| `label.icon` | Путь к иконке логотипа | `icon = "/images/logo.png"` | +| `label.iconSVG` | SVG логотипа (inline) | `iconSVG = "..."` | +| `label.iconHeight` | Высота иконки | `iconHeight = 30` | + +**Пример:** +```toml +[params.label] + text = "dedinit()" + icon = "/images/favicon/favicon48x48.ico" + iconHeight = 30 +``` + +--- + +### 📈 Аналитика и верификация + +| Параметр | Описание | Пример | +|----------|----------|--------| +| `analytics.google.SiteVerificationTag` | Тег верификации Google | `SiteVerificationTag = "XXXXXXXXXX"` | +| `analytics.yandex.SiteVerificationTag` | Тег верификации Яндекс | `SiteVerificationTag = "YYYYYYYYYY"` | +| `analytics.bing.SiteVerificationTag` | Тег верификации Bing | `SiteVerificationTag = "ZZZZZZZZZZ"` | +| `analytics.naver.SiteVerificationTag` | Тег верификации Naver | `SiteVerificationTag = "AAAAAAAAAA"` | + +**Пример:** +```toml +[params.analytics.google] + SiteVerificationTag = "XXXXXXXXXX" + +[params.analytics.yandex] + SiteVerificationTag = "YYYYYYYYYY" +``` + +**Google Analytics (в секции services):** +```toml +[services.googleAnalytics] + ID = "G-XXXXXXXXXX" +``` + +--- + +### 🎯 Прочие параметры + +| Параметр | Описание | Значения | +|----------|----------|----------| +| `CanonicalLinkText` | Текст для canonical ссылки | `"Originally published at"` | +| `displayFullLangName` | Показывать полное название языка | `true`, `false` | +| `ShowPageNums` | Показывать номера страниц в пагинации | `true`, `false` | +| `ShowRssButtonInSectionTermList` | Показывать RSS кнопку в разделах | `true`, `false` | + +--- + +### 🔧 Assets (Ресурсы) + +| Параметр | Описание | Значения | +|----------|----------|----------| +| `assets.favicon` | Путь к favicon.ico | Путь | +| `assets.favicon16x16` | Путь к favicon 16x16 | Путь | +| `assets.favicon32x32` | Путь к favicon 32x32 | Путь | +| `assets.apple_touch_icon` | Путь к Apple touch icon | Путь | +| `assets.safari_pinned_tab` | Путь к Safari pinned tab | Путь | +| `assets.theme_color` | Цвет темы для браузера | HEX цвет | +| `assets.msapplication_TileColor` | Цвет плитки MS | HEX цвет | +| `assets.disableScrollBarStyle` | Отключить стили скроллбара | `true`, `false` | +| `assets.disableFingerprinting` | Отключить fingerprinting | `true`, `false` | + +**Пример:** +```toml +[params.assets] + favicon = "images/favicon/favicon48x48.ico" + favicon16x16 = "images/favicon/favicon-16x16.png" + favicon32x32 = "images/favicon/favicon-32x32.png" + apple_touch_icon = "images/favicon/apple-touch-icon.png" + theme_color = "#2e2e33" +``` + +--- + +### 📑 Schema.org разметка + +| Параметр | Описание | Пример | +|----------|----------|--------| +| `schema.publisherType` | Тип издателя | `"Organization"`, `"Person"` | +| `schema.sameAs` | Ссылки на соц. профили | Массив URL | + +**Пример:** +```toml +[params.schema] + publisherType = "Person" + sameAs = ["https://t.me/username", "https://github.com/username"] +``` + +--- + +## 📝 Frontmatter параметры (в постах) + +Эти параметры указываются в начале каждого поста (в YAML/TOML): + +| Параметр | Описание | Пример | +|----------|----------|--------| +| `title` | Заголовок поста | `title = "Мой пост"` | +| `description` | Описание поста | `description = "Краткое описание"` | +| `date` | Дата публикации | `date = 2026-03-06T19:30:00+03:00` | +| `lastmod` | Дата последнего изменения | `lastmod = 2026-03-07T10:00:00+03:00` | +| `publishDate` | Дата публикации (альтернативная) | `publishDate = 2026-03-06` | +| `draft` | Черновик (не публиковать) | `draft = true` | +| `tags` | Теги поста | `tags = ["hugo", "blog"]` | +| `categories` | Категории поста | `categories = ["технологии"]` | +| `keywords` | Ключевые слова поста | `keywords = ["hugo", "golang"]` | +| `author` | Автор поста (переопределение) | `author = ["Имя"]` | +| `canonicalURL` | Canonical URL | `canonicalURL = "https://..."` | +| `CanonicalLinkText` | Текст canonical ссылки | `CanonicalLinkText = "Оригинал"` | + +### Параметры отображения поста + +| Параметр | Описание | Значения | +|----------|----------|----------| +| `ShowReadingTime` | Показывать время чтения | `true`, `false` | +| `ShowWordCount` | Показывать количество слов | `true`, `false` | +| `ShowBreadCrumbs` | Показывать хлебные крошки | `true`, `false` | +| `ShowPostNavLinks` | Показывать навигацию | `true`, `false` | +| `ShowShareButtons` | Показывать кнопки шеринга | `true`, `false` | +| `ShowCodeCopyButtons` | Показывать кнопки копирования | `true`, `false` | +| `ShowToc` | Показывать оглавление | `true`, `false` | +| `TocOpen` | Оглавление открыто по умолчанию | `true`, `false` | +| `UseHugoToc` | Использовать встроенный Hugo TOC | `true`, `false` | +| `disableAnchoredHeadings` | Отключить якорные заголовки | `true`, `false` | +| `hideSummary` | Скрыть саммари в списке | `true`, `false` | +| `hideMeta` | Скрыть мета-информацию | `true`, `false` | +| `hideAuthor` | Скрыть автора | `true`, `false` | +| `hideFooter` | Скрыть подвал на странице | `true`, `false` | +| `searchHidden` | Скрыть из поиска | `true`, `false` | +| `hiddenInHomeList` | Скрыть с главной страницы | `true`, `false` | +| `robotsNoIndex` | Запретить индексацию | `true`, `false` | + +### Обложка поста + +```yaml +cover: + image: "/images/cover.jpg" + alt: "Описание изображения" + caption: "Подпись к изображению" + relative: false + hidden: false + hiddenInList: false +``` + +### Редактирование поста + +```yaml +editPost: + URL: "https://github.com/user/repo/content/post.md" + Text: "Предложить правки" + appendFilePath: true +``` + +--- + +## 🗂️ Структура [outputs] + +Настройка форматов вывода для разных типов страниц: + +```toml +[outputs] + home = ["HTML", "RSS", "JSON"] # JSON нужен для поиска + page = ["HTML"] + section = ["HTML", "RSS"] + taxonomy = ["HTML", "RSS"] + term = ["HTML", "RSS"] +``` + +--- + +## 🏷️ Таксономии + +```toml +[taxonomies] + category = "categories" + tag = "tags" +``` + +--- + +## 🎨 Подсветка синтаксиса (Chroma) + +```toml +[markup.highlight] + style = "github-dark" + lineNos = true + tabWidth = 4 +``` + +**Доступные стили:** `github`, `github-dark`, `monokai`, `dracula`, `one-dark`, и другие. + +--- + +## 🌐 Многоязычность + +```toml +[languages] + [languages.ru] + languageName = "Русский" + languageCode = "ru-ru" + weight = 1 + title = "dedinit()" + [languages.ru.params] + languageAltTitle = "Russian" + + [languages.en] + languageName = "English" + languageCode = "en-us" + weight = 2 + title = "dedinit()" +``` + +--- + +## 📜 Меню + +```toml +[[menu.main]] + name = "Главная" + url = "/" + weight = 10 + +[[menu.main]] + name = "Архив" + url = "/posts/" + weight = 20 + +[[menu.main]] + name = "Категории" + url = "/categories/" + weight = 30 +``` + +--- + +## 🔑 Горячие клавиши (AccessKeys) + +| Клавиша | Действие | +|---------|----------| +| `Alt + H` | Перейти на главную | +| `Alt + T` | Переключить тему | +| `Alt + C` | Открыть/закрыть оглавление | +| `Alt + G` | Перейти к началу страницы | +| `Alt + /` | Перейти к поиску (если в меню) | + +--- + +## 📌 Пример полной конфигурации + +```toml +baseURL = 'https://dedinit.ru/' +languageCode = 'ru-ru' +title = 'dedinit()' +theme = 'rDedInit' +timeZone = 'Europe/Moscow' +preserveTaxonomyNames = true +metaDataFormat = "yaml" + +[params] + env = "production" + title = "dedinit.ru" + description = "Блог об_ops-ах" + keywords = ["блог", "программирование", "mlops", "devops"] + author = "Кразя" + DateFormat = "02.01.2006 15:04" + language = "ru" + languageAlt = "ru" + + # Тема + defaultTheme = "auto" + disableThemeToggle = false + + # Посты + ShowReadingTime = true + ShowWordCount = true + ShowShareButtons = false + ShareButtons = ["telegram", "twitter", "linkedin"] + ShowPostNavLinks = true + ShowBreadCrumbs = true + ShowCodeCopyButtons = true + disableSpecial1stPost = true + + # Главная + mainSections = ["posts"] + + # Footer + disableScrollToTop = false + +[params.assets] + favicon = "images/favicon/favicon48x48.ico" + favicon16x16 = "images/favicon/favicon-16x16.png" + favicon32x32 = "images/favicon/favicon-32x32.png" + +[params.label] + text = "dedinit()" + icon = "images/favicon/favicon48x48.ico" + iconHeight = 30 + +[outputs] + home = ["HTML", "RSS"] + page = ["HTML"] + section = ["HTML", "RSS"] + +[taxonomies] + category = "categories" + tag = "tags" + +[markup.highlight] + style = "github-dark" + lineNos = true + tabWidth = 4 + +[menu] + [[menu.main]] + name = "Главная" + url = "/" + weight = 10 + [[menu.main]] + name = "Архив" + url = "/posts/" + weight = 20 + +[languages] + [languages.ru] + languageName = "Русский" + languageCode = "ru-ru" + weight = 1 + title = "dedinit()" + +[services.googleAnalytics] + ID = "" +``` + +--- + +## 📚 Источники + +- [Официальная документация PaperMod](https://github.com/adityatelange/hugo-PaperMod/wiki) +- [Документация Hugo](https://gohugo.io/documentation/) +- [Пример конфигурации PaperMod](https://github.com/adityatelange/hugo-PaperMod/tree/exampleSite) + +--- + +## 💡 Советы + +1. **Минимальная конфигурация**: Для начала достаточно указать `title`, `description`, `author`, `defaultTheme` +2. **SEO**: Включите `env = "production"` для активации мета-тегов +3. **Производительность**: `ShowCodeCopyButtons` и `ShowReadingTime` не влияют на скорость +4. **Кастомизация**: Используйте `assets/css/extended/blank.css` для своих стилей +5. **Frontmatter**: Параметры во frontmatter переопределяют глобальные настройки + +--- + +**Документ актуален для версии темы rDedInit на базе PaperMod v9.x** diff --git a/QWEN.md b/QWEN.md index 659ba2b..0fee33b 100644 --- a/QWEN.md +++ b/QWEN.md @@ -5,44 +5,181 @@ 1. Все важные решения и изменения фиксируются в README.md 2. Взаимодействие происходит на русском языке 3. Перед применением изменений проверяется корректность принятых решений -4. Цель - максимально быстро запустить проект для публикации контента +4. Цель — максимально быстро запустить проект для публикации контента -## Текущая задача +## Описание проекта -Организация блога на основе Hugo с темой PaperMod: -- Установка Hugo расширенной версии -- Создание нового сайта dedinit.ru -- Установка темы PaperMod -- Настройка bundle хранения статей -- Интеграция с Gitea сервером gitea.nixg.ru через SSH +**dedinit.ru** — блог на основе генератора статических сайтов Hugo с кастомной темой **rDedInit** (форк PaperMod). + +**Основная цель:** платформа для публикации лонгридов с поддержкой блоков кода и подсветки синтаксиса. + +### Технические характеристики + +| Параметр | Значение | +|----------|----------| +| Генератор | Hugo Extended 0.155.1 | +| Тема | rDedInit (форк PaperMod) | +| Язык | Русский (ru-ru) | +| Формат статей | Bundle (папка с index.md) | +| Деплой | SFTP (kpa39l.myjino.ru:2222) | + +### Структура проекта + +``` +dedinit.ru/ +├── content/ +│ ├── posts/ # Статьи блога (bundle формат) +│ └── telegram/ # Telegram-посты (планируется) +├── themes/ +│ └── rDedInit/ # Кастомная тема на базе PaperMod +├── static/ +│ └── images/ +│ └── favicon/ # Favicon в стиле пиксель-арт (SmileDed) +├── public/ # Сгенерированный сайт (исключён из git) +├── layouts/ # Кастомные шаблоны (если есть) +├── assets/ # CSS/JS ресурсы +├── hugo.toml # Конфигурация Hugo +├── Makefile # Команды сборки и деплоя +└── docs/ # Документация +``` ## Проверочные действия -Перед выполнением каждого этапа будут выполняться проверки: -- Наличие установленного Hugo -- Возможность создания нового сайта -- Корректность настроек темы -- Подключение к Gitea серверу +Перед выполнением каждого этапа выполняются проверки: +- Наличие установленного Hugo (`hugo version`) +- Возможность сборки сайта (`hugo`) +- Корректность настроек темы (проверка `hugo.toml`) +- Работоспособность деплоя (`make deploy-dry-run`) + +## Команды проекта + +### Сборка и запуск + +```bash +hugo # Генерация сайта в public/ +hugo server # Локальный сервер (http://localhost:1313) +make build # Сборка через Makefile +make clean # Очистка public/ +make rebuild # Полная пересборка +``` + +### Деплой + +```bash +make deploy # Сборка + деплой на хостинг +make deploy-dry-run # Симуляция деплоя +make help # Список доступных команд +``` + +### Параметры деплоя + +| Параметр | Значение | +|----------|----------| +| Хост | kpa39l.myjino.ru | +| Порт SFTP | 2222 | +| Пользователь | kpa39l_dedinit | +| Путь | /dedinit.ru | + +## Принятые технические решения + +1. **Структура проекта**: Git-репозиторий инициализирован в папке с Hugo-сайтом +2. **Формат статей**: Bundle (папка с index.md) для удобного хранения статьи и связанных файлов +3. **Тема rDedInit**: Собственная тема на базе PaperMod с русификацией +4. **Деплой**: Кроссплатформенный (rsync для Unix, WinSCP для Windows) +5. **Favicon**: Набор в стиле пиксель-арт (SmileDed) с логотипом 48px в шапке +6. **Подсветка кода**: github-dark стиль с номерами строк + +## Конфигурация темы (hugo.toml) + +### Основные параметры + +```toml +baseURL = 'https://dedinit.ru/' +title = 'dedinit()' +theme = 'rDedInit' +timeZone = 'Europe/Moscow' +metaDataFormat = "yaml" +``` + +### Параметры PaperMod + +```toml +[params] + env = "production" + defaultTheme = "auto" + ShowReadingTime = true + ShowPostNavLinks = true + ShowBreadCrumbs = true + ShowCodeCopyButtons = true + disableSpecial1stPost = true + +[markup.highlight] + style = "github-dark" + lineNos = true + tabWidth = 4 +``` + +## Дорожная карта (ROADMAP) + +### Завершённые задачи ✅ + +- [x] Установка Hugo Extended 0.155.1 +- [x] Создание сайта dedinit.ru +- [x] Установка темы PaperMod (submodule) +- [x] Создание собственной темы rDedInit +- [x] Настройка bundle формата статей +- [x] Настройка favicon и логотипа (SmileDed) +- [x] SFTP-деплой на kpa39l.myjino.ru +- [x] Написание первых статей (6 публикаций) + +### Текущие задачи 🎯 + +- [ ] Настройка цветовой схемы темы +- [ ] Русификация интерфейса (i18n/ru.yaml) +- [ ] Визуальное оформление Telegram-постов +- [ ] Публикация новых статей + +### Планы 📈 + +- [ ] SEO оптимизация (Open Graph, sitemap) +- [ ] Аналитика (Google Analytics/Яндекс.Метрика) +- [ ] Поиск по сайту (Fuse.js) +- [ ] Комментарии (Giscus/Utterances) ## Примечания - Важно обеспечить поддержку блоков кода и подсветки синтаксиса -- Необходимо предусмотреть хранение контента на внешнем сервере - Проект должен быть готов к публикации контента как можно скорее +- Папка `public/` исключена из git-репозитория +- Для обновления Hugo: `winget install Hugo.Hugo.Extended` ## Информация о системе -- Hugo была установлена через winget -- Для обновления Hugo до последней версии используется команда: `winget install Hugo.Hugo.Extended` +- ОС: Windows 11 +- Hugo установлена через winget +- Требуется перезапуск терминала после установки/обновления Hugo - Текущая версия Hugo: 0.155.1 -- После установки/обновления Hugo требуется перезапуск терминала для обновления PATH -## Принятые решения в ходе реализации +## Полезные ссылки -1. **Структура проекта**: Git-репозиторий инициализирован в папке с Hugo-сайтом, а не во внешней папке -2. **Интеграция с Gitea**: Используется SSH-подключение по порту 2222 -3. **Файлы документации**: Все файлы документации находятся в папке проекта Hugo-сайта -4. **Исключение папки public**: Создан .gitignore файл для исключения папки public из репозитория -5. **Bundle формат статей**: Используется формат bundle (папка с index.md) для хранения статей -6. **Тема PaperMod**: Установлена как submodule с выбором совместимой версии -7. **Решение проблемы совместимости**: Выбрана версия темы, совместимая с установленной версией Hugo \ No newline at end of file +- [Документация PaperMod](https://github.com/adityatelange/hugo-PaperMod/wiki) +- [Документация Hugo](https://gohugo.io/documentation/) +- [PAPERMOD_PARAMS.md](PAPERMOD_PARAMS.md) — полный справочник параметров темы +- [ROADMAP.md](ROADMAP.md) — дорожная карта проекта +- [DEPLOY_INSTRUCTIONS.md](DEPLOY_INSTRUCTIONS.md) — инструкция по деплою + +## Файлы документации + +| Файл | Описание | +|------|----------| +| README.md | Основное описание проекта | +| ROADMAP.md | Дорожная карта развития | +| PAPERMOD_PARAMS.md | Справочник параметров темы | +| DEPLOY_INSTRUCTIONS.md | Инструкция по деплою | +| gitea-setup.md | Настройка интеграции с Gitea | +| docs/favicon-logo-setup.md | Настройка favicon и логотипа | +| Telegram_frontend.md | Оформление Telegram-постов | + +--- + +**Последнее обновление:** 5 марта 2026 г. diff --git a/Telegram_frontend.md b/Telegram_frontend.md new file mode 100644 index 0000000..625e4d2 --- /dev/null +++ b/Telegram_frontend.md @@ -0,0 +1,558 @@ +# Запрос: + +Давай посмотрим как сделать красивое представление постов из Телеграма в моём блоге с темой pappermode для hugo. Для телеграма есть вот такой виджет для встаивания поста в любой сойт. Мне очень нравится как это выглядит. https://core.telegram.org/widgets/post. Ты сможешь каким-то образом скопировать оформление и что тебе для этого от меня нужно? + +# Ответ: + +Отличная идея! Виджет Telegram выглядит действительно красиво и минималистично. Давайте разберем варианты интеграции с Hugo PaperMod. + +## Что мне нужно от вас: + +1. **Ссылка на ваш Telegram-канал** (публичный) +2. **Предпочтительный способ интеграции** (выберите один): + - Простое встраивание через iframe (официальный виджет) + - Кастомный shortcode с похожим дизайном + - Автоматический импорт постов как контента Hugo + +## Варианты решения: + +### Вариант 1: Официальный виджет Telegram (самый простой) + +Можно создавать **shortcode** для Hugo, который встраивает посты: + +```html + +
+
+ Смотреть пост в Telegram +
+ +
+``` + +**Использование:** +```markdown +{{< telegram-post "https://t.me/yourchannel/123" >}} +``` + +### Вариант 2: Кастомный стиль (полный контроль) + +Я могу помочь создать **собственный CSS-дизайн**, имитирующий стиль Telegram с: +- Адаптивной версткой +- Поддержкой темной/светлой темы PaperMod +- Кастомными цветами +- Оптимизацией под мобильные устройства + +### Вариант 3: Автоматический импорт (самый мощный) + +Создать скрипт, который: +- Скачивает посты из канала +- Конвертирует их в Markdown для Hugo +- Сохраняет медиафайлы +- Создает фронтматтер с датами и тегами + +**Какой вариант вас больше интересует?** Или, может быть, комбинация нескольких подходов? + +Также покажите, пожалуйста, ваш текущий сайт (если уже есть), чтобы я мог предложить стили, которые будут гармонично сочетаться с PaperMod. + +Отлично! Раз у вас уже есть структура с папками по ID постов, давайте определим полную структуру layouts для типа контента "telegram-posts". + +## Необходимые layouts: + +``` +layouts/ +├── telegram/ # или telegram-posts +│ ├── list.html # Страница списка всех постов +│ ├── single.html # Страница отдельного поста +│ ├── baseof.html # Базовый шаблон (опционально) +│ └── summary.html # Карточка поста для списка (важно!) +├── partials/ +│ ├── telegram-card.html # Компонент карточки поста +│ └── telegram-header.html # Шапка с аватаром и именем канала +└── shortcodes/ + └── telegram-embed.html # Шорткод для встраивания +``` + +**Ключевой момент:** `summary.html` - это то, что будет отображаться в списках (на главной, в разделах). + +## Что нужно от вас: + +1. **Как называется ваш content type?** (telegram, posts, tg-posts?) +2. **Покажите структуру папок** с одним постом: + ``` + content/ + └── telegram/ + └── 123/ + ├── index.md + ├── photo1.jpg + └── video.mp4 + ``` +3. **Какие поля во фронтматтере** index.md? (date, title, text, media и т.д.) + +Как только покажете структуру - создам: +- ✅ Карточки в стиле Telegram (копирование дизайна виджета) +- ✅ Список постов с пагинацией +- ✅ Отдельные страницы постов +- ✅ Адаптацию под PaperMod (темная/светлая тема) +- ✅ CSS стили с анимациями + +Покажите пример вашего index.md и я начну создавать шаблоны! 🚀 + + +Отлично! Теперь давайте создадим полную интеграцию. + +## План действий: + +### 1. Сначала создайте структуру в Hugo: + +```bash +cd ваш-hugo-сайт +mkdir -p content/telegram +mkdir -p layouts/telegram +mkdir -p layouts/partials +mkdir -p assets/css +``` + +### 2. Напишите скрипт синхронизации (Python): + +Создайте `scripts/sync_telegram.py`: + +```python +#!/usr/bin/env python3 +import shutil +import yaml +from pathlib import Path + +ARCHIVES_DIR = Path("../telegram-archiver/archives/dedinit") +CONTENT_DIR = Path("content/telegram") + +def sync_telegram_posts(): + CONTENT_DIR.mkdir(parents=True, exist_ok=True) + + for post_folder in ARCHIVES_DIR.iterdir(): + if not post_folder.is_dir(): + continue + + post_id = post_folder.name + dest_folder = CONTENT_DIR / post_id + dest_folder.mkdir(parents=True, exist_ok=True) + + # Копируем index.md + src_md = post_folder / "index.md" + if src_md.exists(): + # Читаем и добавляем type + content = src_md.read_text(encoding='utf-8') + if 'type: telegram' not in content: + content = content.rstrip() + "\ntype: telegram\n" + src_md.write_text(content, encoding='utf-8') + shutil.copy2(src_md, dest_folder / "index.md") + + # Копируем медиафайлы + for media_file in post_folder.glob("*"): + if media_file.name != "index.md": + shutil.copy2(media_file, dest_folder / media_file.name) + + print(f"Synced post {post_id}") + +if __name__ == "__main__": + sync_telegram_posts() +``` + +### 3. Создайте базовый шаблон `layouts/telegram/single.html`: + +```html +{{ define "main" }} +
+
+ +
+
+ {{ .Site.Params.telegram.channelName | default +
+ +
+ + +
+ {{ .Content }} +
+ + + {{ if .Params.media_files }} +
+ {{ range .Params.media_files }} + {{ if eq .type "photo" }} +
+ {{ .caption | default + {{ if .caption }} +
{{ .caption }}
+ {{ end }} +
+ {{ else if eq .type "video" }} +
+ +
+ {{ end }} + {{ end }} +
+ {{ end }} + + + +
+ + {{ template "_internal/disqus.html" . }} +
+{{ end }} +``` + +### 4. Создайте шаблон списка `layouts/telegram/list.html`: + +```html +{{ define "main" }} +
+
+

{{ .Title }}

+ {{ if .Site.Params.telegram.channelName }} +

Archive of {{ .Site.Params.telegram.channelName }}

+ {{ end }} +
+ + + + {{ template "_internal/pagination.html" . }} +
+{{ end }} +``` + +### 5. Создайте CSS стили `assets/css/telegram.css`: + +```css +/* Telegram Post Styles - PaperMod Compatible */ + +:root { + --telegram-bg: var(--theme); + --telegram-card-bg: var(--code-bg); + --telegram-text: var(--primary); + --telegram-secondary: var(--secondary); + --telegram-border: var(--border); + --telegram-blue: #2481cc; + --telegram-blue-hover: #1a68a8; +} + +/* Single Post */ +.telegram-post-container { + max-width: 640px; + margin: 0 auto; + padding: 20px; +} + +.telegram-post { + background: var(--telegram-card-bg); + border-radius: 12px; + padding: 16px; + box-shadow: 0 1px 2px rgba(0,0,0,0.1); +} + +.telegram-post-header { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 12px; +} + +.telegram-post-avatar { + width: 48px; + height: 48px; + border-radius: 50%; + overflow: hidden; + flex-shrink: 0; +} + +.telegram-post-avatar img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.telegram-post-info { + flex: 1; +} + +.telegram-post-channel { + font-weight: 600; + color: var(--telegram-blue); + font-size: 15px; +} + +.telegram-post-date { + font-size: 13px; + color: var(--telegram-secondary); +} + +.telegram-post-content { + font-size: 15px; + line-height: 1.6; + color: var(--telegram-text); + margin-bottom: 12px; +} + +.telegram-post-content p { + margin: 0 0 12px 0; +} + +.telegram-post-content p:last-child { + margin-bottom: 0; +} + +/* Media */ +.telegram-post-media { + display: flex; + flex-direction: column; + gap: 8px; + margin-bottom: 12px; +} + +.telegram-photo { + border-radius: 8px; + overflow: hidden; +} + +.telegram-photo img { + width: 100%; + height: auto; + display: block; +} + +.telegram-photo-caption { + padding: 8px; + font-size: 14px; + color: var(--telegram-secondary); + background: rgba(0,0,0,0.05); +} + +.telegram-video { + border-radius: 8px; + overflow: hidden; +} + +.telegram-video video { + width: 100%; + display: block; +} + +/* Footer */ +.telegram-post-footer { + display: flex; + justify-content: space-between; + align-items: center; + padding-top: 12px; + border-top: 1px solid var(--telegram-border); + font-size: 13px; + color: var(--telegram-secondary); +} + +.telegram-link { + color: var(--telegram-blue); + text-decoration: none; + font-weight: 500; + transition: color 0.2s; +} + +.telegram-link:hover { + color: var(--telegram-blue-hover); + text-decoration: underline; +} + +/* Posts List */ +.telegram-list-container { + max-width: 800px; + margin: 0 auto; + padding: 20px; +} + +.telegram-list-header { + margin-bottom: 32px; + text-align: center; +} + +.telegram-list-title { + font-size: 28px; + margin-bottom: 8px; +} + +.telegram-list-description { + color: var(--telegram-secondary); +} + +.telegram-posts-grid { + display: grid; + gap: 16px; +} + +.telegram-post-card { + background: var(--telegram-card-bg); + border-radius: 12px; + overflow: hidden; + transition: transform 0.2s, box-shadow 0.2s; + border: 1px solid var(--telegram-border); +} + +.telegram-post-card:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0,0,0,0.1); +} + +.telegram-post-card-link { + display: block; + text-decoration: none; + color: inherit; +} + +.telegram-post-card-header { + padding: 12px 16px; + border-bottom: 1px solid var(--telegram-border); +} + +.telegram-post-card-date { + font-size: 13px; + color: var(--telegram-secondary); +} + +.telegram-post-card-content { + padding: 16px; + font-size: 15px; + line-height: 1.6; +} + +.telegram-post-card-media { + max-height: 300px; + overflow: hidden; +} + +.telegram-post-card-media img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.telegram-post-card-footer { + padding: 12px 16px; + font-size: 13px; + color: var(--telegram-secondary); + border-top: 1px solid var(--telegram-border); +} + +/* Responsive */ +@media (max-width: 768px) { + .telegram-post-container, + .telegram-list-container { + padding: 12px; + } + + .telegram-post { + padding: 12px; + } +} +``` + +### 6. Добавьте в `config.yml`: + +```yaml +params: + telegram: + channelName: "Дед in АйТи" + channelUrl: "https://t.me/dedinit" + avatar: "images/channel-avatar.jpg" + +# Если используете модули +module: + mounts: + - source: content/telegram + target: content/telegram +``` + +### 7. Подключите CSS в `layouts/_default/baseof.html` или создайте partial: + +```html + +{{ $telegram := resources.Get "css/telegram.css" }} +{{ $telegram = $telegram | resources.Minify | resources.Fingerprint }} + +``` + +И добавьте в `layouts/telegram/baseof.html`: + +```html + + + + {{ partial "head.html" . }} + {{ partial "telegram-styles.html" . }} + + + {{ partial "header.html" . }} +
+ {{ block "main" . }}{{ end }} +
+ {{ partial "footer.html" . }} + + +``` + +### 8. Запустите синхронизацию: + +```bash +python scripts/sync_telegram.py +hugo +``` + +**Что дальше:** +1. Покажите мне пример контента из `index.md` (текст поста) +2. Скажите, нужно ли добавить поддержку видео/аудио +3. Хотите ли вы добавить фильтры по датам/тегам + +Готов доработать любой из шаблонов под ваши нужды! 🚀 \ No newline at end of file diff --git a/content/posts/20260412 kommunizm ne utopia/index.md b/content/posts/20260412 kommunizm ne utopia/index.md new file mode 100644 index 0000000..cfdcc32 --- /dev/null +++ b/content/posts/20260412 kommunizm ne utopia/index.md @@ -0,0 +1,71 @@ +--- +title: "Коммунизм не утопия" +date: 2026-04-12T18:44:16+03:00 +draft: false +tags: ["коммунизм", "нод"] +categories: ["Политика"] +--- + +# Коммунизм: утопия или научный базис будущего общества? Размышления о новом общественном договоре + +Я часто слышу вопрос, который звучит как приговор: «Разве коммунизм не утопия?» В общественном сознании этот термин давно превратился в синоним несбыточной мечты, морального прожектёрства или исторического тупика. Но я убеждён: такой взгляд проистекает не из анализа теории, а из подмены понятий. Коммунистическая идея в её марксистском ядре — не фантазия о «рае на земле», а научный метод понимания исторического движения и экономический базис подлинно гуманистического общества. Наша задача сегодня — не канонизировать прошлое, а развить диалектику марксизма-ленинизма в условиях нового технологического уклада, сформировать общественный договор, который заменит современное государство, как систему принуждения, системой взаимного развития. + +## Утопия против науки: в чём принципиальная разница + +Исторически социалистическая мысль начиналась с морального возмущения. Сен-Симон, Фурье, Оуэн предлагали «справедливые» общины, основанные на разуме и доброй воле. Но они не отвечали на два ключевых вопроса: *как* достичь нового строя и *какая сила* способна его осуществить. Их проект зависел от убеждения элит, от просвещения «сверху». + +Маркс и Энгельс совершили методологический переворот. Они показали, что социализм не изобретается разумом, а рождается из объективных противоречий самого капитализма. В работе «Развитие социализма от утопии к науке» (глава из «Анти-Дюринга», 1880) Энгельс чётко обозначил границу: утописты исходили из вечных истин справедливости, марксизм же исходит из анализа способа производства, классовой структуры и исторической динамики производительных сил [[1]]. Коммунизм здесь — не идеал, а закономерная форма разрешения противоречия между общественным характером производства и частным характером присвоения. + +## Экономический базис, а не моральный призыв + +В марксистской теории общество не строится на идеях. Идеи, право, политика, культура — это надстройка, которая формируется на основе экономического базиса: совокупности производственных отношений, соответствующих достигнутому уровню развития производительных сил [[2]]. Капитализм сам создаёт материальные предпосылки своего отрицания: обобществляет труд, создаёт мировые рынки, автоматизирует производство, но оставляет плоды этого развития в руках узкого класса собственников. + +Коммунистическая программа поэтому начинается не с лозунгов о равенстве, а с требования изменения формы собственности на средства производства и перехода к координируемому распределению общественного продукта в интересах большинства. Как писал Маркс в Предисловии к «К критике политической экономии»: «Ни одна общественная формация не погибает раньше, чем разовьются все производительные силы, для которых она даёт достаточно простора» [[2]]. Утопия игнорирует эту материальную обусловленность. Научный социализм делает её отправной точкой. + +## Гуманизм без иллюзий: человек как совокупность отношений + +Один из главных аргументов критиков коммунизма звучит так: «Человек по природе эгоистичен, поэтому общество без принуждения невозможно». Этот тезис метафизичен. Маркс в «Тезисах о Фейербахе» формулирует принципиально иную антропологию: «Сущность человека не есть абстракт, присущий отдельному индивиду. В своей действительности она есть совокупность всех общественных отношений» [[3]]. + +Человеческая «природа» исторична. Капитализм воспроизводит конкурентного, отчуждённого индивида не потому, что так заложено в биологии, а потому, что так организованы его экономические отношения. В «Экономико-философских рукописях 1844 года» [[8]] Маркс показывает, как отчуждение труда превращает человека в придаток машины, а его творческие силы — в товар. Коммунизм в этой оптике — не подавление индивидуальности, а её освобождение: «свободное развитие каждого является условием свободного развития всех» [[4]]. + +Гуманизм марксизма поэтому не сентиментален. Он практичен: система должна быть устроена так, чтобы даже в условиях несовершенства человеческих мотивов структурные условия направляли активность на созидание, а не на эксплуатацию. + +## Почему коммунизм называют утопией и уроки исторического опыта + +Скепсис понятен. Опыт СССР, как и других социалистических проектов XX века, породил сложные вопросы: бюрократическое перерождение, дефицит, репрессивные практики, технологическое отставание. Но марксистский анализ требует исторической конкретности. Социализм строился в отсталых, аграрных обществах, окружённых враждебным капиталом, в условиях гражданской войны и последующей Холодной войны. Это порождало вынужденную централизацию, ускоренную индустриализацию и оборонную автаркию, которые исторически исказили демократическую суть рабочего самоуправления. + +Ленин в «Государстве и революции» подчёркивал, что пролетарское государство — это переходная форма, задача которой — не вечное подавление, а создание условий для отмирания самого принуждения [[5]]. В поздних работах он предупреждал об опасности бюрократизма и настаивал на ленинской «культурной революции» — повышении культурного и образовательного уровня масс, кооперации и развитии советов как форм прямой демократии [[6]]. Провал или трансформация советской модели — не опровержение теории, а указание на то, что без развитых производительных сил, без зрелой общественной самодисциплины и без защиты от внешней экспансии социалистический проект вырождается. Это не аргумент против коммунизма. Это аргумент за его научное, а не догматическое развитие. + +## Технологический уклад и новый общественный договор + +Если XX век показал, что социализм нежизнеспособен без развитых производительных сил, то XXI век предоставляет эти силы в виде цифровых технологий, глобальных сетей и автоматизации. Сегодня мы живём в эпоху, о которой классики могли лишь догадываться. Цифровизация, искусственный интеллект, платформенная экономика, автоматизация рутинного труда, климатический кризис — всё это меняет материальный базис. Но диалектика марксизма остаётся рабочим инструментом. + +В «Грундриссе» Маркс предсказывал, что при высоком развитии машинерии мерой богатства станет не рабочее время, а свободное время, а труд превратится из средства выживания в форму самореализации [[7]]. Сегодня это не гипотеза, а технологическая возможность. Проблема в том, кто контролирует алгоритмы, данные и автоматизированные системы. Платформенный капитализм создаёт новую форму отчуждения: цифровое, невидимое, распределённое. Марксистский ответ на вызовы XXI века должен включать: + +1. **Общественный контроль над технологической инфраструктурой** — данные, ИИ-модели, логистические и энергетические сети как общее достояние, управляемое через демократические советы и алгоритмическую прозрачность. +2. **Декоммодификацию базовых условий жизни** — жильё, медицина, образование, транспорт, цифровая связность вне рынка, финансируемые за счёт обобществлённой добавленной стоимости автоматизации. +3. **Участие в планировании как новую форму гражданства** — не жёсткую централизованную развёрстку, а гибкую, сетевую координацию на основе открытых данных, локальных инициатив и обратной связи от сообществ. +4. **Культурный плюрализм в рамках экономической солидарности** — общественный договор не требует единомыслия. Он требует единых правил игры, где различие мировоззрений, культур и идентичностей не подавляется, а интегрируется через общие институты взаимопомощи и совместного развития. + +Такая система не будет «государством» в старом смысле. Это будет инфраструктура кооперации, где принуждение заменяется структурой, в которой приносить пользу обществу становится рационально, осмысленно и выгодно для каждого. Не потому, что люди станут «ангелами», а потому, что институты перестанут вознаграждать хищничество и начнут поощрять созидание. + +## Заключение: от догмы к методу + +Коммунистические идеи утопичны только тогда, когда их превращают в застывший набор лозунгов, оторванный от материальных условий и исторической конкретики. Но как научный метод анализа общественных противоречий и как направление движения к обществу, где развитие личности и прогресс человечества совпадают, они остаются единственной последовательной альтернативой капиталистическому тупику. + +Наша задача — не реконструировать прошлое, а спроектировать будущее. Марксизм-ленинизм должен развиваться вместе с наукой, техникой и общественными отношениями. Новый общественный договор будет жизнеспособен только тогда, когда он перестанет быть инструментом вертикали и станет горизонтальной сетью институтов, расширяющих возможности каждого. Когда каждый, независимо от происхождения, культуры или стартовых условий, сможет и захочет развиваться, потому что система будет делать это естественным, а не принудительным путём. + +Это не утопия. Это инженерная задача общественного устройства. И у нас есть все основания, чтобы её решить. + +--- + +### Использованная литература + +1. Энгельс Ф. Развитие социализма от утопии к науке. М.: Политиздат, 1988. +2. Маркс К. Предисловие к «К критике политической экономии» (1859) // Маркс К., Энгельс Ф. Соч. 2-е изд. Т. 13. М.: Госполитиздат, 1959. С. 6–9. +3. Маркс К. Тезисы о Фейербахе (1845) // Там же. Т. 3. С. 1–4. +4. Маркс К., Энгельс Ф. Манифест Коммунистической партии (1848) // Там же. Т. 4. С. 433–473. +5. Ленин В. И. Государство и революция (1917) // Полн. собр. соч. Т. 33. М.: Издательство политической литературы, 1969. С. 1–120. +6. Ленин В. И. О кооперации (1923) // Там же. Т. 45. С. 369–374. +7. Маркс К. Экономические рукописи 1857–1859 годов («Грундриссе») // Маркс К., Энгельс Ф. Соч. 2-е изд. Т. 46, ч. 2. М.: Госполитиздат, 1962. С. 217–224. +8. Маркс К. Экономико-философские рукописи 1844 года // Там же. Т. 42. С. 41–174. \ No newline at end of file diff --git a/favicon.png b/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..80f8f01819f262b70f85b9cd4caf01b2ae99569a GIT binary patch literal 4230 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 Ple_QCpRwikq7~%dv0ruC literal 0 HcmV?d00001 diff --git a/static/images/favicon/SmileDed/favicon-128x128.png b/static/images/favicon/SmileDed/favicon-128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..29fe28bb67e7729db13cdb1e38ce179880239678 GIT binary patch literal 1083 zcmYjRYfMuI6h8O1SL#IzXh(p^VA$}Nx~ z!h~c~FgRP3K@CC)L2yIp6$gvi5;_ZNcnX7s@+j2ts20lZmMqzi@0=gscTT?KJj#TE zqdRdo8~}F4$HknaGx-l#+vxZtBIQ>ACd9`?oytA4_ zCf=f^3@;E4HN|vR^|008?9*yl$pNf2Oxf3{W%!bP+x;U7+zG^AATb-~0e|(9X&WoN zcBt1pD_B=~S8nNx<`wW77H`z`z)5H+=@Zmj|tAoR)ua$ZNUHvz6*zY~Yl2PBQQFpevRj;+=KhiJ0z?AdTLz0H9*imT^- zKBtw}*+!POvsI{V!$P=r_Ukq+*%n1PC1m=MNt<)KSDU34C{@xw$Od#IV3;tuM3v1mkJ}#cAOjt zkF|;cr#wq4So&12vAU-o(k(v8Rx@T{VE3{Mt5P|5CjluVE_Q{G;>WXoiFT5M?VElU zlS$@FUe@)rxgI#WrPxXfD;gOYc^)Dyc*AhT)NqMBQvD3MI$4XN5)sLxIKqYKyQT!B zZ#e;JfJ&t|dT*QWxO#C+?%?=-(Xd#P3pjzaKTl~6)J^Yg&1H04*3uT5Yg<=m_*91x z_{99)&kBB|js2`G7G3``JNsJ?-i1ijfTmCc#}OQiS+x(>oyvhovuWJO~2h#whq<-tDa z4?HptPQP0acR+Vc@`-?nHB~{Qkw?a`I%-ibf_5jxHCRpF3uITFzJ=aAT0;$Xv8z}{ zsB*Ml|99x_UfkDQ7B_m5553jJIpl9rOGzWJ^rHW?kJn_SVQ*2NN2OZi8IwbB_shgk zF)^uIJZ2C-3Kb7tKcQP4)-Zw;e3%w{2;9%DaRZUt<8<*m)b$Da zYGMdPt&92;m!Rh>4`8#vrwE3#Qmh!N^-n~6$$F;|?M-UvAQcig?vX75x$xFQ2Q0`u rwHSN}YqjeuvkGB1O&u2hpIX`CYI0TG0XH@DOMv)TK}<`uqzK?|g@V#x literal 0 HcmV?d00001 diff --git a/static/images/favicon/SmileDed/favicon-192x192.png b/static/images/favicon/SmileDed/favicon-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..445798e64c70a0a3da9bad5091fe841b0106910b GIT binary patch literal 1869 zcmb_dX;4#F7`^ZDBzXvuMMXsGvm}6GA(m>31PNAU(|}@Gia@ATQ4tYZcFh9?Em)v1 z7SsZ%Gio7alPwT|h%!Lg+z~M>wg?JgD`5+SzT}@j=s2DJc<;_R_s)0kIp6)h`-2PD zPDg94763rU!G8BaVw9*pvL^9A_$rVD0EzCf+xAd|kL=afv~_zZ@qJfXb;i)-joz_N z`1yMWSi!xt!?rs#W7~C#;#Y>aZTyUGDGw!kMxE8n!kIjM~fxC_2!)b7Lj+ zoP0AyaWNvY?nXo+C4xypVOsC&I`=|jDDMHc+y}M?Xz-`UeJ4b;UgmLKwv&orVcnh| zZGze!=aSktK@1#;aLHa@?tmwSd#cx;X>uYjc0miDO=NaM#woS%GLD-e1J4g1Qzbaw|oQpN0z%Aa#nAJ?y$RrR4gg;{V-Da5b1_OxLP`p`+VA4 zFh#9h0Pw3fuB+0(eGTukY>4cVb#-8Bfo|DM_5Bap9?lKpafFYTm(!J?67F>P%vgzRFC*t=Cuy(Oi{0@ zMpA*Pp$Wv0977nAM6O1(`jl2EMo@{iPt@?L?NYF(=B%P7Bw z-F??mo-~-NyIAasn6wT_>k(1XpvQ7@s*JRRwM)zUkPPL)r5gfDNHb;+gYToPE&#Vo znDh06W<(j$Y$(BNGj!B|gL^7zyi6M?!2tU&P==1p$%pz33aphI z(evy`y#Tal?kM4}+bw(89=|gC6L6Y@udB0QsG{H4!CM|J4;44UI?@?0_G4j5>!H{TG zFLriiX}j`=qx4MJCb=Q5C`&$N0v$~MJ2zQX3HhC2}ksdIrsoFuT?4+ z@gpPA;PKco(^NvXUPerR6pa_(jZP8vU=SC3_ms+%ten-0Dj=q5z4885e;#2-^u=yp zl&A;+))M5zl+;_9sk)9x^p|NzIxwB&7P+hY4t(HtvI%snvG!poVOT0KXLRXrFofD( zl+|5T6U+RHsbMXcw9A&0|#b-uk46M6;wF*Oc^wt@>+LeGXa!m5t=I}+T=~mswjPR8D)I!4B*2j1j3AsA2>~}C{d&z>5(<5tJ;}x z@|2k!&f>urVz*})a@Me*I?nZGDyE$Y`~7zCPn!#fR}whv;qETj#ft;~01}xVKmY&$ literal 0 HcmV?d00001 diff --git a/static/images/favicon/SmileDed/favicon-256x256.png b/static/images/favicon/SmileDed/favicon-256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..59f215feb0825971f784ce8b56d3f4f1ec2ccb3e GIT binary patch literal 2961 zcmdT`dr(x@8UN1ZF5D|9%dR3pl;!1)3IdK+BCiFJhf$!ZRg4H|eBdi=QldOm4v0br zP+Fqc2(nI6A@KnUDu%~iMWNM*G#IuO$nJ`OqOgm+c41+Aob-=OXWGuxNhbO0e&?Lu z{T}Chzwi5g9~mApeVXkw0GJ*Y8uTszA|e9DlzgH;D%$~I9u*c8ur4X4zw^pTyFIg3 zssFInROfm-X?40YcS|(W!Y(vp=I0(!x@~xp&z60Atw!P&q80 zd(u5;E}~k{k7wx448wSTY;9(eNc+59&X2X{xv$6I$k~XoX+GG>EvamHzX)t4RJ?%^ zy}Ixr6;HFWK_~o|@<%}CofTP@2jDrc_`?Wbm6HwOFs9t{Ck)f-Os>*WPSC*6d{r^u1q-hy9Wte=n+LL;k=>QX`z!g} z_QahutIG9_Db9e)fAn?^fh^ZoPi$zZRmTEP%4>UpqDO@HbQ}+};yf?ZE@e>k?fv1| z(EN|?lVOZ%+O;D~Xlct5_uN33Ei0bsfD5kc4X(7-r}8raEq%12WZp428@!)fYV+gX z%2qyCd1pqdFS5JdB5rcP;`HLtR|~Px&}CWbaPwOq`DB-W>ySWl`+(5{b);s|Eu+0A z0Z+^_yigU@wiGSRpe1lApkWskZ!Q8Ve!6YAP_hXSU$Un~`YAl77!22UKM`y_A)?VPIs-;=R_wKJJLayKRSfw;h^nOyVe%?zQ3?SAYiN3ckfiE)Yd~IG9i{V|C z6{+V~3ITmCAn&w%-h7}!U7T@dg3lVD^H+zG1WY;&jOb+ke-7sj6lzn@LH(<4#nq$A z$rt4=i|4S0iLtb>4LXB* zV^g0t>4Vix2PQ&a*PNOrRy8nZFX3>WvcHvg1@^z7TXda%YeBR5oRCY^w_TX9=5D~XmC6S~ zZqr~-4oUf^fJBKOsfqW)KlG6Y9K3beqh3ey|@739EE%IYKUCF%D@jnOdfP zI2Ef4F&J#MR_7YzQZPF983QF){A= ztMnS9^|@yMV&&AH+IuD781RF}<;RGqT++GVXVSTT`EIzE-Y_bU)}{aM=r=q<(HC1N z-Nhqy!G+~8wLP(%6#%L|AEvk*NSIdVx(aCR)g_y&`6wEX-eX9%ESea8d5uwR-0FVV zmn?G@jXdgRR12cZ(>%%Y#io(24bIqp=g6rIuQmNS%0KDXlrA7rlkyfhuK8-jN#TO+ z&kZ*!2$^cH#8|qo1xu^CF&;@u&Az{nm4`#Yu)OmOFmYEiXpgWG@H4n^dl4IVN-pGf zit%5k2{`9NVi05Xloh9?3>F;wJ=Dk>J8PY-QO8!?x%Cd86B#yid`UO-?8t-&IH?-&Avhx~9pcUK_d^!$ zvhU8q!dsom1UJR1dd%$(AEazzBz3-MT}I6iU6E=$9~+M0)ND>yL*~YT$uo!FCSzs{ zbZN*`S~Hd~-c4r9WRxpE1L);<^5=zQa_#1MOnpG+&o}tlXkwi^=({ba^f4K=A#7E6 K(B;6mjDG?}lbp5y literal 0 HcmV?d00001 diff --git a/static/images/favicon/SmileDed/favicon-512x512.png b/static/images/favicon/SmileDed/favicon-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..6dbd11b31d5c9ae1019acb5ac3199f697cf87d74 GIT binary patch literal 9333 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 RsxRPAkbj8Zd0$B~{2g)cvBUrX literal 0 HcmV?d00001 diff --git a/static/images/favicon/SmileDed/favicon-64x64.png b/static/images/favicon/SmileDed/favicon-64x64.png new file mode 100644 index 0000000000000000000000000000000000000000..bdb9ed7cfcdca0ee9cf316b6747b13437594ada7 GIT binary patch literal 453 zcmV;$0XqJPP)$G(^?LvT5D1U~;(>$` zFh+nLpzQr=f&u~F0>%>kDW|;^tTpd00qeei02rGd8Q^V#$WxFfcvF6M22Aw?0^qE9 vGT`4HfIMRExOpcy_Xf1zM*y@4rk?)+lbSqGRn*1C00000NkvXXu0mjf^OUzc literal 0 HcmV?d00001 diff --git a/static/images/favicon/favicon-16x16.png b/static/images/favicon/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..05fb823869cf24161cef294dc727ec74c56696ff GIT binary patch literal 375 zcmV--0f_#IP)M)&4hM*$*pO9K6=t&;%Cc;nwu-$H@SsH&>Z0$5Ri zThcKiDP+V0T)ZfXl^!6~K@0CqsS+Lm=()XmggCaYYmsG{(%@Sz6yQn;#O?ppxdlKU zq3$GRQ4}JDqELfd7!^`EEv?SsNVznGsnr#9wcXpznL-6N?moYYWiCXq>hJ eXks+ZI=}+~r0gL+lns*r0000ViQC~iD0217(pz8f+9k&@n7K!ScqUMyMUdqpq&t`)E5ve672+=6oOV- z1hEiND+>`5O*D57?6MJVc9WQddvQQm4s*`@&dfJ+lmXcN`Td&7jsV9D{4*KIWHK2%0uvv_!T z5Iv9_lu9Ma>YfwCaQR4Nq~iv<)41x`;-v0APE zBLGUPOeVw2%gdWv3D>_h1EdMB*9*Jdj=^BSLv*`cI2;Z*olXpg!^4%J-|s`O*CP^% zpxthxQmL>Yu~-bF(TE4Qy}gCaWBH6D*80Z?EXT%?PG0SF_L2zR?36C)XYlX2_9?}GqnwOT$< ztyaT)K1U*vfW>0r*Nep>rqe0n@i;312X=6PR4T>P-)uH!3FL zHUR2`<#LHYAb_*8Grls7MuTO>@Au>6;pYs6p82v~FH~`XyaPrYK{D^(J1Rn|Vp6?Oh*E8@6yCY!`W+Hb_00000NkvXX Hu0mjfe`hen literal 0 HcmV?d00001 diff --git a/static/images/favicon/favicon.ico b/static/images/favicon/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..3c2d31ed828e8e964aa9fdec95a38aae2a50a36c GIT binary patch literal 15406 zcmeHNTS!!06h7WkE6iUs5)&qi-&;YJ{P|M-&>iuigzCxL(~qbaX@v>tvk;XEQSl@7 zkS{6aCA=qsCOsJ8Es%s>G(|9?6s^{OzFq6EXPnEKIWs!_odb(Kv(H|8eQWJ?*1oK* zC;>{45*ewerA7HCSW*5`6vbls@jvMgMfq2)+rR(k`#%+BFh)_5)HW)M%JHLKEgU_h zzVKVh&(EjA!a|SmUA%aa+S=Nvx3`x90s?gRk(--K#l^+c(a}LKUc3qt)`E%;)>!ZxfOd1~_r}_DLI(zmk_4M?J`kXh#l^+Zt5>fmGBQ$NotT)Q z?c2B0=g*%hI5^lT{!gDi(axPat!$04gWT2CRhRtJ)6=wX-##G^GMQpyV`*k)#w9<# zh1S+q8Xg|DBG}TE?*9B8Il-pB^87)Zv8eR7N{CNR9;f53@|o{V8#wfV=;&y|Hw@ab zV~4|bzVf5Hckhb$ix}F~)#WmddkY6*4hZsjF6r*>UN`v-4GltH%wOvvALESqgQ>Bx zQIjjnkB^TRZMArOUU1~ zYuB3jl67&XY;JDWEtfH{9Z-gbh8nU1@B9IrU?Ft*t4*(K#Plu6c!d{)lTNo^ZUbx4+Q^43_|;XfdR4J z=I?;}c>Vgds832t5<0J}tkAb_-zYph+^h1jPqMe(mg`}2U&&{Eot6J5`55o9u`#jN z+`D%#>7lf=GzA;xs5x&H^TlLL*)454raOSdgDi&#GMila^E=LG(zXjofG$`(I55%&_~wKm%njW z5o2NG!M+A(LB7Q4sBgy4{^Uuyk@!JtsZkim$B)G{c4E&;VsFLV!c4PJw^3MGSSqE) zL?~G+jcleF3uR$73NwoQ+=&0ctdtcyHdx4Wdro;XuXoh+US94!-};tw-Y1@qbI$V| zE-t93sHmu@{#WUAIkI;^YfEgevik4AIQrxnGELhIa!U>YIPg{6a}CFe;Gh57K2nO zB^HT9oXJWglAV~70eF6XhUIceY&04<0Sbiz6N61m5P-p8z*&W`yl&>Nudg`)ip3%m zb8~Ye3_!ElgyC>V>~J`k%suAjY*)l zUvJN`W7u;?1z;!FXfzmOA~@gabQt4!JBFRS-~cX{3p5%H@yp8#%x1GMo=&HvQsHy0 zR!eT4Ck0?KnV5r_N~L!0{aE{*PA7SeUASB>?`$(c0qk}=s8lLqTmk%{vgx{L9DBW9 z@?5P}pWX`KH6fqR6JuHI^?K0n_Zj0D8{H;ma}ERp;Hoq~HMh z%%*z9VljwDqY#Ni4i6xg%T-FH@;4fr5MO{=tp*B(;@80w=Mo;u@0!{^sO=a85F~k& z#bP1L&Nd$CeE_&^Hd`hb3Hq)$07*qo IM6N<$f}qt%ga7~l literal 0 HcmV?d00001