launchd

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
launchd
Тип Система инициализации системы
Автор Apple Inc.
Разработчик Apple
Написана на C
Операционная система macOS
Первый выпуск 29 апреля 2005
Состояние Поддерживается
Лицензия Apache License 2.0
Сайт opensource.apple.com/tar…

launchd — система инициализации в macOS с открытым исходным кодом, созданная для замены SysVinit и SystemStarter. Процесс launchd имеет PID 1 и занимается тем, что запускает другие процессы и перезапускает их в случае сбоя, то есть выполняет функции init (в новых версиях Linux systemd). Также он заменяет cron. Процессы, запускаемые после запуска системы до входа в систему, записываются в каталог /Library/LaunchDaemons. Процессы, запускаемые после входа в систему — в каталоге /Library/LaunchAgents. В этих каталогах создаются файлы с xml-содержимым, которые управляют запуском процессов. Были попытки портировать launchd для FreeBSD и производных систем.

Компоненты[править | править код]

В launchd есть две основные программы: launchd и launchctl.

launchd — управляет демонами как на уровне системы, так и на уровне пользователя. Как и xinetd, launchd может запускать демоны по требованию. Как и watchdogd, launchd может отслеживать демонов, чтобы убедиться, что они продолжают работать.

launchctl — это приложение командной строки, которое обращается к launchd с использованием IPC и знает, как анализировать файлы, используемые для описания запускаемых заданий, и сериализовывать их с использованием специализированного словарного протокола, который понимает launchd. launchctl может использоваться для загрузки и выгрузки демонов, запуска и остановки запускаемых контролируемых заданий, получения статистики использования системы для launchd и его дочерних процессов, а также для настройки параметров среды.

launchd[править | править код]

У launchd есть две основные задачи. Первый — это загрузить систему, а второй — загрузка и обслуживание сервисов. Вот упрощенный вид запуска системы Mac OS X Tiger на PowerPC.

  1. Open Firmware активирует, инициализирует оборудование, а затем загружает BootX.
  2. BootX загружает ядро, и загружает все необходимые расширения ядра (kexts).
  3. Ядро загружает launchd. launchd запускает различные скрипты, которые сканируют папку LaunchDaemons вызывая launchctl для инициализации демонов. Затем launchd запускает окно входа в систему.
  4. Сценарии запуска просматривают несколько разных каталогов для выполнения заданий. Сканируются два разных каталога: Каталоги LaunchDaemons содержат элементы, которые будут запускаться от имени пользователя root, обычно это фоновые процессы. Каталоги LaunchAgents содержат задания, называемые агентскими приложениями, которые будут запускаться от имени пользователя или в контексте пользовательского пространства. Это могут быть скрипты или другие элементы переднего плана, и они могут даже включать пользовательский интерфейс. Все эти каталоги хранятся в типичных каталогах библиотек macOS.

launchd сильно отличается от SystemStarter в том, что он может не запускать все демоны во время загрузки. Ключом к launchd, как и в xinetd, является запуск демонов по требованию. Когда launchctl просматривает списки заданий во время загрузки, он запрашивает launchd зарезервировать и прослушивать все порты, запрошенные этими заданиями. Если это указано в листе с помощью клавиши «OnDemand», в данный момент демон фактически не загружается. Скорее, launchd будет прослушивать порт, запускать демона при необходимости и выключать его, когда он больше не нужен. После загрузки демона launchd будет отслеживать его и при необходимости следить за тем, чтобы он работал. Таким образом, он похож на watchdogd и разделяет требование watchdogd о том, чтобы процессы не пытались разветвляться или демонизироваться самостоятельно. Если процесс уходит в фоновый режим, launchd потеряет его и попытается перезапустить его. Mac OS X Tiger, следовательно, загружается намного быстрее, чем предыдущие версии. Система только регистрирует демоны, которые должны работать, и фактически не запускает их, пока они не понадобятся. Фактически, индикатор выполнения, который появляется во время загрузки, является просто плацебо, названный WaitingForLoginWindow[1] который на самом деле не показывает ничего, кроме времени. Самая сложная часть для управления во время запуска launchd — это зависимости. SystemStarter имеет очень простую систему зависимостей, которая использует ключи «Использует», «Требуется» и «Предоставляет» в списке элементов запуска. При создании зависимостей для запуска на Tiger существует две основные стратегии: IPC позволяет демонам общаться между собой для выработки зависимостей, или демоны могут просматривать файлы или пути изменений. SystemStarter все еще поддерживался до OS X Mountain Lion, но был удален в OS X Yosemite.

launchctl[править | править код]

В launchd управление службами централизовано в приложении launchctl. Сам по себе launchctl может принимать команды из командной строки, из стандартного входа или работать в интерактивном режиме. С привилегиями суперпользователя, launchctl может использоваться для внесения изменений в глобальном масштабе. launchctl связывается с launchd через Mach-специфический механизм IPC.

Список свойств[править | править код]

Список свойств (plist) — это тип файла, который launchd использует для конфигурации программы. Когда launchd сканирует папку или задание отправляется с launchctl, он читает файл plist, который описывает, как программа должна быть запущена.

Список часто используемых ключей приведен ниже. Все ключи являются необязательными, если не указано иное. Полный список см. На странице руководства Apple для launchd.plist[2].


Ключи Тип Примечание
Label Строка Название работы. По соглашению, метка задания совпадает с именем файла plist, без расширения .plist. Необходим.
Program Строка Путь к исполняемому файлу. Полезно для простых запусков. Требуется хотя бы один ключ Program или ProgramArguments.
ProgramArguments Массив строк Массив строк, представляющих команду UNIX. Первая строка обычно представляет собой путь к исполняемому файлу, в то время как последние строки содержат опции или параметры. Требуется хотя бы один ключ Program или ProgramArguments.
UserName строка

(по умолчанию root или текущий пользователь)

Задание будет выполняться от имени данного пользователя, который может (или не может) быть пользователем, который отправил его на launchd.
OnDemand

(Устарело с 10.5)

логический

(по умолчанию ДА)

По состоянию на 10.5 устарел с более мощной опцией KeepAlive. Логический флаг, который определяет, выполняется ли задание непрерывно или нет.
RunAtLoad логический

(по умолчанию НЕТ)

Логический флаг, определяющий, запускается ли задача сразу после загрузки задания в launchd.
StartOnMount логический

(по умолчанию НЕТ)

Логический флаг, определяющий, запускается ли задача при монтировании новой файловой системы.
QueueDirectories Массив строк Смотрит каталог для новых файлов. Каталог должен быть пустым для начала и должен быть возвращен в пустое состояние, прежде чем QueueDirectories снова запустит свою задачу.
WatchPaths Массив строк Смотрит путь к файловой системе на изменения. Может быть файл или папка.
StartInterval целое число Планирует выполнение задания по повторяющемуся расписанию. Указывает количество секунд ожидания между запусками.
StartCalendarInterval Словарь целых чисел

или

Массив словарей целых чисел

Планирование работы. Синтаксис похож на Cron
RootDirectory Строка Задание будет помещено в этот каталог перед выполнением.
WorkingDirectory Строка Задание будет передано в этот каталог перед выполнением.

StandardInPath,
StandardOutPath,
StandardErrorPath

Строка Ключи для определения файлов для ввода и вывода для запущенного процесса.
LowPriorityIO логический Сообщает ядру, что эта задача имеет низкий приоритет при выполнении операций ввода-вывода файловой системы.
AbandonProcessGroup логический

(по умолчанию НЕТ)

Логический флаг, который определяет, будут ли подпроцессы, запущенные из задачи, запускаемой launchd, уничтожаться при завершении задачи. Полезно, когда недолговечное задание запускает долгоживущую подзадачу, но может привести к зомби-процессам.
SessionCreate логический

(по умолчанию НЕТ)

Логический флаг, который определяет, будет ли создан сеанс безопасности для задачи и ее подпроцессов.

