Имя

.html name: .html-имя

.html name must be 50 characters or less: .html-имя должно содержать не более 50 символов

.html name must be unique: .html-имя должно быть уникальным

.html name must contain a-z 0-9 _ - only: .html-имя должно содержать только символы от a до z, цифры, _ и -

(You): (Вы)

(You)s: (Вы)

one: %s символ

few: %s символа

many: %s символов

other: %s символ

one: %s день назад

few: %s дня назад

many: %s дней назад

other: %s день назад

one: %s день спустя

few: %s дня спустя

many: %s дней спустя

other: %s день спустя

%s earlier: %s выше

one: %s файл

few: %s файла

many: %s файлов

other: %s файл

%s files are being served, totaling %s.: Обработано %s файлов, %s.

one: выбран %s файл

few: выбрано %s файла

many: выбрано %s файлов

other: выбран %s файл

one: %s час назад

few: %s часа назад

many: %s часов назад

other: %s час назад

one: %s час спустя

few: %s часа спустя

many: %s часов спустя

other: %s час спустя

one: %s минуту назад

few: %s минуты назад

many: %s минут назад

other: %s минуту назад

one: %s минуту спустя

few: %s минуты спустя

many: %s минут спустя

other: %s минуту спустя

one: %s месяц назад

few: %s месяца назад

many: %s месяцев назад

other: %s месяц назад

one: %s месяц спустя

few: %s месяца спустя

many: %s месяцев спустя

other: %s месяц спустя

one: %s ответ

few: %s ответа

many: %s ответов

other: %s ответ

%s replies and %s files omitted.: %s ответов и %s файлов пропущены.

%s replies and 1 file omitted.: %s ответов и 1 пропущенный файл.

%s replies omitted.: %s ответов пропущено.

one: %s UID

few: %s UID'а

many: %s UID'ов

other: %s UID

one: %s неделю назад

few: %s недели назаж

many: %s недель назад

other: %s неделю назад

one: %s неделю спустя

few: %s недели спустя

many: %s недель спустя

other: %s неделю спустя

one: %s год назад

few: %s года назад

many: %s лет назад

other: %s год назад

one: %s год спустя

few: %s года спустя

many: %s лет спустя

other: %s год спустя

⊖ Thread has reached reply limit.: ⊖ Тред достиг предела ответов.

1 reply and %s files omitted.: 1 ответ и %s пропущенных файлов.

1 reply and 1 file omitted.: 1 ответ и 1 файл пропущены.

1 reply omitted.: 1 ответ пропущен.

24 Hour Time: 24-часовой формат

24h time: 24-ч время

2FA Code: Код двуфакторной авторизации

2FA code must be 6 characters: Код 2FA должен состоять из 6 символов

2FA QR code expired, try again: Срок действия QR-кода истек, попробуйте еще раз

404 Not Found: 404! Мы искали как могли...

500 Internal Server Error: 500 Внутренняя ошибка сервера

502 Bad Gateway: 502 Бэд гетвей

503 Service Unavailable: 503 Служба недоступна

504 Gateway Timeout: 504 Время ожидания истекло

6 digits: 6 цифр

a-zA-Z0-9-_ only: только a-zA-Z0-9-_

Abandoned Board Action: Действие на заброшенной доске

Abandoned board action must be a number from 0-3: Действие на заброшенной доске должно быть числом от 0 до 3

Ability to create new boards.: Возможность создавать новые доски.

Ability to register an account.: Возможность зарегистрировать учетную запись.

Ability to see raw IPs in moderation interfaces.: Возможность видеть IP-адреса в интерфейсах модерации.

Access board bans. Ability to unban, edit, or deny appeals.: Доступ к банам на доске. Возможность отмены бана, редактирования или отклонения апелляций.

Access board logs. Ability to search/filter.: Доступ к журналам доски. Возможность поиска / фильтрации.

Доступ к настройкам доски. Возможность изменения любых настроек. Страница настроек покажет перенос / удаление форм для тех, у кого есть разрешение "Владелец доски".

Access global bans. Ability to unban, edit, or deny appeals.: Доступ к глобальным банам. Возможность отмены бана, редактирования или отклонения апелляций.

Access global logs. Ability to search/filter: Доступ к глобальным журналам. Возможность поиска / фильтрации

Access global settings. Ability to change any settings.: Доступ к глобальным настройкам. Возможность изменять любые настройки.

Access news posting. Ability to add, edit, or delete newsposts.: Доступ к публикации новостей. Возможность добавлять, редактировать или удалять новостные сообщения.

Access roles list. Ability to edit roles: Доступ к списку ролей. Возможность редактирования ролей

Доступ к списку учетных записей. Возможность поиска / сортировки. Возможность редактировать права любого пользователя.

Доступ к глобальному списку досок. Возможность поиска / фильтрации. Также предоставляет возможность перенести или удалить любую доску.

Доступ к ресурсам доски и своим страницам. Возможность загружать, создавать, редактировать, удалять.

Доступ к управлению персоналом и возможность управлять правами других пользователей. Может быть предоставлен только кем-то другим с разрешения "Владельца доски". Используйте с осторожностью!

Account: Аккаунт

Account deleted: Аккаунт удален

Account does not exist: Аккаунт не существует

Account permissions: Права аккаунта

Account with that username already exists: Учетная запись с таким именем пользователя уже существует

Accounts: Аккаунты

Actions: Действия

Active sessions: Активные сеансы

Active Sessions: Активные Сеансы.

Add: Добавить

one: Добавить вложение (макс. %s)

other: Добавить вложения (макс. %s)

one: Добавить баннер (макс. %s)

other: Добавить баннеры (макс. %s)

Add Boards: Добавить доски

Add Custom Page: Добавить свою страницу

Add Filter: Добавить фильтр

one: Добавить флаг (макс. %s)

other: Добавить флаги (макс. %s)

Add layer: Добавить слой

Add News: Добавить новость

Add Staff: Добавить персонал

one: Добавлен %s бан

few: Добавлено %s бана

many: Добавлено %s банов

other: Добавлен %s бан

Added custom page: Добавлена пользовательская страница

Added filter: Добавлен фильтр

Added newspost: Добавлена новость

Added staff: Добавлен персонал

Admin: Админ

Airbrush: Распылитель

Allow Animated Image Files: Разрешить анимированные изображения

Allow Audio Files: Разрешить аудиофайлы

Allow Custom Overboard: Разрешить пользовательские настройки трекера

Allow Image Files: Разрешить файлы изображений

Allow Other Files: Разрешить другие файлы

Allow Video Files: Разрешить видеофайлы

Allowed Code Themes: Разрешенные темы кода

Allowed Hosts: Разрешенные хосты

Allowed hosts must not exceed 10000 characters: Разрешенные хосты не должны превышать 10000 символов

Allowed Themes: Разрешенные темы

alphanumeric only: только буквенно-цифровой

Always Reveal Spoiler Markdown: Всегда показывать спойлер Markdown

Always reveal text spoilers: Всегда выявлять текстовые спойлеры

Animated .gif Thumbnails: Анимированные .gif-миниатюры

Announcement: Анонс

Anon Name: Имя анонима по умолчанию

Anon name must be 50 characters or less: Имя анонима должно содержать 50 символов или меньше

Another role already exists with the same permissions: "%s": Уже существует другая рольс теми же разрешениями:"%s"

Antispam: Антиспам

Antispam FAQ: ЧаВо антиспама

Any Content Same IP/ID: Любой контент с тем же IP/ID

Appeal: Апелляция

Appeal message must be %s characters or less: Сообщение апелляции должно содержать не более %s символов

Appealable?: Подлежит обжалованию?

one: %s бан успешно обжалован

few: %s бана успешно обжаловано

many: %s банов успешно обжаловано

other: %s бан успешно обжалован

Appeals must include a message: Аппеляции должны содержать сообщение

Apply: Применить

Произвольные ресурсы, которые могут быть использованы для других целей, например, пользовательский CSS

Archive: Архив

Вы уверены? Изменение холста очистит все слои и историю и отключит запись повтора.

Are you sure? Your work will be lost.: Вы уверены? Ваша работа будет потеряна.

Ascending: По возрастанию

one: Вложение

other: Вложения

one: Вложение уже есть

other: Вложения уже есть

Asset File Size Max: Максимальный размер вложения

Asset files max must be a number: Максимальное количество вложений должно быть числом

Asset files size must be a number: Размер вложений должен быть числом

Asset files total must be a number: Общее количество вложений должно быть числом

Assets: Вложения

Assets Per Upload Max: Максимум вложений на загрузку

At least the following file is not unique: %s: По крайней мере, следующий файл не уникален: %s

At least the following files are not unique: %s: По крайней мере, следующие файлы не являются уникальными: %s

Attempting to reconnect...: Попытка повторного подключения ...

Audio Thumbnails: Миниатюры аудио

Bad request: Неверный запрос

Ban: Бан

Ban Duration: Длительность бана

Ban duration e.g. 7d: Длительность бана, например, 7d

Ban note must be %s characters or less: Примечание о бане должно содержать не более символов %s

Ban Poster: Забанить плакат

Ban reason: Причина бана

Ban Reason: Причина Бана

Ban reason must be %s characters or less: Причина бана должна содержать не более %s символов

Ban reporter: Забанить докладчика

Ban Reporters: Забанить докладчиков

Banned!: Забанено!

one: Баннер

other: Баннеры

Banner File Size Max: Максимальный размер файла баннера

Banner files height must be a number > 0: Высота файла баннера должна быть больше нуля

Banner files max must be a number: Максимальное количество баннеров должно быть числом

Banner files size must be a number: Размер файлов баннеров должен быть числом

Banner files total must be a number: Общее количество файлов баннеров должно быть числом

Banner files width must be a number > 0: Ширина файлов баннеров должна быть больше нуля

Banner Height Max: Максимальная высота баннера

Banner Width Max: Максимальная ширина баннера

Banners: Баннеры

Banners Per Upload Max: Максимальное количество баннеров на загрузку

Bans: Баны

Bans & Appeals: Баны и апелляции

Bans currently in place against your IP: Баны, действующие в настоящее время в отношении вашего IP

Blacklist: Черный список

Block Bypass: Обход блокировки

Block bypass expire after uses must be a number > 0: Количество использований, после которых истекает обход блокировки, должно быть число > 0

Block bypass expired or exceeded max uses: Срок действия обхода блока истек или превышено максимальное количество использований

Block Bypasses: Block Bypasses

Block post: Блок-пост

Blocked Countries: Заблокированные страны

Blur: Размытие

Board: Доска

Board /%s/ does not exist: Доска /%s/ не существует

Board announcements must be 5000 characters or less: Посты на доске должны содержать не более 5000 символов

Board Custom CSS: Пользовательский CSS для доски

Board default captcha mode must be a number from 0-2: В капче по умолчанию должно быть число от 0-2

Board default file r9k mode must be a number from 0-2: Файл доски в режиме r9k по умолчанию должен иметь номер от 0-2

Board default lock mode must be a number from 0-2: Режим блокировки доски по умолчанию должен быть числом от 0-2

Board default message r9k mode must be a number from 0-2: Сообщение доски в режиме r9k по умолчанию должно быть числом от 0-2

Board default pph trigger action must be a number from 0-4: Действие триггера PPH на доске по умолчанию должно быть числом от 0 go 4

Board default pph trigger must be a number: PPH-триггер доски должен быть числом

Board default tph trigger action must be a number from 0-4: Действие TPH-триггера по умолчанию должно быть числом от 0 до 4

Board default tph trigger must be a number: TPH-триггер доски должен быть числом

Board Defaults: Значения по умолчанию доски

Board defaults bump limit must be within global limits: Бамп-лимиты доски должны быть меньше глобальных

Board defaults captcha reset must be a number from 0-2: Капча сброса доски по умолчанию должна быть числом от 0 до 2

Board defaults filter ban duration must be a number: Длительность бана от автофильтра по умолчанию должна быть числом

Board defaults filter mode must be a number from 0-2: Режим автофильтрации должен быть числом от 0 до 2

Board defaults lock reset must be a number from 0-2: Сброс блокировки доски должен быть числом от 0 до 2

Board defaults max files must be within global limits: Максимальное количество файлов по умолчанию на доске должно находиться в глобальных пределах

Максимальная длина ответного сообщения по умолчанию должна быть в глобальных пределах

Максимальная длина сообщения треда по умолчанию на плате должна быть в глобальных пределах

Board defaults min reply message length must be a number: Минимальный размер поста должен быть числом

Board defaults min thread message length must be a number: Минимальный размер треда должен быть числом

Board defaults reply limit must be within global limits: Лимит ответов по умолчанию на доске должен быть в глобальных пределах

