diff --git a/tools/efsl-0.3.6/CHANGELOG b/tools/efsl-0.3.6/CHANGELOG new file mode 100644 index 0000000..94f188c --- /dev/null +++ b/tools/efsl-0.3.6/CHANGELOG @@ -0,0 +1,39 @@ +CHANGEFILE +---------- + +This is the Changefile for the development 0.3 branch of EFSL. +Recording began with EFSL-0.3.3 + +0.3.5 +----- +* Added warning in documentation that it is outdated +* Changed structure definitions +* Implemnted full-feature cp +* Renamed some efsl-functions (all starting with EFSL_) +* Added another example for AVR. +* Updated docs on getting started on AVR. + +0.3.4 +----- +* Fixed avr support +* Created new avr example + makefile +* Some more work on new fsutils + +0.3.3 +----- + +* Renamed src/core to src/base +* Implemented new hwInterface structure + Support for multiple hwEndpoints in one project +* Modified SD_SPI to work as a general protocol +* Modified Linuxfile to the new hwInterface model +* Created a new efs_configger, now supports every + combination of partitions/disc +* Implemented full support for little and big endian + machines, as well as for little and big endian + filesystems +* Created new build system, for multiple platforms, + configurable from one file +* Changes cpo to use the new library functions +* Broke both dsp & atmega support + diff --git a/tools/efsl-0.3.6/Makefile b/tools/efsl-0.3.6/Makefile new file mode 100644 index 0000000..11baf89 --- /dev/null +++ b/tools/efsl-0.3.6/Makefile @@ -0,0 +1,31 @@ +include conf/config.makefile + +linux: efsl-base efsl-fs-vfat efsl-hwd-linuxfile +avr: efsl-base efsl-fs-vfat efsl-prot-sdspi efsl-hwd-atmega_sd + +efsl-base: + make -C src/base/ + cp src/base/efsl-base.a lib/libefsl-base.a + +efsl-fs-vfat: + make -C src/fs/vfat/ + cp src/fs/vfat/efsl-fs-vfat.a lib/libefsl-fs-vfat.a + +efsl-prot-sdspi: + make -C src/protocols/sdcard_spi/ + cp src/protocols/sdcard_spi/efsl-prot-sdspi.a lib/libefsl-prot-sdspi.a + +efsl-hwd-linuxfile: + make -C src/hwdrivers/linuxfile/ + cp src/hwdrivers/linuxfile/efsl-hwd-linuxfile.a lib/libefsl-hwd-linuxfile.a + +efsl-hwd-atmega_sd: + make -C src/hwdrivers/atmega_spi/ + cp src/hwdrivers/atmega_spi/efsl-hwd-atmega_spi.a lib/libefsl-hwd-atmega_spi.a + +clean: + make -C src/base/ clean + make -C src/fs/vfat/ clean + make -C src/hwdrivers/linuxfile/ clean + make -C src/hwdrivers/atmega_spi clean + rm -rf lib/*.a diff --git a/tools/efsl-0.3.6/conf/config-avr.h b/tools/efsl-0.3.6/conf/config-avr.h new file mode 100644 index 0000000..2ad2e79 --- /dev/null +++ b/tools/efsl-0.3.6/conf/config-avr.h @@ -0,0 +1,174 @@ +#ifndef __EFSL_CONFIG_H__ +#define __EFSL_CONFIG_H__ + +/* Hardware target + --------------- + + * Here you will define for what hardware-endpoint EFSL should be compiled. + * Look in interfaces.h to see what systems are supported, and add your own + * there if you need to write your own driver. Then, define the name you + * selected for your hardware there here. Make sure that you only select one + * device! +*/ + + /*#define HW_ENDPOINT_LINUX*/ + #define HW_ENDPOINT_ATMEGA128_SD + /*#define HW_ENDPOINT_DSP_TI6713_SD*/ + +#define MULTIPLE_INTERFACE_SUPPORT + +/* Architecture + ------------ + + * In this section you should configure how large the default variable + * types in your system are. This is controlled in types.h in the general + * include directory. The selection you make here defines to what the various + * e(s|u)int(8,16,32) types will map. + * For 32 bit Linux : VARSIZE_LINUX32 + * For 64 bit Linux : VARSIZE_LINUX64 + * For AVR's : VARSIZE_ATMEGA + * For TMS67XX : VARSIZE_TMS67XX + */ + +#define VARSIZE_ATMEGA + + +/* Memory configuration + -------------------- + + * Here you must configure wheter your processor can access memory byte + * oriented. All x86 processors can do it, AVR's can do it to. Some DSP + * or other microcontrollers can't. If you have an 8 bit system you're safe. + * If you are really unsure, leave the setting commented out, it will be slower + * but it will work for sure. +*/ + + #define BYTE_ALIGNMENT + +/* Cache configuration + ------------------- + + * Here you must configure how much memory of cache you can/want to use. + * The number you put at IOMAN_NUMBUFFER is multiplied by 512. So 1 means + * 512 bytes cache, 4 means 2048 bytes cache. More is better. + * The number after IOMAN_NUMITERATIONS should be untouched. + * The last field (IOMAN_DO_MEMALLOC) is to tell ioman to allocate it's + * own memory in it's structure, or not. If you choose to do it yourself + * you will have to pass a pointer to the memory as the last argument of + * ioman_init. +*/ + #define IOMAN_NUMBUFFER 1 + #define IOMAN_NUMITERATIONS 3 + #define IOMAN_DO_MEMALLOC + +/* Cluster pre-allocation + ---------------------- + + * When writing files, the function that performs the actual write has to + * calculate how many clusters it will need for that request. It then allocates + * that number of new clusters to the file. Since this involves some + * calculations and writing of the FAT, you might find it beneficial to limit + * the number of allocations, and allow fwrite to pre-allocate a number of + * clusters extra. This setting determines how many clusters will be extra + * allocated whenever this is required. + * Take in carefull consideration how large your clustersize is, putting 10 here + * with a clustersize of 32kb means you might waste 320 kb. + * The first option is for preallocating files, the other is used when enlarging + * a directory to accomodate more files +*/ + #define CLUSTER_PREALLOC_FILE 0 + #define CLUSTER_PREALLOC_DIRECTORY 0 + + +/* Endianess configuration + ----------------------- + + * Here you can configure wheter your architecture is little or big endian. This + * is important since all FAT structures are stored in intel little endian + * order. So if you have a big endian system the library has to convert all + * figures to big endian in order to work. + */ + #define HOST_LITTLE_ENDIAN + + +/* Date and Time support + --------------------- + + * Here you can enable or disable date and time support. If you enable + * it you will have to create 6 functions, that are described in the + * EFSL manual. If the functions are not present when linking your + * program with the library you will get unresolved dependencies. + */ + /* #define DATE_TIME_SUPPORT */ + +/* Error reporting support + ----------------------- + + * When you receive an error in userland, it usually only gives limited + * information (most likely, fail or success). If error detection and + * reporting is important for you, you can enable more detailed error + * reporting here. This is optional, the costs are 1 byte per object, + * and a small increase in code size. + * You can enable error recording for all object, or you can select the + * object manually. + * For full error reporting use FULL_ERROR_SUPPORT + * For only the base-core of the library use BASE_ERROR_SUPPORT + * For IO/Man use ERRSUP_IOMAN + * For Disc use ERRSUP_IOMAN + * For Part use ERRSUP_PARTITION + * For Fs use ERRSUP_FILESYSTEM + * For File use ERRSUP_FILE +*/ + + #define FULL_ERROR_SUPPORT + /*#define BASE_ERROR_SUPPORT*/ + +/* List options + ------------ + + * In this section you can configure what kind of data you will get from + * directory listing requests. Please refer to the documentation for + * more information +*/ + +#define LIST_MAXLENFILENAME 12 + + +/* Debugging configuration + ----------------------- + + * Here you can configure the debugging behaviour. Debugging is different + * on every platform (see debug.h for more information). + * If your hardware has no means of output (printf) dont define any anything, + * and nothing will happen. For real world use debugging should be turned off. +*/ + + #define DEBUG + + +/* Debugging configuration - AVR Specific: PORT + -------------------------------------------- + + * Here you can select which UART you want to use for debugging. + * If you did not define DEBUG, this setting has no effect. + * Note that it is not a good idea to use a port that you use in userspace. +*/ + + /*#define DEBUG_PORT 0*/ /* Select UART0 */ + #define DEBUG_PORT 1 /* Select UART1 */ + + +/* Debugging configuration - AVR Specific: UBRR + -------------------------------------------- + + * Here you can set UBRR, this value will select the serial clock speed. + * This value depends on your baudrate and clockrate. U2X is by standard 0, + * if you would want this 1 for some reason, this can be done in debug.c. +*/ + + /*#define DEBUG_UBRR 51*/ /* 9600bps on 8Mhz */ + #define DEBUG_UBRR 95 /* 9600bps on 14.7456Mhz */ + /*#define DEBUG_UBRR 103*/ /* 9600bps on 16Mhz */ + + +#endif diff --git a/tools/efsl-0.3.6/conf/config-avr.makefile b/tools/efsl-0.3.6/conf/config-avr.makefile new file mode 100644 index 0000000..716b554 --- /dev/null +++ b/tools/efsl-0.3.6/conf/config-avr.makefile @@ -0,0 +1,46 @@ +################################################################################ +### EFSL - Embedded Filesystems Library ### +### ----------------------------------- ### +### ### +################################################################################ + +# This is the configuration file for EFSL. This file will enable your to build +# the library if you have GNU make, or compatible, on your system. +# If you do not have a make utility on your system, or it cannot be used in this +# fashion (when using IDE's, like MSVC or Code composer), please refer to the +# documentation on how to build EFSL. It is possible to build EFSL with any C +# compiler although it will be a bit more work. + +# C compiler +# ---------- +# +# Here you select with what binary the sourcefiles must be compiled + +CC=avr-gcc + +# AR archiver +# ----------- +# +# This variable controls what archiver is to be used. This utility is optional, +# if you don't have GNU make, you probably need to link differently as well. + +AR=avr-ar + +# Objcopy +# -------- +# +# This variable controls what objcopy is to be used. This utility will be used +# when the program is converted to an format that your uC understands. + +OBJCOPY=avr-objcopy + +# C compiler options +# ------------------ +# +# Here you can configure several options about the compilation. + +DEBUGGING=-g3 +VERIFY=-Wall +ARCHITECTURE=-mmcu=atmega128 +OPTIMISE=-Os +GCFLAGS=$(DEBUGGING) $(VERIFY) $(ARCHITECTURE) $(OPTIMISE) diff --git a/tools/efsl-0.3.6/conf/config-linux.h b/tools/efsl-0.3.6/conf/config-linux.h new file mode 100644 index 0000000..dfc4678 --- /dev/null +++ b/tools/efsl-0.3.6/conf/config-linux.h @@ -0,0 +1,151 @@ +#ifndef __EFSL_CONFIG_H__ +#define __EFSL_CONFIG_H__ + +/* Hardware target + --------------- + + * Here you will define for what hardware-endpoint EFSL should be compiled. + * Look in interfaces.h to see what systems are supported, and add your own + * there if you need to write your own driver. Then, define the name you + * selected for your hardware there here. Make sure that you only select one + * device! +*/ + + /*#define HW_ENDPOINT_LINUX*/ + /*#define HW_ENDPOINT_ATMEGA128_SD*/ + /*#define HW_ENDPOINT_DSP_TI6713_SD*/ + +#define MULTIPLE_INTERFACE_SUPPORT +/*#define HWIFUNC_INIT(x) lf_init(x) +#define HWIFUNC_READ(x,y,z) lf_readBuf(x,y,z) +#define HWIFUNC_WRITE(x,y,z) lf_writeBuf(x,y,z) +#define HWIFUNC_HEADER interfaces/linuxfile.h */ + +/* Architecture + ------------ + + * In this section you should configure how large the default variable + * types in your system are. This is controlled in types.h in the general + * include directory. The selection you make here defines to what the various + * e(s|u)int(8,16,32) types will map. + * For 32 bit Linux : VARSIZE_LINUX32 + * For 64 bit Linux : VARSIZE_LINUX64 + * For AVR's : VARSIZE_ATMEGA + * For TMS67XX : VARSIZE_TMS67XX + */ + +#define VARSIZE_LINUX32 + +/* Memory configuration + -------------------- + + * Here you must configure wheter your processor can access memory byte + * oriented. All x86 processors can do it, AVR's can do it to. Some DSP + * or other microcontrollers can't. If you have an 8 bit system you're safe. + * If you are really unsure, leave the setting commented out, it will be slower + * but it will work for sure. +*/ + + #define BYTE_ALIGNMENT + +/* Cache configuration + ------------------- + + * Here you must configure how much memory of cache you can/want to use. + * The number you put at IOMAN_NUMBUFFER is multiplied by 512. So 1 means + * 512 bytes cache, 4 means 2048 bytes cache. More is better. + * The number after IOMAN_NUMITERATIONS should be untouched. + * The last field (IOMAN_DO_MEMALLOC) is to tell ioman to allocate it's + * own memory in it's structure, or not. If you choose to do it yourself + * you will have to pass a pointer to the memory as the last argument of + * ioman_init. +*/ + #define IOMAN_NUMBUFFER 10 + #define IOMAN_NUMITERATIONS 3 + #define IOMAN_DO_MEMALLOC + +/* Cluster pre-allocation + ---------------------- + + * When writing files, the function that performs the actual write has to + * calculate how many clusters it will need for that request. It then allocates + * that number of new clusters to the file. Since this involves some + * calculations and writing of the FAT, you might find it beneficial to limit + * the number of allocations, and allow fwrite to pre-allocate a number of + * clusters extra. This setting determines how many clusters will be extra + * allocated whenever this is required. + * Take in carefull consideration how large your clustersize is, putting 10 here + * with a clustersize of 32kb means you might waste 320 kb. + * The first option is for preallocating files, the other is used when enlarging + * a directory to accomodate more files +*/ + #define CLUSTER_PREALLOC_FILE 5 + #define CLUSTER_PREALLOC_DIRECTORY 2 + +/* Endianess configuration + ----------------------- + + * Here you can configure wheter your architecture is little or big endian. This + * is important since all FAT structures are stored in intel little endian + * order. So if you have a big endian system the library has to convert all + * figures to big endian in order to work. + */ + /*#define HOST_BIG_ENDIAN*/ + #define HOST_LITTLE_ENDIAN + +/* Date and Time support + --------------------- + + * Here you can enable or disable date and time support. If you enable + * it you will have to create 6 functions, that are described in the + * EFSL manual. If the functions are not present when linking your + * program with the library you will get unresolved dependencies. + */ + /* #define DATE_TIME_SUPPORT */ + +/* Error reporting support + ----------------------- + + * When you receive an error in userland, it usually only gives limited + * information (most likely, fail or success). If error detection and + * reporting is important for you, you can enable more detailed error + * reporting here. This is optional, the costs are 1 byte per object, + * and a small increase in code size. + * You can enable error recording for all object, or you can select the + * object manually. + * For full error reporting use FULL_ERROR_SUPPORT + * For only the base-core of the library use BASE_ERROR_SUPPORT + * For IO/Man use ERRSUP_IOMAN + * For Disc use ERRSUP_IOMAN + * For Part use ERRSUP_PARTITION + * For Fs use ERRSUP_FILESYSTEM + * For File use ERRSUP_FILE +*/ + + #define FULL_ERROR_SUPPORT + /*#define BASE_ERROR_SUPPORT*/ + + +/* Debugging configuration + ----------------------- + + * Here you can configure the debugging behaviour. Debugging is different + * on every platform (see debug.h for more information). + * If your hardware has no means of output (printf) dont define any anything, + * and nothing will happen. For real world use debugging should be turned off. +*/ + + /*#define DEBUG*/ + /*#define DO_FUNC_DEBUG*/ + +/* List options + ------------ + + * In this section you can configure what kind of data you will get from + * directory listing requests. Please refer to the documentation for + * more information +*/ + + #define LIST_MAXLENFILENAME 12 + +#endif diff --git a/tools/efsl-0.3.6/conf/config-linux.makefile b/tools/efsl-0.3.6/conf/config-linux.makefile new file mode 100644 index 0000000..8fc7cda --- /dev/null +++ b/tools/efsl-0.3.6/conf/config-linux.makefile @@ -0,0 +1,38 @@ +################################################################################ +### EFSL - Embedded Filesystems Library ### +### ----------------------------------- ### +### ### +################################################################################ + +# This is the configuration file for EFSL. This file will enable your to build +# the library if you have GNU make, or compatible, on your system. +# If you do not have a make utility on your system, or it cannot be used in this +# fashion (when using IDE's, like MSVC or Code composer), please refer to the +# documentation on how to build EFSL. It is possible to build EFSL with any C +# compiler although it will be a bit more work. + +# C compiler +# ---------- +# +# Here you select with what binary the sourcefiles must be compiled + +CC=gcc + +# AR archiver +# ----------- +# +# This variable controls what archiver is to be used. This utility is optional, +# if you don't have GNU make, you probably need to link differently as well. + +AR=ar + +# C compiler options +# ------------------ +# +# Here you can configure several options about the compilation. + +DEBUGGING=-g3 +VERIFY=-Wall -pedantic -ansi +ARCHITECTURE=-march=i386 +OPTIMISE=-O0 +GCFLAGS=$(DEBUGGING) $(VERIFY) $(ARCHITECTURE) $(OPTIMISE) \ No newline at end of file diff --git a/tools/efsl-0.3.6/conf/config-linux64.h b/tools/efsl-0.3.6/conf/config-linux64.h new file mode 100644 index 0000000..f83e817 --- /dev/null +++ b/tools/efsl-0.3.6/conf/config-linux64.h @@ -0,0 +1,151 @@ +#ifndef __EFSL_CONFIG_H__ +#define __EFSL_CONFIG_H__ + +/* Hardware target + --------------- + + * Here you will define for what hardware-endpoint EFSL should be compiled. + * Look in interfaces.h to see what systems are supported, and add your own + * there if you need to write your own driver. Then, define the name you + * selected for your hardware there here. Make sure that you only select one + * device! +*/ + + /*#define HW_ENDPOINT_LINUX*/ + /*#define HW_ENDPOINT_ATMEGA128_SD*/ + /*#define HW_ENDPOINT_DSP_TI6713_SD*/ + +#define MULTIPLE_INTERFACE_SUPPORT +/*#define HWIFUNC_INIT(x) lf_init(x) +#define HWIFUNC_READ(x,y,z) lf_readBuf(x,y,z) +#define HWIFUNC_WRITE(x,y,z) lf_writeBuf(x,y,z) +#define HWIFUNC_HEADER interfaces/linuxfile.h */ + +/* Architecture + ------------ + + * In this section you should configure how large the default variable + * types in your system are. This is controlled in types.h in the general + * include directory. The selection you make here defines to what the various + * e(s|u)int(8,16,32) types will map. + * For 32 bit Linux : VARSIZE_LINUX32 + * For 64 bit Linux : VARSIZE_LINUX64 + * For AVR's : VARSIZE_ATMEGA + * For TMS67XX : VARSIZE_TMS67XX + */ + +#define VARSIZE_LINUX64 + +/* Memory configuration + -------------------- + + * Here you must configure wheter your processor can access memory byte + * oriented. All x86 processors can do it, AVR's can do it to. Some DSP + * or other microcontrollers can't. If you have an 8 bit system you're safe. + * If you are really unsure, leave the setting commented out, it will be slower + * but it will work for sure. +*/ + + #define BYTE_ALIGNMENT + +/* Cache configuration + ------------------- + + * Here you must configure how much memory of cache you can/want to use. + * The number you put at IOMAN_NUMBUFFER is multiplied by 512. So 1 means + * 512 bytes cache, 4 means 2048 bytes cache. More is better. + * The number after IOMAN_NUMITERATIONS should be untouched. + * The last field (IOMAN_DO_MEMALLOC) is to tell ioman to allocate it's + * own memory in it's structure, or not. If you choose to do it yourself + * you will have to pass a pointer to the memory as the last argument of + * ioman_init. +*/ + #define IOMAN_NUMBUFFER 10 + #define IOMAN_NUMITERATIONS 3 + #define IOMAN_DO_MEMALLOC + +/* Cluster pre-allocation + ---------------------- + + * When writing files, the function that performs the actual write has to + * calculate how many clusters it will need for that request. It then allocates + * that number of new clusters to the file. Since this involves some + * calculations and writing of the FAT, you might find it beneficial to limit + * the number of allocations, and allow fwrite to pre-allocate a number of + * clusters extra. This setting determines how many clusters will be extra + * allocated whenever this is required. + * Take in carefull consideration how large your clustersize is, putting 10 here + * with a clustersize of 32kb means you might waste 320 kb. + * The first option is for preallocating files, the other is used when enlarging + * a directory to accomodate more files +*/ + #define CLUSTER_PREALLOC_FILE 5 + #define CLUSTER_PREALLOC_DIRECTORY 2 + +/* Endianess configuration + ----------------------- + + * Here you can configure wheter your architecture is little or big endian. This + * is important since all FAT structures are stored in intel little endian + * order. So if you have a big endian system the library has to convert all + * figures to big endian in order to work. + */ + /*#define HOST_BIG_ENDIAN*/ + #define HOST_LITTLE_ENDIAN + +/* Date and Time support + --------------------- + + * Here you can enable or disable date and time support. If you enable + * it you will have to create 6 functions, that are described in the + * EFSL manual. If the functions are not present when linking your + * program with the library you will get unresolved dependencies. + */ + /* #define DATE_TIME_SUPPORT */ + +/* Error reporting support + ----------------------- + + * When you receive an error in userland, it usually only gives limited + * information (most likely, fail or success). If error detection and + * reporting is important for you, you can enable more detailed error + * reporting here. This is optional, the costs are 1 byte per object, + * and a small increase in code size. + * You can enable error recording for all object, or you can select the + * object manually. + * For full error reporting use FULL_ERROR_SUPPORT + * For only the base-core of the library use BASE_ERROR_SUPPORT + * For IO/Man use ERRSUP_IOMAN + * For Disc use ERRSUP_IOMAN + * For Part use ERRSUP_PARTITION + * For Fs use ERRSUP_FILESYSTEM + * For File use ERRSUP_FILE +*/ + + #define FULL_ERROR_SUPPORT + /*#define BASE_ERROR_SUPPORT*/ + + +/* Debugging configuration + ----------------------- + + * Here you can configure the debugging behaviour. Debugging is different + * on every platform (see debug.h for more information). + * If your hardware has no means of output (printf) dont define any anything, + * and nothing will happen. For real world use debugging should be turned off. +*/ + + /*#define DEBUG*/ + /*#define DO_FUNC_DEBUG*/ + +/* List options + ------------ + + * In this section you can configure what kind of data you will get from + * directory listing requests. Please refer to the documentation for + * more information +*/ + + #define LIST_MAXLENFILENAME 12 + +#endif diff --git a/tools/efsl-0.3.6/conf/config-linux64.makefile b/tools/efsl-0.3.6/conf/config-linux64.makefile new file mode 100644 index 0000000..c59239e --- /dev/null +++ b/tools/efsl-0.3.6/conf/config-linux64.makefile @@ -0,0 +1,38 @@ +################################################################################ +### EFSL - Embedded Filesystems Library ### +### ----------------------------------- ### +### ### +################################################################################ + +# This is the configuration file for EFSL. This file will enable your to build +# the library if you have GNU make, or compatible, on your system. +# If you do not have a make utility on your system, or it cannot be used in this +# fashion (when using IDE's, like MSVC or Code composer), please refer to the +# documentation on how to build EFSL. It is possible to build EFSL with any C +# compiler although it will be a bit more work. + +# C compiler +# ---------- +# +# Here you select with what binary the sourcefiles must be compiled + +CC=gcc + +# AR archiver +# ----------- +# +# This variable controls what archiver is to be used. This utility is optional, +# if you don't have GNU make, you probably need to link differently as well. + +AR=ar + +# C compiler options +# ------------------ +# +# Here you can configure several options about the compilation. + +DEBUGGING=-g3 +VERIFY=-Wall -pedantic -ansi +ARCHITECTURE=-march=k8 +OPTIMISE=-O0 +GCFLAGS=$(DEBUGGING) $(VERIFY) $(ARCHITECTURE) $(OPTIMISE) diff --git a/tools/efsl-0.3.6/conf/config.h b/tools/efsl-0.3.6/conf/config.h new file mode 120000 index 0000000..6b2f2ba --- /dev/null +++ b/tools/efsl-0.3.6/conf/config.h @@ -0,0 +1 @@ +config-linux.h \ No newline at end of file diff --git a/tools/efsl-0.3.6/conf/config.makefile b/tools/efsl-0.3.6/conf/config.makefile new file mode 120000 index 0000000..acd7fa7 --- /dev/null +++ b/tools/efsl-0.3.6/conf/config.makefile @@ -0,0 +1 @@ +config-linux.makefile \ No newline at end of file diff --git a/tools/efsl-0.3.6/docs/Makefile b/tools/efsl-0.3.6/docs/Makefile new file mode 100644 index 0000000..b1636f9 --- /dev/null +++ b/tools/efsl-0.3.6/docs/Makefile @@ -0,0 +1,13 @@ +all: manual.tex + latex manual.tex + latex manual.tex # Needs to be done a second time to make sure that the contents table is correct + dvips -o manual.ps manual.dvi + dvipdfm manual.dvi + +clean: + rm -f manual.aux + rm -f manual.dvi + rm -f manual.log + rm -f manual.pdf + rm -f manual.ps + rm -f manual.toc diff --git a/tools/efsl-0.3.6/docs/efsl-manual-0.3.5.pdf b/tools/efsl-0.3.6/docs/efsl-manual-0.3.5.pdf new file mode 100644 index 0000000..21fa56f --- /dev/null +++ b/tools/efsl-0.3.6/docs/efsl-manual-0.3.5.pdf @@ -0,0 +1,4407 @@ +%PDF-1.2 +7 0 obj +<< +/Type/Encoding +/Differences[0/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi/Omega/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/suppress/exclam/quotedblright/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/exclamdown/equal/questiondown/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/quotedblleft/bracketright/circumflex/dotaccent/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash/emdash/hungarumlaut/tilde/dieresis/suppress +160/space/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi 173/Omega/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/suppress/dieresis] +>> +endobj +10 0 obj +<< +/Encoding 7 0 R +/Type/Font +/Subtype/Type1 +/Name/F1 +/FontDescriptor 9 0 R +/BaseFont/FZCLVO+CMR17 +/FirstChar 33 +/LastChar 196 +/Widths[249.6 458.6 772.1 458.6 772.1 719.8 249.6 354.1 354.1 458.6 719.8 249.6 301.9 +249.6 458.6 458.6 458.6 458.6 458.6 458.6 458.6 458.6 458.6 458.6 458.6 249.6 249.6 +249.6 719.8 432.5 432.5 719.8 693.3 654.3 667.6 706.6 628.2 602.1 726.3 693.3 327.6 +471.5 719.4 576 850 693.3 719.8 628.2 719.8 680.5 510.9 667.6 693.3 693.3 954.5 693.3 +693.3 563.1 249.6 458.6 249.6 458.6 249.6 249.6 458.6 510.9 406.4 510.9 406.4 275.8 +458.6 510.9 249.6 275.8 484.7 249.6 772.1 510.9 458.6 510.9 484.7 354.1 359.4 354.1 +510.9 484.7 667.6 484.7 484.7 406.4 458.6 917.2 458.6 458.6 458.6 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 576 772.1 719.8 641.1 615.3 693.3 +667.6 719.8 667.6 719.8 0 0 667.6 525.4 499.3 499.3 748.9 748.9 249.6 275.8 458.6 +458.6 458.6 458.6 458.6 693.3 406.4 458.6 667.6 719.8 458.6 837.2 941.7 719.8 249.6 +458.6] +>> +endobj +13 0 obj +<< +/Encoding 7 0 R +/Type/Font +/Subtype/Type1 +/Name/F2 +/FontDescriptor 12 0 R +/BaseFont/IUHUTQ+CMR12 +/FirstChar 33 +/LastChar 196 +/Widths[272 489.6 816 489.6 816 761.6 272 380.8 380.8 489.6 761.6 272 326.4 272 489.6 +489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 272 272 272 761.6 462.4 +462.4 761.6 734 693.4 707.2 747.8 666.2 639 768.3 734 353.2 503 761.2 611.8 897.2 +734 761.6 666.2 761.6 720.6 544 707.2 734 734 1006 734 734 598.4 272 489.6 272 489.6 +272 272 489.6 544 435.2 544 435.2 299.2 489.6 544 272 299.2 516.8 272 816 544 489.6 +544 516.8 380.8 386.2 380.8 544 516.8 707.2 516.8 516.8 435.2 489.6 979.2 489.6 489.6 +489.6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 611.8 816 +761.6 679.6 652.8 734 707.2 761.6 707.2 761.6 0 0 707.2 571.2 544 544 816 816 272 +299.2 489.6 489.6 489.6 489.6 489.6 734 435.2 489.6 707.2 761.6 489.6 883.8 992.6 +761.6 272 489.6] +>> +endobj +14 0 obj +<< +/Type/Encoding +/Differences[0/minus/periodcentered/multiply/asteriskmath/divide/diamondmath/plusminus/minusplus/circleplus/circleminus/circlemultiply/circledivide/circledot/circlecopyrt/openbullet/bullet/equivasymptotic/equivalence/reflexsubset/reflexsuperset/lessequal/greaterequal/precedesequal/followsequal/similar/approxequal/propersubset/propersuperset/lessmuch/greatermuch/precedes/follows/arrowleft/arrowright/arrowup/arrowdown/arrowboth/arrownortheast/arrowsoutheast/similarequal/arrowdblleft/arrowdblright/arrowdblup/arrowdbldown/arrowdblboth/arrownorthwest/arrowsouthwest/proportional/prime/infinity/element/owner/triangle/triangleinv/negationslash/mapsto/universal/existential/logicalnot/emptyset/Rfractur/Ifractur/latticetop/perpendicular/aleph/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/union/intersection/unionmulti/logicaland/logicalor/turnstileleft/turnstileright/floorleft/floorright/ceilingleft/ceilingright/braceleft/braceright/angbracketleft/angbracketright/bar/bardbl/arrowbothv/arrowdblbothv/backslash/wreathproduct/radical/coproduct/nabla/integral/unionsq/intersectionsq/subsetsqequal/supersetsqequal/section/dagger/daggerdbl/paragraph/club/diamond/heart/spade/arrowleft +161/minus/periodcentered/multiply/asteriskmath/divide/diamondmath/plusminus/minusplus/circleplus/circleminus +173/circlemultiply/circledivide/circledot/circlecopyrt/openbullet/bullet/equivasymptotic/equivalence/reflexsubset/reflexsuperset/lessequal/greaterequal/precedesequal/followsequal/similar/approxequal/propersubset/propersuperset/lessmuch/greatermuch/precedes/follows/arrowleft/spade] +>> +endobj +17 0 obj +<< +/Encoding 14 0 R +/Type/Font +/Subtype/Type1 +/Name/F3 +/FontDescriptor 16 0 R +/BaseFont/KJGAGP+CMSY10 +/FirstChar 33 +/LastChar 196 +/Widths[1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 +275 1000 666.7 666.7 888.9 888.9 0 0 555.6 555.6 666.7 500 722.2 722.2 777.8 777.8 +611.1 798.5 656.8 526.5 771.4 527.8 718.7 594.9 844.5 544.5 677.8 762 689.7 1200.9 +820.5 796.1 695.6 816.7 847.5 605.6 544.6 625.8 612.8 987.8 713.3 668.3 724.7 666.7 +666.7 666.7 666.7 666.7 611.1 611.1 444.4 444.4 444.4 444.4 500 500 388.9 388.9 277.8 +500 500 611.1 500 277.8 833.3 750 833.3 416.7 666.7 666.7 777.8 777.8 444.4 444.4 +444.4 611.1 777.8 777.8 777.8 777.8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 777.8 277.8 777.8 500 777.8 500 777.8 777.8 777.8 777.8 0 0 777.8 +777.8 777.8 1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 +777.8 777.8 1000 1000 777.8 777.8 1000 777.8] +>> +endobj +20 0 obj +<< +/Encoding 7 0 R +/Type/Font +/Subtype/Type1 +/Name/F4 +/FontDescriptor 19 0 R +/BaseFont/XPQNDA+CMR10 +/FirstChar 33 +/LastChar 196 +/Widths[277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 +500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 +750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 +680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 +277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 +500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4 500 1000 500 +500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 625 833.3 +777.8 694.4 666.7 750 722.2 777.8 722.2 777.8 0 0 722.2 583.3 555.6 555.6 833.3 833.3 +277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 +277.8 500] +>> +endobj +22 0 obj +<< +/Filter[/FlateDecode] +/Length 278 +>> +stream +xڭQ;O07&cEm CHdAA 'WrsxNC +ߤ@ + :`BHbS6c{ B"YBmϠ/ے.|d2,aq^~ ]4vc~eyQ~&tULСR(BM?iɊ(S}]СLFAx=bΏYo1 Po r.6L4BQ" +x"U2ߴ;O<NGK0mRl?yB +endstream +endobj +24 0 obj +<< +/F1 10 0 R +/F2 13 0 R +/F3 17 0 R +/F4 20 0 R +>> +endobj +6 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 24 0 R +>> +endobj +29 0 obj +<< +/Encoding 7 0 R +/Type/Font +/Subtype/Type1 +/Name/F5 +/FontDescriptor 28 0 R +/BaseFont/IBJNCR+CMBX12 +/FirstChar 33 +/LastChar 196 +/Widths[342.6 581 937.5 562.5 937.5 875 312.5 437.5 437.5 562.5 875 312.5 375 312.5 +562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 +875 531.2 531.2 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 +675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 +687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 +343.7 593.7 312.5 937.5 625 562.5 625 593.7 459.5 443.8 437.5 625 593.7 812.5 593.7 +593.7 500 562.5 1125 562.5 562.5 562.5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 675.9 937.5 875 787 750 879.6 812.5 875 812.5 875 0 0 812.5 +656.2 625 625 937.5 937.5 312.5 343.7 562.5 562.5 562.5 562.5 562.5 849.5 500 574.1 +812.5 875 562.5 1018.5 1143.5 875 312.5 562.5] +>> +endobj +32 0 obj +<< +/Encoding 7 0 R +/Type/Font +/Subtype/Type1 +/Name/F6 +/FontDescriptor 31 0 R +/BaseFont/NJQRVN+CMBX10 +/FirstChar 33 +/LastChar 196 +/Widths[350 602.8 958.3 575 958.3 894.4 319.4 447.2 447.2 575 894.4 319.4 383.3 319.4 +575 575 575 575 575 575 575 575 575 575 575 319.4 319.4 350 894.4 543.1 543.1 894.4 +869.4 818.1 830.6 881.9 755.6 723.6 904.2 900 436.1 594.4 901.4 691.7 1091.7 900 +863.9 786.1 863.9 862.5 638.9 800 884.7 869.4 1188.9 869.4 869.4 702.8 319.4 602.8 +319.4 575 319.4 319.4 559 638.9 511.1 638.9 527.1 351.4 575 638.9 319.4 351.4 606.9 +319.4 958.3 638.9 575 638.9 606.9 473.6 453.6 447.2 638.9 606.9 830.6 606.9 606.9 +511.1 575 1150 575 575 575 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 691.7 958.3 894.4 805.6 766.7 900 830.6 894.4 830.6 894.4 0 0 830.6 670.8 +638.9 638.9 958.3 958.3 319.4 351.4 575 575 575 575 575 869.4 511.1 597.2 830.6 894.4 +575 1041.7 1169.4 894.4 319.4 575] +>> +endobj +33 0 obj +<< +/Filter[/FlateDecode] +/Length 1536 +>> +stream +xIs6CxXtILhUDz$N}a23E_D"20Y{y]b?:kݜ)CˌS$u6?3? )v//NEvΦ Mڇd)ˏh>ۭ,s kESο)0/h'ݦ,fyP sֽWlJcQVH'71|VW%\6Ej-sOҕx~ʏЛR O.Ц4jM˿(ZFj(b +ᩐ ! +7|cR1@aE6䭣bf-g +SDH +1ph]Nժ{ +1db{o$x0ٍߓj,nM.oJetVz{\4eOjUr]%FAnuzەv7zcV&# 7zcVޘ˿w@c&~ڷь~-}Ӊh<':Cݼ76֛f3ku$Eđry:3mȤឭ=ո_egV`?%.e3X0Yn]X'U_>"nf/aL?Gzj7Ma)D~,D'v=iT~%'rP=]=n8~хN. 2v#70PP$wSϥUT&!8}ǝ2$u u˽,;O{$eh@qϷ1fPq)r& 6L.ỗՠ`ܳlO q)&cS %4pz2r(?U$\J#܁?{N\YlFmP%9OР\ٵ\쾎=yvn +Li#ĕcLeE#m"\wu{Ă'\oҭ]($#F߱۱EG 1;Hx@`7$Dtk Ì}*RĈQWk*O +endstream +endobj +34 0 obj +<< +/F5 29 0 R +/F6 32 0 R +/F4 20 0 R +>> +endobj +26 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 34 0 R +>> +endobj +37 0 obj +<< +/Filter[/FlateDecode] +/Length 656 +>> +stream +xKs0:mKZ{jzp R0-h:@$ 跫֨fn>|wB['xʑ-QBRbh$(7_捈O ~\&1qF4۬(W^m3#rٻIizTʞkD H[t>$D,yzAZlJj֣.LbY'>Ht(%Ikɪ&5;"ntU:jIsM0V' d Ƽ_2-'=g> -  E| 9݃z~} +,1HzH(&QM-)*^LL[dƑݺ.6yֱ`zFZp8^Dqh_-MZn M{0l6 +7wi\8pRG`uTVhuypWxdQGjo%س1O@SپU굶/)[) c`Y<9/s+.*etf>; vj/ßv7$ؤy) =9pp~gXהR גJ{= --K +endstream +endobj +38 0 obj +<< +/F4 20 0 R +/F6 32 0 R +>> +endobj +36 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 38 0 R +>> +endobj +41 0 obj +<< +/Filter[/FlateDecode] +/Length 428 +>> +stream +xڕMS0x 3\ps> +endobj +40 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 42 0 R +>> +endobj +45 0 obj +<< +/Filter[/FlateDecode] +/Length 1601 +>> +stream +xڕWKs6WfpfH%3XN&!1I hEXPKiǷYFl5s;by9K}6;V}x1ir(gWyU= ^P!]yluoURdLn tVe>0//9tO5S`0R)$ R0[-!Wp FEg̙dM'kLGۿ]xBd]n$_Wi b- +l;kΆqv&hcbzPу^Z:c1 [9""᩹Ai1"GC E桕sfEȞh$Q?=J/;j/ia'FV`pnmՁƁչڻWO=E'tqCp/؟V’X'^v[b Q^\}/odՉkЉ„ufiժ9vq@1_Qngd*7BA@ vIX:<9b^R!L(d0*"64R@řj ҈o`Qgx^R +Oj0?xuߒm R,G!*>dp+#qIM#{3ܽ{S|8 Sk^FQ~Qfg0+i)/%duпm Vrho9ޠ&r "$F)[31{"d`FYqL0MLg)<{'粏m:q$du 1*ϭJ@6c\Ƀ O'Xc*ŀ`Vםj@UO婑'ME=莈 tNΡ=@鏝Oʽ3J\xIN4g_![Ola0"(166pUֶ;bV/|pI<9T3DԒȧNj 6g ub~X찫G[=a뀎zߞH&>(VHU0Uh>E1up88?EUN!8V{TA[픽BNtI!ycD\je>.#AQ;PBY3^;xOفK:$7p"ɧB:vc&JrۚTzm`)Ȃ}G7,Q?kaq[L@RV܏bx/c QGK"=^ڃqAACePs jNSS&A4+|܉{bMt&˚w~1(q 22Yӟ_  +endstream +endobj +46 0 obj +<< +/F5 29 0 R +/F4 20 0 R +>> +endobj +44 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 46 0 R +>> +endobj +51 0 obj +<< +/Encoding 7 0 R +/Type/Font +/Subtype/Type1 +/Name/F7 +/FontDescriptor 50 0 R +/BaseFont/IFKPZD+CMSS10 +/FirstChar 33 +/LastChar 196 +/Widths[319.4 500 833.3 500 833.3 758.3 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 +500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 319.4 777.8 472.2 472.2 666.7 +666.7 666.7 638.9 722.2 597.2 569.4 666.7 708.3 277.8 472.2 694.4 541.7 875 708.3 +736.1 638.9 736.1 645.8 555.6 680.6 687.5 666.7 944.4 666.7 666.7 611.1 288.9 500 +288.9 500 277.8 277.8 480.6 516.7 444.4 516.7 444.4 305.6 500 516.7 238.9 266.7 488.9 +238.9 794.4 516.7 500 516.7 516.7 341.7 383.3 361.1 516.7 461.1 683.3 461.1 461.1 +434.7 500 1000 500 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 541.7 833.3 777.8 611.1 666.7 708.3 722.2 777.8 722.2 777.8 0 0 722.2 +583.3 536.1 536.1 813.9 813.9 238.9 266.7 500 500 500 500 500 666.7 444.4 480.6 722.2 +777.8 500 861.1 972.2 777.8 238.9 500] +>> +endobj +52 0 obj +<< +/Filter[/FlateDecode] +/Length 2039 +>> +stream +xڥXK۸W5T5D|mm'M2JU&IP |HT2F\>oyxv/O"RvG2Ad +jaguU[*늶3nLCǸzLP~_^jj-Gjq'8ݒZF!z<xF2IGsv$Gl]HƏQ* +ـ41?8Ti E7-EZyD2aʢwp3aY4:w2{ ctfvmBEW=/9mxPS~Z@rhnn_t7Ei[? ]L\k-h/pl4ixvkIf&a/:va] hݓ\|xKob&$&O^@?jǪ&t,H S`Q0]1NXgaYZ&ڴxi~eoMqFmj_[IоiQ"hp~!,GŔ\ۘW,od~c 0.U(NMm /8Wx5;"eş>o8"ѸS  &-T&g#1E]t`&Z3D*tm,tǟW$V6[[0d +W3*43X򆩼Kh.}b3Ƌ^DTp}jv'!L+lO?mr 4-ETLyG}U Pl Y O*ѵK gwA.]?i߮i%2ԯk:hMLC]5*N 8 9&"MaD@f(IDWm?#xHޑzEKlWAQw+8Q/ ^sJRǣK~^o0*۸檈䤨V3%&[}".{8vqS3ejأg#2QR2A]P9>BFPmk't|LioĂ}+'2X-cggi1͈mx;,*t7<1bh34e3Xcb:!N`}y DZ +ʼn(vʂ$P k]I%Թj'"~}{NjJsRu[h}^2x4H !Ic;&9QB +b{@slRI٩0dN~iŵ83|GBcBV~#p >h;L kiۮ-;Tc(st $ Ų}E}<8.Jl새@(o<P:[́ełTG>ls$h.?U(ME9`\ט7f +T'W%:Gr fI EG毵|mK2O;Ր;gA}k8eOGB Qӱ$:C=^C\ߕbtKRTɳ] +endstream +endobj +53 0 obj +<< +/F5 29 0 R +/F4 20 0 R +/F6 32 0 R +/F3 17 0 R +/F7 51 0 R +>> +endobj +48 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 53 0 R +>> +endobj +58 0 obj +<< +/Encoding 7 0 R +/Type/Font +/Subtype/Type1 +/Name/F8 +/FontDescriptor 57 0 R +/BaseFont/HMMPMV+CMR9 +/FirstChar 33 +/LastChar 196 +/Widths[285.5 513.9 856.5 513.9 856.5 799.4 285.5 399.7 399.7 513.9 799.4 285.5 342.6 +285.5 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 513.9 285.5 285.5 +285.5 799.4 485.3 485.3 799.4 770.7 727.9 742.3 785 699.4 670.8 806.5 770.7 371 528.1 +799.2 642.3 942 770.7 799.4 699.4 799.4 756.5 571 742.3 770.7 770.7 1056.2 770.7 +770.7 628.1 285.5 513.9 285.5 513.9 285.5 285.5 513.9 571 456.8 571 457.2 314 513.9 +571 285.5 314 542.4 285.5 856.5 571 513.9 571 542.4 402 405.4 399.7 571 542.4 742.3 +542.4 542.4 456.8 513.9 1027.8 513.9 513.9 513.9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 642.3 856.5 799.4 713.6 685.2 770.7 742.3 799.4 +742.3 799.4 0 0 742.3 599.5 571 571 856.5 856.5 285.5 314 513.9 513.9 513.9 513.9 +513.9 770.7 456.8 513.9 742.3 799.4 513.9 927.8 1042 799.4 285.5 513.9] +>> +endobj +59 0 obj +<< +/Type/Encoding +/Differences[0/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi/Omega/alpha/beta/gamma/delta/epsilon1/zeta/eta/theta/iota/kappa/lambda/mu/nu/xi/pi/rho/sigma/tau/upsilon/phi/chi/psi/omega/epsilon/theta1/pi1/rho1/sigma1/phi1/arrowlefttophalf/arrowleftbothalf/arrowrighttophalf/arrowrightbothalf/arrowhookleft/arrowhookright/triangleright/triangleleft/zerooldstyle/oneoldstyle/twooldstyle/threeoldstyle/fouroldstyle/fiveoldstyle/sixoldstyle/sevenoldstyle/eightoldstyle/nineoldstyle/period/comma/less/slash/greater/star/partialdiff/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/flat/natural/sharp/slurbelow/slurabove/lscript/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/dotlessi/dotlessj/weierstrass/vector/tie/psi +160/space/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi 173/Omega/alpha/beta/gamma/delta/epsilon1/zeta/eta/theta/iota/kappa/lambda/mu/nu/xi/pi/rho/sigma/tau/upsilon/phi/chi/psi/tie] +>> +endobj +62 0 obj +<< +/Encoding 59 0 R +/Type/Font +/Subtype/Type1 +/Name/F9 +/FontDescriptor 61 0 R +/BaseFont/ELKXYQ+CMMI10 +/FirstChar 33 +/LastChar 196 +/Widths[622.5 466.3 591.4 828.1 517 362.8 654.2 1000 1000 1000 1000 277.8 277.8 500 +500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 777.8 500 777.8 500 530.9 +750 758.5 714.7 827.9 738.2 643.1 786.2 831.3 439.6 554.5 849.3 680.6 970.1 803.5 +762.8 642 790.6 759.3 613.2 584.4 682.8 583.3 944.4 828.5 580.6 682.6 388.9 388.9 +388.9 1000 1000 416.7 528.6 429.2 432.8 520.5 465.6 489.6 477 576.2 344.5 411.8 520.6 +298.4 878 600.2 484.7 503.1 446.4 451.2 468.7 361.1 572.5 484.7 715.9 571.5 490.3 +465 322.5 384 636.5 500 277.8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 615.3 833.3 762.8 694.4 742.4 831.3 779.9 583.3 666.7 612.2 0 0 772.4 +639.7 565.6 517.7 444.4 405.9 437.5 496.5 469.4 353.9 576.2 583.3 602.5 494 437.5 +570 517 571.4 437.2 540.3 595.8 625.7 651.4 277.8] +>> +endobj +63 0 obj +<< +/Type/Encoding +/Differences[0/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi/Omega/arrowup/arrowdown/quotesingle/exclamdown/questiondown/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/visiblespace/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde/dieresis/visiblespace +160/space/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi 173/Omega/arrowup/arrowdown/quotesingle/exclamdown/questiondown/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/visiblespace/dieresis] +>> +endobj +66 0 obj +<< +/Encoding 63 0 R +/Type/Font +/Subtype/Type1 +/Name/F10 +/FontDescriptor 65 0 R +/BaseFont/XJRIYV+CMTT10 +/FirstChar 33 +/LastChar 196 +/Widths[525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 +525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 +525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 +525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 +525 525 525 525 525 525 525 525 525 525 525 525 525 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 525 525 525 525 525 525 525 525 525 525 0 0 525 +525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 +525 525] +>> +endobj +67 0 obj +<< +/Filter[/FlateDecode] +/Length 2514 +>> +stream +xYYo~ϯ$F9!N$oc }h8>uPu8Ⱦ(""Eo>n3Wc!*t/߼/\ljZ8ӇLn˛wf֛ɐPjsp+U, +%B~ c-768.TN!sEv;6> WJ"ܯC,& +6U *'{~J U qOHqF'l7xmJ ĻtTBIPU6篠木<,bFS.(a:Ps!-B/͂&\ ;pP^CQ_U~GM2=l%ߓ )|˗ ـ HڀO$eQYS>(b +ƴϟ1u5?‰SDcB$sd=8%(DYXlȅ-[G]ܚj)7@N/8mXg +x`4 +%A搒ޚC NӹK0a$WZ&QK7r.8Of.-W=f':/ZԏFjjF)=jj*;=:4+I}/% YҤH+ 78AE'&;5Km,BKgq/^@#EZȩrQ;QyB"Ď{h*ĖEl 7hRn#F-7 M/i#c C[&.?G|8xm"娏P~[ꡭ벭܌lupܣ V +1ŻPo'teǭcUhc'&IUE:f,Kj\fe =o1K*ب վCC:sUv!fRgufVGl ;"=tyW|Ʒ5\J>aQ/6x}y @Cu;>xPW &/R2jɪ̡r:k۟5z66* +h $8QQkpDQl-:E' cl]"k*DIʨ$;{|ͳ8ȃ6H-b5nWܭc]6 Ǩ=N5N7Q;t =(#zcrPvkSB𸲏y&%a?d@@=ŤY 1sb_-@H/ 5JRç.8D>BCgЛz.i}]6~ơq- !^SpR.u>^z//) ">J]9 nN~1 uO3*'dV9j)8=7A +cjD2N8*Yf6@.䐚 h˔aAh #2r̳%^e?w@! 2zX( +endstream +endobj +68 0 obj +<< +/F8 58 0 R +/F4 20 0 R +/F9 62 0 R +/F6 32 0 R +/F3 17 0 R +/F7 51 0 R +/F10 66 0 R +>> +endobj +55 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 68 0 R +>> +endobj +71 0 obj +<< +/Filter[/FlateDecode] +/Length 1647 +>> +stream +xڭXM6Wpjp @igVba`pXwF#w\֣hjY'`A3BYs~!r2Ig]:IdxR$r?ޕ+OUTC6 +N coV*o̩afN?8vҲǼYeTQs8^js+̤UUU+a+xQLoii oVS? ipHEpێxԥc܂v K~e*i0,OٰIQ|GIWI )Z)"r?_8b)e2s a%?Sߡ8jf$n(0{,rumKIIY*xlősrB;`ČQ;@)ۣj6fE7Ψ\9'짊B(6(ZAkK^KW)/ۜ-rzYC2ǼW',MEDKt3 4q[ Q3[ڥ',m/l +Bh(*YTp*T0NQ\?p eJt$j܀,Ze9dK; T!Pns:jPΏGv2I!0 #y<]\.z$.G$=צG"INP>7XPz˱sOДPՖ%싊%Ä'/6=QۋȨ15>vDb= ,⶯bӦGSf cU]: ˢ[$u.=A׉uDğ:i!;`*îbZuf~鈈%tD$LI tj:u/'4UwX%IݣS5(e"^zu 4&]*C5Yvdsb q7F-o fiFZ%: E0lJ=lcUD~k$wh ݵ9,;.):D~SW`Q՞le Q|C`LCa.q4ljBlq'n"Ψ;sv*Ҟ4RS"9IQ):˪+KV]ISXNiʻ&꾀jQ:) 05220gi9|2>Nj]t(:YMMص.?<WJym<3n!=+EyYPظ һAc:_}WMῴ[^z36ɣ5 +?g伏7Tjm V:[-x`f +{o[4-\һGA`lx$0oҏS5[8-ّ20ZfM8]&47) OEY^⫡w];io~ӵ4՚4V[e9&IB%צZkY^hP'׎Htam0S&h`i!|3S2*CaIf?g~/X +endstream +endobj +72 0 obj +<< +/F4 20 0 R +/F3 17 0 R +/F10 66 0 R +/F6 32 0 R +>> +endobj +70 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 72 0 R +>> +endobj +75 0 obj +<< +/Length 75 +/Filter/FlateDecode +/Name/Im1 +/Type/XObject +/Subtype/Form +/BBox[0 0 2384 3370] +/FormType 1 +/Matrix[1 0 0 1 -14 -14] +/Resources<< +/ProcSet[/PDF/ImageC] +/ExtGState 76 0 R +/XObject 77 0 R +>> +>> +stream +x+T032472T0AdNr.W!~Bz1W9X\DPNuY(s!+ +endstream +endobj +76 0 obj +<< +/R7 78 0 R +>> +endobj +77 0 obj +<< +/R8 79 0 R +>> +endobj +78 0 obj +<< +/Type/ExtGState +/Name/R7 +/TR/Identity +>> +endobj +79 0 obj +<< +/Subtype/Image +/ColorSpace/DeviceRGB +/Width 632 +/Height 592 +/BitsPerComponent 8 +/Filter/DCTDecode +/Length 34786 +>> +stream +AdobedC +  $, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YC**Y;2;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYPx" + }!1AQa"q2#BR$3br +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz + w!1AQaq"2B #3Rbr +$4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +(̨U$)Adr* ۿʀ&(\=a #Ehݛ|eA\cccyn+'>VS%OߐhF0`1{kY m؇Jr7$҉gU 2}-NIചH[y$T;JѢ((((((((((((((((((((((((((((((((((( ۿԖ9]G65( Arɰ;w#c +b8<[HO[rٛ9Q<- a8WfCyjW1Km*;g2޻nF}3hSXd~m}KCFŚ}?uTiy-l+3p`'=kF`l-gUw%͈g&zg+D5_-ŽF/kq!$`| +3nyj/(۴Z ?ӢgI4߄K16-g9c[d#`ݍր7袊((((((((((((((((((((((((((((((((!cm 1>aP( +}F)#ʇ q$C(8$o$hl1#fڏn#@얖\jBI cI&p*źtU3V.ppU 2ˤIm!HopB74minlI#Y6q;==8 3b#$ײ"ՂuMte-0nr xRV[>0+ ۔` 9P8YeV(wC.a{ d`Þ8y;Kcw5hb s7 ZQȲĒ!8 yQQ/-E%m @NGHEF!@Q>(?,dzyɟ5Y~"K#hϜPQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@F[[FoqМwV֣ ۿe[N!Gy&*1`h}rmm*]>p??LӮ^Imt+zɨyNܰ#G`<7O_ڀ2]z#X ͘Ry1LVܽrıIm7v~Eps\ = E9\%˛@p=mQ@7]ZKn8Ĩ-FFr2?Zi|?EbzWFnC6Ɍ9Q9ucys&ؼM&n.6NUBP?POETɏY|l~cUkl&rM*¥TqgE v<ۼ;TMEA%1]jY>g^F5;Jt`nڝv,1ajeMEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEQ5{ ,/28݂ǿ?Ȫ>%ѵ eP,nT~@USIrIƫo A}?ShE)4aD6hd`#,<`sڢӋOdo.S|’Ny#=8I>\ٵ=6@:f2=ޅt@ij'}zteգ06BIظGF{fXKl&Ta V9HAME&飊6Yl\mx~Yal1ڟoXmGN{e^7ċ+#U{{;ɭӬtnG6zӚskzcjqm7 >j#˶l2p8RǞ9O'LZ@vI$X;OOO?"oU|A}캶[yASilqzfI-2I<1计!# )T}( qy61 +8v  v:qE2o`ϼnW[r c=ii舫Nۨ}Big!qp$EiNpHꦯhYݿ_ 4Uo /5^M{Hf]N7P 2S@4uM.こJ[Yc79##)e"%w +*t4kr @$*O敐Fa v6/<8?^ۡ("1%3ڀ47(`$ G"*^0ssϠ :eu >9d:zdt bGyVf ߧz+;ZM+Hn'‰mϦٻdۅ%F>ҍ>g+OLP>k6HQ~_S,4˝1* H7.`_'lh,tFfbkn6^)2Hzޠl4R8f/ j `u$ө٧Hs?315+Z< *kw%o#\)E;iPkWxwm)Jy>{tI-+Q"M_hQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@W(V8٨vĎ~wF8 mcDa'e?Du-"Iìx<a<V'~mmp:1X0qFϨۢGk x%T OLROGYYe2;D`s2zMEa6T6ri"ghhژ +F>?Y.>-.cݓҀ&S~7Ya,b#-NԠ|dǩO4QEUp2MXQsíZ((((;'o5F8?! +Zyqwmgk\}\(hz*j{ՉP)=zRN$d*@KmB:@q5gtPsqQ.b+{l$dJGSa#$q*G_c@Vvh@CqiS:uҷXSb/KռV⑀8 2յ8"AaQ@Y_ZTFX-% m2Jҙ"!-Ky@>H!XkiE4*Kz\wnm D"1 R?|4H=M '9+I" rlJ8okx#2!r]G9{D"Pc[;0?>kws-j]"G/f<Ӯ7 ̠?U+-'r@qsV[&/mؑ>~3Dvq;4r!ɋb P;.6;c!@:?P[k76+u$L]b~rb9$7zlwZhIʁ8-ls66~_!?Cڝ"{t *1X?5`@JR:Zm̖d3[I0LEr :}* K_Yy`) hPEPEPEPgZoՉMmyZ=bȆG#'T3\,:GBrŹzUu ɯn-e 5v䢖~ǁӊܬY$-uK!R +NK lf~~m7@bTۮ.$d&s7x6=MF}BkRA<>f<8*[l y`#p6CWQ;6V'AD@A$϶(..٧]\ɽW?Yt#Ė Lp̫=[.ΐY)3LkSzNkE vΕm HtKʀ'gS8\kJ:n g|ϏZEmy36!>?iğ?8hyIضȗ}@:z 2wi*נfOtJdOswsmI$npGoZ̨U$)ՃOwm^I 9J|8?kfyȍw=q4-&AϵPW*,Xd*@zurD<,QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQES_v_nT7m:Y֨\Čp>٠lNZO9JA GF=\Iu*~[NFO<}h?/~](N̒naF'Nj䚐{Y`d 3kk;"6W@?WFӧ{K\2=2q,O9cyam-Z;$F|K(o8ӋԞ\䁓iͽ^+ fӅ4OR>jb&}LG0N3Ql+٦&d0֦sިYu]I1ѣ9Z* +leESGFִ7Ws3qf_"[i8E[,g6QЀWSK B;W!}O^<#{\drTy'.v%qdҵlQ QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWQ[;C#Fefe"˳϶MZ&UY!X8 *ҮvTvp")tH$(u__U˫hXՑ$*S_P2$2vmьd g8?L $#w7#b PPtvM%[L'qltzxӠhl8~5.e)U  }8TcX%4m2px#c6̟I@?([IwopY:Z2q9 < uAeAIPn `>5k'Q@?( $[-Z?MI,1 ~l+UMldRqNؖG_i RǷlo+q@:ڦ$lJ0S.bl%ұm%34V8$UmhȬoW26d*%fs ďβ?^,3XB$ _޷O,;i>&NkrٕczP7~7~}G麘Gm:Zvm??@웡0R20#=\U*` J}>aZQEQEQE>)g,9'a +*x+B2jQEQEQEgY)ČFl8?Ҡ +C^B2ם H<!Q⦱ǝo O!(?댟*u6;m%qSiX<C@?zҬH9ALo9h\ϟ=< lj S 6J#tuV-m3I ;0G ^ր24VfVod8HǚD6IܩAgcMgiUSIs r3${rKo+IZf1sqZEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPUn5%4bpT|=?52ם "ZUOѿDf$`*Ƕdq h-j?;L p]s.*gSJT +Р) "((FmfP(vFCj=>20qY((( +6qjaDfBcj;dU~)mZ -u?ZcY9;=~ [ Ih8 d?Oҫ>bXJ?_'Y A\diY"[Qea<# +}ڐ62`cOgܱc9P:# +-wu%^}Pյ BN?Wfy$ndgTRH`3zѪQOnk,#=I$A=hs;9яM*OPBE;MkQ#3Gp'A hEQEQEQEQEQQ4pDFI5%QEQEQEQEQEQEQEQEQETnKH&a}p{Jk_svMj1#w0$T秵X%OH3G@|k|45T_TԒvN_"wp͐pzDj{-h eaϙ!L?1'd}*/ +iivw,)YAv|kֿOUGjb5_ܜwg<84.|ԟ?5GAúrǤm](hv`~Nm?!ڀ2^d8 r<`gIe B+mnGLC#NjXUoȥPQj 4 ط1e~S?*/un_@h\DrQօΦs<MM`\ g~ hAN- x +IPxךQmt+rTw&A}*ku//%hh>:g-ׇc!oD@sIs-B!i?ri$HՏȥ(};60PtU-8 ,uMYl-zD0d`skQmqhӿi\S +õ-soX$hтz *{]j][wo($?8@.Ə +gs 'wR?f!u32䉢tݏ/muQ4^4%}V#=rU}d=GF(=jSo2ڢr\4wq^Imf$xT'WHYp#swFF +L >aCyX@&^BK[i(Hϡcz1۩66ǶB8O`ݺnk)Kfؑ+T[v,/LylCX䷍젲F}o{+3LKK`nXO?:*9þqoIl]A$V4{v%8jӮ{ˮ}-w ex~^7./ 6P]kVVp,8قmezZ5ⴻO[8ɽɵ*=~`ϵZ:ը|E(mK3.}EU+s=;F^&NGx;U|K >ax??LWE@Q@ZvbA1Yn*~3Gwq_ϟ +ŶXHd;x%>fm-CEE7trimwgi 3ֶ+'S)}-f$Pe :3-E[OK He]!rz<^Hg +ɴY"N}Hs(dA9UfQ tl9bU\Byl jVKn#ܬF=ْ(/cf5)%(卐YGu1-4nzO@qK$8xeYNAbnb0 t#[h](((*İb;9@afxTADoG@MhfjTm}Jgnq$gvFug8C6>_3;sǶMjH0GW88#֕|?KOS[Y[E[qL|ÆӸ<P s5x{P& WB9~V,Ќ&nfr$e?4t^j$spJZM=Eh ߶j_ +Ʌ횗akJf@Z>٩+& +q\f*9 "?QN7SdZ*XQUuCequg4Vx.Uvr4]j7~{&ՖFV\{ZN`u\3o#=3՟\Lu? ʪ/ѹd;|a!Ǘ1'{s*t\Ac@tψv7/g+وV- vZZ/텔 s23FCAYč(ݨU Ys&p{qto [i >VɃQy'#/.|7&snOݱ2G=95Ka +o9JB~$kIԫ&SQ"G~8'%wqEnEK$1^o#261p:y<ғIקJHME0G!GE. ӔGA5Y%,G+t<לtM@.@[ϦAQ5HuKQ9Nqk3\ǂou Khe [fp9ݑX=Fv>F S!p:3Y% lg7߻NLr\ zs@Џ]R?(ʦUkFѦޯw-$.NӃZ%z!TrH~^L~#AUwqi ,d3ssWQKhE 8,s}7^$yv7j^HC'0VOQn,k9ù12 d L_Q?ٷιSکy(0{ƒSvKKy2s^[k6.|"ED! 0<_/ipdnLg z΍PI "Kx}FsQ7YZX|&Ȇb[#j?ZQr<jUZE&H34&hH4lź@ 63u(Iֵ-SĒًIqKY!#X3gzv-iʸ!3 ^k +╂Z81#""2ʁv'$A`o Poi&hm,a8}1ך#C$Pw {MWb;?ڰ:]_&`&3/Y]j^Ϙ* nKq Ls.\s@_TMَ8eSD:ƞg؊Ӭ+ȮuSy"vdܛUGC}hS:֡qlqqw%-'w7< W+( XP WޤV +7.N#1Uyt6} 7D=yڪ/fjj>ϨHhQ@e}HD=|W*H?F5Z( 5Rq7r?QVSh#ajk($Zn|ۯ_j׬]Xg:$#򛯷_Ҁ"ׁ:3'|6^ѓ;g, +*V rg.Y3o?P65fj? /Ik)HȊjTXaDmʨSPEPEPEPTufH=߾Hf_E#ׯ:WHIT!],@{o m&&${օ߱YfuIXIx9žus SZ >n; +hH9KY/`Zdd`s$T"-nb;ZYw=QpFŷ8ftk}GM9 r8z:V/o-ڬLؐ~iW>you2?ҨxzJclS0XwPI62 1 3&Ov +*^* }99(]? T^}ZES7-;FF/|~ Ԯ h<JҪڅe-ܢ(cf?z>=M6~F݋@'mq"{oKԯt۴K0?A9@l;yo( 6(lpq$轿&OwX)Px)@. o8+@΍Muw]DS?؂lnr5ܲCVmܙeE$|k/\&ռYX>ld#o_iYǚHR3&G#PY&k,H*Hn9 אO|W!j~$"o" ̛NGO⺛Օ$TCUTD%H @P_+[+A3zӸgxIn\mW~ jS[\[gr#GnKKtm͚hsʰLLOLmNj>ȹݸHr82x=^k%Ԛ Mn%TrޙPA霌dkc1ms#tbЯJE99 ex$,0v]^ɍڲm-mecڹCu3cj6ɗ%.+rPq I8fQ`ȬF;ߎ5[P.Q-De1pXFn3<8"&Zɧ-t+GƊV([,>|jثi܆Xee-יm8rG9 17[K +2L6sWS4iҦ)9d֘Vٔb[zsǸ-HtwF]y*n} y<|3J9ʪ|R7 ®kdpPlP}=6~*ȵm_=j$MYD[qk.ܮ{{Sw el1Ѓۧzyui/ua=0a8N?̗AⵚI@c`00I ~ȥvU>}.,ؘ䕭<0$}ׯ?ùD +2j B(GpqXv8=64>$j2ĬHl:8_] 7scLWO І YI-V#g8ӥ_ʖ1r +S}pxXH-qm-Y#,d &1v;TfĘǞݛt}.9pIkc1@8Wo!tfSNW?ABDOwavH3>2OJܠ(( ٵQ1"Eúի9uUnr^קOzVw-6Wy$)PN %G\."CK +3s N}-B1q8$gTS^ Jq$\"C$o1RJ@ݐI<dKmIy4C6` ߭iHH==X̦!"L(K9guJUꩧ#%bΔ821g[( +9MF!dt պ~]ER']܁ͅ\9?3LyʿUmsI,*f`}"h59s +߮_R@|y(suKL1~_Z|Gb]T$lĕ8<j"լ5.o4q?i]LgLvMZȵל 'hUT8RR {ԴQEQEQEVN%ˬvvgOi'|Wr,gh^uj5ϨG,E6͜Jh {k YLpzk&W9h> H =QEQEQEQEQE?_@5.?ȵל|}9Sp(Oet+,Ԧ[m9~`3q8Od;°F6E. $!1r9AҀ:94lMѴ#Q2fmgK)TDU0$*Lj@HQ4do_cАr8 W79r6!eW91l98xI"v]Os`V,t{Ti~-]^Py?x KQT w9U?"ͨ%KwprzMh#H N#;܇W98c5v;Xh$ YnRC$wqXWzFyMbH)"hPI3e>ZAs_"&[wBH' +{V0G#GI8;r[zyc_%)buHf-Ɗ$eQ=cr4JY-G^_@Kk+:Ѓ giHkXc8$d '9$㟭_HdsgUa< wTSpxh(֨~g*Uʧ͝m}VV5!T|~Y7?!#) +fu-J{&Չ̳p?M+j0ๆ dGGl,_s ;8)ؤo[{ˌ#0XONLмI9;=q^N`f3`,drI ZyӬȵל :( +( +( +( +()ky?Wk;x{R,6NջGKH$s4j΃8V#ϽMEPEPEPEPEPgZow@5BHXum^i6SGB RjOE#W0@ rvP u>E-M{)Zeքm2kї8Y ZO*$HMH!|9 d8ѵ%hZ_.Xn}zOƑ}%W28ry 4465+Y0QP񎂽T &#Rq@Kޮ#YRneld)ij|ieg>B.n`rۃ8#pK@$\O»ʣwmo-l@Y ?&9O3ҕm~^Q_goB-uu5[,*ɷQ*晫X_jc&mEfGJSg- Fc(P x]N&4qRSiͨsnz}뫖g-R7 &Kz + <^cS`8{PH>3 {Oj?U+G䅦*即4csv9s>}-b^Gi.Z?9(F#83@H|O걉q +_! |2~iDRhڔK3W? h--@ۀ>ZR R8Vo#h%8ր`?ZE?\X~#)(((*{vF-Y$ =u T v`0y9"-5#@H<)r @ր$FEFaTWLOI1X$pPjQES6*'x~xKR`E$p|}ӿ^WhMEC+Gcca?6G@ @w-[u.|A8cdߝmPwmIq2 T?QXbT\jH[8yMY9=s;U;{_k:t< !8'gz +ܡn 3n<7."7ՍJWfy"G+0xSR]\"Zd:{ n$Q@Q@Q@Q@Q@_i6qD[a 7Hd@=\*@@}~e[߆[e[߆9#J*[kfo*_ w)%7FӮ +0~}MR&o{R8KGp1ںW[ p6N\ E:M8&2D\?05(ehrr4QwJ* J:egI\ϭZ-I%ʒy+NF}@U3ws͡Is`c޶Un^pH04{M!ΝpPȻxҳqZ]Emi 5{ZflNG&ܷWYL!xɰ1l=R5etBmrCrB$~F;zʶZ`n]bM]dX{v1IxkW]Mkj"<.ROڵ-b9],Lh *ρW5*ھok]_<* e?vwZ_}`O"v$yܘb0<9!8n8'BhfW+$Qh r["x vpsSѵ{$`'r.`>K7Gt9R]  8GkV+oV1Y7jghu 7F3f4+5="V.~\8n(/ַ^Zr'`S1c<3m{f2C*eLg:rMخ;banaK+i +cۏ=ǡ3xREUbg vz^V~+m#0U'=hO6 9AImjLI 2Q0/ fۂXT߅bn=i|2_kp>^\ k6bgBRU KOM?]5-?TxR{Em#qj+o61q11|aWYx=1XN_hdLψPK}?ȳe##+8$@mq+)]'0Asrvrt&_ 7IU[nF=/kcg$D&}G3Nц!{ko PMĂG5[E,q&3W +OngR֠,!Y#iՉvX˞08ֲG{y[--ݦqn"4u桢Cmk3 #YT~ ] _Z/޺x2ZQqg̋q< g?SW-Kh;%@랸#"/mX0$Rf0TPcfAN[g`q 3t&+587p0dOAOgUiU,HqҀ 7k9uqV;SR t@$=O-CrӬ$Y$( +Bͨ,6ǘLNG=*WMi~USK$v){{U()YuxJ3$*oVxXgPX:C#vmuhNײw!!HiS + +mn\֟g;hmi# +HtuEtPZ pw1 m + ^^dI%qmq p@JӪ*i۱PXC ɑ*Y~#Ú8s `^ dd#~=~$Hx݂cv#؊(((((((((((Zq?Uȁq^k^Eמ-2M$D*/_-M- +4K;tj@iT6VJm\Yf)|8;vO 3ɚ96n_zx`s\$W^[BFa8 9YE.QԜ+/nCibɹChTJ@qڀ4'k+ir*^\vWtagn zb?lmdMp-blc8OQYV;>[YV8'0h]],oJ!*nyyK.U7ptKMX:RUPpyq+~rzv4P߰] 1(`;n<ҵVBU'b:V( WG{5m3ıV9qwҍKvO1P*($I>ETԈ[е(IRXjhHVeYdGNg*Ʋ=,Ą76hP5{ᛛȑSoerT&~'5X&h\F9s؜~$(%t!exII _U#|%r}"mQ^/-#r}䑿xWWEPѬf4䳖,Dnɵv 3n*;'0_d_0s.3Udd|:(Rs^r`wzօu&XKVLdF`[i{(}oH-( T.ba9$zV#:oH9 +9J֢9nزGxrM"n㰪^keVUO0_*@kP67Enp %q~=SS"xN0699_`߁Z]8{yF7$p`Kvݤ̱wciE~;Wqo +ƀ-]]Ch1jRŏz[k!bT2 ?ZL3 rݿLia(%zMEy~zXS{# |X@Uhmtޭ(w1cm(bXY~7n|v ӂ9PSаۥOXtO=ݚY07dO\`zQEQEUF4^ꗿU[NmqO*$Xyc>j*d+wPw8@7U-qU(/źB]#?w۬)[Gh,2'ހcߓN&`\#ZՍlG>gq?Ҷh!(?댟*W`Po-b|l^ ,r'{Ø]d\_5M+)o5VNgbh B-tA[u{vXѳv}s]BFIÀn!ftgɹ2KDgוr>WAM.^i3YO3wln?Q1hD$JA4AtgN"JCGE#PU@Q@Q@Q@Q@",?|uYxE_>:Ӡ(((((()B.D6Ӄ=&j])S)%vNX^[y"P>BAdqִ' ku"bxP uu%xd)**_Pj$Mǡ_ [\e@mcH$>hf=.._*Ìzu}‚m.0H={#̓z]\UٰK Izѐ8T7'7(o]P6s]TU[j3'5M5#[KO4`>{Ǥ&/T?/y&5;h5cFw8U{ +{~ ]s м7jIGn:~[i +Mz ?+N'bwl-\:ȈKbK0 "hNmZ +[dvʂ>8Uڣ%!I| H( +癩/X:4*14m;QU{I;OXQE+Gtыsj!\(.XCrFsa y[F)`r ogޢ(o~I\߉5? /,c2lNW?$g|>E?F' +( +( +( +( +( +( +aMbb\zD8d}@ v6zjtQE*xؐ ]:B2:1Ó?[?(r((ucOG˜+J|A [(J((((((((((( yj^V7yc93fxGR.@,~$?SK ( +( +( +( +( +( +(35-|uY3ykߥiEPEPEP vi-Fh\Jè!IvHa!qIvm$ulOzښ("eaAX'T2"2X,ZcjH0 b`d`#P:5ڇӲvv|M.KE{h +wsu;[ƿ;x Sv ݹ-ayŤ}˨R9fx. ecS||ր13J BcHOQgo,s#Œ }|(P"I.^Gh%ǭgk3qx^lr;HH;X"$ 8}I$޹O6yadnY;t;w,8 [C|K^kn5?.isb yΰFVfye=H b)pV_"cq@QU>3gȓOJlH^]O;"F 0,J [j}>U\Ɗw&:A= }E-QEQEQEQEQEQEQEQEQEQEs=nɌE ?`3ɀ$~Go%ETv]w 1RRE9(r((((((( j75][1 +2p&BOOZ^J(UfWz_X((((((Mn#%?&2jެ`I:;'?g=^" 2̈,[81Nۮi8AǘI+8"(P\.Nˀ%Q0[?zEP\2H74$ckp@.mOp9ÑՔ4xbkfJ@4Jܠ(((((((((((((kzыV|`3Ɂ3AdK?Z ( +( +( +( +( +( +(35$[tt?JӬ?cmrz~?+R +( +( +( +( +( +( +avDnV#%(`k?4xs\[QEQEQEQEQEQETp46 *ѹPv# S@Z !I;dvv7w5=V7n:#i[cA?rB ΀-W8i t㙏V"Ymr3H#UdFkIq;><;`?bVsos0Nj˩,JߊWw`I@EQEQEQEQEQEQEQEQEQEQEQEQE|A/P1jϋ^A|A/P1jϋ^A7(((((((ד}ުW׭Jm4VO-V'Nq +EPEPEPEPEPEPXx@* 4Ĝgj۬e?i*dGhtFVMo,41} QEQEQEQEQEQEQEQEQLā":(T6VAͼLo-m> E}rػs tTm4h"+R((((((((((((("^lb՟Ƚ/vG%E㠧wк*758|aG?AEPEPEPEPEPEPEPMBT8Lb>RXtV#6֞fsrxPOsZQEQEQEQEQEQEV>C)ftp?Э㍼OE29^Ԑ?F*='Ͽ_ֶk#P n1>m?VQEQEQEQEQEQEQEQE4j>sm/Ï ]:9ʂ2u%|yBP:|9=ץ_+xT,q Ec=4x,26đ8T9 .!S#O/{0smr3\Tn,d}N繏€0s8@7"]J+,6>{0IQ'KMc(q籢]fH\A`z=s؏b((((((((((((o 9#.GQū0?OK9I SS,o9)|_"EPEPEPEPEPEPEPv[2AQ<޴jg1 p 냏z +( +( +( +( +( +( +6U\OmVv}"?PڂHSNFFqǧZ׬C8tEkEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^A,CK3& {@QEQEQEQEQEQEQEApgWŸ3w;ާk#7*>CrW((((((=K?xM(r,[79 u:99D`GZ~q#+?oEkPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^Asmڍ#y r` Kq};Qт6袊((((((C3X8?jC` +՘#~~`Ѡ((((((#n9:ܬ=GF(]AE;@DֽeޮK;ړ(J(((((((((((((((((((((((y{XG3c;Gs/˜VQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEax=t (};60S|YYyx/o=3bӿ#mnQEQEQEQEQEQEQEJwpv*O隻Uw{`YGw;c1 |~jQEQEQEQEQEQE v22!a#* KvF6b?kUIv~zt==ֵh(((((((((((((((((((((((cbo°9.bEf#ٞ<&(((((((((((((((((((((((("2Hс 2=ru4>ţ]DmЬrIxH#cqѳ׭uP=m{dVG@9t^:x+nNJY$4I7=QyJ+EfRWL- so +Ӣ2V2< +GWыr8?浨 Հm:tPhkP Xe_/}8SnQ@lԹWLRRWL-iQ@lԿ G5/֕jWѝ[m7 ᎵzMOVFH1nbE\{:D{#1Hͅ] ?]_ˏ +WWrr\?u.?**( &uR×8<\O庙y&_F6ysҺ +(RkPH/k9Ho<;y_nޤ_?.( ?H%~> h:roN5r":ott`ziEfi:Q{J3U'֝PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP;ϳOyyq϶ߥ\S?oo-iEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPf7~7;S8{~ZѠ((((((|JI +ITfi8co9>եYW\OoKkpXȒC2; lryPK?5jY@;ecwReJe;>Z, O32OQ_x8bP:T/_^1 +4EH}fϘ7A1ygy,$hxj;)DDq/wz_d{Ԓ[$9~D"luVz YmZGH8T ۷oZk5ܤ', + *-Lf!]j[o,JqSSIܬdzd +kct\O+**}̠R'<Ԭ+> +stream +xڕUK4+tڒbْ6$;0N (km9+ۄt̄Y\~[Y,_#GnCD)R)YD^0"Of;B*6u_A-[^<?6?F +Ea★JI7fBe|0POPrn3{26ݩ5q?$]U\)T^$2\hr7d7ԽnTtFLd B$7),O@}P(;r86@3_Eh8;5Y`eGC + uMi}nvvmMfP]^<-JrgL3;ągRe *DAñ9;U^ðc(:7pS jkh,ރm$IIR(}©q MyuCTj4 ڂex |'X~4vgT|P&dZt"b:`Yr5l s{cU SGwZ=2MBkmS{d: Q,0+=_?ρ0_7n:y Kn NNbHt1DK&)Myhi: +b. +BM{_~zDnZ]ߑHQh^~XaLs?Q;͡|dI'ƯEͫ;=tzSǀBJ!P/GJ7?o +endstream +endobj +81 0 obj +<< +/F5 29 0 R +/F4 20 0 R +/F9 62 0 R +/F6 32 0 R +>> +endobj +82 0 obj +<< +/Im1 75 0 R +>> +endobj +74 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 81 0 R +/XObject 82 0 R +>> +endobj +85 0 obj +<< +/Length 75 +/Filter/FlateDecode +/Name/Im2 +/Type/XObject +/Subtype/Form +/BBox[0 0 2384 3370] +/FormType 1 +/Matrix[1 0 0 1 -14 -14] +/Resources<< +/ProcSet[/PDF/ImageC] +/ExtGState 86 0 R +/XObject 87 0 R +>> +>> +stream +x+T032472T0AdNr.W!~Bz1W)XLXP(:,\m( +endstream +endobj +86 0 obj +<< +/R7 88 0 R +>> +endobj +87 0 obj +<< +/R8 89 0 R +>> +endobj +88 0 obj +<< +/Type/ExtGState +/Name/R7 +/TR/Identity +>> +endobj +89 0 obj +<< +/Subtype/Image +/ColorSpace/DeviceRGB +/Width 393 +/Height 500 +/BitsPerComponent 8 +/Filter/DCTDecode +/Length 20458 +>> +stream +AdobedC +  $, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YC**Y;2;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" + }!1AQa"q2#BR$3br +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz + w!1AQaq"2B #3Rbr +$4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( uՍ6լ죅srrjͷYX>uGQZO+,-6ր$[Οfqs[ZƧw7!{v}6h4FB6y3 Jv6ԥFkTJb7fS_ֹ!1ϗ}m +Ko ?lxV]_NYHq<}_”tus_3V(0 +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +qqzfhmmW J_M_ ѦQEQG?mR~5U%Uϩ#³ Σ0~OabrAOf]> \êYz$=+7kpPZw]$<llzO꺕Km8Ei >+sv\ݾg֫ŭ5v._K1q)c_R PZq_?:4gNV8oXV:~c떰zG +np1ܮ}+څ~SO_빅xcWKApF8UbVӴb#$_#ާ94Lgof#̾bA1؀J g/}e I=:7F8I?u6[= BX]p?¹+mgSvE>d߳̿H?g}N^l^N4DB_ k nSEm_Y3ϕ Y_H쬥tVR,1ZFOMdRcNs?,\jZ?Vf +AJZd&XF#>ZZq;|Jv8e-WY&`D.Fq+FY&yfi~7 * +( +( +( +( +(lBHd. aIvl*ѯr/ qzԥ0#x ̛qjƟrC*\r0J|]1RF}8iz%Ԝm/G_P+%k}AcRxShK31D$A JšiA奔zAdcHu#EEGR^/Kv4; Ik +8RU q$Wqjva֮!<)ܐ޿6O^L4 +Hz M¢;cEEDK+SP6:cc/܋_~*]4''fc#ԮLqp H|G]5{r%[qrg͝V|GrxP_mpBSxI-u.umUQBP0Eg8QEQEQEQEQEQEӵ8CE'c)ucYZkx,N$쭮tHެE^1c@Ԭ=pdoYWeSy.AeuF5 iTr2fA!.mL4sǸWXG9UEE&?FG?ZK\sJhf8U1fxkCFtl?RlI_q74d/\2Ύxu)l2lQޮ{pDtb]^ëi^@c<8jIDN +E(QET?sojz<m'O/*l?*ҥ𠢊* +׿'չXZSdjObH)iJZd-#o+zXNA[ԑs{z Xz7XZ)/(}/Gu7)i 2 ? 봿0`8oսIl]Gy;/_'jM@?*?x{R'}dMIEGre(QEQEQEQEQEQEQE纤Q*E`* di STGYn/77¨ͮM-䶺U޴'l z +j:yոY$rSNϖih&VESr8iw@eOCTt` ANȎiw$g~(g~*Y4<3{$6Vȡp>q +*'jOȩO j?ȫkFnC*`(/yO\Oa= p_ZUUJ;!CAEUCGc_d53؉k-Qf3x+fFſ1[5D:YW+^4 k??S%E:Y3[uC5SOEk@'i_"M?KUpORAE((*wsIpVfq֟w8fco]"ix[ƀ.jYw HOή\\m g +\)g;T4n0EU-KhVتv4"8S,eA> +Ɩj D;:Vq@ EPEPEPS쵉',p.=@\n%::` +z:k;r?$R-ㄩA'VnX&PHX„6fM65c- btqppSn):ѭU`5R OaԤ躀p߭_`^V4%XG'5ȼKktʥ}ÎgΫƏ훏jkQgϖ]?Śxn6b p0-].` >_/E_ޓC56|۝ 7??n? +51Ugs#fڇGƵF(dlPWj^fS_(%Wn⠽)#Im+nahq{(X@n:jƦl?*(eʵ2?n? +4lPWk_bϹ\dlPWkֵ[ۭUF.<Ǐ^ϼ4Ty;#?\uS2JsVLu4m6,j~x=jƵ*(UQj--drSD2p)awcx;Z7?F?o V*bٸ6|n/")5 k??PӺ%u7??n? +51WgܾYw9mS 1Qtɇ!܁q:֗Ɠ_/kc0OjD"V;j˥Map]xu,8?ҖPn +v4YYw*lPWhٸ6|իk\ۛyp`؊ܦ;L^sZ,,n? +4lPWk_b>.EENk+?[}S@5BcދoQMe~Eվuid:_Aڷ3)fJgKcHu}d$ +I\\Vc}W>EY ͷ +wsܒvW[Y}td=1T"A%R( zSXV-?wmrq=:{bQ5me+z`u$Ecyӿf<4G7?"D֣/IO6",.1?xtȨ尶ɢ༌>Ύl֊5 +<xi«fkNyӿA͚<mfӿEtfcg>q'-65"2*mӎ=Ci{b +%{ڪ0UYm-B8}wlI3@^5R~V?3RxEKkQxEk_G:?::)3FjqhyO\)#I'S J|? ʴGd(|((((yQ7]?>(+#Jֳ]ckF!g +nlRRUdx_@]elV?_ L>E?u_׼  + f KA4/AV?K袊Š(((((((??[}S@5w^[HXYWNkQMgnGwz=mUe` Y[,Q)f>²45[oӦi&>O 9BML!܈DAvO]ڋ|3-hŵK2 ,N9ȹo;y:޳4S;^ߵHΣbcf +?3}lQG"3xLw>y*Gۃjmt.R_M1_/G_mޓC5E?u_׼  + f KA4/AV?K袊Š(((((((??[}S@5NO)q!v> 5)T vnmIǝ&} :k[ܿdcX詫jZ7Nۖ>\*G:٬Z*KRUPx1VAncFy牸ep0x=sSڜ:]M)˜zFSr7*mUˣ. +=i,t'!'9 ipiq>oW̕6Gܥk#Wyv2Wt4V?#:GW??"Ҽ~? >C_/G_m e&lczuig#3?ZohFtȯ43ϧEyve5JпVVFtȯ5hZmڊoEtѧap8Rܮ2uUyO\gHOG#:GW| JHaPơUG`*J\UAESQEQEQEkY#Jֳ]cLDKut6))i*2/3gm3PSYqiId@ E5]C#SЃiQEQEojSOO eQMeu䌝rA7]A쏕r{co&Т2i$契O~V-5`^(PIa$}L{TƏlEK qݎG4Ԟd۲}V)gӦmTCwͼQLmgʵGE^0]7~++܌Ջ{=nֳoq"2=x#GiB +?t[Kw#=~5R~V?3U|_if8`w`UpIG_Oմs^|8|ƦG<}Ct[GA o*s=Ҳ4/տt[Y>6elpT+H̵:Z+7wJn_w/=*+7wJn_e9Ңt[GA o(]Þ=*+7wJn_e9Ңt[GA o(]Þ=*+7wJn_e9Ѭ+CZu@7A o+3MմmVGRY`I]jD-%gn_+Us.ǹ_ s^մ}-c̐g"t[S .UU& KA4/AV?YˤG;d~i֨ (\ۇ4ymQYۺW-wJ\˹|iQYۺW-wJs.+ZL 8}a6-)v[wsջn%[}N&v0uU[Ě=Ŷ. wsh]Þ=צ[M.("ݖ+r@'͢Xcª@>p}sXaEaif.&?㿦zQ̻<{5hmt4.#!84:7 I<o}ާeqEu}m4r9NbRGsgj *=]Þ=UE +*S./irDoB;Y#ӿt[G2iQYۺW-wJs.QTQotO*lz)T w#魢iZj^*^ہd8Y@2NGSZLupV8!ucF,):}0Q3n2R`Nm%!j2ӿByS~dzmDd3RK]%7l5Q7wN}Ljq2\ NOݗm>ϼ?ț# kX"VpBE{hsP5kƿ*_CZ*'jm6^cxGTUYEϼ?U gm [dh_+RҺ"Is#Gv(| +">m>ϼ?,>m>ϼ?,>m>ϼ?,>m>ϼ?,>m>ϼ?,>m>4hXա<Vdi_WDI+롣;ocxV)*05m + l|9(| +ة\ir/X]9 42ݴB` +J~ KA4/AV?E0Ys>m>ϼ?課.ȃv(| +,ȃv(| +,ȃv(| +,ȃv(| +,ȃv(| +,ȃv(| +,(c<PmOi5urY wCJu?]$мR(du*Dz5"inC3G|aV5 ( gU*}Ǹ;]B}mq%?,WF]JcrROO51y'Sp77gw:_Yj -ݙ[][-ZIm$ AՎ6 kmw9[^5[\[ęB䤛~=heWޕ$φG$φZR]?ŚwY!`3ەQv-6_ܰǽkEKkQE[_C4:-/a_е _3Q _3V.=5<:{eb<Qo Ki͎>WuyiAs& sm-oD-$ l$.ZQ:w0'"tԴQ]PQEQEQEQEQEkY#Jֳ]cLDKut6))i*2{}4h5ooi>ݬ? YMަj&5$-tc`qӟK!s/gWEcY<?k?Us͊+}Y<?Žu fgX +>ݬ? G:{E3bv@x,nH=EcY<?k?Qοyآݬ? G۵c(_hk>!g +j:z]gR1QH?EV3 +nX;=)JIX¥dVk?QgX +םH/?uC5\wǦRhp#?k?TK ULM?KUpOV>y>vQ8h9X^j,zLn% +j#s:Άv@x,n_//?V?۵c(v@x,Aܨmd[;۸\GUoo,ɍ<)UՈ 1"( +.TStH9ןɴu Y\bIfL1biCe.$h%}b8a>;Ek1j^2Oj9y̱z)Gmmi/n@xchX!*r2U-6b^̘F3Nv.s3HFz9yUU@ +aYJZxV̷ĖVUK ۞-iI,$7J ˥AμttV?۵c(v@x,A͊()T w\G Nk,K1MDzz1hK<? iֳZeٸĎdW4uN,DnY!fth^cH0*= oӛWom" +AeyrgKy_|9q֝n4q5g@L}LdqUknu8 aJͮBr>E8[=U~a5՟Ö8V>c5_/G_mޓC56tr/a߿g-?f?!ikfTs.ms Ƴt5fQomЋń]QY|j +8p\Okc4}\*Q|c}\-?lG*E1ͮBms ƶh"f?!ih6A O?[4QʃwLokc4}\(AȻ&7ٵZ1>ͮBr]-?f?!ikf9Pr.ms Əkc5E9ģض 31`OOƯQE4RVVEk@'i_"M?KUpOT~ȷEUQEQEQEQEQEQEQEy%:iRYj"cɮPmOg[5wlE9$qQMo~ɵ_횜46h_zI9fHcl^9W\"+ļҠe5K0cu+>}c5D=O`=;+\9)rnDIDF~U!,899?Y/Uv}91ϾkS[T}uF-GZ#AmS?ԯ.|C_/G_m  Iɴ/$Stqi?u6|Ƕ)]ltsKm;J+#[TGڧ]~iv5JпVV#AmS?՛i&iG2e&'MKnB2h#AmS?a j֪.ƽ-GZ#AmS?^]]z+#[TGڧ4VGj?OQyviv5謏#AmS?a j֢kYGڧ??#E9ע?OQ-GZ˰sKEda j֣[T`c^??#Gj/..ŭk@'i_"I6MOSd`C)Aҵ`8S;#P=p(Wؕܮ%QVhQEQEQEQEQEQEQEy%:y޳qhgqIl0QΪДl^hprVOevzXS[PP\0( f0G%Z'aŸgjEbUF(D?S#ϳ6_JOh +.ϳ#D֣/IiWI.VM#wQEg(dh_+Zdh_+RDKFQTXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQExcLno +JJ6<j)rEViY3EsG /騥ʻTfs?hhEs]5r39A_?4 9鮚9W`? / l㵵B&p ժ)ʤ&QE2=+ ` o[as>ui=ˏ(EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPYf8d4ߧ +f ($nl-Uz \8иMt?²_m5Q=KH===.;#vm3bSTYDGkl R՟A~+CK4][BSP{kTg =i ԴrB0M\:v3ZE! #-30(((((((((((((((((((((7Z᷄$Ӣ?V.nRyH"v(=㪰jj)q,r^$E| V, 9pľNjkZ_ǨNm&&h + #Ҵ/-٢cUUaЊo?et.Ue<yƝu%l7 !S5fD!;}vO?gsAVVv2YVc5f +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +( +(? +endstream +endobj +90 0 obj +<< +/Filter[/FlateDecode] +/Length 1396 +>> +stream +xX[6~SQNbɒ/A + ҇nqױlxKCfF3r,;um5K?7ξcg +yYkKK9ܷ.EɪnYIc"ˊ!ͯqJ,͓VF#ҞuX<ԍUTO߆bk١ _JOU^8T|"pe! l]Jf.YQne~G/uAݏ`dT\)D:L bP * OstH^(6 RQfmr +&5h6ڋ3b/M;{ws> 'raI0O "Ľ츻-U5t{O@C:q +#L̄mzц0--KܖcA^zgm7C%mN>vSMbS#\ :thͥhR*ʲ$7V|ih$h~"+<:BnZMA8Wz^Q1SjHOjk !wu7YxڇQVS7pe?: +endstream +endobj +91 0 obj +<< +/F4 20 0 R +/F3 17 0 R +/F9 62 0 R +/F6 32 0 R +/F7 51 0 R +/F10 66 0 R +>> +endobj +92 0 obj +<< +/Im2 85 0 R +>> +endobj +84 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 91 0 R +/XObject 92 0 R +>> +endobj +95 0 obj +<< +/Type/Encoding +/Differences[0/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi/Omega/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/suppress/exclam/quotedblright/numbersign/sterling/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/exclamdown/equal/questiondown/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/quotedblleft/bracketright/circumflex/dotaccent/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash/emdash/hungarumlaut/tilde/dieresis/suppress +160/space/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi 173/Omega/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/suppress/dieresis] +>> +endobj +98 0 obj +<< +/Encoding 95 0 R +/Type/Font +/Subtype/Type1 +/Name/F11 +/FontDescriptor 97 0 R +/BaseFont/ALEQFB+CMTI10 +/FirstChar 33 +/LastChar 196 +/Widths[306.7 514.4 817.8 769.1 817.8 766.7 306.7 408.9 408.9 511.1 766.7 306.7 357.8 +306.7 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 306.7 306.7 +306.7 766.7 511.1 511.1 766.7 743.3 703.9 715.6 755 678.3 652.8 773.6 743.3 385.6 +525 768.9 627.2 896.7 743.3 766.7 678.3 766.7 729.4 562.2 715.6 743.3 743.3 998.9 +743.3 743.3 613.3 306.7 514.4 306.7 511.1 306.7 306.7 511.1 460 460 511.1 460 306.7 +460 511.1 306.7 306.7 460 255.6 817.8 562.2 511.1 511.1 460 421.7 408.9 332.2 536.7 +460 664.4 463.9 485.6 408.9 511.1 1022.2 511.1 511.1 511.1 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 627.2 817.8 766.7 692.2 664.4 743.3 715.6 +766.7 715.6 766.7 0 0 715.6 613.3 562.2 587.8 881.7 894.4 306.7 332.2 511.1 511.1 +511.1 511.1 511.1 831.3 460 536.7 715.6 715.6 511.1 882.8 985 766.7 255.6 511.1] +>> +endobj +99 0 obj +<< +/Filter[/FlateDecode] +/Length 3365 +>> +stream +xZKWk~wu0M69$AHTGYz.5U\U]W0>?j5}7߼T%zsr +iuM߾_JWZ)߽<Տo+;S|7öuXww޵fǿzw<k߽=o^M鵯ɇcwյ/-PLnÕpAﺷw>,RUr"[Ks_oKصjӻK_io*^aqvi}tS.6BĭH.GFݝm{NN=l ?@w޵,3[[ޫ5JWZ,+ͅjSu7Wl`^CAPy$f!2 tlG>tim)UImvZ?bj\^diXP%-o4#{[ie@S|YAritASF\C +=Bv*vN0mJ5S!s7[]I6  $lwo(ӊtldg UTGBʆ_PZX2VTO;g9=kLo:nb1ˢP4BH~n:,X.jГC1A>-O*o$@"~\;?W8|±?%{n8!p2V֎ +/i: s̨E~,,v#+HRǓ52|4{<12l=^*8`\>`w#`pДLW, AJr;u V"$cL`=F8کʅLl|)vLz^0!q os7הU])<`R0\Pe)M-!>tՑҳ +ZMY_ -W|Ju''d\eӌ/{ebtulE酕!GXai)kB>*.c7q c +ɑ*m֤lot,aSRv4V  #\QU*L-K(Q𘮧]X;W+QlZ !C-`ٚ2X9Ttd\Z@jX%ׂGjre;Q"tۥ`@'eE||“bap,XQO4XH*,h5HV }yv8 pQA 6}2&!7IDSZڙigewbQ&a T8K"THZ1:쀔U5Z4Zh*\wg) [5 T={eFl(Ɔ'6ܩ6T-7#UMA֢@0P~a-~QXɸt3B2/)9k :,@[|+@,E6y;[|:W(BBIffVggc`P6Z'(pCj]4鰢͌fK{fzӓkb/gl]k8uM8i8NrÔz2:{!.5 mFF< 57w.V쀅Tze~IvVtAcye.D還/ ƢA\o ,~C3 3 n}VJNh߁ D[f/(_u5vWоT2g47 +.f8Lj1_YG$^Q:+_,^vEbKjrz14q|3qҟhSsl+h*{0ȶ#˔>˝"|æ+P*itSeaIhqHpVBd#3!/.Vff(=NJ~`g)>ӏ,~-@zjDK(%cr& ,_w)\-+QK]xN4|ݟJSkS\|3#j<# kËhvP&><~/[RF4P~'4(}":\+SMeY70|)!W2ңpq@9Hs7 +5xʑoMUчJztI27=&PFGЉ]Ɏv^w4eo_nT_K!Fe/1>r(nݳ7*mTtuNg#eA_ؕkMH" .nխpy:} ..A! +w7(!Hi{--3F⏤N"$H>smML=W3Ll& 4Skeb=%Q%|L8~dDIRL=]J‡ܼzvc?t7vZ +endstream +endobj +100 0 obj +<< +/F6 32 0 R +/F4 20 0 R +/F7 51 0 R +/F8 58 0 R +/F9 62 0 R +/F3 17 0 R +/F11 98 0 R +>> +endobj +94 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 100 0 R +>> +endobj +103 0 obj +<< +/Filter[/FlateDecode] +/Length 2013 +>> +stream +xYY#5 ~W*iR±Pż198hWT6&~|ͬҁiWW=@l(# }KVvE3qXө-Aףѽ0aڧrxq +fxVVd?ci,:׼g!Ɛ[4AEm:A3#b6) +Qվيjfsa`H%.WCs@zLϜ#V[í#H+VQ fhvٻl"wKvxt}Io`Fᑇ:JՎoP[t9ERʯI'%%P>!W3jyB^`q4+b+xEc RiFFs Dsp6gB9H}Ϝ707qϹв]ov-ɹ+}N+!OgTX'fh&"j7OpVl'A/$'?'f' Zx$ <ݿ_S:sښ7)9e8Du{7ddb"SCb˩"8¨H EPZaC??+r3l=?6m,W1s#X 5wЈ\)'pElx1#8'$y҉񵐦"I튇׌G#fhV(9v ؂.~+_Wlycup MatnNx4̱aLQYQH ~Н AeHզCN,\Q,TmFrmGFfԜzHmXS0. j~W-|7ąaRG/!ra@ (z XjY{G2 +0g)' Jެ*MnfڋZĎbyg>R9C'vL}8=9=vb-̬B. 34< 3*C7CK,ʁh'9z`~ f5+Ut$6!t֑ةR6Eu<'KIۄ̇M\o% b9X/Ė<;,-Az(-8+?X?09 . &þ]* efTѥv5,)By=|Wb~] +NmCNDԏ u{\~UsQ^mIF4uШܗ2LJG{89 [.ВxHo3=~"=iو>Ҋ?Sqt\~}8ap/):M/0Ot%p" 08~)P^0f?@mS|n˫Fbdy~59./j/wSpS*zqzdmq<6iYm.V[I}AHY*H@4y&]%Gϑ1!ͼ^.׃~( +!͹;AېtRӲ97ۻ_X&S!9 +Wȟhwg|^4Á"-^dm7/u-L$X7ź'K AпZo>z[+['@?%%rFIgP<7@K/r_e +endstream +endobj +104 0 obj +<< +/F8 58 0 R +/F3 17 0 R +/F6 32 0 R +/F4 20 0 R +>> +endobj +102 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 104 0 R +>> +endobj +107 0 obj +<< +/Filter[/FlateDecode] +/Length 805 +>> +stream +xڭVKs0Wp"#-&3mgIP@@89N}Za\Sq/hYvow?"EԳÅaz2s/'y<4”,g? KYk4z 8k8n]A9j̟+g 8߯&:r1/J7|B7/ЭۢD/Pp6{Fު2曶mMƌQ3> +endobj +106 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 108 0 R +>> +endobj +111 0 obj +<< +/Length 14910 +/Filter/FlateDecode +/Name/Im3 +/Type/XObject +/Subtype/Form +/BBox[0 0 2384 3370] +/FormType 1 +/Matrix[1 0 0 1 0 0] +/Resources<< +/ProcSet[/PDF] +/ExtGState 112 0 R +>> +>> +stream +x}I>Ok-\c"--t}@{ԃ % Ԣ&@#=KٳGw_[{Zfߏ+?ǯe(5?[wkVw$=|gnY@Jzb{qz{Ytjb?ǯSR&Y(!?=g O } +ҳgoe\6ڏ_mgA{Hϙw~5ih/~NٞmLl|9&H)!& _W{-" )/Y#(c8+EYQ2:JcmX"Yl~xlGAemPOT1.*3B$svv@&&]$  +>m(zƲQ]E5Z+٤MJ:؜l)z@1l5$|- kRO"I;d7RuR~̽}(okoyP2]MdD4d$SD>TȢ{ۂ33udD&t&+(i?Q6AijEITe =6l/ mݧ)d27~|c)7n@`!'T| #2J>٫0]f[V% ?QI OȬUT/d7H- B 4ʪ |,~e8dCsFT^]3e`^Cdgg^eD$c.PE~!bTrP2Y 坕uȬweYzEp'EKQLyd۰ULt--DW6%zrcoB"'+z8Z*dzԆJ& Z(V% XѤk5aKzb{IHftC(dT,V}#'7E/#J"N0B^l +hCqukވU'SMԦA504ml]쉖%5r2WusidI6UPǼ9>UYv~*P-! TE6W#Bs?0 eVb"m#ZU Q +6ȷ,% ,__p|T! <)jbb;v T +vi漸Wp'Dd1hu캂:ك:3Jk/Dfu!Xi 8 +YeX>]LL>Z[:oqrh5Sh31`+,MO!-Blo}A',o@G&ptaKN{(= 3?C\_C|@(!vv"R 2D \ iJeIT P 9qC\mS*JeȑeV2p&R'JEL'q1QPI&%VK HhZVD?jUJLP Zn]J@3'F/3sU)L ]rEtE]CdR;MT6%3xP,RFʦp2?=Tȱ(vrARFz02pnlN1UZu +o\$6)7W)`PW=B8StFjx1B5Cyh^;f(ѮQ@ﺕQQ˥Q?yFFߡQ.5 +&@Q(NE&mS;=mznFBe +rh^U;W@8J:l Ƃ<=h5&tfr6&x98# z-x!ndEO|eH/z6#*=`-2?p@百 4%>p>IVGsn&J$'F7\+ + װ~"ޞ#UpUYp.Q&CjS*&{5W6ם]KSo2 iйh^*q])GS}(eVɏL%|ž8hWyr]W@`\b25FA5,$l.:6!)XY>̾k/ }_(qy8 2xI_g5˳58vC2vc/O?u S,BVKb R3፞׀ 0C10|BGLRz~9隀2=Mi @Mi?d d;mߢjW_^8HbSNDݿiO +f4 +: ?\ӿCln>NQ - tIE&M* ɶ|]逴I9q3Peb3! y9 =RcFhh^mD}-!ɂ!Rk[:N0 1:mETNF:o$ttDʇ8Iy]yU?c",INEL,bs&zk5a ݝQm1]aE 5H+ +r2E>a(8 ,4Hp5VGNm;\Qb%s2Ė ٳG|Q> 㨘1L,#X*=R`@T X*#X* R s9Karq@Qt8 xҼ9jyx܆2G))Gpb:;q/8G|Q>IXFp +g3<)v8!hwR<3rnC +Vo:~0{hdVV!cThˡx2";3Ӌi^$zۼs0BCR"Άj-,1JVFE Kd9. ȪC[AA@׆`p,Mc g!m!V,i5YNBVx/;hB@Pn4ᴩ8xn+;KEϿzY=KN˂r_E/ 9@VQȱ08,| ׶rϋE}^U,d8E/ y\6#Qb<%ƐԌIqW= hϼWb9eb>d:pb/RDM^YGc%/YK^ Sf^*RkIVjBPjE\h*tܕ+gcR+<2bhӝ}l4\]=_OK;KřT`U,9xgu'iQ01:Lȯ^4mkDw; ٽ/V}PoavБyjx`Om2)ڣv͈c,ܣ_}lΟAV52s&U@**B +4iFOeډro;i!-€/m1nCXpҪ|T *m$BWC|bQHL'\}юe$j_DlKem74.#3k@ 4Dlu㉜z@R8\.N7k]5WU.qhwX0ohiv4Qt`4׹lחj MԢiXXŌQr J`);@B6V]Xc={E Jưf8BM44q`# ĂJo_ᐵTGiޕE&A0ucbh@pjlx-li|aY8%ژ*`Ax +ԓ Ͱ 6߬BDH&afL$z-)e:䎍+F߮V˰$̀ȤNN1ȉbWzLCbu +26/r Lg ';lD Hh 5l Q†4bG︇ Mh0naC0N1† >N,Hb7TK2BB+CؓD#SC2<4! I m+dq!Ép?Y Qdr !pD,!52$E M.z0 /rx!hp2ԛCBzu[5X! =X}VB\k,t£E=X=,X86"X8CM +Rϖ Xs:$bcuaO*^Nl6O 0O+/XC%"zY۝2Z'iEX}ݧl׾zC'9Զy\=NEV7x8J= sSꪫmd~ SwH}w&Ʃsu|pC>EuQis)hu kHYp^T>o*Ӄn#j C,Ԃ/!& o/81..ő=|B z ZrX^F!^ 3 } +N-73 +XCV}JeE{*{:>x5+, '8e|(j!(y\!@s>tA>e|b +(:>oBa|h=ԠU@W!^UJ>L*iAFjAl(Z}^̇М+C, + +9b|>|Ê0&ꢼƃV͇t2 =_qWc^9$8 S}C7$3(|`<ʮB ^g|Uy<|89sW!v_ r* nvXZϗ~j.X'$?V}l]wԋW9+\x)Q/^ \Q|^s|<V BxE+rP/p]SwK@3J-srM +|]ufJ\xIQ.^g\D;ˁr>S.^wv>^wKl+nq/s}GxE/s}GxI_>--^k\x-9\xY/;\xYk/;n񺾣[uKP)w`2n:n +eh_8I͙h391(5Nc廭gl ުPCܧO1-"3"9Tb&)5\40E>AN!m}:;S4e88:8CLEx7-^.?pfXZCD&= w| b˲ԣa_9d9ocX (~.JO1FD~5vs x7 +ۇ /8|)qV,rשV*Ұ&W7r*t19c8tV&ZXbHhy&"U]DI<Ǽ]yU@/%I~[a]TQISXrѺO+bL$V&C@kOD$+mp*z;box*AYC@t@M#01u0z'}˺5#Hؑg\/uεxW3sf7\vO-3_+fhLdV#BwZiyWw*ʚsđ&wmk@y=}{y 3o3k诋얠8ra t,#+scd7B7WD%H$彮2xS30NLb> #ibhHL(H 霖M +7 V#3B! o+W!/zqJB*k%,}[)}0TRn\1l|_eiEF/`2`ʂ63aPiR&gn8(DY/ZT]=' M/ڸ`Qtrmcv`hɸdy7>ڡDK= GpD_wv4\~. HDO T;[#CtaCNC3!bHXRr ?!gMuS; jAkF_//VӶݗh`0*44YJZ!oZ="VF8=ZR剘3͘ZO> сۋ^ Նpxۆ@bxMIXMT"T/nX@s|~{ =Ӹ&ERm8+g+[ =5}iv*Xe rxCȅ= aᡘF *[(ffwnzfx0b7YM}]1[";EW?|}Gwb1_=6}W8ܜQ5a}s z6 W;ܵ4]i3^55h k@y0U:4x4o;-+sj$(u0<`#"rа+S ,7AoF')ve=qf5 MTI.cv*M33IX1yElWXB՞nEپV C#OP'*]WTwb>i1CT#NUqz}F+.VTu#"ySU'?*.ʭciSLP<VrKΪ +u(11YkZXT6Ŗ8eqUfd3.ɩZW&u-a"zO/Y*I1,4L2pm( x%Zݨ;$\  aH5AAfsueǹHLU  \I+0Y&+am"_{p/?9vI3&XElGqpT$o{q"ǿ4,r1xs Ǎ F=, fU.>OH u"<4gZ8_U]{_WfT^*rp{P |3#sLPŒP +r摹RvB@pEV2SoD~V +Kx#$,#{旻<],. ޗ)|W c'#]5=-G[( +{M ΋q <| fw + +pי񋮯D1Peᕟ\]PigT f@8UV<ܨOt >G^*_:wf׃(>S2Lr0K'd{+o9im8ÿ1 i9Uw7Ww7P|M]v5wx۽^V>kwm,FZz2pN_hDAkGN}람Wq=tHݯ"GqKPV ^WR1EG~:1}j7Zr^3zK @8X|><6Su"I"~u0B4:^ يܝ1'%Ă/Bk2G7d!Ėid ni4>iF:\1#fhˊ5X}G*͇Q8L<+.Qea6ҍh'Y D b׵59IDO +,klp@ԑlzTV!p;( |ayC.܆If]| ˀ|)%fapՁih#Y+@>mˀ0)nJدcNtn^=d/.ũ#/wS2N !z@WÕ6|MP ڔK ,e&KOxٻiyW+Tx6=&+E;*{p9F#.> (1_%e栌 P .hC_ f- $q[z7c%>gG.W{2EfZl8 a@)n,a:K?2ȷ_Al|MQ76n>Hym)E}- 90f 3l}y'IcqXc#︯ !rec?Zr 4?AO1O^OH}o@*-5:Gdmb9JBA΅xʍAgKdTumCQTszS&,8 nv,P6ʫh!  \rΉjC CWQ32td Y ^\ƓU"D$BlUۨ$&/B)|nݚ4de(ڸ + 4`&]7 +R^fm=)zh嫇!&{U"2b-q=C:C:$`'B:&Gzpi+56 +5Ⱥ0MnVӕ'*\ՕfYO{CN -cKq)v;O©S=EɁMUM xxG2 +̼r ms/PTE#JT^]P9_i! +5Fٙ!TNfʍ7 Xkތz$Bzm웳Ay58/r&/2||n%ܢO)79Wets2% +f̯c\q ?2Z|cYL= ;O꘴͂BvhA31gΚSr'h4B=()O$}M,W41*M]Bg! gɅ"z]]BULp/h;KQyimğaX$>kv (W ԉH9 >6L!е-_L|.\>Wnd@y] cdzs;E!> +\U6;ߐ/ud$}"S}p~ ef7`,ݿ?֥kz^z %VJ~L2&n &>&2R+yQP'La遗R| ex繕bOK lpv4}hjN9I i1 8A~>IXB\.3N$|*_ xGk~v|uz1E1J+~T4v3hS˘ҕ[N<RcFKEAW z.aVJ/Z @A"ǡ{9;Nl}zXz87G'$r:˰6^շe= "]XۮwjWQ +Gᓿ>euczݦne/#iY>3Ȃ}Pz]ؔ?!18~Ynga믠5eHC/sPte*< $/8|Ym Uu/j[6.|.N|W9lծH p? (+x1Cgl&/͗L=܏mc8m;+{țsnm2eӾ֮aٍQ1 +l@IrX>ցC>n^T +Qv-e}FL& L 5pB]kh″hK~dbZ +LY]PA3ܸYd +xX80Ce){zW2|5' =Mµ+N=bq +3Hd:1{6R ܪM>^1y,TUdT_*6ܨ7qNW^NC(q+[+I fUXyL<+_>8q(5ͳ]</+c .&Q_%o4%WO_Y0U:O/H+ qU"J7Na?ECPgϭIE N Wj3kF$ Wc$rߒ<Px3Ai^š5qe7 2/tj@we )Wėo@ f,"!uwvc ͷ%5( }Ÿ6i`s陿S]S>- ʜ.2?R}FrCyp&ʛ(D5XyCO|^22֪U u o{'-z2-ęCor|y5K3;38wLovM20Ʋq ROewrZ^nP9<[oȧS3Iɹ,*R6h`T1?sdu1lmǶswz~v쏿{U3գ2}> +z=YiE3J?j8HDE@`磂UFKB9T}iQ8i'睬  [2V{TG HOOx'oAʤ7#W9CX?9Dc|u,tenaŪLh,UtRjNx&-į 2]~K巈6q܌R*8eNUxݥ/rT1|MIq{>Ū^5n +wCHa M & ئ_3#*lȸk69=u Ynr4q_3ڙu9.1)dM/dҜ!ǜM<$cgmP|Vˤ +T'\{5 %vbWi_]:&fvynWJ6mbd~:LQw:"vwj sET"(znzlC =1>=EIgj߈B۶7d% D3!sy8*mG/f +H0pุ3JpqS]'bܔyyl73!٘ YY931fvW@ L1D0SL˜)&i^eFCCzC%G3ژ0S@=73!ɳļy)⼒nfB.+%zTZNH#*2^;!R =Qv`'&t曝rzHg' B8`EXf7C -xvzeλw *_&Xj +endstream +endobj +112 0 obj +<< +/R4 113 0 R +>> +endobj +113 0 obj +<< +/Type/ExtGState +/Name/R4 +/TR/Identity +>> +endobj +114 0 obj +<< +/Filter[/FlateDecode] +/Length 2349 +>> +stream +xڕYKsWTՈC|^GڙufDTRh +XH/In4@5\D<@ 0^ +n~}|QD:=4kXWu?λAh++]X s +Uwz+vC^W"5qBQh i )2l + Oށ-LR{RU%0T<]ӈb#kT2 )Ԡ% {j%{)R62mbا'zQrLVʽbMe5mbc٠P31WApRO1T}DWt-)(8IBJ+j'r=M>V́ۺM{e[=(#!O~#AVP_L OԌ< \A'B\HmHk{!grP Km Ӕ,Α$Q(ޗQZwA P>WgiSJs@;h]uhGUQ +`s{Pݽ΍6>@ԛRRbG#%Xػs%q,hjh,X`B4UA,&O{/ +YRbAh!ҝbGΓLy-[aij&O`?Z f.C+RSw~:N ݁XךAȒ "[Eea&H-,F}iLp OlcF G5qdre< Bn~Aʢ M$`!AolUnUѻ{o+r=uéo2,B0gADƖ(63ae-z*x+)]W<ϸE[Oh6.@3(Ԡ:EEJ'boeF' bjF_܄PiTE,i4KjNگ N Qm-s8.CE-k[붖 *ٗ)ŋ" LsMWw'm;okIўTvwy?Ӌ65 E%Jbi> +endobj +116 0 obj +<< +/Im3 111 0 R +>> +endobj +110 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 115 0 R +/XObject 116 0 R +>> +endobj +119 0 obj +<< +/Filter[/FlateDecode] +/Length 2252 +>> +stream +xڥMo6:jER;1&].]ƮҴ@|CJmE^|f8C*Iy_7Aď?'[JѷUdMfI.*"Y]etqAHѤo V%|l_1y"bD"UKKsMlրYSe3} VzJHg j&mJӻ? Qu/v/;}{-K"su*f i"dtkq]/,`K.Ǹ@&i@ cnaKo㠮-\ǃfsrd{"X&F7g(gD! &hl`AJ"Hi@2Ni*諧ˢfiEZ=тe5 ^''gM!Q(i~悈;p%I0>LeeVW75Qc3QwwUĞDYpy&r&t'C#rFbէNFy,.\[w_": qޟԝn>nMv5YS=Dg r8$PtIdU}n'$d|p3׀Vqbp2 +A8ԃ($|Om +͡rʄ!$B +ZH+*fpoN"lTQs#2$nYc*>p$9QNY>jh]rݴCW.ILrOyd ~Ɯ].SKlA?F)f3J9~NEYQhCVvX_+էE:un=`,]^{z{u TK~x +"'mĢdc +uM @N u\`Qyڪ]DȸmyoGծ+NKHX]E7ۓ&+ԴI f&0%Gn DܬMǼ(n3%NDvNMPM73nFƽo:p]7CYf"^%iemaYn8P ^Bf U18މ1_]/c\(-j0TQJL^ؾn35Gx>s3Wq&(8Ϫ*OӊN4R:+5ӳc588#\{h^陼 %džy*>S7 Li#%7eEn`e-u[UU߅ +^(vtԔZ@d-ء3Զ=>w0RMdP{P=)ˉ)VE'>iV8@;C7V'Y"< 6P^m=SDIILYslVEݥ̂7gK1.O wf3%} ,H'/pXqv,h%?嬒ml8hsR1^rNb'\Lp&QyԓW^rK^Q^٪_~(YlOtG%7xة^qn˯9(6#y-wk!.&;ƛ~~K~C j' ~'?>rQ\.q>YOr}*P,inL|8DqH<^Tox>ToCՃj2^=/70_̹{99pc~`A?E\j1 +Nw9UQWmWkNu +q (ӱlFoot"sF?ow$6= ov  +endstream +endobj +120 0 obj +<< +/F6 32 0 R +/F4 20 0 R +/F10 66 0 R +>> +endobj +118 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 120 0 R +>> +endobj +123 0 obj +<< +/Filter[/FlateDecode] +/Length 2837 +>> +stream +xڕr_9}Xy&ё(ݴme>0bkVR]67ʒ왾X   + XV̟O?bZ͗)^ڏj󴊕dKe*}h'-2JbWW7^e~fYTgH{yV+޵SfFΐ}\_k^f(=rFL%˘2$U n?=JdP k{$\]FaG +Tg1m TpV ޮU(ӌ.:UL +,NH>qVm+l[lH{zGC p}ٗ9p[<١\! 1[n8oURqg*N#b@ܾP{ϕퟚ#sL3!-R3|gAYtOP0~/,0Ff%ܥNTlOL=x}كmk6@mBPEΔMSWLOE++H%7`WEk+h +ǩ[JW+L.V;'Fˤj_:cpmwE{0#&ÒPB?dJB@$Kcy&(?dCBV~B-́*>qy˘Sg%A1Np$~J<#yr%B49 큠 }[?Q;-K Kq +fT_"zSǵe\-3=n_>wl.8]oի*Y: ڌju$̐0Ѝ5<>L M<.}wFQ,ȏq,Has_nmB˩p Xo8ahúGs +3s*,1n!?m*F$t˶_E\.Mc46y_8FNLohwma~@pgh[XY1q8((2e)LW5<iH%Ii׃ +1N92+ydbߤ;oy(JS߶se< Y+6ןB047ɔ4\0`dz^3nEo{̈́c.CP=\աY W@0"8x9yrZTly5IvaB8Bth˼'Myŏ3ylyũDx]y+X7E^O$ e .=?5SLv8j QijCGјIMR[E%-l ϫ:Tmْah8Q/+xȆ}H1>8ňc4IC$`$ i< <> G6014#w'WٔU:Z#͍Is' n#vF`~x&rIh'C憿,Ȯ/PPmlir +CK73$n@/H\0;gJ8a9xN%JImK EBdɹ9[RD$Zv 5} xEB@s"΁A%eΕ0|BQ<#\Bb1 +'ٶ NJO"H+?oCCY~.e[ׁ9u8Cg:h7UY\ Sss=גC0?WF&vcq)oզG"|扅-rGc ɭsU]R:놃;б`Dw1@j>Ǫ`$ui8efgȃq(NY=Ꙫ+vQ/ +RC c'P#g9KW\Q=uGWc7-l`ڡRMӷ㯤{XdD5&{Q@aaVxj{%ǶWNjs!TEM" ۈLBڔ G%$6HĎ;4kbǧA~ə*w럹6hgڛ_4$n] hC;PS@;#n}){@JIR_lUr-\S|Rr=e08XCw/O>p֍I05#;$&έmXl.'QѶq[k"A Afi^ ~t{Ѩs8-@|qȐmqYe`#(i5&bu2y υ>gr~-v88(yzq{`сpAWc!qVcyjz&TI +lW߼yƝ(CAd+&yϥ#<GJM'ra DA4AcIpV.+0Μ\?ȸb1XRrƊ6r-ሕ ZiT۩FboTc]!&O2LcL~'PcQ\V? ^GCBX:w7+Nu_g?~ 4|ƓP*͌{Z +endstream +endobj +124 0 obj +<< +/F5 29 0 R +/F4 20 0 R +/F7 51 0 R +/F10 66 0 R +>> +endobj +122 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 124 0 R +>> +endobj +127 0 obj +<< +/Filter[/FlateDecode] +/Length 2372 +>> +stream +xڝYɒ+x3`)fFr#(6aeZ \ZsyY~l7|~]c9&soO͍l~wlo nRP n7=Txe+CA~F>NDE]=6GPAd} u03IQDRFbFC u٠xzM C>vG76a coh[񞪺6փU#ұ)fMWa{CӳVm>~xlh i{#?=?b~*vZ۵ M8vP̲Do3䎏E lWmtR.+Tͣ`:m,}۽\W]qyY'33$[6Tus&< 3ёzn?i$caԀѩa}kŁ0Owwpxy#l4|nܽ// W 竚C'~$?*|$r$@ʢs&Z_OXOx?g \40hBO/ +-`*Hyy5&D/Y]}߹~ LPC!¡+~?t)wQE;ʱܥk˥HJ=T_u۲'6r)JО4Eѳ^^pQPkqQ+@BwRK$i+zZԗ[]t5}(WG9(\Eڱ3C%|r(dN<B)o},P)'"kTIJN\4\ +-Dlɼc^ިqsG4~{!qB4g+6s>E",d@$8"+N%@hl^/=eڏ͔˱:+sSdΣp6ih +U\È ;a$$ ^ة?*bjjLzG=S; du)ꢎ c3`q +&wB=AZ<\mMyTZ9 +26DyĀJ>+qÈK.4'uϹ"JOb> ]cQ(<BԊn (`Bn\ lXkVAGE:#n|2*eVWogk&K YrmqPGK뙌 88Z:"IIT;tt$dUߣ n?Z,RY"_P2w,h,0Ƚ*A&q-"ϯVJ .LC; A/RpMP \VWӡP@4 +s +^5s CZ}-*9'XTk7Y/CڮחJGW44zL.^2Ӥ_X,zȑô>P'n-hL^Eҕ#€\i&O5'tBOM˫Qɶ:69ɽz1f.R+皚P?=T% (KPL@F:VǓ%WӛQtڳT|S!K6(}iGr0=l/uP +endstream +endobj +128 0 obj +<< +/F4 20 0 R +/F5 29 0 R +/F6 32 0 R +/F10 66 0 R +/F3 17 0 R +>> +endobj +126 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 128 0 R +>> +endobj +131 0 obj +<< +/Filter[/FlateDecode] +/Length 2566 +>> +stream +xڝYYs~ϯKjԘC7-'֌TX,<u~}E3ɋ4*dϏ9(yJju?UaJuĹ]=ȭolFc?yleo:7[evV[m54umEhWr|~y;U,3^NS;ßVF)߮a=6DgUXX q-}JDqjVw#z䶤̦F(Qi&ۼVurرQvtFnW +vppg5t oh YX2 \)F,zgl(J]k#*'Vb:N(ӤX47{YPLge`yg: M+acߌAӤy5u`^.uN|dGLE]yp6A=)o*W"Ѿ ̦f@o`ƪ}fr5bڑEߩ&4ǰӼ0[Lk{ʁ; :T8BChs4JAЍ(x^{BR8dVJE߯_v=0:~v ̧E| =Y9}+9ɿ{"kt-SZv]w&8w]뙕xFˊb'Hj. 7ueXΘNOtţԦ34 #o(x@l=o@@z"}gJvq|A4@AC.wJ=  sȭcF6(Ȩuh S+/Ҽ $s=TZvֿXy$t[W_$wi0Ztgh{ +~<L.1`w(XRK309O޸FL2yYPMrV]+,X] ǡfNxN)Ba'z@@- tަo#\ṀlK@Hyȕ\Hu=n7%~4g\ї +2P)7V2&/.܅hJP2`䣖t@j0mł^+ W* 4#IOai@iv a6J3a[ nݽbH"5BSpww0.Qu){pt) feJ }A+Վgpԩ"Z䁗Z *f T9LdBn3Tj͆d휹sү$W3*("P\=!TCDgd;F.RC! +ˎ86i09`V."P!)MlcZ+q@!'Ä/!OYwI4Xm`ͅ@;~˛s?'SHBF ڒ+S+bLLʧ~y|V&'9ֽX]T%GcB?31yO?1X fC|l&f>ݞ'7Jqi*[CRC35oD p* qsy߿VxfI K%q9hU7X3Y w  +endstream +endobj +132 0 obj +<< +/F4 20 0 R +/F10 66 0 R +/F5 29 0 R +/F6 32 0 R +>> +endobj +130 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 132 0 R +>> +endobj +135 0 obj +<< +/Filter[/FlateDecode] +/Length 2356 +>> +stream +xڕYݓ _ᙾ3kE>x^3y+6{pI6Ғ4˚H*du\Oܥ}Znv͇bXBv)WXoTcײC7%qY Zov}30:MݺΣQEQʾQuDy]*'u4}Խl۷&K1JjO+ǁ~_ৎD3tԣQ4m, :Ag҂,-4{ТQzg5^Ȩ` +v~YZGg3:e,{רf0{WrJ%2{m~[=-s{vrDs8HFKt>; f?d#^q!Fͽeay7e~h8``UƯ'wC/w3/˧iDIM qг9Ov(AmÁ_5>(JP{vxDfSot.YE*-Hs׷ldLUsrhG)tr#vy֗-ғiNO@l=d sQ{xGȹE1DN<<~ey>@\aAǓfp6J5"xӁ<9Գ(y$4Kgy5l=}|twufu Vun"N@hWVԒ w?\gVuiE:X کS6ȟ8#YHƨaWڤz>6e^;Iz ݥ P$rє'"D 29@LpNi )r69:Aa46o0bn1zW/@^kDę{¤+ gԂ9c;(=>< +EC D^\n-R㉍THiLçjP\ +.s7XNjny D`swF{R~@>R-:!2.6K##+G rH:թA5S@3ى[g`C}btI ηhys@wVn\\]?pȖ3gPyQᱠƘ"蔺I3=PRTn(Mĩĕ4e>ZC<0֪Ֆ*t4_PbBE/p<-rڿ]*w*ߌ= +" aLAAn:cE ܇vա_$'("}2oMMX@ULpb6:nYpjUos)`⬄HVru{F5f~d˙wn +"6-by^S{D`G+fnP{=(b9إ*]bBտ hcۉ!k^ ݃zC4Pc가UqnS0e֧ qg_.Zp2".wy3`D*z+>> +endobj +134 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 136 0 R +>> +endobj +139 0 obj +<< +/Filter[/FlateDecode] +/Length 1733 +>> +stream +xڵXYo6~-e$ѷ۴ [Ay +֑R7ጎ=Fk8 #zs3 Eow,B%"mv"ɼuƯjRo_DWLC˶Vl~u +BiTxkdEүސtDeͬn (鷶'΍y"D|wdYW# HLPk,esG6$ZV䋹"`GFTE7FJ> r2 +h A&jLRٷ-nX|0qid`ip?#0O$;, puG]6[C%kkxk^XQ 6,`Nn36ەLajXE|L =RK4MF %t% Դ=sw4> +wb3꯲ߣۀRˇmctsfA;|2 `t1ut >WvGS5S|!Bķq6NMrJb@m ԼeoFOd |cri |v`@6w@49-> +endobj +138 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 140 0 R +>> +endobj +143 0 obj +<< +/Filter[/FlateDecode] +/Length 2150 +>> +stream +xڵ]BHЂbM&C  ht೵{ne{a{ Gk4pf8\,",RV_2<0PN/ RY5"\58Th] ?Z9nX +ExeEZJhϗ=LTĭ2ed7CR}W˻y~%ۜ#Eq/ziN-|Ǖ:󩲸|߂d]mn/7MS}9\dD̼aǐ(Eg^Rx(wRse|QgPm6'[E8u6C2~ӾjthW=;HvF&T.]#4x!^Bc"PKv + +֖Fu[7|HP~DXtBNKz /̞0JT[.D2b\c)L0J4A.h,E 7\À㧃:dLUSթ +^5XX,!,Ӳ{(,i`ZޏCqFA*˳DXJǾ$SIA`”HeINlzOֱR>!MAE`K%PӄU\HX%֨scg3=!5JܨPJXaj} "F9V6p?Rb%b5r!ԇ2B.0A!"O6?$ӔT +Qxؚ[nVB1IKqeZ*rjԎ0o̞0Ȍ-U  +Xa% xj%ZjQfZLK>S4xGammꉼ ۆmvjې̞چy2nP TDl{̰IUN!aj t۔C\@P̞,bmY2ҧ;ɟsuJŏ8mƚhTƁ,zGBrZߐ!Lcz`C?Əx]]]0?AbӪ)Ҥs#R%7+.! mVS?ܔXfXrW +endstream +endobj +144 0 obj +<< +/F5 29 0 R +/F6 32 0 R +/F4 20 0 R +/F10 66 0 R +/F3 17 0 R +/F8 58 0 R +>> +endobj +142 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 144 0 R +>> +endobj +147 0 obj +<< +/Filter[/FlateDecode] +/Length 1400 +>> +stream +xڵXK4+\pgk̞ء +PD1$0-ɱda +K[ݟv8-[? fyYp"ҪTEڼ[dRǞuyNzM }0ԓހpy]LsR$e*H *mLP +\}ۭ;h#=C]n6 N'mVvx d߶w[8v>qßGÙ<]gW|#D 'E2 JC8 D_b#窲6f0yJvpI]2&'!٭5Qńu~ ΄)&DHS ޶d}lhΉ<\B{8,?hy#s$Tln<_:N&1C> \#V6Y +۬é"  +PUKScY;k/1 C j!* -* +&\7MgjH[[+/ [n^|U#BuS

-;B".ufd:a1P +2w^oaA4)9ef3܀ј}zXgInٱbJ/ВS@pa*Rq@Mx[/6l@jT197E].PO/s +endstream +endobj +148 0 obj +<< +/F5 29 0 R +/F6 32 0 R +/F4 20 0 R +/F10 66 0 R +/F3 17 0 R +/F8 58 0 R +>> +endobj +146 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 148 0 R +>> +endobj +151 0 obj +<< +/Filter[/FlateDecode] +/Length 2650 +>> +stream +xZ[o~8)vPE^Aۇ>D@ +4}0"0K!)U_<%Nr̐;;ݝZڽٱFD߃v/_&;>Yț5^?J]=\\VPھkY?),$V[Y{-mQJNv9q#|+C1)9!:l>Iv_8z]^7#p ²xO yiun=|BE,"CnnwpwMջݷ_ts-fVVg/w:LC$x!Ë5#JTUݠ${2%hxPNYV{w(98p۹^7EݢD{ kA9J[xN!prE1pGu`V[6<-mGASٞ +Y*2E6^vH+]0q>7Hzpeya8eiA)s?%j94E/Agyd?qԑa-  "]{wGq#a\@ r!e1Qt1^1rB2/J&V /ESaajY(i:Ntk䙜IhspwG3Bݒ?i_\ǿ\>o݁"Am'9a~X\^seyQx+RěJ38PE}/W8w>EE#d+rj[DP!MH㶊L:fXqk*!vh^K$r/DO5 hXuPA6F\,^MN}ʙD8 Hޑq{yCc:GR CwS/ +n(NhW4f?g֟Z .7֑O$Z| a_DIIT$!>DNՀ8@=B6\Y g # CX [345(3Qh>a@0@j:>IJbwjņ=k8Xka%&ɿiZ\ wnjltXj =\C0NZ N'զC8c1 8!vs_R\٤$&%0ILIHHu|TPz+_TЃL=YQAoLMN+woN7Cg1T|΋僮rBNy*p]6cwf@;, 2zCc\`Wzհ !PD4Cņ4@ \uPeߟ r +4K:yK@HxsTM8t 6 GA r \5v+p:Z`CfF8wGM,>$ȉBBR+rn!!  dx'ID;!{ &y(9iOs&G c ;4 3O|CYxBHE7}CoucPR}x@&o+ՍZ4zsxa8MOO=pPPM \wMP  EYI^Odo|/؍Zt9qcOM5j(5#+V'GvwW+KA0"/C2 Nd@{`iǰ]X`-C~gmFHb> F[*@ +endstream +endobj +152 0 obj +<< +/F8 58 0 R +/F11 98 0 R +/F3 17 0 R +/F4 20 0 R +/F6 32 0 R +>> +endobj +150 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 152 0 R +>> +endobj +155 0 obj +<< +/Filter[/FlateDecode] +/Length 2652 +>> +stream +xZY#G~W&j>w {0zF4kz/,i!7 "_1?~ϯ^v Dr"˿vNJ)mk¶_WW._(=NT[_fw_Lpu'^" +Jk#vwb;,0`a19|ݡyf/+զ}rg{sP#4{bAA8ݦ9V%E2 + UY!0PM^wQ&I5^l6:0<;TtpĬx,%<ݣ) ت0}P@]f0PԭFHIϠ$l"f3_A4+zOZuezc`ħ0)[,~hU4o&LOl{ n3%ݞ!P<=gݟR&!`V~*fWS3/nyE,G(O\{"_6i|crdI_Oh)8;$CuhJ .7ʐ߂5@DG>hx6Ѩ@j®nؖ̏x%W*VZ׌ngўVWt  +KߟH#jG'O/>9\H1.t/Ef?HY,ۤdO@"i0-t(?sBkj1rUcP_ߘ]kk͊^{<6D܉In1A䣶|Ԗ†Q6= ?թT*ԧ.\BV>ϯ`oIZ,So+ϳ?E?l Dt޽- +([^ȼ0$-|. mkbMZHSV2$z`b&)Xe"{g`q",H FM3 +,| VC +۳;ޱQe~&ڈjզZXjP:9 F g0{߉1CkSx^VAQ.B[:S56,j&Yy*B;ـ/zD+>6n$eD-%gVm"mlrh˽F +Tq|Jv}Ɯd}*)\sڥY~PMO0Vr1bhQu_ƣWCW(>հLrk8׃"ɯUYChkZϳd q'-DXČ,h(i0N1uKiF#?S '\32R(" _+fM [ЖIσG&܉^Aay0^J`k" ?+xl*)g]eH, ^+%A^+!3xqّG̋0~A%6+18.')n@7Ҵ(ڍɁBc%xR`-}~АcA#S:Sw0j(*J UP\ZΡTpBzҥ)3עFMmsR*Jy1hK-9D`4N%3'-TFc0`1 +U&R^iy%8 DDdDRx)Q`/$p\^rbe4)*> +endobj +154 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 156 0 R +>> +endobj +159 0 obj +<< +/Filter[/FlateDecode] +/Length 243 +>> +stream +xڕQ=O1 P2čņ`$ehɵ"0{<:=L45xm] ( uq,8bIP^L>.rဒӕug ~H7Q ZG9x֝L(rwv8uv#_(V,ټ)qj C6*Bd66s3Y]3ro4<ijmM׳ނS $AQuOFf +endstream +endobj +160 0 obj +<< +/F8 58 0 R +/F4 20 0 R +/F3 17 0 R +>> +endobj +158 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 160 0 R +>> +endobj +163 0 obj +<< +/Filter[/FlateDecode] +/Length 2721 +>> +stream +xZ[o#~PR,yhu!Eb̪ޛ?ttWj_g//u3y&쭣na 0̾%3 ݭD(Ņ>:aPwqwon_b ^iw z+Lnfwj},=͕+&TfWGVE eB9f)N^w栶n֓]IAf{6Xn3ʼ.P*<?7W/&G\o%kZix j>$ޟo_hkz8~v[A1 |kP]I{`\f Tp5HI0)9{WʩJj劅. jPu0 {Pۮ).ƀOU_Es|qtXmoBa #;8Xn>lPL3/a\nq|_MʍCSCxcUgv) ^a0pݽ;0;oP& qfavN ;[ȗ[ïvL6LLx \$ !r=~ +닔`C֭B&o!@jxw#Z/rKOj[W]x-{PT+YjjxXӝ}"#Uz%-B +a5= z^X==?8bࣣh/&0BwB7l%3BStd8сGGYHi%0BQphL$G&'a?[V [1lͰ}$비~$jTw9O dzP|$t"$lRי9BCuxf@ܲTg+]/JnBɌrer90L]Pa#$XۚɡF:#K b@ v18ŞB(+UWnؾaD0 L9n)mSb iH⺘!D2HF@~("R"9<o|WNY8 /|Wཕ%K  xBg+ecqn:@_y.c#(LRc4 ^o\*`z¿a'{90Lo$;#!NUhQD0%Jp%؟PfF@ PL³atFK&Is!fh_n8a}.&ẃQu 5҆Ɋ{=TV[u`b@@@ +v>B= ƕ>`rP[<GKmxڤt8qi{)![+H +RÙI_//328B]i)t(+>hPVeB / D0+QAc? REY/? +(I;LE>E;6I +endstream +endobj +164 0 obj +<< +/F5 29 0 R +/F6 32 0 R +/F4 20 0 R +/F10 66 0 R +/F3 17 0 R +/F8 58 0 R +/F11 98 0 R +>> +endobj +162 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 164 0 R +>> +endobj +167 0 obj +<< +/Filter[/FlateDecode] +/Length 832 +>> +stream +xڭVnA %$P+r +\BH$Lb2(tH .~S=ҥV] +?}Ԯb(lJT لڈ&y8<7gwʪ{{Gl3)$=;uϔŲ\дdצ鋦uwWt/z1xϦ5g-l޲V_hPo\=խ7'AL&b +&.ɭ h0(wV#  UKQZ{4k+:t~ݴ%0\Ęz^AJjs2>+z>R&Ef@R\R%G + '8K/iApG|g;\j KQ /8bJth +ZZrb#HLِ#m9;i[sOtޔ!hJLЄāf +?Dx${Fa0y +;lZcd[sP;h?XPLr~:?Z)17K3 +mYYu̵,P"KY?R+ 5י̓j 9K ML;,YP]߭nZHMCB/J`#p#PGX -V)Lfj]a2_R~f9g<&m \`@Do]jrS쬫4)H|e)"ܦKPjA5N +DjӋ#EB ?`")!&:<hZvϓx +endstream +endobj +168 0 obj +<< +/F8 58 0 R +/F11 98 0 R +/F3 17 0 R +/F6 32 0 R +/F4 20 0 R +/F9 62 0 R +>> +endobj +166 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 168 0 R +>> +endobj +171 0 obj +<< +/Filter[/FlateDecode] +/Length 2784 +>> +stream +xZ[o#~PZ; +1)$Aۇ]ˎZZnBr8qh_!G\C{!z! jfxH|{VbW/B>ªޛ7l+)鮔^:噝װh%  ޸"[SIQELLo}s;#8͟RNZ{y-T]^TdDz3-%x¥yDi^Ek઺;peM2oT8$B3nS$̹D(vnMd8u}\3 j +p#N7l_kXCAqe +='P(®ZdE 0"7 b!%WEI#麢28Lف̢UhZU(b;,DC6! ԙ!A;q ooO|}/[ |- c67,ex C_ZC{+Ej|=cΕ* Kuք}p`Q8$Q!Oyڽ(κ7fԟq0Bm$!N&~ Շ9`wX#o1b~i[s qiAiA1eòt. +s^n8z͆NKto߬K"D鷫t;ʛbUr8u~ ª0|4.2j/DL~TKr[TH8aő,T|V@-frMm֓z)ylV}-#"c>Kf+qY +endstream +endobj +172 0 obj +<< +/F5 29 0 R +/F6 32 0 R +/F4 20 0 R +/F10 66 0 R +/F3 17 0 R +/F8 58 0 R +/F9 62 0 R +/F11 98 0 R +>> +endobj +170 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 172 0 R +>> +endobj +175 0 obj +<< +/Filter[/FlateDecode] +/Length 1217 +>> +stream +xڵWKo$E +ZPTʮGFL1IP~TufAv;kB)Mw]<\\.ԹluLO=χo/|GH&Ζow,CCÎR㎈Q߆βW"K0mQ.90@߽tat;؝'h#cȠ IbcAm>^3#nzN3b21wLf08D1_|P"q 5LtxtSm]R,$BŬ| $9A9{JK8`bB16J*g;q,)2|!5$_>HƄnjH9򛒳{%J)<'dHNf1ʻ ɼюA3> +endobj +174 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 176 0 R +>> +endobj +179 0 obj +<< +/Filter[/FlateDecode] +/Length 2184 +>> +stream +xڭ˒힯(ˇH\IvE[WespEr%>@Iv\` sf竷'0>>-bZG_\=mVB`VW̅*WFӻݡYo3uř^s*`0_mdǃ?5@-K[H]RՖ@/4k/+AřHl.ݥ[+YӇg_nΝ_oLupܷ]}Bڷ_H=o8y{w(J>;Tnm[轻4<0]Ȅ LD\2@P?S +嵴Z8R&s̆~f.6 +ZWpmWy-]`ߒRF|BgA>N(o/S#eOBLurg5g8U~m!w[:8nKGvUb4G <_ΛOus)YoՖ zB(I"=wiQ<]˞P/=J`|@m[:o. J@SC.1@@h.)sQfOvQˁo -1ޯc]X/YH]1_.0"NLSLAT:!p$pG`A=8ogpBJ@# +\I G_ߤnD}A+͸H"J Vs{ h= <\&_cA}W4:TIkfYunvL%"%d:*PLwb.~njM|6bl{/>$pQU!13El~rMrWrC5^j=; o(]{>@Zm 2'kT֤&54sfKrLݸegZ@ ! Pj 6vzW}TCԫ+ nP9lN2V՛2(Q)#/ǒ FQ]y\J0 GDb*X%"Dx\b 5ȞܫROJ ^k|A` +~a&m%Q>پ =ސSǴ(rq"t5*-g .L3c¤D_}ZsdOx,SsPWbpG-wGXBtGVVF@B):*8]5.MY ;a8Ǭ5ZN=r +շx@ri$i >7MF)hNHa2d; !Lp~;QmEt[bt- =bI^W0A +2gS ݿ-A;'9P]|ht[tk$|wמL_,sTe=y|.4278#,Տ~S@ G G礌?I%!8hQ@:O_sc>f]&&I|) +endstream +endobj +180 0 obj +<< +/F5 29 0 R +/F6 32 0 R +/F4 20 0 R +/F10 66 0 R +/F3 17 0 R +/F8 58 0 R +/F11 98 0 R +>> +endobj +178 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 180 0 R +>> +endobj +183 0 obj +<< +/Filter[/FlateDecode] +/Length 448 +>> +stream +xTMo0 W; 203".|[v)AH[Dg%@;g2`zR  gRқn2M*A+g ѩON>%uӆl~vQi3ݴ#Cpz.ҴAosd/B[I:"VB`+@ +5QԳI>RQEIanH+E O'uqX%Ӈ12!g="k3rx8ܗIz%xH|rs!(sdo'{ A !%ykE֯mrA&! Vٷ_|9 ; ʟ*׺Mymⅉg'v~~b;w,?Qa8i_y*f33\t#S?( +endstream +endobj +184 0 obj +<< +/F8 58 0 R +/F4 20 0 R +/F3 17 0 R +/F11 98 0 R +>> +endobj +182 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 184 0 R +>> +endobj +187 0 obj +<< +/Filter[/FlateDecode] +/Length 2295 +>> +stream +xڽr񞯘Za7W*:*aVCiPC[o6xRv^@ 4uw9 7]ݭʎy h}ʳgt's=⢰'s-RIy4ߕmmeU;]q߃oWR9A}qbonA.n>rjDj=lڶT3R"F1^co3@M3'U@[_Cy5|ZMXSN^89JZS0nd:ufZ^!OIH)i8_œ$'cwRGQ'[l{+Lxۧ=oW[5/ +T Ma$1>l±;4Dٵ\OttTaXV'КVvXT0+렲Wf?-n΅l!o~?T=wav09BR>YK, Haj+jx!DD>_e 4C2w&aY k8'7SR@LCdLLfN6wT@=&y;q#N]gW0>F Rdʖ=ȡw@t-t=D +oiqҸqG#-Ad># #Lf"?iaprEg>Sbp ; &@YbS 1ai/FdJ`>H\VaZ8, ߠ#$:fg;|9˟C4,tEu3Y<!7CAvPv "2 *ϙk;5"H `F#r# oY }T+9v p<< o :2 =+:a8! QcLyg,0Nڒ埌ы])T!]4ٗ~ ,9ɩ7:Zǐ{ "xjA$^Z.@TYJZ*~lNNu9 X t's#N0߃ I@q@OəS TEђJ|BPihÄP Tg3ì6U/Stn '7\>M3w M- kPôf9 d5/1p&d9kSioF QOp k &(`b*lƮRɝ3qdxcϐ =P;)o*Ju6QˆL㓲0W k\Qؔ= [} n9n"yaIf?sG֨àZ>}%AU !UbAdsTJ*[NAwfYHp&1Н:MdE⎻3r55YouՓ-E(ߨSӅJW41. +e(TPaTfQuqt:$܈H|cפyJ(ɲ@Z51ٷ5 |wRY-sŗ&Mkp.~=և3*[3>-+T!oEN` +` :*byrGo8EoUg-wɬ7 ({i -Kƅk(\ g#ì3bFπ@FsO I0UFͥr{-xǠgشιݦ^=)~: =aၚTu;$ϒɪ#>o Dzݥ = n1v~M:( /2Vͦ0<lj>/*<@Ź _P+?0 {zF9}M/|ۥq>WK}=O{KJ2 +endstream +endobj +188 0 obj +<< +/F5 29 0 R +/F6 32 0 R +/F4 20 0 R +/F10 66 0 R +/F3 17 0 R +/F8 58 0 R +/F11 98 0 R +>> +endobj +186 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 188 0 R +>> +endobj +191 0 obj +<< +/Filter[/FlateDecode] +/Length 2596 +>> +stream +xڽYY~ϯPؠ#]Éa<A;0ш_:TԮF5XU]WJ +)Ww+_YGzڭɭnWNVoDHRVW^vJFhO[]=R: '\2~ׯ7&꺒B_~D(ZVtS'TklͲxuap7!fCu_ƇXX ];Wm͎څ}fnN]W#ծ꛾y}{\ndž gk].;ᅷm +[-䨸A( ܐ XաYfRe p`w#vھ 3ۿ^H11}l}\ogQj$d)1.s]l@IP =Qj;=u`]S=nz.!RBcP`ST#aи5  ]f^ KZ{=;I!ʓtsyu֏BT +m8v K^e;ӕ,o +˛kݟ: h ;}(c2cIƀSJO3J:)#n>ж< kcJjpJ9D]}*J#E`0OKtsS=ϑ-w./<^J$Fh>-haҘH6V[|ppQ'^;޷Q<v"iOM+z 9IZhCH3j2'˚,Ֆ})鑧pl 9m:IfOQU?-0 aDW>OVñz=7p0`@jPk]C|uC{=}G w^Ȑ (o[0 +", l v RC`1-1ٹb旾Ҥ0?8B s +6Āoc|[6otRQhU{L&BvɀV ]3}E~7"5=yGuzg=/VT!qgќ=`$۟Cls%ď感Tz_T"} v`VE,>Y2z=UiPNB5, ;0 ͢H!ao% Y)V[@-^+W hԟ=w7,3 cpޙN;#ՁPdM a 1=T +@∗>8oK#a.%,D[Ji55K)Dʑ0BA1QnY?myOygS:aB!Ǚ0 \(t32 +/ OxR7h&a@9Nӎ3l6rLZ s`!fr,$39&O]n&譻VJ<7?f"VBBsDƅ e* i+䐖?#0Cܦ8k8qgyZ11#ܴ礊m=ۮf$y2q\l+!$E ؎Nz@PZ`)a:WeRCJU7HtIJ>,-by.r*s6 I.t|Q)+H7fv8<- >Jgp0PI * @  ԁǁӰ)b P.1iͳ^Cᶉ GO=~3/P>_o? +r (~P5d##Gl +XÕ/8^NJjn qj"GlbUNP +|9}YQ%O*)1<Æ+,[np|j-<- &OZ30 ̹땒@8E:/ +8'EyM!QD:EeXJkX/2OYƹYҢgO%Ī~=@'e3#~5G)I2(:|bx^3 bk`nN﹁l%01/ yYˑPk })ż}P.7~> +endobj +190 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 192 0 R +>> +endobj +195 0 obj +<< +/Filter[/FlateDecode] +/Length 720 +>> +stream +xUKo0+|BԸ;hB(ݔl38ǢJ\̗g>,#$Ip/~eMNr <3Hj$lRo7$XoZ{G0B"gĈ;bFwkƄovrsET-€pA1j7Ijdd w]^`k)mM״IyڸC%BNng>G>K@MDK߼ĦF6#-><\%|n<1zCͬBs(1hABcڀРaOsd4 Y@ <#qB-7>f@:@@ m@pn2楦53Kf ,gJ,(7)xPP? N<!$;%snr s +!6HvfSM_ۧȡI&K80a^Vk 5L.Ϟ]DIم DX𥩊>Inwh~uXסW1eecL=IOU9\xz;xEγ)?Cl1;.Zm+~ ~C?:E?}:ˢie{21oj`<ہA1N82sAU{U$v-V +`3P<u˦⡚X_~Td_K8o +endstream +endobj +196 0 obj +<< +/F8 58 0 R +/F4 20 0 R +/F3 17 0 R +/F9 62 0 R +/F11 98 0 R +/F10 66 0 R +>> +endobj +194 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 196 0 R +>> +endobj +199 0 obj +<< +/Filter[/FlateDecode] +/Length 2037 +>> +stream +xڝY[6~ϯhEҴ $O9\V:RN'>0ݞnF9>U.fgҾ?_]7qT|f>M$7gyي~@8iN>IȦ{Xȳ~01+36[^Xl0~jbG " b6$tSRXDD!? U{CM(xE\Bw1E ip4Tmg +Z)٪1:`>V]!.1e;[Z;^m {!&G(W_e{Ԯ0_ɤ]£gE8\RVNq3q"q~}2 qBC~%ev C2?6A71IS#K~-A@l3Vj]87>f.ǣ~.:S$H!Ullv-cJ=vFI#XIR8 {*jwS23f%@򀉘4 >jN\>SB"U +tR+7kb(x1DVQ~ij /M&EBD{XlpQ"2}6dIA8m فN~2z& DBt_1cKvОS~ Y ]ԃM@S=@Y2̈́+ +hMh+aLUj*#rD U5:Sg8(ivzѭ +0{4rR2Gvy +̀s)7r_<-<\EQ uT;3]34s`ʴ 55P`tv$+1D;giy49FSTqGwz.dC1cUtiLbh5k3=`cE|=!%[ +޷Q8||ӻ :S .*@.MO&S"{1S@c}jn;vm\ُLC?"EJB}ѤEoHyùZ %'ߺj8PV6,LgڌM.--ꮑ o~@2u*ew-Ӌ> ɳyd30+z\ +endstream +endobj +200 0 obj +<< +/F5 29 0 R +/F4 20 0 R +/F6 32 0 R +/F10 66 0 R +/F7 51 0 R +/F3 17 0 R +>> +endobj +198 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 200 0 R +>> +endobj +203 0 obj +<< +/Length 9637 +/Filter/FlateDecode +/Name/Im4 +/Type/XObject +/Subtype/Form +/BBox[0 0 2384 3370] +/FormType 1 +/Matrix[1 0 0 1 0 0] +/Resources<< +/ProcSet[/PDF] +/ExtGState 204 0 R +>> +>> +stream +x}Ilo=\+ovui/u@Aj@{>S )~8mSN43aͼE 1kxi%b|:S,a.D +o{8Jseqm:kDK]:w&Ok0VgF;^:c7LĞ Ă;S6)S}/礃s_C@b6Pw#սa4f|VI@AhV7q8Ji/ZMԄJc"B9DṬB d(5N8OtEx^_}vDxkl___+W@l~ +r[1A C|A63'.4`$;X"^X :)}|0_,DܸKIi$l  LiQjbQAY^vf|m Ƥnx&!ʙ!{k16K1|]Zi#)(^F`Jl"C0m$\QƇTYLe+6)6c{'VY?dCp UMT1fTG|3a3i>{ =0I9z a+]0d=wxu4x +g!;ک4"j/YlRLc@ g<]2[O I6\촬y C$ i6I>O<I1yei90~nsnG tG 85%K`)Mfe_k1ycN=Eo;O]|NGRvbw5.1CⶱuQCR8ٷhhg5BOp`щnLbe?@ 3LWZZ=04B~2D?_h'SlX˄އt ]`Ϡ3&l>0\?a**׉p18|~ɱ#L3ǎ`ݶQH҇f@/,Tw>W_P"BcGp<±3L8vҦc]kïcP`j~ϊ#:`fǎ-;|;vScԱԱ1LSі;vLe yC], ܱc>;,m.S}rpǎ'<;Y<;^*_x^a]'0mt׎7 ﶻv|4rNJKN*o0H9Z fN_ dX&1wa%k4QH ./vzI? q{!HIB+Ol'xd `-ˆ4'&0Md fB(:Ҥ+h"WvXæ(.KlLۻĻv0{/ >@+49ַ="ˆ av(D@ä~Z6`%0ϰ$F'11iKi?8 @b?aWcPī./Ak}Lt&L^#"jVލD + P/?ep>l_8 sxl'ͮdSB4PuL77gA'@6S8-HCxP``G`=%v5"wGHdb uE!w8G1$:,`rsmZᔋb|ʙdWqb8̫ǑiqgHrNWy<*wj0sጾJ3ahP 3RĕxDKo)vy&nLhj mf;;F}gu ^b43kvWzL.E;cd^}gb;mBn@J&ߙ#|g ;|gwws5=kBr?ȻA(}g{$Yxw&^+;9ɮs^-QkdGʌ:Ɗt8Y5#FQ%hl`CgϘ",gpʍ-bJQg#/̫DR_JVdH I=\[kQ?1W5~|1?XwZy@->gwVZ|ŵ\)ξld-!`?J:8Kʬ<;fԲIQ dt59%}RcpCI~D:?Ud\!qD,1]H, c 2FPd"ϥ3xqֹ1 B*N<(#Jb9|gMAzh(`BBrRSv v]7%(C 8A1>I x Cd. G1\vPXg^au%9b rL#E jxP+0 +Kxe*@Z3Lt췴xOKHb*ojѰ 3cEԆ!.A-^A-f_=d9B#TRaLA-fa.u)E.Y> kyаdyԯ(&u~`Rc~D-ZBj"_0կtu^7F}k9 u~+S +و~E1Y:p0^Â]N5,x԰r:: |QJ6 ąXHٹ*˫X|h۾S?dCі\IsJ8z?EvI5F ψNHAqwD.*)]4 `6L}|#uThGE#h뢴?O~%Rw/̯!2wMv-~___+WB|6$gif8k@{.#פ~t<-$u {+`K M0| Xb +,o[< c-C4ǝ$Z3֡q'i@0%| gC2ˀ͊в4h)CAP{`WB,]Dl M/4F?}s|Sqe,56H1qIMLۄ4fJw³]d\)f/D*N &M3kXq9NZE=JTnm.rk\a kZ0$;Ceyrkjdh?)"tFʖ4z!dt7zEq6p.Gdp Sy74~cLLBS63]CYNC# I2Zmi$:X3ř-c,d[c3ԭ&+i 8ז >:CF=T$WwÖʡ@He<ߒnaQr%b(\1ઽ 6&w}?bBMn*YEt D +q7 ߕ`)qG= /ML9=gnP9(}:/WivaOFl6Fd~JtDK 8o1Skt5"oK℻!n;&4ZIهD3g7vX7g,"Oܜ''|,#4/ͯe\$et|x'gPyg/&TؤG3ybF<<)V|7)گaWݒ,E[GGv+d'AQo <^r!(%Q4r» аJ|̯xv>4RWJU8nt^x. oL#x` I;&ϖs?o,̯uk/5L{C&c\!X.#s)%]78N@̌cj>`T>niŅ6CCU1:nWk CTsB^1#{|''e8*7P +0:hS43i1{ÁRr"- +;Tr+fߎIb(?>1ٗ R]]B!rپ&Bqq,D#RGG1@"@"!M {(uX@5`f $;@"1)]VމI+BZcNTWac'έ߉"R;Q;Q0(#hF8*$oձ\RO;Q؉S^&ɚN`&/n,[pA@>:ݒ<k*#h؈נQ4 `Pj†kCd>iAC=z`~,yR* 1͚SzDeR`2jQDp&XM Wc#}Ci_$d8I79R䰗&&Ou$֬0n JbDe> cO\HqWp"`pV{S,MT9Xő>IQg@b7H}3?5}53l?Gxp)k +;;F֑;ŤGpR1)'DoTQq8e]>MG/_֙E*DRYJgxS'VS~%Zw >/?X_c~x%oG\Ѳ}psgu~}_\ ?C涖íฃcAڃgzNzDŽ3 +?19zpg+, zV0nzn9m>oIVYoǂj[#bcW`:4kp|H.\`]q)V{tˑz1ֻ'RlxݞʶKѤxו.&.rR,?XW]Ř ܕ[ DBe!UJVsK ފ= /{دbb?Z XP1A#"5Ǭ^1q;b`k@ł;&kChBo`Mmq+[xƯxQ +U&,OIXG}{X*R,sZX/\\2bb15B{-cOk E4/Vsp[K$J +򅄑7,Kh"՛QW9oxp-Zٛ# ^vqUXG7Lo5 +ާW=Ԝx&l+.{{Q|myg+0"o |MD3r*HΛy "F8y䦽Жc-`(Oz + +LԿ]~աzno]4"#:9&yWOg$F,x(Ãp\O7H:QV'VuR%ZƩSJ'&o,/~j7q=O\i7[ + J#UpX|8 +ۍ8W(7*I]H)F;Wekle D1-Ӿ6ND/Ro<ӏ;Jƾ,<  y]@fp.T7޹l2l08D66͊joUtn2$ZcD˃"XŋVl2"V[*RvI}ooz1Pc\Uw"Chg9 (OY:*x$0Mp7J/?j +D^5Qv\l(0FhF7 EfIJoUFDL2y52"#UFK:הQۇ2E..R0T!TqW*^_| k{&p\Ŀh|4/OM>D$Ww'.`ͤ ۬HtE$fOɒOVDLvEۏbwzB+Tդw'yî#AUDrpZRE_xC㤢dyNRE'pUĜUUJ|IU~u&0Mi&fuM#4`|[P|vD<B{EdM5 *zs$)[1yVrwlj+BG@=wgCKApӂi?BXJ)&nU,yMѲwxjsF_\9yWVѧ$yWHSDfV 6[L$ +rhǨx +OidI>Rlc2=]1J#=FWWPKg2\sh06%Xr~h_BLzmT.0]T;G> +endobj +205 0 obj +<< +/Type/ExtGState +/Name/R4 +/TR/Identity +>> +endobj +206 0 obj +<< +/Filter[/FlateDecode] +/Length 1897 +>> +stream +xڵXKs6WVjƂI%fv&M:Im3$V| U.)R$X,} 9ψ1GV3>:op㾽<W&T[Fi-BPMʁhmU6L06Lf(Fk^M'DB fjYSׄU +%^@P,Qҵz(5I?+z2c>`(^rr$[z&;͖K6LC + +HA߱ *aoM#TA͊O qeCD%‹ x;]^`|Aa\^Ful'{4$Q}CHZF|[]/VzRm6YU% "}~{[@Ge mo"v* 趞P:wɈ:uw?+jPc:18J+(~7SX xMt4-':RD{3YdE>vgOuM!k3W9ARD(oj^%;ud*udL`/m BEr2 +Nl[lap 3.nrfzTEp,qpH^0 :lEvuM-z z>T)=U5& L={RC+.J.H AØ$@8ͷEa96 +d^LI! l!em}j B_.!t`ǹD$M=[tN^mLqhv<3BjlqO4X>d"nqv5?INVj; +(3ep8Air$m5(u$=>].ڎglkV qcK 9 @V)uJ}GlsT͖[7w.vf=2@Y-zp*H"E9Ì_`Qds + W#/qbtpBݽzINHMgZ#?:+5*je@D;? 0+KqlN$[lpW2}hJRXGq/ 1^%U>Nƍ*$CL2&v;D5"qK#I:7k o013?"2]A&sw͝tS\n0nKE) G(s87eM=϶Ȱe!Ӱ$m|pGrWFLyWÿ́)Se*UO4BkmÏ +x @DueX9uۡ=ܪ#ƴ4ɚJg׬5m|D}^po ܀3)?ϵ-ۖr8(V=4F#2 _JzԀaUcggǚXta11yeKKV`{ˌ0lccFeAY @`05ǧ1@;.R³& #=YInDNl0be3-E *Cx +珿/|zKR![A|RT +endstream +endobj +207 0 obj +<< +/F6 32 0 R +/F4 20 0 R +/F7 51 0 R +/F3 17 0 R +/F10 66 0 R +/F5 29 0 R +>> +endobj +208 0 obj +<< +/Im4 203 0 R +>> +endobj +202 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 207 0 R +/XObject 208 0 R +>> +endobj +213 0 obj +<< +/Encoding 7 0 R +/Type/Font +/Subtype/Type1 +/Name/F12 +/FontDescriptor 212 0 R +/BaseFont/GNGQEI+CMSL10 +/FirstChar 33 +/LastChar 196 +/Widths[277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 +500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 +750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 +680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 +277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 +500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4 500 1000 500 +500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 625 833.3 +777.8 694.4 666.7 750 722.2 777.8 722.2 777.8 0 0 722.2 583.3 555.6 555.6 833.3 833.3 +277.8 305.6 500 500 500 500 500 808.6 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 +277.8 500] +>> +endobj +214 0 obj +<< +/Length 12113 +/Filter/FlateDecode +/Name/Im5 +/Type/XObject +/Subtype/Form +/BBox[0 0 2384 3370] +/FormType 1 +/Matrix[1 0 0 1 0 0] +/Resources<< +/ProcSet[/PDF] +/ExtGState 215 0 R +>> +>> +stream +x}[d;"GzKð{ U?<}s->F2$(RyzV-_w߿__UN߯ql5WN%ט+y~kׯ:c%kGG>8嫕~ L=2}K0jbz-y2ܑ~u^*y#:_}Okq;py1Rd*#h`%*Si8$Df{/|fӫLr:ٳ$WUkM-Csdҫ >/a[I_s}EMtl[2F~6ϯvDҤ7Z;m` -`{/:F9Ҡ=˄~^E.,.L[mvcC]9U/MJ',Pe*e!W_ԭ݆.TW!DA]va9ab(./7_}uۜ>7ENUI?C Adw])hWE o*5EXkQ;Ly +(C+ +6z>S):&GuhAW)sQP%(}R,P^׉*Xp=9\,l:>EL,oA*4a&O@-kliˮP#^0pkS\oP`Cd1*P:FbDbrkq@JgNN1ָjfJ^abZAHG=u[456ilEia Gtdoqd+6Q/~*>O[YixڷRM7nhaQz{':CнCNVҝH_>\ 8A=m'ްMܵcyFƇ"8D8/4~|';)XKK?[㡫6Mt.Ή9Wށj&cS"`a_NFF^HT7t N[>8;ibh8ƀSc 6B(>IF)ᒥE9|.Fh7 '1GZWn\;<{ˌYlǖ2z҆II$2Dh$ޘ"b bGh nWhI-:>eBZ&e`,,1" *, *mn1-?g/؈#GW0NgPLE-mWZ~e[b˃0-\9}"FYY+=DZbVZ>VGvFnYe 4< 3<#Tgĕ%\p+]R[ +F`)[XYF+3 + R|-Qq0TL޹gw+LLS}o Cs#İ42y\l,A3kb]Ddѯoe [ +-ϔ[+iOYl'|',#~?b<0V0Y:#˃eZlT#"#κ±9/WwЕe`B!ՅZ$}##h["Sl8.20Q^ˏWXC~Y`\&B򈍁pc0.U#{] +fR`=ʆ,{bRL#.R7qBKDW] +^}]eb<6\K+Ĕ.IuhR`\{.O`Dt)_ѥ`#V.]#LأhtkDGD|c.)LBӮ[Ėw6ؒ>5b:-?-`^R1-KJ\R:_%V KJgԈ)2ZFt)pQRy7"-K#Boي{Ǥ#?Ϲˆ*BWlE¹75R)„ czMѿ7]nVw,Z/8T(rõ㮿 O]Ĩ=cDD|NObLxҏtCVPf$WKs런1?z0?߉0?h,;L.v9 + CফO!2d-1_pYR)awcuTpK3Jj7Zp7s'c? ǁ_x*O؝Ĩy޿JNs#o H_rzs˘q/_0"ο['_Ɛ9O +C;F`4s9lߗ/ACIRwϹY:BW}0ޮzcr1⑾}CoP OwZ7L8q_5:;2ˣzW5,8`v7Dj18zvW^NQ[;?bT)tXfܘ*5]&1\)b2쾇.zpxuu$/ګL9.IE\ˏ6L}NϏQ::M  = _v> 33})I])Ɉ %QM{.;\~9!qkcblS<v3C ق6rI#=~Ȇ}xGC6yb_ԗS>VǪOz +ctTVӯSqL7KJ{UQN Z8?WTp=3 bz6Oϸ!+q~k!^8q¢I-NcKt +?{!Tԃ+yYܡXnn\Ŝw! 8I --.t4t=K>X J\@y Kgd8BB@VRo}FΈb6o`]g1Vȿ`%Rdo-fP7E+o2LrXMI`e_YHÝ(П2I$Tҥ*=a]Q/f4>pcRƣ)4bBLFLܥm H $$pq;h1cs 눅-{1qiM66k*L)(He2Ɩ^[snJ*]*({>S̹aA4DVՊ"1.+q6.갖HLm~OtD/D&N\*,j>Ky4uy)*~d7L?~GPʸÆ#~2Ґe*Mg 0~RS11\g}2n"/S` n 7pj]zٹbSN`QeTY +C#ah9\_b,H[V8K*k 2`dk ; H)۸;ݕ(7q.:`,e[c $ ކJYUSb:uz݂*PDXU_bzwڕ k`2)*ćNN9(a50y_kaD5ޚ3YWF;&퀀H~/s Oj5)E3abW$q .!?PVE]MU(tftq ZC Mo* (̭^pmCqr#{z9ag'5<^.ٹ84~nJ H'-x2* Q p;RD0jezŔ-}Napp0ZSlCѳw+J ZwJE9كXB\cDUU+kZbQ4*omɓg\1У.P4G;C_2c%|̞3ћ|xpFʰ6˞B{^_"#^43D`qJ^*wi+´%7U}HĬT0G޵Nˇ0vS*--"e\ImI1FRM`Im {R[b4-z6"rڜis}b>iDN[`"M隰za+B^DN 㵭紑t{bsXN[`9m1FA%96E}uUL]qR }'UF=Jj5}"іg2К$YF[eS28=fDB4F={LBeU69Ǖ&C*ҦF=-1i|΢cHh3=MW¸]&EV>^1vJ -R~؏ۖ+B/,-&$m k+YWJ[Q+%$* ~`(yT\ 㹡q\VJ3mڢFbqT5c+Dك=1(O$bz6qh|% $AĶ=-0{DbGJl# 6JdWf̳UH|ao&,|ƕ&/MږJmJh\wb梹m,ۦYWn3T{dbqf IyE}Yu9L],A"+coӕRϙ"\Q- +DE|iw5L?!pF4[[09Ǝ4W|֓傥B| Gp .#K=CK>BK."K#,?&'1Y:&58\(l%G#]|:%IY.}eY:#K#K##K#KCKFFs'7>m4\i$lF`qLeZ_e[:c˅&$^-ײl -DOV +Zl/f]%wx[e}Xle[bef%zglĊg"'uzb;du㶻qJdeMar?zb~:Y"z +%BedΣ1bD8r~cԟr:<ĸ4Y""KJ">-f~4] ܕ' +szc +^TDl鈫oqQ0[̢G u^76, Vqfv|+tL5nNofXLruWnd+ J\[Y-nCZ2 61&J?0Ɣ;bm~\BCrKh8mY.{q1[մ$'=Q[%&Z߫cNoMP׿cU+okKh(Z> M׿!tC/oflw א3\BCՓZz]ĸe>GK].t,@|y]dD:/z9(4~6?aw?۷,.ϟW8Z R{xk%* +jz ǟ)Y+)w6 +~ +k%P#kbȉsY-"~sWKV鯌_rXDTKhCMWKhOzZBCAj %}NVKhn_csMql py t?Z«%F_kuj {Dh >4Y-AKۨ@ZVK u]QF/ "O gqj GTKhH{ZB+]Z-!^-2_Y-~yZ Z Z op{WkjּVvV[ciVB`V0VqJ OJ ̂JŸk%pc_YKl͛b fKh?XB,($Qdh +&=cZwP<07~_oȬZwLz$Nw,o3Mu)V=BD sl_is=_}b,>a4\3G *0Q1Aނ \׊ sYfńxpfxt"/Z%?IЇ#۬PQ ̨ pˋnU z z wKX+DZKXVS<f{l>r `Q.|lY/7: |ax "^B^/!0V/W~|$94M]0A0]߹Kh!-{K~/Ӓ4eɣKS^B]^Bb^`{_<5qHZ \oxSsl؄O?Ts1{{[އ3 @4En~!xS>U*9;k%dVB`V{X+j%pvJωZ !ڋ+/kGU5j%?RV|WCWbƎZ Z *X^(@v_pEUsK`0P*%n9+ {uto>Q*A@R ծQ)-_5v߯3)}QV) >*%bMUJxꦯ7J уUJ!RBaH >>B`OQ(i϶ TB RXQ)xU)f4&3g7L*lZ%?Kwh pW^)A0b0 aN*%h-ݼMz:K*NVJ ]&0Lr8:WOJ >Vg~ca,lD+l cvFֻP`RZ(APޙϷmmkCC`ocxW߲P̉B _%*%TrVJ8*%`Iԟ0fo u>g%cyPWURs̝4$PY-+%|h*%w%"+%ۇiBU}+*J ~RBůFPB3*%0UJV)!J AVJ +omIvqsWӾ+%TTVJ-A=X#V jax]I^XPa T ydS c焏r*Jer]4gUg 2|~tAiϛG9*_[3HoNBzx9Jech߄*Y*'TB^*1CK +1TY*YW]{1foe<on7VEyÎMoWsz^_yTObpՔ!xu9l裲p(0\#U=.EdUë5GVS7䘂 +Bj x,@FIX6E8M pTܹHNN-ϩcZc~M*p|嘂A 1M@DhuA(~ ¯ b:Yg11/"NoJiy1 L}T l,X}`$&:Fwb~똫_\j!r&[+IjI0H0ԺROXUXu&^γP?xŬ(dj=&L P6V-D2m__TDV` KKr +ơ$I|hEA\5 }4_,Ոݦ! iMBi0df[Vx!(3A}i,l.K&p( _18L&*X~cݘAUXйM 'hf:ÜY_0ל7 ˘; +sUDg8KX8t ^>2[̩u1 +n-<倇ŬQhm'e~;!@mp|3&ۊY'^-%HFqe 0"/xYC0c@2;t6yJJ K?HE#!Uo N5Tq}v9s %TlqY +ni-$R|B]Z(N뵦U+lāQ%R!h.r `TqNj&"Pe-]ևqe֯>]*3'0an?mq;,rq?89ڠ%kY&T`xTvO  i#1VM"SL0ظ%tF \Tm%,| pâ]7;.*^fHua1{y3}u >) -%MlEGCG]tt 3u_qI MA֎Juir-ȥIB!ZD.[pJRJ\5{XI:k!;AY2}øv/E W @ϵ9[bąN 1Q*?z= sEGF]O"01?!o_ 2 +Fa]M, /?%0UfܵYT (tI]p7nX79|M0zvr(r +}rI,7MK|ja|?7]/"T̉4abC0F G1. ,.A +endstream +endobj +215 0 obj +<< +/R4 216 0 R +>> +endobj +216 0 obj +<< +/Type/ExtGState +/Name/R4 +/TR/Identity +>> +endobj +217 0 obj +<< +/Filter[/FlateDecode] +/Length 2550 +>> +stream +xMw_B7Л7nS(]YrHyw]   +Vm Be_O7g2̛fˬ̎dVe7 #fs6q_h-3>]x]ّ2o~״4X5;-vq@$v?̛̜z_|"[H#_P4ϛLJB-`<+*bBh0#Ƈ"1!. +5 | ?]`}]-b7P:T`V =cRgG3@妾VѶݾ{دDawe<͜Yg6{<{T #-i-;YEηʃ@#Ы~*7(W#"h2ImǸ|'-.AH2%ڇ* J^f)Ȇxʃnꢋ|Q6M&`@Vw3o} ގe ڣ'QpCW%.ID6%ufq]5qQ\mhnAlyHG"j0CP7ov>^1Inn} 7B(PsPv݈jPǞ`?2eFa"8a7gKi]K߬!*A][% ]7y PN}~=> .l-qz/V-Ml "\ˊM< r^\ENr οW@װe[GԠ^[θ)b03 + oJHQ.dwMM}z|"H*c$&NntSw<;(s!a n [0ѷu~á/8)4Zi~qzuy~q3;n'@}iRh%Tbf|B-Fj-2 !> ݻjEn4.AU,vhXji\އ ln5aw:5xtĆiz-Z1##~Ȳ +2|pb'vjI# +xTX83NvP @b}m.@ yB8$ٟ!NE}ت*z +N:=%A>Y +TO~F6,G1` +TcV¿IC(e1`873/sr%Y$ +,^BHV1/!WCT>u1qqt;|n2P@c YRhAƇQCJ-hQ c$Q%lڸF#YY&8: g#~3Yt&7q&0z&8F[| 9K@uJw%+IJrJHWޔ+A$(Vyĕ\I6\Wĕl(׌/̻2:POwKg;^6By )d#/d3L9@ńLrxN5"Լ?{@ѢljmvfNά}E -D F;mN!]_w + +Cb ]\Pu/,a8yq+]h5&:rPWːK^ttP"(w*92LHvdbL+< {; ~ġ_pTcvH(F@Д NcX>!.7q(7\Xj +m(sRÄ8${@BC)ʹj) ^PA3ℰ)p hr +p]jqBPf9f DeS! +2|HIF@R%@ΐ%/EKSfҔ4%/EKS +(n/$!a\w) U Ⱥd, +ի V_ ~Az 6p.vz{b]/t5KWW㼬{R(H/t~ݧ_4\ ^v7~O +YA T1;kqNNCQ#D$%nPqa\zx};&?(]O#A Hb1)J-QΫB3%Qԓ +>(`]a `óu`CGǟl0\횏-MЫIS}_rOlpsczYR*aG~M?} @;NoE(o4!@53A*I _sw +endstream +endobj +218 0 obj +<< +/F3 17 0 R +/F4 20 0 R +/F12 213 0 R +/F10 66 0 R +/F7 51 0 R +/F8 58 0 R +/F6 32 0 R +>> +endobj +219 0 obj +<< +/Im5 214 0 R +>> +endobj +210 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 218 0 R +/XObject 219 0 R +>> +endobj +222 0 obj +<< +/Filter[/FlateDecode] +/Length 2754 +>> +stream +xڵْ=_8]&91cWʱ$G9,Wi_R<`IH0 9 ()r^=WOߍȋb WY,[x^,s+R/n^#W˕t*;m̓fOdXbaaPm5rV}X2Cl8ḱcqO;x_?.yEX AL˕&+c xAUt2C~TpVEJxQ/Qش͈'&L[vD+@VʸlYاY5ϝM*^ dp5+(P.cIxvնsǦ7DlekJSӞ9< t|W dX· Yw`R֩d &a A"nG$ t2E7c` f5i oKpdž.}&UayUn-X0_MzƞnWஂn>.vT=VkޫӽR[+z}}f}%1 MݷO/ ZV8d<ռn7X̅y+S[rU|vGY=4^W!,z_y!wK]82Hpّ9BXYn 7׸mz iV2Ą>!pæo[d0~κ5 ]Dl.XQٖ %KA› ɛzhj } ]> 6nH *wWIuܵ׿Tfw l~WF\z(r0@B_d=we.ʰ. ="P[ F5=7B&?{Gt",k8mW:2lqVj=,dUXS&kXz xg-=b>O>b#c5c;`:T>RD‰3(W6܁K`LQЁ^e'|܊tJrSK'0@~;!B Q2Qx`1R;tW&YOXw Z#cc=cO( GyZL͝~5-Qnag0*$Lz`լ5c#cc=cO|dl o \>˧AclLvWb#d,̐+("4wA.Q& C &MUEGQ_GQQTid'LY6܁ݩk(\/^@o o0QAѣ.v (-]+%JqG,Jgexܯ{!ĸ~r*$]Jܰz6&͎:=Qv[qf2)%dW力H ӳTvZBɕ2:Ap ͝v.x ֱjyjy ؆>?UW-ը4<{`m¦PqIS+d FRATXqWy8U@oψQXiHa Eb0o L+G}Hw73K66/L*w|;(*TFOKN$$:h9[va6qvw=#rS 6svmOmJG*C>t@g;_&`#j4klaK7qVS,3ls*UZP5 *t9Ijөt +DXWK]("h}%#ԉH=¸Dm2w" z&3V1X3mʖ~f9K}>V=Ir)g +OCbslp5bLNnsNCkׁZ]lF\β"Vn+)SM&]"thv^Nxg~GJwK:/Wrvd3NZ="W:V_nQ}OP8|K` '߂n ,VEkƺfK&>"P^+g%"[xv*&z}[ +|~`-q21c#-~YYO=U 6,ڂD_LB -ip5g=4d ,oM +Jq0l%̮tq/g CI3q~Ns$*=Dy8vSsH~{ϒpV^->_/ʾßW;BN?"!R`ITBwH=}<@埝J@{2 +>Ibث%`@QKQ(ЌU(u@j.EQ(!d^Ob6qJ3Qi';Q\ޠ@oY8n$|wh8MN (\SPr/QrP΢b,6A|$(9/e0 >P/RM΍h +endstream +endobj +223 0 obj +<< +/F4 20 0 R +/F6 32 0 R +/F8 58 0 R +/F3 17 0 R +/F11 98 0 R +/F10 66 0 R +/F9 62 0 R +>> +endobj +221 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 223 0 R +>> +endobj +226 0 obj +<< +/Filter[/FlateDecode] +/Length 2833 +>> +stream +xZݏ۸_>U>[lrfAkkm5 e,KV#!g83\b 3CÓܿ/矾~S(Dp뻅. ›ɤ^W?EHC0:+BVy"JidURe ge$ߊc_/HfCV3 hj`5nE^%B@K=R$:+o *MO*7ee-Yե~VzfTB&%~^lWEb-kbBef-Y!99.W!.&s/|nujf/(q;`Vpб/<|Oϊkzt-w.rCKX*?^C.0 Rh8,T.qcxJ\kGy5KrVˤ9Ki2d.C6h\ K?ÅXEnb=9=%\T踯gOp +װ]ҜpDMcޥ5Sz <of!NQntE# NuzD3M*Ir\̐qZh4dK]!$G&LgaW7ǻKmW +_j-uvwlC62s qײ}ܡopLj=u!6uaco=Ժ9yn~_W$ge]Չ{Y=rC@KE]qaE+v]jo_l?P +8J’ylـU`= +^lEc + l8_8[luvmwd3xAkl=i94(aq6jƹ 3; WǽC3[Vlʮzm.Gu`! :vQ"yX|\jޑ!l mC}DiAƮ"N@ +JKgfT.n[|}$oġpi +i=5B2p5~l"KSʷ]SpЇǮkɜ#`:Tv{;>DS]Е䔼muw^'$h"vc͓x5*3˔2Ҫ̱28@1UNʛl𶁘#wsjŌWܢ;n܂YµNmb&6AOzo }=fDo}9R|@{t#(˶n1zڻA!W:Htwq2 G(kX &C)4h+ ɣyX0WTId crbPA%Ji- ܚ q5apunj~X˝@̮p ϩj6xY*-Ks v=p='[~$[[ L9B>.9 W?}.] Bx!5@֓~Z|"K G +m9ndJ]OrIU3e|V- N+B~07-Ss4ISkQX l%-pYµh  m,2X?s 4.~1PM;L۔΃Ej!wT0D.N4ȝ.cϢF +ΤfWD KqO¦:@9dDo8iȵ}O,$ }Gp f=Aerp+) 8 ܵ02Rh\QLxDT_3vJ6Cΐ'x2zT}‹‰dNli/$#+UG7~$tr`EM"3X-5 9NQ88N5TI@1} ^23-q:X#!|郿a + G 7G c^r)MX +zBDME4"ЖSrK1=f:=yd@7`w00 ^%l`?R}1ſiP8B~Cz\Z|<[H!~9CWvp9%RAZQJj H,>#EфaE(~/C/ #8B=aUn"ZK#ˮ.E#P`qZ藦Yych[^7u+rK߭reL1/tbჀ !u'2ܿ't`fpkp U!ͦn+}}ە+zXK \n#.7oLq=b(y mxj "Trw>otg?p| +endstream +endobj +227 0 obj +<< +/F8 58 0 R +/F4 20 0 R +/F3 17 0 R +/F9 62 0 R +/F11 98 0 R +/F6 32 0 R +/F10 66 0 R +/F5 29 0 R +>> +endobj +225 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 227 0 R +>> +endobj +230 0 obj +<< +/Filter[/FlateDecode] +/Length 2210 +>> +stream +xڭXI Wͪ.VJql$/oy9s`I.UbYKw*>($EVQE5?s|bܝjuçlUZ=VyjҰV?=M%AuR{=pFsכHǽp: $ePO!èG:fiPv E`~ v]Äpl m6[Ohc/{4 !lI3zze0Sj-TEXMc)QŶaUuiLyB9MÂv4N82yg$Wg3fgzՆ0zR+y)޶at8 UԻ_8NYbo׳>T47k?|aj-QFն[RbvU~Aw|Љ9U`;?as^8ShC$9!0ѶOR!{OkT'5I2M1k,FYl:k2 \+\L>)$T5&Bp(+^Fp)UnAc^mjY sn ȶxxeOBtt |-`fE%plKfE1 `; uIC4:A<4~A) wu%-Q@9K'gg{VR#}ӈmAx/玽!pA`q$mtd~Ѱk8VB +2IN`xS  -0xo*@$( PapAW- n V'¯!c:zĎ77nj7U>80-xԅy`ړ?;nzG5q/@}EO5rߠqŮyϣ)qu'b$fdy;#{̰ 8; gZm%g@seTI;Mۡfڰf >aN.k^^;HQ.0Nq[qB Y͟f$RN7҄Y +1BAi@%d1g[EApf]gx{8P\A.yG\NnmyB _CñY Қ;J-eTj#( $fM u{:&*O.vHw2y^ԙ7dxr :=Ԗ{Tmx]@Fc" 8fnX +T9b4%Yօw5;YbDvgF ̡K-4'ԊP{K΃8BE潁=I'g~Br*ŧN=Ld7*|+Ma^x`ɴcei[:jB?|k24*L8_-lOל匘jrLe{T0 i +L^eAg+%rˍuqb*.'RLdR05B -- +ߤPjn$xp**ϫ1:QCmW|z`XLIY9!#vaH-@QT(rnCaݼ~+(if%/lߞB]$.O?&(I +̤ȒiCL0bK{,@wE..uR\GV1yD`|GPNp^vMcZ +yN6d#)Pz:ZߒLI)V"(M9p}<) +9`5ÞZp~OD %CyE9o^c(;u [ $BoAUTaV̢.] +endstream +endobj +231 0 obj +<< +/F4 20 0 R +/F3 17 0 R +/F6 32 0 R +/F10 66 0 R +>> +endobj +229 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 231 0 R +>> +endobj +234 0 obj +<< +/Filter[/FlateDecode] +/Length 2977 +>> +stream +xڭZKsܸW͔KCѮRJjUrsf8#rBrV (R6h4F 6QE>'?VlOwntswؤT +uwtɲ0-|/u*2PLzoPcL]%YӬ呱o\%yP}= +e+*OL~n"d5m l6 ݉$$QX7 `쟤kbvdEJ*Xk`(jU7u;-?TeС +5mjh]TߐB͋>o[`=|(0N=MLp+& BG0vT;\T)14؀ʩp X 88^KhA5ϫEbU&ÚxnX]X-adߵ,`>YlObb (3˺efBKUGVbAÚo!>^ú]TH-3ka51-fI]di_;`܀dQ0b# &vW@"}D2tH#c/|S\"ľQM |weˁ)^'1sagg]<[KbZn%:v`0ʙ[z-Y&9I߅sY<'",mhD3ӷaðF<M#HM1 +Y&ettrbҺk E" ی౬LqD!4@HH;awIu0 +sWS,""ױcMaI#Č#9HO9ߛYWi )&35[p  &d]RR׏R(_&6TB-LXr#A<: ~S 2y^@L@{M~ V{*r*(XDX߲yDJ N:mae,J<rUZRiSl$#)h RRT(@DQ.2) +ھuN5EiϪ=ir+ `8JBI&,&"EGIK+=*=Џ$)Xiaa5]CǠrUaGBT<,^fdo@jGMn ,r;2Qj @CǴ3fHsB/sB" \CJ96]zwyX} l&oDE0<PWD&69VnEoG9$޻fPg 9PW,&ʻ^вenL<4c\+Qj%I/DvP +hɤA[7_3X֬> h,{7{L2-D0H4ԡcU!0m\o7& 3,T 7/@u||18G&\~!XWOQqO7o.iK};pOQQx[{_>đ;hS1Ih2efY1BEe/bzپ&.0g*p4ݱIk<<޶PF5˩.(=O aPZ ;YO'74đ$ !AunЦ*xduP%T98AaQLݥA|Js&>Jpg +NxD]~ 8Z!X2ݿ!`^61B]\vÂ)/piW*^}EOd^)J M[CM5An"g5v5mڔO)lH}wIt8kN%iJQJ(z.lk*%ց2{gC%3q9GãR'Zv_)ȰEE3 8a{NL'Ƅ(}OsRL@J>% SSO?/(QfҚ0I]]mxFr9 F̉dIEn,y޴n:ٲ/n ߟ=}^x͊P~YaVGo,G꣙#AhBK0d)4mJMVigv.{~$ì3+G."?<{9Ī4fR' w'rnD6K;uJ|U[+O$x3%UpeB;|W䞍&>}0VY3篔(BS"S+yI:wPpPBa[*_dU2B819fF>&sKM|t, + r}"C{SՂ? +9!_}(8A\O/ܱ {(\d ɫT @F q)?wȝMIVg J[NlG<رo(L +.]5 K3{e8_?{^(o L<>ǏzÙMuʹ:8/ݬy-L&>feNs^Tg^t?O"U}xc)[7>p/ߛ& |٦{+W?_fq +endstream +endobj +235 0 obj +<< +/F4 20 0 R +/F6 32 0 R +/F10 66 0 R +>> +endobj +233 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 235 0 R +>> +endobj +238 0 obj +<< +/Filter[/FlateDecode] +/Length 1663 +>> +stream +xXK6W9%Jm(zޚ +%C,;!)jmhpF/"}UH(!]33#?7֗)UVeX8%e:Фu SߚXctld*rόM7ӛ?BS\ϭ?dLz H|NZot`\H}-" W!Ir).dV(r\gyum12%Ԓ +]\Իi[zC}?=y=/C/ }2PBbe%mm;^vNqEm9<(-s3Q0d)JR$AJir0Ľt*ShcMhiǡnً9]?-eV=5fh-Hyi.f]UAߧ#Rj' :M}"!{hճec.SǛe l6 <\q.c;{ӸǍ5EŇ\O \躳3O従U vUV4b@b0m=!+) +/E{%"<7Gܺs +qOgBmV~.j 0Bg>3+w@(kgio!;jQ@t[ >4$Z bH'YDe:ؗv)K9Q"^@\p a!J`!Da20(We8IrvL&3KI B/k iz|D+=[@Dk@JXÇ+=E045ys Oð r (x3#@!2Jǀԡ`1nT(ӋALP)y ޖ݁}h(7$F.nePWԘ[D7|rE^'#%- X"R_G`:{sFC4먀BU\rsp> C? < +endstream +endobj +239 0 obj +<< +/F6 32 0 R +/F4 20 0 R +/F10 66 0 R +>> +endobj +237 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 239 0 R +>> +endobj +242 0 obj +<< +/Filter[/FlateDecode] +/Length 3285 +>> +stream +xڽZKsW͔KAĻ)'q6*@i( k9CX~g8wh4M,Rٜj7ϛ\EMZjm>|)W\Υts*޺MVnal7Ny{wucJXf۫*O#tr+NyQtAͬtg]\.ˊy-7alXJ6h>Z\YykO%}u͖~чߟص;hwP/#|3W7䇉>(V8.- Ƭ/Q+l=]Ϩ)\@Nidt*-+<4?ђpe!',ny?v"*4AQp4*,.8vΛF{Z%?_W 8#]&\hBGO NmXY13h'y* +t=9dԅ3˂)Hԕg"c>9#6(͟z ,!fKX lJWR^`\ ?Y+%$X"kr>2.#,Z\6";C`)A$WD mCܵ7Le&'c Fݍ]lZHg6+@I"K~ځ/jac# Uq̾qdWlK`0;ij36sێ؈= v2'$mvom=5Q?>]C]M 'y'vkk,=JyyjϻV$su4pp*-5L l㌧!M{qp+RFNg  H40B,V TYB+ąP#74Iag Zk#M-!yiW²HB]q%KBI$ԏlm+e2|)̜5Buf[:,ge+9r| (Ԥv+Q44V $䢜|Ԗ`ob뱙x.|ΡFF >uײ/XJtd] M 21 yn{AAƫ[Nk֥+V)RbmJm)vь팲[V>N7߽l/sÐd6j0s(_) .抎J? Vϥn }!KN1u'&GugH8\!dz3,ʅflS v-: +eΓoI<2pl掶J^9⹎֜_Ň{a3#ګ LA䕎+sa^|hCkN4[Ȗ~B`@!f)K^=l/& +ɜ4fߌLk[0I' p&OR>@4W=X,y:cZ$- +DùBq?S pFv8:iʉA2f, Ie!ΊW*x#Kim nbyU}?V5~$7LAŰAhǾ2A6"2>XC.s%1zV\.?Xn,đG$þ 02NCov߈l^RQ[5 698 SkٹrCKR+A*@F%`Su\ +ZbwLF0!fV JT±mj?F~6f8&KO<i9Fw]=O }Ű +=@<48ۏ(Cݫ7gMLxT|F;H} l5z. 5J, + ރq:pxX<GώgA3DZ?m$tZ~ptl!}vsrsǧb1do,r9(PJ(BaTIF8%6ݹ:ς_ - x~nU|,QIna_ J'c.CYLD浐$!$#aѠrg;?(Gl^HrJ-w ˮGCR'toӮI"lxnb4um,UClCZzL-Vc5\ZyoEt( M. ˹h ο: +,@ +䎮[wGJR|O8RLG x+8J.DwA]2&H=&|O4Bc i5on6q#PoLTPr'%U{Hp88.Ie,V4k0be;vywrٳ]wތ#4q+l.surI +;]uw*7cI/Va߫軑#i_g[m`bF*^УfM Amh([2S,Xk7Y耭 Pwˤڨ%\_'ť; Šߧ[3o +endstream +endobj +243 0 obj +<< +/F6 32 0 R +/F4 20 0 R +/F10 66 0 R +>> +endobj +241 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 243 0 R +>> +endobj +246 0 obj +<< +/Filter[/FlateDecode] +/Length 2325 +>> +stream +xYo_Gy护(@@a $oM[R ɛKEіP}8p8 (I=F ?<--.Kdm6Z":FŒ!^. \Y&.GTHݧYd͢]$֙DwGZ:lǪcʚlmzR}iPGŧj{ZяwNTQO8r^t/&k\h2d$`3)F2V,Z穰d} 6HMI1W[^Z)'|^eɩ;ÁWj38n~6*'- \O +>WkզW&Gyj m;\_buq :gHQNw}+{O5pߡ_:B /oOMUma?2 NXE\vCup2\ A5cC\BdQ6$֑Q\A Yk ë(7]X&e^ŴDc}|P#+$㴔 +Zh=LA,BO N [j'pHupEN|DH g) NEQUXv~^# y,PqC#iȋ3iU_7C +dK" Pl &J;TОڳF ,#,|'uB&-̃pj ad +́ M4s^]j<ӴJe7kJ*EȍOpx.EkCW~Ă^!>0Ci!C3>> 9 h,+p $ !7~U'ljP1a,{YrVB$Dw}x*MW?p1cncyXox&]^yQQ&yr')87PMhkiy]JY*qEB\cAɲ@@#TȆ\;@I\VZl~~.~!Ŏd ַ#̸6))y8ʏXeX|HBb!ڗQ1oQs lG;ȤlE\0T!E `;[#؍p#R8{d{5CIb?,#ȧr3<\ +PYeqǂW*xqCV ` SPՠzĂf=4dlXv 08Q0Ԉ!3nA\%m;"Uz2ȣH[@iy:䷕&TrTė`ju`L, +@EꮚE{jFGQ2>VԧXB["'LNQ0ʷsXo_Ӌ3;$[[oX=8|GЛ Kpbh_^v)$0G&יɑOhD[M7@IE.{F@=<I:.3WL^5FdrHZ0=mFNs?q7;5AP{3}c<&O1(Vi[ +pQ>]rbG:5uϘ'f4L<#UGˁ?4%B鰩ɳ0WةGa_d +|+%M9jb KyǍ$ N*~/Y".d(od\DXೡc~9MSF.ut[ ˹4PK\o(^u?nˡhb^s1.>7^&1L44pyG.8LXG&>{g; iYnd?ݿ71s} +endstream +endobj +247 0 obj +<< +/F6 32 0 R +/F4 20 0 R +/F10 66 0 R +/F5 29 0 R +>> +endobj +245 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 247 0 R +>> +endobj +250 0 obj +<< +/Filter[/FlateDecode] +/Length 1796 +>> +stream +xڥXKs6WHX 99ʼnuSO4ӉsHPBM*@Zտ.^"Ezi/">,`{84l6ټMgalS_e2W0[a%ݑjW/nYgK f(EY왜/ګVqIxz1d/ҥ[rS=RRӆ +<7mri#:x W'Dp\Ȗ;m{< L8 hpQƑ1Sb/!{t-˻blrCEu` 6eӗ=5r8P4璴f!Cp8CoǴ;E!&1{%MgT={0d\=7H*/qp>Y({vt"wb +mg&oc X2x>_.J y/ʓAKu;Aj [{Q^ԕIRf'tmAV55lC^T%E=8lY[[f2-̏4@t~/> +endobj +249 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 251 0 R +>> +endobj +254 0 obj +<< +/Filter[/FlateDecode] +/Length 1570 +>> +stream +xڝX6 +4ę{݌{KM&mN-A67AVbx@ef1?%£?_nzwfvެǿ%FCgүV7Hy(A\s ãǓóTkwFwJ(AM9dLjW&-`K\ńO0.NVz ^E<9Ol)YpS0;3,y~ͺGݬlufN š[z<~@3\PV˘RQH̥[WPp'?_LeN̙zt#9Ѱ2:t)&xr`"ZvHй%qj.\ȱ + ӓKdUD +i)4P$_?P#-Bj-)T(#ï9 +-72,G*Ђ(}:?ᰭ7>T}hb9DCIy\M)>mKi|׍QE-|^l? +{ қn)17IYUT*TŇQ(tpdd-fkc Y6eZkI^&O2#&(D}s"lQSJW%UHrp 8 +qhvxWk͖tO\Op>h@ +gj QSLkpR,gF`uu9)Hr$\N|Y, VX=%zѱ$anRvZ۹4<% [0(PC3ؿsa,".P?p){QMee[@3caZ+KM(iR/8 +/WφM4sJCR[j{M8lAfy(R +:QT^,n??<إO:6d^6Pd{7ko5"'kI&Y7^][=gs!VX<*Uu|I!!- )M•J |R_HREQw/Ui/Cm*$)nY*46A(߻F1<p -~Ľi)OyrY<݂Z 'N94q 9vDǜ=?UcI|B!,crn_Ҙ4O+P/J5[Dfj; ;`UiEO 7NLtE5?`mu9 +.`r`)h>J "33zrӈv_o S>PJ +Jt Ba8lWމ(v,LYNeƜAè0}; p.X;(N_ ]1ynđC^6g\\ّ"9$hZ0ׄX1̈́F=40)8"7vP~݋e*9ooM{[ vw]\ +endstream +endobj +255 0 obj +<< +/F10 66 0 R +/F4 20 0 R +>> +endobj +253 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 255 0 R +>> +endobj +258 0 obj +<< +/Filter[/FlateDecode] +/Length 1626 +>> +stream +xڝXMs6Wht<#1B٣ޔXv:rVD4$wIbAv۷ t:8 }}h~fϗޫ WͦeTj:&YWG3Oɸȕ&<.*Mz0 wBү$?f)%(&j"[99'@b)M̛db\)}_TPBBGS6X;&-LO̒Lh/Rɞڼ_Ty^LG;s)xq'{I,$MVBYzgp(1/r Yf ]Pn A2u|@}v fHU/TlOiı ]l0Ɩ. )cZ#UEtƧr?x>('S3!TQD/U{ʩTDZ*k +̖P4iF̙*kuHfq>grߠ-@ɪD#Rq +>̕H$g@'/fep wy~Ocpu|q zJB*'W(f*2ǽ #y4^,k_aڜBB[wxxIeYusT?Rm(ߴi٫6J#= ڕ2i@m4 I}5ʧ8i5N_ѻ/ +NLK4I5媈,L=4FGöRJ 3{rw]j& z(U øb"* &LiɢB[P| ΌB 8V.a{`Cؼ_oR`>wޭ>>׏[įoMxZ?R9 +endstream +endobj +259 0 obj +<< +/F10 66 0 R +/F4 20 0 R +>> +endobj +257 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 259 0 R +>> +endobj +262 0 obj +<< +/Filter[/FlateDecode] +/Length 1481 +>> +stream +xڕXM6W x]ۑ=hS[ AJ,”cR"Ii\VZK"߼yjVx\6߫U鯗w|Z]p\=˻luL?<ٺ`%~3˝k0j567ܱ*zӏ3~N1jL j 5$)$̕[Rs`MG[q\tQAr J sϖ8V @ +VX`UFV$5 J+*qEZ2b1=_2^pI* s:r>I[z!RyIm (6·8/$/zlg@-@z-I1}-[f뼇ɉg>))BƠ p +XJHm$r@ O];o8*6Uu[gM +G^SMӃTp;OH"$db09s7aX?\PV“6&8Vε!rD>?@q h'htA ~u +ss &E|io\)z\9rr|/$>$-4( .j6DvlyG +Ŕ1Cu|yx֩Q"SFg,ُw='Z:O 4"Ew9jeo]qR%ORpI6߃'m41ȖbQN|'O~A(>kjį! +OzbE4CM涍:7 ۡ>Ii~z,RF¿ ?նפ|JIxXcw :J y_5cCi$śyIrj~ai<]6k1TKA0㢡5#*/Q]=p.ߖc,~g>D(J1t0imvN9)X% *dftȕ"ձ|*tX>\v_rR6&L,x%3;-eF&5#В@]vղTSQs;Ft𕉐{ǟUh Ȩ + iXU$5_Yuk4OP]Gܗ&PР{L8Z>ͶHDSj\btvY^QGxjC޾kOܠ[W8:Wz!Z&cOfE! Ǹp;Ayql3I<\ۄ* epls12Jvw f8M'8*ESz'D3+Iti\)>)pkNf֑6:)}{@̯s(cr*Mq uC RIRC'̝Fz<;o&ُp4[A +endstream +endobj +263 0 obj +<< +/F10 66 0 R +/F4 20 0 R +>> +endobj +261 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 263 0 R +>> +endobj +266 0 obj +<< +/Filter[/FlateDecode] +/Length 1505 +>> +stream +xڭXˮ6+]ѽ]6H. Jl$Q!);R"o gfμXWuq,7l٧E7b=Ce|VeDR/8@|>=ƾ;$U riu5/OTw)r+# ӗA +3=Al3/fH4>g>Wmeͺaz"Vgzۨݼb|i:pXc =Xo\hZZX=.7C$m~J:|0j0ko"PGk8=[pEъ~]8Hkb̌@"@66o`~2$ h z}Gk,(zLy'N&2]P*"+l*$%>Fw=NP^jgg#^dQ"SIp8,3 +f4'jyٻVR iRF4N֖Qd̜Lb.[|D@)9 gb1Mi _c?r8޴ 1 \C/bT bMN{iy~NuK N' M4J‚&{PcS)1p1)Q?dVm@k*EJ+8k8Du>լm'S.GoMܒ"cq"Z^x8OX|Ը*ODo>X7SݝUg֎Fsلj,'G9?F&Uhl[hҞf*=Xi a vx!BϽ&ۛ4'&&+Wuf9[&)BiG;X1 6@t93/dKɕBEZ$m +7\I,G-h_ U65z*Mbj:ao=\P`KmC:6mRe \ mw' خ)0ST ߈D Q1x:'PS%fHvmRqg7VT1){<4c1,eޚIkքMT:0K9IMPĖ(oV5D:;/IK]6ϗy +UsGs*]LYyMd/gIŐug57,H=LI)36vsiT>4ujN=,ʘNu&ڣm҉uC[ZuQ\ߨ:)6_ώŞLs 9Ζw<^nJ5/v& I>F0˕Z zuВb9ӝI뎛na_wL;̖\v٭nt*w\> +endobj +265 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 267 0 R +>> +endobj +270 0 obj +<< +/Filter[/FlateDecode] +/Length 1467 +>> +stream +xڭXM6W خ^8-iE큦(]TIj$m{Ykm͛rNQs?Oo?i.:vGݻ}~se([l7ʤR%d+M +{U愺/ )gzpbT\ cw~Vbn@k260mL=3qdu#8,D4&6E%6heKqj/d;oFl®Wx-6&vن|<)&ya~&Lg#K HX#YX(O[D1'vR=Mr`Wl9'H[;qIƙɹx´(2xy"+=^mWpH5-?\ Zh]J)=Rd/xgsH@Y@tTg<$UJc/W LzL[uGl$CC'3FLY +5R ;>Bl}~q:] +_`@D{`@4;QӦ0]2 +-SO'X^GvHz9\vc4Ӟlb9*dLT'.{J `ŰsrUغ1m1D* +maPKR`HQ;e#&ĐRR6 Jҭ~*dHEZ \=`u_`Txɜב'l-cHlo/R.DTg_vMOi&\}I-x6ޮ{#|VM:<,Sub>qKr%}wzv[>5Wgn+g .wp)L^*:<_;M8AXc7(H34Ap獾? jֹ M }[@v#_!5 ұvqi,zdtYoF/ CcH^NVqH@U$Lsg8E%)2tB(d(~>2.YZi#yEg1Ut^Z;DŽR[|h<+bə0W@L̠&9+ ߱\!շ1nrۓ="IjwT,}8Dh.10PyM +꫄YKЊ^:ȫz.h^u_?^uV{A?=h a#!v \Ȏ,m'pLt35ܯ4SY9LvdNuo{YMVUo]|a7y3^ +endstream +endobj +271 0 obj +<< +/F10 66 0 R +/F4 20 0 R +>> +endobj +269 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 271 0 R +>> +endobj +274 0 obj +<< +/Filter[/FlateDecode] +/Length 1496 +>> +stream +xڝXMs6Wpr=#)")6mvS+ 1 hŷIݷo:VOVS_*~ǷV~qݻ]5Mß7d{;߮7gFsN`N^xgT+(w%3g-eۿ|X֦zҜ(Ғ/I>-ڳODXt5pbgfs">.6Hhq.T欶T*AARkKQ3aeٗϰݝYxćfP>eOZFW湜7 ˲72yY-儎[EʚpJH: F-=qΥL߶/ lςB#4N4i gP%B`j]j~T1).\`=,%GT90O-4aePЮ3g[ ڍqaL$oDL6dWwL~uYFMƙ +OD]zSU.kDN/H [8n7+-&\{yy9OIHF,`o$-(Tr]3rFh 2fg2o֞"4pJ/1.)1Pw7I1FRL*u +wDaӜTNā40:BzMZAq [iAg6RHkq",#}NeH>˛ςQy&PK3,uqTf$<Ͼ#i5絅>hq(Cn$ď+uOK*ԡ!q\, A>S qӌF|=P'rW-&}l)aR0uț`K蕡ᄅIȠd*5Yp,em3C讹l}0&7{DBL9u}b>3r__ +A7#f#dzKIZ*dQ^m=/kfE)”oT 3fIsh/pS5ϮM ɻdLňR3 άA;ꇎp,)^+{6mGm_ ]:34q(."frX>Zy{:v.$Ҳ)RñM5rlG{F +C*-av>Q2`ZyVďq92r0,R-OH,3$v6_H0VМD]xDXo'H1_}.?ֵqgȨ⫵̐zr铥i&M-$xU&g_)-q>|N:7Kzuح~6خu7m +endstream +endobj +275 0 obj +<< +/F10 66 0 R +/F4 20 0 R +>> +endobj +273 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 275 0 R +>> +endobj +278 0 obj +<< +/Filter[/FlateDecode] +/Length 1515 +>> +stream +xڭXMs6WV{FR%riͭt@ WbI4]r\|?sE/e]lǶجomY<]*Iyv?߬˻Gf{5_=I0%7WD;Yp|?V,juI +ʻ&#s'͕ &.\ђuL3oOL0@eϴEY R6/}rߩ.vUoKDtonzWע?~Vch'p"}Cx@)Y`F|,P?(o5Fx!\SAQVR#]] +Ȏԉ}st +-%: JMKEM^/u"/0bMs9ux3y0AȪIPƢZVD~\+'gLJ/^4j:`+:CR^r*9CLOΧKM6*՝sf)lx3Dz L-?CD `*Qf*:{iТ'PEClfLZ8#3_L)=2PCn.btRd[Igx-) N>9/,R@!JQ >=T~5uORp^$Apk+*5`SGVG}#wYOQ"G1H1)K 5VutR}(d>F3c?SX`%%=ޝaׁ&?z'~Wl]Gw$=#yv 8omR9QR0Γc=өƷ91̀XΉg8Sz:>10@KMd')KGss,s%cW[-<;I'ַG/4!j³L!TQȱ)t4LQ= 8ĝkxrOG V}#4Y,o( (Q36`qA҅54l3yނN~ `tf!wl OeKwA^aw\e,b#'rJܣ؝/_I"c/m=z45|;kҽE^u1x]7Nc +endstream +endobj +279 0 obj +<< +/F10 66 0 R +/F4 20 0 R +>> +endobj +277 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 279 0 R +>> +endobj +282 0 obj +<< +/Filter[/FlateDecode] +/Length 1539 +>> +stream +xڵXMo6W{Jı;-YMw]EQ@KE"UR~G"HIXl |yd6>.eXOɧg_ymnmMvue_x(Z/WDE#Uˤ0_dimŴ4Ƈ}"3E*sT9%;NQAnb1۬X ylj2r-9DL֎qDKJi2CDaPk˱+?X ﱞ!lcHmxөFjD"$&#y]cӳiG[ma=%Zbʢ9a Kʋt+s;]^? +8&1J ^>{e,u(`Ul׍IcƵEAmg*ЧFd(|=c*CE&E=T)uYaqQz&$Ur[ +۔qа L9YNRTZzo{<=JB ȰYv +h814p={hZNtgɚʉ )U,啄cN]kCH9Da G; +zEw7 'r y1nߋarfzmƼvV?Q=@=xFslbokjP6q ?9 ?.RU`3L*&Gֈm ɝkQ@x*$J V+)00h,Ti T8Y f7.ܗ ֑a++[0waIt)"z#H11>b!NUNޒf"0kP0d8#(GջjQ6ۗ[4u C +a +4fodAQ+8Ozj%XzRIK-i0,7'zFy BZ5Ⱦ0MMck>͡ ႕% V*(wQz 8:ؤR8P$tG]g*&PU;P=&]\'j$;2h8\RŻ CEWƎޝRBʈ0$#z6+IU@  H("-VPrd-R(@vniwgy< QU AG1wdru(9z([D^ݻ$3/@7@N[ΩČLǓgpԴp:7*1._:^k^X% ~5D@dG^óȸ:6J2|$/;@@4XDvyG lcT"*u'iF{Z{#^tr޷8v?1ׯ>oqhtNFv]mfK.q8 +endstream +endobj +283 0 obj +<< +/F10 66 0 R +/F4 20 0 R +>> +endobj +281 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 283 0 R +>> +endobj +286 0 obj +<< +/Filter[/FlateDecode] +/Length 1690 +>> +stream +xڕX]sH}_aeQf*V{GL&mi 0~Ks=4Cۭg"??Z֑iip6C3~w="tIvӿp1#Gw uq KLy7v/Ȕz 7YV3L/ubpνX: %bL:ް6Pt/Ro@%d*u˨P# 64e͕W߾vEgG*Ʉ&ã8". 8 bO(*:͠tt.q! :ed@lK$C^JWY@2yTsf-ahf"cղ: +/Il.m%!>l3)Vb6a^LXD*C@V SJ#/g ɴR1F>'ĭZB )wA awbgZ:e61TY'MJ]U,tJ~f,{y˟`'|T^i+X[%7=O5dkǰ*+vŘn'61I~ ~ZM|YYIUYmiDkف'^47H oMthbʼn)5oX4^vVu YH$amA%X~.j%?MնvÐU#t-E\Pao2bw!UqZ&}qx;fV_uQx΀| + #O-=}4H¿owT6@ +EqSm+ - pyJ}PqYDaXl(@lyi/104g6 @iY u΅ᨔ:>ˊ:#@jR tQ`tq*ɼ"R4|P3Z⤭ +v0@hdZƯ 3 ֺ"ܢb4~ߚ~&Ş Au7xj]yr{)C +endstream +endobj +287 0 obj +<< +/F10 66 0 R +/F4 20 0 R +>> +endobj +285 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 287 0 R +>> +endobj +290 0 obj +<< +/Filter[/FlateDecode] +/Length 303 +>> +stream +xڕRAN0 +;EZA* 8XqZPąȞyMhL)ْ ;ݟ!WgM(lB8%ѤcRܽoІOxKϬ,Kԅ>Ax~d!FZVh߼kx$D UJӠ`!Lx;! kcC'V"[BʟYx%lS`1RavZF<Ɲݞa(MQj9[iœrʼn]/|q +endstream +endobj +291 0 obj +<< +/F10 66 0 R +/F4 20 0 R +>> +endobj +289 0 obj +<< +/ProcSet[/PDF/Text/ImageC] +/Font 291 0 R +>> +endobj +9 0 obj +<< +/Type/FontDescriptor +/CapHeight 850 +/Ascent 850 +/Descent -200 +/FontBBox[-33 -250 945 749] +/FontName/FZCLVO+CMR17 +/ItalicAngle 0 +/StemV 53 +/FontFile 8 0 R +/Flags 4 +>> +endobj +8 0 obj +<< +/Filter[/FlateDecode] +/Length1 714 +/Length2 6117 +/Length3 533 +/Length 6671 +>> +stream +xePmN4ABpa`da Hpw  www }ϷOo?SO{}?Wz49`;S - Vpsra31I! &B@BB VWP mg +ZX"Yr 8 (?!f p66nqh@!pg! ( _L0s;?2_-gNJcQBN66* ۿil6`gkv`V]?l0߻ PX 0l!!o7J:lj ( jwg~ӆA 2~...!U3'8Cy?Ӂ@\ fةiϡ٩.M.ڦuհFzOpl9g.fo^JWx*D]w(^$c5h2X.#Gyz hPɖnNtBطl복Vnn5" M˖lXOBZCa}.ɡ5Q%gӑ&|rȯb3N;<~ mz/)pvs?2-d{'F+Q0y!ā${sя:eo _`(th) +cX'PȾ@mWRu:fgJ&4 . ;T-hUM̠qgl'L}OIO`h&8ɻDOfZzQڗShS-a, .K$8oכ!0̤(3sfXk~hQyuD`wbƩץ8NlFҞm-II8)fG}B.7qxpK %Uvv,RIͶōLE%wo'mg#WjXN.8~)@md?ശ 8 t<hS$^׾h3k3{=)nL3u +ދ䄷e%$1o5YݺE}|Mj +t/>7.y=LVN|ByeN;09>z_pJN}m +sLDASn] (ݑA󲚬-棴j4413qw)o׍Xs)VZU&3!r페z}nAk}PqTRWFM՜)=Bc_%?Ϭ:xCjtQRMXS<1|oekbj ao%{כb)/"Q 3IoJE.i"gD5+β%< 9{ ՝ *;lF˲pu0s_"ϧߒ7~4ܢ]FJX/l=(~rX ĝrU_qƔ'SCΑm%vb3%AfT—F.]5H^ h|@/02>r. l}>zFc*כ^N0X;ʭbvoƧ s_B m_%V,`{}׍zzpUmAx>Y2"âts. +a"-~f,AL95BHl|M+6'zv-Nq #[xɔ_"eV@Vڏ *QS:.Zê 'Z+#[6|Ϲ[;k|c&%HǝW>DK3F#o>^·Kf}B &8|U|,I.Wr9|.TB.$̭J)xq+dF|7n/]AEν~[5WoYظB9c|аN%~m#LBEMsyasb %ӕKn*!B,3ݥS'ﴠV~t8M8ɦn{ @ۭO%<+ѳFylod-z m,xH3Cܣ~quw^p|"Gf(&$;˃d2`@i]{.^Gg9ZfLj$괢`[}qYDRѻg XWVz1nbCKXI>zg9䍊i }`h"1}is\Oʼnq$)f|ilz+$mv]> OzM%c⥯)9 r_w:cm#NShNo\^miY1]^zI@^q8#v;ARϞE-zq 1/2nOWj3uI+}LBzP:AbYEV-(dFKa9R"p8!sF]`,Y?oJs'.]@]s&ѣYJ%6|M%lgRNmiS*ʞfM{p1zhfYlгNZQ2A?6nV {?SS)_\V+3D)k:L@έY$r/}xɾG:Qfc%7594Q#R*D QgF5ea2̋C` 28oO'k$9zI}#VXaYC;+RN;&d|F Ńy.?+>*~s>Au3,2׽4lRWvWx*;=Z8y:Iz4oQZ'џXٽe..t6\O_Qi æGpǞ_koT J{tqt!ܶq*u;tM[>B4@QT!ӢN>fGk=+gHMK4'-(LB95XV-WYcr N~!O + +A!TMxAD/W ,Khx>1H)K~ۯ KcK8K*X"rT"Ό78py)7GIK|ok~_F{FА/^v +p{~6Bx3h{Wd4WXeD$NeVz@g/JOJxZf2<`97^$ll^= +ї=HMZ/8ri#PJAEK߭( gKC4M,z&8)]aJXrn׀t8tG+V!Iԥ{!]|ΖInj:#&jjr0O&.DVۂ܃Av_agi{kXdqgUBDj%x"@btg*i=~;~| f^wpq,Kz` +?+r{-@Ex+xa[9^SꙀ~J6d!۲ao1ޗEC +$;ݫ L_cIu:ylHum(1ai`?%W3WNE,O_Ysߞ=S#2VI!EhRFTPa)-Q֮<,_hR‚0yrU{ã1GC99Faek6 *VPbk:U]U, +FE7(TWYw{-Zl딳0uO[OO"N~ZXf5bΔ T8|…pj/ۭn,Ԋ$QIXZaz8>S3 S)ԚO[9計 +rǿ#RuU5H41Uuc7'$`f w&IGE#]un;VP0D1z Ax!>]h=mc%Ж5xЛAWhZ&yQQI>أA4;G%Ȋy^&=/2~u;V$f>Hnطj[apл T 6B40~HW,ڨg}(cU!Fn\P@YaG۱&Csl/WsJ*ݦN;\1߫xcV `rb0iYжN^š)*}ε=H-+$*;.k޳aIeRu׮pAUB_+{$y[}jW^l0mq:`^T=_B 522 $_ÚϪ`t1GGǵzzahj I/ ,h+lfk_j~Gn~jIY~vˣ|JCeB1,ɜ1 +Ǔ.6zh:CبWuR$}=Cw-LHwB$l@jG[1+=`!vZZjkc)σ %U3ƃNk Lܮ5 ( +wE6//F+/j tQ.kVk|F'wDd̻M@w@ZI S7#$xo h8#YZ`ʺ&}6Q;ӔFű*sr#Q#pMIU],8<)p۪Fl@Zm6wLAb7"ɇXw6`Eb#i{8̧\y7KO i0(zE3RF|I.J4ꓺܩo0E5'2zh@6O 6 10nVqUsyZTJ=>FKT-؇C/C1 oKc Iup&ς;_y9]*G㊒fs]C.\aiEñ `^mWtXŧ}nN~tR,6PvjXqjP $Cu~ +dtѱƥ>Y}tݘvAM zg&*F> +endobj +11 0 obj +<< +/Filter[/FlateDecode] +/Length1 714 +/Length2 5286 +/Length3 533 +/Length 5836 +>> +stream +xg8k=z ޢgQF[^.A!J$D —}?{_^'v(|BB 0@_CEH $))t D$@b7wp\!-itu H? x 0{$l <~s9)np h^ P=\E?om[W ? nH Cbӄa!m]`rp@/ u`H{G{n"u5ulap_=`./((Sۻap>E%;/(OXL )!>C8'DM &(((.)j@@?o~OdP0==9e5nC.;/>$tss9'щM2DhJ%[PK<БN3PM&E=}Hly#o61u􎅮zv(3ڌ| z2oy|\lFAw  5<3 iRu4i(i.g8]-)TU}"5a'(ͯڽc4o +XBJcu˪l3ܤ!}TU L׏ʊ/]v>]1͛-F|L +$U70م1 "^T]tJ^ +{ taam`4$ݯD\?WEz =ɈzyL{]1'-%#F!~Yf# Nαe;e +qBQAf5, anBr!UVӦksY>q?o_-rs|u֭+j_) dJrbZ JBɵC=DYve3?sPX>K|2<5Dg4 zUuvbr tFLXN>J$ͷS⸱=辷3gZ&԰4}KbIv2e(-b) wz{ZGKKbzBj=y/ ojm2>/ y-f^̭ 7=o̓XVZF#FzSpulᱎӘ^XF"q@-/,Eub{08n +dBXnd~Wt#+:C91,D]iC2,,ld\ym#/WV ßҽWdY]ǭ΂Z߾N||rPHj*J~LI-7J/dZ''AT{O$|8;ѺÕ~K?\ꂄI<8E 糸j۲oYs7Pf"rVDWΥnY>< Ns6.>ˌr8U/T1A;^EQ1+WL|̵x$q3>QS_}g$WKg6hN];;20hֲQ ~i`28 X$jX/edikY޿`]Ov*VU%1>Z*K4*qǖ+]a)@L@zu@['57Q3G(]U..K + B( +w?F,6#^3a3DRC_sc:zH78^!MU4}KRW,FՊE?exY~[gq6R~aIóv\‚_`ͼ(K)LW2}\+u̫ +OF:KZ9Wwm/Ltt1gAzz暫D2T) ds=z1p^M/mCGGFhOvS>?V" %{G2~I)`2C\FZ82}n^F:̸?pḍ+0 JQ7.ۜb$1p̜O⡜ܦ(00c,j S+_9Vil~Y1k3 |ٴMp C:Shlt^e;wdoB#o v֖7{P6h}|p7:KX9mi>97ve ab. Ay^I$wݰ5{iNgM 5Y'@YejR{!釨{7<8̆!m6s1%|;4 զ]h׳{^2 L_F >v' ހc9$8 +l>Z #JXzs c-+kn3*_$\H3ӿB?VWK+;Mq ۩?,:,$f~tYz`O%]պLAl_x&Xx +C18)̨G B5 d3Tay~+U%' {rp9TN?(݊ó}<ljoT & Mâs[nxCNHoџFQt̴viSWWWYS>Ɗ{No n/ͨXaK/)nl`n3r&vpy6HtZW #/OY=~aՏb1tOHCV!|,`\ vm>׋[O;ps L+{l&=cy GôV :xS"T -,Ek5U#ס%yl !hxKbXl,C! X.в-35UrU<'=oL[E}sg5qYD./vZZ鷕H0l?$'Մ򦭵ۣ'Ԃu6À=8T:jRse_@yN=+*4':M f['Sf/lr5#WsO-E{|e+u/UvWc2ޔ߱k_ľuiWdOȺU7y)ПzhtA-!/>魈(Q$Ԙ8+|P+Cx]GE5=7!#dK3V/spZ&QXX-:bg@4'@ZUbU,ܐ^D|]nf/ں`CޭZ"@s?{'ΊԆG,Wk(Tͤ4s&+)xQ|!qml}]X'iӎl,'!7a 尸|KÐg N1t$!tߎE8ˠmm>QQ^!}@/R8 .7 +[ßk*RKTT=jdאtVVJ_ԩ2RUIl^d:z})Wĸ& 03uIЍ{ez.&E$(J!st#%wa[GDy.B 2vZ, o.jaT[L-n 髠ku*sz1[-e(%d!oa&hbko;SEijǛm tg +r|M9 . B#r-# rnۭg}(ammM`2 fv<$n!!T lύȤ3 ynĪ/ګB: +l[{`J?=,l܋5FLn'2cK17U8/?`E \m x@ +endstream +endobj +16 0 obj +<< +/Type/FontDescriptor +/CapHeight 850 +/Ascent 850 +/Descent -200 +/FontBBox[-29 -960 1116 775] +/FontName/KJGAGP+CMSY10 +/ItalicAngle -14.035 +/StemV 85 +/FontFile 15 0 R +/Flags 68 +>> +endobj +15 0 obj +<< +/Filter[/FlateDecode] +/Length1 724 +/Length2 1676 +/Length3 533 +/Length 2211 +>> +stream +xy8ǥ4BCΘ`l281a0 3\%KEB]I*B!IXw^s߹~?emT7(LWQ`9 FR!<tHA@ 2!ŗE=<逼W0Opx' !I Ct +I$_hqQ!" +A_LMd!*s9.%B&"TpW,1ֿ9(D|6xAe!*!*g=aϪ)O d(w<w<}Cd(}Q5737VhxL?o5gfNh rǗO "Llx2O%W* +3HEMP>Ƚj x`4і 1 S#@Fk}$0TLv;Q)A" 3~7Vާ}Xھ3VuIαM9Jt+)/FeMJif`tXh./WW#"oX'# 8!w1vXW~A7]o8zVu ʦQmy ]=}3<6̤GߑX_l2#`sM-%+>kUgUt}(yž9M}ln[+3Og9'_,?'ʑg>G`e.{V\Y$\ I[6 *e)^^2T=,]KxjPN]-uh$0 +%N+,aOSf8Y>f'X6v̩_iIze~uo] F6,3ZxUSV=n9~5 {e"-[$2!$kVM9y'։؝rSRן~*d^W[bm9قIO^x$.騌kڼhLjNZvoHLy)rB@!(ů^g`rRseg#W7F{ߐ[/<û_sCnU^6CK{WiEp@`gZ\4$SuR\XtzgX#ca$->O#33fܮq"H붕msTUVmnW *H+>!s!_hRF\Jʁ]c 9c:Kc +g;N}~:_#.YOPU 5Sڼ+$xvC@GDI`4־ r$l:&_b] +; 2Cla A.zO^QՇjt˶_*;_^&覑WFմWn}aY5j(XiƭYo/ZfB|gZew ô 3#+׀O_OҾZw(: ,i"<6b*{ƙ}-5ՓTt@o}:UvSGuCUT{jC s:Kutt\7J5@Ya +5i|IGڳroJL3LIZf%TV!FuiF]׼FK'#9~ZYV?%G=A)>x7;XU +endstream +endobj +19 0 obj +<< +/Type/FontDescriptor +/CapHeight 850 +/Ascent 850 +/Descent -200 +/FontBBox[-251 -250 1009 969] +/FontName/XPQNDA+CMR10 +/ItalicAngle 0 +/StemV 69 +/FontFile 18 0 R +/Flags 4 +>> +endobj +18 0 obj +<< +/Filter[/FlateDecode] +/Length1 720 +/Length2 16430 +/Length3 533 +/Length 17007 +>> +stream +xڔSnҭ[6fl۶me,۶m۶m[kv7FG䓑y +ʴ&F1['ZF:F.aY%FF:!RRa@ ` @0\scCYC?Z(#0ad$017v"0JԖ?\pPN[+w) ??pwq1g++9CWksv8ښl۪,NVƂ6fVHbns'?VsFPP϶'`hnni6?e?#Lƌ@ ;'-+#?''ߩjcn !`e```djqIg ` 㧬(KqI΀_AFYmŻ}ԚUK4¿d EɊܤP3+A6s.5q+ R+g@6ӪϟãEߍ፯$YO"O"PRc*D8<%b1$&c‘ +& + Gl!c7ooɭE}m%0#_%eNcNMy`z*IhXr*3Fx-?uDKd/ʙQ};Sʑ.hOhM=y*K4]W)֭[L0{0 +H'!7Z&[*BMa-+I^$#3OFnLݎ( =&36~mH*wQ79sG=S{;ۘB3M;Ux|<~F*n}ab%HִCud3 K(ñtuJbmȴM>|YI3e#qD +]9ze9(i@ gCRwFZU${O̢[ZԴp$Ώ7jEmzSS~?bgUQW\uBn1n0ݵ509V-I*N&Yُe>u Hd踇P:atZEWlv(ܾE65!pN):5 +\XlVЌSCy^N'Uʥ٪۹xp a++{Z{ #i|\Lf۲qDWmӥ\$ iLV*y~M>K#$viPMcğ> wd?=iAQR},ifV9%JjݺSBQAT-U}(%9T#J޹p>I5t+W1gOSCJbF9 pޤW%W@}D_9{ND})`:yS! V{PVDp][.vi di/ܗ+Y +7<18N@XeTJ tGu-\Ef=ԺbzQ}|o3 +A^uft^ +PO-I[frO:bWְbD!uZtEuV'?SFhKIAh!hS/bhfF2i#*`V@WuHOr$;IJp:ae#.Yq4~P}UQj +'|ܩ1Ǩ+ ,bDez2gGq(`Цuj˩:RaHNM} A}S1 :#ј/=Ng-[Ŧ)Ӆ(_pC UzCY`@&\lxt]0]/ݸiYQwO TӘ#R*[!w>3܈eTJ[TOh_<귿%ss93o!H?`V\mp)[&I>83Xavunc+OKm>pTJdFPa+B;{#qeT6-/ +}wH$ȿٟ#\vJ :+q1AYкr䰉#g4Dܓ籰}<>5osRNLO(xRX>F˚s8X;/5lOpdZ9[oA zs_Hu S^MҾ4Xo~4ʼVD3XAĿ> +Qj`^D۱ެ"$W/[xvt 1EiJNN60'B=qd,EKM:UU̫ +."G jpVN.gzPṱDM~c,8iO/ ( Fǁtɣʚ6yF>1G'S?2t Zym00%8$ã ?LCyM{p}ߠY@+U]!F??/~QфFz #w@ɾtA0'"WAbwƎJ|65*DcSr"$>Φ=*|`8XX.J+r8Ĺ@sӆW*r"EcYiTKް@+ISʦ%~߸bQ钀ŤKM0xY։%6lLx_9l|laJkDb˔1i&2+5dIps#G]DQMQ3jaGS "ai +|CU1bS旀>aHզ(ӻ +Exap* 拖dl^Q:VTP=N=2NpLR\+7^D萛Ԥ5l" +8Ht G>b b(s(Uqe~3[Reզ4eOЫ'_K'K-`k٫@N +j9Fp;ez-)m*VCCe\ J:XXZէƟqKtU5!^YJ;E{9GeoIy탞G O'N+." @*yG q 2}?Q;ꭟ`nUeňl-AWS)QhB[kHF8{ kVΨٮĬkש6bR'jS?`MfHD*,%w3*E=DGF +{d* [iV*uƇEBkCw]!8l-dA˓U(`J.=.s3yU]8}iXz xl2ЏٿRXttw,#܀JIZndG*vdPR*!v.Av)N{YߨqXG0ͯ >~ttcmsX٧WiPp +HJd%b>[=Lk0Ѽ )9"I4a1&GQ7雞̐qF CY~ 9BMA%T$.3whZ&b#Rn‘|BͥV(FHExPDAU[n('奏Y[жn!lE @hk`?~9=N{k˟{}Iy@> +ky68ċٿp!j80,($ATc#Kmd1pՁ*|WN^Yͷ-IMv)q*?H +C87KZ+(c3!Wp'\K:0poK hIo}~UT=2H" V2SaR@&k*,jlRkx ,\ K0z8fo;hbss.B1|`v3EӄYJM=$J`9&y74øt'Q' ~׍x>aF6u4Ng?()nǽbk8ENPGC礸E4R~rEg_uJU Fv-eYzSƯjWۈ~%f=cL !2b jgQf6 d~Q$WLIttb\Rm)Xayz;V^7sNK[ Eh-3p a_XATӄB'B,G]6ӓUªB*F +ftӽDmK[2j +Уj"Jc:k|\ͫvnӝD(cF#1R{t'sJ~$Dl%%J7&7Hnrdcg.rt&K:X +bpPcO3eƥֱ㊻nIN|ٯ6>4n3h-MTGGii|yZ& YtǷO>%UD̺kchK~)sJL*ɐm3,bP;a$.SO\H'K%mfK*#>;qos5iok*4't}Rojx~mX⦺߾0툊 *A +BS=.醜*4`@0t3Ԑ9gd3 Ǫr +4T-_{sWvan)$I7 zn`ףJj>$]*1ǐUL+3T.nж{7bJGAZFd 34=!Sx)e<#  HT Q=bVރCuHϾ.ˣKI 5Yː1RĉޘU&R ،*WHąsR+$+6] \%P+PH7\iJ.>, +2U AڅHUj^m +IP= m%%iK.tp#ϽӉGə.RCW"ylI&܈kBQ;suaCY1п^&%<9( qKzD-H!b )ҕ0[kdmӰ0{RUm?rXY;M{|TM=Tas7E:hXo";a]Q.^#͔Ԓ0nvR_R GQ$pE+)M"anoVݒc_Xf"&᷸3.?XYVkol <{}Z>S[2WP3VzNU 5R$0xY'-،OQ%W☒+awh,tMG?H!]lilWԇSƎ~7!VoOb|V}ˑ sNCt;{xcf$G6aLK-y:#HYO|á )L_sqvj0`5(H=`wCG5/V0 5sV9l.Gv :Svku8DMOe>6:FWbM-# lة\<&L=_;䎽ʷؑĝ&'o37>/ +tQH=ی+Y.tH"j)(;]iF8O]zWڼ N=$T rf}*77~Hv-7[g[Y5D?|c7'@!gMqD%]N+jǶ›q&{;ZDՎ7_9?2T3qYbR#&v˛[. WUˉgem1kn0rG?V:*SD qU'9yMs~hl/%<4&Abnf&xq `_vZp|RleG>~7ٝEGKV#o.UfK`=wήU"6 V^)1cZZʜl&uU8UzuD!d5>g5xBdt:V. p<0%w%h*Ix~U3{ύK#,*A yhVJxܛ3]gҟSMEuۡ#2޺~ig\Bd8RdFLͣS1Iw?B`7Rg;= = MߍN1tbτt +.# hUۖ.:)hNI=yS,_ُD5 M҃ۆ:[@Q{ϖXm>yvY%zY:SPcY< }JLW`qBXwrnJS,h8>߷fً7Ft&:OA9guV}XQم4" +rP1o>o`i*1R`UUkY~hbFQU) ?LAK\kXX(9cY(Uތ{ 8B cIY Uk2bx3pOKs@3Y}sT'@U?K`M*ޚAF-MQ%PbgNA5һ +-iꔿL:8>4Tѐ /ӣ#K½Ty]-mǐ#%8=c+:%8K' @*&)wֿmrrgτL]/ZT + +,"rfj:.1O3 +RK +$l+P៤",<žډ6'sQ}r7 #GJPA~_ #z$QCLi"2/OKG1S0fW]Vȣ-wdƑ >/Blx)8݄`2G!)/p05ZC&{[{djTFJi?bUrv}79?<@ ~mI|<#݃(nZHœ⤢pUKv1[ϣ&pPaŖ@=v]w t}w\W-4He!Wi@m!ϳ'y%l)|L4QL7@河)W}~gH&OмH"pCQU n.El\.jKx(Ř>yϔ;h((+.ƻ5nk]ɁŤ fm I*0IkkkmQD!Öztֿ[!e +µW[w[(W:}'->W6սz +z']B "Ғ; +ޘo ,7%tPq/oGkƩݏd_.DѮxmJ(!)|z[)0L+Z%VckN%|WU"K9 BzpfvpZ?3]\Uq@ba*&v(n&(eue=;KNə fz8#i;LuJ.hwIVl0y5̖Ife vv{,17KԺ,NNeҮc.xOw؟ T ^1{%kc Њf&1 +f:5n-dD +]qr!vkzR5x^xZ ]NF\P{N+A#jWqf&Zpg WieIwh0!-,A Ϡ" a~E + yc1|c6ލO!"Eրgx]F_FnV-^UNGiZ)AyVe[-aMj{s +lwYWrj[yTy*FʜZJ(2y:~oSvc/|n|T%A|EV eT` ޲NwI_.iSjⱈPV#RZZׯ)/TW#8\,goWVM-,_룏"bF`UUebg~%wUK|3Z#['Ȍco?N”D`$;)YBtk<U쎘X)T[XLg|3&I h$/#l0,͛H.?"5mj >vtYRŘT]F[bQR3z Dn\Hi}hR9@wY^vb[WBG[ߎdϒ_h3c \NW3wcY)ܞ6+jX (=x@ؑy@x*3 +O]s4H߲J5M#^%浤6 TGM/o.`wA1SStUr@r4OyF9Cِ, p#wHla I 2c&Z{ݏ.VSAePpa.RT4l'R|j+NW,]$FQ@"5᫩qgvQ]B F7ȗ˗oNbÊb^jF#G=}O Ax@#Y2mo`"4Ae_ w̥-مAeI߱Q%]O* #3%>ན cIƉ8jċ7C ]dc,NAe`\tISC6^R>jw"Nf"T¡P jE?Kܬ{c}ߐifɗS9:XPY֋7}12)|}$[}tЖd.?;Q^ kI*JF{u$[2@@)R hηM&8chqT5 {̘gg&S`Uv#z 32@UAxn.BﶶvG5d_'JkIp?,.? wb>cqb\C(tEz*\rnq&M?Z(ŰeY³b}]:M"TXJX\'bFy*)I8[4 _zlC5DvZyb[FE(^&}g`kkh/M\5DoW{YIheiB(}@Ci++Gjp+PP +) QdTK!3_;U\RZ*9G$&)hs_x,are(X.4X2Vp>ySa'1,aZY6 ipX#9]ִTP]Ceü >ޟHgX~F QTMA+1C܂KvKuk)q]+5{0F:02\96zb5(&s/},SK7|fZʂi,#}҆ȩ۞aH0lGZpԪ;Q/ YJK +SjO Q?p 3ߦ%mLC& +WoV@r$Y}4w:CX~vDyRI9~18X!$k mm&u&W ޓːdCў8`Z>w ݪP2%PS52##q[yJe%E~u4[ƝS(kBmHu`N; mI' q~fdK'X AQtrc0YB/^za*}jy=ȂFExM&#g" zſjubBL ܕzk|L +lcJ)#lub@a?尢e +>'t3 <8 +2]&S,t\ɕ*e:~ET=xuaR_+ )m{gLXi Lb-J;+NI+ +ZBϭ` +v皥f %RDzܶ0\|Ѕ;G2PܪlSXoWNFs +0_qß y[m:D&M:5H7;^?GqU+'Ici[ol~6>P   s1 +E:A@(q6=p|  J2\LA^IE*˞5WШ`yܒ3l”q4H?;/RT%3Ǖ!OANXn$nPT@xx7AWwnҝ6ȉQݽlS><_TK-#I"g=}k!z~d0v.[pМlU +rLR~b:/!x'J20w '%OLN{CD +pOMMa_5ML0G3s˳<bM""@׵ 297L/hƅ//aTM+Hvb4/R)ڱ-SyJqbщ~PC{A%hiJd7ZY<ηQQ_%-ӡCRE :DއgbkMslIA.ȁ9\\.%fS&XqZϾ)=YHtE%}E@H%_fԙS8g#=\y RUE~]TR4]wxB>6٦ayIUWw(_`JNĤ&%*5~"YpY_IYM}=2tW7ЀMF~A)2Bn%syJ 9kh벏֏ +*9S3I5gళCն%YJ[/쳽z#loTVɻ͝-G㴴&U-^KP(Ȱ!1(.Zwă#n<v:zl:f-P=+xeUost4x"3m)8q2H_^ArLmCwK]#廄:Nt/\C-I캘ZfTA~ 8& 5sh}\iR-IyTN,ՔZ(1^}Wnr3L(wzj3]9ɌVSe1 EhlG/+ l}·ԞK"UoeikE[kDץ;QJVCA-).ԓ-‰}ܼ\\,F/˂+hKѤ**ĥGeADb(XpN:Mz}ijg%ơ6]1ea2Th-%hy&0ʹ3eC~P0)AP׻NX/sy՚ntӴkSkֿj~ {5=&m5D('Mw#Lf%4X?e00W^ZϼŮ2$N4ζAF5)afm+`1,2oMXЩ C]Fnvl>d`Ay 3N!=RЪkoN$o\rT<<нU'' ^Cu!bSϷO%6~+IZx` +UO,<#nZ|=>hm|"/NΪ_=΃һn.YkH->Ae#ǍJA!";hoG/#Lr\ ::ߴ+z61ZX+}gw +B3 (9ṍ.JW?`6Ά֯&[t>tL}AEQkD+U{A,k槷LQר26N޹@ᣋ|'$g84ww?Z0?!csJrۍהJt,;q)NWi2;btyaKWTzǝUs[:o]q=Ay3J^oʝK峟׻.,;pc{]|^R:G 簾N[p){\m=k'鵡 >٬7Q<ՀB5j0 9'5$?7( }4 +endstream +endobj +28 0 obj +<< +/Type/FontDescriptor +/CapHeight 850 +/Ascent 850 +/Descent -200 +/FontBBox[-53 -251 1139 750] +/FontName/IBJNCR+CMBX12 +/ItalicAngle 0 +/StemV 109 +/FontFile 27 0 R +/Flags 4 +>> +endobj +27 0 obj +<< +/Filter[/FlateDecode] +/Length1 716 +/Length2 9668 +/Length3 533 +/Length 10218 +>> +stream +xUTq hpܥqhqww A NKpww nsνw֜;/mT_jW-:)Xޕ] (`gJ8M\%M\v~~v%`BAH88z9[[Z%فL&V`!f&5Ջ@jv;YQPfS= +?-vvKi`-PؔNe?P{db.M!^psts;n Nȹ@-!`_'\ +`aqSۛ;ߵMNuUL]5+gkO +5=ߦIٛ9[[]MMKT>,ܜnv;;'?5rn Olgmaw?`' %;ڈOv +JgY]>%*u&"V"ӉJl=Hd`bϝaq*>hhV*7N [98TϔcvmuynпkɼRkx~7zJlNC>)?`ΰ7Q̀YۃD߷2#'t:)jX/:aQߗƥ =`Tss{Bi4iccoR 2[3Ksdm_Hs:I&KzhqX~ Uj9EM=r;'MXi5@]'% ̠Ҷ> +ũ {Ty.ccGۙeDžֿj/'_teTFTW\O.$望&~d\RX!c,Wsڀh ԣ=#w~E/]EAẌ=nv0PK,gg;"W\x ژUCHb]mb4lc^Po$7f1#e`GX@}ʟGDh3$Hcc#괓[# lbRNWzxβ2~ +L_Pʺ%R[law1GF'8&!]*- 㭡T x(8FQ XR{~95IBr/bz\^הI1gg'uw6c'MX h)K +${ZQg]Q %0S@kBv:Gz%V"˿77$rXy-dWrK`,t'<?`ɧ (F(uvJQiIsr 櫘Ϝ:LrS=Kg/9i\HLf8-&wYbFsVw#pIQ3FUA*g׉YÑ-LR ^H#1|v|0ù6.J{6>WdA-Aw~DžDs!K.12n0koKvK)̐GΕ 0eHy + i:#ZbВ { +È +B~%.;)r| +jw(v?DJz>HkcKIu&Ge4V5ָ47d33A2V?N~򄠜AKET?7\c:mnL . +Qǐp,CFN—W^Q= +mlrN43R$tW[]>L@k!^WS- -WhMR)hؖODA[=<*Kl7|ɿ}=^:JHC )$kS*5E2D`PWuYXHR V1#KN=4kbN?#C7q?[ظ4DdlW35 V< +V\0@?|֊ 3h$C~q'JxJE@9Ѕ:wJӦOmW8 ?+M&tohvϓZy[ɴ;S#ݫa,U,``{Rv›lEJ%y `BbG)F +5Hě}O *j[WxC|cӾdvsY5sZ`kۉCtvEth4-⻿x~z Uc[ >{{ѼFb6hYpyNxf v_l+Y{o~dy h?ʈYYQ\n9Iw{`#:W6A'zP.T_ޑ:e$% 鯌=X#zVu.eL7x"R2qoz?wω$hjydnS~7/ +aѦ$y=wJQ(Pc<Ewl` +fTO"sdΫQ9v:_ljdP ( γ N:;yz#]if^6دƅY&\햣.V&:dŮ΍Y@Ϊy;Q˹ zCqmtr -:Z[OK #I밶L<31Y4|N~9# >m|ݷd;Zen"Ä.:#mmuМ'k ʫoٚbX3.*T[a 5+a?` +Q=g.Va VN4#M*k8$>160v ׃.ky ]uAt0q6"1D$'+2$1'UW=| ++lܜF~5X9`~{&2_xnn+ʾKIͩb–jAZv^qƗ9;3s29 [s lTLvBklNRڨr4YU˷zXh8s2P UF@ZO;uxoT lCULiR8ASԐ L9+sH-}XP1iS.&X9g2G!HQĉ9nHS,«mv1>_[M3gB1! ]Q:~C^lsb{v*}ell^($xYLԦ(C,mT}`P|],%ۊL9-x~ҁj/f2jd'󖡱iz +.w NxܚlxB^e %s:,aSL%zT%*2&U9~^(#ȃ,#nQ↣<a*k YHFNU if./}V.̵7Er^@ʤx[Js +ZYȞ0. [AXߺf|B4gvg l##?H%1>wdy27T]b0윥,|ߖD-cuWAzk pSy Αt\DK8EbNA џ,x7jD`h8 `̻Vۨ8~]lpײ}x=kD m hwjK"& 2SRSWk'RM W-N&OUO!ı +=J_µFP+BM1-Zxyb-l!Gعsy4-̌!j[ iLIu͠)ՓKTv+0 X!bEMy mjkqSР-'[f8dA{sTil,cp:0Mr*%zc&dTUcj>zCx揸<K1p,/gtN;$!8QFw?l%WVmzYrӦrobz uq]g;KT4t׾J/crI{ɮt& JhOWA~b„# Yt,t@5Ch_~mPy[WSKsQͷFud6ߙZoOD?ކ ˋ Sg.-NT/߼}F45Ke}oAN>Z~3o1(#u1{oSBR4Ku +fS[TyP8A'i^ ^7Jf'5]'\Pla:9LЫ2rhnvf;ývY/Wc0aԩ9iO. !/A'tڙ@givH䞀,2>I՝]Zn 3ޚe=Vl䕂x|Po}hBZl No@ p;B<]5mU +)0JJC@sT%]oȇQ%-9TkG'F֢!I6 +|[ĊN A_\Ҵ$4.ZHC}- {u߁ +b3l~2l*-1RJb :3"nO$:1뻈lp}{Cm~>'-yiFIka|0dm HJ$~k w%gtXDְ`+-B3|oHW -wА.Ҿx`yq9}$AU>A?N$@(ʷkKRK-ep1+9DH<:7D>xci= N?su:hs.guԓ^ܮTm:dٴoDAX6NZclkxA_%^q r9 XW}6~e#4r*fUHD@?;b^5]8@&Q7WWXGQH FQ0O::֖jz~q.[ȝJ.\dXzeT7DW.:CpF$4vIF_.fS>$ >2U*#!Z l,aoA#ac'2/ 2u6|-Qv7_!C?:`; Rr8VGb`;A2> b>rέ椥eDpK0h/ T !md٭GC?Y`d+o $b1iSN q ?Ns 'MĭtJߥⳐi4GTX4z/ ;2S+1W w)ZS %_m t:7Qer<E~Vt5!?]^(a}KWeej ɴ +R?zq00<_r=S>X\R!Vv yyˊFFiRoxJ"m~"?u]:я{S&S VT%d +ё#-XE^G?E$YU-4i:a}8fc M3ub֪AVZeG}?S9bEjG |rLd^ƞ.Oe()Y.w*r[1W5 ?c2S xA uڡ`ˡ^$-Y7Rtrԉ$ 1`&~}] Pf:"q,&něalrێ?DUTL My-ES,IX3O)˪woaB0r@g.΋ھؘHů7CeOӔ}ƵR,ekյo{F0e-M䉜< N}c KXXգu^R$36wG}9S*yQ;fC&EJV#ewԕo=_&3.m@+2BΖy%oY(4+nClHb7Z;Ml`r{n#_ +飴H]|p׮3%^bMQ4iH@m$KkuHo|L P؈sNWܣ\f.8L!F9nsU Mgv?8vX.KvFK;Iec?uf<Ƭϯ]!?6w땗)I .h'Byۗ*eF?l^ +7vZ[|VL.}$| +!=Bl@JkŮ,we$Q>#0\EYhJ$EW_.[H5 08 E/A=rJqd}w*rzfٺ˶96Yf|#BB-;,%.Fam{?b?kyx'&7i¼%cf!A"]'g`Nܻ߳)8gmqAWPoyֶ70ۧXL0nRvTξQm%5a jЀ̏R >s2Ƌw}+Av@h +FU_˅}10[Xv7R(l#kpL;1 毀k<9Ohc\9:m"ff҄(E3fa-qS@aX8^?'VyV\szݒRlcŠ@RJ/zxeIYݫ[|3gҁ04p+HʬqI*U +S5zBΤHc5MPmS@px1@)6:Rb )0Y[J? &·7~YX My +2`!&vX&yYS6 Q)[;Hk-b~&Y\dtsʬ 7lI l^_$rꢈNŎ1J4H-<%2W <N +)za ꪟL|ML= *YpE426v;.$3-9,!6/:XmA~QkKG 7S_ef/RS֧LF/{;s p[ll9ezfM9uwW۞ W M9҅p&=;kƣomF1NpXy`tީFT?*&pɛ[ՕVsfټ9߲bӽ*_`1T,x@oVc!\$ĘZʕj[ 齵Muy (,Unb*~N@CY|IjpUj6wwW޶rޜ?e}Ij+Q#޽G؛kux^$$*Ki!0 ~þ44ʻMb ;Ƿִ> +endobj +30 0 obj +<< +/Filter[/FlateDecode] +/Length1 721 +/Length2 12005 +/Length3 533 +/Length 12559 +>> +stream +xStf_V\ƶmvضmm۶mVn{}sڹ;9/FO> +1P΅ "'`gd%#qXۉL\\q?>n6VnFvXX2 R_*- gbbob tll t:Maa&.c,ÿ6uuϒ.IpxLf C_]mlleaT:r@'*k#bdci"dgn0GYhhbb03q;3 J4Xhdi|%wdagLys_ٙ؛ZڙT\LLWS {xӱcD=cbgpJ5;KGW(YW''˿o?[@%9Ku F Jrʠ҈ ^5/=Z&kX6&ӇIiN_s[u8Agdڇ ֏8yCrLz@j<6CM_B lfyzʈRtAŇ_}SkY!Ϝ\@Ӫ)]Ofc\V0;)xWRVWlgIό8chuj_݈D-_OLѝek +J,ΗGP2O%F]B+\~S$t $zj}(W*+: T ?tMB[縋2q0\ޑōh{,/ @j]h`bEZ4qsV2+{(ԉ<-mF>fMGRټMa$rW=nR7FB'CDgn6D(0ChI#t=B'^lc[Ca:4k圇Bgnr73묺>'zƒN+4x@.e\ը*>(rbEQ%IOa(3H J5 +MM \pI4vv2߫d%`^-[0w( +QD7AχOM&OWަlO=oO=lCrN8b:dqRޥ[^'~*wpLt}<~ ^wb\a(6$Ah{=LW# z[#O : qFQJLS,b0;4i/?GJ׼ܾgk03 8~& ߋ_\<%u%0ngZ=e,-TvXro +hBHpA uت0ݣ})"JtO~.Zv~g/Ap,g^*ekUd-Y2X\Y`߮vBjL -ʅC\ՉXA"@S(p*SEge}k(H)@cy^,:֭9{RM*(FSL2N@e)iZfm)o`U>6|Ə6}4 `p/LQ#TUWA ̈åOYli gj0'6G]KTnydtɽ|;gKf&02WvoXU9LPœBVՈXG3p p2aVЮ; )R#L0L&s6K,j|-Э7)A)c $X1}w6=s0[_ʡ6 D)r!\z.>s$:}xUAHꏉU`ZY%ۏ\Lt'FSܫzm]{οqiV&4`J|5Ӗw`vʬuM94f@'[ ֣~űI Cr:AY5~~S0-v< .)'H;k_cMe"8%3 TցO֛f/rrd@^)Ptjy9)\@cRo2cPh=&'k0P6Cy }DRjo# S# 0XpELXCHXs.@D8pAH{$w=w>(^DjQ?")Ԁ}YdEs-ʷ®ti ʢ`]&ˮӜܪ35AJ7ټd0bf4]J<2ؚ8H4ְeWB%WoM F=˚  y0HB5nTgNJ߃R_3;446+'o5C^lpU(A5\왵S0 +)!1+!79q'bWYNjܱ@U,s U} a,;ڎ8Ǹ3|Kd\P 7nAF&[FI!PK{[{)~?J58^,6lPcvhlL1^!> lqq2͢1]R&`MwpYĆ /JnMH2_K%ךI`&*pr|4'=;R~"BWS,Jc7ě:֛k ow%i3vܱy'_}Vt62bjvuit$U7`ТAq'k9t&lGr߰{t:N觶O?!H=ұV4PO۴8"5PbMF8U*шZ8p +&h,S^g" +qVX1OtӬ&ly'h: +/#¯'f+O"]X3>Oڈπ4N$XWܼz>^=6xLڼl +_]1VAAwS !!JSiMX38(+?ۓ2/BepjS =wzJ"b +p__.?M]f`n R"YHBIx LQdX6يNkY<)9OB7X 5x|\C.f`*c.D{ɊK6m;t;673?|rh~) +bqҢ29ն8P1{߱cH<^m|pȽ*㈦ Y>~e42*.01T At.S4޲Tg4}j5yf"tCɨREtN V.IEz]'6]g_vXY.wZ:1 ߍ!i^qi޾; S{*{xE=8!0J5'?A>!ϯz9Od]Tk^-EŠvT"iԠ&ʼ='r=sP`(/ɟ*ZZ㺶(oȷmyܻQ<[ڭv* Ea/S(V֒RO@8H~^ lu;?% H{/YxZpݔuH^Fu0LM[Y c@{]'ngUԳ9p\6ph1۝UZ)C9!q}MB$Lt/(dw? =-v n5Ox 202Pj+LK¶9ڼ?p aG?iB+u:͖îjѻWA*GpM豤c}fH7s'å[|y +2aK\s_k ?[U'jʘ/ęmAͪg'wnO,ƾ;XE*.Q~d  M[{윙;I8x聴c`[Ʊ5,ݎbwSe Rl~qӂk'qYYEpBQs3Lq驧 [Y._{FsP̜r}Yu]%i&6_G"kSw!ާ̸6U %׌yO_Q|_cұt$v@,ZY<6pPo5i !=76W2-ux?nRnExq89ˋ=*]QM[먚.ͅ7!#9<ոizȱ8˲O&Ԭ@imU&Q+֑\9_x:e7 !E3H)1gW" xQ4t<3XQ IUAEYI\jx@8LFaY1֖o-T ,{kI63gjU?CjԐ>л;B6OҨDIZ$Be vNlv¡:aOi@?ُ +ĖG +kGaWħ[`ۧb :D%h!ŸҞlaù ++GdGa9OKy69Łv-pUj˫ȥ-Z_؞(Ur,9)AEnlh5_^iN kJF BL(A6qʪu~"ϗgGd{u4^cF~3|)8;m̽(!Di0.w$ > +q_uqaUމ%޻= Z3~;%~_fVYTOoɍ4V5r)gjVFŕJym 9'Ġ́SM{ #_IUʚ?h?h +1DT7}͹%"4u8J:@CG-K?/s#БryDzi?޳Zt]1_}WM_&4|CM8S-m cWHyXfV,԰6u4bsv)2FѭNZO3Bn>ENvV34G{jAp%  2J bڲHΖ-6Rw3d{l[Ρi)xIZ@-^^uN}\BDU|‹Q'  ohڅ|vp N"2 5Z$Ȇ͒(mOj_c-KIK1!غV3j~ +1$(G{P|[6Dy*9l֟3=%}|C~uAУi+Q< +Fm,ޫeZΉ$ȾDVZ|Sڻ:= Fܸ0.}ҧgt(l&P_tzC Oeslu5SXд|UeܻS +**hF]phi"A $""j[P0;Ju\/HE#J4^=V']ZuHH\E 3N7IXS4bR oKU +Hn3;2DCFm]H[k<=wu@5WxiWEZO~z-~1*n7 IwBKt J͚} +wqBXk%.#iZekD2гdZC0 p9&c}Ǩ xiݺو鑣SXB#}s<ʒ"08IئIvg?.Cd5JY#&R&r%N_А+,.q4-2;,P/:AL8vHoڮ,ڗM8bٔchb1h阿ca=ЌSsM".jnmUSK/ H[.g,6V/{y 8yLdDЬ#g +ri+9ǷLmB!;J{A e"w$+ܙmW̒Q:8@nNpQHÏww*nMx+!{~dJrx![j䕽ʠiVqVe3W`+!v+K)pѼ#gDIS + K0-&~kprK*cv}-<8qGzGxj9XrJ[~5w .W\`/~jvPM!uT/.uCNu\tf p6 \R)'`r/#)htW0{7",^CJe}n&BIj 1o!32M8p40Eo }/Go"QCBwqG4WF*Cgs"[\Z*4><1nzHr5' ]sk {=LF8aWHDT15 HN}Lٕ n_R +G[v>s`}%8pob߶˼4 + iH5+cљRjr K*3{FRk)QQ6ךv(!_qrQ {xS,mС*/K3kիLqV܁^ĠE-TRd730h*s ߼~ nV2j^a\i(*˓Dz*ILV]ݘn 9q@])FM΄JwqME&$кsu?: f0BZ.ާfոe3\ s-)7BGb;b12ajՙTć۷l3> ׉8߶0 +%oD=|EY3aYd/$(HϏ'JVcI9#!A[r%JHE3lVT]≢/?wjC+%E/*7oQ+9>Ce "oXғ\4C>'hU>)VcӔk=-K4I*3e؊sd26elFGjAxTRBxΣq):[Fz΂slQ6fndAj`dJ wd(4hC!gED'J Y5. o&]hSg5Ol..GrڨH?~7Z*;f2x'LbŘ #% ;35HUԜ[ ȷ?6%n |"x[|^pe8=yd0hl'PNjؖz=neX?zF=ɉdg)ӝHZ=bWsqs ̦ @sQad\dJb!BK{ `a!Zm U745q)Hƕޔ.O)UҀ^ +T?"@?KSX8#nai(^U8`C!B,4y>&~l@'͓c4Z:_up.([;r¡ê:4k|V=،(Z@L~^r7[Jm"ߠv0jzNj?[q+xKp(@NۑuL;u{&wY +\Z!Jۆɺ37H6,MdyP!T«[ie2kOn$\>ُx!UsZP.gaKg:hL1\V_7PyTRkvKO>S tchU0:rmqnJbm٫>LYC lH@C!I0/t- 6峟֤(Ce܄I){9 >P%~`yl"䘛LaQ\_ʷ6u a=7 w(yd喠&'1 x)VRcDbڵO \.Ihɽa4(;`M|>v'E!iD  _oMjڋڢRWh++S é9ݶ/{ eH:L5Ԅq>Ʋ5+~۞,wa_0yЂ3K=#9vvQ(eƷ,WVҸ=Tx~ BgOuۍuZ}AO;i=uD%NAeW!!WxHC>I +BO+y⚚kGLL{P9^ytC+vX&/|?S.ӏ[ x`ʃ7OG8vlXǁk;KK;GP*`zR$n&"Va790S GA-U&/$ +[ }ބ0y9`"nIS"tDGMpIqQx2}z+оX y? +s],a[96ėx66<=BKXB_|q[xƭf,~gz^#Vl2|:Юhi)2iba;Oϟ]E9}fSD6QSmS 5]M'u{sM[̫9,,o"hГ7~5us e`JMsqDdeG9*5yyX4vyR,`bS64G>D/8/Z; ?a`b4rr5r# +endstream +endobj +50 0 obj +<< +/Type/FontDescriptor +/CapHeight 850 +/Ascent 850 +/Descent -200 +/FontBBox[-61 -250 999 759] +/FontName/IFKPZD+CMSS10 +/ItalicAngle 0 +/StemV 78 +/FontFile 49 0 R +/Flags 4 +>> +endobj +49 0 obj +<< +/Filter[/FlateDecode] +/Length1 717 +/Length2 4306 +/Length3 533 +/Length 4857 +>> +stream +xWX E"@7"M $! Q&J&UzTtTpXks>79w937;7\"0\ˆ AqQ`h:ʊT=W}i9II9ɻTT@Q% Pu#@q\@!H!cEU$`- P @QGaly=w8W04 + WXX 5=H}'C[MaOwu0$r@$& #QC\ O1M]?^_]0y+WrG` QHxuV@A0``wؿ'deeRgByuR H$ +tw0~Wq58 Red2#mlۧxLq#`RsY3Na!Yړoਔ;o[wy{sϳ5[.UDo3[G5X +JZ/r1;=NZ?-ZfkW_ SOul~WF`LlL.!{*"Ɓuڎ o Ea|^XC) [k!%2Ajz&guu:03xNlpR3p5;lNN<o+#Я:ҝ$|hos$B_Z@DžYj!]|7TIH M~Sl<%aXCo iE);(X{T@?bQPZQ*= +RwgyD}L3Q%~P(phʑe{_1x$ \3d/s1BfK,>fg#2IoV'cs_6Ok-K]Ie$eD.)SO۝,x2)&Y~梼և8U*bx;Et2sK&u`Yw4i]Sj d[\"}gW}ㆴWِKˤ۱}S?/it3pV%Z?5׏pqǯPtG'm_˅Cc.^qEYcK𾨏~tLQ'r< >^ng~Ag[pw^/?t)!y*cUEVG$2Z +펍G~{'B۵>\Ԇxlifen;@(V]"D^p$ jR} p]mޜnCҕ:XбH^j +s܏y)n\MùxxJӛoKq鷀N͔fT[GM큤I|ĕ6mbA8VÕ^ +EDXƝCw㬩i:@`6`%"XRi.e9E30RaĨ*JW3aawno53Yxޯڟe9ECI-P,/$j 3kN]O<(wAW<~M4ލ9 fV]V6> +Y.Q٩cdiMPOYZ=]8ruHE@g@ؠJyevOY)O#*yv,$ #3sSnF P\Kar9i1G/^_,>pp.^y 3nxH $$a7l? GIb(+zIb`bityU…# +EO͎>izQpޞC?wRj4#+ؓl̥HS]g*\'Hgk%/vC" ?T> +o2ƋZ_9,{µp NxйVM%n<(R9]LI鯟H+0aOt+G"&36Pж'\k? CK L"c!b}1dy@޼nzoQ/I|sz17P8; +Ȗ)z~gh=L(R#·[0q~V%"j\<ƀiQcӯFG LcRQ<>nZJ2,tW#]-YFU`_petBipBNBd^䪍PRPI|C UyUjYYݼOfzU-nOZ5f#yA*R'M]Z?ÐǦ5J0ϙAiRi抛aYp3 *_q\["uB/;gg3=KҨ H({;"HH,qb4L'i+xX"mFlX^WO$,G>E1&L GQK.:;WP׫q}<Cb`py]H㐺Tn ONu'J:vtGsb/*s @Ϥf5)X~giC~opaJ۫S.Z>ܔ,;|}V\ƛgv:4:Q:tQ+3'J! +yAd{s5#G$$F~L'sB9?kW՚P?7jjUfgE͊ +_tB֘0XjMbR.F;B+al O E +3d8ȩpoi2pR~:M5Rv&r~d +kMO"}SSj -w=0hޞ2>(ͱ{x+DxREeiVwFKf50여0! i"~̄!Kcr"uǢb:$(Ʃ|+}:^(Lw[gMͤ?O\[ -U2ڬLN<Ydlq7/CwmNh_ "f~UTl$Q>VZ:>~^;B$\|}}' zY^+ዄh6C>R'Sʼl{|.Ueִ\MOVm +E8H(,wɇItۖn$q%O)\_PihSyV{ZcC~ iJڂaJE%ڟCx->.ꇻ9Q!xymC34RڼE{kߋ +MzWX7'}֗ +ܲB\Fv%2>!m\G&7a w +_|#|'_CzTI޿dVm14䞥򰙺do =ZfCƗei-oL߳ةi/h9OV<Dtx %xWr޼@)O׮]U|?FK+/$t9o|L/iz媲9%!KMҎ(F X[8 3DeNτ*7Vi)36|Lz4#8Ww|D/& LSf^?o}uD|p,"N݇oimH%~q$mfF3P>^ wɲpn͠wMΣՕ Љh@F Ye<|-'3ZԌ҈)*wY&ObM;itZ_;jK[L(8٬n!?܌ jþ4 R:ɽqhw<&w/=4lFCR))EҫrLwHK5nŎ4)T>8;nm0;qk,;$k3?:Rܼ۫c  +&dtjG_L0&ј5_y]=e޳䴮\ VqiR1HAG/W%M]g+׫(gR4iBlb)!QLV&V(^jZE9ct(07<#Md.Ub`dX̸Qn~3~ͨZoXڨ-"ieg7ȉy͙ /dY6ċg-g|UC? 0O['*ށQlgpgrZUF j> +endobj +56 0 obj +<< +/Filter[/FlateDecode] +/Length1 712 +/Length2 2722 +/Length3 533 +/Length 3260 +>> +stream +xyx·Qv%1/ʬ[Ĉ{_jp]hepI#f |$#+#_~vm 6lq1NNmaj,rcnC<4,sA*f.k +A69Er =˟ֿ!2^FoTK +] +mȥe%GV:Ҷ3{i8כT.oP;և<\efI7frL +}3_V'q xdTVL(x>,O]ŹEZwƃcj2__=/cVn3?к~;^DIZl{''{m'6J1qIx΄ \J^.jf9k&g)ċT%P?1}cG02M\~jtNww0ۖ#duʤDG~U9CmVEcy9& TiaʺR3\v4q2P;tnF$)3 Š\#=eox;ƅⴥ–@ߎ7;+l3(TФǞou9ttzAzΠ슰FVإp;! BtxŜY!q)Ƈo$dZ锎\d0|7Y>~/*]N-<ܧ@ND+Tb.kpFPSM YvKoY=40|# Ч] +`0A5G5/ 癮pjsʾbSyof^z]h_zyTRчg֝j2i kN2.7jhJF钐A(Öv9f3 $V 7.4'_>XF9q4;^s"my2?[OĞxn4`|{w6p|XuEc)̗=&FJ˅<}Kex~Kh +>DqMTX)=U.?Q+D>K⥴3Jj + /ő)YC+ÍTi+jUs6 ZP+^.ΫC"b/vY-T)QqG)ˍo kzx<|]Y,UqeY}˺)|g!Ӧ:& ~֐dgJi =}3樂T?xTx[1wa՝޼_k|i_TfTPTaj[= v  zЊ [*.UQH)|LH%`׭IB>Ȑ<1i}MGXƦњ??ܤ05Zg4J v36C_ Q +}my(=>O H䓲M)-YoX80Ǵ8>x"9k3džȯz,R*uJ~P;&M1{5z>_>?%2!@ +endstream +endobj +61 0 obj +<< +/Type/FontDescriptor +/CapHeight 850 +/Ascent 850 +/Descent -200 +/FontBBox[-32 -250 1048 750] +/FontName/ELKXYQ+CMMI10 +/ItalicAngle -14.04 +/StemV 72 +/FontFile 60 0 R +/Flags 68 +>> +endobj +60 0 obj +<< +/Filter[/FlateDecode] +/Length1 727 +/Length2 1924 +/Length3 533 +/Length 2467 +>> +stream +xy<Ʉ CN=&1c6{ +cwl g8ca&0f,ɱ +"-GDc qBQѱP!s +ي=۹~~OSՅ0@k@#k +g$Ŵ$q@cmds zP&gEiTe3@6Lb$dB$:@`i ' t:pӖCA + +E + ˎ >nЗV(p{7I'ŤG +hcu5Nw"1>oo}Fbq9 pdQ@6k+ Rh\];N#3 @(gbM ).4 +!2)_ɡkaW? E/fLM PH +-0 +/#_f$(4f@OTH 0zۆz53i\C` 6U2 /?M0$ \D\jV")i/3t)c)ܬeƒKA {t%F &emkz1Iv3eP1dߵֿyk^n)2Z0])oɜGN#[^aBDzǮ {9VKܮj-GqhXp.4'yq_}am`ad>*Q:Z+Ku(/q-s[ u &vzv[{;KLӒ{;>X U,!dj?$xʔ75qe9%>>!w"Sdmu^] $;ʓv胴KwӦg].C6߿]:Z{/jx6!2n __د9# \8> /N.A0+ .׆m0J|\k.6u~ g_?,(ɸVY@,LoibNɧD]]+_pZR/{0`ܜwJty etZGIȫPyx9D[v!ORҊ Y)].?KA+7xf6efғ-VWŏb!ڔR*ž=^Lox'Τ~_mngtoY]{XyGd+tf#4rdԀ8^x*54-|XBs!:T( +6mZ)- ogDh7S5lkjC=qS#]윔3pGR\`iy}Rjy+he~pA\^bC`'6{@J￝"1Ĕ, +:jѨ|JIVygTV黲ՋS.}.YcК}Ɇd:Rg _l:Lq ^^䙈Rcyfi&ʇyMi@EC(-gOnQu`׮mZkCŧ3˹9#Ok-5 h/]Cw+' U:BdT`ӦFe9vMpݖ%Kd#O.Uwei?18 <~M!N>"\z?vkູ,> +endobj +64 0 obj +<< +/Filter[/FlateDecode] +/Length1 719 +/Length2 13310 +/Length3 533 +/Length 13867 +>> +stream +xEt%Ͳ)L1313333X)fL133K)YJ1WUMzW l-|$(IUE-̀RNnL|qE V+ <%8hf(aDA6.+ ?7<<%@dce ٘:MݬԝmnL=@_Ԁ@Ђ `ac0Z83 K < 4&ih Z3+93`n.nod/7:{PtT8Eʺۘ:Z,IٸJx-Tḽn w@GOM#&E?*6n_ǬwO@6^}_Om6IGs' G+)&w*11'F6vN7;+i:ڸe%,,,T⛓աqjB}Bxk"ڷ8xKe%a4GCfwm\ qϚ}.rJ"GvKI'CyTusw9STFv Y b.4XYk4ULx/\Ѝ|(&n$(úO蓔z=L[G>QwcE 9*\AJKto>|mWXlR޸o4cE]79rXK Vcs_,ҳ#~ȶȇ)^Bw2#2xZebHCdcdZte-{嬈j]aᵳE,wS`bOJd bBTen, d"଎f*Hm\sOqlaTqɫ|ݢrȈ,1 g>1f)|a +\{</%LuM׾BDwm:_ (+M&D󧟔4jrۃkH _9'r~S* +lm,B.%Y<D{❆ ~il)H9x]:CLJ쐾HMΟp/{=5*i a7$|9|,25"ȟl f(U;M=XM٭/] A"k#[=HⱝT~b{^Uc{ўM_GY슊RY]27Nr}qC$ԏg;g\&hG92mfakJ83文(vz,[5 +.R3=CTtfH'Kp<@]=}4MdTPGcA,ıD=yWcm*7#r}k.H$GѯozGpX{ZF]?lxŝ%k{ꙭi%u4ošo'(V5aDj|X>KgJ3ipLlM+/X0< "ӮL O3EĽiڨWTq9R3E{W۪0RTHsjHdqɼ9o-lx[JDaL'y +:on=f8kY|# QjHݘs^{tR%Ta" +Pu:wÛAO Ue/\( 0Be5|2hF|]KholAJ7j!Fnd& AV~Е|Wc3uΤR>MGh^V8yty@+!7+Ź_mmoܒWn#˧O3Ny:v#Jk{ U_#1STKԴj,$\|&ޣ伴3Ulu{ xZY=vh8 !Ry_*K{A @O8}qycI}wѴ#h wzwOGN-nlh]JX!A55CjtGe7[x<ͫE_s&o5&]ҔOUVe[ -G|9w1S'`Ny{B 9B1x3L34ȩneRX.-*a,D#|`HA.%_Cq +&DNe]Lf)J:k-gKT>r;̫gf0KW1nw^ǒ) Qb ݤ yУK5!]<=#d(F`tE%lq(|sYG[6 +L3ۮ5`Tuob=!#wl [})I,qpRJ]"q-k lEP!\ͦڴJ\UF eJ0n&8NTV1f#~S'P>`waNjLDz&`sdag/QEH|5@^lCM!=Ӊ?Έ߷ vk131]vd Y'-o^L]L0 4u^\NJG!(JRrg +A}GG_3!ܠaID;C̐-6)Fvsn&El Ti">>O.L.'n`)j+KE*mf/c'3adUC[[?-b|+MjѪ&h_Րe0e4=8?TNJ ӔxFA8C#aT +IȀbqfP(uS yS=(Lȋ %rWcUH3 [B +G/*$̍+Xcٰ9׃R ~#-e(f>.BaVˉtyMe|imt 4DK4R "r e(,117F?{E +tߪ'u qUSQx˘Js97|Ju_gIiSytmڐ!:ˉXo+ V_V##E)ZOZno Zַ 9$c 2$pWs]Ly@iX17aGzM~ ʒ!(K#+ٲ/eq˧4p_Qй8Y-e +R_  ie0fTL!V .B^`jt\h|-.Xnp.2mvn"d{,pgDhyǑcib5KFRmKRO +#nWjٱ9H~!N J +bPP +ԫ)rwn%ddҴeR+[1gZtuy铲W0#V .@gӤ_m 5 몇h5]}+CѵCG𽱄H{b@*: A_aCxtS;Wwc1.ir~#{#_lqnraE9؞LgCpa~SA˟YTpPeK/v[P,D!GǙ9]ḂdP VUBIԟ '/ǩG_ð{ɧWQSW`DQ' 嘆zW:bKD0ܯHռM$W9ds.`s;!y y׼nwt +л㾯 * owۀΙeB=f!MpsK{4iȇ$gpR}rMNojmq)~ԙsf 4P%=Κe)9>@9dEྐ{b,RM,.M1:hgI;\ +>GY?%B<]bL&ź!"j;,9^R {|(ʄ_M; vcq8SY~lR32sêi |R׾P ~J]n{ Q ;**d+ډZʓGӽӼ@HõM`FD{[-:UpGkIб Mq5e#ĉScXykFV`fejVIIX-ʃ%6pam->nz(|lÔHsR VJ9%Ҵ _?m?۰)3Jq_R}D3gNzmzߘrdV;3lkv@7'htT0ժ#/5*AwYbJ. fdM J]٩SRVKY4 I)ՕыY$k\Yy4~^5 +o8j ܓ{b-7j[.~4+XrCrUShLEՒ\RX4ZCm~(ɳ Jưǯ*lmzQt[u+wge BypNbef 8,pI]MJ'\ɣ +JCᗘ\[Ƹ 2Y։uޡSuL ktW9?v}>5ZaISj|3;OQ+Ikg$V!,&.&v([7>" +JyEqm cExnf@=]1~2[+Iwހعg?Fj)]F^H~^w}<+ E tchOȝ'}]7PH"s'H-zN]# s#Ah?3@s޹7a=p 29D>3'K{i CS8怇>uCqu*!(/Q>]/t$(2Z&'o*+GQ?eygUdV_'L~'.ˠK +T왟.yW~]2`cN CҘH۫!\ƻ΂?w|noS݆O эÈ}1,t㻀bDt)|';5}FHv_5cMsVի1! Y{xp0/|;ȫBIdɲ9rm+ܨ$]x_V0F0{mM [ ?[Mv*{{BZ#'z=2t^0yUƹբKlL>?R^U҂^~C,dGl/Y +YIPQd́WY}0ʊhN(1a狀|WvՆ;2Ӄ։^QPueTkohشQ<3 [>1,gOr#C߳:XoF3lnܼY rǙ ԌF)*|"/[ܠn_&]uqwu$9R.(UCY֕e?zXv2~Yv~b^΃9ėL|" +!*l}a3oӧǩR$Gg5g."llW,GRM{(=ܯ0rT4-^B j5wSCwb.d_&ו"괤#i mH&CkVA(V%ýWGl8BM/,BAFP s#lɓ Q<%K&7RRXAzђ>-TΡ\BscWsVaV8e,HV f, +k4ld$ThPUsU"A7\P @ŻL6 4~Xײ䵫uZMlS X@.3w+ iӲ#.=36HT [fiOB 3 7n\^VȷmX=~ݏ8fb1(szCu<ȥ[)V8k&GXĮLEED9\b]T_ܱn@`x4l|{zcZ2}|,%A> iBҟ{M'ef(zQn7ֲ +Mrp??MݥF%nW3*c jq]tp,.r&bZ8FS(_S%9֕VZc.\&PZ98z.:E[)#~0TFybfat',.w j_sDŽS 9BT+&X~Y»S|7uWp 8"UiN& J yvzLJ{Q}A44u*B&?] ,غC1EE}!nmP+@K˗%!HiS +vBwL<)~aYtƛj|e;2fcG0A׼f84[u}ѱPR-=(*I"k۶Lr't~Gړ1Zm"%6Mɬ ѡ)᧢] Зu:y).qs@=Y4p֍Zd5,Z) OhǾ(&{݆Ps{=o:HdxbGLf6wQ$go1 [^$_ ghEJVΉe0bBQ}шCXh"ߵ&ٺйmX?2+ua4{Qẖ)C fEw]Y=JLyqߤFnI c&IM?6+2[x%}NG\v jwys5ajgN_ c/Gdm| L wgьtQyK1#S0[ f#:[h]G5y6Pap? ym"܎=Mf0'Hj۶3Vk[sD:/X5X/'#Z(j+k+U̍jϻf%&0_`$v7skOW۬ N;$MkabFTV#e c"(lzO<[c$P/_QʭI**Xd6sO[=]ǁ-UOb cJt^ȮB+N}YIqj{?7A0Ѹ4xO" |ImeQg; Rg06:ҷvFw]-,.zՙ~303?Ħׇ.z +m p}^!ƣYa[@padOҥ?nx]%2lšbxƢ]-2590|^8]B9/heGyꢓ"]g$7Y3tduˏ{x= !OYWT)+ 1"bBu9T`i1{|ڜQUԔ:q ZKw.[ ٿRܰڢ)TJ]Z4آ͋m%Аm}K+XC`6]mČ.%MRy3u9Z^_#Q~ Ʀ%qmE1UH4FKκFZ .|"$DJo Y_kqgR;5]iv#tLjOPظȾ.:؀,nəukOCs໛L{ WV }/  -@;esɌJqt:.wqy\!cO󬠫pζ(-*瘳H\p4; +=}bt9J9Jm4dvؙca#uY4̻^ )6)e\FD=uRY(J3,yB6V,u˭ywj'Tv4X>&Ao,o^yBXJ\= zj:XZCeyqOD)+`T5Nӻۘpu ;Y'{Y"QʛDQ؇$yy b&&`#*˞ZFx/j@JF lz Nֻi)s[ޥ4݀ BzTB,!3ܬcL,]%Q* NEk0C͜Pمl0 +Aw +sbb^bڟlpdHyĹkVFg2_tcͦ-*\G=}A·_LGMn+F )sV&{;ӧhr6|Z̺7'*XvɠKz%oɦ/|::6*6ts^15+PAfkԇ6#״$Lae~K9+(:D?G T;>R t^3[tڧ'}tԿ—d-u +y=| `>a0`")2P?hQC 9Ύgy~b#g,'YZl;neF\aᅽ \Wi>ߩMgvdW9EB @P!4Ӛ(F Rakkɘp"\x(ņ :{£Np!( t?\#(r)9pL t{NEMn%Luqg&hڧ4m#g*9naWMgzS2˭eGФ*D1lnGSnuɾm?ƮD qF?('\Iz_C _{^31g ˝5IQxiv̷w M ={Ϸ#1n?}S23*cmZț#g~Ձ`XԎ{'QeVe.f P]ePjhqu6AK;Nb sWFcM;QwA~_g/ꇤ3h[4h > +endobj +96 0 obj +<< +/Filter[/FlateDecode] +/Length1 728 +/Length2 11465 +/Length3 533 +/Length 12027 +>> +stream +xStf_bUQm;ymV*m۬bow7Μbޟo]`ntt5E &҇mgϊhAn%5m&;R O +m^q9ZS{iuQw˴D=_IQ8MP!}vgm\Eկ{CO׀ ːx1ŭDu^,QpgĭO$fdF~nh +߼؎f6֍aTB-jWlQ pرub@P}'òFǁӡm_,I]d 0Nٵ:gBVC{eԄQ\qy䅉) +5BMH,WhM60KrY-cR]bچsb6f'圂;M!s3pG7Xjo~$pes$>uN*xkDh1zukձP'ٻ^ĶJQf˅XWwD A{2C ;fJ__`L!ReG<5@IO^cHa@P.E.cW"9vw* + 5#ȋ^aqX"^Ob}SFUN-Cjnq׮[ghOм]gdVsDzLWzWO]r)*yYQ_6]~V`/`δ 5,+V2ܢ0O$ܮuص4Ί~7Yx?GŪ`3.ä9qkϲ䎎 eï)K љ8nS#E\FUߙ)xqby1g. zU|{\_ 5|,Cԏ躖 +bͮOژ!%HHۍr.4 U'bqx=_^} 0rh`nD姛}eH ޳0ZA=PbߴK0vCfEûe5N]f^RPئZ)+h]q$7_ ݅;j + ̃i6 +1pj# 0գYXME|i~˴{ܷ%eLKtZ69OuLcwmK5R8'~{~?}YO&F5uV(LmY$5ZQQ?x"3_?y共Z L{\? IFxx|p ^+k;WMQ!oz8ް03p'C3İA|-Bj0\ 揗va"u:|%^FP-=DhyAu7}^+,(WPwЦCt6lXxoEʰ z?nQNAT0 +AI2^5*Bv[T/D!uL}rKjjSy87?Ɩ`&¥Z3JݽBGR +y /OFe68rjھ>zA# ,6lnm+^>7e_cZ@\;$A!8He0G !S 6)`Q2 +|\Q ~X]F7Ggq^\4ja.b6d U)GJ|:9ծ`P/s6M9oHf}(Vj&pJ5d@GpJX73F"e `_3S^4lE_N(*\QEgROdQf\>+_ݻD-.N ͹1 "B.#vRl˿3mCnK#f#~Rz>k&HgѲ˕~@4>i"I.taVjw"1& ++Lݝ?=fXaRcgv1n΋At-d쏾Jp/s-<6G +p?_^R MImFj %vfmDlZrOmצe^m0+<ZoxhJ^}\`F1vqww\I>:(HItŮ> I_DvKbU؅BtrDx֠fnYtA+'mySE8:m~j`cy^)6WՍhHUѱEg0_6W,4 +<7%ٳZAiA5*VzƢ^E7õI\_\,?%Ŀ.0G; ;pR6w 8)qZCOs΅)/v(I(pg F'9‚uXvTY +0_uSFcXHP+|ql{ +_Dyj#~v*XJk$z?._'~@̊&tYϞ~̣cѴ@Dl `gy)+X#h'"eģӨ$\ok06r~clKE2(tLyvVzAk=2DżLQUƋ{4bGD?#&pҋ톶R&n_'C^G䍇XЬJzI^1w 2ztΆaq MV9O#&uުKSy;.bp=BqѦA%SH`َ@_v@կa.=h%tUwCkGedPk7G5t)iӝ/WBUq~fya(a3+CE^ { s-QAa% +O*a^d7,8MΫF6a]nd; +w=#E&+lzC&*Zb鈗5xY6?MFvX:s#XZ\S짗3[.K/`(VQ,n| 5aFƊDXw!={rCݷ"xRJ+9Ɔ__(8 _-uʢnLf6o) ު{ESSQ+7۳| +M'kUݻE0o$Wr@Z]k.m)9gw3m~2.fέ=Dj۲: h X^c}6Ŕ[ě&Y#I^,kJV2e T* +{&a55\Q S$a)w PI'#c\y"gホ[QL_NG'85|9?)bMc%+dk߀uˁtA)h@w52kG+K"V݈ơf^D{x*ztLci&v)A:+YI_<@%aw;j.Z:\vy \_-Q2f=;RV'iRi)>YDħؼduy>$\]1RlIwM1IC>|dӥE X$$Vrc2+,K+K[]01ߢvϗ]FoA:W?Ko'׈dш.5Xd[!hmc2UsHݲF{;ƒ$$nAfVjyXp[{ԎBZ|=g zdI㕈Üx 8`YiŐ-ǤL1 ba:dsDu7iT|4ᦧWKlIE7LTt,Ctbw[:3X5 !Ž[lnb+ + 7/3@{P>םjC;=  +hI;@i{MV,QL>}Fmʝ(d2PI ̉cc~ܤaVx)3iNGԒ6$<)%Na5v$Çxۛ97qY!'g/~')Mamj nQo5zDZ:`CΚ\&% $:QhMé7jh@27SG[s +)ปK-} ( j +}S"kq }"*7s"XGd} +~|̘cvK(d*C?qruc A7ͥA!=ѳFnȺ=0SJkw0JĻ2>SjiΞ^1 3?HaGJYVQh[s1b? G<`}F +IݤjVk_.ODJ7ɉaCEu[ F-ϺKXQa~`l:@0Bl "M40STuI'!*ՙX$3)L5d6=?:gOPA%$d^r y"90dt-)EԑD.]>~ P^&[L: {XĈdWE|oo{"a >"uU]/8Mw#6$Sg1R92Q *#W1Wۯˇ$,~EH~ٜhjjB_sY}.qS2j$:f&.yeuUvaYЉ$z")q +\e~+:mP'~q}Y4h0-#;)Aߝ¾ "YBJ7xMὢW FW-a?“ _x/$5tg  tyl7bGBFУmD}30f0Tz?S}!- +uwKɱvm"q#a/|)I.(;ܾ̠IQKH.XFsմɖϕDŽcui.E;E.ܝ 8Ng-bflN_mʝY.2.Yn;w$0\+ѱTy>w%}\{+N<4YNV{f[A(x3Z-wjd6[-[Gzpmn{I^41,_' +,p`2xJ;> K+% dȐ Jq$cNȩ욫tA%`jA&@X[vvU\ujgPτ,:aiU0zthi#3>TmB^KvAϧ*87f!qow[Pш/^z=)ӵ3#wip,:g[Aj'̙(㇢9{@ iOv^Fkr@!8]pق +5RJG=ߩ{(t^U#s#U ]sAl)Jk`\qaseA6*g.A].Wfb7[F )}~Rnd` JӡI)Ac[y ;Κ5 +ȝߤ=NvXAuu*=!Ա7!uB9w3lˮ$|'ǩ4[Z6|P&ԔD4aEt<e, o.I=W;$dq!;[3U#tTa YR&֦QZ}2Lkt=ec0_sv(ȗ}e=_m PF!gx{ec +1ĭƝS KH$tIsoWlyYfmaD5>ZE&{c^u5Ɛ* +E α=^9&iF' k=-a~ ?'֞ӗ)N+Y}J|_W\&HEcgddW}wSQ,r|ZȽ^CB=6^zXZT| W2]EmgvV^fUS?.kt4Œ,mhDeՅOr|bI4d_җQ "ao{ިҴ#Y|0ŐLht<_ߟI^d6vCaHYp> S4ysUh;2-O/vT5_ţGWn~™VtQb]_ ӚF66Gc}s@|v{ lr%KВ{[ I98|6iG13IZ@C׍.3vV5wmca#9jooeuWi"=ɨ +ЧVHϜ43*ޛŬw~O͞ +ݰaMEvq|yf3K"'`m(Ro +qՆk bWSQK吨Ub{&PV@Fo1z5(&X(f7KК.i:0J L5Y}cFA)6 ]3mƼh_fPT=MEDnuII*\mm}dLSʩ+P.UHik_!3!Ry63i2,2۷].þp@2$o =oA=gxՀR)O*X)/DHS 4.?>?GJ&jK%gd۸8󠼂Kܴ 0+M2Fz,,-FP +e1+l )"] ˁa\h;w#V[.Kޮi@G5@㔔ǵA4 LmN.Nlt +endstream +endobj +212 0 obj +<< +/Type/FontDescriptor +/CapHeight 850 +/Ascent 850 +/Descent -200 +/FontBBox[-62 -250 1123 750] +/FontName/GNGQEI+CMSL10 +/ItalicAngle -9.46 +/StemV 79 +/FontFile 211 0 R +/Flags 68 +>> +endobj +211 0 obj +<< +/Filter[/FlateDecode] +/Length1 722 +/Length2 1967 +/Length3 533 +/Length 2512 +>> +stream +xgXSi@( р&M  HԐ0I ("bPEД"H2Ei#lqZgsy|~l:O)d:Ll1H# 0  )H==$PܾB@` /J9K(vhH%dK? !8,p =h"p pi 5!$pt !!@ +4.p˩ p)21 [ +w5cD[,sA%A:($:Hl(xJ +~]+:H>DP׃k| 4s踳7H =wx_04,l-ͬT<د];,Lw +_/5;$*D$}}y~G>#Kc +260uP:J{(M@WW3ZBW@dڛ2@VNj{UW,7 )p"s;oW*Dc㷷6<49tdAQ QAS?GQ͗,#kV7k\0<z 6) =O 𧲌E#_՗?AK,7t{&^wW,X$#+6>5 u?r^NQx@|:>md[=yBVqc϶%3Yy*"дdam^fYa +ݲ->oSE7|&ӵ_٘òF*Boj\X9"I{زJ”|FCaֹQ5՞8hmɃ 97f+.!ixBZx H^k/lPwv>KkM< 5޵JPISwgҞG/ E]-#SxeWj֤gX ^ffp ߡ3u'gMiG3r:U |#Z3J*' Ųu{*+vԞ}.86>41\#e ٬4:(Y옫Ԫ=/dV`z*2Leu>jCr5VuI;=[I\OO UégC`aw31ٿ6/$W[=ޖߛsWmdg%K)0c"vJi{VlҢCO|2"SUsԩ[M:bE\9"S'BEr!EMy +Җch{R.QO5QksJ*J`{{J[~F 4$:Ut\޸$WE3tS^ SPJ]ݛIM +f_aY_Qk.m}VIohMՓc1KA+p|X+3ǂSlk GZt֤;##tLE ZKDu٥krKEY6 :92,R>c2eж`\?VMO>#Rr ^z\Dڠ=E feJ8!F*Б/QQ##g&g?V2+tEL7U$3 ql>m =E `ʊ )}>$wȹ-GC)Cvѝj/^KU sѥ5?UTDefPBs (*sb`6s͆[/?09NA}%ȿO`LqOQeZΧ +_Iԍ?p̠9mtu+$ 3>2qQl<~2?]j/5w_E_Gఇ=-Ѹnn$qVSd\껖fB7l#Cz6 ~iDOGP+M>V}JM5,4dp"cwE%}}1`qne}Dr饥~Ns XQ# caN*Vgcw611*imJzo:LU۪+p:Fhm=s%%ܴԻX1M&Bs~ͶOl,|S*%xZ'y;(+,:X/'pDKSHX/ە& +endstream +endobj +1 0 obj +<< +/Creator( TeX output 2006.01.19:1207) +/Producer(dvipdfm 0.13.2c, Copyright \251 1998, by Mark A. Wicks) +/CreationDate(D:20060119120728+01'00') +>> +endobj +5 0 obj +<< +/Type/Page +/Resources 6 0 R +/Contents[21 0 R 4 0 R 22 0 R 23 0 R] +/Parent 293 0 R +>> +endobj +25 0 obj +<< +/Type/Page +/Resources 26 0 R +/Contents[21 0 R 4 0 R 33 0 R 23 0 R] +/Parent 293 0 R +>> +endobj +35 0 obj +<< +/Type/Page +/Resources 36 0 R +/Contents[21 0 R 4 0 R 37 0 R 23 0 R] +/Parent 293 0 R +>> +endobj +293 0 obj +<< +/Type/Pages +/Count 3 +/Kids[5 0 R 25 0 R 35 0 R] +/Parent 292 0 R +>> +endobj +39 0 obj +<< +/Type/Page +/Resources 40 0 R +/Contents[21 0 R 4 0 R 41 0 R 23 0 R] +/Parent 294 0 R +>> +endobj +43 0 obj +<< +/Type/Page +/Resources 44 0 R +/Contents[21 0 R 4 0 R 45 0 R 23 0 R] +/Parent 294 0 R +>> +endobj +47 0 obj +<< +/Type/Page +/Resources 48 0 R +/Contents[21 0 R 4 0 R 52 0 R 23 0 R] +/Parent 294 0 R +>> +endobj +294 0 obj +<< +/Type/Pages +/Count 3 +/Kids[39 0 R 43 0 R 47 0 R] +/Parent 292 0 R +>> +endobj +54 0 obj +<< +/Type/Page +/Resources 55 0 R +/Contents[21 0 R 4 0 R 67 0 R 23 0 R] +/Parent 295 0 R +>> +endobj +69 0 obj +<< +/Type/Page +/Resources 70 0 R +/Contents[21 0 R 4 0 R 71 0 R 23 0 R] +/Parent 295 0 R +>> +endobj +73 0 obj +<< +/Type/Page +/Resources 74 0 R +/Contents[21 0 R 4 0 R 80 0 R 23 0 R] +/Parent 295 0 R +>> +endobj +295 0 obj +<< +/Type/Pages +/Count 3 +/Kids[54 0 R 69 0 R 73 0 R] +/Parent 292 0 R +>> +endobj +83 0 obj +<< +/Type/Page +/Resources 84 0 R +/Contents[21 0 R 4 0 R 90 0 R 23 0 R] +/Parent 296 0 R +>> +endobj +93 0 obj +<< +/Type/Page +/Resources 94 0 R +/Contents[21 0 R 4 0 R 99 0 R 23 0 R] +/Parent 296 0 R +>> +endobj +101 0 obj +<< +/Type/Page +/Resources 102 0 R +/Contents[21 0 R 4 0 R 103 0 R 23 0 R] +/Parent 296 0 R +>> +endobj +105 0 obj +<< +/Type/Page +/Resources 106 0 R +/Contents[21 0 R 4 0 R 107 0 R 23 0 R] +/Parent 296 0 R +>> +endobj +296 0 obj +<< +/Type/Pages +/Count 4 +/Kids[83 0 R 93 0 R 101 0 R 105 0 R] +/Parent 292 0 R +>> +endobj +292 0 obj +<< +/Type/Pages +/Count 13 +/Kids[293 0 R 294 0 R 295 0 R 296 0 R] +/Parent 3 0 R +>> +endobj +109 0 obj +<< +/Type/Page +/Resources 110 0 R +/Contents[21 0 R 4 0 R 114 0 R 23 0 R] +/Parent 298 0 R +>> +endobj +117 0 obj +<< +/Type/Page +/Resources 118 0 R +/Contents[21 0 R 4 0 R 119 0 R 23 0 R] +/Parent 298 0 R +>> +endobj +121 0 obj +<< +/Type/Page +/Resources 122 0 R +/Contents[21 0 R 4 0 R 123 0 R 23 0 R] +/Parent 298 0 R +>> +endobj +298 0 obj +<< +/Type/Pages +/Count 3 +/Kids[109 0 R 117 0 R 121 0 R] +/Parent 297 0 R +>> +endobj +125 0 obj +<< +/Type/Page +/Resources 126 0 R +/Contents[21 0 R 4 0 R 127 0 R 23 0 R] +/Parent 299 0 R +>> +endobj +129 0 obj +<< +/Type/Page +/Resources 130 0 R +/Contents[21 0 R 4 0 R 131 0 R 23 0 R] +/Parent 299 0 R +>> +endobj +133 0 obj +<< +/Type/Page +/Resources 134 0 R +/Contents[21 0 R 4 0 R 135 0 R 23 0 R] +/Parent 299 0 R +>> +endobj +137 0 obj +<< +/Type/Page +/Resources 138 0 R +/Contents[21 0 R 4 0 R 139 0 R 23 0 R] +/Parent 299 0 R +>> +endobj +299 0 obj +<< +/Type/Pages +/Count 4 +/Kids[125 0 R 129 0 R 133 0 R 137 0 R] +/Parent 297 0 R +>> +endobj +141 0 obj +<< +/Type/Page +/Resources 142 0 R +/Contents[21 0 R 4 0 R 143 0 R 23 0 R] +/Parent 300 0 R +>> +endobj +145 0 obj +<< +/Type/Page +/Resources 146 0 R +/Contents[21 0 R 4 0 R 147 0 R 23 0 R] +/Parent 300 0 R +>> +endobj +149 0 obj +<< +/Type/Page +/Resources 150 0 R +/Contents[21 0 R 4 0 R 151 0 R 23 0 R] +/Parent 300 0 R +>> +endobj +300 0 obj +<< +/Type/Pages +/Count 3 +/Kids[141 0 R 145 0 R 149 0 R] +/Parent 297 0 R +>> +endobj +153 0 obj +<< +/Type/Page +/Resources 154 0 R +/Contents[21 0 R 4 0 R 155 0 R 23 0 R] +/Parent 301 0 R +>> +endobj +157 0 obj +<< +/Type/Page +/Resources 158 0 R +/Contents[21 0 R 4 0 R 159 0 R 23 0 R] +/Parent 301 0 R +>> +endobj +161 0 obj +<< +/Type/Page +/Resources 162 0 R +/Contents[21 0 R 4 0 R 163 0 R 23 0 R] +/Parent 301 0 R +>> +endobj +165 0 obj +<< +/Type/Page +/Resources 166 0 R +/Contents[21 0 R 4 0 R 167 0 R 23 0 R] +/Parent 301 0 R +>> +endobj +301 0 obj +<< +/Type/Pages +/Count 4 +/Kids[153 0 R 157 0 R 161 0 R 165 0 R] +/Parent 297 0 R +>> +endobj +297 0 obj +<< +/Type/Pages +/Count 14 +/Kids[298 0 R 299 0 R 300 0 R 301 0 R] +/Parent 3 0 R +>> +endobj +169 0 obj +<< +/Type/Page +/Resources 170 0 R +/Contents[21 0 R 4 0 R 171 0 R 23 0 R] +/Parent 303 0 R +>> +endobj +173 0 obj +<< +/Type/Page +/Resources 174 0 R +/Contents[21 0 R 4 0 R 175 0 R 23 0 R] +/Parent 303 0 R +>> +endobj +177 0 obj +<< +/Type/Page +/Resources 178 0 R +/Contents[21 0 R 4 0 R 179 0 R 23 0 R] +/Parent 303 0 R +>> +endobj +303 0 obj +<< +/Type/Pages +/Count 3 +/Kids[169 0 R 173 0 R 177 0 R] +/Parent 302 0 R +>> +endobj +181 0 obj +<< +/Type/Page +/Resources 182 0 R +/Contents[21 0 R 4 0 R 183 0 R 23 0 R] +/Parent 304 0 R +>> +endobj +185 0 obj +<< +/Type/Page +/Resources 186 0 R +/Contents[21 0 R 4 0 R 187 0 R 23 0 R] +/Parent 304 0 R +>> +endobj +189 0 obj +<< +/Type/Page +/Resources 190 0 R +/Contents[21 0 R 4 0 R 191 0 R 23 0 R] +/Parent 304 0 R +>> +endobj +193 0 obj +<< +/Type/Page +/Resources 194 0 R +/Contents[21 0 R 4 0 R 195 0 R 23 0 R] +/Parent 304 0 R +>> +endobj +304 0 obj +<< +/Type/Pages +/Count 4 +/Kids[181 0 R 185 0 R 189 0 R 193 0 R] +/Parent 302 0 R +>> +endobj +197 0 obj +<< +/Type/Page +/Resources 198 0 R +/Contents[21 0 R 4 0 R 199 0 R 23 0 R] +/Parent 305 0 R +>> +endobj +201 0 obj +<< +/Type/Page +/Resources 202 0 R +/Contents[21 0 R 4 0 R 206 0 R 23 0 R] +/Parent 305 0 R +>> +endobj +209 0 obj +<< +/Type/Page +/Resources 210 0 R +/Contents[21 0 R 4 0 R 217 0 R 23 0 R] +/Parent 305 0 R +>> +endobj +305 0 obj +<< +/Type/Pages +/Count 3 +/Kids[197 0 R 201 0 R 209 0 R] +/Parent 302 0 R +>> +endobj +220 0 obj +<< +/Type/Page +/Resources 221 0 R +/Contents[21 0 R 4 0 R 222 0 R 23 0 R] +/Parent 306 0 R +>> +endobj +224 0 obj +<< +/Type/Page +/Resources 225 0 R +/Contents[21 0 R 4 0 R 226 0 R 23 0 R] +/Parent 306 0 R +>> +endobj +228 0 obj +<< +/Type/Page +/Resources 229 0 R +/Contents[21 0 R 4 0 R 230 0 R 23 0 R] +/Parent 306 0 R +>> +endobj +232 0 obj +<< +/Type/Page +/Resources 233 0 R +/Contents[21 0 R 4 0 R 234 0 R 23 0 R] +/Parent 306 0 R +>> +endobj +306 0 obj +<< +/Type/Pages +/Count 4 +/Kids[220 0 R 224 0 R 228 0 R 232 0 R] +/Parent 302 0 R +>> +endobj +302 0 obj +<< +/Type/Pages +/Count 14 +/Kids[303 0 R 304 0 R 305 0 R 306 0 R] +/Parent 3 0 R +>> +endobj +236 0 obj +<< +/Type/Page +/Resources 237 0 R +/Contents[21 0 R 4 0 R 238 0 R 23 0 R] +/Parent 308 0 R +>> +endobj +240 0 obj +<< +/Type/Page +/Resources 241 0 R +/Contents[21 0 R 4 0 R 242 0 R 23 0 R] +/Parent 308 0 R +>> +endobj +244 0 obj +<< +/Type/Page +/Resources 245 0 R +/Contents[21 0 R 4 0 R 246 0 R 23 0 R] +/Parent 308 0 R +>> +endobj +308 0 obj +<< +/Type/Pages +/Count 3 +/Kids[236 0 R 240 0 R 244 0 R] +/Parent 307 0 R +>> +endobj +248 0 obj +<< +/Type/Page +/Resources 249 0 R +/Contents[21 0 R 4 0 R 250 0 R 23 0 R] +/Parent 309 0 R +>> +endobj +252 0 obj +<< +/Type/Page +/Resources 253 0 R +/Contents[21 0 R 4 0 R 254 0 R 23 0 R] +/Parent 309 0 R +>> +endobj +256 0 obj +<< +/Type/Page +/Resources 257 0 R +/Contents[21 0 R 4 0 R 258 0 R 23 0 R] +/Parent 309 0 R +>> +endobj +260 0 obj +<< +/Type/Page +/Resources 261 0 R +/Contents[21 0 R 4 0 R 262 0 R 23 0 R] +/Parent 309 0 R +>> +endobj +309 0 obj +<< +/Type/Pages +/Count 4 +/Kids[248 0 R 252 0 R 256 0 R 260 0 R] +/Parent 307 0 R +>> +endobj +264 0 obj +<< +/Type/Page +/Resources 265 0 R +/Contents[21 0 R 4 0 R 266 0 R 23 0 R] +/Parent 310 0 R +>> +endobj +268 0 obj +<< +/Type/Page +/Resources 269 0 R +/Contents[21 0 R 4 0 R 270 0 R 23 0 R] +/Parent 310 0 R +>> +endobj +272 0 obj +<< +/Type/Page +/Resources 273 0 R +/Contents[21 0 R 4 0 R 274 0 R 23 0 R] +/Parent 310 0 R +>> +endobj +310 0 obj +<< +/Type/Pages +/Count 3 +/Kids[264 0 R 268 0 R 272 0 R] +/Parent 307 0 R +>> +endobj +276 0 obj +<< +/Type/Page +/Resources 277 0 R +/Contents[21 0 R 4 0 R 278 0 R 23 0 R] +/Parent 311 0 R +>> +endobj +280 0 obj +<< +/Type/Page +/Resources 281 0 R +/Contents[21 0 R 4 0 R 282 0 R 23 0 R] +/Parent 311 0 R +>> +endobj +284 0 obj +<< +/Type/Page +/Resources 285 0 R +/Contents[21 0 R 4 0 R 286 0 R 23 0 R] +/Parent 311 0 R +>> +endobj +288 0 obj +<< +/Type/Page +/Resources 289 0 R +/Contents[21 0 R 4 0 R 290 0 R 23 0 R] +/Parent 311 0 R +>> +endobj +311 0 obj +<< +/Type/Pages +/Count 4 +/Kids[276 0 R 280 0 R 284 0 R 288 0 R] +/Parent 307 0 R +>> +endobj +307 0 obj +<< +/Type/Pages +/Count 14 +/Kids[308 0 R 309 0 R 310 0 R 311 0 R] +/Parent 3 0 R +>> +endobj +3 0 obj +<< +/Type/Pages +/Count 55 +/Kids[292 0 R 297 0 R 302 0 R 307 0 R] +/MediaBox[0 0 595 842] +>> +endobj +21 0 obj +<< +/Length 1 +>> +stream + +endstream +endobj +23 0 obj +<< +/Length 1 +>> +stream + +endstream +endobj +4 0 obj +<< +/Length 33 +>> +stream +1.00028 0 0 1.00028 72 769.82 cm +endstream +endobj +312 0 obj +<< +>> +endobj +313 0 obj +null +endobj +314 0 obj +<< +>> +endobj +2 0 obj +<< +/Type/Catalog +/Pages 3 0 R +/Outlines 312 0 R +/Threads 313 0 R +/Names 314 0 R +>> +endobj +xref +0 315 +0000000000 65535 f +0000320473 00000 n +0000328789 00000 n +0000328434 00000 n +0000328639 00000 n +0000320637 00000 n +0000006724 00000 n +0000000009 00000 n +0000223513 00000 n +0000223329 00000 n +0000000913 00000 n +0000230483 00000 n +0000230297 00000 n +0000001906 00000 n +0000002823 00000 n +0000236628 00000 n +0000236433 00000 n +0000004439 00000 n +0000239141 00000 n +0000238953 00000 n +0000005390 00000 n +0000328539 00000 n +0000006307 00000 n +0000328589 00000 n +0000006658 00000 n +0000320740 00000 n +0000010332 00000 n +0000256453 00000 n +0000256264 00000 n +0000006785 00000 n +0000266976 00000 n +0000266786 00000 n +0000007731 00000 n +0000008667 00000 n +0000010277 00000 n +0000320845 00000 n +0000011167 00000 n +0000010394 00000 n +0000011123 00000 n +0000321037 00000 n +0000011785 00000 n +0000011229 00000 n +0000011730 00000 n +0000321142 00000 n +0000013566 00000 n +0000011847 00000 n +0000013522 00000 n +0000321247 00000 n +0000016758 00000 n +0000279838 00000 n +0000279651 00000 n +0000013628 00000 n +0000014568 00000 n +0000016681 00000 n +0000321440 00000 n +0000024098 00000 n +0000284995 00000 n +0000284809 00000 n +0000016820 00000 n +0000017788 00000 n +0000288563 00000 n +0000288369 00000 n +0000018742 00000 n +0000019688 00000 n +0000291330 00000 n +0000291144 00000 n +0000020665 00000 n +0000021410 00000 n +0000023998 00000 n +0000321545 00000 n +0000025948 00000 n +0000024160 00000 n +0000025881 00000 n +0000321650 00000 n +0000062362 00000 n +0000026010 00000 n +0000026323 00000 n +0000026356 00000 n +0000026389 00000 n +0000026449 00000 n +0000061386 00000 n +0000062262 00000 n +0000062328 00000 n +0000321843 00000 n +0000085081 00000 n +0000062440 00000 n +0000062753 00000 n +0000062786 00000 n +0000062819 00000 n +0000062879 00000 n +0000083488 00000 n +0000084958 00000 n +0000085047 00000 n +0000321948 00000 n +0000090588 00000 n +0000085159 00000 n +0000305508 00000 n +0000305313 00000 n +0000086066 00000 n +0000087048 00000 n +0000090487 00000 n +0000322053 00000 n +0000092806 00000 n +0000090651 00000 n +0000092739 00000 n +0000322161 00000 n +0000093816 00000 n +0000092870 00000 n +0000093749 00000 n +0000322464 00000 n +0000111629 00000 n +0000093880 00000 n +0000109006 00000 n +0000109041 00000 n +0000109102 00000 n +0000111526 00000 n +0000111593 00000 n +0000322572 00000 n +0000114094 00000 n +0000111710 00000 n +0000114037 00000 n +0000322680 00000 n +0000117138 00000 n +0000114158 00000 n +0000117070 00000 n +0000322879 00000 n +0000119728 00000 n +0000117202 00000 n +0000119649 00000 n +0000322987 00000 n +0000122501 00000 n +0000119792 00000 n +0000122433 00000 n +0000323095 00000 n +0000125053 00000 n +0000122565 00000 n +0000124996 00000 n +0000323203 00000 n +0000127004 00000 n +0000125117 00000 n +0000126925 00000 n +0000323410 00000 n +0000129383 00000 n +0000127068 00000 n +0000129293 00000 n +0000323518 00000 n +0000131012 00000 n +0000129447 00000 n +0000130922 00000 n +0000323626 00000 n +0000133880 00000 n +0000131076 00000 n +0000133801 00000 n +0000323825 00000 n +0000136773 00000 n +0000133944 00000 n +0000136671 00000 n +0000323933 00000 n +0000137210 00000 n +0000136837 00000 n +0000137154 00000 n +0000324041 00000 n +0000140172 00000 n +0000137274 00000 n +0000140070 00000 n +0000324149 00000 n +0000141232 00000 n +0000140236 00000 n +0000141142 00000 n +0000324454 00000 n +0000144268 00000 n +0000141296 00000 n +0000144155 00000 n +0000324562 00000 n +0000145703 00000 n +0000144332 00000 n +0000145624 00000 n +0000324670 00000 n +0000148128 00000 n +0000145767 00000 n +0000148026 00000 n +0000324869 00000 n +0000148782 00000 n +0000148192 00000 n +0000148714 00000 n +0000324977 00000 n +0000151318 00000 n +0000148846 00000 n +0000151216 00000 n +0000325085 00000 n +0000154155 00000 n +0000151382 00000 n +0000154053 00000 n +0000325193 00000 n +0000155104 00000 n +0000154219 00000 n +0000155013 00000 n +0000325400 00000 n +0000157370 00000 n +0000155168 00000 n +0000157280 00000 n +0000325508 00000 n +0000169480 00000 n +0000157434 00000 n +0000167286 00000 n +0000167321 00000 n +0000167382 00000 n +0000169354 00000 n +0000169444 00000 n +0000325616 00000 n +0000185673 00000 n +0000317846 00000 n +0000317651 00000 n +0000169561 00000 n +0000170484 00000 n +0000182813 00000 n +0000182848 00000 n +0000182909 00000 n +0000185534 00000 n +0000185637 00000 n +0000325815 00000 n +0000188685 00000 n +0000185754 00000 n +0000188583 00000 n +0000325923 00000 n +0000191770 00000 n +0000188749 00000 n +0000191657 00000 n +0000326031 00000 n +0000194187 00000 n +0000191834 00000 n +0000194119 00000 n +0000326139 00000 n +0000197360 00000 n +0000194251 00000 n +0000197303 00000 n +0000326444 00000 n +0000199219 00000 n +0000197424 00000 n +0000199162 00000 n +0000326552 00000 n +0000202700 00000 n +0000199283 00000 n +0000202643 00000 n +0000326660 00000 n +0000205232 00000 n +0000202764 00000 n +0000205164 00000 n +0000326859 00000 n +0000207224 00000 n +0000205296 00000 n +0000207167 00000 n +0000326967 00000 n +0000208979 00000 n +0000207288 00000 n +0000208933 00000 n +0000327075 00000 n +0000210790 00000 n +0000209043 00000 n +0000210744 00000 n +0000327183 00000 n +0000212456 00000 n +0000210854 00000 n +0000212410 00000 n +0000327390 00000 n +0000214146 00000 n +0000212520 00000 n +0000214100 00000 n +0000327498 00000 n +0000215798 00000 n +0000214210 00000 n +0000215752 00000 n +0000327606 00000 n +0000217479 00000 n +0000215862 00000 n +0000217433 00000 n +0000327805 00000 n +0000219179 00000 n +0000217543 00000 n +0000219133 00000 n +0000327913 00000 n +0000220903 00000 n +0000219243 00000 n +0000220857 00000 n +0000328021 00000 n +0000222778 00000 n +0000220967 00000 n +0000222732 00000 n +0000328129 00000 n +0000223265 00000 n +0000222842 00000 n +0000223219 00000 n +0000322366 00000 n +0000320950 00000 n +0000321352 00000 n +0000321755 00000 n +0000322269 00000 n +0000324356 00000 n +0000322788 00000 n +0000323311 00000 n +0000323734 00000 n +0000324257 00000 n +0000326346 00000 n +0000324778 00000 n +0000325301 00000 n +0000325724 00000 n +0000326247 00000 n +0000328336 00000 n +0000326768 00000 n +0000327291 00000 n +0000327714 00000 n +0000328237 00000 n +0000328721 00000 n +0000328744 00000 n +0000328766 00000 n +trailer +<< +/Size 315 +/Root 2 0 R +/Info 1 0 R +>> +startxref +328887 +%%EOF diff --git a/tools/efsl-0.3.6/docs/manual.tex b/tools/efsl-0.3.6/docs/manual.tex new file mode 100644 index 0000000..065ff74 --- /dev/null +++ b/tools/efsl-0.3.6/docs/manual.tex @@ -0,0 +1,117 @@ +\documentclass[a4paper,fleqn]{article} + +\usepackage{listings} +\usepackage{graphicx} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{color} +\usepackage{array} +\usepackage{verbatim} +\usepackage{longtable} + +\newcommand{\filename}[1]{ + \textsf{#1} +} +\newcommand{\code}[1]{ + \texttt{#1} +} +\newcommand{\external}[1]{ + \textbf{#1} +} + +\newcommand{\thead}[1]{ + \textbf{#1} +} + +%\usepackage[latin1]{inputenc} +%\usepackage[T1]{fontenc} + +\lstset{language=C} + +\begin{document} +\title{\Huge{EFSL}\\\Large{Embedded Filesystems Library - 0.3}} +\author{Lennart Yseboodt\\Michael De Nil} +\date{$\copyright$ 2005} +\maketitle + +\newpage +\tableofcontents + +\setlength{\parindent}{0pt} +\setlength{\parskip}{1ex plus 0.5ex minus 0.2ex} + +\newpage +\section{Document Outdated!} +{\Huge{ +This document is outdated and is in the progress of being renewed.\\ +\newline\newline +If you are just starting with Efsl, we recommend you to start with the stable +0.2-branch. This version is currently not really usable, and is intended for people +working on the code. +}} +\newpage +\section{Preface} +\input{pages/preface} +\newpage +\section{Getting started} +\subsection{On Linux (file) (0.2)} + \input{pages/linux} +\newpage +\subsection{On AVR (SD-Card) (0.3)} + \input{pages/avr} +\newpage +\subsection{On DSP (SD-Card) (0.2)} + \input{pages/tms6713} + +\newpage +\section{Configuring EFSL (0.2)} + \input{pages/config} + +\newpage +\section{EFSL Functions} +\subsection{Date and time support (0.2)} + \input{pages/dateandtime} + \newpage +\subsection{efs\_init (0.2)} + \input{pages/efs_init} + \newpage +\subsection{file\_fopen (0.2)} + \input{pages/file_fopen} + \newpage +\subsection{file\_fclose (0.2)} + \input{pages/file_fclose} + \newpage +\subsection{file\_read (0.2)} + \input{pages/file_read} + \newpage +\subsection{file\_write (0.2)} + \input{pages/file_write} + \newpage +\subsection{mkdir (0.2)} + \input{pages/mkdir} + \newpage +\subsection{ls\_openDir (0.2)} + \input{pages/lsopendir} + \newpage +\subsection{ls\_getNext (0.2)} + \input{pages/lsgetnext} + \newpage + +\newpage +\section{Developer notes} +\subsection{Integer types (0.2)} + \input{pages/types} +\subsection{Debugging (0.2)} + \input{pages/debug} +\subsection{Adding support for a new endpoint (0.2)} + \input{pages/driver} +\subsection{I/O Manager (0.2)} + \input{pages/ioman} +\subsection{C library for EFSL (0.2)} + \input{pages/plibc} + +\newpage +\section{Legal notes} + \input{pages/license} + +\end{document} diff --git a/tools/efsl-0.3.6/docs/pages/avr.tex b/tools/efsl-0.3.6/docs/pages/avr.tex new file mode 100644 index 0000000..3f8e162 --- /dev/null +++ b/tools/efsl-0.3.6/docs/pages/avr.tex @@ -0,0 +1,223 @@ +This section describes how to implement Efsl on a AVR $\mu C$ connected to +an SD-Card (SPI). For getting efsl to compile, the avr-gcc compiler and +avr-libc library are required. On Windows you should install WinAVR +(http://winavr.sourceforge.net/), on Linux you can install the packages +separately (see http://www.nongnu.org/avr-libc/user-manual/install\_tools.html +for a nice howto). +\subsubsection{Hardware} +First, you need set up a prototype in which you connect the CD, CMD, DAT0 +\& CLK lines from the SD-Card to /CS, MOSI, MISO \& SCK from the Atmega. +\newline +\includegraphics[scale=0.65]{pics/sdcard.eps} +\newline +%\parbox[c]{.4\textwidth}{\begin{center}\includegraphics[width=.4\textwidth]{pics/sdconnection}\end{center}} +\parbox[c]{.5\textwidth}{ +Connect the following lines on the SD-card: +\begin{itemize} + \item{Pin 9 (DAT2) - NC\\(or pull-up to 3.3V)} + \item{Pin 1 (CD) - Any pin on the Atmega128} + \item{Pin 2 (CMD) - MOSI\\(pin 12 on the Atmega128)} + \item{Pin 3 (Vss) - GND} + \item{Pin 4 (Vdd) - +3.3V} + \item{Pin 5 (CLK) - SCK\\(pin 11 on the Atmega128)} + \item{Pin 6 (Vss) - GND} + \item{Pin 7 (DAT0) - MISO\\(pin 12 on the Atmega128)} + \item{Pin 8 (DAT1) - NC\\(or pull-up to 3.3V)} +\end{itemize} +} +\parbox[c]{.5\textwidth}{\begin{center} + \includegraphics[width=.5\textwidth]{pics/sdconnection} + \newline\newline + Remark: this schematic includes pull-up's to 3.3V, which + can be left off. +\end{center}} +\newline +Remark 1: Make sure that your $\mu C$ is running on 3,3V, so you don't +damage your SD-Card.\newline +\newline +Remark 2: CD is currently static set to PB0, but will become variable +in future releases. +\subsubsection{Download \& Compile} +Let's get started: +\begin{enumerate} + \item{Get the latest release of efsl on http://www.sf.net/projects/efsl/} + \item{Unpack the library (on Windows, you can use WinACE or WinRAR)} + \item{Copy in directory \filename{conf} the file + \filename{config-avr.h} to \filename{config.h}} + \item{Copy in directory \filename{conf} the file + \filename{config-avr.makefile} to \filename{config.makefile}} + \item{Compile the library (\code{make avr})} +\end{enumerate} +Now you should have the following files in a directory called {lib}: +\begin{itemize} + \item{\filename{libefsl-base.a}} + \item{\filename{libefsl-fs-vfat.a}} + \item{\filename{libefsl-prot-sdspi.a}} + \item{\filename{libefsl-hwd-atmega\_spi.a}} +\end{itemize} +\subsubsection{Example} +Since Efsl itself is only a library, it's not supposed to do anything out of +the box, than just compile. To get started, we'll show here a small example +program that opens an existing file and writes the content to a new file. +\newline\newline +First, create a new directory in which you put the compiled efsl-library +(\filename{libefsl.a}) and create a new file called \filename{avrtest.c} containing: +\lstset{numbers=left, stepnumber=1, numberstyle=\small, numbersep=5pt, tabsize=4} +\begin{lstlisting} + #include + #include + #include + + void hang(void); + + void main(void) + { + efsl_storage_conf storage_conf; + efsl_fs_conf fs_conf; + + efsl_storage storage; + efsl_fs fs; + File file_r; + File file_w; + + atmegaSpiInterface spi_interface; + SdSpiProtocol sd_protocol; + + char buf[512]; + unsigned short e; + + /* Init */ + spi_interface.pinSelect=0x01; + + sd_protocol.spiHwInterface=&spi_interface; + sd_protocol.spiHwInit=(void *)atmega_spi_init; + sd_protocol.spiSendByte=(void *)atmega_spi_send; + + storage_conf.hwObject=&sd_protocol; + storage_conf.if_init_fptr=(void *)sd_Init; + storage_conf.if_read_fptr=(void *)sd_readSector; + storage_conf.if_write_fptr=(void *)sd_writeSector; + storage_conf.if_ioctl_fptr=(void *)sd_ioctl; + storage_conf.ioman_bufmem=0; + + fs_conf.no_partitions=0; + fs_conf.storage=&storage; + + if(efsl_initStorage(&storage,&storage_conf)){ + hang(); + } + + if(efsl_initFs(&fs,&fs_conf)){ + hang(); + } + + if(file_fopen(&file_r,&fs.filesystem,"orig.txt",'r')!=0){ + hang(); + } + + if(file_fopen(&file_w,&fs.filesystem,"copy.txt",'w')!=0){ + hang(); + } + + if(file_fopen(&file_r,&efs.myFs,"orig.txt",'r')!=0){ + hang(); + } + + while((e=file_read(&file_r,512,buf))){ + file_write(&file_w,e,buf); + } + + file_fclose(&file_r); + file_fclose(&file_w); + + fs_umount(&fs.filesystem); + + hang(); + } + + void hang(void) + { + while((1)) + _NOP(); + } +\end{lstlisting} +$ $\newline +Some extra information on the code above: TODO +%\begin{itemize} +% \item{Line 1: The header file for efsl is included here. When using the +% basic efsl functions, \filename{efs.h} is the only header file on the +% efsl library that needs to be included.} +% \item{Line 7: The object efs is created, this object will contain +% information about the hardware layer, the partition table and +% the disc.} +% \item{Line 8: The objects \code{file\_r} and \code{file\_w} are created, these objects +% will contain information about the files that we will open on the +% efs-object.} +% \item{Line 9: A buffer of 512 bytes is allocated. This buffer will be +% used for reading and writing blocks of data.} +% \item{Line 12: Call of \code{efs\_init()}, which will initialize the efs-object. +% To this function we pass: +% \begin{enumerate} +% \item{A pointer to the efs-object.} +% \item{A pointer to the file that contains the partition table / +% file system (in this example, we select a device as file).} +% \end{enumerate} +% If this function returns 0, it means that a valid fat partition is +% found on the SD-card connected. +% If no valid fat-filesystem is found, or the file does not exist, the +% function returns a negative value. In this example we then go to an +% infinite loop to prevent the program to continue.} +% \item{Line 16 \& 20: Call of \code{file\_fopen()}, which will initialize the +% file-objects. To this function we pass: +% \begin{enumerate} +% \item{A pointer to the file-object.} +% \item{A pointer to the filesystem-object.} +% \item{A pointer to the filename.} +% \item{A char containing the the mode (read, write, append).} +% \end{enumerate} +% If this function returns 0, it means the file has successfully been +% opened for reading / writing / appending. +% If the file could not be opened (because for example a file already +% exists), a negative value is returned.} +% \item{Line 24: Call of \code{file\_read()}, which will read a given value of +% bytes (in this example 512) from a file and put it's content into +% the buffer passed (in this example called buf). This function returns +% the amount of bytes read, so the while-loop will be executed as long +% as there are bytes left in the file.} +% \item{Line 25: Call of \code{file\_write()}, which will write a given value +% of bytes (in this example, the amount of bytes that was read +% by \code{file\_read()}) from the buffer passed to a file. This function returns +% the amount of bytes written.} +% \item{Line 28 \& 29: Call of \code{file\_fclose()}, which will close the +% file-objects.} +% \item{Line 31: Call of \code{fs\_umount()}, which will write all buffers to +% the the SD-card.} +%\end{itemize} +\subsubsection{Testing} +So now let's test the program: +\begin{enumerate} + \item + { Compile the program: + \begin{itemize} + \item{On Linux (with avr-gcc): avr-gcc -I/home/user/src/base/include -I/home/user/src/include -I/home/user/src/fs/vfat/include -I/home/user/src/hwdrivers/atmega\_spi/include -I/home/user/src/protocols/sdcard\_spi/include -I/home/user/conf -ffreestanding -mmcu=atmega128 -Os -o avrtest.o avrtest.c -L/home/user/lib -lefsl-base -lefsl-fs-vfat -lefsl-hwd-atmega\_spi -lefsl-prot-sdspi} + \item{On Windows (with WinAVR): replace all slashes with backslashes} + \end{itemize} + } + \item{Generate a hexfile + (avr-objcopy -j .text -j .data -O ihex avrtest.o avrtest.hex)} + \item{Connect an SD-card to your Atmega128 with a file called + \filename{orig.txt} on it.} + \item + { + Flash the hex file into your $\mu C$. + \begin{itemize} + \item{On Linux: avrdude -P /dev/ttyUSB0 -c stk500 -p m128 -Uflash:w:avrtest.hex} + \item{On Windows: use Atmel AVR-Studio} + \end{itemize} + } + \item{Reset your $\mu C$ and wait some time (depending on how big + the file \filename{orig.txt} is).} + \item{Disconnect the SD-card, so you can put it in your card reader + and find out if the file \filename{orig.txt} is copied to + \filename{copy.txt}.} +\end{enumerate} diff --git a/tools/efsl-0.3.6/docs/pages/config.tex b/tools/efsl-0.3.6/docs/pages/config.tex new file mode 100644 index 0000000..bd66ef2 --- /dev/null +++ b/tools/efsl-0.3.6/docs/pages/config.tex @@ -0,0 +1,180 @@ +In this section we're going to talk about the configuration file (\filename{config.h}), +that defines the behavior of the library. In the configuration files there are many +settings, most of which default to safe or 'standard' compliant settings. + +For every platform we try to deliver a sample configuration, with setting tweaked for +that architecture. This documentation only refers to the general elements which are +tied to the library rather that the target hardware. + +\subsection{Hardware target} +Here you will define what kind of hardware you will be using. Please refer to +section \ref{hwdriver} to learn how to write a hardware endpoint. +Here you must \code{\#define} the name of your hardware endpoint. +The following list contains the endpoints that the library ships with.\\ +\begin{tabular}{|l|p{8cm}|} + \hline + \code{HW\_ENDPOINT\_LINUX}& This endpoint uses a regular file as + a "disc" containing a filesystem. This is a great endpoint for + testing and debugging. All development is done using this emulation.\\ + \code{HW\_ENDPOINT\_ATMEGA128\_SD}& This endpoint is for the Atmel ATMega 128 + with an SD card attached to the SPI pins of the device. Several settings + that are specific for this endpoint can be found in the AVR sample + configuration. A Makefile is also provided for compiling the EFSL library + using avr-gcc.\\ + \code{HW\_ENDPOINT\_DSP\_TI6713\_SD}& This endpoint is for a TI DSP, it should + work with any McBSP port, due to the infinite amount of options, you should + refer to the source code of this endpoint for fine tuning, or selecting what + port to use (defaults to McBSP0).\\ + \hline +\end{tabular} + +\subsection{Memory configuration} +This section only has one option, called \code{BYTE\_ALIGNMENT}. If you define +this keyword the library will assume that your CPU is capable of accessing the +memory in any way it sees fit. This is the case on AVR, because they are 8 bit +processors, and it is also the case on Intel x86 hardware. Both architectures +can read and write words, or double words on any location in memory, be it +word aligned or not. + +However, some CPU's, are not capable of doing this, and require that all double words +are aligned on a double word boundary, and all word are aligned on a word boundary. +This causes problems with some of the casts that are performed in EFSL. If you have such +a CPU, then you must comment this option out. The effect is that special functions +will be used to copy or cast memory. These functions work around the problem by +using memCpy, or manually copying elements of the structs that are normally cast when +\code{BYTE\_ALIGNMENT} is defined. + +If you have an 8 bit architecture, or are running on PC, there is no need to turn this +off. If you do, the library will work fine, and maybe even without slowdown. +On architectures that do have the alignment problem, you should turn this flag off. +Failure to do so will result in undefined behavior. + +\subsection{Cache configuration} +This section is dedicated to configuring the cache memory for the library. Caching +is performed by the IOMan object, see section \ref{ioman}. +\subsubsection*{IOMAN\_NUMBUFFER} +This number determines how much memory will be used for caching. Since this +is sector based one \code{IOMAN\_NUMBUFFER} equals to 512 byes of memory, plus +a small overhead in settings (approximately 8 bytes). This number is also affected +by \code{IOMAN\_NUMITERATIONS}. + +You should carefully consider how much memory you will dedicate to caching. A too +low number will cause excessive data transfer to and from the disc, where a too high +number will simply be a waste of memory. + +A good rule of thumb is to use 1 buffer per filesystem you create, and 2 buffers +per file you want to use simultaneously. So for a simple application with +one filesystem, and one file operation, 2 or 3 buffers will be fine. If you have memory +to spare, you can use 6 buffers. Using more buffers will have a minimal effect on +performance. + +If you want to seek and rewrite portions of a file, add an extra buffer for that file. +Using the list function or creating directories will be disc intensive, try to smoothen +it by using an extra 3 buffer for either operation. + +It is perfectly possible to have multiple files op for reading and writing, on different +filesystems, with listing etc and only using 1 buffer. It will be a tough blow on +performance though. +\subsubsection*{IOMAN\_NUMITERATION} +This number controls how many stack places each cache place gets. Refer to the IOMan +section for an explanation. In short, if you only have 1 buffer, leave it at 3. If you +use more than 4 buffers try decreasing the number to 2 or 1 for a small memory gain. + +If you get errors, it means you have set it too low (see error support). It is best +to leave this at the default setting (do not increase it), unless you know what you +are doing. +\subsubsection*{IOMAN\_DOMEMALLOC} +This configures how IOMan will get it's memory. If you leave it enable, the memory +will be allocated by IOMan itself. That means that when you declare the IOMan object +it will have a member the size of $512 \cdot \mathrm{IOMAN\_NUMBUFFER}$. +That also means that that huge lump of memory will reside on the stack. On a true embedded platform with no malloc, this is your best option. +The last argument of \code{ioman\_init} will be ignored. + +If you comment this out,IOMan will take a \code{euint8*} pointer as it's third +argument to \code{ioman\_init}. It will use the memory pointed to as cache. +You will have to make sure it's reserved and of the correct size. +This allows you to put the memory on the heap, or perform special tricks like +deallocating it without having to umount your filesystem and open files. +On systems with malloc, this is the recommended setting. + +If you use the efs wrapper object, please look at the \code{efs\_init} documentation +on how to pass the ioman pointer. + +\subsection{Pre-allocation} +Our VFAT module supports the concept of pre-allocation. When writing files, for +example log files, it is usually done with tiny bits a time. That is not the +most efficient way, but it is usually the only solution that works on embedded +systems. Every time you cross a cluster boundary with your write, the library +has to search a new cluster (reading the FAT), allocate it (write to the FAT). + +Clearly, this is a waste. The solution we came up with was preallocating. This means +that when you write to a file, and fwrite sees that it needs to allocate more clusters, +it will allocate too many of them. Since this is done in one operation, it requires +usually only one read and one write to the FAT. This can save up to 50\% disc I/O +in some applications. + +The drawback is that the allocation happens in larger chunks, if you do this with +many files, you might end up with larger than normal amounts of slackspace. + +We have also implemented this feature for directories. This is very useful if you +have to create a lot of small files, since the directories grow by larger portions +then. + +\subsubsection*{CLUSTER\_PREALLOC\_FILE} +This number determines the default value of extra clusters that will be allocated +with every sizeincrease. For example, if fwrite calculates that it needs 7 clusters, +and \code{CLUSTER\_PREALLOC\_FILE} is 30 then efsl will allocate 37 clusters. +This means (assuming every write needs 7 clusters) that the next 4 writes won't +require any write operation to the FAT (and due to the cluster cache the FAT will probably have to be read only once). + +The value you put here will be the default value, it can be changed per file +object. (not yet implemented). + +\subsubsection*{CLUSTER\_PREALLOC\_DIRECTORY} +The same explanation as above counts, only this value is used for directories. +Generally you should not put this above 10 (unless your speed tests prove otherwise +off course). + +\subsection{Endianness} +The Microsoft FAT filesystem was originally created to be run on Intel compatible hardware. +Therefore the Microsoft programmers decided to record all data on the disc in little endian +format. Our library supports running on big endian devices. Here you can select whether your +target CPU is little or big endian. + +Running on big endian will cause some performance lose because (rather simple) calculations have +to be made to all numbers that have to interpreted by the library. This does not apply to +data within the files off course. + +If the flag \code{\#LITTLE\_ENDIAN} is set, efsl will assume that your hardware is little endian. +If you have a big endian system, you should comment this out. The function \code{fs\_checkEndian} +will tell you if you have selected the right endianness, this is a check you might want to use. + +\subsection{Date and time} +This flag determines if you want to have date and time support. With date and time support we +mean that when you create or update a file the directory entry will receive the correct date and +time stamp. + +Please refer to section \ref{dateandtime} to learn more about how this works. + +If you disable date and time support by commenting the \code{\#DATE\_TIME\_SUPPORT} then +all dates and times that need to be created or updated will be set to zero, which in FAT land corresponds to the first of January of the year 1970. + +\subsection{Errors} +When the library encounters an error, there be an error cascade moving from the error-causing object +to the topmost object where the request started. Seen from userland this gives you extremely little +information, usually nothing more than fail or success. + +Every object in the library has an optional error field, that contains a unique number that +corresponds to a specific error. If you examine every error field you can see exactly where the +error was started and what the effect was on the higher level objects. + +In a more practical sense you can display an error number or explanation to your users, giving +yourself or them a better chance to correct or avoid the problem. +Please see the section on error on what every value means. + +\subsection{Debug} +This will turn debug support on or off. When enable (and your platform has a means of output that +is supported by EFSL) it you will see messages you have created yourself, or that are printed by the +library. By default the library is very silent, only very critical errors might get printed out. + +This option is depreciated and is left in for backward compatibility. diff --git a/tools/efsl-0.3.6/docs/pages/dateandtime.tex b/tools/efsl-0.3.6/docs/pages/dateandtime.tex new file mode 100644 index 0000000..7239020 --- /dev/null +++ b/tools/efsl-0.3.6/docs/pages/dateandtime.tex @@ -0,0 +1,34 @@ +\label{dateandtime} +The EFSL library supports setting and updating all date and time fields +supported by the filesystem. In order to do this the library must +know the current time and date at all times. Since it has to run everywhere, +there is no standard mechanism to get the date/time, and some systems do +not have a clock. + +With default configuration there is no date or time support, you have to +turn it on manually in the configuration file \filename{config.h}. +You will have to uncomment the field named \code{\#define DATE\_TIME\_SUPPORT}, +in order to activate date/time support. + +Furthermore you will have to provide the library with date and time information. +A set of defines was used for this, when date/time support is not enabled, +the defines automatically return \code{0x0000} for all time and date fields, +so there is no performance suffer when you do not need date/time support. +If you do need it you will have to provide 6 functions to the library +that will tell it the time. Since these functions may get called often, +it is highly recommended that you cache the time result somewhere so +you can serve the library directly from ram. If you do not do this and +your RTC request take a lot of time, you may suffer large losses in read +or write operations depending on your hardware. + +The six functions are: +\begin{itemize} + \item\code{euint16 efsl\_getYear(void)} + \item\code{euint8 efsl\_getMonth(void)} + \item\code{euint8 efsl\_getDay(void)} + \item\code{euint8 efsl\_getHour(void)} + \item\code{euint8 efsl\_getMinute(void)} + \item\code{euint8 efsl\_getSecond(void)} +\end{itemize} +Internally the library will recalculate these numbers to match the +filesystem that is currently in use. diff --git a/tools/efsl-0.3.6/docs/pages/debug.tex b/tools/efsl-0.3.6/docs/pages/debug.tex new file mode 100644 index 0000000..aedd953 --- /dev/null +++ b/tools/efsl-0.3.6/docs/pages/debug.tex @@ -0,0 +1,38 @@ +Since debugging on every device is completely different, a DBG macro is +implemented. On Linux for example, this macro will print the string given +to the screen (using printf). On AVR, it will send debug strings through the +UART. For compatibility with other devices, it is necessary that you always use +the DBG-macro instead of a device-specific debugging commands.\newline +\newline +Because AVR-GCC puts strings in sram memory by default, every string should be +surrounded by the TXT-macro. On AVR, this macro will put the string in program +memory (flash), on any other device, this macro will be ignored.\newline +\newline +Example of a debug string:\\ +\code{DBG((TXT("This is test nr \%d of \%d.$\backslash$n"),id,total));} + +\subsubsection{Debugging on Linux} +On linux, debugging strings are sent to stdout using printf.\newline +\newline +To enable debugging, set DEBUG in \filename{config.h}. +\subsubsection{Debugging on AVR} +On AVR, debugging strings are sent through the UART and can be read using +a terminal like minicom (linux) or hyperterminal (windows). Standard, the +first UART is used, but this can be changed in \filename{debug.c} to the +second UART.\newline +\newline +To enable debugging: +\begin{itemize} + \item{Set DEBUG in \filename{config.h}} + \item{Set CLK to the clock speed of your AVR in \filename{config.h}} + \item{Set BAUDRATE to the baudrate you want in \filename{config.h}} + \item{Initialize debugging in your program by calling \code{debug\_init()}} +\end{itemize} +Remark: when you use the serial port in your main program, make sure you +use a different UART than the one efsl is using when sending debug string. +\subsubsection{Debugging on DSP} +On DSP, debugging strings are sent to Code Composer using the printf function. +\newline\newline +To enable debugging, set DEBUG in \filename{config.h}.\newline +\newline +Remark: this will only work when using a DSK-kit. diff --git a/tools/efsl-0.3.6/docs/pages/driver.tex b/tools/efsl-0.3.6/docs/pages/driver.tex new file mode 100644 index 0000000..152b909 --- /dev/null +++ b/tools/efsl-0.3.6/docs/pages/driver.tex @@ -0,0 +1,166 @@ +\label{hwdriver} +This section will describe step by step how to write an hardware endpoint. +You will be required to write your own endpoint in case non of the existing endpoints +matches your hardware. + +First let's have a look at how EFSL is structured internally.\\\\ +\includegraphics[scale=0.4]{schematics/objectmodel.eps}\\ + +As you can see we have created a linear object model that is quite simple. +The file en filesystem object deal with handling the filesystem specific stuff. +Below that we find the Partition object that is responsible for translating partition +relative addressing into disc-based LBA addressing. + +The Disc object hold the partition table, and has a direct link to a cache manager, IOMan. +In IOMan, all requests for disc sectors come together. IOMan will perform checks to see +if sectors have to be read from disc (or from memory), or written back to disc. +In the latter case (reading or writing to disc), a request is made to the hardware layer. + +The hardware interface has 3 responsibilities : +\begin{itemize} + \item Initialize the hardware + \item Read sectors from disc + \item Write sectors to disc +\end{itemize} + +All requests are \textsl{sector}based, a sector is a 512 byte piece from the disc, that is aligned to +a 512 byte boundary.\\\\ +\includegraphics[scale=0.4]{schematics/sector.eps} + +In this example we will create a new endpoint that will add support for data over pigeon carrier +for the EFSL. Initializing the hardware will require feeding the pigeon and telling it where the +data is. Reading/Writing will entail giving the bird the sector and letting it fly. + +Perform the following steps: +\begin{enumerate} + + \item Choose a name for your endpoint\\ + You will need this name to create the required defines in the source code. + For our example I've chosen the name \code{PIGEON\_CARRIER}. + For consistency the final name is then \code{HW\_ENDPOINT\_PIGEON\_CARRIER}. + + \item Verify the sizes of integers\\ + Open \filename{inc/types.h} and create a new entry for pigeon carriers. Perhaps + one of the existing sets is identical to yours and you can copy-paste it. + + \item Add your endpoint to \filename{interface.h}\\ + Locate the file \filename{interface.h} located in the directory \filename{inc/} + Add a pigeon entry (located above the \code{\#else ... NO INTERFACE DEFINED}) +\begin{lstlisting} +#if defined(HW_ENDPOINT_0) + #include "interfaces/0.h" +#elif defined(HW_ENDPOINT_1) + #include "interfaces/1.h" +#elif defined(HW_ENDPOINT_PIGEON_CARRIER) + #include "interfaces/pigeon.h" +#else + #error "NO INTERFACE DEFINED - see interface.h" +#endif +\end{lstlisting} + + \item Select your endpoint in \filename{conf/config.h} + + \item Create your sourcefiles\\ + Create a header file in \filename{inc/} and a sourcefile in \filename {src/interfaces}. + In this example I'm using \filename{pigeon.h} and \filename{pigeon.c}. + + \item Add your object file to the Makefile + Take the Makefile that works best on your platform (they should all work with + GNU/Make), or create a new one, using the existing one's as a template. + Make sure to include your new pigeon object to the library. + If you have an 'ar' like utility you can create a static library, else you may + have to create a new project containing all required source files. + +\end{enumerate} + +The basic framework is now complete, now all that's left to do is to write the code +that will perform the actual flying work. + +\subsubsection{hwInterface} +This structure represents the underlying hardware. There are some field that are required +to be present (because EFSL uses them), but you may put in as much or a little as +your driver requires to access the hardware. + +As always in embedded design it is recommended to keep this structure as small +as possible. + +Example: +\begin{lstlisting} +struct hwInterface{ + /* Field created for THIS hardware */ + Pigeon pigeon; + + /* Obligatory fields */ + euint32 sectorCount; +}; +typedef struct hwInterface hwInterface; +\end{lstlisting} + +\subsubsection{if\_initInterface} +This function will be called one time, when the hardware object is initialized +by \code{efs\_init()}. This code should bring the hardware in a ready to use +state. + +The function's prototype is\\ +\code{esint16 if\_initInterface(hwInterface *hw, euint8* opts);} + +Optionally but recommended you should fill in the hw->sectorCount field with the number +of sectors. This field is used to validate sectorrequests. + +An example of a initInterface function : +\begin{lstlisting} +esint16 if_initInterface(hwInterface *hw, euint8* opts) +{ + /* Parse options */ + parse_options(opts); /* Your application may not need options */ + + /* Check hardware state */ + if(!alive(hw->pigeon)){ + //printf("Pigeon died! :-(\n"); + return(DEAD_PIGEON); /* #define DEAD_PIGEON -1 */ + } + + /* Initialize hardware */ + feed(hw->pigeon); + pet (hw->pigeon); + + /* Get sectors count */ + hw->numSectors = ask_pigeon_num_sectors(hw->pigeon); + + return(0); +} +\end{lstlisting} + +\subsubsection{if\_readBuf} +This function is responsible to read a sector from the disc and store it in a user supplied buffer. You will receive the hardware object, an address and a pointer to memory for storing +the buffer. + +Please be very careful to respect the boundaries of the buffers, since it will usually be IOMan +calling this function, and if you have a buffer overflow you might corrupt the cache of the +the next buffer, which in turn may produce extremely rare and impossible to retrace behavior. + +The function prototype is:\\ +\code{esint16 if\_readBuf(hwInterface *hw,euint32 address, euint8* buf);} + +The address is an LBA address, relative to the beginning of the disc. Should you be +accessing an old hard disc, or a device which uses some other form of addressing you will have to +recalculate the address to your own addressing scheme. Please note that there is no support +for sectors that are not 512 bytes large. + +\begin{lstlisting} +esint8 if_readBuf(hwInterface* hw,euint32 address,euint8* buf) +{ + Message new_message; + + new_message.address = address; + new_message.command = READ; + + pigeon_send(hw->pigeon,new_message); /* Launches the pigeon */ + while(!pigeon_returned(hw->pigeon)); /* Wait until the bird is back */ + memcpy(new_message.data,buf,512); /* Copy buffer */ + return(0); +} +\end{lstlisting} + +\subsubsection{if\_writeBuf} +The function \code{if\_writeBuf} works exactly the same as it's reading variant. diff --git a/tools/efsl-0.3.6/docs/pages/efs_init.tex b/tools/efsl-0.3.6/docs/pages/efs_init.tex new file mode 100644 index 0000000..5bedf02 --- /dev/null +++ b/tools/efsl-0.3.6/docs/pages/efs_init.tex @@ -0,0 +1,45 @@ +\subsubsection*{Purpose} +Initializes the hardware and the software layer. +\subsubsection*{Prototype} +\code{esint8 efs\_init(EmbeddedFileSystem *efs, eint8* opts);} +\subsubsection*{Arguments} +Objects passed to \code{efs\_init}: +\begin{itemize} + \item{\code{efs}: empty EmbeddedFileSystem object} + \item + { + \code{opts}: character string containing options, depending on what + interface you are using: + \begin{itemize} + \item{Linux: opts points to the path to the device} + \item{AVR: opts points to the card enable pin (TODO)} + \item{DSP: opts points to the card enable memory address (TODO)} + \end{itemize} + } +\end{itemize} +\subsubsection*{Return value} +Returns 0 if no errors are detected.\\ +\newline +Returns non-zero if a low-level error is detected: +\begin{itemize} + \item{Returns -1 if the interface could not be initialized.} + \item{Returns -2 if the filesystem could not be initialized.} +\end{itemize} +\subsubsection*{Example} +\lstset{numbers=left, stepnumber=1, numberstyle=\small, numbersep=5pt, tabsize=4} +\begin{lstlisting} + #include "efs.h" + + void main(void) + { + EmbeddedFileSystem efsl; + esint8 ret; + + DBG((TXT("Will init efsl now.\n"))); + ret=efs_init(&efsl,"/dev/sda"); + if(ret==0) + DBG((TXT("Filesystem correctly initialized.\n"))); + else + DBG((TXT("Could not initialize filesystem (err \%d).\n"),ret)); + } +\end{lstlisting} diff --git a/tools/efsl-0.3.6/docs/pages/file_fclose.tex b/tools/efsl-0.3.6/docs/pages/file_fclose.tex new file mode 100644 index 0000000..fb0eaaf --- /dev/null +++ b/tools/efsl-0.3.6/docs/pages/file_fclose.tex @@ -0,0 +1,43 @@ +\subsubsection*{Purpose} +Updates file records and closes file object. +\subsubsection*{Prototype} +\code{esint8 file\_fclose(File *file);} +\subsubsection*{Arguments} +Objects passed to \code{file\_fopen}: +\begin{itemize} + \item{\code{file}: pointer to a File object} +\end{itemize} +\subsubsection*{Return value} +Returns 0 if no errors are detected.\\ +\newline +Returns non-zero if an error is detected. +\subsubsection*{Example} +\lstset{numbers=left, stepnumber=1, numberstyle=\small, numbersep=5pt, tabsize=4} +\begin{lstlisting} + #include "efs.h" + + void main(void) + { + EmbeddedFileSystem efsl; + File file; + + /* Initialize efsl */ + DBG((TXT("Will init efsl now.\n"))); + if(efs_init(&efsl,"/dev/sda")!=0){ + DBG((TXT("Could not initialize filesystem (err \%d).\n"),ret)); + exit(-1); + } + DBG((TXT("Filesystem correctly initialized.\n"))); + + /* Open file for reading */ + if(file_fopen(&file, &efsl.myFs, "read.txt", 'r')!=0){ + DBG((TXT("Could not open file for reading.\n"))); + exit(-1); + } + DBG((TXT("File opened for reading.\n"))); + + /* Close file & filesystem */ + fclose(&file); + fs_umount(&efs.myFs); + } +\end{lstlisting} diff --git a/tools/efsl-0.3.6/docs/pages/file_fopen.tex b/tools/efsl-0.3.6/docs/pages/file_fopen.tex new file mode 100644 index 0000000..58700f6 --- /dev/null +++ b/tools/efsl-0.3.6/docs/pages/file_fopen.tex @@ -0,0 +1,70 @@ +\subsubsection*{Purpose} +Searches for file and initializes the file object. +\subsubsection*{Prototype} +\code{esint8 file\_fopen(File *file, FileSystem *fs, eint8 *filename, eint8 mode);} +\subsubsection*{Arguments} +Objects passed to \code{file\_fopen}: +\begin{itemize} + \item{\code{file}: pointer to a File object} + \item{\code{fs}: pointer to the FileSystem object} + \item{\code{filename}: pointer to the path + filename} + \item + { + \code{mode}: mode of opening, this can be: + \begin{itemize} + \item{'r': open file for reading} + \item{'w': open file for writing} + \item{'a': open file for appending} + \end{itemize} + } +\end{itemize} +\subsubsection*{Return value} +Returns 0 if no errors are detected.\\ +\newline +Returns non-zero if an error is detected: +\begin{itemize} + \item{Returns -1 if the file you are trying to open for reading could not + be found.} + \item{Returns -2 if the file you are trying to open for writing already + exists.} + \item{Returns -3 if no free spot could be found for writing or appending.} + \item{Returns -4 if mode is not correct (if it is not 'r', 'w' or 'a').} +\end{itemize} +\subsubsection*{Example} +\lstset{numbers=left, stepnumber=1, numberstyle=\small, numbersep=5pt, tabsize=4} +\begin{lstlisting} + #include "efs.h" + + void main(void) + { + EmbeddedFileSystem efsl; + File file_read, file_write; + + /* Initialize efsl */ + DBG((TXT("Will init efsl now.\n"))); + if(efs_init(&efsl,"/dev/sda")!=0){ + DBG((TXT("Could not initialize filesystem (err \%d).\n"),ret)); + exit(-1); + } + DBG((TXT("Filesystem correctly initialized.\n"))); + + /* Open file for reading */ + if(file_fopen(&file_read, &efsl.myFs, "read.txt", 'r')!=0){ + DBG((TXT("Could not open file for reading.\n"))); + exit(-1); + } + DBG((TXT("File opened for reading.\n"))); + + /* Open file for writing */ + if(file_fopen(&file_write, &efsl.myFs, "write.txt", 'w')!=0){ + DBG((TXT("Could not open file for writing.\n"))); + exit(-2); + } + DBG((TXT("File opened for writing.\n"))); + + /* Close files & filesystem */ + fclose(&file_read); + fclose(&file_write); + fs_umount(&efs.myFs); + } +\end{lstlisting} diff --git a/tools/efsl-0.3.6/docs/pages/file_read.tex b/tools/efsl-0.3.6/docs/pages/file_read.tex new file mode 100644 index 0000000..0770980 --- /dev/null +++ b/tools/efsl-0.3.6/docs/pages/file_read.tex @@ -0,0 +1,51 @@ +\subsubsection*{Purpose} +Reads a file and puts it's content in a buffer. +\subsubsection*{Prototype} +\code{euint32 file\_read (File *file, euint32 size, euint8 *buf);} +\subsubsection*{Arguments} +Objects passed to \code{file\_read}: +\begin{itemize} + \item{\code{file}: pointer to a File object} + \item{\code{size}: amount of bytes you want to read / put in buf} + \item{\code{buf}: pointer to the buffer you want to store the data} +\end{itemize} +\subsubsection*{Return value} +Returns the amount of bytes read. +\subsubsection*{Example} +\lstset{numbers=left, stepnumber=1, numberstyle=\small, numbersep=5pt, tabsize=4} +\begin{lstlisting} + #include "efs.h" + + void main(void) + { + EmbeddedFileSystem efsl; + euint8 buffer[512]; + euint16 e, f; + File file; + + /* Initialize efsl */ + DBG((TXT("Will init efsl now.\n"))); + if(efs_init(&efsl,"/dev/sda")!=0){ + DBG((TXT("Could not initialize filesystem (err \%d).\n"),ret)); + exit(-1); + } + DBG((TXT("Filesystem correctly initialized.\n"))); + + /* Open file for reading */ + if(file_fopen(&file, &efsl.myFs, "read.txt", 'r')!=0){ + DBG((TXT("Could not open file for reading.\n"))); + exit(-1); + } + DBG((TXT("File opened for reading.\n"))); + + /* Read file and print content */ + while((e=file_read(&file,512,buffer))){ + for(f=0;f + #include "efs.h" + + void main(void) + { + EmbeddedFileSystem efsl; + euint8 *buffer = "This is a test.\n"; + euint16 e=0; + File file; + + /* Initialize efsl */ + DBG((TXT("Will init efsl now.\n"))); + if(efs_init(&efsl,"/dev/sda")!=0){ + DBG((TXT("Could not initialize filesystem (err \%d).\n"),ret)); + exit(-1); + } + DBG((TXT("Filesystem correctly initialized.\n"))); + + /* Open file for writing */ + if(file_fopen(&file, &efsl.myFs, "write.txt", 'w')!=0){ + DBG((TXT("Could not open file for writing.\n"))); + exit(-1); + } + DBG((TXT("File opened for reading.\n"))); + + /* Write buffer to file */ + if( file_write(&file,strlen(buffer),buffer) == strlen(buffer) ) + DBG((TXT("File written.\n"))); + else + DBG((TXT("Could not write file.\n"))); + + /* Close file & filesystem */ + fclose(&file); + fs_umount(&efs.myFs); + } +\end{lstlisting} diff --git a/tools/efsl-0.3.6/docs/pages/ioman.tex b/tools/efsl-0.3.6/docs/pages/ioman.tex new file mode 100644 index 0000000..fb8741e --- /dev/null +++ b/tools/efsl-0.3.6/docs/pages/ioman.tex @@ -0,0 +1,236 @@ +\label{ioman} +The IOManager that is the second lowest layer of the embedded filesystems library is +responsible for coordinating disk input and output, as well as managing a caching +system. This documentation describes the second implementation of IOMan, which includes +features such as : +\begin{itemize} + \item Delayed write + \item Buffer reference statistics + \item Buffer exportable to users + \item Support for cached direct I/O as well as indirect I/O + \item Can allocate memory itself (on the stack), or you can do it yourself (heap) +\end{itemize} + +\subsubsection{General operation} +Because of the limited memory nature of most embedded devices for which this library is +intended several design decisions were made to minimize memory usage. Some of these required +that some concessions be made. One of them is that there is no memory protection, since +most devices don't have the memory to support this, or lack the ability to protect memory. + +When IOMan receives a request for a sector, it will make sure it has the sector in it's +own memory cache and then give the caller a \code{euint8*} pointer to that cache. The +user is then free to do operations on that memory, and when it is done it should tell +IOMan so. Several things can go wrong with this: you can request a sector for reading, +and then write in the cache, thereby corrupting it. Or you can request a sector, but never +release it (sort of a memory leak), which may result in very bad performance, and a deadlocked +I/O manager. + +But, taking into account that very little memory is required for operation, if you follow the I/O man rules, you will get a pretty clever caching object that will make writing new filesystems +a simple job. + +\subsubsection{Cache decisions} +Whenever ioman receives a request to fetch a sector, be it read or write, it will have to make sure +it has, or can get the sector you want. It follows a certain path to do this.\label{cachemethod} +\begin{enumerate} + \item First of all it will scan it's cache range to see if it already has the sector. + If it is found, and it was a write request, the cache is marked writable. Usage and + reference get incremented and a pointer is then returned to the requester. If the + buffer cannot be found, ioman proceeds to step 2. + \item When an item is not in cache, it has to be fetched from the disc, the best place to + store it is in memory that does not contain anything useful yet. Ioman will search for + a place that is currently not occupied by anything. If it is found, the sector will be + placed on that spot and a pointer returned. Else, ioman proceeds to step 3. + \item Since there is no other choice than to overwrite an already existing cache, ioman will + try to find one that is the least interesting. First it will search for caches that + are marked not writable, and have no users. Ioman will then select the one that has the + least references. If there are none, it will search for caches that don't have users and + are writable. Once again the one with the least references is returned. Since it is + writable ioman will flush it to disc first. After that the requested sector is put there + and a pointer returned. If it cannot find any caches that have no users it will go to + step 4. + \item Since every cache spot is in use ioman will have to select one for overallocation. + Since this selection depends on many factors and is rather complex, a points + system is used. The algorithm considers every cache place and allocated a certain number + of points to it, lower means that it is a better candidate for overallocation. Fifty + percent of the points goes to the cache being marked writable, since having to write + a sector is expensive. Another 35 percent goes to how many overallocations have + already been done on that spot. It doesn't make sense to always overalloc the same buffer, + it is better to spread this. The remaining 15 percent is determined by the number of + references to the sector. + + After a function has selected the best candidate, ioman will overwrite that spot with + the new sector. It will also push the status and sectornumber onto that cache's + retrieval stack, so that when the sector is released, the older sector can be retrieved. + If this fails go to step 5. + \item When ioman gets here it will return a (nil) pointer and flag an error. +\end{enumerate} + +\subsubsection{Functions} + +\begin{longtable}{|p{0.35\textwidth}|p{0.65\textwidth}|} + + \hline + \multicolumn{2}{|c|}{ + \textbf{I/O Manager Functions} + } \\ + \multicolumn{2}{|c|}{} \\ + \hline + \hline + \endfirsthead + + \hline + \multicolumn{2}{|c|}{\textbf{I/O Manager Functions (continued)}} \\ + \hline + \endhead + + \hline + \endfoot + + \hline + \endlastfoot + + \code{ioman\_init} & \code{esint8 (IOManager *ioman, hwInterface *iface, euint8* bufferarea)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function is called to initialize the internal state of the I/O manager. It should be the + first function you call on an ioman object. Failure to do so will result in undefined behavior. + The function clears all internal variables to a default safe state, and sets up it's memory region. + + There are two possibilities, if you supply a 0 pointer then a function will be called that contains + a static variable with a size of 512 * \code{IOMAN\_NUMBUFFERS}, else, it will be assumed that + you allocated that memory yourself and the pointer you provided will be used. + }\\ + \hline + + \code{\external{ioman\_reset}} & \code{void (IOManager *ioman)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function is called from the initialization function, it does the actual reset of all variables. + }\\ + \hline + + \code{ioman\_pop} & \code{esint8 (IOManager *ioman,euint16 bufplace)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function fetches settings (sector number, usage and status register) from stack \code{bufplace} + and puts it back on the main registers. It will return 0 on successful pop, and -1 on error, or when + there are no elements to pop. + }\\ + \hline + + \code{ioman\_push} & \code{esint8 (IOManager *ioman,euint16 bufplace)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function pushes the settings of cache \code{bufplace} onto that cache's stack. It does not + destroy the data in the main registers. It will return 0 for a successful push, and -1 on error, or + when there is no more space to push a new element. + }\\ + \hline + + \code{ioman\_readSector} & \code{esint8 (IOManager *ioman,euint32 address,euint8* buf)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function does the actual reading from the hardware, it is the one and only function that + calls \code{if\_readBuf()}, here a retry on failure policy could be implemented. This function + will correctly stream errors upwards. All calls made to this function in the iomanager are checked + for their return value, so errors propagate correctly upwards. + + The address it receives is relative to the beginning of the disc, no assumptions about \code{buf} + may be made, it can be withing ioman's cache memory range, but it could also be a buffer from userspace. + + The function will return 0 on success and -1 on failure. + }\\ + \hline + + \code{ioman\_writeSector} & \code{esint8 (IOManager *ioman, euint32 address, euint8* buf)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function does the actual writing to the hardware, it is the one and only function that + calls \code{if\_writeBuf()}, here a retry on failure policy could be implemented. This function + will correctly stream errors upwards. All calls made to this function in the iomanager are checked + for their return value, so errors propagate correctly upwards. + + The address it receives is relative to the beginning of the disc, no assumptions about \code{buf} + may be made, it can be withing ioman's cache memory range, but it could also be a buffer from userspace. + + The function will return 0 on success and -1 on failure. + }\\ + \hline + + \code{\external{ioman\_getSector}} & \code{euint8* (IOManager *ioman,euint32 address, euint8 mode)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function is the one that is called most from the higher library routines. It is the function + that will present you with a pointer to memory containing sector number \code{address}. There are + several modes that you can select or combine.\newline + \begin{tabular}{|l|p{.6\textwidth}|} + \hline + \code{IOM\_MODE\_READONLY} & This attribute says to ioman that it needs a buffer only for reading. + This does not mean that you are allowed to write to it, doing so results in undefined behavior. + You cannot combine this option with the \code{IOM\_MODE\_READWRITE} option.\\ + \code{IOM\_MODE\_READWRITE} & This attribute says to ioman that it would like not only to read from + but also to write to that buffer. When you release the sector your changes will be written to disc. + This may not happen immediately though, if you want to force it take a look at the + \code{ioman\_flushRange()} function. This option cannot be combined with the + \code{IOM\_MODE\_READONLY} option.\\ + \code{IOM\_MODE\_EXP\_REQ} & This option tell the iomanager that the request is exceptional, for + example that the request is unlikely to happen again. The library adds this flags to the options + when requesting the bootrecord, to prevent it from getting a high rating, which should prevent it + from being removed from the cache.\\ + \hline + \end{tabular}\newline + These options can be combined by ORing them together. + }\\ + \hline + + \code{ioman\_releaseSector} & \code{esint8 (IOManager *ioman,euint8* buf)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function tells ioman that you are done with one of the cache elements and that it can do + it's bidding with it. Forgetting to call this function may result in deadlocked iomanagers. + }\\ + \hline + + \code{ioman\_directSectorRead} & \code{esint8 (IOManager *ioman,euint32 address, euint8* buf)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This is a variant of the normal getsector. Sometimes you need a sector from the disc, but all + you want to do with it is export it directly to userbuffers. It would be foolish to force a + caching of that sector if there is external space available for it. + + This function will fetch sector \code{address} from disc and place it in the memory pointed to + by \code{buf}. Should there be a free spot available the sector will be cached there, so that + it may be used in the future. If the sector was available from cache in the first place, it + will simply be \code{memCpy()}'d from the cache to the userspace buffer. + }\\ + \hline + + \code{ioman\_directSectorWrite} & \code{esint8 (IOManager *ioman,euint32 address, euint8* buf)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function is based on the same philosophy as \code{ioman\_directSectorRead()}, however, + contrary to what the name may lead to believe it also passes through a caching layer. If + there is an unused spot (or the sector is in cache), the userbuffer will be copied to that + spot and will remain there until the space is needed or a flush is forced. + }\\ + \hline + + \code{ioman\_flushRange} & \code{esint8 (IOManager *ioman,euint32 address\_low, euint32 address\_high)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function is used to ask ioman to flush all sectors to disc that are in a specific + range. For example you might want to flush a specific range of your filesystem without + needlessly disturb other parts. The range is \code{address\_low <= n => address\_high}. + Off course only sectors that are marked as writable are flushed to disc. + }\\ + \hline + + \code{ioman\_flushAll} & \code{esint8 (IOManager *ioman)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function will cause ioman to flush out all cache units that are marked writable. If + they do not have any users, they will lose their writable mark. + }\\ + \hline +\end{longtable} + diff --git a/tools/efsl-0.3.6/docs/pages/lgpl.txt b/tools/efsl-0.3.6/docs/pages/lgpl.txt new file mode 100644 index 0000000..487ce55 --- /dev/null +++ b/tools/efsl-0.3.6/docs/pages/lgpl.txt @@ -0,0 +1,489 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + diff --git a/tools/efsl-0.3.6/docs/pages/license.tex b/tools/efsl-0.3.6/docs/pages/license.tex new file mode 100644 index 0000000..3ed94f0 --- /dev/null +++ b/tools/efsl-0.3.6/docs/pages/license.tex @@ -0,0 +1,12 @@ +This library is subject to the Lesser General Public License version 2.1. +We have chosen this license in stead of the BSD license because we feel strongly +that more effort was needed in the field of quality software in the embedded field. + +Please note that if you make changes to the library itself, those modifications must be +made public, but that writing support for new hardware and linking it into the library, +does not fall under this category. However, we would off course appreciate it tremendously +if you would send us in code to support new hardware. + +\subsection{GNU Lesser General Public License} +\verbatiminput{pages/lgpl.txt} + diff --git a/tools/efsl-0.3.6/docs/pages/linux.tex b/tools/efsl-0.3.6/docs/pages/linux.tex new file mode 100644 index 0000000..7cc6a67 --- /dev/null +++ b/tools/efsl-0.3.6/docs/pages/linux.tex @@ -0,0 +1,138 @@ +Debugging efsl on embedded devices is a rather hard job, because +you can't just printf debug strings or watch memory maps easily. +Because of that, core development has been performed under the +Linux operating system. Under Linux, efsl can be compiled as +library and used as a userspace filesystem handler. On Unix- +style operating system (like Linux), all devices (usb stick, disc, \ldots) +can be seen as a file, and as such been opened by efsl.\newline +\newline +In the following section, we will explain how to get started using +efsl as userspace filesystem handler. However, please note that the main +focus for efsl is to support embedded systems, which usually don't even +have 1\% of the memory you have on a PC. Accessing files on a FAT-filesystem +with efsl will be much slower than when accessing these files with the Linux +FAT kernel modules. +\subsubsection{Download \& Compile} +Let's get started: +\begin{enumerate} + \item{Get the latest release of efsl on http://www.sf.net/projects/efsl/ + and put it in your homedir} + \item{Unpack the library (tar xvfj efsl-version.tar.bz2)} + \item{Get inside the directory (cd $\sim$/efsl)} + \item{Create a symlink from \filename{Makefile-LINUX} to \filename{Makefile} + (ln -s Makefile-LINUX Makefile)} + \item{Copy \filename{conf/config-sample-linux.h} to \filename{conf/config.h} + (cp conf/config-sample-linux.h conf/config.h)} + \item{Compile the library (make lib)} + \item{Find the compiled filesystem library (libefsl.a) in the current + directory} +\end{enumerate} +If you got any errors with the steps above, please check that that you have +the following packages installed: tar, gcc, libgcc, binutils \& make. +\subsubsection{Example} +Since efsl itself is only a library, it's not supposed to do anything +out of the box, than just compile. To get started, we'll show here a small +example program that opens a file on a disc/usb-stick/floppy that contains +a FAT-filesystem and prints it's content to stdout.\newline +\newline +First, create a new directory in which you put the compiled efsl-library +(\filename{libefsl.a}) and create a new file called \filename{linuxtest.c} containing: +\lstset{numbers=left, stepnumber=1, numberstyle=\small, numbersep=5pt, tabsize=4} +\begin{lstlisting} + #include + #include + + int main(void) + { + EmbeddedFileSystem efs; + EmbeddedFile file; + unsigned short i,e; + char buf[512]; + + if(efs_init(&efs,"/dev/sda")!=0){ + printf("Could not open filesystem.\n"); + return(-1); + } + + if(file_fopen(&file,&efs.myFs,"group",'r')!=0){ + printf("Could not open file.\n"); + return(-2); + } + + while(e=file_read(&file,512,buf)){ + for(i=0;icurrentEntry}. +\subsubsection*{Prototype} +\code{esint8 ls\_getNext(DirList *dlist);} +\subsubsection*{Arguments} +Objects passed to \code{ls\_getNext}: +\begin{itemize} + \item{\code{dlist}: pointer to a DirList object} +\end{itemize} +\subsubsection*{Return value} +This function will return 0 when it has found a next file in the directory, and +was successful in copying it to \code{dirlist->currentEntry}. It will return -1 +when there are no more files in the directory. + +\subsubsection*{Example} +To browse through a directory you should first open it with \code{ls\_openDir} and +then you can call \code{ls\_getNext} in a loop to iterate through the files. Please +note that they are unsorted. +\lstset{numbers=left, stepnumber=1, numberstyle=\small, numbersep=5pt, tabsize=4} +\begin{lstlisting} +#include "efs.h" +#include "ls.h" + + void main(void) +{ + EmbeddedFileSystem efsl; + DirList list; + + /* Initialize efsl */ + if(efs_init(&efsl,"/dev/sda")!=0){ + DBG((TXT("Could not initialize filesystem (err \%d).\n"),ret)); + exit(-1); +} + + /* Open the directory */ + ls_openDir(list,&(efsl.myFs),"/usr/bin/"); + + /* Print a list of all files and their filesize */ + while(ls_getNext(list)==0){ + DBG((TXT("%s (%li bytes)\n"), + list->currentEntry.FileName, + list->currentEntry.FileSize)); + } + + /* Correctly close the filesystem */ + fs_umount(&efs.myFs); +} +\end{lstlisting} + +Please note that it is not required to close this object, if you wish to switch +to another directory you can just call \code{ls\_openDir} on the object again. diff --git a/tools/efsl-0.3.6/docs/pages/lsopendir.tex b/tools/efsl-0.3.6/docs/pages/lsopendir.tex new file mode 100644 index 0000000..9154bc8 --- /dev/null +++ b/tools/efsl-0.3.6/docs/pages/lsopendir.tex @@ -0,0 +1,42 @@ +\subsubsection*{Purpose} +This function opens a directory for viewing, allowing you to iterate through +it's contents. +\subsubsection*{Prototype} +\code{esint8 ls\_openDir(DirList *dlist,FileSystem *fs,eint8* dirname);} +\subsubsection*{Arguments} +Objects passed to \code{ls\_openDir}: +\begin{itemize} + \item{\code{dlist}: pointer to a DirList object} + \item{\code{fs}: pointer to the FileSystem object} + \item{\code{dirname}: C string containing the directorypath} +\end{itemize} +\subsubsection*{Return value} +This function will return 0 when it has opened the directory, and -1 on error.\\ + +\subsubsection*{Example} +\lstset{numbers=left, stepnumber=1, numberstyle=\small, numbersep=5pt, tabsize=4} +\begin{lstlisting} +#include "efs.h" +#include "ls.h" + + void main(void) + { + EmbeddedFileSystem efsl; + DirList list; + + /* Initialize efsl */ + if(efs_init(&efsl,"/dev/sda")!=0){ + DBG((TXT("Could not initialize filesystem (err \%d).\n"),ret)); + exit(-1); + } + + /* Open the directory */ + ls_openDir(list,&(efsl.myFs),"/usr/bin/"); + + /* Correctly close the filesystem */ + fs_umount(&efs.myFs); + } +\end{lstlisting} + +Please note that it is not required to close this object, if you wish to switch +to another directory you can just call \code{ls\_openDir} on the object again. diff --git a/tools/efsl-0.3.6/docs/pages/mkdir.tex b/tools/efsl-0.3.6/docs/pages/mkdir.tex new file mode 100644 index 0000000..06ea1d4 --- /dev/null +++ b/tools/efsl-0.3.6/docs/pages/mkdir.tex @@ -0,0 +1,47 @@ +\subsubsection*{Purpose} +Creates a new directory. +\subsubsection*{Prototype} +\code{esint8 mkdir(FileSystem *fs,eint8* dirname);} +\subsubsection*{Arguments} +Objects passed to \code{mkdir}: +\begin{itemize} + \item{\code{fs}: pointer to the FileSystem object} + \item{\code{dir}: pointer to the path + name of the new directory} +\end{itemize} +\subsubsection*{Return value} +Returns 0 if no errors are detected.\\ +\newline +Returns non-zero if an error is detected: +\begin{itemize} + \item{Returns -1 if the directory already exists.} + \item{Returns -2 if the path is incorrect (parent directory does not exists).} + \item{Returns -3 if no free space is available to create the directory.} +\end{itemize} +\subsubsection*{Example} +\lstset{numbers=left, stepnumber=1, numberstyle=\small, numbersep=5pt, tabsize=4} +\begin{lstlisting} + #include "efs.h" + + void main(void) + { + EmbeddedFileSystem efsl; + + /* Initialize efsl */ + DBG((TXT("Will init efsl now.\n"))); + if(efs_init(&efsl,"/dev/sda")!=0){ + DBG((TXT("Could not initialize filesystem (err \%d).\n"),ret)); + exit(-1); + } + DBG((TXT("Filesystem correctly initialized.\n"))); + + /* Create new directories */ + if(mkdir(&efs.myFs,"dir1")==0){ + mkdir(&efs.myFs,"dir1/subdir1"); + mkdir(&efs.myFs,"dir1/subdir2"); + mkdir(&efs.myFs,"dir1/subdir3"); + } + + /* Close filesystem */ + fs_umount(&efs.myFs); + } +\end{lstlisting} diff --git a/tools/efsl-0.3.6/docs/pages/plibc.tex b/tools/efsl-0.3.6/docs/pages/plibc.tex new file mode 100644 index 0000000..90e5212 --- /dev/null +++ b/tools/efsl-0.3.6/docs/pages/plibc.tex @@ -0,0 +1,62 @@ +This section of the manual describes the minimalistic C library functions that were +created for EFSL. Since EFSL was designed for ultimate portability, no assumptions about the +workings or even the presence of a C library could be made. Fortunately only very few functions +had to be created that mimicked the operations of well known C library functions. +\\ +\begin{longtable}{|p{0.35\textwidth}|p{0.65\textwidth}|} + + \hline + \multicolumn{2}{|c|}{ + \textbf{PLibC Functions} + } \\ + \multicolumn{2}{|c|}{} \\ + \hline + \hline + \endfirsthead + + \hline + \multicolumn{2}{|c|}{\textbf{PLibC Functions (continued)}} \\ + \hline + \endhead + + \hline + \endfoot + + \hline + \endlastfoot + + \code{strMatch} & \code{euint16 strMatch(eint8* bufa, eint8*bufb,euint32 n)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function compares the strings \code{bufa} and \code{bufb} for \code{n} bytes. + It will return the number of bytes in that section that does not match. So if you + want to compare two strings the return value should be 0, for the strings to match over + the entire \code{n} area. + }\\ + \hline + + \code{memCpy} & \code{void memCpy(void* psrc, void* pdest, euint32 size)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function will copy the contents at location \code{psrc} to location \code{pdest} over + a range of \code{size} bytes. + }\\ + \hline + + \code{memClr} & \code{void memClr(void *pdest,euint32 size)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function will set the memory at \code{pdest} to value \code{0x00} for a range of + \code{size} bytes. + }\\ + \hline + + \code{memSet} & \code{void memSet(void *pdest,euint32 size,euint8 data)} \\ + \hline + \multicolumn{2}{|p{\textwidth}|}{ + This function will set the memory at \code{pdest} to value \code{data} for a range of + \code{size} bytes. + }\\ + \hline +\end{longtable} + diff --git a/tools/efsl-0.3.6/docs/pages/preface.tex b/tools/efsl-0.3.6/docs/pages/preface.tex new file mode 100644 index 0000000..7da0f88 --- /dev/null +++ b/tools/efsl-0.3.6/docs/pages/preface.tex @@ -0,0 +1,25 @@ +\subsection{Project aims} +The EFSL project aims to create a library for filesystems, to be used on +various embedded systems. Currently we support the Microsoft FAT filesystem +family. It is our intention to create pure ANSI C code that compiles on +anything that bears the name 'C compiler'. We don't make assumptions about +endianness or how the memory alignment is arranged on your architecture. +\newline\newline +Adding code for your specific hardware is straightforward, just add code that +fetches or writes a 512 byte sector, and the library will do the rest. +Existing code can be used, writing your own code is only required when you +have hardware for which no target exists. +\subsection{Project status} +Efsl currently supports FAT12, FAT16 and FAT32. Read and write has been tested +and is stable. Efsl runs on PC (GNU/Linux, development environment), +TMS C6000 DSP's from Texas instruments, and ATMega's from Atmel. +You can use this code with as little as 1 kilobyte RAM, however if you have +more at your disposal, an infinite amount can be used as cache memory. +The more memory you commit, the better the performance will be. +\subsection{License} +This project is released under the Lesser General Public license, which +means that you may use the library and it's sourcecode for any purpose you want, +that you may link with it and use it commercially, but that ANY change to the +code must be released under the same license. We would appreciate if you would send +us a patch when you add support for new hardware, but this is not obligatory, since it +falls under linking as far as the LGPL is concerned. diff --git a/tools/efsl-0.3.6/docs/pages/tms6713.tex b/tools/efsl-0.3.6/docs/pages/tms6713.tex new file mode 100644 index 0000000..17bc124 --- /dev/null +++ b/tools/efsl-0.3.6/docs/pages/tms6713.tex @@ -0,0 +1,98 @@ +This section will tell you everything you need to know to start using the +embedded filesystems library on a TMS Digital Signal Processor from Texas Instruments. +The only thing that is required is that you have a McBSP port available, and that your DSP +support CLOCKSTOP mode, which is required to connect a SPI compatible device. + +There are special DSP's from TI which have a special MMC/SD card controller, if you want to +use this special interface you will have to create a hardware endpoint for it. This section only +describes connecting an SD card to a normal McBSP port, since every TI DSP has at least one of them. + +\subsubsection{Hardware} +Connecting the SD card to the McBSP is straightforward, you will have to make 4 data related +connections, Vcc and ground, resulting in a 6 wire interface.\\ +\begin{tabular}{|l|l|l|l|l|} + \hline + \multicolumn{3}{|c|}{SD Card Interface}&\multicolumn{2}{|c|}{McBSP Interface}\\ + \hline + 1 & CS & Chip select & FSX & Frame Sync Transmit \\ + 2 & MOSI & Master out Slave In & DX & Data transmit \\ + 3 & GND & Supply Ground &&\\ + 4 & Vcc & Supply voltage (3.3 Volt) &&\\ + 5 & Clk & Clock & CLKX & Clock Transmit\\ + 6 & GND & Supply ground &&\\ + 7 & MISO & Master in Slave out & DR & Data receive \\ + 8 & NC & Not connected &&\\ + 9 & NC & Not connected &&\\ + \hline +\end{tabular}\\ +You can optionally pull the DataIn and DataOut lines up to Vcc with a $10k\Omega$ resistor, but +we found that this was not required for operation.\\ +\includegraphics[scale=0.4]{schematics/sdcard.eps}\\ +The frame sync from the McBSP port is used to select the card whenever a databyte has to be transferred, it is connected to the chip select of the SD card. The DX and DR pins are connected to the SDcard's DataIn and DataOut lines respectively. Finally the McBSP will have to generate a clock for +the SDcard so that it can perform operations, this is accomplished by connecting the clock transmit +line of the McBSP port to the CLK pin of the SDCard. + +\subsubsection{McBSP configuration} +\begin{longtable}{|p{0.13\textwidth}|p{0.1\textwidth}|p{0.06\textwidth}|p{0.75\textwidth}|} + + \hline + \multicolumn{4}{|c|}{ + \textbf{McBSP Register Explanations} + } \\ + \hline + \hline + \endfirsthead + + \hline + \multicolumn{4}{|c|}{\textbf{mcbsp registers (continued)}} \\ + \hline + \endhead + \hline + \endfoot + + \hline + \endlastfoot + + \multicolumn{3}{|c|}{SPCR}& + \multicolumn{1}{c|}{Serial Port Control Register}\\ + \hline + Name & Bit & Value &\multicolumn{1}{c|}{Value \code{(0x00001800 | 0x00410001)}}\\ + \hline + RRST&\code{0}&\code{1b} & The serial port receiver is enabled \\ + XRST&\code{16}&\code{1b} & The serial port transmitter is enabled \\ + CLKSTP&\code{12:11}&\code{11b} & Clock starts on falling edge without delay(see CLKXM) \\ + GRST&\code{22}&\code{1b} & Sample rate generator is pulled out of reset \\ + \hline + + \multicolumn{3}{|c|}{PCR}& + \multicolumn{1}{c|}{Pin Control Register}\\ + \hline + Name &Bit & Value &\multicolumn{1}{c|}{Value \code{0x00000A0C}}\\ + \hline + CLKXP&\code{1} &\code{0b} & Transmit data on the rising edge ofthe clock\\ + FSXP&\code{3} &\code{1b} & Frame Sync (Chip select on SD card) is active low\\ + CLKXM&\code{9} &\code{1b} & McBSP is a master in SPI mode and generates the clock based on + the sample rate generator\\ + FSXM&\code{10} &\code{1b} & Frame sync is determined by tge sample rate generator\\ + \hline + + \multicolumn{3}{|c|}{RCR/XCR}& + \multicolumn{1}{c|}{Receive/Transmit Control Register}\\ + \hline + Name &Bit & Value &\multicolumn{1}{c|}{Value \code{0x00010000}}\\ + \hline + RWDLEN&\code{7:5} &\code{000b} & Receive element is 8 bits (1byte) large\\ + XDATDLY&\code{17:16} &\code{01b} & 1 bit data delay (after frame sync)\\ + \hline + + \multicolumn{3}{|c|}{SRGR}& + \multicolumn{1}{c|}{Sample Rate Genrator}\\ + \hline + Name &Bit & Value &\multicolumn{1}{c|}{Value \code{0x20000002}}\\ + \hline + CLKSM&\code{29} &\code{1b} & The sample rate generator clock is derived from the internal clock\\ + FSGM&\code{28} &\code{0b} & The transmit frame sync signal is generated on every DXR to XSR copy\\ + CLKGDV&\code{7:0}&\code{0x02h} & The clock divider\\ + \hline + +\end{longtable} diff --git a/tools/efsl-0.3.6/docs/pages/types.tex b/tools/efsl-0.3.6/docs/pages/types.tex new file mode 100644 index 0000000..d6a4470 --- /dev/null +++ b/tools/efsl-0.3.6/docs/pages/types.tex @@ -0,0 +1,26 @@ +Standard C data types have the annoying tendency to have different sizes on difference compilers +and platforms. Therefore we have created 9 new types that are used everywhere throughout the library. +When you implement your platform you should check if any of the existing one matches your hardware, +or create a new one.\\ +\\ +Here's an overview:\\\\ +\begin{tabular}{|p{4cm}|l|l|} + \hline + \textbf{Type} & \textbf{Size} & \textbf{Signedness}\\ + \hline + \hline + \texttt{eint8} & 1 byte & default to platform \\ + \texttt{esint8} & 1 byte & signed \\ + \texttt{euint8} & 1 byte & unsigned \\ + \hline + \texttt{eint16} & 2 bytes & default to platform \\ + \texttt{esint16} & 2 bytes & signed \\ + \texttt{euint16} & 2 bytes & unsigned \\ + \hline + \texttt{eint32} & 4 bytes & default to platform \\ + \texttt{esint32} & 4 bytes & signed \\ + \texttt{euint32} & 4 bytes & unsigned \\ + \hline +\end{tabular} +$ $\\\\\\ +You will find the relevant code in the file \filename{types.h} in the directory \filename{inc/}. diff --git a/tools/efsl-0.3.6/docs/pics/sdcard.eps b/tools/efsl-0.3.6/docs/pics/sdcard.eps new file mode 100644 index 0000000..8d4118c --- /dev/null +++ b/tools/efsl-0.3.6/docs/pics/sdcard.eps @@ -0,0 +1,3501 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner +%%Title: sdcard.eps +%%CreationDate: Tue May 24 14:52:01 2005 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 14 14 647 607 +%%EndComments +%%BeginPreview: 256 239 1 239 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000015554000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 000000000000000000000000000000a040000000000000000000000000000000 +% 0000000000000000000000000000008010000000000000000000000000000000 +% 0000000000000000000000000000020080000000000000000000000000000000 +% 0000000000000000000000000000004010000000000000000000000000000000 +% 0000000000000000000000000000020000000000000000000000000000000000 +% 000000000000000000000000000000add4000000000000000000000000000000 +% 0000000000000000000000000000000000003000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000040000000000000000000000000000000000 +% 0000000000000000000000000000010254000000000000000000000000000000 +% 0000000000000000000000000000044000000000000000000000000000000000 +% 0000000000000000000000000000010410000000000000000000000000000000 +% 0000000000000000000000000000040010000400000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000040000000000000000000000000000000000 +% 000000000000000000000000001fd555557c0000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000040000000000000000000000000000 +% 0000000000000000000000000005b80000000000000000000000000000000000 +% 00000000000000000000000000000000000400102a1400000000000000000000 +% 0000000000000000000000850801200000000010000c00000000000000000000 +% 0000000000000000000002310401300000040010280400000000000000000000 +% 0000000000000000000000800080080000000012000400000000000000000000 +% 0000000000000000000000020401200001245100a01400000000000000000000 +% 0000000000000000000000000000000000200000000000000000000000000000 +% 0000000000000000040000000000000010240000000000000000000000000000 +% 00000000000000000400000000000152e0200000000000000000000000000000 +% 0000000000000000000000000000000010240020680400000000000000000000 +% 00000000000000000000000000000000002000080a0400000000000000000000 +% 00000000060000a0000000000000000010240000100400000000000000000000 +% 0000000000000a24000000000000000000000032480400000000000000000000 +% 00000000064009a8000400000000000010250000000000000000000000000000 +% 0000000000000082000000000006b56a80048100000000000000000000000000 +% 0000000000080020000400000000000090240000000000000000000000000000 +% 0000000000000000018470000000005880040100000000000000000000000000 +% 0000000000000000000000000001001890240000000000000000000000000000 +% 0000000000000000000440000000400080040100040000000000000000000000 +% 0000000000000d00000040000001916a80240000040000000000000000000000 +% 000000000104a100000440000000000090040100042000000000000000000000 +% 0000000000020100000040000006aaaa80240000444000000000000000000000 +% 0000001001000d00000440000000000010040100040000000000000000000000 +% 0000000000000009024040000000000000240000042000000000000000000000 +% 0000000000000000000040000000000000040100a88000000000000000000000 +% 0000000000000000020000000000000000240000040000000000000000000000 +% 0000003018360401000040000000000010040100a4d000000000000000000000 +% 000000000000a500020040000000000000240000244000000000000000000000 +% 0000000000200000000400000000000010040100848000000000000000000000 +% 0000002000009540020040000000000000240000040000000000000000000000 +% 00000000000000010204000000000000000401012d5000000000000000000000 +% 0000000000000003160040000000000010240000045000000000000000000000 +% 0000000000000000020400000000000000040000040000000000000000000000 +% 0000000000000000020000000000000010240900040000000000000000000000 +% 0000000000000000020440000000000000040000040000000000000000000000 +% 0000000000000001020000000000000010240000040000000000000000000000 +% 0000002000000000420400000000000000040800c40000000000000000000000 +% 000000100000000002000000000000001024010004f000000000000000000000 +% 0000000000000000420440000000000000040800940000000000000000000000 +% 0000000000000000020000000000000000040000040000000000000000000000 +% 0000000000000001420440000000000000000800040400000000200000000000 +% 0000000000000000020000000004008000042000040000000000000000000000 +% 0000ffffd556baab6b76daaaaaad55aa9024a800040000000000000000000000 +% 0000800000000000434040020044480101000018040008001000001800808000 +% 0000800000000000024440020044088800440814040004001000000400808000 +% 000080000000000046404002004448090100a01004000c101000001200818000 +% 00008c0000000000084440020044088800440912040000001000000200808000 +% 000082000000000052404002004448010100a112040020001000401000000000 +% 000000000000000020444003fe7ffbdf556ead56840000001000000200800000 +% 000084000000000042684a9302444db15b7fbfbb56fca0000000401000008000 +% 0000040000000000c061485386644a9922229112040000001000000200800000 +% 00008a0200000001024248130274cc090365ab12040000001000001100000000 +% 000e88000000000242604813864048912a16b1120400b0000000000200800000 +% 00008800000000040254cc13026448118660ab10000000001000001000008000 +% 00008400000000084240489322424c290224a1120000a0001000000200800000 +% 00008502000000100254cd13126548910264a312000001801000001000000000 +% 0000840000000020404048330264cc091265ab10000040201000001200800000 +% 000a84000000006002614813864448912300b9120000a1800000000100000000 +% 00008144045000a06a404c13026448119260ab00000010000000201200800000 +% 000a800000000120c660489322444c2b0254a912000140001000000004800000 +% 00048000000001214244c913126548090264ab10000050021000201200800000 +% 0000800000000123024848130264cc291244ab02000000003000200008800000 +% 80008000000001201241491386644a130268ab1000000d00000000120a800000 +% 000880000000012122424c130254c8131365a912000000418000201004800000 +% 8000800000000121927fcff3fe7fcff9fe7ebf1200000800000000020a800000 +% 0000800000000121024040020040400201400810000000008000001000800000 +% 8000800000000121864040020040480800440802000000000000001200800000 +% 000080000000012002554aa2aa7fcff3fe7fff10000000000000001000800000 +% 8000800000000123024040020040480800400802000000000000201200800000 +% 0000800000000120122a8fe2ea7fcff3fe7fff1000000000000020100a960000 +% 8000800000000123220000000000000000000012000000000000001200800000 +% 000080000000012006000180300201c0100a0810000000000000201004980000 +% 00008000000001230a0801405006010050020412000000001000001200800000 +% 800080000000012002000080200201c010040410000000100000001000800000 +% 8000000000000120aa000100580c01406804100200000011a000001200800000 +% 0000000000000123fe0000c0300201c010080c10000000100000401200800000 +% 8000000000000120000000000000000000000012000000000000001400140000 +% 00000000000001236a1643a83e1b4399a92d6990000000000000001200840000 +% 8000000000000120000c40801413619140a10a91000000000000001200040000 +% 0000000000000120000400e84a0a609028a15948000000000000001000800000 +% 8000000000000120701683485e0b439048c12410000000000000801200000000 +% 00000000000001204012c0000000000000000004800000000000001000800000 +% 8000000000000120300a40000000000000000014820200000001001200000000 +% 0000000000000120700e48000000000000000010080080000000001200800000 +% 8000000000000120000c48000000000000000000400840000000001000000000 +% 0000000000000062080000000000000000000022040100000000001200010000 +% 800000000000002220000000000000000000001e3ffec0000000001200800000 +% 0000000000000062610000000000000000000020000000000002001200810000 +% 8000000000000022400000000000000000000010000000001000001400800000 +% 0000000000000060000000000000000000000020000000001004001000010000 +% 8000000000000020000000000000000000000010000000000004001000000000 +% 0000000000000120000000000000000000000034089155555000001000010000 +% 8000000000000120000000000000000000000014000000000000001000000000 +% 0000000000000120000000000000000000000022000000000000001000010000 +% 8000000000000100000000000000000000000010000000000000001000000000 +% 0000000000000120000000000000000000000022000000000000001000010000 +% 8000000000000100000000000000000000440010000000000000001000000000 +% 0000000000000120000000000000000006920022000000000008001000010000 +% 8000000000000100000000000000000000000010000000000000001000000000 +% 0000000000000120000000000000000000009020000800000008001000010000 +% 80000000000001000000000000000000009084801b4a00000000001000000000 +% 00000000000001200000000000000000044091300a4400000008001000010000 +% 8000000000000100000000000000000000100404000000000000001000010000 +% 0000000000000120000000000000000000000024000000000008001000010000 +% 8000000000000100000000000000000000000014080800000000001e55550000 +% 0000000000000120000000000000000000000020030080000000001200000000 +% 8000000000000100000000000000000000000000184a00000000001200000000 +% 0000000000000120000000000000000000000020000000000000001200000000 +% 8000000000000100000000000000000000000000000000000004001200000000 +% 0000000000000120000000000000000000000020000000000000001200000000 +% 8000000000000100000000000000000000000000000000000000001200000000 +% 0000000000000120000000000000000000000020000000000000001200000000 +% 8000000000000100000000000000000000000000000000000000001200000000 +% 0000000000000120000000000000000000000020000000000000001200000000 +% 8000000000000100000000000000000000000000000000000000001200000000 +% 0000000000000120000000000000000000000020000000000000000200000000 +% 8000000000000100000000000000000000000000000000000000001200000000 +% 000000000000012000000000000000000000002000000000000001be00000000 +% 8000000000000100000000000000000000000000000000000000000000000000 +% 0000000000000120000000000020000000000020000000000000000000000000 +% 8000000000000100000000000000000000000000000000000000000000000000 +% 0000000000000120000000000000000000000020000000000000000000000000 +% 8000000000000100000000000020000000000000000000000000000000000000 +% 0000000000000120000000000000000000000020000000000000000000000000 +% 8000000000000100000000000000000000000000000000000000000404000000 +% 0000000000000120000000000000000000000020000000000000003000000000 +% 8000000000000100000000000000000000000000000000000000000004000000 +% 0000000000000120000000000000000000000020000000000000000000000000 +% 8000000000000100000000000020000000000020000000000000000024000000 +% 0000000000000120000000000000000000000020000000000000003111800000 +% 80000000000001000000000000000000000000000000000000000000b4000000 +% 0000000000000120000000000020000000000020000000000000000000000000 +% 8000000000000100000000000000000000000020000000000000000000000000 +% 0000000000000120000000000000000000000020000000000000000000000000 +% 8000000000000100000000000020000000000020000000000000000000000000 +% 0000000000000020000000000000000000000020000000000000000000000000 +% 8000000000000100000000000000000000000020000000000000000000000000 +% 0000000000000020000000000000000000000020000000000000000000000000 +% 8000000000000100000000000000000000000020000000000000000000000000 +% 0000000000000020000000000000000000000020000000000000000000000000 +% 8000000000000100000000000000000000000020000000000000000000000000 +% 0000000000000020000000000020000000000020000000000000000000000000 +% 8000000000000100000000000000000000000020000000000000000000000000 +% 0000000000000020000000000020000000000020000000000000000000000000 +% 8000000000000100000000000000000000000020000000000000000000000000 +% 0000000000000000000000000020000000000020000000000000000000000000 +% 8000000000000100000000000000000000000020000000000000000000000000 +% 0000000000000000000000000020000000000020000000000000000000000000 +% 8000000000000100000000000000000000000020000000000000000000000000 +% 0000000000000000000000000020000000000020000000000000000000000000 +% 8000000000000100000000000000000000000020000000000000000000000000 +% 0000000000000000000000000020000000000020000000000000000000000000 +% 8000000000000220000000000000000000000020000000000000000000000000 +% 0000000000000100000000000020000000000020000000000000000000000000 +% 8000000000000100000000000000000000000020000000000000000000000000 +% 0000000000000000000000000000000000000020000000000000000000000000 +% 8000000000000200000000000020000000000020000000000000000000000000 +% 0000000000000000000000000000000000000020000000000000000000000000 +% 8000000000000200000000000020000000000020000000000000000000000000 +% 0000000000000000000000000000000000000020000000000000000000000000 +% 8000000000000200000000000020000000000020000000000000000000000000 +% 0000000000000000000000000000000000000020000000000000000000000000 +% 8000000000000200000000000020000000000020000000000000000000000000 +% 0000000000000000000000000020000000000020000000000000000000000000 +% 8000000000000200000000000000000000000020000000000000000000000000 +% 0000000000000000000000000020000000000020000000000000000000000000 +% 8000000000000200000000000020000000000020000000000000000000000000 +% 0000000000000000000000000000000000000020000000000000000000000000 +% 8000000000000200000000000020000000000020000000000000000000000000 +% 0000000000000000000000000000000000000020000000000000000000000000 +% 8000000000000200000000000020000000000020000000000000000000000000 +% 0000000000000000000000000020000000000020000000000000000000000000 +% 8000000000000200000000000020000000000020000000000000000000000000 +% 0000000000000000000000000020000000000020000000000000000000000000 +% 8000000000000200000000000020000000000020000000000000000000000000 +% 0000000000000100000000000020000000000024000000000000000000000000 +% 8000000000000100000000000020000000000024000000000000000000000000 +% 0000000000000070000000000020000000000028000000000000000000000000 +% 800000000000001555556b5555bfffffffffffe0000000000000000000000000 +% 0000000000000000000000000020000000000000000000000000000000000000 +% 8000000000000000000000000020000000000000000000000000000000000000 +% 0000000000000000000000000020000000000000000000000000000000000000 +% 8000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 8000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000020000000000000000000000000000000000000 +% 8000000000000000000000000020000000000000000000000000000000000000 +% 0000000000000000000000000020000000000000000000000000000000000000 +% 8000000000000000000000000020000000000000000000000000000000000000 +% 0000000000000000000000000020000000000000000000000000000000000000 +% 800000000000000000000000002000000000003000006000000000a000000000 +% 0000000000000000000000000020000000000040000001000000020000000000 +% 800000000000000000000000002000000000000d504015609182002000000000 +% 000000000000000000000000002000000000000820c000009100020000000000 +% 8000000000000000000000000020000000000000000000000000000000000000 +% 0000000000000000000000000020000000000000000000000000000000000000 +% 8000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 8000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 8000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 8000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 8000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +% 8000000000000000000000000000000000000000000000000000000000000000 +% 0000000000000000000000000000000000000000000000000000000000000000 +%%EndPreview +%%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 592 translate +631.99999999999989 -592 scale +% Image geometry +632 592 8 +% Transformation matrix +[ 632 0 0 592 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 632 string def +/gstr 632 string def +/bstr 632 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: 180734 ASCII Bytes +colorimage +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$qYpSKeUdaOs-!D4~> +JcC<$qYpSIeq*jPs-!D4~> +JcC<$qYpSKeUdaOs-!D4~> +JcC<$qYpSKXF^D&s-!D4~> +JcC<$qYpSIWe(2$s-!D4~> +JcC<$qYpSKXF^D&s-!D4~> +JcC<$qYpSKXF^D&s-!D4~> +JcC<$qYpSIWe(2$s-!D4~> +JcC<$qYpSKXF^D&s-!D4~> +JcC<$qYpSKXQKN_^&.j0^&%a/KD#6O^&S,GK@RZKs8Tc`s+14#s*t~> +JcC<$qYpSIWoj<]^AIs1^A@j0JbB$M^An5IJ_%QLs8Tfas+14#s*t~> +JcC<$qYpSKXQKN_^&.j0^&%a/KD#6O^&S,GK@RZKs8Tc`s+14#s*t~> +JcC<$qYpSKXQKN_!8E/+6%T&es474#~> +JcC<$qYpSIWoj<]!8E))5_8rds474#~> +JcC<$qYpSKXQKN_!8E/+6%T&es474#~> +JcC<$qYpSKXQKN_KA->*!.k0$s474#~> +JcC<$qYpSIWoj<]J_L,(!.k0$s474#~> +JcC<$qYpSKXQKN_KA->*!.k0$s474#~> +JcC<$qYpSKXQKN_KA->*!.k0$s474#~> +JcC<$qYpSIWoj<]J_L,(!.k0$s474#~> +JcC<$qYpSKXQKN_KA->*!.k0$s474#~> +JcC<$qYpSKXQKN_KA->*!.k0$s474#~> +JcC<$qYpSIWoj<]J_L,(!.k0$s474#~> +JcC<$qYpSKXQKN_KA->*!.k0$s474#~> +JcC<$qYpSKXQKN_KDkfQK)e2iXS2Yp]i+f]!knWIr.>!_rVlitJcC<$f)L7~> +JcC<$qYpSIWoj<]Jc5TOJH.rdWqQGn^/b,_!l"]Kr.+j^rVlitJcC<$f)L7~> +JcC<$qYpSKXQKN_KDkfQK)e2iXS2Yp]i+f]!knWIr.>!_rVlitJcC<$f)L7~> +JcC<$qYpSKXQKN_KDtlO6,!9t!JA)Vrr`>8s+>t!rr<%Ms+14$s*t~> +JcC<$qYpSIWoj<]Jc>ZM5ed6t!J.uUrr`>9s+,arrr<%Ms+14$s*t~> +JcC<$qYpSKXQKN_KDtlO6,!9t!JA)Vrr`>8s+>t!rr<%Ms+14$s*t~> +JcC<$qYpSKXQKN_KDtlN!;uis61Y$YKE(t(KD>HHK7X&Rs474#~> +JcC<$qYpSIWoj<]Jc>ZL!;uis5k=pXJcGb$Jb]6FJV!iPs474#~> +JcC<$qYpSKXQKN_KDtlN!;uis61Y$YKE(t(KD>HHK7X&Rs474#~> +JcC<$qYpSKXQKN_KDtlO6,!9t!NZ:mrr>@arrIa +JcC<$qYpSIWoj<]Jc>ZM5ed6t!NH.krr>=`rrI[9rdjtH!!%TMJcF=$J,~> +JcC<$qYpSKXQKN_KDtlO6,!9t!NZ:mrr>@arrIa +JcC<$qYpSKe`Ql3KDkfR!/%t;!($5V!($S`!58Aa!E-W0rr<%Ms+14$s*t~> +JcC<$qYpSIf&lu4Jc5TP!.hk8!'p/U!'pM_!5AG`!EHl4rr<%Ms+14$s*t~> +JcC<$qYpSKe`Ql3KDkfR!/%t;!($5V!($S`!58Aa!E-W0rr<%Ms+14$s*t~> +JcC<$qYpSKe`Zu4KDb`P]n=#u61k0X6,!*o!S'L7rr<%Ms+14$s*t~> +JcC<$qYpSIf'!)5Jc,NN^4F#u5kP'W5ed'o!S0O7rr<%Ms+14$s*t~> +JcC<$qYpSKe`Zu4KDb`P]n=#u61k0X6,!*o!S'L7rr<%Ms+14$s*t~> +JcC<$qYpSKe`Zu4KDGNJeH#:B!PLenrr<&trr>?9s+14$s*t~> +JcC<$qYpSIf'!)5JbfCC!PUhnrr<&trr><8s+14$s*t~> +JcC<$qYpSKe`Zu4KDGNJeH#:B!PLenrr<&trr>?9s+14$s*t~> +JcC<$qYpSKXQTW`KDGNJ;QTQk!@cRorrM72rVljHJcC<$f)L7~> +JcC<$qYpSIWosE^Jbf`l!@ZOorrM+-rVljGJcC<$f)L7~> +JcC<$qYpSKXQTW`KDGNJ;QTQk!@cRorrM72rVljHJcC<$f)L7~> +JcC<$qYpSKXQTW`KDkfQ]g78NXSi)!K>%0^!/(4L"hd2fK7bWNrr@\&s+14$s*t~> +JcC<$qYpSIWosE^Jc5TO^-I5LWr2ktJ\M$]!.k(J"hm5eJUo6Irr@V$s+14$s*t~> +JcC<$qYpSKXQTW`KDkfQ]g78NXSi)!K>%0^!/(4L"hd2fK7bWNrr@\&s+14$s*t~> +JcC<$qYpSKXQTW`KAun3K>%0^!/#k&JcF=$J,~> +JcC<$qYpSIWosE^J`?\1J\M$]!.f_$JcF=$J,~> +JcC<$qYpSKXQTW`KAun3K>%0^!/#k&JcF=$J,~> +JcC<$qYpSKXQTTa]n>&=!/#k&JcF=$J,~> +JcC<$qYpSIWosB_^4G# +JcC<$qYpSKXQTTa]n>&=!/#k&JcF=$J,~> +JcC<$qYpSKXQTW`KA->*K7X&Rs474#~> +JcC<$qYpSIWosE^J_L,(JV!iPs474#~> +JcC<$qYpSKXQTW`KA->*K7X&Rs474#~> +JcC<$qYpSKXQTTcK0b.'h>[MhK7X&Rs474#~> +JcC<$qYpSIWosBaJO"e#h>[MiJV!iPs474#~> +JcC<$qYpSKXQTTcK0b.'h>[MhK7X&Rs474#~> +JcC<$qYpSKe`Qo%K)e4:K)e4:KDn17K*">k;Z24K!57=j!53s`JcGNFJ,~> +JcC<$qYpSIf&m#&JH.t7JH.t7Jc7q4JHA)f +JcC<$qYpSKe`Qo%K)e4:K)e4:KDn17K*">k;Z24K!57=j!53s`JcGNFJ,~> +JcC<$qYp\N;M0TfrVuparVll!ir9"lci +JcC<$qYp\L +JcC<$qYp\N;M0TfrVuparVll!ir9"lci +JcC<$qYpPJq#Ku +JcC<$qYpPHq#Ku:!WYJcp433Dl[]':5lQ<9!'ig+!!'`as+14Gs*t~> +JcC<$qYpPJq#Ku +JcC<$qYpSKXSi(u]rD&3!<7ZSXT,s6]n-37s7u\F~> +JcC<$qYpSIWr2ks^8_/4!<7TQWrKd5^4H<8s7u\F~> +JcC<$qYpSKXSi(u]rD&3!<7ZSXT,s6]n-37s7u\F~> +JcC<$qYpSKXIT:jK7X&Rs7lVE~> +JcC<$qYpSIWgs(hJV!iPs7lVE~> +JcC<$qYpSKXIT:jK7X&Rs7lVE~> +JcC<$qYpSKXIT:j6%T&es7lVE~> +JcC<$qYpSIWgs(h5_8rds7lVE~> +JcC<$qYpSKXIT:j6%T&es7lVE~> +JcC<$qYpSKXR#leeLC8ks+C8J!N^qCXT*nSXG^!2rrFS!JcC<$q>Ys~> +JcC<$qYpSIWpBZcegU;ns+1,K!NL_?WrIVOWf:$5rrFP!JcC<$q>Ys~> +JcC<$qYpSKXR#leeLC8ks+C8J!N^qCXT*nSXG^!2rrFS!JcC<$q>Ys~> +JcC<$qYpQ/lMpm:g]%7>g]%6RJcC<$q#>j~> +JcC<$qYpQ0lMpm8g]%7=g]%6RJcC<$q#>j~> +JcC<$qYpQ/lMpm:g]%7>g]%6RJcC<$q#>j~> +JcC<$irB%2g]%8+g]%6RJcC<$q#>j~> +JcC<$irB%0g]%8)g]%6RJcC<$q#>j~> +JcC<$irB%2g]%8+g]%6RJcC<$q#>j~> +JcC<$qYpQ/lMpm:g]%8+g]%6RJcC<$q#>j~> +JcC<$qYpQ0lMpm8g]%8)g]%6RJcC<$q#>j~> +JcC<$qYpQ/lMpm:g]%8+g]%6RJcC<$q#>j~> +JcC<$qYpSKea*88KDkiKK)iUWs8R]O^&J'0K)kt)rr<"Nh#@@?JcC<$q#>j~> +JcC<$qYpSIf'EA9Jc5WIJH3FVs8RWM^Ae01JH5b%rr<"Lh#@@>JcC<$q#>j~> +JcC<$qYpSKea*88KDkiKK)iUWs8R]O^&J'0K)kt)rr<"Nh#@@?JcC<$q#>j~> +JcC<$qYpSKXR#odKDtlS6%f3NK)kWF%)"s?]g:3KrrBb4]tO@Ds+B,,!'u29JcGNFJ,~> +JcC<$qYpSIWpB]bJc>ZQ5_8sLJH5ED%),!@^-L9LrrBe5^:sOFs+/u*!'l,8JcGNFJ,~> +JcC<$qYpSKXR#odKDtlS6%f3NK)kWF%)"s?]g:3KrrBb4]tO@Ds+B,,!'u29JcGNFJ,~> +JcC<$qYpSKea*88KE(uOKDkiMKD5BG62gfcKE(rOq#:AI^"iVf!.k0$s7lVE~> +JcC<$qYpSIf'EA9JcGcMJc5WKJbT0E5lL]bJcG`Mq#:AG^>/_g!.k0$s7lVE~> +JcC<$qYpSKea*88KE(uOKDkiMKD5BG62gfcKE(rOq#:AI^"iVf!.k0$s7lVE~> +JcC<$irB%2rr2sarVlj`p\t9-!<)p"KE(rOq#CAHh#@?SJcC<$q#>j~> +JcC<$irB%0rr2s`rVlj_p\t9.!<)p"JcG`Mq#CAFh#@?SJcC<$q#>j~> +JcC<$irB%2rr2sarVlj`p\t9-!<)p"KE(rOq#CAHh#@?SJcC<$q#>j~> +JcC<$irB%2rr3.S!/#n(KD5EGKDkfPXM+YIr.FtJ!JA)@rrE,5JcC<$q>Ys~> +JcC<$irB%0rr3.Q!.f\$JbT3EJc5TNWkSMIr.4hH!J.u?rrE,6JcC<$q>Ys~> +JcC<$irB%2rr3.S!/#n(KD5EGKDkfPXM+YIr.FtJ!JA)@rrE,5JcC<$q>Ys~> +JcC<$qYpQ/lMpm:rr3-%KE(tb!;HNnKDkfNXFpEM!PLeurr@]+rrE,5JcC<$q>Ys~> +JcC<$qYpQ0lMpm8rr3-%JcGba!;HNnJc5TLWe('I!PUhurr@W)rrE,6JcC<$q>Ys~> +JcC<$qYpQ/lMpm:rr3-%KE(tb!;HNnKDkfNXFpEM!PLeurr@]+rrE,5JcC<$q>Ys~> +JcC<$qYpSKXR#odKE(rP]n?:`s+C+H!PLetrr>smrr<&urr@]+rr>?9s+14Fs*t~> +JcC<$qYpSIWpB]bJcG`N^4H7_s+0tF!PUhtrr?'prr<&urr@W)rr><8s+14Fs*t~> +JcC<$qYpSKXR#odKE(rP]n?:`s+C+H!PLetrr>smrr<&urr@]+rr>?9s+14Fs*t~> +JcC<$qYpSKXR#odKE(rP]n?:`!JA)[rr>@`rr@]Irr>@arr@]+rrGEYs~> +JcC<$qYpSIWpB]bJcG`N^4H7_!J.uZrr>=_rr@WGrr>=`rr@W)rrGB9JcC<$q>Ys~> +JcC<$qYpSKXR#odKE(rP]n?:`!JA)[rr>@`rr@]Irr>@arr@]+rrGEYs~> +JcC<$qYpSKXR#odKDtlS!/%tuK0fG8!/(4L$,&X +JcC<$qYpSIWpB]bJc>ZQ!.hkuJO'/5!.k(J$,/[=s$2/8s+.o`rrI\brr2tLg]%9S^4H<8s7u\F~> +JcC<$qYpSKXR#odKDtlS!/%tuK0fG8!/(4L$,&X +JcC<$qYpSKXR#odKDkfMec)ZIrrB.ss8T/#ec,RPeZ;YHXO[:L!/'&+!!%TMJcGNFJ,~> +JcC<$qYpSIWpB]bJc5TKf)D]HrrB(qs8T)!f)G[QeuD_MWn..K!.io)!!%TMJcGNFJ,~> +JcC<$qYpSKXR#odKDkfMec)ZIrrB.ss8T/#ec,RPeZ;YHXO[:L!/'&+!!%TMJcGNFJ,~> +JcC<$qYpSKXR#odKA6D+KA6D+!.k0$s7lVE~> +JcC<$qYpSIWpB]bJ_U2)J_U2)!.k0$s7lVE~> +JcC<$qYpSKXR#odKA6D+KA6D+!.k0$s7lVE~> +JcC<$qYpSKea*88KA6D+6/2D?!/#k&JcGQGJ,~> +JcC<$qYpSIf'EA9J_U2)5hl;>!.f_$JcGQGJ,~> +JcC<$qYpSKea*88KA6D+6/2D?!/#k&JcGQGJ,~> +JcC<$qYpSKea*88KA6D+!8IMR!.k0$s7lVE~> +JcC<$qYpSIf'EA9J_U2)!8IMR!.k0$s7lVE~> +JcC<$qYpSKea*88KA6D+!8IMR!.k0$s7lVE~> +JcC<$qYpSKea*58^$,LsKDkiN62gid5lcO'r;bUP!'u29JcGNFJ,~> +JcC<$qYpSIf'E>9^?GUtJc5WL5lL`c5QH@#r;bUP!'l,8JcGNFJ,~> +JcC<$qYpSKea*58^$,LsKDkiN62gid5lcO'r;bUP!'u29JcGNFJ,~> +JcC<$qZ$SJ!<<"M"@7\?s1Q5J!kj5=r;QbLnG`K@JcC<$q#>j~> +JcC<$qZ$SH!<<"K"@.PJcC<$q#>j~> +JcC<$qZ$SJ!<<"M"@7\?s1Q5J!kj5=r;QbLnG`K@JcC<$q#>j~> +JcC<$qYpPJq#LF\rr<:V!!*&4]n8WFK)e4:K)e3iK)e48!<7ZO!:^!g6%T&es7lVE~> +JcC<$qYpPHq#LF[rr<:T!!*&5^4AQDJH.t7JH.sfJH.t5!<7TM!:^!g5_8rds7lVE~> +JcC<$qYpPJq#LF\rr<:V!!*&4]n8WFK)e4:K)e3iK)e48!<7ZO!:^!g6%T&es7lVE~> +JcC<$qYpYMXT/>!K)iU"rrTm8KDkiN62lK:!:^!g!.k0$s7lVE~> +JcC<$qYpYKWrN+tJH3F!rrTp7Jc5WL5lQ<7!:^!g!.k0$s7lVE~> +JcC<$qYpYMXT/>!K)iU"rrTm8KDkiN62lK:!:^!g!.k0$s7lVE~> +JcC<$qYpPJXoABRnG`IgJcC<$q#>j~> +JcC<$qYpPHXoABPnG`IgJcC<$q#>j~> +JcC<$qYpPJXoABRnG`IgJcC<$q#>j~> +JcC<$qYpSKeZSoPKCJm@!.k0$s7lVE~> +JcC<$qYpSIeuo#QJai[>!.k0$s7lVE~> +JcC<$qYpSKeZSoPKCJm@!.k0$s7lVE~> +JcC<$qYpSKXKMR'KCJm@!.k0$s7lVE~> +JcC<$qYpSIWil@%Jai[>!.k0$s7lVE~> +JcC<$qYpSKXKMR'KCJm@!.k0$s7lVE~> +JcC<$qYpSKXKMR'KCJm@6%T&es7lVE~> +JcC<$qYpSIWil@%Jai[>5_8rds7lVE~> +JcC<$qYpSKXKMR'KCJm@6%T&es7lVE~> +JcC<$qYpSKk-"^aKCJm@!.k0$s7lVE~> +JcC<$qYpSIii`:]Jai[>!.k0$s7lVE~> +JcC<$qYpSKk-"^aKCJm@!.k0$s7lVE~> +JcC<$qYpbPec5XL!($O8!^S78rdt1Nre(5:s+:>$6-0'+KCJm@!.k0$s7lVE~> +JcC<$qYpbNf)PaM!'pI5!^J.6rdb%Lrdk)7s+(2!5fis*Jai[>!.k0$s7lVE~> +JcC<$qYpbPec5XL!($O8!^S78rdt1Nre(5:s+:>$6-0'+KCJm@!.k0$s7lVE~> +JcC<$qYp\Nec5Y8li-qbaSu6mnG`JSoDej(nc&U&rVll2r;Qc1rr3)6K7gl4rrB``s0_lW~> +JcC<$qYp\Lf)Pb8li-qbaSu6knG`JRoDej)nc&U'rVll3r;Qc2rr3)7JUtQ1rrBcas0_lW~> +JcC<$qYp\Nec5Y8li-qbaSu6mnG`JSoDej(nc&U&rVll2r;Qc1rr3)6K7gl4rrB``s0_lW~> +JcC<$qYpPJrr2ruli-qbaSu6mnG`K@oDegjo)J_UrVllu^&J$4]`A$2!J<]:rrGE +JcC<$qYpPHrr2ruli-qbaSu6knG`K>oDegjo)J_TrVllu^Ae-5^&\-3!J*N7rrGB9rVlitJcE.X +J,~> +JcC<$qYpPJrr2ruli-qbaSu6mnG`K@oDegjo)J_UrVllu^&J$4]`A$2!J<]:rrGE +JcC<$qYpPJrr2ruli-qbaSu6mnG`IgoD\j)!:p-j]n?:`s$?Ya!J:CNs8R`MrrPId^&J$3!.k0X +s*t~> +JcC<$qYpPHrr2ruli-qbaSu6knG`IgoD\j*!:p-j^4H7_s$6S`!J(7Ls8RZKrrPFc^Ae-4!.k0X +s*t~> +JcC<$qYpPJrr2ruli-qbaSu6mnG`IgoD\j)!:p-j]n?:`s$?Ya!J:CNs8R`MrrPId^&J$3!.k0X +s*t~> +JcDhO"2-,`KCo3B!!%ZFrr>@_!!'_,rr@]Nrr<&ls8.HIrr<&?rr@]@rr<&irr@]Arr@]Mrs")U +KE(rO!<)rtKDkfO62s7Mrr<%Ms0_lW~> +JcDhO"26/`Jb9!@!!%TDrr>=^!!'b-rr@WLrr<&ls8.BGrr<&?rr@W>rr<&irr@W?rr@WKrs"#S +JcG`M!<)rtJc5TM5lX+Krr<%Ms0_lW~> +JcDhO"2-,`KCo3B!!%ZFrr>@_!!'_,rr@]Nrr<&ls8.HIrr<&?rr@]@rr<&irr@]Arr@]Mrs")U +KE(rO!<)rtKDkfO62s7Mrr<%Ms0_lW~> +JcDkP"hd5%s+:=FrrE,5rr +JcDkP"hm8%s+(1DrrE,6rr +JcDkP"hd5%s+:=FrrE,5rr +JcDkP!/'hA!58=1!!)cn!!)Qh!/(:N!($M^!C;A;s8R`Hrr<&?rr@]@rr<&irr<&hrr@]Mrs",U +K)e4;KDkiMKDkfS!<<(OKDtq&s0_lW~> +JcDkP!.j\?!5AC2!!)cn!!)Qh!.k.L!'pG]!C258s8RZFrr<&?rr@W>rr<&irr<&hrr@WKrs"&S +JH.t8Jc5WKJc5TQ!<<(MJc>_$s0_lW~> +JcDkP!/'hA!58=1!!)cn!!)Qh!/(:N!($M^!C;A;s8R`Hrr<&?rr@]@rr<&irr<&hrr@]Mrs",U +K)e4;KDkiMKDkfS!<<(OKDtq&s0_lW~> +JcDkP!/(+I!58C3!/(+I!PO-[rrE+PqYpQ/rIY3cs8N)urr>@^s8R`NrrIa +JcDkP!.jtG!5AI4!.jtG!PX-ZrrE+NqYpQ0rIG'bs8N)urr>=]s8RZLrrI[9q#: +JcDkP!/(+I!58C3!/(+I!PO-[rrE+PqYpQ/rIY3cs8N)urr>@^s8R`NrrIa +JcDkPrIY*`rVunM!rkPPqYpW1!58.,!58Aa!<@cGrr<&urr<&rs8R`Nrs$/&!'pSb^&@s2!6G0? +KCJm@!:p-i!:g'hKDkfM!;uisKDkiMKDkfM!<)ou.0+r![Jta~> +JcDkPrIFs_rVunK!rkMNqYpW2!5A4-!5AG`!<@]Err<&urr<&rs8RZLrs$2&!'gMa^A\'3!6G0? +Jai[>!:p-i!:g'hJc5TK!;uisJc5WKJc5TK!<)ou-iehu[Jta~> +JcDkPrIY*`rVunM!rkPPqYpW1!58.,!58Aa!<@cGrr<&urr<&rs8R`Nrs$/&!'pSb^&@s2!6G0? +KCJm@!:p-i!:g'hKDkfM!;uisKDkiMKDkfM!<)ou.0+r![Jta~> +JcDkP#(o4C]n6HI6,!9t!!(+?!/'e@!($5V +!J:CKrr@]JrrKf!rVlkMr;QbLrVunMrVlitrVlnN!.k0Xs*t~> +JcDkP#(]%>^4?9urr3$b!.k%I!eC?cnG`N?^A%X-Jc>ZL5l:T]Jb]6G5ed6t!!(+?!.jY>!'p/U +!J(7Irr@WHrrKi!rVlkKr;QbJrVunKrVlitrVlnL!.k0Xs*t~> +JcDkP#(o4C]n6HI6,!9t!!(+?!/'e@!($5V +!J:CKrr@]JrrKf!rVlkMr;QbLrVunMrVlitrVlnN!.k0Xs*t~> +JcDkP!JA)bs8R`NrrI`Pqu6[_KC8a?XFpNPrIb+L!!*#u!!)ors+C+H!J<];rr<&?rr@]@rr@]C +s8R]O^&.g0KDPWJK)iU[rrBb2s8N'!^&J$3KDb`L6%T'Ds*t~> +JcDkP!J.uas8RZLrrIZNqu6[^JaWO=We(0LrIOtJ!!*#u!!)ors+0tF!J*N8rr<&?rr@W>rr@WA +s8RWM^AIp1JboEHJH3FZrrBe3s8N'!^Ae-4Jc,NJ5_8sCs*t~> +JcDkP!JA)bs8R`NrrI`Pqu6[_KC8a?XFpNPrIb+L!!*#u!!)ors+C+H!J<];rr<&?rr@]@rr@]C +s8R]O^&.g0KDPWJK)iU[rrBb2s8N'!^&J$3KDb`L6%T'Ds*t~> +JcDkP!JA)bs8R`NrrPK=62gfaK0eo)!N^qJrr>@arr<&rs8R`HrrKfcrr2rufDbl(^&7m1KDPTJ +KDPTJKD>HH6%T&es7lVE~> +JcDkP!J.uas8RZLrrPH:5lL]`JO&W&!NL_Frr>=`rr<&rs8RZFrrKibrr2rufDbl&^AS!2JboBH +JboBHJb]6F5_8rds7lVE~> +JcDkP!JA)bs8R`NrrPK=62gfaK0eo)!N^qJrr>@arr<&rs8R`HrrKfcrr2rufDbl(^&7m1KDPTJ +KDPTJKD>HH6%T&es7lVE~> +JcDkP%Fn@7XK5=Ms8T1%s+@EPrr<&sX8pfLrrB.urrLZ&ri?*XpAY-Crr2sIr;QlL;GuZVrr@]M +X9!t(rr2ruf`(r(r;cgp!!*!r%"hHZeL=CK;M3O";?6Yn#:TWQ.>''IK>XbjeUdb2s*t~> +JcDkP%G"O=WiB(Ms8T+!s+.3Lrr<&sWW:WKrrB(srrL]%ri,sXpAY-Drr2sHr;QlM +JcDkP%Fn@7XK5=Ms8T1%s+@EPrr<&sX8pfLrrB.urrLZ&ri?*XpAY-Crr2sIr;QlL;GuZVrr@]M +X9!t(rr2ruf`(r(r;cgp!!*!r%"hHZeL=CK;M3O";?6Yn#:TWQ.>''IK>XbjeUdb2s*t~> +JcDbM!/'qDrk8;`!58(*s+Bh@!/(4L"20>>ec#OIK)iU_rr<&OrrBb2K*/geeH#IG!/(.J!!)hI +!WN/us8R`O]aobG]n??u^&PcuK>%;;]tO;q!588^!rordqu6`!]tOFF!58&XJcE:\J,~> +JcDbM!.jeBrkAA_!5A.+s+0\>!.k(J"29>;f)>XJJH3F^rr<&OrrBe3JHNXdec>RH!.k"H!!)hG +!WN/us8RZM^(5eG^4H]!roucqu6_t^:sUH!5A,WJcE:\J,~> +JcDbM!/'qDrk8;`!58(*s+Bh@!/(4L"20>>ec#OIK)iU_rr<&OrrBb2K*/geeH#IG!/(.J!!)hI +!WN/us8R`O]aobG]n??u^&PcuK>%;;]tO;q!588^!rordqu6`!]tOFF!58&XJcE:\J,~> +JcC<$qYpQ/rr2tNli-qbd/O(GqYpPJqYpNqq#:>HJcC<$q#>j~> +JcC<$qYpQ0rr2tLli-qbd/O(GqYpPHqYpNqq#:>FJcC<$q#>j~> +JcC<$qYpQ/rr2tNli-qbd/O(GqYpPJqYpNqq#:>HJcC<$q#>j~> +JcC<$qYpZuXT/j~> +JcC<$qYpZuWrN*Mli-qbd/O(GqYpPHqYpNqq#:=ZJcC<$q#>j~> +JcC<$qYpZuXT/j~> +JcC<$qYpNqrr2sali-qbd/O(GqYpPJqYpNqq#:=[JcC<$q#>j~> +JcC<$qYpNqrr2s`li-qbd/O(GqYpPHqYpNqq#:=ZJcC<$q#>j~> +JcC<$qYpNqrr2sali-qbd/O(GqYpPJqYpNqq#:=[JcC<$q#>j~> +JcFR+!7d_A!/(:N"bT*n!'rpL!!PZ@!'u6'r;ZpcK2R?Krr<&qrr@]Jrr<&orr@\&s+14Fs*t~> +JcFR+!7meB!.k.L"bApi!'igJ!!PW=!'l*#r;ZpbJQ79Jrr<&qrr@WHrr<&orr@V$s+14Fs*t~> +JcFR+!7d_A!/(:N"bT*n!'rpL!!PZ@!'u6'r;ZpcK2R?Krr<&qrr@]Jrr<&orr@\&s+14Fs*t~> +JcFR+!@e'JK*+C>!53s`o`"sBKDY]KKCSsA!;c]qKDPTJ!;QQoK7X&Rs7lVE~> +JcFR+!@\!IJHJ.;!5=$ao`"sCJc#KIJara?!;c]qJboBH!;QQoJV!iPs7lVE~> +JcFR+!@e'JK*+C>!53s`o`"sBKDY]KKCSsA!;c]qKDPTJ!;QQoK7X&Rs7lVE~> +JcFR+q#CC\pO`H3r;Zg`gAh4>rVupapAb1ZpAb7\!/'eAs$?Va#=3up!'u6i60*Xu.Js/J6%]/i +nc&RhqYpPJqYpNqq#:j~> +JcFR+q#CC[pON<0r;Zg_gAh4=rVup`pAb1YpAb7[!.jY?s$6P`#=*ik!'l*d5idIr./X&I5_/od +nc&RhqYpPHqYpNqq#:j~> +JcFR+q#CC\pO`H3r;Zg`gAh4>rVupapAb1ZpAb7\!/'eAs$?Va#=3up!'u6i60*Xu.Js/J6%]/i +nc&RhqYpPJqYpNqq#:j~> +JcFR+!%IpI!58AaVZ-Yse`Zr4^& +JcFR+!%@jH!5AG`VZ-Ysf'!&5^AWTe^Aib8s+.o_JcEFfJ\H^8^/b(2"$hE&Jara?!;c]qJboBH +!;QQo5_8rds7lVE~> +JcFR+!%IpI!58AaVZ-Yse`Zr4^& +JcFR+!)fHh!("p1!58:0s+BkA!!)lq!/(.J!!)fo!/#k&JcGNFJ,~> +JcFR+!*,Zk!'nj0!5A@1s+0_?!!)lq!.k"H!!)fo!.f_$JcGNFJ,~> +JcFR+!)fHh!("p1!58:0s+BkA!!)lq!/(.J!!)fo!/#k&JcGNFJ,~> +JcFR+!)fHh!("[*s+BkA!($J]!/(.J!!)fo!/#k&JcGNFJ,~> +JcFR+!*,Zk!'nU)s+0_?!'pD\!.k"H!!)fo!.f_$JcGNFJ,~> +JcFR+!)fHh!("[*s+BkA!($J]!/(.J!!)fo!/#k&JcGNFJ,~> +JcFR+!)fHh!!((>s+BkA!!)lq!/(.J!!)fo!/'qD"9=(f!58++#e^4jK)i"Qs$?S_!($Va"2+[7 +^&J$3KDb`LK7X'1s*t~> +JcFR+!*,Zk!!((>s+0_?!!)lq!.k"H!!)fo!.jeB"9="e!5A1,#eg:iJH2_Ms$6M^!'pP`"24a8 +^Ae-4Jc,NJJV!j/s*t~> +JcFR+!)fHh!!((>s+BkA!!)lq!/(.J!!)fo!/'qD"9=(f!58++#e^4jK)i"Qs$?S_!($Va"2+[7 +^&J$3KDb`LK7X'1s*t~> +JcFR+!)fHh!!((>s+BkA!%IdE!/(.J!!)fo!/'tE"tA+&s4&RKq#:BF;Z6UuXO[=N;Z?[s;?6[q +s+C:M!WX\"rr2ruJcE.XJ,~> +JcFR+!*,Zk!!((>s+0_?!%@^D!.k"H!!)fo!.jhC"t8(&s4/ULq#:BG +JcFR+!)fHh!!((>s+BkA!%IdE!/(.J!!)fo!/'tE"tA+&s4&RKq#:BF;Z6UuXO[=N;Z?[s;?6[q +s+C:M!WX\"rr2ruJcE.XJ,~> +JcFR+!)fHh!!((>s+BkA!/(.J!/(.J!!)fo!/("F!PO-as8R`HrrKf!rVm2*KE"5'KE&VN62gi` +KDkfS!<5?us8N(Ms0_lW~> +JcFR+!*,Zk!!((>s+0_?!.k"H!.k"H!!)fo!.jkD!PX-`s8RZFrrKi!rVm2(Jc@u#JcEGL5lL`_ +Jc5TQ!<5 +JcFR+!)fHh!!((>s+BkA!/(.J!/(.J!!)fo!/("F!PO-as8R`HrrKf!rVm2*KE"5'KE&VN62gi` +KDkfS!<5?us8N(Ms0_lW~> +JcFR+!)fHh!!((>s+BkA!/(.J!/(.J!($D[!/("F!JA)as8R`Grr>@`K*`uZs+C>;K)koOrVunM +rVm'%s8Te4rr@WM[Jta~> +JcFR+!*,Zk!!((>s+0_?!.k"H!.k"H!'p>Z!.jkD!J.u`s8RZErr>=_JI*`Us+128JH5]MrVunK +rVm'%s8Th5rr@WM[Jta~> +JcFR+!)fHh!!((>s+BkA!/(.J!/(.J!($D[!/("F!JA)as8R`Grr>@`K*`uZs+C>;K)koOrVunM +rVm'%s8Te4rr@WM[Jta~> +JcFR+!)fHh!!((>s+BkA!/(.J!/(.J!!)fo!/("Fs+C:Ms+C%F%D@CH]rZkdKE&Ub^&LCss8R`M +rrrK's1Q,G!.k0Xs*t~> +JcFR+!*,Zk!!((>s+0_?!.k"H!.k"H!!)fo!.jkDs+1.Ks+0nD%DICE^8cbaJcEFa^AgIss8RZK +rrrK's1Z5I!.k0Xs*t~> +JcFR+!)fHh!!((>s+BkA!/(.J!/(.J!!)fo!/("Fs+C:Ms+C%F%D@CH]rZkdKE&Ub^&LCss8R`M +rrrK's1Q,G!.k0Xs*t~> +W;d%O5la1N61k0X]`@R%!/(:Ns+C:M!PLeurrRfQ62plb]g;Vs!581-!)fHh!!((>s+BkA!!)lq +!/(.J!!)fo!/("F!PLetrrGE +W;d%P5QF%L5kP'W^&[[&!.k.Ls+1.K!PUhurrR`O5lUca^-MYs!5A7.!*,Zk!!((>s+0_?!!)lq +!.k"H!!)fo!.jkD!PUhtrrGB9o)B#rJcC<$s1\O5Jc5WKJc5TK!<3!"JZ8^$s0_lW~> +W;d%O5la1N61k0X]`@R%!/(:Ns+C:M!PLeurrRfQ62plb]g;Vs!581-!)fHh!!((>s+BkA!!)lq +!/(.J!!)fo!/("F!PLetrrGE +W;lmMrr3"O^%MC+5lgHT!keTIrr3!!^&J$45lgl`!!)ut!eUKdrr<"Nq>UGITDnlka8c0lnc&Rh +qYpPJqYpO]q#:>Hp&>!lrVlitnc&]D^&N`_rr<&ts8R`Mrr<&ts8N(Ms0_lW~> +W;lmKrr3"M^@hL,5QL?S!knZKrr3!!^Ae-55QLc_!!)ut!eC?crr<"Lq>UGGTDnlka8c0jnc&Rh +qYpPHqYpO\q#:>Fp&>!lrVlitnc&]B^Aic^rr<&ts8RZKrr<&ts8N(Ms0_lW~> +W;lmMrr3"O^%MC+5lgHT!keTIrr3!!^&J$45lgl`!!)ut!eUKdrr<"Nq>UGITDnlka8c0lnc&Rh +qYpPJqYpO]q#:>Hp&>!lrVlitnc&]D^&N`_rr<&ts8R`Mrr<&ts8N(Ms0_lW~> +W;ciqmf*8Qo)B045uN@8s+:<(s8Tb4KDkfM!<)p&]`8&Gs8R_bq>UFmTDnole]@djKCSsAKDPTJ +KDPTJ62:H[KD#6J]`<\;!58=1!/(1K#D9_iK7j4(KDb`LKDkfNK0fJ9!!)ut!NZ9Ps0_lW~> +W;citmf*8Po)B055ZNC8s+(0$s8Te5Jc5TK!<)p&^&S/Is8RYaq>UFpTDnolf#[mkJara?JboBH +JboBH5kt?ZJbB$H^&W_8!5AC2!.k%I#D'VhJV!k$Jc,NJJc5TLJO'26!!)ut!NH-Ns0_lW~> +W;ciqmf*8Qo)B045uN@8s+:<(s8Tb4KDkfM!<)p&]`8&Gs8R_bq>UFmTDnole]@djKCSsAKDPTJ +KDPTJ62:H[KD#6J]`<\;!58=1!/(1K#D9_iK7j4(KDb`LKDkfNK0fJ9!!)ut!NZ9Ps0_lW~> +W;ciqmf*9>o)B.!]rZkds+UFmkl1Xr\c2X0a8c0lnc&TA +qYpO]qYpPJq#:>HoDeiC!58:0!/(1Krdt3arr2u3q#:H0K7gl:rr@]MrrLZ`JcE.XJ,~> +W;citmf*9LJc5TK!<)p&^4F!`s8RY$q>UFpkl1Xs\c2X0a8c0jnc&T? +qYpO\qYpPHq#:>FoDeiA!5A@1!.k%Irdb'`rr2u4q#:H1JUtQ7rr@WKrrL]bJcE.XJ,~> +W;ciqmf*9>o)B.!]rZkds+UFmkl1Xr\c2X0a8c0lnc&TA +qYpO]qYpPJq#:>HoDeiC!58:0!/(1Krdt3arr2u3q#:H0K7gl:rr@]MrrLZ`JcE.XJ,~> +W;ciqr;Zi2rVlu5!!#porr@]Crsh?.s/^kQs+>s;5s^/'KDkfM!<)rtK*D:-KE$S;q>UGrl2Le7 +K=V!^!6>->KCSsAKDPTJ!<)rsK)e49rr@]Mrr@]Ms8Tc`s+14Ls*t~> +W;citr;Zi3rVlu6!!$$rrr@WArsh<.s/LYMs+,a85X9o#Jc5TK!<)rtJHc()JcC;8q>UGpl2Le8 +J[td\!6>->Jara?JboBH!<)rsJH.t6rr@WKrr@WKs8Tfas+14Ls*t~> +W;ciqr;Zi2rVlu5!!#porr@]Crsh?.s/^kQs+>s;5s^/'KDkfM!<)rtK*D:-KE$S;q>UGrl2Le7 +K=V!^!6>->KCSsAKDPTJ!<)rsK)e49rr@]Mrr@]Ms8Tc`s+14Ls*t~> +W;clrKDtlO6%eh0!!)Zk!/(1L$%r81KDtoOs8R`Mrr@]Ms8R`OrrQ*uKD>HHXQf`cX8og2!!((> +s+BkA!/(.J!!*#u!/(1Ls+:MA!55JI]g;Vs"+rmlKDY_#s+UK'~> +W;cluJc>ZM5_8S-!!)Zk!.k%J$%`,-Jc>]Ms8RZKrr@WKs8RZMrrQ4#Jb]6FWp0NaWW9U0!!((> +s+0_?!.k"H!!*#u!.k%Js+(A>!5>JI^-MYs"+`^gJc#M!s+UK'~> +W;clrKDtlO6%eh0!!)Zk!/(1L$%r81KDtoOs8R`Mrr@]Ms8R`OrrQ*uKD>HHXQf`cX8og2!!((> +s+BkA!/(.J!!*#u!/(1Ls+:MA!55JI]g;Vs"+rmlKDY_#s+UK'~> +W;ciqr;Q`so`"mknG`lt63$t;KE&Wus8PC`rr@]Ms8R`OrrRhdKD>HHXQf`cX8og2!!((>s+BnB +!S)i!rr>@`s7cTnK)n7Le!'u29\c70~> +W;citr;Q`so`"mknG`lr5l^k8JcEHus8P@_rr@WKs8RZMrrRbcJb]6FWp0NaWW9U0!!((>s+0b@ +!S2hurr>=_s7cTnJH8"9rIFr6q#L5A!%@gH!C24n!!>Id!'l,8\c70~> +W;ciqr;Q`so`"mknG`lt63$t;KE&Wus8PC`rr@]Ms8R`OrrRhdKD>HHXQf`cX8og2!!((>s+BnB +!S)i!rr>@`s7cTnK)n7Le!'u29\c70~> +W;clr^&J$4]`@^)!!)Ng"g!@Vs+>t%rr>@`rr@]Ms8R`NrrGCcq#:>ql2LdcK=V!^!<)rtK*FUA +!/#n(;Z;:O6%aeU62cE9!;_ +W;clu^Ae-5^&[g*!!)Ng"fd.Rs+,b!rr>=_rr@WKs8RZLrrG@bq#:>ol2LdaJ[td\!<)rtJHe@> +!.f\$ +W;clr^&J$4]`@^)!!)Ng"g!@Vs+>t%rr>@`rr@]Ms8R`NrrGCcq#:>ql2LdcK=V!^!<)rtK*FUA +!/#n(;Z;:O6%aeU62cE9!;_ +W;d(P!/%t;6+usk!PJL0rrBb-rroKVs8R_(r;QbLrVlitrVunMrr3#4!;QQoXQf`ceUtF4!!)ut +!($#P!7gfC!7h&J!584.!J:CMs8R`BrrK2eqYpO]qYpPJrVlkMrVlkMrVunMJcC<$rr7K~> +W;d(Q!.hk85ecpk!PSR1rrBe.rroERs8RY$r;QbJrVlitrVunKrr3#5!;QQoWp0Naeq(C3!!)ut +!'orO!7plD!7q,K!5A:/!J(7Ks8RZ@rrK,bqYpO\qYpPHrVlkKrVlkKrVunKJcC<$rr7K~> +W;d(P!/%t;6+usk!PJL0rrBb-rroKVs8R_(r;QbLrVlitrVunMrr3#4!;QQoXQf`ceUtF4!!)ut +!($#P!7gfC!7h&J!584.!J:CMs8R`BrrK2eqYpO]qYpPJrVlkMrVlkMrVunMJcC<$rr7K~> +V>gRteareBK<20OrrB.qrrD3\s8UXIrrCUKrrT9"ec#LJec#LJebT4GeZA!7!/%i^!!)ut!/&`" +!!)rss+BnB!QB]frr=MErr>sqrr@]Mrr@]Ms8R_&s+14Ls*t~> +V>gRrf(8nCJZ>aIrrB(orrD'Xs8U[JrrCXLrrT3#f)>UKf)>UKf(o=HeuIs6!.h]\!!)ut!.iSu +!!)rss+0b@!QK]err=JDrr?'trr@WKrr@WKs8RY$s+14Ls*t~> +V>gRteareBK<20OrrB.qrrD3\s8UXIrrCUKrrT9"ec#LJec#LJebT4GeZA!7!/%i^!!)ut!/&`" +!!)rss+BnB!QB]frr=MErr>sqrr@]Mrr@]Ms8R_&s+14Ls*t~> +JcFU,!J@KKs8R]O^&@s2!;ZWpKDGNIKDbcLK?=,n!<)otK@9c"!;ulsKC]$CeV!_u!!)lq!/(7M +!/(7M!/(7Ms+>n&JcG`LJ,~> +JcFU,!J.9Gs8RWM^A\'3!;ZWpJbf +JcFU,!J@KKs8R]O^&@s2!;ZWpKDGNIKDbcLK?=,n!<)otK@9c"!;ulsKC]$CeV!_u!!)lq!/(7M +!/(7M!/(7Ms+>n&JcG`LJ,~> +XT&:6pk/T4"+pS>^#K)%6%_H'!/!Ri.>*7=K0fHgs$6[<;Z;=K62uQC6%aeU!'ro'62cE9621HY +K*)*>.003sp]/G9!!)ut!/(:NrW!%Q!!%ZFrrbUf!(" +XT&:7pjrH1"+^G;^>f2&5_20#!.dCd."Qq7JO'0bs$-U9 +XT&:6pk/T4"+pS>^#K)%6%_H'!/!Ri.>*7=K0fHgs$6[<;Z;=K62uQC6%aeU!'ro'62cE9621HY +K*)*>.003sp]/G9!!)ut!/(:NrW!%Q!!%ZFrrbUf!(" +JcFU,!J=;KrrBb3rr]q7!($R9!@arr<&hrs;T:s8TdG +s8R_(rr3,762uR'q#: +JcFU,!J+8LrrBe4rr]t8!'pL6!=`rr<&hrs;]>s8TgI +s8RY$rr3,85lZC#q#: +JcFU,!J=;KrrBb3rr]q7!($R9!@arr<&hrs;T:s8TdG +s8R_(rr3,762uR'q#: +JcFU,s+BkA!!)ip!/(+I!/&/g!!)ut!/(:N!!)Qh!3Ghm!s&@RKD>HH!;ulsKC]$CXFpBL!($J] +!/(7M!/(7M!/(7Ms+>n&JcG`LJ,~> +JcFU,s+0_?!!)ip!.jtG!.i#e!!)ut!.k.L!!)Qh!35\k!s&@PJb]6F!;ulsJb&gAWe($H!'pD\ +!.k+K!.k+K!.k+Ks+,b$JcG`LJ,~> +JcFU,s+BkA!!)ip!/(+I!/&/g!!)ut!/(:N!!)Qh!3Ghm!s&@RKD>HH!;ulsKC]$CXFpBL!($J] +!/(7M!/(7M!/(7Ms+>n&JcG`LJ,~> +JcFR+!)i@e!!)ip!/(+I!/&/g!!)ut!/(:N!!)tMp&>#np&>0.63"UurIb%J!!)rss+BnB!S)i! +rr>@]rr<&trr@]Mrr@]Ms8R_&s+14Ls*t~> +JcFR+!*/Rh!!)ip!.jtG!.i#e!!)ut!.k.L!!)tKp&>#lp&>0/5l\OurIOnH!!)rss+0b@!S2hu +rr>=\rr<&trr@WKrr@WKs8RY$s+14Ls*t~> +JcFR+!)i@e!!)ip!/(+I!/&/g!!)ut!/(:N!!)tMp&>#np&>0.63"UurIb%J!!)rss+BnB!S)i! +rr>@]rr<&trr@]Mrr@]Ms8R_&s+14Ls*t~> +JcFR+!3G_j!!)ip!($G\!/&/g!!)ut!/(.J!S%2Drr>sq!!'_0rrLY9qYpSK!<)ot!;uitK>$jU +!S)i!rr<&qrr@]Mrr>@`rr@]Ms8R`/rr@]?rrCT#s0VfV~> +JcFR+!35Sh!!)ip!'pA[!.i#e!!)ut!.k"H!S.8Err?'t!!'b1rrL\9qYpSI!<)ot!;uitJ\L^T +!S2hurr<&qrr@WKrr>=_rr@WKs8RZ-rr@W=rrCW$s0VfV~> +JcFR+!3G_j!!)ip!($G\!/&/g!!)ut!/(.J!S%2Drr>sq!!'_0rrLY9qYpSK!<)ot!;uitK>$jU +!S)i!rr<&qrr@]Mrr>@`rr@]Ms8R`/rr@]?rrCT#s0VfV~> +JcFR+!3G_j!<@cKrr@]Irr<&9rr<&trr@]IrrKfcp\t7l^&J$46,!9t!kgn$q#:B.62pla!;uis +KCSsBeV!_u!!)lq!/(7M!/(7M!/(7Ms+B5/!!)Kf!3CbO[/YX~> +JcFR+!35Sh!<@]Irr@WGrr<&9rr<&trr@WGrrKibp\t7o^Ae-55ed6t!kpq"q#:B/5lUc`!;uis +Jara@eq*\t!!)lq!.k+K!.k+K!.k+Ks+0)-!!)Kf!31VM[/YX~> +JcFR+!3G_j!<@cKrr@]Irr<&9rr<&trr@]IrrKfcp\t7l^&J$46,!9t!kgn$q#:B.62pla!;uis +KCSsBeV!_u!!)lq!/(7M!/(7M!/(7Ms+B5/!!)Kf!3CbO[/YX~> +JcFR+!3G_j!@`rr@]Mrr@]Ms8R`/rr<&frr@\&s0VfV~> +JcFR+!35Sh!=_rr@WKrr@WKs8RZ-rr<&frr@V$s0VfV~> +JcFR+!3G_j!@`rr@]Mrr@]Ms8R`/rr<&frr@\&s0VfV~> +JcFR+!3G_j!UEp_Z'T9rr<"Nq>UI]KD5BGKDkiMKE(rO61t6Y]g;Yt!!)rss+BnB +!N^qMrr<&qrr@]Mrr@]Mrr@]Ms8R`/rr<&frrB-Os0VfV~> +JcFR+!35Sh!UEp_Z'T9rr<"Lq>UI\JbT0EJc5WKJcG`M5kY-X^-M\t!!)rss+0b@ +!NL_Irr<&qrr@WKrr@WKrr@WKs8RZ-rr<&frrB'Ms0VfV~> +JcFR+!3G_j!UEp_Z'T9rr<"Nq>UI]KD5BGKDkiMKE(rO61t6Y]g;Yt!!)rss+BnB +!N^qMrr<&qrr@]Mrr@]Mrr@]Ms8R`/rr<&frrB-Os0VfV~> +UAk7H^$u%%KDtlN^&7m162plc5l^o`rr@]Lrr@];rrB.jrr<&qrrLZ&q>UEp_Z'T9rr<"Nrr2sa +rdt5L62^``K>%6`$A1XXs+: +UAk7F^@;.&Jc>ZL^AS!25lUcb5QCf_rr@WJrr@W9rrB(hrr<&qrrL]%q>UEp_Z'T9rr<"Lrr2s` +rdb)M5lCW_J\M*_$@tIVs+(0as+*H8rdb?hs8N)5^Ai`arVlitr;QeK^@M:)We($H!!)lq!.k+K +!.k+K!.k+Ks+0)-!!)Kf!31VM[/YX~> +UAk7H^$u%%KDtlN^&7m162plc5l^o`rr@]Lrr@];rrB.jrr<&qrrLZ&q>UEp_Z'T9rr<"Nrr2sa +rdt5L62^``K>%6`$A1XXs+: +U]1D/6%e_-#!i7hs1JEGrr3"O!<3!!]`A!1!<>Farr<&crrKg7nc&RhqYpTHKDGNI6,NX%KDtoN +KDkiM^%).&K)iU`s8.HJrr]reK>%3_!!)rs!JA)VrrK3RqYpNqqYpPJrVlkMrVlkMrVunMmJd6? +5sb=!rr2run,EBhJcE+WJ,~> +U]1D05_8J*#!`1gs1SKIrr3"M!<3!!^&\*2!<>C`rr<&crrKj6nc&RhqYpTIJbf]L +Jc5WK^@D7'JH3F_s8.BHrr]udJ\M'^!!)rs!J.uUrrK-NqYpNqqYpPHrVlkKrVlkKrVunKmJd6= +5X>-rrr2run,EBfJcE+WJ,~> +U]1D/6%e_-#!i7hs1JEGrr3"O!<3!!]`A!1!<>Farr<&crrKg7nc&RhqYpTHKDGNI6,NX%KDtoN +KDkiM^%).&K)iU`s8.HJrr]reK>%3_!!)rs!JA)VrrK3RqYpNqqYpPJrVlkMrVlkMrVunMmJd6? +5sb=!rr2run,EBhJcE+WJ,~> +UAt7GoD]9M;QNdrs4&Prs8UUL!<3!!eH#OI!WX[Nrr2rum/I+:Mt-fI!;c]rXFp?K!)gQ2!J@K% +rr<&ss8R`BrrK3RqYpNqqYpPJrVlkMrVlkMrVunMli7"8#-@jTXE,hlrr2rur;QeUKDb`ReUo=$ +s8T0Os0VfV~> +UAt7EoD]9NXJ!WXXKrr2rum/I+;NUd#K!;c]rWe(!G!*-c5!J.9! +rr<&ss8RZ@rrK-NqYpNqqYpPHrVlkKrVlkKrVunKli7"9#-.^SWc9Gerr2rur;QeWJc,NPeq#7# +s8T*Ms0VfV~> +UAt7GoD]9M;QNdrs4&Prs8UUL!<3!!eH#OI!WX[Nrr2rum/I+:Mt-fI!;c]rXFp?K!)gQ2!J@K% +rr<&ss8R`BrrK3RqYpNqqYpPJrVlkMrVlkMrVunMli7"8#-@jTXE,hlrr2rur;QeUKDb`ReUo=$ +s8T0Os0VfV~> +\GlO/m/R*K)koN!PJL2rrrK'6,! +\GlO/m/R*:o`#015ed8us8Th4JHPp;JH5]L!PSR3rrrK'5ed9u!:0XbJara?!;c]rWe(!G!'n9u +!.iPt!!)rss+0b@!NL_Irr<&qrr@WKrr@WKrr@WKs8RZ5rrTo"f)5OJ!;ld$^-I8Ls+*GLrVlkt +JcE+WJ,~> +\GlO/m/R*K)koN!PJL2rrrK'6,! +\GlO/m/I'%% +\GlO/m/I':oD\qY!<<'Irr3"Ms8G7arrE#t!!)rs"p"]'!<<'!li-sbnc&RhqYpTIJbf +\GlO/m/I'%% +\GlO/m/I' +\GlO/m/I':o`#!,5_8n7$%`,jJcEGLs8N)trr<&srrrK's1X'a!:0XbWq$)h!;c]rWe(!G!!'n9 +!!)ut!knX7eq!m&!.k(Js+0b@!NL_Irr<&qrr@WKrr@WKrr@WKs8RZ8rrToc^A7d/!;c]q^AWT_ +^AS!2 +\GlO/m/I' +\GlO/m/R*UGI_Z'T9rdt2: +rVusbKDkfMKD,K)bm;K>% +\GlO/m/R*:nG`WBs8Tfar;Q`srVlitr;Q`srr3&"^&[O"!J.9@rr<&qrrK-Nq>UGG_Z'T9rdb&7 +rVusaJc5TKJbK*Df'32?JH,[8J\M0a!:g'iWe($H!!)lq!.k+K!.k+K!.k+Ks+0P:!knZKp\t3n +qu6[^Jc5WK5lL]_JV!j.s*t~> +\GlO/m/R*UGI_Z'T9rdt2: +rVusbKDkfMKD,K)bm;K>% +\GlO/m/R*UGI_Z'YM.Jj)F +60j.'62LW^;X=A`^%21(XFpBL!!)lq!/(7M!/(7M!/(7Ms+B_=!^Qedq1J\H!!)ut!PMD-rrKe5 +rr2srJcE+WJ,~> +\GlO/m/R*:nG`Wks8RY$r;Q`srVlitr;Q`srr3&N!!)Bc!J.9@rr<&qrrK-Nq>UGG_Z'YN./NuE +5jNt$5l1N] +\GlO/m/R*UGI_Z'YM.Jj)F +60j.'62LW^;X=A`^%21(XFpBL!!)lq!/(7M!/(7M!/(7Ms+B_=!^Qedq1J\H!!)ut!PMD-rrKe5 +rr2srJcE+WJ,~> +_Z'bPK=unir;Q`smJd7$5lgf^s1S4-"P*PP]tO@D!/(:N!eUJ=rVlj`rVlo361"UPK<4VC!!)lq +!N^qLrr>?ts8R`&rrCUKK)iUarrGE +_Z'bQJ\H\dr;Q`smJd7%5QL]]s1\:."P3VQ^:sOF!.k.L!eC>:rVlj_rVlo45j\LOJZA8?!!)lq +!NL_Hrr> +_Z'bPK=unir;Q`smJd7$5lgf^s1S4-"P*PP]tO@D!/(:N!eUJ=rVlj`rVlo361"UPK<4VC!!)lq +!N^qLrr>?ts8R`&rrCUKK)iUarrGE +_Z'ak.>%U#r;Q`sW;cmNXRZ;j!;c]rXFp?K!("L%!56GQ!C;A/rrK3RqYpNqqYpPJrVlkMrVlkM +rVunMhu +_Z'ai."M?ur;Q`sW;cmLWq$)h!;c]rWe(!G!'nF$!5?MR!C25,rrK-NqYpNqqYpPHrVlkKrVlkK +rVunKhu +_Z'ak.>%U#r;Q`sW;cmNXRZ;j!;c]rXFp?K!("L%!56GQ!C;A/rrK3RqYpNqqYpPJrVlkMrVlkM +rVunMhu +\GlO/\GuM["MOj8K7j%#!J@KMs8R`NrrCUKK)boJrrK3Rq>UF\_Z'T9a8Z/?KC]$CXFpBL!!)lq +!/(7M!/(7M!($S`s+B5/!!)cn"MKG?6%f1:!)eCJ[/YX~> +\GlO/\GuMY"MXp9JV![t!J.9Is8RZLrrCXLJH,]HrrK-Nq>UF[_Z'T9a8Z/?Jb&gAWe($H!!)lq +!.k+K!.k+K!'pM_s+0)-!!)cn"MTG<5_8q7!*+UM[/YX~> +\GlO/\GuM["MOj8K7j%#!J@KMs8R`NrrCUKK)boJrrK3Rq>UF\_Z'T9a8Z/?KC]$CXFpBL!!)lq +!/(7M!/(7M!($S`s+B5/!!)cn"MKG?6%f1:!)eCJ[/YX~> +\GlO/o)J<6r^$8Y!/(4M!/(1L"=\s'!($G]!E&pqrr>@[!;qHS6%].;6%]/'re'qFqYpStKDGNI +6,NX%!6>->KC]$CXFpBL!($J]!/(7M!/(7M!/(7Ms+B5/!!)lq"MKFR!58:0!)eCJ[/YX~> +\GlO/o)J<4r]p2X!.k(K!.k%J"=Sg$!'pA\!EB-trr>=Z!;qBQ5_/n85_/o#rdjeDqYpSrJbf->Jb&gAWe($H!'pD\!.k+K!.k+K!.k+Ks+0)-!!)lq"MTFP!5A@1!*+UM[/YX~> +\GlO/o)J<6r^$8Y!/(4M!/(1L"=\s'!($G]!E&pqrr>@[!;qHS6%].;6%]/'re'qFqYpStKDGNI +6,NX%!6>->KC]$CXFpBL!($J]!/(7M!/(7M!/(7Ms+B5/!!)lq"MKFR!58:0!)eCJ[/YX~> +\GlO/\GuR/rIY1O5sbAIs+C1Js$?U9r;cZn!584.!("L%!/&>ls+BnB!N^qMrr<&qrr@]Mrr@]M +rr@]Ms8R`=rsh>IK=unis8R_(6%f4;!;uj#K0b.i]n?1]!)eCJ[/YX~> +\GlO/\GuR/rIG%M5X>2Gs+1%Hs$6O6r;cZn!5A:/!'nF$!.i2js+0b@!NL_Irr<&qrr@WKrr@WK +rr@WKs8RZ;rsh;FJ\H\ds8RY$5_8t8!;uj#JO"ed^4H.\!*+UM[/YX~> +\GlO/\GuR/rIY1O5sbAIs+C1Js$?U9r;cZn!584.!("L%!/&>ls+BnB!N^qMrr<&qrr@]Mrr@]M +rr@]Ms8R`=rsh>IK=unis8R_(6%f4;!;uj#K0b.i]n?1]!)eCJ[/YX~> +^Ae1cr;Q`s\GlQBqu6\L^&%a0K<4qLs+C7Ls1JC4nG`JS_Z'T9a8Z0m^%21(XFpBL!!)lq!/(7M +!/(7M!/(7Ms+B_=!($C4"@7\?s+C:M#/*o#^&PcuqYpOnJcE+WJ,~> +^Ae1ar;Q`s\GlQCqu6\J^A@j1JZASHs+1+Js1SI5nG`JR_Z'T9a8Z0k^@M:)We($H!!)lq!.k+K +!.k+K!.k+Ks+0S;!'p=1"@.P +^Ae1cr;Q`s\GlQBqu6\L^&%a0K<4qLs+C7Ls1JC4nG`JS_Z'T9a8Z0m^%21(XFpBL!!)lq!/(7M +!/(7M!/(7Ms+B_=!($C4"@7\?s+C:M#/*o#^&PcuqYpOnJcE+WJ,~> +\GlO/Z2XiW^&%a0K<4qLs+C1J!!)Ng!!'n9!!((>!/'hA!N^qMrr<&qrr@]Mrr@]Mrr@]Ms8R`3 +rrBb3rr<&rrrg#f5la4Irr>rJs0VfV~> +\GlO/Z2XiU^A@j1JZASHs+1%H!!)Ng!!'n9!!((>!.j\?!NL_Irr<&qrr@WKrr@WKrr@WKs8RZ1 +rrBe4rr<&rrrg&e5QF(Grr?&Ms0VfV~> +\GlO/Z2XiW^&%a0K<4qLs+C1J!!)Ng!!'n9!!((>!/'hA!N^qMrr<&qrr@]Mrr@]Mrr@]Ms8R`3 +rrBb3rr<&rrrg#f5la4Irr>rJs0VfV~> +_>aPueb]:G!3uP)K@Thu!J@KMs8R`Jrr=MErrL*?q>UGI_Z'T9a8Z0mXRcAlXFpBL!!)lq!/(7M +!/(7M!/(7Ms+B5/!/(%G#h?#/XK9tPs&+FJ[/YX~> +_>aPqf)#CH!3uP)J_'\t!J.9Is8RZHrr=JDrrL->q>UGG_Z'T9a8Z0kWq-/jWe($H!!)lq!.k+K +!.k+K!.k+Ks+0)-!.jnE#hH#,WiFYMs&FXM[/YX~> +_>aPueb]:G!3uP)K@Thu!J@KMs8R`Jrr=MErrL*?q>UGI_Z'T9a8Z0mXRcAlXFpBL!!)lq!/(7M +!/(7M!/(7Ms+B5/!/(%G#h?#/XK9tPs&+FJ[/YX~> +_Z'a);M+t%r;Q`sZ2XiW^&%d/KDPWJKDPTJ!;c]rXFp?K!!'n9!!((>!JA)VrrK3RqYpNqqYpPJ +rVlkMrVlkMrVunMhu<\/oDej(s8N'sJcE+WJ,~> +_Z'a(!J.uUrrK-NqYpNqqYpPH +rVlkKrVlkKrVunKhu<\-oDej)s8N(!JcE+WJ,~> +_Z'a);M+t%r;Q`sZ2XiW^&%d/KDPWJKDPTJ!;c]rXFp?K!!'n9!!((>!JA)VrrK3RqYpNqqYpPJ +rVlkMrVlkMrVunMhu<\/oDej(s8N'sJcE+WJ,~> +_Z'`=s8R^;r;Q`sZ2aiVqYpSKXSVtsKDPTJ!;c]rXFp?K!!'n9!!((>s+BnB!N^qMrr<&qrr@]M +rr@]Mrr@]Ms8R`=s7V*Err<&ss7_-J^&S+1JcE+WJ,~> +_Z'`=s8RX8r;Q`sZ2aiTqYpSIWqubqJboBH!;c]rWe(!G!!'n9!!((>s+0b@!NL_Irr<&qrr@WK +rr@WKrr@WKs8RZ;s7V$Crr<&ss7_'H^An45JcE+WJ,~> +_Z'`=s8R^;r;Q`sZ2aiVqYpSKXSVtsKDPTJ!;c]rXFp?K!!'n9!!((>s+BnB!N^qMrr<&qrr@]M +rr@]Mrr@]Ms8R`=s7V*Err<&ss7_-J^&S+1JcE+WJ,~> +_Z'a)K7cJ'r;Q`sp&>,H!!#pirs+/VK7cJ's8W(N#!i4h^&PdZrVlkMrr3)6K0d3Ms8Te2rr@]E +s8R`JrrIbRqZ$SJqYpNqnG`Ig_Z'T9a8c0lo)A`lKDPTJ!;c]qKDkfMKDkfMKDkiMKC/[G]g2Wa +]tK'us+>t'rr<&srrQ'u62H65rr>rJs0VfV~> +_Z'a(JUp)#r;Q`sp&>,F!!$$lrs+)TJUp)#s8W(L#!`.g^Akp]rVlkKrr3)7JO$sKs8Th3rr@WC +s8RZHrrI\NqZ$SHqYpNqnG`Ig_Z'T9a8c0jo)A`jJboBH!;c]qJc5TKJc5TKJc5WKJaNIE^-DZ` +^:o0us+,b#rr<&srrQ1#5l-'2rr?&Ms0VfV~> +_Z'a)K7cJ'r;Q`sp&>,H!!#pirs+/VK7cJ's8W(N#!i4h^&PdZrVlkMrr3)6K0d3Ms8Te2rr@]E +s8R`JrrIbRqZ$SJqYpNqnG`Ig_Z'T9a8c0lo)A`lKDPTJ!;c]qKDkfMKDkfMKDkiMKC/[G]g2Wa +]tK'us+>t'rr<&srrQ'u62H65rr>rJs0VfV~> +_>jOf!58:0!!)`ms+C@Os+C%F!/(:N"MFg8rrDoqs+C=N!PJL3rrIa]n:sNq>UEp +qu6`26%et4!)eCJ[/YX~> +_>jOd!5A@1!!)`ms+14Ms+0nD!.k.L"MOm9rrDoqs+11L!PSR4rrI[9rVlqM!5AI4!!)]ls+1%H +!J.9Is8RZHrr<&hrrKi!_Z'T9a8c0jo)A`jJboBH!;c]qJc5TK5lL]_Jc5WKJa<=<^4CjLq>UEp +qu6`35_8_1!*+UM[/YX~> +_>jOf!58:0!!)`ms+C@Os+C%F!/(:N"MFg8rrDoqs+C=N!PJL3rrIa]n:sNq>UEp +qu6`26%et4!)eCJ[/YX~> +_>aSes1S=0!!)`m!($Va!S)hmrrW9$rrDoq!J:COrrRfQ^&J'3KDkfOK)e4:rr<&ls8R`JrrIbR +qZ$SJqYpNqnc&WB6,NX%!6>->KC]$CXFpBL!!)lq!/(7M!/(7M!/(7Ms+BP8s$6Xuqu6Wrq>UN0 +6%f%6!)eCJ[/YX~> +_>aSfs1\C1!!)`m!'pP`!S2hlrrW9$rrDoq!J(7MrrR`O^Ae04Jc5TMJH.t7rr<&ls8RZHrrI\N +qZ$SHqYpNqnc&W@5f3O$!6>->Jb&gAWe($H!!)lq!.k+K!.k+K!.k+Ks+0D6s$-Ruqu6Wrq>UN1 +5_8e3!*+UM[/YX~> +_>aSes1S=0!!)`m!($Va!S)hmrrW9$rrDoq!J:COrrRfQ^&J'3KDkfOK)e4:rr<&ls8R`JrrIbR +qZ$SJqYpNqnc&WB6,NX%!6>->KC]$CXFpBL!!)lq!/(7M!/(7M!/(7Ms+BP8s$6Xuqu6Wrq>UN0 +6%f%6!)eCJ[/YX~> +_Z'_O.7!t2rr<&ns8R`Mrr<&irrg#$s8N)uK)jI$rs+/V63"Uu!/(:Ns+C:MrdtrJs0VfV~> +_Z'_P-pRe0rr<&ns8RZKrr<&irrg&$s8N)uJH4:#rs+)T5l\Ou!.k.Ls+1.Krdb0cs8N)ls8RZH +rrI\NqZ$SHqYpNqqYpSrJboBIJO%*P!'nU)s+0b@!NL_Irr<&qrr@WKrr@WKrr@WKs8RZ6rrTn7 +^AIp1!;QQq^&UFqrr?&Ms0VfV~> +_Z'_O.7!t2rr<&ns8R`Mrr<&irrg#$s8N)uK)jI$rs+/V63"Uu!/(:Ns+C:MrdtrJs0VfV~> +_>aR7K0fD7!!)cns+C:M!s+BnB!N^qMrr<&qrr@]Mrr@]Mrr@]Ms8R`;rr]re +]tO7A!!)lqre(%H!)eCJ[/YX~> +_>aR:JO',4!!)cns+1.K!r8p&G&C +qYpSIWqubqJboBH!;c]rWe(!G!.i#e!!((>s+0b@!NL_Irr<&qrr@WKrr@WKrr@WKs8RZ9rr]ud +^:sFC!!)lqrdjnF!*+UM[/YX~> +_>aR7K0fD7!!)cns+C:M!s+BnB!N^qMrr<&qrr@]Mrr@]Mrr@]Ms8R`;rr]re +]tO7A!!)lqre(%H!)eCJ[/YX~> +\GlO/p](8GrVllu^%VL+5leUnrsFCls+C@O!/(;;^&J'3KDkiMKE(rQ.K9D@rrIbcqYpSKXSVts +KDPTJ!;c]rXFp?K!/&/g!("[*s+BnB!N^qMrr<&qrr@]Mrr@]Mrr@]Ms8R`=rrp)g!/%tuq>UEp +r;Qi"!/(%G!/#k&[/YX~> +\GlO/p](8ErVllu^@qU,5QJOnrsF=ks+14M!.k/8^Ae04Jc5WKJcG`O./s;?rrI\bqYpSIWqubq +JboBH!;c]rWe(!G!.i#e!'nU)s+0b@!NL_Irr<&qrr@WKrr@WKrr@WKs8RZ;rrp,f!.hkuq>UEp +r;Qhu!.jnE!.f_$[/YX~> +\GlO/p](8GrVllu^%VL+5leUnrsFCls+C@O!/(;;^&J'3KDkiMKE(rQ.K9D@rrIbcqYpSKXSVts +KDPTJ!;c]rXFp?K!/&/g!("[*s+BnB!N^qMrr<&qrr@]Mrr@]Mrr@]Ms8R`=rrp)g!/%tuq>UEp +r;Qi"!/(%G!/#k&[/YX~> +\GlO/p\t9-62gf`62(%!Ys+:CQK>%6`!/(7M!PO-as8R`OrrT8f!;6BlKDPTKK<4qLs+C1J +!!)lq!N^qLrr@\grr<&>rrGE +\GlO/p\t9.5lL]_5kb3YJ\LjXs+(7OJ\M*_!.k+K!PX-`s8RZMrrT2c!;6BlJboBIJZASHs+1%H +!!)lq!NL_Hrr@Verr<&>rrGB9o)A`jJboBH!;c]qJc5TKJc5TKJc5WKJaNL2Jc>ZL!<)ot^A +\GlO/p\t9-62gf`62(%!Ys+:CQK>%6`!/(7M!PO-as8R`OrrT8f!;6BlKDPTKK<4qLs+C1J +!!)lq!N^qLrr@\grr<&>rrGE +_Z0Xgs8W+O!58C3!!)`m"[Tj%s+>strr@]JrrBb2rrdtfs+>t&s8R`Ns8R`Ms8R`Ns8N)lrrIbc +qYpSKXSVtsKDPTJ!;c]rXFp?K!/&/g!!((>s+BnB!N^qMrr<&qrr@]Mrr@]Mrr@]Ms8R`/rr>@R +rr>rJs0VfV~> +_Z0Xes8W+M!5AI4!!)`m"[Kg%s+,aprr@WHrrBe3rrdnes+,b"s8RZLs8RZKs8RZLs8N)lrrI\b +qYpSIWqubqJboBH!;c]rWe(!G!.i#e!!((>s+0b@!NL_Irr<&qrr@WKrr@WKrr@WKs8RZ-rr>=Q +rr?&Ms0VfV~> +_Z0Xgs8W+O!58C3!!)`m"[Tj%s+>strr@]JrrBb2rrdtfs+>t&s8R`Ns8R`Ms8R`Ns8N)lrrIbc +qYpSKXSVtsKDPTJ!;c]rXFp?K!/&/g!!((>s+BnB!N^qMrr<&qrr@]Mrr@]Mrr@]Ms8R`/rr>@R +rr>rJs0VfV~> +_uKa&#uX&TK7a0;s8N)lrrYQ>K.6]t!($P_!%Ihus8N'brdtAPKE(t(^&@s96%f4;]g2Y3rr3"O +^&J$4]`@a*!/(+I!J@KMs8R`Jrr<&qrrK3Rq>UGI_Z'T9a8Z0m^%21(XFpBL!!)lq!/(7M!/(7M +!/(7Ms+B_="G9!m5sbGKs+C@O!!)rs!7h&Jr]pPb^&J$3XF^DYs*t~> +_uKa%#us5UJUmg8s8N)lrrYN;JLLEq!'pJ^!%@brs8N'ardb5QJcGb$^A\':5_8t8^-D\4rr3"M +^Ae-5^&[j+!.jtG!J.9Is8RZHrr<&qrrK-Nq>UGG_Z'T9a8Z0k^@M:)We($H!!)lq!.k+K!.k+K +!.k+Ks+0S;"G&gh5X>8Is+14M!!)rs!7q,Kr]gJa^Ae-4We(2Ws*t~> +_uKa&#uX&TK7a0;s8N)lrrYQ>K.6]t!($P_!%Ihus8N'brdtAPKE(t(^&@s96%f4;]g2Y3rr3"O +^&J$4]`@a*!/(+I!J@KMs8R`Jrr<&qrrK3Rq>UGI_Z'T9a8Z0m^%21(XFpBL!!)lq!/(7M!/(7M +!/(7Ms+B_="G9!m5sbGKs+C@O!!)rs!7h&Jr]pPb^&J$3XF^DYs*t~> +_uC)Es8N(Os8Tbus8N)ks8Te/rrBb1s8.HJs8IWNXSDeq^&J$6]n:sNli-s;q#:>qqZ$SJqYpNq +qYpStKDPTK]n=3%!!((>!JA)VrrK3RqYpNqqYpPJrVlj`rr3#4KDkiMKC/[=62plb]g;Vss+C@O +!!)ut!PO-brrn%gs8Tb4rr2srJcE+WJ,~> +_uC)Es8N(Ms8Teus8N)ks8Th0rrBe2s8.BHs8IQLWqcSo^Ae-7^4CjLli-s9q#:>oqZ$SHqYpNq +qYpSrJboBI^4F0$!!((>!J.uUrrK-NqYpNqqYpPHrVlj_rr3#5Jc5WKJaNI;5lUca^-MYss+14M +!!)ut!PX-arrmtfs8Te5rr2suJcE+WJ,~> +_uC)Es8N(Os8Tbus8N)ks8Te/rrBb1s8.HJs8IWNXSDeq^&J$6]n:sNli-s;q#:>qqZ$SJqYpNq +qYpStKDPTK]n=3%!!((>!JA)VrrK3RqYpNqqYpPJrVlj`rr3#4KDkiMKC/[=62plb]g;Vss+C@O +!!)ut!PO-brrn%gs8Tb4rr2srJcE+WJ,~> +`;^!n;ZHcuXT&5%!<<'!ZMt$..>-1Mrrgl)s/_.Xs8B#!.J`uD!;c]rXFpBLs+A2g!/&>l!J@KE +rrK3RqYpNqqYpPJrVljqrr3#LKDkiMKC8a>KDb`MXFpNPs+C@O!!)ut!E/(Zrr<&trrc6$s8PuJ +s0VfV~> +`;^!l +`;^!n;ZHcuXT&5%!<<'!ZMt$..>-1Mrrgl)s/_.Xs8B#!.J`uD!;c]rXFpBLs+A2g!/&>l!J@KE +rrK3RqYpNqqYpPJrVljqrr3#LKDkiMKC8a>KDb`MXFpNPs+C@O!!)ut!E/(Zrr<&trrc6$s8PuJ +s0VfV~> +`;]kOKDPTM!<<'!qu6bN!!%ZN!!>Le!($D\!(#?>#=26R!/#ni62Q97;YU4mK0f84!587/!!)lq +!N^qMrrIbc_Z'T9a8c0lo)A`lKDPTJ!;c]qKDkfMKDkfMKDkiMKC8d>KDb`TK>% +`;]kPJboBK!<<'!qu6bL!!%TL!!>Id!'p>[!'o9=#=)9S!.f\d5l6*4 +`;]kOKDPTM!<<'!qu6bN!!%ZN!!>Le!($D\!(#?>#=26R!/#ni62Q97;YU4mK0f84!587/!!)lq +!N^qMrrIbc_Z'T9a8c0lo)A`lKDPTJ!;c]qKDkfMKDkfMKDkiMKC8d>KDb`TK>% +_uB^&qYpWts8N))s8E!(6%ag']g;[N.K4r"62^c`KDPTJ!;c]rXFpBL!PO-&rr@\ls8R`BrrK3R +qYpNqqYpPJrVlkMrVlkMrVunMmf*=$62UZe!7h+%KE(s;rVlnNXT&5"62gfd6,! +_uB^%qYpWts8N))s8E!(5_4L#^-M^L./nbt5lCZ_JboBH!;c]rWe($H!PX-%rr@Vjs8RZ@rrK-N +qYpNqqYpPHrVlkKrVlkKrVunKmf*=%5l:Qd!7q1$JcGa8rVlnLWrE"u5lL]c5ed9u +_uB^&qYpWts8N))s8E!(6%ag']g;[N.K4r"62^c`KDPTJ!;c]rXFpBL!PO-&rr@\ls8R`BrrK3R +qYpNqqYpPJrVlkMrVlkMrVunMmf*=$62UZe!7h+%KE(s;rVlnNXT&5"62gfd6,! +]`/,JKE(rOZ2Xhj^&7m4KE$S*qYpQrKDPTJ!;c]rXFpBLs+A2g!/&>ls+BnB!N^qMrr<&qrr@]M +rr@]Mrr@]Ms8R`=s8PC^rrsp)6%f4;!;uis;Z?\"K0fP;K0fM:!/#k&[/YX~> +]`/,KJcG`MZ2Xhi^AS!5JcC;$qYpQrJboBH!;c]rWe($Hs+/&e!.i2js+0b@!NL_Irr<&qrr@WK +rr@WKrr@WKs8RZ;s8P@]rrsm&5_8t8!;uis +]`/,JKE(rOZ2Xhj^&7m4KE$S*qYpQrKDPTJ!;c]rXFpBLs+A2g!/&>ls+BnB!N^qMrr<&qrr@]M +rr@]Mrr@]Ms8R`=s8PC^rrsp)6%f4;!;uis;Z?\"K0fP;K0fM:!/#k&[/YX~> +\GlO/Z2XfVqu6bNs1PN1rrGF!qYpNqqYpStKDPWJK>RWgK?+#lKC]$CXFpBL!!)lq!/(7M!/(7M +!/(7M!(#rN!584.!58C3!!)orqL\d]rVljqJcE+WJ,~> +\GlO/Z2XfTqu6bLs1YN0rrGC!qYpNqqYpSrJboEHJ\qEeJ]IfjJb&gAWe($H!!)lq!.k+K!.k+K +!.k+K!'olM!5A:/!5AI4!!)orqLJX\rVljtJcE+WJ,~> +\GlO/Z2XfVqu6bNs1PN1rrGF!qYpNqqYpStKDPWJK>RWgK?+#lKC]$CXFpBL!!)lq!/(7M!/(7M +!/(7M!(#rN!584.!58C3!!)orqL\d]rVljqJcE+WJ,~> +\GlO/Z2XfVr;Qo5KE(tQqYpO]q>UF\qYpStKDPWJK>RWgK?+#lKC]$CXFpBL!!)lq!/(7M!/(7M +!/(7M!JA)Crr>@Rrr>rJs0VfV~> +\GlO/Z2XfTr;Qo6JcGbMqYpO\q>UF[qYpSrJboEHJ\qEeJ]IfjJb&gAWe($H!!)lq!.k+K!.k+K +!.k+K!J.uBrr>=Qrr?&Ms0VfV~> +\GlO/Z2XfVr;Qo5KE(tQqYpO]q>UF\qYpStKDPWJK>RWgK?+#lKC]$CXFpBL!!)lq!/(7M!/(7M +!/(7M!JA)Crr>@Rrr>rJs0VfV~> +\GlO/Z2XfVqu6bNs+@ELrr<&prr>@]rrK3RqYpSK]u'dLK?+#lKC]$CXFpBL!!)lq!/(7M!/(:N +!PO-as8R`/rr<&frrB-Os0VfV~> +\GlO/Z2XfTqu6bLs+.3Hrr<&prr>=\rrK-NqYpSI^;BmMJ]IfjJb&gAWe($H!!)lq!.k+K!.k.L +!PX-`s8RZ-rr<&frrB'Ms0VfV~> +\GlO/Z2XfVqu6bNs+@ELrr<&prr>@]rrK3RqYpSK]u'dLK?+#lKC]$CXFpBL!!)lq!/(7M!/(:N +!PO-as8R`/rr<&frrB-Os0VfV~> +\GlO/Z2XfVqu6bNs+@ELrr<&prr<&qrrK3RqYpSK]u'dLK?+#lKC]$CXFpEM!PJL0rr@]Mrr@]N +s8R`Ms8R`/rr<&frr@\&s0VfV~> +\GlO/Z2XfTqu6bLs+.3Hrr<&prr<&qrrK-NqYpSI^;BmMJ]IfjJb&gAWe('I!PSR1rr@WKrr@WL +s8RZKs8RZ-rr<&frr@V$s0VfV~> +\GlO/Z2XfVqu6bNs+@ELrr<&prr<&qrrK3RqYpSK]u'dLK?+#lKC]$CXFpEM!PJL0rr@]Mrr@]N +s8R`Ms8R`/rr<&frr@\&s0VfV~> +\GlO/Z2XfVqu6bNs+@ELrr>@\rr<&qrrK3RqYpSK]u'dLK?*umK>$jU!N^qMrr<&qrr@]Mrr>@a +rrKfcrVunMhu +\GlO/Z2XfTqu6bLs+.3Hrr>=[rr<&qrrK-NqYpSI^;BmMJ]IckJ\L^T!NL_Irr<&qrr@WKrr>=` +rrKibrVunKhu +\GlO/Z2XfVqu6bNs+@ELrr>@\rr<&qrrK3RqYpSK]u'dLK?*umK>$jU!N^qMrr<&qrr@]Mrr>@a +rrKfcrVunMhu +]Dhtcs8N)(rr@]Krr[oRK<4qL!/(+I!!)lq!N^qMs8R_grr>@*s8R`BrrK3RqYpNqqYpPJrVlkM +rVlkMrVlkMir9"2rr2ruoD\qZ^&S+bJcE+WJ,~> +]Dhtas8N)(rr@WIrr[iPJZASH!.jtG!!)lq!NL_Is8RYerr>=)s8RZ@rrK-NqYpNqqYpPHrVlkK +rVlkKrVlkKir9"0rr2ruoD\qY^An4aJcE+WJ,~> +]Dhtcs8N)(rr@]Krr[oRK<4qL!/(+I!!)lq!N^qMs8R_grr>@*s8R`BrrK3RqYpNqqYpPJrVlkM +rVlkMrVlkMir9"2rr2ruoD\qZ^&S+bJcE+WJ,~> +\GlO/Z2XfVqu6bNs+@ELrrE+PqYpNqqYpStKDPWJK89L,KC]$CXFpBL!!)lq!/(7M!/(7M!/(7M +s+B5/!!)Kf!/#k&[/YX~> +\GlO/Z2XfTqu6bLs+.3HrrE+NqYpNqqYpSrJboEHJVX:*Jb&gAWe($H!!)lq!.k+K!.k+K!.k+K +s+0)-!!)Kf!.f_$[/YX~> +\GlO/Z2XfVqu6bNs+@ELrrE+PqYpNqqYpStKDPWJK89L,KC]$CXFpBL!!)lq!/(7M!/(7M!/(7M +s+B5/!!)Kf!/#k&[/YX~> +\GlO/Z2XiW^&7m462uS=qYpNqq>UEpqYpStKDPWJK89L,KC]$CXFpBL!!)lq!/(7M!/(:Ns+C:M +!/'/.!!)Kf!)eCJ[/YX~> +\GlO/Z2XiU^AS!55lZD8qYpNqq>UEpqYpSrJboEHJVX:*Jb&gAWe($H!!)lq!.k+K!.k.Ls+1.K +!.j#,!!)Kf!*+UM[/YX~> +\GlO/Z2XiW^&7m462uS=qYpNqq>UEpqYpStKDPWJK89L,KC]$CXFpBL!!)lq!/(7M!/(:Ns+C:M +!/'/.!!)Kf!)eCJ[/YX~> +\GlO/Z2aiVr;QkOs+@ELrrE,$qYpNqqYpStKDPWJK>RWge]7^iKC]$CXFpEM!NZ:trr@]Mrr>sr +s8R`Mrr>sRrr<&frr>rJs0VfV~> +\GlO/Z2aiTr;QkMs+.3HrrE,"qYpNqqYpSrJboEHJ\qEef#RgjJb&gAWe('I!NH.rrr@WKrr?'u +s8RZKrr?'Urr<&frr?&Ms0VfV~> +\GlO/Z2aiVr;QkOs+@ELrrE,$qYpNqqYpStKDPWJK>RWge]7^iKC]$CXFpEM!NZ:trr@]Mrr>sr +s8R`Mrr>sRrr<&frr>rJs0VfV~> +\GlO/Z2XfVr;ZeL!rmnSqYpO]q>UEpqYpStKDPTKK>#/%!/&>l!JA)VrrK47qYpNqqYpPJrVlj` +rr<"NrVlitl2Lasre((I!($)R!)eCJ[/YX~> +\GlO/Z2XfTr;ZeJ!rmhOqYpO\q>UEpqYpSrJboBIJ\K#$!.i2j!J.uUrrK.6qYpNqqYpPHrVlj_ +rr<"LrVlitl2LatrdjqG!'p#Q!*+UM[/YX~> +\GlO/Z2XfVr;ZeL!rmnSqYpO]q>UEpqYpStKDPTKK>#/%!/&>l!JA)VrrK47qYpNqqYpPJrVlj` +rr<"NrVlitl2Lasre((I!($)R!)eCJ[/YX~> +_uBgk!/%u`rr]t7rrB>(s+C:Ms+:CQK<4qL!!)ip!!)lq!N^qMrr@\frr@\lrr@]ArrB.rrr<&q +rr@]Mrr>@as8R`Mrr<&brs45WK7gjiK2TD]rr<&frr>rJs0VfV~> +_uBgi!.hl_rr^"8rrB>(s+1.Ks+(7OJZASH!!)ip!!)lq!NL_Irr@Vdrr@Vjrr@W?rrB(prr<&q +rr@WKrr>=`s8RZKrr<&brs4/UJUtOdJQ9G_rr<&frr?&Ms0VfV~> +_uBgk!/%u`rr]t7rrB>(s+C:Ms+:CQK<4qL!!)ip!!)lq!N^qMrr@\frr@\lrr@]ArrB.rrr<&q +rr@]Mrr>@as8R`Mrr<&brs45WK7gjiK2TD]rr<&frr>rJs0VfV~> +_uBf=s4%,JrrYRerrB>(!JA)as8R]Qs+@ELrr<&prr<&qrrK3RqYpSK]u'dL]uU-QKCSsBXM+K1 +!!)lq!/(7M!/(:Ns+C:M!/'Y +_uBf=s4.2KrrYOdrrB>(!J.u`s8RWOs+.3Hrr<&prr<&qrrK-NqYpSI^;BmM^;p6RJara@WkS?0 +!!)lq!.k+K!.k.Ls+1.K!.jM:!C254rrGB9rr2run,EAfJcE+WJ,~> +_uBf=s4%,JrrYRerrB>(!JA)as8R]Qs+@ELrr<&prr<&qrrK3RqYpSK]u'dL]uU-QKCSsBXM+K1 +!!)lq!/(7M!/(:Ns+C:M!/'Y +`;fjis8W+Orr3'#s8N)(rrIbcrVunM!rmnSqYpNqq>UEpqYpStKDPTJK80C+KCSsBXFpEM!J<]7 +rr@]Mrr@]Ns8R`MrrIbcmJd.dq#: +`;fjgs8W+Mrr3'#s8N)(rrI\brVunK!rmhOqYpNqq>UEpqYpSrJboBHJVO1)Jara@We('I!J*N4 +rr@WKrr@WLs8RZKrrI\bmJd.dq#: +`;fjis8W+Orr3'#s8N)(rrIbcrVunM!rmnSqYpNqq>UEpqYpStKDPTJK80C+KCSsBXFpEM!J<]7 +rr@]Mrr@]Ns8R`MrrIbcmJd.dq#: +`;]girVm*g^&S*4s8N)(rr@]Ls8R]Qs+@ELrr<&prr<&qrrK3RqYpSK]ncXfKC]$CXFpBL!($J] +!/(7M!/(:Ns+C:Ms+Bb>!PO-\rr<&urr<&trrBb,!!@lRs&+FJ[/YX~> +`;]ggrVm*f^An35s8N)(rr@WJs8RWOs+.3Hrr<&prr<&qrrK-NqYpSI^5)agJb&gAWe($H!'pD\ +!.k+K!.k.Ls+1.Ks+0V +`;]girVm*g^&S*4s8N)(rr@]Ls8R]Qs+@ELrr<&prr<&qrrK3RqYpSK]ncXfKC]$CXFpBL!($J] +!/(7M!/(:Ns+C:Ms+Bb>!PO-\rr<&urr<&trrBb,!!@lRs&+FJ[/YX~> +`;]jj^&J$:K0fP;!<<'!Z2XfVr;ZeL!rmnSqYpNqq>UEpqYpStKDPTJK>IQf]uU0QKC]$CXM+N2 +!PJL0rr@]Mrr@]Mrr@]Mrr@]@\rrKf!rr2rur;Qapq>UT2KE(sLJcE+WJ,~> +`;]jh^Ae-;JO'88!<<'!Z2XfTr;ZeJ!rmhOqYpNqq>UEpqYpSrJboBHJ\h?d^;p9RJb&gAWkSB1 +!PSR1rr@WKrr@WKrr@WKrr@W:rr>=[rrKi!rr2rur;Qasq>UT3JcGaMJcE+WJ,~> +`;]jj^&J$:K0fP;!<<'!Z2XfVr;ZeL!rmnSqYpNqq>UEpqYpStKDPTJK>IQf]uU0QKC]$CXM+N2 +!PJL0rr@]Mrr@]Mrr@]Mrr@]@\rrKf!rr2rur;Qapq>UT2KE(sLJcE+WJ,~> +`;]kO!<)rt5m72fs8N)(rrIbcrVunM!rmnSqYpNqq>UEpqYpStKDPWJK>[]i]n=B*!JA)VrrB.s +rrIa +`;]kP!<)rt5Qq)es8N)(rrI\brVunK!rmhOqYpNqq>UEpqYpSrJboEHJ]%Kg^4F?)!J.uUrrB(q +rrI[9qYpPHrVlkKrr<"LrVlkKm/I1%5_6ZJrrI[9rVlitn,EAfJcE+WJ,~> +`;]kO!<)rt5m72fs8N)(rrIbcrVunM!rmnSqYpNqq>UEpqYpStKDPWJK>[]i]n=B*!JA)VrrB.s +rrIa +_uBai62gfe]`:@urrB>(!JA)as8R]Qs+@ELrr<&prr<&qrrK3RqZ$SJ_Z'Uga8Z-lnc&TjqYpT0 +KDY]KKDkfMKDtoNKDkfMKBiL6K)i"Nrr<&frr>rJs0VfV~> +_uBag5lL]d^&UFurrB>(!J.u`s8RWOs+.3Hrr<&prr<&qrrK-NqZ$SH_Z'Uea8Z-jnc&ThqYpT1 +Jc#KIJc5TKJc>]LJc5TKJa3:4JH2_Jrr<&frr?&Ms0VfV~> +_uBai62gfe]`:@urrB>(!JA)as8R]Qs+@ELrr<&prr<&qrrK3RqZ$SJ_Z'Uga8Z-lnc&TjqYpT0 +KDY]KKDkfMKDtoNKDkfMKBiL6K)i"Nrr<&frr>rJs0VfV~> +\GlO/Z2XfVr;ZeL!rmnSqYpNqq>UEpnc/WA_Z'Uga8Z-lnc&WkKDPTJKDPTJKDkfMKDtoNKDkfM +!8d_UKCAg?;M"kTs*t~> +\GlO/Z2XfTr;ZeJ!rmhOqYpNqq>UEpnc/W?_Z'Uea8Z-jnc&WiJboBHJboBHJc5TKJc>]LJc5TK +!8d_UJa`U= +\GlO/Z2XfVr;ZeL!rmnSqYpNqq>UEpnc/WA_Z'Uga8Z-lnc&WkKDPTJKDPTJKDkfMKDtoNKDkfM +!8d_UKCAg?;M"kTs*t~> +\GlO/Z2XiW^&A!2K*)(*XSVqs!;ZWp!:g'iK>#/%!/&>l!!)Qh!3H%s!J:CKrr@]Mrr@]Ns8R`M +rr<&Urr>@Rrr@\&s0VfV~> +\GlO/Z2XiU^A\*3JHGk&Wqu_q!;ZWp!:g'iJ\K#$!.i2j!!)Qh!35nq!J(7Irr@WKrr@WLs8RZK +rr<&Urr>=Qrr@V$s0VfV~> +\GlO/Z2XiW^&A!2K*)(*XSVqs!;ZWp!:g'iK>#/%!/&>l!!)Qh!3H%s!J:CKrr@]Mrr@]Ns8R`M +rr<&Urr>@Rrr@\&s0VfV~> +\GlO/Z2aiVrVunM!rmnSqYpNqq>UEpnc/WA_Z'Uga8Z-*nc&TjqZ$SJqYpPJrVlkMrr<"NrVlit +hZ!QUnG`R'!5590!/$F6J,~> +\GlO/Z2aiTrVunK!rmhOqYpNqq>UEpnc/W?_Z'Uea8Z-)nc&ThqZ$SHqYpPHrVlkKrr<"LrVlit +hZ!QUnG`R(!5>?1!.g:4J,~> +\GlO/Z2aiVrVunM!rmnSqYpNqq>UEpnc/WA_Z'Uga8Z-*nc&TjqZ$SJqYpPJrVlkMrr<"NrVlit +hZ!QUnG`R'!5590!/$F6J,~> +\GlO/Z2aiVrVunM!rmnSqYpNqq>UEpqYpStKDPWJKCSsA^"!&_]n=B*!!)Qh!3H%ss+C1J!/(7M +!/(:Ns+C:M!!(mU!!)Ng!eUK*VuQdLOoKq~> +\GlO/Z2aiTrVunK!rmhOqYpNqq>UEpqYpSrJboEHJara?^= +\GlO/Z2aiVrVunM!rmnSqYpNqq>UEpqYpStKDPWJKCSsA^"!&_]n=B*!!)Qh!3H%ss+C1J!/(7M +!/(:Ns+C:M!!(mU!!)Ng!eUK*VuQdLOoKq~> +\GlO/Z2XiWec#OJK*)(*XSVqs!;ZWp!;c]rXFpBL!J@KDrr<&_s8R`?rrLZ&r;Q`skl:[8kl1X8 +nc&Tjq>UGIqu?\KrVlkMrr<"NrVlithZ!RRnG`QB!/%3L!)epYJ,~> +\GlO/Z2XiUf)>XKJHGk&Wqu_q!;ZWp!;c]rWe($H!J.9@rr<&_s8RZ=rrL]%r;Q`skl:[6kl1X6 +nc&Thq>UGGqu?\IrVlkKrr<"LrVlithZ!RUnG`Q@!.h'J!*,-\J,~> +\GlO/Z2XiWec#OJK*)(*XSVqs!;ZWp!;c]rXFpBL!J@KDrr<&_s8R`?rrLZ&r;Q`skl:[8kl1X8 +nc&Tjq>UGIqu?\KrVlkMrr<"NrVlithZ!RRnG`QB!/%3L!)epYJ,~> +\GlO/Z2XfVr;ZeL!rmnSqYpNqq>UEpqYpTH^&%a/KCJm@!9jI_KCAg@]n?7_!!)6_s+BP8!($/T +!3H%s!PO-^rr@]Mrr@]Ns8R`Mrr<&Urr>@SrrI`PVZ-W^OT0h~> +\GlO/Z2XfTr;ZeJ!rmhOqYpNqq>UEpqYpTI^A@j0Jai[>!9jI_Ja`U>^4H4^!!)6_s+0D6!'p)S +!35nq!PX-]rr@WKrr@WLs8RZKrr<&Urr>=RrrIZNVZ-W]OT0h~> +\GlO/Z2XfVr;ZeL!rmnSqYpNqq>UEpqYpTH^&%a/KCJm@!9jI_KCAg@]n?7_!!)6_s+BP8!($/T +!3H%s!PO-^rr@]Mrr@]Ns8R`Mrr<&Urr>@SrrI`PVZ-W^OT0h~> +\GlO/Z2XfVr;ZeL!rmnSqYpNqq>UEpnc&TAnG`Igkl:[8mf*9>r;Q`skl:[8kl1X8nc&TjqZ$SJ +qu6]1KDtoNKDtoNKDkfM!8d_U!:^!h]`=u1!PO,Is*t~> +\GlO/Z2XfTr;ZeJ!rmhOqYpNqq>UEpnc&T?nG`Igkl:[6mf*9]LJc>]LJc5TK!8d_U!:^!h^&Y)2!PX,Hs*t~> +\GlO/Z2XfVr;ZeL!rmnSqYpNqq>UEpnc&TAnG`Igkl:[8mf*9>r;Q`skl:[8kl1X8nc&TjqZ$SJ +qu6]1KDtoNKDtoNKDkfM!8d_U!:^!h]`=u1!PO,Is*t~> +\c2`E!55]r;Q`skl:[8kl1X8nc&Tj +qZ$SJqYpPJrr3#4KDtoNKDkfM6/MVA!:Tpf!2oksK96+`~> +\c2`F!5>c=!J.u`s8RWOs+.3Hrr<&prr<&hrrI\bnc&Rhkl:[6mf*9]LJc5TK5i2M@!:Tpf!2oksJWTn^~> +\c2`E!55]r;Q`skl:[8kl1X8nc&Tj +qZ$SJqYpPJrr3#4KDtoNKDkfM6/MVA!:Tpf!2oksK96+`~> +g]%7>gAhCTK0]J;60!Rt62lK<6%_K%K*20?K.-faKE"79KE"4=K0`E3K)boJK)e4:!<7ZT6%aef +K7j.hre(4N$A26/K0]J;6%aeUrIY,:!;qKL619F,5lgA+!C6_`K)bo8KE"7.K*Ar@ec18Srr3#4 +!<.TNeb/qB;Z27Is8PC^s8PCarrGE +g]%7=gAhCWJNs285i[Cq5lQ<95_23!JHPs +g]%7>gAhCTK0]J;60!Rt62lK<6%_K%K*20?K.-faKE"79KE"4=K0`E3K)boJK)e4:!<7ZT6%aef +K7j.hre(4N$A26/K0]J;6%aeUrIY,:!;qKL619F,5lgA+!C6_`K)bo8KE"7.K*Ar@ec18Srr3#4 +!<.TNeb/qB;Z27Is8PC^s8PCarrGE +gA_-Qnc&[(!/'nC!!'e6!e\2"pAY.ZKDkiM5m%'PKDPTM!58F4qZ$[`K7j.h!eUIQqL\u!%IXB!'u/9rW)59#QKDVK7j4(^& +gA_-Qnc&[)!.jbA!!'e6!eJ)"pAY.YJc5WK5Q^sNJboBK!5AL5qZ$[_JV!ec!eC=OqLJi9!!$#M +JO'27!eET:rIOqJqLS5TJV!k$^AWT_^ANNa^AknInUU\SrVll3^&J'4 +O8j_~> +gA_-Qnc&[(!/'nC!!'e6!e\2"pAY.ZKDkiM5m%'PKDPTM!58F4qZ$[`K7j.h!eUIQqL\u!%IXB!'u/9rW)59#QKDVK7j4(^& +gA_-QnG`LhKCf*C!3uP(KDbcLK*)(*XSVr'!<<)4!%IpJ!/(.J!N^qMrrRfQ!<)ouK)k]H!!)ip +!keTIrr3&5!/(+Is+C.I!<>F`rr`=Ss1O'_rr<&prrPId^&@s35lg`\!C;A7rrTk6!<)p!K)e45 +rsM-+s8T2#K>%:N!($R9!C6_^KE"77KE"7:KE"7:KE"79KDbfIKDY]LKC8aB]`>bGs71dB!:YUB +5la4GK)e49KDY]L62U]_62U]_KDbf.rr@]9!:PO?^&EWaXT&5"^&7m1^&@s2^& +gA_-QnG`LhJb/mA!3uP(Jc,QJJHGk&Wqu`%!<<)5!%@jI!.k"H!NL_IrrR`O!<)ouJH5KF!!)ip +!knZKrr3&6!.jtGs+1"G!<>C_rr`=Qs1X'^rr<&prrPFc^A\'45QLW[!C254rrTn7!<)p!JH.t2 +rsM*+s8T,!J\M.L!'pL6!C-Y]JcA"4JcA"7JcA"7JcA"6Jc,TGJc#KJJaWO@^&YnIs71^@!:YO@ +5QF(EJH.t6Jc#KJ5l:T^5l:T^Jc,T,rr@W7!:PI=^A`Z`WrE"u^AS!2^A\'3^AWT_^AWTcf"V0u +^=rU;~> +gA_-QnG`LhKCf*C!3uP(KDbcLK*)(*XSVr'!<<)4!%IpJ!/(.J!N^qMrrRfQ!<)ouK)k]H!!)ip +!keTIrr3&5!/(+Is+C.I!<>F`rr`=Ss1O'_rr<&prrPId^&@s35lg`\!C;A7rrTk6!<)p!K)e45 +rsM-+s8T2#K>%:N!($R9!C6_^KE"77KE"7:KE"7:KE"79KDbfIKDY]LKC8aB]`>bGs71dB!:YUB +5la4GK)e49KDY]L62U]_62U]_KDbf.rr@]9!:PO?^&EWaXT&5"^&7m1^&@s2^& +gA_-QnGiLgoD\djZ2XiW^&A!2K*)(*eb]:P!<7ZO63$rb!($J]!N^qMrrRfQ!<)ouK)k]H!($D[ +!!)rs!<@cJs8R`IrrE+Pr;Qm"KE&W;r;Q`sq>UJJ!;uitK)k`Is+C.I!<@cMrrE+Pq>UGIq#:?p +KDkfNK)kcJs+C4Ks+C:M!/(:Ns+C:M",$UR62UZcK)gN(!($#P!!)Kf!)i=d!J:CCrrTk6XRZ;k +]`?si!PLerrrBb'rr>@`!!'^qs8PC_s8Te-rr]q76+u%QJ,~> +gA_-QnGiLgoD\djZ2XiU^A\*3JHGk&f)#CQ!<7TM5l^ia!'pD\!NL_IrrR`O!<)ouJH5KF!'p>Z +!!)rs!<@]Hs8RZGrrE+Nr;Qm"JcEH8r;Q`sq>UJH!;uitJH5NGs+1"G!<@]KrrE+Nq>UGGq#:?p +Jc5TLJH5QHs+1(Is+1.K!.k.Ls+1.K"+gIP5l:QbJH16$!'orO!!)Kf!*/Og!J(7ArrTn7Wq$)i +^&['j!PUhrrrBe(rr>=_!!'ars8P@^s8Th.rr]t85ec"QJ,~> +gA_-QnGiLgoD\djZ2XiW^&A!2K*)(*eb]:P!<7ZO63$rb!($J]!N^qMrrRfQ!<)ouK)k]H!($D[ +!!)rs!<@cJs8R`IrrE+Pr;Qm"KE&W;r;Q`sq>UJJ!;uitK)k`Is+C.I!<@cMrrE+Pq>UGIq#:?p +KDkfNK)kcJs+C4Ks+C:M!/(:Ns+C:M",$UR62UZcK)gN(!($#P!!)Kf!)i=d!J:CCrrTk6XRZ;k +]`?si!PLerrrBb'rr>@`!!'^qs8PC_s8Te-rr]q76+u%QJ,~> +gA_0R^%21)]`8'(rr<&(rr@]Ls8R]Ps+C.Is+:=P62poa!!%ZJrrK3RqYpVL!!)ut!J:CIrr>@[ +rr<&srrE+Pq>^JIq>UHqKDb`P!/(=OKDb`L!;ZWqK)kiL!J:CJs8R`IrrE+Pr;QctKDGNIKD>HI +!/(7M!J:CKs8R`Jrr@]NrrKfcrr<"NrVltPrr<&rrs")Us8Tb4614aQ!:TpfXRQ5jK)kHA!!)Kf +!!(pVs+BY;"bQf-K)e4#s8R`@rrE+PgAc[~> +gA_0R^@M:*^&S0)rr<&(rr@WJs8RWNs+1"Gs+(1N5lUf`!!%THrrK-NqYpVJ!!)ut!J(7Grr>=Z +rr<&srrE+Nq>^JGq>UHqJc,NN!.k1MJc,NJ!;ZWqJH5WJ!J(7Hs8RZGrrE+Nr;QctJbfrrE+NgAc[~> +gA_0R^%21)]`8'(rr<&(rr@]Ls8R]Ps+C.Is+:=P62poa!!%ZJrrK3RqYpVL!!)ut!J:CIrr>@[ +rr<&srrE+Pq>^JIq>UHqKDb`P!/(=OKDb`L!;ZWqK)kiL!J:CJs8R`IrrE+Pr;QctKDGNIKD>HI +!/(7M!J:CKs8R`Jrr@]NrrKfcrr<"NrVltPrr<&rrs")Us8Tb4614aQ!:TpfXRQ5jK)kHA!!)Kf +!!(pVs+BY;"bQf-K)e4#s8R`@rrE+PgAc[~> +gA_0RKC]$DK)boCrr<&(rr@]Ls8R]Qs+@ELrrPId!<)rt!!%ZJrrK3RqYpVL!!)ut!J:CIrr@]H +rr<&srrE+Pq>^JIq>UHqKDb`P!/(=OKDb`L!;ZWqK)kiL!J:CJs8R`IrrE*cr;QctKDGNIKD>HI +!/(7M!J:CKs8R`KrrKfcrr3#4KDtoNKDkfP62pq;qu6\L!<3!"]`<]Rrr<&frr>sdrrRfQKCf*E +]`>/(rrI`Phu<\/lMpm:s8N/6!(#iK!<@cArrE+PgAc[~> +gA_0RJb&gBJH,]Arr<&(rr@WJs8RWOs+.3HrrPFc!<)rt!!%THrrK-NqYpVJ!!)ut!J(7Grr@WF +rr<&srrE+Nq>^JGq>UHqJc,NN!.k1MJc,NJ!;ZWqJH5WJ!J(7Hs8RZGrrE*br;QctJbf]LJc5TN5lUh8qu6\J!<3!"^&W`Qrr<&frr?'grrR`OJb/mC +^&Y2'rrIZNhu<\-lMpm8s8N/7!'ocJ!<@]?rrE+NgAc[~> +gA_0RKC]$DK)boCrr<&(rr@]Ls8R]Qs+@ELrrPId!<)rt!!%ZJrrK3RqYpVL!!)ut!J:CIrr@]H +rr<&srrE+Pq>^JIq>UHqKDb`P!/(=OKDb`L!;ZWqK)kiL!J:CJs8R`IrrE*cr;QctKDGNIKD>HI +!/(7M!J:CKs8R`KrrKfcrr3#4KDtoNKDkfP62pq;qu6\L!<3!"]`<]Rrr<&frr>sdrrRfQKCf*E +]`>/(rrI`Phu<\/lMpm:s8N/6!(#iK!<@cArrE+PgAc[~> +gA_0RKC]$DK)boCrr<&(rr@]Ls8R]Qs+Al!rr[lR!($S`rr<%OqYpStKDPTLK)boMrrI`Pq#:>H +q#:^JIq>UHq62^``!/(+I!!)fo +!<@cNrrI`PqZ$SJqu?\Krr<"Nrr<"NrVltPrr@]KrrI`PrVlo3!:TpfKCAg?;Xj\fK)gPqrrRfQ +XRZ>j!!'^jrr<&as8R`NrrTk660\CM!/'e@!<@c+s*t~> +gA_0RJb&gBJH,]Arr<&(rr@WJs8RWOs+/burr[fP!'pM_rr<%MqYpSrJboBJJH,]KrrIZNq#:>F +q#:^JGq>UHq5lCW_!.jtG!!)fo +!<@]LrrIZNqZ$SHqu?\Irr<"Lrr<"LrVltNrr@WIrrIZNrVlo4!:TpfJa`U=!<@])s*t~> +gA_0RKC]$DK)boCrr<&(rr@]Ls8R]Qs+Al!rr[lR!($S`rr<%OqYpStKDPTLK)boMrrI`Pq#:>H +q#:^JIq>UHq62^``!/(+I!!)fo +!<@cNrrI`PqZ$SJqu?\Krr<"Nrr<"NrVltPrr@]KrrI`PrVlo3!:TpfKCAg?;Xj\fK)gPqrrRfQ +XRZ>j!!'^jrr<&as8R`NrrTk660\CM!/'e@!<@c+s*t~> +g]%>-!($P_!PO-`rrp)gs+::OoD\djZ2aiVrVunM!WRfLrr@]N!!%ZMs8N'!KDPTKXFpBL!eUIQ +rVlnN!;QQo62:H[!;uit!/(+Is+C.I!<@cMrr`=Ss8R`Lrr<&prrI`Pr;QeM!;ZZpKDGNJ!/(4L +!<@cJrr<&orrE+PrVlnN!;c`qKDY]KKDtoNKDtoNKDkfPKDtq(qu6\L!;uit;F0jQ!PO-SrrB.i +rrPIdKCf*EK)i"Cs8N'!KAcb0KBiL:KDkfO]`>b2s8N)hrrTk6!8@I'~> +g]%>+!'pJ^!PX-_rrp,fs+(.MoD\djZ2aiTrVunK!WR`Jrr@WL!!%TKs8N'!JboBIWe($H!eC=O +rVlnL!;QQo5kt?Z!;uit!.jtGs+1"G!<@]Krr`=Qs8RZJrr<&prrIZNr;QeK!;ZZpJbf]LJc>]LJc5TNJc>_$qu6\J!;uit +g]%>-!($P_!PO-`rrp)gs+::OoD\djZ2aiVrVunM!WRfLrr@]N!!%ZMs8N'!KDPTKXFpBL!eUIQ +rVlnN!;QQo62:H[!;uit!/(+Is+C.I!<@cMrr`=Ss8R`Lrr<&prrI`Pr;QeM!;ZZpKDGNJ!/(4L +!<@cJrr<&orrE+PrVlnN!;c`qKDY]KKDtoNKDtoNKDkfPKDtq(qu6\L!;uit;F0jQ!PO-SrrB.i +rrPIdKCf*EK)i"Cs8N'!KAcb0KBiL:KDkfO]`>b2s8N)hrrTk6!8@I'~> +g]%?*3NW,X$`m7-s8R.ms8UUuKCf*C!3uP(KDbcLK*)(*`W#lAePZC".0(gqs8N'!KDPTKXFpBL +!eUIQrVlnN!;QQo!;QQo!<)p!eGt6ts8R`IrrE*tr;Qm"KE(t(r;Q`sq>UJJ!;uitK)k`Is+C.I +!<=SHrrE+Pq>UEpq#:?pKDkfNK)kcJs+C4Ks+C=Ns+C=Ns+C:M",$URKDYZLK)kiL!cn@lo)Ab? +!)i=d!'0QKrr<$JoDegj!3G_jrr<%Oi;We0lMpm:r;Qgr!7gH9!iuA%nc&ZC!!(aQJ,~> +g]%?+33)lU$`[4,s8R(is8UXuJb/mA!3uP(Jc,QJJHGk&`r>uBel;^$-ib[os8N'!JboBIWe($H +!eC=OrVlnL!;QQo!;QQo!<)p!ec:9ss8RZGrrE+"r;Qm"JcGb$r;Q`sq>UJH!;uitJH5NGs+1"G +!<=PGrrE+Nq>UEpq#:?pJc5TLJH5QHs+1(Is+11Ls+11Ls+1.K"+gIPJc#HJJH5WJ!c\4ko)Ab> +!*/Og!''KJrr<$IoDegj!35Shrr<%Mi;We.lMpm8r;Qgu!7pN:!ic5#nc&ZA!!(aQJ,~> +g]%?*3NW,X$`m7-s8R.ms8UUuKCf*C!3uP(KDbcLK*)(*`W#lAePZC".0(gqs8N'!KDPTKXFpBL +!eUIQrVlnN!;QQo!;QQo!<)p!eGt6ts8R`IrrE*tr;Qm"KE(t(r;Q`sq>UJJ!;uitK)k`Is+C.I +!<=SHrrE+Pq>UEpq#:?pKDkfNK)kcJs+C4Ks+C=Ns+C=Ns+C:M",$URKDYZLK)kiL!cn@lo)Ab? +!)i=d!'0QKrr<$JoDegj!3G_jrr<%Oi;We0lMpm:r;Qgr!7gH9!iuA%nc&ZC!!(aQJ,~> +gA_/Sq#C@[!UJJ^%q[/!/(4L"9=)Ss+C7L!!)ip!J:CMrrI`Pq>^JIq>UHqKDb`M +!/(+I!!)fo!<@cNrrI`PqZ$SJqu?\Krr<"Nrr<"NrVltP]`<]^rrI`Pqu6ZsKC]'B!!#=SrrB.j +rr]q7!/'nCrr<%Onc/Rgi;We0lMpm:qu6ZsKC&U?K)bn(o)J[h!/'&+J,~> +gA_/Qq#C@Z!UJH^A7d0!.k(J"9=#Qs+1+J!!)ip!J(7KrrIZNq>^JGq>UHqJc,NK +!.jtG!!)fo!<@]LrrIZNqZ$SHqu?\Irr<"Lrr<"LrVltN^&W`]rrIZNqu6ZsJb&j@!!#:RrrB(h +rr]t8!.jbArr<%Mnc/Rgi;We.lMpm8qu6ZsJaEC=JH,\$o)J[h!.io)J,~> +gA_/Sq#C@[!UJJ^%q[/!/(4L"9=)Ss+C7L!!)ip!J:CMrrI`Pq>^JIq>UHqKDb`M +!/(+I!!)fo!<@cNrrI`PqZ$SJqu?\Krr<"Nrr<"NrVltP]`<]^rrI`Pqu6ZsKC]'B!!#=SrrB.j +rr]q7!/'nCrr<%Onc/Rgi;We0lMpm:qu6ZsKC&U?K)bn(o)J[h!/'&+J,~> +gA_.Nq#:GK!!(RJrr@]Brr<&(rr@]Ls8R][s+@EQ]`8&Gs8R]OKDkiM!!%ZJrrK3RqYpVL!!)ut +!J:CIrr@]Hrr<&srrE+Pq>^JIq>^Hpr;Qm"KE(t(r;Q`sq>UJJ!;uitK)k`Is+C.I!<>F`rrE+P +q>UEpq#:?pKDkfNK)kcJs+C4Ks+C=Ns+C=Ns+C:Ms+:=PKDYZLK)kfK!<@cCs8N'!^$u%%;XaVc +61OsT61=gR!8meVKBiL:KDYZLK)k6;s$?2T!keS"gAc[~> +gA_.Qq#:GI!!(UKrr@W@rr<&(rr@WJs8RWYs+.3M^&S/Is8RWMJc5WK!!%THrrK-NqYpVJ!!)ut +!J(7Grr@WFrr<&srrE+Nq>^JGq>^Hpr;Qm"JcGb$r;Q`sq>UJH!;uitJH5NGs+1"G!<>C_rrE+N +q>UEpq#:?pJc5TLJH5QHs+1(Is+11Ls+11Ls+1.Ks+(1NJc#HJJH5TI!<@]As8N'!^@;.& +gA_.Nq#:GK!!(RJrr@]Brr<&(rr@]Ls8R][s+@EQ]`8&Gs8R]OKDkiM!!%ZJrrK3RqYpVL!!)ut +!J:CIrr@]Hrr<&srrE+Pq>^JIq>^Hpr;Qm"KE(t(r;Q`sq>UJJ!;uitK)k`Is+C.I!<>F`rrE+P +q>UEpq#:?pKDkfNK)kcJs+C4Ks+C=Ns+C=Ns+C:Ms+:=PKDYZLK)kfK!<@cCs8N'!^$u%%;XaVc +61OsT61=gR!8meVKBiL:KDYZLK)k6;s$?2T!keS"gAc[~> +gA_.NqYpc56,!.X"!/'kB!!';(!JA)as8R]Us+@Dd!!'_3rrRfQ62gi`!!%ZJrrK3RqYpYM +!!(RKrrI`Pq#:^JIq>UHq +KDb`M!/(+I!!)fo!<@cNrrI`PqZ$SJqu?\Krr<"Nrr<"NrVunM!<@cLrrI`Pqu6Zs61Y$V5lgBR +!)i:c!/'hA!/'b?!!(sWs+BV:s+C4K!J:C +gA_.QqYpc65ed9u."VBt!.j_@!!';(!J.u`s8RWSs+.2a!!'b4rrR`O5lL`_!!%THrrK-NqYpYK +!!(ULrrIZNq#:^JGq>UHq +Jc,NK!.jtG!!)fo!<@]LrrIZNqZ$SHqu?\Irr<"Lrr<"LrVunK!<@]JrrIZNqu6Zs5k=pU5QL9Q +!*/Lf!.j\?!.jV=!!(sWs+0J8s+1(I!J(7:s8RZ>rr@W's*t~> +gA_.NqYpc56,!.X"!/'kB!!';(!JA)as8R]Us+@Dd!!'_3rrRfQ62gi`!!%ZJrrK3RqYpYM +!!(RKrrI`Pq#:^JIq>UHq +KDb`M!/(+I!!)fo!<@cNrrI`PqZ$SJqu?\Krr<"Nrr<"NrVunM!<@cLrrI`Pqu6Zs61Y$V5lgBR +!)i:c!/'hA!/'b?!!(sWs+BV:s+C4K!J:C +gA_.Nqu6`2!58@2s$?\b!/'kB!(!mi!/(4Ls+:LTK<,%Q^&@s4K)boMs8N'!KDPTKXFpBL"+pRR +ec,RLK)k]H!/((H!!)rs!<@cJrr@]HrrE+Pr;Qm"KE(t(r;Q`sq>UJJ!;uitK)k`Is+C.I!<@cM +rrE+Pq>UEpq#:?pKDkfNK)kcJs+C4Ks+C=Ns+C=Ns+C:M"+pRRKDYZLK)kfKrrDWi!J:C@rr@]K +rr>@\!<2uu!:g'hKCAg?6/_eCKBiL:KDYZMK)jHgrr@]?rr@])s*t~> +gA_.Qqu6`3!5AF3s$6Va!.j_@!'mgh!.k(Js+(@RJZ8\M^A\'5JH,]Ks8N'!JboBIWe($H"+^FP +f)G[MJH5KF!.jqF!!)rs!<@]Hrr@WFrrE+Nr;Qm"JcGb$r;Q`sq>UJH!;uitJH5NGs+1"G!<@]K +rrE+Nq>UEpq#:?pJc5TLJH5QHs+1(Is+11Ls+11Ls+1.K"+^FPJc#HJJH5TIrrDWi!J(7>rr@WI +rr>=[!<2uu!:g'hJa`U=5iD\BJa3:8Jc#HKJH49frr@W=rr@W's*t~> +gA_.Nqu6`2!58@2s$?\b!/'kB!(!mi!/(4Ls+:LTK<,%Q^&@s4K)boMs8N'!KDPTKXFpBL"+pRR +ec,RLK)k]H!/((H!!)rs!<@cJrr@]HrrE+Pr;Qm"KE(t(r;Q`sq>UJJ!;uitK)k`Is+C.I!<@cM +rrE+Pq>UEpq#:?pKDkfNK)kcJs+C4Ks+C=Ns+C=Ns+C:M"+pRRKDYZLK)kfKrrDWi!J:C@rr@]K +rr>@\!<2uu!:g'hKCAg?6/_eCKBiL:KDYZMK)jHgrr@]?rr@])s*t~> +gA_.Nqu6Z0qYpYMs8R`Brr<&(rr@]Ls8R]Ss+::O^&7m3K)boMs8N'!KDPTKXFpBL!eUIQrVlnN +!;QQoKD>HH!;uit!/(+I!/((H!<@cMrr`=Ss1O'_rr<&prrI`Pr;ZeLq>^JIq>UHqKDb`M!/(+I +!!)fo!<@cNrrI`PqZ$SJqu?\Krr<"Nrr<"NrVltP!!%ZKrrI`Pqu?Zro)A`C!:TpfKD#6GK)iUa +rr<&hrr@]?rr>@CrrIbclMgm;!;lctK)i">rrIbcnG`K@g&HR~> +gA_.Qqu6Z1qYpYKs8RZ@rr<&(rr@WJs8RWQs+(.M^AS!4JH,]Ks8N'!JboBIWe($H!eC=OrVlnL +!;QQoJb]6F!;uit!.jtG!.jqF!<@]Krr`=Qs1X'^rr<&prrIZNr;ZeJq>^JGq>UHqJc,NK!.jtG +!!)fo!<@]LrrIZNqZ$SHqu?\Irr<"Lrr<"LrVltN!!%TIrrIZNqu?Zro)A`A!:TpfJbB$EJH3F` +rr<&hrr@W=rr>=BrrI\blMgm9!;lctJH2_:rrI\bnG`K>g&HR~> +gA_.Nqu6Z0qYpYMs8R`Brr<&(rr@]Ls8R]Ss+::O^&7m3K)boMs8N'!KDPTKXFpBL!eUIQrVlnN +!;QQoKD>HH!;uit!/(+I!/((H!<@cMrr`=Ss1O'_rr<&prrI`Pr;ZeLq>^JIq>UHqKDb`M!/(+I +!!)fo!<@cNrrI`PqZ$SJqu?\Krr<"Nrr<"NrVltP!!%ZKrrI`Pqu?Zro)A`C!:TpfKD#6GK)iUa +rr<&hrr@]?rr>@CrrIbclMgm;!;lctK)i">rrIbcnG`K@g&HR~> +gA_.NnG`K@o)A[iZ2XfVr;ZeL"91Xe^&.g2K)boMs8N'!KDPTKXFpBL!eUIQrVlnN!;QQoKD>HH +!;uls!;V6J!($I6!`B#Nr;R-)6%_HhXFl0*]`<]]rrPId^&@s36%f"5s+C.I!<@cNrrTk6KDGNI +!;ZWr]`<]`rrI`PqZ$SJqu?\Krr<"Nrr<"NrVltP!!%ZKrrI`Pqu6\L!:p-jK)kB?!)iOj!j"]$ +rVlitnc&TAn,EB?i;We0l2Ld:62UZ`K)jHgrr@]?rr@])s*t~> +gA_.QnG`K>o)A[iZ2XfTr;ZeJ"91Ud^AIp3JH,]Ks8N'!JboBIWe($H!eC=OrVlnL!;QQoJb]6F +!;uls!;V0H!'pC3!`]5Or;R-)5_20cWe#a$^&W`\rrPFc^A\'45_8b2s+1"G!<@]LrrTn7Jbf +gA_.NnG`K@o)A[iZ2XfVr;ZeL"91Xe^&.g2K)boMs8N'!KDPTKXFpBL!eUIQrVlnN!;QQoKD>HH +!;uls!;V6J!($I6!`B#Nr;R-)6%_HhXFl0*]`<]]rrPId^&@s36%f"5s+C.I!<@cNrrTk6KDGNI +!;ZWr]`<]`rrI`PqZ$SJqu?\Krr<"Nrr<"NrVltP!!%ZKrrI`Pqu6\L!:p-jK)kB?!)iOj!j"]$ +rVlitnc&TAn,EB?i;We0l2Ld:62UZ`K)jHgrr@]?rr@])s*t~> +gA_/*o`#*.KE(t(^%;7(!3uP(KDbcLK*"==KDPTLK)boMs8N'!KDPTKXFpBL!eUIQrVlnN!;QQo +KDGNJ]`A!1li7$@CrrIbclMpm:qu6_M!7gH9s+Bh@!JA)>s*t~> +gA_/(o`#*/JcGb$^@V@)!3uP(Jc,QJJHA(:JboBJJH,]Ks8N'!JboBIWe($H!eC=OrVlnL!;QQo +Jbf]M5lH96!!#:]JcA"4 +JcA"7Jc@t@^4Ci#5_4LdJc5WL5l6*55QL\4rrDnHrr2uLrVlqM!5@t&!*/dn!PVS2rr<&hrr@W= +rr>=BrrI\blMpm8qu6_K!7pN:s+0\>!J.u=s*t~> +gA_/*o`#*.KE(t(^%;7(!3uP(KDbcLK*"==KDPTLK)boMs8N'!KDPTKXFpBL!eUIQrVlnN!;QQo +KDGNJ]`A!1li7$@CrrIbclMpm:qu6_M!7gH9s+Bh@!JA)>s*t~> +gA_/Sp\tK3K.2Gds8R`Drr]r#!("b[s8N)4nG`L%rr3!b^&@s2KDkiNXSVtr!<)rt!!#=]K)mDe +qL\i8!!)ut!eUJ=rdtQkK7h^,63"Xu]tOFF!J:CMs8Duu^&J$9.KBE6]tFFDs8N'!62^c^!!5Fd +XT&5%5lcPNrdt2:r;Zi2rVlma!;ZZp!;c]sK)e49rrTk6KDGNJ!587/!^Qg=rVlpb!/(7M$bcR+ +!/(=O]n:q;62lK@5lcOi5l^oaKDbcM62Q<7!!#=_KDtrBKDtoOKCJm@;Y^:l62LT]!:g'hKCAg? +KAcb1K>$RMs$?P^!eUKSm/I' +gA_/Qp\tK4JLH)`s8RZBrr]u#!'n\Xs8N)5nG`L&rr3!a^A\'3Jc5WLWqubp!<)rt!!#:\JH7/a +qLJ]5!!)ut!eC>:rdbEjJUuC'5l\Ru^:sUH!J(7Ks8Duu^Ae-:.0'<4^:jUFs8N'!5lCZ]!!5Cc +WrE##5QHALrdb&7r;Zi3rVlm`!;ZZp!;c]sJH.t6rrTn7Jbf`@Jc>]MJai[> +gA_/Sp\tK3K.2Gds8R`Drr]r#!("b[s8N)4nG`L%rr3!b^&@s2KDkiNXSVtr!<)rt!!#=]K)mDe +qL\i8!!)ut!eUJ=rdtQkK7h^,63"Xu]tOFF!J:CMs8Duu^&J$9.KBE6]tFFDs8N'!62^c^!!5Fd +XT&5%5lcPNrdt2:r;Zi2rVlma!;ZZp!;c]sK)e49rrTk6KDGNJ!587/!^Qg=rVlpb!/(7M$bcR+ +!/(=O]n:q;62lK@5lcOi5l^oaKDbcM62Q<7!!#=_KDtrBKDtoOKCJm@;Y^:l62LT]!:g'hKCAg? +KAcb1K>$RMs$?P^!eUKSm/I' +gA_/Sq>^JIs$6Y8rVlkMoD\hW!;(mG^&N_uc[u3`on*8F62lK?5l^mN!)iZGrVupare'M:rVlkM +li?t`rW)os#D5>BKE(tb62gi`!!#=_s8E!"s$8+4rrE*crVll2r;ccq!/'Y=!/(4Lli7$s8R`@s8R`*s*t~> +gA_/Qq>^JGs$-S8rVlkKoD\hV!;(gE^Aibuc[c']omm,D5lQ<<5QCdL!*/lHrVup`rdjA8rVlkK +li?t`rW)os#D#/?JcGba5lL`_!!#:^s8E!"s$/"2rrE*brVll3r;ccq!.jM;!.k(Jli7$:rVlkK +n,NH>rr2tLo)S[frr<&5r;Zcs!5A()!J(7>rr=JDrrTn7^A7d/!:g'hJa`U=J`-S.Ja3:8Jc#HK +JH2_:s8RZ>s8RZ(s*t~> +gA_/Sq>^JIs$6Y8rVlkMoD\hW!;(mG^&N_uc[u3`on*8F62lK?5l^mN!)iZGrVupare'M:rVlkM +li?t`rW)os#D5>BKE(tb62gi`!!#=_s8E!"s$8+4rrE*crVll2r;ccq!/'Y=!/(4Lli7$s8R`@s8R`*s*t~> +gA_/*qu6i5!($YbKDb`LKCf*DK)i1V!/(7M"@3#Rs+C.I!eUIQrVufr!58C3$:+Y@KE&VN63$tu +rW)os%>+W\63"Va63$tu!!%ZMrr>@a!;ulr!!#=`s8IZMrrKf!rr;uu!/(4Lrr<1Ss8UV8rr3!! +^&7m1KDklKrr@]M!<%NO5la4LK*;7-5l^n;r;Zcs!%Io"#=/?BK)e2i!<%QL!!%ZMrr@]?!<2uu +KCf-D62Q<7!;hEK!!#=VK)n7K)e2i!!%X;!!)rs!eUJ=qh+nJ!!)Qh!/'b?!/'50s+BV: +!J:CLrrI`Pli-s;n,NE?gAc[~> +gA_/(qu6i6!'pSaJc,NJJb/mBJH2tT!.k+K"@)rPs+1"G!eC=OrVufr!5AI4$:"S>JcEGL5l^ku +rW)os%=nKZ5l\P`5l^ku!!%TKrr>=`!;ulr!!#:_s8ITKrrKi!rr;uu!.k(Jrr<1Qs8UY8rr3!! +^AS!2Jc5ZIrr@WK!<%HM5QF(JJHZ%)5QCe8r;Zcs!%@ht#=&9?JH.rd!<%KJ!!%TKrr@W=!<2uu +Jb/pB5l6-4!;h?I!!#:UJH8"9pjic;JH.rd!!%R8!!)rs!eC>:qgnbH!!)Qh!.jV=!.j).s+0J8 +!J(7JrrIZNli-s9n,NE=gAc[~> +gA_/*qu6i5!($YbKDb`LKCf*DK)i1V!/(7M"@3#Rs+C.I!eUIQrVufr!58C3$:+Y@KE&VN63$tu +rW)os%>+W\63"Va63$tu!!%ZMrr>@a!;ulr!!#=`s8IZMrrKf!rr;uu!/(4Lrr<1Ss8UV8rr3!! +^&7m1KDklKrr@]M!<%NO5la4LK*;7-5l^n;r;Zcs!%Io"#=/?BK)e2i!<%QL!!%ZMrr@]?!<2uu +KCf-D62Q<7!;hEK!!#=VK)n7K)e2i!!%X;!!)rs!eUJ=qh+nJ!!)Qh!/'b?!/'50s+BV: +!J:CLrrI`Pli-s;n,NE?gAc[~> +gA_.NqYp]3!/!Rir;QbLoD\iD!3uP(KDtlQ5l^n;p\t;I!!)utr;Zi2rVlpb!58C3"$sX#s8E#s +rr[lR!/(:N#!os&s+A";r;Z`rr;Z`r!J:CMrrIbcrr32963$rb!/(4Lrr<%Orr<#3s8N0$s1O'` +s8E#rrrn#T!<7\(rVlmaKDkfRK=um;!/(4Lrr<$srVm*g^&J*4s1PN5s8DuuKDkfYK)e4;s$;;; +s1Q*3KDtlP]`:@trsFAY63$t;5s`3a^&A!3KDYZLK)kfKrrDWi!J:C@rr<&rs7h3K^&S*4nc&TA +n,E@fi;`h0lMgm;62UZ`K)jHgrrIbcnGiN@gAc[~> +gA_.QqYp]4!.dCdr;QbJoD\iB!3uP(Jc>ZO5QCe8p\t;G!!)utr;Zi3rVlpa!5AI4"$jU#s8E#s +rr[fP!.k.L#!fp&s+.n8r;Z`rr;Z`r!J(7KrrI\brr32:5l^ia!.k(Jrr<%Mrr<#4s8N0$s1X'_ +s8E#rrrmrR!<7V$rVlm`Jc5TPJ\H[8!.k(Jrr<%!rVm*f^Ae35s1YN4s8DuuJc5TWJH.t8s$2/8 +s1Z34Jc>ZN^&UFtrsF;W5l^k85X<'`^A\*4Jc#HJJH5TIrrDWi!J(7>rr<&rs7h-I^An35nc&T? +n,E@fi;`h.lMgm95l:Q_JH49frrI\bnGiN>gAc[~> +gA_.NqYp]3!/!Rir;QbLoD\iD!3uP(KDtlQ5l^n;p\t;I!!)utr;Zi2rVlpb!58C3"$sX#s8E#s +rr[lR!/(:N#!os&s+A";r;Z`rr;Z`r!J:CMrrIbcrr32963$rb!/(4Lrr<%Orr<#3s8N0$s1O'` +s8E#rrrn#T!<7\(rVlmaKDkfRK=um;!/(4Lrr<$srVm*g^&J*4s1PN5s8DuuKDkfYK)e4;s$;;; +s1Q*3KDtlP]`:@trsFAY63$t;5s`3a^&A!3KDYZLK)kfKrrDWi!J:C@rr<&rs7h3K^&S*4nc&TA +n,E@fi;`h0lMgm;62UZ`K)jHgrrIbcnGiN@gAc[~> +gA_/*p\t;I!3H/!!/'nC!eUKdZMt/^s8P@b5s^.trrRfQKDkiL!<5=b^&@s2.K'2I6,!t(6+su2!!%ZKrrIa +gA_/(p\t;G!36"t!.jbA!eC?cZMt/\s8P=a5X9nprrR`OJc5WJ!<5:a^A\'3./a)H5ed9t!<)p" +JH,\$rr35;!<<(Ms8RZKrrR`O!;ulr!!E885ed6t!J*N7rrp,%rr<%Mr;Z`r!.k%I"@3"e5X>>K +rW)lr#(ZaSs8P?8rr3"M5lCW^5lL``Jc,QI!!'b4rr]u#JH5]L!%@jHrVuqLrVlqM!.k.L!C4Bt +rrGC9rr3!!Jc>ZVJO"dds+,b$5eau3!!%TIrrI[9qu?Zro)A`A!:Tpf +gA_/*p\t;I!3H/!!/'nC!eUKdZMt/^s8P@b5s^.trrRfQKDkiL!<5=b^&@s2.K'2I6,!t(6+su2!!%ZKrrIa +gA_/2p&G#ms8N(OoD\k@!/%TW$%o<.!3H3QKE&%KrrRfQ.K0;G!<<*!KDtlPX=;]urrIaMrW)os +"G6[S.Fn@r$`o!\s/],Ks8R]O!;ulr!<<'"ePcDH"+sK#ec,ROePZAIKDbcK!!+NHrVlmI!<3!# +eZAfNrW)lr!`B!urr34UXT/s&,rueUo=M!!%ZKrrI`Pqu6[G;Y'hg;?64d!NZ:irr<&hrr>sc +rr@]0s8R`:rrI`Pqu6\L!:0XbKCAj?KA-?U~> +gA_/4p&G#ks8N(MoD\k?!.hHU$%]*)!36'MJcDbGrrR`O./j2F!<<*!Jc>ZNW[QHsrrI[NrW)os +"G$OQ.+\=r$`\dXs/K)Ms8RWM!;ulr!<<'"elD_L"+aH#f)G[Pel;\MJc,QI!!+KJrVlmH!<3!# +euJcMrW)lr!`]4#rr34SWrN*MJcC<"rrZ7$!.k(Jrr<+?O +rVlktr;Qq?f)PaMJc>]LJI);8s&H*!eq#7K!!%TIrrIZNqu6[F +gA_/2p&G#ms8N(OoD\k@!/%TW$%o<.!3H3QKE&%KrrRfQ.K0;G!<<*!KDtlPX=;]urrIaMrW)os +"G6[S.Fn@r$`o!\s/],Ks8R]O!;ulr!<<'"ePcDH"+sK#ec,ROePZAIKDbcK!!+NHrVlmI!<3!# +eZAfNrW)lr!`B!urr34UXT/s&,rueUo=M!!%ZKrrI`Pqu6[G;Y'hg;?64d!NZ:irr<&hrr>sc +rr@]0s8R`:rrI`Pqu6\L!:0XbKCAj?KA-?U~> +gA_/*nG`K@oDegj!/%TW$%i3X^&S+bKE$T"rrRfQ!<)rs!"+AYs1O'bs/c5dKDkfMKDklLrrn#T +!'roarVlnN62gfeKE(t(!!)rsrW)fp"9AK%6%f.9rr<%Or;Z`r!keSdrVllu^&7m1ec#RHs8Duu +^&.j0K*)(d62pldK)bn(r;Zcs"0DMg62gi`62gf`KDbcM^&@s5K)bnbp\t@^KDtq(rr3-fKE(t( +!<)ot62giaKDYZLK)kfKrrDWirr<%Onc&WB!:Tpf!:g'h61=gRKAce0KBiI;K)kfK!eUKSm/I'< +n,NE?gAc[~> +gA_/(nG`K>oDegj!.hHU$%W'V^An4aJcC;srrR`O!<)rs!"+;Ws1X'as/Q)aJc5TKJc5ZJrrmrR +!'if`rVlnL5lL]dJcGb$!!)rsrW)fp"9AK%5_8n6rr<%Mr;Z`r!knYcrVllu^AS!2f)>[Is8Duu +^AIs1JHGkc5lUccJH,\$r;Zcs"02Ad5lL`_5lL]_Jc,QK^A\'6JH,\ap\t@]Jc>_$rr3-eJcGb$ +!<)ot5lL``Jc#HJJH5TIrrDWirr<%Mnc&W@!:Tpf!:g'h5k"^QJ`-S.Ja379JH5TI!eC?Om/I': +n,NE=gAc[~> +gA_/*nG`K@oDegj!/%TW$%i3X^&S+bKE$T"rrRfQ!<)rs!"+AYs1O'bs/c5dKDkfMKDklLrrn#T +!'roarVlnN62gfeKE(t(!!)rsrW)fp"9AK%6%f.9rr<%Or;Z`r!keSdrVllu^&7m1ec#RHs8Duu +^&.j0K*)(d62pldK)bn(r;Zcs"0DMg62gi`62gf`KDbcM^&@s5K)bnbp\t@^KDtq(rr3-fKE(t( +!<)ot62giaKDYZLK)kfKrrDWirr<%Onc&WB!:Tpf!:g'h61=gRKAce0KBiI;K)kfK!eUKSm/I'< +n,NE?gAc[~> +gA_.Nqu6Z0q1J_I!/'nCrr<%OZi:-@!!'_3s8R]Qs+AkurrRfQ!<)rs!!'_0rrc65s$=?ss8E#s +rs")U!/(;;62gfa!58@2s1SC3r;Z`r!58@2!e\/drr2u3rVult!/(4Lrr<-es8OPHs8N'!^&@s2 +.K0>Fs8;otec#LVK)gQ(s1JF4s+::OKDbcL!!B>&s1S@1!PLetrrBb3!!%ZMrrdrS5s`3_rrIa< +rVum`!<@cOrrE*crr3!!KDtlNKDkiNKDYZLK)kfKrrDWirr<%Onc&WB!;lcr^%q[1^&S+bnc&TA +n,EARhu<[BlMgm;62UZ`K)i">rr@]?rrIbcgAc[~> +gA_.Qqu6Z1q18SG!.jbArr<%MZi:-A!!'b4s8RWOs+/btrrR`O!<)rs!!'b1rrc?9s$4UWJH19$s1SL5s+(.MJc,QJ!!B8$s1\F2!PUhtrrBe4!!%TKrrdlQ5X<'^rrI[9 +rVum_!<@]MrrE*brr3!!Jc>ZLJc5WLJc#HJJH5TIrrDWirr<%Mnc&W@!;lcr^A7d2^An4anc&T? +n,EAQhu<[AlMgm95l:Q_JH2_:rr@W=rrI\bgAc[~> +gA_.Nqu6Z0q1J_I!/'nCrr<%OZi:-@!!'_3s8R]Qs+AkurrRfQ!<)rs!!'_0rrc65s$=?ss8E#s +rs")U!/(;;62gfa!58@2s1SC3r;Z`r!58@2!e\/drr2u3rVult!/(4Lrr<-es8OPHs8N'!^&@s2 +.K0>Fs8;otec#LVK)gQ(s1JF4s+::OKDbcL!!B>&s1S@1!PLetrrBb3!!%ZMrrdrS5s`3_rrIa< +rVum`!<@cOrrE*crr3!!KDtlNKDkiNKDYZLK)kfKrrDWirr<%Onc&WB!;lcr^%q[1^&S+bnc&TA +n,EARhu<[BlMgm;62UZ`K)i">rr@]?rrIbcgAc[~> +gA_.Nqu6c35la4KKE(rOKCf*EK)iTlrr^dO!58@2s+:@P^%q^-!<)rs!!#=_rrIa$rr2tNrVuis +rVm+T!!%ZOs$;;:rrTk6^&@s262gl^s8E!!6%f.9!C;A6s8N'!KDbcL!!%ZHrrGF!rr2uKrW)lr +rVutO.K08JK)iU^rr[lR!/(4Lrr<&#q#:AI62gi_!!%ZMrrn#TKE"5irr3%P!($S`!eUK*rr;uu +rr3/86,! +gA_.Qqu6c45QF(IJcG`MJb/mCJH3Ekrr^gP!5AF3s+(4N^A7g.!<)rs!!#:^rrI[!rr2tLrVuis +rVm+R!!%TMs$2/7rrTn7^A\'35lLc]s8E!!5_8n6!C253s8N'!Jc,QJ!!%TFrrGC!rr2uLrW)lr +rVutM./j/IJH3F]rr[fP!.k(Jrr<&!q#:AG5lL`^!!%TKrrmrRJc@udrr3%N!'pM_!eC?&rr;uu +rr3/95ed9uJc5WLJc#HJJH5TIrrDWirr<%Mnc&YU!5AC2!!)kH"@.P +gA_.Nqu6c35la4KKE(rOKCf*EK)iTlrr^dO!58@2s+:@P^%q^-!<)rs!!#=_rrIa$rr2tNrVuis +rVm+T!!%ZOs$;;:rrTk6^&@s262gl^s8E!!6%f.9!C;A6s8N'!KDbcL!!%ZHrrGF!rr2uKrW)lr +rVutO.K08JK)iU^rr[lR!/(4Lrr<&#q#:AI62gi_!!%ZMrrn#TKE"5irr3%P!($S`!eUK*rr;uu +rr3/86,! +k5Pk?5l^n;6%]/iKE(sLq>UN0!/(1Ks+BqC!!'A*!`B!ur;ZeLp\t:\!!)utr;Zg`rVlo3!;ZZo +!<)p"K)bn(q>UN0!58@2rW)lrrW!"P5sbJL!C=Etrrk]@rr<%Or;Zcs!/(%G!58@2rW)lr"[N+g +s/\NbrrRfQ^&A!262pobKDbcL!!#pprrn&TKE(t(rVuis!/(7M"bQf-s8R`Nrr@]N62gfa!/(:N +rr<$bqYpPJrVuqNqu6\L!;lcs!($5V"20>>^%)+(5lcQ8s7q9M6%f4;!:g'hKCAg?KAZ\/KBiI; +K)kfK!eUKSm/I' +k5Pk@5QCe85_/odJcGaMq>UN1!.k%Is+0eA!!'A*!`]4#r;ZeJp\t:[!!)utr;Zg_rVlo4!;ZZo +!<)p"JH,\$q>UN1!5AF3rW)lrrW!"N5X>;J!C4BtrrkZ=rr<%Mr;Zcs!.jnE!5AF3rW)lr"[E%f +s/J?_rrR`O^A\*35lUfaJc,QJ!!$$srrmuRJcGb$rVuis!.k+K"b?Z)s8RZLrr@WL5lL]`!.k.L +rr<$aqYpPHrVuqLqu6\J!;lcs!'p/U"29>;^@D4)5QHB5s7q3K5_8t8!:g'hJa`U=J`$J-Ja379 +JH5TI!eC?Om/I':n,EB=g&HR~> +k5Pk?5l^n;6%]/iKE(sLq>UN0!/(1Ks+BqC!!'A*!`B!ur;ZeLp\t:\!!)utr;Zg`rVlo3!;ZZo +!<)p"K)bn(q>UN0!58@2rW)lrrW!"P5sbJL!C=Etrrk]@rr<%Or;Zcs!/(%G!58@2rW)lr"[N+g +s/\NbrrRfQ^&A!262pobKDbcL!!#pprrn&TKE(t(rVuis!/(7M"bQf-s8R`Nrr@]N62gfa!/(:N +rr<$bqYpPJrVuqNqu6\L!;lcs!($5V"20>>^%)+(5lcQ8s7q9M6%f4;!:g'hKCAg?KAZ\/KBiI; +K)kfK!eUKSm/I' +hu?lrrYOe]`A!1s+C(GrW)osrW!#55sbJL!JA)arrRhds8E#s +rr[lR!/(1Ks1JL6]tOCE!eUIQr;Z`rs8W*brr3%P!58@2"@7Y?!/(4Lr;ZhMrr3!!KDGQH!;uj$ +5l^obs$;;9rrPId^&J$3^&A!3KDbcK!!'_2rrTk6!;c`p!;uiuK)gQ$s8R]Ps1SC2!<@cOrrW6e +K2V[Js1JDbrVuqNqu6\L!;lcs!/&Jp!!)Qh!/'b?!/'2/!/'S:!J:CLrrRfQea3;9KCAg@K>$"= +J,~> +hu;J!J.u`rrRbcs8E#s +rr[fP!.k%Is1SR7^:sRG!eC=Or;Z`rs8W*arr3%N!5AF3"@.Mn!!)Qh!.jV=!.j&-!.jG8!J(7JrrR`Of'ND:Ja`U>J\Kk< +J,~> +hu?lrrYOe]`A!1s+C(GrW)osrW!#55sbJL!JA)arrRhds8E#s +rr[lR!/(1Ks1JL6]tOCE!eUIQr;Z`rs8W*brr3%P!58@2"@7Y?!/(4Lr;ZhMrr3!!KDGQH!;uj$ +5l^obs$;;9rrPId^&J$3^&A!3KDbcK!!'_2rrTk6!;c`p!;uiuK)gQ$s8R]Ps1SC2!<@cOrrW6e +K2V[Js1JDbrVuqNqu6\L!;lcs!/&Jp!!)Qh!/'b?!/'2/!/'S:!J:CLrrRfQea3;9KCAg@K>$"= +J,~> +i;Wh162gf`;YU1mK0e&drr@]Brr<&,rrbUf!<3&ss8R]Ps1S7.!^QedrVuiss8N*cKDtlPX8os4 +rrGE +i;Wh/5lL]_ZNWW9d3 +rrGB9rW)os!.k+L!5AF3!`_L:qYpVJ!!)rsrW)rt!.k.Ls+(1N^A\'65QCe8r;Z]q!.k.L!knY" +rVlp!^An04r;Z`rqZ$SH!PX-`rr[fP!.k(Jrr<+O5X>;J!PSR4rrRcOs8Duu^A\'5JH19!rrToc +Jc#HJ!.k.L!<@]Mrrdnes8P@_!!%TIrrIZNqu6ZsJ]n&n!:g'h5k"^QJ]IckJO',4!J(7:rr@W= +rrI\bgAc[~> +i;Wh162gf`;YU1mK0e&drr@]Brr<&,rrbUf!<3&ss8R]Ps1S7.!^QedrVuiss8N*cKDtlPX8os4 +rrGE +iVrq262^`_;Yg=o]g9@/rr@]Brr<&-rr>@a!!3*"r;ZeL!rmo'qYpU_!!)utrW)rt!/(:N"4`#( +^&@s262gl_rrn#T!'ro'rr3&M!/(7M"bXMgK)boLs8E#prr>@\s8N'!KDbcL!!@ke!7h)K!keTI +rr3&56.Pr7r;Z`r!58@2"24_e^&.g3K)bn(r;Zcs"0DMg62gfa6%f1:!kgmPrVur3rVlqO!!)rs +!^Qg=rr3*e^&J(brr30&KE(t(!/(:N!($Sa!/(1K!J:CLrrE+PbPqPBnc&TAn,EB?hu<\ilMpm: +qu6\L!:0XbKCAj?KA-?U~> +iVrq05lCW^=`!!3*"r;ZeJ!rmi&qYpU^!!)utrW)rt!.k.L"4i#' +^A\'35lLc^rrmrR!'if#rr3&N!.k+K"bFDfJH,]Js8E#prr>=[s8N'!Jc,QJ!!@ed!7q/L!knZK +rr3&65h>o7r;Z`r!5AF3"2=ed^AIp4JH,\$r;Zcs"02Ad5lL]`5_8q7!kppNrVur4rVlqM!!)rs +!^Ha:rr3*d^Ae1arr30&JcGb$!.k.L!'pM`!.k%I!J(7JrrE+NbPqPBnc&T?n,EB=hu<\jlMpm8 +qu6\J!:0XbJa`X=J_L-S~> +iVrq262^`_;Yg=o]g9@/rr@]Brr<&-rr>@a!!3*"r;ZeL!rmo'qYpU_!!)utrW)rt!/(:N"4`#( +^&@s262gl_rrn#T!'ro'rr3&M!/(7M"bXMgK)boLs8E#prr>@\s8N'!KDbcL!!@ke!7h)K!keTI +rr3&56.Pr7r;Z`r!58@2"24_e^&.g3K)bn(r;Zcs"0DMg62gfa6%f1:!kgmPrVur3rVlqO!!)rs +!^Qg=rr3*e^&J(brr30&KE(t(!/(:N!($Sa!/(1K!J:CLrrE+PbPqPBnc&TAn,EB?hu<\ilMpm: +qu6\L!:0XbKCAj?KA-?U~> +ir9$F^&.g0;Z$Iq]`8'1K*/ges+BnB!("*o#!i5T5lgobr;ZeL!WRfJrrPId!<)rs!;QQo^&.j/ +!<)p%K)bn(s$=?trrTk6^&J$5]n=#t!;ulr!;uiu^&PeAs8N'!KDbcL!!@lR5uR[]!eWePrr3#4 +.K0>FrrdrS!(#07rrRg=62gffKE(t(!!%ZLs8N'$XT/$"=J,~> +ir9$E^AIp1ZM!'pP`!<@]Mrr@WL!!%TIs8RZIrrE+NbPqQnnc&T?n,EAQhu<\-lMpm8qu6\J +!:0[bJai[?J\Kk +ir9$F^&.g0;Z$Iq]`8'1K*/ges+BnB!("*o#!i5T5lgobr;ZeL!WRfJrrPId!<)rs!;QQo^&.j/ +!<)p%K)bn(s$=?trrTk6^&J$5]n=#t!;ulr!;uiu^&PeAs8N'!KDbcL!!@lR5uR[]!eWePrr3#4 +.K0>FrrdrS!(#07rrRg=62gffKE(t(!!%ZLs8N'$XT/$"=J,~> +jSo7o62CN\;Yg@iK*/ges+BnB!!'P/#=/>Us+:=O!;ulsK)u")q>UL^!!)utrVuqNr;Qa_q#C@ +jSo7p5l(E[e%q>UL]!!)utrVuqLr;Qa^q#CZM^&\04!.k+L!.k%Is+1(I!<@]&rrBe/Jc>ZL!:g'hJa`U=5i;SAJa3:8Jc#HJJH5$9 +!J.uSrr>=;s*t~> +jSo7o62CN\;Yg@iK*/ges+BnB!!'P/#=/>Us+:=O!;ulsK)u")q>UL^!!)utrVuqNr;Qa_q#C@ +jo5C7!/(7Ms1SI4!)i=d!/'kB!/%i^#_N+Cs8R]OrrDuss+:@PKDGNKK)boMs8;ot^&@s3]i+h/ +!/(:NrW)os"+pRRKDGQI^&@s2^&A$0s8E!"K)iUarrKf!r;Qpd^&J'4KDbcL!<.WCs8E#rs8E!" +s+A#`s8PC`s8IZN!!%ZLs8N'!;Z-Or^&N`]s8E#rrrn#TKE(s;rr3%P6%f+8!<@cOrrPId^&@s5 +^&S+brVuqNqu?\Kqu6ZsK@g,)]`8'0KDtlN!:g'hKCAg?KAZ\/KBiI;K0fD7!eUKSm/I' +jo5C5!.k+Ks1\O5!*/Og!.j_@!.h]\#_;t@s8RWMrrDuss+(4NJbfZL!:g'hJa`U=J`$J-Ja379JO',4!eC?Om/I':n,EE> +^=rU;~> +jo5C7!/(7Ms1SI4!)i=d!/'kB!/%i^#_N+Cs8R]OrrDuss+:@PKDGNKK)boMs8;ot^&@s3]i+h/ +!/(:NrW)os"+pRRKDGQI^&@s2^&A$0s8E!"K)iUarrKf!r;Qpd^&J'4KDbcL!<.WCs8E#rs8E!" +s+A#`s8PC`s8IZN!!%ZLs8N'!;Z-Or^&N`]s8E#rrrn#TKE(s;rr3%P6%f+8!<@cOrrPId^&@s5 +^&S+brVuqNqu?\Kqu6ZsK@g,)]`8'0KDtlN!:g'hKCAg?KAZ\/KBiI;K0fD7!eUKSm/I' +k5PG3pk/VH!)i=d!JA)Wrr@\_rrPId62pldK)koOr;ZeL!WRfJrrRfQ!<)rs!<5=b^&@s3.D>`\ +"2."6s8E#srr[lR!/(1Ks1S:/!^Qedr;Z`r"96&#^&J'362^`c6%].;KDbcK!!,B +k5PG4pjrJF!*/Og!J.uVrr@V]rrPFc5lUccJH5]Mr;ZeJ!WR`HrrR`O!<)rs!<5:a^A\'4.),]\ +"27%7s8E#srr[fP!.k%Is1\@0!^H_cr;Z`r"96)#^Ae045lCWb5_/n8Jc,QI!!,?9rr3$bs1\L4 +!5AI4rW)lrrW)uu!C4BurrR`O5lL]_5lL``Jc,QI!!'b3s8P=a!<2uuJc>]K!!%TKrrR`OJc#KI +Jc#HJ!.k.Lrr<'bJc5TM^Aic`!!%TIs8RZIrrE*bec,]%5ed*p!!)or!5AI4s1\I3!.jV=!'oHA +!.jG8!J*N5rrR`Of'ND:Ja`X=J_L-S~> +k5PG3pk/VH!)i=d!JA)Wrr@\_rrPId62pldK)koOr;ZeL!WRfJrrRfQ!<)rs!<5=b^&@s3.D>`\ +"2."6s8E#srr[lR!/(1Ks1S:/!^Qedr;Z`r"96&#^&J'362^`c6%].;KDbcK!!,B +gA_.Nqu7,U;M2'P.O!/(7M"+pUR!;ulsK)u")q>ULo!!)utrW)uu +!E+RLrrT8%KDtlPeUpd!!<)p#K)bm#KDkfOF")b@rs#RTs8R]O!;ulr!<2uuXT&5%;M.lKrr3,O +;?-]Lr;Z]q!)igr!n@:'rr3)N;UtgH!;ulr!;c`qK)i"NrrZ.!!/(4Lrr<*u.>.U!#_N--s8V4Z +ec5UK!3H/!!eUJ%r;R,*;M5#L`RY"g!/(:N"TX2T`W*%=rrK2MrVuqNqu6\L;Z$Ip!)h>H!nDpE +qu6Wrr;R.GX=7%FXK5=Ms8Q!crr=M*s8R`;rrIa$qu6_M!6+=)!JAqlrr@])s*t~> +gA_.Qqu7,Ve%q>ULr!!)utrW)uu +!EF^MrrT2#Jc>ZNeq$j#!<)p#JH,ZuJc5TME@?D;rs#LSs8RWM!;ulr!<2uuWrE##"r;R,( +gA_.Nqu7,U;M2'P.O!/(7M"+pUR!;ulsK)u")q>ULo!!)utrW)uu +!E+RLrrT8%KDtlPeUpd!!<)p#K)bm#KDkfOF")b@rs#RTs8R]O!;ulr!<2uuXT&5%;M.lKrr3,O +;?-]Lr;Z]q!)igr!n@:'rr3)N;UtgH!;ulr!;c`qK)i"NrrZ.!!/(4Lrr<*u.>.U!#_N--s8V4Z +ec5UK!3H/!!eUJ%r;R,*;M5#L`RY"g!/(:N"TX2T`W*%=rrK2MrVuqNqu6\L;Z$Ip!)h>H!nDpE +qu6Wrr;R.GX=7%FXK5=Ms8Q!crr=M*s8R`;rrIa$qu6_M!6+=)!JAqlrr@])s*t~> +gA_.NqYp^b^&S+bec,RMK)boDs8N'!K>.?f]`8&Gr;QkO!<3&ss8R]Ps+C.I!eUIQrVuisq>UN0 +K>%6`!58@3rVm%R!!#<;62gfa6%f.9"[Tj%K)boLs8E#prr<&ps8N'!KDbcL!!@ke!/(:N!keTI +rVlmaXSr4ts8DuuKDkfO^&N`]rr[lR!/(4Lrrrr@]?rr@])s*t~> +gA_.QqYp^a^An4af)G[NJH,]Bs8N'!J\M-d^&S/Ir;QkM!<3&ss8RWNs+1"G!eC=OrVuisq>UN1 +J\M*_!5AF4rVm%P!!#985lL]`5_8n6"[Kg%JH,]Js8E#prr<&ps8N'!Jc,QJ!!@ed!.k.L!knZK +rVlm`Wr<"rs8DuuJc5TM^Aic\rr[fP!.k(Jrr +gA_.NqYp^b^&S+bec,RMK)boDs8N'!K>.?f]`8&Gr;QkO!<3&ss8R]Ps+C.I!eUIQrVuisq>UN0 +K>%6`!58@3rVm%R!!#<;62gfa6%f.9"[Tj%K)boLs8E#prr<&ps8N'!KDbcL!!@ke!/(:N!keTI +rVlmaXSr4ts8DuuKDkfO^&N`]rr[lR!/(4Lrrrr@]?rr@])s*t~> +gA_.Nq>UR`^&N`8rr3%P!!)Zkrr<%O^]+DL!!%ZKrr[lRrrDuss+:@PKDGNKK)boMs8Duu^%24& +!<)p%K)bn(s1L_trrRfQKDkfN6%f.:r;Z`r!58@2!kj3dq>^Eor;Zcs",$V>KDtlQ]`8&GrVljH +rW)lrr;ZiJrr3&55lgl`#(usUK)bn(r;Zcs!3H%s!W[kdrVll2rW)lr!C6_b62gfb]g9@2rr[m> +!/(:N!<@cOs8PCarr@]N!!%ZKrrIa$dS!/&u)J,~> +gA_.Qq>UR_^Aic8rr3%N!!)Zkrr<%M^]+DM!!%TIrr[fPrrDuss+(4NJbf^Eor;Zcs"+gJ;Jc>ZO^&S/IrVljG +rW)lrr;ZiKrr3&65QLc_#(cgSJH,\$r;Zcs!35nq!W[ecrVll3rW)lr!C-Ya5lL]a^-KF3rr[g; +!.k.L!<@]Ms8P@`rr@WL!!%TIrrI[9qu6ZsJ_'i'^-FrtqYpNqr;Ql!s8RZKrrW9$s+0Y=!!(mU +!.jJ9!C-Y^rrR`OWpK`dJ\LXR!.ii'J,~> +gA_.Nq>UR`^&N`8rr3%P!!)Zkrr<%O^]+DL!!%ZKrr[lRrrDuss+:@PKDGNKK)boMs8Duu^%24& +!<)p%K)bn(s1L_trrRfQKDkfN6%f.:r;Z`r!58@2!kj3dq>^Eor;Zcs",$V>KDtlQ]`8&GrVljH +rW)lrr;ZiJrr3&55lgl`#(usUK)bn(r;Zcs!3H%s!W[kdrVll2rW)lr!C6_b62gfb]g9@2rr[m> +!/(:N!<@cOs8PCarr@]N!!%ZKrrIa$dS!/&u)J,~> +k5PI`62cE?s+>qiKE"jErrTl"!;uls!;-9m5lcPQrrBb3!!%ZKrr[lRrrDuss+:@PKDGNKK)boM +s8Duu62gfa]g;Sr!58C3rW)os%>+W\KE(t(^&S+b5s^/%rr>@a!;ulq!!%ZMrrGCcrVm(S63$rb +!/(4Lrr<+Qs+C7L!e\1=rVllJrW)lrrVutO;Z6Us]`<]`rrjkOK)bn(r;Zcs!3H%s!!)lqrVur3 +rVult",$V>62gfa]`A$2!keSdrr3!!62plfK)iUbs+C:N!/(1Ks+C4K!<@c(rrPId!<.WM^&J$3 +!;uj!;ZHb_rr3,763$t;n,EB?hZ!S.li.!s8R`@rr<&Ps*t~> +k5PI^5lH6=`!;ulq!!%TKrrG@brVm(Q5l^ia +!.k(Jrr<+Os+1+J!eJ(:rVllKrW)lrrVutMrr<&Ps*t~> +k5PI`62cE?s+>qiKE"jErrTl"!;uls!;-9m5lcPQrrBb3!!%ZKrr[lRrrDuss+:@PKDGNKK)boM +s8Duu62gfa]g;Sr!58C3rW)os%>+W\KE(t(^&S+b5s^/%rr>@a!;ulq!!%ZMrrGCcrVm(S63$rb +!/(4Lrr<+Qs+C7L!e\1=rVllJrW)lrrVutO;Z6Us]`<]`rrjkOK)bn(r;Zcs!3H%s!!)lqrVur3 +rVult",$V>62gfa]`A$2!keSdrr3!!62plfK)iUbs+C:N!/(1Ks+C4K!<@c(rrPId!<.WM^&J$3 +!;uj!;ZHb_rr3,763$t;n,EB?hZ!S.li.!s8R`@rr<&Ps*t~> +k5PI`62H39!/(;Lp\t9-!;uls!;-9lK)i^e"ks8E#srr[lR!/(1Ks+C1J!^Qedr;Z`r!rkPPrVlluKDkfR]g;Yu!/(4LrrE%N +rVlo3KDPWI!;ulr!!E8O!58C3!J<]:rrpq=5l^n;r;Zcs!)iap!^Zhdrr2uKrr;rt!/(7M!eUK* +oD\gkKDtoN!!>O;rrE#t!/(7N!/(1K!J:CLrrE+Pf)Gc'^&*H]rr<&srsMa)K)e4;s+A#b]n>eR +!/'/.!/'V;!J<]8rrRfQXR,rfK>$dS!!(^PJ,~> +k5PI^5l-$6!.k/Mp\t9.!;uls!;-9lJH3Lc"kEYR5QHB4rr[fPrrDuss+(4NJbf]L!!>L;rrE#t!.k+L!.k%I!J(7JrrE+Nf)Gc%^AEK\rr<&srsMj,JH.t8s+.oa^4GbQ +!.j#,!.jJ9!J*N5rrR`OWpK`dJ\LXR!!(^PJ,~> +k5PI`62H39!/(;Lp\t9-!;uls!;-9lK)i^e"ks8E#srr[lR!/(1Ks+C1J!^Qedr;Z`r!rkPPrVlluKDkfR]g;Yu!/(4LrrE%N +rVlo3KDPWI!;ulr!!E8O!58C3!J<]:rrpq=5l^n;r;Zcs!)iap!^Zhdrr2uKrr;rt!/(7M!eUK* +oD\gkKDtoN!!>O;rrE#t!/(7N!/(1K!J:CLrrE+Pf)Gc'^&*H]rr<&srsMa)K)e4;s+A#b]n>eR +!/'/.!/'V;!J<]8rrRfQXR,rfK>$dS!!(^PJ,~> +k5PG3q>^K.!WQ'errE+Po`"rE!5SU<.0.&6!/(1K"+pUR!;ulsK)u")q>UL^!!)utrW!$"K0fJ9 +s+C:Ms$6XurW)os"+pRRKDb`NXFl0%s8E#rs8E#us8PCarrRfQ62gf`^&A!3KDbcJ!!%ZNs8P@b +KDtoN^&S-3!;ulr!<<*!^&J$5K)e49rrBb3!!%ZLs8Duu62gfb]`8'3s8R`Os8E#rrrRfQKCf*D +!/(:N$35^l;Z?ass+rr@]?rr<&Ps*t~> +k5PG4q>^K/!WQ0hrrE+No`"rC!5SU<-igu4!.k%I"+^IP!;ulsJH>e%q>UL]!!)utrW!$"JO'26 +s+1.Ks$-RurW)os"+^FPJc,NLWe#`ts8E#rs8E#us8P@`rrR`O5lL]_^A\*4Jc,QH!!%TLs8P=a +Jc>]L^An64!;ulr!<<*!^Ae-6JH.t6rrBe4!!%TJs8Duu5lL]a^&S04s8RZMs8E#rrrR`OJb/mB +!.k.L$35Xk +k5PG3q>^K.!WQ'errE+Po`"rE!5SU<.0.&6!/(1K"+pUR!;ulsK)u")q>UL^!!)utrW!$"K0fJ9 +s+C:Ms$6XurW)os"+pRRKDb`NXFl0%s8E#rs8E#us8PCarrRfQ62gf`^&A!3KDbcJ!!%ZNs8P@b +KDtoN^&S-3!;ulr!<<*!^&J$5K)e49rrBb3!!%ZLs8Duu62gfb]`8'3s8R`Os8E#rrrRfQKCf*D +!/(:N$35^l;Z?ass+rr@]?rr<&Ps*t~> +gA_.NnG`MTKCo0EK)idg#JED'^&N]bKDYZNK)koOr;ZeL!WRfJs8E#ss8E!#^&N^Nrr3&$!/(7M +!/(4MrVlkMrVur3rVlqO6%f1:s1SI4!eUIQr;Z`rrr2tNrr3$c]n?7_"+pRR62^c_!<,:_rrGE< +rVlpb^&S'3r;Z`rqZ$SJqu6bN!!%ZLs8N'#X?hL;rrTk6^&J'3K)krN!;uiuK)e48rr@]Mrrprd +s8N(Orr3!!KDtlN!<2uu^&7p2KDYZLK0fD7!<@c$rrg"a6%clMrr<&hrr@]?rr<&Urr@];s8R`K +rrRfQXR,reKCAg?!87C&~> +gA_.QnG`MSJb8sCJH3Re#JNG'^Ai`aJc#HLJH5]Mr;ZeJ!WR`Hs8E#ss8E!#^AiaLrr3&"!.k+K +!.k(KrVlkKrVur4rVlqM5_8q7s1\O5!eC=Or;Z`rrr2tLrr3$b^4H4^"+^FP5lCZ^!<,7^rrGB9 +rVlpa^An04r;Z`rqZ$SHqu6bL!!%TJs8N'#W^).6rrTn7^Ae04JH5`L!;uiuJH.t5rr@WKrrpuf +s8N(Mrr3!!Jc>ZL!<2uu^AS$3Jc#HJJO',4!<@]"rrg%a5_6ZKrr<&hrr@W=rr<&Urr@W9s8RZI +rrR`OWpK`cJa`U=!87C&~> +gA_.NnG`MTKCo0EK)idg#JED'^&N]bKDYZNK)koOr;ZeL!WRfJs8E#ss8E!#^&N^Nrr3&$!/(7M +!/(4MrVlkMrVur3rVlqO6%f1:s1SI4!eUIQr;Z`rrr2tNrr3$c]n?7_"+pRR62^c_!<,:_rrGE< +rVlpb^&S'3r;Z`rqZ$SJqu6bN!!%ZLs8N'#X?hL;rrTk6^&J'3K)krN!;uiuK)e48rr@]Mrrprd +s8N(Orr3!!KDtlN!<2uu^&7p2KDYZLK0fD7!<@c$rrg"a6%clMrr<&hrr@]?rr<&Urr@];s8R`K +rrRfQXR,reKCAg?!87C&~> +gA_.Nnc&ZC!!)kJrr3\GK7cGi^&S,6s8Te4s1SGb]tOHIre(6a"G=Dfs1SDa#JL.iKE&W;^&J$3 +ea*5?5lag_s+:;;qu6eO!<3&4rVum`!J:CMK*)(*62gl_s8E#trrBb3rrT;%62^`_^&A$1rrRfQ +!<,:_rrGEFarrIa +rr<&frr<&Ps*t~> +gA_.Qnc&ZA!!)kHrr3\HJUp&d^An55s8Th5s1\Ma^:sWIrdk*`"G+;es1\J`#JU4hJcEH8^Ae-4 +f'E>@5QFgas+(/8qu6eM!<3&5rVum_!J(7KJHGk&5lLc^s8E#trrBe4rrT5#5lCW^^A\-2rrR`O +!<,7^rrGB9rVm$d^Ai`a!;ulr!;c]q!;ZZp!!#:^s8N*!JH5b%rVllu^A\'45cXe`r;Z`r!5AF3 +"2=ed^AIp4JH,\$rVm)9!!'&!5ed3s!<>C`rrI[9rW)lr"$chd^A\'4JO'26"@.PAniJaEF:Jc#HKJH2_: +rr<&frr<&Ps*t~> +gA_.Nnc&ZC!!)kJrr3\GK7cGi^&S,6s8Te4s1SGb]tOHIre(6a"G=Dfs1SDa#JL.iKE&W;^&J$3 +ea*5?5lag_s+:;;qu6eO!<3&4rVum`!J:CMK*)(*62gl_s8E#trrBb3rrT;%62^`_^&A$1rrRfQ +!<,:_rrGEFarrIa +rr<&frr<&Ps*t~> +gA_.Nnc/WA!<<"M!588^!58>`!579B!($U:!E&psK)ksFs8;otec,RM +K)boMrrtdhs+::OKDkfSK)bnQs8R`MrrN0dKDkfMKDkiNKDkfMKDkiNKDkfNK0fJ9"$lneKDtlO +!/(:N!<@cOrr@]N!!%ZKrrIa +gA_.Qnc/W?!<<"K!5A>]!5AD_!5@?A!'pO7!EB.!JH5a9b5hM@rW)fp!35kprW)os#(ZaSJc@u# +rr3%N!5AF3!C258!;ulr!!'b3rrTq7!;ZZp!!#:^s8N*!JH8"arVllu5lCW^./j5Es8;otf)G[N +JH,]Krrtags+(.MJc5TQJH,\Ms8RZKrrN0cJc5TKJc5WLJc5TKJc5WLJc5TLJO'26"$chdJc>ZM +!.k.L!<@]Mrr@WL!!%TIrrI[9qu6ZsJ_:#&JcG`M5lL`_JcG`M!:g'hJa`U=J_pG,JaEC;5_8h4 +!eC@&m/I%cn,ECg^=rU;~> +gA_.Nnc/WA!<<"M!588^!58>`!579B!($U:!E&psK)ksFs8;otec,RM +K)boMrrtdhs+::OKDkfSK)bnQs8R`MrrN0dKDkfMKDkiNKDkfMKDkiNKDkfNK0fJ9"$lneKDtlO +!/(:N!<@cOrr@]N!!%ZKrrIa +jo>+.s8N'sUAk:I!/(7M!eUK*qu6bN!<3&ursM*m6%f2'!58F4]g;Ss!($S`rVuparVlr4K7j"" +rW)os%>+W\KE(s;KE(t(!!'_2rr>@a!;ulq!!'_3rrTk6!<)p%6%f4;!!%ZLs8N*!K)iU_rrPL" +KDkfMec#RHs8E!!K.6d!!C6_ars$/hs+::OKDkfPK)bnQqYpO]qZ$Np!/(7M"[N-@s$8sMrrRfQ +62gfbK)gQ'rrE*crr;uurr2tNrVuqNqu?\Kqu6ZsK@p5(KE(rOKDkiM^&S*4!:g'hKCAg?KAHP- +KC&X +jo>+,s8N(!UAk:G!.k+K!eC?&qu6bL!<3&ursM'l5_8r#!5AL5^-MVs!'pM_rVup`rVlr5JV!Xs +rW)os%=nKZJcGa8JcGb$!!'b3rr>=`!;ulq!!'b4rrTn7!<)p%5_8t8!!%TJs8N*!JH3F^rrPI" +Jc5TKf)>[Is8E!!JLLKs!C-Y`rs$2gs+(.MJc5TNJH,\MqYpO\qZ$Np!.k+K"[E'=s$/jKrrR`O +5lL]aJH19#rrE*brr;uurr2tLrVuqLqu?\Iqu6ZsJ_:#&JcG`MJc5WK^An35!:g'hJa`U=J_g>+ +JaEF:Jc#HJJH5ED$\A?X^-I7#5ed9u!:Tpf!87C&~> +jo>+.s8N'sUAk:I!/(7M!eUK*qu6bN!<3&ursM*m6%f2'!58F4]g;Ss!($S`rVuparVlr4K7j"" +rW)os%>+W\KE(s;KE(t(!!'_2rr>@a!;ulq!!'_3rrTk6!<)p%6%f4;!!%ZLs8N*!K)iU_rrPL" +KDkfMec#RHs8E!!K.6d!!C6_ars$/hs+::OKDkfPK)bnQqYpO]qZ$Np!/(7M"[N-@s$8sMrrRfQ +62gfbK)gQ'rrE*crr;uurr2tNrVuqNqu?\Kqu6ZsK@p5(KE(rOKDkiM^&S*4!:g'hKCAg?KAHP- +KC&X +jo5F8!'u86rr>rkrrE*cr;QhN!/(1K#_N-WKE(tb!!*#u!eVr8rVlkMrVuqNrVufr!($S`!C6_a +rrYR#s8W&urVltP!!%ZKs8R`O^&7m35l^o`rrBb3!!9i"KDtlP]`>bFrs$/&^&J'4KDbcL!!,@c +r;Qf2KDPWI!;ulr!!<1Q62gfa!($S`"bXKS!!%ZMrr[lR!)iap!e^LQqZ$Npr;Zcs",$WeKDtlP +K0b.frrE+Prr;uu"G?aS!58C3!/(7N!/(1Ks+C4K!<@c)rr@]Nrr<&ts8R`Orr<&hrr@]KrrBb2 +rrTldKDkfM^"r\gKC&X +jo5F6!'l,3rr?&nrrE*br;QhL!.k%I#_ZN^&YnHrs$2&^Ae05Jc,QJ!!,=b +r;Qf3JboEG!;ulr!!<1O5lL]`!'pM_"bFBQ!!%TKrr[fP!*/ss!eL@OqZ$Npr;Zcs"+gKdJc>ZN +JO"earrE+Nrr;uu"G-UQ!5AI4!.k+L!.k%Is+1(I!<@]'rr@WLrr<&ts8RZMrr<&hrr@WIrrBe3 +rrTocJc5TK^>8ehJaEF:Jc#HKJH49qrsODXs+.oas1X'as$6&Q!!(^PJ,~> +jo5F8!'u86rr>rkrrE*cr;QhN!/(1K#_N-WKE(tb!!*#u!eVr8rVlkMrVuqNrVufr!($S`!C6_a +rrYR#s8W&urVltP!!%ZKs8R`O^&7m35l^o`rrBb3!!9i"KDtlP]`>bFrs$/&^&J'4KDbcL!!,@c +r;Qf2KDPWI!;ulr!!<1Q62gfa!($S`"bXKS!!%ZMrr[lR!)iap!e^LQqZ$Npr;Zcs",$WeKDtlP +K0b.frrE+Prr;uu"G?aS!58C3!/(7N!/(1Ks+C4K!<@c)rr@]Nrr<&ts8R`Orr<&hrr@]KrrBb2 +rrTldKDkfM^"r\gKC&X +j8T1o6,!0q!)fQk!<@cMrrRfQKDYZYK)kq(s+::O6%f4;KE&X_rr>@a!<)rs!!<0d62gfa.D>`\ +"2."6s8E#srr[lR!/(1Ks+C1J!eUIQrVll2rW!$"]`A$2!J:CMs8PCb!!%ZLs8;otKDtoN5lcQ6 +s8E#rs8E#urr@]MrrPId62gf`KDkiNKDkfMKDkiN^&@s45l^oarrZ04s8W&u!58@2rr<%Oqu?\K +qu6ZsKDtlX!'rp$rrE*!]tK't!!%ZKrrI`Pqu6ZsK@p5(KE(rO!<)p#K>% +j8T1p5ed-q!*,cn!<@]KrrR`OJc#HWJH5_$s+(.M5_8t8JcEI^rr>=`!<)rs!!<0c5lL]`.),]\ +"27%7s8E#srr[fP!.k%Is+1%H!eC=OrVll3rW!$"^&\-3!J(7Ks8P@a!!%TJs8;otJc>]L5QHB3 +s8E#rs8E#urr@WKrrPFc5lL]_Jc5WLJc5TKJc5WL^A\'55QCf`rrZ98s8W&u!5AF3rr<%Mqu?\I +qu6ZsJc>ZV!'ig#rrE*!^:o0t!!%TIrrIZNqu6ZsJ_:#&JcG`M!<)p#J\M0a!;6BlJcG`MJc#KI +JcG`Q^4F"u5hZ/;5j\ONJc#HKJH49qrr[iPs+1.K"$lndJa`U=!87C&~> +j8T1o6,!0q!)fQk!<@cMrrRfQKDYZYK)kq(s+::O6%f4;KE&X_rr>@a!<)rs!!<0d62gfa.D>`\ +"2."6s8E#srr[lR!/(1Ks+C1J!eUIQrVll2rW!$"]`A$2!J:CMs8PCb!!%ZLs8;otKDtoN5lcQ6 +s8E#rs8E#urr@]MrrPId62gf`KDkiNKDkfMKDkiN^&@s45l^oarrZ04s8W&u!58@2rr<%Oqu?\K +qu6ZsKDtlX!'rp$rrE*!]tK't!!%ZKrrI`Pqu6ZsK@p5(KE(rO!<)p#K>% +ir9(n6%f+8!)fQk!<@cMrrRfQKDYZ[K2V`%5l^nus$8sNKE(s;^&J$6K)bn(rVuiss8N(OrVlr# +!58@2!C;A;!<)p"K)bm;r;Qgr6%f1:s1SI4!eUIQr;Z`rqYpVL5lgi_"$lneKDbcJ!!%ZNrrTk6 +KDtlQ]g;\urW)lrrW)fp!^Zj=r;QkO!!%ZMrrdrS!%C53rrGCcrVlp!s8W&u!58@2rr<%Oqu?\K +s8N)Lrr3!!KDtlS!/(=%rrE&u!($P`!/(1K!J:CLrrE+Pf`1u(s8N'!rVlitrr2sanc&TAqu6eO +^&S*urr3*e^&S+bh>[J-m/R* +ir9(o5_8k5!*,cn!<@]KrrR`OJc#HYJQ;`$5QCeus$/jLJcGa8^Ae-7JH,\$rVuiss8N(MrVlr! +!5AF3!C258!<)p"JH,[8r;Qgu5_8q7s1\O5!eC=Or;Z`rqYpVJ5QL`^"$chdJc,QH!!%TLrrTn7 +Jc>ZO^-M_urW)lrrW)fp!^Qd:r;QkM!!%TKrrdlQ!%:,1rrG@brVlp!s8W&u!5AF3rr<%Mqu?\I +s8N)Mrr3!!Jc>ZQ!.k1$rrE&u!'pJ_!.k%I!J(7JrrE+Nf`1u&s8N'!rVlitrr2s`nc&T?qu6eM +^An3urr3*d^An4ah>[J+m/R*:qu6\J!;?EpJcGb$rVlsbs8RZ=rr<&Ps*t~> +ir9(n6%f+8!)fQk!<@cMrrRfQKDYZ[K2V`%5l^nus$8sNKE(s;^&J$6K)bn(rVuiss8N(OrVlr# +!58@2!C;A;!<)p"K)bm;r;Qgr6%f1:s1SI4!eUIQr;Z`rqYpVL5lgi_"$lneKDbcJ!!%ZNrrTk6 +KDtlQ]g;\urW)lrrW)fp!^Zj=r;QkO!!%ZMrrdrS!%C53rrGCcrVlp!s8W&u!58@2rr<%Oqu?\K +s8N)Lrr3!!KDtlS!/(=%rrE&u!($P`!/(1K!J:CLrrE+Pf`1u(s8N'!rVlitrr2sanc&TAqu6eO +^&S*urr3*e^&S+bh>[J-m/R* +ir9(];M4oI!)fQk!<@cMrrRfQKDYZQK)kpL!!(RKs8R]Z;ZHdIK7j4(K)bmLrVuisqZ$Ss!)iap +!/(7NrVm%R!!"HGXT&5$jsbr]rrl;Qs+::Or;Z`rrVltXec,XFs8N'!KDbcL!!7dN!<)p!X=;^! +rrU_"`Vol8s8DuuXT&5%eUuC$qYpYM!!%ZMrroJ(!3H4Nr;QctKDkfNK2V[K!7h&J"+pRRXSr/+ +K)gQ(s5kb_rr@]NrrrIUs8R]Oec,RK;Z6XrKDYZLK)kfK!<@c)rrB/!;Z?[sXO[=M!!)Ti!S)i" +s8R`Orr>sqrr[oRs+B/-!%I:7s+C4K!eUKSp\t>Js8Q!qrr[oRrrDNf!!(^PJ,~> +ir9([Hs8Q*trr[iPrrDNf!!(^PJ,~> +ir9(];M4oI!)fQk!<@cMrrRfQKDYZQK)kpL!!(RKs8R]Z;ZHdIK7j4(K)bmLrVuisqZ$Ss!)iap +!/(7NrVm%R!!"HGXT&5$jsbr]rrl;Qs+::Or;Z`rrVltXec,XFs8N'!KDbcL!!7dN!<)p!X=;^! +rrU_"`Vol8s8DuuXT&5%eUuC$qYpYM!!%ZMrroJ(!3H4Nr;QctKDkfNK2V[K!7h&J"+pRRXSr/+ +K)gQ(s5kb_rr@]NrrrIUs8R]Oec,RK;Z6XrKDYZLK)kfK!<@c)rrB/!;Z?[sXO[=M!!)Ti!S)i" +s8R`Orr>sqrr[oRs+B/-!%I:7s+C4K!eUKSp\t>Js8Q!qrr[oRrrDNf!!(^PJ,~> +jo5FrK)iU]rr>rkrrE+Pr;QhN!/(1K#(lo.!'u6'r;QeMebf@HKDklLs8Duu^&@s46+sAqs8E#s +rr[lR!/(1K!eUKdrVlo362gl^s8Duu^&J$6eNpkKrVlkMrr;uu!/(4Lrr<+Q6,!6s"+pRRKDkfM +KDklKs8;otec,RM]`8'2rrrIUs+::OKDkfP]`8&6rr2tNrr3$"K>%6`!58@3r;Zcs!e\0PrVlqO +!58C3"2+[7KDtlO!/(:N!<>Fbrr@]N!!%ZKs8R`KrrE+PbPqQ.o)Aa(KDY]KKE(rOKDtlR]n??u +!8[YT!:9^dK0fD7!eUL'p\t +jo5FsJH3F\rr?&nrrE+Nr;QhL!.k%I#(Zc*!'l*#r;QeKf),IIJc5ZJs8Duu^A\'55ea8os8E#s +rr[fP!.k%I!eC?crVlo45lLc]s8Duu^Ae-7ej-qLrVlkKrr;uu!.k(Jrr<+O5ed3s"+^FPJc5TK +Jc5ZIs8;otf)G[N^&S03rrrISs+(.MJc5TN^&S/5rr2tLrr3$"J\M*_!5AF4r;Zcs!eJ'NrVlqM +!5AI4"24a8Jc>ZM!.k.L!<>Carr@WL!!%TIs8RZIrrE+NbPqQ-o)Aa)Jc#KIJcG`MJc>ZP^4H +jo5FrK)iU]rr>rkrrE+Pr;QhN!/(1K#(lo.!'u6'r;QeMebf@HKDklLs8Duu^&@s46+sAqs8E#s +rr[lR!/(1K!eUKdrVlo362gl^s8Duu^&J$6eNpkKrVlkMrr;uu!/(4Lrr<+Q6,!6s"+pRRKDkfM +KDklKs8;otec,RM]`8'2rrrIUs+::OKDkfP]`8&6rr2tNrr3$"K>%6`!58@3r;Zcs!e\0PrVlqO +!58C3"2+[7KDtlO!/(:N!<>Fbrr@]N!!%ZKs8R`KrrE+PbPqQ.o)Aa(KDY]KKE(rOKDtlR]n??u +!8[YT!:9^dK0fD7!eUL'p\t +jo5^U`s8PukrrE+Pr;QhN!/(1K#D3#i!/(+W\KE(tbKE(t(K0d3LrrBb3!;ulq!!'_2rrGCcrVum`s8W*!!/(4LrrE(Os8N3f +^&N_;qu6ZHrW)lrrVutOec#LL]`>bErrl<6K)bn(rVltP!!',"rrg#$^&J*/s8E#rs8N'!KDYZM +K)boMrrTk6KDtoN!!L"8rr<&urr@]N!!%ZKrrGCcqu6ZsK?X>s5leUhrr@]Krrds?s1O'arrbXf +s1L_Srr>@OrrI`Pqu6\L!:0Xb!:Tpf!87C&~> +jo5^U_s8Q)nrrE+Nr;QhL!.k%I#Culh!.k0a5lL]`JLLHr!J*N8!<)rs!!,@!rr3&65UcU2 +!.k.LrW)os%=nKZJcGbaJcGb$JO$sJrrBe4!;ulq!!'b3rrG@brVum_s8W*!!.k(JrrE(Ms8N3e +^Aib8qu6ZIrW)lrrVutMf)>UM^&YnGrrlE:JH,\$rVltN!!'%urrg&$^Ae30s8E#rs8N'!Jc#HK +JH,]KrrTn7Jc>]L!!L%9rr<&urr@WL!!%TIrrG@bqu6ZsJ^",q5QJOhrr@WIrrdm=NrrIZNqu6\J!:0Xb!:Tpf!87C&~> +jo5^U`s8PukrrE+Pr;QhN!/(1K#D3#i!/(+W\KE(tbKE(t(K0d3LrrBb3!;ulq!!'_2rrGCcrVum`s8W*!!/(4LrrE(Os8N3f +^&N_;qu6ZHrW)lrrVutOec#LL]`>bErrl<6K)bn(rVltP!!',"rrg#$^&J*/s8E#rs8N'!KDYZM +K)boMrrTk6KDtoN!!L"8rr<&urr@]N!!%ZKrrGCcqu6ZsK?X>s5leUhrr@]Krrds?s1O'arrbXf +s1L_Srr>@OrrI`Pqu6\L!:0Xb!:Tpf!87C&~> +gA_.NUAk5oKDb`NK)gQ$rs45WK)gQ(s1JF3rrRgN62gfa]g;VtrVucq!58@2!%ImHs$?\brW)os +"+pRRKDtoNK*)(*KDPTL5l^o`rrBb3!;c]r!/(7Ms$6b#!!%ZLs8N')5lgrb]g9>aKDPWI!;ulr +!<<'!^&@s35lgl`"k>n)!!%ZMrr[lR!%ImH"2.!Q!<2uuXT&8!!;uls!!%ZNrrRiQs8IZKrrE+P +rr;uu"$tK;!<)otKDkiNKDYZLK0fD7!<@bsrr[lR!/(7M!/(%G!/(1K!58Aa!58C3!58C3!/',- +!/'Y +gA_.QUAk5oJc,NLJH18urs4/UJH19$s1SL4rrRaO5lL]`^-MYtrVucq!5AF3!%@gGs$6VarW)os +"+^FPJc>]LJHGk&JboBJ5QCf_rrBe4!;c]r!.k+Ks$-\#!!%TJs8N')5QLia^-KD`JboEG!;ulr +!<<'!^A\'45QLc_"kGq(!!%TKrr[fP!%@gG"27$O!<2uuWrE%t!;uls!!%TLrrRcOs8ITIrrE+N +rr;uu"$kH;!<)otJc5WLJc#HJJO',4!<@\qrr[fP!.k+K!.jnE!.k%I!5AG`!5AI4!5AI4!.iu+ +!.jM:s+1(I!J(7:rr<&frr<&Ps*t~> +gA_.NUAk5oKDb`NK)gQ$rs45WK)gQ(s1JF3rrRgN62gfa]g;VtrVucq!58@2!%ImHs$?\brW)os +"+pRRKDtoNK*)(*KDPTL5l^o`rrBb3!;c]r!/(7Ms$6b#!!%ZLs8N')5lgrb]g9>aKDPWI!;ulr +!<<'!^&@s35lgl`"k>n)!!%ZMrr[lR!%ImH"2.!Q!<2uuXT&8!!;uls!!%ZNrrRiQs8IZKrrE+P +rr;uu"$tK;!<)otKDkiNKDYZLK0fD7!<@bsrr[lR!/(7M!/(%G!/(1K!58Aa!58C3!58C3!/',- +!/'Y +gA_.NUAk5oKDb`NK)gQ$rrds'rr@]NrrBb3rr[oR5lgl`"+pRRKDkiL!!<1Q!<)otXSi+u5leUt +!<)p"K)bn(rVlj`re((I!^QedrVlkMrW)uu!C=EurrGF!r;QbLrVuqNr;Z]q#/1':]g4r:rr<#3 +s8W&ur;Z`rs8N;:6,!%3_!58@3!/(7M!/(7N!($S`!keR6rr3)%63$ua!;uls!!%ZNrrg"8 +s+>t$rrE+Prr3<*K>#h8!<<(OK0fJ:!/(1K!C;A8rrE+Pc2RmZ!!%ZNrr[mO6%f"5!/'b?!574g +!/'Y +gA_.QUAk5oJc,NLJH18urrdm$rr@WLrrBe4rr[iP5QLc_"+^FPJc5WJ!!<1O!<)otWr2ns5QJOt +!<)p"JH,\$rVlj_rdjqG!^H_crVlkKrW)uu!C4BurrGC!r;QbJrVuqLr;Z]q#/:-;^-Fr7rr<#4 +s8W&ur;Z`rs8N;;5ed9uJ\M'^!5AF4!.k+K!.k+L!'pM_!knX7rr3)#5l^l`!;uls!!%TLrrg%9 +s+,aurrE+Nrr3<*J\K_8!<<(MJO'27!.k%I!C255rrE+Nc2Rm[!!%TLrr[gP5_8b2!.jV=!5@:h +!.jM:!<@]JrrI[9pAY0-5lQ<95_23"rr<&frr<&Ps*t~> +gA_.NUAk5oKDb`NK)gQ$rrds'rr@]NrrBb3rr[oR5lgl`"+pRRKDkiL!!<1Q!<)otXSi+u5leUt +!<)p"K)bn(rVlj`re((I!^QedrVlkMrW)uu!C=EurrGF!r;QbLrVuqNr;Z]q#/1':]g4r:rr<#3 +s8W&ur;Z`rs8N;:6,!%3_!58@3!/(7M!/(7N!($S`!keR6rr3)%63$ua!;uls!!%ZNrrg"8 +s+>t$rrE+Prr3<*K>#h8!<<(OK0fJ:!/(1K!C;A8rrE+Pc2RmZ!!%ZNrr[mO6%f"5!/'b?!574g +!/'Y +k5POb!/%u\rr>rkrrE+Pr;QhN!/(1K"G9Uc!!)lq"G?aSK>%9a"+pRRKDkiL!<<'"]g;Yt!3H(t +!58=2rVlkMrVuparVlr#K7j1'#!os&s+::Or;Z`rrr3*eKE(s;qYpYM!!%ZLs8N'#5lcQ:rrTl" +KDkiM5lgra!;ulr!<3!$]`A*462LT`K)bn(rVm%R!!')d62gfa]`A$2!kgo"rVur3rVult!/(7M +$b\h+KE(tQ^&S*4KDtlS!/( +k5PO`!.hl[rr?&nrrE+Nr;QhL!.k%I"G'Re!!)lq"G-UQJ\M-`"+^FPJc5WJ!<<'"^-M\t!35qr +!5AC3rVlkKrVup`rVlr!JV!h##!fp&s+(.Mr;Z`rrr3*dJcGa8qYpYK!!%TJs8N'#5QHB7rrTo" +Jc5WK5QLi`!;ulr!<3!$^&\355l1K_JH,\$rVm%P!!'#a5lL]`^&\-3!kpr"rVur4rVult!.k+K +$bek+JcGbM^An35Jc>ZQ!.k0M5QLf`!.k(K!.k%I!<@]JrrE+Nbl@\C!.k.L"bE]R^-I8Hrr@W> +rrBdgrr@W:s8RZIrrIZNpAYL#s8RX8s8Tfas8N)frr<&Ps*t~> +k5POb!/%u\rr>rkrrE+Pr;QhN!/(1K"G9Uc!!)lq"G?aSK>%9a"+pRRKDkiL!<<'"]g;Yt!3H(t +!58=2rVlkMrVuparVlr#K7j1'#!os&s+::Or;Z`rrr3*eKE(s;qYpYM!!%ZLs8N'#5lcQ:rrTl" +KDkiM5lgra!;ulr!<3!$]`A*462LT`K)bn(rVm%R!!')d62gfa]`A$2!kgo"rVur3rVult!/(7M +$b\h+KE(tQ^&S*4KDtlS!/( +k5PF_rIY*`qu6XoUAk5oKDb`NK)gQ$rrn#Trr<$br;Qd`!;c]qKDklLs8E#trs-5's8T2#]n?:` +!58@3rVm%R!!%X;62gi`KDkfR6,!;N!!)ut!58@3qYp[as8PBurVult!/(4Lrr<.R5lcQ9rrGF! +rVlmaKDklKs8Duu^&.g;!<<)46,! +k5PF]rIFs_qu6XrUAk5oJc,NLJH18urrmrRrr<$ar;Qd_!;c]qJc5ZJs8E#trs-8's8T,!^4H7_ +!5AF4rVm%P!!%R85lL`_Jc5TP5ed8L!!)ut!5AF4qYp[`s8P?urVult!.k(Jrr<.P5QHB6rrGC! +rVlm`Jc5ZIs8Duu^AIp +k5PF_rIY*`qu6XoUAk5oKDb`NK)gQ$rrn#Trr<$br;Qd`!;c]qKDklLs8E#trs-5's8T2#]n?:` +!58@3rVm%R!!%X;62gi`KDkfR6,!;N!!)ut!58@3qYp[as8PBurVult!/(4Lrr<.R5lcQ9rrGF! +rVlmaKDklKs8Duu^&.g;!<<)46,! +k5PI`KDtoN5leUsrr>rkrrE+Pr;QhN!/(1K#(lo.!'u6'rVlr4!7h)K"2.##KDklLs8E#srs-5' +s/c8#K7j.&rW)os#(lmUKE$QirVllu^&@s36%f.:rVll2rVur3rVuo2!!*#u!C=Eus8N'!KDbcL +!<7ZQs+A#arrPId^&@s2.K0>Fs8;otec#OJ!<3!']`?U_K)bn(rVm+T!!',#s1L_trrW7R!58C3 +!58@3!/(7MrrE$arVlnN62gfc]`8%brr3!!KDtlO!58C3!/(7N!/(1K!C;A8rrE+Pbl7]r!<)ou +K<5"N!PO-brr@]Js8P@g]n8VaXFo4+!/'Yt$rr<&frr<&Ps*t~> +k5PI^Jc>]L5QJOsrr?&nrrE+Nr;QhL!.k%I#(Zc*!'l*#rVlr5!7q/L"27&#Jc5ZJs8E#srs-8' +s/Q,!JV!e"rW)os#(ZaSJcC9drVllu^A\'45_8n7rVll3rVur4rVuo3!!*#u!C4Bus8N'!Jc,QJ +!<7TOs+.o`rrPFc^A\'3./j5Es8;otf)>XK!<3!'^&ZaaJH,\$rVm+R!!'&!s1UbtrrW7P!5AI4 +!5AF4!.k+KrrE$`rVlnL5lL]b^&S.arr3!!Jc>ZM!5AI4!.k+L!.k%I!C255rrE+Nbl7]p!<)ou +JZAYJ!PX-arr@WHs8P=f^4AP`We&k'!.jM:s+1(I!J(7ErrdoQs+,aurr<&frr<&Ps*t~> +k5PI`KDtoN5leUsrr>rkrrE+Pr;QhN!/(1K#(lo.!'u6'rVlr4!7h)K"2.##KDklLs8E#srs-5' +s/c8#K7j.&rW)os#(lmUKE$QirVllu^&@s36%f.:rVll2rVur3rVuo2!!*#u!C=Eus8N'!KDbcL +!<7ZQs+A#arrPId^&@s2.K0>Fs8;otec#OJ!<3!']`?U_K)bn(rVm+T!!',#s1L_trrW7R!58C3 +!58@3!/(7MrrE$arVlnN62gfc]`8%brr3!!KDtlO!58C3!/(7N!/(1K!C;A8rrE+Pbl7]r!<)ou +K<5"N!PO-brr@]Js8P@g]n8VaXFo4+!/'Yt$rr<&frr<&Ps*t~> +k5PI`KDb`QK)iUbs&,Tk!<@cMrrRfQKDYZRK)koOKE"5'rVlnN.K08M]`:=u!/(7MrW!Hps1SI4 +5sZs5s+:;;KE&Xa!<)p,K)bm;s8N'bs8P@b!/(:N!58=2r;Z]q!/(:N"$lne^&J$9!/(BrrE(O +!<)rs!!%ZMs8N'$KE"5'rr3%P!($S`!eUK*rr3!!62poa!!@lRs+C:N!/(1Ks+C4K!<@brrrI`P +rVlnNXS;_pKDGNL!<<(Of)Pc&mJm3=qu6_M!7giD"@<(f6%f1:"24a7!:Tpf!87C&~> +k5PI^Jc,NOJH3Fas&Gfn!<@]KrrR`OJc#HPJH5]MJc@u#rVlnL./j/L^&UCu!.k+KrW!Hos1\O5 +5X6a3s+(/8JcEI`!<)p,JH,[8s8N'as8P=a!.k.L!5AC3r;Z]q!.k.L"$chd^Ae-:!.k0a!!%TJ +s8N',5l^ka!5AKI5_/pLrr2turW)lrr;ZgGrVlnL!<)p%^*s#4!!%TKrr[fP!36%u#D#/?rrE(M +!<)rs!!%TKs8N'$Jc@u#rr3%N!'pM_!eC?&rr3!!5lUf`!!@fPs+1.L!.k%Is+1(I!<@\prrIZN +rVlnLWqZMnJbf +k5PI`KDb`QK)iUbs&,Tk!<@cMrrRfQKDYZRK)koOKE"5'rVlnN.K08M]`:=u!/(7MrW!Hps1SI4 +5sZs5s+:;;KE&Xa!<)p,K)bm;s8N'bs8P@b!/(:N!58=2r;Z]q!/(:N"$lne^&J$9!/(BrrE(O +!<)rs!!%ZMs8N'$KE"5'rr3%P!($S`!eUK*rr3!!62poa!!@lRs+C:N!/(1Ks+C4K!<@brrrI`P +rVlnNXS;_pKDGNL!<<(Of)Pc&mJm3=qu6_M!7giD"@<(f6%f1:"24a7!:Tpf!87C&~> +k5PI`KDPTMKE(sLUAk5oKDb`NK)gQ$rs45W]`<]bs$8sMrrTl362^c^!!%ZMs6B[`rr@]_Ps+C4K!J:CGrrKf!r.>,<^&S*4n,E@fg&HR~> +k5PI^JboBKJcGaMUAk5oJc,NLJH18urs4/U^&W`as$/jKrrTo75lCZ]!!%TKs6B[`rr@W:!;ul` +!!%TJs6Ka`s6K^cJc5TKJa<@:^A\*(!<.NN5QHB7s8N'#5_4Lc!!,?9r;ZhKqu?Zrqu6Zs5g96/ +JO&c*!.jqF!s&@P^=WAc^4G\Os+1(I!J(7ErrKi!r.+u9^An35n,E@fg&HR~> +k5PI`KDPTMKE(sLUAk5oKDb`NK)gQ$rs45W]`<]bs$8sMrrTl362^c^!!%ZMs6B[`rr@]_Ps+C4K!J:CGrrKf!r.>,<^&S*4n,E@fg&HR~> +k5PI`KD5BG;PO0l!/(4L!eUK*qu6eO!5/Abq#:>Hr;QkO!!%ZMrrE*cq>^JIqYpW1!!)ut!J:CJ +KE"7:KE(rS^&Pc3!<)p!K)e4:rt)krs+>q(K>%;us8Te4K)gQ%s8N'$5l^m_re(4NqL\i8!!)rs +rrDnJ!^Qedqh"u:!!%ZMrr@]@PrrGE +k5PI^JbT0EFr;QkM!!%TKrrE*bq>^JGqYpW2!!)ut!J(7H +JcA"7JcG`Q^Ako4!<)p!JH.t7rt)nqs+,_$J\M/us8Th5JH19!s8N'$5QCdardk(LqLJ]5!!)rs +rrDnH!^H_cqgei7!!%TKrr@W:!!%TKs6fpf^Ae-45k=sZJLCKuJO',5!'pG^!'o!5#=&7hJUme$ +5k=pTJbT0GJO"ebrrBdfrr>=OrrGB9qu6\J5k4mSJc5TK!:Tpf!87C&~> +k5PI`KD5BG;PO0l!/(4L!eUK*qu6eO!5/Abq#:>Hr;QkO!!%ZMrrE*cq>^JIqYpW1!!)ut!J:CJ +KE"7:KE(rS^&Pc3!<)p!K)e4:rt)krs+>q(K>%;us8Te4K)gQ%s8N'$5l^m_re(4NqL\i8!!)rs +rrDnJ!^Qedqh"u:!!%ZMrr@]@PrrGE +k5PG3pAY+jUAk5o62^`aK)gQ$rrdsPrr>@Urr[lR!/(7M!<@cJrr@]Hs8N)trrI`Pq>^JIq>UJJ +!<)ouK)k]H!!)fo!<@cNrrdrS^&N`^rr@]Is8N)srrE+Pq>UGIq>UMK!/(7M!eUKdqYpT0KDGNK +5lcQ9rrE*tqZ$SJnc&Ui^&7m3K)iU^rrE*cqu6ZsK=_'_KD5BH]g;Sr!/'&+!/'\=!<@cLrrIa< +li-qbn,E@fg&HR~> +k5PG4pAY+mUAk5o5lCW`JH18urrdmQrr>=Trr[fP!.k+K!<@]Hrr@WFs8N)trrIZNq>^JGq>UJH +!<)ouJH5KF!!)fo!<@]LrrdlQ^Aic]rr@WGs8N)srrE+Nq>UGGq>UMI!.k+K!eC?cqYpT1Jbf +k5PG3pAY+jUAk5o62^`aK)gQ$rrdsPrr>@Urr[lR!/(7M!<@cJrr@]Hs8N)trrI`Pq>^JIq>UJJ +!<)ouK)k]H!!)fo!<@cNrrdrS^&N`^rr@]Is8N)srrE+Pq>UGIq>UMK!/(7M!eUKdqYpT0KDGNK +5lcQ9rrE*tqZ$SJnc&Ui^&7m3K)iU^rrE*cqu6ZsK=_'_KD5BH]g;Sr!/'&+!/'\=!<@cLrrIa< +li-qbn,E@fg&HR~> +gA_.NUAk5o;Z-OrK)gQ$rs"*Rrr<$Jec#LK;CVSE##a"OK)bn(rVlluKDGNIF85e8!<)ouK)k`I +s+C.I!J:CNrrRfQKDGNI!;QQp!/(4L!s&B$KDb`MeV!\t!E&pqrrE+Pq>UFDq>UMK!/(7M!J:CI +rr@]IrrRfQKDkfN!3H%ss+BkA!!)lq!!)lq!E+RIrrE+P])Mb_nG`NAe_L0)KC/[>!/(1K!J:C< +rr<&frr<&Ps*t~> +gA_.QUAk5oUL<@IhG#$'7SJH,\$rVlluJbfUFCq>UMI!.k+K!J(7G +rr@WGrrR`OJc5TL!35nqs+0_?!!)lq!!)lq!EF^JrrE+N])Mb]nG`N?f%g9*JaNI +gA_.NUAk5o;Z-OrK)gQ$rs"*Rrr<$Jec#LK;CVSE##a"OK)bn(rVlluKDGNIF85e8!<)ouK)k`I +s+C.I!J:CNrrRfQKDGNI!;QQp!/(4L!s&B$KDb`MeV!\t!E&pqrrE+Pq>UFDq>UMK!/(7M!J:CI +rr@]IrrRfQKDkfN!3H%ss+BkA!!)lq!!)lq!E+RIrrE+P])Mb_nG`NAe_L0)KC/[>!/(1K!J:C< +rr<&frr<&Ps*t~> +gA_.NUAk5oKDb`NK)gQ$rs+0*rr@\b!58@2!C>98rs$.:]n6:bKDkfN!/(+I!3GtqrrE#t!J:CJ +s8R`IrrI`PrVlqO!/(+I!($D[!<@cMrrW9$s1S@1s+C.I!C6_`rrE+Pq>UEpq>UMK!/(7M!J:C@ +rrRfQKDkfN!/(.Js+BkA!!)lq!!)lqs+C4K!<@b`rr@]?rr@],rr@]=rrGE +gA_.QUAk5oJc,NLJH18urs+*'rr@Va!5AF3!C568rs$1;^4?7aJc5TL!.jtG!35horrE#t!J(7H +s8RZGrrIZNrVlqM!.jtG!'p>Z!<@]KrrW9$s1\F2s+1"G!C-Y_rrE+Nq>UEpq>UMI!.k+K!J(7> +rrR`OJc5TL!.k"Hs+0_?!!)lq!!)lqs+1(I!<@\^rr@W=rr@W*rr@W;rrGB9qu6\J!:0Xb!:Tpf +!87C&~> +gA_.NUAk5oKDb`NK)gQ$rs+0*rr@\b!58@2!C>98rs$.:]n6:bKDkfN!/(+I!3GtqrrE#t!J:CJ +s8R`IrrI`PrVlqO!/(+I!($D[!<@cMrrW9$s1S@1s+C.I!C6_`rrE+Pq>UEpq>UMK!/(7M!J:C@ +rrRfQKDkfN!/(.Js+BkA!!)lq!!)lqs+C4K!<@b`rr@]?rr@],rr@]=rrGE +gA_.NUAk5oKDb`NK)gQ$rs+/V]`<]b]`A$2!J;j"rrBb2!!%ZMs8N)prr@]Hs8N)trrI`Pn,EE@ +!<)p!]`<]SrrU^NKDb`M!587/s1S7.rrDusrrDlp!584.!eUK*rVlnN!:TpgK)kiL!@]rrE+Pqu6ZsKDYZL!/%l_!/'b?!574g!PO-Qs8R`KrrI`Pli-rNn,E@fg&HR~> +gA_.QUAk5oJc,NLJH18urs+)T^&W`a^&\-3!J)ZtrrBe3!!%TKs8N)prr@WFs8N)trrIZNn,EE> +!<)p!^&W`RrrUaOJc,NK!5A=0s1\=/rrDusrrDlp!5A:/!eC?&rVlnL!:TpgJH5WJ!=\rrE+Nqu6ZsJc#HJ!.h`]!.jV=!5@:h!PX-Ps8RZIrrIZNli-rMn,E@fg&HR~> +gA_.NUAk5oKDb`NK)gQ$rs+/V]`<]b]`A$2!J;j"rrBb2!!%ZMs8N)prr@]Hs8N)trrI`Pn,EE@ +!<)p!]`<]SrrU^NKDb`M!587/s1S7.rrDusrrDlp!584.!eUK*rVlnN!:TpgK)kiL!@]rrE+Pqu6ZsKDYZL!/%l_!/'b?!574g!PO-Qs8R`KrrI`Pli-rNn,E@fg&HR~> +gA_.NUAk5oKDb`NK)gQ$rs46+rr@]Os1JF2rrIa^LErVusb +KDkiS5la1N!($P_qu?aH62^c`621HXs8N)sK)e42K*"==KDkfOK)e4,K*"==KDkfZ!%GUpK7j3; +]g4rt]n?7_"24_e^%VI-5lcQ7rrGE!/(1K!J:C?rr]t7rrDNf!!(^P +J,~> +gA_.QUAk5oJc,NLJH18urs40(rr@WMs1SL3rrI[9r;Z`r!.k+KlN$n`!.jJ:rVlkKq>^LDrVusa +Jc5WQ5QF%L!'pJ^qu?aG5lCZ_5kk?Ws8N)sJH.t/JHA(:Jc5TMJH.t)JHA(:Jc5TX!%>RqJV!j8 +^-Frt^4H4^"2=ed^@qR.5QHB4rrGB9qu6ZsJ\(j]J][olJaNI +gA_.NUAk5oKDb`NK)gQ$rs46+rr@]Os1JF2rrIa^LErVusb +KDkiS5la1N!($P_qu?aH62^c`621HXs8N)sK)e42K*"==KDkfOK)e4,K*"==KDkfZ!%GUpK7j3; +]g4rt]n?7_"24_e^%VI-5lcQ7rrGE!/(1K!J:C?rr]t7rrDNf!!(^P +J,~> +gA_.NUAk5oKDb`NK)gQ$rrdsPrr@]Hrr@]Lrr[lR!/(7MrrDkI!%I\qrrE#t!J:CJKE"75K)n7< +rVlqO!($F5!!)hI!`B#Nr;Z*`r;Z*`!/(7M!/'V!/(1K!J:C +gA_.QUAk5oJc,NLJH18urrdmQrr@WFrr@WJrr[fP!.k+KrrDkG!%@VnrrE#t!J(7HJcA"2JH8"9 +rVlqM!'p@2!!)hG!`]5Or;Z*`r;Z*`!.k+K!.jJ:!5AF3h#R +gA_.NUAk5oKDb`NK)gQ$rrdsPrr@]Hrr@]Lrr[lR!/(7MrrDkI!%I\qrrE#t!J:CJKE"75K)n7< +rVlqO!($F5!!)hI!`B#Nr;Z*`r;Z*`!/(7M!/'V!/(1K!J:C +gA_.NUAk5oKDb`NK)gQ$rrdsPrr>@]rrBb/rr[lR!/(7M!<>F]rr>sls8N)trrGCcq>^JIq>UJJ +!<)p!K)gQ"rr@]IrrT8%KDkfRK)iUb6,!6s!PO-]s8N)srrE*cq>UF\q>UL^!/(7M!eUKdqYpT0 +62CN^5leUsrrE*tqZ$R]o`#-/K7a0;s8W(N!C6_^rrE*cqu6ZsK=_'_KCf-C]`J/Hh#@A,m/I(d +62UZ_K)k6;!!)Kf!!(^PJ,~> +gA_.QUAk5oJc,NLJH18urrdmQrr>=\rrBe0rr[fP!.k+K!<>C\rr?'os8N)trrG@bq>^JGq>UJH +!<)p!JH18srr@WGrrT2#Jc5TPJH3Fa5ed3s!PX-\s8N)srrE*bq>UF[q>UL]!.k+K!eC?cqYpT1 +5l(E]5QJOsrrE+"qZ$R\o`#-0JUmg8s8W(L!C-Y]rrE*bqu6ZsJ\(j]Jb/pA^&e8Jh#@A*m/I(d +5l:Q^JH5$9!!)Kf!!(^PJ,~> +gA_.NUAk5oKDb`NK)gQ$rrdsPrr>@]rrBb/rr[lR!/(7M!<>F]rr>sls8N)trrGCcq>^JIq>UJJ +!<)p!K)gQ"rr@]IrrT8%KDkfRK)iUb6,!6s!PO-]s8N)srrE*cq>UF\q>UL^!/(7M!eUKdqYpT0 +62CN^5leUsrrE*tqZ$R]o`#-/K7a0;s8W(N!C6_^rrE*cqu6ZsK=_'_KCf-C]`J/Hh#@A,m/I(d +62UZ_K)k6;!!)Kf!!(^PJ,~> +gA_.NUAk5oKDb`NK)gQ$rrn$Qrr<$brVlr4!!)ut#!r:hK)bn(rVlluKDGNIXSDhq!<)rt!;ZZp +KDGNJK)klM!eUK*q>UGIq#:?pKDkfQK)krOKDYZKKDGQI!;uit!/(+I!!)ip!eUK*rVlnN!;QQo +KDGNKK)iU`rrE,$qYpQ/nG`Igqu6\L!;c]r!/(1K!<@b`rr@]@s8R`-rr@] +gA_.QUAk5oJc,NLJH18urrmsRrr<$arVlr5!!)ut#!i4gJH,\$rVlluJbfUGGq#:?pJc5TOJH5`MJc#HIJbf?G!;uit!.jtG!!)ip!eC?&rVlnL!;QQo +Jbfs8RZ+rr@W:rrE+Nqu6\J!:0Xb +!:Tpf!87C&~> +gA_.NUAk5oKDb`NK)gQ$rrn$Qrr<$brVlr4!!)ut#!r:hK)bn(rVlluKDGNIXSDhq!<)rt!;ZZp +KDGNJK)klM!eUK*q>UGIq#:?pKDkfQK)krOKDYZKKDGQI!;uit!/(+I!!)ip!eUK*rVlnN!;QQo +KDGNKK)iU`rrE,$qYpQ/nG`Igqu6\L!;c]r!/(1K!<@b`rr@]@s8R`-rr@] +gA_.NUAk5oKDb`NK)gQ$rs+0SK)e3N!58C3!keTarr32962uQ;!/(7M!<>FSs8N)ts8N)prrIbc +q>UJJ!<)p!K)gQ"rr@]IrrT8%KDkfQK)iUbKDb`M]n?.\rrDus!<@cJrr<&prrRfQKDkfNK)kB? +!J:CMrrE+Pkl1V_qu6\L!;c]r!/(1K!<@b`rr@]@s8Tdgrr@] +gA_.QUAk5oJc,NLJH18urs+*TJH.sL!5AI4!knZcrr32:5lZB8!.k+K!<>CRs8N)ts8N)prrI\b +q>UJH!<)p!JH18srr@WGrrT2#Jc5TOJH3FaJc,NK^4H+[rrDus!<@]Hrr<&prrR`OJc5TLJH50= +!J(7KrrE+Nkl1V_qu6\J!;c]r!.k%I!<@\^rr@W>s8Tghrr@W:rrE+Nqu6\J!:0Xb!:Tpf!87C&~> +gA_.NUAk5oKDb`NK)gQ$rs+0SK)e3N!58C3!keTarr32962uQ;!/(7M!<>FSs8N)ts8N)prrIbc +q>UJJ!<)p!K)gQ"rr@]IrrT8%KDkfQK)iUbKDb`M]n?.\rrDus!<@cJrr<&prrRfQKDkfNK)kB? +!J:CMrrE+Pkl1V_qu6\L!;c]r!/(1K!<@b`rr@]@s8Tdgrr@] +gA_.NUAk5oKDb`NK)gQ$rs46Trr@]O]`>bFrrIa$rVll2r;ZhMrVuis!eWc=pO`W8K7cGi!<)p! +5l^o^K)egK!<,:`!!5Fd!<)p!K)e45K)boIK*!J%KDkfRK)e2i!($R9s$?I5rrDusrr<&4rr<#3 +s8N*"^&%a15lcQ9rrRfQ^$u(%!!'_2rrE*tkl1V_qu6\L!;c`q!;lcs!/%l_!/'e@!/'),!/'Y< +!<@cLrrIa +gA_.QUAk5oJc,NLJH18urs40Urr@WM^&YnHrrI[!rVll3r;ZhKrVuis!eET:pONK5JUp&d!<)p! +5QCf]JH/^L!<,7_!!5Cc!<)p!JH.t2JH,]GJH@5"Jc5TPJH.rd!'pL6s$6C2rrDusrr<&5rr<#4 +s8N*"^A@j25QHB6rrR`O^@;1&!!'b3rrE+"kl1V_qu6\J!;c`q!;lcs!.h`]!.jY>!.ir*!.jM: +!<@]JrrI[9li-qbn,E@fg&HR~> +gA_.NUAk5oKDb`NK)gQ$rs46Trr@]O]`>bFrrIa$rVll2r;ZhMrVuis!eWc=pO`W8K7cGi!<)p! +5l^o^K)egK!<,:`!!5Fd!<)p!K)e45K)boIK*!J%KDkfRK)e2i!($R9s$?I5rrDusrr<&4rr<#3 +s8N*"^&%a15lcQ9rrRfQ^$u(%!!'_2rrE*tkl1V_qu6\L!;c`q!;lcs!/%l_!/'e@!/'),!/'Y< +!<@cLrrIa +gA_.NUAk5oKDb`NK)gQ$rs46Trr@]Os1Q,FrrRg%62gf`^&A!3KDki9KDkfY]n8TN!'u6'!!#<; +!<,7bK0fHgr;QeM62lN:5l^o]K)e4:K*!Jf^&7m1KC/^>62^cL!!'_2rr@]>^&J$3!;c]qKDtlUK0b,Uec5XLg&HR~> +gA_.QUAk5oJc,NLJH18urs40Urr@WMs1Z5HrrRa"5lL]_^A\*4Jc5W7Jc5TW^4ANL!'l*#!!#98 +!<,4aJO'0br;QeK5lQ?75QCf\JH.t7JH@5b^AS!2JaNL<5lCZK!!'b3rr@W:!;ulQ!;c`q!;lcs +!.h`]!.jY>s1[=h!!)Bc!<@]JrrIZNp&G#B"29>;^Ae-4!;c]qJc>ZSJO"cOf)PaMg&HR~> +gA_.NUAk5oKDb`NK)gQ$rs46Trr@]Os1Q,FrrRg%62gf`^&A!3KDki9KDkfY]n8TN!'u6'!!#<; +!<,7bK0fHgr;QeM62lN:5l^o]K)e4:K*!Jf^&7m1KC/^>62^cL!!'_2rr@]>^&J$3!;c]qKDtlUK0b,Uec5XLg&HR~> +gA_.NUAk5oKDb`NK)gQ$rrds']`<]]rrRiQ^&7m4K)bn(WrE)cKBiL:^%;7(^%q[.^$UIMrrBah +KDPWJ!;lcs!/%l_!/&Go!/'Y +gA_.QUAk5oJc,NLJH18urrdm$^&W`\rrRcO^AS!5JH,\$WrE)bJa3:8^@V@)^A7d/^?pLLrrBdi +JboEH!;lcs!.h`]!.i;m!.jM:!<@]JrrIZNpAY.YJc,NN5ed9u!;c^'JcGbaJcGba +gA_.NUAk5oKDb`NK)gQ$rrds']`<]]rrRiQ^&7m4K)bn(WrE)cKBiL:^%;7(^%q[.^$UIMrrBah +KDPWJ!;lcs!/%l_!/&Go!/'Y +gA_.NUAk5oKDb`NK)gQ$rrdsPK)e48s8Tb462LT`K)bn(WrE*P]o;sl!($M^!<@b`rr@]@rr@], +rr<&crrE+Pqu6\L!;?EmKDYZO]g;\u!;c]uKE(t(^&J$6;ZHasg&HR~> +gA_.QUAk5oJc,NLJH18urrdmQJH.t5s8Te55l1K_JH,\$WrE*N^5W'm!'pG]!<@\^rr@W>rr@W* +rr<&crrE+Nqu6\J!;?EmJc#HM^-M_u!;c]uJcGb$^Ae-7 +gA_.NUAk5oKDb`NK)gQ$rrdsPK)e48s8Tb462LT`K)bn(WrE*P]o;sl!($M^!<@b`rr@]@rr@], +rr<&crrE+Pqu6\L!;?EmKDYZO]g;\u!;c]uKE(t(^&J$6;ZHasg&HR~> +gA_.NUAk5oKDb`NK)iU^rrn$QK)bm;rVlr4!!*#us1SI4"+pRRK<"tOK8fg2!/(1K!<@b`rr@]B +rrTn6KA?J,KC&U=!/(1K!J:CGrr@]JrrYRerrDrrs+C@O!/(7M"&f1!!87C&~> +gA_.QUAk5oJc,NLJH3F]rrmsRJH,[8rVlr5!!*#us1\O5"+^FPJZAbMJW0U0!.k%I!<@\^rr@W@ +rrTq7J_^8*JaEC;!.k%I!J(7Err@WHrrYOdrrDrrs+14M!.k+K"',C$!87C&~> +gA_.NUAk5oKDb`NK)iU^rrn$QK)bm;rVlr4!!*#us1SI4"+pRRK<"tOK8fg2!/(1K!<@b`rr@]B +rrTn6KA?J,KC&U=!/(1K!J:CGrr@]JrrYRerrDrrs+C@O!/(7M"&f1!!87C&~> +g]%?*(k\Xa!iuBSr;QhN!7guH#(og+!/#p*rVlrL!3H2"s+:ISK)bn(WrN*ON;inY;Z$Ip!/%l_ +!/(.JrDNZJ"EQ#Es+B,,!/'Y +g]%?+*.apc!ic6Or;QhL!7q&I#(]d*!.f^$rVlrM!36%us+(=QJH,\$WrN*MN;inYi@s+/u*!.jM:!<@]JrrI[!pAY.Af)>UPelAaMrrDrr"kJ8)s&H)urr[9@rrCaP +J,~> +g]%?*(k\Xa!iuBSr;QhN!7guH#(og+!/#p*rVlrL!3H2"s+:ISK)bn(WrN*ON;inY;Z$Ip!/%l_ +!/(.JrDNZJ"EQ#Es+B,,!/'Y +g]%>g!!&hp!keSdr;QhN!/(1K"+sL(!<)ot^&J$4!%ImH!PLeu!!%ZDrrGCcl2Lla!.t9bm/I7& +!/#ni^%).&KDYZM]`8'"s8)cr^$Yh"^&EWa^$bn#^&!BRs8IZCs8N)rrrE+P])Mb_qYpPJqYpW1 +s+B/-s+B\3/;M0TfKDkfM!;c^'!/#n(^&S,GKE(rOg&HR~> +g]%>h!!&hp!knYcr;QhL!.k%I"+aI'!<)ot^Ae-5!%@gG!PUhu!!%TBrrG@bl2Lld!.b-am/I7' +!.f\d^@D7'Jc#HK^&S0#s8)cr^?tq#^A`Z`^@)"$^A30 +g]%>g!!&hp!keSdr;QhN!/(1K"+sL(!<)ot^&J$4!%ImH!PLeu!!%ZDrrGCcl2Lla!.t9bm/I7& +!/#ni^%).&KDYZM]`8'"s8)cr^$Yh"^&EWa^$bn#^&!BRs8IZCs8N)rrrE+P])Mb_qYpPJqYpW1 +s+B/-s+B\3/;M0TfKDkfM!;c^'!/#n(^&S,GKE(rOg&HR~> +gA_0RK;8GI!/(4L!eUK*qu6bN;M+uKrs-4;^&S+be\1n\"$lneKD#6G6%agTrs$.c!/!Q;^$bn) +eNj1fK=q9Ts8R`Lrr]q7K)k?>#JGaU!'pSb^$bn)]g4pa5leUerr@]M!!5H=!;?EseNj08K0d3E +s8N)rrrE+P])Mb_nG`K@h>[J-li-tcKDYZLK)k6;!!)Kf!!(^PJ,~> +gA_0RJYW5G!.k(J!eC?&qu6bLh>[J+li-tcJc#HJJH5$9!!)Kf!!(^PJ,~> +gA_0RK;8GI!/(4L!eUK*qu6bN;M+uKrs-4;^&S+be\1n\"$lneKD#6G6%agTrs$.c!/!Q;^$bn) +eNj1fK=q9Ts8R`Lrr]q7K)k?>#JGaU!'pSb^$bn)]g4pa5leUerr@]M!!5H=!;?EseNj08K0d3E +s8N)rrrE+P])Mb_nG`K@h>[J-li-tcKDYZLK)k6;!!)Kf!!(^PJ,~> +gA_0RK;8GI!/(4L!eUKdqu6bN;M+uJrrg"8^&N`]rr[lR!/("F"+pTeKBiI@!/%ub5la4=rs)GS +6%_Hh!/'kBs+C7Ls$6\c!:KmeK)e4:K)iUPrrrJ:!.t7O61=gR^&EWd5la2KpAY.B!<,7bK0f52 +rrDrr!<@b`rr@]@s8R`.rrIbcm/I(dKDY]KKBrO;!:Tpf!87C&~> +gA_0RJYW5G!.k(J!eC?cqu6bL!.hla5QF(;rs)PT +5_20c!.j_@s+1+Js$-Vb!:KmeJH.t7JH3FOrrrJ;!.b+M5k"^Q^A`Zc5QF&LpAY.A!<,4aJO&r/ +rrDrr!<@\^rr@W>s8RZ,rrI\bm/I(dJc#KIJa<=9!:Tpf!87C&~> +gA_0RK;8GI!/(4L!eUKdqu6bN;M+uJrrg"8^&N`]rr[lR!/("F"+pTeKBiI@!/%ub5la4=rs)GS +6%_Hh!/'kBs+C7Ls$6\c!:KmeK)e4:K)iUPrrrJ:!.t7O61=gR^&EWd5la2KpAY.B!<,7bK0f52 +rrDrr!<@b`rr@]@s8R`.rrIbcm/I(dKDY]KKBrO;!:Tpf!87C&~> +gA_-QUAk5oKDb`MK)kcJ"G9U)!($S`"2.##!<2uuKDtlQK)bn(pAY6.!!#p^rrrHPs8R]O!:Kjl +;?2@Lrr<%Oo)J`BrVlj`r;c9c!eUJ=lMpg8"94!>KBrO>K)bo%pAb-ms8W+O!!)`mrrDrr!<@ba +rrKfcnGiN@hZ!QUli-tcKDYZLK)k6;!!)Kf!!(^PJ,~> +gA_-QUAk5oJc,NKJH5QH"G'R(!'pM_"27&#!<2uuJc>ZOJH,\$pAY6/!!$$arrrHOs8RWM!:Kjl +<<.UMrr<%Mo)J`@rVlj_r;c9c!eC>:lMpg6"93p;Ja<=hZ!QUli-tcJc#HJJH5$9!!)Kf!!(^PJ,~> +gA_-QUAk5oKDb`MK)kcJ"G9U)!($S`"2.##!<2uuKDtlQK)bn(pAY6.!!#p^rrrHPs8R]O!:Kjl +;?2@Lrr<%Oo)J`BrVlj`r;c9c!eUJ=lMpg8"94!>KBrO>K)bo%pAb-ms8W+O!!)`mrrDrr!<@ba +rrKfcnGiN@hZ!QUli-tcKDYZLK)k6;!!)Kf!!(^PJ,~> +gA_-QUAk5oKDb`MK)kcJ"bT^*!!#=^rr<&urs+0Bs8R]O!/'qD!$sX"t9P)rr>=bpAb-mqu6ZsK=q3d]`8&_nc&WB +^#&bhKBrO +gA_-QUAk5oJc,NKJH5QH"bB[)!!#:]rr<&urs+*?s8RWM!.jeB!ZL^AJ!!rr@WJ!!'b$s8RZK!!#:Mrr]u#J\LgW"t0J&rr>:apAb-mqu6ZsJ\;!b^&S/anc&W@ +^>AkiJa<=:!.k%I!J(7:rr<&frr<&Ps*t~> +gA_-QUAk5oKDb`MK)kcJ"bT^*!!#=^rr<&urs+0Bs8R]O!/'qD!$sX"t9P)rr>=bpAb-mqu6ZsK=q3d]`8&_nc&WB +^#&bhKBrO +gA_-QUAk5oKDb`MK)kcJ#(og+!51ZarVlr4!7h)K#/*>&5l^n;o`"pl;X",\^&A#trrdrSKDtrA +s8R`Ors$.:!54!b!:Kjl!'rmN!51\3n,NE?"oeQ&5s^.irrPK=!;-9k;Z24K!/("F!<@cLrrE+P +]Dqm2!3G_j!/'/.s+BY;!<@cLrrI`Pmf*C&s8N)frr<&Ps*t~> +gA_-QUAk5oJc,NKJH5QH#(]d*!5:]`rVlr5!7q/L#/3A&5QCe8o`"pl`? +s8RZMrs$1;!5=!a!:Kjl!'idL!5:_4n,NE="oeQ&5X9nerrPH:!;-9k +gA_-QUAk5oKDb`MK)kcJ#(og+!51ZarVlr4!7h)K#/*>&5l^n;o`"pl;X",\^&A#trrdrSKDtrA +s8R`Ors$.:!54!b!:Kjl!'rmN!51\3n,NE?"oeQ&5s^.irrPK=!;-9k;Z24K!/("F!<@cLrrE+P +]Dqm2!3G_j!/'/.s+BY;!<@cLrrI`Pmf*C&s8N)frr<&Ps*t~> +gA_HZ^&PeG^&S+b]r_58K)gQ%rrRfQ^&.g7K)e1;^&J'urr3&5!%ImH!($P`!/'qD!F_K*+F>rrDWi",$XR!87C&~> +gA_HZ^AkqI^An4a^9%>9JH19!rrR`O^AIp8JH.q8^Ae0urr3&6!%@gG!'pJ_!.jeB!% +5QJOarrp,f!.b-$o)J`@s8N9'JH5_$5QL6P#JPc's1SIu5k"aNJHA*N!:Bdd^A`]Urrsm&JO"bd +5kb3Y!.k%I!<@\_s8N)grr@W,rrI\bli-tcJc#HJ5QLNX!<>C^JHJ1;rrDWi"+gLP!87C&~> +gA_HZ^&PeG^&S+b]r_58K)gQ%rrRfQ^&.g7K)e1;^&J'urr3&5!%ImH!($P`!/'qD!F_K*+F>rrDWi",$XR!87C&~> +g]-&]!^VH:T`>(Fo`"pl;X+2_!'rp:rrH"`rr3$"K0f).s+:=Ore(1M!eUJ=lMgp +g]-&[!^M<:T`>(Do`"pl:lMgp:!'p#Qs+(=R +s8RWM!:BgdJH.t-rs-7d!5AIu5QLNXrrDrr!<@\_s8N)js8RWNs+0&,!'oiL!<@]Js8P@XrrBe- +rr@W=rr<&Ps*t~> +g]-&]!^VH:T`>(Fo`"pl;X+2_!'rp:rrH"`rr3$"K0f).s+:=Ore(1M!eUJ=lMgp +JcGWI!keSdr;QhN!58:0!C9W_s8%?J!;V6K5lcQ0rrE*tlMgoOK)k3:#>tPSs8N(O61Y'UK*)(* +62gid62s4Nn,NCf"hjs9!!%Z?s8R]T63$t;!!)EdrW)Tjre(7Nre'qE!<@cLrrE+P]Dhm362UZ` +]`8'1K*)++s+B2.!/'S:!<@cLs8R`;rr>@Rrr<&Ps*t~> +JcGWI!knYcr;QhL!5A@1!C0Zas8%9H!;V0I5QHB-rrE+"lMgoNJH5!8#?:bTs8N(M5k=sTJHGk& +5lL`c5lX(Ln,NCf"ht$:!!%T=s8RWR5l^k8!!)EdrW)Tjrdk+LrdjeC!<@]JrrE+N]Dhm35l:Q_ +^&S02JHGn's+0&,!.jG8!<@]Js8RZ9rr>=Qrr<&Ps*t~> +JcGWI!keSdr;QhN!58:0!C9W_s8%?J!;V6K5lcQ0rrE*tlMgoOK)k3:#>tPSs8N(O61Y'UK*)(* +62gid62s4Nn,NCf"hjs9!!%Z?s8R]T63$t;!!)EdrW)Tjre(7Nre'qE!<@cLrrE+P]Dhm362UZ` +]`8'1K*)++s+B2.!/'S:!<@cLs8R`;rr>@Rrr<&Ps*t~> +JcGTH!<@cMrrI`PqYpSK;Y^7n]g:3FrrRfQKCo0E!/'S:! +JcGTH!<@]KrrIZNqYpSIhZ!S,lMgkbJc#HJ5_88$!!)Kf!!(^PJ,~> +JcGTH!<@cMrrI`PqYpSK;Y^7n]g:3FrrRfQKCo0E!/'S:! +JcGTH!<@cMrrI`PqYpPJo)JbVq>^MJo`+pklMgqdK0_g&!:BdiK)bn(!/'hAs+C4K!eUIQmf*L) +6%].;5sao<#!mkA!'roamf*BA5s^.prrFR$r;ZhMpAY-n62^``.0-sZs+Bh@!/'2/s+BV:!<@cM +rrTk6KBrO;61=gR!87C&~> +JcGTH!<@]KrrIZNqYpPHo)JbUq>^MHo`+pklMgqdJNuL"!:BdiJH,\$!.j\?s+1(I!eC=Omf*L* +5_/n85X=`:#!d_>!'if`mf*B?5X9nlrrFO!r;ZhKpAY-n5lCW_-igjYs+0\>!.j&-s+0J8!<@]K +rrTn7Ja<=95k"^Q!87C&~> +JcGTH!<@cMrrI`PqYpPJo)JbVq>^MJo`+pklMgqdK0_g&!:BdiK)bn(!/'hAs+C4K!eUIQmf*L) +6%].;5sao<#!mkA!'roamf*BA5s^.prrFR$r;ZhMpAY-n62^``.0-sZs+Bh@!/'2/s+BV:!<@cM +rrTk6KBrO;61=gR!87C&~> +JcGTH!<@cMrrRfQebf@IK,FBb!eUK2qQ'`r!/&u)s/Z:PXOZY:s/b\hs+C1J!Nai=rrCUKX8pf: +rrfEUK<3Vjrr^eL;UtC="m2ma;M2(Ds7u]s;?/0EXT!hUXAZ-X;M4qLs+C-Ks+;"`K2Se'XK7&, +XK;H'XFjF$;GsSordtYXXAX\PXAZ.$;M0U"KDqtP.0-I>rr@]/rrFS!lMgkb.K-=LK)eg7rr=M@ +rrCUIrr<&Ps*t~> +JcGTH!<@]KrrR`Of),IJJK4Hb!eC?2qPjTs!.ii's/H.OWn-M9s/PPfs+1%H!NO` +JcGTH!<@cMrrRfQebf@IK,FBb!eUK2qQ'`r!/&u)s/Z:PXOZY:s/b\hs+C1J!Nai=rrCUKX8pf: +rrfEUK<3Vjrr^eL;UtC="m2ma;M2(Ds7u]s;?/0EXT!hUXAZ-X;M4qLs+C-Ks+;"`K2Se'XK7&, +XK;H'XFjF$;GsSordtYXXAX\PXAZ.$;M0U"KDqtP.0-I>rr@]/rrFS!lMgkb.K-=LK)eg7rr=M@ +rrCUIrr<&Ps*t~> +JcGWI!eUK*r;QhN!/(1K!J=;Err<&prrTk6K<"tOK8fj1!;lcs]n=Q/s1SC2!PR%Frr@]/rr>@L +s7u]qKB`C9!;c`qK*f6kK)gOVec5XLg&HR~> +JcGWI!eC?&r;QhL!.k%I!J+8Frr<&prrTn7JZAbMJW0X/!;lcs^4FN.s1\I3!P[.Hrr@W-rr>=K +s7u]qJa*17!;c`qJI0'jJH17Pf)PaMg&HR~> +JcGWI!eUK*r;QhN!/(1K!J=;Err<&prrTk6K<"tOK8fj1!;lcs]n=Q/s1SC2!PR%Frr@]/rr>@L +s7u]qKB`C9!;c`qK*f6kK)gOVec5XLg&HR~> +JcGWI!eUK*r;QeM!;c]rK2VID!!)ip!eUK*WrE)cK8fj1!;c]q6)ae`KAZ\/KB`C:!($U:!C6_L +rr@]Js8PCarr<&srr<&Ps*t~> +JcGWI!eC?&r;QeK!;c]rJQ;IE!!)ip!eC?&WrE)bJW0X/!;c]q5cF\_J`$J-Ja*18!'pO7!C-YK +rr@WHs8P@`rr<&srr<&Ps*t~> +JcGWI!eUK*r;QeM!;c]rK2VID!!)ip!eUK*WrE)cK8fj1!;c]q6)ae`KAZ\/KB`C:!($U:!C6_L +rr@]Js8PCarr<&srr<&Ps*t~> +JcGTH!UR`^&S*4r;Q`sg&HR~> +JcGTH!UR_^An35r;Q`sg&HR~> +JcGTH!UR`^&S*4r;Q`sg&HR~> +JcGWI!eUK*r;QeM!;c]qKDklIK*"==;Yl%G!!%ZIrsHF>K0b.iK)e1;^&7m2K)kZGr]q#lrr<'! +s+:<(s1JC]!584.%_Vkm!($Yb5l^nurr<%Op\tMO5lcOi!58CurW!"Ps4.)K!C=Eprs+0B5lgq; +!!*#u!3H,!!/(4L%RC)r!!*'!K)gQ(s+$7D!(#iK!<@cNrrW6eK>$UN!/((Hs+:@P!;uis +6.u9g~> +JcGWI!eC?&r;QeK!;c]qJc5ZGJHA(:]K!!,@! +rr<"Lrr3#55lCZff)L=$rr<$aqu6]2JZ8YMJ\L+C!'ocJ!<@]LrrW6dJ\LIM!.jqFs+(4N!;uis +5hZ0f~> +JcGWI!eUK*r;QeM!;c]qKDklIK*"==;Yl%G!!%ZIrsHF>K0b.iK)e1;^&7m2K)kZGr]q#lrr<'! +s+:<(s1JC]!584.%_Vkm!($Yb5l^nurr<%Op\tMO5lcOi!58CurW!"Ps4.)K!C=Eprs+0B5lgq; +!!*#u!3H,!!/(4L%RC)r!!*'!K)gQ(s+$7D!(#iK!<@cNrrW6eK>$UN!/((Hs+:@P!;uis +6.u9g~> +JcGWI!eUK*r;QeM!;c]q^&EWa62Q9>5laf8K0]K'rdt4O^%q^.5mdRDKE&"Qs+:HZ +]`>bG;ZB#_^&N]bKE(rOX?cj]rs\u.!58F4!5/AbK)gO%p](8G"&ac(!<3!*!56&G^&J'4]`:@p +rs7-TKDtrOrr>@`rrW6e!($M^%_Vkm6,!rrVm!d!/!R'rr3!s!<3#u62pooK)gP* +!!'_4s+:<(5sbMMrrE&u$A1W1!/!S=K)krOrW)fp!!'"u!JA)Err@]8rrE+PrVltP5lcQ'rr@]G +rrTld62^`_!87C&~> +JcGWI!eC?&r;QeK!;c]q^A`Z`5l6*;5QFf8JNs3#rdb(M^A7g/5RIIAJcD_Ms+(0arVlluJb]6X +^&YnI;a^Ai`aJcG`MW^$RZrs\u.!5AL5!58GaJH17$p](8E"''o'!<3!*!5?/I^Ae05^&UFp +rs70UJc>`Mrr>=_rrW6d!'pG]%__qo5ed9u!.b-$^&UDurVm!c!.dC#rr3"!!<3#u5lUfnJH18$ +!!'b5s+(0$5X>>KrrE&u$@tH-!.dD8JH5`MrW)fp!!'"u!J.uDrr@W6rrE+NrVltN5QHB$rr@WE +rrToc5lCW^!87C&~> +JcGWI!eUK*r;QeM!;c]q^&EWa62Q9>5laf8K0]K'rdt4O^%q^.5mdRDKE&"Qs+:HZ +]`>bG;ZB#_^&N]bKE(rOX?cj]rs\u.!58F4!5/AbK)gO%p](8G"&ac(!<3!*!56&G^&J'4]`:@p +rs7-TKDtrOrr>@`rrW6e!($M^%_Vkm6,!rrVm!d!/!R'rr3!s!<3#u62pooK)gP* +!!'_4s+:<(5sbMMrrE&u$A1W1!/!S=K)krOrW)fp!!'"u!JA)Err@]8rrE+PrVltP5lcQ'rr@]G +rrTld62^`_!87C&~> +JcGWI!eUK*r;QhN!57k$!!)He$NPhZs+C?Q!<7ZOKDkfM!;HNn63$rpKE$Q(KDtoOKE(rOXM"W/ +rrN2%!<3!'!<7\bK)kq(p](8G!)ifKrr3<*s8N(Orr>@bK)kcJ#cn$>s$?\b!/(7Mrr<$bq>U[" +X8r;#K)krNK)u&Q;Z6UuK)kqb!<3#u!<3!662uQ;s+A!_K)gQ(s+:=Orr@]Orr<&ursh?.K)kq( +XFgNQrr>>NKDY]KK<"qOKAlh2eV!)c!<@cLrrE+Pli-s;pAY0,62^`_!87C&~> +JcGWI!eC?&r;QhL!5@q%!!)He$NPbXs+13M!<7TMJc5TK!;HNn5l^ioJcC9$Jc>]MJcG`MWkJK. +rrN2#!<3!'!<7VaJH5_$p](8E!*0#Lrr3<*s8N(Mrr>=aJH5QH#c[m=s$6Va!.k+Krr<$aq>U[" +WW<)!JH5`LJH>iO;LJc#KIJZA_MJ`6V0eq*&b!<@]JrrE+Nli-s9pAY0-5lCW^!87C&~> +JcGWI!eUK*r;QhN!57k$!!)He$NPhZs+C?Q!<7ZOKDkfM!;HNn63$rpKE$Q(KDtoOKE(rOXM"W/ +rrN2%!<3!'!<7\bK)kq(p](8G!)ifKrr3<*s8N(Orr>@bK)kcJ#cn$>s$?\b!/(7Mrr<$bq>U[" +X8r;#K)krNK)u&Q;Z6UuK)kqb!<3#u!<3!662uQ;s+A!_K)gQ(s+:=Orr@]Orr<&ursh?.K)kq( +XFgNQrr>>NKDY]KK<"qOKAlh2eV!)c!<@cLrrE+Pli-s;pAY0,62^`_!87C&~> +JcGWI!eUKdr;QeM!:Kje!:Kjf!/(7M"fq_(]`<]arrI`Pp\t6oKDkfZK)e4;!!%ZOrrB/#!/(+I +!eUJ=rr30&6,!Y"hjqg!'u8:rsAc+s+ +JcGWI!eC?cr;QeK!:Kje!:Kjf!.k+K"f_S&^&W``rrIZNp\t6oJc5TXJH.t8!!%TMrrB)!!.jtG +!eC>:rr30&5ed9u!'p8X"ht"f!'l,7rsAc+s+*H8!'pR8!;c]rW^-L^!<@]Ls8N'!Jbf +JcGWI!eUKdr;QeM!:Kje!:Kjf!/(7M"fq_(]`<]arrI`Pp\t6oKDkfZK)e4;!!%ZOrrB/#!/(+I +!eUJ=rr30&6,!Y"hjqg!'u8:rsAc+s+ +JcGWI!eUK*r;QeM!:KjeKC8a?!/(7M"fq_(rr@]NrrE+Pp\t6oKDkfMKDY]SKE(rOXM"Udq>UN0 +!/(:N#D3"Bs8P@bXS)SpeGoUJrsAc+s+>t(!!*%O!;c]rX8r1u!<@cNs8N'!KDGNKK)gQ'rs+/V +63$sN!3H/!$A/?Yrr@]Orr<&4rVlnN!<3!0;ZDB%s8R]Os8N(Os+::OKDkfNK)koN#_N-Wrr@]O +6,!0q!(!Xb!/'81!7g94!<@cLrrI`Pli-s;n,E@fg&HR~> +JcGWI!eC?&r;QeK!:KjeJaWO=!.k+K"f_S&rr@WLrrE+Np\t6oJc5TKJc#KQJcG`MWkJIaq>UN1 +!.k.L#Cuk?s8P=aWqHAnec5^KrsAc+s+,b$!!*%M!;c]rWW;ts!<@]Ls8N'!Jbf +JcGWI!eUK*r;QeM!:KjeKC8a?!/(7M"fq_(rr@]NrrE+Pp\t6oKDkfMKDY]SKE(rOXM"Udq>UN0 +!/(:N#D3"Bs8P@bXS)SpeGoUJrsAc+s+>t(!!*%O!;c]rX8r1u!<@cNs8N'!KDGNKK)gQ'rs+/V +63$sN!3H/!$A/?Yrr@]Orr<&4rVlnN!<3!0;ZDB%s8R]Os8N(Os+::OKDkfNK)koN#_N-Wrr@]O +6,!0q!(!Xb!/'81!7g94!<@cLrrI`Pli-s;n,E@fg&HR~> +JcGWI!eUK*r;QeM!8@G`!/(=O^&P/6s1JDbs8Tb4pAY>L63$tds+C4L#D<'V!3CeQKD>HI!/(:N +#JG`i]tOG3;Y:"h!<)p)!<<(OKDtoOs+:=JrrK2$r;QctKDkiM!!#=\rrTk6KDtlU]g2Y3s1JD1 +rVm4W!<<'!KE&Ub!/(7M!J<];rt&*.K7j4(K)krO!/(;;!!%ZMrrI`Prr37V!<<'!KE&W;qu6\L +]rV/5KAlh1e`Zr5!58:0!J:C +JcGWI!eC?&r;QeK!8@G`!.k1M^Ak25s1SJas8Te5pAY>J5l^kas+1(J#D)pT!31SMJb]6G!.k.L +#JP`h^:sV4]Ms+(1HrrK,"r;QctJc5WK!!#:[rrTn7Jc>ZS^-D\4s1SJ5 +rVm4U!<<'!JcEFa!.k+K!J*N8rt&31JV!k$JH5`M!.k/8!!%TKrrIZNrr37T!<<'!JcEH8qu6\J +^8q86J`6V/f'!&6!5A@1!J(7:rr@W=rr<&Ps*t~> +JcGWI!eUK*r;QeM!8@G`!/(=O^&P/6s1JDbs8Tb4pAY>L63$tds+C4L#D<'V!3CeQKD>HI!/(:N +#JG`i]tOG3;Y:"h!<)p)!<<(OKDtoOs+:=JrrK2$r;QctKDkiM!!#=\rrTk6KDtlU]g2Y3s1JD1 +rVm4W!<<'!KE&Ub!/(7M!J<];rt&*.K7j4(K)krO!/(;;!!%ZMrrI`Prr37V!<<'!KE&W;qu6\L +]rV/5KAlh1e`Zr5!58:0!J:C +JcGWI!eUK*r;QeM!:^!gKDkiN^$u%/K0fNiKE&"Qs+:=NrrI`PpAYeY!58D1s+NqYpu*!/(:Os8N(Os+>t(rVuqN +q>Uj'^&S+bKDtq(6%]/8rVm4W!<9_4^&N_d!!)ut!J:COrt&)A6%f4;K)krO!/(:O]g7;LrrI`P +rr37V!<<'!KE(s;qYpNqX8`3Q^#K%lKBN78!58:0s+BY;!/'b?!!(^PJ,~> +JcGWI!eC?&r;QeK!:^!gJc5WL^@;.0JO'6dJcD_Ms+(1LrrIZNpAYeW!5AJ5s+*E8!.b-$s8N)! +JH3FZrr<&trs+,T!.b-$JQ;IE"G+;e!'pM_$3:,+!.k.M!<5;LqYpu(!.k.Ms8N(Ms+,b$rVuqL +q>Uj'^An4aJc>_$5_/o8rVm4U!<9b5^Aiba!!)ut!J(7Mrt&2E5_8t8JH5`M!.k.M^-I8JrrIZN +rr37T!<<'!JcGa8qYpNqX8`3O^>f.mJ`m%6!5A@1s+0M9!.jV=!!(^PJ,~> +JcGWI!eUK*r;QeM!:^!gKDkiN^$u%/K0fNiKE&"Qs+:=NrrI`PpAYeY!58D1s+NqYpu*!/(:Os8N(Os+>t(rVuqN +q>Uj'^&S+bKDtq(6%]/8rVm4W!<9_4^&N_d!!)ut!J:COrt&)A6%f4;K)krO!/(:O]g7;LrrI`P +rr37V!<<'!KE(s;qYpNqX8`3Q^#K%lKBN78!58:0s+BY;!/'b?!!(^PJ,~> +JcGWI!eUK*r;QeM!:g'i6%f+9!57q&!58@3#/1&ps +KD5BG.K08O!.t:OK0_e$p](8G!rkQ=rr3A>!54!bs8N'!K)iU\s8P@o]`A*4!($WN^&J'u!!)ip +!%IpI#_PGC!/#n(!)idq$A/?YK)krO62uQ;rVlnN!<3!0;F(;rs8R]Os+t$rrGF!XT&9QiVrn1kPkP_^&.j0KBrO;KC]$EKE(t(g&HR~> +JcGWI!eC?&r;QeK!:g'i5_8k6!5A"'!5AF4#/:,;!58Garr3!!JbB'B5RrAF5_/n8JH19$rr?%! +JbT0E./j/N!.b.MJNuJ#p](8E!rkN:rr3A?!5=!as8N'!JH3F[s8P=n^&\35!'pQL^Ae0u!!)ip +!%@jH#_>8@!.f\$!*0!t$@r3WJH5`M5lZB8rVlnL!<3!0`$!<)p-JH3Fa +s+(1Mrr@WMs+,aurrGC!XT&9OiVrn/kPkP_^AIs1Ja<=9Jb&gCJcGb$g&HR~> +JcGWI!eUK*r;QeM!:g'i6%f+9!57q&!58@3#/1&ps +KD5BG.K08O!.t:OK0_e$p](8G!rkQ=rr3A>!54!bs8N'!K)iU\s8P@o]`A*4!($WN^&J'u!!)ip +!%IpI#_PGC!/#n(!)idq$A/?YK)krO62uQ;rVlnN!<3!0;F(;rs8R]Os+t$rrGF!XT&9QiVrn1kPkP_^&.j0KBrO;KC]$EKE(t(g&HR~> +JcGWI!eUK*r;QhN!57t'#!ml-s![r#nG`[*K>%%9a!/(7N!knWarVupap\t@^!58Dbr;['%X8i76!!)lq!3H2" +!/(7N"TO)S!3H/!r;[)9s1JDb5la4Ms8N'&^&S,6!($Va$UFcF!/( +JcGWI!eC?&r;QhL!5A%(#!d`)s!RkunG`[+J\M0aWr@SJrr@WBrt)nqJcGa8!'n7`!.k0$!!#:X +rrB(trs(dhJcC9$!7poEs+(7OJ\M-`!.k+L!l"]crVup`p\t@]!5AJar;['%WW3%5!!)lq!36%u +!.k+L"TO#Q!36"tr;[):s1SJa5QF(Ks8N'&^An55!'pP`$U=]C!.k0M!<7TMJc>ZZJH19$s+(1M +rr@WMs1SL1rrKibXT&9Oir9%nf'!&6!.k%I!C25%rr@WHrrE*brIG-dJQ;aM5hZ0f~> +JcGWI!eUK*r;QhN!57t'#!ml-s![r#nG`[*K>%%9a!/(7N!knWarVupap\t@^!58Dbr;['%X8i76!!)lq!3H2" +!/(7N"TO)S!3H/!r;[)9s1JDb5la4Ms8N'&^&S,6!($Va$UFcF!/( +JcGWI!eUK*r;QeM!:g*gK*2.T.0/o +JcGWI!eC?&r;QeK!:g*gJHPqP-iif;ri5nrs47/K!7q/L!91ut!7o9l!S4:LrrCXJs8K"uf)G[P +WoC%Yf)G[NeuI=#rrCXKs8K#(f)Pd0WrLYMf)G[VeuI=$s444Mrr@WLrrH-"qu6XEXT&9Oir9"0 +k5PG^Jc#HJ +JcGWI!eUK*r;QeM!:g*gK*2.T.0/o +JcGWI!eUK*r;QeM!:g'n6%agiK=q9Trr>@a!!'_3rrGE@IrrE,5qu?\Kli-s;n,EB?g&HR~> +JcGWI!eC?&r;QeK!:g'n5_4LdJ\D-Srr>=`!!'b4rrGB9rr2tLquH`r!C-X9s3puK!.k.L!PSR2 +s8RYPrr@W0rr>=HrrE,6qu?\Ili-s9n,EB=g&HR~> +JcGWI!eUK*r;QeM!:g'n6%agiK=q9Trr>@a!!'_3rrGE@IrrE,5qu?\Kli-s;n,EB?g&HR~> +JcGWI!eUK*r;QhN!57t'"os8U!%IpJnc&`E!<5>Nrr;uurr<"N"2+]J;Z?[sK)j'o!54@[rrBb262( +JcGWI!eC?&r;QhL!5A%("os2S!%@jInc&`C!<5;Lrr;uurr<"L"24cL=ZrrBe35kb3Y^-M[Krr<-#^&\.`!C-Y8rr@W1s8RZ4rrE+Nqu?\Ili-s9n,EB=g&HR~> +JcGWI!eUK*r;QhN!57t'"os8U!%IpJnc&`E!<5>Nrr;uurr<"N"2+]J;Z?[sK)j'o!54@[rrBb262( +JcGWI!eUK*r;QhN!57t'!/(.Knc&`E!<7ZOrr;uurr3.S^&J*4KDkfM!6YsprrfF:s+>sNrr@]3rr@]6rrRfQKDYZL!/'V;!/'e@s1R+cJ,~> +JcGWI!eC?&r;QhL!5A%(!.k"Inc&`C!<7TMrr;uurr3.Q^Ae35Jc5TK!6Ys1[1dJ,~> +JcGWI!eUK*r;QhN!57t'!/(.Knc&`E!<7ZOrr;uurr3.S^&J*4KDkfM!6YsprrfF:s+>sNrr@]3rr@]6rrRfQKDYZL!/'V;!/'e@s1R+cJ,~> +JcGWI!eUK*r;QeM!:g'n]g4saK)boArsFAYs+:<(s+::O^&7m1!;lcr!6Y3!/'G6!eUK*qu6ZsKBrO;^$kt$^"NF9~> +JcGWI!eC?&r;QeK!:g'n^-Fs`JH,]?rsF;Ws+(0$s+(.M^AS!2!;lcr!6Y +JcGWI!eUK*r;QeM!:g'n]g4saK)boArsFAYs+:<(s+::O^&7m1!;lcr!6Y3!/'G6!eUK*qu6ZsKBrO;^$kt$^"NF9~> +JcGWI!eUK*r;QeM!:g*h!!GT?.7&UVrsFAYs+:<(s$6VbKDb`L!;uiuK)iU.rr<%XrrRfQKDb`L +KDPTJ!;c`qKDkfMKC]$F;ZHcL62lMcrr@]4rrKfck5PL8!58:0!<@c +JcGWI!eC?&r;QeK!:g*h!!GQ<-pW@RrsF;Ws+(0$s$-PaJc,NJ!;uiuJH3F-rr<%XrrR`OJc,NJ +JboBH!;c`qJc5TKJb&gD`rr@W2rrKibk5PL6!5A@1!<@]:rr@Vis*t~> +JcGWI!eUK*r;QeM!:g*h!!GT?.7&UVrsFAYs+:<(s$6VbKDb`L!;uiuK)iU.rr<%XrrRfQKDb`L +KDPTJ!;c`qKDkfMKC]$F;ZHcL62lMcrr@]4rrKfck5PL8!58:0!<@c +JcGWI!eUK*r;QeM!:g'h62gib;F0gP#(lpUK)gQ(rVupar;Q`squ6[_K?O8p!/pjX!/(4L!)i[n +!C=Ers8R`Ms8R`DrrIbRrVukLs$>38!/'A4!JA)JrrKe5qYpR^KBrO;K?!qA~> +JcGWI!eC?&r;QeK!:g'h5lL`a +JcGWI!eUK*r;QeM!:g'h62gib;F0gP#(lpUK)gQ(rVupar;Q`squ6[_K?O8p!/pjX!/(4L!)i[n +!C=Ers8R`Ms8R`DrrIbRrVukLs$>38!/'A4!JA)JrrKe5qYpR^KBrO;K?!qA~> +JcGWI!eUK*r;QeM!:^!k]`8$]^$u%/K)kq(!<<'!s+:=Lrr<&rs8R_prr@\0rrE+Pr;Qf!^&.g1 +]n?4^s+C:M!JA)Xrr<&os8R`&rr@]4rr@]5rrTk6^&.g16%eM'!/'b?!/&u)J,~> +JcGWI!eC?&r;QeK!:^!k^&S-]^@;.0JH5_$!<<'!s+(1Jrr<&rs8RYnrr@V.rrE+Nr;Qet^AIp2 +^4H1]s+1.K!J.uWrr<&os8RZ$rr@W2rr@W3rrTn7^AIp25_88$!.jV=!.ii'J,~> +JcGWI!eUK*r;QeM!:^!k]`8$]^$u%/K)kq(!<<'!s+:=Lrr<&rs8R_prr@\0rrE+Pr;Qf!^&.g1 +]n?4^s+C:M!JA)Xrr<&os8R`&rr@]4rr@]5rrTk6^&.g16%eM'!/'b?!/&u)J,~> +JcGWI!eUK*r;QeM!8@G\K)kp;63""ds+:bCs8R`;rr@]?rr@])s*t~> +JcGWI!eC?&r;QeK!8@G\JH5^85l[has+(0arVlitrVltNrr@Vnrr@V.rrE+Nr;QfK5l1K\!;lfr +Jc5TK5kP*VJbT0E!7q/MJ`Qh25ir"I^&YnEs8RZ9rr@W=rr@W's*t~> +JcGWI!eUK*r;QeM!8@G\K)kp;63""ds+:bCs8R`;rr@]?rr@])s*t~> +JcGWI!/(4M!%IjHgA_OH!!#=bs/Z5#5la4MrrTk6KDtlP5l^o-rr@\1rrRfQKDYZK62LT]KDPTJ +62plbK0f21!PJL-rrI`Pf)G`&jSo44jo5@6!;c]r6%eP(s+Be?!/&u)J,~> +JcGWI!.k(K!%@dGgA_OG!!#:as/H)!5QF(KrrTn7Jc>ZN5QCf,rr@V/rrR`OJc#HI5l1K\JboBH +5lUcaJO&o.!PSR.rrIZNf)G`$jSo42jo5@4!;c]r5_8;%s+0Y=!.ii'J,~> +JcGWI!/(4M!%IjHgA_OH!!#=bs/Z5#5la4MrrTk6KDtlP5l^o-rr@\1rrRfQKDYZK62LT]KDPTJ +62plbK0f21!PJL-rrI`Pf)G`&jSo44jo5@6!;c]r6%eP(s+Be?!/&u)J,~> +JcGTHr.=u8rW([P!kj5=rr3/P^&S+b^&@s2K>[]h!0$pZK)gQ$rrKfcqu6]162UZc]g7:'6,!6s +s1S=0s+C:M#JEEUs1O$b^"32`KB3%4^#f7pK)kcJ!<@c +JcGTHr.+i5rW([P!ks5:rr3/Q^An4a^A\'3J]%Kf!0$pZJH18urrKibqu6]25l:Qb^-I7#5ed3s +s1\C1s+1.K#JNHSs1X$a^=N;aJ`Qh2^?,@qJH5QH!<@]:rrBe%rr@W's*t~> +JcGTHr.=u8rW([P!kj5=rr3/P^&S+b^&@s2K>[]h!0$pZK)gQ$rrKfcqu6]162UZc]g7:'6,!6s +s1S=0s+C:M#JEEUs1O$b^"32`KB3%4^#f7pK)kcJ!<@c +JcGEC!/(7Nq>UPL!("@]rr<&qrrTldKDY]K^&.g0^&.g0 +^& +JcGEC!.k+Lq>UPJ!'n9rs8Th4rrBe2JZ&MJ!0$pZJH18trr>=\rr<&qrrTocJc#KI^AIp1^AIp1 +^AWW4rr@W3rr@W2rrIZNqYpQrJ_C)'J_C'R~> +JcGEC!/(7Nq>UPL!("@]rr<&qrrTldKDY]K^&.g0^&.g0 +^& +JcGEC!/(7Nq>UHFrVuparVlluKDtoJ!<<*!!!#?Crr`=S]g7;Lrr<&qrrIbcr;ZeL!55rC +!/'D5!!)*[!eUKdqu6ZsKC&X<^$kt$KA$9T~> +JcGEC!.k+Lq>UHGrVup`rVlluJc>]H!<<*!!!#9crr> +JcGEC!/(7Nq>UHFrVuparVlluKDtoJ!<<*!!!#?Crr`=S]g7;Lrr<&qrrIbcr;ZeL!55rC +!/'D5!!)*[!eUKdqu6ZsKC&X<^$kt$KA$9T~> +JcGEC!7h&Kq#:X#K@KtPs8T/#.K9>T!<3$!s!duuK@Kt@XoAA$N;j"1!.u`s!!=[&K2V]M!`B"r +qZ$UFi_ff0XP3[SKBE17eZ@j3!eUK*qu6ZsKC/[@eGoT%nG`L=g&HR~> +JcGEC!7q,Lq#:X#J^shPs8T)!./s5S!<3$!s![ouJ^sh@XoAA$N;j"2!.cQp!!=X#JQ;]L!`]5# +qZ$UEi`-#1WnRIQJ`ct5euIg2!eC?&qu6ZsJaNI>ec5]$nG`L>g&HR~> +JcGEC!7h&Kq#:X#K@KtPs8T/#.K9>T!<3$!s!duuK@Kt@XoAA$N;j"1!.u`s!!=[&K2V]M!`B"r +qZ$UFi_ff0XP3[SKBE17eZ@j3!eUK*qu6ZsKC/[@eGoT%nG`L=g&HR~> +JcGBBrW)`n$35_Y!/(=OK)bnbrVllu62UZ_!7e4O!!%uX#(lo.K0b-BrVlj`qZ$SJ#62AhK0]LN +\c2Y^k5PEIj8T15!58:0!C;A)s8N'!^%).&KA$9T~> +JcGBBrW)`n$35YW!.k1MJH,\arVllu5l:Q^!7n:P!!%uX#(Zc*JO"d;rVlj_qZ$SH#62DgJNs4L +\c2Y\k5PEHj8T13!5A@1!C25&s8N'!^@D7'J_C'R~> +JcGBBrW)`n$35_Y!/(=OK)bnbrVllu62UZ_!7e4O!!%uX#(lo.K0b-BrVlj`qZ$SJ#62AhK0]LN +\c2Y^k5PEIj8T15!58:0!C;A)s8N'!^%).&KA$9T~> +JcGBBrW)`n"os;U!/(=OrVuqNrVlluKDb`MK)i"Q!!%uX!eUK*T`4ulk5PF6j8T15!/(1K!<@c= +s8N)gs8R`)s*t~> +JcGBBrW)`n"os5S!.k1MrVuqLrVlluJc,NKJH2eO!!%uX!eC?&T`4ulk5PF4j8T13!.k%I!<@]; +s8N)gs8RZ's*t~> +JcGBBrW)`n"os;U!/(=OrVuqNrVlluKDb`MK)i"Q!!%uX!eUK*T`4ulk5PF6j8T15!/(1K!<@c= +s8N)gs8R`)s*t~> +JcGEC!/(7Nq>U]M!<<'!KE(uN!!%ZMs8N)srrE,5XT&8#N;is3!/$sE!!)3^s+BA3!eUKdrVlu5 +K)gPjs8N)gs8R`)s*t~> +JcGEC!.k+Lq>U]N!<<'!JcGcL!!%TKs8N)srrE,6XT&8#N;is1!.ggC!!)3^s+051!eC?crVlu6 +JH18fs8N)gs8RZ's*t~> +JcGEC!/(7Nq>U]M!<<'!KE(uN!!%ZMs8N)srrE,5XT&8#N;is3!/$sE!!)3^s+BA3!eUKdrVlu5 +K)gPjs8N)gs8R`)s*t~> +JcGEC!/(7Nq>Ui(!/(:OKE&Ubs$;;9s8N)trrIa +JcGEC!.k+Lq>Ui&!.k.MJcEFas$2/6s8N)trrI[9X8`/"N;is1!.ggC!!)3^!J.uFrrR`O^A\*2 +!!'b"s8N)gs8RZ's*t~> +JcGEC!/(7Nq>Ui(!/(:OKE&Ubs$;;9s8N)trrIa +JcGEC!/(7Nq>Ui(!<9_4s8R_(s+:=Ms8N)trrE,5X8`/"N;is3!/%!F!keSdkl1X8ir9%3!<)ou +K)k09s+Bh@s+B#)J,~> +JcGEC!.k+Lq>Ui&!<9b5s8RY$s+(1Ks8N)trrE,6X8`/"N;is1!.gjD!knYckl1X6ir9%1!<)ou +JH4s7s+0\>s+/l'J,~> +JcGEC!/(7Nq>Ui(!<9_4s8R_(s+:=Ms8N)trrE,5X8`/"N;is3!/%!F!keSdkl1X8ir9%3!<)ou +K)k09s+Bh@s+B#)J,~> +JcGEC"+pRRKDGNUX8kNd63$sN62s4Nec,UK!<3!#K)bm;XT&8#N;is3!/%!F!eUIQkl1X8ir9(4 +!($U:!C6_Ms8R`@s8R`)s*t~> +JcGEC"+^FPJbfs8RZ's*t~> +JcGEC"+pRRKDGNUX8kNd63$sN62s4Nec,UK!<3!#K)bm;XT&8#N;is3!/%!F!eUIQkl1X8ir9(4 +!($U:!C6_Ms8R`@s8R`)s*t~> +JcGEC"+pRR62CN\XT!kOs8R]Rs+>sSrr<"Nrr3)6K0_f)rr<%XrrRfQK;&;HK)bo9rrKfcir9"2 +q>gJH!($F5rr2u"rr3/8K>%:NKCJp@KA$9T~> +JcGEC"+^FP5l(E[Wr@SKs8RWPs+,aPrr<"Lrr3)7JNuK%rr<%XrrR`OJYE)FJH,]7rrKibir9"0 +q>gJF!'p@2rr2turr3/9J\M.LJai^>J_C'R~> +JcGEC"+pRR62CN\XT!kOs8R]Rs+>sSrr<"Nrr3)6K0_f)rr<%XrrRfQK;&;HK)bo9rrKfcir9"2 +q>gJH!($F5rr2u"rr3/8K>%:NKCJp@KA$9T~> +JcGEC!/(7NMuNbWN;is3!/%!F!eUIQl2Ud9ir9(4!(#$4s+B#)J,~> +JcGEC!.k+LMuNbWN;is1!.gjD!eC=Ol2Ud7ir9(2!'ns3s+/l'J,~> +JcGEC!/(7NMuNbWN;is3!/%!F!eUIQl2Ud9ir9(4!(#$4s+B#)J,~> +JcGEC!/(7NMuNbWN;is3!/%!F!eUIQl2Ld:^#K%mK)j9us+B#)J,~> +JcGEC!.k+LMuNbWN;is1!.gjD!eC=Ol2Ld8^>f.nJH4'ss+/l'J,~> +JcGEC!/(7NMuNbWN;is3!/%!F!eUIQl2Ld:^#K%mK)j9us+B#)J,~> +JcGEC!/(7NMuNbWN;is3!/$sE!<@c:rr>@DrrI`Pd/X,ug&HR~> +JcGEC!.k+LMuNbWN;is1!.ggC!<@]8rr>=CrrIZNd/X,sg&HR~> +JcGEC!/(7NMuNbWN;is3!/$sE!<@c:rr>@DrrI`Pd/X,ug&HR~> +JcGEC!/(7NMuNbWN;is3!/$sE!!)6_!(#TD!J:C!s8R`)s*t~> +JcGEC!.k+LMuNbWN;is1!.ggC!!)6_!'oNC!J(6ts8RZ's*t~> +JcGEC!/(7NMuNbWN;is3!/$sE!!)6_!(#TD!J:C!s8R`)s*t~> +JcGWI"0;J&.K*-F!)eaT!!%uX!eUIQr)2m_s+C?Q!/piXs+AOss4..N"m5jbeH".bs8T1ZrrRfQ +XO7(JKA$9T~> +JcGWI"0)>$./d-H!*+sW!!%uX!eC=Or)N*`s+13M!0-uXs+/Cos474M"lfR^ec=:ds8T+XrrR`O +WmUkHJ_C'R~> +JcGWI"0;J&.K*-F!)eaT!!%uX!eUIQr)2m_s+C?Q!/piXs+AOss4..N"m5jbeH".bs8T1ZrrRfQ +XO7(JKA$9T~> +JcGWI!eUKdr;Qd`!/pjW!0$pZK)e49K)ktRp](9,#H[s=KE(t(^&@s3eV!f"rdtHhK7j3;K>"tp +K*'U'^%d3[^#jqI^&EZLrr@]0rrRfQK@0`!KA$9T~> +JcGWI!eC?cr;Qd_!/pjW!0$pZJH.t6JH5bNp](9-#HIg +JcGWI!eUKdr;Qd`!/pjW!0$pZK)e49K)ktRp](9,#H[s=KE(t(^&@s3eV!f"rdtHhK7j3;K>"tp +K*'U'^%d3[^#jqI^&EZLrr@]0rrRfQK@0`!KA$9T~> +JcGWI!eUKdr;QeM!/pjW!0$pZK)gQ&rrE,$NW/tYi;Wh1!7:cGKA$9T~> +JcGWI!eC?cr;QeK!/pjW!0$pZJH19"rrE,"NW/tYi;Wh/!7:cGJ_C'R~> +JcGWI!eUKdr;QeM!/pjW!0$pZK)gQ&rrE,$NW/tYi;Wh1!7:cGKA$9T~> +JcGWI!eUK*r;QeM!/pjW!0$pZK)gQ&s8Duu]oW0n!9!kYK)gPOs8R`)s*t~> +JcGWI!eC?&r;QeK!/pjW!0$pZJH19"s8Duu^5r9o!9!kYJH18Ks8RZ's*t~> +JcGWI!eUK*r;QeM!/pjW!0$pZK)gQ&s8Duu]oW0n!9!kYK)gPOs8R`)s*t~> +JcGWI!eUK*r;QeM!/pjW!0$pZK)gQ&rr]r4!/$@4!(#QC!J:C!s8R`)s*t~> +JcGWI!eC?&r;QeK!/pjW!0$pZJH19"rr]u8!.g42!'oKB!J(6ts8RZ's*t~> +JcGWI!eUK*r;QeM!/pjW!0$pZK)gQ&rr]r4!/$@4!(#QC!J:C!s8R`)s*t~> +JcGWI!J:CLrrE*cMuNd0N;is3!/(4L!iuBSO8f2Gi;Wh1!7:cGKA$9T~> +JcGWI!J(7JrrE*bMuNd.N;is1!.k(J!ic6OO8f2Fi;Wh/!7:cGJ_C'R~> +JcGWI!J:CLrrE*cMuNd0N;is3!/(4L!iuBSO8f2Gi;Wh1!7:cGKA$9T~> +JcGWI!eUKdr;QctK7X&frrRfQKDb`NX8mm7rrKfci;Wh1!7:`HK>#t +JcGWI!eC?cr;QctJV!idrrR`OJc,NLWW7U3rrKibi;Wh/!7:`HJ\Kh;J,~> +JcGWI!eUKdr;QctK7X&frrRfQKDb`NX8mm7rrKfci;Wh1!7:`HK>#t +JcGWI!eUKdr;QctK7X&frrRfQKDb`NX8mm7rrIbci;Wh1!7:cGKA$9T~> +JcGWI!eC?cr;QctJV!idrrR`OJc,NLWW7U3rrI\bi;Wh/!7:cGJ_C'R~> +JcGWI!eUKdr;QctK7X&frrRfQKDb`NX8mm7rrIbci;Wh1!7:cGKA$9T~> +JcGWI!J:CLrrGE +JcGWI!J(7JrrGB9MuNd.N;is1!.k(J!ic6OOT,<3hu<_.!7:cGJ_C'R~> +JcGWI!J:CLrrGE +JcGWI!J:CLrrE+PMuNbW_>aK8mf*9>iVrt3!/(4L!iuBSOT, +JcGWI!J(7JrrE+NMuNbW_>aK8mf*9 +JcGWI!J:CLrrE+PMuNbW_>aK8mf*9>iVrt3!/(4L!iuBSOT, +JcGWI!J:CLrrE+PMuNbW_>aK8mf*7eiVrt3!/(4L!iuC8OT, +JcGWI!J(7JrrE+NMuNbW_>aK8mf*7eiVrt1!.k(J!ic77OT, +JcGWI!J:CLrrE+PMuNbW_>aK8mf*7eiVrt3!/(4L!iuC8OT, +JcGWI!J:CLrrE+PMuNd0_>aK8mf*7eiVrt3!/(4L!iuBSOT,<5hu<_0!7:cGKA$9T~> +JcGWI!J(7JrrE+NMuNd._>aK8mf*7eiVrt1!.k(J!ic6OOT,<3hu<_.!7:cGJ_C'R~> +JcGWI!J:CLrrE+PMuNd0_>aK8mf*7eiVrt3!/(4L!iuBSOT,<5hu<_0!7:cGKA$9T~> +JcGWI!eUKdr;Qd`K7X'Frr<&qrt#0_6,! +JcGWI!eC?cr;Qd_JV!jDrr<&qrt#0]5ed9u5X9lcs8N*!^-L92rrR`OJc,NLWW7U3rr@W-rrIZN +d/X,sg&HR~> +JcGWI!eUKdr;Qd`K7X'Frr<&qrt#0_6,! +JcGWI!J:CLrrFR$MuNe-_>aK8qu6nRXT-gKs+=5IrrW7!K@T&_!eUK*r;Qi"!/$F6!N^q2rrI`P +d/X,ug&HR~> +JcGWI!J(7JrrFO!MuNe._>aK8qu6nPWrLXMs++2JrrW7$J_&o^!eC?&r;Qhu!.g:4!NL_.rrIZN +d/X,sg&HR~> +JcGWI!J:CLrrFR$MuNe-_>aK8qu6nRXT-gKs+=5IrrW7!K@T&_!eUK*r;Qi"!/$F6!N^q2rrI`P +d/X,ug&HR~> +JcGWI!J:CLrrE+PMuNbW_>aK8qu6nR^&Pc3s+>t%s8N'!^#T+oK)gQ%rrT8%K9?36KAZ\0K)j9u +s+B#)J,~> +JcGWI!J(7JrrE+NMuNbW_>aK8qu6nP^Ako4s+,b!s8N'!^>o4pJH19!rrT2#JW^!4J`$J.JH4's +s+/l'J,~> +JcGWI!J:CLrrE+PMuNbW_>aK8qu6nR^&Pc3s+>t%s8N'!^#T+oK)gQ%rrT8%K9?36KAZ\0K)j9u +s+B#)J,~> +JcGWI!J:CLrrE+PMuNbW_>aK8qu75@62s6's8N*!s1SI4!/!RijSo:6!/(4L!iuBSOoPH6hu +JcGWI!J(7JrrE+NMuNbW_>aK8qu75A5lX*#s8N*!s1\O5!.dCdjSo:4!.k(J!ic6OOoPH4hu +JcGWI!J:CLrrE+PMuNbW_>aK8qu75@62s6's8N*!s1SI4!/!RijSo:6!/(4L!iuBSOoPH6hu +JcGWI!C6__rrE+PMuNbW_>aO%!<%QMrrRfQKDtlQ]`8$ur;Qa_jSo:6!/(4L!iuBSOoGE6hZ!V/ +!7:cGKA$9T~> +JcGWI!C-Y^rrE+NMuNbW_>aO$!<%KKrrR`OJc>ZO^&S-ur;Qa^jSo:4!.k(J!ic6OOoGE4hZ!V- +!7:cGJ_C'R~> +JcGWI!C6__rrE+PMuNbW_>aO%!<%QMrrRfQKDtlQ]`8$ur;Qa_jSo:6!/(4L!iuBSOoGE6hZ!V/ +!7:cGKA$9T~> +JcGWI!eUKdr;QctK8]a0!0$pZK)gQ%rrT8%]oi?pKAZ\0K)j9us+B#)J,~> +JcGWI!eC?cr;QctJW'O.!0$pZJH19!rrT2#^6/HqJ`$J.JH4'ss+/l'J,~> +JcGWI!eUKdr;QctK8]a0!0$pZK)gQ%rrT8%]oi?pKAZ\0K)j9us+B#)J,~> +JcGWI!J:CLrrE+PMuNbWN;is3!/(4L!NZ9_rr@].rrI`Pd/X,ug&HR~> +JcGWI!J(7JrrE+NMuNbWN;is1!.k(J!NH-]rr@W,rrIZNd/X,sg&HR~> +JcGWI!J:CLrrE+PMuNbWN;is3!/(4L!NZ9_rr@].rrI`Pd/X,ug&HR~> +JcGWI!J:CLrrE+PMuNbWN;is3!/(4L!NZ9_rrBahrrI`Pd/X,ug&HR~> +JcGWI!J(7JrrE+NMuNbWN;is1!.k(J!NH-]rrBdirrIZNd/X,sg&HR~> +JcGWI!J:CLrrE+PMuNbWN;is3!/(4L!NZ9_rrBahrrI`Pd/X,ug&HR~> +JcGWI!J:CLrrE+PMuNbW_>jFcnG`K@r;Qc1qu6Z0nG`QB!/(4L!NZ:`rr@]Ls8R_Xrr@].rrI`P +d/X,ug&HR~> +JcGWI!J(7JrrE+NMuNbW_>jFanG`K>r;Qc2qu6Z1nG`Q@!.k(J!NH.^rr@WJs8RYVrr@W,rrIZN +d/X,sg&HR~> +JcGWI!J:CLrrE+PMuNbW_>jFcnG`K@r;Qc1qu6Z0nG`QB!/(4L!NZ:`rr@]Ls8R_Xrr@].rrI`P +d/X,ug&HR~> +JcGWI!C6__rrE+PMuNbW_>aK8rr@ArrI`P +d/X,ug&HR~> +JcGWI!C-Y^rrE+NMuNbW_>aK8rr=@rrIZN +d/X,sg&HR~> +JcGWI!C6__rrE+PMuNbW_>aK8rr@ArrI`P +d/X,ug&HR~> +JcGWIrrDrr!<@b1rr<&8rr<&trrE,5m/I%cl2Ld:!;lcsX8qqn$,-APs8Te4]tK'rrrBb1s8N)t +rrIbc\c2XqhZ!V/!7:cGKA$9T~> +JcGWIrrDrr!<@\/rr<&8rr<&trrE,6m/I%cl2Ld8!;lcsWW;_l$,6GRs8Th5^:o0rrrBe2s8N)t +rrI\b\c2XphZ!V-!7:cGJ_C'R~> +JcGWIrrDrr!<@b1rr<&8rr<&trrE,5m/I%cl2Ld:!;lcsX8qqn$,-APs8Te4]tK'rrrBb1s8N)t +rrIbc\c2XqhZ!V/!7:cGKA$9T~> +JcGWIrrDrr!<@b1rr<&8rr<&trriE&s+:<(rr3'd!/%u`rr@]MrrTk6KDb`L^&J$6]n:sNrr;tM +!7h)K!eUKdr;Qf!!;6@!62s6']n?=b6%]19rr<&ss8PCarrYQ>6+sl0!/'/.!J:C!s8R`)s*t~> +JcGWIrrDrr!<@\/rr<&8rr<&trriE&s+(0$rr3'c!.hl_rr@WKrrTn7Jc,NJ^Ae-7^4CjLrr;tK +!7q/L!eC?cr;Qet!;6@!5lX*#^4H:a5_/q6rr<&ss8P@`rrYN;5eai0!.j#,!J(6ts8RZ's*t~> +JcGWIrrDrr!<@b1rr<&8rr<&trriE&s+:<(rr3'd!/%u`rr@]MrrTk6KDb`L^&J$6]n:sNrr;tM +!7h)K!eUKdr;Qf!!;6@!62s6']n?=b6%]19rr<&ss8PCarrYQ>6+sl0!/'/.!J:C!s8R`)s*t~> +JcGWI!C6__rrE+PMuNbW_>aK8rdtYGKE&VNs$;;;s+C?bKDkfM!;uit!58=1!!*#us$6pC63$t; +!/#o%rr3%P!/(4L!NZ:ors(ji!'ro'rrDrr!J:CMs8R`Orrg"8K0]L'rrI`Pd/X,ug&HR~> +JcGWI!C-Y^rrE+NMuNbW_>aK8rdbMDJcEGLs$2/8s+13aJc5TK!;uit!5AC2!!*#us$-j@5l^k8 +!.f]$rr3%N!.k(J!NH.mrs(gh!'if#rrDrr!J(7Ks8RZMrrg%9JNs4$rrIZNd/X,sg&HR~> +JcGWI!C6__rrE+PMuNbW_>aK8rdtYGKE&VNs$;;;s+C?bKDkfM!;uit!58=1!!*#us$6pC63$t; +!/#o%rr3%P!/(4L!NZ:ors(ji!'ro'rrDrr!J:CMs8R`Orrg"8K0]L'rrI`Pd/X,ug&HR~> +JcGWI!J:CLrrE+PMuNbW_>aT;K<20Rrs=>.s/],us&+KNr;Q`sr;Q`squ6Wrrr3t( +s&/jr!eUK*r;Qf!!;6?sK./5L!<<(OqYpNqr;ZeLs8N4S;QQtM])Mb_hZ!Y0!7fKs!E+R's*t~> +JcGWI!J(7JrrE+NMuNbW_>aT;JZ>aLrs=8-s/K*!s&FWMr;Q`sr;Q`squ6Wrrr3 +JcGWI!J:CLrrE+PMuNbW_>aT;K<20Rrs=>.s/],us&+KNr;Q`sr;Q`squ6Wrrr3t( +s&/jr!eUK*r;Qf!!;6?sK./5L!<<(OqYpNqr;ZeLs8N4S;QQtM])Mb_hZ!Y0!7fKs!E+R's*t~> +JcGWI!J:CLrrE+PMuNbW_>aK8qu?\K!rmn*rr3&56%f.9!!)rs!!)or!!*#u$:4^l]n??;^&S+1 +rr3%P!/(4L!NZ:ors+/Vs+ +JcGWI!J(7JrrE+NMuNbW_>aK8qu?\I!rmh&rr3&65_8n6!!)rs!!)or!!*#u$:+Xk^4H<8^An45 +rr3%N!.k(J!NH.mrs+)Ts+*H8s+1(I!PX-_s8RZMrrKi!\,ZJZhu +JcGWI!J:CLrrE+PMuNbW_>aK8qu?\K!rmn*rr3&56%f.9!!)rs!!)or!!*#u$:4^l]n??;^&S+1 +rr3%P!/(4L!NZ:ors+/Vs+ +JcGWI!J:CLrrE+PMuNbW_>aK8qu7#:6%_J:s8PB;6%f.9!!)rs!!)or!!*#u$:0=E!<<(OKE(sL +rr3"O!;lcsX8qnm#(urh^&S,GqYpQ/r;Zf1rr3'd!!# +JcGWI!J(7JrrE+NMuNbW_>aK8qu7#;5_227s8P?85_8n6!!)rs!!)or!!*#u$:'1B!<<(MJcGaM +rr3"M!;lcsWW;\k#(cfg^An5IqYpQ0r;Zf2rr3'c!!#9qs8RZ-rrIZNdJj9!!!(^PJ,~> +JcGWI!J:CLrrE+PMuNbW_>aK8qu7#:6%_J:s8PB;6%f.9!!)rs!!)or!!*#u$:0=E!<<(OKE(sL +rr3"O!;lcsX8qnm#(urh^&S,GqYpQ/r;Zf1rr3'd!!# +JcGWI!J:CLrrE+PMuNbW_>aMKqYpT0KDkfO]n:t8rr@]LrrBb0rrBb2s8R`JrrCUKrrI`Pr;QhN +.0,J0!JA)CrrGCcdJj9#!!(^PJ,~> +JcGWI!J(7JrrE+NMuNbW_>aMLqYpT1Jc5TM^4Ck5rr@WJrrBe1rrBe3s8RZHrrCXLrrIZNr;QhL +-ifA/!J.uBrrG@bdJj9!!!(^PJ,~> +JcGWI!J:CLrrE+PMuNbW_>aMKqYpT0KDkfO]n:t8rr@]LrrBb0rrBb2s8R`JrrCUKrrI`Pr;QhN +.0,J0!JA)CrrGCcdJj9#!!(^PJ,~> +JcGWI!J:CLrrE+PMuNbWN;ip2!;uiu!%EP^s8R`/rrI`PdJj9]!!(^PJ,~> +JcGWI!J(7JrrE+NMuNbWN;ip0!;uiu!% +JcGWI!J:CLrrE+PMuNbWN;ip2!;uiu!%EP^s8R`/rrI`PdJj9]!!(^PJ,~> +JcGWI!J:CLrrE+PMuNbWN;is3!58C3!keTaO8o64hu<_0!7:`H!(#< +JcGWI!J(7JrrE+NMuNbWN;is1!5AI4!knZcO8o62hu<_.!7:`H!'o6;J,~> +JcGWI!J:CLrrE+PMuNbWN;is3!58C3!keTaO8o64hu<_0!7:`H!(#< +JcGWI!J:CLrrE+PMuNbWN;im1r;Zmb!!(mU!JA)TrrBaOs8R`/rrI`Pd/X+Gg&HR~> +JcGWI!J(7JrrE+NMuNbWN;im/r;Zma!!(mU!J.uSrrBdPs8RZ-rrIZNd/X+Gg&HR~> +JcGWI!J:CLrrE+PMuNbWN;im1r;Zmb!!(mU!JA)TrrBaOs8R`/rrI`Pd/X+Gg&HR~> +JcGWI!J:CLrrE+PMuNbWN;im1q>^MshuE_/nG`NA]uL*PKAZ\1K)iU4rrE*cg&HR~> +JcGWI!J(7JrrE+NMuNbWN;im/q>^MqhuE_-nG`N?^;g3QJ`$J/JH3F3rrE*bg&HR~> +JcGWI!J:CLrrE+PMuNbWN;im1q>^MshuE_/nG`NA]uL*PKAZ\1K)iU4rrE*cg&HR~> +JcGWI!C6__rrE+PMuNbWN;is3!($R9!^Qh"oD\fCpAY-+qu?[^pAY-+rVlr4!/&;ks+B5/!/(.K +$UKDt^"*/_]n:sNs5AS3!(" +JcGWI!C-Y^rrE+NMuNbWN;is1!'pL6!^Hb"oD\fApAY-,qu?[]pAY-,rVlr5!.i/is+0)-!.k"I +$UB8o^=N>a^4CjLs5AM1!'n9Ps*t~> +JcGWI!C6__rrE+PMuNbWN;is3!($R9!^Qh"oD\fCpAY-+qu?[^pAY-+rVlr4!/&;ks+B5/!/(.K +$UKDt^"*/_]n:sNs5AS3!(" +JcGWIrrDrr!<@b2rrKe5N;ip2!;lcs.7*Y,"+rml62poa!<5@brr[m>6,!9t!keR6rr3'd!(" +JcGWIrrDrr!<@\0rrKh6N;ip0!;lcs-p[J*"+`^g5lUf`!<5=arr[g;5ed6t!knX7rr3'c!'n9t +rs1ji!7q2MJH.sTrrKh6hu<_.!;qBL5QHB.rrBe3rrBe2rrBe4JH3F`JcGcFJH3F;s*t~> +JcGWIrrDrr!<@b2rrKe5N;ip2!;lcs.7*Y,"+rml62poa!<5@brr[m>6,!9t!keR6rr3'd!(" +JcGWI!J:CLrrE+PMuNbWN;ip2!;lcs;?6Ci&;1#_K7j4(!58Dbs8PCbrrE#ts+C@O#e^5OK0fP; +K7j($!<@bkrr<&VrrGCcqu?ZrY5a"~> +JcGWI!J(7JrrE+NMuNbWN;ip0!;lcs<<2^l&:sl]JV!k$!5AJas8P@arrE#ts+14M#eg;QJO'88 +JV!^u!<@\irr<&VrrG@bqu?ZrY5a"~> +JcGWI!J:CLrrE+PMuNbWN;ip2!;lcs;?6Ci&;1#_K7j4(!58Dbs8PCbrrE#ts+C@O#e^5OK0fP; +K7j($!<@bkrr<&VrrGCcqu?ZrY5a"~> +JcGWI!J:CLrrE+PMuNbWN;ip2!;lcs;?6Ci#D<'VK7j4(KDb`OKE(s;rVunMs8N(OrW!'es8R_b +qu6ZsK>mijKAZ_/!;lctK)gP-s*t~> +JcGWI!J(7JrrE+NMuNbWN;ip0!;lcs<<2^l#D)pTJV!k$Jc,NMJcGa8rVunKs8N(MrW!'ds8RYa +qu6ZsJ]7WhJ`$M-!;lctJH18)s*t~> +JcGWI!J:CLrrE+PMuNbWN;ip2!;lcs;?6Ci#D<'VK7j4(KDb`OKE(s;rVunMs8N(OrW!'es8R_b +qu6ZsK>mijKAZ_/!;lctK)gP-s*t~> +JcGWI!C6__rrE*cMuNbWN;ip2!;lcs;?6Ci#D<'VK7j4(KDb`P63$sNKDtoNKE(rPK>%3_!/(.J +!!'t;!/'2/!J:CKrrE,5YQ'+~> +JcGWI!C-Y^rrE*bMuNbWN;ip0!;lcs<<2^l#D)pTJV!k$Jc,NN5l^jLJc>]LJcG`NJ\M'^!.k"H +!!'t;!.j&-!J(7IrrE,6YQ'+~> +JcGWI!C6__rrE*cMuNbWN;ip2!;lcs;?6Ci#D<'VK7j4(KDb`P63$sNKDtoNKE(rPK>%3_!/(.J +!!'t;!/'2/!J:CKrrE,5YQ'+~> +JcGWIrrDrr!<@b1rr<%XrrRfQeboFJX8qqn"+r%#XT&5"KDbcL;?;D!rVunMs8NGV.BKW$s8T/u +XK;C#!!'t;!/'2/!J:CKrrE+PYQ'+~> +JcGWIrrDrr!<@\/rr<%XrrR`Of)5OKWW;_l"+_k#WrE"uJc,QJ<<7Y!rVunKs8NGW.&s;us8T*! +WiH$t!!'t;!.j&-!J(7IrrE+NYQ'+~> +JcGWIrrDrr!<@b1rr<%XrrRfQeboFJX8qqn"+r%#XT&5"KDbcL;?;D!rVunMs8NGV.BKW$s8T/u +XK;C#!!'t;!/'2/!J:CKrrE+PYQ'+~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!;6?lKCo3DKD5BJ]n:sNrr3&5K7j.&!56>Ns1R@j!J:CK +rr<&%s*t~> +JcGWIrrDrr!<@\/rr<%XrrIZNqu6[s!;6?lJb9!BJbT0H^4CjLrr3&6JV!e"!5?DOs1[Fk!J(7I +rr<&%s*t~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!;6?lKCo3DKD5BJ]n:sNrr3&5K7j.&!56>Ns1R@j!J:CK +rr<&%s*t~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6\L!;6?l]po$%6/_eC!;c]q!3Z?P~> +JcGWIrrDrr!<@\/rr<%XrrIZNqu6\J!;6?l^75-&5iD\B!;c]q!3Z?P~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6\L!;6?l]po$%6/_eC!;c]q!3Z?P~> +JcGWIrrDrr!<@b1rr<%XrrGCcqu6[p!07'Z!9!nW!;c]q!3Z?P~> +JcGWIrrDrr!<@\/rr<%XrrG@bqu6[s!07'Z!9!nW!;c]q!3Z?P~> +JcGWIrrDrr!<@b1rr<%XrrGCcqu6[p!07'Z!9!nW!;c]q!3Z?P~> +JcGWIrrDrr!<@b's- +JcGWIrrDrr!<@\%s- +JcGWIrrDrr!<@b's- +JcGWIrrDrr!<@b's- +JcGWIrrDrr!<@\%s- +JcGWIrrDrr!<@b's- +JcGWI!J:CLrrE+PMuNdjN;ip2!;lcsK)go2!(#TDrrDrr!eUKdYQ'+~> +JcGWI!J(7JrrE+NMuNdkN;ip0!;lcsJH1]0!'oNCrrDrr!eC?cYQ'+~> +JcGWI!J:CLrrE+PMuNdjN;ip2!;lcsK)go2!(#TDrrDrr!eUKdYQ'+~> +JcGWI!C6__rrE+PMuNbWN;ip2!;lcs;?2^Vs+B>2rrDrr!J:BTs*t~> +JcGWI!C-Y^rrE+NMuNbWN;ip0!;lcs< +JcGWI!C6__rrE+PMuNbWN;ip2!;lcs;?2^Vs+B>2rrDrr!J:BTs*t~> +JcGWI!J:CLrrE+PMuNbWN;ip2!;lcs;?2^V!PO-Fs8N)rrrI`PY5a"~> +JcGWI!J(7JrrE+NMuNbWN;ip0!;lcs< +JcGWI!J:CLrrE+PMuNbWN;ip2!;lcs;?2^V!PO-Fs8N)rrrI`PY5a"~> +JcGWI!C6__rrE+PMuNcCN;ip2!;lcs;?2[U!/';2rrDrr!J:BTs*t~> +JcGWI!C-Y^rrE+NMuNcBN;ip0!;lcs< +JcGWI!C6__rrE+PMuNcCN;ip2!;lcs;?2[U!/';2rrDrr!J:BTs*t~> +JcGWIrrDrr!<@b's- +JcGWIrrDrr!<@\%s- +JcGWIrrDrr!<@b's- +JcGWIrrDrr!<@b's- +JcGWIrrDrr!<@\%s- +JcGWIrrDrr!<@b's- +JcGWIrrDrr!<@b1rr@\1rrI`Pqu6[p!/pjXXOZD3rrDrr!J:BTs*t~> +JcGWIrrDrr!<@\/rr@V/rrIZNqu6[s!/pjXWn-82rrDrr!J(6Rs*t~> +JcGWIrrDrr!<@b1rr@\1rrI`Pqu6[p!/pjXXOZD3rrDrr!J:BTs*t~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!/gdV60/(G!;lcsK)i(SJ,~> +JcGWIrrDrr!<@\/rr<%XrrIZNqu6[s!/gdV5ihtF!;lcsJH2kQJ,~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!/gdV60/(G!;lcsK)i(SJ,~> +JcGWIrrDrr!<>EDrr<%XrrI`Pqu6[p!/^^U^#f:o!;lcsK)i(SJ,~> +JcGWIrrDrr!<>BCrr<%XrrIZNqu6[s!/^^U^?,Cp!;lcsJH2kQJ,~> +JcGWIrrDrr!<>EDrr<%XrrI`Pqu6[p!/^^U^#f:o!;lcsK)i(SJ,~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!/^^V6+uF\rrDrr!J:BTs*t~> +JcGWIrrDrr!<@\/rr<%XrrIZNqu6[s!/^^V5ecC\rrDrr!J(6Rs*t~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!/^^V6+uF\rrDrr!J:BTs*t~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!/^^V]n>JIrrDrr!J:BTs*t~> +JcGWIrrDrr!<@\/rr<%XrrIZNqu6[s!/^^V^4GGHrrDrr!J(6Rs*t~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!/^^V]n>JIrrDrr!J:BTs*t~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!/UXU]g:i]!<@cLrrI`PY5a"~> +JcGWIrrDrr!<@\/rr<%XrrIZNqu6[s!/UXU^-Ll]!<@]JrrIZNY5a"~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!/UXU]g:i]!<@cLrrI`PY5a"~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!/LRT]n>PKrrDrr!J:BTs*t~> +JcGWIrrDrr!<@\/rr<%XrrIZNqu6[s!/LRT^4GMJrrDrr!J(6Rs*t~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!/LRT]n>PKrrDrr!J:BTs*t~> +JcGWIrrDrr!<@b2rrI`PN;ip2!;lcs;?2IO!Na!!rrE*cqu6\L!3Z?P~> +JcGWIrrDrr!<@\0rrIZNN;ip0!;lcs<<.dR!NNlurrE*bqu6\J!3Z?P~> +JcGWIrrDrr!<@b2rrI`PN;ip2!;lcs;?2IO!Na!!rrE*cqu6\L!3Z?P~> +JcGWIrrDrr!<@b1rr>?DrrI`Pqu6[p!/:FR6+uR`!<>F_rrI`PY5a"~> +JcGWIrrDrr!<@\/rr>C^rrIZNY5a"~> +JcGWIrrDrr!<@b1rr>?DrrI`Pqu6[p!/:FR6+uR`!<>F_rrI`PY5a"~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!/1@Q6+uUa!<@cLrrRfQ]s%Hd~> +JcGWIrrDrr!<@\/rr<%XrrIZNqu6[s!/1@Q5ecRa!<@]JrrR`O^9@Qe~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!/1@Q6+uUa!<@cLrrRfQ]s%Hd~> +JcGWIrrDrr!<@b2rrKe5N;ip2!;lcs;?2@L!PLecrrE+Pqu6\L!3Z?P~> +JcGWIrrDrr!<@\0rrKh6N;ip0!;lcs<<.[O!PUhcrrE+Nqu6\J!3Z?P~> +JcGWIrrDrr!<@b2rrKe5N;ip2!;lcs;?2@L!PLecrrE+Pqu6\L!3Z?P~> +JcGWIrrDrr!<@b1rr>?DrrI`Pqu6[p!.t4P]n:t*rrE+Pqu6\L!3Z?P~> +JcGWIrrDrr!<@\/rr> +JcGWIrrDrr!<@b1rr>?DrrI`Pqu6[p!.t4P]n:t*rrE+Pqu6\L!3Z?P~> +JcGWIrrDrr!<@b2rrKe5N;ip2!;lcs;?2:J!<<%NnG`LhKDYZLK)i(SJ,~> +JcGWIrrDrr!<@\0rrKh6N;ip0!;lcs<<.UM!<<%LnG`LhJc#HJJH2kQJ,~> +JcGWIrrDrr!<@b2rrKe5N;ip2!;lcs;?2:J!<<%NnG`LhKDYZLK)i(SJ,~> +JcGWIrrDrr!<@b2rrLXMN;ip2!;lcs;?2:Jrr3,OXK9t7o`"plKDYZLK)kfK!7eLWJ,~> +JcGWIrrDrr!<@\0rrL[NN;ip0!;lcs<<.UMrr3,PWiFY0o`"plJc#HJJH5TI!7nRXJ,~> +JcGWIrrDrr!<@b2rrLXMN;ip2!;lcs;?2:Jrr3,OXK9t7o`"plKDYZLK)kfK!7eLWJ,~> +JcGWIrrDrr!<@b2rrIa +JcGWIrrDrr!<@\0rrI[9N;ip0!;lcs<<.UMqYpYK5X9nprrE+Nqu6hN!.k0$^A`Z`^:+&l~> +JcGWIrrDrr!<@b2rrIa +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!.k1Ds8R]X5la3'K0b,=!!*!a!J<];!!,B +JcGWIrrDrr!<@\/rr<%XrrIZNqu6[s!.k1Ds8RWV5QF'#JO"c7!!*!`!J*N8!!,?9YlB4~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!.k1Ds8R]X5la3'K0b,=!!*!a!J<];!!,B +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!.k02s*t~> +JcGWIrrDrr!<@\/rr<%XrrIZNqu6[s!.k02s*t~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!.k02s*t~> +JcGWIrrDrr!<@b2rrKe5N;ip2!;lcs;?2:JO8j_~> +JcGWIrrDrr!<@\0rrKh6N;ip0!;lcs<<.UMO8j_~> +JcGWIrrDrr!<@b2rrKe5N;ip2!;lcs;?2:JO8j_~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!.k02s*t~> +JcGWIrrDrr!<@\/rr<%XrrIZNqu6[s!.k02s*t~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!.k02s*t~> +JcGWIrrDrr!<@b2rrKe5N;ip2!;lcs;?2:JO8j_~> +JcGWIrrDrr!<@\0rrKh6N;ip0!;lcs<<.UMO8j_~> +JcGWIrrDrr!<@b2rrKe5N;ip2!;lcs;?2:JO8j_~> +JcGWIrrDrr!<@b2rrI`PN;is3!58=1!E&oKs,[21~> +JcGWIrrDrr!<@\0rrIZNN;is1!5AC2!EB,Ns,[21~> +JcGWIrrDrr!<@b2rrI`PN;is3!58=1!E&oKs,[21~> +JcGWIrrDrr!<@b2rrKf!N;ip2!;lcs;?2:JO8j_~> +JcGWIrrDrr!<@\0rrKi!N;ip0!;lcs<<.UMO8j_~> +JcGWIrrDrr!<@b2rrKf!N;ip2!;lcs;?2:JO8j_~> +JcGWIrrDrr!<@b1rr@\1rrI`Pqu6[p!.k02s*t~> +JcGWIrrDrr!<@\/rr@V/rrIZNqu6[s!.k02s*t~> +JcGWIrrDrr!<@b1rr@\1rrI`Pqu6[p!.k02s*t~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!.k02s*t~> +JcGWIrrDrr!<@\/rr<%XrrIZNqu6[s!.k02s*t~> +JcGWIrrDrr!<@b1rr<%XrrI`Pqu6[p!.k02s*t~> +JcGWIrrDrr!<@b2rrKf!N;rp1qu6[p!.k02s*t~> +JcGWIrrDrr!<@\0rrKi!N;rp/qu6[s!.k02s*t~> +JcGWIrrDrr!<@b2rrKf!N;rp1qu6[p!.k02s*t~> +JcGWIrrDrr!<@b2rrK2$N;ip2!;lcs;?2:JO8j_~> +JcGWIrrDrr!<@\0rrK,"N;ip0!;lcs<<.UMO8j_~> +JcGWIrrDrr!<@b2rrK2$N;ip2!;lcs;?2:JO8j_~> +JcGWIrrDrr!<@b2rrKe5N;ip2!;lcs;?2:JO8j_~> +JcGWIrrDrr!<@\0rrKh6N;ip0!;lcs<<.UMO8j_~> +JcGWIrrDrr!<@b2rrKe5N;ip2!;lcs;?2:JO8j_~> +JcGWIrrDrr!<@b2s8R_1rrI`Pqu6[p!.k02s*t~> +JcGWIrrDrr!<@\0s8RY/rrIZNqu6[s!.k02s*t~> +JcGWIrrDrr!<@b2s8R_1rrI`Pqu6[p!.k02s*t~> +JcGWIrrDrr!<@b1rrB`krrI`Pqu6[pK7X&`s*t~> +JcGWIrrDrr!<@\/rrBclrrIZNqu6[sJV!i^s*t~> +JcGWIrrDrr!<@b1rrB`krrI`Pqu6[pK7X&`s*t~> +JcGWIrrDrr!<@b's- +JcGWIrrDrr!<@\%s- +JcGWIrrDrr!<@b's- +JcGWIrrDrr!<@b's- +JcGWIrrDrr!<@\%s- +JcGWIrrDrr!<@b's- +JcGWIrrDrr!<@b2s8Tcks8N)rrrH!tJcFF's+@l^J,~> +JcGWIrrDrr!<@\0s8Tfls8N)rrrH+"JcFF's+.`\J,~> +JcGWIrrDrr!<@b2s8Tcks8N)rrrH!tJcFF's+@l^J,~> +JcGWIrrDrr!<@b2rrKe5N;ip2!;lcs;?2:Jmf*WHs+C@O^&N^N!58@2!58=1!<>Fbrr^f(K>#)# +J,~> +JcGWIrrDrr!<@\0rrKh6N;ip0!;lcs<<.UMmf*WFs+14M^AiaL!5AF3!5AC2!<>Carr^i'J\Jr" +J,~> +JcGWIrrDrr!<@b2rrKe5N;ip2!;lcs;?2:Jmf*WHs+C@O^&N^N!58@2!58=1!<>Fbrr^f(K>#)# +J,~> +JcGWIrrDrr!<@b2rrKf!N;ip262UZ_;?2:Jmf*PYrrB`bKDtqbqu6Wrr;ZeLrr3'us8R_es*t~> +JcGWIrrDrr!<@\0rrKi!N;ip05l:Q^<<.UMmf*PXrrBcaJc>_aqu6Wrr;ZeJrr3(#s8RYcs*t~> +JcGWIrrDrr!<@b2rrKf!N;ip262UZ_;?2:Jmf*PYrrB`bKDtqbqu6Wrr;ZeLrr3'us8R_es*t~> +JcGWIrrDrr!<@b's-@_rrIbcrr3'u!!'^Js*t~> +JcGWIrrDrr!<@\%s-=^rrI\brr3(#!!'aKs*t~> +JcGWIrrDrr!<@b's-@_rrIbcrr3'u!!'^Js*t~> +JcGWIrrDrr!<@b's-@_rrIbc\c70~> +JcGWIrrDrr!<@\%s-=^rrI\b\c70~> +JcGWIrrDrr!<@b's-@_rrIbc\c70~> +JcGWIrrDrr!<@b's-surr@]Lrr@]Mrr@\bs*t~> +JcGWIrrDrr!<@\%s- +JcGWIrrDrr!<@b's-surr@]Lrr@]Mrr@\bs*t~> +JcGWIrrDrr!<@b2rrKfcN;rp1qu6[p!.k1;rrUaN^%VI+^&7m1^&@s5eUp0$_#Jo~> +JcGWIrrDrr!<@\0rrKibN;rp/qu6[s!.k1;rrUdO^@qR,^AS!2^A\'6eq$*#_#Jo~> +JcGWIrrDrr!<@b2rrKfcN;rp1qu6[p!.k1;rrUaN^%VI+^&7m1^&@s5eUp0$_#Jo~> +JcGWIrrDrr!<@b2rrIa$N;rp1qu6[pK7X&`s*t~> +JcGWIrrDrr!<@\0rrI[!N;rp/qu6[sJV!i^s*t~> +JcGWIrrDrr!<@b2rrIa$N;rp1qu6[pK7X&`s*t~> +JcGWIrrDrr!<@b1rr@\1rrE+Pqu6[pK7X&`s*t~> +JcGWIrrDrr!<@\/rr@V/rrE+Nqu6[sJV!i^s*t~> +JcGWIrrDrr!<@b1rr@\1rrE+Pqu6[pK7X&`s*t~> +JcGWIrrDrr!<@b2rrKf!N;inYKDYZL;M0Q#O8j_~> +JcGWIrrDrr!<@\0rrKi!N;inYJc#HJ +JcGWIrrDrr!<@b2rrKf!N;inYKDYZL;M0Q#O8j_~> +JcGWIrrDrr!<@b2rrKe5N;rnXqu6[pK7X'Ws8R`KrrKfc^]/f~> +JcGWIrrDrr!<@\0rrKh6N;rnXqu6[sJV!jUs8RZIrrKib^]/f~> +JcGWIrrDrr!<@b2rrKe5N;rnXqu6[pK7X'Ws8R`KrrKfc^]/f~> +JcGWIrrDrr!<@b2rrI`PN;inY62UZ_;M0Q#g].;+qu?\K^]/f~> +JcGWIrrDrr!<@\0rrIZNN;inY5l:Q^ +JcGWIrrDrr!<@b2rrI`PN;inY62UZ_;M0Q#g].;+qu?\K^]/f~> +JcGWI!<@cLrrE+PN;ip26&bgE!/(1K!E+Q$s6]gfK0d3MrrRg=62gfh]n:t;s+ +JcGWI!<@]JrrE+NN;ip05`G^D!.k%I!EF]%s6]gfJO$sKrrRa:5lL]g^4Ck8s+*FdJc5WKJc5TM +^4F# +JcGWI!<@cLrrE+PN;ip26&bgE!/(1K!E+Q$s6]gfK0d3MrrRg=62gfh]n:t;s+ +JcGWI!<@cMrrTk6K8]a0K8fj1KDYZL;F,m6mJd6?s$?Ya&4-?0!<<)#^&J(bs+#>*J,~> +JcGWI!<@]KrrTn7JW'O.JW0X/Jc#HJ +JcGWI!<@cMrrTk6K8]a0K8fj1KDYZL;F,m6mJd6?s$?Ya&4-?0!<<)#^&J(bs+#>*J,~> +JcGWI!<>F_rrE+PMuNbWN;rp1qu6[p!.k1;ru3D>!/(=OKE(s;s8Q!ss+C@OK7j4(K>% +JcGWI!<>C^rrE+NMuNbWN;rp/qu6[s!.k1;ru3A;!.k1MJcGa8s8Q+!s+14MJV!k$J\M0aJV!h# +"G&gh5X +JcGWI!<>F_rrE+PMuNbWN;rp1qu6[p!.k1;ru3D>!/(=OKE(s;s8Q!ss+C@OK7j4(K>% +JcGWIrrDrr!<@b2rrKe5N;inYKDYZL;M0Q#mf*=$KDb`a^&S*us8Q!ss+C@OK7j4(K7j4(K7j1' +rIY*`a8^Y~> +JcGWIrrDrr!<@\0rrKh6N;inYJc#HJ +JcGWIrrDrr!<@b2rrKe5N;inYKDYZL;M0Q#mf*=$KDb`a^&S*us8Q!ss+C@OK7j4(K7j4(K7j1' +rIY*`a8^Y~> +JcGWI!<>F_rrE+PN;iplK8fg2K)kfK!E+Q$s6]gdKDb`]KE(s;s8T2#s+A#bK7j4(6,!9t!/(:N +!56;MJ,~> +JcGWI!<>C^rrE+NN;ipmJW0U0JH5TI!EF]%s6]gdJc,N[JcGa8s8T,!s+.oaJV!k$5ed6t!.k.L +!5?ANJ,~> +JcGWI!<>F_rrE+PN;iplK8fg2K)kfK!E+Q$s6]gdKDb`]KE(s;s8T2#s+A#bK7j4(6,!9t!/(:N +!56;MJ,~> +JcGWI!<>F_rrE+PN;ip2!0$pY6%f(7!E+Q$s6]h%.D8$\s8Te4s$?\beNngR63"UuK0d3Lrr@]N +rrg#$]n=#=s*t~> +JcGWI!<>C^rrE+NN;ip0!0$pY5_8h4!EF]%s6]h%.)%s\s8Th5s$6Vaej+dO5l\OuJO$sJrr@WL +rrg&$^4F#=s*t~> +JcGWI!<>F_rrE+PN;ip2!0$pY6%f(7!E+Q$s6]h%.D8$\s8Te4s$?\beNngR63"UuK0d3Lrr@]N +rrg#$]n=#=s*t~> +JcGWI!<>F_rrE+PN;rp1N;inYKDYZL;?2:JO8j_~> +JcGWI!<>C^rrE+NN;rp/N;inYJc#HJ<<.UMO8j_~> +JcGWI!<>F_rrE+PN;rp1N;inYKDYZL;?2:JO8j_~> +JcGWIrrDrr!<@b2s8R_1rrE+Pqu6[pK7X&`s*t~> +JcGWIrrDrr!<@\0s8RY/rrE+Nqu6[sJV!i^s*t~> +JcGWIrrDrr!<@b2s8R_1rrE+Pqu6[pK7X&`s*t~> +JcGWIrrDrr!<@b2rrKfcN;inYKDYZL;M0Q#O8j_~> +JcGWIrrDrr!<@\0rrKibN;inYJc#HJ +JcGWIrrDrr!<@b2rrKfcN;inYKDYZL;M0Q#O8j_~> +JcGWIrrDrr!<@b2rrIa +JcGWIrrDrr!<@\0rrI[9N;ioDJc#HJ +JcGWIrrDrr!<@b2rrIa +JcGWI!<>F_rrE+PN;rp1N;ioEKDYZL;M0Q#O8j_~> +JcGWI!<>C^rrE+NN;rp/N;ioDJc#HJ +JcGWI!<>F_rrE+PN;rp1N;ioEKDYZL;M0Q#O8j_~> +JcGWIrrDus!keSdMuNd0N;inYKDYZL;M0Q#O8j_~> +JcGWIrrDus!knYcMuNd.N;inYJc#HJ +JcGWIrrDus!keSdMuNd0N;inYKDYZL;M0Q#O8j_~> +JcGWIrrDrr!<@b2rrKfcN;inYKDYZL;M0Q#O8j_~> +JcGWIrrDrr!<@\0rrKibN;inYJc#HJ +JcGWIrrDrr!<@b2rrKfcN;inYKDYZL;M0Q#O8j_~> +JcGWIrrDrr!<@b2s8R_1rrE+Pqu6[pK7X&`s*t~> +JcGWIrrDrr!<@\0s8RY/rrE+Nqu6[sJV!i^s*t~> +JcGWIrrDrr!<@b2s8R_1rrE+Pqu6[pK7X&`s*t~> +JcGWI!<>F_rrE+PN;rp1N;inY62UZ_;F,m6O8j_~> +JcGWI!<>C^rrE+NN;rp/N;inY5l:Q^ +JcGWI!<>F_rrE+PN;rp1N;inY62UZ_;F,m6O8j_~> +JcGWI!<>F_rrE+PN;rp1N;inYKDYZL;M0Q#O8j_~> +JcGWI!<>C^rrE+NN;rp/N;inYJc#HJ +JcGWI!<>F_rrE+PN;rp1N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@cLrrE+PN;ip2]o;sl!($M^!E+Q$s,[21~> +JcGWI!<@]JrrE+NN;ip0^5W'm!'pG]!EF]%s,[21~> +JcGWI!<@cLrrE+PN;ip2]o;sl!($M^!E+Q$s,[21~> +JcGWI!<@cLrrE+PN;im1MuNeXKDYZL;M0Q#O8j_~> +JcGWI!<@]JrrE+NN;im/MuNeXJc#HJ +JcGWI!<@cLrrE+PN;im1MuNeXKDYZL;M0Q#O8j_~> +JcGWI!<@cLrrE+PN;im1MuNeXKDYZL;M0Q#O8j_~> +JcGWI!<@]JrrE+NN;im/MuNeXJc#HJ +JcGWI!<@cLrrE+PN;im1MuNeXKDYZL;M0Q#O8j_~> +JcGWI!<@cLrrE+PN;iplK8fg2!/(1K!E+Q$s,[21~> +JcGWI!<@]JrrE+NN;ipmJW0U0!.k%I!EF]%s,[21~> +JcGWI!<@cLrrE+PN;iplK8fg2!/(1K!E+Q$s,[21~> +JcGWI! +JcGWI! +JcGWI! +JcGWI!<@cLrrE+PN;rpkN;inYKDYZL;M0Q#O8j_~> +JcGWI!<@]JrrE+NN;rplN;inYJc#HJ +JcGWI!<@cLrrE+PN;rpkN;inYKDYZL;M0Q#O8j_~> +JcGWI!<@cLrrE+PJcD#8!<@cLrrH#MJcCf2J,~> +JcGWI!<@]JrrE+NJcD#8!<@]JrrH,NJcCf2J,~> +JcGWI!<@cLrrE+PJcD#8!<@cLrrH#MJcCf2J,~> +JcGWI!<@cLrrE+PJcD#8!<@cLrrH!tJcCf2J,~> +JcGWI!<@]JrrE+NJcD#8!<@]JrrH+"JcCf2J,~> +JcGWI!<@cLrrE+PJcD#8!<@cLrrH!tJcCf2J,~> +JcGWI!<@cLrrE+PN;imkMuNeXKDYZL;M0Q#O8j_~> +JcGWI!<@]JrrE+NN;imlMuNeXJc#HJ +JcGWI!<@cLrrE+PN;imkMuNeXKDYZL;M0Q#O8j_~> +JcGWI!<@cLrrE+PN;rp1N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@]JrrE+NN;rp/N;inYJc#HJ +JcGWI!<@cLrrE+PN;rp1N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@cLrrE+PN;rp1N;inY62UZ_;M0Q#O8j_~> +JcGWI!<@]JrrE+NN;rp/N;inY5l:Q^ +JcGWI!<@cLrrE+PN;rp1N;inY62UZ_;M0Q#O8j_~> +JcGWI!<@cLrrE+PN;rpkN;inYKDYZL;M0Q#O8j_~> +JcGWI!<@]JrrE+NN;rplN;inYJc#HJ +JcGWI!<@cLrrE+PN;rpkN;inYKDYZL;M0Q#O8j_~> +JcGWI!<@cMrrTk6K7X&frrE+Pqu6[pK7X&`s*t~> +JcGWI!<@]KrrTn7JV!idrrE+Nqu6[sJV!i^s*t~> +JcGWI!<@cMrrTk6K7X&frrE+Pqu6[pK7X&`s*t~> +JcGWI!<@cMrrTk6K7X&frrE+Pqu6[pK7X&`s*t~> +JcGWI!<@]KrrTn7JV!idrrE+Nqu6[sJV!i^s*t~> +JcGWI!<@cMrrTk6K7X&frrE+Pqu6[pK7X&`s*t~> +JcGWI!<@cMrrRfQK8fg1]o2mk!/(1K!E+Q$s,[21~> +JcGWI!<@]KrrR`OJW0U/^5N!l!.k%I!EF]%s,[21~> +JcGWI!<@cMrrRfQK8fg1]o2mk!/(1K!E+Q$s,[21~> +JcGWI!<@cLrrE+PN;rp1N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@]JrrE+NN;rp/N;inYJc#HJ +JcGWI!<@cLrrE+PN;rp1N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@cMrrT8%K8fj1K8fg2!/(1K!E+Q$s,[21~> +JcGWI!<@]KrrT2#JW0X/JW0U0!.k%I!EF]%s,[21~> +JcGWI!<@cMrrT8%K8fj1K8fg2!/(1K!E+Q$s,[21~> +JcGWI!<@cMrrTk6K8fg1K8]a1!/(1K!E+Q$s,[21~> +JcGWI!<@]KrrTn7JW0U/JW'O/!.k%I!EF]%s,[21~> +JcGWI!<@cMrrTk6K8fg1K8]a1!/(1K!E+Q$s,[21~> +JcGWI!<@cMrrTk6]o;slK>!6D!<>F_rrH#MJcCf2J,~> +JcGWI!<@]KrrTn7^5W'mJ\I*C!<>C^rrH,NJcCf2J,~> +JcGWI!<@cMrrTk6]o;slK>!6D!<>F_rrH#MJcCf2J,~> +JcGWI!<@cLrrE+PN;rp1N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@]JrrE+NN;rp/N;inYJc#HJ +JcGWI!<@cLrrE+PN;rp1N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@cLrrE+PN;rp1N;inYKDYZL;F,m6O8j_~> +JcGWI!<@]JrrE+NN;rp/N;inYJc#HJ +JcGWI!<@cLrrE+PN;rp1N;inYKDYZL;F,m6O8j_~> +JcGWI!<@cMrrKe5MuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@]KrrKh6MuWg.N;inYJc#HJ +JcGWI!<@cMrrKe5MuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@cMrrTk6]o;slK>!6D!<@cLrrH!tJcCf2J,~> +JcGWI!<@]KrrTn7^5W'mJ\I*C!<@]JrrH+"JcCf2J,~> +JcGWI!<@cMrrTk6]o;slK>!6D!<@cLrrH!tJcCf2J,~> +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;F,m6O8j_~> +JcGWI!<@]KrrIZNMuWg.N;inYJc#HJ +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;F,m6O8j_~> +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@]KrrIZNMuWg.N;inYJc#HJ +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@]KrrIZNMuWg.N;inYJc#HJ +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@]KrrIZNMuWg.N;inYJc#HJ +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@cMrrI`PMuWg0N;inY62UZ_;M0Q#O8j_~> +JcGWI!<@]KrrIZNMuWg.N;inY5l:Q^ +JcGWI!<@cMrrI`PMuWg0N;inY62UZ_;M0Q#O8j_~> +JcGWI!<@cMrrI`PMuNd0MuNeXKDYZL;M0Q#O8j_~> +JcGWI!<@]KrrIZNMuNd.MuNeXJc#HJ +JcGWI!<@cMrrI`PMuNd0MuNeXKDYZL;M0Q#O8j_~> +JcGWI!<@cMrrI`PMuNg1XGm/[!/(1K!E+Q$s,[21~> +JcGWI!<@]KrrIZNMuNg/Wf6rY!.k%I!EF]%s,[21~> +JcGWI!<@cMrrI`PMuNg1XGm/[!/(1K!E+Q$s,[21~> +JcGWI!<@cMrrI`PMuNg1]o;sl!/(1K!E+Q$s,[21~> +JcGWI!<@]KrrIZNMuNg/^5W'm!.k%I!EF]%s,[21~> +JcGWI!<@cMrrI`PMuNg1]o;sl!/(1K!E+Q$s,[21~> +JcGWI!<@cMrrI`PMuNg1]o;sl!/(1K!E+Q$s,[21~> +JcGWI!<@]KrrIZNMuNg/^5W'm!.k%I!EF]%s,[21~> +JcGWI!<@cMrrI`PMuNg1]o;sl!/(1K!E+Q$s,[21~> +JcGWI!<>F`rrI`PMuNg1]o;sl!/(1K!E+Q$s,[21~> +JcGWI!<>C_rrIZNMuNg/^5W'm!.k%I!EF]%s,[21~> +JcGWI!<>F`rrI`PMuNg1]o;sl!/(1K!E+Q$s,[21~> +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@]KrrIZNMuWg.N;inYJc#HJ +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@]KrrIZNMuWg.N;inYJc#HJ +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@cMrrI`PMuWg0N;inYKDYZK;M"k.s*t~> +JcGWI!<@]KrrIZNMuWg.N;inYJc#HI +JcGWI!<@cMrrI`PMuWg0N;inYKDYZK;M"k.s*t~> +JcGWI!<@cMrrKe5MuWg0N;inYKDYZL;S@Y]O8j_~> +JcGWI!<@]KrrKh6MuWg.N;inYJc#HJ +JcGWI!<@cMrrKe5MuWg0N;inYKDYZL;S@Y]O8j_~> +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@]KrrIZNMuWg.N;inYJc#HJ +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@]KrrIZNMuWg.N;inYJc#HJ +JcGWI!<@cMrrI`PMuWg0N;inYKDYZL;M0Q#O8j_~> +JcGWI!<@cMrrPId]o +JcGWI!<@]KrrPFc^5W*lJW0U0!.k%I!EHjbs,[21~> +JcGWI!<@cMrrPId]o +JcGWI!<@cMrrRfQ]o +JcGWI!<@]KrrR`O^5W*lJW0U0!.k%I!EHjbs,[21~> +JcGWI!<@cMrrRfQ]o +JcGZJ!keSdr;QeM!/pjXK>!6D!<@cLrr>rJs,R,0~> +JcGZJ!knYcr;QeK!/pjXJ\I*C!<@]Jrr?&Ms,R,0~> +JcGZJ!keSdr;QeM!/pjXK>!6D!<@cLrr>rJs,R,0~> +JcGZJ!S%2IrrI`PMuNe-MuNeXKDYZL;Up?uO8j_~> +JcGZJ!S.8JrrIZNMuNe.MuNeXJc#HJ +JcGZJ!S%2IrrI`PMuNe-MuNeXKDYZL;Up?uO8j_~> +JcGZJ!eUKdr;QhN!/#k&Q2^jbKDYZL;S@Y]O8j_~> +JcGZJ!eC?cr;QhL!.f_$Q2^jbJc#HJ +JcGZJ!eUKdr;QhN!/#k&Q2^jbKDYZL;S@Y]O8j_~> +JcGWI!<@cMrrI`PJcCu7!<@cLrr=L!s,R,0~> +JcGWI!<@]KrrIZNJcCu7!<@]Jrr=Hus,R,0~> +JcGWI!<@cMrrI`PJcCu7!<@cLrr=L!s,R,0~> +JcGZJ!keSdr;QeM!/pjXK>!6D!<@cLrr=L!s,R,0~> +JcGZJ!knYcr;QeK!/pjXJ\I*C!<@]Jrr=Hus,R,0~> +JcGZJ!keSdr;QeM!/pjXK>!6D!<@cLrr=L!s,R,0~> +JcGZJ!eUKdr;QeM!/pmWK8fg2!/(1K!!%TMNrOV~> +JcGZJ!eC?cr;QeK!/pmWJW0U0!.k%I!!%TMNrOV~> +JcGZJ!eUKdr;QeM!/pmWK8fg2!/(1K!!%TMNrOV~> +JcGWI! +JcGWI! +JcGWI! +JcGZJ!keSdr;QeM!.k07rrE+Pqu6[pK7X&`s*t~> +JcGZJ!knYcr;QeK!.k07rrE+Nqu6[sJV!i^s*t~> +JcGZJ!keSdr;QeM!.k07rrE+Pqu6[pK7X&`s*t~> +JcGZJ!keTIr;QeM!.k07rrE+Pqu6XFJcCc1J,~> +JcGZJ!knZKr;QeK!.k07rrE+Nqu6XEJcCc1J,~> +JcGZJ!keTIr;QeM!.k07rrE+Pqu6XFJcCc1J,~> +JcGWI!!)or!J:B's-3Na!/(1K! +JcGWI!!)or!J(6%s-3Na!.k%I! +JcGWI!!)or!J:B's-3Na!/(1K! +JcGZJ!eUK*r;QhN!54?k!/$40!<@cLrrFR$JcCf2J,~> +JcGZJ!eC?&r;QhL!5=El!.g(.!<@]JrrFO!JcCf2J,~> +JcGZJ!eUK*r;QhN!54?k!/$40!<@cLrrFR$JcCf2J,~> +JcGZJ!eUK*r;QeM!/pmWK8fg2!/(1K!%EL!NrOV~> +JcGZJ!eC?&r;QeK!/pmWJW0U0!.k%I!% +JcGZJ!eUK*r;QeM!/pmWK8fg2!/(1K!%EL!NrOV~> +JcGZJ!J:CLrrI`PMuWg0N;inYKDYZK!.k01s*t~> +JcGZJ!J(7JrrIZNMuWg.N;inYJc#HI!.k01s*t~> +JcGZJ!J:CLrrI`PMuWg0N;inYKDYZK!.k01s*t~> +JcGZJ!J:CLrrI`PMuNd0MuNeXKDYZL(tF3;O8j_~> +JcGZJ!J(7JrrIZNMuNd.MuNeXJc#HJ*7f]@O8j_~> +JcGZJ!J:CLrrI`PMuNd0MuNeXKDYZL(tF3;O8j_~> +JcGZJ!J:CLrrI`PMuNd0MuNeXKDYZK!.k01s*t~> +JcGZJ!J(7JrrIZNMuNd.MuNeXJc#HI!.k01s*t~> +JcGZJ!J:CLrrI`PMuNd0MuNeXKDYZK!.k01s*t~> +JcGZJ!PJL1rrI`PMuWg0N;inYKDYZK!.k01s*t~> +JcGZJ!PSR2rrIZNMuWg.N;inYJc#HI!.k01s*t~> +JcGZJ!PJL1rrI`PMuWg0N;inYKDYZK!.k01s*t~> +JcGZJ!J:CLrrI`PMuNg1]o;sl!/(1K!!%TMNrOV~> +JcGZJ!J(7JrrIZNMuNg/^5W'm!.k%I!!%TMNrOV~> +JcGZJ!J:CLrrI`PMuNg1]o;sl!/(1K!!%TMNrOV~> +JcGZJ!eUKdr;ZcsMuNd0MuNeXKDYZK!.k01s*t~> +JcGZJ!eC?cr;ZcsMuNd.MuNeXJc#HI!.k01s*t~> +JcGZJ!eUKdr;ZcsMuNd0MuNeXKDYZK!.k01s*t~> +JcGZJ!J:CLrrI`PMuNd0MuNeXKDYZK!.k01s*t~> +JcGZJ!J(7JrrIZNMuNd.MuNeXJc#HI!.k01s*t~> +JcGZJ!J:CLrrI`PMuNd0MuNeXKDYZK!.k01s*t~> +JcGZJ!J:CLrrI`PMuWg0N;inYKDYZK!.k01s*t~> +JcGZJ!J(7JrrIZNMuWg.N;inYJc#HI!.k01s*t~> +JcGZJ!J:CLrrI`PMuWg0N;inYKDYZK!.k01s*t~> +JcGZJ!J:CLrrI`PMuNd0MuNeXKDYZK!.k01s*t~> +JcGZJ!J(7JrrIZNMuNd.MuNeXJc#HI!.k01s*t~> +JcGZJ!J:CLrrI`PMuNd0MuNeXKDYZK!.k01s*t~> +JcGZJ!eUK*r;QeM!/pjXK>!9E!eUK*qu6WrJcCc1J,~> +JcGZJ!eC?&r;QeK!/pjXJ\I-D!eC?&qu6WrJcCc1J,~> +JcGZJ!eUK*r;QeM!/pjXK>!9E!eUK*qu6WrJcCc1J,~> +JcGZJ!J:CLrrI`PMuWg0N;inYKDYZK!.k01s*t~> +JcGZJ!J(7JrrIZNMuWg.N;inYJc#HI!.k01s*t~> +JcGZJ!J:CLrrI`PMuWg0N;inYKDYZK!.k01s*t~> +JcGZJ!J:CLrrI`PMuNg1]o;sl!/(1K! +JcGZJ!J(7JrrIZNMuNg/^5W'm!.k%I! +JcGZJ!J:CLrrI`PMuNg1]o;sl!/(1K! +JcGZJ!J:CLrrI`PMuNd0MuNeXKDYZL!/#k&O8j_~> +JcGZJ!J(7JrrIZNMuNd.MuNeXJc#HJ!.f_$O8j_~> +JcGZJ!J:CLrrI`PMuNd0MuNeXKDYZL!/#k&O8j_~> +JcGZJ!J:CLrrI`PMuNg1]o;sl!/(1K! +JcGZJ!J(7JrrIZNMuNg/^5W'm!.k%I! +JcGZJ!J:CLrrI`PMuNg1]o;sl!/(1K! +JcGZJ!iuBSr;QeM!/pjXK<1%3!<@cLrrE,MJcCf2J,~> +JcGZJ!ic6Or;QeK!/pjXJZ=\/!<@]JrrE,NJcCf2J,~> +JcGZJ!iuBSr;QeM!/pjXK<1%3!<@cLrrE,MJcCf2J,~> +JcGZJ!eUK*r;QeM!/pjWK8]a1!/(1K! +JcGZJ!eC?&r;QeK!/pjWJW'O/!.k%I! +JcGZJ!eUK*r;QeM!/pjWK8]a1!/(1K! +JcGZJ!J:CLrrI`PMuNbWN;ism!/(1K!!%TMNrOV~> +JcGZJ!J(7JrrIZNMuNbWN;isn!.k%I!!%TMNrOV~> +JcGZJ!J:CLrrI`PMuNbWN;ism!/(1K!!%TMNrOV~> +JcGZJ!J:CLrrI`PMuNcCMuNeXKDYZK!.k01s*t~> +JcGZJ!J(7JrrIZNMuNcBMuNeXJc#HI!.k01s*t~> +JcGZJ!J:CLrrI`PMuNcCMuNeXKDYZK!.k01s*t~> +JcGZJ!eUKdr;QeM!/pjW6&YaD!/(1K!<@b's,[21~> +JcGZJ!eC?cr;QeK!/pjW5`>XC!.k%I!<@\%s,[21~> +JcGZJ!eUKdr;QeM!/pjW6&YaD!/(1K!<@b's,[21~> +JcGZJ!J:CLrrI`PMuNcCMuNeXKDYZL!/#k&O8j_~> +JcGZJ!J(7JrrIZNMuNcBMuNeXJc#HJ!.f_$O8j_~> +JcGZJ!J:CLrrI`PMuNcCMuNeXKDYZL!/#k&O8j_~> +JcGZJ!J:CLrrI`PMuNd0MuNeXKDYZL!53s`O8j_~> +JcGZJ!J(7JrrIZNMuNd.MuNeXJc#HJ!5=$aO8j_~> +JcGZJ!J:CLrrI`PMuNd0MuNeXKDYZL!53s`O8j_~> +JcGZJ!J:CLrrI`PMuNd0MuNeXKDYZK!.k01s*t~> +JcGZJ!J(7JrrIZNMuNd.MuNeXJc#HI!.k01s*t~> +JcGZJ!J:CLrrI`PMuNd0MuNeXKDYZK!.k01s*t~> +JcGZJ!eUKdr;QeM!/pjW6&YaD!/(1K!!%TMNrOV~> +JcGZJ!eC?cr;QeK!/pjW5`>XC!.k%I!!%TMNrOV~> +JcGZJ!eUKdr;QeM!/pjW6&YaD!/(1K!!%TMNrOV~> +JcGZJ!J:CLrrI`PMuNcCMuNeXKDYZK!.k01s*t~> +JcGZJ!J(7JrrIZNMuNcBMuNeXJc#HI!.k01s*t~> +JcGZJ!J:CLrrI`PMuNcCMuNeXKDYZK!.k01s*t~> +JcGZJ!J:CLrrI`PMuNbWN;ism!/(1K!<@b's,[21~> +JcGZJ!J(7JrrIZNMuNbWN;isn!.k%I!<@\%s,[21~> +JcGZJ!J:CLrrI`PMuNbWN;ism!/(1K!<@b's,[21~> +JcGZJ!J:CLrrI`PMuNbWMuNeXKDYZK!.k01s*t~> +JcGZJ!J(7JrrIZNMuNbWMuNeXJc#HI!.k01s*t~> +JcGZJ!J:CLrrI`PMuNbWMuNeXKDYZK!.k01s*t~> +JcGZJ!J:CLrrI`PJcD#8!iuBSqu6WrJcCc1J,~> +JcGZJ!J(7JrrIZNJcD#8!ic6Oqu6WrJcCc1J,~> +JcGZJ!J:CLrrI`PJcD#8!iuBSqu6WrJcCc1J,~> +JcGZJ!J:CLrrI`PJcCu7!<@cLrr<%Ms,R,0~> +JcGZJ!J(7JrrIZNJcCu7!<@]Jrr<%Ms,R,0~> +JcGZJ!J:CLrrI`PJcCu7!<@cLrr<%Ms,R,0~> +JcGZJ!eUK*r;QeM!/pjWK8]a1!/(1K!<@b's,[21~> +JcGZJ!eC?&r;QeK!/pjWJW'O/!.k%I!<@\%s,[21~> +JcGZJ!eUK*r;QeM!/pjWK8]a1!/(1K!<@b's,[21~> +JcGZJ!eUKdr;QeM!/pjW!/pjX!/(1K!<@b's,[21~> +JcGZJ!eC?cr;QeK!/pjW!/pjX!.k%I!<@\%s,[21~> +JcGZJ!eUKdr;QeM!/pjW!/pjX!/(1K!<@b's,[21~> +JcGZJ!eUKdr;QeM!/pjW!/pjX!/(1K!!%TMNrOV~> +JcGZJ!eC?cr;QeK!/pjW!/pjX!.k%I!!%TMNrOV~> +JcGZJ!eUKdr;QeM!/pjW!/pjX!/(1K!!%TMNrOV~> +JcGZJ!J:CLrrI`PMuNdjMuNeXKDYZK!.k01s*t~> +JcGZJ!J(7JrrIZNMuNdkMuNeXJc#HI!.k01s*t~> +JcGZJ!J:CLrrI`PMuNdjMuNeXKDYZK!.k01s*t~> +JcGZJ!J:CLrrI`PJcCu7!<@cLrr<%Ms,R,0~> +JcGZJ!J(7JrrIZNJcCu7!<@]Jrr<%Ms,R,0~> +JcGZJ!J:CLrrI`PJcCu7!<@cLrr<%Ms,R,0~> +JcGZJ!J:CLrrI`PJcCu7!<@cLrr<%Ms,R,0~> +JcGZJ!J(7JrrIZNJcCu7!<@]Jrr<%Ms,R,0~> +JcGZJ!J:CLrrI`PJcCu7!<@cLrr<%Ms,R,0~> +JcGZJ!eUKdr;QeM!/pjWK8]a1!/(1K!!%TMNrOV~> +JcGZJ!eC?cr;QeK!/pjWJW'O/!.k%I!!%TMNrOV~> +JcGZJ!eUKdr;QeM!/pjWK8]a1!/(1K!!%TMNrOV~> +JcGZJ!eUK*r;QeM!/pjW!0$pZ]`<]^rrE,5JcCf2J,~> +JcGZJ!eC?&r;QeK!/pjW!0$pZ^&W`]rrE,6JcCf2J,~> +JcGZJ!eUK*r;QeM!/pjW!0$pZ]`<]^rrE,5JcCf2J,~> +JcGZJ!eUK*r;QeM!/pjW!/pjX!/(1K!<@b's,[21~> +JcGZJ!eC?&r;QeK!/pjW!/pjX!.k%I!<@\%s,[21~> +JcGZJ!eUK*r;QeM!/pjW!/pjX!/(1K!<@b's,[21~> +JcGZJ!eUKdr;QeM!/pjW!0$pZK)gQ$rrE+PJcCf2J,~> +JcGZJ!eC?cr;QeK!/pjW!0$pZJH18urrE+NJcCf2J,~> +JcGZJ!eUKdr;QeM!/pjW!0$pZK)gQ$rrE+PJcCf2J,~> +JcGZJ!J:CLrrI`PMuNbWN;ism!/(1K!<@b's,[21~> +JcGZJ!J(7JrrIZNMuNbWN;isn!.k%I!<@\%s,[21~> +JcGZJ!J:CLrrI`PMuNbWN;ism!/(1K!<@b's,[21~> +JcGZJ!eUKSr;QeM!/pjW!0$pZX8mnMrr<%Ms,R,0~> +JcGZJ!eC?Or;QeK!/pjW!0$pZWW7VIrr<%Ms,R,0~> +JcGZJ!eUKSr;QeM!/pjW!0$pZX8mnMrr<%Ms,R,0~> +JcGZJ!J:CLrrI`PMuNbWN;ism!/(1K! +JcGZJ!J(7JrrIZNMuNbWN;isn!.k%I! +JcGZJ!J:CLrrI`PMuNbWN;ism!/(1K! +JcGZJ!J:CLrrI`PMuNbWMuNeXKDYZK!.k01s*t~> +JcGZJ!J(7JrrIZNMuNbWMuNeXJc#HI!.k01s*t~> +JcGZJ!J:CLrrI`PMuNbWMuNeXKDYZK!.k01s*t~> +JcGZJ!J:CLrrI`PMuNbWMuNeXKDYZL!53s`O8j_~> +JcGZJ!J(7JrrIZNMuNbWMuNeXJc#HJ!5=$aO8j_~> +JcGZJ!J:CLrrI`PMuNbWMuNeXKDYZL!53s`O8j_~> +JcGZJ!J:CLrrI`PMuNbWMuNeXKDYZK!.k01s*t~> +JcGZJ!J(7JrrIZNMuNbWMuNeXJc#HI!.k01s*t~> +JcGZJ!J:CLrrI`PMuNbWMuNeXKDYZK!.k01s*t~> +JcGZJ!eUKdr;QeM!/pjW!/pjX!/(1K!!%TMNrOV~> +JcGZJ!eC?cr;QeK!/pjW!/pjX!.k%I!!%TMNrOV~> +JcGZJ!eUKdr;QeM!/pjW!/pjX!/(1K!!%TMNrOV~> +JcGZJ!keSdr;ZcsMuNbWN;ism!/(1K!%EL!NrOV~> +JcGZJ!knYcr;ZcsMuNbWN;isn!.k%I!% +JcGZJ!keSdr;ZcsMuNbWN;ism!/(1K!%EL!NrOV~> +JcGWIrrDus!J:B1rr<%XrrTk6KDb`M]d\O4NrOV~> +JcGWIrrDus!J(6/rr<%XrrTn7Jc,NK^*nR4NrOV~> +JcGWIrrDus!J:B1rr<%XrrTk6KDb`M]d\O4NrOV~> +JcGWI!^Qh"rVlnN!/pjW!/pjX!/(4L!J=:$s,R,0~> +JcGWI!^Hb"rVlnL!/pjW!/pjX!.k(J!J+7%s,R,0~> +JcGWI!^Qh"rVlnN!/pjW!/pjX!/(4L!J=:$s,R,0~> +JcGTH!<>FarrI`PMuNbWMuNeXKDb`M5uN:6NrOV~> +JcGTH!<>C`rrIZNMuNbWMuNeXJc,NK5ZNC8NrOV~> +JcGTH!<>FarrI`PMuNbWMuNeXKDb`M5uN:6NrOV~> +JcGTH!^Qh"rr3"O!/pjW!/pjX!/(7M!eUL'JcCc1J,~> +JcGTH!^Hb"rr3"M!/pjW!/pjX!.k+K!eC@&JcCc1J,~> +JcGTH!^Qh"rr3"O!/pjW!/pjX!/(7M!eUL'JcCc1J,~> +JcGQGrr<59s8Tb4K8fg1!0$pZ]`<]arrTk6!.k00s*t~> +JcGQGrr<5:s8Te5JW0U/!0$pZ^&W``rrTn7!.k00s*t~> +JcGQGrr<59s8Tb4K8fg1!0$pZ]`<]arrTk6!.k00s*t~> +JcGQG#h=P-F4L:>!3D1[!!%uX!@\$Jrr[lR.Fj"LNW4M~> +JcGQG#hFP,ERt. +JcGQG#h=P-F4L:>!3D1[!!%uX!@\$Jrr[lR.Fj"LNW4M~> +JcGKE"2-,`62glaK9-$4!0.!`5lcQ;]`8%bJcCZ.J,~> +JcGKE"26/`5lLc`JWKg2!0.!`5QHB8^&S.aJcCZ.J,~> +JcGKE"2-,`62glaK9-$4!0.!`5lcQ;]`8%bJcCZ.J,~> +JcGHD!nDohnc/YUqZ$YL62cE961TX.62H3662#p2!<.WN62uQ=;?-^r62^f`K)eg,K)ks<\:ah] +rIaD8!581-s+:PB!!#;N!(";Ls,-i,~> +JcGHD!nMofnc/YTqZ$YJ5lH665k9I+5l-$35k]a/!<.QL5lZB:<<*$u5lC]_JH/^-JH5a9\:O\[ +rIO86!5A7.s+(D?!!#8L!'n8Ls,-i,~> +JcGHD!nDohnc/YUqZ$YL62cE961TX.62H3662#p2!<.WN62uQ=;?-^r62^f`K)eg,K)ks<\:ah] +rIaD8!581-s+:PB!!#;N!(";Ls,-i,~> +JcG<@b(K]ordt:QK7a1#K*"r'!<.TN6/I4r5lcOirW!%Q;M.8r!<7\&s+p]*~> +JcG<@b(9Qmrdb.OJUmgtJHAi&!<.NL5i.%o5QH@drW!%O +JcG<@b(K]ordt:QK7a1#K*"r'!<.TN6/I4r5lcOirW!%Q;M.8r!<7\&s+p]*~> +JcC<$r;Q`sd/X)t!7h)K`.J''JcCH(J,~> +JcC<$r;Q`sd/X)r!7q/L`.7p&JcCH(J,~> +JcC<$r;Q`sd/X)t!7h)K`.J''JcCH(J,~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;QbLJcC<$O8j_~> +JcC<$r;QbJJcC<$O8j_~> +JcC<$r;QbLJcC<$O8j_~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;QbLJcC<$O8j_~> +JcC<$r;QbJJcC<$O8j_~> +JcC<$r;QbLJcC<$O8j_~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$r;QbLJcC<$O8j_~> +JcC<$r;QbJJcC<$O8j_~> +JcC<$r;QbLJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sNW0!lr]pPb^"WJd621B[]g;Ss!/(%G!7f!es1Rq%qh(^EJ,~> +JcC<$r;Q`sNW0!mr]gJa^=rSe5kk9Z^-MVs!.jnE!7o'fs1\"&qgkRCJ,~> +JcC<$r;Q`sNW0!lr]pPb^"WJd621B[]g;Ss!/(%G!7f!es1Rq%qh(^EJ,~> +JcC<$r;Q`sNW0.^^&S,GKA->*!;-9k!;-9k;T/S;K=un'pAY.Z^&J$36(e1-~> +JcC<$r;Q`sNW0.^^An5IJ_L,(!;-9k!;-9kJ\H\#pAY.Y^Ae-45bJ(,~> +JcC<$r;Q`sNW0.^^&S,GKA->*!;-9k!;-9k;T/S;K=un'pAY.Z^&J$36(e1-~> +JcC<$r;Q`sNrT-3ec,ULo`"mko`"oDao;@Srr3.Sec5Z_KD5BH6%f1:!/$pDJ,~> +JcC<$r;Q`sNrT-1ec,ULo`"mko`"oBao;@Trr3.Qf)PcaJbT0F5_8q7!.gdBJ,~> +JcC<$r;Q`sNrT-3ec,ULo`"mko`"oDao;@Srr3.Sec5Z_KD5BH6%f1:!/$pDJ,~> +JcC<$r;Q`sNrK*3q>Udf!!'_4]`8%b!($Va$G?E>^&S+b]`8$urr2u3rW)lr!!)Zk!!)ut"2+\# +^&7m1;Z-Or5leUtrr^f(6,!6s$,$=k^&S+b5s^/%rrTldKDkfO]n=#ks8R`OrrKfcrVlj`p\t5G +rVlj`TDsE~> +JcC<$r;Q`sNrK*1q>Ude!!'b5^&S.a!'pP`$GHK?^An4a^&S-urr2u4rW)lr!!)Zk!!)ut"24b# +^AS!2 +JcC<$r;Q`sNrK*3q>Udf!!'_4]`8%b!($Va$G?E>^&S+b]`8$urr2u3rW)lr!!)Zk!!)ut"2+\# +^&7m1;Z-Or5leUtrr^f(6,!6s$,$=k^&S+b5s^/%rrTldKDkfO]n=#ks8R`OrrKfcrVlj`p\t5G +rVlj`TDsE~> +JcC<$r;Q`sNrK*3qZ$SJ"okYis1JF3rt[nQs+>t(rrE*!K)iUb]n?@b!58C4KDkfM!;-9k!<)p# +!56'3^&@s2;Z6V&!<<'b^&S*462s7MrsQM+s$;;;X8orI6%f1:$37blec5Z_KE"6NpAY;K63$t; +KDkiMKD>HHKDkiL!<7ZOeYN4q~> +JcC<$r;Q`sNrK*1qZ$SH"okSfs1SL4rt[kNs+,b$rrE*!JH3Fa^4H=a!5AI5Jc5TK!;-9k!<)p# +!5?04^A\'3 +JcC<$r;Q`sNrK*3qZ$SJ"okYis1JF3rt[nQs+>t(rrE*!K)iUb]n?@b!58C4KDkfM!;-9k!<)p# +!56'3^&@s2;Z6V&!<<'b^&S*462s7MrsQM+s$;;;X8orI6%f1:$37blec5Z_KE"6NpAY;K63$t; +KDkiMKD>HHKDkiL!<7ZOeYN4q~> +JcC<$r;Q`sNrK*3rr3,OX8r8#r_`iNs8N)us8R]Xs+;bAK2VaL;Ut^F"g$8Ss+>t&rr<&krr<&u +rrl +JcC<$r;Q`sNrK*1rr3,PWW<&!r`'&Os8N)us8RWVs+)S +JcC<$r;Q`sNrK*3rr3,OX8r8#r_`iNs8N)us8R]Xs+;bAK2VaL;Ut^F"g$8Ss+>t&rr<&krr<&u +rrl +JcC<$r;Qa_NrT-3rVunM!!)or!!*#us+:CQK7j+%!/(1K!3H2"s+C:M!!)Zk!!*#us+C@O!PO-a +rr@]NrrIbcr;QeMXS`"t62plc63"%brrW9$rrDrr!($2Us1SI4!PO-arrIbcq#:>Hq#:>qV#Pr~> +JcC<$r;Qa^NrT-1rVunK!!)or!!*#us+(7OJV!b!!.k%I!36%us+1.K!!)Zk!!*#us+14M!PX-` +rr@WLrrI\br;QeKWr)er5lUcb5l[k_rrW9$rrDrr!'p,Ts1\O5!PX-`rrI\bq#:>Fq#:>oV#Pr~> +JcC<$r;Qa_NrT-3rVunM!!)or!!*#us+:CQK7j+%!/(1K!3H2"s+C:M!!)Zk!!*#us+C@O!PO-a +rr@]NrrIbcr;QeMXS`"t62plc63"%brrW9$rrDrr!($2Us1SI4!PO-arrIbcq#:>Hq#:>qV#Pr~> +JcC<$r;Qa_NW/uErVls"s+>t%rr@]Ns8R]Qs+Uec5Z_621BZKD>HIXFmALJ,~> +JcC<$r;Qa^NW/uDrVls"s+,b!rr@WLs8RWOs+*H5rr@WHrrbUes$/jJrr<&krr<&urrms=s8RY$ +rVlktrr3#5Jc,NKJZAVI!'pP`!s&A$Jc>ZO!<<(Mqu6X]mJd>Tf)Pca5kk9YJb]6GWe%#HJ,~> +JcC<$r;Qa_NW/uErVls"s+>t%rr@]Ns8R]Qs+Uec5Z_621BZKD>HIXFmALJ,~> +JcC<$r;Q`sNW0L%K)bm;^&S+b5uN@8s1SF3$A6%ls+=4%KE(t(qZ$O\!J<]:rr<&krr>@`rrYQ> +K0fG8!3H/!!58Aa"24_eXS`#&]g;Za!($X;rr2rurr3"sN +^%_O-K>%9a!58@2!)fWmJ,~> +JcC<$r;Q`sNW0L&JH,[8^An4a5ZNC8s1\L4$A#qks++1$JcGb$qZ$O[!J*N7rr<&krr>=_rrYN; +JO'/5!36"t!5AG`"2=edWr)f$^-M]`!'pR8rr2rurr3 +JcC<$r;Q`sNW0L%K)bm;^&S+b5uN@8s1SF3$A6%ls+=4%KE(t(qZ$O\!J<]:rr<&krr>@`rrYQ> +K0fG8!3H/!!58Aa"24_eXS`#&]g;Za!($X;rr2rurr3"sN +^%_O-K>%9a!58@2!)fWmJ,~> +JcC<$r;Q`sJcF0u!58=1s1S=0!7h#I!kj5=rr2uKqYp]3KE(t(r;QbLrVunM!7h)K"20>>^$u%' +eUrMPs8Te1s8R`Mrrds?K7h^Ms*t~> +JcC<$r;Q`sJcF0u!5AC2s1\C1!7q)J!ks5:rr2uLqYp]4JcGb$r;QbJrVunK!7q/L"29>;^@;.( +eq&DMs8Th2s8RZKrrdm +JcC<$r;Q`sJcF0u!58=1s1S=0!7h#I!kj5=rr2uKqYp]3KE(t(r;QbLrVunM!7h)K"20>>^$u%' +eUrMPs8Te1s8R`Mrrds?K7h^Ms*t~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$r;Q`sJcC<$O8j_~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +JcC<$JcC<$M>r)~> +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/tools/efsl-0.3.6/docs/pics/sdconnection.eps b/tools/efsl-0.3.6/docs/pics/sdconnection.eps new file mode 100644 index 0000000..8f95f7a --- /dev/null +++ b/tools/efsl-0.3.6/docs/pics/sdconnection.eps @@ -0,0 +1,2938 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner +%%Title: sdconnection.eps +%%CreationDate: Tue May 24 15:13:23 2005 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 14 14 408 515 +%%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 499.99398930095566 translate +392.99527559055116 -499.99398930095566 scale +% Image geometry +393 500 8 +% Transformation matrix +[ 393 0 0 500 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 393 string def +/gstr 393 string def +/bstr 393 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: 167760 ASCII Bytes +colorimage +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +N;inWJcC<$mf.e~> +N;inWJcC<$mf.e~> +N;inWJcC<$mf.e~> +QN-s`#6"T$s8N&trqultrdk*#s762?~> +QN-s`#6"T$s8N&trqultrdk*#s762?~> +QN-s`#6"T$s8N&trqultrdk*#s762?~> +R/[Nms8N#ts8N&ts8Mus"9&9!rdk*#s7H>A~> +R/[Nms8N#ts8N&ts8Mus"9&9!rdk*#s7H>A~> +R/[Nms8N#ts8N&ts8Mus"9&9!rdk*#s7H>A~> +RK!lus8N&ulg=`Ns8DudR*"Xnr.4m!s762?~> +RK!lus8N&ulg=`Ns8DudR*"Xnr.4m!s762?~> +RK!lus8N&ulg=`Ns8DudR*"Xnr.4m!s762?~> +R/[csrpu_-Rf33ar;P&bD1q$NrIP!"s7?8@~> +R/[csrpu_-Rf33ar;P&bD1q$NrIP!"s7?8@~> +R/[csrpu_-Rf33ar;P&bD1q$NrIP!"s7?8@~> +RK* +RK* +RK* +Rf<]nrVaTPUA"Wdrql^![r@T-rV_ +Rf<]nrVaTPUA"Wdrql^![r@T-rV_ +Rf<]nrVaTPUA"Wdrql^![r@T-rV_ +Rf<]mrq:hlmJm(`s8Dp%rVQVpET$lpJcC<$p&BO~> +Rf<]mrq:hlmJm(`s8Dp%rVQVpET$lpJcC<$p&BO~> +Rf<]mrq:hlmJm(`s8Dp%rVQVpET$lpJcC<$p&BO~> +Rf +Rf +Rf +RfEEe"o!M8s8;lmrs&B#\8UC+rIP!"s7QDB~> +RfEEe"o!M8s8;lmrs&B#\8UC+rIP!"s7QDB~> +RfEEe"o!M8s8;lmrs&B#\8UC+rIP!"s7QDB~> +RfC3jrVuos#5e>(DrCZnJcC<$p&BO~> +RfC3jrVuos#5e>(DrCZnJcC<$p&BO~> +RfC3jrVuos#5e>(DrCZnJcC<$p&BO~> +Rf +Rf +Rf +RK!Hgs2f,XlhUPbo;-Z1s8;kIs+14Cs*t~> +RK!Hgs2f,XlhUPbo;-Z1s8;kIs+14Cs*t~> +RK!Hgs2f,XlhUPbo;-Z1s8;kIs+14Cs*t~> +Rf +Rf +Rf +R/[?hrVsHSDZ,@tM1KDbS_a>Err.KKJcGECJ,~> +R/[?hrVsHSDZ,@tM1KDbS_a>Err.KKJcGECJ,~> +R/[?hrVsHSDZ,@tM1KDbS_a>Err.KKJcGECJ,~> +Qi@TqrVtuqOH#9]MR1@Vs8W%Ks+14@s*t~> +Qi@TqrVtuqOH#9]MR1@Vs8W%Ks+14@s*t~> +Qi@TqrVtuqOH#9]MR1@Vs8W%Ks+14@s*t~> +R/[9fs8W)mrr`9!s8ITLJcG?AJ,~> +R/[9fs8W)mrr`9!s8ITLJcG?AJ,~> +R/[9fs8W)mrr`9!s8ITLJcG?AJ,~> +QiI'a$N0f#rr;utrVl]mrr.KKJcG?AJ,~> +QiI'a$N0f#rr;utrVl]mrr.KKJcG?AJ,~> +QiI'a$N0f#rr;utrVl]mrr.KKJcG?AJ,~> +R/[6es8N#t!WN,urWiE!s8W&ts8ITLJcGBBJ,~> +R/[6es8N#t!WN,urWiE!s8W&ts8ITLJcGBBJ,~> +R/[6es8N#t!WN,urWiE!s8W&ts8ITLJcGBBJ,~> +RK"!#s8N&of\ul/s8Du^K +RK"!#s8N&of\ul/s8Du^K +RK"!#s8N&of\ul/s8Du^K +Rf=*$s8Dr[N,OmWrVl`od"H7^eGoIGJcC<$o`'F~> +Rf=*$s8Dr[N,OmWrVl`od"H7^eGoIGJcC<$o`'F~> +Rf=*$s8Dr[N,OmWrVl`od"H7^eGoIGJcC<$o`'F~> +RK* +RK* +RK* +Rf<]nrVWp>Z2ak'rql^!b'/a8rVc9ds8E0"r;Q`qJcC]/J,~> +Rf<]nrVWp>Z2ak'rql^!b'/a8rVc9ds8E/uqYgHnJcC]/J,~> +Rf<]nrVWp>Z2ak'rql^!b'/a8rVc9ds8E/uqYgHnJcC]/J,~> +Rf=-$s7Leqo_n[es8N&ts8MlpZYn\#r.4m!s7QDB~> +Rf=-$s7Leqo_n[es8N&ts8MlpZYn\#r.4m!s7QDB~> +Rf=-$s7Leqo_n[es8N&ts8MlpZYn\#r.4m!s7QDB~> +RfEEe#5 +RfEEe#5 +RfEEe#5 +Rf +Rf +Rf +Rf!E8U]noD]-rrVsrdJV<"^rIP!.s*t~> +Rf!E8U]noD]-rr;Vi`#nt5Vqgnd,s*t~> +Rf!E8U]noD]-rr;Vi`#nt5Vqgnd,s*t~> +Rf +Rf +Rf +RK!Hgs3l(WgA1aQk)skos8;lhs8W',r;W:3J:E,m^&S!0rdk*2s*t~> +RK!Hgs3l(WgA1aQk)skos8;lhs8W'"qYrVU!!WH(HN3g@rdk*2s*t~> +RK!Hgs3l(WgA1aQk)skos8;lhs8W'"qYrVU!!WH(HN3g@rdk*2s*t~> +Rf3~> +Rf3~> +Rf3~> +RK*L;Ds,d82~> +RK* +RK* +Rf=*$s8Mups7P$BUnsr]b22Ias8N&tpAb0l&GuF#FG0)!C?F,oFM\"Trr.KKP5g%~> +Rf=*$s8Mups7P$BUnsr]b22Ias8N&tpAb0l&Gc2k!"[t@!6q\I!/1CKrr.KKP5g%~> +Rf=*$s8Mups7P$BUnsr]b22Ias8N&tpAb0l&Gc2k!"[t@!6q\I!/1CKrr.KKP5g%~> +QN%!bqtL*mrVlirpAYd)s8;o;G'_")\Sg1%UO%=Ms87HJOoKq~> +QN%!bqtL*mrVlirpAYj+s7u\U!!.]OFTAuP7fib:s8)cpJcCr6J,~> +QN%!bqtL*mrVlirpAYj+s7u\U!!.]OFTAuP7fib:s8)cpJcCr6J,~> +Rf +Rf+Y!':/YHN:YTl3m\HpAFl?s-!D4~> +Rf+Y!':/YHN:YTl3m\HpAFl?s-!D4~> +Rf +RftuJcGWHrdk*6s*t~> +RftuJcGWHrdk*6s*t~> +Rf^Kor;Q]grttb8r;Xr^HH-!]s1E7+s8;kqG^S`SrVukJs- +Rf^Kor;Q]grttb8qYuo_!0.$Ps*=[Ys7uUk!!(IGr;ZbIs- +Rf^Kor;Q]grttb8qYuo_!0.$Ps*=[Ys7uUk!!(IGr;ZbIs- +R/[Kls6e3sFE!5Bl2L__rVuljrtbS4m=9PQs8Dlq]l)^,r;Q5@HB\C-rdk*6s*t~> +R/[Kls6e3sFE!5Bl2L__rVullrttb8r;PIX"$$>Xq>YdA]`7g,jUqYEs82bGs-3P6~> +R/[Kls6e3sFE!5Bl2L__rVullrttb8r;PIX"$$>Xq>YdA]`7g,jUqYEs82bGs-3P6~> +Qi@Hls8W#ZY^^V;RE+^orrE#lrttb6rLeFcn,<4_s1N=,s8Dlqdrp)Ns8;kIs- +Qi@Hls8W#ZY^^V;RE+^orrE#lrttb4q`k,_i;ENLs*FaZs82ZmVuQgCs82eHs- +Qi@Hls8W#ZY^^V;RE+^orrE#lrttb4q`k,_i;ENLs*FaZs82ZmVuQgCs82eHs- +R/d0b!<)os$hV]@GAD`6eb/tBrql^6rr;rsbBJ-Ps8;ops1N=,s8;lorMt$jjo540s- +R/d0b!<)os$hV]@GAD`6eb/tBrql`qrYbV5QN.#Ms82ils*FaZs8)`kr)j")c2[_@JcD&9J,~> +R/d0b!<)os$hV]@GAD`6eb/tBrql`qrYbV5QN.#Ms82ils*FaZs8)`kr)j")c2[_@JcD&9J,~> +QN-s`s8Drs$0&dXCNbEJs8DrqruM+=rVc59Gb=p4rr;or]l)^,rVuiqmYZ1RrVZZoJcD):J,~> +QN-s`s8Drs$0&dXCNbEJs8DrqruM+=r;>RY!'pAXrVu`oHN:bZqu?TnhAcMJqtg9jJcD):J,~> +QN-s`s8Drs$0&dXCNbEJs8DrqruM+=r;>RY!'pAXrVu`oHN:bZqu?TnhAcMJqtg9jJcD):J,~> +PlL^]s8;os#QESOFHlh'rVZ[9rr)keH@Y>\rVulps1N=,s8Drsr;Y)fH+X+Ss8ITLR/_[~> +PlL^]s8;os#QESOFHlh'rVZ[9rqudW!t*][r;Zcms*FaZs82fqqZ!,e!-\D=s8ITLR/_[~> +PlL^]s8;os#QESOFHlh'rVZ[9rqudW!t*][r;Zcms*FaZs82fqqZ!,e!-\D=s8ITLR/_[~> +PQ1[^!<)os#kQQHM/Ssbr;QZp*WH!:a*VsOs8;lqs8;o1DVkEls8N#ps/C*liW&k-s-Nb9~> +PQ1[^!<)os#kQQHM/Ssbr;QZp*WGs9NrT0Fs8)`os8)bB!58F0s8N#ns&&h)_uKUbs-Nb9~> +PQ1[^!<)os#kQQHM/Ssbr;QZp*WGs9NrT0Fs8)`os8)bB!58F0s8N#ns&&h)_uKUbs-Nb9~> +QiI'as8Dut$iAq\KPkt#^[_@'rr)j&rVl5=GG>!5rr2p%r;XHJhZ*QRrs8T&mYl=ZqYgDEs-Wh:~> +QiI'as8Dut$iAq\KPkt#^[_@'rr)j&r;PL`"%W.`rr2p%qYtmB^&S!/s8W!$h\lMTpAFo@s-Wh:~> +QiI'as8Dut$iAq\KPkt#^[_@'rr)j&r;PL`"%W.`rr2p%qYtmB^&S!/s8W!$h\lMTpAFo@s-Wh:~> +R/[6erVc`q#P#utF`E8ImJ$VcrVkVnGN]#(rVm*"s1N=,s8Dor#Q4VBCkVN]rdk*:s*t~> +R/[6erVc`q#P#utF`E8ImJ$Vcqu45.!71]BrVmN,s*FaZs82irrr;ipO8oUSrr%EJR/_[~> +R/[6erVc`q#P#utF`E8ImJ$Vcqu45.!71]BrVmN,s*FaZs82irrr;ipO8oUSrr%EJR/_[~> +Q2_EncDH&/Ha)-"s8W)rrr;usrVuos"97''s8N#srs&E$]l)^,rVlirrWN#?jo>:1s-Nb9~> +Q2_EncDH&/Ha)-"s8W)rrr;usrVuos#62$-s8N&trr33!s*FaZs82fqs8E3#ntXG/rIP!8s*t~> +Q2_EncDH&/Ha)-"s8W)rrr;usrVuos#62$-s8N&trr33!s*FaZs82fqs8E3#ntXG/rIP!8s*t~> +Rf<`os81W[Nc/oub3Ap*!<)lqp&>$kqu6lts1E1(s87HJN;nD~> +Rf<`os81W[Nc/oub3Ap*!<)lqp&>$jqu6lss*FaZs8.BIN;nD~> +Rf<`os81W[Nc/oub3Ap*!<)lqp&>$jqu6lss*FaZs8.BIN;nD~> +Rf +Rf +Rf +RfUBorVlf[rs&B#YWU_@r.4m,s*t~> +RfUBorVlf[rs& +RfUBorVlf[rs&?"HN:bZqgnd+s*t~> +RfYdA^An(]s,?u.~> +Rf +Rf +Qi@*cr;Q]Urs&?"H3(\YqLS[*s*t~> +Qi@*cr;Q]Urs&B#[S,NXrIP!-s*t~> +Qi@*cr;Q]Urs&?"HN:bZqgnd+s*t~> +R/d3chu +R/d3chu +R/d3chu +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5eG5Cu53jJcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5nM7DVkElJcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5nM7DVkElJcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5nM7DVkElJcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5nM7DVkElJcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5nM7DVkElJcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5nM7DVkElJcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5nM7DVkElJcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5nM7DVkElJcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5nM7DVkElJcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5nM7DVkElJcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5nM7DVkElJcC]/J,~> +JcGBB#5\@H!58F0JcC]/J,~> +JcGBB#5\=F!5/@/g]% +JcGBB#5nJ5DVb?kg&M'NnG`Ogs8Dots8MTh!WN,trpTmcrW3&uJcG]KJ,~> +JcGBB#5\=F!5/@/g]% +JcGKEs8E?)q"oC<]_hR)rnmbTrW)iprr`/ts8M`lrr*3%qu?]pr;ZcqpAb-k#Q+N#s82fqrq?Bl +rX&W'qu?]qqu?ZpJcGcMJ,~> +JcGKEs8E?)qu+3Gh>R9Nrnm_Xrr;urrr3)urr;uks8W')s8Muss8Musrr2Wkrr*0$rr<#srr;uk +s8W')s8Muss8Musrr.KKs8RT~> +JcGKEs8E?)q"oC<]_hR)rnmbTrW)iprr`/ts8M`lrr*3%qu?]pr;ZcqpAb-k#Q+N#s82fqrq?Bl +rX&W'qu?]qqu?ZpJcGcMJ,~> +JcGKE$3'u&rVq0D_#O2drs\o,rVuosq>C9krr;ujrsAW's7uKjs8;orp\t[$s8N#ts7uNks8N&t +p\tR!s8;osqYC0kr.4nHs*t~> +JcGECs8<-$]PZU,qqh>Srr;usrs&B"s8N#trq69rrVuopqu?]pp&>I"s8N#ts82`os8N&tp&>9q +s8W#os8W%Ks8DtJ~> +JcGKE$3'u&rVq0D_#O2drs\o,rVuosq>C9krr;ujrsAW's7uKjs8;orp\t[$s8N#ts7uNks8N&t +p\tR!s8;osqYC0kr.4nHs*t~> +JcGNF%K?D+s7;-_!\^MPqu6TSrs\o,rr;ee/fH('s8Drks8W'+r;YSf(`H/js82iqq>Us(s8N#r +Z9K6IIJa'Cs8Mcm$iU+mJK5XkZ2ab$rdk(Ls*t~> +JcGNF%0$;+s7sThHBZkYrVkdU%0$;+s8:0,LlfdZrr2Wks8EB*m^%e-U?)@Qs8Mio!WN,urX%2G +LlB"Fs8N&tq>Um&s8N&m^Q"&;g&M$MJcGcMJ,~> +JcGNF%K?D+s7;-_!\^MPqu6TSrs\o,rr;ee/fH('s8Drks8W'+r;YSf(`H/js82iqq>Us(s8N#r +Z9K6IIJa'Cs8Mcm$iU+mJK5XkZ2ab$rdk(Ls*t~> +JcGKE"8r2D*rH!>Q2ga>rWE)sj=gE2!c\/9pAP0ks.K\r!!<\Ms82Qi"9&/m:&Ftn:AOhdp\k9l +s2,ZN!!8trqsXNHs*t~> +JcGKE$iU+fM0=;uHZmR3rS[\Tr<`%[G'eXbEju)IpAPHus3Z:>I=??jirAuNrX/W$Uiq$3I;u+] +rV$3urVtl3G'n^`GgcWjn,AILJ,~> +JcGKE"8r2D*rH!>Q2ga>rWE)sj=gE2!c\/9pAP0ks.K\r!!<\Ms82Qi"9&/m:&Ftn:AOhdp\k9l +s2,ZN!!8trqsXNHs*t~> +JcGNF%K?7r2#mg\!!39'Zi9g[rWN)q?N:9/!<`T,M?!GIrXJc(\c;^5!or:0agr;ZfrPlH7~> +JcGNF%K?>%R<=.4It<,mg&Cp.rXA`'YB#8HJ:W>n`;fc1rXJf)gj":"J:N5uKCJm=q#1^#s/gQ@q#1a$rpG>aJq/B&I=q4lrUKjhrVuosPlH7~> +JcGNF%K?7r2#mg\!!39'Zi9g[rWN)q?N:9/!<`T,M?!GIrXJc(\c;^5!or:0agr;ZfrPlH7~> +JcGNF"T8;V!!3#u!WiBZhZ!]Q%fue2!!<6''CPVp"TA@g!!W<$"9SXCs8Mcm!mh&Pqu?d#"k35G +"TJF +JcGNF$iU+nI"?ctJ:E,qRGRrNqhKWMJ:N-"I>IUkrser,b]SMeJ:N-#G.@SOp\tB[I"6`srI=or +kkG)brr9ELJq&<$It;j=mJd1cPQ-.~> +JcGNF"T8;V!!3#u!WiBZhZ!]Q%fue2!!<6''CPVp"TA@g!!W<$"9SXCs8Mcm!mh&Pqu?d#"k35G +"TJF +JcGNF"T/1j!"Si$!)BU$r*s*K*(&@n4!='\fq&]YZ*tn>K!Ylduq&]\[*s)K>!!!)j +*sEi7L&_)MPlH7~> +JcGNF"8r/EHMi!"J:ERONrb,fqg\]sKCt9-M1'o(rdY*#J: +JcGNF"T/1j!"Si$!)BU$r*s*K*(&@n4!='\fq&]YZ*tn>K!Ylduq&]\[*s)K>!!!)j +*sEi7L&_)MPlH7~> +JcGNF"T&.`!!;ush@BSrp](:'oa_$+p]0st!>5J0!!!8r&,H8,! +JcGNF"oSDCG_(ADJ-(4NJ),k]It3%JJ-1:OItmWO!J5guJH(,lLBEBaIt.HJ"+PiMKCjp#It3%J +J-(4NIdr0sLiej\rr&)]J,~> +JcGNF"T&.`!!;ush@BSrp](:'oa_$+p]0st!>5J0!!!8r&,H8,! +JcGNF"oSA`!WW9#!!NH*/c5D@j88lQ"7mN7!r`0'!1 +JcGNF%fQCuIslltJ:E,rQMpaZj8K#U!r7k(rdY3&JUW@Er;?Bh%Jp%QGCk +JcGNF"oSA`!WW9#!!NH*/c5D@j88lQ"7mN7!r`0'!1 +JcGKEs835/!rrB&!rr>$s8:jU%/p4H!!!'#!<<,)s8;Wk$iL$4!!<3$!rsS@rqHF$rVsY5! +JcGKEs8<;VH[UHpJph^is8CpV%0$:eG^k9oJUVXls8D]l$iU+0Ee8glJom+PrqHF$rr:l"IY!!" +HZda9rV-=#rVrs?JUi6$FHQ4prq69rrr;bDR/d0bPlH7~> +JcGKEs835/!rrB&!rr>$s8:jU%/p4H!!!'#!<<,)s8;Wk$iL$4!!<3$!rsS@rqHF$rVsY5! +JcGNFs8EB&s0;t3!<=+%s8:dR!rN"?r;Zs4H2IO +JcGNFs8EB(s4MmKJTcjjrr(aR$N0q8H$k0hKY79^pAY*j$1X.(IXl^.h#@9GrX&Q'c$XkgG`]H8 +p&>!i$2L9?I=QX?oDed]rWiE$pOAV2rr//^J,~> +JcGNFs8EB&s0;t3!<=+%s8:dR!rN"?r;Zs4H2IO +JcGEC#lO_\4TJF9s8:aRs8E<(hI-CZkl:Y]p\t^%s8Dug`>JZKrVuirrqHF!rr)lUKE*Uhs8)Bf +$i^2%e1q#Rs8W&trq69rrVuBf1B7:OPlH7~> +JcGHD$3'o'n==d#mJm.As8W'(s6d+4V=X`drq6:!rr;fPMgE\Js8N&tp](9m#QO;0Fd2S!r:L!s +rr;oZR<64Drr2rsp&>9rs7h,4s8N"^s*t~> +JcGEC#lO_\4TJF9s8:aRs8E<(hI-CZkl:Y]p\t^%s8Dug`>JZKrVuirrqHF!rr)lUKE*Uhs8)Bf +$i^2%e1q#Rs8W&trq69rrVuBf1B7:OPlH7~> +JcGBB#l"@P!6kK;s8LsV%0$;+q>[c$RK)sZs8Mcm$i^2(rr5(\q>^]7NB`IeursSi+ +rqcY4!8.5Gs8MZj#Q=\m!&FTPrfmG5~> +JcGBB#5\A9D!(cph#@`\r;YGbc2[V=s8Mcm$i^2)rr8R +JcGBB#l"@P!6kK;s8LsV%0$;+q>[c$RK)sZs8Mcm$i^2(rr5(\q>^]7NB`IeursSi+ +rqcY4!8.5Gs8MZj#Q=\m!&FTPrfmG5~> +JcGHDs8E9"rHJ=QrVQTNs8W'(qYd8kNW&_Qrq69trr)`l2?<%Ar;QBh$3'u%rQYCMrVHNcs8W'' +q>=e(ao;2:oD]'os7$(Es8;k\s*t~> +JcGHDs8E9$rk!('rr)iQs8W'(r;P,\`r>o8rq69trr)cnRsal-rVlKi$3'u&roS7)rqucfs8W'' +qu*g?j8T#VoD]'ps7h,4s8N"^s*t~> +JcGHDs8E9"rHJ=QrVQTNs8W'(qYd8kNW&_Qrq69trr)`l2?<%Ar;QBh$3'u%rQYCMrVHNcs8W'' +q>=e(ao;2:oD]'os7$(Es8;k\s*t~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5nM7DVkElg]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5nM7DVkElg]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5nM7DVkElg]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5nM7DVkElg]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5nM7DVkElg]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5nM7DVkElg]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5nM7DVkElg]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5nM7DVkElg]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5nM7DVkElg]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5nM7DVkElg]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5nM7DVkElg]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5nM7DVkElg]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5nM7DVkElg]%KVs3k`'s8;Hf#QFZ$RsXl/rpp'nrVu)#YQ+Ojrs&E$Z>\k)rUTsnrr;bB +R/d-aPlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5nM7DVkElg]%KVs3l#0s82Be#QF]%Sq6S7rpp'nrVu&)Z2aalrs&E$[!(O1rUTsnrr;_G +S,`KePlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/5s[s8) +JcGBB#5nM7DVkElg]%KUs3slbs8;Hf#QFZ$OD+Iirpp'nrVu1cWW2kcrs&B#X]O]crUU!grWW.6 +N;rkUPlH7~> +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KSs/?!Zs8) +JcGBB#5nM7DVkElg]%KTs0)Kjs8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KUs33=3s82Be#QFZ$HV=/6rUTsmr;YtBRK*0Srs&B#SiPp4r:9jmrVlXg +FoVC=PlH7~> +JcGBB#5nM7DVkElg]%KSs/,mXs7u6c#QFZ$2?<+Dr:9jlqu=tB?iTrlrs& +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs4)56s8;Hf#QF]%TnN+=rpp'nrVu)-ZiBsnrs&E$[X%!7rUTsnrr;_J +T)\fhPlH7~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KUs3k`'s82Be#QFZ$RX=c.rUTsmr;Yr!YQ+Lirs&B#Z>\h(r:9jmrVlS@ +QiI$`PlH7~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cPlH7~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cli..fs8N#trilEQ~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cqu6m"s8Murs8Mio"oeQ#s8W)%s*t~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cp\t?orr;uqrs8W(s8Dulrr;u%s*t~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cqu?]q#4p(=rVlirrr3<(s8MrriM$5LrNQ +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bD +RK*9cqu6p"s7UZTs8;lqrsJc*rVuo1Fd)k(rilEQ~> +JcGBB#5nM7DVkElg]%KTs/?![s8) +JcGBB#5\@H!58F0g]%KTs/?![s8) +JcGBB#5\@H!58F0g]%QXs3kf(r;-Bko`#9trVi:7o_n^es8M]k#lXedEj,E;rVlEg#Q4S,ET@#p +rU^$lrVuVAR/[!brr;usrs8W&qk.cGs8;lqrsAZ(m]CJbiVrfTYlB4~> +JcGBB#5nM7DVkElg]%QVs/,jVqY0peo`#9sr;JVTl21>Us8M]k$N'kL!+5Trr;Q`qpAYL!qYk%+ +aSYf2rr2Tj$N0qm!&=?Fqu-Qorr39'rVN7(a8c):rr3<'s6d"/LuJ@3rilEQ~> +JcGBB#5\@H!58F0g]%QVs/,jVqY0peo`#9sr;JVTl21>Us8M]k$N'kL!+5Trr;Q`qpAYL!qYk%+ +aSYf2rr2Tj$N0qm!&=?Fqu-Qorr39'rVN7(a8c):rr3<'s6d"/LuJ@3rilEQ~> +JcGBB#5\@H!58F0g]%ESs4M24rr2utrr)lrq>UWtr;W@9rr2rsrVlflrri<#m;]K2s8MurrqZQs +qu=-Em/I%arVlflrri?$r.1=8s8MusrY,>2rV<%$a8c&9rqufYNFo6es8K2$J,~> +JcGBB#5nM7DVkElg]%EQs0D]orr30#r;6EkrqZQtrql^X!<)oss82urrVlflrri9"g&PdarrW,q +r;Q]krri/tDZJMjs8W!!qu-Nnq>UTrs7lXPrVm`4qtpBls8MumSnuIIqu6Tms5o;QX82epY5a"~> +JcGBB#5\@H!58F0g]%EQs0D]orr30#r;6EkrqZQtrql^X!<)oss82urrVlflrri9"g&PdarrW,q +r;Q]krri/tDZJMjs8W!!qu-Nnq>UTrs7lXPrVm`4qtpBls8MumSnuIIqu6Tms5o;QX82epY5a"~> +JcGBB#5\@H!58F0h#@ZZrVrj?S#OltrVuos!WW/rrs8T&l%=Pa[GgTQs8W'!s8Moq#lO_9Fd/fH +iqr`Ts8E'!rql`qrW`(XH_R\!l2CY^rW3&uqu6s"s3c+MW57EcrVmQ0s8W&sqOVNDs82ir`H$CM +rVuhus*t~> +JcGBB#5nM7DVkElh#@ZZr;TXp2HZs#rVm!!rVulors8Q%e.2[\CWPE3rr`6!s8Moq#l=RJ!%;!9 +aSGi8"9/9!rql`qr +JcGBB#5\@H!58F0h#@ZZr;TXp2HZs#rVm!!rVulors8Q%e.2[\CWPE3rr`6!s8Moq#l=RJ!%;!9 +aSGi8"9/9!rql`qr +JcGBB#5\@H!58F0h#@f^rViX:F)Q;KRA\Trp\td&roelXDKBuVR_@8Ds8W)prsnu+\TW.5GBT7E +d,+g&rqcZprXJOZG].SGJ= +JcGBB#5nM7DVkElh#@KUr;K@e!!>,TYfc_?"8r/H$N0r0%R,6Eli7"aqYpWnrcJ&<"tW';^An64 +qZ$To!UUg(!!`NfBX-Cns8Mlp!rDqiqu@WX5*iSRs8N#trVl\cCrZMJUNDUOs8Drsrr0,$J,~> +JcGBB#5\@H!58F0h#@KUr;K@e!!>,TYfc_?"8r/H$N0r0%R,6Eli7"aqYpWnrcJ&<"tW';^An64 +qZ$To!UUg(!!`NfBX-Cns8Mlp!rDqiqu@WX5*iSRs8N#trVl\cCrZMJUNDUOs8Drsrr0,$J,~> +JcGBB#5\@H!58F0g]. +JcGBB#5nM7DVkElg].aB0s8W'&s5Kbb2A-,k!!F9Ao)8Rbs8W'%rR5t# +'GC?E""^/Fqtg +JcGBB#5\@H!58F0g].aB0s8W'&s5Kbb2A-,k!!F9Ao)8Rbs8W'%rR5t# +'GC?E""^/Fqtg +JcGBB#5\@H!58F0hu +JcGBB#5nM7DVkElhuE]Ts82lorVluJUEorWE,squ-No"QHm.#6k),"Q]R\s8W)t +s82lorVluKFTi'M!!6!sq>UEnrr2iprrh`/.L$1X!!9t8qu6WqrW<&rqu-O3fp)dJ!WW3Fs8;lq +s8DrnSoK&(rVlcqri?'L~> +JcGBB#5\@H!58F0huE]Ts82lorVluJUEorWE,squ-No"QHm.#6k),"Q]R\s8W)t +s82lorVluKFTi'M!!6!sq>UEnrr2iprrh`/.L$1X!!9t8qu6WqrW<&rqu-O3fp)dJ!WW3Fs8;lq +s8DrnSoK&(rVlcqri?'L~> +JcGBB#5\@H!58F0iW&rWs8;rsrr3W#j0b))I!KjlP/[:srr;usrVc]p%Hu6=LP0nsH]auYrVccq +rr;rrrt=td]U=G&H$+k'\F]_!s8N#rrVca)lJ&M$Km@rfNg\JtrVc`qrVlg,pu]PfKRnAkJWR#" +rVc`pr +JcGBB#5nM7DVkEliW&rW!rVrorr3,[b\JX?I]#lXf,.7q8OrVlct +r;6EkrrhT8GrQB7!"'/aGNf#(s8N#pr;HWuf!o9.%/p50+ulb)rVlctrVQNlrsnYLMF\6Z!!!*M +A(UYWrr2j$qu$5OFNjd^r;EbtJ,~> +JcGBB#5\@H!58F0iW&rW!rVrorr3,[b\JX?I]#lXf,.7q8OrVlct +r;6EkrrhT8GrQB7!"'/aGNf#(s8N#pr;HWuf!o9.%/p50+ulb)rVlctrVQNlrsnYLMF\6Z!!!*M +A(UYWrr2j$qu$5OFNjd^r;EbtJ,~> +JcGBB#5\@H!58F0jSo>]s8DoprsRl;Vh]Y?FEWG6dI[A;s8E&trr2p1p"dEQI\lrr<#t +s8MuqrsS&EX,MCJEd*,,b3]--"9/?!rr2p+qVK>eJ9u3XGE/fWqYgEprr)fq$glcVPC%LmG^Z!s +jo58[rqZQrie2EmVuM8~> +JcGBB#5nM7DVkEljSo>]s8;iorr^trVlg"pVE(d!W +JcGBB#5\@H!58F0jSo>]s8;iorr^trVlg"pVE(d!W +JcGBB#5\@H!58F0j8TYhs8W)X^6j:lDg6Yp[bpQQrrW2urr)j@q:)F'G'7ePJtpTLr;Zfrrr)lr +s8W)_`ghU(EHQYiYMJLCrrW2urr)j*rReE +JcGBB#5nM7DVkElj8T>_s8W);KfJu1"#4]5i;W`Xrql]nrr_nm@$Ns=ra8>o:rr)cprr2p" +eStQrr3*!qu?Zprr_;V64Wqo!u"bBbl7VIrqu`o +rqtI#rmqV0gTc-R^t7,ge_gE+rilEQ~> +JcGBB#5\@H!58F0j8T>_s8W);KfJu1"#4]5i;W`Xrql]nrr_nm@$Ns=ra8>o:rr)cprr2p" +eStQrr3*!qu?Zprr_;V64Wqo!u"bBbl7VIrqu`o +rqtI#rmqV0gTc-R^t7,ge_gE+rilEQ~> +JcGBB#5\@H!58F0jo5hirVbrZNIZ1nItFK +JcGBB#5nM7DVkEljo5M`rVY)K-2dfH$W32CpAY'nr;6Hlrr;ouV_K4k!!ENED8G$+rrN#prr2rr +"6=AG$2so-$:'6smf*4fr;6HlrWN2t\3VD>!!EE7A?X_crrN&prVcrunq85"rW!'-/p,V*rr3?' +qu$Hms8DujF)(\j%;fm$G'7b>Ci3gAs8Do#s*t~> +JcGBB#5\@H!58F0jo5M`rVY)K-2dfH$W32CpAY'nr;6Hlrr;ouV_K4k!!ENED8G$+rrN#prr2rr +"6=AG$2so-$:'6smf*4fr;6HlrWN2t\3VD>!!EE7A?X_crrN&prVcrunq85"rW!'-/p,V*rr3?' +qu$Hms8DujF)(\j%;fm$G'7b>Ci3gAs8Do#s*t~> +JcGBB#5\@H!58F0jo5\erVqmrIt<3Mh#76P!ri/srr2os$2jeYCj^_^OLOr^rrr?!rVlirrr3<& +s.sI[J:F9=r;HWsr;HTnrr<#urWr":GCG(!ZL.Yjs8Mrurr;usrsAT&]kDnGJ!n4QrVm'!rVc`q +rr2p#rr;l9_u.FS_ns:i`!+,sd/X+EYlB4~> +JcGBB#5nM7DVkEljo5\erVmo=!!3@2\c)O-"oeDsrVlfqrrW&r]`%m5"sIpRrVlrqqu$Hmrr3<$ +s%<=l!*hs8Vrur;HWorr3&qs*O_F!sUiBrr)j#qY^9j +s8N#t"TJGua2@hn!lMmlrknuZ_U/>^rilEQ~> +JcGBB#5\@H!58F0jo5\erVmo=!!3@2\c)O-"oeDsrVlfqrrW&r]`%m5"sIpRrVlrqqu$Hmrr3<$ +s%<=l!*hs8Vrur;HWorr3&qs*O_F!sUiBrr)j#qY^9j +s8N#t"TJGua2@hn!lMmlrknuZ_U/>^rilEQ~> +JcGBB#5\@H!58F0jo6"nrVjTbGBn[oT"X7bs8W)srVlfqrsSf)nXt5RH%_3Yd-Uc3!WN&srr2p* +rVk3$GBnUlRC;)Mrr<#srr2rt$i^,"XF5>=Jr?MIkl1S_rr)iqrr3B)ro&r`H$b:1ZJ5!Ms8W&s +rg3Y8~> +JcGBB#5nM7DVkEljo5J_r;D3\rW! +JcGBB#5\@H!58F0jo5J_r;D3\rW! +JcGBB#5\@H!58F0jT#8Z$ifY?TnIW/F*sChiVifVrVuj,s8N&uhR\tuG&DJXV9n`1rt>8.rr2rs +s7Y!?M0F#\HBbemrVlg0rqucps8N&ujhmO8GA_PSTZQHss8W&trXSu-s8:QPNd#VaG`JlZq>UBp +rqu`o"onT"r;6Efrr`8squ-NnYlB4~> +JcGBB#5nM7DVkEljSoG`rVtcN6jW_k!^(nLrVm6'qu6Tprr<#5G;T6u!t@r'ir/laqY^?ls8Dub +YtYr2!!=lg]D_a/$N9i"rr;uts3$?br;Zp%8X\*,rsJZ$rr2rss7j!,,5hKD+^)DKrr3'!qYgEm +"onT"r;6Efrr`8squ-NnYlB4~> +JcGBB#5\@H!58F0jSoG`rVtcN6jW_k!^(nLrVm6'qu6Tprr<#5G;T6u!t@r'ir/laqY^?ls8Dub +YtYr2!!=lg]D_a/$N9i"rr;uts3$?br;Zp%8X\*,rsJZ$rr2rss7j!,,5hKD+^)DKrr3'!qYgEm +"onT"r;6Efrr`8squ-NnYlB4~> +JcGBB#5\@H!58F0jo5G^s8W&srsS5QZBBQRFFBOlir&fU'E.q1rr2rtroDG(KQhBXLni;grr2p" +rVliqrr3AsijtM*EccVk\(gfZrri<"s8MurrsS#BXGV:AFG$.+mJ[%a"9&6!rr2p*p>Wu]J95gU +Nj%"0rr3B*rVulsrr2rtl-RrYdfe(ks8W)#s*t~> +JcGBB#5nM7DVkEljo5G^s8W#rrr_#rAgdNW"#bqSqu6U'qu-QnrVuosbbA/FrW!':8>GJKrr3)t +rr;oqrrhH,FZ0@#!!=lr\,61)"T85urqucq"4+>['E.t7#s4[4r;Q]uqu6Worr3,ib_JXkrW!$I +@&s)%rsSi(s8N&trr<#_d+&$C"OZoBs8K/#J,~> +JcGBB#5\@H!58F0jo5G^s8W#rrr_#rAgdNW"#bqSqu6U'qu-QnrVuosbbA/FrW!':8>GJKrr3)t +rr;oqrrhH,FZ0@#!!=lr\,61)"T85urqucq"4+>['E.t7#s4[4r;Q]uqu6Worr3,ib_JXkrW!$I +@&s)%rsSi(s8N&trr<#_d+&$C"OZoBs8K/#J,~> +JcGBB#5\@H!58F0j8],Xs8Drs'):@nO*kneJ;^JTp&G'ks8MuqrVm8obGU&:Ec[,$^#]+irrW2u +rVlg1rT:_WIrKFUMkeDcs8W)urr)fprr3W%e#nOPEcQnp[G1NWs8N&trVc]p($r`,JT>gUN17cQ +s8W)urr)lEQ$I-AC]oU+j8](\s*t~> +JcGBB#5nM7DVkElj8]/Y!r`#nrr3)l`-!1$!"8lM>bUQbs8N&tr;6Kmrr_2G +JcGBB#5\@H!58F0j8]/Y!r`#nrr3)l`-!1$!"8lM>bUQbs8N&tr;6Kmrr_2G +JcGBB#5\@H!58F0i;WrZs8Muqrr3Q*g:!&lH?a^hZLe(ps8N&trr)ir'(X,=LO+;iIZVkQrVlir +s8Muqrr3E)ik:P-H$OUdVWn*Yrr3*"rVcZnrtG(OX,;:OFaT+cqu-Norr;urrVlfr*pUV1KQqfd +JXkTqrVZ]4E-A8&a2l?BaLZq?Ja*14YQ'+~> +JcGBB#5nM7DVkEli;WrZs8Dlmrr3)l[WWkn!"09Nkl(J[rr;uqqtpBm"6kt@)#aLC""Tu>r;Q`q +s8Dlmrr3,saFklErW!<9oikD$QP*!rVlirs8DlmrVlg!fo%TqrW!!- +7)&Zu&c]^eG,iX(aN2EC\q+aMl2LXbs*t~> +JcGBB#5\@H!58F0i;WrZs8Dlmrr3)l[WWkn!"09Nkl(J[rr;uqqtpBm"6kt@)#aLC""Tu>r;Q`q +s8Dlmrr3,saFklErW!<9oikD$QP*!rVlirs8DlmrVlg!fo%TqrW!!- +7)&Zu&c]^eG,iX(aN2EC\q+aMl2LXbs*t~> +JcGBB#5\@H!58F0h>dNS!r`#nrVm/CRX]s?A\A'?r;Zfr!rVrorr3;o[>BKdG]`HSrVccqrW2ro +rVm/NU4@lHBr(e+r;Zfr!r`#orr3<$\r_GoHthF9r;HZprW<#prr2p,hl;<]JSpJIr;OlYPN;Q> +#4AO1X8i.tYlB4~> +JcGBB#5nM7DVkElh>dNS!rVihrVm._4U;5m!.+\@rr;rr!rD]irr3;dF;"l[!!)'Yr;HZqrW<&o +q#13uV,7L'!!#Riq>C9mrW;ulqYpL$q/mke!rr>6rql]prVcloq#13l%DQ?W#64`Bs8)` +JcGBB#5\@H!58F0h>dNS!rVihrVm._4U;5m!.+\@rr;rr!rD]irr3;dF;"l[!!)'Yr;HZqrW<&o +q#13uV,7L'!!#Riq>C9mrW;ulqYpL$q/mke!rr>6rql]prVcloq#13l%DQ?W#64`Bs8)` +JcGBB#5\@H!58F0iW&oV!WDrprt>:aZCd#(G'eV/lMgb]s8N#rrVca(nBReuJpV]gKY70[r;H]o +r;RAe\t4t5GC"V$h>[BPs8N#rrVca(pXZ:6Kme,kJ?\bGr;H`prr)j/k/3dUJ9cEeNR.V$s0Zap +s82]k#Q+PjH^=[1rNQ +JcGBB#5nM7DVkEliW&oV!W;fmrrrA0B1 +JcGBB#5\@H!58F0iW&oV!W;fmrrrA0B1 +JcGBB#5\@H!58F0jT#5Y!WDrqrtG>%c(^GKFDZ5VWn-D6s8N&tr;HWp')LS#QA]j*E-mkZjmiBN +rr2lorVmN)dA`@ZFDc5QUs8'#s8N&tr;?Qo'Dq%5R?)K3DL.>Ji9gRErr;rprr2p6qU`$:KQD'Q +J"FR>q#C?krjm%-rVZZorr;us"o*V9s8Dr$s*t~> +JcGBB#5nM7DVkEljT#5Y!W2`mrri5_SOG+.!"'-?Y1!@Mrr;rnqu6Tupr%h?)#XF@/T9"rs8W)t +r;-Bl"7i3f0`:tY"]Lo +JcGBB#5\@H!58F0jT#5Y!W2`mrri5_SOG+.!"'-?Y1!@Mrr;rnqu6Tupr%h?)#XF@/T9"rs8W)t +r;-Bl"7i3f0`:tY"]Lo +JcGBB#5\@H!58F0jo5>[r;R3&ik1G2F)u;MQFbH7rr<#t!WW/urs\MFWeu@IEcm,:]]B"irrE#q +rs\nl_3g+'F)QGe\]OC?rrW0!rr2p+p=HU/KlM0SK;,s4q#:9qrVlirrr3Aq`Lr*8Ec?;][)280 +rs8T'qu3s?k5P8Tr +JcGBB#5nM7DVkEljo5>[r;Qooaak`QrW!'(/UaDXrr<#s!WW,trrhSY>TNtG!!Es8IEhTerrN#r +rVm$"fnM4"r;Zp@Ga%7frrW,urr2p#m]^RM$iU,/%RbcYnc&Ojqu6Wprr3)]N'\Q`!!=$RL#N"1 +#lO`"rj6S*rqlTk#Q4PuJX6?8rNQ +JcGBB#5\@H!58F0jo5>[r;Qooaak`QrW!'(/UaDXrr<#s!WW,trrhSY>TNtG!!Es8IEhTerrN#r +rVm$"fnM4"r;Zp@Ga%7frrW,urr2p#m]^RM$iU,/%RbcYnc&Ojqu6Wprr3)]N'\Q`!!=$RL#N"1 +#lO`"rj6S*rqlTk#Q4PuJX6?8rNQ +JcGBB#5\@H!58F0jSo_hrVXsFP^ICjEf$^6ir/lVrr)iq%0,n0XbCtoX^rr;ur&,uV.s7X:5MKs)[G)iuOmJ[%tr;HWps8N&ZZ_W.nEc?Pr`74V^rsJc( +rVlirrVtJk\bH+-eodVbrVj&$J,~> +JcGBB#5nM7DVkEljSoD^r;!%$.K'5L),QU=qu6U&qu$Bks8N&ZG?tXT!!=ZtRI'nP$Ms]!s8Mus +[;%`*rW!'35F&bPrr3?'qu$HnrVu;ABbgRH"!hWIhYmH]qY^ +JcGBB#5\@H!58F0jSoD^r;!%$.K'5L),QU=qu6U&qu$Bks8N&ZG?tXT!!=ZtRI'nP$Ms]!s8Mus +[;%`*rW!'35F&bPrr3?'qu$HnrVu;ABbgRH"!hWIhYmH]qY^ +JcGBB#5\@H!58F0jo5_frViO5H$k.2_qOYZrr`2trr2os$iU(eJ9Zd+nKsrrW2trVlfrrsJ]'b]\8XI$(Vek5G;\rVZWn +rr<#t&b^p!T#TgNjQ,@^eYRJ?nc&Kjs*t~> +JcGBB#5nM7DVkEljo5G^r;K1b!!EgKnrWN9"rTP-t!!E[$Tt0psrsJc%r;HWos8VrpRJd*f-ss[4rVlrrqYgEm +rr<#t&b^p!T#TgNjQ,@^eYRJ?nc&Kjs*t~> +JcGBB#5\@H!58F0jo5G^r;K1b!!EgKnrWN9"rTP-t!!E[$Tt0psrsJc%r;HWos8VrpRJd*f-ss[4rVlrrqYgEm +rr<#t&b^p!T#TgNjQ,@^eYRJ?nc&Kjs*t~> +JcGBB#5\@H!58F0jo5\erViO5H@LO9_<1as!ri,rrr2os$N9tdIs?BjMl,%trr3#tr;HWorsAW& +[rcnFJ![Y'rr3'!r;HWorr<#t#kNsuI"$jFcL:c4!WN#qrr2p0r;Oo`H%1:+YMK-Vs8Muqrr2co +"TA>YQur1D#&eRYjT#5YYQ'+~> +JcGBB#5nM7DVkEljo5G^r;K1b!!rqcQkrr2oss8;u_(B+:9%SWYUrr3&uqYgEmrr3&rrgE`c$N_eb^AIs1rVQKj +rqcWtrVkcCFS]q\Df_`8s8N#$s*t~> +JcGBB#5\@H!58F0jo5G^r;K1b!!rqcQkrr2oss8;u_(B+:9%SWYUrr3&uqYgEmrr3&rrgE`c$N_eb^AIs1rVQKj +rqcWtrVkcCFS]q\Df_`8s8N#$s*t~> +JcGBB#5\@H!58F0jSo\grVOm=KR%KVHBZ#!qu6Trr;HQm$if_,R!s*rEJ1"-nG`FhrVZWkrX.>] +LjEu[GE0&^q>UC,r;HWos8W)uotd8NG&MANRDnIjrrW2trVld*s8N&YZAsd.mV?rr!<* +s8N&ts8N&ul+44/[JmN +JcGBB#5nM7DVkEljSoD^r:m!i$N0r,.Y5G2rr3B&r;HWos8N&XFu0=#!!<`tQKJ2H!rVomrVcru +s0ZDMr;ZpHDm8m5rsS]#r;Q`rrVu5=7L8tn!sCEDf`(mQrqcQkrr*'!s2Sdnr;Zp?>GC`gs8Vrr +r;Q[&s8N&ts8V>pZaI4?Zj3nrs8W)us8K8&J,~> +JcGBB#5\@H!58F0jSoD^r:m!i$N0r,.Y5G2rr3B&r;HWos8N&XFu0=#!!<`tQKJ2H!rVomrVcru +s0ZDMr;ZpHDm8m5rsS]#r;Q`rrVu5=7L8tn!sCEDf`(mQrqcQkrr*'!s2Sdnr;Zp?>GC`gs8Vrr +r;Q[&s8N&ts8V>pZaI4?Zj3nrs8W)us8K8&J,~> +JcGBB#5\@H!58F0jo5>[r;R/sbe0*fEH-Gj]Arbes8W$/rr;uts8M2rXb_.AFG6L1nGW@frVl`p +$h_u^R=K9sH]>Ddp\t3mr;uuurr2p)m_cGkH#dnVSAFRjs8W&trso&.s7tE^Tn@B+GD`QOoD\aq +rr)irs8MuprqHEpr;HZpY5a"~> +JcGBB#5nM7DVkEljo5>[r;Ql`R=?L\!!=NrbP2#9$iBl$s8Dutr6p:')#aL;&knAIrVloqrVZZu +mAY^n#Q=]*)KWIXrr3-!qu6Wprr3)ZLM\"0!! +JcGBB#5\@H!58F0jo5>[r;Ql`R=?L\!!=NrbP2#9$iBl$s8Dutr6p:')#aL;&knAIrVloqrVZZu +mAY^n#Q=]*)KWIXrr3-!qu6Wprr3)ZLM\"0!! +JcGBB#5\@H!58F0jT#5Ys8Drs')^UuP^IRlI@%(^nGiOfs8W)rrVmN(c_u_DEd!)6[,_)as8N&t +rVZZp$i];+R"06rH]P>Llhpbarr)iqrt>1XY` +JcGBB#5nM7DVkEljT#5Y!W2forr`)3IkUa#""n/[iV`]VrVHKm"7Vp[*<#pG#ZGK^q>^Kos8Mrn +rr3-"c]9a\rW!$BAWPOBrrW/rrr2p"pSqdOrW!<16tO(#s8W)urquWkrr_/J3t2)g!tf!ke+s"S +rr)cmrVu3Hl/qU;rVlirYQ'+~> +JcGBB#5\@H!58F0jT#5Y!W2forr`)3IkUa#""n/[iV`]VrVHKm"7Vp[*<#pG#ZGK^q>^Kos8Mrn +rr3-"c]9a\rW!$BAWPOBrrW/rrr2p"pSqdOrW!<16tO(#s8W)urquWkrr_/J3t2)g!tf!ke+s"S +rr)cmrVu3Hl/qU;rVlirYQ'+~> +JcGBB#5\@H!58F0irAuV!WDrprsISlP^%7iH%r*Hs82crr;HWp'(jYLLNIKYHBYZ%rr2rtrr2lo +rVm5b_4#anE-[#-bkq;:!W;oqrs\_TXGh:AFErkHkPtMZrW<&rrr2p=lH,WJFDlDPS&"^qs8&S# +s8Murr5sJ1F``ATs8Dr"s*t~> +JcGBB#5nM7DVkElirB#W!r`#mrVlr3F>Edp":Ro,s8Doq!r_unrr3)cY"KE+!"(Aqg]%0Os8Muo +qYgEqaG<"X!!EBqSG3!\rW<&pqu6Ttos7gDr;ZsC>0d0HrVclrqYpKo!nNi.qu@KtM!Y'=qPCY# +rr)iob'nGTFG@[4rViu"J,~> +JcGBB#5\@H!58F0irB#W!r`#mrVlr3F>Edp":Ro,s8Doq!r_unrr3)cY"KE+!"(Aqg]%0Os8Muo +qYgEqaG<"X!!EBqSG3!\rW<&pqu6Ttos7gDr;ZsC>0d0HrVclrqYpKo!nNi.qu@KtM!Y'=qPCY# +rr)iob'nGTFG@[4rViu"J,~> +JcGBB#5\@H!58F0hu +JcGBB#5nM7DVkElhum`s8W&s +!rVljrr3;^KKo\C!!$I-qYpNnrr;fpr;Q]uc!24jrW!#@rqucqrr)utq>1*j*9Wed"p4i*2ZNdN +G`i%)rVWF1JZ,WBH>gLsrVj##J,~> +JcGBB#5\@H!58F0hum`s8W&s +!rVljrr3;^KKo\C!!$I-qYpNnrr;fpr;Q]uc!24jrW!#@rqucqrr)utq>1*j*9Wed"p4i*2ZNdN +G`i%)rVWF1JZ,WBH>gLsrVj##J,~> +JcGBB#5\@H!58F0i;Wu[s8MuprVlg+pXdQ`N-fenJCa_ts8W)t!WDrprt"SA_3fk$G'KDJrr2rs +s8N#rrr3H'hT;j[I!Kp__uBT6s8MuurVZWo'(sVkS;2E7G`:tfrVulsrr)fnrr3`2jiOooIsQ +JcGBB#5nM7DVkEli;Wu[s8Mrmr;Q^!n?JKT*W?$G%^#a-s8W)trVZNjrrhALJi3i4!"(IKrVccq +s8Mrnqu6TuoY6o!-iO)Q#)<-Rs8W)trVZNjrrhb`O>d^L!"'n%rVZ]ps8MrnqYpKtq9PLE0DtkZ +@/g0#JXQQ8s3bb`n,E=kmAY!Ss8Dr$s*t~> +JcGBB#5\@H!58F0i;Wu[s8Mrmr;Q^!n?JKT*W?$G%^#a-s8W)trVZNjrrhALJi3i4!"(IKrVccq +s8Mrnqu6TuoY6o!-iO)Q#)<-Rs8W)trVZNjrrhb`O>d^L!"'n%rVZ]ps8MrnqYpKtq9PLE0DtkZ +@/g0#JXQQ8s3bb`n,E=kmAY!Ss8Dr$s*t~> +JcGBB#5\@H!58F0j8],Xs8Dor&+@KFNI,M^Fc*KBnGiLfrr2lqrtG7f\Yk($E,U2j^sN&[rr;ur +rVlfr%.VTOPC7=gF,$^1k5YG[rr)ir&H:n,Y(q1=E-dSWb5;5 +JcGBB#5nM7DVkElj8]/Y!r`#nrVluYN,]a6!"'ZWLu872s8Mrnqu6TuouD;Q&,cJ8.u:)#s8N&s +qtpBlrr_>PGUNFi$5HNrcN!kBrqu]krr3-#epCa;r;[0GI$XL+rr;upqu$Hn"R<.72[KB_)@f)j +]`7p/pje_1qYm^ +JcGBB#5\@H!58F0j8]/Y!r`#nrVluYN,]a6!"'ZWLu872s8Mrnqu6TuouD;Q&,cJ8.u:)#s8N&s +qtpBlrr_>PGUNFi$5HNrcN!kBrqu]krr3-#epCa;r;[0GI$XL+rr;upqu$Hn"R<.72[KB_)@f)j +]`7p/pje_1qYm^ +JcGBB#5\@H!58F0jo5G^s8W&srs\e`Z_i:sDKLDpXjm1Grr`9#rr2os%.DKBQ@*XlFcDd)jSo/Y +!ri5urVm8e\uLI/D01,jV9nl6rr`9#rr)ir%.r,QSpk^!FGQ6nh>I9P!ri6!rVm8h_Q/WADKC#d +T$6X%s8W'4s7h,2rV6?"E9$rqs8DrjJ=$<8rilEQ~> +JcGBB#5nM7DVkEljo5G^s8W#rrri/>BM\j2!!E<[?E3_urr`6"rVc`q"5]_Z/c>YP*&WYsrVlfu +rr;oprr^Ph>7:B0"# +JcGBB#5\@H!58F0jo5G^s8W#rrri/>BM\j2!!E<[?E3_urr`6"rVc`q"5]_Z/c>YP*&WYsrVlfu +rr;oprr^Ph>7:B0"# +JcGBB#5\@H!58F0jT#8Z%0,bI[#oQPDKh&4^uYIo')hb-s8N&ui6n?QFDZ)GS#=d-rVmK-rVlir +s7P$YQ?mRgGD;d#hu3Qfrqu`orr<#[f;OOKDfL&gU;.rr;utr7]5^IWK=JJ=s.$r;Q^% +rqu`orVuYCRK!3qZZ,+,r;QZnq14n4rr0/%J,~> +JcGBB#5nM7DVkEljSoG`rVt``C+K5_!uXacb5M>Ir;-Blrr<#7WC70m!!>2UYj),d$2XPus8Du` +[sg:7!! +JcGBB#5\@H!58F0jSoG`rVt``C+K5_!uXacb5M>Ir;-Blrr<#7WC70m!!>2UYj),d$2XPus8Du` +[sg:7!! +JcGBB#5\@H!58F0jo5bgrVjWcGBnOjTruf5rr3Z2rVc`ps8W&sntCDTGCbdV\)[Gdrt>>0rVlfr +s8DrEM0F2iL7>?fli-ncrr)fprXJo,rV3IBG^+^rWNt@Urr3?)rVc`ps8W&siK=+a"GE&D_<:ds +!WN&srr +JcGBB#5nM7DVkEljo5J_r;D6]rW!'96Y37Wrr3?(r;6Kms8W&rj[f@N"To]ME6J4ZrsJ`%r;Q]q +s8;kl+8u6C&N46eg&D!QrquZmrWW?$r:4"orW!'=<+Wl:rr3?(r;6Kms8W#r_^tce":Q_kL!]eu +)?'I2rr2rtrr;_FIDa=nj`JcIrVulslZnotrilEQ~> +JcGBB#5\@H!58F0jo5J_r;D6]rW!'96Y37Wrr3?(r;6Kms8W&rj[f@N"To]ME6J4ZrsJ`%r;Q]q +s8;kl+8u6C&N46eg&D!QrquZmrWW?$r:4"orW!'=<+Wl:rr3?(r;6Kms8W#r_^tce":Q_kL!]eu +)?'I2rr2rtrr;_FIDa=nj`JcIrVulslZnotrilEQ~> +JcGBB#5\@H!58F0jo>AZ#QKg&J:iHPg]%3SrqlWmrr)j'r;PMgI"?g0\+Tb#!rVrorr2lr#lO_! +C4CkcU!EW:!W2forr)j'rVl;0GCb=%ZL%Sj!r`#orr2lr$2ab9B7GP`R`#.(s8VrtrVlfortYP5 +pPsrJBmu"jIF\>ppuS,ad/X(DYlB4~> +JcGBB#5nM7DVkEljo>AZ#QGeE!!W[8\c2U1rqQ +JcGBB#5\@H!58F0jo>AZ#QGeE!!W[8\c2U1rqQ +JcGBB#5\@H!58F0jo5ehrVboYM0F5eI>tVkq>UEorVlcrs8N!(d?T9+G]nV/_X%4$rr)iq%KHG, +n?e."G]\:gYLiFGs8MusrXJo,rVbH?KQVQ_I[@\1rr3'!rVc`p%KHG,pqVr +JcGBB#5nM7DVkEljo5M`rVY#H*;oj>*,`^drr3B(qu-Nns8MuqV(`,Q!! +JcGBB#5\@H!58F0jo5M`rVY#H*;oj>*,`^drr3B(qu-Nns8MuqV(`,Q!! +JcGBB#5\@H!58F0j8TVgs8VfAVjMjRE-mbRi;ETS"TJB!s8N#t$Ko?rO*5McJYC*IrVuor&H;_/ +s8VuJYEsf_Dg@;Dg@kOG"9/8urr)j(m`_8eGB7hSS%[n]s8W$/rr;uts8LiaQ\T^%G_`9InG`Fh +rr)fprqcX%im-`ds0n'"s8N##s*t~> +JcGBB#5nM7DVkElj8T>_s8VVg:cA7P""@j%qYpKrrVQQkrr^W13$8,"!s2/Ye,B:Sr;6Knrr<#p +Y[TTprW!$=>.a8&rr`8trVlcq"5fb7.fKDM!C)"TrVm9'qu6Wps8W&1FuU$3!!<^6XQ'6Z!ri)p +rr2co$KB@orr9Hg\c;[.Y5a"~> +JcGBB#5\@H!58F0j8T>_s8VVg:cA7P""@j%qYpKrrVQQkrr^W13$8,"!s2/Ye,B:Sr;6Knrr<#p +Y[TTprW!$=>.a8&rr`8trVlcq"5fb7.fKDM!C)"TrVm9'qu6Wps8W&1FuU$3!!<^6XQ'6Z!ri)p +rr2co$KB@orr9Hg\c;[.Y5a"~> +JcGBB#5\@H!58F0jSo>]s8MuqrsIbuR=0-tHBYeemf*4hrr;urrr2p1p=QC'G]._VT$5pes8W)t +s8MuqrsIr-T7D'(GE/fTkPkJarr;urrr2p*qq\K=H>n"UR`!bOrr3*"s8MuqrsJ/ +JcGBB#5nM7DVkEljSo>]s8DlorrU/c4T,6^05[uOrr3-"s8Moprr3)f[oF=F!"/orR^W1ps8N#t +rVZWo!mclsr;ZpE>HuTTrri<#rqu`orr`)3@OM*S"$MIFo)AXkrVulorVluSU/2-p!! +!r`0!rr)rsr;?Tprr2rtrW3&uYQ'+~> +JcGBB#5\@H!58F0jSo>]s8DlorrU/c4T,6^05[uOrr3-"s8Moprr3)f[oF=F!"/orR^W1ps8N#t +rVZWo!mclsr;ZpE>HuTTrri<#rqu`orr`)3@OM*S"$MIFo)AXkrVulorVluSU/2-p!! +!r`0!rr)rsr;?Tprr2rtrW3&uYQ'+~> +JcGBB#5\@H!58F0j8])Ws8;rsrr3Vo\sRnbEcZr.b4Yf6s8N#rrVlfr'D'eXM0NoZH&f;bs8W)u +rr2lprr2p,l+rsAEcH,ORE"Xorr;uss8Drs'DUChO*Y\bG)EBKrr;utrr2lprr2p0m)l/WF`;AM +PecA[rVlisrr;us$N9o$s8W)srVlirY5a"~> +JcGBB#5nM7DVkElj8])W!rMoorr3)LF>O'u!"0?)R-FYLs8N#qqu$Hn"6d%%')_e<-?6Bls8N&t +rqlWkrr3)MKLH.F!"/ufQ.u?;s8N#rqu$Hn"7j +JcGBB#5\@H!58F0j8])W!rMoorr3)LF>O'u!"0?)R-FYLs8N#qqu$Hn"6d%%')_e<-?6Bls8N&t +rqlWkrr3)MKLH.F!"/ufQ.u?;s8N#rqu$Hn"7j +JcGBB#5\@H!58F0huE]Ts8 +JcGBB#5nM7DVkElhuE]T$2j]"s8ViEMEMjV!!=%Frql]ps8E)ur;6Kn"R!%2/dVFV"[DJSrVuos +rW<#prVlg!iJpPRrW!$0OoG7Ws8Muur;6Kn"RO!T0+Rs]""rF.rVlisrW<&qqu6U'k*fL%!<<*( +D#XA3pAb-kX8d\~> +JcGBB#5\@H!58F0huE]T$2j]"s8ViEMEMjV!!=%Frql]ps8E)ur;6Kn"R!%2/dVFV"[DJSrVuos +rW<#prVlg!iJpPRrW!$0OoG7Ws8Muur;6Kn"RO!T0+Rs]""rF.rVlisrW<&qqu6U'k*fL%!<<*( +D#XA3pAb-kX8d\~> +JcGBB#5\@H!58F0huE]Trr)ir$Mj8*Q@=71CrHAOrr;uss8Dor%.`G[LjserIe*L;s8W)trr)ir +$N0G7SUZ*:D63d7rr;uss8;rsrr3>ul`lFuI!Thlrqucqs8N#rrVm5pe"_MEI;kMPrViAfJ,~> +JcGBB#5nM7DVkElhuE]Ts8)forr3,ll$5)grW!"Vs8)`ps8E-!qu$HmrrhK*@1WM>!!MH`rVuos +rr;iqr;Q^!q< +JcGBB#5\@H!58F0huE]Ts8)forr3,ll$5)grW!"Vs8)`ps8E-!qu$HmrrhK*@1WM>!!MH`rVuos +rr;iqr;Q^!q< +JcGBB#5\@H!58F0j8T;^s8N#rrVca(kLutpH$+1QP+9ntr;H`prr2p1qVTDeIX5sVJ"!D$rr)lr +rr)forsS2LZ]TNWEd*J2_ta0/!WE#rrs[l6V1X)7FaKIMiW&lUrW<&rrr2p,o%gpEH?jIRLRG[C +rVi>eJ,~> +JcGBB#5nM7DVkElj8T;^s8N#pr;HWtd(39sr;ZsH4JD]Orr)utqYgEn"8BZr8c/Pp4^HJ7rVulr +r;6Hm"5CY(.K'5L)Ej&MrVc]rqu-Kn"2q'6#Q4W*1ebgerVlctr;6Kmrr_E"GW>X%"V*\?jo#(I +s*t~> +JcGBB#5\@H!58F0j8T;^s8N#pr;HWtd(39sr;ZsH4JD]Orr)utqYgEn"8BZr8c/Pp4^HJ7rVulr +r;6Hm"5CY(.K'5L)Ej&MrVc]rqu-Kn"2q'6#Q4W*1ebgerVlctr;6Kmrr_E"GW>X%"V*\?jo#(I +s*t~> +JcGBB#5\@H!58F0jSo>]s8Drrrs\hXb++$,EHZ_jYMK'Ss8W&urVca(mF&D*G^"%PJ"FO>rr3*" +s8MuqrsR]0Tn[`4F+&nFf(8n@!ri5urVm8te%V,pGAhbTQau,Trr`9#rr)fq$fo^6Mfs5^I=nEB +mJd+crgWq<~> +JcGBB#5nM7DVkEljSo>]s8;lqrri5)QTPBK!!=BO_"I^,s8E#qrVluUX(sOnqu?dWF2e.Y"9/?"qu-Nsb,\AZr;Zp*<28:KrrE%f +s*t~> +JcGBB#5\@H!58F0jSo>]s8;lqrri5)QTPBK!!=BO_"I^,s8E#qrVluUX(sOnqu?dWF2e.Y"9/?"qu-Nsb,\AZr;Zp*<28:KrrE%f +s*t~> +JcGBB#5\@H!58F0j8TYhs8ViGZ]B?QE-m5/_Wgdns8W&trrTOL=-: +rr<#s!ri6!SH"*~> +JcGBB#5nM7DVkElj8T>_s8VYpDC,5]":dePg$eq?!rVrprr3,rk)hqCrW!')&neH&rr;uq#QOf' +s74$V-iF#J%5N+VkPkM]quH`qrri8hS5UF,!##AD>+OCDs8W)rr;Zcrs7=]u/d2.R":HDlaP[!s +s82rss8JPgJ,~> +JcGBB#5\@H!58F0j8T>_s8VYpDC,5]":dePg$eq?!rVrprr3,rk)hqCrW!')&neH&rr;uq#QOf' +s74$V-iF#J%5N+VkPkM]quH`qrri8hS5UF,!##AD>+OCDs8W)rr;Zcrs7=]u/d2.R":HDlaP[!s +s82rss8JPgJ,~> +JcGBB#5\@H!58F0jo5ehrVbZHKm\)cJr?k_oDS^hrVZX&r5XbMG'J.dQGD_Wrr3Z2rVc`qs8Dr_ +WJ5nGFa]+Fc1Cl4s8W&rrXAc'd?B<0G]SY%]&E;[s8W$/rr<#trq*URJou9_MP.uYq>UEorVlea +s*t~> +JcGBB#5nM7DVkEljo5M`r;=B$'`J(8"W_9WlM^_`qu$El"TA.Y*tJ8M";WPDeF!88$N9l"rr2rr +rRY3dr;Zs? +JcGBB#5\@H!58F0jo5M`r;=B$'`J(8"W_9WlM^_`qu$El"TA.Y*tJ8M";WPDeF!88$N9l"rr2rr +rRY3dr;Zs? +JcGBB#5\@H!58F0jo>AZ#QK^#JV&B^mf!.hrqucps8N#t$2jhYBmkP^OOF.,s8W&trW3&urr39% +s.X4YJpj`_r;Qotrr2rsrr3<'rpOoQJUrU!q>L?nrVuits8N#t#lFY6Aq5J]TATSH"8r,srg!M6~> +JcGBB#5nM7DVkEljo>AZ#QGV@!!NORh>R?WrqcTls8N#t$2XY4!!!$(,GtJ=s8VrurVlirrr39# +s$cth"U/;Zr;QorrVccqrr3&tro*hV!sTF.oDS[mr;6Hls8N#t#l4LE!!*3,7)&U!"8_rorg!M6~> +JcGBB#5\@H!58F0jo>AZ#QGV@!!NORh>R?WrqcTls8N#t$2XY4!!!$(,GtJ=s8VrurVlirrr39# +s$cth"U/;Zr;QorrVccqrr3&tro*hV!sTF.oDS[mr;6Hls8N#t#l4LE!!*3,7)&U!"8_rorg!M6~> +JcGBB#5\@H!58F0jo5\erVjrsGC"\$`T7$u!r`/uqu?]q%eZoPGC4q?f(/k@rVlirqu73*rn3HZ +G^PF`hu52dqZ$Tos8W(_s*t~> +JcGBB#5nM7DVkEljo5J_r;Dp)rW!!QO3.D$!rW)tqu?]p%dRC%!!!."[-.Jhr;Q`qqu6crrNn3V +!!46k_#F?8r;Zcnrt,2-okt9>!!5QcgAh3OrVulorr`2ucT_=.#nUsep](9ks8W(_s*t~> +JcGBB#5\@H!58F0jo5J_r;Dp)rW!!QO3.D$!rW)tqu?]p%dRC%!!!."[-.Jhr;Q`qqu6crrNn3V +!!46k_#F?8r;Zcnrt,2-okt9>!!5QcgAh3OrVulorr`2ucT_=.#nUsep](9ks8W(_s*t~> +!rr9"qu6Tp!WN,qrW3&uq>UQrs8MuorqcZnrW<-!s8Dots8Mus!WN,trW3&urr3#us82f:rs&?" +HN:bZqr@\crr;].Sq(m&J!e4Ns8Mio%fZM.jfa_kEHR/6hZ*TSq>Up's8:*:K6;3]Q+HPdrqZTo +rXAho[?Z,ZF,$79s8W)orso&.s4=6*GAqehYj)2drfdA4~> +!rr9"qu6Tp!WN,qrW3&uq>UQrs8MuorqcZnrW<-!s8Dots8Mus!WN,trW3&urr3#us82f:rs&E$ +]l)^,rT!n]rVu5@7K`Vi">u21s8Mio"oeQ%b[;Un!!O<:^]4<4q>UWss7i-_"o\K)1OS9`rV?Hs +rr<#RD__4k"V3i#s8W)orrrE%s0,Z:rW!*PB\!.]rfdA4~> +!rr9"qu6Tp!WN,qrW3&uq>UQrs8MuorqcZnrW<-!s8Dots8Mus!WN,trW3&urr3#us82f:rs&?" +HN:bZqr@\[rVu5@7K`Vi">u21s8Mio"oeQ%b[;Un!!O<:^]4<4q>UWss7i-_"o\K)1OS9`rV?Hs +rr<#RD__4k"V3i#s8W)orrrE%s0,Z:rW!*PB\!.]rfdA4~> +!rr8tr;Qltrr;unrr`5tr;HWoo`"pjqYpQpp\tErs8N&urqQKqrr;uqr;Qltrr;u@rs&?"HN:bZ +qrRh[rr<#srr3;m^P[AWFc,/WrVQU+rr;urs8ViMUkEi1Gc1B9rql]srr;rrrsA/9OFD.jK$aMp +qu76,s8Muss8:u^L3IW]RI^=Uqu76,s8N#ts7+L&JT5aY^Ae*1PlH7~> +!rr8tr;Qltrr;unrr`5tr;HWoo`"pjqYpQpp\tErs8N&urqQKqrr;uqr;Qltrr;u@rs&E$]l)^, +rT4%]rr<#rrr3&XJ/S=d"!5D[r;6L#rr;ups8VQ':D!L*"&JRerql]srr;oqrs@VI-3=/I&Yf:% +qu7!%s8Moqs7t&M')hk53T^5 +!rr8tr;Qltrr;unrr`5tr;HWoo`"pjqYpQpp\tErs8N&urqQKqrr;uqr;Qltrr;u@rs&?"HN:bZ +qrRh[rr<#rrr3&XJ/S=d"!5D[r;6L#rr;ups8VQ':D!L*"&JRerql]srr;oqrs@VI-3=/I&Yf:% +qu7!%s8Moqs7t&M')hk53T^5 +&,uV/qsX(Eo)Jags8N&pmeuYQrri?$rr<#trW_u\oD\1GnbE+lo'Q&Krr;ZZmJ6e]rVuos'`@@d +qZ$Qos8N&uqXiW&iPrt#,/rr)cps8M6"R!4eprr&)]J,~> +&,uV/qsX(Eo)Jags8N&pmeuYQrri?$rr<#trW_u\oD\1GnbE+lo'Q&Krr;ZZmJ6e]rVuos'`@@d +qZ$Qos8N&uqX(4s7uEh!W;iors._L70`hV +s8;`nrr2rps8N>u`.B36<<)dirr`9#rVQTo#O\-b&-0ZKqtg?lrXA`$s8W&JNA(>]s82bZs*t~> +&,uV/qsX(Eo)Jags8N&pmeuYQrri?$rr<#trW_u\oD\1GnbE+lo'Q&Krr;ZZmJ6e]rVuos'`@@d +qZ$Qos8N&uqX(4s7uEh!W;iors._L70`hV +s8;`nrr2rps8N>u`.B36<<)dirr`9#rVQTo#O\-b&-0ZKqtg?lrXA`$s8W&JNA(>]s82bZs*t~> +.f]7KNcfVkHF*#=rVccNG^Xg]GGM@>e,TIIs8N&ur;WL3k4!bLHdhulrr4DErnr6NScATeY]tS` +q>LbPqeCs*FaZs81dTrVcfqrr3,MD92bTp](6l!WE#s +rreg?pAY'bs8W&urVlg"kAmj,r:g6jrr;rrrrfTIjo55Ps8W&urVlfupjeh4rfmG5~> +.f]7KNcfVkHF*#=rVccNG^Xg]GGM@>e,TIIs8N&ur;WL3k4!bLHdhulrr4DErnr6NScATeY]tS` +q>LbPqeEs1N=,s8CpVrr)rsqu6TuVZDqZqY1$hrW2rq +rr3*\"7?*dq#:Krs8Muorr3,J!Fu-*p](6ls8;lr"D._[rquKi!ri/qrr3/m!&X]QrfmG5~> +.f]7KNcfVkHF*#=rVccNG^Xg]GGM@>e,TIIs8N&ur;WL3k4!bLHdhulrr4DErnr6NScATeY]tS` +q>LbPqeCs*FaZs81dTrr)rsqu6TuVZDqZqY1$hrW2rq +rr3*\"7?*dq#:Krs8Muorr3,J!Fu-*p](6ls8;lr"D._[rquKi!ri/qrr3/m!&X]QrfmG5~> +=RVboOJJYITQ>SdNS#5eAKCWQPRp&G$j#Q=Mu +S:(&1rq-6jrW`8tk]*j,r:L$grW`5tZZ,%+rUp3irr;m"pjeb3rr//^J,~> +=RVboOJJYITQ>SdNS#5A"o!0I6Wp&G$j#Q4>p +2ur@GrUg-irW`2qd/[VTqXsmerW`)pB)p0Ur:U*hrWi>snGk +=RVboOJJYITQ>SdNS#5A"o!0I6Wp&G$j#Q4>p +2ur@GrUg-irW`2qd/[VTqXsmerW`)pB)p0Ur:U*hrWi>snGk +"/'kVqYgF"_JYS3r;YVj^]+6omc`Z.CnCP&rr;orj)2+#l?B"_PQ1X]s8DrqP'M;Cs82i"H`qP? +rqufqrVk2eIsBZHrVZ]6Bsd=-rrqMICqK`Ebl7nDs*FaZs81RN#6"PMCrlYSo)AsorVi:7pAb-_ +rs&H$kAmg,r:0dkr;O!Ajo>;Mrs/Q'pOAV2rr//^J,~> +"/'kVqYgF"_JYS3r;YVj^]+6omc`Z.CnCP&rr;orj)2+#l?B"_PQ1X]s8DrqP'M;Cs82i"H`qP? +rqufqrVk2eIsBZHrVZ]6Bsd=-rrqMICqK`Ebl7nFs1N=,s8C^P#5eCu!0I6Wo)Asor;JVTmJm.U +rs&E#ci@MSqXORiqYk(,bl@V3rs/N&n,P6Dr;Mr\J,~> +"/'kVqYgF"_JYS3r;YVj^]+6omc`Z.CnCP&rr;orj)2+#l?B"_PQ1X]s8DrqP'M;Cs82i"H`qP? +rqufqrVk2eIsBZHrVZ]6Bsd=-rrqMICqK`Ebl7nDs*FaZs81RN#5eCu!0I6Wo)Asor;JVTmJm.U +rs&E#ci@MSqXORiqYk(,bl@V3rs/N&n,P6Dr;Mr\J,~> +'7,9*s8;inrVDn6mJm4BDS,lDrVca]\o#@ar;QWoZu=.elZ9;;Fm8r(s8DrVG+!lMs82i"G11l< +s8Drrr;WRARWR9`qu>#_P4ekQrVHQBFH#qlrltHIqYtmB^&Ruars&H%e835+r:9jmrr)keIJ3^? +o)Apms6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +'7,9*s8;inrVDn6mJm4BDS,lDrVca]\o#@ar;QWoZu=.elZ9;;Fm8r(s8DrVG+!lMs82i"G11l< +s8Drrr;WRARWR9`qu>#_P4ekQrVHQBFH#qlrltHIr;XHJhZ*Q/rs&B#W;r%[qXXXkrqudU!:Bgb +o)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +'7,9*s8;inrVDn6mJm4BDS,lDrVca]\o#@ar;QWoZu=.elZ9;;Fm8r(s8DrVG+!lMs82i"G11l< +s8Drrr;WRARWR9`qu>#_P4ekQrVHQBFH#qlrltHIqYtmB^&Ruars&B#W;r%[qXXXkrqudU!:Bgb +o)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +s*dZ,s8;iorr;unrr)lRDS6#Is8MuprVr+>s8Mupr1\T/s6Og4hJC.0r;QWo\T,KAR/d'`Z#K'" +Jb]9DrVl> +s*dZ,s8;iorr;unrr)lRDS6#Is8MuprVr+>s8Mupr1\T/s6Og4hJC.0r;QWo\T,KAR/d'`Z#K'" +Jb]9DrVl> +s*dZ,s8;iorr;unrr)lRDS6#Is8MuprVr+>s8Mupr1\T/s6Og4hJC.0r;QWo\T,KAR/d'`Z#K'" +Jb]9DrVl> +",hB)p&4n\rVlisr;YVk]`7p0s8N&qrlK6=s8;ofGbP-:m<,H.J!U-6rVcMRJ*DHPs82i#E:D"c +ec,LErmY_taD9T2s6t90s8;orrr2utrr2utbl7nDs*FaZs81RN#6"SOCrlYSo)AsorVrC9pAb-_ +rs&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr//^J,~> +",hB)p&4n\rVlisr;YVk]`7p0s8N&qrlK6=s8;ofGbP-:m<,H.J!U-6rVcMRJ*DHPs82i#E:D"c +ec,LErmY_taD9T2s6t90s8;orrr2utrr2utbl7nFs1N=,s8C^P#5eG"!0I6Wo)Asor;S_VmJm.U +rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +",hB)p&4n\rVlisr;YVk]`7p0s8N&qrlK6=s8;ofGbP-:m<,H.J!U-6rVcMRJ*DHPs82i#E:D"c +ec,LErmY_taD9T2s6t90s8;orrr2utrr2utbl7nDs*FaZs81RN#5eG"!0I6Wo)Asor;S_VmJm.U +rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +'%)>POIaJFqu?]os8;oRDS6#Irr5=ar;OiRc2RS>`c/Hfs6Oj*ri1/+rquc[Ei&V[S,`BcZ#K%" +G,YH>r;Wd7lGRJms8MP5U]15ks8W)urr2lqs8L:C#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2 +rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +'%)>POIaJFqu?]os8;oRDS6#Irr5=ar;OiRc2RS>`c/Hfs6Oj*ri1/+rquc[Ei&V[S,`BcZ#K%" +G,YH>r;Wd7lGRJms8MP5U]15ks8W)urr2lqs8L:C#5nM7DVkElg]%KTs/?![s8) +'%)>POIaJFqu?]os8;oRDS6#Irr5=ar;OiRc2RS>`c/Hfs6Oj*ri1/+rquc[Ei&V[S,`BcZ#K%" +G,YH>r;Wd7lGRJms8MP5U]15ks8W)urr2lqs8L:C#5\@H!58F0g]%KTs/?![s8) +'*$[RF`)8DNj8'QrVccQDS6#IrVneRs2f*)s8)]#E97*!m<,?+e8N8)qu>#^c2N'[s82i$ET[:e +KCf*@q36X4^hhg+s7(?/rr)`os8L1@#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)% +YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +'*$[RF`)8DNj8'QrVccQDS6#IrVneRs2f*)s8)]#E97*!m<,?+e8N8)qu>#^c2N'[s82i$ET[:e +KCf*@q36X4^hhg+s7(?/rr)`os8L1@#5nM7DVkElg]%KTs/?![s8) +'*$[RF`)8DNj8'QrVccQDS6#IrVneRs2f*)s8)]#E97*!m<,?+e8N8)qu>#^c2N'[s82i$ET[:e +KCf*@q36X4^hhg+s7(?/rr)`os8L1@#5\@H!58F0g]%KTs/?![s8) +')V_/e\7N1F`!/brqufQDS6#IrVnhSs2f*)s8MqNP5G1Wm<,B-omrJ,qu!15oD*d's82i$Eod5: +DV+mfk&R[)]PZI(rpb6.rr)iqrs&K&rr)irrltHIqYtmB^&Ruars&H%e835+r:9jmrr)keIJ3^? +o)Apms6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +')V_/e\7N1F`!/brqufQDS6#IrVnhSs2f*)s8MqNP5G1Wm<,B-omrJ,qu!15oD*d's82i$Eod5: +DV+mfk&R[)]PZI(rpb6.rr)iqrs&K&rr)irrltHIr;XHJhZ*Q/rs&B#W;r%[qXXXkrqudU!:Bgb +o)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +')V_/e\7N1F`!/brqufQDS6#IrVnhSs2f*)s8MqNP5G1Wm<,B-omrJ,qu!15oD*d's82i$Eod5: +DV+mfk&R[)]PZI(rpb6.rr)iqrs&K&rr)irrltHIqYtmB^&Ruars&B#W;r%[qXXXkrqudU!:Bgb +o)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +s8N)urr3E%d\q/2jSo29DS6#Irr4qVr;OfSdJs7"FJ]$7s6Xs-s8B!?lMg@$TDeD0SH&KdZ#Sn) +lZK3,rk!+(rk*(&s8VS1VZ6S2rs&?"HN:bZqqM,TrVtA`aT)2/rs/Q%s."N2s8MTh#6"ScEj5TA +nc&gks0H_,s8DNg#QFbuJ=6H:rfmG5~> +s8N)urr3E%d\q/2jSo29DS6#Irr4qVr;OfSdJs7"FJ]$7s6Xs-s8B!?lMg@$TDeD0SH&KdZ#Sn) +lZK3,rk!+(rk*(&s8VS1VZ6S2rs&E$]l)^,rS.>VquUs8;Hf#Q=\m!&FTPrfmG5~> +s8N)urr3E%d\q/2jSo29DS6#Irr4qVr;OfSdJs7"FJ]$7s6Xs-s8B!?lMg@$TDeD0SH&KdZ#Sn) +lZK3,rk!+(rk*(&s8VS1VZ6S2rs&?"HN:bZqqM,TquUs8;Hf#Q=\m!&FTPrfmG5~> +"J+KMqu$Hn;#S@R[f?BaDS6#Is8W)uqu=rVci=!_C=N7[s6Xs.s8U\h^]2Gobl@9_SH&KdZ#]", +qO)p-s,N!1s1W@*s8;_^PPG+Urr;urroqYorr11B#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2 +rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +"J+KMqu$Hn;#S@R[f?BaDS6#Is8W)uqu=rVci=!_C=N7[s6Xs.s8U\h^]2Gobl@9_SH&KdZ#]", +qO)p-s,N!1s1W@*s8;_^PPG+Urr;urroqYorr11B#5nM7DVkElg]%KTs/?![s8) +"J+KMqu$Hn;#S@R[f?BaDS6#Is8W)uqu=rVci=!_C=N7[s6Xs.s8U\h^]2Gobl@9_SH&KdZ#]", +qO)p-s,N!1s1W@*s8;_^PPG+Urr;urroqYorr11B#5\@H!58F0g]%KTs/?![s8) +&nJ*Cqu?ZpqYo\r\,QE`DS,oFrr,7^rUl;,oD\cXK_>BCs6Xs.s8DSAQMI8%mf)j+SH&KdZ#]%- +s2/a/luKB2s1`F+s8)bsE:!W%s8N&rs352arqjt?#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2 +rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +&nJ*Cqu?ZpqYo\r\,QE`DS,oFrr,7^rUl;,oD\cXK_>BCs6Xs.s8DSAQMI8%mf)j+SH&KdZ#]%- +s2/a/luKB2s1`F+s8)bsE:!W%s8N&rs352arqjt?#5nM7DVkElg]%KTs/?![s8) +&nJ*Cqu?ZpqYo\r\,QE`DS,oFrr,7^rUl;,oD\cXK_>BCs6Xs.s8DSAQMI8%mf)j+SH&KdZ#]%- +s2/a/luKB2s1`F+s8)bsE:!W%s8N&rs352arqjt?#5\@H!58F0g]%KTs/?![s8) +&:KB+s82`mqZ#Mn]DhieD8#fG5e:X?s8M81PQ1X\s6Xs.s8)bpGiXCGs8Ve@SH&KdZ#]%-rp+U3 +`GFB0s1W@*s82i6E2E@0r;?HkqiH$cs8C4B#5\@H!58F0g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'n +rVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +&:KB+s82`mqZ#Mn]DhieD8#fG5e:X?s8M81PQ1X\s6Xs.s8)bpGiXCGs8Ve@SH&KdZ#]%-rp+U3 +`GFB0s1W@*s82i6E2E@0r;?HkqiH$cs8C4B#5nM7DVkElg]%KTs/?![s8) +&:KB+s82`mqZ#Mn]DhieD8#fG5e:X?s8M81PQ1X\s6Xs.s8)bpGiXCGs8Ve@SH&KdZ#]%-rp+U3 +`GFB0s1W@*s82i6E2E@0r;?HkqiH$cs8C4B#5\@H!58F0g]%KTs/?![s8) +"+tQdo)8SXo9+4[s8Uqp[drnXnaYkIFar?Js4(o%rqu`pm<5N0qu5,iN-EGDs7Uo4s82i%F6ET$ +r0`%fN;NPQ^M_j,r;HATC:a':rs&D>ELlq(rltHIqYtmB^&Ruars&H%e835+r:9jmrr)keIJ3^? +o)Apms6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +"+tQdo)8SXo9+4[s8Uqp[drnXnaYkIFar?Js4(o%rqu`pm<5N0qu5,iN-EGDs7Uo4s82i%F6ET$ +r0`%fN;NPQ^M_j,r;HATC:a':rs&D>ELlq(rltHIr;XHJhZ*Q/rs&B#W;r%[qXXXkrqudU!:Bgb +o)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +"+tQdo)8SXo9+4[s8Uqp[drnXnaYkIFar?Js4(o%rqu`pm<5N0qu5,iN-EGDs7Uo4s82i%F6ET$ +r0`%fN;NPQ^M_j,r;HATC:a':rs&D>ELlq(rltHIqYtmB^&Ruars&B#W;r%[qXXXkrqudU!:Bgb +o)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +&ELHCJ?Q/YY`*\*q#(0FDgM>,6$R=-h>dEPVK1l"rVZ]]Cnq%-rptk`JF5X +_f0P#s8)c-AD."\rVlDPEepp$YEs'bq#:9:rs&?"HN:bZqqM,TrVtA`aT)2/rs/Q%s."N2s8MTh +#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rfmG5~> +&ELHCJ?Q/YY`*\*q#(0FDgM>,6$R=-h>dEPVK1l"rVZ]]Cnq%-rptk`JF5X +_f0P#s8)c-AD."\rVlDPEepp$YEs'bq#:9:rs&E$]l)^,rS.>VquUs8;Hf#Q=\m!&FTPrfmG5~> +&ELHCJ?Q/YY`*\*q#(0FDgM>,6$R=-h>dEPVK1l"rVZ]]Cnq%-rptk`JF5X +_f0P#s8)c-AD."\rVlDPEepp$YEs'bq#:9:rs&?"HN:bZqqM,TquUs8;Hf#Q=\m!&FTPrfmG5~> +s8NSKQ#gtfE/E-Frr)lYSYQ+W6D)Ets8DrsY,2*srr)leR_\t$rr9HsZ2ah'pn5+rr;Xd(mJm+` +kan="rql`BQ0&&Es8DuiU3^j$Ed4VJs8Dusc2S"Es*FaZs81RN#6"SOCrlYSo)AsorVrC9pAb-_ +rs&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr//^J,~> +s8NSKQ#gtfE/E-Frr)lYSYQ+W6D)Ets8DrsY,2*srr)leR_\t$rr9HsZ2ah'pn5+rr;Xd(mJm+` +kan="rql`BQ0&&Es8DuiU3^j$Ed4VJs8Dusc2S"Gs1N=,s8C^P#5eG"!0I6Wo)Asor;S_VmJm.U +rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +s8NSKQ#gtfE/E-Frr)lYSYQ+W6D)Ets8DrsY,2*srr)leR_\t$rr9HsZ2ah'pn5+rr;Xd(mJm+` +kan="rql`BQ0&&Es8DuiU3^j$Ed4VJs8Dusc2S"Es*FaZs81RN#5eG"!0I6Wo)Asor;S_VmJm.U +rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +s8DutrojRJqu?Woo`"pir;Qcrp\t6mrr2utkPl%ks8N&ukih9pli7"as8L7B#5\@H!58F0g]%KV +s3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +s8DutrojRJqu?Woo`"pir;Qcrp\t6mrr2utkPl%ks8N&ukih9pli7"as8L7B#5nM7DVkElg]%KT +s/?![s8) +s8DutrojRJqu?Woo`"pir;Qcrp\t6mrr2utkPl%ks8N&ukih9pli7"as8L7B#5\@H!58F0g]%KT +s/?![s8) +s8N,urqud"rVulrs8Muq"T8/pr;6Ejs8;cm!W2fnr;uoor;HTor;QWqr;6Ejs8)forqulqqtg6k +r;?Tpr;HQqrr;uErs&?"HN:bZqqM,TrVtA`aT)2/rs/Q%s."N2s8MTh#6"ScEj5TAnc&gks0H_, +s8DNg#QFbuJ=6H:rfmG5~> +s8N,urqud"rVulrs8Muq!;l`k!;l`ms8)Wj!W)]lquZclqYgVquUs8;Hf#Q=\m!&FTPrfmG5~> +s8N,urqud"rVulrs8Muq!;l`k!;l`ms8)Wj!W)]lquZclqYgUs8;Hf#Q=\m!&FTPrfmG5~> +rr2utrVZfss8Mrr!ri5u])Mj2s8LFG#5\@H!58F0g]%KVs3ti*s8;Hf#QF]%Rsar0rpp'nrVu)$ +YQ+Ojrs&E$Z>eq*rUTsnrr;bCR/d0bPlH7~> +rr2utrVZfss8Mrr!ri5t])Mj2s8LFG#5nM7DVkElg]%KTs/?![s8) +rr2utrVZfss8Mrr!ri5t])Mj2s8LFG#5\@H!58F0g]%KTs/?![s8) +nG`Uis6SaZj9+B>s8LCF#5\@H!58F0g]%KUs3kc(s82Be#QF]%Rsao/rUTsmr;Yr"YQ+Lirs&B# +Z>en)r:9jmrVuV@R/d0bPlH7~> +nG`Xjs4PK8^rQZ#aSZ#9d/O=Js1N=,s8C^P#5eG"!0I6Wo)Asor;S_VmJm.Urs&E$d/[VTqXORi +qYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nG`Xjs4PK8^rQZ#aSZ#9d/O=Hs*FaZs81RN#5eG"!0I6Wo)Asor;S_VmJm.Urs&E$d/[VTqXORi +qYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&dkrn2aGHbaq2HZZ(YrVk4E#5\@H!58F0g]%KVs4;/3s8;Hf#QFZ$TRlk;rpp'nrVu/*[/^'o +rs&E$[r^a4rUU!grWW(NScA]gPlH7~> +nc&^hrj)jB!!>mar;P+D#5nM7DVkElg]%KTs/?![s8) +nc&^hrj)jB!!>mar;P+D#5\@H!58F0g]%KSs/5pYs7u6c#QFW#2ZW4Er:9jlqu>"C@/p&mrs& +nc&gjs.sjiJ:YRh#(_;UG38i&dJjFIs*FaZs81RN#5eG:'!2-1o)Asoqu9tLpAb*^rs&E$iYmIL +qXORiqYuBhhZ*NErs/N%paK>Fr;Mr\J,~> +nc&ghs%<=q!<^1A"p+f-!7(WAdJjFKs1N=,s8C^P#5\@r!0$sRo)Asor;SMPli6nRrs&B#c2_,L +q=4Ihq>Xn(aoD8/rs/K%n,P$>qu2i[J,~> +nc&ghs%<=q!<^1A"p+f-!7(WAdJjFIs*FaZs81RN#5eG"!0I6Wo)Asor;S_VmJm.Urs&E$d/[VT +qXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&gkriCXn(aoD8/rs/K%n,P$>qu2i[J,~> +nc&agr`B.%^&S9:!n%#FdJjFKs1N=,s8C^P#5eG6$E*q#o)Asoqu9V7p&G!]rs&E$h[k/7qXORi +qYu*Wg].3Brs/N%pDm$/r;Mr\J,~> +nc&agr`B.%^&S9:!n%#FdJjFIs*FaZs81RN#5eG"!0I6Wo)Asor;S_VmJm.Urs&E$d/[VTqXORi +qYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&gks/U?pIZ)(,#(h>TI-CV/dJjFIs*FaZs81RN#5eG"!0I6Wo)Asor;SbXmJm.Urs&E$d/d_V +qXORiqYt40bl@V3rs/N&nGtHGr;Mr\J,~> +nc&mks&K+%!#I"0`$Y`l!!*)Is8::E#5nM7DVkElg]%KVs4:r-s8;Hf#QFZ$SpgA5rpp'nrVu/% +ZN'jmrs&E$[Vk:.rUU!grWW+KS,`HdPlH7~> +nc&mks&K+%!#I"0`$Y`l!!*)Is8::E#5\@H!58F0g]%KTs/?![s8) +nc&mms/U?sFj0ma`;^%'H\$S.s8C@F#5\@H!58F0g]%KTs/?![s8) +nc&mks&K+*!1Elc`;^#a!!3/Js8::E#5nM7DVkElg]%KUs3kf)s82Be#QF]%Rsju0rUTsmr;Yr# +YQ+Lirs&B#Z>nt*r:9jmrVuVAR/d0bPlH7~> +nc&mks&K+*!1Elc`;^#a!!3/Js8::E#5\@H!58F0g]%KTs/?![s8) +nc&mms/U?rG09g]i;N`Sl2D"frr%n*JUH\]rR(WLqYtmB^&Ruars&B#W;r%[qXXXkrqudU!:Bgb +o)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+)!1*W[i;N`Sl2D"frr!o=! +o)Apms6+I+s8;Ee#5nM,E97,uo)Asos7h)2s8Dq]s*t~> +nc&mks&K+)!1*W[i;N`Sl2D"frr!o=! +nc&mms/U?sG09g]j8K)Zrr2r_rX&Q&rJu>WI-CV/dJjFIs*FaZs81RN#5eG"!0I6Wo)Asor;S_V +mJm.Urs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;P4G#lX]#s8N&trVc]m!ri6!r;QfsrVcWr +rVliri;\<~> +nc&mks&K+)!1*W[iVriVlM_+grr!o=! +nc&mks&K+)!1*W[iVriVlM_+grr!o=! +nc&mms/U?sG0Bp`jo5Vcs8Mup`VKQ5m/ICks8J+-JUH\]rR(WLqYtmB^&Ruars&B#W;r%[qXXXk +rqudU!:Bgbo)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lBs8W)qs8W'!s8N#ts8Mlp!<(gT +J,~> +nc&mks&K+*!13`^jo5Vcs8Mup`VKQ5m/ICks8F,@!W^XJr6bNKr;XHJhZ*Q/rs&H%e835+r:9jm +rr)keIJ3^?o)Apms6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N#Ds8W)qs8W'!s8N#ts8Mlp!<(gT +J,~> +nc&mks&K+*!13`^jo5Vcs8Mup`VKQ5m/ICks8F,@!W^XJr6bNKqYtmB^&Ruars&B#W;r%[qXXXk +rqudU!:Bgbo)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lBs8W)qs8W'!s8N#ts8Mlp!<(gT +J,~> +nc&mms/U?sG0Bp`k5Pbes8DorY'9[@rTsOjrr;tZI"?\/s8C@F#5\@H!58F0g]%KTs/?![s8) +nc&mks&K+*!13`^k5Pbes8DorY'9[@rTsOjrr;s?!!3/Js8::E#5nM7DVkElg]%KVs3tl+s8;Hf +#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cfDkjL*kSK;rr)lslG0O,Y.Xf7 +rVulsrr<#_]<8E@_"Ia,i;\<~> +nc&mks&K+*!13`^k5Pbes8DorY'9[@rTsOjrr;s?!!3/Js8::E#5\@H!58F0g]%KTs/?![s8) +nc&mms/U?sG0Bp`jo5Vcs8UAmL\LiJm/ICks8J+-JUH\]rR(WLqYtmB^&Ruars&B#W;r%[qXXXk +rqudU!:Bgbo)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lKru:t9rVq\#qZ$Hl]Q/"4EcH#a +jT#2Yrr)c"Dfbnu"`T17rr)iUs*t~> +nc&mks&K+*!13`^jo5Vcs8UAmL\LiJm/ICks8F,@!W^XJr6bNKr;XHJhZ*Q/rs&H%e835+r:9jm +rr)keIJ3^?o)Apms6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N#Mru:t9rVq\#qZ$Hl]Q/"4EcH#a +jT#2Yrr)c"Dfbnu"`T17rr)iUs*t~> +nc&mks&K+*!13`^jo5Vcs8UAmL\LiJm/ICks8F,@!W^XJr6bNKqYtmB^&Ruars&B#W;r%[qXXXk +rqudU!:Bgbo)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lKru:t9rVq\#qZ$Hl]Q/"4EcH#a +jT#2Yrr)c"Dfbnu"`T17rr)iUs*t~> +nc&mms/U?sG0Bp`k5Pbdr9:"qIY[Xsrp9Xkrr;tZI"?\/s8C@F#5\@H!58F0g]%KTs/?![s8) +nc&mks&K+*!13`^k5Pbdr9:"qIY[Xsrp9Xkrr;s?!!3/Js8::E#5nM7DVkElg]%KVs3tl+s8;Hf +#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cfDd)oroA43s8)cDD3r!"kMN+Y +K]W43r;XZQU#"nokLP-)f`(g.s*t~> +nc&mks&K+*!13`^k5Pbdr9:"qIY[Xsrp9Xkrr;s?!!3/Js8::E#5\@H!58F0g]%KTs/?![s8) +nc&mms/U?sG0Bp`kPtS]#lB6l^R9WIs8MBb$3'u(OF2V,kl:V/rs&?"HN:bZqqM,TquUs8;Hf#Q=\m!&FTPrn.5Yrr)i.DTMkUk(eKRr;R%m +D7KTCrqV;1qu6iBB9N;nro=$/~> +nc&mks&K+*!13`^kPtS]#lB6l^R9WIs8MBb$3'u(+92HCdJs-lrs&E$]l)^,rS.>VrVtA`aT)2/ +rs/Q%s."N2s8MTh#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rn.5Yrr)i.DTMkUk(eKRr;R%m +D7KTCrqV;1qu6iBB9N;nro=$/~> +nc&mks&K+*!13`^kPtS]#lB6l^R9WIs8MBb$3'u(+92HCdJs-lrs&?"HN:bZqqM,TquUs8;Hf#Q=\m!&FTPrn.5Yrr)i.DTMkUk(eKRr;R%m +D7KTCrqV;1qu6iBB9N;nro=$/~> +nc&mms/U?sG0Bp`pAb-krr)lrqYpp%s7WYWs-J93s8MBb$3'u(OF2V,kl:V/rs&?"HN:bZqqM,T +quUs8;Hf#Q=\m!&FTPrn.5jrquebH1Cq7 +SS?:IqYgBjrT\cur;Q`kJ!p?5qu6Ntqo?t]rr1sXJ,~> +nc&mks&K+*!13`^pAb0l"9&,or;Q]mrsJc*p93QWQ[no3rp9Xkrr;s?!!3/Js8::E#5nM7DVkEl +g]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cf`)rjr;W42 +nc/W[C!6PQrVcZml?o#trr;bCRK*-\rr!#ta3FY`ro=$/~> +nc&mks&K+*!13`^pAb0l"9&,or;Q]mrsJc*p93QWQ[no3rp9Xkrr;s?!!3/Js8::E#5\@H!58F0 +g]%KTs/?![s8) +nc&mms/U?sG0Bp`q>^Kos8;rsrVuos"9&6!rr)lsrrUs8;Hf#Q=\m!&FTPrn.5m +rVl>;UAY&VIAZr?rr<#trr:dJs8DulKRrRks8N#qh>`!~> +nc&mks&K+*!13`^qZ$Qo!rVrorVm'"rql]prr)lsrrVrVtA`aT)2/rs/Q%s."N2s8MTh#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rn.5m +rVl>;UAY&VIAZr?rr<#trr:dJs8DulKRrRks8N#qh>`!~> +nc&mks&K+*!13`^qZ$Qo!rVrorVm'"rql]prr)lsrrUs8;Hf#Q=\m!&FTPrn.5m +rVl>;UAY&VIAZr?rr<#trr:dJs8DulKRrRks8N#qh>`!~> +nc&mms/U?sG0Bp`qu6cts8W)trr_uKgZ&54s8E'!rqufrr!!(dJGK6Em/ICks8J+-JUH\]rR(WL +qYtmB^&Ruars&B#W;r%[qXXXkrqudU!:Bgbo)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lL +rs\o)rm5Mls8Unk^An*.rrE&trs/Q$rMje&d,"[#!W2foro=$/~> +nc&mks&K+*!13`^qu6cts8Murrr_Z"]#OaL"9/9!rqufrr!!(dJGK6Em/ICks8F,@!W^XJr6bNK +r;XHJhZ*Q/rs&H%e835+r:9jmrr)keIJ3^?o)Apms6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N#N +rs\o)rm5Mls8Unk^An*.rrE&trs/Q$rMje&d,"[#!W2foro=$/~> +nc&mks&K+*!13`^qu6cts8Murrr_Z"]#OaL"9/9!rqufrr!!(dJGK6Em/ICks8F,@!W^XJr6bNK +qYtmB^&Ruars&B#W;r%[qXXXkrqudU!:Bgbo)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lL +rs\o)rm5Mls8Unk^An*.rrE&trs/Q$rMje&d,"[#!W2foro=$/~> +nc&mms/U?sG0Bp`qZ$Tp%KGP-Q%s0mGa"B7s8W&qrs8W&rr8=9q>^H\rsA])rfDMYI-CV/dJjFI +s*FaZs81RN#5eG"!0I6Wo)Asor;S_VmJm.Urs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;P@K% +/g.)ET-rti,?1*r;QWo'E.q1s8DrbO`>GfPGHLss8N&uro=$/~> +nc&mks&K+*!13`^qYpd!rVt-&/.VXZ#:D$hs8W#srr2p'rr)irQ\"u4rp9Xkrr;s?!!3/Js8::E +#5nM7DVkElg]%KVs3tl+s8;Hf#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9c +f`)BXs/C"ss8V"q\c2O+r;RH/rr<#srpGngF*WtFcLq5:s8W)Ys*t~> +nc&mks&K+*!13`^qYpd!rVt-&/.VXZ#:D$hs8W#srr2p'rr)irQ\"u4rp9Xkrr;s?!!3/Js8::E +#5\@H!58F0g]%KTs/?![s8) +nc&mms/U?sG0Bp`r;Zfrs83G:H>Rtp^:p.gIVH%_s8N&trr<#t"ojp?q>^H\rsA])rfDMYI-CV/ +dJjFIs*FaZs81RN#5eG"!0I6Wo)Asor;S_VmJm.Urs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?E +r;PCL%0$5#OcT;9s57h+s8;iq'`S.3rr;utrVu`:Ob[srEJN0Fr;P^UJ,~> +nc&mks&K+*!13`^r;Zfr')MKB!<<*PI=4-^!!$I"s8Dusrr<#t"ojp?q>^H\rsA])rZD1B!7CiE +dJjFKs1N=,s8C^P#6"SOCrlYSo)AsorVrC9pAb-_rs&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4 +rr1UN%0$5#OcT;9s57h+s8;iq'`S.3rr;utrVu`:Ob[srEJN0Fr;P^UJ,~> +nc&mks&K+*!13`^r;Zfr')MKB!<<*PI=4-^!!$I"s8Dusrr<#t"ojp?q>^H\rsA])rZD1B!7CiE +dJjFIs*FaZs81RN#5eG"!0I6Wo)Asor;S_VmJm.Urs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?E +r;PCL%0$5#OcT;9s57h+s8;iq'`S.3rr;utrVu`:Ob[srEJN0Fr;P^UJ,~> +nc&mms/U?sG0Bp`qu6p!s4;1?ZKhGgrs/>`X`''Zs8Dors8E3%Q\"u4rp9Xkrr;tZI"?\/s8C@F +#5\@H!58F0h#@ZZqu*AlNW&_QoD]'pr;S_VmJm.Urs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?E +r;PCL%/g.cEN&p6s5%V'rquWms8E'!rr)j(rUe=IP'V/Rs8DrWs*t~> +nc&mks&K+*!13`^rVm3's8)bs!"3Pnrr2p&o[I7K)UAB\rVuos"ojp?q>^H\rsA])rZD1B!7CiE +dJjFKs1N=,s8CaQ#laf%dVQr&r;QZCro=$/~> +nc&mks&K+*!13`^rVm3's8)bs!"3Pnrr2p&o[I7K)UAB\rVuos"ojp?q>^H\rsA])rZD1B!7CiE +dJjFIs*FaZs81UO#la`"V>uVSqYp*d#QFZ$2ur@GrUTsmr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf +1B7:Og&DKYs5S*ts8)cPD7TZDqZ$Tp!WW/trsJ_sbe90cEj>ZCro=$/~> +nc&mms/U?sG0Bp`r;Qs!ro8K]jo5;[r;HX!\U0)&rr)irs8E3%Q\"u4rp9Xkrr;tZI"?\/s8C@F +#5\@H!58F0h>[l^s7lW#!1El\s8N#jrs/Q$s#:#Gs8DNg#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m +!&FTPrn7;[qu=3DcMm_?k'"?8qu-QprWr/rs8N&Yk5YDYrs&JALO8.^rT!p.~> +nc&mks&K+*!13`^r;Qrurl>Tabl7YBqYgF*EsNEArVc`qs8N#tQ\"u4rp9Xkrr;s?!!3/Js8::E +#5nM7DVkElh>[i]s82iLC +nc&mks&K+*!13`^r;Qrurl>Tabl7YBqYgF*EsNEArVc`qs8N#tQ\"u4rp9Xkrr;s?!!3/Js8::E +#5\@H!58F0h>[l^s7lW#!1El\s8N#jrs/Q$s#:#Gs8DNg#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m +!&FTPrn7;[qu=3DcMm_?k'"?8qu-QprWr/rs8N&Yk5YDYrs&JALO8.^rT!p.~> +nc&mms/U?sG0Bp`rr<#t#5nIgIcpb.rr*Z4rr2lns4hM,s8;ors8DorQ%/T/rTsOjrr;tZI"?\/ +s8C@F#5\@H!58F0hZ"#`s82i_Eroh7s82iqp&>9rr;S_VmJm.Urs&E$d/[VTqXORiqYt1.bl@V3 +rs/N&nGk?Er;PFM%K?;'Ujhh4rVcb]NrAqUrYGP3s3-8Lrr96>iVrcSr;HQn_JIp*r8[g-~> +nc&mks&K+*!13`^rr<#t+8c!o'$gOQrVlfrrr2iks0r&Ws8)cps8DorQ%/T/rTsOjrr;s?!!3/J +s8::E#5nM7DVkElhZ!r^s8Duk[WASCs8DQh#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsn +rr;bDRK*9cgA_W]r;<@>nG`Cbs-8WCrVld3s8;o@LXuJ)Z#&Cur;QWmr;XWMg&M!1s*t~> +nc&mks&K+*!13`^rr<#t+8c!o'$gOQrVlfrrr2iks0r&Ws8)cps8DorQ%/T/rTsOjrr;s?!!3/J +s8::E#5\@H!58F0hZ"#`s82i_Eroh7s82iqp&>9rr;S_VmJm.Urs&E$d/[VTqXORiqYt1.bl@V3 +rs/N&nGk?Er;PFM%K?;'Ujhh4rVcb]NrAqUrYGP3s3-8Lrr96>iVrcSr;HQn_JIp*r8[g-~> +nc&mms/U?sG0Bp`rVm0%s4VDDs82iqrVmQ1s8MooR=Fo/rr<#trr8F@q>^H\rsA])rfDMYI-CV/ +dJjFIs*FaZs81^R%fZM*s/6_6!WX[Ts8;orpAYBsr;S_VmJm.Urs&E$d/[VTqXORiqYt1.bl@V3 +rs/N&nGk?Er;PIN&,uP-o6Qi)r;HTnR +nc&mks&K+*!13`^rVm0#s0Vj1s7lWnrVmQ1s8Mim3!ejLrVuosrr8F@q>^H\rsA])rZD1B!7CiE +dJjFKs1N=,s8CjT%fZM+s3udKJp*:0s8DuspAYBsrVrC9pAb-_rs&H%k]3p-r:0dkr;X*Cjo>;M +rs/Q'pjee4rr1[P&,uP-o6Qi)r;HTnR +nc&mks&K+*!13`^rVm0#s0Vj1s7lWnrVmQ1s8Mim3!ejLrVuosrr8F@q>^H\rsA])rZD1B!7CiE +dJjFIs*FaZs81^R%fZM*s/6_6!WX[Ts8;orpAYBsr;S_VmJm.Urs&E$d/[VTqXORiqYt1.bl@V3 +rs/N&nGk?Er;PIN&,uP-o6Qi)r;HTnR +nc&mms/U?sG0Bp`rr3<(r;E^JnbrFcrqud,rr;rsgMjk)qYgBjqtp!Tl2(e`qtc>!IsU5RqU,0E +p\T49])29[q[WQ!qmZV+!rrB&!2TSfr:^!mqYC"I!:'IXo(rXeqp#1KqtKXX#5A"+!6P-6o(r[g +qsFG=qt^*Cq[WQ"r5WZ_qt^-cr6K52m/6kienpHGqu$5;IHpb1"oOs=lMLG +nc&mks&K+*!13`^rr3<(qYXJ2jS\rTrqud,rr;lq[K1aPp\XjcrVcB[l2:qdrVR`;! +nc&mks&K+*!13`^rr3<(qYXJ2jS\rTrqud%rr;lq[K1aPp\amhoC;)B$2XPq*rlc +!&=BHqV1lWr;$92D79?;qtg6:D1V'Ors@7nNrAkQpjISUr;QruSpTc"qW%I'~> +nc&mms/U?sG0Bp`rr<#t"o[VEJr#$Nc2Rir!6 +nc&mks&K+*!13`^rr36%rq6FEs8;llrrrE#rVn,Mh>[U#!!3/Oc2Rj\D<'@M$(6$iIt3$#H]S-q +rrSa=r9jRdm;]H!rrTTIlL+ZRrd^HfrrT]NlMLSg^NGs]l0% +nc&mks&K+*!13`^rr36%rq6FEs8;llrrrE#rVn,Mh>[U$!!3/Uc2Rir!6 +nc&mms/U?sG0Bp`rr36%s6FsFrr)ikrseu+rf_oiiS`_8`5KR2l,3nG`5?J"@pcO[_U6:+^r0OZ +Oi5)n`!!opNrT7X!!9=A_Y1nQ_nj8A!4Kh_o#(aK`1R*&`5(o]#/J/Q!1_!Do#(dM`45jp`50@G +`!!ur_J*ug_uI[T_ZRo1=^M):'OP"'aMGg5_TANW?=I>P@p=Jk_SbBOJ,~> +nc&mks&K+*!13`^rr36$s4IC&rVQThrsJc(r[%ia`5BO6io]2+i8NT6!!*)1ini)A#2eCBEld4t +hr+ariQ$:rJ,Xs%It3%"iSaFgs54(>Q$qBFi:>h2i8N%*UuC5$ih3i8NIAPMtHX +gYiCqiS]HNiS`Yni<8*"T6GY]Ig^XJXQJF!iS`k5H@,X@"b:lhe)0*CiIC~> +nc&mks&K+*!13`^rr36$s4IC&rVQThrs/Q%r[%ia`5DPls24*>$,a^!(]XR:TZ"[o`!4#q?3$,+ +_;E06_8MB7!r;luY/J3N`!=2r`%(hr`5;)`#/S6N!(t2Fn\bXI`(pB'`52#_#K"Ei!%,Y#_qW*4 +_o0E+E;mcT`;d^W`e%?"raHRK=cUS>`5KO7U0M#6@:E_NJ@383il$?~> +nc&mms/U?sG0Bp`rr33"rkiO-s8;Wk#lXc%P^.7bG=-o]rVup!q>^KrJH37]J,~> +nc&mks&K+*!13`^rr32ureU]hs8)Ki"9&5t.f02I7s8_4DZalqD@QRF!aBeacYil0JofXaqg\cu +J:MY0DZY<:E:.WGEe/N'DZY38EpdiIE.E>dDZP$(qJQIRG'A00G5laeEc1ho")`4)GPu^bG5u[A +Dh%~> +nc&mks&K+*!13`^rr32ureU]hs8)Ki"9&5t.Y.Tq!!!&r!!!%N!4i/\~> +nc&mms/U?sG0Bp`rr36%s7(BDrr)ikrsA]'s-A&A\@Sebj`1ZIEcF?'3B(SkERAe2DfRc:<,us8 +EWU6$D>F58!WZkQEV=DXEH#q9!,?Oono=qREa8YqEc:Jg#&eN7!*aJ_no=tTEbbXjEc?$NErU+T +EWC+TDuanTEWC+TDuan9Ee"~> +nc&mks&K+*!13`^rr36$s5X0"rVQThrs\o*s!n(gEcH,CY.D++\-]XS[hf#F!11=+dC9Ci\=7]B +\@:>)"M(siIt.EI!e5[*o=+q4\;YmDn@/\3\?:+B\@;"<#.M+.H*+Tcn@/P-J;_sfs0qg6pp^.1 +pp].jJ,~> +nc&mks&K+*!13`^rr36$s5X0"rVQThrs/Q%s!n(gEcL,["*&@$%fQG0?#jo3EX$H&2ZQftE8P[; +EH5pm!!E?'B5qqbEX-T'EZ"jlEcLYj#&nTg!%W).nT"hPE\7>rEcCSi#B=d"!#BToES,=3E;FST +EVXPREVjbVEVXPREStkf~> +nc&mms/U?sG0Bp`rr39'rV`+Gs8DrrqYp`urVl8:N8=L:RtZcSqT]$AKE06Mrs2X*"T\W+"TXeV +rrG4^mJd7H!,1d"!cJ(omJd1e23Ioh~> +nc&mks&K+*!13`^rr39'r;/,ks8;lqqYp`ur;GLb(u>2p+TMQDg!0Nu_//5ers5WLJq/B&K659* +rrJ^=mJd7WE3ns3!k3+8mJd3;S!!`$~> +nc&mks&K+*!13`^rr39'r;/,ks8;lqqYp`ur;GLb(u>2p+ohZEiQ_B(KE06Mrs2X*"T\W+"TXeV +rrG4^mJd7H!,1d"!cJ(omJd1e23Ioh~> +nc&mms/U?sG0Bp`rVm0$s203RrqufqqYpj!s0c^ar;$9gjSB2YqY?+rIX0uMpsJpBp%in5\bc$V +q?-Nhn-o3p"$lYVq=XRhq=j_D!9j:So(iRbqTT"IqXsCT#5.h(!6G$2o(iUdqWn2:qY0fMqLA~> +nc&mks&K+*!13`^rVm0"s+h!Arql`pqYpcrs(_UsqXsjajnoG^r;.Q9!@jBh#.$* +r!`K#pP!a;I&r;-!^#Q+GlJ=-93qiq#/~> +nc&mks&K+*!13`^rVm0"s+h!Arql`pqYpcrs(_UsqXrkE$2OGn*rl;Np>5WJ +q"jIgqu?gaq"X[Xq?QijqDJ?;qY9XX#5@u=!+5TqnbNI_qIKZJqY0RW#Pe/^!&=?Eq3:`+~> +nc&mms/U?sG0Bp`rr<#t#6"4FV>pMlrr)otrr*3$rU,,mp\t0lrr2lo!ri6!mJdLls8J+-JUH\] +rR(WLqYtmB^&Ruerso&.rVY37,o9$Tp&=pirq??srqudU!:Bgbo)Apls3UgTs8)9c#5\@4!6kK@ +o)Asns7$(Es8;lLrrN-!rVcitrr)itrr;rr!WW/ss82crs8Moq!WN,rrWW?$s8W)urr)rurq?AB~> +nc&mks&K+*!13`^rr39'rVc$k;uZ[krr)otrr*3"r8%etnbrFdrr2lo!ri6!mJdLls8F,@!W^XJ +r6bNKr;XHJhZ*Q3rs\o,rr)-(Nf0R1qYpHcrs/Q%s."N2s8MTh#6"ScEj5TAnc&gks0H_,s8DNg +#QFbuJ=6H:rn7;Prr;rr!WW/trrN-!rVcitrqufnrW3&uqu6]rs82d!s8N&urr;us!WW/ms*t~> +nc&mks&K+*!13`^rr39'rVc$k;uZ[krr)otrr*3"r8%etnbrFdrr2lo!ri6!mJdLls8F,@!W^XJ +r6bNKqYtmB^&Ruerso&.rVY37,o9$Tp&=pirq??srqudU!:Bgbo)Apls3UgTs8)9c#5\@4!6kK@ +o)Asns7$(Es8;lLrrN-!rVcitrr)itrr;rr!WW/ss82crs8Moq!WN,rrWW?$s8W)urr)rurq?AB~> +nc&mms/U?sG0Bp`r;Qots28ZPrr3E*rr2lorr<#-CWQPRrr2usr;Zfr!WW/ersA])rfDMYI-CV/ +dJjFIs*FaZs81[Q#6+Z%s8VZPrr3'!s8M]k#QFZ$2ur@GrUTsmr;Y.E@K62ors&?"B)p0Ur:9jm +rVuBf1B7:Oe,K^Qs8N&urr<#tqYpZss8Doprr`9!s8Muss8N&srVuor!WW/es*t~> +nc&mks&K+*!13`^r;Qors+p_Xrr3E(rVcWirVun:!0R9rrVrC9pAb-_rs&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q' +pjee4rr1CH#lal's8W)us8Mlp"9/?!rVc`urr)lrrVuoss8Dors8;uurpKf:~> +nc&mks&K+*!13`^r;Qors+p_Xrr3E(rVcWirVun:!0R +nc&mms/U?sG0Bp`rVuos#5nM0Co-.fqu7;dTlQ:irVlfrrVu<(`l-"!s8MEc$3'u(OF2V,kl:V/ +rs&?"HN:bZqq_;PrWrK"s8Vuorr;uirs/Q$s#:#Gs8DNg#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m +!&FTPrn7;Vrr;igp&4pirVuos'*%\!r;Zcqs8Muss7c9_p&G'jrr3`4s8W&ts7Z6_p](9ls8W)u +qXsddrq?AB~> +nc&mks&K+*!13`^rVuos#5eF:!)gl1qu7;F8cU1+r;HWprVu<(`l-"!s8MEc$3'u(+92HCdJs-l +rs&E$]l)^,rS@J\rr;urs8W&rrr;uirs/Q%s."N2s8MTh#6"ScEj5TAnc&gks0H_,s8DNg#QFbu +J=6H:rn7;Vrr;igp&4pirVuos'*%\!r;Zcqs8Muss7c9_p&G'jrr3`4s8W&ts7Z6_p](9ls8W)u +qXsddrq?AB~> +nc&mks&K+*!13`^rVuos#5eF:!)gl1qu7;F8cU1+r;HWprVu<(`l-"!s8MEc$3'u(+92HCdJs-l +rs&?"HN:bZqq_;PrWrK"s8Vuorr;uirs/Q$s#:#Gs8DNg#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m +!&FTPrn7;Vrr;igp&4pirVuos'*%\!r;Zcqs8Muss7c9_p&G'jrr3`4s8W&ts7Z6_p](9ls8W)u +qXsddrq?AB~> +nc&mms/U?sG0Bp`qu?]p*qPA.G`9f6n'&/;FF(1\rr)lsrVt2mD/='-Yl=V#mf*Ums8J+-JUH\] +rR(WLqYtmB^&RuarrrE%rVccqnc&jnr;S_VmJm.Urs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?E +r;PCL3W/odI=n'brVlisrr)l&J:?,MrVulrs4XQ)It3$@irArUrr;urs3.9eJ:N'IkPtM[r;XNR +huEZKs*t~> +nc&mks&K+*!13`^qu7f:rTGC)!$RWbi0nX_!!$]krqufrrVt2mD/='-Yl=V#mf*Ums8F,@!W^XJ +r6bNKr;XHJhZ*Q/rrrE%rr2rsnc&jnrVrC9pAb-_rs&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4 +rr1UN3W/odI=n'brVlisrr)l&J:?,MrVulrs4XQ)It3$@irArUrr;urs3.9eJ:N'IkPtM[r;XNR +huEZKs*t~> +nc&mks&K+*!13`^qu7f:rTGC)!$RWbi0nX_!!$]krqufrrVt2mD/='-Yl=V#mf*Ums8F,@!W^XJ +r6bNKqYtmB^&RuarrrE%rVccqnc&jnr;S_VmJm.Urs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?E +r;PCL3W/odI=n'brVlisrr)l&J:?,MrVulrs4XQ)It3$@irArUrr;urs3.9eJ:N'IkPtM[r;XNR +huEZKs*t~> +nc&mms/U?sG0Bp`r;Rr>s8Due[$Q;]G^"1GEL,khs8N&ur;PMrI)XXaO)MQ.r9jRkrr;tZI"?\/ +s8C@F#5\@H!58F0`W$2Br;S_VmJm.Urs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;PCL3W&i_ +F*rN2s8N#trVlMJI!*s=r;QZlcZjN!R$`bJIcCD*s8Mus_ejagR$a:eGKKm`r;XBFh>dEHs*t~> +nc&mks&K+*!13`^r;R$$s8;oTEAmpq!#%3=s8W&ts8;lPGC7B[dZ8=Vs8; +nc&mks&K+*!13`^r;R$$s8;oTEAmpq!#%3=s8W&ts8;lPGC7B[dZ8=Vs8; +nc&mms/U?sG0Bp`qu6`ss8N#t''m`8U<;HPs8W&ss8N#qs0QRYrr3,^FeSg5mf*Ums8J+-JUH\] +rR(WLqYtmB^&RuKrs/Q$s#:#Gs8DNg#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;hr;X-K +X*2tkr;Zcprn2LFGLc`lr;Y&YOlHB?%._u)J)^M,rVl)+T^2RV$eT`Rm/Hn^]PcU+r:^/@~> +nc&mks&K+*!13`^qu6`ss8Drs'%i^J9:!N3s8Vups8N#qs0QRYrr3,^FeSg5mf*Ums8F,@!W^XJ +r6bNKr;XHJhZ*Pnrs/Q%s."N2s8MTh#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rn7;hr;X-K +X*2tkr;Zcprn2LFGLc`lr;Y&YOlHB?%._u)J)^M,rVl)+T^2RV$eT`Rm/Hn^]PcU+r:^/@~> +nc&mks&K+*!13`^qu6`ss8Drs'%i^J9:!N3s8Vups8N#qs0QRYrr3,^FeSg5mf*Ums8F,@!W^XJ +r6bNKqYtmB^&RuKrs/Q$s#:#Gs8DNg#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;hr;X-K +X*2tkr;Zcprn2LFGLc`lr;Y&YOlHB?%._u)J)^M,rVl)+T^2RV$eT`Rm/Hn^]PcU+r:^/@~> +nc&mms/U?sG0Bp`qYp]ts8MurqZ$Tp&c_k1s8N&ulKJ'Br;?87U]15[rsA])rfDMYI-CV/dJjFI +s*FaZs80e8#QFZ$2ur@GrUTsmr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:Og&F)1s0QpqI]3;F +rr;orXF$:Uec5RHm +nc&mks&K+*!13`^qYp]ts8DloqYq6.rVulss8N&ulKJ'Br;?87U]15[rsA])rZD1B!7CiEdJjFK +s1N=,s8Bq:#QF]%S:1,2rpp'nrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cg&F)1s0QpqI]3;F +rr;orXF$:Uec5RHm +nc&mks&K+*!13`^qYp]ts8DloqYq6.rVulss8N&ulKJ'Br;?87U]15[rsA])rZD1B!7CiEdJjFI +s*FaZs80e8#QFZ$2ur@GrUTsmr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:Og&F)1s0QpqI]3;F +rr;orXF$:Uec5RHm +nc&mms/U?sG0Bp`q>^Em!;ufms8;ipq#:Qqs4VIjs8;^ +s8)`#ER=a_s8N!:qu+$@\c2I)a)''$qu-KmrVl?arql`.DVkElpA]X~> +nc&mks&K+*!13`^q>^Em#5\,hp\=R[rVlTl#5eGSEMrj7mf*Ums8F,@!W^XJr6bNKr;XHJhZ*Pn +rs/Q%s."N2s8MTh#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rn7;ir;X0Ckam>"s8DrqoS8I? +DV+pbrj$Ojs82iqrYtb5\88_TqYnNOcN!e?rVlcpnb`=_s1E7+s8DZkJ,~> +nc&mks&K+*!13`^q>^Em#5\,hp\=R[rVlTl#5eGSEMrj7mf*Ums8F,@!W^XJr6bNKqYtmB^&RuK +rs/Q$s#:#Gs8DNg#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;ir;X0Ckam>"s8DrqoS8I? +DV+pbrj$Ojs82iqrYtb5\88_TqYnNOcN!e?rVlcpnb`=_s1E7+s8DZkJ,~> +nc&mms/U?sG0Bp`qYpZss8Mums8W'1s8N&urr2rsrVl`pplL$qrr)9b$3'u(OF2V,kl:V/rs&?" +HN:bZqo/R?rqudU!:Bgbo)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lLru1h8[;P?TCXrF] +r;PGe[``F;s8MY;T)\`grr2p*rVtl%Nr/eTc>f3BrVlosrr2p%r;XEIhZ*QJs*t~> +nc&mks&K+*!13`^qYpZss8DijrtGD1s8N&urr2rsrVl`pplL$qrr)9b$3'u(+92HCdJs-lrs&E$ +]l)^,rPedArr)keIJ3^?o)Apms6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N#Nru1h8[;P?TCXrF] +r;PGe[``F;s8MY;T)\`grr2p*rVtl%Nr/eTc>f3BrVlosrr2p%r;XEIhZ*QJs*t~> +nc&mks&K+*!13`^qYpZss8DijrtGD1s8N&urr2rsrVl`pplL$qrr)9b$3'u(+92HCdJs-lrs&?" +HN:bZqo/R?rqudU!:Bgbo)Apls3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lLru1h8[;P?TCXrF] +r;PGe[``F;s8MY;T)\`grr2p*rVtl%Nr/eTc>f3BrVlosrr2p%r;XEIhZ*QJs*t~> +nc&mms/U?sG0Bp`qu7<.s8N&urSl/!VR,=Bs8W#ss8N#ts8E<&s65qhcN!kBmf*Ums8J+-JUH\] +rR(WLqYtmB^&RuKrs/Q$s#:#Gs8DNg#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;gr;X3D +kOEbps8DipY\`=AC=rRdoR!50r;HZqrYkb7OG<]5rq_^qN2=JLp](9krr;lq]PcU+rV$8A~> +nc&mks&K+*!13`^qu7<.s8DutrPkL+:M.Yds8Vrqrr2oss8E<&s65qhcN!kBmf*Ums8F,@!W^XJ +r6bNKr;XHJhZ*Pnrs/Q%s."N2s8MTh#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rn7;gr;X3D +kOEbps8DipY\`=AC=rRdoR!50r;HZqrYkb7OG<]5rq_^qN2=JLp](9krr;lq]PcU+rV$8A~> +nc&mks&K+*!13`^qu7<.s8DutrPkL+:M.Yds8Vrqrr2oss8E<&s65qhcN!kBmf*Ums8F,@!W^XJ +r6bNKqYtmB^&RuKrs/Q$s#:#Gs8DNg#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;gr;X3D +kOEbps8DipY\`=AC=rRdoR!50r;HZqrYkb7OG<]5rq_^qN2=JLp](9krr;lq]PcU+rV$8A~> +nc&mms/U?sG0Bp`r;RK1s8Due\!(iQG'7kDEgZ1mr;Q`qrr39%s3u78bl@V?mJdLls8J+-JUH\] +rR(WLqYtmB^&RuKrs/Q$s#:#Gs8DNg#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;gr;X3E +j8YEso`"dcRt1CUCY8[dn9U`+rVZ]prYU]OrVl`olCW< +nc&mks&K+*!13`^r;R!#s8;oUFYERk"uk06qu6Wprr39%s3u78bl@V?mJdLls8F,@!W^XJr6bNK +r;XHJhZ*Pnrs/Q%s."N2s8MTh#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rn7;gr;X3Ej8YEs +o`"dcRt1CUCY8[dn9U`+rVZ]prYU]OrVl`olCW< +nc&mks&K+*!13`^r;R!#s8;oUFYERk"uk06qu6Wprr39%s3u78bl@V?mJdLls8F,@!W^XJr6bNK +qYtmB^&RuKrs/Q$s#:#Gs8DNg#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;gr;X3Ej8YEs +o`"dcRt1CUCY8[dn9U`+rVZ]prYU]OrVl`olCW< +nc&mms/U?sG0Bp`qu?]p&G2!"GGE7Hm`Vo5EJ`3Frr2os$N0qRE00;`r;Q`qmf*Ums8J+-JUH\] +rR(WLqYtmB^&RuKrs/Q$s#:#Gs8DNg#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;gr;X3D +i;UW1f)G^9FJo,SD:nmggi]:irVZ]prYU]Or;Z`ns8Ui[T7V<(KZO)jqu= +nc&mks&K+*!13`^qu?]o&EtG?!)Ja4hNr(S!#_d9rVlfr$N0qRE00;`r;Q`qmf*Ums8F,@!W^XJ +r6bNKr;XHJhZ*Pnrs/Q%s."N2s8MTh#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rn7;gr;X3D +i;UW1f)G^9FJo,SD:nmggi]:irVZ]prYU]Or;Z`ns8Ui[T7V<(KZO)jqu= +nc&mks&K+*!13`^qu?]o&EtG?!)Ja4hNr(S!#_d9rVlfr$N0qRE00;`r;Q`qmf*Ums8F,@!W^XJ +r6bNKqYtmB^&RuKrs/Q$s#:#Gs8DNg#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;gr;X3D +i;UW1f)G^9FJo,SD:nmggi]:irVZ]prYU]Or;Z`ns8Ui[T7V<(KZO)jqu= +nc&mms/U?sG0Bp`r;R!#r;X6BUu;+L%GQ;I_#F<3s8DuIFd;acrsA])rfDMYI-CV/dJjFIs*FaZ +s80h9s8E6!q_nN>r;H3d#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;hr;X3EirA@hVuQb5 +DUna'CtSdep3`J1rVlcqs8E0"O,*]5rr3T0s8W)he$!t5aoD5;]PcU+rV$8A~> +nc&mks&K+*!13`^rVuos"oJ=;!)LN/rscI?!.b%Frr;rse9.&Okl1tgs8F,@!W^XJr6bNKr;XHJ +hZ*Pos8W'&r;E+5o_nd[rs&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr1UN)>sNCE8poaGGkK? +_J[p'_JIm)rq:`2rVc`os8W'$rJua4rr2p0rr<#to$addDTVqTs1E7+s8DZkJ,~> +nc&mks&K+*!13`^rVuos"oJ=;!)LN/rscI?!.b%Frr;rse9.&Okl1tgs8F,@!W^XJr6bNKqYtmB +^&RuLs8W'&qYN2Ol2:MNrs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;PCL)>sNCE8poaGGkK? +_J[p'_JIm)rq:`2rVc`os8W'$rJua4rr2p0rr<#to$addDTVqTs1E7+s8DZkJ,~> +nc&mms/U?sG0Bp`r;RrUs8;Hf#Q=\m!&FTPrn7<$ +r;X3Ej8]"EJb8u.K_,5\D:nmgnp$o/r;Zcrs8N#rs,r'4s6Qc5rqu]mrsI5+PQ1O[]PcU+rV$8A~> +nc&mks&K+*!13`^r;Rr:s,-kWrr;onrVcWir;Xo4!6>*9r;PZ#LZ%O_lfmp=rpKdmrr;s?!!3/J +s8::E#5nM7DVkEla8ZJFs8DutSUCD9r:9jlrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cg&EQ" +s0cn,s8/48o`(51oDc[Ef`2!BGbY69s8N&urr2lrP(``4m&JJ4r;?Nn$IaQis82i/DVkElpA]X~> +nc&mks&K+*!13`^r;Rr:s,-kWrr;onrVcWir;Xo4!6>*9r;PZ#LZ%O_lfmp=rpKdmrr;s?!!3/J +s8::E#5\@H!58F0a8ZMGs8;os3ro0XqYp*d#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7<$ +r;X3Ej8]"EJb8u.K_,5\D:nmgnp$o/r;Zcrs8N#rs,r'4s6Qc5rqu]mrsI5+PQ1O[]PcU+rV$8A~> +nc&mms/U?sG0Bp`rr<#t#lXFKV>gGkrr2oss8E]0s71H1rqu`pQ>V%mF*)P?S,`ESrsA])rfDMY +I-CV/dJjFIs*FaZs80n;%0$;(s4_E'!)CQ6rVlHh#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTP +rn7<3r;X3EjT#7tD;+T)WW3"9D:nmcqjr2prqufqrr;orfQOCrr;D/"s8Doqrqu`pL6;N6s1E7+ +s8DZkJ,~> +nc&mks&K+*!13`^rr39'rVc$n<;lalrr)otrr*T-s5aSXrqlZoQ>V%mF*)P?S,`ESrsA])rZD1B +!7CiEdJjFKs1N=,s8C%=%0$;*s6d4II\l*)rr2Qi#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H: +rn7<3r;X3EjT#7tD;+T)WW3"9D:nmcqjr2prqufqrr;orfQOCrr;D/"s8Doqrqu`pL6;N6s1E7+ +s8DZkJ,~> +nc&mks&K+*!13`^rr39'rVc$n<;lalrr)otrr*T-s5aSXrqlZoQ>V%mF*)P?S,`ESrsA])rZD1B +!7CiEdJjFIs*FaZs80n;%0$;(s4_E'!)CQ6rVlHh#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTP +rn7<3r;X3EjT#7tD;+T)WW3"9D:nmcqjr2prqufqrr;orfQOCrr;D/"s8Doqrqu`pL6;N6s1E7+ +s8DZkJ,~> +nc&mms/U?sG0Bp`rVm0$s2Js=s8;orr;R6*s82i'E97,us0\l.XT#=(W5S`7mf*Ums8J+-JUH\] +rR(WLqYtmB^&RuMrr`3!bRsaQ!h0/do`#-ns3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lLru(b7 +[W(:,rp=d5c>(r0s2&X*s8)c;DjgS'rVRW7pl0CIs8)c0FPd≺?Hjre6R9r;XEIhZ*QJs*t~> +nc&mks&K+*!13`^rVm0"s,I*(s8)cpr;R6*s7lV,!6bE>s0\l.XT#=(W5S`7mf*Ums8F,@!W^XJ +r6bNKr;XHJhZ*PprsSf*k(Il+J9Z:^s8DTi#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rn7;h +r;X3Ej8],GF0j/,f)G]dD:nmbs2f2IrVlcn)uo\mFP$Qhs1WU3s82`lqu-MJPQ1R\]PcU+rV$8A~> +nc&mks&K+*!13`^rVm0"s,I*(s8)cpr;R6*s7lV,!6bE>s0\l.XT#=(W5S`7mf*Ums8F,@!W^XJ +r6bNKqYtmB^&RuMrr`3!bRsaQ!h0/do`#-ns3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lLru(b7 +[W(:,rp=d5c>(r0s2&X*s8)c;DjgS'rVRW7pl0CIs8)c0FPd≺?Hjre6R9r;XEIhZ*QJs*t~> +nc&mms/U?sG0Bp`rr39'rVDqBqYgBlqYpj#rVl86T_nWaq#B^W$2OGnNHotujSJZ!q?HWhGQ>;N +p;m(>q"`AO!!E9%!s&DCqY9a[#5@u=!+5TqnbNI_qIKZJqY0RW#Pe/^!&=?Eq:YT^p\M15i;33B +Q%"I?oD/6tCXi4Uq"pXsVY'ie$h'QuXo.qfqT*6,kktGf[:m;Np%l17gA:U +nc&mks&K+*!13`^rr39'r:Vrkp&+dfqYpj#r;GOc6ML6Nq#:BmrU0Riqu$=5!!*)Gr;"b<#5S2/ +DVY0daSZMEr98l]Jq/?&IsL,Qqt9jkqY]JrYPe4dr!)upZ>nq&qXXOhqu$/ +nc&mks&K+*!13`^rr39'r:Vrkp&+dfqYpj#r;GOc6ML6Nq#B^W$2OGn*rl;N +p;m(>q"`AO!!E9%!s&DCqY9a[#5@u=!+5TqnbNI_qIKZJqY0RW#Pe/^!&=?Eq:YT^p\M15i;33B +Q%"I?oD/6tCXi4Uq"pXsVY'ie$h'QuXo.qfqT*6,kktGf[:m;Np%l17gA:U +nc&mms/U?sG0Bp`rr36&s87; +nc&mks&K+*!13`^rr36%s7cRZs8;lkrri?"s!Ij'rraJF!W^ltrrU#QjM_')`H-Z]J:N-#G-UT; +!q1*7mJd6rDsZlk!J$WgrrTcLli-ndb]e69rr3&@CYo$i$hp'3N4HI/[>/n"rVZ[&bCkAL\[]2L +Ga@n!rrTuPjn/S'~> +nc&mks&K+*!13`^rr36%s7cRZs8;lkrri?"s!Ij'rraMG!W_0'rrRiRbJaD^M?!hY!!36&A+BR# +huIHXrrR' +nc&mms/U?sG0Bp`rr36$rmc&;rr)ikrsAZ'rf_f4XKS1$i`cUC/1rJP>?]EY#$G.]!(0soaBJaM +>7pu7!!E<&*a;e?>6\888cU&>=n,]#=^*-O8R#Bh>6\881d$s>$F9@;-R4.;_9Ll>?P0" +-V[fK>?Y?-.kLZF"XP`O;dET*>6AA".OP-?$RRQ0?<^T;6RY`7>4u0N~> +nc&mks&K+*!13`^rr36"ri6*urql]irrrB#r?qhQr`]J4T2nZ<"sXce"+XfV#o!ipj-eu]gkXcn(+XfSY%IsmihX0%b7 +T<52sXK\=FIf=KoGCP( +nc&mks&K+*!13`^rr36"ri6*urql]irrrB#r?qhQhHKsfrW!!l>?]EY#$G.]!(0soaBJaM>7pu7 +!!E<&*a;e?>6\888cU&>=n,]#=^*-O8R#Bh>6\881d$s>$F9@;-R4.;_9Ll>?P0"-V[fK +>?Y?-.kLZF"XP`O;dET*>6AA".OP-?$RRQ0?<^T;6RY`7>4u0N~> +nc&mms/U?sG0Bp`rr33#s3P]7rquNj#laf%Q$ILlHV&bgk5YJ_JH3dlJ,~> +nc&mks&K+*!13`^rr33!s.]RrrqcBh"9/8u/,K;J:3ppDEs$H(EXr'K!ag4md;oM6F*`C]F*,KE +"E\^4JUdZLs*k-$H?43$Es?`-G(G!]FRaDVFE;e[G&qcpErpH6IF`HWFE;\TF`VYGFa\[]F*)JJ +IWfdSF*)JHI=;'Cs*XrkF*.A%!c`L6r-f!#FE;MFF*N+VF*.+sJ,~> +nc&mks&K+*!13`^rr33!s.]RrrqcBh"9/8u.tI][!!!%N!6G4k~> +nc&mms/U?sG0Bp`rr36&s87JCs8DrlrsA]'rf_iolKR]fime6XBP_A!e^W!s#1:t6!1q`haOLF@ +eq3r+r;Zs%!3"Gsp!j8qeZSsMe^ +nc&mks&K+*!13`^rr36%rqQXas8;llrs\o*rVn2FcdpUrf^7qdl3Z_?koBa)!5Rp`dHUr"lEbHT +lKH=S%Hm#mFG#*nJ:E)reEZ8jl3?J;f6!tVkjdpBkj#0heEZ8gl3HS=jFEK[l06gb!U8hGlMp&J +l2KrLl0.C0l2^)EkQ'lDl2^)Fkks]Hl0.a(J,~> +nc&mks&K+*!13`^rr36%rqQXas8;llrs8W&rVn2FcdpV(eHQol!\ieHXORaoEm@e(3%MeC4?Gs3gttrm_&!e,%Vj +e+qMoeG@YleH+1Ko@8?~> +nc&mms/U?sG0Bp`rr39'r;ERQrr)fpq>UTrs4hUch>[VDJVJaGc2Riq!5uhU#l-^c!WrN/!'B]M +!ndQbmJd6'!7^H:!rDsSOoKq~> +nc&mks&K+*!13`^rr39'qYX52rVQQmq>UTps0r(nh>[U#!!3/Nc2Rj[D;iG5#lC37JV&H*Fe/%% +!pjp4mJd6qE9Zfj!r[Y +nc&mks&K+*!13`^rr39'qYX52rVQQmq>UTps0r(nh>[U$!!3/Rc2Riq!5uhU#l-^c!WrN/!'B]M +!ndQbmJd6'!7^H:!rDsSOoKq~> +nc&mms/U?sG0Bp`rVm0%s4DDJs8;orqu7!%qu3(1j8JlRrT*k_qu$>OH@L8&r;+h=#5A%@!5&1( +a8?)9s2l_jrW!$Dh#7*Ar!)upcN%ANp[S.cp\\V'b5D)+r!3)rmJo!>q>6ESJ,~> +nc&mks&K+*!13`^rVm0#s0;X7s7u]orVm3's8Mim4:'"*q>U!7:]@dJX:GrOd%( +rVO\7%0$/(jc4h6G]Jc1rVZ +nc&mks&K+*!13`^rVm0#s0;X7s7u]orVm3's8Mim4:'"*q;V;Yqu$=5!!*)Gr;"b<#5A%@!5&1( +a8?)9s2l_jrW!$Dh#7*Ar!)upcN%ANp[S.cp\\V'b5D)+r!3)rmJo!>q>6ESJ,~> +nc&mms/U?sG0Bp`rr<#t(]=9!Id$h/rVlfrrr2lns4qS-s82iqs8;irrVlf`rsA])rfDMYI-CV/ +dJjFIs*FaZs80n;%K?D,s8U)mQ)imDr;Zchrs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\ +J,~> +nc&mks&K+*!13`^rr<#t#Q+HT'%$[Squ$F#r;$B)!.4bBs8N&rrW)orrpB^lrr;s?!!3/Js8::E +#5nM7DVkElaSu_Ks8N&uikNX`nGiIerq69qrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^rr<#t#Q+HT'%$[Squ$F#r;$B)!.4bBs8N&rrW)orrpB^lrr;s?!!3/Js8::E +#5\@H!58F0aSu_Ks8N&u`eB\YiW&iUrq69qr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`r;R0'ro/B\k5YJ\r;?Qnrs65^L%>3@rr;umrrE&drsA])rfDMYI-CV/dJjFI +s*FaZs80k:"9/?!rquctrVulhrs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mks&K+*!13`^r;R-%rl,E`ci=%EqYL0j#^6=^k55,Vs8Mfn!<2Ed$3'u(+92HCdJs-lrs&E$ +]l)^,rQ"p?rr;usr;Qits8MZj#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^r;R-%rl,E`ci=%EqYL0j#^6=^k55,Vs8Mfn!<2Ed$3'u(+92HCdJs-lrs&?" +HN:bZqoA^=rr;rrr;Qiss8MZj#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`rVm3's8;oJDh>@Hrr2p3q

+nc&mks&K+*!13`^rVm0&s8)bq!" +nc&mks&K+*!13`^rVm0&s8)bq!" +nc&mms/U?sG0Bp`r;Zfrs83nEH#7Ph^qlLlIW;Rks8Dusrr)ksDLmRkG1$ +nc&mks&K+*!13`^r;Zfrs7u_0rW!fkJUo`g!!$I-s8Dusrr)ksDLmRkG1$ +nc&mks&K+*!13`^r;Zfrs7u_0rW!fkJUo`g!!$I-s8Dusrr)ksDLmRkG1$ +nc&mms/U?sG0Bp`qZ$Tp*WP0BW.Ji$KT_DNs8;iqrr;org2)r?r8W'js8DrbrsA])rfDMYI-CV/ +dJjFIs*FaZs8/u!#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^qYqZ:rVss/:^d=(#ULk0s82`orr;org2)r?r8W'js8DrbrsA])rZD1B!7CiE +dJjFKs1N=,s8B,##6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^qYqZ:rVss/:^d=(#ULk0s82`orr;org2)r?r8W'js8DrbrsA])rZD1B!7CiE +dJjFIs*FaZs8/u!#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`qu6cts8N#srr_oGf^o+Bs8ET0rr;urrk" +nc&mks&K+*!13`^qu6cts8Murrr_Sr[cdYi')hh0rr;urrk";Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^qu6cts8Murrr_Sr[cdYi')hh0rr;urrk" +nc&mms/U?sG0Bp`qZ$Qo!r`&rrVuos!<)ors8N)ur;R$$s3PP_s8DrbrsA])rfDMYI-CV/dJjFI +s*FaZs8/u!#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^qZ$Qo!rVonrVuos!;uiqs8N)ur;R$$s3PP_s8DrbrsA])rZD1B!7CiEdJjFK +s1N=,s8B,##6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^qZ$Qo!rVonrVuos!;uiqs8N)ur;R$$s3PP_s8DrbrsA])rZD1B!7CiEdJjFI +s*FaZs8/u!#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`q>UWts8Muprr2rtquQcqr;R0(s8MrqmZr@$s8N#brsA])rfDMYI-CV/dJjFI +s*FaZs8/u!#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^q>^Ko"9&/orVlisq?$Torr)j)rr;uqrpH)%W;lkrmJdLls8F,@!W^XJr6bNK +r;XHJhZ*PWrs&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^q>^Ko"9&/orVlisq?$Torr)j)rr;uqrpH)%W;lkrmJdLls8F,@!W^XJr6bNK +qYtmB^&Ru4rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`qu?]q!WW,ss8VThp&=snrVlirr;R*%rn`6KS_j/@rpKdmrr;tZI"?\/s8C@F +#5\@H!58F0Y5\_(s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^qu?]q!WW)rs8V3]m/I"er;Q`qr;R*%rn`6KS_j/@rpKdmrr;s?!!3/Js8::E +#5nM7DVkElY5\_)s6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^qu?]q!WW)rs8V3]m/I"er;Q`qr;R*%rn`6KS_j/@rpKdmrr;s?!!3/Js8::E +#5\@H!58F0Y5\_(s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`q>V!(s7b +nc&mks&K+*!13`^q>V!(s6m[149,?k?XLkRr;HZprX8c)r;HZnf9gL:rr)9b$3'u(+92HCdJs-l +rs&E$]l)^,rN?/)rVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^q>V!(s6m[149,?k?XLkRr;HZprX8c)r;HZnf9gL:rr)9b$3'u(+92HCdJs-l +rs&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`r;Zfr&H)OOMK<]fU8!H_EH9)!s8Mio#6+YbFgV2Hmf*Ums8J+-JUH\]rR(WL +qYtmB^&Ru4rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mks&K+*!13`^r;Zfr$2X[i+TMKF6UVLb!!A5\s8Dcn#6+YbFgV2Hmf*Ums8F,@!W^XJr6bNK +r;XHJhZ*PWrs&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^r;Zfr$2X[i+TMKF6UVLb!!A5\s8Dcn#6+YbFgV2Hmf*Ums8F,@!W^XJr6bNK +qYtmB^&Ru4rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`qu7<,s5S9FRagm-s75:%P]NPkrr)iq$JEVnrVHEdH(Y*7mf*Ums8J+-JUH\] +rR(WLqYtmB^&Ru4rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mks&K+*!13`^rVmT2s82i9!!#'_jT#8Ad&So%8*p9Rrr*8XbOYW.qtPH/rr)9b$3'u(+92HC +dJs-lrs&E$]l)^,rN?/)rVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^rVmT2s82i9!!#'_jT#8Ad&So%8*p9Rrr*8XbOYW.qtPH/rr)9b$3'u(+92HC +dJs-lrs&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`r;Zfq#k3t#d/O(FrVc`q$i6N6Qh^OYqu=08Z2Xb+eT@birU0[lrr;tZI"?\/ +s8C@F#5\@H!58F0Y5\_(s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^r;Zfq#i[E9V#C>nqtpBm$hZpg1%P5?qu=08Z2Xb+eT@birU0[lrr;s?!!3/J +s8::E#5nM7DVkElY5\_)s6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^r;Zfq#i[E9V#C>nqtpBm$hZpg1%P5?qu=08Z2Xb+eT@birU0[lrr;s?!!3/J +s8::E#5\@H!58F0Y5\_(s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`rVm<*r;WX4eGoLGrr<#trr!K0b%o9%r;HWYKm'N,[XN>Vrr)9b$3'u(OF2V, +kl:V/rs&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^rVn)@qYs=kVuQ\lrVliqr;6ElQ2m?QqYgEWKm'N,[XN>Vrr)9b$3'u(+92HC +dJs-lrs&E$]l)^,rN?/)rVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^rVn)@qYs=kVuQ\lrVliqr;6ElQ2m?QqYgEWKm'N,[XN>Vrr)9b$3'u(+92HC +dJs-lrs&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`rVm3&s5\:Fs82fqrr2p4rr;rqr/HI"rr)fqjF_AiDM6+1rVl6b$3'u(OF2V, +kl:V/rs&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^rr3?)r;Oh=QN-aZs8N#t(&n73rV.]Xi;NTPs5\fNE,L?Mrr)iarsA])rZD1B +!7CiEdJjFKs1N=,s8B,##6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^rr3?)r;Oh=QN-aZs8N#t(&n73rV.]Xi;NTPs5\fNE,L?Mrr)iarsA])rZD1B +!7CiEdJjFIs*FaZs8/u!#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`rr36&qu3jUqu-Kirt>>2r;Y)YXS_klqYoa4h:_8sq<[qaq>0oHH%(&!qY9.J +!;lcpo)Apjs*FaZs8/u!#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^rr39'q>FkAq"t$hqu7<.s8)bd!*]0kqY:'UgYgiVs820\$2aYt*rl;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^rr39'q>FkAq"t$hqu7<.s8)bd!*]0kqY:'Sg"k?Ms7u$X$2OGn*rlgElrpp'nqYtmB^&Ru4rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`rr<#t"oX:Gs8DrmrrrE#rVMV-h>[VIKo:Z]ci44Gs*FaZs8/u!#5nMK!+Gp( +nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^rr36%rqm<_s8;llrrrE#rV%B[U$!!3/Rci44Is1N=,s8B,##6"ScEj5TA +nc&gks0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^rr36%rqm<_s8;llrrrE#rV%B[U%!!3/Zci44Gs*FaZs8/u!#5nMK!+Gp( +nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`rr36$s4q_>rr)ikrsJc(s-/#L_8Ej?L&QbfKa(196U?!OK][slL4c2srVlBf +#5\@H!58F0Y5\_(s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^rr36#s1A?$rql]irrrE#s!\,(re1N5]#)7u_ +nc&mks&K+*!13`^rr36#s1A?$rql]irrrE#s!\,(rIt3'k(O!N!!*(:KnSTB"bqZ'qu-Nbrs&?" +HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`rr33#rlK'2rquNj#lXc%P^%(\F[*M=!n[GLo)Apjs*FaZs8/u!#5nMK!+Gp( +nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^rr33!rfmPmrqcBh"9&5t/,K;J7!*2-D$+TkC^p@D!a0PZj_Y-?GO#2+o)Apl +s1N=,s8B,##6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^rr33!rfmPmrqcBh"9&5t/%5K[fDb^=rs&?"HN:bZql]r'r;Y.E@K62ors&?" +B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`rr36%s7q&Brr)ikrsA]'s-/&bg"=rcjg,9!Za+.D>$%K*ZKJOuYd6Lpf`1j> +rs&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^rr36$s764jrqucjrsJc(s!\,TZa-pHf]Linf\+mr!!*)*g=GH?#1qP#GjGD- +o)Apls1N=,s8B,##6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^rr36$s764jrqucjrs/Q%s!\,TZa/Vt$*pnC('"@8PI%OWZNdY?4p'C:qssak +qYtmB^&Ru4rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`rr<#t!r@t@rquirqYp`urVcGHL>Dk4R=pEMpZ)8V=od:Ur:9jlqYtmB^&Ru4 +rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mks&K+*!13`^rr<#s#5'&arVZWnqYp`urVc.&%,Lpd+TMQDfAll6XE;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^rr<#s#5'&arVZWnqYp`urVc.&%,Lpd+ohZEhW+V==od:Ur:9jlqYtmB^&Ru4 +rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`rVm*!s1EF=rVcTm$NC)'s28W^r;-BjrVQWklMCnaqtc:uIsU2Qq<.VZpA7bg +g&M!@rs&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^rVm)ts*Fn"r;6?j#lal"s+UMpqY1!drr)lplMV%erVR`;! +nc&mks&K+*!13`^rVm)ts*Fn"r;6?j#lal"s+UMpqY0mas8)$X$2XPq*rl +nc&mms/U?sG0Bp`rr;us#OH`Js8;lrrr2p(rr;rsq1Fk)rVlfr!ri6!kl1tgs8J+-JUH\]rTF1b +qYsOqgAh*Ars&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^rr3?)rVkLQHiNp?s8N#t$3'u%s7.!Xn,3.`rrW3"roj@grr;s?!!3/Js8;'[ +#5nM$FmT/,o)Apls1N=,s8B,##6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^rr3?)rVkLQHiNp?s8N#t$3'u%s7.!Xn,3.`rrW3"roj@grr;s?!!3/Js8;'[ +#5\@"!8@JNo)Apjs*FaZs8/u!#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`r;RK/s0HFUs8W&rrr2lpr;ZN$CtSdcr;Zfr"S_0\s8MEc$3'u(OF2V,kl:VE +rs&?"<<1bQr:9jlqYtmB^&Ru4rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mks&K+*!13`^r;RK-s(DCbs8W#prr2imqZ#u+!3cG!r;Zfr"S_0\s8MEc$3'u(+92HCdJs.- +rs&E$Wcd\.rUTsmr;XHJhZ*PWrs&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^r;RK-s(DCbs8W#prr2imqZ#u+!3cG!r;Zfr"S_0\s8MEc$3'u(+92HCdJs.- +rs&?"<<1bQr:9jlqYtmB^&Ru4rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`r;R!#rV<1,]_)(#'(CosW;HPmrr<#trquf%KE(uMmJdLls8J+-JUH\]rTF1b +qYsOqgAh*Ars&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^r;R!#r:C%frr<#trquf%KE(uMmJdLls8F,@!W^XJr9+(a +r;Wd>m/R%Trs&E$]l)^,rN?/)rVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^r;R!#r:C%frr<#trquf%KE(uMmJdLls8F,@!W^XJr9+(a +qYsOqgAh*Ars&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`qu7<-s6P2QLns&0s5_PCIsBB>rr2os$3'u&s4qaXrr;ubrsA])rfDMYI-CV/ +kPkb_s&B'Qs8;Hf#5\@H!58F0Y5\_(s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^qu7<+s4@VX(/VsKs2_-k$NR(%rVc`q$3'u&s4qaXrr;ubrsA])rZD1B!7CiE +kPkbas/L5.s8DNg#5nM7DVkElY5\_)s6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^qu7<+s4@VX(/VsKs2_-k$NR(%rVc`q$3'u&s4qaXrr;ubrsA])rZD1B!7CiE +kPkb_s&B'Qs8;Hf#5\@H!58F0Y5\_(s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`r;Zfr')hjeS:Pa(N/W!sCQmNQrr2rsrr39&rq2@tO8]+XmJdLls8J+-JUH\] +rTF1bqYsOqgAh*Ars&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^r;R-'s82i0643bn(`3/O"um/R%Trs&E$]l)^,rN?/)rVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^r;R-'s82i0643bn(`3/O"u +nc&mms/U?sG0Bp`q>VK6s8VcDY_\(=a2IiSr;Q`qs8W)tr;O0HH]S.*rpB^lrr;tZI"?\/s8D-\ +#5\@"!8@JNo)Apjs*FaZs8/u!#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^qu7c;s8Dutn#g:>(1E;`p&Fmfs8N&urr2ip[rZnWrVularsA])rZD1B!7CiE +kPkbas/L5.s8DNg#5nM7DVkElY5\_)s6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^qu7c;s8Dutn#g:>(1E;`p&Fmfs8N&urr2ip[rZnWrVularsA])rZD1B!7CiE +kPkb_s&B'Qs8;Hf#5\@H!58F0Y5\_(s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`qYpZss8Drrs8W)srrW0!rr2p*rr;oqiGb6DMuNbUmJdLls8J+-JUH\]rTF1b +qYsOqgAh*Ars&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^qYpZss8;lkrrW,urr2p*rr;oqiGb6DMuNbUmJdLls8F,@!W^XJr9+(ar;Wd> +m/R%Trs&E$]l)^,rN?/)rVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^qYpZss8;lkrrW,urr2p*rr;oqiGb6DMuNbUmJdLls8F,@!W^XJr9+(aqYsOq +gAh*Ars&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`q>Up's8N#qr;HTkr;?Qorqud'rr)\OIGp +nc&mks&K+*!13`^q>^Hn$N9hsqtp0aq>L?mr;R-'rVDG#iK8uss8MEc$3'u(+92HCdJs.-rs&E$ +Wcd\.rUTsmr;XHJhZ*PWrs&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^q>^Hn$N9hsqtp0aq>L?mr;R-'rVDG#iK8uss8MEc$3'u(+92HCdJs.-rs&?" +<<1bQr:9jlqYtmB^&Ru4rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`qZ$Qos8Dfo"9&6!rr2p+rquf(C:XA"MuUs8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^qZ$Qo!W2fkrr`/ss8N#t%0$2)[;*8PLPu*/rr2?c$3'u(+92HCdJs.-rs&E$ +Wcd\.rUTsmr;XHJhZ*PWrs&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^qZ$Qo!W2fkrr`/ss8N#t%0$2)[;*8PLPu*/rr2?c$3'u(+92HCdJs.-rs&?" +<<1bQr:9jlqYtmB^&Ru4rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`qu6`ss8N#t)><4/_ThiKs8W&trr<#ss5J(*s8S"8s8W&brsA])rfDMYI-CV/ +kPkb_s&B'Qs8;Hf#5\@H!58F0Y5\_(s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^qu6`ss8N#t)=Gb+M4 +nc&mks&K+*!13`^qu6`ss8N#t)=Gb+M4 +nc&mms/U?sG0Bp`qZ$Tp*W49bJU)'JEINGDq>^Bms8Dr[K6jK*[Y0@?bPqJ.rsA])rfDMYI-CV/ +kPkb_s&B'Qs8;Hf#5\@H!58F0Y5\_(s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^qYp`ts7rL!"T/66"D[Q.qu?]pro\o[W403gKsJo$rU0[lrr;s?!!3/Js8;'[ +#5nM$FmT/,o)Apls1N=,s8B,##6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^qYp`ts7rL!"T/66"D[Q.qu?]pro\o[W403gKsJo$rU0[lrr;s?!!3/Js8;'[ +#5\@"!8@JNo)Apjs*FaZs8/u!#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`r;Zfr+8kr/EGg`Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^r;Rr>rVH.V!!"-IY-2Co+944Js8Drps3GS1Ec5oGIqP/Kr9jRkrr;s?!!3/J +s8;'[#5nM$FmT/,o)Apls1N=,s8B,##6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^r;Rr>rVH.V!!"-IY-2Co+944Js8Drps3GS1Ec5oGIqP/Kr9jRkrr;s?!!3/J +s8;'[#5\@"!8@JNo)Apjs*FaZs8/u!#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`rVm0&s8;o=Clla5r;RK)`eSfis8Drrp#"]dio5cMiTgFAmf*Ums8J+-JUH\] +rTF1bqYsOqgAh*Ars&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^rVm0&s8)bW!%=0(r;RK"OVn2%s82fpp#"]dio5cMiTgFAmf*Ums8F,@!W^XJ +r9+(ar;Wd>m/R%Trs&E$]l)^,rN?/)rVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^rVm0&s8)bW!%=0(r;RK"OVn2%s82fpp#"]dio5cMiTgFAmf*Ums8F,@!W^XJ +r9+(aqYsOqgAh*Ars&?"HN:bZql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`r;R$"rml+Ro`+shrVum%q4VrurVc`ms8S)YrrE#brsA])rfDMYI-CV/kPkb_ +s&B'Qs8;Hf#5\@H!58F0Y5\_(s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^r;RK.ri?)Ql2Ue]qtpm/R%Trs&E$]l)^,rN?/)rVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^r;RK.ri?)Ql2Ue]qtp +nc&mms/U?sG0Bp`rr<#t#6"FXNqNGLrr)otrr*H*s6"F.s8;orrVcZmrIKP!r;cibrsA])rfDMY +I-CV/kPkb_s&B'Qs8;Hf#5\@H!58F0Y5\_(s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^rr<#t#5n3 +nc&mks&K+*!13`^rr<#t#5n3 +nc&mms/U?sG0Bp`rVm0$s3>cMs8;orr;Zfr#5nM!ES1O=n +g&Cm>rW`2tH2tVXql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^rVm0"s.9>;s7u]or;R'%s8)al!3uP"qu6WBlM_+grr!o=! +nc&mks&K+*!13`^rVm0"s.9>;s7u]or;R'%s8)al!3uP"qu6WBlM_+grr!o=!O=n +g&Cm>rW`2tH2tVXql]r'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`rr39'r;E=Ls8Doqq>UWsroJBiqu6TUrsA])rfDMYI-CV/kPkb_s&B'Qs8;Hf +#5\@H!58F0Y5\_(s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^rr39'qti`&s82fpq>Ug!rlYQtq>L;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^rr39'qti`&s82fpq>U]srlYQtq>L +nc&mms/U?sG0Bp`rr36&s7q)Drr)ikrs/Q%s-/*3s8LsV"He+aIHoqo#5nL$!8RVRo)Apls*Xs_ +rqiku#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^rr36$s764lrqucks8W'$rVn5IqYL6lroa:c+92HCdf9:/rs&H%Wc[Y.rpp'n +rVsQLhZ!JVrs&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^rr36$s764lrqucks8W'$rVn5IqVM5V+92HCe,TF1rs&E$<<1hSrpp'nr;V0H +^Ae#4rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`rr33#rlAs1rquNj$N9u'P^AFKP&MH^iu7t/rXAiEjVn=@)[QK\n/DQM)[l_P +s8&nu#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^rr33!rf[AkrqcBh%/p2).0:J.)]Tr@P)JO`$&jk&&HDh3FHVRDN<4c^MscQ- +KlPcFr3$&(rVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^rr33!rf[AkrqcBh"o\H".0:LG)ZU!>!!!er)[%&u#lke2)[73"$imU5qQBi& +r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`rr36%rnhkArr)ikrsJ`(rfhbeLQ6*b']Ti,$N:>3&`jZ/&ebHL&FU89'H&R[ +rqrr!#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^rr36#rkJQ%rql]irs\l*r[Is`',)&rD2sD8M$\upL_0Uf!-!sRjbX%kIu*QM +"cA/$mf*0frs&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^rr36#rkJQ%rql]irrrB#r[Is`h@fkjrVup/jV%b0'*\FJmh5j=))'hFr3$&( +r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`rr36&s87>7s8DrlrsA]'s-/'1rqufqjo#M`rVV_'J:$GWqrdn^q#+.lf_t[9 +r<)uts8K/##5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^rr36%s7cRNs8;lkrsSi)s!ImArqu`os8D-[$2sl%*rl +nc&mks&K+*!13`^rr36%s7cRNs8;lkrs/Q%s!ImArqtgT$2jc"*rl +nc&mms/U?sG0Bp`rr39'r;<7FpAOshq>Ua!ro\I+rr)lriVs+DI"?\0s8M3]#5eF#!8IPPmf*@e +s8K2$#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^rr39'qtWZ$mem%_q>UZrrm(pTrqucq!<2-\$3'u(+92HCdJs.-rs&E$Wc[V- +rU9ddrW3&uY5\_)s6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^rr39'qtWZ$mem%_q>UZrrm(pTrqt[R"s +nc&mms/U?sG0Bp`rVm0$s3GQAs8;orr;R'%s82eoFm]2,rr2fmli%4hrr%n)J:$JYr9+%`q>O=n +g&Cm:ri?&'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^rVm0"s.9;/s7u]or;Zfr#5J0p!8IMMrr2fmli%4hrr!o=! +nc&mks&K+*!13`^rVm0"s.9;/s7u]or;Zfr#5J0p!8IMMrr2fmli%4hrr!o=!O=n +g&Cm:ri?&'r;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`rr<#t#6"CWPP5%Srr*9)rr;ups6Fa0s8:jU$3'u(OF2V,kl:VErs&?"<<1bQ +r0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OfDc!Qs8Muqrqlcprr2lrrr)orrVR'%s8N&t +rr;rqrr;uss8W'$rVZZprp9Z8~> +nc&mks&K+*!13`^rr<#t(&[_G2=:G>rVlfrrr;uns4%0Xs8)`SrsA])rZD1B!7CiEkPkbas/L5. +s8A>b#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rn%/Qrr;urrVl]prVlfps8MutrVcX%rVuls +rr2rrrVlirrr<#t"TA8ts8MBbJ,~> +nc&mks&K+*!13`^rr<#t(&[_G2=:G>rVlfrrr;uns4%0Xs8)`SrsA])rZD1B!7CiEkPkb_s&B'Q +s888a#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn%/Qrr;urrVl]prVlfps8MutrVcX%rVuls +rr2rrrVlirrr<#t"TA8ts8MBbJ,~> +nc&mms/U?sG0Bp`r;R$"s3kqRpAb0jrVum1du8P;rr)lrs7a%4\[f/hs8N#crsA])rfDMYI-CV/ +kPkb_s&B'Qs888a#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn.5Prr;unrs/N&rr2rss8Mlp +!WE#lrr`9#s8Drs!<2 +nc&mks&K+*!13`^r;Rr;s/#cRmJm4aqtp +nc&mks&K+*!13`^r;Rr;s/#cRmJm4aqtp +nc&mms/U?sG0Bp`rVm0&s8;o:Cm3-0r;RK,a)cp^rr)lrrr;V9F)Q#2MuWbSmf*Ums8J+-JUH\] +rTF1bqYsOqgAh) +nc&mks&K+*!13`^rVm0&s8)bR!%jhrr;RK'OoQ5mrql`prr;V9F)Q#2MuWbSmf*Ums8F,@!W^XJ +r9+(ar;Wd>m/R$Ors&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr1UN)ufm:s81cZWiW/9p](3l +s8N&ts7P'GXKAAOs8Dp.s0f01s8N#trqufBSB1a/rpB`9~> +nc&mks&K+*!13`^rVm0&s8)bR!%jhrr;RK'OoQ5mrql`prr;V9F)Q#2MuWbSmf*Ums8F,@!W^XJ +r9+(aqYsOqgAh) +nc&mms/U?sG0Bp`r;Zfr&H) +nc&mks&K+*!13`^r;RE/rVQ1O!!!%2\%$3;-NH'os8Drs$iU(bH^WjNhrk%=rpKdmrr;s?!!3/J +s8;'[#5nM$FmT/,R/[Bhs6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N#Ms8W$"pRc;FrcBK,LX#kt +rr;rqmZ)+)FEMMIYPeCurVq\&r;Z`qrql`?DNF;drVl3aJ,~> +nc&mks&K+*!13`^r;RE/rVQ1O!!!%2\%$3;-NH'os8Drs$iU(bH^WjNhrk%=rpKdmrr;s?!!3/J +s8;'[#5\@"!8@JNR/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lKs8W$"pRc;FrcBK,LX#kt +rr;rqmZ)+)FEMMIYPeCurVq\&r;Z`qrql`?DNF;drVl3aJ,~> +nc&mms/U?sG0Bp`qZ$Tp(Al:XO`PAUG'nVSqZ$Norr<#qs1<-skPkkfs8J+-JUH\]rTF1bqYsOq +gAh) +nc&mks&K+*!13`^qYp`ts7`$q,5V?KNqNGLs8N&uqu=9Fe*$`;rr;s?!!3/Js8;'[#5nM$FmT/, +R/[Bhs6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N#Ns"= +nc&mks&K+*!13`^qYp`ts7`$q,5V?KNqNGLs8N&uqu=9Fe*$`;rr;s?!!3/Js8;'[#5\@"!8@JN +R/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lLs"= +nc&mms/U?sG0Bp`qu6`ss8N#t'D^V#]\rGQs8W)urr<#tr;OgGbb09$+j`Bs8;im +]Q:1PrtX[BHKkJ.s,`$7s8Dipb\igCrr)lrm/MS~> +nc&mks&K+*!13`^qu6`ss8N#t'D9CrJALL4s8W&trr<#tr;Om/R$Ors&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr1UN"TA>gGbb09$+j`Bs8;im +]Q:1PrtX[BHKkJ.s,`$7s8Dipb\igCrr)lrm/MS~> +nc&mks&K+*!13`^qu6`ss8N#t'D9CrJALL4s8W&trr<#tr;OgGbb09$+j`Bs8;im +]Q:1PrtX[BHKkJ.s,`$7s8Dipb\igCrr)lrm/MS~> +nc&mms/U?sG0Bp`qZ$Qo!WDrmrr`6!s8N#ts8E?$Mh/sVZap&7rpB^lrr;tZI"?\/s8D-\#5\@" +!8@JNR/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lLrs/K%m<,N/q>C6j,P]=3rqucYEejGf +r;HTkrk +nc&mks&K+*!13`^qZ$Qo!W2`irr`2ts8N#ts8E?$Mh/sVZap&7rpB^lrr;s?!!3/Js8;'[#5nM$ +FmT/,R/[Bhs6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N#Nrs/K%m<,N/q>C6j,P]=3rqucYEejGf +r;HTkrk +nc&mks&K+*!13`^qZ$Qo!W2`irr`2ts8N#ts8E?$Mh/sVZap&7rpB^lrr;s?!!3/Js8;'[#5\@" +!8@JNR/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lLrs/K%m<,N/q>C6j,P]=3rqucYEejGf +r;HTkrk +nc&mms/U?sG0Bp`q>^EmrVQ`qr;?QnrVm<)s7h"kK5GUHU\k#hmf*Ums8J+-JUH\]rTF1bqYsOq +gAh) +nc&mks&K+*!13`^q>^Hn$N9erqYL*bq>Lm/R$Ors&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr1UN"oSDdHAqRsrrN,srVmr;s1 +nc&mks&K+*!13`^q>^Hn$N9erqYL*bq>L +nc&mms/U?sG0Bp`qYpZss8Drlrt>8/s8N&urVkoVUX.u]YA;>]r9jRkrr;tZI"?\/s8D-\#5\@" +!8@JNR/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lLrs/Q%qODPqd,"[#$2a]$r;WU:nG`Cb +rrE&ts8W',s,`!6s3,SVq#C +nc&mks&K+*!13`^qYpZss8;ijrt>5.s8N&urVkoVUX.u]YA;>]r9jRkrr;s?!!3/Js8;'[#5nM$ +FmT/,R/[Bhs6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N#Nrs/Q%qODPqd,"[#$2a]$r;WU:nG`Cb +rrE&ts8W',s,`!6s3,SVq#C +nc&mks&K+*!13`^qYpZss8;ijrt>5.s8N&urVkoVUX.u]YA;>]r9jRkrr;s?!!3/Js8;'[#5\@" +!8@JNR/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lLrs/Q%qODPqd,"[#$2a]$r;WU:nG`Cb +rrE&ts8W',s,`!6s3,SVq#C +nc&mms/U?sG0Bp`q>V$*s8VW3Z@n+'b00JXrr)lrrr2utr;QocGG+s6mf*Ums8J+-JUH\]rTF1b +qYsOqgAh) +nc&mks&K+*!13`^qu7<.s8Dutk*BQi(c%ACli6q]s8N#t!<2or"RC9)rr)9b$3'u(+92HCdJs.- +rs&E$Wcd\.rL!ThrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cf`)Zas6#>\EdEkFbkV5;s8Dts +FmT/,rr3T0s8MurrVlhXMY3`fDmTK@roa<3~> +nc&mks&K+*!13`^qu7<.s8Dutk*BQi(c%ACli6q]s8N#t!<2or"RC9)rr)9b$3'u(+92HCdJs.- +rs&?"<<1bQr0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:Of`)Zas6#>\EdEkFbkV5;s8Dts +FmT/,rr3T0s8MurrVlhXMY3`fDmTK@roa<3~> +nc&mms/U?sG0Bp`r;RE/s8DuVT7(UA]qBsuCPTb+s8Dip#laf#r:"s-s8DBc$3'u(OF2V,kl:VE +rs&?"<<1bQr0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OgAh0O"oSDs`fQ#UE=.W]s8Dlq +WHRY.rVlftrr;us%fQD,OG03?T +nc&mks&K+*!13`^r;RK1s8;o78Hf)CH9_r?!"jqbs8DusrVm0&rVZT_GbtH=mf*Ums8F,@!W^XJ +r9+(ar;Wd>m/R$Ors&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr1XOrr**!s8'`sM#MB$Mr4R5 +r;Wa>m/R%`rrN-!rr*E+rr8(6S84b$DS#lHrr20^J,~> +nc&mks&K+*!13`^r;RK1s8;o78Hf)CH9_r?!"jqbs8DusrVm0&rVZT_GbtH=mf*Ums8F,@!W^XJ +r9+(aqYsOqgAh)m/R%`rrN-!rr*E+rr8(6S84b$DS#lHrr20^J,~> +nc&mms/U?sG0Bp`qu6m!s6Y>VRbIc@#lEDfJnph8rr)iq$H04FrqufjGbG'7mf*Ums8J+-JUH\] +rTF1bqYsOqgAh) +nc&mks&K+*!13`^qu6lts4[q^34Jne#l;,W%KJ]5rqucp$H04FrqufjGbG'7mf*Ums8F,@!W^XJ +r9+(ar;Wd>m/R$Ors&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr1UN!<2or&,l+E]97AY^&Rs/ +V02/)r;HWsrr<#trXJmkH#T2Hs+u!\rqufqlMlA~> +nc&mks&K+*!13`^qu6lts4[q^34Jne#l;,W%KJ]5rqucp$H04FrqufjGbG'7mf*Ums8F,@!W^XJ +r9+(aqYsOqgAh) +nc&mms/U?sG0Bp`rVuos$2s^tDSQ5OrqucprtFk3HA(kgrVQW2@B';,o=8nIs8;rVlisrr;rfs8DorP'j5's8;#1Jb9!@l2Q8~> +nc&mks&K+*!13`^rVuos$2aEl!.OtJrqcWnrtF:7!tXMlr;6N1@B';,o=8nIs8;rVlisrr;rfs8DorP'j5's8;#1Jb9!@l2Q8~> +nc&mks&K+*!13`^rVuos$2aEl!.OtJrqcWnrtF:7!tXMlr;6N1@B';,o=8nIs8;rVlisrr;rfs8DorP'j5's8;#1Jb9!@l2Q8~> +nc&mms/U?sG0Bp`r;R$"s0cXUs8;iorr;rsrt3.a^&S$0rUZA"R?reJPPb@Xmf*Ums8J+-JUH\] +rTF1bqYsOqgAh)tr;QWmr;Ws@ +l2UeGE5_eRs8N#rrr&=RqZ$SVL]@DQr;XcRX8;_mlMlA~> +nc&mks&K+*!13`^r;R#us)%gas8)WkrY>A.s8RiSHN3j@rUZA"R?reJPPb@Xmf*Ums8F,@!W^XJ +r9+(ar;Wd>m/R$Ors&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr1XO0)keHT5s>tr;QWmr;Ws@ +l2UeGE5_eRs8N#rrr&=RqZ$SVL]@DQr;XcRX8;_mlMlA~> +nc&mks&K+*!13`^r;R#us)%gas8)WkrY>A.s8RiSHN3j@rUZA"R?reJPPb@Xmf*Ums8F,@!W^XJ +r9+(aqYsOqgAh)tr;QWmr;Ws@ +l2UeGE5_eRs8N#rrr&=RqZ$SVL]@DQr;XcRX8;_mlMlA~> +nc&mms/U?sG0Bp`rr;us#OZlHs8;lrrr2rtrWW8uoS.thrr*0&p6^5ZI];r +kl:YCFI`7*r;HTkrSDXaqu-PVLAUuL#5nM0B>X]GlMlA~> +nc&mks&K+*!13`^rr3?)rVkXUErYt7s8N#ts8ET,qW\e'kPkGZs7Vh-Jps]jrr2?c$3'u(+92HC +dJs.-rs&E$Wcd\.rL!ThrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cg&D9Ss3l#4s82fo)>aB< +E9R?$jE-phqu$Ekqu,AnRJZs_OG +nc&mks&K+*!13`^rr3?)rVkXUErYt7s8N#ts8ET,qW\e'kPkGZs7Vh-Jps]jrr2?c$3'u(+92HC +dJs.-rs&?"<<1bQr0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:Og&D9Ss3l#4s82fo)>aB< +E9R?$jE-phqu$Ekqu,AnRJZs_OG +nc&mms/U?sG0Bp`rVm*!rjmXSrVcNk&H)RECV9TArVZWko_%hSrqc!Y$2XPqNd?2$jSSc9qZcck +;ZPGHpmCp_q"r>:?i0QeqZcckAH9jLq"":eq>9OZ1&LbBg%tsKqs8 +nc&mks&K+*!13`^rVm0!rc\qAr;?ToqYq-(s+15rqY0m`rVcE`p&G'im/77grVR`;!j8JlGr7H"oJ8cEf'AbrsA@YMY$cBqk%W& +qu7>&BZL,KrJu^1rVZWkr:>emgAh'9rI=~> +nc&mks&K+*!13`^rVm0!rc\qAr;?ToqYq-(s+15rqY0m`rVQ6[oDS[bm/%+cqt_B7!$B#X]Cqi6C+qtg3dqXKAef_t[4qg\~> +nc&mms/U?sG0Bp`rr39'rV_kCs8DrrqYp`urVcDEL>Dk4R"L3Ip#H&R=od`MrrV!VB'oU"D#i5U +rrE*We,KN]L6L'bliZOFG/=+V$(upThUJONTpIn~> +nc&mks&K+*!13`^rr<#s#5fVls8;lqqYp`ur;Gt!%Gh$e+92HCfAll4XE=#trrVV.ZL.Yn[W(R" +rrIY=eGfpUZ@@eTjQ,F^QuBP6rsJOgI&PTWjklnYYl4S&OGE]4"8@>#qs+33~> +nc&mks&K+*!13`^rr<#s#5fVls8;lqqYp`ur;Gt!%Gh$e+TMQDh;eM:=od`MrrV!VB'oU"D#i5U +rrE*We,KN]L6L'bliZOFG/=+V$(upThUJONTpIn~> +nc&mms/U?sG0Bp`rr36%s64[Crr)ikrsA]'s-/&fh;$i#ik#D0>@(O6]=R1;#.V9/!2-s7R(ER5 +]9rXh]=@CC#.V9]]=HJ("2U+#>5_\C=G=)m]=YYgY@1I8>[1K9?*LuQ]=Vlj +])9/E\\3\rK=e_]]79~> +nc&mks&K+*!13`^rr36$s3q%&rVQThrrrE#s!\,\rjr3Gh>Z3oh$Mlmg`$4o!4C\;kM6?sh4Ai: +h;"CR#2J%YFeddIn_FE(h5,59h;%SW#Me.fJ +nc&mks&K+*!13`^rr36$s3q%&rVQThrrrE#s!\,\hR`t.!!*(f]=I+:#.V9/!2-s7R(ER5]9rXh +]=@CC#.V9]]=HJ("2U+#>5_\C=G=)m]=YYgY@1I8>[1K9?*LuQ]=Vlj])9/E +\\3\rK=e_]]79~> +nc&mms/U?sG0Bp`rr33"rkiO,s8;Wk#lXc%P^.1_F[:QYJH2hQJ,~> +nc&mks&K+*!13`^rr32ureU]gs8)Ki"9&5t.f02I7 +nc&mks&K+*!13`^rr32ureU]gs8)Ki"9&5t.Y.SN!3#sK~> +nc&mms/U?sG0Bp`rr36%s7:TFrr)ikrsA]'s-.rE]t^q(ja7A]I!\=F5!3h4Hfob\H$h%@C4(>p +Hj4nEAH4B2H1?7dH$h@I@siUnHj>"GFT<8+H@+1ipj)per-SKkq0E$frI"Wkq0`3g!.4!YJ,~> +nc&mks&K+*!13`^rr36$s6'H!rqucjrsSi)s![toI!^6k[D1n<$,!sa(B=I9S%uZ!]`u-_P^9^M +]U6A:]Y1UrQbC'%]`u-_R!>mL]^WT9\q#af^%f8:^%o>=^&Pb@^&Pb0]mp~> +nc&mks&K+*!13`^rr36$s6'H!rqucjrs/Q%s![toI!an$"+,EB&,lP1AUJgeHj4kD.0++1HC0'a +H@09(078'8Hj4kD1&tg3HLcFgH[Kr9(jpXVeU7. +nc&mms/U?sG0Bp`rr<#t"o="=s8DolrrrE#rVVV3h>[VIKo:Z]j8T0b!:,mL!oX,mmJd6+!8QuA +!<>$?s*t~> +nc&mks&K+*!13`^rr36%rq-aKs8;llrrrE#rV@WOh>[U$!!3/Rj8T1_FS(gt!q:08mJd6sDscrl +!J$Z%s*t~> +nc&mks&K+*!13`^rr36%rq-aKs8;llrrrE#rV@WOh>[U%!!3/Zj8T0b!:,mL!oX,mmJd6+!8QuA +!<>$?s*t~> +nc&mms/U?sG0Bp`rVm-"rj-q=rVc`mrsJc*r;Y/]b5D)5r8d\\q>0oHH%(&!qY97M#5.gk!7gr? +R/.$]qTT"IqXsCT#5.h(!6G$2o(iUdqWn2:qY0fMqLA~> +nc&mks&K+*!13`^rVm,urb2hur;6Kjrs8W(qZ!2gQ2:1QqW7V]qu$=5!!*)Gr;#OR#5S1rFm8i# +R/@0br8r%'r;#m\#5S2&ET?uno)&air:PT-r;6AUr."~> +nc&mks&K+*!13`^rVm,urb2hur;6Kjrs8W(qZ!2gQ2:15q?cuoq&]S;!6tB7kP>DUqGRCEqY-BR +#5@u=!+5TqnbNI_qIKZJqY0RW#Pe/^!&=?Eq3:`+~> +nc&mms/U?sG0Bp`rVm*#s5S1Fs82fprr3?)s8MupNemN1rr;usrqlcprr2 +nc&mks&K+*!13`^rVm*"s2P,.s7lTmrr3?)s8Dlk-PuFRrVulrrqlcprr2 +nc&mks&K+*!13`^rVm*"s2P,.s7lTmrr3?)s8Dlk-PuFRrVulrrqlcprr2 +nc&mms/U?sG0Bp`rVmW3r;WR4fDkdHrr2rsrr)fqc"tQ&r;Q]rrT4%crr;tZI"?\/s8D-\#5\@" +!8@JNR/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^rVmW3qYs.fY5eCrrVliqrVQNmSH+rTqYpKprT4%crr;s?!!3/Js8;'[#5nM$ +FmT/,R/[Bhs6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^rVmW3qYs.fY5eCrrVliqrVQNmSH+rTqYpKprT4%crr;s?!!3/Js8;'[#5\@" +!8@JNR/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`r;Zfq"7D1oe,KCIrVlg0r1n4pq#13lrr)l_^VRS;r;HW^rsA])rfDMYI-CV/ +kPkb_s&B'Qs888a#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^r;Zfq"5YC-X8`/!qu6U.q+Ui>nbi@brr)l_^VRS;r;HW^rsA])rZD1B!7CiE +kPkbas/L5.s8A>b#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^r;Zfq"5YC-X8`/!qu6U.q+Ui>nbi@brr)l_^VRS;r;HW^rsA])rZD1B!7CiE +kPkb_s&B'Qs888a#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`rVn)@s8;oUFEa=jo`+sakh25>[e'Lts8MusbBn)CDfsA*rVl6b$3'u(OF2V, +kl:VErs&?"<<1bQr0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^rVn)@s8)c4!!#?;l2UeMf +nc&mks&K+*!13`^rVn)@s8)c4!!#?;l2UeMf +nc&mms/U?sG0Bp`r;Zfr+8l,[LN79dVPf2iEIPn,s8N&trVl83L>(@qFa3$IrU0[lrr;tZI"?\/ +s8D-\#5\@"!8@JNR/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^r;Zfr+8Yu")ZTjF9hc,u!"+V`s8DusrVl83L>(@qFa3$IrU0[lrr;s?!!3/J +s8;'[#5nM$FmT/,R/[Bhs6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^r;Zfr+8Yu")ZTjF9hc,u!"+V`s8DusrVl83L>(@qFa3$IrU0[lrr;s?!!3/J +s8;'[#5\@"!8@JNR/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`q>V6/s7G9aQ$%28X/G@br;Q`qs82i9FO^ +nc&mks&K+*!13`^q>V6/s6.RQ1B7D-<`RoSq>L?ms82i9FO^ +nc&mks&K+*!13`^q>V6/s6.RQ1B7D-<`RoSq>L?ms82i9FO^ +nc&mms/U?sG0Bp`qu6cts8W&rrrVWUrr2p,rVuoss8MusQA>M=p\3qP$3'u(OF2V,kl:VErs&?" +<<1bQr0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^qu6cts8W#qs8UsVrr2p,r;Zfrs8MusQA>M=p\3qP$3'u(+92HCdJs.-rs&E$ +Wcd\.rL!ThrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^qu6cts8W#qs8UsVrr2p,r;Zfrs8MusQA>M=p\3qP$3'u(+92HCdJs.-rs&?" +<<1bQr0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`q>Up's8MuprVuorqu$Hnrr2p,rVlhTMsldYK:h-&rVl6b$3'u(OF2V,kl:VE +rs&?"<<1bQr0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^q>Up's8Dllqu?]oq"t$irr2p,rVlhTMsldYK:h-&rVl6b$3'u(+92HCdJs.- +rs&E$Wcd\.rL!ThrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^q>Up's8Dllqu?]oq"t$irr2p,rVlhTMsldYK:h-&rVl6b$3'u(+92HCdJs.- +rs&?"<<1bQr0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`q>^Hn!<)fp!ri/trVuos$ic9AMM7=ND1_0SrU0[lrr;tZI"?\/s8D-\#5\@" +!8@JNR/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^q>^Kos8;co!r`#qrVuos$ic9AMM7=ND1_0SrU0[lrr;s?!!3/Js8;'[#5nM$ +FmT/,R/[Bhs6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^q>^Kos8;co!r`#qrVuos$ic9AMM7=ND1_0SrU0[lrr;s?!!3/Js8;'[#5\@" +!8@JNR/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`qu7''s8W&ts80s-_V=8QrrW/us8N!*s-.N/q#BinEjPfDmf*Ums8J+-JUH\] +rTF1bqYsOqgAh) +nc&mks&K+*!13`^qu7''s8W#ss7i!OKtYk4rrDuprX8ajEO,B>n@3MFs8; +nc&mks&K+*!13`^qu7''s8W#ss7i!OKtYk4rrDuprX8ajEO,B>n@3MFs8; +nc&mms/U?sG0Bp`qZ$Tp*WP?)KQ29_E-78crr;rrs8MusOb3E/qu?D8U&P#YrsA])rfDMYI-CV/ +kPkb_s&B'Qs888a#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^qYp`urVt;Q'`7qF,FSH/rVlirrVr"3q>^?lpNWD2rU0[lrr;s?!!3/Js8;'[ +#5nM$FmT/,R/[Bhs6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^qYp`urVt;Q'`7qF,FSH/rVlirrVr"3q>^?lpNWD2rU0[lrr;s?!!3/Js8;'[ +#5\@"!8@JNR/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`r;Zfr+8l)JF`jJ(naXr5U2u@Vs8Drqrr7k5rr)`ln9C`.rU0[lrr;tZI"?\/ +s8D-\#5\@"!8@JNR/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^r;Zfr&Gl9D!!#c_j5chR7fXm\s8Drr$ic*Arr)`ln9C`.rU0[lrr;s?!!3/J +s8;'[#5nM$FmT/,R/[Bhs6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^r;Zfr&Gl9D!!#c_j5chR7fXm\s8Drr$ic*Arr)`ln9C`.rU0[lrr;s?!!3/J +s8;'[#5\@"!8@JNR/[Bgs3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`rVm-%s8;oLCo-7irsR_3FhI\OrqubrJGoKI"R^E4s8; +nc&mks&K+*!13`^rVm-%s8)c!!)^u:rsQXF!-eA;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^rVm-%s8)c!!)^u:rsQXF!-eA +nc&mms/U?sG0Bp`r;Rr=roSTss8W&rrr2lorVu)IET-oprVu;/V!$jaOF$$frU0[lrr;tZI"?\/ +s8D9`s8EB*qu?[u!9!ePs8JJe#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^r;Rr&#!6"m6rVu;/V!$jaOF$$frU0[lrr;s?!!3/J +s8;3_%0$;,rVunuFmo;,s8JJe#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^r;Rr&#!6"m6rVu;/V!$jaOF$$frU0[lrr;s?!!3/J +s8;3_s8EB*qu?[u!9!ePs8JJe#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`rr<#t#5nIgHfk;(rr*`6rr2rps4_Ogrqucos1rSmEcGp6s8DrbrsA])rfDMY +I-CV/l2M.is5%c5!4`(*rr;ters&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mks&K+*!13`^rr<#t#5eBX%aP%Krr)otrr*T+s0_nrrVQTms1rSmEcGp6s8DrbrsA])rZD1B +!7CiEl2M.js6m=MHJAJtrr;ters&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^rr<#t#5eBX%aP%Krr)otrr*T+s0_nrrVQTms1rSmEcGp6s8DrbrsA])rZD1B +!7CiEl2M.is5%c5!4`(*rr;ters&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`rVm0%s4VPJs8;orr;Zfrs83CsF5m5trr)l +nc&mks&K+*!13`^rVm0#s0_p6s8)cpr;Zfrs8!6b!65'9rr)l;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^rVm0#s0_p6s8)cpr;Zfrs8!6b!65'9rr)l +nc&mms/U?sG0Bp`rr3-#r;EUQrquirq>Ud"s4MFdqYU3gqY^?nr9O4dqYU,KH@L8%qt]RT"o%l# +!!!-"!!?m0r;N2c#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^rr39'qYX>5rVQQmq>Ucus0MnrpA"L]qY^?nrp0Lhr;HO8!!*)GrVGjY%K$(V +F+&XjJ:D[Hr;HVars&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^rr39'qYX>5rVQQmq>Ucus0MnrpA"L]qY^?nr9O4dqYU+2!!*)EqtTLS"o%l# +!!!-"!!?m0r;N2c#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`rr<#t"oO"Gs8DrmrrrE#rVhq1h>[VGKSbBWkPkTV!X/H%"9ee3s8/;c#5nMK +!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^rr36%rqZdas8;llrrrE#rVe#Dh>[U$!!3/QkPkpdG_1EqIt3,kg&Lu>rs&H% +k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^rr36%rqZdas8;llrrrE#rVe#Dh>[U%!!3/XkPkTV!X/H%"9ee3s8/;c#5nMK +!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`rr33#s3bi8rr)Tk$NC#(P^]R/X-Q^_j&$"4-RgE8;,HRU!`2`.qZ$a$!jM\$ +S,W]js3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^rr33!s/,jsrqcBh%0$5*.0NIE;,UG^X/G0[$)a`"'`\77MQ;Mrs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^rr33!s/,jsrqcBh"oeK#.0NK(;#gt&!!5Ja;!Us[:f.r(!!EB*Yl=Nhrs&E$ +d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`rr33#rmPl:rquNj#lXc%P^7OpI8.U +s8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^rr36"rhomurqcWhrri<"r@.jG!!6#FF6IcLF`qm;rW!".HZ\Lq!e,ZLrI>$% +GLuimS,W]ks6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^rr36"rhomurqcWhrri<"r@.iW!!EB(Yl=Kgrs&E$d/[VTqXORiqYt1.bl@V3 +rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`rr36&s8.5Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^rr36%s7cR]s8;lkrsSi)s!Rluh;$fCna5N-$170J*<6*?_sZjVmLAONQ[+.3 +J:N-#GM3#pS,W]ks6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^rr36%s7cR]s8;lkrs/Q%s!Rluh;%&H$/F@l)ZTm=[GBR&h#uEe0*)1R!!EE) +ZiBolrs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`rr39'rVDk@qYgBlqYp`urVl>9T&'DLQ%4R=nE9fZM#[MX!!!0&.J`r@S,W]j +s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^rr39&r:VfgpAFmgqYp`ur;GUg52H5A+92HCeE?i>`,pH[J:E2rPPkCYS,W]k +s6+L-s8;Ee#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^rr39&r:VfgpAFmgqYp`ur;GUg52H5A+TMQDf]W8BM#[MX!!!0&.J`r@S,W]j +s3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`rVm0$s2Ap>rqufqr;R-'s82i)Dr^iorquZj!W)][r!E8uqi6#QHfk8&lMM%d +s+:g^!!*'9df966rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mks&K+*!13`^rVm0"s,-m&rqcZor;R0(s7lV0!6>'6rVQKiquQ]mm/77grVR`;! +nc&mks&K+*!13`^rVm0"s,-m&rqcZor;R0(s7lV0!6>'6rVQHhqZ6Qjm/.1er;.Q9! +nc&mms/U?sG0Bp`rr;us"n[AFs8DoqrXAi+rr;oroQm51r;Q]UrsA])rfDMYI-CV/lMh:lqZ#)8 +(BJ+'s8DusS,W]js3UgTs8)9c#5\@4!6kK@o)Asns7$(Es8;lLrrrE%rVZTlrr2rts8EK-rVZTm +s8N&sr;Q`qs8DrqquH]prr)lqrW)orquH]prq$/?~> +nc&mks&K+*!13`^rr39'rVbsj>6"KsqYgcss6'kYrql]oj8TGbs8F,@!W^XJr9F:hrquf]T8Rut +n,N?Srs&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr1UN"oeQ#r;?Nmrr<#urXJo+r;?Qorr;rp +rr;utrVlcn!<)orrVuiq!<)op!<)oroDa=~> +nc&mks&K+*!13`^rr39'rVbsj>6"KsqYgcss6'kYrql]oj8TGbs8F,@!W^XJr9F:jrqcZF7Mc): +h>dHRrgWolr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:Og&D6Ts8DlnrVlfrs8W'-s8Dlnrr;ut +rVZZprr;rrrVQZorr2lrrVcfqrqlcprr2NhJ,~> +nc&mms/U?sG0Bp`r;Qots2&KOrr3Q.rr2lorVu)VE8gforr:a%r7(nrhuE]DrsA])rfDMYI-CV/ +li.Cms8W#ss&f?as7u]oRf +nc&mks&K+*!13`^r;Qors+LGXrr3Q,rVcWiqu>#6s82iqRf +nc&mks&K+*!13`^r;Qors+LGXrr3Q,rVcWiqu># +nc&mms/U?sG0Bp`r;R$$r;X-?W9!jQrr_/-EkMAL"93paD>n>SD/PmDr9jRkrr;tZI"?\/s8D3^ +s8E8ur)<[JrVZY_rs&E$d/[VTqXORiqYt1.bl@V3rs/N&nGk?Er;PCL3;rm5_Sk4-rVlisrr)iX +_o(j@r;YQeo`+pjrr<#faN2KAjT#8Zs8N#trr)lld)O2HfDkjLs8M]kJ,~> +nc&mks&K+*!13`^rVuos#5eF6!*78:qu7&>#69&Iqu-KnJS&cuC]nTmSH&NTrsA])rZD1B!7CiE +l2Ue_#Q+J!FmAu)rgEcjrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cg&F&1s4tQ1g\q*Ms8W)s +roM&8m/R"`gqWL]rr;uts7"+Nai*9?s8N&trr;urs7js\ai2m3rr2rsp&BO~> +nc&mks&K+*!13`^rVuos#5eF6!*78:qu7&>#69&Iqu-KnJS&cuC]nTmSH&NTrsA])rZD1B!7CiE +l2Ue_#Pe3r!8%2IrgEcjr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:Og&F&1s4tQ1g\q*Ms8W)s +roM&8m/R"`gqWL]rr;uts7"+Nai*9?s8N&trr;urs7js\ai2m3rr2rsp&BO~> +nc&mms/U?sG0Bp`qu?]p&+b]rH&g/=n^"YEEeWZUrVld(s3AR'a2Z-:HE.#Dmf*Ums8J+-JUH\] +rTF1bqYsOqgAh)[L,jo>8XrVNI;rbNBdGGsm-rVuosr;XT]E,09+EM!"*rVuljs*t~> +nc&mks&K+*!13`^qu79+rT>7&!%+/pjI^Tr!#*ZXrVld(s3AR'a2Z-:HE.#Dmf*Ums8F,@!W^XJ +r9+(ar;Wd>m/R$Ors&H%k]3p-r:0dkr;X*Cjo>;Mrs/Q'pjee4rr1UN*rGu?CN4q"rr2rtrr)k` +E,F#&q>[L,jo>8XrVNI;rbNBdGGsm-rVuosr;XT]E,09+EM!"*rVuljs*t~> +nc&mks&K+*!13`^qu79+rT>7&!%+/pjI^Tr!#*ZXrVld(s3AR'a2Z-:HE.#Dmf*Ums8F,@!W^XJ +r9+(aqYsOqgAh)[L,jo>8XrVNI;rbNBdGGsm-rVuosr;XT]E,09+EM!"*rVuljs*t~> +nc&mms/U?sG0Bp`r;RE/s8DucZBTfWH$OFJDQ<('rVlQk"PInXrr)9b$3'u(OF2V,kl:VErs&?" +<<1bQr0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:Og&EGts0[*3Ja3:6rr2lql@OY6ec5LG +ZZG=0rVcbtE1bV-dF>.5P5,"SrX>lLNQT`!`KtY8qZ$Qfs*t~> +nc&mks&K+*!13`^r;R!#s8;oQCbkhe"C9[[qu6?i"PInXrr)9b$3'u(+92HCdJs.-rs&E$Wcd\. +rL!ThrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cg&EGts0[*3Ja3:6rr2lql@OY6ec5LGZZG=0 +rVcbtE1bV-dF>.5P5,"SrX>lLNQT`!`KtY8qZ$Qfs*t~> +nc&mks&K+*!13`^r;R!#s8;oQCbkhe"C9[[qu6?i"PInXrr)9b$3'u(+92HCdJs.-rs&?"<<1bQ +r0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:Og&EGts0[*3Ja3:6rr2lql@OY6ec5LGZZG=0 +rVcbtE1bV-dF>.5P5,"SrX>lLNQT`!`KtY8qZ$Qfs*t~> +nc&mms/U?sG0Bp`q>UHorr3;iaIo0Hhq\83rVlisrX8c)r;?HimXV/6rVl6b$3'u(OF2V,kl:VE +rs&?"<<1bQr0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:Og&E)js0R$aEl%bPs8W#sa**&Y +eGoCFZ>o(-r;Pf"Y5J;-rgIE6s8;iq`,;=Gr;QuBDOpM"rr2ZlJ,~> +nc&mks&K+*!13`^qu6`ss8Drs$IkD47ZkHus8VurrVd3)rVZTjr9f*3s8DrbrsA])rZD1B!7CiE +kPkbas/L5.s8A>b#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rn7;lr;X-K]lLsgqu?]os2T;7 +GLZZhs0?Y-s8;lXFKYQA$iZT+_#O?2s28fLqY^?taDRRBrVlfjs*t~> +nc&mks&K+*!13`^qu6`ss8Drs$IkD47ZkHus8VurrVd3)rVZTjr9f*3s8DrbrsA])rZD1B!7CiE +kPkb_s&B'Qs888a#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;lr;X-K]lLsgqu?]os2T;7 +GLZZhs0?Y-s8;lXFKYQA$iZT+_#O?2s28fLqY^?taDRRBrVlfjs*t~> +nc&mms/U?sG0Bp`qYp]ts8MurqZ$Tp!WW/rs8W'&r;EXHqu6Q]rsA])rfDMYI-CV/kPkb_s&B'Q +s888a#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;Vr;X-Dh2@Ksrr2rr/=V0kERt0ds0?Y- +s82iNCrQ>Ir;HNmjJ:0&qu?23M#IANrVcZms.=24s8;TjJ,~> +nc&mks&K+*!13`^qYp]ts8DloqYpZsrVulos8W'&r;EXHqu6Q]rsA])rZD1B!7CiEkPkbas/L5. +s8A>b#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rn7;Vr;X-Dh2@Ksrr2rr/=V0kERt0ds0?Y- +s82iNCrQ>Ir;HNmjJ:0&qu?23M#IANrVcZms.=24s8;TjJ,~> +nc&mks&K+*!13`^qYp]ts8DloqYpZsrVulos8W'&r;EXHqu6Q]rsA])rZD1B!7CiEkPkb_s&B'Q +s888a#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;Vr;X-Dh2@Ksrr2rr/=V0kERt0ds0?Y- +s82iNCrQ>Ir;HNmjJ:0&qu?23M#IANrVcZms.=24s8;TjJ,~> +nc&mms/U?sG0Bp`q#C?m$2jc%rqlTjrr;unrs/K$ghOY)r;Q*`$3'u(OF2V,kl:VErs&?"<<1bQ +r0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:Og&E)js0Zb1Z?>F3r;HW^GbDrjfDk^IZ>o(- +qu>>gVZ-Ssr;HTnrtGD0s0-\%s8;lqs8W&sm +nc&mks&K+*!13`^q#CBn$N9ets8D]eq>UEnq>U]trnM8(s8;l`rsA])rZD1B!7CiEkPkbas/L5. +s8A>b#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rn7;lr;X0Bl`tZts8;ipm +nc&mks&K+*!13`^q#CBn$N9ets8D]eq>UEnq>U]trnM8(s8;l`rsA])rZD1B!7CiEkPkb_s&B'Q +s888a#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;lr;X0Bl`tZts8;ipm +nc&mms/U?sG0Bp`qYpZss8MurrrMHarr3-#rVuosr;R$$rVs0GjSo)DrsA])rfDMYI-CV/kPkb_ +s&B'Qs888a#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;or;X3Cm+cEprqu]n`GET>C"WI^ +s0?Y-s8;lbJpY2so`"mjr;Z`qrWJ:9s8N#ss8W'&rV2k'k5YARs*t~> +nc&mks&K+*!13`^qYpZss8DiorrM$Srr3-#qu?]qr;R$$rVs0GjSo)DrsA])rZD1B!7CiEkPkba +s/L5.s8A>b#6"ScEj5TAnc&gks0H_,s8DNg#QFbuJ=6H:rn7;or;X3Cm+cEprqu]n`GET>C"WI^ +s0?Y-s8;lbJpY2so`"mjr;Z`qrWJ:9s8N#ss8W'&rV2k'k5YARs*t~> +nc&mks&K+*!13`^qYpZss8DiorrM$Srr3-#qu?]qr;R$$rVs0GjSo)DrsA])rZD1B!7CiEkPkb_ +s&B'Qs888a#5nMK!+Gp(nc&gis(;>Us8;Hf#Q=\m!&FTPrn7;or;X3Cm+cEprqu]n`GET>C"WI^ +s0?Y-s8;lbJpY2so`"mjr;Z`qrWJ:9s8N#ss8W'&rV2k'k5YARs*t~> +nc&mms/U?sG0Bp`qu7<.s8N&un^NnENha,Fs8W&ss8Mus#lXc#KqeVFrr2o(-rVZ]9F`DehVo@p#s8Drqs-J?4s8Drqrs&B#Z#f1/rV->B~> +nc&mks&K+*!13`^qu7<.s8DutjK1o(-rVZ]9F`DehVo@p#s8Drqs-J?4s8Drqrs&B#Z#f1/rV->B~> +nc&mks&K+*!13`^qu7<.s8DutjK1o(-rVZ]9F`DehVo@p#s8Drqs-J?4s8Drqrs&B#Z#f1/rV->B~> +nc&mms/U?sG0Bp`r;Ri;s8Dug\USRPW1nrdFdCe^s8N&ts8W)srl]<,rqu*^$3'u(OF2V,kl:VE +rs&?"<<1bQr0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:Og&E]&s0cn*s/U;+rr2\IOo3+5 +f`1gJZ>o(-rVlcqi1k[FD/t'*q>^Emo8/1ss8Mus#QFZ#X`N_+rV->B~> +nc&mks&K+*!13`^r;Ri;s8DuYGR4?Y9gf9f!&1n^s8Duss8W)srl]<,rqu*^$3'u(+92HCdJs.- +rs&E$Wcd\.rL!ThrVu)%YlFXkrs&E$ZZ5+,rUTsnrr;bDRK*9cg&E]&s0cn*s/U;+rr2\IOo3+5 +f`1gJZ>o(-rVlcqi1k[FD/t'*q>^Emo8/1ss8Mus#QFZ#X`N_+rV->B~> +nc&mks&K+*!13`^r;Ri;s8DuYGR4?Y9gf9f!&1n^s8Duss8W)srl]<,rqu*^$3'u(+92HCdJs.- +rs&?"<<1bQr0[Kgr;Y.E@K62ors&?"B)p0Ur:9jmrVuBf1B7:Og&E]&s0cn*s/U;+rr2\IOo3+5 +f`1gJZ>o(-rVlcqi1k[FD/t'*q>^Emo8/1ss8Mus#QFZ#X`N_+rV->B~> +nc&mms/U?sG0Bp`qu?]p&FYTrS(RB5s7Y^0P&Ic"rr2lr#5nLsFRoJ2li.:js8J+-JUH\]rTF1b +qYsOqgAh)3I<15%s8;VNK_bZIr;R!!riL8+s8D]lJ,~> +nc&mks&K+*!13`^qu7<,qqiUu4LOGRs6eLD/HBbQrr)fq#5nLsFRoJ2li.:js8F,@!W^XJr9+(a +r;Wd>m/R$Ors&H%kAda+r:0dkr;X*Cjo>;Mrs/Q'pjee4rr1UN0)YaXE8gfHDo2PSgMjb(_/7j) +qZ!j@kPtJ[s8N&ulI`>3I<15%s8;VNK_bZIr;R!!riL8+s8D]lJ,~> +nc&mks&K+*!13`^qu7<,qqiUu4LOGRs6eLD/HBbQrr)fq#5nLsFRoJ2li.:js8F,@!W^XJr9+(a +qYsOqgAh)3I<15%s8;VNK_bZIr;R!!riL8+s8D]lJ,~> +nc&mms/U?sG0Bp`r;Qs"rVrI2ec,UKrVlg.rM=Itp\k*ks8N#iN0Us8;Hf#Q=\m!&FTPrn7;mr;X3Ej8\h)QMg`dF6*>; +CtSdas0?Y-s8Di`r;HTnrs\kjS914srVr(6qu?Znrs&B"YAre+r:g5A~> +nc&mks&K+*!13`^r;Qs"qu8q^Y5\J$qu6U,qb7&@nbi@bs8N#iN0; +CtSdas0?Y-s8Di`r;HTnrs\kjS914srVr(6qu?Znrs&B"YAre+r:g5A~> +nc&mks&K+*!13`^r;Qs"qu8q^Y5\J$qu6U,qb7&@nbi@bs8N#iN0Us8;Hf#Q=\m!&FTPrn7;mr;X3Ej8\h)QMg`dF6*>; +CtSdas0?Y-s8Di`r;HTnrs\kjS914srVr(6qu?Znrs&B"YAre+r:g5A~> +nc&mms/U?sG0Bp`rVmrrr39's82hnHgLb1p]#a~> +nc&mks&K+*!13`^rVmr;Mrs/Q'pjee4rr1UN*W5rGE9$usX*!_. +KTc95_JRs*qZ!j@kPtMSNfs5;r=/](s8J@6p](5`JG&m>rr39's82hnHgLb1p]#a~> +nc&mks&K+*!13`^rVmrrr39's82hnHgLb1p]#a~> +nc&mms/U?sG0Bp`rVm*#ro.mnq>C6krr3W1s8DraI>mt#rr;oql#*I!qu5p]$3'u(OF2V,kl:VE +rs&?"<<1bQr0mWmrr<"Q)Zh*]jo>8Mrs&?"B)p0Ur:9jmrVuBf1B7:Og&E`'s0cn-s8U_galIo(-qu +nc&mks&K+*!13`^rVm3%rl+q4o_JIbrr2p1rr;logBnkirVccoron=!rql]\rsA])rZD1B!7CiE +kPkbas/L5.s8ADd$NC)*_MEQ!Vt0ldoD]$ms0H_,s8DNg#QFbuJ=6H:rn7<)r;X3EjT#84D9:jU +^An5ND:nmbs0?Y-s82i$Ep3N#rr2los-nH2s8UD\V>pJlrr*,us3PYVs8;TjJ,~> +nc&mks&K+*!13`^rVm3%rl+q4o_JIbrr2p1rr;logBnkirVccoron=!rql]\rsA])rZD1B!7CiE +kPkb_s&B'Qs88>c$NC)*L)U19Us8;Hf#Q=\m!&FTPrn7<)r;X3EjT#84D9:jU +^An5ND:nmbs0?Y-s82i$Ep3N#rr2los-nH2s8UD\V>pJlrr*,us3PYVs8;TjJ,~> +nc&mms/U?sG0Bp`rr3<(qu3pKnGiIerqud-rr;orZtmh`qu6QmpttE9r9F4er;HPSH[pJ*rVPdV +#5J-r!8.8HS,EHdr8C!?!!=_3rVQ6c#5J./!6Y9:o)/gjrU0_@rVHHFr>kb5Zu=t&r:>E/Z#f"( +rP<=$rV6>qE97&prRu%drVm9)s7_D5q#('\Q#k.Irs/Q'lA'Z=rVQ +nc&mks&K+*!13`^rr3<(q>P(=iW&fTrqud-rr;ipB)n7rq#1-hq;:QL9_Q#k1Hrrq_EHJADrpATR~> +nc&mks&K+*!13`^rr3<(q>P(=iW&fTrqud-rr;ipB)n7rq#1-hpttE9r9F4er;HO8!!*)GrVG^U +#5J-r!8.8HS,EHdr8C!?!!=_3rVQ6c#5J./!6Y9:o)/gjrU0_@rVHHFr>kb5Zu=t&r:>E/Z#f"( +rP<=$rV6>qE97&prRu%drVm9)s7_D5q#('\Q#k.Irs/Q'lA'Z=rVQ +nc&mms/U?sG0Bp`rr<#t#5X+>s8DrrqYpd!rVl27N;h]6"I"=gJ*u@s!`oBZQi@=W!!E<&! +nc&mks&K+*!13`^rr39&rq-^Js8;lqqYpd!r;GC_)ZJUn"<[[G!7U!.!ipG2Qi@>bEIr^jJ:i!9 +nG`QsE9HZh!rIM9eGfiaDs%*!s/^?eQN$mi`,+0-rVs3Cl2L\jm>Z:jl1auJnXF7/rVm8aH[<9n +q"OR3N,Z?!s*t~> +nc&mks&K+*!13`^rr39&rq-^Js8;lqqYpd!r;GC_)ZJUn"<[[G!7p31!`oBZQi@=W!!E<&! +nc&mms/U?sG0Bp`rr36%s7:TFrr)ikrs\o*s-80(oC;Pl_CtjRVI=jlb=t/a)3Wg#k?UkG;h:kN(dDEGr#BiodRW +`96.CU1hs;jlYdbQ=bAjI=?N\TA&GikN(m>EGTuNI=?-OR-*Jlp#gi~> +nc&mks&K+*!13`^rr36$s6'H!rqucjrs\o*s!S$.kN:pkp@.Y:o*P!Znf@c3!6=^#kOSoIo;6]i +oC8@B%e9,OLjjl(J:N-#HJ.lZp%&CWo<*,goC;DC#P.KQJ +nc&mks&K+*!13`^rr36$s6'H!rqucjrs\o*s!S$.kN:sjk2kahk6^;6jr=@%!57RVkN<'/k=krq +kN&/r"m"gh('=U9!!EB)Zf^?Ak6Br/>l_CtjRVI=jlb=t/a)3Wg#k?UkG;h:kN(dDEGr#BiodRW +`96.CU1hs;jlYdbQ=bAjI=?N\TA&GikN(m>EGTuNI=?-OR-*Jlp#gi~> +nc&mms/U?sG0Bp`rr33"rkiO,s8;Wk#lXc$P^7\$JQ%+"JH2hQJ,~> +nc&mks&K+*!13`^rr32ureUWes8)Ki"TA>t.KTGI!`snsk^!>VH?g&#!!6\\Gia5QIXld4H38A= +JUdQI!.46^!e#TGm +nc&mks&K+*!13`^rr32ureUWes8)Ki"TA>t.KP)#JH2\MJ,~> +nc&mms/U?sG0Bp`rr36%s6=jFrr)ikrsJc(s-A&*T;7E86fUK9,p4?R4QSm65sc=e3'op"630Ia +qZ$a"!&-`*og/jK65fh]6:(*-"?lep6:'0hs$Q]Ns$Q]N!(6]Os$QZM!($HK!'pEJ!($EJ!($0B +J,~> +nc&mks&K+*!13`^rr36$s4%+&rVQThrri?"s""3M63KYGNhi<2Ta@BcTG.A,!/./>kFi*QTo+8g +TqIpLs.BFeLOT2P"b2&NR%^2GTa%0`NI71gT^nc]TV8!.L7t95]qPJ!qk=.cT:l+U!hc6\rLsCf +U7e1NTn!~> +nc&mks&K+*!13`^rr36$s4%+&rVQThrri?"s""3,63%;j!!5&F60CQ=5sc=e3'op"630IaqZ$a" +!&-`*og/jK65fh]6:(*-"?lep6:'0hs$Q]Ns$Q]N!(6]Os$QZM!($HK!'pEJ!($EJ!($0BJ,~> +nc&mms/U?sG0Bp`rr36&s8.A6s8DrmrrrE#rUkr#h>[VFK8>0Qj8T0a!9TXJ!]C#]rW!$&!%7d9 +rrR$;f^8\>!&Ti +nc&mks&K+*!13`^rr36%s7ZOFs8;llrrrE"rTk@1h>[U#!!3/Pj8T1^FRkdu$(H0kJ:E*$H'/*r +rrTWJlL"TPJ=;W#J,~> +nc&mks&K+*!13`^rr36%s7ZOFs8;llrrrE"rTk@1h>[U$!!3/Vj8T0a!9TXJ!]C#]rW!$&!%7d9 +rrR$;f^8\>!&Ti +nc&mms/U?sG0Bp`rr39'r;EXJo)8Odq>U`us1rK`r;-BijSK8[qtc>!IsU5Rq<.VZpA7bgfDG?4 +qZ?QiT)J`i"9\],`rGl,qZcckAH9jLq"":eq>9R[1&LbBPl#t~> +nc&mks&K+*!13`^rr39'qYXA1k5>/Vq>UZrs+15rqY1!d!;u!X$2jc"*rlj8JlGr +nc&mks&K+*!13`^rr39'qYXA1k5>/Vq>UZrs+15rqY0"H$2XPq*rl +nc&mms/U?sG0Bp`rVm0$s4D,@s82iqqu7'&r:G_qoD\^grr;usrVlf_rsA])rfDMYI-CV/kPkb_ +s&B'Qs88Ad%0$2'^*Wj\!#fkWr;Q?g#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^rVm0#s0;X2s7lWnrVm?+s8DfZ'as4(r;Zcrrr2lqrp9Xkrr;s?!!3/Js8;'[ +#5nM$FmT/,S,WorrVkW5Iroph\GuO,o`#-ns0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^rVm0#s0;X2s7lWnrVm?+s8DfZ'as4(r;Zcrrr2lqrp9Xkrr;s?!!3/Js8;'[ +#5\@"!8@JNS,Worr;F>V!<<*t9o`#-ls(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`rr<#ts8<5"K'NC5rVlfrrr*9%s2/Wcs8;ors8Dlq"9&9"rpKdmrr;tZI"?\/ +s8D-\#5\@"!8@JNSGrTgr;R&BVQ'7gqu6Wpp&>6ms(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^rr<#t#Q+Ep(tAT]qu$F$rV6DI!.+\As8N&sr;Qlts8W)drsA])rZD1B!7CiE +kPkbas/L5.s8AJf!<2or#ia1[q>^Ems8M]k#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^rr<#t#Q+Ep(tAT]qu$F$rV6DI!.+\As8N&sr;Qlts8W)drsA])rZD1B!7CiE +kPkb_s&B'Qs88De!<2or#f`a@p&Fpgs8M]k#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`r;R0(rVhb*lMpn`r;?Qnrt2qiK_#-@s8W)uqqBiXnGiLemJdLls8J+-JUH\] +rTF1bqYsOqgAh)?s8MutrVZZtrVuoso`#-ls(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^r;R0'r;@fNf)PdLqYL3jrt0SZ&*m/R$Rs8;lprr`9#s8MZj#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^r;R0'r;@fNf)PdLqYL3jrt0SZ&*Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`rVm0&s8DrVI!N0RrVmW/mB:DrjSo,Xrr)iQNGi]OJA_?arpKdmrr;tZI"?\/ +s8D-\#5\@"!8@JNR/d3c!rVrmrVlEg#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^rVm0&s82f4"p&YLrVmW-g1:7JaSu,;rr)iQNGi]OJA_?arpKdmrr;s?!!3/J +s8;'[#5nM$FmT/,R/d3c!r`&qrr2Kg#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^rVm0&s82f4"p&YLrVmW-g1:7JaSu,;rr)iQNGi]OJA_?arpKdmrr;s?!!3/J +s8;'[#5\@"!8@JNR/d3c!rVrmrVlEg#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`r;RH0s8DuWST8V;_o&(!J8hXjs8DusrX/LYFg/WnKll;QrU0[lrr;tZI"?\/ +s8D-\#5\@"!8@JNJc>rNs(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^r;RH0s8;o870!rPs0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^r;RH0s8;o870!rNs(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`q>V6/s8UodJS]+ROH%rnrVccqs8DuoKp2N9"M&O0s8DBc$3'u(OF2V,kl:VE +rs&?"<<1bQr.4kPqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mks&K+*!13`^qu7N4s8;os^3g4e!!OJh[f?7&s8N&ss8%G5rr3,3ESpfpmf*Ums8F,@!W^XJ +r9+(ar;Wd>m/R$8rs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^qu7N4s8;os^3g4e!!OJh[f?7&s8N&ss8%G5rr3,3ESpfpmf*Ums8F,@!W^XJ +r9+(aqYsOqgAh)%rs&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`qu?]q#ljl&s8V]Af(&b>s8E<(rr<#srqh)(rr3,5B& +nc&mks&K+*!13`^qu?]q#lji$s8V;gZK2#bs8E<(rr<#srqh)(rr3,5B&m/R$8rs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^qu?]q#lji$s8V;gZK2#bs8E<(rr<#srqh)(rr3,5B& +nc&mms/U?sG0Bp`q>^Hns8Dors8E#srr2os%0$5'`KcscSs-APrr2?c$3'u(OF2V,kl:VErs&?" +<<1bQr.4kPqYt1.bl@V3rs/N&nGk?Er;Mr\J,~> +nc&mks&K+*!13`^q>^Hn!W;inrrW0!r;Q]prs\o*r5FqkT:V7Mp\t0[rsA])rZD1B!7CiEkPkba +s/L5.s8@NK#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^q>^Hn!W;inrrW0!r;Q]prs\o*r5FqkT:V7Mp\t0[rsA])rZD1B!7CiEkPkb_ +s&B'Qs87HJ#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`q>^Hns8Dlq!W;oqrr)j(rr)l+D/j6as8W)crsA])rfDMYI-CV/kPkb_s&B'Q +s87HJ#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^q>^Hn!W2inrrMuorr2lr$NC#([r$+uU]:AnmJdLls8F,@!W^XJr9+(ar;Wd> +m/R$8rs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^q>^Hn!W2inrrMuorr2lr$NC#([r$+uU]:AnmJdLls8F,@!W^XJr9+(aqYsOq +gAh)%rs&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`qu?]q!WW,tru'h*h"(7?s8Drsrr<#trVra3[)0S/N:QuHmf*Ums8J+-JUH\] +rTF1bqYsOqgAh)%rs&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^qu?]q!WW)sru&n.\`r_cs8;iqrr<#trVra3[)0S/N:QuHmf*Ums8F,@!W^XJ +r9+(ar;Wd>m/R$8rs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^qu?]q!WW)sru&n.\`r_cs8;iqrr<#trVra3[)0S/N:QuHmf*Ums8F,@!W^XJ +r9+(aqYsOqgAh)%rs&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`q>V6/s7s^+F_l2FLTKV;s8Duss8;oQE4GoI"P[k)s8; +nc&mks&K+*!13`^q>UTps72@Ar;[9;>K[!Gr;Zcrr;YSl\GlL2gMaV%r9jRkrr;s?!!3/Js8;'[ +#5nM$FmT/,Jc>rPs0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^q>UTps72@Ar;[9;>K[!Gr;Zcrr;YSl\GlL2gMaV%r9jRkrr;s?!!3/Js8;'[ +#5\@"!8@JNJc>rNs(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`r;Zfr+8l/cLMhsTgY0$%M0,]js8Dutqu4ZPeGT.?oQd/0rU0[lrr;tZI"?\/ +s8D-\#5\@"!8@JNJc>rNs(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^r;Zfr+8c)0)?:ah\$]p2'`_;'s8Dutqu4ZPeGT.?oQd/0rU0[lrr;s?!!3/J +s8;'[#5nM$FmT/,Jc>rPs0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^r;Zfr+8c)0)?:ah\$]p2'`_;'s8Dutqu4ZPeGT.?oQd/0rU0[lrr;s?!!3/J +s8;'[#5\@"!8@JNJc>rNs(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`rVm0&s8;oFEf83>r;RK.`c$RZrr)lorlAm&s8DuhGbP-8mf*Ums8J+-JUH\] +rTF1bqYsOqgAh)%rs&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^rVm0&s82hi!$\$1r;RK+OT65nrql`mrlAm&s8DuhGbP-8mf*Ums8F,@!W^XJ +r9+(ar;Wd>m/R$8rs&E$ZZ5+,rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^rVm0&s82hi!$\$1r;RK+OT65nrql`mrlAm&s8DuhGbP-8mf*Ums8F,@!W^XJ +r9+(aqYsOqgAh)%rs&?"B)p0Ur:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`r;R$#rq(i$q#C?kr=o82e:i26rr)cphK>"Iq":b-]`7otrsA])rfDMYI-CV/ +kPkb_s&B'Qs87HJ#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^r;Zfq+6jXenGiLcqtprPs0H_,s8DNg#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^r;Zfq+6jXenGiLcqtprNs(;>Us8;Hf#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`rr<#t#6"@`FP$Qhrr*`6rr;uos3GPes8;lps/^$bJq7g!o`"gWrsA])rfDMY +I-CV/kPkb_s&B'Qs87HJ#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^rr<#t#5n*F!3cFsrr*`6rr;uls.03us8)`ns/^$bJq7g!o`"gWrsA])rZD1B +!7CiEkPkbas/L5.s8@NK#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^rr<#t#5n*F!3cFsrr*`6rr;uls.03us8)`ns/^$bJq7g!o`"gWrsA])rZD1B +!7CiEkPkb_s&B'Qs87HJ#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`rVm0$s3>H(s8;orr;Zfr&cDHcHL1\1rr)f:Q'[Z@nGiLTrsA])rfDMYI-CV/ +kPkb_s&B'Qs87HJ#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mks&K+*!13`^rVm0"s.04Ts7u]orVulr&c)#C!SRMNrr)f:Q'[Z@nGiLTrsA])rZD1B!7CiE +kPkbas/L5.s8@NK#5nM-ETR6!o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^rVm0"s.04Ts7u]orVulr&c)#C!SRMNrr)f:Q'[Z@nGiLTrsA])rZD1B!7CiE +kPkb_s&B'Qs87HJ#5\@4!6kK@o)Asns7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`rr39'r;<7Fqu-Kmq>V$(s35D`qtg6gqZ$Qprr;rmm.q%aqY?+rIX0uMpuhJX +p%hSef)#,lq?HWhAH9pRr:9jmrVuBf1B7:OPlH7~> +nc&mks&K+*!13`^rr39'qtWZ%p\Xpgq>UZqs-`pop\+U_qu6Znm/.1er;.Q9!@47 +lMUL0r!)upZ>nt*rUTsnrr;bDRK*9cPlH7~> +nc&mks&K+*!13`^rr39'qtWZ%p\Xpgq>UZqs-`pop\+U_#64]&rr;rmm.q%aqY;35! +nc&mms/U?sG0Bp`rr36&s87>7s8DrmrrrE#rVDM+h>[VIKo:Z]j8T0b!:,49rVm" +nc&mks&K+*!13`^rr36%s7cRNs8;llrrrE#rUq9:h>[U$!!3/Rj8T1_FS(.arVm#/E97,uo)Aso +s7h,4s8N"^s*t~> +nc&mks&K+*!13`^rr36%s7cRNs8;llrrrE#rUq9:h>[U%!!3/Zj8T0b!:,49rVm" +nc&mms/U?sG0Bp`rr36%rnhkArr)ikrsA]'s-/#N`5]NOjbjG&Mi(7s7RMW_MW]m%Ll3kcGDh +nc&mks&K+*!13`^rr36#rkJQ%rql]irs\o*s!\,-Mi*FR^W+4U`H#/eENFlWN"o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^rr36#rkJQ%rql]irs/Q%s!\,-Mi-PQ$&XXu&HDh3Ef5e;M["uq/c^*RM1LQh +Ll4=paT)/.rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`rr33#rlK$2rquNj#lXc%P^..\F?Y6U[/^9Srqu?e#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^rr33!rfdGlrqcBh"9&5t/,K;J6Zd),C]eHhCCU7C!a0PYkA1?>CjCSMCi+`> +s(qmZGio#(o)Asos7h,4s8N"^s*t~> +nc&mks&K+*!13`^rr33!rfdGlrqcBh"9&5t.tI])!!:LGr:9jmrVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`rr36%s7q&Crr)ikrsA]'s-8&_f%/?UjfSolY,u/4=B(lpXllhkX0+J`Q*.3> +Xp(u3X1nW4nc&jms7$(Es8;k\s*t~> +nc&mks&K+*!13`^rr36$s764lrqucks8W')rVn8GWNNA+ZIS*g$.[VW)?9d +nc&mks&K+*!13`^rr36$s764lrqucks8W'&rVn8GWNNA`XpM55XVCg:!0=:akH5#iXuZQJY,m2W +"g5&0^An0%rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`rr<#t#5X@Cs8Doqq>UTrroJEkh>[VGKSbBVj8T0a!9f"6l2M"es7$(Es8;k\ +s*t~> +nc&mks&K+*!13`^rr<#s#5&u_s82fpq>UTprlYX"h>[U$!!3/Qj8T1^FRt(`l2M"fs7h,4s8N"^ +s*t~> +nc&mks&K+*!13`^rr<#s#5&u_s82fpq>UTprlYX"h>[U%!!3/Xj8T0a!9f"6l2M"es7$(Es8;k\ +s*t~> +nc&mms/U?sG0Bp`rVm0#s1EI;s8;orr;Zfr#lO\#DV"d_rVYaR$2XPqNI$)#jSSc9qZcck;ZPDG +pjr>AqZ-Qnrpp'orVuBf1B7:OPlH7~> +nc&mks&K+*!13`^rVm0!s*4gps82iqr;R'%s8)ak!3Z7nrqkgU$2jc"*rl +nc&mks&K+*!13`^rVm0!s*4gps82iqr;R'%s8)ak!3Z7niqj&Yqt_B7! +nc&mms/U?sG0Bp`rr3?)rVl,-P4AJKs8N#t%0$;)s5eEjqu-Nns8Mrp!ri6!mJdLls8J+-JUH\] +rTF1bqYsOqgAh)%s6K[irVuBf1B7:OPlH7~> +nc&mks&K+*!13`^rr3?)r;P:J/EH[)s8N#t%0$;'s2tKrq>C6ks8Mrp!ri6!mJdLls8F,@!W^XJ +r9+(ar;Wd>m/R$8s6K[irr;bDRK*9cPlH7~> +nc&mks&K+*!13`^rr3?)r;P:J/EH[)s8N#t%0$;'s2tKrq>C6ks8Mrp!ri6!mJdLls8F,@!W^XJ +r9+(aqYsOqgAh)%s6K[irVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`r;RW4s3bhcs8Muqrr2lpr;ZPhCtAXas8W)tr;Qcqli.:js8J+-JUH\]rTF1b +qYsOqgAh)%s6K[irVuBf1B7:OPlH7~> +nc&mks&K+*!13`^r;RW2s.fWrs8W#prr2imqZ$%^!3Q:ts8W)tr;Qcqli.:js8F,@!W^XJr9+(a +r;Wd>m/R$8s6K[irr;bDRK*9cPlH7~> +nc&mks&K+*!13`^r;RW2s.fWrs8W#prr2imqZ$%^!3Q:ts8W)tr;Qcqli.:js8F,@!W^XJr9+(a +qYsOqgAh)%s6K[irVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`qu6its/p7SpA4e%nW7[dqu-Norr)lKVl$HQs8DrarsA])rfDMYI-CV/kPkb_ +s&B'Qs87HJli.4gs7$(Es8;k\s*t~> +nc&mks&K+*!13`^qu6iss',PVmeZqrj +nc&mks&K+*!13`^qu6iss',PVmeZqrj +nc&mms/U?sG0Bp`r;Zfr+8kr.CkeeHs8V61`.<-Xr;Q]qrr)l,EcH;HEm+L]rpKdmrr;tZI"?\/ +s8D-\#5\@"!8@JNJcG'9#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^r;Rr>rVH+T!#/;Os8U +nc&mks&K+*!13`^r;Rr>rVH+T!#/;Os8U +nc&mms/U?sG0Bp`qZ$Tp*W4 +nc&mks&K+*!13`^qYpj"s7rQF!!!uYrW!TaZN'n&s8Musj`uHtmHg9ln,E:RrsA])rZD1B!7CiE +kPkbas/L5.s8@NKli.4hs7h,4s8N"^s*t~> +nc&mks&K+*!13`^qYpj"s7rQF!!!uYrW!TaZN'n&s8Musj`uHtmHg9ln,E:RrsA])rZD1B!7CiE +kPkb_s&B'Qs87HJli.4gs7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`qu7N4s8N&urp$Y@Krr>1q>^Bls8N&qrl/farr3,lFf#-9mf*Ums8J+-JUH\] +rTF1bqYsOqgAh)%s6K[irVuBf1B7:OPlH7~> +nc&mks&K+*!13`^qu7N4s8N&ur7>Ek&mUm/R$8s6K[irr;bDRK*9cPlH7~> +nc&mks&K+*!13`^qu7N4s8N&ur7>Ek&mU +nc&mms/U?sG0Bp`qZ$Qo!<)oss8Dor!r`/urr3E)s3,<-r;-B\Gbb9:mf*Ums8J+-JUH\]rTF1b +qYsOqgAh)%s6K[irVuBf1B7:OPlH7~> +nc&mks&K+*!13`^qZ$Qo!;lcqs8;iq!rW)trr3E)s3,<-r;-B\Gbb9:mf*Ums8F,@!W^XJr9+(a +r;Wd>m/R$8s6K[irr;bDRK*9cPlH7~> +nc&mks&K+*!13`^qZ$Qo!;lcqs8;iq!rW)trr3E)s3,<-r;-B\Gbb9:mf*Ums8F,@!W^XJr9+(a +qYsOqgAh)%s6K[irVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`q#C?ms8;os"o\;orVlfprs\f(a(s0(r;ZJ7V#UD]rsA])rfDMYI-CV/kPkb_ +s&B'Qs87HJli.4gs7$(Es8;k\s*t~> +nc&mks&K+*!13`^q#CBn$N9kts8W#ip&+ggrVm<'rl8g's8;ojGGP9;mf*Ums8F,@!W^XJr9+(a +r;Wd>m/R$8s6K[irr;bDRK*9cPlH7~> +nc&mks&K+*!13`^q#CBn$N9kts8W#ip&+ggrVm<'rl8g's8;ojGGP9;mf*Ums8F,@!W^XJr9+(a +qYsOqgAh)%s6K[irVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`qZ$Qo"o\H#s8N#rrt>;1s8N&ur;YJmR.:.QZZ;oBrU0[lrr;tZI"?\/s8D-\ +#5\@"!8@JNJcG'9#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^qZ$Qo!;lcqs8Mus')_e/rr<#rs4VR^nbrBlEi&g7mf*Ums8F,@!W^XJr9+(a +r;Wd>m/R$8s6K[irr;bDRK*9cPlH7~> +nc&mks&K+*!13`^qZ$Qo!;lcqs8Mus')_e/rr<#rs4VR^nbrBlEi&g7mf*Ums8F,@!W^XJr9+(a +qYsOqgAh)%s6K[irVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`qu7f +nc&mks&K+*!13`^qu7fm/R$8s6K[irr;bDRK*9cPlH7~> +nc&mks&K+*!13`^qu7f +nc&mms/U?sG0Bp`qZ$Tp*W4BNF`r_&HYRDIf`1pLs8N&ts8SsRLniXMU]:;\rsA])rfDMYI-CV/ +kPkb_s&B'Qs87HJli.4gs7$(Es8;k\s*t~> +nc&mks&K+*!13`^qYpj#s8&cO!!!iQrW!T=YlF\$s8N&ts8SsRLniXMU]:;\rsA])rZD1B!7CiE +kPkbas/L5.s8@NKli.4hs7h,4s8N"^s*t~> +nc&mks&K+*!13`^qYpj#s8&cO!!!iQrW!T=YlF\$s8N&ts8SsRLniXMU]:;\rsA])rZD1B!7CiE +kPkb_s&B'Qs87HJli.4gs7$(Es8;k\s*t~> +nc&mms/U?sG0Bp`r;Zfr+8ku1D1oU^rr;$*_1I!BrVlfrrr;NIr;HNmq08S3rU0[lrr;tZI"?\/ +s8D-\#5\@"!8@JNJcG'9#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^r;Rr>rVH1Z!"jb#rr:$ +nc&mks&K+*!13`^r;Rr>rVH1Z!"jb#rr:$ +nc&mms/U?sG0Bp`qu6its0$=Qp%n[rmuM=aqu-Nms6Om%rr3,CD9r7[mf*Ums8J+-JUH\]rTF1b +qYsOqgAh)%s6K[irVuBf1B7:OPlH7~> +nc&mks&K+*!13`^qu6iss'GbUlh^Vhi$8;!q"t'hs6Om%rr3,CD9r7[mf*Ums8F,@!W^XJr9+(a +r;Wd>m/R$8s6K[irr;bDRK*9cPlH7~> +nc&mks&K+*!13`^qu6iss'GbUlh^Vhi$8;!q"t'hs6Om%rr3,CD9r7[mf*Ums8F,@!W^XJr9+(a +qYsOqgAh)%s6K[irVuBf1B7:OPlH7~> +nc&mms/U?sG0Bp`r;Rr=s3u"es8Muqrr2lpr;ZMfCtJ^brr)kcFMQ5JJYN,ArpKdmrr;tZI"?\/ +s8D-\#5\@"!8@JNJcG'9#Q=\m!&FTPrfmG5~> +nc&mks&K+*!13`^r;Rr;s/5ots8Vuorr2imqZ#tZ!3cG!rr)kcFMQ5JJYN,ArpKdmrr;s?!!3/J +s8;'[#5nM$FmT/,JcG'9#QFbuJ=6H:rfmG5~> +nc&mks&K+*!13`^r;Rr;s/5ots8Vuorr2imqZ#tZ!3cG!rr)kcFMQ5JJYN,ArpKdmrr;s?!!3/J +s8;'[#5\@"!8@JNJcG'9#Q=\m!&FTPrfmG5~> +nc&mms/U?sG0Bp`rr3?)rVl//ORW2Hs8N#t'`S.1s5\?jr;HWmrnDs?D/+Rfs8D?b$3'u(OF2V, +kl:VErs&?"<<1bQr.4n6rs/N&nGk?Er;Mr\J,~> +nc&mks&K+*!13`^rr3?)rVkIM.cU=%s8N#t'`S./s2b?rq>C6irnDs?D/+Rfs8D?b$3'u(+92HC +dJs.-rs&E$Wcd\.rIP"7rs/Q'pjee4rr//^J,~> +nc&mks&K+*!13`^rr3?)rVkIM.cU=%s8N#t'`S./s2b?rq>C6irnDs?D/+Rfs8D?b$3'u(+92HC +dJs.-rs&?"<<1bQr.4n6rs/N&nGk?Er;Mr\J,~> +nc&mms/U?sG0Bp`rVm*!s1EF9s8;`ns8ET-rhjYcs8;ors74:U`omC#m/@=irr%n)J:$JYr9+%` +q>O=ng&Cl"rp0Ogr;Q0c1B7:OPlH7~> +nc&mks&K+*!13`^rVm)ts*Fpos8)Tl')qq-r_* +nc&mks&K+*!13`^rVm)ts*Fpos8)Tl')qq-r_*O=ng&Cl"rp0Ogr;Q0c1B7:OPlH7~> +nc&mms/U?sG0Bp`rr<#t#5XCDs8Doqq>Ud"roA!7#Q4Sj!&FTPrfmG5~> +nc&mks&K+*!13`^rr<#s#5'#`s82fpq>UcurlGL!q#(*irVZZrrr;?a$2sl%*rl +nc&mks&K+*!13`^rr<#s#5'#`s82fpq>UcurlGL!q#(*irVZZqrTjFhrVla;!!*)HrqkmX#5S6t +!87AKJc>!7#Q4Sj!&FTPrfmG5~> +nc&mms/U?sG0Bp`rr36&s7q&Brr)ikrrrE#s-/*4hZ!_AIY3+9jo5J_s&K-VJcFp5"n_mQs8;k\ +s*t~> +nc&mks&K+*!13`^rr36$s764jrqucks8W'$rVn2Hr;?Qrrr;u[rrsSG!W^[Kroa:arr9!?m=G<# +rrr7LRfEBdPlH7~> +nc&mks&K+*!13`^rr36$s764jrqucks8W'$rVn2Hr8.GV+92HCeE-]5rr6"!hLY^irrr&r2#mLQ +PlH7~> +nc&mms/U?sG0Bp`rr33#rlK$1rquNj$N9u'PC/IPP]J&mjrasP+ +nc&mks&K+*!13`^rr33!rfmMlrqcBh%/p2(.0:Y8+!DnQP`Fsg$'((,&c_q4G*J!JNrk#aNId/Q +Ns'Wjs8Mt]s*t~> +nc&mks&K+*!13`^rr33!rfmMlrqcBh#Q=Z#.0:Y8+6+IG+!;X.rW!!<+4~> +nc&mms/U?sG0Bp`rr36$rn_eArr)ikrsJc(s-7qeKoBUV&E=6##lY&/%H@p""98j]%d+<*&f>ln +qu2i[J,~> +nc&mks&K+*!13`^rr36#rk/?$rql]irs\o*s""0^%Ls$`C5dl1LC&]jL(F=c!,mgMjbEnhItiN0 +kD'4tKY.9_rfmG5~> +nc&mks&K+*!13`^rr36#rk/?$rql]irrrE#s""0^h@9MdrVup,isl+n!"=Dgk7.Y.(jQ)XrfmG5~> +nc&mms/U?sG0Bp`rr36&s87>8s8DrmrsJc(rVMS+q#1*ir8me^qYU,KH@L8%qt]FP#57pm!7q&B +Jc"[."8VusrfdA4~> +nc&mks&K+*!13`^rr36%s7lXPs8;llrs\o*rV%B;oDAC]r;Z]Xr<`E#r#Yn>!71W?kPYV]rMar) +rVM0EkktV\s8W(^s*t~> +nc&mks&K+*!13`^rr36%s7lXPs8;llrs8W&rV%B;oDACEq[*,rqB#\ +kkbJXs8W(^s*t~> +nc&mms/U?sG0Bp`rr39'r;3.Equ-Kmq>UZss3>Marr(aS#*F:aI-L\1kPkb`s&B'Rs8@NKkPkY_ +s8W(_s*t~> +nc&mks&K+*!13`^rr39'qtNN"q"t$hq>UZqs.'-prr(jV$3'u(+92HCdJs.-rs&E$Wc[V-rIP"3 +rr`9#s8J8_J,~> +nc&mks&K+*!13`^rr39'qtNN"q"t$hq>UZqs.'-prr(aS"s +nc&mms/U?sG0Bp`rVm0$s35B(s8;orrVulr#5n:YH0bM/ir08_rr%n)J:$JYr9+%`q>O=ng&Cl" +roX1\s8J5^J,~> +nc&mks&K+*!13`^rVm0"s.'.Vs7u]orVulr#5Rm:!8.;Jir08_rr!o=! +nc&mks&K+*!13`^rVm0"s.'.Vs7u]orVulr#5Rm:!8.;Jir08_rr!o=!O=ng&Cl" +roX1\s8J5^J,~> +nc&mms/U?sG0Bp`rr<#t#6"@^FP6]jrr*?+rr;uos3PVes8;orj8TGbs8J+-JUH\]rTF1bqYsOq +gAh)%s+14Ds*t~> +nc&mks&K+*!13`^rr<#t#Q40C!3uRurVc^&s8McmTE& +nc&mks&K+*!13`^rr<#t#Q40C!3uRurVc^&s8McmTE& +nc&mms/U?sG0Bp`r;R$#rpt`$q>^Kmr +nc&mks&K+*!13`^r;R$#rob(Co)Jahq[*2trr8u:!7q/IiVs5`s8F,@!W^XJr9+(ar;Wd>m/R$8 +s+14Ds*t~> +nc&mks&K+*!13`^r;R$#rob(Co)Jahq[*2trr8u:!7q/IiVs5`s8F,@!W^XJr9+(aqYsOqgAh)% +s+14Ds*t~> +nc&mms/U?sG0Bp`rVm0&s8;oDEK/?5r;Qutb&`3^rr(dT$3'u(OF2V,kl:VErs&?"<<1bQr.4m! +s7ZJC~> +nc&mks&K+*!13`^rVm0&s82hf!%+Gsr;QupQN.bnrqkXR$3'u(+92HCdJs.-rs&E$Wcd\.rIP!" +s7ZJC~> +nc&mks&K+*!13`^rVm0&s82hf!%+Gsr;QupQN.bnrqkXR$3'u(+92HCdJs.-rs&?"<<1bQr.4m! +s7ZJC~> +nc&mms/U?sG0Bp`r;Zfr&H)RRKl;7Eh;5W3Q#)c[s8CjT$3'u(OF2V,kl:VErs&?"<<1bQr.4m! +s7ZJC~> +nc&mks&K+*!13`^r;Zfr&GuKs(B=GN]Y&2N.f_Bms8CjT$3'u(+92HCdJs.-rs&E$Wcd\.rIP!" +s7ZJC~> +nc&mks&K+*!13`^r;Zfr&GuKs(B=GN]Y&2N.f_Bms8CjT$3'u(+92HCdJs.-rs&?"<<1bQr.4m! +s7ZJC~> +nc&mms/U?sG0Bp`q>Us's7aI(FDbr +nc&mks&K+*!13`^q>UTps6u%=qZ$_To)JUDrsA])rZD1B!7CiEkPkbas/L5.s8@NKJcGHDJ,~> +nc&mks&K+*!13`^q>UTps6u%=qZ$_To)JUDrsA])rZD1B!7CiEkPkb_s&B'Qs87HJJcGHDJ,~> +nc&mms/U?sG0Bp`qu?]q!WW,trsIYp\_coIs8W)urnm_^rr;tZI"?\/s8D-\#5\@"!8@JNJcC<$ +pA]X~> +nc&mks&K+*!13`^qu?]q!WW)srsHViHG/J$s8W&trnm_^rr;s?!!3/Js8;'[#5nM$FmT/,JcC<$ +pA]X~> +nc&mks&K+*!13`^qu?]q!WW)srsHViHG/J$s8W&trnm_^rr;s?!!3/Js8;'[#5\@"!8@JNJcC<$ +pA]X~> +nc&mms/U?sG0Bp`q>^Hn!WE#prr`6!s8LmT$3'u(OF2V,kl:VErs&?"<<1bQr.4m!s7ZJC~> +nc&mks&K+*!13`^q>^Ko!r`#pqu6crrVulRrsA])rZD1B!7CiEkPkbas/L5.s8@NKJcGHDJ,~> +nc&mks&K+*!13`^q>^Ko!r`#pqu6crrVulRrsA])rZD1B!7CiEkPkb_s&B'Qs87HJJcGHDJ,~> +nc&mms/U?sG0Bp`p](6l"9&/qrVlfNrsA])rfDMYI-CV/kPkb_s&B'Qs87HJJcGHDJ,~> +nc&mks&K+*!13`^p](6l#lOPqr;HTns8LjS$3'u(+92HCdJs.-rs&E$Wcd\.rIP!"s7ZJC~> +nc&mks&K+*!13`^p](6l#lOPqr;HTns8LjS$3'u(+92HCdJs.-rs&?"<<1bQr.4m!s7ZJC~> +nc&mms/U?sG0Bp`a8ZJFs8J+-JUH\]rTF1bqYsOqgAh)%s+14Ds*t~> +nc&mks&K+*!13`^a8ZJFs8F,@!W^XJr9+(ar;Wd>m/R$8s+14Ds*t~> +nc&mks&K+*!13`^a8ZJFs8F,@!W^XJr9+(aqYsOqgAh)%s+14Ds*t~> +nc&mms/U?sG0Bp`a8ZJFs8J+-JUH\]rTF1bqYsOqgAh)%s+14Ds*t~> +nc&mks&K+*!13`^a8ZJFs8F,@!W^XJr9+(ar;Wd>m/R$8s+14Ds*t~> +nc&mks&K+*!13`^a8ZJFs8F,@!W^XJr9+(aqYsOqgAh)%s+14Ds*t~> +nc&mms/U?sG0Bp`a8ZJFs8J+-JUH\]rTF1bqYsOqgAh)%s+14Ds*t~> +nc&mks&K+*!13`^a8ZJFs8F,@!W^XJr9+(ar;Wd>m/R$8s+14Ds*t~> +nc&mks&K+*!13`^a8ZJFs8F,@!W^XJr9+(aqYsOqgAh)%s+14Ds*t~> +nc&mms/U?sG0Bp`a8ZJFs8J+-JUH\]rTF1bqYsOqgAh)%s+14Ds*t~> +nc&mks&K+*!13`^a8ZJFs8F,@!W^XJr9+(ar;Wd>m/R$8s+14Ds*t~> +nc&mks&K+*!13`^a8ZJFs8F,@!W^XJr9+(aqYsOqgAh)%s+14Ds*t~> +nc&mms/U?sG0Bp`a8ZJFs8J+-JUH\]rTF1bqYsOqgAh)%s+14Ds*t~> +nc&mks&K+*!13`^a8ZJFs8F,@!W^XJr9+(ar;Wd>m/R$8s+14Ds*t~> +nc&mks&K+*!13`^a8ZJFs8F,@!W^XJr9+(aqYsOqgAh)%s+14Ds*t~> +nc&mms/U?sG0Bp`a8ZJFs8J+-JUH\]rTF1bqYsOqgAh)%s+14Ds*t~> +nc&mks&K+*!13`^a8ZJFs8F,@!W^XJr9+(ar;Wd>m/R$8s+14Ds*t~> +nc&mks&K+*!13`^a8ZJFs8F,@!W^XJr9+(aqYsOqgAh)%s+14Ds*t~> +nc&mms/U?rG00[Xa8?8@r;2P&J:-S\rTF1bqYsOqgAh)%s+14Ds*t~> +nc&mks&K+)!0m?Qa8-,m/R$8s+14Ds*t~> +nc&mks&K+)!0m?Qa8-, +nc&gks/U?sFjS#*#*F7`I-CV/kPkb_s&B'Qs87HJJcGHDJ,~> +nc&gis&K+*!2@@1"sO$K!7CiEkPkb`s/C)+s8@NKJcGHDJ,~> +nc&gis&K+*!2@@1"sO$K!7CiEkPkb_s&B'Qs87HJJcGHDJ,~> +nc&mms/U?qI%7CC`30B"IXlh0s8D-\#5\@"!8@JNJcC<$pA]X~> +nc&mks&K+&!'+Fna']3\?sa +nc&mks&K+&!'+Fna']3\?sa +nc&mms/^EpJ9lB_`-)?6J:Dt1rr)$[#5\@"!SRMNJcC<$pA]X~> +nc&agr`B.%]`8-8dJj(,rs&B#U0[6frIP!"s7ZJC~> +nc&agr`B.%]`8-8dJj(,rs&?"<<1bQr.4m!s7ZJC~> +nc&gjs/(!mJqLpns+1B+Gio&(kPkb^s&&jNs87HJJcGHDJ,~> +nc&ghs%EJ!":)dL"pG,5!6tQ@kPkb_s',Q^s87HJJcGHDJ,~> +nc&ghs%EJ!":)dL"pG,5!6tQ@kPkb_s&B'Qs87HJJcGHDJ,~> +nc&^hrl/umFTlr.Nq3/IkPkb`s,]G4s87HJJcGHDJ,~> +nc&[frf+Mi"!Qe(rTF1bq>X@nf`1i"s+14Ds*t~> +nc&[frf+Mi"!Qe(rTF1bqYsOqgAh)%s+14Ds*t~> +nc/Xg!rp]d^;^8kn,N@Krs&E$Y'o[:rIP!"s7ZJC~> +nG`Xis.t[7^l/DVN8Xa6k5PY^s&B'Qs87HJJcGHDJ,~> +nG`Xis.t[7^l/DVN8Xa6k5PY^s&B'Qs87HJJcGHDJ,~> +n,ECe])Mj2s8M3]#5eG"F6rr*JcC<$pA]X~> +n,ECd])Mj2s8M3]#5\@"!8@JNJcC<$pA]X~> +n,ECd])Mj2s8M3]#5\@"!8@JNJcC<$pA]X~> +nGiOf!<'S.!ri6!k5PY`s/L5.s8@NKJcGHDJ,~> +nc/Uf!;jG*!r`/uk5PY^s&B'Qs87HJJcGHDJ,~> +nc/Uf!;jG*!r`/uk5PY^s&B'Qs87HJJcGHDJ,~> +MZ3nYs/L5.s8@NKJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nYs/L5.s8@NKJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nYs/L5.s8@NKJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nYs/L5.s8@NKJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nYs/L5.s8@NKJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nYs/L5.s8@NKJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nYs/L5.s8@NKJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nYs/L5.s8@NKJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nYs/L5.s8@NKJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nYs/L5.s8@NKJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nYs/L5.s8@NKJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nYs/L5.s8@NKJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nYs/L5.s8@NKJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nYs/L5.s8@NKJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +MZ3nWs&B'Qs87HJJcGHDJ,~> +RK)jW#5eD!FmK&)oDX=@K`?Q~> +S,WNgs76*mq#+.lf_t[ +S,WNgs76*mq#+.lf_t[ +Rf +SGrZis8DHe!`oB\nc&[hs8ITLL];l~> +SGrZis8DHe!`oB\nc&[hs8ITLL];l~> +SH&Wg!rqlYo^2qLm\G$^md0W7"RP^Zrr.KKL];l~> +S,WWjs5r+mp"Tc(gdqLYgtMJW"Pqkps8ITLLAuc~> +S,WWjs5r+mp"Tc(gdqLYgtMJW"Pqkps8ITLLAuc~> +SGrckro\oaK(=HmK(FNsJq/I7rr%EJL];l~> +SGrcjrm)2\"S)Wp"S2^!"9f@Zrqq?IL];l~> +SGrcjrm)2\"S)Wp"S2^!"9f@Zrqq?IL];l~> +SGr`is4;+3iH>?JCt/L_JcCN*J,~> +SGrZes01;Z!ic4rJcCN*J,~> +SGrZes01;Z!ic4rJcCN*J,~> +SH&Wg!r9I3iN`Tj](u@)JcCN*J,~> +SGrckrq(MJB(BL5AFj@9An?2Xrr%EJL];l~> +SGrckrq(MJB(BL5AFj@9An?2Xrr%EJL];l~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +SGrZis8LjP!ri6!JcCN*J,~> +SH&Tfh>.3Ps8ITLL];l~> +SH&Tfh>.3Ps8ITLL];l~> +S,`Hdr;?Hk"onQ!rr;usrs/Q'rqucqs8Mro!<)or!WW.Ms,$c+~> +S,`Hdr;?Hk"onQ!rr;usrs/Q'rqucqs8Mro!<)or!WW.Ms,$c+~> +S,`Hdr;?Hk"onQ!rr;usrs/Q'rqucqs8Mro!<)or!WW.Ms,$c+~> +SGr]js8N#os8W)prrW3"rpTjfrr)iqJcCZ.J,~> +SGr]js8N#os8W)prrW3"rpTjfrr)iqJcCZ.J,~> +SGr]js8N#os8W)prrW3"rpTjfrr)iqJcCZ.J,~> +Sc9/us8Musp +Sc9/us8Musp +Sc9/us8Musp +SGt2?rVs3RDJX-)Dh5M"rr)fqOD(Kgr;Q`rqu=WCcN!q;HZ +SGt2?rVs3RDJX-)Dh5M"rr)fqOD(Kgr;Q`rqu=WCcN!q;HZ +SGt2?rVs3RDJX-)Dh5M"rr)fqOD(Kgr;Q`rqu=WCcN!q;HZ +Sc8omrq2t&LsH"H-Hh$\W:p5hs-\:Uc2[_@rquf=DUSRbp4JLTcI&_SQ?I5Os8;lqJcC`0J,~> +Sc8omrq2t&LsH"H-Hh$\W:p5hs-\:Uc2[_@rquf=DUSRbp4JLTcI&_SQ?I5Os8;lqJcC`0J,~> +Sc8omrq2t&LsH"H-Hh$\W:p5hs-\:Uc2[_@rquf=DUSRbp4JLTcI&_SQ?I5Os8;lqJcC`0J,~> +TE"rj"oSA)Cp3:)rtt(!Drq#ss-8(lId[46s8;o>Csr@`pO8S.rrq;@G1uupJcC]/J,~> +TE"rj"oSA)Cp3:)rtt(!Drq#ss-8(lId[46s8;o>Csr@`pO8S.rrq;@G1uupJcC]/J,~> +TE"rj"oSA)Cp3:)rtt(!Drq#ss-8(lId[46s8;o>Csr@`pO8S.rrq;@G1uupJcC]/J,~> +T)UPDs4q[ds8W#qr;HNmnTCB"r;Vt;icCjlrVl]ob&#N+s7Ur0r;- +T)UPDs4q[ds8W#qr;HNmnTCB"r;Vt;icCjlrVl]ob&#N+s7Ur0r;- +T)UPDs4q[ds8W#qr;HNmnTCB"r;Vt;icCjlrVl]ob&#N+s7Ur0r;- +TDp;fDb[Irr;usrVsm[rVcb]Jc +TDp;fDb[Irr;usrVsm[rVcb]Jc +TDp;fDb[Irr;usrVsm[rVcb]Jc +TE"rj#Pa+1nc&Lds8;iqs8W'?s-804q1j=frVQW;Csr@`pOAV2rVlisrr)i_FKtiCJcC`0J,~> +TE"rj#Pa+1nc&Lds8;iqs8W'?s-804q1j=frVQW;Csr@`pOAV2rVlisrr)i_FKtiCJcC`0J,~> +TE"rj#Pa+1nc&Lds8;iqs8W'?s-804q1j=frVQW;Csr@`pOAV2rVlisrr)i_FKtiCJcC`0J,~> +TDo/ps7h,3s8Drlrtk\5s-/02s3GeZs82i=Csr@`pOAV2rVlfr#5nMaEioB=JcC`0J,~> +TDo/ps7h,3s8Drlrtk\5s-/02s3GeZs82i=Csr@`pOAV2rVlfr#5nMaEioB=JcC`0J,~> +TDo/ps7h,3s8Drlrtk\5s-/02s3GeZs82i=Csr@`pOAV2rVlfr#5nMaEioB=JcC`0J,~> +TE"rj$2K1 +TE"rj$2K1 +TE"rj$2K1 +TE"rj-M`7Zs8Drps-e"VH[Bsdp&G&WKDPTGp47bdrlAp(s8VhCRK*6brr33$s6+L+s87HJNW4M~> +TE"rj-M`7Zs8Drps-e"VH[Bsdp&G&WKDPTGp47bdrlAp(s8VhCRK*6brr33$s6+L+s87HJNW4M~> +TE"rj-M`7Zs8Drps-e"VH[Bsdp&G&WKDPTGp47bdrlAp(s8VhCRK*6brr33$s6+L+s87HJNW4M~> +TDp> +TDp> +TDp> +TE"rj#Pj@%jSo)Wrqud6R=G#3s-865s8DorVf(bHC"!%]pOAV2rVlfr#5nJ]E4,`DJcC`0J,~> +TE"rj#Pj@%jSo)Wrqud6R=G#3s-865s8DorVf(bHC"!%]pOAV2rVlfr#5nJ]E4,`DJcC`0J,~> +TE"rj#Pj@%jSo)Wrqud6R=G#3s-865s8DorVf(bHC"!%]pOAV2rVlfr#5nJ]E4,`DJcC`0J,~> +T)U29s2Ju[s8Doqrr)cls-eK5rr879qZ$QnrptT)`,3p%s7Ur0r;- +T)U29s2Ju[s8Doqrr)cls-eK5rr879qZ$QnrptT)`,3p%s7Ur0r;- +T)U29s2Ju[s8Doqrr)cls-eK5rr879qZ$QnrptT)`,3p%s7Ur0r;- +T)\ii"8@jrXnr&6p5jass8S@:qZ$Nor;Y5eO*&bKs7^u3qYp]0DP@+.JcC]/J,~> +T)\ii"8@jrXnr&6p5jass8S@:qZ$Nor;Y5eO*&bKs7^u3qYp]0DP@+.JcC]/J,~> +T)\ii"8@jrXnr&6p5jass8S@:qZ$Nor;Y5eO*&bKs7^u3qYp]0DP@+.JcC]/J,~> +Sc9H&s5A?IWTX-SqtA!fDO^J#s-AB8s8N#tr!B?GHI2]lp4JIOrlkDe#+BL`i;W]SJcC`0J,~> +Sc9H&s5A?IWTX-SqtA!fDO^J#s-AB8s8N#tr!B?GHI2]lp4JIOrlkDe#+BL`i;W]SJcC`0J,~> +Sc9H&s5A?IWTX-SqtA!fDO^J#s-AB8s8N#tr!B?GHI2]lp4JIOrlkDe#+BL`i;W]SJcC`0J,~> +T)\iis8=)%Me[ZoKS>(sFgUi@r;V_$q>^Ems8DudLM>$5s7LbZr+lURG,+-urVleIs,I&/~> +T)\iis8=)%Me[ZoKS>(sFgUi@r;V_$q>^Ems8DudLM>$5s7LbZr+lURG,+-urVleIs,I&/~> +T)\iis8=)%Me[ZoKS>(sFgUi@r;V_$q>^Ems8DudLM>$5s7LbZr+lURG,+-urVleIs,I&/~> +S,XZ1s6RalOckog[FkNZrr2rJcMdeBs8N&ss6@Pis8VuAbl#cibM`F#rIP!+s*t~> +S,XZ1s6RalOckog[FkNZrr2rJcMdeBs8N&ss6@Pis8VuAbl#cibM`F#rIP!+s*t~> +S,XZ1s6RalOckog[FkNZrr2rJcMdeBs8N&ss6@Pis8VuAbl#cibM`F#rIP!+s*t~> +ScA`h!WW,nrrN)tp\t +ScA`h!WW,nrrN)tp\t +ScA`h!WW,nrrN)tp\t +S,WTis8Mrorr;rqrWW?#r;Q`qrr36&s8Dlps8W)oquZirrdk*+s*t~> +S,WTis8Mrorr;rqrWW?#r;Q`qrr36&s8Dlps8W)oquZirrdk*+s*t~> +S,WTis8Mrorr;rqrWW?#r;Q`qrr36&s8Dlps8W)oquZirrdk*+s*t~> +R/d$^JcC<$kl6/~> +R/d$^JcC<$kl6/~> +R/d$^JcC<$kl6/~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +JcC<$JcGNFJ,~> +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/tools/efsl-0.3.6/docs/schematics/objectmodel.dia b/tools/efsl-0.3.6/docs/schematics/objectmodel.dia new file mode 100644 index 0000000..2af6d52 Binary files /dev/null and b/tools/efsl-0.3.6/docs/schematics/objectmodel.dia differ diff --git a/tools/efsl-0.3.6/docs/schematics/objectmodel.eps b/tools/efsl-0.3.6/docs/schematics/objectmodel.eps new file mode 100644 index 0000000..ce958ea --- /dev/null +++ b/tools/efsl-0.3.6/docs/schematics/objectmodel.eps @@ -0,0 +1,1158 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/len/DSR-X20/len/efsl/docs/schematics/objectmodel.dia +%%Creator: Dia v0.94 +%%CreationDate: Mon May 2 13:13:48 2005 +%%For: len +%%Orientation: Portrait +%%Magnification: 1.0000 +%%BoundingBox: 0 0 983 52 +%%BeginSetup +%%EndSetup +%%EndComments +%%BeginProlog +[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright +/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one +/two /three /four /five /six /seven /eight /nine /colon /semicolon +/less /equal /greater /question /at /A /B /C /D /E +/F /G /H /I /J /K /L /M /N /O +/P /Q /R /S /T /U /V /W /X /Y +/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c +/d /e /f /g /h /i /j /k /l /m +/n /o /p /q /r /s /t /u /v /w +/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright +/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior +/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf +/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla +/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde +/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex +/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring +/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis +/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave +/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def +/cp {closepath} bind def +/c {curveto} bind def +/f {fill} bind def +/a {arc} bind def +/ef {eofill} bind def +/ex {exch} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth pop} bind def +/tr {translate} bind def + +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/ellipse +{ ellipsedict begin + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def /savematrix mtrx currentmatrix def + x y tr xrad yrad sc + 0 0 1 startangle endangle arc + savematrix setmatrix + end +} def + +/mergeprocs { +dup length +3 -1 roll +dup +length +dup +5 1 roll +3 -1 roll +add +array cvx +dup +3 -1 roll +0 exch +putinterval +dup +4 2 roll +putinterval +} bind def +/dpi_x 300 def +/dpi_y 300 def +/conicto { + /to_y exch def + /to_x exch def + /conic_cntrl_y exch def + /conic_cntrl_x exch def + currentpoint + /p0_y exch def + /p0_x exch def + /p1_x p0_x conic_cntrl_x p0_x sub 2 3 div mul add def + /p1_y p0_y conic_cntrl_y p0_y sub 2 3 div mul add def + /p2_x p1_x to_x p0_x sub 1 3 div mul add def + /p2_y p1_y to_y p0_y sub 1 3 div mul add def + p1_x p1_y p2_x p2_y to_x to_y curveto +} bind def +/start_ol { gsave 1.1 dpi_x div dup scale} bind def +/end_ol { closepath fill grestore } bind def +28.346000 -28.346000 scale +-6.000000 -13.800000 translate +%%EndProlog + + +0.100000 slw +[] 0 sd +1.000000 1.000000 1.000000 srgb +n 6.500000 12.000000 m 6.500000 13.800000 l 9.500000 13.800000 l 9.500000 12.000000 l f +n 6.500000 12.500000 m 6.500000 12.500000 0.500000 0.500000 180.000000 270.000000 ellipse f +n 9.500000 12.500000 m 9.500000 12.500000 0.500000 0.500000 270.000000 360.000000 ellipse f +n 6.000000 12.500000 m 6.000000 13.300000 l 10.000000 13.300000 l 10.000000 12.500000 l f +n 6.500000 13.300000 m 6.500000 13.300000 0.500000 0.500000 90.000000 180.000000 ellipse f +n 9.500000 13.300000 m 9.500000 13.300000 0.500000 0.500000 0.000000 90.000000 ellipse f +0.000000 0.000000 0.000000 srgb +n 6.500000 12.000000 m 9.500000 12.000000 l s +n 6.500000 13.800000 m 9.500000 13.800000 l s +n 6.500000 12.500000 0.500000 0.500000 180.000000 270.000000 ellipse s +n 9.500000 12.500000 0.500000 0.500000 270.000000 360.000000 ellipse s +n 6.000000 12.500000 m 6.000000 13.300000 l s +n 10.000000 12.500000 m 10.000000 13.300000 l s +n 6.500000 13.300000 0.500000 0.500000 90.000000 180.000000 ellipse s +n 9.500000 13.300000 0.500000 0.500000 0.000000 90.000000 ellipse s +gsave 7.504700 13.100000 translate 0.035278 -0.035278 scale +start_ol +448 3328 moveto +2368 3328 lineto +2368 2944 lineto +896 2944 lineto +896 1984 lineto +2240 1984 lineto +2240 1600 lineto +896 1600 lineto +896 0 lineto +448 0 lineto +448 3328 lineto +end_ol grestore +gsave 7.809500 13.100000 translate 0.035278 -0.035278 scale +start_ol +448 2496 moveto +832 2496 lineto +832 0 lineto +448 0 lineto +448 2496 lineto +448 3520 moveto +832 3520 lineto +832 3008 lineto +448 3008 lineto +448 3520 lineto +end_ol grestore +gsave 7.978833 13.100000 translate 0.035278 -0.035278 scale +start_ol +448 3520 moveto +832 3520 lineto +832 0 lineto +448 0 lineto +448 3520 lineto +end_ol grestore +gsave 8.148167 13.100000 translate 0.035278 -0.035278 scale +start_ol +2624 1352 moveto +2624 1152 lineto +704 1152 lineto +731 715 960 485 conicto +1189 256 1597 256 conicto +1834 256 2056 320 conicto +2278 384 2496 512 conicto +2496 128 lineto +2273 34 2039 -15 conicto +1805 -64 1565 -64 conicto +961 -64 608 284 conicto +256 632 256 1225 conicto +256 1839 595 2199 conicto +934 2560 1509 2560 conicto +2024 2560 2324 2235 conicto +2624 1910 2624 1352 conicto +2240 1472 moveto +2235 1822 2043 2031 conicto +1852 2240 1537 2240 conicto +1180 2240 965 2038 conicto +750 1836 718 1470 conicto +2240 1472 lineto +end_ol grestore +0.100000 slw +[] 0 sd +1.000000 1.000000 1.000000 srgb +n 36.500000 12.000000 m 36.500000 13.800000 l 40.150000 13.800000 l 40.150000 12.000000 l f +n 36.500000 12.500000 m 36.500000 12.500000 0.500000 0.500000 180.000000 270.000000 ellipse f +n 40.150000 12.500000 m 40.150000 12.500000 0.500000 0.500000 270.000000 360.000000 ellipse f +n 36.000000 12.500000 m 36.000000 13.300000 l 40.650000 13.300000 l 40.650000 12.500000 l f +n 36.500000 13.300000 m 36.500000 13.300000 0.500000 0.500000 90.000000 180.000000 ellipse f +n 40.150000 13.300000 m 40.150000 13.300000 0.500000 0.500000 0.000000 90.000000 ellipse f +0.000000 0.000000 0.000000 srgb +n 36.500000 12.000000 m 40.150000 12.000000 l s +n 36.500000 13.800000 m 40.150000 13.800000 l s +n 36.500000 12.500000 0.500000 0.500000 180.000000 270.000000 ellipse s +n 40.150000 12.500000 0.500000 0.500000 270.000000 360.000000 ellipse s +n 36.000000 12.500000 m 36.000000 13.300000 l s +n 40.650000 12.500000 m 40.650000 13.300000 l s +n 36.500000 13.300000 0.500000 0.500000 90.000000 180.000000 ellipse s +n 40.150000 13.300000 0.500000 0.500000 0.000000 90.000000 ellipse s +gsave 36.530067 13.100000 translate 0.035278 -0.035278 scale +start_ol +2560 1509 moveto +2560 0 lineto +2176 0 lineto +2176 1496 lineto +2176 1869 2029 2054 conicto +1883 2240 1590 2240 conicto +1238 2240 1035 2018 conicto +832 1796 832 1413 conicto +832 0 lineto +448 0 lineto +448 3520 lineto +832 3520 lineto +832 2112 lineto +983 2337 1188 2448 conicto +1394 2560 1662 2560 conicto +2106 2560 2333 2293 conicto +2560 2027 2560 1509 conicto +end_ol grestore +gsave 36.919533 13.100000 translate 0.035278 -0.035278 scale +start_ol +192 2496 moveto +607 2496 lineto +1126 549 lineto +1643 2496 lineto +2133 2496 lineto +2652 549 lineto +3169 2496 lineto +3584 2496 lineto +2923 0 lineto +2433 0 lineto +1890 2046 lineto +1343 0 lineto +853 0 lineto +192 2496 lineto +end_ol grestore +gsave 37.419067 13.100000 translate 0.035278 -0.035278 scale +start_ol +448 3328 moveto +896 3328 lineto +896 0 lineto +448 0 lineto +448 3328 lineto +end_ol grestore +gsave 37.596867 13.100000 translate 0.035278 -0.035278 scale +start_ol +2560 1509 moveto +2560 0 lineto +2176 0 lineto +2176 1496 lineto +2176 1869 2029 2054 conicto +1883 2240 1590 2240 conicto +1238 2240 1035 2018 conicto +832 1796 832 1413 conicto +832 0 lineto +448 0 lineto +448 2496 lineto +832 2496 lineto +832 2112 lineto +983 2337 1188 2448 conicto +1394 2560 1662 2560 conicto +2106 2560 2333 2293 conicto +2560 2027 2560 1509 conicto +end_ol grestore +gsave 37.986333 13.100000 translate 0.035278 -0.035278 scale +start_ol +832 3200 moveto +832 2496 lineto +1664 2496 lineto +1664 2176 lineto +832 2176 lineto +832 804 lineto +832 495 914 407 conicto +997 320 1248 320 conicto +1664 320 lineto +1664 0 lineto +1248 0 lineto +793 0 620 173 conicto +448 347 448 804 conicto +448 2176 lineto +128 2176 lineto +128 2496 lineto +448 2496 lineto +448 3200 lineto +832 3200 lineto +end_ol grestore +gsave 38.223400 13.100000 translate 0.035278 -0.035278 scale +start_ol +2624 1352 moveto +2624 1152 lineto +704 1152 lineto +731 715 960 485 conicto +1189 256 1597 256 conicto +1834 256 2056 320 conicto +2278 384 2496 512 conicto +2496 128 lineto +2273 34 2039 -15 conicto +1805 -64 1565 -64 conicto +961 -64 608 284 conicto +256 632 256 1225 conicto +256 1839 595 2199 conicto +934 2560 1509 2560 conicto +2024 2560 2324 2235 conicto +2624 1910 2624 1352 conicto +2240 1472 moveto +2235 1822 2043 2031 conicto +1852 2240 1537 2240 conicto +1180 2240 965 2038 conicto +750 1836 718 1470 conicto +2240 1472 lineto +end_ol grestore +gsave 38.595933 13.100000 translate 0.035278 -0.035278 scale +start_ol +1920 2112 moveto +1848 2178 1764 2209 conicto +1680 2240 1578 2240 conicto +1218 2240 1025 2001 conicto +832 1763 832 1317 conicto +832 0 lineto +448 0 lineto +448 2496 lineto +832 2496 lineto +832 2112 lineto +965 2339 1180 2449 conicto +1396 2560 1702 2560 conicto +1747 2560 1799 2560 conicto +1852 2560 1917 2560 conicto +1920 2112 lineto +end_ol grestore +gsave 38.849933 13.100000 translate 0.035278 -0.035278 scale +start_ol +1664 3520 moveto +1664 3200 lineto +1305 3200 lineto +1075 3200 985 3100 conicto +896 3001 896 2742 conicto +896 2496 lineto +1600 2496 lineto +1600 2176 lineto +896 2176 lineto +896 0 lineto +512 0 lineto +512 2176 lineto +128 2176 lineto +128 2496 lineto +512 2496 lineto +512 2691 lineto +512 3124 703 3322 conicto +894 3520 1310 3520 conicto +1664 3520 lineto +end_ol grestore +gsave 39.061600 13.100000 translate 0.035278 -0.035278 scale +start_ol +1559 1280 moveto +1040 1280 840 1160 conicto +640 1041 640 754 conicto +640 525 790 390 conicto +940 256 1198 256 conicto +1554 256 1769 510 conicto +1984 765 1984 1187 conicto +1984 1280 lineto +1559 1280 lineto +2368 1449 moveto +2368 0 lineto +1984 0 lineto +1984 384 lineto +1842 154 1628 45 conicto +1415 -64 1107 -64 conicto +717 -64 486 154 conicto +256 372 256 739 conicto +256 1166 539 1383 conicto +822 1600 1384 1600 conicto +1984 1600 lineto +1984 1641 lineto +1984 1927 1796 2083 conicto +1608 2240 1266 2240 conicto +1049 2240 843 2192 conicto +638 2144 448 2048 conicto +448 2432 lineto +673 2496 884 2528 conicto +1095 2560 1295 2560 conicto +1835 2560 2101 2284 conicto +2368 2009 2368 1449 conicto +end_ol grestore +gsave 39.434133 13.100000 translate 0.035278 -0.035278 scale +start_ol +2240 2432 moveto +2240 2048 lineto +2066 2144 1892 2192 conicto +1718 2240 1541 2240 conicto +1143 2240 923 1979 conicto +704 1718 704 1248 conicto +704 778 923 517 conicto +1143 256 1541 256 conicto +1718 256 1892 304 conicto +2066 352 2240 448 conicto +2240 64 lineto +2068 0 1883 -32 conicto +1698 -64 1490 -64 conicto +924 -64 590 290 conicto +256 645 256 1248 conicto +256 1859 593 2209 conicto +931 2560 1517 2560 conicto +1707 2560 1888 2528 conicto +2070 2496 2240 2432 conicto +end_ol grestore +gsave 39.772800 13.100000 translate 0.035278 -0.035278 scale +start_ol +2624 1352 moveto +2624 1152 lineto +704 1152 lineto +731 715 960 485 conicto +1189 256 1597 256 conicto +1834 256 2056 320 conicto +2278 384 2496 512 conicto +2496 128 lineto +2273 34 2039 -15 conicto +1805 -64 1565 -64 conicto +961 -64 608 284 conicto +256 632 256 1225 conicto +256 1839 595 2199 conicto +934 2560 1509 2560 conicto +2024 2560 2324 2235 conicto +2624 1910 2624 1352 conicto +2240 1472 moveto +2235 1822 2043 2031 conicto +1852 2240 1537 2240 conicto +1180 2240 965 2038 conicto +750 1836 718 1470 conicto +2240 1472 lineto +end_ol grestore +0.100000 slw +[] 0 sd +1.000000 1.000000 1.000000 srgb +n 30.500000 12.000000 m 30.500000 13.800000 l 33.500000 13.800000 l 33.500000 12.000000 l f +n 30.500000 12.500000 m 30.500000 12.500000 0.500000 0.500000 180.000000 270.000000 ellipse f +n 33.500000 12.500000 m 33.500000 12.500000 0.500000 0.500000 270.000000 360.000000 ellipse f +n 30.000000 12.500000 m 30.000000 13.300000 l 34.000000 13.300000 l 34.000000 12.500000 l f +n 30.500000 13.300000 m 30.500000 13.300000 0.500000 0.500000 90.000000 180.000000 ellipse f +n 33.500000 13.300000 m 33.500000 13.300000 0.500000 0.500000 0.000000 90.000000 ellipse f +0.000000 0.000000 0.000000 srgb +n 30.500000 12.000000 m 33.500000 12.000000 l s +n 30.500000 13.800000 m 33.500000 13.800000 l s +n 30.500000 12.500000 0.500000 0.500000 180.000000 270.000000 ellipse s +n 33.500000 12.500000 0.500000 0.500000 270.000000 360.000000 ellipse s +n 30.000000 12.500000 m 30.000000 13.300000 l s +n 34.000000 12.500000 m 34.000000 13.300000 l s +n 30.500000 13.300000 0.500000 0.500000 90.000000 180.000000 ellipse s +n 33.500000 13.300000 0.500000 0.500000 0.000000 90.000000 ellipse s +gsave 31.051733 13.100000 translate 0.035278 -0.035278 scale +start_ol +448 3328 moveto +896 3328 lineto +896 0 lineto +448 0 lineto +448 3328 lineto +end_ol grestore +gsave 31.229533 13.100000 translate 0.035278 -0.035278 scale +start_ol +1827 3008 moveto +1311 3008 1007 2647 conicto +704 2286 704 1663 conicto +704 1042 1007 681 conicto +1311 320 1827 320 conicto +2342 320 2643 681 conicto +2944 1042 2944 1663 conicto +2944 2286 2643 2647 conicto +2342 3008 1827 3008 conicto +1827 3392 moveto +2539 3392 2965 2922 conicto +3392 2453 3392 1663 conicto +3392 875 2965 405 conicto +2539 -64 1827 -64 conicto +1111 -64 683 404 conicto +256 873 256 1663 conicto +256 2453 683 2922 conicto +1111 3392 1827 3392 conicto +end_ol grestore +gsave 31.712133 13.100000 translate 0.035278 -0.035278 scale +start_ol +448 3328 moveto +1131 3328 lineto +1983 1063 lineto +2839 3328 lineto +3520 3328 lineto +3520 0 lineto +3072 0 lineto +3072 2923 lineto +2211 640 lineto +1757 640 lineto +896 2923 lineto +896 0 lineto +448 0 lineto +448 3328 lineto +end_ol grestore +gsave 32.237067 13.100000 translate 0.035278 -0.035278 scale +start_ol +1559 1280 moveto +1040 1280 840 1160 conicto +640 1041 640 754 conicto +640 525 790 390 conicto +940 256 1198 256 conicto +1554 256 1769 510 conicto +1984 765 1984 1187 conicto +1984 1280 lineto +1559 1280 lineto +2368 1449 moveto +2368 0 lineto +1984 0 lineto +1984 384 lineto +1842 154 1628 45 conicto +1415 -64 1107 -64 conicto +717 -64 486 154 conicto +256 372 256 739 conicto +256 1166 539 1383 conicto +822 1600 1384 1600 conicto +1984 1600 lineto +1984 1641 lineto +1984 1927 1796 2083 conicto +1608 2240 1266 2240 conicto +1049 2240 843 2192 conicto +638 2144 448 2048 conicto +448 2432 lineto +673 2496 884 2528 conicto +1095 2560 1295 2560 conicto +1835 2560 2101 2284 conicto +2368 2009 2368 1449 conicto +end_ol grestore +gsave 32.609600 13.100000 translate 0.035278 -0.035278 scale +start_ol +2560 1509 moveto +2560 0 lineto +2176 0 lineto +2176 1496 lineto +2176 1869 2029 2054 conicto +1883 2240 1590 2240 conicto +1238 2240 1035 2018 conicto +832 1796 832 1413 conicto +832 0 lineto +448 0 lineto +448 2496 lineto +832 2496 lineto +832 2112 lineto +983 2337 1188 2448 conicto +1394 2560 1662 2560 conicto +2106 2560 2333 2293 conicto +2560 2027 2560 1509 conicto +end_ol grestore +0.100000 slw +[] 0 sd +1.000000 1.000000 1.000000 srgb +n 24.500000 12.000000 m 24.500000 13.800000 l 27.500000 13.800000 l 27.500000 12.000000 l f +n 24.500000 12.500000 m 24.500000 12.500000 0.500000 0.500000 180.000000 270.000000 ellipse f +n 27.500000 12.500000 m 27.500000 12.500000 0.500000 0.500000 270.000000 360.000000 ellipse f +n 24.000000 12.500000 m 24.000000 13.300000 l 28.000000 13.300000 l 28.000000 12.500000 l f +n 24.500000 13.300000 m 24.500000 13.300000 0.500000 0.500000 90.000000 180.000000 ellipse f +n 27.500000 13.300000 m 27.500000 13.300000 0.500000 0.500000 0.000000 90.000000 ellipse f +0.000000 0.000000 0.000000 srgb +n 24.500000 12.000000 m 27.500000 12.000000 l s +n 24.500000 13.800000 m 27.500000 13.800000 l s +n 24.500000 12.500000 0.500000 0.500000 180.000000 270.000000 ellipse s +n 27.500000 12.500000 0.500000 0.500000 270.000000 360.000000 ellipse s +n 24.000000 12.500000 m 24.000000 13.300000 l s +n 28.000000 12.500000 m 28.000000 13.300000 l s +n 24.500000 13.300000 0.500000 0.500000 90.000000 180.000000 ellipse s +n 27.500000 13.300000 0.500000 0.500000 0.000000 90.000000 ellipse s +gsave 25.373467 13.100000 translate 0.035278 -0.035278 scale +start_ol +896 2944 moveto +896 384 lineto +1454 384 lineto +2160 384 2488 692 conicto +2816 1001 2816 1667 conicto +2816 2329 2488 2636 conicto +2160 2944 1454 2944 conicto +896 2944 lineto +448 3328 moveto +1383 3328 lineto +2355 3328 2809 2925 conicto +3264 2523 3264 1667 conicto +3264 807 2807 403 conicto +2350 0 1383 0 conicto +448 0 lineto +448 3328 lineto +end_ol grestore +gsave 25.839133 13.100000 translate 0.035278 -0.035278 scale +start_ol +448 2496 moveto +832 2496 lineto +832 0 lineto +448 0 lineto +448 2496 lineto +448 3520 moveto +832 3520 lineto +832 3008 lineto +448 3008 lineto +448 3520 lineto +end_ol grestore +gsave 26.008467 13.100000 translate 0.035278 -0.035278 scale +start_ol +2048 2432 moveto +2048 2048 lineto +1868 2144 1674 2192 conicto +1480 2240 1273 2240 conicto +957 2240 798 2144 conicto +640 2048 640 1856 conicto +640 1709 757 1625 conicto +875 1542 1229 1467 conicto +1380 1435 lineto +1812 1341 1994 1170 conicto +2176 999 2176 692 conicto +2176 343 1899 139 conicto +1622 -64 1137 -64 conicto +936 -64 717 -32 conicto +498 0 256 64 conicto +256 512 lineto +490 385 718 320 conicto +947 256 1170 256 conicto +1470 256 1631 358 conicto +1792 461 1792 647 conicto +1792 820 1670 912 conicto +1549 1004 1141 1089 conicto +988 1123 lineto +600 1203 428 1369 conicto +256 1535 256 1824 conicto +256 2177 510 2368 conicto +765 2560 1233 2560 conicto +1466 2560 1670 2528 conicto +1875 2496 2048 2432 conicto +end_ol grestore +gsave 26.330200 13.100000 translate 0.035278 -0.035278 scale +start_ol +2240 2432 moveto +2240 2048 lineto +2066 2144 1892 2192 conicto +1718 2240 1541 2240 conicto +1143 2240 923 1979 conicto +704 1718 704 1248 conicto +704 778 923 517 conicto +1143 256 1541 256 conicto +1718 256 1892 304 conicto +2066 352 2240 448 conicto +2240 64 lineto +2068 0 1883 -32 conicto +1698 -64 1490 -64 conicto +924 -64 590 290 conicto +256 645 256 1248 conicto +256 1859 593 2209 conicto +931 2560 1517 2560 conicto +1707 2560 1888 2528 conicto +2070 2496 2240 2432 conicto +end_ol grestore +0.100000 slw +[] 0 sd +1.000000 1.000000 1.000000 srgb +n 18.500000 12.000000 m 18.500000 13.800000 l 21.500000 13.800000 l 21.500000 12.000000 l f +n 18.500000 12.500000 m 18.500000 12.500000 0.500000 0.500000 180.000000 270.000000 ellipse f +n 21.500000 12.500000 m 21.500000 12.500000 0.500000 0.500000 270.000000 360.000000 ellipse f +n 18.000000 12.500000 m 18.000000 13.300000 l 22.000000 13.300000 l 22.000000 12.500000 l f +n 18.500000 13.300000 m 18.500000 13.300000 0.500000 0.500000 90.000000 180.000000 ellipse f +n 21.500000 13.300000 m 21.500000 13.300000 0.500000 0.500000 0.000000 90.000000 ellipse f +0.000000 0.000000 0.000000 srgb +n 18.500000 12.000000 m 21.500000 12.000000 l s +n 18.500000 13.800000 m 21.500000 13.800000 l s +n 18.500000 12.500000 0.500000 0.500000 180.000000 270.000000 ellipse s +n 21.500000 12.500000 0.500000 0.500000 270.000000 360.000000 ellipse s +n 18.000000 12.500000 m 18.000000 13.300000 l s +n 22.000000 12.500000 m 22.000000 13.300000 l s +n 18.500000 13.300000 0.500000 0.500000 90.000000 180.000000 ellipse s +n 21.500000 13.300000 0.500000 0.500000 0.000000 90.000000 ellipse s +gsave 18.755400 13.100000 translate 0.035278 -0.035278 scale +start_ol +896 2944 moveto +896 1728 lineto +1488 1728 lineto +1817 1728 1996 1886 conicto +2176 2044 2176 2337 conicto +2176 2627 1996 2785 conicto +1817 2944 1488 2944 conicto +896 2944 lineto +448 3328 moveto +1488 3328 lineto +2050 3328 2337 3076 conicto +2624 2824 2624 2337 conicto +2624 1847 2337 1595 conicto +2050 1344 1488 1344 conicto +896 1344 lineto +896 0 lineto +448 0 lineto +448 3328 lineto +end_ol grestore +gsave 19.094067 13.100000 translate 0.035278 -0.035278 scale +start_ol +1559 1280 moveto +1040 1280 840 1160 conicto +640 1041 640 754 conicto +640 525 790 390 conicto +940 256 1198 256 conicto +1554 256 1769 510 conicto +1984 765 1984 1187 conicto +1984 1280 lineto +1559 1280 lineto +2368 1449 moveto +2368 0 lineto +1984 0 lineto +1984 384 lineto +1842 154 1628 45 conicto +1415 -64 1107 -64 conicto +717 -64 486 154 conicto +256 372 256 739 conicto +256 1166 539 1383 conicto +822 1600 1384 1600 conicto +1984 1600 lineto +1984 1641 lineto +1984 1927 1796 2083 conicto +1608 2240 1266 2240 conicto +1049 2240 843 2192 conicto +638 2144 448 2048 conicto +448 2432 lineto +673 2496 884 2528 conicto +1095 2560 1295 2560 conicto +1835 2560 2101 2284 conicto +2368 2009 2368 1449 conicto +end_ol grestore +gsave 19.466600 13.100000 translate 0.035278 -0.035278 scale +start_ol +1920 2112 moveto +1848 2178 1764 2209 conicto +1680 2240 1578 2240 conicto +1218 2240 1025 2001 conicto +832 1763 832 1317 conicto +832 0 lineto +448 0 lineto +448 2496 lineto +832 2496 lineto +832 2112 lineto +965 2339 1180 2449 conicto +1396 2560 1702 2560 conicto +1747 2560 1799 2560 conicto +1852 2560 1917 2560 conicto +1920 2112 lineto +end_ol grestore +gsave 19.720600 13.100000 translate 0.035278 -0.035278 scale +start_ol +832 3200 moveto +832 2496 lineto +1664 2496 lineto +1664 2176 lineto +832 2176 lineto +832 804 lineto +832 495 914 407 conicto +997 320 1248 320 conicto +1664 320 lineto +1664 0 lineto +1248 0 lineto +793 0 620 173 conicto +448 347 448 804 conicto +448 2176 lineto +128 2176 lineto +128 2496 lineto +448 2496 lineto +448 3200 lineto +832 3200 lineto +end_ol grestore +gsave 19.957667 13.100000 translate 0.035278 -0.035278 scale +start_ol +448 2496 moveto +832 2496 lineto +832 0 lineto +448 0 lineto +448 2496 lineto +448 3520 moveto +832 3520 lineto +832 3008 lineto +448 3008 lineto +448 3520 lineto +end_ol grestore +gsave 20.127000 13.100000 translate 0.035278 -0.035278 scale +start_ol +832 3200 moveto +832 2496 lineto +1664 2496 lineto +1664 2176 lineto +832 2176 lineto +832 804 lineto +832 495 914 407 conicto +997 320 1248 320 conicto +1664 320 lineto +1664 0 lineto +1248 0 lineto +793 0 620 173 conicto +448 347 448 804 conicto +448 2176 lineto +128 2176 lineto +128 2496 lineto +448 2496 lineto +448 3200 lineto +832 3200 lineto +end_ol grestore +gsave 20.364067 13.100000 translate 0.035278 -0.035278 scale +start_ol +448 2496 moveto +832 2496 lineto +832 0 lineto +448 0 lineto +448 2496 lineto +448 3520 moveto +832 3520 lineto +832 3008 lineto +448 3008 lineto +448 3520 lineto +end_ol grestore +gsave 20.533400 13.100000 translate 0.035278 -0.035278 scale +start_ol +1409 2240 moveto +1083 2240 893 1974 conicto +704 1709 704 1248 conicto +704 787 892 521 conicto +1081 256 1409 256 conicto +1733 256 1922 522 conicto +2112 789 2112 1248 conicto +2112 1705 1922 1972 conicto +1733 2240 1409 2240 conicto +1408 2560 moveto +1946 2560 2253 2212 conicto +2560 1864 2560 1248 conicto +2560 634 2253 285 conicto +1946 -64 1408 -64 conicto +869 -64 562 285 conicto +256 634 256 1248 conicto +256 1864 562 2212 conicto +869 2560 1408 2560 conicto +end_ol grestore +gsave 20.905933 13.100000 translate 0.035278 -0.035278 scale +start_ol +2560 1509 moveto +2560 0 lineto +2176 0 lineto +2176 1496 lineto +2176 1869 2029 2054 conicto +1883 2240 1590 2240 conicto +1238 2240 1035 2018 conicto +832 1796 832 1413 conicto +832 0 lineto +448 0 lineto +448 2496 lineto +832 2496 lineto +832 2112 lineto +983 2337 1188 2448 conicto +1394 2560 1662 2560 conicto +2106 2560 2333 2293 conicto +2560 2027 2560 1509 conicto +end_ol grestore +0.100000 slw +[] 0 sd +1.000000 1.000000 1.000000 srgb +n 12.500000 12.000000 m 12.500000 13.800000 l 15.700000 13.800000 l 15.700000 12.000000 l f +n 12.500000 12.500000 m 12.500000 12.500000 0.500000 0.500000 180.000000 270.000000 ellipse f +n 15.700000 12.500000 m 15.700000 12.500000 0.500000 0.500000 270.000000 360.000000 ellipse f +n 12.000000 12.500000 m 12.000000 13.300000 l 16.200000 13.300000 l 16.200000 12.500000 l f +n 12.500000 13.300000 m 12.500000 13.300000 0.500000 0.500000 90.000000 180.000000 ellipse f +n 15.700000 13.300000 m 15.700000 13.300000 0.500000 0.500000 0.000000 90.000000 ellipse f +0.000000 0.000000 0.000000 srgb +n 12.500000 12.000000 m 15.700000 12.000000 l s +n 12.500000 13.800000 m 15.700000 13.800000 l s +n 12.500000 12.500000 0.500000 0.500000 180.000000 270.000000 ellipse s +n 15.700000 12.500000 0.500000 0.500000 270.000000 360.000000 ellipse s +n 12.000000 12.500000 m 12.000000 13.300000 l s +n 16.200000 12.500000 m 16.200000 13.300000 l s +n 12.500000 13.300000 0.500000 0.500000 90.000000 180.000000 ellipse s +n 15.700000 13.300000 0.500000 0.500000 0.000000 90.000000 ellipse s +gsave 12.508267 13.100000 translate 0.035278 -0.035278 scale +start_ol +448 3328 moveto +2368 3328 lineto +2368 2944 lineto +896 2944 lineto +896 1984 lineto +2240 1984 lineto +2240 1600 lineto +896 1600 lineto +896 0 lineto +448 0 lineto +448 3328 lineto +end_ol grestore +gsave 12.813067 13.100000 translate 0.035278 -0.035278 scale +start_ol +448 2496 moveto +832 2496 lineto +832 0 lineto +448 0 lineto +448 2496 lineto +448 3520 moveto +832 3520 lineto +832 3008 lineto +448 3008 lineto +448 3520 lineto +end_ol grestore +gsave 12.982400 13.100000 translate 0.035278 -0.035278 scale +start_ol +448 3520 moveto +832 3520 lineto +832 0 lineto +448 0 lineto +448 3520 lineto +end_ol grestore +gsave 13.151733 13.100000 translate 0.035278 -0.035278 scale +start_ol +2624 1352 moveto +2624 1152 lineto +704 1152 lineto +731 715 960 485 conicto +1189 256 1597 256 conicto +1834 256 2056 320 conicto +2278 384 2496 512 conicto +2496 128 lineto +2273 34 2039 -15 conicto +1805 -64 1565 -64 conicto +961 -64 608 284 conicto +256 632 256 1225 conicto +256 1839 595 2199 conicto +934 2560 1509 2560 conicto +2024 2560 2324 2235 conicto +2624 1910 2624 1352 conicto +2240 1472 moveto +2235 1822 2043 2031 conicto +1852 2240 1537 2240 conicto +1180 2240 965 2038 conicto +750 1836 718 1470 conicto +2240 1472 lineto +end_ol grestore +gsave 13.524267 13.100000 translate 0.035278 -0.035278 scale +start_ol +2048 2432 moveto +2048 2048 lineto +1868 2144 1674 2192 conicto +1480 2240 1273 2240 conicto +957 2240 798 2144 conicto +640 2048 640 1856 conicto +640 1709 757 1625 conicto +875 1542 1229 1467 conicto +1380 1435 lineto +1812 1341 1994 1170 conicto +2176 999 2176 692 conicto +2176 343 1899 139 conicto +1622 -64 1137 -64 conicto +936 -64 717 -32 conicto +498 0 256 64 conicto +256 512 lineto +490 385 718 320 conicto +947 256 1170 256 conicto +1470 256 1631 358 conicto +1792 461 1792 647 conicto +1792 820 1670 912 conicto +1549 1004 1141 1089 conicto +988 1123 lineto +600 1203 428 1369 conicto +256 1535 256 1824 conicto +256 2177 510 2368 conicto +765 2560 1233 2560 conicto +1466 2560 1670 2528 conicto +1875 2496 2048 2432 conicto +end_ol grestore +gsave 13.846000 13.100000 translate 0.035278 -0.035278 scale +start_ol +1477 -262 moveto +1305 -695 1142 -827 conicto +980 -960 707 -960 conicto +384 -960 lineto +384 -640 lineto +622 -640 lineto +789 -640 881 -555 conicto +974 -471 1085 -156 conicto +1159 33 lineto +128 2496 lineto +590 2496 lineto +1361 544 lineto +2131 2496 lineto +2560 2496 lineto +1477 -262 lineto +end_ol grestore +gsave 14.210067 13.100000 translate 0.035278 -0.035278 scale +start_ol +2048 2432 moveto +2048 2048 lineto +1868 2144 1674 2192 conicto +1480 2240 1273 2240 conicto +957 2240 798 2144 conicto +640 2048 640 1856 conicto +640 1709 757 1625 conicto +875 1542 1229 1467 conicto +1380 1435 lineto +1812 1341 1994 1170 conicto +2176 999 2176 692 conicto +2176 343 1899 139 conicto +1622 -64 1137 -64 conicto +936 -64 717 -32 conicto +498 0 256 64 conicto +256 512 lineto +490 385 718 320 conicto +947 256 1170 256 conicto +1470 256 1631 358 conicto +1792 461 1792 647 conicto +1792 820 1670 912 conicto +1549 1004 1141 1089 conicto +988 1123 lineto +600 1203 428 1369 conicto +256 1535 256 1824 conicto +256 2177 510 2368 conicto +765 2560 1233 2560 conicto +1466 2560 1670 2528 conicto +1875 2496 2048 2432 conicto +end_ol grestore +gsave 14.531800 13.100000 translate 0.035278 -0.035278 scale +start_ol +832 3200 moveto +832 2496 lineto +1664 2496 lineto +1664 2176 lineto +832 2176 lineto +832 804 lineto +832 495 914 407 conicto +997 320 1248 320 conicto +1664 320 lineto +1664 0 lineto +1248 0 lineto +793 0 620 173 conicto +448 347 448 804 conicto +448 2176 lineto +128 2176 lineto +128 2496 lineto +448 2496 lineto +448 3200 lineto +832 3200 lineto +end_ol grestore +gsave 14.768867 13.100000 translate 0.035278 -0.035278 scale +start_ol +2624 1352 moveto +2624 1152 lineto +704 1152 lineto +731 715 960 485 conicto +1189 256 1597 256 conicto +1834 256 2056 320 conicto +2278 384 2496 512 conicto +2496 128 lineto +2273 34 2039 -15 conicto +1805 -64 1565 -64 conicto +961 -64 608 284 conicto +256 632 256 1225 conicto +256 1839 595 2199 conicto +934 2560 1509 2560 conicto +2024 2560 2324 2235 conicto +2624 1910 2624 1352 conicto +2240 1472 moveto +2235 1822 2043 2031 conicto +1852 2240 1537 2240 conicto +1180 2240 965 2038 conicto +750 1836 718 1470 conicto +2240 1472 lineto +end_ol grestore +gsave 15.141400 13.100000 translate 0.035278 -0.035278 scale +start_ol +2431 2020 moveto +2590 2296 2809 2428 conicto +3029 2560 3325 2560 conicto +3726 2560 3943 2287 conicto +4160 2014 4160 1509 conicto +4160 0 lineto +3776 0 lineto +3776 1496 lineto +3776 1874 3641 2057 conicto +3506 2240 3228 2240 conicto +2890 2240 2693 2018 conicto +2496 1796 2496 1413 conicto +2496 0 lineto +2112 0 lineto +2112 1496 lineto +2112 1876 1976 2058 conicto +1841 2240 1560 2240 conicto +1225 2240 1028 2017 conicto +832 1794 832 1413 conicto +832 0 lineto +448 0 lineto +448 2496 lineto +832 2496 lineto +832 2112 lineto +977 2341 1180 2450 conicto +1383 2560 1662 2560 conicto +1942 2560 2139 2422 conicto +2337 2284 2431 2020 conicto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 10.000000 12.900000 m 11.000000 12.900000 l s +0 slj +n 11.500000 13.150000 m 12.000000 12.900000 l 11.500000 12.650000 l ef +0 slj +n 11.000000 13.150000 m 11.500000 12.900000 l 11.000000 12.650000 l ef +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 16.200000 12.900000 m 17.000000 12.900000 l s +0 slj +n 17.500000 13.150000 m 18.000000 12.900000 l 17.500000 12.650000 l ef +0 slj +n 17.000000 13.150000 m 17.500000 12.900000 l 17.000000 12.650000 l ef +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 22.000000 12.900000 m 23.000000 12.900000 l s +0 slj +n 23.500000 13.150000 m 24.000000 12.900000 l 23.500000 12.650000 l ef +0 slj +n 23.000000 13.150000 m 23.500000 12.900000 l 23.000000 12.650000 l ef +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 28.000000 12.900000 m 29.000000 12.900000 l s +0 slj +n 29.500000 13.150000 m 30.000000 12.900000 l 29.500000 12.650000 l ef +0 slj +n 29.000000 13.150000 m 29.500000 12.900000 l 29.000000 12.650000 l ef +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 34.000000 12.900000 m 35.000000 12.900000 l s +0 slj +n 35.500000 13.150000 m 36.000000 12.900000 l 35.500000 12.650000 l ef +0 slj +n 35.000000 13.150000 m 35.500000 12.900000 l 35.000000 12.650000 l ef +showpage diff --git a/tools/efsl-0.3.6/docs/schematics/sdcard.dia b/tools/efsl-0.3.6/docs/schematics/sdcard.dia new file mode 100644 index 0000000..05360b2 Binary files /dev/null and b/tools/efsl-0.3.6/docs/schematics/sdcard.dia differ diff --git a/tools/efsl-0.3.6/docs/schematics/sdcard.eps b/tools/efsl-0.3.6/docs/schematics/sdcard.eps new file mode 100644 index 0000000..a568328 --- /dev/null +++ b/tools/efsl-0.3.6/docs/schematics/sdcard.eps @@ -0,0 +1,1844 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/len/efsl/docs/schematics/sdcard.dia +%%Creator: Dia v0.94 +%%CreationDate: Thu May 26 19:10:49 2005 +%%For: len +%%Orientation: Portrait +%%Magnification: 1.0000 +%%BoundingBox: 0 0 620 436 +%%BeginSetup +%%EndSetup +%%EndComments +%%BeginProlog +[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright +/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one +/two /three /four /five /six /seven /eight /nine /colon /semicolon +/less /equal /greater /question /at /A /B /C /D /E +/F /G /H /I /J /K /L /M /N /O +/P /Q /R /S /T /U /V /W /X /Y +/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c +/d /e /f /g /h /i /j /k /l /m +/n /o /p /q /r /s /t /u /v /w +/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright +/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior +/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf +/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla +/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde +/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex +/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring +/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis +/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave +/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def +/cp {closepath} bind def +/c {curveto} bind def +/f {fill} bind def +/a {arc} bind def +/ef {eofill} bind def +/ex {exch} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth pop} bind def +/tr {translate} bind def + +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/ellipse +{ ellipsedict begin + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def /savematrix mtrx currentmatrix def + x y tr xrad yrad sc + 0 0 1 startangle endangle arc + savematrix setmatrix + end +} def + +/mergeprocs { +dup length +3 -1 roll +dup +length +dup +5 1 roll +3 -1 roll +add +array cvx +dup +3 -1 roll +0 exch +putinterval +dup +4 2 roll +putinterval +} bind def +/dpi_x 300 def +/dpi_y 300 def +/conicto { + /to_y exch def + /to_x exch def + /conic_cntrl_y exch def + /conic_cntrl_x exch def + currentpoint + /p0_y exch def + /p0_x exch def + /p1_x p0_x conic_cntrl_x p0_x sub 2 3 div mul add def + /p1_y p0_y conic_cntrl_y p0_y sub 2 3 div mul add def + /p2_x p1_x to_x p0_x sub 1 3 div mul add def + /p2_y p1_y to_y p0_y sub 1 3 div mul add def + p1_x p1_y p2_x p2_y to_x to_y curveto +} bind def +/start_ol { gsave 1.1 dpi_x div dup scale} bind def +/end_ol { closepath fill grestore } bind def +20.554446 -20.554446 scale +-4.929289 -18.050000 translate +%%EndProlog + + +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0.000000 0.000000 0.000000 srgb +n 5.000000 15.000000 m 14.000000 15.000000 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 15.000000 m 5.000000 5.000000 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 5.000000 5.000000 m 7.000000 3.000000 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 7.000000 3.000000 m 14.000000 3.000000 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 14.000000 3.000000 m 14.000000 15.000000 l s +gsave 8.360000 4.000000 translate 0.035278 -0.035278 scale +start_ol +896 576 moveto +2112 576 lineto +2112 4864 lineto +832 4608 lineto +832 5184 lineto +2140 5440 lineto +2880 5440 lineto +2880 576 lineto +4096 576 lineto +4096 0 lineto +896 0 lineto +896 576 lineto +end_ol grestore +gsave 8.986533 4.000000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 9.299800 4.000000 translate 0.035278 -0.035278 scale +start_ol +384 2304 moveto +2368 2304 lineto +2368 1728 lineto +384 1728 lineto +384 2304 lineto +end_ol grestore +gsave 9.655400 4.000000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 9.968667 4.000000 translate 0.035278 -0.035278 scale +start_ol +4800 5056 moveto +4800 4288 lineto +4432 4643 4014 4817 conicto +3596 4992 3126 4992 conicto +2200 4992 1708 4408 conicto +1216 3824 1216 2718 conicto +1216 1616 1708 1032 conicto +2200 448 3126 448 conicto +3596 448 4014 622 conicto +4432 797 4800 1152 conicto +4800 384 lineto +4417 128 3988 0 conicto +3560 -128 3084 -128 conicto +1858 -128 1153 635 conicto +448 1398 448 2718 conicto +448 4042 1153 4805 conicto +1858 5568 3084 5568 conicto +3567 5568 3995 5440 conicto +4424 5312 4800 5056 conicto +end_ol grestore +gsave 10.654467 4.000000 translate 0.035278 -0.035278 scale +start_ol +4032 5312 moveto +4032 4608 lineto +3614 4802 3244 4897 conicto +2874 4992 2529 4992 conicto +1930 4992 1605 4755 conicto +1280 4519 1280 4082 conicto +1280 3716 1495 3529 conicto +1711 3343 2311 3228 conicto +2753 3135 lineto +3573 2976 3962 2575 conicto +4352 2174 4352 1502 conicto +4352 700 3817 286 conicto +3283 -128 2251 -128 conicto +1861 -128 1421 -47 conicto +982 34 512 192 conicto +512 960 lineto +965 706 1400 577 conicto +1835 448 2255 448 conicto +2892 448 3238 701 conicto +3584 955 3584 1426 conicto +3584 1837 3340 2068 conicto +3096 2299 2539 2415 conicto +2094 2505 lineto +1259 2670 885 3022 conicto +512 3375 512 4004 conicto +512 4731 1023 5149 conicto +1534 5568 2432 5568 conicto +2817 5568 3216 5504 conicto +3615 5440 4032 5312 conicto +end_ol grestore +gsave 8.360000 5.300000 translate 0.035278 -0.035278 scale +start_ol +1461 576 moveto +3997 576 lineto +3997 0 lineto +576 0 lineto +576 576 lineto +986 1022 1692 1772 conicto +2399 2522 2581 2740 conicto +2926 3147 3063 3429 conicto +3200 3712 3200 3986 conicto +3200 4430 2906 4711 conicto +2612 4992 2140 4992 conicto +1806 4992 1434 4849 conicto +1063 4706 640 4416 conicto +640 5184 lineto +1076 5374 1456 5471 conicto +1836 5568 2150 5568 conicto +2981 5568 3474 5139 conicto +3968 4710 3968 3993 conicto +3968 3652 3844 3347 conicto +3720 3042 3392 2628 conicto +3303 2521 2820 2009 conicto +2338 1497 1461 576 conicto +end_ol grestore +gsave 8.986533 5.300000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 9.299800 5.300000 translate 0.035278 -0.035278 scale +start_ol +384 2304 moveto +2368 2304 lineto +2368 1728 lineto +384 1728 lineto +384 2304 lineto +end_ol grestore +gsave 9.655400 5.300000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 9.968667 5.300000 translate 0.035278 -0.035278 scale +start_ol +1472 4864 moveto +1472 576 lineto +2345 576 lineto +3453 576 3966 1093 conicto +4480 1610 4480 2726 conicto +4480 3834 3966 4349 conicto +3453 4864 2345 4864 conicto +1472 4864 lineto +704 5440 moveto +2235 5440 lineto +3791 5440 4519 4782 conicto +5248 4125 5248 2726 conicto +5248 1319 4516 659 conicto +3785 0 2235 0 conicto +704 0 lineto +704 5440 lineto +end_ol grestore +gsave 10.722200 5.300000 translate 0.035278 -0.035278 scale +start_ol +2575 2048 moveto +1735 2048 1411 1861 conicto +1088 1675 1088 1226 conicto +1088 868 1331 658 conicto +1574 448 1992 448 conicto +2568 448 2916 843 conicto +3264 1239 3264 1894 conicto +3264 2048 lineto +2575 2048 lineto +3904 2318 moveto +3904 0 lineto +3264 0 lineto +3264 576 lineto +3032 216 2684 44 conicto +2336 -128 1834 -128 conicto +1198 -128 823 224 conicto +448 577 448 1169 conicto +448 1859 911 2209 conicto +1374 2560 2293 2560 conicto +3264 2560 lineto +3264 2626 lineto +3264 3084 2957 3334 conicto +2651 3584 2096 3584 conicto +1744 3584 1410 3504 conicto +1077 3424 768 3264 conicto +768 3904 lineto +1134 4032 1479 4096 conicto +1824 4160 2151 4160 conicto +3033 4160 3468 3703 conicto +3904 3246 3904 2318 conicto +end_ol grestore +gsave 11.323333 5.300000 translate 0.035278 -0.035278 scale +start_ol +1344 5184 moveto +1344 4032 lineto +2688 4032 lineto +2688 3520 lineto +1344 3520 lineto +1344 1346 lineto +1344 855 1477 715 conicto +1610 576 2018 576 conicto +2688 576 lineto +2688 0 lineto +2018 0 lineto +1272 0 988 289 conicto +704 579 704 1346 conicto +704 3520 lineto +192 3520 lineto +192 4032 lineto +704 4032 lineto +704 5184 lineto +1344 5184 lineto +end_ol grestore +gsave 11.704333 5.300000 translate 0.035278 -0.035278 scale +start_ol +2575 2048 moveto +1735 2048 1411 1861 conicto +1088 1675 1088 1226 conicto +1088 868 1331 658 conicto +1574 448 1992 448 conicto +2568 448 2916 843 conicto +3264 1239 3264 1894 conicto +3264 2048 lineto +2575 2048 lineto +3904 2318 moveto +3904 0 lineto +3264 0 lineto +3264 576 lineto +3032 216 2684 44 conicto +2336 -128 1834 -128 conicto +1198 -128 823 224 conicto +448 577 448 1169 conicto +448 1859 911 2209 conicto +1374 2560 2293 2560 conicto +3264 2560 lineto +3264 2626 lineto +3264 3084 2957 3334 conicto +2651 3584 2096 3584 conicto +1744 3584 1410 3504 conicto +1077 3424 768 3264 conicto +768 3904 lineto +1134 4032 1479 4096 conicto +1824 4160 2151 4160 conicto +3033 4160 3468 3703 conicto +3904 3246 3904 2318 conicto +end_ol grestore +gsave 12.305467 5.300000 translate 0.035278 -0.035278 scale +start_ol +704 5440 moveto +1472 5440 lineto +1472 0 lineto +704 0 lineto +704 5440 lineto +end_ol grestore +gsave 12.593333 5.300000 translate 0.035278 -0.035278 scale +start_ol +4096 2470 moveto +4096 0 lineto +3456 0 lineto +3456 2448 lineto +3456 3017 3225 3300 conicto +2995 3584 2536 3584 conicto +1982 3584 1663 3242 conicto +1344 2901 1344 2313 conicto +1344 0 lineto +704 0 lineto +704 4032 lineto +1344 4032 lineto +1344 3456 lineto +1585 3809 1912 3984 conicto +2239 4160 2667 4160 conicto +3372 4160 3734 3731 conicto +4096 3303 4096 2470 conicto +end_ol grestore +gsave 8.360000 6.600000 translate 0.035278 -0.035278 scale +start_ol +3009 2936 moveto +3551 2822 3855 2462 conicto +4160 2102 4160 1573 conicto +4160 761 3606 316 conicto +3052 -128 2031 -128 conicto +1688 -128 1325 -64 conicto +962 0 576 128 conicto +576 832 lineto +878 642 1238 545 conicto +1598 448 1991 448 conicto +2676 448 3034 732 conicto +3392 1017 3392 1558 conicto +3392 2059 3064 2341 conicto +2736 2624 2151 2624 conicto +1536 2624 lineto +1536 3200 lineto +2180 3200 lineto +2706 3200 2985 3427 conicto +3264 3654 3264 4082 conicto +3264 4522 2976 4757 conicto +2688 4992 2151 4992 conicto +1854 4992 1514 4914 conicto +1175 4836 768 4672 conicto +768 5312 lineto +1184 5440 1547 5504 conicto +1910 5568 2232 5568 conicto +3064 5568 3548 5183 conicto +4032 4798 4032 4143 conicto +4032 3687 3766 3372 conicto +3500 3058 3009 2936 conicto +end_ol grestore +gsave 8.986533 6.600000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 9.299800 6.600000 translate 0.035278 -0.035278 scale +start_ol +384 2304 moveto +2368 2304 lineto +2368 1728 lineto +384 1728 lineto +384 2304 lineto +end_ol grestore +gsave 9.655400 6.600000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 9.968667 6.600000 translate 0.035278 -0.035278 scale +start_ol +4416 723 moveto +4416 2176 lineto +3200 2176 lineto +3200 2752 lineto +5184 2752 lineto +5184 455 lineto +4759 167 4247 19 conicto +3735 -128 3154 -128 conicto +1883 -128 1165 624 conicto +448 1376 448 2718 conicto +448 4064 1167 4816 conicto +1887 5568 3162 5568 conicto +3693 5568 4172 5438 conicto +4651 5309 5056 5056 conicto +5056 4288 lineto +4647 4638 4187 4815 conicto +3727 4992 3220 4992 conicto +2220 4992 1718 4421 conicto +1216 3850 1216 2718 conicto +1216 1590 1710 1019 conicto +2204 448 3188 448 conicto +3572 448 3873 515 conicto +4175 582 4416 723 conicto +end_ol grestore +gsave 10.730667 6.600000 translate 0.035278 -0.035278 scale +start_ol +704 5440 moveto +1736 5440 lineto +4032 890 lineto +4032 5440 lineto +4800 5440 lineto +4800 0 lineto +3769 0 lineto +1472 4551 lineto +1472 0 lineto +704 0 lineto +704 5440 lineto +end_ol grestore +gsave 11.467267 6.600000 translate 0.035278 -0.035278 scale +start_ol +1472 4864 moveto +1472 576 lineto +2345 576 lineto +3453 576 3966 1093 conicto +4480 1610 4480 2726 conicto +4480 3834 3966 4349 conicto +3453 4864 2345 4864 conicto +1472 4864 lineto +704 5440 moveto +2235 5440 lineto +3791 5440 4519 4782 conicto +5248 4125 5248 2726 conicto +5248 1319 4516 659 conicto +3785 0 2235 0 conicto +704 0 lineto +704 5440 lineto +end_ol grestore +gsave 8.360000 7.900000 translate 0.035278 -0.035278 scale +start_ol +2816 4792 moveto +975 1856 lineto +2816 1856 lineto +2816 4792 lineto +2656 5440 moveto +3584 5440 lineto +3584 1856 lineto +4352 1856 lineto +4352 1280 lineto +3584 1280 lineto +3584 0 lineto +2816 0 lineto +2816 1280 lineto +384 1280 lineto +384 1991 lineto +2656 5440 lineto +end_ol grestore +gsave 8.986533 7.900000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 9.299800 7.900000 translate 0.035278 -0.035278 scale +start_ol +384 2304 moveto +2368 2304 lineto +2368 1728 lineto +384 1728 lineto +384 2304 lineto +end_ol grestore +gsave 9.655400 7.900000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 9.968667 7.900000 translate 0.035278 -0.035278 scale +start_ol +2117 0 moveto +64 5440 lineto +824 5440 lineto +2528 860 lineto +4236 5440 lineto +4992 5440 lineto +2942 0 lineto +2117 0 lineto +end_ol grestore +gsave 10.637533 7.900000 translate 0.035278 -0.035278 scale +start_ol +4800 5056 moveto +4800 4288 lineto +4432 4643 4014 4817 conicto +3596 4992 3126 4992 conicto +2200 4992 1708 4408 conicto +1216 3824 1216 2718 conicto +1216 1616 1708 1032 conicto +2200 448 3126 448 conicto +3596 448 4014 622 conicto +4432 797 4800 1152 conicto +4800 384 lineto +4417 128 3988 0 conicto +3560 -128 3084 -128 conicto +1858 -128 1153 635 conicto +448 1398 448 2718 conicto +448 4042 1153 4805 conicto +1858 5568 3084 5568 conicto +3567 5568 3995 5440 conicto +4424 5312 4800 5056 conicto +end_ol grestore +gsave 11.323333 7.900000 translate 0.035278 -0.035278 scale +start_ol +4800 5056 moveto +4800 4288 lineto +4432 4643 4014 4817 conicto +3596 4992 3126 4992 conicto +2200 4992 1708 4408 conicto +1216 3824 1216 2718 conicto +1216 1616 1708 1032 conicto +2200 448 3126 448 conicto +3596 448 4014 622 conicto +4432 797 4800 1152 conicto +4800 384 lineto +4417 128 3988 0 conicto +3560 -128 3084 -128 conicto +1858 -128 1153 635 conicto +448 1398 448 2718 conicto +448 4042 1153 4805 conicto +1858 5568 3084 5568 conicto +3567 5568 3995 5440 conicto +4424 5312 4800 5056 conicto +end_ol grestore +gsave 8.360000 9.200000 translate 0.035278 -0.035278 scale +start_ol +832 5440 moveto +3712 5440 lineto +3712 4864 lineto +1600 4864 lineto +1600 3482 lineto +1752 3533 1905 3558 conicto +2058 3584 2212 3584 conicto +3081 3584 3588 3083 conicto +4096 2583 4096 1727 conicto +4096 848 3549 360 conicto +3002 -128 2007 -128 conicto +1666 -128 1310 -64 conicto +955 0 576 128 conicto +576 896 lineto +900 669 1246 558 conicto +1592 448 1977 448 conicto +2600 448 2964 792 conicto +3328 1137 3328 1727 conicto +3328 2319 2968 2663 conicto +2609 3008 1993 3008 conicto +1704 3008 1418 2945 conicto +1132 2883 832 2752 conicto +832 5440 lineto +end_ol grestore +gsave 8.986533 9.200000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 9.299800 9.200000 translate 0.035278 -0.035278 scale +start_ol +384 2304 moveto +2368 2304 lineto +2368 1728 lineto +384 1728 lineto +384 2304 lineto +end_ol grestore +gsave 9.655400 9.200000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 9.968667 9.200000 translate 0.035278 -0.035278 scale +start_ol +4800 5056 moveto +4800 4288 lineto +4432 4643 4014 4817 conicto +3596 4992 3126 4992 conicto +2200 4992 1708 4408 conicto +1216 3824 1216 2718 conicto +1216 1616 1708 1032 conicto +2200 448 3126 448 conicto +3596 448 4014 622 conicto +4432 797 4800 1152 conicto +4800 384 lineto +4417 128 3988 0 conicto +3560 -128 3084 -128 conicto +1858 -128 1153 635 conicto +448 1398 448 2718 conicto +448 4042 1153 4805 conicto +1858 5568 3084 5568 conicto +3567 5568 3995 5440 conicto +4424 5312 4800 5056 conicto +end_ol grestore +gsave 10.654467 9.200000 translate 0.035278 -0.035278 scale +start_ol +704 5440 moveto +1472 5440 lineto +1472 576 lineto +4096 576 lineto +4096 0 lineto +704 0 lineto +704 5440 lineto +end_ol grestore +gsave 11.204800 9.200000 translate 0.035278 -0.035278 scale +start_ol +704 5440 moveto +1472 5440 lineto +1472 3141 lineto +3870 5440 lineto +4800 5440 lineto +2148 2904 lineto +4992 0 lineto +4040 0 lineto +1472 2619 lineto +1472 0 lineto +704 0 lineto +704 5440 lineto +end_ol grestore +gsave 8.360000 10.500000 translate 0.035278 -0.035278 scale +start_ol +2400 3072 moveto +1914 3072 1629 2721 conicto +1344 2371 1344 1759 conicto +1344 1153 1629 800 conicto +1914 448 2400 448 conicto +2887 448 3171 800 conicto +3456 1153 3456 1759 conicto +3456 2371 3171 2721 conicto +2887 3072 2400 3072 conicto +3840 5376 moveto +3840 4736 lineto +3575 4860 3304 4926 conicto +3034 4992 2768 4992 conicto +2069 4992 1700 4496 conicto +1332 4000 1280 2996 conicto +1489 3312 1804 3480 conicto +2120 3648 2500 3648 conicto +3298 3648 3761 3140 conicto +4224 2633 4224 1759 conicto +4224 905 3734 388 conicto +3245 -128 2432 -128 conicto +1499 -128 1005 602 conicto +512 1332 512 2718 conicto +512 4020 1110 4794 conicto +1709 5568 2718 5568 conicto +2989 5568 3265 5520 conicto +3541 5472 3840 5376 conicto +end_ol grestore +gsave 8.986533 10.500000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 9.299800 10.500000 translate 0.035278 -0.035278 scale +start_ol +384 2304 moveto +2368 2304 lineto +2368 1728 lineto +384 1728 lineto +384 2304 lineto +end_ol grestore +gsave 9.655400 10.500000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 9.968667 10.500000 translate 0.035278 -0.035278 scale +start_ol +4416 723 moveto +4416 2176 lineto +3200 2176 lineto +3200 2752 lineto +5184 2752 lineto +5184 455 lineto +4759 167 4247 19 conicto +3735 -128 3154 -128 conicto +1883 -128 1165 624 conicto +448 1376 448 2718 conicto +448 4064 1167 4816 conicto +1887 5568 3162 5568 conicto +3693 5568 4172 5438 conicto +4651 5309 5056 5056 conicto +5056 4288 lineto +4647 4638 4187 4815 conicto +3727 4992 3220 4992 conicto +2220 4992 1718 4421 conicto +1216 3850 1216 2718 conicto +1216 1590 1710 1019 conicto +2204 448 3188 448 conicto +3572 448 3873 515 conicto +4175 582 4416 723 conicto +end_ol grestore +gsave 10.730667 10.500000 translate 0.035278 -0.035278 scale +start_ol +704 5440 moveto +1736 5440 lineto +4032 890 lineto +4032 5440 lineto +4800 5440 lineto +4800 0 lineto +3769 0 lineto +1472 4551 lineto +1472 0 lineto +704 0 lineto +704 5440 lineto +end_ol grestore +gsave 11.467267 10.500000 translate 0.035278 -0.035278 scale +start_ol +1472 4864 moveto +1472 576 lineto +2345 576 lineto +3453 576 3966 1093 conicto +4480 1610 4480 2726 conicto +4480 3834 3966 4349 conicto +3453 4864 2345 4864 conicto +1472 4864 lineto +704 5440 moveto +2235 5440 lineto +3791 5440 4519 4782 conicto +5248 4125 5248 2726 conicto +5248 1319 4516 659 conicto +3785 0 2235 0 conicto +704 0 lineto +704 5440 lineto +end_ol grestore +gsave 8.360000 11.800000 translate 0.035278 -0.035278 scale +start_ol +640 5440 moveto +4096 5440 lineto +4096 5126 lineto +2161 0 lineto +1408 0 lineto +3229 4864 lineto +640 4864 lineto +640 5440 lineto +end_ol grestore +gsave 8.986533 11.800000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 9.299800 11.800000 translate 0.035278 -0.035278 scale +start_ol +384 2304 moveto +2368 2304 lineto +2368 1728 lineto +384 1728 lineto +384 2304 lineto +end_ol grestore +gsave 9.655400 11.800000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 9.968667 11.800000 translate 0.035278 -0.035278 scale +start_ol +1472 4864 moveto +1472 576 lineto +2345 576 lineto +3453 576 3966 1093 conicto +4480 1610 4480 2726 conicto +4480 3834 3966 4349 conicto +3453 4864 2345 4864 conicto +1472 4864 lineto +704 5440 moveto +2235 5440 lineto +3791 5440 4519 4782 conicto +5248 4125 5248 2726 conicto +5248 1319 4516 659 conicto +3785 0 2235 0 conicto +704 0 lineto +704 5440 lineto +end_ol grestore +gsave 10.722200 11.800000 translate 0.035278 -0.035278 scale +start_ol +2575 2048 moveto +1735 2048 1411 1861 conicto +1088 1675 1088 1226 conicto +1088 868 1331 658 conicto +1574 448 1992 448 conicto +2568 448 2916 843 conicto +3264 1239 3264 1894 conicto +3264 2048 lineto +2575 2048 lineto +3904 2318 moveto +3904 0 lineto +3264 0 lineto +3264 576 lineto +3032 216 2684 44 conicto +2336 -128 1834 -128 conicto +1198 -128 823 224 conicto +448 577 448 1169 conicto +448 1859 911 2209 conicto +1374 2560 2293 2560 conicto +3264 2560 lineto +3264 2626 lineto +3264 3084 2957 3334 conicto +2651 3584 2096 3584 conicto +1744 3584 1410 3504 conicto +1077 3424 768 3264 conicto +768 3904 lineto +1134 4032 1479 4096 conicto +1824 4160 2151 4160 conicto +3033 4160 3468 3703 conicto +3904 3246 3904 2318 conicto +end_ol grestore +gsave 11.323333 11.800000 translate 0.035278 -0.035278 scale +start_ol +1344 5184 moveto +1344 4032 lineto +2688 4032 lineto +2688 3520 lineto +1344 3520 lineto +1344 1346 lineto +1344 855 1477 715 conicto +1610 576 2018 576 conicto +2688 576 lineto +2688 0 lineto +2018 0 lineto +1272 0 988 289 conicto +704 579 704 1346 conicto +704 3520 lineto +192 3520 lineto +192 4032 lineto +704 4032 lineto +704 5184 lineto +1344 5184 lineto +end_ol grestore +gsave 11.704333 11.800000 translate 0.035278 -0.035278 scale +start_ol +2575 2048 moveto +1735 2048 1411 1861 conicto +1088 1675 1088 1226 conicto +1088 868 1331 658 conicto +1574 448 1992 448 conicto +2568 448 2916 843 conicto +3264 1239 3264 1894 conicto +3264 2048 lineto +2575 2048 lineto +3904 2318 moveto +3904 0 lineto +3264 0 lineto +3264 576 lineto +3032 216 2684 44 conicto +2336 -128 1834 -128 conicto +1198 -128 823 224 conicto +448 577 448 1169 conicto +448 1859 911 2209 conicto +1374 2560 2293 2560 conicto +3264 2560 lineto +3264 2626 lineto +3264 3084 2957 3334 conicto +2651 3584 2096 3584 conicto +1744 3584 1410 3504 conicto +1077 3424 768 3264 conicto +768 3904 lineto +1134 4032 1479 4096 conicto +1824 4160 2151 4160 conicto +3033 4160 3468 3703 conicto +3904 3246 3904 2318 conicto +end_ol grestore +gsave 12.305467 11.800000 translate 0.035278 -0.035278 scale +start_ol +2947 4992 moveto +2152 4992 1684 4382 conicto +1216 3772 1216 2718 conicto +1216 1668 1684 1058 conicto +2152 448 2947 448 conicto +3743 448 4207 1058 conicto +4672 1668 4672 2718 conicto +4672 3772 4207 4382 conicto +3743 4992 2947 4992 conicto +2947 5568 moveto +4082 5568 4761 4794 conicto +5440 4020 5440 2718 conicto +5440 1420 4761 646 conicto +4082 -128 2947 -128 conicto +1810 -128 1129 644 conicto +448 1416 448 2718 conicto +448 4020 1129 4794 conicto +1810 5568 2947 5568 conicto +end_ol grestore +gsave 13.075933 11.800000 translate 0.035278 -0.035278 scale +start_ol +704 1560 moveto +704 4032 lineto +1344 4032 lineto +1344 1586 lineto +1344 1017 1573 732 conicto +1803 448 2263 448 conicto +2815 448 3135 788 conicto +3456 1129 3456 1717 conicto +3456 4032 lineto +4096 4032 lineto +4096 0 lineto +3456 0 lineto +3456 576 lineto +3211 219 2888 45 conicto +2566 -128 2138 -128 conicto +1434 -128 1069 302 conicto +704 732 704 1560 conicto +end_ol grestore +gsave 13.702467 11.800000 translate 0.035278 -0.035278 scale +start_ol +1344 5184 moveto +1344 4032 lineto +2688 4032 lineto +2688 3520 lineto +1344 3520 lineto +1344 1346 lineto +1344 855 1477 715 conicto +1610 576 2018 576 conicto +2688 576 lineto +2688 0 lineto +2018 0 lineto +1272 0 988 289 conicto +704 579 704 1346 conicto +704 3520 lineto +192 3520 lineto +192 4032 lineto +704 4032 lineto +704 5184 lineto +1344 5184 lineto +end_ol grestore +gsave 8.360000 13.100000 translate 0.035278 -0.035278 scale +start_ol +2366 2560 moveto +1860 2560 1570 2278 conicto +1280 1997 1280 1505 conicto +1280 1011 1570 729 conicto +1860 448 2366 448 conicto +2872 448 3164 731 conicto +3456 1015 3456 1505 conicto +3456 1997 3166 2278 conicto +2876 2560 2366 2560 conicto +1666 2871 moveto +1180 2990 910 3321 conicto +640 3652 640 4128 conicto +640 4794 1101 5181 conicto +1563 5568 2368 5568 conicto +3176 5568 3636 5181 conicto +4096 4794 4096 4128 conicto +4096 3652 3824 3321 conicto +3553 2990 3071 2871 conicto +3616 2748 3920 2387 conicto +4224 2027 4224 1507 conicto +4224 716 3743 294 conicto +3263 -128 2368 -128 conicto +1473 -128 992 294 conicto +512 716 512 1507 conicto +512 2027 817 2387 conicto +1122 2748 1666 2871 conicto +1408 4063 moveto +1408 3626 1660 3381 conicto +1912 3136 2367 3136 conicto +2818 3136 3073 3381 conicto +3328 3626 3328 4063 conicto +3328 4502 3073 4747 conicto +2818 4992 2367 4992 conicto +1912 4992 1660 4747 conicto +1408 4502 1408 4063 conicto +end_ol grestore +gsave 8.986533 13.100000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 9.299800 13.100000 translate 0.035278 -0.035278 scale +start_ol +384 2304 moveto +2368 2304 lineto +2368 1728 lineto +384 1728 lineto +384 2304 lineto +end_ol grestore +gsave 9.655400 13.100000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 9.968667 13.100000 translate 0.035278 -0.035278 scale +start_ol +704 5440 moveto +1736 5440 lineto +4032 890 lineto +4032 5440 lineto +4800 5440 lineto +4800 0 lineto +3769 0 lineto +1472 4551 lineto +1472 0 lineto +704 0 lineto +704 5440 lineto +end_ol grestore +gsave 10.705267 13.100000 translate 0.035278 -0.035278 scale +start_ol +4800 5056 moveto +4800 4288 lineto +4432 4643 4014 4817 conicto +3596 4992 3126 4992 conicto +2200 4992 1708 4408 conicto +1216 3824 1216 2718 conicto +1216 1616 1708 1032 conicto +2200 448 3126 448 conicto +3596 448 4014 622 conicto +4432 797 4800 1152 conicto +4800 384 lineto +4417 128 3988 0 conicto +3560 -128 3084 -128 conicto +1858 -128 1153 635 conicto +448 1398 448 2718 conicto +448 4042 1153 4805 conicto +1858 5568 3084 5568 conicto +3567 5568 3995 5440 conicto +4424 5312 4800 5056 conicto +end_ol grestore +gsave 8.360000 14.400000 translate 0.035278 -0.035278 scale +start_ol +832 64 moveto +832 704 lineto +1104 580 1383 514 conicto +1663 448 1931 448 conicto +2647 448 3024 942 conicto +3402 1436 3456 2444 conicto +3250 2129 2933 1960 conicto +2617 1792 2234 1792 conicto +1439 1792 975 2297 conicto +512 2802 512 3677 conicto +512 4533 1002 5050 conicto +1492 5568 2307 5568 conicto +3241 5568 3732 4838 conicto +4224 4108 4224 2718 conicto +4224 1420 3615 646 conicto +3007 -128 1979 -128 conicto +1704 -128 1420 -80 conicto +1137 -32 832 64 conicto +2336 2368 moveto +2823 2368 3107 2718 conicto +3392 3069 3392 3681 conicto +3392 4287 3107 4639 conicto +2823 4992 2336 4992 conicto +1849 4992 1564 4639 conicto +1280 4287 1280 3681 conicto +1280 3069 1564 2718 conicto +1849 2368 2336 2368 conicto +end_ol grestore +gsave 8.986533 14.400000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 9.299800 14.400000 translate 0.035278 -0.035278 scale +start_ol +384 2304 moveto +2368 2304 lineto +2368 1728 lineto +384 1728 lineto +384 2304 lineto +end_ol grestore +gsave 9.655400 14.400000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 9.968667 14.400000 translate 0.035278 -0.035278 scale +start_ol +704 5440 moveto +1736 5440 lineto +4032 890 lineto +4032 5440 lineto +4800 5440 lineto +4800 0 lineto +3769 0 lineto +1472 4551 lineto +1472 0 lineto +704 0 lineto +704 5440 lineto +end_ol grestore +gsave 10.705267 14.400000 translate 0.035278 -0.035278 scale +start_ol +4800 5056 moveto +4800 4288 lineto +4432 4643 4014 4817 conicto +3596 4992 3126 4992 conicto +2200 4992 1708 4408 conicto +1216 3824 1216 2718 conicto +1216 1616 1708 1032 conicto +2200 448 3126 448 conicto +3596 448 4014 622 conicto +4432 797 4800 1152 conicto +4800 384 lineto +4417 128 3988 0 conicto +3560 -128 3084 -128 conicto +1858 -128 1153 635 conicto +448 1398 448 2718 conicto +448 4042 1153 4805 conicto +1858 5568 3084 5568 conicto +3567 5568 3995 5440 conicto +4424 5312 4800 5056 conicto +end_ol grestore +1.000000 1.000000 1.000000 srgb +n 30.000000 1.000000 m 30.000000 16.000000 l 35.000000 16.000000 l 35.000000 1.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 30.000000 1.000000 m 30.000000 16.000000 l 35.000000 16.000000 l 35.000000 1.000000 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0 slc +0 slj +[] 0 sd +1.000000 1.000000 1.000000 srgb +n 30.000000 1.750000 m 28.500000 1.750000 l 28.500000 1.000000 l 27.000000 2.500000 l 28.500000 4.000000 l 28.500000 3.250000 l 30.000000 3.250000 l ef +0.000000 0.000000 0.000000 srgb +n 30.000000 1.750000 m 28.500000 1.750000 l 28.500000 1.000000 l 27.000000 2.500000 l 28.500000 4.000000 l 28.500000 3.250000 l 30.000000 3.250000 l cp s +0.010000 slw +0 slc +0 slj +[] 0 sd +n 30.000000 1.750000 m 28.500000 1.750000 l 28.500000 1.000000 l 27.000000 2.500000 l 28.500000 4.000000 l 28.500000 3.250000 l 30.000000 3.250000 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0 slc +0 slj +[] 0 sd +1.000000 1.000000 1.000000 srgb +n 30.000000 13.750000 m 28.500000 13.750000 l 28.500000 13.000000 l 27.000000 14.500000 l 28.500000 16.000000 l 28.500000 15.250000 l 30.000000 15.250000 l ef +0.000000 0.000000 0.000000 srgb +n 30.000000 13.750000 m 28.500000 13.750000 l 28.500000 13.000000 l 27.000000 14.500000 l 28.500000 16.000000 l 28.500000 15.250000 l 30.000000 15.250000 l cp s +0.010000 slw +0 slc +0 slj +[] 0 sd +n 30.000000 13.750000 m 28.500000 13.750000 l 28.500000 13.000000 l 27.000000 14.500000 l 28.500000 16.000000 l 28.500000 15.250000 l 30.000000 15.250000 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0 slc +0 slj +[] 0 sd +1.000000 1.000000 1.000000 srgb +n 30.000000 9.750000 m 28.500000 9.750000 l 28.500000 9.000000 l 27.000000 10.500000 l 28.500000 12.000000 l 28.500000 11.250000 l 30.000000 11.250000 l ef +0.000000 0.000000 0.000000 srgb +n 30.000000 9.750000 m 28.500000 9.750000 l 28.500000 9.000000 l 27.000000 10.500000 l 28.500000 12.000000 l 28.500000 11.250000 l 30.000000 11.250000 l cp s +0.010000 slw +0 slc +0 slj +[] 0 sd +n 30.000000 9.750000 m 28.500000 9.750000 l 28.500000 9.000000 l 27.000000 10.500000 l 28.500000 12.000000 l 28.500000 11.250000 l 30.000000 11.250000 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0 slc +0 slj +[] 0 sd +1.000000 1.000000 1.000000 srgb +n 30.000000 5.750000 m 28.500000 5.750000 l 28.500000 5.000000 l 27.000000 6.500000 l 28.500000 8.000000 l 28.500000 7.250000 l 30.000000 7.250000 l ef +0.000000 0.000000 0.000000 srgb +n 30.000000 5.750000 m 28.500000 5.750000 l 28.500000 5.000000 l 27.000000 6.500000 l 28.500000 8.000000 l 28.500000 7.250000 l 30.000000 7.250000 l cp s +0.010000 slw +0 slc +0 slj +[] 0 sd +n 30.000000 5.750000 m 28.500000 5.750000 l 28.500000 5.000000 l 27.000000 6.500000 l 28.500000 8.000000 l 28.500000 7.250000 l 30.000000 7.250000 l cp s +gsave 32.000000 3.000000 translate 0.035278 -0.035278 scale +start_ol +1088 8320 moveto +2813 8320 lineto +4893 2659 lineto +6985 8320 lineto +8704 8320 lineto +8704 0 lineto +7552 0 lineto +7552 7306 lineto +5450 1600 lineto +4342 1600 lineto +2240 7306 lineto +2240 0 lineto +1088 0 lineto +1088 8320 lineto +end_ol grestore +gsave 32.000000 5.000000 translate 0.035278 -0.035278 scale +start_ol +5568 5952 moveto +5568 4992 lineto +5135 5249 4700 5376 conicto +4265 5504 3820 5504 conicto +2827 5504 2277 4874 conicto +1728 4244 1728 3104 conicto +1728 1965 2277 1334 conicto +2827 704 3820 704 conicto +4265 704 4700 832 conicto +5135 961 5568 1216 conicto +5568 256 lineto +5139 31 4680 -80 conicto +4222 -192 3705 -192 conicto +2298 -192 1469 699 conicto +640 1591 640 3104 conicto +640 4640 1477 5520 conicto +2314 6400 3771 6400 conicto +4245 6400 4695 6288 conicto +5145 6176 5568 5952 conicto +end_ol grestore +gsave 32.000000 9.000000 translate 0.035278 -0.035278 scale +start_ol +2240 4032 moveto +2240 960 lineto +4062 960 lineto +4991 960 5439 1339 conicto +5888 1718 5888 2499 conicto +5888 3285 5439 3658 conicto +4991 4032 4062 4032 conicto +2240 4032 lineto +2240 7360 moveto +2240 4928 lineto +3921 4928 lineto +4753 4928 5160 5228 conicto +5568 5528 5568 6144 conicto +5568 6754 5160 7057 conicto +4753 7360 3921 7360 conicto +2240 7360 lineto +1088 8320 moveto +4005 8320 lineto +5309 8320 6014 7792 conicto +6720 7264 6720 6290 conicto +6720 5536 6357 5090 conicto +5995 4645 5293 4535 conicto +6122 4355 6581 3783 conicto +7040 3211 7040 2355 conicto +7040 1228 6280 614 conicto +5521 0 4118 0 conicto +1088 0 lineto +1088 8320 lineto +end_ol grestore +gsave 32.000000 11.000000 translate 0.035278 -0.035278 scale +start_ol +6144 8000 moveto +6144 6912 lineto +5502 7235 4934 7393 conicto +4366 7552 3837 7552 conicto +2917 7552 2418 7190 conicto +1920 6828 1920 6161 conicto +1920 5601 2254 5315 conicto +2589 5030 3523 4855 conicto +4209 4715 lineto +5464 4477 6060 3873 conicto +6656 3270 6656 2259 conicto +6656 1053 5845 430 conicto +5034 -192 3468 -192 conicto +2878 -192 2211 -63 conicto +1545 66 832 320 conicto +832 1472 lineto +1521 1091 2182 897 conicto +2843 704 3482 704 conicto +4450 704 4977 1083 conicto +5504 1462 5504 2165 conicto +5504 2777 5124 3123 conicto +4744 3469 3877 3641 conicto +3185 3775 lineto +1909 4027 1338 4565 conicto +768 5103 768 6061 conicto +768 7170 1548 7809 conicto +2329 8448 3699 8448 conicto +4287 8448 4896 8336 conicto +5506 8224 6144 8000 conicto +end_ol grestore +gsave 32.000000 13.000000 translate 0.035278 -0.035278 scale +start_ol +2240 7360 moveto +2240 4288 lineto +3661 4288 lineto +4450 4288 4881 4688 conicto +5312 5088 5312 5827 conicto +5312 6560 4881 6960 conicto +4450 7360 3661 7360 conicto +2240 7360 lineto +1088 8320 moveto +3661 8320 lineto +5046 8320 5755 7686 conicto +6464 7052 6464 5827 conicto +6464 4591 5755 3959 conicto +5046 3328 3661 3328 conicto +2240 3328 lineto +2240 0 lineto +1088 0 lineto +1088 8320 lineto +end_ol grestore +gsave 28.000000 3.000000 translate 0.035278 -0.035278 scale +start_ol +704 5440 moveto +3840 5440 lineto +3840 4864 lineto +1472 4864 lineto +1472 3200 lineto +3584 3200 lineto +3584 2624 lineto +1472 2624 lineto +1472 0 lineto +704 0 lineto +704 5440 lineto +end_ol grestore +gsave 28.550333 3.000000 translate 0.035278 -0.035278 scale +start_ol +4032 5312 moveto +4032 4608 lineto +3614 4802 3244 4897 conicto +2874 4992 2529 4992 conicto +1930 4992 1605 4755 conicto +1280 4519 1280 4082 conicto +1280 3716 1495 3529 conicto +1711 3343 2311 3228 conicto +2753 3135 lineto +3573 2976 3962 2575 conicto +4352 2174 4352 1502 conicto +4352 700 3817 286 conicto +3283 -128 2251 -128 conicto +1861 -128 1421 -47 conicto +982 34 512 192 conicto +512 960 lineto +965 706 1400 577 conicto +1835 448 2255 448 conicto +2892 448 3238 701 conicto +3584 955 3584 1426 conicto +3584 1837 3340 2068 conicto +3096 2299 2539 2415 conicto +2094 2505 lineto +1259 2670 885 3022 conicto +512 3375 512 4004 conicto +512 4731 1023 5149 conicto +1534 5568 2432 5568 conicto +2817 5568 3216 5504 conicto +3615 5440 4032 5312 conicto +end_ol grestore +gsave 29.176867 3.000000 translate 0.035278 -0.035278 scale +start_ol +448 5440 moveto +1226 5440 lineto +2556 3418 lineto +3893 5440 lineto +4672 5440 lineto +2951 2828 lineto +4800 0 lineto +4017 0 lineto +2503 2314 lineto +978 0 lineto +192 0 lineto +2115 2904 lineto +448 5440 lineto +end_ol grestore +gsave 28.000000 7.000000 translate 0.035278 -0.035278 scale +start_ol +1472 4864 moveto +1472 576 lineto +2345 576 lineto +3453 576 3966 1093 conicto +4480 1610 4480 2726 conicto +4480 3834 3966 4349 conicto +3453 4864 2345 4864 conicto +1472 4864 lineto +704 5440 moveto +2235 5440 lineto +3791 5440 4519 4782 conicto +5248 4125 5248 2726 conicto +5248 1319 4516 659 conicto +3785 0 2235 0 conicto +704 0 lineto +704 5440 lineto +end_ol grestore +gsave 28.753533 7.000000 translate 0.035278 -0.035278 scale +start_ol +448 5440 moveto +1226 5440 lineto +2556 3418 lineto +3893 5440 lineto +4672 5440 lineto +2951 2828 lineto +4800 0 lineto +4017 0 lineto +2503 2314 lineto +978 0 lineto +192 0 lineto +2115 2904 lineto +448 5440 lineto +end_ol grestore +gsave 28.000000 11.000000 translate 0.035278 -0.035278 scale +start_ol +4800 5056 moveto +4800 4288 lineto +4432 4643 4014 4817 conicto +3596 4992 3126 4992 conicto +2200 4992 1708 4408 conicto +1216 3824 1216 2718 conicto +1216 1616 1708 1032 conicto +2200 448 3126 448 conicto +3596 448 4014 622 conicto +4432 797 4800 1152 conicto +4800 384 lineto +4417 128 3988 0 conicto +3560 -128 3084 -128 conicto +1858 -128 1153 635 conicto +448 1398 448 2718 conicto +448 4042 1153 4805 conicto +1858 5568 3084 5568 conicto +3567 5568 3995 5440 conicto +4424 5312 4800 5056 conicto +end_ol grestore +gsave 28.685800 11.000000 translate 0.035278 -0.035278 scale +start_ol +704 5440 moveto +1472 5440 lineto +1472 3141 lineto +3870 5440 lineto +4800 5440 lineto +2148 2904 lineto +4992 0 lineto +4040 0 lineto +1472 2619 lineto +1472 0 lineto +704 0 lineto +704 5440 lineto +end_ol grestore +gsave 29.329267 11.000000 translate 0.035278 -0.035278 scale +start_ol +448 5440 moveto +1226 5440 lineto +2556 3418 lineto +3893 5440 lineto +4672 5440 lineto +2951 2828 lineto +4800 0 lineto +4017 0 lineto +2503 2314 lineto +978 0 lineto +192 0 lineto +2115 2904 lineto +448 5440 lineto +end_ol grestore +gsave 28.000000 15.000000 translate 0.035278 -0.035278 scale +start_ol +1472 4864 moveto +1472 576 lineto +2345 576 lineto +3453 576 3966 1093 conicto +4480 1610 4480 2726 conicto +4480 3834 3966 4349 conicto +3453 4864 2345 4864 conicto +1472 4864 lineto +704 5440 moveto +2235 5440 lineto +3791 5440 4519 4782 conicto +5248 4125 5248 2726 conicto +5248 1319 4516 659 conicto +3785 0 2235 0 conicto +704 0 lineto +704 5440 lineto +end_ol grestore +gsave 28.753533 15.000000 translate 0.035278 -0.035278 scale +start_ol +3300 2544 moveto +3535 2464 3757 2204 conicto +3979 1945 4202 1490 conicto +4928 0 lineto +4159 0 lineto +3471 1398 lineto +3203 1946 2952 2125 conicto +2701 2304 2267 2304 conicto +1472 2304 lineto +1472 0 lineto +704 0 lineto +704 5440 lineto +2390 5440 lineto +3314 5440 3769 5049 conicto +4224 4658 4224 3869 conicto +4224 3354 3987 3014 conicto +3751 2675 3300 2544 conicto +1472 4864 moveto +1472 2880 lineto +2390 2880 lineto +2918 2880 3187 3133 conicto +3456 3386 3456 3876 conicto +3456 4366 3187 4615 conicto +2918 4864 2390 4864 conicto +1472 4864 lineto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0 slc +0 slj +[] 0 sd +n 18.000000 16.000000 m 18.000000 17.000000 l s +0 slc +0 slj +[] 0 sd +n 17.000000 17.000000 m 19.000000 17.000000 l s +0 slc +0 slj +[] 0 sd +n 17.335000 17.500000 m 18.665000 17.500000 l s +0 slc +0 slj +[] 0 sd +n 17.670000 18.000000 m 18.330000 18.000000 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0 slc +0 slj +[] 0 sd +1.000000 1.000000 1.000000 srgb +n 14.000000 3.427406 m 14.650000 3.427406 l 14.650000 3.177406 l 15.300000 3.677406 l 14.650000 4.177406 l 14.650000 3.927406 l 14.000000 3.927406 l ef +0.000000 0.000000 0.000000 srgb +n 14.000000 3.427406 m 14.650000 3.427406 l 14.650000 3.177406 l 15.300000 3.677406 l 14.650000 4.177406 l 14.650000 3.927406 l 14.000000 3.927406 l cp s +0.010000 slw +0 slc +0 slj +[] 0 sd +n 14.000000 3.427406 m 14.650000 3.427406 l 14.650000 3.177406 l 15.300000 3.677406 l 14.650000 4.177406 l 14.650000 3.927406 l 14.000000 3.927406 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0 slc +0 slj +[] 0 sd +1.000000 1.000000 1.000000 srgb +n 14.017437 4.668104 m 14.667437 4.668104 l 14.667437 4.418104 l 15.317437 4.918104 l 14.667437 5.418104 l 14.667437 5.168104 l 14.017437 5.168104 l ef +0.000000 0.000000 0.000000 srgb +n 14.017437 4.668104 m 14.667437 4.668104 l 14.667437 4.418104 l 15.317437 4.918104 l 14.667437 5.418104 l 14.667437 5.168104 l 14.017437 5.168104 l cp s +0.010000 slw +0 slc +0 slj +[] 0 sd +n 14.017437 4.668104 m 14.667437 4.668104 l 14.667437 4.418104 l 15.317437 4.918104 l 14.667437 5.418104 l 14.667437 5.168104 l 14.017437 5.168104 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0 slc +0 slj +[] 0 sd +1.000000 1.000000 1.000000 srgb +n 14.017437 5.945427 m 14.667437 5.945427 l 14.667437 5.695427 l 15.317437 6.195427 l 14.667437 6.695427 l 14.667437 6.445427 l 14.017437 6.445427 l ef +0.000000 0.000000 0.000000 srgb +n 14.017437 5.945427 m 14.667437 5.945427 l 14.667437 5.695427 l 15.317437 6.195427 l 14.667437 6.695427 l 14.667437 6.445427 l 14.017437 6.445427 l cp s +0.010000 slw +0 slc +0 slj +[] 0 sd +n 14.017437 5.945427 m 14.667437 5.945427 l 14.667437 5.695427 l 15.317437 6.195427 l 14.667437 6.695427 l 14.667437 6.445427 l 14.017437 6.445427 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0 slc +0 slj +[] 0 sd +1.000000 1.000000 1.000000 srgb +n 14.034874 7.186124 m 14.684874 7.186124 l 14.684874 6.936124 l 15.334874 7.436124 l 14.684874 7.936124 l 14.684874 7.686124 l 14.034874 7.686124 l ef +0.000000 0.000000 0.000000 srgb +n 14.034874 7.186124 m 14.684874 7.186124 l 14.684874 6.936124 l 15.334874 7.436124 l 14.684874 7.936124 l 14.684874 7.686124 l 14.034874 7.686124 l cp s +0.010000 slw +0 slc +0 slj +[] 0 sd +n 14.034874 7.186124 m 14.684874 7.186124 l 14.684874 6.936124 l 15.334874 7.436124 l 14.684874 7.936124 l 14.684874 7.686124 l 14.034874 7.686124 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0 slc +0 slj +[] 0 sd +1.000000 1.000000 1.000000 srgb +n 14.020985 8.528457 m 14.670985 8.528457 l 14.670985 8.278457 l 15.320985 8.778457 l 14.670985 9.278457 l 14.670985 9.028457 l 14.020985 9.028457 l ef +0.000000 0.000000 0.000000 srgb +n 14.020985 8.528457 m 14.670985 8.528457 l 14.670985 8.278457 l 15.320985 8.778457 l 14.670985 9.278457 l 14.670985 9.028457 l 14.020985 9.028457 l cp s +0.010000 slw +0 slc +0 slj +[] 0 sd +n 14.020985 8.528457 m 14.670985 8.528457 l 14.670985 8.278457 l 15.320985 8.778457 l 14.670985 9.278457 l 14.670985 9.028457 l 14.020985 9.028457 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0 slc +0 slj +[] 0 sd +1.000000 1.000000 1.000000 srgb +n 14.038422 9.769155 m 14.688422 9.769155 l 14.688422 9.519155 l 15.338422 10.019155 l 14.688422 10.519155 l 14.688422 10.269155 l 14.038422 10.269155 l ef +0.000000 0.000000 0.000000 srgb +n 14.038422 9.769155 m 14.688422 9.769155 l 14.688422 9.519155 l 15.338422 10.019155 l 14.688422 10.519155 l 14.688422 10.269155 l 14.038422 10.269155 l cp s +0.010000 slw +0 slc +0 slj +[] 0 sd +n 14.038422 9.769155 m 14.688422 9.769155 l 14.688422 9.519155 l 15.338422 10.019155 l 14.688422 10.519155 l 14.688422 10.269155 l 14.038422 10.269155 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0 slc +0 slj +[] 0 sd +1.000000 1.000000 1.000000 srgb +n 14.038422 11.046478 m 14.688422 11.046478 l 14.688422 10.796478 l 15.338422 11.296478 l 14.688422 11.796478 l 14.688422 11.546478 l 14.038422 11.546478 l ef +0.000000 0.000000 0.000000 srgb +n 14.038422 11.046478 m 14.688422 11.046478 l 14.688422 10.796478 l 15.338422 11.296478 l 14.688422 11.796478 l 14.688422 11.546478 l 14.038422 11.546478 l cp s +0.010000 slw +0 slc +0 slj +[] 0 sd +n 14.038422 11.046478 m 14.688422 11.046478 l 14.688422 10.796478 l 15.338422 11.296478 l 14.688422 11.796478 l 14.688422 11.546478 l 14.038422 11.546478 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0 slc +0 slj +[] 0 sd +1.000000 1.000000 1.000000 srgb +n 14.020378 12.322657 m 14.670378 12.322657 l 14.670378 12.072657 l 15.320378 12.572657 l 14.670378 13.072657 l 14.670378 12.822657 l 14.020378 12.822657 l ef +0.000000 0.000000 0.000000 srgb +n 14.020378 12.322657 m 14.670378 12.322657 l 14.670378 12.072657 l 15.320378 12.572657 l 14.670378 13.072657 l 14.670378 12.822657 l 14.020378 12.822657 l cp s +0.010000 slw +0 slc +0 slj +[] 0 sd +n 14.020378 12.322657 m 14.670378 12.322657 l 14.670378 12.072657 l 15.320378 12.572657 l 14.670378 13.072657 l 14.670378 12.822657 l 14.020378 12.822657 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0 slc +0 slj +[] 0 sd +1.000000 1.000000 1.000000 srgb +n 13.985504 13.779674 m 14.635504 13.779674 l 14.635504 13.529674 l 15.285504 14.029674 l 14.635504 14.529674 l 14.635504 14.279674 l 13.985504 14.279674 l ef +0.000000 0.000000 0.000000 srgb +n 13.985504 13.779674 m 14.635504 13.779674 l 14.635504 13.529674 l 15.285504 14.029674 l 14.635504 14.529674 l 14.635504 14.279674 l 13.985504 14.279674 l cp s +0.010000 slw +0 slc +0 slj +[] 0 sd +n 13.985504 13.779674 m 14.635504 13.779674 l 14.635504 13.529674 l 15.285504 14.029674 l 14.635504 14.529674 l 14.635504 14.279674 l 13.985504 14.279674 l cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 15.317437 6.195427 m 18.000000 6.195427 l 18.000000 16.000000 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 15.338422 10.019155 m 18.000000 10.019155 l 18.000000 16.000000 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 15.320985 8.778457 m 21.160493 8.778457 l 21.160493 10.500000 l 27.000000 10.500000 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 15.300000 3.677406 m 21.150000 3.677406 l 21.150000 2.500000 l 27.000000 2.500000 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 15.317437 4.918104 m 21.158719 4.918104 l 21.158719 6.500000 l 27.000000 6.500000 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 15.338422 11.296478 m 21.169211 11.296478 l 21.169211 14.500000 l 27.000000 14.500000 l s +n 17.988722 10.012543 0.162683 0.162683 0 360 ellipse f +0.100000 slw +[] 0 sd +[] 0 sd +n 17.988722 10.012543 0.162683 0.162683 0 360 ellipse cp s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +0 slj +0 slc +0 slj +[] 0 sd +1.000000 1.000000 1.000000 srgb +n 16.865887 -1.786682 m 17.537887 -0.314682 l 16.193887 -0.314682 l ef +0.000000 0.000000 0.000000 srgb +n 16.865887 -1.786682 m 17.537887 -0.314682 l 16.193887 -0.314682 l cp s +0.010000 slw +0 slc +0 slj +[] 0 sd +n 16.865887 -1.786682 m 17.537887 -0.314682 l 16.193887 -0.314682 l cp s +gsave 16.001887 -2.042682 translate 0.035278 -0.035278 scale +start_ol +2464 0 moveto +64 6272 lineto +953 6272 lineto +2943 991 lineto +4939 6272 lineto +5824 6272 lineto +3428 0 lineto +2464 0 lineto +end_ol grestore +gsave 16.780820 -2.042682 translate 0.035278 -0.035278 scale +start_ol +4224 4480 moveto +4224 3776 lineto +3900 3968 3573 4064 conicto +3246 4160 2913 4160 conicto +2168 4160 1756 3680 conicto +1344 3201 1344 2336 conicto +1344 1470 1756 991 conicto +2168 512 2913 512 conicto +3246 512 3573 608 conicto +3900 704 4224 896 conicto +4224 192 lineto +3902 31 3556 -48 conicto +3210 -128 2821 -128 conicto +1761 -128 1136 538 conicto +512 1204 512 2336 conicto +512 3484 1143 4142 conicto +1774 4800 2871 4800 conicto +3227 4800 3566 4720 conicto +3906 4641 4224 4480 conicto +end_ol grestore +gsave 17.407353 -2.042682 translate 0.035278 -0.035278 scale +start_ol +4224 4480 moveto +4224 3776 lineto +3900 3968 3573 4064 conicto +3246 4160 2913 4160 conicto +2168 4160 1756 3680 conicto +1344 3201 1344 2336 conicto +1344 1470 1756 991 conicto +2168 512 2913 512 conicto +3246 512 3573 608 conicto +3900 704 4224 896 conicto +4224 192 lineto +3902 31 3556 -48 conicto +3210 -128 2821 -128 conicto +1761 -128 1136 538 conicto +512 1204 512 2336 conicto +512 3484 1143 4142 conicto +1774 4800 2871 4800 conicto +3227 4800 3566 4720 conicto +3906 4641 4224 4480 conicto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0 slc +n 15.334874 7.436124 m 16.865887 7.436124 l 16.865887 -0.314682 l s +showpage diff --git a/tools/efsl-0.3.6/docs/schematics/sector.dia b/tools/efsl-0.3.6/docs/schematics/sector.dia new file mode 100644 index 0000000..852c85d Binary files /dev/null and b/tools/efsl-0.3.6/docs/schematics/sector.dia differ diff --git a/tools/efsl-0.3.6/docs/schematics/sector.eps b/tools/efsl-0.3.6/docs/schematics/sector.eps new file mode 100644 index 0000000..1146c2e --- /dev/null +++ b/tools/efsl-0.3.6/docs/schematics/sector.eps @@ -0,0 +1,1407 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/len/DSR-X20/len/efsl/docs/schematics/sector.dia +%%Creator: Dia v0.94 +%%CreationDate: Mon May 2 13:27:40 2005 +%%For: len +%%Orientation: Portrait +%%Magnification: 1.0000 +%%BoundingBox: 0 0 910 202 +%%BeginSetup +%%EndSetup +%%EndComments +%%BeginProlog +[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright +/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one +/two /three /four /five /six /seven /eight /nine /colon /semicolon +/less /equal /greater /question /at /A /B /C /D /E +/F /G /H /I /J /K /L /M /N /O +/P /Q /R /S /T /U /V /W /X /Y +/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c +/d /e /f /g /h /i /j /k /l /m +/n /o /p /q /r /s /t /u /v /w +/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright +/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior +/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf +/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla +/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde +/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex +/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring +/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis +/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave +/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def +/cp {closepath} bind def +/c {curveto} bind def +/f {fill} bind def +/a {arc} bind def +/ef {eofill} bind def +/ex {exch} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth pop} bind def +/tr {translate} bind def + +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/ellipse +{ ellipsedict begin + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def /savematrix mtrx currentmatrix def + x y tr xrad yrad sc + 0 0 1 startangle endangle arc + savematrix setmatrix + end +} def + +/mergeprocs { +dup length +3 -1 roll +dup +length +dup +5 1 roll +3 -1 roll +add +array cvx +dup +3 -1 roll +0 exch +putinterval +dup +4 2 roll +putinterval +} bind def +/dpi_x 300 def +/dpi_y 300 def +/conicto { + /to_y exch def + /to_x exch def + /conic_cntrl_y exch def + /conic_cntrl_x exch def + currentpoint + /p0_y exch def + /p0_x exch def + /p1_x p0_x conic_cntrl_x p0_x sub 2 3 div mul add def + /p1_y p0_y conic_cntrl_y p0_y sub 2 3 div mul add def + /p2_x p1_x to_x p0_x sub 1 3 div mul add def + /p2_y p1_y to_y p0_y sub 1 3 div mul add def + p1_x p1_y p2_x p2_y to_x to_y curveto +} bind def +/start_ol { gsave 1.1 dpi_x div dup scale} bind def +/end_ol { closepath fill grestore } bind def +28.346000 -28.346000 scale +-6.950000 -16.050000 translate +%%EndProlog + + +1.000000 1.000000 1.000000 srgb +n 7.000000 9.000000 m 7.000000 16.000000 l 39.000000 16.000000 l 39.000000 9.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 7.000000 9.000000 m 7.000000 16.000000 l 39.000000 16.000000 l 39.000000 9.000000 l cp s +1.000000 1.000000 1.000000 srgb +n 8.000000 11.000000 m 8.000000 15.000000 l 23.000000 15.000000 l 23.000000 11.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 8.000000 11.000000 m 8.000000 15.000000 l 23.000000 15.000000 l 23.000000 11.000000 l cp s +1.000000 1.000000 1.000000 srgb +n 9.000000 13.000000 m 9.000000 14.000000 l 13.000000 14.000000 l 13.000000 13.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 9.000000 13.000000 m 9.000000 14.000000 l 13.000000 14.000000 l 13.000000 13.000000 l cp s +gsave 10.100000 13.700000 translate 0.035278 -0.035278 scale +start_ol +896 1600 moveto +896 384 lineto +1632 384 lineto +2007 384 2187 534 conicto +2368 684 2368 993 conicto +2368 1304 2187 1452 conicto +2007 1600 1632 1600 conicto +896 1600 lineto +896 2944 moveto +896 1984 lineto +1575 1984 lineto +1911 1984 2075 2102 conicto +2240 2221 2240 2464 conicto +2240 2705 2075 2824 conicto +1911 2944 1575 2944 conicto +896 2944 lineto +448 3328 moveto +1608 3328 lineto +2127 3328 2407 3117 conicto +2688 2906 2688 2517 conicto +2688 2216 2546 2037 conicto +2404 1859 2129 1815 conicto +2455 1743 2635 1514 conicto +2816 1286 2816 943 conicto +2816 492 2514 246 conicto +2212 0 1654 0 conicto +448 0 lineto +448 3328 lineto +end_ol grestore +gsave 10.514867 13.700000 translate 0.035278 -0.035278 scale +start_ol +1477 -262 moveto +1305 -695 1142 -827 conicto +980 -960 707 -960 conicto +384 -960 lineto +384 -640 lineto +622 -640 lineto +789 -640 881 -555 conicto +974 -471 1085 -156 conicto +1159 33 lineto +128 2496 lineto +590 2496 lineto +1361 544 lineto +2131 2496 lineto +2560 2496 lineto +1477 -262 lineto +end_ol grestore +gsave 10.878933 13.700000 translate 0.035278 -0.035278 scale +start_ol +832 3200 moveto +832 2496 lineto +1664 2496 lineto +1664 2176 lineto +832 2176 lineto +832 804 lineto +832 495 914 407 conicto +997 320 1248 320 conicto +1664 320 lineto +1664 0 lineto +1248 0 lineto +793 0 620 173 conicto +448 347 448 804 conicto +448 2176 lineto +128 2176 lineto +128 2496 lineto +448 2496 lineto +448 3200 lineto +832 3200 lineto +end_ol grestore +gsave 11.116000 13.700000 translate 0.035278 -0.035278 scale +start_ol +2624 1352 moveto +2624 1152 lineto +704 1152 lineto +731 715 960 485 conicto +1189 256 1597 256 conicto +1834 256 2056 320 conicto +2278 384 2496 512 conicto +2496 128 lineto +2273 34 2039 -15 conicto +1805 -64 1565 -64 conicto +961 -64 608 284 conicto +256 632 256 1225 conicto +256 1839 595 2199 conicto +934 2560 1509 2560 conicto +2024 2560 2324 2235 conicto +2624 1910 2624 1352 conicto +2240 1472 moveto +2235 1822 2043 2031 conicto +1852 2240 1537 2240 conicto +1180 2240 965 2038 conicto +750 1836 718 1470 conicto +2240 1472 lineto +end_ol grestore +gsave 11.488533 13.700000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 11.683267 13.700000 translate 0.035278 -0.035278 scale +start_ol +1471 3008 moveto +1120 3008 944 2672 conicto +768 2336 768 1663 conicto +768 992 944 656 conicto +1120 320 1471 320 conicto +1824 320 2000 656 conicto +2176 992 2176 1663 conicto +2176 2336 2000 2672 conicto +1824 3008 1471 3008 conicto +1472 3392 moveto +2033 3392 2328 2949 conicto +2624 2506 2624 1663 conicto +2624 822 2328 379 conicto +2033 -64 1472 -64 conicto +911 -64 615 379 conicto +320 822 320 1663 conicto +320 2506 615 2949 conicto +911 3392 1472 3392 conicto +end_ol grestore +1.000000 1.000000 1.000000 srgb +n 13.000000 13.000000 m 13.000000 14.000000 l 17.000000 14.000000 l 17.000000 13.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 13.000000 13.000000 m 13.000000 14.000000 l 17.000000 14.000000 l 17.000000 13.000000 l cp s +gsave 14.100000 13.700000 translate 0.035278 -0.035278 scale +start_ol +896 1600 moveto +896 384 lineto +1632 384 lineto +2007 384 2187 534 conicto +2368 684 2368 993 conicto +2368 1304 2187 1452 conicto +2007 1600 1632 1600 conicto +896 1600 lineto +896 2944 moveto +896 1984 lineto +1575 1984 lineto +1911 1984 2075 2102 conicto +2240 2221 2240 2464 conicto +2240 2705 2075 2824 conicto +1911 2944 1575 2944 conicto +896 2944 lineto +448 3328 moveto +1608 3328 lineto +2127 3328 2407 3117 conicto +2688 2906 2688 2517 conicto +2688 2216 2546 2037 conicto +2404 1859 2129 1815 conicto +2455 1743 2635 1514 conicto +2816 1286 2816 943 conicto +2816 492 2514 246 conicto +2212 0 1654 0 conicto +448 0 lineto +448 3328 lineto +end_ol grestore +gsave 14.514867 13.700000 translate 0.035278 -0.035278 scale +start_ol +1477 -262 moveto +1305 -695 1142 -827 conicto +980 -960 707 -960 conicto +384 -960 lineto +384 -640 lineto +622 -640 lineto +789 -640 881 -555 conicto +974 -471 1085 -156 conicto +1159 33 lineto +128 2496 lineto +590 2496 lineto +1361 544 lineto +2131 2496 lineto +2560 2496 lineto +1477 -262 lineto +end_ol grestore +gsave 14.878933 13.700000 translate 0.035278 -0.035278 scale +start_ol +832 3200 moveto +832 2496 lineto +1664 2496 lineto +1664 2176 lineto +832 2176 lineto +832 804 lineto +832 495 914 407 conicto +997 320 1248 320 conicto +1664 320 lineto +1664 0 lineto +1248 0 lineto +793 0 620 173 conicto +448 347 448 804 conicto +448 2176 lineto +128 2176 lineto +128 2496 lineto +448 2496 lineto +448 3200 lineto +832 3200 lineto +end_ol grestore +gsave 15.116000 13.700000 translate 0.035278 -0.035278 scale +start_ol +2624 1352 moveto +2624 1152 lineto +704 1152 lineto +731 715 960 485 conicto +1189 256 1597 256 conicto +1834 256 2056 320 conicto +2278 384 2496 512 conicto +2496 128 lineto +2273 34 2039 -15 conicto +1805 -64 1565 -64 conicto +961 -64 608 284 conicto +256 632 256 1225 conicto +256 1839 595 2199 conicto +934 2560 1509 2560 conicto +2024 2560 2324 2235 conicto +2624 1910 2624 1352 conicto +2240 1472 moveto +2235 1822 2043 2031 conicto +1852 2240 1537 2240 conicto +1180 2240 965 2038 conicto +750 1836 718 1470 conicto +2240 1472 lineto +end_ol grestore +gsave 15.488533 13.700000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 15.683267 13.700000 translate 0.035278 -0.035278 scale +start_ol +576 384 moveto +1344 384 lineto +1344 2944 lineto +512 2752 lineto +512 3136 lineto +1330 3328 lineto +1792 3328 lineto +1792 384 lineto +2560 384 lineto +2560 0 lineto +576 0 lineto +576 384 lineto +end_ol grestore +1.000000 1.000000 1.000000 srgb +n 18.000000 13.000000 m 18.000000 14.000000 l 22.000000 14.000000 l 22.000000 13.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 18.000000 13.000000 m 18.000000 14.000000 l 22.000000 14.000000 l 22.000000 13.000000 l cp s +gsave 19.100000 13.700000 translate 0.035278 -0.035278 scale +start_ol +896 1600 moveto +896 384 lineto +1632 384 lineto +2007 384 2187 534 conicto +2368 684 2368 993 conicto +2368 1304 2187 1452 conicto +2007 1600 1632 1600 conicto +896 1600 lineto +896 2944 moveto +896 1984 lineto +1575 1984 lineto +1911 1984 2075 2102 conicto +2240 2221 2240 2464 conicto +2240 2705 2075 2824 conicto +1911 2944 1575 2944 conicto +896 2944 lineto +448 3328 moveto +1608 3328 lineto +2127 3328 2407 3117 conicto +2688 2906 2688 2517 conicto +2688 2216 2546 2037 conicto +2404 1859 2129 1815 conicto +2455 1743 2635 1514 conicto +2816 1286 2816 943 conicto +2816 492 2514 246 conicto +2212 0 1654 0 conicto +448 0 lineto +448 3328 lineto +end_ol grestore +gsave 19.514867 13.700000 translate 0.035278 -0.035278 scale +start_ol +1477 -262 moveto +1305 -695 1142 -827 conicto +980 -960 707 -960 conicto +384 -960 lineto +384 -640 lineto +622 -640 lineto +789 -640 881 -555 conicto +974 -471 1085 -156 conicto +1159 33 lineto +128 2496 lineto +590 2496 lineto +1361 544 lineto +2131 2496 lineto +2560 2496 lineto +1477 -262 lineto +end_ol grestore +gsave 19.878933 13.700000 translate 0.035278 -0.035278 scale +start_ol +832 3200 moveto +832 2496 lineto +1664 2496 lineto +1664 2176 lineto +832 2176 lineto +832 804 lineto +832 495 914 407 conicto +997 320 1248 320 conicto +1664 320 lineto +1664 0 lineto +1248 0 lineto +793 0 620 173 conicto +448 347 448 804 conicto +448 2176 lineto +128 2176 lineto +128 2496 lineto +448 2496 lineto +448 3200 lineto +832 3200 lineto +end_ol grestore +gsave 20.116000 13.700000 translate 0.035278 -0.035278 scale +start_ol +2624 1352 moveto +2624 1152 lineto +704 1152 lineto +731 715 960 485 conicto +1189 256 1597 256 conicto +1834 256 2056 320 conicto +2278 384 2496 512 conicto +2496 128 lineto +2273 34 2039 -15 conicto +1805 -64 1565 -64 conicto +961 -64 608 284 conicto +256 632 256 1225 conicto +256 1839 595 2199 conicto +934 2560 1509 2560 conicto +2024 2560 2324 2235 conicto +2624 1910 2624 1352 conicto +2240 1472 moveto +2235 1822 2043 2031 conicto +1852 2240 1537 2240 conicto +1180 2240 965 2038 conicto +750 1836 718 1470 conicto +2240 1472 lineto +end_ol grestore +gsave 20.488533 13.700000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 20.683267 13.700000 translate 0.035278 -0.035278 scale +start_ol +448 3328 moveto +2240 3328 lineto +2240 2944 lineto +896 2944 lineto +896 2172 lineto +994 2206 1092 2223 conicto +1190 2240 1288 2240 conicto +1845 2240 2170 1929 conicto +2496 1618 2496 1088 conicto +2496 542 2158 239 conicto +1820 -64 1205 -64 conicto +993 -64 773 -32 conicto +554 0 320 64 conicto +320 512 lineto +523 415 740 367 conicto +957 320 1200 320 conicto +1591 320 1819 527 conicto +2048 734 2048 1089 conicto +2048 1443 1817 1649 conicto +1587 1856 1192 1856 conicto +1008 1856 824 1809 conicto +640 1762 448 1664 conicto +448 3328 lineto +end_ol grestore +gsave 21.072733 13.700000 translate 0.035278 -0.035278 scale +start_ol +576 384 moveto +1344 384 lineto +1344 2944 lineto +512 2752 lineto +512 3136 lineto +1330 3328 lineto +1792 3328 lineto +1792 384 lineto +2560 384 lineto +2560 0 lineto +576 0 lineto +576 384 lineto +end_ol grestore +gsave 21.462200 13.700000 translate 0.035278 -0.035278 scale +start_ol +576 384 moveto +1344 384 lineto +1344 2944 lineto +512 2752 lineto +512 3136 lineto +1330 3328 lineto +1792 3328 lineto +1792 384 lineto +2560 384 lineto +2560 0 lineto +576 0 lineto +576 384 lineto +end_ol grestore +gsave 14.000000 12.000000 translate 0.035278 -0.035278 scale +start_ol +2496 3200 moveto +2496 2752 lineto +2234 2882 2001 2945 conicto +1768 3008 1552 3008 conicto +1175 3008 971 2863 conicto +768 2718 768 2452 conicto +768 2228 905 2113 conicto +1042 1999 1426 1929 conicto +1708 1873 lineto +2210 1778 2449 1540 conicto +2688 1303 2688 903 conicto +2688 427 2358 181 conicto +2029 -64 1392 -64 conicto +1152 -64 881 -15 conicto +610 33 320 128 conicto +320 576 lineto +603 448 875 384 conicto +1147 320 1409 320 conicto +1807 320 2023 465 conicto +2240 610 2240 878 conicto +2240 1113 2084 1245 conicto +1928 1378 1572 1444 conicto +1288 1497 lineto +776 1599 548 1817 conicto +320 2035 320 2424 conicto +320 2874 636 3133 conicto +952 3392 1507 3392 conicto +1744 3392 1991 3344 conicto +2238 3297 2496 3200 conicto +end_ol grestore +gsave 14.389467 12.000000 translate 0.035278 -0.035278 scale +start_ol +2624 1352 moveto +2624 1152 lineto +704 1152 lineto +731 715 960 485 conicto +1189 256 1597 256 conicto +1834 256 2056 320 conicto +2278 384 2496 512 conicto +2496 128 lineto +2273 34 2039 -15 conicto +1805 -64 1565 -64 conicto +961 -64 608 284 conicto +256 632 256 1225 conicto +256 1839 595 2199 conicto +934 2560 1509 2560 conicto +2024 2560 2324 2235 conicto +2624 1910 2624 1352 conicto +2240 1472 moveto +2235 1822 2043 2031 conicto +1852 2240 1537 2240 conicto +1180 2240 965 2038 conicto +750 1836 718 1470 conicto +2240 1472 lineto +end_ol grestore +gsave 14.762000 12.000000 translate 0.035278 -0.035278 scale +start_ol +2240 2432 moveto +2240 2048 lineto +2066 2144 1892 2192 conicto +1718 2240 1541 2240 conicto +1143 2240 923 1979 conicto +704 1718 704 1248 conicto +704 778 923 517 conicto +1143 256 1541 256 conicto +1718 256 1892 304 conicto +2066 352 2240 448 conicto +2240 64 lineto +2068 0 1883 -32 conicto +1698 -64 1490 -64 conicto +924 -64 590 290 conicto +256 645 256 1248 conicto +256 1859 593 2209 conicto +931 2560 1517 2560 conicto +1707 2560 1888 2528 conicto +2070 2496 2240 2432 conicto +end_ol grestore +gsave 15.100667 12.000000 translate 0.035278 -0.035278 scale +start_ol +832 3200 moveto +832 2496 lineto +1664 2496 lineto +1664 2176 lineto +832 2176 lineto +832 804 lineto +832 495 914 407 conicto +997 320 1248 320 conicto +1664 320 lineto +1664 0 lineto +1248 0 lineto +793 0 620 173 conicto +448 347 448 804 conicto +448 2176 lineto +128 2176 lineto +128 2496 lineto +448 2496 lineto +448 3200 lineto +832 3200 lineto +end_ol grestore +gsave 15.337733 12.000000 translate 0.035278 -0.035278 scale +start_ol +1409 2240 moveto +1083 2240 893 1974 conicto +704 1709 704 1248 conicto +704 787 892 521 conicto +1081 256 1409 256 conicto +1733 256 1922 522 conicto +2112 789 2112 1248 conicto +2112 1705 1922 1972 conicto +1733 2240 1409 2240 conicto +1408 2560 moveto +1946 2560 2253 2212 conicto +2560 1864 2560 1248 conicto +2560 634 2253 285 conicto +1946 -64 1408 -64 conicto +869 -64 562 285 conicto +256 634 256 1248 conicto +256 1864 562 2212 conicto +869 2560 1408 2560 conicto +end_ol grestore +gsave 15.710267 12.000000 translate 0.035278 -0.035278 scale +start_ol +1920 2112 moveto +1848 2178 1764 2209 conicto +1680 2240 1578 2240 conicto +1218 2240 1025 2001 conicto +832 1763 832 1317 conicto +832 0 lineto +448 0 lineto +448 2496 lineto +832 2496 lineto +832 2112 lineto +965 2339 1180 2449 conicto +1396 2560 1702 2560 conicto +1747 2560 1799 2560 conicto +1852 2560 1917 2560 conicto +1920 2112 lineto +end_ol grestore +gsave 15.964267 12.000000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 16.159000 12.000000 translate 0.035278 -0.035278 scale +start_ol +1471 3008 moveto +1120 3008 944 2672 conicto +768 2336 768 1663 conicto +768 992 944 656 conicto +1120 320 1471 320 conicto +1824 320 2000 656 conicto +2176 992 2176 1663 conicto +2176 2336 2000 2672 conicto +1824 3008 1471 3008 conicto +1472 3392 moveto +2033 3392 2328 2949 conicto +2624 2506 2624 1663 conicto +2624 822 2328 379 conicto +2033 -64 1472 -64 conicto +911 -64 615 379 conicto +320 822 320 1663 conicto +320 2506 615 2949 conicto +911 3392 1472 3392 conicto +end_ol grestore +1.000000 1.000000 1.000000 srgb +n 23.000000 11.000000 m 23.000000 15.000000 l 38.000000 15.000000 l 38.000000 11.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 23.000000 11.000000 m 23.000000 15.000000 l 38.000000 15.000000 l 38.000000 11.000000 l cp s +1.000000 1.000000 1.000000 srgb +n 24.000000 13.000000 m 24.000000 14.000000 l 28.000000 14.000000 l 28.000000 13.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 24.000000 13.000000 m 24.000000 14.000000 l 28.000000 14.000000 l 28.000000 13.000000 l cp s +gsave 25.100000 13.700000 translate 0.035278 -0.035278 scale +start_ol +896 1600 moveto +896 384 lineto +1632 384 lineto +2007 384 2187 534 conicto +2368 684 2368 993 conicto +2368 1304 2187 1452 conicto +2007 1600 1632 1600 conicto +896 1600 lineto +896 2944 moveto +896 1984 lineto +1575 1984 lineto +1911 1984 2075 2102 conicto +2240 2221 2240 2464 conicto +2240 2705 2075 2824 conicto +1911 2944 1575 2944 conicto +896 2944 lineto +448 3328 moveto +1608 3328 lineto +2127 3328 2407 3117 conicto +2688 2906 2688 2517 conicto +2688 2216 2546 2037 conicto +2404 1859 2129 1815 conicto +2455 1743 2635 1514 conicto +2816 1286 2816 943 conicto +2816 492 2514 246 conicto +2212 0 1654 0 conicto +448 0 lineto +448 3328 lineto +end_ol grestore +gsave 25.514867 13.700000 translate 0.035278 -0.035278 scale +start_ol +1477 -262 moveto +1305 -695 1142 -827 conicto +980 -960 707 -960 conicto +384 -960 lineto +384 -640 lineto +622 -640 lineto +789 -640 881 -555 conicto +974 -471 1085 -156 conicto +1159 33 lineto +128 2496 lineto +590 2496 lineto +1361 544 lineto +2131 2496 lineto +2560 2496 lineto +1477 -262 lineto +end_ol grestore +gsave 25.878933 13.700000 translate 0.035278 -0.035278 scale +start_ol +832 3200 moveto +832 2496 lineto +1664 2496 lineto +1664 2176 lineto +832 2176 lineto +832 804 lineto +832 495 914 407 conicto +997 320 1248 320 conicto +1664 320 lineto +1664 0 lineto +1248 0 lineto +793 0 620 173 conicto +448 347 448 804 conicto +448 2176 lineto +128 2176 lineto +128 2496 lineto +448 2496 lineto +448 3200 lineto +832 3200 lineto +end_ol grestore +gsave 26.116000 13.700000 translate 0.035278 -0.035278 scale +start_ol +2624 1352 moveto +2624 1152 lineto +704 1152 lineto +731 715 960 485 conicto +1189 256 1597 256 conicto +1834 256 2056 320 conicto +2278 384 2496 512 conicto +2496 128 lineto +2273 34 2039 -15 conicto +1805 -64 1565 -64 conicto +961 -64 608 284 conicto +256 632 256 1225 conicto +256 1839 595 2199 conicto +934 2560 1509 2560 conicto +2024 2560 2324 2235 conicto +2624 1910 2624 1352 conicto +2240 1472 moveto +2235 1822 2043 2031 conicto +1852 2240 1537 2240 conicto +1180 2240 965 2038 conicto +750 1836 718 1470 conicto +2240 1472 lineto +end_ol grestore +gsave 26.488533 13.700000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 26.683267 13.700000 translate 0.035278 -0.035278 scale +start_ol +1471 3008 moveto +1120 3008 944 2672 conicto +768 2336 768 1663 conicto +768 992 944 656 conicto +1120 320 1471 320 conicto +1824 320 2000 656 conicto +2176 992 2176 1663 conicto +2176 2336 2000 2672 conicto +1824 3008 1471 3008 conicto +1472 3392 moveto +2033 3392 2328 2949 conicto +2624 2506 2624 1663 conicto +2624 822 2328 379 conicto +2033 -64 1472 -64 conicto +911 -64 615 379 conicto +320 822 320 1663 conicto +320 2506 615 2949 conicto +911 3392 1472 3392 conicto +end_ol grestore +1.000000 1.000000 1.000000 srgb +n 28.000000 13.000000 m 28.000000 14.000000 l 32.000000 14.000000 l 32.000000 13.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 28.000000 13.000000 m 28.000000 14.000000 l 32.000000 14.000000 l 32.000000 13.000000 l cp s +gsave 29.100000 13.700000 translate 0.035278 -0.035278 scale +start_ol +896 1600 moveto +896 384 lineto +1632 384 lineto +2007 384 2187 534 conicto +2368 684 2368 993 conicto +2368 1304 2187 1452 conicto +2007 1600 1632 1600 conicto +896 1600 lineto +896 2944 moveto +896 1984 lineto +1575 1984 lineto +1911 1984 2075 2102 conicto +2240 2221 2240 2464 conicto +2240 2705 2075 2824 conicto +1911 2944 1575 2944 conicto +896 2944 lineto +448 3328 moveto +1608 3328 lineto +2127 3328 2407 3117 conicto +2688 2906 2688 2517 conicto +2688 2216 2546 2037 conicto +2404 1859 2129 1815 conicto +2455 1743 2635 1514 conicto +2816 1286 2816 943 conicto +2816 492 2514 246 conicto +2212 0 1654 0 conicto +448 0 lineto +448 3328 lineto +end_ol grestore +gsave 29.514867 13.700000 translate 0.035278 -0.035278 scale +start_ol +1477 -262 moveto +1305 -695 1142 -827 conicto +980 -960 707 -960 conicto +384 -960 lineto +384 -640 lineto +622 -640 lineto +789 -640 881 -555 conicto +974 -471 1085 -156 conicto +1159 33 lineto +128 2496 lineto +590 2496 lineto +1361 544 lineto +2131 2496 lineto +2560 2496 lineto +1477 -262 lineto +end_ol grestore +gsave 29.878933 13.700000 translate 0.035278 -0.035278 scale +start_ol +832 3200 moveto +832 2496 lineto +1664 2496 lineto +1664 2176 lineto +832 2176 lineto +832 804 lineto +832 495 914 407 conicto +997 320 1248 320 conicto +1664 320 lineto +1664 0 lineto +1248 0 lineto +793 0 620 173 conicto +448 347 448 804 conicto +448 2176 lineto +128 2176 lineto +128 2496 lineto +448 2496 lineto +448 3200 lineto +832 3200 lineto +end_ol grestore +gsave 30.116000 13.700000 translate 0.035278 -0.035278 scale +start_ol +2624 1352 moveto +2624 1152 lineto +704 1152 lineto +731 715 960 485 conicto +1189 256 1597 256 conicto +1834 256 2056 320 conicto +2278 384 2496 512 conicto +2496 128 lineto +2273 34 2039 -15 conicto +1805 -64 1565 -64 conicto +961 -64 608 284 conicto +256 632 256 1225 conicto +256 1839 595 2199 conicto +934 2560 1509 2560 conicto +2024 2560 2324 2235 conicto +2624 1910 2624 1352 conicto +2240 1472 moveto +2235 1822 2043 2031 conicto +1852 2240 1537 2240 conicto +1180 2240 965 2038 conicto +750 1836 718 1470 conicto +2240 1472 lineto +end_ol grestore +gsave 30.488533 13.700000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 30.683267 13.700000 translate 0.035278 -0.035278 scale +start_ol +576 384 moveto +1344 384 lineto +1344 2944 lineto +512 2752 lineto +512 3136 lineto +1330 3328 lineto +1792 3328 lineto +1792 384 lineto +2560 384 lineto +2560 0 lineto +576 0 lineto +576 384 lineto +end_ol grestore +1.000000 1.000000 1.000000 srgb +n 33.000000 13.000000 m 33.000000 14.000000 l 37.000000 14.000000 l 37.000000 13.000000 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 33.000000 13.000000 m 33.000000 14.000000 l 37.000000 14.000000 l 37.000000 13.000000 l cp s +gsave 34.100000 13.700000 translate 0.035278 -0.035278 scale +start_ol +896 1600 moveto +896 384 lineto +1632 384 lineto +2007 384 2187 534 conicto +2368 684 2368 993 conicto +2368 1304 2187 1452 conicto +2007 1600 1632 1600 conicto +896 1600 lineto +896 2944 moveto +896 1984 lineto +1575 1984 lineto +1911 1984 2075 2102 conicto +2240 2221 2240 2464 conicto +2240 2705 2075 2824 conicto +1911 2944 1575 2944 conicto +896 2944 lineto +448 3328 moveto +1608 3328 lineto +2127 3328 2407 3117 conicto +2688 2906 2688 2517 conicto +2688 2216 2546 2037 conicto +2404 1859 2129 1815 conicto +2455 1743 2635 1514 conicto +2816 1286 2816 943 conicto +2816 492 2514 246 conicto +2212 0 1654 0 conicto +448 0 lineto +448 3328 lineto +end_ol grestore +gsave 34.514867 13.700000 translate 0.035278 -0.035278 scale +start_ol +1477 -262 moveto +1305 -695 1142 -827 conicto +980 -960 707 -960 conicto +384 -960 lineto +384 -640 lineto +622 -640 lineto +789 -640 881 -555 conicto +974 -471 1085 -156 conicto +1159 33 lineto +128 2496 lineto +590 2496 lineto +1361 544 lineto +2131 2496 lineto +2560 2496 lineto +1477 -262 lineto +end_ol grestore +gsave 34.878933 13.700000 translate 0.035278 -0.035278 scale +start_ol +832 3200 moveto +832 2496 lineto +1664 2496 lineto +1664 2176 lineto +832 2176 lineto +832 804 lineto +832 495 914 407 conicto +997 320 1248 320 conicto +1664 320 lineto +1664 0 lineto +1248 0 lineto +793 0 620 173 conicto +448 347 448 804 conicto +448 2176 lineto +128 2176 lineto +128 2496 lineto +448 2496 lineto +448 3200 lineto +832 3200 lineto +end_ol grestore +gsave 35.116000 13.700000 translate 0.035278 -0.035278 scale +start_ol +2624 1352 moveto +2624 1152 lineto +704 1152 lineto +731 715 960 485 conicto +1189 256 1597 256 conicto +1834 256 2056 320 conicto +2278 384 2496 512 conicto +2496 128 lineto +2273 34 2039 -15 conicto +1805 -64 1565 -64 conicto +961 -64 608 284 conicto +256 632 256 1225 conicto +256 1839 595 2199 conicto +934 2560 1509 2560 conicto +2024 2560 2324 2235 conicto +2624 1910 2624 1352 conicto +2240 1472 moveto +2235 1822 2043 2031 conicto +1852 2240 1537 2240 conicto +1180 2240 965 2038 conicto +750 1836 718 1470 conicto +2240 1472 lineto +end_ol grestore +gsave 35.488533 13.700000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 35.683267 13.700000 translate 0.035278 -0.035278 scale +start_ol +448 3328 moveto +2240 3328 lineto +2240 2944 lineto +896 2944 lineto +896 2172 lineto +994 2206 1092 2223 conicto +1190 2240 1288 2240 conicto +1845 2240 2170 1929 conicto +2496 1618 2496 1088 conicto +2496 542 2158 239 conicto +1820 -64 1205 -64 conicto +993 -64 773 -32 conicto +554 0 320 64 conicto +320 512 lineto +523 415 740 367 conicto +957 320 1200 320 conicto +1591 320 1819 527 conicto +2048 734 2048 1089 conicto +2048 1443 1817 1649 conicto +1587 1856 1192 1856 conicto +1008 1856 824 1809 conicto +640 1762 448 1664 conicto +448 3328 lineto +end_ol grestore +gsave 36.072733 13.700000 translate 0.035278 -0.035278 scale +start_ol +576 384 moveto +1344 384 lineto +1344 2944 lineto +512 2752 lineto +512 3136 lineto +1330 3328 lineto +1792 3328 lineto +1792 384 lineto +2560 384 lineto +2560 0 lineto +576 0 lineto +576 384 lineto +end_ol grestore +gsave 36.462200 13.700000 translate 0.035278 -0.035278 scale +start_ol +576 384 moveto +1344 384 lineto +1344 2944 lineto +512 2752 lineto +512 3136 lineto +1330 3328 lineto +1792 3328 lineto +1792 384 lineto +2560 384 lineto +2560 0 lineto +576 0 lineto +576 384 lineto +end_ol grestore +gsave 29.000000 12.000000 translate 0.035278 -0.035278 scale +start_ol +2496 3200 moveto +2496 2752 lineto +2234 2882 2001 2945 conicto +1768 3008 1552 3008 conicto +1175 3008 971 2863 conicto +768 2718 768 2452 conicto +768 2228 905 2113 conicto +1042 1999 1426 1929 conicto +1708 1873 lineto +2210 1778 2449 1540 conicto +2688 1303 2688 903 conicto +2688 427 2358 181 conicto +2029 -64 1392 -64 conicto +1152 -64 881 -15 conicto +610 33 320 128 conicto +320 576 lineto +603 448 875 384 conicto +1147 320 1409 320 conicto +1807 320 2023 465 conicto +2240 610 2240 878 conicto +2240 1113 2084 1245 conicto +1928 1378 1572 1444 conicto +1288 1497 lineto +776 1599 548 1817 conicto +320 2035 320 2424 conicto +320 2874 636 3133 conicto +952 3392 1507 3392 conicto +1744 3392 1991 3344 conicto +2238 3297 2496 3200 conicto +end_ol grestore +gsave 29.389467 12.000000 translate 0.035278 -0.035278 scale +start_ol +2624 1352 moveto +2624 1152 lineto +704 1152 lineto +731 715 960 485 conicto +1189 256 1597 256 conicto +1834 256 2056 320 conicto +2278 384 2496 512 conicto +2496 128 lineto +2273 34 2039 -15 conicto +1805 -64 1565 -64 conicto +961 -64 608 284 conicto +256 632 256 1225 conicto +256 1839 595 2199 conicto +934 2560 1509 2560 conicto +2024 2560 2324 2235 conicto +2624 1910 2624 1352 conicto +2240 1472 moveto +2235 1822 2043 2031 conicto +1852 2240 1537 2240 conicto +1180 2240 965 2038 conicto +750 1836 718 1470 conicto +2240 1472 lineto +end_ol grestore +gsave 29.762000 12.000000 translate 0.035278 -0.035278 scale +start_ol +2240 2432 moveto +2240 2048 lineto +2066 2144 1892 2192 conicto +1718 2240 1541 2240 conicto +1143 2240 923 1979 conicto +704 1718 704 1248 conicto +704 778 923 517 conicto +1143 256 1541 256 conicto +1718 256 1892 304 conicto +2066 352 2240 448 conicto +2240 64 lineto +2068 0 1883 -32 conicto +1698 -64 1490 -64 conicto +924 -64 590 290 conicto +256 645 256 1248 conicto +256 1859 593 2209 conicto +931 2560 1517 2560 conicto +1707 2560 1888 2528 conicto +2070 2496 2240 2432 conicto +end_ol grestore +gsave 30.100667 12.000000 translate 0.035278 -0.035278 scale +start_ol +832 3200 moveto +832 2496 lineto +1664 2496 lineto +1664 2176 lineto +832 2176 lineto +832 804 lineto +832 495 914 407 conicto +997 320 1248 320 conicto +1664 320 lineto +1664 0 lineto +1248 0 lineto +793 0 620 173 conicto +448 347 448 804 conicto +448 2176 lineto +128 2176 lineto +128 2496 lineto +448 2496 lineto +448 3200 lineto +832 3200 lineto +end_ol grestore +gsave 30.337733 12.000000 translate 0.035278 -0.035278 scale +start_ol +1409 2240 moveto +1083 2240 893 1974 conicto +704 1709 704 1248 conicto +704 787 892 521 conicto +1081 256 1409 256 conicto +1733 256 1922 522 conicto +2112 789 2112 1248 conicto +2112 1705 1922 1972 conicto +1733 2240 1409 2240 conicto +1408 2560 moveto +1946 2560 2253 2212 conicto +2560 1864 2560 1248 conicto +2560 634 2253 285 conicto +1946 -64 1408 -64 conicto +869 -64 562 285 conicto +256 634 256 1248 conicto +256 1864 562 2212 conicto +869 2560 1408 2560 conicto +end_ol grestore +gsave 30.710267 12.000000 translate 0.035278 -0.035278 scale +start_ol +1920 2112 moveto +1848 2178 1764 2209 conicto +1680 2240 1578 2240 conicto +1218 2240 1025 2001 conicto +832 1763 832 1317 conicto +832 0 lineto +448 0 lineto +448 2496 lineto +832 2496 lineto +832 2112 lineto +965 2339 1180 2449 conicto +1396 2560 1702 2560 conicto +1747 2560 1799 2560 conicto +1852 2560 1917 2560 conicto +1920 2112 lineto +end_ol grestore +gsave 30.964267 12.000000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 31.159000 12.000000 translate 0.035278 -0.035278 scale +start_ol +576 384 moveto +1344 384 lineto +1344 2944 lineto +512 2752 lineto +512 3136 lineto +1330 3328 lineto +1792 3328 lineto +1792 384 lineto +2560 384 lineto +2560 0 lineto +576 0 lineto +576 384 lineto +end_ol grestore +gsave 22.000000 10.000000 translate 0.035278 -0.035278 scale +start_ol +896 2944 moveto +896 384 lineto +1454 384 lineto +2160 384 2488 692 conicto +2816 1001 2816 1667 conicto +2816 2329 2488 2636 conicto +2160 2944 1454 2944 conicto +896 2944 lineto +448 3328 moveto +1383 3328 lineto +2355 3328 2809 2925 conicto +3264 2523 3264 1667 conicto +3264 807 2807 403 conicto +2350 0 1383 0 conicto +448 0 lineto +448 3328 lineto +end_ol grestore +gsave 22.465667 10.000000 translate 0.035278 -0.035278 scale +start_ol +448 2496 moveto +832 2496 lineto +832 0 lineto +448 0 lineto +448 2496 lineto +448 3520 moveto +832 3520 lineto +832 3008 lineto +448 3008 lineto +448 3520 lineto +end_ol grestore +gsave 22.635000 10.000000 translate 0.035278 -0.035278 scale +start_ol +2048 2432 moveto +2048 2048 lineto +1868 2144 1674 2192 conicto +1480 2240 1273 2240 conicto +957 2240 798 2144 conicto +640 2048 640 1856 conicto +640 1709 757 1625 conicto +875 1542 1229 1467 conicto +1380 1435 lineto +1812 1341 1994 1170 conicto +2176 999 2176 692 conicto +2176 343 1899 139 conicto +1622 -64 1137 -64 conicto +936 -64 717 -32 conicto +498 0 256 64 conicto +256 512 lineto +490 385 718 320 conicto +947 256 1170 256 conicto +1470 256 1631 358 conicto +1792 461 1792 647 conicto +1792 820 1670 912 conicto +1549 1004 1141 1089 conicto +988 1123 lineto +600 1203 428 1369 conicto +256 1535 256 1824 conicto +256 2177 510 2368 conicto +765 2560 1233 2560 conicto +1466 2560 1670 2528 conicto +1875 2496 2048 2432 conicto +end_ol grestore +gsave 22.956733 10.000000 translate 0.035278 -0.035278 scale +start_ol +2240 2432 moveto +2240 2048 lineto +2066 2144 1892 2192 conicto +1718 2240 1541 2240 conicto +1143 2240 923 1979 conicto +704 1718 704 1248 conicto +704 778 923 517 conicto +1143 256 1541 256 conicto +1718 256 1892 304 conicto +2066 352 2240 448 conicto +2240 64 lineto +2068 0 1883 -32 conicto +1698 -64 1490 -64 conicto +924 -64 590 290 conicto +256 645 256 1248 conicto +256 1859 593 2209 conicto +931 2560 1517 2560 conicto +1707 2560 1888 2528 conicto +2070 2496 2240 2432 conicto +end_ol grestore +gsave 23.295400 10.000000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 23.490133 10.000000 translate 0.035278 -0.035278 scale +start_ol +1471 3008 moveto +1120 3008 944 2672 conicto +768 2336 768 1663 conicto +768 992 944 656 conicto +1120 320 1471 320 conicto +1824 320 2000 656 conicto +2176 992 2176 1663 conicto +2176 2336 2000 2672 conicto +1824 3008 1471 3008 conicto +1472 3392 moveto +2033 3392 2328 2949 conicto +2624 2506 2624 1663 conicto +2624 822 2328 379 conicto +2033 -64 1472 -64 conicto +911 -64 615 379 conicto +320 822 320 1663 conicto +320 2506 615 2949 conicto +911 3392 1472 3392 conicto +end_ol grestore +showpage diff --git a/tools/efsl-0.3.6/examples/avr/Makefile b/tools/efsl-0.3.6/examples/avr/Makefile new file mode 100644 index 0000000..0b6220c --- /dev/null +++ b/tools/efsl-0.3.6/examples/avr/Makefile @@ -0,0 +1,24 @@ +include ../../conf/config.makefile +#BASE=c:\efsl\efsl-0.3 +#INC=-I$(BASE)\src\base\include -I $(BASE)\src\include -I $(BASE)\src\fs\vfat\include -I $(BASE)\src\hwdrivers\atmega_spi\include -I $(BASE)\src\protocols\sdcard_spi\include -I$(BASE)\conf +BASE=../../ +INC=-I$(BASE)/src/base/include -I $(BASE)/src/include -I $(BASE)/src/fs/vfat/include -I $(BASE)/src/hwdrivers/atmega_spi/include -I $(BASE)/src/protocols/sdcard_spi/include -I$(BASE)/conf +LIBS= -L $(BASE)\lib -lefsl-base -lefsl-fs-vfat -lefsl-hwd-atmega_spi -lefsl-prot-sdspi + +avrtest: lib + $(CC) $(GCFLAGS) $(INC) -o avrtest.o avrtest.c $(LIBS) + $(OBJCOPY) -j .text -j .data -O ihex avrtest.o avrtest.hex + +flash: avrtest + avrdude -P /dev/ttyS0 -c stk500v2 -pm128 -Uflash:w:avrtest.hex + +debug: avrtest + avarice -j /dev/ttyS0 -e -p -f avrtest.o -D :4242 + avr-gdb avrtest.o + +lib: + make -C $(BASE) avr + +clean: + make -C $(BASE) clean + rm -rf *.hex *.o diff --git a/tools/efsl-0.3.6/examples/avr/avrtest.c b/tools/efsl-0.3.6/examples/avr/avrtest.c new file mode 100755 index 0000000..2f83f76 --- /dev/null +++ b/tools/efsl-0.3.6/examples/avr/avrtest.c @@ -0,0 +1,95 @@ +/*****************************************************************************/ +#include +#include +#include +/*****************************************************************************/ + +/*****************************************************************************/ +void hang(void); +/*****************************************************************************/ + +void main(void) +{ + efsl_storage_conf storage_conf; + efsl_fs_conf fs_conf; + + efsl_storage storage; + efsl_fs fs; + File file_r; + File file_w; + + atmegaSpiInterface spi_interface; + SdSpiProtocol sd_protocol; + + char buf[512]; + unsigned short e; + + + /* Init */ + debug_init(); + spi_interface.pinSelect=0x01; + + sd_protocol.spiHwInterface=&spi_interface; + sd_protocol.spiHwInit=(void *)atmega_spi_init; + sd_protocol.spiSendByte=(void *)atmega_spi_send; + + storage_conf.hwObject=&sd_protocol; + storage_conf.if_init_fptr=(void *)sd_Init; + storage_conf.if_read_fptr=(void *)sd_readSector; + storage_conf.if_write_fptr=(void *)sd_writeSector; + storage_conf.if_ioctl_fptr=(void *)sd_ioctl; + storage_conf.ioman_bufmem=0; + + fs_conf.no_partitions=0; + fs_conf.storage=&storage; + + DBG((TXT("Let's go...\n"))); + + if(efsl_initStorage(&storage,&storage_conf)){ + DBG((TXT("Error initializing storage: %d"))); + hang(); + } + + if(efsl_initFs(&fs,&fs_conf)){ + DBG((TXT("Unable to mount fs"))); + hang(); + } + + if(file_fopen(&file_r,&fs.filesystem,"orig.txt",'r')!=0){ + DBG((TXT("Could not open file for reading\n"))); + hang(); + } + DBG((TXT("File opened for reading\n"))); + + if(file_fopen(&file_w,&fs.filesystem,"copy.txt",'w')!=0){ + DBG((TXT("Could not open file for writing\n"))); + hang(); + } + DBG((TXT("File opened for writing\n"))); + + while((e=file_read(&file_r,512,buf))){ + DBG((TXT("Read sector\n"))); + file_write(&file_w,e,buf); + DBG((TXT("Wrote sector\n"))); + } + + DBG((TXT("Done writing, now umount\n"))); + + file_fclose(&file_r); + file_fclose(&file_w); + + fs_umount(&fs.filesystem); + + DBG((TXT("Done :-)"))); + + hang(); +} +/*****************************************************************************/ + +void hang(void) +{ + while((1)) + _NOP(); +} +/*****************************************************************************/ + diff --git a/tools/efsl-0.3.6/examples/avr/compile b/tools/efsl-0.3.6/examples/avr/compile new file mode 100644 index 0000000..3fb3edd --- /dev/null +++ b/tools/efsl-0.3.6/examples/avr/compile @@ -0,0 +1 @@ +avr-gcc -I../../src/base/include/ -I ../../src/include/ -I ../../src/fs/vfat/include/ -I ../../src/hwdrivers/atmega_spi/include/ -I ../../src/protocols/sdcard_spi/include/ -I../../conf -ffreestanding -mmcu=atmega128 -Os -o avrtest.o avrtest.c -L ../../lib/ -lefsl-base -lefsl-fs-vfat -lefsl-hwd-atmega_spi -lefsl-prot-sdspi && avr-objcopy -j .text -j .data -O ihex avrtest.o avrtest.hex && avrdude -P /dev/ttyS0 -c stk500v2 -pm128 -Uflash:w:avrtest.hex diff --git a/tools/efsl-0.3.6/examples/avr/dumpfile.c b/tools/efsl-0.3.6/examples/avr/dumpfile.c new file mode 100755 index 0000000..3f854cf --- /dev/null +++ b/tools/efsl-0.3.6/examples/avr/dumpfile.c @@ -0,0 +1,83 @@ +/*****************************************************************************/ +#include +#include +#include +/*****************************************************************************/ + +/*****************************************************************************/ +void hang(void); +/*****************************************************************************/ + +void main(void) +{ + efsl_storage_conf storage_conf; + efsl_fs_conf fs_conf; + + efsl_storage storage; + efsl_fs fs; + File file_r; + + atmegaSpiInterface spi_interface; + SdSpiProtocol sd_protocol; + + char buf[512]; + unsigned short i,e; + + debug_init(); + + DBG((TXT("\nHello :-)\n"))); + + /* Init */ + spi_interface.pinSelect=0x01; + + sd_protocol.spiHwInterface=&spi_interface; + sd_protocol.spiHwInit=(void *)atmega_spi_init; + sd_protocol.spiSendByte=(void *)atmega_spi_send; + + storage_conf.hwObject=&sd_protocol; + storage_conf.if_init_fptr=(void *)sd_Init; + storage_conf.if_read_fptr=(void *)sd_readSector; + storage_conf.if_write_fptr=(void *)sd_writeSector; + storage_conf.if_ioctl_fptr=(void *)sd_ioctl; + storage_conf.ioman_bufmem=0; + + fs_conf.no_partitions=0; + fs_conf.storage=&storage; + + DBG((TXT("Let's go...\n"))); + + if(efsl_initStorage(&storage,&storage_conf)){ + DBG((TXT("Error initializing storage: %d"))); + hang(); + } + + if(efsl_initFs(&fs,&fs_conf)){ + DBG((TXT("Unable to mount fs"))); + hang(); + } + + if(file_fopen(&file_r,&fs.filesystem,"orig.txt",'r')!=0){ + DBG((TXT("Could not open file\n"))); + hang(); + } + DBG((TXT("File opened"))); + + while((e=file_read(&file_r,512,buf))){ + for(i=0;i0)tw--; + + for(c=0;c=90) + debug(PSTR("\n")); +} +/*****************************************************************************/ + +void debug_init(void) +{ + unsigned short ubrr; + + ubrr = ((unsigned short)DEBUG_UBRR); + + switch(DEBUG_PORT){ + case 0: + UBRR0H = (euint8) (ubrr>>8); + UBRR0L = (euint8) (ubrr); + UCSR0B = ( (1<>8); + UBRR1L = (euint8) (ubrr); + UCSR1B = ( (1<ioman=ioman; + disc_setError(disc,DISC_NOERROR); + +} +/*****************************************************************************/ + + +/* **************************************************************************** + * euint8 disc_findPartition(Disc *disc, euint8 partitionType, euint8 partitionIndex, euint32* startSector, euint32* sectorCount) + * Description: Locates partition of type partitionType w/ index partitionIndex on the disc and returns + * the startsector and the size to the caller. +*/ +euint8 disc_findPartition(Disc *disc, euint8 partitionType, euint8 partitionIndex, euint32* startSector, euint32* sectorCount) +{ + /* For now we ignore the partitionIndex */ + /* Partition buffering is also not here for memory saving reasons. + Add it later with compile time option */ + + euint8 c, *buf, currentIndex=0; + PartitionField pf; + + /* Get the MBR */ + + buf = ioman_getSector(disc->ioman,LBA_ADDR_MBR,IOM_MODE_READONLY|IOM_MODE_EXP_REQ); + + for(c=0;c<4;c++){ + ex_getPartitionField(buf+(c*SIZE_PARTITION_FIELD),&pf); + if(pf.type==partitionType){ + if(partitionIndex==currentIndex){ + ioman_releaseSector(disc->ioman,buf); + *startSector = pf.LBA_begin; + *sectorCount = pf.numSectors; + return(0); + }else{ + currentIndex++; + } + } + } + + ioman_releaseSector(disc->ioman,buf); + return(1); /* Nothing found */ +} + + + diff --git a/tools/efsl-0.3.6/src/base/disc.c~ b/tools/efsl-0.3.6/src/base/disc.c~ new file mode 100644 index 0000000..2722040 --- /dev/null +++ b/tools/efsl-0.3.6/src/base/disc.c~ @@ -0,0 +1,90 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : disc.c * +* Release : 0.3 - devel * +* Description : This file contains the functions regarding the whole disc * +* such as loading the MBR and performing read/write tests. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "disc.h" +/*****************************************************************************/ + +/* **************************************************************************** + * void disc_initDisc(Disc *disc,hcInterface* source) + * Description: This initialises the disc by loading the MBR and setting the + * pointer to the hardware object. +*/ +void disc_initDisc(Disc *disc,IOManager* ioman) +{ + disc->ioman=ioman; + disc_setError(disc,DISC_NOERROR); + +} +/*****************************************************************************/ + + +/* **************************************************************************** + * euint8 disc_findPartition(Disc *disc, euint8 partitionType, euint8 partitionIndex, euint32* startSector, euint32* sectorCount) + * Description: Locates partition of type partitionType w/ index partitionIndex on the disc and returns + * the startsector and the size to the caller. +*/ +euint8 disc_findPartition(Disc *disc, euint8 partitionType, euint8 partitionIndex, euint32* startSector, euint32* sectorCount) +{ + /* For now we ignore the partitionIndex */ + /* Partition buffering is also not here for memory saving reasons. + Add it later with compile time option */ + + euint8 c, *buf, currentIndex=0; + PartitionField pf; + + /* Get the MBR */ + + buf = ioman_getSector(disc->ioman,LBA_ADDR_MBR,IOM_MODE_READONLY|IOM_MODE_EXP_REQ); + + for(c=0;c<4;c++){ + ex_getPartitionField(buf+(c*SIZE_PARTITION_FIELD),&pf); + if(pf.type==partitionType){ + if(partitionIndex==currentIndex){ + ioman_releaseSector(disc->ioman,buf); + *startSector = pf.LBA_begin; + *sectorCount = pf.numSectors; + return(0); + }else{ + currentIndex++; + } + } + } + + ioman_releaseSector(disc->ioman,buf); + return(1); /* Nothing found */ +} + + + diff --git a/tools/efsl-0.3.6/src/base/efs.c b/tools/efsl-0.3.6/src/base/efs.c new file mode 100644 index 0000000..88eb5e3 --- /dev/null +++ b/tools/efsl-0.3.6/src/base/efs.c @@ -0,0 +1,92 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : efs.c * +* Release : 0.3 - devel * +* Description : This should become the wrapper around efs. It will contain * +* functions like efs_init etc. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + + +/*****************************************************************************/ +#include "efs.h" +/*****************************************************************************/ + +/* This stuff must be rewritten and causes compile errors while the datastructures are in flux */ + +#if 0 +esint8 efsl_initStorage(efsl_storage *efsl_storage,efsl_storage_conf *config) +{ + if(if_init(&(efsl_storage->interface), + config->hwObject, + config->if_init_fptr, + config->if_read_fptr, + config->if_write_fptr, + config->if_ioctl_fptr) + ){ + return(-1); + } + + if(ioman_init(&(efsl_storage->ioman), + &(efsl_storage->interface), + config->ioman_bufmem) + ){ + return(-1); + } + + disc_initDisc(&(efsl_storage->disc),&(efsl_storage->ioman)); + + return(0); +} +/*****************************************************************************/ + +esint8 efsl_initFs(efsl_fs *efsl_filesystem,efsl_fs_conf *config) +{ + efsl_filesystem->storage=config->storage; + + if(config->no_partitions){ + efsl_filesystem->storage->disc.partitions[0].type=0x0B; + efsl_filesystem->storage->disc.partitions[0].LBA_begin=0; + efsl_filesystem->storage->disc.partitions[0].numSectors= + efsl_filesystem->storage->interface.sectorCount; + } + + part_initPartition( + &(efsl_filesystem->partition), + &(efsl_filesystem->storage->disc) + ); + + if(fs_initFs(&(efsl_filesystem->filesystem),&(efsl_filesystem->partition))){ + return(-1); + } + + return(0); +} +/*****************************************************************************/ +#endif + diff --git a/tools/efsl-0.3.6/src/base/efs.c~ b/tools/efsl-0.3.6/src/base/efs.c~ new file mode 100644 index 0000000..ea8a8a5 --- /dev/null +++ b/tools/efsl-0.3.6/src/base/efs.c~ @@ -0,0 +1,91 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : efs.c * +* Release : 0.3 - devel * +* Description : This should become the wrapper around efs. It will contain * +* functions like efs_init etc. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + + +/*****************************************************************************/ +#include "efs.h" +/*****************************************************************************/ + +/* This stuff must be rewritten and causes compile errors while the datastructures are in flux */ + +esint8 efsl_initStorage(efsl_storage *efsl_storage,efsl_storage_conf *config) +{ + if(if_init(&(efsl_storage->interface), + config->hwObject, + config->if_init_fptr, + config->if_read_fptr, + config->if_write_fptr, + config->if_ioctl_fptr) + ){ + return(-1); + } + + if(ioman_init(&(efsl_storage->ioman), + &(efsl_storage->interface), + config->ioman_bufmem) + ){ + return(-1); + } + + disc_initDisc(&(efsl_storage->disc),&(efsl_storage->ioman)); + + return(0); +} +/*****************************************************************************/ + +esint8 efsl_initFs(efsl_fs *efsl_filesystem,efsl_fs_conf *config) +{ + efsl_filesystem->storage=config->storage; + + if(config->no_partitions){ + efsl_filesystem->storage->disc.partitions[0].type=0x0B; + efsl_filesystem->storage->disc.partitions[0].LBA_begin=0; + efsl_filesystem->storage->disc.partitions[0].numSectors= + efsl_filesystem->storage->interface.sectorCount; + } + + part_initPartition( + &(efsl_filesystem->partition), + &(efsl_filesystem->storage->disc) + ); + + if(fs_initFs(&(efsl_filesystem->filesystem),&(efsl_filesystem->partition))){ + return(-1); + } + + return(0); +} +/*****************************************************************************/ + + diff --git a/tools/efsl-0.3.6/src/base/extract.c b/tools/efsl-0.3.6/src/base/extract.c new file mode 100644 index 0000000..7b4b773 --- /dev/null +++ b/tools/efsl-0.3.6/src/base/extract.c @@ -0,0 +1,57 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : extract.c * +* Release : 0.3 - devel * +* Description : This file contains functions to copy structures that get * +* corrupted when using direct memory copy * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "extract.h" +/*****************************************************************************/ + +#if !(defined(BYTE_ALIGNMENT)) +#warning "Compiling f_setbxx" +void ex_setb16(euint8* buf,euint16 data) +{ + buf[1] = data>>8; + buf[0] = data>>0; +} + +void ex_setb32(euint8* buf,euint32 data) +{ + buf[3] = data>>24; + buf[2] = data>>16; + buf[1] = data>>8; + buf[0] = data>>0; +} +#endif + + + diff --git a/tools/efsl-0.3.6/src/base/include/debug.h b/tools/efsl-0.3.6/src/base/include/debug.h new file mode 100644 index 0000000..90c9294 --- /dev/null +++ b/tools/efsl-0.3.6/src/base/include/debug.h @@ -0,0 +1,104 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : debug.h * +* Release : 0.3 - devel * +* Description : These functions are used for debugging output on different * +* environments * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __DEBUG_H__ +#define __DEBUG_H__ + +/*****************************************************************************/ +#include "types.h" +#include "config.h" +/*****************************************************************************/ + +#ifndef DEBUG + #define TXT(x) ; + #define DBG(x) ; + #define FUNC_IN(x) ; + #define FUNC_OUT(x) ; +#endif + +#ifdef DEBUG + + #ifdef HW_ENDPOINT_ATMEGA128_SD + #include + #include + #include + #include + + #define TXT(x) PSTR(x) + #define DBG(x) debug x + #define FUNC_IN(x) ; + #define FUNC_OUT(x) ; + #endif + + #ifdef HW_ENDPOINT_LINUX + #include + #include + + #define TXT(x) x + #define DBG(x) debug x + #define FUNC_IN(x) debug_funcin(x) + #define FUNC_OUT(x) debug_funcout(x) + #endif + + #ifdef HW_ENDPOINT_DSP_TI6713_SD + #include + #include + + #define TXT(x) x + #define DBG(x) printf x + #define FUNC_IN(x) ; + #define FUNC_OUT(x) ; + #endif + + void debug(const eint8 *format, ...); + void debug_init(); + void debug_end(); + + #ifdef HW_ENDPOINT_LINUX + FILE* debugfile; + volatile euint8 tw; + void debug_funcin(const eint8 *format, ...); + void debug_funcout(const eint8 *format, ...); + euint8 debug_getByte(); + euint8 debug_getString(euint8 *data,euint16 length); + #endif + + #ifdef HW_ENDPOINT_ATMEGA128_SD + void debug_initUART(euint16 baudrate ); + void debug_sendByte(euint8 data ); + #endif + +#endif + +#endif diff --git a/tools/efsl-0.3.6/src/base/include/disc.h b/tools/efsl-0.3.6/src/base/include/disc.h new file mode 100644 index 0000000..295f72c --- /dev/null +++ b/tools/efsl-0.3.6/src/base/include/disc.h @@ -0,0 +1,91 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : disc.h * +* Release : 0.3 - devel * +* Description : This file contains the functions regarding the whole disc * +* such as loading the MBR and performing read/write tests. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __DISC_H_ +#define __DISC_H_ + +/*****************************************************************************/ +#include "config.h" +#include "types.h" +#include "extract.h" +#include "debug.h" +#include "error.h" +#include "interface.h" +#include "ioman.h" + +/*****************************************************************************/ + +#define LBA_ADDR_MBR 0 +#define PARTITION_TABLE_OFFSET 0x1BE + +/**********************************************************\ + PartitionField + ------------ +* uchar type Type of partition +* ulong LBA_begin LBA address of first sector. +* ulong numSectors Number of 512byte sectors +This structure is a literal representation of a 16 byte +partitionfield. Direct I/O is possible. +\**********************************************************/ +struct _PartitionField{ + euint8 bootFlag; + euint8 CHS_begin[3]; + euint8 type; + euint8 CHS_end[3]; + euint32 LBA_begin; + euint32 numSectors; +}; +typedef struct _PartitionField PartitionField; + +#define SIZE_PARTITION_FIELD 16 + +/***************************************************************************************\ + Disc + -- +* CompactFlash* sourcedisc Pointer to the hardwareobject that this disc is on. +* PartitionField* partitions Array of PartitionFields, containing the partition info +\***************************************************************************************/ +struct _Disc{ + IOManager *ioman; + DISC_ERR_EUINT8 +}; +typedef struct _Disc Disc; + +void disc_initDisc(Disc *disc,IOManager *ioman); + +euint8 disc_findPartition(Disc *disc, euint8 partitionType, euint8 partitionIndex, euint32* startSector, euint32* sectorCount); + +#include "sextract.h" + +#endif diff --git a/tools/efsl-0.3.6/src/base/include/disc.h~ b/tools/efsl-0.3.6/src/base/include/disc.h~ new file mode 100644 index 0000000..107aa29 --- /dev/null +++ b/tools/efsl-0.3.6/src/base/include/disc.h~ @@ -0,0 +1,91 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : disc.h * +* Release : 0.3 - devel * +* Description : This file contains the functions regarding the whole disc * +* such as loading the MBR and performing read/write tests. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __DISC_H_ +#define __DISC_H_ + +/*****************************************************************************/ +#include "config.h" +#include "types.h" +#include "extract.h" +#include "debug.h" +#include "error.h" +#include "interface.h" +#include "ioman.h" + +/*****************************************************************************/ + +#define LBA_ADDR_MBR 0 +#define PARTITION_TABLE_OFFSET 0x1BE + +/**********************************************************\ + PartitionField + ------------ +* uchar type Type of partition +* ulong LBA_begin LBA address of first sector. +* ulong numSectors Number of 512byte sectors +This structure is a literal representation of a 16 byte +partitionfield. Direct I/O is possible. +\**********************************************************/ +struct _PartitionField{ + euint8 bootFlag; + euint8 CHS_begin[3]; + euint8 type; + euint8 CHS_end[3]; + euint32 LBA_begin; + euint32 numSectors; +}; +typedef struct _PartitionField PartitionField; + +#define SIZE_PARTITION_FIELD 16 + +/***************************************************************************************\ + Disc + -- +* CompactFlash* sourcedisc Pointer to the hardwareobject that this disc is on. +* PartitionField* partitions Array of PartitionFields, containing the partition info +\***************************************************************************************/ +struct _Disc{ + IOManager *ioman; + DISC_ERR_EUINT8 +}; +typedef struct _Disc Disc; + +void disc_initDisc(Disc *disc,IOManager *ioman); + +euint8 disc_findPartition(euint8 partitionType, euint8 partitionIndex, euint32* startSector, euint32* sectorCount); + +#include "sextract.h" + +#endif diff --git a/tools/efsl-0.3.6/src/base/include/efs.h b/tools/efsl-0.3.6/src/base/include/efs.h new file mode 100644 index 0000000..02de6c0 --- /dev/null +++ b/tools/efsl-0.3.6/src/base/include/efs.h @@ -0,0 +1,101 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : efs.c * +* Release : 0.3 - devel * +* Description : This should become the wrapper around efs. It will contain * +* functions like efs_init etc. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __EFS_H__ +#define __EFS_H__ + +/*****************************************************************************/ +#include "types.h" +#include "config.h" +#include "extract.h" +#include "sextract.h" +#include "interface.h" +#include "disc.h" +#include "partition.h" + +/* WARNING !!!! + * These includes DO NOT BELONG HERE, + * remove them when the VFS layer is implemented !!!! + */ +#include "fs.h" +#include "file.h" +#include "time.h" +#include "ui.h" + +/*****************************************************************************/ +#define LINUX_FILE_CONFIG 0x00 +#define AVR_SD_CONFIG 0x01 +/*****************************************************************************/ + + +struct _efsl_storage { + Interface interface; + IOManager ioman; + Disc disc; +}; +typedef struct _efsl_storage efsl_storage; + +struct _efsl_storage_conf { + + void *hwObject; + esint8 (*if_init_fptr)(void*); + esint8 (*if_read_fptr)(void*,euint32,euint8*); + esint8 (*if_write_fptr)(void*,euint32,euint8*); + esint8 (*if_ioctl_fptr)(void*,euint16,void*); + void *ioman_bufmem; +}; +typedef struct _efsl_storage_conf efsl_storage_conf; + +struct _efsl_fs { + efsl_storage *storage; + Partition partition; + FileSystem filesystem; +}; +typedef struct _efsl_fs efsl_fs; + +struct _efsl_fs_conf { + efsl_storage *storage; + euint8 no_partitions; +}; +typedef struct _efsl_fs_conf efsl_fs_conf; + + +/*****************************************************************************/ +esint8 efsl_initStorage(efsl_storage *efsl_storage,efsl_storage_conf *config); +esint8 efsl_initFs(efsl_fs *efsl_filesystem,efsl_fs_conf *config); + + + +#endif + diff --git a/tools/efsl-0.3.6/src/base/include/extract.h b/tools/efsl-0.3.6/src/base/include/extract.h new file mode 100644 index 0000000..4ae5212 --- /dev/null +++ b/tools/efsl-0.3.6/src/base/include/extract.h @@ -0,0 +1,101 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : extract.h * +* Release : 0.3 - devel * +* Description : This file contains functions to copy structures that get * +* corrupted when using direct memory copy * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __EXTRACT_H_ +#define __EXTRACT_H_ + +/*****************************************************************************/ +#include "config.h" +#include "types.h" +/*****************************************************************************/ + +#if !(defined(HOST_LITTLE_ENDIAN)) && !(defined(HOST_BIG_ENDIAN)) +#error Endianess undefined, see config.h +#elif defined(HOST_LITTLE_ENDIAN) && (defined(HOST_BIG_ENDIAN)) +#error Endianess defined as little and big, see config.h +#endif + +/*****************************************************************************/ + +#define end_conv16(x) ((((euint16)(x) & 0xff00) >> 8) | \ + (((euint16)(x) & 0x00ff) << 8)) +#define end_conv32(x) ((((euint32)(x) & 0xff000000) >> 24) | \ + (((euint32)(x) & 0x00ff0000) >> 8) | \ + (((euint32)(x) & 0x0000ff00) << 8) | \ + (((euint32)(x) & 0x000000ff) << 24)) + +/*****************************************************************************/ + +#if defined(BYTE_ALIGNMENT) + #define ex_getb16(buf) (*((euint16*)(buf))) + #define ex_setb16(buf,data) *((euint16*)(buf))=(data) + #define ex_getb32(buf) (*((euint32*)(buf))) + #define ex_setb32(buf,data) *((euint32*)(buf))=(data) +#else + #define ex_getb16(buf) \ + ((euint16)(*((euint8*)(buf)+1)<<8) + \ + (euint16)(*((euint8*)(buf)+0)<<0)) + void ex_setb16(euint8* buf,euint16 data); + #define ex_getb32(buf) \ + ((euint32)(*((euint8*)(buf)+3)<<24) + \ + (euint32)(*((euint8*)(buf)+2)<<16) + \ + (euint32)(*((euint8*)(buf)+1)<<8) + \ + (euint32)(*((euint8*)(buf)+0)<<0)) + void ex_setb32(euint8* buf,euint32 data); +#endif + +#if defined(HOST_LITTLE_ENDIAN) + #define ex_lth16(buf) ex_getb16(buf) + #define ex_lth32(buf) ex_getb32(buf) + #define ex_bth16(buf) end_conv16(ex_getb16(buf)) + #define ex_bth32(buf) end_conv32(ex_getb32(buf)) + + #define ex_htl16(buf) ex_setb16(buf) + #define ex_htl32(buf) ex_setb32(buf) + #define ex_htb16(buf) ex_setb16(end_conv16(buf)) + #define ex_htb32(buf) ex_setb32(end_conv32(buf)) +#elif defined(HOST_BIG_ENDIAN) + #define ex_lth16(buf) end_conv16(ex_getb16(buf)) + #define ex_lth32(buf) end_conv32(ex_getb32(buf)) + #define ex_bth16(buf) ex_getb16(buf) + #define ex_bth32(buf) ex_getb32(buf) + + #define ex_htl16(buf) ex_setb16(end_conv16(buf)) + #define ex_htl32(buf) ex_setb32(end_conv32(buf)) + #define ex_htb16(buf) ex_setb16(buf) + #define ex_htb32(buf) ex_setb32(buf) +#endif + +#endif + diff --git a/tools/efsl-0.3.6/src/base/include/interface.h b/tools/efsl-0.3.6/src/base/include/interface.h new file mode 100644 index 0000000..4121e2d --- /dev/null +++ b/tools/efsl-0.3.6/src/base/include/interface.h @@ -0,0 +1,85 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : interface.c * +* Release : 0.3 - devel * +* Description : This file defines the general I/O interface functions * +* that can be performed on hardware. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#include "config.h" +#include "types.h" +#include "ioctl.h" + +#ifndef MULTIPLE_INTERFACE_SUPPORT +#include HWIFUNC_HEADER +#endif + +#ifndef __INTERFACE_H_ +#define __INTERFACE_H_ + +/* If no multiple interfaces are defined, check if the + hw functions are defines */ +#ifndef MULTIPLE_INTERFACE_SUPPORT + + #ifndef HWIFUNC_INIT + #error "There is no HW_INIT function defined" + #endif + + #ifndef HWIFUNC_READ + #error "There is no HW_READ function defined" + #endif + + #ifndef HWIFUNC_WRITE + #error "There is no HW_WRITE function defined" + #endif + +#endif + +struct _Interface{ +#ifdef MULTIPLE_INTERFACE_SUPPORT + esint8 (*initInterface)(void*); + esint8 (*readBuf)(void*,euint32,euint8*); + esint8 (*writeBuf)(void*,euint32,euint8*); + esint8 (*ioctl)(void*,euint16,void*); +#endif + void* interface_data; + euint32 sectorCount; + euint8 flags; +}; +typedef struct _Interface Interface; + +esint8 if_init(Interface *iface, void* hwData, + esint8 (*initInterface)(void*), + esint8 (*readBuf) (void*, euint32,euint8*), + esint8 (*writeBuf) (void*, euint32,euint8*), + esint8 (*ioctl) (void*,euint16, void*)); +esint8 if_readBuf(Interface *iface, euint32 address, euint8* buf); +esint8 if_writeBuf(Interface *iface, euint32 address, euint8* buf); + +#endif diff --git a/tools/efsl-0.3.6/src/base/include/ioman.h b/tools/efsl-0.3.6/src/base/include/ioman.h new file mode 100644 index 0000000..0be4fd8 --- /dev/null +++ b/tools/efsl-0.3.6/src/base/include/ioman.h @@ -0,0 +1,140 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : ioman.c * +* Release : 0.3 - devel * +* Description : The IO Manager receives all requests for sectors in a central * +* allowing it to make smart decision regarding caching. * +* The IOMAN_NUMBUFFER parameter determines how many sectors * +* ioman can cache. ioman also supports overallocating and * +* backtracking sectors. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __IOMAN_H__ +#define __IOMAN_H__ + +/*****************************************************************************/ +#include "interface.h" +#include "error.h" +#include "plibc.h" +#include "debug.h" +#include "types.h" +#include "config.h" +/*****************************************************************************/ + +#define IOMAN_STATUS_ATTR_VALIDDATA 0 +#define IOMAN_STATUS_ATTR_USERBUFFER 1 +#define IOMAN_STATUS_ATTR_WRITE 2 + +#define IOM_MODE_READONLY 1 +#define IOM_MODE_READWRITE 2 +#define IOM_MODE_EXP_REQ 4 + +struct _IOManStack{ + euint32 sector; + euint8 status; + euint8 usage; +}; +typedef struct _IOManStack IOManStack; + +struct _IOManager{ + Interface *iface; + + euint8 *bufptr; + euint16 numbuf; + euint16 numit; + + IOMAN_ERR_EUINT8 + + IOManStack stack[IOMAN_NUMBUFFER][IOMAN_NUMITERATIONS]; + + euint32 sector[IOMAN_NUMBUFFER]; + euint8 status[IOMAN_NUMBUFFER]; + euint8 usage[IOMAN_NUMBUFFER]; + euint8 reference[IOMAN_NUMBUFFER]; + euint8 itptr[IOMAN_NUMBUFFER]; +#ifdef IOMAN_DO_MEMALLOC + euint8 cache_mem[IOMAN_NUMBUFFER * 512]; +#endif +}; +typedef struct _IOManager IOManager; + +#define IOBJ ioman + +#define ioman_isValid(bp) ioman_getAttr(IOBJ,bp,IOMAN_STATUS_ATTR_VALIDDATA) +#define ioman_isUserBuf(bp) ioman_getAttr(IOBJ,bp,IOMAN_STATUS_ATTR_USERBUFFER) +#define ioman_isWritable(bp) ioman_getAttr(IOBJ,bp,IOMAN_STATUS_ATTR_WRITE) + +#define ioman_setValid(bp) ioman_setAttr(IOBJ,bp,IOMAN_STATUS_ATTR_VALIDDATA,1) +#define ioman_setUserBuf(bp) ioman_setAttr(IOBJ,bp,IOMAN_STATUS_ATTR_USERBUFFER,1) +#define ioman_setWritable(bp) ioman_setAttr(IOBJ,bp,IOMAN_STATUS_ATTR_WRITE,1) + +#define ioman_setNotValid(bp) ioman_setAttr(IOBJ,bp,IOMAN_STATUS_ATTR_VALIDDATA,0) +#define ioman_setNotUserBuf(bp) ioman_setAttr(IOBJ,bp,IOMAN_STATUS_ATTR_USERBUFFER,0) +#define ioman_setNotWritable(bp) ioman_setAttr(IOBJ,bp,IOMAN_STATUS_ATTR_WRITE,0) + +#define ioman_isReqRo(mode) ((mode)&(IOM_MODE_READONLY)) +#define ioman_isReqRw(mode) ((mode)&(IOM_MODE_READWRITE)) +#define ioman_isReqExp(mode) ((mode)&(IOM_MODE_EXP_REQ)) + +esint8 ioman_init(IOManager *ioman, Interface *iface, euint8* bufferarea); +void ioman_reset(IOManager *ioman); +euint8* ioman_getBuffer(IOManager *ioman,euint8* bufferarea); +void ioman_setAttr(IOManager *ioman,euint16 bufplace,euint8 attribute,euint8 val); +euint8 ioman_getAttr(IOManager *ioman,euint16 bufplace,euint8 attribute); +euint8 ioman_getUseCnt(IOManager *ioman,euint16 bufplace); +void ioman_incUseCnt(IOManager *ioman,euint16 bufplace); +void ioman_decUseCnt(IOManager *ioman,euint16 bufplace); +void ioman_resetUseCnt(IOManager *ioman,euint16 bufplace); +euint8 ioman_getRefCnt(IOManager *ioman,euint16 bufplace); +void ioman_incRefCnt(IOManager *ioman,euint16 bufplace); +void ioman_decRefCnt(IOManager *ioman,euint16 bufplace); +void ioman_resetRefCnt(IOManager *ioman,euint16 bufplace); +esint8 ioman_pop(IOManager *ioman,euint16 bufplace); +esint8 ioman_push(IOManager *ioman,euint16 bufplace); +euint8* ioman_getPtr(IOManager *ioman,euint16 bufplace); +esint16 ioman_getBp(IOManager *ioman,euint8* buf); +esint8 ioman_readSector(IOManager *ioman,euint32 address,euint8* buf); +esint8 ioman_writeSector(IOManager *ioman, euint32 address, euint8* buf); +void ioman_resetCacheItem(IOManager *ioman,euint16 bufplace); +esint32 ioman_findSectorInCache(IOManager *ioman, euint32 address); +esint32 ioman_findFreeSpot(IOManager *ioman); +esint32 ioman_findUnusedSpot(IOManager *ioman); +esint32 ioman_findOverallocableSpot(IOManager *ioman); +esint8 ioman_putSectorInCache(IOManager *ioman,euint32 address, euint16 bufplace); +esint8 ioman_flushSector(IOManager *ioman, euint16 bufplace); +euint8* ioman_getSector(IOManager *ioman,euint32 address, euint8 mode); +esint8 ioman_releaseSector(IOManager *ioman,euint8* buf); +esint8 ioman_directSectorRead(IOManager *ioman,euint32 address, euint8* buf); +esint8 ioman_directSectorWrite(IOManager *ioman,euint32 address, euint8* buf); +esint8 ioman_flushRange(IOManager *ioman,euint32 address_low, euint32 address_high); +esint8 ioman_flushAll(IOManager *ioman); + +void ioman_printStatus(IOManager *ioman); + +#endif diff --git a/tools/efsl-0.3.6/src/base/include/ioman_small.h b/tools/efsl-0.3.6/src/base/include/ioman_small.h new file mode 100644 index 0000000..5dc5eed --- /dev/null +++ b/tools/efsl-0.3.6/src/base/include/ioman_small.h @@ -0,0 +1,97 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : ioman_small.c * +* Release : 0.3 - devel * +* Description : The IO Manager receives all requests for sectors in a central * +* allowing it to make smart decision regarding caching. * +* The IOMAN_NUMBUFFER parameter determines how many sectors * +* ioman can cache. ioman also supports overallocating and * +* backtracking sectors. * +* This is the small version of IOMan, for systems with limited * +* resources. It features only one fixed buffer, and has * +* simplified operation * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#include "interface.h" +#include "error.h" +#include "plibc.h" +#include "debug.h" +#include "types.h" +#include "config.h" + +#define IOMAN_STATUS_ATTR_VALIDDATA 0 +#define IOMAN_STATUS_ATTR_USERBUFFER 1 +#define IOMAN_STATUS_ATTR_WRITE 2 + +#define IOM_MODE_READONLY 1 +#define IOM_MODE_READWRITE 2 +#define IOM_MODE_EXP_REQ 4 + +struct _IOManStack{ + euint32 sector; + euint8 status; +}; +typedef struct _IOManStack IOManStack; + +struct _IOManager{ + Interface *iface; + + euint8 bufptr[512]; + + IOMAN_ERR_EUINT8 + + euint32 sector; + euint8 status; + euint8 itptr; + IOManStack stack; +}; +typedef struct _IOManager IOManager; + +#define IOBJ ioman + +#define ioman_isValid() ioman_getAttr(IOBJ,IOMAN_STATUS_ATTR_VALIDDATA) +#define ioman_isUserBuf() ioman_getAttr(IOBJ,IOMAN_STATUS_ATTR_USERBUFFER) +#define ioman_isWritable() ioman_getAttr(IOBJ,IOMAN_STATUS_ATTR_WRITE) + +#define ioman_setValid() ioman_setAttr(IOBJ,IOMAN_STATUS_ATTR_VALIDDATA,1) +#define ioman_setUserBuf() ioman_setAttr(IOBJ,IOMAN_STATUS_ATTR_USERBUFFER,1) +#define ioman_setWritable() ioman_setAttr(IOBJ,IOMAN_STATUS_ATTR_WRITE,1) + +#define ioman_setNotValid() ioman_setAttr(IOBJ,IOMAN_STATUS_ATTR_VALIDDATA,0) +#define ioman_setNotUserBuf() ioman_setAttr(IOBJ,IOMAN_STATUS_ATTR_USERBUFFER,0) +#define ioman_setNotWritable() ioman_setAttr(IOBJ,IOMAN_STATUS_ATTR_WRITE,0) + +#define ioman_isReqRo(mode) ((mode)&(IOM_MODE_READONLY)) +#define ioman_isReqRw(mode) ((mode)&(IOM_MODE_READWRITE)) +#define ioman_isReqExp(mode) ((mode)&(IOM_MODE_EXP_REQ)) + +esint8 ioman_init(IOManager *ioman, Interface *iface, euint8* bufferarea); +void ioman_reset(IOManager *ioman); +void ioman_setAttr(IOManager *ioman,euint8 attribute,euint8 val); +euint8 ioman_getAttr(IOManager *ioman,euint8 attribute); diff --git a/tools/efsl-0.3.6/src/base/include/partition.h b/tools/efsl-0.3.6/src/base/include/partition.h new file mode 100644 index 0000000..d3caa61 --- /dev/null +++ b/tools/efsl-0.3.6/src/base/include/partition.h @@ -0,0 +1,80 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : partition.c * +* Release : 0.3 - devel * +* Description : These functions are partition specific. Searching FAT type * +* partitions and read/write functions to partitions. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __PARTITION_H__ +#define __PARTITION_H__ + +/*****************************************************************************/ +#include "config.h" +#include "error.h" +#include "interface.h" +#include "disc.h" +#include "types.h" +/*****************************************************************************/ + +#define PT_EMPTY 0x00 +#define PT_FAT12 0x01 +#define PT_FAT16A 0x04 +#define PT_EXTENDED 0x05 +#define PT_FAT16 0x06 +#define PT_FAT32 0x0B +#define PT_FAT32A 0x5C +#define PT_FAT16B 0x5E + +/*************************************************************************************\ + Partition + ------- +* Disc* disc Pointer to disc containing this partition. +* eint8 activePartition Array subscript for disc->partitions[activePartition] +\*************************************************************************************/ +struct _Partition{ + Disc *disc; + euint32 LBA_offset; + euint32 LBA_sectorcount; +}; +typedef struct _Partition Partition; + +void part_initPartition(Partition *part,Disc* refDisc); + +euint8* part_getSect(Partition *part, euint32 address,euint8 mode); +esint8 part_relSect(Partition *part, euint8* buf); + +esint8 part_flushPart(Partition *part,euint32 addr_l, euint32 addr_h); + +esint8 part_directSectorRead(Partition *part, euint32 address, euint8* buf); +esint8 part_directSectorWrite(Partition *part, euint32 address, euint8* buf); + +#include "extract.h" + +#endif diff --git a/tools/efsl-0.3.6/src/base/include/partition.h~ b/tools/efsl-0.3.6/src/base/include/partition.h~ new file mode 100644 index 0000000..377b5d8 --- /dev/null +++ b/tools/efsl-0.3.6/src/base/include/partition.h~ @@ -0,0 +1,81 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : partition.c * +* Release : 0.3 - devel * +* Description : These functions are partition specific. Searching FAT type * +* partitions and read/write functions to partitions. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __PARTITION_H__ +#define __PARTITION_H__ + +/*****************************************************************************/ +#include "config.h" +#include "error.h" +#include "interface.h" +#include "disc.h" +#include "types.h" +/*****************************************************************************/ + +#define PT_EMPTY 0x00 +#define PT_FAT12 0x01 +#define PT_FAT16A 0x04 +#define PT_EXTENDED 0x05 +#define PT_FAT16 0x06 +#define PT_FAT32 0x0B +#define PT_FAT32A 0x5C +#define PT_FAT16B 0x5E + +/*************************************************************************************\ + Partition + ------- +* Disc* disc Pointer to disc containing this partition. +* eint8 activePartition Array subscript for disc->partitions[activePartition] +\*************************************************************************************/ +struct _Partition{ + Disc *disc; + euint32 LBA_offset; + euint32 LBA_sectorcount; +}; +typedef struct _Partition Partition; + +void part_initPartition(Partition *part,Disc* refDisc); + +euint8* part_getSect(Partition *part, euint32 address,euint8 mode); +esint8 part_relSect(Partition *part, euint8* buf); + +esint8 part_flushPart(Partition *part,euint32 addr_l, euint32 addr_h); + +esint8 part_directSectorRead(Partition *part, euint32 address, euint8* buf); +esint8 part_directSectorWrite(Partition *part, euint32 address, euint8* buf); +euint32 part_getRealLBA(Partition *part,euint32 address); + +#include "extract.h" + +#endif diff --git a/tools/efsl-0.3.6/src/base/include/plibc.h b/tools/efsl-0.3.6/src/base/include/plibc.h new file mode 100644 index 0000000..30d86bd --- /dev/null +++ b/tools/efsl-0.3.6/src/base/include/plibc.h @@ -0,0 +1,49 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : plibc.c * +* Release : 0.3 - devel * +* Description : This file contains replacements of common c library functions * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __PLIBC_H__ +#define __PLIBC_H__ + +/*****************************************************************************/ +#include "debug.h" +#include "types.h" +#include "config.h" +/*****************************************************************************/ + +euint16 strMatch(eint8* bufa, eint8*bufb,euint32 n); +void memCpy(void* psrc, void* pdest, euint32 size); +void memClr(void *pdest,euint32 size); +void memSet(void *pdest,euint32 size,euint8 data); + + +#endif diff --git a/tools/efsl-0.3.6/src/base/include/sextract.h b/tools/efsl-0.3.6/src/base/include/sextract.h new file mode 100644 index 0000000..b12494c --- /dev/null +++ b/tools/efsl-0.3.6/src/base/include/sextract.h @@ -0,0 +1,52 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : sextract.c * +* Release : 0.3 - devel * +* Description : The function in this file are to load and set the structures * +* as found on the disc, only those structures for the entire * +* library are located here, filesystem specific ones are in * +* that filesystems directory * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __SEXTRACT_H_ +#define __SEXTRACT_H_ + +#include "config.h" +#include "types.h" +#include "extract.h" +#include "disc.h" +/*#include "partition.h"*/ + +void ex_setPartitionField(euint8* buf,PartitionField* pf); +void ex_getPartitionField(euint8* buf,PartitionField* pf); + +#endif + + + diff --git a/tools/efsl-0.3.6/src/base/interface.c b/tools/efsl-0.3.6/src/base/interface.c new file mode 100644 index 0000000..ef1985d --- /dev/null +++ b/tools/efsl-0.3.6/src/base/interface.c @@ -0,0 +1,83 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : interface.c * +* Release : 0.3 - devel * +* Description : This file defines the general I/O interface functions * +* that can be performed on hardware. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#include "interface.h" + +esint8 if_init(Interface *iface, void* hwData, + esint8 (*initInterface)(void*), + esint8 (*readBuf) (void*, euint32,euint8*), + esint8 (*writeBuf) (void*, euint32,euint8*), + esint8 (*ioctl) (void*,euint16,void*)) +{ + esint8 r; + + iface->flags=0; + iface->sectorCount=0; + iface->interface_data=hwData; +#ifdef MULTIPLE_INTERFACE_SUPPORT + iface->initInterface=initInterface; + iface->readBuf=readBuf; + iface->writeBuf=writeBuf; + iface->ioctl=ioctl; + r=iface->initInterface(iface->interface_data); +#else + r=HWIFUNC_INIT(iface->interface_data); +#endif + + if(!r){ /* Init OK, try to get some info */ + if(iface->ioctl(iface->interface_data,IOCTL_SECTORCOUNT,(void*)&(iface->sectorCount))){ + iface->sectorCount=0; /* Device doesn't know */ + } + } + return(r); +} + +esint8 if_readBuf(Interface *iface, euint32 address, euint8* buf) +{ +#ifdef MULTIPLE_INTERFACE_SUPPORT + return(iface->readBuf(iface->interface_data,address,buf)); +#else + return(HWIFUNC_READ(iface->interface_data,address,buf)); +#endif +} + + +esint8 if_writeBuf(Interface *iface, euint32 address, euint8* buf) +{ +#ifdef MULTIPLE_INTERFACE_SUPPORT + return(iface->writeBuf(iface->interface_data,address,buf)); +#else + return(HWIFUNC_WRITE(iface->interface_data,address,buf)); +#endif +} diff --git a/tools/efsl-0.3.6/src/base/interface.c~ b/tools/efsl-0.3.6/src/base/interface.c~ new file mode 100644 index 0000000..ef1985d --- /dev/null +++ b/tools/efsl-0.3.6/src/base/interface.c~ @@ -0,0 +1,83 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : interface.c * +* Release : 0.3 - devel * +* Description : This file defines the general I/O interface functions * +* that can be performed on hardware. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#include "interface.h" + +esint8 if_init(Interface *iface, void* hwData, + esint8 (*initInterface)(void*), + esint8 (*readBuf) (void*, euint32,euint8*), + esint8 (*writeBuf) (void*, euint32,euint8*), + esint8 (*ioctl) (void*,euint16,void*)) +{ + esint8 r; + + iface->flags=0; + iface->sectorCount=0; + iface->interface_data=hwData; +#ifdef MULTIPLE_INTERFACE_SUPPORT + iface->initInterface=initInterface; + iface->readBuf=readBuf; + iface->writeBuf=writeBuf; + iface->ioctl=ioctl; + r=iface->initInterface(iface->interface_data); +#else + r=HWIFUNC_INIT(iface->interface_data); +#endif + + if(!r){ /* Init OK, try to get some info */ + if(iface->ioctl(iface->interface_data,IOCTL_SECTORCOUNT,(void*)&(iface->sectorCount))){ + iface->sectorCount=0; /* Device doesn't know */ + } + } + return(r); +} + +esint8 if_readBuf(Interface *iface, euint32 address, euint8* buf) +{ +#ifdef MULTIPLE_INTERFACE_SUPPORT + return(iface->readBuf(iface->interface_data,address,buf)); +#else + return(HWIFUNC_READ(iface->interface_data,address,buf)); +#endif +} + + +esint8 if_writeBuf(Interface *iface, euint32 address, euint8* buf) +{ +#ifdef MULTIPLE_INTERFACE_SUPPORT + return(iface->writeBuf(iface->interface_data,address,buf)); +#else + return(HWIFUNC_WRITE(iface->interface_data,address,buf)); +#endif +} diff --git a/tools/efsl-0.3.6/src/base/ioman.c b/tools/efsl-0.3.6/src/base/ioman.c new file mode 100644 index 0000000..9397d66 --- /dev/null +++ b/tools/efsl-0.3.6/src/base/ioman.c @@ -0,0 +1,595 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : ioman.c * +* Release : 0.3 - devel * +* Description : The IO Manager receives all requests for sectors in a central * +* allowing it to make smart decision regarding caching. * +* The IOMAN_NUMBUFFER parameter determines how many sectors * +* ioman can cache. ioman also supports overallocating and * +* backtracking sectors. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "ioman.h" +/*****************************************************************************/ + +esint8 ioman_init(IOManager *ioman, Interface *iface, euint8* bufferarea) +{ + ioman->iface=iface; + + ioman->bufptr = ioman_getBuffer(ioman,bufferarea); + ioman->numbuf = IOMAN_NUMBUFFER; + ioman->numit = IOMAN_NUMITERATIONS; + + ioman_reset(ioman); + return(0); +} +/*****************************************************************************/ + +void ioman_reset(IOManager *ioman) +{ + euint16 nb,ni; + + memClr(ioman->sector,sizeof(euint32)*ioman->numbuf); + memClr(ioman->status,sizeof(euint8) *ioman->numbuf); + memClr(ioman->usage ,sizeof(euint8) *ioman->numbuf); + memClr(ioman->itptr ,sizeof(euint8) *ioman->numbuf); + ioman_setError(ioman,IOMAN_NOERROR); + + for(nb=0;nbnumbuf;nb++){ + for(ni=0;ninumit;ni++){ + ioman->stack[nb][ni].sector=0; + ioman->stack[nb][ni].status=0; + ioman->stack[nb][ni].usage =0; + } + } +} +/*****************************************************************************/ + +euint8* ioman_getBuffer(IOManager *ioman,euint8* bufferarea) +{ +#ifdef IOMAN_DO_MEMALLOC + return(ioman->cache_mem); +#else + return(bufferarea); +#endif +} +/*****************************************************************************/ + +void ioman_setAttr(IOManager *ioman,euint16 bufplace,euint8 attribute,euint8 val) +{ + if(bufplace>=ioman->numbuf){ + ioman_setError(ioman,IOMAN_ERR_SETATTROUTOFBOUNDS); + return; /* Out of bounds */ + } + + if(val){ + ioman->status[bufplace]|=1<status[bufplace]&=~(1<=ioman->numbuf){ + ioman_setError(ioman,IOMAN_ERR_GETATTROUTOFBOUNDS); + return(0xFF); /* Out of bounds */ + } + + return(ioman->status[bufplace]&(1<=ioman->numbuf){ + ioman_setError(ioman,IOMAN_ERR_OPOUTOFBOUNDS); + return(0x00); + } + return(ioman->usage[bufplace]); +} +/*****************************************************************************/ + + +void ioman_incUseCnt(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf){ + ioman_setError(ioman,IOMAN_ERR_OPOUTOFBOUNDS); + return; + } + if(ioman->usage[bufplace]==0xFF)return; + else ioman->usage[bufplace]++; +} +/*****************************************************************************/ + +void ioman_decUseCnt(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf){ + ioman_setError(ioman,IOMAN_ERR_OPOUTOFBOUNDS); + return; + } + if(ioman->usage[bufplace]==0x0)return; + else ioman->usage[bufplace]--; +} +/*****************************************************************************/ + +void ioman_resetUseCnt(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf){ + ioman_setError(ioman,IOMAN_ERR_OPOUTOFBOUNDS); + return; + } + ioman->usage[bufplace]=0x00; +} +/*****************************************************************************/ + +euint8 ioman_getRefCnt(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf){ + ioman_setError(ioman,IOMAN_ERR_OPOUTOFBOUNDS); + return(0x00); + } + return(ioman->reference[bufplace]); +} +/*****************************************************************************/ + +void ioman_incRefCnt(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf){ + ioman_setError(ioman,IOMAN_ERR_OPOUTOFBOUNDS); + return; + } + if(ioman->reference[bufplace]==0xFF)return; + else ioman->reference[bufplace]++; +} +/*****************************************************************************/ + +void ioman_decRefCnt(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf){ + ioman_setError(ioman,IOMAN_ERR_OPOUTOFBOUNDS); + return; + } + if(ioman->reference[bufplace]==0x00)return; + else ioman->reference[bufplace]--; +} +/*****************************************************************************/ + +void ioman_resetRefCnt(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf){ + ioman_setError(ioman,IOMAN_ERR_OPOUTOFBOUNDS); + return; + } + ioman->reference[bufplace]=0x00; +} +/*****************************************************************************/ + +esint8 ioman_pop(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf){ + ioman_setError(ioman,IOMAN_ERR_POPEMPTYSTACK); + return(-1); + } + if(ioman->itptr[bufplace]==0 || ioman->itptr[bufplace]>IOMAN_NUMITERATIONS)return(-1); + ioman->sector[bufplace] = ioman->stack[bufplace][ioman->itptr[bufplace]].sector; + ioman->status[bufplace] = ioman->stack[bufplace][ioman->itptr[bufplace]].status; + ioman->usage[bufplace] = ioman->stack[bufplace][ioman->itptr[bufplace]].usage; + ioman->itptr[bufplace]--; + return(0); +} +/*****************************************************************************/ + +esint8 ioman_push(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf){ + ioman_setError(ioman,IOMAN_ERR_OPOUTOFBOUNDS); + return(-1); + } + if(ioman->itptr[bufplace]>=IOMAN_NUMITERATIONS){ + ioman_setError(ioman,IOMAN_ERR_PUSHBEYONDSTACK); + return(-1); + } + ioman->itptr[bufplace]++; + ioman->stack[bufplace][ioman->itptr[bufplace]].sector = ioman->sector[bufplace]; + ioman->stack[bufplace][ioman->itptr[bufplace]].status = ioman->status[bufplace]; + ioman->stack[bufplace][ioman->itptr[bufplace]].usage = ioman->usage[bufplace]; + return(0); +} +/*****************************************************************************/ + +euint8* ioman_getPtr(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf){ + ioman_setError(ioman,IOMAN_ERR_OPOUTOFBOUNDS); + return(0); + } + return(ioman->bufptr+bufplace*512); +} +/*****************************************************************************/ + +esint16 ioman_getBp(IOManager *ioman,euint8* buf) +{ + if(buf<(ioman->bufptr) || buf>=( ioman->bufptr+(ioman->numbuf*512) )){ + ioman_setError(ioman,IOMAN_ERR_CACHEPTROUTOFRANGE); + return(-1); + } + return((buf-(ioman->bufptr))/512); +} +/*****************************************************************************/ + +esint8 ioman_readSector(IOManager *ioman,euint32 address,euint8* buf) +{ + esint8 r; + + if(buf==0){ + return(-1); + } + + r=if_readBuf(ioman->iface,address,buf); + + if(r!=0){ + ioman_setError(ioman,IOMAN_ERR_READFAIL); + return(-1); + } + return(0); +} +/*****************************************************************************/ + +esint8 ioman_writeSector(IOManager *ioman, euint32 address, euint8* buf) +{ + esint8 r; + + if(buf==0)return(-1); + + r=if_writeBuf(ioman->iface,address,buf); + + if(r<=0){ + ioman_setError(ioman,IOMAN_ERR_WRITEFAIL); + return(-1); + } + return(0); +} +/*****************************************************************************/ + +void ioman_resetCacheItem(IOManager *ioman,euint16 bufplace) +{ + if(bufplace>=ioman->numbuf){ + ioman_setError(ioman,IOMAN_ERR_OPOUTOFBOUNDS); + return; + } + ioman->sector[bufplace] = 0; + ioman->status[bufplace] = 0; + ioman->usage[bufplace] = 0; + ioman->reference[bufplace] = 0; +} +/*****************************************************************************/ + +esint32 ioman_findSectorInCache(IOManager *ioman, euint32 address) +{ + euint16 c; + + for(c=0;cnumbuf;c++){ + if(ioman_isValid(c) && ioman->sector[c] == address)return(c); + } + return(-1); +} +/*****************************************************************************/ + +esint32 ioman_findFreeSpot(IOManager *ioman) +{ + euint16 c; + + for(c=0;cnumbuf;c++){ + if(!ioman_isValid(c))return(c); + } + return(-1); +} +/*****************************************************************************/ + +esint32 ioman_findUnusedSpot(IOManager *ioman) +{ + esint32 r=-1; + euint16 c; + euint8 fr=0,lr=0xFF; + + for(c=0;cnumbuf;c++){ + if(ioman_getUseCnt(ioman,c)==0){ + if(!ioman_isWritable(c) && !fr){ + fr=1; + lr=0xFF; + r=-1; + } + if(ioman_isWritable(c) && !fr){ + if(ioman_getRefCnt(ioman,c)<=lr){ + r=c; + lr=ioman_getRefCnt(ioman,c); + } + } + if(fr && !ioman_isWritable(c)){ + if(ioman_getRefCnt(ioman,c)<=lr){ + r=c; + lr=ioman_getRefCnt(ioman,c); + } + } + } + } + return(r); +} +/*****************************************************************************/ + +esint32 ioman_findOverallocableSpot(IOManager *ioman) +{ + euint8 points,lp=0xFF; + euint16 c; + esint32 r=-1; + + for(c=0;cnumbuf;c++){ + if(ioman->itptr[c]numit){ + points = 0; + if(ioman_isWritable(c))points+=0x7F; + points += ((euint16)(ioman->itptr[c]*0x4D))/(ioman->numit); + points += ((euint16)(ioman_getRefCnt(ioman,c)*0x33))/0xFF; + if(pointssector[bufplace]=address; + return(0); +} +/***************** if(bufplace>=ioman->numbuf)return; +************************************************************/ + +esint8 ioman_flushSector(IOManager *ioman, euint16 bufplace) +{ + euint8* buf; + + if((buf = ioman_getPtr(ioman,bufplace))==0){ + ioman_setError(ioman,IOMAN_ERR_CACHEPTROUTOFRANGE); + return(-1); + } + if(!ioman_isWritable(bufplace)){ + ioman_setError(ioman,IOMAN_ERR_WRITEREADONLYSECTOR); + return(-1); + } + if(!(ioman_writeSector(ioman,ioman->sector[bufplace],buf))){ /* ERROR HERE STILL TO BE FIXED -> ! must be removed! */ + ioman_setError(ioman,IOMAN_ERR_WRITEFAIL); + return(-1); + } + if(ioman->usage==0)ioman_setNotWritable(bufplace); + return(0); +} +/*****************************************************************************/ + +esint8 ioman_flushRange(IOManager *ioman,euint32 address_low, euint32 address_high) +{ + euint32 c; + + if(address_low>address_high){ + c=address_low; address_low=address_high;address_high=c; + } + + for(c=0;cnumbuf;c++){ + if((ioman->sector[c]>=address_low) && (ioman->sector[c]<=address_high) && (ioman_isWritable(c))){ + if(ioman_flushSector(ioman,c)){ + return(-1); + } + if(ioman->usage[c]==0)ioman_setNotWritable(c); + } + } + return(0); +} +/*****************************************************************************/ + +esint8 ioman_flushAll(IOManager *ioman) +{ + euint16 c; + + for(c=0;cnumbuf;c++){ + if(ioman_isWritable(c)){ + if(ioman_flushSector(ioman,c)){ + return(-1); + } + if(ioman->usage[c]==0)ioman_setNotWritable(c); + } + } + return(0); +} +/*****************************************************************************/ + +euint8* ioman_getSector(IOManager *ioman,euint32 address, euint8 mode) +{ + esint32 bp; + + if((bp=ioman_findSectorInCache(ioman,address))!=-1){ + if(ioman_isReqRw(mode)){ + ioman_setWritable(bp); + } + ioman_incUseCnt(ioman,bp); + if(!ioman_isReqExp(mode))ioman_incRefCnt(ioman,bp); + return(ioman_getPtr(ioman,bp)); + } + + if((bp=ioman_findFreeSpot(ioman))==-1){ + if(((bp=ioman_findUnusedSpot(ioman))!=-1)&&(ioman_isWritable(bp))){ + ioman_flushSector(ioman,bp); + } + } + + if(bp!=-1){ + ioman_resetCacheItem(ioman,bp); + if((ioman_putSectorInCache(ioman,address,bp))){ + return(0); + } + if(mode==IOM_MODE_READWRITE){ + ioman_setWritable(bp); + } + ioman_incUseCnt(ioman,bp); + if(!ioman_isReqExp(mode))ioman_incRefCnt(ioman,bp); + return(ioman_getPtr(ioman,bp)); + } + + if((bp=ioman_findOverallocableSpot(ioman))!=-1){ + if(ioman_isWritable(bp)){ + ioman_flushSector(ioman,bp); + } + if(ioman_push(ioman,bp)){ + return(0); + } + ioman_resetCacheItem(ioman,bp); + if((ioman_putSectorInCache(ioman,address,bp))){ + return(0); + } + if(ioman_isReqRw(mode)){ + ioman_setWritable(bp); + } + ioman_incUseCnt(ioman,bp); + if(!ioman_isReqExp(mode))ioman_incRefCnt(ioman,bp); + return(ioman_getPtr(ioman,bp)); + } + ioman_setError(ioman,IOMAN_ERR_NOMEMORY); + return(0); +} +/*****************************************************************************/ + +esint8 ioman_releaseSector(IOManager *ioman,euint8* buf) +{ + euint16 bp; + + bp=ioman_getBp(ioman,buf); + ioman_decUseCnt(ioman,bp); + + if(ioman_getUseCnt(ioman,bp)==0 && ioman->itptr[bp]!=0){ + if(ioman_isWritable(bp)){ + ioman_flushSector(ioman,bp); + } + ioman_pop(ioman,bp); + ioman_putSectorInCache(ioman,ioman->sector[bp],bp); + } + return(0); +} +/*****************************************************************************/ + +esint8 ioman_directSectorRead(IOManager *ioman,euint32 address, euint8* buf) +{ + euint8* ibuf; + esint16 bp; + + if((bp=ioman_findSectorInCache(ioman,address))!=-1){ + ibuf=ioman_getPtr(ioman,bp); + memCpy(ibuf,buf,512); + return(0); + } + + if((bp=ioman_findFreeSpot(ioman))!=-1){ + if((ioman_putSectorInCache(ioman,address,bp))){ + return(-1); + } + ibuf=ioman_getPtr(ioman,bp); + memCpy(ibuf,buf,512); + return(0); + } + + if(ioman_readSector(ioman,address,buf)){ + return(-1); + } + + return(0); +} +/*****************************************************************************/ + +esint8 ioman_directSectorWrite(IOManager *ioman,euint32 address, euint8* buf) +{ + euint8* ibuf; + esint16 bp; + + if((bp=ioman_findSectorInCache(ioman,address))!=-1){ + ibuf=ioman_getPtr(ioman,bp); + memCpy(buf,ibuf,512); + ioman_setWritable(bp); + return(0); + } + + if((bp=ioman_findFreeSpot(ioman))!=-1){ + ibuf=ioman_getPtr(ioman,bp); + memCpy(buf,ibuf,512); + ioman_resetCacheItem(ioman,bp); + ioman->sector[bp]=address; + ioman_setWritable(bp); + ioman_setValid(bp); + return(0); + } + + if(ioman_writeSector(ioman,address,buf)){ + return(-1); + } + + return(0); +} +/*****************************************************************************/ + +void ioman_printStatus(IOManager *ioman) +{ + euint16 c; + + DBG((TXT("IO-Manager -- Report\n====================\n"))); + DBG((TXT("Buffer is %i sectors, from %p to %p\n"), + ioman->numbuf,ioman->bufptr,ioman->bufptr+(ioman->numbuf*512))); + for(c=0;cnumbuf;c++){ + if(ioman_isValid(c)){ + DBG((TXT("BP %3i\t SC %8li\t\t US %i\t RF %i\t %s %s\n"), + c,ioman->sector[c],ioman_getUseCnt(ioman,c),ioman_getRefCnt(ioman,c), + ioman_isUserBuf(c) ? "USRBUF" : " ", + ioman_isWritable(c) ? "WRITABLE" : "READONLY")); + } + } +} +/*****************************************************************************/ + diff --git a/tools/efsl-0.3.6/src/base/ioman_small.c b/tools/efsl-0.3.6/src/base/ioman_small.c new file mode 100644 index 0000000..d6ac40c --- /dev/null +++ b/tools/efsl-0.3.6/src/base/ioman_small.c @@ -0,0 +1,119 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : ioman_small.c * +* Release : 0.3 - devel * +* Description : The IO Manager receives all requests for sectors in a central * +* allowing it to make smart decision regarding caching. * +* The IOMAN_NUMBUFFER parameter determines how many sectors * +* ioman can cache. ioman also supports overallocating and * +* backtracking sectors. * +* This is the small version of IOMan, for systems with limited * +* resources. It features only one fixed buffer, and has * +* simplified operation * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#include "ioman_small.h" + +esint8 ioman_init(IOManager *ioman, Interface *iface, euint8* bufferarea) +{ + ioman->iface=iface; + ioman_reset(ioman); + return(0); +} +/*****************************************************************************/ + +void ioman_reset(IOManager *ioman) +{ + ioman->sector=ioman->status=ioman->itptr=0; + ioman->stack.sector=ioman->stack.status=0; + + ioman_setError(ioman,IOMAN_NOERROR); + +} +/*****************************************************************************/ + +void ioman_setAttr(IOManager *ioman,euint8 attribute,euint8 val) +{ + if(val){ + ioman->status|=1<status&=~(1<status&(1<sector){ + if(mode==IOM_MODE_READWRITE)ioman_setWritable(); + return(ioman->bufptr); + } + +} + +esint8 ioman_readSector(IOManager *ioman,euint32 address,euint8* buf) +{ + esint8 r; + + if(buf==0){ + return(-1); + } + + r=if_readBuf(ioman->iface,address,buf); + + if(r!=0){ + ioman_setError(ioman,IOMAN_ERR_READFAIL); + return(-1); + } + return(0); +} +/*****************************************************************************/ + +esint8 ioman_writeSector(IOManager *ioman, euint32 address, euint8* buf) +{ + esint8 r; + + if(buf==0)return(-1); + + r=if_writeBuf(ioman->iface,address,buf); + + if(r<=0){ + ioman_setError(ioman,IOMAN_ERR_WRITEFAIL); + return(-1); + } + return(0); +} +/*****************************************************************************/ diff --git a/tools/efsl-0.3.6/src/base/partition.c b/tools/efsl-0.3.6/src/base/partition.c new file mode 100644 index 0000000..3276b89 --- /dev/null +++ b/tools/efsl-0.3.6/src/base/partition.c @@ -0,0 +1,104 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : partition.c * +* Release : 0.3 - devel * +* Description : These functions are partition specific. Searching FAT type * +* partitions and read/write functions to partitions. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "partition.h" +/*****************************************************************************/ + +/* **************************************************************************** + * void part_initPartition(Partition *part,Disc* refDisc) + * Description: This function searches the 4 partitions for a FAT class partition + * and marks the first one found as the active to be used partition. +*/ +void part_initPartition(Partition *part,Disc* refDisc) +{ + eint16 c; + + part->disc=refDisc; + part->LBA_offset=0; + part->LBA_sectorcount=0; + part_setError(part,PART_NOERROR); +} +/*****************************************************************************/ + +euint8 part_openPartitionType(Partition *part,euint8 type) +{ + return( + disc_findPartition(part->disc,type,0,&(part->LBA_offset),&(part->LBA_sectorcount)) + ); +} + +/* **************************************************************************** + * euint8* part_getSect(Partition *part, euint32 address, euint8 mode) + * Description: This function calls ioman_getSector, but recalculates the sector + * address to be partition relative. + * Return value: Whatever getSector returns. (pointer or 0) +*/ +euint8* part_getSect(Partition *part, euint32 address, euint8 mode) +{ + return(ioman_getSector(part->disc->ioman,part_getRealLBA(part,address),mode)); +} + +/* **************************************************************************** + * esint8 part_relSect(Partition *part, euint8* buf) + * Description: This function calls ioman_releaseSector. + * Return value: Whatever releaseSector returns. +*/ +esint8 part_relSect(Partition *part, euint8* buf) +{ + return(ioman_releaseSector(part->disc->ioman,buf)); +} + +esint8 part_flushPart(Partition *part,euint32 addr_l, euint32 addr_h) +{ + return( + ioman_flushRange(part->disc->ioman,part_getRealLBA(part,addr_l),part_getRealLBA(part,addr_h)) + ); +} + +esint8 part_directSectorRead(Partition *part,euint32 address, euint8* buf) +{ + return( + ioman_directSectorRead(part->disc->ioman,part_getRealLBA(part,address),buf) + ); +} + +esint8 part_directSectorWrite(Partition *part,euint32 address, euint8* buf) +{ + return( + ioman_directSectorWrite(part->disc->ioman,part_getRealLBA(part,address),buf) + ); +} + + diff --git a/tools/efsl-0.3.6/src/base/partition.c~ b/tools/efsl-0.3.6/src/base/partition.c~ new file mode 100644 index 0000000..656b864 --- /dev/null +++ b/tools/efsl-0.3.6/src/base/partition.c~ @@ -0,0 +1,104 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : partition.c * +* Release : 0.3 - devel * +* Description : These functions are partition specific. Searching FAT type * +* partitions and read/write functions to partitions. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "partition.h" +/*****************************************************************************/ + +/* **************************************************************************** + * void part_initPartition(Partition *part,Disc* refDisc) + * Description: This function searches the 4 partitions for a FAT class partition + * and marks the first one found as the active to be used partition. +*/ +void part_initPartition(Partition *part,Disc* refDisc) +{ + eint16 c; + + part->disc=refDisc; + part->LBA_offset=0; + part->LBA_sectorcount=0; + part_setError(part,PART_NOERROR); +} +/*****************************************************************************/ + +euint8 part_openPartitionType(Partition *part,euint8 type) +{ + return( + disc_findPartition(disc,type,0,&(part->LBA_offset),&(part->LBA_sectorcount)) + ); +} + +/* **************************************************************************** + * euint8* part_getSect(Partition *part, euint32 address, euint8 mode) + * Description: This function calls ioman_getSector, but recalculates the sector + * address to be partition relative. + * Return value: Whatever getSector returns. (pointer or 0) +*/ +euint8* part_getSect(Partition *part, euint32 address, euint8 mode) +{ + return(ioman_getSector(part->disc->ioman,part_getRealLBA(part,address),mode)); +} + +/* **************************************************************************** + * esint8 part_relSect(Partition *part, euint8* buf) + * Description: This function calls ioman_releaseSector. + * Return value: Whatever releaseSector returns. +*/ +esint8 part_relSect(Partition *part, euint8* buf) +{ + return(ioman_releaseSector(part->disc->ioman,buf)); +} + +esint8 part_flushPart(Partition *part,euint32 addr_l, euint32 addr_h) +{ + return( + ioman_flushRange(part->disc->ioman,part_getRealLBA(part,addr_l),part_getRealLBA(part,addr_h)) + ); +} + +esint8 part_directSectorRead(Partition *part,euint32 address, euint8* buf) +{ + return( + ioman_directSectorRead(part->disc->ioman,part_getRealLBA(part,address),buf) + ); +} + +esint8 part_directSectorWrite(Partition *part,euint32 address, euint8* buf) +{ + return( + ioman_directSectorWrite(part->disc->ioman,part_getRealLBA(part,address),buf) + ); +} + + diff --git a/tools/efsl-0.3.6/src/base/plibc.c b/tools/efsl-0.3.6/src/base/plibc.c new file mode 100644 index 0000000..ee2c923 --- /dev/null +++ b/tools/efsl-0.3.6/src/base/plibc.c @@ -0,0 +1,83 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : plibc.c * +* Release : 0.3 - devel * +* Description : This file contains replacements of common c library functions * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "plibc.h" +/*****************************************************************************/ + +/* **************************************************************************** + * unsigned short strMatch(char* bufa, char*bufb, unsigned long n) + * Description: Compares bufa and bufb for a length of n bytes. + * Return value: Returns the number of character NOT matching. +*/ +euint16 strMatch(eint8* bufa, eint8*bufb,euint32 n) +{ + euint32 c; + euint16 res=0; + for(c=0;c0){ + *((eint8*)pdest+size-1)=*((eint8*)psrc+size-1); + size--; + } +} +/*****************************************************************************/ + +void memClr(void *pdest,euint32 size) +{ + while(size>0){ + *(((eint8*)pdest)+size-1)=0x00; + size--; + } +} + +void memSet(void *pdest,euint32 size,euint8 data) +{ + while(size>0){ + *(((eint8*)pdest)+size-1)=data; + size--; + } +} + + diff --git a/tools/efsl-0.3.6/src/base/sextract.c b/tools/efsl-0.3.6/src/base/sextract.c new file mode 100644 index 0000000..92cce83 --- /dev/null +++ b/tools/efsl-0.3.6/src/base/sextract.c @@ -0,0 +1,70 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : sextract.c * +* Release : 0.3 - devel * +* Description : The function in this file are to load and set the structures * +* as found on the disc, only those structures for the entire * +* library are located here, filesystem specific ones are in * +* that filesystems directory * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#include "sextract.h" + +void ex_setPartitionField(euint8* buf,PartitionField* pf) +{ + *(buf) = pf->bootFlag; + *(buf+1) = pf->CHS_begin[0]; + *(buf+2) = pf->CHS_begin[1]; + *(buf+3) = pf->CHS_begin[2]; + *(buf+4) = pf->type; + *(buf+5) = pf->CHS_end[0]; + *(buf+6) = pf->CHS_end[1]; + *(buf+7) = pf->CHS_end[2]; + ex_setb32(buf+8,pf->LBA_begin); + ex_setb32(buf+12,pf->numSectors); +} +/*****************************************************************************/ + +void ex_getPartitionField(euint8* buf,PartitionField* pf) +{ + pf->bootFlag = *(buf); + pf->CHS_begin[0] = *(buf + 1); + pf->CHS_begin[1] = *(buf + 2); + pf->CHS_begin[2] = *(buf + 3); + pf->type = *(buf + 4); + pf->CHS_end[0] = *(buf + 5); + pf->CHS_end[1] = *(buf + 6); + pf->CHS_end[2] = *(buf + 7); + pf->LBA_begin = ex_getb32(buf + 8); + pf->numSectors = ex_getb32(buf + 12); +} +/*****************************************************************************/ + + + diff --git a/tools/efsl-0.3.6/src/base/sextract.c~ b/tools/efsl-0.3.6/src/base/sextract.c~ new file mode 100644 index 0000000..b1d60d2 --- /dev/null +++ b/tools/efsl-0.3.6/src/base/sextract.c~ @@ -0,0 +1,70 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : sextract.c * +* Release : 0.3 - devel * +* Description : The function in this file are to load and set the structures * +* as found on the disc, only those structures for the entire * +* library are located here, filesystem specific ones are in * +* that filesystems directory * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#include "sextract.h" + +void ex_setPartitionField(euint8* buf,PartitionField* pf) +{ + *(buf) = pf->bootFlag; + *(buf+1) = pf->CHS_begin[0]; + *(buf+2) = pf->CHS_begin[1]; + *(buf+3) = pf->CHS_begin[2]; + *(buf+4) = pf->type; + *(buf+5) = pf->CHS_end[0]; + *(buf+6) = pf->CHS_end[1]; + *(buf+7) = pf->CHS_end[2]; + ex_setb32(buf+8,pf->LBA_begin); + ex_setb32(buf+12,pf->numSectors); +} +/*****************************************************************************/ + +void ex_getPartitionField(euint8* buf,PartitionField* pf) +{ + pf->bootFlag = *(buf); + pf->CHS_begin[0] = *(buf + 1); + pf->CHS_begin[1] = *(buf + 2); + pf->CHS_begin[2] = *(buf + 3); + pf->type = *(buf + 4); + pf->CHS_end[0] = *(buf + 5); + pf->CHS_end[1] = *(buf + 6); + pf->CHS_end[2] = *(buf + 7); + pf->LBA_begin = ex_getb32(buf + 8); + pf->numSectors = ex_getb32(buf + 12); +} +/*****************************************************************************/ + + + diff --git a/tools/efsl-0.3.6/src/fs/vfat/Makefile b/tools/efsl-0.3.6/src/fs/vfat/Makefile new file mode 100644 index 0000000..8c3ea91 --- /dev/null +++ b/tools/efsl-0.3.6/src/fs/vfat/Makefile @@ -0,0 +1,15 @@ +CONFDIR=../../../conf +include $(CONFDIR)/config.makefile +BASEDIR=../../base/include +INCLUDEDIRS=-I../../include -Iinclude -I$(BASEDIR) -I$(CONFDIR) +CFLAGS=$(GCFLAGS) $(INCLUDEDIRS) + +OBJ=dir.o fat.o file.o fs.o ls.o mkfs.o time.o ui.o + +all: efsl-fs-vfat + +efsl-fs-vfat: $(OBJ) + $(AR) rcs efsl-fs-vfat.a $(OBJ) + +clean: + rm -f $(OBJ) efsl-fs-vfat.a \ No newline at end of file diff --git a/tools/efsl-0.3.6/src/fs/vfat/dir.c b/tools/efsl-0.3.6/src/fs/vfat/dir.c new file mode 100644 index 0000000..2cc2cc8 --- /dev/null +++ b/tools/efsl-0.3.6/src/fs/vfat/dir.c @@ -0,0 +1,361 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : dir.c * +* Release : 0.3 - devel * +* Description : The functions of dir.c are part of fs.c, they deal with all * +* the directory specific stuff. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "dir.h" +/*****************************************************************************/ + +/* **************************************************************************** + * void dir_getFileStructure(FileSystem *fs,FileRecord *filerec,FileLocation *loc) + * Description: This function stores the filerecord located at loc in filerec. + * It fetches the required sector for this. + * Return value: void +*/ +void dir_getFileStructure(FileSystem *fs,FileRecord *filerec,FileLocation *loc) +{ + euint8 *buf; + + buf=part_getSect(fs->part,loc->Sector,IOM_MODE_READONLY); + *filerec=*(((FileRecord*)buf)+loc->Offset); + part_relSect(fs->part,buf); +} + +/*****************************************************************************/ + +/* **************************************************************************** + * void dir_createDirectoryEntry(FileSystem *fs,FileRecord *filerec,FileLocation *loc) + * Description: This function writes the filerecord stored in filerec to disc at + * location loc. + * Return value: void +*/ +void dir_createDirectoryEntry(FileSystem *fs,FileRecord *filerec,FileLocation *loc) +{ + euint8 *buf; + + buf = part_getSect(fs->part,loc->Sector,IOM_MODE_READWRITE); + memCpy(filerec,buf+(loc->Offset*sizeof(*filerec)),sizeof(*filerec)); + part_relSect(fs->part,buf); +} +/*****************************************************************************/ + +/* **************************************************************************** + * void dir_createDefaultEntry(FileSystem *fs,FileRecord *filerec,eint8* fatfilename) + * Description: This function fills in a filerecord with safe default values, and + * a given fatfilename. If your system has a means of knowing time, here is an + * excellent place to apply it to the filerecord. + * Return value: void +*/ +void dir_createDefaultEntry(FileSystem *fs,FileRecord *filerec,eint8* fatfilename) +{ + memCpy(fatfilename,filerec->FileName,11); + filerec->Attribute=0x00; + filerec->NTReserved=0x00; + filerec->MilliSecTimeStamp=0x00; + filerec->CreatedTime=time_getTime(); + filerec->CreatedDate=time_getDate(); + filerec->AccessDate=filerec->CreatedDate; + filerec->FirstClusterHigh=0x0000; + filerec->WriteTime=filerec->CreatedTime; + filerec->WriteDate=filerec->CreatedDate; + filerec->FirstClusterLow=0x0000; + filerec->FileSize=0x00000000; +} +/*****************************************************************************/ + +/* **************************************************************************** + * void dir_setFirstCluster(File *file,euint32 cluster_addr) + * Description: This function requires modification to release it from + * depending on the file object. + * Return value: +*/ +void dir_setFirstCluster(FileSystem *fs,FileLocation *loc,euint32 cluster_addr) +{ + euint8 *buf; + + buf = part_getSect(fs->part,loc->Sector,IOM_MODE_READWRITE); + (((FileRecord*)buf)+loc->Offset)->FirstClusterHigh=cluster_addr>>16; + (((FileRecord*)buf)+loc->Offset)->FirstClusterLow=cluster_addr&0xFFFF; + part_relSect(fs->part,buf); +} +/*****************************************************************************/ + +/* **************************************************************************** + * void dir_setFileSize(FileSystem *fs, FileLocation *loc,euint32 numbytes) + * Description: This function changes the filesize recorded at loc->Sector + * to 'numbytes'. + * Return value: void +*/ +void dir_setFileSize(FileSystem *fs, FileLocation *loc,euint32 numbytes) +{ + euint8 *buf; + + buf = part_getSect(fs->part,loc->Sector,IOM_MODE_READWRITE); + (((FileRecord*)buf)+loc->Offset)->FileSize=numbytes; + part_relSect(fs->part,buf); +} +/*****************************************************************************/ + +/* **************************************************************************** + * esint8 dir_updateDirectoryEntry(FileSystem *fs,FileRecord *entry,FileLocation *loc)) + * This function changes the entire entity stores at loc to the data recorded + * in entry. This is for custom updates to the directoryentry. + * Return value: 0 on success, -1 on failure +*/ +esint8 dir_updateDirectoryEntry(FileSystem *fs,FileRecord *entry,FileLocation *loc) +{ + euint8 *buf; + + buf = part_getSect(fs->part,loc->Sector,IOM_MODE_READWRITE); + memCpy(entry,buf+(loc->Offset*sizeof(*entry)),sizeof(*entry)); + part_relSect(fs->part,buf); + return(0); +} + +/* **************************************************************************** + * euint32 dir_findFileinBuf(euint8 *buf, eint8 *fatname, FileLocation *loc) + * This function searches for a given fatfilename in the buffer provided. + * It will iterate through the 16 direntry's in the buffer and searches + * for the fatfilename. If found, it will store the offset and attribute + * entry of the directoryrecord in the loc structure. + * If loc is 0, then it's members are not touched. + * Return value: This function returns 0 when it cannot find the file, + * if it can find the file it will return the first cluster number. +*/ +euint32 dir_findFileinBuf(euint8 *buf, eint8 *fatname, FileLocation *loc) +{ + FileRecord fileEntry; + euint8 c; + + for(c=0; c<16; c++) + { + fileEntry = *(((FileRecord*)buf) + c); + /* Check if the entry is for short filenames */ + if( !( (fileEntry.Attribute & 0x0F) == 0x0F ) ) + { + if( strMatch((eint8*)fileEntry.FileName,fatname,11) == 0 ) + { + /* The entry has been found, return the location in the dir */ + if(loc)loc->Offset = c; + if(loc)loc->attrib = fileEntry.Attribute; + if((((euint32 )fileEntry.FirstClusterHigh)<<16)+ fileEntry.FirstClusterLow==0){ + return(1); /* Lie about cluster, 0 means not found! */ + }else{ + return + ( + (((euint32 )fileEntry.FirstClusterHigh)<<16) + + fileEntry.FirstClusterLow + ); + } + } + } + } + return(0); +} + +/* **************************************************************************** + * euint32 dir_findFreeEntryinBuf(euint8* buf, FileLocation *loc) + * This function searches for a free entry in a given sector 'buf'. + * It will put the offset into the loc->Offset field, given that loc is not 0. + * Return value: 1 when it found a free spot, 0 if it hasn't. +*/ +euint32 dir_findFreeEntryinBuf(euint8* buf, FileLocation *loc) +{ + FileRecord fileEntry; + euint8 c; + + for(c=0;c<16;c++){ + fileEntry = *(((FileRecord*)buf) + c); + if( !( (fileEntry.Attribute & 0x0F) == 0x0F ) ){ + if(fileEntry.FileName[0] == 0x00 || + fileEntry.FileName[0] == 0xE5 ){ + if(loc)loc->Offset=c; + return(1); + } + } + } + return(0); +} + +/* **************************************************************************** + * euint32 dir_findinBuf(euint8 *buf, eint8 *fatname, FileLocation *loc) + * Description: This function searches for a given fatfilename in a buffer. + * Return value: Returns 0 on not found, and the firstcluster when the name is found. +*/ +euint32 dir_findinBuf(euint8 *buf, eint8 *fatname, FileLocation *loc, euint8 mode) +{ + switch(mode){ + case DIRFIND_FILE: + return(dir_findFileinBuf(buf,fatname,loc)); + break; + case DIRFIND_FREE: + return(dir_findFreeEntryinBuf(buf,loc)); + break; + default: + return(0); + break; + } + return(0); +} +/*****************************************************************************/ + +/* **************************************************************************** + * euint32 dir_findinCluster(FileSystem *fs,euint32 cluster,eint8 *fatname, FileLocation *loc, euint8 mode) + * This function will search for an existing (fatname) or free directory entry + * in a full cluster. + * Return value: 0 on failure, firstcluster on finding file, and 1 on finding free spot. +*/ +euint32 dir_findinCluster(FileSystem *fs,euint32 cluster,eint8 *fatname, FileLocation *loc, euint8 mode) +{ + euint8 c,*buf=0; + euint32 fclus; + + for(c=0;cvolumeId.SectorsPerCluster;c++){ + buf = part_getSect(fs->part,fs_clusterToSector(fs,cluster)+c,IOM_MODE_READONLY); + if((fclus=dir_findinBuf(buf,fatname,loc,mode))){ + if(loc)loc->Sector=fs_clusterToSector(fs,cluster)+c; + part_relSect(fs->part,buf); + return(fclus); + } + } + part_relSect(fs->part,buf); + return(0); +} + +/* **************************************************************************** + * euint32 dir_findinDir(FileSystem *fs, eint8* fatname,euint32 firstcluster, FileLocation *loc, euint8 mode) + * This function will search for an existing (fatname) or free directory entry + * in a directory, following the clusterchains. + * Return value: 0 on failure, firstcluster on finding file, and 1 on finding free spot. +*/ +euint32 dir_findinDir(FileSystem *fs, eint8* fatname,euint32 firstcluster, FileLocation *loc, euint8 mode) +{ + euint32 c=0,cluster; + ClusterChain Cache; + + Cache.DiscCluster = Cache.FirstCluster = firstcluster; + Cache.LogicCluster = Cache.LastCluster = Cache.Linear = 0; + + if(firstcluster <= 1){ + return(dir_findinRootArea(fs,fatname,loc,mode)); + } + + while(!fat_LogicToDiscCluster(fs,&Cache,c++)){ + if((cluster=dir_findinCluster(fs,Cache.DiscCluster,fatname,loc,mode))){ + return(cluster); + } + } + return(0); +} + +/* **************************************************************************** + * euint32 dir_findinDir(FileSystem *fs, eint8* fatname,euint32 firstcluster, FileLocation *loc, euint8 mode) + * This function will search for an existing (fatname) or free directory entry + * in the rootdirectory-area of a FAT12/FAT16 filesystem. + * Return value: 0 on failure, firstcluster on finding file, and 1 on finding free spot. +*/ +euint32 dir_findinRootArea(FileSystem *fs,eint8* fatname, FileLocation *loc, euint8 mode) +{ + euint32 c,fclus; + euint8 *buf=0; + + if((fs->type != FAT12) && (fs->type != FAT16))return(0); + + for(c=fs->FirstSectorRootDir;c<(fs->FirstSectorRootDir+fs->volumeId.RootEntryCount/32);c++){ + buf = part_getSect(fs->part,c,IOM_MODE_READONLY); + if((fclus=dir_findinBuf(buf,fatname,loc,mode))){ + if(loc)loc->Sector=c; + part_relSect(fs->part,buf); + return(fclus); + } + part_relSect(fs->part,buf); + } + part_relSect(fs->part,buf); + return(0); +} + +/* **************************************************************************** + * esint8 dir_getFatFileName(eint8* filename, eint8* fatfilename) + * This function will take a full directory path, and strip off all leading + * dirs and characters, leaving you with the MS-DOS notation of the actual filename. + * Return value: 1 on success, 0 on not being able to produca a filename +*/ +esint8 dir_getFatFileName(eint8* filename, eint8* fatfilename) +{ + eint8 ffnamec[11],*next,nn=0; + + memClr(ffnamec,11); memClr(fatfilename,11); + next = filename; + + if(*filename=='/')next++; + + while((next=file_normalToFatName(next,ffnamec))){ + memCpy(ffnamec,fatfilename,11); + nn++; + } + if(nn)return(1); + return(0); +} + +/* **************************************************************************** + * esint8 dir_addCluster(FileSystem *fs,euint32 firstCluster) + * This function extends a directory by 1 cluster + optional the number of + * clusters you want pre-allocated. It will also delete the contents of that + * cluster. (or clusters) + * Return value: 0 on success, -1 on fail +*/ +esint8 dir_addCluster(FileSystem *fs,euint32 firstCluster) +{ + euint32 lastc,logicalc; + ClusterChain cache; + + fs_initClusterChain(fs,&cache,firstCluster); + if(fat_allocClusterChain(fs,&cache,1)){ + return(-1); + } + lastc = fs_getLastCluster(fs,&cache); + if(CLUSTER_PREALLOC_DIRECTORY){ + if(fat_allocClusterChain(fs,&cache,CLUSTER_PREALLOC_DIRECTORY)){ + return(-1); + } + logicalc = fat_DiscToLogicCluster(fs,firstCluster,lastc); + while(!fat_LogicToDiscCluster(fs,&cache,++logicalc)){ + fs_clearCluster(fs,cache.DiscCluster); + } + }else{ + fs_clearCluster(fs,lastc); + } + return(0); +} + + diff --git a/tools/efsl-0.3.6/src/fs/vfat/fat.c b/tools/efsl-0.3.6/src/fs/vfat/fat.c new file mode 100644 index 0000000..2b8d7d8 --- /dev/null +++ b/tools/efsl-0.3.6/src/fs/vfat/fat.c @@ -0,0 +1,553 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : fat.c * +* Release : 0.3 - devel * +* Description : This file contains all the functions dealing with the FAT * +* in a Microsoft FAT filesystem. It belongs under fs.c * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "fs.h" +/*****************************************************************************/ + +/* **************************************************************************** + * unsigned long fat_getSectorAddressFatEntry(FileSystem *fs,unsigned long cluster_addr) + * Description: Returns the sectornumber that holds the fat entry for cluster cluster_addr. + * This works for all FAT types. + * Return value: Sectornumber, or 0. Warning, no boundary check. +*/ +euint32 fat_getSectorAddressFatEntry(FileSystem *fs,euint32 cluster_addr) +{ + euint32 base = fs->volumeId.ReservedSectorCount,res; + + switch(fs->type){ + case FAT12: + res=(cluster_addr*3/1024); + if(res>=fs->FatSectorCount){ + return(0); + }else{ + return(base+res); + } + break; + case FAT16: + res=cluster_addr/256; + if(res>=fs->FatSectorCount){ + return(0); + }else{ + return(base+res); + } + break; + case FAT32: + res=cluster_addr/128; + if(res>=fs->FatSectorCount){ + return(0); + }else{ + return(base+res); + } + break; + } + return(0); +} +/*****************************************************************************/ + + +/* **************************************************************************** + * unsigned long fat_getNextClusterAddress(FileSystem *fs,unsigned long cluster_addr + * Description: This function loads the sector of the fat which contains the entry + * for cluster_addr. It then fetches and (if required) calculates it's value. + * This value is the EoC marker -or- the number of the next cluster in the chain. + * Return value: Clusternumber or EoC +*/ +euint32 fat_getNextClusterAddress(FileSystem *fs,euint32 cluster_addr,euint16 *linear) +{ + euint8 *buf; + euint8 hb,lb; + euint16 offset; + euint32 sector; + euint32 nextcluster=0; + + sector=fat_getSectorAddressFatEntry(fs,cluster_addr); + if( (fs->FatSectorCount <= (sector-fs->volumeId.ReservedSectorCount)) || sector==0 ) + { + return(0); + } + + buf=part_getSect(fs->part,sector,IOM_MODE_READONLY); + + switch(fs->type) + { + case FAT12: + offset = ((cluster_addr%1024)*3/2)%512; + hb = buf[offset]; + if(offset == 511){ + part_relSect(fs->part,buf); + buf=part_getSect(fs->part,sector+1,IOM_MODE_READONLY); + lb = buf[0]; + }else{ + lb = buf[offset + 1]; + } + if(cluster_addr%2==0){ + nextcluster = ( ((lb&0x0F)<<8) + (hb) ); + }else{ + nextcluster = ( (lb<<4) + (hb>>4) ); + } + break; + case FAT16: + offset=cluster_addr%256; + nextcluster = *((euint16 *)buf + offset); + break; + case FAT32: + offset=cluster_addr%128; + nextcluster = *((euint32 *)buf + offset); + break; + } + + part_relSect(fs->part,buf); + + return(nextcluster); +} +/*****************************************************************************/ + + +/* **************************************************************************** + * void fat_setNextClusterAddress(FileSystem *fs,unsigned long cluster_addr,unsigned long next_cluster_addr) + * Description: This function makes an entry in the fattable for cluster_addr. The value it puts there + * is next_cluster_addr. +*/ +void fat_setNextClusterAddress(FileSystem *fs,euint32 cluster_addr,euint32 next_cluster_addr) +{ + euint8 *buf,*buf2; + euint16 offset; + euint32 sector; + + sector=fat_getSectorAddressFatEntry(fs,cluster_addr); + if(fs->FatSectorCountpart,sector,IOM_MODE_READWRITE); + + switch(fs->type){ + case FAT12: + offset = ((cluster_addr%1024)*3/2)%512; + if(offset == 511){ + if(cluster_addr%2==0){ + buf[offset]=next_cluster_addr&0xFF; + }else{ + buf[offset]=(buf[offset]&0xF)+((next_cluster_addr<<4)&0xF0); + } + buf2=part_getSect(fs->part,fat_getSectorAddressFatEntry(fs,cluster_addr)+1,IOM_MODE_READWRITE); + if(cluster_addr%2==0){ + buf2[0]=(buf2[0]&0xF0)+((next_cluster_addr>>8)&0xF); + }else{ + buf2[0]=(next_cluster_addr>>4)&0xFF; + } + part_relSect(fs->part,buf2); + }else{ + if(cluster_addr%2==0){ + buf[offset]=next_cluster_addr&0xFF; + buf[offset+1]=(buf[offset+1]&0xF0)+((next_cluster_addr>>8)&0xF); + }else{ + buf[offset]=(buf[offset]&0xF)+((next_cluster_addr<<4)&0xF0); + buf[offset+1]=(next_cluster_addr>>4)&0xFF; + } + } + part_relSect(fs->part,buf); + break; + case FAT16: + offset=cluster_addr%256; + *((euint16*)buf+offset)=next_cluster_addr; + part_relSect(fs->part,buf); + break; + case FAT32: + offset=cluster_addr%128; + *((euint32*)buf+offset)=next_cluster_addr; + part_relSect(fs->part,buf); + break; + } + +} +/*****************************************************************************/ + + +/* **************************************************************************** + * short fat_isEocMarker(FileSystem *fs,unsigned long fat_entry) + * Description: Checks if a certain value is the EoC marker for the filesystem + * noted in fs->type. + * Return value: Returns 0 when it is the EoC marker, and 1 otherwise. +*/ +eint16 fat_isEocMarker(FileSystem *fs,euint32 fat_entry) +{ + switch(fs->type){ + case FAT12: + if(fat_entry<0xFF8){ + return(0); + } + break; + case FAT16: + if(fat_entry<0xFFF8){ + return(0); + } + break; + case FAT32: + if((fat_entry&0x0FFFFFFF)<0xFFFFFF8){ + return(0); + } + break; + } + return(1); +} +/*****************************************************************************/ + + +/* **************************************************************************** + * unsigned long fat_giveEocMarker(FileSystem *fs) + * Description: Returns an EoC markernumber valid for the filesystem noted in + * fs->type. + * Note, for FAT32, the upper 4 bits are set to zero, although they should be un + * touched according to MicroSoft specifications. I didn't care. + * Return value: The EoC marker cast to an ulong. +*/ +euint32 fat_giveEocMarker(FileSystem *fs) +{ + switch(fs->type) + { + case FAT12: + return(0xFFF); + break; + case FAT16: + return(0xFFFF); + break; + case FAT32: + return(0x0FFFFFFF); + break; + } + return(0); +} +/*****************************************************************************/ + +/* **************************************************************************** + * euint32 fat_getNextClusterAddressWBuf(FileSystem *fs,euint32 cluster_addr, euint8* buf) + * Description: This function retrieves the contents of a FAT field. It does not fetch + * it's own buffer, it is given as a parameter. (ioman makes this function rather obsolete) + * Only in the case of a FAT12 crosssector data entry a sector is retrieved here. + * Return value: The value of the clusterfield is returned. +*/ +euint32 fat_getNextClusterAddressWBuf(FileSystem *fs,euint32 cluster_addr, euint8* buf) +{ + euint8 *buf2; /* For FAT12 fallover only */ + euint8 hb,lb; + euint16 offset; + euint32 nextcluster=0; + + switch(fs->type) + { + case FAT12: + offset = ((cluster_addr%1024)*3/2)%512; + hb = buf[offset]; + if(offset == 511){ + buf2=part_getSect(fs->part,fat_getSectorAddressFatEntry(fs,cluster_addr)+1,IOM_MODE_READONLY); + lb = buf2[0]; + part_relSect(fs->part,buf2); + }else{ + lb = buf[offset + 1]; + } + if(cluster_addr%2==0){ + nextcluster = ( ((lb&0x0F)<<8) + (hb) ); + }else{ + nextcluster = ( (lb<<4) + (hb>>4) ); + } + break; + case FAT16: + offset=cluster_addr%256; + nextcluster = *((euint16*)buf + offset); + break; + case FAT32: + offset=cluster_addr%128; + nextcluster = *((euint32*)buf + offset); + break; + } + return(nextcluster); +} +/*****************************************************************************/ + +/* **************************************************************************** + * void fat_setNextClusterAddressWBuf(FileSystem *fs,euint32 cluster_addr,euint32 next_cluster_addr,euint8* buf) + * Description: This function fills in a fat entry. The entry is cluster_addr and the + * data entered is next_cluster_addr. This function is also given a *buf, so it does + * not write the data itself, except in the case of FAT 12 cross sector data, where + * the second sector is handled by this function. + * Return value: +*/ +void fat_setNextClusterAddressWBuf(FileSystem *fs,euint32 cluster_addr,euint32 next_cluster_addr,euint8* buf) +{ + euint16 offset; + euint8 *buf2; + + switch(fs->type) + { + case FAT12: + offset = ((cluster_addr%1024)*3/2)%512; + if(offset == 511){ + if(cluster_addr%2==0){ + buf[offset]=next_cluster_addr&0xFF; + }else{ + buf[offset]=(buf[offset]&0xF)+((next_cluster_addr<<4)&0xF0); + } + buf2=part_getSect(fs->part,fat_getSectorAddressFatEntry(fs,cluster_addr)+1,IOM_MODE_READWRITE); + if(cluster_addr%2==0){ + buf2[0]=(buf2[0]&0xF0)+((next_cluster_addr>>8)&0xF); + }else{ + buf2[0]=(next_cluster_addr>>4)&0xFF; + } + part_relSect(fs->part,buf2); + }else{ + if(cluster_addr%2==0){ + buf[offset]=next_cluster_addr&0xFF; + buf[offset+1]=(buf[offset+1]&0xF0)+((next_cluster_addr>>8)&0xF); + }else{ + buf[offset]=(buf[offset]&0xF)+((next_cluster_addr<<4)&0xF0); + buf[offset+1]=(next_cluster_addr>>4)&0xFF; + } + } + break; + case FAT16: + offset=cluster_addr%256; + *((euint16*)buf+offset)=next_cluster_addr; + break; + case FAT32: + offset=cluster_addr%128; + *((euint32*)buf+offset)=next_cluster_addr; + break; + } +} +/*****************************************************************************/ + +/* **************************************************************************** + * esint16 fat_getNextClusterChain(FileSystem *fs, ClusterChain *Cache) + * Description: This function is to advance the clusterchain of a Cache. + * First, the function verifies if the Cache is valid. It could correct it if it + * is not, but this is not done at the time. If the cachen is valid, the next step is + * to see what the next cluster is, if this is the End of Clustermark, the cache is + * updated to know the lastcluster but will remain untouched otherwise. -1 is returned. + * If there are more clusters the function scans the rest of the chain until the next + * cluster is no longer lineair, or until it has run out of fat data (only 1 sector) is + * examined, namely the one fetched to check for EoC. + * With lineair is meant that logical cluster n+1 should be 1 more than logical cluster n + * at the disc level. + * Return value: 0 on success, or -1 when EoC. +*/ +esint16 fat_getNextClusterChain(FileSystem *fs, ClusterChain *Cache) +{ + euint32 sect,lr,nlr,dc; + esint16 lin=0; + euint8 *buf; + + if(Cache->DiscCluster==0) + { + return(-1); + } + + sect=fat_getSectorAddressFatEntry(fs,Cache->DiscCluster); + buf=part_getSect(fs->part,sect,IOM_MODE_READONLY); + dc=fat_getNextClusterAddressWBuf(fs,Cache->DiscCluster,buf); + if(fat_isEocMarker(fs,dc)) + { + Cache->LastCluster=Cache->DiscCluster; + part_relSect(fs->part,buf); + return(-1); + } + + Cache->DiscCluster=dc; + Cache->LogicCluster++; + + lr=Cache->DiscCluster-1; + nlr=lr+1; + + while(nlr-1==lr && fat_getSectorAddressFatEntry(fs,nlr)==sect) + { + lr=nlr; + nlr=fat_getNextClusterAddressWBuf(fs,lr,buf); + lin++; + } + + Cache->Linear=lin-1<0?0:lin-1; + + part_relSect(fs->part,buf); + return(0); +} +/*****************************************************************************/ + + +/* **************************************************************************** + * esint16 fat_LogicToDiscCluster(FileSystem *fs, ClusterChain *Cache,euint32 logiccluster) + * Description: This function is used to follow clusterchains. When called it will convert + * a logical cluster, to a disc cluster, using a Cache object. All it does is call + * getNextClusterChain in the proper manner, and rewind clusterchains if required. + * It is NOT recommended to go backwards in clusterchains, since this will require + * scanning the entire chain every time. + * Return value: 0 on success and -1 on failure (meaning out of bounds). +*/ +esint16 fat_LogicToDiscCluster(FileSystem *fs, ClusterChain *Cache,euint32 logiccluster) +{ + if(logicclusterLogicCluster || Cache->DiscCluster==0){ + Cache->LogicCluster=0; + Cache->DiscCluster=Cache->FirstCluster; + Cache->Linear=0; + } + + if(Cache->LogicCluster==logiccluster){ + return(0); + } + + while(Cache->LogicCluster!=logiccluster) + { + if(Cache->Linear!=0) + { + Cache->Linear--; + Cache->LogicCluster++; + Cache->DiscCluster++; + } + else + { + if((fat_getNextClusterChain(fs,Cache))!=0){ + return(-1); + } + } + } + return(0); +} +/*****************************************************************************/ + +/* **************************************************************************** + * eint16 fat_allocClusterChain(FileSystem *fs,ClusterChain *Cache,euint32 num_clusters) + * Description: This function extends a clusterchain by num_clusters. It returns the + * number of clusters it *failed* to allocate. + * Return value: 0 on success, all other values are the number of clusters it could + * not allocate. +*/ +eint16 fat_allocClusterChain(FileSystem *fs,ClusterChain *Cache,euint32 num_clusters) +{ + euint32 cc,ncl=num_clusters,lc; + euint8 *bufa=0,*bufb=0; + euint8 overflow=0; + + if(Cache->FirstCluster<=1)return(num_clusters); + + lc=fs_getLastCluster(fs,Cache); + cc=lc; + + while(ncl > 0){ + cc++; + if(cc>=fs->DataClusterCount+1){ + if(overflow){ + bufa=part_getSect(fs->part,fat_getSectorAddressFatEntry(fs,lc),IOM_MODE_READWRITE); + fat_setNextClusterAddressWBuf(fs,lc,fat_giveEocMarker(fs),bufa); + Cache->LastCluster=lc; + part_relSect(fs->part,bufa); + return(num_clusters-ncl); + } + cc=2; + overflow++; + } + bufa=part_getSect(fs->part,fat_getSectorAddressFatEntry(fs,cc),IOM_MODE_READONLY); + if(fat_getNextClusterAddressWBuf(fs,cc,bufa)==0){ + bufb=part_getSect(fs->part,fat_getSectorAddressFatEntry(fs,lc),IOM_MODE_READWRITE); + fat_setNextClusterAddressWBuf(fs,lc,cc,bufb); + part_relSect(fs->part,bufb); + ncl--; + lc=cc; + } + part_relSect(fs->part,bufa); + if(ncl==0){ + bufa=part_getSect(fs->part,fat_getSectorAddressFatEntry(fs,lc),IOM_MODE_READWRITE); + fat_setNextClusterAddressWBuf(fs,lc,fat_giveEocMarker(fs),bufa); + Cache->LastCluster=lc; + part_relSect(fs->part,bufa); + } + } + return(0); +} + +/* **************************************************************************** + * eint16 fat_unlinkClusterChain(FileSystem *fs,ClusterChain *Cache) + * Description: This function removes a clusterchain. Starting at FirstCluster + * it follows the chain until the end, resetting all values to 0. + * Return value: 0 on success. +*/ +eint16 fat_unlinkClusterChain(FileSystem *fs,ClusterChain *Cache) +{ + euint32 c,tbd=0; + + Cache->LogicCluster=0; + Cache->DiscCluster=Cache->FirstCluster; + + c=0; + + while(!fat_LogicToDiscCluster(fs,Cache,c++)){ + if(tbd!=0){ + fat_setNextClusterAddress(fs,tbd,0); + } + tbd=Cache->DiscCluster; + } + fat_setNextClusterAddress(fs,Cache->DiscCluster,0); + return(0); +} + +euint32 fat_countClustersInChain(FileSystem *fs,euint32 firstcluster) +{ + ClusterChain cache; + euint32 c=0; + + if(firstcluster<=1)return(0); + + cache.DiscCluster = cache.LogicCluster = cache.LastCluster = cache.Linear = 0; + cache.FirstCluster = firstcluster; + + while(!(fat_LogicToDiscCluster(fs,&cache,c++))); + + return(c-1); +} + +euint32 fat_DiscToLogicCluster(FileSystem *fs,euint32 firstcluster,euint32 disccluster) +{ + ClusterChain cache; + euint32 c=0,r=0; + + cache.DiscCluster = cache.LogicCluster = cache.LastCluster = cache.Linear = 0; + cache.FirstCluster = firstcluster; + + while(!(fat_LogicToDiscCluster(fs,&cache,c++)) && !r){ + if(cache.DiscCluster == disccluster){ + r = cache.LogicCluster; + } + } + return(r); +} diff --git a/tools/efsl-0.3.6/src/fs/vfat/file.c b/tools/efsl-0.3.6/src/fs/vfat/file.c new file mode 100644 index 0000000..75ad2c0 --- /dev/null +++ b/tools/efsl-0.3.6/src/fs/vfat/file.c @@ -0,0 +1,497 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : file.c * +* Release : 0.3 - devel * +* Description : This file contains functions dealing with files such as: * +* fopen, fread and fwrite. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "file.h" +/*****************************************************************************/ + +/* **************************************************************************** + * euint32 file_fread(File *file,euint32 offset, euint32 size,euint8 *buf) + * Description: This function reads 'size' bytes from 'file' starting at + * 'offset' and puts the result in '*buf'. + * Return value: amount of bytes actually read (can differ from the given + * size when the file was smaller +*/ +euint32 file_fread(File *file,euint32 offset, euint32 size,euint8 *buf) +{ + euint32 bytes_read=0,size_left=size,coffset=offset; + euint32 cclus,csec,cbyte; + euint32 rclus,rsec; + euint32 btr; + euint8 *tbuf; + + if(!file_getAttr(file,FILE_STATUS_OPEN))return(0); + + if(offset>=file->FileSize) + size_left=0; /* Offset check */ + + if( (offset+size > file->FileSize) && size_left!=0) + size_left=file->FileSize-offset; + + while(size_left>0){ + + cclus = coffset/(512*file->fs->volumeId.SectorsPerCluster); + csec = (coffset/(512))%file->fs->volumeId.SectorsPerCluster; + cbyte = coffset%512; + + if(cbyte!=0 || size_left<512){ + btr = 512-(coffset%512)>=size_left?size_left:512-(coffset%512); + }else{ + btr = 512; + } + + if((fat_LogicToDiscCluster(file->fs,&(file->Cache),cclus))!=0){ + return(0); + } + rclus=file->Cache.DiscCluster; + rsec=fs_clusterToSector(file->fs,rclus); + + + if(btr==512){ + /*part_readBuf(file->fs->part,rsec+csec,buf+bytes_read);*/ + part_directSectorRead(file->fs->part,rsec+csec,buf+bytes_read); + }else{ + /*part_readBuf(file->fs->part,rsec+csec,tbuf);*/ + tbuf = part_getSect(file->fs->part,rsec+csec,IOM_MODE_READONLY); + memCpy(tbuf+(coffset%512),buf+bytes_read,btr); + part_relSect(file->fs->part,tbuf); + } + + coffset+=btr; + bytes_read+=btr; + size_left-=btr; + } + + return(bytes_read); +} +/*****************************************************************************/ + +/* **************************************************************************** + * euint32 file_read (File *file,euint32 size,euint8 *buf) + * Description: This function reads from a file, taking the FilePtr into account + * and advancing it according to the freadcall. + * Return value: Value obtained from fread +*/ +euint32 file_read(File *file,euint32 size,euint8 *buf) +{ + euint32 r; + + r=file_fread(file,file->FilePtr,size,buf); + file->FilePtr+=r; + return(r); +} +/*****************************************************************************/ + +/* **************************************************************************** + * euint32 file_write(File *file, euint32 size,euint8 *buf) + * Description: This function writes to a file, taking FilePtr into account + * and advancing it according to the fwritecall. + * Return value: Value obtained from fread +*/ +euint32 file_write(File *file, euint32 size,euint8 *buf) +{ + euint32 r; + + r=file_fwrite(file,file->FilePtr,size,buf); + file->FilePtr+=r; + return(r); +} +/*****************************************************************************/ + +/* **************************************************************************** + * esint16 file_setpos(File *file,euint32 pos) + * Description: This function does a sanity check on the requested position + * and changes the fileptr accordingly. + * Return value: 0 on success and -1 on failure. +*/ +esint16 file_setpos(File *file,euint32 pos) +{ + if(pos<=file->FileSize){ + file->FilePtr=pos; + return(0); + } + return(-1); +} +/*****************************************************************************/ + +/* **************************************************************************** + * euint32 file_fwrite(File* file,euint32 offset,euint32 size,euint8* buf) + * Description: This function writes to a file, at offset 'offset' and size 'size'. + * It also updates the FileSize in the object, and discstructure. + * Return value: Bytes actually written. +*/ +euint32 file_fwrite(File* file,euint32 offset,euint32 size,euint8* buf) +{ + euint32 need_cluster; + euint32 cclus,csec,cbyte; + euint32 size_left=size,bytes_written=0; + euint32 rclus,rsec; + euint32 coffset=offset; + euint16 btr; + euint8 *tbuf; + + if(!file_getAttr(file,FILE_STATUS_OPEN) || !file_getAttr(file,FILE_STATUS_WRITE))return(0); + + if(offset>file->FileSize){ + offset=file->FileSize; + } + + need_cluster = file_requiredCluster(file,offset,size); + + if(need_cluster){ + if(fat_allocClusterChain(file->fs,&(file->Cache),need_cluster+CLUSTER_PREALLOC_FILE)!=0){ + return(0); + } + } + + while(size_left>0){ + + cclus = coffset/(512*file->fs->volumeId.SectorsPerCluster); + csec = (coffset/(512))%file->fs->volumeId.SectorsPerCluster; + cbyte = coffset%512; + + if(cbyte!=0 || size_left<512){ + btr = 512-(coffset%512)>=size_left?size_left:512-(coffset%512); + }else{ + btr = 512; + } + + if((fat_LogicToDiscCluster(file->fs,&(file->Cache),cclus))!=0){ + file->FileSize+=bytes_written; + dir_setFileSize(file->fs,&(file->Location),file->FileSize); + return(bytes_written); + } + rclus=file->Cache.DiscCluster; + rsec=fs_clusterToSector(file->fs,rclus); + + if(btr==512){ + /*part_writeBuf(file->fs->part,rsec+csec,buf+bytes_written);*/ + part_directSectorWrite(file->fs->part,rsec+csec,buf+bytes_written); + }else{ + /*part_readBuf(file->fs->part,rsec+csec,tbuf);*/ + tbuf = part_getSect(file->fs->part,rsec+csec,IOM_MODE_READWRITE); + memCpy(buf+bytes_written,tbuf+(coffset%512),btr); + /*part_writeBuf(file->fs->part,rsec+csec,tbuf);*/ + part_relSect(file->fs->part,tbuf); + } + + coffset+=btr; + bytes_written+=btr; + size_left-=btr; + } + + if(bytes_written>file->FileSize-offset){ + file->FileSize+=bytes_written-(file->FileSize-offset); + } + + return(bytes_written); +} + +/* ***************************************************************************\ + * signed eint8 file_fopen(FileSystem *fs,File* file,eint8* filename) + * Description: This functions opens a file. + * This function is about to be redesigned. No Docs. + * Return value: +*/ +esint8 file_fopen(File* file,FileSystem *fs,eint8* filename,eint8 mode) +{ + FileLocation loc; + FileRecord wtmp; + eint8 fatfilename[11]; + euint32 sec; + + dir_getFatFileName(filename,fatfilename); + + switch(mode) + { + case MODE_READ: + if(fs_findFile(fs,filename,&loc,0)==1) + { + dir_getFileStructure(fs,&(file->DirEntry), &loc); + file_initFile(file,fs,&loc); + file_setAttr(file,FILE_STATUS_OPEN,1); + file_setAttr(file,FILE_STATUS_WRITE,0); + return(0); + } + return(-1); + break; + case MODE_WRITE: + if(fs_findFile(fs,filename,&loc,0)) + { + return(-2); + } + if(fs_findFreeFile(fs,filename,&loc,0)) + { + dir_createDefaultEntry(fs,&wtmp,fatfilename); + dir_createDirectoryEntry(fs,&wtmp,&loc); + memCpy(&wtmp,&(file->DirEntry),sizeof(wtmp)); + file_initFile(file,fs,&loc); + sec=fs_getNextFreeCluster(file->fs,fs_giveFreeClusterHint(file->fs)); + dir_setFirstCluster(file->fs,&(file->Location),sec); + fs_setFirstClusterInDirEntry(&(file->DirEntry),sec); + fs_initClusterChain(fs,&(file->Cache),sec); + fat_setNextClusterAddress(fs,sec,fat_giveEocMarker(fs)); + file_setAttr(file,FILE_STATUS_OPEN,1); + file_setAttr(file,FILE_STATUS_WRITE,1); + return(0); + } + else + { + return(-3); + } + break; + case MODE_APPEND: + if(fs_findFile(fs,filename,&loc,0)==1) /* File exists */ + { + dir_getFileStructure(fs,&(file->DirEntry), &loc); + file_initFile(file,fs,&loc); + if(file->Cache.FirstCluster==0){ + sec=fs_getNextFreeCluster(file->fs,fs_giveFreeClusterHint(file->fs)); + dir_setFirstCluster(file->fs,&(file->Location),sec); + fs_setFirstClusterInDirEntry(&(file->DirEntry),sec); + fat_setNextClusterAddress(fs,sec,fat_giveEocMarker(fs)); + file_initFile(file,fs,&loc); + } + file_setpos(file,file->FileSize); + file_setAttr(file,FILE_STATUS_OPEN,1); + file_setAttr(file,FILE_STATUS_WRITE,1); + } + else /* File does not excist */ + { + if(fs_findFreeFile(fs,filename,&loc,0)) + { + dir_createDefaultEntry(fs,&wtmp,fatfilename); + dir_createDirectoryEntry(fs,&wtmp,&loc); + memCpy(&wtmp,&(file->DirEntry),sizeof(wtmp)); + file_initFile(file,fs,&loc); + sec=fs_getNextFreeCluster(file->fs,fs_giveFreeClusterHint(file->fs)); + dir_setFirstCluster(file->fs,&(file->Location),sec); + fs_setFirstClusterInDirEntry(&(file->DirEntry),sec); + fs_initClusterChain(fs,&(file->Cache),sec); + fat_setNextClusterAddress(fs,sec,fat_giveEocMarker(fs)); + file_setAttr(file,FILE_STATUS_OPEN,1); + file_setAttr(file,FILE_STATUS_WRITE,1); + } + else + { + return(-3); + } + } + return(0); + break; + default: + return(-4); + break; + } + return(-5); +} +/*****************************************************************************/ + +/* **************************************************************************** + * esint8 file_fclose(File *file) + * Description: This function closes a file, by clearing the object. + * Return value: 0 on success. +*/ +esint8 file_fclose(File *file) +{ + if(fs_hasTimeSupport()){ + file->DirEntry.AccessDate = time_getDate(); + if(file_getAttr(file,FILE_STATUS_WRITE)){ + file->DirEntry.FileSize = file->FileSize; + file->DirEntry.WriteDate = file->DirEntry.AccessDate; + file->DirEntry.WriteTime = time_getTime(); + } + dir_updateDirectoryEntry(file->fs,&(file->DirEntry),&(file->Location)); + }else{ + if(file_getAttr(file,FILE_STATUS_WRITE)){ + dir_setFileSize(file->fs,&(file->Location),file->FileSize); + } + } + + memClr(file,sizeof(*file)); + file_setAttr(file,FILE_STATUS_OPEN,0); + file_setAttr(file,FILE_STATUS_WRITE,0); + return(0); +} + + +/* **************************************************************************** + * void file_initFile(File *file, FileSystem *fs, FileLocation *loc) + * Description: This function initialises a new file object, by filling in + * the fs pointer, filesize (note, that DirEntry must already be filled in) + * and known cache parameters. + * Return value: void +*/ +void file_initFile(File *file, FileSystem *fs, FileLocation *loc) +{ + file->fs=fs; + file->FileSize=file->DirEntry.FileSize; + file->FilePtr=0; + file->Location.Sector=loc->Sector; + file->Location.Offset=loc->Offset; + file->Cache.Linear=0; + file->Cache.FirstCluster=(((euint32)file->DirEntry.FirstClusterHigh)<<16)+ + file->DirEntry.FirstClusterLow; + file->Cache.LastCluster=0; + file->Cache.LogicCluster=0; + file->Cache.DiscCluster=file->Cache.FirstCluster; +} +/*****************************************************************************/ + +/* **************************************************************************** + * euint8* file_normalToFatName(eint8* filename,eint8* fatfilename) + * Description: This function converts a human readable filename (limited to + * 8.3 eint8 character) to a valid FAT (not VFAT) filename. Invalid characters are + * changed to capital X and only the first 11 characters are used. + * Furthermore all letters are capitalised. + * Return value: pointer after the filename +*/ +eint8* file_normalToFatName(eint8* filename,eint8* fatfilename) +{ + euint8 c,dot=0,vc=0; + + for(c=0;c<11;c++)fatfilename[c]=' '; + + c=0; + + if(*filename == '.'){ + fatfilename[0]='.'; + vc++; + if(*(filename+1) == '.'){ + fatfilename[1]='.'; + filename+=2; + }else{ + filename++; + } + }else{ + while(*filename != '\0' && *filename != ' ' && *filename != '/'){ + if(*filename=='.' && !dot){ + dot=1; + c=8; + }else{ + if(dot){ + if(c<=10){ + fatfilename[c]=file_validateChar(*filename); + c++; + } + }else{ + if(c<=7){ + fatfilename[c]=file_validateChar(*filename); + c++; vc++; + } + } + } + filename++; + } + } + + if(vc>0){ + if(*filename=='\0'){ + return(filename); + }else{ + return(filename+1); + } + }else{ + return(0); + } +} +/*****************************************************************************/ + +/* **************************************************************************** + * + * Description: This function takes the character c, and if it is not a * + * valid FAT Filename character returns X. If it is a lowercase letter the * + * uppercase equivalent is returned. The remaining characters are returned * + * as they are. + * Return value: The validated char +*/ +euint8 file_validateChar(euint8 c) +{ + if( (c<0x20) || (c>0x20&&c<0x30&&c!='-') || (c>0x39&&c<0x41) || (c>0x5A&&c<0x61&&c!='_') || (c>0x7A&&c!='~') ) + return(0x58); + if( c>=0x61 && c<=0x7A ) + return(c-32); + + return(c); +} +/*****************************************************************************/ + +/* **************************************************************************** + * void ioman_setAttr(IOManager *ioman,euint16 bufplace,euint8 attribute,euint8 val) + * Description: This sets the attribute of 'bufplace' to the given value (binary). + * + * Return value: void +*/ +void file_setAttr(File* file,euint8 attribute,euint8 val) +{ + if(val){ + file->FileStatus|=1<FileStatus&=~(1<FileStatus&(1<file->FileSize){ + hc = fat_countClustersInChain(file->fs,file->Cache.FirstCluster); + clustersize = file->fs->volumeId.BytesPerSector * file->fs->volumeId.SectorsPerCluster; + if((size-file->FileSize+offset)> + ((hc-((file->FileSize+clustersize-1)/clustersize))*clustersize)){ + clusters_required = (((offset+size)-(hc*clustersize))+clustersize-1)/clustersize; + }else{ + clusters_required = 0; + } + }else{ + clusters_required = 0; + } + return(clusters_required); +} diff --git a/tools/efsl-0.3.6/src/fs/vfat/fs.c b/tools/efsl-0.3.6/src/fs/vfat/fs.c new file mode 100644 index 0000000..f0d9318 --- /dev/null +++ b/tools/efsl-0.3.6/src/fs/vfat/fs.c @@ -0,0 +1,512 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : fs.c * +* Release : 0.3 - devel * +* Description : These are general filesystem functions, supported by the * +* functions of dir.c and fat.c file.c uses these functions * +* heavily, but is not used by fs.c (not true anymore) * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "fs.h" +#include "fat.h" +#include "dir.h" +/*****************************************************************************/ + +/* **************************************************************************** + * eint16 fs_initFs(FileSystem *fs,Partition *part) + * Description: This functions glues the initialisation of the filesystem together. + * It loads the volumeID, computes the FS type and searches for the rootsector. + * Return value: Returns 0 on succes and -1 on error (if magic code is wrong) +*/ +eint16 fs_initFs(FileSystem *fs,Partition *part) +{ + if(!fs_isValidFat(part)){ + return(-1); + } + fs->part=part; + fs_loadVolumeId(fs,part); + if(!fs_verifySanity(fs))return(-2); + fs_countDataSectors(fs); + fs_determineFatType(fs); + fs_findFirstSectorRootDir(fs); + fs_initCurrentDir(fs); + + return(0); +} +/*****************************************************************************/ + +/* **************************************************************************** + * eint16 fs_isValidFat(Partition *part) + * Description: This functions loads the volumeID and checks if the magic + * value is present. + * Return value: returns 0 when magic code is missing, 1 if it is there. +*/ +eint16 fs_isValidFat(Partition *part) +{ + euint8 *buf; + + buf=part_getSect(part,0,IOM_MODE_READONLY|IOM_MODE_EXP_REQ); /* Load Volume label */ + if( ex_getb16(buf+0x1FE) != 0xAA55 ){ + return (0); + } + part_relSect(part,buf); + return(1); +} +/*****************************************************************************/ + +/* **************************************************************************** + * void fs_loadVolumeId(FileSystem *fs, Partition *part) + * Description: This function loads all relevant fields from the volumeid. +*/ +void fs_loadVolumeId(FileSystem *fs, Partition *part) +{ + euint8 *buf; + + buf=part_getSect(part,0,IOM_MODE_READONLY|IOM_MODE_EXP_REQ); + + fs->volumeId.BytesPerSector=ex_getb16(buf+0x0B); + fs->volumeId.SectorsPerCluster=*((eint8*)(buf+0x0D)); + fs->volumeId.ReservedSectorCount=ex_getb16(buf+0x0E); + fs->volumeId.NumberOfFats=*((eint8*)(buf+0x10)); + fs->volumeId.RootEntryCount=ex_getb16(buf+0x11); + fs->volumeId.SectorCount16=ex_getb16(buf+0x13); + fs->volumeId.FatSectorCount16=ex_getb16(buf+0x16); + fs->volumeId.SectorCount32=ex_getb32(buf+0x20); + fs->volumeId.FatSectorCount32=ex_getb32(buf+0x24); + fs->volumeId.RootCluster=ex_getb32(buf+0x2C); + + part_relSect(part,buf); + +} +/*****************************************************************************/ + +/* **************************************************************************** + * esint16 fs_verifySanity(FileSystem *fs) + * Description: Does some sanity calculations. + * Return value: 1 on success, 0 when discrepancies were found. +*/ +esint16 fs_verifySanity(FileSystem *fs) +{ + esint16 sane=1; /* Sane until proven otherwise */ + /* First check, BPS, we only support 512 */ + if(fs->volumeId.BytesPerSector!=512)sane=0; + /* Check is SPC is valid (multiple of 2, and clustersize >=32KB */ + if(!((fs->volumeId.SectorsPerCluster == 1 ) | + (fs->volumeId.SectorsPerCluster == 2 ) | + (fs->volumeId.SectorsPerCluster == 4 ) | + (fs->volumeId.SectorsPerCluster == 8 ) | + (fs->volumeId.SectorsPerCluster == 16) | + (fs->volumeId.SectorsPerCluster == 32) | + (fs->volumeId.SectorsPerCluster == 64) ))sane=0; + /* Any number of FAT's should be supported... (untested) */ + /* There should be at least 1 reserved sector */ + if(fs->volumeId.ReservedSectorCount==0)sane=0; + /* Can no longer do the check for filesystem size until partition supports this */ +/* if(fs->volumeId.FatSectorCount16 != 0){ + if(fs->volumeId.FatSectorCount16 > fs->part->disc->partitions[fs->part->activePartition].numSectors)sane=0; + }else{ + if(fs->volumeId.FatSectorCount32 > fs->part->disc->partitions[fs->part->activePartition].numSectors)sane=0; + } */ + return(sane); +} +/*****************************************************************************/ + +/* **************************************************************************** + * void fs_countDataSectors(FileSystem *fs) + * Description: This functions calculates the sectorcounts, fatsectorcounts and + * dataclustercounts. It fills in the general fields. +*/ +void fs_countDataSectors(FileSystem *fs) +{ + euint32 rootDirSectors,dataSectorCount; + + rootDirSectors=((fs->volumeId.RootEntryCount*32) + + (fs->volumeId.BytesPerSector - 1)) / + fs->volumeId.BytesPerSector; + + if(fs->volumeId.FatSectorCount16 != 0) + { + fs->FatSectorCount=fs->volumeId.FatSectorCount16; + fs->volumeId.FatSectorCount32=0; + } + else + { + fs->FatSectorCount=fs->volumeId.FatSectorCount32; + fs->volumeId.FatSectorCount16=0; + } + + if(fs->volumeId.SectorCount16!=0) + { + fs->SectorCount=fs->volumeId.SectorCount16; + fs->volumeId.SectorCount32=0; + } + else + { + fs->SectorCount=fs->volumeId.SectorCount32; + fs->volumeId.SectorCount16=0; + } + + dataSectorCount=fs->SectorCount - ( + fs->volumeId.ReservedSectorCount + + (fs->volumeId.NumberOfFats * fs->FatSectorCount) + + rootDirSectors); + + fs->DataClusterCount=dataSectorCount/fs->volumeId.SectorsPerCluster; +} +/*****************************************************************************/ + +/* **************************************************************************** + * void fs_determineFatType(FileSystem *fs) + * Description: This function looks af the Dataclustercount and determines the + * FAT type. It fills in fs->type. +*/ +void fs_determineFatType(FileSystem *fs) +{ + if(fs->DataClusterCount < 4085) + { + fs->type=FAT12; + fs->volumeId.RootCluster=0; + } + else if(fs->DataClusterCount < 65525) + { + fs->type=FAT16; + fs->volumeId.RootCluster=0; + } + else + { + fs->type=FAT32; + } +} +/*****************************************************************************/ + +/* **************************************************************************** + * void fs_findFirstSectorRootDir(FileSystem *fs) + * Description: This functions fills in the fs->FirstSectorRootDir field, even + * for FAT32, although that is not necessary (because you have FirstClusterRootDir). +*/ +void fs_findFirstSectorRootDir(FileSystem *fs) +{ + if(fs->type==FAT32) + fs->FirstSectorRootDir = fs->volumeId.ReservedSectorCount + + (fs->volumeId.NumberOfFats*fs->volumeId.FatSectorCount32) + + (fs->volumeId.RootCluster-2)*fs->volumeId.SectorsPerCluster; + else + fs->FirstSectorRootDir = fs->volumeId.ReservedSectorCount + + (fs->volumeId.NumberOfFats*fs->volumeId.FatSectorCount16); +} +/*****************************************************************************/ + +void fs_initCurrentDir(FileSystem *fs) +{ + fs->FirstClusterCurrentDir = fs_getFirstClusterRootDir(fs); +} +/*****************************************************************************/ + +/* **************************************************************************** + * long fs_clusterToSector(FileSystem *fs,euint32 cluster) + * Description: This function converts a clusternumber in the effective sector + * number where this cluster starts. Boundary check is not implemented + * Return value: A long is returned representing the sectornumber. +*/ +euint32 fs_clusterToSector(FileSystem *fs,euint32 cluster) +{ + eint32 base; + + if(fs->type==FAT32) + { + base= + fs->volumeId.ReservedSectorCount+ + fs->FatSectorCount*fs->volumeId.NumberOfFats; + } + else + { + base= + fs->volumeId.ReservedSectorCount+ + fs->FatSectorCount*fs->volumeId.NumberOfFats+ + fs->volumeId.RootEntryCount/16; + } + return( base + (cluster-2)*fs->volumeId.SectorsPerCluster ); +} +/*****************************************************************************/ + +/* Function is unused, but may be usefull */ +euint32 fs_sectorToCluster(FileSystem *fs,euint32 sector) +{ + eint32 base; + + if(fs->type==FAT32) + { + base= + fs->volumeId.ReservedSectorCount+ + fs->FatSectorCount*fs->volumeId.NumberOfFats; + } + else + { + base= + fs->volumeId.ReservedSectorCount+ + fs->FatSectorCount*fs->volumeId.NumberOfFats+ + fs->volumeId.RootEntryCount/16; + } + return(((sector-base)-((sector-base)%fs->volumeId.SectorsPerCluster))/fs->volumeId.SectorsPerCluster+2 ); +} +/*****************************************************************************/ + +/* **************************************************************************** + * euint32 fs_getNextFreeCluster(FileSystem *fs,euint32 startingcluster) + * Description: This functions searches for a free cluster, starting it's search at + * cluster startingcluster. This allow to speed up searches and try to avoid + * fragmentation. Implementing rollover search is still to be done. + * Return value: If a free cluster is found it's number is returned. If none is + * found 0 is returned. +*/ +euint32 fs_getNextFreeCluster(FileSystem *fs,euint32 startingcluster) +{ + euint32 r; + + while(startingclusterDataClusterCount){ + r=fat_getNextClusterAddress(fs,startingcluster,0); + if(r==0){ + return(startingcluster); + } + startingcluster++; + } + return(0); +} +/*****************************************************************************/ + +/* **************************************************************************** + * euint32 fs_giveFreeClusterHint(FileSystem *fs) + * + * Description: This function should return a clusternumber that is free or + * lies close before free clusters. The result MUST be checked to see if + * it is free! Implementationhint: search the largest clusternumber in the + * files in the rootdirectory. + * + * Return value: Returns it's best guess. +*/ +euint32 fs_giveFreeClusterHint(FileSystem *fs) +{ + return(2); /* Now THIS is a hint ;) */ +} +/*****************************************************************************/ + +/* **************************************************************************** + * esint8 fs_findFile(FileSystem *fs,eint8* filename,FileLocation *loc,euint32 *lastDir) + * + * Description: This function looks if the given filename is on the given fs + * and, if found, fills in its location in loc. + * The function will first check if the pathname starts with a slash. If so it will + * set the starting directory to the rootdirectory. Else, it will take the firstcluster- + * currentdir (That you can change with chdir()) as startingpoint. + * The lastdir pointer will be the first cluster of the last directory fs_findfile + * enters. It starts out at the root/current dir and then traverses the path along with + * fs_findFile. + * It is set to 0 in case of errors (like dir/dir/dir/file/dir/dir...) + * Return value: Returns 0 when nothing was found, 1 when the thing found + * was a file and 2 if the thing found was a directory. +*/ + +esint8 fs_findFile(FileSystem *fs,eint8* filename,FileLocation *loc,euint32 *lastDir) +{ + euint32 fccd,tmpclus; + eint8 ffname[11],*next,it=0,filefound=0; + + if(*filename=='/'){ + fccd = fs_getFirstClusterRootDir(fs); + filename++; + if(!*filename){ + if(lastDir)*lastDir=fccd; + return(2); + } + }else{ + fccd = fs->FirstClusterCurrentDir; + } + + if(lastDir)*lastDir=fccd; + + while((next=file_normalToFatName(filename,ffname))!=0){ + if((tmpclus=dir_findinDir(fs,ffname,fccd,loc,DIRFIND_FILE))==0)return(0); + it++; + if(loc->attrib&ATTR_DIRECTORY){ + fccd = tmpclus; + filename = next; + if(lastDir)*lastDir=fccd; + if(filefound)*lastDir=0; + }else{ + filefound=1; + if((file_normalToFatName(next,ffname))!=0){ + return(0); + }else{ + filename=next; + } + } + } + + if(it==0)return(0); + if(loc->attrib&ATTR_DIRECTORY || !filefound)return(2); + return(1); +} +/*****************************************************************************/ + +esint16 fs_findFreeFile(FileSystem *fs,eint8* filename,FileLocation *loc,euint8 mode) +{ + euint32 targetdir=0; + eint8 ffname[11]; + + if(fs_findFile(fs,filename,loc,&targetdir))return(0); + if(!dir_getFatFileName(filename,ffname))return(0); + if(dir_findinDir(fs,ffname,targetdir,loc,DIRFIND_FREE)){ + return(1); + }else{ + if(dir_addCluster(fs,targetdir)){ + return(0); + }else{ + if(dir_findinDir(fs,ffname,targetdir,loc,DIRFIND_FREE)){ + return(1); + } + } + } + + return(0); +} +/*****************************************************************************/ + +/* **************************************************************************** + * euint32 fs_getLastCluster(FileSystem *fs,ClusterChain *Cache) + * Description: This function searches the last cluster of a chain. + * Return value: The LastCluster (also stored in cache); +*/ +euint32 fs_getLastCluster(FileSystem *fs,ClusterChain *Cache) +{ + if(Cache->DiscCluster==0){ + Cache->DiscCluster=Cache->FirstCluster; + Cache->LogicCluster=0; + } + + if(Cache->LastCluster==0) + { + while(fat_getNextClusterChain(fs, Cache)==0) + { + Cache->LogicCluster+=Cache->Linear; + Cache->DiscCluster+=Cache->Linear; + Cache->Linear=0; + } + } + return(Cache->LastCluster); +} +/*****************************************************************************/ + +euint32 fs_getFirstClusterRootDir(FileSystem *fs) +{ + switch(fs->type){ + case FAT32: + return(fs->volumeId.RootCluster); + break; + default: + return(1); + break; + } +} +/*****************************************************************************/ + +void fs_initClusterChain(FileSystem *fs,ClusterChain *cache,euint32 cluster_addr) +{ + cache->FirstCluster=cluster_addr; + cache->DiscCluster=cluster_addr; + cache->LogicCluster=0; + cache->LastCluster=0; /* Warning flag here */ + cache->Linear=0; +} +/*****************************************************************************/ + +void fs_setFirstClusterInDirEntry(FileRecord *rec,euint32 cluster_addr) +{ + rec->FirstClusterHigh=cluster_addr>>16; + rec->FirstClusterLow=cluster_addr&0xFFFF; +} +/*****************************************************************************/ + +esint8 fs_flushFs(FileSystem *fs) +{ + return(part_flushPart(fs->part,0,fs->SectorCount)); +} +/*****************************************************************************/ + +esint8 fs_umount(FileSystem *fs) +{ + return(fs_flushFs(fs)); +} +/*****************************************************************************/ + +esint8 fs_clearCluster(FileSystem *fs,euint32 cluster) +{ + euint16 c; + euint8* buf; + + for(c=0;c<(fs->volumeId.SectorsPerCluster);c++){ + buf = part_getSect(fs->part,fs_clusterToSector(fs,cluster)+c,IOM_MODE_READWRITE); + memClr(buf,512); + part_relSect(fs->part,buf); + } + return(0); +} + +esint8 fs_getFsInfo(FileSystem *fs) +{ + euint8 *buf; + + if(!fs->type==FAT32)return(0); + buf = part_getSect(fs->part,FS_INFO_SECTOR,IOM_MODE_READONLY); + if(ex_getb32(buf+0)!=FSINFO_MAGIC_BEGIN || ex_getb32(buf+508)!=FSINFO_MAGIC_END){ + part_relSect(fs->part,buf); + return(-1); + } + fs->FreeClusterCount = ex_getb32(buf+488); + fs->NextFreeCluster = ex_getb32(buf+492); + part_relSect(fs->part,buf); + return(0); +} + +esint8 fs_setFsInfo(FileSystem *fs) +{ + euint8* buf; + + if(!fs->type==FAT32)return(0); + buf = part_getSect(fs->part,FS_INFO_SECTOR,IOM_MODE_READWRITE); + if(ex_getb32(buf+0)!=FSINFO_MAGIC_BEGIN || ex_getb32(buf+508)!=FSINFO_MAGIC_END){ + part_relSect(fs->part,buf); + return(-1); + } + ex_setb32(buf+488,fs->FreeClusterCount); + ex_setb32(buf+492,fs->NextFreeCluster); + part_relSect(fs->part,buf); + return(0); +} + diff --git a/tools/efsl-0.3.6/src/fs/vfat/fs.c~ b/tools/efsl-0.3.6/src/fs/vfat/fs.c~ new file mode 100644 index 0000000..9f62664 --- /dev/null +++ b/tools/efsl-0.3.6/src/fs/vfat/fs.c~ @@ -0,0 +1,511 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : fs.c * +* Release : 0.3 - devel * +* Description : These are general filesystem functions, supported by the * +* functions of dir.c and fat.c file.c uses these functions * +* heavily, but is not used by fs.c (not true anymore) * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "fs.h" +#include "fat.h" +#include "dir.h" +/*****************************************************************************/ + +/* **************************************************************************** + * eint16 fs_initFs(FileSystem *fs,Partition *part) + * Description: This functions glues the initialisation of the filesystem together. + * It loads the volumeID, computes the FS type and searches for the rootsector. + * Return value: Returns 0 on succes and -1 on error (if magic code is wrong) +*/ +eint16 fs_initFs(FileSystem *fs,Partition *part) +{ + if(!fs_isValidFat(part)){ + return(-1); + } + fs->part=part; + fs_loadVolumeId(fs,part); + if(!fs_verifySanity(fs))return(-2); + fs_countDataSectors(fs); + fs_determineFatType(fs); + fs_findFirstSectorRootDir(fs); + fs_initCurrentDir(fs); + + return(0); +} +/*****************************************************************************/ + +/* **************************************************************************** + * eint16 fs_isValidFat(Partition *part) + * Description: This functions loads the volumeID and checks if the magic + * value is present. + * Return value: returns 0 when magic code is missing, 1 if it is there. +*/ +eint16 fs_isValidFat(Partition *part) +{ + euint8 *buf; + + buf=part_getSect(part,0,IOM_MODE_READONLY|IOM_MODE_EXP_REQ); /* Load Volume label */ + if( ex_getb16(buf+0x1FE) != 0xAA55 ){ + return (0); + } + part_relSect(part,buf); + return(1); +} +/*****************************************************************************/ + +/* **************************************************************************** + * void fs_loadVolumeId(FileSystem *fs, Partition *part) + * Description: This function loads all relevant fields from the volumeid. +*/ +void fs_loadVolumeId(FileSystem *fs, Partition *part) +{ + euint8 *buf; + + buf=part_getSect(part,0,IOM_MODE_READONLY|IOM_MODE_EXP_REQ); + + fs->volumeId.BytesPerSector=ex_getb16(buf+0x0B); + fs->volumeId.SectorsPerCluster=*((eint8*)(buf+0x0D)); + fs->volumeId.ReservedSectorCount=ex_getb16(buf+0x0E); + fs->volumeId.NumberOfFats=*((eint8*)(buf+0x10)); + fs->volumeId.RootEntryCount=ex_getb16(buf+0x11); + fs->volumeId.SectorCount16=ex_getb16(buf+0x13); + fs->volumeId.FatSectorCount16=ex_getb16(buf+0x16); + fs->volumeId.SectorCount32=ex_getb32(buf+0x20); + fs->volumeId.FatSectorCount32=ex_getb32(buf+0x24); + fs->volumeId.RootCluster=ex_getb32(buf+0x2C); + + part_relSect(part,buf); + +} +/*****************************************************************************/ + +/* **************************************************************************** + * esint16 fs_verifySanity(FileSystem *fs) + * Description: Does some sanity calculations. + * Return value: 1 on success, 0 when discrepancies were found. +*/ +esint16 fs_verifySanity(FileSystem *fs) +{ + esint16 sane=1; /* Sane until proven otherwise */ + /* First check, BPS, we only support 512 */ + if(fs->volumeId.BytesPerSector!=512)sane=0; + /* Check is SPC is valid (multiple of 2, and clustersize >=32KB */ + if(!((fs->volumeId.SectorsPerCluster == 1 ) | + (fs->volumeId.SectorsPerCluster == 2 ) | + (fs->volumeId.SectorsPerCluster == 4 ) | + (fs->volumeId.SectorsPerCluster == 8 ) | + (fs->volumeId.SectorsPerCluster == 16) | + (fs->volumeId.SectorsPerCluster == 32) | + (fs->volumeId.SectorsPerCluster == 64) ))sane=0; + /* Any number of FAT's should be supported... (untested) */ + /* There should be at least 1 reserved sector */ + if(fs->volumeId.ReservedSectorCount==0)sane=0; +/* if(fs->volumeId.FatSectorCount16 != 0){ + if(fs->volumeId.FatSectorCount16 > fs->part->disc->partitions[fs->part->activePartition].numSectors)sane=0; + }else{ + if(fs->volumeId.FatSectorCount32 > fs->part->disc->partitions[fs->part->activePartition].numSectors)sane=0; + } */ + return(sane); +} +/*****************************************************************************/ + +/* **************************************************************************** + * void fs_countDataSectors(FileSystem *fs) + * Description: This functions calculates the sectorcounts, fatsectorcounts and + * dataclustercounts. It fills in the general fields. +*/ +void fs_countDataSectors(FileSystem *fs) +{ + euint32 rootDirSectors,dataSectorCount; + + rootDirSectors=((fs->volumeId.RootEntryCount*32) + + (fs->volumeId.BytesPerSector - 1)) / + fs->volumeId.BytesPerSector; + + if(fs->volumeId.FatSectorCount16 != 0) + { + fs->FatSectorCount=fs->volumeId.FatSectorCount16; + fs->volumeId.FatSectorCount32=0; + } + else + { + fs->FatSectorCount=fs->volumeId.FatSectorCount32; + fs->volumeId.FatSectorCount16=0; + } + + if(fs->volumeId.SectorCount16!=0) + { + fs->SectorCount=fs->volumeId.SectorCount16; + fs->volumeId.SectorCount32=0; + } + else + { + fs->SectorCount=fs->volumeId.SectorCount32; + fs->volumeId.SectorCount16=0; + } + + dataSectorCount=fs->SectorCount - ( + fs->volumeId.ReservedSectorCount + + (fs->volumeId.NumberOfFats * fs->FatSectorCount) + + rootDirSectors); + + fs->DataClusterCount=dataSectorCount/fs->volumeId.SectorsPerCluster; +} +/*****************************************************************************/ + +/* **************************************************************************** + * void fs_determineFatType(FileSystem *fs) + * Description: This function looks af the Dataclustercount and determines the + * FAT type. It fills in fs->type. +*/ +void fs_determineFatType(FileSystem *fs) +{ + if(fs->DataClusterCount < 4085) + { + fs->type=FAT12; + fs->volumeId.RootCluster=0; + } + else if(fs->DataClusterCount < 65525) + { + fs->type=FAT16; + fs->volumeId.RootCluster=0; + } + else + { + fs->type=FAT32; + } +} +/*****************************************************************************/ + +/* **************************************************************************** + * void fs_findFirstSectorRootDir(FileSystem *fs) + * Description: This functions fills in the fs->FirstSectorRootDir field, even + * for FAT32, although that is not necessary (because you have FirstClusterRootDir). +*/ +void fs_findFirstSectorRootDir(FileSystem *fs) +{ + if(fs->type==FAT32) + fs->FirstSectorRootDir = fs->volumeId.ReservedSectorCount + + (fs->volumeId.NumberOfFats*fs->volumeId.FatSectorCount32) + + (fs->volumeId.RootCluster-2)*fs->volumeId.SectorsPerCluster; + else + fs->FirstSectorRootDir = fs->volumeId.ReservedSectorCount + + (fs->volumeId.NumberOfFats*fs->volumeId.FatSectorCount16); +} +/*****************************************************************************/ + +void fs_initCurrentDir(FileSystem *fs) +{ + fs->FirstClusterCurrentDir = fs_getFirstClusterRootDir(fs); +} +/*****************************************************************************/ + +/* **************************************************************************** + * long fs_clusterToSector(FileSystem *fs,euint32 cluster) + * Description: This function converts a clusternumber in the effective sector + * number where this cluster starts. Boundary check is not implemented + * Return value: A long is returned representing the sectornumber. +*/ +euint32 fs_clusterToSector(FileSystem *fs,euint32 cluster) +{ + eint32 base; + + if(fs->type==FAT32) + { + base= + fs->volumeId.ReservedSectorCount+ + fs->FatSectorCount*fs->volumeId.NumberOfFats; + } + else + { + base= + fs->volumeId.ReservedSectorCount+ + fs->FatSectorCount*fs->volumeId.NumberOfFats+ + fs->volumeId.RootEntryCount/16; + } + return( base + (cluster-2)*fs->volumeId.SectorsPerCluster ); +} +/*****************************************************************************/ + +/* Function is unused, but may be usefull */ +euint32 fs_sectorToCluster(FileSystem *fs,euint32 sector) +{ + eint32 base; + + if(fs->type==FAT32) + { + base= + fs->volumeId.ReservedSectorCount+ + fs->FatSectorCount*fs->volumeId.NumberOfFats; + } + else + { + base= + fs->volumeId.ReservedSectorCount+ + fs->FatSectorCount*fs->volumeId.NumberOfFats+ + fs->volumeId.RootEntryCount/16; + } + return(((sector-base)-((sector-base)%fs->volumeId.SectorsPerCluster))/fs->volumeId.SectorsPerCluster+2 ); +} +/*****************************************************************************/ + +/* **************************************************************************** + * euint32 fs_getNextFreeCluster(FileSystem *fs,euint32 startingcluster) + * Description: This functions searches for a free cluster, starting it's search at + * cluster startingcluster. This allow to speed up searches and try to avoid + * fragmentation. Implementing rollover search is still to be done. + * Return value: If a free cluster is found it's number is returned. If none is + * found 0 is returned. +*/ +euint32 fs_getNextFreeCluster(FileSystem *fs,euint32 startingcluster) +{ + euint32 r; + + while(startingclusterDataClusterCount){ + r=fat_getNextClusterAddress(fs,startingcluster,0); + if(r==0){ + return(startingcluster); + } + startingcluster++; + } + return(0); +} +/*****************************************************************************/ + +/* **************************************************************************** + * euint32 fs_giveFreeClusterHint(FileSystem *fs) + * + * Description: This function should return a clusternumber that is free or + * lies close before free clusters. The result MUST be checked to see if + * it is free! Implementationhint: search the largest clusternumber in the + * files in the rootdirectory. + * + * Return value: Returns it's best guess. +*/ +euint32 fs_giveFreeClusterHint(FileSystem *fs) +{ + return(2); /* Now THIS is a hint ;) */ +} +/*****************************************************************************/ + +/* **************************************************************************** + * esint8 fs_findFile(FileSystem *fs,eint8* filename,FileLocation *loc,euint32 *lastDir) + * + * Description: This function looks if the given filename is on the given fs + * and, if found, fills in its location in loc. + * The function will first check if the pathname starts with a slash. If so it will + * set the starting directory to the rootdirectory. Else, it will take the firstcluster- + * currentdir (That you can change with chdir()) as startingpoint. + * The lastdir pointer will be the first cluster of the last directory fs_findfile + * enters. It starts out at the root/current dir and then traverses the path along with + * fs_findFile. + * It is set to 0 in case of errors (like dir/dir/dir/file/dir/dir...) + * Return value: Returns 0 when nothing was found, 1 when the thing found + * was a file and 2 if the thing found was a directory. +*/ + +esint8 fs_findFile(FileSystem *fs,eint8* filename,FileLocation *loc,euint32 *lastDir) +{ + euint32 fccd,tmpclus; + eint8 ffname[11],*next,it=0,filefound=0; + + if(*filename=='/'){ + fccd = fs_getFirstClusterRootDir(fs); + filename++; + if(!*filename){ + if(lastDir)*lastDir=fccd; + return(2); + } + }else{ + fccd = fs->FirstClusterCurrentDir; + } + + if(lastDir)*lastDir=fccd; + + while((next=file_normalToFatName(filename,ffname))!=0){ + if((tmpclus=dir_findinDir(fs,ffname,fccd,loc,DIRFIND_FILE))==0)return(0); + it++; + if(loc->attrib&ATTR_DIRECTORY){ + fccd = tmpclus; + filename = next; + if(lastDir)*lastDir=fccd; + if(filefound)*lastDir=0; + }else{ + filefound=1; + if((file_normalToFatName(next,ffname))!=0){ + return(0); + }else{ + filename=next; + } + } + } + + if(it==0)return(0); + if(loc->attrib&ATTR_DIRECTORY || !filefound)return(2); + return(1); +} +/*****************************************************************************/ + +esint16 fs_findFreeFile(FileSystem *fs,eint8* filename,FileLocation *loc,euint8 mode) +{ + euint32 targetdir=0; + eint8 ffname[11]; + + if(fs_findFile(fs,filename,loc,&targetdir))return(0); + if(!dir_getFatFileName(filename,ffname))return(0); + if(dir_findinDir(fs,ffname,targetdir,loc,DIRFIND_FREE)){ + return(1); + }else{ + if(dir_addCluster(fs,targetdir)){ + return(0); + }else{ + if(dir_findinDir(fs,ffname,targetdir,loc,DIRFIND_FREE)){ + return(1); + } + } + } + + return(0); +} +/*****************************************************************************/ + +/* **************************************************************************** + * euint32 fs_getLastCluster(FileSystem *fs,ClusterChain *Cache) + * Description: This function searches the last cluster of a chain. + * Return value: The LastCluster (also stored in cache); +*/ +euint32 fs_getLastCluster(FileSystem *fs,ClusterChain *Cache) +{ + if(Cache->DiscCluster==0){ + Cache->DiscCluster=Cache->FirstCluster; + Cache->LogicCluster=0; + } + + if(Cache->LastCluster==0) + { + while(fat_getNextClusterChain(fs, Cache)==0) + { + Cache->LogicCluster+=Cache->Linear; + Cache->DiscCluster+=Cache->Linear; + Cache->Linear=0; + } + } + return(Cache->LastCluster); +} +/*****************************************************************************/ + +euint32 fs_getFirstClusterRootDir(FileSystem *fs) +{ + switch(fs->type){ + case FAT32: + return(fs->volumeId.RootCluster); + break; + default: + return(1); + break; + } +} +/*****************************************************************************/ + +void fs_initClusterChain(FileSystem *fs,ClusterChain *cache,euint32 cluster_addr) +{ + cache->FirstCluster=cluster_addr; + cache->DiscCluster=cluster_addr; + cache->LogicCluster=0; + cache->LastCluster=0; /* Warning flag here */ + cache->Linear=0; +} +/*****************************************************************************/ + +void fs_setFirstClusterInDirEntry(FileRecord *rec,euint32 cluster_addr) +{ + rec->FirstClusterHigh=cluster_addr>>16; + rec->FirstClusterLow=cluster_addr&0xFFFF; +} +/*****************************************************************************/ + +esint8 fs_flushFs(FileSystem *fs) +{ + return(part_flushPart(fs->part,0,fs->SectorCount)); +} +/*****************************************************************************/ + +esint8 fs_umount(FileSystem *fs) +{ + return(fs_flushFs(fs)); +} +/*****************************************************************************/ + +esint8 fs_clearCluster(FileSystem *fs,euint32 cluster) +{ + euint16 c; + euint8* buf; + + for(c=0;c<(fs->volumeId.SectorsPerCluster);c++){ + buf = part_getSect(fs->part,fs_clusterToSector(fs,cluster)+c,IOM_MODE_READWRITE); + memClr(buf,512); + part_relSect(fs->part,buf); + } + return(0); +} + +esint8 fs_getFsInfo(FileSystem *fs) +{ + euint8 *buf; + + if(!fs->type==FAT32)return(0); + buf = part_getSect(fs->part,FS_INFO_SECTOR,IOM_MODE_READONLY); + if(ex_getb32(buf+0)!=FSINFO_MAGIC_BEGIN || ex_getb32(buf+508)!=FSINFO_MAGIC_END){ + part_relSect(fs->part,buf); + return(-1); + } + fs->FreeClusterCount = ex_getb32(buf+488); + fs->NextFreeCluster = ex_getb32(buf+492); + part_relSect(fs->part,buf); + return(0); +} + +esint8 fs_setFsInfo(FileSystem *fs) +{ + euint8* buf; + + if(!fs->type==FAT32)return(0); + buf = part_getSect(fs->part,FS_INFO_SECTOR,IOM_MODE_READWRITE); + if(ex_getb32(buf+0)!=FSINFO_MAGIC_BEGIN || ex_getb32(buf+508)!=FSINFO_MAGIC_END){ + part_relSect(fs->part,buf); + return(-1); + } + ex_setb32(buf+488,fs->FreeClusterCount); + ex_setb32(buf+492,fs->NextFreeCluster); + part_relSect(fs->part,buf); + return(0); +} + diff --git a/tools/efsl-0.3.6/src/fs/vfat/include/dir.h b/tools/efsl-0.3.6/src/fs/vfat/include/dir.h new file mode 100644 index 0000000..36abbf2 --- /dev/null +++ b/tools/efsl-0.3.6/src/fs/vfat/include/dir.h @@ -0,0 +1,85 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : dir.h * +* Release : 0.3 - devel * +* Description : The functions of dir.c are part of fs.c, they deal with all * +* the directory specific stuff. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __DDIR_H__ +#define __DDIR_H__ + +/*****************************************************************************/ +#include "config.h" +#include "error.h" +#include "fat.h" +#include "plibc.h" +#include "types.h" +#include "ioman.h" +#include "time.h" +#include "fs.h" +/*****************************************************************************/ + +#define ATTR_READ_ONLY 0x01 +#define ATTR_HIDDEN 0x02 +#define ATTR_SYSTEM 0x04 +#define ATTR_VOLUME_ID 0x08 +#define ATTR_DIRECTORY 0x10 +#define ATTR_ARCHIVE 0x20 + +#define OFFSET_DE_FILENAME 0 +#define OFFSET_DE_ATTRIBUTE 11 +#define OFFSET_DE_NTRESERVED 12 +#define OFFSET_DE_CRTIMETNT 13 +#define OFFSET_DE_CREATETIME 14 +#define OFFSET_DE_CREATEDATE 16 +#define OFFSET_DE_LASTACCESSDATE 18 +#define OFFSET_DE_FIRSTCLUSTERHIGH 20 +#define OFFSET_DE_WRITETIME 22 +#define OFFSET_DE_WRITEDATE 24 +#define OFFSET_DE_FIRSTCLUSTERLOW 26 +#define OFFSET_DE_FILESIZE 28 + +#define DIRFIND_FILE 0 +#define DIRFIND_FREE 1 + +void dir_getFileStructure(FileSystem *fs,FileRecord *filerec,FileLocation *loc); +void dir_createDirectoryEntry(FileSystem *fs,FileRecord *filerec,FileLocation *loc); +void dir_createDefaultEntry(FileSystem *fs,FileRecord *filerec,eint8* fatfilename); +void dir_setFirstCluster(FileSystem *fs,FileLocation *loc,euint32 cluster_addr); +void dir_setFileSize(FileSystem *fs,FileLocation *loc,euint32 numbytes); +euint32 dir_findinRoot(FileSystem *fs,eint8 * fatname, FileLocation *loc); +euint32 dir_findinDir(FileSystem *fs, eint8 * fatname, euint32 startCluster, FileLocation *loc, euint8 mode); +euint32 dir_findinBuf(euint8 *buf,eint8 *fatname, FileLocation *loc, euint8 mode); +euint32 dir_findinCluster(FileSystem *fs,euint32 cluster,eint8 *fatname, FileLocation *loc, euint8 mode); +euint32 dir_findinRootArea(FileSystem *fs,eint8* fatname, FileLocation *loc, euint8 mode); +esint8 dir_getFatFileName(eint8* filename, eint8* fatfilename); +esint8 dir_updateDirectoryEntry(FileSystem *fs,FileRecord *entry,FileLocation *loc); +esint8 dir_addCluster(FileSystem *fs,euint32 firstCluster); +#endif diff --git a/tools/efsl-0.3.6/src/fs/vfat/include/fat.h b/tools/efsl-0.3.6/src/fs/vfat/include/fat.h new file mode 100644 index 0000000..1258f75 --- /dev/null +++ b/tools/efsl-0.3.6/src/fs/vfat/include/fat.h @@ -0,0 +1,62 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : fat.h * +* Release : 0.3 - devel * +* Description : This file contains all the functions dealing with the FAT * +* in a Microsoft FAT filesystem. It belongs under fs.c * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __FAT_H_ +#define __FAT_H_ + +/*****************************************************************************/ +#include "config.h" +#include "error.h" +#include "file.h" +#include "debug.h" +#include "types.h" +/*****************************************************************************/ + +euint32 fat_getSectorAddressFatEntry(FileSystem *fs,euint32 cluster_addr); +euint32 fat_getNextClusterAddress(FileSystem *fs, euint32 cluster_addr, euint16 *linear); +void fat_setNextClusterAddress(FileSystem *fs,euint32 cluster_addr,euint32 next_cluster_addr); +eint16 fat_isEocMarker(FileSystem *fs,euint32 fat_entry); +euint32 fat_giveEocMarker(FileSystem *fs); +euint32 fat_findClusterAddress(FileSystem *fs,euint32 cluster,euint32 offset, euint8 *linear); +euint32 fat_getNextClusterAddressWBuf(FileSystem *fs,euint32 cluster_addr, euint8 * buf); +void fat_setNextClusterAddressWBuf(FileSystem *fs,euint32 cluster_addr,euint32 next_cluster_addr,euint8 * buf); +esint16 fat_getNextClusterChain(FileSystem *fs, ClusterChain *Cache); +void fat_bogus(void); +esint16 fat_LogicToDiscCluster(FileSystem *fs, ClusterChain *Cache,euint32 logiccluster); +eint16 fat_allocClusterChain(FileSystem *fs,ClusterChain *Cache,euint32 num_clusters); +eint16 fat_unlinkClusterChain(FileSystem *fs,ClusterChain *Cache); +euint32 fat_countClustersInChain(FileSystem *fs,euint32 firstcluster); +euint32 fat_DiscToLogicCluster(FileSystem *fs,euint32 firstcluster,euint32 disccluster); + +#endif diff --git a/tools/efsl-0.3.6/src/fs/vfat/include/file.h b/tools/efsl-0.3.6/src/fs/vfat/include/file.h new file mode 100644 index 0000000..d2b3b84 --- /dev/null +++ b/tools/efsl-0.3.6/src/fs/vfat/include/file.h @@ -0,0 +1,97 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : file.h * +* Release : 0.3 - devel * +* Description : This file contains functions dealing with files such as: * +* fopen, fread and fwrite. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __FILE_H_ +#define __FILE_H_ + +/*****************************************************************************/ +#include "config.h" +#include "error.h" +#include "time.h" +#include "fs.h" +#include "dir.h" +#include "plibc.h" +#include "debug.h" +#include "types.h" +#include "fat.h" +/*****************************************************************************/ + +#define MODE_READ 0x72 +#define MODE_WRITE 0x77 +#define MODE_APPEND 0x61 + +#define FILE_STATUS_OPEN 0 +#define FILE_STATUS_WRITE 1 + +/*****************************************************************************\ + * File + * ------ + * FileRecord DirEntry Copy of the FileRecord for this file + * FileLocation Location Location of the direntry + * FileSystem *fs Pointer to the filesystem this file is on + * FileCache Cache Pointer to the cache object of the file + * euint8 FileStatus Contains bitfield regarding filestatus + * euint32 FilePtr Offsetpointer for fread/fwrite functions + * euint32 FileSize Working copy of the filesize, always use this, + it is more up to date than DirEntry->FileSize, + which is only updated when flushing to disc. +\*****************************************************************************/ +struct _File{ + FileRecord DirEntry; + FileLocation Location; /* Location in directory!! */ + FileSystem *fs; + ClusterChain Cache; + euint8 FileStatus; + euint32 FilePtr; + euint32 FileSize; +}; +typedef struct _File File; + + +esint8 file_fopen(File *file, FileSystem *fs,eint8 *filename, eint8 mode); +esint8 file_fclose(File *file); +esint16 file_setpos(File *file,euint32 pos); +euint32 file_fread(File *file,euint32 offset, euint32 size,euint8 *buf); +euint32 file_read (File *file,euint32 size,euint8 *buf); +euint32 file_fwrite(File* file,euint32 offset,euint32 size,euint8* buf); +euint32 file_write (File* file,euint32 size,euint8* buf); +eint8* file_normalToFatName(eint8* filename,eint8* fatfilename); +euint8 file_validateChar(euint8 c); +void file_initFile(File *file, FileSystem *fs, FileLocation *loc); +eint16 file_allocClusterChain(File *file,euint32 num_clusters); +void file_setAttr(File* file,euint8 attribute,euint8 val); +euint8 file_getAttr(File* file,euint8 attribute); +euint32 file_requiredCluster(File *file,euint32 offset, euint32 size); + +#endif diff --git a/tools/efsl-0.3.6/src/fs/vfat/include/fs.h b/tools/efsl-0.3.6/src/fs/vfat/include/fs.h new file mode 100644 index 0000000..bd1b565 --- /dev/null +++ b/tools/efsl-0.3.6/src/fs/vfat/include/fs.h @@ -0,0 +1,200 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : fs.h * +* Release : 0.3 - devel * +* Description : These are general filesystem functions, supported by the * +* functions of dir.c and fat.c file.c uses these functions * +* heavily, but is not used by fs.c (not true anymore) * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __FS_H_ +#define __FS_H_ + +/*****************************************************************************/ +#include "config.h" +#include "types.h" +#include "error.h" +#include "partition.h" +#include "debug.h" +#include "time.h" +#include "extract.h" +/*****************************************************************************/ + +#define FAT12 1 +#define FAT16 2 +#define FAT32 3 + +#define FS_INFO_SECTOR 1 +#define FSINFO_MAGIC_BEGIN 0x41615252 +#define FSINFO_MAGIC_END 0xAA550000 + +/*****************************************************************************************\ + VolumeId + ------ +* ushort BytesPerSector Must be 512 or shit happens. +* uchar SectorsPerCluster Must be multiple of 2 (1,2,4,8,16 or 32) +* ushort ReservedSectorCount Number of sectors after which the first FAT begins. +* uchar NumberOfFats Should be 2 +* ushort RootEntryCount Number of filerecords the Rootdir can contain. NOT for FAT32 +* ushort SectorCount16 Number of Sectors for 12/16 bit FAT +* ushort FatSectorCount16 Number of Sectors for 1 FAT on FAT12/16 bit FAT's +* ulong SectorCount32 Number of Sectors for 32 bit FAT +* ulong FatSectorCount32 Number of Sectors for 1 FAT on FAT32 +* ulong RootCluster Clusternumber of the first cluster of the RootDir on FAT 32 +This is NOT a complete volumeId copy, no direct I/O is possible. +\*****************************************************************************************/ +struct _VolumeId{ + euint16 BytesPerSector; + euint8 SectorsPerCluster; + euint16 ReservedSectorCount; + euint8 NumberOfFats; + euint16 RootEntryCount; + euint16 SectorCount16; + euint16 FatSectorCount16; + euint32 SectorCount32; + euint32 FatSectorCount32; + euint32 RootCluster; +}; +typedef struct _VolumeId VolumeId; + +/**************************************************************************************************\ + FileSystem + -------- +* Partition* part Pointer to partition on which this FS resides. +* VolumeId volumeId Contains important FS info. +* ulong DataClusterCount Number of dataclusters. This number determines the FATType. +* ulong FatSectorCount Number of sectors for 1 FAT, regardless of FATType +* ulong SectorCount Number of sectors, regardless of FATType +* ulong FirstSectorRootDir First sector of the RootDir. +* uchar type Determines FATType (FAT12 FAT16 or FAT32 are defined) + +\**************************************************************************************************/ +struct _FileSystem{ + Partition *part; + VolumeId volumeId; + euint32 DataClusterCount; + euint32 FatSectorCount; + euint32 SectorCount; + euint32 FirstSectorRootDir; + euint32 FirstClusterCurrentDir; + euint32 FreeClusterCount; + euint32 NextFreeCluster; + euint8 type; +}; +typedef struct _FileSystem FileSystem; + +/**************************************************************************************************\ FileLocation + ---------- +* euint32 Sector Sector where the directoryentry of the file/directory can be found. +* euint8 Offset Offset (in 32byte segments) where in the sector the entry is. + +\**************************************************************************************************/ +struct _FileLocation{ + euint32 Sector; + euint8 Offset; + euint8 attrib; +}; +typedef struct _FileLocation FileLocation; + +/*****************************************************************************\ +* FileCache +* ----------- +* This struct acts as cache for the current file. It contains the current +* FATPointer (next location in the FAT table), LogicCluster +* (the last part of the file that was read) and DataCluster +* (the last cluster that was read). +* euint8 Linear For how many more clusters the file is nonfragmented +* euint32 LogicCluster This field determines the n'th cluster of the file as current +* euint32 DiscCluster If this field is 0, it means the cache is invalid. Otherwise + it is the clusternumber corresponding with + logic(FirstCluster+LogicCluster). +* euint32 FirstCluster First cluster of the chain. Zero or one are invalid. +* euint32 LastCluster Last cluster of the chain (is not always filled in) +\*****************************************************************************/ +struct _ClusterChain{ + euint8 Linear; + esint32 LogicCluster; + euint32 DiscCluster; + euint32 FirstCluster; + euint32 LastCluster; +}; +typedef struct _ClusterChain ClusterChain; + +/*****************************************************************************\ +* FileRecord * +* ------------ * +* This struct represents a 32 byte file entry as it occurs in the data area * +* of the filesystem. Direct I/O is possible. * +\*****************************************************************************/ +struct _FileRecord{ + euint8 FileName[11]; + euint8 Attribute; + euint8 NTReserved; + euint8 MilliSecTimeStamp; + euint16 CreatedTime; + euint16 CreatedDate; + euint16 AccessDate; + euint16 FirstClusterHigh; + euint16 WriteTime; + euint16 WriteDate; + euint16 FirstClusterLow; + euint32 FileSize; +}; +typedef struct _FileRecord FileRecord; + + +eint16 fs_initFs(FileSystem *fs,Partition *part); +eint16 fs_isValidFat(Partition *part); +void fs_loadVolumeId(FileSystem *fs, Partition *part); +esint16 fs_verifySanity(FileSystem *fs); +void fs_countDataSectors(FileSystem *fs); +void fs_determineFatType(FileSystem *fs); +void fs_findFirstSectorRootDir(FileSystem *fs); +void fs_initCurrentDir(FileSystem *fs); +euint32 fs_getSectorAddressRootDir(FileSystem *fs,euint32 secref); +euint32 fs_clusterToSector(FileSystem *fs,euint32 cluster); +euint32 fs_sectorToCluster(FileSystem *fs,euint32 sector); +euint32 fs_getNextFreeCluster(FileSystem *fs,euint32 startingcluster); +euint32 fs_giveFreeClusterHint(FileSystem *fs); +esint16 fs_findFreeFile(FileSystem *fs,eint8* filename,FileLocation *loc,euint8 mode); +esint8 fs_findFile(FileSystem *fs,eint8* filename,FileLocation *loc,euint32 *lastDir); +esint8 fs_findFile_broken(FileSystem *fs,eint8* filename,FileLocation *loc); +euint32 fs_getLastCluster(FileSystem *fs,ClusterChain *Cache); +euint32 fs_getFirstClusterRootDir(FileSystem *fs); +euint16 fs_makeDate(void); +euint16 fs_makeTime(void); +void fs_setFirstClusterInDirEntry(FileRecord *rec,euint32 cluster_addr); +void fs_initClusterChain(FileSystem *fs,ClusterChain *cache,euint32 cluster_addr); +esint8 fs_flushFs(FileSystem *fs); +esint8 fs_umount(FileSystem *fs); +esint8 fs_clearCluster(FileSystem *fs,euint32 cluster); +esint8 fs_getFsInfo(FileSystem *fs); +esint8 fs_setFsInfo(FileSystem *fs); + +#endif diff --git a/tools/efsl-0.3.6/src/fs/vfat/include/ls.h b/tools/efsl-0.3.6/src/fs/vfat/include/ls.h new file mode 100644 index 0000000..c4d9701 --- /dev/null +++ b/tools/efsl-0.3.6/src/fs/vfat/include/ls.h @@ -0,0 +1,69 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : ls.h * +* Release : 0.3 - devel * +* Description : This file contains functions to list the files in a directory * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __LS_H__ +#define __LS_H__ + +/*****************************************************************************/ +#include "config.h" +#include "fs.h" +#include "dir.h" +#include "fat.h" +/*****************************************************************************/ + +struct _ListDirEntry{ + euint8 FileName[LIST_MAXLENFILENAME]; + euint32 FileSize; + euint8 Attribute; +}; +typedef struct _ListDirEntry ListDirEntry; + +struct _DirList{ + FileSystem *fs; + euint16 cEntry,rEntry; + /*FileRecord currentEntry;*/ + ListDirEntry currentEntry; + ClusterChain Cache; +}; +typedef struct _DirList DirList; + +esint8 ls_openDir(DirList *dlist,FileSystem *fs,eint8* dirname); +esint8 ls_getNext(DirList *dlist); + +esint8 ls_getDirEntry(DirList *dlist); +esint8 ls_getRealDirEntry(DirList *dlist); +esint8 ls_getRootAreaEntry(DirList *dlist); +esint8 ls_isValidFileEntry(ListDirEntry *entry); +void ls_fileEntryToDirListEntry(DirList *dlist, euint8* buf, euint16 offset); + +#endif diff --git a/tools/efsl-0.3.6/src/fs/vfat/include/mkfs.h b/tools/efsl-0.3.6/src/fs/vfat/include/mkfs.h new file mode 100644 index 0000000..b211538 --- /dev/null +++ b/tools/efsl-0.3.6/src/fs/vfat/include/mkfs.h @@ -0,0 +1,50 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : mkfs.h * +* Release : 0.3 - devel * +* Description : These functions are used for creating an empty filesystem. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __MKFS_H_ +#define __MKFS_H_ + +/*****************************************************************************/ +#include "partition.h" +#include "plibc.h" +#include "debug.h" +#include "types.h" +#include "extract.h" +#include "config.h" +/*****************************************************************************/ + +#define MKFS_ERR_TOOLITTLESECTORS 1 + +esint16 mkfs_makevfat(Partition *part); + +#endif diff --git a/tools/efsl-0.3.6/src/fs/vfat/include/time.h b/tools/efsl-0.3.6/src/fs/vfat/include/time.h new file mode 100644 index 0000000..42b1bad --- /dev/null +++ b/tools/efsl-0.3.6/src/fs/vfat/include/time.h @@ -0,0 +1,74 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : time.h * +* Release : 0.3 - devel * +* Description : This file contains functions for time support * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __TIME_H_ +#define __TIME_H_ + +/*****************************************************************************/ +#include "types.h" +/*****************************************************************************/ + +#ifdef DATE_TIME_SUPPORT + #define time_getYear(void) efsl_getYear() + #define time_getMonth(void) efsl_getMonth() + #define time_getDay(void) efsl_getDay() + #define time_getHour(void) efsl_getHour() + #define time_getMinute(void) efsl_getMinute() + #define time_getSecond(void) efsl_getSecond() + #define time_getDate(void) fs_makeDate() + #define time_getTime(void) fs_makeTime() +#else + #define time_getYear(void) 0x0; + #define time_getMonth(void) 0x0; + #define time_getDay(void) 0x0; + #define time_getHour(void) 0x0; + #define time_getMinute(void) 0x0; + #define time_getSecond(void) 0x0; + #define time_getDate(void) 0x0; + #define time_getTime(void) 0x0; +#endif + +#ifdef DATE_TIME_SUPPORT +euint16 efsl_getYear(void); +euint8 efsl_getMonth(void); +euint8 efsl_getDay(void); +euint8 efsl_getHour(void); +euint8 efsl_getMinute(void); +euint8 efsl_getSecond(void); +euint16 fs_makeDate(void); +euint16 fs_makeTime(void); +#endif + +euint8 fs_hasTimeSupport(void); + +#endif diff --git a/tools/efsl-0.3.6/src/fs/vfat/include/ui.h b/tools/efsl-0.3.6/src/fs/vfat/include/ui.h new file mode 100644 index 0000000..b584e5f --- /dev/null +++ b/tools/efsl-0.3.6/src/fs/vfat/include/ui.h @@ -0,0 +1,50 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : ui.h * +* Release : 0.3 - devel * +* Description : This file contains functions which will be presented to the * +* user of this library. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __UI_H__ +#define __UI_H__ + +/*****************************************************************************/ +#include "fs.h" +#include "types.h" +#include "fat.h" +#include "dir.h" +#include "config.h" +/*****************************************************************************/ + +short listFiles(FileSystem *fs, char *dir); +esint16 rmfile(FileSystem *fs,euint8* filename); +esint8 mkdir(FileSystem *fs,eint8* dirname); + +#endif diff --git a/tools/efsl-0.3.6/src/fs/vfat/ls.c b/tools/efsl-0.3.6/src/fs/vfat/ls.c new file mode 100644 index 0000000..561ad26 --- /dev/null +++ b/tools/efsl-0.3.6/src/fs/vfat/ls.c @@ -0,0 +1,141 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : ls.c * +* Release : 0.3 - devel * +* Description : This file contains functions to list the files in a directory * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "ls.h" +/*****************************************************************************/ + +esint8 ls_openDir(DirList *dlist,FileSystem *fs,eint8* dirname) +{ + FileLocation loc; + euint32 fc; + + dlist->fs=fs; + + if(fs_findFile(dlist->fs,dirname,&loc,&fc)!=2) + { + return(-1); + } + + fs_initClusterChain(dlist->fs,&(dlist->Cache),fc); + memClr(&(dlist->currentEntry),sizeof(dlist->currentEntry)); + dlist->rEntry=0; + dlist->cEntry=0xFFFF; + + return(0); +} +/*****************************************************************************/ + +esint8 ls_getDirEntry(DirList *dlist) +{ + if(dlist->Cache.FirstCluster == 1){ + return(ls_getRootAreaEntry(dlist)); + }else if(dlist->Cache.FirstCluster){ + return(ls_getRealDirEntry(dlist)); + } + return(-1); +} +/*****************************************************************************/ + +esint8 ls_getNext(DirList *dlist) +{ + do{ + if(ls_getDirEntry(dlist))return(-1); + dlist->rEntry++; + }while(!ls_isValidFileEntry(&(dlist->currentEntry))); + dlist->cEntry++; + return(0); +} +/*****************************************************************************/ + +esint8 ls_getRealDirEntry(DirList *dlist) +{ + euint8* buf; + + if(dlist->Cache.FirstCluster<=1)return(-1); + + if(fat_LogicToDiscCluster(dlist->fs, + &(dlist->Cache), + (dlist->rEntry)/(16 * dlist->fs->volumeId.SectorsPerCluster))){ + return(-1); + } + + buf = part_getSect(dlist->fs->part, + fs_clusterToSector(dlist->fs,dlist->Cache.DiscCluster) + (dlist->rEntry/16)%dlist->fs->volumeId.SectorsPerCluster, + IOM_MODE_READONLY); + + /*memCpy(buf+(dlist->rEntry%16)*32,&(dlist->currentEntry),32);*/ + ls_fileEntryToDirListEntry(dlist,buf,32*(dlist->rEntry%16)); + + part_relSect(dlist->fs->part,buf); + + return(0); +} +/*****************************************************************************/ + +esint8 ls_getRootAreaEntry(DirList *dlist) +{ + euint8 *buf=0; + + if((dlist->fs->type != FAT12) && (dlist->fs->type != FAT16))return(-1); + if(dlist->rEntry>=dlist->fs->volumeId.RootEntryCount)return(-1); + + buf = part_getSect(dlist->fs->part, + dlist->fs->FirstSectorRootDir+dlist->rEntry/16, + IOM_MODE_READONLY); + /*memCpy(buf+32*(dlist->rEntry%16),&(dlist->currentEntry),32);*/ + ls_fileEntryToDirListEntry(dlist,buf,32*(dlist->rEntry%16)); + part_relSect(dlist->fs->part,buf); + return(0); +} +/*****************************************************************************/ + +esint8 ls_isValidFileEntry(ListDirEntry *entry) +{ + if(entry->FileName[0] == 0 || entry->FileName[0] == 0xE5 || entry->FileName[0] == '.')return(0); + if((entry->Attribute&0x0F)==0x0F)return(0); + return(1); +} +/*****************************************************************************/ + +void ls_fileEntryToDirListEntry(DirList *dlist, euint8* buf, euint16 offset) +{ + if(offset>480 || offset%32)return; + + buf+=offset; + memCpy(buf+OFFSET_DE_FILENAME,dlist->currentEntry.FileName,LIST_MAXLENFILENAME); + dlist->currentEntry.Attribute = *(buf+OFFSET_DE_ATTRIBUTE); + dlist->currentEntry.FileSize = ex_getb32(buf+OFFSET_DE_FILESIZE); +} +/*****************************************************************************/ + diff --git a/tools/efsl-0.3.6/src/fs/vfat/mkfs.c b/tools/efsl-0.3.6/src/fs/vfat/mkfs.c new file mode 100644 index 0000000..7015b87 --- /dev/null +++ b/tools/efsl-0.3.6/src/fs/vfat/mkfs.c @@ -0,0 +1,170 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : mkfs.c * +* Release : 0.3 - devel * +* Description : These functions are used for creating an empty filesystem. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "mkfs.h" +/*****************************************************************************/ + +/* This functions begs for a re-write, I'm disabling it */ + +#if 0 +esint16 mkfs_makevfat(Partition *part) +{ + unsigned long c,cc,ret; + unsigned long ns,fs,ds,dc; + unsigned char buf[512]; + + ns=part->disc->partitions[part->activePartition].numSectors; + + if( ns < 66581 ){ + DBG((TXT("This is not possible due to insufficient sectors. Sorry\n"))); + return(MKFS_ERR_TOOLITTLESECTORS); + } + + ret=0; + + for(c=1<<6;c>=1;c>>=1){ + + /* First guess */ + ds = ns - 32; + fs = ((ds/c)+127)/128; + /* ds was guess too large, so fs is too large now too. */ + + for(cc=0;cc<2;cc++){ + + /* Round 2, error round */ + ds = ns - 32 - 2*fs; + fs = ((ds/c)+127)/128; + /* Since fs was too large, ds became too small. So the fs for this small ds is too small as well. */ + + /* Round 3, correction round */ + ds = ns - 32 - 2*fs; + fs = ((ds/c)+127)/128; + /* The fs was too small, so ds was too large. The calculated fs should be slightly too large. */ + + } + + /* Round 4, finalise */ + ds = ns - 32 - 2*fs; + + dc = ds / c; + if(ret<(fs*128-dc)/128)ret=(fs*128-dc)/128; + + /* Check if with current setting we have a valid fat ? */ + + if(dc >= 65525 + 16){ + break; + } + } + + /* Generate BPB */ + memClr(buf,512); + + /* Boot code */ + *(buf+0)=0xE9; *(buf+1)=0x00; *(buf+2)=0x00; /* RESET */ + + /* OEM name */ + memCpy("DSCOSMSH",buf+3,8); + + /* Bytes/Sector */ + /* *((unsigned short*)(buf+11)) = 512; */ + ex_setb16(buf+11,512); + + /* Sectors/Cluster */ + *(buf+13) = c; + + /* Reserved Sectors */ + /* *((unsigned short*)(buf+14)) = 32; */ + ex_setb16(buf+14,32); + + /* Number of FAT Tables */ + *(buf+16) = 2; + + /* RootEntryCount */ + /* *((unsigned short*)(buf+17)) = 0; */ + ex_setb16(buf+17,0); + + /* Total Sector Count __16 */ + /* *((unsigned short*)(buf+19)) = 0; */ + ex_setb16(buf+19,0); + + /* Media (crap) */ + *(buf+21) = 0xF8; + + /* FAT size 16 */ + /* *((unsigned short*)(buf+22)) = 0; */ + ex_setb16(buf+22,0); + + /* Total Sector Count __32 */ + /* *((unsigned long*)(buf+32)) = ns; */ + ex_setb32(buf+32,ns); + + /* Fat Size 32 */ + /* *((unsigned long*)(buf+36)) = fs; */ + ex_setb32(buf+36,fs); + + /* First Cluster Root Dir */ + /* *((unsigned long*)(buf+44)) = 2; */ + ex_setb32(buf+44,2); + + /* VolumeID */ + /* *((unsigned long*)(buf+67)) = 0x13371337; */ + ex_setb32(buf+67,0); + + /* Volume Label */ + memCpy("EFSL-0.3.5 ",buf+71,11); + + /* Filesystemtype */ + memCpy("FAT32 ",buf+82,8); + + /* Magic */ + *(buf+510) = 0x55; *(buf+511) = 0xAA; + + part_writeBuf(part,0,buf); + + memClr(buf,512); + for(c=32;c<(32+2*fs);c++){ + part_writeBuf(part,c,buf); + } + /* *(((unsigned long*)buf) )=0x0FFFFFF8; + *(((unsigned long*)buf)+1)=0x0FFFFFFF; + *(((unsigned long*)buf)+2)=0x0FFFFFF8; */ + ex_setb32(buf+0,(euint32)0x0FFFFFF8); + ex_setb32(buf+4,(euint32)0x0FFFFFFF); + ex_setb32(buf+8,(euint32)0x0FFFFFF8); + part_writeBuf(part,32,buf); + part_writeBuf(part,32+fs,buf); + + return(0); +} +#endif \ No newline at end of file diff --git a/tools/efsl-0.3.6/src/fs/vfat/mkfs.c~ b/tools/efsl-0.3.6/src/fs/vfat/mkfs.c~ new file mode 100644 index 0000000..b57a77a --- /dev/null +++ b/tools/efsl-0.3.6/src/fs/vfat/mkfs.c~ @@ -0,0 +1,170 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : mkfs.c * +* Release : 0.3 - devel * +* Description : These functions are used for creating an empty filesystem. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "mkfs.h" +/*****************************************************************************/ + +/* This functions begs for a re-write, I'm disabling it */ + +#if 0 +esint16 mkfs_makevfat(Partition *part) +{ + unsigned long c,cc,ret; + unsigned long ns,fs,ds,dc; + unsigned char buf[512]; + + ns=part->disc->partitions[part->activePartition].numSectors; + + if( ns < 66581 ){ + DBG((TXT("This is not possible due to insufficient sectors. Sorry\n"))); + return(MKFS_ERR_TOOLITTLESECTORS); + } + + ret=0; + + for(c=1<<6;c>=1;c>>=1){ + + /* First guess */ + ds = ns - 32; + fs = ((ds/c)+127)/128; + /* ds was guess too large, so fs is too large now too. */ + + for(cc=0;cc<2;cc++){ + + /* Round 2, error round */ + ds = ns - 32 - 2*fs; + fs = ((ds/c)+127)/128; + /* Since fs was too large, ds became too small. So the fs for this small ds is too small as well. */ + + /* Round 3, correction round */ + ds = ns - 32 - 2*fs; + fs = ((ds/c)+127)/128; + /* The fs was too small, so ds was too large. The calculated fs should be slightly too large. */ + + } + + /* Round 4, finalise */ + ds = ns - 32 - 2*fs; + + dc = ds / c; + if(ret<(fs*128-dc)/128)ret=(fs*128-dc)/128; + + /* Check if with current setting we have a valid fat ? */ + + if(dc >= 65525 + 16){ + break; + } + } + + /* Generate BPB */ + memClr(buf,512); + + /* Boot code */ + *(buf+0)=0xE9; *(buf+1)=0x00; *(buf+2)=0x00; /* RESET */ + + /* OEM name */ + memCpy("DSCOSMSH",buf+3,8); + + /* Bytes/Sector */ + /* *((unsigned short*)(buf+11)) = 512; */ + ex_setb16(buf+11,512); + + /* Sectors/Cluster */ + *(buf+13) = c; + + /* Reserved Sectors */ + /* *((unsigned short*)(buf+14)) = 32; */ + ex_setb16(buf+14,32); + + /* Number of FAT Tables */ + *(buf+16) = 2; + + /* RootEntryCount */ + /* *((unsigned short*)(buf+17)) = 0; */ + ex_setb16(buf+17,0); + + /* Total Sector Count __16 */ + /* *((unsigned short*)(buf+19)) = 0; */ + ex_setb16(buf+19,0); + + /* Media (crap) */ + *(buf+21) = 0xF8; + + /* FAT size 16 */ + /* *((unsigned short*)(buf+22)) = 0; */ + ex_setb16(buf+22,0); + + /* Total Sector Count __32 */ + /* *((unsigned long*)(buf+32)) = ns; */ + ex_setb32(buf+32,ns); + + /* Fat Size 32 */ + /* *((unsigned long*)(buf+36)) = fs; */ + ex_setb32(buf+36,fs); + + /* First Cluster Root Dir */ + /* *((unsigned long*)(buf+44)) = 2; */ + ex_setb32(buf+44,2); + + /* VolumeID */ + /* *((unsigned long*)(buf+67)) = 0x13371337; */ + ex_setb32(buf+67,0); + + /* Volume Label */ + memCpy("EFSL-0.3.3 ",buf+71,11); + + /* Filesystemtype */ + memCpy("FAT32 ",buf+82,8); + + /* Magic */ + *(buf+510) = 0x55; *(buf+511) = 0xAA; + + part_writeBuf(part,0,buf); + + memClr(buf,512); + for(c=32;c<(32+2*fs);c++){ + part_writeBuf(part,c,buf); + } + /* *(((unsigned long*)buf) )=0x0FFFFFF8; + *(((unsigned long*)buf)+1)=0x0FFFFFFF; + *(((unsigned long*)buf)+2)=0x0FFFFFF8; */ + ex_setb32(buf+0,(euint32)0x0FFFFFF8); + ex_setb32(buf+4,(euint32)0x0FFFFFFF); + ex_setb32(buf+8,(euint32)0x0FFFFFF8); + part_writeBuf(part,32,buf); + part_writeBuf(part,32+fs,buf); + + return(0); +} +#endif \ No newline at end of file diff --git a/tools/efsl-0.3.6/src/fs/vfat/time.c b/tools/efsl-0.3.6/src/fs/vfat/time.c new file mode 100644 index 0000000..3be6793 --- /dev/null +++ b/tools/efsl-0.3.6/src/fs/vfat/time.c @@ -0,0 +1,89 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : time.c * +* Release : 0.3 - devel * +* Description : This file contains functions for time support * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "time.h" +/*****************************************************************************/ + +euint16 fs_makeDate(void) +{ +#ifndef DATE_TIME_SUPPORT + return(0); +#else + euint8 m,d; + euint16 y; + + y = time_getYear()-1980; + m = time_getMonth(); + d = time_getDay(); + + return( + (y>127?127<<9:(y&0x3F)<<9) | + ((m==0||m>12)?1:(m&0xF)<<5) | + ((d==0||d>31)?1:(d&0x1F)) + ); +#endif +} +/*****************************************************************************/ + +euint16 fs_makeTime(void) +{ +#ifndef DATE_TIME_SUPPORT + return(0); +#else + euint8 s,m,h; + + s = time_getSecond(); + m = time_getMinute(); + h = time_getHour(); + + return( + (h>23?0:(h&0x1F)<<11) | + (m>59?0:(m&0x3F)<<5) | + (s>59?0:(s-s%2)/2) + ); +#endif +} +/*****************************************************************************/ + +euint8 fs_hasTimeSupport(void) +{ +#ifdef DATE_TIME_SUPPORT + return(1); +#else + return(0); +#endif +} +/*****************************************************************************/ + + diff --git a/tools/efsl-0.3.6/src/fs/vfat/ui.c b/tools/efsl-0.3.6/src/fs/vfat/ui.c new file mode 100644 index 0000000..52d92a2 --- /dev/null +++ b/tools/efsl-0.3.6/src/fs/vfat/ui.c @@ -0,0 +1,226 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : ui.c * +* Release : 0.3 - devel * +* Description : This file contains functions which will be presented to the * +* user of this library. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "ui.h" +/*****************************************************************************/ + +/***************************************************************************** + * short listfiles(char *dir) + * + * Deschription: This function returns the number of files / directories + * inside the given directory. + * + * Return value: number of files/directories in the given directory or -1 + * if directory does not exist. +\*****************************************************************************/ + +short listFiles(FileSystem *fs, char *dirname) +{ + unsigned long startCluster; + unsigned char fileEntryCount; + unsigned short counter=0; + unsigned long offset=0; + FileRecord fileEntry; + FileLocation loc; + unsigned char buf[512]; + File dir; + unsigned short i; + + /* Find out if we are searching in the root dir or in */ + if(dirname[0]=='/' && dirname[1]=='\0') + { + if( (fs->type == FAT12) || (fs->type == FAT16) ) + { + for(i=0;i<=(fs->volumeId.RootEntryCount/16);i++) + { + loc.Sector=fs->FirstSectorRootDir + i; + part_readBuf(fs->part,loc.Sector,buf); + /* I STOPPED HERE*/ + /* FIXME */ + } + } + } + else /* Normal directory */ + { + /* Check if path given is a directory */ + if(fs_findFile(fs,dirname,&loc,0)!=2) + { + FUNC_OUT((TXT(""))); + return(-1); + } + + /* Find out what the startcluster of the directory is */ + part_readBuf(fs->part,loc.Sector, buf); + fileEntry = *(((FileRecord*)buf) + loc.Offset); + startCluster = (((unsigned long)fileEntry.FirstClusterHigh)<<16) + + fileEntry.FirstClusterLow; + + /* Init of dir */ + dir.fs=fs; + dir.Cache.LogicCluster=-1; + dir.Cache.FirstCluster=startCluster; + dir.DirEntry.Attribute=ATTR_DIRECTORY; + + while((file_fread(&dir,offset,512,buf))) + { + DBG((TXT("Read 512 bytes from dir with offset %li.\n"),offset)); + for(fileEntryCount=0;fileEntryCount<16;fileEntryCount++) + { + fileEntry = *(((FileRecord*)buf) + fileEntryCount); + if( !( (fileEntry.Attribute & 0x0F) == 0x0F ) ) + { + if + ( + (fileEntry.FileName[0]>='A' && fileEntry.FileName[0]<='Z') + || + (fileEntry.FileName[0]>='0' && fileEntry.FileName[0]<='9') + ) + { + DBG((TXT("Filename: %s\n"),fileEntry.FileName)); + counter++; + } + } + } + offset+=512; + } + } + + FUNC_OUT((TXT(""))); + return(counter); + + return(-1); +} +/*****************************************************************************/ + +/* **************************************************************************** + * esint16 rmfile(FileSystem *fs,euint8* filename) + * Description: This function takes a filename as argument and deletes it, + * by freeing it's clusterchain, and deleting it's entry from the directory. + * Return value: 0 on success, -1 on errors, like file not found. +*/ +esint16 rmfile(FileSystem *fs,euint8* filename) +{ + FileLocation loc; + ClusterChain cache; + euint8* buf; + euint32 firstCluster=0; + + if((fs_findFile(fs,(eint8*)filename,&loc,0))==1){ + buf=part_getSect(fs->part,loc.Sector,IOM_MODE_READWRITE); + firstCluster = ex_getb16(buf+loc.Offset*32+20); + firstCluster <<= 16; + firstCluster += ex_getb16(buf+loc.Offset*32+26); + memClr(buf+(loc.Offset*32),32); + part_relSect(fs->part,buf); + cache.DiscCluster = cache.LastCluster = cache.Linear = cache.LogicCluster = 0; + cache.FirstCluster = firstCluster; + fat_unlinkClusterChain(fs,&cache); + return(0); + } + return(-1); +} + +/*****************************************************************************/ +esint8 mkdir(FileSystem *fs,eint8* dirname) +{ + FileLocation loc; + FileRecord direntry; + euint32 nc,parentdir; + euint8* buf; + eint8 ffname[11]; + + if( fs_findFile(fs,dirname,&loc,&parentdir) ){ + return(-1); + } + if(parentdir==0)return(-2); + + if(!fs_findFreeFile(fs,dirname,&loc,0))return(-3); + + /* You may never search for a free cluster, and the call + * functions that may cause changes to the FAT table, that + * is why getNextFreeCluster has to be called AFTER calling + * fs_findFreeFile, which may have to expand a directory in + * order to store the new filerecord !! + */ + + nc = fs_getNextFreeCluster(fs,fs_giveFreeClusterHint(fs)); + if(nc==0)return(0); + + fs_clearCluster(fs,nc); + + buf = part_getSect(fs->part,loc.Sector,IOM_MODE_READWRITE); + + dir_getFatFileName(dirname,ffname); + memClr(&direntry,sizeof(direntry)); + memCpy(ffname,&direntry,11); + direntry.FileSize = 0; + direntry.FirstClusterHigh=nc>>16; + direntry.FirstClusterLow=nc&0xFFFF; + direntry.Attribute = ATTR_DIRECTORY; + memCpy(&direntry,buf+(32*loc.Offset),32); + + part_relSect(fs->part,buf); + + buf = part_getSect(fs->part,fs_clusterToSector(fs,nc),IOM_MODE_READWRITE); + + memClr(&direntry,sizeof(direntry)); + memCpy(". ",&direntry,11); + direntry.Attribute = ATTR_DIRECTORY; + direntry.FileSize = 0; + direntry.FirstClusterHigh=nc>>16; + direntry.FirstClusterLow=nc&0xFFFF; + memCpy(&direntry,buf,32); + + if(fs->type == FAT32 && parentdir == fs->volumeId.RootCluster){ + parentdir = 0; + } + if(fs->type != FAT32 && parentdir<=1){ + parentdir = 0; + } + + memClr(&direntry,sizeof(direntry)); + memCpy(".. ",&direntry,11); + direntry.Attribute = ATTR_DIRECTORY; + direntry.FileSize = 0; + direntry.FirstClusterHigh=parentdir>>16; + direntry.FirstClusterLow=parentdir&0xFFFF; + memCpy(&direntry,buf+32,32); + + part_relSect(fs->part,buf); + + fat_setNextClusterAddress(fs,nc,fat_giveEocMarker(fs)); + + return(0); +} diff --git a/tools/efsl-0.3.6/src/hwdrivers/atmega_spi/Makefile b/tools/efsl-0.3.6/src/hwdrivers/atmega_spi/Makefile new file mode 100644 index 0000000..cec2087 --- /dev/null +++ b/tools/efsl-0.3.6/src/hwdrivers/atmega_spi/Makefile @@ -0,0 +1,15 @@ +CONFDIR=../../../conf +include $(CONFDIR)/config.makefile +BASEDIR=../../base/include +INCLUDEDIRS=-I../../include -Iinclude -I$(BASEDIR) -I$(CONFDIR) +CFLAGS=$(GCFLAGS) $(INCLUDEDIRS) + +OBJ=atmega_spi.o + +all: efsl-hwd-atmega_spi + +efsl-hwd-atmega_spi: $(OBJ) + $(AR) rcs efsl-hwd-atmega_spi.a $(OBJ) + +clean: + rm -f $(OBJ) efsl-hwd-atmega_spi.a diff --git a/tools/efsl-0.3.6/src/hwdrivers/atmega_spi/atmega_spi.c b/tools/efsl-0.3.6/src/hwdrivers/atmega_spi/atmega_spi.c new file mode 100644 index 0000000..b5750ef --- /dev/null +++ b/tools/efsl-0.3.6/src/hwdrivers/atmega_spi/atmega_spi.c @@ -0,0 +1,79 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : atmega_spi.c * +* Release : 0.3 - devel * +* Description : This file contains the functions needed to use efs for * +* accessing files on an SD-card connected to an ATMega's. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "include/atmega_spi.h" +/*****************************************************************************/ + +euint8 atmega_spi_init(atmegaSpiInterface *iface) +{ + euint8 i; + + /* Unselect card */ + PORTB |= iface->pinSelect; + + /* Set as master, clock and chip select output */ + DDR_SPI = (1<pinSelect); + + return(0); +} +/*****************************************************************************/ + +euint8 atmega_spi_send(atmegaSpiInterface *iface, euint8 data) +{ + euint8 incoming=0; + + PORTB &= ~(iface->pinSelect); + + SPDR = data; + while(!(SPSR & (1<pinSelect; + + return(incoming); +} +/*****************************************************************************/ + diff --git a/tools/efsl-0.3.6/src/hwdrivers/atmega_spi/include/atmega_spi.h b/tools/efsl-0.3.6/src/hwdrivers/atmega_spi/include/atmega_spi.h new file mode 100644 index 0000000..8c86a23 --- /dev/null +++ b/tools/efsl-0.3.6/src/hwdrivers/atmega_spi/include/atmega_spi.h @@ -0,0 +1,69 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : atmega_spi.h * +* Release : 0.3 - devel * +* Description : This file contains the functions needed to use efs for * +* accessing files on an SD-card connected to an ATMega's. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __ATMEGA_SPI_H__ +#define __ATMEGA_SPI_H__ + +#define __AVR_ATmega128__ 1 +#define FALSE 0X00 +#define TRUE 0x01 + +#define DDR_SPI DDRB +#define DD_MOSI DDB2 +#define DD_SCK DDB1 + +#include +#include +#include "debug.h" +#include "config.h" + + +/*************************************************************\ + hwInterface + ---------- +* long sectorCount Number of sectors on the file. +* +* Remark: Configuration of the spi-port should become part of +* this configuration. +\*************************************************************/ +struct _atmegaSpiInterface{ + /*euint8 portSelect;*/ /* TODO */ + euint8 pinSelect; +}; +typedef struct _atmegaSpiInterface atmegaSpiInterface; + +euint8 atmega_spi_init(atmegaSpiInterface *iface); +euint8 atmega_spi_send(atmegaSpiInterface *iface, euint8 data); + +#endif diff --git a/tools/efsl-0.3.6/src/hwdrivers/linuxfile/Makefile b/tools/efsl-0.3.6/src/hwdrivers/linuxfile/Makefile new file mode 100644 index 0000000..0eb166e --- /dev/null +++ b/tools/efsl-0.3.6/src/hwdrivers/linuxfile/Makefile @@ -0,0 +1,15 @@ +CONFDIR=../../../conf +include $(CONFDIR)/config.makefile +BASEDIR=../../base/include +INCLUDEDIRS=-I../../include -Iinclude -I$(BASEDIR) -I$(CONFDIR) +CFLAGS=$(GCFLAGS) $(INCLUDEDIRS) + +OBJ=helper.o linuxfile.o + +all: efsl-hwd-linuxfile + +efsl-hwd-linuxfile: $(OBJ) + $(AR) rcs efsl-hwd-linuxfile.a $(OBJ) + +clean: + rm -f $(OBJ) efsl-hwd-linuxfile.a \ No newline at end of file diff --git a/tools/efsl-0.3.6/src/hwdrivers/linuxfile/helper.c b/tools/efsl-0.3.6/src/hwdrivers/linuxfile/helper.c new file mode 100644 index 0000000..330ecf0 --- /dev/null +++ b/tools/efsl-0.3.6/src/hwdrivers/linuxfile/helper.c @@ -0,0 +1,95 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : helper.c * +* Release : 0.3 - devel * +* Description : These functions may NOT BE USED ANYWHERE ! They are helper * +* functions for the Linux based developement. They use the GNU * +* C library and headers. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#include "helper.h" + +void* Malloc(eint32 size) +{ + void*x; + + if((x=malloc(size))==NULL){ + perror("Malloc: "); + exit(-1); + } + return(x); +} + +void Fopen(FILE **f,eint8* filename) +{ + *f=fopen(filename,"r+"); + if(*f==NULL){ + perror("Fopen: "); + exit(-1); + } +} + +void MMap(eint8* filename,void**x,eint32 *size) +{ + FILE *tmp; + eint32 filesize,c; + + Fopen(&tmp,filename); + filesize=getFileSize(tmp); + *x=Malloc(filesize); + for(c=0;c=32?buf[c*16+cc]:'*'); + } + } + printf("\n"); +} diff --git a/tools/efsl-0.3.6/src/hwdrivers/linuxfile/include/helper.h b/tools/efsl-0.3.6/src/hwdrivers/linuxfile/include/helper.h new file mode 100644 index 0000000..082b4c2 --- /dev/null +++ b/tools/efsl-0.3.6/src/hwdrivers/linuxfile/include/helper.h @@ -0,0 +1,52 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : helper.c * +* Release : 0.3 - devel * +* Description : These functions may NOT BE USED ANYWHERE ! They are helper * +* functions for the Linux based developement. They use the GNU * +* C library and headers. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __HELPER_H__ +#define __HELPER_H__ + +/*****************************************************************************/ +#include +#include +#include "debug.h" +#include "types.h" +#include "config.h" +/*****************************************************************************/ + +void* Malloc(eint32 size); +void Fopen(FILE **f,eint8* filename); +void MMap(eint8* filename,void**x,eint32* size); +int getFileSize(FILE* file); + +#endif diff --git a/tools/efsl-0.3.6/src/hwdrivers/linuxfile/include/linuxfile.h b/tools/efsl-0.3.6/src/hwdrivers/linuxfile/include/linuxfile.h new file mode 100644 index 0000000..7412594 --- /dev/null +++ b/tools/efsl-0.3.6/src/hwdrivers/linuxfile/include/linuxfile.h @@ -0,0 +1,73 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : linuxfile.h * +* Release : 0.3 - devel * +* Description : This file contains the functions needed to use efs for * +* accessing files under linux. This interface is meant * +* to be used for debugging purposes. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __LINUXFILE_H__ +#define __LINUXFILE_H__ + +/*****************************************************************************/ +#include +#include +#include "helper.h" +#include "debug.h" +#include "types.h" +#include "ioctl.h" +#include "config.h" +/*****************************************************************************/ + +#define _LARGEFILE_SOURCE +#define _GNU_SOURCE +#define _FILE_OFFSET_BITS 64 + +/*************************************************************\ + hwInterface + ---------- +* FILE* imagefile File emulation of hw interface. +* long sectorCount Number of sectors on the file. +\*************************************************************/ +struct _linuxFileInterface{ + FILE *imageFile; + euint8* fileName; + eint32 sectorCount; +}; +typedef struct _linuxFileInterface linuxFileInterface; + +esint8 lf_init(void* LFI); +esint8 lf_readBuf(void* LFI,euint32 address,euint8* buf); +esint8 lf_writeBuf(void* LFI,euint32 address,euint8* buf); +esint8 lf_ioctl(void* LFI,euint16 ctl,void* data); + +esint8 lf_setPos(void* LFI,euint32 address); + +#endif diff --git a/tools/efsl-0.3.6/src/hwdrivers/linuxfile/linuxfile.c b/tools/efsl-0.3.6/src/hwdrivers/linuxfile/linuxfile.c new file mode 100644 index 0000000..88d3178 --- /dev/null +++ b/tools/efsl-0.3.6/src/hwdrivers/linuxfile/linuxfile.c @@ -0,0 +1,126 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : linuxfile.c * +* Release : 0.3 - devel * +* Description : This file contains the functions needed to use efs for * +* accessing files under linux. This interface is meant * +* to be used for debugging purposes. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "linuxfile.h" +/*****************************************************************************/ + +/* **************************************************************************** + * short if_initInterface(hwInterface* file, char* fileName) + * Description: This function should bring the hardware described in file in a + * ready state to receive and retrieve data. + * Return value: Return 0 on succes and -1 on failure. +*/ +esint8 lf_init(void* LFI) +{ + eint32 sc; + + Fopen(&(((linuxFileInterface*)LFI)->imageFile),(eint8*)((linuxFileInterface*)LFI)->fileName); + sc=getFileSize(((linuxFileInterface*)LFI)->imageFile); + ((linuxFileInterface*)LFI)->sectorCount=sc/512; + return(0); +} +/*****************************************************************************/ + +/* **************************************************************************** + * short if_readBuf(hwInterface* file,unsigned long address,unsigned char* buf) + * Description: This function should fill the characterpointer buf with 512 + * bytes, offset by address*512 bytes. Adress is thus a LBA address. + * Return value: Return 0 on success and -1 on failure. +*/ +esint8 lf_readBuf(void* LFI,euint32 address,euint8* buf) +{ + /*printf("READ %li\n",address);*/ + if(lf_setPos(LFI,address))return(-1); + if( fread((void*)buf,512,1,((linuxFileInterface*)LFI)->imageFile) != 1) return(-1); + return(0); +} +/*****************************************************************************/ + +/* **************************************************************************** + * short if_writeBuf(hwInterface* file,unsigned long address,unsigned char* buf) + * Description: This function writes 512 bytes from uchar* buf to the hardware + * disc described in file. The write offset should be address sectors of 512 bytes. + * Return value: Return 0 on success and -1 on failure. +*/ +esint8 lf_writeBuf(void* LFI,euint32 address,euint8* buf) +{ + /*printf("WRITE %li\n",address);*/ + if(lf_setPos(LFI,address))return(-1); + if((fwrite((void*)buf,512,1,((linuxFileInterface*)LFI)->imageFile))!=1){ + perror("cf_writeBuf:"); + exit(-1); + } + fflush(((linuxFileInterface*)LFI)->imageFile); + return(0); +} +/*****************************************************************************/ + +esint8 lf_ioctl(void* LFI,euint16 ctl,void* data) +{ + switch(ctl){ + case IOCTL_NOP: + return(0); + break; + case IOCTL_SECTORCOUNT: + *((euint32*)data)=getFileSize(((linuxFileInterface*)LFI)->imageFile)/512; + return(0); + break; + default: + return(-1); + break; + } +} + +/* **************************************************************************** + * short if_setPos(hwInterface* file,unsigned long address) + * Description: This function may or may not be required. It would set the write + * or read buffer offset by 512*address bytes from the beginning of the disc. + * Return value: Return 0 on success and -1 on failure. +*/ +esint8 lf_setPos(void* LFI,euint32 address) +{ + if(address>(((linuxFileInterface*)LFI)->sectorCount-1)){ + DBG((TXT("Illegal address\n"))); + exit(-1); + } + if((fseek(((linuxFileInterface*)LFI)->imageFile,512*address,SEEK_SET))!=0){ + perror("cf_setPos:"); + exit(-1); + } + return(0); +} +/*****************************************************************************/ + diff --git a/tools/efsl-0.3.6/src/hwdrivers/tms67xx_sd/dsp67xx.c b/tools/efsl-0.3.6/src/hwdrivers/tms67xx_sd/dsp67xx.c new file mode 100644 index 0000000..7d60f25 --- /dev/null +++ b/tools/efsl-0.3.6/src/hwdrivers/tms67xx_sd/dsp67xx.c @@ -0,0 +1,93 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : dsp67xx.c * +* Release : 0.3 - devel * +* Description : This file contains the functions needed to use efs for * +* accessing files on an SD-card connected to a TI 67 * +* series DSP. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "interfaces/dsp67xx.h" +#include "interfaces/sd.h" +#include +/*****************************************************************************/ + +short if_initInterface(hwInterface* file, char* opts) +{ + file->sectorCount=0; + return(if_spiInit(file)); +} +/*****************************************************************************/ + +short if_writeBuf(hwInterface* file,unsigned long address,unsigned char* buf) +{ + return(0); +} +/*****************************************************************************/ + +short if_setPos(hwInterface* file,unsigned long address) +{ + return(0); +} +/*****************************************************************************/ + +signed char if_spiInit(hwInterface *iface) +{ + return(sd_Init(iface)); +} +/*****************************************************************************/ + +unsigned char if_spiSend(hwInterface *iface, euint8 outgoing) +{ + unsigned char r; + +/* while((*(unsigned volatile long*)McBSP0_SPCR & 0x20000)==0); + *(unsigned volatile char*)McBSP0_DXR=outgoing; + while(((*(unsigned volatile long*)McBSP0_SPCR & 0x2)==0)); + r=*(unsigned volatile char*)McBSP0_DRR; */ + + while(!MCBSP_xrdy(iface->port->hBsp)); + MCBSP_write(iface->port->hBsp,outgoing); + while(!MCBSP_rrdy(iface->port->hBsp)); + r=MCBSP_read(iface->port->hBsp); + + return(r); +} +/*****************************************************************************/ + +short if_readBuf(hwInterface* file,euint32 address,unsigned char* buf) +{ + short r; + r=sd_readSector(file,address,buf,512); + if(r!=0)printf("ERROR READING SECTOR %i\n",address); + return(r); +} +/*****************************************************************************/ + diff --git a/tools/efsl-0.3.6/src/hwdrivers/tms67xx_sd/include/dsp67xx.h b/tools/efsl-0.3.6/src/hwdrivers/tms67xx_sd/include/dsp67xx.h new file mode 100644 index 0000000..f01d34f --- /dev/null +++ b/tools/efsl-0.3.6/src/hwdrivers/tms67xx_sd/include/dsp67xx.h @@ -0,0 +1,63 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : dsp67xx.h * +* Release : 0.3 - devel * +* Description : This file contains the functions needed to use efs for * +* accessing files on an SD-card connected to a TI 67 * +* series DSP. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __DSP67XX_H_ +#define __DSP67XX_H_ + +#include "config.h" +#include "mcbsp/mcbsp.h" + +/*************************************************************\ + hwInterface + ---------- +* FILE* imagefile File emulation of hw interface. +* long sectorCount Number of sectors on the file. +\*************************************************************/ +struct _hwInterface{ + /*FILE *imageFile;*/ + long sectorCount; + BspPort *port; +}; +typedef struct _hwInterface hwInterface; + +short if_initInterface(hwInterface* file,char* opts); +short if_readBuf(hwInterface* file,euint32 address,unsigned char* buf); +short if_writeBuf(hwInterface* file,unsigned long address,unsigned char* buf); +short if_setPos(hwInterface* file,unsigned long address); + +signed char if_spiInit(hwInterface *iface); +unsigned char if_spiSend(hwInterface *iface,euint8 outgoing); + +#endif diff --git a/tools/efsl-0.3.6/src/include/error.h b/tools/efsl-0.3.6/src/include/error.h new file mode 100644 index 0000000..a860ea8 --- /dev/null +++ b/tools/efsl-0.3.6/src/include/error.h @@ -0,0 +1,125 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : error.h * +* Release : 0.3 - devel * +* Description : Header file containing error-defines. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __ERROR_H_ +#define __ERROR_H_ + +/*****************************************************************************/ +#include "config.h" +#include "interface.h" +/*****************************************************************************/ + +#if defined (FULL_ERROR_SUPPORT) + #define ERRSUP_IOMAN + #define ERRSUP_DISC + #define ERRSUP_PARTITION + #define ERRSUP_FAT_FILESYSTEM + #define ERRSUP_FAT_FILESYSTEM +#elif defined (BASE_ERROR_SUPPORT) + #define ERRSUP_IOMAN + #define ERRSUP_DISC + #define ERRSUP_PARTITION +#endif + +#if defined (HWINT_HAS_ERROR_SUPPORT) && defined (INTERFACE_ERROR_SUPPORT) + #define ERRSUP_HWINTERFACE +#endif + +#ifdef ERRSUP_IOMAN + #define IOMAN_ERR_EUINT8 euint8 error; + #define ioman_setError(ioman,errval) ioman->error = errval + #define ioman_getError(ioman) ioman->error +#else + #define IOMAN_ERR_EUINT8 + #define ioman_setError(ioman,errval) + #define ioman_getError(ioman) 0 +#endif + +#ifdef ERRSUP_DISC + #define DISC_ERR_EUINT8 euint8 error; + #define disc_setError(disc,errval) disc->error = errval + #define disc_getError(disc) disc->error +#else + #define DISC_ERR_EUINT8 + #define disc_setError(disc,errval) + #define disc_getError(disc) 0 +#endif + +#ifdef ERRSUP_PART + #define PART_ERR_EUINT8 euint8 error; + #define part_setError(part,errval) part->error = errval + #define part_getError(part) part->error +#else + #define PART_ERR_EUINT8 + #define part_setError(part,errval) + #define part_getError(part) 0 +#endif + +#ifdef ERRSUP_FAT_FILESYSTEM + #define FILESYSTEM_ERR_EUINT8 euint8 error; + #define fs_setError(fs,errval) fs->error = errval + #define fs_getError(fs) fs->error +#else + #define FILESYSTEM_ERR_EUINT8 + #define fs_setError(fs,errval) + #define fs_getError(fs) 0 +#endif + +#ifdef ERRSUP_FILE + #define FILE_ERR_EUINT8 euint8 error; + #define file_setError(file,errval) file->error = errval + #define file_getError(file) file->error +#else + #define FILE_ERR_EUINT8 + #define file_setError(file,errval) + #define file_getError(file) 0 +#endif + +#define IOMAN_NOERROR 0 +#define IOMAN_ERR_SETATTROUTOFBOUNDS 1 +#define IOMAN_ERR_GETATTROUTOFBOUNDS 2 +#define IOMAN_ERR_READFAIL 3 +#define IOMAN_ERR_WRITEFAIL 4 +#define IOMAN_ERR_OPOUTOFBOUNDS 5 +#define IOMAN_ERR_PUSHBEYONDSTACK 6 +#define IOMAN_ERR_POPEMPTYSTACK 7 +#define IOMAN_ERR_CACHEPTROUTOFRANGE 8 +#define IOMAN_ERR_WRITEREADONLYSECTOR 9 +#define IOMAN_ERR_NOMEMORY 10 + +#define DISC_NOERROR 0 + +#define PART_NOERROR 0 + + +#endif diff --git a/tools/efsl-0.3.6/src/include/ioctl.h b/tools/efsl-0.3.6/src/include/ioctl.h new file mode 100644 index 0000000..93a0b94 --- /dev/null +++ b/tools/efsl-0.3.6/src/include/ioctl.h @@ -0,0 +1,44 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : ioctl.h * +* Release : 0.3 - devel * +* Description : This file contains the ioctl command numbers * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __EFS_IOCTL_H__ +#define __EFS_IOCTL_H__ + +/*****************************************************************************/ +#include "config.h" +/*****************************************************************************/ + +#define IOCTL_NOP 0 +#define IOCTL_SECTORCOUNT 1 + +#endif diff --git a/tools/efsl-0.3.6/src/include/types.h b/tools/efsl-0.3.6/src/include/types.h new file mode 100644 index 0000000..6e05e62 --- /dev/null +++ b/tools/efsl-0.3.6/src/include/types.h @@ -0,0 +1,110 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : types.h * +* Release : 0.3 - devel * +* Description : This file contains the crossplatform data types * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __EFS_TYPES_H__ +#define __EFS_TYPES_H__ + +/*****************************************************************************/ +#include "config.h" +/*****************************************************************************/ + +/* VARIABLE SIZES + ============== + + * eint8 -> 1 byte + * eint16 -> 2 bytes + * eint32 -> 4 bytes + * + * VARSIZE_LINUX32 is suitable for 32bit Linux + * VARSIZE_LINUX64 is suitable for 64bit Linux + * VARSIZE_ATMEGA is suitable for AVR's + * VARSIZE_TMS67XX is suitable for the TI TMS67XX + * + * If nothing is selected a default is used, that should work on + * 32 bit systems + */ + +#if defined(VARSIZE_LINUX32) + typedef char eint8; + typedef signed char esint8; + typedef unsigned char euint8; + typedef short eint16; + typedef signed short esint16; + typedef unsigned short euint16; + typedef long eint32; + typedef signed long esint32; + typedef unsigned long euint32; +#elif defined(VARSIZE_LINUX64) + typedef char eint8; + typedef signed char esint8; + typedef unsigned char euint8; + typedef short eint16; + typedef signed short esint16; + typedef unsigned short euint16; + typedef int eint32; + typedef signed int esint32; + typedef unsigned int euint32; +#elif defined (VARSIZE_ATMEGA) + typedef char eint8; + typedef signed char esint8; + typedef unsigned char euint8; + typedef short eint16; + typedef signed short esint16; + typedef unsigned short euint16; + typedef long eint32; + typedef signed long esint32; + typedef unsigned long euint32; +#elif defined(VARSIZE_TMS67XX) + typedef char eint8; + typedef signed char esint8; + typedef unsigned char euint8; + typedef short eint16; + typedef signed short esint16; + typedef unsigned short euint16; + typedef int eint32; + typedef signed int esint32; + typedef unsigned int euint32; +#else +#warning "No VARSIZE selection has been made, beware!" + typedef char eint8; + typedef signed char esint8; + typedef unsigned char euint8; + typedef short eint16; + typedef signed short esint16; + typedef unsigned short euint16; + typedef long eint32; + typedef signed long esint32; + typedef unsigned long euint32; +#endif + +#endif diff --git a/tools/efsl-0.3.6/src/protocols/sdcard_spi/Makefile b/tools/efsl-0.3.6/src/protocols/sdcard_spi/Makefile new file mode 100644 index 0000000..924e040 --- /dev/null +++ b/tools/efsl-0.3.6/src/protocols/sdcard_spi/Makefile @@ -0,0 +1,15 @@ +CONFDIR=../../../conf +include $(CONFDIR)/config.makefile +BASEDIR=../../base/include +INCLUDEDIRS=-I../../include -Iinclude -I$(BASEDIR) -I$(CONFDIR) +CFLAGS=$(GCFLAGS) $(INCLUDEDIRS) + +OBJ=sd.o + +all: efsl-prot-sdspi + +efsl-prot-sdspi: $(OBJ) + $(AR) rcs efsl-prot-sdspi.a $(OBJ) + +clean: + rm -f $(OBJ) efsl-prot-sdspi.a \ No newline at end of file diff --git a/tools/efsl-0.3.6/src/protocols/sdcard_spi/include/sd.h b/tools/efsl-0.3.6/src/protocols/sdcard_spi/include/sd.h new file mode 100644 index 0000000..2b8e848 --- /dev/null +++ b/tools/efsl-0.3.6/src/protocols/sdcard_spi/include/sd.h @@ -0,0 +1,68 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : sd.h * +* Release : 0.3 - devel * +* Description : This file contains the functions needed to use efs for * +* accessing files on an SD-card. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#ifndef __SD_H__ +#define __SD_H__ +/*****************************************************************************/ + +#include "config.h" +#include "types.h" +#include "debug.h" +/*****************************************************************************/ + +#define CMDREAD 17 +#define CMDWRITE 24 +/*****************************************************************************/ + +struct _SdSpiProtocol +{ + void *spiHwInterface; + euint8 (*spiHwInit)(void* spiHwInterface); + euint8 (*spiSendByte)(void* spiHwInterface,euint8 data); +}; +typedef struct _SdSpiProtocol SdSpiProtocol; + + +esint8 sd_Init(SdSpiProtocol *ssp); +void sd_Command(SdSpiProtocol *ssp,euint8 cmd, euint16 paramx, euint16 paramy); +euint8 sd_Resp8b(SdSpiProtocol *ssp); +void sd_Resp8bError(SdSpiProtocol *ssp,euint8 value); +euint16 sd_Resp16b(SdSpiProtocol *ssp); +esint8 sd_State(SdSpiProtocol *ssp); + +esint8 sd_readSector(SdSpiProtocol *ssp,euint32 address,euint8* buf); +esint8 sd_writeSector(SdSpiProtocol *ssp,euint32 address, euint8* buf); +esint8 sd_ioctl(SdSpiProtocol* ssp,euint16 ctl,void* data); + +#endif diff --git a/tools/efsl-0.3.6/src/protocols/sdcard_spi/sd.c b/tools/efsl-0.3.6/src/protocols/sdcard_spi/sd.c new file mode 100644 index 0000000..e39a40a --- /dev/null +++ b/tools/efsl-0.3.6/src/protocols/sdcard_spi/sd.c @@ -0,0 +1,316 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : sd.c * +* Release : 0.3 - devel * +* Description : This file contains the functions needed to use efs for * +* accessing files on an SD-card. * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +/*****************************************************************************/ +#include "sd.h" +/*****************************************************************************/ + +esint8 sd_Init(SdSpiProtocol *ssp) +{ + esint16 i; + euint8 resp; + + /* Init HW-Layer */ + ssp->spiHwInit(ssp->spiHwInterface); + + /* Try to send reset command up to 512 times */ + i=512; + do{ + sd_Command(ssp,0, 0, 0); + resp=sd_Resp8b(ssp); + } + while(resp!=1 && i--); + + /* If response was not one, find out what went wrong & quit */ + if(resp!=1){ + if(resp==0xff){ + return(-1); + } + else{ + sd_Resp8bError(ssp,resp); + return(-2); + } + } + + /* Wait till card is ready initialising (returns 0 on CMD1) */ + /* Try up to 32000 times. */ + i=32000; + do{ + sd_Command(ssp,1, 0, 0); + + resp=sd_Resp8b(ssp); + if(resp!=0) + sd_Resp8bError(ssp,resp); + } + while(resp==1 && i--); + + /* If the card is not ready by now, return an error */ + if(resp!=0){ + sd_Resp8bError(ssp,resp); + return(-3); + } + + /* Request state, should be 0 */ + if(sd_State(ssp)<0){ + DBG((TXT("Card didn't return the ready state, breaking up...\n"))); + return(-4); + } + + return(0); +} +/*****************************************************************************/ + +void sd_Command(SdSpiProtocol *ssp,euint8 cmd, euint16 paramx, euint16 paramy) +{ + ssp->spiSendByte(ssp->spiHwInterface,0xff); + + ssp->spiSendByte(ssp->spiHwInterface,0x40 | cmd); + ssp->spiSendByte(ssp->spiHwInterface,(euint8) (paramx >> 8));/* MSB of x */ + ssp->spiSendByte(ssp->spiHwInterface,(euint8) (paramx)); /* LSB of x */ + ssp->spiSendByte(ssp->spiHwInterface,(euint8) (paramy >> 8));/* MSB of y */ + ssp->spiSendByte(ssp->spiHwInterface,(euint8) (paramy)); /* LSB of y */ + + /* Checksum (should be only valid for first command (0) */ + ssp->spiSendByte(ssp->spiHwInterface,0x95); + + /* Eat response, we don't care for now */ + ssp->spiSendByte(ssp->spiHwInterface,0xff); +} +/*****************************************************************************/ + +euint8 sd_Resp8b(SdSpiProtocol *ssp) +{ + euint8 i; + euint8 resp; + + /* Respone will come after 1 - 8 pings */ + for(i=0;i<8;i++){ + resp = ssp->spiSendByte(ssp->spiHwInterface,0xff); + if(resp != 0xff) + return(resp); + } + + return(resp); +} +/*****************************************************************************/ + +euint16 sd_Resp16b(SdSpiProtocol *ssp) +{ + euint16 resp; + + resp = ( sd_Resp8b(ssp) << 8 ) & 0xff00; + resp |= ssp->spiSendByte(ssp->spiHwInterface,0xff); + + return(resp); +} +/*****************************************************************************/ + +void sd_Resp8bError(SdSpiProtocol *ssp,euint8 value) +{ + switch(value) + { + case 0x40: + DBG((TXT("Argument out of bounds.\n"))); + break; + case 0x20: + DBG((TXT("Address out of bounds.\n"))); + break; + case 0x10: + DBG((TXT("Error during erase sequence.\n"))); + break; + case 0x08: + DBG((TXT("CRC failed.\n"))); + break; + case 0x04: + DBG((TXT("Illegal command.\n"))); + break; + case 0x02: + DBG((TXT("Erase reset (see SanDisk docs p5-13).\n"))); + break; + case 0x01: + DBG((TXT("Card is initialising.\n"))); + break; + default: + DBG((TXT("Unknown error 0x%x (see SanDisk docs p5-13).\n"),value)); + break; + } +} +/*****************************************************************************/ + +esint8 sd_State(SdSpiProtocol *ssp) +{ + eint16 value; + + sd_Command(ssp,13, 0, 0); + value=sd_Resp16b(ssp); + + switch(value) + { + case 0x0000: + return(1); + break; + case 0x0001: + DBG((TXT("Card is Locked.\n"))); + break; + case 0x0002: + DBG((TXT("WP Erase Skip, Lock/Unlock Cmd Failed.\n"))); + break; + case 0x0004: + DBG((TXT("General / Unknown error -- card broken?.\n"))); + break; + case 0x0008: + DBG((TXT("Internal card controller error.\n"))); + break; + case 0x0010: + DBG((TXT("Card internal ECC was applied, but failed to correct the data.\n"))); + break; + case 0x0020: + DBG((TXT("Write protect violation.\n"))); + break; + case 0x0040: + DBG((TXT("An invalid selection, sectors for erase.\n"))); + break; + case 0x0080: + DBG((TXT("Out of Range, CSD_Overwrite.\n"))); + break; + default: + if(value>0x00FF) + sd_Resp8bError(ssp,(euint8) (value>>8)); + else + DBG((TXT("Unknown error: 0x%x (see SanDisk docs p5-14).\n"),value)); + break; + } + return(-1); +} +/*****************************************************************************/ + +/* **************************************************************************** + * WAIT ?? -- FIXME + * CMDWRITE + * WAIT + * CARD RESP + * WAIT + * DATA BLOCK OUT + * START BLOCK + * DATA + * CHKS (2B) + * BUSY... + */ + +esint8 sd_writeSector(SdSpiProtocol *ssp,euint32 address, euint8* buf) +{ + euint32 place; + euint16 i; + euint16 t=0; + + /*DBG((TXT("Trying to write %u to sector %u.\n"),(void *)&buf,address));*/ + place=512*address; + sd_Command(ssp,CMDWRITE, (euint16) (place >> 16), (euint16) place); + + sd_Resp8b(ssp); /* Card response */ + + ssp->spiSendByte(ssp->spiHwInterface,0xfe); /* Start block */ + for(i=0;i<512;i++) + ssp->spiSendByte(ssp->spiHwInterface,buf[i]); /* Send data */ + ssp->spiSendByte(ssp->spiHwInterface,0xff); /* Checksum part 1 */ + ssp->spiSendByte(ssp->spiHwInterface,0xff); /* Checksum part 2 */ + + ssp->spiSendByte(ssp->spiHwInterface,0xff); + + while(ssp->spiSendByte(ssp->spiHwInterface,0xff)!=0xff){ + t++; + /* Removed NOP */ + } + /*DBG((TXT("Nopp'ed %u times.\n"),t));*/ + + return(0); +} +/*****************************************************************************/ + +/* **************************************************************************** + * WAIT ?? -- FIXME + * CMDCMD + * WAIT + * CARD RESP + * WAIT + * DATA BLOCK IN + * START BLOCK + * DATA + * CHKS (2B) + */ + +esint8 sd_readSector(SdSpiProtocol *ssp,euint32 address, euint8* buf) +{ + euint8 cardresp; + euint8 firstblock; + euint8 c; + euint16 fb_timeout=0xffff; + euint32 i; + euint32 place; + const euint16 len=512; /* FIXME */ + + /*DBG((TXT("sd_readSector::Trying to read sector %u and store it at %p.\n"),address,&buf[0]));*/ + place=512*address; + sd_Command(ssp,CMDREAD, (euint16) (place >> 16), (euint16) place); + + cardresp=sd_Resp8b(ssp); /* Card response */ + + /* Wait for startblock */ + do + firstblock=sd_Resp8b(ssp); + while(firstblock==0xff && fb_timeout--); + + if(cardresp!=0x00 || firstblock!=0xfe){ + sd_Resp8bError(ssp,firstblock); + return(-1); + } + + for(i=0;i<512;i++){ + c = ssp->spiSendByte(ssp->spiHwInterface,0xff); + if(ispiSendByte(ssp->spiHwInterface,0xff); + ssp->spiSendByte(ssp->spiHwInterface,0xff); + + return(0); +} +/*****************************************************************************/ + +esint8 sd_ioctl(SdSpiProtocol* ssp,euint16 ctl,void* data) +{ + return(0); +} diff --git a/tools/efsl-0.3.6/util/fsutil/Makefile b/tools/efsl-0.3.6/util/fsutil/Makefile new file mode 100644 index 0000000..4cb6d87 --- /dev/null +++ b/tools/efsl-0.3.6/util/fsutil/Makefile @@ -0,0 +1,38 @@ +INC_BASE=../../src/base/include +INC_GLOBAL=../../src/include +INC_CONF=../../conf +INC_VFAT=../../src/fs/vfat/include +INC_LFI =../../src/hwdrivers/linuxfile/include +INCLUDE_DIRS=-I$(INC_GLOBAL) -I$(INC_BASE) -I$(INC_CONF) -I$(INC_VFAT) -I$(INC_LFI) +LIB_DIRS=-L../../lib +LIB_TARGETS=-lefsl-base -lefsl-fs-vfat -lefsl-hwd-linuxfile +CFLAGS=-g3 -ansi -Wall -O0 $(INCLUDE_DIRS) +LFLAGS= $(LIB_DIRS) $(LIB_TARGETS) +CC=gcc + +all : cpi cpo cpa mkdir list + +init : init.o + gcc -c -o init.o $(CFLAGS) init.c + +cp: init cp.o + gcc -o cp $(CFLAGS) cp.o init.o $(LFLAGS) + +cpi : init cpi.o + gcc -o cpi $(CFLAGS) cpi.o init.o $(LFLAGS) + +cpo : init cpo.o + gcc -o cpo $(CFLAGS) cpo.o init.o $(LFLAGS) + +cpa : init cpa.o + gcc -o cpa $(CFLAGS) cpa.o init.o $(LFLAGS) + +mkdir : init mkdir.o + gcc -o mkdir $(CFLAGS) mkdir.o init.o $(LFLAGS) + +list : init list.o + gcc -o list $(CFLAGS) list.o init.o $(LFLAGS) + +clean : + rm -f cpi cpi.o cpo cpo.o cpa.o cpa mkdir.o mkdir list.o list + diff --git a/tools/efsl-0.3.6/util/fsutil/cp.c b/tools/efsl-0.3.6/util/fsutil/cp.c new file mode 100644 index 0000000..c6144e7 --- /dev/null +++ b/tools/efsl-0.3.6/util/fsutil/cp.c @@ -0,0 +1,96 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : cp.c * +* Release : 0.3 - devel * +* Description : This file is part of the linux utilities, main purpose * +* is to test and debug the library * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#include +#include +#include "efs.h" +#include "linuxfile.h" +#include "include/init.h" + +int main(int argc, char** argv) +{ + euint8 data_left=1,*buffer; + euint32 bcount; + + /* SOURCE */ + FILE *in = NULL; + File *ein = NULL; + efsl_storage *storage_in = NULL; + efsl_fs *filesystem_in = NULL; + + /* DESTINATION */ + FILE *out = NULL; + File *eout = NULL; + efsl_storage *storage_out = NULL; + efsl_fs *filesystem_out = NULL; + + if(Init_EFSL(&storage_in,&storage_out,&filesystem_in,&filesystem_out,&ein,&eout,&in,&out,argc,argv)){ + printf("Error in init\n"); + return(-1); + } + + buffer = malloc(4096); + + while(data_left){ + /* READ */ + if(ein==NULL){ + bcount=fread(buffer,1,4096,in); + }else{ + bcount=file_read(ein,4096,buffer); + } + if(bcount!=4096)data_left=0; + + /* WRITE */ + if(eout==NULL){ + if(fwrite(buffer,bcount,1,out)!=1){ + printf("Error writing to local file\n"); + return(-1); + } + }else{ + if(file_write(eout,bcount,buffer)!=bcount){ + printf("Error writing EFSL file\n"); + return(-1); + } + } + } + + if(in!=NULL)fclose(in); + if(out!=NULL)fclose(out); + if(ein!=NULL)file_fclose(ein); + if(eout!=NULL)file_fclose(eout); + if(filesystem_in!=NULL)fs_umount(&(filesystem_in->filesystem)); + if(filesystem_out!=NULL)fs_umount(&(filesystem_out->filesystem)); + + return(0); +} diff --git a/tools/efsl-0.3.6/util/fsutil/cpa.c b/tools/efsl-0.3.6/util/fsutil/cpa.c new file mode 100644 index 0000000..0c8d51f --- /dev/null +++ b/tools/efsl-0.3.6/util/fsutil/cpa.c @@ -0,0 +1,85 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : cpa.c * +* Release : 0.3 - devel * +* Description : This file is part of the linux utilities, main purpose * +* is to test and debug the library * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#include +#include +#include "efs.h" + +int main(int argc, char** argv) +{ + EmbeddedFileSystem efs; + EmbeddedFile file; + unsigned short e; + unsigned short bufsize; + signed short ret; + char *buf; + FILE *localfile; + + if(argc<4){ + fprintf(stderr,"Argument error : cpi [bufsize]\n"); + exit(-1); + } + + if(argc==5) + bufsize=atoi(argv[4]); + else + bufsize=4096; + buf=malloc(bufsize); + + if(efs_init(&efs,argv[1])!=0){ + printf("Could not open filesystem.\n"); + return(-1); + } + + ret=file_fopen(&file,&efs.myFs,argv[3],'a'); + if((ret!=0)){ + printf("Could not open file %s (return value: %d).\n",argv[3],ret); + return(-2); + } + + if(!(localfile=fopen(argv[2],"r"))){ + printf("Could not open local file.\n"); + return(-3); + } + + while((e=fread(buf,1,bufsize,localfile))){ + file_write(&file,e,buf); + } + + file_fclose(&file); + fclose(localfile); + fs_umount(&(efs.myFs)); + + return(0); +} diff --git a/tools/efsl-0.3.6/util/fsutil/cpi.c b/tools/efsl-0.3.6/util/fsutil/cpi.c new file mode 100644 index 0000000..8ecd7bd --- /dev/null +++ b/tools/efsl-0.3.6/util/fsutil/cpi.c @@ -0,0 +1,85 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : cpi.c * +* Release : 0.3 - devel * +* Description : This file is part of the linux utilities, main purpose * +* is to test and debug the library * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#include +#include +#include "efs.h" + +int main(int argc, char** argv) +{ + EmbeddedFileSystem efs; + EmbeddedFile file; + unsigned short e; + unsigned short bufsize; + signed short ret; + char *buf; + FILE *localfile; + + if(argc<4){ + fprintf(stderr,"Argument error : cpi [bufsize]\n"); + exit(-1); + } + + if(argc==5) + bufsize=atoi(argv[4]); + else + bufsize=4096; + buf=malloc(bufsize); + + if(efs_init(&efs,argv[1])!=0){ + printf("Could not open filesystem.\n"); + return(-1); + } + + ret=file_fopen(&file,&efs.myFs,argv[3],'w'); + if((ret!=0)){ + printf("Could not open file %s (return value: %d).\n",argv[3],ret); + return(-2); + } + + if(!(localfile=fopen(argv[2],"r"))){ + printf("Could not open local file.\n"); + return(-3); + } + + while((e=fread(buf,1,bufsize,localfile))){ + file_write(&file,e,buf); + } + + file_fclose(&file); + fclose(localfile); + fs_umount(&(efs.myFs)); + + return(0); +} diff --git a/tools/efsl-0.3.6/util/fsutil/cpo.c b/tools/efsl-0.3.6/util/fsutil/cpo.c new file mode 100644 index 0000000..d269ceb --- /dev/null +++ b/tools/efsl-0.3.6/util/fsutil/cpo.c @@ -0,0 +1,106 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : cpo.c * +* Release : 0.3 - devel * +* Description : This file is part of the linux utilities, main purpose * +* is to test and debug the library * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#include +#include +#include "efs.h" +#include "linuxfile.h" + +int main(int argc, char** argv) +{ + linuxFileInterface *lfi=Malloc(sizeof(*lfi)); + File *file=Malloc(sizeof(*file)); + + efsl_storage_conf *sconf=Malloc(sizeof(*sconf)); + efsl_fs_conf *fconf=Malloc(sizeof(fconf)); + efsl_storage *storage=Malloc(sizeof(*storage)); + efsl_fs *filesystem=Malloc(sizeof(*filesystem)); + + unsigned short e; + unsigned short bufsize; + char *buf; + FILE *localfile; + + if(argc<4){ + fprintf(stderr,"Argument error : cpo [bufsize]\n"); + exit(-1); + } + + if(argc==5) + bufsize=atoi(argv[4]); + else + bufsize=4096; + buf=malloc(bufsize); + + lfi->fileName=argv[1]; + + sconf->hwObject=lfi; + sconf->if_init_fptr=lf_init; + sconf->if_read_fptr=lf_readBuf; + sconf->if_write_fptr=lf_writeBuf; + sconf->if_ioctl_fptr=lf_ioctl; + sconf->ioman_bufmem=buf; + + fconf->no_partitions=1; + fconf->storage=storage; + + if(efsl_initStorage(storage,sconf)){ + printf("Error initialising storage\n"); + exit(-1); + } + if(efsl_initFs(filesystem,fconf)){ + printf("Unable to mount filesystem\n"); + exit(-1); + } + + if(file_fopen(file,&(filesystem->filesystem),argv[2],'r')!=0){ + printf("Could not open file.\n"); + return(-2); + } + + if(!(localfile=fopen(argv[3],"w"))){ + printf("Could not open local file.\n"); + return(-3); + } + + while((e=file_read(file,bufsize,buf))){ + fwrite(buf,1,e,localfile); + } + + file_fclose(file); + fclose(localfile); + fs_umount(&(filesystem->filesystem)); + + return(0); +} diff --git a/tools/efsl-0.3.6/util/fsutil/include/init.h b/tools/efsl-0.3.6/util/fsutil/include/init.h new file mode 100644 index 0000000..d84a81f --- /dev/null +++ b/tools/efsl-0.3.6/util/fsutil/include/init.h @@ -0,0 +1,68 @@ +/*****************************************************************************\ +* efs - General purpose Embedded Filesystem library * +* --------------------- ----------------------------------- * +* * +* Filename : init.h * +* Description : This file contains the functions to initialise the library on * +* linux and other POSIX systems, usage is in the fsutils * +* * +* This library is free software; you can redistribute it and/or * +* modify it under the terms of the GNU Lesser General Public * +* License as published by the Free Software Foundation; either * +* version 2.1 of the License, or (at your option) any later version. * +* * +* This library is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * +* Lesser General Public License for more details. * +* * +* (c)2004 Lennart Yseboodt * +* (c)2004 Michael De Nil * +\*****************************************************************************/ + +#ifndef __FSUTIL_INIT_H_ +#define __FSUTIL_INIT_H_ + +#include +#include +#include +#include +#include +#include "config.h" +#include "efs.h" +#include "linuxfile.h" + +#define IFTYPE_LOCAL 1 +#define IFTYPE_LFI 2 +#define IFTYPE_NMI 3 + +struct _local_options{ + euint8* filename; +}; +typedef struct _local_options local_options; + +struct _lfi_options{ + euint8* imagename; + euint8* filename; +}; +typedef struct _lfi_options lfi_options; + +struct _EFSL_cmd_options{ + euint8 type; + /*euint8* op_filename;*/ + local_options local_opt; + lfi_options lfi_opt; +}; +typedef struct _EFSL_cmd_options EFSL_cmd_options; + +void option_init(EFSL_cmd_options *opt); + +euint8 Init_EFSL(efsl_storage **s_src ,efsl_storage **s_dst, + efsl_fs **f_src ,efsl_fs **f_dst, + File **ef_src,File **ef_dst, + FILE **lf_src,FILE **lf_dst, + int argc, char **argv); + +euint8 parse_cmd(EFSL_cmd_options *opt,char *cmd); + +#endif diff --git a/tools/efsl-0.3.6/util/fsutil/init.c b/tools/efsl-0.3.6/util/fsutil/init.c new file mode 100644 index 0000000..8118a62 --- /dev/null +++ b/tools/efsl-0.3.6/util/fsutil/init.c @@ -0,0 +1,240 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : init.c * +* Release : 0.3 - devel * +* Description : This file contains the functions to initialise the library on * +* linux and other POSIX systems, usage is in the fsutils * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#include "include/init.h" + +void option_init(EFSL_cmd_options *opt) +{ + opt->type=0; + + opt->local_opt.filename=NULL; + + opt->lfi_opt.imagename=NULL; +} + +euint8 parse_cmd(EFSL_cmd_options *opt,char *cmd) +{ + euint8 *token,*vtoken; + euint8 type=0; + + token=strtok(cmd,":"); + if(strcmp(token,"local")==0)type=IFTYPE_LOCAL; + if(strcmp(token,"lfi")==0)type=IFTYPE_LFI; + if(strcmp(token,"lnmi")==0)type=IFTYPE_NMI; + if(!type){ + printf("Invalid type\n"); + return(1); + } + + opt->type=type; + + switch(type){ + case IFTYPE_LOCAL: + while((token=strtok(NULL,"="))!=NULL){ + vtoken=strtok(NULL,","); + if(strcmp(token,"file")==0){\ + printf("LOCAL::file(%s)\n",vtoken); + opt->local_opt.filename=malloc(strlen(vtoken)+1); + strcpy(opt->local_opt.filename,vtoken); + }else{ + printf("LOCAL::unrecognised option %s (%s)\n",token,vtoken); + } + } + break; + case IFTYPE_LFI: + while((token=strtok(NULL,"="))!=NULL){ + vtoken=strtok(NULL,","); + if(strcmp(token,"image")==0){ + opt->lfi_opt.imagename=malloc(strlen(vtoken)+1); + strcpy(opt->lfi_opt.imagename,vtoken); + printf("LFI::image(%s)\n",opt->lfi_opt.imagename); + }else if(strcmp(token,"file")){ + opt->lfi_opt.filename=malloc(strlen(vtoken)+1); + strcpy(opt->lfi_opt.filename,vtoken); + printf("LFI::filename(%s)\n",opt->lfi_opt.filename); + }else{ + printf("LFI::unrecognised option %s (%s)\n",token,vtoken); + } + } + break; + case IFTYPE_NMI: + while((token=strtok(NULL,"="))!=NULL){ + vtoken=strtok(NULL,","); + } + break; + } + return(0); +} + +euint8 Init_EFSL(efsl_storage **s_src ,efsl_storage **s_dst, + efsl_fs **f_src ,efsl_fs **f_dst, + File **ef_src,File **ef_dst, + FILE **lf_src,FILE **lf_dst, + int argc, char **argv) +{ + euint8 *arg,do_dest=0; + EFSL_cmd_options *opt_src,*opt_dst; + void *rhwi; + + efsl_storage_conf *sconf; + efsl_fs_conf *fconf; + + if(argc<=1){ + printf("No arguments given\n"); + return(1); + } + + sconf=malloc(sizeof(*sconf)); + fconf=malloc(sizeof(*fconf)); + + /* Parse source argument + * from TYPE:opt1=val1,opt2=val2... + */ + printf("Source argument : %s\n",argv[1]); + arg=malloc(strlen(argv[1])+1); + strcpy(arg,argv[1]); + opt_src=malloc(sizeof(*opt_src)); + option_init(opt_src); + parse_cmd(opt_src,arg); + free(arg); + + if(argc>=3){ + printf("Destination argument : %s\n",argv[2]); + arg=malloc(strlen(argv[2]+1)); + strcpy(arg,argv[2]); + opt_dst=malloc(sizeof(*opt_dst)); + option_init(opt_dst); + parse_cmd(opt_dst,arg); + free(arg); + do_dest=1; + } + + /* Options parsed, action time */ + /* Start off with source stuff */ + + switch(opt_src->type){ + case IFTYPE_LOCAL: + (*lf_src)=fopen(opt_src->local_opt.filename,"r"); + if(*lf_src==NULL){ + printf("Unable to open local file : %s\n",opt_src->local_opt.filename); + return(1); + } + break; + case IFTYPE_LFI: + rhwi=malloc(sizeof(linuxFileInterface)); + ((linuxFileInterface*)rhwi)->fileName=malloc(strlen(opt_src->lfi_opt.imagename)+1); + strcpy(((linuxFileInterface*)rhwi)->fileName,opt_src->lfi_opt.imagename); + (*s_src)=malloc(sizeof(**s_src)); + sconf->hwObject = rhwi; + sconf->if_init_fptr = lf_init; + sconf->if_read_fptr = lf_readBuf; + sconf->if_write_fptr = lf_writeBuf; + sconf->if_ioctl_fptr = lf_ioctl; + sconf->ioman_bufmem = malloc(IOMAN_NUMBUFFER*512); + if(efsl_initStorage( (*s_src) ,sconf)){ + printf("Unable to initialise source storage layer\n"); + return(1); + } + (*f_src)=malloc(sizeof(**f_src)); + fconf->storage=(*s_src); + fconf->no_partitions=1; /* Always use full file as partition */ + if(efsl_initFs( (*f_src) ,fconf)){ + printf("Unable to initialise source filesystem layer\n"); + return(1); + } + (*ef_src)=malloc(sizeof(**ef_src)); + if( file_fopen(*ef_src,&(*f_src)->filesystem,opt_src->lfi_opt.filename,'r') ){ + printf("Unable to open sourcefile in image\n"); + return(1); + } + break; + } + + if(do_dest){ + + switch(opt_dst->type){ + case IFTYPE_LOCAL: + if(opt_src->type == opt_dst->type && + (strcmp(opt_src->local_opt.filename,opt_dst->local_opt.filename))==0){ + printf("LOCAL:: Destination file is source file\n"); + return(1); + }else{ + (*lf_dst)=fopen(opt_dst->local_opt.filename,"w"); + if((*lf_dst)==NULL){ + printf("Unable to open local file : %s\n",opt_dst->local_opt.filename); + return(1); + } + } + break; + case IFTYPE_LFI: + if(opt_src->type == opt_dst->type && + (strcmp(opt_src->lfi_opt.imagename,opt_dst->lfi_opt.imagename))==0){ + printf("LFI:: Source/Dest is the same!\n"); + (*s_dst)=(*s_src); + (*f_dst)=(*f_src); + }else{ + rhwi=malloc(sizeof(linuxFileInterface)); + ((linuxFileInterface*)rhwi)->fileName=malloc(strlen(opt_dst->lfi_opt.imagename)+1); + strcpy(((linuxFileInterface*)rhwi)->fileName,opt_dst->lfi_opt.imagename); + (*s_dst)=malloc(sizeof(**s_dst)); + sconf->hwObject = rhwi; + sconf->if_init_fptr = lf_init; + sconf->if_read_fptr = lf_readBuf; + sconf->if_write_fptr = lf_writeBuf; + sconf->if_ioctl_fptr = lf_ioctl; + sconf->ioman_bufmem = malloc(IOMAN_NUMBUFFER*512); + if(efsl_initStorage( (*s_dst) ,sconf)){ + printf("Unable to initialise source storage layer\n"); + return(1); + } + (*f_dst)=malloc(sizeof(**f_src)); + fconf->storage=(*s_dst); + fconf->no_partitions=1; /* Always use full file as partition */ + if(efsl_initFs( (*f_dst) ,fconf)){ + printf("Unable to initialise source filesystem layer\n"); + return(1); + } + } + (*ef_dst)=malloc(sizeof(**ef_dst)); + if( file_fopen(*ef_dst,&(*f_dst)->filesystem,opt_dst->lfi_opt.filename,'w') ){ + printf("Unable to open destinationfile in image\n"); + return(1); + } + break; + } + } + + return(0); +} + diff --git a/tools/efsl-0.3.6/util/fsutil/list.c b/tools/efsl-0.3.6/util/fsutil/list.c new file mode 100644 index 0000000..cce5ebf --- /dev/null +++ b/tools/efsl-0.3.6/util/fsutil/list.c @@ -0,0 +1,69 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : list.c * +* Release : 0.3 - devel * +* Description : This file is part of the linux utilities, main purpose * +* is to test and debug the library * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#include +#include +#include "efs.h" +#include "ls.h" + +int main(int argc, char** argv) +{ + EmbeddedFileSystem efs; + DirList *list; + + if(argc<3){ + fprintf(stderr,"Argument error : list \n"); + exit(-1); + } + + if(efs_init(&efs,argv[1])!=0){ + printf("Could not open filesystem.\n"); + return(-1); + } + + list = malloc(sizeof(*list)); + + if((ls_openDir(list,&(efs.myFs),argv[2]))!=0){ + printf("Unable to open directory for listing\n"); + exit(-1); + } + + while(ls_getNext(list)==0){ + printf("%s\n",list->currentEntry.FileName); + } + + fs_umount(&(efs.myFs)); + + return(0); +} diff --git a/tools/efsl-0.3.6/util/fsutil/mkdir.c b/tools/efsl-0.3.6/util/fsutil/mkdir.c new file mode 100644 index 0000000..5d33a84 --- /dev/null +++ b/tools/efsl-0.3.6/util/fsutil/mkdir.c @@ -0,0 +1,61 @@ +/*****************************************************************************\ +* EFSL - Embedded Filesystems Library * +* ----------------------------------- * +* * +* Filename : mkdir.c * +* Release : 0.3 - devel * +* Description : This file is part of the linux utilities, main purpose * +* is to test and debug the library * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; version 2 * +* of the License. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* As a special exception, if other files instantiate templates or * +* use macros or inline functions from this file, or you compile this * +* file and link it with other works to produce a work based on this file, * +* this file does not by itself cause the resulting work to be covered * +* by the GNU General Public License. However the source code for this * +* file must still be made available in accordance with section (3) of * +* the GNU General Public License. * +* * +* This exception does not invalidate any other reasons why a work based * +* on this file might be covered by the GNU General Public License. * +* * +* (c)2006 Lennart Yseboodt * +* (c)2006 Michael De Nil * +\*****************************************************************************/ + +#include +#include +#include "efs.h" +#include "ui.h" + +int main(int argc, char **argv) +{ + EmbeddedFileSystem efs; + + if(argc<3){ + fprintf(stderr,"Argument error : mkdir \n"); + exit(-1); + } + + if(efs_init(&efs,argv[1])!=0){ + printf("Could not open filesystem.\n"); + return(-1); + } + + if(!mkdir(&(efs.myFs),argv[2])){ + printf("Unable to make directory\n"); + fs_umount(&(efs.myFs)); + exit(-1); + } + fs_umount(&(efs.myFs)); + return(0); +} diff --git a/tools/mmc-0.3/MMC_Card.pnproj b/tools/mmc-0.3/MMC_Card.pnproj new file mode 100644 index 0000000..771700a --- /dev/null +++ b/tools/mmc-0.3/MMC_Card.pnproj @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tools/mmc-0.3/fat.c b/tools/mmc-0.3/fat.c new file mode 100644 index 0000000..0e093a4 --- /dev/null +++ b/tools/mmc-0.3/fat.c @@ -0,0 +1,316 @@ +/*####################################################################################### +FAT for AVR (MMC/SD) + +Copyright (C) 2004 Ulrich Radig + +Bei Fragen und Verbesserungen wendet euch per EMail an + +mail@ulrichradig.de + +oder im Forum meiner Web Page : www.ulrichradig.de + + +Dieses Programm ist freie Software. Sie knnen es unter den Bedingungen der +GNU General Public License, wie von der Free Software Foundation verffentlicht, +weitergeben und/oder modifizieren, entweder gem Version 2 der Lizenz oder +(nach Ihrer Option) jeder spteren Version. + +Die Verffentlichung dieses Programms erfolgt in der Hoffnung, +da es Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, +sogar ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT +FR EINEN BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License. + +Sie sollten eine Kopie der GNU General Public License zusammen mit diesem +Programm erhalten haben. +Falls nicht, schreiben Sie an die Free Software Foundation, +Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. +#######################################################################################*/ + +#include "fat.h" + +unsigned char cluster_size; +unsigned int fat_offset; +unsigned int cluster_offset; +unsigned int volume_boot_record_addr; + +//############################################################################ +//Auslesen Cluster Size der MMC/SD Karte und Speichern der gre ins EEprom +//Auslesen Cluster Offset der MMC/SD Karte und Speichern der gre ins EEprom +void fat_init (void) +//############################################################################ +{ + struct BootSec *bootp; //Zeiger auf Bootsektor Struktur + + unsigned char Buffer[BlockSize]; + + //volume_boot_record_addr = fat_addr (Buffer); + mmc_read_sector (MASTER_BOOT_RECORD,Buffer); //Read Master Boot Record + if (Buffer[510] == 0x55 && Buffer[511] == 0xAA) + { + FAT_DEBUG("\r\nMBR Signatur found!\r\n"); + } + else + { + FAT_DEBUG("\r\nMBR Signatur not found!\r\n"); + while(1); + } + + + volume_boot_record_addr = Buffer[VBR_ADDR] + (Buffer[VBR_ADDR+1] << 8); + + mmc_read_sector (volume_boot_record_addr,Buffer); + if (Buffer[510] == 0x55 && Buffer[511] == 0xAA) + { + FAT_DEBUG("\r\nVBR Signatur found!\r\n"); + } + else + { + FAT_DEBUG("\r\nVBR Signatur not found!\r\n"); + volume_boot_record_addr = MASTER_BOOT_RECORD;//<- added by Hennie + mmc_read_sector (MASTER_BOOT_RECORD,Buffer); //Read Master Boot Record + } + + bootp=(struct BootSec *)Buffer; + cluster_size = bootp->BPB_SecPerClus; + fat_offset = bootp->BPB_RsvdSecCnt; + + cluster_offset = ((bootp->BPB_BytesPerSec * 32)/BlockSize); + cluster_offset += fat_root_dir_addr(Buffer); +} + +//############################################################################ +//Auslesen der Adresse des First Root Directory von Volume Boot Record +unsigned int fat_root_dir_addr (unsigned char *Buffer) +//############################################################################ +{ + struct BootSec *bootp; //Zeiger auf Bootsektor Struktur + unsigned int FirstRootDirSecNum; + //auslesen des Volume Boot Record von der MMC/SD Karte + mmc_read_sector (volume_boot_record_addr,Buffer); + bootp=(struct BootSec *)Buffer; + + //berechnet den ersten Sector des Root Directory + FirstRootDirSecNum = ( bootp->BPB_RsvdSecCnt + + (bootp->BPB_NumFATs * bootp->BPB_FATSz16)); + + FirstRootDirSecNum+= volume_boot_record_addr; + + return(FirstRootDirSecNum); +} + +//############################################################################ +// Ausgabe des angegebenen Directory Eintrag in Entry_Count +// ist kein Eintrag vorhanden, ist der Eintrag im +// Rckgabe Cluster 0xFFFF. Es wird immer nur ein Eintrag ausgegeben +// um Speicherplatz zu sparen um es auch fr kleine Atmels zu benutzen +unsigned int fat_read_dir_ent (unsigned int dir_cluster, //Angabe Dir Cluster + unsigned char Entry_Count, //Angabe welcher Direintrag + unsigned long *Size, //Rckgabe der File Gre + unsigned char *Dir_Attrib, //Rckgabe des Dir Attributs + unsigned char *Buffer) //Working Buffer +//############################################################################ +{ + unsigned char *pointer; + unsigned int TMP_Entry_Count = 0; + unsigned long Block = 0; + struct DirEntry *dir; //Zeiger auf einen Verzeichniseintrag + + pointer = Buffer; + + if (dir_cluster == 0) + { + Block = fat_root_dir_addr(Buffer); + } + else + { + //Berechnung des Blocks aus BlockCount und Cluster aus FATTabelle + //Berechnung welcher Cluster zu laden ist + //Auslesen der FAT - Tabelle + fat_load (dir_cluster,&Block,Buffer); + Block = ((Block-2) * cluster_size) + cluster_offset; + } + + //auslesen des gesamten Root Directory + for (unsigned int blk = Block;;blk++) + { + mmc_read_sector (blk,Buffer); //Lesen eines Blocks des Root Directory + for (unsigned int a=0;aDIR_Name[0] == 0) //Kein weiterer Eintrag wenn erstes Zeichen des Namens 0 ist + { + return (0xFFFF); + } + + //Prfen ob es ein 8.3 Eintrag ist + //Das ist der Fall wenn es sich nicht um einen Eintrag fr lange Dateinamen + //oder um einen als gelscht markierten Eintrag handelt. + if ((dir->DIR_Attr != ATTR_LONG_NAME) && + (dir->DIR_Name[0] != DIR_ENTRY_IS_FREE)) + { + //Ist es der gewnschte Verzeichniseintrag + if (TMP_Entry_Count == Entry_Count) + { + //Speichern des Verzeichnis Eintrages in den Rckgabe Buffer + for(unsigned char b=0;b<11;b++) + { + if (dir->DIR_Name[b] != SPACE) + { + if (b == 8) + { + *pointer++= '.'; + } + *pointer++=dir->DIR_Name[b]; + } + } + *pointer++='\0'; + *Dir_Attrib = dir->DIR_Attr; + + //Speichern der Filegre + *Size=dir->DIR_FileSize; + + //Speichern des Clusters des Verzeichniseintrages + dir_cluster = dir->DIR_FstClusLO; + + //Eintrag gefunden Rcksprung mit Cluster File Start + return(dir_cluster); + } + TMP_Entry_Count++; + } + } + } + return (0xFFFF); //Kein Eintrag mehr gefunden Rcksprung mit 0xFFFF +} + +//############################################################################ +// Auslesen der Cluster fr ein File aus der FAT +// in den Buffer(512Byte). Bei einer 128MB MMC/SD +// Karte ist die Cluster gre normalerweise 16KB gro +// das bedeutet das File kann max. 4MByte gro sein. +// Bei greren Files mu der Buffer grer definiert +// werden! (Ready) +// Cluster = Start Clusterangabe aus dem Directory +void fat_load ( unsigned int Cluster, //Angabe Startcluster + unsigned long *Block, + unsigned char *TMP_Buffer) //Workingbuffer +//############################################################################ +{ + //Zum berprfen ob der FAT Block schon geladen wurde + unsigned int FAT_Block_Store = 0; + + //Byte Adresse innerhalb des Fat Blocks + unsigned int FAT_Byte_Addresse; + + //FAT Block Adresse + unsigned int FAT_Block_Addresse; + + //Berechnung fr den ersten FAT Block (FAT Start Addresse) + for (unsigned int a = 0;;a++) + { + if (a == *Block) + { + *Block = (0x0000FFFF & Cluster); + return; + } + + if (Cluster == 0xFFFF) + { + break; //Ist das Ende des Files erreicht Schleife beenden + } + //Berechnung des Bytes innerhalb des FAT Blocks + FAT_Byte_Addresse = (Cluster*2) % BlockSize; + + //Berechnung des Blocks der gelesen werden mu + FAT_Block_Addresse = ((Cluster*2) / BlockSize) + + volume_boot_record_addr + fat_offset; + //Lesen des FAT Blocks + //berprfung ob dieser Block schon gelesen wurde + if (FAT_Block_Addresse != FAT_Block_Store) + { + FAT_Block_Store = FAT_Block_Addresse; + //Lesen des FAT Blocks + mmc_read_sector (FAT_Block_Addresse,TMP_Buffer); + } + + //Lesen der nchsten Clusternummer + Cluster = (TMP_Buffer[FAT_Byte_Addresse + 1] << 8) + + TMP_Buffer[FAT_Byte_Addresse]; + } + return; +} + +//############################################################################ +//Lesen eines 512Bytes Blocks von einem File +void fat_read_file (unsigned int Cluster,//Angabe des Startclusters vom File + unsigned char *Buffer, //Workingbuffer + unsigned long BlockCount) //Angabe welcher Bock vom File geladen + //werden soll a 512 Bytes +//############################################################################ +{ + //Berechnung des Blocks aus BlockCount und Cluster aus FATTabelle + //Berechnung welcher Cluster zu laden ist + + unsigned long Block = (BlockCount/cluster_size); + + //Auslesen der FAT - Tabelle + fat_load (Cluster,&Block,Buffer); + Block = ((Block-2) * cluster_size) + cluster_offset; + //Berechnung des Blocks innerhalb des Cluster + Block += (BlockCount % cluster_size); + //Read Data Block from Device + mmc_read_sector (Block,Buffer); + return; +} + +//############################################################################ +//Lesen eines 512Bytes Blocks von einem File +void fat_write_file (unsigned int cluster,//Angabe des Startclusters vom File + unsigned char *buffer, //Workingbuffer + unsigned long blockCount) //Angabe welcher Bock vom File gespeichert + //werden soll a 512 Bytes +//############################################################################ +{ + //Berechnung des Blocks aus BlockCount und Cluster aus FATTabelle + //Berechnung welcher Cluster zu speichern ist + unsigned char tmp_buffer[513]; + unsigned long block = (blockCount/cluster_size); + + //Auslesen der FAT - Tabelle + fat_load (cluster,&block,tmp_buffer); + block = ((block-2) * cluster_size) + cluster_offset; + //Berechnung des Blocks innerhalb des Cluster + block += (blockCount % cluster_size); + //Write Data Block to Device + mmc_write_sector (block,buffer); + return; +} + +//#################################################################################### +//Sucht ein File im Directory +unsigned char fat_search_file (unsigned char *File_Name, //Name des zu suchenden Files + unsigned int *Cluster, //Angabe Dir Cluster welches + //durchsucht werden soll + //und Rckgabe des clusters + //vom File welches gefunden + //wurde + unsigned long *Size, //Rckgabe der File Gre + unsigned char *Dir_Attrib,//Rckgabe des Dir Attributs + unsigned char *Buffer) //Working Buffer +//#################################################################################### +{ + unsigned int Dir_Cluster_Store = *Cluster; + for (unsigned char a = 0;a < 100;a++) + { + *Cluster = fat_read_dir_ent(Dir_Cluster_Store,a,Size,Dir_Attrib,Buffer); + if (*Cluster == 0xffff) + { + return(0); //File not Found + } + if(strcasecmp((char *)File_Name,(char *)Buffer) == 0) + { + return(1); //File Found + } + } + return(2); //Error +} diff --git a/tools/mmc-0.3/fat.h b/tools/mmc-0.3/fat.h new file mode 100644 index 0000000..dbfa5b3 --- /dev/null +++ b/tools/mmc-0.3/fat.h @@ -0,0 +1,109 @@ +/*####################################################################################### +Connect ARM to MMC/SD + +Copyright (C) 2004 Ulrich Radig +#######################################################################################*/ + +#ifndef _FAT_H_ + #define _FAT_H_ + +#include +#include "mmc.h" +#include "usart.h" + +#define FAT_DEBUG usart_write +//#define FAT_DEBUG(...) + + +//Prototypes +extern unsigned int fat_root_dir_addr (unsigned char *); +extern unsigned int fat_read_dir_ent (unsigned int,unsigned char,unsigned long*,unsigned char *,unsigned char *); +extern void fat_load (unsigned int,unsigned long *,unsigned char *); +extern void fat_read_file (unsigned int,unsigned char *,unsigned long); +extern void fat_write_file (unsigned int,unsigned char *,unsigned long); +extern void fat_init (void); +extern unsigned char fat_search_file (unsigned char *,unsigned int *,unsigned long *,unsigned char *,unsigned char *); + +//Block Size in Bytes +#define BlockSize 512 + +//Master Boot Record +#define MASTER_BOOT_RECORD 0 + +//Volume Boot Record location in Master Boot Record +#define VBR_ADDR 0x1C6 + +//define ASCII +#define SPACE 0x20 +#define DIR_ENTRY_IS_FREE 0xE5 +#define FIRST_LONG_ENTRY 0x01 +#define SECOND_LONG_ENTRY 0x42 + +//define DIR_Attr +#define ATTR_LONG_NAME 0x0F +#define ATTR_READ_ONLY 0x01 +#define ATTR_HIDDEN 0x02 +#define ATTR_SYSTEM 0x04 +#define ATTR_VOLUME_ID 0x08 +#define ATTR_DIRECTORY 0x10 +#define ATTR_ARCHIVE 0x20 + +struct BootSec +{ + unsigned char BS_jmpBoot[3]; + unsigned char BS_OEMName[8]; + unsigned int BPB_BytesPerSec; //2 bytes + unsigned char BPB_SecPerClus; + unsigned int BPB_RsvdSecCnt; //2 bytes + unsigned char BPB_NumFATs; + unsigned int BPB_RootEntCnt; //2 bytes + unsigned int BPB_TotSec16; //2 bytes + unsigned char BPB_Media; + unsigned int BPB_FATSz16; //2 bytes + unsigned int BPB_SecPerTrk; //2 bytes + unsigned int BPB_NumHeads; //2 bytes + unsigned long BPB_HiddSec; //4 bytes + unsigned long BPB_TotSec32; //4 bytes +}; + +//FAT12 and FAT16 Structure Starting at Offset 36 +#define BS_DRVNUM 36 +#define BS_RESERVED1 37 +#define BS_BOOTSIG 38 +#define BS_VOLID 39 +#define BS_VOLLAB 43 +#define BS_FILSYSTYPE 54 + +//FAT32 Structure Starting at Offset 36 +#define BPB_FATSZ32 36 +#define BPB_EXTFLAGS 40 +#define BPB_FSVER 42 +#define BPB_ROOTCLUS 44 +#define BPB_FSINFO 48 +#define BPB_BKBOOTSEC 50 +#define BPB_RESERVED 52 + +#define FAT32_BS_DRVNUM 64 +#define FAT32_BS_RESERVED1 65 +#define FAT32_BS_BOOTSIG 66 +#define FAT32_BS_VOLID 67 +#define FAT32_BS_VOLLAB 71 +#define FAT32_BS_FILSYSTYPE 82 +//End of Boot Sctor and BPB Structure + +struct DirEntry { + unsigned char DIR_Name[11]; //8 chars filename + unsigned char DIR_Attr; //file attributes RSHA, Longname, Drive Label, Directory + unsigned char DIR_NTRes; //set to zero + unsigned char DIR_CrtTimeTenth; //creation time part in milliseconds + unsigned int DIR_CrtTime; //creation time + unsigned int DIR_CrtDate; //creation date + unsigned int DIR_LastAccDate; //last access date + unsigned int DIR_FstClusHI; //first cluster high word + unsigned int DIR_WrtTime; //last write time + unsigned int DIR_WrtDate; //last write date + unsigned int DIR_FstClusLO; //first cluster low word + unsigned long DIR_FileSize; + }; + +#endif //_FAT_H_ diff --git a/tools/mmc-0.3/main.c b/tools/mmc-0.3/main.c new file mode 100644 index 0000000..52b3120 --- /dev/null +++ b/tools/mmc-0.3/main.c @@ -0,0 +1,92 @@ +/* + Copyright: Radig Ulrich mailto: mail@ulrichradig.de + Author: Radig Ulrich + Remarks: + known Problems: none + Version: 28.05.2004 + Description: Dieses Programm dient als Beispiel zur Ansteuerung einer MMC/SD-Memory-Card. + Zum Zugriff auf eine MMC/SD-Karte, mu man nur die Datei mmc.c + in sein eigenes Programm einfgen. +*/ + +#include +#include +#include +#include + +#include "mmc.h" +#include "fat.h" +#include "usart.h" + +//Hauptprogramm +int main (void) +{ + //SYSCLK defined in usart.h + //Initzialisierung der seriellen Schnittstelle + usart_init(9600); + + //Initialisierung der MMC/SD-Karte + usart_write("System Ready!\r\n"); + while ( mmc_init() !=0) //ist der Rckgabewert ungleich NULL ist ein Fehler aufgetreten + { + usart_write("** Keine MMC/SD Karte gefunden!! **\n"); + } + usart_write("Karte gefunden!!\n"); + + fat_init();//laden Cluster OFFSET und Size + //Initialisierung der MMC/SD-Karte ENDE! + + unsigned char Buffer[512]; + unsigned int tmp; + + mmc_read_csd (Buffer); + + for (tmp = 0;tmp<16;tmp++) + { + usart_write("%x ",Buffer[tmp]); + }; + + + //Ausgabe des Root Directory + unsigned int Clustervar; + unsigned char Dir_Attrib = 0; + unsigned long Size = 0; + usart_write("\r\nDirectory\r\n"); + for (char a = 1;a < 240;a++) + { + Clustervar = fat_read_dir_ent(0,a,&Size,&Dir_Attrib,Buffer); + if (Clustervar == 0xffff) + { + break; + } + tmp = (Size & 0x0000FFFF); + usart_write("Cluster = %4x DirA = %2x FileName = ",Clustervar,Dir_Attrib); + usart_write("%s",Buffer); + usart_write("\r\n"); + } + usart_write("\r\nDirectory Ende\r\n"); + + //Lade Cluster fr das index.htm File in den Speicher + Clustervar = 0;//suche im Root Verzeichnis + if (fat_search_file((unsigned char *)"mmc.txt",&Clustervar,&Size,&Dir_Attrib,Buffer) == 1) + { + usart_write("\nFile Found!!\r\n"); + //Lese File und gibt es auf der seriellen Schnittstelle aus + for (int b = 0;b<52;b++) + { + fat_read_file (Clustervar,Buffer,b); + for (int a = 0;a<512;a++) + { + usart_write("%c",Buffer[a]); + } + } + } + + usart_write("FERTIG!!\r\n"); + //Hauptprogramm luft stndig in einer schleife und macht nichts + while (1) + { + } +return (1); +} + diff --git a/tools/mmc-0.3/makefile b/tools/mmc-0.3/makefile new file mode 100644 index 0000000..c205177 --- /dev/null +++ b/tools/mmc-0.3/makefile @@ -0,0 +1,404 @@ +# WinAVR Sample makefile written by Eric B. Weddington, Jrg Wunsch, et al. +# Released to the Public Domain +# Please read the make user manual! +# +# Additional material for this makefile was submitted by: +# Tim Henigan +# Peter Fleury +# Reiner Patommel +# Sander Pool +# Frederik Rouleau +# Markus Pfaff +# +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF (for use with AVR Studio 3.x or VMLAB). +# +# make extcoff = Convert ELF to AVR Extended COFF (for use with AVR Studio +# 4.07 or greater). +# +# make program = Download the hex file to the device, using avrdude. Please +# customize the avrdude settings below first! +# +# make filename.s = Just compile filename.c into the assembler code only +# +# To rebuild project do "make clean" then "make all". +# + + +# MCU name +MCU = atmega32 +#MCU = atmega644 + +# Output format. (can be srec, ihex, binary) +FORMAT = ihex + +# Target file name (without extension). +TARGET = main + +# Optimization level, can be [0, 1, 2, 3, s]. 0 turns off optimization. +# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) +OPT = s + + +# List C source files here. (C dependencies are automatically generated.) +SRC = $(TARGET).c mmc.c fat.c usart.c + +# If there is more than one source file, append them above, or modify and +# uncomment the following: +#SRC += foo.c bar.c + +# You can also wrap lines by appending a backslash to the end of the line: +#SRC += baz.c \ +#xyzzy.c + + + +# List Assembler source files here. +# Make them always end in a capital .S. Files ending in a lowercase .s +# will not be considered source files but generated files (assembler +# output from the compiler), and will be deleted upon "make clean"! +# Even though the DOS/Win* filesystem matches both .s and .S the same, +# it will preserve the spelling of the filenames, and gcc itself does +# care about how the name is spelled on its command-line. +ASRC = + + +# List any extra directories to look for include files here. +# Each directory must be seperated by a space. +EXTRAINCDIRS = + + +# Optional compiler flags. +# -g: generate debugging information (for GDB, or for COFF conversion) +# -O*: optimization level +# -f...: tuning, see gcc manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -ahlms: create assembler listing +CFLAGS = -g -O$(OPT) \ +-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \ +-Wall -Wstrict-prototypes \ +-Wa,-adhlns=$(<:.c=.lst) \ +$(patsubst %,-I%,$(EXTRAINCDIRS)) + + +# Set a "language standard" compiler flag. +# Unremark just one line below to set the language standard to use. +# gnu99 = C99 + GNU extensions. See GCC manual for more information. +#CFLAGS += -std=c89 +#CFLAGS += -std=gnu89 +#CFLAGS += -std=c99 +CFLAGS += -std=gnu99 + + + +# Optional assembler flags. +# -Wa,...: tell GCC to pass this to the assembler. +# -ahlms: create listing +# -gstabs: have the assembler create line number information; note that +# for use in COFF files, additional information about filenames +# and function names needs to be present in the assembler source +# files -- see avr-libc docs [FIXME: not yet described there] +ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs + + + +# Optional linker flags. +# -Wl,...: tell GCC to pass this to linker. +# -Map: create map file +# --cref: add cross reference to map file +LDFLAGS = -Wl,-Map=$(TARGET).map,--cref + + + +# Additional libraries + +# Minimalistic printf version +#LDFLAGS += -Wl,-u,vfprintf -lprintf_min + +# Floating point printf version (requires -lm below) +#LDFLAGS += -Wl,-u,vfprintf -lprintf_flt + +# -lm = math library +LDFLAGS += -lm + + + + +# Programming support using avrdude. Settings and variables. + +# Programming hardware: alf avr910 avrisp bascom bsd +# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 +# +# Type: avrdude -c ? +# to get a full listing. +# +AVRDUDE_PROGRAMMER = stk200 + + +#AVRDUDE_PORT = com1 # programmer connected to serial device +AVRDUDE_PORT = lpt1 # programmer connected to parallel port + +AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex +#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep + +AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) + +# Uncomment the following if you want avrdude's erase cycle counter. +# Note that this counter needs to be initialized first using -Yn, +# see avrdude manual. +#AVRDUDE_ERASE += -y + +# Uncomment the following if you do /not/ wish a verification to be +# performed after programming the device. +#AVRDUDE_FLAGS += -V + +# Increase verbosity level. Please use this when submitting bug +# reports about avrdude. See +# to submit bug reports. +#AVRDUDE_FLAGS += -v -v + + + + +# --------------------------------------------------------------------------- + +# Define directories, if needed. +DIRAVR = c:/winavr +DIRAVRBIN = $(DIRAVR)/bin +DIRAVRUTILS = $(DIRAVR)/utils/bin +DIRINC = . +DIRLIB = $(DIRAVR)/avr/lib + + +# Define programs and commands. +SHELL = sh + +CC = avr-gcc + +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +SIZE = avr-size + + +# Programming support using avrdude. +AVRDUDE = avrdude + + +REMOVE = rm -f +COPY = cp + +HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex +ELFSIZE = $(SIZE) -A $(TARGET).elf + + + +# Define Messages +# English +MSG_ERRORS_NONE = Errors: none +MSG_BEGIN = -------- begin -------- +MSG_END = -------- end -------- +MSG_SIZE_BEFORE = Size before: +MSG_SIZE_AFTER = Size after: +MSG_COFF = Converting to AVR COFF: +MSG_EXTENDED_COFF = Converting to AVR Extended COFF: +MSG_FLASH = Creating load file for Flash: +MSG_EEPROM = Creating load file for EEPROM: +MSG_EXTENDED_LISTING = Creating Extended Listing: +MSG_SYMBOL_TABLE = Creating Symbol Table: +MSG_LINKING = Linking: +MSG_COMPILING = Compiling: +MSG_ASSEMBLING = Assembling: +MSG_CLEANING = Cleaning project: + + + + +# Define all object files. +OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) + +# Define all listing files. +LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) + +# Combine all necessary flags and optional flags. +# Add target processor to flags. +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) + + + +# Default target. +all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex $(TARGET).eep \ + $(TARGET).lss $(TARGET).sym sizeafter finished end + + +# Eye candy. +# AVR Studio 3.x does not check make's exit code but relies on +# the following magic strings to be generated by the compile job. +begin: + @echo + @echo $(MSG_BEGIN) + +finished: + @echo $(MSG_ERRORS_NONE) + +end: + @echo $(MSG_END) + @echo + + +# Display size of file. +sizebefore: + @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi + +sizeafter: + @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi + + + +# Display compiler version information. +gccversion : + @$(CC) --version + + + + +# Convert ELF to COFF for use in debugging / simulating in +# AVR Studio or VMLAB. +COFFCONVERT=$(OBJCOPY) --debugging \ + --change-section-address .data-0x800000 \ + --change-section-address .bss-0x800000 \ + --change-section-address .noinit-0x800000 \ + --change-section-address .eeprom-0x810000 + + +coff: $(TARGET).elf + @echo + @echo $(MSG_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-avr $< $(TARGET).cof + + +extcoff: $(TARGET).elf + @echo + @echo $(MSG_EXTENDED_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof + + + + +# Program the device. +program: $(TARGET).hex $(TARGET).eep + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) + + + + +# Create final output files (.hex, .eep) from ELF output file. +%.hex: %.elf + @echo + @echo $(MSG_FLASH) $@ + $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ + +%.eep: %.elf + @echo + @echo $(MSG_EEPROM) $@ + -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 -O $(FORMAT) $< $@ + +# Create extended listing file from ELF output file. +%.lss: %.elf + @echo + @echo $(MSG_EXTENDED_LISTING) $@ + $(OBJDUMP) -h -S $< > $@ + +# Create a symbol table from ELF output file. +%.sym: %.elf + @echo + @echo $(MSG_SYMBOL_TABLE) $@ + avr-nm -n $< > $@ + + + +# Link: create ELF output file from object files. +.SECONDARY : $(TARGET).elf +.PRECIOUS : $(OBJ) +%.elf: $(OBJ) + @echo + @echo $(MSG_LINKING) $@ + $(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) + + +# Compile: create object files from C source files. +%.o : %.c + @echo + @echo $(MSG_COMPILING) $< + $(CC) -c $(ALL_CFLAGS) $< -o $@ + + +# Compile: create assembler files from C source files. +%.s : %.c + $(CC) -S $(ALL_CFLAGS) $< -o $@ + + +# Assemble: create object files from assembler source files. +%.o : %.S + @echo + @echo $(MSG_ASSEMBLING) $< + $(CC) -c $(ALL_ASFLAGS) $< -o $@ + + + + + + +# Target: clean project. +clean: begin clean_list finished end + +clean_list : + @echo + @echo $(MSG_CLEANING) + $(REMOVE) $(TARGET).hex + $(REMOVE) $(TARGET).eep + $(REMOVE) $(TARGET).obj + $(REMOVE) $(TARGET).cof + $(REMOVE) $(TARGET).elf + $(REMOVE) $(TARGET).map + $(REMOVE) $(TARGET).obj + $(REMOVE) $(TARGET).a90 + $(REMOVE) $(TARGET).sym + $(REMOVE) $(TARGET).lnk + $(REMOVE) $(TARGET).lss + $(REMOVE) $(OBJ) + $(REMOVE) $(LST) + $(REMOVE) $(SRC:.c=.s) + $(REMOVE) $(SRC:.c=.d) + + +# Automatically generate C source code dependencies. +# (Code originally taken from the GNU make user manual and modified +# (See README.txt Credits).) +# +# Note that this will work with sh (bash) and sed that is shipped with WinAVR +# (see the SHELL variable defined above). +# This may not work with other shells or other seds. +# +%.d: %.c + set -e; $(CC) -MM $(ALL_CFLAGS) $< \ + | sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > $@; \ + [ -s $@ ] || rm -f $@ + + +# Remove the '-' if you want to see the dependency files generated. +-include $(SRC:.c=.d) + + + +# Listing of phony targets. +.PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff \ + clean clean_list program + diff --git a/tools/mmc-0.3/mmc.c b/tools/mmc-0.3/mmc.c new file mode 100644 index 0000000..9dd2e8f --- /dev/null +++ b/tools/mmc-0.3/mmc.c @@ -0,0 +1,324 @@ +/*####################################################################################### +Connect AVR to MMC/SD + +Copyright (C) 2004 Ulrich Radig + +Bei Fragen und Verbesserungen wendet euch per EMail an + +mail@ulrichradig.de + +oder im Forum meiner Web Page : www.ulrichradig.de + +Dieses Programm ist freie Software. Sie knnen es unter den Bedingungen der +GNU General Public License, wie von der Free Software Foundation verffentlicht, +weitergeben und/oder modifizieren, entweder gem Version 2 der Lizenz oder +(nach Ihrer Option) jeder spteren Version. + +Die Verffentlichung dieses Programms erfolgt in der Hoffnung, +da es Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, +sogar ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT +FR EINEN BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License. + +Sie sollten eine Kopie der GNU General Public License zusammen mit diesem +Programm erhalten haben. +Falls nicht, schreiben Sie an die Free Software Foundation, +Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. +#######################################################################################*/ + +#include "mmc.h" + +//############################################################################ +//Routine zur Initialisierung der MMC/SD-Karte (SPI-MODE) +unsigned char mmc_init () +//############################################################################ +{ + unsigned int Timeout = 0; + + //Konfiguration des Ports an der die MMC/SD-Karte angeschlossen wurde + MMC_Direction_REG &=~(1< 200) + { + MMC_Disable(); + return(1); //Abbruch bei Commando1 (Return Code1) + } + } + //Sendet Commando CMD1 an MMC/SD-Karte + Timeout = 0; + CMD[0] = 0x41;//Commando 1 + CMD[5] = 0xFF; + while( mmc_write_command (CMD) !=0) + { + if (Timeout++ > 400) + { + MMC_Disable(); + return(2); //Abbruch bei Commando2 (Return Code2) + } + } + #if SPI_Mode + //SPI Bus auf max Geschwindigkeit + SPCR &= ~((1< 500) + { + break; //Abbruch da die MMC/SD-Karte nicht Antwortet + } + } + return(tmp); +} + +//############################################################################ +//Routine zum Empfangen eines Bytes von der MMC-Karte +unsigned char mmc_read_byte (void) +//############################################################################ +{ + unsigned char Byte = 0; +#if SPI_Mode //Routine fr Hardware SPI + SPDR = 0xff; + while(!(SPSR & (1<0; a--) //das Byte wird Bitweise nacheinander Empangen MSB First + { + MMC_Write &=~(1< 0) //Lesen des Pegels von MMC_DI + { + Byte |= (1<<(a-1)); + } + else + { + Byte &=~(1<<(a-1)); + } + MMC_Write |=(1<0; a--) //das Byte wird Bitweise nacheinander Gesendet MSB First + { + if (bit_is_set(Byte,(a-1))>0) //Ist Bit a in Byte gesetzt + { + MMC_Write |= (1<>24 ); + cmd[2] = ((addr & 0x00FF0000) >>16 ); + cmd[3] = ((addr & 0x0000FF00) >>8 ); + + //Sendet Commando cmd24 an MMC/SD-Karte (Write 1 Block/512 Bytes) + tmp = mmc_write_command (cmd); + if (tmp != 0) + { + return(tmp); + } + + //Wartet einen Moment und sendet einen Clock an die MMC/SD-Karte + for (unsigned char a=0;a<100;a++) + { + mmc_read_byte(); + } + + //Sendet Start Byte an MMC/SD-Karte + mmc_write_byte(0xFE); + + //Schreiben des Bolcks (512Bytes) auf MMC/SD-Karte + for (unsigned int a=0;a<512;a++) + { + mmc_write_byte(*Buffer++); + } + + //CRC-Byte schreiben + mmc_write_byte(0xFF); //Schreibt Dummy CRC + mmc_write_byte(0xFF); //CRC Code wird nicht benutzt + + //Fehler beim schreiben? (Data Response XXX00101 = OK) + if((mmc_read_byte()&0x1F) != 0x05) return(1); + + //Wartet auf MMC/SD-Karte Bussy + while (mmc_read_byte() != 0xff){}; + + //set MMC_Chip_Select to high (MMC/SD-Karte Inaktiv) + MMC_Disable(); + +return(0); +} + +//############################################################################ +//Routine zum lesen des CID Registers von der MMC/SD-Karte (16Bytes) +void mmc_read_block(unsigned char *cmd,unsigned char *Buffer,unsigned int Bytes) +//############################################################################ +{ + //Sendet Commando cmd an MMC/SD-Karte + if (mmc_write_command (cmd) != 0) + { + return; + } + + //Wartet auf Start Byte von der MMC/SD-Karte (FEh/Start Byte) + + while (mmc_read_byte() != 0xfe){}; + + //Lesen des Bolcks (normal 512Bytes) von MMC/SD-Karte + for (unsigned int a=0;a>24 ); + cmd[2] = ((addr & 0x00FF0000) >>16 ); + cmd[3] = ((addr & 0x0000FF00) >>8 ); + + mmc_read_block(cmd,Buffer,512); + + return(0); +} + +//############################################################################ +//Routine zum lesen des CID Registers von der MMC/SD-Karte (16Bytes) +unsigned char mmc_read_cid (unsigned char *Buffer) +//############################################################################ +{ + //Commando zum lesen des CID Registers + unsigned char cmd[] = {0x4A,0x00,0x00,0x00,0x00,0xFF}; + + mmc_read_block(cmd,Buffer,16); + + return(0); +} + +//############################################################################ +//Routine zum lesen des CSD Registers von der MMC/SD-Karte (16Bytes) +unsigned char mmc_read_csd (unsigned char *Buffer) +//############################################################################ +{ + //Commando zum lesen des CSD Registers + unsigned char cmd[] = {0x49,0x00,0x00,0x00,0x00,0xFF}; + + mmc_read_block(cmd,Buffer,16); + + return(0); +} diff --git a/tools/mmc-0.3/mmc.h b/tools/mmc-0.3/mmc.h new file mode 100644 index 0000000..d23fb0b --- /dev/null +++ b/tools/mmc-0.3/mmc.h @@ -0,0 +1,72 @@ +/*####################################################################################### +Connect ARM to MMC/SD + +Copyright (C) 2004 Ulrich Radig +#######################################################################################*/ + +#ifndef _MMC_H_ + #define _MMC_H_ + +#include + +#define SPI_Mode 1 //1 = Hardware SPI | 0 = Software SPI +//#define SPI_Mode 0 + +#define MMC_Write PORTB //Port an der die MMC/SD-Karte angeschlossen ist also des SPI +#define MMC_Read PINB +#define MMC_Direction_REG DDRB + +#if defined (__AVR_ATmega128__) + #define SPI_DI 3 //Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist + #define SPI_DO 2 //Port Pin an dem Data Input der MMC/SD-Karte angeschlossen ist + #define SPI_Clock 1 //Port Pin an dem die Clock der MMC/SD-Karte angeschlossen ist (clk) + #define MMC_Chip_Select 4 //Port Pin an dem Chip Select der MMC/SD-Karte angeschlossen ist + #define SPI_SS 0 //Nicht Benutz mu aber definiert werden +#endif + +#if defined (__AVR_ATmega32__) + #define SPI_DI 6 //Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist + #define SPI_DO 5 //Port Pin an dem Data Input der MMC/SD-Karte angeschlossen ist + #define SPI_Clock 7 //Port Pin an dem die Clock der MMC/SD-Karte angeschlossen ist (clk) + #define MMC_Chip_Select 3 //Port Pin an dem Chip Select der MMC/SD-Karte angeschlossen ist + #define SPI_SS 4 //Nicht Benutz mu aber definiert werden +#endif + +#if defined (__AVR_ATmega644__) + #define SPI_DI 6 //Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist + #define SPI_DO 5 //Port Pin an dem Data Input der MMC/SD-Karte angeschlossen ist + #define SPI_Clock 7 //Port Pin an dem die Clock der MMC/SD-Karte angeschlossen ist (clk) + #define MMC_Chip_Select 1 //Port Pin an dem Chip Select der MMC/SD-Karte angeschlossen ist + #define SPI_SS 4 //Nicht Benutz mu aber definiert werden +#endif + +//Prototypes +extern unsigned char mmc_read_byte(void); + +extern void mmc_write_byte(unsigned char); + +extern void mmc_read_block(unsigned char *,unsigned char *,unsigned in); + +extern unsigned char mmc_init(void); + +extern unsigned char mmc_read_sector (unsigned long,unsigned char *); + +extern unsigned char mmc_write_sector (unsigned long,unsigned char *); + +extern unsigned char mmc_write_command (unsigned char *); + +extern unsigned char mmc_read_csd (unsigned char *); + +extern unsigned char mmc_read_cid (unsigned char *); + +//set MMC_Chip_Select to high (MMC/SD-Karte Inaktiv) +#define MMC_Disable() MMC_Write|= (1<0) + { + + str_null_buffer[0] = by; + str_null_buffer[1] = '\0'; + move = atoi(str_null_buffer); + by = pgm_read_byte(Buffer++); + } + + switch (by) + { + case 's': + ptr = va_arg(ap,char *); + while(*ptr) { usart_write_char(*ptr++); } + break; + case 'b': + Base = 2; + goto ConversionLoop; + case 'c': + //Int to char + format_flag = va_arg(ap,int); + usart_write_char (format_flag++); + break; + case 'i': + Base = 10; + goto ConversionLoop; + case 'o': + Base = 8; + goto ConversionLoop; + case 'x': + Base = 16; + //**************************** + ConversionLoop: + //**************************** + itoa(va_arg(ap,int),str_buffer,Base); + int b=0; + while (str_buffer[b++] != 0){}; + b--; + if (b + #include + #include + #include + #include + #include + + //---------------------------------------------------------------------------- + + //Die Quarzfrequenz auf dem Board + #ifndef F_CPU + #define F_CPU 14745600UL + #endif //SYSCLK + + //Anpassen der seriellen Schnittstellen Register wenn ein ATMega128 benutzt wird + #if defined (__AVR_ATmega128__) + #define USR UCSR0A + #define UCR UCSR0B + #define UDR UDR0 + #define UBRR UBRR0L + #define USART_RX USART0_RX_vect + #endif + + #if defined (__AVR_ATmega644__) || defined (__AVR_ATmega644P__) + #define USR UCSR0A + #define UCR UCSR0B + #define UBRR UBRR0L + #define EICR EICRB + #define TXEN TXEN0 + #define RXEN RXEN0 + #define RXCIE RXCIE0 + #define UDR UDR0 + #define UDRE UDRE0 + #define USART_RX USART0_RX_vect + #endif + + #if defined (__AVR_ATmega32__) + #define USR UCSRA + #define UCR UCSRB + #define UBRR UBRRL + #define EICR EICRB + #define USART_RX USART_RXC_vect + #endif + + #if defined (__AVR_ATmega8__) + #define USR UCSRA + #define UCR UCSRB + #define UBRR UBRRL + #endif + + #if defined (__AVR_ATmega88__) + #define USR UCSR0A + #define UCR UCSR0B + #define UBRR UBRR0L + #define TXEN TXEN0 + #define UDR UDR0 + #define UDRE UDRE0 + #endif + //---------------------------------------------------------------------------- + + void usart_init(unsigned long baudrate); + void usart_write_char(char c); + void usart_write_str(char *str); + + void usart_write_P (const char *Buffer,...); + #define usart_write(format, args...) usart_write_P(PSTR(format) , ## args) + + //---------------------------------------------------------------------------- + +#endif //_UART_H diff --git a/tools/mmc-0.5.4/Makefile b/tools/mmc-0.5.4/Makefile new file mode 100644 index 0000000..5e82c24 --- /dev/null +++ b/tools/mmc-0.5.4/Makefile @@ -0,0 +1,406 @@ +# Hey Emacs, this is a -*- makefile -*- +# +# WinAVR makefile written by Eric B. Weddington, J�rg Wunsch, et al. +# Released to the Public Domain +# Please read the make user manual! +# +# Additional material for this makefile was submitted by: +# Tim Henigan +# Peter Fleury +# Reiner Patommel +# Sander Pool +# Frederik Rouleau +# Markus Pfaff +# +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF (for use with AVR Studio 3.x or VMLAB). +# +# make extcoff = Convert ELF to AVR Extended COFF (for use with AVR Studio +# 4.07 or greater). +# +# make program = Download the hex file to the device, using avrdude. Please +# customize the avrdude settings below first! +# +# make filename.s = Just compile filename.c into the assembler code only +# +# To rebuild project do "make clean" then "make all". +# + +# mth 2004/09 +# Differences from WinAVR 20040720 sample: +# - DEPFLAGS according to Eric Weddingtion's fix (avrfreaks/gcc-forum) +# - F_OSC Define in CFLAGS and AFLAGS + + +# MCU name +MCU = atmega168 +#MCU = atmega8 +#MCU = atmega32 + +# Main Oscillator Frequency +# This is only used to define F_OSC in all assembler and c-sources. +#F_OSC = 3686400 + +# Output format. (can be srec, ihex, binary) +FORMAT = ihex + +# Target file name (without extension). +TARGET = main +#TARGET = main_spi + +# List C source files here. (C dependencies are automatically generated.) +SRC =$(TARGET).c command.c uart.c fat.c file.c mmc.c +#SRC =$(TARGET).c + + +# List Assembler source files here. +# Make them always end in a capital .S. Files ending in a lowercase .s +# will not be considered source files but generated files (assembler +# output from the compiler), and will be deleted upon "make clean"! +# Even though the DOS/Win* filesystem matches both .s and .S the same, +# it will preserve the spelling of the filenames, and gcc itself does +# care about how the name is spelled on its command-line. +ASRC = + + + +# Optimization level, can be [0, 1, 2, 3, s]. +# 0 = turn off optimization. s = optimize for size. +# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) +OPT = 2 + +# Debugging format. +# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2. +# AVR (extended) COFF requires stabs, plus an avr-objcopy run. +#DEBUG = stabs +DEBUG = dwarf-2 + +# List any extra directories to look for include files here. +# Each directory must be seperated by a space. +EXTRAINCDIRS = + + +# Compiler flag to set the C Standard level. +# c89 - "ANSI" C +# gnu89 - c89 plus GCC extensions +# c99 - ISO C99 standard (not yet fully implemented) +# gnu99 - c99 plus GCC extensions +CSTANDARD = -std=gnu89 + +# Place -D or -U options here +CDEFS = + +# Place -I options here +CINCS = + + +# Compiler flags. +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CFLAGS = -g$(DEBUG) +CFLAGS += $(CDEFS) $(CINCS) +CFLAGS += -O$(OPT) +#********************************************************************************************** -mcall-prologues +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -mcall-prologues -ffreestanding +#-fsplit-wide-types +CFLAGS += -Wall -Wstrict-prototypes +CFLAGS += -Wa,-adhlns=$(<:.c=.lst) +CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +CFLAGS += $(CSTANDARD) +CFLAGS += -DF_OSC=$(F_OSC) + + + +# Assembler flags. +# -Wa,...: tell GCC to pass this to the assembler. +# -ahlms: create listing +# -gstabs: have the assembler create line number information; note that +# for use in COFF files, additional information about filenames +# and function names needs to be present in the assembler source +# files -- see avr-libc docs [FIXME: not yet described there] +ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs +ASFLAGS += -DF_OSC=$(F_OSC) + + +#Additional libraries. + +# Minimalistic printf version +#PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min + +# Floating point printf version (requires MATH_LIB = -lm below) +#PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt + +#PRINTF_LIB = + +# Minimalistic scanf version +#SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min + +# Floating point + %[ scanf version (requires MATH_LIB = -lm below) +#SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt + +#SCANF_LIB = + +MATH_LIB = -lm + +# External memory options + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# used for variables (.data/.bss) and heap (malloc()). +#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# only used for heap (malloc()). +#EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff +#********************************************************************************************************* -Wl +#EXTMEMOPTS = -Wl,--section-start=bar=0x80002B,--defsym=bazz=0x80002A +#EXTMEMOPTS = -Wl,--defsym=bytesOfSec=0x80004A + +# Linker flags. +# -Wl,...: tell GCC to pass this to linker. +# -Map: create map file +# --cref: add cross reference to map file +LDFLAGS = -Wl,-Map=$(TARGET).map,--cref --relax --combine -fwhole-program +LDFLAGS += $(EXTMEMOPTS) +LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) + + + + + +# --------------------------------------------------------------------------- + +# Define directories, if needed. +#DIRAVR = c:/winavr +#DIRAVRBIN = $(DIRAVR)/bin +#DIRAVRUTILS = $(DIRAVR)/utils/bin +#DIRINC = . +#DIRLIB = $(DIRAVR)/avr/lib + + +# Define programs and commands. +SHELL = sh +CC = /opt/cross/bin/avr-gcc +OBJCOPY = /opt/cross/bin/avr-objcopy +OBJDUMP = /opt/cross/bin/avr-objdump +SIZE = /opt/cross/bin/avr-size +NM = /opt/cross/bin/avr-nm +AVRDUDE = avrdude +REMOVE = rm -f +COPY = cp + + + + +# Define Messages +# English +MSG_ERRORS_NONE = Errors: none +MSG_BEGIN = -------- begin -------- +MSG_END = -------- end -------- +MSG_SIZE_BEFORE = Size before: +MSG_SIZE_AFTER = Size after: +MSG_COFF = Converting to AVR COFF: +MSG_EXTENDED_COFF = Converting to AVR Extended COFF: +MSG_FLASH = Creating load file for Flash: +MSG_EEPROM = Creating load file for EEPROM: +MSG_EXTENDED_LISTING = Creating Extended Listing: +MSG_SYMBOL_TABLE = Creating Symbol Table: +MSG_LINKING = Linking: +MSG_COMPILING = Compiling: +MSG_ASSEMBLING = Assembling: +MSG_CLEANING = Cleaning project: + + + + +# Define all object files. +OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) + +# Define all listing files. +LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) + + +# Compiler flags to generate dependency files. +### GENDEPFLAGS = -Wp,-M,-MP,-MT,$(*F).o,-MF,.dep/$(@F).d +GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d + +# Combine all necessary flags and optional flags. +# Add target processor to flags. + +# ******************************************************************************* -mtiny-stack begrenzt stack auf 256 bytes -fno-inline +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp -mtiny-stack $(ASFLAGS) + + + + + +# Default target. +all: begin gccversion sizebefore build sizeafter finished end + +build: elf hex eep lss sym + +elf: $(TARGET).elf +hex: $(TARGET).hex +eep: $(TARGET).eep +lss: $(TARGET).lss +sym: $(TARGET).sym + + + +# Eye candy. +# AVR Studio 3.x does not check make's exit code but relies on +# the following magic strings to be generated by the compile job. +begin: + @echo + @echo $(MSG_BEGIN) + +finished: + @echo $(MSG_ERRORS_NONE) + +end: + @echo $(MSG_END) + @echo + + +# Display size of file. +HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex +ELFSIZE = $(SIZE) -A $(TARGET).elf +sizebefore: + @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi + +sizeafter: + @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi + + + +# Display compiler version information. +gccversion : + @$(CC) --version + + + +# Program the device. +program: $(TARGET).hex $(TARGET).eep + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) + + + + +# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. +COFFCONVERT=$(OBJCOPY) --debugging \ +--change-section-address .data-0x800000 \ +--change-section-address .bss-0x800000 \ +--change-section-address .noinit-0x800000 \ +--change-section-address .eeprom-0x810000 + + +coff: $(TARGET).elf + @echo + @echo $(MSG_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-avr $< $(TARGET).cof + + +extcoff: $(TARGET).elf + @echo + @echo $(MSG_EXTENDED_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof + + + +# Create final output files (.hex, .eep) from ELF output file. +%.hex: %.elf + @echo + @echo $(MSG_FLASH) $@ + $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ + +%.eep: %.elf + @echo + @echo $(MSG_EEPROM) $@ + -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 -O $(FORMAT) $< $@ + +# Create extended listing file from ELF output file. +%.lss: %.elf + @echo + @echo $(MSG_EXTENDED_LISTING) $@ + $(OBJDUMP) -h -S $< > $@ + +# Create a symbol table from ELF output file. +%.sym: %.elf + @echo + @echo $(MSG_SYMBOL_TABLE) $@ + $(NM) -n $< > $@ + + + +# Link: create ELF output file from object files. +.SECONDARY : $(TARGET).elf +.PRECIOUS : $(OBJ) +%.elf: $(OBJ) + @echo + @echo $(MSG_LINKING) $@ + $(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) + + +# Compile: create object files from C source files. +%.o : %.c + @echo + @echo $(MSG_COMPILING) $< + $(CC) -c $(ALL_CFLAGS) $< -o $@ + + +# Compile: create assembler files from C source files. +%.s : %.c + $(CC) -S $(ALL_CFLAGS) $< -o $@ + + +# Assemble: create object files from assembler source files. +%.o : %.S + @echo + @echo $(MSG_ASSEMBLING) $< + $(CC) -c $(ALL_ASFLAGS) $< -o $@ + + +# Target: clean project. +clean: begin clean_list finished end + +clean_list : + @echo + @echo $(MSG_CLEANING) + $(REMOVE) $(TARGET).hex + $(REMOVE) $(TARGET).eep + $(REMOVE) $(TARGET).obj + $(REMOVE) $(TARGET).cof + $(REMOVE) $(TARGET).elf + $(REMOVE) $(TARGET).map + $(REMOVE) $(TARGET).obj + $(REMOVE) $(TARGET).a90 + $(REMOVE) $(TARGET).sym + $(REMOVE) $(TARGET).lnk + $(REMOVE) $(TARGET).lss + $(REMOVE) $(OBJ) + $(REMOVE) $(LST) + $(REMOVE) $(SRC:.c=.s) + $(REMOVE) $(SRC:.c=.d) + $(REMOVE) .dep/* + + + +# Include the dependency files. +-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) + + +# Listing of phony targets. +.PHONY : all begin finish end sizebefore sizeafter gccversion \ +build elf hex eep lss sym coff extcoff \ +clean clean_list program + diff --git a/tools/mmc-0.5.4/fat.c b/tools/mmc-0.5.4/fat.c new file mode 100644 index 0000000..a1defdf --- /dev/null +++ b/tools/mmc-0.5.4/fat.c @@ -0,0 +1,608 @@ + +#include +#include + +#include "fat.h" +#include "file.h" +#include "hardware.h" + +struct Fat fat; // wichtige daten/variablen der fat +struct File file; // wichtige dateibezogene daten/variablen + + +#if (WRITE==1) + +//*************************************************************************************************************** +// schreibt sektor nummer:sec auf die karte (puffer:sector) !! +// setzt bufferFlag=0 da puffer nicht dirty sein kann nach schreiben ! +//*************************************************************************************************************** +unsigned char fat_writeSector(unsigned long int sec){ + + fat.bufferDirty=0; // buffer kann nicht dirty sein weil wird geschrieben + return(mmc_write_sector(sec,fat.sector)); // schreiben von sektor puffer +} + +#endif + + +// *************************************************************************************************************** +// umrechnung cluster auf 1.sektor des clusters (möglicherweise mehrere sektoren/cluster) ! +// *************************************************************************************************************** +unsigned long int fat_clustToSec(unsigned long int clust){ + + return (fat.dataDirSec+2+((clust-2) * fat.secPerClust)); // errechnet den 1. sektor der sektoren des clusters +} + +// *************************************************************************************************************** +// umrechnung sektor auf cluster (nicht die position im cluster selber!!) +// *************************************************************************************************************** +unsigned long int fat_secToClust(unsigned long int sec){ + + return ((sec-fat.dataDirSec-2+2*fat.secPerClust)/fat.secPerClust); // umkerhrfunktion von fat_clustToSec +} + + +//*************************************************************************************************************** +// läd sektor:sec auf puffer:sector zum bearbeiten im ram ! +// setzt currentSectorNr auf richtigen wert (also den sektor der gepuffert ist). es wird geprüft +// ob der gepufferte sektor geändert wurde, wenn ja muss erst geschrieben werden, um diese daten nicht zu verlieren ! +//*************************************************************************************************************** +unsigned char fat_loadSector(unsigned long int sec){ + + if(sec!=fat.currentSectorNr){ // nachladen nötig + #if (WRITE==1) + if(fat.bufferDirty==1) fat_writeSector(fat.currentSectorNr); // puffer diry, also vorher schreiben + #endif + mmc_read_sector(sec,fat.sector); // neuen sektor laden + fat.currentSectorNr=sec; // aktualisiert sektor nummer (nummer des gepufferten sektors) + return(0); + } + + else return(0); // alles ok, daten sind schon da (sec==fat.currentSectorNr) + + return(1); // fehler +} + + + + + + + +// datei lesen funktionen: + +// fat_loadSector -> fat_loadRowOfSector -> fat_loadFileDataFromCluster -> fat_loadFileDataFromDir -> fat_loadFileDataFromDir -> fat_cd "daten chain" + +//*************************************************************************************************************** +// läd die reihe:row des gepufferten sektors auf das struct:file. dort stehen dann +// alle wichgigen daten wie: 1.cluster,länge bei dateien, name des eintrags, reihen nummer (im sektor), attribut use... +//*************************************************************************************************************** +unsigned char fat_loadRowOfSector(unsigned int row){ + + unsigned char i; + row=row<<5; // multipliziert mit 32 um immer auf zeilen anfang zu kommen (zeile 0=0,zeile 1=32,zeile 2=62 usw). + + void *vsector; // void, damit man schoen umbiegen kann :) + + for(i=0;i<11;i++) + file.name[i]=fat.sector[row+i]; // datei name, ersten 10 bytes vom 32 byte eintrag. + + file.attrib=fat.sector[row+11]; // datei attribut, byte 11. + + vsector=&fat.sector[row+26]; // low word von fist.cluster + file.firstCluster=*(unsigned short*)vsector; + + vsector=&fat.sector[row+20]; // high word von first.cluster + file.firstCluster|=(*(unsigned short*)vsector)<<16; + + vsector=&fat.sector[row+28]; // 4 byte von file.length + file.length=*(unsigned long int*)vsector; + + return(0); +} + + +//*************************************************************************************************************** +// geht reihen weise durch sektoren des clusters mit dem startsektor:sec, und sucht nach der datei mit dem +// namen:name. es werden die einzelnen sektoren nachgeladen auf puffer:sector vor dem bearbeiten. +// wird die datei in dem cluster gefunden ist return 0 , sonst return1. +//*************************************************************************************************************** +unsigned char fat_loadFileDataFromCluster(unsigned long int sec , char name[]){ + + unsigned char r; + unsigned char s=0; + + do{ // sektoren des clusters prüfen + r=0; // neuer sektor, dann reihen von 0 an. + mmc_read_sector(sec+s,fat.sector); // läd den sektor sec auf den puffer fat.sector + fat.currentSectorNr=sec+s; // setzen des aktuellen sektors + do{ // reihen des sektors prüfen + fat_loadRowOfSector(r); // zeile 0-15 auf struct file laden + if(file.name[0]==0){ // wenn man auf erste 0 stößt müsste der rest auch leer sein! + file.row=r; // zeile sichern. + return(1); + } + if(0==strncmp((char*)file.name,name,10)){ // zeile r ist gesuchte + file.row=r; // zeile sichern. + return(0); + } + r++; + }while(r<16); // zählt zeilennummer (16(zeilen) * 32(spalten) == 512 bytes des sektors) + s++; + }while(s neuer cluster nötig. + + dir=fat_secToClust(fat.startSectors); // dir ist jetzt neuer cluster zum verketten ! + fat_setCluster(start,dir); // cluster-chain mit neuem cluster verketten + fat_setCluster(dir,0x0fffffff); // cluster-chain ende markieren + + //es muessen neue gesucht werden, weil der bekannte aus file.c ja grade verkettet wurden. datei eintrag passte nicht mehr ins dir... + fat_getFreeClustersInRow(2); // neue freie cluster suchen, für datei. + file.firstCluster=fat_secToClust(fat.startSectors); // 1. cluster der datei + file.lastCluster=fat_secToClust(fat.endSectors); // letzter bekannter cluster der datei + + fat.currentSectorNr=fat_clustToSec(dir); // setzen des richtigen sektors, also auf den 1. der neu verketteten + + unsigned int j=511; + do{ + fat.sector[j]=0x00; //schreibt puffer fat.sector voll mit 0x00==leer + }while(j--); + + unsigned char i=1; // ab 1 weil der 1.sektor des clusters eh noch beschrieben wird... + do{ + fat_writeSector(fat.currentSectorNr+i); // löschen des cluster (überschreibt mit 0x00), wichtig bei ffls, + i++; + }while(i>16;// low word von cluster + + vsector=&fat.sector[row+22]; + *(unsigned long int*)vsector=0x01010101; // unnoetige felder beschreiben + + vsector=&fat.sector[row+26]; + *(unsigned short*)vsector=(cluster&0x0000ffff); // high word von cluster + + vsector=&fat.sector[row+28]; + *(unsigned long int*)vsector=length; // laenge +} + + +//*************************************************************************************************************** +// macht den datei eintrag im jetzigen verzeichniss (fat.dir). +// file.row enthält die reihen nummer des leeren eintrags, der vorher gesucht wurde, auf puffer:sector ist der gewünschte +// sektor gepuffert. für fat16 im root dir muss andere funktion genutzt werden, als fat_getFreeRowOfDir (durchsucht nur dirs). +// fat.rootDir enthält bei fat32 den start cluster des directory, bei fat16 den 1. sektor des rootDir bereichs! +//*************************************************************************************************************** +void fat_makeFileEntry(char name[],unsigned char attrib,unsigned long int length){ + + unsigned int s; // zähler für root dir sektoren fat16 + + if(fat.dir==0&&fat.fatType==32)fat_getFreeRowOfDir(fat.rootDir); // IM ROOT DIR (fat32) + + else if(fat.dir==0 && fat.fatType==16){ // IM ROOT DIR (fat16) + for(s=0;s<(unsigned int)(fat.dataDirSec+2-fat.rootDir);s++){ // zählt durch RootDir sektoren (errechnet anzahl rootDir sektoren). + if(0==fat_getFreeRowOfCluster(fat.rootDir+s))break; // geht durch sektoren des root dir. + } + } + + else fat_getFreeRowOfDir(fat.dir); // NICHT ROOT DIR fat32/fat16 + + fat_makeRowDataEntry(file.row,name,attrib,file.firstCluster,length); // schreibt file eintrag auf puffer + fat_writeSector(fat.currentSectorNr); // schreibt puffer auf karte +} + +#endif + + + + + +// fat funktionen: + +//*************************************************************************************************************** +// sucht nötige folge Cluster aus der fat ! +// erster daten cluster = 2, ende einer cluster chain 0xFFFF (fat16) oder 0xFFFFFFF, 0xFFFFFF8 (fat32), +// stelle des clusters in der fat, hat als wert, den nächsten cluster. (1:1 gemapt)! +//*************************************************************************************************************** +unsigned long int fat_getNextCluster(unsigned long int oneCluster){ + + // FAT 16**************FAT 16 + if(fat.fatType==16){ + unsigned long int i=oneCluster>>8;; // (i=oneCluster/256)errechnet den sektor der fat in dem oneCluster ist (rundet immer ab) + unsigned long int j=(oneCluster<<1)-(i<<9); // (j=(oneCluster-256*i)*2 == 2*oneCluster-512*i)errechnet das low byte von oneCluster + + if(0==fat_loadSector(i+fat.fatSec)){ // ob neu laden nötig, wird von fat_loadSector geprüft + void *bytesOfSec=&fat.sector[j]; // zeiger auf puffer + return *(unsigned short*)bytesOfSec; // da der ram auch little endian ist, kann einfach gecastet werden und gut :) + } + } + + // FAT 32**************FAT 32 + else{ + unsigned long int i=oneCluster>>7; // (i=oneCluster/128)errechnet den sektor der fat in dem oneCluster ist (rundet immer ab) + unsigned long int j=(oneCluster<<2)-(i<<9); // (j=(oneCluster-128*i)*4 == oneCluster*4-512*i)errechnet das low byte von oneCluster + + if(0==fat_loadSector(i+fat.fatSec)){ // ob neu laden nötig wird von fat_loadSector geprüft + void *bytesOfSec=&fat.sector[j]; // zeiger auf puffer + return *(unsigned long int*)bytesOfSec; // da der ram auch little endian ist, kann einfach gecastet werden und gut :) + } + } + + return(0); +} + + +//*************************************************************************************************************** +// sucht verkettete cluster einer datei, die in einer reihe liegen. worst case: nur ein cluster. +// sieht in der fat ab dem cluster offsetCluster nach. sucht die anzahl von MAX_CLUSTERS_IN_ROW, +// am stück,falls möglich. prüft ob der cluster neben offsetCluster dazu gehört... +// setzt dann fat.endSectors und fat.startSectors. das -1 weil z.b. [95,98] = {95,96,97,98} = 4 sektoren +//*************************************************************************************************************** +void fat_getFatChainClustersInRow(unsigned long int offsetCluster){ + + unsigned int i=0; + fat.startSectors=fat_clustToSec(offsetCluster); // setzen des 1. sektors der datei + fat.endSectors=fat.startSectors; + do{ + if( (offsetCluster+1+i)==fat_getNextCluster(offsetCluster+i) ) fat.endSectors+=fat.secPerClust; // zählen der zusammenhängenden sektoren + else { + file.lastCluster=offsetCluster+i; // cluster daneben gehört nicht dazu, somit ist offset+i der letzte bekannte + break; + } + }while(i++>8; // (i=cluster/256)errechnet den sektor der fat in dem cluster ist (rundet immer ab) + unsigned long int j=(cluster<<1)-(i<<9); // (j=(cluster-256*i)*2 == 2*cluster-512*i)errechnet das low byte von cluster + + if(0==fat_loadSector(i+fat.fatSec)){ // neu laden (fat_loadSector prüft ob schon gepuffert) + void *bytesOfSec=&fat.sector[j]; // init des zeigers auf unterste adresse + *(unsigned short*)bytesOfSec=content;// weil ram auch little endian geht das so :) + fat.bufferDirty=1; // zeigt an, dass im aktuellen sector geschrieben wurde + } + } + + // FAT 32**************FAT 32 + else{ + unsigned long int i=cluster>>7; // (i=cluster/128)errechnet den sektor der fat in dem cluster ist (rundet immer ab) + unsigned long int j=(cluster<<2)-(i<<9); //(j=(cluster-128*i)*4 == cluster*4-512*i)errechnet das low byte von cluster + + if(0==fat_loadSector(i+fat.fatSec)){ // neu laden (fat_loadSector prüft ob schon gepuffert) + void *bytesOfSec=&fat.sector[j]; // init des zeigers auf unterste adresse + *(unsigned long int*)bytesOfSec=content; // weil ram auch little endian geht das so :) + fat.bufferDirty=1; // zeigt an, dass im aktuellen sector geschrieben wurde + } + } +} + + +//*************************************************************************************************************** +// löscht cluster chain, beginnend ab dem startCluster. +// sucht cluster, setzt inhalt usw.. abschließend noch den cluster-chain ende markierten cluster löschen. +//*************************************************************************************************************** +void fat_delClusterChain(unsigned long int startCluster){ + + unsigned long int nextCluster=startCluster; // tmp variable, wegen verketteter cluster.. + + do{ + startCluster=nextCluster; + nextCluster=fat_getNextCluster(startCluster); + fat_setCluster(startCluster,0x00000000); + }while(!((nextCluster==0xfffffff&&fat.fatType==32)||(nextCluster==0xffff&&fat.fatType==16))); + fat_writeSector(fat.currentSectorNr); +} + +#endif + + +//*************************************************************************************************************** +// Initialisiert die Fat(16/32) daten, wie: root directory sektor, daten sektor, fat sektor... +// siehe auch Fatgen103.pdf. ist NICHT auf performance optimiert! +// byte/sector, byte/cluster, anzahl der fats, sector/fat ... (halt alle wichtigen daten zum lesen ders datei systems!) +//*****************************************************************<********************************************** +unsigned char fat_loadFatData(unsigned long int sec){ + + // offset,size + unsigned int rootEntCnt; // 17,2 größe die eine fat belegt + unsigned int fatSz16; // 22,2 sectors occupied by one fat16 + unsigned long int fatSz32; // 36,4 sectors occupied by one fat32 + + void *vsector; + + if(0==mmc_read_sector(sec,fat.sector)){ // lesen von fat sector und bestimmen der wichtigen berreiche + + fat.bufferDirty = 0; // init wert des flags + + fat.secPerClust=fat.sector[13]; // fat.secPerClust, 13 only (power of 2) + + vsector=&fat.sector[14]; + fat.fatSec=*(unsigned short*)vsector; + + vsector=&fat.sector[17]; + rootEntCnt=*(unsigned short*)vsector; + + vsector=&fat.sector[22]; + fatSz16=*(unsigned short*)vsector; + + fat.rootDir = (((rootEntCnt <<5) + 512) /512)-1; // ist 0 bei fat 32, sonst der root dir sektor + + if(fat.rootDir==0){ // FAT32 spezifisch (die prüfung so, ist nicht spezifikation konform !). + + vsector=&fat.sector[36]; + fatSz32=*(unsigned long int *)vsector; + + vsector=&fat.sector[44]; + fat.rootDir=*(unsigned long int *)vsector; + + fat.dataDirSec = fat.fatSec + (fatSz32 * fat.sector[16]); // data sector (beginnt mit cluster 2) + fat.fatType=32; // fat typ + } + + else{ // FAT16 spezifisch + fat.dataDirSec = fat.fatSec + (fatSz16 * fat.sector[16]) + fat.rootDir; // data sektor (beginnt mit cluster 2) + fat.rootDir=fat.dataDirSec-fat.rootDir; // root dir sektor, da nicht im datenbereich (cluster) + fat.rootDir+=sec; // addiert den startsektor auf " + fat.fatType=16; // fat typ + } + + fat.fatSec+=sec; // addiert den startsektor auf + fat.dataDirSec+=sec; // addiert den startsektor auf (umrechnung von absolut auf real) + fat.dataDirSec-=2; // zeigt auf 1. cluster + fat.dir=0; // dir auf '0'==root dir, sonst 1.Cluster des dir + return (0); + } + + + return (1); // sector nicht gelesen, fat nicht initialisiert!! +} + + +//************************************************************************************************<<*************** +// int fat sucht den 1. cluster des dateisystems (fat16/32) auch VBR genannt, +//************************************************************************************************<<*************** +unsigned char fat_initfat(void){ + + unsigned long int secOfFirstPartition=0; // ist 1. sektor der 1. partition aus dem MBR + + if(0==mmc_read_sector(0,fat.sector)){ + + void *vsector=&fat.sector[454]; //startsektor bestimmen + secOfFirstPartition=*(unsigned long int*)vsector; + + //prüfung ob man schon im VBR gelesen hat (0x6964654d = "Medi") + if(secOfFirstPartition==0x6964654d) return fat_loadFatData(0); //ist superfloppy + + else {return fat_loadFatData(secOfFirstPartition);} // ist partitioniert... + } + + return (1); +} + + +#if (SMALL_FILE_SYSTEM==0) + +// ***************************************************************************************************************** +// bereitet str so auf, dass man es auf die mmc/sd karte schreiben kann. +// wandelt z.b. "t.txt" -> "T TXT" oder "main.c" in "MAIN C " => also immer 8.3 und upper case letter +// VORSICHT es werden keine Prüfungen gemacht ! +// ***************************************************************************************************************** +char * fat_str(char *str){ + + unsigned char i; + unsigned char j=0; + unsigned char c; + char tmp[12]; // tmp string zum einfacheren umwandeln + + strcpy(tmp,str); + + for(i=0;i<11;i++)str[i]=' '; // als vorbereitung alles mit leerzeichen füllen + str[11]='\0'; + + i=0; + + do{ + c=toupper(tmp[j]); + if(c=='\0')return str; + if(c!='.')str[i]=c; + else i=7; + i++; + j++; + }while(i<12); + + return str; + +} + +#endif + diff --git a/tools/mmc-0.5.4/fat.h b/tools/mmc-0.5.4/fat.h new file mode 100644 index 0000000..d05aa3b --- /dev/null +++ b/tools/mmc-0.5.4/fat.h @@ -0,0 +1,76 @@ + +#ifndef _FAT_H + + #define _FAT_H + + // ************************************************************************************************************************** + // WICHTIGE SCHLATER: -> hier kann die code größe angepasst werden, zu lasten der funktionalität ! + #define SMALL_FILE_SYSTEM 0 // wenn 1 dann ist kleines file system, wenn 0 dann komplette file unterstützung ! + #define WRITE 1 // wenn 1 dann ist write an, wenn 0 dann read only ! + #define OVER_WRITE 1 // wenn 1 dann kann ffwrite dateien überschreiben (nicht performant), wenn 0 dann nur normales schreiben ! + #define MAX_CLUSTERS_IN_ROW 256 // gibt an wie viele cluster am stück ohne fat lookup geschrieben bzw gelesen werden können, wenn die fat nicht fragmentiert ist ! + + // 1. fat_getFreeRowOfCluster -> fat_getFreeRowOfDir -> fat_makeRowDataEntry -> fat_makeFileEntry -> fat_writeSector "eintrag gemacht !!" + // 2. fat_loadSector -> fat_loadRowOfSector -> fat_loadFileDataFromCluster -> fat_loadFileDataFromDir (-> fat_cd) "daten chain" + + // ************************************************************************************************************************** + // funktionen + + extern unsigned long int fat_clustToSec(unsigned long int); // rechnet cluster zu 1. sektor des clusters um + extern unsigned long int fat_secToClust(unsigned long int sec); // rechnet sektor zu cluster um! + extern unsigned long int fat_getNextCluster(unsigned long int oneCluster); // fat auf nächsten, verketteten cluster durchsuchen + extern unsigned char fat_initfat(void); // initalisierung (durchsucht MBR oder nicht) + extern unsigned char fat_writeSector(unsigned long int sec); // schreibt sektor auf karte + extern void fat_setCluster(unsigned long int cluster, unsigned long int content); // setzt cluster inhalt in der fat + extern void fat_delClusterChain(unsigned long int startCluster); // löscht cluster-chain in der fat + extern void fat_getFreeRowOfDir(unsigned long int dir); // durchsucht directory nach feiem eintrag + extern void fat_makeFileEntry(char name[],unsigned char attrib,unsigned long int length); + extern unsigned char fat_loadSector(unsigned long int sec); // läd übergebenen absoluten sektor + extern unsigned char fat_loadFileDataFromDir(char name[]); // durchsucht das aktuelle directory + extern unsigned char fat_cd(char *); // wechselt directory (start im rootDir) + extern unsigned char fat_loadFatData(unsigned long int); // läd fat daten + extern unsigned char fat_getFreeRowOfCluster(unsigned long secStart);// durchsucht cluster nach freiem eintrag + extern void fat_getFreeClustersInRow(unsigned long int offsetCluster); // sucht zusammenhängende freie cluster aus der fat + extern void fat_getFatChainClustersInRow(unsigned long int offsetCluster); // sucht fat-chain cluster die zusammenhängen + extern void fat_makeRowDataEntry(unsigned int row,char name[],unsigned char attrib,unsigned long int cluster,unsigned long int length); + extern unsigned char fat_loadRowOfSector(unsigned int); // läd reihe des geladen sektors auf struct:file + extern unsigned char fat_loadFileDataFromCluster(unsigned long int sec , char name[]); // durchsucht die reihen des geladenen sektors + extern void fat_setClusterChain(unsigned long int newOffsetCluster,unsigned int length); + extern char *fat_str(char *str); // wandelt einen string so, dass er der fat konvention entspricht ! + + + // ************************************************************************************************************************** + // variablen + + extern struct Fat{ // fat daten (1.cluster, root-dir, dir usw.) + unsigned char sector[512]; // der puffer für sektoren ! + unsigned char bufferDirty; // puffer wurde beschrieben, sector muss geschrieben werden bevor er neu geladen wird + unsigned long int currentSectorNr;// aktuell geladener Sektor (in sector) //beschleunigt wenn z.b 2* 512 byte puffer vorhanden, oder bei fat operationen im gleichen sektor + unsigned long int dir; // Direktory zeiger rootDir=='0' sonst(1.Cluster des dir; start auf root) + unsigned long int rootDir; // Sektor(f16)/Cluster(f32) nr root directory + unsigned long int dataDirSec; // Sektor nr data area + unsigned long int fatSec; // Sektor nr fat area + unsigned long int startSectors; // der erste sektor in einer reihe (freie oder verkettete) + unsigned long int endSectors; + unsigned char secPerClust; // anzahl der sektoren pro cluster + unsigned char fatType; // fat16 oder fat32 (16 oder 32) + }fat; + + extern struct File{ // datei infos + unsigned int cntOfBytes; // -nicht direkt aus dem dateisystem- zäht geschriebene bytes eines sektors + unsigned char name[13]; // 0,10 datei Name.ext (8.3 = max 11)(MUSS unsigned char weil E5) + unsigned char attrib; // 11,1 datei Attribut: 8=value name, 32=datei, 16=Verzeichniss, 15=linux kleingeschrieben eintrag + unsigned char row; // reihe im sektor in der die datei infos stehen (reihe 0-15) + unsigned long int firstCluster; // 20,2 /26,2 datei 1.cluster hi,low(möglicherweise der einzige) (4-byte) + unsigned long int length; // 28,4 datei Länge (4-byte) + unsigned long int lastCluster; // -nicht direkt aus dem dateisystem- letzter cluster der ersten kette + unsigned long int seek; // schreib position in der datei + }file; + +#endif + + + + + + diff --git a/tools/mmc-0.5.4/file.c b/tools/mmc-0.5.4/file.c new file mode 100644 index 0000000..e4de5c7 --- /dev/null +++ b/tools/mmc-0.5.4/file.c @@ -0,0 +1,469 @@ +#include +#include + +#include "main.h" +#include "hardware.h" +#include "fat.h" +#include "file.h" + + + +//******************************************************************************************************************************* +// 2 möglichkeiten beim öffnen, datei existiert(return 1) oder muss angelegt werden(return 2) +// zuerst wird geprüft ob es die datei im verzeichniss gibt. danach wird entschieden, ob die datei geöffnet wird oder angelegt. +// -beim offnen werden die bekannten cluster gesucht maximal MAX_CLUSTERS_IN_ROW in reihe. dann wird der 1. sektor der datei auf +// den puffer fat.sector geladen. jetzt kann man ffread lesen... +// -beim anlegen werden freie cluster gesucht, maximal MAX_CLUSTERS_IN_ROW in reihe. dann wird das struct file gefüllt. +// danach wird der dateieintrag gemacht(auf karte). dort wird auch geprüft ob genügend platz im aktuellen verzeichniss existiert. +// möglicherweise wird der 1. cluster der datei nochmal geändert. jetzt ist der erste frei sektor bekannt und es kann geschrieben werden. +//******************************************************************************************************************************* +unsigned char ffopen(char name[]){ + + unsigned char file_flag=fat_loadFileDataFromDir(name); //prüfung ob datei vorhanden und evetuelles laden des file struct + + if( file_flag==0 ){ /** Datei existiert, anlegen nicht nötig! **/ + fat_getFatChainClustersInRow( file.firstCluster ); // verkettete cluster aus der fat-chain suchen. + fat_loadSector( fat_clustToSec(file.firstCluster) ); // lät die ersten 512 bytes der datei auf puffer:sector. + file.lastCluster=fat_secToClust(fat.endSectors); // letzter bekannter cluster der datei + return 1; + } + + #if (WRITE==1) // anlegen ist schreiben ! + else{ /** Datei existiert nicht, also anlegen ! (nur wenn schreiben option an ist)**/ + fat_getFreeClustersInRow(2); // leere cluster suchen, ab cluster 2. + strcpy((char*)file.name,(char*)name); // --- füllen des file struct, zum abschließenden schreiben. + file.firstCluster=fat_secToClust(fat.startSectors); // 1. cluster der datei + file.lastCluster=file.firstCluster;//fat_secToClust(fat.endSectors); // letzter bekannter cluster der datei + file.attrib=32; // --- file.row wird in der funktion fat_getFreeRowOfDir geschrieben !! + file.length=0; // damit da nix drin steht ^^ + fat_makeFileEntry((char *)file.name,file.attrib,0); // DATEI ANLEGEN auf karte + fat.currentSectorNr=fat_clustToSec(file.firstCluster); // setzen des ersten sektors + return 2; + } + #endif +} + + +//******************************************************************************************************************************* +// schließt die datei operation ab. eigentlich nur nötig wenn geschrieben wurde. es gibt 2 möglichkeiten : +// 1. die datei wird geschlossen und es wurde über die alte datei länge hinaus geschrieben. +// 2. die datei wird geschlossen und man war innerhalb der datei größe, dann muss nur der aktuelle sektor geschrieben werden. +// der erste fall ist komplizierter, weil ermittelt werden muss wie viele sektoren neu beschrieben wurden um diese zu verketten +// und die neue datei länge muss ermitt weden. abschließend wird entweder (fall 2) nur der aktuelle sektor geschrieben, oder +// der aktuallisierte datei eintrag und die cluster (diese werden verkettet, siehe fileUpdate() ). +//******************************************************************************************************************************* +unsigned char ffclose(void){ + + #if (WRITE==1) /** 2 möglichkeiten beim schließen !! (lesend spielt keine rolle, nichts muss geupdatet werden) **/ + + if( file.length < (file.seek+file.cntOfBytes) ) fileUpdate(); /** 1.) es wurde über die alte datei größe hinaus geschrieben **/ + + else if( fat.bufferDirty==1) fat_writeSector( fat.currentSectorNr ); /** 2.) nicht über alte datei länge hinaus **/ + + #endif + + file.cntOfBytes=0; // init werte der nötigen zähler + file.seek=0; + return(0); +} + +// ******************************************************************************************************************************* +// updatet datei eintrag auf der karte und verkettet die dazugehörigen fat cluster. +// füllt den aktuell beschriebenen sektor mit 0x00, da sonst die datei nicht richtig angezeigt wird. +// darf nur während schreibe operationen aufgerufen werden ! +// ******************************************************************************************************************************* +void fileUpdate(void){ + + unsigned int comp_cntOfBytes=file.cntOfBytes; // sicher nötig wegen schleife... + while( comp_cntOfBytes < 512 ){ // sektor ist beschrieben worden, daher nötigenfalls mit 00 füllen + fat.sector[comp_cntOfBytes]=0x00; // beschreibt ungenutzte bytes mit 0x00 + comp_cntOfBytes++; + } + char name[13]; // zum sichern des dateinamens + unsigned long int save_length = file.cntOfBytes + file.seek; // muss gesichert werden, wird sonst von der karte geladen und verändert ! + strcpy(name,(char *)file.name); // muss gesichert werden, wird sonst von der karte geladen und verändert ! + + fat_setClusterChain(fat_secToClust(fat.startSectors),fat_secToClust(fat.currentSectorNr)); // verketten der geschriebenen cluster + fat_loadFileDataFromDir(name); // läd sektor, des datei eintrags, und läd daten von karte auf struct file! + fat_makeRowDataEntry(file.row,name,32,file.firstCluster,save_length); // macht eintrag im puffer + + fat_writeSector(fat.currentSectorNr); +} + + +// ******************************************************************************************************************************* +// offset byte wird übergeben. es wird durch die sektoren der datei gespult (gerechnet), bis der sektor mit dem offset byte erreicht +// ist, dann wird der sektor geladen und der zähler für die bytes eines sektors gesetzt. wenn das byte nicht in den sektoren ist, +// die "vorgesucht" wurden, müssen noch weitere sektoren der datei gesucht werden (sec > fat.endSectors). +// ******************************************************************************************************************************* +void ffseek(unsigned long int offset){ + + #if (OVER_WRITE==1) // man muss den dateieintrag updaten, um die daten zu retten !! + if( file.seek > file.length ) fileUpdate(); // fat verketten und datei update auf der karte ! + #endif + + fat_getFatChainClustersInRow(file.firstCluster); // suchen von anfang der cluster chain aus ! + unsigned long int sec=fat.startSectors; // sektor variable zum durchgehen durch die sektoren + file.seek=0; // weil auch von anfang an der chain gesucht wird mit 0 initialisiert + + while(offset>=512){ /** suchen des sektors in dem offset ist **/ + sec++; // da byte nicht in diesem sektor ist, muss hochgezählt werden + offset-=512; // ein sektor weniger in dem das byte sein kann + file.seek+=512; // file.seek update, damit bei ffclose() die richtige file.length herauskommt + if ( sec > fat.endSectors ){ // es müssen mehr sektoren der datei gesucht werden + fat_getFatChainClustersInRow(fat_getNextCluster( file.lastCluster ) ); // nachladen von clustern in der chain + sec=fat.startSectors; // setzen des 1. sektors der neu geladenen, zum weitersuchen ! + } + } + file.lastCluster=fat_secToClust(fat.endSectors); // letzter bekannter cluster der datei + fat_loadSector(sec); // sektor mit offset byte laden + file.cntOfBytes = offset; // setzen des lese zählers +} + + + + +#if (SMALL_FILE_SYSTEM==0) + +// ******************************************************************************************************************************* +// wechselt verzeichniss. start immer im root Dir. +// MUSS in das direktory gewechselt werden, in dem die datei zum lesen/schreiben ist ! +// ******************************************************************************************************************************* +unsigned char ffcd(char name[]){ + return(fat_cd(name)); +} + + +// ******************************************************************************************************************************* +// zeigt reihen eines clusters an, wird für ffls benötigt ! +// es wird ab dem start sektor start_sec, der dazugehörige cluster angezeigt. geprüft wird ob es ein richtiger +// eintrag in der reihe ist (nicht gelöscht, nicht frei usw). die sektoren des clusters werden nachgeladen. +// die dateien werden mit namen und datei größe angezeigt. +// ******************************************************************************************************************************* +void lsRowsOfClust (unsigned long int start_sec){ + + unsigned char row; // reihen + unsigned char sec=0; // sektoren + unsigned char tmp[12]; // tmp string zur umwandlung + + do{ + fat_loadSector(start_sec + sec); // sektoren des clusters laden + for(row=0;row<16;row++){ // geht durch reihen des sektors + fat_loadRowOfSector(row); // reihe eines sektors (auf dem puffer) laden + if( (file.attrib==0x20||file.attrib==0x10) && (file.name[0]!=0xE5 && file.name[0]!=0x00) ){ + uputs(file.name); + uputc(' '); + ultoa(file.length,(char*)tmp,10); + uputs(tmp); + uputc('\n'); + } + } + }while(++sec=0){ // gibt es einen eintrag davor ? + if(fat.sector[(file.row<<5)-21]==0x0f)fat.sector[(file.row<<5)-32]=0xE5; // langer datei eintag auch gelöscht. + } + fat.bufferDirty=1; // eintrag in puffer gemacht. + if(0==fat_getNextCluster(file.firstCluster)) return(0); // 1.cluster ist leer ?!? + fat_delClusterChain(file.firstCluster); // löscht die zu der datei gehörige cluster-chain aus der fat. + return(0); + } + + //TODO noch nicht optimal. zu viele schreib vorgänge beim löschen von datei einträgen. max bis zu 16/sektor ! + else{ // ist ordner, dann rekursiv löschen !! + #ifndef __AVR_ATmega8__ // mega8 zu klein für die funktionalität.... + unsigned long int parent; + unsigned long int own; + unsigned long int clustsOfDir; // um durch die cluster chain eines dirs zu gehen. + unsigned char cntSecOfClust=0; + unsigned char i=0; + + fat.sector[file.row<<5]=0xE5; // löscht dir eintrag + if((file.row-1)>=0){ // gibt es einen eintrag davor (langer datei eintrag)? + if(fat.sector[(file.row<<5)-21]==0x0f)fat.sector[(file.row<<5)-32]=0xE5; // langer datei eintag auch gelöscht + } + fat.bufferDirty=1; // puffer eintrag gemacht + + parent=fat.dir; // der ordner in dem der zu löschende ordner ist. + own=file.firstCluster; // der 1. cluster des ordners der zu löschen ist. + clustsOfDir=file.firstCluster; // die "cluster" des zu löschenden ordners + + do{ // geht durch cluster des dirs + fat_loadSector(fat_clustToSec(clustsOfDir)); // sektor des dirs laden + do{ // geht durch sektoren des clusters + do{ // geht durch reihen des sektors + fat_loadRowOfSector(i); + + if(file.attrib!=0x10 && file.attrib!=0x00 && file.name[0]!=0xE5){ // ist kein ordner,noch nicht gelöscht, kein freier eintrag + fat.sector[i<<5]=0xE5; // erster eintrag der reihe als gelöscht markiert + fat.bufferDirty=1; // puffer eintrag gemacht + if(file.attrib==0x20){ // ist datei! + fat_delClusterChain(file.firstCluster); // ist datei, dann cluster-chain der datei löschen + fat_loadSector(fat_clustToSec(clustsOfDir)+cntSecOfClust); // sektor neu laden, weil löschen der chain, den puffer nutzt. + } + } + + if(file.attrib==0x10 && file.name[0]=='.'){ // "." oder ".." eintrag erkannt, löschen ! + fat.sector[i<<5]=0xE5; // eintrag als gelöscht markiert + fat.bufferDirty=1; // puffer eintrag gemacht + } + + if(file.attrib==0x10 && file.name[0]!='.' && file.name[0]!=0xE5 && file.name[0]!=0){ // ordner erkannt ! + fat.sector[i<<5]=0xE5; // dir eintrag als gelöscht markiert + fat.bufferDirty=1; // puffer eintrag gemacht + fat_loadSector(fat_clustToSec(file.firstCluster)); // sektor des dirs laden + clustsOfDir=file.firstCluster; // eigenes dir ist file.firstCluster + own=file.firstCluster; // eigener start cluster/dir + fat_loadRowOfSector(1); // ".." laden um parent zu bestimmen + parent=file.firstCluster; // parent sichern. + cntSecOfClust=0; // init von gelesenen sektoren und reihen ! + i=0; + continue; + } + + if(file.name[0]==0x00){ // ende des dirs erreicht, wenn nicht voll !! + if(parent==fat.dir){ // erfolgreich alles gelöscht + fat_delClusterChain(own); // cluster chain des ordners löschen + return(0); + } + fat_delClusterChain(own); // cluster chain des ordners löschen + clustsOfDir=parent; // parent ist jetzt wieder arbeisverzeichniss. + own=parent; // arbeitsverzeichniss setzten + fat_loadSector(fat_clustToSec(own)); // sektor des dirs laden + fat_loadRowOfSector(1); // ".." laden um parent zu bestimmen + parent=file.firstCluster; // parent sichern. + cntSecOfClust=0; // init von gelesenen sektoren und reihen ! + i=0; + continue; + } + + i++; + }while(i<16); // geht durch reihen des sektors. + + i=0; // neuer sektor -> reihen von vorne. + cntSecOfClust++; + fat_loadSector(fat_clustToSec(clustsOfDir)+cntSecOfClust); // läd sektoren des clusters nach + }while(cntSecOfClust sektoren von vorne. + clustsOfDir=fat_getNextCluster(clustsOfDir); // sucht neuen cluster der cluster-chain. + }while( !((clustsOfDir==0xfffffff && fat.fatType==32) || (clustsOfDir==0xffff && fat.fatType==16)) ); // geht durch cluster des dirs. + fat_delClusterChain(own); // hier landet man, wenn der ordner voll war (auf cluster "ebene")!! + #endif + } + + } + + + return(1); // fehler, nicht gefunden? +} + +#endif + + +//******************************************************************************************************************************* +// liest 512 bytes aus dem puffer fat.sector. dann werden neue 512 bytes der datei geladen, sind nicht genügend verkettete +// sektoren in einer reihe bekannt, wird in der fat nachgeschaut. dann werden weiter bekannte nachgeladen... +//******************************************************************************************************************************* +inline unsigned char ffread(void){ + + if(file.cntOfBytes==512){ /** EINEN SEKTOR GLESEN (ab hier 2 möglichkeiten !) **/ + file.cntOfBytes=0; // byte zähler zurück setzen + if( fat.currentSectorNr == fat.endSectors ){ /** 1.) nötig mehr sektoren der chain zu laden (mit ein bisschen glück nur alle 512*MAX_CLUSTERS_IN_ROW bytes)**/ + fat_getFatChainClustersInRow(fat_getNextCluster(fat_secToClust( fat.endSectors) )); // nachladen von clustern in der chain + fat.currentSectorNr=fat.startSectors-1; // setzen des nächsten sektors um weiter lesen zu können.. + } + fat_loadSector(fat.currentSectorNr+1); /** 2.) die bekannten in einer reihe reichen noch.(nur alle 512 bytes)**/ + } + + return fat.sector[file.cntOfBytes++]; // rückgabe, byte des sektors (NACH rückgabe erhöhen von zähler ! ) +} + + +#if (WRITE==1) +#if (OVER_WRITE==0) // nicht überschreibende write funktion + +//******************************************************************************************************************************* +// schreibt 512 byte blöcke auf den puffer fat.sector. dann wird dieser auf die karte geschrieben. wenn genügend feie +// sektoren zum beschreiben bekannt sind(datenmenge zu groß), muss nicht in der fat nachgeschaut werden. sollten nicht genügend +// zusammenhängende sektoren bekannt sein, werden die alten verkettet und neue gesucht. es ist nötig sich den letzten bekannten +// einer kette zu merken -> file.lastCluster, um auch nicht zusammenhängende cluster verketten zu können (fat_setClusterChain macht das)! +//******************************************************************************************************************************* +inline void ffwrite(unsigned char c){ + + fat.sector[file.cntOfBytes++]=c; // schreiben des chars auf den puffer sector und zähler erhöhen (pre-increment) + fat.bufferDirty=1; // puffer dirty weil geschrieben und noch nicht auf karte. + + if( file.cntOfBytes==512 ){ /** SEKTOR VOLL ( 2 möglichkeiten ab hier !) **/ + file.cntOfBytes=0; // rücksetzen des sektor byte zählers + mmc_write_sector(fat.currentSectorNr,fat.sector); /** 1.) vollen sektor auf karte schreiben **/ + fat.bufferDirty=0; // puffer jetzt clear, weil grade alles geschrieben. + file.seek+=512; // position in der datei erhöhen, weil grade 512 bytes geschrieben + if( fat.currentSectorNr==fat.endSectors ){ /** 2.) es ist nötig, neue freie zu suchen und die alten zu verketten (mit ein bischen glück nur alle 512*MAX_CLUSTERS_IN_ROW bytes) **/ + fat_setClusterChain( fat_secToClust(fat.startSectors) , fat_secToClust(fat.endSectors) ); // verketten der beschriebenen + fat_getFreeClustersInRow(file.lastCluster); // suchen von leeren sektoren. + fat.currentSectorNr=fat.startSectors-1; // setzen des 1. sektors der neuen reihe zum schreiben. + } + fat.currentSectorNr++; // nächsten sektor zum beschreiben. + } +} + +#endif + +#if (OVER_WRITE==1) // überschreibende write funktion, nicht performant, weil immer auch noch ein sektor geladen werden muss + +//******************************************************************************************************************************* +// schreibt 512 byte blöcke auf den puffer fat.sector. dann wird dieser auf die karte geschrieben. wenn genügend feie +// sektoren zum beschreiben bekannt sind, muss nicht in der fat nachgeschaut werden. sollten nicht genügend zusammenhängende +// sektoren bekannt sein(datenmenge zu groß), werden die alten verkettet und neue gesucht. es ist nötig sich den letzten bekannten einer +// kette zu merken -> file.lastCluster, um auch nicht zusammenhängende cluster verketten zu können (fat_setClusterChain macht das)! +// es ist beim überschreiben nötig, die schon beschriebenen sektoren der datei zu laden, damit man die richtigen daten +// hat. das ist blöd, weil so ein daten overhead von 50% entsteht. da lesen aber schneller als schreiben geht, verliert man nicht 50% an geschwindigkeit. +//******************************************************************************************************************************* +inline void ffwrite(unsigned char c){ + + fat.sector[file.cntOfBytes++]=c; // schreiben des chars auf den puffer sector und zähler erhöhen (pre-increment) + fat.bufferDirty=1; // puffer dirty weil geschrieben und noch nicht auf karte. + + if( file.cntOfBytes==512 ){ /** SEKTOR VOLL ( 2 möglichkeiten ab hier !) **/ + file.cntOfBytes=0; // rücksetzen des sektor byte zählers. + mmc_write_sector(fat.currentSectorNr,fat.sector); /** 1.) vollen sektor auf karte schreiben**/ + fat.bufferDirty=0; // puffer jetzt clear, weil grade alles geschrieben. + file.seek+=512; // position in der datei erhöhen, weil grade 512 bytes geschrieben. + if( fat.currentSectorNr==fat.endSectors ){ /** 2.) es ist nötig, neue freie zu suchen und die alten zu verketten (mit ein bischen glück nur alle 512*MAX_CLUSTERS_IN_ROW bytes) **/ + if( file.seek > file.length ){ // außerhalb der datei !! + fat_setClusterChain( fat_secToClust(fat.startSectors) , fat_secToClust(fat.endSectors) ); // verketten der beschriebenen. + fat_getFreeClustersInRow( file.lastCluster ); // neue leere sektoren benötigt, also suchen. + } + else { + fat_getFatChainClustersInRow( fat_getNextCluster(file.lastCluster) ); // noch innerhalb der datei, deshlab verkettete suchen. + } + fat.currentSectorNr=fat.startSectors-1; // setzen des 1. sektors der neuen reihe zum schreiben. + } + fat.currentSectorNr++; // nächsten sektor zum beschreiben. + mmc_read_sector(fat.currentSectorNr,fat.sector); // wegen überschreiben, muss der zu beschreibende sektor geladen werden... + } +} + +#endif + +// ******************************************************************************************************************************* +// schreibt string auf karte, siehe ffwrite() +// ******************************************************************************************************************************* +inline void ffwrites(const char *s ){ + while (*s) ffwrite(*s++); + } + +#endif + + + + + + + + diff --git a/tools/mmc-0.5.4/file.h b/tools/mmc-0.5.4/file.h new file mode 100644 index 0000000..c8388f2 --- /dev/null +++ b/tools/mmc-0.5.4/file.h @@ -0,0 +1,35 @@ + + + +#ifndef _FILE_H + + #define _FILE_H + + // ************************************************************************************************************************** + // funktionen + + extern inline unsigned char ffread(void); // liest byte-weise aus der datei (puffert immer 512 bytes zwischen) + extern inline void ffwrite(unsigned char c); // schreibt ein byte in die geöffnete datei + extern inline void ffwrites(const char *s ); // schreibt string auf karte + + extern unsigned char ffopen(char name[]); // kann immer nur 1 datei bearbeiten. + extern unsigned char ffclose(void); // muss aufgerufen werden bevor neue datei bearbeitet wird. + + extern void ffseek(unsigned long int offset); // setzt zeiger:bytesOfSec auf position in der geöffneten datei. + extern unsigned char ffcd(char name[]); // wechselt direktory + extern void ffls(void); // zeigt direktory inhalt an + extern unsigned char ffcdLower(void); // geht ein direktory zurück, also cd.. (parent direktory) + extern unsigned char ffrm(char name[]); // löscht datei aus aktuellem verzeichniss. + extern void ffmkdir(char name[]); // legt ordner in aktuellem verzeichniss an. + void lsRowsOfClust (unsigned long int start_sec); // zeigt reihen eines clusters an, ab start_sec + void fileUpdate(void); // updatet datei eintrag auf karte + + // **************************************************************************************************************************// ####################################################################################################################### + + + +#endif + + + + diff --git a/tools/mmc-0.5.4/hardware.h b/tools/mmc-0.5.4/hardware.h new file mode 100644 index 0000000..69785d9 --- /dev/null +++ b/tools/mmc-0.5.4/hardware.h @@ -0,0 +1,12 @@ + +#ifndef _HARDWARE_H +/* +hier sind die beiden hardware abhängigen bibliotheken zu includen ! +welchen umfang diese haben müssen (an funktionen), muss man in den bibliotheken nachsehen. +*/ + #define _HARDWARE_H + #include "uart.h" + #include "mmc.h" + +#endif + diff --git a/tools/mmc-0.5.4/main.c b/tools/mmc-0.5.4/main.c new file mode 100644 index 0000000..e4d1d1d --- /dev/null +++ b/tools/mmc-0.5.4/main.c @@ -0,0 +1,101 @@ + +#include +#include + +#include "main.h" +#include "file.h" +#include "fat.h" +#include "hardware.h" + + +//***************************************************************************************************************** + +void main(void){ + + uinit(); // uart initialisierung + + + uputs((unsigned char*)"\nBoot"); + + while (mmc_init() !=0){ //ist der Rückgabewert ungleich NULL ist ein Fehler aufgetreten + ; + } + + uputs((unsigned char*)"... "); + + if(0==fat_initfat()){ //ist der Rückgabewert ungleich NULL ist ein Fehler aufgetreten + + uputs((unsigned char*)"Ok\n"); // wenn auf dem terminal "Boot... OK" zu lesen ist, ist init ok. jetzt kann man schreiben/lesen + + beispiele(); + } + + +} + +// ***************************************************************************************************************** +void beispiele(void){ + + char datei[12]="TEST TXT"; // hier muss platz für 11 zeichen sein (8.3), da fat_str diesen string benutzt !! + fat_str(datei); // wandelt "test.txt" in das fat format 8.3 der form: "TEST TXT" muss immer dieses Format haben, auch ordner !! + + // 0.) ______________löschen von dateien/ordnern (ordner rekursiv)____________________________________________ + ffrm( datei ); // löschen der datei/ordner falls vorhanden + + // 1.) ______________anlegen und schreiben____________________________________________________________________ + // öffnet datei, wenn nicht vorhanden, legt ffopen datei an (rückgabewert = 1 datei existiert, also nur öffnen, 2 = angelegt). + ffopen( datei ); + + // schreibt string + ffwrites((char*)"Hallo Datei :)"); + // neue zeile in der datei + ffwrite(0x0D); + ffwrite(0x0A); + + // schließt datei + ffclose(); + + // 2.)________________ändern von vorhandenen daten in dateien__________________________________________________ + ffopen( datei ); // siehe oben... + ffseek(12); // spult in datei auf position 12 vor (fängt immer bei 0 an zu zählen !) + ffwrite(';'); // schreibt dann ab position 12 (überschreibt daten der datei, hier nur 1 zeichen) + ffclose(); // schließt datei + + // 3.)________________lesen von dateien_________________________________________________________________________ + ffopen( datei ); // siehe oben... + unsigned long int seek=file.length; // eine variable setzen und runterzählen bis 0 geht am schnellsten ! + do{ + uputc(ffread()); // liest ein zeichen und gibt es über uart aus ! + }while(--seek); // liest solange bytes da sind (von datei länge bis 0) + ffclose(); // schließt datei + + uputc('\n'); // neue zeile weil neue unteraufgabe + + // 4.)________________anhängen von daten an datei_______________________________________________________________ + ffopen( datei); // siehe oben... + ffseek(file.length); // spult in datei ans ende + ffwrites((char*)"Dies ist ein Test..."); // siehe oben + // neue zeile in der datei + ffwrite(0x0D); + ffwrite(0x0A); + ffclose(); // schließt datei + + // 3.)________________lesen von dateien_________________________________________________________________________ + ffopen( datei ); // siehe oben... + seek=file.length; // eine variable setzen und runterzählen bis 0 geht am schnellsten ! + do{ + uputc(ffread()); // liest ein zeichen und gibt es über uart aus ! + }while(--seek); // liest solange bytes da sind (von datei länge bis 0) + ffclose(); // schließt datei + +} + +// ***************************************************************************************************************** + + + + + + + + diff --git a/tools/mmc-0.5.4/main.h b/tools/mmc-0.5.4/main.h new file mode 100644 index 0000000..f274cb6 --- /dev/null +++ b/tools/mmc-0.5.4/main.h @@ -0,0 +1,11 @@ +#include +#include + + +#ifndef _MAIN_H + + #define _MAIN_H + + #define F_CPU 16000000 + +#endif diff --git a/tools/mmc-0.5.4/mmc.c b/tools/mmc-0.5.4/mmc.c new file mode 100644 index 0000000..c09832e --- /dev/null +++ b/tools/mmc-0.5.4/mmc.c @@ -0,0 +1,272 @@ +/*####################################################################################### +Connect AVR to MMC/SD + +Copyright (C) 2004 Ulrich Radig + +Bei Fragen und Verbesserungen wendet euch per EMail an + +mail@ulrichradig.de + +oder im Forum meiner Web Page : www.ulrichradig.de + +Dieses Programm ist freie Software. Sie k�nnen es unter den Bedingungen der +GNU General Public License, wie von der Free Software Foundation ver�ffentlicht, +weitergeben und/oder modifizieren, entweder gem�� Version 2 der Lizenz oder +(nach Ihrer Option) jeder sp�teren Version. + +Die Ver�ffentlichung dieses Programms erfolgt in der Hoffnung, +da� es Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, +sogar ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT +F�R EINEN BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License. + +Sie sollten eine Kopie der GNU General Public License zusammen mit diesem +Programm erhalten haben. +Falls nicht, schreiben Sie an die Free Software Foundation, +Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. +#######################################################################################*/ + +#include + +#include "mmc.h" + + +//############################################################################ +//Routine zur Initialisierung der MMC/SD-Karte (SPI-MODE) +unsigned char mmc_init (void){ + + unsigned char a; + unsigned int Timeout = 0; + + //Konfiguration des Ports an der die MMC/SD-Karte angeschlossen wurde + MMC_Direction_REG &=~(1< 200){ + MMC_Disable(); + return(1); //Abbruch bei Commando1 (Return Code1) + } + } + //Sendet Commando CMD1 an MMC/SD-Karte + Timeout = 0; + CMD[0] = 0x41;//Commando 1 + CMD[5] = 0xFF; + while( mmc_write_command (CMD) !=0){ + if (Timeout++ > 400){ + MMC_Disable(); + return(2); //Abbruch bei Commando2 (Return Code2) + } + } + + //SPI Bus auf max Geschwindigkeit + SPCR &= ~((1< 500){ + break; //Abbruch da die MMC/SD-Karte nicht Antwortet + } + } + return(tmp); +} + +//############################################################################ +//Routine zum Empfangen eines Bytes von der MMC-Karte +unsigned char mmc_read_byte (void){ + SPDR = 0xff; + while(!(SPSR & (1<>24 ); + cmd[2] = ((addr & 0x00FF0000) >>16 ); + cmd[3] = ((addr & 0x0000FF00) >>8 ); + + //Sendet Commando cmd24 an MMC/SD-Karte (Write 1 Block/512 Bytes) + tmp = mmc_write_command (cmd); + + if (tmp != 0) return(tmp); + + //Wartet einen Moment und sendet einen Clock an die MMC/SD-Karte + for (b=0;b<100;b++) + { + mmc_read_byte(); + } + + //Sendet Start Byte an MMC/SD-Karte + mmc_write_byte(0xFE); + + //Schreiben des Bolcks (512Bytes) auf MMC/SD-Karte + a=511; // do while konstrukt weils schneller geht + tmp=*Buffer++; // holt neues byte aus ram in register + do{ + SPDR = tmp; //Sendet ein Byte + tmp=*Buffer++; // holt schonmal neues aus ram in register + while( !(SPSR & (1<>24 ); + cmd[2] = ((addr & 0x00FF0000) >>16 ); + cmd[3] = ((addr & 0x0000FF00) >>8 ); + + mmc_read_block(cmd,Buffer,512); + + return(0); +} + + +/* +//############################################################################ +//Routine zum lesen des CID Registers von der MMC/SD-Karte (16Bytes) +unsigned char mmc_read_cid (unsigned char *Buffer){ + //Commando zum lesen des CID Registers + unsigned char cmd[] = {0x4A,0x00,0x00,0x00,0x00,0xFF}; + + mmc_read_block(cmd,Buffer,16); + + return(0); +} + +//############################################################################ +//Routine zum lesen des CSD Registers von der MMC/SD-Karte (16Bytes) +unsigned char mmc_read_csd (unsigned char *Buffer){ + //Commando zum lesen des CSD Registers + unsigned char cmd[] = {0x49,0x00,0x00,0x00,0x00,0xFF}; + + mmc_read_block(cmd,Buffer,16); + + return(0); +} +*/ diff --git a/tools/mmc-0.5.4/mmc.h b/tools/mmc-0.5.4/mmc.h new file mode 100644 index 0000000..86c93b2 --- /dev/null +++ b/tools/mmc-0.5.4/mmc.h @@ -0,0 +1,74 @@ +/*####################################################################################### +Connect ARM to MMC/SD + +Copyright (C) 2004 Ulrich Radig +#######################################################################################*/ + + +#ifndef _MMC_H + #define _MMC_H + + #define MMC_Write PORTB //Port an der die MMC/SD-Karte angeschlossen ist also des SPI + #define MMC_Read PINB + #define MMC_Direction_REG DDRB + + #if defined (__AVR_ATmega128__) + #define SPI_DI 3 //Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist + #define SPI_DO 2 //Port Pin an dem Data Input der MMC/SD-Karte angeschlossen ist + #define SPI_Clock 1 //Port Pin an dem die Clock der MMC/SD-Karte angeschlossen ist (clk) + #define MMC_Chip_Select 4 //Port Pin an dem Chip Select der MMC/SD-Karte angeschlossen ist + #define SPI_SS 0 //Nicht Benutz mu� aber definiert werden + #endif + + #if defined (__AVR_ATmega32__) + #define SPI_DI 6 //Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist + #define SPI_DO 5 //Port Pin an dem Data Input der MMC/SD-Karte angeschlossen ist + #define SPI_Clock 7 //Port Pin an dem die Clock der MMC/SD-Karte angeschlossen ist (clk) + #define MMC_Chip_Select 3 //Port Pin an dem Chip Select der MMC/SD-Karte angeschlossen ist + #define SPI_SS 4 //Nicht Benutz mu� aber definiert werden + #endif + + #if defined (__AVR_ATmega168__) + #define SPI_DI 4 //Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist + #define SPI_DO 3 //Port Pin an dem Data Input der MMC/SD-Karte angeschlossen ist + #define SPI_Clock 5 //Port Pin an dem die Clock der MMC/SD-Karte angeschlossen ist (clk) + #define MMC_Chip_Select 1 //Port Pin an dem Chip Select der MMC/SD-Karte angeschlossen ist + #define SPI_SS 2 //Nicht Benutz mu� aber definiert werden + #endif + + #if defined (__AVR_ATmega644__) + #define SPI_DI 6 //Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist + #define SPI_DO 5 //Port Pin an dem Data Input der MMC/SD-Karte angeschlossen ist + #define SPI_Clock 7 //Port Pin an dem die Clock der MMC/SD-Karte angeschlossen ist (clk) + #define MMC_Chip_Select 1 //Port Pin an dem Chip Select der MMC/SD-Karte angeschlossen ist + #define SPI_SS 4 //Nicht Benutz mu� aber definiert werden + #endif + + #if defined (__AVR_ATmega8__) + #define SPI_DI 4 //Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist + #define SPI_DO 3 //Port Pin an dem Data Input der MMC/SD-Karte angeschlossen ist + #define SPI_Clock 5 //Port Pin an dem die Clock der MMC/SD-Karte angeschlossen ist (clk) + #define MMC_Chip_Select 1 //Port Pin an dem Chip Select der MMC/SD-Karte angeschlossen ist + #define SPI_SS 2 //Nicht Benutz mu� aber definiert werden + #endif + + //Prototypes + extern unsigned char mmc_read_byte(void); + extern void mmc_write_byte(unsigned char); + extern void mmc_read_block(unsigned char *,unsigned char *,unsigned in); + extern unsigned char mmc_init(void); + extern unsigned char mmc_read_sector (unsigned long,unsigned char *); + extern unsigned char mmc_write_sector (unsigned long,unsigned char *); + extern unsigned char mmc_write_command (unsigned char *); + //extern unsigned char mmc_read_csd (unsigned char *); + //extern unsigned char mmc_read_cid (unsigned char *); + + //set MMC_Chip_Select to high (MMC/SD-Karte Inaktiv) + #define MMC_Disable() MMC_Write|= (1< + +#include "uart.h" + + +//***********************Funktionen********************************** +void uputc(unsigned char c){ //zeichen senden + + while(!(UCSRA & (1<>8); + UBRRL = (unsigned char)UBRR_VAL; + UCSRB |= (1<[paramm '-(das ist ein kleines "m" am Schluß)-' + +Mögliche "param" sind: + + * 0 = Normal + * 1 = Heller (bold) + * 4 = Unterstrichen + * 5 = Blinkend + * 7 = Reverse (dunkel auf hell bzw. umgekehrt) + +Dabei können mehrere Attribute angegeben werden, dann aber mit Semikolon getrennt: + +[param1;param2;param3m +*/