Dustin Frisch
8 years ago
commit
42261a5bba
No known key found for this signature in database
GPG Key ID: B4C3BF012D9B26BE
16 changed files with 1215 additions and 0 deletions
-
12.gitignore
-
211-introduction.tex
-
202-environment.tex
-
303-requirements.tex
-
1084-1-update_mechanism.tex
-
674-2-multidevice_build_structure.tex
-
444-3-automatic-deployment.tex
-
124-implementation.tex
-
165-conclusion.tex
-
120flash_layout.graphml
-
570flash_layout.pdf
-
95index.bib
-
BINindex.pdf
-
45index.tex
-
BINpresentation.pdf
-
55presentation.tex
@ -0,0 +1,12 @@ |
|||
*.aux |
|||
*.log |
|||
*.out |
|||
*.synctex.gz |
|||
*-blx.bib |
|||
*.bbl |
|||
*.bcf |
|||
*.blg |
|||
*.run.xml |
|||
*.nav |
|||
*.snm |
|||
*.toc |
@ -0,0 +1,21 @@ |
|||
\section{Introduction} |
|||
|
|||
In embedded systems, the software, also known as firmware, is an essential part of the system. |
|||
On one side, it interacts with the hardware in a system specific way by implementing the specifications required by the components used in the system. |
|||
On the other side, it provides use-case dependent functionality in interaction with general purpose hardware components. |
|||
|
|||
Embedded systems are often thought as systems that never change their requirements or functionality. |
|||
But practical use shows that the environment in which these systems run in do, in fact, change. |
|||
These changes include, but are not limited to, modifications of to the expected behavior or additions to it, reconfiguration of parameters related to communication with other systems and the users and correcting errors that have been reported after deployment. |
|||
In almost all cases, the requirements can be accomplished by changing the firmware and does no need alternations of the hardware. |
|||
For updating the firmware on a system being deployed, the system must provide an interface for altering the firmware. |
|||
In addition, such an interface should provide mechanisms to check which firmware is currently installed and which configuration parameters are used. |
|||
|
|||
Even if systems are equipped with a interface for applying updates, the maintenance cost can still be enormous because administrators have to interact with each device physically. |
|||
For systems that are located in areas where reachability is limited the cost is increased even more. |
|||
If a system is already able to communicate over a network interface, this can be leveraged to apply updates on these system - this is typically referred to as \textit{Over the Air (OTA)}. |
|||
By reusing the existing communication channels, the dedicated update interface can be omitted which leads to smaller packaging and reduces production cost. |
|||
It also decreases the maintenance cost drastically because updates can be installed remotely. |
|||
|
|||
Updates OTA allows the administrators to apply automation methods on the update process allowing to roll out updates in a controlled fashion. I.e. updates can be don on critical deployments first and uncritical ones can be delayed to times where the device is not utilized. |
|||
Information about the update status provided by the devices allows administrators to apply monitoring techniques ensuring all updates are installed and devices ar in the desired state. |
@ -0,0 +1,20 @@ |
|||
\section{Environment} |
|||
|
|||
The home-automation projects developed by \textit{Magrathea Laboratories e.V.}\autocite{maglab}, the local hackerspace in Fulda, are used to provide control over the different actors and sensors in the foundations rooms to visitors and members locally and remotely. |
|||
|
|||
The different components available (like the door status, power sockets, projectors and screens, temperature, etc.) are all managed by the home-automation controller driven by the software home-assistant\autocite{HASS}. |
|||
It provides direct control over all existing components using a web UI and allows to define rules and automations on how these components interact. |
|||
|
|||
The hackerspace has developed a common software and hardware platform for its home-automation projects called \textit{ESPer}\autocite{ESPer}. |
|||
For the hardware, boards based on the ESP8266 micro-controllers, mostly ESP-01s\autocite{ESP-01s} boards, are used in combination with self-developed power supplies and use-case specific hardware components. |
|||
These boards provide a MCU fast enough for all required scenarios integrate WiFi without requiring any extra components. |
|||
The software is based on the Sming\autocite{Sming} library, which in turn is based on the open source SDK for ESP8266 and integrates a lot of other software components for easy use. |
|||
To build the software, a Makefile\autocite{make} is used and provides a simple way for reproducible builds. |
|||
|
|||
For communication with the controller, the MQTT\autocite{MQTT} protocol is used. |
|||
It provides a lightweight messaging mechanism implementing the publish-subscribe pattern which allows devices to listen for commands and publish their current state to the controller and other interested parties. |
|||
The controller software has out-of-the-box support for this protocol which allows easy integration of all different device types using the same patterns. |
|||
|
|||
The components all share the same configuration in regard of the network access and the controller to communicate with. |
|||
The configuration is provided during build time which eschews the need for a configuration interface and thus reducing the manage overhead and increases the security. |
|||
|
@ -0,0 +1,30 @@ |
|||
\section{Requirements} |
|||
|
|||
The following requirements are defined as global project targets and has been refined during the work on the project multiple times. |
|||
|
|||
\begin{itemize} |
|||
|
|||
\item The systems should be able to perform updates on the release of new software releases without administrative interaction. |
|||
If a new version of the firmware is published, it should be prepared automatically for installation to the target devices. |
|||
All these devices should then download and install the new software version and start using it if no errors has occurred during the process. |
|||
|
|||
\item To ensure minimal maintenance effort, the update process should be insusceptible to errors as most as possible. |
|||
Even if the installation of an update fails in the middle of reprogramming the controller, the system should continue to work full functional immediately and after a reboot. |
|||
|
|||
\item Downloading the updated firmware should be done over the WiFi interface using the same network connection as used during normal operation. |
|||
Fetching the firmware should be done side-by-side other traffic used during operation. |
|||
|
|||
\item Reducing network load and aiming for the maximum possible device uptime is critical. |
|||
Therefore, the update process should only be done if a new version is available. |
|||
In contrast, the release of a new update should be rolled out to all devices as fast as possible. |
|||
During the checking for available updates and while downloading such an update, the device should continue to work as usual. |
|||
|
|||
\item For easy maintenance and monitoring, each device should provide detailed information about the currently installed firmware version and other details in relation to the update process. |
|||
|
|||
\item Devices are categorized by types. |
|||
Each device type runs the same software and therefore provides the same functionality. |
|||
As the device type is hardly coupled to the hardware. |
|||
It is provided as a global constant while compile time and it must never be changed during operation. |
|||
Updates must ensure that the correct firmware according to the device type is used while reprogramming. |
|||
|
|||
\end{itemize} |
@ -0,0 +1,108 @@ |
|||
\subsection{The update mechanism} |
|||
|
|||
The implementation of the update mechanism consists of three parts which interact closely: checking for updates, reprogramming the device and reconfiguring the boot process. |
|||
This sections describes all these parts in detail. |
|||
|
|||
The build-time configuration was extended to include a new option called \texttt{UPDATER\_URL} which is the base URL sued to query the update server. |
|||
Each device requires to have this option set to make the updates work. |
|||
If the option is skipped, the while code for update management is excluded during the build. |
|||
|
|||
|
|||
\subsubsection{Checking for update} |
|||
|
|||
Initially, each device checks the update server regularly for the current firmware version and initializes the update process if remote and local versions differ. |
|||
To do so, the update server provides a file for each device type containing the available version identifier which are stored beside the firmware binary files. |
|||
These version identifier files are provided by the update server using HTTP 1.1\autocite{HTTP_1.1} under the following path pattern: \texttt{\${DEVICE}.version} (whereas \texttt{\${DEVICE}} is the device type name). |
|||
The version identifier can be an arbitrary string as the content is not interpreted semantically but only compared to the version identifier used during build time. |
|||
|
|||
Each device tries to fetch the version identifier file once every hour. |
|||
After the version identifier file has been downloaded successfully, the whole file content is compared to the version identifier provided during build time. |
|||
If the version identifiers differ, the update process is initialized; if the download has failed, the update server or the network connection was not available or any other error occurred, another attempt will be made at the next interval. |
|||
|
|||
In addition to the interval, a special \textit{MQTT} topic shared by all devices is subscribed on device startup: \texttt{\${MQTT\_REALM}/update}. |
|||
Every time a message is received on this topic, a fetch attempt for the version identifier file is triggered. |
|||
This allows faster roll-outs of updates and finer control for manual maintenance. |
|||
|
|||
|
|||
\subsubsection{Reprogramming the device} |
|||
|
|||
As the binary to download and to flash maybe exceed the size of free memory heap space, the received data must be written to the flash directly. |
|||
In contrasts, executing the code from the memory mapped flash while writing the same area with the downloaded update leads to errors, as the executed code changes immediately to the updated one. |
|||
To avoid that, the flash is split in half to contain two firmware ROMs with different versions, one being executed and one which is being downloaded. |
|||
This standby firmware also acts as a safety mechanism if the download fails or is interrupted as the previous version stays intact and can still be used. |
|||
In case of an error the old firmware is kept unchanged and will be used until downloading of a newer firmware succeeds. |
|||
|
|||
\begin{figure}[h] |
|||
\begin{lstlisting}[language=] |
|||
irom0_0_seg : org = ( 0x40200000 // The memory mapping address |
|||
+ 0x2000 // Bootloader code and config |
|||
+ 0x10 // Data offset after header |
|||
+ 1M / 2 * ${SLOT} // Offset for the ROM slot |
|||
), |
|||
len = ( 1M / 2 - 0x2010 ) // Half ROM size excl. bootloader |
|||
\end{lstlisting} |
|||
\caption{Linker script to build firmware for two ROM slots.} |
|||
\label{lst:linker_script} |
|||
\end{figure} |
|||
|
|||
\begin{wrapfigure}{r}{0.3\textwidth} |
|||
\begin{center} |
|||
\includegraphics[scale=0.6]{flash_layout.pdf} |
|||
\end{center} |
|||
\caption{The flash layout used for two ROMs.} |
|||
\label{fig:memory_layout} |
|||
\end{wrapfigure} |
|||
|
|||
Microcontroller boards based on the \textit{ESP8266} MCU are mostly following the same layout: the MCU is attached to a flash chip which contains bootloader, firmware and other application data. |
|||
The memory mapping mechanism of the MCU allows only a single page of 1 MB flash to be mapped at the same time\autocite{ESP8266_Memory_Map} and the selected range must be aligned to 1 MB blocks. |
|||
As the ESP-01s is only equipped with 1MB of flash, this means that the whole memory is mapped to a continuous address space. |
|||
Therefore, the second ROM can not be re-mapped to have the same start address as the first ROM. |
|||
While the firmware is executed without any dynamic linking mechanism and the chip does not support position independent code, the addresses used in the ROMs are dependent to the offset at which the firmware is stored. |
|||
This arises the need of building two firmware binaries, one for each target location. |
|||
To do so, a linker script for each of the two ROM slots was created which are used to create two variations of the same firmware which only differ in ROM placement. |
|||
The two resulting firmware binaries files are both provided for download via HTTP 1.1 - which of these files to download is selected by the device during the download process depending on the target ROM slot. |
|||
Snippet~\ref{lst:linker_script} shows the only difference between the two linker scripts, whereas \texttt{\${SLOT}} must be replaced with the slot number according to the current build. |
|||
|
|||
In addition to the two ROMs, the flash must provide room for the bootloader and its configuration. |
|||
\textit{rBoot}\autocite{rBoot} has been choosen as it is integrated within the \textit{SMING} framework and allows to boot to multiple ROMs. |
|||
For configuration, a \textit{rBoot} specific structure is placed in the flash at a well-known location directly after the space reserved for the bootloader code. |
|||
This structure contains, among other things, the target offsets for all known ROMs and the number of the ROM to boot from on next reboot. |
|||
|
|||
The full memory layout of this approach is shown in figure~\ref{fig:memory_layout}. |
|||
To calculate the origin of application data for each slot, the available memory of 1 MB is split in half and an offset of the size of bootloader code and its configuration (0x2000 bytes) is added. |
|||
For alignment and easy debugging, the second block is also shifted by the same amount as the first block. |
|||
This unused gap of 8192 bytes is used by some applications to store persistent data which can persist over application updates. |
|||
|
|||
\begin{figure}[h] |
|||
\begin{lstlisting} |
|||
#define UPDATER_URL_ROM(slot) (( UPDATER_URL "/" DEVICE ".rom" slot )) |
|||
|
|||
// Select rom slot to flash |
|||
const auto& bootconf = rboot_get_config(); |
|||
|
|||
// Add items to flash |
|||
if (bootconf.current_rom == 0) { |
|||
updater.addItem(bootconf.roms[1], UPDATER_URL_ROM("1")); |
|||
updater.switchToRom(1); |
|||
} else { |
|||
updater.addItem(bootconf.roms[0], UPDATER_URL_ROM("0")); |
|||
updater.switchToRom(0); |
|||
} |
|||
\end{lstlisting} |
|||
\caption{The flash layout used for two ROMs.} |
|||
\label{lst:choosing_rom} |
|||
\end{figure} |
|||
|
|||
For installing a firmware update, the new firmware binary file is downloaded via a HTTP GET request. |
|||
The update server provides these files in the exact same way as it provides the version identifier files but only the path pattern differs: the suffixes \texttt{.rom0} and \texttt{.rom1} are used to provide the firmware binary files for the first and second slot correspondingly. |
|||
These provided firmware file are the exact same one as used to initially flash the chip for the according version. |
|||
Using the same file for flashing and updating allows better debugging by eliminating errors related to the update process and makes development and initial installation easy. |
|||
Listing~\ref{lst:choosing_rom} shows the algorithm used to determine the download address and reconfiguring the bootloader. |
|||
|
|||
After the download of a new ROM has finished successfully, the bootloader configuration is altered to boot to the new ROM slot and the device is rebooted. |
|||
|
|||
|
|||
\subsubsection{Publish device information} |
|||
For monitoring and maintenance purposes, each device publishes a set of information to a well-known \textit{MQTT} topic after connecting to the network. |
|||
Beside already existing dates like device type, chip and flash ID the information block has been extended with details about the bootloader, SDK and firmware version as well as relevant details from the bootloader configuration like the currently booted ROM slot and the default ROM slot to boot. |
|||
This allows administrators to find devices with outdated bootloaders and helps to find missing and failed updates. |
@ -0,0 +1,67 @@ |
|||
\subsection{Multi-Device build infrastructure} |
|||
|
|||
The firmware for all ESP8266 based devices in the hackerspace are all based on the same framework. |
|||
\textit{SMING} provides the base library for this framework. |
|||
In addition, components and functionality shared by all devices has been identified and are providing a framework for the existing and possible further devices. |
|||
This framework provides a functional base for all devices and allows to reuse code providing functionality which is common in multiple devices. |
|||
The framework also includes a build system which allows to configure some basic parameters for all devices. |
|||
Including, but not limited to, the Wi-Fi access parameters, the \textit{MQTT} connection settings and the updater URLs. |
|||
By sharing the same code, all devices ensure to have a common behavior when it comes to reporting the device status or interacting with the home-automation controller. |
|||
This eases configuration and allows to collect information about all devices at a central point. |
|||
|
|||
Each device firmware exists as a separate project and includes a link to the framework. |
|||
As development on these devices happens in cycles, older projects are missing updates of the framework and there do not benefit from added features or fixed problems. |
|||
Updating the framework version and rebuilding the firmware would often result in an easy gain of these benefits but requires manual interaction. |
|||
More problems will arise if the API of the framework has changed. |
|||
Then the device firmware must be updated to use the changed API which can be an unpleasant and complex task and leads to higher latency for firmware updates. |
|||
|
|||
To prevent these problems the device firmware of all devices in the space is now integrated with the framework into a larger project. |
|||
By doing so, the each device specific code is always linked to the latest version of the framework. |
|||
Device specific code is now organized as a folder for each device type. |
|||
The build system has been modified to scan for all device specific folders and call the original build process for each of them. |
|||
|
|||
|
|||
\subsubsection{Framework integration} |
|||
|
|||
The framework has been changed to keep control over the application life-cycle. |
|||
It ensures that the device unspecific code is executed at the right time and provides integration points for device specific functionality. |
|||
|
|||
\begin{figure}[h] |
|||
\begin{lstlisting} |
|||
#include "../Device.h" |
|||
#include "../features/Socket.h" |
|||
|
|||
Device device: |
|||
|
|||
constexpr const char SOCKET_NAME[] = "socket"; |
|||
constexpr const uint16_t SOCKET_GPIO = 12; |
|||
OnOffFeature<SOCKET_NAME, SOCKET_GPIO, false, 1> socket(&device); |
|||
|
|||
Device* getDevice() { |
|||
return &device; |
|||
} |
|||
\end{lstlisting} |
|||
\caption{Device specific code for a socket driver.} |
|||
\label{lst:create_device_socket} |
|||
\end{figure} |
|||
|
|||
|
|||
The framework specifies a simple interface which must be implemented by each device. |
|||
A single function \texttt{Device* getDevice()} must be defined exactly once in each device specific folder. |
|||
To implement this interface, a static instance of \texttt{Device} is created returned. |
|||
Each \texttt{Device} is populated with device specific \texttt{Feature} instances. |
|||
While the \texttt{Feature}-API leverages common runtime polymorphism to share functionality between features, the initial \texttt{Device} creation uses compile-time polymorphism which reduces the need of memory management and increases performance by avoiding virtual function tables. |
|||
Snippet~\ref{lst:create_device_socket} shows the complete device specific code used for a simple power socket. |
|||
|
|||
|
|||
\subsubsection{Build system} |
|||
|
|||
The existing \textit{Makefile} has been refactored accept a parameter for device type identifiers called \texttt{DEVICE} and to create its whole output inside a subdirectory specific to the device type. |
|||
Another \textit{Makefile} has been created which scans a project subdirectory and uses each directory in there as container for device specific code. |
|||
For each of these directories, the other \textit{Makefile} is called and the subdirectories name is used as \texttt{DEVICE} parameter. |
|||
By splitting the build and recompiling the framework each time before intermixing it with the device specific code, the device type identifier can be used inside the shared framework code. |
|||
|
|||
While building a devices firmware, the version identifier file used during updates is also created and stored beside the binary firmware image. |
|||
|
|||
For development, each device can be build separately by using the device type identifier as \textit{Makefile} target. |
|||
In addition the prefix \texttt{/flash} can be used to flash a specific firmware. |
@ -0,0 +1,44 @@ |
|||
\subsection{Automatic deployment and roll-out} |
|||
|
|||
The source code of the \textit{ESPer} project is published into a GIT repository which is provided by the Hackerspace. |
|||
To avoid interferences between different build environments on developers computers and roll out new versions as early as possible, the code has been integrated into a continuous integration (CI) system. |
|||
The CI based on \textit{drone}\autocite{drone}, provided as part of the hackerspace infrastructure, allows to execute commands on each version published into the GIT repository. |
|||
Therefore a \textit{drone} configuration file as shown in Snippet~\ref{lst:drone} has been added to the source code as \texttt{.drone.yml}. |
|||
|
|||
\begin{figure}[h] |
|||
\begin{lstlisting}[language=] |
|||
build: |
|||
image: maglab/sming |
|||
environment: |
|||
- CONFIG=maglab |
|||
- WIFI_PWD=$$WIFI_PWD |
|||
- VERSION=$${COMMIT:0:8} |
|||
commands: |
|||
- make clean |
|||
- make |
|||
publish: |
|||
sftp: |
|||
host: eddie.maglab.space |
|||
username: esper |
|||
files: |
|||
- dist/* |
|||
destination_path: './' |
|||
when: |
|||
branch: master |
|||
\end{lstlisting} |
|||
\caption{The \textit{drone} configuration for the \textit{ESPer} project.} |
|||
\label{lst:drone} |
|||
\end{figure} |
|||
|
|||
As shown in the configuration Snippet, the build environment includes some special settings. |
|||
First, the \texttt{CONFIG=maglab} option let the build system use \texttt{Configurion.mk.maglab} instead of the default configuration file. |
|||
This configuration file is stored inside the repository, too. |
|||
To keep the WiFi password secret, it is not written down in the configuration but mus be specified in the environment. |
|||
To include secrets into a build process while allowing to keep the configuration public, \textit{drone} allows to encrypt these with a repository specific key. |
|||
Using this method, the password is stored as \texttt{.drone.sec} file inside the repository from where it is injected into the build environment. |
|||
At last, the firmware version is configured to be made out of the first 8 letters of the GIT commit hash, which uniquely identifies a version of the source code. |
|||
|
|||
For deployment, only the master branch is considered. |
|||
After a successful build, all distribution files (the binary firmware files and the version files) of all devices are copied to the machine running the home automation controller software into a directory served by a HTTP server. |
|||
The used configuration file references this server as source of updates. |
|||
|
@ -0,0 +1,12 @@ |
|||
\section{Implementation} |
|||
|
|||
Implementing updates over the air under the given requirements involves three different components which interact closely. |
|||
|
|||
The first component implements the update mechanism on the firmware running on the embedded device. |
|||
It is responsible for checking and downloading the updates and installing them. |
|||
Second, the build system is in charge of building the firmware from source and publishing the built binary images. |
|||
At last the deployment provides infrastructure for downloading the binary firmware images and triggering the update on all devices. |
|||
|
|||
\input{4-1-update_mechanism} |
|||
\input{4-2-multidevice_build_structure} |
|||
\input{4-3-automatic-deployment} |
@ -0,0 +1,16 @@ |
|||
\section{Conclusion} |
|||
|
|||
The project has been successfully deployed in the hackerspace and is now an essential part of home-automation development and deployment. |
|||
|
|||
The update infrastructure has been the crucial point for decisions to wards the framework for most members. |
|||
Allowing to do updates and the shared configuration and behavior results in a massive speedup when it comes to project deployment. |
|||
Before that, the cost for an update was estimated so high, that most projects tend to delay deployment until all required and wanted features are implemented. |
|||
Now, as the devices are deployed as soon as the hardware is considered stable, these devices start to provide functionality early and therefore the developers can get better feedback on the provided functionality. |
|||
|
|||
Most of the devices running the update-enabled firmware have undergone multiple major updates without any problems. |
|||
This includes a major network configuration change and a big stability fix for network communication. |
|||
All devices applied the update successfully and started to work without any manual interaction required afterwards. |
|||
|
|||
The project will be continued to extend the functionality with features already being in development. |
|||
The latest development includes enhanced checksum verification where the firmware can be signed using cryptographic methods and will be verified during the update process. |
|||
In addition, the information provided by the device about the firmware status will be enhanced to allow better control and reduce maintenance effort even more. |
@ -0,0 +1,120 @@ |
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
|||
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd"> |
|||
<!--Created by yEd 3.15.0.2--> |
|||
<key attr.name="Description" attr.type="string" for="graph" id="d0"/> |
|||
<key for="port" id="d1" yfiles.type="portgraphics"/> |
|||
<key for="port" id="d2" yfiles.type="portgeometry"/> |
|||
<key for="port" id="d3" yfiles.type="portuserdata"/> |
|||
<key attr.name="url" attr.type="string" for="node" id="d4"/> |
|||
<key attr.name="description" attr.type="string" for="node" id="d5"/> |
|||
<key for="node" id="d6" yfiles.type="nodegraphics"/> |
|||
<key for="graphml" id="d7" yfiles.type="resources"/> |
|||
<key attr.name="url" attr.type="string" for="edge" id="d8"/> |
|||
<key attr.name="description" attr.type="string" for="edge" id="d9"/> |
|||
<key for="edge" id="d10" yfiles.type="edgegraphics"/> |
|||
<graph edgedefault="directed" id="G"> |
|||
<data key="d0"/> |
|||
<node id="n0"> |
|||
<data key="d6"> |
|||
<y:GenericNode configuration="com.yworks.flowchart.process"> |
|||
<y:Geometry height="39.0" width="158.0" x="433.3392000000001" y="472.21439999999996"/> |
|||
<y:Fill color="#CC99FF" color2="#993366" transparent="false"/> |
|||
<y:BorderStyle color="#000000" type="line" width="1.0"/> |
|||
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="69.583984375" x="44.2080078125" y="10.515625">Bootloader<y:LabelModel> |
|||
<y:SmartNodeLabelModel distance="4.0"/> |
|||
</y:LabelModel> |
|||
<y:ModelParameter> |
|||
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> |
|||
</y:ModelParameter> |
|||
</y:NodeLabel> |
|||
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Monospaced" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="14.4765625" modelName="custom" textColor="#000000" visible="true" width="47.34765625" x="162.0" y="31.76171875">0x000000<y:LabelModel> |
|||
<y:SmartNodeLabelModel distance="4.0"/> |
|||
</y:LabelModel> |
|||
<y:ModelParameter> |
|||
<y:SmartNodeLabelModelParameter labelRatioX="-0.5" labelRatioY="0.0" nodeRatioX="0.5" nodeRatioY="0.5" offsetX="4.0" offsetY="0.0" upX="0.0" upY="-1.0"/> |
|||
</y:ModelParameter> |
|||
</y:NodeLabel> |
|||
</y:GenericNode> |
|||
</data> |
|||
</node> |
|||
<node id="n1"> |
|||
<data key="d6"> |
|||
<y:GenericNode configuration="com.yworks.flowchart.process"> |
|||
<y:Geometry height="157.0" width="158.0" x="433.3392000000001" y="315.21439999999996"/> |
|||
<y:Fill color="#CCFFFF" color2="#00FFFF" transparent="false"/> |
|||
<y:BorderStyle color="#000000" type="line" width="1.0"/> |
|||
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="62.078125" x="47.9609375" y="69.515625">First ROM<y:LabelModel> |
|||
<y:SmartNodeLabelModel distance="4.0"/> |
|||
</y:LabelModel> |
|||
<y:ModelParameter> |
|||
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> |
|||
</y:ModelParameter> |
|||
</y:NodeLabel> |
|||
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Monospaced" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="14.4765625" modelName="custom" textColor="#000000" visible="true" width="47.34765625" x="162.0" y="149.76171875">0x002000<y:LabelModel> |
|||
<y:SmartNodeLabelModel distance="4.0"/> |
|||
</y:LabelModel> |
|||
<y:ModelParameter> |
|||
<y:SmartNodeLabelModelParameter labelRatioX="-0.5" labelRatioY="0.0" nodeRatioX="0.5" nodeRatioY="0.5" offsetX="4.0" offsetY="0.0" upX="0.0" upY="-1.0"/> |
|||
</y:ModelParameter> |
|||
</y:NodeLabel> |
|||
</y:GenericNode> |
|||
</data> |
|||
</node> |
|||
<node id="n2"> |
|||
<data key="d6"> |
|||
<y:GenericNode configuration="com.yworks.flowchart.process"> |
|||
<y:Geometry height="34.0" width="158.0" x="433.3392000000001" y="281.21439999999996"/> |
|||
<y:Fill color="#C0C0C0" color2="#999999" transparent="false"/> |
|||
<y:BorderStyle color="#000000" type="line" width="1.0"/> |
|||
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="137.13671875" x="10.431640625" y="8.015625">Padding for alignment<y:LabelModel> |
|||
<y:SmartNodeLabelModel distance="4.0"/> |
|||
</y:LabelModel> |
|||
<y:ModelParameter> |
|||
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> |
|||
</y:ModelParameter> |
|||
</y:NodeLabel> |
|||
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Monospaced" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="14.4765625" modelName="custom" textColor="#000000" visible="true" width="47.34765625" x="162.0" y="26.76171875">0x080000<y:LabelModel> |
|||
<y:SmartNodeLabelModel distance="4.0"/> |
|||
</y:LabelModel> |
|||
<y:ModelParameter> |
|||
<y:SmartNodeLabelModelParameter labelRatioX="-0.5" labelRatioY="0.0" nodeRatioX="0.5" nodeRatioY="0.5" offsetX="4.0" offsetY="0.0" upX="0.0" upY="-1.0"/> |
|||
</y:ModelParameter> |
|||
</y:NodeLabel> |
|||
</y:GenericNode> |
|||
</data> |
|||
</node> |
|||
<node id="n3"> |
|||
<data key="d6"> |
|||
<y:GenericNode configuration="com.yworks.flowchart.process"> |
|||
<y:Geometry height="157.0" width="158.0" x="433.3392000000001" y="124.21439999999996"/> |
|||
<y:Fill color="#99CCFF" color2="#00CCFF" transparent="false"/> |
|||
<y:BorderStyle color="#000000" type="line" width="1.0"/> |
|||
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="17.96875" modelName="custom" textColor="#000000" visible="true" width="80.11328125" x="38.943359375" y="69.515625">Second ROM<y:LabelModel> |
|||
<y:SmartNodeLabelModel distance="4.0"/> |
|||
</y:LabelModel> |
|||
<y:ModelParameter> |
|||
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> |
|||
</y:ModelParameter> |
|||
</y:NodeLabel> |
|||
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Monospaced" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="14.4765625" modelName="custom" textColor="#000000" visible="true" width="47.34765625" x="162.0" y="-7.23828125">0x100000<y:LabelModel> |
|||
<y:SmartNodeLabelModel distance="4.0"/> |
|||
</y:LabelModel> |
|||
<y:ModelParameter> |
|||
<y:SmartNodeLabelModelParameter labelRatioX="-0.5" labelRatioY="0.0" nodeRatioX="0.5" nodeRatioY="-0.5" offsetX="4.0" offsetY="0.0" upX="0.0" upY="-1.0"/> |
|||
</y:ModelParameter> |
|||
</y:NodeLabel> |
|||
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Monospaced" fontSize="9" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="14.4765625" modelName="custom" textColor="#000000" visible="true" width="47.34765625" x="162.0" y="149.76171875">0x082000<y:LabelModel> |
|||
<y:SmartNodeLabelModel distance="4.0"/> |
|||
</y:LabelModel> |
|||
<y:ModelParameter> |
|||
<y:SmartNodeLabelModelParameter labelRatioX="-0.5" labelRatioY="0.0" nodeRatioX="0.5" nodeRatioY="0.5" offsetX="4.0" offsetY="0.0" upX="0.0" upY="-1.0"/> |
|||
</y:ModelParameter> |
|||
</y:NodeLabel> |
|||
</y:GenericNode> |
|||
</data> |
|||
</node> |
|||
</graph> |
|||
<data key="d7"> |
|||
<y:Resources/> |
|||
</data> |
|||
</graphml> |
@ -0,0 +1,570 @@ |
|||
%PDF-1.4 |
|||
%âãÏÓ |
|||
1 0 obj |
|||
<< |
|||
/Title () |
|||
/Author () |
|||
/Subject () |
|||
/Keywords () |
|||
/Creator (yExport 1.5) |
|||
/Producer (org.freehep.graphicsio.pdf.YPDFGraphics2D 1.5) |
|||
/CreationDate (D:20170206163212+01'00') |
|||
/ModDate (D:20170206163212+01'00') |
|||
/Trapped /False |
|||
>> |
|||
endobj |
|||
2 0 obj |
|||
<< |
|||
/Type /Catalog |
|||
/Pages 3 0 R |
|||
/ViewerPreferences 4 0 R |
|||
/OpenAction [5 0 R /Fit] |
|||
>> |
|||
endobj |
|||
4 0 obj |
|||
<< |
|||
/FitWindow true |
|||
/CenterWindow false |
|||
>> |
|||
endobj |
|||
5 0 obj |
|||
<< |
|||
/Parent 3 0 R |
|||
/Type /Page |
|||
/Contents 6 0 R |
|||
>> |
|||
endobj |
|||
6 0 obj |
|||
<< |
|||
/Length 7 0 R |
|||
/Filter [/ASCII85Decode /FlateDecode] |
|||
>> |
|||
stream |
|||
GauI\bK_G-Ca?IXVs"pn:Z]9)BkUqjJ.9\*b^.VQNu$Q'4Yn%l]g"7r8Cl\=Jn.Go2LXT20/K$?AE9#W |
|||
p>c#Ip\fF:o/H%?k;>I'oDRk@Du]R@pCDb'lcoE1pm3\@r;-+>in(Yhq">fErSsfGs6r8OqS3$g5IKt[ |
|||
jhH3mP5kI3s74cks$-MGDsab-rg/-48Gm]3"7,f`S$-]/Wgg3'K5U[j2#K!>rL`rVhot%Js%R9uj.L(m |
|||
]me^&UOW+6O%*7hbPM0Sc\d2YYP%tfpKqq<rZAlQTDueipttGYmmd5up&>rZs5AJ-:]LC.s6'FYO5GGQ |
|||
s8Uig[ibS9s7>j6J**BWp]'sY+2@g>n,N*2F,c4UI@gG5[ni'dV\T,&GdRb"hZpS2pq(Irp]'@(MRbnP |
|||
ric?j%f+^LoCq.Ral5a<A9eJ>n+PdUhrgo!A"t^Hr:0RG]#Tm/L$'haYb@sV3p2.HO$4Pc:To.%]R]nO |
|||
eGXdAVnc/,J,!6grPu`m4_OdL7[DeY>dsa![C.0$ruMeu$US/i5JOSO[%Y7ipQ+X>/\Z\(_%uKF0uO;T |
|||
[#^uA\tA(tWl6UToqU=qpTT.=+8;dKG5g(_rSpK*IF'$4mK`9kW:bd)[-e:o(._c)T3p<-(4S_2@F("c |
|||
]uB$P=i+jGQf-NX6L&6EmceCPp\W"p.,D2q*t*4p-dhO\+9%SYqe?(tcspFCg>hDg'56Dll4)"?j1TU: |
|||
=[PEP/WH%MEBbjc3*I!'?o0uu17UErdRGfo&iglY1@^$`2gTfL\:L*FGrJTTk1EZm]o,,=4rAoVk\'*$ |
|||
pt(l3n/cloUqTO'T,s^FJ:2ZbBT@S\59EP'dN@pPe'@!r?I4\"JP`iT_/C>)%E3tn)?m0H2lE9#_h@./ |
|||
kU:6#V[X*42j]X)p1'OS;u;W$B20l0b&qtoQ+--94<OXi)#NJAP.\Z9FQI>q5:T`\:p$'=8k;>Z<rN"K |
|||
)ZQbo1T#VJmdUR09`qg26q6\$)Bd$#(a'K%FgXWb!b)q]SBd5da3Z#FrSU'6Z\Eki\="pfK\l7aOD6q( |
|||
7ntkU=j$]1kK-ne<+])^'I/8JX\hj#<96^_XArGU7+,Jn0/WYWl`"Cl6Y<0McB#;QN1V25e@n)^!)SOI |
|||
^Ej5H'4Zu*c9')AJL/8P5Hl/geD$kE(r_^uHKW*UAa6$frQ4l'9//1^`XT8,+/J>"0cl/A#50bm3IQiV |
|||
\Y4dKA)>6c-)(UEI]LJ0N'A4%+)GN7UY]3V$PM)E($H>pDhtabVi(XG$]'4!78=qA;(f8T=uF;COiB@b |
|||
&7bWg8"#8!8NA_s/:-LNUQq.Q?k6[RVm;t7$PQ]Xbq(eiSWb8<3$cohYPL,9YD`#EZ![N+r7G9N=fYi_ |
|||
#MN6ql\4F[<Yo]PRBTo7^&TiTrr.^iaNL"h/*m&URNk>d!gA'K(>I6IKmom=Nf./4Z/YM/-Y>ukL1hI& |
|||
3P$n'pmPlEp0e3-G*s<P1]'])T#fZAhl^&X]>jINVuH2_5HsJRf9cL3jZR^tl.E:LH4RiHJ:@aJQK%XG |
|||
Z$u^%Z-=@BXRK.tq[C'?,XZF*f2h4A'\]m%c5e!51Gg`S=s-t9Yk)&ZSCe6n?_iM0][lHH%pHe[+g3Hf |
|||
K?q]iV&@Es0%i")m=XjhGcfA6^hZ7[0/7]G3PfJ\2tX=2U\<kt843nfrVe>d(U%!0(,M$'["?mn;N/JM |
|||
L7]O"eda#@n=!1\J/GqrSDZ8i)d6KM!Ib6b,Q`$U$cm,7+$P`@[0L7PhmP\[QJ4),ZIYn\P=n:Xni!V2 |
|||
]JWE)W4/#QL)s0lZil5]_5^koG]26tF>L,XNitrtoadr&D4lX@qWcZB.QBLpa,_f1fA*L&qrVfU=5`l@ |
|||
+]k>lM_hO-9'9)\fq/^jY!>3T2#3Ha:R?:/9^T-GV`U?.1i0qokfINHLXcW3FLY)"gl1X0JX<^\92EhC |
|||
I:=IDm(EIY:K5244GCD7[r9=pgKd&qlR]K-QM_n=6d?JbAKUl@3X/<J1"Vkk(\]T+;8X6@keS3R1GJS/ |
|||
/Za(q6%^sbinch`.tru^*'jJMa8k*\keVt<k<TW]/lX[`YU_AOpG[!Rdi4fsd,/B'\_4k@/8VD'=prM- |
|||
<8#9e\s(BUUiV$8@79+arF1+K9,<H9fc2uSj!mF2]tdP#c6WnFRJ-F6OQ<Z<gIF;@[7_jlH7o5/>@#qM |
|||
8,dt8m<Vu0CA3#.b'eXo:[f^4Y7L"]NR'I[WR3beSJ0!HS%>\"Ig;"%F>U'W^Yfsnb5W2P'*<EqU5]OE |
|||
M#2*4q2a+h*;PZhUH\5jN!57>)nd=<T5/nQ*pZEOa]c50G;#J_(iD(3Y"k!!2Wb'tI>&UcA580#XYiDV |
|||
-po6VT'qh5I0=i%#LOHd52'*2)1&N-ge+Lk)ccjK2#'@4qu6":Yki!%MfnRY`)pH8N,^mdB^W1C0U]I\ |
|||
CbBcNafi)J@,D2n0rADr1ZuiMdp`^+``B-NL."AV\8X5;NL\8=hP/dur4uRA%[0;fl<C;EgAJ'O4AS+D |
|||
KD%D"&EQe_W)Xah6neMUAfe0d[mRO[(#Q6XM/cEJg2C4X-<P+ge(.Wgs/$5AdfrUeVU<3u4*m\aHHM)[ |
|||
)X#/nR<jJBc-gLRhp]jsmC0RUJ2^@JoUaaZ+JV`%*IiMGm*!"JT(h38mIIoJk?o>'i3uLW9S[D\b@Ts! |
|||
5CMU:As*T6S4Y:(,<4l&kuuNX$oTiIf<H@:#O+A58^pJZpoVh^DGNFCf3[kp2E[j]f5,^,k!rJKOa!._ |
|||
Ts\LgR<jddD.XWqDni:^S`F:6i/msrIP@L6NV^\4fJ#dfXfjpEAJm.MUj..HqG8Z5C\7^fa6AVli)H0_ |
|||
_.OS(hX6f\(FPH7R_`oZ?N6[N=aj`eDk&alNMA#cpD).^YUIaHPJ)<'j3=P`b3$F[*O$L[VmJI:B=k)4 |
|||
`7\bg&#,<P^DWqqSiUs74UcJ'4C#Bb0YFX$YSGLi%?(p(eHg;f+pZ]32VWQ`8K<(Xrr+E+8NQC]>[_gS |
|||
5nD<`/p53["SQJLi*,-F1NmR(($g*3X,b<D;u]BOS96`sbW4kU[h$V=QCGVLf(rl/SWIs^d9$A,2XLJ@ |
|||
rb4NVnYpA$5*Odj`-q](aGdS'51.`KNj`a"nWRn/[PtLuZ,b6^(]1eJYe?\I_nPZ"e1m6;&F8t/%@d0g |
|||
<^Wt],>fSM(V_9a.*6PA[77\9lV=X+3W@Zf98%09V^Fi<7qgY*$[YOEEk3;]Q5a!/8#/WOp&2""@gpn0 |
|||
h'NOe^&o=[-0GN<-C_<Ea#`!jEqVG.SG,<.HDf"U^@f?]M')ZHE].Q6Q2B6X@\(JAm@[p!5Pm<<BP(YS |
|||
(KugJF-P/#F0aSL@9Q.&LAEKY$G%"&gMaJh3RL`i.m9h3BLrh&K5^_&1k)N/^QCU^f6\K#_pP@\)l<*M |
|||
jMtH2YAOPYaF=S^/Kjb:Pgaa%UKed6Z*d)+I7a&sT8&$=B9'/-3;V0H)IdVm?h;*'Vl4`$a/8o.'IZEV |
|||
0Nt6ABW9.>*`OYs,`/>5WaBH;i$eH,=jT"nM[ZZ^(^F:AN>@N4GU#B@6E@[LP716*:8SP<L!/qg?H[P! |
|||
B)Tg.??jRAgV`m6/%s)D*4d(9-LkVSY`b\#N7Iib4o)0bfW'SkRbp;d#t_M?P?,NDe:nRSS.-Fl-l7dM |
|||
e_4!'911%s9\`Ln%)t'@[XfeFO$gaI(bXf>a\/5tf!LmW:?K2g-d/?P=DMTW?f0c;rCMuQ:#\a07OpEd |
|||
-k,TmiJ/fW'<-=+ZTL:]UX]QtnCt:5Z(<nHYu\0$g'8shB#Kn].T;hm=%?",0h8dg*)iuac]obQ,029n |
|||
ehAIUb&Ti[XHct`7&e#Pmn;^#abF@dXdo'I-ZT-V4P;dj!Bf')7Z'<"PV!_51iI'"o,2e9jT\M\[GXVK |
|||
7%TX_B9'0]WRe7mQtiQaQ%(e9P+?NmAB<Oo0g^E0qCr6PN.>qi^-JgK&gWVEX+$a^*.&s3/9-<sYi#;1 |
|||
I4q_+B`/l[L>:_U,D%k_fSQ]8ENBnSQ&dgS\<M?$XECREQ\[%l-#c@GpIP2<C)_N?cX;>D[M[YBA'=_X |
|||
b&&A%(M6S->[ehA]<D?FXeAUYW9P0;ho,emnbYnI=KWOpMn]fQf!O_2jFaU?Y6`)a&,b@pAKA^0e+uqB |
|||
\7+XMaE_83(4g'mbLD/iO#`8>#IE3<UJKHeHuUNj!`<95[K\bB;O!Ys5crHI,a&A4IU=!(<]T(Bg;Lfr |
|||
,jj]LPK544/m?@HrZ!FjjjkEk((c[0OAi6$`6Dg-e1+LM6t-mGI-14X,o)1lauRuk/9bQY_-1JW%gn$' |
|||
Z`YUB;_=Qg.J83pV'SYX%9EG=`pF0tp.2q3_hNNe:<`(ZDCMUYGHM@i%3:5'j:+2MO-L*%H_4"!Q&fn) |
|||
;p+LA-!%-R[CSao@[4kP-1r#HD<9&PrOm".B4K=7MUb;>.orq+XI;1Sc1tNFoiM;*[(PKQo;,f.r:IiU |
|||
e1,=PDSpK1`f3Gk;np\KYdKM92!n+1@j^_uhsN#]S)oCtZW;+!qAHphc%oBL>>4G8Tog!m`[nUZP)?Yj |
|||
]5\48!aR;M=kO_S<(g)+l2e:b99:PZR/25F>c_DF>M')H=_'16Lm)4@I;!bA[V!!$1[L2O><iT9Akq&= |
|||
b73cMXlK[Y7,F$FB9'0rB<%Sp8'Xc@5ur9<a*(L/0O'W=Lk8WW`@As.Q<qugomg5B,tK9j<rGAF)dErU |
|||
ZGd8j_].oGg@rTuH<C3%(<I#7/g%`G`"ZaIUKn@.kK'.u(*)EW>\p^sUKUrtUC2LU9&P_mG-2abgj2k/ |
|||
[DmKQTj4.A]YQ':HN^4c)TZuK=T_5gX>MigYO?E.6K=ur!&T.^9l/%.[qb3A>15rZdaf1Wrj9T93X7). |
|||
5tP-RqaS,1rMW`O^j[VKSAHJsi`\54hO3udo,O'Cj#i"&hK[I8M#pO\@^ZJ$eP_X$H9eU\&gWVEX+"Co |
|||
%ot^IS$In*pTLlh>F\)sH@3[Z>C1GniP,Q=((c[0OAi6$Mjqg<W)_UQM8U@_prr7co,O__SZ4N*!VQ`@ |
|||
?'sSQld?9-^V/?JKQ*:BX[,^iF@iC[")=*e+H\K_p$3M<:"BDI&V^aUDL[t#Io*2ss1s*g2giur'BTg/ |
|||
Z/`Z=\]\FH]kYijT%=CB0!X!$>$W<rYtAK3@HE/jX'Ag-kcb&+K1QcXPE8kI1Apfb8aWS@I'%sq-.WtQ |
|||
Fc!,IU%)H*i:f0EPrA1.rLL:a#OPZql%A.->Pk(UHNkXQRD]Vb4(m2)b73cMXlK]Z1O)9U&Z\I'9H?)M |
|||
B$OhoDl$]D1TK#72gliH+Nd@$ef^koMK2W+W)[#Q7+,Jnmn;\M(!@VBj*ju$18ae_=OZ1a?J(_&hVDUq |
|||
7+hWNfJ%Bp^0,>U5AMQ(:a5Ib1bMh6hV"=>IV$eanRoD!cFLU=905uLG.pGeV-Tt-#!(5^90/mj:ogr+ |
|||
M57tf?YKAYHH7SS[,Ie/&@_+\1X!$%""fZTNp^!rIf%'Da*rB%[>U`MVmU^B>L.*)NG!gDoiA1IdB.Ig |
|||
Z:a&8P#e_(<,Ph<Xa:a(Mmp44H/k-s$/0Q020J(rmJ*skP*T3cBXD.(htiVXdfuK8<G^Z&2S<&=CQ>jT |
|||
"h?:jS+#,g#fW/;r8>%q0>_bYqGF<'Jc/:!3/'eo`K@&N_u223kA>FWV;)<"/?JNl4ebR`M"21b2370- |
|||
k)"+W&#`K3JjcTSeF-&j_(%BK"_\P[*#N?BrbeE3e"`BSZaG'M.f1epZp:!:N1@1lPag6b>/^r48A%6J |
|||
cQ$<*Ui,"=2>$45VmRUoj_=*al?3+Y;.t>k1jR9,;lm:$;sIfW-LehWks^5)^H_b28,p4$?XBr7:TrAV |
|||
]j?IW`@cV:`4u<@4+7"&r]>D=r[Xf?VnHEm.r3cF#'`O"7[_30!ok<C06mB]^VCjrV>_0<qun.Yr;B]E |
|||
j:MZC^1,1dJ$i]22S=q;k9`pu=(7Gfhg`U>Y;5_dF7G]q7,Ut;g8kq$@/V/G7c'"T)4`;eGBik0G&i<U |
|||
I'#SZ%S-)rH([HIni=->E!3AHI0n<=lcIXn,jD]<oh.FK?_@5*jtAn8D3"<]2!P#h*'0QI:&To9kPY9[ |
|||
h!oE?cVXpp;-bs<hE]qp-EkL-&#]q]p_g>\)pgBoI_&jh.oWE=55r<VPT1_C[\I+!861d.otb10NPEa; |
|||
K=B&i5;YI#q45%MnMU5]-Eqj*%FgB^_W?gq]pJX+d0HkP?<_ZT@-E3gf\M5=;:b20ogOc$S;qbkJ&A$t |
|||
TUq"tWrH:t_0:Ng48eXRcifdJ`l?qT2t2A'gkBb?^oP`IGOf%`jeonK>>IJ[5sL*>^iHrL*m/iQkNT8& |
|||
/R35j3n]U%9+Yt)-1FC7cfO39*uDF+ZQZuKprMrDoPW9)2u.ASQ"]s[/\SB29_E%:NhF:@EZb*"qPZT& |
|||
N;D1*:I>AcTha3Ji,(7JEkK!D"!>[`3P&#[L*+]<s0n?V`u:2()gM*0-%c'@b1)F`EW"e2#AqtI=7.t! |
|||
+38uh\00bc'sV$'KhX!RlAm%#O3pmN-$+3B@c?P,mu>"^0to$`nESD)K/)l*2oF_X":QCIFZpX:$Td*L |
|||
@u5Z5*@(*/`\B*t;\<I>#^8C7p1OEN8'#t>O-XSabVA%2H9^C++7Fb?hX=/*iXrqsm',S`X:H>7OZNF? |
|||
-;*j0c,q^/T\Q\[pd+ff/<7,l<1AAg]0$4?bTedRj?ZAMENs`'Ug"?=BO18'oTNZ)3B3mB5S'0d*%CNQ |
|||
I$Bs=Pf+sJ#-Uno!>?K4rN2L-=_h7%%+0]J@D4hmTNp]i%>H!/nt77gp+J4R5B5n*Bb\36o`+5MJ&'sh |
|||
[g13:n9=Mk=bc0&`0!d/U4I;Ii6=a"R(,,%`0(Z/=>&;@]MX%VV8b^6IWi]><Cgp'--mgF0rt,i$o2gJ |
|||
jA\%c5OuU5-T5YYVCuS#pb=t!&3Ti5i*V=.Nqlk($#Ap?V16(Yi4EB8"nXn7,rC/9(\p>*rk=g"7Y]3P |
|||
82!Gd4-!=_dN&QuO6/4e:\1LI6_9e61\eAjqA9-sD"348.=m6`iG;rA>j_B"lrL-)Nc-_$P7(]Ec1bnc |
|||
U);ct/Fe7Q81dM/c#%3*B"8^JO(u@II;lQBpZ'Yr1qZ##[I4np@g;f!J_/cLq$,K!Taj\9+.S0&es0Q@ |
|||
#8UqFq*>DS&UI\6BPtqAE*Zl_b.6FF`,`=],X9%4XZ1j(7)fPr]As-i=3AY7"&!&tXoY<QgD1&ll[sJ@ |
|||
&eTi1`,#m(ZDB*2oY=Y0,tK9j<rN$!)SaP<Is^T@K\\!_^E8QbR6c:G+8fL^\`!/!>t6D9/J*(aK#kM# |
|||
6;Zc]H$>u`XC`^if1=?"<`"3Q7V(ek7;h0+G(W]8jbe`!qJnSA+ps;CGPO,a*\CC&Ta0's/O:RpYj*$r |
|||
,McuTm=EO:`V;<8C2bQ^:I!d\6Q8;eo_7[$i8DF;<r%XO8K,`9QqrQQKn5$!di1f&^!*.a^9m'ql$$Ou |
|||
"kE'LSlYb!%&Mj4U$?i03;j<qV;D=$:\c#qe1m5Pn&D,-H4R5\H59>O5lKegi9)->G@2it%Lc@P"2jAI |
|||
?mts`Lr/V2R!o:a8\]m+2mh(mhZ5$LlaONYTDNp0*>$[%^ejkJb]CJq%Lf8mJS?J0%_S[uG@3E/%d"YJ |
|||
mpMa_niJOqIKtVUmssWb\'XCkIL"(gs*uMah?0jESct@WT^$a:ejRfap`5#/<%G=$M4h\oIU=#.?[`6u |
|||
oDgS0IKs2"nN66/_sbB;qAke9&<Ggpi493/"%1W-@%LBr%Lf2k!E&V4&4aL<icbsqdX-MPd^+H:"mRbU |
|||
"1BOs?H)@UoUoB],tT?k<rEfK"7Nq_G@3:0^B87=ofFRHTiL.7G>Q_-N)b@WoiaQW_,,XV*>H.sQ.>>r |
|||
Uf[AMha-aBi)]ac`)q8FSpUaW"0imE%`F%1GY4QDXmd\9%O*8_k-A6A3>](]eXCplachS1mm'!lpZT__ |
|||
%EDr=8K?rP-RE\\q&P^LFY`-V3ih.(e/B6"^Os[mX@YORdV.b3!!idR^@9#Rr>C%h_(8"Qj`_9;`13Ut |
|||
*@.8^<jJ:M2iHQZnt`WRMr-h]7&6b4fACDE<kPi,7#@r$JQeh==7J@C4g7t%M%ZWh;njuFM^S&;?WPHu |
|||
ach[q'0HTi!V%Et$cJ5qrT/5GSlF!<r!nl;e_4%$%`FRZpj2`V"H0hr5VVO,gR0_0K4*j]/"'94%a#&# |
|||
^5Cf6bQoUUk6och/O:RpYj/^m*>DOWieI(e#l@q3?WFjni!.,2'Q7fm;tW4#WKiP&iEXP`T3'RS<GVFO |
|||
'NPO1IKs<=>A^Ei#JgjR%%MbOKiJ]-;Q1$[BeOo?V;-b>82#Ds+]6d.Gm.PW"^70c\-G:O$R1e326FG: |
|||
JS.:$+]3ab*J=m*\dhWK@K!-)gq\B1`UBJ($@?P(^OsVlrW/j#6k<8!^2FC9!`d!fBFT#h`UBJ`!OYNm |
|||
O@U:kqL*'?=N/T)_^=.@+RJ3GPH*M+Yf_r.lRI>gV$4f4p`0L<*-$&m3s\l<6t-mGI-(.W-.TJUO`RN] |
|||
Wo$+l3pV)gW5&6?U,C/?'u,Bq#Lk4T5pC$Il5-WO&J*rI4M9QrB75G_-._A':;uY9_"%:P``;W^b6RB. |
|||
c\.%@ldC,pNiV!o#Cs@#i3s4Rd-sB,A!Q2-L]!]$&7;7eTWT*tSAR"mKg-C\pJoV(0*3m,(,uO_%6b9+ |
|||
n08gXNdudAf,,%2/hS<SXj9\S4He?Gn3.b!'DI,-,_cOnnj_nueFVTU3;+1"lnn2XI9WKdlYY]'5WA"[ |
|||
]q!>n*mDbgHqH4Nbd4%f2gidjWEh=1h>@^FG>/P.%VGe+"n<:#iYCZ^L_NnZ\NQ3@GO=iKkC\NGnT/<r |
|||
GiaE`G'P4XiG<P8cah@cd;ub9`sB2jW.*1()85<[-n!Waj64=89m\:,k]>SqDWM>@AjF#2cM8&jkV[]B |
|||
[LHkM]W9;&(N8M1.WpklkY&Gk<nYV7qN-N3^Y[=QQ;c(8hU(H`Lc=sp4n4851TTTe]Se`@OW*h:^7d4A |
|||
;G4^9Tb!![I`mZ;S9Lr4c5LrPXr.C]h/g<H96e]NGU9P]8uTM]cteqGc;EHFkPWD)3I@cuB6ck:o<*CT |
|||
Q8eGu'1'F?g`(V;;;TZT7"OVBqIg=Z?KDWEd0"-KQ6;;H=S;R>\E7)0=:a`lfBer'nCBbc)n^jUCkPm\ |
|||
R]1u:lOCO>3TZdm%=QN_XHg+>-0!,uNNX=/1XAJcdKr4RTeGL[lr[nG6QZpQp"(/ZBFT#hjUHXc_\0TD |
|||
)u@oheSf_#T<'6lar>Z[2r7T5ooGIJo*rBX"7Kug<UbaWUu&07I-TD&#_pS_oH=fDJ%_PB%4c'EDs5[H |
|||
nV1B*0Y4b;hp<aON*u($6XOlBq(DEa4[a$Ahp>G*@84Qfe1,;:YM!J?GjCsPKU;2628!^j*=DJk)g^2A |
|||
EfT^F5-:HbOrMosZb2u-<fpEqGs`Z6rCp-<f3cBbX[@/@^7d4N'"@Fd5$H*L6P$+q>(T/j@+F^=j'ib9 |
|||
=I2`9`Ye(HDr&m2n.K'9L0*rO6_XL*6SBBZc<9#NVtIAsEW[U3Db/nt'tdY0<;,W-Ds0j)Qd0F<%=Lc8 |
|||
e6d.XUG^8@PrJ>(%o"RcHp\toXSOMekR4F&\+58;m/,`=XhET<#<*XY(ZZP3_CBb4]C68XjLeK*I7#*a |
|||
hPrHjckf^hS8[W/^2LE]^7c'T\A\pQL;'mL^S*<[4&6p<QSjl3eB8g-OJqHR]]^uL!j0Tlr&&iRbB_F] |
|||
GR5J#[WOs'Ds5B3$(Pqt_nOHD9u1#P%IE7\hU!'>TiPfO6Q\>eXa;Mk_5[G_Ds0Q_5kPS7[-#ba6,'$G |
|||
H9eU\d]HeV^7g%]$NCa?Eaq%NQT+PF08TRnf(A/A,N$kk%YacF%=Qk_F3a?2^0!U7'fXq%1Zo_R_CA'b |
|||
3VeCnEc1P>I7#*a0(jP)Te@<k)GU$^5$2AhVtCLIB^+_]/)S\i<r"\"6U1Qt6U0iTqL5p*X**E/J%T6? |
|||
^N0?uH:._9OQN0_6U.,#45rO*:4*VfGL"7kK#Gk$&;UdDZ5Ksnqk/ub)8^SXQLEuGgEFQ,9ltl(=d98" |
|||
iXnW[:?>`ph,Cileetkjhss;^"@eWgP@'/k[Ema>:QM7(nP8@n[W(..R[(?8iK25'p^Q'&9Ck=G>TKf. |
|||
Ua,'n9p&8ZO;K'*;,.6'<k5[kkDM7f*@XS@:ZXoL8#:p"IgM1Z?ZZ6FHb\QRmmeVG^Q-^6a%djC)HkhG |
|||
+N/=Q,M.rGW.mc_2#JB[nc6"NNRF/KFmjPf9Je@d9Yt_)%t8;4'(I7"b5F0QOM;#ZCi=/D";"phQS<Xn |
|||
D=TQXT.]Tg1=a\V"s-8RZ8Z:gJ;O4?D[?0g@bn!UnkBj\\#o20`;XrBXX@f-5Eb.,jC8KUFfk5Li[0'" |
|||
2`Ue>mNc>X^49<d?YlRPZbAQ;KctfFMs&6[T4\EqHhQ;eW?13RV-&cEjmgk4)0i=Cn!$Pq2D4qi+0Mf! |
|||
(iu8#1gh7LbB\,=\@5,Ok>XDr[c>IN`#.q+_9^8aW+aoTYDV;8,(*d^rX.7R7t2W5f`N,j*N3E$2D"mb |
|||
K-?^*5KL>J#^UM/RC^0a\E[5rOg'i^jrD&_f/>#"(F3>QE7D^e9tti;iHB]2G+2e:@=dN9AI[;nJm$S- |
|||
o1::\nWNedIVX^hbP1KoChlW82\9<`j(L_b>2Nh&U`JprA)pO_FWC9[L\<Kml?M^i40a9EimXXhG@t9& |
|||
Ncb3u:[BaSJJTlkT>E/3/4TX4n)i`Qhl],%r"#Mrg">0LN0PW;G?Kd#p95]%+S*Z7dd=LQWL*A%p?-[T |
|||
=r23`f5D\i:^]9@!`:Sj%:ntXKk608UcsCCfn3s4UrGAS;gRqRge+4c+'&8$2/((&;7u`54m6MlCr,Rt |
|||
rK=0Jj7lI$p2('m5qO^.BQKU)(&YZ!lB?Y*LG"We+5;p!JSUubDe@KkR41uUC7P(="VGAjC^Erkoa_o] |
|||
=KZT#>p<GE-;2JCd@*VncnTUQ*_Ns`)J?2%+=4&aFc@KX/P)?CQAljpYl5B8NSsP\@bJuqVqA9mgZJ.4 |
|||
)/L>BAr_?q68inRXDn9#?>RWa6:T[fG=U;Ea4N%'F!Hr.F)0R</l[.YQo<tb_e-R:@P\NmQ_)'q&QSpX |
|||
dq6sq8F>@"<?=/tbs4q-)/)i)oBJ!]N5(u62A;Go]2+L8Hi-HWNpUn]#NAn8Q"uQCl:[U,mP#NX*W3pI |
|||
*G^6TGDN*HPqqr^B-:km(aB_T20r,;Nc!:GOUm:Z'p(@k#-Ea39/Fc%V2&M9%l@%NTa#F@XJ^MU1O_"; |
|||
Eu&TS?j5fiQZ03d*G_'pj7fB<\$An@=<6qmH=+GeMY[.!^_^t+r=`PiFdt5B'5Q,Wp><'2O1o^/mMbl_ |
|||
kQS#sn5WHfY\o6jP+bJ8ZCpYl/B=qV\o2M_[U?E$M#4W8mu,2Eje$a5==N#2!?YtsrjGgth\TnE2pOTb |
|||
ri^QNH[uFAQ5qa;*cSm343uW"EFgu[-EW#gVk+Qfrm=1G<e.?E4&`&J4h;=d^:fFb@-DC4,A]Mho_<&, |
|||
?N$qnMEY;@_ZuWtT+l#',HRFW5@jEV%prmtql>1]B.%4Mc\4AHG'-$T,^s43p$BL6j&G-sr_3[KqE^m3 |
|||
6p_DHK*q;_bBQe>LHR-=d+p-<_tq..P;HaROI$71/*62,DLF-+3MD3Z(Ks_=WR:<((RZ'](@ueUh\@I* |
|||
qTPi4$s`rW=mMHi->c40nZrhs0tjGJ*d%o8[+=u(8A4!8AdG#<IZS_jC2kKeToSZtNDD##3lf!*@_X5_ |
|||
l\T!+in":I^;9;+4mT_f_&YX%"([dkF]o0/T:Oh*r*o#Le;'>NUt(=ZcKG;Yb"qdq=?#E@3d`M6q-.<u |
|||
,!EXdobe)tS`lW6+6UIdiK?li.gCIn,5/hM//8cNHJP!8CW5>kTftLL_"lB+^oJ88@rYt]hM'+.5M@jG |
|||
@jpD[p3TcA>M5,bJO^b`h,RQ&efe8T:EIVCBW9VjH:[IUQGdUdTX.tN&^RjS?u[O5qc?I<J/>tMRO%%' |
|||
^f*Fj%=>pCY=mN]_/TtI6$P'L*@CK7m^^P?13eg@#>]ckQAjV\;,;QuHHEYl(O2FhIc^%U3+nFN(\[_: |
|||
*5D7##O=$^BSsS)'9?/`"C&JGXJ$#ned&h>,OalO(&N[1r8,l3H[j'sioc[-5S#HQ<O2F=a$!I#raj]T |
|||
<KeTN)CTH3rH/Z*ChUP&0D#imM(eN+^/7dd4dD`:jQb-."hP:i*I"*MdHc#brH']$T"0+rGP'+)Yb/EZ |
|||
f%lB*X&90%4PX/4MC:.J%A39F3Uab)s'SS44n)^m:K])CBX$drB@XLr-iD3WfNihu(mtn$WEj'WBNQc1 |
|||
KLECk,/k\:NhQ]^lY5i,kBd*<<,U+C_1&o3d^I`1DHYIKG@(7PhN=dWZJdeKp<$8#coc_"o#A@@U5nj* |
|||
OLOO<q82o@4^0tOP7Bao$&!).Jh*h:WaC1^PoSuQonAa)>d#(*\^s:n>&&HFX-,h4]GWUe:/)S$.JAB0 |
|||
QK`ZM[:=p!&U:DC?@cI"CcIhE$=_2B7L%!^HLrN7;qAAu=DdtePKf?l/*>R:"*P-UD-aH@)8JUd>rb,o |
|||
Rpp5M/Y4t'gVBtKRWdMPe/<=,"S$SUpffN57PI$_Up(AAgoLANdXUbLm[,qXqS2M(QIrrFM3VTR>!*s` |
|||
L[q:2!e&f<<o[O#]J.h+oY9=:hsq2J[7i:%crXWdc_NY:!unl6Km05qQT"ZC-W>An?f>_"3sLr8+_,cn |
|||
mpF?CLL!V&:B(^9oF9DLD?KB.fYq&5I2-q-16to==54F4[.<-:YWTJ/J6"Z4orl<j3m[?"SL/:5h/'Ah |
|||
YNIne6\$PjM!Vp@Le$@qjdFO`]R^IS.S*oO"m5'akDXa2Nrf?B5EA8<pV?PRluTO<iV.KToKP1We,P#( |
|||
YP@%6SO7%1*W>qE[IEC\Y[f[3rOmj<0Rr_l'+Zdhl"strV=XYFYJMo`NbChh(%W'PL<S+rO2HL==jpG\ |
|||
-Y-ug.]gq((.LL>:\ZCjq;t3pffd&a4+_quU1kuFoT#J!;hnDR2e!KVh#G7f-LU74V+2bs)Qi%%If(Qo |
|||
54IUIB<HB5bK/Pm/\H(/)i[Mb(mm6O'8M-?J[5LWr[TVa4Rj60W"LDO0[Fn$pKqp&n\jZ+A3;obig1B] |
|||
gd*O):rkZ<^<IOn08=)!]<Q;WTQ0_BGmi`k"+;rfeEX!uqij3Kg\;-9Ff.W+I*8]I#!VfO,L7b5`C@#^ |
|||
m`s^1F_=Rc+;+A@PW*daCe^^Ch$nVSUXR=hh]uK'ef#Gi0>q/273f<4meR%G9@NUglHucld.QJ&hnOM` |
|||
C"Mh2(6*aVIp)Ed?,,@o9%=4K^,1.*meZb@;==9dVan@JIS2M@rIMNFO'`FqHK+:=W+Yjg]7,4tPe2D5 |
|||
JZaF77o:,6laPH)RAk)Bh"?")o\B-2/#D%o;s2s/#NDo$@([d'LlR$l5JJMe?,-.2Q+ML_R\;Fp>;1ZP |
|||
+#>'1>=kBSYP]oH]YSC[G4<;i^j#_m&&QY'/jom%$7\Mmf,_2ID0EiLm%\T2f?[X2l_d/1cGA6]0e6E@ |
|||
WEUa.B1WWEWe6VEk(<lKl]2X]Qm'>_H8kPNDd7MbF(69Nfe[X=i`rZK,N:\0%ZCD+PHQqCm+K,R$Egr3 |
|||
/^_2N>(1cg<Ltht2b?$UiiBCADpe&+<M$W?HqT_X>oLFig+hX`fs@B1-T/R]XCZ$ooD[f6ar@7uPlE8b |
|||
qL!JR:F<ff\p*es*3Z\]_^#&(%e\AlQW8C'HRI^a0Qh*-H/m)Jg_1+oG2kF17mZdGT09sdf/[iUhS]$] |
|||
RX"4Mk[l@=>8@fb9t_9\?`[hBBJ-D6%':AsCO,]kCr+h-Yqbq8cJ!(T02]@chCEh.j"7LmhV*J4l<K,s |
|||
+O2%GX-p.N8#Yosm<m:"&NX4[_qU;FRFdH2\i0Bf@rO$Qg6+(7NmQn68Mrj%Xi`%:oRgA+&Sgc<<fGBn |
|||
(nnaA4WSA:`he)h]2NWT=7:J43nPY1f<n6Bp9f.9ni5'd!q!U1F.R^:4GiI;E!Hsjpg>1>$[f</Fpe^H |
|||
$[gemjQXk)YII]ioA1VuLBTkF)4:Z2X0SR.o#UsbV:,[U^kJ,8)PQiT(V8m-VKSG74m2?!].buo:TU6G |
|||
86`F%HIhSo2n-T91ooEGY7pW6+eKP;VL;9MSAj-`.:8@m?N#L7G,sicNL5V^gO7eZG8E5YgI&"qSG;F_ |
|||
BCM3JF_>N;mEN>A+$&(oVd>P>%(lJHbNJQdk]!`mg(<[!dkAah%q%,Ap=-^+JQb(kbf4sR2e[!44g:g" |
|||
:3-r:j=[jJcV4#tD6Lp?LVM#<r4[9>j>QbJVXT"Q+Q$n-k9!io`>%-p:/5Y#Cum;Bm8*2?6&%M)mhTES |
|||
jNY/6d!+I@4n2"dakV!6S`H%sjJ[nIJe-;D`XbNQfD%9LnF!9b&9^sWVol<YrLPu]3'>C]i/=*aT^gf! |
|||
Hr,a1/C=1'1:>:44D2ReVs&05Bch1BQ//*kj8?Y2hMUR0]eB20?#k\f>Hf^\:6pF"oN.Qa.#`;jiGAkO |
|||
-0CT"b.?Z@i3qmL/U?eiRaJs/LM'FSh%."&XLNNh+BF/RZ<5MEP#&;k,-W81[V$\Ar/-[AQ2`?M/"4(l |
|||
Sf@)f\'kdW,B'SVabo72DZC7&FUXmsn\N_8'f"8c-XJ'.?#g-o%-nQ!.+T]Jrq/!n2I7?to_1GP>'Rd* |
|||
$c9LLdI5t;+HY7aHS9<.nsPK0NB'PWB[>7&520Y?UD%n,T:U\e);;cq>C#C,\]VuUYLab#=56:`i]+@W |
|||
0UsH?HCP/adYXQV7:0>Y_h9Y\jX)VINu+U1*;\^a^LGgpY:okEc]"*$?3)o]hIs5`ato9EndO&>H%n+Q |
|||
StV+-8+]`Bnk/27b/m1e;(gnbYu\l]UI9[a.oMsc2+46&6Q%?!:lU]P3$[N&b"-eG&Lid.On+m'On,7% |
|||
d*aD+ngMmi^EmdPB`/YpO-hZf$tZ6IJM0qiUccO4.F0i7On-/^&h2.G7`lZeQUlCsBeE8bVaSZ`P`bNm |
|||
IXV[,7]KT2E\a@pPfn;qXHg'[-rE8f;BB$U3Cepj(OCm@,Nb[me4ZT"U6imS.oIECA(D)ofJ'%jQWt`r |
|||
%=F_#Z1%rMX9(fuLj+]?2\9":auuq!H)'1A;P'S@PXcFMnqa&Jmh.'&b%84If#h*>PUK@e&E6P2jftXZ |
|||
DLY*tUR"6@<[-W;Pt62WHR2SH5Z"53P\4j3On&icW-uE)jcsp(o(Dm\fCD(&*p\kXGm,j(AW;pUd]<9l |
|||
;I8j'i)q8cM6RUX/bog;o#,^-PU@eGoW7+F7*:EeS:2uda8[RL@ca[pRqg2=H-)8,1K'fh&eWWV-P7e' |
|||
4GcUSi^q8(?BOeNl8k@);Oo[C?ITl3bt*,F-WO)p7EUgZ,A(48_"37%T'4LVPS_P1'NQ/4,NT)=4`<M_ |
|||
Xf"S0',*uEnYEO<8u0,@M&08sY.o-ZXb[H7M%\?0H"r=ZNY3cooq5J5k+PE^)GL+D1bP@f>WQ#ul>7hF |
|||
?LfB$h2*Kk$Vrl6'J1Ha,uU=Z;WWc`<U3p7jbY?2n,8-.(G+i+l[iOefM:ohkJL4BjTT]=`<[V.,uS'n |
|||
#V<I",3=NE-rDLWng[EZb*C^HBABpC0I(&;]aVk]F5'SD2U4LAESE0bYIgO.=DYqMo0%+8>6&rZd**L- |
|||
/P#(qA?Z=&SF7W),K=T41A,$+1+-B4A\!&nVcl7/91Tb1.`NF4[tZo0C?`FsiFm<B`8'*CC9Zu)YmKeE |
|||
_cTg!nf$)`DPd>Fk?Gk_j2uFNN;Mk4iG0XG)90MW'b/,Jj#ZTtl@L$[*%.cjF)/CdnIEaR&`(c;cq5:b |
|||
(c-o=QDsiqM9'rr:8;(>kc>NV9TVY1+`H:ke95ItO5I@@*_rg6d3#].cp-_\rVfbi3l;J#\m\_NZ0j7: |
|||
ea/N/E#+3;hWoVp?4`j)$2`=o>l'/:a1-@2hp9lp_ePl0Y#0,^?/jiY%`&UD;O?%61Oe/]j\F$4XED[c |
|||
>b\4*TL\/p\7#M^[/;%=*qp2P'RU9R>$B8c2-@o&7W\mecH-YmI)#kiVd,&*3)N_KC+\!F'7BCj=&s-m |
|||
GFEDP];G/.',keaQ@""?X'5&,.nLFglF4\J7almaE'uWed;Bm$=PHWmYds0D.Bau'NP?cdDTl1'U`R*J |
|||
;G2:R0Og*.n6<[(3dciKkjQGlH1BDo=(T':'9%^dQ.JuG^'1(QpaUTm"VJ3s;E<2^B:$WI^2Mn1f%O-) |
|||
915S`?t)S<m'+T_S8?qZe3U7=4ZZXpX1s`tCI)a\Wi<>TS?Fe^O#?&bb?ODo?i$&-]dBibV,aU-3pm'[ |
|||
b39s21"S\h_CUQZ;YU&"Xe(2&djKV6gPp?57m(:l>-k2/XQUoA<dU!2CI.V/;nKPT%7Mg!jl-HAC5'^) |
|||
,RSXmgh126Qua[]i*KCoXHcuSZE-pac*a5DU:"CLpB!ADFSMSMQ%PE)\H_=d]-iY'2R(dPqX$F]$])(Y |
|||
;GO=9<3FegWYI$F8HboV]Q]C>X(U^o)5*[1>MY4l)mp?eng0f,VaRe5-0E@93SDhR3i*m"/%%d%R\Eo] |
|||
IS9=Q_CAdFOO5#b^A[90=T=*kB8PI^]Fiq(UGnK<Y%]Y;@k%.cI`U`4+VE+J7;iSRB$ODN2\t_?'jX:I |
|||
%,RYi_($CNYZ7DV7a<RiWmMc\f$J)"Dg\h4.5hab)oF!\Qoa4pp0Ok8UGk]"hACFG?KWjCBCs3JDjD?n |
|||
cWX,$hAEnF$B+i[(;1H^pWf9f<r>h_NUs#QU,RfpJSOhsBFT$C'"tR6iFjg4d2PH*<PL2H#HJj:Ah27J |
|||
_d75#;N9NM[eAp<-_iVd((fpI]eNXN(,sk/NPQ'gkUt7%$`h&V6E*VU<Z/TUP`*U/Wc`$2T@"Tb,D<]( |
|||
N8>C'?.*GHhABFj7'/jqXK7$;K#oLZZUA_rI3Yb!>!J`?MAm,?;7qI9DTOAahH3[`O,E.\V;.aZD+8FP |
|||
M29_5HD>:Y3EM'oR+@>^NT(.1D\R+\?Ejj32jVt-C<kEL86T1CH=KKFoikl3-EB\<]gQe']cbI,=qb@! |
|||
b17,$:Ne.^0p=Sl2p/j7Y,l!<SeA_6]HMR>.amT2d2O;X^'L4iigsMbqSU44-r>o[(p.5l;5,ub4Ug^X |
|||
1O<PEYj1tZENoj[--@PG7oAu3.#Ve6LqtKD6[VAVThr+HGaIWRZ>Z!YlW:34M;BZ;OM#$;`(Gtfp?Q"Y |
|||
2jSJ;S^(d<`fQ!)j<YinH=O>SP"ofb`m>>EC*e2dMcGe=VabS5)pT+JLu)78s$2LK6uNLj3+@a`]eNDF |
|||
'?q0'Z':18\Z+.a[:]'N_CC*mH=PV%XgZdDNPQ(5\07V+(03_#JkY!G)Etm:JY],BU,Rfp<PKiG?ssdb |
|||
[?p*:@5$e,7jA4Jf\4p@9h'%P@jZ.aD[cM,mkof64XGDanAZn.o(-(!op"["On6SlB9`;OghN2>N?M/l |
|||
)SIk/oB6Z7UGirOYh"WJ3M*7eeF-&j_(,4(V/-540s[,NIG8,V)eEf@cR:jh;@A/%M;B*Cc#U_u=mK@f |
|||
2[41shE/bZ0<&/7N#B=6Pe/ZfSJ&Uj,[*78X3hl=<L@ilk`&"A>;rZ%]eM?Gp%rYC]lF#h]lDWeNNLN. |
|||
]L:adJ&G-1a&i1_MVe-3OQN0ohK\qL/6YLi+b&p0h!i@)%K#<Kr*.R'4D;6S4k:1WplE0\ZEcRocYZ/) |
|||
i&>B6_i7AsPSQXJe!Z?`&$!8fMnn@*;MI5AdeLtmi=k7+5%DKl#@)E$YD^d/&pn:pG@'PN5N1^N^90C[ |
|||
L@#0E`GjDKhf^_\_=>$]L>;+B>6B6tC<Y^VD=@VTZt-@O00_`ZA?Vfq_r->;JB2*m!4KpFR>sBn$dhql |
|||
!b0*M]\NnKOMsi'0=44=fT(Frf^K=Zg\^j55_gCeP6h"C&%G<@pL&04rjZ;$:%Yj`-HWL*$+pi6j=Ft] |
|||
.faAfRZN)FfeE6`f\YXp$_K`$Mt(TAdfTNJC.#K,b22K5b.=6cH^/4,V#20M%BXdH&m_Jm\8_8[XcGh_ |
|||
$.3C]QfZVV/Cr&,kSf:),?H2bca_n=kf&)+&,L9J>>X`QchU'_I*V4fD2nhsr->70Kb8m'R`B?9%!s6G |
|||
l@i[7?#UlYSN?Euh"1WN$fdDB#B6J`MSNg5qLm+F*MK\)a)-biUGhK3`lFI,rR2h&UG2N"!dS;7qVF+& |
|||
Jb==b4XRV4U2M\$[c!*a,8s8;(Q[$c4"luXL.AmMI!]t3Hhc@7MTnNI6?Lf5^J8RXfb"$o!3nK]5/bL\ |
|||
n>JGOp0j)qmL:[gAA?q=DbRicI,.:nL^9?VJ&%Bqf-J'ajq$J89T60Oa>jpbZR4_B>egSa7J7HSHb5JJ |
|||
a.jEkAC2[l3I4%;/c*JVi3;G"?Wfn!LSO?B)"e3de%Fj^hs\.8h.%Y>]t6@/TV7`D`80IChM;8Q2+4Z7 |
|||
FKhf#9'&40$%*$J7dS^L*F2CrF+hmuHY9D/K:YH_pm]j;(ot-L\2mrr`sD5!jmV_l&VYH@YeAr0['#.P |
|||
:tC8t3u;^k&[6WtlZ9pn`]N86BYbpH#Z0p1eEL9HapG6i8Bf.QXL5[s%d+(U@3<lA,L<1`*\Zk_r^-Fl |
|||
'[)<b9=K^&L]i=]X+hCc[Lh[6r/C+rm\e*VH+Njr&Ec;o_ZN]uBVBj'4^7^VjOWkVcJm)ns7pXkim2^; |
|||
h%7]m644Z$k^j72bJI2?S3//_7&"]<B0b#4%idn[=K1AH%BD@KqS9u8'.hQ64e"c2pnWa'\0*Ht]<FX2 |
|||
]G],aJZmsbJFsH0fpW@KhmD?.R5FM%hr`NZ.t)dOO>d#YX;dP\`#NB)p&T<E%InoF.qGf\a.j&+=>qqr |
|||
cngToKg"WgjD8`&c\:&WOhDjOIH-8q'"QS$V2q6<U^^OD://-_itjoMp`OUtFYS?@Zuh^-Ka'3K190@R |
|||
dCUIDmlp;kH]4QZcB3@l#eqB;UbVGi!Cs]$r^>C(T6XY8(l?3!=?GJZi?Rm8EapBkDVnUsnPo,IcrbY% |
|||
*bgG4K"+%\MN3@[L*!Kf&@9=beRWnG6j:I*B!91--u\%(84q)459#k<?X2.HO8hNjC9[!tV/btIhh^4_ |
|||
#VXPnpD;30RG4IRO>kD,qWd&no7@O2((a:9Al?p.=@4Vu[)cG0D^($O*L&L!#LRa[)XBi$SV*22n-#K^ |
|||
TN4Eq8tnR*6AW<4Og?3g*6Sf*A?E#2OGMIbonup>>aKVD[blp#^Kb]\a6$aecM.0l4UMh7,;)321Gh(p |
|||
+_oK.hY5)i-i/mdQu4'89]A`h+_"=slQ;2Fo<A01@nUmD`s#Y6>FfC.3Q^6hj/MF6>*$AeAJa@@o(QLr |
|||
#B'e&d&=W/^:56Tn/!GE+H%ZU'NZ4oELa16H['q7SipSpl6fMK1"EM\=HDeK553YRXa=<T7pP>F>l,>B |
|||
Nj^c-&F4">([U+^/?Xc3K"g6oORdn?$f=i9I"@!QY8UJInD1rk.F)'3;hR4;Ii)ZmI!2S<'b<jDA[-o/ |
|||
j_7SI%^!$,KVE7'oX'?PB2(`,r9=l_Lr9J6*>1-*rtFKP`B[k6^:"H,cps7#4fHpc2>0R!p8*NPDl,io |
|||
(F5d\rA0W*r^%,>`[tB`40d*R0&t@WZ#I&bo7tA!MA:o?Rp7l`<G?oC'tVTD1=_G7,:D*:;6JAOe4Q,X |
|||
&Q*53\0LDVF8E0eb'!YML:K1bL.'=0+g5JX[>(Ys.<AAt;(f8p>,f?@86i-$7#jQtPfqmQ1NEnId];8/ |
|||
=k^s`Lf17dJ77hV/l0/X[TTNam:+Y;Ld$A<3al6`.uqCMB*!n`d^c-FW;0gB)i1#*FM`YOlJ,CLF+L$) |
|||
M\d2tpld$$"J[sUPrRj_T'MA?`]!D:RY">Oh?odiN<+G.@E$Talhik`6UNhW4-'sKeUICo=3[MKhdBf` |
|||
(CZj-ZNA:?gp*F:Z]8-R[=<Z]$J+W)[<NMlCL`V&.pMec>iF?caP)RBjAE)jf$OEAoquS8F!iu^a&qnF |
|||
@tCA.JZ61SD+p41#bqX4qAElE:5RVTkRke^HaOB(K)>p1:Hs>UA<D.j(N'AhCda6H5W?]"(On$T1Z?L/ |
|||
UZE'/(Io>9TU]=+bOq&5r0D\/`[F-;2k5Y"hDgMdkU'*&DHI6eip.Ib0%WXqQ0T&T6ko43WeI^-\@PjL |
|||
jVC"(Xe@&--o>'!qm1%mca/'Np'`ZcY.0`^7\4l]JeFfD.>#cr3P,#7&W.>8q^+";:.3pK_)NrT\SrX) |
|||
.i?9^iLDEXCIT?Y2S`;1@oU_`IYi+(_5gbMgSRBDCL?oicPjJSbSd[+`a/8q[>'to7QE>.p$3NgIK;_U |
|||
qX&9%G_QKqRLB#3aln!@f^)PbIHC,:-P&s?j8=M"bANVqA+rGd<XIP=SglAS29>O3+jWBr>Lm\+Wjcg1 |
|||
UNjs#8oNC;cU`i#XPrf;23ct'6pKcb>>iL@:3nuk\b(/YXn7CF7"OLD>Lm_\_HYSfHHR5,hQhmb>LlVs |
|||
b7]N</2=hLR?QL5;/U&](2m>Jo[[sNh/'d<]Ocra[q[>)AR"UVDct!B/SgeHDcs9CGfq"#DqW]CnWn#t |
|||
CLbo+MmmN?iZR=<05oO,qVc2OUfV>r9:o;:8q0r8<)E7RASWK&0Aa".LT%TqDcpiEXl#JbYEu^L1&Y,^ |
|||
V73Om>eFVe6>t9o[NX:8T_\/E[FV4aCr>;S.!NG=AQqC<>LlVsb7]N</91=J.Gh@-/q%&//,`m*;5!aU |
|||
Q=XhUB.r,ITnfT>.c.J)_5cDP/_fcf3P8q*k3=O6D5c<s"Y\B>?J_t6h,j$Jhd='_mgE=M+5X:,03MlZ |
|||
Q7_?$IeT/AI(o5mIa`N49]9?8):-O?ka(8,]s1)MN8J!,\8cnD`DM*9BR8^c!9O*8q0RA:S=WCr(qeT# |
|||
]5uue[`%93Sha@T^2=uJ:0\8^Q"52^H!<.K4Z2D:mrIfe?F=\$l4O\cknA9*FH9i+[ad;44LmJ.l.]6W |
|||
mud09q>5&K+]B3Lb+),25kn6JPI6-7qt9oihr5"]9HRFA:ULAN1t=GN_Jj?lrkh<Y\5>f0PPDt4$g4Np |
|||
0sYNt?V;S^\`=LSX1*9I_=c%:^6#0rIruj@@\#!*!aXbN2mP<bad06fci\'#l:I=u)Q`d`Bj==B:J1-k |
|||
4SQedm@\C:o]?cFKB\k\o+f^^714pfoZ@K;=1MddeI&1?7&ThF"k1pb2Gu\Q@H<sD%@0)\RUN>)c94K; |
|||
n#Z,HEjDN?3i*m"/%%d%Y2[&rR3%qoaXY0&G`Kn[iDGij&'ltM"/o/2!H4-3'mPa-C9N!fc_"*Q#M5!q |
|||
3>N5>c'RU\Cfi]1nJk3fa.O,*^iN2^+aN7oF0)1_<caFTWomL6)B)>rZ-"PrWP(F7A/"IkP.eZK/$0-W |
|||
?a;QaL<0pZk0%g>2QWFLG`JWnX4CQ=a2Ap[GJ?8\,1V+O,,]d4Q#cgW/SaqdL6*f[oc/n@0P<&1@mpp0 |
|||
[2%#mU;>@J9B0Ir/.5u%nDTPD^r%\)$3";;2>DpJ%Ya&gF%eKnS@a$+V=gn?;`r+=)j9sVpptdKqJB6n |
|||
][RnNF"CGT_/-B6k?).-ia+afU8=2u>!9nm99eWiSmsESg#.JXnf/#Vp@iQ8hgUhkXFETqUNhe&D]CK# |
|||
oc,K]F(EPu$Q^tIZ)I>of(9q4X:dKUa25QOg/^AWJf@HfSV4ZIjZ+*UYm*hHYu33^1lLO!86#7dr0Rhl |
|||
:og^CNeP0VLKCaXNSa$@F"HZs^%NELVrq172p2ZrB<AdjNWj?k_BRr!<`8CW3ShTRP^?p/[>O-L8//"K |
|||
N^[`NZPUrmU'K9'MW\)TYj1tZnR.W7hRna/=P1eK:9'mq@;CpI46\b+>!T`Xk?+t2/T.__A&/V=kS2@J |
|||
_CBftWmmjc>^DEqEYi>t>s-.o,,4o(*/iB%B.oid71ZKm.\:.D_5cDP3L6`j4Gr<hll.!7C&RN@'0!^J |
|||
9Y:CEP%5;PNg8+@eXW_IHB(Fr6a`fS=L(QYoGj'CX'Adl4NGALn/N*[8Da15*%S":eXWg#OL-j&k?(8S |
|||
oiq?]P#\=.<]nE500%ETCP)SQC^o5`Z9t>]nf3i&/*ACR@qknAFVi@YnV6,\0@-mo`=7TCqV/teY5<]; |
|||
XmR,D&d>;,A'l4Wm)=%Ik^g.Mi].bmXSR?Z>c[uk/_L8FChPKkn4IJJs-IO2^1"<7U&"7!P79&*/tQQe |
|||
rMoN)cS=sEj;"`2:Ff>rYGZW*Q#\P%E4^@TKg\?#jZ+*Y@Er1Aa,1p?lW$'f6A&:Q`H/,b$LoO9@q"9o |
|||
K!JMYJJLcG*"1U_@Z'G2(9*g\7e%HKjnan>W:a2nkrDdH-#e0jKmhin>P/sDDRdXpkrDdHj^=-'Ms"4' |
|||
r3?NiQ=fY,$]1m4M]Yl+'l(,kc`s^@o:D`9rtVuNFb>gJ@qEje:=$2Ln+0jaW7G6:a+?6F@?L%!Mc@HT |
|||
Nh$)P^QeWR<-B#&Z&gA1oc/n@4?Ce_c`s2Lf%Q#E=OCOApSICfPoID^(!j.hQNqrn?CkZ42>DpJ%Ya&g |
|||
F"D-p3Ht!5/(W$M:[oD4hOqM/a&apn>GplQ3EF;YR,N5Y*".UZk0%fs=G8b^nJj'*fK/Osc`ti)eaHji |
|||
Nr@M!SU!u\41frKjj).JhUrdHGBS`4cH]8Cfb)2o>tH&83I0d#jmqPn[IR@Y&d<$R4$337ME<meH"Ucg |
|||
hUrdl4$,fTB1EY[G/V&"@ntn67Cf+g<po<&d9FBI#-"6lF_=4ggG;3BB@kE$VqfrCc9",:9]"HJ:$'[G |
|||
E8K:@]9bUkIZN*OS`.5f1R**,6ucj@;XJl9Eq4*"b2pkeCZVZ<,q>kMfs*EWM3b/Hks;^D99KQ!I-^O' |
|||
naj>u,NeB]TtI`'P09Def,T!XL@WWm[",ZQ4$2%_gt<RFGBWqVjj).JhUrL[SK2_BlR[7';(ceD==\=O |
|||
-rHZ2]!Gm^PS5WK\^H+FKpF!H1g'ETmd.U\b+5*R>jq$\%JA#L@(aY"B?fJ^Y,(*c?2a`PC\`Ela84iA |
|||
Y2CV,XESh6]uj\+g]gOY^.O&_0btt*-D)HuXk4*qDT.9bHC6mP#e,qRYH]OS5B8F=_M^^f2V"6.DNcF] |
|||
B7sLZ,U/j-:EmZXGS1U+`KQIo]cu6te9*P0V)iCFgSctdRLsEf:U2>;Ue7DI,M$Zb_"37%T'4LqR'sg^ |
|||
6t*KS1W!u_f(8#[ek3ALqaQE]Rli.%NY:;/EoO,N=g$XJW)c</PsgIDKNkj=3S@;r)gYnoe.O'"%AnS] |
|||
)Ac0nSuf#`oo^[7M)KVlJMY9/Lg_g*,g$l6pCcFc4NVVr-e6pR,2A&'V=Bu6X(<bibm)'LYas]ZcA//_ |
|||
\..RIM@fn@erMgN,M\U\!jtWnO@U:kqCQoMD?D3%/MZ_;gg22AXkQm5E(eJd$sRL57^t<T,MX3_#e/CY |
|||
N,[P1k4hjeDI$0QiRUNhq&]*e=+o=!`E0"&'Aob6EoH>c>5^iF,RRKqgdZ(HZ]tg*71Vn`.jNi(#-32G |
|||
KNi*2'&hD%1a:^9hr<d^/'f-meo4*g[;h9?D@P,%[l,io_QBMjE,2CA\@$==&T2+&TEQ5iN,T`8GknD1 |
|||
#NPH*7C\=\ID6d8&V[lK1W""9e/pXc4e,XKUH`A<TLZMgIXgY&g2KNkom&J?h"pqF,2@K/7tb*UafD-S |
|||
iRUIs7_&,R(D1OHgnoQN_Q>OY7^rm;i<Um9145WN98)'@3O)0qY6_U7l]bC\KNjeP7(Dp@7"ec_BgfIR |
|||
4d65]TqqoE>p[@)kVj^@q@$1Egj2acKNmoeLi@..7_&-A7RXcZIP&!L]cu6t<;nd#gm2tD:2SMG0l04O |
|||
5W-E\o-m/XJ>He0>=19bXcM\%E9f;^]Yu&jW<ftqMO%GkLiD+prJGR[[75i(R*2LYESGMBAf6!2AOg<% |
|||
pfCq,:)go@oEUE6?Xh.gI2Y/6*Vkkl@:aEBrcMZ<\JsB7?u7UegBTN$_i4l7+DI.PEN]bg>O2OCFlUa' |
|||
]l81E0Ups$78%P8M##>ICQ,1M9a!;",_OZ^ORVBNm_LE59*fD#1K,s9drXP5ohtfAgpSCZ#XXam\r_4Z |
|||
g`BtT4IAhE?dcDP!^X=00+$iS4kSqfc$I=;nHMGKMf5UC2rj<j;S,s22Q$>tY-am-Gdp9t"1@"ZllaZ- |
|||
YGN%Np1).Mm&BqhjkLYtSDX.V0APiQarT:YeU9?ge`T'8372g.Uu&rJ*Sq<UYKdjd`gu^&8"Wk0.!P*i |
|||
>8"ZmS\+SI\;SU;%IW#ZkJ<_$p-UufVV\kM<9b[rge51J>aK[&+V@Ruh77<>U7A@@\`^,ma6Fr=gpJ5e |
|||
]^9k)*iXVO*]Z1QKi'J1eB4>/86#7dDLcf;7'1L3O5"U?")p2j]*'*LC(EU;/ab9Fg?[$iHP>Q&^4k[g |
|||
Y(j?)c_Gq1jj$#59BrWVmbB&MNRd?>h76%Xn,enDJa/eQZj&P@;O!Ys3*M[1SU5%SlM%,pm?V_/*S0\g |
|||
hqA=nDEN+L\2i.LK3NKc08Qn;`4as:CZ!!L@opQO\`]YS>g#[uj\<e>1T.s/!g@irV-HCh;6<L'e\#sQ |
|||
N=bMKo?KL&\tmf$k8mfY7+,JnDn0pb<Y<'gS\+5-GHkl\,NckUEu/cQ*\LS!GO?dM?8^nEcZVc3Cu2^X |
|||
6q$Ebk:R]Sc;sAge,"(I/oJIq]6H^6[b%'s8aWS@D"Cs#26tf[B\p:$<ae_=.b#qb!k7'm(]%!_2<!\& |
|||
[YB-*fqD5hh7:^`R?R?hEl7`V/%ItE4Na4AZAQ"Mb+3n?7(f0DG@9UdbFNuN'WBm!7r+2b/Od4LLS9,t |
|||
hRSCGX+"Co(TZJK>;ecs7G8.;`m^AqF"U\7Xh*k\-sJslbFQ93S)oCtZW;)K,pI7uj)OtM0Q(O6F,ui2 |
|||
4&GD$UXfgZG;"1.7:'B0#!(5^9002!m\(pt,RmfQQ94iX.`>E!EtA.;e=s=!6rjmY*8SZrSU4e1]<#:_ |
|||
k8lX%eQM@rUXiYWk+-j-Q,%\.*qk#_D=u1;\D\2^jILX+'gGYGWB3n!a-SZF[+*6hHUq-/>Aes!X$E_k |
|||
M1aLN/pHa&RLlf![^L;kOa$5)bQQ3QpTX,X?;n(/E<H)`PWSWV.^r0so$0C=,!oV%qqsZ8QTOr'-r@Tu |
|||
O4HG)O3'KXU'K0t/`#-'jdl:,<VVngPoI?7;srGY?@85DXQe+a;;Sk,%Z-n`_S+a8LOGrQ[!pLSDRd)e |
|||
c9(d;.S$sZH065/[sFh+\OWbp]q0H97H7%9.IZ&E<OR!Qn(^9'8%44uk?_9PO(bYFpT=BoYg^Abj3QUi |
|||
_n5n@"/u3Wl?`IRn@\[drn"XIc1hD4B6HB1+2@cL2t?nO/qHj^~> |
|||
endstream |
|||
endobj |
|||
7 0 obj |
|||
25243 |
|||
endobj |
|||
8 0 obj |
|||
<< |
|||
/FunctionType 2 |
|||
/Domain [0.0000 1.0000] |
|||
/Range [0.0000 1.0000 0.0000 1.0000 0.0000 1.0000] |
|||
/C0 [.80000 .60000 1.0000] |
|||
/C1 [.60000 .20000 .40000] |
|||
/N 1 |
|||
>> |
|||
endobj |
|||
9 0 obj |
|||
<< |
|||
/Type /Pattern |
|||
/PatternType 2 |
|||
/Matrix [1.0000 0.0000 0.0000 -1.0000 -433.00 519.00] |
|||
/Shading |
|||
<< |
|||
/ShadingType 2 |
|||
/ColorSpace /DeviceRGB |
|||
/Coords [284.50 396.10 758.50 513.10] |
|||
/Domain [0.0000 1.0000] |
|||
/Function |
|||
<< |
|||
/FunctionType 3 |
|||
/Domain [0.0000 1.0000] |
|||
/Range [0.0000 1.0000 0.0000 1.0000 0.0000 1.0000] |
|||
/Bounds [.33333 .66667] |
|||
/Encode [1.0000 0.0000 0.0000 1.0000 1.0000 0.0000] |
|||
/Functions [8 0 R 8 0 R 8 0 R] |
|||
>> |
|||
>> |
|||
>> |
|||
endobj |
|||
10 0 obj |
|||
<< |
|||
/FunctionType 2 |
|||
/Domain [0.0000 1.0000] |
|||
/Range [0.0000 1.0000 0.0000 1.0000 0.0000 1.0000] |
|||
/C0 [.80000 1.0000 1.0000] |
|||
/C1 [0.0000 1.0000 1.0000] |
|||
/N 1 |
|||
>> |
|||
endobj |
|||
11 0 obj |
|||
<< |
|||
/Type /Pattern |
|||
/PatternType 2 |
|||
/Matrix [1.0000 0.0000 0.0000 -1.0000 -433.00 519.00] |
|||
/Shading |
|||
<< |
|||
/ShadingType 2 |
|||
/ColorSpace /DeviceRGB |
|||
/Coords [354.27 78.778 828.27 549.78] |
|||
/Domain [0.0000 1.0000] |
|||
/Function |
|||
<< |
|||
/FunctionType 3 |
|||
/Domain [0.0000 1.0000] |
|||
/Range [0.0000 1.0000 0.0000 1.0000 0.0000 1.0000] |
|||
/Bounds [.33333 .66667] |
|||
/Encode [1.0000 0.0000 0.0000 1.0000 1.0000 0.0000] |
|||
/Functions [10 0 R 10 0 R 10 0 R] |
|||
>> |
|||
>> |
|||
>> |
|||
endobj |
|||
12 0 obj |
|||
<< |
|||
/FunctionType 2 |
|||
/Domain [0.0000 1.0000] |
|||
/Range [0.0000 1.0000 0.0000 1.0000 0.0000 1.0000] |
|||
/C0 [.75294 .75294 .75294] |
|||
/C1 [.60000 .60000 .60000] |
|||
/N 1 |
|||
>> |
|||
endobj |
|||
13 0 obj |
|||
<< |
|||
/Type /Pattern |
|||
/PatternType 2 |
|||
/Matrix [1.0000 0.0000 0.0000 -1.0000 -433.00 519.00] |
|||
/Shading |
|||
<< |
|||
/ShadingType 2 |
|||
/ColorSpace /DeviceRGB |
|||
/Coords [282.41 214.38 756.41 316.38] |
|||
/Domain [0.0000 1.0000] |
|||
/Function |
|||
<< |
|||
/FunctionType 3 |
|||
/Domain [0.0000 1.0000] |
|||
/Range [0.0000 1.0000 0.0000 1.0000 0.0000 1.0000] |
|||
/Bounds [.33333 .66667] |
|||
/Encode [1.0000 0.0000 0.0000 1.0000 1.0000 0.0000] |
|||
/Functions [12 0 R 12 0 R 12 0 R] |
|||
>> |
|||
>> |
|||
>> |
|||
endobj |
|||
14 0 obj |
|||
<< |
|||
/FunctionType 2 |
|||
/Domain [0.0000 1.0000] |
|||
/Range [0.0000 1.0000 0.0000 1.0000 0.0000 1.0000] |
|||
/C0 [.60000 .80000 1.0000] |
|||
/C1 [0.0000 .80000 1.0000] |
|||
/N 1 |
|||
>> |
|||
endobj |
|||
15 0 obj |
|||
<< |
|||
/Type /Pattern |
|||
/PatternType 2 |
|||
/Matrix [1.0000 0.0000 0.0000 -1.0000 -433.00 519.00] |
|||
/Shading |
|||
<< |
|||
/ShadingType 2 |
|||
/ColorSpace /DeviceRGB |
|||
/Coords [354.27 -112.22 828.27 358.78] |
|||
/Domain [0.0000 1.0000] |
|||
/Function |
|||
<< |
|||
/FunctionType 3 |
|||
/Domain [0.0000 1.0000] |
|||
/Range [0.0000 1.0000 0.0000 1.0000 0.0000 1.0000] |
|||
/Bounds [.33333 .66667] |
|||
/Encode [1.0000 0.0000 0.0000 1.0000 1.0000 0.0000] |
|||
/Functions [14 0 R 14 0 R 14 0 R] |
|||
>> |
|||
>> |
|||
>> |
|||
endobj |
|||
3 0 obj |
|||
<< |
|||
/Parent null |
|||
/Type /Pages |
|||
/MediaBox [0.0000 0.0000 210.00 403.00] |
|||
/Resources 16 0 R |
|||
/Kids [5 0 R] |
|||
/Count 1 |
|||
>> |
|||
endobj |
|||
17 0 obj |
|||
[/PDF /Text /ImageC] |
|||
endobj |
|||
18 0 obj |
|||
<< |
|||
/CyclePattern1 9 0 R |
|||
/CyclePattern2 11 0 R |
|||
/CyclePattern3 13 0 R |
|||
/CyclePattern4 15 0 R |
|||
>> |
|||
endobj |
|||
19 0 obj |
|||
<< |
|||
/S /Transparency |
|||
/CS /DeviceRGB |
|||
/I true |
|||
/K false |
|||
>> |
|||
endobj |
|||
20 0 obj |
|||
<< |
|||
/Alpha1 |
|||
<< |
|||
/ca 1.0000 |
|||
/CA 1.0000 |
|||
/BM /Normal |
|||
/AIS false |
|||
>> |
|||
>> |
|||
endobj |
|||
16 0 obj |
|||
<< |
|||
/ProcSet 17 0 R |
|||
/Pattern 18 0 R |
|||
/ExtGState 20 0 R |
|||
>> |
|||
endobj |
|||
xref |
|||
0 21 |
|||
0000000000 65535 f |
|||
0000000015 00000 n |
|||
0000000315 00000 n |
|||
0000029314 00000 n |
|||
0000000445 00000 n |
|||
0000000521 00000 n |
|||
0000000609 00000 n |
|||
0000025962 00000 n |
|||
0000025986 00000 n |
|||
0000026200 00000 n |
|||
0000026814 00000 n |
|||
0000027029 00000 n |
|||
0000027647 00000 n |
|||
0000027862 00000 n |
|||
0000028480 00000 n |
|||
0000028695 00000 n |
|||
0000029910 00000 n |
|||
0000029485 00000 n |
|||
0000029525 00000 n |
|||
0000029665 00000 n |
|||
0000029767 00000 n |
|||
trailer |
|||
<< |
|||
/Size 21 |
|||
/Root 2 0 R |
|||
/Info 1 0 R |
|||
>> |
|||
startxref |
|||
30007 |
|||
%%EOF |
@ -0,0 +1,95 @@ |
|||
@online(ESP8266, |
|||
author="ESPRESSIF", |
|||
title="{ESP8266EX} Overview", |
|||
year=2017, |
|||
url="http://web.archive.org/web/20170130001257/http://www.espressif.com/en/products/hardware/esp8266ex/overview", |
|||
urldate="2017-01-30" |
|||
) |
|||
|
|||
@online(maglab, |
|||
author="Magrathea Laboratories e.V.", |
|||
title="Magrathea Laboratories - Creating new Worlds", |
|||
year=2016, |
|||
url="http://web.archive.org/web/20161116123421/https://maglab.space/", |
|||
urldate="2016-11-16" |
|||
) |
|||
|
|||
@online(HASS, |
|||
author="Home Assistane Team", |
|||
title="Awaken your home", |
|||
year=2017, |
|||
url="http://web.archive.org/web/20170102023619/http://home-assistant.io/", |
|||
urldate="2017-01-02" |
|||
) |
|||
|
|||
@online(ESPer, |
|||
author="ESPer Team", |
|||
title="ESPer - Space Automation Firmware for ESP8266", |
|||
year=2017, |
|||
url="https://git.maglab.space/esper/esper", |
|||
urldate="2017-02-02" |
|||
) |
|||
|
|||
@online(ESP-01s, |
|||
author="SparkFun Team", |
|||
title="WiFi Module - ESP8266", |
|||
year=2017, |
|||
url="http://web.archive.org/web/20170104002307/https://www.sparkfun.com/products/13678", |
|||
urldate="2017-10-28" |
|||
) |
|||
|
|||
@online(Sming, |
|||
author="Sming Team", |
|||
title="Sming - Open Source framework for high efficiency native ESP8266 development", |
|||
year=2016, |
|||
url="http://web.archive.org/web/20170206144443/http://sminghub.github.io/Sming/about/", |
|||
urldate="2016-11-25" |
|||
) |
|||
|
|||
@online(make, |
|||
author="The IEEE and The Open Group", |
|||
title="The Open Group Base Specifications Issue 6 - make - maintain, update, and regenerate groups of programs", |
|||
year=2004, |
|||
url="http://pubs.opengroup.org/onlinepubs/009695399/utilities/make.html", |
|||
urldate="2016-11-27" |
|||
) |
|||
|
|||
@online(MQTT, |
|||
author="OASIS Standard Incorporating", |
|||
title="MQTT Version 3.1.1 Plus Errata 01", |
|||
year=2015, |
|||
url="http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/errata01/os/mqtt-v3.1.1-errata01-os-complete.html", |
|||
urldate="2017-01-15" |
|||
) |
|||
|
|||
@online(HTTP_1.1, |
|||
author="The Internet Society", |
|||
title="Hypertext Transfer Protocol -- HTTP/1.1", |
|||
year=1999, |
|||
url="https://www.w3.org/Protocols/rfc2616/rfc2616.html", |
|||
urldate="2017-01-15" |
|||
) |
|||
|
|||
@online(ESP8266_Memory_Map, |
|||
author="ESP8266 community wiki", |
|||
title="ESP8266 Memory Map", |
|||
year=2016, |
|||
url="http://web.archive.org/web/20161118224802/http://www.esp8266.com/wiki/doku.php?id=esp8266_memory_map", |
|||
urldate="2017-01-30" |
|||
) |
|||
|
|||
@online(rBoot, |
|||
author="Richard Antony Burton", |
|||
title="An open source bootloader for the ESP8266", |
|||
year=2016, |
|||
url="http://web.archive.org/web/20160611044740/https://github.com/raburton/rboot", |
|||
urldate="2017-01-30" |
|||
) |
|||
|
|||
@online(drone, |
|||
author="Drone Team", |
|||
title="Drone is a Continuous Delivery platform built on Docker, written in Go", |
|||
year=2016, |
|||
url="http://web.archive.org/web/20160705005808/https://github.com/drone/drone", |
|||
urldate="2017-02-05" |
|||
) |
@ -0,0 +1,45 @@ |
|||
\documentclass[11pt,paper=a4,oneside,headerinclude,ngerman]{scrartcl} |
|||
|
|||
\usepackage[utf8]{inputenc} |
|||
\usepackage{hyperref} |
|||
\usepackage{graphicx} |
|||
\usepackage{float} |
|||
\usepackage{wrapfig} |
|||
|
|||
\usepackage{csquotes} |
|||
\usepackage[style=verbose-ibid,backend=bibtex]{biblatex} |
|||
\bibliography{index} |
|||
|
|||
\usepackage{listings} |
|||
\usepackage{color} |
|||
\lstset{ |
|||
language=c++, |
|||
columns=flexible, |
|||
basicstyle={\small\ttfamily}, |
|||
frame=tb, |
|||
keepspaces=true, |
|||
breaklines=true, |
|||
breakatwhitespace=true, |
|||
} |
|||
|
|||
\begin{document} |
|||
|
|||
\title{Implement Updates \textit{Over the Air} for ESP8266 microcontrollers} |
|||
\author{Dustin Frisch\\ C/C++ for Embedded Systems and Physical Computing\\ Angewandte Informatik\\ University of Applied Sciences Fulda\\ \texttt{dustin.frisch@informatik.hs-fulda.de}} |
|||
\date{\today} |
|||
\maketitle |
|||
\newpage |
|||
|
|||
\begin{abstract} |
|||
This describes the implementation of durable and stable system for building firmware updates for embedded systems based on ESP8266\autocite{ESP8266} microcontrollers. This includes the mechanisms used to build the updates, distribute and install them on the device. |
|||
\end{abstract} |
|||
|
|||
\input{1-introduction} |
|||
\input{2-environment} |
|||
\input{3-requirements} |
|||
\input{4-implementation} |
|||
\input{5-conclusion} |
|||
|
|||
\printbibliography |
|||
|
|||
\end{document} |
@ -0,0 +1,55 @@ |
|||
\documentclass[11pt,ngerman]{beamer} |
|||
|
|||
\usetheme{AnnArbor} |
|||
\usecolortheme{seagull} |
|||
|
|||
\begin{document} |
|||
|
|||
\begin{frame} |
|||
\title{Implement Updates \textit{Over the Air} for ESP8266 microcontrollers} |
|||
\author{Dustin Frisch\\ C/C++ for Embedded Systems and Physical Computing\\ Angewandte Informatik\\ University of Applied Sciences Fulda\\ \texttt{dustin.frisch@informatik.hs-fulda.de}} |
|||
\date{\today} |
|||
\titlepage |
|||
\end{frame} |
|||
|
|||
|
|||
\begin{frame} |
|||
\frametitle{About the Project} |
|||
\end{frame} |
|||
|
|||
\begin{frame} |
|||
\frametitle{Why Updates?} |
|||
\end{frame} |
|||
|
|||
\begin{frame} |
|||
\frametitle{Why \textit{Over the Air}?} |
|||
\end{frame} |
|||
|
|||
\begin{frame} |
|||
\frametitle{Implementation - Update mechanism} |
|||
\end{frame} |
|||
|
|||
\begin{frame} |
|||
\frametitle{Implementation - Supporting multiple devices} |
|||
\end{frame} |
|||
|
|||
\begin{frame} |
|||
\frametitle{Implementation - Automatic deployment and roll-out} |
|||
\end{frame} |
|||
|
|||
\begin{frame} |
|||
\end{frame} |
|||
|
|||
\begin{frame} |
|||
\end{frame} |
|||
|
|||
\begin{frame} |
|||
\end{frame} |
|||
|
|||
\begin{frame} |
|||
\end{frame} |
|||
|
|||
\begin{frame} |
|||
\end{frame} |
|||
|
|||
\end{document}} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue