diff --git a/ru_RU.KOI8-R/books/design-44bsd/Makefile b/ru_RU.KOI8-R/books/design-44bsd/Makefile new file mode 100644 index 0000000000..102212b4ab --- /dev/null +++ b/ru_RU.KOI8-R/books/design-44bsd/Makefile @@ -0,0 +1,24 @@ +# +# $FreeBSD$ +# $FreeBSDru: frdp/doc/ru_RU.KOI8-R/books/design-44bsd/Makefile,v 1.2 2001/07/25 10:37:21 phantom Exp $ +# +# Original revision: 1.2 + +DOC?= book + +FORMATS?= html + +IMAGES= fig1.eps fig2.eps + +INSTALL_COMPRESSED?=gz +INSTALL_ONLY_COMPRESSED?= + +SRCS= book.sgml + +# Use the local DSSSL file +DSLHTML?= ${.CURDIR}/freebsd.dsl +DSLPRINT?= ${.CURDIR}/freebsd.dsl + +DOC_PREFIX?= ${.CURDIR}/../../.. + +.include "${DOC_PREFIX}/share/mk/doc.project.mk" diff --git a/ru_RU.KOI8-R/books/design-44bsd/book.sgml b/ru_RU.KOI8-R/books/design-44bsd/book.sgml new file mode 100644 index 0000000000..e80bb2423a --- /dev/null +++ b/ru_RU.KOI8-R/books/design-44bsd/book.sgml @@ -0,0 +1,2398 @@ + + + +%man; +]> + + + + Архитектура и реализация операционной системы 4.4BSD + + + + Marshall + Kirk + McKusick + + + + Keith + Bostic + + + + Michael + J. + Karels + + + + John + S. + Quarterman + + + + + 1996 + Addison-Wesley Longman, Inc + + + + 2001 + Перевод на русский язык: Андрей Захватов + + + + + + Вторая глава книги Архитектура и реализация + Операционной Системы 4.4BSD представлена здесь с + разрешения издателя. Никакая из частей этого текста не может + воспроизводится, либо распространятся без письменного + разрешения + издателя. Оставшаяся + часть + книги очень подробно исследует и раскрывает концепции + представленные в этой главе и является прекрасным материалом для + всех кто интересуется BSD UNIX. Более подробную информацию об этой + книге Вы можете получить от издателя, у которого Вы также можете + подписатся на получение новостей о + подобных книгах. + Информация о Курсах о + BSD доступна у Кирка МакКусика. + + + + + Обзор архитектуры 4.4BSD + + + Системные сервисы 4.4BSD и ядро + + Ядро 4.4BSD предоставляет четыре основных системных сервиса: + процессы, файловую систему, коммуникации и запуск системы. Этот раздел + перечисляет, в каком месте этой книги описана каждая из этих + служб. + + + + Процессы образуют поток управления в адресном пространстве. + Механизмы создания, завершения и другие управляющие процессы + описаны в Главе 4. Для каждого процесса система мультиплексирует + отдельное виртуальное адресное пространство; такое управление + памятью обсуждается в Главе 5. + + + + Механизм доступа пользователя к файловой системе и устройствам + один и тот же; общие аспекты обсуждаются в Главе 6. Файловая + система является набором именованных файлов, организованных в + древовидную иерархию каталогов, а операции по управлению ими + представлены в Главе 7. Файлы располагаются на таких физических + носителях, как диски. 4.4BSD поддерживает несколько типов + организации данных на диске, как описано далее в Главе 8. Доступ к + файлам на удаленных машинах является предметом обсуждения в Главе + 9. Для доступа к системе Терминалы используются терминалы; их + функционированию посвящена глава 10. + + + + Механизмы коммуникаций, предоставляемые традиционными + UNIX-системами, включают однонаправленные потоки байтов между + связанными процессами (смотрите материал о конвейерах в Разделе + 11.1) и извещение об исключительных событиях (смотрите материал о + сигналах в Разделе 4.7). В 4.4BSD имеется также механизм + межпроцессного взаимодействия между процессами. Этот механизм, + описываемый в Главе 11, использует способы доступа, отличающиеся от + тех, что используются в файловой системе, но, как только соединение + установлено, процесс может работать с ним, как будто это конвейер. + Имеется и механизм работы с сетью, описываемый в Главе 12, который + обычно используется как слой ниже механизма IPC. В Главе 13 дается + детальное описание конкретной реализации механизма работы с + сетью. + + + + В любой операционной системе присутствуют вопросы управления, + такие, как ее запуск. Запуск и вопросы управления обсуждаются в + Главе 14. + + + + Разделы с 2.3 по 2.14 представляют собой вводный материал, + относящийся к главам с 3 по 14. Мы определим понятия, коснемся + основных системных вызовов и рассмотрим исторические разработки. + Наконец, мы расскажем о причинах многих ключевых архитектурных + решений. + + + Ядро + + Ядро является частью системы, которая + работает в защищенном режиме и управляет доступом всех + пользовательских программ к низкоуровнему аппаратному обеспечению + (к примеру, ЦПУ, дискам, терминалам, сетевым связям) и программным + компонентам (к примеру, файловой системе, сетевым протоколам). Ядро + предоставляет основные системные услуги; оно создает процессы и + управляет ими, предоставляет функции для доступа к файловой системе + и службам связи. Такие функции, называемые системными + вызовами, доступны процессам пользователей в виде + библиотечных подпрограмм. Эти системные вызовы являются единственным + способом доступа к таким услугам. Подробно механизм работы системных + вызовов дается в Главе 3, вместе с описанием некоторых механизмов + ядра, работа которых не является прямым результатом процесса, + выполняющего системный вызов. + + Ядро, по традиционной терминологии + операционных систем, является маленьким куском программного + обеспечения, которое предоставляет только минимальный набор услуг, + необходимый для реализации дополнительных служб операционной системы. + В современных исследовательских операционных системах -- таких, как + Chorus , Mach , Tunis , и + V Kernel -- такое разделение + функциональности выполнено не только логически. Такие службы, как + файловые системы и сетевые протоколы, выполнены в виде прикладных + процессов клиентов ядра или микроядра. + + Ядро 4.4BSD не разбивается на несколько процессов. Это + основополагающее архитектурное решение было сделано в самых ранних + версиях UNIX. В первых двух реализациях Кена Томпсона (Ken Thompson) + не было отображаемой памяти, и поэтому не было аппаратного различия + между адресным пространством пользователя и ядра . Могла бы быть придумана система обмена + сообщениями как реально реализуемая модель процессов ядра и + пользователя. Для простоты и увеличения производительности было + выбрано монолитное ядро. К тому же ранние ядра были маленькими; + включение таких служб, как сетевые коммуникации, в ядро увеличило его + размер. Современные тенденции в области операционных систем сводятся + к уменьшению размера ядра за счет перевода таких служб в + пользовательское адресное пространство. + + Пользователи обычно общаются с системой через интерпретатор языка + команд, называемый оболочкой (shell), и, может + быть, через дополнительные прикладные пользовательские программы. + Такие программы и оболочка реализованы в виде процессов. Подробное + описание таких программ выходит за рамки этой книги, которая + практически полностью посвящена работе ядра. + + В разделах 2.3 и 2.4 описываются сервисы, предоставляемые ядром + 4.4BSD, и дается обзор их архитектуры. Последующие главы описывают + подробности архитектуры и реализации этих сервисов в 4.4BSD. + + + + + Организация ядра + + В этом разделе мы рассматриваем организацию ядра 4.4BSD с двух + точек зрения: + + + + Как статический блок программного обеспечения, категоризуемый + по функциональности модулей, составляющих ядро + + + + В его динамике, категоризуемой по услугам, предоставляемым + пользователям + + + + Самая большая часть ядра реализует системные услуги, к которым + приложения обращаются через системные вызовы. В 4.4BSD это программное + обеспечение организуется по следующим принципам: + + + + Базовые услуги ядра: обработка таймеров и системного таймера, + управление дескрипторами и процессами + + + + Поддержка управления памятью: подкачка и выгрузка + + + + Общесистемные интерфейсы: ввод/вывод, управление и + мультиплексирование операций, выполняемых над дескрипторами + + + + Файловая система: файлы, каталоги, преобразование маршрутов, + блокировка файлов и управление буфером ввода/вывода + + + + Поддержка работы с терминалами: драйвер терминального + интерфейса и режимы работы терминального канала + + + + Службы межпроцессного взаимодействия: сокеты + + + + Поддержка сетевых коммуникаций: коммуникационные протоколы и + общесетевые службы, такие, как маршрутизация + + + + + Машинно-независимое программное обеспечение в ядре 4.4BSD + + + + Категория + Количество строк кода + Процент от всего ядра + + + + + + всего машинно-независимая часть + 162,617 + 80.4 + + + + + + файлы заголовков + 9,393 + 4.6 + + + + инициализация + 1,107 + 0.6 + + + + службы ядра + 8,793 + 4.4 + + + + общесистемные интерфейсы + 4,782 + 2.4 + + + + межпроцессное взаимодействие + 4,540 + 2.2 + + + + работа с терминалами + 3,911 + 1.9 + + + + виртуальная память + 11,813 + 5.8 + + + + управление vnode + 7,954 + 3.9 + + + + именование файловой системы + 6,550 + 3.2 + + + + хранение файлов + 4,365 + 2.2 + + + + хранение log-структур + 4,337 + 2.1 + + + + хранение на основе памяти + 645 + 0.3 + + + + файловая система cd9660 + 4,177 + 2.1 + + + + различные файловые системы (10) + 12,695 + 6.3 + + + + сетевая файловая система + 17,199 + 8.5 + + + + сетевое взаимодействие + 8,630 + 4.3 + + + + протоколы internet + 11,984 + 5.9 + + + + протоколы ISO + 23,924 + 11.8 + + + + протоколы X.25 + 10,626 + 5.3 + + + + протоколы XNS + 5,192 + 2.6 + + + +
+ + Большая часть программного обеспечения в этих категориях является + машинно-независимой и переносима между различными аппаратными + архитектурами. + + Машинно-зависимые аспекты ядра отделены от основного кода. В + частности, ни в одной части машинно-независимого кода не содержится + кода, зависимого от конкретной архитектуры. Когда требуется произвести + действия, зависимые от архитектуры, машинно-независимый код вызывает + функцию, зависимую от архитектуры машины, которая находится в + машинно-зависимой части кода. Машинно-зависимое программное + обеспечение включает в себя + + + + Низкоуровневые действия по запуску системы + + + + Обработка исключительных ситуаций и прерываний + + + + Низкоуровневые манипуляции процессом во время работы + + + + Конфигурация и инициализация аппаратных устройств + + + + Поддержка устройств ввода/вывода во время работы + + + + + Машинно-зависимое программное обеспечение для HP300 в ядре + 4.4BSD + + + + + Категория + Количество строк кода + Процент от всего ядра + + + + + + всего машинно-зависимая часть + 39,634 + 19.6 + + + + + + машинно-зависимые заголовки + 1,562 + 0.8 + + + + заголовки драйверов устройств + 3,495 + 1.7 + + + + исходные тексты драйверов устройств + 17,506 + 8.7 + + + + виртуальная память + 3,087 + 1.5 + + + + остальная машинно-зависимая часть + 6,287 + 3.1 + + + + процедуры на ассемблере + 3,014 + 1.5 + + + + совместимость с HP/UX + 4,683 + 2.3 + + + +
+ + суммаризует машинно-независимый + код, который составляет ядро 4.4BSD для HP300. Числа во второй колонке + обозначают количество строк исходного кода на языке C, заголовочных + файлов и ассемблерного кода. Практически весь код ядра написан на + языке программирования C; менее двух процентов написано на языке + ассемблера. Как показывает статистика в , машинно-зависимый код, не включающий + поддержку HP/UX и устройств, составляет менее 6.9 процента ядра. + + Лишь малая часть ядра отвечает за инициализацию системы. Этот код + используется при начальной загрузке системы для + перехода в рабочий режим и отвечает за настройку аппаратного и + программного окружения ядра (обратитесь к Главе 14). Некоторые + операционные системы (особенно те, что ограничены объемом физической + памяти) выполняют действия по выгрузке или + перекрытию программного кода, выполняющего эти + функции, после окончания его работы. Ядро 4.4BSD не работает повторно + с памятью, использованной начальным кодом, потому что этот объем памяти + составляет менее 0.5 процентов ресурсов ядра, используемых на типичной + машине. Также начальный код не находится только в одном месте ядра -- + он рассредоточен везде, и обычно появляется там, где логически связан с + объектом инициализации. +
+ + + Службы ядра + + Разграничение между кодом уровней ядра и пользователя + обеспечивается аппаратными методами, предоставляемыми оборудованием. + Ядро работает в отдельном адресном пространстве, которое недоступно + процессам пользователя. Привилегированные операции -- такие, как + осуществление ввода/вывода и остановка модуля центрального процессора + (CPU) -- доступны только ядру. Приложения делают запросы ядру на + доступ к его сервисам при помощи системных + вызовов. Системные вызовы используются для указания ядру на + выполнение как сложных операций, таких, как запись данных во вторичный + носитель, так и простых, таких, как получение текущего времени. Все + системные вызовы выполняются синхронно с + приложением: Приложение не будет продолжать работу, пока ядро не + выполнит действия, соответствующие системному вызову. Ядро может + завершить некоторые операции, связанные с системным вызовом, после его + окончания. Например, системный вызов write + будет копировать записываемые данные от пользовательского процесса в + буфер ядра, пока процесс находится в ожидании, но, как правило, будет + немедленно завершаться до того, как буфер ядра реально будет записан на + диск. + + Системный вызов обычно реализуется как аппаратное прерывание, + которое изменяет режим работы CPU и текущее отображение адресного + пространства. Параметры, передаваемые пользователями системным + вызовам, перед использованием проверяются ядром. Такая проверка + обеспечивает целостность системы. Все параметры, передаваемые в ядро, + копируются в адресное пространство ядра, для того, чтобы проверенные + параметры не могли быть изменены в результате побочного действия + системного вызова. Результаты выполнения системного вызова + возвращаются ядром либо в аппаратных регистрах, либо копированием их + значений в области памяти, указанные пользователем. Как и параметры, + переданные в ядро, адреса, используемые для возвращения результатов, + должны быть проверены на то, что они являются частью адресного + пространства приложения. Если при обработке системного вызова ядром + возникает ошибка, код ошибки возвращается пользователю. В случае + языка программирования C код этой ошибки сохраняется в глобальной + переменной errno, а функция, соответствующая + системному вызову, возвращает в качестве результата значение -1. + + Пользовательские приложения и ядро работают независимо друг от + друга. 4.4BSD не хранит управляющие блоки ввода/вывода и другие + связанные с операционной системой структуры данных в адресном + пространстве приложения. Каждому пользовательскому приложению + предоставляется независимое адресное пространство, в котором оно и + выполняется. Ядро выполняет большинство управляющих действий, таких, + как приостановка процесса на время выполнения другого, незаметно для + участвующих процессов. + + + + Управление процессами + + 4.4BSD поддерживает многозадачность. Каждая задача или + выполняющийся поток называется процессом. + Контекст процесса 4.4BSD состоит из состояния + пользовательского уровня, включая содержимое его адресного + пространства и окружения времени выполнения, и состояния уровня ядра, + в который включаются параметры планировщика задач, управляющие ресурсы + и идентифицирующая информация. В контекст включается все, что + используется ядром при предоставлении своих сервисов процессу. + Пользователи могут создавать процессы, управлять их выполнением и + получать уведомления при изменении состояния выполнения процессов. + Каждому процессу назначается уникальное число, называемое + идентификатором процесса (PID). Это число + используется ядром для идентификации процесса при сообщении + пользователю об изменении его состояния, и пользователем для указания + процесса в системном вызове. + + Ядро создает процесс, дублируя контекст другого процесса. Новый + процесс считается порожденным процессом исходного + родительского процесса. Контекст, копируемый в + ходе создания процесса, включает как состояние выполнения процесса + уровня пользователя, так и системное состояние процесса, управляемое + ядром. Важные компоненты состояния ядра описаны в Главе 4. + +
+ Жизненный цикл процесса + + + + + + + + ++----------------+ wait +----------------+ +| parent process |--------------------------------->| parent process |---> ++----------------+ +----------------+ + | ^ + | fork | + V | ++----------------+ execve +----------------+ wait +----------------+ +| child process |------->| child process |------->| zombie process | ++----------------+ +----------------+ +----------------+ + + + + + Системные вызовы управления процессами + + +
+ + Жизненный цикл процесса изображен на . Процесс может создать новый процесс, + который является копией исходного процесса с помощью системного вызова + fork. Возврат из вызова fork + происходит два раза: один раз в родительском процессе, в котором + возвращаемое значение является идентификатором порожденного процесса, и + второй раз в порожденном процессе, в котором возвращаемое значение + равно 0. Связь родитель-потомок порождает иерархическую структуру + процессов в системе. Новый процесс имеет доступ ко всем ресурсам его + родителя, таким, как файловые дескрипторы, состояние обработки + сигналов и распределение памяти. + + Хотя есть ситуации, когда процесс должен быть копией своего + родителя, наиболее типичным и полезным действием является загрузка и + выполнение другой программы. Процесс может заместить себя образом + памяти другой программы, передавая вновь созданному образу набор + параметров, при помощи системного вызова execve. + Одним из параметров является имя файла, содержимое которого имеет + формате, распознаваемый системой -- это либо двоичный выполняемый файл, + либо файл, который приводит к запуску указанной программы интерпретации + для обработки его содержимого. + + Процесс может завершить работу, выполнив системный вызов + exit, посылающий 8-битовое значение состояния + завершения своему родителю. Если процесс хочет передать родительскому + процессу информацию, превышающую один байт, он должен либо создать + канал межпроцессных коммуникаций при помощи конвейеров или сокетов, + или при помощи промежуточного файла. Коммуникации между процессами + подробно обсуждаются в Главе 11. + + Процесс может приостановить выполнение до тех пор, пока не завершит + работу любой из порожденных им процессов, при помощи системного вызова + wait, который возвращает PID и статус завершения + выполненного сыновьего процесса. Родительский процесс может быть + настроен на получение сигнала в случае, когда порожденный процесс + завершает работу или аварийно прекращает выполнение. При помощи + системного вызова wait4 родитель может получить + информацию о событии, приведшем к завершению порожденного процесса и о + ресурсах, использованных процессом за время его работы. Если процесс + становится сиротой из-за того, что процесс, его породивший, завершил + работу до окончания работы потомка, то ядро перенаправляет состояние + завершения порожденного процесса особому системному процессу + + init: обратитесь к разделам 3.1 и 14.6). + + Подробное описание того, как ядро создает и уничтожает процессы, + дается в Главе 5. + + Планирование выполнения процессов осуществляется согласно параметру + приоритетности процесса. Этот приоритет + управляется алгоритмом планирования задач в ядре. Пользователи могут + влиять на выполнение процесса, задавая этот параметр + (nice), который влияет на суммарный приоритет, но + но ограничен использованием ресурсов CPU согласно алгоритму + планировщика задач ядра. + + + Сигналы + + В системе определен набор сигналов, которые + могут быть отправлены процессу. Сигналы в 4.4BSD сделаны по образу + аппаратных прерываний. Процесс может определить пользовательскую + подпрограмму, которая будет являться + обработчиком, и которой должен будет + перенаправляться сигнал. Когда сигнал генерируется, он блокируется + от повторного появления до тех пор, пока не будет + перехвачен обработчиком. Перехват сигнала + включает в себя сохранение контекста текущего процесса и построение + нового, в котором запускается обработчик. Затем сигнал направляется + обработчику, который может либо прервать процесс, либо передать + управление обратно выполняемому процессу (может быть, после установки + значения глобальной переменной). Если обработчик возвратил + управление, сигнал разблокировывается и может быть сгенерирован (и + получен) снова. + + Либо процесс может определить, что сигнал будет + игнорироваться или будет выполняться действие + по умолчанию, определяемое ядром. Действием по умолчанию для + некоторых сигналов является прекращение процесса. Это завершение + работы может сопровождаться созданием файла + дампа, содержащего текущий образ памяти процесса для + использования в последующей отладке. + + Некоторые сигналы не могут быть перехвачены или проигнорированы. + К таким сигналам относятся SIGKILL, прерывающий + неуправляемый процесс, и сигнал управления заданиями + SIGSTOP. + + Процесс может выбрать получение сигналов в специальный стек для + выполнения хитроумных программных манипуляций стеком. Например, + подпрограммам поддержки языка нужно иметь стек для каждой + подпрограммы. Система времени выполнения языка может выделять эти + стеки, разделяя единственный стек, предоставляемый в 4.4BSD. Если + ядро не поддерживает отдельный стек сигналов, то пространство, + выделяемое каждой подпрограмме, должно быть расширено на объем, + требуемый для перехвата сигнала. + + Все сигналы имеют один и тот же приоритет. + Если обработки ожидают несколько сигналов, то порядок их направления + процессу зависит от реализации. Обработчики сигналов, выполняемые по + сигналу, который их вызвал, блокируются, но при этом могут быть + сгенерированы дополнительные сигналы. Имеется механизм, позволяющий + защитить критический участок кода от появления заданных + сигналов. + + Подробное описание архитектуры и реализации механизма сигналов + дается в Разделе 4.7. + + + + Группы управления и сеансы + + Процессы организованы в группы управления. + Группы управления используются для управления доступом к терминалам и + для обеспечения передачи сигналов наборам связанных процессов. + Процесс наследует группу управления от своего родительского процесса. + Ядром обеспечиваются механизмы, позволяющие процессу изменять свою + группу управления или группу управления своих наследников. Создание + новой группы управления просто; значение, соответствующее новой + группе управления, обычно является идентификатором создающего ее + процесса. + + Группу процессов в группе управления иногда называют + заданием и оно управляется высокоуровневым + системным программным обеспечением, таким, как командный процессор. + Типичным примером задания, созданного командным процессором, является + конвейер из нескольких связанных процессов, так + что выходной поток первого процесса является входным потоком для + второго, выходной поток второго процесса является входным потоком для + третьего, и так далее. Командный процессор создает такое задание, + порождая процесс для каждого участка конвейера, а затем помещая все + эти процессы в отдельную группу обработки. + + Пользовательский процесс может послать сигнал как всем процессам + в группе управления, так и конкретному процессу. Процесс в заданной + группе управления может получать программные прерывания, отражающиеся + на группе, приводящие к приостановке или продолжению выполнения, или + к прерыванию или завершению работы. + + Терминалу ставится в соответствие идентификатор группы + управления. Этот идентификатор обычно равен идентификатору группы + управления, соответствующей терминалу. Управляющий заданиями + командный процессор может создать несколько групп управления, + связанных с одним и тем же терминалом; терминал является + управляющим терминалом для каждого процесса в + этих группах. Процесс может выполнять чтение из дескриптора своего + управляющего терминала, если только идентификатор группы управления + соответствует идентификатору группы этого процесса. Если + идентификаторы не совпадают, процесс будет блокирован при попытке + чтения с терминала. Изменяя идентификатор группы управления + терминала, командный процессор может распределять терминал между + несколькими различными заданиями. Такое распределение называется + управлением заданиями и описывается вместе с + группами управления в Разделе 4.8. + + Так же, как и наборы связанных процессов могут объединяться в + группы управления, набор групп управления может быть объединен в + сеанс. Основное назначение сеансов заключается + создании изолированного окружения для процесса-даемона и порожденных + им процессов, а также для объединения начального командного + процессора пользователя и заданий, которые он порождает. + +
+ + + Управление памятью + + Каждый процесс имеет собственное адресное пространство. Адресное + пространство изначально разделяется на три логических сегмента: + код, данные и + стек. Сегмент кода доступен только для + чтения и содержит машинные коды программы. Сегменты данных и стека оба + доступны как для чтения, так и для записи. Сегмент данных содержит как + инициализированные, так и неинициализированные области данных + программы, когда как стековый сегмент представляет собой стек программы + на этапе выполнения. На большинстве машин сегмент стека автоматически + расширяется ядром в процессе работы программы. Процесс может расширять + или уменьшать свой сегмент данных, выполняя системный вызов, когда как + размер сегмента кода процесс может изменить только когда содержимое + сегмента перекрывается данными файловой системы или в процессе отладки. + Начальное содержимое сегментов порожденного процесса копируется из + сегментов родительского процесса. + + Для выполнения процесса вовсе не обязательно постоянно хранить в + памяти полное содержимое его адресного пространства. Если процесс + обращается к области адресного пространства, которая не присутствует в + оперативной памяти, то система подгружает страницу + с необходимой информацией в память. Когда возникает нехватка системных + ресурсов, то система использует двухуровневый подход к управлению + имеющимися ресурсами. Если не хватает памяти, то система будет + забирать ресурсы памяти от процессов, если они давно не использовались. + Если ресурсов не хватает очень сильно, то система будет прибегать + к выгрузке всего контекста процесса во вторичную + подсистему хранения данных. Постраничная подгрузка по + требованию и выгрузка выполняются + системой абсолютно незаметно для процессов. Процесс может, однако, + указать системе объем памяти, который будет использоваться, в качестве + помощи. + + + Решения BSD по архитектуре управления памятью + + В 4.2BSD требовалось реализовать поддержку больших несвязанных + адресных пространств, отображаемых в память файлов и совместно + используемой памяти. Был спроектирован интерфейс, который назвали + mmap, позволяющий несвязанным процессам + запрашивать отображение в их адресное пространство файла в режиме + совместного использования. Если несколько процессов отображают в + свое адресное пространство один и тот же файл, то изменение адресного + пространства процесса, соответствующего файлу, в одном процессе, + будет отображено в области отображения этого файла в другом процессе, + а также и в самом файле. Однако в конце концов 4.2BSD была выпущена + без интерфейса mmap из-за необходимости сделать + в первую очередь другие возможности, такие, как работа с + сетью. + + Затем разработка интерфейса mmap + продолжалась во время работы над 4.3BSD. Более 40 компаний и + исследовательских групп принимали участие в обсуждениях, которые + привели к появлению обновленной концепции, описанной в Berkeley + Software Architecture Manual . + Несколько компаний реализовали этот обновленный интерфейс + . + + И снова сроки разработки не позволили включить в 4.3BSD + реализацию этого интерфейса. Хотя позже она могла быть встроена в + имеющуюся подсистему виртуальной памяти 4.3BSD, разработчики решили + не включать ее сюда. потому что этой реализации было уже более 10 + лет. Более того, оригинальная архитектура виртуальной памяти была + основана на предположении, что компьютерная память мала и дорога, а + диски подключены непосредственно к компьютеру, быстры и дешевы. + Поэтому подсистема виртуальной памяти была разработана с упором на + бережное использование памяти ценой более частых обращений к диску. + Вдобавок реализация в 4.3BSD была пронизана зависимостями от + аппаратной системы управления памятью машин VAX, что препятствовало + ее переносу на другие аппаратные платформы. И наконец, подсистема + виртуальной памяти не была предназначена для поддержки связных + многопроцессорных систем, которые сейчас становятся все более + распространенными и необходимыми. + + Попытки постепенно усовершенствовать старую реализацию заведомо + были обречены на неудачу. Полностью новая архитектура, с другой + стороны, могла бы использовать большие объемы памяти, уменьшить + дисковые операции и обеспечивать работу с несколькими процессорами. + Наконец, система виртуальной памяти в 4.4BSD была полностью изменена. + Система виртуальной памяти 4.4BSD основана на системе виртуальной + памяти (VM) Mach 2.0 с + заимствованиями из Mach 2.5 и Mach 3.0. В ней была эффективная + поддержка совместного использования, полное разделение + машинно-зависимой и машинно-независимой частей, а также (сейчас не + используемая) поддержка работы с несколькими процессорами. Процессы + могут отображать файлы в любую область своего адресного пространства. + Они могут совместно использовать части своих адресных пространств + посредством отображения в память одного и того же файла. Изменения, + сделанные одним процессом, видны в адресном пространстве другого + процесса, а также записываются и в сам файл. Процессы могут также + запрашивать эксклюзивное отображение файла в память, при котором + любые изменения, сделанные процессом, не видны другим процессам, + которые отображают файл в память и не записываются обратно в + файл. + + Еще одной проблемой с системой виртуальной памяти является + способ, которым информация передается ядру при выполнении системного + вызова. 4.4BSD всегда копирует данные из адресного пространства + процесса в буфер ядра. Для операций чтения и записи, при которых + передаются большие объемы данных, выполнение копирования может + оказаться занимающим время процессом. Альтернативным способом + является манипуляции с адресным пространством процесса в ядре. Ядро + 4.4BSD всегда копирует данные о нескольким причинам: + + + + Зачастую пользовательские данные не выравнены по границе + страницы памяти и их объем не кратен размеру аппаратной + страницы памяти. + + + + Если страница памяти забирается от процесса, он не может + больше ссылаться на эту страницу. Некоторые программы зависят от + данных, остающихся в буфере, даже после записи этих + данных. + + + + Если процесс позволяет хранить копию страницы памяти (как это + делается в существующей 4.4BSD), то страница должна иметь атрибут + копирования-при-записи. Такая страница + является одной из таковых, что защищается от записи при помощи + атрибута только-для-чтения. Если процесс пытается модифицировать + страницу памяти, в ядре возникает ситуация ошибки записи. После + этого ядро делает копию страницы, которую процесс может изменять. + К несчастью, большинство процессов будет немедленно пытаться + записать новые данные в свой буфер вывода, что приводит в любом + случае к копированию данных. + + + + Когда страницы переносятся в новые адреса виртуальной памяти, + большинство аппаратных менеджеров памяти требуют, чтобы кэш + аппаратного переназначения адресов был выборочно очищен. + Очистка кэша зачастую выполняется медленно. В итоге получается, + что переназначение адресов оказывается медленнее, чем копирование + блоков данных, не превышающих 4 или 8 килобайт. + + + + Больше всего отображение памяти нужно для работы к большими + файлами и передачи больших объемов данных между процессами. + Интерфейс mmap дает методы для выполнения обеих + этих операций без копирования. + + + + Управление памятью внутри ядра + + Ядро часто выполняет выделение памяти, которое нужно только для + выполнения единственного системного вызова. В пользовательском + процессе такая кратковременно используемая память будет выделяться в + стеке во время выполнения. Так как ядро имеет ограниченный объем + стека времени выполнения, то неэффективно выделять в нем даже блоки + памяти среднего размера. Таким образом, такая память должна + выделяться посредством более гибкого механизма. Например, когда + системный вызов должен преобразовать имя каталога, он должен выделить + буфер размером 1 Кбайт для хранения имени. Другие блоки памяти + должны выделяться на более продолжительный срок, чем один системный + вызов, и поэтому не могут выделяться в стеке, даже если там есть + место. В качестве примера можно взять блоки управления протоколами, + которые существуют на всем протяжении сетевого соединения. + + Необходимость в динамическом выделении памяти в ядре становилась + все более острой вместе с добавлением количества сервисов. Общий + механизм выделения памяти уменьшает сложность написания кода в ядре. + Поэтому в 4.4BSD ядро имеет единый механизм выделения памяти, который + может использоваться в любой части системы. У него есть интерфейс, + похожий на функции библиотеки языка C malloc и + free, которые обеспечивают выделение памяти в + прикладных программах . Как + интерфейс библиотеки языка C, функция выделения памяти получает + параметр, указывающий на размер памяти, который необходим. Диапазон + запрашиваемых объемов выделяемой памяти не ограничен; однако + выделяемая физическая память не подвергается постраничной подгрузке. + Функции освобождения памяти передается указатель на освобождаемый + участок памяти, но указывать размер освобождаемого участка памяти не + нужно. + + + + + Система ввода/вывода + + Базовой моделью системы ввода/вывода UNIX является + последовательность байт, доступ к которым может осуществляться как + последовательно, так и в в произвольном порядке. В типичном + пользовательском процессе UNIX нет таких понятий, как + методы доступа или управляющие + блоки. + + Различные программы используют разнообразные структуры данных, но + ядро не связывает ввод/вывод с используемыми структурами. Например, + текстовым файлом считается файл из строк символов набора ASCII, которые + разделены одним символом новой строки (символ ASCII перевода строки), + но ядро не знает ничего об этом соглашении. Для удовлетворения + потребностей большинства программ модель еще более упрощена и сводится + к потоку байт данных, или потоку ввода/вывода. + Такое единое представление данных позволяет работать характерному для + UNIX подходу на основе инструментов . + Поток ввода/вывода одной программы может быть подан в качестве входной + информации практически любой другой программе. (Этот тип традиционных + для UNIX потоков ввода/выводы не нужно путать с потоковой системой + ввода/вывода из Eighth Edition или с потоками из System V, Release 3 + (STREAMS), оба из которых доступны как обычные потоки + ввода/вывода.) + + + Дескрипторы и ввод/вывод + + Процессы UNIX для работы с потоками ввода/вывода используют + дескрипторы. Дескрипторы представляют собой + беззнаковые целые числа, получаемые после выполнения системных вызовов + open и socket. Системный + вызов open получает в качестве аргументов имя + файла и режим доступа, который определяет, должен ли файл открываться + для чтения, для записи или для обеих операций. Этот системный вызов + может также использоваться для создания нового пустого файла. + Системные вызовы read и + write могут применяться к дескриптору для + переноса данных. Системный вызов close может + использоваться для уничтожения любого дескриптора. + + Дескрипторы представляют низкоуровневые объекты, поддерживаемые + ядром, и создаваемые системными вызовами, специфичными для каждого + типа объектов. В 4.4BSD дескрипторы могут представлять три типа + таких объектов: файлы, каналы и сокеты. + + + + Файл представляет собой линейную + последовательность байт, имеющую по крайней мере одно имя. Файл + существует, пока все его имена не удалены и ни один из процессов + не хранит его дескриптор. Процесс получает дескриптор файла, + открывая имя файла посредством системного вызова + open. Работа с устройствами ввода/вывода + осуществляется как с файлами. + + + + Каналом является линейная + последовательность байт, такая же, как файл, но используемая + исключительно как поток ввода/вывода, причем однонаправленный. + У канала нет имени, и поэтому он не может быть открыт при помощи + open. Вместо этого он создается посредством + системного вызова pipe, который возвращает + два дескриптора, один из которых принимает входные данные, + без искажений, без повторений и в той же самой последовательности + посылаемый на другой дескриптор. Система также поддерживает + именованный канал, или FIFO. FIFO имеет те же самые свойства, + что и канал, за исключением того, что он располагается в файловой + системе; поэтому он может быть открыт системным вызовом + open. Процессы, которые хотят обмениваться + данными, открывают FIFO: Один процесс открывает его для чтения, а + другой для записи. + + + + Сокет является промежуточным объектом, + который используется для межпроцессных коммуникаций; он + существует, пока какой-либо процесс хранит дескриптор, + ссылающийся на него. Сокет создается системным вызовом + socket, который возвращает его дескриптор. + Имеется несколько типов сокетов, которые поддерживают различные + коммуникационные возможности, такие, как надежную доставку + данных, сохранение последовательности передаваемых сообщений, + и сохранение границ сообщений. + + + + В системах, предшествующих 4.2BSD, каналы были реализованы в + файловой системе, когда в 4.2BSD появились сокеты, то каналы были + повторно реализованы как сокеты. + + Для каждого процесса ядро хранит таблицу + дескрипторов, которая является таблицей, используемой + ядром для преобразования внешнего представления дескриптора в его + внутреннее представление. (Дескриптор является просто индексом в + этой таблице.) Таблица дескрипторов процесса наследуется от + родительского процесса, и вместе с ней наследуется и доступ к + объектам, на которые ссылаются дескрипторы. Основными способами, + при помощи которых процесс может получить дескриптор, является + открытие или создание объекта, а также наследование от родительского + процесса. Кроме того, межпроцессные коммуникации при помощи сокетов + позволяют передавать дескрипторы в сообщениях между несвязанными + процессами на одной и той же машине. + + Любой рабочий дескриптор имеет связанное с ним смещение + в файле в байтах от начала объекта. Операции чтения и + записи начинаются от этого смещения, который обновляется после каждой + передачи данных. Для объектов, к которым разрешен произвольный + доступ, смещение в файле может быть установлено посредством + системного вызова lseek. Обычные файлы, а также + некоторые устройства, разрешают произвольный доступ к ним. Каналы и + сокеты этого делать не позволяют. + + Когда процесс завершается, ядро освобождает все дескрипторы, + которые использовались этим процессом. Если процесс хранил последнюю + ссылку на объект, то менеджер объектов уведомляется для выполнения + всех необходимых действий, таких, как окончательное удаление файла + или уничтожение сокета. + + + + Управление дескрипторами + + Большинство процессов ожидают, что перед началом их работы уже + будут открыты три дескриптора. Это дескрипторы 0, 1 и 2, больше + известные как стандартный ввод, + стандартный вывод и стандартный поток + диагностических сообщений, соответственно. Как правило, + все они связываются с пользовательским терминалом по время входа в + систему (смотри Раздел 14.6) и наследуются через вызовы + fork и exec процессами, + запускаемыми пользователем. Таким образом, программа может считывать + то, что набирает пользователь, из стандартного ввода, и программа + может выдавать результат на экран пользователя, осуществляя запись в + стандартный вывод. Дескриптор потока диагностических сообщений + также открыт для записи и используется для вывода ошибок, когда как + стандартный вывод используется для обычного вывода. + + Эти (и другие) дескрипторы могут отображаться на объекты, + отличающиеся от терминала; такое отображение называется + перенаправлением ввода/вывода, и все стандартные + командные процессоры позволяют пользователю это делать. Оболочка + может направить вывод программы в файл, закрывая дескриптор 1 + (стандартный вывод) и открывая выбранный выходной файл для создания + нового дескриптора 1. Подобным же образом стандартный ввод может + браться из файла, при этом закрывается дескриптор 0 и открывается + файл. + + Каналы позволяют выводу одной программы становиться вводом другой + программы без переписывания и даже перекомпоновки программ. Вместо + того, чтобы дескриптор 1 (стандартный вывод) исходной программы был + настроен на запись на терминал, он настраивается на входной + дескриптор канала. Аналогично дескриптор 0 (стандартный ввод) + принимающей программы настраивается на обращение к выводу канала, + а не к клавиатуре терминала. Результирующий набор двух процессов и + соединяющий канал называется конвейером. + Конвейеры могут быть весьма большими последовательностями процессов, + соединенных каналами. + + Системные вызовы open, + pipe и socket порождают + новые дескрипторы с наименьшим неиспользуемым номером, подходящим для + дескриптора. Для того, чтобы конвейеры могли работать, должен + существовать механизм для отображения таких дескрипторов в 0 и 1. + Системный вызов dup создает копию дескриптора, + которая указывает на ту же самую запись в таблице файлов. Новый + дескриптор также является наименьшим неиспользуемым, но если нужный + дескриптор сначала закрыть, то dup можно + использовать для выполнения нужного отображения. Однако здесь + требуется некоторая осторожность: если нужен дескриптор 1, а + дескриптор 0 уже закрыт, то в результате получится дескриптор 0. Во + избежание этой проблемы в системе имеется системный вызов + dup2; он похож на dup, но + воспринимает дополнительный аргумент, указывающий номер нужного + дескриптора (если нужный дескриптор уже открыт, то + dup2 его закроет перед повторным + использованием). + + + + Устройства + + Аппаратные устройства имеют связанные с ними имена файлов, и к + ним может обращаться пользователь при помощи тех же самых системных + вызовов, что используются для обычных файлов. Ядро может + различать специальный файл устройства или просто + специальный файл, и может определять, к какому + устройству он относится, но большинство процессов не выполняют такого + распознавания. Терминалы, принтеры и стримеры все доступны как + последовательности байт, как дисковые файлы 4.4BSD. Таким образом, + особенности работы устройств максимально скрываются ядром, и даже в + ядре большинство из них отличаются в драйверах. + + Аппаратные устройства могут быть разделены на + структурированные или + неструктурированные; они известны под названиями + блочные и посимвольные, + соответственно. Как правило, процессы обращаются к устройствам + посредством специальных файлов в файловой + системе. Операции ввода/вывода, выполняемые с такими файлами, + обрабатываются постоянно находящимися в ядре программными модулями, + называемыми драйверами устройств. Большинство + аппаратных устройств для сетевых коммуникаций доступны только при + помощи механизмов межпроцессного взаимодействия, и не имеют + специальных устройств в пространстве имен файловой системы, так как + интерфейс низкоуровневых сокетов дает более + естественный интерфейс, чем специальный файл. + + Структурированные или блочные устройства разделяются на диски и + магнитные ленты и включают в себя большинство устройств с + произвольным доступом. Ядро поддерживает операции буферизации типа + чтение-изменение-запись с блочными структурированными устройствами + для того, чтобы разрешить последним осуществлять чтение и запись + полностью произвольным образом, как с обычными файлами. Файловые + системы создаются на блочных устройствах. + + Неструктурированными устройствами являются те, что не + поддерживают блочную структуру. Типичными неструктурированными + устройствами являются линии связи, растровые графопостроители и + небуферизируемые магнитные ленты и диски. Неструктурированные + устройства, как правило, поддерживают перенос больших объемов + данных. + + Неструктурированные файлы называют символьными + устройствами, потому что первые из них являлись драйверами + терминальных устройств. Интерфейс ядра к драйверу для этих устройств + доказал удобство его использования для других неструктурированных + устройств. + + Специальные файлы устройств создаются системным вызовом + mknod. Имеется дополнительный системный вызов, + ioctl, для управления низкоуровневыми + параметрами специальных файлов. Выполняемые операции для каждого + устройства различны. Этот системный вызов позволяет осуществлять + доступ к специальным характеристикам устройств, не перегружая смысл + других системных вызовов. Например, для стримера существует + ioctl для записи метки конца ленты, но нет + особой или измененной версии функции + write. + + + + Механизм межпроцессных коммуникаций посредством сокетов + + В ядре 4.2BSD появился механизм межпроцессного взаимодействия, + более гибкий, чем каналы, основанный на сокетах. + Сокет является конечной точкой коммуникаций, доступный через + дескриптор, как файл или канал. Каждый из двух процессов может + создать сокет, а затем соединить эти конечные точки для получения + надежного канала передачи потока байт. После соединения процесс + может выполнять с дескрипторами операции чтения и записи, как это + делалось с каналами. Прозрачность сокетов позволяет ядру + перенаправить вывод одного процесса на вход другого, работающего на + другой машине. Большим различием между каналами и сокетами является + то, что каналы требуют наличия общего родительского процесса для + установки коммуникации. Соединение между сокетами может быть + установлено двумя несвязанными процессами, возможно, работающими на + разных машинах. + + System V предоставляет механизм локального межпроцессного + взаимодействия через FIFO (также называемые именованными + каналами). FIFO отображаются как объекты файловой + системы, которые могут быть открыты несвязанными процессами, и в + которые можно открывать и посылать данные так же, как в случае + каналов. Таким образом, FIFO не требуют общего родительского + процесса для установки соединения; они могут быть соединены после + того, как будут запущены два процесса. В отличие от сокетов, FIFO + могут быть использованы только на локальной машине; они не могут быть + использованы для связи между процессами, работающими на разных + машинах. FIFO реализованы в 4.4BSD, потому что это требует стандарт + POSIX.1. Их функциональность является подмножеством функций + интерфейса сокетов. + + Механизм сокетов требует расширения традиционных для UNIX + системных вызовов ввода/вывода для обеспечения соответствующих имен и + смыслов соединениям. Вместо того, чтобы перегружать существующий + интерфейс, разработчики использовали существующие интерфейсы, + расширив их так, что они продолжили работать без изменений, и + разработали новые интерфейсы для работы с новыми возможностями. + Системные вызовы read и + write использовались для соединений типа потока + байт, и было добавлено шесть новых системных вызовов, что позволило + посылать и принимать адресованные сообщения, такие, как сетевые + датаграммы. Системные вызовы для записи сообщений включают в себя + send, sendto и + sendmsg. Системные вызовы для чтения сообщений + включают recv, recvfrom и + recvmsg. В ретроспективе, первые два в каждом + классе являются особыми случаями других; + recvfrom и sendto, + наверное, должны были быть добавлены как библиотечные интерфейсы к + recvmsg и sendmsg, + соответственно. + + + + Множественный ввод/вывод + + Кроме традиционных системных вызовов read и + write, в 4.2BSD появилась возможность выполнять + множественный ввод/вывод. Множественный ввод использует системный + вызов readv для размещения результата + единственной операции чтения в нескольких различных буферах. + Обратно, системный вызов writev позволяет + осуществлять запись нескольких различных буферов за одну атомарную + операцию записи. Вместо передачи одного буфера и его длины в + качестве параметров, как это делается при использовании системных + вызовов read и write, + процесс передает указатель на массив буферов и их длин, а также + счетчик, определяющий размер массива. + + Такой механизм позволяет буферам в различных областях адресного + пространства процесса записываться атомарно, без необходимости + копировать их в один буфер. Атомарные операции записи необходимы в + случае, когда низкоуровневые абстракции основаны на записях, + например, стримеры, которые выводят блок ленты при каждом запросе на + запись. Также полезна возможность помещать результат одного запроса + на чтение в нескольких различных буферах (например, заголовок записи + в одно место, а данные в другое). Хотя приложение может симулировать + возможность выполнять множественные операции посредством чтения + данных в большой буфер с последующим копированием их частей в + нужные области, и накладные расходы на копирование в памяти в таких + случаях часто увеличивает время выполнения приложения чуть ли не + вдвое. + + Так же, как send и recv + могут быть реализованы в виде библиотечных интерфейсов к + sendto и recvfrom, возможно + симулирование read через + readv и write через + writev. Однако read и + write используются столь часто, что накладные + расходы на такую симуляцию не стоят того. + + + + Поддержка нескольких файловых систем + + Вместе с распространением сетевых вычислений возникла потребность + в поддержке как локальных, так и удаленных файловых систем. Для + облегчения поддержки нескольких файловых систем разработчики добавили + в ядро интерфейс виртуальных узлов файловой системы, или + интерфейс vnode. Набор операций, экспортируемых + через интерфейс vnode, похож на операции файловой системы, ранее + поддерживаемые локальной файловой системой. Однако они могут + поддерживаться широким спектром типов файловых систем: + + + + Локальные файловые системы, использующие диск + + + + Файлы, импортируемые при помощи разнообразных протоколов + удаленных файловых систем + + + + Файловые системы CD-ROM, доступные только для чтения + + + + Файловые системы, предоставляющие специализированные услуги + -- к примеру, файловая система /proc + + + + Некоторые варианты 4.4BSD, такие, как FreeBSD, позволяют + выполнять динамическую загрузку файловых систем при первом обращении + к ним при помощи системного вызова mount. + Интерфейс vnode описан в Разделе 6.5; вдобавок он поддерживает + функции, описанные в Разделе 6.6; некоторые из файловых систем + специального назначения описаны в Разделе 6.7. + + + + + Файловые системы + + Обычный файл представляет собой массив байтов, и может читаться и + записываться, начиная с произвольного байта файла. Ядро не различает + в обычных файлах границ записей, хотя многие программы воспринимают + символы перевода строки в качестве признаков конца строк, но другие + программы могут предполагать наличие других структур. В самом файле + не хранится никакой системной информации о файле, но в файловой системе + размещается некоторая информация о владельце, правах доступа и об + использовании каждого файла. + + Компонент под названием имя файла является + строкой длиной до 255 символов. Эти имена хранятся в файле особого + типа, который называется каталогом. Информация о + файле в каталоге называется записью каталога и + включает, кроме имени файла, указатель на сам файл. Записи каталога + могут ссылаться как на другие каталоги, так и на обычные файлы. Таким + образом формируется иерархия каталогов и файлов, которая и называется + файловой системой filesystem; + +
+ Небольшая файловая система + + + + + + + + +-------+ + | | + +-------+ + / \ + usr / \ vmunix + |/ \| + +-------+ +-------+ + | | | | + +-------+ +-------+ + / | \ + staff / | \ bin + |/ | tmp \| + +-------+ V +-------+ + | | +-------+ | | + +-------+ | | +-------+ + / | \ +-------+ / | \ + mckusick / | \| |/ | \ ls + |/ | karels | vi \| ++-------+ V V +-------+ +| | +-------+ +-------+ | | ++-------+ | | | | +-------+ + +-------+ +-------+ + + + + + Дерево небольшой файловой системы + + +
+ + Одна небольшая файловая система показана на . Каталоги могут содержать подкаталоги, и нет + ограничений вложенности одного каталога в другой по глубине. Для + соблюдения целостности файловой системы, ядро не позволяет процессу + производить запись непосредственно в каталоги. Файловая система может + хранить не только обычные файлы и каталоги, но также ссылки на другие + объекты, такие, как устройства и сокеты. + + Файловая система образует дерево, начало которого находится в + корневом каталоге, иногда называемому по имени + слэш, которое соответствует символу одинарной + наклонной черты (/). Корневой каталог содержит файлы; в нашем примере + на Рисунке 2.2, он содержит vmunix, копию + выполнимого объектного файла ядра. В нем также расположены каталоги; + в этом примере он содержит каталог usr. Внутри + каталога usr располагается каталог + bin, который в основном содержит выполнимый + объектный код программ, таких, как + + ls и vi. + + Процесс обращается к файлу, указывая путь до + него, который является строкой, состоящей из нескольких или ни одного + имен файлов, разделенных символами слэша (/). С каждым процессом ядро + связывает два каталога, при помощи которых можно интерпретировать + маршруты до файлов. Корневой каталог процесса + является самой верхней точкой файловой системы, которую может достичь + процесс; обычно он соответствует корневому каталогу всей файловой + системы. Маршрут, начинающийся с символа слэша, называется + абсолютным маршрутом, и интерпретируется ядром, + начиная с корневого каталога процесса. + + Имя пути, которое не начинается со слэша, называется + относительным маршрутом, и интерпретируется + относительно текущего рабочего каталога процесса. + (Этот каталог кратко также называют текущим + каталогом или рабочим каталогом.) + Текущий каталог сам по себе можно обозначить непосредственно по имени + dot, что соответствует одной точке + (.). Имя файла dot-dot + (..) обозначает родительский каталог текущего + каталога. Корневой каталог является предком самому себе. + + Процесс может задать собственный корневой каталог при помощи + системного вызова chroot, и установить текущий + каталог системным вызовом chdir. Каждый процесс + может в любой момент выполнить вызов chdir, но + chroot позволено выполнять только процессу с + административными привилегиями. Chroot обычно + используется для ограничения доступа к системе. + + Взяв файловую систему, изображенную на Рисунке 2.2, и полагая, что + процесс имеет в качестве корневого каталога корневой каталог файловой + системы, и в качестве текущего каталога /usr, + он может обратиться к файлу vi либо от корня по + абсолютному имени /usr/bin/vi, либо из текущего + каталога с относительным именем bin/vi. + + Системные утилиты и базы данных располагаются в нескольких всем + известных каталогах. Частью предопределенной иерархии является + каталог, содержащий домашний каталог для каждого + пользователя -- например, /usr/staff/mckusick и + /usr/staff/karels на Рисунке 2.2. Когда + пользователи регистрируются в системе, то рабочий каталог их командного + процессора устанавливается в домашний каталог. В своих домашних + каталогах пользователи могут создавать каталоги так же легко, как и + обычные файлы. Таким образом, пользователь может строить иерархии + каталогов произвольной сложности. + + Пользователь обычно знает только об одной файловой системе, но + система может знать, что одна виртуальная файловая система на самом + деле состоит из нескольких физических файловых систем, каждая из + которых расположена на отдельном устройстве. Физическая файловая + система не может располагаться на нескольких физических устройствах. + Так как большинство физических дисковых устройств разбиваются на + несколько логических устройств, то на одном физическом устройстве может + располагаться более одной файловой системы, но не более одной для + каждого логического устройства. Одна из файловых систем -- та, с + которой начинаются все абсолютные имена -- называется + корневой файловой системой, и она всегда доступна. + Другие файловые системы могут монтироваться; это значит, что они могут + интегрироваться в иерархию каталогов корневой файловой системы. Ссылки + на каталог, в котором находится смонтированная в него файловая системе, + прозрачно преобразуются ядром в ссылки на корневой каталог + смонтированной файловой системы. + + Системный вызов link в качестве параметров + принимает имя существующего файла и новое имя, которое будет присвоено + файлу. После успешного выполнения вызова link, + файл может быть доступен по любому из имен. Имя файла может быть + удалено при помощи системного вызова unlink. + Когда удаляется последнее имя для файла (и последний процесс, который + держал файл открытым, закрыл его), удаляется и сам файл. + + Файлы организованы иерархически в каталоги. + Каталог является типом файла, но, в отличие от обычных файлов, каталог + имеет структуру, определяемую системой. Процесс может читать каталог, + как будто это обычный файл, но только ядру разрешено изменять каталог. + Каталоги создаются системным вызовом mkdir и + удаляются системным вызовом rmdir. До 4.2BSD + системные вызовы mkdir и + rmdir были реализованы как последовательность + системных вызовов link и + unlink. Имелось три причины для добавления + системных вызовов специально для создания и удаления каталогов: + + + + Операция может быть сделана атомарной. Если система завершила + работу аварийно, то каталог не может оставаться в промежуточном + состоянии, что может случиться при последовательном вызове серии + операций. + + + + При работе сетевой файловой системы создание и удаление файлов + и каталогов должны выполняться атомарно, чтобы могли выполняться + последовательно. + + + + При реализации поддержки не-UNIX файловых систем, таких, как + файловая система MS-DOS, на другом разделе диска, может оказаться, + что эта файловая система не поддерживает ссылочных операций. Хотя + другие файловые системы могут поддерживать концепцию каталогов, + скорее всего, они не будут создавать и удалять каталоги со + ссылками, как это делается в файловой системе UNIX. Соответственно + они могут создавать и и удалять каталоги только при наличии явных + запросов на удаление или создание каталогов. + + + + Системный вызов chown устанавливает владельца + и группу файла, а chmod изменяет атрибуты защиты. + Вызов stat, примененный к имени файла, может + использоваться для чтения этих свойств файла. Системные вызовы + fchown, fchmod и + fstat применяются с дескрипторами, а не с именами + файлов, для выполнения того же самого набора операций. Системный вызов + rename может использоваться для присвоения файлу + нового имени в файловой системе с заменой старого имени файла. Как и + операции по созданию и удалению каталогов, системный вызов + rename был добавлен в 4.2BSD для придания + атомарности изменению имен в локальной файловой системе. Позже он + оправдал свою исключительную полезность для экспортирования операций по + переименованию в сторонних файловых системах и по сети. + + Системный вызов truncate был добавлен в 4.2BSD + для того, чтобы файлы могли обрезаться по указанному смещению. Вызов + был добавлен первоначально для поддержки библиотеки времени выполнения + языка Fortran, в котором применялось понятие конца файла с произвольным + доступом, который мог устанавливаться в любую позицию, в которой был + последний раз доступ к файлу. Без системного вызова + truncate единственным способом обрезать файл было + копирование нужной части в новый файл, удаление старого и + переименование копии в первоначальное имя. Библиотека могла + теоретически отказываться работать на заполненной файловой системе, к + тому же такой алгоритм оказывался медленным. + + После того, как файловая система получила возможность обрезать + файлы, ядро применяло эту возможность для уменьшения больших пустых + каталогов. Преимущество в уменьшении пустых каталогов заключается в + сокращении времени ядра на поиск в них при создании или удалении + имен. + + Вновь создаваемым файлам присваивается идентификатор пользователя + процесса, который их создал, и идентификатор группы каталога, в котором + они были созданы. Для защиты файлов применяется трехуровневый механизм + управления доступом. Эти три уровня определяют доступность файла + для + + + + Пользователя, который является владельцем файла + + + + Группы, которая приписана файлу + + + + Всех остальных + + + + Каждый уровень доступа имеет отдельные индикаторы прав для чтения, + записи и выполнения. + + Файлы создаются с нулевым размером, который может увеличиться при + выполнении операций записи. Пока файл открыт, система отслеживает + указатель на файл, соответствующий текущему положению в файле, + связанном с дескриптором. Этот указатель может перемешаться по файлу в + произвольном порядке. Процессы, использующие один и тот же дескриптор + файла посредством системных вызовов fork или + dup, используют одновременно один и тот же + указатель текущей позиции. Дескрипторы, созданные различными + системными вызовами open, имеют различные + указатели текущей позиции. В файлах могут присутствовать + дыры. Дыры представляют собой пустые пространства + в теле файла, в которые никаких данных не записывалось. Процесс может + создать такие дыры, перемещая указатель за текущий конец файла и + производя запись. При чтении дыры интерпретируются системой как + заполненные нулевыми байтами. + + Ранние версии UNIX имели ограничение в 14 символов на имя файла. + Это ограничение зачастую вызывало проблемы. Например, кроме + естественного желания пользователей давать файлам длинные описательные + имена, распространенным способом формировать имена файлов является + использование формата + basename.extension, + где расширение (указывающее на тип файла, скажем, .c + для исходного года на языке C или .o для + промежуточного двоичного объекта) имеет длину от одного до трех + символов, оставляя от 10 до 12 символов на имя файла. Системы + управления исходным кодом и редакторы обычно используют дополнительно + два символа для своих целей, для префикса или суффикса имени файла, + при этом остается от восьми до 10 символов. В качестве имени файла + легко использовать от 10 до 12 символов одного английского слова + (например, ``multiplexer''). + + Можно смириться с этими ограничениями, но это непоследовательно и + даже опасно, потому что другие системы UNIX могут работать со строками, + превышающими этот лимит, при создании файлов, но затем имя будет + обрезано. Исходный файл с именем + multiplexer.c, содержащий исходный код на языке C, + (уже 13 символов) может иметь соответствующий файл из системы + управления исходным кодом с префиксом s., при этом + получается имя файла s.multiplexer, которое не + не будет отличаться от файла системы управления исходным кодом для + файла multiplexer.ms, содержащего исходный код + + troff для документации программы на языке C. + Содержимое двух оригинальных файлов может оказаться перепутанным без + каких-либо предупреждений от системы управления исходным кодом. + При тщательном кодировании эту проблему можно обнаружить, но поддержка + длинных имен файлов, впервые появившаяся в 4.2BSD, практически + полностью ликвидировала эту проблему. +
+ + + Размещение файлов + + Операции, определенные для локальных файловых систем, делятся на + две категории. Общими для всех локальных систем являются иерархический + принцип именования, блокировка, квоты, управление атрибутами и защита. + Эти механизмы не зависят от того, как хранятся данные. В 4.4BSD + имеется единая реализация для предоставления этих сервисов. + + Другой частью локальной файловой системы является организация и + управление данными на носителях информации. Размещение содержимого + файлов на носителях является вопросом хранилища файлов. В 4.4BSD + поддерживает три различных типа хранилищ файлов: + + + + Традиционная файловая система Berkeley Fast Filesystem + + + + Журналируемая файловая система, основанная на архитектуре + операционной системы Sprite + + + + Файловая система в памяти + + + + Хотя организация этих хранилищ совершенно различна, эти различия + скрыты от процессов, использующих файловые системы. + + В файловой системе Fast Filesystem организует данные в группы + дорожек. Файлы, к которым, скорее всего, будет осуществляться доступ + одновременно (на основе их расположения в иерархии файловой системы), + хранятся на одной и той же группе дорожек. Файлы, к которым не + предполагается одновременный доступ, перемещаются на разные группы + дорожек. Таким образом, файлы, записываемые в одно и то же время, могут + располагаться в абсолютно разных областях диска. + + Файловая система с журнальной организацией организует данные в виде + журнала. Все данные, записываемые в некоторый момент времени, собираются + вместе и записываются в одно и то же место диска. Данные никогда не + перезаписываются; вместо этого записывается новая копия файла, которая + заменяет старую. Старые файлы уничтожаются процессом-сборщиком мусора, + который запускается, когда файловая система переполняется и появляется + необходимость в свободном пространстве. + + Файловая система в памяти предназначена для хранения данных в + виртуальной памяти. Она используется для файловых систем, в которых + должны храниться временные данные с обеспечением быстрого доступа к ним, + к примеру, /tmp. При организации файловой системы в + памяти преследуется цель организовать максимально компактное хранение + данных для минимизации использования ресурсов виртуальной памяти. + + + + Сетевая файловая система + + Изначально сетевые возможности использовались для передачи + данных от одной машины к другой. Позже это получило свое развитие в + обеспечении подключения пользователей удаленно к другим машинам. + Следующим логическим шагом было предоставление данных пользователю, + а не приближение пользователя к данным -- так родились сетевые файловые + системы. Пользователи, работающие локально, не ощущают сетевых + задержек при каждом нажатии клавиши, так что они получают более удобное + рабочее окружение. + + Подключение файловой системы к локальной машине было одним из + первых основных клиент-серверных приложений. + Сервер является удаленной машиной, которая + экспортирует одну или более своих файловых систем. + Клиентом является локальная машина, которая + импортирует эти файловые системы. С точки зрения локального клиента, + смонтированные удаленные файловые системы появляются в пространстве + имен дерева файлов, как любая другая локально смонтированная файловая + система. Локальные клиенты могут перемещаться в каталоги на удаленной + файловой системе, и могут осуществлять чтение, запись и выполнение + двоичных файлов на удаленной файловой системе точно так же, как они + выполняют эти операции на локальной файловой системе. + + Когда локальный клиент выполняет операцию на удаленной файловой + системе, оформляется и посылается запрос к серверу. Сервер выполняет + запрошенную операцию и возвращает либо запрошенную информацию, либо + ошибку, почему запрос был отклонен. Для получения удовлетворительной + производительности, клиент должен кэшировать данные, к которым доступ + осуществляется часто. Сложность удаленных файловых систем отражается + на поддержке соответствия между сервером и множеством его + клиентов. + + Хотя за эти годы было разработано множество протоколов работы с + удаленными файловыми системами, самой распространенной на системах UNIX + является сетевая файловая система Network Filesystem (NFS), которая + была спроектирована и реализована в Sun Microsystems. Ядро 4.4BSD + поддерживает протокол NFS, хотя его реализация была выполнена + независимо от спецификаций протокола . + Протокол NFS описан в Главе 9. + + + + Терминалы + + Терминалы поддерживают стандартные системные операции ввода/вывода, + а также набор операций, специфичных для терминалов, для управления + редактированием входных символов и задержек вывода. На самом нижнем + уровне находятся драйверы терминальных устройств, которые управляют + портами аппаратных терминалов. Терминальный ввод обрабатывается + согласно низлежащим характеристикам связи, таким, как скорость + передачи, и согласно набору программно контролируемых параметров, таких, + как контроль четности. + + Выше уровня драйверов терминальных устройств находятся режимы + каналов, которые обеспечивают различные уровни обработки символов. + По умолчанию режим работы канала выбирается, когда порт используется + для интерактивного входа в систему. Режим работы канала + устанавливается в канонический; входной поток + обрабатывается так, что обеспечиваются стандартные функции, + ориентированные на редактирование строк, и он представляется процессу + в виде целых строк. + + Экранные редакторы и программы, которые взаимодействуют с другими + машинами, обычно работают в неканоническом режиме + (часто называемом raw-режимом или + посимвольным режимом). В этом режиме входной + поток передается в читающий процесс сразу же и без всякой обработки. + Выключается вся обработка специальных символов, не выполняется + удаление символов и другое редактирование строк, все символы передаются + программе, которая выполняет чтение с терминала. + + Терминал может быть настроен тысячами различных способов, + промежуточных между этими двумя. Например, экранный редактор, которому + необходимо получать прерывания от пользователя асинхронно, может + разрешить использование специальных символов, которые генерируют + сигналы и разрешить управление выходным потоком, в противном случае + работать в неканоническом режиме; все остальные символы будут + передаваться в процесс необработанными. + + Что касается выходного потока, то терминальный обработчик + предоставляет простые службы по его форматированию, включая + + + + Преобразование символа перевода строки на двухсимвольную + последовательность из символов возврата каретки и перевода + строки + + + + Выдерживание пауз после некоторых стандартных управляющих + символов + + + + Замещение символов табуляции + + + + Вывод неграфических символов ASCII в виде двухсимвольных + последовательностей вида ``^C'' (другими словами, вывод знака + вставки, за которым следует символ, который находится по смещению + от символа ``@'', соответствующему значению этого символа). + + + + Каждый из этих сервисов преобразования может быть независимо + выключен процессом при помощи управляющих запросов. + + + + Коммуникации между процессами + + Межпроцессные коммуникации в 4.4BSD организованы в + коммуникационные домены. К поддерживаемым на + данный момент доменам относятся локальный домен + для взаимодействия между процессами, выполняющимися на одной и той же + машине; межсетевой домен для связи между + процессами посредством набора протоколов TCP/IP (возможно, в сети + Интернет); семейство протоколов ISO/OSI для взаимодействия между + сайтами, которым нужна именно такая связь, и домен + XNS для коммуникаций между процессами при помощи протоколов + XEROX Network Systems (XNS). + + В пределах домена соединения имеют место между конечными точками + связи, также называемыми сокетами. Как отмечено в + Разделе 2.6, системный вызов socket создает сокет + и возвращает дескриптор; другие системные вызовы IPC описаны в Главе + 11. Каждый сокет имеет тип, определяющий его коммуникационные + свойства; к ним относятся такие характеристики, как надежность, + сохранение последовательности передаваемой информации и предупреждение + дублирования сообщений. + + с каждым сокетом связан некоторый коммуникационный + протокол. Этот протокол обеспечивает выполнение операций, + требуемых сокету, согласно его типу. Приложения могут задавать + нужный протокол при создании сокета или могут разрешить системе выбрать + протокол, который соответствует типу создаваемого сокета. + + Сокеты могут иметь адреса, связанные с ними. Формат и смысл + адресов сокетов зависят от коммуникационного домена, в котором был + создан сокет. Привязка имени к сокету в локальном домене приводит к + созданию файла в файловой системе. + + Обычные данные, передаваемые и получаемые при помощи сокетов, не + имеют типа. Вопросы представления данных зависят от библиотек, которые + находятся на верху коммуникационных сервисов. Вдобавок к передаче + обычных данных, коммуникационные домены могут поддерживать передачу и + прием специальных типов данных, которые называются правами + доступа. Например, локальный домен использует эту + возможность для передачи дескрипторов между процессами. + + До 4.2BSD сетевые реализации в UNIX обычно работали через + интерфейсы символьных устройств. Одной из целей создания интерфейса + сокетов было обеспечение работы простеньким программам без изменения + на потоковых соединениях. Такие программы могут работать, если только + не меняются системные вызовы read и + write. Соответственно, оригинальные интерфейсы + не трогались, но были исправлены для работы с потоковыми сокетами. + Для более сложных сокетов, таких, как те, что используются для посылки + датаграмм и в которых при каждом вызове send должен + указываться адрес назначения, был добавлен новый интерфейс. + + Другим достоинством является то, что новый интерфейс легко + переносим. Вскоре после тестового релиза, полученного из Беркли, + интерфейс сокетов был перенесен в System III поставщиком UNIX (хотя + AT&T не поддерживала интерфейс сокетов до выхода System V Release + 4, решив использовать вместо него механизм потоков из Eighth Edition). + Интерфейс сокетов был также перенесен для работы на многих + адаптерах Ethernet поставщиками, такими, как Excelan и Interlan, который + продавался на рынке PC, где компьютеры были слишком слабыми, чтобы + обрабатывать сетевой код на основном процессоре. Сравнительно недавно + интерфейс сокетов был использован в качестве основы для сетевого + интерфейса Winsock от Microsoft для Windows. + + + + Сетевые коммуникации + + Некоторые из коммуникационных доменов, поддерживаемых + IPC-механизмом сокетов дают доступ к сетевым + протоколам. Эти протоколы реализованы как отдельный программный слой, + логически находящийся ниже программного обеспечения сокетов в ядре. + Ядро предоставляет много вспомогательных сервисов, таких, как + управление буферами, маршрутизация сообщений, стандартные интерфейсы к + протоколам и интерфейсы к драйверам сетевых интерфейсов для + использования в различных сетевых протоколах. + + В те времена, когда разрабатывалась 4.2BSD, использовалось или + разрабатывалось много сетевых протоколов, каждый со своими сильными и + слабыми сторонами. Не существует единственного подходящего на все + случаи жизни протокола или набора протоколов. Поддерживая много + протоколов, 4.2BSD может обеспечить взаимодействие и обмен ресурсами + между различными машинами, которые были доступны в Беркли. Поддержка + многих протоколов необходим также для изменений в будущем. Современные + протоколы, разработанные для Ethernet со скоростями работы 10 и 100 + Mbit в секунду, вряд ли будут соответствовать для завтрашних оптических + сетей пропускной способностью 1 и 10 Gbit в секунду. Поэтому уровень + сетевых коммуникаций разработан с учетом поддержки многих протоколов. + Новые протоколы добавляются к ядру, не затрагивая поддержку старых + протоколов. Старые приложения могут продолжать работать с + использованием старых протоколов в той же самой физической сети, что + использовалась для новых приложений, работающих с новым сетевым + протоколом. + + + + Сетевая реализация + + Первым набором протоколов, реализованным в 4.2BSD, был + Transmission Control Protocol/Internet Protocol (TCP/IP) от DARPA. + CSRG выбрала TCP/IP в качестве первого для включения в набор протоколов + IPC, потому что реализация на основе 4.1 была всем доступна из проекта, + спонсируемого DARPA, в Bolt, Beranek и Newman (BBN). Это был выбор, + повлиявший на многое: Реализация в 4.2BSD стала основной причиной + очень широкой распространенности и использования этого набора + протоколов. Более поздние усовершенствования производительности и + возможностей TCP/IP были также широко приняты. Реализация TCP/IP + подробно описана в Главе 13. + + В релизе 4.3BSD появился набор протоколов Xerox Network Systems + (XNS), частично основанный на работе, выполненной в Университете + Мэрилэнда и Университете Корнелла. Этот набор был нужен для + объединения отдельных машин, которые не могли работать с протоколом + TCP/IP. + + В релиз 4.4BSD был добавлен набор протоколов ISO из-за его все + большей распространенности как внутри, так и во вне США. По причине + использования в протоколах ISO несколько другого подхода к сети, в + интерфейсе сокетов потребовалось сделать некоторые небольшие изменения + для реализации этого подхода. Изменения были сделаны так, что они + были незаметны для клиентов других существующих протоколов. Протоколы + ISO требуют также большой работы с двухуровневыми таблицами + маршрутизации, имеющимися в 4.3BSD. К значительно расширенным + возможностям по маршрутизации в 4.4BSD относятся раздельные уровни + маршрутизации с адресами переменной длины и сетевыми масками. + + + + Работа системы + + Механизмы начальной загрузки используются для запуска системы. + Сначала ядро 4.4BSD должно быть загружено в основную память процессора. + После загрузки оно должно пройти через фазу инициализации для установки + аппаратуры в известное состояние. Затем ядро должно выполнить + автоконфигурацию, в процессе которой распознаются и настраиваются + периферийные устройства, подключенные к процессору. Система начинает + работу в однопользовательском режиме, пока начальный скрипт выполняет + проверку дисков и включает подсчет статистики и использования квот. + Наконец, начальный скрипт запускает общесистемные службы и переводит + систему в полностью многопользовательский режим. + + При работе в многопользовательском режиме процессы ждут запросов на + вход в систему с терминальных линий и сетевых портов, которые были + настроены на вход пользователей. После обнаружения запроса на вход, + вызывается процесс входа в систему и выполняется аутентификация + пользователя. Если она прошла успешно, запускается начальная + оболочка, из которой пользователь может запускать дополнительные + процессы. + + + + Ссылки + + + Accetta et al, 1986 + + + Mach: A New Kernel Foundation for UNIX Development" + + + + M. + Accetta + + + + R. + Baron + + + + W. + Bolosky + + + + D. + Golub + + + + R. + Rashid + + + + A. + Tevanian + + + + M. + Young + + + + 93-113 + + + + USENIX Association Conference Proceedings + USENIX Association + June 1986 + + + + + Cheriton, 1988 + + + The V Distributed System + + + D. R. + Cheriton + + + 314-333 + + + + Comm ACM, 31, 3 + + March 1988 + + + + + Ewens et al, 1985 + + + Tunis: A Distributed Multiprocessor Operating System + + + + P. + Ewens + + + + D. R. + Blythe + + + + M. + Funkenhauser + + + + R. C. + Holt + + + + 247-254 + + + + USENIX Assocation Conference Proceedings + USENIX Association + June 1985 + + + + + Gingell et al, 1987 + + + Virtual Memory Architecture in SunOS + + + + R. + Gingell + + + + J. + Moran + + + + W. + Shannon + + + + 81-94 + + + + USENIX Association Conference Proceedings + USENIX Association + June 1987 + + + + + Kernighan & Pike, 1984 + + The UNIX Programming Environment + + + + B. W. + Kernighan + + + + R. + Pike + + + + + Prentice-Hall +
+ Englewood Cliffs + NJ +
+
+ + 1984 +
+ + + Macklem, 1994 + + + The 4.4BSD NFS Implementation + + + R. + Macklem + + + 6:1-14 + + + + 4.4BSD System Manager's Manual + + + O'Reilly & Associates, Inc. +
+ Sebastopol + CA +
+
+ + 1994 +
+
+ + + McKusick & Karels, 1988 + + + Design of a General Purpose Memory Allocator for the 4.3BSD + UNIX Kernel + + + + M. K. + McKusick + + + + M. J. + Karels + + + + 295-304 + + + + USENIX Assocation Conference Proceedings + USENIX Assocation + June 1998 + + + + + McKusick et al, 1994 + + + Berkeley Software Architecture Manual, 4.4BSD Edition + + + + M. K. + McKusick + + + + M. J. + Karels + + + + S. J. + Leffler + + + + W. N. + Joy + + + + R. S. + Faber + + + + 5:1-42 + + + + 4.4BSD Programmer's Supplementary Documents + + + O'Reilly & Associates, Inc. +
+ Sebastopol + CA +
+
+ + 1994 +
+
+ + + Ritchie, 1988 + + Early Kernel Design + private communication + + + D. M. + Ritchie + + + March 1988 + + + + Rosenblum & Ousterhout, 1992 + + + The Design and Implementation of a Log-Structured File + System + + + + M. + Rosenblum + + + + K. + Ousterhout + + + + 26-52 + + + + ACM Transactions on Computer Systems, 10, 1 + + Association for Computing Machinery + February 1992 + + + + + Rozier et al, 1988 + + + Chorus Distributed Operating Systems + + + + M. + Rozier + + + + V. + Abrossimov + + + + F. + Armand + + + + I. + Boule + + + + M. + Gien + + + + M. + Guillemont + + + + F. + Herrmann + + + + C. + Kaiser + + + + S. + Langlois + + + + P. + Leonard + + + + W. + Neuhauser + + + + 305-370 + + + + USENIX Computing Systems, 1, 4 + Fall 1988 + + + + + Tevanian, 1987 + + Architecture-Independent Virtual Memory Management for Parallel + and Distributed Environments: The Mach Approach + Technical Report CMU-CS-88-106, + + + A. + Tevanian + + + + Department of Computer Science, Carnegie-Mellon + University + +
+ Pittsburgh + PA +
+
+ + December 1987 +
+
+
+
diff --git a/ru_RU.KOI8-R/books/design-44bsd/fig1.eps b/ru_RU.KOI8-R/books/design-44bsd/fig1.eps new file mode 100644 index 0000000000..d1b1976b14 --- /dev/null +++ b/ru_RU.KOI8-R/books/design-44bsd/fig1.eps @@ -0,0 +1,340 @@ +%!PS-Adobe-2.0 EPSF-1.2 +%%Title: fig1.ps +%%Creator: groff version 1.15 +%%CreationDate: Fri Jun 30 09:50:25 2000 +%%For:sheldonh sheldonh +%%Pages: 1 +%%DocumentFonts: +%%BoundingBox: 71 687 446 781 +%%BeginPreview: 376 93 1 93 +% 0000000000003fffffe00000000000000000000000000000000000000000000000000000001ffffff8000000000000 +% 000000000007c000001f000000000000000000000000040000000000000000000000000003e0000007c00000000000 +% 00000000007800000000f0000000000000000000000000000000000000000000000000001c00000000380000000000 +% 000000000380000000000e00000000000000000000000180000000000000000000000000e000000000070000000000 +% 000000000c00000000000180000000000000000006496dc0000000000000000000000003000000000000e000000000 +% 000000003000000000000060000000000000000002ca6d0000000000000000000000000c0000000000001800000000 +% 0000000040000000002000100000000000000000035469000000000000000000000000300000000008000400000000 +% 00000001800080100860000c00000000000000000374c9000000000000000000000000400040040218000200000000 +% 000000020000f395ef600002000000000000000002674b000000000000000000000000800079c57bd8000100000000 +% 0000000400009893e9200001000000000000000000000000000000000000000000000100004c44fa48000080000000 +% 0000000800008a9309200001800000000000000000000000000000000000000000000200004544c248000040000000 +% 00000f0800008e932920000080000000000000000000000000000000000000000003c200004744ca480000400003c0 +% 00000fe80000f3d9c930000080000000000000000000000000000000000000000003fc000079e6724c0000200003fc +% fffffff80000800000000000be7c78f9f1e3e7c78f9f1e3e7c78f9f1e3c7cf8f1f3ffc00004000000000003ffffffc +% 00000c0800008000000000008000000000000000000000000000000000000000000384000040000000000020000380 +% 00000008000590000000000080000000000000000000000000000000000000000000020001c4000000000040000000 +% 00000008000795a79fef000080000000000000000000000000000000000000000000020001e569ef7f800040000000 +% 000000040004d2183f8c00010000000000000000000000000000000000000000000001000134861f66000080000000 +% 000000020004521830e70002000000000000000000000000000000000000000000000080011486183b800080000000 +% 000000010004533cb32900040000000000000000000000000000000000000000000000c00114cf394c800300000000 +% 00000000c00799e71def001800000000000000000000000000000000000000000000002001e679ce7f800400000000 +% 0000000030040000000000600000000000000000000000000000000000000000000000180100000000001800000000 +% 000000000c040000000001800000000000000000000000000000000000000000000000060100000000006000000000 +% 00000000030c000000000e00000000000000000000000000000000000000000000000001c300000000038000000000 +% 0000000000f000000000700000000000000000000000000000000000000000000000000038000000001c0000000000 +% 00000000000f00000007800000000000000000000000000000000000000000000000000007c0000003e00000000000 +% 000000000000ff800ff80000000000000000000000000000000000000000000000000000003fe007fc000000000000 +% 000000000000007ff000000000000000000000000000000000000000000000000000000000001ff800000000000000 +% 0000000000000008000000000000000000000000000000000000000000000000000000000000018000000000000000 +% 0000000000000008000000000000000000000000000000000000000000000000000000000000018000000000000000 +% 0000000000000008000000000000000000000000000000000000000000000000000000000000018000000000000000 +% 0000000000000008000000000000000000000000000000000000000000000000000000000000018000000000000000 +% 000000000000000800000000000000000000000000000000000000000000000000000000000003c000000000000000 +% 000000000000000800000000000000000000000000000000000000000000000000000000000003c000000000000000 +% 000000000000000800000000000000000000000000000000000000000000000000000000000003c000000000000000 +% 000000000000000800000000000000000000000000000000000000000000000000000000000003c000000000000000 +% 0000000000000008000000000000000000000000000000000000000000000000000000000000008000000000000000 +% 0000000000000008000000000000000000000000000000000000000000000000000000000000008000000000000000 +% 0000000000000008006000000000000000000000000000000000000000000000000000000000008000000000000000 +% 000000000000000800e002000000000000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000008008002000000000000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000008008007000000000000000000000000000000000000000000000000000000008000000000000000 +% 000000000000000803def7800000000000000000000000000000000000000000000000000000008000000000000000 +% 00000000000000080122c4000000000000000000000000000000000000000000000000000000008000000000000000 +% 00000000000000080146c6000000000000000000000000000000000000000000000000000000008000000000000000 +% 000000000000000801448f000000000000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000008037889800000000000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000008020000000000000000000000000000000000000000000000000000000000008000000000000000 +% 00000000000000080a0000000000000000000000000000000000000000000000000000000000008000000000000000 +% 00000000000000080c0000000000000000000000000000000000000000000000000000000000008000000000000000 +% 0000000000000008000000000000000000000000000000000000000000000000000000000000008000000000000000 +% 0000000000000008000000000000000000000000000000000000000000000000000000000000008000000000000000 +% 0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000008000000000000000000000000000000000000000000000000000000000000008000000000000000 +% 0000000000000008000000000000000000000000000000000000000000000000000000000000008000000000000000 +% 000000000000003c000000000000000000000000000000000000000000000000000000000000008000000000000000 +% 000000000000003c000000000000000000000000000000000000000000000000000000000000008000000000000000 +% 000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000 +% 000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000018000000000000000000000000000000000000000000000000000000000000008000000000000000 +% 0000000000000018000000000000000000000000000000000000000000000000000000000000008000000000000000 +% 0000000000000018000000000000000000000000000000000000000000000000000000000000008000000000000000 +% 0000000000000018000000000000000000000000000000000000000000000000000000000000008000000000000000 +% 000000000000007fe000000000000000000000000000007fe0000000000000000000000000001ff800000000000000 +% 000000000000ff801ff0000000000000000000000000ff801ff000000000000080000000003fe007fc000000000000 +% 00000000000f0000000f80000000000000000000000f0000000f8000000000000000000007c0000003e00000000000 +% 0000000000f000000000700000000000000000000070000000007000000000003000000038000000001c0000000000 +% 000000000300000000000e000003bc73e47000000380000000000e000000073db8000001c000000000038000000000 +% 000000000c00008240800180000598b424b000000c0000824080018000000b19a00000060000002080006000000000 +% 000000003000008040800060000f19e839e00000300000804080006000001e19200000180000002000001800000000 +% 00000000c0000080408000180008190839000000c00000804080001800001019200000200000002000000400000000 +% 0000000100001ef647800004000f49ef11e0000100001ef64780000400001e49600000c0039a5fbd8f000300000000 +% 00000002000020924880000200000000000000020000209248800002000000000000008000a148a69f000080000000 +% 000000040000209248800001000000000000000400002092488000010000000000000100012148a298000080000000 +% 00000008000032924c8000008000000000000f88000032924c800000800000000003c200023348a699000040000000 +% 0000000800001c9267c000008000000000000ff800001c9267c00000800000000003fe0003deeebc8e000040000000 +% 000000080000000000000000bffffffffffffff80000000000000000be7cf1e7cf9ffc000000000000000020000000 +% 0000000800000000000000008000000000000e08000000000000000080000000000384000000000000000020000000 +% 0000000800041000000000008000000000000008000410000000000080000000000004000104000000000020000000 +% 00000008000795a79fef00008000000000000008000795a79fef0000800000000000020001e569ef7f800040000000 +% 000000080004d2183f8c000180000000000000080004d2183f8c000180000000000002000134861f66000040000000 +% 000000040004521830e7000100000000000000040004521830e700010000000000000100011486183b800080000000 +% 000000020004533cb329000200000000000000020004533cb329000200000000000000800114cf394c800100000000 +% 00000001000799e71def000c0000000000000001800799e71def000c000000000000004001e679ce7f800200000000 +% 00000000c0040000000000100000000000000000400400000000001000000000000000200100000000000400000000 +% 00000000300400000000006000000000000000003004000000000060000000000000001c0100000000001800000000 +% 000000000c0c00000000018000000000000000000c0c0000000001800000000000000003030000000000e000000000 +% 000000000380000000000e0000000000000000000380000000000e000000000000000000e000000000070000000000 +% 00000000007800000000f0000000000000000000007800000000f00000000000000000001c00000000380000000000 +% 0000000000078000001f0000000000000000000000078000001f0000000000000000000003e0000007c00000000000 +% 0000000000007ffdffe00000000000000000000000007ffdffe000000000000000000000001ffffff8000000000000 +% 0000000000000002000000000000000000000000000000020000000000000000000000000000000000000000000000 +%%EndImage +%%EndPreview +save +countdictstack +mark +newpath +/showpage {} def +%%EndProlog +%%Page 1 1 +%%+ font Times-Roman +/setpacking where{ +pop +currentpacking +true setpacking +}if +/grops 120 dict dup begin +/SC 32 def +/A/show load def +/B{0 SC 3 -1 roll widthshow}bind def +/C{0 exch ashow}bind def +/D{0 exch 0 SC 5 2 roll awidthshow}bind def +/E{0 rmoveto show}bind def +/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def +/G{0 rmoveto 0 exch ashow}bind def +/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def +/I{0 exch rmoveto show}bind def +/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def +/K{0 exch rmoveto 0 exch ashow}bind def +/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def +/M{rmoveto show}bind def +/N{rmoveto 0 SC 3 -1 roll widthshow}bind def +/O{rmoveto 0 exch ashow}bind def +/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def +/Q{moveto show}bind def +/R{moveto 0 SC 3 -1 roll widthshow}bind def +/S{moveto 0 exch ashow}bind def +/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def +/SF{ +findfont exch +[exch dup 0 exch 0 exch neg 0 0]makefont +dup setfont +[exch/setfont cvx]cvx bind def +}bind def +/MF{ +findfont +[5 2 roll +0 3 1 roll +neg 0 0]makefont +dup setfont +[exch/setfont cvx]cvx bind def +}bind def +/level0 0 def +/RES 0 def +/PL 0 def +/LS 0 def +/MANUAL{ +statusdict begin/manualfeed true store end +}bind def +/PLG{ +gsave newpath clippath pathbbox grestore +exch pop add exch pop +}bind def +/BP{ +/level0 save def +1 setlinecap +1 setlinejoin +72 RES div dup scale +LS{ +90 rotate +}{ +0 PL translate +}ifelse +1 -1 scale +}bind def +/EP{ +level0 restore +showpage +}bind def +/DA{ +newpath arcn stroke +}bind def +/SN{ +transform +.25 sub exch .25 sub exch +round .25 add exch round .25 add exch +itransform +}bind def +/DL{ +SN +moveto +SN +lineto stroke +}bind def +/DC{ +newpath 0 360 arc closepath +}bind def +/TM matrix def +/DE{ +TM currentmatrix pop +translate scale newpath 0 0 .5 0 360 arc closepath +TM setmatrix +}bind def +/RC/rcurveto load def +/RL/rlineto load def +/ST/stroke load def +/MT/moveto load def +/CL/closepath load def +/FL{ +currentgray exch setgray fill setgray +}bind def +/BL/fill load def +/LW/setlinewidth load def +/RE{ +findfont +dup maxlength 1 index/FontName known not{1 add}if dict begin +{ +1 index/FID ne{def}{pop pop}ifelse +}forall +/Encoding exch def +dup/FontName exch def +currentdict end definefont pop +}bind def +/DEFS 0 def +/EBEGIN{ +moveto +DEFS begin +}bind def +/EEND/end load def +/CNT 0 def +/level1 0 def +/PBEGIN{ +/level1 save def +translate +div 3 1 roll div exch scale +neg exch neg exch translate +0 setgray +0 setlinecap +1 setlinewidth +0 setlinejoin +10 setmiterlimit +[]0 setdash +/setstrokeadjust where{ +pop +false setstrokeadjust +}if +/setoverprint where{ +pop +false setoverprint +}if +newpath +/CNT countdictstack def +userdict begin +/showpage{}def +}bind def +/PEND{ +clear +countdictstack CNT sub{end}repeat +level1 restore +}bind def +end def +/setpacking where{ +pop +setpacking +}if +grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 +def/PL 792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron +/scaron/zcaron/Ydieresis/trademark/quotesingle/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent +/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen +/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon +/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O +/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/circumflex +/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y +/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft +/guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl +/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut +/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash +/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen +/brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft +/logicalnot/minus/registered/macron/degree/plusminus/twosuperior +/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior +/ordmasculine/guilsinglright/onequarter/onehalf/threequarters +/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE +/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex +/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis +/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn +/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla +/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis +/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash +/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def +/Times-Roman@0 ENC0/Times-Roman RE/Times-Italic@0 ENC0/Times-Italic RE +BP +/F0 12/Times-Italic@0 SF(fork)141.534 58.984 Q 68.832 27.216 134.424 +90.408 DE .4 LW ST/F1 12/Times-Roman@0 SF(process)116.43 97.432 Q(child) +121.632 89.368 Q 301.968 88.824 298.368 88.824 DL 308.808 88.824 305.208 +88.824 DL 315.576 88.824 311.976 88.824 DL 322.416 88.824 318.816 88.824 +DL 329.184 88.824 325.584 88.824 DL 336.024 88.824 332.424 88.824 DL +342.792 88.824 339.192 88.824 DL 349.632 88.824 346.032 88.824 DL +349.632 88.824 MT -7.2 1.8 RL 0 -3.6 RL CL BL 349.632 88.824 MT -7.2 1.8 +RL 0 -3.6 RL CL ST 68.832 27.216 262.44 90.408 DE ST(process)244.374 +97.432 Q(child)249.576 89.368 Q(process)365.982 97.432 Q(zombie)364.728 +89.368 Q 383.976 72.408 383.976 76.008 DL 383.976 65.928 383.976 69.528 +DL 383.976 59.448 383.976 63.048 DL 383.976 52.968 383.976 56.568 DL +383.976 46.488 383.976 50.088 DL 383.976 40.008 383.976 43.608 DL +383.976 40.008 MT 1.8 7.2 RL -3.6 0 RL CL BL 383.976 40.008 MT 1.8 7.2 +RL -3.6 0 RL CL ST 68.832 27.216 384.048 90.408 DE ST 72 24.816 99.216 +24.816 DL 99.216 24.816 MT -7.2 1.8 RL 0 -3.6 RL CL BL 99.216 24.816 MT +-7.2 1.8 RL 0 -3.6 RL CL ST 445.608 24.816 418.392 24.816 DL 445.608 +24.816 MT -7.2 1.8 RL 0 -3.6 RL CL BL 445.608 24.816 MT -7.2 1.8 RL 0 +-3.6 RL CL ST 228.024 88.824 170.424 88.824 DL 228.024 88.824 MT -7.2 +1.8 RL 0 -3.6 RL CL BL 228.024 88.824 MT -7.2 1.8 RL 0 -3.6 RL CL ST F0 +-.24(ex)180.12 84.616 S(ecve).24 E 174.024 24.816 170.424 24.816 DL +181.296 24.816 177.696 24.816 DL 188.64 24.816 185.04 24.816 DL 195.984 +24.816 192.384 24.816 DL 203.256 24.816 199.656 24.816 DL 210.6 24.816 +207 24.816 DL 217.872 24.816 214.272 24.816 DL 225.216 24.816 221.616 +24.816 DL 232.56 24.816 228.96 24.816 DL 239.832 24.816 236.232 24.816 +DL 247.176 24.816 243.576 24.816 DL 254.448 24.816 250.848 24.816 DL +261.792 24.816 258.192 24.816 DL 269.136 24.816 265.536 24.816 DL +276.408 24.816 272.808 24.816 DL 283.752 24.816 280.152 24.816 DL +291.096 24.816 287.496 24.816 DL 298.368 24.816 294.768 24.816 DL +305.712 24.816 302.112 24.816 DL 312.984 24.816 309.384 24.816 DL +320.328 24.816 316.728 24.816 DL 327.672 24.816 324.072 24.816 DL +334.944 24.816 331.344 24.816 DL 342.288 24.816 338.688 24.816 DL +349.632 24.816 346.032 24.816 DL 349.632 24.816 MT -7.2 1.8 RL 0 -3.6 RL +CL BL 349.632 24.816 MT -7.2 1.8 RL 0 -3.6 RL CL ST(wait)236.838 20.608 +Q -.24(ex)315.456 84.616 S(it).24 E 131.976 76.008 131.976 40.008 DL +131.976 76.008 MT -1.8 -7.2 RL 3.6 0 RL CL BL 131.976 76.008 MT -1.8 +-7.2 RL 3.6 0 RL CL ST 68.832 27.216 134.424 25.608 DE ST F1(process) +116.43 32.632 Q(parent)118.638 24.568 Q 68.832 27.216 384.048 25.608 DE +ST(process)365.982 32.632 Q(parent)368.19 24.568 Q EP +end +%%Trailer +cleartomark +countdictstack exch sub { end } repeat +restore +%%EOF diff --git a/ru_RU.KOI8-R/books/design-44bsd/fig2.eps b/ru_RU.KOI8-R/books/design-44bsd/fig2.eps new file mode 100644 index 0000000000..84581020db --- /dev/null +++ b/ru_RU.KOI8-R/books/design-44bsd/fig2.eps @@ -0,0 +1,1476 @@ +%!PS-Adobe-2.0 EPSF-1.2 +%%Title: /b/archive/c02/fig2.test.ps +%%Creator: XV Version 3.10a Rev: 12/29/94 (jp-extension 5.3.3 + PNG patch 1.2d) - by John Bradley +%%CreationDate: Nov 2 22:04 +%%For:sheldonh sheldonh +%%Pages: 1 +%%DocumentFonts: +%%BoundingBox: 187 308 426 484 +%%BeginPreview: 239 176 1 176 +% 000000000000000000000000000000000000000000aa8000000000000000 +% 000000000000000000000000000000000000000004001000000000000000 +% 000000000000000000000000000000000000000008000800000000000000 +% 000000000000000000000000000000000000000020000200000000000000 +% 000000000000000000000000000000000000000080000080000000000000 +% 000000000000000000000000000000000000000080000080000000000000 +% 000000000000000000000000000000000000000200000000000000000000 +% 000000000000000000000000000000000000000200000000000000000000 +% 000000000000000000000000000000000000000200000020000000000000 +% 000000000000000000000000000000000000000400000010000000000000 +% 000000000000000000000000000000000000000800000000000000000000 +% 000000000000000000000000000000000000000000000000000000000000 +% 000000000000000000000000000000000000000800000008000000000000 +% 000000000000000000000000000000000000000000000000000000000000 +% 000000000000000000000000000000000000000800000008000000000000 +% 000000000000000000000000000000000000000000000000000000000000 +% 000000000000000000000000000000000000000800000008000000000000 +% 000000000000000000000000000000000000000000000000000000000000 +% 000000000000000000000000000000000000000800000008000000000000 +% 000000000000000000000000000000000000000000000000000000000000 +% 000000000000000000000000000000000000000800000008000000000000 +% 000000000000000000000000000000000000000000000000000000000000 +% 000000000000000000000000000000000000000800000000000000000000 +% 000000000000000000000000000000000000000400000010000000000000 +% 000000000000000000000000000000000000000200000020000000000000 +% 000000000000000000000000000000000000000000000000000000006000 +% 000000000000000000000000000000000000000200000000000000002000 +% 00000000000000000000000000000000076c7804000000001d75ddf4fd00 +% 00000000000000000000000000000000037a68088000008008be8dbe6800 +% 00000000000000000000000000000000037c6010000000100d36cdb66600 +% 00000000000000000000000000000000036e6020280008080636cdb66600 +% 0000000000000000000000000000000003726040040010040636cdb66700 +% 0000000000000000000000000000000003fae08002aa8002023eefbeeb80 +% 000000000000000000000000000000000000010000000001000000000000 +% 000000000000000000000000000000000000020000000000800000000000 +% 000000000000000000000000000000000000040000000000400000000000 +% 000000000000000000000000000000000000080000000000080000000000 +% 000000000000000000000000000000000000100000000000080000000000 +% 000000000000000000000000000000000000200000000000020000000000 +% 000000000000000000000000000000000000400000000000010000000000 +% 00000000000000000000000000000000000080000000000000a000aa8000 +% 00000000000000000000000000000000000000000000000000700c00c000 +% 000000000000000000000000000000000002000000000000007820002800 +% 000000000000000000000000000000000040000000000000007c40000400 +% 0000000000000000000000000000000000b8000000000000003e80000200 +% 000000000000000000000000000001d500f0000000000000000700000100 +% 00000000000000000000000000000a00a0e0000000000000000200000080 +% 0000000000000000000000000000100011c0000000000000000400000000 +% 000000000000000000000000000020000b80000000000000000800000000 +% 000000000000000000000000000080000200000000000000000800000000 +% 000000000000000000000000000000000000000000000000000800000020 +% 000000000000000000000000000000000000000000000000001000000000 +% 000000000000000000000000000200000080000000000000000000000000 +% 000000000000000000000000000400000040000000000000001000000010 +% 000000000000000000000000000800000020000000000000002000000000 +% 000000000000000000000000000000000000000000000000000000000010 +% 000000000000000000000000000800000000000000000000002000000000 +% 000000000000000000000000001000000010000000000000000000000010 +% 000000000000000000000000000000000000000000000000002000000000 +% 000000000000000000000000001000000010000000000000000000000010 +% 000000000000000000000000002000000008000000000000000000000000 +% 000000000000000000000000000000000000000000000000001000000010 +% 000000000000000000000000002000000008000000000000000000000020 +% 000000000000000000000000000000000010000000000000000000000000 +% 000000000000000000000000000000000000000000000000000800000000 +% 000000000000000000000000001000000010000000000000000400000040 +% 000000000000000000000000000000000000000000000000000200000080 +% 000000000000000000000000000000000000000000000000000200000100 +% 000000000000000000000000000800000020000000000000000080000200 +% 000000000000000000000000000000000020000000000000000080000400 +% 00000000000000000000000000020000000800e180000000000020000800 +% 00000000000000000000001dc00400000000006100000000000010001000 +% 00000000000000000000201ba00a00000082006bba00000000000a808000 +% 00000000000000000007f73fc00100000101006d9b0000000000005c0000 +% 0000000000000000000c6c99802080000200806d9b000000000000000000 +% 0000000000000000000e6599800040000400406d9b000000000000000000 +% 0000000000000000000b6b9980800800280020699b000000000000000000 +% 000000000000000000016d9980000501c00010799b000000000000000000 +% 0000000000000000000e2ebb880000aa0000080000000000000000000000 +% 000000000000000000000000000000100000040000000000000000000000 +% 000000000000000000000000200000000000020000000000000000000000 +% 000000000000000000000000000000100000010000000000000000000000 +% 000000000000000000000000800000008000008000000000000000000000 +% 000000000000000000000001000000118000000000000000000000000000 +% 00000000000000000000000200000003baee800800000000000000000000 +% 000000000000000000000004000000119b66c00800000000000000000000 +% 000000000000000000000008000000019b66c00200000000000000000000 +% 000000000000000000000010000000119b66c00000000000000000000000 +% 00000000000000000aa00020000000019b668000a00aa800000000000000 +% 0000000000000000401801c0000000119b778000e0100400000000000000 +% 0000000000000002000203800000002800060000e0a00080000000000000 +% 0000000000000004000007c0000000380006000071000040000000000000 +% 000000000000000800008f8000000038000e00003a000008000000000000 +% 000000000000001000000c0000000038000000000c000008000000000000 +% 000000000000002000000800000000380000000008000000000000000000 +% 000000000000004000000000000000100000000010000000000000000000 +% 000000000000008000000800000000100000000020000002000000000000 +% 0000000000000000000004000000015d0000000000000001000000000000 +% 00000000000000000000020000000a00a000000000000000800000000000 +% 000000000000010000000000000020001000000040000000000000000000 +% 000000000000000000000200000080000800000080000000800000000000 +% 000000000000000000000100000100000400000080000000000000000000 +% 000000000000020000000000000200000200000080000000800000000000 +% 000000000000000000000100000400000100000000000000400000000000 +% 000000000000020000000000000800000080000080000000000000000000 +% 000000000000000000000100000800000000000080000000400000000000 +% 000000000000020000000000000800000000000080000000000000000000 +% 000000000000000000000100001000000000000000000000000000000000 +% 000000000000020000000000000000000020000080000000800000000000 +% 000000000000010000000000000000000000000000000000800000000000 +% 000000000000000000000200002000000020000000000000800000000000 +% 000000000000010000000000000000000000000040000000000000000000 +% 0000c0003030008000000000002000000000000020000000000000000000 +% 0000c0003030000000000400000000000010000000000000000000000000 +% fa38ebee32b2008000000800002000000000000020000002003800000000 +% db64d36c35b4000000001400002000000010000050000004001800000000 +% db28e36e3cb8022000002000002000000020000088000008801b80000000 +% db60f3673c3c041000004000000000000000000004000010001e00000000 +% db22fb6b3e3e080a00008000002000000020000002000020201e00000000 +% dbbcdbe73736100100010040001000000000000400400040001b80000000 +% 0000000000002000a0080028000800000000000800280a80081880000000 +% 00000000000040001d40000000080000004000000005d800001f80000000 +% 000000000000800000000000000800000080000000000000020000000000 +% 000000000001000001000002000400000000004000004000000000000000 +% 000000000002000000000000800200000200008000000000008000000000 +% 000000000004000001000000000100000000010000004000000000000000 +% 0000000000080000003800003000800008000000000c0000002000000000 +% 0000000000100000011800003000400010000000000c4000001000000000 +% 0000000000200000001abba2ba002800a000080003ac0000000800000000 +% 0000000001400000011859e5bc00050100001000030c4000000500000000 +% 00000020038000000018898fbe0000aa00002000030c0000000380020000 +% 0000071403c00000011e598c3700000000000000018c40000007c0556000 +% 0000280283800000001ad98eb980000000008000008c0000000382800800 +% 0000c00047000000011bd9873f40000000000000011c40000001c4000100 +% 000280000e00000000000000002000000000000000000000000028000080 +% 000200000c00000001000000000000000000000000004000000030000040 +% 00080000000000000380000000000000000000000001e000000020000020 +% 00080000000000000780000000000000000000000001c000000000000010 +% 00080000000000000380000000000000000000000000c000000080000008 +% 00100000000000000300000000000000000000000000c000000100000000 +% 002000000080000003000000000000000000000000008000000000000008 +% 00000000000000000300000000000000000000000000c000000000000004 +% 00200000000000000aa000000000000000000000000aa000000200000002 +% 004000000040000010040000000000000000000000401400000000000000 +% 000000000000000080008000000000000000000000800280000000000002 +% 004000000000000100004000000000000000000004000080000400000000 +% 008000000020000200002000000000000000000008000020000000000002 +% 000000000000000800001000000000000000000010000010000400000000 +% 008000000020000800000800000000000000000020000008000000000002 +% 004000000000001000000400000000000000000040000000000400000000 +% 000000000000002000000200000000000000000080000000000200000002 +% 004000000040004000000000000000000000000000000004000000000000 +% 000000000000008000000000000000000000000080000002000200000000 +% 000000000000000000000100000000000000000100000000000000000004 +% 002000000080008000000080000000000000000000000002000200000008 +% 001000000000000000000000000000000000000100000001000100000000 +% 000800000000008000000080000000000000000200000000000080000008 +% 000800000000010000000080000000000000000100000001000000000010 +% 000800000200008000000080000000000000000200000000000020000020 +% 000400000400010000000000000000000000000000000001000020000040 +% 000080000800008000000080000000000000000200000000000008000080 +% 000080000000000000000000000000000000000000000001000004000100 +% 000020008000008000000080000000000000000200000000000002800a00 +% 000004040000000000000000000000000000000100000001000000407000 +% 000000a800000080000000800000000000000000800000020000000a8000 +% 000000000000000000000100000000000000000000000000000000000000 +% 000000000000000000000200000000000000000080000002000000000000 +% 000000000000000000000200000000000000000040000004000000000000 +% 000000000000002000000200000000000000000000000008000000000000 +% 000000000000001000000400000000000000000000000008000000000000 +% 000000000000000800000800000000000000000020000020000000000000 +% 000000000000000400001000000000000000000008000040000000000000 +% 00000000000000020000200000000000000000000a000080000000000000 +% 000000000000000180018000000000000000000001000100000000000000 +% 0000000000000000200a0000000000000000000000a00a00000000000000 +% 000000000000000005500000000000000000000000174000000000000000 +%%EndImage +%%EndPreview +save +countdictstack +mark +newpath +/showpage {} def +/setpagedevice {pop} def +%%EndProlog +%%Page 1 1 +%%DocumentFonts: + + +% remember original state +/origstate save def + +% build a temporary dictionary +20 dict begin + +% define string to hold a scanline's worth of data +/pix 240 string def + +% define space for color conversions +/grays 240 string def % space for gray scale line +/npixls 0 def +/rgbindx 0 def + +% lower left corner +186 308 translate + +% size of image (on paper, in 1/72inch coords) +239.97600 176.97600 scale + +240 177 8 % dimensions of data +[240 0 0 -177 0 177] % mapping matrix +{currentfile pix readhexstring pop} +image + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbbbffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffdd8866777799bb9977777788dd +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffbb6688ddffffffffffffffffffdd88 +66ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffee7788ffffffffffffffffffffffffffff +ee7777eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffcc55eeffffffffffffffffffffffffffffff +ffffdd66ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff9977ffffffffffffffffffffffffffffffffff +ffffffee66ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffcc77ffffffffffffffffffffffffffffffffffff +ffffffffff66ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffee55ffffffffffffffffffffffffffffffffffffff +ffffffffffee66eeffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff66eeffffffffffffffffffffffffffffffffffffff +ffffffffffffdd77ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffbb99ffffffffffffffffffffffffffffffffffffffff +ffffffffffffff77ddffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffff55ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffee66ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffcc99ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffff88ddffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffff77eeffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffdd88ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffbbaaffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffbbbbffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff99ccffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffaabbffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffbbbbffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffbbbbffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff99bbffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffbbaaffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffee77ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff66ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffdd88ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffaaaaffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffff88ddffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffff66ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffff99aaffffffffffffffffffffffffffffffffffffffff +ffffffffffffff88bbffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff66eeffffffffffffffffffffffffffffffffffffff +ffffffffffffee77ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffff1122ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff7b50ffffffffffffffffffffffffffffffffffffff +ffffffffffff55eeffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffff4477ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff660000660000cc222288 +ff6600007711eeffffffffffffff6699aa88ffffffffffffffffffffffffffffffffffff +ffffffffff77ccffffffffffffffffff550011cc22556600007711bb770088ff66000066 +0000660000770099ff550000550011991166ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff00002200ffbb +ffff00007700ccffffffffffff77bbffff9988ffffffffffffffffffffffffffffffffff +ffffffff779966ccffffffffffffffffee1144ff99ddff0011dd0011cc0011ffff0000ff +0000ff0011ee0011ffff0000dd1133ee77ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff0000110055ee +ffff0000ffffffffffffffff77ccffffffffaa77eeffffffffffffffffffffffffffffff +ffffee55ccffee77aaffffffffffffffff6600dd88ffff0000ff0000ff0000ffff0000ff +0000ff0000ff0000ffff0000ff880033eeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff0000cc440033 +ffff0000ffffffffffffee44ccffffffffffffcc66aaffffffffffffffffffffffffffff +ff9966eeffffffff8888ffffffffffffffdd0044bbffff0000ff0000ff0000ffff0000ff +0000ff0000ff0000ffff0000ffff2200ccffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff000077ddcc00 +ffff0000ffffffffffee66ddffffffffffffffffff9966aaffffffffffffffffffffee99 +55bbffffffffffffffaa77eeffffffffffff4422ffffff0000ff0000ff0000ffff0000ff +0000ff0000ff0000ffff0000ffaaaa1133ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff550044002233111166 +ffbb0000ddffffffdd66eeffffffffffffffffffffffffaa777777aabbbbbbaa777777cc +ffffffffffffffffffffcc66eeffffffffffaa99ffffaa0000cc0000dd000055ff550044 +0022710000cc0000ccaa0000aa44ee440077ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffcc44eeffffffffffffffffffffffffffffffffeebbbbaabbbbffffffff +ffffffffffffffffffffffee55ccffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffcc77ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffff7799ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffbb77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffff9977ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffff9966ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffcc55eeffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff9999ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffee66ccffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7799ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffee77aaffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff7799ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff8888ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +77ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffaa77eebfbfffffffffffffffffffffcc +776677666677776699eeffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee66 +ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffcc60161ceeffffffffffffee777799 +eeffffffffffffffcc7777bbffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee55cc +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffee27000028ffffffffff7777ddffff +ffffffffffffffffffffff9966ccffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7bee66eeff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffdd300b00006dffffee66ccffffffff +ffffffffffffffffffffffffee7799ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd180929eeffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffaf300708bfcc55eeffffffffff +ffffffffffffffffffffffffffff9977ffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffee997777776677777799eeffffffffffffff3000000dcfffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffaf2d0569ffffffffffffff +ffffffffffffffffffffffffffffffcc77ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffff996677ccffffffffffffffcc776699ffffffff6d00002058ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffee46afffffffffffffff +ffffffffffffffffffffffffffffffff9999ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffbb55bbffffffffffffffffffffffffffbb55bbffdd0f0858eeffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff55eeffffffffffffffff +ffffffffffffffffffffffffffffffffff77bbffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff7788ffffffffffffffffffffffffffffffffff8877191dddffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffbb99ffffffffffffffffff +ffffffffffffffffffffffffffffffffffff66ffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffee55ccffffffffffffffffffffffffffffffffffffffcc32eeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffff55ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff99aaffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffee66eeffffffffffffffffffffffffffffffffffffffffffee55ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffaaaaffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff66ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff77ccffffffffffffffffffffffffffffffffffffffffffffffcc77ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff88ddffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff77bbffffffffffffffffffffffffffffffffffffffffffffffffffaa88ffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffdd88ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffee77ffffffffffffffffffffffffffffffffffffffffffffffffffffff77eeffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffbbaaffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff77ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff77ddffffffffffffffffffffffffffffffffffffffffffffffffffffffdd77ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffaabbffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff77ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ee77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77eeffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff77eeffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff77ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +99ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcc99ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff77ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff77ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff77ddffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff77ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee +77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffbbbbffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff77ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb +bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff99bbffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffcc99ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff66ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb +bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffcc99ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb +bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff77eeffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff77eeffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb +aaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff88ccffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcc99ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff77ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee +77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffff66eeffffffffffffffffff +ffffffffffffffffffffffffffffffffffff77ccffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffdd77ffffffffffffffffff +ffffffffffffffffffffffffffffffffffee77ffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff77ccffffffffffffffff +ffffffffffffffffffffffffffffffffff66ddffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +99bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaaaaffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff55eeffffffffffffff +ffffffffffffffffffffffffffffffff77ccffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ee77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffee66eeffffffffffff +ffffffffffffffffffffffffffffff9999ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff77ddffffffffffffffffffffffffffffffffffffffffffffffffffffffbb30ddffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffee55ccffffffffff +ffffffffffffffffffffffffffff7799ffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffee33aaffffffffffffffffffffffffffffffffffffffffffffffffffff66ee55ccffff +ffffffffffffffffffbb0000ffffffff1122ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7788ffffffff +ffffffffffffffffffffffffdd66ccffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffff77ffffffffffffffff7700118877001188ffffffffffffffff +ff776699ffffffffffffffffffffffffffffffffffffffffffffffffff99aaffff77bbff +ffffffffffffffffffff0000ffffffff4477ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb6699ffff +ffffffffffffffffffffdd7777eeffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffff6600ffffffffffffffff0000889900008899ffffffffffffffff +77bbff77ccffffffffffffffffffffffffffffffffffffffffffffffbb77ffffffff7799 +ffffffffffffffffffff00004422cc550000ff660000770099ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb7777 +aaeeffffffffffcc886688eeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffcc22228877000044ee550022aaff4400007744000077ffffffffffffffff77 +ccffffff66ccffffffffffffffffffffffffffffffffffffffffffcc77ffffffffffff99 +88ffffffffffffffffff0000dd0055ff0000ffff0011ee0011ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +bb77777777777799ddffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffff2200ffbbff0000ff8822ff8811ffff0000ffff0000ffffffffffffffee55cc +ffffffffff7799ffffffffffffffffffffffffffffffffffffff9977ffffffffffffffff +9977ffffffffffffffff0000ff0000ff0000ffff0000ff0000ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffff110055eeff0000ffcc77ff8800ffff0000ffff0000ffffffffffffee66ddff +ffffffffffff9977eeffffffffffffffffffffffffffffffee7799ffffffffffffffffff +ffcc77eeffffffffffff0000ff0000ff0000ffff0000ff0000ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffcc440033ff0000ffee66aa0000ffff0000ffff0000ffffffffffee66eeffff +ffffffffffffffdd7788ffffffffffffffffffffffffff7777ddffffffffffffffffffff +ffffcc55eeffffffffff0000ee0044ff0000ffff0000ff0000ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffff77ddcc00ff0000dd3300ff0000ffff0000ffff0000ffffffffcc55eeffffff +ffffffffffffffffffbb777799eeffffffffffee997777ccffffffffffffffffffffffff +ffffffee66ddffffffff44220022ccaa0000ffbb0000cc0000ccffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffff55111166ff330099440044660099bb000077bb000077ffffcc77eeffffffff +ffffffffffffffffffffffffcc77776638667777ccffffffffffffffffffffffffffffff +ffffffffee55ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffcc77ffffffffffff +ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff +ffffffffffff77bbffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff9977ffffffffffffff +ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff +ffffffffffffff7799ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffff9988ffffffffffffffff +ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff +ffffffffffffffff9988ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffff9999ffffffffffffffffff +ffffffffffffffffffffffffffffffff77ffffffff77ffffffffffffffffffffffffffff +ffffffffffffffffff9977ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff7799ffffffffffffffffffff +ffffffffffffffffffffffffffffffff77ffffff6600ffffffffffffffffffffffffffff +ffffffffffffffffffffcc77eeffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff77bbffffffffffffffffffffff +ffffffffffffffffffffffffffffffff77ffff770000446600007711bb770088ff660000 +4422ccffffffffffffffffcc55eeffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffff77ccffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff77ffffff0000ffff0011dd0011cc0011ffff0022 +ee0055ffffffffffffffffffee66ddffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffee55ccffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff77ffffff0000ffff0000ff0000ff0000ffff0000 +ff0000ffffffffffffffffffffee55ccffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffee66ddffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff77ffffff0000ffff0000ff0000ff0000ffff0000 +ff0000ffffffffffffffffffffffff77bbffddffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee99777766 +667777aaeeffffffffffffffffffffff9fffee66eeffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff77ffffff0000ddff0000ff0000ff0000ffff0000 +ee0033ffffffffffffffffffffffffff77730abfffffffffffffffffffdd997777777777 +77bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffee887777bbffffff +ffffeeaa777799ffffffffffffffffaf083a55eeffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff77ffffff330099aa0000cc0000dd000055ff0000 +3311ccffffffffffffffffffffffffffbf0f0022ffffffffffffee886688ccffffffffff +eeaa7777bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff9966ddffffffffffff +ffffffffffffbb66bbffffffffffee2200005affffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffaf582a58ddffffffffffffffffffffffffffffff0000 +ffffffffffffffffffffffffffffffff3700000058ffffffee7777ddffffffffffffffff +ffffffff9966bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffdd66bbffffffffffffffff +ffffffffffffffff9966eeffffff5000001050ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffaf00000accffffffffffffffffffffffffffffff0000 +ffffffffffffffffffffffffffffffffff85290008b3ffcc66ddffffffffffffffffffff +ffffffffffff8877ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffcc66eeffffffffffffffffff +ffffffffffffffffffdd66ccffaf060530ddffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff180028ffffffffffffffffffffffffffffff550000 +ffffffffffffffffffffffffffffffffffffff641a0b8f77ffffffffffffffffffffffff +ffffffffffffffcc55eeffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffbb66ffffffffffffffffffffff +ffffffffffffffffffffee77bf0b1aafffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff380040ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffee3242ffffffffffffffffffffffffff +ffffffffffffffffee66eeffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffdd66ffffffffffffffffffffffff +ffffffffffffffffffffffee5366ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff500064ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffcc77ffffffffffffffffffffffffffff +ffffffffffffffffffee55ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffee66eeffffffffffffffffffffffff +ffffffffffffffffffffffffee66ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffaf00ccffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffdd66ffffffffffffffffffffffffffffff +ffffffffffffffffffffcc77ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffff77ddffffffffffffffffffffffffff +ffffffffffffffffffffffffffaaaaffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff04ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff77eeffffffffffffffffffffffffffffff +ffffffffffffffffffffff77ddffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffee77ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffdd887777777741667777aaeeffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffcc77ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffee55ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff77ddffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffbb99ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffff996688ddffffffffffffffffaa7777ddffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff99ccffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffff +ffffffffffffbb55bbffffffffffffffffffffffffffee7777eeffffffffffffffffffff +ffffffffffffffffffffffffffffffffffee77ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffee77ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffcc99ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff77eeffffffffffffffffffffffffffffffffffffff +ffffffffff7788ffffffffffffffffffffffffffffffffffdd55ccffffffffffffffffff +ffffffffffffffffffffffffffffffffff99ccffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff77eeffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffcc99ffffffffffffffffffffffffffffffffffffff +ffffffee66ccffffffffffffffffffffffffffffffffffffffff77aaffffffffffffffff +ffffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffff99ccffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff +ffffff66ccffffffffffffffffffffffffffffffffffffffffffff66ccffffffffffffff +ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffbbbbffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff +ffff77ccffffffffffffffffffffffffffffffffffffffffffffffff66ddffffffffffff +ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffdd77ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff +ffbb88ffffffffffffffffffffffffffffffffffffffffffffffffffee55ffffffffffff +ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff +ff55ffffffffffffffffffffffffffffffffffffffffffffffffffffffbb99ffffffffff +ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff +99bbffffffffffffffffffffffffffffffffffffffffffffffffffffffff66ffffffffff +ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffee77ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff +66ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb99ffffffff +ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffbbaaffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffdd88ffffffffffffffffffffffffffffffffffffdd +88ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffffff +ffffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffaabbffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffaaaaffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff88ddffffffffffffffffffffffffffffffffffff88 +ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffffff +ffffffffffffffffffffffffffffffffff88ddffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffff77 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaabbffffff +ffffffffffffffffffffffffffffffffffdd88ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff77eeffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffdd88ffffffffffffffffffffffffffffffffffffff77 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbaaffffff +ffffffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffaaaaffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffbb0000ffffffffffffffffffffffffffffffff11 +22ffffffffffbb0000ffffffffffffffffffffffdd77ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffff77eeffffffffffffffffffffffffffffffffffffff77 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffff +ffffffffffffffffffffffffffffffffffffaa99ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff55ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffff44 +77ffffffffffff0000ffffffffffffffffffffffff77eeffffffffffffffffffffffffff +ffffffffffffffffffffffffffbb77ffffffffffffffffffffffffffffffffffffffff77 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffff +ffffffffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffff +ffffffffffffffffffffff99bbffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +6600007711bb770088ffff77112299ffff0000dd8899600000660000ffcc222288ff5500 +00ff77112299ff0000dd8899eeffffffffffffff999477ffffffffffffffffffffffffff +ffffffffffffffffffffffffee29bbffffffffffffffffffffffffffffffffffffffff77 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffff +ffffffffffffffffffffffffffffffffffffee5850ffffffffffffffffffffffffffffff +ffffffffffffffffffffee5566eeffffffffffffffffffbb0000ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ff0011dd0011cc0011ff7700bb7711ffff0000ee77eeff0000ff0000ff2200ffbbffff00 +007700bb7711ff0000ee77eeffffffffffffff9999ffbb77ffffffffffffffffffffffff +ffffffffffffffffffffffff77cc8877eeffffffffffffffffffffffffffffffffffff66 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd77ffffff +ffffffffffffffffffffffffffffffffffbb66dd9999ffffffffffffffffffffffffffff +ffffffffffffffffffff55eeee66eeffffffffffffffffff0000ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ff0000ff0000ff0000ff2200ffeeaaffff000077eeffff0000ff0000ff110055eeffff00 +002200ffeeaaff000077eeffffffffffffff9977ffffff8899ffffffffffffffffffffff +ffffffffffffffffffffff77aaffffddbbffffffffffffffffffffffffffffffffffff77 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbffffff +ffffffffffffffffffffffffffffffffff99ffffff77ccffffffffffffffffffffffffff +ffffffffffffffffff77ccffffee44eeffffffffffffffff0000cc222288ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ff0000ff0000ff0000ff0000eeffffffff00001144ffff0000ff0000ffcc440033ffff00 +000000eeffffff00001144ffffffffffffcc66ffffffffff8877ffffffffffffffffffff +ffffffffffffffffffff77aaffffffffffffffffffffffffffffffffffffffffffffff77 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff88ddffffff +ffffffffffffffffffffffffffffffffffffffffffff7799ffffffffffffffffffffffff +ffffffffffffffee55ccffffffffcc66ffffffffffffffff00002200ffbbffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ff0000ff0000ff0000ff440066ffeeeeff0000880077ff0000ff0000ff77ddcc00ffff00 +00440066ffeeee0000880077ffffffffcc77ffffffffffffffbb77eeffffffffffffffff +ffffffffffffffffdd55ccffffffffffffffffffffffffffffffffffffffffffffffffaa +aaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff66ffffffff +ffffffffffffffffffffffffffffffffffffffffffffff9977eeffffffffffffffffffff +ffffffffffffcc66eeffffffffffffcc77ffffffffffffff0000110055eeffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +aa0000cc0000dd000055ee55001177ffbb0011aa0000bb55004400229955111166ffaa00 +00ee55001177bb0011aa0000bbffffcc77ffffffffffffffffffdd7777eeffffffffffff +ffffffffffffee7777eeffffffffffffffff66bbffffffffffffffffffffffffffffffee +77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee77ffffffff +ffffffffffffffffffffffffffff99aaffffffffffffffffcc6699ffffffffffffffffff +ffffffffdd7777ffffffffffffffffffcc77ffffffffffff0000cc440033ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffcc77ffffffffffffffffffffffffcc7777aaffffffff +ffffffeeaa7777ddffffffffffffffffffffff8877eeffffffffffffffffffffffffffff +77eeffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ddffffffff +ffffffffffffffffffffffffff9999ffffffffffffffffffffffbb7777ccffffffffffff +ffee997777eeffffffffffffffffffffffcc77ffffffffff000077ddcc00ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffcc66ffffffffffffffffffffffffffffffffaa77777777 +30777777bbffffffffffffffffffffffffffffffddbbffffffffffffffffffffffffffff +dd77ffffffffffffffffffffffffffffffffffffffffffffffffffffffee77ffffffffff +ffffffffffffffffffffffffffaaffffffffffffffffffffffffffffee99667777663077 +6677ccffffffffffffffffffffffffffffffcc66ffffffaa000055111166ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffee44eeffffffffffffffffffffffffffffffffffffffffff +77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff77ddffffffffffffffffffffffffffffffffffffffffffffffffffff77ddffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ff +ffffffffffffffffffffffffffffffffffffff9977ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffee66eeffffffffffffffffffffffffffffffffffffffffffff +77ffffffffffffffffffffffffffffffffffffffffffff66eeffffffffffffffffffffff +ffee55ffffffffffffffffffffffffffffffffffffffffffffffffffaa88ffffffffffff +ffffffffffffffffff99aaffffffffffffffffffffffffffffffffffffffffffffff77ff +ffffffffffffffffffffffffffffffffffffffff9999ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffee66eeffffffffffffffffffffffffffffffffffffffffffffff +77ffffffffffffffffffffffffffffffffffffffffffffee66eeffffffffffffffffffff +ffffcc77ffffffffffffffffffffffffffffffffffffffffffffffcc77ffffffffffffff +ffffffffffffffff9999ffffffffffffffffffffffffffffffffffffffffffffffff77ff +ffffffffffffffffffffffffffffffffffffffffff9999ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffee66eeffffffffffffffffffffffffffffffffffffffffffffffff +77ffffffffffffffffffffffffffffffffffffffffffffffeebbffffffffffffffffffff +ffffffaa66ffffffffffffffffffffffffffffffffffffffffffcc66eeffffffffffffff +ffffffffffffffffaaffffffffffffffffffffffffffffffffffffffffffffffffff77ff +ffffffffffffffffffffffffffffffffffffffffffff9999ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffee66eeffffffffffffffffffffffffffffffffffffffffffffffffff +77ffffbb0000ffffffffffffffffffffffffffffffffffffffffbb0000ffffffffffffff +ffffffffcc66eeffffffffffffffffffffffffffffffffffffaa77eeffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1122ffffff77ff +ffffffffffffffffffffffffffffffffffffffffffffff9999ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffff44ccffffffffffffffffffffffffffffffffffffffffffffffffffff +77ffffff0000ffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff +ffffffffffdd55bbffffffffffffffffffffffffffffffee7788ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4477ffffff77ff +ffffffffffffffffffffffffffffffffffffffffffffffff66aaffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffff77ccffffffffffffffffffffffffffffffffffffffffffffffffffffff +77ffffff0000dd8899df550022aaff6600007711eeff770044eeff0000bf222288ffffff +ffffffffffffff9966bbffffffffffffffffffffffee7777ddffffffffffffffffffffff +ffffffff99aaffffffffffffffffffffffffffffffff550011cc2255550000ffffff77ff +ffffffffffffffffffffffffffffffffffffffffffffffffff77ccffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffff7bee77ccffffffffffffffffffffffffffffffffffffffffffffffffffffffff +77ffffff0000ee77ee8822ff8811ffff00007700cc9900ee7755ff00000e00ffbbffffff +ffffffffffffffffff997777aabbffffffddbb886677ddffffffffffffffffffffffffff +ffffff9999ffffffffffffffffffffffffffffffffffee1144ff99ddff0000ffffff77ff +ffffffffffffffffffffffffffffffffffffffffffffffffffff77cc88bfffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffddbbddffffffffffffffff +ffffffbf100da4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +77ffffff000077eeffcc77ff8800ffff0000ffffff6600000000ff0000100055eeffffff +ffffffffffffffffffffffffbbaa77777777bbddffffffffffffffffffffffffffffffff +ffffffaaffffffffffffffffffffffffffffffffffffff6600dd88ffff0000ffffff77ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff3a0930ffffffffffff +ffffffffffffbbbbeeffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffee9977667777bb8877777788ddffffff +ffffff3000000eddffffffffffffffffffffffffffffffffffffffffffffffffffffffff +77ffffff00001144ffee66aa0000ffff0000ffffff4400ffffffff0000cc440033ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffdd0044bbffff0000ffffff77ff +ffffffffffffffffffffffffffffffffffffffffffffffffffff880a000085ffffffffff +ffcc7777777799aa77777766aaffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffdd7777ccffffffffffffffffffcc8866ddff +ffff9400001058ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +77ffffff00008800773300ff0000ffff0000ffffff880099ffccff000077ddcc0066eeff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee +77aaffffffffffffffffffffffffffffffffffffffffffff4422ffffff0000ffffff77ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffdd280c0016eeffffff99 +6699eeffffffffffffffffffaa7777eeffffffffffffffff +ffffffffffffffffffffffffffffffffee7777eeffffffffffffffffffffffffffee7777 +eeff150030ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +77ffffbb0011aa0000320044660099bb0000ddffffee66001199aa000055111166ee66ee +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb66 +ddffffffffffffffffffffffffffffffffffffffffffffffaa99ffffaa0000ffffff77ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffff941a004bffcc66bb +ffffffffffffffffffffffffffffcc66aaffffffffffffff +ffffffffffffffffffffffffffffffee66ccffffffffffffffffffffffffffffffffffee +552b0994ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeebb +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff99ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee4b037577ffff +ffffffffffffffffffffffffffffffff9977ffffffffffff +ffffffffffffffffffffffffffffcc66eeffffffffffffffffffffffffffffffffffffff +ff2b9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffccbb +58ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbb58cc +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5448ffffff +ffffffffffffffffffffffffffffffffffcc55eeffffffff +ffffffffffffffffffffffffffdd66ffffffffffffffffffffffffffffffffffffffffff +ffff77ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2200 +0030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1100003e +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff88aaffffffff +ffffffffffffffffffffffffffffffffffffdd66ffffffff +ffffffffffffffffffffffffee66eeffffffffffffffffffffffffffffffffffffffffff +ffffff55eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4800 +0050ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff38000094 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa88ffffffffff +ffffffffffffffffffffffffffffffffffffffcc77ffffff +ffffffffffffffffffffffff77ccffffffffffffffffffffffffffffffffffffffffffff +ffffffee55ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8500 +00afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff500008ee +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffee66ffffffffffff +ffffffffffffffffffffffffffffffffffffffff88bbffff +ffffffffffffffffffffffdd77ffffffffffffffffffffffffffffffffffffffffffffff +ffffffff99bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd0a +0cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaf0017ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ddffffffffffff +ffffffffffffffffffffffffffffffffffffffffff66ffff +ffffffffffffffffffffff77eeffffffffffffffffffffffffffffffffffffffffffffff +ffffffffff66ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff28 +1bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1822ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffdd77ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffbb99ff +ffffffffffffffffffffdd77ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffff99ccffffffffffffffffffffffffffffffffffffffffffffffffffffffff40 +2affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2046ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff77eeffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffff66ff +ffffffffffffffffffff99ccffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffee77ffffffffffffffffffffffffffffffffffffffffffffffffffffcc7746 +3c77777788ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb77777777335288 +ddffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffff77dd +ffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff66ffffffffffffffffffffffffffffffffffffffffffffffbb777799ddff +ffffffffcc887777ddffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffbb777799ddffffffffffcc +886677ddffffffffffffffffffffffffffffffffffffffffffffdd88ffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffcc99 +ffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff77ffffffffffffffffffffffffffffffffffffffffffdd5599ffffffffff +ffffffffffffffee7777eeffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffcc6699ffffffffffffffffffff +ffffee7777eeffffffffffffffffffffffffffffffffffffffff88ccffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff77 +ffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffaabbffffffffffffffffffffffffffffffffffffff7777eeffffffffffff +ffffffffffffffffffdd66bbffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffff7777eeffffffffffffffffffffff +ffffffffdd66ccffffffffffffffffffffffffffffffffffffff77ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff77 +ffffffffffffffffffcc99ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffbbbbffffffffffffffffffffffffffffffffffee77bbffffffffffffffff +ffffffffffffffffffffff7799ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffee66ccffffffffffffffffffffffffff +ffffffffffff7799ffffffffffffffffffffffffffffffffffff77ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff77 +ffffffffffffffffffbbbbffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffbbaaffffffffffffffffffffffffffffffffff55ccffffffffffffffffff +ffffffffffffffffffffffff9977ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffee66ddffffffffffffffffffffffffffff +ffffffffffffff9988ffffffffffffffffffffffffffffffffff77ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff77 +ffffffffffffffffffbbaaffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffbbbbffffffffffffffffffffffffffffffff77ccffffffffffffffffffff +ffffffffffffffffffffffffff9999ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffff77ccffffffffffffffffffffffffffffff +ffffffffffffffff88aaffffffffffffffffffffffffffffffff66ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff77 +ffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffaabbffffffffffffffffffffffffffffff88aaffffffffffffffffffffff +ffffffffffffffffffffffffffff77ccffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff77bbffffffffffffffffffffffffffffffff +ffffffffffffffffff77ccffffffffffffffffffffffffffffff77ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff77 +ffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff77eeffffffffffffffffffffffffffffee77ffffffffffffffffffffffff +ffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffdd77ffffffffffffffffffffffffffffffffff +ffffffffffffffffffee66ffffffffffffffffffffffffffffff77ddffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff77 +ffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff77ffffffffffffffffffffffffffffff77ddffffffffffffffffffffffff +ffffffffffffffffffffffffffffff99bbffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff77eeffffffffffffffffffffffffffffffffff +ffffffffffffffffffff99bbffffffffffffffffffffffffffffcc99ffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffdd88 +ffffffffffffffffffff88ddffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff66ffffffffffffffffffffffffffffdd77ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffdd77ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffff66ffffffffffffffffffffffffffffff77ffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffff88dd +ffffffffffffffffffffdd88ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffaaaaffffffffffffffffffffffffffff88ddffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff88ccffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff88ddffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffff88ddffffffffffffffffffffffffffff77ffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffff66ff +ffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffff66ffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffdd88ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffdd88ffffffffffffffffffffffffffffbb88ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffcc77ff +ffffffffffffffffffffffbb99ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffbb99ffffffffffffffffffffffffffffee77ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffdd88ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff77ffffffffffffffffffffffffffffff66eeffffffffffff +ffffffffffffffffffffffffffffffffffffffffff66ffff +ffffffffffffffffffffffff66eeffffffffffffffffffffffffffffffffffffffffffff +ffffffff55ffffffffffffffffffffffffffffffbbbbffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffbbbbffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff77ffffffffffffffffffffffffffffffdd77ffffffffffff +ffffffffffffffffffffffffffffffffffffffffbb99ffff +ffffffffffffffffffffffffee55ffffffffffffffffffffffffffffffffffffffffffff +ffffff77ccffffffffffffffffffffffffffffffbbbbffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffaabbffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff77ffffffffffffffffffffffffffffffff88aaffffffffff +ffffffffffffffffffffffffffffffffffffffdd66ffffff +ffffffffffffffffffffffffffcc77ffffffffffffffffffffffffffffffffffffffffff +ffff88aaffffffffffffffffffffffffffffffff88ddffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff88ddffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff77eeffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffff77ccffffffff +ffffffffffffffffffffffffffffffffffffee66eeffffff +ffffffffffffffffffffffffffff9977ffffffffffffffffffffffffffffffffffffffff +ff9999ffffffffffffffffffffffffffffffffff77eeffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff88ccffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff77eeffffffffffffffffffffffffffffffffff55ccffffff +ffffffffffffffffffffffffffffffffffee55ddffffffff +ffffffffffffffffffffffffffffffcc66eeffffffffffffffffffffffffffffffffffff +7799ffffffffffffffffffffffffffffffffffffbbbbffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff99bbffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff7799ffff +ffffffffffffffffffffffffffffffffcc55eeffffffffff +ffffffffffffffffffffffffffffffffdd6699ffffffffffffffffffffffffffffffbb66 +ccffffffffffffffffffffffffffffffffffffffbbbbffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffbbbbffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffff9977dd +ffffffffffffffffffffffffffffee7777ffffffffffffff +ffffffffffffffffffffffffffffffffffffbb66aaffffffffffffffffffffffaa6699ff +ffffffffffffffffffffffffffffffffffffffffdd88ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffcc99ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffee77 +77ccffffffffffffffffffffdd8866ddffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffaa777777bbbbccbbbb887777aaffffff +ffffffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffee77ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffee77ffffffffffffffffffffffffffffffffffffffffffffff +dd99777799bbbbccbbaa776688ccffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffddbbbb77bbbbddffffffffffff +ffffffffffffffffffffffffffffffffffffffffff77eeffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff99ccffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff77eeffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffff99ccffffffffffffffffffffffffffffffffffffffffffffff +ffffffffbbbb9988bbbbeeffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffcc99ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffcc99ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffff66eeffffffffffffffffffffffff +ffffffffffffffffffffffffffffffbb88ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffbb99ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffcc77ffffffffffffffffffffffff +ffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffbb88ffffffffffffffffffffffffffffffffff +ffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff77ccffffffffffffffffffffff +ffffffffffffffffffffffffffff99aaffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff77ddffffffffffffffffffffffffffffffff +ffffffffffffffffff88aaffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffee66eeffffffffffffffffffff +ffffffffffffffffffffffffffcc77ffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffee66eeffffffffffffffffffffffffffffff +ffffffffffffffffbb77ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffee55eeffffffffffffffffff +ffffffffffffffffffffffffcc66ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffdd66ffffffffffffffffffffffffffffff +ffffffffffffffcc77ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffcc66eeffffffffffffffff +ffffffffffffffffffffffbb77eeffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffcc55eeffffffffffffffffffffffffff +ffffffffffffaa77ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffee55bbffffffffffffff +ffffffffffffffffffff8877ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffee55bbffffffffffffffffffffffff +ffffffffff8888ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffff9966ddffffffffff +ffffffffffffffffaa66bbffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff9966ddffffffffffffffffffff +ffffff9966bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee777788ddffff +ffffffffffcc7766aaffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffee777799ddffffffffffffff +cc7777bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd887777 +667777777799eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffcc8866776677777777 +99eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff + +showpage + +% stop using temporary dictionary +end + +% restore original state +origstate restore + +%%Trailer +cleartomark +countdictstack exch sub { end } repeat +restore +%%EOF diff --git a/ru_RU.KOI8-R/books/design-44bsd/freebsd.dsl b/ru_RU.KOI8-R/books/design-44bsd/freebsd.dsl new file mode 100644 index 0000000000..ceaf3eb1bf --- /dev/null +++ b/ru_RU.KOI8-R/books/design-44bsd/freebsd.dsl @@ -0,0 +1,26 @@ + + + +]> + + + + + + ;; Keep the legalnotice together with the rest of the text + (define %generate-legalnotice-link% + #f) + + + + +