Board defaults reply message length min must be less than max: Длина ответа не должна быть больше максимальной

Board defaults thread limit must be within global limits: Тред-лимит доски должен быть меньше такового в глобальных целях

Board defaults thread message length min must be less than max: Длина треда должна быть меньше макимальной

Board deleted: Доска удалена

Board Description: Описание платы

Board description must be %s characters or less: Описание доски должно состоять из символов %s или меньше

Board has no custom banners.: На доске нет пользовательских баннеров.

Board List: Список досок

Board locked: Доска заблокирована

Board Locked: Доска заблокирована

Board Management: Управление досками

Board name: Название доски

Board Name: Название доски

Board name must be 1-%s characters: Название доски должно состоять из символов 1-%s

Board Owner: Владелец доски

Board Staff: Персонал доски

Board Staff Defaults: Настройки по умолчанию для персонала доски

Board Owner Defaults: Настройки по умолчанию для владельца доски

Board URI: URI доски

Board Wide: все потоки

Board with this URI already exists: Доска с этим URI уже существует

Board-specific permissions: Разрешения для конкретной доски

Boards: Доски

Boards you are staff on: Доски, на которых вы работаете

Boards you own: Доски, которыми вы владеете

Bold: Жирный

Bucket: Ведро

Bump Limit: Бамплимит

Bump Limit Max: Бамплимит Макс

Bump Limit Min: Минимальный бамплимит

Bump Limit must be %s-%s: Предел бамплимита должен быть %s-%s

Bump Order: Порядок бампа

Bumplock: Бамплок

Bumplocked: Заблокированный бамп

Bypass: Обход

Bypass all bans.: Обойти все баны.

Bypass all post filters.: Обойти все фильтры постов.

Bypass Anonymizer Restrictions: Bypass Anonymizer Restrictions

Bypass Anonymizer Restrictions.: Bypass Anonymizer Restrictions.

Bypass Bans: Обойти баны

Bypass Captcha: Обойти капчу

Bypass captcha.: Обойти капчу.

Bypass DNSBL: Байпас DNSBL

Bypass DNSBL.: Байпас DNSBL.

Bypass Filters: Обходные фильтры

Bypass Ratelimits: Обходные ограничения скорости

Обходные ограничения скорости для получения новых капчей, редактирования постов, настройки доски объявлений и т.д.

Bypass Spamcheck: Обойти проверку на спам

Обойти базовую проверку на спам против флуда при слишком частых похожих публикациях.

Bypasses: Обходит

Cache: Кэш

Cache Time: Время кэширования

Can only create %s pages per board: Может создавать только %s страниц на доску

Cannot transfer to account that does not exist: Не удается перевести на несуществующую учетную запись

Canvas height in pixels: Высота холста в пикселях

Canvas width in pixels: Ширина холста в пикселях

Captcha: Капча

Captcha config error: Ошибка конфигурации Captcha

Captcha disabled: Капча отключена

Captcha Distortion: Искажение Captcha

Captcha error occurred: Произошла ошибка Captcha

Captcha expired: Срок действия Captcha истек

Captcha for all posts: Капча для всех сообщений

Captcha for new thread: Капча для новых потоков

Captcha Mode: Режим Капчи

Captcha options distortion must be a number from 0-50: Искажение параметров Captcha должно быть числом от 0 до 50

Captcha options distorts min must be less than max: Параметры Captcha искажают min должно быть меньше max

Captcha options generate limit must be a number > 0: Ограничение генерации параметров Captcha должно быть числом > 0

Параметры Captcha сила эффекта границы сетки должна составлять число от 0 до 50

Captcha options grid image size must be a number from 50-500: Параметры Captcha размер изображения в сетке должен составлять от 50 до 500

Параметры Captcha сила шумового эффекта сетки должна составлять число от 0 до 10

Captcha options grid size must be a number from 2-6: Параметры Captcha размер сетки должен быть числом от 2-6

Captcha options icon y offset must be a number from 0-50: Смещение значка параметров капчи y должно быть числом от 0 до 50

Captcha options max distorts must be a number from 0-10: Параметры Captcha максимальное количество искажений должно быть числом от 0 до 10

Captcha options min distorts must be a number from 0-10: Параметры капчи минимальные искажения должны быть числом от 0 до 10

Параметры Captcha сила эффекта текстового шума должна составлять число от 0 до 10

Параметры Captcha сила эффекта закрашивания текста должна составлять число от 0 до 10

Параметры Captcha сила эффекта текстовой волны должна быть числовой формой 0-10

Captcha text: Текст капчи

Catalog: Каталог

Catalog View: Просмотр каталога

Change Board Settings: Изменить настройки доски

Change password: Изменить пароль

Change Password: Изменить пароль.

Clear: Очистить

Clear All: Clear All

Click here if you are not redirected automatically.: Нажмите здесь, если вы не перенаправлены автоматически.

Client aborted request: Клиент прервал запрос

Close: Закрыть

Code Block: Блок кода

Code Highlight Language Detect Threshold: Порог определения языка выделения кода

Code Highlighting Auto-Detect Languages: Автоматическое определение языков выделения кода

Code theme: Тема кода

Code Theme: Тема блока кода

Color: Цвет

comma separated: через запятую

Completed block bypass, you may go back and make your post.: Завершив обход блока, вы можете вернуться и сделать свой пост.

Confirm New Password: Подтвердить новый пароль

Confirm Password: Подтвердить пароль

Conflict: Конфликт

Connected for live posts: Подключено для живые сообщения

Connected for live posts (%sms): Подключено для живых сообщений (%sms)

Connecting...: Подключение ...

Could not load the image.: Не удалось загрузить изображение.

Could not load the replay: Не удалось загрузить повтор:

Country Code Header: Заголовок кода страны

Country code header length must not exceed 100 characters: Длина заголовка с кодом страны не должна превышать 100 символов

Create: Создать

Create a board: Создать доску

Create Account: Создать аккаунт

Create Board: Создать доску.

Created board /%s/: Created board /%s/

Creation Date: Дата создания

Crisp image rendering: Четкий рендеринг изображений

Crisp Image Rendering: Четкий рендеринг изображений

Current Staff: Текущий персонал

Currently blocked: В настоящее время заблокирован

Custom: Пользовательский

Custom CSS: Пользовательский CSS

Custom CSS Filters: Пользовательские фильтры CSS

Custom css filters must not exceed 10000 characters: Пользовательские css-фильтры не должны превышать 10000 символов

Custom CSS Max Length: Максимальная длина пользовательского CSS

Custom css max must be a number: Пользовательский css max должен быть числом

Custom CSS must be %s characters or less: Пользовательский CSS должен содержать не более символов %s

Строгий режим пользовательского CSS включен и не допускает следующего: "%s"

Custom Flags: Пользовательские флаги

Custom page does not exist: Пользовательская страница не существует

Custom Pages: Пользовательские страницы

Custom Pages Max Characters: Максимальное количество символов пользовательских страниц

Custom pages max length must be a number: Максимальная длина пользовательских страниц должна быть числом

Custom pages max must be a number: Максимальное количество пользовательских страниц должно быть числом

Customisation: Кастомизация

Customise: Настроить.

Cycle: Цикл

Cyclic: Циклический

Date: Дата

Date Added: Дата добавлена

Default: По умолчанию

Default Ban Duration: Продолжительность запрета по умолчанию

Default Code Theme: Тема кода по умолчанию

Default name: Имя по умолчанию

Default Theme: Тема по умолчанию

Default Volume: Объем по умолчанию

Default volume must be a number from 0-100: Громкость по умолчанию должна быть числом от 0 до 100

Delete: Удалить

Delete Account: Удалить аккаунт

Delete Assets: Удалить ресурсы

Delete Banners: Удалить баннеры

Delete board: Удалить доску

Delete by IP: Удалить по IP

Delete files: Удаление файлов

Delete Files: Удалить файлы

Delete Flags: Удалить флаги

Delete from IP globally: Удалить с IP глобально

Delete from IP in thread: Удалить с IP в потоке

Delete from IP on board: Удалить с IP на борту

Delete layers: Удалить слои

Delete Posts: Удалить записи

Delete Selected: Удалить выбранные

Delete selected layers?: Удалить выбранные слои?

Delete your account: Удалить свою учетную запись

Deleted: Удалено

one: Deleted %s record.

other: Deleted %n records.

one: Удалена %s учетная запись

few: Удалено %s учётных записи

many: Удалено %s учётных записей

other: Удалена %s учетная запись

one: Удалено %s вложение

few: Удалено %s вложения

many: Удалено %s вложений

other: Удалено %s вложение

one: Удалён %s баннер

few: Удалено %s баннера

many: Удалено %s баннеров

other: Удалён %s баннер

one: Удалена %s своя страница

few: Удалены %s свои страницы

many: Удалены %s своих страниц

other: Удалена %s своих страница

one: Удалён %s файл с сервера

few: Удалено %s файла с сервера

many: Удалено %s файлов с сервера

other: Удалён %s файл с сервера

one: Удалено %s сообщение

few: Удалено %s сообщения

many: Удалено %s сообщений

other: Удалено %s сообщение

Deleted %s thread and %s post: Удалена 1 тема и 1 сообщение

Deleted %s thread and %s posts: Удалена 1 тема и %s сообщений

one: Удалён %s тред

few: Удалено %s треда

many: Удалено %s тредов

other: Удален %s тред

Deleted %s threads and %s post: Удалено %s тем и 1 сообщение

Deleted %s threads and %s posts: Удалено %s тем и %s сообщений

Deleted flags: Удаленные флаги

Deleted news: Удаленные новости

Denied %s appeals: Отклонено %s апелляций

Deny Appeal: Отклонить апелляцию

Descending: По убыванию

Description: Описание

Description must be %s characters or less: Описание должно состоять из символов %s или меньше

Destination for move does not exist: Пункт назначения для перемещения не существует

Пункт назначения для перемещения не существует, или у вас нет разрешения

Detected: Обнаружено

Dice Roll: Бросок кости

Disable anonymizer file posting: Отключить публикацию файлов анонимайзера

Disable Anonymizer File Posting: Отключить публикацию файла анонимайзера

Disable board custom CSS: Отключить пользовательский CSS платы

Disable Reply Subject: Отключить тему ответа

Disconnected: Отключен

Dismiss global reports: Отклонять глобальные отчеты

Dismiss Global Reports: Отклонить глобальные отчеты

Dismiss reports: Отклонять отчеты

Dismiss Reports: Отклонять отчеты

Dismissed reports: Отклоненные отчеты

Distortion Intensity: Интенсивность искажения

DNSBL: DNSBL

DNSBL Addresses: Адреса DNSBL

DNSBL Enabled: DNSBL включен

Do NOT import untrusted settings data!: НЕ импортировать ненадежные данные настроек!

Do nothing: Ничего не делать

Don't store raw IPs: Не храните необработанные IP-адреса

other: Дважды щелкните, чтобы выделить (%s)

other: Дважды коснитесь, чтобы выделить (%s)

Draw: Рисовать

e.g. 1d: например, 1d

e.g. 1h: например, 1h

e.g. 1mo: например, 1mo

e.g. 1w: например, 1w

e.g. 3d: например, 3d

e.g. 7d: например, 7d

e.g. Rule 1: No ad spam: например, отсутствие спама

Early 404: Начало 404 года

Early 404 Fraction: Ранняя фракция 404

Early 404 fraction must be a number: Ранняя дробь 404 должна быть числом

Early 404 Replies: Ранние ответы 404

Edge Effect Strength: Сила эффекта края

Edit: Редактировать

Edit Account: Редактировать аккаунт

Edit account permissions for: Редактировать разрешения учетной записи для

Edit board permissions for "%s": Редактировать разрешения доски для "%s"

Edit Custom Page: Редактировать пользовательскую страницу

Edit Duration: Редактировать продолжительность

Edit News: Редактировать новости

Edit newspost: Редактировать новостной пост

Edit Newspost: Редактировать заметки

Edit Note: Редактировать заметку.

Edit Post: Редактировать пост

Edit Role: Редактировать роль

Edit Role "%s": Редактировать роль "%s"

Edited account: Отредактированная учетная запись

Edited duration for %s bans: Отредактированная продолжительность для %s запретов

Edited note for %s bans: Отредактированное примечание для %s запретов

Edited role: Отредактированная роль

Edited staff: Отредактированный персонал

Email: Опции

Email must be %s characters or less: Адрес электронной почты должен содержать не более символов %s

Embeds Enabled: Встраивания включены

en-GB: Aнглийский

Enable: Включить

Enable captcha for all posts: Включить капчу для всех сообщений

Enable captcha for new thread: Включить captcha для нового потока

Enable Tegaki: Включить рисование