Сокеты[править | править код]

Имя каждого ключа в разделе «Сокеты» будет помещено в среду задания при его запуске, а файловый дескриптор данного сокета будет доступен в этой переменной среды. Это отличается от активации сокета в systemd тем, что имя определения сокета внутри конфигурации задания жестко запрограммировано в приложении. Этот протокол менее гибок, хотя он, как и systemd, не требует, чтобы демон жестко закодировал начальный дескриптор файла (по состоянию на 2014 год он равен 3[3]).

История[править | править код]

Программное обеспечение было разработано и написано Дейвом Заржицким в Apple. Компания планировала заменить все следующее в среде macOS -

Большинство из этих вещей были отменены, когда launchd был представлен с Mac OS X v10.4 (Tiger).

В 2005 году R. Tyler Croy перенес запуск FreeBSD в рамках проекта Google Summer of Code. Он не может быть запущен как PID 1 (только инициализация сеанса), и на этой платформе он обычно не используется.[4]

В 2006 году дистрибутив Ubuntu Linux рассматривался с использованием launchd. Эта опция была отклонена, поскольку исходный код был под лицензией Apple Public License — описанной как «неизбежная проблема с лицензией»[5]. Вместо этого разработчики Ubuntu разработали и переключилась на собственный инструмент управления сервисами Upstart.

В августе 2006 года Apple повторно запустила launchd с лицензией Apache License версии 2.0, чтобы облегчить адаптацию других разработчиков с открытым исходным кодом[6]. Большинство дистрибутивов Linux используют systemd или Upstart, либо продолжают использовать Init, а BSD-подобные системы также продолжают использовать Init.

В декабре 2013 года Р. Тайлер Крой объявил о своем намерении возобновить работу над своей версией launchd для FreeBSD, и его репозиторий «openlaunchd» на Github впоследствии активизировался[7].

В 2014 году, начиная с OS X 10.10 и iOS 8, Apple переместила код для запуска в libxpc с закрытым исходным кодом[8] .

В августе 2015 года Джордан Хаббард и Кип Мэйси объявили о запуске NextBSD, который основан на ядре FreeBSD-CURRENT при добавлении в Mach IPC, Libdispatch, notifyd, asld, launchd и других компонентов, полученных из Darwin который состоит из открытого исходного кода для macOS.

История релизов launchd[править | править код]

Версии Лицензия Были включены в MacOS версии
launchd 106 Apple Public Source License[9]
launchd 106.3 Apple Public Source License[12]
  • Mac OS X 10.4.2[13]
  • Mac OS X 10.4.3[14]
  • Mac OS X 10.4.4.ppc[15]
  • Mac OS X 10.4.5.ppc[16]
launchd 106.10 Apple Public Source License[17]
  • Mac OS X 10.4.4.x86[18]
  • Mac OS X 10.4.5.x86[19]
launchd 106.13 Apple Public Source License[20]
  • Mac OS X 10.4.6.ppc[21]
  • Mac OS X 10.4.6.x86[22]
launchd 106.14 Apple Public Source License[23]
  • Mac OS X 10.4.7.ppc[24]
  • Mac OS X 10.4.7.x86[25]
  • Mac OS X 10.4.8.ppc[26]
  • Mac OS X 10.4.9.ppc[27]
  • Mac OS X 10.4.10.ppc[28]
  • Mac OS X 10.4.11.ppc[29]
launchd 106.20 Apple Public Source License[30]
  • Mac OS X 10.4.8.x86[31]
  • Mac OS X 10.4.9.x86[32]
  • Mac OS X 10.4.10.x86[33]
  • Mac OS X 10.4.11.x86[34]
