| · | 23.09 | Выпуск музыкального проигрывателя Fooyin 0.13 (4 +3) |
|
Состоялся выпуск музыкального проигрывателя Fooyin 0.13, нацеленного на предоставление расширенных возможностей по настройке и адаптации программы под свои предпочтения. В Fooyin предложен набор виджетов с реализацией различных режимов управления музыкальной коллекцией и воспроизведения музыки. Дополнительные возможности могут подключаться в форме плагинов. Для настройки интерфейса предлагается конфигуратор раскладки элементов на экране. Проект написан на языке С++ с использованием библиотеки Qt и распространяется под лицензией GPLv3. Готовые пакеты сформированы для Fedora, Debian и Ubuntu, а также в формате flatpak.
Поддерживается воспроизведение файлов в формате FLAC, MP3, MP4, Vorbis, Opus, WavPack, WAV, AIFF, Musepack, Monkey's Audio, VGM и различных трековых форматов. Среди возможностей Fooyin: извлечение сведений о порядке и длительности звуковых треков из CUE-файлов, воспроизведение без пауз (gapless), создание, импорт и экспорт списков воспроизведения в форматах M3U/M3U8, фильтрация содержимого музыкальной библиотеки по любым полям, древовидное представление коллекции, редактирование тегов, визуализации при помощи спектрограмм, навигация на уровне каталогов в файловой системе с возможностью прямого воспроизведения выбранных файлов. Для внешнего управления проигрывателем может использоваться D-Bus-интерфейс MPRIS (Media Player Remote Interfacing Specification). Наиболее заметные улучшения:
![]() ![]()
| ||
|
Обсуждение (4 +3) |
| ||
| · | 23.09 | Первый выпуск scan, библиотеки разбора текста для C++ с построением конечного автомата при компиляции (22 –2) |
Опубликован первый выпуск библиотеки scan
(0.1.0), разбирающей текст в значения по шаблону, известному на этапе
компиляции. Шаблон или формат записывается как аргумент шаблона C++ и
превращается при компиляции в размеченный детерминированный конечный автомат (tagged deterministic finite automaton, TDFA), обход которого разворачивается по состояниям в код на этапе компиляции с использованием шаблонов C++. Результатом выполнения является значение запрошенного типа. Код проекта написан на C++23 и распространяется под лицензией GPLv3.
import scan;
// Совпадает ли вся строка. Каждая точка входа - ещё и адаптор диапазона.
scan::match<"[a-z]+@[a-z.]+">(address);
address | scan::match<"[a-z]+@[a-z.]+">;
// С группами.
const auto found = scan::match<"([0-9]+)-([a-z]+)">("42-abc");
found.get<1>().to_view(); // "42"
// Начало строки, занятое шаблоном, и первое совпадение где угодно.
scan::starts_with<"[a-z]+">("abc123").whole().to_view(); // "abc"
scan::search<"[0-9]+">("id=4210x").to_view(); // "4210"
// Все совпадения и куски между ними - ленивые представления.
for (const auto& one : text | scan::search_all<"[a-z]+">) { ... }
const auto fields = "a,bb,,ccc" | scan::split<","> | std::ranges::to<std::vector>();
// Значения, а не текст.
struct row { int id; std::string_view name; };
const row one = scan::scan<"{},{[a-z]+}">(line);
// Список, сумма типов, вложенная форма.
struct all { std::vector<int> values; std::variant<int, std::string_view> tail; };
const all got = scan::scan<"{{}{*,?}} {{[0-9]+}|{[a-z]+}}">("1,2,3 abc");
// Начало ввода и то, что от него осталось.
const auto [value, rest] = scan::scan_prefix<"{},{}">(line).take<point>();
// По записи за раз, из чего угодно.
for (const row& one : scan::each<"{},{[a-z]+}\\n">(text).of<row>()) { ... }
Диапазон, который можно прочитать лишь однажды, читается без буферизации, поля собираются по мере поступления символов. Сколько символов придётся удержать, шаблон задаёт при компиляции; там, где такого числа нет, чтение отклоняется при компиляции.
std::istringstream source("set speed 42\\nset gain 7\\n");
source > std::noskipws;
struct command { scan::held<16> name; int value; };
for (const command& one :
scan::each<"set {[a-z]+} {[0-9]+}\\n">(std::views::istream<char>(source))
.of<command>()) { ... }
Производительность.
Замеры проведены на Ryzen 9 9950X, clang 22.1.8 с libc++, -O3 -march=native,LTO. Тридцать две записи за проход, медиана семи проходов.
"([a-z]+),([a-z]+),([a-z]+),([a-z]+),([a-z]+)" "alpha,bravo,charlie,delta,echo"
scan::scan<f>.sentinel() 477 нс
re2c 554 нс
scan::scan<f> 659 нс
CTRE 717 нс
RE2 15986 нс
те же пять полей, по двести букв каждое
scan::scan<f>.sentinel() 57.8 нс
re2c 637 нс
CTRE 692 нс
RE2 11751 нс
"first.last@subdomain.example.com" распознавание, ничего не извлекается
scan::match<p>.sentinel().scalar() 436 нс
scan::match<p>.scalar() 545 нс
re2c 1186 нс
RE2 2616 нс
CTRE 14339 нс
Свёртка групп по ходу разбора
Типу сообщается, к какой из его групп относится очередной символ, и вычисление выполняется на месте: ни одна итерация цикла не сохраняется, ни одной подстроки не создаётся.
struct tally { unsigned long value = 0; };
struct reading { tally number; std::string_view tail; };
template <>
struct scan::scanner<tally> {
static constexpr std::string_view pattern() { return R"(\\(((_+)(X|Y)*)*\\))"; }
struct state_type { unsigned long total = 0; unsigned place = 0, marks = 0; };
static constexpr state_type begin_groups() { return {}; }
static constexpr void opened_group(state_type& one, scan::group_at<0>) {
one.place = 0; one.marks = 0;
}
static constexpr void closed_group(state_type& one, scan::group_at<0>) {
unsigned long weight = 1;
for (unsigned step = 1; step < one.place; ++step) weight *= 10;
one.total += weight * one.marks;
}
static constexpr void push_group(state_type& one, scan::group_at<1>, char) {
++one.place;
}
static constexpr void push_group(state_type& one, scan::group_at<2>, char letter) {
one.marks += letter == 'Y' ? 2u : 1u;
}
static constexpr tally finish_groups(state_type one) { return {one.total}; }
};
const reading got =
scan::scan<"value={}{[a-z]*}">("value=(__X_XX)abcdefgh").of<reading>();
// got.number.value == 12, got.tail == "abcdefgh"
Контексты и аллокаторы Любой объект вызывающей стороны - аллокатор, пул, арену, что угодно ещё - можно передать в тот вызов, который создаёт значение. Тип контекста при этом не теряется: состояние сканера и каждый его хук могут быть шаблонами по нему, так что в сканере не упомянут ни один тип вызывающей стороны.
struct arena {
std::pmr::memory_resource* where = nullptr;
std::pmr::memory_resource* resource() const { return where; }
};
struct numbers { std::pmr::vector<int> values; };
struct both { numbers left; numbers right; };
template <>
struct scan::scanner<numbers> {
static constexpr std::string_view pattern() { return "([0-9]+)(?:,([0-9]+))*"; }
template <class Told>
struct state { std::pmr::vector<int> values; int running = 0; };
static state<scan::default_context_t> begin_groups() { return {}; }
template <class Told>
requires requires(const Told& one) { one.resource(); }
static state<Told> begin_groups(const Told& told) {
return {std::pmr::vector<int>(told.resource()), 0};
}
template <class Told, std::size_t Which>
static void push_group(state<Told>& one, scan::group_at<Which>, char digit) {
one.running = one.running * 10 + (digit - '0');
}
template <class Told, std::size_t Which>
static void closed_group(state<Told>& one, scan::group_at<Which>) {
one.values.push_back(one.running);
one.running = 0;
}
template <class Told>
static numbers finish_groups(state<Told> one) { return {std::move(one.values)}; }
};
std::pmr::monotonic_buffer_resource bytes;
const arena mine{&bytes};
scan::scan<"{} {}">(text).of<both>(mine); // один на оба места
scan::scan<"{} {}">(text).of<both>(mine, scan::default_context); // по одному на место
scan::scan<"{} {}">(text).of<both>({mine, scan::default_context}); // то же в скобках
const both got = scan::scan<"{} {}">(text).with(mine);
// Контексту не обязательно быть своим типом: аллокатор доходит до того,
// что строит чтение.
struct two { std::pmr::string name; std::pmr::string tail; };
const two kept = scan::scan<"{[a-z]+} {[a-z]+}">(text).of<
Хук получает сам объект вызывающей стороны, а не копию, поэтому состояние
может хранить его адрес: контекст живёт столько же, сколько вызов, а всё чтение происходит внутри этого вызова.
Собирается в clang и GCC. Модули C++ не обязательны: доступны заголовочные файлы (include/), которые генерирует из тех же модулей утилита demodulizer - каждый push в main пересобирает, линкует и коммитит их обратно. Единственная зависимость, Boost.PFR, не нужна при включённых binding packs из C++26.
FetchContent_Declare(scan
GIT_REPOSITORY https://github.com/j4niwzis/scan.git
GIT_TAG v0.1.0)
FetchContent_MakeAvailable(scan)
target_link_libraries(mine PRIVATE scan::scan)
| ||
| · | 23.09 | Выпуск системного менеджера systemd 262 (35 –11) |
|
После трёх месяцев разработки доступен релиз системного менеджера systemd 262. В новой версии реализовано встраивание в процесс минимального набора unit-файлов, обеспечена поддержка сборки со статическим связыванием, проведена интеграция c dm-clone для клонирования блочных устройств, добавлено ведение БД установленных файлов в systemd-sysupdate и обеспечена криптографическая верификация отчётов systemd-report.
Среди изменений в новом выпуске:
| ||
|
Обсуждение (35 –11) |
Тип: Программы |
| ||
| · | 22.09 | Релиз операционной системы NetBSD 10.2 (24 +11) |
|
Опубликован релиз операционной системы NetBSD 10.2, который отнесён к категории корректирующих обновлений и включает в основном исправления проблем и уявзимостей, выявленных с момента публикации NetBSD 10.1 в декабре 2024 года. Ветка NetBSD 10 будет поддерживаться до релиза NetBSD 12.0. Для загрузки подготовлены установочные образы размером 639 МБ, доступные в сборках для 57 системных архитектур и 16 различных семейств CPU. Для новых установок рекомендуется использовать недавно опубликованный релиз NetBSD 11.0.
Из не связанных с исправлением ошибок изменений отмечается поддержка новых версий компиляторов, повышение стабильности работы WiFi-драйвера iwm, решение проблем при работе на системах Olimex A64 и MIPS R5000SC, реализация возможности загрузки ядра для amd64 при вызове qemu с опцией "-kernel". Добавлена поддержка устройств ASIX AX88179A USB Ethernet, Asus USB-N10 Nano B1 Wi-Fi, Realtek RTL8126 5Gbps Ethernet, RTL8125D (rev 0x6890000), RIoTboard i.MX6S IOMUX, VMware PV SCSI. Устранены уязвимости в ipfilter, telnet, TCP-стеке ядра, OpenSSL, Unbound и X.Org. Обновлены версии openssl 3.0.21, tmux 3.6a и xkbcomp 1.5.0.
| ||
|
Обсуждение (24 +11) |
Тип: Программы |
| ||
| · | 22.09 | Выпуск операционной системы Solaris 11.4 SRU95 (24 +3) |
|
Компания Oracle опубликовала выпуск операционной системы Solaris 11.4 SRU 95 (Support Repository Update), в котором предложена серия значительных изменений и улучшений для ветки Solaris 11.4. Для установки предложенных в обновлении исправлений достаточно выполнить команду 'pkg update'. Пользователи также могут воспользоваться бесплатной редакцией Solaris 11.4 CBE (Common Build Environment), развиваемой с использованием модели непрерывной публикации новых версий.
Среди изменений в новой версии:
| ||
|
Обсуждение (24 +3) |
Тип: Программы |
| ||
| · | 22.09 | Выпуск медиаплеера VLC 3.0.24 с устранением 130 уязвимостей (45 +13) |
|
Представлен выпуск мультимедийного проигрывателя VLC 3.0.24. Код написан на языке Си и распространяется под лицензией LGPLv2.1. В VLC и во встроенных библиотеках устранено более 130 проблем с безопасностью, вызванных переполнениями буфера, обращением к памяти после её освобождения, целочисленными переполнениями и двойным освобождением памяти (детали пока не раскрываются). Некоторые из уязвимостей могут эксплуатироваться при обработке специально оформленного контента.
Среди изменений, не связанных с уязвимостями и исправлением ошибок:
| ||
|
Обсуждение (45 +13) |
Тип: Программы |
| ||
| · | 22.09 | Компания Valve представила экспериментальный видеокодек Pyrowave (105 +26) |
|
Компания Valve объявила о включении в состав бета-версии клиента Steam видеокодека Pyrowave, оптимизированного для потокового вещания видео с низкими задержками в сетях с высокой пропускной способностью. Кодек добавлен в качестве опции в сервис Steam Remote Play, позволяющий вести вещание игрового процесса или транслировать вывод на свою систему при игре на других устройствах. В Linux-версии Steam кодек становится доступен при активации в настройках режима SteamRT3. Реализация кодека написана на языке C++ и распространяется под лицензией MIT.
Кодек поддерживает только раздельное кодирование каждого кадра (intra-only), независимо от соседних кадров (все кадры являются ключевыми, межкадровое сжатие не используется). Подобный подход позволяет добиться очень высокой точности передачи картинки и исключить появление артефактов при движении и резкой смене заднего плана. При кодировании изображений применяется дискретное вейвлет-преобразование с фильтром CDF 9/7, по аналогии с форматом JPEG2000, и тривиальным энтропийным кодированием, позволяющим эффективно распараллеливать вычисления. Кодек очень требователен к пропускной способности канала связи - по сравнению с другими потоковыми кодеками Pyrowave требует передачи в 5-10 раз больше трафика. Рекомендовано использование кодека для трансляции и доступа к играм в локальной сети с подключением к гигабитным портам Ethernet. По умолчанию битрейт выбирается автоматически в зависимости от контента, но при ограниченной пропускной способности сетей предоставляется настройка для задания верхней границы битрейта (допустимые значения от 100 до 500 Mbit/s). Pyrowave оптимизирован для очень быстрого кодирования и декодирования с задействованием GPU и полностью реализован в форме вычислительных шейдеров. При наличии достаточной пропускной способности (битрейт на уровне ~200+ mbit/s) кодек демонстрирует минимальные задержки на уровне 0.1 мс при качестве 1080p и 0.2 мс при качестве 4K. Для устойчивости к потере пакетов в Pyrowave применяется изолированное кодирование блоками 64x64. Поддерживается HDR и цветовые пространства YCbCr 4:2:0 и 4:4:4. HDR включается автоматически при его поддержке на стороне хоста и клиента. Формат кодирования цвета 4:4:4 требует более ресурсоёмких вычислений и увеличивает трафик, поэтому отключён по умолчанию и рекомендован для активации при трансляции содержимого рабочего стола или необходимости повышения читаемости текста на видео.
| ||
|
Обсуждение (105 +26) |
Тип: К сведению |
| ||
| · | 21.09 | Проект Convey развивает форк почтового клиента Geary (64 +2) |
|
Опубликован почтовый клиент Convey, продолжающий развитие проекта Geary, новые версии которого не публиковались с мая 2024 года. Наиболее заметным отличием от Geary является переход на использование библиотек GTK4 и libadwaita. Код написан на языке Vala и распространяется под лицензией LGPL.
Среди изменений:
![]()
| ||
|
Обсуждение (64 +2) |
Тип: Программы |
| ||
| · | 21.09 | Выпуск дистрибутива MX Linux 25.3 (48 +13) |
|
Опубликован релиз легковесного дистрибутива MX Linux 25.3, созданного в результате совместной работы сообществ, образовавшихся вокруг проектов antiX и MEPIS. Выпуск основан на пакетной базе Debian с улучшениями от проекта antiX и пакетами из собственного репозитория. В дистрибутиве на выбор можно использовать системы инициализации sysVinit и systemd. Поставляются собственные инструменты для настройки и развёртывания системы. Для загрузки доступны 64-разрядные сборки (x86_64) с рабочим столом Xfce (2.7 ГБ), а также сборки с рабочим столом KDE (3.4 ГБ) и сборки (2.3 ГБ) с оконным менеджером Fluxbox.
В новом выпуске:
| ||
|
Обсуждение (48 +13) |
Тип: Программы |
| ||
| · | 21.09 | Выпуск утилиты для загрузки web-контента GNU Wget2 2.3.0 (36 +25) |
|
Опубликован релиз проекта GNU Wget2 2.3.0, развивающего переписанный с нуля и полностью переработанный вариант программы для автоматизации рекурсивной загрузки контента GNU Wget. Wget2 предоставляет набор дополнительных опций, поддерживает загрузку в несколько потоков, позволяет использовать доступную функциональность через библиотеку libwget, поддерживает протоколы HTTP/2 и TLS 1.3, даёт возможность загружать только изменившиеся данные, может сохранять данные с серверов потокового вещания, корректно обрабатывает интернационализированные доменные имена и может перекодировать загружаемое содержимое. Утилита wget2 поставляется под лицензией GPLv3+, а библиотека под LGPLv3+.
В новой версии основное внимание уделено исправлению ошибок, из изменений в функциональности выделяется расширение поддержки платформы OS/2, обеспечение конвертации ссылок в CSS при указании опции "--convert-links", поддержка атрибута srcdoc в элементе iframe, разбор HTML-тегов data-src и data-srcset, опция "--spider -S" для показа заголовков без загрузки содержимого и опция "--progress=dot" для визуализации прогресса выполнения загрузки.
| ||
|
Обсуждение (36 +25) |
Тип: Программы |
| ||
| · | 21.09 | Представлены первые ноутбуки Googlebook, оснащённые Android (186 –15) |
|
Компания Google объявила о доступности для предзаказа трёх первых моделей ноутбуков Googlebook, созданных компаниями Acer, Dell и Lenovo (в разработке также находятся модели от ASUS и HP). Отправка устройств по предзаказам начнётся 4 октября. Серия Googlebook построена на базе платформы Android 17 и идёт на смену устройствам Chromebook, поставлявшимся с операционной системой ChromeOS. Платформа Googlebook преподносится как переход от традиционных операционных систем к умным системам, в которые тесно интегрированы AI-сервисы.
Интерфейс пользователя основан на реализованном в Android десктоп-режиме для больших экранов, позволяющем одновременно работать с окнами нескольких приложений по аналогии с традиционной средой рабочего стола. Из Android также задействованы ядро Linux, GKI-модули (Generic Kernel Image), компоненты взаимодействия с оборудованием (HAL), Android Runtime, Android API, системные фоновые процессы и библиотеки. Из Chrome OS перенесён интерфейс запуска приложений (Launcher), файловый менеджер, а также отдельные системные сервисы. ![]() Поддерживается бесшовное взаимодействие со смартфонами на базе платформы Android и предоставляется возможность устанавливать созданные для Android приложения из каталога Google Play. Из интерфейса Googlebook также можно запускать приложения, установленные на связанном смартфоне, не доставая смартфон и не переустанавливая приложения на ноутбуке. В файловом менеджере предоставляется доступ к содержимому Android-смартфонов и имеется возможность переносить, просматривать и искать файлы на разных Android-устройствах пользователя. В платформу встроен AI-ассистент Gemini, который активируется при помощи умного курсора - достаточно подёргать курсор из стороны в сторону, и курсор перейдёт в режим вывода контекстных подсказок, появляющихся при его наведении на любой интересующий контент на экране. Например, после наведения курсора на дату в письме AI-ассистент предложит назначить встречу, а при выборе курсором нескольких изображений можно сгенерировать новое изображение на их основе. Подобным образом можно сравнивать контент и задавать AI-ассистенту вопросы о содержимом. При помощи AI также осуществляется создание пользовательских виджетов - достаточно нажать кнопку создания виджета и естественным языком описать, что хочется получить. ![]() В базовую поставку входят такие приложения, как Google Chrome, Google Docs, Gmail, Google Drive, Google Gemini, Google Calendar, Google Photos и YouTube. Помимо Android-приложений и игр из Google Play, предоставляется возможность установки Adobe Photoshop, Adobe Lightroom, CapCut, Microsoft 365 и некоторых других нативных программ. Для запуска игр, выпускаемых для ПК, можно использовать сервис GeForce NOW. Возможен просмотр видео с платформ Netflix и HBO Max. Запуск Linux-программ осуществляется в виртуализированном окружении, для строгой изоляции памяти в котором применяется pKVM (Protected KVM). ![]() Доступные для предзаказа устройства:
| ||
|
Обсуждение (186 –15) |
Тип: К сведению |
| ||
| · | 20.09 | Valve опубликовала инструментарий Lepton для запуска Android-игр в Linux (118 +60) |
|
Компания Valve развивает инструментарий Lepton, позволяющий запускать в Linux игры, поставляемые для платформы Android.
Проект рассчитан на интеграцию со Steam Client и создан для предоставления возможности запуска Android-игр с поддержкой устройств виртуальной реальности на VR-шлеме Steam Frame, поставляемом с Linux.
Lepton формирует изолированный контейнер с системным образом платформы Android, включающий всё необходимое для запуска Android-игр. Начинка сформирована c использованием патчей и компонентов от проектов Waydroid, Anbox, Halium и Hybris. Наработки для сборки образа с Android, применяемого для исполнения игр в Linux, распространяются под лицензией GPLv3, а инструментарий для организации процесса запуска игр с использованием подготовленного образа - под лицензией MIT. В Lepton также включены дополнительные возможности, помогающие разработчикам игр перенести свои Android-игры в Steam. В формируемое Android-окружение пробрасываются используемые в хостовой ОС библиотеки Steam/Steamworks, графические драйверы (mesa, zink) и Vulkan-прослойки для оптимизации рендеринга и снижения детализации по краям экрана. Поддерживается интеграция с различными отладчиками (strace, gdb, lldb, renderdoc) и профилировщиками (perfetto). Отличия Lepton от существующих проектов, реализующих окружения для запуска Android-приложений в Linux:
| ||
|
Обсуждение (118 +60) |
Тип: Программы |
| ||
| · | 20.09 | Опасные уязвимости в ядре Linux, KVM, Exim, Unbound, Ghostscript и Suricata (117 +20) |
Несколько недавно выявленных опасных уязвимостей, позволяющих получить root-доступ в системе или добиться удалённого выполнения кода.
| ||
|
Обсуждение (117 +20) |
Тип: Проблемы безопасности |
| ||
| · | 19.09 | Новые версии Wine 11.18 и Wine-staging 11.18 (36 +15) |
|
Опубликован экспериментальный выпуск открытой реализации Win32 API - Wine 11.18. С момента выпуска 11.17 был закрыто 44 отчёта об ошибках и внесено 380 изменений.
Наиболее важные изменения:
Отдельно сформирован выпуск проекта Wine Staging 11.18, предоставляющего расширенные сборки Wine, включающие не полностью готовые или рискованные патчи, пока непригодные для принятия в основную ветку Wine. По сравнению с Wine в Wine Staging предоставляется 273 дополнительных патчей. В новом выпуске Wine Staging осуществлена синхронизация с кодовой базой Wine 11.18 и обновлён код vkd3d. В основной состав Wine перенесён патч, преобразующий заголовочный файл d3d10_1shader.h в файл в формате idl (Interface Definition Language).
Добавлены патчи для преобразования представления цвета YV12 в RGB в коде отрисовки и выполнения проверок исполняемых файлов для архитектуры WoW64 (64-bit Windows-on-Windows), позволяющей выполнять 32-разрядные Windows-приложения в 64-разрядных Unix-системах.
| ||
|
Обсуждение (36 +15) |
Тип: Программы |
| ||
| · | 18.09 | Опубликована библиотека управления памятью jemalloc 5.4 (61 +23) |
|
Представлен релиз библиотеки управления памятью jemalloc 5.4.0, предлагающей альтернативную реализацию функций malloc, оптимизированную для снижения фрагментации и работы на многопроцессорных системах. Для решения проблем с блокировками на многоядерных системах в jemalloc для каждого ядра CPU используется своя изолированная область распределения памяти, что позволяет добиться линейной масштабируемости при росте числа потоков.
В июне 2025 года автор проекта прекратил сопровождение и перевёл репозиторий jemalloc в архивный режим, но в марте этого года разработку возобновила компания Meta, применяющая jemalloc в своей инфраструктуре. Изначально библиотека была разработана для FreeBSD и используется в данной ОС по умолчанию с 2005 года. Код библиотеки написан на Си и распространяется под лицензией BSD. Среди изменений:
| ||
|
Обсуждение (61 +23) |
Тип: Программы |
| ||
| Следующая страница (раньше) >> | ||
|
Закладки на сайте Проследить за страницей |
Created 1996-2026 by Maxim Chirkov Добавить новость, Поддержать |