Включение 2FA приведет к аннулированию всех ваших существующих сеансов, и вам придется снова входить в систему.

Enforce Unique Files: Принудительное использование уникальных файлов

Enforce Unique Messages: Принудительное использование уникальных сообщений

Eraser: Ластик

Error connecting: Ошибка подключения

Error reconnecting: Ошибка повторного подключения

Europe: Европа

Events: События

Exceeded max asset uploads in one request of %s: Превышено максимальное количество загрузок активов за один запрос в %s

Exceeded max banner uploads in one request of %s: Превышено максимальное количество загрузок баннеров по одному запросу %s

Exceeded max flag uploads in one request of %s: Превышено максимальное количество загрузок файлов за один запрос на %s

Existing Password: Существующий пароль

Expire After Time: Истечь по истечении времени

Expire After Uses: Истекает после использования

Expires: Истекает

Expiry: Истечение срока действия

Export: Экспорт

Export does not include post password or (You)'s: Экспорт не включает почтовый пароль или ваши данные

External Archive Links: Ссылки на внешние архивы

External Archive Links URL: URL ссылок на внешний архив

Extra mime types must be like type/subtype: Дополнительные типы mime должны быть похожи на тип / подтип

Failed reconnecting: Сбой повторного подключения

False Characters: Ложные символы

faq: ЧаВо

Faster: Быстрее

Fetching posts...: Выборка сообщений ...

Field Length Limits: Ограничения длины поля

one: Файл

other: Файлы

Files & Thumbnails: Файлы и миниатюры

Files Per Post Max: Максимальное количество файлов на публикацию

Filter: Фильтр

Filter Auto Ban Duration: Фильтровать продолжительность автоматического запрета

Filter Bans Appealable: Фильтр запретов обжалуется

Filter does not exist: Фильтр не существует

filter hit: "%s": попадание в фильтр: "%s"

Filter ID: Идентификатор фильтра

Filter Mode: Режим фильтрации

Filter mode must be a number from 0-2: Режим фильтрации должен быть числом от 0-2

Filter Name: Имя фильтра

Filter Subject: Тема фильтра

Filter text cannot exceed 50000 characters: Текст фильтра не может превышать 50000 символов

Filter Tripcode: Код отключения фильтра

Filters FAQ: Часто задаваемые вопросы по фильтрам

Filters length must be 20000 characters or less: Длина фильтров должна составлять не более 20000 символов

Filters max must be a number: Максимальное количество фильтров должно быть числом

Flag File Size Max: Максимальный размер файла флага

Flag files max must be a number: Максимальное количество файлов флага должно быть числом

Flag files size must be a number: Размер файлов флага должен быть числом

Flag files total must be a number: Общее количество файлов флага должно быть числом

Flags Per Upload Max: Флаги на загрузку Макс

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

Flood Protection: Защита от наводнений

focus to load captcha: фокус для загрузки капчи

Force 3:1 Banner Aspect Ratio: Соотношение сторон баннера 3:1

Force Anon: Принудительный анон

Force Anonymizers: Принудительные анонимайзеры

Force Reply File: Принудительный файл ответа

Force Reply Message: Принудительное ответное сообщение

Force Thread File: Принудительный файл потока

Force Thread Message: Принудительное сообщение потока

Force Thread Subject: Тема принудительного потока

Forfeit staff positions: Аннулировать штатные должности

Frontend Script Defaults: Сценарии интерфейса по умолчанию

Полный контроль над доской, эквивалентный BO. Можно удалить и/или перенести доску. Может быть предоставлен только кем-то другим с разрешения "Владельца доски". Используйте с осторожностью!

Full control. Use with caution!: Полный контроль. Используйте с осторожностью!

Fuzzy Hash Images: Нечеткие хэш-изображения

Общее разрешение персонала правления. Получите доступ к индексу модов, каталогу, последним сообщениям и отчетам. Возможность отправлять действия мода. Обход специфичных для совета запретов и почтовых фильтров.

Общее разрешение глобального персонала. Доступ к последним сообщениям и отчетам. Возможность отправлять глобальные действия.

Generate Captcha: Генерировать капчу

Generate Limit: Генерировать лимит

Geo Flags: Географические флаги

Geographic Flag: Географический флаг

Get block bypass: Получить обход блокировки

Global Announcement: Глобальное объявление

Global announcement must not exceed 10000 characters: Глобальное объявление не должно превышать 10000 символов

Global ban: Глобальный запрет

Global Ban Poster: Плакат глобального запрета

Global ban reporter: Репортер о глобальном запрете

Global Ban Reporters: Репортеры глобального запрета

Global Bans: Глобальные запреты

Global Board Owner: Владелец глобального совета директоров

Global Board Staff: Персонал Глобального совета директоров

Global bump limit min must be less than max: Минимальный глобальный предел удара должен быть меньше максимального

Global bump limit minimum must be a number: Минимальный глобальный предел удара должен быть числом

Global delete by IP: Глобальное удаление по IP

global filter hit: "%s": попадание в глобальный фильтр: "%s"

Global limit ban reason field length must be a number: Глобальный предел причина запрета длина поля должна быть числом

Global limit board description field length must be a number: Длина поля описания платы глобального ограничения должна быть числом

Global limit board name field length must be a number: Длина поля Название глобальной лимитной платы должна быть числом

Global limit board uri field length must be a number: Длина поля uri Global limit board должна быть числом

Global limit email field length must be a number: Глобальное ограничение длины поля электронной почты должно быть числом

Global limit log message field length must be a number: Длина поля сообщения журнала глобального ограничения должна быть числом

Global limit message field length must be a number: Длина поля глобального ограничения сообщения должна быть числом

Global limit name field length must be a number: Длина поля имени глобального ограничения должна быть числом

Global limit postpassword field length must be a number >=20: Глобальное ограничение длины поля post password должно быть числом >=20

Global limit report reason field length must be a number: Глобальное ограничение длина поля причины отчета должна быть числом

Global limit subject field length must be a number: Длина поля темы глобального ограничения должна быть числом

Global Limits: Глобальные ограничения

Global Logs: Глобальные журналы

Global Management: Глобальное управление

Global post history for %s: Глобальная история сообщений для %s

Global reply limit maximum must be a number: Максимальное глобальное ограничение на ответ должно быть числом

Global reply limit min must be less than max: Глобальный лимит ответов min должен быть меньше максимального

Global reply limit minimum must be a number: Минимальный глобальный лимит ответов должен быть числом

Global Report: Глобальный отчет

Global Settings: Глобальные настройки

Global Staff: Глобальный персонал

Global thread limit maximum must be a number: Максимальное ограничение глобального потока должно быть числом

Global thread limit min must be less than max: Глобальный предел потока min должен быть меньше max

Global thread limit minimum must be a number: Минимум глобального ограничения потока должен быть числом

global word filter auto ban: автобан глобального фильтра слов

Greentext: Зеленый текст

Grid Captcha Options: Параметры капчи сетки

Grid Size: Размер сетки

Hidden images: Скрытые изображения

Hidden User: Скрытый пользователь

Hide Banners: Скрыть баннеры

Hide deleted post content: Скрыть содержимое удаленного сообщения

Hide Deleted Post Content: Скрыть содержимое удаленного сообщения

Hide post stubs: Скрыть заглушки сообщений

Hide Post Stubs: Скрыть заглушки сообщений

Hide thumbnails: Скрыть эскизы

Hide Thumbnails: Скрыть миниатюры

Hide Username: Скрыть имя пользователя

Hide Username In Modlog: Скрыть имя пользователя в Modlog

Параметры выделения языковое подмножество не должно превышать 10000 символов

Highlight options threshold must be a number: Пороговое значение параметров выделения должно быть числом

Hot Thread (%s): Горячий тред (%s)

Hot Threads Limit: Ограничение горячих потоков

Hot Threads Max Age: Максимальный возраст горячих потоков

Hot Threads Reply Threshold: Порог ответа горячих потоков

Hover expands media: Наведение курсора расширяет область носителя

Hover Expands Media: Наведение курсора мыши расширяет носитель

Hover expands follow cursor: Наведите курсор мыши и следуйте за курсором

Hover to view: Наведите курсор для просмотра

Icon Offset: Смещение значка

if enabled: если включено

Image loading bars: Панели загрузки изображений

Image Loading Bars: Панели загрузки изображений

Image Size: Размер изображения

Изображения, выбранные случайным образом и отображаемые в верхней части большинства страниц на доске

Import/Export Settings: Импорт / экспорт настроек

Inactive Account Action: Действие неактивной учетной записи

Inactive account action must be a number from 0-2: Действие неактивной учетной записи должно быть числом от 0 до 2

Inactive Account Time: Время неактивной учетной записи

Include Default Boards: Включить платы по умолчанию

Incorrect 2FA code: Неверный код 2FA

Incorrect account credentials: Неверные учетные данные учетной записи

Incorrect captcha answer: Неправильный ответ на капчу

Inline Monospace: Встроенное моноширинное пространство

Internal Server Error: Внутренняя ошибка сервера

Invalid 2FA code: Недопустимый код 2FA

Invalid account username: Неверное имя пользователя учетной записи

Invalid actions selected: Выбранные недопустимые действия

Iнедопустимый формат URL ссылок на архив, должна быть ссылка, содержащая %s, к которому относится параметр url.

Invalid assets selected: Выбраны недопустимые активы

Invalid ban action: Недопустимое действие запрета

Invalid ban duration: Недопустимая продолжительность запрета

Invalid ban upgrade option: Недопустимый вариант обновления запрета

Invalid banners selected: Выбраны недопустимые баннеры

Invalid bans selected: Выбраны недопустимые запреты

Invalid block bypass expire after time: Недействительный обход блока истекает по истечении времени

Invalid board default code theme: Недопустимая тема кода по умолчанию для доски

Invalid board default theme: Недопустимая тема по умолчанию для доски

Invalid board defaults OP thread age delete protection: Недопустимая защита от удаления возраста потока OP по умолчанию

Invalid board defaults OP thread reply count delete protection: Недопустимая защита от удаления количества ответов потока OP по умолчанию

Invalid captcha mode: Недопустимый режим captcha

Invalid captcha options font: Недопустимый шрифт параметров captcha

Invalid captcha options type: Недопустимый тип параметров captcha

Invalid checked sessions: едопустимые проверенные сеансы

Invalid code theme: Недопустимая тема кода

Invalid CSRF token: IНедопустимый токен CSRF

Invalid default ban duration: Недопустимая продолжительность запрета по умолчанию

Invalid dimensions.: Недопустимые измерения

Invalid dnsbl cache time: Недопустимое время кэша DNSBL

Iнедопустимый формат URL ссылок на Ethereum, должна быть ссылка, содержащая %s, к которому относится параметр url.

Недопустимый файл "%s". Максимальные размеры баннера составляют %sx%s и должны иметь соотношение сторон 3:1.

Invalid file "%s". Max banner dimensions are %sx%s.: Недопустимый файл "%s". Максимальные размеры баннера составляют %sx%s.

invalid file mime type: %s: недопустимый mime-тип файла: %s

Invalid file type for %s. Mimetype %s not allowed.: Недопустимый тип файла для %s. Mimetype %s не разрешен.

Invalid filter auto ban duration: Недопустимая продолжительность автоматического запрета фильтра

Invalid filter mode: Недопустимый режим фильтрации

Invalid flags selected: Выбраны недопустимые флаги

Invalid flood time any content same ip: Недопустимое время затопления любого содержимого с тем же ip

Invalid flood time same contenet any ip: Недопустимое время затопления одного и того же содержимого с любого ip

Invalid flood time same content same ip: Недопустимое время наводнения тот же контент тот же ip

Invalid hot threads limit: Недопустимый предел горячих потоков

Invalid hot threads max age: Недопустимый максимальный возраст горячих потоков

Invalid hot threads threshold: Недопустимый порог горячих потоков

Invalid inactive account time: Недопустимое время неактивной учетной записи

Invalid language: Недопустимый язык

Invalid lock mode: Недопустимый режим блокировки

Invalid lock wait: Недопустимое ожидание блокировки

Invalid number of reports checked: Неверное количество проверенных отчетов

Invalid OP thread age delete protection: Недопустимый возраст потока операций защита от удаления

Invalid OP thread reply count delete protection: Недопустимое количество ответов операционного потока защита от удаления

Недопустимый или отсутствующий заголовок "Refererer". Вы отправляете сообщения с правильного URL-адреса?

Invalid overboard catalog limit: Недопустимое ограничение по каталогу за бортом

Invalid overboard limit: Недопустимый предел превышения

Invalid post move destination: Недопустимый пункт назначения перемещения записи

Invalid pph trigger action: Недопустимое действие триггера pph

Invalid pph trigger threshold: Недопустимый порог срабатывания pph

Invalid request body: Недопустимый текст запроса

Недопустимый формат URL ссылок для обратного поиска изображений, должна быть ссылка, содержащая %s, к которому относится параметр url.

Invalid selected posts or destination thread: Неверно выбранные сообщения или целевая ветка

Invalid staff selection: Неверный подбор персонала

Invalid staff username: Неверное имя пользователя сотрудника

Invalid template selection: Неверный выбор шаблона

Invalid theme: Недопустимая тема

Invalid thumbnail size: Недопустимый размер миниатюры

Invalid tph trigger action: Недопустимое действие триггера tph

Invalid tph trigger threshold: Недопустимый порог срабатывания tph

Invalid trigger reset captcha: Недопустимая капча сброса триггера

Invalid trigger reset lock: Недопустимая блокировка сброса триггера

IP Header: Заголовок IP

IP header length must not exceed 100 characters: Длина IP-заголовка не должна превышать 100 символов

Issue Date: Дата выпуска

Last Active: Последнее активное

Last edited: Последнее отредактированное

Last edited | by %s: Последний раз редактировалось | %s

Latest Activity: Последнее действие

Latest News: Последние новости

Layer limit reached.: Достигнут предел слоя.

Live posts: Живые сообщения

Live Posts: Живые сообщения

Live posts off: Прямые сообщения отключены

Loading replay…: Загрузка повтора

Local First: Местный первый

Local time: Местное время

Local Time: Местное время

Lock board: Блокирующая доска

Lock Mode: Режим блокировки

Lock thread creation: Создание потока блокировки

Lock Thread Creation: Создание потока блокировки

Lock+Unlist board: Блокировка и снятие с учета доски

Locked: Заблокировано

Log Message: Сообщение журнала

Log Messages: Сообщения журнала

Log out: Выход из системы

Logo URLs: URL-адреса логотипа

Logs for %s: Журналы для %s

Loop audio/video: Цикл аудио / видео

Loop Audio/Video: Цикл аудио / видео

Make links clickable: Сделать ссылки интерактивными

Malformed input: Неправильный ввод

Malformed IP: 'Неправильный IP

Manage Custom Pages: Управление пользовательскими страницами

Manage Filters: Управление фильтрами

Manage News: Управление новостями

one: Максимум %s файл

few: Максимум %s файла

many: Максимум %s файлов

other: Максимум %s файл

Max Files: Максимальное количество файлов

Max files must be 0-%s: Максимальное количество файлов должно составлять 0-%s

Max files per post is %s: Максимальное количество файлов на публикацию равно %s

Max files per post on this board is %s: Максимальное количество файлов на публикацию на этой доске равно %s

Max files per request is %s: Максимальное количество файлов на запрос равно %s

Max Filters Per Board: Максимальное количество фильтров на плате

Max Homepage News Entries: Максимальное количество записей новостей на главной странице

Max recent news must be a number: Максимум последних новостей должно быть число

Max Reply Message Length: Максимальная длина ответного сообщения

Max reply message length must be 0-%s: Максимальная длина ответного сообщения должна составлять 0-%s

Максимальная длина ответного сообщения должна составлять 0-%s и не менее "Минимальной длины ответного сообщения" (в настоящее время %s)

Max Thread Message Length: Максимальная длина сообщения потока

Max thread message length must be 0-%s: Максимальная длина сообщения потока должна составлять 0-%s

Максимальная длина сообщения потока должна составлять 0-%s и не менее "Длина сообщения основного потока" (в настоящее время %s)

Maximum Distortions: Максимальные искажения

Merge layers: Объединить слои

Merge selected layers?: Объединить выбранные слои?

Message: Сообщение

Message must be %s characters or less: Сообщение должно содержать не более символов %s

Message must be 10000 characters or less: Сообщение должно содержать не более 10000 символов

Message too long.: Сообщение слишком длинное.

Сообщения должны быть уникальными в этой теме. Ваше сообщение не уникально.

Сообщения на этой доске должны быть уникальными. Ваше сообщение не уникально.

Meta Site Name: Мета-название сайта

Meta site name must not exceed 100 characters: Мета-название сайта не должно превышать 100 символов

Meta url must not exceed 100 characters: Мета-URL не должен превышать 100 символов

Mime type "%s" for "%s" not allowed: Mime-тип "%s" для "%s" не разрешен

Mime type "%s" invalid for file "%s": Mime-тип "%s" недопустим для файла "%s"

Mime type invalid for file "%s": Mime-тип недопустим для файла "%s"

Mime type mismatch for file "%s": Несоответствие типа Mime для файла "%s"

Min and max reply message lengths must not violate eachother: Минимальная и максимальная длины ответных сообщений не должны нарушать друг друга

Min and max thread message lengths must not violate eachother: Минимальная и максимальная длины сообщений потока не должны нарушать друг друга

Min Reply Message Length: Минимальная длина ответного сообщения

Min reply message length must be 0-%s: Минимальная длина ответного сообщения должна составлять 0-%s

Минимальная длина ответного сообщения должна составлять 0-%s и не более "Максимальная длина ответного сообщения" (в настоящее время %s)

Min Thread Message Length: Длина сообщения основного потока

Min thread message length must be 0-%s: Минимальная длина сообщения потока должна составлять 0-%s

Минимальная длина сообщения потока должна составлять 0-%s и не более "Максимальная длина сообщения потока" (в настоящее время %s)

Minimum Distortions: Минимальные искажения

Missing .html name: Отсутствует имя .html

Missing 2FA code: Отсутствует код 2FA

Missing board: Отсутствующая доска

Missing confirmation: Отсутствует подтверждение

Missing file extensions: Отсутствующие расширения файлов

Missing filter id: Отсутствующий идентификатор фильтра

Missing message: Пропущенное сообщение

Missing name: Отсутствующее имя

Missing new owner username: Отсутствует имя пользователя нового владельца

Missing new password: Отсутствует новый пароль

Missing new password confirmation: Отсутствует подтверждение нового пароля

Missing news id: Пропавший идентификатор новости

Missing page id: Отсутствующий идентификатор страницы

Missing password: Отсутствующий пароль

Missing password confirmation: Отсутствует подтверждение пароля

Missing postId: Отсутствующий почтовый индекс

Missing role id: Отсутствующий идентификатор роли

Missing staff username: Отсутствующее имя пользователя сотрудника

Missing title: Отсутствующий заголовок

Missing URI: Отсутствует URI

Missing username: Отсутствующее имя пользователя

Mod Catalog: Каталог модов

Mod Index: Индекс модов

Modlog message: Сообщение журнала модуляции

Modlog message must be %s characters or less: Сообщение журнала модов должно содержать не более символов %s

Move down: Переместить вниз

Move up: Переместить вверх

Moved posts: Перемещенные сообщения

Multi input anon limit must be a number: Ограничение анонимности с несколькими входами должно быть числом

Multi Input Form Anon: Анон формы множественного ввода

Multi Input Form Staff: Персонал формы множественного ввода

Multi input staff limit must be a number: Ограничение на количество сотрудников с несколькими входами должно быть числом

Must check parent post if checking reports for report action: Необходимо проверить родительскую запись при проверке отчетов для действия отчета

Must input destinaton thread number or board to move posts: Необходимо ввести номер целевого потока или платы для перемещения записей

Must not select >%s posts per request: Не следует выбирать >%s сообщений для каждого запроса

Must provide a file: Необходимо предоставить файл

Must select a report action if checked reports: Необходимо выбрать действие отчета, если установлен флажок отчеты

Must select at least one account: Необходимо выбрать хотя бы одну учетную запись

Must select at least one asset to delete: Необходимо выбрать хотя бы один ресурс для удаления

Must select at least one ban: Необходимо выбрать хотя бы один запрет

Must select at least one ban to appeal: Необходимо выбрать хотя бы один запрет для обжалования

Must select at least one banner to delete: Необходимо выбрать хотя бы один баннер для удаления

Must select at least one custom page to delete: Необходимо выбрать хотя бы одну пользовательскую страницу для удаления

Must select at least one filter to delete: Необходимо выбрать хотя бы один фильтр для удаления

Must select at least one flag to delete: Необходимо выбрать хотя бы один флаг для удаления

Must select at least one newspost to delete: Необходимо выбрать хотя бы одну новостную публикацию для удаления

Must select at least one post: Необходимо выбрать хотя бы одно сообщение

Must select at least one session to delete: Необходимо выбрать хотя бы один сеанс для удаления

Must select at least one staff to delete: Необходимо выбрать хотя бы одного сотрудника для удаления

Must select only 1 post for edit action: Необходимо выбрать только 1 запись для редактирования

Must select post and reports to ban reporter: Необходимо выбрать публикацию и отчеты, чтобы запретить репортеру

My permissions: Мои разрешения

My Permissions: Мои разрешения.

Name must be %s characters or less: Имя должно состоять из символов %s или меньше

Narrow Range: Узкий диапазон

New owner must be different from current owner: Новый владелец должен отличаться от текущего владельца

New owner username: Имя пользователя нового владельца

New owner username must be 50 characters or less: Имя пользователя нового владельца должно содержать не более 50 символов

New owner username must contain a-z 0-9 only: Имя пользователя нового владельца должно содержать только a-z 0-9

New Password: Новый пароль

New password and password confirmation must match: Новый пароль и подтверждение пароля должны совпадать

New password confirmation must be 100 characters or less: Подтверждение нового пароля должно содержать не более 100 символов

New pasword must be 100 characters or less: Новый пароль должен содержать не более 100 символов

New Thread: Создать тред

Newline separated: Разделенная новой строкой

Newline separated, max 10: Разделитель новой строки, не более 10

News post does not exist: Новостной пост не существует

No actions selected: Действия не выбраны

No active layer.: Нет активного слоя

No appeal submitted: Апелляция не подана

No bans.: Запретов нет

No camera? Use this secret in your authenticator app instead: Нет камеры? Вместо этого используйте этот секрет в своем приложении-аутентификаторе

No change: Ничего не делать

No files found: Файлы не найдены

No files to spoiler: Нет файлов для спойлера

No Filters: Нет фильтров

No Logs.: Нет журналов

No message or files.: Ни сообщений, ни файлов.

No news.: Нет новостей

No permission: Нет разрешения

No Permission: Нет разрешения

No posts.: Нет сообщений.

No reason specified: Причина не указана

No reports to dismiss: Никаких отчетов, которые можно было бы отклонить

No reports.: Нет отчетов.

No results.: Нет результатов.

No threads selected to Bumplock: Нет нитей, выбранных для блокировки

No threads selected to Lock: Потоки не выбраны для блокировки

No threads selected to make Cyclical: Потоки не выбраны для создания циклических

No threads selected to Sticky: Нет нитей, выбранных для прилипания

No video/audio files in this thread.: Нет видео / аудио файлов в этой теме.

Noise Effect Strength: Сила шумового эффекта

Non-appealable Ban: Не подлежащий обжалованию запрет

Non-color IDs: Цветные идентификаторы

Non-Color IDs: Нецветные идентификаторы

Not blocked: Не заблокирован

Примечание: Установка разрешений на управление правлением на уровне учетной записи / роли предоставит их глобально, т.е. для всех советов.N Чтобы сделать кого-то обычным владельцем / персоналом доски, передайте им доску или дайте им соответствующие разрешения в интерфейсе редактирования разрешений персонала доски.

Only notify (You)s: Только ваши упоминания

Only Notify (You)s: Только ваши упоминания

OP Reply Count Delete Protection: Количество ответов OP Защита от удаления

OP Thread Age Delete Protection: Защита от удаления OP Thread Age

Opacity: Непрозрачность

Or, apply a role: Или применить роль

Other Mime Types: Другие типы Mime

Overboard Catalog: Каталог трекера

Overboard Catalog Thread Limit: Лимит тредов каталога трекера

Overboard Index: Индекс трекера

Overboard Index Thread Limit: Лимит тредов индекса трекера

Overboard Reverse Image Search: Обратный поиск изображений трекера

Own Boards: Собственные доски

Paint Effect Strength: Сила эффекта рисования

Password and password confirmation must match: Пароль и подтверждение пароля должны совпадать

Password confirmation must be 100 characters or less: Длина подтверждения пароля должна составлять не более 100 символов

Password did not match any selected posts: Пароль не соответствовал ни одному из выбранных сообщений

Password must be %s characters or less: Пароль должен состоять из символов %s или меньше

Password must be 1-100 characters: Пароль должен состоять из 1-100 символов

Password must be 50 characters or less: Пароль должен содержать не более 50 символов

Password updated successfully: Пароль успешно обновлен

Payload Too Large: Слишком большая полезная нагрузка