launchd 152 Apache License 2.0[35]
launchd 257 Apache License 2.0[36]
launchd 258.1 Apache License 2.0[39]
launchd 258.12 Apache License 2.0[41]
launchd 258.18 Apache License 2.0[44]
launchd 258.19 Apache License 2.0[46]
launchd 258.22 Apache License 2.0[48]
launchd 258.25 Apache License 2.0[50]
launchd 328 Apache License 2.0[52]
launchd 329.3 Apache License 2.0[56]
launchd 329.3.1 Apache License 2.0[58]
launchd 329.3.2 Apache License 2.0[60]
launchd 329.3.3 Apache License 2.0[62]
launchd 392.18 Apache License 2.0[66]
launchd 392.35 Apache License 2.0[69]
launchd 392.36 Apache License 2.0[71]
launchd 392.38 Apache License 2.0[73]
launchd 392.39 Apache License 2.0[75]
launchd 442.21 Apache License 2.0[77]
launchd 442.26.2 Apache License 2.0[80]
launchd 842.1.4 Apache License 2.0[85]
launchd 842.90.1 Apache License 2.0[88]
launchd 842.92.1 Apache License 2.0[91]

См. также[править | править код]

Ссылки[править | править код]

Примечания[править | править код]

  1. http://daringfireball.net/misc/2005/04/tiger_details#waitingforloginwindow Архивная копия от 23 апреля 2007 на Wayback Machine Daring Fireball: Tiger Details
  2. Mac OS X Manual Page For launchd.plist(5). Дата обращения: 15 декабря 2019. Архивировано 26 августа 2009 года.
  3. little-big-h. node-launchd. Дата обращения: 10 апреля 2014. Архивировано 13 апреля 2014 года.
  4. Launchd. FreeBSD wiki. Дата обращения: 8 декабря 2013. Архивировано 14 декабря 2013 года.
  5. ReplacementInit. UbuntuWiki. Дата обращения: 2 июля 2007. Архивировано 4 июня 2011 года.
  6. Prabhakar, Ernest Apple Opens Up: Kernel, Mac OS Forge, iCal Server, Bonjour, Launchd (7 августа 2006). Дата обращения: 2 июля 2007. Архивировано из оригинала 20 августа 2011 года.
  7. Croy, R Tyler The scratchiest neckbeard, or FreeBSD on my Thinkpad X200. unethicalblogger.com. Дата обращения: 8 декабря 2013. Архивировано 13 декабря 2013 года.
  8. Levin, Jonathan Launchd – At Your Service! (PDF) 32 (2014). — «… 10.10: moved to libxpc 559 (560 in iOS 8) – Source not available yet – and may not ever be – Libxpc is a closed source project …» Дата обращения: 3 сентября 2016. Архивировано 7 февраля 2016 года.
  9. launchd 106 license file. Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
  10. Mac OS X 10.4 - Source. Дата обращения: 13 декабря 2019. Архивировано 21 сентября 2020 года.
  11. Mac OS X 10.4.1 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  12. launchd 106.3 license file. Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
  13. Mac OS X 10.4.2 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  14. Mac OS X 10.4.3 - Source. Дата обращения: 13 декабря 2019. Архивировано 21 сентября 2020 года.
  15. Mac OS X 10.4.4.ppc - Source. Дата обращения: 13 декабря 2019. Архивировано 17 октября 2020 года.
  16. Mac OS X 10.4.5.ppc - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  17. launchd 106.10 license file. Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
  18. Mac OS X 10.4.4.x86 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  19. Mac OS X 10.4.5.x86 - Source. Дата обращения: 13 декабря 2019. Архивировано 21 сентября 2020 года.
  20. launchd 106.13 license file. Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
  21. Mac OS X 10.4.6.ppc - Source. Дата обращения: 13 декабря 2019. Архивировано 10 октября 2020 года.
  22. Mac OS X 10.4.6.x86 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  23. launchd 106.14 license file. Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
  24. Mac OS X 10.4.7.ppc - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  25. Mac OS X 10.4.7.x86 - Source. Дата обращения: 13 декабря 2019. Архивировано 21 сентября 2020 года.
  26. Mac OS X 10.4.8.ppc - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  27. Mac OS X 10.4.9.ppc - Source. Дата обращения: 13 декабря 2019. Архивировано 21 сентября 2020 года.
  28. Mac OS X 10.4.10.ppc - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  29. Mac OS X 10.4.11.ppc - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  30. launchd 106.20 license file. Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
  31. Mac OS X 10.4.8.x86 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  32. Mac OS X 10.4.9.x86 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  33. Mac OS X 10.4.10.x86 - Source. Дата обращения: 13 декабря 2019. Архивировано 21 сентября 2020 года.
  34. Mac OS X 10.4.11.x86 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  35. launchd 152 license file. Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
  36. launchd 257 license file. Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
  37. Mac OS X 10.5 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  38. Mac OS X 10.5.1 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  39. launchd 258.1 license file. Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
  40. Mac OS X 10.5.2 - Source. Дата обращения: 13 декабря 2019. Архивировано 21 сентября 2020 года.
  41. launchd 258.12 license file. Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
  42. Mac OS X 10.5.3 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  43. Mac OS X 10.5.4 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  44. launchd 258.18 license file. Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
  45. Mac OS X 10.5.5 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  46. launchd 258.19 license file. Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
  47. Mac OS X 10.5.6 - Source. Дата обращения: 13 декабря 2019. Архивировано 21 сентября 2020 года.
  48. launchd 258.22 license file. Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
  49. Mac OS X 10.5.7 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  50. launchd 258.25 license file. Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
  51. Mac OS X 10.5.8 - Source. Дата обращения: 13 декабря 2019. Архивировано 11 октября 2019 года.
  52. launchd 328 license file. Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
  53. Mac OS X 10.6 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  54. Mac OS X 10.6.1 - Source. Дата обращения: 13 декабря 2019. Архивировано 21 сентября 2020 года.
  55. Mac OS X 10.6.2 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  56. launchd 329.3 license file. Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
  57. Mac OS X 10.6.3 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  58. launchd 329.3.1 license file. Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
  59. Mac OS X 10.6.4 - Source. Дата обращения: 13 декабря 2019. Архивировано 21 сентября 2020 года.
  60. launchd 329.3.2 license file. Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
  61. Mac OS X 10.6.5 - Source. Дата обращения: 13 декабря 2019. Архивировано 21 сентября 2020 года.
  62. launchd 329.3.3 license file. Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
  63. Mac OS X 10.6.6 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  64. Mac OS X 10.6.7 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  65. Mac OS X 10.6.8 - Source. Дата обращения: 13 декабря 2019. Архивировано 21 сентября 2020 года.
  66. launchd 392.18 license file. Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
  67. Mac OS X 10.7 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  68. Mac OS X 10.7.1 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  69. launchd 392.35 license file. Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
  70. Mac OS X 10.7.2 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  71. launchd 392.36 license file. Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
  72. Mac OS X 10.7.3 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  73. launchd 392.38 license file. Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
  74. Mac OS X 10.7.4 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  75. launchd 392.39 license file. Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
  76. Mac OS X 10.7.5 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  77. licence header in launchd 442.21 source code. Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
  78. Mac OS X 10.8 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  79. Mac OS X 10.8.1 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  80. license header in launchd 442.26.2 source code. Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
  81. Mac OS X 10.8.2 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  82. Mac OS X 10.8.3 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  83. Mac OS X 10.8.4 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  84. Mac OS X 10.8.5 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  85. license header in launchd 842.1.4 source code. Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
  86. OS X 10.9 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  87. OS X 10.9.1 - Source. Дата обращения: 13 декабря 2019. Архивировано 21 сентября 2020 года.
  88. license header in launchd 842.90.1 source code. Дата обращения: 13 декабря 2019. Архивировано 13 декабря 2019 года.
  89. OS X 10.9.2 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  90. OS X 10.9.3 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.
  91. license header in launchd 842.92.1 source code. Дата обращения: 13 декабря 2019. Архивировано 24 сентября 2018 года.
  92. OS X 10.9.4 - Source. Дата обращения: 13 декабря 2019. Архивировано 21 сентября 2020 года.
  93. OS X 10.9.5 - Source. Дата обращения: 13 декабря 2019. Архивировано 20 октября 2020 года.