OpenCores
URL https://opencores.org/ocsvn/avs_aes/avs_aes/trunk

Subversion Repositories avs_aes

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /avs_aes/trunk
    from Rev 1 to Rev 2
    Reverse comparison

Rev 1 → Rev 2

/doc/avs_aes.tex
0,0 → 1,396
\documentclass{ruschidoc}
 
\usepackage[
bookmarks,
plainpages={false}]{hyperref}
 
\usepackage[
style=altlist,
hyper=true,
number=none,
acronym=true,
header=none]{glossary}
\usepackage{capt-of}
 
%%% Water mark
\usepackage{draftwatermark}
\SetWatermarkText{\shortstack{DRAFT}}
\SetWatermarkScale{0.9}
\SetWatermarkLightness{0.85}
 
\makeacronym
\makeglossary
\input{acronym}
\input{glossary}
\bibliographystyle{IEEEtran}
 
%%%%%%%%%%%%%%%%%
% Document variables
%%%%%%%%%%%%%%%%%
\docDate{ \today }
\docID{avs\_aes\_doc}
\docRevision{0.4}
\docStatus{Draft}
\docTitle{\mbox{AES 128/192/256 (ECB)} \mbox{Avalon\rtm-MM Slave}}
\keywords{Avalon, bus, slave, cryptography, AES, ecb, IP core }
 
\authorName{\mbox{Thomas Ruschival} \\ and opencores.org}
\authorURL{www.opencores.org}
\authorAddress{\mbox{}}
\authorEmail{ruschi@opencores.org}
 
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% FORMAT: Rev | Chapter | Description | Date | Reviewer \\
\revisionList{
0.1 & all & initial document & 2009/02/01 & T. Ruschival \\
0.2 & all & added interrupt & 2009/03/25 & T. Ruschival \\
0.3 & all & added generics & 2009/04/20 & T. Ruschival \\
0.4 & all & cleanup for opencores.org & 2009/05/20 & T. Ruschival \\
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 
\begin{document}
\maketitle
 
\newpage
\tableofcontents
\newpage
 
\section{Introduction}
\label{sec:intro} The \AES is a symmetric block cypher operating on fixed block sizes
of 128 Bit and is specified for key sizes of 128, 192 and 256 Bit designed by Joan
Daemen and Vincent Rijmen. The algorithm was standardized by \NIST. For more
information on the algorithm see \cite{NIST:Fips197}.\\
This component implements an AES encryption decryption datapath in \ECB mode with
either 128,192 or 256 Bit keys. The keylength is determined by generics at compile
time. Also the decryption datapath can be disabled by generics if it is not needed
for the application.\\
The component provides an Avalon\rtm\ Memory Mapped (Avalon-MM) slave interface to
connect to an Altera\rtm\ Avalon\rtm\ switch fabric. The Avalon\rtm\ interface is
implemented in a way that it can also be used to connect to a Whishbone master if the
signals are correctly mapped, see \cite{Wiki:AvWb}. For further information about the
Whishbone bus refer to \cite{OC:WBspec}. \\
 
\section{Interface}
\label{sec:interface}
The AES core is accessed by the interface described in this section. An Avalon\rtm\
interface was chosen for its simplicity and compatibility with wishbone. Furthermore
Avalon\rtm\ defines interrupt request signals for slaves which would be separate
signals in a Wishbone implementation.The component can be used both in polling
mode or can provide an interrupt for signalling. \\
Unfortunately Avalon\rtm\ is an Altera\rtm\ proprietary technology. The actual AES
core however is a selfcontained entity and can be embedded into other \SoC\ bus
interfaces as well or used indepentently.
 
\subsection{Configuration Generics}
\label{sec:generics}
The AES core can be configured by generics shown in table \ref{tab:generics},
consequently they are provided by the Avalon\rtm\ interface.
 
\begin{tabularx}{\textwidth}{|p{33mm}|p{25mm}|X|}
\hline
\bf{Generic name} & \bf{type} & \bf{Description}\\ \hline
\texttt{KEYLENGTH} \label{gen:keylength} & NATURAL & Size of initial userkey. Must be 128, 192 or 256 \footnotemark[1] . \\ \hline
\texttt{DECRYPTION} \label{gen:decryption} & BOOLEAN & Enables the instantiation of the decrypt datapath if true. \\
\hline
\end{tabularx}
\footnotetext[1]{All other values raise a compilation failure}
\captionof{table}{Component generics}
\label{tab:generics}
 
\subsection{Signals}
\label{sec:signals}
The Avalon\rtm\-MM Slave interface is described in \cite{Altera:Avalon}, the component
implements the signals shown in table \ref{tab:signals}. All signals are synchronous,
sampled at the rising edge of the clock. The type for all signals is \texttt{IEEE1164
std\_logic} or \texttt{std\_logic\_vector}. For signals wider that 1 Bit the range
is \MSB\ \texttt{downto} \LSB\. \\
This components has only output signals driven by registers no input signals are directly combinatorially connected to the
output signals, thus combinational loops are avoided. All signals are active
high. This component does not support burst transfers.
 
\begin{tabularx}{\textwidth}{|p{30mm}|p{11mm}|p{11mm}|X|}
\hline
\bf{Signal name} & \bf{Width} & \bf{In/Out} & \bf{Description}\\ \hline
\texttt{clk} \label{sig:clk} & 1 & in & Avalon\rtm\ bus clock, also used to drive the core. \\ \hline
\texttt{reset} \label{sig:reset}& 1 & in & \emph{Synchronous} reset signal for Avalon\rtm\ bus interface.
The core itself is designed without need for reset signals.
\\ \hline
\texttt{writedata} \label{sig:writedata} & 32 & in & Input data to write to location designated by \texttt{address}. Bit 31 is most significant Bit.
\\ \hline
\texttt{address} \label{sig:address} & 5 & in & Word offset to the components base address. The memory map of the component for the
respective offest is described in \ref{sec:memmap}. Only full 32-Bit words can be addressed no byte addressing is implemented.
\\ \hline
\texttt{write}\footnotemark[1] \label{sig:write} & 1 & in & If asserted enable write of data at \texttt{writedata} to location designated by \texttt{address}.
\\ \hline
\texttt{read}\footnotemark[1] \label{sig:read} & 1 & in & If asserted output data at location designated by \texttt{address} to \texttt{readdata}.
\\ \hline
\texttt{readdata} \label{sig:readdata} & 32 & out & Data output port for reading data at the location defined by \texttt{address}. Bit 31 is most significant Bit.
\\ \hline
\texttt{waitrequest} \label{sig:waitrequest} & 1 & out & Asserted if writedata was not accepted, this is the case if the keyexpansion is
not yet complete and a new is written to the \texttt{KEY} address range without previous deassertion of the \texttt{KEY\_VALID} Bit
\\ \hline
\texttt{irq}\label{sig:irq} & 1 & out & If Interrupt behaviour is enabled \texttt{IRQ}
will be asserted when the operation has terminated. For use of interrupt see \ref{sec:irq}
\\ \hline
\end{tabularx}
\footnotetext[1]{\texttt{read} and \texttt{write} are mutually exclusive and must not be asserted simultanously.}
\label{tab:signals}
\captionof{table}{Avalon\rtm\ Bus interface signals}
 
 
\section{Memory Map}
\label{sec:memmap}
The AES core Avalon\rtm\ slave has an address space of 31 words accessable through the
offset described by the signal \texttt{address}, see \ref{sig:address}. This address
space is devided into three main sections for the 4-word input data, the 4-word
result of the operation and the user key. The actual lenght of the userkey can vary
between 4, 6 and 8 words depending on the keysize. For control signals and status
information of the component and a control word is provided. The memory mapping is
descibed in table \ref{tab:memmap}.
 
\begin{tabularx}{\textwidth}{|p{13mm}|p{18mm}|X|}
\hline
\bf{Offset} & \bf{Name} & \bf{Function}\\ \hline
\texttt{0-7} & \texttt{KEY} & Initial user key that will be used for encryption and decryption.
The most significant word of the user key shall be written to offset \texttt{3}. This memory section is \emph{write-only} to the Avalon\rtm\ Interface.\\ \hline
\texttt{8-11} & \texttt{DATA} &Input data, can be either interpreted as cyphertext for decryption or plain text for encryption.
The most significant word shall be written to offset \texttt{7}. This memory section is \emph{write-only} to the Avalon\rtm\ Interface. \\ \hline
\texttt{12-15} & \texttt{RESULT} &Result of the operation. The most significant word of the result at offset \texttt{11}.
This memory section is \emph{read-only} to the Avalon\rtm\ Interface. \\ \hline
\texttt{16-30} & --- & reserved \\ \hline
\texttt{31} & \texttt{CTRL} & Control and status word of the component can be read and written. Detailed description see \ref{sec:ctrl}\\ \hline
\end{tabularx}
\label{tab:memmap}
\captionof{table}{Memory map of the AES core Avalon\rtm\ slave}
 
\subsection{Control Register}
\label{sec:ctrl}
The AES Core offers the register \texttt{CTRL} to control the function of the core
and poll its status. The control register can be accessed in read and write mode.
When wrriting to the register reserved Bits shall be assigned a value of \texttt{0}.
Individual Bits have following functionality decribed in table \ref{tab:ctrlreg}. \\
In case of a Avalon\rtm\ Bus reset this register is set to \texttt{0x00000000} thus
invalidating all previously written keys and resetting the AES core.
 
\begin{tabularx}{\textwidth}{|p{13mm}|p{18mm} |X|}
\hline
\bf{Offset} & \bf{Name} & \bf{Description}\\ \hline
\texttt{31-8} & --- & reserved \\ \hline
\texttt{7} &\texttt{KEY\_VALID} &If asserted key data in the \texttt{KEY} memory range is regarded valid and will be expanded to roundkeys.
When deasserted all keys are invalidated and the current operation of the core is aborted. It must be asserted as long as the key shall be
used for either encryption or decryption. \\ \hline
\texttt{6} & \texttt{IRQ\_ENA} & Enable use of the interrupt request signal. If asserted the component will set \texttt{IRQ} after
completing an operation. If not set the component operates in polling mode only.\\ \hline
\texttt{5-2} & --- &reserved \\ \hline
\texttt{1} & \texttt{DEC} \footnotemark[1] & If asserted memory content of the \texttt{DATA} range is regarded to be valid and will be
\emph{decrypted}. This Bit shall only be deasserted externally if a running AES operation is aborted by deasserting \texttt{KEY\_VALID}. 1
It will be set \texttt{0} by the core to signal completion of the operation.\\ \hline
\texttt{0} & \texttt{ENC} \footnotemark[1] & If asserted memory content of the \texttt{DATA} range is regarded to be valid and will be
\emph{encrypted}. This Bit shall only be deasserted externally if a running AES operation is aborted by deasserting \texttt{KEY\_VALID}.
It will be set \texttt{0} by the core to signal completion of the operation. \\ \hline
\end{tabularx}
\footnotetext[1]{\texttt{ENC} and \texttt{DEC} are mutually exclusive and must not be asserted simultanously.}
\label{tab:ctrlreg}
\captionof{table}{Bits in the control register}
 
 
\section{Protocol Sequence}
\label{sec:usage}
The AES component appears as memory mapped peripheral. All writes are fundamental slave write transfers, see \cite{Altera:Avalon} and take one
clock cycle of the Avalon\rtm\ bus clock \texttt{clk}. It is not necessary to write all words of a input parameter successively or in one transfer.
Bursts are not supported.\\
\\
Before any AES operation can be started the initial userkey has to be written to
\texttt{KEY} segment of the memory map.After the user key is transferred
to the component the \texttt{KEY\_VALID} Bit must be set to start the key
expansion. This Bit can be set simultanously with \texttt{DEC} or \texttt{ENC} Bit of
the control register. To invalidate the previous key and use another key the
\texttt{KEY\_VALID} must be deasserted for at least one Avalon\rtm\ bus clock cycle
During this cycle the new key can already be transferred.\\
\\
Once a key is passed and marked valid data blocks can be transferred to the
\texttt{DATA} segment of the memory map.
The AES operation is started by asserting the \texttt{ENC} Bit for
encryption or \texttt{DEC} Bit for decryption.
While asserting \texttt{ENC} or \texttt{DEC} the \texttt{KEY\_VALID} Bit must be
kept asserted.\\
The \texttt{ENC} or \texttt{DEC} Bit respectively is deasserted by the component
after completing the requested operation.
The result of the operation can be read from the \texttt{RESULT} area of the memory
and is not cleared. It will be overwritten by succeeding operations.
 
The underlying AES core uses the \FSM\ shown in \ref{fig:aesFSM} for processing of
the data. The signals \texttt{data\_stable} and \texttt{key\_stable} are accessible
over the control status word \texttt{CTRL} \ref{sec:ctrl}. \texttt{key\_ready} is a
signal driven by the keygenerator when all keys are expanded. The signal
\texttt{round\_index} is the counter for the rounds and the address to select a
roundkey. \\
\texttt{NO\_ROUNDS} is the total number of rounds the processing takes, a constant
defined by the generic \texttt{KEYLENGTH} \ref{sec:generics}. The AES standard
in\cite{NIST:Fips197} defines 10 rounds for 128 Bit key, 12 rounds for a 192 Bit key
and 14 rounds for a 265 Bit key.\\
Thus depending on the keylength the processing of a datablock needs at maximum 15
clockcycles from \texttt{data\_stable=1} to completion, if the key is already expanded.
 
\begin{figure}[!ht]
\centering
\includegraphics[\width=100mm]{encrypt_FSM}
\caption{Finite State Machine of encryption and decryption process}
\label{fig:aesFSM}
\end{figure}
 
 
\subsection{Interrupt Behaviour}
\label{sec:irq}
By setting \texttt{IRQ\_ENA} in the control register \ref{sec:ctrl} the
component is configured to issue interrupt requests.
If \texttt{IRQ\_ENA} is asserted the interrupt request \texttt{IRQ} \ref{sig:irq} will be set when the
computation has completed in addition to clearing the \texttt{ENC} or \texttt{DEC}
Bit.
The \texttt{IRQ} \ref{sig:irq} signal will remain set until clearing \texttt{IRQ\_ENA}
or a read operation on the \texttt{RESULT} area of the components address range.
 
 
\section{Ressource Usage and Throughput}
\label{sec:ressources}
 
The Avalon\rtm\ interface communicates a 32-Bit DWORD per clock cycle. Therefore a key is transmitted in 4 to 8 cyles
plus one cyle to activate keyexpansion with the control word \ref{sec:ctrl}. A payload datablock or the result consist
always of 4 DWORDs, thus it takes 4 cyles to send data to the core, one cycle to activate the computation with the
control register \ref{sec:ctrl} and 4 cycles to retrieve the data.
 
The keyexpansion component computes one column of a roundkey each clock cylce. AES takes, depending on the keylength,
10, 12 or 14 roundkeys with each 4 columns, see \cite{NIST:Fips197}. The keyexpansion therefore takes 40, 48 or 56
cycles until the encryption or decryption can start. The roundkeys are stored until invalidated, see \ref{sec:usage}
thus this step is is only needed once after power-up until the key changes.
 
The AES-core computes one iteration (round) of the Rijndael-Algorithm each clock cycle, thus a 128 Bit datablock is
encrypted or decrypted in 10, 12 or 14 cylces plus an initial round.
 
The maximum throughput $T_{max}[Bits]$ depends on the maximum operation frequency $f_{max}$ and the keylength which
influences the number of rounds $N_{rnd} \epsilon \lbrace 10,12,14 \rbrace $.
\begin{equation}
T_{max}=\frac{ (1+N_{rnd}) \cdot 128 Bit}{f_{max}}
\label{eqn:tmax}
\end{equation}
 
Note: Equation \ref{eqn:tmax} assumes that the roundkeys are already generated and does not include the constant of 4+1+4
Avalon\rtm\ bus cylces for transmission of data, activation and result retrieval.
 
 
\subsection{Exemplary FPGA implementations}
 
The component has only be implemented and tested on an Altera\rtm\ CycloneII EP2C35
FPGA. All other values in the table are only results of synthesis\footnotemark[0] and are not
verified on actual hardware.
 
\footnotetext[0]{Synthesized with Altera\rtm\ QuartusII\rtm\ Web edition Version 9.1 or Xilinx\rtm\ ISE 9.1 Webpack}
 
The design is kept mostly vendor independent in generic VHDL. For Altera\rtm\ chips the
AES SubByte component is specially designed using M4K Blockrams as dual-port ROM. For
non-Altera\rtm\ FPGAs a second VHDL architecture exists also trying to make use of
ROM functions of the target chips however the success varies on RTL compiler
capabilities.
 
\begin{tabularx}{\textwidth}{|p{30mm}|X|p{20mm}|p{30mm}|p{18mm}|}
\hline
\bf{Configuration} & \bf{Target FPGA}\footnotemark[1] & \bf{LE / Slices} & \bf{HW RAM} & $\mathbf{f_{max}[Mhz]}$ \\ \hline
\multirow{4}{30mm}{256 Bit Key, encrypt + decrypt} & \mbox{Xilinx\rtm\ Spartan3A} XC3S1400A-5FG484 & - / 1609 & 18 RAMB16BWE & 91 \\ \cline{2-5}
& \mbox{Xilinx\rtm\ Virtex5} XC5VLX30-3FF324 & - / 297 & \mbox{18 18k-Blocks} \mbox{4 36k-Blocks} & 224 \\ \cline{2-5}
& \mbox{Altera\rtm\ CylconeII} EP2C35F484C8 & 1937 / - & \mbox{39912 Bits} in \mbox{22 M4K-Blocks} & 65 \\ \cline{2-5}
& \mbox{Altera\rtm\ StratixII} EP2S30F484C5 & 585 / - & \mbox{39912 Bits} in \mbox{22 M4K-Blocks} & 103 \\
\hline
%%%%%%
\multirow{2}{30mm}{128 Bit Key, encrypt + decrypt} & \mbox{Xilinx\rtm\ Spartan3A} XC3S1400A-5FG484 & - / 1523 & 18 RAMB16BWE & 91 \\ \cline{2-5}
& \mbox{Altera\rtm\ CylconeII} EP2C35F484C8 & 1776 / - & \mbox{39912 Bits} in \mbox{22 M4K-Blocks} & 65 \\
\hline
%%%%%%
\multirow{4}{30mm}{256 Bit Key, encrypt} & \mbox{Xilinx\rtm\ Spartan3A} XC3S1400A-5FG484 & - / 680 & 14 RAMB16BWE & 159 \\ \cline{2-5}
& \mbox{Xilinx\rtm\ Virtex5} XC5VLX30-3FF324 & - / 297 & \mbox{10 18k-Blocks} \mbox{4 36k-Blocks} & 268 \\ \cline{2-5}
& \mbox{Altera\rtm\ CylconeII} EP2C35F484C8 & 969 / - & \mbox{22528 Bits} in \mbox{14 M4K} & 97 \\ \cline{2-5}
& \mbox{Altera\rtm\ StratixII} EP2S30F484C5 & 524 / - & \mbox{22528 Bits} in \mbox{ 14 M4K} & 145 \\
\hline
%%%%%%
\multirow{2}{30mm}{128 Bit Key, encrypt} & \mbox{Xilinx\rtm\ Spartan3A} XC3S1400A-5FG484 & - / 594 & 14 RAMB16BWE & 159 \\ \cline{2-5}
& \mbox{Altera\rtm\ CylconeII} EP2C35F484C8 & 797 / - & \mbox{22528 Bits} in \mbox{ 14 M4K} & 95 \\ \cline{2-5}
\hline
 
\end{tabularx}
\footnotetext[1]{This table is not meant to be a benchmark between FPGAs of different vendors, it is only a rough
estimation for the user of the core.
The FPGA families cannot be compared easily, see also \cite{Xilinx:wp284} and \cite{Altera:01007}for further details. }
\label{tab:ressources}
\captionof{table}{ressource usage on different targets and configuration}
 
All of the above configurations in table \ref{tab:ressources} use hardware key
expansion. Downloading of software generated roundkeys is not yet supported. The
decryption and encryption datapaths share a common keyexpansion block, mulitplexing
the address signals is one of the main reasons for regression of the maximum
frequency $f_{max}$ of the configuration compared to encryption only versions.
 
\section{Compilation and Simulation}
\label{sec:compilation}
The main simulation library is ``\texttt{aes\_ecb\_lib}''. All files are expected to be
compiled into this library as all files depend at least on the package
\texttt{aes\_lib.aes\_ecb\_pkg}. \\
A Makefile for Mentorgraphics\rtm\ Modelsim\rtm\ is given in \texttt{./sim/}. The
make target \texttt{simaes} will create the library, compile all files and run a
testbench.\\
 
\newpage
\section{License and Liability}
\label{sec:license}
The ``AES 128/192/256 (ECB) Avalon\rtm-MM Slave'' component, all its subcomponents
and documentation (like this document you are reading) are published under following
license:\\
 
Copyright (c) 2009, Thomas Ruschival - All rights reserved.
 
Redistribution and use in source and binary forms, with or without modification, are
permitted provided that the following conditions are met:
\begin{itemize}
\item Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
\item Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.
\item Neither the name of the organization nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.
\end{itemize}
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. \\
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
THE POSSIBILITY OF SUCH DAMAGE\\
 
Note: The term ``SOFTWARE'' in the above licence applies in this case not only to
software as executable code but also to documentation, hardware description or
compiled netlists for actual target hardware. As Chips generally don't just
reproduce ``the above copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided with the
distribution'' the datasheet of the product must also contain it.\\
 
Altera, CycloneII, StratixII and Avalon are registered trademarks of the Altera Corporation
101 Innovation Drive, San Jose CA USA \\
Xilinx, Spartan3A and Virtex5 are registered trademarks of Xilinx Inc. 2100 Logic Drive, San Jose CA USA
 
\newpage
 
\printacronym
\printglossary
 
\bibliography{cited}
\revisionTable
 
\end{document}
doc/avs_aes.tex Property changes : Added: svn:executable Index: doc/sfmath.sty =================================================================== --- doc/sfmath.sty (nonexistent) +++ doc/sfmath.sty (revision 2) @@ -0,0 +1,432 @@ +% sfmath.sty by Olaf Dietrich (olaf@dtrx.de) + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{sfmath}[2005/04/05 v0.7 sans serif maths] + + +% This is a simple package for sans serif maths in documents. +% +% Usage: \usepackage{sfmath} or \usepackage[OPTIONS]{sfmath} +% +% OPTIONS are +% +% * slantedGreek: for slanted uppercase Greek letters +% +% * cm: use Computer Modern (cmss) for maths (explicitly) +% * lm: use Latin Modern (lmss) for maths (explicitly) (+) +% * helvet: use Postscript Helvetica (phv) for maths (explicitly) +% * cmbright: use CM-Bright fonts (cmbr) for maths (explicitely) +% * tx: use Postscript txfonts (tx) for maths (explicitly) +% * px: use Postscript pxfonts (tx) for maths (explicitly) +% +% * T1experimental: use T1 font encoding for standard maths (+) +% * AlphT1experimental: use T1 font encoding for \math*{...} commands (+) +% +% * mathrmOrig: do not change the behavior of the \mathrm command +% * mathbfOrig: do not change the behavior of the \mathbf command +% * mathitOrig: do not change the behavior of the \mathit command +% * mathsfOrig: do not change the behavior of the \mathsf command +% +% +% This package should work with pdflatex and produce documents +% with Postscript Type 1 Fonts. If \sfdefault is changed by a +% package like pslatex.sty, times.sty (obsolete), or helvet.sty or manually, +% then include sfmath.sty _after_ having changed \sfdefault. +% Alternatively, select the desired sans serif font with the +% package options helvet or cm. +% +% Functionality is limited by the intention to work without additionally +% defined (virtual) fonts; instead, only standard fonts are used. +% +% (+): Options marked with (+) are experimental. Known limitations: +% T1experimental produces a warning about the encoding of the +% operators font. +% AlphT1experimental DOES NOT WORK with uppercase Greek letters +% within the \math*{...} command! +% These options should only be used with the ec fonts. +% +% lm includes T1experimental and AlphT1experimental with the limitations +% mentioned above +% +% RECOMMENDATION: use the fix-cm package instead of the experimental +% T1 options: with fix-cm.sty, the chosen ec fonts +% harmonize much better with the cm sans serif math fonts. +% Add \RequirePackage{fix-cm} _before_ \documentclass{...}. + + + +% CHANGES: +% +% v0.7: +% +% * Add (experimental) support for latin modern (lmodern) fonts. +% +% +% v0.6: +% +% * Add some artificial intelligence to use slanted bold letters +% if available (e.g., for phv, txfonts, or pxfonts). +% Add options to select txfonts, pxfonts, and cmbright (probably +% not very useful) explicitely. +% (Thanks to Alberto Lusiani who asked for slanted bold letters.) +% +% +% v0.5: +% +% * Add experimental options for T1 font encoding of maths fonts. +% Using these options can be useful with ec fonts which look +% slightly different from the standard cm maths fonts (especially +% at large font size). About limitations see above. +% +% +% v0.4: +% +% * Add \upDelta, \upOmega command (to be a little more compatible +% with other packages that provide the slantedGreek option) +% +% +% v0.3: +% +% * Add sans serif shapes for "," and ".", "\ldotp" +% +% * Modified documentation +% +% +% v0.2: +% +% * New option slantedGreek for slanted greek capitals +% +% * Options helvet and cm to select explicitly the sans serif font +% for maths. Without any of these options, the current \sfdefault +% is chosen. +% +% * Options mathxxOrig: don't change the alphabet command \mathxx; +% available for \mathrm, \mathbf, \mathit, and \mathsf +% +% * Provide dotlessi and dotlessj (if available) +% + + +% BUGS/LIMITATIONS/PROBLEMS: +% +% * The font metrics are not adjusted to maths usage (this may result in +% typographically unsatisfying results). +% +% * In many constellations with Postscript fonts (helvet.sty, +% pslatex.sty, ...) the upper-case greek letters are not chosen +% correctly within \mathrm, \mathbf, \mathit, ... (because +% they should be part of OT1-encoded fonts but are not included +% in these standard postscript fonts). +% +% * Bold math symbols are not always available (e.g. with pslatex.sty) +% or at least not slanted (e.g. with cmss fonts), so better don't +% use bold maths with this package. (This has been partially improved +% in version 0.6.) +% +% * There is a visual difference between the ec sans serif text fonts +% and the cm sans serif maths fonts, especially at larger font sizes. +% The fix-cm package might help to reduce the ugliness of the ec +% sans serif fonts and the differences between the ec text fonts +% and the cm math fonts. +% Alternatively, the experimental options T1experimental and +% AlphT1Experimental might help by using the ec fonts for maths as well. +% +% * The txfonts and pxfonts are reported to have several deficiencies +% with respect to font metrics and macro implementation; using +% these fonts is not recommended by the package author. +% +% * The set symbols \mathbb{N} or \mathbbm{N} (from bbm.sty) are not +% changed. You might like to use \mathbbmss{N} (from bbm.sty). +% +% * Some symbols have serifish shapes (\sum, \prod, probably more) and +% are not changed. +% +% * Lower-case greek letters are not available in sans serif shape +% (they don't have real serifs, but cannot be expected to harmonize +% with the sans serif latin letters). +% +% * Is this the Right Way to do it? Or would it be preferable to define +% one or two new math _versions_ (sans, sansbold), such that formulas +% are switched to sans by \mathversion{sans}? +% +% * New virtual fonts for maths would be a more complicated but +% better solution. +% + + + +% HERE WE GO: + +% Declare options and defaults and process options + +\DeclareOption{slantedGreek}{% + \renewcommand{\greek@shape}{sl}% + \renewcommand{\greek@bold@shape}{\greek@bold@sl}% +} + +\DeclareOption{cm}{\renewcommand{\math@sfdefault}{cmss}} +\DeclareOption{lm}{\renewcommand{\math@sfdefault}{lmss}} +\DeclareOption{helvet}{\renewcommand{\math@sfdefault}{phv}} +\DeclareOption{cmbright}{\renewcommand{\math@sfdefault}{cmbr}} +\DeclareOption{tx}{\renewcommand{\math@sfdefault}{txss}} +\DeclareOption{px}{\renewcommand{\math@sfdefault}{pxss}} + +\DeclareOption{T1experimental}{\renewcommand{\math@encoding}{T1}} +\DeclareOption{AlphT1experimental}{\renewcommand{\math@lph@encoding}{T1}} + +\DeclareOption{mathrmOrig}{\renewcommand{\mathrm@lph}{cmr}} +\DeclareOption{mathbfOrig}{\renewcommand{\mathbf@lph}{cmr}} +\DeclareOption{mathitOrig}{\renewcommand{\mathit@lph}{cmr}} +\DeclareOption{mathsfOrig}{\renewcommand{\mathsf@lph}{cmss}} + + +\newcommand{\math@sfdefault}{\sfdefault} +\newcommand{\math@encoding}{OT1} +\newcommand{\math@lph@encoding}{OT1} + +\newcommand{\mathrm@lph}{\math@sfdefault} +\newcommand{\mathbf@lph}{\math@sfdefault} +\newcommand{\mathit@lph}{\math@sfdefault} +\newcommand{\mathsf@lph}{\math@sfdefault} + + +% \math@sfGreek: Font for capital greeks: cmss or other? +% \greek@shape: Capital greeks: normal or slanted? [slantedGreek] +% \greek@bold@shape: Bold capital greeks: normal or slanted? [slantedGreek] +% \greek@bold@sl: Bold capital greeks: "sl" if slanted possible +% +% \mathnormal@bold@shape: Bold letters: normal or slanted? (always bold) +% \mathit@bold@series: Bold \mathit (\mathsl): medium or bold? (always slanted) + +\newcommand{\math@sfGreek}{cmss} +\newcommand{\greek@shape}{n} +\newcommand{\greek@bold@shape}{n} +\newcommand{\greek@bold@sl}{n} +\newcommand{\mathnormal@bold@shape}{n} +\newcommand{\mathit@bold@series}{m} + + + +\ProcessOptions + + + +% check the current value of \math@sfdefault + +\edef\tmp@sfdefault{\math@sfdefault} + +\def\tmp@compare{cmss} +\ifx\tmp@sfdefault\tmp@compare + % \sfdefault is cmss + % no slanted bold letters + % no slanted bold capital Greeks + \renewcommand{\math@sfGreek}{cmss} + \renewcommand{\greek@bold@sl}{n} + \renewcommand{\mathnormal@bold@shape}{n} + \renewcommand{\mathit@bold@series}{m} +\fi + +\def\tmp@compare{phv} +\ifx\tmp@sfdefault\tmp@compare + % \sfdefault is phv (helvet.sty) + % slanted bold letters + % no capital Greeks + \renewcommand{\math@sfGreek}{cmss} + \renewcommand{\greek@bold@sl}{n} + \renewcommand{\mathnormal@bold@shape}{sl} + \renewcommand{\mathit@bold@series}{bx} +\fi + +\def\tmp@compare{txss} +\ifx\tmp@sfdefault\tmp@compare + % \sfdefault is txss (txfonts.sty) + % slanted bold letters + % slanted bold capital Greeks + \renewcommand{\math@sfGreek}{txss} + \renewcommand{\greek@bold@sl}{sl} + \renewcommand{\mathnormal@bold@shape}{sl} + \renewcommand{\mathit@bold@series}{bx} +\fi + +\def\tmp@compare{pxss} +\ifx\tmp@sfdefault\tmp@compare + % \sfdefault is pxss (pxfonts.sty) + % slanted bold letters + % slanted bold capital Greeks + \renewcommand{\math@sfGreek}{pxss} + \renewcommand{\greek@bold@sl}{sl} + \renewcommand{\mathnormal@bold@shape}{sl} + \renewcommand{\mathit@bold@series}{bx} +\fi + +\def\tmp@compare{cmbr} +\ifx\tmp@sfdefault\tmp@compare + % \sfdefault is cmbr (cmbright.sty) + % no slanted bold letters + % no slanted bold capital Greeks + \renewcommand{\math@sfGreek}{cmbr} + \renewcommand{\greek@bold@sl}{n} + \renewcommand{\mathnormal@bold@shape}{n} + \renewcommand{\mathit@bold@series}{m} +\fi + +\def\tmp@compare{lmss} +\ifx\tmp@sfdefault\tmp@compare + % \sfdefault is lmss (lmodern.sty sans serif) + % T1 encoding only + % slanted bold letters + % no slanted bold capital Greeks + \renewcommand{\math@encoding}{T1} + \renewcommand{\math@lph@encoding}{T1} + \renewcommand{\math@sfGreek}{cmss} + \renewcommand{\greek@bold@sl}{n} + \renewcommand{\mathnormal@bold@shape}{sl} + \renewcommand{\mathit@bold@series}{bx} +\fi + + + +% Change font for digits and "operators" (\sin, \exp, ...) +% to default sans serif font + +\SetSymbolFont{operators}{normal}{\math@encoding}{\math@sfdefault}{m}{n} +\SetSymbolFont{operators}{bold}{\math@encoding}{\math@sfdefault}{bx}{n} + + +% Most special math symbols remain unmodified (and many of those +% don't have serifs); however all letters (A-Z, a-z) are +% explicitely changed to the sans serif version (again +% default sans serif font). +% +% Unfortunately, there is no standard slanted+bold sans serif font +% available (as Postscript Type 1 font), so try an upright +% version (may be better than nothing). + +\DeclareSymbolFont{SFMath}{\math@encoding}{\math@sfdefault}{m}{sl} +\SetSymbolFont{SFMath}{normal}{\math@encoding}{\math@sfdefault}{m}{sl} +\SetSymbolFont{SFMath}{bold}{\math@encoding}{\math@sfdefault}{bx}{\mathnormal@bold@shape} +\DeclareMathSymbol{A}{\mathalpha}{SFMath}{`A} +\DeclareMathSymbol{B}{\mathalpha}{SFMath}{`B} +\DeclareMathSymbol{C}{\mathalpha}{SFMath}{`C} +\DeclareMathSymbol{D}{\mathalpha}{SFMath}{`D} +\DeclareMathSymbol{E}{\mathalpha}{SFMath}{`E} +\DeclareMathSymbol{F}{\mathalpha}{SFMath}{`F} +\DeclareMathSymbol{G}{\mathalpha}{SFMath}{`G} +\DeclareMathSymbol{H}{\mathalpha}{SFMath}{`H} +\DeclareMathSymbol{I}{\mathalpha}{SFMath}{`I} +\DeclareMathSymbol{J}{\mathalpha}{SFMath}{`J} +\DeclareMathSymbol{K}{\mathalpha}{SFMath}{`K} +\DeclareMathSymbol{L}{\mathalpha}{SFMath}{`L} +\DeclareMathSymbol{M}{\mathalpha}{SFMath}{`M} +\DeclareMathSymbol{N}{\mathalpha}{SFMath}{`N} +\DeclareMathSymbol{O}{\mathalpha}{SFMath}{`O} +\DeclareMathSymbol{P}{\mathalpha}{SFMath}{`P} +\DeclareMathSymbol{Q}{\mathalpha}{SFMath}{`Q} +\DeclareMathSymbol{R}{\mathalpha}{SFMath}{`R} +\DeclareMathSymbol{S}{\mathalpha}{SFMath}{`S} +\DeclareMathSymbol{T}{\mathalpha}{SFMath}{`T} +\DeclareMathSymbol{U}{\mathalpha}{SFMath}{`U} +\DeclareMathSymbol{V}{\mathalpha}{SFMath}{`V} +\DeclareMathSymbol{W}{\mathalpha}{SFMath}{`W} +\DeclareMathSymbol{X}{\mathalpha}{SFMath}{`X} +\DeclareMathSymbol{Y}{\mathalpha}{SFMath}{`Y} +\DeclareMathSymbol{Z}{\mathalpha}{SFMath}{`Z} +\DeclareMathSymbol{a}{\mathalpha}{SFMath}{`a} +\DeclareMathSymbol{b}{\mathalpha}{SFMath}{`b} +\DeclareMathSymbol{c}{\mathalpha}{SFMath}{`c} +\DeclareMathSymbol{d}{\mathalpha}{SFMath}{`d} +\DeclareMathSymbol{e}{\mathalpha}{SFMath}{`e} +\DeclareMathSymbol{f}{\mathalpha}{SFMath}{`f} +\DeclareMathSymbol{g}{\mathalpha}{SFMath}{`g} +\DeclareMathSymbol{h}{\mathalpha}{SFMath}{`h} +\DeclareMathSymbol{i}{\mathalpha}{SFMath}{`i} +\DeclareMathSymbol{j}{\mathalpha}{SFMath}{`j} +\DeclareMathSymbol{k}{\mathalpha}{SFMath}{`k} +\DeclareMathSymbol{l}{\mathalpha}{SFMath}{`l} +\DeclareMathSymbol{m}{\mathalpha}{SFMath}{`m} +\DeclareMathSymbol{n}{\mathalpha}{SFMath}{`n} +\DeclareMathSymbol{o}{\mathalpha}{SFMath}{`o} +\DeclareMathSymbol{p}{\mathalpha}{SFMath}{`p} +\DeclareMathSymbol{q}{\mathalpha}{SFMath}{`q} +\DeclareMathSymbol{r}{\mathalpha}{SFMath}{`r} +\DeclareMathSymbol{s}{\mathalpha}{SFMath}{`s} +\DeclareMathSymbol{t}{\mathalpha}{SFMath}{`t} +\DeclareMathSymbol{u}{\mathalpha}{SFMath}{`u} +\DeclareMathSymbol{v}{\mathalpha}{SFMath}{`v} +\DeclareMathSymbol{w}{\mathalpha}{SFMath}{`w} +\DeclareMathSymbol{x}{\mathalpha}{SFMath}{`x} +\DeclareMathSymbol{y}{\mathalpha}{SFMath}{`y} +\DeclareMathSymbol{z}{\mathalpha}{SFMath}{`z} + +\DeclareMathSymbol{\imath}{\mathalpha}{SFMath}{"10} +\DeclareMathSymbol{\jmath}{\mathalpha}{SFMath}{"11} + + +% The symbols ",", ".", and "\ldotp" should be sans serif +% but upright. + +\DeclareSymbolFont{SFMathUp}{\math@encoding}{\math@sfdefault}{m}{n} +\SetSymbolFont{SFMathUp}{normal}{\math@encoding}{\math@sfdefault}{m}{n} +\SetSymbolFont{SFMathUp}{bold}{\math@encoding}{\math@sfdefault}{bx}{n} +\DeclareMathSymbol{,}{\mathpunct}{SFMathUp}{`,} +\DeclareMathSymbol{.}{\mathord}{SFMathUp}{`.} +\DeclareMathSymbol{\ldotp}{\mathord}{SFMathUp}{`.} + + +% Take capital greek letters from cmss or [tp]xss; other sans serif fonts +% like helvetica don't have capital greeks, so here cmss is +% taken instead of \sfdefault. Unfortunately, this does not work +% within the alphabet commands \mathrm, \mathsf, ... + +\DeclareSymbolFont{SFMathGreek}{OT1}{\math@sfGreek}{m}{\greek@shape} +\SetSymbolFont{SFMathGreek}{normal}{OT1}{\math@sfGreek}{m}{\greek@shape} +\SetSymbolFont{SFMathGreek}{bold}{OT1}{\math@sfGreek}{bx}{\greek@bold@shape} + +\DeclareMathSymbol{\Gamma}{\mathalpha}{SFMathGreek}{"00} +\DeclareMathSymbol{\Delta}{\mathalpha}{SFMathGreek}{"01} +\DeclareMathSymbol{\Theta}{\mathalpha}{SFMathGreek}{"02} +\DeclareMathSymbol{\Lambda}{\mathalpha}{SFMathGreek}{"03} +\DeclareMathSymbol{\Xi}{\mathalpha}{SFMathGreek}{"04} +\DeclareMathSymbol{\Pi}{\mathalpha}{SFMathGreek}{"05} +\DeclareMathSymbol{\Sigma}{\mathalpha}{SFMathGreek}{"06} +\DeclareMathSymbol{\Upsilon}{\mathalpha}{SFMathGreek}{"07} +\DeclareMathSymbol{\Phi}{\mathalpha}{SFMathGreek}{"08} +\DeclareMathSymbol{\Psi}{\mathalpha}{SFMathGreek}{"09} +\DeclareMathSymbol{\Omega}{\mathalpha}{SFMathGreek}{"0A} + + +\DeclareSymbolFont{SFMathUpGreek}{OT1}{\math@sfGreek}{m}{n} +\SetSymbolFont{SFMathUpGreek}{normal}{OT1}{\math@sfGreek}{m}{n} +\SetSymbolFont{SFMathUpGreek}{bold}{OT1}{\math@sfGreek}{bx}{n} + +\DeclareMathSymbol{\upDelta}{\mathalpha}{SFMathUpGreek}{"01} +\DeclareMathSymbol{\upOmega}{\mathalpha}{SFMathUpGreek}{"0A} + + +% Define new behavior for math alphabet commands + + +\SetMathAlphabet{\mathnormal}{normal}{\math@lph@encoding}{\math@sfdefault}{m}{sl} +\SetMathAlphabet{\mathnormal}{bold}{\math@lph@encoding}{\math@sfdefault}{bx}{\mathnormal@bold@shape} + +\SetMathAlphabet{\mathrm}{normal}{\math@lph@encoding}{\mathrm@lph}{m}{n} +\SetMathAlphabet{\mathrm}{bold}{\math@lph@encoding}{\mathrm@lph}{bx}{n} + +\SetMathAlphabet{\mathbf}{normal}{\math@lph@encoding}{\mathbf@lph}{bx}{n} +\SetMathAlphabet{\mathbf}{bold}{\math@lph@encoding}{\mathbf@lph}{bx}{n} + +\SetMathAlphabet{\mathit}{normal}{\math@lph@encoding}{\mathit@lph}{m}{sl} +\SetMathAlphabet{\mathit}{bold}{\math@lph@encoding}{\mathit@lph}{\mathit@bold@series}{sl} + +\SetMathAlphabet{\mathsf}{normal}{\math@lph@encoding}{\mathsf@lph}{m}{n} +\SetMathAlphabet{\mathsf}{bold}{\math@lph@encoding}{\mathsf@lph}{bx}{n} + + + +% Define new math alphabet command \mathsl + +\DeclareMathAlphabet{\mathsl}{\math@lph@encoding}{\math@sfdefault}{m}{sl} +\SetMathAlphabet{\mathsl}{bold}{\math@lph@encoding}{\math@sfdefault}{\mathit@bold@series}{sl} + + +\endinput
doc/sfmath.sty Property changes : Added: svn:executable Index: doc/glossary.tex =================================================================== --- doc/glossary.tex (nonexistent) +++ doc/glossary.tex (revision 2) @@ -0,0 +1,29 @@ +\glossary{name={Byte}, + description={String of Bits - nowadays mostly a string of 8 Bits, also called oktett}, + sort={Byte} +} +\glossary{name={Bit}, + description={Binary Digit, atomary information unit}, + sort={Bit} +} +\glossary{name={switch fabric}, + description={Interconnect between IP-Cores providing arbiration and glue logic. Altera\rtm\ Avalon\rtm\ term}, + sort={Switch fabric} +} + +\glossary{name={Master}, + description={Entity initiating and controlling communication.}, + sort={Master} +} + +\glossary{name={Slave}, + description={Entity responding to communication requests by a Master.}, + sort={Slave} +} + +\glossary{name={memory mapped}, + description={Method of addressing peripheral components like Avalon Slaves via the same address bus as main memory}, + sort={memory mapped} +} + + \ No newline at end of file
doc/glossary.tex Property changes : Added: svn:executable Index: doc/avs_aes.dvi =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: doc/avs_aes.dvi =================================================================== --- doc/avs_aes.dvi (nonexistent) +++ doc/avs_aes.dvi (revision 2)
doc/avs_aes.dvi Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: doc/cited.bib =================================================================== --- doc/cited.bib (nonexistent) +++ doc/cited.bib (revision 2) @@ -0,0 +1,62 @@ +@misc{Altera:Avalon, + title = {Avalon Interface Specification}, + organization = {Altera Corporation}, + address = {101 Innovation Drive, San Jose, CA, US}, + year = {2005}, + key = {MNL-AVABUSREF-3.1}, + type = {Specification}, + url = {http://www.altera.com/literature/manual/mnl\_avalon\_spec.pdf} +} + +@misc{OC:WBspec, + title = {WISHBONE SoC Architecture Specification, Revision B.3}, + author = {Richard Herveille}, + organization = {Opencores Organization}, + address = {}, + edition = {}, + month = {Sept.}, + year = {2002}, + url = {http://www.opencores.org/downloads/wbspec_b3.pdf}, +} + + +@misc{NIST:Fips197, + title = {FIPS-197 Announcing the Advanced Encryption Standard (AES) }, + organization = {National Institute of Standards and Technology (NIST)}, + address = {100 Bureau Drive, Stop 1070, Gaithersburg, MD, US}, + edition = {Federal Information Processing Standards Publication 197}, + month = {Nov.}, + year = {2001}, + url = {http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf}, +} + + +@misc{Xilinx:wp284, + title = {Advantages of the Virtex-5 FPGA 6-Input LUT Architecture}, + author = {Andrew Percey}, + organization = {Xilinx Inc.}, + address = { 2100 Logic Drive, San Jose CA USA }, + edition = {Whitpaper 284}, + month = {Dec.}, + year = {2007}, + url = {http://www.xilinx.com/support/documentation/white_papers/wp284.pdf}, +} + + +@misc{Altera:01007, + title= {Stratix III FPGAs vs. Xilinx Virtex-5 Devices: Architecture and Performance Comparison}, + organization = {Altera Corporation}, + address = { 101 Innovation Drive, San Jose CA USA}, + edition = {Whitepaper 01007-v2.1}, + month = {Oct.}, + year = {2007}, + url ={http://www.altera.com/literature/wp/wp-01007.pdf} +} + +@misc{Wiki:AvWb, + title = {Wishbone - Computer Bus}, + organization = {wikipedia.org}, + lastchecked = {2009-04-20}, + url = {http://en.wikipedia.org/wiki/Wishbone\_computer\_bus)#Comparisons}, +} +
doc/cited.bib Property changes : Added: svn:executable Index: doc/ruschidoc.cls =================================================================== --- doc/ruschidoc.cls (nonexistent) +++ doc/ruschidoc.cls (revision 2) @@ -0,0 +1,300 @@ +\NeedsTeXFormat{LaTeX2e} +\ProvidesClass{ruschidoc} +\LoadClass[11pt,a4paper,twoside]{article} +\RequirePackage[intlimits,sumlimits]{amsmath} +\RequirePackage{amssymb} +\RequirePackage{amsfonts} +\RequirePackage{fancyhdr} +\RequirePackage[T1]{fontenc} +\RequirePackage[latin1]{inputenc} +\RequirePackage{amsmath} +\RequirePackage{helvet} +\RequirePackage[amssymb]{SIunits} +\RequirePackage[helvet]{sfmath} +\RequirePackage{lastpage} +\RequirePackage{tabularx} +\RequirePackage{multirow} +\RequirePackage{listings} +\RequirePackage{textcomp} + +%% Some packages need special options for PDFtex +\RequirePackage{ifpdf} +\ifpdf + \RequirePackage[pdftex]{color} + \RequirePackage[pdftex]{graphics} + \DeclareGraphicsExtensions{.pdf, .png, .jpg} +\else + \RequirePackage{color} + \RequirePackage{graphics} + \DeclareGraphicsExtensions{.eps, .ps} +\fi +\graphicspath{{figs/}} +\RequirePackage{graphicx} +\RequirePackage{subfigure} +\RequirePackage{psfrag} +\RequirePackage{colortbl} + +% ************************ Page layout ************************ +\topmargin -20mm +\headheight 30mm +\headsep 6mm +\footskip 11mm +\oddsidemargin 2mm +\evensidemargin 2mm +\marginparsep 145mm +\marginparwidth 8mm +\textwidth 162mm +\textheight 225mm +\parindent 0mm +\parskip 3mm + +%Floats (tables, figures) +% http://www.eng.cam.ac.uk/help/tpl/textprocessing/squeeze.html +\floatsep 10mm +\intextsep 2ex +\textfloatsep 10pt +\abovecaptionskip 5pt +\belowcaptionskip 5pt +% Section and subsection are de-idented (text body is idented) +\def\@secindent{8mm} +% how wide is the header +\def\@htwidth{172mm} + +%colors +\definecolor{lightgrey}{rgb}{0.95,0.95,0.95} + +%% Change the font +\renewcommand{\familydefault}{\sfdefault} +%% Make Registered Trademark symbol raised +\newcommand{\tm}{\textsuperscript{\texttrademark}} +\newcommand{\rtm}{\textsuperscript{\textregistered}} +\renewcommand{\copyright}{\textcopyright} + + +\setcounter{secnumdepth}{4} +\setcounter{tocdepth}{3} +\newlength\captionwidth +\setlength\captionwidth{13cm} + +\renewcommand{\paragraph}[1]{\newpar{#1}\ \vspace{0.3cm}\\} + +\renewcommand{\section}{\@startsection +{section}% % the name +{1}% % the level +{-\@secindent}% % the indent +{-18pt}% +{6pt}% % the after skip +{\Large\bf}} % the style + +\renewcommand{\subsection}{\@startsection +{subsection}% % the name +{1}% % the level +{-\@secindent}% % the indent +{-6pt}% +{6pt}% % the after skip +{\large\bf}} % the style + +\renewcommand{\subsubsection}{\@startsection +{subsubsection}% % the name +{1}% % the level +{-\@secindent}% % the indent +{-6pt}% +{6pt}% % the after skip +{\bf}} % the style + + + + +% ************************ Date format ************************ +\def\shorttoday{\ifcase\month\or + Jan\or Feb\or Mar\or Apr\or May\or Jun\or Jul\or Aug\or + Sep\or Oct\or Nov\or Dec\fi~\number\day, \number\year} + +\def\shorttoday{\number\day-\ifcase\month\or + Jan\or Feb\or Mar\or Apr\or May\or Jun\or Jul\or Aug\or + Sep\or Oct\or Nov\or Dec\fi-\number\year} + +\newcommand{\paddedday}{\ifnum\number\day<10 0\number\day\else \number\day\fi} +\newcommand{\paddedmonth}{\ifnum\number\month<10 0\number\month\else \number\month\fi} + +\def\shorttoday{\number\year/\paddedmonth/\paddedday} + + +% ************************ Document Variables ************************ +% main author +\newcommand*{\authorName}[1]{\def\@authorName{#1}} +\authorName{} +% Additional Authors +\newcommand*{\authorAddress}[1]{\def\@authorAddress{#1}} +\authorAddress{} +\newcommand*{\authorURL}[1]{\def\@authorURL{#1}} +\authorURL{} +\newcommand*{\authorEmail}[1]{\def\@authorEmail{#1}} +\authorEmail{} +% When was the document written/submitted (not compiled) +\newcommand*{\docDate}[1]{\def\@docDate{#1}} +\docDate{} +% unique identifier +\newcommand*{\docID}[1]{\def\@docID{#1}} +\docID{} +% type of document +\newcommand*{\docType}[1]{\def\@docType{#1}} +\docType{Technical Note} +% Title of the document +\newcommand*{\docTitle}[1]{\def\@docTitle{#1}} +\docTitle{} +% Title of the document +\newcommand*{\docSubtitle}[1]{\def\@docSubtitle{#1}} +\docSubtitle{} +% current revision +\newcommand*{\docRevision}[1]{\def\@docRevision{#1}} +\docRevision{0.1} +% Status Draft/revision/ final +\newcommand*{\docStatus}[1]{\def\@docStatus{#1}} +\docStatus{Draft} +% Who will receive the doc -- differnece to customers??? +\newcommand*{\recipientList}[1]{\def\@recipientList{#1}} +% list of keywords +\newcommand*{\keywords}[1]{\def\@keywords{#1}} +\keywords{} +% list of revisions +\newcommand*{\revisionList}[1]{\def\@revisionList{#1}} +\revisionList{} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\newenvironment{CompactList} +{\begin{list}{}{ + \setlength{\leftmargin}{0.5cm} + \setlength{\itemsep}{0pt} + \setlength{\parsep}{0pt} + \setlength{\topsep}{0pt} + \renewcommand{\makelabel}{\hfill}}} +{\end{list}} + +\newenvironment{CompactItemize} +{ + \begin{itemize} + \setlength{\itemsep}{-3pt} + \setlength{\parsep}{0pt} + \setlength{\topsep}{0pt} + \setlength{\partopsep}{0pt} +} +{\end{itemize}} + +\newcommand{\entrylabel}[1]{ + {\parbox[b]{\labelwidth}{\makebox[0pt][l]{\textbf{#1}}\vspace{1.5\baselineskip}}}} + +\newcommand{\paragraphbreak}[1]{\paragraph{#1}\ \vspace{0.3cm}\\} +\newcommand{\subparagraphbreak}[1]{\subparagraph{#1}\ \vspace{0.3cm}\\} + +\newenvironment{Desc} +{\begin{list}{} + { + \settowidth{\labelwidth}{40pt} + \setlength{\leftmargin}{\labelwidth} + \setlength{\parsep}{0pt} + \setlength{\itemsep}{-4pt} + \renewcommand{\makelabel}{\entrylabel} + } +} +{\end{list}} + \lstset{ + breaklines, + tabsize=5, + columns=flexible, + extendedchars, + xleftmargin=2em, + basicstyle=\scriptsize\sffamily, + showstringspaces=false, + emptylines=*1, + frame=single, + literate={[]}{[{$\;$}]}3, + captionpos=b + backgroundcolor=\color{lightgrey}} +%\lstlistingname="Listing" + + +% ************************ Header/footer ************************ +\pagestyle{fancy} +\renewcommand{\headrulewidth}{0.0pt} +\renewcommand{\footrulewidth}{0.0pt} + +\fancyhead[O,E]{ + \leftskip-\@secindent + \begin{tabularx}{185mm}{p{98mm} p{45mm} p{25mm}} + \hskip2mm \sc{ \@docTitle } & & \hskip2mm \thepage / \pageref{LastPage} + \end{tabularx} + \includegraphics[width=\@htwidth]{fancy_headsep_r} +} + + + + \fancyfoot{} + \fancyfoot[ER,OL]{ + \tiny{All rights reserved - \copyright \number\year \ \@authorName} + } + \fancyfoot[EL,OR]{ + \tiny{\@docID \ (v. \@docRevision) - \@\shorttoday} + } + + +\fancypagestyle{plain}{ + \renewcommand{\headrulewidth}{0.0pt} + \renewcommand{\footrulewidth}{0.0pt} + \fancyhead{} + \fancyfoot[EL,OL]{} + \renewcommand{\headrulewidth}{0pt} + } + + + + +\renewenvironment{abstract}{ + \small + \begin{center} + {\bf\large \abstractname + \vspace{-.5em}\vspace{\z@}} + \end{center} +} + +% ************************ Revision table ********************* +\newcommand{ \revisionTable } { + \section*{Change History} + \begin{tabularx}{\textwidth} {| p{11mm} | p{14mm} | X | p{23mm} | p{32mm} |} + \hline + Rev. & Chapter & Description & Date & Reviewer \\ + \hline + \@revisionList + \hline + \end{tabularx} +} + +% ************************ Cover table ************************ +\def\@maketitle{ + \vglue80mm + %% Title + \begin{minipage}{0.65\linewidth} + \begin{flushleft} + \Huge{\textbf{\sc{\@docTitle}}} + \end{flushleft} + \end{minipage} +%% fancy line + \vskip4pt + \leftskip-17mm + \includegraphics[width=1.1\textwidth]{fancy_headsep_r} + \vspace{3pt} +%% addess + \vglue55mm + \begin{tabularx}{\textwidth}{p{55mm} X p{65mm}} + \begin{minipage}{60mm} + \includegraphics[width=20mm]{logo} + \end{minipage} & & + \begin{minipage}{62mm} + \Large{\@authorName} \\ + \large{\@authorAddress} + \end{minipage} \\ + & & \\ + \large{\@authorURL} & & \large{\@authorEmail} \\ + \end{tabularx} + \vspace{2ex} +} %% End of maketitle
doc/ruschidoc.cls Property changes : Added: svn:executable Index: doc/acronym.tex =================================================================== --- doc/acronym.tex (nonexistent) +++ doc/acronym.tex (revision 2) @@ -0,0 +1,15 @@ +\newacronym{LSB}{Least Significant Bit}{description=least value bit in a vector} +\newacronym{MSB}{Most Significant Bit}{description=highest value bit in a vector} +\newacronym{SoC}{System on Chip}{description=System of seperate functional interacting together implemented on a single chip } +\newacronym{AES}{Advanced Encryption Standard}{description=NIST approved symmetric +block cypher} +\newacronym{ECB}{Electronic Codebook}{description=application of a cypher algorithm +without further processing of the blocks} +\newacronym{FSM}{Finite State Machine}{description=Behavioural Model with finite +number of states and transitions} +\newacronym{NIST}{National Institute of Standards and Technology}{description=US +standardisation office} + + + +
doc/acronym.tex Property changes : Added: svn:executable Index: doc/figs/encrypt_FSM.eps =================================================================== --- doc/figs/encrypt_FSM.eps (nonexistent) +++ doc/figs/encrypt_FSM.eps (revision 2) @@ -0,0 +1,536 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: Graphviz version 2.20.2 (Mon Mar 30 10:09:11 UTC 2009) +%%For: (ruschi) Thomas Ruschival +%%Title: sample +%%Pages: 1 +%%BoundingBox: 36 36 475 528 +%%EndComments +save +%%BeginProlog +/DotDict 200 dict def +DotDict begin + +/setupLatin1 { +mark +/EncodingVector 256 array def + EncodingVector 0 + +ISOLatin1Encoding 0 255 getinterval putinterval +EncodingVector 45 /hyphen put + +% Set up ISO Latin 1 character encoding +/starnetISO { + dup dup findfont dup length dict begin + { 1 index /FID ne { def }{ pop pop } ifelse + } forall + /Encoding EncodingVector def + currentdict end definefont +} def +/Times-Roman starnetISO def +/Times-Italic starnetISO def +/Times-Bold starnetISO def +/Times-BoldItalic starnetISO def +/Helvetica starnetISO def +/Helvetica-Oblique starnetISO def +/Helvetica-Bold starnetISO def +/Helvetica-BoldOblique starnetISO def +/Courier starnetISO def +/Courier-Oblique starnetISO def +/Courier-Bold starnetISO def +/Courier-BoldOblique starnetISO def +cleartomark +} bind def + +%%BeginResource: procset graphviz 0 0 +/coord-font-family /Times-Roman def +/default-font-family /Times-Roman def +/coordfont coord-font-family findfont 8 scalefont def + +/InvScaleFactor 1.0 def +/set_scale { + dup 1 exch div /InvScaleFactor exch def + scale +} bind def + +% styles +/solid { [] 0 setdash } bind def +/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def +/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def +/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def +/bold { 2 setlinewidth } bind def +/filled { } bind def +/unfilled { } bind def +/rounded { } bind def +/diagonals { } bind def + +% hooks for setting color +/nodecolor { sethsbcolor } bind def +/edgecolor { sethsbcolor } bind def +/graphcolor { sethsbcolor } bind def +/nopcolor {pop pop pop} bind def + +/beginpage { % i j npages + /npages exch def + /j exch def + /i exch def + /str 10 string def + npages 1 gt { + gsave + coordfont setfont + 0 0 moveto + (\() show i str cvs show (,) show j str cvs show (\)) show + grestore + } if +} bind def + +/set_font { + findfont exch + scalefont setfont +} def + +% draw text fitted to its expected width +/alignedtext { % width text + /text exch def + /width exch def + gsave + width 0 gt { + [] 0 setdash + text stringwidth pop width exch sub text length div 0 text ashow + } if + grestore +} def + +/boxprim { % xcorner ycorner xsize ysize + 4 2 roll + moveto + 2 copy + exch 0 rlineto + 0 exch rlineto + pop neg 0 rlineto + closepath +} bind def + +/ellipse_path { + /ry exch def + /rx exch def + /y exch def + /x exch def + matrix currentmatrix + newpath + x y translate + rx ry scale + 0 0 1 0 360 arc + setmatrix +} bind def + +/endpage { showpage } bind def +/showpage { } def + +/layercolorseq + [ % layer color sequence - darkest to lightest + [0 0 0] + [.2 .8 .8] + [.4 .8 .8] + [.6 .8 .8] + [.8 .8 .8] + ] +def + +/layerlen layercolorseq length def + +/setlayer {/maxlayer exch def /curlayer exch def + layercolorseq curlayer 1 sub layerlen mod get + aload pop sethsbcolor + /nodecolor {nopcolor} def + /edgecolor {nopcolor} def + /graphcolor {nopcolor} def +} bind def + +/onlayer { curlayer ne {invis} if } def + +/onlayers { + /myupper exch def + /mylower exch def + curlayer mylower lt + curlayer myupper gt + or + {invis} if +} def + +/curlayer 0 def + +%%EndResource +%%EndProlog +%%BeginSetup +14 default-font-family set_font +1 setmiterlimit +% /arrowlength 10 def +% /arrowwidth 5 def + +% make sure pdfmark is harmless for PS-interpreters other than Distiller +/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse +% make '<<' and '>>' safe on PS Level 1 devices +/languagelevel where {pop languagelevel}{1} ifelse +2 lt { + userdict (<<) cvn ([) cvn load put + userdict (>>) cvn ([) cvn load put +} if + +%%EndSetup +setupLatin1 +%%Page: 1 1 +%%PageBoundingBox: 36 36 475 528 +%%PageOrientation: Portrait +0 0 1 beginpage +gsave +36 36 439 492 boxprim clip newpath +1 1 set_scale 0 rotate 40 40 translate +% START +gsave +0.000 0.000 0.000 nodecolor +194 482 1.8 1.8 ellipse_path fill +1 setlinewidth +filled +0.000 0.000 0.000 nodecolor +194 482 1.8 1.8 ellipse_path stroke +grestore +% WAIT_KEY +gsave +1 setlinewidth +0.000 0.000 0.000 nodecolor +194 424 46.88 18 ellipse_path stroke +0.000 0.000 0.000 nodecolor +12 /Times-Roman set_font +164.5 420.2 moveto 59 (WAIT_KEY) alignedtext +grestore +% START->WAIT_KEY +gsave +1 setlinewidth +0.000 0.000 0.000 edgecolor +newpath 194 480 moveto +194 475 194 464 194 452 curveto +stroke +0.000 0.000 0.000 edgecolor +newpath 197.5 452 moveto +194 442 lineto +190.5 452 lineto +closepath fill +1 setlinewidth +solid +0.000 0.000 0.000 edgecolor +newpath 197.5 452 moveto +194 442 lineto +190.5 452 lineto +closepath stroke +grestore +% WAIT_DATA +gsave +1 setlinewidth +0.000 0.000 0.000 nodecolor +53 338 53.06 18 ellipse_path stroke +0.000 0.000 0.000 nodecolor +12 /Times-Roman set_font +19 334.2 moveto 68 (WAIT_DATA) alignedtext +grestore +% WAIT_KEY->WAIT_DATA +gsave +1 setlinewidth +0.000 0.000 0.000 edgecolor +newpath 148 420 moveto +104 416 44 406 29 388 curveto +23 381 25 372 30 363 curveto +stroke +0.000 0.000 0.000 edgecolor +newpath 32.8 365.1 moveto +36 355 lineto +27.2 360.9 lineto +closepath fill +1 setlinewidth +solid +0.000 0.000 0.000 edgecolor +newpath 32.8 365.1 moveto +36 355 lineto +27.2 360.9 lineto +closepath stroke +0.000 0.000 0.000 edgecolor +10 /Times-Roman set_font +31.5 378.5 moveto 63 (key_ready=1) alignedtext +grestore +% WAIT_DATA->WAIT_KEY +gsave +1 setlinewidth +0.000 0.000 0.000 edgecolor +newpath 71 355 moveto +83 365 99 378 115 388 curveto +126 395 139 402 152 407 curveto +stroke +0.000 0.000 0.000 edgecolor +newpath 150.44 410.14 moveto +161 411 lineto +153.28 403.74 lineto +closepath fill +1 setlinewidth +solid +0.000 0.000 0.000 edgecolor +newpath 150.44 410.14 moveto +161 411 lineto +153.28 403.74 lineto +closepath stroke +0.000 0.000 0.000 edgecolor +10 /Times-Roman set_font +117.5 378.5 moveto 65 (key_stable=0) alignedtext +grestore +% INITIAL_ROUND +gsave +1 setlinewidth +0.000 0.000 0.000 nodecolor +190 252 68.85 18 ellipse_path stroke +0.000 0.000 0.000 nodecolor +12 /Times-Roman set_font +143.5 248.2 moveto 93 (INITIAL_ROUND) alignedtext +grestore +% WAIT_DATA->INITIAL_ROUND +gsave +1 setlinewidth +0.000 0.000 0.000 edgecolor +newpath 69 321 moveto +80 310 94 297 109 288 curveto +119 282 130 276 140 271 curveto +stroke +0.000 0.000 0.000 edgecolor +newpath 142.02 273.96 moveto +150 267 lineto +139.42 267.46 lineto +closepath fill +1 setlinewidth +solid +0.000 0.000 0.000 edgecolor +newpath 142.02 273.96 moveto +150 267 lineto +139.42 267.46 lineto +closepath stroke +0.000 0.000 0.000 edgecolor +10 /Times-Roman set_font +108.5 292.5 moveto 71 (data_stable=1) alignedtext +grestore +% INITIAL_ROUND->WAIT_KEY +gsave +1 setlinewidth +0.000 0.000 0.000 edgecolor +newpath 190 270 moveto +191 300 193 360 194 396 curveto +stroke +0.000 0.000 0.000 edgecolor +newpath 190.5 396 moveto +194 406 lineto +197.5 396 lineto +closepath fill +1 setlinewidth +solid +0.000 0.000 0.000 edgecolor +newpath 190.5 396 moveto +194 406 lineto +197.5 396 lineto +closepath stroke +0.000 0.000 0.000 edgecolor +10 /Times-Roman set_font +191.5 335.5 moveto 65 (key_stable=0) alignedtext +grestore +% DO_ROUND +gsave +1 setlinewidth +0.000 0.000 0.000 nodecolor +190 178 53.83 18 ellipse_path stroke +0.000 0.000 0.000 nodecolor +12 /Times-Roman set_font +155 174.2 moveto 70 (DO_ROUND) alignedtext +grestore +% INITIAL_ROUND->DO_ROUND +gsave +1 setlinewidth +0.000 0.000 0.000 edgecolor +newpath 190 234 moveto +190 225 190 216 190 206 curveto +stroke +0.000 0.000 0.000 edgecolor +newpath 193.5 206 moveto +190 196 lineto +186.5 206 lineto +closepath fill +1 setlinewidth +solid +0.000 0.000 0.000 edgecolor +newpath 193.5 206 moveto +190 196 lineto +186.5 206 lineto +closepath stroke +grestore +% DO_ROUND->WAIT_KEY +gsave +1 setlinewidth +0.000 0.000 0.000 edgecolor +newpath 223 192 moveto +239 202 258 215 268 234 curveto +292 282 283 306 261 356 curveto +253 374 237 390 224 402 curveto +stroke +0.000 0.000 0.000 edgecolor +newpath 221.9 399.2 moveto +216 408 lineto +226.1 404.8 lineto +closepath fill +1 setlinewidth +solid +0.000 0.000 0.000 edgecolor +newpath 221.9 399.2 moveto +216 408 lineto +226.1 404.8 lineto +closepath stroke +0.000 0.000 0.000 edgecolor +10 /Times-Roman set_font +280.5 292.5 moveto 65 (key_stable=0) alignedtext +grestore +% DO_ROUND->DO_ROUND +gsave +1 setlinewidth +0.000 0.000 0.000 edgecolor +newpath 240 185 moveto +253 184 262 182 262 178 curveto +262 175 258 173 250 172 curveto +stroke +0.000 0.000 0.000 edgecolor +newpath 250.3 168.51 moveto +240 171 lineto +249.6 175.48 lineto +closepath fill +1 setlinewidth +solid +0.000 0.000 0.000 edgecolor +newpath 250.3 168.51 moveto +240 171 lineto +249.6 175.48 lineto +closepath stroke +0.000 0.000 0.000 edgecolor +10 /Times-Roman set_font +262 175.5 moveto 74 (iFINAL_ROUND +gsave +1 setlinewidth +0.000 0.000 0.000 edgecolor +newpath 190 160 moveto +190 148 190 133 190 120 curveto +stroke +0.000 0.000 0.000 edgecolor +newpath 193.5 120 moveto +190 110 lineto +186.5 120 lineto +closepath fill +1 setlinewidth +solid +0.000 0.000 0.000 edgecolor +newpath 193.5 120 moveto +190 110 lineto +186.5 120 lineto +closepath stroke +0.000 0.000 0.000 edgecolor +10 /Times-Roman set_font +190 132.5 moveto 74 (i=NO_ROUNDS) alignedtext +grestore +% FINAL_ROUND->WAIT_KEY +gsave +1 setlinewidth +0.000 0.000 0.000 edgecolor +newpath 236 105 moveto +288 120 367 149 367 178 curveto +367 338 367 338 367 338 curveto +367 365 293 394 242 410 curveto +stroke +0.000 0.000 0.000 edgecolor +newpath 240.57 406.77 moveto +232 413 lineto +242.58 413.48 lineto +closepath fill +1 setlinewidth +solid +0.000 0.000 0.000 edgecolor +newpath 240.57 406.77 moveto +232 413 lineto +242.58 413.48 lineto +closepath stroke +0.000 0.000 0.000 edgecolor +10 /Times-Roman set_font +366.5 249.5 moveto 65 (key_stable=0) alignedtext +grestore +% DONE +gsave +1 setlinewidth +0.000 0.000 0.000 nodecolor +53 18 32.22 18 ellipse_path stroke +0.000 0.000 0.000 nodecolor +12 /Times-Roman set_font +35.5 14.2 moveto 35 (DONE) alignedtext +grestore +% FINAL_ROUND->DONE +gsave +1 setlinewidth +0.000 0.000 0.000 edgecolor +newpath 160 76 moveto +138 64 108 48 85 36 curveto +stroke +0.000 0.000 0.000 edgecolor +newpath 86.44 32.8 moveto +76 31 lineto +83.04 38.92 lineto +closepath fill +1 setlinewidth +solid +0.000 0.000 0.000 edgecolor +newpath 86.44 32.8 moveto +76 31 lineto +83.04 38.92 lineto +closepath stroke +grestore +% DONE->WAIT_DATA +gsave +1 setlinewidth +0.000 0.000 0.000 edgecolor +newpath 53 36 moveto +53 51 53 73 53 92 curveto +53 252 53 252 53 252 curveto +53 271 53 293 53 310 curveto +stroke +0.000 0.000 0.000 edgecolor +newpath 49.5 310 moveto +53 320 lineto +56.5 310 lineto +closepath fill +1 setlinewidth +solid +0.000 0.000 0.000 edgecolor +newpath 49.5 310 moveto +53 320 lineto +56.5 310 lineto +closepath stroke +0.000 0.000 0.000 edgecolor +10 /Times-Roman set_font +52.5 175.5 moveto 65 (key_stable=0) alignedtext +grestore +endpage +showpage +grestore +%%PageTrailer +%%EndPage: 1 +%%Trailer +end +restore +%%EOF Index: doc/figs/logo.jpg =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: doc/figs/logo.jpg =================================================================== --- doc/figs/logo.jpg (nonexistent) +++ doc/figs/logo.jpg (revision 2)
doc/figs/logo.jpg Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: doc/figs/fancy_headsep_r.eps =================================================================== --- doc/figs/fancy_headsep_r.eps (nonexistent) +++ doc/figs/fancy_headsep_r.eps (revision 2) @@ -0,0 +1,34 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: 0.46 +%%Pages: 1 +%%Orientation: Portrait +%%BoundingBox: 14 708 565 719 +%%HiResBoundingBox: 14.173228 708.66142 564.09449 718.58267 +%%EndComments +%%Page: 1 1 +0 842 translate +0.8 -0.8 scale +0 0 0 setrgbcolor +[] 0 setdash +1 setlinewidth +0 setlinejoin +0 setlinecap +gsave [1 0 0 1 0 0] concat +gsave +0.39215687 0 0.039215688 setrgbcolor +newpath +17.716535 154.13384 moveto +24.766805 160.33465 lineto +627.56512 160.33465 lineto +634.61539 166.53541 lineto +705.11811 166.53541 lineto +698.06785 160.33465 lineto +627.56512 160.33465 lineto +620.51486 154.13384 lineto +17.716535 154.13384 lineto +closepath +eofill +grestore +grestore +showpage +%%EOF
doc/figs/fancy_headsep_r.eps Property changes : Added: svn:executable Index: doc/figs/logo.eps =================================================================== --- doc/figs/logo.eps (nonexistent) +++ doc/figs/logo.eps (revision 2) @@ -0,0 +1,509 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner +%%Title: logo.eps +%%CreationDate: Thu May 21 11:51:50 2009 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 14 14 136 136 +%%EndComments +%%BeginProlog +% Use own dictionary to avoid conflicts +10 dict begin +%%EndProlog +%%Page: 1 1 +% Translate for offset +14.173228346456694 14.173228346456694 translate +% Translate to begin of first scanline +0 121 translate +121 -121 scale +% Image geometry +121 121 8 +% Transformation matrix +[ 121 0 0 121 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 121 string def +/gstr 121 string def +/bstr 121 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 24483 ASCII Bytes +colorimage +dJj4Gp\tAk+OU5grr3*"s8W)Es*t~> +dJj4FrVllsr;Qi*5MQ2;!<2ut!<1:DJ,~> +d/O4Hs8W&prrU,VjSSrWqp#.k~> +ci4.Hrr<#trr38"&J?5:s8;osrr)rurm:[q~> +d/O4Is8W)srrrD/1G_;La8^Y~> +dJj:Hs8;`n#fL.bDrUfsrVaq>J,~> +d/O4Hs8W)trsJb&&.]<`+4C2hrr2otrm1Up~> +bl7\Brr32/1c7*I6.l/9"9/?#rm:[q~> +d/O.ErVlg!rVuo;ral@DDWLitrVat?J,~> +d/O+Fqu6tu%hB9a%M0c3rr)isrm1Up~> +ao;IL1Gpuf1^64us8N&srm(Oo~> +c2S7Os8W&=@q97`AS,rDrVZZqqp>@n~> +ci4aZs8N&uUCn4N&/#Nc$m=+"r;Zfrrm:[q~> +d/O+Frr<#t%(%fG1H%$G2)R\Qs8L7BJ,~> +dJjs[s8W&tr;XiMBP1mgBOYIhjT#,WrQbFn~> +bPr*L&.]Ba%1j$[&eH/4rr;uCs*t~> +dJjp[s8N&trj4O?1c-sE2)I*G6/)A +c2S:Os2SSZA6rkYAn,FbDr^is!<(7DJ,~> +d/O+Frr3M*$kNs\&.oE`&e>Tc+4^A8s*t~> +c2RhD[/Mla1H%!GrA+L46.u8;!<1@FJ,~> +ci4^Xs8U,PAnG[cAS,LcB4tgojSf,Wci8L~> +c2SEO&.fKf%h]Ea&J#Ea&e?,6s8L@EJ,~> +c2S?^2)I*F2)@'F2)@'H1G_>Mc2W:~> +cMn%GaC8alrFQ=JAS#C\BOu)Cc2W:~> +g&D'OqYp`ss8Sl+&+gD7%j9 +g&D'NrVllsrr3'!s0M5P"[UoCrr;usrrE&Ls*t~> +f`)'Ps8W&prrg>PBOkZLAd)jYA8#lAqu6Znec1.~> +fDc!Prr<#trr2tqrX])C&,6\B%h]Ed+O^;fs8W)t!WW/Os*t~> +f`)'Qs8W)trs&K&ZSXNs1\W^+1]B336J9]bJ,~> +g&D-Ps8;co#5cDP@:Eh^q.9tEARoC^Eo[3"rVb4FJ,~> +f`)'Ps8W)srs#>2&.T6^')<(G%h]Hc&/$,6s8W)trrE&Ms*t~> +eGfOJrr3#*2?#H41\ij42)@$F1c%JQrVm!!s8W)Ns*t~> +f`)!MrVlg&rVuo;An5IbAb]j=A7f?NAd*59s8W&reGk%~> +f`(sNqu6ns&eGNc'+YWL&.&jY$kj6b&g5[&rVllsfDg@~> +dJjHX1GgpE1c$r`1]oNj1c>7h#!prBrr;rrf)L7~> +ec-$Us8W&;An5IbB4k`MAdN*\AS#Ca@W(<+r;Qcof`-I~> +fDc +f`(sNrr<#t!4;_^">_kj1c>%b!&FO2"uA(m6.u;;eGk%~> +g&DT]s8W&tr;XiK@:a%`@q9-FAdi6b?tEn]BPuo2qu?WGs*t~> +e,K`N&.]<`'+k`a&blnG&J,N_&J>Wd+4:)frmq+"~> +g&DT^s8N&trj4O>2)I-G2)[8c1^#Tl2)I)f1]p%ts8LRKJ,~> +ec-$Ts2SS^@V07_A7T3FAdMsUBk:jdA7fc?rr2usfDg@~> +f`(sNrr3;$$kNs_%hB6]'))qF%hTBb&e>Nd%j0@$ec1.~> +ec,[L[/Mo]1BKEl1\W^52)@!E1G^jD2*opprrE&Ns*t~> +fDcLdA8gQ-s8CRLJ,~> +ec-#P&.fKd%h]B`&J,TJ&H<:?&-W[W+OgAifDg@~> +ec-#a2)I*G1c$pF1Ggo`1]TE41^Glp1c.'G1I9^Es*t~> +f)H-VaC8alA8#XdA7K0FAcQ<>AdE$[A8#CbAT$V[s*t~> +f)H&R%hK6a&.oHa&cN=A')`CA&+pJ8%j9 +f`)?Ys0FR>2)@'H1c.)b1]TE*1^-2"s8N&trr2uthZ&*~> +g&D0Qs8U%:AH-6DB4PF`ralCGAnG^g@:X'IAd)jYA8#lAqu6Znh>`!~> +f`)3UV`bV%'+Y`T&.9'`&.T3]&.fEe&.eOI#nIX[&g5X&r;ZfrrW3&ui;\<~> +f`)0TZB!.1]B336J9ujJ,~> +fDcT(L1=e,An5LaAn,C_B4tgiAn>XdAGKgEA7]:`@WLN/s8DoNs*t~> +f`)&O&.fBO&.T3^%hT?a%hK9_&eGQa')3"F%h]Hc&/$,6s8W)trrE&Us*t~> +f`(rYq_Sd=2)@*H2)@'G1GgpG1c+n`#;n:n1c.!Tg\q-Srr<#ti;\<~> +f`)],A7fLeA7T7\AS5UaARo=_A7f@\B_Z0@A7f?NAd*59s8W&rh#Dm~> +g&DlH98JD%_mG5U><Tb'+YTb&.oQN&.&jY$kj6b&g5[&rVllshuA3~> +g&DQFB:>9pc+od:FB^RX2)P7f">r"m2Db.c"#Dbj2?#E:6.u;;s8DrRs*t~> +g&DiTNj>n/g!$\)PD!OXB4PRbAn,:^An1UJ$"md[ARoC^DWUiprrDrSs*t~> +g&Dfds8N#trr<#ts8W&,GV'I<%M93_&,$S7&I]![%hK6oec,LHs8N#Us*t~> +f`(sNrr<#trr3<(s1s[g2)I*H1\ +g&D'Nrr3W0rr<#ss8W)CW-W/gB5(jhBOpjL$tX-\AS#IeDWLips8CgSJ,~> +f`(sNrr3H,s8W)trVuosqmT00%fR(@&bchF&J,N_&J>Wd+4:)frnd[*~> +g&M$MrVllsqu6f6BJhV'r\FO3pbW+02)R3Gr\O^CgAh0.s*t~> +ec,jPs8W&srVHKm#gA6?@q'+`@q,4F$"ICXAS#C_AoH`/rrE#Ts*t~> +f`1sMrr2utqYpg"s27YE%hB-D&.9!\&J,Qc&/#Kqec+D)J,~> +f)H!Ss8N#trr)inrrpV[2)@$GpG<471GUdC1GgmF6.u8;!<1pVJ,~> +ec,aMqZ$NnrrE#srs8T'fo9WSAS,KJAdr3ZARoCaA8#LljSf,WhuA3~> +f`)'QrVucms8W)qrrrD.+Untqoaq-6rX]5G%j9@$rnma+~> +f)GmPs8W)tq#CBn"Md8[2)G%b!&aa4#W"=p1c7'F6.t)oJ,~> +f`)*Qrr<#srr2usr;R'$s8W#EDJ!?kq.9V9ralFKA7T@^BOu)Ch>`!~> +a8ZDDs6j5(&.]HR&-!:8&-<@bdes+Irr<#tkPp&~> +aSu_Ks8VY31c.'F2)R0H1\ +ao;hKr;Z`iP\=ZBOkXeDWL]p!;kmXJ,~> +aoDA>s8NB%L_:.-&eGTbp(.N@&eGZudf97Fs8Muus8M6^J,~> +`W$;Es-bc&2)@-I2)Y+b!&OU2!CGJss*t~> +`;^/CZ=IKXBOtdd@eaOBA7]:`@WLN/s8DoVs*t~> +aT);>%0-5)s/-J>&/#K`&.\LI$4da]&.fHsdf9@Hrr2utkPp&~> +ao;GAs8Mus!4;_^">_nl1c+qa#;n:n1c.!Tg\q-Srr<#tkl6/~> +a8ZVJs8W&t`FNCfBOkUbBDH-@A7f?NAd*59s8W&rjSs`~> +`rH)grrE&]s*t~> +ao;_Is8W)us8N&)1c>4fpbW(/1c.)h1^68!s8N&sroX62~> +a8ZSHrr<#rs2JS^@qB=`pgshFA7]=_An#Z>rVZZqqrn'1~> +_Z'o@s.^&7&.] +_#FSF1G^jD2>8p-1B'-81GgpSg&M'4s*t~> +`W,u:rr32@B4GO`@V#7G$tX-\AS#IeDWLips8D*[J,~> +ao;A?q#:M3&.T3`&,6\E&J,N_&J>Wd+4:)froX62~> +a8Z/=qYp_L1c.'H1\`d01Gq$H1B'*46/)A +`rH);$NL))s8AR#AS,IapgshB@;0:aA7T:jj8T&YrTF32~> +aT);>r;R!#s8G.n&.eLH$P*g]&/#Kb&e?)7roO01~> +`r?) +a8Z8=rr;lorri7QB5(lMAdr3ZARoCaA8#LljSf,WkPp&~> +`r?JHs8N#trr<#I&e#?boaq-6rX]5G%j9@$roa<3~> +_#FW +aSu8=r;Zfqs8N2^@:a$FAcQ<>AdE$[A8#CbAT$Vks*t~> +h>[TVs8W)trri>M`5V`Ps8Drsrr`3!s8N#t",IR$&ag23%j9 +g]%9Qr;QoRc-H@gp\t6mr;Zfr"TOlH1c+MU"[UoCrr;usrrE&ds*t~> +i;`fTq>UWXgsuB'qu6U!rVuirs82fq$2ac$s8W&(A7f?AAd)jYA8#lAqu6ZnmJh\~> +i;WfVqu7#PHTMiP&J#F(C;frJ"9/?#rqucumiN,Pn.5m:&eGZudf97Fs8Muus8MNfJ,~> +iVs&[s8Dusrr3>ZNE\4p2)@'`J^"#k!<2rs!<2or"8"f81[m4$1]B336J:Q%J,~> +i;WiTrr)j)rSjZ,A7]IfApU0&rVuorrr3&us8;fp"8HbFAas@>A7]:`@WLN/s8Do^s*t~> +huE`Us8NSg9+hgJ&eY]d&eGQb0ua%is8Mio!K%EW&./p\&J,Kd+O^;irr2otrpTl;~> +i;X)^s8N&uj_$A,r\OU2r%nFKci3tErr<#urr)j"rr<"e2=NF-2)@$F1c%JQrVm!!s8W)fs*t~> +iVs\ls8W#srT]>RB4b[bAS,Ib@:jZ8s8Dlq!rW)srVlrts0M0+!b>nQral=SjT#8YrTsQ7~> +i;X2as8N"o&J,Na%hK?P&.B0\&e>Ltrr)iqs8W)orrM[$n.5m:&.B3b&/$,7rr)isrpTl;~> +iVs>cs8N&t[5Bcu1c7*IrA4X71G^nJqu?]qr;Qlus78&91]oNj1c>7h#!prBrr;rrmf.e~> +hu=Ghs8U&LAn>OcAnPXdAn#@cB4e1Drr)j#rr;rss8Drs!qg,8nR`)?A7]=_An#Z>rVZZqqsaW9~> +iVroWrr37<&J,H`&J>Zfr=Ju>rt#8C:[\8^rX/])s8N&uqu?]pC@;`6&I]![%hK6oec,LHs8N#e +s*t~> +h>[b21,LgF2)@!CrA=O1s"k!;BCu6(rr2rsqu6`ss+0Vq!&FO2"uA(m6.u;;m/MS~> +hu=u!s.BjbL`AnZ)Cs82ipmf.e~> +i;XSks-=3/&.]<_&.oEa&/#Kf&.]<_'5[XI$NC)*rr<#qrr;u,mgom>&.o<_&eGTrdJj1Fmf.e~> +hZ!YS1c,+f'f.[(1GgpE1GgpG1c7(?s8N&urr;rnrrBe%1^#Tl2)I)f1]p%ts8MEcJ,~> +i;XDes1N)XA79"YA7]7]A7f=_B)Q6NT`=ris8N&urVuirrVccAmq)l9@;0:aA7T:jj8T&YrU9c:~> +hu<],rXg%Z&.]<`%M'']&/#Ha&e>Ka&XWOtrr;rsrr)ir"9&9!+RfpM%hTBb&e>Nd%j0@$mJh\~> +hu=MG1Gq'H1c7*I1c7'G1c$sF1G^mF1T: +hu=JQ@qB.]AnGR_@qK@cA7f7^An,FbA%_d?!<2rs"o\K#s8Qs*Adr3ZARoCaA8#LljSf,Wn,In~> +hu=KU&.]9a&eGQb%hB9a%hK6_&e>Ka&0LKBrrE&prrW3">O<"%&,m+D&e?,6s8MKeJ,~> +i;X,_=u8)n1G^jD2#]981c7*I1c$re1^$,9rr;uprrE&trr@331]TE41^Glp1c.'G1I9^]s*t~> +iVseos+4cnBP(jeAS,L`AnGRcAn5LbBOkXlp\k*lrVc`rr;Q]rQLSPe@fBsFB4POd@;'4ijmE(u~> +q>UHoqYpZss8W&irrob@&e>TcmgoMUrr2otrVZZtrVunSjq%S)+O^2f"9/?#rqHGC~> +q>UHnrVllsqYpQppAY<31c$sE2=E@,RfEBds8W)tqu6YajYR-,g].9Qrr2otrq?AB~> +q#:Hps8W&srr`6"s8N#t!<)`n#Q;q[AnYdgAFX74BX%I8!<2rs"TA?"s01a""__FWBPuo.rrDrh +s*t~> +p\tBprr<#trr3/#M#RGSrqZQtr`fpD&/"@B#SJ?\s8Duqs8N#ts8E'!_<;F:%h]Ed+O^;fs8W)t +!WW/os*t~> +q#:Hqs8W)trri?$Z^UmdrrdC"2)I,W1_)hOs8N#ts8N&urr;utc0-ta1]B336J:i-J,~> +q>UNps8;`n"37_HrV$6oP@\9:A++"1A8hAF#QF]%r;ZcrgZ`;WA7]:`@WLN/s8Dofs*t~> +q#:Hps8W)srro53Vu?Ypq#:Tu&e>Kb&.fBA&-EB]rr2lr#6"T%rr<#Wkn"14&ePZd&g5X&s8N#t +!<2`mJ,~> +o`"pjrr3&-1UQfS"uA+o1GgpEn2(/'bkV2?rr<#\kqiW&1G^jE1IBjprr`9#s8MfnJ,~> +q#:BmrVlg$rVuo:B#XcBrs!(GA7K.^Aaj:6B\`RbrVllqrVloslKMm^A7f?NAd*59s8W&ro`'F~> +q#:?nqu6bo&/2kYrrE&ors-RS&.]Ec&/"FD"V202s8W)srrE&trrN-!kn".3&.B3b&/$,7rr)is +rqHGC~> +nc&a!1c*GVpAY6=1Ggoe1]TE'2#fE9VZ6\qrr2otrr2ourr;4>"#Dbj2?#E:6.u;;s8Drjs*t~> +p&>9qs8W&9An9TorrE#nrs-naA7K7_AnCID"Cf"CrVlfr!WE#srrN&tl"167A7]=_An#Z>rVZZq +qtU2A~> +p\tR!s8N&uUCn+M`W#l;rqZQt_@R4h&.e1?!=t%drrE&rs8W)us6($o&I]![%hK6oec,LHs8N#m +s*t~> +q#:?nrr<#t#IH +q>Up&s8W&tr;XiKAnBWprV- +oD])m&.f<_`;fi8q#:>Mr=8r@%heCD"qM8]s8N&tqYpTqs6("&&J,N_&J>Wd+4:)frq?AB~> +q>V!)s8N&trj4O=1c3DUs8N#nrrJQEr\Xa61GePX$8XMgrr;rss8N&srVllrkVNDu2)R3Gr\O^C +gAh0Fs*t~> +p&>9ps2SS_@q=?errKE8ral1AA+4(7@q;53s8MuprrE#ss6+&$@ps(_ARo=`Dr^is!<)ZlJ,~> +q#:?nrr38#$kNs_&'"YHp\t>]&.f?=&.B-^H2mmDs8N&ss8N#ss6("%%hTBb&e>Nd%j0@$p&BO~> +p&>9rZnsTs1GmDMrrAt^1]oTlN;i_Srr2oskVNW(1GUdC1GgmF6.u8;!<2cnJ,~> +p\t[#s8U,PAn#@\g].9Oq#:H.A7fEPAFO1AB4S%Bs82ips8N&trr)lsk[k95@qB1_ARoIbDrgls +rV->B~> +p&>Ao&.fKc%M6SYs8Mfn#K%)c&.]<_&+:&1M>mGQ"9/?#rr2rZ&H<:?&-W[W+OgAip]#a~> +p&>?*2)I*F1c3GVrqHEmc2KO%1GgmFmkb'5rr2p'rr<#ts8W&ts62??2?#E<1Gq!G2)@$Sg%GAq~> +pAYO!aC8alARf?*rVuikrs.4hA7T7`ARt:B!bAV9qu6its8W)ss64+q@fBsFB4POd@;'4ijn8Y(~> +!<2ip$iL&)U_"%J&.]Bb`:a-7isu\3&eGQJ&.]9`%h]Ba&J,KaW;lkss8Miort,2B#8.RZ%hK +!<)lr!<2ut!ri5+rA4U61c3MNrr_C>1c+e]$8XOq1c%$G1c."po`+qJ!AuY31]oTl1Getds"aa7 +1c.#Z1^-2"s8N&trr2utrr7K~> +"TSH#s8Dip$H?UiA7T:_B%m:`p\tKa@qK4]A7] +s8N6#rr<#trr2tqrX])C&,m+CRf9FFf&.T6`%hK9_&J#NL&.&j[&/$,6s8;osrr*!!rr7K~> +"TSK$s8N#t#6+Y/1c7-HrA4MPrr2utq#:Il2)I-FpG<:91G^jE1Gq!G2<=f9o`"pjrr3T$bGTJL +1Gh!H1c7'G1c%!F1\`d,1]B336J;,5J,~> +!r`/squ7$#`b&XgAnYdgA@hd?!<2cn!-S9Q!bGnRq.:%JARK+\ARo=\AF9Ero`#X)rVcclfX[Ai +B4PRbA8,OeA7]CbpgskDARoC^Eo[3"rVcWnJ,~> +"TSH#s8Mus%AjXI%M0-`&.T7srVullrr`7J%MA@F#nIU]%hB6a&.Ul&s8W)drset9Bcdm!%h]Hb +'+bZaq%*lD&ePZd&g5X&s8N#t!ri6"J,~> +r;Qcrrr3#*2?#H41]K972N@b:rqHEoNANNc2#fB32#fE91Ggplrp0Rnrr9ca5Vt8S1H%$H1c>%b +#;n:n1c.!Tg\q-Trr<#ts*t~> +!rr2srr3T/s8U)NA7]@aAnGUcW;chrrV?HrrMsLBB_H$KARK.aA7]7a@tOa\rVuorq>UHnq>UTq +s3.*PrFZ%=s(27>q.9\=An1gP"`i](s8Doos*t~> +!WW/rrsPV8&.TgrrW3"s*t~> +q>UW)1GgpE2#]<21]V1frrE&nrr_C?0fAMYs"ad81c2T=oD\girVllsrr3<(s8V_[68UGR2#]92 +2>K'21GgpGr\OgFg&M'OrVlfrJ,~> +rVmE,s8W&;An5IbB4k^dARpc!rrDulrrVV&A,^$6Adi3^BObUcAn5Sqs8MuirrrE%s8Doorr!<* +s8D_uDId +s8Ni5s8N&uUCn1L&ebig%hT<`&cVh1rqHEqC(Cjd&blnF%hK6^&.fH_63$r`rr2utp&>-nrVlfq +rrE&trs81P&J#E_&.fNM&H<=O$53p]%j9F%r;Zfrrr7K~> +!WW/us8W&u[/Mlh1GgmE2)@*I1]ICJrs&K&IPir<2Y]*91GgsF2)I-K=o\KarrrE%o9hKorA4L1 +pbVt+r\Xm91c.MOs8MrrJ,~> +'`J(3rVufqaCJ^jAnPUaA7K4\A,c0$#5t0+An,=aq.:%HA7T7\An5G%s8N&snc&Ugrr<#srVm,t +Z=@K[@q9-EAdi6b?tEn]BPuo2qu?Wos*t~> +qu6u!&.]<`'+k`a&cN=E&%MZ=rqHErn1G4_%MJOJ$4d^]&.]BbdJs7Go`"pjp\t6mrr33%dQS0S% +hJCG$kX$_$kX*`&0K=!s8N#tJ,~> +(B4@5s8N#)2)I0I1c%!I1GgpG1r0.jq#:Qts7B#C2)G"a%Q6+#1GgmD1u&'1rr<#sp\t6mqu6Zq +rr2utrVm&S>W">q2>8p11Gq$H1B'*46/)A +rVmN.s2SS^@V07_A7T1^An#GurVlNj"nd.OBkLuPB)ZBAAdDs[AEEdgs8DojrrN)trVuorrVm3' +s8W&tj+:lRAG0UA@ps(_ARo=`Dr^is!r`0!J,~> +!WW/urstq7&.fHb%hT6`&.fHc&8:b:#6+YP*tK"tq%*fD%hTn,ECerVuosq#:J3&/#N_ +p^dfD&J5Qe%hK?a+4^Ahs*t~> +rVlot[/Mo]1BKEl1]9-22LkB!!rgq>p,!+42)7$G1GcB:s8N#t!<2Zkr;QZp"9/8urr2p!Il&tT +1^Z)r1,LdC1c%!Tg&D!Prr7K~> +s8Nc2s8U,PAn5LbB4YUcA7f@aB:o.prrh:t@:s-HAdW$YAS,IbBu^)Nr:L$hr;lrtq#:Qts8W&r +s.94%!+kq;%q9$[A7fC`BOl&BrVuirs*t~> +rVmM*&.fKd%h]B`&J,Qd&e>Konc&=`"oeQ$s3i(^&-NUS&>oI+rr`9#s8Mcm!<2utrr2iq$NC#( +s8N&uV@sIQoaq-6rX];I%j9@$rr<"K~> +rVmP<2)I*G1c$pF1GgmE1c7'Vo)AXarrrE%s8CY;o/$V01pd5^rpp'hrql]qrq??nZSOK61]TE4 +1^Glp1c.'G1I9^ms*t~> +rr3Z1aC8alA8#XdA7K.^BOkXbDtNu&rrE&trr_>"An:[K!G#mCA,sXJrr`6"s8)Ki!<2Zk$3'i% +rVuo;@V00HAcQ<>AdE$[A8#CbAT$W.s*t~> +"oeQ%U_4=7&-WRX%hK8Kq>UNqs8Mus'&QFn&J,E_&/#Kb%hfHa0uX+kp](9mp](3krVuosrr3*" +rGN58&-NLV&g,U%s*t~> +"onT$ZnsT51^l5s2)I.rs8W)ss8W)ts8W)urt57mAi;D$1c7*G1GgsF1GhhLp\t6mo`"pjrr3*" +s8W)trrrE%s8II'mkb/)0f22Mrr7K~> +#6"T%`+3Ijpgs\=BP(dg`;KW8rVca3rr;rss6bhVAS,F_A7fCbAn5CcFkclgs8W&trrE#rrr`6" +s8Mrr!<)fp"9&7lAaa46A7o@ijSo10~> +s8N8!&J>Wd&,-V;&eGR,rr<#ts8N)urr3#trr2p/r2;1\&.f?`&.]Ba+,97arp0Rarr2otrqHEp +V[j=Ln.>U1rt#8SeGoQ!~> +s8E)*2)Fh\$8jV5rr;utrr<#rrVm*$s8W)uZVCEU$8XLq2)@*URe6XZp&G$jqYpQprr<#tr;Qcr +rr3),1GgoW2#fH51]p%us8RT~> +s8N8AB4b[dB_Q*GA7B+ns8Dutr;Z`ortYJ3rVuora`_*)BOt^bAnY^mZhOFtnc/Xfr;RB-s8Drs +rVuorrVucprQ/P_Aas@ +"okG/%M0*D&H<7F&e>NbV#UGnrrE&trr`9#s8Mus$NAJ1>Y@a`9Sp4WrVllrq>UHorr;rrq>^Hn +s8W,urVm"u&eGQdnIPs=%h93`$R!jsJ,~> +#QM+f1GgsG2>K*/2?,K41^^Shs8Musrr2lrrr)lsrrUH%m5,)) +2)I*G2F6*tJ,~> +#Q;PPB4PUb@ejX9A-QXWA8''_qu6Tqrr2p#rr)lsrVlg-rSt2KN/`dWYKm1Hs8Duso`+si!WW,n +rrE&orrgAOA8,NCAdE'\AS,OaDWLhJ~> +#GVh?&ePZd')<(D%hK?b&.]rRrVmE-s8W)ts8W)us8N&urr;uss8W)srrE&mrrN)tq#C?mqYpp% +s8W)uU^n"L&/+FC"qhFY&/$,7J,~> +!4;_^!&aF+!&aa4!]*17qu6cts8W)prri?$rr2lprr`9#s8MNf#6+T#s8N&trVm<*s8W)urr<#) +2)I*Hn2(D.1c.!E1c.JOJ,~> +#KC:c@V94bAGKgDBOYF_An>oWs82Wl!<)lr!<)iq!<2ors8;rsp\t9nrVQTurr<#ts8Mus"8r3! +rr)j#aCJmp@V#"@#\%=T@q0+]DrQ9~> +"qhFZ'+kifp^d`B&J#Hc&.WOVrqucrrr)isrqud*rr;uts8N&urqucqrr2Qiqu6Nn!<2ip#6(G3 +&J,H`n.5j9&.]Be%h94)J,~> +"Z/"k2)@&_1^c)s1GppG14T<'s8Dor!<2ip!<2ut#6+Z&rr<#trr2utmf*:dq>UHor;Qr+1c7*I +2=<:*2)@'F1c.pW~> +#@qCZARf=cAGKgDAS5LcAS5PEs8Drs!<)lr!<)os%fQG-rVHKls8W)uqu6WooD]-qqu?]ns8W)u +rVc`urVuorrVlr:A82$R!,1n7#\[g\AnbmfA9i\~> +#,De@&.oE`p^d]D&.]9a&.fM^rVllsrr3?)s8W)us8Drsrr2iqs8M-["9/?#rr2rtrWf51&.oK`% +hJ1A!>,nB%g*@U+4>Z~> +#.$-D1c7-HoeZn01c7*G_>aH5rsJc*s8N&urr;utrqcX!rr)lsrr)ikrrE&qrsA])s8N#rrr;us +r;R*&s0FO>1,UpF2=WL/2)@-J1GgmPgOK~> +#KC:dAn>LaAGKgK@V0:b@U`kYdJs7Ds8DutrVlg"rr<#trq69mrr;rks8W&trsAZ(rVccrrr<#r +rVm9(s8N&NCAdE$`@:EeYBPum]~> +#QL_6%M06`&blnL%hK6_&e5Boe,TIIrr<#srr2os!<2lq!ri6!r;Qits8Mfn!WN&srtkU^Q\A4- +G)=0:rr<#ts8W(r&eGQc%h\7Arso;I&e>Tpdf4g~> +"95\a1]B321AE[81GgmE1c$sSh#IEQs8Moq!<2ip!WN,urqucrrq6:#rVuoOVO;(/O."5ls8N#t +$N:"11c.'I1Gq!HnMC5'r\F[71I9dqJ,~> +#Q)JNB4b[fAb]jR@qK4]A7oIkj8])Xs8;ors8W&rs8DurrVlrurVlcq"9&8srqZR(rVufqs8DuY +]sNWSXg$LWrs\l+rr'iGAn5OcB4PKAAdDpWAnGLcDW:\H~> +#QOau&eGQd&,6\G%h]Ea%h]Ba/b&f>s8N#qrrE&orri?$s8DrhrrE&trr`1r0b=0nrt5e`H11e3 +s8T#/&.T3_&.\.?r=9#B+OpDjJ,~> +!ri5,r\OX32>B!02)@)g1CQ,t9_88`rVuoss8W)trrE&qrrE&rrrE&irri?$ZV37Q1^QI.p&G$k +rj+F +#QOeAA7f7^AGKg;AH$0J@qB7_A:"%NrVlcdrrrE%s8Muqo`"pirr32@G@kGtAn_0S&8nK=s8W&t +`F`^pARf=\An^^H#\@OWBOl&Arr7K~> +rr2tnrXT8G&ePWc&e>KcpCIHlnGiOfrVuos!WW/urrE&srrE&orrE&rrrE&srrg7n%hKBK&-X&@ +rr/`)n.6$A&.f<^&.fHc&/#Krdf08s~> +s8NN,ZnjQq1c.'G1c.'Ip+uePo`"jjrql]qrr2otrq-3orr;uts8N#t"TJGH9JuN#"[T'ds0OTK +1]TE11^,a%g]%6QJ,~> +rr3DH@qK:aA7]=aA7T:_q.9b?BRojSrVllrrVm#urVuoso`"php\tBMFCo&opgs_J]`8#PARt=C +s'u7G@q91`rF>tADrgotJ,~> +rr30$V%F@O%fR%B&/#Nbq%*]?&/.+arqcWprr2rtrW3&upAY[%s8W)urr2rtrhg>>&eGKI&H<@H +&8[RA&ea[F$kEp]&eGNa&/,Noe,K@HJ,~> +&-)Y/rj=L<1GgjE1,^pF2>K'31GgsmkP>,Xrr2p"rr<#tp&>*ms8Moq!O=TU2#f?51k2J'1[m4% +1H"tb!^YW@rr7K~> +!<)os!l\_`qdoJ5"_D:WKC/^ +s8N#t$E"IH&e5E_&eGTbq%*]B%h'$l`;T]9rosI_rW)orrs#A2&J,H`'DW1E%M0-^&.oHan.6!?% +hfKd'Ftfd*S(/grr7K~> +r;R,21,UjE1GpsF1c>%b"Z&"n5L09-rrE&trrE&qrrE&lrrE&qrs&J.2DR*G1\W^12)@'G2Dd;\ +1^c/s1Gq$H2)I-Ug&CsMJ,~> +rr39&s2S\_An>Oaral.@q.9e@B4GLjf_tgPrr;rqlMh4jqu?]7B4Yai@qYUL#A%@UA7f=`AFX7C +BP1mc@V97_A7KW?rr<#ss*t~> +!<<#s!WT"q%fm4RrX]&Bq%*Q>&H3:C&V]lW!r`/up&>$krVll,rX]/F&.T?K&-WXV&eGTemgp$? +&/#Td%hK?a*S(2irVlisJ,~> +rVm6's0XX>2)I0I1cG+c%5Tgt1G^nXs8W&ss8W)qrrW0!rp]pm^bdl*1GgpCq(r.11Ge8P#;\1o +2)I0Vg&:pOrr7K~> +qu6uA@q]IdAS,OcAGKgIBOkXcAnSFJs8N&ss8W&orrE&hrsAZ(d:QouA7T+]q.9\@@qP^Nmq*,@ +An#@cA7B(]F5m/srr)lsJ,~> +s8NN,s8N&uUCn.M&ePWdpCR?8$kNp\'0aD7s8Drsrqu6b%K$/)s8;@.&.]<`&J,KK&-igY%hTEb +&/"FD$4da\%hB6b%3a4"qu;0~> +!<<&ts8NB'ZnsQq1,UpEpb`".$o9^r1c&=\s8W)us8MBbs8E*"oKrL5!AcY/1^>fn2)7!G2DXeZ% +5ft"1c7-H2*fsrs8W)ts*t~> +%fQG*s8W&t`aW@i@qB1^pgskBAn,@]AnHYHs8Drs"TJB"rVc +rr<#trr35#&eGQb%hT?J&.9!]&eGQb&.T7diVriV!ri6!rVuosp\t6mrVm+Z%h]Bb&.]9E&-NUV% +MKB@&.9'\&/#Krdf07Es8N#tJ,~> +s8W,urr3#uZi)]^1H%&b1^l5t1GgsG1c$t;kl:\^rW3&ur;Qcrq#:Qts8Durs-s!E!&aF+#;n=o +2)@*G2=EC%2?,K<1I0^os8W)trr7K~> +s8;uur;HX#`+3InAn>I`pgsM>rau1@"D;D?mf!.b"T8 +"onN#s8N#srs#;4&J#?`&butH&eP]g%hK?b%hB:JVuH\tr;Q]prrE&lrrrE%r;Za=rY#2@!###; +"VM=W&J#NC&-`UY&/#Kqdf07HrqueH~> +rr3E+s8W&trj=O<2)I'Gq(rR;1,UmG2)@*H2)JpOs8N#t!<2ut!<2]ls8E?)rr,2?1GgmD2>/m, +1BKBj1[Hq%2)@$Sg&CgIJ,~> +s8N)trr33%s8U&M@:oLMph'P;$"RXWAn#1\A;nG(rri?"s8W)nrrE#prs3LQAn5C]An5HJAd2dX +@qKFbAFF.1AHZIUAT$K+rrrB$rVQWpJ,~> +!<2rs$NC)*rr8i.%h]?bq%+,K&.]9a&.f<_&/#Nb&6bLBr:0derr2p%[1Ei[&eGWR')3"<')`@A +'(?G:&eGQd%3X*prrN&tJ,~> +q#:KrZSXKppG<(31c%!G1H#.g!&OU2!d(9_o)Jah#ljo(s1pNL1c,+f!&O@+!&Njr">r"n5hZ,9 +!<2orJ,~> +s8W,ts8N)trr3/?@VB@bAGBa@A7oF`BjtTNAcudXQ+bW8rs&B#rVt8WAGp*AA7fBGAcuXVAn5TF +B)Q6AAoHZ-rrE#ps*t~> +pAY,frXT8G&ePWc&e>Kcn.5g;+A,:$9hoF!rrW3"rVlftGS8sH%2'3`%M'*^&eGTe%j9 +p\t[$ZnjQq1c.'G1c.'ImPFo0rFZ1FJH#HGs8E3%rr<"X1Yjkf2>]342*fpqp]#a~> +pAYQ@@qK:aA7]=aA7T:_nR_l:A8[J-N!,-4s8W&prrE&trrB"UB)cBEBObRbB)Q6AAoHc(s*t~> +pAY +q#:j's8KD]1c$sD2)7'G1c=bZ$8XLr1c%!HBE/#2r;QcqrVlk1h_Y?i2>K'16/;J5s*t~> +q>UHnrr3&=AS:mOmUci;@q9.]@qTD2s8W#qrrN)trVlkSi+L`C1D>Fr:^/@~> +q>^Korr3>'&J#Ka%hB9a&.e4@!>,kA&-EG9rr2fprr2rt!(buY$kX!`&.oTe&e5r4rr2WkJ,~> +o`#9*1,UjE1GpsF1c=_Y!Au\41^#[Ks8W)rrrrE%rr;q1h_Y]u1G^mG1c7*H6.u81s*t~> +pAYEss2S\_An>Oaral.@nR`,=AnP[eAn5G4s8Dlq#6"Q$rr;tXi+ +q#CKa&e?#5s8W&sp]#a~> +p&>Bts0XX>2)I0I1cFh[#rOLp2)I*G1hZg_rri?$s(F4F1^>fn2)R3J6.u5:!<2cnJ,~> +oD]-9@q]IdAS,OcAFX7=ARf:aAnGRaNrK"RrrrE%s8@gdiFWR0An#@cA7B(]F5m/srr)TkJ,~> +p\t[$s8N&uUCn.M&ePWdn.5j9&.f?`%hK:Hrr2utr;Qcrrr2smi"-5+&eGQa&J>Nre,Jt=J,~> +q#C?ms8NB'ZnsQq1,UpEn2(G-1c.!F1Ggq$rr)isrr)j!rr<"2i%tm#1c7*I2)@*Th#@?Rrq?AB~> +q>Us's8;osrVslH@;'.^A7b7B#\.CWAS,LcAr?B`"TAB#rJ]ZHs'uFFBOkgjAoH`/rUg,?~> +pAb0lrr35#&eGQb%hT?B&-rm\'+b`d&.hM6rrE&qrri?$r_3p\&.9'\&/#Krdf07Es8M`lJ,~> +p](9mrr3#uZi)]^1H%&Z1^Z#o2)I0H1c/kErr2p"rr<#srr3'!B/SR's#'g5#;\X"rr<#trq?AB~> +q>^Kn!WW)rrs-JQAnYdf@qG.As()@EARf7]N; +q#:Kps8W)trr32!&ePWa&J=OE!"]&?!"]&?!&"9N!ri6!rVuos!WRr4&-`UY&/#Kqdf07Hrq-5@~> +pAYR#s8W&trj=O<2)I'GnMC5'r\OU2r\OUMrVm3'r;Zfrrr;utS)#n)2)@$Sg&COAJ,~> +p\t6lrr33%s8U&M@:oLMm:H?0ral.Sr;Qcqrr30"s8N&*ADh)"AHZIUAT$K+rr`6"rVQ?hJ,~> +q>UHorVm6(s8W)uV@jCP%MJ";#SR(8s8N&urr2iq!RVP=&-`aY%h] +nG`XjZSXKpju!&:s8Mlp!8?9d">r"n5hZ,9!<2WjJ,~> +p](9ls8N)trr3/?@VB@bAFX73AGg'=A-)`/q>UTrs8V+iiF`%!!bQB0rr2usoDa=~> +mf*9^rXT8G&ePWc&e>KcnIPd5df04Bs""*Krr;sL%hK6_&.]9a%hK?c&.f?b&/#B_%hKBb&eGTa% +hK9b&.fHb+O]]XJ,~> +n,EgqZnjQq1c.'G1c.'In2(/%g]%3QrVZ]qrr]342*fpqn,In~> +mf*^8@qK:aA7]=aA7T:_nR_r9jT#5Xrr2pDrVuosrVq%PA7T.]BOkXcAn5C^An>L`BOt^dA7T1\ +A8#I`AnM!P!bQB3mf.e~> +mf*IiV%F@O%fR%B&/#Nbn.5nmrr<#ts8N&urr)j%V\0LO&ePZfrX^"Z&.f<`&.] +nGa!ts8KD]1c$sD2)7'G1c=e[!B$bPrt#,/rVuirs8KA]1GgpD2DY7g!&OU2$oKk!1bpjD2)@'G +1H"tb!^YW@mf.e~> +nc&Ufrr3&=AS:mOmUci9]Dqj0s8Drqrr;usrs-SV@qK7aB4LpQ)eEVnAS#C_AnY[bAn>XdAS5Uc +An>L`C1D>Fr9jT8~> +nc/Xgrr3>'&J#Ka%hB9a&.e7A#[@?/rr2rss8W)ts8OGF8eM[G&/5Wf&eGTb&.oEa%h]Ba&eblg +&.oEd&.oTe&e5r4rr2?cJ,~> +m/IF"1,UjE1GpsF1c=bZ"*OSBrr)j7rr;uss8N"21c.'I1GpsE1c.'H2)@'F1H#.g%Pot!2)@$G +2)I0I1dTgomJh\~> +mf*Rks2S\_An>Oaral.@nR_l6R/[!]rt,)-s8N#ts8ImdAnGI\A7fHQA/f,nAS>ReA7f@bAn5Rf +AR]+]ARo=]ETI-!s8DHeJ,~> +nGiId!WT"q%fm4RrX]&Bn.5mIs8N&ts8N&urVlg&rr:t!%M9 +mJdOls0XX>2)I0I1cFeZ"[N+es8W)rrsA])rr;(F1c7'HrA4U61bpia2#fE51]0'71GgsH1c7SP +rVllsnGe"~> +li.:1@q]IdAS,OcAFX74A8V>G"o\K$rVulrs![mFltp6FBOk[dAn5@]AS#CaA7T@_Bk:gc@qK1^ +BOkR_Aolu1rVlcas*t~> +n,Egqs8N&uUCn.M&ePWdmgoR2[/^.%s!IaFs8N&I+V,1r&J,H`&IoEb&.]?b&.gE)&.]9a&.]9` +&e-#5rp0T7~> +nGiLes8NB'ZnsQq1,UpEmPFs[rr)isrVlisrr2oug-P]o!Au_52&\5+1c.'F2)I-`1c.!G1c7*I +2)@*Th#@?RrpKf:~> +nc'*ts8;osrVslH@;'.^A7b7B#\7Mns8Durs8N#t!<2rs$fZ8>BOtacAnG[dB)Z?@B+\`dH=UW! +A7T._A8,^hDr^iqm/MS~> +mf3=drr35#&eGQb%hT?B&-NLU9E5"frrE&trs8Q%dk)+A&.fBN&.&gX%hK9^VXH\ZrX]GL%hK?a ++O^8grVulbs*t~> +n,NFerr3#uZi)]^1H%&Z1]oNkBE%o1"9/?#rr2p)rr<#tgeB[a1c%#e1^Grq2Dd7soNF'M2#fH5 +1^>g%g]%6Qrr2?cJ,~> +nc/Xf!WW)rrs-JQAnYdf@qG1B"(c,(qtg +nG`Xhs8W)trr32!&ePWa&J=FB!8mVP!<)iq*WGPP&e>Td&J,Nb%h]Ng9@Nq@nNRWt%MTHe%j07! +rrE&bs*t~> +mf*^ps8W&trj=O<2)I'GmPFq+qu6Zqrr33%s8N&uoSic*%l?-u2Dm +n,ECdrr33%s8U&M@:oLMnR_r +nc&UgrVm6(s8W)uV@jCP%MJ7B#7hA]s8N&trr)j!rr;usrVm&\H7TU<')iCC,A+mns8W'(ni[Ts% +h] +kl1ebZSXKpmPG&&1k,K(p&>6qs8V8B9fDu,&i;@/J^4;qrr<#i=u8&n1c7POrVllsm/MS~> +n,NFds8N)trr3/?@VB@bAFX7 +k5PFVrXT8G&ePWc&e>Kcp^dQ=&/2q[rr2utrVllqq#:WY`l,g5e,01Err3<(s8MUR&.f +kPktiZnjQq1c.'G1c.'IpG<"11c +k5Pk0@qK:aA7]=aA7T:_q.9eD@V03(rqufrrVultqt^6tmap1HfAQ]-rr2p(rr;uhJn/J+DrTpZ +J,~> +k5PVaV%F@O%fR%B&/#Nbp^dWB&.^r's8N#t"TJH$rr2Zl!<2Zk#la +kl2.ls8KD]1c$sD2)7'G1c=t`!AdpXrrrE%rr<#tpAY-lrr<#tqYp`uo3*t:g?&?b~> +l2Lb^rr3&=AS:mOp1F;7!bHu^r;QlurVuljrrE&krs/PuIqETZs8D-\J,~> +l2Ue_rr3>'&J#Ka%hB9a&.eRJrXT&B&;C,`s8Mus!<)`n!<2ors8Mrr!<2ut!q9IBjSs`~> +jSoRo1,UjE1GpsF1c>(cs"j[4">lPHrr2osrr2Qi!<2fo!<2ut"8$`hroO01~> +k5P_cs2S\_An>Oaral.@q.BY<%:j*^Z2O_#s8Dutr;Z]grrN)rq>UHorr3/rPiVlErTF32~> +kl:V\!WT"q%fm4RrX]&Bq%*uG&IoEa&CgaZs8W&srUg*mrr;urrqcZprqucrroa<3~> +jo5\ds0XX>2)I0I1cG+c#r=Fq1G^rAs8W)srrE&krrW3"rqQKsrr<#ts8M-[J,~> +j8TG)@q]IdAS,OcAGKj;AHZLVAS'j!rr`,tr;?0d!ri,rqYp`us8W&tqW7a-~> +kPktis8N&uUCn.M&ePWdp^doJ%hK +kl:Y]s8NB'ZnsQq1,UpEpbW742)I0H1dU7&o)AairVZZqrqZTorr)isroa<3~> +l2M7ls8;osrVslH@;'.^A7bLI%:j'^AmoWGs8W&tr;ZcjrrE&irrW0!rT!p.~> +k5YJ\rr35#&eGQb%hT?I&-igZ%h90a54JLMs8Mio!ri6!r;Qits8Moqs8N&u!<2-\J,~> +kPtS]rr3#uZi)]^1H%&a1^l/t1GgsF>4hjorr;rkrrW3"rquctrr;uqrrE&trrE&[s*t~> +l2Ue^!WW)rrs-JQAnYdf@qGCH#%D.RBkDqfrr3&urr)Wl!ri6!r;Qits8Mcm!r`/tkl6/~> +kl1e`s8W)trr32!&ePWa&J=gM%2'0_%hK6a%m9F_rr;ugrrE&lrrE&ss8W)^s*t~> +k5Pkhs8W&trj=O<2)I'GpbW@71c$sG1GrA-s8W)grrE&lrs&K&rVuirrojB4~> +kPkP\rr33%s8U&M@:oLMq.:.HB4b^eA8#M(p](3ls8DogrrW2urV$6orr)lsr9402~> +l2Lb_rVm6(s8W)uV@jCP%MJOJ$Om[Z%hB3a&2)B1rUU!grr)isrr)isrr)lsroX62~> +i;WrZZSXKpp+ue-1A`m2:>5aIrpB^crr)j!rr<#rj8XW~> +kPtS\s8N)trr3/?@VB@bAG9[BAS,@ZAn5Ltj8J +hZ!SNrXT8G&ePWc&e>KcpCIHMZiC()rVuosq#:?nfDg@~> +hu=,aZnjQq1c.'G1c.'Ip,!"?_#OH6s8N#nrrrE%rr;usf`-I~> +hZ"#(@qK:aA7]=aA7T:_pgs\CDUA@^r;Q^&rVuorrVuors8CIIJ,~> +hZ!cYV%F@O%fR%B&/#Nbp^dQ=&eA7 +i;X;ds8KD]1c$sD2)7'G1c>(c"Z8+n208 +iVroVrr3&=AS:mOp1=Y@BOYS;pAb*is8Mrr#6"T%rr)lrfDg@~> +iW&rWrr3>'&J#Ka%hB9a&.eRJ#n@RX&e?%Ms8W&ls8W'!s8L[NJ,~> +h#@_g1,UjE1GpsF1c=q_!]UHnr;Qits8L[NJ,~> +hZ!l[s2S\_An>Oaral.@q.:FQA7]4^E4u5Mr;Zfqs8W)ss8W&rs8DlJs*t~> +i;`cT!WT"q%fm4RrX]&Bp^e&J&/#Qc&ho^@s8W)ts8N#ts8Drs!<1XNJ,~> +h>[i\s0XX>2)I0I1cG+c!&aa4s"ag89rIU^rr)lsrWN9#s8W)Ms*t~> +g]%T!@q]IdAS,OcAGKgE@V'.^@qB1r](c1"rrE#Hs*t~> +hu=,as8N&uUCn.M&ePWdp^dE +i;`fUs8NB'ZnsQq1,UpEpbWR=1c.*K1c7'G6@ZfAs8W)urr)isrn%1#~> +iVsDds8;osrVslH@;'.^A7bLI'4b]fB4PI]A8e'`p](3ls8MusrRLpu~> +hZ*WTrr35#&eGQb%hT?J&/Pig&eGTd&.f?_&.]=8GDO5W`5KR4Q^6;(J,~> +huE`Urr3#uZi)]^1H%&b1`&#+1GgpG1c.'G1c7*oO.+> +iW&rV!WW)rrs-JQAnYdf@qGFI!,2@D&nP`iAn>LbAq?qeg=k63gXj$Lf`-I~> +i;WrXs8W)trr32!&ePWa&J=gM(D78i&J>Qb&J#Ba&.oEa&.]6^&eGQqe(F\N~> +hZ"#`s8W&trj=O<2)I'GpGDn-$o9^s1GgmD1c7'G1c,(e!]<9tf`-I~> +hu<]Trr33%s8U&M@:oLMq.BY;'k1`dARo:a@q0+`AS,OcAS,IbA8gP]s*t~> +iVroWrVm6(s8W)uV@jCP%MJFG$P +f`)*RZSXKpo/$Y,1c7-H1c>7hs"jX2"#Dc!g=Q@T~> +huE`Ts8N)trr3/?@VB@bAGKgBBOkXcAS,I`rFZ(?!b5ePral4CDrTCKJ,~> +f)G`FrXT8G&ePWc&e>Kcq%*uJ&.f<^&.fHc&/#KrdanGK~> +fDc9YZnjQq1c.'G1c.'IoJ?P*q_SC45hl:is*t~> +f)H/u@qK:aA7]=aA7T:_q.BY;"DD:UAnM!P!bQB3f)L7~> +f)GpQV%F@O%fR%B&/#Nbp^diE&J,Qd%M00b%NX$tf)L7~> +f`)H\s8KD]1c$sD2)7'G1c>%b!AcV/1]fturmq+"~> +g&D'Nrr3&=AS:mOp1=bEAS5UcAn>L`C1D>Fr7:mu~> +g&M*Orr3>'&J#Ka%hB9a&.eOI$kX!`&.oTe&e5r4rr1LKJ,~> +eGfl_1,UjE1GpsF1c>%b$T0^r2)R3J1c.MOrmh%!~> +f)H$Ss2S\_An>Oaral.@q.:.NB4YO]B4YUa@r^T/s8W&Ms*t~> +f`1pL!WT"q%fm4RrX]&Bq%+#G&/#Td%hK?a*S(2irVkFKJ,~> +ec-!Ts0XX>2)I0I1cG"`#;\1o2)I0Vg&:pNrn.7$~> +e,K`n@q]IdAS,OcAGKgI@qK1^BOkR_Aolu1rVlcIs*t~> +fDc9Ys8N&uUCn.M&ePWdp^dcC&eGQa&J>Nre,IhrJ,~> +f`1sMs8NB'ZnsQq1,UpEpbWF;1c7*I2)@*Th#@?Rrmq+"~> +g&DQ\s8;osrVslH@;'.^A7bOJs'uFFBOkgjAoH`/rRCjt~> +f)PdLrr35#&eGQb%hT?H&.9'\&/#Krdf07Es8LULJ,~> +fDkmMrr3#uZi)]^1H%&`2#fH51^>g%g]%6Qrr1LKJ,~> +g&M*N!WW)rrs-JQAnYdf@qGCH$tj*a@V'K;r;Zcrrr(IKJ,~> +f`)*Ps8W)trr32!&ePWa&J=dL"qD=Y&e?)4rr2uteGk%~> +f)H0Xs8W&trj=O<2)I'Gp+uq11G_>MrmCar~> +fDbjLrr33%s8U&M@:oLMph'P;"Cc%UDW1Tp"9&8uqq(ju~> +g&D'OrVm6(s8W)uV@jCP%MJRK"qhIX&e,u3q>UHmf`-I~> +d/O7JZSXKpoeZe/1c7POrVllseGk%~> +fDkmLs8N)trr3/?@VB@bAGKj9A--@]iVriWrR:ds~> +cMmm>rXT5F'+bZd&e>NP&-EOU+O\R8J,~> +ci4IRZnjQq1c%!H1G^mF2?#E72*fpqci8L~> +cMn +cMn4MV%F@O&.]9_&,d%B'+Q&3rm(Oo~> +d/OORs8KD]1c$sG1GgsIr%nI@h#>V!J,~> +dJj4Frr3;DAS5RbAn>XfBDuEEC1D>Fr6G=m~> +dJs7Grr3P-&J#?a&J,Hb%hK?`*S(/gcMrC~> +bl8!V1,UmE2)I0G2?#E66.u7^s*t~> +cMnUWs2S\_@q]FaAn>LbA7KW?rr<#sd/SU~> +d/X(D"TP;/&eP$Q#nR^]%is4#s8DrCs*t~> +c2S:Ps0XX>1c%!G2Dd0H6.u5:!<1@FJ,~> +bPr-m@q'%]Amf7^AS-#CrVc`oci8L~> +ci4RUs8N&uUCn(M%hK?a%jBF$bQ!(~> +d/X+Es8NW.ZnsWs1H%'G2*fsrs8W)Ds*t~> +dJjmYs8;osrVslJAn5CaA7]:ij8T#$s*t~> +cN!qDrr3G'&.oQd%hKi2rr2lrrm(Oo~> +ci=%Err3K-ZSjQr1Gq!Ug]%6Qrr14CJ,~> +dJs7F!WW)rrsm%]B4Y^fA8L9's8N&trQkLo~> +d/O7Hs8W)trr32#%h]Bd*7Ooe!<14BJ,~> +cMn@Qs8W&ts0=L=1GqJRrlP1j~> +ci4"Drr3<(s8BlJA7]=ijo58^rVuinci8L~> +dJj4GrVm3's8W)uV%4.[e+s"Dr6YIo~> +aSuJDZnsX*g]%3P!<14BJ,~> +ci=%Ds8N)trr3,A@:a< +`r?+;+O\:0J,~> +`r?+H5hj +`r?+YDreq +%%EndData +showpage +%%Trailer +end +%%EOF
doc/figs/logo.eps Property changes : Added: svn:executable Index: doc/figs/fancy_headsep.svg =================================================================== --- doc/figs/fancy_headsep.svg (nonexistent) +++ doc/figs/fancy_headsep.svg (revision 2) @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + +
doc/figs/fancy_headsep.svg Property changes : Added: svn:executable Index: doc/figs/encrypt_FSM.jpg =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: doc/figs/encrypt_FSM.jpg =================================================================== --- doc/figs/encrypt_FSM.jpg (nonexistent) +++ doc/figs/encrypt_FSM.jpg (revision 2)
doc/figs/encrypt_FSM.jpg Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: doc/figs/fancy_headsep_r.jpg =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: doc/figs/fancy_headsep_r.jpg =================================================================== --- doc/figs/fancy_headsep_r.jpg (nonexistent) +++ doc/figs/fancy_headsep_r.jpg (revision 2)
doc/figs/fancy_headsep_r.jpg Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: doc/figs/encrypt_FSM.dot =================================================================== --- doc/figs/encrypt_FSM.dot (nonexistent) +++ doc/figs/encrypt_FSM.dot (revision 2) @@ -0,0 +1,21 @@ +digraph sample{ +"START"[shape=point,pos="1,0"]; +"WAIT_KEY"; +"WAIT_DATA"; +"INITIAL_ROUND"; +"DO_ROUND"; +"FINAL_ROUND"; +"DONE"; +START->WAIT_KEY; +WAIT_KEY->"WAIT_DATA"[label="key_ready=1"]; +"WAIT_DATA"->"WAIT_KEY"[label="key_stable=0"]; +"WAIT_DATA"->"INITIAL_ROUND"[label="data_stable=1"]; +"INITIAL_ROUND"->"DO_ROUND"[weight=20]; +"INITIAL_ROUND"->"WAIT_KEY"[label="key_stable=0"]; +"DO_ROUND"->"FINAL_ROUND"[label="i=NO_ROUNDS"]; +"DO_ROUND"->"WAIT_KEY"[label="key_stable=0"]; +"DO_ROUND"->"DO_ROUND"[label="i"WAIT_KEY"[label="key_stable=0"]; +"FINAL_ROUND"->"DONE"; +"DONE"->"WAIT_DATA"[label="key_stable=0",weight=80]; +} \ No newline at end of file
doc/figs/encrypt_FSM.dot Property changes : Added: svn:executable Index: doc/avs_aes.pdf =================================================================== --- doc/avs_aes.pdf (nonexistent) +++ doc/avs_aes.pdf (revision 2) @@ -0,0 +1,3671 @@ +%PDF-1.4 +%ÐÔÅØ +5 0 obj +<< /S /GoTo /D (section.1) >> +endobj +8 0 obj +(Introduction) +endobj +9 0 obj +<< /S /GoTo /D (section.2) >> +endobj +12 0 obj +(Interface) +endobj +13 0 obj +<< /S /GoTo /D (subsection.2.1) >> +endobj +16 0 obj +(Configuration Generics) +endobj +17 0 obj +<< /S /GoTo /D (subsection.2.2) >> +endobj +20 0 obj +(Signals) +endobj +21 0 obj +<< /S /GoTo /D (section.3) >> +endobj +24 0 obj +(Memory Map) +endobj +25 0 obj +<< /S /GoTo /D (subsection.3.1) >> +endobj +28 0 obj +(Control Register) +endobj +29 0 obj +<< /S /GoTo /D (section.4) >> +endobj +32 0 obj +(Protocol Sequence) +endobj +33 0 obj +<< /S /GoTo /D (subsection.4.1) >> +endobj +36 0 obj +(Interrupt Behaviour) +endobj +37 0 obj +<< /S /GoTo /D (section.5) >> +endobj +40 0 obj +(Ressource Usage and Throughput) +endobj +41 0 obj +<< /S /GoTo /D (subsection.5.1) >> +endobj +44 0 obj +(Exemplary FPGA implementations) +endobj +45 0 obj +<< /S /GoTo /D (section.6) >> +endobj +48 0 obj +(Compilation and Simulation) +endobj +49 0 obj +<< /S /GoTo /D (section.7) >> +endobj +52 0 obj +(License and Liability) +endobj +53 0 obj +<< /S /GoTo /D [54 0 R /Fit ] >> +endobj +58 0 obj << +/Length 550 +/Filter /FlateDecode +>> +stream +xÚT[oÓP ~ï¯8'qŽ}îot¬C b‹xahªÚ²!ÑZÑþ}çÒ° E²ûóg'¨ ?¨0&pÙ+²¼Mjµýšˆ&š¬Ôh”/]m~åeÐì4¼zP¢ÞÌ°¯UÅÊIµ‹zV]%&â¢%«êo +‚§8’ª×ꋾ¼™_ÕÅ×úÝÌ´ÐŒ»¨Gè3m|âgˆü—þ/fä ¦ˆ-1Ž¢”•ó ¢§Ž×¼(½Ñ ‘·Ei)i”™DV";žœVÛ‹ ÄñfüZä…H>Âv̼¤ )¥;»Y²—rQ l۔Ϧ–p@}Í’ôG‘ÆL2yéy 2ÏE²ïȇSäi*\ú ÊIh)Lß²íèö½!Ûݵ›‰y¶´rÛ“[æn]RÎx0<ýaù0¢p´åÐ{ÞÀ.w0Ø_½Ý¢ºldAdïCäyc§8`»¼ë±O¶"õ¹½î€é9p™,Û +˃ÿ{åÛ¹Q;Ö¸'Âèú ­›ír_”“¾ù½_=~?äõòÇpûh!3¶/ŸÖ]dósó´jv›}^C³{8Í!{/õJ +Œá…çÂr‡q<‹`8é—"›ôŽ +¯…Ê«³uÆ/K +zÈ1Ê=Û€`BbÊÁFÛs.ÈèÃþ~¹Ù߯›UÇ¿ÝüC‘˜ïsš'//‡e§È˜\_>ÿ!ü8ø +M +endstream +endobj +54 0 obj << +/Type /Page +/Contents 58 0 R +/Resources 57 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 62 0 R +>> endobj +55 0 obj << +/Type /XObject +/Subtype /Image +/Width 765 +/Height 15 +/BitsPerComponent 8 +/Length 2386 +/ColorSpace /DeviceRGB +/Filter /DCTDecode +>> +stream +ÿØÿàJFIFddÿÛC + + + + +  ÿÛC   + +ÿÂý"ÿÄ ÿÄÿÝ0ÿÚ æ<.‚©õ§Ò‚¹túPQ>”O¥éADúPQ>”O¥éADúPQ>”O¥éADúPQ>”O¥éADúPQ>”O¥éADúPQ>”O¥éADúPQ>”O¥éADúPQ>”O¥éADúPQ>”O¥éADúPQ>”O¥ëé@G“wNÁ—'A²"5Û" +vȃ]² Ù<¾(ÕÅÿÄ`ÿÝ`ÿÚí>´ø~s. —Ë‚eÁ2à™pL¸&\. —Ë‚eÁ2à™pL¸&\. —Ë‚eÁ2à™pL¸&\. —Ë‚eÁ2à™pL¸&\. —Ë‚eÁ2à™pL¸&\. —Ë‚eÁ2à™pL¸&\. —Ë‚eÁ2à™pL¸&\. —Ë‚eÁ2à™pL¸&\. —Ë‚eÁ2à™pL¸&\. —Ë‚eÁ2à™pL¸&\. —>uÞœ×]³“R™9Lœ¦NS')“”ÉÊdå2r™9¨ãA†CÿÐþS&?†l}7Õ{syÇDyÇDyÇDyÇDyÇDyÇDyÇDyÇDkp=Fžnge®}ÿÄ!RS±!ÿÝ0ÿÚ?âþG—=Ò«äªù*¾J¯’«äªù*¾J¯’«äªù*¾J¯’«äªù*¾J¯’«äªù*¾J¯’«äªù*¾J¯’«äªù*¾J¯’«äªù*¾J¯’«äªù*¾J¯’«äªù*¾J¯’«äãéÁÎý} ¶öü<.ÛÛðð»ooÃÂí½¿ã·N.ŸßôêÿÄQ1ÿÚ?4É"H’$‰"H’$‰"H’$‰"H’$‰"H’$‰"H’$‰"H’$‰"H’$‰"H’$‰"H’$‰¬ëýxw¯õá7úÿÄ2 5”Ñ£Ò!‘1Qq"$24`abáðÿÝ`ÿÚ?Ú»ƒ“>'o|èñììþéî ++£žƒJèç Òº9è4®Žz ++£žƒJèç Òº9è4®Žz ++£žƒJèç Òº9è4®Žz ++£žƒJèç Òº9è4®Žz ++£žƒJèç Òº9è4®Žz ++£žƒJèç Òº9è4®Žz ++£žƒJèç Òº9è4®Žz ++£žƒJèç Òº9è4®Žz ++£žƒJèç Òº9è4®Žz ++£žƒJèç Òº9è4®Žz ++£žƒJèç Òº9è4®Žz ++£žƒJèç Òº9è4®Žz ++£žƒJèç Òº9è4®Žz ++£žƒJèç Òº9è4®Žz ++£žƒJèç Òº9è4®Žz ++£žƒJèç Òº9è4®Žz ++£žƒJèç Òº9è4®Žz ++£žƒJèç Òº9è4®Žz ++£žƒJèç Òº9è4®Žz ++£žƒJèç Òº9è4®Žz ++£žƒJèç ]šøbòl.{Å1tÆ}uñÄJ8~âcí+ߧ:ô›ÝÛœþçÓ×°;!KÈdò°ì†A,;!KÈdò°ì†A,;!KÖ•ju;1ŽöK«iMžÏ—ÑÿÐý(m{ ƒë6;¦)±ÛŒàxÜïŽoËØÆuããœùãúö†þv¾ ßÎ×ÔùÚúƒ;_Poçkê +üí}A¿¯¨7óµõîÐú6—Ø}jH\ãçÞÞ0“êêõùx˜1s¿¿–|³þøÿÄ!10A`aq‘ÿÚ?!‹âÔfC —{dAx–L™2dÉ“&L™2dÉ“&L™2dÉ“&L™2dÉ“&L™2dÉ“&L™2dÉ“&L™2dÉ“&L™2dÉ“&L™2dÉ“&L™2dÉ“&L…ãaäÑâŠÉà„iÉ0ÑÒdÉ“&L™2d‘PXµ“÷ãÿÐñGs°ÉØñ~UÒwi­Läûžyçžyå9VzˆÁFà\XÇÞ­ì5ÜÜãÿÝ0ÿÚ ¸ÓM4ÓM4ÓM4ÓM4ÓM4ÓM4ÓM4ÓM4ÓM4ÓM5ÛM4Ó]ÿÄ‘a1Ñ!A±áñÿÚ?ZJñúùý™k2Öe¬ËY–³-fZ̵™k2Öe¬ËY–³-fZ̵™k2Öe¬ËY–³-fZ̵™k2Öe¬ËY–³-fZ̵™k2Öe¬ËY–³-fZ̵žšÖsàãúãðc½Œw±Žö1ÞÂâ¯Õåy‰ûGÿÄa! QÿÚ?ÎoQEQEQEQEQEQEQEQEQEQEiõ–wËmð4?ÿÄ!01A`ÿÝ`ÿÚ?@xQ<(ÅÈä×ĉ$H‘"D‰$H‘"D‰$H‘"D‰$H‘"D‰$H‘"D‰$H‘"D‰$H‘"D‰$H‘"D‰$H‘"D‰$H‘"DˆKõiaâ€Dhƒ…–ÆÒcˆ>‘"D‰$H¿Až†ÔY(=??ÿÐùG_«  Dˆ¦»ò`àHzü]u×]u݀͆@è„v)îuŽÄÝ‚e7…&•—ÿÙ +endstream +endobj +56 0 obj << +/Type /XObject +/Subtype /Image +/Width 121 +/Height 121 +/BitsPerComponent 8 +/Length 10896 +/ColorSpace /DeviceRGB +/Filter /DCTDecode +>> +stream +ÿØÿàJFIFddÿìDuckydÿî&AdobedÀ + + !*»*ŽÿÛ„ÿÂyyÿÄò + 0 4317!1"20Aq‚# QaBbR$r¢s%µ6v–Ö +!1A2 0Q"3aq‘¡±ÁñB#ðÑRrá’âs!1AQaq 0ð‘¡Áá±Ñ@ñÿÚ ïà;: ßÜÓ¶±usÀìè™×3èB•F›2MÅÕÏ‚ô´”úò¯˜ýw=Ë%D‘¦Ì“A±usÀO†du¼ú´[WÉQ$i³$Ðl]\ðswª â—ÉZêk-f=ÅG¼«ÌN¹ž‰*$6dš +‹«ž‡gD®–°oo9s‘ݳ1ˆ'ESÊ;ûÅÎÜc+yÊ’¢HÓfI Øº¹â1úæ}Ó.K íÖfóUà¨KI÷|þõgŒé3|ÈNÂ`·¯â—È×kH2TIlÉ4W?-›sTnkfXõaißóõE:*kW>{­›çý<à{(sÍlÜçj|èé„ß_/J9Gñ}>33­gñüŸ eKgÞ<ã³µ4Ö?·ïšõóʾɛÁv0ý¼o#Äz_/M'eõΡ¶’Þ»3:ÖÉðGçë[øž›Í–}‡9z_/M'eõΡ¶VKzìÌëYü'Ài['ïî×?oš­c€¥WõŽžÊ½ÚAÒvQß\ê`’Þ»3:ÖÉð´4ö:yÈ´?Oåéó¾¾~‡ÏÔcs®˜ +Éo]™k?äøOõ“zÙÅtö.®uË¡¶²[×fgZÏãù>—ËÓIÙG}s¨m€’Þ»7º§ ü˸¹Ô6À+½uœ¨±ÿÚòÎ3ˆ, +Guçsm²a6L'fqœA`Yö};°çkËfð©½m²a6L'^o¢…°¥ç~¥ÈYN“ao«Ëfð©½m²a6L'fIŒÂe±;O[ÈkLŽ±,¶o +›ÖÛ&dÂtníà¬oönÃ’s®¾Æe˜ëæoÈ´ßxòÝwÆ%–ÍáSzÛdÂl˜O ã8‚À ´Vq3°˜VÀs+œñõÁû—Ú¬às‰e³xTÞ¶Ù0›&Œã8‚À ³ìúwaÎýJ¥}ƒ×¯±\Ê£#$&d5¾ œ ¥k]t´åZõì趱Ê5ÃúIJټ*o[l˜M“ [–_6“Í«Ì^`y\ÜfI%2ÅïÖ]^íƬ°¬Õ'+ +ѾäÕî\¹”gº7+­Š÷u+—DåßØìÚÙúÂeÃdøÄÎ3ZÃod:ÑÞ#ºuî`$©+MLJ³‚‰ÏööÃœ¯öIÿ踇‡’Ÿ’Ô:†7ZÆñ³õ„6ˆÉñ‰œ>g13‡ÌñõÛ)E­Ýµný®ÒÒ™ ¬«^˜ØAÄaáä§äµ¡Ö±¾[?XCl¸lŸ™ÃækSlwZÛ(†™‹È#i + +uë|;—èÙúÂeÃdøÄÎ3X.ÌËuã¼{ín*ìQ{ç]ÎHuìýa +²á²|bg™¨xy)ù-C¨cu¬ofÏÖÛ.þ–Geš‡PÆëXÞçÿõîÿÚònÜŽH– +ÒÝÓR5'cvärF͆Ôt`ÀÝ5#Ru·‘øÈÒh'ÓFÜ +ÓR5'`Š@­›¤»#p7MHÔñÿ&’Ѫlê,%J­tÞ8þË® ¸¦¤jOíÈä’-ÐÙTÙ6C~%Sd¼µý/É‚7tÔIÃvärF͆ÔsCâ1ÊL +R’„º?È=|·TW#¦ÎÄé4`ÀÝ5#RS7Kzr 8 ¡-+R™gv±ÝÇ BÉ{±wkY +R˜1³TðéX”ÑÚÚ,EAÑNÙ ÝŒÁÈ9B.E¶l6£¯h~ç ZF—Ï”í\4v¶‹PtqékÓçô³Ï­#KçÊv¯ŽÖÑb*Ž%í:µî›³~')¯žÚæZÒ4¾|§jòhím" è§­lèKBƪõ¿ts#¡£µ´XŠƒ¢œ4 «֥ƺzÚ;[Eˆ¨:)kHÒùò«±£µ´Z\…A|ùNÕÜŸÑèÿÚò1)Ù®`GaŒ€ ÆY×C"Ä°GYYûê\eè‚ ¯C"Ä°GbÆ‚%À.Ýt2,KÐtt;yìÕÜWâ"ö½¯g‚÷Àȱ,AÑàc (feÔkÝFá…ïvßçÀdX– èàÆ@Pc,ëŒ_q–’›ªà²*öD`ÑÛ¡‘bXƒ¢(ª-· ´­*M•kÇ·½ ¸ƒÂ””Ûå7½î¤Ù.Ý\÷à +"Iêâœ7K„j©»¥·¸€¼©VBLeuù¯ðá)RÔÕª@ž7K„j¸õ½øþ·‚R¥©«T>¥ÂH5 \1'æ Ú׳†‹ +ëâÛJTµ5j'ÉÃt¸I¡*›à"T•¦½-Â!«¡Ãt¸I¡*‚à€º$‡zKÐ.ýn¥ÂH5 T”©jjÕ Oc†ép›„–#V©{¯û]ÿÚ?âÛÓù/ãÊθϪ¥Ùp<ݽ?’¡Ÿ8mêeT».™F“åò¯ºÉy•ZFbz™U.Ëæîi™9V3‹Ä6õ2ª]—ÉÝÕð½êCM²ó)èŠu=Š—^ý.°ÇoS*¥Ùp<;z$Í&~Ÿ\Ñu"&X€¦/àÛÔÊ©v\ vôþJ†|Ó5}l™ñ=­ö4'jàaâ?ÖW{©éæé +½Lª—eÀÀÐqÆ~X#Š:o±ÁTÃ')O¡}×YÒ°å=·*ïU¿Ç>È‘ÿG†³¿ûÉLdÄ-Í<°¶ÍNªÖͽE± nbU ¿Ö²b^ó&…!fˆ¸|Lf2bæžXÚŸûϽ2}xKÞdФ,щá˜Éˆ[šybOÒë5P¼)8Ë[§å +€îïg™¼É¡HY¢.Ç1“·4òŸ¬\¨x“‡ÓÔ3ky31 sO,%¨-ëŠûNz•o0yG2c&!niå{Ìš…š"áñ<ÙŒ˜…ü€~Ò³D\>'žïöqäÿÿÚ?â­ë{16·ª +Ùz˜¿™SÜWc”µ¡[/Sói}ÊŸ§VËÔÅü¶xžå2ç)jw1L\êƶ^¦/á­éÏwX8ž±Rà­—©‹ã[ÕNNÓô¿¡Ð¥·¡§Œ27Ôoi]×u…l½L_½| U·)TºÐ± °[ ¸È)TG*¥¾FÖu•¾¿è¤s`U¾ZΊÃ#å‰q¸* +¹öF–æS>$ds`U¿¿´'K§ +-̦|NØCÅ#r˜·N²³Ú©ne3âqÈæÀª|*úqU6Öð°Zy29°*‡ßË—x ª[2ï72G6PûáKs)Ÿ›#›¶¥Þ¦|N{aørÿÚ?þ)÷›Éø¢æ:tã*nl®&:•#'ÔíýÍòƾ¦éâ/|E|Ô³P´uHÎú¨5Ná¤ÕI_+õ0Ùâ;Îpîà8*U8®Ç\¶°Ž=ÆžIY×Yaù{ôçâLR‡2´Ÿy¼ŸŠ.c§N2¦æÊáRc©R2}NßÜß,kênž%Üîeâ‹Ê-n¶&cOWL¶V½u8äíŒÉ!õHÝOLâ®ûChÖ¹Xñtlµk•˜ƒ5+°‚½ú³ñê<ÁÃ)  ±×0­°¬#q§’@ÖuÖX~^ý9ø“ aÇC† £ìæÛ{Þ[—+ÝWF:Uèê«»e`Š9>¢I}*½Æ,GëÐaCËí¿vV¹ VžâƒÑÎ:…ªMqY›Ë¬(3÷ÿ/ÛýË©³¬¹@­´BINäEëZA‘ž xç®>wÚFµÊÇ‹£e«\¬Ä©]„ïÕŸQæH`]Ž¹…m…a{<’³®²Ãò÷éÏĘ¥:0eigI¿¡úGTbHdÁ f¬Ãõ+Y‹>—Rü<6®g{z«Šö´{6P¿YP0¡} v›0YWð|qð«¾ÐÚ5®V<]-Zåf ÍJì ¯~¬üz0pÊCBìuÌ+l+ãÜiä5u–—¿N~$Å(qÐáƒ(ûí¿m¥{>瞸žÕ™Çv¾Ž ‡ûrÕþ[çֈNJ/`Á€?WkÞ¾æïsî/Óî.Ò†'ÎyAZ”µëWëþ…_ê{¶äþåöüŽ‘Ï%¼I¸ „á­W»Ç½w†rÑÌ_VOoÒ™,Ó»^u,Dsõ¬F²Ã2½$7bå²ÐDûýkë„l÷ LÂο¸¼~ù8¸»í +£ZåcÅѲծVb Ԯ +÷êÏǨó ¤0.Ç\¶°Ž=ÆžIY×Yaù{ôçâLR‡2àŸy¼ŸŠ.c§N2¦æÊáRc©R2}NßÜß,kênž=ÙîÃñ-î!R†¾&&ž²„:ú²CZºœr~S“$‡Õ#LãÝ×í—ïOî-¿I(â»4Wã–â+AÆNüu)e™ÿo¿µ¡?SôÑÚ3ĹÉ%bú‚‹ü‚ãÈxš´ËÎI¨|š9P£©ÏNªßÁW}¡´k\¬xº6ZµÊÌAš•ØA^ýYøõ`ᔆ…Øë˜VØVǸÓÉ k:ë,?/~œüIŠP0ã¡ÃQðŸy¼ŸŠ.c§N2¦æÊáRc©R2}NßÜß,kênž%Üîeâ‹Ê-n¶&cOWL¶V½u8äíŒÉ!õHÝOLîßmHø˜š;ʉŸz;ÇÝÛ?MøòþŸ ûøk»{{Ý%ØW¶ŠLUövs>„ì"•¬s–!äÑ7L”lx©ªÕTšöÂôË^¥JëÎY¥ u$áUFNñ£ö×5–Å*í%ù“ä—crW·t¡8-O1D'¯mGÀ©ö³pötÈßðt¦®§ð>%}<6}«°`{skä’ÍçÜgÖÛ•Ó·þ0¼}Õq- Ã_º©Íõ×@É Ì€kÛ¹h_ <Ç%õwÚFµÊÇ‹£e«\¬Ä©]„ïÕŸQæH`]Ž¹…m…a{<’³®²Ãò÷éÏĘ¥:0e6ûâ¥r“4ZýdlÏ­§­v&Ö9 +,Ád/&Ÿ¥o›à¾5^å¨ ¢œ¼.Õ +Ä]×X«µOöòxNPœ…•U¾ïwš{Is[±lV>õ9 Ž¾qÍ €£¡êŽ=G‹ݵ*Û“·b¥ÈRx%_?Tr2§¨>jzŽ¾h`Ý둺ý--±jéÿ'×Avúχoni¢¯nUá6ÊÄ’\ØʇÍ>ªÃ;CÀÊGÁ:Œü$Øn64µtbÇrÞÂÌ5+©?*™§tNM÷3ãé#÷¶KÉW”ó=Zùa‘þòÌqTÇõçâ]Å«ÕaÕAXÝ—`ó'Ò-@Ϩï‚PÄS¨#ÏîñûV«¹SÚûêÂÄûkòEØÝ_4@öaþÀrÞ¯—á©›Ùy·ÓN+AJ%/Â'!§§z.HEÑ9HX¨Œ/s’• ?ö·´¿ûnÇÿÌø4¨®úmÊ')©ÌÝL3ƒ= ÈýHÿ2á€>-èwÕ¥úÔ|ÐØ…³Ú·R\=YÀÊ°ü x)[ÿöý™{› +‰ +DÏéSjŒÜ\Ò»ÁqË Ž>u8R°ý&ú¶³a"ŽzÜ‘ën¤‡Î(švn·ý‰$éü¼+£V•”åYOPÊGBøl·[íÑÕQµ°´Ã«v*Bó8AÓ”Œ +?¹ºx›m¸–g]f®7cKWPŸL0'@Ò°».9HßÓx>ÙýÞÿìÚÞ:Ÿ¨¢ú•Î$ígdòãòóõcãOO§§5ý•ù„jÀ2ò9êI' q¨,îÄ*($¨±Ù¿î«ð¨ÙìÂå+¡Ã~Û­äGN6¦èÓ°äØU~Àµ7ßM¹Då59›©†`0g¡9©æ\0Žú£T¿Qºš¶{VêK€'«8VÁ‡mX…3ž1M$k“÷áX øö„ªÜÖ_kû~@þ|Ãêj0lŸ>YñïD®®Ò +dr°O>ĪOiø%hØ·ø᧧ÓÓšþÊü +µ`yõ$“…Ž8ÔwbHÇÔXìß÷UøTlöar•Ðá¿mÖò£§StiØrlª¿ÀiÜ SqQ]ôÛ”NSS™º˜fz‘ú‘þeÃ|[Ðïª5Kõ¨ù¡± gµn¤¸z³•aø@øki™3Û/&ŽÚ»16¶P¿0„Еcïh›ùx³Fä)b¥ÊóUµ^A˜ç¯b6Šx\}é$nAþž-Z¡NÞßÚ#ËKiZ&©BÄ‘Wl‘jÒÁò÷HKЂ («HÒHì#E.îÇ UUÉf'ÅŸxØÑÍ^fWz‡sô¥Ú~ÜSº” ÀåËqõðí‚Þ)éôô濲¿0‚­X^G=I$ácŽ5Ø…E’ñõ;7ýÕ~=˜\¥t8oÛu¼€héÆÃÔÝv›*¯ñwÔÜTW}6å”Ôæn¦€Áž„ä~¤™pÀô;êRýFê>hlBÙí[©.ž¬àeX~Ÿ¬¢çœ~\‡$ÈOŠ›5Ø6ë± kڮܑÔù«±·GFцðîÇV¼rõýD†5WÍë +¯Ãq¼ÐéᥰÝIÊăԕcôÎ|úÍPÇi–wvTD“ö†Àµ7ßM¹Då59›©†`0g¡9©æ\0Žú£T¿Qºš¶{VêK€'«8VÁôúzs_Ù_˜AV¬/#ž¤’p±Ç‚ÎìB¢‚Ixú‹›þê¿ +žÌ.Rº7íºÞ@4tãaên;M€Wí +;jn*+¾›r‰Êjs7S À`ÏBr?R?̸`ý6¢Ãû‰ì,ªB9­Å|˜îU˜ñè~ÄL# @À!áæÀ`ð…« H*€¨ô1THK–ÅJgNZ1À sÆt<ë'ZÆXØ¢Ô +w‡ðXþ@“¾ +ƒçì@$Â0” ó`0xBÕ„¤@Wa@0{¸FiWÄiv$H„Ô;ÐÂ÷|ˆG€áU£VHèDªøD¡¡,`cÈbÃg­%*b—db håó“_æš÷ˆl¸?$À€/‚ ùû 0Œ%†•Ï÷ù´X<*›­øc-Òlk®hE ÙsRP”ám$è,=N`¨s‘äè‘¥0v¸àr~Fð­Ø/ ¯Ü/"yl V>e6Ù_ºéeçS‘z “.’¦³‡Æ‘³ˆn§µÒ>©î+¶7Køwd Aé(=Ò|Á‚z%bˆ%y"Iþfä@|Â"’ºD²`êJ0m³Fè µ}%U“²¨€ÒÀÃë3 +Äà& À \ «v€ªL“^€3ûš+bƒ†á `ì”/ý%ºO˜1BàQ–ÈoÐ Õɲn¦ MHMa !'vdžå[´P +dšôŸÜÑ[†á `ì”/ý%ºO˜1@2`ÉnT«h2l)Óƒ-UËõ¡) ¨kžj¸yJiÂø‘+Ìð·¦ÀÜ «v€ªL“^€3ûš+bƒÆ8PÜ!,áÝ’ÿ¤ ÷IóF³ê®Ms:¬ÝÌ"î6±*ëÞùJèïzAHFâ9‰µi<´Œä¿·“¡¸BXû% ÿIAî“æ ¼«P'´©V%öSÒÇ°ef®ž¦^PZ„BÈùCp„°‡vJþ’ƒÝ'Ì!r‚­Ú¨2MzÏîh­Š4p¡¸BXû%kv»ò”Õ'ušôŸÜÑ[ô/ÿÚ?!ñ êè7}^œ)<õ94=·œõ¾‚»Ÿ^h¾®ƒwÕèßWU»ôiƒƒ•î;œúʳÖú þî}yˆ|ÑU_¶§0Ãu? jþc©™ƒƒ•î;œúʳÖú þî}y¢”¡Ü¬˜XØÇOm0pr½ÇsŸYVzßA?Ýϯ&ච÷ßCÿ®ãÐ~YZXn<Ü&Oš^Ðœ”ÓÚËÙŽÓ‹ƒ•î;œúʳÖú þî}x@õt¾¯\˜×U-ߣL2Í+½Û⃨=cò²ÁÊ÷Î}eYë}ÿw>±ÕÐnú½;êê·~)¬åwý0)YDÜd¬óÔÁÒ•kKRÝ ·À úî´¸3–ϳîj|@Íf§889^ã¹Ï¬«=o ŸîçÖ ‹U©ü#m>pÐýgdÉõ¥2¡¢Ì ’¥ÂnÝñcDè±ì}á1K@–¥ø=ßbôUÊb5«6~oÖ0XgnNvß+Íä)ŸwÜýÙ£¯+㇜'6åñÜôSÌÝ1þ²³žQ ïCä/YaÂزñ‰öÚ¹Du>ÏçºáŸwÜýÙ£¯+㇜[à-?L©'“ü±óá>»W(Ž§Ùü÷_}ßs÷fŽ¼¯ŽqNzs~åXiJMuiçwLÏšP%Ê@­wrßãI›QöÚ¹Du>Ïçºø³îûŸ»4uå|pó†Þ|íÑ×ßJvìÐ๠+Æï%Ï.'>ï¹û³G^WÇ8eUÈXwúd§g“Ýö|Òe×̳îûŸ»4uå|póöÚ¹Du>Ïçºù™÷}ÏÝšƒ›%váçj¹Du>ÏçºÿÎWÿÚ?!ñ"N†«±P##HÛý¬µœÍ¿6|ÔIÐÕv+Û `i |ðÖZÎfß›>aôx + $»$|“ü©_ÞŽ’Ï +e¬æmù³æ²)u=]fÜÿL +$žËYÌÛógÉÒª=:Õà]SùC׫™ß^ô +ú$¢élþ14>xk-g3oÍŸ +$èj»Á\4Ãü¿F)S»-øxÿÚÿØÓ"‡±ùIB©0Ô‡?ñ³@YÙ±ýíŽPtûV˜ô4Zá¬.˜Ó*³ó~Ž?¸äPö?)(Aõ& d´¥ýQ]Wú<&Uf!æý|9=ÊJ}I‰s“ëãùH¯"›‹¢í×ýÊlgP5¦ÍãoYQƒ•Yˆy¿GßEcò’„Ra®ŽÃôü£N&2á]¶<œŠÇå%>¤ÂH¹O­Ê+¶.}4Q/3"‡±ùIB©00r«17èãûæäPö?*Wå¿=9¬Ä<ߣïŸêù/ÿÚ ;ÀÆØEÛ›`®;l °Ûm€â ¢°¹5 é©£DÆyl mÛa—Q² +7DF/€ÿÚ?ñs©ÿ€<ü‚jšÍÞû£[+uT +W›@óh­ÜýΧþóò «lH@f„…Èš£ + UR» 5^mÌ¢·sð—ßµiÖ‰ãM}ì ¸Ô[I‚õžŽ§4dŽMQ†Ð*©]…ȯ6æÑ[¹ùr{9^2¤ +-è*×È&Þ + Ta´ +ªWar«Í y4Vî~ˆ‰FÀñÓWžñÝ8Ž+e ¡´/(áa9”SröEµ § Ú¢åku… Šg¶à‰ª0ÚU+°¹UæÐ<4Vî~çSÿyùÕ–¸¿9¨"hÏ +§ëû-©Ÿ¼rX^FâÎ9…J-÷alt¹¸žMQ†Ð*©]…ȯ6»Ÿ¹ÔÿÀ~A5mé §BBçÞ ,èC”g“ìUùQ18QK³v­oV8‚»Nes +'­µ +³µÄi¡= áHÌ ážÔ‰èvA‘5F@ª¥v j¼ÚVî~ƒÚº«ýQÀlSေ‹šVM©ô¤@>š bp‚Ç:™$%ù2`Ëw·W_Šƒ†è3ÛGÀzTP•U +‹ä† (÷˜*Ð6€§0rh·Y$ÇŒ”ê3â˜XhB|mÔ9Ãàå¯wƒG[ˆ¤]êgâ¹lÉBùcŒ0‰Bê5„@µÙPúØaÖñ¼ Ȳ:$&Ò¤˜h ¯`ú +n"‘t©ŸˆZå³% æ3§ÌÉ5 “Q·z2 ]Õ+®©U†€šö ÑÖâ)Az™ø…®[2P¾A"ÇlöÊ]e¦Z”2éÈ÷ DqŠ?c<ˆbe(§FbB<‰Z¡ÀÒø~êx-.:kØ>ƒG[ˆ¤]êgâ¹lÉBø'ì®ýBm±š±z?d$Ë’x,ÙÊÔè9*^à÷b4„HÝêÜî³›M‘“Á &½ƒè4u¸ŠEÐ^¦~!k–Ì”.öW~¡6ØÍX½IY]ÿØ/+<šæͽÿãœ`Fga¾,Ø‚J B=@[´Œ!s—”%äà%7†4t¦a!ày5keŽxÜÈ[F &½ƒè4u¸ŠEÐ^¦~!k–Ì”-áKàÕÊ2™•[Å“­»M˜Í&´Üá‡á7,ˆ–i“|¡¹ì™%›Pð.S¬ÏÅ>)¤]àæI£Ê‚“°,ºV\Îc‘øT##™g3žÚÕµE,Ä¿;î$_ò@vY’Ý +ÀM +.¿vƒ¶›¡‘J;'îµ +§rDZÓ#PÙµý$G1(·l*›°Y½"ý \ 'b÷t/D@¡ÌWnÀæV½®åí'âs‹L)Œ”™õVÀJ¨µÜ»…•‹(ȸX%qîÐvÃscô2)GdýÖ¡ ÔîH‹ƒœƒý§t„Ú,SŠÝ.åφJLƒú«`%TZî]ÂÊÅ”d\,¾~íl76?C"”vOÝj +N䈸Ëci-„ïq¹M¨@f$‰È“G+À=Ç#œ5@Hœ *ØZφüazDËPRJLƒú«`%TZî]ÂÊÅ”d\,¾1~íl76?C"”vOÝj +N䈴Îc–é ­a¶Æ  ]Ò@.}#˜’%Å%]µTöÀ6…š­H±o©ò/Ý í†æÇèdRŽÉû­CA©Ü‘²Ê£Ù2pIx›ÓyZÄÿŠFðªGÀ„eUlª€+æ_»AÛ +ÍÐÈ¥“÷Z†ƒS¹"-IAÉUlª€+]˸YX²Œ‹…‚WÍîÐvÃscô2)QƒQ˜fÙ•K¤žåÜ,¬YFEÂÁ+ÿ@½ÿÚ?ñXAtAýr ´#"4zÙ¨êÍnB¦´;uö»œ"e„D× »HžÙd}¹¯`¯2†£úB +i­Ý}®ç‡–Át€ì ®’Ì­í`ié¤OáSŠr›œ‚G³mpøÓ!¨j?¤ ÖšÐí×Úîpˆy„ßLæ:#˜š%Otsð°“2†£úB +i­Ý}®ç‡Ê"·•µEÁ°Bˆ…fŽÍˆt‚ž:0·s¡©)Ñ)ÚC$I©Q9f^‰äFðéÆ™ +CQý!´Ö‡n¾×s„CÁaAÑõÈ.ÓY ’÷s^ÁS£­èÀ±1KБí0pE9ºHôlø>4Èjé5¦´;uö»œ"XAtAýr ´‰í‘öGÛšö Á¤n}ÞyXÐ;¦ÌÈÜm“‚v|kë7 »j ”·G±, ÇÒ¢¤èÔ²å²áRìͨÿ +ÊûI|>4Èjé5¦´;uö»œ"T/ég¨ææ\â «òŽ퇶[ é@¢`Ý‘²hÚƒB=ŸE+0égà¾ju5!jœK0pAÆ +É3@{µÞP÷Ê•1#rg(«»±,ø=ŒÛå„ÿœp9‡¹˜ˆ¸‰+Í»±u³ºÔî^ž²»&‰¨èýÉ„Fá(Ûªù.:Œ +bglM»’\pzák —¾Æ­>FûoDs¾eâ½óœÛÇÌe7ÏRØ5ú Õ°]µXAxÃ㹫¶€ÂÝÀغÙÝjw/OY]“DÔt~äÄx!”2-5ɶÂ?> endobj +61 0 obj << +/D [54 0 R /XYZ 77.669 724.535 null] +>> endobj +57 0 obj << +/Font << /F81 59 0 R >> +/XObject << /Im1 55 0 R /Im2 56 0 R >> +/ProcSet [ /PDF /Text /ImageC ] +>> endobj +83 0 obj << +/Length 958 +/Filter /FlateDecode +>> +stream +xÚíXMoÛ8½ûWè(Dóûãè¤IÐE²Û½½4E¡µY[€-¹–´ÿ¾CRTÇAX,ÃI‘Ãáã{3$a’`ø‘„(¸ e + ¦“ùfôm„‘ +›$éùÓ.7¿³6þ#ÖЉ‘É2ñÕÕˆtkåq±|°ÚÙl4¾Ô„¤eÉìkB4A‚ªÔl‘|JßÝN.gÙçÙ#ì\ƒß‹YïúÈ6þ†_´|Ø6ÄÎ¥RÊ„õ'Y.pzáËi–3ªSâ?¨/µ/Ǿ ýf0:´…/epq‡8>÷å™/aˆ£‰Û¶Ç¨‘¢*pÄ  +MÐ}̈³Ë%I¯¡¤é_¾ü³Ÿ©QØoŽÄ@@†Œè¨½£Bö†CäÀÕÀ2÷ÈnbéÀM€cQ£#¶kk’i@é@][‹Ž qƨŠ©—| µ;C% "BÅÔZPÒ…áCÛ +]arl@ÿøý†$ïj&}xt¾óóStœ¢ã§èx.:ž\1ÏE‰QpÇ!Æ%u#ÂP*à>¯«ÖVm¶èì[¤H‚°†ŒdÁ†HKßWí.£8­ûy[Ö•›žpÁá*RÂ|g{ƒÚÑÕ»±»¯ÅÜ>;ÿöœ3‰”fp›R„E‡Š"‡‹`·;Œér¿Ëà«ðм.W¶²»,'"-ç +Ô“¹°À¿ª¸1/´üÿU×Kò)'Œ±@ëC/>d’&§å²*Ö@•ä¿ü¶ˆæD&WN$b’?N ÒâÆnj¬8ý¢÷¦ØËþò aƒ iwõ:ø½µË²i]bh#O>Éñ + YÔÄKø!m=\Oí·½­à¨Ë™?}ŽÞ`ÑãP:¥ó§e8ÄöÛ6x=³«Â­t_Öpæåì÷xkúÉק úÝÚ¦qŒµN2Gõ?Má.•¥OÌ®¯¨¡1[Á÷ËÕvï´aŠ³—k,¢Æß3Þ7ÛuáäìO€ËW“Ð*aÌnàÎö·[ãÞ*êM‰¦_/š ¢×›m¹Üú½<ÓrãäÙ÷ƒR3/^w¨âǾTðu]ÎmÕÊ|]ÿ–ë²uªÉeJðZÐZÀÓUIÖ¹& +aÒ½¶Bª6_ +Û|YÔóàÓ=©ï3íYa°2F<<¥Ý`*Š±c1¦ÄCfîŸÕß“uwÆt/œå +t¡Ã66ÄÑ}FEj¼Â;š8Ï1„ëMÑÍ»Ý7óUéçk¿¤ÂˆR¸T$lŽw»‰¬Ô[8ØjX+ƒÕQ½[þeò åÂÑ +endstream +endobj +82 0 obj << +/Type /Page +/Contents 83 0 R +/Resources 81 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 62 0 R +/Annots [ 76 0 R 78 0 R 80 0 R 63 0 R 64 0 R 65 0 R 66 0 R 67 0 R 68 0 R 69 0 R 70 0 R 71 0 R 72 0 R 73 0 R 74 0 R ] +>> endobj +76 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [507.038 768.718 521.161 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +78 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [507.038 768.718 521.161 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +80 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [507.038 768.718 521.161 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +63 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [76.673 679.482 158.443 689.569] +/Subtype /Link +/A << /S /GoTo /D (section.1) >> +>> endobj +64 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [76.673 646.52 140.498 656.607] +/Subtype /Link +/A << /S /GoTo /D (section.2) >> +>> endobj +65 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [93.037 622.176 231.73 634.619] +/Subtype /Link +/A << /S /GoTo /D (subsection.2.1) >> +>> endobj +66 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [93.037 600.122 155.891 612.566] +/Subtype /Link +/A << /S /GoTo /D (subsection.2.2) >> +>> endobj +67 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [76.673 567.329 161.814 579.304] +/Subtype /Link +/A << /S /GoTo /D (section.3) >> +>> endobj +68 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [93.037 545.107 198.926 557.55] +/Subtype /Link +/A << /S /GoTo /D (subsection.3.1) >> +>> endobj +69 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [76.673 512.314 193.624 524.523] +/Subtype /Link +/A << /S /GoTo /D (section.4) >> +>> endobj +70 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [93.037 490.223 212.835 502.284] +/Subtype /Link +/A << /S /GoTo /D (subsection.4.1) >> +>> endobj +71 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [76.673 457.13 272.802 469.273] +/Subtype /Link +/A << /S /GoTo /D (section.5) >> +>> endobj +72 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [93.037 435.207 286.831 447.52] +/Subtype /Link +/A << /S /GoTo /D (subsection.5.1) >> +>> endobj +73 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [76.673 402.283 239.071 414.492] +/Subtype /Link +/A << /S /GoTo /D (section.6) >> +>> endobj +74 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [76.673 369.321 202.34 381.53] +/Subtype /Link +/A << /S /GoTo /D (section.7) >> +>> endobj +84 0 obj << +/D [82 0 R /XYZ 77.669 741.543 null] +>> endobj +86 0 obj << +/D [82 0 R /XYZ 77.669 707.42 null] +>> endobj +81 0 obj << +/Font << /F81 59 0 R /F97 85 0 R >> +/XObject << /Im1 55 0 R >> +/ProcSet [ /PDF /Text /ImageC ] +>> endobj +108 0 obj << +/Length 3025 +/Filter /FlateDecode +>> +stream +xÚíZKsÛ8¾ûWèHUE|ìÍq”lfmg'ÖÌÔT&•¢IÚâŽDjD*ï¯ßntƒ"%Fv²9¦\EG?ð¡»XN|ø“ÅB'f¢‚H˜ žd볿Î|ù‘ŸL&]avLÂñÜ;±÷ D_Äfr?±?¯Ï$óš9f³·‹³ç¯bDK*˜,î&2–¨¨j‘OÞ{/ß¿ZL?,~:óqj˜w¾è¦Qãgøs=Ÿ&(à'‘h=‰¢@DQBüϧ3ã{sû½™Î{ÒV”ýÆöûÜ~‰žôZŸ÷ÊÆ~Cšâßø½‰/ì÷…ýB“¤N稶•1‘ŠÈF”¡è“t¿N%ö›…Ò»„¯òÞÚïu72Iä[å)XÀ@$†Mû‡2a×±oj°U¯çÌJvå¾(Ü͈p*‰l—V¬ói R¢Pó1^Jj‘Æ Àb*+»ä½¥6Ð/Q“È$BšÈA0Ž’ Ã}Ù6$ì +@þf-'/k “<÷¬7ùtü@Çtü@Ç—Ðqb¾„’$‚'*ÙI"a¢ˆä†“¾ï{oªv;U¾W绬-ëjTe%B7S±ðIãËÌêGÞyþiªŒ—VY‘#%ôæU¶Å’÷°±3Ún7mZåé6§¢é|~ƒÈ)"¥4¸yX¯ i&WfÔt‹®ê þ$Rö°Y[Ro $}/mËêžš×?|_ý=QŠ|l*Ðì8C»hÞ=Mùß)°.@*e¯¾Ã_\Þ˜/Ê– + 5•ÜµÙY‰ ‹œwȸÞR¯?‘cŸîþEFÏ žLÔ'DÿPˆ¼hÊûªàöÛÞô?ÕiE¥—i±.ª¾®†TµójÀÀ¯%,^ÕbEzïÊÿ@w1E`R»ÊHMW÷5/J»\Ó°Ï(ÚP¥áõe­xf'Nq"Òµ¼©š¶lwmAUTLf "Ž,Òb*ÑšÙ²ªWõýí@ÄÔõ››‚JéU·PY×Û‚JeÕ[oJ±Åý¶Kîz¨7Òš‚ßËbT¼%bBËÀËêõ¦®È¶P-×›.FË͸Dø [ +ÅáÖAb^ŒÓ6ݤí’'fê|Udí¶®pç`ý¢Î‹ÛºE:Úk~ñ͵†nÀ!–Þç§ b°.”ì*‚ÒÂj&Z4bÁ¢[zo° +¡Qì* c¯}UT÷Ž“õÐœmÁKRZLc£Cv¸/ªÂy“¶cª¡ÙË®’Ñ^[® –&Bï|ÕÔØð"C#["xŠ–DÈRn¹uÃÊ&%ó{97v{PÊ‹¤òŽxÓÖì<´WÕ-5TE‘ìÛlIê9nðöFjý„õUˆ¿Yš£1´¿sçýh½õZØR•âÉÔaÃäÓ–‡¶DÁ=hTé@èø`ASÚÚaD[4 ½]c÷PZnq°°ÍŽ˜Rõ7ðÛË[Ø%D]§ +9$(Û}‹#–܈qøñø-óËêíf_=¸Ü6ž'6 Ó{õ}‘–]|Ù×w»-†@œð騕ÞÖ»ö põu‰85Ø5TÙv&7±µ†³€ÂÙaú8sùŸH–OíóGXo\ë¯Kc +zà£Ñ˜D¹ (”eEÓPΖìC€ÏúÙ®8óm2”1êoilL³ãhn\X}éY9Ó VQÛãû46"ˆžèû¢ <¹5@,—BYL‰ÒBÙ²n +\ç¸bŒ +QÜWeV¶Ô@é"4 Ë”Ü¢¶+nÖá©Ô,¡Í‚„ã#^ +g\Þ] ·P„§¶èiÒ¡X(/0®lNŒ*¢ÁhEwöäÀqR +´-þÚ +ú­Û™XéL(= Üáó²´ŽSYÿ}w«œªèCì|Å&åóEÁóô9X„¡Ièç·nÛÙFçò(@/Æcx/6ã>¤D7-o^öbH©íâElüÝÔ«•=öPŠ›ó—ôvsõ>;ÊM40²¥ÝõófÒ˜À’ß滿ì=gW¥Ð¢7¾R<å˜éœ—ûÇü’Á†p>ÂÐÉ·ñëmصmºO`€u»?†€CÄ]q‰½J–µ;<óXé¬Ç"{<(-íªXähCÂæ–úwÚq…Âøfß5ÅêBZ›rÆÄp†híf>:"1£$'!Tc¯5øÈœÆ$‚šè5gý@¼y€ø·f2¿X–¢`²vS_¸ô,Ù‡løº†…iÆÀCº¯VCÜî!_Vy±Á¤¡Â°J&î‚”„%2à ±F+¤„»æ¸¨+t-÷»m/n¾ÆüSó¯ ]Ê…®  ]Š + k`ÛÄaÛl)½P¦ŽN3@jõ.yʶ;fت|æâfՠ㳆¡ŽË¢Ç ݲ(½½?zœîÎ,ýâÑB´zªŸ÷͉Hhc_žýÕÝmE‘Ãd¢âH(@{¶>{ÿÁŸäÐò‹ ‰'ŸmÏõD›D(‰7Œ«ÉÍÙÏÃ9bœN,ÆNÍ½É 4Ew‰¶×"ÖÂ×抄øcõ`‘Áªt]«!ã@D¡ù>2Èï{ÕPˆöa3ÂM‘Ä߉/N"þ/1Ý*7îÒpÈÞ¡ãàØ#¦€\éÿC€A†ŠÁ¹¶gˆMcáì±Oø×ü÷ËùõëÅ?O,ý·1?8j¹¥ï3¿>·a‹_Þ_ž€À÷àßA Ïÿ†oûØwß9]¶eºê99¹þ(Ê@kïj×´Ãl‡o@±do@{Q¡ï`öŽH©¤ï†ä˜‚Þáð *N€ö« +v ZDäiÜ?Ú@¢ü§ÅP‘ðð8hu" ¾xÛ­;¿x÷û¿oÞ^Ÿ@í·qÿjûÜ_¼}{9?¿>ØïÁºlŸõ¼r¡o`]¸Ó´xƒ +¸å+VÆó Oÿž)û[Xœãn,ºòcÆîK®CÝWk}Œ:˜öæW€Î½(ä‚än¢0ËŠuÿæ}ŸØmúÚÊÃcÌ0¿éÿ/ÅQî†ÿƒáÃÆ„4Qh)]òæînø¼õXšÖËÒ”|ÂÑÃà«iü”&´§þÁEæ1¹^J*©ÏùØË^óJ}tEaÛ*ú}¯? ßSç`R†Ò ž°ÞõÛ_FuŸDÚSCè i†ˆ¤#«?È+•Dƒãé%’pŒZ©wÒõ9Ÿ„BóPeËm]Õ;{ÍÿŒ.^›ÅËi ½¸S>ß×µnè‰CA~ÏM¸Ïz}}/stV÷€€=0Õ±cîŽoÎÜ«–•½o”€À.ës„`†˜ü–ûf>ŸKj¼1<ÐÍkóp²ƒ oôòSÛB²CI”£ùA.©"שqÓ}üTd­r,Ãr%¡0ÁþëH¯ÏÓ3oK¡$©Þe¤fÃBŽÆÕ}Á—¨‘J‚ƒ/ ¯j˜qûÙ‡M8ã0‰ ùÑíêÆ>"@û" ºö¼þŒ'ͽÁÙĦÓû²HŸÊý’¸Cyø[Gþ1ô59™Ibô cÕùGç +8(´ñ"Zá:u&“½ÿ,HÂP[}DL7ã±ïº3îþN—½Ó®p7³vÊÆÝÑð%Ž}Îê\ɹ”«Ý¶è¼w°‘g2ßa¤O{ +oÌûeÛÝ7ô²ÎNÏá36¹2ü„j‹e½NyÜ»]“-Kw=È3´/@ûçf«?çñàLo„õöÞvBm:œôGXÏÚ|L‹æc^gû5ÿ4»Òšî zB¢€Ï}ó\Aâ-4²Á +endstream +endobj +107 0 obj << +/Type /Page +/Contents 108 0 R +/Resources 106 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 62 0 R +/Annots [ 101 0 R 103 0 R 105 0 R 88 0 R 89 0 R 90 0 R 91 0 R 92 0 R 93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R ] +>> endobj +101 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [507.038 768.718 521.161 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +103 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [507.038 768.718 521.161 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +105 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [507.038 768.718 521.161 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +88 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [256.856 682.122 280.677 694.566] +/Subtype /Link +/A << /S /GoTo /D (acn:AES) >> +>> endobj +89 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [138.418 641.475 165.261 653.918] +/Subtype /Link +/A << /S /GoTo /D (acn:NIST) >> +>> endobj +90 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[0 1 0] +/Rect [381.916 643.902 389.974 653.667] +/Subtype /Link +/A << /S /GoTo /D (cite.NIST:Fips197) >> +>> endobj +91 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [80.306 614.376 104.727 626.82] +/Subtype /Link +/A << /S /GoTo /D (acn:ECB) >> +>> endobj +92 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[0 1 0] +/Rect [504.007 549.058 512.065 558.823] +/Subtype /Link +/A << /S /GoTo /D (cite.Wiki:AvWb) >> +>> endobj +93 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[0 1 0] +/Rect [335.421 535.285 343.479 545.274] +/Subtype /Link +/A << /S /GoTo /D (cite.OC:WBspec) >> +>> endobj +94 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [424.107 379.517 447.317 391.829] +/Subtype /Link +/A << /S /GoTo /D (acn:SoC) >> +>> endobj +95 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [371.418 309.377 379.476 321.82] +/Subtype /Link +/A << /S /GoTo /D (table.1) >> +>> endobj +96 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[0 1 0] +/Rect [304.196 149.547 312.254 159.312] +/Subtype /Link +/A << /S /GoTo /D (cite.Altera:Avalon) >> +>> endobj +97 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [115.584 133.57 132.74 146.013] +/Subtype /Link +/A << /S /GoTo /D (subsection.2.2) >> +>> endobj +98 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [187.006 106.472 212.638 118.915] +/Subtype /Link +/A << /S /GoTo /D (acn:MSB) >> +>> endobj +99 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [356.635 106.472 379.245 118.915] +/Subtype /Link +/A << /S /GoTo /D (acn:LSB) >> +>> endobj +109 0 obj << +/D [107 0 R /XYZ 77.669 741.543 null] +>> endobj +6 0 obj << +/D [107 0 R /XYZ 77.669 724.535 null] +>> endobj +10 0 obj << +/D [107 0 R /XYZ 77.669 505.023 null] +>> endobj +14 0 obj << +/D [107 0 R /XYZ 77.669 360.986 null] +>> endobj +111 0 obj << +/D [107 0 R /XYZ 277.69 225.533 null] +>> endobj +18 0 obj << +/D [107 0 R /XYZ 77.669 198.598 null] +>> endobj +106 0 obj << +/Font << /F81 59 0 R /F97 85 0 R /F101 110 0 R >> +/XObject << /Im1 55 0 R >> +/ProcSet [ /PDF /Text /ImageC ] +>> endobj +141 0 obj << +/Length 3220 +/Filter /FlateDecode +>> +stream +xÚí[Ý㶿¿Â2PkÅo©o{½K±mÒ ¹E‚" ­­] ±%Ÿ%ß6ýë;Ã!%Ê–µ_îÛa‹”HÎp8¿ù ¹l–À›1“Æ2S3.L¬D:[nß}~—Ä&1I6›u…Åé+ìïZg¶âŸð2‰S5{˜ÙÇßß1Gká‰-jïoß]}“#’ÅFp1»½Ÿ±”ÅŠ›Ž©ÛÕì—èÃ×ßÜλýÇ»‡†q?ÞvCLãøó-ŸÇL É2 ³8“rfŒˆÉˆþõ|¡’è£ýý4_žFÌV¸ýMíï•ý¥÷Yðõ*(+û«iˆ_•ÿÍþ¾·¿ð‰Q£kœ¶å1 +7$#e(&ÄÝOs†íšEßÂ/¾·¿ÿêzš83‰œ`±€q¦œhåJw +C1ÄZ‚¬‚– ËÙwþ™û4Âœ1ÏRÏÛ·–­ëy +\"SÇhq&ãL(ßG‚ĸs»äÁR+h—ñ™QYÌ”ñ*˜¦Š3§†}Ù~T +^Qg_€÷W7[6ûP[5éÔýÿª_µã«v|ÕŽsÚqâbž§%ÆÄZg3ÃD¬Œ!¾o×eƒœËhYowuUT­«¯sW¨ç,ª6ºÊ¡ÝZ*7åC•o\«Õ~¾`**¿Ì¹ŠŠŠ^ÞÍy¹žûâ¡lÚboÛ‹¨ªéuY—ï 7p¹/–­§\Þ• ”1Ì|3Q4‘*okÇB¾±­S­« +:+ª¶µ{® *t³IuGFø ½iׇ†J–*P(khB]7u½k¨H¬b§kP—«bƒÂi]o\—~~0$v +f!jóeëDHú´.Ö8Ž”ÝR¥ýRQuUîCU»WÍa·CqÈ$roìRö«¶û9K¢¼jîç"‰pU`Þ±×ÝÏj9ÑFÆB1T¬_~Kf+ø¬Ç@óh[ngt3øfö ”t0FŠcè$Ö‰˜Z“,h«Ã™ u8•q×Z_䟬\òmq: fTÌ5¿ )Jã<ü\®Úõ)aÎÀÈdú2„9˜ƒÁ¾©®¾>¥¬y,»eÆ*9šò‡¢YîË‚┼`ŒSñ +ò§ºCÈD¾M÷¤¶ÒxŠÔÈP +,acʧ°§&),7LèÛëÈÍv§o!Y6¡k— ÚéZH´¬&ôì"T½ž…T¯çÒYÕ|Cªv pðû6>ȦãƒÌêÑ"hIVÑ›ÕM½Äú¡:ØêšJ‡Æº´›îÍÐݹoëÂÛg0îãö´ÃÅ‹ÅuŠ ‚ þ6\$°Ìzš 4ü°€©1.I°û¢)Ú `¼Šî\„t§pqš,Bš“°x€¹…EHõÓŸÕr½¯«Ôw,΀~nÓr,dÆ\‚å$²ÎßÆ {g õQÊçDâŒAl-¡x5¤UV Zêù²‡ +„Bˆ+aƒÈîa% €·°²¥²mŠÍ½+7ô\83Ä)ÖËv]ch‡•ªð¯» cÅ ‹Ð¢ÜÅXDæƒÂ)0¿t‘O± #ý¶ø +búXê'\-7q/ž³ÊTœø$áq_B ·ùy@¿’ø8¢Ä?é‹Põ˜PÂôe¨:L¨ÞP2$$8·-¡ËÁç£s9m1|^Ëf&X3¹Íyð«KÁ,F–š³ XèRØ|µDŒžSûvª\¥ ôj–÷¥Ë/£§OY¶µÏ<½ò×$áËÜ'0Ðk]/÷ ¼p®ßB*Îá™N³‰8ƒÐùixi+ñ±àÏ€ëu¤Ï€+$­&°u ¢¶B¢“غU­êÏdú2…Âý=yD(#ì +­¬ßåûâ—ÊúƒE&3ëNw#¶ÅÖzÚýà"Úæ;*Ô÷ô¤` +a2ÕÎC +Ñ]n +Ø‘(woÚ1·…À“œ¡=X:Ãq‡6ßÁا€9ãïíö¾¹?àf…ýÆÌX~Ľ€K…»‚žùêœó´Òò±sU[¶.Xv"-«‡¡Å(·»M±¹àFÊyãðb}950>ßb$XqΓ6Š+ö ãÀ`NØ÷¾w$ãiÌRf=ì¼y%{g HÈÞD¼}¢ ‰NËPõ$¤zƒÈå ÑnkÍj6“QQåV©75 ]5Ökוœ:öÈÛQ—Ì@ÑÒ´sµƒÀë˜I% pè6­mbÊT +“† dàø†  B„£ü˜$6}ñT„À!Â8`_¾>'€Å!öFÀ¢kЬL€‘ûT Ìá^¹]€gâõuÜãuÀÝ^/AÔãu@t¯¡êð: ŠxÕšð +þ)€,¾õ[ÿZKKÛ¶¥'¢úPX/BÌ`— ÌïèŸä±ÌD€àQ“Àc&XŸÈÃxg ‚T6~_,óS Ââ­NrâÄ°Ë$¬Rc©:•Ò„½Žö„…´§òÕ‹Pí R­§Î.CÖc,$ûÄ€ÝQçQxô„AeÒr»4ëapêºs <|¶k€]Aå>±ÅÚªÀ¤±ÂÏ«±Ps‘L‚ä+¼˜=wûä´/_‘S³©yÛö¯{)¾LN+EÆ×­Æc^¶ûâóÁe'ã |%ù3 ÉO¸¹‹í0ÄàeÈz †d¯âQÉ£ãM)‚8Ô! +¾=Îm K +èÀÞæËe±ƒfxô¡0¶JŽC¹–”ŠBÁ:Æf,éEªÂž›Tø!Y.m ìÀvyÕÐn´°›·ð´|`º +¦Æ›¢u£åÕÊ\;òc7ЈMèæßâ¡8mšás]Œš +pb:SñÏÿ½ûQ±âÇöÄŽëŽÕ +ªÛÐ`÷V_Jܲ·oVeÍ‹4S®‡~]É‚U±‰„;j×}%öÿéúÛ›gÒ£»hÜYkõrÝ=±V87æmÖJJ@ú“ÛìZ>#\`‚Ä^¤¸ûÏFêUTÇmԀꔺMo¢4§MÔ%¨: 5 Š‘¸Èttƒ§>ÉÃA‘©è®XÓµ@ÅžšY£Ï>«^»uà[õñóÍ?Œ_ÔŠ97]F]⎎›WÈÀ0§S¨TLÉÚ^jbÆYB¦£zWÜ>á]š‚o-ŽÉU´-mÒ€¡—Ñ7]$MMAhwÀС˜fc&­)ܾÀm±/]ÊSÀÂ\¼èDÊ_KS †ð—3‚=r ƒ½9ƒÕ +vN`Vü¯t=yi€=“=÷Ô_ +Nýßûÿá1dÊá‰_xé›®Ã@)ÁÀˆèãLƒ½! N —$Iômý2wñ-¾Ëw£zÉc +qÁÁd‹ð¤¤qýñÜ‘'¾zòt!Á?ãtG-‡³Í¦¿»æZUÆîöÚgçç Òì¬Ä°ˆê‹OÁèìÛnY4M¿Êø®]ïëÃÃÚWºîÝ¥PywÊÒA|q¼•Í¹îor­û«|ã6Òi®Õ‹sŒ‹„vè0ŠÅ´ö×ò Ô Èò@Â"}Ç=rÿ+Ï<¨_M%ˆy›—µopÇ¿®'…gêG1BŸZeÜÍ?c‘\ø5 þŽeFÎ%óâ‚ÏÇÍ÷˜c5‡MKUkžÂáí|³±~ë=X«Š¥0 +„Ø´*•¤ì¶ï²=Øë{PÞÕÃzÔîY.´C¡@@Âñí{>‚K¯îŠÖN¶(\‰ÒÐï7c•&…”2cuUìŠÊå¯P­«#¦^šò¿is&í”E˜7Y«v_o¨_`uNöH´ QmÞZÃ….²êWœL·Ú­–ö ¡çK™î‡ËýgÏTB=pz Ïݾƙ|ñwZ³Ô/ž>:èÂùn‡ò9s$eïNŽ‚­ +v!íЈøøÿnN\TfÀýOîb¡#×)ï<”÷L +¬&ijfq–šY–ôl2g88Ÿá ·–Ö@@ÀÑd¦I6²ÏÛ7„pC°.Ü@iŒÆL,e:ØåJÇ ï·-öN2[\¤bfã< %VËÍ¡ÜG£¥îzøÍŠî’ðow”@Z/H}6mŽŒ6¹á’ôÞq ÑE +6”g +9ª?â¶Þ¥ù=/šßWõ’ˆàÿ|™§‰ßhIbIÿC€.H’ì*QWÜ®ÊLà¿P™N¼tµš9·¶ÃéÞí!½$‰¬£‚cd82Õn×õ6wý~<4Ëuéü¬%iˆÁ[j˜¡ !‰éXtÑt \ïŽuöª½/ +endstream +endobj +140 0 obj << +/Type /Page +/Contents 141 0 R +/Resources 139 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 62 0 R +/Annots [ 134 0 R 136 0 R 138 0 R 126 0 R 127 0 R 128 0 R 129 0 R ] +>> endobj +134 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [507.038 768.718 521.161 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +136 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [507.038 768.718 521.161 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +138 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [507.038 768.718 521.161 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +126 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [345.104 537.19 353.162 549.502] +/Subtype /Link +/A << /S /GoTo /D (section.3) >> +>> endobj +127 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [288.13 343.434 305.285 357.264] +/Subtype /Link +/A << /S /GoTo /D (subsection.4.1) >> +>> endobj +128 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [254.056 235.132 271.212 247.324] +/Subtype /Link +/A << /S /GoTo /D (subsection.2.2) >> +>> endobj +129 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [172.257 183.139 180.315 193.128] +/Subtype /Link +/A << /S /GoTo /D (section.3) >> +>> endobj +142 0 obj << +/D [140 0 R /XYZ 77.669 741.543 null] +>> endobj +144 0 obj << +/D [140 0 R /XYZ 256.914 338.054 null] +>> endobj +22 0 obj << +/D [140 0 R /XYZ 77.669 304.145 null] +>> endobj +139 0 obj << +/Font << /F81 59 0 R /F97 85 0 R /F101 110 0 R /F123 143 0 R /F122 145 0 R >> +/XObject << /Im1 55 0 R >> +/ProcSet [ /PDF /Text /ImageC ] +>> endobj +156 0 obj << +/Length 3326 +/Filter /FlateDecode +>> +stream +xÚí[_sÛ6ϧУ4sbð‡ À{sbçÆmšN]o:M'CK´­9™RD*i¾}w± Š¤lɺ‡Þ$™¡@Ü]`wØ]Ð|Äà?qm¢8U#!u¤¤Í^|~Á"Í4KG£º1íváûntjoü/t²È¨ÑÝÈþüëw¼¦žÙ4àöjöâå‚Ä<ÒRÈÑìvÄ +”еP³Åè÷ñåû‹7³É³^0$ +t¯f5éžiüÿýȧI`)G’4Jãx¤µŒ´N‰ÿÅdªØøÊ^?L¦R˜1·7Â^½¾´WêOƒ§/ƒ¶²×„H|dŠ„_Ûë+{…Gœ]à´­Œ&ÒBÓIhC“‘t¿N8Ž›&|ü®bü³½¾«ßÔQª™œä‘Ê(Uni? +•ÔÃeˆ’Ö*9µ’ýä¯(܇ád‰ÔxÙÞZ±.&¤D¡®úx G©Tþ+&4,±°*T­`\*FZ¥WÚ› 1Jpg†MÛ>T +ºèe߀þ—×|t¹¶fR›‡£= +ˆ·ŽïÖñÝ:¾[Çuø-æsÍDˆ(ѦGhÁøßÿ`£<ûH˜ÛW;òaƒ‚£V£@«Eà ØD*IÑ€Ñ2RqêHLhêÌÈ +ú°.Q&Çåò®X~dL̳Âu}pä‹tY<^ßRouŸSÃÍ ZíyÁØò>³Óg7nôWËÕxYUyAƒPüµ§í¡£U ëÊ„ðÐ+ûàYE‰Ô~L8If÷ËÒÎÀs•ÒÄ‚ò‡µ[%‚ò2'µ7ô&ˆÙBÀ&å‘Põ¦VO(Ÿ®‹Õ·^¹ ™pÿBµ&êv±q1‰ÙøËD€òV{›a"àýÄn†éáÍ0bæ6ÃÔ›`•o­ådó|‚FÃès¼#tÐIÈÃ$G¹Srô[­ÛÅ0SÎÀÏYøzøi1¾¼˜] ãÏi|ûñ§ÅöºØì°,²*û4Ót žÝ†˜| ¶èpe‰öb=b³Í+=YI¿óo; ¶ÊѨþ´ä“66íAuÂÃàÙ¬²%zˆÕÄ»š Þ„`GX3c±Ì>&ôÂÖzaWƒ^v!6oÜÛûˆÄÐCQTÀ&‘Fš'Þ¿õS IÆ1A“E€“`ˆ ñŸùÄ¡£¢‹C@B&ñ8Á–“¦ňéSpˆ›(á.äTuˆÎ¸¢óû«ÿ~;†¢Ó8@Q‹q^îVà’±ä6„À_ky¶c nš9ï6,&ïƇäÝØÚónìj¼»—ð¶æ*€x=Ù­içèÌbÿO{›g‹A—ŽaÇn’Øg¹´y²K›\úhÃêº4ÃÌø9­ 0PüØ̮ߡ„̃Œ#;ô‰ŒM¯?·BzóyØ:on±¿rQ‚5.5¼Í+“DF=/¨T0@©ø<`®€(OœÈ!åy¸ÖšÙ¾ž½;¬ùÓøh¾Åv]TÛµÍQ…O6™«¬Ú•Ô¤‹š {)]„Æ|ý°Y¹M.á¹ F… F¹…»uъТ>¿Ì«l¹Â`Ao‘—s÷ƦÛ2w˜(#~ÀZ^¸®µ QãÖêk{}Jа B\/Ü|g©mvƒ©öÊO럴ùü´¿åšb(觚›rºµB¤…–ˆr¿Ïï–%f.}U[W'RLr·‚v +Œtk×´Ђ7µ|[Ò=­—`š!“}'M0¨ Þ=;Â`& Z6°˜{¯ +øÉñ­¯ZîV}áãy-±õllÖ+GdY9ékÚí–ÕÔ% )XM™n»R#‰Ž› Ã$WÅn›9AG6ŸçeIn—…iÂÇ™ë$ɠѤ'ôîÃz‘{¡b9þÏ}^Ѓ¯[?rYÜÑ»Öø™ïÉ÷oFûñÊ.ˆä¼.JAÓbÆ%†–6Ù…ÞŒ~œìrº…åR;k"0ö¤ºT, xZ,¿,»Ì‰ÒÈw:‰í¡\xµZã‚}µË‚R{óÈVËê¤ÌWïÆÏÕ‚¿U +¤ü$‰4b˜â‚õÂëµ#1ÏJ·`Õ›¥z5R ]ú4ÔЉh¡Æ«[ÔsEü+aS§7;Ù’ž»Ü¥ò]­)n¼Öþdî_¯úH&ï²÷^XYQO{¹ÈªZ3µm¶¶¨ñe¹Þ•ÀÃÔðH¶ÓÖ·‹ˆhA1Õ%Η -„wA<ïÈÝ&3ùìüX,>ó ÄET,¤Î;: cTµ8<:[TµØ^bÄâ‚•ÁÐäxö­# ?ïlHj€³ó¤Pb›$ñàçæ€ÊOáÚŸ?µ¸ÌŸÎÁÔ«;dzDöt¬]•˜ñç©\ÀÇÔa1 `ã`ê+=Q‘æ:¨•hü,Lk¥‡\¼úíÓ¯o¯/‡5ó݇¼¯1Š“6ä¨ éë’·Ïp Öìé‘­$³Pß»Ÿ —e…¸Óή@K×›^»6?T‚+îrdztÝù]¶]x!ëíÎM£p +{pI‘EG"‘íý͆ŒF©Æ¿×,Aè¡X·ë]±hmz.:„œÐE‡0j‘ï/tRI{{&>Ú:Æͺ?L¤œ“§._…Æ|·ÝR¶ +7­B¥ëºÝÁ†åØ¢h$…Dm]KŒá_¢Ç×Hz@j»Ò‘¿q/¶çØ'¦ ÚrA€ï©ƒ¶5aìŽ> yãÆìJŸ37Ç-pãσl»Ø;˱™äÖgÚ{ç2Ã8v´Cu‘ 2OÞ²€a ,Ïr´^Ä… $ÃHv¦5’…\¯ßÿòéêÝðÑ≬p,ä|U凔£)Qæ©©«ÁcÞ(Rx»ƒÌpSQ÷6ÿ¼ËKwƒéW¶Bo‡ŒõÚQØ÷ôhSEêñÿ~M #mêÒ>¬boªMUçmÙ-eš˜¯rîÃ=•°ºÇ‰v2ø¬XWH¶á*bûs™*éx>ʹóó¥sEÌøëLÀ&Õä¡x^À;T“?Þ8:>‰$ô3]QÆÏT”šË¹"µšŠNyÛþ²Åö`Hy¶Î![l*¢«xˆi ^I^àá +í R=AñJE©vñõ‚üYxÖj™^^½î)|püHW……>l'É6`¡hƒx+æ ¦kÇØ%@Šx˜oDž‰‰dR +å?té){¦¢Ü ÒDÚ6N^M¤i9®©×éšÈ“ÂÌÂL“ö„o¢þŽÎ+ûYaãÜÃ@†<§sÐj"!Lë WÖ½1–ïˆqe)Âà `ªz¢Wüú†>{±—Ã6èßZÞÒ€ÌM˜ ð^Õž°ÛW‹‚6#¡©„ýXºìB‹¤Ò“ÿ՞؋±‘nïáx,".Ó ãhRªžïN´Lµ.œ~(ÖAþ Rü&Yõäög`C°i®Âš(©õ}ÄÅuÄÜœ‚øst +KüSÚôëxÿ4eo÷Fßcݼ ¾@%ñ³À—«$R<>ø2˜‘ÐÁÚ÷ƒïYxÖà2½z÷\ð=M¶ð +Eû¾o˜bþ-ÀWõa¯€HÞàEˆøusA½$/߃_ìiðH<~!ƒ1iütøUÁê!Ç늸y]q§+<&5ö¤¹¥Û!Üå:RFý-p÷hïà.Rü\'ûBÄQÊ*ȧ̓ýØìÓa˜üKXŸÚšÖ1u-@ð·¬y¥Ú~Dv`ZÜHXCQOËOƒLL@@Ë€µFLk›áÞ÷Ø@šÀ†…ud„=ß3,íbw3ŽƒÒxý­*BK1°¾¸ÙõÃ|75*¼U;ïñÆAÁ|µ+—þðµuêÖ”êðÎæóa-­.hÆôÎªÊ +:l2ò}½ì-çR4èì¸qß,\øò;+¼»÷öÐÍýl÷”~> +FÅRº›Ý¯|±ðý®œß/¶ûJJBÄ-D·>V ›RQv½µ 4’ ìëq2 +ß°UÖòS–—Ÿë¹€)öeb˜ÿ>6\ú»Á@Hð%S/ßÿÓë¿rÖ=è +endstream +endobj +155 0 obj << +/Type /Page +/Contents 156 0 R +/Resources 154 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 62 0 R +/Annots [ 149 0 R 151 0 R 153 0 R 132 0 R 146 0 R ] +>> endobj +149 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [507.038 768.718 521.161 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +151 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [507.038 768.718 521.161 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +153 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [507.038 768.718 521.161 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +132 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [315.236 558.558 332.392 572.388] +/Subtype /Link +/A << /S /GoTo /D (subsection.3.1) >> +>> endobj +146 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [76.673 441.302 93.829 451.29] +/Subtype /Link +/A << /S /GoTo /D (subsection.3.1) >> +>> endobj +157 0 obj << +/D [155 0 R /XYZ 77.669 741.543 null] +>> endobj +158 0 obj << +/D [155 0 R /XYZ 221.367 553.178 null] +>> endobj +26 0 obj << +/D [155 0 R /XYZ 77.669 531.355 null] +>> endobj +159 0 obj << +/D [155 0 R /XYZ 266.558 150.138 null] +>> endobj +154 0 obj << +/Font << /F81 59 0 R /F97 85 0 R /F101 110 0 R /F123 143 0 R /F122 145 0 R >> +/XObject << /Im1 55 0 R >> +/ProcSet [ /PDF /Text /ImageC ] +>> endobj +181 0 obj << +/Length 3498 +/Filter /FlateDecode +>> +stream +xÚíÙrÛFòÝ_ÁG°Ê„1®‡}"9«]ÇÞHLR[IÊ‘ˆ2p 0Žþ~û\-}€‹UÀ`Žžž¾»‡jÀO-Tœø6 +ÚÄ~h’Åfÿæo?â ],ºÆêy®—Ù)}¸7t~.ôúñ’½Vn³Õ`·Ëõ›wï@Ä*?6Ú,Ö •(?Ôq‡Ôz»øÝ»º½x¿^þ¹þ×›AÜëuzæ?ÃÏÍ|p€ Uˆ@”ú©µ‹86~§¼ÿÅrÞ5=ï–+£Oч¦gBÏwôäþt0únÐé1ˆ?‚0þž—ô„!Å“.ðØ„câÇ:fhC3`ì~]*œ·Š”÷žÚûDÏÝÊØOã€g”o€ÆOC!í:Œº‰C2ø‘Z +f®³ŸÜ‘»›AÎX_§‰Ãí¡u±LKDêzn/­¬ŸšÐ­‰€b:kbù€Õ!ÌKõ"S_…±Á$ µ1ìÛ4†ÐÅ‹]úßÝìÕâª&1éÄC`¯À¿KÇwéø.ߥãœtk•oò¦Éב +…~fFÈpÚeÑŒyßYYÊò¦>nþ$â8¾`ßêpj¹ç1÷y‹â„]ÍiƒX, +哀Ѣ’ïJöœÊÁL +žÓjïòtlZA$7çÃÒ>‡Bn¶ùÖw2§c?H…—9­imzR¡!FIÂú„½õAä¿-ꊻ6YÅ“îeeÓfÝV<ÂòCEU´ª~œÑ*‘R¸ív¨—8…ˆoôLhóª›1'0&N‚éaø÷õgmHඛÔä{2tÐ „ ¸v¬Ÿt£â‰ÝPÚ¥ =ÿâxŒsdr$çÅ®Ñq¥“æN|D +â$Ä6¶jÒ?K›‚‡‰tøüëŇ›«9j€mVIç. ½G”NMËûÞçŽ. ÉjB—&m#¾Á»…‰a³:r<ðß8:–èîzç´–!3A +’ˆ0ì·l +F´l³ª>5¥ÀýZ´»yÊèÔ7F¹ã^]ÿ0kSR?Jºˆx=Ji¿—¢ëçÙqÉ(O-Ú#ø?¶Gª(ù˜?MÛ+b¼õR¡ç©F«¡;£ +.¬Øfd³`ˆwI•w8½ÿ*j²¿Ð3ft°ˆ­ë©ÛY®¹ùg%0H0ºx¢Lu,éáß Û羜-¼DÖl§ŽèçgE.ð“¾4õ%úÄ0õƒ>qçì0Î87æ@ú†ÒÀ=­; ‹œù´À +º¬êô3xF¾ŽºÍXß~˜÷NÝ…ÙGã+¨ñMìãá9 ›Oº´íHOÖKs¤¥ϸ½EÑ)áÃ;cà Zo=FñÙc^9 }…ѯ;·˜*Fby·ÿQ`uiÙ–TÕÆ‘³bÊa7G€Uû®ŽÒå-5(Øç ý=+V°[=$ê0sͬ–²É$è¦Ð²Ž³—áh¶Ý‚Ùu`k1y .D&   C\Þ<›W‚óè˜?}¾ýôËÇ«»3N;Ò#në(±QS›ùñý=9‡wwÈẑyÀ)üuuÂ(¦ãEhÆ*Ð +ªrÀ×6ÿ#tEa%|vÖtœeˆìîfž rª vùpýñÇõ?Ï }ÜñZ£­,æ±,Zbu±¸n³ã–¿Šêwõ'6{ÌQ¿y°ÝI MÐ /äøAKÈã·\tPúHÃQ©f7'‡™[Ç©ÙP0•}.µ#¹ypcf'œS°Þ¤†¶Íy%^ [Õ¤&7WæÕc»“šûžX| ÀAo1ÊÚx´O,dRRÛgKfÏ*d]V¼yZ +Ϻroî胑Ιú°ŽÓö5'qä›>!qÆÀ…{uõ–;Š‡‰ +yÆMg¦ú<>Æ6“¶ÇKå§aH— `ÇÁéĆ./¬ŽY_ÉEÈ +ZºãÉ…ë—ù.#·WÔ§ãk¯B.Ÿð~Ba}ìl +’„ÞÜþüùúãlBlqb—6c ‚ ‰,Øètƒ¶ð&@åØgŽzÌ 6…+øªè¹4 :‹¨‚x3yÛ)G‘e”Ï2'éªz[8O0e½1ùFŠùIsLÚàáYÄ'†¢™ à¤ø˜wiÝô¦¦)PÙ K¾‘«æP,ì-Bc +†i#ÛýÒdógxùÄY¯w|7}zÜáuÞK6x˜X†ÑËf !Œyå-j”ŽnQÉ&Ràmd? ûÙªØdt­Cö×0hôJn"ï +û +OöéöŠgÑM7ÞGR„f{j Õ2ŽÃÃ~ƒÉÕN$W¯ƒË-vò«Èø6Ð#W¿ÇÔ~Ë7;”ÃrËŸ|¥âŸFŽ + çPò%r䮸C.‹€8R)âä<ß:RkpÅ3èîˆVËõL8H2qÜ%–LX +c1„¼àŽC† ŸÊ:ÛžKÒ'“GEa¦u7}ÐÀbUŠlDÑ{AWq0•_‘!¼K#«ømù5b°ËL„•‹“¬(ZŸ3ÐN@ÈLj~79z %eûÁØ™zÕNdó f6‘_á› +Hé}ʈOƒª›9-±«ÈZÝÏþ°µu¡~Q(‚“ùjzì‹fèÄ4,mÅäòEÙÙ¿jtæŠk.gëKF¿$pFc#mÜIÌaPî«pVyÚË +²š† +øz–¼œ<ÛìdéðþI#w7RãŸY¨Ø“rNzû¬Â(vøînÆŸeoåÿ_khYyä7æC¸pz„†‡…×ÐâÓ`Ëò‹éÑI·Žù?18é"úxxN-U2Ï…Õè¶dtC°Îq„67ÀûE?M#qYt½Ú|ÎòæóÈIÜÇâÞ_ËDþŽa½À·RèƒÁ•drA¾ Âwšr’…Á¿âöÅï Wø¹{Ü9Ç€eXÄp;‚ +žB!dç¨ê}&ënOÍfW¸‹`Ü2|­-X^8›íëwÎçW¨§4×ÇÇéŽÿã +endstream +endobj +180 0 obj << +/Type /Page +/Contents 181 0 R +/Resources 179 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 62 0 R +/Annots [ 174 0 R 176 0 R 178 0 R 147 0 R 160 0 R 161 0 R 162 0 R 163 0 R 164 0 R 166 0 R 167 0 R 168 0 R 169 0 R 170 0 R 171 0 R ] +>> endobj +174 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [507.038 768.718 521.161 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +176 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [507.038 768.718 521.161 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +178 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [507.038 768.718 521.161 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +147 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[0 1 0] +/Rect [173.713 671 181.771 680.766] +/Subtype /Link +/A << /S /GoTo /D (cite.Altera:Avalon) >> +>> endobj +160 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [352.159 456.831 377.18 469.275] +/Subtype /Link +/A << /S /GoTo /D (acn:FSM) >> +>> endobj +161 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [427.988 456.831 436.046 469.275] +/Subtype /Link +/A << /S /GoTo /D (figure.1) >> +>> endobj +162 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [76.673 429.733 93.829 441.925] +/Subtype /Link +/A << /S /GoTo /D (subsection.3.1) >> +>> endobj +163 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [130.945 389.216 148.101 401.529] +/Subtype /Link +/A << /S /GoTo /D (subsection.2.1) >> +>> endobj +164 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[0 1 0] +/Rect [259.61 391.513 267.668 401.278] +/Subtype /Link +/A << /S /GoTo /D (cite.NIST:Fips197) >> +>> endobj +166 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [285.902 291.978 303.058 304.421] +/Subtype /Link +/A << /S /GoTo /D (subsection.3.1) >> +>> endobj +167 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [357.805 278.56 374.961 290.872] +/Subtype /Link +/A << /S /GoTo /D (subsection.2.2) >> +>> endobj +168 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [392.776 264.879 409.931 277.072] +/Subtype /Link +/A << /S /GoTo /D (subsection.2.2) >> +>> endobj +169 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [466.081 165.512 483.237 177.573] +/Subtype /Link +/A << /S /GoTo /D (subsection.3.1) >> +>> endobj +170 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [404.691 138.282 421.847 150.475] +/Subtype /Link +/A << /S /GoTo /D (subsection.3.1) >> +>> endobj +171 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[0 1 0] +/Rect [465.29 91.558 473.347 101.323] +/Subtype /Link +/A << /S /GoTo /D (cite.NIST:Fips197) >> +>> endobj +182 0 obj << +/D [180 0 R /XYZ 77.669 741.543 null] +>> endobj +30 0 obj << +/D [180 0 R /XYZ 77.669 724.535 null] +>> endobj +34 0 obj << +/D [180 0 R /XYZ 77.669 343.587 null] +>> endobj +38 0 obj << +/D [180 0 R /XYZ 77.669 234.394 null] +>> endobj +179 0 obj << +/Font << /F81 59 0 R /F97 85 0 R /F101 110 0 R >> +/XObject << /Im1 55 0 R >> +/ProcSet [ /PDF /Text /ImageC ] +>> endobj +193 0 obj << +/Length 1147 +/Filter /FlateDecode +>> +stream +xÚíWmoœFþî_ÁGÌÞ¾²ÐoçÆ®Z%­j£~I¢ˆÂÞAÃÁ¸¤÷ï;ûÆá3©ò¬“–ÙÙ™Ùg^vÆ&† ˆLÏD@™D‚¥Ay¸ùrƒ‘ÄgA0ñK–ÖwÒ™Ùø/01JE°Ìç—âîŠýeñⶻüfóNd”ù. )A‚ÊT^ïÃ7Û‡<ú˜ÿvƒµi°{ŸÏ¦WÜø~^òÇ€8#@’¡Œó@J†¤ÌìýÛ(8¼7ëS3š†Äl¨YS³nÌjùÙât³ …Ykâxaøg³Þ™ŽˆÚj· +ÆI*mŒÐ@b‹î¯ˆh¹8!á[Xiø‡YŸ5%Ê$6Î1‚$¡L¸Ð~ "™—a@ ‡X-$cƒì_5¸§pŒ#š¥Û[k¥€Rƒº_»‹Ž2&¼Ž„ˆQ !¦&å‹T Ëh E†ˆ¾ÓTPâÊðB›C!€e•=üͯ¼éM™ÌåálÇ ã¯ÕñZ¯ÕñZß«?b®G +£(I9 +MŸ«þl6ÏY†¨Ùò Æ_²¸€]_0—a*Q¢0Â(dñ{eH8CèØPžØÈ<4ûÓ \t~‚p¼®™ïi*<ù®(ë¦s›~g¿ª+ÐÂáù85}g™EWY¢R+§Ç¡/Õ8>Üþĉ@‚èqœ"Æ,ÆcÑF›É,œj5¨]6{›Á©øQªÑJp|Åó§–ÑVN$v_žËÖ Ÿº©i™ZYÞ Ÿ–F^¸d,Ž§BŸLÅÉe˜ƒQpœ‹ C‚»ç?ô§®²¨õr4T°0©bœÀ»ÊÒ¢&›NK¨‹¶© 5Õ­>IÂQ9Mn?S}=Ռި::;ãóoßµgKuJUþâ¾+Ñb7©Á’Ç>""ü€>ħãšw±ª&ÎZFYÝÒÖ7B)ÂÂe=7šInïŸâÒ$[ïÊþp> endobj +165 0 obj << +/Type /XObject +/Subtype /Image +/Width 610 +/Height 683 +/BitsPerComponent 8 +/Length 47094 +/ColorSpace /DeviceGray +/Filter /DCTDecode +>> +stream +ÿØÿàJFIFddÿÛC + + + + +  ÿ «bÿÄ ÿÝMÿÚõH%Ö€ÿÐõHÛÀÿÑõH«jÿÒõH«jÿÓõH«jÿÔõH«jÿÕõHkâ_ÑŸ¬ÿÖõH +ü•}a+*ÿ×õHÏáz¬YåpµÿÐõH¿˜iö‹JÚº€?ÿÑõHÙYýj×õBÚ£ùBKJÙyeZÐÿÒõHUøJÖê¢Äýt­B©òÇÜ.½Y.´ÿÓõHT¨AÖBÍ5O§ê¿X ‚^õ ÿÔõHŠÏܾ«´Ð +¯m[ªËkêGÕh–¯È=i£MÿÕõHjŸÊWE#óUÒ¥jµòb»T­›ËùWèz>C5„ë¨HÿÖõHZ}Âô>L–CUšø+ôÓë|™Õ°:„úõ ÿ×õH1«­À2®ZЕj¡_Ïö>LÃîÊÿÐõHcú\¨>O­ò}j®¨M'T|ƒ/Ô_§êª¤ÞŠÿÑõHd°“rº. ÷ÈH}w\ªW@¦åt\ê¿Ë¯[ËpšÎ´P)ñZ(9úõPÿÒõHeZª䲜£åcò]VTBü–P «UšÙl Vi7¢€?ÿÓõHcû*µ­eZ¨5°uüëE°ÿÔõH`žš/–½2­TäÍuPf­(ÿÕõHeþKöÕäJÍçZU€Î´PK§ý`­Rµ ÿÖõKäÌzÙ­GÉT:é}@eZ¨ìGæºÐÿ×õNTÕ@äÌ$4 2­TÇöü…ÀÿÐ×íV7!+ {­}P©®WV`° +Ñ{Z«Pœ¦øýuý*•¥ÊµPÿÑ×íV­k­–B¿ÊáòÄê þÁ`\æàúß'/­ÕedºÐ +­¨ÿÒõNTÕ@äÌ$4 UV ŸØ,Um@ÿÓõKäÌzÙ­GÉT:é}@ª­@’ë@Um@ÿÔõH9V«ø}ÃJíYØ +¯[(eZ¨[PÿÕõH‰t_J«ùÖÊÍt Qf¬ªÚ€ÿÖõHVÔ#ò +«¨ «U*Õ@Uµÿ×õHVÔ±]jUõõ9uùZ>C*Õ@ʵQ˯ÈúþNRVÔ?ÿÐõHVÔK`ëTù~­ƒ:ªrë-`ãpδP0Y þ« Ëåµ&íEVÔ?ÿÑõHVÔµŸêªüßPVªUªÅrûþ°VÔ?ÿÒõHVÔʹj½@VªUª€«jÿÓõHVÔ|™Wת€eZ¨Vª +­¨ÿÔõHVÔY˜=©pUbbŸ$‡.¶i©Uª€«jÿÕõHVÔ «·ê½¬RªÂGòêÒ¾°ÊµPUm@ÿÖõHVÔ3¨û­€ä Gê½U^7Um@ÿ×õHVÔgV *«T›‰X"¤.¹ÿ)ÿ®Ÿe•¸9cû+%Ö€Çí}nþUK…~YÖËÿÐõHVÔR—Uj?—Õʾ•úþH«ÖªX$,¨ü«ecû|ß+LÝRÁ +õõ•ÿÑõHVÔ)ôùm(µŸÈj¬ê×4VÔ?ÿÒõHVÔüèu–’¿Ôåe¸ `UµÿÓõHVÔ#áU›3ê°gSv [PÿÔõHVÔVÔGæºÐVÔ?ÿÕõHVÔVÔåŠíà +­¨ÿÖõHVÔVÔËÜ:€*¶ ÿ×õHVÔ_ H •m]@ +­¨ÿÐõHVÔæßµ5R«ú¨Um@ÿÑõHVÔUj‰ WjJÝYêà +­¨ÿÒõHVÔ,Ó’×j*•JŸÐ,ªÚ€ÿÓõHVÔ +}+ZúÀŸÐ-ü´YVÔ?ÿÔõHWËõ\3_«å²×úÇê?°)ñR«_Ÿõ¿“•S¬´ÕÁŸÚä3O—ꊸJÕR¼¨‹‡-()WPÿÕõH>CåúŸ/W×ÆÁ 4cú„…~>CåëOµõ|¾I¹§˜2ýêVíõ}|‘òù“¯+(eZ¨ÿÖõHVÔJÒ¤uZ²ç[¨šÝe@ÿ×õHVÔ–uò:¹y´YP§Åh ÿÐõHVÔVÔR¡5ÿÑõHVÔVÔË*²Ý@ÿÒõHVÔVÔ?­k_XÿÓõHVÔ*ëEú¾»n>B©!!7*E§è ÿÔõHVÔkÖB>mO¸|Šü¯i«ý~ápÿÕõHVÔVÔòf +hÿÖõHVÔªØBHi}@ÿ×õHVÔç7¶t‹½ÍÿÐõHVÔÊ•äʵS¯k¬©šÇõ½ÍÿÑõHVÔ +U}Öí4òR¡cóOPJ€ÿÒõHVÔ#ò[ÕÀäÈ.·PÿÓõHVÔ1ý€Ê¡~ù +…ÿ@¥R­U«-~ë¥.´ÿÔõHVÔ)Qú*´ëÛ.¿,¯×ÅÚÔŠËöPÿÕõHVÔZ$­îT9gõù½(ÿÖõHVÔ*%jäúøýqýyor ÿ×õHVÔ:¸]@?ÿÐõHVÔYÔ†”ÿÑõHVÔ|™T† ÿÒõHVÔË*ë¨uÿÓõHVÔ/Õ~°ÿÔõHVÔ9q¥Vµ PÿÕõH!sþ®¼šW’é^ÚšÿÖõHcóz(rʱ¯JÚ€ÿ×õHÇõ®¿`ù]lú®”ÿÐõHʵU*µj§­wVUª€ÿÑõHÅvU>Ëò¸ü¶¨üëUÿÒõHåŠßîÏë[(?ÿÓõH)U®¡u°ÿÔõHÿÄ.06@ P5#$%!`ÿÚú*÷3TÙ}WÿÐú*õ +Z;ŸÕÿÑú!û§ê¿ÿÒú!û§ê¿ÿÓú!û§ê¿ÿÔú!û§ê¿ÿÕúb@\•@Þ=0ñ üQ~§ÿÖú¬*Áž[2 â¥,T¾õÕ‰4 `Z}Oÿ×óÞU.+‹{c9zMÁšýdŠm JB&“]&“]&“GP+ÌuúÝ`úö+0ŽÎùf)m*¬_KÿÐòž½º»‚§×n Ð/¯Á¶ö–­ü¸·sFÊ)pž/¢ÿÑò€…žïè{FÙ×Z˜”‘ó’«É\5—ÙåX¯_îX•`< 3 +vÇσY­ö 4E#ÆÔ±a LÛ¯wßÅê!,K‘=-™B@tÐ8/ËÖ4(²«}‘ÿÐøØrÊÖõh¢/åùp~W¤eÁ4þ–:ú¸°­yr‘H+ã$¸CŒ’á>†°l^•ø³áuù=D%‰ue¡ ŒÙqNTîx€´VóS|VÌÏÿÑøòÒ,&@CØÇvíÁ|KX­ČʷWœɽ^ÐI)j!¶deº“f=”áKƒ+Ž¸ÊÀ¤u–•¢Æ;¼M”‚ZÅhÖ?…¸c2[S÷_r¤Ûü#jöyœ´1ìG92äI¥Õ<ÜÏ›çf¬e¦øƒ2Úh”Q]xƒüÁ‰^'ÿÒøòËþŸ Ë?¤ùkâÍ/¬¸q’%«ñ[CI.ãëÂ\8Ë¡ +ˆáD*#…ôøY +®hö&ú¯ú<Äøp—2èB¢8Q +ˆátYQ(ÂÈoQû§sÿÐÙ¶v·ÍÕTÐIn±6äŽx?ž4ïé”Êu£2¢}«d™A(âÿUÆ™X•PŽ@"ŠbøQÅ îÑÎ +U³þku̳eT߹嘷ÌØì<(~(¶¿óøI¢ÿ6>ebUB9‹†dËXÌF¹«œFX Cü¥ãê?tîÿÑÙ¶v¶ÃºðV±rÒ•ŠÆ¢9Ъò³§Š, ‹býàX{ïS,€ƒH¹”¢‰0mÝ;ŸÿÒÙ¶v¶Ó:GôÈ5Û5$E.ŵ~ð,=÷¼?tîÿÓÙ¶v¶ÙB@tUÙW0_Ì8•³~ðÿÚæðýÓ¹ÿÔÙ¶v¶ë5B9dÇÑÃ_=m¢³jÖ§V$Ñ×úòí~ѬköcNÙ„ÿŒ¼Ì®A/íÆ¢æmjiz±&‚`+(¶ƒÿ½Ì­áû§sÿÕÙ¶v¶õºÕ^‰w@àf«<ªv”É)3—ëŠïºM&‚^*ؾ]&“Fòò¸|¿¯‡RWìáãî¶Ðu2U~P¥Àtoþƒmáû§sÿÖÙ¶v¶ã»wZt™Ï´²¾µ7„PT%ü'’ÆÒ­ŒRá<^–¦žË\¨(⊵¼?tîÿ×Ù¶v¶Ýñ± ¡®[ÒÓ$ã dKd-"Îsß*±ú\#cá®'MÕßy(±+Ü5g#0H^ÖAü_‹ s²o$FaÄÎzt¢ƒ¥Ä–/IbÂx” Ò7K¿Ïi¾Áç´_˜Z1[vqÃ#Lœb²xÍ-‡;†,R­q‹Dz~%g ÿÐÍž\R¤žl¸kÿÐÙ¶v¶ÝÅ<®ëè-0:ŸÒÆ!LÅIž*®p@zA˜‚ˆ¿$­¤¬°ª+âv!¸Ít +b-ßU2SÏý/¿U9¨E:<̧dÒœt +8¼\Yèy㫳ù¶k¥W^Y·ÍE{wLpÇ2–~{ƒec„§¦™àدÇ‚Ó¡QTþ6°©Ç™×Œ©ÅÍZÕø­ƒ_ÿÑÙ¶v¶ãº°Oe”ûEo5¼ÄFÃ?½•ZxÝÏyÄJT§úß± +Ux%Q¾?tîÿÒÙ¶v¶ñ«ÅeëuƒëÚ­ ëÞmbë®å‹Ró2¹ ßëÌuÕ‰5Õ‰5Õ‰5Õ‰5Õ‰4UÕp~Ѭk>` ž2Yç”°\ —¢I?J* ‘eðƒl<ÁðîÏÿÓÙ¶v·ˆjñYEÒi5Òi4Ú²ž3úM&ºM&…¯+}›£ò‡X¯AWMàÝ;ŸÿÔÙ¶v·ŽçýŽÙ玬:ŠÌÚ“àÝ;ŸÿÕÙ¶v·ŽçýŽÔ²áQHG1Oð‡îÏÿÖÙ¶v·ŽçýŽÌ²á_óó,¨¢Â¼!û§sÿ×Ù¶v·ŽÚÌžCÂ`+(¾mÝ„8„?˜±EEáÝ;ŸÿÐÙ¶v·oQÁ—–ª8(§üŸÚ`K:z±&•âÝ;ŸÿÑÙ¶v·†]­0:ýŸ]Ï]}¡­¤Ÿ®¼þÔèkŒbëí~ÈX>¿×˜èRà:‹€:‘½¾dP+¸øÃ÷NçÿÒÙ¶v¶ü²áRß._öµ×ëu„hJ¢`vR MË”Nç–§œvVUÍ'~¾ÁŒ?tîÿÓÙ¶v¶õšÌ=h0êG¿$Q  +æô°XOÎÃ_;…­¨‘~ÊN>‚`+(¼!û§sÿÔÙ¶v°¯³–%ïrÅ…Œ}ý†u›šø­œ–¡ÄòçÂÈ®srWt +±ÁM/ºz®‡Ü¹—énÃüÖÛ•|2ñÍ›¡1Íc©cá4Q’,ºi”¤±þŒ’³¯…Œ ¤øS0œ‚…$9?K™™é|ójŠN÷ErÅ„ñC ª7/z­³fCZ»<åZ.#ûÓEJZû~?Ó(lçé,‡öV ÇÅP2.&ºÎcŒy`ÇâQnÜÿÕÙ¸ÇÂZ Hƒ^pé"KÀgH°´Æqjëƒúè,⚺ ’œbb¨“ O[.%ÖžxíÓåó¶WÅIæJrÙf*0ç8ؘNDÒ2d³Š‚ee„dd늈“Ðç*ˆ"sJšbÑZî ÅéÍ+¸’Æ÷š-E_¿JB2–Øíp%«®®èÄ Ÿ©ÕŒL§ùI¬"Å'g…(Cäq€”êºæ3ðL&&\^à Q¸¨ë ÄGÆ“ÿ|íÏÿÖÙ¶v¶ùtÒ•‘…ÿ‚ü‚`+(· +¿&RÙ­ÚÏ—•ÌÃgÉE¤j®‹¦‘xW7¹ ¥&]¹ÿ×Ù¶v·,XO.]£aŸM¿^ãoYÜ‹ Â__´ký£X×íÆ£æJrëí{í¦m{u¼ýqåÀGJ +UøÖk0õ ê© +]ßÿÐÙ¶v·Žçý—aµ ƒUšÉ™½ÿÑÙ¶v·Žçý“,¸A–²žK^ªŒƒÀÿÒÙ¶v·Žçý‘a¹ˆŠN5¦–î"‰0xÿÓÙ¶v·b›ú +ÑV\Á°àû<2‰Q/øDºË<åNÄ©I5üø/1‰P· +陕윹ü®¡á:µ¥NT/nŠÐK„‹n«Õ…õq|/ÿÔÙ¶v·vs¸ŸM¹!&–+ë bœq}E º´Å|’ +p%”ŠaˆV“42¨YÔé wLSš´¡Î¿6w•KŠ” E“:ýM]f/ÿÕÙ¶v·Žçý‚Qpwþ 2ãTlîUi@KÿÖÙ¶v·ŽË˜õÒ +Jø»Æß“ +,&[l—«bÊ(°‚/#ÿ×Ù¶v·wC¹e¡¦ö*¦ÛKºeRû徺VZV”±yÿÐÙ¶v·ƒ,¸A·ªøpæ*¢bŠóÆiz†Ï®¡³êØ…í­§PÙõÔ6}u™Áê;ì?È^dVÌœÀ´ø2æ"5ùÆöÎ㇕–•¥,^wÿÑÙ¶v¶ó‹Š¤“û徺]Ó-EËZö„‘rÙvJ :^c¨èVbÐ{È ‰’ÊX "‹ô?ÿÒÙ¶v¶á玬8òyyŽ¿SWY‹Á(H€ŠIuí ´Àê ÿÓÙ¶v¶åÚu{êýhYY¢¯®—3•}¦¯"™§Ciƒ 1ŠA–ã« VGš³ìëÕóƒ 'ÊA £•}¦`Ó9Fñ‰zÜ8f¹÷ÐÿÔÙ¶v¶å±¯×VmØ6ËÒtÙLÝšl™*ŸÆhMf ‡s^êéëòÌdjËU9@ðê01–tŸÈ˜Ó áTÿTâ©üf…V`œHÐÿ’½µ0¨¢6Úïè?ÿÕÙ¶v¶í†°¾Ð/öÊç¯áA(-i½,¸A¼ÁB¹9¶=Å="ÍúÿÖÙ¶v¶ü±a2Å„ñ:åÈFÅZ©%^Å]UB_¾ÿ×øZd&ÄäV²áQY“Ï,²áA0”A0”\,ÉøÄ-…YÓéê!,K© 0_½ÿÐøV¿ûsôH$'W‡äc¿â,¡;Œ¨ŽåÖ20âÓÐ?ø¹•÷¿ÿÑøX2Ê£kŠ\'ŠXøMG+ã Æ “«“Œ«"QX8Öá>÷ÿÒøKÅÀÔ)köÅvh¾Nn«ÕèjË+1Ÿ}ÿÓù8§*w>«Œ½ÆÞº†Ï®¡³ëó.'k£Na¤è×àûÿÿÔÿñ¿ÿÄW !1AQ"02a#@Bqt‘² 5PRb¡Ñ$%3”±Ááð6CSr£ÒDu‚¥³´Âñ4ƒ„’¢U`cTÿÚ?ú nS/¬²Lé‘;«ìú/ÿÐú +SÑÃÞ:i+]B …ÔŸ¹4ωú/ÿÑú +ðô8ÞûÿEÿÿÒú +ðô8ÞûÿEÿÿÓú +ðô8ÞûÿEÿÿÔú +ðô8ÞûÿEÿÿÕúSÐdH&5;»:Ú¯vŸP³m±yÎT¹,ÊT +³èŠ×Š¶Ì³´qíš6Žš­TÞO¢¿ÿÖúLɼ¡Çy=¦Ý})PõVËmËÖíqµŒ*B¤6A5´µÊ›A‚T¨Î»%¢5èü³ËB–ùæïýi—ÌæG—ƒµ°t/žŸDÿÿ×ñÃ9>xÿD‚ÙuÃÄe•EDî²yÍíB íæíJÆXz(Í'¸ÛáÊ©Ž23(ŒºÿxW-r¶9H¼džÔ™RV\_ž„y¬–‘tCRS½ÖƒŠöª¦ß3]ÿª£ð·Ì×ê¨ü-ó5ßúª? #ktÇN +6eíÁJÛót‹Âç¯o˜ËRvœ+Z韶ءò…¹©o&ãOŒ(GÛq="i¿yµ/~N¼òA)ÛÝJc5ËÁÖ SyýöWÅó[¤êŒÒ½Ùá9Ó1ŸÐ¿ÿÐñ§&ÍsIÈÚYú£¾Ê]èë×Ô »ã¨m\&¸×»^É­ö-]ñŒ“Ú)í+Îu:ž°>ëJ5$)3"œ‚)wé¿MÖ +ßEWµÍT$^¨[9S¦NtÏ¿RM,‡Z\mcV“PG ÿÿÑñ©×‹ø^ƒtžk$m²+U+¨9iÃêü1`má·k.ø˜ZœÚ J”ϨŽû_n¸ì.÷Ç7m•P¸ +íÕXôN™ñ²^^Æ\ÊžÊ m¨%*q[É( +s¥½.×Y)Ls)%æ” â0b¥*šW/Âלµ¿wህ8ØæŠðÀ#ö¹gQê³èœ¨ï2‚Ó¬4[©éb«J'Ûh c6óŠC®Jh¨$Ô¼]´ýCíî³î¥ØíAÏc¶„â:ê +ônÏ!‘.I3nÖÔ$.2¨nQK–“˜s*šnʶy»ÞDÂÙâaöÚSxÈÍu%d&€V›Æ~I±vð,ô‰Ù¡¶Ñ ©¡5QÔPÓ*ið-·—X¤(TÂ×'V¤óf‡;€œ9ìT£ˆWì«,óúÿÒñtsÉ‘âcìíÝÅæ­”êïxjJw4èq^ÄÔÙ +·x)Çp¥ Œé$ðìÚù€¶d@çosèÌÏofòñ Ý@S—¯á"OÆ1œD˜¥F”q'Ù¥Fygk¿›)I»Ñ ”’á”Í69æM~Àqå™×[L6Yaƹº’°H*9â9Ñ9SDwÒ×ÍÀÝÛ*\E›ƒ#hÀè¬ÐÆ7š×¿A¥¦4ÍÝ É”ËŒ† +›ÄŠ¤Š“Ž”ó­'Èfë}C7–ûiX¥rQáhåý?ûI£N¹%½ÏLû©ÔÊy§6r]£ œõV´¦‡#ê´y±Ž˜XZ{ûqÒÌÉeXÙyÄ*”¨9…èÏ'/ ¶´Ö•#iÑ$xd.¨¤ÑÖ“ä€xŽ;÷‹7p_îcuYB¼OfPú§íÿ< +¾P}†uËH‰r¶*Gš™qX`•”‘R„“Þþ+1À’£ºÈy5"ã–¤lïlÒu­Ã-M,‡Z\mcV“PGÿ×ùRîþO),Dl†Þ¾rûIho4ßû*“l0c%RŠ}Y¸­7ú´uÆ''c|y;E)£àèÔ/OUwÅ„þPÊUë&¸‘1žÎINý7ë¼uœ®ÿÚÂ?)ÈS[ÆÒ³v~°ï³wþæ7U”+Äöeª~ßóÀ«å©™,·!•v›u8’}VB® ÎUÇCRÐ%æU• (Q×Oe™Eít|j.éé+MíÓ\µÈg``NfB¨U³‹´©IÌxÏÿÐù#“Ì=!ˆ±Ð]¼^b¨9¦ˆl+C\U îÖ¡%¶ÙàöMžÆüûó¯¯åóm³|çÓc‹§‡LTáðºÊmo3M£iUTŠéQ»áO{*ìÛHªÜ#pÈÌX={)Ë–èèþli^ᇵ¬¸ãÏSÉã@;‡˜ð;.[©b;CÖ­ÖÿH¹¹6ë?dH•_nþÑƹУ·‘ä¶5ÝSÄå¯ÉzZä=%ÅŒ(á£)­hŠÝ^8SÂËqNÎ +QÄpÏ}#Ø—UÊ?õÌúz˜·•ØEóam)YmS½¢k¡üt©²%%µGr¥·£¯´Óƒ"“üðë i±Û’Éò\n¨àsÖÊrà“Ρﺦ¬á“à—äÙñ©&Æï—Šë½Pp.$¬ºYvU¢µËyáâÿÓù7ÕÒ¿ÔÜ3⤑Ò$QÞú’4û'ªéþQ9t AhøWIÈeÿþÖjôå1fT€Þîä£ÀG®º“ˆÿ9ÐSÄyGþ¹‘ÿOT9C´¦ ‚½ˆ€*¡…àž œüýäÙ6´¸ÚÆ$­& Ž=hjðˆÜ”ŽÉWi>c¨ÐYJÆ÷)nªƒý-š¨çÿôËùY¹°œÆÒ² ö~©ïñÿÔù7T–ßÃ|Å{jÃb¹£Ê +¡I§®”ãi1/Ù-¸Ùq”a  {)ã‘:Ôô|ýCwMÄ–o Ùg§SV£$‘pÙü“-ù +¼oY&¯Mq4$nHHÓ/áOåúæGý=SÑžN6^Ami­*FÒy;5ݬ›¾…‡N[fdŠÝž!תó¹Þø¦øÀ m#físð‰¦~^tré¾Zn콇OÁI,M“Äù:ýôëÿÿÕù!Å-Q§$¢@étjr)¯y´ šSiC˜¶QaÖëEáõq¡ÌiožnÿÖ‘øÙM.ômJNö§íH"ß9ÿ€ïùmóŸøÿ–ËÙ^ÑÓƒ]¹Ù{1Ò¶CmÞ°\qg +P™$žÚLN¸Üx +x9²«®U ñ4ß÷Œ‰n&ð4œÉ=¥Ÿ¬{üR4·C¸ûª ҥ垮(`¶•LºÉ[‰¨NÑŠtÓZp¯µ[ìÌ–U—B©Jƒ˜ëÕs s"å:m÷¤îÐY7-üTæaïJt$pBŽç2õýêë¿ÿÖøô—›ŽÊ{N:¬)»-Õ:÷P8RðFÉ‚iR +Õ¦\EªëðnÉ*Hi¾pðÏ$ª§™Ô[i3”×ÂäžÒ¢¼oÔ€2²MØ’¤œC«Pögo™®ÿÕQø|…3%–ä2®Ón§Oªß3]ÿª£ð¶&a¹ášjC˜Û;”3Ô[ów*/±vùòS+ÍJÓûxH—}öÐè'`áaå}µbèú‡sY¨•s>F$&ókcˆg}[ì‡Z\mcV“PG»?õ?⫬¼ù8ñªa¯mJ9­…Ôð¡ÔñU)á¡Ä­rý´4ç·Ãî_Óÿ´—ú4ë’[Ð ôϺr™’ËrWi·S‰'Õm¯&%ªîpŠ#ëS‘Ï:ƒR™Ž» ²òŠåÙ|¥,¸(‡iPKgxËþô¯ˆ]ŸúŸñUÖ]|¥i[4ÆX7Zê:Ò¾I:SR8xŠö# +åÂÄy9-+ЊV”öÖ98vŠ^B|—£_Xî#­ÿÐf<ìeÞ[„ÛØ©³Å¿NêzìÜ(Mài9’{K?X÷ü< ƒñÔyDÂü59Ÿ Ù%)ÃÒ%GFü4Þ-ÉõC¼å!RCŽ>¬-bÀKVéÑp¡9 ëë´ÿÒÐ̵á¨Is W‘ƒ ++Ü÷š×bX¼dDD‡‹+CIlÿVâëÒAÏ¢-s¶ýù(¿%Í“û6ØÂÅk8|ïÝ`‰oó—‚×áh3N#†´W +7Z; +Þ’£0ôw]ÀÚ8J @S×6ø²cŠ™µÈff¢© +¡B€Þ1#05îÍȲ:1å¡O@V¨¡@+ʨ pw/…,_Uñ! \Ä6i àKk|$jÝk^Û^/É}WŽŠ0^­}ѾŠ@©]@Ëx´˜²×Šð€ò£¼J0cúŽa®AI¡öÓá[ì§ó”Êb8”cZVœèúÒ”óp´ µmJ}”­{.ÈU:CÔj:û¦1¤J_„Ú­03áOiDŒó®SMÖ1‰;gJ¢iŽy»ŸÝ_ïÐû,Îɉ +)hZÔ‡“E5…x(¼ò$…SûªáðLm0¥Ç+OH'Âî,«PF<5 +K]פ¸®%+(JQT×*]Nêàkk®Lh²¥Ä“ÙF;)FÓú¢“™à£ãkØ®V4×µÃÛFÁÅtÑ6DDœúTp™lÇ*a +Ò…^| +ú!´µ8)GÅôiFV–¸òÃwlA1ÆÂRyÍT®$triB£ëýœí"‘‰—ÐP®îñÞ5±»%«òû­f+¢”Èv>ÉM(N´ñU]èÍ”InP'µ‰ÔU^¬²ëÿÑfDm¥Ýò[šÛ8k´Ã»^úú¬ÜØNciY{H?T÷ü7Má‰)LRvÈÌSÚFc\+JM_¾õ–ÙÚ©õ•FeÇNêV㇕&Ÿg…§"óB•6IR×±¼Ù-{)AL€U@”ëk¡[»ä=x”ï;pm¼ÑŸƒ9ô«^ë]îDb+ÆslvÒ‚N¢™ ýzÖÊimÌR“½¨O8ŸjRE£Þ0âÇTfÙq¤‰N¸ÃŠÄQ™Ik/Ñúëg&(¼VÂO-´ÇeG¥…xI.dž•((2×ÚõÔ9½ç hS[yÏ-–Ç”ZÕ'L°þëFm†"í6<îÒB€IBÒº®„W+@iÆ™Rëénc¯iÜRœÂuÝR¥3Dû³ ˆó{9©•-Å©yä¡Ps‰îË_…l2¯ÎS¿&ˆÚWjZ²¨;©Z×ÍÆÐ!Q´©†R…ì»%TéY©ë§Ël$¸ÄwHV• &×–§LiIe.”¡H XXÅ]’AR©\Æ#”c½)Èí—j6iBJ‰4Mxš{¯ Š†˜OÎ]STN$€0Š”ëZùÖ|ö@r 7^’“5dæÙYÙœöSêXRvn”á«2MM3¥I &×tFæÊo˜²øÙãì©5M;*¦–»ÐÅã1•BeQÛu;"¢ƒ‡#TSÈNë]ÍG•" + ~„1€ùq¥^I>Û>û2¤2Óïs‡"·-©täœ^H'<÷êl‡º ¶â$­1Ы Îò”åç|©/8j†«RCcpÏþÕ§_|úÞáµÍèlûƒ­.&\oÊc)ªã'1Jo9]¢^ + )}ÃõN„zGˆ^‡ß­ÿÓøÌ–[Ê»MºœI>«-wë:èQ8’È^Õ€iBJ®\M¨ëoöÁ)IiÎnñÏ%*£™P[g3“7Â$ŽÒb²oÔ°s²Mæ¥#KHö”åožnÿÖ‘øü…=%æ㲞ӎ« +G®ß<Ýÿ­#ñ¶f9%ã’j;˜Ü;’2ÔÛów%ïpöùò“ÍJ×ûxIw}ÈÑé§`Ù}äý…bèúÇ s©«•|¾*ówm„g•={ì†ÛB[m +P‘@¾} +ïpÚæô6}Á×_W±%(sžÅ蔧dºU)•eë>!xzo}þ·ÿÔùKmÄ%ÆÖ0© +p·Ì×ê¨ü,§Wu¶•+sKSiö$hâ $µ6C”I.8ª vˆÎŸTgÆÐåó +£Ø0?á×] íd—1^Ê鎬zíÆ×ÙŽ´³±ÍÙ ¦Ñ†R…§¼,ÝÁ¹Õe +ñ=™Cꟷüð*ñ;çÐÞ÷ +®¦ÜB›qJ¡B—]pÞ©É/¬Ý¯Ó5,/6ýAB¤ëçñ ÃÐã{ïõ¿ÿÕêdÈEÝ(ŠØi/ˆË Â3Q'ÎUž”´ø ÌŒÊ¨ûJy‚„WEfwž°ü.BšÞ6•˜#´ƒõ‡}¾,å"Õ³I ‹{”›Àè|•yøzω^‹iXTP–ëMÊPIû‰ëï8­âÚñ¤%8ŠŠN,4ï¥=v6­©O²•¯eÙ +§HzG_xzo}þ·ÿÖêoŸC{Ü?%Ø’ÚKñÝV…o³W]èꟸÝ8!^+þ§ÿäçî?»²‡Z\mcV“PG¼ÿôÿâ§Ä/XhÊ4+Íøì#ê" Ó¿S¯_xzo}þ·ÿ×êoŸC{Ü?)m¸„¸ÚÆ!B Ž[ðq^<ŸÚcvv"7–Ís·ñU„˜R’Éò›:o¡àsÓá°T[%Ié  ÔC˜ÌbqiBjUfMöü…6¢@QEsÖ‡î>Ï™,«/ 8…R•1fd²¬l¼€âJTÇÂ`¨¶J“ÒAA¨4"‡1˜?çÿ§ÿ>!~2¼Õ:3›Ã¹(ðf½õù*l-;D€¢Šæ­Ü}Ÿ2YV6^@q +¥*bÌÉeXÙyÄ*”¨9é/+, ¸µR´3`ûE²Tž’ + +A¡9ŒÁù‡¡Æ÷ßëÿÐêoŸC{Ü=D‹ã“’k‚¯ÃR|¢ +Ù:çߺ¤ÙÈ/%WuêÑÂä)b­+ÐúÃ\ÇžÐÛq¹†îsÙÈ!eiVXÁÓ ívw„î&²eƒdL]:%ì +“‹×PªšfsÈD‘x:ä{Á%] t I­@푳5ßJqŽãFðo›(ˆí¾â6Çc¢qb¨"”ßhn£ã"¤« ¸Aìë‡ÊÞœ` Ñ@ëQ9ì2<,6h¢VZÉKÄ>­{9wž&Ò Þ+ŒÊÒ&6ÿA}Š²^˦Þ48r:YÉJDà©tsŠHPΫÄ;]œ»Í56‰ð)\fV‘1·ú éãN'2*Í5) ;†V†¤üd˜íÝÀKbKnÑ/' +6ab¿ÚdŒ²Ö¸¢þr…6˜ó‡%µ¥°EpÔHâ3ÖÐSwÊ•Ð + +\×PÛ«IUY^ï1ãç…R¤3!¹8P°â”†Ö…”§ hÏ¢h)®þ„¼4‰rv¡ä.o4+€Ÿ1"ðô8ÞûýoÿÑêoŸC{Ü=Ki”…m8™}¥aq¥qIþt +ߘ¯+¥EêÊ:i$ÿZšÿöÚ“a&†ä²|¦Î›èxôøTô›¶‡•ÚqÖ¥],†ÛB[m +P‘@§“Ÿë˜ÿõx‡$÷ð‡Àĵ‡ó£ðªÀ2"¸k†´QΖKS€a y”¬Ó†vK1™n;)ì¶Òp¤zº»ÃÐã{ïõ¿ÿÒêoŸC{Ü=Y—ÉÙ?ÎÕIhxº4HÓ×Mç#fàò™„ݲÜ'g%¼ã<1PPù>¿9¥l‡Z\mcV“PG¯“Ÿë˜ÿõx‡$÷ð‡_xzo}þ·ÿÓêoŸC{Ü=b™’ËrWi·S‰'Õm§%äø!\W\Õ•²r=ƒªMs×:땹•ð× ÿìåþZæ—4#-rî¯UÉÏõÌú¼C“­5Ò\FdHx}T)8ùu÷‡¡Æ÷ßëÿÔêoŸC{Ü=q6;rY>KƒMÕzÙù7<´½u0ó—lÜð§5+f±˜Ò€³&Òïvñ)œ*v+‹¨R+’kÜ4?»+*D%« p­§2Z8Twü?<Ýÿ­#ñ²6·´ucÓ`v¾Ü¥¾sÿßòÛç?ðÿ-®E¶‹ÁÈÍLD²ãPÑ(YIìf1aöÙm¹x)·p© +Œè ðìÛç?ðÿ-Úo4…(ášZG´§+|ówþ´ÆÅÈ’Y”Ø8JÙXX¯ º»Åäd˜7{q\ŽKVÐSº}áèq½÷úßÿÕêoŸC{Ü=|¸¯ÝBÛSP×Wj5NZïe÷Ûßp_Ž22&l¦c.¿Ý(9i•)7Ó7{àaJ£¶^Ä¡ATîã÷[i#”—Ñ|Œ°øeÓrr·9Ußµ{Щל^#®uV~»|ÍwþªÂŸ‘™ŠÙ8Š@@¯¾_Ì×ê¨ü,rêe*%¡ìIÁõ¾.èó,ÂGšµóÚ°¹J™ l›b§¤šè·g-ûû­ëŽ棞Ö½’uÓ›™s¼¬8x0[Å\«¾ƒ¼ÒÉz3ÍÈe]—V$Ÿ_Êå𜙕$0Õ3JÒÐô +ÞîëïCï¿ÖÿÿÖêoŸC{Ü=kw]Û W½èF5°‡Hâ¥7eü+‹”söíøè5n?¬ö—¢Nze*"¹[oñ›`¯7Ùi‹†›Jwâ陸k­æ'ÊjÈŠ™ÍÊݲ¢{$çŒ×?1´ÆzJŒÂ#²êPÒȨ¸iêi´¥Ë<Òónïç¬Ék KéÊ ¨È(Sx¦¢Ñb òvÍØîºNÎ=j•6õ_lÛâÉŽ*f6×!™˜RŠ¤*… +xÄŒÀ×»?m¸„¸ÚÆ!B Ž[kRn‰ñÊá²¥)[7QÛJjM* Qþ'nt¥%¹röÏcWEMµÒ(#}pñ’½£9t¥|Ý”cqÕ¥ÕP$jM +¿iÒÍÝ·ƒÒW™‰ ë­Œè¥a$iÇöl–Ĭâs´•1ô‚vb´;J©=´>ͪ4‡öغL€pÓ3¾¤Ò§ +jN–V™ÇRXf;N¥ì³*+ïû<<•wZûr#oD— +!wÃlÉB°®•J¡9¥YÚK +"˜øJÚŠÑ@¤FG~ãk²d–äN—"3nlb5×âV»?6}â̸¸÷ƒeÔcÙ˜'¸Ñ&†Åø¥ÆVòÐÃku¢…6Vào +Õ­´´Øϼ©.DZÛ¨V +R±È,UwüÿÐêoŸC{Ü=d–#3G£¬v’âMEât¯}¤C[.A¼ã~žÝ¡Þ“å'¿ÍÄ|2âDC*rCjd—œ( +IÉ&¾kE—&46Yi—ZVÊR–®‘A¯èÇÔûíy¿)ØHm(ÊY BÁp2褕W*ꬭ%·Ø‹´Ú:ó[9 +!EkRèzš\í! ½¶qÖÂe+ Æâ–A;<©‹¯u¡] bChC20ÌqFÒ‘!¼±oîóåwÞw9¬–ª‡ùô×”kêg‹ÏÜwNw™]êçOiÏWÑðhE?Cö>û%‹ÌÈ‘8fââÀyMgBM@­=YÚ±bGz#kSŠDå-•.¨q²’‚ÙË¥¾Òîä8ÜžLÊB‡6yjÚ±ŠµJNôúƾ|\×o ?Pã¯ÖØÒ•ÿn›þÍ¡9w!¼PÙ1›aå‚ÙÖ*ÀœóßÆ¢TâÔuOyhGÒR’¯/ +kÓQìðæ-Ý'fÕå6Å—ÙpôN=ªW +‡hS®ÌËŒ²Ë'k)HR±–ÍFiL}¹íâYç`-¶Û\ +6U]Ohœ)©ËL€Î¿²åº–#´1-jÝer‚\UE»Ñew´îd…Ü×¢h8f5¦í¬þLšÝððš¥M¥]%Ö™‚­ +~°ÝâqçšR.æš,>SŽšæ2 ¡*oˆê/ˆ—“ø%:â ‹%´§íãk± €®owêf>Ræ#†#2­N*íu°"Å}ºf§¤©³_0mVkIzïp7 дê5R5A€‹98:æ'K*k, $+^‘ßiŒù2ô1¥ÍŸE±PšQ1‰^ÛHY™!éO 6d¹ƒ@®œŠ”tßh +&t­¤ù4œ-mN ;¥;¬Žy›ÁÔŠm嶗s®¤q'!ÝeÀm¤ÅŽE#¤#fuÄžëÆÊFÕÇÖµ—yêcYÿÑêoŸC{Ü=ko¸^5¡…¹‘\ٺ¾Ýx›'œÇo”PJ~"6rFc2§$ðÌ‹)¥Êø¾J+‰Ãd¤PÒ„œ«Ý_&|æcª[2j²+J„ŒÍ’ß'.‡ŸJ‰ü¾rvqè!õ·å‘î³/rŽðrùy"?b2O÷hö³:ƒ§Â[„gMq0ãá4¢×¾µÊ´*—™Mƒˆ!äŠñÎß3]ÿª£ð·Ì×ê¨ü-s%7T¥rÔ•!°tÐåÄe¾f»ÿUGáo™®ÿÕQøY/F»aÇy=—a)PõÓªj%Ü…;|Î;8ˆÅýåÙ?²¶f'Öîu?Îà1qzb¿åÞë—-Ô±¡‰kVë+”÷“)LÙ`sVñãاFœ ÌŸ>ê‘âW‡¡Æ÷ßëÿÕêoŸC{Ü>1qzb¿åÞêÖã‹Km bRÔhãd8œLr^3˜†$ç=i<õuþkÙñ+ÃÐã{ïõ¿ÿÖêoŸC{Ü>1qzb¿åÞê–ã‹Km bRÔhãoë#òU•ÿusÔ?b?{(m´%¶Ð0¥ pñ;ÃÐã{ïõ¿ÿ×êoŸC{Ü>1s)7¬%Ô¥‘!°tTçÄm‹‘$³)°p•²°±^uTù ŽÅBqêx5²ŠîäþÓPÀ£²Ñ¸¸k®t‚¬†ÛB[m +P‘@¼=7¾ÿ[ÿÐêoŸC{Ü>1xBHHm·*ØI&ˆ=$Œûˆ´Dí$Žr²’Mqiÿ×õ|¸ðÐË“¯9? †Ïh÷¨ù)ïóð6‹{ò‰îuy7U54ØE®y +ê|Úм=7¾ÿ[ÿÑêoŸC{Ü>(öÚõ†…3\hÛ$¬SQ‡Z÷[ 3’ñÉ µÌnÉjmýåê?Æϼ½¶ˆ&RÀ'vjWì­¡Ow“Jm,€‡XøÁ²@Ui\©©ÎÏ9;“2™J!Íd4ù»)é/7”öœuXR=vÙòu¾cwŽÝé1®×Nž ;ô:ÿõ²Ìt)Ù.)Éôžr¦¦ªñ{ÃÐã{ïõ¿ÿÒêoŸC{Ü> ·Z[m–£@.=ÇëöZN: +#ûγ¡¦µ¥±¹xø“ªŒÇ8^{–U•GÙ×;~q‘x_ìséjVÏ)MröYÕ +f˜±IX¦‡µïêÏ!Ç—ƒ³·h/š¶Sè…Í$ê—b¸¦ögr’ >«2äkîDô²´º˜wÂË­-@ï<)ÝûlÔkâäÁÿÎÝ@¸Â§‘ª»±vï–Ü”ŽÐOi>q¨Ðø½áèq½÷úßÿÓêoŸC{Ü=z\q*~K§xöÞ_øÿ 7;•%Ì+j뎯ÉÑAå(Ôÿ2²YŒËqÙOe¶“…#Õ×·2/æ»Í¥©ÔLŠT~¸òÇþóh×MåuGŸ1ü˜’Ì‹oeö…1WͨËJ©ËÇ’óšMBQÌ\D¢uÔ +RØo2é{PÌØ«JÈúÙW-}–.D’̦ÁÂVÊÂÅxeâw‡¡Æ÷ßëÿÔêoŸC{Ü6™1èéu0Cêr®+hìÀèùY‹,Ò--Ãr)¶ÃeÈ‹çm,Hà2=åÄwñÛ²„ìƒm•).b£ªN%7þÈ)Ï¿¸ü´¡¸s¢²£‡mf šz=¡­)„Õ4$šw™7![ºêRòº8iZQ‘Ÿh€U¥E¯Ñà +‡^FÛ +1»‰HM(MÙ‚ØZ¶j‰!Eȶh~óí³²Qv(Ü¡µ8Ýà$µÓ Þ’Fºo¦tn+H¢Ü­?*Ž½ÕÑ“÷Z4ÒûÊT¹Òa­’â‹IB6˜JS¸øŸÛ_u>ÞK¡¿Í±šŒÐÁŸLcÅ^=¡æ? +ââ\y§ŽãÍ­—TÙ +4쟺Ï^_”µÅmN.4™n8Û¨*íb¡ 4#~¹Yp‹ï1ˆéuIJ¼Òµ('¤:Ió:ñwfˆA÷ŸŒüu:Ú^^2ÑB’Ò=%bÚ +NX{ò[jÄ¡„áQIö,íÛñ¼‘Ê!ñ*Kå=—„œ}$ç®@ï´+½9¡Ç[]¥!8S‚»«´Ï£ßQ +HäYKS*a÷K´^°°¥UZ6FÓ:ùïz=)ÍŒ€ÊÒœpìšVŠQÞNv¾d S¶íjCœõê§f·B<®óÓ; ²ñ•†óbLo å2d0§’¥E+U$Ç?«i‘Œ‹ÃbÜfJ~0"¥:—öE¥]o¸©(ŒÛN3%ÅUÅ¡X‡O!˜(V|)¾¿ ò•ìžŒŽtÓ t¤t²àr¥{íf +Ÿ8eà­p⥖ۈK¬aR*ágf\áWEéJ¡Ø«À‚@É*Nc +@¨¦ëK½]†öÑ·0-˜Øž.(!„î­tõ×SkÒkXcD[+fE]+H×f‰¡N€ª»é˜´k¦uàòÞT¶yœ„º¦œy­ª¤¨¤Š¨ñ:ƒKÅ2”Dx2Ú#È[?Õ¡dœ$Tô÷ðõÄò±­<Î:v°8¤{ú6»da¼«Å·ƒ!hSˆ +:¬’jã—ªÑd7)·TûÈi4½¦-ðš†jJUå +FuµÜ˜îÈR%¼Yq$-ïêÖ°F"hz¸žê_Œm¥-± 2¤§R‹g"UQšÕ˜ýÂÜ›\+ÊCSv*IÛ¼·y~ ':¢óÔeÀ[”r£Ë˜Úâ]á{&æ8ƒãl +RªW žíûó»sÊjqS.D”òžì¡KÚ ¨ÔR”;ºBÌÊ\©.=™‰|ª+¨We²Þ*C@iBBMIV•|! +Ħ#EmÁM +]WìPëÿÕêo€qåWEDh’wY錡Á%ä%-O-XÂEjuË]uãjݬmBm¢T§ +Rœº œXF[†á`Ö6ĵcuj¦$VJ•A‘ÉGÕd™3!ºÏ”†¢) +>½¡ý–‘¶œØÈdGZ\}Åø1P*r#§4Ü”¼´¶Ú™âIA¦ ¢Ò®­’ã‰yj +¥“YQÄ +Ð,béê{U­lÌÕí¹Ã# + +ZE+Za‡Aç ±ÚÇN·–¤%J®%%$Ñ'3§ÇàvðCjÝT­¢©äŽÍh;ö|üGžsL†oídº“ßh3Ýí +Kˆê_ŽèÄ…§Á"/·n…4µ¸ÖÓ¢A!’/ 콇Xñ¶aÝ;d­Yw +V¹ÔedK‰'šÊJ6g1¶àûc"i(E*x›;=òåç0 6a)m(Ïfr®DÕYá¶Ì]r¡©@Ñ÷öJB +2¨K•6\i“2òäÅ—’Ó‘ÜRÊÉ횊2ÓŽbvç(Õ¤¶Ù w)?TåPÌ +S*7*t´Éq Cm´Öͤ×Ê¡*8µ®„噫Ï]òY·!O%ö  ¨šŠ)4ÈêgW®È²ÎÜ8—^y½¡V:ã9Ð’ªðî´IÙ™pÞmô>”R…*TÑT¦§v´´™^Ó¶BZÀ¸jU’²?­ôͪóê™1`m¥,WNá ×!Äï$Ÿw'h´‰o bÙQ@áH¨ª²ýÞaMÍ %-E=*e–-Ún¥ !›–ø¼$ìRÞßeàœp +\®˜·ÙQçª=Çv»úFc«k$è*ìÐç˜îl¯‹Úr:Uª6î)³ÂM+ÎÒv¬PÉFÍòÒËeÑ—k ++¥<ÕÍ£´ó{dÇZl¸¢¥%I쪺ÖÁÇ6Èr˜q°úÙ$p8®ýxž6e»¹Ø°ÛlaÀär±MÀQi¥™“x½Î%0¼M*2a ÿchA9«>–šQ!3N'Û9¡f”'™ïã¾ÅÆöËr˜q¾úÞ pɦí8}çšp.Bol_q­¨ûA$b×}£IKjmÈíìZqIBQÃ8xnÜ8 IS¬¨*PJ_-:¦ö V+’ò—%¤8©+F̼ûËuxu +É ¶Ô%ïÒ¶jáoV*à*ÃÚÏM~W(/sþ•3bÚ‘ú5´ÐÂ…'ŽüûºßÿÖêoŸC{Ü>!ι317j‰Ääj¨ÎœB¦žFYeÜ,´ß÷d«Ž†Ò Ì«*€‘®¾Ë"IfS`á+eab¼2ëC >«ÒZ†$G»“¶RüÔˉÖÎ3=Mò~ëWEqØPu÷GF ¯@;_¼"1º™Ù âë]qxؘSdCQ]hà C÷Ú5ݶç^ÕDéëñ4]0\üóxx&šø0r.fsîî6 +0ÂËOyï:õ¿ÿ×êoŸC{Ü>"¶ÜB\mc +¡PG %ÔEø¾J)ø'd¤PÖ  «ßK~AÊWe¼Ûb|tºUÜ·;T'Ø-áõŧ1’YÁçÚkêád&o&¯dH#LD&B\)ËÂ%åt7P”®t5³žB•áoœÿÀwü¶ùÏüËoœÿÀwü¶ÙÄ’ôÙ%ØŒáZè+AÑ·ôs”¨ÿ`O%ÛŽ¥dvðBŽòdy­áï{¾êç1Œ^ÇçÚiêãd»|M|¹CÑõJ*P”ÓšVËæpãÄÇÚØ4‹ÏOKŽ%OÉtà¾ÛËà?ái­ðâ]½¥€ +ÙŒÞæÓûÿ~§­ÿÐêoŸC{Ü>1qzb¿åÞñÀÎ&^N ©ˆ1ÒTãžÍqÖ–U÷}©/ßNŠ%#±Qñ'®ÿÑêoŸC{Ü>1qzb¿åÞñ¥¸âÒÛh”µ8ÙÈ<˜i2WE%w›µØPÜ +:gÍÄÅl^ÆäËÉÄ¿:BŠœsÛ îîÓÄ?ÿÒêoŸC{Ü>1qzb¿åÞñ‘´9y^k®1:NvkÒà?šY.ò…åA† ¥Óy(bmW^–›»ˆ¦vK1™n;)ì¶Òp¤z¼GÿÓêoŸC{Ü>1p*­ŠÞ|"ðŒÙt{sÈo9|ð•Í¤ÆÕ‹ +œ%( M2©J…sÝÆן8Ž”"$„Çodæ5<¥áÈJí5Ö»…lË7„fcíÉK*aòè*ª†©M2úŽ™Ue´¥nS¢•*€Ÿ=£5.,xüå磴“´YSx±'£Ð9÷§,ìó7|fdlKÊ}òÐ + *‚‰Ur úƹщpâ6òVðŽâ{f¦Ö\ +Ó$ª´Ukæʶf1™u.Çqàâß)Í4¦½iÏÏÃ9“þ/SãG•×2SDbJ’ºgPíE +¤ÆEÕ +ǘe/aLõt±c +µ¯@ëÝh²â°¢©.lB$ÕÚó8hpæ0èzTì®sšÈBÊØV$÷ª +‚(~íAꃺ©TBS(Æé&™Sv»õÝdªCŸøfí4;)Kš¼üâ +‹0ÁŠ›Gj·ÞOò3>'ÿÔêoŸC{Ü>1p¢6̼›Í·RVœZéZ«ÂÆ\¢–ä8)Ð +)Ú[X®ÒRãQÜ»W +¨‰ô•ƒ¨ÀCŒéÿ)ÑŸœ©+rZ$3!ÁUtx1ñͱ^=ÄÚ3³š1V]m1Þ.ãQJ“™)M~í)žX˜§•’°ŸmÝUlòöUášÆ¼—!Å>Ò]R™”Òœ*¢ÎE'¢©» ’ì£ÉL¥‡\L‡‹X”äBUQD¿Z䨑žoí¹Ò\u=îÛm¦¡8²îmϤ5 +­Œe´Ë +<¥ãRŠI*^AÐO’u6‹wíÛ‰yGÍíHXÀ¤ÔW +…<Ƈ<6*4k¼íYC-me/,%Â@oíé]ÚÚ1qzb¿åÞñ%=%æ㲞ӎ« +G®ÈMÁvJ¿*h]²Êr©jéí²\¿/…(B®û¶­4tÈ«Uþ9[g#1S@“³M +©¥Nÿ_‹ÿÿÖêoŸC{Ü>1t­†$±$¸áعظŸ«ÅBÊ“w¿ÎJöeX +sÈïóŽ¼0Ãê½%¨bD{¹;e/ÍL¸l0EɸªBNÕïÿ“àPßfŸ¼Tõ÷5›yë.nÐ$åMNuÖÈm´%¶Ð0¥ pñŸÿ×êoŸC{Ü>12iP]£5tyWZi^ë@Ž¤áyHÚ»T`V%gCÞ;>®³`¹‰~Y% m\+E†¹gK~l¹[€Î©~÷^®#fž5û‡}¿>ß3/dèc£òv7bBu5εámœŒÅMNÍ4*¦•;ý~9ÿÐêoŸC{Ü>$·Z[m–£@½¢©$áð+ÚŸbke*înu1¢Š×3P8Y +§“·ðRŽŠHö•eoèûɯÂßÑ÷“_… Lw’û-‡EÔ|`ƒ¶Ek‡v+>ûDÞM~þˆÿ¼šü-‚ðäÅèÛÇ0!$IE?¼)ž¹Z².{ê.CðŽ+SJÙ-"ôm*V÷P¦ÓíPËæs#ËÁÚØ:‡ÏO–‘+ã +¦ ª—SJ2¯umX7ku%/^®ž’kJlÓÒIßÂߟo™—²t1Ñù; +±!:šçZð¶Î Fb¦'fšSJþ¿ÿÑêoŸC{Ü=xŒü¤Åd˜Œ$¸êŽäÐhME+K~l¹[€Î©~÷^®#fž5û‡}¿9ò’Bz{ µ°Æp Ô¤g¯uó•*@8”ô‡–²â¸«:ù¬\‰,WÂVË)A§ º¥3%–ä2®Ón§OªÈÚÝ1ÓƒM€Ù{pR¶üÑ~^W~KL©Àë +Ôæ6g]Nþû8Ô9w|âša‘³ÙÈVTø?áßfSÊ·¯„ÏRØÞØ›gûJoe5è=™‹ÙŽÌg< æÉ +¯•—«è/ÿÒêoŸC{Ü=k²åº–#´1-jÝfŸiç9=r¯1ƒÿ5 bU|€Gò m† d¡ÊQO«7¦ÿVƒ/S2YnC*í6êq$ú¬ä®KMr1#v>q°ïg!^É8uûÓiÖËo8ߧ†÷hw¤ùIïóq@ÿÿÓêoŸC{Ü=o&.¥†ù³ÒW%ÌhÅ]’k‡ÌjGÈ„âîVï5»òâRÓEFŠddVšzítºõÅÞ/%Æ=ÛÁ"™ƒ–UÎӧݾ³—¤Diº‰`­ìy +\Ë¢xå¾×Ý•#;JBz”ªÙÔžúÙ‚gGy›íxíTË¡Gf+D‘B;ÔY€òáÇSÆ3Î C$©Œ*¯»à½6̶öÎ3®#hšáPA¢‡}¶p.߉&]عÃJBZ[©P¦(4Rk…X·Q4íZL»Â;sV©/6”HD4²ØÀ“Ù®O꤈ÒZLĽ#²Ë’¼+˜¶¡‰_ß)ónO²ì8î2‰*m-­ R°s£Nû§O»|f3/HˆÓuÁ[Øò¹—DñË}¹[yG‹H;G‘±MGäÈV´¨8‰>zÚMéuÆwΆÊÜJÙo +VIHRE1†™é¨ùœ½RR⥈§és‰î¡ q?@ÿÿÔêoŸC{Ü=kh#šÌŒòdÇpŠ§h+ÝŸó¥•zSwßlœCY¦#JâGLÿOÀÔÿŒ%!M‚”²Þ '!Ø®xÿ5-áxJ‹°8–CtÅE&½$Ê"Ò'’SÈ +–œÁ SJ$±+~ûMe§žˆ‰r9ÃÁ€Ž‘Â)95zuËqÅ¥¶Ð1)j4q°e3“2B…[f/Ér©á[‹n–nv^šúg:€ìù‚?y¼/)._Wžçå‹},^ +>OóJ}ÿÖêoŸC{Ü> ¶ÜB\mc +¡PG #ktÇN +6eíÁJÛ­¼‘5â0Ç5Ç5 B)QS¿Kmø´)GøÁ%.Rƒszzó¶Ìòm™ŠH}‰éJi…E¿8ò^ðkc˜©2¼õ¥0î·ôs”¨ÿ% ¸ïÈÉ?Ö»XGÿŸºËmËÁM¸ƒ…HTgA‡fÈ“ +-åz6³AÍ!8}u +ÖþŽrƒõãmœ~MßEòû”Më*ÊßÑ÷“_…±¥«Ž:U˜iÕ:¥£¸‘‘>klær®BãÒbÅCz–4²ίy5Kׄ…8@ú¼)ÜFû/™Ãk`ÐF/=>„ÿ×êoŸC{Ü> ¼%·'²ÚW˜juA»B® ­Á^xýû©)òP;9ï¯,ë±ÒãÒÞý,¹ Æêó®gðáô—ÿÐêoŸC{Ü=q“6Cq™S‡]ôNZ[ódÆ‚IOÆ“F¹ÐìÛßÄ–D ’K—­ç‘Tɧª) Ý¦[Ç¥?ÿÑêoŸC{Ü=bž’óqÙOiÇU…#×c“0¹ÐÅxÌ +DdèiÄœéL½–ç÷ËÊ¿o +aÚH@ +¤g’[oß\óú[ÿÒêoŸC{Ü=RÜqim´ JZl`rz*¯Y5¹9ˆÌö³R·é»]ÆÍMåŸd·›qÒ0FgC@Ÿ+…U¨¥EÛhKm aJ(áô¿ÿÓêoŸC{Ü=O0¹™UûxSÎ:Àm#,ÔáË~êç•„ŽSMç@S +Ý ©“¨¯s­röY,Æe¸ì§²ÛI‘êúgÿÔêoŸC{Ü?%n8´¶Ú%-F€6KÑžnC*ì¸Ò±$úì`ÂC—µçÿùbt°né«D +äxWKmyA5LB'n˜jèÑ4q~VŸ¼avã2<–Æ»ªxœµúoÿÕù[IÒÙŠš +¢¨UMh7ú¬qܳ¯d¬ôdìP¦tZ»òÎØÙ»®»±#-”×ÔêÏ}Q•? J‡x?sÇŒû*h®3N¸¼òÞ¡ße†Õp­ºôT¤¼ k`zã‡y¨çµ…/dÝEç_ÆØ/ˆÓ.W´¤–J³å`Rkˆ=âÉz3ÍÈe]—V$Ÿ]ºn—%ì¿%ô¿e?g¿›_ü>õç" +Þþ7KQ²SËÃL8©¦9eatÇb¥XFu-}ë‘ÇÆDCFQMé¥t¦§[|SÊH2xº²–_[„FzšlÔ)™¨ÈýÄÒ͘wtvVÝp»‚® +ý³žÿ§¿ÿ×ù òr®3ÒóÍ*„Ëu®E\8¨­š‰¤±¡…Në-Ç–Û@Ä¥¨ÐÆÈm»Ö Ž,áJ!“Ã[-Ç–Û@Ä¥¨ÐÆÅÈ’Y”Ø8JÙXX¯ ¬\‰%™Mƒ„­•…ŠðÊÊp^°vi!%|áÖƒ^ãì²YyCò»-´úT£ê¯Àä)­ãiY‚;H?XwÚMÛx +^wbÄwKÂ%Ìþµíßô÷ÿÐù¬+轎0(§Ï¢kÄïˉød3%–ä2©’±6êq$þR½Ö¸ÛšµMŽÙ’¶‘C´Z£ ¯”vXÔ8ö·V×Kí!<íel¸ :EŒ +Q¯v=ž|OÚÎû¾b&CÏ3%-¿“^pÖÁ­ÇÊMJ…5Ìoµñ%•ceäOq +¥* Ž‘hÎ^ádž„*ŠCûO JŽÒA¡XË\^o†ñLoлw¶¹xsðÁTEx½OÿÑù +_ôs⹈æ÷†U³#°å+æqÞ«!ÆÖ—XÄ•¤ÔÆËmX‚T0œ*)>Ñ¥¶jnC¬ãÚ]–òÛQÅ‹4•Pçžv +Èi.¤I®¨WÖIÜ{Æv.¶Ú”ùvÏ8§\Ãõq(“Ní,ú£í±§naÙÚˆ–;}ÿÓö˜¢†*—@wÈ#HÎÅí7'÷Ídþ[4Ú +Ö‡4ÿSZe{çŠÍÕãeiš<¼ÿ6naü‘ëŠ8<æÍø™½TY/ggRãÁʧh@Å |zhàýÆDÆ(ZÌ4ˆå…©1%¤&4†ý`‡?óžþË4á å|%8yŠ)b6'¹Ú3 ’3‚4Œì^Ðcr|Ù²IoWÑ£K ^x°Ãj6/#<ÅBÄ&“سÖ¶G$Ëkei´è +´ <…;\9@S½ÈöFTL˹Á¦3{OáñöÿÕú$f4…"·!Óáç…>g¼ä'|0ò@²í™rh„a2 ME@Û«õ+£0¹#0qñà b`¥–rs-mÍ„CÝa:b®ÃB‹x'ð:r«3T¹+ß!<®& +k£ÒL’RŽ‘í= :¨²&^ÎΥǃ•NÑŠøáa?5 A‚×È|g%ÞÍÁ¾°¬>‘¾³±4jt|‹Š9÷€ì~‡P(FàŒ*.E9šR5#“~¹ ¥#B™0õËY ½‘J  '<*hŠèÐÎñµþb¨ÂSVÆôQSâj@”±c1´%­9Kk‚d± 6ñ €óRÅlNýßÿ×þL™fËpFðæK>?ê½ +\ úØlì +Ó³XR ZsÚÏÀfàv9öRx8Rè¯Bÿ±¢œðP©¢+£C;Æ×è 80´«Aýqg—û«%™²¡8¹å·q§v +©s8YÄiHEfS³ÉîÿÐþ*õ“ÀÔrVÛ!PžÔräîÿ?èÂíù9bêúàY…{Ôd»õÑ@…ÿ¬ +ñ° 3Úñ€¸`D%‡b]îAäyÀ2;Pjpò€dv Ôõ®vŒÂäŒÁÇÇ©ô6–`hXøyþ~º+пìh§4W9é—0¦e}+×(!ƒø"œ9ï!ŒäcE2#‚á§-÷Xʯ>ßÿÑþ'á ºb‚±Íž+¶Ž²T<´žêQâ¥\! +Ìó‚¶@|‰åÌñÊ܆ç¸'c$ø@¨…Me›ŸBè¸Q2îæý +¸È˜Å Y†‘0¸!!€(i”úQL:c3´ðe-àQ’4dH®mZr`¡äP¬^ÕÿÒþ?‘¦¢ëÖ’gÔ{üó¥‹ ‘®BÇÀÊ·ÀCø4Q†™4„§ÈŸäÉ[l#Œ €ôëòõX•@çþÃð¿wNp¶ú5 +7UY—øžt±ar5ÈXã Vàø{;Uó1žÂ;ÆE +ÃÚ\K±úG9*}J[}š‚‚%ÃËKro; L¢¤%k¨Sƒ ‘ìÿÿÓþ"VJ2à+™>#oèÆ-ôD&B±gø´?†Œ•p6dûÅ¡­£"eŒ*è^3ÌQK ±;úºâ8™œ®H–gˆq”ª`E¨ÙsÁ—dzý%ö?ÿÔþ=Ýn¯TEËA…†MúðuäY0*⿙߷>(§ã;~xZ0Å\Ù1 ïVÈM)ɇ®k!ÙÔ-Õ4’ϯ7}e]Ý-EÍ(ê7lW¦PûÿÕþ5\ý€¦(Nì6fa›õ»(Ž*ÜAg#Ñ'•È…ÃMôúÉ'UEÛÑÑÕ˜òpÓ•Y˜É^¹»±[7¢ÿlqÞN»+ÚŸè ´ +Ï*Wún‘쫳L*9šR5#“\Z viå~DLqX 6üP°¶;g×?ÿÖô€ÃƒK +°eß#±*ŒØQk#Ç£lÌFA!ƒCåe…ÑPÆ\å¯|,#¨Ü  ⊠-*Ã^ˆ¼ïvJÊd£“ŸåcsÃ쩼xçüÈÚgï êàE fTWxyŠ)b6'~ö\Ùw0il!ì:ü„‡üF"dA9ßÍk¥,Ä`ø?[ÿ×æNEMðvCÂÔƒ½"(úÈ 80´«Aýpâ‹¢ì0² xîýŸ*3ºþ,J÷‰jE#pt2ÊT{Æó˜7äÄX=ƒ°Å¤ªÚ;ú¿ÿÐïÖ¢ïzt¨É‘“žN»+ÚŸè ® ŸÃ%û2¤]hÖŠJÁÆ:6÷–“.p¨èÐ’·"Ü\ñÛ` +]IÏ'žn­À7õ,9qIQ«W2C£b“ W׊ +q˜pQWœ×£ +”%â¼~ZµÃ³ŒMyE&érqBˆ$Œ¨:ªêõޜ⮅rnœO<Ƚ=êØ(°Ž@42¬Èò°á)vÈE;¢—ÃÑ€êZÕ¤ Â,†/UâFG;ö?ÕN¶î¡:_+õÿÑïÖ¢ïXt Ë—ž»#пé(¨l&Z`º{‹ÔâÇ0(“;ÔAM9„Ïõ l„2<¼–Varb +¦«Ã2:3±¸pdêNù årpÓ}<¹4ûHÊ€ÌáÀª¨#8"Ž"úÌ™€E S:,ÆÉVÁc®JIG7c–§#ô +½˜|( ÝéøÇ:?ï™ G(2XÁå%m~±nqUˆ˜§;ÔÏa|G¤\ÉÓÌŠHšyÀH4ä]†–§FIi™Dk:§äá«C®/@MJ%xÝA¢ J,·nxAuµçˆf-û-d‰Â…Z b®@&œ¢ÌÐ&÷Á„ŠÎ L=[Ð8@,@ƒŠ©r÷¾¿ÿÒæONEM‚òvÓÂГ"…búÈ 84°«Pýðà‹¢d1R²‹8îýŸ(1º~, +÷¥jðž)a°¡„|5(s8$ÒÇm LËï}ÿÓô€Ãƒ J°ä×#±*ŒØToƒ£lÍN!“,Wáe…ÙÆ\a§\,#CªÌ€+⊠+,*Á”?~ˆ¼„ïtJJ`©—ŸácwË詬yçüÈÚc89ï êàDfÀÇ$xyŠ(b4^ýZ±É ìt*m¸ûß_ÿÔþO˜¢–"‡buèŠÊàB`¦º9T4CªìaóIÉ“*p1‘ Ϊ,‰—³³©qàáŸ2·õ†#út‰Nx(TÑÑ¡ãkíB·üJ†‘ëët·> £ Oð{ß_ÿÕú/õãAZ‘ fùqjày 13]úx8Rè¯Bÿ±¢œ¬ëqdÏÄ­%qìúâ-Ï“~þ¾ìWæD +«ÿÙ®Pl±R!—ÂZHûÏ_ÿÖúÊúü„‡üF"dA9ß|*º^€ø!ò9<ű@›¿°Ëù:* ½å™.}ç¯ÿ×úêß1E,EÄë’D¶Ê²´Ï([}š„€ª%ÉëûJ­Æ pò€dv Ôþ R 'åãÓ!4¤jG&ùšR5#“~¸´ªÜb‰×²—±ýäÒRvkø®AHXt,Ÿ—L„Ò‘©˜{æBiHÔŽL=úd&”HeÁ×0?iU¸Ä¯cëÿÐö*ÀƒÏ&2®RcnÖØÊžR‡XŽƒKª$¢Ø‘`P‹ØbÂJ¨nˆ3@¦— ç5†qClâB/ àg>‚“£GvÈŒ:}²WÄ,/”Q®Z½3z†½3a:ç_® HF@$àºø.àÀ3‰ÿ‹ß~_Ó·j‘?ÓÁ_ÖÄôMÏ* ö¨T/i`¨Ì¹ÝÀ0 tÙOã Æ ¾¢R«âÎ>”êyJUóÌð†CPj£ÁÁD“´„TmÆAñ‹ åk–€oLÞ…!¯LÛ²§ŠÉ¤¨3”2‰Sq±Ù4–¤É‘¥ +‡°ŽÜl uá„ù T=‡¯ÿÑöJÍY¯gàºF1¥ Ã‚¶‚67Ø|šðp¶û57TK“ÖO$*§~¸yŠ(b4^îÒV±DÕí¤¨ï‘NÑ\ƒŠ¸ùåZÁƒ*þýǯÿÒöŠòÙÚ-'.”¤A”檬ԘDÃÌQK ±;û½¤õÿÓöªà0àÂÒ¬9õÂ’Ôb1¨‘dV€Ü˜èy+º[ñ¦ÜìÑ!^õï=ÿÔöêémöj4n +—.L(© šB¯µ¤Üjo±5JF./8 €Qßb¨»¨²&NŽÎåχÖI#½je'quû +˜¢ŒÅ(õé!aVdùXz"ŽvŒÀäœÄÇÏÓê>x.¯œcczwï=ÿÕ÷ +ïy±!diÇù +³ ãä§\ƒq¨³Ì ™gá#²Ž5ý«žn[²Ö’Å»Ê÷芹Ú3€3?AQ$JÕÒ.w/õÏöšj@YjÎ×…0—`Ãv%_*x¥.¬ë LAááu&L3ÎA‡0aÈŸ¯åú‰â~“WX(¯¼õÿÖöÊßzçÝc"l/&¯.ã»Ïû·ˆ2)IÑ8øÕ©_e‡•aÈ?®,§$1ã‚NÇ/ +A¾%|¼4háæ(¥ŠØúüj¸VˆþI<ãƒù©V´`€Ë¿yëÿ×öªÛ ÖÌ;dcÁx-ˆ¹tò¿`=i +øñTË#ðí›Ô×Sh$s2â…çÖ «o¤YÑ?ļʈ4ÍñäÖÇŽ»>^càtšeËy.ÌžB££FÊÜ‹rusèµC‰0ãKu'U¼0á'6)¦A;¬J„Pð”ü£b“ W׊ +zŸ1E,EÄëŽaüÜ$N@T/DBi¤[!±ÅüÇ×Å &kÀf%ÁFàˆÜŒ•ß3‚š”ÁLèClôÔƒD Œ ŠáË€1$憦Œ±tÄ4‰€§$©+'G$ÎY‚ö‚%\6 F£`¨Ç8¾ˆ¦HÈƘ–ñ‡ào,ƒòÑ3ÕÏÿÐöªñ°Ä!¯&#œ—È"R&&(Àü SÓº1â0HS¥òpô&’p’_>¢4›;4tÌ`aá:3,ÆÙFAYa®.çÝË”” Æ+ YÜ’‚î +¾v"¹Àö¡ éë±_‡È;\të”æâä˜"í|—”ã±wmHÞMY*Qd½¡–ÅÇürÃý+ɤã÷¼ðoˆ  Àɉqj¶Ptaä`g€$eU P ++rƹL‹j$ˆR‡¯¯ÈHÕ`UŠ1B‹,ê `D^­Â4àE¼‘ì/Áp1˜«D:æ ©5 `檔ѶëöÅò€ÊŒÂtãA&oë„èV-ïnŠÇ¾ ªO‰ôŽ´ò&žŒv-»XEŽPŽÁ€®¹Pö3E̓™íR ÜUì}±t +0R‡2r‚ˆ“ Œà‡&JÛ`Á`L§ÿÑöÊÜc×(ä‰0”¼yï!Œec2#°Çå_ÐDüažÄ,ƤVä:|<+6¹)ñ#6ˆh ø/#% ú› ÖÌ;dcÁym‡„‘¡¦‹åwï}ÿÒ÷ +ã£0˜1sóÏü磢M¹är”»—¬$qƒŸšX8,obêsÀe :ÛCfxÙŠ(ÌPâ\ê¢È»z::³Oä‰$H£<®Hf,o£ÒJ* +Š%YÑèOð“Cù›p·Ì× +m;P:JT s´O™¼PТq“´¥´¥Ä—Ëüq +Cû)çì‘ì{ï_ÿÓ÷Êã£0˜1sóꉋPcä@¢y=Q"¤ÓÈÉ(Ÿ¿¤þ“,e`5¸X¢#`ýÃ2Yý +=÷¯ÿÔûj³~BCþ«2¨keZ©‹ÓP~¾þ½ÿÕûb³˜¢†*—@wàHnÆCA¤ÌûëÿÖûZ³˜¢†*—@wÏúÔÏûüÓ‰æ(¡ˆÐ}ƒ×ÿ×û +µ ÇÀò<ò9Ú3’s?@š)&€U¶…ÐòÈ’ØC¦ÁøäyŠ(b4_aõÿÐû +µüЩJ2PÏÈåß4ཻé( U½¿Êˆ”‡K™Š(ÕÀÑ@ýÊþO±ß_ÿÑ÷ªã7@Ö q9ä'{¢RSL¾‘È¥ÑðÄx¦Q5YPñP¦ÅËd“0V´lgp@&ÿ|þsÑ¿Ùfœê¢È»z::³NPaÁ…Œr'ëpiaV ¡ûçÊNºì©Ž·q©]#J;Q˜¡‚»«ö?_ÿÒ÷*ß1E U.€ï˜`T=9D(ìçÄÆË¢\ðçþsѯÙnœ¬Ü^=XZmÍúÇ=É.XG)´‹‘$Aù¼Î¤Ðe–ª’Ý—¦xXîbÏ+åC[â8™¼® +cìž¿ÿÓ÷ +öp~ãg,b›PÕºÁeÊ\­ÊbQpik «ûúø‚òn‹FNJ² Š¥íî\!iJ3=bï'ðÁ€Šc{\ŽvŒÀäœÄÇÏØ=ÿÔúJÓ*×1Ș`FHÖÄÕ–£ƒØô8ŽbÈ:†fŽŠÌ!èá!@±îŠÔðîg]ñÐÔ‹žiZ»AghÖÄ?‚¡Ú~^y íü,áU ª“ɸæ:Kië¥ýW‘°K’(Ì£Ùò»7Û)QÀ¸Lþ[èוּP¥íOŽCøÉ06åµL¦˜`b +±hpŽ)¦‚¬Ú ‡Áa|8lµ aó\ŒxìÉ€«¶¡x6T¬)¯ôà !ßiÝÛ2Ìs.ÇLÒOPQ¨4‡,ˆFQ,³Aˆ+¡ºÛ–Oëüó_UÇÒAÅ›U±ôï— ‡®‹ + ++ñÏéAÉ .ç1E,EÄë™Õ*uÅ«HgûT7=OÅCCYpnêŸÁ024W¥Cš¨~´¡ðļQrs1’W)õ"€U€c„f<äŒ ŽѲcÄé"Ó_*$ +⃓‰Œ,(¸gÓ%y^Z(93¢ ˜1.’‘«ž*€Æs*E/†p,³¡*Œ +FÇeH1ÆÞGÓþ9¨ Åó›?WÿÕú+Ø ¢e¦M%)ÈÖW)qÓl²¯2qÕ|†$çÐŽqYg (Á[ž“tˆÌÌíÿx–X¬'H‰:•4ˆ#&Û8hÂj•† +ñ‘mäB_† A‹^´M#³xZ^ˆ+F#ER…gøaÏE“!˜àã×ä$?â4G"#éRìFœå…Sx Ù õ"cdÁ®p ¦ˆWbÍ7é’Êc|¬ÀˆoùYƒû6 Ÿ— ü0p·Ê© íɸRg +Þ?æ.°ôàNªk.•â¦¡W­Pò¸‰Vh‰,+e„™€(aVC¼–Íä¦Ó†GbÑq€Àv1Ϩ4Ï# @ Ê NËÌTœ‚ˆ@àXÞ@èÆ1q½ey T6bHÖLPHä­Ï8.TôXKÏÇ$BJH]-×:0ÒÖVµ¶¶ ;Ê‹X*`•pn)°e€ã=jrj +@„.¨•º ¶¨6Q°~NQ'%Ùb©D\–#iaÄØ#lc\FÇLmF?þ‚€A’ÜqZ*„x8éåÎ,+•SÒ!ü»2ý’+ÊØQp“êÿÿÖ÷*éšÇL›‹<¿Ý,Í ÍÇ#£09'11óõjŒ%5mo0¾/Á³u`È“h> Ŧ®tA–kÁÊ\màñtb+Á›o?ÿgÿÓ:o¯g wBº¾âžU À +T̪ý_ÿ×÷Jß1E,EÄë°Çä_ØDüàšÙÚý\B¤5ÏôƒŽñmIÒ®ÎDpÖÔy†KøQ ØsF|\ÏY$‘ÒÒÌ¡å=#æsô¸ƒi’çûAÇy´„íWG#²]¬a\ 3uõ%˜ +ý¾Ûgî0qRÆ)µ¡{I^q[ PØú×ÿÐû곸Rƒø=Íu1G6pyçBÎbß’VýsÿÑûÚ³˜¢†*—@wÈà%- +>­Â”Éê#«ª½‡ÿÒûÒ³–f2ƒ2™‹ `& I&CG(0àÒÖ W÷ìÿÓû +½r ñRÇýE¾™zÌYiŒ¢ç4l»6ÞÁ¤¡j®±ÒéNbnTpX‹Z™ Ü*paF[â[A¢ÕMc¥Ò¼ÀÔ¨á€4=JÕ! Û)Å–‘m–µÀ✋!Ø*à\·Rp2êËq½iZ+ ‡Æˆ»qáF'%I bªú5\ÓyÙ +ŽÜÿLå!?ã26_Ð!?Êa¾ÏÿÔû +° r´²Q·Åø1Ö(8ßô44Á ¡„ +)Ž$qŽÛ?åœX(Dæà#à iQàªåCŸ)ãÑâÛZ3È E tSFÝÀG†Ú¢1ÐDÊ4dK¨!¢¶TÚ3ºãòt5P “ÁÀtân0LBÞñ¯5–Y§’ˆ„Ãt·}¢X­`O%+’ +€fú +—Z1:ŠÓ\9ë!Œd+A0#‚–|Õz¸+AíÿÕûš³piaV ¡ûâÏ/÷ DsqÄF%ô¡{x ¢è7Tæ3;O.RåóíÿÿÖû +¼aÖ+Õå‹<½¦ÂDB×ö}z£ M[[ÀA /‹¹RͬF€’¶àÄ©¿Lœ¨µÃÌQC :÷?ÿ×û +¸pXd`I…seŽk®ÒŽâ”çhút2,›5@7~m3ÍÀa|è+tçê&ÈÑ:xr©‡Lfvž\¥ËçÞÿÐ÷jß1E U.€ïF‘‹Ú nOï€bPˆ@Ë»ñ¸xF„U™>V²I«ûŒò,{0õ=d“üfØÕpQø#ß. +qÜ%h1¹ùÆyIå0!rS]¼ê9îK22Çú‡l1ùö?+¤° +N2°9hóõähF¼9Tæ3;O.RåóïÿÿÑ÷ +úð%r$W›Lóp_: +Æ9½þÇ/7ÉÉÛƒÔÚS¸åS´F‡ b†>>”ZU‡ þ¹ÝE‘vvtwf|¼idhd`á!jÊ^yݲ°½ Sð¼W™( € Ù”8`xqú Õ¡—‰ö/ÿÒöÊúü„‡ýVeP9| *Ò`q½. +YñÿUèRà­²€Ãƒ J°ä×;rLÝ‘Ð,•ÈÈ"R&&(Àü SìÿÓöÊîðcàÚȺݞ#ê‡^±KSL^ÄÏ­ +¼;¼dÖŽÒbZù0๣$±ÈŒc¬™¼“FOi’@fp`¯ÊŠÄ±Ql¸ôÐñ·} „Ï;>éÚ(mVD&´±å$ ìWãU†XÑOÜ#r¶ +Ô'Â!I5øŽ2kGi1-|˜rUÑ®E-#¬Þ`¾VDŠØË jf>)% +dë?`ÿÔöÊäáÜ cG³ñ†2£õTd¹Ã…‡“ÔaIhl²©j¹®ãMÌÊã,ø¹â8>逪™X&<®†˜Q¶•8ñ0[4.ˆ(Ñ—ˆL„^Yxn sdËtÑ”äc"\±FÞB8"bg/“´„5Þ?þ›Ä9X§²˜‚S^PŒœSÑS:q![CØ"H¡™@‡8>逪™X ïn.8bbíÇ«€`Àí2F>´¶ú57Yƒ†'g}Ñ< ƒì'ÿÕöêö_Ð!?ÂcSAœPM$×pÍð2& + ù³,”Ê"~:Ž{’ÌŒ±þŸ¬ùŠ(b©t|¢„Ê 5Cf¯DdÄ+¾ó8vƒK… +¤©¥“BŸbÿÖ÷*ß1E,EÄëÔYggGvgËà +CöË¡0$PxÁ¡Zo[záâ‡-Š<­Ãý»ÊÆç—Ùyñéz†šÉ¬-ñ³Q˜¡Å¹GåLB(Ão[ô‹'Ž7ý I<.~—&p|7ù~ŠÃ§ƒ1*D)c*<&ŠÅI´h« 4}ÿÖþ#]ØÛ Lœ.« +8o¸ÆDy˜þO˜¢–"‡buÁAz9„$F±ž4r¦ñ±Ãq/®£LÅÙÜoX×ß¿ÿ×þ ˆÄ*_uù ú­UʪñóPÅRèøiʬÌd¯\|Å1Tº¾G;F`rNbcç‘Îј“˜˜ù⥥ ‘òñÊM< •‚œ úôðp¥Ñ^…ÿcE9‘ +ǼÖ÷4÷ïÿÐþ‹Bº¬.‡M¾°(xÂ¥Xrë…5P1 ©(`;‘ðŸˆJQÁlYt1WrýAiJÁ˜{æŸNï-¡–Aòôî&,"IüÉ4w÷ïÿÑþ¦ã÷t¡ÃÌQK ±;ãà‰0‚¾FœÎc²Ò/ß45ß+ ~N±ÓÊ&O8‡ ÙsË2¼Ì‡Hi˜ +uà9:Â`*E[¶°p¦˜ŽD±”ëÓ¯ÈHÕ`U… Y-•Ù”ûñÿÒþ˜¢–"‡buÈ£(ýþÖƒ_ÆaC>?꽂L•¥þã²ð×WiIÊþ?ÿÓþ]x‚?‚)Í M6Šh €‡jÿ¤w‹jN•vzÉ'ŠÍÜãe#š¼œùÈ“:4‚!‡â8¹½Ž +²ãÿ€ÿÔÿãÿÚÿÿÿÿßÿÿÿÿÿÿÐÿÿÿÿßÿÿÿÿÿÿÑÿÿÿÿßÿÿÿÿÿÿÒÿÿÿÿßÿÿÿÿÿÿÓÿÿÿÿßÿÿÿÿÿÿÔÿÿÿÿßÿÿÿÿÿÿÕÿÿÿÿŸÿÿÿÿÿÿÖÿÿÿÿçÿÿÿÿÿÿ×ÿÿÿûÿÿÿÿÿÐÿÿÿïÿÿÿÿÿÿÑÿÿÿþ´ŸÿÿÿÿÿÒÿÿþ{ßÿÿÿÿÿÓÿÿ?ÿ_ÿÿÿÿÿÔÿö¿Ï{WÿÿÿÿÿÕÿ¯ÿž[÷ÿÿÿÿÿÖþ?ÿÿ¾ÿßÿÿÿÿ×ÿÿýÿÿÿ×ÿÿÿÿÐýÿãçÿÿ÷ÿÿÿÿÑúç}îÿýÿÿÿÿÒÿ9žÿçÿÿÿÿÓÿþÿÿûÿÿÿÿÿÔûþÿÿÿÿÿóÿÿÿÕüsÿÿÿûÿùÿÿÿÖæ÷¿ÿÿÿÿþÿÿÿ×ÿÿŸÿÿÿÿÿÿÿÿÐx’ÿÿõ¬ÿÿÿÿÿÑqýÿÿ¹ÿÿÿÿÒÿÿŸÿŸÿÿÿÿÿÓæ÷¿ÿŸÿÿÿÿÔüWÿÿŸÿÿÿÿÿÕÿÿÿÿ¿ÿÿÿÿÖÿ¾ÿÿÿÿÿÿÿ×ÿ¾;¿ÿÿýÿÿÿÐÿ¿‹¹ÿÿ‹·ÿÿÑÿ¿×ÿÿçÿÿÿÒÿ¿ùÿÿÿÿÿÿÿÓÿ¿ÿÿÿÿÿÿÿÿÔÿ¿þ»ûÿÿÿÿÿÕÿ¿ÿ³ûÿÿÿÿÖÿ¿ÿÿÿãÿÿÿ×ÿ¿ý¯t÷ÿ»ÿÐÿ¿ù‹±?ÿÿ‹ÿÑÿ¿ÿÿßÿÿÿÒÿ¿ÿþÿÿÿÿÿÓÿ¿ÿþOþÿÿÿÿÔÿ¿ÿÿ¿ýÿÿÿÿÕÿ¿ÿÿ¿óÿÿÿÿÖÿ¿ÿÿ¿ëÿÿÿÿ×ÿ¿ÿÿÿÇÿÿÿÿÐÿ¿ÿÿ¿¿ÿÿÿÿÑÿ¿ÿû¿ÿÿÿÿÒÿ¿ÿ»øÿÿÿÿÿÓÿ¿ÿÿÿßÿÿÿÿÔÿ­?þå¡ßÿÿÕÿì7üˆÝ_ÿÿÿÖÿ¿ÿŸÿ§ÿþÿÿ×ÿ¿ÿÏþÿÿÿÿÿÐÿ¿ÿÿ¿ÿÿûÿÿÿÑÿ¿ÿÿ¿ÿÿãÿÿÿÒÿ¿ÿÿ¿ÿÿÿÿÿÿÓÿ¿ÿÿ©ÿÿÿÿÔÿ¿ÿÿ¨ÿÿÿÿÿÕÿ¿ÿÿ¿ÿñÿÿÿÿÖÿ¿ÿÿÿÿ÷ÿÿÿÿ×ÿ¿ÿÿ¿ý¿ÿÿÿÿÐÿ¿ÿçüåÿÿÿÿÿÑÿ¿ÿwÿ/ÿÿÿÿÿÒÿ¿þÿÿçÿÿÿÿÿÓÿ¿ÿížwÿÿÿÿÿÔÿ¿ýÍGoÿÿÿÿÿÕÿ¿þßÿoÿÿÿÿÿÖÿ¿ÿ§¿ÿÿÿÿÿ×ÿ¿ÿïÿÿÿÿÿÿÿÐÿ¿þ?ÿÿÿÿÿÿÿÑÿ¿ÿÿÿÿÿÿÿÿÿÒÿ¿åÿÿÿÿÿÿÿÿÓÿ¿ÿÿÿÿÿÿÿÿÿÔÿ½ßÿÿÿÿÿÿÿÿÕüüÿÿÿÿÿÿÿÿÖÿðÿÿÿÿÿÿÿÿÿ×ünÿÿÿÿÿÿÿÿÿÐþwÿÿÿÿÿÿÿÿÿÑð—ÿÿÿÿÿÿÿÿÿÒóÿÿÿÿÿÿÿÿÿÿÓüÿÿÿÿÿÿÿÿÿÿÔÿÿÿÿÿÿÿÿÿÿÿÄ(!1@A 0PQaqð¡`‘±ÑÿÚ?ö&ÌäÈÄŽÁFÏkÿÐö-\œñᥠ‹ÚëÿÑÿ +ûÿÒÿ +ûÿÓÿ +ûÿÔÿ +ûÿÕöKTë€Ò%†5 +è^¨š õLúl­Ž¸í€©fý«ÿÖö> D%T›ËýY®V"„E „ܯ +êóèÚ±–]>Óÿ×ë#°°¼½p…Ø<$ +ÂBÞ1B›èëD0²*ÔßÁu«ör&µwV$J)¶Ô¤ @Ç?Ø%zúw‘6Ç(~#°o´Ÿ‘ü|ͬ„0]؉|¬¶€,0ß¡cÊDe‘ò€‡²ÿÐê´B‰ŠÚo!@â¯â!€Tß9V*Ôu8‘kÔ½Ñc¦B!ËM»ÊZ +‘k±rFî êÍr² Q=ÿÑê8g†”ï^ñ¬“ê Ù%ó’Ìö5+‘nã& l‹õØ1B,ÒpQÝEºmNhoØÛQ ²„Ãrqä( +lŠ© `Ý–À¡”¶§TŠNåÛøà•A.»"v¤%8®íª¸æ)K:ìW”>~¬× "¡GsZaq¤>ÛÇÿÒéÿ@.Õ–läÍÕ‰í±i +°ÊËr±@* eG3æ„T)²ioñ³abcd 0¹2hRÓ4FŸÇ‡l­e¹`l©Yd^+Ù×.Ù§$cf7åBv` Ž˜…ºJ•§Q,ïrˆ®\”[‘™0!À8¤ñšDZ +ê/E…UÑ‹pb"ø0Qª41Wð•Ú}‹ÿÓèú³\¬*\7b H ¯à0Zã<ö˜ Ž]Pú«w )2`AbçÅí`èèÑ-PšÃà@::Ñ ,Šµ6ÕŽaÊAÙ‡ô ^¾Ä½¥]xLæ„Ò—´¡ìxlì%R´æÀãwd/Ä(u³ó5ajÁéG'¨4*¶^CdEÖ#ÅþÝÔª·ˆïª Î Õ ‚Uö?ÿÔõ?@.Õ–läÏúåÇàw +òôÄ’ àÁæ@¨ÑS@œdV2‰ÉVŒm^ð™Í ¥/iCØôK2i(“T€‘p0&m}èX‡%7hÕ5¶*’DXçÓª.4Gx)lsÿ¡øüŽÁ®Ö‘N€QÙ’ˆ"`?Vk•‘ˆ‰ä#Âg0½¬Og +؃ëŸ øSö)BPÝÄ?œCשּׂpûÎÊŒP" Ve· +)žFýÇŽG¤8£¨Ü‰ýx7„òF„ÍjUl½†ˆ ‚ƒØ?ÿÕôB˜žÄ`+ +°Cã–èh½hDÀnÀ´IåaµIaƒœ&Ç1ñ¡(P œÀRö±=œâQÀ4.É€;Áª1€I`1±˜lhš­[É/õf¹X ªUUsYbL€ã°­Zªç¼ +|Õ+ LÏ Jõö%í*è{Âg4&”½¥cÑ*+RVmœí±wN׈ëj¸> %Â#°Œ)øS6EÞsÒHÀ¾4€ƒ“Nb#?׃xIß$hLØð‰Í€/kÜë¿ÿÖóÎè±Ó`å¦Ýgu§~†ÈììNµh³v +¡šS‰¨ R€Wh9q).€ÊJ¤rw}´W´g èèP +„bñÀs™‡1‘M¹Q! +²9ªD<)@`ìUR!éJ!P—H二 6Pæ/³³ÊÄ%h_:'l[+ IqG­aiv‘ýSbN ˜½Bç@QÄaXDàÕšåd@@¢"uÿ×ó-ðsT\„CŽˆ´5y',-^·ÈÜ%Ë¢º°àŠGIDJhh$n®†Ò b6;ÈÄD +6yC ¢#¸„­ è#ÄÔ „«)¤<˜ïÌ´¡”DÁÐ5‡…kÆÁÉ)‰îF"1©DzÿÐòØ;y{D"wŒ ^€|í¨Ï]–ÞoÑ‘!ü±o1ô$R)ãσùm±%]œ®ppœ‘ô(nb´gP–‹å#*\3(W*†•.”+€CÄ œÀRö±=Ÿ*¦K`bH4‘|Ú?¥@Älw‘ˆˆDI ’²Mz;¹!k›m8E«rQ;|)4Ði¡ÒD&¥ÓÿÑòÐ:§ ñ&Ç£ØÅ k“Z÷ŽŽx»Yø8J"OÀPd4\³Â{ +¸¨T!ÂBd2@âÚPñ­i-©£ûhèWJãÇÃÒ%%ÆØÜ„»Æâú\ïÏ¢uK\¸—‘ñŠ +hWTˬ)’ £»9RMPèÎÜ’…Š@×&µï—ç-Çe½Q\Ê“Ä0 +,ð‘ä+M¢`N ûOtÂý²FÓÆdo"J_¨Z +j‚5 ’NR…”ý”}g¹ŸkÝøôÎá!—#QË)HT@dÁˆvRaÚ«[|hò +¡J±HŸ`—a(2•§63"%ØÅ%é®['a¢ +„Ö>Ejˆ1\ƒœ×méÊô¿ÿÒòÿ¦NÛ'öh‡„¢¨)¢“n–)‘MQÑ‚y貺4.El—ÖLÂÐŽ€È» +€$¨?¹‘ü|¶¬I?}˜S– +ÑT”ÑI·KȦÀ‹¨èÁ:5rˆu£æo—ØEp ìT@§5žd‚Kûlšs~õ>OéP :€ 6H-ÈôÿÓòóºÒbˆP‚Œôuì%…•cA@ø ED’6êb(”:`Æq«5ÊÈ€DDõmX¨[QÔâDQ¬T©pà@ÅAEf»?¡@Á-u”¨ŠtÿÔòëÓ;n÷a5 ¸5ÒÐiH…=©3Iœ„@¢•’-„*ÑÀB‘xºß+•TˆzRˆT%Ò9ôøê};‰KëDAŒ½^ðn 4¬JŠ¡Jè8ÿÕòw)Ô±2h9=„ˆD<‘'†å‰2ŒbÒ4b!áï¿Ð%zû÷•6õf¹X P3FðÊZŒ}¬4aÙý*&a¬¬#£ëØPVJ¼úoXP¢ê¤„…TˆxR€À%Ø>¹KbÔZ„Ø!cªE¹E¹¤ˆêËëÓÿÖðâjÂÔ Ú\7"(ÕÌZè±´ÍÿÐ̘S”x§ã€ªìÖ&(À²)°âpQO.& L%XM!äðÃñØ; $`DÖ~ìÒõÃ{“€1§a ö—m‡ªb&Z 0*@êÍr² Q:Û` Æ +Â@¿®è °"" "¨BèÅU&O[wÿ×Âús+³|0 ƒ9;¾Ú+Ú3…õ¸š0•`4‡“.è €íþ{±`Ÿ¿¾ÆkØÕÛrkÐû6ÙeBt?;Û×À +ƒÌ*$UnB5=WÿÐßsm°ˆ›üGgô¨˜†²°4ˆ€)ÜH1{芟úŠ +Uãš…±º!‘ :ia?âÞÓaX§phRZ Bi®4zHæñbSl“›ÙºyPù¥ËÐJ]`Ѐxs¶žDD‘ÊÕ¹w¦ó[Ë©«eH'%1gpkäP4YxÍMóäÈ’ 6 #J>¾Ö +³ ]÷åG ¤j´A݆¸Å⳸| 2S€HaE™œ±&Ä‚Oo¸'#¯(_…lcõ^Ø-ÆòBò[—l*Ôq ‘M€7QÙ‚ªâÖ°"}Qðâ2)· +,%¦S6˜”²VJ>ÜWAöL-UDˆi‰êÿÑßsl°T¨ºüSgô(%®²•B q2“¤àÚßp +ôi®%ÂSD³šÞoß + ñL­$T¯œ·eí½$ƒd*ã¬î¬Ik‘£ +Ž×=ïFDœè¥)Ù°Œë%"FÍ(gjËS?å(!Ù%]ª+ D×A À(DÄT‚øÛ›æx‡è¦„Î}É‘$ìF}c¥‡µ +e‰ÎÃ4 «’¬J°6Ír#c¹ÐpÌ»‘Qõ€‹ ¶…ÄâTˆÔ”€Ttʱ}w„d«J”î“ÜÌF䌓5<“5®õÃ2Ç”BH1Fd?ÕšábÇ&ÆŠ F/bñ#&ô€—c{PsïÿÒÆús#·\0ƒ¹9®Ú+Ò3•õ¸š0µ(vƒ—&è €íþ{µ`Ÿ¿¾æaÜÖlÙ0DPPl°n°D²ïŒÖ|IZN·ïÿÓðâjÂU€ÒL7"hÑÍZì±´MÐ̈Q´ø§ç€ªîÖn©À²)°â;0U@_.& L-J] åðÃóØ:K$ !PÞ~ìÒ÷ƒ[³?1§q ÷“m‡¢b&Z0(EêÍp°:ý›ˆg™n‘Ž gY÷ÿÔó#õf¸YEŠ>u–$È1‹ +Õª«^£–4NšîÚ10f¡jp@ô ^¾Ä½¥]Œ†àÆÁ@›<¡ÐQÜBV…éQØKÖšêÂ(õ¿9:B=þFi§Y÷ÿÕôdEpRÓ© ¦Z¬ Ç’Æ•E_éP1äb" +\­+B•ÎHÏá9& ž²"«0Þ‚ʈB+îL‰ Ã`’4£Ö}ÿÖõ¶:숈„‚"i)`ðŠåêÍr² Q=†ß÷àéÛdþÀ,êþÿÿ×õö#õf¸YEŠ86/â³4&‚¤Ñ’ /í³HbAñ êWŸ—V•.”+€CÈ…UÊ°„Q-LáU" 0 vpª‘ +P»Ä'©^~\t +]¿{¦’“ ºžRW*ÀhJDµ3…TˆxR€À%Ø9ªD<)@`ìUR!áX#³BàOR¼ü¸èº¿ÿÐèv dôÔ+Q»ŒHšî‡8$“|T€VÉ©†ñ¤·WDD–Žhø6~ ªØ1%°ae-˜«»(÷ÀµB‘Ù‰Èp#p|•´9ìä[$ÔQ‚hq*P¡jÇZFÎh !I*Wd×~äs Ðʶ€ãú}õùvü™­\«†W ÊbB +¨)õì?¨ª ,:6ÑQæhR›¸väÞŠ[–GbPKÇr(P>›+c®;`*Y¼œS·Ðç5vŒ¥E©±sC"`#‘l“QF ¡Ä¨]B…«i9ïöÝÑÝŠN1É—AB"Q'/3'Í$VK†“ +/ØæI´©Î„/¿ÿÑè¶=€!¨^ h[>1–A1m3 ’þÛ4†$> D-PºÁ€ýY®Vª-xM&vTjèïœÀö•=ÜæjÂT¢Úž^£ïÿÒé6|ÂQ½º««NfŠh"ü1GAú³\¬ˆDOwUÿÓévq5a*À +i&kÇ×j%¬À[–«sší¢½#9^©_ítÊd- A·Y÷ÿÔéöVH$¿¶Ì)©)K’´šlì܆ÞÑ] + +&„¦£7 + PXA|ŒÃý‚W¯¡'iG‡¾±Uál] +ÕÑ ’þV[…ˆ DGÃв)°â;0U@_ ,xDæ„@µîz_¦’ADA¨cïÿÕê6HŒ…­ +­êññ¨Ò Š•v2™ ¢3(ÀÞá ˆ¡…v¨+ý³’ÜÄ°‹á… œÐˆPô°C »l·bÝ" ~y +­Ï·±í€^€v(„ØÕƒçö°ttU-ЛÂØÑ8ù”Hù¹š0µ`„t£“ÍÙ +üK†å[:_ßÿÖ鶑<™0f‰FTYÿB3šãvwEšl)Û·ª0»è¸š0•`4‡“-D‚¾ÞyäýNIc fºÕšåd@@¢"xÿE8Ô£A°[¡p›-`ź@/ä¯ïÿ×évÚ¢¶ÅɦÁ¥±j,l•Å +[¶EÄPÒ„·ç0ØþtUCÁîž—K´*#qÕÏÑ$F5ªD€ëFÐ +DZ¤ÀdHÅeŠ–~àÔHDÛPaY€›ia?ê^—+ þa‘²}ãºÀ=×5¬ð€à‡Ïþ@×¹É-W-9I@„2ËܾêìRlVêm01ëÂ¥Uà¨ÐK«ˆÃæ—/@\ +)uâGêÍp² Šq8%7iÕÕ"”)Wu +ô +Á¢¾»H_@T=…Á˨n¦@QÔ•ÑJP´$÷†;NZʶ11¹ÖfŽÀ„*rø‡° ys æ\òNP¥w²0‚è!…D]|Õ‚ajвVÅXôÁy‚ˆ(9HJ];:’€ÜxÿÐéviH®(Þ‚TÙF®Ž{Š²ÆÀ¢ˆ¼J¹{åÊ„¼@ßê°J>¥GJ®Y˜?^¨10Wv¬µ3þR‚ +×zU„ÂPÀ„ÔÛõ…æSWÿ“’gùEz­û/ɵDx yTÞì0Yëi‘ FMGHâi!ÈißkJ\‡îÚŸáƒ;„¤àQJQ¼!̘M[¬;r”a-g-À‡ Úz‰ÀDâ™$€Hœ‚“ñAÐ`P€–aÐSшA +PH +¬Bô +eˆ ‰Â¶CŽOŒd `X#“!I–7 Å›f· 68„JªDc(û»ïO÷n|Êl±Òk@@׉4™x¶ÂXFm††$y#Ý“D–Ô‰êo$B–´ !kN¨ÓJÎÓÃP—(I²_Y3C@FÿÑé¶[òùh!ØÉ«rQ;ü):Îâï9ã +-ô@¦'±ŠÂ¬LhöÀ@Ãmƒ¾7d°Jú¢b„lð'µEmŠ3“Mƒ ¶D䢪T«Ö}ÿÒê6ᘖ#»ŸñÊŸÈìí'Ïí`ì訩w‡ú}‰‹3 v&Øü(a8¿•–áb(Ïè½}‰{Ê›<¸páÇubD€»lZB¬3×ôâX*äAfÀ놄¢BÑT ÆRtÔ(¤Ÿ×@Ó Æ­FK‘ì kuÅìy<š’ˆaú7\¾ÿÿÓë¶á˜–#»ã‡ë«(UT§žpóõ!*¢ØŽHŠ-ŒÚa !Ç9/* ŸÁ$ËÖýÿÔöÝ‹Ý‘vHPLH ©Dœ ˆÎ»ïÿÕöÍ‹Ñú³\¬*\/œ +k½Bl{ïÿÖö½‹Ñú³\¬*\ý +ƒÛëeØ9êÍp°=ƒïÿ×ö‹¬j¬¨CUB@±áš^Ö¹è#)€¢D¢°™¢6nêÍp°=‡ïÿÐöŒÙk-Ò #B·X$ +Ïœ«£ž¢Œ•´ ,kÏ+$éÇ~CìfûÿÑëvhý›AíeU!:ÏžÀ™ÒY! +†ü”¤L¤¨¢(ªŒQ80ÊHÃŽªÄH¢'(… xÿ¡øüŽÁ®Ö@•ëìKÞTÙÌÔ …«#¥™ÄÔ …©@+´¹öÊc˜‡n?2{È\qx’—$KìƒïÿÒêv#õf¹XU ¸¦#ÖÎRë””xôî‹ÎJZ ÿ×(~¸k‘»?f{YQAŠNýÐ µcd»83SzwáCáD2Ö +y5) °l²•ŽïãÚuñ*¸ÂUŠ…±N$UöO¿ÿÓê6lìe6æ€co¼ìMÈÜ%¸CãÌÔ „©D!µ<¾¸‘|Gªf‰Õ i>ØÙlÜ¡1°Œ"‚k°Â¨ÇÈ(aé& ¨xpœÐˆö°=Ï`ûÿÔô¶p<1^ Âëj´ +¬1LW­ù@ŒÄœ +3P0:FG’‰5û* ïã£l¯ÿ#æc"#|«(PUiªÆ ÌðW^ì3í¹` +·=0;"“ùd*ðÞr-OB*5ÉmUAT#Á\ÏâÑ*WχÇÙ\™‚gÃã„ í®MLŠt ˜ŽŒ‘8³Š°Ï))šc¥õTeµ #:äd8ŽÌ†\x2åyÊD00 Ñ ®PF +Áëv"$EšÒ +Ðb¡Ä€XÇ5z*·cÅì¢xøNæÙWè‰ó¡4YaÆ#õf¸YEŠ9j+dZUÆæ®±b V€Ká"6ݽ„Ý1% s¶JdK1il¨ô­YåŠêíÞc +y˜.îÀ†ZÐSºÌðæÍéÕN%-••«"œ§XQªrO7rf}Â4Ü<þ7È·ýÈ#£2¬•HNUœ(†ŒzñèËP¼ÀxC +í’QÆÑSÿÕôDûÆh­BAi~¾OÀ…E+‰T0-–Ä„É¢b‡ºØ´Ò +¬wº @if &–( +£+»LÔØ@à7£ 3’VÕW½è~M+q ä„y¤¶_Ni`R!sŸ”M›% r©a4U+úbILÀ‡¾døB½¬#‚ÕŽaÈETÑä=÷×rdð m˜¿ÂÅTŒ¶›(6Lý1$†`B׶hEGèÚ±–ͽ6Á.ÆPanh6õÉOrX +ª²£ÖÿÐ÷Ý‹ùä?=ÜŒ<†нP™±ÖÅëŸÿÑ÷½‹Ñú³\¬*\™€ÛÒpúLqÈ~{« x:ÿÒ÷­‹ç@¿7ëN’¹­(2²Ä æjÂT¢Úž^‡ÿÓöŸ,~›lô†Î"Ã5È^}‡Á",RÁP$[ žX +%«Í C‚¤#¥s xä:b‹a3ÈCÑs6˸¹D4 ‘'·×Äʼn[‚ë• +ë~¸€4ç~Lx + Gº\OVÓ¹÷_P=˜ƒDz@Nè±Ó`å¦Ýgu§~†Èììç‰ÎQüvô_ÿÔöšZ… £è©ƒµƒ‡›D Ì”‘c/gä8"\. +–Œ +¸Í6:)}ó.–Gàp$ÉK@$²Á–XÖ€Z>ltRûæ],‚22‰ðà¦ðÊï,¤±Vs’;ªÛ˜·Äë’ÇaÚfa%÷ÄW‘Öxb¶D èHìl//\!v Õ‚¹(¾ƒ¢- +CžIË WKÿÕ÷=‹øš0µ(vƒ—ù†€rˆ¸cH’Ó†›˜ l-J­€“ÙRôßÿÖöœQÒ6ò‡‚SÎANþ–¢hªåFzÇlZ+ +@qGá)6‘ýSbN¢+ÑRvJÚ «5ÂÀêÿ×ö‚e¢ Ë[ÊlhÐLÍ›G³Ѩ¨´Y«T]‡ójBª–•Ìò’§k·±QMU©U°r ¢ª^¯ÿÐêö#õf¹XU ¸nÄ^-À`´ +V( +L@7< X™n£³TñãàbžT¤jåíxñÇ΀lõ 0²‚ÐÇ̹ø€ÂŒk,I”\cRTÐ µc,º8|šÎâï9ëJHàŸ¡ø ~ŒXªä©ÚíìEdSD•jUlœ†È(ª—®ÿÑê6n䕬Pi°„ã?›RT´®gŸÊ‹âž(¢¢>6pë•T 3ð™Í ¥/iCØô¸š0•`4‡“?°Jõô$ï"ls$h +n +^‰¼Æ¬[næÜÀòF¨Š—4iÇЪÐÚ6ì_ÿÒé¶:"ì* èv…¨`-Ö‘:"ÐÔ9䜰µt\M@˜J°šCÉ›ñfð‚ŵR®Ž{Š²ÆÀ¢ˆ½…ÿÓé¶vÎDl,¢9‘ºrI2d•"¡'©+y MUu•wÐYj‡ +Y¾d”RôæÑxwìo¹6K‰µ¢³ÅÃèm!„Ýæ¬w…ö¼JQj° yŸò¿üˆ¼`òö§ÏpærüÀCfŽ§E&Ï,®ú -Pä!«1KASæajÈ/©R{ŠÔ£ÔO‘,î)(öÿÔé¶Iªv¬®œЬbìBÂ'K{•|PÁ!r=±ØƒÌY~&6JM1Ç-RÂ4ca‰·ˆ Dµ#µ 6 +” +´µe¶˜Á5hmP\@;¯SWZ¼EÂÉ~@콕Þ#2ìÌIÂa¶*44ÈØkQ Bæœâ~@ PB@…ù™·Í¥©ã–©a1°ÄÛÄgëáda9e +3d”!²#¦±É“÷Ù¤5(à]s½KHÉ´öÿÕéösÄçA`þC@›½8¦U†„Óu#¯Ý]¸ý»V2Ë£‡ÖGêÍr°ª@pÎc˜øЕX ãHyâ(Ú3 /g±®È½=‡ÿÖêv#õf¸YEŠ9ý‚W¯¡'y`·¥D9lœ=^˜†á +Èé €5ô”¨EH‘™~ìÒõÃy—q|e‰ +„§@9¢þV[…ˆ DGZ›àSÑ1Bœ‹½ÂB1BìqüNUHÂÓe‰Ÿ‚ë–Ì\(,‚qÐ.{¬ +t0ý»V2Ù£—Ù?ÿ×êvZ±P–#©ÄŠƒxæÔ.µ +loCÌçÍØ@î6g¹?ÿÐéöFH$Ÿ¾Í!©G õ9%ŒH-¸èå<²€ÚhȵÓÝ?ÿÑévq5ajP +í.i+Mþ‰z8ÂKaû€MÑî¿ÿÒèö#õf¹XU ¹Ž’€ÀÀJM_!ps„çc6’P«5ÂÀ÷ÿÓè¶2[H¯Üän¥h¿ÓcÇbÌÔ „©D!µ<¾óÿÔõ¶#õf¹XU ¹ÌÔ …«#¥™§C>øVø.nôõØ¡ +YšÉ“÷Ù…1(ûßÿÕó +­€Ù@¹À =n +É¥ ü^ÖÆÕK¬B$ší¦Ã€$¨…ÔæРÅBùý¬Kt&ðøp±±5!Nf L-X!(äÏü +_æË’àž šÔ‰ÚââB2˜ø +$ +÷ÏÿÖòŒ¡œ@©…j +q) ÓC´ˆ~þ +CÊÕšádA"(àsÕõ"RE]áèˆ6q±³–ækM§hýÿ×ò7V„º7Ýñ AS@`]…UUA€UT~¬×+ +¤Wú³\¬P +¨Õšå`T€ +ã9¡í`{˜Ç„NhD{Xæ-UrÓ$£QKSŸ¨ T†„ðxhþ•±ÞF" QÂ!Á³/°xå½÷ÿÐòwÔ0ÅRÂ… +<8–„˜jÀ +i&E)´R l˜²u¤¦üâxØ ª6º=¶S!¥( ]ƒ’æùhâ™f4%/»#nÐ'œüÿÑò¡1èi 0ð2Õšåd@@¢"b™è1""~O¤§]‰ ”*áºj ûQh;Æô`ù M4ˆ¡BKL±ô8(_a÷¼íd4ç%A?Ù¥¨AðtEØT A¼¹C²JŽÈ±¿ÿÒò#õf¸YEŠ85 €›„•(è‹CDç’vÒEçÛXð›Þd)q¥úˆÉ`Bw{þ¿ÿÓónä…¬Rm´áMÈ #áôÄ’ž8ǵƒ±£@5R놩¼‰Ñ«R¤•b¡-GS‰¿À?ÿÔÿ +ÿÙ +endstream +endobj +186 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [507.038 768.718 521.161 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +188 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [507.038 768.718 521.161 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +190 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [507.038 768.718 521.161 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +172 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [281.404 169.074 289.462 181.387] +/Subtype /Link +/A << /S /GoTo /D (section.4) >> +>> endobj +194 0 obj << +/D [192 0 R /XYZ 77.669 741.543 null] +>> endobj +184 0 obj << +/D [192 0 R /XYZ 189.983 227.795 null] +>> endobj +191 0 obj << +/Font << /F81 59 0 R /F123 143 0 R >> +/XObject << /Im1 55 0 R /Im3 165 0 R >> +/ProcSet [ /PDF /Text /ImageB /ImageC ] +>> endobj +208 0 obj << +/Length 3451 +/Filter /FlateDecode +>> +stream +xÚí\[oÛÆ~ϯУ„DÌÞ—[à<Ø®æ4é%ÒIPÐm‘(W¤š¸¿þÌ^µÔ…‘,8‚¹\ÎÎÌÎ7šÜCð÷°L¦xP™pšöÆó'?A‰D©^/œ ·‡ôón¶2þQ’òÞ]Ïü¼x‚ÝZC¿Ø0Zí|ôäùU +Œ0œHJhotÛÃ)N8‘©Ñ¤÷®ÿ㛳«ÑàÃè¿O& +t/Gô1~‡~æa€HaÍ€P‰b¬'%M¤Tvý³Á£þ¥9^†”¤}l.ˆ9¦æøÜí¸Šî>ι9 +Kâ=â("|aŽçæ·°t¦Å6<¦‰$ÒêˆÂ9œ"ËÝÛÖó†÷_Á‘ô5Ç_“2Qá(N(l Mwª}O¸c5$‚®¢™CÃÙkÔÌ]ï`Ž²„¨ÔóöÊ°u6HKÍÔ宵f‰¢Ü?“‚ƈ³åÑVs˜§HOr•`.½ ¦)'Ø™áúÜÜä†ìÃþÆŸ¿œãÞ c&Á<íaDü»u|·ŽïÖñÝ:öYÇVˆ9ÌJ¤L„P=‰iÂ¥´|ÔÏõáa–—wõÔŠñiZŒÝiQ¾Gˆ®òrœWv¤žæö¤`Ô_Íoò¥½^ÜÚßåbUN*«5 á5V˜Ø«í—õ¤õ†Ë$•Âe‚ôµž¦éó~9±³yƒ"&ð êE³ß#,ÝLÏd #a“owm*O[ŠÑ³Á {jND³dE‚óOÝí£f$;3Äœ˜4˜ÁìÜÑ.ý€™ 0sœ*ì´yöyײX%”Â*ë‰ÿÑÓô®$PôyŽF5`—Òº{Ûà˃vm׎m°;–öHX[5¿'B:=“t7:‘ +\œµÇÚß +$ÕÄYO¤*A k$¼û€z¸ù_€E|2Sç½üDªÒ¬w + 2€ÙXb¾'í Há`jl8Mái‚(9dKâ Á¸8Å*R¾QƒÞ›!c<§$±³ƒ_uþÃ`È@§—¯²ºX”àÍ°Ò®[ÿdUµšk|ê‹zšÕúÌ!UDFXw3³en'f³ežMìè]^¢ÚYOÜÄrb'N~•rQÛ“¢ÏV“ܯ1(Ü s2ŽeUgeÝôì)~ÊìéÙ€¡þ?/›lÛQô +·a@µ‡•0䀛y£…^9÷5~˜Wv; ¨¿pB—Õ¼¨*£á˜ÙIVgÏìi6® Ëk¦ +ç—W«YíÏ& »_äz!'Ÿs`Éœ8üóD 0ÔVNã<Ñà@âígÍ\>¿Ÿeš$ì¡]âê·gÎQý|ž—µáªÚi}$Rš%uÞrd¼9½,æ÷‹27›DUšUv|QÎìÙMno…•´yèVx8©óÊ +ª¾ÑŒ¹iÏfµ3«A',=h{!€@ÔŽ·÷âa F“¿|iºü\Pn™ÐêIüú3‹0 +ÞŒ Ò´ÐX®³·M+o$E¹÷êÌÔÌ]S±š +FP5-¨z(DUT;ä'àýÄ•H*´KxxBsM †Ø0È ‚äÎ!Š“|â +†¼Êfö|š-'Ÿ0SÓŸÄ*‹íúS8Ëid3`¤ý ˆsÄX7ÈeƬ›¹¯íÕ|QÕZ+ÌÛ^N4àô½¢œä÷pmlÎ؉Ö¶ÇöÎÛŸ~|•ØÓ+Y=ól€û­v%Ä@qˆ]"ØX·ãiqï¤2›oV¼¼vf”BUft½º9¨µ3LqŒ(šZéáê>ÙLkE[O 7WUQÞÙ¯ÙÏvì|¶k¥~´bÎ+{?sô&°‡Ã{£Ôwk½Ñó}ØAeú¢\”ÃØGsW/´©MùaΗkk‰fjj$¤`oúGõ«âÁÄéu7— î:“4† óŒÓü\Tµ|V-ìíVáރѕ¾U/ìïbP0è)> jÐH5 + 9$&m4`6”ˆÄy”Žm‘Çf‹ñƒŒ‹úÂãb¡ë +r·ZÚ º%–)¯ë„ývA¶Û`a4Ð Zj%Þ™ê7ÖÄÔmžHÖ(Dñ6Û Pœè†m +£M¶_]Z.]Åy=+t:³ÍèOáŽôG!­FžŒüô‡3Ö³×ÛË3 3! +ëdyM„ANÜXþ6¤Qq.(µy¸l/D˜èEß­³²HnÈ“Â;‹×Ów¿ H +UɇmUp +”Ç«bÒR'BšngŠPN´#I˜ƒ4$­ÜGŒAèÊÌœü¬³z[q€kDýg»jƒ¼;o~ï{ê2î<º±ß?t!Nðô‹\Ñõ'xÙòó®h?¬ü¨Räú>s:+陋8òQÙÔÊŸô3„ΆüêKY‹§éBÁÓÄ +6 +Hµ¸™N¸ðn&æ§ÁÍœcqþÇe‹³é‚‰àlb&nÁõÑ«6­˜ lhvTÀ2æEá>`¥H͇AÓÑ4ÚÐÄÀ¿¦äp4¥£ÉÍ|[80ÙT‘oã‰{8ñ·¯þ¤hH¯®(iCS +hŠÐDQ²L0áÁ3áÁ„ÓÃPVT;Ê÷^†ŠÍy{×Çy1Çd×nèhòz„ÂΧ'A*û·‡S w<6èa–s:+í6ƒÙÅÃll_¼øÊIªf³ïb® €]¤ûA׉èt±èXQÙÀÝp?êºá£.æ‚* r#]ëEôÛŽéq¡ú?yps-ø~àjðxš†NÂOiBÈiÀ;šF ðh +&íÿðÕ€wíÞU×Åçvð]SdÀÇ[À×…ø| +ñyÊÆ^'L8ì5˜øªØë‚k½×Ñð`ô®Ô$9­¤¦ꦤ°Â.÷Ðÿ;¢äÔ‘H¼@,ÎWÉ|¿TGòcËÈNän –£Œä„¶øN¸ð~ aT‡—‘0`3ÑVF¿êŽÊô˨ÓÊH½‡JžVFO£ +L'\‘o%—íBô€£Xt,¥88žvÂ…ÇQÌÅW§]p€sݚ˞`ð>œbûåÝ)á”@üÇ\tN‰B!àîÞËî +›pŽ´¿©·¯ÈàÉߌš"EûÁÞ +ì˜3;á!@7æ«ýÐ=~Õí˜IRТýhòÑ1“ð4‘”3§Ñ‚$¢¿{`é7õêµx(5pÄ«×n˜pXj0Ñ×yõÚ Çy +Ž‰H[ w¢Éè +ÞNãËÐÓ߇c|ôŽ¦Ñ=–&Šðo$]íDôºXt%Ô¡Ùj7LxÐÅL£— íÙªvú»«ýhë‚Õ€¶†¾d ØN4r6 Û??ø2Ø 0§éiµáñ4ÚÀF ÉGäzÝÚ‰øp±øœ°ƒ× p1­€³ŸÓ<t]°@³‹YKaxŠµ»ÂP“éi…!–:M“†Xi~pgïY÷Ö…0íQÞàúÛxÚ‰üæ +ù›É,Wl?Ì»aÂÁ¼i:‡W†0áÁÛd¢­4<~Ùí©SqZiˆ!Æ vZix<60 ‘o÷ÿ÷ùi'¢Å¢Kuð—Ý0áq3ñUÂe'ìÄÅ쪖hyª¡À +Æ_ +¸/ÐØ ¹¾¡vj¸0¥+‰Sÿå8†Ùìâ?@PdL·þT‹Õrì†WUv—7?¦ï,_æ¾#ζT­dãð¼Ë>ÝwòžÝè?¥ØÖA» c-à”šÏ¬Ð†€ÍK)LÒ •ê65Xd›mIº“WêϤSbº’Rä3f×ëô¯þºÞ·}*|ñ·³^UÓäQk¸õ²ºÿF4–ý}åÃøª²®gƒ6ø!Bå£hÿaöìÆ +OŠuïß[ÝH/×=ƒJ·í™-wM9ËšmV\ŠG1ôòúrc9Çâ}f_íXoH ”àÔ‡œŠŒÚ¾¸¥£©n`"ªÙÿ¦dßÛ¾3˜ç¶ÕS¹¾2­ƒÊv™Ër<»î—öÖM^Ûš¼´W¿½àþ™£nZxÔ6z€Úº¯ÌtÄ<ÓÙ)íu“=×#™X.VwS;’Wu1÷ÝœjÝjb fðƒÖÑ-´ô¬ªÍæ÷pk¼ðtÆ/ŒüøºcÓ¬’ÍÁ6|ÿÏ8+C÷ÞM¾nÿÉ–CyV3ŸœÛ®¢Ü÷!Úö(8{Ç?xWtO¾í®·+•Ðø8É묘E]E›ŽfØ .Ðï|:–i£ø§ú+Ë«¿&‹±¥©»›ÿÑøpj@ ³-ß6äÚ²©çˆ?'¶šêÿ'G†Ž +Ý·i›*m¯ÔÝÔ;Jpµ¹-E¬LTGXS¶W£ébž¹çÞ¬ªñÔuðÚžP©ÿ\¡V€ll£¯rqÆ +{iõ²XÞmþ‡@ÿ÷/Æ +endstream +endobj +207 0 obj << +/Type /Page +/Contents 208 0 R +/Resources 206 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 195 0 R +/Annots [ 201 0 R 203 0 R 205 0 R 196 0 R 197 0 R 198 0 R ] +>> endobj +201 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [507.038 768.718 521.161 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +203 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [507.038 768.718 521.161 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +205 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [507.038 768.718 521.161 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +196 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [153.921 648.176 161.979 660.368] +/Subtype /Link +/A << /S /GoTo /D (equation.1) >> +>> endobj +197 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[0 1 0] +/Rect [386.439 85.56 393.417 93.82] +/Subtype /Link +/A << /S /GoTo /D (cite.Xilinx:wp284) >> +>> endobj +198 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[0 1 0] +/Rect [416.35 85.56 423.328 94.125] +/Subtype /Link +/A << /S /GoTo /D (cite.Altera:01007) >> +>> endobj +209 0 obj << +/D [207 0 R /XYZ 77.669 741.543 null] +>> endobj +212 0 obj << +/D [207 0 R /XYZ 246.389 699.863 null] +>> endobj +42 0 obj << +/D [207 0 R /XYZ 77.669 629.776 null] +>> endobj +213 0 obj << +/D [207 0 R /XYZ 197.641 142.268 null] +>> endobj +206 0 obj << +/Font << /F81 59 0 R /F123 143 0 R /F53 210 0 R /F56 211 0 R /F97 85 0 R >> +/XObject << /Im1 55 0 R >> +/ProcSet [ /PDF /Text /ImageC ] +>> endobj +224 0 obj << +/Length 1362 +/Filter /FlateDecode +>> +stream +xÚíXÛnÛF}÷Wð‘ÂÕ^¹ÜG§IŠI‹ÆB_ê ¥µD„"’Jâ¿ïÌÎ’¦b6È‚—«™Ù¹œ¹,e‘pøˆDØ‚ig©,3ªH¶Ç«ÏWœYn¹K’i“='áù(í—ñ DÎ +“ì“ðøõJD[Ùh,›Y{½¹Z¿+À-˜UR%›‡D‚i'§6»äŸôÍÇëw›Õ¿›ß¯8ª½o7“ê…0þ‚Ï(ùs@Ü t wÌiX«˜µŽì_¯2ÃÓ·a½YeJ©_dX‹°®ÃJt7ã®g{ÖœTÜrÃgŠ ëë°KÐ5†|,˜•–0R°‡-'ïþ^ ”Ër‘¾‡U¦†õé¤eÎòœLAs&B{+M> Îa`¹¬f’Yðìø¢s7 Î)ͤ+FßÞ·®Wx‰N½]²%…fN™ñŒĤˆeHù,ÕäœL¬qL;–`Q)b>íÓ ÑáqôõoG‘¼iC™Låug3å/ÕñR/ÕñRÿWÏ®˜Ÿ«kYž»Ä +ÅŒµ±Jê*mð©Óáà‰PÞ·+aÒ/+iÒHÚ¶Í-çrîV‚§åPµMOœª‰§W®$OkOÉœû¨åPv»¯¨ºì"åð¸<Ò!¿R<ýv*›L0Ì›Lßw¾6u[îªféuß> “NHÀ’a˜†¢ÜûÆGŸýÔY™ví¹ÙÍ ÷HiÕ»i"<‘¨ýùtj»U¦y +ŠV‡N7ˆrw~ <ðüñ„ÐÐù²‰}óŒ G¯¡<•Ã!îÜ–óHtlëm{<Òi}[ØÍPC “R*Ú->>½š+Ò#q®«áTÓ‰€&J‰NËÝ®ó}OÔ¾Ú7eݧŠÏ¶ñÄÅ !ž5鱬¢{/ûP!H~@S€ÝBHߣKh18®… jñÔjðþX~«Èó#q:ÿù  >Rw +x›ÕºpŠA©Žíùð$4,Œ+®°\å$F{úÐæÉLðÒ=Ø,´ù +ù:•å  CK'žÕC»©C<ð²(r愸DŠš±ëCãAµ3òÖYx•eJç½Í¤d9ôw¦Û¦·àæ5xSÕÑ=œW¡> endobj +217 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [507.038 768.718 521.161 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +219 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [507.038 768.718 521.161 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +221 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [507.038 768.718 521.161 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +199 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [258.339 710.153 275.495 722.596] +/Subtype /Link +/A << /S /GoTo /D (subsection.5.1) >> +>> endobj +225 0 obj << +/D [223 0 R /XYZ 77.669 741.543 null] +>> endobj +46 0 obj << +/D [223 0 R /XYZ 77.669 641.322 null] +>> endobj +222 0 obj << +/Font << /F81 59 0 R /F123 143 0 R /F97 85 0 R /F101 110 0 R >> +/XObject << /Im1 55 0 R >> +/ProcSet [ /PDF /Text /ImageC ] +>> endobj +234 0 obj << +/Length 2581 +/Filter /FlateDecode +>> +stream +xÚí]s£Hî=¿Âµ/‡«bBÓ`ÌܱI–cgg6µsµEl&æÖ¯Á3“ûõ'µ„ +¹Ù»{J•QKjµ¾ZÝꈞ¢'œ‘n¹vÏ”ŽnËQo¹½øóÂÐÃ1Ü^ï Þ¢p>s»jPiè#»÷ÒSŸÛ Ák +êÅծ㋫›(b Ý‘¦ìÅŸ{b$tÛtŽJÅ«ÞoÚ$ônâþ?âŸ/  +rýø(ºÃŒ_à¯æük€†+P¡«»–Õs©;ŽKë{ýmh¾úúiŽ4¡¦ú©ß+õKx·A½jÀ¶ú’ˆO†m4Õïµú’ &ÍV:ŽtÇtÈG` +Òî±/o0Ú~Mm®~gÇ™Žî:†2N +]B¥îÚìÚO¦=<26Ý -ðUƒs 4»¯Q¹¨C9ié¦;ªu›*µ¼þ´D¥ü®µLaé®´ë9—™øØT1oÄÚF×ì9¶« Û©sp4²MÁyx‚ѶE“kðWÁVô&…Ê“c~°ìACøôø‘?ÒãGz¼ŸoN™÷ÒÄuà˜Ó¥54QçZ!uÛqHq§?†ahÓl™æeJF$ùŠ€i–Æ,©Ÿé[»áe±bhÛÀ^¢ò– 1­ RÈ’g²VE¹žß‘m€Ï‹ +r”aB%çý$Hõª­PÃècWǯül“½ÇÚö=Ÿ‚ùËM’m!p°¦ÞöÑ€CVÚÂþ_=)M“’¾í<D+ uò+Žö)¤Ìê 2†ÊÎ\‹¨.×"¾åZ)%»IäZ„еÐ'¡kçN­“÷˜}w{ÞÚŠ`ÖÊîò²4­¦—¹Ã:Í«K"WP¤A¯ +æ/€qOèmR¥l`²aUZ›ª±é8d´¥[ÙЫÿ#ú³4c]‡­r‡ZžlSB)ï†I€Ø¿$yö/ØúB#“™G €fNR¶¥¨ ¬33`^±gê6és¢Áà™u‚z¹âEŠ÷âœæ+‚„Ie¾àämQ¥Çä¤RCHM>ÂÒ2.ç„ý ˆ›ó + ²ø\}ÅXQÉÌ©º"y—.©¼ÖËqµ_y Õ5§E â:B¾ÍʲŽ(DÐ!›1¾ àÞbÉ¡Íoâ¸û½ÐGŒ£Õ”‡:GÚc0ñ'D½~"j|ç0ž?<…Áí]Lô»ùtâ‡,›ñ¬ñ|‡Á5îíEŒ÷ yu?yx‡ëIý„ÀˆD Æ›=Æÿõ!ô#曇Ìÿ0 +ü q°=¡7‹¸Ÿ—Ì5O“`v{IŒµBŠ8›£b<˜÷A ò:t$ýñç’ŽHå +i[ +%{¦„ÂÍoˆñÞÇw@è ÐÍ»¦AüDd.7A<#+ÿF™‰dú<ÐÄ3<Æ‹®$˜Yíö‡Eø0|¾–„ L‚h<õ‚{P×áÒnh0VX£¾þ£*+0ºó¦S•õ¦p›‰€xJ‚çüíLE¹öé; +¼ë)Ã7õ4 }‡~“ ôÇäC<5¡Œ³sœÀ˜CöÖ¾ž2gôà H)Bƒ=õ…uHT<òQzƒ(˜Hä ÚàÝ{‡[¿3£ñÙJ;i7ÒöÈ)í€R§´í´#NjпW¡@.•S¸‘×QÄ‹Ø'üí|>‰˜%d?téøŒýèï°S!ŠÓ9&B(¿‹È¿$ˆÌUŽdw2À/+¹«Äqä‘B&Gå4b‚Yì‡!J\<ÄÁ|Fwm¤ÜÍÑŸ!ÝÂŽ¼{%P +½$ï(óYx"2sÎ!%†ÂcŽÑ–ãH#òãü!q,Jå«Šî)§Acâ%i~m,a:¼ Áq¥ÍK”V’jæßNƒ[6öÛ“)[PSôQùu‚õ ˆŽóÕæu؈ zaPþP"1˼é¬sª¬I¾&€RMðé!¥YŸëÊ%¡°J[Àìž*1…¬%‡C}Š‚clpD‹ñ‰å­ÖégÞ­öÎ$Ò í˜Šõíò«J7NCµñÍSzfdT5œ@5ã͵hª·\ò Ùí6™º¯óivƘeR2#\J (òÍ+áB¢0g—\µìØ)Úü +Òå¡J¨+ÆûkÔ] +@õ½:Ô² tÅßÖųԕÚ:Ù¯Nëã¼UZ.ù걃·ù® ›»Zo»Ë6ª¥ƒQžVx±.itºâ£Ëê}rG«dÿ’¢O†f[øèýíÂÑUy¼Îv +”ÚKšC,¡²$åF ®Šüo,çŸÔF_³Fœb:|Ó¥!½³•žuirtl%†Ü¥uØ¥.­†Ùê^qL½¹Q·4†ÙÙ<ºÕ<ÜK5ç7$œš€ëæÀ7̓a¾Û<ÔúÿÕîšZ|I•”ë4åþ^u¯M:ߢ¹‰?µÓØÛS¦R×Ï5 ²JïzÂñ6g_ÈƯËM‘§A€c(QEä*û„"ÿ«ã¬õ*GDµóا/WèFö)ó³¨UºMÈ ”DP‘F†5O>©Eã1…DÛµ6õzÂÇGžŸR³ñº6aïsÊò£¢„9~.êgN8-Õwy]Küšm²üº 6X„»­B+’\âeÓ±ØU> endobj +227 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [513.103 768.718 527.227 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +229 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [513.103 768.718 527.227 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +231 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [513.103 768.718 527.227 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +235 0 obj << +/D [233 0 R /XYZ 77.669 741.543 null] +>> endobj +50 0 obj << +/D [233 0 R /XYZ 77.669 724.535 null] +>> endobj +232 0 obj << +/Font << /F81 59 0 R /F97 85 0 R >> +/XObject << /Im1 55 0 R >> +/ProcSet [ /PDF /Text /ImageC ] +>> endobj +245 0 obj << +/Length 1452 +/Filter /FlateDecode +>> +stream +xÚíXKsâ8¾çWøUk!ùí#$d*[avv`÷²³5åT±%‹¤ø÷Ûzù‘™ÃžRT #Ë­¯¿þº[†x>Ä#i†¢<ö‚0Eq˜ye}ñ㣧8÷¼öÂ9¥ž·«sýÃ}Ã$FYìm<ýõé‚ؽ|·™ßÛm¶º˜\g$"( +ƒÐ[Ý{$#(ÒÔjíý3ºú:½^ÿ]ý~•i°;_µ¦O¸ñ'|ÜÊ·!pN€$Gyyi¢4ÍÍþÓ±ãÑ\˱Ùˆè3=NôhæóÞÝIï:ÖcbL|Ã1î¾ÔãLp‹˜ESå¶Æ˜¡4H +G!\Ã%6èþµÎOÈèÆ`ô‡?·O¦(O±v.$(„†(-µß‚8iöi@I\õVúÙ +Üò¸0BAž9l·ÖtœJj~j¯€D(c÷ !@YÇŽy/Ö1,Ì/sDâÔi0Ëâ€Xv×úfÔyØ]Àüä¦&Þ•Ð:iõamû=ãòøLJ<>äñº<^t™×d’§ÐæP%ÂìÅije4ÈŽùž–ûq€G‚«ñX7ƒhLöhP¦ü C8$Vyë1‰Gêñ‚—tmÌÎ9Øõ ˜ÜIÆõäR|]èýì2%°é|©Å4Üøÿ)RÁƒþ +Q´’ÿ|³\+Ån·E£ÛBá{d³Eew0Tn't˜¸Z¨ï!Ž€Fam,¯Ü*Ië¼a*g°aÞÒ¥ݒm8SPÊ‚Û©“·ËÙ»¸¨º-tÕÁEÒ™g|  “+¥û³ýYˆ·º³x§;[¶ÙÒÿÏ¡Ï:Ñœ|nx#™<8©8iô«×s…¬Æ †½µ¶¹¨ÄæØq êÔ»HøkÙjRm¼fÍ hÚéÙ¾.¤¶J8c—[¶ë/Åå»ð,»|¢;j²ÇÑyàeŸmÆ¥]Ó®I±¡]µbõ®¢5……ë!nyUÇ*k¾T®è>ì†~§&8.D0e›á§J4MaÛÔÛûž-> Âs‹úŒqµ]¨¶Ó`¯Ø†É߬/RÔûŒßá—ªí ìºü±ûk'0çêåQÒóƒê:èóVØ,ðmIÕ-øI +źPÈvA +õ¢:CöšÙ¬gî;rªFØøUÕÊàAR)ÏoN ¨•/Zþ¯Ã7çPÚØ@/(:Á¶• \îEUµwJQ׺ÙpÛÏÑù‘«i-œN +£p>Î +æ’J( QbT¬Öûö(ó*_udôÃuUXŽì‡,lÌŠ=¨ZHÍÝé¶Rk™ÂŠeeú³.ÌY÷È +sÓ5`¦)jj¦,óCŸ@ºÙ‚¾:ÅFîpätU¸` +•È' " TgÇós£/ì¬{ì•ð»å?ÐàšÞik˜ V£ð&ó½èÔ£iH¶îw{8§ž+úUžAÔ:«K哲K©õåæ‹)öîÔäŽâ¬ã¢Øß1ÛZÚ„Ù´Ú&+D1ŠFÓÊu…Sïˆ1AAf^óŸ¿$æ(Âö%±}Sõ„u(öÑ[mGÛ’ÚZý’æ짉éD!F˜À{\¢Ä…lZÙ~h³o³uâf©ÑöàõÆV]GŒs{ÙB±Ï}=4Ð ­§.€Ù,r;ÊK@؉ýF/“á(ñúOèln¾´ù¾ewbxgJ§:rEæ¿Hp‚ãI@žÿÁúÃÝ7¬ +endstream +endobj +244 0 obj << +/Type /Page +/Contents 245 0 R +/Resources 243 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 195 0 R +/Annots [ 238 0 R 240 0 R 242 0 R ] +>> endobj +238 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [513.103 768.718 527.227 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +240 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [513.103 768.718 527.227 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +242 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [513.103 768.718 527.227 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +246 0 obj << +/D [244 0 R /XYZ 77.669 741.543 null] +>> endobj +247 0 obj << +/D [244 0 R /XYZ 77.669 704.629 null] +>> endobj +112 0 obj << +/D [244 0 R /XYZ 77.669 685.546 null] +>> endobj +115 0 obj << +/D [244 0 R /XYZ 77.669 641.038 null] +>> endobj +183 0 obj << +/D [244 0 R /XYZ 77.669 596.53 null] +>> endobj +121 0 obj << +/D [244 0 R /XYZ 77.669 552.022 null] +>> endobj +120 0 obj << +/D [244 0 R /XYZ 77.669 507.514 null] +>> endobj +113 0 obj << +/D [244 0 R /XYZ 77.669 463.006 null] +>> endobj +118 0 obj << +/D [244 0 R /XYZ 77.669 418.498 null] +>> endobj +248 0 obj << +/D [244 0 R /XYZ 77.669 347.453 null] +>> endobj +249 0 obj << +/D [244 0 R /XYZ 77.669 328.37 null] +>> endobj +250 0 obj << +/D [244 0 R /XYZ 77.669 288.733 null] +>> endobj +251 0 obj << +/D [244 0 R /XYZ 77.669 244.226 null] +>> endobj +252 0 obj << +/D [244 0 R /XYZ 77.669 204.589 null] +>> endobj +253 0 obj << +/D [244 0 R /XYZ 77.669 146.532 null] +>> endobj +254 0 obj << +/D [244 0 R /XYZ 77.669 106.896 null] +>> endobj +243 0 obj << +/Font << /F81 59 0 R /F97 85 0 R >> +/XObject << /Im1 55 0 R >> +/ProcSet [ /PDF /Text /ImageC ] +>> endobj +268 0 obj << +/Length 2132 +/Filter /FlateDecode +>> +stream +xÚíZ[oÛF~÷¯ °/ +çÂápúæØIë"·‘»»€4EËÄÊ$+JV²¿¾çÌ…¦,Q½| RPs9s®ß9sqY@á ˜JI¬eÀ…"R¤Aþpòç %Š*ªƒ kL÷‡p½£Ö¦ãa’T‹Àüü|Âœ¬©6íI{{u½OA‘˜%¸®î–2"¹ê”ºš×áù§Ó÷W“/W¿žPd +|ß]u¬˜ñ;üó”ߧ@5CMtJ ¢”¶òO'SIÃwæ;›LOCf:Ü|SóÌ׎ëÞlÔkKóM,‹ÏTÒã3ó}k¾0Å,Ñ)šmtL‰âÊúH@šÔj÷¯ CºiÂÂðåá¥ù~ìV*¢5Æ FP-k?s™t„}7$_õ(§F³ßü•›PNÄ„ëÔëöÁ¨u:IAKTêÝ!YœÅD é×0.ã +|ÌMÌ{±–@¨y ¤&L*Á4•œ9>µÍ¤”0dûŒG,8¯ +N:|8ÞÓóðøðøaxìí2C0Ñ +¶9"â„£Î^&ˆTÊ*þ©¸›0«¢Ê‹vg·Û3™“–MyJ¨`vù5û²³&¸W8ï˦2­À‡‰³ªª7U^V Û_ßØàa6œp óy1·S É +bEÃoͺ¬+;Ø®³jž­ Â0+Z„ÜPߌ'h~ø1ÃEÙÒ^Tíº\oÖ…íÖw¨-lÞDÂAaŠŽˆ]¾Ìœ€v2)}æ¶q5aü“ßWõ²^|ÃAƒuúñbve0t …m¼Ý¬ŠlcÛç`“aiL,&ÐDjÁ@ZÝøuŠºÁŸ³ܲjo' q³Z˜aþv>Q4tbþ˜áäcµHkÀÇù?NR‹EN)sÍëËjYVÅ×=Ä4´~/—™‘·,~§Çqx¿^7?EQÞ®rR•íš,,ã¨ÙXÂ27.n£Ï”òÆÿ@¤] ’.–!ôI3¿ÛEÇÔ{°$™Süšbèße{[WÚ®0›cš†yýÐ@DWvÐ:«µ¾}‚B nËÿ–M1/3R¯Ä’÷Ý!G$TxGÙaa/Ä‘WùÆ«yã4D¬üã 3Š|xÌ=‰s8èžO`†"ú :‚kkDQ.—f¬ô™5Sa[çva¶ÊïËu‘¯¯nª)òchìyÀ4$ãcÙšdDÂ[ô}ÊËr·^Ù:rÐ;—«EV•ÿ{âºÎŠf +Ƥ‰A,Ÿ°Ðõz±ÂîP¬˜ä]°¶Ûí$ÝêN`¢67(ÞVË:›·Q?¼nÛ[tÀÍ­ø;ÜúÀă¸í©ºD§ñ$Ë +Àp‡®Ìò‡ä¾ÃŸüÉçQÕ9³Îj[›ÚŽ:'")8Ò²¼€:kë +·õ׬D<Áý‹]ükÝ>M©ðìôïCQ…°ÉW²¬³–@êDËÒw ÑèM¶ŒªåM†œ:ß #¿7jò`ÔNdP\þ9‘¸B„@À7p‚Ž¹«ß¬ÖÙ°eVÀž¿Úîh8ðXšÒ®MÞ|J;×,2KLË +Jƒ^‚ÿ}{'%Ÿ4³ð?%øö«¥½¨rr$"f;ÒB…êE‰/’Ã`p†@jƒC|vjÿ˜! +pî|lÇ ÞŠØÁ^¼±Û7¶“¦¸Û›˜J¾'|5F ´›±nœ œo +ð<‚:Ú¢£nš¬ý2Ú6<¿7þÉ`ÖÎÖ>¯ÀÇ’é°,KÛÀص¶ùhKŠí|u1ûaÇṫžpº'¤< Ow +¯ÿ˜Ã7®B ÑàÃ<Ù™|wãè!cýê!€x z*]õÐú`õÀµ‘ƒ+ +pÂy ppÄ[—9ÖwœsÀÁÁp°;P( åEecÛÀö@B +w y~4†ÀM87‘8Ig÷Wñxl«Ù/pB/2, +î˜ÿgw +WŠ$°T(¸M؇žë/4˜ÃØ@\0¶†ò!ˆá˜Î^†–Á Îó; aèÌýÉVðMsÅcèÒ¡¸¯‹E±ˆ¸FñÂ;÷…¿ +Å/ÖfÅLC„Å8(æ@GSbqÅcHõ(îK=ŽâQ¤zïˆ}Bñ¢¨ +w ÉÛa¡Jâ¾*ÄqÄé0ˆÇÞ¸/üU ~±6{ æšÃA_gh¡0ð· ¦šh©=ˆãa"Õƒ¸/õ(ˆÇ‘êAÜ›/ ÷Óà«4º«ªéuÏÃí½ÉÖ®¯qÓCw¹'ºÁlŦ.ú6ÙlDzaá]6ô…¿&^®ÍÞéY°8yÉñÜ¿•xË$ÑJ%h˜ã)%\7<<ÍÓ\{“íÍ›Ñ<üƒ‰ÿÓ¾ýAæØ¿âä´ûs… +†9%šíÿLEýs†;Ǻ깸_·n h û´aŸ'æ;\?sɳí]Ý×Y;àò@ÁÙŠ‹`š€}îòdžfzïEùùÿò_ñ? +endstream +endobj +267 0 obj << +/Type /Page +/Contents 268 0 R +/Resources 266 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 195 0 R +/Annots [ 261 0 R 263 0 R 265 0 R 236 0 R 255 0 R 270 0 R 256 0 R 271 0 R 257 0 R 258 0 R 272 0 R 259 0 R ] +>> endobj +261 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [513.103 768.718 527.227 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +263 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [513.103 768.718 527.227 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +265 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[1 0 0] +/Rect [513.103 768.718 527.227 784.259] +/Subtype /Link +/A << /S /GoTo /D (page.12) >> +>> endobj +236 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[0 1 1] +/Rect [242.783 655.024 511.681 667.467] +/Subtype/Link/A<> +>> endobj +255 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[0 1 1] +/Rect [405.535 632.508 537.878 644.952] +/Subtype/Link/A<> +>> endobj +270 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[0 1 1] +/Rect [94.258 619.09 293.834 631.403] +/Subtype/Link/A<> +>> endobj +256 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[0 1 1] +/Rect [354.972 582.894 537.878 595.338] +/Subtype/Link/A<> +>> endobj +271 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[0 1 1] +/Rect [94.258 569.476 169.624 581.789] +/Subtype/Link/A<> +>> endobj +257 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[0 1 1] +/Rect [218.358 533.411 514.139 545.724] +/Subtype/Link/A<> +>> endobj +258 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[0 1 1] +/Rect [514.657 497.216 537.878 509.659] +/Subtype/Link/A<> +>> endobj +272 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[0 1 1] +/Rect [94.258 483.797 411.912 496.11] +/Subtype/Link/A<> +>> endobj +259 0 obj << +/Type /Annot +/Border[0 0 1]/H/I/C[0 1 1] +/Rect [94.258 434.183 332.327 446.496] +/Subtype/Link/A<> +>> endobj +87 0 obj << +/D [267 0 R /XYZ 77.669 741.543 null] +>> endobj +269 0 obj << +/D [267 0 R /XYZ 77.669 707.42 null] +>> endobj +114 0 obj << +/D [267 0 R /XYZ 77.669 703.399 null] +>> endobj +116 0 obj << +/D [267 0 R /XYZ 77.669 651.537 null] +>> endobj +117 0 obj << +/D [267 0 R /XYZ 77.669 615.603 null] +>> endobj +119 0 obj << +/D [267 0 R /XYZ 77.669 565.989 null] +>> endobj +214 0 obj << +/D [267 0 R /XYZ 77.669 529.924 null] +>> endobj +215 0 obj << +/D [267 0 R /XYZ 77.669 480.311 null] +>> endobj +273 0 obj << +/D [267 0 R /XYZ 77.669 383.937 null] +>> endobj +266 0 obj << +/Font << /F81 59 0 R /F97 85 0 R >> +/XObject << /Im1 55 0 R >> +/ProcSet [ /PDF /Text /ImageC ] +>> endobj +274 0 obj +[500 500] +endobj +275 0 obj +[405.9] +endobj +276 0 obj << +/Length 194 +/Filter /FlateDecode +>> +stream +xÚÎ;‚@€á!$Sè +`.  ,ñQ‘ &na¢•…±RK ¶àÍä(’‚0bbkñ5³“_ÏÇ¡&Ÿ4ÒŠ¦t +ðŠ:”¡OѬ9^01¨v¤CT+£2kºßgTÉfAª”öù4)]Àk=ˆùÌl »²SÛìTK`¯OÈ;1@ÜÉEÖs´¢ùS·›ý¸ù÷ώ܈?· +Èäv+ +´4ÒTK[%¥´à1H;àÒàß0)P7 +endstream +endobj +277 0 obj << +/Length 173 +/Filter /FlateDecode +>> +stream +xÚ3¶Ô32V0P0bc33…C®B.c ßÄI$çr9yré‡+›pé{E¹ô=}JŠJS¹ôœ ¹ô]¢*c¹<]êÿÿa`¨ÿÿŸáÿÿÿ@¬ âûþ@‚D0þ ÿàDˆ¨ö`¢HÈ£€?yšQ`ãíá¶Õ£¸ì4æç‚öÌ3 ¿=ÈåêÉÈ+QlV +endstream +endobj +278 0 obj << +/Length 148 +/Filter /FlateDecode +>> +stream +xÚ3¶Ô32V0P0bcs3…C®B.cS ßÄI$çr9yré‡+›ré{E¹ô=}JŠJS¹ôœ ¹ô]¢*c¹<]êÿÿÿßÄÿ Øö üx ö ÁÀ€A°7 þÈÐ8ìš:ˆ^l†20ƒ­|€Ÿ9üÁTì.WO®@.²“{y +endstream +endobj +279 0 obj << +/Length 183 +/Filter /FlateDecode +>> +stream +xÚ3¶Ô32V0P0bc 3…C®B.c3 ßÄI$çr9yré‡+›qé{E¹ô=}JŠJS¹ôœ ¹ô]¢*c¹<]ê?0ÿðÿûÿâ¨ÿcÿÃ`ÇÀ~•8F4‰ã`âŒ8 &Àˆƒ`â +qà*Q"jà„ +ˆ°ƒr BDð£ìûPæ @‡ÿcøÿL0B‰ú? ¸\=¹¹hA +endstream +endobj +280 0 obj << +/Length 181 +/Filter /FlateDecode +>> +stream +xÚmν +Â@ àh‡B–{„æ ¼Ö£C§B­`A'qRGEçë£Ý£Ü#8v(‰àærù;W-–ŽrúFEnI—ïèJÉsMµp¾aÓ¡=+Ñnäm·¥çãuEÛìVT méXP~®¥G€”Ã@ÆÜ+²àÁôi„9¤oH~¤,x!aÁ(™RRõQѾIÿ0é>F^ÆXnÊŽFIxùP\w¸ÇòFZh +endstream +endobj +281 0 obj << +/Length 191 +/Filter /FlateDecode +>> +stream +xڕͱ +Â0à  +·ôzO`Z#…N…ZÁ‚N⤎Š®¦æ£ô:vwÕÅEpÈwIþßä“©¡„¦|LN³ŒŽ)^Ðd<'2ÊÅáŒezK&C½ä-êzE·ëý„º\Ï)E]Ñ.¥duEq…û"ࢎ±ÎòÞA „BÔsT܆ŠgÀ4Êæ!ßFÁýdx?V,HÔHJ|ÄE]1Vú–Ë}§üà;°=·¶ÅE|Ÿ9g1 +endstream +endobj +282 0 obj << +/Length 178 +/Filter /FlateDecode +>> +stream +xÚ]= +Â@…_H˜&GÈœÀü,‚°#˜BÐÊB¬ÔÒBÑ6æh9JŽr‹%ãD;‹¯x?3Ï,f…ጿÌÙ|ÉéN&WMr +Î7*kJlrJ7êRZoùùx])-w+V·â£žœ¨®±ìˆ´¡H‰ô±‡¤]Òζ¾ùÑh³‘ñïhí@û°ÀÒ¶h’N0Æ>òúÛ"N·Xé uM{úpTRÿ +endstream +endobj +283 0 obj << +/Length 134 +/Filter /FlateDecode +>> +stream +xÚ3¶Ô32V0P0bcSs…C®B.#K ßÄI$çr9yré‡+Yré{E¹ô=}JŠJS¹ôœ ¹ô]¢ + b¹<]øäì bH°ÿßÀPÿÿÛ1?mpýÿÿþCð +âs¹zrr>F +endstream +endobj +284 0 obj << +/Length 155 +/Filter /FlateDecode +>> +stream +xÚ¥Í= +A à ]š=‚9ó· Vº‚SZYˆ•ZZ(Úš9ÚÅ#XZ,gõùà½Wć֑&›ÏÈYÚ<¡«sÖ%–awÄÆ£Z“«QÍs‹Ê/èr¾P5Ë)T-m é-ú–¸ëw ©’ÌD‚$–ÈI$§AæYxTøÞà™ð>Üþ„EHyûãÝáÌã +_õÍG< +endstream +endobj +285 0 obj << +/Length 142 +/Filter /FlateDecode +>> +stream +xÚ3¶Ô32V0P0bcC…C®B.cC ßÄI$çr9yré‡+ré{E¹ô=}JŠJS¹ôœ€|…h –X.O†:ü¸þÿÿÿÿÿÿà >!=x°£Ã ö ì›øÿy ùüÿ00ÿ?ÀÀðŸËÕ“+ ŒLAQ +endstream +endobj +286 0 obj << +/Length 168 +/Filter /FlateDecode +>> +stream +xÚ3¶Ô32V0P0bc c#…C®B.c3 ßÄI$çr9yré‡+›qé{E¹ô=}JŠJS¹ôœ ¹ô]¢*c¹<]êÿ±ÿðH|øÿŸH€X`1þy$âƒ=û;Lâ8øÃŽùñŸ âù<(Áø|^2ñ}Þ(ñŸÿÃþÈÄ?v QÃü€ËÕ“+ ««SX +endstream +endobj +145 0 obj << +/Type /Font +/Subtype /Type3 +/Name /F122 +/FontMatrix [0.01338 0 0 0.01338 0 0] +/FontBBox [ 1 -1 39 47 ] +/Resources << /ProcSet [ /PDF /ImageB ] >> +/FirstChar 67 +/LastChar 119 +/Widths 287 0 R +/Encoding 288 0 R +/CharProcs 289 0 R +>> endobj +287 0 obj +[39.23 39.23 39.23 0 0 0 0 0 0 0 0 39.23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39.23 0 0 39.23 39.23 0 0 0 39.23 0 0 0 0 0 0 0 0 39.23 0 39.23 0 0 39.23 ] +endobj +288 0 obj << +/Type /Encoding +/Differences [67/a67/a68/a69 70/.notdef 78/a78 79/.notdef 97/a97 98/.notdef 100/a100/a101 102/.notdef 105/a105 106/.notdef 114/a114 115/.notdef 116/a116 117/.notdef 119/a119] +>> endobj +289 0 obj << +/a67 276 0 R +/a68 277 0 R +/a69 278 0 R +/a78 279 0 R +/a97 280 0 R +/a100 281 0 R +/a101 282 0 R +/a105 283 0 R +/a114 284 0 R +/a116 285 0 R +/a119 286 0 R +>> endobj +291 0 obj +[333 278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 556 1015 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 778 722 667 611 722 667 944 667 667 611 278 278 278 469 556 222 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500] +endobj +292 0 obj << +/Length 106 +/Filter /FlateDecode +>> +stream +xÚ31Ó³´P0P0UеT01RÐ5RH1ä*ä26 +(˜C$’s¹œ<¹ôÌ͸ô=̹ô=}JŠJS¹ôœ ¹ô]¢ + b¹<]êÿÿÿÿLñÿ!ÁåêÉÈW51ñ +endstream +endobj +293 0 obj << +/Length 96 +/Filter /FlateDecode +>> +stream +xÚ31Ó³´P0P0Æ@ÚP!Å« H(€¹`™ä\.'O.ýp —¾˜ôôU()*MåÒw +pVò]¢zb¹<]äìêüƒõìä¸\=¹¹ŠŽ– +endstream +endobj +294 0 obj << +/Length 162 +/Filter /FlateDecode +>> +stream +xÚ31Ó³´P0P0UеP01R03VH1ä*ä26 +(˜Bd’s¹œ<¹ôÌ͸ô=€Â\úž¾ +%E¥©\úNÎ +@¾‹B´¡‚A,—§‹<bÆ@‚N°ƒ ?˜8$äÁD° ­õ ¢Dü`#˜ø2î©fâ2˜X3Iq,63© ã*@—«'W yK/ +endstream +endobj +295 0 obj << +/Length 111 +/Filter /FlateDecode +>> +stream +xÚ31Ó³´P0P0V04W01Q0¶PH1ä*ä21PA#CˆLr.—“'—~¸‚‰—¾P˜KßÓW¡¤¨4•Kß)ÀYÈwQˆ6T0ˆåòtQ°ÿÿÿÿŸz ñï?*‹1pš¶ƒËÕ“+ ÏJS +endstream +endobj +296 0 obj << +/Length 102 +/Filter /FlateDecode +>> +stream +xÚ31Ó³´P0P°P04W0¶T02VH1ä*ä26PA3ˆDr.—“'—~¸‚±—¾‡‚—¾§¯BIQi*—¾S€³‚!—¾‹B´¡‚A,—§‹Býÿÿ?þÿÿÿƒÄ¸\=¹¹E:(“ +endstream +endobj +297 0 obj << +/Length 190 +/Filter /FlateDecode +>> +stream +xÚ31Ó³´P0P0bSSs…C®B.ßÄ1’s¹œ<¹ôÃLŒ¸ô=€¢\úž¾ +%E¥©\úNÎ +†\ú. +ц +±\ž. + ö P߀ ÿÀJ2~~€‡dþü|"ÙþÀN‘üþ`%åê°’ö +õ ìhL²¨ +FÖÿÿ'ÿÿy“ü´ñû,$3üÀÀŒêÿ3Øÿo€ÿAŒYœËÕ“+ H0‚6 +endstream +endobj +298 0 obj << +/Length 230 +/Filter /FlateDecode +>> +stream +xڥбJÄ@Æñ/¤L³°óº Éi¬ç ¦´²+µ´P®Û©¸©ysÎϽQ­‡%oÚõæ镶=¹{®[r×é˜\ÃïŸ/䶷—\‘ÛñCÅå#õ;üÐ"ÓL EÐÅ(ðJ£däG)‚2£3!_±#2±C¢[°â•Ã{GEþÁòÀá{ÿûåÊ° :Z2 fFŠ…€bÖ˜9eÙ)úQSFÊO?˜žV2C—ºê鎾?9ru +endstream +endobj +299 0 obj << +/Length 197 +/Filter /FlateDecode +>> +stream +xÚ31Ó³´P0P0bS3…C®B.C ßÄI$çr9yré‡+˜ré{E¹ô=}JŠJS¹ôœ€¢. +Ñ@-±\ž. +õÿÿ700üÿÿÿ˜ü&ÿÉÿ @Y 4ûÆÿ€$ƒý)&ù?€Hö ’L2þA ÿÈ:0Y&íq‘ + Ržbb¦ùõH.©C¸ +ÙÍ_@|ñü¸¯A! +HÈÀCé,ô !ÉåêÉÈ݈I +endstream +endobj +300 0 obj << +/Length 149 +/Filter /FlateDecode +>> +stream +xÚ31Ó³´P0P0bSS3…C®B.C ßÄI$çr9yré‡+˜ré{E¹ô=}JŠJS¹ôœ€¢. +Ñ@-±\ž. +õÿÿÿÿÃ$þÿÃBÖƒIæ uD“6`’ùD2þÀJþÿO˜Ä¥j2ÛøÁ¤|©$(4þ7üÇA‚e¸\=¹¹WD–Ü +endstream +endobj +301 0 obj << +/Length 230 +/Filter /FlateDecode +>> +stream +xÚ•½NÃ0€/Êé?Bî¨Õ…vŠÔ©`b@LбÖÞ Þ$R_à¤.•åjŸKÅŠ-}ƒo¸ï³»ͦTИ®JrŽ&7ôRâ+º‚ÂLãäy‹óí¹íÚ?£­oéýícƒv~· í’K*ž°^ÀdòÃ`dÏPÉ‘¡aD¾„ÓZN{¨8;@Ά:0œGdœzT +€”Û š3’Î#ìò§ÿ'dè!Q M„4·éò³† +ýú™¨«â>¡Š1š¥š£5ßȎ×t*Œ«ïñïć5 +endstream +endobj +302 0 obj << +/Length 114 +/Filter /FlateDecode +>> +stream +xÚ31Ó³´P0P0bSS3…C®B.ßÄ1’s¹œ<¹ôÃLŒ¸ô=€¢\úž¾ +%E¥©\úNÎ +†\ú. +ц +±\ž. +õÿàèÿÿp„,Îü~èÿÿÿÉBÄ„—«'W NÁ§P +endstream +endobj +303 0 obj << +/Length 105 +/Filter /FlateDecode +>> +stream +xÚ31Ó³´P0P0bS3…C®B.c# ÌI$çr9yré‡+qé{E¹ô=}JŠJS¹ôœ ¹ô]¢ + b¹<]êÿÿÿ÷ +€ÄØ0 %ŒË\®ž\\6Qg? +endstream +endobj +304 0 obj << +/Length 231 +/Filter /FlateDecode +>> +stream +xÚ]ϱnÂ0`£ ‘nÉ#äž' v ¨D$:1 N…±Clˆðf1tì#4ÑCd÷?Ka@–?Ù>ÙþÏŒú¯/œñÓŽx›Ó7™Œe`+…Ï/š¤×l2Ò œ’.–|Øw¤§«ç¤ç¼É9û bÎe«ÊÖ;U:à”.âJ¥•p΂Zг j@¨ARô&ÎB n î²ú~àÁßx¹ëàä)É[yÙF ‘ßê^Ó}®l—Eùƪ‹‚é#Ô ªÑ`"­¦þ‰P ·‚Þé0Ð~? +endstream +endobj +305 0 obj << +/Length 126 +/Filter /FlateDecode +>> +stream +xÚ31Ó³´P0P0bS3…C®B.rAɹ\Nž\úá +&\ú@Q.}O_…’¢ÒT.}§gC.}…hCƒX.O…úÿêÿÿ``ø'ê!P‚È:„ˆ°'–¨ÿ`àbÿ¸\=¹¹”…jo +endstream +endobj +306 0 obj << +/Length 199 +/Filter /FlateDecode +>> +stream +xÚeÈ1 +Â0Æñá-ÁwÓ–ZtP¡*ØAÐÉAœÔÑAQPPRo¦7iqpT· +¥±I( 8¼ïû{~£ÝBÝâ¼&6}\9°Ol[Lñ,7„@gè¹@GEŽq¿;¬“>:@8wÐ^@8@–’X&äaüÆs!Ëe—V^Äz“ÒHø4½ ¦±6Q¾µ±25> +stream +xÚÍ=‚@…ÇXLØ è²ò#V› &na¢•…±RK ¶ÂÑö(Ò‚°.CÇ l¾â½æ}/Nç«ŒBJh&)^P²¤«ÄF© ]œ +Í厹Fq¤(E±u1 +½£×ó}C‘ï×$Qt’žQʘZÛ‚gm¾µ‡J9Õ€ƒeÊ +‚ºðë€7FçдÓ?oaŒFòú½ k©ïÄ öª,Íú|_ÂçàFã&h +endstream +endobj +308 0 obj << +/Length 182 +/Filter /FlateDecode +>> +stream +xڭϱ +Â0àHá^Â{ÓZìZ+˜AÐÉAœÔÑAÑÕöÑú(}„Ž$ç] 8Nù ¹ä¿KšMó9&èx¥gž,\Áå¼Od+…ã +f‡.³âS0~÷Ûã ¦Ø,Ђ)qo19€/±"jõB¨.P«;UuÌD÷ŒF¯ Âó'a¸üy£bhŒçF±¥4j-iMËðO*ªÿ·ù"`éa oõÆ…t +endstream +endobj +309 0 obj << +/Length 217 +/Filter /FlateDecode +>> +stream +xÚÅÐ1nÂ@Ð(,Mã#ì\€¬ƒj%C¤¸ˆ* +”*I™"Z¯o+íMð|k7c£Ü€æšùž?¬Wœð‚giÆóG^,ù#¥oÊrI^Ž§÷/*JÒ{ÎrÒÏ’“._øt<’.^7œ’Þò!åäÊ-Çi¢<â”PÁ™‚ƒq¶†j,ÿQÑ?¼ÐvÀôÞtÂDððQ[ òŸ½ba~®ÔêÒ§ú‚±ÐWJõ‡!†Id“øö†©G”‰›‘ÈÑSI;úŒ%  +endstream +endobj +310 0 obj << +/Length 218 +/Filter /FlateDecode +>> +stream +xÚн +1 àÈ +Y|óÚ;©‹‚?à +‚N⤎ŠÎç£ø"®äb/YÄÁÁ>JÚ¤¡¶Ýèu)¢&Õc²jµiã­õɈZ=Ùìq˜ Y’µh¦>&™ÑéxÞ¡ÎG£Ó*¦hɘR. eΘى/É".à‹Ò¬t ÖòÒªª®ôwèð£VûhOé/oé»2C óxŸûB§©’ÙbM•nÕÿ¼æ¥7÷íÝ¥| "çþÃÔ€3Ÿ©ˆàï>à$Á¾$J +endstream +endobj +311 0 obj << +/Length 250 +/Filter /FlateDecode +>> +stream +xÚu1NÃ@E'raiš=ÂÎÀ1IL¨,… á ªˆŠ¤DöѶã¹.·þü +‘(öigöÿ?³Óêølnc›ÙQiÓ›ÚºÔ'Tl²=ÿy¹ÐE£ÅÊ&•—lkÑ\ÙËóëF‹Åõ¹•Z,í¶´ñ6K³NZäa|„ ø 9€à|t5»¡î¡iûH†„ˆÿ…û JòŽbz<„„ë¼rd'¾¥0Õ´ †½(9qp&8 +%? cF¿ûi=¶H^†Qèù #tü)„g/pxLkDÏ…3zô¢ÑýŠA +endstream +endobj +312 0 obj << +/Length 127 +/Filter /FlateDecode +>> +stream +xÚ31Ó³´P0P0bSS3…C®B.ßÄ1’s¹œ<¹ôÃLŒ¸ô=€¢\úž¾ +%E¥©\úNÎ +†\ú. +ц +±\ž. +õÿ Dü?€‹üÃ`ÏÀOY$Ù€$ ;Rþÿ?óÿ¬$X–ËÕ“+ V—Xê +endstream +endobj +313 0 obj << +/Length 174 +/Filter /FlateDecode +>> +stream +xÚÝÊ1 +Â@…á )Óä™ èfaµ +Än!he!Vji¡h-GɶL2Ž†€à +„á+þ7&.擦‰&“R’ÒYã +‘S2–Ós‹jOÆ ZKFe7ô¸?/¨òí’4ª‚šâ#Ú‚J®"n˜ëŒÝ¯Ãê;€þʼQ¯ýºO„7ZB؈U$fMYDÌ@È ÷¢ÏìÞfò‚+‹;|WWŒ +endstream +endobj +314 0 obj << +/Length 197 +/Filter /FlateDecode +>> +stream +xÚ}ÎÁ +‚@àÂ\|çjUÔê$˜A‚:uˆNÕ±CQWõÑöQô +/¤mU²%vøÿ?,ãÓÅœlriâç“ÐÙÁz® mògCsºb” Û“ç"[ËY²¡ÇýyAm—ä ‹éà}Ä$¦ì–ÈE'Â}2´FZ_V 7 W?ÓWãei f åßÊÿ¥)X¹ÊP>•Vž*5y«ÔàMg9V/«Îz¬VJAðf9ô'à*Á¾LCx8 +endstream +endobj +315 0 obj << +/Length 201 +/Filter /FlateDecode +>> +stream +xڵͽ +Â0ð+ +·ôzO`Z©E§‚`A'qRGE×6–G©o ¸t(Æ;…TÜ%—wÿ.Íz£!ÅÔç›hÑ>Á¦2Ç2J³;â¸@µ¦´jÎ)ªbA—óõ€j¼œP‚jJ›„â-SªžYmEc-äÎwòy +îà7RŸ†õؼ€5ü“-!Òäl·Õé²Ó<ÙдâM nÓÜÞ£­ÖtVúWYõwÛ8CÛ:¿rœ¸Â½žbÅ +endstream +endobj +316 0 obj << +/Length 220 +/Filter /FlateDecode +>> +stream +xÚu=NÄ@ …_”b%79Âø +ÕHË"‘ * +D[n‚–™£å&ì¶Ü"ŠyãmafôY²ŸíyýÅéõ•.õ\O:í/µïô­“wa\òögÇÊëVVƒ´O¬K{Ç´´Ã½~~|m¤]=Ü(³k}fÏ‹ kEÚ¨m&fhÌF ˜í€hÆrá°ž ++'Ø2¾©ʉ3Ùq4|PYáÂÙØš0eܦÑé½³súŸÉ5ɧ¥\Ó@ÜñïeÝ'ýXæÆÆreSU¤4¹äQ~MQdÅ +endstream +endobj +317 0 obj << +/Length 206 +/Filter /FlateDecode +>> +stream +xڥϽ +Â0ð+Â->‚÷Z+©S¡*ØAÐÉAœÔÑAѹ}´>Š±bð¼$*.b†áBîþ§zíá€:Ô¥VDJQÜ£m„T‘;÷ýËfi†á’T„áTÊf3:Ï; Óùˆ¤:¦•üYc6¦\ƒ®¾›;ƒ¿lhkb¬Ì⹄€™/N-êÄZ6*±¨ñp·—§¹ë™|ZX›?š¼4®ïìõ½>uóÎæs¾’—n—‚«Ý tnìÆÍ N2\àKKv +endstream +endobj +318 0 obj << +/Length 205 +/Filter /FlateDecode +>> +stream +xÚ¿n1 ‡]1œä%oÐó ´¹”ˆÒ)$n@¢S‡Š Z•µ—¾Y…G¸‘!Š±i…ÄÖ _¤Ï²ý³=¾Œ©¡gzpäŸÈ;Ú:üÀ¡Ù¨¹T6{œ´hßhèÑ.D£m—ôõyØ¡¬¦äÐÎèÝQ³ÆvF0à`ø80¸cfṉ̃bè¢9)zA}T$"ÜË'¯S|_QùŸ(·½Ýª(ãM +I +ëT÷PG“eyÅ?¿Ñ4dѸYƒ÷z‚Ü1…ó_ñ ° +S +endstream +endobj +319 0 obj << +/Length 220 +/Filter /FlateDecode +>> +stream +xÚÐ; +Â@à )„isÁJÐùEü"Ãøb=A×Û +çaÄS~]¿ +endstream +endobj +320 0 obj << +/Length 216 +/Filter /FlateDecode +>> +stream +xÚu1NÄ0Eÿ*…¥ir„ÌÀ › ¨,-‹D +$¨(VT@I‚vã£ù(>–)V¾AÐaYOòØóç¹??½¼ÐV=é´ÿÞϼÉz`±ÕþìçæéU6£ø]âoX?ÞêÇûç‹øÍÝ•vâ·ºë´}”q«¨µE XÌX™Í¨ÌŽp‹[PÏ0ÔLhB M ‘‡ÀÆ4ì‘™æò±À¸þEâ ŒÆþS“«D¸ÌiDf( +šD“œE‹T³HIc %)>—/Ð~Å’\r/_})oG +endstream +endobj +321 0 obj << +/Length 275 +/Filter /FlateDecode +>> +stream +xÚ…=NÄ@ …¥ÉMŽ_òÃ(‚†‘–E"T+* ¤A·ÚDâ \%7!H9Ec{·BHLñidû=¿ßŸRI'tT×äò%=Vø‚¾–jIM}h=<ãªÅâŽ|Å•Ô±h¯éíõý ‹ÕÍUX¬iSQyíš É³ã:þ²œ!1¦{.g½‹éì ›t<A9ÀN¤t¿´É½êà`nê [¢Yè˜'ã(3’@øÉ üˆÊ~sPºo£i5¹ÝE,b”³6ÂyÔ0ɬ1$ÄV¸ ç îÁ˜ÿÁÙº[›ìLzõ #¸òºh»&Û;‚þ¡Ä³$²^MR} ^¶x‹?máÊ +endstream +endobj +322 0 obj << +/Length 137 +/Filter /FlateDecode +>> +stream +xÚ31Ó³´P0P0bCSs…C®B.cc ßÄI$çr9yré‡+sé{E¹ô=}JŠJS¹ôœ ¹ô]¢ + b¹<]˜øÀù(B¬Ž`ÿ¨­þÿ ÂD00 +¢þÿÿÿ ÿaDœ€Hp¹zrrȧYA +endstream +endobj +323 0 obj << +/Length 217 +/Filter /FlateDecode +>> +stream +xڭνnÂ0p£H·ä¸'À ¤Q™"•š ¦ˆ‰vìP+ŽÄ‹eëkdëšÑU‡ÿÇGkÉ?é>í4ëž8æ^¸iÆ¿%ôIi?Ä1B–4,ȾrÚ'û²d‹ ¯W›w²Ã鈲cž'/¨³kL8âïëTó¶E‚ÑÅòÆkÕä%t:u€­=|ðº?õQ +;D»ñN÷ üd~UôÈ7úå ³²S[Øv0ؼ?½b¶j®vÊ?£ +¶kµ1Nš\*ïÎÖ7V§*=4£#SãŒ÷ +endstream +endobj +324 0 obj << +/Length 123 +/Filter /FlateDecode +>> +stream +xÚ31Ó³´P0P0b#S3…C®B.c3 ßÄI$çr9yré‡+›qé{E¹ô=}JŠJS¹ôœ ¹ô]¢ + b¹<]êÿ``¨ÿÿƒá?œ¨‡ ŒÃ—¨ÿÿÿÿ0Äÿ?€ „—«'W íâg• +endstream +endobj +325 0 obj << +/Length 161 +/Filter /FlateDecode +>> +stream +xÚ31Ó³´P0C …C®B.sˆD"9—ËÉ“K?\ÁÄœKß(Ê¥ïé«PRTšÊ¥ïà¬`È¥ï¢m¨`Ëåé¢ÀÀøƒñC}ÿþ? ÿïÿ“ÿÇðÿÿûÿ òÿÿY–o`*á?Àþƒÿü„Ø!*9 °þ=þÿg„ÿÿÕ!Œ‰@d¹\=¹¹ªˆ÷ +endstream +endobj +326 0 obj << +/Length 159 +/Filter /FlateDecode +>> +stream +xÚÅÉ1 +Â@б¦Éœ¸»a­1‚[ZYˆ•ZZ(ZoŽ¶Gɶ 2΢]àÀ<þŸ±óérAšrY;#«ébðŽ6uj +ç–ÕlŽj#WTnKÏÇ늪ܭȠªèhHŸÐUE‹€[îÅ7³(Sÿô‹#“d5"${‹ÝÀö?zn<×Ì‘9 ý~qíp%8} +endstream +endobj +327 0 obj << +/Length 198 +/Filter /FlateDecode +>> +stream +xÚ1‚@E¿¡ ™†#0Ðe‰V$Š‰&ZY+µ´Ðh+{4ŽÂ(- 㲘ØÚ¼âOæÏ›$ͦñ„‡š“1'šOš®§6ŒºÄMŽš¤v§¤V6&U¬ù~{œIÍ7 Ö¤rÞkŽTä ï + dR" +"/x"oø­ß"x +Aa…Ì„¡É,ª ªÒ¢~~Ûæ5ÿ¢µÍo×U9ôõú“ö¸qNÈ©9I§‹Rêï Ý3´,hKí`• +endstream +endobj +328 0 obj << +/Length 221 +/Filter /FlateDecode +>> +stream +xڭбnÂ0àßb¨t À½@›Y"QÈP‰Ntì@³óhyÁc×s U‡.•ððɺ“Ï¿m˧ç ç<æÇqÎÖ²Íy[ÐŽl¡ÕœË[kóIÓš²w¶e ­SV¿òþëðAÙtùÂZñJ­©ž10ô€óU¤QÏ"-D×±×ɯ<Œ´ÃNmA…Q/À%n®:˜¨~ÛDGÿ´ºú9ir2ݘL¤y?ÙRΘ<ÚÂè[˜S|—é\ˆŽŽè³ÝO§÷é¿éOýeêÒ¼¦7úF©W +endstream +endobj +329 0 obj << +/Length 229 +/Filter /FlateDecode +>> +stream +xڭϱJAà?lq0Í=ÂÍ ˜ÝÓ%Ä*#xE@+ I-SD´5_,9È ,Ø9nœ½sck‘æc™ùÿõ£áõ˜_ñÅ¥c?fïø¹¤5y¯SÇ£´Z®hZ‘}dïÉÞéœl5ç·×÷²Óû.ÉÎø©d· jÆ0í rù ÀDªÈWÀ@ä`D$ £æ +¢“€¢F¡]ç67@–üHš€¶³ù·mòtçt9OYªæ»®‰®´Õwì–µ±gß¹ïßÿÙ«…èe˜&Ú¥œOM«“&Æÿú7§ÛŠè`Ÿß +endstream +endobj +330 0 obj << +/Length 172 +/Filter /FlateDecode +>> +stream +xÚµÎ1 +A ÐÔi¼“832ˆVº‚SZYˆ•ZZ(ZÏXYzâÅ#l¹…lÌÛXZäÁOø7è†d¨/ã9C;‹GtV²ibsØ0ó¨Wä,ê™lQû9O—=êl1!Ùæ´–Ê}NÐ)!0„Z¼2ó-ygŽÉg"(.’0P5tÅ·ÔAUɲå+Yü0þÉÀ\%å-n¾Ê§—ø¦YW +endstream +endobj +331 0 obj << +/Length 218 +/Filter /FlateDecode +>> +stream +xÚMŽ1JÄ`…ßb˜ÂÜ`w. ~7»hXW0…àVbµZ +* +vnâUr”aË!ã›,ˆÍÇð½™Ç”ëó«K-t­gQË -£>Gy—劲p3%ûWÙÔt¹’pK-¡¾Óϯ ›ûk¶úµx’z«X §˜™ý 33䎅£r¤CF40Œ@:bª ˜#µàLÉ‚¼ªÁ‰Y˜õ.¹ŠdÄŒ Ç曶åAîȺ ãlBƒ¼³–{,ªZxËÏŽ`1K{¯ï+æoürSËN~±¡o' +endstream +endobj +332 0 obj << +/Length 160 +/Filter /FlateDecode +>> +stream +xÚ31Ó³´P0P0RÐ5T01P05PH1ä*ä26 +¹†™ä\.'O.ýpcs.} 0—¾§¯BIQi*—¾S€³ï¢m¨`Ëåé¢ÀÀÏò +$õÿÿÿ?Äÿ ` ÒÍ#…ø$`'0ƒö üøÄù ì  æÿÿÿÿSÿdÖ.WO®@.’Ø] +endstream +endobj +333 0 obj << +/Length 159 +/Filter /FlateDecode +>> +stream +xÚ31Ó³´P0P0RÐ5T01U0¶TH1ä*ä21 +(˜@e’s¹œ<¹ôÃLŒ¸ô=€Â\úž¾ +%E¥©\úNÎ +†\ú. +ц +±\ž. +õÿ`øÿƒùÿ,dýF Éøƒ}üH¤<˜´’ê00ügüÿ¿á?`¨G"íÿ?’üÿ›²Ìÿ¸\=¹¹kqt +endstream +endobj +334 0 obj << +/Length 174 +/Filter /FlateDecode +>> +stream +xÚ31Ó³´P0P0bScK…C®B.ßÄ1’s¹œ<¹ôÃLŒ¸ô=€¢\úž¾ +%E¥©\úNÎ +†\ú. +ц +±\ž. +õÿìÿ7üÿßPÿÿ& ‘eüÀÀü€Jþ``ÀÀ$ÀÈ? ü@²†¿•´cg@%å4*ÉßPƒF²øF2?ü€F2~~€F2ü?€NÖ7 H{ ærõä +äóV +endstream +endobj +335 0 obj << +/Length 195 +/Filter /FlateDecode +>> +stream +xÚuν +Â@ ðˆƒ¥Ð> +stream +xÚmν +Â0àˆCá¡÷¦Õ(v©à˜AÐÉAœÔÑAѵͣÕ7Q|ÁÅAŒwݤéGr—»œé6³&Ø¢ßt°á&…=>'|äÍz z¦zBQÐvŠÇÃi z0b +z„Ë“Øö½óoUú³÷ YU¨X)Õ§-ÈؽÈFÅFç'{»“õÇ…¬yVùJtlÉHƒŸ!²r³&µué]ÅŠ;7ä­ØRš“¹ÌCSQñ‹¦ i¬ÊÓÀìw…HÈÂØÂ>ʳh +endstream +endobj +337 0 obj << +/Length 237 +/Filter /FlateDecode +>> +stream +xÚeαNÃ0à‹2Dº%à{pÒŠ.±TŠD$˜: &ÊÈ‚‰ˆ˜73âEòa+RÅ‘sÔÆ‚ÁßðŸÎ÷—óãÅ)eTÐQ‘S9£“mr|IJÒŒæûÑÝ.kÔk* ÔCŽº¾¤ç§—{ÔË«3ÊQ¯è&§ìëµl +[fÛ²cv’ŒÓ¨‡¸ƒh+ÂÞÄì¼÷ +R PPÛLm5éÄÄ5“wÛƒQ?Ú‹_"|v“¯ÞÖ‰&ÔŠ*þZý³ ÜIM +ê]4ÞO©`9k”—å b{0ý‘ýD>€Ø7Æó¯ñùíkƒ +endstream +endobj +338 0 obj << +/Length 218 +/Filter /FlateDecode +>> +stream +xÚ¥1nƒ@E?¢@š†#ì\ ^ + c)‘ìÊ…•*qé"QÒŽÆQ8%ÅŠõ2[$rëæ³Òþÿ~þ¸y.9áœRÎ3.žø#¥OÊÖcÂEé_Þ/T·¤œ•¤_Ü™tûÊß_?gÒõ~Ë)é†O)'oÔ6Œ`ÙPv*;k +. +,¢ UPC< ”èzDNø‚ùÆe™{àÊææÓÎ¥ÍÿÂ]—É·’~+|ç¢ 2¢%‚¢ê¥E_†IÖqh×Ò®þ xË +endstream +endobj +339 0 obj << +/Length 143 +/Filter /FlateDecode +>> +stream +xÚ31Ó³´P0P°bSs…C®B.crAɹ\Nž\úá +Æ\ú@Q.}O_…’¢ÒT.}§gC.}…hCƒX.OæöÌÅò@lÅõÿ``âz þÃç¸ÿC?’¾Æöÿÿÿ¨‡à?P æs¹zrrìRZö +endstream +endobj +340 0 obj << +/Length 232 +/Filter /FlateDecode +>> +stream +xÚmŽ¿NÃ0‡‘K·xe‹Ÿ'´ +0Y*E"L ˆ‰vdÁÚøÑú(~ªwH‘`¸Oº»ïþ,»óë+ßø•Äò¯.ý¶¥wZt’7šjãõÖ=…'¿è(ÜI•Bï??¾vÖ7¾¥°ñÏ­o^¨ßx¸#€È `Î0Ì#,óŽyB=:F̧˜0¤AÌè.O€=¡ðÌ {Å™sØ2tâÝ÷ 9ÈùF¢štJ´£º:ZëTTwHsͪæT«U‹ù!‹ª,†)b˜"†)3þÚÈtÛÓ#}çwo +endstream +endobj +341 0 obj << +/Length 239 +/Filter /FlateDecode +>> +stream +xÚMбNÃ@ `G"yÉÊv~ö%-aŠÔ‰ H0u@LбCQ»’¸nÑ館Ñ?I}ûL§¯óýúeCú-½”¿c»%H00cŽRb†LèÝ5áÁh†¦šRã"Ì&\/d À/©„솄Ná^J¬+J™¯Êx#jCÿ(Ñïä^ +‡NwŒÚ6d`âNùVø?‰1F3:=ª³0+¸(-ª…¶ø aO"{|lñdy‚ +endstream +endobj +342 0 obj << +/Length 196 +/Filter /FlateDecode +>> +stream +xÚ•Ï=‚@à%$Ópæ.Äõ¯"AL¤0ÑÊÂX©¥…F;£pJ +¾ÙÄÆØ8“ý’7[¬™ŽsyŒc Of|ŽèF&di\%8])ÉHïÙ„¤×˜’Î6ü¸?/¤“í’#Ò)"”¥¬”×*¥üîC Ä–(„\èÓ -p- +ð¿*XJ …¹Ð pZàZàYjàW °” ¶( ½0 úáG(Yù“bÀ_íÛ/Ð*£½:øp^ +endstream +endobj +343 0 obj << +/Length 217 +/Filter /FlateDecode +>> +stream +xڭαŠÂ@à‘Â4û;/ ›œ„@NÁÂYYˆ•ZZ(ÚšÄWÙGÉ#¤Lqì:£Âqå5_1ÃÌÿ÷ÓîxD1 +¨“Pÿƒ)í> +stream +xÚm1NÄ0E'risÏ v7,•¥e‘HÄVˆ +()@Ð&9šâ#¤L<| Q`ɯæ¿ñ¦9»ÜÉJ¶rZËæ\¶ò\ó¯QÞý¼<½ò¾åê^Ö +W7(sÕÞÊÇûç Wû»+©¹:ÈC-«GnBä"éLdT‰¬ê@.ëêGH‹„F3å”16’ +6P9¸€nü\êÑÑ Pbfç4Rêu¢Yù¥šHq_#õB}È!Ûĉ¨\0æºÐgøÜœ!TF¨ÙIàìƒÍAØCÉ$£yñDE‚Ì}Hâ#°‰A +_·|äo_ƒ« +endstream +endobj +345 0 obj << +/Length 187 +/Filter /FlateDecode +>> +stream +xÚ•Í1 +Â@ЋÀ49‚sÝ„$«@Œà‚Vb¥–Š‚•z´%GH™bQgˆqÒ80¯˜åÿ +‡ƒqL…Ô÷) (ÑÎÇ#rô(Šë—íSjEAŒjÆgTzNçÓe*]LÈG•ÑÚ'oƒ:£+ð¼x*Á´P§dÜ‚éåœHðá.ñ'oÇÓœR(@RB¾Ñšü­)Ó`ëêÎòÛn±ÿ´aÿþ —§—øöð\# +endstream +endobj +346 0 obj << +/Length 232 +/Filter /FlateDecode +>> +stream +xÚu=NÃ@…Ÿå"Ò4>ÂÎ`mÙ ¦Z) HPQ *HI‚çh{”=‚KV†ñ)‚æóó¾yÓlÎ/[.¹á³Š›š×üRÑÕs±äu»tž_iÛ‘àº%£eòÝ-¼îÉo﮸"¿ãÇŠË'êvŒ\8I@/#2‘£–D°R9ÇL¢’Kp)°Lz ¿€ìO±nPY†]D‘ +5ˆÅˆ>æ¢Lr‘é>Aáʶ»pg¿W·³iÒÛÿ9Ô«ËÔo°0ËZTãþ¾j~]wtO߈ý +endstream +endobj +110 0 obj << +/Type /Font +/Subtype /Type3 +/Name /F101 +/FontMatrix [0.011 0 0 0.011 0 0] +/FontBBox [ 0 -22 48 63 ] +/Resources << /ProcSet [ /PDF /ImageB ] >> +/FirstChar 45 +/LastChar 121 +/Widths 347 0 R +/Encoding 348 0 R +/CharProcs 349 0 R +>> endobj +347 0 obj +[46.98 46.98 46.98 46.98 46.98 46.98 46.98 46.98 46.98 46.98 46.98 46.98 0 0 0 0 46.98 0 0 0 46.98 0 46.98 46.98 46.98 0 46.98 46.98 46.98 0 46.98 46.98 0 46.98 46.98 46.98 46.98 46.98 46.98 46.98 46.98 46.98 0 0 46.98 0 0 0 0 0 46.98 0 46.98 46.98 46.98 46.98 46.98 0 46.98 0 46.98 0 46.98 46.98 46.98 46.98 46.98 46.98 46.98 46.98 46.98 46.98 46.98 46.98 46.98 46.98 46.98 ] +endobj +348 0 obj << +/Type /Encoding +/Differences [45/a45/a46/a47/a48/a49/a50/a51/a52/a53/a54/a55/a56 57/.notdef 61/a61 62/.notdef 65/a65 66/.notdef 67/a67/a68/a69 70/.notdef 71/a71/a72/a73 74/.notdef 75/a75/a76 77/.notdef 78/a78/a79/a80/a81/a82/a83/a84/a85/a86 87/.notdef 89/a89 90/.notdef 95/a95 96/.notdef 97/a97/a98/a99/a100/a101 102/.notdef 103/a103 104/.notdef 105/a105 106/.notdef 107/a107/a108/a109/a110/a111/a112/a113/a114/a115/a116/a117/a118/a119/a120/a121] +>> endobj +349 0 obj << +/a45 296 0 R +/a46 293 0 R +/a47 294 0 R +/a48 338 0 R +/a49 339 0 R +/a50 340 0 R +/a51 341 0 R +/a52 342 0 R +/a53 343 0 R +/a54 344 0 R +/a55 345 0 R +/a56 346 0 R +/a61 295 0 R +/a65 297 0 R +/a67 298 0 R +/a68 299 0 R +/a69 300 0 R +/a71 301 0 R +/a72 302 0 R +/a73 303 0 R +/a75 304 0 R +/a76 305 0 R +/a78 306 0 R +/a79 307 0 R +/a80 308 0 R +/a81 309 0 R +/a82 310 0 R +/a83 311 0 R +/a84 312 0 R +/a85 313 0 R +/a86 314 0 R +/a89 315 0 R +/a95 292 0 R +/a97 316 0 R +/a98 317 0 R +/a99 318 0 R +/a100 319 0 R +/a101 320 0 R +/a103 321 0 R +/a105 322 0 R +/a107 323 0 R +/a108 324 0 R +/a109 325 0 R +/a110 326 0 R +/a111 327 0 R +/a112 328 0 R +/a113 329 0 R +/a114 330 0 R +/a115 331 0 R +/a116 332 0 R +/a117 333 0 R +/a118 334 0 R +/a119 335 0 R +/a120 336 0 R +/a121 337 0 R +>> endobj +350 0 obj +[611 611 167 333 611 278 333 333 0 333 584 0 611 500 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 238 278 333 474 556 556 889 722 278 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 333 333 584 584 584 611 975 722 722 722 722 667 611 778 722 278 556 722 611 833 722 778 667 778 722 667 611 722 667 944 667 667 611 333 278 333 584 556 278 556 611 556 611 556 333 611 611 278 278 556 278 889 611 611 611 611 389 556 333 611 556 778 556 556 500] +endobj +351 0 obj +[333 500 500 167 333 556 222 333 333 0 333 584 0 611 500 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 191 278 278 355 556 556 889 667 222 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 556 1015 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 778 722 667 611 722 667 944 667 667 611 278 278 278 469 556 222 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 334 260 334 584 0 0 0 222 556 333 1000 556 556 333 1000 667 333 1000 0 0 0 0 0 0 333 333 350 556 1000 333 1000 500 333 944 0 0 667 0 333 556 556 556 556 260 556 333 737 370 556 584 333 737 333 400 584 333 333 333 556 537 278] +endobj +352 0 obj << +/Length1 755 +/Length2 1058 +/Length3 0 +/Length 1588 +/Filter /FlateDecode +>> +stream +xÚ­’}XSUÇQ¤tJŠPŠoÂ)snÜ;c[€Af ¨ˆ\wÏàÆvïºÜñlhäKŠ(¡ ‘Lš"S¬T PŒÈoá0d¥(‚–šá[‚/tÁ|z¢{î?ç÷û~Ïï|î÷®GTŒ@S+aE2TˆÊ@ˆRŽ"€]#‡Ë +¡!Æ9c   R©X ×‘@$2±L,ápA¥3ÒDJ*¼Bx& Ph!M¨0(1&jÙ*Lb(£(4°h`G:XÓ!q!EN¨°¦$Ç{€)œTS@ò²ëu¯¤ H§³PÀk“XHœ"5F€C5Ç{!ÅžY–ÿkèð0½F³ÓŒLê?:¦%4Æ¿”V§g +”ir¨u)| §„8¡×UÃLC¨dŠê+D|_ö‰ô0Âñ(‚Q¥5¦I‡ƒ}HâCIØü9¼„DÍ}o)ÿï«£0‚db:܃5úO͆D€eì÷jµ|Èa¡¤ŠÂ 2ˆÄ~£iÌÈa[‰A& +‡ +,±·¤v `“YÔ͸WT ¼¡.ÐP$: pþû+ÁÁ”!Sà#‘˜øú‰Yõ/£JOÓdŸ È«ZM°Bh€*Ž½RÉ×¾_tl}EvhyË'^ú”â}kÏžXw¤X.¼Ý!‘®þ1N»ï²Îå}¢rœénÄAo\-¾æ~L‘eÍŒñ^×îbuvã•íŒyýžêvbÒð¦Ý§Æjwm¼i»[WÍ¿÷³ç£«'œª"E%f÷»›FT\j{þ ;mõ¹köÑ;pÏ&ÎòÝßFÂ%·®æŸé»3*§ì{›&$î|äúÂîÞpÅ–vÙ¹Xš»[éøSqÀ³QÏ î<ÇAKÒÞ¶Ç}.]#9Åïâ’Òbà0)À£8.°¶&BùûÈ® P6^U1Y0o¯û0x¸!¾^H~·¡ûptÎø´Ã-¢€í¨®º»(¹÷9÷þô¼—?}Úñg®{ý=U¦‡ÃÄC×òýK‚2¼ø·ygw§ÖO¬Ë°Ôm7EÐüŽÑsrOiÏufÕ>Q‚8éOkÜÚöâiq~•õj‹Jg+ãù_ÕX C +Òeä»æ?~k¬Ï-%……$t$×Å^â7YŽž,ŸëjÙ0b¹µ&,¬|zÍHª½+x‚G ëù›ã‰Ý± u‹ý;›!ÿNêñ¬ñâ¾Þ©•2¿]¶gò?š[«ïîó›šítããÉi[„wbgeúÿîx"Â’llñ·|mm~kf›%ˆ.J«¬ˆ¨X¯5öHGþu,Í:þPQóƒz7ª¼"V?šÅ;Å]qÚÒÃŒËzjNÒË‚êêHšì>Ô›™!ª{o…Xž˜ò¸oÑž½™[Wßë¹ä;uã +Žltg{—Ô]ú¡)»íãöyúÑ.¡5gìäÍÅWš¯Ò®ïqÑ{ÄœXï^uòú“9Ñ‘‹:6Ñ,ãoÖÙÇÅkÍZ‹wën +ÆR¼ì­J×ïÃN$­µºÜõa ÷‹ç_—›–xgw·Ï9âçÁD>1ËȘáÇ4³†_ñäib÷#ú£]­ó%GK·àA—Ë¢â—õ\½Ð§_ãzúî¦s¿|ë£T+ûb +“'¨3*«'ãFZdcÁI83ê¬;Æ™ +›ËV¶æn±™äö Óok¸5ÅW+o¼uÄòáÎÂË’ë–èW>azÉåO +¶IJ³—¼éyhG©âŠyקoþ,¹©-nîB‹ù˼™~f§±Ã?*(2gõ¨ûwT„$9;·Vì¹]*ˆK‰k~ï¸Ý~F׃6}óZc߃í ÷Yã;#§Ž~~s‘s¿{6g’"·Ú–Ðrň4€ +µg¡Ïœ–¼[ȳÜGÌ7àü}ø[ôÕY"RräANQÝ ³ÛéX—Êý‰û’'i¶—a‚¶º­Ÿ;$W•cy|i0µjm¾V>6q³‹Ê˜~“}ñž$g¹ŒŸ“ôؤÝöM¶fLßþg½†æ¿§*ü +endstream +endobj +353 0 obj << +/Type /FontDescriptor +/FontName /JCPDOW+CMMI10 +/Flags 4 +/FontBBox [-32 -250 1048 750] +/Ascent 694 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 72 +/XHeight 431 +/CharSet (/epsilon1) +/FontFile 352 0 R +>> endobj +354 0 obj << +/Length1 778 +/Length2 891 +/Length3 0 +/Length 1426 +/Filter /FlateDecode +>> +stream +xÚ­RiTW­ Ò\p  èSAÀ˜eˆP A(E!RYØ!™„Ád‚Ɉ­Š‚¨ +….ž*PZ@)ÂQ,›Ò¢…sQd©­ ¢Ré°x<Å¿=óg¾{ïû¾ûî÷lÖù i\±"ñT`8 +¢C΀ç+ †˜¢3É66<%ã¨ó€qÄ@¸j)€Ø€éäìÀtf;‘mO­U¢ÒHØñì'EN€+G”¨Æ€/ŒG"r¢‡–¡B„"¸–¸2˜<¡ˆ +QÆ b:‚€á ‘¢™1éÈ“(€Ó4,VG¿¥b¥Š0ì“ö€°(V`2-#2ƒ¯ f!„“ÿÃÔìæžj™ŒË'ÛO¥ôËQ™vF¡G«qD |bD‰Í–îF¦Íù"bT-ŸÍzã° q1© 4h ÉbO¨ÊÕ bE ,S!S8‚‰g[!â›2Âðúð½=©3{"ýaÃwi£À|§žª¡w5‘’Õ€P&É„!ñ½ý ›5l&RˆQL +ØŽV*a-™xADű@11¢ˆ†pÌ c +œ8ˆhâD¡$O®b:F„!2D‚Or30kž^ä$þþ%ÝÝšXšÐ8ŽÄPrNNìøÿEj¥Áð©wDDõ¶– D¼¢ADäŽv…ÈåpÔ©«G‹t;ò›‹¤— +¥O:Œk‚Êu9¨8^È>#X'Å úÏw_I©¥ìm1ÿDä’±Lùƒ…Ÿ>’·¬äŠþ\aPj»šþ»¢ýBŸ¹ð +ն߻vߧY¹GºW9W+{²oØÜ1²á`ƒéqŸ{H~Õ‹®v“¥›Ò6­·tê¸dÜ9g%EÛù¸mí³òƒ§ê·Šþ¼}o§·?Eå©·m‘l3‰G’Ã$1--TÁ#îµ;}ÝûÍÅãKü’«C5ƒVÇÖ'Úüý‹°Pó\¯[ûÛÍhcJë±Ãùçq~$rµ•{]gsíáúnƉ¯*««zX‘¯-¨üÌåRfkîåGå·¢~ÿ-”8ÑglyA7VïÍ-;iå1x`ßÅÊ­/)†xºÏլ৕µ&í•+ enw:x'^ž%ñè|ÕWF3Ë#S”Þ¡-íÍ^= òL-¾Š„•‘ +~°ç›†k½]IuÑŽ<3Áàg®IM=Á•ÂÒ=[O'£7Eå-- +¼óŠê·W¡ÞîΪÉ~™ºüëŒõ†Žc XLTM§üÐÜdç¢z¡üXÛõûòÓÞcéáî$ÑÈ|æZÉZ“׫­Uu>§«<ÎÎßȪŸgЭ1«#™ +4‘´ct£(*ý‰&¼ÌŲ7‹º[Œo®Þ=n71Ä +û' +.9Á/N¯úióâ$·ã†{ËSïæÊ| +¸,¥”ûs±åˆQÔ›¬Ö¶o\­¸q°§uÄkQ}ä–GâÒŠ¡ÊÐñKK­/ÓøMÛ[†-9[ÞÐ'> y|­v{¶PàSró‚y–Z¯‹µ>æÈðÜ·zÏiëÊÞSÁDþØÝ_f_l¬!Ù>¼¶6ø\ö· ZU–t ´'^¤æ®¿3˜&Ý·kÍ=u`Æ’ûë~ô€û3MRBFÚ¬>ì{Ænß_4úôþœ4TŠsܯs¥)¼‚Þn:#¯XsRí/¬¥rlc?¯1Ùšó$#nx("2`bÂö,Æ[rÌ·óOÚŸ2*%)os‹órÜŸÚêz—ébšô]ïªþt;†E~œ_UXiz›T¥ +;´HGÖ¶Õ%454=Ò¾ívcõu¶GR¡Ã_¦®¡5} + +²ýG”Æôyááæ»ôºqv‰Ìœ±+ã +UÍÖ•ÿq4° +endstream +endobj +355 0 obj << +/Type /FontDescriptor +/FontName /GSKNIF+CMSY10 +/Flags 4 +/FontBBox [-29 -960 1116 775] +/Ascent 750 +/CapHeight 683 +/Descent -194 +/ItalicAngle -14 +/StemV 85 +/XHeight 431 +/CharSet (/braceleft/braceright) +/FontFile 354 0 R +>> endobj +356 0 obj << +/Length1 1608 +/Length2 10615 +/Length3 0 +/Length 11444 +/Filter /FlateDecode +>> +stream +xÚ­teTœÝ’5îîNãîwwHpÐ +4ÖÐHpw î!¸»Ü !X€ Á‚·÷½3sgÝo~ÍÜÏZÏ©ª³kWí:Å@£¥Í! +„X‚ Nn<œÜ" +°£¥»«¶…“‡ Äx5¾Ac`…‚,ÜÀ'9 7@Ȭ¼¼aaa4€,ÄÙ +¶±u0ë¾Ógaccÿ§å¯€¥×z^oº‚mœŒ¯? ˆ³#ÈÉíâ}Q¸Ù‚Ö`@VSËPYCÀ¬¨¡ P9 -wK°@ +lrr±¬!P€Ã?+ˆüWi®œ¯XÒ® €«3È +üz +äirþËÅpAÁ®®¯ÿ°+ÀjáäöÚ7ìdåàü‹À«Ýò7!g(ä5ÂñÕ÷ +¦qusµ‚‚ݯYµäþÁÓÍÖÂí¯Ü®àW7bý „X¹ÿUÒß¾W˜W¯›ØÉàòtû+—%»:;Xx½æ~s†‚ÿ¦áî +v²ù'vdc:€\]_a^±ÿêÎ?ëü·ê-œ¼þ¾ +ù;ê¿8€Ý\AÖœh<¼¯9­Ü^sۀиþe'k€‡ûv »óú<@пÄü×Ì°¼’°Bœ¼@5—Äí5%€ù§2ç¿OäƒÄÿÿ-òþßÄýWþÛ#þ¿¾ç…Vpwpаp|€,Àë†q¨þÚ1ÿ_¬…#ØÁëˆþ×@}Ð?þO Ên¯mv²y•‚›“ûF°«ØÔ»YÙ¬-^{ô·]× ‚:€@¯ZþÝFÏ›7ÿâÓ±[Ù;ýÕtá¿] 'à¿2•çoÞ\Úzòš:jlÿºMÿŽÒzUÝMÇËù•ØÔ¡þ×á/ ˆ'À‡ƒGÀÁÇ-øúظùÂüÂ~ÿC¾¿xþyV·pƒ‚=ƯEsóü]ú|ÿ<™þ Œ¼“øלh»Y8_Gë¿ ¹­Ü¡ÐWEÿ~í¯%ÿçùï!cféÇúœÎ«ýD0àÖÛÝœ|ûάô‰rº“ŠrzÃHçQH@íŒåo•Þð‘° § ¯®øðˆ1yÿæšipldx¨÷±‡œ-ï#*ƒ¨&cL K¹¤‘n¥Oœe)Oò`MJ_x¿.3ßÚÒ9QóO>€Ñjc…ÕŠÏQ=¨ì£ô`öã®ðSŸ§æÄʧT@Ç +ùöCzªu&=/ÅÎë©xIÿø/Ê*'[kÞJ¥ádWíg“*\[uü‡ãSö9ÂÃeÛyHu3œÅœ÷³­ éªÍ“⵨IŠzi®–Öùƒ$™*’ání›æ’‹B­ýÄŸwf¾–z|‚ÆÖ4Ór]a–û»5LÝ0<Œ;FFQD Úç.•Ê Ö‡Öw^^z”.lS¾Qÿ(<¸¯œàŸwË‹C§ë‘Ú>Ul×H•SS³áêÚ’åŒñݺ3e±ÁÙ6‰Hçˆ.YM¼KEvíÎFæYUNÒ¡ôÛ+ЭÍñ#~Á¤Nf!ŸdPëè1g%DÄ”^!xÙl\=)aF5‚=àɘ¿Un®Îõú£ÅçRû€ÁÀÅïóƒÿ!~üãÑfn””?uÈÏ' &i;g° ˆÑ2±ç¾0XÿZ3Ã~<ù%I¹ …˜ÇÕ%õ¾µºSÇMt„Kª~Â@”š]„ »µì*Cœ.£“x=¦H5Vo…éª^E +¥Fç•ã],h}+/uSì3Âs"1±TP”´ ö…Î|šÇR%ªþó4R4 :Í_€WƺÞ×Ò"½‚&;Ó;„(×®Yõ”뽑5k ¼¥äúðèXÂÙOi³TN!è€?º-§ös]•j–F[ÝN#=På@¹;‘;eŽeì[¨Þ9ÃÖœ²0®ªýŒ~<á—Xa×—pìþ‚ö‡hÁ®/Øóê4æ_j]fù²‘1u~áð¤)¬Mwˆ1ïI84„ô¤‹– "ë ò²<š.Q›¶:ŠbÏo'ñú©‰8?Ö1æÔ•Œ]SjµÁ¤$'Q&!ZWn!PÂ^„›±Iè«äeyîÛ7·FºH¶ÁP ¼)ªeé©ycX:¤4î«Û³ü°JÛ~?AÑͲ tç¹Né=;þð94À×,GŒúù,ìS™[\&2øCC‹ãó2Ûb!o!¦©h–JIQŸÙÓmis¸ý{‡þ¤Ř'û1ÒÆ mæ7v7—™ÛèùÖee!’~2ÄR ËÂÚcW™ûÆ®ï­D +¿¬š `y…ÓÒ¢Y½7‡˜Œß¬?7r2RÇÔ(€Ô®è¾ +Lî7s†tYŠ'8X±×¹·Ïâ1ÚÓŠ!œ˜,ˆ¨ï€Öp+¯òØðÆ)–b–~ºNÂÛ®Æyf‡Ó: Õýy"IŠ_§;'˜â~ƒã<Ù08ãqú€±“r5g®`ó²¾Uͽ/Ð(6î. ¡Õê° +W1ùó‹òÓ—-¡ûAOb´f…­?ùc.wRÈ{“ÏÜ8–?¼DÏÆâ\ ‰çï¿Ö·ÍÏ^w>±»x(Ì'Gæµz-åÜ xy‡S—£ÁäZ4/<†Øz~”òÛ\…*›×ü—/¶þÔ…r¼½mÄ+ì¤g£¶ÅJ0¦£ýýÒ¾<60¬ã2Ovâ²m–o"÷¾À¹±pߥ5zÃq iÓ3¢žnAªâ–o›œön„سòœ±¹í.¶¢©¨¬‹•¿‹i!èøå%o”e&¶á²¬‹9ñMA±»7¸¡ŒþÑ=éàJH´º k Z¯ä\35;r"hž‡œnzûPPñ’¥ô˜,ÜÃ…à@ŠÎ°?ìu„ÀyĽ[œ×­ªo“Vù ùd2+Ž½1ëè»ä"(r¼ZM‘¬=ZO!O1dôq.ññ·‘UÆ…ûè´ÚŠYTdS¬î6¨™dÛÑ£#2Gµ]ÝîO׌ç=Ÿìòåtûž üD@d“º–nüÉÊ@lÏfBTÄ5«m,_õW>E B]>i,/×!}ƒ0^Å)>4{‹ +a`ìõn4±äÀâæ£ +Ï îS 7yC~'%4D¾Ñ=öo<2Á¶IbjÙǽˆ€Y5uúýŽîì©7Ð…LÐCyÓg››º¾’lÇ…Ù&Ù>ˆ½gé·®æ%ËТ ç…ò}ðœ›ÙR®â§eb)„z3ßkCö"°KƒGëG×t\ºë˜¾Lz¯ðkë3΂èqÀ:›Ô¶ºŒ—&ìës)ȹÇקL€yÃAÙRÚ›göl›tÄ¥¤³Ò5Ï×âŸbÑm>»“rñu†Â#N”g«qÛÎw¡¶Ú4 +þ3_¥ÛÛüÆÏèDw‰c¹¼6Sœ:ªq²Ž g÷öJ…L.RðøÕš +l|OL¸Qüõ2'ÿ(£ ËqŠxœ’8ÑòÕm7NbSI$˜„¤ ÑJ‚oÅ÷v¢'Œ¡ïÄž~|º(Ål0bšº?-uäB§2)ýí±|½V-ØÈù˲Öí}ªd_ù'nÄ0Þm…« Š°9iœü]—MÃN™ü²ôw¼ð×Xóe®¨/1ã·ð‹÷‹¬Þ7Ý=³Êue¶[ŒtSò\tÇ2þ²ùèño“MVêBÖ°é|˜ƒu¿pSz4[ivnšZÀZXç-É. ì;3ÑK*ÁÁbt~Ÿ<‡a>^û9Íõøƒ™ï”¶É£¦ æU©ò¿ìÏtñ½î®!æø̶?£7d À]ÚaÉI +ðzq„«pƒw¶ ËÁþ¹°ëÜŸQuøga”S÷ܱ.¾—ïÀr$_‹¿#cà‘J{É2yqˆÙäÅoârwëiòÔ±ÓúnIgÉ.5«yZ&•=Õ¾šT…–Íc·ú{ßG¦z +2w¯®^ò^¨éxí<0uªU‰ùuÀF:f©5*ýŒŒ +|kP ˜í‚5ãɵ™,i{jÚÛÈs>z¾¾Ý[e.Rî0‘®óÑãp[d÷‹"™‚ÉÙ¸ú!NoMGØgÐ[³„¼kÛ"½;~nÔ"5‹ìbZñ¿q÷÷èNÙ'W}Q`ïm õ³1›¿pÿ €îP÷6Ë»B0>,“è¯çÇõ"@[kb¢fPNÞûE"ûáƒ,z¼é 0§4SýЯLÔæã^!Er³vIS«’ ®z?«þ©UÀÌŸˆ6-Ò`vñë-™¾Á 7;¾éºÛ6T‹KÛ˜øGÄ67·Aœ9î°‰V)6bIý.;á°‡ðù-Ru„5'Oà.5 ÌKÝôb'þ•®™ÂAÞyûîúöOíJ<¡£{þlP^T¥rfÓ—S2zÈÁf†®ÉUI{1}ãÉIÝŠê#a¦;?´Ã‹±Î‘§Í·7{Š ÞX’ÏòŸ­Bs{gPwùf@zeËp=)%ÊCG1GwèJš££ ‚××}øNXÔØuÅõù”äáͦ–U­ìÞEÛ²>ðæþþ³¤;Gžýå&ÏW ¼ÚÁdáüé4„¸–ǽwÓp™ûšÁìZ¤j4'‰`á.l†AU•½ïAòº€÷³ +ÖE +¼©*àÝÝûË +å_Ë]ÅÇb”fæ[†¶/—ôX'ל'莩cXf„‹‰äzñÄ?Ç-2û/®É¶x +7âfs€}ݧÙ,\1… eU‚‡Î2÷{Ù÷8ž ù$Fò{~¸Ù„1LÜ&·"BËÊQÜ +¿!þôe9ÈÖ“î —ªqåú†|¿°&ëó8´0K¬ñEÝ÷íüõà½|.pþlDPåßM+ÙR¶èy´©W:Τ‘KÆøHó Ÿvü.Æ'†W2ݳ‰ËpV?+ôê°‚ +‹¼ÙJ·S÷˜Ç禷;{„ã(û¾ü¸õžs»ü9*óQâË`éàûãÑuŸ¸¾Shùs¦‚àÔ×”¾·f£ðœ´ÇÏAÄü>9÷JØJXý?³}9ÔQb%J–øüž€µWO5Å|bµV>Ĝǹc‘>ÞS¬ÝžºÌ'+¨˜> +Qê¸;%Í#gáç›op°»âV‘w9áG4pSõ?n9Qák­0‡/´9J)1öh™æâÁ9}£—áB(š5ýÊšjN–é /s~4·Ií5IûJØÆѬõm~Zˆ¹/ë yÚÖ‰4C§€ÐŠÔ~E| |‹o[Üæ×tŒ'ÄhŽIG7¬®A"9|½Kû®»Ø¨e;z.ÇÜÊô*^ríÑ·2Vˆ #ÁÀ9ê™/øt>$Þ>:Èudß06wKF”s^ØZò£ˆàÏlÂÏO<-8*9¬—Ÿ`4¹£D…A=ú«åÈñT±þd¶?ö„û,+£‘Bˆ6Ï™~{9ãhõéÚq”®;þ°|‹©¡ÿHŽ~Èõœ¨¦Är¯Hd>Ô°ë®’(к/졶„úc}DÐõ±ÃM}:6EP;\ï¦X35ji‰Ô K&dÚ´ÆŒ6?„•y¢AàºqÜå!( 7Nd :F¥Ø d…ÝÜX§67[ õoS[œüZvž±Æ“Ñ_¦OÝæeÆñ¸wÏW|öíÇ +椇¨fÄÍ’»ÞÂÁ/$ÌI½>É£¨ñgsžùÍaè# ’Ñ iü‡wò'aÅ™¡œÏªOo>vˆK¬¤õ£‘NÒ÷Ç:¼—î&àõß•fõŽÜF® 0øî5¾r{ù…ÑðeMm¾Ûié76̯ÌÐߺMOG·å¿ dxÛ}åþ4-0þB¬ +9bwDÁ°Î8;Ý‘N>I)iò—’§oB\í=¡Ùz bÛ}Œ=›]V›‰Âà¸ÒáŠxòº¸F匎×Q€í†ÚÓ_Ñ¡)Ì:q/€TØ?ÚIŸ$ ÷NAÒ s”µiasIø0ó÷Ž ¥M³AES1‰0oûŽÙ)Òæ ‘G–Á»ˆÃ¥»gW¸ëkŠÎDh:B.Ô;è£å\Ì)Fa"›rUF‡V©EŸ¸ö±l£ø¾6ƨêϨcEâðôcn$vtGѽˆã)^×™y·ªéènomìI +š¡] +•uåj[ÉÆ^A…x©×ïÐ’×›ók ÕÝÊO}IÄÕÊÆ-ÕÆñ– ¾KÇ|+%¸£±1£åo2#ˆÁ341R |¾Ð# +>Ó«™‹¿_^_¸G$Wk°tkI¨úB$Aæ%½¶Ü£V#IÕ²Ö‚ð"]î,ZŽ=*B _og{‹‰z[[b0° +ØÍ‘ Ä…žªaØ0ÍKðÀMùD8JÞZfæ¦ì[fÇ +?ºß’–Eèn µf +Š&Æ7qqà¢ÖØ€mfFD×Ýù³øø:W¨#ç¢÷.ž +iB÷ÂÝI«+&ÐáÛmÇ +b•q·–똓–²FÑ>#± 2áY¸*±ÝV:®#>6p†“²3 ÙrЛÓõ¢i’¾ôiDºÎJÃ{Gy¼õ_´+‹dä·áÈœ=ž²éøètè¦Ü}Òp»"º¼ZŒ×qÎ Wý4úY`§™‰Í‹Ž¨3m¾i˜Á/•U0Û{Û,u^Åðâ< ‰VF?"BýaNp½ÂØ´Ašu4Ø|¨ËÒÐPiÞÖ?Ðj¥O†«o 3\ +.ùóväĹo_ÔÑsGN+k}|šÈGŠf?IŒ·ü$]¢uÉlš{ ·ôdÍü`Ùø2:v‰ºÕIPpi8Ø•RiÔs2Ь§mP=DÈ=¥Õsò°úåßÑ +p½øømEöÐo›Øå¾ðá°4r`ÐaÞc L¾“Ö(Ù-åUbbÐ槽ÿÈmdw9£8žyÌýgê{_à‡íB-äÆå¼¾=I$žµÙãSlÆ]sOAT˜ +Üýêgj‡$ò +²÷QnºŸ8;è¾NÕûËJ)sè5Ü]s› ±yp/)õb·â« oxï lð ë×ý`´s&Þû°† +ê¦_–(™áð{ê«1r_áûéåøÙVÄì.ÚÂBç-,ÑÅâžE{v2ñÝ“>û ãÆwPp(«Q¬|;ç›+z.UÛÏŽé –g±ŠT›qû3£Áw‘þìUm3»69+"Bî"Tï +óH*"ÙÉ ¾²‹Ù^žhp‡P•¡O!¦2¶úPë™O*i÷ñÖ׎# ËŸc’bg]°ŸÃ”êlÒWKõè| +ò¼bæë`˜!=åÚß{Y•tç!vÓn8Üc&“å<ÙÛpy+ýEs“«¶Ÿ±Al®Ã´rà†uIsTÈŸ¦[ŸMªûÊ2§ÂIûí8£–Òg¥ +U_$¤k|~õ´šaœ$I#º}»噢ÐJDZ™™Z™¨ËŽu߯œacH®'Žva›Oô4i¿,²z §°TkÆ'Ë cIÍQvV>ü`ê'z0 |·…Ó‡&f +’¨Í'/ðak­î} %ùf-†ð†@aßHSÁŒú4_ºãlK†€g‹q‰ÓH¶)Œ+¹twÕ3áØ$P)â×6'÷n#\XÕôrdWù~ˆß ¡Ù4k’)bè”O÷]#ªnŠs™“û Ùâ&M‹Úʉà´SÕÍ’#™Îõ‘RêŒYŒo_jž~E`\#å-ÁI¼‘­f“\êùª— w{ùMI–4BK±-"ÅÚ`Ã÷O'K„ +÷a¦…¹¸NùjV¾Z)°ä Õ<ÌäùyÕ +¨<òö1S·oô7éÉtà +üHE¯Êˆ)8÷ ¸jÃt¾s38šð$øµÀ§Ù¤TO°V?ªì ÐvFA¿Ñ¤©Þ5÷xpGê·$,ŠÅ-¹ M5zæÂHvmF½`Öjr«'° +‡ú#Nëâ9_qò0Q©—|r¯i]°ŒOÍ!–nÀ-ø¦ ÔUv +Ä\›Ù›Rð’ºð +FèY¸böø*yQ÷“MÙV4Dâ¥kZq]Ͻ5Ëk8÷p³âyÛM½àéø7ñoþL”Ž:"Îõ‹=Û®Gd„žé*G²‰=Š-OÅü¾ôæê¼cj¡¸ëûX,q#άë<¼è7΃˜šd•¶¬^Ñ=‡ÊüøQ–‡ÃE;ô‹cº;Ž›·À·S íÁ·m* +Á¹Â €˜ýjõ¾·UBúÝ1JM‘m’Ç??Å8£È‘[uÞ4"^1ò·uëÂ0cð&ûÆþ˜#šQ‚‘»³£È'r"„ìU“ùÿäI^9oÃÃÆf•eEq|‰‘ P¸E‹‚ëš‹9Èÿbó6É !?j p®êG½ sM¦-(þÀ + u2à|™ÅL¾Vnè2'DÁZ o!8½ªÒûS÷ÎAþÁÙõE(Å3­ÅWÌž‚† m»qÈ9”L¨{–¦p;Øë¬Ò+BWun÷ØvêTõžNéNESt×{ëA Îø=”>C/Ö•`\©ÁZ/õ˜5"ÖLýV1‚ÌÆ÷i¶¬ÖªÝU”Òõp`1Å2Ôˆã‘03²ŽnµÕ›1ãÍ~·Àª'Ƴoð<Í¥{#Œi^&¶³u×”­•D»­&‰â7—TÍ7ÈçZ#D ^}gcÍ À]äÙ¼;¡I.øÝ8¼vïxØKÖuŠÝ#˜a¥mÑ"yN¿ç²TfÄy¿Û­q`6{”·\„ÓüÊìø¶:¢sª‘¨Où`"ð›o\Ö ý»íç$¶É@rBºÀQ&çäß8é[êçäRw‰N¼šš†[ƒ,¨µ¢ªéV»<ýý¶¢Ê9[}Ôöì˜j•ì“ä–)XœÚªY·yS3jý[^O²E`~ê–ø\T{–ËfîL:篺O¿ æì]jóØçPiÕ¿gøû½ +ýI»+ÐY²HüS8ó+óhǰ˪‡§»` +ƒf‘¾çÓ‹û®ãâëÛËrôNs•°ŽÛG ++pZ¶<{Ã3°Gò<ûR‘x’»ÊÂÓ6c<aLuß^–mxÅm6oûÃ5m–e.ÓÂ܃nÏÊýŽÓ^CÜ1r ?ù’\B¾ªhke-ûôUÜ÷u¤ù>Åx9™ö+µ>­ß‘Õ9Í'[n(/“hq½@E8¿9œÚ¹>å Ó=¡¬œ?>ç –~TƒX軼J)Zâ +$ÒxN¦Œ¡"øGÙ6#×{qOñ39à3’êõrÈ&÷íÁ%L²F)>ðgÒ‡s:¼C²/ݨ…ý¡Àxðù<†v$êšU°kí]ÃXòŸüŸñ‘ŒjvÞ×ÈËñÙüéW­Ö‚Z +.=¿R3Ï€Oï'\SkYãM”¬;¢®ˆbÉ¿r¢B•ÌÑЊ®ßøß6Y»PÈ_}»¥k©Cý¥ÈJà§Å2Ë…W¯koLz +/§çŒÝêï‘1Ìñù€’pª”XÑyˆç¹…ó +Ѧ·í 6á ï¼àzGþ áo"¸ 0óÌèI¸‘URÐ1çÒ–A}™·(&ó*¢|·Xl e$øt'Zcq‘¹‰"ÆõþN\ßhŸF]a`>I”¢ãUt%y9”:®Ð^c¥ë¡‚ Í/Z:øhóEžRN©çèÿ¨?§n¬¢Ã§¦ª>›D‘Zoß ¡Î4{ìŒAÜü%Œò„ÞRq1õõ7IÐ8ݤ woýèK¯—Ö\±ÖŒP4îC­¢/[³:“ó‘r™Z©v'¯Î÷¥¾ƒMW×!²4ê#qÔ qüƒÀçnëèöʦ!Í2ó Öt4 +9•§ÏNVÉq,”owé”}ÒŸåLK {?ž•eU½Ì_í:C}:M¡B=Ö¬Ô{ͽl…–îЂDzåÆ MÞ‘”ÑBK­éwå~5¨Y6ð£s'¡À-&.ò8ßcÞ½§Ao's7@QÏ™G9ývÒÁ†©Þ] + ø,²$Úd‹´YÉÚ‹_hø +Wß#Z¿|\'3äw¯¬|ÞÙh%ª9”醞­ðEÁíàÆ°`Ä;Ž!ìñŠ+}ËôâBG¼2eð¼ÍKÌÊ¢¼ß·Ã ¾Rc£+ìÑk/ÿM#vO2Çõíîrkcúô¡lª^só Þù¥—Û>$M¥ÜÖb8ѹ¬Vºl- vÇ…eU_b( À®‚óE"EšJóñ&+4î!Vé´½ß MÉ`a­IPxÖì÷æ™Eä3íøï(¡&3ÔXoŠ÷å #_Ô6‡ûâOq:¨º+F¬«|yÌ~¥Ñ3~‚«åù¢­;:l à9Vü͘ÐD£…û™dÕ½i×(»ôÔY¨Gþ1Ú ­ò#ûS¸p9‘¶ îôÛs¬nF`±^#+‚'dQÒcØ„äy´ÙÖ*ÚJ+Þ¿BÝZjõcgû™ˆœIr·tã>‘—…,Çgar +ƒU›i~¤ñ’ ±&jPÖ[Œüã3æ(*¢…ZÑ0íÞ&¨’mˤ¤+LWïÇì!eGEªWV<Áò³‡PøJ}ˆòb?T€ßª—’¢¡,0?—Wä×VR.RÆKoÔqg®Ã[£ZPí§ ÄS¼µ’õû–µ¡>ßíTm&üP’ÆýµÞ GjóÐss +ÙpÝuÒ&i:™Þé–땱º™L€É jl}ÆÎ4¡4'E›>ièmæ=$Ÿq3œÀ˜Y=m{Á-+tJ¡XÔÈÕºÂ_FÑ\”É n?gètšuÿá"0”ˆº×üô"›»C¾ Q‹Mõc‰º÷i1}ßv“fX(é_bã&‚ì)û¢bCGGΈ˜EÎ1?âH¿È’u,ÆPƒ€Z<÷a±dd®OŽa#èÆjºñ÷ÑmJ¨h¦u—½¥(xbÍúJ’ÞëyŒQðƒï·º€Ä㪔öº ~ŒiÑñ‰T^ k=áK½èçÝiU´_÷âçòw&fJl='Öºâ\é¾>‚ú²qGÈךÝÍ$zÞ/êþÐ7Ïl¸KægÿJ ¿Â^/O™âäQ¢¯ •¼Çja––»•%‡&+&mõ‚¼ÑÀ+ß(˜‡é…©œ/Mw©êìÚ±K÷L*üsø& À?Àx€×‰l‰èuª4p!ØÕ^œ€OºðÞ;ÑFDüš…>…_ÿ6ÔzÔ"bî)ý{J–áUA8+O×¢£ä‰”ˆN.¥~g×ð¶1•h[ëýƒyñ+ÅÇFÙ¤…€Yý¼±£Ùù9‹Ô3ßdXõªSA€à…N2jb}û’ó‡¹[~Û/'Áµ ¼Kg®='Ä)üÁ<~¦z5ºú¶]Ù(}»Nî¥<v͵ù A>4kjÅ :†xÑ?wÊ+s@dàª'3…Ä2{(Â5,iö·o+$I’Úsï´XøÅoíjÚ22ÉœaŸ +Xèÿôkò3¢ÔË<1•hóƒ·ŒÞwÉ{¯]®#êPqH‘ ¡ø MÏ»áfÁ*w¹ó‘Ÿj­È„ÂKã¬זç/ß—t!þĪš\;XqˆÕà¬Ï€zŽUᘴ§Ài…I¿o¥Ò—\:K+yiÎ7,`%ÅÆŠYfÑá’‰:¯¬þDp’8Lÿ‚§*˜ýû\(²‘ÔͲGÒLÕ:éÂL -½4ä;Öé?Y¤VßàQ,ámûvõó°(»¹+Wa§©!ÎùÛµO6èg˜Ôt·á † +´òoê>ðSª~û¥V¥æ¶v$ õI +#ÕÜågþ‡¿ª:ªøèe96¬U¨Kìƒî=¼{0î™ÄÁ®Ká›vPµ5¨)·¡ûl)aóðϺÌï\±ÞÑԥϛ¦\Ï?ú@¥3Ú$ñÓŠßÞ5Z¬¤„ismp*Z7˜¡d+«zæøâÚçh£~ ï2ç"ò£QîWg¦Ÿ«D.m¥Kvw¬õ@ï"•Â¸ôËÞU22?öºææ»·|o8˜ÉóJÝô,¨sT²@ûñb¶ôžBGÕ—ôüÖI€²›L¡Ý ¼º{Vûe“Øǹ2·éu"ôî‰’Ø !7ËOK{0Gäµ`´¯˜.€r>]ã‚Íù¼."È‹k¯çzÚ2ò¦`oúðì’õH‹$ŠèFæ+²VY95ëúAHi×xi w¦˜Q€Û6>Ê=‰ŸÀ,w}%Ký^lͽÇÖJçïDF5h±úž1e×ýDS¨Õ ÕlL¦{\£ J´ñ×¥¿Yw9™,I6Q«üø5øÆ`«”Žzy1c¡ŸtŠŽ9·ñBz!nTÖ´1ÍLõÅô¸æÏ2‘é\†_šÛ¶zå06tš½UŒXÊpÝéi ÍñdF‹x-¦¬žóˆ7ÿs€¯^6FL¡‹“ˆNr…žÒ²Ïí°a$vó„Ð|fà×NýøÒú{m1ujDF<÷ÛŽïù½Ü)q³•*ýçNévÕU-õå¼/÷äñ=fŸ~Ì¥\Øþ‚îä‹?ÃVEj4)›¬­²w0)äîqÃÉ›×J[¹¶ÜùíTÄIÎNóÖ6‹uõ~kMÒˆ~¿)¿²Yðe3ýZèqôí¬˜­;Ãdú¢¾]£ +ndvöʱg¹£˜RÈ×7o[ÐGN8'Ãç‹?íi£pÈG4Ðæ/íËIh„pÎ ˆ ]~ÜìVJ-€¥_½ù25ó«ÇZœ]ÚTücD‘’¦´ +Ë`0ïéÏÞö‰Æ¶{ g8™ØN„Átéœôñ!¡‘óéñ +í´Ô²äo=º¯R~3imÝf+ƒ+gh>¾˜ê¦¿ÐGF=êÌ’´ùâX‘4‘ƒƒ‚7évÄÕ}-3Fe~•ŠTÁQ›;·f(ax óàÄ7YŽ‡w\ïr9„‡WBCÔýNÄ¥žä£…¯Ð;S*u{ʆ‰7Ÿ1Visumç³P¬ï„Lº‹ XeÄElŽBéã¡$'%þñØ!ª¾˜Éú„\&vÀ×ò‹>=¦–úÁß0OmÄ¢U0öm5¦œW[`¯CuÂGÌÛ?}`­ÅiùØ]ú[¼¦@OK ø:`þCÇNLŠïŒ‰®Á,_WºL}(û <«Ùa¼D"\rÕ[ðIï†p1–HËã}:¶õ~ Hú£-R ÏiDº=l&ÁOîlmYÛ¥XÏžñ©2.¬wnðV¼qëªÈß„‚¬{¼QúÛÈ«@tÞz#éÖG¾é©çB¼\æÐÀJ5 qÏ5Î'¡WÔßL%²<ë#…ÔZáɸ/¥ w}·8‘«@rÆK'ûWϯMe׋¡6ÆL—Fxm¹¢Lòß®á†|ÁœªÉ >da¸»/+ñLXÆ[%Ê»ÑÄÓŒS„ìǸÖ+‰Á{fŽ'ŒOÎðùlµVKûC==cƒJ>/ql¤/pvÙÈiï1²s{]{*]K+¶xˆ=Ã>ÕtëåW…iî©î‡¼×öéǽØ×’Õkm¦-twF ˜Á·®;O¼êØá˜ÇŽ?åyÿ>Ú€ïè'1§rìvE%~bjχŒ„Z?$Z? =~ J®=÷O3:bÚµG…¼¤TRÝ»$rŸ?!|6͈ëwrŸæ ßìÃ]âûDD‰›”åéfH£²B¬Ñ QmëÍm’Õx:vx©7ÌHƒ‹–JýòdT°ÔƒÎ!Ñ>×öRÀØ”>Rôí(kz@7‚öø¿¾ +ûÄé†Öš“.(¼°`m6Zÿ1S’ðÀE¢‚eø(ña¼Å&4ÆÎfήgÖ§†èØ]‹q–¡â½-§þ»†¡%".üPì·w,¦wEé-‹j–ÞŽy:ÍŠ2²do—µR%¨)†Pÿ§›¬Á +endstream +endobj +357 0 obj << +/Type /FontDescriptor +/FontName /SVEOTL+NimbusSanL-Bold +/Flags 4 +/FontBBox [-173 -307 1003 949] +/Ascent 722 +/CapHeight 722 +/Descent -217 +/ItalicAngle 0 +/StemV 141 +/XHeight 532 +/CharSet (/A/B/C/D/E/F/G/H/I/L/M/N/O/P/R/S/T/U/W/a/b/c/d/e/f/fi/five/four/g/h/i/k/l/m/n/nine/o/one/p/parenleft/parenright/period/q/r/s/seven/six/slash/t/three/two/u/v/w/x/y/z/zero) +/FontFile 356 0 R +>> endobj +358 0 obj << +/Length1 1166 +/Length2 11221 +/Length3 0 +/Length 11995 +/Filter /FlateDecode +>> +stream +xÚuwUX]Kº-îî΂»[p×Ü}áÎÂ=¸·ÁÝ‚»»»î—½ûv÷=Ýç~óaVñÏ_Fz˜”dJ*Œ"¦öÆ@I{;#+ @ÑÒÖØÅYÅÈNžQhîø9()U-A6Àÿ¢?1' ÈÒÞNÜôÁ«Z¸Œœl,V>>NÖ5 û?íøJN–¶öž% èdci÷A‰Û›¸Øí@*.6–@Se ³½‹“ Й`öÑÙWˆÙ;x8Yš[€4jÊ´ôô ÿFXyyyÆÿdâ@gKs;ÕÇÂhcïðW¥R@; ÓGÓ¦Å*™I˜Z‚þ@c9ð13;˜?0&g3&; ˆ™ö£Q ;S1{Û¿8#ü¥™¸¥Ðäc(æÿÔÍÚÎÞÍÎë¿`3K;Ó¿G2uq`V³³ttʈÿßàáߘ9àdacáea@w æ¿Jªz8ÿ&Yÿ‚ìL}¼ìfF6Î@K3àÇ ÁËÙÈ9¹}¼þ_âîXY¦–& €1Ðüãþýšýc¯`r²tè°0±°°XþzþµÒû8PS{;‡+ÙÌÒÒš +’_éÿsöE‰ŠÚ¤ddåæ0²ñp~8å##/'ûfü—ÿÔáoTÉÈòÿöÉòï”2vföÞŒó¡ã?Gr:9x@ó·iÿ3¿¢=ÈÒ ù·utY8Y>\óñbý_-õ?øÿÕXÿYCÒÅÆæoUhþ!àCg€<à/ElŒœþ+ÜÈÖÒÆãùà?5€ÿpÿÿ' ÈÈÆÒDÄÎÜæ_2Y:KZºM•,A&ÿ°Ë?U6ýû•ì-ÿºÉFVNÖÿàT-,M¬í€ÎÎgñ7´3ý’v&ö¦–væЇ+œLÿüE›¸89}Èó÷}|ûϽ™åGƒ@ ;ÐayÁÞ„?Ȫ6¨í¡Z„Ðq‚½—KíîÝ…”!Ú|— ¢GϺ„#ç–')S\iÔB°RR<$–P"šÛÍšW´ 3B:œà„©î³"ÒÍÔ%K/A\^ÊÏ#1és²²;-JA±q •{l?âíƒCÇ/0„$eyð_hyqž¾}‘¶ñýÊ37Ü!Îbõ-4Q¶³qú‘ZV±ñä³¢Ãp~¡O™Óo.D +T{aL¨UÂÍ×1ÞÉödQúËì©zØ!S–]Ïa•¡?Ù¸hqеÜFoí‹“Ð_m車Ÿ¼Û4Tù™ËÉÿ¡siQDMÙõbOž\£Þ¼b~^鎤WÖ‹=a«NA­+Ò´>Æ€tÚ§Åü+Á¶*GÓ½Zû•†HÜnïšr¤eC«Ïjûgw÷'ËŠ%ôÜ® f +ØCûB¶iªø€Ù`)ÿ5–’²¤«TÕvd¦«På^«ÓhšÅ™N§¦jûå®1Ç¡à,»Uä>3«4£2Å{¥nÒsõAN?‘ü â½NV~HG*ÓÞ†eI4¼H) +mǺ, +®Ò waÿvãàõKêcOô„¨¾S®æ|õjfšášºï“®ZâS×õ¤I­7v¨Ž”Âz +·ôÔºmŸÏ-4c¡ôÐ(Û.ä„ȃ#´cñT‘Í¢øžj+bõ\æ‰H¨m—VŠ ¾Fºx˜—Ñ÷UŠ2}’IŸ¡˜¹† þþ^=ŠKŸo™‘ÂâZÂ|rƒ«Uù^‘kR.‘2c5÷œØ¨"!·E´$ÜIkO8˜¨%+|(ôÅø5Ë/ìVQ§[c‰À ÍÁ2ÐO8@½è¢ƒ¯‹Xñ²ðúÏVA!è°Ê½m sÒ 93rkgÿÍ—2ìQHSP‘Ùn^Â7¶¢šùë¼ÜOÄѸߡ7E¹p#H?ù“D¥X™V>«0 +Œ¿Žª¿oñs­ú¨fŠBø»Ñ1;Óao˜ë±aôDªíNa[¹yÝb¡ÓýÚã¦MY ”ÆÜFØ«ïú±}Ä-ú'µyd þ¥oFKÿdNrXô¬ýɧ +}"$S­Éw ä[[ÉP7ÆØ1Ì5¬Š´³õ-ŽŸëN5c5å×ãÅŠhFÉI#­\°*ra_zé*Koì×á„QU¯q +Sé5øN¿«é¸²ºÊ=d<ºö:4„êý¡ÀÃÆØ…´!ˆh +)f2¢ï¿@ +¾T§K_},·Ëg¬÷„*Y1È̹¾ù`Æ|‘/à  °ÁQÝÂ`ýãWâük»¿¨Â¶okð6Ï°€¿NÙb,C×EbyþçWê‹ŠdÙBÛ Ào sUÃÈ·.t@«©e2'2ß}ˆ™]·ˆ¦S bîz„IÍVÑŸÈNÃï‹›ƒ +ë ‡z^p}²J* í‘v 8s™ïÙAþ®ºsÛ̘aÜK¹fs¡6î=1ì‰8ËwQŒÐC7¿àÈFÏZáâ´ÄÎLè Q«"Ã|ÈÄP˜b^ŸÂ[Á“üÎ<T¨îòòÞå©ìQ@þ¡†Ü À­Ð’fGç§D¿8õu +Þ° +瑸ÒÎxÀùý)#þ±Þi8YV†ýÌb¬(HèÑí¢˜Æ’ƒØzÖŸI¤Î©…xÞ‰§û N„Z»š—Ñý³Øvi-ºtßoÅ€cF2p:¹Gž*×ßuᦻÇiý¸±ÇæÚI;¶'ì†Ïí0fø||j0¦‘û`ïפñZû¶b‰¸ºz7‡¹âúù¼òk“Ò.•˜™Ö*øɹ€Æ3”£EýŒ"ÃWãHÛðçYбî>oíc³iW£žË +‚÷4Ï"‚š«—™ ¸¼2è…­Ð[>ÐM;òöS"ï4‰$€9{{ì°DFŸl~êõ „ Põë`v¿èƸî‡í|ôÚ"KÚc*¦4Á¶‘Æ +þÎm^ýTUDÚ½cîRÞ蟡¦Ìèî°u™`‡åc +A¡5³Ë8ü +ÛYátÉ‚Ž£×Ó—¦øm´g¼uKÙò2i™ÞãWíãfVµ¡qCY‹ÚÑá±ýèêJ¿@ëË¢u=cü[HÕ¶ŠO Û,¢,Óª+ ’ŒZ5±£yu–KH3&ˤ’NºÛ.-áì/éÚ‡õ‰aü¬o_:ûË#¾²Q]²§À ‡‹×c£IçÓtm´§·î‹Í¯½´°ÕÉøùÜb +~ÃÍÏCù ~Uî½Y˜ê­h1ý3S­±3ûÑi½Ë!¦–½,]»Æ¾TþCçÖÁZaåÁRe:‚D‹{ ‡MK×ü”tÛû´ê-\ë&jHy3(¾e +¤9À9DÃ# lŸÓÓ®ˆAœé\! 3”¦7¶1J¥Ktãq‹¨èÐdzµÓp]ŸlP}ë±â4°NГ‰¥ãè}¦w1U[uá´UÒz…ÃÃÛüpìÂ\EFJ¶æB¬a_(‘þf¯U,±D¨?dn¿ÿ‰·b¥m$Ô•*åA@欖ÞLõ €r Û”¼ËtïÕzõ¥Ë±.øi<¢óèÅŒG6($tÝ ª¾tå#½7=…Ò;=EjÞÚZJ!Ey-THÒ¤Aã¬ßÂW&è,Ò<Š-òýrºjjÎÄðuk‘°RÜú(ˆÊø +{W¼É’ ¾Þ;X®¹`U+cÖ†s@¾Jè=ŸçЇL‹ºÃLª“xØ9Ö+N4ÐàãÕMDÆòŠiR¾j eã ŒõìRõßÎb÷¬ÇÛŒ7ò†d¶4 +熢QŒèûÑñ»I&cÞ%…añ5gä]sÇCrØ@LPhÓ´®¡DLø¶X1Ùx«‡Ç¬]aëAÛO%‹e¯ÖƼà¬Ú¡k+Íš…cwŸÇà@QBgæÌè,Tö]ÐxñÝ=ѧ7òskÙ•—Ž)]3„Ê„þ&ÄÅà‘8ò™¶êB¦0ÂàfáÊPÏÆ{·ê郡Gœ_NÊg$c8¶Öþ1œ¡zâ Zß +£°v¬•Çn0‡{…õEÊAézˆºJ¦[Ç“Ú©ÆU!‹!c¡¹Vý°„9‰µä ‘Niø:c ê6S邉Ëù(—´KWÀÂ+ˆòøºÓ—:,gk9ù¨DÜ]ÆOkšS"EΦD“3Ë"o¹M÷ea¿þNgh›O;¾MÛ×ÏÉÁÇMQt#ùã–JF†,LIÒŠô·‰ñ—»0—ˆ."¢Ô ªž¢nÈÄú'§_n>$äšÇ1²¸Îþâoqr#ž«Ëfå d)3½ SPÅ›¦íý(k„ÇÆ`†ªg>t/góïoi¬âYg5]ï£äÜàËÐ ‹}œ**Á]úi¿+ã˜uðÉß;-QçIȶO¿­fœEÍÎWf‚óô¿)£ôBa1R@@V‘&ñrÙ2º~>Óò«LÝOz6DT¶[¦Rø¢Ò#¹à¿áÞ¬+//ËÔ¸ümÝí¤¸e_°ðzß +ÐúXˆLê4þNÂÜU›ŸBVq8˜hò~ÙÝH*š¹ò%bf–Lä¦cï© <»óvª®ýh„·òZ:Ò¨UAEÐ<>I½Á.6â5ÕR,HŠáðc^ud¤ÑüæªUü¦Ë.$²<·É†Ú« !-*õ$Ö¢ä¨0)„²e ñØo•tL” D§-×’éîÿíÕûvVŽ›u”›Q>ô5”„+)B1%¬:¦AR¦À•"ùž Ô¡síæ«cL…;F–’—ì÷û>ŸÂóέTrßæu8&$¼í‹Gq·!æ‰Bµ~rÚ|…±ó`LÔûÐéí!À•UÎÁ $kO#QøJF{¡ÜiY΋¢žq¥ùÙSâh®µâPeëÇ’ŸÚñç¾H‚·áœÊz3h!æžðE´…·øpÇôÒ©:Ž8¸È?I¥Pqé¥h×C­cœÑݵFIdŠ#ËæEIõèâë"û”ìéÔö€é-åéúf…#ÀÊyriŠeÏMKlútât-~–¶/h„5Ü(L‡—ñL§ï{$£BÃÀ –´ÀUøLû—’€á3]÷e•èq8.¸ÆF;0Ä;ä¤Óˆ¼ØZmÏ?½XÿX×ÜðdHƒe7"QòÞ ÃïC. =—BKŒ!èé.8›Xò›!ŒÄ̲<¹C¼FdïÇìç䬨W6³Âñ'PMÒñ…'æ¶LD +H̨>ñ?oî¾ ì©1H†k…Þú…d°°¾»—^ƒƒÅìÊpCÉÍSj׫¤Ó®‘åK©˜ÖúB¸â; +DòjvвpeýøqÛhn¬0òa¿B2ïÁrÀ\( +†.òUH&ì[QGø4³à l›êQ´ýÄð÷sFp²Ããu €ÛÓ1ƒ#Ä$ÖÁ²+â(IÕ#à +ôCd’¹-çp'X„™YŽ&JölÍ}+‰„[;tú¤’¶`Ò*lêgeÔÃÂ…þztÑ·Ù?•ËΣ-#‚ÝÕ:HüjÎÒ§”J7‹—/ækó\puësŸR'ãþG¤Ž’k{êH¥ù΀Àá0ò‡ Óò¢‘;Ùx]ÈóT±É‚_¥„Èóï„¥‚Ñ —[é:-ªÊêÍ6Ï2.+³,Lî¿… +;kx9„L0gÌ–ÚÎËŸóOÐ[u Ý@Öß¡b ëêÆü~ dk^*Ô£âŸëqb‰‘#¿ƒr£Ýp“/†…Áx€ÂG‹OØÅE'¤(c!à¾ç‚pŒæ­ñ\!ßÉXÛU=sgîzögõÄaÅKiˆ‹¼)sI›`̽TD-šF7øRëXÚ²w棛lÝ›^!·4åçÇ´;̪p™”ýˆy­™æܾ€íÝ»ï¦ñ2Èß…Ä‚ +*qÕD˜×~é‰Åo +¹’º;Ë/]u‰²ÝRO~Úà!,©˜ñNá‰5yerzVÕ=y¤»iû1ùs`$YjD¹@ˆ-Ï.f˜^ܶ]ú/McZÄ׸)^ ì57@’iâé{ì3F–®às£˜Û:ôaž‰å~IËkC•s7ô´^xùa€#›ˆ-TV&Æ^§ví¥Ë-B¬¸Ö +¶©hLeu£Ž¤–½©H<䟂¡hÀß>òàwÈËw|º-©^bα\J4³’Odù ½Ö³ +©^Ÿ0ÐÐFfúÝ•XL“¾Oô"Œ˜¼*IáÝ›³èørYö3[ÁJ(ò’2ƒèZ>ñÓÉH¢a!‡G6x}ä‚(–B +ÝóîÛÝWƳr^`œ†c[RÀ*²ë  ¨ä¤Ë+Á‰Œ’ˆœë¤Í^¾ Š‹T¹ñÌŸº o‚·I²b= sÏÞ’¼!ç.“¬ƒ†iNÿ­£v¦I‰o9¨HRê‘v·tžEÆŸ¨Ôâkjný³ÓYF#©•ÜHH¿CÌ‚‡ê€-÷÷\OòJTûWÕ¹šnóÒQ&;ñ,Ú¥‚„—â4£U”‡ÌVÁ{¹)/‰íÏÑd­ÆÉiØÅ’ži‰ØúºÏý®ëZþ{Þ*Ã}ôJô¹\ô”[AC|Zù ÃqÌ‘:mç¼I$j3_µ¦â|áýõPH]Îrò„U-fE©•N¹F-'"‰Ó2Îb”b%Ý“ÀóêÐ)n +E/¥«¶Äf­ëŒúT`R—Iø5x4`U( ºÓnïðˆòfë ÖÜþª‘U’É™Áù^†æbãx o]T\E|°N¾© ¿Ÿ¢³!vx»…ÞjEÎ抬#k†íw”o0"ÊI’¨{HÝœžäI«xv½i +ÿ“Ó”BØH¿FJßÀ]#›î)µCà”ms’úçhkÍîÜêÔ°]ª7^ýlë@þKÅVΟY&dü+pº~V±\}¿[/êl¬7¤Ö 4ê’…3ò&{‹4Óæ1ï¸ÖE͘ 4÷eNkmÏ$GçF(É_Úê\yŸúºÜë8.jÜV§Lm$%XëÑÒ•KCQ+š[*u½´D=»“E¹ol3¹ã ʯ>£È5›—s!ÆZ7Ù¨-ÃMnëŒHôŽ¬$£y%^üÑAÍ0 u-#ÝY|h^}wô­jå¹7ËldÕÌ3oëU_â¥Uq¯ªÖ‰¶Ý-2i7›F®¹õüõè?3z*aú$EPÓq_Ejùî +ŸS×­üãÝ´_|4ïv0¨ÐÌ@ÀÈ×ñt£<¿‰‡Á K‘s¥µM7cîáYTÙ0Hüʽ@‡@aXIÿž¬H½I13L>Jeˆõ¸ø“‹©ï€ƒm;˜he2„W\ŽûB ZdJy›íŒK—Ñîªìœ*{CG ÖLö·1”tg…¯:r³\Ô›Í÷`U~Iá<Ýëz^æñ›©BÛËqnR–›A'1ªæä˜Dc|^7’ç J +´ðíaÿ„$Ô 4‹!.üL6’¸ù÷Æî:!’S¸¬¹h»?%­ÜW¿Ç±l61·oφW΋`â¼Ö£WÃ`Õ¥'uÔEÆæ½ûh"WF–fqE‚(tÎøÍ€5;]ŽB(;J,‘˜+Ò}JÕõ³†‰bámÏè>:©tÃEʉÓà­y.õ9õWêdÛ³Ïq +¨çgðóás«Sé:»Ï¿û]¯«EuŠ¥¿ HgÒœk3äô!ëHº i +Z¸©È¦FÉô¸È^ßM5súj¡ËI­Q™áèž;ƒHŽN\X§<(ùÞåõnt ñ²¿É¼M¨–†À–—Œdr|¿Û„y­àû·$´¸£øƒcgŠíé1+}ì8/¡›&מó,­Ä^ZžÁºæý¸q%ö©Ý~)¿mùà·ñªž¢1ÜÝ’U2™ Êe•ÊãVÿ¶¹ÚÖ  õ^ûÑýžB\ÊH9Ú&<¹H ½5À_œ'¡%‚ßðcåä€Òè k(<òÏHK°ï[ ­?^W㯗D®ðDîq9n1ºp®ÚÛè0&_-4qóÉì üú@Ÿ~|ÚÔ“Ø*ŸÆú=žîA€ê™õZ +7œÃ£Ó$X£eËö}wGB¯ÖÄ&ô¶eÛ´_n9‚Õö*]>”ÂÈE…ML§«ËP¤=§z¦Ò=•k;0Ü)¥A<>ã¤t‹í,.gà›MhKŒ5‡æ¹S™j·"²PP^Ú~‘øœßþtëÚ›¥¿è½ã2öl³ˆxÓr£É¥Fõ3µ¯Åº`0YW(Ö€øG2™î:í_§ú*Ðßîß{§9LgîSÏ„’cÑÔ£‚™ºä[ú DõM¢Vç¢86iÜ.$f•]"1ŒÚ^©ƒ/¼£³ŠŽ©Ze±î3ŒýÎcE…ævaä“ÇËW”L§1‡›÷K¾}k鎊ØY¬“*\÷z4ùfŠáV†âëoåEO(ÇqDW"²<_Þö|Uî/30}e`ð­ê|E<5X:•€äõ\èõÝÞ\òi+øηøVÉ«UØAļ×®›²ã}˜G× +¸Ù¹æ5‚ne¾ˆ0Çʃd*?÷IN†ßifD÷) µâÛÿxnÜBKÁõœÝx¬k3~¿=Ì-ZŒH·Ìp.*ňe‹Ïá™’Œµâïõ¥šÔ +ê­Q¬XM'L{.+‘LIÇ2rˆ¤~ÝMv¾ªÝ‹ñ¦¶ vD´6yù³1ê'Þ~ܸp›È-v‚p¶mÖ…õçÍöá%rJØõÏc9›¬HnËŸE494,LÍL¸‡üže¹Ge$üÉSï“‚"3 òHÒ¢¤`¦Ò„Ç:>‡p¢X]5ª†u·Vã‰?bKI‘c‰cKóå r2×™R{•nGjáæ°Õ“à [•T\•çšJ +Õƒ~…—ÓÝÞç%4¿eªü]ý6Ò¤eµøÀ>kBhs<æH*”Ø÷ÈEaMxX²)Mþƒ÷«¤ãa;¥%ð=;^LÒ!‰òǹ&ŒCmhv á^íÏ©Z}©mã~…<Ñ”–µ>™Ýx¾ÎÖ•"rá2‰Š„žhyŒÌëÊMÀrÿªEU.¡Î\I¶¸CvÉLS.Þ¦“éðÆUé8rHP|X˜©'•›]æÞ×tEo{­†‚ÓSŽ6ŒÞ0Ž7ëKß8Õâc¤«žŒ2ÓåJI‹£òKuÛ³‰ÌÒ™©Ád¢ãŸ­á•žiçxÚ¸l´½žrKÚöž\[¯ãX€u¤Nå‚ÁV/¾¨—‚¤—t•dÀï„Ms¾øÂ)!Ô̓Σcûú¢—'³|Os‹4Î ÙŸ˜VÃr˜ö$úUöS¶µÀ~èÅå8_Aøä|ϹáwÉNžÓò˜JOÈfÎ5Û1®.Ïj¡]&ª×kdJÂ"Jt¹3?Ûx³- Dð»Þ<_Nï¦Úx„ð% ùâ­uØ¿><àÎtV¤ÈÎ˜Ï üá]”)¢ÅˆC¯¹9dZö¬Õg„WÕÔ:ú‚Þ*˜@x$k}œBèœíµ®z "ŸZSâyš'6I"¦xzw ÎÐäaÙàwŠÎ´”:Bá#•)CqY³ÑøLyÛ©&Å +vÅw3]ªM }HOÞÏÓý¶'’í¯Ñ%%c?Ƭ%‰Z„:ÉN;÷²¸º‡ê|ÆJ£W첇ò»;ë»|nr#ö×UHLCêßþ¤¤Ï!)\¤ Â/Ãâ`†÷…B8@_dõ§oÂÂèõï?lËá"d§GúÆ2˜Ö?†OðÈe„O@`˜:@iBðN0^:b”8ò7˜ çŸKóÕºÍNçâ2˜®.5·ã°7YMˆ£¡ÃëüYTñÛ<Ã0ñxÈ£\ nº¡s1GÛ§-íáõýrV€KâDõ;ùä`.×Å_-Øf‡¶T7qû(±wh:ýÕm•}—'MYêb©UsenÌ"\ +ÑÜ&Â!$àž`FAÎ_8»iØ›tÿ<ðàëy¹x@þ\ÁͲþr»œÛÕ +MGJk•ó¤z4v½~㌷W¶fÁ€|¥ùôá…š6ñPâK63|ÛÙÛ˜ŒK“aLñÒa%hf/ò“(ìa¬tUyYègCØw:9h"ŸH!pNf(Í#εÂ?·û¢@lka…p}hOA­{û¾JöwÚÒÙ»Ž©BÖnv9^5YÊ$Õ‰~kà‘ùIªåMìö$®Âåkë¡\Ìk½šÜ6šÕ¤©D‹ÙUÜÕì„3|˜bŒµ‡êk¤–W!»1pmìû Y×ãÎ;€6'¬ ½³ä¼b[%ùZzí;ÎtooU`N$#²h‹d½³žÍsæ&!]PÖ¶å>Ô:÷)GÜ8³å†­ð^ÅATpÊuÄ·¨™Þ>¶ÈI^bC³þy›hÈUOÄ7ågí[ë/-¢ƒÄŸÅ~6F +ê¹óºã¡…);µÐÀÏ=%,ça< ¢d³x‘æeÅoQP«V±ùH‡þů(¤+´0#߇¡™¸êÉü(X´ÚcŽÇLøi3 +®±Kq–É«wcóë‘”šÞu o|ÙüîÍCNTFä[›ÈLÁ/ðDB33Ds76)IåøÍĹ”g¸~!Œç$ ‘âl¬½ò¢ŽÃŽ³‡Ëjº}dJfçs/J)W–6ÞX¦Š’!¼N·´1 +JœDŸÅKÆûmÐ>Þ2»M@#LµÖ<‚Ûýi•µ$ŠÔÌýÐZ–¨a¢C7¨ÑmÎTÎÿù©úÉ‹]ý“‘Õ0¡„žt{r®Èp˜‹¶ +e—CÑJ7hî²`›'Ì®;Äì’ÐV.ýÃÛR‰©óT:¢ØY}í`ãÕk¾I–ÓseII+PSËzs´2|¤ÉKòQ}{Á,ÜÆhKbŸ7lï’›‚t WY%ïSSáÖª22MYQÛªØæ"1΢ÐshJ ɦ‰iÁ­G¿iéd¬OÐ'±4E*Ó²µcáZ1ýÙ‰õ%|3àØ)“_/˜O¾]?a¨ž¶½ +E|ò¼Nÿ¦ÒA¡ØháàÙ€fÜ$×仜\K³]Ø:Àý”Ñ{õÓ«òâ¤ËÁ¡O=¹zÌ ·”±õí”8{ÿÈän,=ê¶óÁ¿ä) ¦ªÿ_úO@œ÷ŸQòq¥B#HŠ¦l ò2MärzäPi[²:øåNá_„J>»¼E¼ºà=¶b õ@ãÑû•âOÒú¼½IHK”¶§ÝkrñTêÂiŠ²öÚ¸cŸé øÏ¥GŸbø½ ¯øþ°Y…Q- ¸Í¿¥«cÕ¹3(%B­0@jÀØ-Bd[¬íÈÝk¦ ®·”5وΖ£Ñ"$Êk׋Gé4àÇ* Fµ&(—0›Æ$'î:ŠÃÎ|íS:L\ƒ0ZiQµ_¡,GZ© ?ÓbŒ=2þž×Z|߸iˆnÏc_Râ1Ó—hãÅ\0ë† C°Çµ5Û=Ãx’ÿ“OHú4¤q›9‘Øs¥-î3åä,¹“7F‹˜Z!jóë`Û7)ˆe¢BI¨œ‡—¼Ožë³k¨Ê¾ÉµõlÒ#EMÓ†÷f̈mgÀ­ø¡´‰ÏqÆ~Ôm…–E+5æeÿ¥ÌÍܬš…2þk’-{Ös!è6¢Û¼;Ðà‰‹îq³R"­§´SIOK(Ïü±'úSâ¹nîú7óq$âG<:µ@¢ìÊJI1ÖM›Cã(ʯÉûd“Ã:½Õ¹‘¢šŒ„—~»;uar¢Q¿{ñ®Y]FÜ ö9¯PG¹-¼ÕðÒ¾¹Ü&ú2hØhY¥œþxÿM§ñ5§‚¿¢ƒ‡šFÄÕÂÚQíéû]’zÁ6('÷œ4»€Ž•‡Š-ƒ¯#ö£ \VØ |ö`óZQŠÕÓñÓeÙÜ«èèÕÕ·OËß8uaf=P€k¥Œ3NҪϘñeÈšñ>´Ï‡31–-çZœ%=:«RÅÓ²À'”\¾Û¦L„š6ùxäQtJ}ãvf’ßÉa}hÒG@æ8¤ëÊœ +˜":„ ó\i0ìj×Ô]ÝçÇ2Ô H™8;Ï\·sXâteÜÉ!iï|ûºÓ~|dÍ"_@ûgT/¹:¨&ž=íèõlOcÿ;Ë^-7½#öˆh +öR.ÃÄLE4gš³Ù ä½(^#=õ4VÈN•„œçHæãÚ3T˜R&ͽ¶b÷y«‹ËZ[~ünkœ¶êÍš÷98õÛI–$n±‘?F݉·lŸ¥ï8U™~WôÍšîϧ5þ\ŠDåî®;ØVgÚ}Ž††ï^Žp€¿Ê„Æ­cÛ]ØÖ†€UûÃ\Ëb«žšÅ]Ü“3— žhÀj`lAa#jJ¶òjªš#;¶.ßÆ£H>>·©©aw•î7‰b…ÃÞÒ—ysŽõW¾{ß8wkIB¸¡’(ÞyDäUˆ‚:å ÃÖœºg{?yýÈ`¨ñ5,H³6dÉÀµ²rýÏQå/3äP;lºåðbTS±“Z+ºV®„0HjEÓü EË°ÆH#rÅÎV¹/©\Dú'ÍxëDY;N+l¼Ëµ^¾·j,l°GzEZ“ušÃª²…—-^CÄ?ß&|Ü9RÑКêÏi4eO¿n ]?ë¥ø·Ùs\'™06f¾{9U߸0R™Üæ;ÇÓû$“ÈRÁXè1DmáüXIà +“`ào¬ÉkAeÑ*¾«àf¡íð0à fvÜбْË?Á&é}–“âÃÕ©É„%œ‰…3c¡»'¦L2¤dE úNͲ‚¶Q¥E˜Q'£¹Ý­®‹ω¸±ð¾`úÊ»R¿o3@0f¤÷¼ô +ªŠñvv™l­V\ãÀÙ•o> endobj +360 0 obj << +/Length1 1199 +/Length2 4726 +/Length3 0 +/Length 5495 +/Filter /FlateDecode +>> +stream +xÚmsu\”kó>JH#)‚KïÒ- ©t‡(ËòÀ.± ìÒ)-‡VB@iŽt§”„H*H¸„t(!!ð]=ïyÏï=??ÏÏ}Ï5sÍÌ5sssê )Û¡mu4 ++†È‚t‘.¶#J[ÈpðÐÂÂœAx@FÎÍmŒÄ:¿uÁƒw܉F©Â°xc„Hæ…€ Yˆ´¬8†ˆýíˆv—é»#]о } ¸;#QxH +÷pPX#WWg$`g`Ðîp# ²ÇWøûÌ ;hWw¤ ›šñ þcÊÈÈ€l}þF@ªé€ñàž€3Úõg6<…€Üñ…ÛýôÕ·‡©Ù!±?ÛX¬«¬ˆˆ«= ÀÛ„1öÂ(+‡/V +ewíò“CþS?U¤;Ç7æ#ò; +Ph/”ßo!{$ÊîW{v®"&(¤› ¥úŸ¼‰ü›€I@D!2ià¼á‘Ÿ©}\_ ô§†² ðsE»‚ìaÎ iàä~˜'º{~ÿ/ð¿7r(d‡„cA¶€~$ÿ°ãÍ€ý_wÖé +²‚C Päç÷ß“5~¸vh”³Ï?îº0$¢i`®b`*ð»þÿë©¢‚ÆÓ +A¥¤AB¢Òâ (ߧŒ„Ø¿Yÿ«ÇßZü²êÃÿ©ò¥Ê +’ù«%¼–·å ¸cð» +ÿZm>Ðÿò뢱H8ÿ³F÷!üáÐß®×ÿà¿]²çP÷pvþ¥ ø/I@xM0 mÐOUœñç§2HøÿsA:ûü&îߎfÀ_â?tÿ†ÿbWF98 !¨è_F$Fé +Øé#±pÄ_»ó·Üv¿( Æ >q|ˆô_˜1 wB ~(¿ e÷¯¤j(8Ú‰rañ+ +s·û¯á' ÷pwÇëôkRøØ¿ïöH|‰à +Àɧ&Ðp¹0Çê°–£JeV/¡åa±.I“à qòXçK‹Â—;u™ŠXÅs¤“Ÿ«ê Ë­u/E$°ªÅJy9ɨ´ +_¡£§»¬ù˜eS¸F^W–r—üþ+¤‹%1†95kíŽÏÍÎ’C nÅ;CtFhÆ G–+«nz$¬ì%yedz«|2L'!ÛzšÎ²$c}mªÇÈTŠ»íõ#Ǽw-)ê7¿Ó—µÒÙŒOt«PIEhc«wmY-Š¤dÛ†ÚEOůìO*û\ó$îŠY»Î¾«1Çî„´©yÚÙAE7ÕÚĨôÅ179³VWÄ‘J€ª„¼ò‰Jª°¨QjEÁýæ öýÔ,7v%GÎçƒêoãßÞÂ4šj4Ùn³DÝîÌÅm˜ßСä> k·0bXçA›SH¾*jAÇÉß” +ÀÝX©Ã ¾\LñÃ4t$ŸN×D’<¦²ã¨®}Öñ6Ý÷skØ9ýÄã + HUÉ} +“ÃPÓÎð­I+yòsÖ„Kfü›”’IÉñAŠL3”B$ͯó×…ËiEbeÏ-RDZámãž°ˆœîN} +)æeÿ\Sé©]Cjï ™b‡‰V÷ÏO2+›­!{Š/FUÿTç)1‰N}‚¨üªe£¯û²~!qåÑÁ¬küZÝTf§O‚À×õ°ûo6û0ÓL=Ÿ7· rø«ÖTÑ^•?·17_»Ý’¯´aî~·ªþµ7³ŸˆéK­zéÐ +âü¤ì©ôUdZ~ÛäSàô©°yâÀhÞo’—¹7òâ&³˜‡ Û$Õ¾[¾¢ÈèTÏ>˜W2£!=•xV’ÏVN·y» +‡ +í£Œgtæ&|ØD÷X“[„™¼©ß¾w¼’ÃŲ~Ów•ïµEç¡W_ñ.ò™²Ä(–õÓa­ª°¸UúºN7IÑQ¬ìÓ%s^Ëý@r³‹qèw°ä¶–hT¤˜’mÁìô{Bm5m-½ùÚŠ¬z3Šn¿ ú~>ÛÄŸrêLkHë$7›W?¶ •ÄßÔkîñ­OÏkõÚ~ÿP9g º"숃íÏi¤®>/Žÿ¸½êbIM@mÖ@ËEŽÌ’ÞþÒ*è8SòÎ7ýÁÌK(Sß}Êõ¥+b™, À:úcA´º³-dÀ2><4ùyµ›‘MZ°Jä4ÙÈÀf X|u4š}æ”Ó<ʺdÌ€òÚîK·çÏîªK¥“Ð\O^ÖýZá¤À¥¾¡ßUö^A®T9÷^ϬvXWDžð;‡Îõ#ÉæàR¥ÙÂi"/Fz Ê©(šêé´f'Û­Œêèó•Œ16¯5Ó;Ko¼k÷"Œ]¥‰Žð`x*J¤EXÄU—¤gÔ|ër˜B3<¨uÒ²âµo\%®H?ž&Î<¬x7ô’ls*s?µëCp¹Ç–`§qcz³*œh»¸3¸Hû¸L™¶Þ|=U®.e»–-¨¸¢Éªs8ÎÓºý"ʾÇ4v„¼ÑÛ(/Sf8 3ÞGf•.üP¬ÒØ9˜E7:b0 ÷Þ¨!ô«´" YâËvˆ <ºO¡/¯ª.ž­ h~]mX]ňá³À]8g=™WôÇTÒÜu´õÊq±¾z4¶ñHúÀjüt5¶ zè¹ÛË:¶àÛ›+-?*u<;µÛ•–²òáuS&/íN-½?I7Öx­[`WóJ‹%PÕÇ.á£Dy§z +˸ã¨rêù`{ržÚ½´Üp¿vÉM´fsW’ý=Øá=S²€<ÚšGd1hNe2q2¶'<³ã/ á‹]¢N(Ÿ—¹ß£í!ºJ©WFFý)’1ýÇÓ‚¥ŠÅPÔ½„(=“pm)»o¤;½;¤O_óîÙÛÊ£„uÑÒG +3ÒBÚ3dAÕª˜ÈHH|‚ã9¬(Ç|ýG²9 *g@Ñ6Xf~PYKØcÛyÖÕ0Œ"¢K•Dö(]8š•˜€XÚ¡¾,\ñ&ËŸ@ÉÛçf#¹Šnöøµ“y›­á¤âÔÌ‘¯ØjõÚo]+™Þs&S&cB „ºjŒ Œy÷ýˆî8.ã„.ßL×z¨ŒÁüØPPí¢±Ÿlßø2m%Þr˜;6ÍD«I·:…,{x†˜–«'n£+Xb àJ> +Ì¿(\#1ت8áß×ý–‚An‰-¥îˆ‘vÓV*‘|¼·[`ú _.ý†©Üø&»…"Arü›CaKIÁòñ€K?äíP7qoDä+:1Ô¤ð;g)w5õ’›RãåX\ÀÝ)¦£;¼Å z°/R!ËshÆÔÔ¥ãÊJÓ±“ÓBÙ›ò[ÉVˆXEHÌ[†"·`!‡G{E-÷öpºW×eçzEtûùÓ +>|âY‘7X<Á¨]Ô‹'?fz“øý¦¥ü²òGtzOhz2 ~%pÞDÿ&í™C×I©”u‰5X"Í•[Z8aþ3}¾KöK-$K•ù”KØŠ!¥Ô~~T³iÍÊ-ÚPé"dåÛ4²Ç-í'äK¥E^´®DöXD¡˜ÛÐ;6;Æ͵I›ŠŠà5(•íÅ1¢AZ£8ï¦KYT»œ”NþÃÿ)Ï(.ôäÔ ö†8@B"bÝjû”KÅý'ÌAû„í''ñé[’žÍ ’'F ãbYúôM©|Ý.ç‹Ú¦E¶ë»kŽ~ñzŸˆH雧– ÷h“ʳˆ4¦ùËÉy«8/ÇP'¶lÌE¶ÉÈå݉—ï®[H(Z“yT‡®q^]ˆ~Xó‚3üUv˜iO1šU@ƒAR…¢ØuÃUMaXr«î¢ÅŸ®Ã´ôQ’\±P*¯­Ò:/" +ÊsÕt+YA:(êúB¢H“Ž¥RñŠîi†˜S—~½£Y!ͱ~ÈÙ7QûÑK­¿Ÿ{ñFyf‡_’³ƒÞ®o¼ŽÌ­ž„Ú3’͈üES®ÅKWo}2ã¦:#i +™Ê·#«>G­'xO‡0kàzXô Š +Žî­$ËyFœÏw®w¢"„}íéÏ”W“ôïxwÏ©ÔO°Ñ Z[ð.¾7"yËw/Ä_ò³µèG›ö-ci¡TÝŠêqÎŒE¯¥AMõRBbà›Í¬LϹÆÊDÿ"øH§ [ë±lSô•ƒôI“˜v +÷åÜ»‹ütucêªéâO¯Ync¢’ò{×í87$ÃG¦ºMeß<0ñèKúƒ@ôG4 ;ipøqbíŸæ6âZ_Þ1)‰ÖÖ_´«ÿHÏ8‰JL§{ô'aIUš<¸I‰cw‰BE^¹îò¥. Äo†J_<þØw-UׇõkŽ³O›õ»$Ë°’Ïo'1”‘?>ªˆh +Qúa7 qG¾Rúúô)Á«Þ˜¨åDÐrO=ˆÂMê5v”!3e¡Òáµ+«çcÅ#Þñ>«ÜV;+py`ë’ö¥&-´¤mªwpÄJ£$;̉q0Q‡‰±èÛ-“’L³n‘èïüáÇqôŸ8TLfcÍò¼A~‘[þuiŸo;8ÒÝo`ÞÞŸªïÛ ZP2äšêÝ>Ü~óhÌwŠ9Ã0lÊXìüná§;¹TŽy_ÎŽ;cvëÁk%6ÍÍ“æ¯ +øs.Ñ죜Šº¯Eðšq.òKËe¶,@¥­\*H‰¦sØ?eÉœ§ô¯Ž°jÆÎDií5Vöäæ4›½ éP'Bs-¨VÐÍ$†-¦o¾Vïé_½Û ³¬å’â—q$ž»™#Í<Óþƒ³×ÑíiõC6ã±M¹ŸUž´³^·OK¨J¸ýƒ…Çùyi£ù—$ö›ÑS*<ÕkRdôkÄŠF®¯[ †¨¼×'63OärGÊòHùªžrë’w§p¨è¨0[¾õkÕÞ:°¦‰JƒçøZ•_®xH ;èÕªâŽUeÓwvC[MU=z¹{G2‹ñ\dB¼I$€q͸ª¯‹²»ì…Ó¸·ié¢5G£¥­[˜ +zŒ?eæäJYõóœ?½ÿl¦†ïž'¯i/oUÔcÃ?ù‰•;Cšç¬­åí‚ïõ3 +¯l™fÑ @qùåŠL]ófÚuïy«HV®}âUf}D9aiüaäV¯óY†ØuJU®Ó¾9×1ÓV€Ù³uÄž=÷[(ÉʘH¬…úº˜­»Ü¸G?N·îì‘Õ=6– ;‹š[~çÓ•ÓÞûô»æÉíÏ‚5r§®î•5ÛšKg»Ù&íç¸ +Ú¨ï—NÚj›5;¦4ü§ˆjÊ’_R͈¾‹ (T34û²aÉõÂe8û(k_vÛw¤™hÍdl¶Š,þsâDJNÓÇ- +’þwÑ Æq*AÕʤÃ^ÔØYîÊ$”H¼¼†N¡¦|¦³âcQΰ˹È28@3Åä–*^iæ†hoYÉ`’–¥ÖÅ6Þ`ƒjAàoÇð +qÓÆIÚ&Åà¢ðÑ +AøêhÌ&ÁÒ®Qy@j†› låQÚ¤, +ÕH‰3Zuí?IQyæÄPï°ŸMo8]ä°\ |@¨t!Êyt àPnªp–lÊz^Ã:ú'm}w>ñÚA!§¤.àÝ>¬øH ÈS¡àÌ«NÌõzÞmé4 +OÎ6T6œ[8Á‘ÍX¬ ¸ +:wÕ>Ó¼¹é šhqkáÕ_µhñË—¥óª»=¬?j_ØL#²î‘+¦]·çüNpSsÖÄKM·¹5ô¥/å}üÃݸ.>*Çä‘ ‹Ù áÜÅQå ”’_æÆ[‡ŽuJÌn^†h‰ÅŸ*{e,AöORÏXlHóÓö~‘Ï怹ŽÓÌv]ÅOË´ê¹[q~½ß‰‰ø‘}¹Î¹ïÍW,pvHT™ŽÔ +³q¶Ä@ ÿÎÙ™·û‹)_¥–þ»ÓZ“Ž(ª+KþÈC¶ü%ù,8ÿ7Y›ŽW®ö… ›)?¼Ï‹9¦$nµ˜0a=$¾j¤ãn³° +ó©>#²¦Nk4ôÏyZµâf~Š¬˜†S0"×oJD==ù¤w0lÅõÀ™(;ûƒgxƒ!.9‘Ç]ãÛ¹õ5ÅêÎlլش»-†ÓhÚéV#=MÏø‚ˆ?æ üµüPôóq0øYU/]¿ÞzÉKU³k%ûlz×E9DZN 9”òöp -ûž$\Úþ²©*GbÄ<À 7•¨Ê°íþò²‘/m_ãQ®ï·rÚåÂB /bàp±nw秥äÖ†q¤žW}üžaÕ·:Í +ZõÙoe¾üThºù©ÆÝMßk1):Ûþbד®@¢›iß­50D-ØäýÑÇz{vµüž°)|TîýÔŸ-Ò +ËLY¯² ¥b¬z £Û²ÂÊjÄø=>wù¾å +|%óùß{€¥ñÅ ¸ãÈkâÙ©×€M]¾¢e¥Ÿ}L^…nkÎ>é„Ãߧ­4+<³z´µæ +ä>þ1ó@§áø@_çzÈ:µýMƈS¥´÷žÑ, Ü°øž!ûµ3Ò´ˆ$DíbÖ”—%蛂W—X¿)û×MEÓ®Jó8ÁÃx3ÄëjŸ×eÆ ?Œæ®ĪCqöÌùÆò1’çYu‚‰nm6„¯Ÿ]®#™Ýù?H?Æ +endstream +endobj +361 0 obj << +/Type /FontDescriptor +/FontName /HQXBQV+NimbusSanL-ReguItal +/Flags 4 +/FontBBox [-178 -284 1108 953] +/Ascent 712 +/CapHeight 712 +/Descent -213 +/ItalicAngle -12 +/StemV 88 +/XHeight 523 +/CharSet (/B/N/S/T/a/c/d/e/f/h/hyphen/i/l/m/n/o/p/r/s/t/u/w/x/y) +/FontFile 360 0 R +>> endobj +290 0 obj << +/Type /Encoding +/Differences [1/dotaccent/fi/fl 34/quotedbl/numbersign 39/quoteright/parenleft/parenright 43/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon 61/equal 64/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 91/bracketleft 93/bracketright 95/underscore 97/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 147/quotedblleft/quotedblright/bullet 151/emdash 169/copyright 174/registered 183/periodcentered] +>> endobj +210 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /JCPDOW+CMMI10 +/FontDescriptor 353 0 R +/FirstChar 15 +/LastChar 15 +/Widths 275 0 R +>> endobj +211 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /GSKNIF+CMSY10 +/FontDescriptor 355 0 R +/FirstChar 102 +/LastChar 103 +/Widths 274 0 R +>> endobj +85 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /SVEOTL+NimbusSanL-Bold +/FontDescriptor 357 0 R +/FirstChar 2 +/LastChar 122 +/Widths 350 0 R +/Encoding 290 0 R +>> endobj +59 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /HHXMFQ+NimbusSanL-Regu +/FontDescriptor 359 0 R +/FirstChar 1 +/LastChar 183 +/Widths 351 0 R +/Encoding 290 0 R +>> endobj +143 0 obj << +/Type /Font +/Subtype /Type1 +/BaseFont /HQXBQV+NimbusSanL-ReguItal +/FontDescriptor 361 0 R +/FirstChar 45 +/LastChar 121 +/Widths 291 0 R +/Encoding 290 0 R +>> endobj +62 0 obj << +/Type /Pages +/Count 6 +/Parent 362 0 R +/Kids [54 0 R 82 0 R 107 0 R 140 0 R 155 0 R 180 0 R] +>> endobj +195 0 obj << +/Type /Pages +/Count 6 +/Parent 362 0 R +/Kids [192 0 R 207 0 R 223 0 R 233 0 R 244 0 R 267 0 R] +>> endobj +362 0 obj << +/Type /Pages +/Count 12 +/Kids [62 0 R 195 0 R] +>> endobj +363 0 obj << +/Type /Outlines +/First 7 0 R +/Last 51 0 R +/Count 7 +>> endobj +51 0 obj << +/Title 52 0 R +/A 49 0 R +/Parent 363 0 R +/Prev 47 0 R +>> endobj +47 0 obj << +/Title 48 0 R +/A 45 0 R +/Parent 363 0 R +/Prev 39 0 R +/Next 51 0 R +>> endobj +43 0 obj << +/Title 44 0 R +/A 41 0 R +/Parent 39 0 R +>> endobj +39 0 obj << +/Title 40 0 R +/A 37 0 R +/Parent 363 0 R +/Prev 31 0 R +/Next 47 0 R +/First 43 0 R +/Last 43 0 R +/Count -1 +>> endobj +35 0 obj << +/Title 36 0 R +/A 33 0 R +/Parent 31 0 R +>> endobj +31 0 obj << +/Title 32 0 R +/A 29 0 R +/Parent 363 0 R +/Prev 23 0 R +/Next 39 0 R +/First 35 0 R +/Last 35 0 R +/Count -1 +>> endobj +27 0 obj << +/Title 28 0 R +/A 25 0 R +/Parent 23 0 R +>> endobj +23 0 obj << +/Title 24 0 R +/A 21 0 R +/Parent 363 0 R +/Prev 11 0 R +/Next 31 0 R +/First 27 0 R +/Last 27 0 R +/Count -1 +>> endobj +19 0 obj << +/Title 20 0 R +/A 17 0 R +/Parent 11 0 R +/Prev 15 0 R +>> endobj +15 0 obj << +/Title 16 0 R +/A 13 0 R +/Parent 11 0 R +/Next 19 0 R +>> endobj +11 0 obj << +/Title 12 0 R +/A 9 0 R +/Parent 363 0 R +/Prev 7 0 R +/Next 23 0 R +/First 15 0 R +/Last 19 0 R +/Count -2 +>> endobj +7 0 obj << +/Title 8 0 R +/A 5 0 R +/Parent 363 0 R +/Next 11 0 R +>> endobj +364 0 obj << +/Names [(Doc-Start) 61 0 R (acn:AES) 112 0 R (acn:ECB) 115 0 R (acn:FSM) 183 0 R (acn:LSB) 121 0 R (acn:MSB) 120 0 R] +/Limits [(Doc-Start) (acn:MSB)] +>> endobj +365 0 obj << +/Names [(acn:NIST) 113 0 R (acn:SoC) 118 0 R (cite.Altera:01007) 215 0 R (cite.Altera:Avalon) 119 0 R (cite.NIST:Fips197) 114 0 R (cite.OC:WBspec) 117 0 R] +/Limits [(acn:NIST) (cite.OC:WBspec)] +>> endobj +366 0 obj << +/Names [(cite.Wiki:AvWb) 116 0 R (cite.Xilinx:wp284) 214 0 R (equation.1) 212 0 R (figure.1) 184 0 R (glo:Bit) 249 0 R (glo:Byte) 250 0 R] +/Limits [(cite.Wiki:AvWb) (glo:Byte)] +>> endobj +367 0 obj << +/Names [(glo:Master) 251 0 R (glo:Slave) 253 0 R (glo:Switch\040fabric) 254 0 R (glo:memory\040mapped) 252 0 R (page.1) 60 0 R (page.10) 235 0 R] +/Limits [(glo:Master) (page.10)] +>> endobj +368 0 obj << +/Names [(page.11) 246 0 R (page.12) 87 0 R (page.2) 84 0 R (page.3) 109 0 R (page.4) 142 0 R (page.5) 157 0 R] +/Limits [(page.11) (page.5)] +>> endobj +369 0 obj << +/Names [(page.6) 182 0 R (page.7) 194 0 R (page.8) 209 0 R (page.9) 225 0 R (section*.1) 86 0 R (section*.2) 247 0 R] +/Limits [(page.6) (section*.2)] +>> endobj +370 0 obj << +/Names [(section*.3) 248 0 R (section*.4) 269 0 R (section*.5) 273 0 R (section.1) 6 0 R (section.2) 10 0 R (section.3) 22 0 R] +/Limits [(section*.3) (section.3)] +>> endobj +371 0 obj << +/Names [(section.4) 30 0 R (section.5) 38 0 R (section.6) 46 0 R (section.7) 50 0 R (subsection.2.1) 14 0 R (subsection.2.2) 18 0 R] +/Limits [(section.4) (subsection.2.2)] +>> endobj +372 0 obj << +/Names [(subsection.3.1) 26 0 R (subsection.4.1) 34 0 R (subsection.5.1) 42 0 R (table.1) 111 0 R (table.2) 144 0 R (table.3) 158 0 R] +/Limits [(subsection.3.1) (table.3)] +>> endobj +373 0 obj << +/Names [(table.4) 159 0 R (table.5) 213 0 R] +/Limits [(table.4) (table.5)] +>> endobj +374 0 obj << +/Kids [364 0 R 365 0 R 366 0 R 367 0 R 368 0 R 369 0 R] +/Limits [(Doc-Start) (section*.2)] +>> endobj +375 0 obj << +/Kids [370 0 R 371 0 R 372 0 R 373 0 R] +/Limits [(section*.3) (table.5)] +>> endobj +376 0 obj << +/Kids [374 0 R 375 0 R] +/Limits [(Doc-Start) (table.5)] +>> endobj +377 0 obj << +/Dests 376 0 R +>> endobj +378 0 obj << +/Type /Catalog +/Pages 362 0 R +/Outlines 363 0 R +/Names 377 0 R +/PageMode/UseOutlines +/OpenAction 53 0 R +>> endobj +379 0 obj << +/Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.3)/Keywords() +/CreationDate (D:20090521115729+02'00') +/ModDate (D:20090521115729+02'00') +/Trapped /False +/PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6) +>> endobj +xref +0 380 +0000000001 65535 f +0000000002 00000 f +0000000003 00000 f +0000000004 00000 f +0000000075 00000 f +0000000015 00000 n +0000025136 00000 n +0000169633 00000 n +0000000060 00000 n +0000000090 00000 n +0000025195 00000 n +0000169510 00000 n +0000000135 00000 n +0000000163 00000 n +0000025255 00000 n +0000169436 00000 n +0000000214 00000 n +0000000255 00000 n +0000025376 00000 n +0000169362 00000 n +0000000306 00000 n +0000000332 00000 n +0000030244 00000 n +0000169237 00000 n +0000000378 00000 n +0000000407 00000 n +0000034925 00000 n +0000169176 00000 n +0000000458 00000 n +0000000493 00000 n +0000041417 00000 n +0000169051 00000 n +0000000539 00000 n +0000000575 00000 n +0000041477 00000 n +0000168990 00000 n +0000000626 00000 n +0000000664 00000 n +0000041537 00000 n +0000168865 00000 n +0000000710 00000 n +0000000759 00000 n +0000096001 00000 n +0000168804 00000 n +0000000810 00000 n +0000000859 00000 n +0000098555 00000 n +0000168716 00000 n +0000000905 00000 n +0000000950 00000 n +0000102089 00000 n +0000168641 00000 n +0000000996 00000 n +0000001036 00000 n +0000001716 00000 n +0000001831 00000 n +0000004385 00000 n +0000015569 00000 n +0000001086 00000 n +0000167923 00000 n +0000015451 00000 n +0000015510 00000 n +0000168267 00000 n +0000017403 00000 n +0000017553 00000 n +0000017702 00000 n +0000017856 00000 n +0000018011 00000 n +0000018161 00000 n +0000018315 00000 n +0000018465 00000 n +0000018620 00000 n +0000018769 00000 n +0000018923 00000 n +0000019073 00000 n +0000000077 00000 f +0000016956 00000 n +0000000079 00000 f +0000017105 00000 n +0000000100 00000 f +0000017254 00000 n +0000019338 00000 n +0000016724 00000 n +0000015686 00000 n +0000019221 00000 n +0000167754 00000 n +0000019280 00000 n +0000110235 00000 n +0000023249 00000 n +0000023398 00000 n +0000023548 00000 n +0000023707 00000 n +0000023854 00000 n +0000024010 00000 n +0000024166 00000 n +0000024315 00000 n +0000024463 00000 n +0000024623 00000 n +0000024777 00000 n +0000024926 00000 n +0000000102 00000 f +0000022799 00000 n +0000000104 00000 f +0000022949 00000 n +0000000122 00000 f +0000023099 00000 n +0000025436 00000 n +0000022561 00000 n +0000019455 00000 n +0000025075 00000 n +0000129607 00000 n +0000025315 00000 n +0000104527 00000 n +0000104831 00000 n +0000110355 00000 n +0000104588 00000 n +0000110416 00000 n +0000110477 00000 n +0000104892 00000 n +0000110538 00000 n +0000104770 00000 n +0000104709 00000 n +0000000123 00000 f +0000000124 00000 f +0000000125 00000 f +0000000130 00000 f +0000029505 00000 n +0000029656 00000 n +0000029812 00000 n +0000029969 00000 n +0000000131 00000 f +0000000133 00000 f +0000034491 00000 n +0000000135 00000 f +0000029055 00000 n +0000000137 00000 f +0000029205 00000 n +0000000148 00000 f +0000029355 00000 n +0000030304 00000 n +0000028869 00000 n +0000025568 00000 n +0000030121 00000 n +0000168092 00000 n +0000030182 00000 n +0000113690 00000 n +0000034648 00000 n +0000039486 00000 n +0000000150 00000 f +0000034041 00000 n +0000000152 00000 f +0000034191 00000 n +0000000173 00000 f +0000034341 00000 n +0000035047 00000 n +0000033871 00000 n +0000030464 00000 n +0000034802 00000 n +0000034863 00000 n +0000034985 00000 n +0000039643 00000 n +0000039792 00000 n +0000039943 00000 n +0000040098 00000 n +0000040255 00000 n +0000043120 00000 n +0000040414 00000 n +0000040571 00000 n +0000040727 00000 n +0000040884 00000 n +0000041041 00000 n +0000041198 00000 n +0000090836 00000 n +0000000175 00000 f +0000039036 00000 n +0000000177 00000 f +0000039186 00000 n +0000000185 00000 f +0000039336 00000 n +0000041597 00000 n +0000038786 00000 n +0000035207 00000 n +0000041356 00000 n +0000104649 00000 n +0000091049 00000 n +0000000187 00000 f +0000090386 00000 n +0000000189 00000 f +0000090536 00000 n +0000000200 00000 f +0000090686 00000 n +0000091111 00000 n +0000042957 00000 n +0000041729 00000 n +0000090988 00000 n +0000168381 00000 n +0000095413 00000 n +0000095566 00000 n +0000095722 00000 n +0000098337 00000 n +0000000202 00000 f +0000094963 00000 n +0000000204 00000 f +0000095113 00000 n +0000000216 00000 f +0000095263 00000 n +0000096123 00000 n +0000094784 00000 n +0000091252 00000 n +0000095878 00000 n +0000167466 00000 n +0000167609 00000 n +0000095939 00000 n +0000096061 00000 n +0000110599 00000 n +0000110660 00000 n +0000000218 00000 f +0000097887 00000 n +0000000220 00000 f +0000098037 00000 n +0000000226 00000 f +0000098187 00000 n +0000098615 00000 n +0000097724 00000 n +0000096281 00000 n +0000098494 00000 n +0000000228 00000 f +0000101578 00000 n +0000000230 00000 f +0000101728 00000 n +0000000237 00000 f +0000101878 00000 n +0000102149 00000 n +0000101423 00000 n +0000098761 00000 n +0000102028 00000 n +0000108387 00000 n +0000000239 00000 f +0000103955 00000 n +0000000241 00000 f +0000104105 00000 n +0000000260 00000 f +0000104255 00000 n +0000105379 00000 n +0000103800 00000 n +0000102267 00000 n +0000104405 00000 n +0000104466 00000 n +0000104953 00000 n +0000105014 00000 n +0000105074 00000 n +0000105135 00000 n +0000105196 00000 n +0000105257 00000 n +0000105318 00000 n +0000108594 00000 n +0000109016 00000 n +0000109407 00000 n +0000109614 00000 n +0000110040 00000 n +0000000262 00000 f +0000107937 00000 n +0000000264 00000 f +0000108087 00000 n +0000000000 00000 f +0000108237 00000 n +0000110782 00000 n +0000107710 00000 n +0000105497 00000 n +0000110295 00000 n +0000108806 00000 n +0000109212 00000 n +0000109828 00000 n +0000110721 00000 n +0000110900 00000 n +0000110927 00000 n +0000110952 00000 n +0000111227 00000 n +0000111481 00000 n +0000111710 00000 n +0000111974 00000 n +0000112236 00000 n +0000112508 00000 n +0000112767 00000 n +0000112982 00000 n +0000113218 00000 n +0000113441 00000 n +0000113940 00000 n +0000114110 00000 n +0000114324 00000 n +0000166974 00000 n +0000114496 00000 n +0000114824 00000 n +0000115011 00000 n +0000115188 00000 n +0000115431 00000 n +0000115623 00000 n +0000115806 00000 n +0000116077 00000 n +0000116388 00000 n +0000116666 00000 n +0000116896 00000 n +0000117207 00000 n +0000117402 00000 n +0000117588 00000 n +0000117900 00000 n +0000118107 00000 n +0000118387 00000 n +0000118652 00000 n +0000118915 00000 n +0000119213 00000 n +0000119512 00000 n +0000119843 00000 n +0000120051 00000 n +0000120306 00000 n +0000120584 00000 n +0000120866 00000 n +0000121167 00000 n +0000121454 00000 n +0000121740 00000 n +0000122041 00000 n +0000122338 00000 n +0000122694 00000 n +0000122912 00000 n +0000123210 00000 n +0000123414 00000 n +0000123656 00000 n +0000123896 00000 n +0000124175 00000 n +0000124477 00000 n +0000124787 00000 n +0000125040 00000 n +0000125339 00000 n +0000125580 00000 n +0000125820 00000 n +0000126075 00000 n +0000126351 00000 n +0000126638 00000 n +0000126956 00000 n +0000127255 00000 n +0000127479 00000 n +0000127792 00000 n +0000128112 00000 n +0000128389 00000 n +0000128687 00000 n +0000129026 00000 n +0000129294 00000 n +0000129854 00000 n +0000130248 00000 n +0000130718 00000 n +0000131475 00000 n +0000131950 00000 n +0000132655 00000 n +0000134362 00000 n +0000134591 00000 n +0000136135 00000 n +0000136376 00000 n +0000147941 00000 n +0000148339 00000 n +0000160455 00000 n +0000161072 00000 n +0000166687 00000 n +0000168498 00000 n +0000168567 00000 n +0000169705 00000 n +0000169878 00000 n +0000170095 00000 n +0000170295 00000 n +0000170497 00000 n +0000170660 00000 n +0000170833 00000 n +0000171019 00000 n +0000171214 00000 n +0000171409 00000 n +0000171507 00000 n +0000171621 00000 n +0000171717 00000 n +0000171796 00000 n +0000171834 00000 n +0000171961 00000 n +trailer +<< /Size 380 +/Root 378 0 R +/Info 379 0 R +/ID [<110B65E26CADB3746553EE224533D7EF> <110B65E26CADB3746553EE224533D7EF>] >> +startxref +172292 +%%EOF
doc/avs_aes.pdf Property changes : Added: svn:executable Index: License_and_Liability =================================================================== --- License_and_Liability (nonexistent) +++ License_and_Liability (revision 2) @@ -0,0 +1,36 @@ +License and Liability +The “AES 128/192/256 (ECB) Avalon® -MM Slave†component, all its subcomponents and docu- +mentation (like this document you are reading) are published under following license: + +Copyright (c) 2009, Thomas Ruschival - All rights reserved. + +Redistribution and use in source and binary forms, with or without modiï¬cation, are permitted +provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions +and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this list of con- +ditions and the following disclaimer in the documentation and/or other materials provided +with the distribution. + +Neither the name of the organization nor the names of its contributors may be used to +endorse or promote products derived from this software without speciï¬c prior written per- +mission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + +Note: The term “SOFTWARE†in the above licence applies in this case not only to software as +executable code but also to documentation, hardware description or compiled netlists for actual +target hardware. As Chips generally don’t just reproduce “the above copyright notice, this list +of conditions and the following disclaimer in the documentation and/or other materials provided +with the distribution†the datasheet of the product must also contain it. + +Altera, CycloneII, StratixII, QuartusII and Avalon are registered trademarks of the Altera Corporation 101 Innovation Drive, San Jose CA USA +Xilinx, Spartan3A and Virtex5 are registered trademarks of Xilinx Inc. 2100 Logic Drive, San +Jose CA USA + + + Index: hdl/aes_ecb/keygenerate.vhd =================================================================== --- hdl/aes_ecb/keygenerate.vhd (nonexistent) +++ hdl/aes_ecb/keygenerate.vhd (revision 2) @@ -0,0 +1,212 @@ +-------------------------------------------------------------------------------- +-- This file is part of the project MYPROJECTNAME +-- see: MYPROJECTURL +-- +-- description: - THIS COMPONENT IS OBSOLETE!!! +-- Generates all roundkeys for the AES algorithm. in each round on key is used +-- to XOR with the round data, e.g. the state. because this is for encryption +-- of multiple plaintext blocks always the same roundkey sequence the keys are +-- stored until a new key is provided. +-- Starting from an initial 128, 192 or 256 Bit key (table of 4,6 or eight +-- columns = i) the sucessive roundkeys are calculated in the following way: +-- 1.) The 1st round is done with the initial key with the dwords dw[0] to +-- dw[i-1] +-- 2.) dw[n*i] is build through rotating dw[i-1] 1 left, Substituting its +-- contents with the Sbox function, the result then is XORed with +-- roundconstant[n] and it is again XORed with dw[(n-1)i]. +-- +-- Author(s): +-- Thomas Ruschival -- ruschi@opencores.org (www.ruschival.de) +-- +-------------------------------------------------------------------------------- +-- Copyright (c) 2009, Authors and opencores.org +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- * Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- * Redistributions in binary form must reproduce the above copyright notice, +-- this list of conditions and the following disclaimer in the documentation +-- and/or other materials provided with the distribution. +-- * Neither the name of the organization nor the names of its contributors +-- may be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +-- THE POSSIBILITY OF SUCH DAMAGE +------------------------------------------------------------------------------- +-- version management: +-- $Author$ +-- $Date$ +-- $Revision$ +------------------------------------------------------------------------------- + + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library util_lib; +use util_lib.util_pkg.all; + +library aes_ecb_lib; +use aes_ecb_lib.aes_ecb_pkg.all; + +entity keygenerator is + generic ( + KEYLENGTH : NATURAL := 128; -- Size of keyblock (128, 192, 256 Bits) + NO_ROUNDS : NATURAL := 10 -- how many rounds + ); + port ( + clk : in STD_LOGIC; -- system clock + initialkey : in KEYBLOCK; -- original userkey + key_stable : in STD_LOGIC; -- signal for enabling write of initial + -- key and signal valid key + -- ena=0->blank_key + round : in NIBBLE; -- index for selecting roundkey + roundkey : out KEYBLOCK; -- key for each round + ready : out STD_LOGIC + ); +end entity keygenerator; + + + +architecture arch1 of keygenerator +is + -- memory for roundkeys + type KEYMEM_TYPE is array (0 to 15) of KEYBLOCK; + signal KEYMEM : KEYMEM_TYPE; + signal keymem_in : KEYBLOCK; -- write port for keymem + signal ena_w : STD_LOGIC; -- ena port for key memory + signal to_sbox : DWORD; -- column to be substituted + signal from_sbox : DWORD; -- substutited column from sbox + signal roundcnt : NATURAL range 0 to 15; -- address to write key + signal next_roundcnt : NATURAL range 0 to 15; -- and cound the expansion steps + signal current_block : KEYBLOCK; -- register for the last block written + -- to memory for cumputation of new block + signal ready_i : STD_LOGIC; + +begin + --------------------------------------------------------------------------- + -- keymemory, RAM should be inferred + --------------------------------------------------------------------------- + -- purpose: keymemory (implemented in registers) + -- type : sequential + -- inputs : clk, res_n, ramport + -- outputs: roundkeys + keymemory_io : process (clk) + is + begin -- process memory_io + if rising_edge(clk) then -- rising clock edge + if ena_w = '1' then -- write while keys_are not done + KEYMEM(roundcnt) <= keymem_in; + end if; + -- assign keyblock for round + roundkey <= KEYMEM(to_integer(UNSIGNED(round))); + end if; + end process keymemory_io; + + + --------------------------------------------------------------------------- + -- Keygenerate gets its own sboxes to substitute columns to define clear + -- interface and increase f_max as this was on the critical path while + -- shared with aes_core_encrypt + --------------------------------------------------------------------------- + HighWord : sboxM4K + generic map ( + rominitfile => "sbox.hex") + port map ( + clk => clk, + address_a => to_sbox(31 downto 24), + address_b => to_sbox(23 downto 16), + q_a => from_sbox(31 downto 24), + q_b => from_sbox(23 downto 16)); + LowWord : sboxM4K + generic map ( + rominitfile => "sbox.hex") + port map ( + clk => clk, + address_a => to_sbox(15 downto 8), + address_b => to_sbox(7 downto 0), + q_a => from_sbox(15 downto 8), + q_b => from_sbox(7 downto 0)); + + + -- purpose: Counts the rounds up until all roundkeys are generated + -- type : sequential + -- inputs : clk, initkey_done + -- outputs: keys_ready + clocked_counter_fsm : process (clk) + is + begin -- process counter_controller + if rising_edge(clk) then + roundcnt <= next_roundcnt; + current_block <= keymem_in; + ready <= ready_i; + end if; + end process clocked_counter_fsm; + + + -- last DWORD of the previous roundkey by 1 to the left + -- and let it be substituted through the SBOX, sbox takes 1 cycle, + -- current_block is the registered value of keymem_in + -- ==> send keymem_in now, sbox will deliver correct result next cycle + to_sbox <= keymem_in(keymem_in'right)(23 downto 0) & keymem_in(keymem_in'right)(31 downto 24); + + + -- purpose: expands the initial key and fills the roundkeys array + -- type : sequential + -- inputs : current_block, previous_block, from_sbox + generate_roundkeys : process (current_block, from_sbox, initialkey, + key_stable, keymem_in, roundcnt) + is + begin -- process generate_roundkeys + if key_stable = '1' then + -- in the 1sr round only write the key to keymem + if roundcnt = 0 then + keymem_in <= initialkey; + ena_w <= '1'; + next_roundcnt <= roundcnt+1; + ready_i <= '0'; + else + -- XOR the substituted signal with round constant and the 1st DWORD previous roundkey + keymem_in(0) <= from_sbox xor (roundconstants(roundcnt) & X"000000") xor current_block(0); + -- the rest of the roundkey columns are generated by XOR of the + -- roundkeycolumns of the previuos round with the newly generated + -- 1st column + for i in 1 to current_block'right loop + keymem_in(i) <= current_block(i) xor keymem_in(i-1); + end loop; -- i in 1 to NO_KEYCOLUMNS-1 + + -- compute next round counter and generate write flags + if roundcnt <= NO_ROUNDS then + -- next counter + next_roundcnt <= roundcnt+1; + ready_i <= '0'; + ena_w <= '1'; + else + next_roundcnt <= roundcnt; + ready_i <= '1'; + ena_w <= '0'; + end if; + end if; + else + -- default if ena=0 + ena_w <= '0'; + next_roundcnt <= 0; + ready_i <= '0'; + keymem_in <= initialkey; + end if; + end process generate_roundkeys; + +end architecture arch1; + Index: hdl/aes_ecb/memory_word.vhd =================================================================== --- hdl/aes_ecb/memory_word.vhd (nonexistent) +++ hdl/aes_ecb/memory_word.vhd (revision 2) @@ -0,0 +1,80 @@ +-------------------------------------------------------------------------------- +-- This file is part of the project MYPROJECTNAME +-- see: MYPROJECTURL +-- +-- description: Register - nothing special +-- +------------------------------------------------------------------------------- +-- +-- Author(s): +-- Thomas Ruschival -- ruschi@opencores.org (www.ruschival.de) +-- +-------------------------------------------------------------------------------- +-- Copyright (c) 2009, Authors and opencores.org +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- * Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- * Redistributions in binary form must reproduce the above copyright notice, +-- this list of conditions and the following disclaimer in the documentation +-- and/or other materials provided with the distribution. +-- * Neither the name of the organization nor the names of its contributors +-- may be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +-- THE POSSIBILITY OF SUCH DAMAGE +------------------------------------------------------------------------------- +-- version management: +-- $Author$ +-- $Date$ +-- $Revision$ +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity memory_word is + generic ( + IOwidth : POSITIVE := 1); -- width in bits + port ( + data_in : in STD_LOGIC_VECTOR(IOwidth-1 downto 0); + data_out : out STD_LOGIC_VECTOR(IOwidth-1 downto 0); + res_n : in STD_LOGIC; -- system reset active low + ena : in STD_LOGIC; -- enable write + clk : in STD_LOGIC); -- system clock +end entity memory_word; + +architecture arch1 of memory_word is + signal data : STD_LOGIC_VECTOR(IOwidth-1 downto 0); -- storage +begin -- architecture arch1 + + -- purpose: write data to register at clock edge if enabled + -- type : sequential + -- inputs : clk, res_n, data_in,ena + write_mem : process (clk, res_n) is + begin -- process write_mem + if res_n = '0' then + data <= (others => '0'); + elsif rising_edge(clk) then + if ena = '1' then + data <= data_in; + end if; + end if; + end process write_mem; + + -- data can always be read + data_out <= data; + + +end architecture arch1; Index: hdl/aes_ecb/shiftrow_fwd.vhd =================================================================== --- hdl/aes_ecb/shiftrow_fwd.vhd (nonexistent) +++ hdl/aes_ecb/shiftrow_fwd.vhd (revision 2) @@ -0,0 +1,117 @@ +-------------------------------------------------------------------------------- +-- This file is part of the project MYPROJECTNAME +-- see: MYPROJECTURL +-- +-- description: (Encryption implementation of Shiftrow) +-- Shift Row rotates the Rows of the AES Block +-- This module takes the whole Rijdael state as input, extracts the rows, +-- shifts them and rebuilts the state. +-- +------------------------------------------------------------------------------- +-- +-- Author(s): +-- Thomas Ruschival -- ruschi@opencores.org (www.ruschival.de) +-- +-------------------------------------------------------------------------------- +-- Copyright (c) 2009, Authors and opencores.org +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- * Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- * Redistributions in binary form must reproduce the above copyright notice, +-- this list of conditions and the following disclaimer in the documentation +-- and/or other materials provided with the distribution. +-- * Neither the name of the organization nor the names of its contributors +-- may be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +-- THE POSSIBILITY OF SUCH DAMAGE +------------------------------------------------------------------------------- +-- version management: +-- $Author$ +-- $Date$ +-- $Revision$ +------------------------------------------------------------------------------- + +library IEEE; +use IEEE.numeric_std.all; +use IEEE.std_logic_1164.all; + +library aes_ecb_lib; +use aes_ecb_lib.aes_ecb_pkg.all; + + +architecture fwd of Shiftrow is + -- type of converting the columns into rows + subtype ROW is BYTEARRAY(0 to 3); + -- Row signal for easier handling of the shift operations + signal row1_in : Row; -- 1st row + signal row2_in : Row; -- 2nd row + signal row3_in : Row; -- 3rd row + signal row4_in : Row; -- 4th row + -- single rows after shift operation + -- row1 of the shifted state = row1 of unshifted state + signal row2_out : Row; -- 2nd row + signal row3_out : Row; -- 3rd row + signal row4_out : Row; -- 4th row + +begin -- architecture arch1 + -- purpose: build the temorary internal signals for easier handling + -- type : combinational + -- inputs : state_in + -- outputs: state_out + build_in : process (state_in) is + begin -- process build_in + -- state is a DWORD array with 16, 24 or 32 Byte in 4,6 or 8 columns + -- thus we loop through the columns and slice the column in its bytes + for col_cnt in 0 to (state_in'high) loop + row1_in(col_cnt) <= state_in(col_cnt)(31 downto 24); + row2_in(col_cnt) <= state_in(col_cnt)(23 downto 16); + row3_in(col_cnt) <= state_in(col_cnt)(15 downto 8); + row4_in(col_cnt) <= state_in(col_cnt)(7 downto 0); + end loop; -- col_cnt + end process build_in; + + + -- purpose: shift rows of Rindael state by 'shift_delta' + -- type : combinational + -- inputs : row(1 to 4)_in + -- outputs: row(1 to 4)_out + shifter : process (row2_in, row3_in, row4_in) is + begin + -- 1st row was never shifted so no reverse action needed + -- rotate 2nd row left + row2_out <= row2_in(row2_in'left+1 to row2_in'right) & row2_in(row2_in'left); + --rotate by 2 left + row3_out <= row3_in(row3_in'left+2 to row3_in'right) & row3_in(row3_in'left to row3_in'left+1); + -- rotate by 3 left + row4_out <= row4_in(row4_in'left+3 to row4_in'right) & row4_in(row4_in'left to row4_in'left+2); + end process shifter; + + + -- purpose: rebuilt the state form the shifted rows + -- type : combinational + -- inputs : row1_out, row2_out, row3_out, row4_out + -- outputs: state_out + rebuilt_state : process (row1_in, row2_out, row3_out, row4_out) is + begin -- process rebuilt_state + for col_cnt in 0 to state_out'high loop -- works because 15/4=3 + state_out(col_cnt)(31 downto 24) <= row1_in(col_cnt); + state_out(col_cnt)(23 downto 16) <= row2_out(col_cnt); + state_out(col_cnt)(15 downto 8) <= row3_out(col_cnt); + state_out(col_cnt)(7 downto 0) <= row4_out(col_cnt); + end loop; -- col_cnt + end process rebuilt_state; + +end architecture fwd; Index: hdl/aes_ecb/shiftrow.vhd =================================================================== --- hdl/aes_ecb/shiftrow.vhd (nonexistent) +++ hdl/aes_ecb/shiftrow.vhd (revision 2) @@ -0,0 +1,60 @@ +-------------------------------------------------------------------------------- +-- This file is part of the project MYPROJECTNAME +-- see: MYPROJECTURL +-- +-- description: (THIS IS ONLY THE ENTITY FOR THE SHIFTROW COMPONENTS) +-- Shift Row rotates the Rows of the AES Block +-- This module takes the whole Rijdael state as input, extracts the rows, +-- shifts them and rebuilts the state. +-- +------------------------------------------------------------------------------- +-- +-- Author(s): +-- Thomas Ruschival -- ruschi@opencores.org (www.ruschival.de) +-- +-------------------------------------------------------------------------------- +-- Copyright (c) 2009, Authors and opencores.org +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- * Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- * Redistributions in binary form must reproduce the above copyright notice, +-- this list of conditions and the following disclaimer in the documentation +-- and/or other materials provided with the distribution. +-- * Neither the name of the organization nor the names of its contributors +-- may be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +-- THE POSSIBILITY OF SUCH DAMAGE +------------------------------------------------------------------------------- +-- version management: +-- $Author$ +-- $Date$ +-- $Revision$ +------------------------------------------------------------------------------- + +library IEEE; +use IEEE.numeric_std.all; +use IEEE.std_logic_1164.all; + +library aes_ecb_lib; +use aes_ecb_lib.aes_ecb_pkg.all; + +entity Shiftrow is + port ( + state_in : in STATE; -- Raw input data to be shifted + state_out : out STATE -- shifted result + ); +end entity Shiftrow; + Index: hdl/aes_ecb/avs_aes_tb.vhd =================================================================== --- hdl/aes_ecb/avs_aes_tb.vhd (nonexistent) +++ hdl/aes_ecb/avs_aes_tb.vhd (revision 2) @@ -0,0 +1,384 @@ +-------------------------------------------------------------------------------- +-- This file is part of the project MYPROJECTNAME +-- see: MYPROJECTURL +-- +-- description: +-- Simple testbench for the avalon interface avs_aes together with aes_core. +-- +-- Todo: a lot! make it look nicer, more generic, maybe read data from file +-- +-- Author(s): +-- Thomas Ruschival -- ruschi@opencores.org (www.ruschival.de) +-- +-------------------------------------------------------------------------------- +-- Copyright (c) 2009, Thomas Ruschival +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- * Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- * Redistributions in binary form must reproduce the above copyright notice, +-- this list of conditions and the following disclaimer in the documentation +-- and/or other materials provided with the distribution. +-- * Neither the name of the nor the names of its contributors +-- may be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +-- THE POSSIBILITY OF SUCH DAMAGE +------------------------------------------------------------------------------- +-- version management: +-- $Author$ +-- $Date$ +-- $Revision$ +------------------------------------------------------------------------------- + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +library aes_ecb_lib; +use aes_ecb_lib.aes_ecb_pkg.all; + +------------------------------------------------------------------------------- + +entity avs_aes_tb is + +end entity avs_aes_tb; + +------------------------------------------------------------------------------- + +architecture arch1 of avs_aes_tb is + + -- component ports + signal clk : STD_LOGIC := '0'; -- avalon bus clock + signal reset : STD_LOGIC := '0'; -- avalon bus reset + signal writedata : STD_LOGIC_VECTOR(31 downto 0) := (others => '0'); -- data write port + signal address : STD_LOGIC_VECTOR(4 downto 0) := (others => '0'); -- slave address space offset + signal write : STD_LOGIC := '0'; -- write enable + signal read : STD_LOGIC := '0'; -- read request form avalon + signal irq : STD_LOGIC; -- interrupt to signal completion + signal readdata : STD_LOGIC_VECTOR(31 downto 0); -- result read port + signal chipselect : STD_LOGIC; -- enable component + signal keyexp_done : STD_LOGIC; + signal avs_s1_waitrequest : STD_LOGIC; + + +---- purpose: write something to the bus +--procedure avalon_write +-- signal mywritedata : in DWORD; +-- signal myaddress : in NATURAL; +--begin -- procedure avalon_write +-- wait until clk = '1'; +-- write <= '1'; +-- address <= STD_LOGIC_VECTOR(to_unsigned(address, 5)); +-- writedata <= mywritedata; +-- wait until clk = '1'; +-- write <= '0'; +--end procedure avalon_write; + + +begin -- architecture arch1 + + avs_aes_1 : entity aes_ecb_lib.avs_aes + generic map ( + KEYLENGTH => 256, -- AES key length + DECRYPTION => true) -- With decrypt or encrypt only + port map ( + clk => clk, -- avalon bus clock + reset => reset, -- avalon bus reset + avs_s1_chipselect => chipselect, -- enable component + avs_s1_writedata => writedata, -- data write port + avs_s1_address => address, -- slave address space offset + avs_s1_write => write, -- write enable + avs_s1_read => read, -- read request form avalon + avs_s1_irq => irq, -- interrupt to signal completion + avs_s1_waitrequest => avs_s1_waitrequest, -- stall operations + avs_s1_readdata => readdata); -- result read port + -- clock generation + Clk <= not Clk after 10 ns; + + -- waveform generation + WaveGen_Proc : process + begin + -- insert signal assignments here + reset <= '1'; + write <= '0'; + read <= '0'; + wait for 25 ns; + reset <= '0'; + chipselect <= '1'; + +------------------------------------------------------------------------------- +-- 256 BIT key +-- 603DEB10 15CA71BE 2B73AEF0 857D7781 1F352C07 3B6108D7 2D9810A3 0914DFF4 +-- 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 +------------------------------------------------------------------------------- + wait until clk = '1'; + -- write key + write <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(0, 5)); + writedata <= X"603DEB10"; --1st word + --2nd word + wait until clk = '1'; + write <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(1, 5)); + writedata <= X"15CA71BE"; + --3rd word + wait until clk = '1'; + write <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(2, 5)); + writedata <= X"2B73AEF0"; + --4th word + wait until clk = '1'; + write <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(3, 5)); + writedata <= X"857D7781"; + --5th word + wait until clk = '1'; + write <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(4, 5)); + writedata <= X"1F352C07"; + --6th word + wait until clk = '1'; + write <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(5, 5)); + writedata <= X"3B6108D7"; + --7th word + wait until clk = '1'; + write <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(6, 5)); + writedata <= X"2D9810A3"; + --8th word + wait until clk = '1'; + write <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(7, 5)); + writedata <= X"0914DFF4"; +-- validate key + wait until clk = '1'; + write <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(31, 5)); + writedata <= X"00000080"; +-- wait until fully expanded + -- wait until avs_s1_waitrequest = '0'; + +-- DATA: AA221133 11441155 11661177 21212121 + -- write data#1 + wait until clk = '1'; + write <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(8, 5)); + writedata <= X"AA221133"; + -- write data#2 + wait until clk = '1'; + write <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(9, 5)); + writedata <= X"11441155"; + -- write data#3 + wait until clk = '1'; + write <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(10, 5)); + writedata <= X"11661177"; + -- write data#4 + wait until clk = '1'; + write <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(11, 5)); + writedata <= X"21212121"; +------------------------------------------------------------------------------- + -- write control + wait until clk = '1'; + write <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(31, 5)); +-- data stable, key_stable irq_ena + writedata <= X"000000C1"; + wait until clk = '1'; + write <= '0'; +-- do the calc + wait until irq = '1'; + wait until clk = '1'; + read <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(16#10#, 5)); + wait until clk = '1'; + read <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(16#11#, 5)); + wait until clk = '1'; + read <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(16#12#, 5)); + wait until clk = '1'; + read <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(16#13#, 5)); + wait until clk = '1'; + read <= '0'; +-- RESULT(encrypt): +-- 256 bit key --> D7C71AF7 76F04439 1A07623A 8E6E197B +-- 192 bit key --> 87870FD6 C27D944F C83EBA16 C5DB0D63 +-- 128 bit key --> 5A287C9F CDBC6D35 F3D2679C 4CB2F5B0 + + + +------------------------------------------------------------------------------- +-- decrypt the the same data under the given key + wait until clk = '1'; + write <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(31, 5)); + writedata <= X"000000C2"; + wait until clk = '1'; + write <= '0'; + -- do the calc + wait until irq = '1'; + wait until clk = '1'; + read <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(16#10#, 5)); + wait until clk = '1'; + read <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(16#11#, 5)); + wait until clk = '1'; + read <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(16#12#, 5)); + wait until clk = '1'; + read <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(16#13#, 5)); + wait until clk = '1'; + read <= '0'; +-- RESULT(decrypt): +-- 256 bit key --> 63B72B79 EA1F444B 8A1AD035 CAE6B024 +-- 192 bit key --> 4343EB7A 79A14922 CC18A1D6 C5D00B70 +-- 128 bit key --> 02985DF8 8209EAA2 652E4125 11C98F9F + + +------------------------------------------------------------------------------- +-- Encrypt again + -- write control + wait until clk = '1'; + write <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(31, 5)); +-- data stable, key_stable irq_ena + writedata <= X"000000C1"; + wait until clk = '1'; + write <= '0'; +-- do the calc + wait until irq = '1'; + wait until clk = '1'; + read <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(16#10#, 5)); + wait until clk = '1'; + read <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(16#11#, 5)); + wait until clk = '1'; + read <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(16#12#, 5)); + wait until clk = '1'; + read <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(16#13#, 5)); + wait until clk = '1'; + read <= '0'; +-- RESULT(encrypt): +-- 256 bit key --> D7C71AF7 76F04439 1A07623A 8E6E197B +-- 192 bit key --> 87870FD6 C27D944F C83EBA16 C5DB0D63 +-- 128 bit key --> 5A287C9F CDBC6D35 F3D2679C 4CB2F5B0 + + + + + +------------------------------------------------------------------------------- +-- load new data, same key +-- DATA: AA2211CC 11440055 11001177 2121BBBB +-- RESULT: 14BD6636 9AAEBF2B 45FB0032 7FA6EBDA + -- write data#1 + wait until clk = '1'; + write <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(8, 5)); + writedata <= X"AA2211CC"; + -- write data#2 + wait until clk = '1'; + write <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(9, 5)); + writedata <= X"11440055"; + -- write data#3 + wait until clk = '1'; + write <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(10, 5)); + writedata <= X"11001177"; + -- write data#4 + wait until clk = '1'; + write <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(11, 5)); + writedata <= X"2121BBBB"; + -- data stable, key_stable irq_ena + wait until clk = '1'; + write <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(31, 5)); + writedata <= X"000000C1"; + wait until clk = '1'; + write <= '0'; + -- do calc + wait until irq = '1'; + wait until clk = '1'; + read <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(16, 5)); + wait until clk = '1'; + read <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(17, 5)); + wait until clk = '1'; + read <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(18, 5)); + wait until clk = '1'; + read <= '1'; + address <= STD_LOGIC_VECTOR(to_unsigned(19, 5)); + wait until clk = '1'; + read <= '0'; +-- RESULT: 14BD6636 9AAEBF2B 45FB0032 7FA6EBDA + +------------------------------------------------------------------------------- +-- Start calc again but dirctly after start, load next data block +-- DATA: CDEF5577 55005588 55CC5500 0000BBBB +-- RESULT: AA1119CD 77A2F3D8 38ECA4DD 0A47975B +------------------------------------------------------------------------------- +-- wait until clk = '1'; +-- write <= '1'; +-- address <= X"F"; +-- writedata <= X"000000C1"; -- restart calculation +-- wait until clk = '1'; +-- address <= X"4"; -- load data +-- writedata <= X"CDEF5577"; +-- -- write data#2 +-- wait until clk = '1'; +-- write <= '1'; +-- address <= X"5"; +-- writedata <= X"55005588"; +-- -- write data#3 +-- wait until clk = '1'; +-- write <= '1'; +-- address <= X"6"; +-- writedata <= X"55CC5500"; +-- -- write data#4 +-- wait until clk = '1'; +-- write <= '1'; +-- address <= X"7"; +-- writedata <= X"0000BBBB"; +-- --deassert write, wait for completion +-- wait until clk = '1'; +-- write <= '0'; +-- wait until irq = '1'; +-- wait until clk = '1'; +-- -- restart with newly loaded block +-- write <= '1'; +-- address <= X"F"; +-- writedata <= X"00000081"; --clear IRQ, restart calculation +-- wait until clk = '1'; +-- write <= '0'; + wait; + end process WaveGen_Proc; + + + +end architecture arch1; Index: hdl/aes_ecb/aes_fsm_decrypt.vhd =================================================================== --- hdl/aes_ecb/aes_fsm_decrypt.vhd (nonexistent) +++ hdl/aes_ecb/aes_fsm_decrypt.vhd (revision 2) @@ -0,0 +1,172 @@ +------------------------------------------------------------------------------- +-- This file is part of the project MYPROJECTNAME +-- see: MYPROJECTURL +-- +-- description: +-- Statemachine controlling the decryption datapath within aes_core.vhd does no +-- dataprocessing itself but only set enables and multiplexer selector ports +-- +-- Author(s): +-- Thomas Ruschival -- ruschi@opencores.org (www.ruschival.de) +-- +-------------------------------------------------------------------------------- +-- Copyright (c) 2009, Thomas Ruschival +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- * Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- * Redistributions in binary form must reproduce the above copyright notice, +-- this list of conditions and the following disclaimer in the documentation +-- and/or other materials provided with the distribution. +-- * Neither the name of the nor the names of its contributors +-- may be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +-- THE POSSIBILITY OF SUCH DAMAGE +------------------------------------------------------------------------------- +-- version management: +-- $Author$ +-- $Date$ +-- $Revision$ +------------------------------------------------------------------------------- + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library aes_ecb_lib; +use aes_ecb_lib.aes_ecb_pkg.all; + +entity aes_fsm_decrypt is + generic ( + NO_ROUNDS : NATURAL := 10); -- number of rounds + port ( + clk : in STD_LOGIC; -- System clock + data_stable : in STD_LOGIC; -- flag valid data/activate the process + -- interface for keygenerator + key_ready : in STD_LOGIC; -- flag valid roundkeys + round_index_out : out NIBBLE; -- address for roundkeys memory + -- Result of Process + finished : out STD_LOGIC; -- flag valid result + -- Control ports for the Core + round_type_sel : out STD_LOGIC_VECTOR(1 downto 0) -- selector for mux around mixcols + ); +end entity aes_fsm_decrypt; + +-- +architecture Arch1 of AES_FSM_DECRYPT is + -- types for the FSM + type AESstates is (WAIT_KEY, WAIT_DATA, INITIAL_ROUND,DO_ROUND, FINAL_ROUND); + + -- FSM signals + signal FSM : AESstates; -- current state + signal next_FSM : AESstates; -- combinational next state + + -- Round Counter & address for keygenerate + signal round_index : NIBBLE; -- currently processed round + signal next_round_index : NIBBLE; -- next round, index for keygenerate + +begin + --------------------------------------------------------------------------- + -- assign internal values to interface ports + --------------------------------------------------------------------------- + round_index_out <= next_round_index; -- roundkey address + + -- purpose: combinational generation of next state for encrytion FSM + -- type : sequential + -- inputs : FSM, data_stable, key_ready, round_index + -- outputs: next_FSM + gen_next_fsm : process (FSM, data_stable, key_ready, round_index) is + begin -- process gen_next_fsm + case FSM is + when WAIT_KEY => + if key_ready = '1' then + next_FSM <= WAIT_DATA; + else + next_FSM <= WAIT_KEY; + end if; + when WAIT_DATA => + if data_stable = '1' then + next_FSM <= INITIAL_ROUND; + else + next_FSM <= WAIT_DATA; + end if; + when INITIAL_ROUND => + next_FSM <= DO_ROUND; + when DO_ROUND => + if round_index = X"1" then + next_FSM <= FINAL_ROUND; + else + next_FSM <= DO_ROUND; + end if; + when FINAL_ROUND => + next_FSM <= WAIT_DATA; + -- pragma synthesis_off + when others => + report "FSM in strange state - aborting" severity failure; + -- pragma synthesis_on + end case; + + -- Default behaviour in case key is invalid + if key_ready = '0' then + next_FSM <= WAIT_KEY; + end if; + + end process gen_next_fsm; + + + -- purpose: assign outputs for decryption + -- type : combinational + -- inputs : FSM + com_output_assign : process (FSM, round_index) is + begin -- process com_output_assign + -- save defaults for decrypt_FSM + round_type_sel <= "00"; -- signal initial_round + next_round_index <= round_index; + finished <= '0'; + + case FSM is + when WAIT_KEY => + -- start at last index + next_round_index <= STD_LOGIC_VECTOR(to_unsigned(NO_ROUNDS,4)); + when WAIT_DATA => + next_round_index <= STD_LOGIC_VECTOR(to_unsigned(NO_ROUNDS,4)); + when INITIAL_ROUND => + round_type_sel <= "00"; -- use Data_in for Addkey and pass + -- result directly to Inverse Shiftrow + next_round_index <= STD_LOGIC_VECTOR(UNSIGNED(round_index)-1); + when DO_ROUND => + round_type_sel <= "01"; + next_round_index <= STD_LOGIC_VECTOR(UNSIGNED(round_index)-1); + when FINAL_ROUND => + round_type_sel <= "01"; + finished <= '1'; + when others => + null; + end case; + end process com_output_assign; + + -- purpose: clocked FSM for decryption + -- type : sequential + -- inputs : clk, res_n + clocked_FSM : process (clk) is + begin -- process clocked_FSM + if rising_edge(clk) then -- rising clock edge + FSM <= next_FSM; + round_index <= next_round_index; + end if; + end process clocked_FSM; + +end architecture Arch1; Index: hdl/aes_ecb/mixcol_inv.vhd =================================================================== --- hdl/aes_ecb/mixcol_inv.vhd (nonexistent) +++ hdl/aes_ecb/mixcol_inv.vhd (revision 2) @@ -0,0 +1,162 @@ +-------------------------------------------------------------------------------- +-- This file is part of the project MYPROJECTNAME +-- see: MYPROJECTURL +-- +-- description: +-- Mix the columns of the AES Block (decryption version) +-- Invert what was computed in mixcol_fwd.vhd +-- For decrytion the inverse matrix is needed: +-- +-- | E B D 9 | a(n,0) +-- | 9 E B D | x a(n,1) +-- | D 9 E B | a(n,2) +-- | B D 9 E | a(n,3) +-- +------------------------------------------------------------------------------- +-- +-- Author(s): +-- Thomas Ruschival -- ruschi@opencores.org (www.ruschival.de) +-- +-------------------------------------------------------------------------------- +-- Copyright (c) 2009, Authors and opencores.org +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- * Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- * Redistributions in binary form must reproduce the above copyright notice, +-- this list of conditions and the following disclaimer in the documentation +-- and/or other materials provided with the distribution. +-- * Neither the name of the organization nor the names of its contributors +-- may be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +-- THE POSSIBILITY OF SUCH DAMAGE +------------------------------------------------------------------------------- +-- version management: +-- $Author$ +-- $Date$ +-- $Revision$ +------------------------------------------------------------------------------- + + +library IEEE; +use IEEE.std_logic_1164.all; +use ieee.numeric_std.all; + +library aes_ecb_lib; +use aes_ecb_lib.aes_ecb_pkg.all; + + +architecture inv of mixcol +is + signal byte0 : BYTE; + signal byte1 : BYTE; + signal byte2 : BYTE; + signal byte3 : BYTE; +begin -- architecture ARCH1 + + -- Easier handling of the single cells of the column + byte0 <= col_in(31 downto 24); + byte1 <= col_in(23 downto 16); + byte2 <= col_in(15 downto 8); + byte3 <= col_in(7 downto 0); + + -- purpose: multiplies the column of the input block with the matrix + -- type : combinational + -- inputs : direction,byte0,byte1,byte2,byte3 + -- outputs: col_out + matrix_mult : process ( byte0, byte1, byte2, byte3) is + -- temporary results for the row-col multiplication have to be 9 Bits + -- long because the input is shifted left + variable tmp_res0 : STD_LOGIC_VECTOR(10 downto 0); -- result of row1*col + variable tmp_res1 : STD_LOGIC_VECTOR(10 downto 0); -- result of row2*col + variable tmp_res2 : STD_LOGIC_VECTOR(10 downto 0); -- result of row3*col + variable tmp_res3 : STD_LOGIC_VECTOR(10 downto 0); -- result of row4*col + begin -- process matrix_mult + -- Multiply by 1st row of the inverse matrix ( E B D 9 ) + tmp_res0 := byte0 & "000" xor '0' & byte0 & "00" xor "00" & byte0 & '0' xor -- byte0*8+byte0*4+byte0*2 + + byte1 & "000" xor "00" & byte1 & '0' xor "000" & byte1 xor -- byte1*8 + byte1*2 + byte1 + byte2 & "000" xor "0" & byte2 & "00" xor "000" & byte2 xor -- byte2*8 + byte2*4 + byte2 + byte3 & "000" xor "000" & byte3; -- byte3*8 + byte3*1 + + -- check if bits>7 = 1 and XOR with magic numbers to make it 8 BIT + if tmp_res0(10) = '1' then + tmp_res0 := tmp_res0 xor "10001101100"; + end if; + if tmp_res0(9) = '1' then + tmp_res0 := tmp_res0 xor "01000110110"; + end if; + if tmp_res0(8) = '1' then + tmp_res0 := tmp_res0 xor "00100011011"; + end if; + + -- Multiply by 2nd row of the inverse matrix ( 9 E B D ) + tmp_res1 := byte0 & "000" xor "000" & byte0 xor + byte1 & "000" xor "0" & byte1 & "00" xor "00" & byte1 & '0' xor + byte2 & "000" xor "00" & byte2 & '0' xor "000" & byte2 xor + byte3 & "000" xor '0' & byte3 & "00" xor "000" & byte3; + + -- check if bits>7 = 1 and XOR with magic numbers to make it 8 BIT + if tmp_res1(10) = '1' then + tmp_res1 := tmp_res1 xor "10001101100"; + end if; + if tmp_res1(9) = '1' then + tmp_res1 := tmp_res1 xor "01000110110"; + end if; + if tmp_res1(8) = '1' then + tmp_res1 := tmp_res1 xor "00100011011"; + end if; + + -- Multiply by 3rd row of the inverse matrix (D 9 E B) + tmp_res2 := byte0 & "000" xor "0" & byte0 & "00" xor "000" & byte0 xor -- byte0*8 + byte0*4 + byte0 + byte1 & "000" xor "000" & byte1 xor -- byte1*8 + byte1 + byte2 & "000" xor "0" & byte2 & "00" xor "00" & byte2 &'0' xor -- byte2*8 + byte2*4 + byte2*2 + byte3 & "000" xor "00" & byte3 & '0' xor "000" & byte3; -- byte3*8 + byte3*2 + byte3 + -- check if bits>7 = 1 and XOR with magic numbers to make it 8 BIT + if tmp_res2(10) = '1' then + tmp_res2 := tmp_res2 xor "10001101100"; + end if; + if tmp_res2(9) = '1' then + tmp_res2 := tmp_res2 xor "01000110110"; + end if; + if tmp_res2(8) = '1' then + tmp_res2 := tmp_res2 xor "00100011011"; + end if; + + -- Multiply by 4th row of the inverse matrix (B D 9 E) + tmp_res3 := byte0 & "000" xor "00" & byte0 & '0' xor "000" & byte0 xor -- byte0*8 + byte0*2 + byte0*1 + byte1 & "000" xor '0' & byte1 &"00" xor "000" & byte1 xor -- byte1*8 + byte1*4 + byte1 + byte2 & "000" xor "000" & byte2 xor -- byte2*8 + byte2 + byte3 & "000" xor "0" & byte3 & "00" xor "00" & byte3 &'0'; -- byte3*8 + byte3*4 + byte3*2 + + -- check if bits>7 = 1 and XOR with magic numbers to make it 8 BIT + if tmp_res3(10) = '1' then + tmp_res3 := tmp_res3 xor "10001101100"; + end if; + if tmp_res3(9) = '1' then + tmp_res3 := tmp_res3 xor "01000110110"; + end if; + if tmp_res3(8) = '1' then + tmp_res3 := tmp_res3 xor "00100011011"; + end if; + + -- build output signal (BYTE_RANGE =7 downto 0 see util_pkg.vhd) + col_out(31 downto 24) <= tmp_res0(BYTE_RANGE); + col_out(23 downto 16) <= tmp_res1(BYTE_RANGE); + col_out(15 downto 8) <= tmp_res2(BYTE_RANGE); + col_out(7 downto 0) <= tmp_res3(BYTE_RANGE); + end process matrix_mult; + +end architecture inv; + Index: hdl/aes_ecb/addroundkey.vhd =================================================================== --- hdl/aes_ecb/addroundkey.vhd (nonexistent) +++ hdl/aes_ecb/addroundkey.vhd (revision 2) @@ -0,0 +1,75 @@ +------------------------------------------------------------------------------- +-- This file is part of the project MYPROJECTNAME +-- see: MYPROJECTURL +-- +-- description: +-- AddRoundKey module for AES algorithm, basically a simple XOR for states and +-- keyblocks.... just a simple XOR wrapped into a component for nicer usage. +-- +-- +------------------------------------------------------------------------------- +-- Author(s): +-- Thomas Ruschival -- ruschi@opencores.org (www.ruschival.de) +-- +-------------------------------------------------------------------------------- +-- Copyright (c) 2009, Thomas Ruschival +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- * Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- * Redistributions in binary form must reproduce the above copyright notice, +-- this list of conditions and the following disclaimer in the documentation +-- and/or other materials provided with the distribution. +-- * Neither the name of the nor the names of its contributors +-- may be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +-- THE POSSIBILITY OF SUCH DAMAGE +------------------------------------------------------------------------------- +-- version management: +-- $Author$ +-- $Date$ +-- $Revision$ +------------------------------------------------------------------------------- + +library IEEE; +use IEEE.std_logic_1164.all; +use ieee.numeric_std.all; + +library aes_ecb_lib; +use aes_ecb_lib.aes_ecb_pkg.all; + +entity AddRoundKey is + port ( + roundkey : in KEYBLOCK; -- Roundkey + cypherblock : in STATE; -- State for this round + result : out STATE); -- result +end entity AddRoundKey; + +architecture arch1 of AddRoundKey is + +begin -- architecture arch1 + + -- purpose: Adding (Xor) roundkey words with Keywords + -- type : combinational + -- inputs : cypherblock, roundkey + -- outputs: result + Xoring : process (cypherblock, roundkey) is + begin -- process Xoring + for cnt in cypherblock'range loop + result(cnt) <= cypherblock(cnt) xor roundkey(cnt); + end loop; -- cnt + end process Xoring; + +end architecture arch1; Index: hdl/aes_ecb/sbox.vhd =================================================================== --- hdl/aes_ecb/sbox.vhd (nonexistent) +++ hdl/aes_ecb/sbox.vhd (revision 2) @@ -0,0 +1,69 @@ +------------------------------------------------------------------------------ +-- This file is part of the project MYPROJECTNAME +-- see: MYPROJECTURL +-- +-- description: +-- Sbox implements a lookup ROM for nonlinear substitution of a Bytearray. +-- This is only the entity for either arch1 (which is pure VHDL) or M4K which +-- is an Altera M4K-Blockram implementation. +-- +-------------------------------------------------------------------------------! +-- +-- Author(s): +-- Thomas Ruschival -- ruschi@opencores.org (www.ruschival.de) +-- +-------------------------------------------------------------------------------- +-- Copyright (c) 2009, Authors and opencores.org +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- * Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- * Redistributions in binary form must reproduce the above copyright notice, +-- this list of conditions and the following disclaimer in the documentation +-- and/or other materials provided with the distribution. +-- * Neither the name of the organization nor the names of its contributors +-- may be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +-- THE POSSIBILITY OF SUCH DAMAGE +------------------------------------------------------------------------------- +-- version management: +-- $Author$ +-- $Date$ +-- $Revision$ +------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; + +------------------------------------------------------------------------------- +-- The interface is 2x8Bit because Altera megafunction is supposed to be at max +-- 8Bit dual port ROM (and I relied on a altera quartus generated component +-- before) see architecture m4k +------------------------------------------------------------------------------- +entity sbox is + generic ( + INVERSE : BOOLEAN := false -- is this the inverse or the forward + -- lookup table. + -- TRUE -> inverse sbox + -- FALSE -> forward sbox + ); + port( + clk : in STD_LOGIC; -- system clock + address_a : in STD_LOGIC_VECTOR (7 downto 0); -- 1st byte + address_b : in STD_LOGIC_VECTOR (7 downto 0); -- 2nd byte + q_a : out STD_LOGIC_VECTOR (7 downto 0); -- substituted 1st byte + q_b : out STD_LOGIC_VECTOR (7 downto 0) -- substituted 2nd byte + ); +end sbox; + Index: hdl/aes_ecb/sbox.hex =================================================================== --- hdl/aes_ecb/sbox.hex (nonexistent) +++ hdl/aes_ecb/sbox.hex (revision 2) @@ -0,0 +1,257 @@ +:01000000639C +:010001007C82 +:010002007786 +:010003007B81 +:01000400F209 +:010005006B8F +:010006006F8A +:01000700C533 +:0100080030C7 +:0100090001F5 +:01000A00678E +:01000B002BC9 +:01000C00FEF5 +:01000D00D71B +:01000E00AB46 +:01000F00767A +:01001000CA25 +:01001100826C +:01001200C924 +:010013007D6F +:01001400FAF1 +:010015005991 +:0100160047A2 +:01001700F0F8 +:01001800AD3A +:01001900D412 +:01001A00A243 +:01001B00AF35 +:01001C009C47 +:01001D00A43E +:01001E00726F +:01001F00C020 +:01002000B728 +:01002100FDE1 +:01002200934A +:0100230026B6 +:0100240036A5 +:010025003F9B +:01002600F7E2 +:01002700CC0C +:0100280034A3 +:01002900A531 +:01002A00E5F0 +:01002B00F1E3 +:01002C007162 +:01002D00D8FA +:01002E0031A0 +:01002F0015BB +:0100300004CB +:01003100C707 +:0100320023AA +:01003300C309 +:0100340018B3 +:010035009634 +:0100360005C4 +:010037009A2E +:0100380007C0 +:0100390012B4 +:01003A008045 +:01003B00E2E2 +:01003C00EBD8 +:01003D00279B +:01003E00B20F +:01003F00754B +:0100400009B6 +:01004100833B +:010042002C91 +:010043001AA2 +:010044001BA0 +:010045006E4C +:010046005A5F +:01004700A018 +:010048005265 +:010049003B7B +:01004A00D6DF +:01004B00B301 +:01004C00298A +:01004D00E3CF +:01004E002F82 +:01004F00842C +:01005000535C +:01005100D1DD +:0100520000AD +:01005300EDBF +:01005400208B +:01005500FCAE +:01005600B1F8 +:010057005B4D +:010058006A3D +:01005900CBDB +:01005A00BEE7 +:01005B00396B +:01005C004A59 +:01005D004C56 +:01005E005849 +:01005F00CFD1 +:01006000D0CF +:01006100EFAF +:01006200AAF3 +:01006300FBA1 +:010064004358 +:010065004D4D +:010066003366 +:010067008513 +:010068004552 +:01006900F99D +:01006A000293 +:01006B007F15 +:01006C005043 +:01006D003C56 +:01006E009FF2 +:01006F00A8E8 +:01007000513E +:01007100A3EB +:01007200404D +:010073008FFD +:0100740092F9 +:010075009DED +:010076003851 +:01007700F593 +:01007800BCCB +:01007900B6D0 +:01007A00DAAB +:01007B002163 +:01007C001073 +:01007D00FF83 +:01007E00F38E +:01007F00D2AE +:01008000CDB2 +:010081000C72 +:01008200136A +:01008300EC90 +:010084005F1C +:0100850097E3 +:010086004435 +:010087001761 +:01008800C4B3 +:01008900A7CF +:01008A007EF7 +:01008B003D37 +:01008C00640F +:01008D005D15 +:01008E001958 +:01008F0073FD +:01009000600F +:0100910081ED +:010092004F1E +:01009300DC90 +:010094002249 +:010095002A40 +:0100960090D9 +:0100970088E0 +:010098004621 +:01009900EE78 +:01009A00B8AD +:01009B001450 +:01009C00DE85 +:01009D005E04 +:01009E000B56 +:01009F00DB85 +:0100A000E07F +:0100A100322C +:0100A2003A23 +:0100A3000A52 +:0100A4004912 +:0100A5000654 +:0100A6002435 +:0100A7005CFC +:0100A800C295 +:0100A900D383 +:0100AA00ACA9 +:0100AB0062F2 +:0100AC0091C2 +:0100AD0095BD +:0100AE00E46D +:0100AF0079D7 +:0100B000E768 +:0100B100C886 +:0100B2003716 +:0100B3006DDF +:0100B4008DBE +:0100B500D575 +:0100B6004EFB +:0100B700A99F +:0100B8006CDB +:0100B90056F0 +:0100BA00F451 +:0100BB00EA5A +:0100BC0065DE +:0100BD007AC8 +:0100BE00AE93 +:0100BF000838 +:0100C000BA85 +:0100C10078C6 +:0100C2002518 +:0100C3002E0E +:0100C4001C1F +:0100C500A694 +:0100C600B485 +:0100C700C672 +:0100C800E84F +:0100C900DD59 +:0100CA0074C1 +:0100CB001F15 +:0100CC004BE8 +:0100CD00BD75 +:0100CE008BA6 +:0100CF008AA6 +:0100D00070BF +:0100D1003EF0 +:0100D200B578 +:0100D30066C6 +:0100D40048E3 +:0100D5000327 +:0100D600F633 +:0100D7000E1A +:0100D80061C6 +:0100D90035F1 +:0100DA0057CE +:0100DB00B96B +:0100DC00869D +:0100DD00C161 +:0100DE001D04 +:0100DF009E82 +:0100E000E13E +:0100E100F826 +:0100E2009885 +:0100E300110B +:0100E40069B2 +:0100E500D941 +:0100E6008E8B +:0100E7009484 +:0100E8009B7C +:0100E9001EF8 +:0100EA00878E +:0100EB00E92B +:0100EC00CE45 +:0100ED0055BD +:0100EE0028E9 +:0100EF00DF31 +:0100F0008C83 +:0100F100A16D +:0100F2008984 +:0100F3000DFF +:0100F400BF4C +:0100F500E624 +:0100F60042C7 +:0100F70068A0 +:0100F80041C6 +:0100F900996D +:0100FA002DD8 +:0100FB000FF5 +:0100FC00B053 +:0100FD0054AE +:0100FE00BB46 +:0100FF0016EA +:00000001FF Index: hdl/aes_ecb/aes_core.vhd =================================================================== --- hdl/aes_ecb/aes_core.vhd (nonexistent) +++ hdl/aes_ecb/aes_core.vhd (revision 2) @@ -0,0 +1,373 @@ +------------------------------------------------------------------------------- +-- This file is part of the project MYPROJECTNAME +-- see: MYPROJECTURL +-- +-- description: +-- Complete structural description of the AES core. No processes or protocol +-- handling is done at this level. This component is entirely depending on the +-- underlying elements. +-- +-- Author(s): +-- Thomas Ruschival -- ruschi@opencores.org (www.ruschival.de) +-- +-------------------------------------------------------------------------------- +-- Copyright (c) 2009, Thomas Ruschival +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- * Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- * Redistributions in binary form must reproduce the above copyright notice, +-- this list of conditions and the following disclaimer in the documentation +-- and/or other materials provided with the distribution. +-- * Neither the name of the nor the names of its contributors +-- may be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +-- THE POSSIBILITY OF SUCH DAMAGE +------------------------------------------------------------------------------- +-- version management: +-- $Author$ +-- $Date$ +-- $Revision$ +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library aes_ecb_lib; +use aes_ecb_lib.aes_ecb_pkg.all; + +entity AES_CORE is + generic ( + KEYLENGTH : NATURAL := 128; -- Size of keyblock (128, 192, 256 Bits) + DECRYPTION : BOOLEAN := false -- include decrypt datapath + ); + port( + clk : in STD_LOGIC; -- system clock + data_in : in STATE; -- payload to encrypt + data_stable : in STD_LOGIC; -- flag valid payload + keyword : in DWORD; -- word of original userkey + keywordaddr : in STD_LOGIC_VECTOR(2 downto 0); -- keyword register address + w_ena_keyword : in STD_LOGIC; -- write enable of keyword to wordaddr + key_stable : in STD_LOGIC; -- key is complete and valid, start expansion + decrypt_mode : in STD_LOGIC; -- decrypt='1',encrypt='0' + keyexp_done : out STD_LOGIC; -- keyprocessing is done + result : out STATE; -- output + finished : out STD_LOGIC -- output valid + ); + -- number of rounds 10, 12 or 14, needed for looping + constant NO_ROUNDS : NATURAL := lookupRounds(KEYLENGTH); +end AES_CORE; + + +architecture arch1 of AES_CORE is + --------------------------------------------------------------------------- + -- signal for encrypt datapath + --------------------------------------------------------------------------- + signal addkey_in_enc : STATE; -- State for this round + signal mixcol_out_enc : STATE; -- State with mixed Colums + signal sbox_out_enc : STATE; -- 4 columns output form ROM + signal shiftrow_out_enc : STATE; -- shifted state + signal addkey_out_enc : STATE; -- result of add key + -- control signals + signal roundkey_idx_enc : NIBBLE; -- index for selecting roundkey + signal round_type_enc : STD_LOGIC_VECTOR(1 downto 0); -- switch to select ports + signal finished_enc : STD_LOGIC; -- encryption has terminated + signal ena_encrypt : STD_LOGIC; -- enable encryption fsm only if not + -- decryption is running + -- (data_stable AND not decrypt_mode='1') + --------------------------------------------------------------------------- + -- Signals for decrypt datapath + --------------------------------------------------------------------------- + signal addkey_in_dec : STATE; -- input for addkey + signal addkey_out_dec : STATE; -- output of addkey + signal mixcol_out_dec : STATE; -- State with mixed Colums + signal sbox_out_dec : STATE; -- 4 columns output form ROM + signal shiftrow_in_dec : STATE; -- multiplexer output for shiftrow + signal shiftrow_out_dec : STATE; -- shifted state + -- control signals + signal round_type_dec : STD_LOGIC_VECTOR(1 downto 0); -- switch to select ports + signal roundkey_idx_dec : NIBBLE; -- index for selecting roundkey + signal finished_dec : STD_LOGIC; -- decryption has terminated + signal ena_decrypt : STD_LOGIC; -- enable encryption fsm only if not + -- decryption is running + -- (data_stable AND decrypt_mode='1') + --------------------------------------------------------------------------- + -- Common signals encrypt and decrypt + --------------------------------------------------------------------------- + signal roundkey_idx : NIBBLE; -- multiplexed round index + signal key_ready : STD_LOGIC; -- ouput of keyexpansion + signal roundkey : KEYBLOCK; -- Roundkey + +begin -- architecture arch1 + --------------------------------------------------------------------------- + -- Multiplexers for switching encrypt and decrypt controller + -- only needed if decryption datapath is enabled + --------------------------------------------------------------------------- + decryption_result_mux : if DECRYPTION generate + -- Multiplexed result port + ResultMux : for i in 0 to 3 generate + Multiplex : mux2 + generic map ( + IOwidth => DWORD_WIDTH) + port map ( + inport_a => addkey_out_enc(i), + inport_b => addkey_out_dec(i), + selector => decrypt_mode, -- decrypt='1',encrypt='0' + outport => Result(i)); + end generate ResultMux; + + -- Multiplexed control over key index + keyindexMux : mux2 + generic map ( + IOwidth => NIBBLE_WIDTH) + port map ( + inport_a => roundkey_idx_enc, + inport_b => roundkey_idx_dec, + selector => decrypt_mode, -- decrypt='1',encrypt='0' + outport => roundkey_idx); + + -- Multiplexed finished signal + finished <= finished_enc when decrypt_mode = '0' else finished_dec; + end generate decryption_result_mux; + + --------------------------------------------------------------------------- + -- No DECRYPTION MODE --> multiplexers not needed + --------------------------------------------------------------------------- + ecryption_only : if not DECRYPTION generate + -- result: + result <= addkey_out_enc; + --finished flag + finished <= finished_enc; + -- key index: + roundkey_idx <= roundkey_idx_enc; + end generate ecryption_only; + + + --------------------------------------------------------------------------- + -- Key generator for roundkeys (decrypt and encrypt) + --------------------------------------------------------------------------- + roundkey_generator : keyexpansionV2 + generic map ( + KEYLENGTH => KEYLENGTH) -- Size of keyblock (128, 192, 256 Bits) + port map ( + clk => clk, -- system clock + keyword => keyword, -- word of original userkey + keywordaddr => keywordaddr, -- keyword register address + w_ena_keyword => w_ena_keyword, -- write enable of keyword to wordaddr + key_stable => key_stable, -- key is completa and valid, start expansion + roundkey_idx => roundkey_idx, -- index for selecting roundkey + roundkey => roundkey, -- key for each round + ready => key_ready); -- expansion done, roundkeys ready + + -- Signal to the top level instance for availability of key + -- maybe used to create avalon waitrequests if key is written to keyaddress + -- range while other key is still in processing + keyexp_done <= key_ready; + +------------------------------------------------------------------------------- +-- Encrypt datapath (always included) +------------------------------------------------------------------------------- + + --------------------------------------------------------------------------- + -- encryption FSM is always needed + --------------------------------------------------------------------------- + ena_encrypt <= data_stable and not decrypt_mode; + + -- Controller for encrypt + FSM_ENC : AES_FSM_ENCRYPT + generic map ( + NO_ROUNDS => NO_ROUNDS) + port map ( + clk => clk, + data_stable => ena_encrypt, + key_ready => key_ready, + round_index_out => roundkey_idx_enc, + finished => finished_enc, + round_type_sel => round_type_enc + ); + + --------------------------------------------------------------------------- + -- 4 SboxBlocks of 2 SboxM4K each for the single columns + --------------------------------------------------------------------------- + sboxROMs_enc : for i in 0 to 3 generate + HighWord : sbox + generic map ( + INVERSE => false) + port map ( + clk => clk, + address_a => addkey_out_enc(i)(31 downto 24), + address_b => addkey_out_enc(i)(23 downto 16), + q_a => sbox_out_enc(i)(31 downto 24), + q_b => sbox_out_enc(i)(23 downto 16)); + LowWord : sbox + generic map ( + INVERSE => false) + port map ( + clk => clk, + address_a => addkey_out_enc(i)(15 downto 8), + address_b => addkey_out_enc(i)(7 downto 0), + q_a => sbox_out_enc(i)(15 downto 8), + q_b => sbox_out_enc(i)(7 downto 0)); + end generate sboxROMs_enc; + + + --------------------------------------------------------------------------- + -- Shiftrow step (encryption datapath) + --------------------------------------------------------------------------- + shiftrow_enc : entity aes_ecb_lib.Shiftrow(fwd) + port map ( + state_in => sbox_out_enc, + state_out => shiftrow_out_enc + ); + + --------------------------------------------------------------------------- + -- mix column step + --------------------------------------------------------------------------- + MixColArray_enc : for i in 0 to 3 generate + mix_column_enc : entity aes_ecb_lib.Mixcol(fwd) + port map ( + col_in => shiftrow_out_enc(i), + col_out => mixcol_out_enc(i)); + end generate MixColArray_enc; + + --------------------------------------------------------------------------- + -- Multiplexer for input to AddRoundKey, depending on round_type + -- Initial round "00": directly feed data_in (data block) + -- regular round "01": feed result from mix_column + -- final round "10": skip mixcolumn and feed result from shiftrow + --------------------------------------------------------------------------- + AddKeyMuxArray_enc : for i in 0 to 3 generate + AddKeyMux : mux3 + generic map ( + IOwidth => DWORD_WIDTH) + port map ( + inport_a => data_in(i), + inport_b => mixcol_out_enc(i), + inport_c => shiftrow_out_enc(i), + selector => round_type_enc, + outport => addkey_in_enc(i)); + end generate AddKeyMuxArray_enc; + + --------------------------------------------------------------------------- + -- key addition (encrypt datapath) + --------------------------------------------------------------------------- + Keyadder_enc : AddRoundKey + port map ( + roundkey => roundkey, + cypherblock => addkey_in_enc, + result => addkey_out_enc + ); + +--------------------------------------------------------------------------- +-- Decrypt datapath +--------------------------------------------------------------------------- + decrypt_datapath : if DECRYPTION generate + --------------------------------------------------------------------------- + -- Decryption FSM + --------------------------------------------------------------------------- + ena_decrypt <= data_stable and decrypt_mode; + + FSM_DEC : AES_FSM_DECRYPT + generic map ( + NO_ROUNDS => NO_ROUNDS) + port map ( + clk => clk, + data_stable => ena_decrypt, + key_ready => key_ready, + round_index_out => roundkey_idx_dec, + finished => finished_dec, + round_type_sel => round_type_dec + ); + + --------------------------------------------------------------------------- + -- key addition (Decrypt datapath) + -- Multiplexed input on addkey (data_in or feedback) + --------------------------------------------------------------------------- + AKinputMux : for i in 0 to 3 generate + mux : Mux2 + generic map ( + IOwidth => DWORD_WIDTH) + port map ( + inport_a => data_in(i), + inport_b => sbox_out_dec(i), + selector => round_type_dec(0), + outport => addkey_in_dec(i)); + end generate AKinputMux; + + Keyadder_dec : AddRoundKey + port map ( + roundkey => roundkey, + cypherblock => addkey_in_dec, + result => addkey_out_dec + ); + --------------------------------------------------------------------------- + -- Inverse mixcolumn + --------------------------------------------------------------------------- + InverseMixCol : for i in 0 to 3 generate + mix_column_dec : entity aes_ecb_lib.Mixcol(inv) + port map ( + col_in => addkey_out_dec(i), + col_out => mixcol_out_dec(i)); + end generate InverseMixCol; + + --------------------------------------------------------------------------- + -- Inverse Shiftrow + -- multiplexed input form either addkey_out_dec during loop or mixcol_out_dec + -- when exiting loop + --------------------------------------------------------------------------- + SRinputMux : for i in 0 to 3 generate + mux : Mux2 + generic map ( + IOwidth => 32) + port map ( + inport_a => addkey_out_dec(i), + inport_b => mixcol_out_dec(i), + selector => round_type_dec(0), + outport => shiftrow_in_dec(i)); + end generate SRinputMux; + + Shiftrow_dec : entity aes_ecb_lib.Shiftrow(inv) + port map ( + state_in => shiftrow_in_dec, + state_out => shiftrow_out_dec + ); + + --------------------------------------------------------------------------- + -- 4 INVERSE SboxBlocks of 2 SboxM4K each for the single columns + --------------------------------------------------------------------------- + sboxROMs_dec : for i in 0 to 3 generate + HighWord : sbox + generic map ( + INVERSE => true) + port map ( + clk => clk, + address_a => shiftrow_out_dec(i)(31 downto 24), + address_b => shiftrow_out_dec(i)(23 downto 16), + q_a => sbox_out_dec(i)(31 downto 24), + q_b => sbox_out_dec(i)(23 downto 16)); + LowWord : sbox + generic map ( + INVERSE => true) + port map ( + clk => clk, + address_a => shiftrow_out_dec(i)(15 downto 8), + address_b => shiftrow_out_dec(i)(7 downto 0), + q_a => sbox_out_dec(i)(15 downto 8), + q_b => sbox_out_dec(i)(7 downto 0)); + end generate sboxROMs_dec; + end generate decrypt_datapath; + +end architecture arch1; Index: hdl/aes_ecb/shiftrow_inv.vhd =================================================================== --- hdl/aes_ecb/shiftrow_inv.vhd (nonexistent) +++ hdl/aes_ecb/shiftrow_inv.vhd (revision 2) @@ -0,0 +1,116 @@ +-------------------------------------------------------------------------------- +-- This file is part of the project MYPROJECTNAME +-- see: MYPROJECTURL +-- +-- description: DECRYPTION implementation of Shift row. +-- Shift Row rotates the Rows of the AES Block +-- This module takes the whole Rijdael state as input, extracts the rows, +-- shifts them and rebuilts the state. +-- +------------------------------------------------------------------------------- +-- +-- Author(s): +-- Thomas Ruschival -- ruschi@opencores.org (www.ruschival.de) +-- +-------------------------------------------------------------------------------- +-- Copyright (c) 2009, Authors and opencores.org +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- * Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- * Redistributions in binary form must reproduce the above copyright notice, +-- this list of conditions and the following disclaimer in the documentation +-- and/or other materials provided with the distribution. +-- * Neither the name of the organization nor the names of its contributors +-- may be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +-- THE POSSIBILITY OF SUCH DAMAGE +------------------------------------------------------------------------------- +-- version management: +-- $Author$ +-- $Date$ +-- $Revision$ +------------------------------------------------------------------------------- +library IEEE; +use IEEE.numeric_std.all; +use IEEE.std_logic_1164.all; + +library aes_ecb_lib; +use aes_ecb_lib.aes_ecb_pkg.all; + + +architecture inv of Shiftrow is + -- type of converting the columns into rows + subtype ROW is BYTEARRAY(0 to 3); + + -- Row signal for easier handling of the shift operations + signal row1_in : Row; -- 1st row + signal row2_in : Row; -- 2nd row + signal row3_in : Row; -- 3rd row + signal row4_in : Row; -- 4th row + -- single rows after shift operation + -- row1 of the shifted state = row1 of unshifted state + signal row2_out : Row; -- 2nd row + signal row3_out : Row; -- 3rd row + signal row4_out : Row; -- 4th row + +begin -- architecture arch1 + -- purpose: build the temorary internal signals for easier handling + -- type : combinational + -- inputs : state_in + -- outputs: state_out + build_in : process (state_in) is + begin -- process build_in + -- state is a DWORD array with 32 Byte in 4 columns + -- thus we loop through the columns and slice the column in its bytes + for col_cnt in 0 to (state_in'high) loop + row1_in(col_cnt) <= state_in(col_cnt)(31 downto 24); + row2_in(col_cnt) <= state_in(col_cnt)(23 downto 16); + row3_in(col_cnt) <= state_in(col_cnt)(15 downto 8); + row4_in(col_cnt) <= state_in(col_cnt)(7 downto 0); + end loop; -- col_cnt + end process build_in; + + + -- purpose: Undo the shifting of rows + -- type : combinational + -- inputs : row(1 to 4)_in + -- outputs: row(1 to 4)_out + shifter : process (row2_in, row3_in, row4_in) is + begin + -- row2 is always shifted by one cell + row2_out <= row2_in(row2_in'right) & row2_in(row2_in'left to row2_in'right-1); + -- row3 is shifted by two + row3_out <= row3_in(row3_in'right-1 to row3_in'right) & row3_in(row3_in'left to row3_in'right-2); + -- rotate by 3 right + row4_out <= row4_in(row4_in'right-2 to row4_in'right) & row4_in(row4_in'left to row4_in'right-3); + end process shifter; + + + -- purpose: rebuilt the state form the shifted rows + -- type : combinational + -- inputs : row1_out, row2_out, row3_out, row4_out + -- outputs: state_out + rebuilt_state : process (row1_in, row2_out, row3_out, row4_out) is + begin -- process rebuilt_state + for col_cnt in 0 to state_out'high loop -- works because 15/4=3 + state_out(col_cnt)(31 downto 24) <= row1_in(col_cnt); + state_out(col_cnt)(23 downto 16) <= row2_out(col_cnt); + state_out(col_cnt)(15 downto 8) <= row3_out(col_cnt); + state_out(col_cnt)(7 downto 0) <= row4_out(col_cnt); + end loop; -- col_cnt + end process rebuilt_state; + +end architecture inv; Index: hdl/aes_ecb/avs_aes.vhd =================================================================== --- hdl/aes_ecb/avs_aes.vhd (nonexistent) +++ hdl/aes_ecb/avs_aes.vhd (revision 2) @@ -0,0 +1,291 @@ +-------------------------------------------------------------------------------- +-- This file is part of the project MYPROJECTNAME +-- see: MYPROJECTURL +-- +-- description: +-- Avalon Slave bus interface for aes_core. Top level component to integrate +-- into SoC +-- +-- Memory address offsets: +-- 0 - 7 key +-- 8 - 11 input data if write='1', result of operation if read='1' +-- 12- 14 result of operation +-- 31 command word +-- +-- Command word bit offsets meanings: +-- Byte 3-1 reserved +-- +-- Byte 0: +-- Bit 7 key valid --> run key expansion +-- Bit 6 interrupt enabled +-- Bit 5-2 reserved +-- Bit 1 input data valid interpret as cypher text --> run decrypt mode +-- Bit 0 input data valid interpret as clear text --> run encrypt mode +-- +-- All other bits are regarded as "reserved". The bits in one byte of the +-- command word are mutually exclusive. the behavior of the core is not +-- specified if more than one bit is set. +-- +-- Author(s): +-- Thomas Ruschival -- ruschi@opencores.org (www.ruschival.de) +-- +-------------------------------------------------------------------------------- +-- Copyright (c) 2009, Authors and opencores.org +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- * Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- * Redistributions in binary form must reproduce the above copyright notice, +-- this list of conditions and the following disclaimer in the documentation +-- and/or other materials provided with the distribution. +-- * Neither the name of the organization nor the names of its contributors +-- may be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +-- THE POSSIBILITY OF SUCH DAMAGE +------------------------------------------------------------------------------- +-- version management: +-- $Author$ +-- $Date$ +-- $Revision$ +------------------------------------------------------------------------------- + + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library aes_ecb_lib; +use aes_ecb_lib.aes_ecb_pkg.all; + +entity avs_AES is + generic ( + KEYLENGTH : NATURAL := 256; -- AES key length + DECRYPTION : BOOLEAN := true); -- With decrypt or encrypt only + port ( + -- Avalon global + clk : in STD_LOGIC; -- avalon bus clock + reset : in STD_LOGIC; -- avalon bus reset + -- Interface specific + avs_s1_chipselect : in STD_LOGIC; -- enable component + avs_s1_writedata : in STD_LOGIC_VECTOR(31 downto 0); -- data write port + avs_s1_address : in STD_LOGIC_VECTOR(4 downto 0); -- slave address space offset + avs_s1_write : in STD_LOGIC; -- write enable + avs_s1_read : in STD_LOGIC; -- read request form avalon + avs_s1_irq : out STD_LOGIC; -- interrupt to signal completion + avs_s1_waitrequest : out STD_LOGIC; -- slave not ready, request master + -- to retry later + avs_s1_readdata : out STD_LOGIC_VECTOR(31 downto 0) -- result read port + ); +end entity avs_AES; + +architecture arch1 of avs_aes is +-- Signals interfacing the AES core + signal data_stable : STD_LOGIC; -- input data is valid --> process it + signal data_in : STATE; -- register for input data of core + + signal w_ena_keyword : STD_LOGIC; -- write enable of keyword to wordaddr + signal key_stable : STD_LOGIC; -- key is complete and valid, start expansion + + signal decrypt_mode : STD_LOGIC; -- decrypt='1',encrypt='0' + signal result : STATE; -- output + signal finished : STD_LOGIC; -- output valid + +-- internal logic + signal result_reg : STATE; -- register for result + signal ctrl_reg : DWORD; -- control register + signal irq : STD_LOGIC; -- internal interrupt request (register) + signal irq_i : STD_LOGIC; -- combinational value for interrupt + + signal irq_ena : STD_LOGIC; -- alias for ctrl_reg(6) + + signal w_ena_data_in : STD_LOGIC; -- write enable of data_in register + signal w_ena_ctrl_reg : STD_LOGIC; -- write enable of control register + signal keyexp_done : STD_LOGIC; -- signal to create waitrequests if new key is written while previous is still in + -- expansion +begin -- architecture arch1 + + -- map internal irq to avalon interface + avs_s1_irq <= irq; + + -- rename signals for better debugging, will be optimized away in synthesis + key_stable <= ctrl_reg(7); + irq_ena <= ctrl_reg(6); + + --------------------------------------------------------------------------- + -- depending on generic enable decrypt_mode signal or permanently disable + -- it + --------------------------------------------------------------------------- + enable_decrypt_mode : if DECRYPTION generate + decrypt_mode <= ctrl_reg(1); + data_stable <= ctrl_reg(0) or ctrl_reg(1); + end generate enable_decrypt_mode; + + disable_decrypt_mode : if not DECRYPTION generate + decrypt_mode <= '0'; + data_stable <= ctrl_reg(0); + end generate disable_decrypt_mode; + + + -- purpose: write input data to registers + -- type : sequential + -- inputs : clk + -- outputs: ctrl_reg, irq, avs_s1_readdata, key, data + write_inputs : process (clk) is + begin -- process write_inputs + if rising_edge(clk) then + -- synchronous reset + if reset = '1' then + irq <= '0'; + ctrl_reg <= (others => '0'); + end if; + -- DFF for IRQ + irq <= irq_i; + -- write control register + if w_ena_ctrl_reg = '1' then + ctrl_reg <= avs_s1_writedata; + end if; + -- write input to data register + if w_ena_data_in = '1' then + data_in(to_integer(UNSIGNED(avs_s1_address(1 downto 0)))) <= avs_s1_writedata; + end if; + + -- signalling the outside world about the terminiation of the + -- computation by blanking the data_stable register bits + if finished = '1' then + -- Work is done - reset ENC and DEC + ctrl_reg(1 downto 0) <= "00"; + end if; + end if; + end process write_inputs; + + + + -- purpose: set/reset interrupt request flag + -- type : combinational + -- inputs : finished, avs_s1_read, irq, irq_ena + -- outputs: irq_i + IRQhandling : process (avs_s1_read, finished, irq, irq_ena) is + begin -- process IRQhandling + + -- Set the interrupt if enabed and process finished + if irq_ena = '1' and finished = '1' then + irq_i <= '1'; + else + irq_i <= irq; -- just keep the way it is + end if; + + -- any read operation resets the interrupt + if irq_ena = '0' or avs_s1_read = '1' then + irq_i <= '0'; + else + irq_i <= irq; -- just keep the way it is + end if; + end process IRQhandling; + + + -- purpose: decode the write operation to the address ranges and map it to the + -- registers - any other write address range + -- e.g. avs_s1_address(4 downto 3) = "10" (result) is illegal + -- type : combinational + decode_write : process (avs_s1_address, avs_s1_write, key_stable, + keyexp_done) is + begin + -- safe default to avoid latching + w_ena_data_in <= '0'; + w_ena_ctrl_reg <= '0'; + w_ena_keyword <= '0'; + avs_s1_waitrequest <= '0'; + -- only do something if chipselect is asserted and write operation + -- requested + if avs_s1_write = '1' then + if avs_s1_address(4 downto 3) = "00" then + -- write of keywords + w_ena_keyword <= '1'; + -- stall the write process if old key is still in processing + -- the user can interrupt the expansion by deasserting key_stable + avs_s1_waitrequest <= key_stable and not keyexp_done; + elsif avs_s1_address(4 downto 3) = "01" then + -- write of data + w_ena_data_in <= '1'; + elsif avs_s1_address(4 downto 3) = "11" then + -- write of control register + w_ena_ctrl_reg <= '1'; + end if; + end if; + end process decode_write; + + + -- purpose: assign read data + -- type : + -- inputs : + -- outputs: read_data + decode_read : process (avs_s1_address, avs_s1_read, ctrl_reg, result_reg) is + begin + -- only address 0x10 to 0x1F are for read, thus address bit 4 + -- is always set when reading + if avs_s1_read = '1' and avs_s1_address(3) = '0' then + -- address looks something like 10xxx which corresponds to + -- 0x10 to 0x17, however result has only 4 words thus + -- address bits 1 and 0 are sufficient for decoding + avs_s1_readdata <= result_reg(to_integer(UNSIGNED(avs_s1_address(1 downto 0)))); + else + -- address looks something like 11xxx which corresponds to + -- 0x18 to 0x1F, in this case always map control register, + -- we have plenty of address space so currently no exact + -- addressation needed. + -- save default, if nothing else is addressed show control register + avs_s1_readdata <= ctrl_reg; + end if; + end process decode_read; + + + + -- purpose: store the combinational output of the AES core to a register + -- type : sequential + -- inputs : clk, res_n + -- outputs: result + store_result : process (clk) is + begin -- process store_result + if rising_edge(clk) then -- rising clock edge + -- Core has terminated, store the result and reset the + if finished = '1' then + result_reg <= result; + end if; + end if; + end process store_result; + + + --------------------------------------------------------------------------- + -- Instance of the core + --------------------------------------------------------------------------- + AES_CORE_1 : AES_CORE + generic map ( + KEYLENGTH => KEYLENGTH, -- Size of keyblock (128, 192, 256 Bits) + DECRYPTION => DECRYPTION) -- include decrypt datapath + port map ( + clk => clk, -- system clock + data_in => data_in, -- payload to encrypt + data_stable => data_stable, -- flag valid payload + keyword => avs_s1_writedata, -- word of original userkey + keywordaddr => avs_s1_address(2 downto 0), -- keyword register address + w_ena_keyword => w_ena_keyword, -- write enable of keyword to wordaddr + key_stable => key_stable, -- key is complete and valid, start expansion + decrypt_mode => decrypt_mode, -- decrypt='1',encrypt='0' + keyexp_done => keyexp_done, -- key is completely expanded + result => result, -- output + finished => finished); -- output valid + +end architecture arch1; Index: hdl/aes_ecb/aes_fsm_encrypt.vhd =================================================================== --- hdl/aes_ecb/aes_fsm_encrypt.vhd (nonexistent) +++ hdl/aes_ecb/aes_fsm_encrypt.vhd (revision 2) @@ -0,0 +1,174 @@ +------------------------------------------------------------------------------- +-- This file is part of the project MYPROJECTNAME +-- see: MYPROJECTURL +-- +-- description: +-- Statemachine controlling the encryption datapath within aes_core.vhd does no +-- dataprocessing itself but only set enables and multiplexer selector ports +-- +-- Author(s): +-- Thomas Ruschival -- ruschi@opencores.org (www.ruschival.de) +-- +-------------------------------------------------------------------------------- +-- Copyright (c) 2009, Thomas Ruschival +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- * Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- * Redistributions in binary form must reproduce the above copyright notice, +-- this list of conditions and the following disclaimer in the documentation +-- and/or other materials provided with the distribution. +-- * Neither the name of the nor the names of its contributors +-- may be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +-- THE POSSIBILITY OF SUCH DAMAGE +------------------------------------------------------------------------------- +-- version management: +-- $Author$ +-- $Date$ +-- $Revision$ +------------------------------------------------------------------------------- + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +library aes_ecb_lib; +use aes_ecb_lib.aes_ecb_pkg.all; + +entity aes_fsm_encrypt is + generic ( + NO_ROUNDS : NATURAL := 10); -- number of rounds + port ( + clk : in STD_LOGIC; -- System clock + data_stable : in STD_LOGIC; -- flag valid data/activate the process + -- interface for keygenerator + key_ready : in STD_LOGIC; -- flag valid roundkeys + round_index_out : out NIBBLE; -- address for roundkeys memory + -- Result of Process + finished : out STD_LOGIC; -- flag valid result + -- Control ports for the Core + round_type_sel : out STD_LOGIC_VECTOR(1 downto 0) -- selector for mux around mixcols + ); +end entity aes_fsm_encrypt; + +-- +architecture Arch1 of AES_FSM_ENCRYPT is + -- types for the FSM + type AESstates is (WAIT_KEY, WAIT_DATA, INITIAL_ROUND, DO_ROUND, FINAL_ROUND); + + -- FSM signals + signal FSM : AESstates; -- current state + signal next_FSM : AESstates; -- combinational next state + + -- Round Counter & address for keygenerate + signal round_index : NIBBLE; -- currently processed round + signal next_round_index : NIBBLE; -- next round, index for keygenerate + +begin + --------------------------------------------------------------------------- + -- assign internal values to interface ports + --------------------------------------------------------------------------- + round_index_out <= next_round_index; -- roundkey address + + -- purpose: combinational generation of next state for encrytion FSM + -- type : sequential + -- inputs : FSM, data_stable, key_ready, round_index + -- outputs: next_FSM + gen_next_fsm : process (FSM, data_stable, key_ready, round_index) is + begin -- process gen_next_fsm + case FSM is + when WAIT_KEY => + if key_ready = '1' then + next_FSM <= WAIT_DATA; + else + next_FSM <= WAIT_KEY; + end if; + when WAIT_DATA => + if data_stable = '1' then + next_FSM <= INITIAL_ROUND; + else + next_FSM <= WAIT_DATA; + end if; + when INITIAL_ROUND => + next_FSM <= DO_ROUND; + when DO_ROUND => + if round_index = STD_LOGIC_VECTOR(to_unsigned(NO_ROUNDS-1, 4)) then + next_FSM <= FINAL_ROUND; + else + next_FSM <= DO_ROUND; + end if; + when FINAL_ROUND => + next_FSM <= WAIT_DATA; + -- pragma synthesis_off + when others => + report "FSM in strange state - aborting" severity error; + next_FSM <= WAIT_KEY; + -- pragma synthesis_on + end case; + + -- Default behaviour in case key is invalid + if key_ready = '0' then + next_FSM <= WAIT_KEY; + end if; + + end process gen_next_fsm; + + + -- purpose: assign outputs for encryption + -- type : combinational + -- inputs : FSM + com_output_assign : process (FSM, round_index) is + begin -- process com_output_assign + -- save defaults for encrypt_FSM + round_type_sel <= "00"; -- signal initial_round + next_round_index <= round_index; + finished <= '0'; + + case FSM is + when WAIT_KEY => + next_round_index <= X"0"; + when WAIT_DATA => + next_round_index <= X"0"; + when INITIAL_ROUND => + round_type_sel <= "00"; -- data_in as input to AddKey + -- data is stable, FSM will switch to DO_ROUND in next cycle + next_round_index <= X"1"; -- start DO_ROUND with 1st expanded key + when DO_ROUND => + round_type_sel <= "01"; + next_round_index <= STD_LOGIC_VECTOR(UNSIGNED(round_index)+1); + when FINAL_ROUND => + -- select signal around mixcols + round_type_sel <= "10"; + next_round_index <= X"0"; + finished <= '1'; + when others => + null; + end case; + end process com_output_assign; + + -- purpose: clocked FSM for encryption + -- type : sequential + -- inputs : clk, res_n + clocked_FSM : process (clk) is + begin -- process clocked_FSM + if rising_edge(clk) then -- rising clock edge + FSM <= next_FSM; + round_index <= next_round_index; + end if; + end process clocked_FSM; + +end architecture Arch1; Index: hdl/aes_ecb/aes_ecb_pkg.vhd =================================================================== --- hdl/aes_ecb/aes_ecb_pkg.vhd (nonexistent) +++ hdl/aes_ecb/aes_ecb_pkg.vhd (revision 2) @@ -0,0 +1,386 @@ +------------------------------------------------------------------------------- +-- This file is part of the project MYPROJECTNAME +-- see: MYPROJECTURL +-- +-- description: +-- Central file for definition of types and global functions for handling of +-- datatypes and generics. All components are defined here. +-- +-- Author(s): +-- Thomas Ruschival -- ruschi@opencores.org (www.ruschival.de) +-- +-------------------------------------------------------------------------------- +-- Copyright (c) 2009, Thomas Ruschival +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- * Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- * Redistributions in binary form must reproduce the above copyright notice, +-- this list of conditions and the following disclaimer in the documentation +-- and/or other materials provided with the distribution. +-- * Neither the name of the nor the names of its contributors +-- may be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +-- THE POSSIBILITY OF SUCH DAMAGE +------------------------------------------------------------------------------- +-- version management: +-- $Author$ +-- $Date$ +-- $Revision$ +------------------------------------------------------------------------------- + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +package aes_ecb_pkg is + -- tiny 4 bit value + constant NIBBLE_WIDTH : NATURAL := 4; + subtype NIBBLE_RANGE is NATURAL range NIBBLE_WIDTH-1 downto 0; + subtype NIBBLE is STD_LOGIC_VECTOR(NIBBLE_RANGE); + + -- type definition byte: 8 bit = byte (cell of the + -- state) + constant BYTE_WIDTH : NATURAL := 8; + subtype BYTE_RANGE is NATURAL range BYTE_WIDTH-1 downto 0; + subtype BYTE is STD_LOGIC_VECTOR(BYTE_RANGE); + + -- Type definition word: 16 bit = word + constant WORD_WIDTH : NATURAL := 16; + subtype WORD_RANGE is NATURAL range WORD_WIDTH-1 downto 0; + subtype WORD is STD_LOGIC_VECTOR(WORD_RANGE); -- storage type "word" + + -- type definition Dword: 32 bit = dword + constant DWORD_WIDTH : NATURAL := 32; + subtype DWORD_RANGE is NATURAL range DWORD_WIDTH-1 downto 0; + subtype DWORD is STD_LOGIC_VECTOR(DWORD_RANGE); + + -- type definition Qword: 64 bit = qword + constant QWORD_WIDTH : NATURAL := 64; + subtype QWORD_RANGE is NATURAL range QWORD_WIDTH-1 downto 0; + subtype QWORD is STD_LOGIC_VECTOR(QWORD_RANGE); + + + --------------------------------------------------------------------------- + -- aggregates of Signals + --------------------------------------------------------------------------- + -- array of 64 bit words + type QWORDARRAY is array (NATURAL range <>) of QWORD; + -- array of 32 bit words + type DWORDARRAY is array (NATURAL range <>) of DWORD; + -- array of 16 bit words + type WORDARRAY is array (NATURAL range <>) of WORD; + -- array of 8 bit words + type BYTEARRAY is array (NATURAL range <>) of BYTE; + -- array of NATURALS + type NATURALARRAY is array (NATURAL range <>) of NATURAL; + -- array of integers + type INTEGERARRAY is array (NATURAL range <>) of INTEGER; + + -- Byte Matrix + type BYTEMATRIX is array (NATURAL range <>, NATURAL range <>) of BYTE; + + + + --------------------------------------------------------------------------- + -- types for signal mnemonics + --------------------------------------------------------------------------- + type ACCESS_MODE is (W , R); -- Modes how memory can be accessed + type CRYPTODIRECTION is (encrypt, decrypt); -- Switch to encrypt or decrypt + + --------------------------------------------------------------------------- + -- constants for convienience + --------------------------------------------------------------------------- + constant NULL_QWORD : QWORD := (others => '0'); -- Qword to clear memory + constant NULL_DWORD : DWORD := (others => '0'); -- Dword to clear memory + constant NULL_WORD : WORD := (others => '0'); -- word to clear memory + constant NULL_BYTE : BYTE := (others => '0'); -- byte to clear memory + + + + + + -- The state type is the matrix unfolded into a linear representation + -- the length of a column is always fixed so every 32 Bit of this vector + -- represents a column of the state + -- + -- once and for all: THE COLUMNS STAND WITH THE MSB (Bit 31) AT THE TOP!! + -- => cell0, cell4, cell8... are byte0 of the column + -- + -- state: ==> BYTEARRAY (0 to (BLOCKLENGTH/8)-1); + -- cell0 cell4 ... + -- cell1 cell5 ... ==> cell0,cell1,cell2,cell3,cell4,cell5.... + -- cell2 cell6 ... ^ ^-bit[8] + -- cell3 ... ... ^-bit[0] + subtype STATE is DWORDARRAY (0 to 3); +-- alias KEYBLOCK is STATE; +-- DUMB xilinx compiler does not know aliases for subtypes..... + subtype KEYBLOCK is DWORDARRAY (0 to 3); + + + -- Round constants for XOR in Keygenerator + constant ROUNDCONSTANTS : BYTEARRAY(0 to 15) := (X"00", X"01", X"02", X"04", X"08", X"10", X"20", X"40", + X"80", X"1B", X"36", X"6C", X"D8", X"AB", X"4D", X"9A"); + +------------------------------------------------------------------------------- +-- General (useful) Components +------------------------------------------------------------------------------- + --------------------------------------------------------------------------- + -- register word with variable width + --------------------------------------------------------------------------- + component memory_word + generic ( + IOwidth : POSITIVE := 1 -- width of register + ); + port ( + data_in : in STD_LOGIC_VECTOR (IOwidth-1 downto 0); -- input + data_out : out STD_LOGIC_VECTOR (IOwidth-1 downto 0); -- output + res_n : in STD_LOGIC; -- system reset active low + ena : in STD_LOGIC; -- enable write + clk : in STD_LOGIC -- system clock + ); + end component; + + + --------------------------------------------------------------------------- + -- 2:1 STD_LOGIC_VECTOR multiplexer + --------------------------------------------------------------------------- + component mux2 + generic ( + IOwidth : POSITIVE := 1 -- width of I/O ports + ); + port ( + inport_a : in STD_LOGIC_VECTOR (IOwidth-1 downto 0); -- port 1 + inport_b : in STD_LOGIC_VECTOR (IOwidth-1 downto 0); -- port 2 + selector : in STD_LOGIC; -- switch TO select ports + outport : out STD_LOGIC_VECTOR (IOwidth-1 downto 0) -- output + ); + end component; + + --------------------------------------------------------------------------- + -- 3:1 multiplexer + --------------------------------------------------------------------------- + component mux3 + generic ( + IOwidth : POSITIVE := 1 -- width of I/O ports + ); + port ( + inport_a : in STD_LOGIC_VECTOR (IOwidth-1 downto 0); -- port 1 + inport_b : in STD_LOGIC_VECTOR (IOwidth-1 downto 0); -- port 2 + inport_c : in STD_LOGIC_VECTOR (IOwidth-1 downto 0); -- port 3 + selector : in STD_LOGIC_VECTOR(1 downto 0); -- switch TO select ports + outport : out STD_LOGIC_VECTOR (IOwidth-1 downto 0) -- output + ); + end component; + + +--------------------------------------------------------------------------- +-- Components relevant for AES_ECB +--------------------------------------------------------------------------- + component AddRoundKey + port ( + roundkey : in KEYBLOCK; -- Roundkey + cypherblock : in STATE; -- State for this round + result : out STATE + ); + end component; + + --------------------------------------------------------------------------- + -- FSM that controls the dataflow of AES_ECB encryption + --------------------------------------------------------------------------- + component AES_FSM_ENCRYPT is + generic ( + NO_ROUNDS : NATURAL := 10); -- number of rounds + port ( + clk : in STD_LOGIC; -- System clock + data_stable : in STD_LOGIC; -- flag valid data/activate the process + -- interface for keygenerator + key_ready : in STD_LOGIC; -- flag valid roundkeys + round_index_out : out NIBBLE; -- address for roundkeys memory + -- Result of Process + finished : out STD_LOGIC; -- flag valid result + -- Control ports for the Core + round_type_sel : out STD_LOGIC_VECTOR(1 downto 0) -- selector for mux around mixcols + ); + end component; + + --------------------------------------------------------------------------- + -- FSM that controls the dataflow of AES_ECB decryption + --------------------------------------------------------------------------- + component AES_FSM_DECRYPT is + generic ( + NO_ROUNDS : NATURAL := 10); -- number of rounds + port ( + clk : in STD_LOGIC; -- System clock + data_stable : in STD_LOGIC; -- flag valid data/activate the process + -- interface for keygenerator + key_ready : in STD_LOGIC; -- flag valid roundkeys + round_index_out : out NIBBLE; -- address for roundkeys memory + -- Result of Process + finished : out STD_LOGIC; -- flag valid result + -- Control ports for the Core + round_type_sel : out STD_LOGIC_VECTOR(1 downto 0) -- selector for mux around mixcols + ); + end component; + + + --------------------------------------------------------------------------- + -- Mixcolumn component + -- (has 2 architectures inverse and forward) + --------------------------------------------------------------------------- + component Mixcol is + port ( + col_in : in DWORD; -- one column of the state + col_out : out DWORD); -- output column + end component Mixcol; + + --------------------------------------------------------------------------- + -- Sbox component + -- The interface is 2x8Bit because Altera megafunction is supposed to be at max + -- 8Bit dual port ROM (and I relied on a altera quartus generated component + -- before) see architecture m4k + ------------------------------------------------------------------------------- + component sbox is + generic ( + INVERSE : BOOLEAN); -- is this the inverse or the forward + -- lookup table. + -- TRUE -> inverse sbox + -- FALSE -> forward sbox + port ( + clk : in STD_LOGIC; -- system clock + address_a : in STD_LOGIC_VECTOR (7 downto 0); -- 1st byte + address_b : in STD_LOGIC_VECTOR (7 downto 0); -- 2nd byte + q_a : out STD_LOGIC_VECTOR (7 downto 0); -- substituted 1st byte + q_b : out STD_LOGIC_VECTOR (7 downto 0)); -- substituted 2nd byte + end component sbox; + + + --------------------------------------------------------------------------- + -- Encrypt version of Shiftrow component + -- (has 2 architectures inverse and forward) + --------------------------------------------------------------------------- + component Shiftrow + port ( + state_in : in STATE; -- Raw input data TO be shifted + state_out : out STATE -- shifted result + ); + end component; + + --------------------------------------------------------------------------- + -- Keykenerator for roundkeys + --------------------------------------------------------------------------- + component keyexpansionV2 is + generic ( + KEYLENGTH : NATURAL); -- Size of keyblock (128, 192, 256 Bits) + port ( + clk : in STD_LOGIC; -- system clock + keyword : in DWORD; -- word of original userkey + keywordaddr : in STD_LOGIC_VECTOR(2 downto 0); -- keyword register address + w_ena_keyword : in STD_LOGIC; -- write enable of keyword to wordaddr + key_stable : in STD_LOGIC; -- key is completa and valid, start expansion + roundkey_idx : in NIBBLE; -- index for selecting roundkey + roundkey : out KEYBLOCK; -- key for each round + ready : out STD_LOGIC); -- expansion done, roundkeys ready + end component keyexpansionV2; + + + --------------------------------------------------------------------------- + -- Keykenerator for roundkeys + --------------------------------------------------------------------------- + component keygenerator is + generic ( + KEYLENGTH : NATURAL := 128; -- Size of keyblock (128, 192, 256 Bits) + NO_ROUNDS : NATURAL := 10 -- how many rounds + ); + port ( + clk : in STD_LOGIC; -- system clock + initialkey : in KEYBLOCK; -- original userkey + key_stable : in STD_LOGIC; -- signal for enabling write of initial + -- key and signal valid key + -- ena=0->blank_key + round : in NIBBLE; -- index for selecting roundkey + roundkey : out KEYBLOCK; -- key for each round + ready : out STD_LOGIC + ); + end component; + + + + --------------------------------------------------------------------------- + -- Complete Core implementation + --------------------------------------------------------------------------- + component AES_CORE is + generic ( + KEYLENGTH : NATURAL; -- Size of keyblock (128, 192, 256 Bits) + DECRYPTION : BOOLEAN); -- include decrypt datapath + port ( + clk : in STD_LOGIC; -- system clock + data_in : in STATE; -- payload to encrypt + data_stable : in STD_LOGIC; -- flag valid payload + keyword : in DWORD; -- word of original userkey + keywordaddr : in STD_LOGIC_VECTOR(2 downto 0); -- keyword register address + w_ena_keyword : in STD_LOGIC; -- write enable of keyword to wordaddr + key_stable : in STD_LOGIC; -- key is complete and valid, start expansion + decrypt_mode : in STD_LOGIC; -- decrypt='1',encrypt='0' + keyexp_done : out STD_LOGIC; -- keyprocessing is done + result : out STATE; -- output + finished : out STD_LOGIC); -- output valid + end component AES_CORE; + --------------------------------------------------------------------------- + -- function to calculate number of rounds based on keylength, returns + -- either 10,12 or 14 + --------------------------------------------------------------------------- + function lookupRounds (keylen : in NATURAL) return NATURAL; + + --------------------------------------------------------------------------- + -- Functions for convinience + --------------------------------------------------------------------------- + -- modulo additon DWORD+DWORD=DWORD + function "+" (left, right : in DWORD) return DWORD; + +end package aes_ecb_pkg; + +package body aes_ecb_pkg is + + --------------------------------------------------------------------------- + -- function to calculate number of rounds based on keylength, returns + -- either 10,12 or 14 + --------------------------------------------------------------------------- + function lookupRounds(keylen : in NATURAL) return NATURAL is + begin + assert (keylen = 128 or keylen = 192 or keylen = 256) + report "Wrong KEYLENGTH parameter" severity failure; + if keylen = 128 then + return 10; + elsif keylen = 192 then + return 12; + elsif keylen = 256 then + return 14; + else + return 0; + end if; + end; + + -- modulo additon DWORD+DWORD=DWORD + function "+" (left, right : in DWORD) return DWORD + is + variable result : UNSIGNED(DWORD_RANGE); + begin + result := UNSIGNED(left) + UNSIGNED(right); + return STD_LOGIC_VECTOR(result); + end function; + +end package body aes_ecb_pkg; Index: hdl/aes_ecb/keyexpansionV2.vhd =================================================================== --- hdl/aes_ecb/keyexpansionV2.vhd (nonexistent) +++ hdl/aes_ecb/keyexpansionV2.vhd (revision 2) @@ -0,0 +1,453 @@ +-------------------------------------------------------------------------------- +-- This file is part of the project MYPROJECTNAME +-- see: MYPROJECTURL +-- +-- description: hardware keyexpansion core. +------------------------------------------------------------------------------- +-- Generates all roundkeys for the AES algorithm. in each round on key is used +-- to XOR with the round data, e.g. the state. because this is for encryption +-- of multiple plaintext blocks always the same roundkey sequence the keys are +-- stored until a new key is provided. +-- Starting from an initial 128, 192 or 256 Bit key (table of 4,6 or eight +-- columns = i) the sucessive roundkeys are calculated in the following way: +-- 1.) The 1st round is done with the initial key with the dwords dw[0] to +-- dw[i-1] +-- 2.) dw[n*i] is build through rotating dw[i-1] 1 left, Substituting its +-- contents with the Sbox function, the result then is XORed with +-- roundconstant[n] and it is again XORed with dw[(n-1)i]. +------------------------------------------------------------------------------- +-- TODO: Implement another copy of this as wrapper to RAM to enable software +-- keyexpanion +-- +-- +-- Author(s): +-- Thomas Ruschival -- ruschi@opencores.org (www.ruschival.de) +-- +-------------------------------------------------------------------------------- +-- Copyright (c) 2009, Authors and opencores.org +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- * Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- * Redistributions in binary form must reproduce the above copyright notice, +-- this list of conditions and the following disclaimer in the documentation +-- and/or other materials provided with the distribution. +-- * Neither the name of the organization nor the names of its contributors +-- may be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +-- THE POSSIBILITY OF SUCH DAMAGE +------------------------------------------------------------------------------- +-- version management: +-- $Author$ +-- $Date$ +-- $Revision$ +------------------------------------------------------------------------------- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library aes_ecb_lib; +use aes_ecb_lib.aes_ecb_pkg.all; + +entity keyexpansionV2 is + generic ( + KEYLENGTH : NATURAL := 128 -- Size of keyblock (128, 192, 256 Bits) + ); + port ( + clk : in STD_LOGIC; -- system clock + keyword : in DWORD; -- word of original userkey + keywordaddr : in STD_LOGIC_VECTOR(2 downto 0); -- keyword register address + w_ena_keyword : in STD_LOGIC; -- write enable of keyword to wordaddr + key_stable : in STD_LOGIC; -- key is completa and valid, start expansion + -- key_stable=0-> invalidate key + roundkey_idx : in NIBBLE; -- index for selecting roundkey + roundkey : out KEYBLOCK; -- key for each round + ready : out STD_LOGIC -- expansion done, roundkeys ready + ); + -- number of rounds, needed for looping + constant NO_ROUNDS : NATURAL := lookupRounds(KEYLENGTH); + -- Number of columns in user key: 4,6, or 8 + constant Nk : NATURAL := KEYLENGTH/DWORD_WIDTH; + -- Number of interations + constant LOOP_BOUND : NATURAL := 4*NO_ROUNDS; +end entity keyexpansionV2; + + +architecture ach1 of keyexpansionV2 is + + -- Round constants for XOR i/Nk is max 10 for Nk=4 + constant GF_ROUNDCONSTANTS_4_6 : BYTEARRAY(0 to 10) := + (X"01", X"02", X"04", X"08", X"10", X"20", X"40", X"80", X"1B", X"36", X"6C"); + -- keep quartus from complaining about "index not wide enough for all + -- elements in the array" i/Nk is max 7 for Nk=8 + constant GF_ROUNDCONSTANTS_8 : BYTEARRAY(0 to 7) := + (X"01", X"02", X"04", X"08", X"10", X"20", X"40", X"80"); + signal roundconstant : BYTE; + + -- memory for roundkeys + type MEMORY_128 is array (0 to 15) of STD_LOGIC_VECTOR(127 downto 0); + signal KEYMEM : MEMORY_128; + + -- key memory signals + signal mem_in : STD_LOGIC_VECTOR(127 downto 0); -- in port for keymemory + signal mem_out : STD_LOGIC_VECTOR(127 downto 0); -- out port of keymemory + signal keymem_addr : UNSIGNED(3 downto 0); -- address of RAM + signal w_ena_keymem : STD_LOGIC; -- write enable to keymemory + -- write address for keymemory + signal w_addr : UNSIGNED(3 downto 0); -- register + signal next_w_addr : UNSIGNED(3 downto 0); -- combinational next value + + -- Interconnect for shiftregister + signal keyshiftreg_in : DWORDARRAY(Nk-1 downto 0); -- input from multiplexers + signal keyshiftreg_out : DWORDARRAY(Nk-1 downto 0); -- output + signal keyshiftreg_ena : STD_LOGIC_VECTOR(7 downto 0); -- enable of single registers + -- Selector for Load multiplexer, only select keyword to be written to + -- shiftreg if key_stable is deasserted loadmux_sel <= not key_stable + signal loadmux_sel : STD_LOGIC; + + --------------------------------------------------------------------------- + -- datapath expansion algorithm + --------------------------------------------------------------------------- + signal exp_in : DWORD; -- in for expansion logic (w[i-1]) + signal rot_out : DWORD; -- rotated column (in to sbox) + signal to_sbox : DWORD; -- substituted key column (out from sbox) + signal from_sbox : DWORD; -- substituted key column (out from sbox) + signal delayed_col : DWORD; -- delayed unprocessed key column w[i-1] | imod4/=0 + signal XorRcon_out : DWORD; -- rotated,substituted,XORed with Rcon column w[i-1]|imod4=0 + signal mux_processed : DWORD; -- multiplexed delayed_col or XorRcon_out + signal Xor_lastblock_in : DWORD; -- input for w[i-1] XOR w[i-Nk] + signal last_word : DWORD; -- result of expansion w[i] --> w[i-1] for next round + + --------------------------------------------------------------------------- + -- Controller signals + --------------------------------------------------------------------------- + signal first_round : STD_LOGIC; -- selector Mux_input only '0' in first round + signal shift_ena : STD_LOGIC; -- enable shift of register bank w[i-1] to w[i-Nk] + signal imodNk0 : STD_LOGIC; -- mux selector delayed_col or XorRcon_out if imodNk=0 + -- Special logic for Nk=8 256 Bit key + signal imod84 : STD_LOGIC; -- mux selector around Rotate to substitute if imod8=4 + -- Statemachine + type KEYEXPANSIONSTATES is (INIT, SUBSTITUTE, SHIFT, WRITELAST, DONE); + signal expState : KEYEXPANSIONSTATES; -- register value + signal next_expState : KEYEXPANSIONSTATES; -- combinational next value + -- counter for expanded keywords (max Nk*(Nr+1)=4*(14+1)) + signal i : UNSIGNED(5 downto 0); -- register + signal next_i : UNSIGNED(5 downto 0); -- combinational next value + +begin -- architecture ach1 + +------------------------------------------------------------------------------- +-- Key load and shift register datapath +------------------------------------------------------------------------------- + loadmux_sel <= not key_stable; + + Shiftreg : for i in 0 to Nk-1 generate + -- ordinary words are regular shift registers + rest_of_shiftreg : if i /= Nk-1 generate + loadmux : Mux2 + generic map ( + IOwidth => DWORD_WIDTH) + port map ( + inport_a => keyshiftreg_out(i+1), + inport_b => keyword, + selector => loadmux_sel, + outport => keyshiftreg_in(i)); + keywordregister : memory_word + generic map ( + IOwidth => DWORD_WIDTH) + port map ( + data_in => keyshiftreg_in(i), + data_out => keyshiftreg_out(i), + res_n => '1', + clk => clk, + ena => keyshiftreg_ena(i)); + end generate; + -- last word is different: here result from last expansion round is + -- shifted in + lastDWORD : if i = Nk-1 generate + lastw_loadmux : Mux2 + generic map ( + IOwidth => DWORD_WIDTH) + port map ( + inport_a => last_word, -- loopback form expansion logic + inport_b => keyword, + selector => loadmux_sel, + outport => keyshiftreg_in(i)); + + last_keywordreg : memory_word + generic map ( + IOwidth => DWORD_WIDTH) + port map ( + data_in => keyshiftreg_in(i), + data_out => keyshiftreg_out(i), + res_n => '1', + clk => clk, + ena => keyshiftreg_ena(i)); + end generate lastDWORD; + end generate Shiftreg; + + -- Lower 4 Keywords will be written to key ram + mem_in <= keyshiftreg_out(0) &keyshiftreg_out(1) & keyshiftreg_out(2) & keyshiftreg_out(3); + -- map memory port to a nice state + roundkey <= (0 => mem_out(127 downto 96), + 1 => mem_out(95 downto 64), + 2 => mem_out(63 downto 32), + 3 => mem_out(31 downto 0)); + + -- purpose: represent ram for storage of roundkeys (DP ram should be inferred) + -- type : sequential + -- inputs : clk, res_n + -- outputs: mem_out + keymemory : process (clk) is + begin -- process keymemory + if rising_edge(clk) then -- rising clock edge + if w_ena_keymem = '1' then + KEYMEM(to_integer(w_addr)) <= mem_in; + end if; + mem_out <= KEYMEM(to_integer(UNSIGNED(roundkey_idx))); + end if; + end process keymemory; + + + -- purpose: set the respective enable bits for each register if either registes must be shifted + -- right. only enable external write if key_stable='0' + -- or are loaded with userkey + -- type : combinational + -- inputs : w_ena_keyword, shift_ena,keywordaddr + -- outpukeyshiftreg_ena + enableRegs : process (key_stable, keywordaddr, shift_ena, w_ena_keyword) is + begin -- process enableRegs + -- default: freeze the registers + keyshiftreg_ena <= (others => '0'); + -- if words are loaded externally only enable register for respective address + -- words must only be written if key_stable is not asserted and + -- therefore the FSM is in INIT state + if w_ena_keyword = '1' and key_stable = '0' then + keyshiftreg_ena(to_integer(UNSIGNED(keywordaddr))) <= '1'; + -- if register shall be shifted, enable all + elsif shift_ena = '1' then + keyshiftreg_ena <= (others => '1'); + end if; + end process enableRegs; + + -- purpose: write combinational next_write address to register + -- type : sequential + -- inputs : clk, next_w_addr + -- outputs: w_addr + address_incr : process (clk) is + begin -- process address_incr + if rising_edge(clk) then -- rising clock edge + w_addr <= next_w_addr; + end if; + end process address_incr; + + +------------------------------------------------------------------------------- +-- Expansion Datapath +------------------------------------------------------------------------------- + + --------------------------------------------------------------------------- + -- Rotate left the key column a1,a2,a3,a4 --> a2,a3,4,a1 + --------------------------------------------------------------------------- + rot_out <= keyshiftreg_out(Nk-1)(23 downto 0) & keyshiftreg_out(Nk-1)(31 downto 24); + + --------------------------------------------------------------------------- + -- Special datapath for 256Bit key (Nk=8) if imodNk=4 to + -- substitute w[i-1] + --------------------------------------------------------------------------- + NK8_sboxin : if KEYLENGTH = 256 generate + Nk8_sboxmux : mux2 + generic map ( + IOwidth => 32) + port map ( + inport_a => rot_out, + inport_b => keyshiftreg_out(Nk-1), + selector => imod84, + outport => to_sbox); + + -- Logic to switch the multiplexer + imod84 <= '1' when (i mod 8 = 4) else '0'; + end generate NK8_sboxin; + + + regular_sboxin : if KEYLENGTH /= 256 generate + to_sbox <= rot_out; + end generate regular_sboxin; + + --------------------------------------------------------------------------- + -- Keygenerate gets its own sboxes to substitute columns to define clear + -- interface and increase f_max as this was on the critical path while + -- shared with aes_core_encrypt + --------------------------------------------------------------------------- + HighWord : sbox + generic map ( + INVERSE => false) + port map ( + clk => clk, + address_a => to_sbox(31 downto 24), + address_b => to_sbox(23 downto 16), + q_a => from_sbox(31 downto 24), + q_b => from_sbox(23 downto 16)); + LowWord : sbox + generic map ( + INVERSE => false) + port map ( + clk => clk, + address_a => to_sbox(15 downto 8), + address_b => to_sbox(7 downto 0), + q_a => from_sbox(15 downto 8), + q_b => from_sbox(7 downto 0)); + + --------------------------------------------------------------------------- + -- Xor column with Roundconstant[i/Nk], make it 32 BIT + --------------------------------------------------------------------------- + XorRcon_out <= from_sbox xor (roundconstant & X"000000"); + + --------------------------------------------------------------------------- + -- select intermediate result of processed w[i-1] either direct or + -- processed with Sub(Rot(W[i-1]) XOR roundconstant if i mod Nk = 0 + --------------------------------------------------------------------------- + Mux_wi_1 : mux2 + generic map ( + IOwidth => DWORD_WIDTH) + port map ( + inport_a => keyshiftreg_out(Nk-1), + inport_b => XorRcon_out, + selector => imodNk0, + outport => mux_processed); + -- Logic to switch the multiplexer + imodNk0 <= '1' when (i mod Nk = 0) else '0'; + + --------------------------------------------------------------------------- + -- Special datapath for 256Bit key (Nk=8) if imodNk=4 to + -- substitute w[i-1] + --------------------------------------------------------------------------- + NK8_wi_1 : if KEYLENGTH = 256 generate + Nk8_mux_wi_1 : mux2 + generic map ( + IOwidth => 32) + port map ( + inport_a => mux_processed, + inport_b => from_sbox, + selector => imod84, + outport => Xor_lastblock_in); + end generate NK8_wi_1; + + + regular_wi_1 : if KEYLENGTH /= 256 generate + Xor_lastblock_in <= mux_processed; + end generate regular_wi_1; + + --------------------------------------------------------------------------- + -- Xor currently processed column w[i-1] with w[i-Nk] + --------------------------------------------------------------------------- + last_word <= Xor_lastblock_in xor keyshiftreg_out(0); + + +------------------------------------------------------------------------------- +-- Controller for keyexpansion algorithm +------------------------------------------------------------------------------- + + -- purpose: Compute the next state of keyexpansion FSM + -- type : combinational + -- inputs : expState, i, key_stable + -- outputs: next_expState + nextState : process (expState, i, key_stable) is + begin + -- Save defaults to avoid latches + next_expState <= expState; + -- FSM + case expState is + when INIT => + if key_stable = '1' then + next_expState <= SUBSTITUTE; + end if; + when SUBSTITUTE => + next_expState <= SHIFT; + when SHIFT => + if i = LOOP_BOUND then + next_expState <= DONE; + else + next_expState <= SUBSTITUTE; + end if; + when WRITELAST => + next_expState <= DONE; + when DONE => + -- just stay + next_expState <= expState; + end case; + -- reset the process whenever key is invalid + if key_stable = '0' then + next_expState <= INIT; + end if; + end process nextState; + + -- purpose: assign signals according to input and current state + -- type : combinational + -- inputs : expState, i + -- outputs: shift_ena, next_i, ready + stateToOutput : process (expState, i, w_addr) is + begin + -- Save defaults to avoid latches + shift_ena <= '0'; + next_i <= i; + ready <= '0'; + w_ena_keymem <= '0'; + next_w_addr <= w_addr; + case expState is + when INIT => + -- reset all variables to defined state + next_i <= (others => '0'); + next_w_addr <= (others => '0'); + when SUBSTITUTE => + -- Substitute is a mere wait state for 1 cycle until SBOX has done + -- the lookup + null; + when SHIFT => + next_i <= i+1; + shift_ena <= '1'; + if (i mod 4 = 0) then + w_ena_keymem <= '1'; + next_w_addr <= w_addr+1; + end if; + when WRITELAST => + w_ena_keymem <= '1'; + next_w_addr <= w_addr+1; + when DONE => + ready <= '1'; + when others => null; + end case; + end process stateToOutput; + + -- purpose: write state and variables to registers + -- type : sequential + -- inputs : clk, res_n + -- outputs: + registeredFSMsignals : process (clk) is + begin -- process registeredFSMsignals + if rising_edge(clk) then -- rising clock edge + i <= next_i; + expState <= next_expState; + if Nk = 8 then + roundconstant <= GF_ROUNDCONSTANTS_8(to_integer(i)/Nk); + else +-- TODO : avoid divide operator, error when compiling with Nk=6 anx ISE 10.1 + roundconstant <= GF_ROUNDCONSTANTS_4_6(to_integer(i)/Nk); + end if; + end if; + end process registeredFSMsignals; + +end architecture ach1; Index: hdl/aes_ecb/sboxM4k.vhd =================================================================== --- hdl/aes_ecb/sboxM4k.vhd (nonexistent) +++ hdl/aes_ecb/sboxM4k.vhd (revision 2) @@ -0,0 +1,188 @@ +-------------------------------------------------------------------------------- +-- This file is part of the project MYPROJECTNAME +-- see: MYPROJECTURL +-- +-- description: +-- instantiation of an Altera M4K blockram as dual port ROM +-- they have the nice feature of allowing an initialization file. with the +-- generic rominitfile it is possible to select the encryption or decryption +-- version sbox.hex and sbox_inv.hex +-- Only 8-Bit dual port was supported on CyloneII... this is why we need a lot +-- of blockrams in aes_core.vhd AND keyexpansionV2.vhd +-- +------------------------------------------------------------------------------- +-- Todo: +-- +-- Author(s): +-- Thomas Ruschival -- ruschi@opencores.org (www.ruschival.de) +-- +-------------------------------------------------------------------------------- +-- Copyright (c) 2009, Authors and opencores.org +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- * Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- * Redistributions in binary form must reproduce the above copyright notice, +-- this list of conditions and the following disclaimer in the documentation +-- and/or other materials provided with the distribution. +-- * Neither the name of the organization nor the names of its contributors +-- may be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +-- THE POSSIBILITY OF SUCH DAMAGE +------------------------------------------------------------------------------- +-- version management: +-- $Author$ +-- $Date$ +-- $Revision$ +------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; + +library altera_mf; +use altera_mf.all; +library aes_ecb_lib; +use aes_ecb_lib.aes_ecb_pkg.all; + + + +architecture M4k of sbox is + --------------------------------------------------------------------------- + -- Altera Stuff + -- ( I don't want this in aes_ecb_pkg because it is vendor specific) + --------------------------------------------------------------------------- + component altsyncram + generic ( + ADDRESS_REG_B : STRING; + CLOCK_ENABLE_INPUT_A : STRING; + CLOCK_ENABLE_INPUT_B : STRING; + CLOCK_ENABLE_OUTPUT_A : STRING; + CLOCK_ENABLE_OUTPUT_B : STRING; + INDATA_REG_B : STRING; + INIT_FILE : STRING; + INTENDED_DEVICE_FAMILY : STRING; + LPM_TYPE : STRING; + NUMWORDS_A : NATURAL; + NUMWORDS_B : NATURAL; + OPERATION_MODE : STRING; + OUTDATA_ACLR_A : STRING; + OUTDATA_ACLR_B : STRING; + OUTDATA_REG_A : STRING; + OUTDATA_REG_B : STRING; + POWER_UP_UNINITIALIZED : STRING; + WIDTHAD_A : NATURAL; + WIDTHAD_B : NATURAL; + WIDTH_A : NATURAL; + WIDTH_B : NATURAL; + WIDTH_BYTEENA_A : NATURAL; + WIDTH_BYTEENA_B : NATURAL; + WRCONTROL_WRADDRESS_REG_B : STRING + ); + port ( + wren_a : in STD_LOGIC; + wren_b : in STD_LOGIC; + clock0 : in STD_LOGIC; + address_a : in STD_LOGIC_VECTOR (7 downto 0); + address_b : in STD_LOGIC_VECTOR (7 downto 0); + q_a : out STD_LOGIC_VECTOR (7 downto 0); + q_b : out STD_LOGIC_VECTOR (7 downto 0); + data_a : in STD_LOGIC_VECTOR (7 downto 0); + data_b : in STD_LOGIC_VECTOR (7 downto 0) + ); + end component; + +begin + + assign_inverse : if INVERSE generate + m4kblock_inv : altsyncram + generic map ( + address_reg_b => "CLOCK0", + clock_enable_input_a => "BYPASS", + clock_enable_input_b => "BYPASS", + clock_enable_output_a => "BYPASS", + clock_enable_output_b => "BYPASS", + indata_reg_b => "CLOCK0", + init_file => "sbox_inv.hex", + intended_device_family => "Cyclone II", + lpm_type => "altsyncram", + numwords_a => 256, + numwords_b => 256, + operation_mode => "BIDIR_DUAL_PORT", + outdata_aclr_a => "NONE", + outdata_aclr_b => "NONE", + outdata_reg_a => "UNREGISTERED", -- IMPORTANT not CLOCK0!!! + outdata_reg_b => "UNREGISTERED", -- IMPORTANT not CLOCK0!!! + power_up_uninitialized => "FALSE", + widthad_a => 8, + widthad_b => 8, + width_a => 8, + width_b => 8, + width_byteena_a => 1, + width_byteena_b => 1, + wrcontrol_wraddress_reg_b => "CLOCK0" + ) + port map ( + wren_a => '0', -- we don't write to ROM + wren_b => '0', -- we don't write to ROM + clock0 => clk, + data_a => (others => '0'), -- dumb compiler wants it anyway + data_b => (others => '0'), -- dumb compiler wants it anyway + address_a => address_a, + address_b => address_b, + q_a => q_a, + q_b => q_b + ); + end generate assign_inverse; + + assign_encrypt : if not INVERSE generate + m4kblock_fwd : altsyncram + generic map ( + address_reg_b => "CLOCK0", + clock_enable_input_a => "BYPASS", + clock_enable_input_b => "BYPASS", + clock_enable_output_a => "BYPASS", + clock_enable_output_b => "BYPASS", + indata_reg_b => "CLOCK0", + init_file => "sbox.hex", + intended_device_family => "Cyclone II", + lpm_type => "altsyncram", + numwords_a => 256, + numwords_b => 256, + operation_mode => "BIDIR_DUAL_PORT", + outdata_aclr_a => "NONE", + outdata_aclr_b => "NONE", + outdata_reg_a => "UNREGISTERED", -- IMPORTANT not CLOCK0!!! + outdata_reg_b => "UNREGISTERED", -- IMPORTANT not CLOCK0!!! + power_up_uninitialized => "FALSE", + widthad_a => 8, + widthad_b => 8, + width_a => 8, + width_b => 8, + width_byteena_a => 1, + width_byteena_b => 1, + wrcontrol_wraddress_reg_b => "CLOCK0" + ) + port map ( + wren_a => '0', -- we don't write to ROM + wren_b => '0', -- we don't write to ROM + clock0 => clk, + data_a => (others => '0'), -- dumb compiler wants it anyway + data_b => (others => '0'), -- dumb compiler wants it anyway + address_a => address_a, + address_b => address_b, + q_a => q_a, + q_b => q_b + ); + end generate assign_encrypt; +end M4k; Index: hdl/aes_ecb/sbox_arch1.vhd =================================================================== --- hdl/aes_ecb/sbox_arch1.vhd (nonexistent) +++ hdl/aes_ecb/sbox_arch1.vhd (revision 2) @@ -0,0 +1,153 @@ +---------------------------------------------------------------------------- +-- This file is part of the project MYPROJECTNAME +-- see: MYPROJECTURL +-- +-- description: +-- Sbox implements a lookup ROM for nonlinear substitution of a Bytearray. +-- trying to make use of Altera Blockram and Xilinx Blockram without using +-- vendor specific implementation like in sboxM4k. +-- +-------------------------------------------------------------------------------! +-- +-- Author(s): +-- Thomas Ruschival -- ruschi@opencores.org (www.ruschival.de) +-- +-------------------------------------------------------------------------------- +-- Copyright (c) 2009, Authors and opencores.org +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- * Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- * Redistributions in binary form must reproduce the above copyright notice, +-- this list of conditions and the following disclaimer in the documentation +-- and/or other materials provided with the distribution. +-- * Neither the name of the organization nor the names of its contributors +-- may be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +-- THE POSSIBILITY OF SUCH DAMAGE +------------------------------------------------------------------------------- +-- version management: +-- $Author$ +-- $Date$ +-- $Revision$ +------------------------------------------------------------------------------- +library ieee; +use ieee.numeric_std.all; +use ieee.std_logic_1164.all; +library aes_ecb_lib; +use aes_ecb_lib.aes_ecb_pkg.all; + +architecture ARCH1 of sbox is + --------------------------------------------------------------------------- + -- Sbox of Rindael for nonlinear substitution of bytes + -- taken from wikipedia.de + -- Here just the values as lookup table - tried to make use of RAM as ROM + --------------------------------------------------------------------------- + constant decrypt_table : BYTEARRAY(0 to 255) := ( + 0 => X"52", 1 => X"09", 2 => X"6A", 3 => X"D5", 4 => X"30", 5 => X"36", 6 => X"A5", 7 => X"38", + 8 => X"BF", 9 => X"40", 10 => X"A3", 11 => X"9E", 12 => X"81", 13 => X"F3", 14 => X"D7", 15 => X"FB", + 16 => X"7C", 17 => X"E3", 18 => X"39", 19 => X"82", 20 => X"9B", 21 => X"2F", 22 => X"FF", 23 => X"87", + 24 => X"34", 25 => X"8E", 26 => X"43", 27 => X"44", 28 => X"C4", 29 => X"DE", 30 => X"E9", 31 => X"CB", + 32 => X"54", 33 => X"7B", 34 => X"94", 35 => X"32", 36 => X"A6", 37 => X"C2", 38 => X"23", 39 => X"3D", + 40 => X"EE", 41 => X"4C", 42 => X"95", 43 => X"0B", 44 => X"42", 45 => X"FA", 46 => X"C3", 47 => X"4E", + 48 => X"08", 49 => X"2E", 50 => X"A1", 51 => X"66", 52 => X"28", 53 => X"D9", 54 => X"24", 55 => X"B2", + 56 => X"76", 57 => X"5B", 58 => X"A2", 59 => X"49", 60 => X"6D", 61 => X"8B", 62 => X"D1", 63 => X"25", + 64 => X"72", 65 => X"F8", 66 => X"F6", 67 => X"64", 68 => X"86", 69 => X"68", 70 => X"98", 71 => X"16", + 72 => X"D4", 73 => X"A4", 74 => X"5C", 75 => X"CC", 76 => X"5D", 77 => X"65", 78 => X"B6", 79 => X"92", + 80 => X"6C", 81 => X"70", 82 => X"48", 83 => X"50", 84 => X"FD", 85 => X"ED", 86 => X"B9", 87 => X"DA", + 88 => X"5E", 89 => X"15", 90 => X"46", 91 => X"57", 92 => X"A7", 93 => X"8D", 94 => X"9D", 95 => X"84", + 96 => X"90", 97 => X"D8", 98 => X"AB", 99 => X"00", 100 => X"8C", 101 => X"BC", 102 => X"D3", 103 => X"0A", + 104 => X"F7", 105 => X"E4", 106 => X"58", 107 => X"05", 108 => X"B8", 109 => X"B3", 110 => X"45", 111 => X"06", + 112 => X"D0", 113 => X"2C", 114 => X"1E", 115 => X"8F", 116 => X"CA", 117 => X"3F", 118 => X"0F", 119 => X"02", + 120 => X"C1", 121 => X"AF", 122 => X"BD", 123 => X"03", 124 => X"01", 125 => X"13", 126 => X"8A", 127 => X"6B", + 128 => X"3A", 129 => X"91", 130 => X"11", 131 => X"41", 132 => X"4F", 133 => X"67", 134 => X"DC", 135 => X"EA", + 136 => X"97", 137 => X"F2", 138 => X"CF", 139 => X"CE", 140 => X"F0", 141 => X"B4", 142 => X"E6", 143 => X"73", + 144 => X"96", 145 => X"AC", 146 => X"74", 147 => X"22", 148 => X"E7", 149 => X"AD", 150 => X"35", 151 => X"85", + 152 => X"E2", 153 => X"F9", 154 => X"37", 155 => X"E8", 156 => X"1C", 157 => X"75", 158 => X"DF", 159 => X"6E", + 160 => X"47", 161 => X"F1", 162 => X"1A", 163 => X"71", 164 => X"1D", 165 => X"29", 166 => X"C5", 167 => X"89", + 168 => X"6F", 169 => X"B7", 170 => X"62", 171 => X"0E", 172 => X"AA", 173 => X"18", 174 => X"BE", 175 => X"1B", + 176 => X"FC", 177 => X"56", 178 => X"3E", 179 => X"4B", 180 => X"C6", 181 => X"D2", 182 => X"79", 183 => X"20", + 184 => X"9A", 185 => X"DB", 186 => X"C0", 187 => X"FE", 188 => X"78", 189 => X"CD", 190 => X"5A", 191 => X"F4", + 192 => X"1F", 193 => X"DD", 194 => X"A8", 195 => X"33", 196 => X"88", 197 => X"07", 198 => X"C7", 199 => X"31", + 200 => X"B1", 201 => X"12", 202 => X"10", 203 => X"59", 204 => X"27", 205 => X"80", 206 => X"EC", 207 => X"5F", + 208 => X"60", 209 => X"51", 210 => X"7F", 211 => X"A9", 212 => X"19", 213 => X"B5", 214 => X"4A", 215 => X"0D", + 216 => X"2D", 217 => X"E5", 218 => X"7A", 219 => X"9F", 220 => X"93", 221 => X"C9", 222 => X"9C", 223 => X"EF", + 224 => X"A0", 225 => X"E0", 226 => X"3B", 227 => X"4D", 228 => X"AE", 229 => X"2A", 230 => X"F5", 231 => X"B0", + 232 => X"C8", 233 => X"EB", 234 => X"BB", 235 => X"3C", 236 => X"83", 237 => X"53", 238 => X"99", 239 => X"61", + 240 => X"17", 241 => X"2B", 242 => X"04", 243 => X"7E", 244 => X"BA", 245 => X"77", 246 => X"D6", 247 => X"26", + 248 => X"E1", 249 => X"69", 250 => X"14", 251 => X"63", 252 => X"55", 253 => X"21", 254 => X"0C", 255 => X"7D" + ); + + + constant encrypt_table : BYTEARRAY(0 to 255) := ( + 0 => X"63", 1 => X"7C", 2 => X"77", 3 => X"7B", 4 => X"F2", 5 => X"6B", 6 => X"6F", 7 => X"C5", + 8 => X"30", 9 => X"01", 10 => X"67", 11 => X"2B", 12 => X"FE", 13 => X"D7", 14 => X"AB", 15 => X"76", + 16 => X"CA", 17 => X"82", 18 => X"C9", 19 => X"7D", 20 => X"FA", 21 => X"59", 22 => X"47", 23 => X"F0", + 24 => X"AD", 25 => X"D4", 26 => X"A2", 27 => X"AF", 28 => X"9C", 29 => X"A4", 30 => X"72", 31 => X"C0", + 32 => X"B7", 33 => X"FD", 34 => X"93", 35 => X"26", 36 => X"36", 37 => X"3F", 38 => X"F7", 39 => X"CC", + 40 => X"34", 41 => X"A5", 42 => X"E5", 43 => X"F1", 44 => X"71", 45 => X"D8", 46 => X"31", 47 => X"15", + 48 => X"04", 49 => X"C7", 50 => X"23", 51 => X"C3", 52 => X"18", 53 => X"96", 54 => X"05", 55 => X"9A", + 56 => X"07", 57 => X"12", 58 => X"80", 59 => X"E2", 60 => X"EB", 61 => X"27", 62 => X"B2", 63 => X"75", + 64 => X"09", 65 => X"83", 66 => X"2C", 67 => X"1A", 68 => X"1B", 69 => X"6E", 70 => X"5A", 71 => X"A0", + 72 => X"52", 73 => X"3B", 74 => X"D6", 75 => X"B3", 76 => X"29", 77 => X"E3", 78 => X"2F", 79 => X"84", + 80 => X"53", 81 => X"D1", 82 => X"00", 83 => X"ED", 84 => X"20", 85 => X"FC", 86 => X"B1", 87 => X"5B", + 88 => X"6A", 89 => X"CB", 90 => X"BE", 91 => X"39", 92 => X"4A", 93 => X"4C", 94 => X"58", 95 => X"CF", + 96 => X"D0", 97 => X"EF", 98 => X"AA", 99 => X"FB", 100 => X"43", 101 => X"4D", 102 => X"33", 103 => X"85", + 104 => X"45", 105 => X"F9", 106 => X"02", 107 => X"7F", 108 => X"50", 109 => X"3C", 110 => X"9F", 111 => X"A8", + 112 => X"51", 113 => X"A3", 114 => X"40", 115 => X"8F", 116 => X"92", 117 => X"9D", 118 => X"38", 119 => X"F5", + 120 => X"BC", 121 => X"B6", 122 => X"DA", 123 => X"21", 124 => X"10", 125 => X"FF", 126 => X"F3", 127 => X"D2", + 128 => X"CD", 129 => X"0C", 130 => X"13", 131 => X"EC", 132 => X"5F", 133 => X"97", 134 => X"44", 135 => X"17", + 136 => X"C4", 137 => X"A7", 138 => X"7E", 139 => X"3D", 140 => X"64", 141 => X"5D", 142 => X"19", 143 => X"73", + 144 => X"60", 145 => X"81", 146 => X"4F", 147 => X"DC", 148 => X"22", 149 => X"2A", 150 => X"90", 151 => X"88", + 152 => X"46", 153 => X"EE", 154 => X"B8", 155 => X"14", 156 => X"DE", 157 => X"5E", 158 => X"0B", 159 => X"DB", + 160 => X"E0", 161 => X"32", 162 => X"3A", 163 => X"0A", 164 => X"49", 165 => X"06", 166 => X"24", 167 => X"5C", + 168 => X"C2", 169 => X"D3", 170 => X"AC", 171 => X"62", 172 => X"91", 173 => X"95", 174 => X"E4", 175 => X"79", + 176 => X"E7", 177 => X"C8", 178 => X"37", 179 => X"6D", 180 => X"8D", 181 => X"D5", 182 => X"4E", 183 => X"A9", + 184 => X"6C", 185 => X"56", 186 => X"F4", 187 => X"EA", 188 => X"65", 189 => X"7A", 190 => X"AE", 191 => X"08", + 192 => X"BA", 193 => X"78", 194 => X"25", 195 => X"2E", 196 => X"1C", 197 => X"A6", 198 => X"B4", 199 => X"C6", + 200 => X"E8", 201 => X"DD", 202 => X"74", 203 => X"1F", 204 => X"4B", 205 => X"BD", 206 => X"8B", 207 => X"8A", + 208 => X"70", 209 => X"3E", 210 => X"B5", 211 => X"66", 212 => X"48", 213 => X"03", 214 => X"F6", 215 => X"0E", + 216 => X"61", 217 => X"35", 218 => X"57", 219 => X"B9", 220 => X"86", 221 => X"C1", 222 => X"1D", 223 => X"9E", + 224 => X"E1", 225 => X"F8", 226 => X"98", 227 => X"11", 228 => X"69", 229 => X"D9", 230 => X"8E", 231 => X"94", + 232 => X"9B", 233 => X"1E", 234 => X"87", 235 => X"E9", 236 => X"CE", 237 => X"55", 238 => X"28", 239 => X"DF", + 240 => X"8C", 241 => X"A1", 242 => X"89", 243 => X"0D", 244 => X"BF", 245 => X"E6", 246 => X"42", 247 => X"68", + 248 => X"41", 249 => X"99", 250 => X"2D", 251 => X"0F", 252 => X"B0", 253 => X"54", 254 => X"BB", 255 => X"16" + ); + + signal SBOXROM : BYTEARRAY(0 to 255); -- actual storage + +begin + assign_inverse : if INVERSE generate + SBOXROM <= decrypt_table; + end generate assign_inverse; + + assign_encrypt : if not INVERSE generate + SBOXROM <= encrypt_table; + end generate assign_encrypt; + + + -- purpose: lookup content of the rom + -- type : sequential + -- inputs : clk + -- outputs: q_a, q_b + assign_output : process (clk) is + begin + if rising_edge(clk) then + q_a <= SBOXROM(to_integer(UNSIGNED(address_a))); + q_b <= SBOXROM(to_integer(UNSIGNED(address_b))); + end if; + end process assign_output; + +end ARCH1; Index: hdl/aes_ecb/sbox_inv.hex =================================================================== --- hdl/aes_ecb/sbox_inv.hex (nonexistent) +++ hdl/aes_ecb/sbox_inv.hex (revision 2) @@ -0,0 +1,257 @@ +:0100000052AD +:0100010009F5 +:010002006A93 +:01000300D527 +:0100040030CB +:0100050036C4 +:01000600A554 +:0100070038C0 +:01000800BF38 +:0100090040B6 +:01000A00A352 +:01000B009E56 +:01000C008172 +:01000D00F3FF +:01000E00D71A +:01000F00FBF5 +:010010007C73 +:01001100E30B +:0100120039B4 +:01001300826A +:010014009B50 +:010015002FBB +:01001600FFEA +:010017008761 +:0100180034B3 +:010019008E58 +:01001A0043A2 +:01001B0044A0 +:01001C00C41F +:01001D00DE04 +:01001E00E9F8 +:01001F00CB15 +:01002000548B +:010021007B63 +:010022009449 +:0100230032AA +:01002400A635 +:01002500C218 +:0100260023B6 +:010027003D9B +:01002800EEE9 +:010029004C8A +:01002A009540 +:01002B000BC9 +:01002C004291 +:01002D00FAD8 +:01002E00C30E +:01002F004E82 +:0100300008C7 +:010031002EA0 +:01003200A12C +:010033006666 +:0100340028A3 +:01003500D9F1 +:0100360024A5 +:01003700B216 +:010038007651 +:010039005B6B +:01003A00A223 +:01003B00497B +:01003C006D56 +:01003D008B37 +:01003E00D1F0 +:01003F00259B +:01004000724D +:01004100F8C6 +:01004200F6C7 +:010043006458 +:010044008635 +:010045006852 +:010046009821 +:0100470016A2 +:01004800D4E3 +:01004900A412 +:01004A005C59 +:01004B00CCE8 +:01004C005D56 +:01004D00654D +:01004E00B6FB +:01004F00921E +:010050006C43 +:01005100703E +:010052004865 +:01005300505C +:01005400FDAE +:01005500EDBD +:01005600B9F0 +:01005700DACE +:010058005E49 +:010059001591 +:01005A00465F +:01005B00574D +:01005C00A7FC +:01005D008D15 +:01005E009D04 +:01005F00841C +:01006000900F +:01006100D8C6 +:01006200ABF2 +:01006300009C +:010064008C0F +:01006500BCDE +:01006600D3C6 +:010067000A8E +:01006800F7A0 +:01006900E4B2 +:01006A00583D +:01006B00058F +:01006C00B8DB +:01006D00B3DF +:01006E00454C +:01006F00068A +:01007000D0BF +:010071002C62 +:010072001E6F +:010073008FFD +:01007400CAC1 +:010075003F4B +:010076000F7A +:010077000286 +:01007800C1C6 +:01007900AFD7 +:01007A00BDC8 +:01007B000381 +:01007C000182 +:01007D00136F +:01007E008AF7 +:01007F006B15 +:010080003A45 +:0100810091ED +:01008200116C +:01008300413B +:010084004F2C +:010085006713 +:01008600DC9D +:01008700EA8E +:0100880097E0 +:01008900F284 +:01008A00CFA6 +:01008B00CEA6 +:01008C00F083 +:01008D00B4BE +:01008E00E68B +:01008F0073FD +:0100900096D9 +:01009100ACC2 +:0100920074F9 +:01009300224A +:01009400E784 +:01009500ADBD +:010096003534 +:0100970085E3 +:01009800E285 +:01009900F96D +:01009A00372E +:01009B00E87C +:01009C001C47 +:01009D0075ED +:01009E00DF82 +:01009F006EF2 +:0100A0004718 +:0100A100F16D +:0100A2001A43 +:0100A30071EB +:0100A4001D3E +:0100A5002931 +:0100A600C594 +:0100A70089CF +:0100A8006FE8 +:0100A900B79F +:0100AA0062F3 +:0100AB000E46 +:0100AC00AAA9 +:0100AD00183A +:0100AE00BE93 +:0100AF001B35 +:0100B000FC53 +:0100B10056F8 +:0100B2003E0F +:0100B3004B01 +:0100B400C685 +:0100B500D278 +:0100B60079D0 +:0100B7002028 +:0100B8009AAD +:0100B900DB6B +:0100BA00C085 +:0100BB00FE46 +:0100BC0078CB +:0100BD00CD75 +:0100BE005AE7 +:0100BF00F44C +:0100C0001F20 +:0100C100DD61 +:0100C200A895 +:0100C3003309 +:0100C40088B3 +:0100C5000733 +:0100C600C772 +:0100C7003107 +:0100C800B186 +:0100C9001224 +:0100CA001025 +:0100CB0059DB +:0100CC00270C +:0100CD0080B2 +:0100CE00EC45 +:0100CF005FD1 +:0100D00060CF +:0100D10051DD +:0100D2007FAE +:0100D300A983 +:0100D4001912 +:0100D500B575 +:0100D6004ADF +:0100D7000D1B +:0100D8002DFA +:0100D900E541 +:0100DA007AAB +:0100DB009F85 +:0100DC009390 +:0100DD00C959 +:0100DE009C85 +:0100DF00EF31 +:0100E000A07F +:0100E100E03E +:0100E2003BE2 +:0100E3004DCF +:0100E400AE6D +:0100E5002AF0 +:0100E600F524 +:0100E700B068 +:0100E800C84F +:0100E900EB2B +:0100EA00BB5A +:0100EB003CD8 +:0100EC008390 +:0100ED0053BF +:0100EE009978 +:0100EF0061AF +:0100F00017F8 +:0100F1002BE3 +:0100F2000409 +:0100F3007E8E +:0100F400BA51 +:0100F5007793 +:0100F600D633 +:0100F70026E2 +:0100F800E126 +:0100F900699D +:0100FA0014F1 +:0100FB0063A1 +:0100FC0055AE +:0100FD0021E1 +:0100FE000CF5 +:0100FF007D83 +:00000001FF Index: hdl/aes_ecb/mux2.vhd =================================================================== --- hdl/aes_ecb/mux2.vhd (nonexistent) +++ hdl/aes_ecb/mux2.vhd (revision 2) @@ -0,0 +1,85 @@ +-------------------------------------------------------------------------------- +-- This file is part of the project MYPROJECTNAME +-- see: MYPROJECTURL +-- +-- description: Mux2, 2-Port-N-Bit Bit Mulitplexer +-- +------------------------------------------------------------------------------- +-- +-- Author(s): +-- Thomas Ruschival -- ruschi@opencores.org (www.ruschival.de) +-- +-------------------------------------------------------------------------------- +-- Copyright (c) 2009, Authors and opencores.org +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- * Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- * Redistributions in binary form must reproduce the above copyright notice, +-- this list of conditions and the following disclaimer in the documentation +-- and/or other materials provided with the distribution. +-- * Neither the name of the organization nor the names of its contributors +-- may be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +-- THE POSSIBILITY OF SUCH DAMAGE +------------------------------------------------------------------------------- +-- version management: +-- $Author$ +-- $Date$ +-- $Revision$ +------------------------------------------------------------------------------- + + +library ieee; +use ieee.std_logic_1164.all; + +entity mux2 is + generic ( + IOwidth : POSITIVE := 32 -- width of I/O ports + ); + port ( + inport_a : in STD_LOGIC_VECTOR (IOwidth-1 downto 0); -- port 1 + inport_b : in STD_LOGIC_VECTOR (IOwidth-1 downto 0); -- port 2 + selector : in STD_LOGIC; -- switch to select ports + outport : out STD_LOGIC_VECTOR (IOwidth-1 downto 0) -- output + ); +end mux2; + + +architecture arch1 of mux2 is + +begin -- arch1 + + -- purpose: switch the ports + -- type : combinational + -- inputs : selector,inport_a,inport_b + -- outputs: outport + muxing : process (inport_a, inport_b, selector) + begin -- PROCESS selector + -- default behaviour to avoid latch + outport <= inport_a; + case selector is + when '0' => + outport <= inport_a; + when '1' => + outport <= inport_b; + when others => + --pragma synthesis_off + report "!! selector in arch1 of mux2 has strange value !!" severity warning; + --pragma synthesis_on + end case; + end process muxing; + +end arch1; Index: hdl/aes_ecb/mixcol_fwd.vhd =================================================================== --- hdl/aes_ecb/mixcol_fwd.vhd (nonexistent) +++ hdl/aes_ecb/mixcol_fwd.vhd (revision 2) @@ -0,0 +1,151 @@ +-------------------------------------------------------------------------------- +-- This file is part of the project MYPROJECTNAME +-- see: MYPROJECTURL +-- +-- description: +-- Mix the columns of the AES Block (encryption version) +-- A column is always a word of 32 Bit, nomatter what the blocklength is. +-- +-- For encryption the input vector is multiplied by this matrix +-- +-- | 2 3 1 1 | a(n,0) +-- | 1 2 3 1 | x a(n,1) +-- | 1 1 2 3 | a(n,2) +-- | 3 1 1 2 | a(n,3) +-- +-- where the multiplication is defined over the GF(2^8) Galois field. +-- in this finite field addition is an XOR, multiplication by 2 is a simple +-- shift left like in "normal" math. So the multiplication by 3 is a shiftleft +-- and XOR operation. +-- 2*a = a shl 2 +-- 3*a = (a shl 2) XOR a +-- If bit leftmost (MSB) bit is '1' the result is too big to fit in a Byte and +-- has to be XORed with the magic number "100_0110_1100", "10_0011_0110", +-- "1_0001_1011" sucessively until it fits... don't ask me where it +-- comes from - I have no clue and skipped the gory math details of the algorithm. +-- the most is taken from: http://en.wikipedia.org/wiki/Rijndael_Galois_field +-- Or you ask the mathematician of at your disposal... +------------------------------------------------------------------------------- +-- +-- Author(s): +-- Thomas Ruschival -- ruschi@opencores.org (www.ruschival.de) +-- +-------------------------------------------------------------------------------- +-- Copyright (c) 2009, Authors and opencores.org +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- * Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- * Redistributions in binary form must reproduce the above copyright notice, +-- this list of conditions and the following disclaimer in the documentation +-- and/or other materials provided with the distribution. +-- * Neither the name of the organization nor the names of its contributors +-- may be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +-- THE POSSIBILITY OF SUCH DAMAGE +------------------------------------------------------------------------------- +-- version management: +-- $Author$ +-- $Date$ +-- $Revision$ +------------------------------------------------------------------------------- + + + + +library IEEE; +use IEEE.std_logic_1164.all; +use ieee.numeric_std.all; + +library aes_ecb_lib; +use aes_ecb_lib.aes_ecb_pkg.all; + + +architecture fwd of mixcol +is + signal byte0 : BYTE; + signal byte1 : BYTE; + signal byte2 : BYTE; + signal byte3 : BYTE; +begin -- architecture ARCH1 + + -- Easier handling of the single cells of the column + byte0 <= col_in(31 downto 24); + byte1 <= col_in(23 downto 16); + byte2 <= col_in(15 downto 8); + byte3 <= col_in(7 downto 0); + + -- purpose: multiplies the column of the input block with the matrix + -- type : combinational + -- inputs : direction,byte0,byte1,byte2,byte3 + -- outputs: col_out + matrix_mult : process (byte0, byte1, byte2, byte3) is + -- temporary results for the row-col multiplication have to be 9 Bits + -- long because the input is shifted left + variable tmp_res0 : STD_LOGIC_VECTOR(10 downto 0); -- result of row1*col + variable tmp_res1 : STD_LOGIC_VECTOR(10 downto 0); -- result of row2*col + variable tmp_res2 : STD_LOGIC_VECTOR(10 downto 0); -- result of row3*col + variable tmp_res3 : STD_LOGIC_VECTOR(10 downto 0); -- result of row4*col + begin -- process matrix_mult + -- Multiply by 1st row of the encrypt matrix (2 3 1 1) + tmp_res0 := "00" & (byte0 & '0' xor -- byte0*2 + + byte1 & '0' xor '0'& byte1 xor -- byte1*2 + byte1 + + '0' & byte2 xor -- byte2*1 (expanded to 9 bit) + '0' & byte3); -- byte3*1 (expanded to 9 bit) + -- check if the 9th byte=1 and XOR with magic number to make it 8 BIT + if tmp_res0(8) = '1' then + tmp_res0 := tmp_res0 xor "00100011011"; + end if; + + -- Multiply by 2nd row of the encrypt matrix (1 2 3 1) + tmp_res1 := "00" & ('0' & byte0 xor -- byte0*1 (expanded to 9 bit) + byte1 & '0' xor -- byte1*2 + byte2 & '0' xor '0' & byte2 xor -- byte2*2 + byte2 + '0' & byte3); -- byte3*1 (expanded to 9 bit) + -- check if the 9th byte=1 and XOR with magic number to make it 8 BIT + if tmp_res1(8) = '1' then + tmp_res1 := tmp_res1 xor "00100011011"; + end if; + + -- Multiply by 3rd row of the encrypt matrix (1 1 2 3) + tmp_res2 := "00" & ('0' & byte0 xor -- byte0*1 (expanded to 9 bit) + '0' & byte1 xor -- byte1*1 (expanded to 9 bit) + byte2 & '0' xor -- byte2*3 + byte3 & '0' xor '0' & byte3); -- byte3*3 + -- check if the 9th byte=1 and XOR with magic number to make it 8 BIT + if tmp_res2(8) = '1' then + tmp_res2 := tmp_res2 xor "00100011011"; + end if; + + -- Multiply by 4th row of the encrypt matrix (3 1 1 2) + tmp_res3 := "00" & (byte0 & '0' xor '0' & byte0 xor -- byte0*3 + '0' & byte1 xor -- byte1*1 (expanded to 9 bit) + '0' & byte2 xor -- byte2*1 (expanded to 9 bit) + byte3 & '0'); -- byte3*2 + -- check if the 9th byte=1 and XOR with magic number to make it 8 BIT + if tmp_res3(8) = '1' then + tmp_res3 := tmp_res3 xor "00100011011"; + end if; + + + -- build output signal (BYTE_RANGE =7 downto 0 see util_pkg.vhd) + col_out(31 downto 24) <= tmp_res0(BYTE_RANGE); + col_out(23 downto 16) <= tmp_res1(BYTE_RANGE); + col_out(15 downto 8) <= tmp_res2(BYTE_RANGE); + col_out(7 downto 0) <= tmp_res3(BYTE_RANGE); + end process matrix_mult; + +end architecture fwd; + Index: hdl/aes_ecb/mixcol.vhd =================================================================== --- hdl/aes_ecb/mixcol.vhd (nonexistent) +++ hdl/aes_ecb/mixcol.vhd (revision 2) @@ -0,0 +1,60 @@ +-------------------------------------------------------------------------------- +-- This file is part of the project MYPROJECTNAME +-- see: MYPROJECTURL +-- +-- description: +-- This is only the entity to the architectures fwd and INV of mixcolumn as +-- they have the same interface +-- +------------------------------------------------------------------------------- +-- +-- Author(s): +-- Thomas Ruschival -- ruschi@opencores.org (www.ruschival.de) +-- +-------------------------------------------------------------------------------- +-- Copyright (c) 2009, Authors and opencores.org +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- * Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- * Redistributions in binary form must reproduce the above copyright notice, +-- this list of conditions and the following disclaimer in the documentation +-- and/or other materials provided with the distribution. +-- * Neither the name of the organization nor the names of its contributors +-- may be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +-- THE POSSIBILITY OF SUCH DAMAGE +------------------------------------------------------------------------------- +-- version management: +-- $Author$ +-- $Date$ +-- $Revision$ +------------------------------------------------------------------------------- + +library IEEE; +use IEEE.std_logic_1164.all; +use ieee.numeric_std.all; + + +library aes_ecb_lib; +use aes_ecb_lib.aes_ecb_pkg.all; + +entity Mixcol is + port ( + col_in : in DWORD; -- one column of the state + col_out : out DWORD -- output column + ); +end entity Mixcol; + Index: hdl/aes_ecb/mux3.vhd =================================================================== --- hdl/aes_ecb/mux3.vhd (nonexistent) +++ hdl/aes_ecb/mux3.vhd (revision 2) @@ -0,0 +1,86 @@ +-------------------------------------------------------------------------------- +-- This file is part of the project MYPROJECTNAME +-- see: MYPROJECTURL +-- +-- description: Mux2, 3-Port-N-Bit Bit Mulitplexer +-- +------------------------------------------------------------------------------- +-- +-- Author(s): +-- Thomas Ruschival -- ruschi@opencores.org (www.ruschival.de) +-- +-------------------------------------------------------------------------------- +-- Copyright (c) 2009, Authors and opencores.org +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- * Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- * Redistributions in binary form must reproduce the above copyright notice, +-- this list of conditions and the following disclaimer in the documentation +-- and/or other materials provided with the distribution. +-- * Neither the name of the organization nor the names of its contributors +-- may be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +-- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +-- THE POSSIBILITY OF SUCH DAMAGE +------------------------------------------------------------------------------- +-- version management: +-- $Author$ +-- $Date$ +-- $Revision$ +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity mux3 is + generic ( + IOwidth : POSITIVE := 1 -- width of I/O ports + ); + port ( + inport_a : in STD_LOGIC_VECTOR (IOwidth-1 downto 0); -- port 1 + inport_b : in STD_LOGIC_VECTOR (IOwidth-1 downto 0); -- port 2 + inport_c : in STD_LOGIC_VECTOR (IOwidth-1 downto 0); -- port 3 + selector : in STD_LOGIC_VECTOR (1 downto 0);-- switch to select ports + outport : out STD_LOGIC_VECTOR (IOwidth-1 downto 0) -- output + ); +end mux3; + + +architecture arch1 of mux3 is + +begin -- arch1 + + -- purpose: switch the ports + -- type : combinational + -- inputs : selector,inport_a,inport_b + -- outputs: outport + muxing : process (inport_a, inport_b, inport_c, selector) + begin -- PROCESS selector + case selector is + when "00" => + outport <= inport_a; + when "01" => + outport <= inport_b; + when "10" => + outport <= inport_c; + when others => + outport <= (others => 'X'); + --pragma synthesis_off + report "!! selector in arch1 of mux3 has strange value !!" severity warning; + --pragma synthesis_on + end case; + end process muxing; + +end arch1; Index: sim/sbox_inv.hex =================================================================== --- sim/sbox_inv.hex (nonexistent) +++ sim/sbox_inv.hex (revision 2) @@ -0,0 +1,257 @@ +:0100000052AD +:0100010009F5 +:010002006A93 +:01000300D527 +:0100040030CB +:0100050036C4 +:01000600A554 +:0100070038C0 +:01000800BF38 +:0100090040B6 +:01000A00A352 +:01000B009E56 +:01000C008172 +:01000D00F3FF +:01000E00D71A +:01000F00FBF5 +:010010007C73 +:01001100E30B +:0100120039B4 +:01001300826A +:010014009B50 +:010015002FBB +:01001600FFEA +:010017008761 +:0100180034B3 +:010019008E58 +:01001A0043A2 +:01001B0044A0 +:01001C00C41F +:01001D00DE04 +:01001E00E9F8 +:01001F00CB15 +:01002000548B +:010021007B63 +:010022009449 +:0100230032AA +:01002400A635 +:01002500C218 +:0100260023B6 +:010027003D9B +:01002800EEE9 +:010029004C8A +:01002A009540 +:01002B000BC9 +:01002C004291 +:01002D00FAD8 +:01002E00C30E +:01002F004E82 +:0100300008C7 +:010031002EA0 +:01003200A12C +:010033006666 +:0100340028A3 +:01003500D9F1 +:0100360024A5 +:01003700B216 +:010038007651 +:010039005B6B +:01003A00A223 +:01003B00497B +:01003C006D56 +:01003D008B37 +:01003E00D1F0 +:01003F00259B +:01004000724D +:01004100F8C6 +:01004200F6C7 +:010043006458 +:010044008635 +:010045006852 +:010046009821 +:0100470016A2 +:01004800D4E3 +:01004900A412 +:01004A005C59 +:01004B00CCE8 +:01004C005D56 +:01004D00654D +:01004E00B6FB +:01004F00921E +:010050006C43 +:01005100703E +:010052004865 +:01005300505C +:01005400FDAE +:01005500EDBD +:01005600B9F0 +:01005700DACE +:010058005E49 +:010059001591 +:01005A00465F +:01005B00574D +:01005C00A7FC +:01005D008D15 +:01005E009D04 +:01005F00841C +:01006000900F +:01006100D8C6 +:01006200ABF2 +:01006300009C +:010064008C0F +:01006500BCDE +:01006600D3C6 +:010067000A8E +:01006800F7A0 +:01006900E4B2 +:01006A00583D +:01006B00058F +:01006C00B8DB +:01006D00B3DF +:01006E00454C +:01006F00068A +:01007000D0BF +:010071002C62 +:010072001E6F +:010073008FFD +:01007400CAC1 +:010075003F4B +:010076000F7A +:010077000286 +:01007800C1C6 +:01007900AFD7 +:01007A00BDC8 +:01007B000381 +:01007C000182 +:01007D00136F +:01007E008AF7 +:01007F006B15 +:010080003A45 +:0100810091ED +:01008200116C +:01008300413B +:010084004F2C +:010085006713 +:01008600DC9D +:01008700EA8E +:0100880097E0 +:01008900F284 +:01008A00CFA6 +:01008B00CEA6 +:01008C00F083 +:01008D00B4BE +:01008E00E68B +:01008F0073FD +:0100900096D9 +:01009100ACC2 +:0100920074F9 +:01009300224A +:01009400E784 +:01009500ADBD +:010096003534 +:0100970085E3 +:01009800E285 +:01009900F96D +:01009A00372E +:01009B00E87C +:01009C001C47 +:01009D0075ED +:01009E00DF82 +:01009F006EF2 +:0100A0004718 +:0100A100F16D +:0100A2001A43 +:0100A30071EB +:0100A4001D3E +:0100A5002931 +:0100A600C594 +:0100A70089CF +:0100A8006FE8 +:0100A900B79F +:0100AA0062F3 +:0100AB000E46 +:0100AC00AAA9 +:0100AD00183A +:0100AE00BE93 +:0100AF001B35 +:0100B000FC53 +:0100B10056F8 +:0100B2003E0F +:0100B3004B01 +:0100B400C685 +:0100B500D278 +:0100B60079D0 +:0100B7002028 +:0100B8009AAD +:0100B900DB6B +:0100BA00C085 +:0100BB00FE46 +:0100BC0078CB +:0100BD00CD75 +:0100BE005AE7 +:0100BF00F44C +:0100C0001F20 +:0100C100DD61 +:0100C200A895 +:0100C3003309 +:0100C40088B3 +:0100C5000733 +:0100C600C772 +:0100C7003107 +:0100C800B186 +:0100C9001224 +:0100CA001025 +:0100CB0059DB +:0100CC00270C +:0100CD0080B2 +:0100CE00EC45 +:0100CF005FD1 +:0100D00060CF +:0100D10051DD +:0100D2007FAE +:0100D300A983 +:0100D4001912 +:0100D500B575 +:0100D6004ADF +:0100D7000D1B +:0100D8002DFA +:0100D900E541 +:0100DA007AAB +:0100DB009F85 +:0100DC009390 +:0100DD00C959 +:0100DE009C85 +:0100DF00EF31 +:0100E000A07F +:0100E100E03E +:0100E2003BE2 +:0100E3004DCF +:0100E400AE6D +:0100E5002AF0 +:0100E600F524 +:0100E700B068 +:0100E800C84F +:0100E900EB2B +:0100EA00BB5A +:0100EB003CD8 +:0100EC008390 +:0100ED0053BF +:0100EE009978 +:0100EF0061AF +:0100F00017F8 +:0100F1002BE3 +:0100F2000409 +:0100F3007E8E +:0100F400BA51 +:0100F5007793 +:0100F600D633 +:0100F70026E2 +:0100F800E126 +:0100F900699D +:0100FA0014F1 +:0100FB0063A1 +:0100FC0055AE +:0100FD0021E1 +:0100FE000CF5 +:0100FF007D83 +:00000001FF Index: sim/ecb.do =================================================================== --- sim/ecb.do (nonexistent) +++ sim/ecb.do (revision 2) @@ -0,0 +1,82 @@ +onerror {resume} +quietly WaveActivateNextPane {} 0 +add wave -noupdate -divider {Avalon Interface} +add wave -noupdate -format Logic -radix hexadecimal /avs_aes_tb/avs_aes_1/clk +add wave -noupdate -format Logic -radix hexadecimal /avs_aes_tb/avs_aes_1/reset +add wave -noupdate -group {Avalon signals} +add wave -noupdate -group {Avalon signals} -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/avs_s1_address +add wave -noupdate -group {Avalon signals} -format Logic -radix hexadecimal /avs_aes_tb/avs_aes_1/avs_s1_chipselect +add wave -noupdate -group {Avalon signals} -format Logic -radix hexadecimal /avs_aes_tb/avs_aes_1/avs_s1_irq +add wave -noupdate -group {Avalon signals} -format Logic -radix hexadecimal /avs_aes_tb/avs_aes_1/avs_s1_read +add wave -noupdate -group {Avalon signals} -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/avs_s1_readdata +add wave -noupdate -group {Avalon signals} -format Logic -radix hexadecimal /avs_aes_tb/avs_aes_1/avs_s1_write +add wave -noupdate -group {Avalon signals} -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/avs_s1_writedata +add wave -noupdate -group {Avalon signals} -format Logic -radix hexadecimal /avs_aes_tb/avs_aes_1/avs_s1_waitrequest +add wave -noupdate -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/ctrl_reg +add wave -noupdate -divider Core +add wave -noupdate -expand -group Common +add wave -noupdate -group Common -format Logic /avs_aes_tb/avs_aes_1/keyexp_done +add wave -noupdate -group Common -format Logic /avs_aes_tb/avs_aes_1/decrypt_mode +add wave -noupdate -group Common -format Logic /avs_aes_tb/avs_aes_1/data_stable +add wave -noupdate -group Common -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/data_in +add wave -noupdate -group Common -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/roundkey_idx +add wave -noupdate -group Common -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/roundkey +add wave -noupdate -group Common -format Logic -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/finished +add wave -noupdate -group Common -color Gold -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/result +add wave -noupdate -expand -group Encrypt +add wave -noupdate -group Encrypt -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/fsm_enc/fsm +add wave -noupdate -group Encrypt -format Logic -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/finished_enc +add wave -noupdate -group Encrypt -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/roundkey_idx_enc +add wave -noupdate -group Encrypt -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/addkey_in_enc +add wave -noupdate -group Encrypt -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/addkey_out_enc +add wave -noupdate -group Encrypt -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/sbox_out_enc +add wave -noupdate -group Encrypt -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/addkey_out_enc +add wave -noupdate -group Encrypt -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/addkey_in_enc +add wave -noupdate -group Encrypt -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/mixcol_out_enc +add wave -noupdate -expand -group Decrypt +add wave -noupdate -group Decrypt -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/decrypt_datapath/fsm_dec/fsm +add wave -noupdate -group Decrypt -format Logic -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/finished_dec +add wave -noupdate -group Decrypt -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/roundkey_idx_dec +add wave -noupdate -group Decrypt -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/addkey_in_dec +add wave -noupdate -group Decrypt -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/addkey_out_dec +add wave -noupdate -group Decrypt -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/shiftrow_in_dec +add wave -noupdate -group Decrypt -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/shiftrow_out_dec +add wave -noupdate -group Decrypt -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/sbox_out_dec +add wave -noupdate -group Decrypt -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/mixcol_out_dec +add wave -noupdate -divider keyexpansion +add wave -noupdate -format Logic -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/roundkey_generator/key_stable +add wave -noupdate -group userkey +add wave -noupdate -group userkey -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/roundkey_generator/keyword +add wave -noupdate -group userkey -format Logic -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/roundkey_generator/w_ena_keyword +add wave -noupdate -group userkey -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/roundkey_generator/keyshiftreg_in +add wave -noupdate -group userkey -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/roundkey_generator/keywordaddr +add wave -noupdate -group Keymemory +add wave -noupdate -group Keymemory -format Logic /avs_aes_tb/avs_aes_1/aes_core_1/roundkey_generator/w_ena_keymem +add wave -noupdate -group Keymemory -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/roundkey_generator/keymem +add wave -noupdate -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/roundkey_generator/keyshiftreg_in +add wave -noupdate -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/roundkey_generator/keyshiftreg_out +add wave -noupdate -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/roundkey_generator/to_sbox +add wave -noupdate -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/roundkey_generator/from_sbox +add wave -noupdate -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/roundkey_generator/roundconstant +add wave -noupdate -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/roundkey_generator/xorrcon_out +add wave -noupdate -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/roundkey_generator/last_word +add wave -noupdate -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/roundkey_generator/xor_lastblock_in +add wave -noupdate -format Literal -radix hexadecimal /avs_aes_tb/avs_aes_1/aes_core_1/roundkey_generator/expstate +add wave -noupdate -format Literal -radix unsigned /avs_aes_tb/avs_aes_1/aes_core_1/roundkey_generator/i +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {{Cursor 1} {2270 ns} 0} {{Cursor 2} {2490 ns} 0} +configure wave -namecolwidth 173 +configure wave -valuecolwidth 115 +configure wave -justifyvalue left +configure wave -signalnamewidth 1 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 +configure wave -gridoffset 0 +configure wave -gridperiod 40 +configure wave -griddelta 40 +configure wave -timeline 0 +configure wave -timelineunits ns +update +WaveRestoreZoom {2029 ns} {2631 ns} Index: sim/Makefile =================================================================== --- sim/Makefile (nonexistent) +++ sim/Makefile (revision 2) @@ -0,0 +1,55 @@ +VCOM = /usr/local/bin/vcom +VCOMOPS = -explicit -check_synthesis -2002 -quiet +#MAKEFLAGS = --silent +HDL_DIR = ../hdl/ + + +## +# aes_ecb files +## +AES_ECB_SRC_DIR = $(HDL_DIR)aes_ecb/ +AES_ECB_SRC =$(AES_ECB_SRC_DIR)aes_ecb_pkg.vhd \ + $(AES_ECB_SRC_DIR)mux2.vhd \ + $(AES_ECB_SRC_DIR)mux3.vhd \ + $(AES_ECB_SRC_DIR)memory_word.vhd \ + $(AES_ECB_SRC_DIR)addroundkey.vhd \ + $(AES_ECB_SRC_DIR)aes_fsm_encrypt.vhd \ + $(AES_ECB_SRC_DIR)aes_fsm_decrypt.vhd \ + $(AES_ECB_SRC_DIR)keyexpansionV2.vhd \ + $(AES_ECB_SRC_DIR)mixcol.vhd \ + $(AES_ECB_SRC_DIR)mixcol_fwd.vhd \ + $(AES_ECB_SRC_DIR)mixcol_inv.vhd \ + $(AES_ECB_SRC_DIR)sbox.vhd \ + $(AES_ECB_SRC_DIR)sboxM4k.vhd \ + $(AES_ECB_SRC_DIR)shiftrow.vhd \ + $(AES_ECB_SRC_DIR)shiftrow_fwd.vhd \ + $(AES_ECB_SRC_DIR)shiftrow_inv.vhd \ + $(AES_ECB_SRC_DIR)aes_core.vhd \ + $(AES_ECB_SRC_DIR)avs_aes.vhd \ + $(AES_ECB_SRC_DIR)avs_aes_tb.vhd + +####################################### +all: simaes + +clean: + rm -rf .deps + rm -rf *_lib + +.deps: + mkdir .deps > /dev/null 2>&1 + +aes_ecb_lib: + vlib aes_ecb_lib + +libs: aes_ecb_lib + +aes_ecb: .deps aes_ecb_lib .deps/aes_ecb +.deps/aes_ecb: $(AES_ECB_SRC) + @echo -- + @echo building AES_ECB + @echo -- + $(VCOM) $(VCOMOPS) -work aes_ecb_lib $^ + touch .deps/aes_ecb + +simaes: aes_ecb + vsim -title "AVS_AES" -do ecb.do -lib aes_ecb_lib avs_aes_tb Index: sim/sbox.hex =================================================================== --- sim/sbox.hex (nonexistent) +++ sim/sbox.hex (revision 2) @@ -0,0 +1,257 @@ +:01000000639C +:010001007C82 +:010002007786 +:010003007B81 +:01000400F209 +:010005006B8F +:010006006F8A +:01000700C533 +:0100080030C7 +:0100090001F5 +:01000A00678E +:01000B002BC9 +:01000C00FEF5 +:01000D00D71B +:01000E00AB46 +:01000F00767A +:01001000CA25 +:01001100826C +:01001200C924 +:010013007D6F +:01001400FAF1 +:010015005991 +:0100160047A2 +:01001700F0F8 +:01001800AD3A +:01001900D412 +:01001A00A243 +:01001B00AF35 +:01001C009C47 +:01001D00A43E +:01001E00726F +:01001F00C020 +:01002000B728 +:01002100FDE1 +:01002200934A +:0100230026B6 +:0100240036A5 +:010025003F9B +:01002600F7E2 +:01002700CC0C +:0100280034A3 +:01002900A531 +:01002A00E5F0 +:01002B00F1E3 +:01002C007162 +:01002D00D8FA +:01002E0031A0 +:01002F0015BB +:0100300004CB +:01003100C707 +:0100320023AA +:01003300C309 +:0100340018B3 +:010035009634 +:0100360005C4 +:010037009A2E +:0100380007C0 +:0100390012B4 +:01003A008045 +:01003B00E2E2 +:01003C00EBD8 +:01003D00279B +:01003E00B20F +:01003F00754B +:0100400009B6 +:01004100833B +:010042002C91 +:010043001AA2 +:010044001BA0 +:010045006E4C +:010046005A5F +:01004700A018 +:010048005265 +:010049003B7B +:01004A00D6DF +:01004B00B301 +:01004C00298A +:01004D00E3CF +:01004E002F82 +:01004F00842C +:01005000535C +:01005100D1DD +:0100520000AD +:01005300EDBF +:01005400208B +:01005500FCAE +:01005600B1F8 +:010057005B4D +:010058006A3D +:01005900CBDB +:01005A00BEE7 +:01005B00396B +:01005C004A59 +:01005D004C56 +:01005E005849 +:01005F00CFD1 +:01006000D0CF +:01006100EFAF +:01006200AAF3 +:01006300FBA1 +:010064004358 +:010065004D4D +:010066003366 +:010067008513 +:010068004552 +:01006900F99D +:01006A000293 +:01006B007F15 +:01006C005043 +:01006D003C56 +:01006E009FF2 +:01006F00A8E8 +:01007000513E +:01007100A3EB +:01007200404D +:010073008FFD +:0100740092F9 +:010075009DED +:010076003851 +:01007700F593 +:01007800BCCB +:01007900B6D0 +:01007A00DAAB +:01007B002163 +:01007C001073 +:01007D00FF83 +:01007E00F38E +:01007F00D2AE +:01008000CDB2 +:010081000C72 +:01008200136A +:01008300EC90 +:010084005F1C +:0100850097E3 +:010086004435 +:010087001761 +:01008800C4B3 +:01008900A7CF +:01008A007EF7 +:01008B003D37 +:01008C00640F +:01008D005D15 +:01008E001958 +:01008F0073FD +:01009000600F +:0100910081ED +:010092004F1E +:01009300DC90 +:010094002249 +:010095002A40 +:0100960090D9 +:0100970088E0 +:010098004621 +:01009900EE78 +:01009A00B8AD +:01009B001450 +:01009C00DE85 +:01009D005E04 +:01009E000B56 +:01009F00DB85 +:0100A000E07F +:0100A100322C +:0100A2003A23 +:0100A3000A52 +:0100A4004912 +:0100A5000654 +:0100A6002435 +:0100A7005CFC +:0100A800C295 +:0100A900D383 +:0100AA00ACA9 +:0100AB0062F2 +:0100AC0091C2 +:0100AD0095BD +:0100AE00E46D +:0100AF0079D7 +:0100B000E768 +:0100B100C886 +:0100B2003716 +:0100B3006DDF +:0100B4008DBE +:0100B500D575 +:0100B6004EFB +:0100B700A99F +:0100B8006CDB +:0100B90056F0 +:0100BA00F451 +:0100BB00EA5A +:0100BC0065DE +:0100BD007AC8 +:0100BE00AE93 +:0100BF000838 +:0100C000BA85 +:0100C10078C6 +:0100C2002518 +:0100C3002E0E +:0100C4001C1F +:0100C500A694 +:0100C600B485 +:0100C700C672 +:0100C800E84F +:0100C900DD59 +:0100CA0074C1 +:0100CB001F15 +:0100CC004BE8 +:0100CD00BD75 +:0100CE008BA6 +:0100CF008AA6 +:0100D00070BF +:0100D1003EF0 +:0100D200B578 +:0100D30066C6 +:0100D40048E3 +:0100D5000327 +:0100D600F633 +:0100D7000E1A +:0100D80061C6 +:0100D90035F1 +:0100DA0057CE +:0100DB00B96B +:0100DC00869D +:0100DD00C161 +:0100DE001D04 +:0100DF009E82 +:0100E000E13E +:0100E100F826 +:0100E2009885 +:0100E300110B +:0100E40069B2 +:0100E500D941 +:0100E6008E8B +:0100E7009484 +:0100E8009B7C +:0100E9001EF8 +:0100EA00878E +:0100EB00E92B +:0100EC00CE45 +:0100ED0055BD +:0100EE0028E9 +:0100EF00DF31 +:0100F0008C83 +:0100F100A16D +:0100F2008984 +:0100F3000DFF +:0100F400BF4C +:0100F500E624 +:0100F60042C7 +:0100F70068A0 +:0100F80041C6 +:0100F900996D +:0100FA002DD8 +:0100FB000FF5 +:0100FC00B053 +:0100FD0054AE +:0100FE00BB46 +:0100FF0016EA +:00000001FF Index: svn-commit.tmp =================================================================== --- svn-commit.tmp (nonexistent) +++ svn-commit.tmp (revision 2) @@ -0,0 +1,4 @@ +Initial import for opencores.org +--This line, and those below, will be ignored-- + +A . Index: svn-commit.2.tmp =================================================================== --- svn-commit.2.tmp (nonexistent) +++ svn-commit.2.tmp (revision 2) @@ -0,0 +1,4 @@ +initial import for opencores +--This line, and those below, will be ignored-- + +A .

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.