Pinktext: Розовый текст

Play: Воспроизведение

Playlist: Список воспроизведения

Please complete a block bypass to continue: Пожалуйста, завершите обход блока, чтобы продолжить

Please enable JavaScript to solve the captcha.: Пожалуйста, включите JavaScript для разгадайте капчу.

Пожалуйста, введите хотя бы один разрешенный хостинг в поле "Разрешенные хосты", когда выбрана опция "Проверка ссылки".

Please wait before generating another 2FA QR code.: Пожалуйста, подождите, прежде чем генерировать другой QR-код 2FA.

Пожалуйста, подождите, прежде чем делать другой пост или сообщение, похожее на сообщение другого пользователя

Popularity: Популярность

Post doesn't exist: Сообщение не существует

Post edited successfully: Сообщение успешно отредактировано

Post File Size Max: Максимальный размер файла публикации

Post files max must be a number: Максимальное количество файлов post должно быть числом

Post files size must be a number: Размер почтовых файлов должен быть числом

Post Filters: Фильтры сообщений

Post history for %s: История сообщений для %s

Post password: Пароль для удаления

Post Password: Пароль для удаления

Post styling: Стиль публикации

Posting files through anonymizers has been disabled globally: Публикация файлов с помощью анонимайзеров была отключена во всем мире

Публикация файлов через анонимайзеры была отключена на этой доске

Posts must include a message or file: Сообщения должны содержать сообщение или файл

Posts not shown: Сообщения не показаны

PPH Trigger Action: Действие триггера PPH

PPH Trigger Threshold: Порог срабатывания PPH

Preserve Alpha: Сохранить Альфа

Preview Replies: Предварительный просмотр ответов

Preview replies must be a number: Предварительный просмотр ответов должен содержать число

Proxy Address: Прокси-адрес

Prune Files Immediately: Удалить файлы немедленно

Prune IPs Days: Удалить дни IPs

Prune ips must be a number of days: Время обрезки должно составлять несколько дней

Prune Modlogs Days: Удалить дни модлогов

Prune modlogs must be a number of days: Журналы модов Prune должны содержать несколько дней

Pruned IP: Сокращенный IP

pt-BR: Бразильский португальский

Question Text: Текст вопроса

Quote Limit: Ограничение цитирования

Quote limit must be a number: Предел предложения должен быть числом

Rate limit cost board settings must be a number from 1-100: Настройки платы за предельную стоимость тарифа должны быть в диапазоне от 1 до 100

Rate limit cost captcha must be a number from 1-100: Ограничение скорости стоимость captcha должна быть числом от 1-100

Rate limit cost edit post must be a number from 1-100: Ограничение скорости стоимость редактирования записи должно быть числом от 1 до 100

Ratelimited: Скорость ограничена

Ratelimits: Ограничения по ставкам

Raw IPs: Необработанные IP-адреса

Recent Posts: Последние сообщения

Recently bumped threads from multiple boards: Недавно удаленные потоки с нескольких плат

Recording replay: Воспроизведение записи

Recursive post hide: Рекурсивное скрытие записи

Recursive Post Hiding: Скрытие рекурсивного сообщения

Referer Check: Проверка реферера

Register: Зарегистрироваться

Register an account: Зарегистрировать учетную запись

Regular User: Обычный пользователь

Remove Boards: Удалить доски

Removed %s bans: Удалены %s запретов

Replayable?: Воспроизводимый?

Replies must include a file: Ответы должны содержать файл

Replies must include a message: Ответы должны содержать сообщение

Reply Count: Количество ответов

Reply Limit: Ограничение на ответ

Reply Limit Max: Максимальный лимит ответа

Reply Limit Min: Минимальный лимит ответа

Reply Limit must be %s-%s: Ограничение на ответ должно быть %s-%s

Reply messages must be %s-%s characters: Ответные сообщения должны содержать символы %s-%s

Report must be %s characters or less: Отчет должен содержать не более символов %s

Report reason: Причина отчета

Report Reason: Причина отчета

one: Пожаловался на %s пост

few: Пожаловался на %s поста

many: Пожаловался на %s постов

other: Пожаловался на %s пост

Reports against or by ip %s: Отчеты против или по ip %s

Reports must have a reason: У отчетов должна быть причина

Resign: Уйти в отставку

Resign from a staff position: Уйти со штатной должности

Resign from the accounts page instead: Вместо этого откажитесь от страницы учетных записей

Resigned from owner position on /%s/: Уволился с должности владельца на /%s/

Resigned from staff position on /%s/: Уволился с должности сотрудника на /%s/

Reverse Image Search: Обратный поиск изображений

Reverse Image Search Links: Обратные ссылки для поиска изображений

Reverse Image Search Links URL: URL ссылок для обратного поиска изображений

Rewind: Перемотка назад

Right click to replace with the current color: Щелкните правой кнопкой мыши, чтобы заменить текущий цвет

Role does not exist: Роли не существует

Root: суперпользователь

Sage Only Email: Электронная почта только для Sage

Same Content Any IP/ID: Тот же контент любой IP /ID

Same Content Same IP/ID: Тот же контент, тот же IP /ID

Save As: Сохранить как

Save settings: Сохранить настройки

Scan the QR Code in an authenticator app, and submit the code: Отсканируйте QR-код в приложении-аутентификаторе и отправьте код

Scroll to new posts: Перейти к новым сообщениям

Scroll To New Posts: Прокрутка до новых сообщений

Secure Cookies: Безопасные файлы cookie

Security: Безопасность

See Global Post History: Просмотр глобальной истории сообщений

one: Выбрать/Бросить сюда/Вставить файл

other: Выбрать/Бросить сюда/Вставить файлы

Selected posts not found: Выбранные сообщения не найдены

Sessions deleted: Удаленные сеансы

one: Установитт уровень прилипания для %s треда на %s

few: Установить уровень прилипания для %s тредов на %s

many: Установить уровень прилипания для %s тредов на %s

other: Установить уровень прилипания для %s треда на %s

Setup 2FA: Настройка 2FA

Setup 2FA (TOTP): Настройка 2FA (TOTP)

Show (You)s: Показывать тебя

Show Post Actions: Показывать действия после публикации

Show Post In Ban: Показывать сообщение в бане

Show relative time: Показывать относительное время

Smooth scrolling: Плавная прокрутка

Smooth Scrolling: Плавная прокрутка

Socket error: Ошибка сокета

Sort By: Сортировать по

Space File Name Replacement: Замена имени файла с пробелом

Space file name replacement must be 1 character: Замена имени файла пробелом должна состоять из 1 символа

Spoiler File: Файл спойлера

Spoiler files: Файлы спойлеров

Spoiler Files: Файлы-спойлеры

one: Заспойлерен %s пост

few: Заспойлерено %s поста

many: Засполерено %s постов

other: Заспойлерен %s пост

Staff Boards: Доски объявлений персонала

Staff does not exist: Персонала не существует

Stats Count Anonymizers: Анонимайзеры подсчета статистики

Sticky Preview Replies: Ответы с липким предварительным просмотром

Sticky preview replies must be a number: Ответы на предварительный просмотр должны содержать число

Sticky priority, 0 = unsticky: Приоритет липкости, 0 = отклеенный

Strict Filtering: Строгая фильтрация

Strikethrough Effect: Эффект зачеркивания

Strip Filename: Имя файла полосы

Subject: Тема

Subject must be %s characters or less: Тема должна содержать %s символов или меньше

Supported Languages: Поддерживаемые языки

Supports post styling: Поддерживает стиль публикации

Switch color palette: Переключить цветовую палитру

Tags length must be 2000 characters or less: Длина тегов должна составлять 2000 символов или меньше

Tegaki Height: Высота тегаки

Tegaki height must be a number: Высота тегаки должна быть числом

Tegaki Size: Размер Тегаки

Tegaki Width: Ширина тегаки

Tegaki width must be a number: Ширина тегаки должна быть числом

Template Cache: Кэш шаблонов

Template Generation Lock Time: Время блокировки генерации шаблона

Test first in top-right settings if you have javascript enabled: Сначала протестируйте в настройках в правом верхнем углу, если у вас включен javascript

Text: Текст

Text Captcha Options: Параметры текстовой капчи

The active layer is not visible.: Активный слой не виден

Сервер, действующий в качестве шлюза или прокси-сервера, не получил ответ вовремя от вышестоящего сервера.

Сервер, действующий как шлюз или прокси, получил неверный ответ от вышестоящего сервера.

Сервер обнаружил ошибку и не смог выполнить ваш запрос

Серверу не удалось обработать "%s". Возможно, неподдерживаемый или поврежденный файл.

Сервер в настоящее время не может обработать запрос из-за временной перегрузки или планового обслуживания.

Сейчас есть %s публичных досок, и %s сообщений в общей сложности. Всего %s сообщений было сделано за последний день, %s сообщений за последний час, %s сообщений всего

В настоящее время в известной сети есть %s сайтов и %s досок. На всех досках объявлений за последний час было размещено %s сообщений, всего %s сообщений.

Thread creation locked: Создание потока заблокировано

Thread does not exist: Поток не существует

Thread Limit: Предел резьбы

Thread Limit Max: Максимальное ограничение потока

Thread Limit Min: Минимальное ограничение потока

Thread locked: Поток заблокирован

Thread messages must be %s-%s characters: Сообщения потока должны содержать символы %s-%s

Thread reached reply limit: Поток достиг предела ответа

Thread watcher: Наблюдатель за нитью

Thread Watcher: Наблюдатель за нитью.

Threads Limit must be %s-%s: Ограничение потоков должно быть %s-%s

Threads must include a file: Потоки должны включать файл

Threads must include a message: Темы должны содержать сообщение

Threads must include a subject: Темы должны содержать тему

Thumb extension must be like .xxx: Удлинитель большого пальца должен быть похож на .xxx

Thumbnail Dimensions: Размеры миниатюр

Thumbnail extension must be at least 1 character: Расширение миниатюры должно содержать не менее 1 символа

Thumbnail File Extension: Расширение файла миниатюр

Title: Заголовок

Title must be 50 characters or less: Заголовок должен содержать не более 50 символов

Toggle Bumplock: Переключить блокировку

Toggle Cycle: Переключить цикл

Toggle Lock: Переключить блокировку.

Toggle visibility: Переключить видимость

one: Переключена блокировка бампов для %s треда

few: Переключена блокировка бампов для %s тредов

many: Переключена блокировка бампов для %s тредов

other: Переключена блокировка бампов для %s треда

one: Переключен циклический режим для %s треда

few: Переключен циклический режим для %s тредов

many: Переключен циклический режим для %s тредов

other: Переключен циклический режим для %s треда

one: Переключена блокировка для %s треда

few: Переключена блокировка для %s тредов

many: Переключена блокировка для %s тредов

other: Переключена блокировка для %s треда

Too many files: Слишком много файлов

Too many files. Max files per post is %s: Слишком много файлов. Максимальное количество файлов на публикацию составляет %s

Too many files. Max files per post on this board is %s: Слишком много файлов. Максимальное количество файлов на пост на этой доске составляет %s

Tor Exit Node: Выходной узел Tor

Tor Hidden Service: Скрытая служба Tor

Total Assets Per Board: Общее количество ресурсов на Доску

Total Banners Per Board: Общее количество баннеров на Доску

Total Custom Pages Per Board: Всего пользовательских Страниц на Доску

Total Flags Per Board: Всего флагов на Доску

Total number of banners would exceed global limit of %s: Общее количество баннеров превысило бы глобальный лимит в %s

Total number of filters would exceed global limit of %s: Общее количество фильтров превысило бы глобальный предел в %s

Total number of flags would exceed global limit of %s: Общее количество флагов превысило бы глобальный предел в %s

TPH Trigger Action: Триггерное действие TPH

TPH Trigger Threshold: Порог срабатывания TPH

Transfer ownership: Передача права собственности

Transferred ownership: Переданное право собственности

Trigger Reset Captcha Mode: Запускает режим сброса капчи

Trigger Reset Lock Mode: Режим блокировки сброса триггера

True Characters: Истинные символы

Two factor authentication enabled successfully: Двухфакторная аутентификация успешно включена

Two Factor Authentication Setup: Двухфакторная Настройка аутентификации

Unban: Отменить запрет

Unique File Enforcement: Принудительное использование уникального файла

Unique Message Enforcement: Принудительное использование уникального сообщения

Unknown Types Pass Validation: Неизвестные типы проходят проверку

Unlimit media height: Неограниченная высота носителя

Unlimit Media Height: Неограниченная высота носителя

Unlink files: Разблокируйте файлы

Unlink Files: Отменить привязку файлов

one: Отвязан %s файл

few: Отвязано %s файла

many: Отвязано %s файлов

other: Отвязан %s файл

Unlist from webring: Удалить список из webring

Unlist locally: Отменить список локально

Unlisted From Webring: Не внесен в список из Webring

Unlisted Locally: Не внесен в список локально

Unlock board: Разблокировка платы

Unlocked: Разблокирован

Unregistered User: Незарегистрированный пользователь

Updated custom page: Обновленная пользовательская страница

Updated filter: Обновленный фильтр

Updated newspost: Обновленный выпуск новостей

Updated settings.: Обновлены настройки.

Upgrade Ban: Запрет на обновление

Upgraded %s bans: Обновленные %s запретов

one: Загружено %s новое вложение.

few: Загружено %s новых вложения

many: Загружено %s новых вложений

other: Загружено %s новое вложение.

one: Загружено %s новых баннеров.

few: Загружено %s новых баннера

many: Загружено %s новых баннеров

other: Загружено %s новых баннеров.

one: Загружен %s новый флаг.

few: Загружено %s новых флага

many: Загружено %s новых флагов

other: Загружен %s новый флаг.

Uploaded files must be unique in this thread.: Загруженные файлы должны быть уникальными в этом потоке.

Uploaded files must be unique on this board.: Загруженные файлы должны быть уникальными на этой доске.

URI "%s" is reserved: URI "%s" зарезервирован

URI does not match current board: URI не соответствует текущей плате

URI must be %s characters or less: URI должен состоять из символов %s или меньше

URI must contain a-z 0-9 only: URI должен содержать только a-z 0-9

URI or tags: URI или теги

Use bold: Использовать жирный шрифт

Use code blocks: Использовать блоки кода

Use detected: Использовать обнаруженные

Use dice rolls: Использовать броски костей

Use ffmpeg For .gif Thumbnails: Использовать ffmpeg для миниатюр .gif

Use fortunes: Использовать fortunes

Use greentext: Использовать greentext

Use inline monospace: Использовать встроенное моноширинное пространство

Use italics: Использовать курсив

Use pinktext: Использовать розовый текст

Use Relative Time: Использовать относительное время

Use Socks Proxy: Использовать Socks Proxy

Use spoilers: Использовать спойлеры

Use strikethrough: Использовать зачеркивание

Use titles: Использовать заголовки

Use underline: Использовать подчеркивание

User does not exist: Пользователь не существует

User File Spoilering: Порча пользовательских файлов

User file spoiling is disabled on this board: Порча пользовательских файлов на этой плате отключена

User File Unlinking: Отсоединение пользовательского файла

User file unlinking is disabled on this board: Отсоединение пользовательского файла отключено на этой плате

User is already board owner: Пользователь уже является владельцем доски

User is already staff: Пользователь уже является сотрудником

User Post Deletion: Удаление записи пользователя

User post deletion is disabled on this board: Удаление записи пользователя на этой доске отключено

USER WAS BANNED FOR THIS POST: ПОЛЬЗОВАТЕЛЬ БЫЛ ЗАБАНЕН ЗА ЭТОТ ПОСТ

Username: Имя пользователя

Username must be 1-50 characters: Имя пользователя должно состоять из 1-50 символов

Username must be 50 characters or less: Имя пользователя должно содержать не более 50 символов

Username must contain a-z 0-9 only: Имя пользователя должно содержать только a-z 0-9

Username must not be an ethereum address: Username must not be an ethereum address

Users: Пользователи

Validate Mime Types: Проверка типов Mime

Video Thumbnail Percentage: Процент миниатюр видео

Video thumbnail percentage must be a number from 1-100: Процент миниатюр видео должен составлять число от 1 до 100

Video/Audio volume: Громкость видео / аудио

View Raw IPs: Просмотр необработанных IP-адресов

View the full text: Просмотреть полный текст

View the full thread: Просмотреть полную ветку

Watchlist: Список наблюдения

Wave Effect Strength: Сила волнового эффекта

Webring blacklist must not exceed 10000 characters: Черный список Webring не должен превышать 10000 символов

Webring following list must not exceed 10000 characters: Приведенный ниже список не должен превышать 10000 символов

Webring logos list must not exceed 10000 characters: Список логотипов Webring не должен превышать 10000 символов

Webring Stats: Веб-статистика

Welcome: Добро пожаловать

Welcome, %s: Добро пожаловать, %s

Wide Range: Широкий диапазон

word filter auto ban: фильтр слов автобан

You already have 2FA setup: У вас уже есть настройка 2FA

Вы слишком быстро меняете настройки, пожалуйста, подождите минуту и попробуйте еще раз

Вы редактируете сообщения слишком быстро, пожалуйста, подождите минуту и попробуйте еще раз

You can't apply template permissions to a ROOT user.: Вы не можете применить разрешения шаблона к пользователю ROOT.

You can't delete the board owner: Вы не можете удалить владельца доски

You can't edit the permissions of the board owner: Вы не можете редактировать разрешения владельца доски

You can't edit this role: Вы не можете редактировать эту роль

You can't edit your own permissions: Вы не можете редактировать свои собственные разрешения

Вы не можете удалить свою учетную запись, пока занимаете штатную должность в любом правлении

You did not select a board: Вы не выбрали доску

You moderate: Вы модерируете

You will be redirected shortly.: Вы будете перенаправлены в ближайшее время.

Your country "%s" is not allowed to post on this board: Вашей стране "%s" не разрешено размещать сообщения на этой доске

Your post was blocked by a word filter: Ваш пост был заблокирован словесным фильтром

Ваш запрос был заблокирован, потому что ваш IP-адрес внесен в черный список.

Your upload was too large: Ваша загрузка была слишком большой

Global Bans & Appeals: Глобальные блокировки и апелляции

Block/Ban Message: Сообщение о блокировке/бане

Replace Text: Заменить текст

Replace text cannot exceed 500 characters: Заменяемый текст не может превышать 500 символов

Force Account 2FA: Принудительная двухфакторная аутентификация аккаунта

Force Action 2FA: Принудительная двухфакторная аутентификация действия


code:
'use strict';

module.exports = async(db) => {
	console.log('Creating bypass collection');
	await db.createCollection('bypass');
	console.log('Creating bypass collection index');
	await db.collection('bypass').createIndex({ 'expireAt': 1 }, { expireAfterSeconds: 0 });
};

repo_name: Marzisoft/jschan

license: mit


code:
'use strict';

module.exports = async(db) => {
	console.log('update moglog postids to postlinks');
	await db.collection('modlog').updateMany({},
		[{
			$addFields: {
				postLinks: [
					{
						$arrayToObject: {
							$map: {
								input: '$postIds',
								as: 'postId',
								in: {
									k: 'postId',
									v: '$$postId'
								}
							}
						}
					}
				]
			}
		}
		]);
	await db.collection('modlog').updateMany({}, {
		'$unset': {
			'postIds': ''
		},
		'$set': {
			'showLinks': false
		}
	});
};


code:
'use strict';

module.exports = async(db) => {
	console.log('Expiring existing captchas, so new ones get new answer format');
	await db.collection('captcha').deleteMany({});
};


code:
'use strict';

module.exports = async(db, redis) => {
	console.log('Renamed "yotsuba b" to "yotsuba-b" in any board settings');
	await db.collection('boards').updateMany({
		'settings.theme': 'yotsuba b',
	}, {
		'$set': {
			'settings.theme': 'yotsuba-b',
		}
	});
	console.log('Cleared boards cache');
	await redis.deletePattern('board:*');
};


code:
'use strict';

module.exports = async(db, redis) => {
	console.log('Adding file r9k setting to boards db');
	await db.collection('boards').updateMany({}, {
		'$set': {
			'settings.fileR9KMode': 0,
		}
	});
	console.log('Cleared boards cache');
	await redis.deletePattern('board:*');
};


code:
'use strict';

module.exports = async(db, redis) => {
	console.log('Adding disableOnionFilePosting setting');
	await db.collection('boards').updateMany({}, {
		'$set': {
			'settings.disableOnionFilePosting': false,
		}
	});
	console.log('Cleared boards cache');
	await redis.deletePattern('board:*');
};


code:
'use strict';

module.exports = async(db, redis) => {
	console.log('Adding message r9k option to boards db');
	await db.collection('boards').updateMany({}, {
		'$set': {
			'settings.messageR9KMode': 0,
		}
	});
	console.log('Cleared boards cache');
	await redis.deletePattern('board:*');
};


code:
'use strict';

module.exports = async(db, redis) => {
	console.log('Allow tph/pph separate triggers and resets');
	await db.collection('boards').updateMany({}, {
		'$rename': {
			'settings.triggerAction' : 'settings.pphTriggerAction',
		}
	});
	await db.collection('boards').updateMany({}, {
		'$unset': {
			'settings.resetTrigger' : '',
			'preTriggerMode': '',
		}
	});
	await db.collection('boards').updateMany({}, {
		'$set': {
			'settings.tphTriggerAction' : 0,
			'settings.captchaReset' : 0,
			'settings.lockReset' : 0,
		}
	});
	console.log('Cleared boards cache');
	await redis.deletePattern('board:*');
};


code:
'use strict';

module.exports = async(db) => {
	console.log('add collection for board custompages');
	await db.createCollection('custompages');
	await db.collection('custompages').createIndex({ 'board': 1, 'page': 1 }, { unique: true });
};


code:
'use strict';

module.exports = async(db, redis) => {
	console.log('Renaming disable onion file posting to disable anonymizer file posting');
	await db.collection('boards').updateMany({}, {
		'$rename': {
			'settings.disableOnionFilePosting' : 'settings.disableAnonymizerFilePosting',
		}
	});
	console.log('Cleared boards cache');
	await redis.deletePattern('board:*');
};


code:
'use strict';

module.exports = async(db) => {
	console.log('fixing index for custompages');
	try {
		await db.collection('custompages').dropIndex('board_1_url_1');
	} catch (e) {
		// didnt have the bad index
	}
	await db.collection('custompages').createIndex({ 'board': 1, 'page': 1 }, { unique: true });
};


code:
'use strict';

module.exports = async(db) => {
	console.log('Renaming IP fields on posts');
	await db.collection('posts').updateMany({}, {
		'$rename': {
			'ip.hash': 'ip.single'
		}
	});
};


code:
'use strict';

const fs = require('fs-extra')
	, uploadDirectory = require(__dirname+'/../lib/file/uploaddirectory.js');

module.exports = async(db) => {
	console.log('put thumbs in a folder');
	await fs.ensureDir(`${uploadDirectory}/file/thumb/`);
	await db.collection('files')
		.find()
		.forEach(async file => {
			const [hash] = file._id.split('.');
			file.exts.forEach(ext => {
				fs.moveSync(`${uploadDirectory}/file/thumb-${hash}${ext}`, `${uploadDirectory}/file/thumb/${hash}${ext}`);
			});
		});
};


code:
'use strict';

module.exports = async(db, redis) => {
	console.log('migrate old config to db');
	const oldSettings = require(__dirname+'/../configs/main.js');
	const secrets = require(__dirname+'/../configs/secrets.js');
	//delete anythign thats in the secrets
	Object.keys(secrets).forEach(key => {
		delete oldSettings[key];
	});
	//and a few more that arent in the root
	delete oldSettings.captchaOptions.google;
	delete oldSettings.captchaOptions.hcaptcha;
	const templateSettings = require(__dirname+'/../configs/template.js.example');
	const newSettings = { ...templateSettings, ...oldSettings };
	//set default settings into redis instead
	redis.set('globalsettings', newSettings);
};


code:
'use strict';

module.exports = async(db, redis) => {
	console.log('remove need for configs/webring');
	const webring = require(__dirname+'/../configs/template.js.example');
	const settings = await redis.get('globalsettings');
	const newSettings = { ...settings, ...webring };
	redis.set('globalsettings', newSettings);
};


code:
'use strict';

module.exports = async(db, redis) => {
	console.log('add markdown permissions');
	const settings = await redis.get('globalsettings');
	const newSettings = {
		...settings,
		permLevels: {
			markdown: {
				pink: 4,
				green: 4,
				bold: 4,
				underline: 4,
				strike: 4,
				italic: 4,
				title: 4,
				spoiler: 4,
				mono: 4,
				code: 4,
				link: 4,
				detected: 4,
				dice: 4,
				fortune: 0,
			},
		},
	};
	redis.set('globalsettings', newSettings);
};


code:
'use strict';

module.exports = async() => {
	console.log('Moving user uploads from /img/ to /file/');
	require('fs').renameSync(__dirname+'/../static/img/', __dirname+'/../static/file/');
};


code:
'use strict';

module.exports = async(db, redis) => {
	console.log('Renaming some settings fields on boards');
	await db.collection('boards').updateMany({}, {
		'$rename': {
			'settings.locked': 'settings.lockMode',
			'settings.unlisted': 'settings.unlistedLocal',
			'settings.webring': 'settings.unlistedWebring'
		}
	});
	console.log('upadting renamed fields to proper values');
	await db.collection('boards').updateMany({
		'settings.lockMode': true,
	}, {
		'$set': {
			'settings.lockMode': 2,
		}
	});
	await db.collection('boards').updateMany({
		'settings.lockMode': false,
	}, {
		'$set': {
			'settings.lockMode': 0,
		}
	});
	await db.collection('boards').updateMany({
		'settings.triggerAction': 3,
	}, {
		'$set': {
			'settings.triggerAction': 4,
		}
	});
	console.log('clearing boards cache');
	await redis.deletePattern('board:*');
};


code:
'use strict';

const config = require(__dirname+'/../lib/misc/config.js');

module.exports = async(db, redis) => {
	console.log('Adding bumplimit field to boards on posts');
	await db.collection('boards').updateMany({}, {
		'$set': {
			'settings.bumpLimit': config.get.globalLimits.bumpLimit.max,
		}
	});
	console.log('Cleared boards cache');
	await redis.deletePattern('board:*');
	console.log('Cleared globalsettings cache');
	await redis.deletePattern('globalsettings');
};


code:
'use strict';

module.exports = async(db, redis) => {
	console.log('Adding blockedCountries field to boards');
	await db.collection('boards').updateMany({}, {
		'$set': {
			'settings.blockedCountries': [],
		}
	});
	console.log('Cleared boards cache');
	await redis.deletePattern('board:*');
};


code:
'use strict';

module.exports = async(db, redis) => {
	console.log('add sageOnlyEmail option to boards');
	await db.collection('boards').updateMany({}, {
		'$set': {
			'settings.sageOnlyEmail': false,
		}
	});
	console.log('Cleared boards cache');
	await redis.deletePattern('board:*');
};


code:
'use strict';

module.exports = async(db, redis) => {
	console.log('add resetTrigger option to boards');
	await db.collection('boards').updateMany({}, {
		'$set': {
			'settings.resetTrigger': false,
		}
	});
	console.log('Cleared boards cache');
	await redis.deletePattern('board:*');
};


code:
'use strict';

const hashIp = require(__dirname+'/../lib/misc/haship.js');

module.exports = async(db, redis) => {
	console.log('change bans index');
	await db.collection('bans').dropIndex('ip_1_board_1');
	await db.collection('bans').createIndex({ 'ip.single': 1 , 'board': 1 });
	console.log('adjusting ip on posts and clearing reports');
	const promises = [];
	await db.collection('posts').find().forEach(doc => {
		promises.push(db.collection('posts').updateOne({
			'_id':doc._id
		}, {
			'$set':{
				'ip.raw': doc.ip.single,
				'ip.single': hashIp(doc.ip.single),
				'ip.qrange': hashIp(doc.ip.qrange),
				'ip.hrange': hashIp(doc.ip.hrange),
				'reports': [], //easier than fixing reports
				'globalreports': [], //easier than fixing reports
			}
		}));
	});
	console.log('adjusting ip in modlogs');
	await db.collection('modlog').find().forEach(doc => {
		promises.push(db.collection('modlog').updateOne({
			'_id':doc._id
		}, {
			'$set':{
				'ip': {
					'raw': doc.ip,
					'single': hashIp(doc.ip)
				}
			}
		}));
	});
	console.log('adjust ip in bans, set null type and remove saved posts');
	await db.collection('bans').find().forEach(doc => {
		promises.push(db.collection('bans').updateOne({
			'_id':doc._id
		}, {
			'$set':{
				'ip': {
					'raw': doc.ip,
					'single': hashIp(doc.ip)
				},
				'type': null,
				'posts': null //easier than fixing all saved posts
			}
		}));
	});
	await Promise.all(promises);
	console.log('Cleared boards cache');
	await redis.deletePattern('board:*');
};


code:
'use strict';

module.exports = async(db, redis) => {
	console.log('moving globalsettings from redis into mongodb');
	const oldSettings = await redis.get('globalsettings');
	if (oldSettings) {
		await db.collection('globalsettings').replaceOne({ _id: 'globalsettings' }, oldSettings, { upsert: true });
	}
};


code:
'use strict';

const fs = require('fs-extra')
	, uploadDirectory = require(__dirname+'/../lib/file/uploaddirectory.js');

module.exports = async(db) => {
	console.log('adding flags customisation');
	await fs.ensureDir(`${uploadDirectory}/flag/`);
	const template = require(__dirname+'/../configs/template.js.example');
	await db.collection('globalsettings').updateOne({ _id: 'globalsettings' }, {
		'$set': {
			'globalLimits.flagFiles': template.globalLimits.flagFiles,
			'globalLimits.flagFilesSize': template.globalLimits.flagFilesSize,
			'boardDefaults.customFlags': false,
		},
		'$rename': {
			'boardDefaults.flags': 'boardDefaults.geoFlags',
		}
	});
	await db.collection('boards').updateMany({}, {
		'$set': {
			'flags': {},
			'settings.customFlags': false,
		},
		'$rename': {
			'settings.flags': 'settings.geoFlags',
		}
	});
};


code:
'use strict';

module.exports = async(db, redis) => {
	console.log('Adding threadwatcher to frontend script settings');
	await db.collection('globalsettings').updateOne({ _id: 'globalsettings' }, {
		'$set': {
			'frontendScriptDefault.threadWatcher': true,
		},
	});
	console.log('Clearing globalsettings cache');
	await redis.deletePattern('globalsettings');
};


code:
'use strict';

module.exports = async(db) => {
	console.log('setting webring:false to boards');
	await db.collection('boards').updateMany({}, {
		'$set': {
			'webring': false,
		},
		'$rename': {
			'settings.tags': 'tags'
		}
	});
	await db.collection('boards').dropIndexes();
	await db.collection('boards').createIndex({ips: 1, pph:1, sequence_value:1});
	await db.collection('boards').createIndex({tags: 1});
	await db.collection('boards').createIndex({uri: 1});
	await db.collection('boards').createIndex({lastPostTimestamp:1});
	await db.dropCollection('webring');
};


code:
'use strict';

module.exports = async(db) => {
	console.log('add unix time to posts for (u) links');
	await db.collection('posts').aggregate([
		{
			$project: {
				_id: '$_id',
				u: {
					$toDouble: '$date'
				}
			}
		}, {
			$merge: {
				into: 'posts'
			}
		}
	]).toArray();
	console.log('=\nNOTICE: 0.1.3 has updated nginx config, now using snippets for a more modular config that is easier to maintain. It is recommended to update these, refer to step 6 of INSTALLATION.\n=');
	console.log('=\nNOTICE: 0.1.3 now makes custom favicon generate easily and properly. Place your master image file in gulp/res/icons/master.png, then run "gulp generate-favicon && gulp icons"\n=');
};


code:
'use strict';

module.exports = async(db) => {
	console.log('adding markdown db entry for fortune example');
	await db.collection('globalsettings').updateOne({ _id: 'globalsettings' }, {
		'$set': {
			'permLevels.markdown.fortune': 0
		}
	});
};


code:
'use strict';

const fs = require('fs-extra')
	, uploadDirectory = require(__dirname+'/../lib/file/uploaddirectory.js');

module.exports = async(db, redis) => {
	console.log('Adding assets');
	await fs.ensureDir(`${uploadDirectory}/asset/`);
	const template = require(__dirname+'/../configs/template.js.example');
	await db.collection('globalsettings').updateOne({ _id: 'globalsettings' }, {
		'$set': {
			'globalLimits.assetFiles': template.globalLimits.assetFiles,
			'globalLimits.assetFilesSize': template.globalLimits.assetFilesSize,
		},
	});
	await db.collection('boards').updateMany({}, {
		'$set': {
			'assets': [],
		},
	});
	console.log('Cleared boards cache');
	await redis.deletePattern('board:*');
	console.log('Cleared globalsettings cache');
	await redis.deletePattern('globalsettings');
};


code:
'use strict';

module.exports = async(db, redis) => {
	console.log('Adding custom overboard toggle, links for archive and reverse image urls and add to board defaults');
	await db.collection('globalsettings').updateOne({ _id: 'globalsettings' }, {
		'$set': {
			'allowCustomOverboard': false,
			'archiveLinksURL': 'https://archive.today/?run=1&url=%s',
			'reverseImageLinksURL': 'https://tineye.com/search?url=%s',
			'boardDefaults.archiveLinks': false,
			'boardDefaults.reverseImageSearchLinks': false,
		},
	});
	console.log('Cleared globalsettings cache');
	await redis.deletePattern('globalsettings');
	console.log('Adding archive and imgops link options to boards');
	await db.collection('boards').updateMany({}, {
		'$set': {
			'settings.archiveLinks': false,
			'settings.reverseImageSearchLinks': false,
		}
	});
	console.log('Cleared boards cache');
	await redis.deletePattern('board:*');

};


code:
'use strict';

module.exports = async(db, redis) => {
	console.log('Adding OP delete protection options to board settings');
	await db.collection('globalsettings').updateOne({ _id: 'globalsettings' }, {
		'$set': {
			'boardDefaults.deleteProtectionAge': 0,
			'boardDefaults.deleteProtectionCount': 0,
		},
	});
	console.log('Clearing globalsettings cache');
	await redis.deletePattern('globalsettings');
	await db.collection('boards').updateMany({}, {
		'$set': {
			'settings.deleteProtectionAge': 0,
			'settings.deleteProtectionCount': 0,
		}
	});
	console.log('Clearing boards cache');
	await redis.deletePattern('board:*');

};


code:
'use strict';

module.exports = async(db, redis) => {
	console.log('setting 2fa/totp property on accounts');
	await db.collection('accounts').updateMany({}, {
		'$set': {
			'twofactor': null,
		}
	});
	console.log('Clearing globalsettings cache');
	await redis.deletePattern('globalsettings');
};


code:
'use strict';

module.exports = async(db, redis) => {

	console.log('changing post/report/ban ip type storage format');

	await db.collection('posts').updateMany({
		/* Make sure they all existing ones at least have a type
		in case the site uses "dont store raw ips" */
	}, {
		'$set': {
			'ip.type': 0,
		}
	});
	await db.collection('posts').updateMany({
		'ip.raw': /^([0-9]+(\.|$)){4}/
	}, [{
		'$set': {
			'ip.type': 0,
			'ip.cloak': {
				$concat: ['$ip.cloak', '4']
			}
		}
	}]);
	await db.collection('posts').updateMany({
		'ip.raw': /:/
	}, [{
		'$set': {
			'ip.type': 1,
			'ip.cloak': {
				$concat: ['$ip.cloak', '6']
			}
		}
	}]);
	await db.collection('posts').updateMany({
		'ip.cloak': /PRUNED$/
	}, {
		'$set': {
			'ip.type': 3,
		}
	});
	await db.collection('posts').updateMany({
		'ip.cloak': /BP$/
	}, {
		'$set': {
			'ip.type': 2,
		}
	});
	await db.collection('posts').updateMany({}, {
		'$set': {
			reports: [],
			globalreports: [],
		}
	});

	await db.collection('bans').updateMany({
		/* Make sure they all existing ones at least have a type
		in case the site uses "dont store raw ips" */
	}, {
		'$set': {
			'ip.type': 0,
		}
	});
	await db.collection('bans').updateMany({
		'ip.raw': /^([0-9]+(\.|$)){4}/
	}, [{
		'$set': {
			'ip.type': 0,
			'ip.cloak': {
				$concat: ['$ip.cloak', '4']
			}
		}
	}]);
	await db.collection('bans').updateMany({
		'ip.raw': /:/
	}, [{
		'$set': {
			'ip.type': 1,
			'ip.cloak': {
				$concat: ['$ip.cloak', '6']
			}
		}
	}]);
	await db.collection('bans').updateMany({
		'ip.cloak': /PRUNED$/
	}, {
		'$set': {
			'ip.type': 3,
		}
	});
	await db.collection('bans').updateMany({
		'ip.cloak': /BP$/
	}, {
		'$set': {
			'ip.type': 2,
		}
	});

	console.log('Clearing globalsettings cache');
	await redis.deletePattern('globalsettings');
};


code:
'use strict';

module.exports = async(db, redis) => {
	console.log('adding image/video resolution maximum setting');
	await db.collection('globalsettings').updateOne({ _id: 'globalsettings' }, {
		'$set': {
			'globalLimits.postFilesSize.imageResolution': 100000000,
			'globalLimits.postFilesSize.videoResolution': 77414400,
		},
	});
	console.log('Clearing globalsettings cache');
	await redis.deletePattern('globalsettings');
};


code:
'use strict';

module.exports = async(db, redis) => {
	console.log('Adding option to hide deleted post content to frontend script settings');
	await db.collection('globalsettings').updateOne({ _id: 'globalsettings' }, {
		'$set': {
			'frontendScriptDefault.hideDeletedPostContent': false,
		},
	});
	console.log('Clearing globalsettings cache');
	await redis.deletePattern('globalsettings');
};


code:
'use strict';

const hashIp = require(__dirname+'/../lib/misc/haship.js')
	, { createCIDR, parse } = require('ip6addr')
	, Permission = require(__dirname+'/../lib/permission/permission.js')
	, { Permissions } = require(__dirname+'/../lib/permission/permissions.js')
	, { Binary } = require('mongodb');

module.exports = async(db, redis) => {

// IP CLOAKING
	const postIps = await db.collection('posts').distinct('ip.raw');
	const logIps = await db.collection('modlog').distinct('ip.raw');
	const banIps = await db.collection('bans').distinct('ip.raw');
	const allDistinctIps = postIps.concat(logIps).concat(banIps);
	const ipBulkWrites = allDistinctIps.map(ip => {
		const ipSet = {};
		try {
			const ipParsed = parse(ip);
			const ipKind = ipParsed.kind();
			const ipStr = ipParsed.toString({
				format: ipKind === 'ipv4' ? 'v4' : 'v6',
				zeroElide: false,
				zeroPad: false,
			});
			let qrange
				, hrange;
			if (ipKind === 'ipv4') {
				qrange = createCIDR(ipStr, 24).toString();
				hrange = createCIDR(ipStr, 16).toString();
			} else {
				qrange = createCIDR(ipStr, 64).toString();
				hrange = createCIDR(ipStr, 48).toString();
			}
			ipSet['ip.cloak'] = `${hashIp(hrange).substring(0,8)}.${hashIp(qrange).substring(0,7)}.${hashIp(ipStr).substring(0,7)}.IP`;
		} catch (e) {
			//-1 old "iphashpermlevel" or bypass ids, just shorten them
			const shortenedOldHash = `${hashIp(ip).slice(-10)}.IP`;
			ipSet['ip.raw'] = shortenedOldHash;
			ipSet['ip.cloak'] = shortenedOldHash;
		}
		return {
			'updateMany': {
				'filter': {
					'ip.raw': ip
				},
				'update': {
					'$unset': {
						'ip.single': '',
						'ip.qrange': '',
						'ip.hrange': '',
					},
					'$set': ipSet,
				}
			}
		};
	});
	console.log('adjusting ip in modlogs, bans and posts');
	//the bulkwrites should work for ip, bans, and logs
	await db.collection('posts').bulkWrite(ipBulkWrites);
	await db.collection('modlog').bulkWrite(ipBulkWrites);
	await db.collection('bans').bulkWrite(ipBulkWrites);
	console.log('removing saved posts inside bans');
	await db.collection('bans').updateMany({}, {
		'$set':{
			'posts': null,
		}
	});
	console.log('clearing reports');
	await db.collection('posts').updateMany({}, {
		'$set':{
			'reports': [],
			'globalreports': [],
		}
	});
	//drop old ban indexes that indexed ip.single, then recreate
	console.log('recreating bans indexes');
	await db.collection('bans').dropIndexes();
	await db.collection('bans').createIndex({ 'ip.cloak': 1 , 'board': 1 });
	await db.collection('bans').createIndex({ 'expireAt': 1 }, { expireAfterSeconds: 0 });

// PERMISSIONS UPDATE
	console.log('making db changes for permissions update');
	console.log('setting new permission templates to replace old permission "levels"');
	const ANON = new Permission();
	ANON.setAll([
		Permissions.USE_MARKDOWN_PINKTEXT, Permissions.USE_MARKDOWN_GREENTEXT, Permissions.USE_MARKDOWN_BOLD,
		Permissions.USE_MARKDOWN_UNDERLINE, Permissions.USE_MARKDOWN_STRIKETHROUGH, Permissions.USE_MARKDOWN_TITLE,
		Permissions.USE_MARKDOWN_ITALIC, Permissions.USE_MARKDOWN_SPOILER, Permissions.USE_MARKDOWN_MONO,
		Permissions.USE_MARKDOWN_CODE, Permissions.USE_MARKDOWN_DETECTED, Permissions.USE_MARKDOWN_LINK,
		Permissions.USE_MARKDOWN_DICE, Permissions.USE_MARKDOWN_FORTUNE, Permissions.CREATE_BOARD,
		Permissions.CREATE_ACCOUNT
	]);
	const BOARD_STAFF = new Permission(ANON.base64);
	BOARD_STAFF.setAll([
		Permissions.MANAGE_BOARD_GENERAL, Permissions.MANAGE_BOARD_BANS, Permissions.MANAGE_BOARD_LOGS,
	]);
	const BOARD_OWNER = new Permission(BOARD_STAFF.base64);
	BOARD_OWNER.setAll([
		Permissions.MANAGE_BOARD_OWNER, Permissions.MANAGE_BOARD_STAFF, Permissions.MANAGE_BOARD_CUSTOMISATION,
		Permissions.MANAGE_BOARD_SETTINGS,
	]);
	const GLOBAL_STAFF = new Permission(BOARD_OWNER.base64);
	GLOBAL_STAFF.setAll([
		Permissions.MANAGE_GLOBAL_GENERAL, Permissions.MANAGE_GLOBAL_BANS, Permissions.MANAGE_GLOBAL_LOGS, Permissions.MANAGE_GLOBAL_NEWS,
		Permissions.MANAGE_GLOBAL_BOARDS, Permissions.MANAGE_GLOBAL_SETTINGS, Permissions.MANAGE_BOARD_OWNER, Permissions.BYPASS_FILTERS,
		Permissions.BYPASS_BANS, Permissions.BYPASS_SPAMCHECK, Permissions.BYPASS_RATELIMITS,
	]);
	const ADMIN = new Permission(GLOBAL_STAFF.base64);
	ADMIN.setAll([
		Permissions.MANAGE_GLOBAL_ACCOUNTS, Permissions.MANAGE_GLOBAL_ROLES, Permissions.VIEW_RAW_IP,
	]);
	const ROOT = new Permission();
	ROOT.setAll(Permission.allPermissions);
	await db.collection('roles').deleteMany({});
	await db.collection('roles').insertMany([
		{ name: 'ANON', permissions: Binary(ANON.array) },
		{ name: 'BOARD_STAFF', permissions: Binary(BOARD_STAFF.array) },
		{ name: 'BOARD_OWNER', permissions: Binary(BOARD_OWNER.array) },
		{ name: 'GLOBAL_STAFF', permissions: Binary(GLOBAL_STAFF.array) },
		{ name: 'ADMIN', permissions: Binary(ADMIN.array) },
		{ name: 'ROOT', permissions: Binary(ROOT.array) },
	]);
	await db.collection('accounts').updateMany({ authLevel: 0 }, {
		'$set': {
			'permissions': Binary(ROOT.array),
		},
	});
	await db.collection('accounts').updateMany({ authLevel: 1 }, {
		'$set': {
			'permissions': Binary(GLOBAL_STAFF.array),
		},
	});
	//not doing 2 and 3 anymore, since they were a weird, ugly part of the old "levels" system.
	//they can be added back manually by editing global perms if desired
	await db.collection('accounts').updateMany({ authLevel: { $gte: 2 } }, { //gte2, to get 2, 3, and 4.
		'$set': {
			'permissions': Binary(ANON.array),
		},
	});
	console.log('renaming account modBoards->staffBoards');
	await db.collection('accounts').updateMany({}, {
		'$unset': {
			'authLevel': '',
		},
		'$rename': {
			'modBoards': 'staffBoards',
		},
	});
	console.log('Adjusting global settings, and removing some redundant global settings that are now permission controlled');
	await db.collection('globalsettings').updateOne({ _id: 'globalsettings' }, {
		'$unset': {
			'userAccountCreation': '',
			'userBoardCreation': '',
			'ipHashPermLevel': '',
			'deleteBoardPermLevel': '',
		},
		'$set': {
			'dontStoreRawIps': false,
		}
	});
	//board moderators -> staff, and give them all the BOARD_STAFF perms
	console.log('converting old "moderators" arrays to "staff" perms map and giving BOARD_STAFF template');
	const allBoards = await db.collection('boards').find({ webring: false }).toArray();
	const staffBulkWrites = allBoards.map(board => {
		const staffObject = board.settings.moderators.reduce((acc, mod) => {
			acc[mod] = {
				permissions: Binary(BOARD_STAFF.array),
				addedDate: new Date(),
			};
			return acc;
		}, {});
		//add add the BO to staff
		staffObject[board.owner] = {
			permissions: Binary(BOARD_OWNER.array),
			addedDate: new Date(),
		};
		return {
			'updateOne': {
				'filter': {
					'_id': board._id,
				},
				'update': {
					'$unset': {
						'settings.moderators': '',
					},
					'$set': {
						'staff': staffObject,
					}
				}
			}
		};
	});
	await db.collection('boards').bulkWrite(staffBulkWrites);
	console.log('Clearing globalsettings cache');
	await redis.deletePattern('globalsettings');
	console.log('Clearing user and board cache');
	await redis.deletePattern('board:*');
	console.log('Deleting all sessions from redis (logs all users out)');
	await redis.deletePattern('sess:*');
	console.log('Deleting users cache');
	await redis.deletePattern('users:*');
};


code:
'use strict';

module.exports = async(db, redis) => {
	console.log('Adding tegaki sizes to globalsettings, and toggle option to board settings');
	await db.collection('globalsettings').updateOne({ _id: 'globalsettings' }, {
		'$set': {
			'frontendScriptDefault.tegakiWidth': 500,
			'frontendScriptDefault.tegakiHeight': 500,
			'boardDefaults.enableTegaki': true,
		},
	});
	await db.collection('boards').updateMany({
		'webring': false,
	}, {
		'$set':{
			'settings.enableTegaki': true,
		},
	});
	console.log('Clearing globalsettings cache');
	await redis.deletePattern('globalsettings');
	console.log('Clearing user and board cache');
	await redis.deletePattern('board:*');
};


code:
'use strict';

module.exports = async(db, redis) => {
	console.log('rename ban type -> range');
	await db.collection('bans').updateMany({}, {
		'$rename': {
			'type': 'range',
		},
	});

	console.log('change ban range from strings to number');
	await db.collection('bans').updateMany({
		'range': 'single'
	}, {
		'$set': {
			'range': 0,
		},
	});
	await db.collection('bans').updateMany({
		'range': 'quarter'
	}, {
		'$set': {
			'range': 1,
		},
	});
	await db.collection('bans').updateMany({
		'range': 'half'
	}, {
		'$set': {
			'range': 2,
		},
	});

	console.log('set new ban.type based on ip/bypass/pruned');
	await db.collection('bans').updateMany({
		'ip.cloak': /\.IP$/
	}, {
		'$set':{
			'type': 0,
		},
	});
	await db.collection('bans').updateMany({
		'ip.cloak': /\.BP$/
	}, {
		'$set':{
			'type': 1,
		},
	});
	await db.collection('bans').updateMany({
		'ip.cloak': /\.PRUNED$/
	}, {
		'$set':{
			'type': 2,
		},
	});

	console.log('Add options for adjusting hot threads to globalsettings');
	await db.collection('globalsettings').updateOne({ _id: 'globalsettings' }, {
		'$set': {
			'hotThreadsLimit': 5,
			'hotThreadsThreshold': 10,
		},
	});
	console.log('Clearing globalsettings cache');
	await redis.deletePattern('globalsettings');

};


code:
'use strict';

module.exports = async(db, redis) => {
	console.log('Add global wordfilter autoban non-appealable option');
	await db.collection('globalsettings').updateOne({ _id: 'globalsettings' }, {
		'$set': {
			'filterBanAppealable': true,
		},
	});
	console.log('Clearing globalsettings cache');
	await redis.deletePattern('globalsettings');
};


code:
'use strict';

module.exports = async(db, redis) => {

	console.log('unfucking any broken board tags');
	await db.collection('boards').updateMany({
		'webring': false,
		'tags': null,
	}, {
		'$set': {
			'tags': [], //null -> empty array, for broken boards
		}
	});
	console.log('Clearing globalsettings cache');
	await redis.deletePattern('globalsettings');
	console.log('Clearing board cache');
	await redis.deletePattern('board:*');

};


code:
'use strict';

module.exports = async(db) => {

	console.log('remove older phashes');
	await db.collection('posts').updateMany({}, {
		'$unset': {
			'files.$[].phash': ''
		}
	});

};