diff options
-rw-r--r-- | firmware/93c46.c | 18 | ||||
-rw-r--r-- | firmware/93c46.h | 14 | ||||
-rw-r--r-- | firmware/Makefile | 914 | ||||
-rw-r--r-- | firmware/adc.c | 152 | ||||
-rw-r--r-- | firmware/adc.h | 17 | ||||
-rw-r--r-- | firmware/can.c | 756 | ||||
-rw-r--r-- | firmware/can.h | 101 | ||||
-rw-r--r-- | firmware/common.c | 16 | ||||
-rw-r--r-- | firmware/common.h | 25 | ||||
-rw-r--r-- | firmware/debug.c | 38 | ||||
-rw-r--r-- | firmware/debug.h | 9 | ||||
-rw-r--r-- | firmware/eeprom.c | 119 | ||||
-rw-r--r-- | firmware/eeprom.h | 11 | ||||
-rw-r--r-- | firmware/fifo.c | 20 | ||||
-rw-r--r-- | firmware/i2c.c | 113 | ||||
-rw-r--r-- | firmware/i2c.h | 11 | ||||
-rw-r--r-- | firmware/io.c | 402 | ||||
-rw-r--r-- | firmware/io.h | 168 | ||||
-rw-r--r-- | firmware/main.c | 344 | ||||
-rw-r--r-- | firmware/main.hex | 2169 | ||||
-rw-r--r-- | firmware/octopus_can_stable_1_1.hex | 1133 | ||||
-rw-r--r-- | firmware/octopus_relais.hex | 959 | ||||
-rw-r--r-- | firmware/octopus_stable_1_1.hex | 971 | ||||
-rw-r--r-- | firmware/pin.c | 93 | ||||
-rw-r--r-- | firmware/pin.h | 84 | ||||
-rw-r--r-- | firmware/protocol.h | 27 | ||||
-rw-r--r-- | firmware/pwm.c | 6 | ||||
-rw-r--r-- | firmware/spi.c | 190 | ||||
-rw-r--r-- | firmware/spi.h | 23 | ||||
-rw-r--r-- | firmware/uart.c | 68 | ||||
-rw-r--r-- | firmware/uart_fifo.c | 368 | ||||
-rw-r--r-- | firmware/usbn2mc.c | 2 |
32 files changed, 7113 insertions, 2228 deletions
diff --git a/firmware/93c46.c b/firmware/93c46.c index 4af0f45..9ec4e11 100644 --- a/firmware/93c46.c +++ b/firmware/93c46.c @@ -93,10 +93,10 @@ int flash_93c46_init(void) //SETPIN(DIN0) = D4 = low //SETPIN(DIN1) = D4 = low - octopus.ports[19]=PIN_OUT; - octopus.ports[18]=PIN_OUT; - octopus.ports[17]=PIN_OUT; octopus.ports[16]=PIN_IN; + octopus.ports[17]=PIN_OUT; + octopus.ports[18]=PIN_OUT; + octopus.ports[19]=PIN_OUT; return RSP_OK; } @@ -111,9 +111,10 @@ void flash_93c46_deinit_usb(void) int flash_93c46_deinit(void) { - octopus.ports[5]=PIN_OUT; // this is wrong! - octopus.ports[6]=PIN_OUT; // this is wrong! - octopus.ports[7]=PIN_OUT; // this is wrong! + octopus.ports[16]=PIN_NONE; + octopus.ports[17]=PIN_NONE; + octopus.ports[18]=PIN_NONE; + octopus.ports[19]=PIN_NONE; return RSP_OK; } @@ -122,7 +123,8 @@ void flash_93c46_read_usb(unsigned char address, unsigned int length, char * buf { answer[0]=CMD_93C46_READ; answer[1]=(unsigned char)flash_93c46_read(address,length,(char*)&answer[2]); - CommandAnswer(length+2); + answer[2+length] = 0; + CommandAnswer(3+length); } int flash_93c46_read(unsigned char address, unsigned int length, char * buf) @@ -142,7 +144,7 @@ void flash_93c46_write_usb(unsigned char address, unsigned int length, char * bu { answer[0]=CMD_93C46_WRITE; answer[1]=(unsigned char)flash_93c46_write(address,length, buf); - answer[2]=0x00; + answer[2]=0; CommandAnswer(3); } diff --git a/firmware/93c46.h b/firmware/93c46.h index 817eade..d919036 100644 --- a/firmware/93c46.h +++ b/firmware/93c46.h @@ -47,10 +47,6 @@ #define DO (B, 3) - - - - #define DIN0 (B, 4) #define DIN1 (B, 5) @@ -100,14 +96,4 @@ void erase_write_disable(void); uint8_t flash_93c46_read_word(uint8_t add); uint8_t flash_93c46_write_word(uint8_t add,uint8_t wd); - - - - - - - - - - #endif /* SPI_H */ diff --git a/firmware/Makefile b/firmware/Makefile index f3553b5..c8ae6de 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -1,458 +1,458 @@ -# 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 = atmega128
-MCU = at90can128
-
-# Main Oscillator Frequency
-# This is only used to define F_OSC in all assembler and c-sources.
+# 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 = atmega128 +MCU = at90can128 + +# Main Oscillator Frequency +# This is only used to define F_OSC in all assembler and c-sources. F_OSC = 16000000 -
-# Output format. (can be srec, ihex, binary)
-FORMAT = ihex
-
-# Target file name (without extension).
-TARGET = main
-
-
-# List C source files here. (C dependencies are automatically generated.)
-#SRC = $(TARGET).c uart.c usbn2mc/main/usbn960x.c usbn2mc.c usbn2mc/main/usbnapi.c
-
-SRC = $(TARGET).c wait.c uart.c ../usbn2mc/main/usbn960x.c usbn2mc.c ../usbn2mc/main/usbnapi.c common.c fifo.c io.c adc.c i2c.c spi.c 93c46.c pwm.c debug.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 = s
-
-# 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=gnu99
-
-# 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)
-CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
-CFLAGS += -Wall -Wstrict-prototypes
-#CFLAGS += -Wall
-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
-
-EXTMEMOPTS =
-
-# 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
-LDFLAGS += $(EXTMEMOPTS)
-LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
-
-
-
-
-# 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 = stk500
-
-# com1 = serial port. Use lpt1 to connect to parallel port.
-AVRDUDE_PORT = com1 # programmer connected to serial device
-
-AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
-#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
-
-
-# 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_COUNTER = -y
-
-# Uncomment the following if you do /not/ wish a verification to be
-# performed after programming the device.
-#AVRDUDE_NO_VERIFY = -V
-
-# Increase verbosity level. Please use this when submitting bug
-# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
-# to submit bug reports.
-#AVRDUDE_VERBOSE = -v -v
-
-AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
-AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
-AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
-AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
-
-
-
-# ---------------------------------------------------------------------------
-
-# 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
-NM = 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.
-ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
-ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(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
-
-download:
- avrdude -p m128 -c avrispv2 -P usb -U flash:w:main.hex
- -download_can:
- avrdude -p c128 -c avrispv2 -P usb -U flash:w:main.hex
- -fuse:
- avrdude -p m128 -c avrispv2 -P usb -U lfuse:w:0xe0:m
- avrdude -p m128 -c avrispv2 -P usb -U efuse:w:0xff:m
- avrdude -p m128 -c avrispv2 -P usb -U hfuse:w:0xdd:m
-
-fuse_can:
- avrdude -p c128 -c avrispv2 -B 10 -P usb -U lfuse:w:0xe0:m
- avrdude -p c128 -c avrispv2 -B 10 -P usb -U efuse:w:0xff:m
- avrdude -p c128 -c avrispv2 -B 10 -P usb -U hfuse:w:0xdd:m
- -usbprog:
- avrdude -p c128 -c avrispv2 -P usb -U flash:w:main.hex
+ +# Output format. (can be srec, ihex, binary) +FORMAT = ihex + +# Target file name (without extension). +TARGET = main + + +# List C source files here. (C dependencies are automatically generated.) +#SRC = $(TARGET).c uart.c usbn2mc/main/usbn960x.c usbn2mc.c usbn2mc/main/usbnapi.c + +SRC = $(TARGET).c wait.c uart.c ../usbn2mc/main/usbn960x.c usbn2mc.c ../usbn2mc/main/usbnapi.c common.c fifo.c io.c adc.c i2c.c spi.c 93c46.c pwm.c debug.c can.c eeprom.c pin.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 = s + +# 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=gnu99 + +# 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) +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +CFLAGS += -Wall -Wstrict-prototypes +#CFLAGS += -Wall +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 + +EXTMEMOPTS = + +# 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 +LDFLAGS += $(EXTMEMOPTS) +LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) + + + + +# 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 = stk500 + +# com1 = serial port. Use lpt1 to connect to parallel port. +AVRDUDE_PORT = com1 # programmer connected to serial device + +AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex +#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep + + +# 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_COUNTER = -y + +# Uncomment the following if you do /not/ wish a verification to be +# performed after programming the device. +#AVRDUDE_NO_VERIFY = -V + +# Increase verbosity level. Please use this when submitting bug +# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude> +# to submit bug reports. +#AVRDUDE_VERBOSE = -v -v + +AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) +AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) +AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) + + + +# --------------------------------------------------------------------------- + +# 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 +NM = 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. +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(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 + +download_old: + avrdude -p m128 -c avrispv2 -P usb -U flash:w:main.hex + +download: + avrdude -p c128 -c avrispv2 -P usb -U flash:w:main.hex -B 1 + +fuse_old: + avrdude -p m128 -c avrispv2 -P usb -U lfuse:w:0xe0:m + avrdude -p m128 -c avrispv2 -P usb -U efuse:w:0xff:m + avrdude -p m128 -c avrispv2 -P usb -U hfuse:w:0xdd:m + +fuse: + avrdude -p c128 -c avrispv2 -B 10 -P usb -U lfuse:w:0xe0:m + avrdude -p c128 -c avrispv2 -B 10 -P usb -U efuse:w:0xff:m + avrdude -p c128 -c avrispv2 -B 10 -P usb -U hfuse:w:0xdd:m + +usbprog: + avrdude -p c128 -c avrispv2 -P usb -U flash:w:main.hex diff --git a/firmware/adc.c b/firmware/adc.c index a9449b7..915dbce 100644 --- a/firmware/adc.c +++ b/firmware/adc.c @@ -37,19 +37,27 @@ #include "protocol.h" #include "adc.h" +#include <stdio.h> +#include "debug.h" + + void adc_parser(char *buf) { + //debugf("adc parser CMD %02x\n",buf[0]); switch(buf[0]) { case CMD_ADC_INIT_PIN: - adc_init_usb((int)buf[2]); - break; + adc_init_usb(buf[2]); + break; + case CMD_ADC_DEINIT_PIN: + adc_deinit_usb(buf[2]); + break; case CMD_ADC_GET: - adc_get_usb((int)buf[2]); - break; + adc_get_usb(buf[2]); + break; case CMD_ADC_REF: - adc_ref_usb((int)buf[2]); - break; + adc_ref_usb(buf[2]); + break; default: answer[0]=buf[0]; @@ -59,42 +67,49 @@ void adc_parser(char *buf) } } -int adc_init(int pin) +int adc_init(uint8_t pin) { - if (pin >= 33 && pin <= 40) - { - octopus.ports[pin] = PIN_AD; - - switch(pin) - { - case 40: break; - case 39: break; - case 38: break; - case 37: break; - case 36: break; - case 35: break; - case 34: break; - case 33: break; - default: - return RSP_IMPOSSIBLE_PIN_CONFIG; - } - return RSP_OK; - } - return RSP_UNKOWN_PIN; + if (pin >= 10 && pin <= 17) + { + octopus.ports[pin] = PIN_AD; + ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen + return RSP_OK; + } + + return RSP_UNKOWN_PIN; } -void adc_init_usb(int pin) +void adc_init_usb(uint8_t pin) { answer[0]=CMD_ADC_INIT_PIN; - answer[1]= (unsigned char)adc_init(pin); + answer[1]=(unsigned char)adc_init(pin); answer[2]=0; CommandAnswer(3); } -void adc_get_usb(int pin) +int adc_deinit(uint8_t pin) +{ + if (octopus.ports[pin] == PIN_AD) + { + octopus.ports[pin] = PIN_NONE; + return RSP_OK; + } + + return RSP_UNKOWN_PIN; +} + +void adc_deinit_usb(uint8_t pin) +{ + answer[0]=CMD_ADC_DEINIT_PIN; + answer[1]= (unsigned char)adc_deinit(pin); + answer[2]=0; + + CommandAnswer(3); +} + +void adc_get_usb(uint8_t pin) { - uint16_t result; //uint8_t result[2]; @@ -110,64 +125,59 @@ void adc_get_usb(int pin) } -int adc_get(int pin, uint16_t *value) +int adc_get(uint8_t pin, uint16_t *value) { - *value = 0; - - if (octopus.ports[pin] == PIN_AD) - { - switch (pin) - { - case 40: *value =_adc_read_channel(0); break; - case 39: *value =_adc_read_channel(1); break; - case 38: *value =_adc_read_channel(2); break; - case 37: *value =_adc_read_channel(3); break; - case 36: *value =_adc_read_channel(4); break; - case 35: *value =_adc_read_channel(5); break; - case 34: *value =_adc_read_channel(6); break; - case 33: *value =_adc_read_channel(7); break; - default: - return RSP_IMPOSSIBLE_PIN_CONFIG; - } - return RSP_OK; - } - else - { - return RSP_WRONG_PIN_CONFIG; - } + *value = 0; + + if (octopus.ports[pin] == PIN_AD) + { + // 40 => 0 + // 39 => 1 + // 38 => 2 + // pin => 40-pin + *value =_adc_read_channel(17 - pin); + debugf("Wert %i\r\n",*value); + return RSP_OK; + } + else + return RSP_WRONG_PIN_CONFIG; } -void adc_ref_usb(int ref) +void adc_ref_usb(uint8_t ref) { answer[0]=CMD_ADC_REF; answer[1]=adc_ref(ref); - CommandAnswer(2); + answer[2]=0; + CommandAnswer(3); } -int adc_ref(int ref) +int adc_ref(uint8_t ref) { - ADMUX = 0x00; - - switch(ref){ - case PARAM_ADC_AREF: break; - case PARAM_ADC_AVCC: ADMUX |= (1<<REFS0); break; - case PARAM_ADC_INTERNAL: ADMUX |= (1<<REFS1) | (1<<REFS0); break; - default: - return RSP_ERROR; - } - return RSP_OK; + ADMUX = 0x00; + + switch(ref) + { + case PARAM_ADC_AREF: break; + case PARAM_ADC_AVCC: ADMUX |= (1<<REFS0); break; + case PARAM_ADC_INTERNAL: ADMUX |= (1<<REFS1) | (1<<REFS0); break; + default: + return RSP_ERROR; + } + + return RSP_OK; } -uint16_t _adc_read_channel(int mux) +uint16_t _adc_read_channel(uint8_t mux) { int i; uint16_t result; + + //ADMUX |= mux; // Kanal waehlen ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler // setzen auf 8 (1) und ADC aktivieren (1) - //ADMUX |= (unsigned char)mux; // Kanal waehlen - ADMUX = (ADMUX & 0xF0) | (unsigned char) mux; // select channel + ADMUX = (ADMUX & 0xF0) | mux; // select channel //ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen diff --git a/firmware/adc.h b/firmware/adc.h index 3aa0a6f..1e85ff4 100644 --- a/firmware/adc.h +++ b/firmware/adc.h @@ -41,16 +41,17 @@ void adc_parser(char *buf); -int adc_init(int pin); -void adc_init_usb(int pin); +int adc_init(uint8_t pin); +void adc_init_usb(uint8_t pin); -void adc_ref_usb(int ref); -int adc_ref(int ref); +int adc_deinit(uint8_t pin); +void adc_deinit_usb(uint8_t pin); +int adc_ref(uint8_t ref); +void adc_ref_usb(uint8_t ref); - -int adc_get(int pin, uint16_t *value); -void adc_get_usb(int pin); -uint16_t _adc_read_channel(int mux); +int adc_get(uint8_t pin, uint16_t *value); +void adc_get_usb(uint8_t pin); +uint16_t _adc_read_channel(uint8_t mux); #endif /* ADC_H */ diff --git a/firmware/can.c b/firmware/can.c new file mode 100644 index 0000000..95090bb --- /dev/null +++ b/firmware/can.c @@ -0,0 +1,756 @@ +/* + * Copyright (c) 2007 Marco Glietsch (http://www.mikrocontroller.net/topic/98697) + * Original author: Marco Glietsch + * Modified for octopus by Michael Hartmann <ich@speicherleck.de> + * All rights reserved. + * + * Short descripton of file: + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the FH Augsburg nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES{} LOSS OF USE, + * DATA, OR PROFITS{} OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef __AVR_AT90CAN128__ + +#include "common.h" +#include "protocol.h" +#include "can.h" + +#include <avr/io.h> +#include <avr/interrupt.h> +#include <util/delay.h> +#include <inttypes.h> +#include <stdbool.h> + +struct { + uint32_t id; + int8_t data[8]; +} message; + +int8_t iemob[15] = { + IEMOB0, IEMOB1, IEMOB2, IEMOB3, IEMOB4, IEMOB5, IEMOB6, IEMOB7, + IEMOB8, IEMOB9, IEMOB10, IEMOB11, IEMOB12, IEMOB13, IEMOB14 }; + +// extended id +int8_t extended_id; + +void can_parser(uint8_t *buf) +{ + switch(buf[0]) + { + case CMD_CAN_INIT: + can_init_usb((uint8_t)buf[2], (uint8_t)buf[3]); + break; + case CMD_CAN_DEINIT: + can_deinit_usb(); + break; + case CMD_CAN_ENABLE_MOB: + asm("nop"); + uint32_t idm = 0; + uint32_t id = 0; + + id = ((uint32_t)buf[4]) + + ((uint32_t)buf[5] << 8) + + ((uint32_t)buf[6] << 16) + + ((uint32_t)buf[7] << 24); + + idm = ((uint32_t)buf[8]) + + ((uint32_t)buf[9] << 8) + + ((uint32_t)buf[10] << 16) + + ((uint32_t)buf[11] << 24); + + // mob, mode, id, idm + can_enable_mob_usb(buf[2], buf[3], id, idm); + break; + case CMD_CAN_DISABLE_MOB: + can_disable_mob_usb((uint8_t)buf[2]); + break; + case CMD_CAN_SEND_DATA: + can_send_data_usb(buf[2], buf[3], &buf[4]); + break; + case CMD_CAN_SEND_REMOTE: + can_send_remote_usb(buf[2]); + break; + case CMD_CAN_RECEIVE_DATA: + can_receive_data_usb(buf[2]); + break; + case CMD_CAN_SET_AUTOREPLY: + can_set_autoreply_usb(buf[2], buf[3], &buf[4]); + break; + default: + answer[0] = buf[0]; + answer[1] = RSP_UNKOWN_CMD; + answer[2] = 0; + CommandAnswer(3); + } +} + +void can_init_usb(uint8_t baudrate, uint8_t eid) +{ + answer[0] = CMD_CAN_INIT; + answer[1] = (uint8_t)can_init(baudrate, CAN_INTERRUPTS_RX, eid); + answer[2] = 0; + + CommandAnswer(3); +} + +// Message Objects zuruecksetzen, CAN-Controller aktivieren +// Parameter: +// uint8_t baud: 0,1,2...5 (fuer 100, 125, 200, 250, 500, 1000) +// uint8_t intmode: Ereignis, bei dem ein Interrupt ausgelöst werden soll +// - NONE - Deaktiviert +// - TX - Daten gesendet +// - RX - Daten empfangen +// - TXRX - Daten gesendet und/oder empfangen +int can_init(uint8_t baudrate, uint8_t intmode, uint8_t eid) +{ + uint8_t i; + + octopus.ports[17] = PIN_CAN; + octopus.ports[18] = PIN_CAN; + + extended_id = eid ? 1 : 0; + + message.id = 0; + for(i = 0; i < 8; i++) + message.data[i] = 0; + + // Status- und Steuerregister aller Message Objects initialisieren + for(i = 0; i < NO_MOBS; i++) + { + can_get_mob(i); + CANSTMOB = 0; + CANCDMOB = 0; + } + + // set baudrate + if(can_set_baudrate(baudrate) == 0) + return RSP_ERROR; + + if(can_set_interrupt(intmode) == 0) + return RSP_ERROR; + + // CAN-Controller in Enabled Mode setzen + setbit(CANGCON, ENASTB); + + // Warten bis der CAN-Controller das Enabled-Bit gesetzt hat und + // einsatzbereit ist + while (!getbit(CANGSTA, ENFG)); + + return RSP_OK; +} + +void can_deinit_usb(void) +{ + answer[0] = CMD_CAN_DEINIT; + answer[1] = (int8_t)can_deinit(); + answer[2] = 0; + + CommandAnswer(3); +} + +int can_deinit(void) +{ + uint8_t i; + + octopus.ports[17] = PIN_NONE; + octopus.ports[18] = PIN_NONE; + + for(i = 0; i < 15; i++) + can_disable_mob(i); + + // CAN-Controller ausschalten + clearbit(CANGCON, ENASTB); + + // warten bis wirklich ausgechaltet + while (getbit(CANGSTA, ENFG)); + + return RSP_OK; +} + +void can_set_autoreply(uint8_t mob, uint8_t length, uint8_t *buf) +{ + can_get_mob(mob); + can_set_mode(CAN_MODE_AUTO_REPLY); + can_set_data(length, buf); +} + +void can_set_autoreply_usb(uint8_t mob, uint8_t length, uint8_t *buf) +{ + can_set_autoreply(mob, length, buf); + + answer[0] = CMD_CAN_SET_AUTOREPLY; + answer[1] = RSP_OK; + answer[2] = 0; + + CommandAnswer(3); +} + +int can_set_baudrate(uint8_t baudrate) +{ + // @16 MHz + switch(baudrate) + { + case CAN_BAUDRATE_100K: + CANBT1 = 0x12; + CANBT2 = 0x0c; + CANBT3 = 0x37; + break; + + case CAN_BAUDRATE_125K: + CANBT1 = 0x0e; + CANBT2 = 0x0c; + CANBT3 = 0x37; + break; + + case CAN_BAUDRATE_200K: + CANBT1 = 0x08; + CANBT2 = 0x0c; + CANBT3 = 0x37; + break; + + case CAN_BAUDRATE_250K: + CANBT1 = 0x06; + CANBT2 = 0x0c; + CANBT3 = 0x37; + break; + + case CAN_BAUDRATE_500K: + CANBT1 = 0x02; + CANBT2 = 0x0c; + CANBT3 = 0x37; + break; + + case CAN_BAUDRATE_1000K: + CANBT1 = 0x00; + CANBT2 = 0x0c; + CANBT3 = 0x37; + break; + + default: + return 0; + } + + return 1; +} + +void can_enable_mob_usb(uint8_t mob, uint8_t mode, uint32_t id, uint32_t idm) +{ + answer[0] = CMD_CAN_ENABLE_MOB; + answer[1] = (int8_t)can_enable_mob(mob, mode, id, idm); + answer[2] = 0; + + CommandAnswer(3); +} + + +// Parameter: +// uint8_t mob: Nummer des zu wählenden Objekts (0-14) +// +// uint8_t mode +// - Betriebsart des Message Objekts: +// - DISABLED Deaktiviert +// - TRANSMIT_DATA Daten senden +// - TRANSMIT_REMOTE Anfrage senden +// - RECEIVE_DATA Empfangsmodus +// - AUTO_REPLY automatischer Antwortmodus +// +// Funktion setzt die Betriebsart des vorher gewählten Objekts +int can_enable_mob(uint8_t mob, uint8_t mode, uint32_t id, uint32_t idm) +{ + // Objekt wählen + can_get_mob(mob); + + // Interrupt für dieses Objekt aktivieren + can_set_mob_interrupt(mob); + + // ID-Maske setzen + can_set_id_mask(idm); + + // ID setzen + can_set_id(id); + + // Betriebsmodus setzen + if(can_set_mode(mode) == 0) + return RSP_ERROR; + + return RSP_OK; +} + + +void can_send_data_usb(uint8_t mob, uint8_t length, uint8_t *data) +{ + answer[0] = CMD_CAN_SEND_DATA; + answer[1] = (int8_t)can_send_data(mob, length, data); + answer[2] = 0; + + CommandAnswer(3); +} + +int can_send_data(uint8_t mob, uint8_t length, uint8_t * data) +{ + uint8_t mode; + + // Objekt wählen + can_get_mob(mob); + + // Aktuelle Betriebsart sichern + mode = can_get_mode(); + + // Nutzdaten in Register schreiben + can_set_data(length, data); + + // Datenübertragung starten + can_set_mode(CAN_MODE_TRANSMIT_DATA); + + // Warten bis die Datenübertragung beendet ist (TXOK-Flag von CAN-Controller + // gesetzt) + while (!getbit(CANSTMOB, TXOK)); + + // TXOK-Flag von Hand löschen + clearbit(CANSTMOB, TXOK); + + // Alte Betriebsart wiederherstellen + can_set_mode(mode); + + return RSP_OK; +} + + +// Parameter: uint8_t mode: Ereignis, bei dem Interrupt ausgelöst werden soll +// - NONE - Deaktiviert +// - TX - Daten gesendet +// - RX - Daten empfangen +// - TXRX - Daten gesendet und/oder empfangen +int can_set_interrupt(uint8_t mode) +{ + switch(mode) + { + case CAN_INTERRUPTS_NONE: + clearbit(CANGIE, ENIT); + clearbit(CANGIE, ENRX); + clearbit(CANGIE, ENTX); + break; + + case CAN_INTERRUPTS_TX: + setbit(CANGIE, ENIT); + clearbit(CANGIE, ENRX); + setbit(CANGIE, ENTX); + break; + + case CAN_INTERRUPTS_RX: + setbit(CANGIE, ENIT); + setbit(CANGIE, ENRX); + clearbit(CANGIE, ENTX); + break; + + case CAN_INTERRUPTS_TXRX: + setbit(CANGIE, ENIT); + setbit(CANGIE, ENRX); + setbit(CANGIE, ENTX); + break; + + default: + return 0; + } + + return 1; +} + + +// Funktion wählt CANPAGE des betreffenden Objekts aus und stellt Zugang zu +// Registern des Objekts her +void can_get_mob(uint8_t mob) +{ + CANPAGE = (mob << 4); +} + + +// Parameter: uint32_t idm: ID-Maske in Dezimalschreibweise +// Funktion setzt ID-Maske eines Objekts auf einen neuen Wert. In CANIDM4 +// bleiben dabei die Werte der unteren 3 Bit (RTRTAG, Reserved und IDEMSK) +// erhalten. +void can_set_id_mask(uint32_t idm) +{ + //Standart identifier (11 bit) + if(!extended_id) + { + CANIDM2 = (uint8_t)(idm << 5); + CANIDM1 = (uint8_t)(idm >> 3); + } + //extended identifier + else + { + idm <<= 3; + idm |= 7; + + CANIDM4 = (int8_t) (idm); + CANIDM3 = (int8_t) (idm>>8); + CANIDM2 = (int8_t) (idm>>16); + CANIDM1 = (int8_t) (idm>>24); + } +} + +// Funktion holt ID der empfangenen Nachricht +uint32_t can_get_id(void) +{ + uint32_t id = 0; + + //Standart identifier (11 bit) + if(!extended_id) + { + id = (uint8_t) CANIDT2 >> 5; + id |= (uint16_t) CANIDT1 << 3; + } + //extended identifier + else + { + id |= ((uint32_t) CANIDT1 << 24); + id |= ((uint32_t) CANIDT2 << 16); + id |= ((uint32_t) CANIDT3 << 8); + id |= (CANIDT4&0xF8); + id >>= 3; + } + + return id; +} + +// Funktion setzt ID eines Objekts auf einen neuen Wert. In CANIDM4 bleiben +// dabei die Werte der unteren 3 Bit (RTRTAG, RB1TAG und RB0TAG) erhalten. +void can_set_id(uint32_t id) +{ + //Standart identifier (11 bit) + if(!extended_id) + { + CANIDT2 = (uint8_t)(id << 5); + CANIDT1 = (uint8_t)(id >> 3); + } + //extended identifier + else + { + id <<= 3; + id &= 0xfffffff8; + id |= (CANIDT4 & 0x07); + + CANIDT4 = (int8_t) (id); + CANIDT3 = (int8_t) (id>>8); + CANIDT2 = (int8_t) (id>>16); + CANIDT1 = (int8_t) (id>>24); + } +} + + +// Funktion setzt die Betriebsart des vorher gewählten Objekts. +// Parameter: uint8_t mode: +// - Betriebsart des Message Objekts: +// - DISABLED - Deaktiviert +// - TRANSMIT_DATA - Daten senden +// - TRANSMIT_REMOTE - Anfrage senden +// - RECEIVE_DATA - Empfangsmodus +// - AUTO_REPLY - automatischer Antwortmodus +int can_set_mode(uint8_t mode) +{ + if(extended_id) + setbit(CANCDMOB, IDE); + else + clearbit(CANCDMOB, IDE); + + switch(mode) + { + case CAN_MODE_DISABLED: + clearbit(CANCDMOB, CONMOB0); + clearbit(CANCDMOB, CONMOB1); + clearbit(CANCDMOB, RPLV); + clearbit(CANIDT4, RTRTAG); + clearbit(CANIDM4, RTRMSK); + break; + + case CAN_MODE_TRANSMIT_DATA: + CANCDMOB &= ~(1 << CONMOB1 || 1 << CONMOB0 || 1 << RPLV); + CANCDMOB |= (1 << CONMOB0 || 0 << CONMOB1); + clearbit(CANIDT4, RTRTAG); + break; + + case CAN_MODE_TRANSMIT_REMOTE: + clearbit(CANCDMOB, CONMOB1); + setbit(CANCDMOB, CONMOB0); + clearbit(CANCDMOB, RPLV); + setbit(CANIDT4, RTRTAG); + break; + + case CAN_MODE_RECEIVE_DATA: + clearbit(CANCDMOB, CONMOB0); + setbit(CANCDMOB, CONMOB1); + clearbit(CANCDMOB, RPLV); + clearbit(CANIDT4, RTRTAG); + break; + + case CAN_MODE_AUTO_REPLY: + clearbit(CANCDMOB, CONMOB0); + setbit(CANCDMOB, CONMOB1); + setbit(CANCDMOB, RPLV); + setbit(CANIDT4, RTRTAG); + break; + + default: + return 0; + } + + return 1; +} + + +// Funktion holt die Betriebsart des vorher gewaehlten Objekts +uint8_t can_get_mode(void) +{ + uint8_t mode = 0; + + if(!getbit(CANCDMOB, CONMOB1) && !getbit(CANCDMOB, CONMOB0)) + { + mode = CAN_MODE_DISABLED; + } + else if(!getbit(CANCDMOB, CONMOB1) && getbit(CANCDMOB, CONMOB0) && + !getbit(CANIDT4, RTRTAG)) + { + mode = CAN_MODE_TRANSMIT_DATA; + } + else if(!getbit(CANCDMOB, CONMOB1) && getbit(CANCDMOB, CONMOB0) && + getbit(CANIDT4, RTRTAG)) + { + mode = CAN_MODE_TRANSMIT_REMOTE; + } + else if(getbit(CANCDMOB, CONMOB1) && !getbit(CANCDMOB, CONMOB0) && + !getbit(CANIDT4, RTRTAG)) + { + mode = CAN_MODE_RECEIVE_DATA; + } + else if(getbit(CANCDMOB, CONMOB1) && !getbit(CANCDMOB, CONMOB0) && + getbit(CANCDMOB,RPLV) && getbit(CANIDT4, RTRTAG)) + { + mode = CAN_MODE_AUTO_REPLY; + } + + return mode; +} + + +// Funktion schreibt in das Objekt die zu uebermittelnden Daten +void can_set_data(uint8_t length, uint8_t * data) +{ + uint8_t i; + uint8_t cancdmob; + + if(length > 8) + length = 8; + + // Anzahl der Datenbytes in der Nachricht + // scheinbar darf man das CANCDMOB register nicht beliebig oft + // schreiben/lesen, daher speichern wir den wert dazwischen, loeschen die + // entsprechenden bits fuer die laenge und schreiben dann unsere laenge rein + // wie dem auch sei: so funktionierts zumindest, also vorsicht beim aufraeumen ;-) + cancdmob = CANCDMOB; + clearbit(cancdmob, DLC0); + clearbit(cancdmob, DLC1); + clearbit(cancdmob, DLC2); + clearbit(cancdmob, DLC3); + CANCDMOB = (cancdmob | (length << DLC0)); + for(i = 0; i < length; i++) + CANMSG = data[i]; +} + +void can_get_data(int8_t *msg) +{ + uint8_t i; + + for(i = 0; i < 8; i++) + msg[i] = CANMSG; +} + +// Parameter: uint8_t mob: Nummer des Objekts (0-14) +// Funktion setzt den Interrupt für das jeweilige Objekt +void can_set_mob_interrupt(uint8_t mob) +{ + // bugfix von C.H. + // http://www.mikrocontroller.net/topic/98697#1232848 + if (mob < 8) { setbit(CANIE2, iemob[mob]); } + else { setbit(CANIE1, iemob[mob]); } +} + +// Parameter: uint8_t mob: Nummer des Objekts (0-14) +// Funktion löscht den Interrupt für das jeweilige Objekt +void can_clear_mob_interrupt(uint8_t mob) +{ + clearbit(CANIE2, iemob[mob]); +} + +// Rückgabe: uint8_t mob: Nummer des Objekts +// Funktion ermittelt, welches Objekt Interrupt ausgeloest hat +uint8_t can_get_mob_interrupt(void) +{ + uint8_t mob; + uint16_t maske; + maske = CANSIT2 | (CANSIT1 << 8); + + // Wenn alle 32 Bit der Bitmaske 0 sind dann ist ein Fehler aufgetreten + if(maske == 0) + return NOMOB; + + // Die Bitmaske wird so lange nach rechts geschoben, bis Bit0 eine 1 hat. + // Die Anzahl der Schiebeoperatoren gibt somit die Nummer des MOBs zurück + for(mob=0; (maske & 0x01)==0; maske >>= 1, ++mob); + + // Kontrolle: Wenn mob größer als die Anzahl der verfügbaren + // Message Objects ist das Ergebnis falsch + if(mob > 14) + return NOMOB; + + return mob; +} + +void can_disable_mob_usb(uint8_t mob) +{ + answer[0] = CMD_CAN_DISABLE_MOB; + answer[1] = (int8_t)can_disable_mob(mob); + answer[2] = 0; + + CommandAnswer(3); +} + +// Funktion deaktiviert das gewählte Objekt +int can_disable_mob(uint8_t mob) +{ + // Objekt wählen + can_get_mob(mob); + + // Interrupt für dieses Objekt aktivieren + can_clear_mob_interrupt(mob); + + // Betriebsmodus setzen + can_set_mode(CAN_MODE_DISABLED); + + return RSP_OK; +} + + +void can_send_remote_usb(uint8_t mob) +{ + answer[0] = CMD_CAN_SEND_REMOTE; + answer[1] = (int8_t)can_send_remote(mob); + answer[2] = 0; + + CommandAnswer(3); +} + +// Funktion sendet eine Anfrage (Remote Frame) +int can_send_remote(uint8_t mob) +{ + uint8_t mode; + + // Objekt wählen + can_get_mob(mob); + + // Aktuelle Betriebsart sichern + mode = can_get_mode(); + + // Datenübertragung starten + can_set_mode(CAN_MODE_TRANSMIT_REMOTE); + + // Warten bis die Datenübertragung beendet ist (TXOK-Flag von CAN-Controller + // gesetzt) + while (!getbit(CANSTMOB, TXOK)); + + // TXOK-Flag von Hand löschen + clearbit(CANSTMOB, TXOK); + + // Alte Betriebsart wiederherstellen + can_set_mode(mode); + + return RSP_OK; +} + +void can_receive_data_usb(int mob) +{ + uint8_t i; + answer[0] = CMD_CAN_RECEIVE_DATA; + answer[1] = RSP_OK; + + // id + answer[2] = (int8_t) (message.id); + answer[3] = (int8_t) (message.id >> 8); + answer[4] = (int8_t) (message.id >> 16); + answer[5] = (int8_t) (message.id >> 24); + + message.id = 0; + for(i = 0; i < 8; i++) + { + answer[6+i] = message.data[i]; + message.data[i] = 0; + } + answer[14] = 0; + + CommandAnswer(15); +} + +// Interrupt fuer Empfang einer Nachricht +SIGNAL(SIG_CAN_INTERRUPT1) +{ + uint8_t save_canpage; + uint8_t mob; + + // Aktuelle CANPAGE sichern + save_canpage = CANPAGE; + + // Index des MOB ermitteln, der den Interrupt ausgelöst hat + mob = can_get_mob_interrupt(); + + // Falls es kein gültiges MOB war abbrechen + if(mob == NOMOB) + return; + + // Objekt das den Interrupt ausgelöst hat holen + can_get_mob(mob); + + // Id der Nachricht holen + message.id = can_get_id(); + + // Daten des MOBs aus CANMSG auslesen + can_get_data(message.data); + + // Id der Nachricht holen + message.id = can_get_id(); + + // RXOK-Flag löschen + clearbit(CANSTMOB, RXOK); + + // MOB auf Empfang setzen + can_set_mode(CAN_MODE_RECEIVE_DATA); + + // CANPAGE wiederherstellen + CANPAGE = save_canpage; +} + +#endif diff --git a/firmware/can.h b/firmware/can.h new file mode 100644 index 0000000..1bab0ba --- /dev/null +++ b/firmware/can.h @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2007 Marco Glietsch (http://www.mikrocontroller.net/topic/98697) + * Original author: Marco Glietsch + * Modified for octopus by Michael Hartmann <ich@speicherleck.de> + * All rights reserved. + * + * Short descripton of file: + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the FH Augsburg nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES{} LOSS OF USE, + * DATA, OR PROFITS{} OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef CAN_H +#define CAN_H + +#include <inttypes.h> + +#define setbit(ADR,BIT) (ADR |= (1<<BIT)) +#define clearbit(ADR,BIT) (ADR &=~(1<<BIT)) +#define getbit(ADR, BIT) (ADR & (1<<BIT)) + +/* CAN Objekte */ +#define NO_MOBS 15 // Anzahl der Message Objects festlegen +#define NOMOB 0xff // Definition für ungültigen Objektindex + +// baudrate +enum { CAN_BAUDRATE_100K, CAN_BAUDRATE_125K, CAN_BAUDRATE_200K, + CAN_BAUDRATE_250K, CAN_BAUDRATE_500K, CAN_BAUDRATE_1000K }; + +// Betriebsmodi +enum { CAN_MODE_DISABLED, CAN_MODE_TRANSMIT_DATA, CAN_MODE_TRANSMIT_REMOTE, + CAN_MODE_RECEIVE_DATA, CAN_MODE_AUTO_REPLY }; + +// Interrupt-Modi +enum { CAN_INTERRUPTS_NONE, CAN_INTERRUPTS_TX, CAN_INTERRUPTS_RX, + CAN_INTERRUPTS_TXRX }; + +void can_parser(uint8_t *buf); + +int can_init(uint8_t baudrate, uint8_t intmode, uint8_t eid); +void can_init_usb(uint8_t baudrate, uint8_t eid); + +int can_deinit(void); +void can_deinit_usb(void); + +int can_enable_mob(uint8_t mob, uint8_t mode, uint32_t id, uint32_t idm); +void can_enable_mob_usb(uint8_t mob, uint8_t mode, uint32_t id, uint32_t idm); + +int can_disable_mob(uint8_t mob); +void can_disable_mob_usb(uint8_t mob); + +int can_send_data(uint8_t mob, uint8_t length, uint8_t * data); +void can_send_data_usb(uint8_t mob, uint8_t length, uint8_t *data); + +int can_send_remote(uint8_t mob); +void can_send_remote_usb(uint8_t mob); + +void can_receive_data_usb(int mob); + +void can_set_autoreply(uint8_t mob, uint8_t length, uint8_t *buf); +void can_set_autoreply_usb(uint8_t mob, uint8_t length, uint8_t *buf); + +// sonsitge hilfsfunktionen +int can_set_baudrate(uint8_t baudrate); +int can_set_interrupt(uint8_t mode); +void can_get_mob(uint8_t mob); +uint32_t can_get_id(void); +void can_set_id_mask(uint32_t idm); +void can_set_id(uint32_t id); +int can_set_mode(uint8_t mode); +uint8_t can_get_mode(void); +void can_set_data(uint8_t length, uint8_t * data); +void can_get_data(int8_t *msg); +void can_set_mob_interrupt(uint8_t object); +void can_clear_mob_interrupt(uint8_t mob); +uint8_t can_get_mob_interrupt(void); + +#endif /* CAN_H */ diff --git a/firmware/common.c b/firmware/common.c index 9947c59..69f3c94 100644 --- a/firmware/common.c +++ b/firmware/common.c @@ -80,11 +80,17 @@ void common_parser(char *buf) void common_init(void) { - int i; + uint8_t i; for(i=1;i<=19;i++) - io_init(i); - for(i=26;i<=44;i++) - io_init(i); + { + io_init(i); + io_set_pin(i, 0); + } + for(i=24;i<=42;i++) + { + io_init(i); + io_set_pin(i, 0); + } } @@ -100,7 +106,7 @@ void common_hwdesc(void) answer[7] = 'p'; answer[8] = 'u';answer[9] = 's';answer[10] = '_'; #endif answer[11] = '0'; answer[12] = '1'; - answer[13] = 0x00; + answer[13] = 0; CommandAnswer(14); } diff --git a/firmware/common.h b/firmware/common.h index 3229718..11716fb 100644 --- a/firmware/common.h +++ b/firmware/common.h @@ -31,32 +31,46 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#ifndef COMMON_H +#define COMMON_H + +#include <inttypes.h> +#include <stdbool.h> enum signals {PIN_NONE,PIN_IN,PIN_OUT,PIN_TRI, PIN_AD,PIN_RX,PIN_TX, PIN_SS,PIN_SCK,PIN_MISO,PIN_MOSI, PIN_SCL,PIN_SDA,PIN_PWM, - PIN_UART}; + PIN_UART,PIN_CAN}; +#ifdef __AVR_AT90CAN128__ + #define OCTOPUS_CAN +#endif -#define OCTOPUS_CAN +//#define OCTOPUS_RELAIS -//#define DEBUG +#define DEBUG 1 #define F_CPU 16000000UL #define STATUS_LED_PIN PB7 #define STATUS_LED_PORT PORTB /* red status led */ +#ifndef OCTOPUS_RELAIS #define STATUS_LED_on (STATUS_LED_PORT |= (1 << STATUS_LED_PIN)) #define STATUS_LED_off (STATUS_LED_PORT &= ~(1 << STATUS_LED_PIN)) +#else +#define STATUS_LED_on (1); +#define STATUS_LED_off (1); +#endif volatile struct octopus_t { volatile unsigned char latency_timer; - int ports[45]; + volatile unsigned char status_led; + uint8_t ports[43]; volatile char * msg[20]; volatile int datatogl; volatile unsigned int long_rx_cmd; @@ -71,7 +85,7 @@ volatile struct octopus_t void CommandAnswer(unsigned int length); -void CommandAnswerRest(void); +void CommandAnswerRest (void); void USBCommandRX(char *buf); void USBMessageIn(char *buf); @@ -91,3 +105,4 @@ void common_init(void); void common_hwdesc(void); +#endif //COMMON_H diff --git a/firmware/debug.c b/firmware/debug.c index 539a3e2..5e7a950 100644 --- a/firmware/debug.c +++ b/firmware/debug.c @@ -1,4 +1,7 @@ #include <inttypes.h> +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> #include <avr/io.h> #include "uart.h" @@ -8,21 +11,39 @@ #define UART_PORT 0 -void debug_init(void) { +void debug_dummy(char *fmt, ...) {} + +void debug_init() +{ +#ifdef DEBUG +#warning Compiling with debug-support! uart_init(UART_PORT); uart_baudrate(UART_PORT, 25, 0, 0, 0); uart_stopbits(UART_PORT, 1); uart_databits(UART_PORT, 8); uart_parity(UART_PORT, 'N'); + + static FILE mystdout = FDEV_SETUP_STREAM(debug_putchar, NULL, + _FDEV_SETUP_WRITE); + stdout = &mystdout; +#endif } -void debug_deinit(void) { - uart_deinit(UART_PORT); +int debug_putchar(char c, FILE *stream) +{ +#ifdef DEBUG + if (c == '\n') + uart_putchar(UART_PORT, '\r'); + uart_putchar(UART_PORT, c); +#endif + return 1; } -void debug_write(char *buf) { - while(*buf) - uart_putchar(UART_PORT, *buf++); +void debug_deinit(void) +{ +#ifdef DEBUG + uart_deinit(UART_PORT); +#endif } unsigned char debug_AsciiToHex(unsigned char high, unsigned char low) @@ -52,6 +73,7 @@ unsigned char debug_AsciiToHex(unsigned char high, unsigned char low) void debug_SendHex(unsigned char hex) { +#ifdef DEBUG unsigned char high,low; // get highnibble high = hex & 0xF0; @@ -69,4 +91,8 @@ void debug_SendHex(unsigned char hex) uart_putchar(UART_PORT, low+48); else uart_putchar(UART_PORT, low+87); + + //_debug_write("\r\n"); +#endif } + diff --git a/firmware/debug.h b/firmware/debug.h index 8aa15d9..202ef22 100644 --- a/firmware/debug.h +++ b/firmware/debug.h @@ -1,5 +1,12 @@ +#ifdef DEBUG +#define debugf printf("%s,%d: ", __FILE__, __LINE__); printf +#else +#define debugf debug_dummy +#endif + +void debug_dummy(char *fmt, ...); void debug_init(void); +int debug_putchar(char c, FILE *stream); void debug_deinit(void); -void debug_write(char *buf); unsigned char debug_AsciiToHex(unsigned char high, unsigned char low); void debug_SendHex(unsigned char hex); diff --git a/firmware/eeprom.c b/firmware/eeprom.c new file mode 100644 index 0000000..3f0c1a1 --- /dev/null +++ b/firmware/eeprom.c @@ -0,0 +1,119 @@ +#include "common.h" +#include "protocol.h" + +#include <inttypes.h> +#include <stdbool.h> +#include <avr/io.h> +#include <avr/eeprom.h> +#include <stdio.h> + +#include "eeprom.h" +#include "debug.h" + +#define EEPROM_READY() while(EECR & (1 << EEWE)); + +void eeprom_parser(char *buf) +{ + uint16_t addr; + uint16_t length; + + addr = ((uint16_t)buf[2]) + + ((uint16_t)buf[3] << 8); + + length = ((uint16_t)buf[4]) + + ((uint16_t)buf[5] << 8); + + debugf("eeprom_parser: length: %u, addr: %u\n", length, addr); + + switch(buf[0]) + { + case CMD_EEPROM_READ_BYTES: + eeprom_read_bytes_usb(addr, length); + break; + + case CMD_EEPROM_WRITE_BYTES: + eeprom_write_bytes_usb(addr, &buf[6], length); + break; + + default: + answer[0] = buf[0]; + answer[1] = RSP_UNKOWN_CMD; + answer[2] = 0; + CommandAnswer(3); + } +} + + +void eeprom_read_bytes_usb(uint16_t addr, uint16_t length) +{ + answer[0] = CMD_EEPROM_READ_BYTES; + answer[1] = eeprom_read_bytes(addr, (char *)&answer[2], length); + answer[2+length] = 0; + + debugf("read: %s\n", &answer[2]); + + CommandAnswer(3+length); +} + +uint8_t eeprom_read_bytes(uint16_t addr, char * buf, uint16_t length) +{ + uint8_t i; + + if(addr > MAX_ADDR) + return RSP_ERROR; + + // wait for eeprom + EEPROM_READY(); + + for(i = 0; i < length; i++) + { + + buf[i] = eeprom_read_byte((uint8_t*) addr++); + // set addr + //EEAR = addr++; + + //EECR |= (1 << EERE); + + //buf[i] = EEDR; + //debug_SendHex(buf[i]); + } + + return RSP_OK; +} + +void eeprom_write_bytes_usb(uint16_t addr, char * buf, uint16_t length) +{ + answer[0] = CMD_EEPROM_WRITE_BYTES; + answer[1] = eeprom_write_bytes(addr, buf, length); + answer[2] = 0; + + debugf("written: %s\n", buf); + + CommandAnswer(3); +} + +uint8_t eeprom_write_bytes(uint16_t addr, char * buf, uint16_t length) +{ + uint8_t i; + + if(addr > MAX_ADDR) + return RSP_ERROR; + + // wait for eeprom + EEPROM_READY(); + + for(i = 0; i < length; i++) + { + eeprom_write_byte ((uint8_t*) addr++, buf[i]); + + //EEAR = addr++; + //EEDR = buf[i]; + + //EECR |= (1 << EEMWE); + //EECR |= (1 << EEWE); + } + + eeprom_read_bytes(addr, buf, length); + + return RSP_OK; +} diff --git a/firmware/eeprom.h b/firmware/eeprom.h new file mode 100644 index 0000000..2ac7d4a --- /dev/null +++ b/firmware/eeprom.h @@ -0,0 +1,11 @@ +#include <inttypes.h> +#include <stdbool.h> + +#define MAX_ADDR 4095 + +void eeprom_parser(char *buf); + +void eeprom_read_bytes_usb(uint16_t addr, uint16_t length); +uint8_t eeprom_read_bytes(uint16_t addr, char * buf, uint16_t length); +void eeprom_write_bytes_usb(uint16_t addr, char * buf, uint16_t length); +uint8_t eeprom_write_bytes(uint16_t addr, char * buf, uint16_t length); diff --git a/firmware/fifo.c b/firmware/fifo.c index a1e0f87..17551d7 100644 --- a/firmware/fifo.c +++ b/firmware/fifo.c @@ -2,26 +2,26 @@ void fifo_init (fifo_t *f, uint8_t *buffer, const uint8_t size) { - f->count = 0; - f->pread = f->pwrite = buffer; - f->read2end = f->write2end = f->size = size; + f->count = 0; + f->pread = f->pwrite = buffer; + f->read2end = f->write2end = f->size = size; } uint8_t fifo_put (fifo_t *f, const uint8_t data) { - return _inline_fifo_put (f, data); + return _inline_fifo_put (f, data); } uint8_t fifo_get_wait (fifo_t *f) { - while (!f->count); - - return _inline_fifo_get (f); + while (!f->count); + + return _inline_fifo_get (f); } int fifo_get_nowait (fifo_t *f) { - if (!f->count) return -1; - - return (int) _inline_fifo_get (f); + if (!f->count) return -1; + + return (int) _inline_fifo_get (f); } diff --git a/firmware/i2c.c b/firmware/i2c.c index b7d55fe..4baa7bb 100644 --- a/firmware/i2c.c +++ b/firmware/i2c.c @@ -36,9 +36,12 @@ #include "common.h" #include "protocol.h" #include "i2c.h" +#define I2C_WAIT_FOR_COMPLETE() while (!(TWCR & (1<<TWINT))); + +void i2c_parser(char *buf) +{ + answer[0] = buf[0]; -void i2c_parser(char *buf) { -answer[0] = buf[0]; switch(buf[0]){ case CMD_I2C_INIT: i2c_init_usb(); @@ -49,45 +52,32 @@ answer[0] = buf[0]; case CMD_I2C_SET_BITRATE: i2c_set_bitrate_usb((char)buf[2]); break; - case CMD_I2C_SEND_BYTE: - i2c_send_byte_usb((int)buf[2]); + + case CMD_I2C_SEND: + i2c_send_usb((int)buf[2], &buf[3]); break; - case CMD_I2C_RECV_BYTES: - i2c_reveice_bytes_usb((int)buf[3],(int)buf[1]-4, (int)buf[2]); + case CMD_I2C_RECV: + i2c_recv_usb((int)buf[2],(int)buf[3]); break; + case CMD_I2C_SEND_START: i2c_send_start_usb(); break; case CMD_I2C_SEND_STOP: i2c_send_stop_usb(); break; + default: - answer[0]=buf[0]; - answer[1]=RSP_UNKOWN_CMD; - answer[2]=0; + answer[1] = RSP_UNKOWN_CMD; + answer[2] = 0; CommandAnswer(3); } } -unsigned char i2c_get_twsr(void) -{ - return (TWSR & 0xF8); -} - - -void i2c_wait_for_complete(void) -{ - while (!(TWCR & (1<<TWINT))){ - //do nothing just wait - ; - } -} - void i2c_init_usb(void) { - answer[0]=CMD_I2C_INIT; answer[1]=(unsigned char)i2c_init(); answer[2]=0; CommandAnswer(3); @@ -105,7 +95,6 @@ int i2c_init(void) void i2c_deinit_usb(void) { - answer[0]=CMD_I2C_DEINIT; answer[1]=(unsigned char)i2c_deinit(); answer[2]=0; CommandAnswer(3); @@ -114,17 +103,16 @@ void i2c_deinit_usb(void) int i2c_deinit(void) { TWCR &= ~(1<<TWEN); // deinit - octopus.ports[12]=PIN_OUT; // this is wrong! - octopus.ports[13]=PIN_OUT; // this is wrong! + octopus.ports[12]=PIN_NONE; + octopus.ports[13]=PIN_NONE; return RSP_OK; } void i2c_set_bitrate_usb(char bitrate) { - answer[0] = CMD_I2C_SET_BITRATE; answer[1] = (unsigned char)i2c_set_bitrate(bitrate); - answer[2] = '\0'; + answer[2] = 0; CommandAnswer(3); } @@ -140,77 +128,82 @@ int i2c_set_bitrate(char bitrate) { void i2c_send_start_usb(void) { - answer[0] = CMD_I2C_SEND_START; answer[1] = (unsigned char)i2c_send_start(); - answer[2] = '\0'; + answer[2] = 0; CommandAnswer(3); } +unsigned char i2c_get_twsr(void) +{ + return (TWSR & 0xF8); +} + int i2c_send_start(void) { i2c_get_twsr(); TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); - i2c_wait_for_complete(); + I2C_WAIT_FOR_COMPLETE(); return RSP_OK; } + + + void i2c_send_stop_usb(void) { - answer[0]=CMD_I2C_SEND_STOP; answer[1]=(unsigned char)i2c_send_stop(); answer[2]=0; CommandAnswer(3); } - int i2c_send_stop(void) { TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); + while(TWCR & (1<<TWSTO)); return RSP_OK; } -void i2c_send_byte_usb(char data) +void i2c_send_usb(int length, char *data) { - i2c_send_byte(data); + i2c_send(data, length); - answer[0] = CMD_I2C_SEND_BYTE; answer[1] = RSP_OK; - answer[2] = '\0'; + answer[2] = 0; CommandAnswer(3); } -void i2c_send_byte(char data) +void i2c_send(char *data, int length) { - TWDR = data; - TWCR = (1<<TWINT) | (1<<TWEN); - i2c_wait_for_complete(); + int i; + + for(i = 0; i < length; i++) { + TWDR = data[i]; + TWCR = (1<<TWINT) | (1<<TWEN); + I2C_WAIT_FOR_COMPLETE(); + } } -void i2c_reveice_bytes_usb(int address,int len, int timeout) + +void i2c_recv_usb(int address, int length) { - /* receive */ - //i2c_get_twsr(); - //print_hex(s); - - //i2c_send_start(); - /* slave address = 0x10; */ - //buf[3] = (0x10 << 1)|1; /* (00010000<<1) | R */ - //i2c_send_byte( (0x10 << 1)|1); - - - answer[0]=CMD_I2C_RECV_BYTES; + int i; + + answer[0]=CMD_I2C_RECV; answer[1]=RSP_OK; - answer[2]=1; - answer[3]=i2c_receive_byte(); - CommandAnswer(5); + + for(i = 0; i < length; i++) + answer[2+i] = i2c_recv_byte(); + + answer[length+2] = 0; + + CommandAnswer(3+length); } -unsigned char i2c_receive_byte(void) +unsigned char i2c_recv_byte(void) { TWCR = (1<<TWINT) | (1<<TWEN); - i2c_wait_for_complete(); + I2C_WAIT_FOR_COMPLETE(); return TWDR; } - diff --git a/firmware/i2c.h b/firmware/i2c.h index 89834ea..3d0f02b 100644 --- a/firmware/i2c.h +++ b/firmware/i2c.h @@ -47,22 +47,21 @@ int i2c_deinit(void); int i2c_set_bitrate(char); int i2c_send_start(void); int i2c_send_stop(void); -void i2c_send_byte(char data); +void i2c_send(char *data, int length); unsigned char i2c_receive_byte(void); -unsigned char i2c_get_twsr(void); -void i2c_wait_for_complete(void); - void i2c_init_usb(void); void i2c_deinit_usb(void); void i2c_set_bitrate_usb(char); void i2c_send_start_usb(void); void i2c_send_stop_usb(void); -void i2c_send_byte_usb(char data); +void i2c_send_usb(int length, char *data); +unsigned char i2c_recv_byte(void); +int i2c_send_start(void); -void i2c_reveice_bytes_usb(int address,int len, int timeout); +void i2c_recv_usb(int address, int len); #endif /* I2C_H */ diff --git a/firmware/io.c b/firmware/io.c index 280f892..4227ec9 100644 --- a/firmware/io.c +++ b/firmware/io.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2007 Embedded Projects (http://www.embedded-projects.net) - * Author: Benedikt Sauter <sauter@ + * Author: Benedikt Sauter <sauter@embedded-projects.net> * All rights reserved. * * Short descripton of file: @@ -36,6 +36,8 @@ #include "common.h" #include "protocol.h" #include "io.h" +#include "pin.h" + void io_parser(char *buf) { @@ -77,6 +79,9 @@ void io_parser(char *buf) case CMD_IO_PIN_GET: io_get_pin_usb((uint8_t)buf[2]); break; + case CMD_IO_SET_STATUS_LED: + io_set_status_led_usb((uint8_t)buf[2]); + break; default: answer[0] = buf[0]; answer[1] = RSP_UNKOWN_CMD; @@ -87,12 +92,7 @@ void io_parser(char *buf) uint8_t io_init(uint8_t pin) { - if ((pin >= 1 && pin <= 19) || (pin >= 26 && pin <= 44)) - { - io_set_pin_direction_out(pin); - return RSP_OK; - } - return RSP_UNKOWN_PIN; + return io_set_pin_direction_out(pin); } void io_init_usb(uint8_t pin) @@ -120,16 +120,16 @@ void io_init_port_usb(uint8_t port) uint8_t io_set_port_direction_out(uint8_t port,uint8_t mask) { /* TODO - switch (port)
- {
- case 1: DDRB = mask; break;
+ switch (port) + { + case 1: DDRB = mask; break; case 2: DDRC = mask; break; // PC7 = /CS (output) - do we need to mask this ?
- case 3: DDRD = mask; break;
+ case 3: DDRD = mask; break; case 4: DDRE = mask; break; // PE4 = INT4 (input) - do we need to mask this ?
- case 5: DDRF = mask; break;
- default: return RSP_UNKOWN_PIN;
+ case 5: DDRF = mask; break; + default: return RSP_UNKOWN_PIN; } - */
+ */ return RSP_OK; } @@ -160,6 +160,7 @@ void io_set_port_direction_in_usb(uint8_t port, uint8_t mask) answer[2] = 0; CommandAnswer(3); } + void io_set_port_direction_tri_usb(uint8_t port, uint8_t mask) { answer[0] = CMD_IO_PORT_DIRECTION_TRI; @@ -171,131 +172,41 @@ void io_set_port_direction_tri_usb(uint8_t port, uint8_t mask) uint8_t io_set_pin_direction_out(uint8_t pin) { - if((pin >= 1 && pin <= 19) || (pin >=26 && pin <=44) ) - { - octopus.ports[pin] = PIN_OUT; - - switch(pin) - { - case 1: OX_DDR1 |=(1<<OX_P1); break; - case 2: OX_DDR2 |=(1<<OX_P2); break; - case 3: OX_DDR3 |=(1<<OX_P3); break; - case 4: OX_DDR4 |=(1<<OX_P4); break; - case 5: OX_DDR5 |=(1<<OX_P5); break; - case 6: OX_DDR6 |=(1<<OX_P6); break; - case 7: OX_DDR7 |=(1<<OX_P7); break; - case 8: OX_DDR8 |=(1<<OX_P8); break; - case 9: OX_DDR9 |=(1<<OX_P9); break; - case 10: OX_DDR10 |=(1<<OX_P10); break; - case 11: OX_DDR11 |=(1<<OX_P11); break; - case 12: OX_DDR12 |=(1<<OX_P12); break; - case 13: OX_DDR13 |=(1<<OX_P13); break; - case 14: OX_DDR14 |=(1<<OX_P14); break; - case 15: OX_DDR15 |=(1<<OX_P15); break; - case 16: OX_DDR16 |=(1<<OX_P16); break; - case 17: OX_DDR17 |=(1<<OX_P17); break; - case 18: OX_DDR18 |=(1<<OX_P18); break; - case 19: OX_DDR19 |=(1<<OX_P19); break; - - case 26: OX_DDR26 |=(1<<OX_P26); break; - case 27: OX_DDR27 |=(1<<OX_P27); break; - case 28: OX_DDR28 |=(1<<OX_P28); break; - case 29: OX_DDR29 |=(1<<OX_P29); break; - case 30: OX_DDR30 |=(1<<OX_P30); break; - case 31: OX_DDR31 |=(1<<OX_P31); break; - case 32: OX_DDR32 |=(1<<OX_P32); break; - case 33: OX_DDR33 |=(1<<OX_P33); break; - case 34: OX_DDR34 |=(1<<OX_P34); break; - case 35: OX_DDR35 |=(1<<OX_P35); break; - case 36: OX_DDR36 |=(1<<OX_P36); break; - case 37: OX_DDR37 |=(1<<OX_P37); break; - case 38: OX_DDR38 |=(1<<OX_P38); break; - case 39: OX_DDR39 |=(1<<OX_P39); break; - case 40: OX_DDR40 |=(1<<OX_P40); break; - case 41: OX_DDR41 |=(1<<OX_P41); break; - case 42: OX_DDR42 |=(1<<OX_P42); break; - case 43: OX_DDR43 |=(1<<OX_P43); break; - case 44: OX_DDR44 |=(1<<OX_P44); break; - default: - return RSP_UNKOWN_PIN; - } - return RSP_OK; - } - else { - return RSP_UNKOWN_PIN; - } + pin_conf p; + + if(!pin_get_conf(pin, &p)) + return RSP_UNKOWN_PIN; + + octopus.ports[pin] = PIN_OUT; + *(p.ox_ddr) |= (1 << p.ox_p); + + return RSP_OK; } -uint8_t io_set_pin_direction_in(uint8_t pin) +uint8_t io_set_pin_direction_in(uint8_t pin) { - if((pin >= 1 && pin <= 19) || (pin >=26 && pin <=44) ) - { - octopus.ports[pin] = PIN_IN; - switch (pin) - { - case 1: OX_DDR1 &=~(1<<OX_P1); break; - case 2: OX_DDR2 &=~(1<<OX_P2); break; - case 3: OX_DDR3 &=~(1<<OX_P3); break; - case 4: OX_DDR4 &=~(1<<OX_P4); break; - case 5: OX_DDR5 &=~(1<<OX_P5); break; - case 6: OX_DDR6 &=~(1<<OX_P6); break; - case 7: OX_DDR7 &=~(1<<OX_P7); break; - case 8: OX_DDR8 &=~(1<<OX_P8); break; - case 9: OX_DDR9 &=~(1<<OX_P9); break; - case 10: OX_DDR10 &=~(1<<OX_P10); break; - case 11: OX_DDR11 &=~(1<<OX_P11); break; - case 12: OX_DDR12 &=~(1<<OX_P12); break; - case 13: OX_DDR13 &=~(1<<OX_P13); break; - case 14: OX_DDR14 &=~(1<<OX_P14); break; - case 15: OX_DDR15 &=~(1<<OX_P15); break; - case 16: OX_DDR16 &=~(1<<OX_P16); break; - case 17: OX_DDR17 &=~(1<<OX_P17); break; - case 18: OX_DDR18 &=~(1<<OX_P18); break; - case 19: OX_DDR19 &=~(1<<OX_P19); break; - - case 26: OX_DDR26 &=~(1<<OX_P26); break; - case 27: OX_DDR27 &=~(1<<OX_P27); break; - case 28: OX_DDR28 &=~(1<<OX_P28); break; - case 29: OX_DDR29 &=~(1<<OX_P29); break; - case 30: OX_DDR30 &=~(1<<OX_P30); break; - case 31: OX_DDR31 &=~(1<<OX_P31); break; - case 32: OX_DDR32 &=~(1<<OX_P32); break; - case 33: OX_DDR33 &=~(1<<OX_P33); break; - case 34: OX_DDR34 &=~(1<<OX_P34); break; - case 35: OX_DDR35 &=~(1<<OX_P35); break; - case 36: OX_DDR36 &=~(1<<OX_P36); break; - case 37: OX_DDR37 &=~(1<<OX_P37); break; - case 38: OX_DDR38 &=~(1<<OX_P38); break; - case 39: OX_DDR39 &=~(1<<OX_P39); break; - case 40: OX_DDR40 &=~(1<<OX_P40); break; - case 41: OX_DDR41 &=~(1<<OX_P41); break; - case 42: OX_DDR42 &=~(1<<OX_P42); break; - case 43: OX_DDR43 &=~(1<<OX_P43); break; - case 44: OX_DDR44 &=~(1<<OX_P44); break; - default: - return RSP_UNKOWN_PIN; - } - return RSP_OK; - } - else - { - return RSP_UNKOWN_PIN; - } + pin_conf p; + + if(!pin_get_conf(pin, &p)) + return RSP_UNKOWN_PIN; + + octopus.ports[pin] = PIN_IN; + *(p.ox_ddr) &= ~(1 << p.ox_p); + + return RSP_OK; } -uint8_t io_set_pin_direction_tri(uint8_t pin) + +uint8_t io_set_pin_direction_tri(uint8_t pin) { - if ((pin >= 1 && pin <= 19) || (pin >=26 && pin <=44) ) + if(io_set_pin_direction_out(pin) == RSP_OK && + io_set_pin(pin,1) == RSP_OK) { - octopus.ports[pin] = PIN_TRI; - io_set_pin_direction_out(pin); - io_set_pin(pin,1); - return RSP_OK; - } - else - { - return RSP_UNKOWN_PIN; + octopus.ports[pin] = PIN_TRI; + return RSP_OK; } + else + return RSP_UNKOWN_PIN; } @@ -324,55 +235,58 @@ void io_set_pin_direction_tri_usb(uint8_t pin) } - +//XXX uint8_t io_get_port (uint8_t port, uint8_t *pvalue) { - uint8_t value;
-
- *pvalue = 0;
- switch (port)
- {
- case 1: value = PINB; break;
- case 2: value = PINC; break; /* PC7 = /CS */
- case 3: value = PIND; break;
- case 4: value = PINE; break; /* PE4 = INTR */
- case 5: value = PINF; break;
- default: return RSP_UNKOWN_PORT;
- }
- *pvalue = value;
- return RSP_OK; + uint8_t value; + + *pvalue = 0; + switch (port) + { + case 1: value = PINB; break; + case 2: value = PINC; break; /* PC7 = /CS */ + case 3: value = PIND; break; + case 4: value = PINE; break; /* PE4 = INTR */ + case 5: value = PINF; break; + default: return RSP_UNKOWN_PORT; + } + + *pvalue = value; + return RSP_OK; } -void io_get_port_usb (uint8_t port)
-{
- uint8_t value;
+void io_get_port_usb (uint8_t port) +{ + uint8_t value; - answer[0] = CMD_IO_PORT_GET;
- answer[1] = (unsigned char)io_get_port (port, &value);
- answer[2] = (unsigned char)value;
- CommandAnswer(3);
+ answer[0] = CMD_IO_PORT_GET; + answer[1] = (unsigned char)io_get_port (port, &value); + answer[2] = (unsigned char)value; + answer[3] = 0; + CommandAnswer(4); } +// XXX uint8_t io_set_port(uint8_t port, uint8_t value) { - switch (port)
- {
- case 1: PORTB = value; break;
- case 2: PORTC = value; break; // PC7 = /CS
- case 3: PORTD = value; break;
- case 4: PORTE = value; break; // PE4 = INTR
- case 5: PORTF = value; break;
- default: return RSP_UNKOWN_PIN;
- }
+ switch (port) + { + case 1: PORTB = value; break; + case 2: PORTC = value; break; // PC7 = /CS + case 3: PORTD = value; break; + case 4: PORTE = value; break; // PE4 = INTR + case 5: PORTF = value; break; + default: return RSP_UNKOWN_PIN; + } return RSP_OK; } -void io_set_port_usb (uint8_t port, uint8_t value)
-{
- answer[0] = CMD_IO_PORT_SET;
- answer[1] = (unsigned char)io_set_port (port, value);
- answer[2] = 0;
- CommandAnswer(3);
+void io_set_port_usb (uint8_t port, uint8_t value) +{ + answer[0] = CMD_IO_PORT_SET; + answer[1] = (unsigned char)io_set_port (port, value); + answer[2] = 0; + CommandAnswer(3); } @@ -387,59 +301,20 @@ void io_set_pin_usb(uint8_t pin, uint8_t value) uint8_t io_set_pin(uint8_t pin, uint8_t value) { - if(octopus.ports[pin] == PIN_OUT) - { - switch(pin) - { - case 1: if(value) OX_PORT1 |=(1<<OX_P1); else OX_PORT1 &=~(1<<OX_P1); break; - case 2: if(value) OX_PORT2 |=(1<<OX_P2); else OX_PORT2 &=~(1<<OX_P2); break; - case 3: if(value) OX_PORT3 |=(1<<OX_P3); else OX_PORT3 &=~(1<<OX_P3); break; - case 4: if(value) OX_PORT4 |=(1<<OX_P4); else OX_PORT4 &=~(1<<OX_P4); break; - case 5: if(value) OX_PORT5 |=(1<<OX_P5); else OX_PORT5 &=~(1<<OX_P5); break; - case 6: if(value) OX_PORT6 |=(1<<OX_P6); else OX_PORT6 &=~(1<<OX_P6); break; - case 7: if(value) OX_PORT7 |=(1<<OX_P7); else OX_PORT7 &=~(1<<OX_P7); break; - case 8: if(value) OX_PORT8 |=(1<<OX_P8); else OX_PORT8 &=~(1<<OX_P8); break; - case 9: if(value) OX_PORT9 |=(1<<OX_P9); else OX_PORT9 &=~(1<<OX_P9); break; - case 10: if(value) OX_PORT10 |=(1<<OX_P10); else OX_PORT10 &=~(1<<OX_P10); break; - case 11: if(value) OX_PORT11 |=(1<<OX_P11); else OX_PORT11 &=~(1<<OX_P11); break; - case 12: if(value) OX_PORT12 |=(1<<OX_P12); else OX_PORT12 &=~(1<<OX_P12); break; - case 13: if(value) OX_PORT13 |=(1<<OX_P13); else OX_PORT13 &=~(1<<OX_P13); break; - case 14: if(value) OX_PORT14 |=(1<<OX_P14); else OX_PORT14 &=~(1<<OX_P14); break; - case 15: if(value) OX_PORT15 |=(1<<OX_P15); else OX_PORT15 &=~(1<<OX_P15); break; - case 16: if(value) OX_PORT16 |=(1<<OX_P16); else OX_PORT16 &=~(1<<OX_P16); break; - case 17: if(value) OX_PORT17 |=(1<<OX_P17); else OX_PORT17 &=~(1<<OX_P17); break; - case 18: if(value) OX_PORT18 |=(1<<OX_P18); else OX_PORT18 &=~(1<<OX_P18); break; - case 19: if(value) OX_PORT19 |=(1<<OX_P19); else OX_PORT19 &=~(1<<OX_P19); break; - - case 26: if(value) OX_PORT26 |=(1<<OX_P26); else OX_PORT26 &=~(1<<OX_P26); break; - case 27: if(value) OX_PORT27 |=(1<<OX_P27); else OX_PORT27 &=~(1<<OX_P27); break; - case 28: if(value) OX_PORT28 |=(1<<OX_P28); else OX_PORT28 &=~(1<<OX_P28); break; - case 29: if(value) OX_PORT29 |=(1<<OX_P29); else OX_PORT29 &=~(1<<OX_P29); break; - case 30: if(value) OX_PORT30 |=(1<<OX_P30); else OX_PORT30 &=~(1<<OX_P30); break; - case 31: if(value) OX_PORT31 |=(1<<OX_P31); else OX_PORT31 &=~(1<<OX_P31); break; - case 32: if(value) OX_PORT32 |=(1<<OX_P32); else OX_PORT32 &=~(1<<OX_P32); break; - case 33: if(value) OX_PORT33 |=(1<<OX_P33); else OX_PORT33 &=~(1<<OX_P33); break; - case 34: if(value) OX_PORT34 |=(1<<OX_P34); else OX_PORT34 &=~(1<<OX_P34); break; - case 35: if(value) OX_PORT35 |=(1<<OX_P35); else OX_PORT35 &=~(1<<OX_P35); break; - case 36: if(value) OX_PORT36 |=(1<<OX_P36); else OX_PORT36 &=~(1<<OX_P36); break; - case 37: if(value) OX_PORT37 |=(1<<OX_P37); else OX_PORT37 &=~(1<<OX_P37); break; - case 38: if(value) OX_PORT38 |=(1<<OX_P38); else OX_PORT38 &=~(1<<OX_P38); break; - case 39: if(value) OX_PORT39 |=(1<<OX_P39); else OX_PORT39 &=~(1<<OX_P39); break; - case 40: if(value) OX_PORT40 |=(1<<OX_P40); else OX_PORT40 &=~(1<<OX_P40); break; - case 41: if(value) OX_PORT41 |=(1<<OX_P41); else OX_PORT41 &=~(1<<OX_P41); break; - case 42: if(value) OX_PORT42 |=(1<<OX_P42); else OX_PORT42 &=~(1<<OX_P42); break; - case 43: if(value) OX_PORT43 |=(1<<OX_P43); else OX_PORT43 &=~(1<<OX_P43); break; - case 44: if(value) OX_PORT44 |=(1<<OX_P44); else OX_PORT44 &=~(1<<OX_P44); break; - default: - return RSP_UNKOWN_PIN; - } - - return RSP_OK; - } - else - { - return RSP_WRONG_PIN_CONFIG; - } + pin_conf p; + + if(!pin_get_conf(pin, &p)) + return RSP_UNKOWN_PIN; + + if(octopus.ports[pin] != PIN_OUT) + return RSP_WRONG_PIN_CONFIG; + + if(value) + *(p.ox_port) |= (1 << p.ox_p); + else + *(p.ox_port) &= ~(1 << p.ox_p); + + return RSP_OK; } @@ -450,63 +325,42 @@ void io_get_pin_usb(uint8_t pin) answer[0] = CMD_IO_PIN_GET; answer[1] = (unsigned char)io_get_pin(pin,&value); answer[2] = (unsigned char)value; - CommandAnswer(3); + answer[3] = 0; + CommandAnswer(4); } uint8_t io_get_pin(uint8_t pin, uint8_t *value) { - *value = 0;
- if (octopus.ports[pin] == PIN_IN)
- {
- switch (pin)
- {
- case 1: if (OX_PIN1 & (1<<OX_P1)) *value=1; break;
- case 2: if (OX_PIN2 & (1<<OX_P2)) *value=1; break;
- case 3: if (OX_PIN3 & (1<<OX_P3)) *value=1; break;
- case 4: if (OX_PIN4 & (1<<OX_P4)) *value=1; break;
- case 5: if (OX_PIN5 & (1<<OX_P5)) *value=1; break;
- case 6: if (OX_PIN6 & (1<<OX_P6)) *value=1; break;
- case 7: if (OX_PIN7 & (1<<OX_P7)) *value=1; break;
- case 8: if (OX_PIN8 & (1<<OX_P8)) *value=1; break;
- case 9: if (OX_PIN9 & (1<<OX_P9)) *value=1; break;
- case 10: if (OX_PIN10 & (1<<OX_P10)) *value=1; break;
- case 11: if (OX_PIN11 & (1<<OX_P11)) *value=1; break;
- case 12: if (OX_PIN12 & (1<<OX_P12)) *value=1; break;
- case 13: if (OX_PIN13 & (1<<OX_P13)) *value=1; break;
- case 14: if (OX_PIN14 & (1<<OX_P14)) *value=1; break;
- case 15: if (OX_PIN15 & (1<<OX_P15)) *value=1; break;
- case 16: if (OX_PIN16 & (1<<OX_P16)) *value=1; break;
- case 17: if (OX_PIN17 & (1<<OX_P17)) *value=1; break;
- case 18: if (OX_PIN18 & (1<<OX_P18)) *value=1; break;
- case 19: if (OX_PIN19 & (1<<OX_P19)) *value=1; break;
-
- case 26: if (OX_PIN26 & (1<<OX_P26)) *value=1; break;
- case 27: if (OX_PIN27 & (1<<OX_P27)) *value=1; break;
- case 28: if (OX_PIN28 & (1<<OX_P28)) *value=1; break;
- case 29: if (OX_PIN29 & (1<<OX_P29)) *value=1; break;
- case 30: if (OX_PIN30 & (1<<OX_P30)) *value=1; break;
- case 31: if (OX_PIN31 & (1<<OX_P31)) *value=1; break;
- case 32: if (OX_PIN32 & (1<<OX_P32)) *value=1; break;
- case 33: if (OX_PIN33 & (1<<OX_P33)) *value=1; break;
- case 34: if (OX_PIN34 & (1<<OX_P34)) *value=1; break;
- case 35: if (OX_PIN35 & (1<<OX_P35)) *value=1; break;
- case 36: if (OX_PIN36 & (1<<OX_P36)) *value=1; break;
- case 37: if (OX_PIN37 & (1<<OX_P37)) *value=1; break;
- case 38: if (OX_PIN38 & (1<<OX_P38)) *value=1; break;
- case 39: if (OX_PIN39 & (1<<OX_P39)) *value=1; break;
- case 40: if (OX_PIN40 & (1<<OX_P40)) *value=1; break;
- case 41: if (OX_PIN41 & (1<<OX_P41)) *value=1; break;
- case 42: if (OX_PIN42 & (1<<OX_P42)) *value=1; break;
- case 43: if (OX_PIN43 & (1<<OX_P43)) *value=1; break;
- case 44: if (OX_PIN44 & (1<<OX_P44)) *value=1; break;
- default: return RSP_UNKOWN_PIN;
- }
- return RSP_OK;
- }
- else
- {
- return RSP_WRONG_PIN_CONFIG;
- } + pin_conf p; + + if(!pin_get_conf(pin, &p)) + return RSP_UNKOWN_PIN; + + if(octopus.ports[pin] != PIN_IN) + return RSP_WRONG_PIN_CONFIG; + + if(*(p.ox_pin) & (1 << p.ox_p)) + *value = 1; + else + *value = 0; + + return RSP_OK; } +void io_set_status_led(uint8_t on) +{ + if(on) + octopus.status_led = 1; + else + octopus.status_led = 0; +} +void io_set_status_led_usb(uint8_t on) +{ + io_set_status_led(on); + + answer[0] = CMD_IO_PIN_GET; + answer[1] = on; + answer[2] = 0; + CommandAnswer(3); +} diff --git a/firmware/io.h b/firmware/io.h index f86314f..5cfb5f4 100644 --- a/firmware/io.h +++ b/firmware/io.h @@ -38,169 +38,9 @@ #include <avr/io.h> #include <avr/pgmspace.h> - -#define OX_PIN1 PINE -#define OX_PIN2 PINE -#define OX_PIN3 PINE -#define OX_PIN4 PINB -#define OX_PIN5 PINB -#define OX_PIN6 PINB -#define OX_PIN7 PINB -#define OX_PIN8 PINB -#define OX_PIN9 PINB -#define OX_PIN10 PINB -#define OX_PIN11 PINB -#define OX_PIN12 PIND -#define OX_PIN13 PIND -#define OX_PIN14 PIND -#define OX_PIN15 PIND -#define OX_PIN16 PIND -#define OX_PIN17 PIND -#define OX_PIN18 PIND -#define OX_PIN19 PIND - -#define OX_PIN26 PINC -#define OX_PIN27 PINC -#define OX_PIN28 PINC -#define OX_PIN29 PINC -#define OX_PIN30 PINC -#define OX_PIN31 PINC -#define OX_PIN32 PINC -#define OX_PIN33 PINF -#define OX_PIN34 PINF -#define OX_PIN35 PINF -#define OX_PIN36 PINF -#define OX_PIN37 PINF -#define OX_PIN38 PINF -#define OX_PIN39 PINF -#define OX_PIN40 PINF -#define OX_PIN41 PINE -#define OX_PIN42 PINE -#define OX_PIN43 PINE -#define OX_PIN44 PINE - -#define OX_PORT1 PORTE -#define OX_PORT2 PORTE -#define OX_PORT3 PORTE -#define OX_PORT4 PORTB -#define OX_PORT5 PORTB -#define OX_PORT6 PORTB -#define OX_PORT7 PORTB -#define OX_PORT8 PORTB -#define OX_PORT9 PORTB -#define OX_PORT10 PORTB -#define OX_PORT11 PORTB -#define OX_PORT12 PORTD -#define OX_PORT13 PORTD -#define OX_PORT14 PORTD -#define OX_PORT15 PORTD -#define OX_PORT16 PORTD -#define OX_PORT17 PORTD -#define OX_PORT18 PORTD -#define OX_PORT19 PORTD - -#define OX_PORT26 PORTC -#define OX_PORT27 PORTC -#define OX_PORT28 PORTC -#define OX_PORT29 PORTC -#define OX_PORT30 PORTC -#define OX_PORT31 PORTC -#define OX_PORT32 PORTC -#define OX_PORT33 PORTF -#define OX_PORT34 PORTF -#define OX_PORT35 PORTF -#define OX_PORT36 PORTF -#define OX_PORT37 PORTF -#define OX_PORT38 PORTF -#define OX_PORT39 PORTF -#define OX_PORT40 PORTF -#define OX_PORT41 PORTE -#define OX_PORT42 PORTE -#define OX_PORT43 PORTE -#define OX_PORT44 PORTE - -#define OX_DDR1 DDRE -#define OX_DDR2 DDRE -#define OX_DDR3 DDRE -#define OX_DDR4 DDRB -#define OX_DDR5 DDRB -#define OX_DDR6 DDRB -#define OX_DDR7 DDRB -#define OX_DDR8 DDRB -#define OX_DDR9 DDRB -#define OX_DDR10 DDRB -#define OX_DDR11 DDRB -#define OX_DDR12 DDRD -#define OX_DDR13 DDRD -#define OX_DDR14 DDRD -#define OX_DDR15 DDRD -#define OX_DDR16 DDRD -#define OX_DDR17 DDRD -#define OX_DDR18 DDRD -#define OX_DDR19 DDRD - -#define OX_DDR26 DDRC -#define OX_DDR27 DDRC -#define OX_DDR28 DDRC -#define OX_DDR29 DDRC -#define OX_DDR30 DDRC -#define OX_DDR31 DDRC -#define OX_DDR32 DDRC -#define OX_DDR33 DDRF -#define OX_DDR34 DDRF -#define OX_DDR35 DDRF -#define OX_DDR36 DDRF -#define OX_DDR37 DDRF -#define OX_DDR38 DDRF -#define OX_DDR39 DDRF -#define OX_DDR40 DDRF -#define OX_DDR41 DDRE -#define OX_DDR42 DDRE -#define OX_DDR43 DDRE -#define OX_DDR44 DDRE - - -#define OX_P1 PE5 -#define OX_P2 PE6 -#define OX_P3 PE7 -#define OX_P4 PB0 -#define OX_P5 PB1 -#define OX_P6 PB2 -#define OX_P7 PB3 -#define OX_P8 PB4 -#define OX_P9 PB5 -#define OX_P10 PB6 -#define OX_P11 PB7 -#define OX_P12 PD0 -#define OX_P13 PD1 -#define OX_P14 PD2 -#define OX_P15 PD3 -#define OX_P16 PD4 -#define OX_P17 PD5 -#define OX_P18 PD6 -#define OX_P19 PD7 - -#define OX_P26 PC0 -#define OX_P27 PC1 -#define OX_P28 PC2 -#define OX_P29 PC3 -#define OX_P30 PC4 -#define OX_P31 PC5 -#define OX_P32 PC6 -#define OX_P33 PF7 -#define OX_P34 PF6 -#define OX_P35 PF5 -#define OX_P36 PF4 -#define OX_P37 PF3 -#define OX_P38 PF2 -#define OX_P39 PF1 -#define OX_P40 PF0 -#define OX_P41 PE0 -#define OX_P42 PE1 -#define OX_P43 PE2 -#define OX_P44 PE3 - - +#ifdef __AVR_AT90CAN128__ + #define OCTOPUS_CAN +#endif void io_parser(char *buf); @@ -240,6 +80,8 @@ void io_set_pin_usb(uint8_t pin, uint8_t value); uint8_t io_get_pin(uint8_t pin, uint8_t *value); void io_get_pin_usb(uint8_t pin); +void io_set_status_led(uint8_t on); +void io_set_status_led_usb(uint8_t on); #define PORT(port,pin) (PORT##port) #define DDR(port,pin) (DDR##port) diff --git a/firmware/main.c b/firmware/main.c index ef802a2..6bd7c32 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -16,19 +16,19 @@ #include "protocol.h" #include "wait.h" -#include "io.h" +#include "93c46.h" #include "adc.h" +#include "can.h" +#include "eeprom.h" #include "i2c.h" -#include "spi.h" +#include "io.h" #include "pwm.h" +#include "spi.h" #include "uart.h" -#include "93c46.h" +#include <stdio.h> #include "debug.h" -//#define DEBUG 1 - - SIGNAL (SIG_INTERRUPT4) { @@ -48,185 +48,218 @@ SIGNAL (SIG_OVERFLOW0) } -void -USBCommandRX (char *buf) +void USBCommandRX (char *buf) { int i; -#ifdef DEBUG - debug_write("get \0"); - debug_SendHex(buf[1]); - debug_write("\r\n"); -#endif + debugf("receiving command: %X (length: %u)\n", buf[1]); /* a paket can be max 255 bytes */ if (octopus.long_rx_cmd == 1) - { -#ifdef DEBUG - debug_write("get next\r\n"); -#endif - for (i = 0; i < 64; i++) - request[octopus.long_rx_index + i] = buf[i]; + { + debugf("get next\n"); + + for (i = 0; i < 64; i++) + request[octopus.long_rx_index + i] = buf[i]; - octopus.long_rx_index = octopus.long_rx_index + i; + octopus.long_rx_index = octopus.long_rx_index + i; - if (octopus.long_rx_index >= octopus.long_rx_bytes) - { - octopus.long_rx_cmd = 0; - USBMessageIn (request); - } - } + if (octopus.long_rx_index >= octopus.long_rx_bytes) + { + octopus.long_rx_cmd = 0; + USBMessageIn (request); + } + } else - { -#ifdef DEBUG - debug_write("get and execute\r\n\0"); -#endif - octopus.long_rx_index = 0; - for (i = 0; i < 64; i++) - request[octopus.long_rx_index + i] = buf[i]; - - octopus.long_rx_index = i; - - if ((unsigned int) buf[1] < 64) - { - octopus.long_rx_cmd = 0; - USBMessageIn (request); - } - else - { - octopus.long_rx_cmd = 1; - octopus.long_rx_bytes = (unsigned int) buf[1]; - } - } + { + debugf("get and execute\n"); + + octopus.long_rx_index = 0; + for (i = 0; i < 64; i++) + request[octopus.long_rx_index + i] = buf[i]; + + octopus.long_rx_index = i; + + if ((unsigned int) buf[1] < 64) + { + octopus.long_rx_cmd = 0; + USBMessageIn (request); + } + else + { + octopus.long_rx_cmd = 1; + octopus.long_rx_bytes = (unsigned int) buf[1]; + } + } } /* is called when received data from pc */ -void -USBMessageIn (char *buf) +void USBMessageIn (char *buf) { octopus.long_index = 0; octopus.long_running = 0; - STATUS_LED_on; -#ifdef DEBUG - debug_write("parser\r\n\0"); -#endif + if(octopus.status_led) + STATUS_LED_on; + int check = ((int) buf[0] >> 4) & 0x0F; + debugf("parser, check: %X, command: %X\n", check, buf[0]); + switch (check) - { - case 0: - if (buf[0] == CMD_EXTERNAL_DEVICE) - { - switch (buf[2]) - { - case CMD_EXTERNAL_93C46: - flash_93c46_parser (buf); - break; - default: - ; - } - } - else - common_parser (buf); - break; - case 1: - io_parser (buf); - break; - case 2: - adc_parser (buf); - break; - case 3: - i2c_parser (buf); - break; - case 4: - spi_parser (buf); - break; - case 5: - pwm_parser (buf); - break; - case 6: - uart_parser (buf); - break; - default: - answer[0] = buf[0]; - answer[1] = RSP_UNKOWN_CMD; - answer[2] = 0; - CommandAnswer (3); - } + { + case 0: + if (buf[0] == CMD_EXTERNAL_DEVICE) + { + switch (buf[2]) + { + case CMD_EXTERNAL_93C46: + flash_93c46_parser(buf); + break; + } + } + else + common_parser(buf); + + break; + + case 1: + debugf("calling io_parser\n"); + io_parser (buf); + break; + case 2: + debugf("calling adc_parser\n"); + adc_parser (buf); + break; + case 3: + debugf("calling i2c_parser\n"); + i2c_parser (buf); + break; + case 4: + debugf("calling spi_parser\n"); + spi_parser (buf); + break; + case 5: + debugf("calling pwm_parser\n"); + pwm_parser (buf); + break; + case 6: + debugf("calling adc_parser\n"); + uart_parser (buf); + break; + case 7: +#ifdef OCTOPUS_CAN + debugf("calling can_parser\n"); + can_parser ((uint8_t *)buf); +#else + debugf("can't call can_parser - no CAN-support\n"); +#endif + break; + case 8: + debugf("calling eeprom_parser\n"); + eeprom_parser(buf); + break; + default: + debugf("unknown cmd\n"); + answer[0] = buf[0]; + answer[1] = RSP_UNKOWN_CMD; + answer[2] = 0; + CommandAnswer(3); + } + + if(octopus.status_led) + STATUS_LED_off; +} - STATUS_LED_off; + +unsigned int strlen(volatile unsigned char *str) +{ + unsigned int len = 0; + + while (*str++) + len++; + + return len; } -void -CommandAnswer (unsigned int length) +void CommandAnswer(unsigned int length) { int i; - // if first packet of a lang message + // if first packet of a long message if (length > 64 && octopus.long_running == 0) - { - octopus.long_index = 0; - octopus.long_bytes = length; - octopus.long_running = 1; - length = 64; - } + { + debugf("first packet of a long message (length: %d)\n", length); + octopus.long_index = 0; + octopus.long_bytes = length; + octopus.long_running = 1; + length = 64; + } USBNWrite (FIFOTXC1, FLUSH); for (i = 0; i < length; i++) - USBNWrite (TXD1, answer[octopus.long_index + i]); + USBNWrite (TXD1, answer[octopus.long_index + i]); /* control togl bit */ if (octopus.datatogl == 1) - { - USBNWrite (FIFOTXC1, TX_LAST + TX_EN + TX_TOGL); - octopus.datatogl = 0; - } + { + USBNWrite (FIFOTXC1, TX_LAST + TX_EN + TX_TOGL); + octopus.datatogl = 0; + } else - { - USBNWrite (FIFOTXC1, TX_LAST + TX_EN); - octopus.datatogl = 1; - } + { + USBNWrite (FIFOTXC1, TX_LAST + TX_EN); + octopus.datatogl = 1; + } } -void -CommandAnswerRest (void) +void CommandAnswerRest (void) { if (octopus.long_running == 1) - { - if (octopus.long_index < octopus.long_bytes) - { - int dif = octopus.long_bytes - octopus.long_index; - octopus.long_index = octopus.long_index + 64; - - if (dif > 64) - CommandAnswer (64); - - else - { - /* last packet */ - CommandAnswer (dif); - octopus.long_running = 0; - } - } - } + { + debugf("octopus long running message\n"); + if (octopus.long_index < octopus.long_bytes) + { + debugf("octopus.long_index < octopus.long_bytes\n"); + int diff = octopus.long_bytes - octopus.long_index; + octopus.long_index = octopus.long_index + 64; + + if (diff > 64) + { + debugf("not last packet: diff > 64\n"); + CommandAnswer (64); + } + else + { + debugf("last packet\n"); + /* last packet */ + CommandAnswer (diff); + octopus.long_running = 0; + } + } + } } -int -main (void) +int main(void) { - DDRB = 0xFF; - PORTB = 0xFF; + cli(); + USBNInitMC (); + USBNStartClock(); + + DDRB = 0xFF; + PORTB = 0x00; + + /* use status led */ + octopus.status_led = 1; int interf; int conf; - STATUS_LED_off; USBNInit (); @@ -237,17 +270,19 @@ main (void) USBNDeviceBCDDevice (0x0001); // you can use it as version e.g. version 1.02 char lang[] = { 0x09, 0x04, 0x00 }; - _USBNAddStringDescriptor (lang); // language descriptor + _USBNAddStringDescriptor (lang); // language descriptor /* Attention!!! Descriptors must be a factor of 8 (error in the stack) */ USBNDeviceManufacture ("EmbeddedProjects"); USBNDeviceProduct ("OctopusUSB Interface Converter and I/O Extension"); - USBNDeviceSerialNumber ("20081108"); + //USBNDeviceProduct ("Octopus USB v3.3"); + USBNDeviceSerialNumber ("20090718"); conf = USBNAddConfiguration (); - USBNConfigurationPower (conf, 100); + // we reserve 500mA, because users could drive LEDs and need more power + USBNConfigurationPower (conf, 200); interf = USBNAddInterface (conf, 0); USBNAlternateSetting (conf, interf, 0); @@ -255,33 +290,32 @@ main (void) /* communication */ USBNAddInEndpoint (conf, interf, 1, 0x01, BULK, 64, 0, &CommandAnswerRest); USBNAddOutEndpoint (conf, interf, 1, 0x01, BULK, 64, 0, &USBCommandRX); - - USBNInitMC (); + //USBNAddOutEndpoint (conf, interf, 1, 0x02, BULK, 64, 0, NULL); octopus.datatogl = 0; octopus.long_rx_cmd = 0; - /* start usb chip */ - USBNStart (); - /* UARTInit2(38400,8,'N',1); */ - #ifdef DEBUG - debug_init(); - #endif + debug_init(); /* hello world led pattern */ - DDRC = 0xFF; - PORTC = 0xAA; + DDRC = 0x7F; + PORTC = 0x2A; delay_250ms (); - PORTC = 0xD5; + PORTC = 0x55; delay_250ms (); - PORTC = 0x80; + PORTC = 0x00; - // testpin - //PORTB = 0xFF; - //PORTB = 0x00; + common_init(); - while (1); + /* init connection between avr and usbn9604 */ + USBNInitMC (); + /* start usb chip */ + USBNStart (); + sei(); + + while (1); return 0; } + diff --git a/firmware/main.hex b/firmware/main.hex index 3d38158..d7795f1 100644 --- a/firmware/main.hex +++ b/firmware/main.hex @@ -1,844 +1,1327 @@ -:100000000C94FA000C9417010C9417010C9417012E
-:100010000C9417010C9408030C9417010C9417010D
-:100020000C9417010C9417010C9417010C941701F0
-:100030000C9475170C9417010C9417010C9417016C
-:100040000C9417010C94E1020C9417010C94170105
-:100050000C9417010C9419010C9417010C941701BE
-:100060000C9417010C9417010C9417010C941701B0
-:100070000C9417010C9417010C9417010C941701A0
-:100080000C9417010C9417010C9417010C94170190
-:100090000C941701AA0DAC0DAE0DB00DB20DB40D40
-:1000A000B60DB80DBA0DBC0DBE0DC00DC20DC40D00
-:1000B000C60DC80DCA0DCC0DCE0DFC0DFC0DFC0DF2
-:1000C000FC0DFC0DFC0DD00DD20DD40DD60DD80DB0
-:1000D000DA0DDC0DDE0DE00DE20DE40DE60DE80DB0
-:1000E000EA0DEC0DEE0DF00DF20DF60D490E4B0E76
-:1000F0004D0E4F0E510E530E550E570E590E5B0EF0
-:100100005D0E5F0E610E630E650E670E690E6B0E5F
-:100110006D0E9B0E9B0E9B0E9B0E9B0E9B0E6F0EF1
-:10012000710E730E750E770E790E7B0E7D0E7F0E9F
-:10013000810E830E850E870E890E8B0E8D0E8F0E0F
-:10014000910E950E090F0F0F150F1B0F210F270F83
-:100150002D0F330F390F3F0F450F4B0F510F570F17
-:100160005D0F630F690F6F0F750F060F060F060FF8
-:10017000060F060F060F7B0F810F870F8D0F930F52
-:10018000990F9F0FA50FAB0FB10FB70FBD0FC30F87
-:10019000C90FCF0FD50FDB0FE10FE70F37103A1064
-:1001A0003D1040104310461049104C104F10521093
-:1001B000551058105B105E106110641067106A10C3
-:1001C0006D1034103410341034103410341070109A
-:1001D0007310761079107C107F10821085108810B3
-:1001E0008B108E109110941097109A109D10A010E3
-:1001F000A310A61011241FBECFEFD0E1DEBFCDBFEC
-:1002000011E0A0E0B1E0E2E4F4E300E00BBF02C0E3
-:1002100007900D92A435B107D9F714E0A4E5B1E039
-:1002200001C01D92A93BB107E1F70C9423010C9486
-:1002300000001F920F920FB60F9211240F900FBE65
-:100240000F901F901895CCEFD0E1DEBFCDBF8FEFA0
-:1002500084B985B92F980E94650781E897E10E94CB
-:10026000B00785E69CE00E94B50781E090E00E941F
-:10027000BA07DE011196EBE4F1E083E001900D9204
-:100280008150E1F7CE0101960E94AF0B80E091E032
-:100290000E944B0C81E191E00E94430C82E491E0CA
-:1002A0000E943B0C0E94850B4C0164E670E00E94AA
-:1002B000C80760E070E0C4010E94F10A3C0140E020
-:1002C00050E0BC01C4010E94E90720EFA22E21E00A
-:1002D000B22ECC24DD2490E4E92EF12C02E021E0C2
-:1002E00030E041E050E0B301C4010E94860A87E794
-:1002F000A82E82E0B82E21E030E041E050E0B301CA
-:10030000C4010E94BE0A0E940A071092E1011092E5
-:10031000E0011092E3011092E2010E94790C8FEF4C
-:1003200087B98AEA88B90E942C0385ED88B90E94B2
-:100330002C0380E888B9FFCF0F931F93CF93DF93EF
-:10034000EC0181349105B0F08091EC019091ED01C8
-:10035000892B81F41092E9011092E801D093EB010E
-:10036000C093EA0181E090E09093ED018093EC016D
-:10037000C0E4D0E068E08BE20E94500700E010E0AB
-:100380000EC0E091E801F091E901E00FF11FEE5C91
-:10039000FC4F608189E20E9450070F5F1F4F0C17CE
-:1003A0001D0779F78091E0019091E101019749F4EF
-:1003B00067E08BE20E9450071092E1011092E00189
-:1003C0000AC063E08BE20E94500781E090E09093C6
-:1003D000E1018093E001DF91CF911F910F9108958A
-:1003E0008091EC019091ED01019771F52091E80168
-:1003F0003091E9018091EA019091EB0128173907CA
-:1004000018F52091EA013091EB018091E80190917B
-:10041000E901281B390B8091E8019091E901805C8A
-:100420009F4F9093E9018093E801213431052CF02E
-:1004300080E490E00E949C010895C9010E949C0103
-:100440001092ED011092EC010895FC011092E90167
-:100450001092E8011092ED011092EC0100002F9A29
-:100460002081822F82958F7099278230910511F11A
-:10047000833091052CF4009761F0019759F516C06F
-:1004800084309105F9F084309105C4F0059711F599
-:100490001DC0263039F48281813039F5CF010E94A8
-:1004A000421723C0CF010E94F30C1FC0CF010E944E
-:1004B00084111BC0CF010E94E71217C0CF010E9418
-:1004C0002A1413C0CF010E945C150FC0CF010E94F7
-:1004D00092180BC02093320383E080933303109271
-:1004E000340383E090E00E949C012F980895CF93FD
-:1004F000DF93EC018091E2019091E301019751F5C6
-:1005000020E030E0E091E401F091E501E20FF31F1B
-:10051000DE01A20FB31F8C91EE50FE4F80832F5F40
-:100520003F4F2034310571F78091E4019091E5014E
-:10053000805C9F4F9093E5018093E4012091E4015A
-:100540003091E5018091E6019091E7012817390784
-:10055000A8F11FC01092E5011092E40120E030E004
-:10056000E091E401F091E501E20FF31FDE01A20F3B
-:10057000B31F8C91EE50FE4F80832F5F3F4F20348E
-:10058000310571F73093E5012093E401A981A0348E
-:1005900048F41092E3011092E20182EF91E00E9490
-:1005A00025020CC081E090E09093E3018093E2018A
-:1005B0008A2F99279093E7018093E601DF91CF91ED
-:1005C00008951F920F920FB60F9211242F933F930D
-:1005D0004F935F936F937F938F939F93AF93BF934B
-:1005E000EF93FF930E94C50C80915D0186BDFF9142
-:1005F000EF91BF91AF919F918F917F916F915F919B
-:100600004F913F912F910F900FBE0F901F90189513
-:100610001F920F920FB60F9211242F933F934F9377
-:100620005F936F937F938F939F93AF93BF93EF935A
-:10063000FF930E94530CFF91EF91BF91AF919F9157
-:100640008F917F916F915F914F913F912F910F907B
-:100650000FBE0F901F90189520E080E49CE9019751
-:10066000F1F72F5F2931C9F70895FF920F931F9378
-:10067000162F042FF22E9C01442737FD4095542F4E
-:1006800060E472E48FE090E00E94D0192150304085
-:10069000163061F0173019F0153019F404C0E1E09C
-:1006A00003C0E1E004C0E0E070E002C0E0E071E01F
-:1006B000053439F00F3419F451E041E004C050E042
-:1006C00001C051E040E082E0F81611F462E001C0A0
-:1006D00060E0832F992787FD9A958093C50020932A
-:1006E000C40088E18093C100770FEE0FEE0FE72B77
-:1006F0005295550F507E5E2B4295407F452B660FDD
-:10070000660F660F642B6093C2001F910F91FF90DC
-:1007100008951092C50089E18093C40088E1809318
-:10072000C10086E08093C20008950895982F8091BB
-:10073000C00085FFFCCF9093C60008958091C00053
-:1007400087FFFCCF8091C600992708958A3310F463
-:10075000805301C087556A3310F4605301C0675558
-:100760006F708295807F682B862F99270895FC01F2
-:1007700007C08091C00085FFFCCF31969093C600E2
-:1007800090819923B1F70895982F92959F70282F03
-:100790002F709A3030F48091C00085FFFCCF905DBF
-:1007A00005C08091C00085FFFCCF995A9093C60088
-:1007B0002A3030F48091C00085FFFCCF205D05C059
-:1007C0008091C00085FFFCCF295A2093C600089570
-:1007D00087E280939A0485E28093990490E2909353
-:1007E0009B0410929C0428E030E030939E042093F8
-:1007F0009D0483E28093A60481E28093A5049093F4
-:10080000A7041092A8043093AA042093A904089581
-:1008100008956091B20481E20E945007089568E053
-:100820008BE20E94500761E188E20E94500768E075
-:100830008FE20E94500761E18CE20E94500761E064
-:100840008FE20E9450071092E1011092E00165E0F2
-:1008500083E20E94500708950F931F938C0160E478
-:1008600080E20E945007F8016281605884E00E9493
-:100870005007F80182818093B1041F910F91089570
-:100880000F931F93CF93DF93EC01288539851216C0
-:100890001306DCF58E819F81821793071CF568E0B3
-:1008A00083E20E94500700E010E00FC08A859B851C
-:1008B000E80FF91F608181E20E9450078E819F81BD
-:1008C00001969F838E830F5F1F4FEE81FF81888586
-:1008D0009985083011051CF4E817F9073CF3E8176F
-:1008E000F90724F061E087E20E9450078B81813094
-:1008F00031F465E089810E9450071B8206C061E0E7
-:1009000089810E94500781E08B83DF91CF911F91F5
-:100910000F910895CF93DF93CDB7DEB724970FB62D
-:10092000F894DEBF0FBECDBFDC01FC012281338114
-:100930001092AC041092AB0481E08093A804832F42
-:1009400099278230D9F0833069F1813009F057C09E
-:100950008091850499279093AE048093AD0485E837
-:1009600094E09093B0048093AF04868197818034A3
-:10097000910509F044C088E090E029C0FD0186811E
-:1009800097819093AE048093AD04E22FFF27EE0F82
-:10099000FF1F8091970490919804E80FF91F8081C0
-:1009A000918129C02223C1F0E22FFF27EE0FFF1F04
-:1009B0008091F0019091F101E80FF91F0190F08111
-:1009C000E02DF093B004E093AF04808199279093D9
-:1009D000AE048093AD0413C094E0998383E08A83CE
-:1009E00089E08B839C8384E090E09093AE048093B5
-:1009F000AD04CE0101969093B0048093AF0485EAD4
-:100A000094E00E94400424960FB6F894DEBF0FBE17
-:100A1000CDBFDF91CF910895CF93DF9382E20E9403
-:100A20002B07C82FDD27C5FF1AC068E083E20E94AC
-:100A30005007C6FF10C02091AB043091AC048091E8
-:100A4000AD049091AE04281739072CF485EA94E0A0
-:100A50000E94400404C061E087E20E945007DF91D9
-:100A6000CF9108951F93CF93DF9388E00E942B07C7
-:100A7000182FC82FDD27C6FF18C060E085E00E9450
-:100A8000500760E884E00E94500760E080E20E9426
-:100A9000500768E083E20E94500761E087E20E940D
-:100AA000500762E085E00E945007C4FF04C060EC7C
-:100AB00089E00E94500717FF04C060ED89E00E94A2
-:100AC0005007DF91CF911F9108958AE00E942B0774
-:100AD000992780FF03C00E940C05089581FF0DC077
-:100AE0008AE20E942B0780917204813061F4E091C8
-:100AF0007504F09176040995089582E30E942B070E
-:100B00008AE30E942B0708958EE00E942B0768E07D
-:100B10008FE20E94500761E08FE20E94500720910F
-:100B2000AD043091AE048091A9049091AA0482177B
-:100B300093075CF468E083E20E94500761E087E27B
-:100B40000E94500781E08093A8040895AF92BF925D
-:100B5000CF92DF92EF92FF920F931F93CF93DF9389
-:100B6000CDB7DEB728970FB6F894DEBF0FBECDBF66
-:100B700086E20E942B0786FF7EC08E010F5F1F4F0B
-:100B8000580169E0C62ED12CCC0EDD1E809199044F
-:100B90000E942B07F80181938F017501EC15FD056B
-:100BA000A9F768E087E20E94500768E083E20E94AC
-:100BB000500780E20E942B078F77682F80E20E9407
-:100BC000500789819927807690708032910509F4C9
-:100BD00040C080349105D1F1892BF1F5F501818177
-:100BE0008630D9F0873048F48130F1F18130C8F097
-:100BF0008330D1F1853081F521C0893019F18A30F7
-:100C000018F4883049F505C08A3071F18B3021F530
-:100C100020C0C5010E94090427C0C5010E948A04A2
-:100C200023C068E083E20E94500761E081E20E94F5
-:100C3000500760E081E20E9450070BC0C5010E948E
-:100C40002C0412C0C5010E940F040EC0C5010E94F1
-:100C5000080765E083E206C080E20E942B07805807
-:100C6000682F80E20E945007F70180818823D1F429
-:100C700065E083E215C02091AD043091AE0480910F
-:100C8000A9049091AA048217930764F41092AE0409
-:100C90001092AD0468E083E20E94500761E087E2B1
-:100CA0000E94500728960FB6F894DEBF0FBECDBF46
-:100CB000DF91CF911F910F91FF90EF90DF90CF9038
-:100CC000BF90AF900895CF92DF92EF92FF920F9373
-:100CD0001F93CF93DF93CDB7DEB7C054D0400FB68C
-:100CE000F894DEBF0FBECDBF8CE00E942B07992782
-:100CF00080FF03C00E94A6057BC081FF2AC08EE250
-:100D00000E942B078DE20E942B0789838E010F5FC3
-:100D10001F4F6801FFE3EF2EF12CE00EF11E0F5F75
-:100D20001F4F0E941907F80180830E151F05B9F7A0
-:100D300080915401813031F4E0915701F0915801D4
-:100D4000C601099568E08FE20E94500761E08FE2DA
-:100D50002BC082FF2CC086E30E942B0785E30E94F4
-:100D60002B0789838E010F5F1F4F6801EFE3EE2E83
-:100D7000F12CE00EF11E0F5F1F4F0E941907F801C2
-:100D800080830E151F05B9F780915501813031F42C
-:100D9000E0915901F0915A01C601099568E087E395
-:100DA0000E94500761E087E30E94500721C083FF43
-:100DB0001FC08EE30E942B078E010F5F1F4F68013B
-:100DC00071E4E72EF12CEC0EFD1E8DE30E942B0743
-:100DD000F80181938F01EE15FF05B9F78091560157
-:100DE000813031F4E0915701F0915801C601099525
-:100DF000C05CDF4F0FB6F894DEBF0FBECDBFDF91F2
-:100E0000CF911F910F91FF90EF90DF90CF900895B9
-:100E10000895089581E080936A0080E18DBB83B3DB
-:100E2000876083BB84B3836084BB3F9A479A78947E
-:100E3000089588B1805888B984B322E0822784BBA2
-:100E40000000000080B198B1905898B994B39227EF
-:100E500094BB992708959FEF91B982B988B18058C2
-:100E600088B984B395E0892784BB88B1805888B954
-:100E700084B3892784BB000011B80E941907992701
-:100E8000089582B988B1805888B984B391E08927E0
-:100E900084BB88B1805888B984B3892784BB0895FE
-:100EA00082B98FEF81B988B1805888B984B395E051
-:100EB000892784BB88B1805888B984B3892784BBCB
-:100EC000862F0E9441070895089582E1809385044A
-:100ED00081E08093860480E191E090938804809380
-:100EE00087041092890410928A0410928B0488E07F
-:100EF00080938C0410928E0410928D0410929004B2
-:100F000010928F0410929204109291041092930404
-:100F10001092940410929504109296041092540129
-:100F2000109255011092560110927204109273049F
-:100F30001092740410927C0410927B041092EF01C2
-:100F40001092EE01089590938E0480938D04709317
-:100F5000900460938F0450939204409391040895F9
-:100F600090938E0480938D040895909390048093C1
-:100F70008F04089590939204809391040895809330
-:100F80008904089580938A04089580938B040895BA
-:100F9000CF93DF939C01CB01E0917B04F0917C0423
-:100FA00062E070E00E94BD190FC0A081B181828112
-:100FB000823039F4ED018D8199278217930709F466
-:100FC00068870780F085E02D309779F7DF91CF9122
-:100FD0000895CF93DF939C01E0917B04F0917C0412
-:100FE00014C0A081B1818281843061F48481992709
-:100FF0008217930739F4868199278617970711F48A
-:10100000ED014B830780F085E02D309751F7DF919C
-:10101000CF910895BF92CF92DF92EF92FF920F93FC
-:101020001F93CF93DF936C01162FF42EB22EC09135
-:101030007B04D0917C042097A1F489E090E00E9489
-:10104000C418FC0190937C0480937B04D182C082FD
-:10105000138310861782F282B4820583E68215C05C
-:10106000EC018F8198850097D9F789E090E00E9484
-:10107000C418FC0198878F83D182C0821383F282C7
-:10108000B4820583E68210861782DF91CF911F918B
-:101090000F91FF90EF90DF90CF90BF900895EF9267
-:1010A000FF921F93CF93DF937C01C091EE01D0910B
-:1010B000EF01209711F011E012C085E090E00E944E
-:1010C000C418FC019093EF018093EE01F182E0825D
-:1010D00012821482138210E012C01F5FEC018B8118
-:1010E0009C810097D1F785E090E00E94C418FC0134
-:1010F0009C838B83F182E082128314821382812F7E
-:101100009927DF91CF911F91FF90EF900895EF9273
-:10111000FF920F931F93CF93DF93E091EE01F09135
-:10112000EF0180E090E00380F481E02D019630979C
-:10113000D1F7880F991F0E94C4189093F1018093F2
-:10114000F0010091EE011091EF01E801E880F980D3
-:101150008A81C82FDD27CC0FDD1F8091F00190918F
-:10116000F101C80FD91FF701808199270E94C41887
-:101170009983888320E030E017C0E801EA81FF27E7
-:10118000EE0FFF1F8091F0019091F101E80FF91F20
-:101190000190F081E02DE20FF31FD701A20FB31FE2
-:1011A0008C9180832F5F3F4FF7018081992728170B
-:1011B00039071CF3E8018B819C81009711F08C01A9
-:1011C000C4CFDF91CF911F910F91FF90EF900895C1
-:1011D0004F925F926F927F928F929F92AF92BF9247
-:1011E000CF92DF92EF92FF920F931F93CF93DF93F3
-:1011F000E0917B04F0917C046624772409C082810D
-:10120000823019F40894611C711C0780F085E02D70
-:101210003097A9F74301880C991CC4010E94C41897
-:101220009093980480939704E1E0EE2EF12CAA2489
-:10123000BB2455C0E0917B04F0917C0479E0C72E7B
-:10124000D12C15C0A081B181848199278E159F056D
-:1012500019F48381C80ED11CED018D818E1521F406
-:101260008281823009F45D010780F085E02D30979E
-:1012700049F7009197041091980402501040080D0E
-:10128000191DC6010E94C418F8019183808320E0D3
-:1012900030E0E0919704F0919804E80DF91D329741
-:1012A0000190F081E02DE20FF31FD501A20FB31FD3
-:1012B0008C9180832F5F3F4F2930310551F7E091AA
-:1012C0009704F0919804E80DF91D32970190F08190
-:1012D000E02D8C2D875F82830894E11CF11C6E1435
-:1012E0007F040CF0A7CF61E0C62ED12C59E0A52ECB
-:1012F000B12C4424552442E0842E912CA1C0A0910D
-:101300007B04B0917C0412C0ED91FC911197818116
-:10131000823049F4858199278C159D0521F48481BB
-:10132000482E552405C0ED01AF81B885109761F7AF
-:1013300031E0E32EF12C79C060917B0470917C0444
-:101340006DC0FB01C081D1818981843009F063C007
-:10135000868199278E159F0509F05DC084819927A4
-:101360008C159D0509F057C0950140E050E0E091D3
-:101370009704F0919804E80DF91D32970190F081DF
-:10138000E02DE20FF31FDE01A40FB51F8C918083C7
-:101390002F5F3F4F4F5F5F4F4930510541F789E065
-:1013A00090E0A80EB91EC0917B04D0917C0431C09E
-:1013B0008A81853059F58C8199278C159D0531F5E9
-:1013C0008D8199278E159F0509F508811981950151
-:1013D00040E050E0E0919704F0919804E80DF91D89
-:1013E00032970190F081E02DE20FF31FD801A40F96
-:1013F000B51F8C9180832F5F3F4F4F5F5F4F47300A
-:10140000510541F7E7E0F0E0AE0EBF1E0F80D88532
-:10141000C02D209769F6EB016F8178856115710504
-:1014200009F08FCF0894E11CF11C4E145F040CF0FE
-:1014300083CF0894C11CD11CE2E0F0E08E0E9F1E09
-:101440006C147D040CF05BCFDF91CF911F910F9155
-:10145000FF90EF90DF90CF90BF90AF909F908F90D4
-:101460007F906F905F904F9008956F927F928F92D0
-:101470009F92AF92BF92CF92DF92EF92FF920F9323
-:10148000CF93DF935C013B014901E0917B04F09134
-:101490007C0416C0A081B18184819927A816B90661
-:1014A00061F4868199278615970539F48281843005
-:1014B00021F4ED018C818F5F8C830780F085E02D16
-:1014C000309741F787E090E00E94C418FC0187E064
-:1014D000808385E0818382820383F582E482C682F1
-:1014E000EE24062D2A2D45E067E0CF010E940A0870
-:1014F000DF91CF910F91FF90EF90DF90CF90BF9051
-:10150000AF909F908F907F906F900895AF92BF9211
-:10151000CF92DF92EF92FF920F93FC01A114B104DE
-:1015200001F14230510571F04330510599F04130DD
-:101530005105B9F481E080937204B0927604A092D0
-:1015400075040FC081E080937304B0927804A09278
-:10155000770407C081E080937404B0927A04A0926B
-:10156000790420583F4FCF010E94350A0F91FF9018
-:10157000EF90DF90CF90BF90AF900895AF92BF9261
-:10158000CF92DF92EF92FF920F93FC014230510510
-:1015900071F04330510599F041305105B9F481E0C3
-:1015A00080935401B0925801A09257010FC081E07E
-:1015B00080935501B0925A01A092590107C081E071
-:1015C00080935601B0925C01A0925B01CF010E9412
-:1015D000350A0F91FF90EF90DF90CF90BF90AF90C2
-:1015E0000895CF92DF92EF920F931F93CF93DF93E3
-:1015F0006C018B01A0917B04B0917C04C0E0D0E031
-:1016000014C02D913C911197F90185818C1551F4ED
-:10161000FD018281823031F4F90184818F5F8483FE
-:10162000C82FDD27FD01A781B085109751F789E00C
-:1016300090E00E94C418FC0189E0808384E08183EB
-:101640000283138214821582168217821086EC2E72
-:1016500000E02C2D44E069E0CF010E940A08CE0191
-:10166000DF91CF911F910F91EF90DF90CF90089570
-:10167000BF92CF92DF92EF92FF920F931F93CF937F
-:10168000DF936C017B01142FB22EA0917B04B091EB
-:101690007C04C0E0D0E014C02D913C911197F90179
-:1016A00085818C1551F4FD018281823031F4F9017C
-:1016B00084818F5F8483C82FDD27FD01A781B085DA
-:1016C000109751F789E090E00E94C418FC0189E06E
-:1016D000808384E08183E282138214821583B68240
-:1016E00007831086EC2E00E02C2D44E069E0CF014A
-:1016F0000E940A08CE01DF91CF911F910F91FF90B8
-:10170000EF90DF90CF90BF900895EF920F931F93CB
-:10171000109196041F5F1093960489E090E00E9458
-:10172000C418FC0189E0808389E090E09383828380
-:1017300082E0818314821583168280EA87838AE19E
-:101740008087EE2400E020E042E069E0CF010E94C3
-:101750000A08812F99271F910F91EF900895CF9339
-:10176000DF93EC01FC0101900020E9F7E81BF90B85
-:10177000CF01880F991F0E94C4189C01FE0101909F
-:101780000020E9F7EC1BFD0BEE0FFF1FDC01EC93D3
-:1017900083E0F901818340E050E009C0FE01E40FDD
-:1017A000F51F80818C93FD0111824F5F5F4F129670
-:1017B000FE0101900020E9F73197EC1BFD0B4E175D
-:1017C0005F0760F3C9010E944F089927DF91CF910D
-:1017D0000895EF92FF920F931F93CF93DF938C01A5
-:1017E0007B01CA010E94AF0B9C01E0917B04F09148
-:1017F0007C0414C0A081B1818281843061F4848131
-:1018000099278017910739F4868199278E159F05AE
-:1018100011F4ED0128870780F085E02D309751F70E
-:10182000DF91CF911F910F91FF90EF9008950F934B
-:101830001F93CF93DF938C01CB010E94AF0B9C01D0
-:10184000E0917B04F0917C040FC0A081B181828182
-:10185000823039F4ED018D8199278017910709F4C1
-:101860002E830780F085E02D309779F7DF91CF91B7
-:101870001F910F9108950E94AF0B1816190614F4CA
-:101880008093950408950E94AF0B1816190614F45E
-:101890008093940408950E94AF0B1816190614F44F
-:1018A0008093930408951F9386E00E942B07992745
-:1018B00086FF03C00E9463060EC082FF03C00E9421
-:1018C000650509C081FF03C00E94320504C084FF82
-:1018D00002C00E94840587E00E942B07182F60E059
-:1018E00087E00E945007612F87E00E9450071F91F8
-:1018F00008950E94E8080E9487080E94E80361E0BA
-:1019000080E00E94500780E00E942B0780FDFBCF03
-:1019100062E081E00E94500760E884E00E94500786
-:1019200060E480E20E94500768E083E20E94500772
-:1019300069E087E20E9450076FE08DE00E94500747
-:101940006FE08BE00E94500768ED89E00E9450072D
-:1019500063E38FE00E94500766ED87E00E94500726
-:1019600062E085E00E9450076CEC80E00E94500726
-:1019700008958EEC80935D0181E080936E008091EC
-:101980005D0186BD83E084BD08950895089583E0D8
-:101990008093320381E0809333038BE080933403A0
-:1019A0002FE62093350393E69093360384E78093E4
-:1019B0003703209338039093390381E680933A03E9
-:1019C0008EE680933B038FE580933C0380E3809316
-:1019D0003D0381E380933E0310923F038EE090E04D
-:1019E0000E949C010895FC018081833011F40E94C3
-:1019F000C70C0895CF93DF93C1E0D0E08C2F0E94F5
-:101A00000B0E2196C431D105C9F7CAE1D0E08C2F65
-:101A10000E940B0E2196CD32D105C9F7DF91CF91EF
-:101A20000895CF93DF93DC01EC01EA81FB812191E2
-:101A30008E81815019F48981E81BF109ED01FB8346
-:101A4000EA838E839FB7F8948C9181508C939FBFCB
-:101A5000822F9927DF91CF910895FC011082758321
-:101A60006483738362834183478346830895CF935E
-:101A7000DF93DC019C91ED018981981718F080E0DB
-:101A800090E016C0ED01EC81FD8161938F81815062
-:101A900019F48981E81BF109ED018F83FD83EC8343
-:101AA0009FB7F8948C918F5F8C939FBF81E090E0FB
-:101AB000DF91CF910895FC0180818823E9F3CF0164
-:101AC0000E94110D99270895FC018081882319F443
-:101AD0008FEF9FEF0895CF010E94110D9927089570
-:101AE00081E090E0089581E090E0089581E090E049
-:101AF000089581E090E00895CF93DF93CDB7DEB7EE
-:101B000022970FB6F894DEBF0FBECDBF282F8150AD
-:101B1000833120F08951833108F06EC0E22FFF2716
-:101B2000EE0FFF1FE35AFE4F82E090E09283818325
-:101B3000822F9927AA27BB27FC013197EC32F105A8
-:101B400008F05AC0E65BFF4FEE0FFF1F0590F491BF
-:101B5000E02D09946D9A47C06E9A49C06F9A43C0B0
-:101B6000209A45C0219A3FC0229A41C0239A3BC087
-:101B7000249A3DC0259A37C0269A39C0279A33C087
-:101B8000509A35C0519A2FC0529A31C0539A2BC0E7
-:101B9000549A2DC0559A27C0569A29C0579A23C0E7
-:101BA000389A25C0399A1FC03A9A21C03B9A1BC067
-:101BB0003C9A1DC03D9A17C03E9A19C0879A13C01F
-:101BC000869A15C0859A0FC0849A11C0839A0BC05B
-:101BD000829A0DC0819A07C0809A09C0689A03C092
-:101BE000699A05C06A9A81E090E008C06B9AE1E0CA
-:101BF000F0E0FA83E98304C084E090E09A8389836B
-:101C000089819A8122960FB6F894DEBF0FBECDBFB0
-:101C1000DF91CF910895982F8150833130F0895111
-:101C2000833118F084E090E00895892F0E947C0DA4
-:101C300081E090E00895CF93DF93CDB7DEB7229790
-:101C40000FB6F894DEBF0FBECDBF282F8150833171
-:101C500020F08951833108F06EC0E22FFF27EE0F8C
-:101C6000FF1FE35AFE4F81E090E092838183822F31
-:101C70009927AA27BB27FC013197EC32F10508F020
-:101C80005AC0EA58FF4FEE0FFF1F0590F491E02D68
-:101C900009946D9847C06E9849C06F9843C02098CA
-:101CA00045C021983FC0229841C023983BC024984A
-:101CB0003DC0259837C0269839C0279833C0509822
-:101CC00035C051982FC0529831C053982BC05498AA
-:101CD0002DC0559827C0569829C0579823C03898CA
-:101CE00025C039981FC03A9821C03B981BC03C982A
-:101CF0001DC03D9817C03E9819C0879813C086989C
-:101D000015C085980FC0849811C083980BC0829825
-:101D10000DC0819807C0809809C0689803C0699871
-:101D200005C06A9881E090E008C06B98E1E0F0E0BF
-:101D3000FA83E98304C084E090E09A8389838981EF
-:101D40009A8122960FB6F894DEBF0FBECDBFDF9109
-:101D5000CF910895FB011082833091F0843028F4F4
-:101D6000813051F0823029F409C0843059F0853037
-:101D700059F085E090E0089583B107C086B105C0B1
-:101D800089B103C08CB101C08FB1808381E090E044
-:101D90000895833091F0843028F4813051F08230FE
-:101DA00029F409C0843059F0853069F084E090E06E
-:101DB000089565B905C068B903C06BB901C06EB9B3
-:101DC00081E090E0089561BB81E090E00895282FC4
-:101DD000E82FFF27EE0FFF1FE35AFE4F818192810C
-:101DE000029719F086E090E00895822F9927AA279C
-:101DF000BB27FC013197EC32F10540F4EE55FF4F63
-:101E0000EE0FFF1F0590F491E02D099484E090E01F
-:101E10000895662311F0759ADDC07598DBC06623BE
-:101E200011F0769AD7C07698D5C0662311F0779ACC
-:101E3000D1C07798CFC0662311F0289ACBC02898DC
-:101E4000C9C0662311F0299AC5C02998C3C066236A
-:101E500011F02A9ABFC02A98BDC0662311F02B9AB0
-:101E6000B9C02B98B7C0662311F02C9AB3C02C9838
-:101E7000B1C0662311F02D9AADC02D98ABC066237A
-:101E800011F02E9AA7C02E98A5C0662311F02F9AA4
-:101E9000A1C02F989FC0662311F0589A9BC05898F4
-:101EA00099C0662311F0599A95C0599893C066233A
-:101EB00011F05A9A8FC05A988DC0662311F05B9A20
-:101EC00089C05B9887C0662311F05C9A83C05C98D8
-:101ED00081C0662311F05D9A7DC05D987BC066234A
-:101EE00011F05E9A77C05E9875C0662311F05F9A14
-:101EF00071C05F986FC0662311F0409A6BC0409824
-:101F000069C0662311F0419A65C0419863C0662399
-:101F100011F0429A5FC042985DC0662311F0439A67
-:101F200059C0439857C0662311F0449A53C044984F
-:101F300051C0662311F0459A4DC045984BC06623A9
-:101F400011F0469A47C0469845C0662311F08F9A13
-:101F500041C08F983FC0662311F08E9A3BC08E9887
-:101F600039C0662311F08D9A35C08D9833C0662331
-:101F700011F08C9A2FC08C982DC0662311F08B9A8B
-:101F800029C08B9827C0662311F08A9A23C08A98AB
-:101F900021C0662311F0899A1DC089981BC0662351
-:101FA00011F0889A17C0889815C0662311F0709AAE
-:101FB00011C070980FC0662311F0719A0BC0719810
-:101FC00009C0662311F0729A05C0729803C0662397
-:101FD00021F0739A81E090E00895739881E090E099
-:101FE00008951F93182F8150833130F08951833128
-:101FF00018F084E090E013C0E12FFF27EE0FFF1FE1
-:10200000E35AFE4F83E090E092838183812F0E9408
-:102010007C0D61E0812F0E94E70E81E090E01F912E
-:102020000895CF93DF93282FEB011882E82FFF2725
-:10203000EE0FFF1FE35AFE4F81819281019719F045
-:1020400086E090E089C0822F9927AA27BB27FC0150
-:102050003197EC32F10540F4E253FF4FEE0FFF1FD2
-:102060000590F491E02D099484E090E075C0659BA3
-:1020700071C06EC0669B6EC06BC0679B6BC068C052
-:10208000189B68C065C0199B65C062C01A9B62C07E
-:102090005FC01B9B5FC05CC01C9B5CC059C01D9B8C
-:1020A00059C056C01E9B56C053C01F9B53C050C042
-:1020B000489B50C04DC0499B4DC04AC04A9B4AC036
-:1020C00047C04B9B47C044C04C9B44C041C04D9B44
-:1020D00041C03EC04E9B3EC03BC04F9B3BC038C042
-:1020E000309B38C035C0319B35C032C0329B32C0C6
-:1020F0002FC0339B2FC02CC0349B2CC029C0359BD4
-:1021000029C026C0369B26C023C07F9B23C020C089
-:102110007E9B20C01DC07D9B1DC01AC07C9B1AC029
-:1021200017C07B9B17C014C07A9B14C011C0799B49
-:1021300011C00EC0789B0EC00BC0609B0BC008C0C6
-:10214000619B08C005C0629B05C002C0639B02C0C2
-:1021500081E0888381E090E0DF91CF910895CF9373
-:10216000DF93CDB7DEB721970FB6F894DEBF0FBE71
-:10217000CDBF9BE190933203BE016F5F7F4F0E9402
-:1021800011108093330389818093340383E090E0BE
-:102190000E949C0121960FB6F894DEBF0FBECDBF02
-:1021A000DF91CF9108959AE1909332030E94E70E58
-:1021B000809333031092340383E090E00E949C01EB
-:1021C000089598E1909332030E94C90E80933303DF
-:1021D0001092340383E090E00E949C010895982FB0
-:1021E00089E180933203933099F0943028F4913050
-:1021F00059F0923029F40AC0943061F0953061F0C2
-:1022000085E090E020E00BC023B107C026B105C0F7
-:1022100029B103C02CB101C02FB181E090E08093BF
-:1022200033032093340383E090E00E949C010895DF
-:1022300097E1909332030E94F10F80933303109241
-:10224000340383E090E00E949C01089595E190930F
-:1022500032030E941B0E809333031092340383E0F9
-:1022600090E00E949C01089596E1909332030E94B1
-:102270007C0D809333031092340383E090E00E943E
-:102280009C01089584E18093320381E080933303BD
-:102290001092340383E090E00E949C01089582E153
-:1022A0008093320381E0809333031092340383E000
-:1022B00090E00E949C01089583E18093320381E0C5
-:1022C000809333031092340383E090E00E949C01DA
-:1022D000089580E18093320381E08093330310926C
-:1022E000340383E090E00E949C01089591E1909373
-:1022F00032030E940B0E809333031092340383E069
-:1023000090E00E949C010895FC0180818531C9F113
-:10231000863180F4823131F1833130F48031D1F073
-:10232000813109F04CC01AC0833109F1843109F0C0
-:1023300046C022C0883189F1893128F4863129F1DB
-:102340008731E9F526C08A3189F18A3158F18B311C
-:10235000B1F531C082810E946911089582810E9485
-:1023600076110895638182810E944F1108956381DF
-:1023700082810E945C110895638182810E944211D2
-:10238000089582810E942611089582810E9434114D
-:10239000089582810E9418110895638182810E94AC
-:1023A000E110089582810E94EF1008956381828177
-:1023B0000E94D310089582810E94AF1008958093E7
-:1023C000320383E0809333031092340383E090E080
-:1023D0000E949C010895FC018197089718F084E001
-:1023E00090E00895EE0FFF1FE35AFE4F84E090E067
-:1023F0009283818381E090E0089510927C00823086
-:10240000910541F08330910569F0019741F082E038
-:1024100090E0089580917C00806480937C0081E04E
-:1024200090E0089580917C00806C80937C0081E036
-:1024300090E0089593E890937A0090917C00907FCB
-:10244000982B90937C0080917A00806480937A002E
-:1024500080917A0086FDFCCF809178009091790080
-:1024600020E030E040E050E080917A00806480938A
-:102470007A0080917A0086FDFCCF8091780090915F
-:102480007900480F591F2F5F3F4F2430310561F706
-:1024900080917A008F7780937A00CA01969587950C
-:1024A000969587950895CF93DF939C01EB01198250
-:1024B0001882FC01EE0FFF1FE35AFE4F81819281CB
-:1024C000049719F086E090E03CC02432310541F1D8
-:1024D0002532310554F42232310541F123323105E0
-:1024E00014F52132310569F424C02632310591F00A
-:1024F0002632310594F02732310549F02832310572
-:1025000019F087E090E01DC080E090E014C081E009
-:1025100090E011C082E090E00EC083E090E00BC03C
-:1025200084E090E008C085E090E005C086E090E09F
-:1025300002C087E090E00E941A129983888381E0AC
-:1025400090E0DF91CF91089522E2209332030E9420
-:10255000FD118093330382E090E00E949C01089576
-:10256000CF93DF93CDB7DEB722970FB6F894DEBFD7
-:102570000FBECDBF21E220933203BE016F5F7F4FBC
-:102580000E9453128093330329813A81832F992724
-:10259000809334032093350384E090E00E949C01F3
-:1025A00022960FB6F894DEBF0FBECDBFDF91CF915C
-:1025B000089520E2209332030E94EB1180933303AD
-:1025C0001092340383E090E00E949C010895FC0186
-:1025D0008081813249F0823261F0803279F48281E7
-:1025E00099270E94D9120895828199270E94B012DA
-:1025F0000895828199270E94A4120895809332033E
-:1026000083E0809333031092340383E090E00E94D0
-:102610009C0108958091B9009927887F9070089552
-:102620008091BC0087FFFCCF0895ECEBF0E0808147
-:10263000846080838BE090E09093770180937601B3
-:102640008CE090E0909379018093780181E090E0B4
-:102650000895ECEBF0E080818B7F808382E090E056
-:10266000909377018093760190937901809378011C
-:1026700081E090E008958130910511F48CE00BC069
-:102680008230910511F488E106C0039719F082E0C9
-:1026900090E0089588E48093B8008091B9008C7F21
-:1026A0008093B9008091B9008093B90081E090E0F7
-:1026B00008958091B90084EA8093BC008091BC00A9
-:1026C00087FFFCCF81E090E0089584E98093BC000F
-:1026D00081E090E008958093BB0084E88093BC0083
-:1026E0008091BC0087FFFCCF80E090E0089584E8F3
-:1026F0008093BC008091BC0087FFFCCF8091BB0021
-:102700009927089585E38093320381E08093330312
-:102710008093340384E88093BC008091BC0087FFE1
-:10272000FCCF8091BB008093350385E090E00E9450
-:102730009C01089540E050E00FC0F901E40FF51F3F
-:1027400080818093BB0084E88093BC008091BC00B2
-:1027500087FFFCCF4F5F5F4F4617570774F384E343
-:102760008093320381E0809333031092340383E03B
-:1027700090E00E949C01089587E38093320384E9EE
-:102780008093BC0081E0809333031092340383E094
-:1027900090E00E949C01089586E38093320380912B
-:1027A000B90084EA8093BC008091BC0087FFFCCF15
-:1027B00081E0809333031092340383E090E00E9421
-:1027C0009C01089522E3209332030E943B138093DF
-:1027D00033031092340383E090E00E949C0108953B
-:1027E00081E380933203ECEBF0E080818B7F808388
-:1027F00082E090E090937701809376019093790145
-:102800008093780181E0809333031092340383E056
-:1028100090E00E949C01089580E380933203ECEBEA
-:10282000F0E08081846080838BE090E0909377017A
-:10283000809376018CE090E0909379018093780109
-:1028400081E0809333031092340383E090E00E9490
-:102850009C010895FC0180818433D9F0853338F4DC
-:10286000813379F0823381F0803389F507C0863374
-:1028700041F18633D8F0873351F526C00E940C14FD
-:1028800008950E94F0130895828199270E94E2130F
-:102890000895428155276181772764507040838174
-:1028A00034969F0199270E949A13089542815527D3
-:1028B0006181772764507040838199270E94821339
-:1028C00008950E94CC1308950E94BC13089580932C
-:1028D000320383E0809333031092340383E090E06B
-:1028E0000E949C01089585B1817F85B9239886E077
-:1028F00084B91CBC1DBC83E58CBD88E090E090933E
-:102900006901809368018AE090E090936B01809365
-:102910006A0189E090E090936D0180936C0181E001
-:1029200090E008951CBC1DBC82E090E0909369018A
-:102930008093680190936B0180936A0190936D017D
-:1029400080936C0181E090E00895089581E090E02B
-:102950000895AC0120E030E00AC0FA01E20FF31F55
-:1029600080818EBD0DB407FEFDCF2F5F3F4F261730
-:1029700037079CF381E090E00895DC0120E030E02F
-:1029800040E050E015C01EBC09C04F5F5F4F83E0C0
-:10299000493E58071CF088E090E008950DB407FE0A
-:1029A000F4CFFD01E20FF31F8EB580832F5F3F4F01
-:1029B0002617370744F381E090E00895CF93DF9323
-:1029C000EC0120E030E0A0E0B0E018C0FE01E20F32
-:1029D000F31F80818EBD08C0119683E0A93EB80721
-:1029E0001CF088E090E00FC00DB407FEF5CFFB01AE
-:1029F000E20FF31F8EB580832F5F3F4F24173507FB
-:102A00002CF381E090E0DF91CF9108950F931F9315
-:102A10008B0123E420933203AB0164E373E00E9453
-:102A2000DE148093330310923403C80102960E948F
-:102A30009C011F910F9108950F931F938C0184E4C3
-:102A400080933203B80184E393E00E94BD14809325
-:102A5000330310923403C80102960E949C011F9117
-:102A60000F91089523E4209332030E94A9148093C8
-:102A700033031092340383E090E00E949C01089598
-:102A800081E4809332030E94921480933303109266
-:102A9000340383E090E00E949C01089580E48093D9
-:102AA00032030E947314809333031092350383E042
-:102AB00090E00E949C010895CF93DF93EC01888100
-:102AC0008334A1F0843438F4813469F0823458F5C9
-:102AD0008034F1F405C0843481F08534C9F411C028
-:102AE0000E944E1520C00E9440151DC069817727A5
-:102AF000CE0102960E94321516C0898199270E9444
-:102B00001C1569817727CE0102960E9406150BC01D
-:102B10008093320383E0809333031092340383E085
-:102B200090E00E949C01DF91CF910895209A219A14
-:102B3000229A2398249A259A2C982D9882E090E046
-:102B40009093850180938401909383018093820107
-:102B5000909381018093800181E090E090937F01C8
-:102B600080937E01089582E090E0909369018093C4
-:102B7000680190936B0180936A0190936D0180933B
-:102B80006C0181E090E00895289829982A9880E2C5
-:102B90009EE40197F1F7289A8AE0982F9A95F1F729
-:102BA0002A9A299A8A95F1F70895282F299887FD5E
-:102BB00002C02A9801C02A9A8AE0982F9A95F1F7C4
-:102BC000299A8A95F1F7299826FF02C02A9A01C00E
-:102BD0002A988AE0982F9A95F1F7299A8A95F1F721
-:102BE0000895282F220F30E0299827FF02C02A9A43
-:102BF00001C02A988AE0982F9A95F1F7299A8A9528
-:102C0000F1F73F5F373011F0220FEECF0895282FF4
-:102C100030E0299827FF02C02A9A01C02A988AE04A
-:102C2000982F9A95F1F7299A8A95F1F73F5F3830F6
-:102C300011F0220FEECF089529982A988AE0982F54
-:102C40009A95F1F7299A982F9A95F1F7299828984B
-:102C5000982F9A95F1F7299A982F9A95F1F7299834
-:102C60008A95F1F7289A80E090E0089529982898AD
-:102C70002A982B9A08950E94C41580E30E94D515C6
-:102C800080E60E94F11508950E94C41580E00E941C
-:102C9000D51580E00E94F1150E94361608950F9315
-:102CA0001F93182F062F0E94C41580E40E94D5158B
-:102CB000812F0E94F115802F0E94071681E090E07D
-:102CC0001F910F9108951F93182F0E94C41580EC37
-:102CD0000E94D515812F0E94F1150E941C1699277C
-:102CE0001F91089529988AE08A95F1F72A9830E093
-:102CF00090E0990F299A2AE0822F8A95F1F7299876
-:102D00001B999F5F822F8A95F1F73F5F383089F7D3
-:102D10002898299A822F8A95F1F7289A29982A9536
-:102D2000F1F7892F992708951F93182F0E94C41532
-:102D300080E80E94D515812F0E94F1150E9472161D
-:102D400099271F910895DF92EF92FF920F931F939F
-:102D5000CF93DF93D82E7B018A01C0E0D0E009C079
-:102D60008D2D8C0F0E949416F801EC0FFD1F8083AF
-:102D70002196CE15DF05A1F781E090E0DF91CF919C
-:102D80001F910F91FF90EF90DF9008950F931F9385
-:102D9000082F162F0E943B16612F802F0E944F167E
-:102DA00081E090E01F910F910895DF92EF92FF92E2
-:102DB0000F931F93CF93DF93D82E7B018A01C0E03E
-:102DC000D0E009C0F801EC0FFD1F60818D2D8C0F44
-:102DD0000E94C6162196CE15DF05A1F781E090E08E
-:102DE000DF91CF911F910F91FF90EF90DF900895A9
-:102DF00094E0909332030E94D5168093330310928F
-:102E0000340383E090E00E949C0108950F931F9388
-:102E10008B0193E09093320344E353E00E94A316A6
-:102E200080933303C80102960E949C011F910F9169
-:102E3000089582E08093320382E090E090936901EC
-:102E40008093680190936B0180936A0190936D0168
-:102E500080936C0181E0809333031092340383E00C
-:102E600090E00E949C01089581E0809332030E94CB
-:102E70009615809333031092340383E090E00E9410
-:102E80009C010895FC018381823069F0833018F43D
-:102E90008130F1F405C0833049F08430C9F40FC0AB
-:102EA0000E94341708950E9419170895AF014A5FD0
-:102EB0005F4F6581772784810E9406170895AF01CF
-:102EC0004A5F5F4F6581772784810E94F8160895D5
-:102ED00080818093320383E0809333031092340324
-:102EE00083E090E00E949C0108951F920F920FB61C
-:102EF0000F9211240F900FBE0F901F9018959C01F8
-:102F00000897029718F084E090E00895F901EE0F19
-:102F1000FF1FE35AFE4F8DE090E0928381832830BB
-:102F20003105B1F02930310519F087E090E00895BE
-:102F3000259A81E090E0909389008093880081E851
-:102F40008093800089E08093810081E090E0089583
-:102F5000249A81E08093B30089E68093B00081E0F9
-:102F600090E008959C01FC01EE0FFF1FE35AFE4F15
-:102F7000818192810D9719F086E090E008952830C4
-:102F8000310539F12930310519F087E090E00895D5
-:102F900063307105B1F06430710544F4613071053E
-:102FA00061F06230710509F040C009C064307105FC
-:102FB00051F065307105C9F508C081E007C082E0B5
-:102FC00005C083E003C084E001C085E080938100F8
-:102FD00029C064307105E9F06530710554F4623040
-:102FE000710599F06330710594F461307105E9F46D
-:102FF0000AC06630710589F06630710564F067308B
-:10300000710599F40CC089E60BC08AE609C08BE60D
-:1030100007C08CE605C08DE603C08EE601C08FE6D2
-:103020008093B00081E090E0089581E090E0089501
-:103030009C01FC01EE0FFF1FE35AFE4F818192813C
-:103040000D9719F086E090E008952830310569F079
-:103050002930310519F087E090E0089570938900D8
-:103060006093880081E090E008956093B30081E070
-:1030700090E0089523E5209332030E94181880936E
-:1030800033031092340383E090E00E949C01089582
-:1030900022E5209332030E94B217809333031092EB
-:1030A000340383E090E00E949C01089520E5209382
-:1030B00032030E947F17809333031092340383E01E
-:1030C00090E00E949C0108959C01FC01EE0FFF1FFF
-:1030D000E35AFE4F82E090E09283818328303105ED
-:1030E00031F02930310531F086E090E008951092FA
-:1030F000B00004C01092810010928000822F0E94C4
-:103100007C0D81E090E0089521E5209332030E9438
-:103110006418809333031092340383E090E00E949C
-:103120009C010895FC018081813579F0823518F485
-:103130008035F1F405C0823569F08335C9F411C0DA
-:10314000828199270E9456180895828199270E94AA
-:103150008418089563817727828199270E944818EF
-:10316000089563817727828199270E943A180895EC
-:103170008093320383E0809333031092340383E01F
-:1031800090E00E949C010895CF93DF93AC010297D9
-:1031900010F442E050E0A091B704B091B804FD01F2
-:1031A000C0E0D0E020E030E020C080819181841731
-:1031B000950769F482819381209719F09B838A8314
-:1031C00004C09093B8048093B704CF0132C048176D
-:1031D000590738F42115310519F08217930708F4BF
-:1031E0009C01EF010280F381E02D3097F1F621156B
-:1031F000310589F1C901841B950B049708F4A901D5
-:10320000E0E0F0E026C08D919C9111978217930722
-:10321000E9F44817590779F4ED018A819B813097C9
-:1032200019F09383828304C09093B8048093B70409
-:10323000CD01029649C0841B950BFD01E80FF91FD3
-:103240004193519302978D939C933AC0FD01A281C3
-:10325000B3811097C1F68091B5049091B604892B83
-:1032600041F480915001909151019093B604809364
-:10327000B50420915201309153012115310541F4DB
-:103280002DB73EB780914E0190914F01281B390B0D
-:10329000E091B504F091B6042E1B3F0B24173507BF
-:1032A00088F0CA0102962817390760F0CF01840F11
-:1032B000951F02969093B6048093B5044193519361
-:1032C000CF0102C080E090E0DF91CF910895CF93CD
-:1032D000DF93009709F44EC0EC0122971B821A82FB
-:1032E000A091B704B091B804109711F140E050E0FC
-:1032F00001C0DC01AC17BD0700F1BB83AA83FE014E
-:1033000021913191E20FF31FEA17FB0771F42E5F51
-:103310003F4F8D919C911197820F931F99838883C2
-:10332000FD01828193819B838A834115510559F464
-:10333000D093B804C093B7041DC0FD01828193816E
-:10334000AD010097B1F6FA01D383C2832191319187
-:10335000E20FF31FEC17FD0769F42E5F3F4F8881E2
-:103360009981820F931FFA01918380838A819B81C7
-:1033700093838283DF91CF91089597FB092E0726CF
-:103380000AD077FD04D027D006D000201AF470951B
-:1033900061957F4F0895F6F7909581959F4F089519
-:1033A00097FB092E05260ED057FD04D028D00AD051
-:1033B000001C38F450954095309521953F4F4F4F64
-:1033C0005F4F0895F6F790958095709561957F4FC2
-:1033D0008F4F9F4F0895AA1BBB1B51E107C0AA1F27
-:1033E000BB1FA617B70710F0A61BB70B881F991FA6
-:1033F0005A95A9F780959095BC01CD010895A1E259
-:103400001A2EAA1BBB1BFD010DC0AA1FBB1FEE1F5E
-:10341000FF1FA217B307E407F50720F0A21BB30BA9
-:10342000E40BF50B661F771F881F991F1A9469F725
-:1034300060957095809590959B01AC01BD01CF0181
-:023440000895ED
-:10344200456D62656464656450726F6A6563747326
-:10345200004F63746F70757355534220496E7465E3
-:10346200726661636520436F6E7665727465722061
-:10347200616E6420492F4F20457874656E73696FC1
-:103482006E0032303038313130380009040020000B
-:04349200B904000079
+:100000000C9470000C948F000C948F000C948F0053
+:100010000C948F000C9463050C948F000C948F004B
+:100020000C948F000C948F000C948F000C948F0014
+:100030000C94DD190C948F000C948F000C948F009D
+:100040000C948F000C9438050C94431F0C948F0073
+:100050000C948F000C9491000C948F000C948F00E2
+:100060000C948F000C948F000C948F000C948F00D4
+:100070000C948F000C948F000C948F000C948F00C4
+:100080000C948F000C948F000C948F000C948F00B4
+:100090000C948F004C22572262226D2278228322F8
+:1000A0008E229922A422AF22BD22CB22D922E7227E
+:1000B000F222FD220B23162321232C233723422354
+:1000C0004D23582363236E23792384238F239A237C
+:1000D000A523B023BF23CA23D523E023EB23F92391
+:1000E00011241FBECFEFD0E1DEBFCDBF13E0A0E0F3
+:1000F000B1E0E8E6F0E500E00BBF02C007900D922A
+:10010000AE36B107D9F716E0AEE6B3E001C01D92F6
+:10011000A83BB107E1F70E94A9000C9432280C9487
+:1001200000001F920F920FB60F9211240F900FBE76
+:100130000F901F901895AC0120E030E002C02F5FB7
+:100140003F4FFA01E20FF31F80818823C1F7C901F5
+:1001500008956F927F928F929F92AF92BF92CF92AB
+:10016000DF92EF92FF920F93DF93CF9300D00F9225
+:10017000CDB7DEB7F8940E94B30A0E942B108FEF20
+:1001800084B915B881E0809378032F980E94240BDE
+:1001900081E897E10E946F0B85E69CE00E94740B5A
+:1001A00081E090E00E94790BDE011196E3EEF2E02F
+:1001B00083E001900D928150E1F7CE0101960E94FB
+:1001C000620F80E091E00E94001081E191E00E94C6
+:1001D000F80F82E491E00E94F00F0E94380F4C016A
+:1001E00068EC70E00E94870BC40160E070E00E9440
+:1001F000AE0E3C01C401B30140E050E00E94AD0BE3
+:10020000C401B30141E050E021E030E002E0A0E4AD
+:10021000EA2EF12CCC24DD24F6EBAF2EF1E0BF2E3C
+:100220000E94430EC401B30141E050E021E030E000
+:10023000E4E5AE2EE4E0BE2E0E947B0E1092CD03CC
+:100240001092CC031092CF031092CE030E94741B25
+:100250008FE787B98AE288B90E948B0585E588B95E
+:100260000E948B0518B80E94B1100E94B30A0E9428
+:1002700030107894FFCF0F931F93CF93DF938C01AF
+:1002800081349105F0F18091D8039091D903892BA5
+:10029000C1F500D000D000D0EDB7FEB731968BE4A9
+:1002A00091E0ADB7BEB712969C938E93119783E5FC
+:1002B00091E09383828381EC90E0958384830E9414
+:1002C0000D250F900F908AE591E0EDB7FEB7928370
+:1002D0008183148303830E940D251092D50310920D
+:1002E000D4031093D7030093D60381E090E090935A
+:1002F000D9038093D80300E410E00F900F900F9083
+:100300000F908BE268E00E94F50AC0E0D0E00DC0DB
+:10031000E091D403F091D503EC0FFD1FE25EFA4F9C
+:10032000608189E20E94F50A2196C017D10780F307
+:100330008091CC039091CD03019749F48BE267E063
+:100340000E94F50A1092CD031092CC030AC08BE2F2
+:1003500063E00E94F50A81E090E09093CD038093E2
+:10036000CC03DF91CF911F910F910895EF92FF92EF
+:100370000F931F93CF93DF938091D8039091D9036C
+:10038000019709F0B5C000D000D000D0EDB7FEB79E
+:1003900031960BE411E0ADB7BEB712961C930E93E5
+:1003A0001197B3E5EB2EB1E0FB2EF382E2828FEDE5
+:1003B00090E0958384830E940D258DB79EB70696A5
+:1003C0000FB6F8949EBF0FBE8DBF87E891E00E94E4
+:1003D00022252091D4033091D5038091D6039091AA
+:1003E000D7032817390708F083C000D000D000D009
+:1003F000EDB7FEB73196ADB7BEB712961C930E930C
+:100400001197F382E28282EE90E0958384830E94CA
+:100410000D258DB79EB706960FB6F8949EBF0FBEFA
+:100420008DBF84EA91E00E942225C091D603D0912D
+:10043000D7038091D4039091D503C81BD90B809129
+:10044000D4039091D503805C9F4F9093D503809304
+:10045000D403C134D1052CF100D000D000D0EDB7C9
+:10046000FEB73196ADB7BEB712961C930E93119797
+:10047000F382E28288EE90E0958384830E940D25CA
+:100480008DB79EB706960FB6F8949EBF0FBE8DBF70
+:100490008CEC91E00E94222580E490E00E943B01D8
+:1004A00027C000D000D000D0EDB7FEB73196ADB771
+:1004B000BEB712961C930E931197F382E2828DEED3
+:1004C00090E0958384830E940D258DB79EB7069694
+:1004D0000FB6F8949EBF0FBE8DBF87EE91E00E94CD
+:1004E0002225CE010E943B011092D9031092D8031D
+:1004F000DF91CF911F910F91FF90EF900895CF92D0
+:10050000DF92EF92FF921F93CF93DF93EC01109253
+:10051000D5031092D4031092D9031092D80380917E
+:10052000780381112F9A188112951F7000D000D086
+:1005300000D0EDB7FEB731969BE4E92E91E0F92E9D
+:10054000ADB7BEB71296FC92EE92119783E5C82E16
+:1005500081E0D82ED382C2828BE690E0958384839B
+:100560000E940D25EDB7FEB7319683EF91E0ADB750
+:10057000BEB712969C938E93119712831382888133
+:10058000848315820E940D258DB79EB706960FB6FF
+:10059000F8949EBF0FBE8DBF143009F495C015307E
+:1005A00058F4113029F11130A0F0123009F444C090
+:1005B000133009F03DC164C0163009F4CDC01630C7
+:1005C00008F4A6C0173009F4EBC0183009F030C1A8
+:1005D0000BC18881863041F48A81813009F058C18D
+:1005E000CE010E94AC1954C1CE010E94AA1050C184
+:1005F00000D000D000D0EDB7FEB73196ADB7BEB792
+:100600001296FC92EE921197D382C2828FE790E00D
+:10061000958384830E940D258DB79EB706960FB6ED
+:10062000F8949EBF0FBE8DBF83E192E00E94222509
+:10063000CE010E9455132CC100D000D000D0EDB7E0
+:10064000FEB73196ADB7BEB71296FC92EE921197F7
+:10065000D382C28283E890E0958384830E940D2533
+:100660008DB79EB706960FB6F8949EBF0FBE8DBF8E
+:1006700085E292E00E942225CE010E94F51408C175
+:1006800000D000D000D0EDB7FEB73196ADB7BEB701
+:100690001296FC92EE921197D382C28287E890E084
+:1006A000958384830E940D258DB79EB706960FB65D
+:1006B000F8949EBF0FBE8DBF88E392E00E94222572
+:1006C000CE010E942316E4C000D000D000D0EDB7C8
+:1006D000FEB73196ADB7BEB71296FC92EE92119767
+:1006E000D382C2828BE890E0958384830E940D259B
+:1006F0008DB79EB706960FB6F8949EBF0FBE8DBFFE
+:100700008BE492E00E942225CE010E94CE17C0C049
+:1007100000D000D000D0EDB7FEB73196ADB7BEB770
+:100720001296FC92EE921197D382C2828FE890E0EB
+:10073000958384830E940D258DB79EB706960FB6CC
+:10074000F8949EBF0FBE8DBF8EE592E00E942225D9
+:10075000CE010E94FF1A9CC000D000D000D0EDB79F
+:10076000FEB73196ADB7BEB71296FC92EE921197D6
+:10077000D382C28283E990E0958384830E940D2511
+:100780008DB79EB706960FB6F8949EBF0FBE8DBF6D
+:1007900085E292E00E942225CE010E94740778C073
+:1007A00000D000D000D0EDB7FEB73196ADB7BEB7E0
+:1007B0001296FC92EE921197D382C28288E990E061
+:1007C000958384830E940D258DB79EB706960FB63C
+:1007D000F8949EBF0FBE8DBF81E792E00E94222554
+:1007E000CE010E945C2054C000D000D000D0EDB7F4
+:1007F000FEB73196ADB7BEB71296FC92EE92119746
+:10080000D382C2828FE990E0958384830E940D2574
+:100810008DB79EB706960FB6F8949EBF0FBE8DBFDC
+:1008200084E892E00E942225CE010E94D02130C0AF
+:1008300000D000D000D0EDB7FEB731968BE491E048
+:10084000ADB7BEB712969C938E93119783E591E056
+:100850009383828383EA90E0958384830E940D25AD
+:100860008DB79EB706960FB6F8949EBF0FBE8DBF8C
+:100870008AE992E00E942225888180931E0583E008
+:1008800080931F051092200583E090E00E943B01B9
+:100890008091780381112F98DF91CF911F91FF9064
+:1008A000EF90DF90CF900895EF92FF920F931F93F8
+:1008B000CF93DF93EC0100D000D000D0EDB7FEB7AE
+:1008C00031960BE411E0ADB7BEB712961C930E93B0
+:1008D000119723E5E22E21E0F22EF382E28287E3F4
+:1008E00090E0958384830E940D250F900F90EDB7C3
+:1008F000FEB7319686EA92E0ADB7BEB712969C93EA
+:100900008E9311978981828313820E940D25809195
+:10091000CE039091CF030F900F900F900F900197FF
+:1009200009F04BC000D000D000D0EDB7FEB7319633
+:10093000ADB7BEB712961C930E931197F382E28265
+:100940008CE390E0958384830E940D258DB79EB73C
+:1009500006960FB6F8949EBF0FBE8DBF8AEC92E04C
+:100960000E94222520E030E0E091D003F091D103F5
+:10097000E20FF31FDE01A20FB31F8C91E252FC4F76
+:1009800080832F5F3F4F2034310571F78091D00372
+:100990009091D103805C9F4F9093D1038093D003BB
+:1009A0002091D0033091D1038091D2039091D30351
+:1009B0002817390708F455C03FC000D000D000D038
+:1009C000EDB7FEB73196ADB7BEB712961C930E9336
+:1009D0001197F382E2828BE490E0958384830E94F6
+:1009E0000D258DB79EB706960FB6F8949EBF0FBE25
+:1009F0008DBF83ED92E00E9422251092D1031092C8
+:100A0000D00320E030E0E091D003F091D103E20F79
+:100A1000F31FDE01A20FB31F8C91E252FC4F8083C3
+:100A20002F5F3F4F2034310571F73093D10320936E
+:100A3000D0038981803448F41092CF031092CE0302
+:100A40008EED93E00E947F020CC081E090E09093D5
+:100A5000CF038093CE03898190E09093D30380935A
+:100A6000D203DF91CF911F910F91FF90EF900895E6
+:100A70001F920F920FB60F920BB60F9211242F9365
+:100A80003F934F935F936F937F938F939F93AF9316
+:100A9000BF93EF93FF930E947C108091770386BDF4
+:100AA000FF91EF91BF91AF919F918F917F916F9146
+:100AB0005F914F913F912F910F900BBE0F900FBE02
+:100AC0000F901F9018951F920F920FB60F920BB6B2
+:100AD0000F9211242F933F934F935F936F937F93C4
+:100AE0008F939F93AF93BF93EF93FF930E94081050
+:100AF000FF91EF91BF91AF919F918F917F916F91F6
+:100B00005F914F913F912F910F900BBE0F900FBEB1
+:100B10000F901F90189520E040E45CE9CA0101970E
+:100B2000F1F72F5F2931D1F70895882321F0813023
+:100B300061F084E008958EE08093A2038093A30384
+:100B400088E18093C10081E008958EE0809387035F
+:100B50008093880388E18093C90081E00895882309
+:100B600021F0813081F084E008951092A203109268
+:100B7000A3031092C5001092C4001092C1001092FD
+:100B8000C20081E0089510928703109288031092AA
+:100B9000CD001092CC001092C9001092CA0081E0E2
+:100BA0000895882321F0813041F084E00895209356
+:100BB000C5006093C40081E008952093CD00609348
+:100BC000CC0081E00895623011F492E001C090E021
+:100BD000882321F0813061F084E008958091C20083
+:100BE000990F990F990F982B9093C20081E0089567
+:100BF0008091CA00990F990F990F982B9093CA0072
+:100C000081E00895663029F0673039F0653041F4AD
+:100C100002C020E006C020E001C021E090E002C058
+:100C200021E091E0882321F0813069F084E008958B
+:100C30008091C200220F220F990F922B982B909334
+:100C4000C20081E008958091CA00220F220F990FFF
+:100C5000922B982B9093CA0081E00895653419F087
+:100C60006F3419F405C021E001C020E090E002C01B
+:100C700021E091E0882321F0813079F084E008952B
+:100C80008091C2002295220F207E9295907F922B18
+:100C9000982B9093C20081E008958091CA0022951C
+:100CA000220F207E9295907F922B982B9093CA00D2
+:100CB00081E00895982FFA018230B8F084E0089519
+:100CC0002191992319F0913071F407C08091C000EF
+:100CD00085FFFCCF2093C60006C08091C80085FF29
+:100CE000FCCF2093CE00615070406115710541F733
+:100CF00081E00895882321F0813051F084E0089547
+:100D00008091C00085FFFCCF6093C60081E008950C
+:100D10008091C80085FFFCCF6093CE0081E00895EC
+:100D2000E82FDB01823010F084E008959A0116C0AC
+:100D3000EE2321F0E13049F084E00DC08091C00045
+:100D400087FFFCCF8091C60006C08091C80087FF56
+:100D5000FCCF8091CE008D932150304012161306A7
+:100D60003CF381E00895882321F0813049F084E04C
+:100D700008958091C00087FFFCCF8091C600089540
+:100D80008091C80087FFFCCF8091CE00089570E06D
+:100D90000E945A0680931F051092200583E090E080
+:100DA0000E943B0108950E94020680931F05109245
+:100DB000200583E090E00E943B0108950E94020616
+:100DC00080931F051092200583E090E00E943B0174
+:100DD00008950E94E30580931F051092200583E08B
+:100DE00090E00E943B0108950F930E94D1058093EB
+:100DF0001F051092200583E090E00E943B010F91B7
+:100E000008950E94AF0580931F051092200583E08E
+:100E100090E00E943B010895882321F0813059F031
+:100E200084E012C08EE08093A2038093A30388E144
+:100E30008093C10008C08EE080938703809388036D
+:100E400088E18093C90081E080931F0510922005FE
+:100E500083E090E00E943B010895CF92DF92EF92F1
+:100E6000FF920F931F93DF93CF93CDB7DEB78B0124
+:100E7000CDB6DEB62DB73EB7261B370B0FB6F894AE
+:100E80003EBF0FBE2DBFEDB6FEB60894E11CF11CAF
+:100E9000B701A8010E94900680931F0520E030E072
+:100EA0000AC0F701E20FF31F8081F901E05EFA4FFB
+:100EB00080832F5F3F4F201731079CF3F801E05EDE
+:100EC000FA4F1082C80103960E943B010FB6F894B6
+:100ED000DEBE0FBECDBECF91DF911F910F91FF906F
+:100EE000EF90DF90CF9008950F93FC018081809365
+:100EF0001E058081843611F1853648F48236B1F0C2
+:100F00008336E0F4803651F0813679F50BC08736B0
+:100F100031F18836E9F0853641F515C082810E94AD
+:100F20000C072CC082810E94010728C08281638146
+:100F30004481258106810E94F40620C0828163815C
+:100F40000E94E9061BC0828163810E94D30616C0FD
+:100F5000828163813496AF010E94C7060FC063810E
+:100F6000828170E00E942D0709C083E080931F05F5
+:100F70001092200583E090E00E943B010F910895BC
+:100F800087E28093860685E28093850690E29093BF
+:100F900087061092880628E030E030938A06209376
+:100FA000890683E28093920681E280939106909372
+:100FB0009306109294063093960620939506089512
+:100FC0000895089581E260919E060E94F50A0895B1
+:100FD0008BE268E00E94F50A88E261E10E94F50A6E
+:100FE0008FE268E00E94F50A8CE261E10E94F50A56
+:100FF0008FE261E00E94F50A83E265E00E94F50A53
+:1010000008950F931F938C0180E260E40E94F50A1B
+:10101000F8016281605884E00E94F50AF80182813B
+:1010200080939D061F910F9108950F931F93CF9367
+:10103000DF93EC0128853985121613060CF03FC0AA
+:101040008E819F81821793073CF583E268E00E94BE
+:10105000F50A00E010E012C0EA85FB85E20FF31FFD
+:1010600081E260810E94F50A8E819F8101969F83B3
+:101070008E830F5F1F4F0830110539F02E813F819D
+:1010800088859985281739073CF3288539858E810D
+:101090009F818217930724F087E261E00E94F50A9E
+:1010A0008B81813031F4898165E00E94F50A1B82D1
+:1010B00006C0898161E00E94F50A81E08B83DF919F
+:1010C000CF911F910F910895DF93CF9300D000D05F
+:1010D000CDB7DEB7FC0132812381109298061092C1
+:1010E000970681E080939406223031F12330B9F1E4
+:1010F000213009F05FC080917106809399061092AB
+:101100009A0681E796E090939C0680939B068681E1
+:101110009781089721F480E490E097838683868105
+:1011200097818034910509F045C088E090E0909364
+:101130009A06809399063EC08681978190939A067D
+:1011400080939906832F90E0880F991FE091830682
+:10115000F0918406E80FF91F8081918127C0332325
+:10116000B9F0832F90E0880F991FE091DC03F09194
+:10117000DD03E80FF91F0190F081E02DF0939C064C
+:10118000E0939B0680818093990610929A0612C084
+:1011900094E099832A8389E08B839C8384E090E0A8
+:1011A00090939A0680939906CE01019690939C069F
+:1011B00080939B0681E996E00E9415080F900F909E
+:1011C0000F900F90CF91DF910895CF93DF9382E23C
+:1011D0000E94C10AC82F85FF1AC083E268E00E94FE
+:1011E000F50AC6FF10C020919706309198068091AD
+:1011F000990690919A06281739072CF481E996E010
+:101200000E94150804C087E261E00E94F50ADF91A0
+:10121000CF9108950F931F9388E00E94C10A082F71
+:10122000182F86FF18C085E060E00E94F50A84E070
+:1012300060E80E94F50A80E260E00E94F50A83E21D
+:1012400068E00E94F50A87E261E00E94F50A85E005
+:1012500062E00E94F50A14FF04C089E060EC0E947D
+:10126000F50A07FF04C089E060ED0E94F50A1F91AE
+:101270000F9108958AE00E94C10A80FF03C00E9476
+:10128000E508089581FF0DC08AE20E94C10A80919D
+:101290005E06813061F4E0916106F0916206099585
+:1012A000089582E30E94C10A8AE30E94C10A089558
+:1012B0008EE00E94C10A0895EF92FF920F931F9350
+:1012C000DF93CF93CDB7DEB728970FB6F894DEBF84
+:1012D0000FBECDBF86E20E94C10A86FF7FC08E018D
+:1012E0000F5F1F4F49E0E42EF12CEC0EFD1E8091A4
+:1012F00085060E94C10AF80181938F01EE15FF0552
+:10130000B1F78E010F5F1F4F87E268E00E94F50A78
+:1013100083E268E00E94F50A80E20E94C10A682F19
+:101320006F7780E20E94F50A898190E08076907064
+:101330008032910509F440C080349105D1F1892BA8
+:10134000F1F5F80181818630D9F0873048F4813099
+:10135000F1F18130C8F0833079F1853081F521C019
+:10136000893019F18A3018F4883049F505C08A307F
+:1013700071F18B3021F520C081E260919E0625C07D
+:10138000C8010E94640823C083E268E00E94F50A55
+:1013900081E261E00E94F50A81E260E00E94F50AC4
+:1013A0000BC0C8010E94010812C0C8010E94E807D2
+:1013B0000EC0C8010E94B10A83E265E006C080E267
+:1013C0000E94C10A682F605880E20E94F50AF80165
+:1013D00080818823D1F483E265E015C020919906CD
+:1013E00030919A0680919506909196068217930700
+:1013F00064F410929A061092990683E268E00E94C3
+:10140000F50A87E261E00E94F50A28960FB6F89483
+:10141000DEBF0FBECDBFCF91DF911F910F91FF9027
+:10142000EF900895EF92FF920F931F93DF93CF9366
+:10143000CDB7DEB7C054D0400FB6F894DEBF0FBEB4
+:10144000CDBF8CE00E94C10A80FF03C00E945C09EE
+:101450007AC081FF29C08EE20E94C10A8DE20E94FB
+:10146000C10A89838E010F5F1F4F70E4E72EF12CB4
+:10147000EC0EFD1E0F5F1F4F0E94E40AF8018083EF
+:101480000E151F05B9F780916E03813039F4E09194
+:101490007103F0917203CE01019609958FE268E025
+:1014A0000E94F50A8FE22AC082FF2CC086E30E94C8
+:1014B000C10A85E30E94C10A89838E010F5F1F4F15
+:1014C00060E4E62EF12CEC0EFD1E0F5F1F4F0E9414
+:1014D000E40AF80180830E151F05B9F780916F03A8
+:1014E000813039F4E0917303F0917403CE010196D9
+:1014F000099587E368E00E94F50A87E361E00E94AE
+:10150000F50A21C083FF1FC08EE30E94C10A8E012D
+:101510000F5F1F4F51E4E52EF12CEC0EFD1E8DE305
+:101520000E94C10AF80181938F01EE15FF05B9F7FA
+:1015300080917003813039F4E0917103F09172036E
+:10154000CE0101960995C05CDF4F0FB6F894DEBF5F
+:101550000FBECDBFCF91DF911F910F91FF90EF9004
+:1015600008950895089581E080936A0080E18DBB1D
+:1015700083B3876083BB84B3836084BB3F9A479AFD
+:1015800008959FEF91B982B988B1805888B984B322
+:1015900095E0892784BB88B1805888B984B38927AE
+:1015A00084BB000011B888B1805888B984B322E0A8
+:1015B000822784BB0000000080B198B1905898B990
+:1015C00094B3922794BB089588B1805888B984B3A6
+:1015D00022E0822784BB0000000080B198B19058BF
+:1015E00098B994B3922794BB089582B98FEF81B9CB
+:1015F00088B1805888B984B395E0892784BB88B1C5
+:10160000805888B984B3892784BB62B988B180586F
+:1016100088B984B391E0892784BB88B1805888B9A0
+:1016200084B3892784BB089582B988B1805888B96A
+:1016300084B391E0892784BB88B1805888B984B38A
+:10164000892784BB0895089582E18093710681E023
+:101650008093720680E191E0909374068093730604
+:1016600010927506109276061092770688E08093A5
+:10167000780610927A061092790610927C061092E3
+:101680007B0610927E0610927D0610927F061092C5
+:101690008006109281061092820610926E031092BC
+:1016A0006F031092700310925E0610925F06109204
+:1016B000600610926806109267061092DB03109283
+:1016C000DA03089590937A068093790670937C06E6
+:1016D00060937B0650937E0640937D060895909319
+:1016E0007A0680937906089590937C0680937B0612
+:1016F000089590937E0680937D06089580937506E5
+:1017000008958093760608958093770608950F9341
+:101710001F93CF93DF938C01CB01C0916706D091CB
+:10172000680662E070E00E94D42710C09881298189
+:101730008A81823041F4E92FF22F858190E0801771
+:10174000910709F460870F80D885C02D209771F725
+:10175000DF91CF911F910F9108959C01E091670651
+:10176000F091680614C0A081B1818281843061F457
+:10177000848190E08217930739F4868190E0861780
+:10178000970711F413964C930780F085E02D30975E
+:1017900051F708950895BF92CF92DF92EF92FF9292
+:1017A0000F931F93CF93DF93EC01F62ED42EC22E0E
+:1017B000B02EE0916706F0916806309799F489E0C1
+:1017C00090E00E940B24FC019093680680936706CA
+:1017D000D183C083F38210861782D282C4820583AC
+:1017E000E6821AC0CF010780F085E02D3097D1F74F
+:1017F0008C0189E090E00E940B24FC01D80118962E
+:101800009C938E931797D183C083F382D282C48234
+:10181000B582E68210861782DF91CF911F910F91DA
+:10182000FF90EF90DF90CF90BF900895EF92FF92DE
+:101830001F93CF93DF937C01C091DA03D091DB0338
+:10184000209711F011E012C085E090E00E940B2477
+:10185000FC019093DB038093DA03F182E082128231
+:101860001482138210E012C01F5FEC018B819C81F7
+:101870000097D1F785E090E00E940B24FC019C8347
+:101880008B83F182E082128314821382812FDF9195
+:10189000CF911F91FF90EF900895EF92FF920F93D9
+:1018A0001F93CF93DF93E091DA03F091DB0380E0A5
+:1018B00090E00380F481E02D01963097D1F7880FF6
+:1018C000991F0E940B248093DC039093DD03C09149
+:1018D000DA03D091DB0301C0EC01E880F9808A8152
+:1018E00090E0880F991F0091DC031091DD03080F31
+:1018F000191FF701808190E00E940B24F80180837A
+:10190000918320E030E016C08A8190E0880F991F13
+:10191000E091DC03F091DD03E80FF91F0190F08105
+:10192000E02DE20FF31FD701A20FB31F8C9180832C
+:101930002F5F3F4FF701808190E02817390724F38C
+:101940008B819C81009741F6DF91CF911F910F9180
+:10195000FF90EF9008956F927F928F929F92AF9237
+:10196000BF92CF92DF92EF92FF920F931F93CF938C
+:10197000DF93E0916706F0916806CC24DD2409C06E
+:101980008281823019F40894C11CD11C0780F08533
+:10199000E02D3097A9F7C601880F991F0E940B24EC
+:1019A00080938306909384060894C108D108560159
+:1019B000AA0CBB1C0894C11CD11CC1E0D0E0882437
+:1019C00099244FC0E0916706F0916806A9E0EA2EDD
+:1019D000F12C16C0A081B181848190E08C179D0705
+:1019E00019F48381E80EF11C15968C9115978C17CC
+:1019F00021F48281823009F44D010780F085E02DC9
+:101A0000309741F700918306109184060A0D1B1D43
+:101A1000C7010E940B24D8018C9311969C9320E05F
+:101A200030E0E0918306F0918406EA0DFB1D019001
+:101A3000F081E02DE20FF31FD401A20FB31F8C91B0
+:101A400080832F5F3F4F2930310559F7E09183069E
+:101A5000F0918406EA0DFB1D0190F081E02DE282F9
+:101A60002196CC16DD060CF0ADCFE1E0EE2EF12C88
+:101A700079E0A72EB12C6624772488249924A5C068
+:101A8000A0916706B091680613C0ED91FC91119783
+:101A90008181823049F4858190E08E159F0521F483
+:101AA0008481682E772406C017960D90BC91A02DD6
+:101AB000109759F701E010E07DC040916706509102
+:101AC000680672C0DA01ED91FC9111978181843032
+:101AD00009F065C016968C91169790E080179107D3
+:101AE00009F05DC014968C9190E08E159F0509F069
+:101AF00056C0DF019501BF01675F7F4FE09183060C
+:101B0000F0918406E80DF91D0190F081E02DE20FBF
+:101B1000F31F8D9180832F5F3F4FA617B70771F793
+:101B2000E9E0F0E0AE0EBF1EA0916706B091680636
+:101B300034C012968C911297853059F514968C9179
+:101B4000149790E08E159F0521F515968C911597A9
+:101B500090E080179107E9F4CD91DC911197950100
+:101B6000BE01695F7F4FE0918306F0918406E80D26
+:101B7000F91D0190F081E02DE20FF31F8991808320
+:101B80002F5F3F4FC617D70771F787E090E0A80E89
+:101B9000B91E17960D90BC91A02D109751F6DA0141
+:101BA00017964D915C9118974115510509F08ACF10
+:101BB0000F5F1F4F601671060CF07FCF0894E11C79
+:101BC000F11CE2E0F0E08E0E9F1ECE14DF040CF05C
+:101BD00057CFDF91CF911F910F91FF90EF90DF9042
+:101BE000CF90BF90AF909F908F907F906F9008950F
+:101BF000AF92BF92CF92EF92FF920F931F93CF932A
+:101C0000DF93EC015B01122FE0916706F09168060B
+:101C100018C0A081B181848190E0C817D90771F400
+:101C2000868190E08A159B0549F48281843031F4E5
+:101C300014968C9114978F5F14968C930780F0857F
+:101C4000E02D309731F787E090E00E940B24FC01F3
+:101C500087E0808385E0818312830383F582E482B9
+:101C6000C682CF0167E045E02C2F0A2DEE240E94AA
+:101C7000CB0BDF91CF911F910F91FF90EF90CF9001
+:101C8000BF90AF900895AF92BF92CF92DF92EF9244
+:101C9000FF920F93FC01A114B10401F142305105F0
+:101CA00071F04330510599F041305105B9F481E0AC
+:101CB00080935E06B0926206A09261060FC081E03A
+:101CC00080935F06B0926406A092630607C081E02D
+:101CD00080936006B0926606A092650620583F4F3A
+:101CE000CF010E94F80D0F91FF90EF90DF90CF9001
+:101CF000BF90AF900895AF92BF92CF92DF92EF92D4
+:101D0000FF920F93FC014230510571F043305105B1
+:101D100099F041305105B9F481E080936E03B0929F
+:101D20007203A09271030FC081E080936F03B092A1
+:101D30007403A092730307C081E080937003B09294
+:101D40007603A0927503CF010E94F80D0F91FF90CA
+:101D5000EF90DF90CF90BF90AF900895EF920F93E8
+:101D6000CF93DF93082FE62EA0916706B091680607
+:101D7000C0E0D0E014C0ED91FC91119785818017EF
+:101D800051F412968C911297823029F484818F5FDE
+:101D90008483C82FD0E017960D90BC91A02D10978A
+:101DA00051F789E090E00E940B24FC0189E08083D8
+:101DB00084E08183E2821382148215821682178264
+:101DC0001086CF0169E044E0202F00E0EC2E0E9455
+:101DD000CB0BCE01DF91CF910F91EF900895DF9261
+:101DE000EF92FF920F931F93CF93DF93E82E162F5E
+:101DF000F42ED22EA0916706B0916806C0E0D0E024
+:101E000014C0ED91FC91119785818E1551F41296B5
+:101E10008C911297823029F484818F5F8483C82F3C
+:101E2000D0E017960D90BC91A02D109751F789E046
+:101E300090E00E940B24FC0189E0808384E0818390
+:101E4000128313821482F582D68207831086CF0113
+:101E500069E044E02E2D00E0EC2E0E94CB0BCE0179
+:101E6000DF91CF911F910F91FF90EF90DF90089538
+:101E7000EF920F931F93109182061F5F10938206BB
+:101E800089E090E00E940B24FC0189E0808389E0D6
+:101E900090E09383828382E081831482158316828B
+:101EA00080E887838AE18087CF0169E042E020E013
+:101EB00000E0EE240E94CB0B812F90E01F910F9148
+:101EC000EF9008950F931F93CF93DF938C01FC0144
+:101ED00001900020E9F7E81BF90BCF01880F991F4B
+:101EE0000E940B24EC01F80101900020E9F7E01BAF
+:101EF000F10BEE0FFF1FE88323E02983AC0120E004
+:101F000030E009C0F801E20FF31F8081FA018083FD
+:101F100011822F5F3F4FF80101900020E9F73197C0
+:101F2000E01BF10B4E5F5F4F2E173F0758F3CE01BA
+:101F30000E94160C90E0DF91CF911F910F910895B0
+:101F40000F931F93CF93DF938C01EB01CA010E9483
+:101F5000620F282FE0916706F091680614C0A081F7
+:101F6000B1818281843061F4848190E0801791078F
+:101F700039F4868190E08C179D0711F418962C9304
+:101F80000780F085E02D309751F7DF91CF911F91B9
+:101F90000F910895CF93DF93EC01CB010E94620F64
+:101FA000382FA0916706B091680615C09C911196D4
+:101FB0002C91119712968C911297823041F4E92F4F
+:101FC000F22F858190E08C179D0709F436831796D0
+:101FD0000D90BC91A02D109749F7DF91CF910895F6
+:101FE0000E94620F1816190614F480938106089552
+:101FF0000E94620F1816190614F480938006089543
+:102000000E94620F1816190614F480937F06089533
+:102010001F93CF93DF9386E00E94C10AC82F86FFEB
+:1020200002C00E94120AC2FF02C00E943A09C1FF08
+:1020300002C00E940A0987E00E94C10A182F87E0A7
+:1020400060E00E94F50A87E0612F0E94F50ADF91A7
+:10205000CF911F91089581E062E00E94F50A0895F2
+:102060000E94AB0C0E944D0C0E94C00780E061E012
+:102070000E94F50A80E00E94C10A80FDFBCF81E04A
+:1020800062E00E94F50A84E060E80E94F50A80E2BE
+:1020900060E40E94F50A83E268E00E94F50A87E2A4
+:1020A00069E00E94F50A8DE06FE00E94F50A8BE07E
+:1020B0006FE00E94F50A89E068ED0E94F50A8FE062
+:1020C00063E30E94F50A87E066ED0E94F50A85E069
+:1020D00062E00E94F50A80E06CEC0E94F50A089527
+:1020E0008EEC8093770381E080936E00809177037C
+:1020F00086BD83E084BD08950895089583E08093AC
+:102100001E0581E080931F058BE0809320052FE65C
+:102110002093210593E69093220584E7809323057D
+:10212000209324059093250581E6809326058EE66D
+:10213000809327058FE58093280580E38093290508
+:1021400081E380932A0510922B058EE090E00E9497
+:102150003B010895FC018081833011F40E947E10C0
+:1021600008951F9311E0812F0E944413812F60E096
+:102170000E9447121F5F1431B1F718E1812F0E94AE
+:102180004413812F60E00E9447121F5F1B32B1F79A
+:102190001F910895FC0110827583648373836283A9
+:1021A0004183478346830895FC019081818198177C
+:1021B00010F080E00895A481B5816D9387818150EE
+:1021C00019F48181A81BB1098783B583A4839FB7C4
+:1021D000F89480818F5F80839FBF81E00895FC0128
+:1021E00080818823E9F3A281B3812D91868181507A
+:1021F00019F48181A81BB109B383A28386839FB799
+:10220000F8948081815080839FBF822F0895FC01C4
+:102210008081882319F42FEF3FEF13C0A281B3818F
+:102220002D918681815019F48181A81BB109B38356
+:10223000A28386839FB7F8948081815080839FBF5B
+:1022400030E0C901089581E0089581E0089581E0BA
+:10225000089581E00895FB011082833089F0843075
+:1022600028F4813049F0823029F408C0843051F0DC
+:10227000853051F085E0089583B107C086B105C06F
+:1022800089B103C08CB101C08FB1808381E0089512
+:10229000833089F0843028F4813049F0823029F489
+:1022A00008C0843051F0853059F084E0089565B954
+:1022B00005C068B903C06BB901C06EB981E008956B
+:1022C00061BB81E00895882321F081E08093780349
+:1022D0000895109278030895982F882321F081E0C3
+:1022E0008093780302C0109278038BE180931E05DF
+:1022F00090931F051092200583E090E00E943B011F
+:10230000089598E190931E050E94481180931F053F
+:102310001092200583E090E00E943B010895982FE1
+:1023200089E180931E05933091F0943028F4913028
+:1023300051F0923029F409C0943059F0953059F099
+:1023400085E090E00AC093B107C096B105C099B18D
+:1023500003C09CB101C09FB181E080931F059093A1
+:1023600020051092210584E090E00E943B01089531
+:1023700084E180931E0581E080931F051092200563
+:1023800083E090E00E943B01089582E180931E0566
+:1023900081E080931F051092200583E090E00E9469
+:1023A0003B01089583E180931E0581E080931F0522
+:1023B0001092200583E090E00E943B01089580E1A7
+:1023C00080931E0581E080931F051092200583E015
+:1023D00090E00E943B010895EF92FF921F93DF93DC
+:1023E000CF93CDB7DEB727970FB6F894DEBF0FBEF9
+:1023F000CDBF182F7B01BE016F5F7F4F0E94392236
+:10240000882311F484E01BC0E12FF0E0E958FC4F71
+:102410003281313011F086E012C0EB81FC81808185
+:102420002F8190E002C0959587952A95E2F780FF6D
+:1024300003C0F701308302C0F701108281E02796C4
+:102440000FB6F894DEBF0FBECDBFCF91DF911F91C5
+:10245000FF90EF900895DF93CF930F92CDB7DEB743
+:102460009BE190931E05BE016F5F7F4F0E94EC11B0
+:1024700080931F058981809320051092210584E0B7
+:1024800090E00E943B010F90CF91DF9108950F9350
+:102490001F93DF93CF93CDB7DEB727970FB6F8948E
+:1024A000DEBF0FBECDBF182F062FBE016F5F7F4F5F
+:1024B0000E943922882311F484E025C0E12FF0E046
+:1024C000E958FC4F8281823011F086E01CC0E9811E
+:1024D000FA81002359F080819F8121E030E002C021
+:1024E000220F331F9A95E2F7822B0BC030812F8188
+:1024F00081E090E002C0880F991F2A95E2F780954D
+:102500008323808381E027960FB6F894DEBF0FBE49
+:10251000CDBFCF91DF911F910F9108959AE19093D4
+:102520001E050E94471280931F051092200583E02C
+:1025300090E00E943B0108951F93DF93CF93CDB7A6
+:10254000DEB727970FB6F894DEBF0FBECDBF182FAA
+:10255000BE016F5F7F4F0E943922882311F484E00F
+:1025600015C0E12FF0E0E958FC4F81E08283ED8156
+:10257000FE8130812F8181E090E002C0880F991F99
+:102580002A95E2F780958323808381E027960FB612
+:10259000F894DEBF0FBECDBFCF91DF911F9108959C
+:1025A00095E190931E050E949C1280931F05109246
+:1025B000200583E090E00E943B0108951F93DF9384
+:1025C000CF93CDB7DEB727970FB6F894DEBF0FBE17
+:1025D000CDBF182FBE016F5F7F4F0E943922882325
+:1025E00011F484E014C0E12FF0E0E958FC4F82E0E0
+:1025F0008283ED81FE8120813F8181E090E002C0F5
+:10260000880F991F3A95E2F7282B208381E02796BF
+:102610000FB6F894DEBF0FBECDBFCF91DF911F91F3
+:10262000089596E190931E050E94DE1280931F0587
+:102630001092200583E090E00E943B0108951F93D3
+:10264000182F0E94DE12813071F4812F61E00E9408
+:102650004712813041F4E12FF0E0E958FC4F83E06C
+:10266000828381E001C084E01F91089597E19093F7
+:102670001E050E941F1380931F051092200583E002
+:1026800090E00E943B0108950E94DE12089591E1BE
+:1026900090931E050E94DE1280931F051092200564
+:1026A00083E090E00E943B010895FC018081863127
+:1026B000E9F1873178F4823131F1833130F48031BE
+:1026C000D1F0813109F050C01AC0843131F1853127
+:1026D00048F51EC08931B9F18A3130F4873151F1A2
+:1026E000883109F041C02AC08B31B1F18B3178F1CA
+:1026F0008C31D1F535C082810E94DF11089582812D
+:102700000E9447130895828163810E94C511089534
+:10271000828163810E94D2110895828163810E9427
+:10272000B811089582810E94D012089582810E947A
+:102730001113089582810E94361308958281638166
+:102740000E948111089582810E948F1108958281D3
+:1027500063810E948E12089582810E942B12089537
+:1027600082810E946C11089580931E0583E08093FE
+:102770001F051092200583E090E00E943B01089520
+:10278000E82F8A50883018F024E030E00CC0F0E0E8
+:10279000E958FC4F84E0828380917C00806C8093B8
+:1027A0007C0021E030E0C9010895E82FF0E0E9580D
+:1027B000FC4F8281843019F024E030E003C01282A3
+:1027C00021E030E0C901089510927C00823039F098
+:1027D000833049F0813061F022E030E00BC080911D
+:1027E0007C00806403C080917C00806C80937C00BE
+:1027F00021E030E0C901089593E890937A00909128
+:102800007C00907F982B90937C0080917A0080646C
+:1028100080937A0080917A0086FDFCCF80917800C9
+:102820009091790040E050E020E030E080917A0023
+:10283000806480937A0080917A0086FDFCCF80913D
+:10284000780090917900280F391F4F5F5F4F443017
+:10285000510561F780917A008F7780937A003695E1
+:10286000279536952795C9010895982F83E280937F
+:102870001E0510927C00923039F0933049F091306F
+:1028800061F082E090E00BC080917C00806403C026
+:1028900080917C00806C80937C0081E090E080934C
+:1028A0001F051092200583E090E00E943B010895EF
+:1028B00091E290931E05E82FF0E0E958FC4F8281E9
+:1028C000843019F084E090E003C0128281E090E04F
+:1028D00080931F051092200583E090E00E943B0149
+:1028E0000895E82F80E280931E058E2F8A5088304D
+:1028F00018F084E090E00CC0F0E0E958FC4F84E070
+:10290000828380917C00806C80937C0081E090E0E9
+:1029100080931F051092200583E090E00E943B0108
+:102920000895CF93DF93982FEB0119821882E82F37
+:10293000F0E0E958FC4F8281843019F026E030E065
+:1029400032C081E1891B0E94FC139983888300D0E7
+:1029500000D000D0EDB7FEB7319686EE92E0ADB76D
+:10296000BEB712969C938E9311978EEE92E093834E
+:1029700082838BE890E0958384830E940D250F90DD
+:102980000F9084EF92E0EDB7FEB792838183888148
+:102990009981948383830E940D2521E030E00F907C
+:1029A0000F900F900F90C901DF91CF910895DF93A1
+:1029B000CF9300D0CDB7DEB792E290931E05BE0153
+:1029C0006F5F7F4F0E94911480931F0599818A81C8
+:1029D000809320059093210584E090E00E943B01C4
+:1029E0000F900F90CF91DF910895FC01808181328B
+:1029F00071F0823218F48032B1F405C0823259F09D
+:102A0000833289F40CC082810E94711408958281FE
+:102A10000E945814089582810E94D71408958281DB
+:102A20000E943514089580931E0583E080931F054E
+:102A30001092200583E090E00E943B010895ECEBAA
+:102A4000F0E08081846080838BE0809385038CE05C
+:102A50008093860381E090E00895ECEBF0E08081C4
+:102A60008B7F8083109285031092860381E090E033
+:102A700008958093B800E9EBF0E080818C7F80833B
+:102A80008081808381E090E008958091B900887F03
+:102A900008958091B90084EA8093BC008091BC00C5
+:102AA00087FFFCCF81E090E0089584E98093BC002B
+:102AB0008091BC0084FDFCCF81E090E00895AC01E2
+:102AC00020E030E094E80EC0FA01E20FF31F8081AD
+:102AD0008093BB009093BC008091BC0087FFFCCF2B
+:102AE0002F5F3F4F261737077CF3089584E88093C4
+:102AF000BC008091BC0087FFFCCF8091BB00089593
+:102B000085E380931E0581E080931F0520E030E07F
+:102B100094E80EC09093BC008091BC0087FFFCCF6E
+:102B20008091BB00F901E05EFA4F80832F5F3F4F39
+:102B3000261737077CF3FB01E05EFA4F1082CB01CA
+:102B400003960E943B010895AC0120E030E094E838
+:102B50000EC0FB01E20FF31F80818093BB009093B6
+:102B6000BC008091BC0087FFFCCF2F5F3F4F241734
+:102B700035077CF381E080931F051092200583E0E8
+:102B800090E00E943B01089584E98093BC0080910D
+:102B9000BC0084FDFCCF81E080931F0510922005CE
+:102BA00083E090E00E943B0108958091B90084EA9F
+:102BB0008093BC008091BC0087FFFCCF81E08093B4
+:102BC0001F051092200583E090E00E943B010895CC
+:102BD0008093B800E9EBF0E080818C7F8083808176
+:102BE000808381E080931F051092200583E090E0B0
+:102BF0000E943B010895ECEBF0E080818B7F8083A5
+:102C0000109285031092860381E080931F05109235
+:102C1000200583E090E00E943B010895ECEBF0E09A
+:102C20008081846080838BE0809385038CE0809337
+:102C3000860381E080931F051092200583E090E0D9
+:102C40000E943B010895FC01808180931E058081D4
+:102C50008433D1F0853338F4813379F0823381F0D5
+:102C6000803331F507C08633E9F08633A0F087332F
+:102C7000F9F41BC00E940E1608950E94FB150895DA
+:102C800082810E94E8150895828190E03396BF0109
+:102C90000E94A41508956381828190E070E00E94F3
+:102CA000801508950E94D51508950E94C4150895B1
+:102CB00083E080931F051092200583E090E00E943E
+:102CC0003B010895782F613041F0613040F062306F
+:102CD00041F0633009F059C007C060E006C060E011
+:102CE00001C061E050E002C061E051E04330B9F062
+:102CF000443028F4413059F0423078F40AC045306D
+:102D000099F0453070F0463009F03FC010C021E026
+:102D10000CC021E041E030E00DC021E009C020E01E
+:102D2000F9CF20E041E005C020E040E0F4CF20E012
+:102D300040E031E0239884B1866084B985B1817F19
+:102D400085B980E090E0772311F081E090E075E0B4
+:102D5000880F991F7A95E1F78065660F660F660FF9
+:102D6000682B550F550F562B542B220F252B2CBD9E
+:102D70003DBD88E080937E038AE080937F0389E0F5
+:102D80008093800321E030E002C022E030E0C901FE
+:102D900008951CBC1DBC10927E0310927F031092FC
+:102DA000800381E090E00895AC0120E008C0E60FC8
+:102DB000F71F80818EBD0DB407FEFDCF2F5FE22F80
+:102DC000F0E0E417F5079CF381E090E00895DC0162
+:102DD00020E030E040E050E014C01EBC08C083E0BA
+:102DE000493E580714F088E008954F5F5F4F0DB4D7
+:102DF00007FEF5CF8EB5FB01E20FF31F80832F5F37
+:102E00003F4F2A173B074CF381E00895CF93DF93A0
+:102E1000EC0120E030E0A0E0B0E018C0FE01E20FDD
+:102E2000F31F80818EBD08C0119683E0A93EB807CC
+:102E30001CF028E030E00FC00DB407FEF5CF8EB5D2
+:102E4000FB01E20FF31F80832F5F3F4F24173507ED
+:102E50002CF321E030E0C901DF91CF910895DC012E
+:102E600083E480931E0540E050E020E030E019C08C
+:102E7000FD01E20FF31F80818EBD09C04F5F5F4FE0
+:102E800083E0493E58071CF028E030E00FC00DB445
+:102E900007FEF4CF8EB5F901E25EFA4F82832F5F11
+:102EA0003F4F2617370724F321E030E020931F051A
+:102EB000FB01E05EFA4F1082CB0103960E943B01BA
+:102EC0000895BC0184E480931E0540E050E020E0BA
+:102ED00030E014C01EBC08C083E0493E580714F01F
+:102EE00088E010C04F5F5F4F0DB407FEF5CF8EB581
+:102EF000F901E25EFA4F82832F5F3F4F26173707B3
+:102F00004CF381E080931F05FB01E05EFA4F1082D5
+:102F1000CB0103960E943B01089593E490931E0514
+:102F2000282F30E090E008C0E60FF71F80818EBDAB
+:102F30000DB407FEFDCF9F5FE92FF0E0E217F30726
+:102F40009CF381E080931F051092200583E090E0C0
+:102F50000E943B01089581E480931E051CBC1DBCAA
+:102F600010927E0310927F031092800381E0809381
+:102F70001F051092200583E090E00E943B01089518
+:102F800090E490931E050E94621680931F05109294
+:102F9000200583E090E00E943B010895CF93DF93EA
+:102FA000EC0188818334A9F0843428F4803441F022
+:102FB000813401F50BC0843491F08534D9F413C009
+:102FC0008A816B814C810E94C0171FC00E94AB1781
+:102FD0001CC08A812396BE010E948D1716C08A816B
+:102FE00090E00E9461176A81CE01039670E00E9412
+:102FF0002F170BC080931E0583E080931F0510924E
+:10300000200583E090E00E943B01DF91CF9108957D
+:10301000209A219A229A2398249A259A2C982D98BE
+:1030200081E08093890382E080938A0380938B03FD
+:1030300080938C0381E090E00895109289031092B0
+:103040008A0310928B0310928C0381E090E0089524
+:10305000289829982A9880E29EE40197F1F7289A07
+:103060008AE0982F9A95F1F72A9A299A8A95F1F78A
+:103070000895282F299887FD02C02A9801C02A9A0E
+:103080008AE0982F9A95F1F7299A8A95F1F729986D
+:1030900026FF02C02A9A01C02A988AE0982F9A95A2
+:1030A000F1F7299A8A95F1F70895880F20E03AE020
+:1030B000299887FF02C02A9A01C02A98932F9A95CF
+:1030C000F1F7299A932F9A95F1F72F5F273011F096
+:1030D000880FEECF089520E03AE0299887FF02C0DC
+:1030E0002A9A01C02A98932F9A95F1F7299A932F3B
+:1030F0009A95F1F72F5F283011F0880FEECF0895E1
+:1031000029982A988AE0982F9A95F1F7299A982F6A
+:103110009A95F1F729982898982F9A95F1F7299A76
+:10312000982F9A95F1F729988A95F1F7289A80E0D7
+:103130000895299828982A982B9A08950E9428186B
+:1031400080E30E94391880E60E94551808950E9475
+:10315000281880E00E94391880E00E9455182998AC
+:1031600028982A982B9A08950F931F93182F062FAB
+:103170000E94281880E40E943918812F0E94551857
+:10318000802F0E946B1881E01F910F9108951F936B
+:10319000182F0E94281880EC0E943918812F0E9455
+:1031A00055180E9480181F91089529988AE08A95E1
+:1031B000F1F72A9820E080E04AE0880F299A942FBE
+:1031C0009A95F1F729981B998F5F3AE0942F9A9579
+:1031D000F1F72F5F283089F72898299A932F9A952D
+:1031E000F1F7289A2998932F9A95F1F708951F934C
+:1031F000182F0E94281880E80E943918812F0E94F9
+:1032000055180E94D5181F910895DF92EF92FF92F2
+:103210000F931F93CF93DF93D82E7B018A01C0E0D9
+:10322000D0E009C08D2D8C0F0E94F718F801EC0F2B
+:10323000FD1F80832196CE15DF05A0F381E090E08D
+:10324000DF91CF911F910F91FF90EF90DF90089544
+:103250000F931F93182F062F0E949E18812F602F07
+:103260000E94B41881E01F910F910895DF92EF92B0
+:10327000FF920F931F93CF93DF93D82E7B018A0188
+:10328000C0E0D0E009C0F801EC0FFD1F8D2D8C0FC0
+:1032900060810E9428192196CE15DF05A0F381E0F8
+:1032A00090E0DF91CF911F910F91FF90EF90DF9011
+:1032B000089594E090931E050E94361980931F058F
+:1032C0001092200583E090E00E943B010895EF9268
+:1032D000FF920F931F938B019EE1E92E95E0F92E4B
+:1032E00093E090931E05A7014E5F5F4F0E94051962
+:1032F00080931F050E5F1F4FE00EF11EF701108235
+:10330000C80101960E943B011F910F91FF90EF9021
+:10331000089582E080931E051092890310928A031B
+:1033200010928B0310928C0381E080931F05109202
+:10333000200583E090E00E943B01089581E08093A6
+:103340001E050E94081880931F051092200583E037
+:1033500090E00E943B010895FC018381823069F076
+:10336000833018F48130E1F405C0833049F08430B3
+:10337000B9F40EC00E949E1908950E9489190895FB
+:103380006581848170E03696AF010E9467190895C7
+:103390006581848170E03696AF010E9459190895C5
+:1033A000808180931E0583E080931F051092200585
+:1033B00083E090E00E943B0108951F920F920FB6A8
+:1033C0000F9211240F900FBE0F901F9018959C0123
+:1033D0000897029718F024E030E025C0F901E95879
+:1033E000FC4F8DE0828328303105A1F02930310572
+:1033F00019F027E030E017C0259A81E090E0909323
+:1034000089008093880081E88093800089E0809320
+:10341000810007C0249A81E08093B30089E68093FD
+:10342000B00021E030E0C90108959C01FC01E95899
+:10343000FC4F82818D3019F026E030E054C02830F6
+:10344000310531F12930310519F027E030E04BC06A
+:1034500063307105A9F0643071053CF46130710589
+:1034600059F062307105E9F509C06430710551F019
+:1034700065307105B1F508C081E007C082E005C084
+:1034800083E003C084E001C085E08093810029C00F
+:1034900064307105E9F06530710554F462307105EE
+:1034A00099F06330710594F461307105D1F40AC06C
+:1034B0006630710589F06630710564F0673071051A
+:1034C00081F40CC089E60BC08AE609C08BE607C010
+:1034D0008CE605C08DE603C08EE601C08FE68093C2
+:1034E000B00021E030E0C90108959C01FC01E958D9
+:1034F000FC4F82818D3019F026E030E012C0283078
+:10350000310559F02930310519F027E030E009C0C4
+:10351000709389006093880002C06093B30021E03B
+:1035200030E0C90108959C0183E580931E05F901EF
+:10353000E958FC4F82818D3019F086E090E012C08E
+:103540002830310559F02930310519F087E090E035
+:1035500009C0709389006093880002C06093B30033
+:1035600081E090E080931F051092200583E090E0B9
+:103570000E943B01089522E520931E050E94151A22
+:1035800080931F051092200583E090E00E943B018C
+:10359000089520E520931E050E94E71980931F05DA
+:1035A0001092200583E090E00E943B010895FC0109
+:1035B000E958FC4F12828830910531F0893091052D
+:1035C00031F026E030E00BC01092B00004C0109241
+:1035D0008100109280000E94DE1221E030E0C901DB
+:1035E000089521E520931E050E94D71A80931F0598
+:1035F0001092200583E090E00E943B010895FC01B9
+:103600008081813579F0823518F48035F1F405C078
+:10361000823569F08335C9F411C0828190E00E943F
+:10362000C91A0895828190E00E94F11A0895638179
+:10363000828190E070E00E94BB1A089563818281CC
+:1036400090E070E00E94931A089580931E0583E035
+:1036500080931F051092200583E090E00E943B01BB
+:103660000895DF93CF93CDB7DEB7CF91DF91089563
+:103670008A3310F4805301C087556A3310F46053C5
+:1036800001C067556F708295807F862B08951F93C8
+:10369000682F62956F70182F1F706A3010F4605D8C
+:1036A00001C0695A80E00E947A061A3010F4105D59
+:1036B00001C0195A80E0612F0E947A061F91089577
+:1036C0001F93182F8A3021F480E06DE00E947A0663
+:1036D00080E0612F0E947A0681E090E01F910895BA
+:1036E00080E00E94AF0508950F9380E00E94950549
+:1036F00080E069E140E020E000E00E94D10580E048
+:1037000061E00E94E30580E068E00E94020680E03C
+:103710006EE40E942E068EEF92E09093B5068093A1
+:10372000B4060F9108958230A1F0833028F48823E5
+:1037300061F0813039F40BC0843079F0843058F076
+:10374000853079F020E030E016C082E107C08EE0DD
+:1037500005C088E003C086E001C082E08093E200FB
+:1037600002C01092E2008CE08093E30087E3809334
+:10377000E40021E030E0C9010895813091F081300A
+:1037800038F08230B9F0833019F120E030E031C0F8
+:103790008091DB008F778093DB008091DB008F7D51
+:1037A00011C08091DB0080688093DB008091DB009A
+:1037B0008F7D16C08091DB0080688093DB00809154
+:1037C000DB0080628093DB008091DB008F7E0DC088
+:1037D0008091DB0080688093DB008091DB00806259
+:1037E0008093DB008091DB0080618093DB0021E02F
+:1037F00030E0C90108951F93282F162F8FE0809382
+:103800008A0380938B031092AD06442319F081E064
+:103810008093AD061092A1061092A2061092A30604
+:103820001092A406E5EAF6E0119286E0ED3AF80778
+:10383000D9F790E0892F8295807F8093ED001092D8
+:10384000EE001092EF009F5F9F30A1F7822F0E9441
+:10385000931B892B89F0812F0E94BD1B892B61F05E
+:103860008091D80082608093D8008091D90082FF37
+:10387000FCCF21E030E002C022E030E0C9011F911E
+:1038800008958295807F8093ED0008959B01AC019F
+:103890008091AD06882381F4822F8295880F807EE7
+:1038A0008093F60063E056954795379527956A957E
+:1038B000D1F72093F7000895DA01C90153E0880F8A
+:1038C000991FAA1FBB1F5A95D1F787608093F400F8
+:1038D000292F3A2F4B2F55272093F5009D01442780
+:1038E00055272093F6008B2F9927AA27BB27809373
+:1038F000F7000895EF92FF920F931F938091AD060A
+:103900008823C1F42091F20022952695277030E09B
+:1039100040E050E08091F30090E003E0880F991FB1
+:103920000A95E1F77C0100E010E0E22AF32A042B7B
+:10393000152B33C02091F3008091F200E090F1004C
+:103940006091F00090E0A0E0B0E0DC0199278827CA
+:1039500030E040E050E0522F442733272227822BCB
+:10396000932BA42BB52BFF2400E010E0102F0F2D7C
+:10397000FE2CEE248E299F29A02BB12BE62EFF24AE
+:1039800000E010E0E82AF92A0A2B1B2B73E01695B9
+:103990000795F794E7947A95D1F7B701C8011F917D
+:1039A0000F91FF90EF9008959B01AC018091AD06BF
+:1039B000882371F4822F8295880F807E8093F20095
+:1039C000E3E05695479537952795EA95D1F725C0B9
+:1039D00073E0220F331F441F551F7A95D1F7809152
+:1039E000F00090E0A0E0B0E087709070A070B07040
+:1039F000282B392B4A2B5B2B2093F000BB27A52FBC
+:103A0000942F832F8093F100CA01AA27BB278093AC
+:103A1000F200252F3327442755272093F3000895DC
+:103A2000982F8091AD06882321F08091EF0080616E
+:103A300003C08091EF008F7E8093EF00923091F170
+:103A4000933028F4992359F0913031F422C0933007
+:103A5000B9F1943009F447C020E030E05AC08091B9
+:103A6000EF008F7B8093EF008091EF008F77809342
+:103A7000EF008091EF008F7D8093EF008091F00048
+:103A80008B7F8093F0008091F4008B7F8093F40013
+:103A90003EC08091EF008E7F8093EF008091EF0019
+:103AA00081601BC08091EF008F778093EF00809141
+:103AB000EF0080648093EF008091EF008F7D20C045
+:103AC0008091EF008F7B8093EF008091EF00806802
+:103AD0008093EF008091EF008F7D8093EF008091C5
+:103AE000F0008B7F12C08091EF008F7B8093EF00FE
+:103AF0008091EF0080688093EF008091EF008062FA
+:103B00008093EF008091F00084608093F00021E0CA
+:103B100030E0C9010895FF920F931F93162F042FD1
+:103B2000F52E8295807F8093ED0084E00E94101D29
+:103B3000193008F018E08091EF00807F812B80938E
+:103B4000EF00202F3F2DC901FC0190E004C08191BE
+:103B50008093FA009F5F9117D0F31F910F91FF9010
+:103B600008959F92AF92BF92CF92DF92EF92FF9211
+:103B70000F931F93962E59016A01982F9295907F6B
+:103B80009093ED00E82FF0E0883080F42091DE0083
+:103B9000E45FFC4F81E090E0008002C0880F991F35
+:103BA0000A94E2F7282B2093DE000FC02091DF005B
+:103BB000E45FFC4F81E090E0008002C0880F991F15
+:103BC0000A94E2F7282B2093DF00C801B7010E9476
+:103BD000461CC601B5010E94D41C892D0E94101DEF
+:103BE000892B19F021E030E002C022E030E0C90169
+:103BF0001F910F91FF90EF90DF90CF90BF90AF900B
+:103C00009F9008958091EF0087FD04C08091EF00A0
+:103C100086FF3CC08091EF0087FD0AC08091EF00D5
+:103C200086FF06C08091F00082FD02C081E0089509
+:103C30008091EF0087FD0AC08091EF0086FF06C0EB
+:103C40008091F00082FF02C082E008958091EF0031
+:103C500087FF0AC08091EF0086FD06C08091F000CA
+:103C600082FD02C083E008958091EF0087FF0EC0BF
+:103C70008091EF0086FD0AC08091EF0085FF06C0AD
+:103C80008091F00082FF02C084E0089580E00895F2
+:103C9000EF92FF920F931F93162F042FF52E82950C
+:103CA000807F8093ED000E94021EE82E193008F0FC
+:103CB00018E08091EF00807F812B8093EF00202F10
+:103CC0003F2DC901FC0190E004C081918093FA006E
+:103CD0009F5F9117D0F381E00E94101D8091EE004C
+:103CE00086FFFCCF8091EE008F7B8093EE008E2DBF
+:103CF0000E94101D81E090E01F910F91FF90EF90C6
+:103D00000895482F893008F048E08091EF00807FC7
+:103D1000842B8093EF00FB0190E004C0819180939D
+:103D2000FA009F5F9417D0F30895AC0120E030E0D3
+:103D30008091FA00FA01E20FF31F80832F5F3F4F5B
+:103D400028303105A9F70895E82FF0E0883080F495
+:103D50002091DE00E45FFC4F81E090E0008002C033
+:103D6000880F991F0A94E2F7282B2093DE0008950C
+:103D70002091DF00E45FFC4F81E090E0008002C012
+:103D8000880F991F0A94E2F7282B2093DF000895EB
+:103D9000AEEDB0E02C91ECE0F3E0E80FF11D81E036
+:103DA00090E0008002C0880F991F0A94E2F7809586
+:103DB00082238C9308953091E0002091E100922FAE
+:103DC00080E0232F30E0282B392B2115310521F4F9
+:103DD00007C0369527958F5F20FFFBCF8F3008F007
+:103DE0008FEF0895982F9295907F9093ED00AEED10
+:103DF000B0E02C91ECE0F3E0E80FF11D81E090E001
+:103E0000008002C0880F991F0A94E2F780958223F0
+:103E10008C9380E00E94101D81E090E008951F9334
+:103E200010928A0310928B0310E0812F0E94F21EE1
+:103E30001F5F1F30D1F78091D8008D7F8093D8000D
+:103E40008091D90082FDFCCF81E090E01F91089520
+:103E50001F938295807F8093ED000E94021E182F91
+:103E600082E00E94101D8091EE0086FFFCCF8091C1
+:103E7000EE008F7B8093EE00812F0E94101D81E069
+:103E800090E01F9108951F920F920FB60F920BB6FC
+:103E90000F9211241F932F933F934F935F936F9330
+:103EA0007F938F939F93AF93BF93EF93FF93109163
+:103EB000ED003091E0002091E100922F80E0232F6F
+:103EC00030E0282B392B21153105A9F103C0369597
+:103ED00027958F5F20FFFBCF8F3068F58F3F59F11B
+:103EE0008295807F8093ED000E947A1C6093A106EA
+:103EF0007093A2068093A3069093A406E5EAF6E0E9
+:103F00008091FA00819386E0ED3AF807C9F70E94A4
+:103F10007A1C6093A1067093A2068093A3069093E7
+:103F2000A4068091EE008F7D8093EE0083E00E94D6
+:103F3000101D1093ED00FF91EF91BF91AF919F91F4
+:103F40008F917F916F915F914F913F912F911F9131
+:103F50000F900BBE0F900FBE0F901F90189586E725
+:103F600080931E0581E080931F058091A1069091AA
+:103F7000A206A091A306B091A40680932005292F44
+:103F80003A2F4B2F5527209321059D014427552774
+:103F9000209322058B2F9927AA27BB2780932305DF
+:103FA0001092A1061092A2061092A3061092A406E7
+:103FB000A5EAB6E026E030E08C91F901E25EFA4F26
+:103FC00080831D922F5F3F4F86E0AD3AB807A1F77F
+:103FD00010922C058FE090E00E943B01089595E738
+:103FE00090931E050E94281F80931F0510922005A4
+:103FF00083E090E00E943B01089594E790931E05B2
+:104000000E94F21E80931F051092200583E090E02D
+:104010000E943B01089592E790931E050E94481E5E
+:1040200080931F051092200583E090E00E943B01E1
+:104030000895EF92FF920F931F9393E790931E05BD
+:104040000E94B11D80931F051092200583E090E02F
+:104050000E943B011F910F91FF90EF9008950E94E5
+:104060008B1D87E780931E0581E080931F051092CA
+:10407000200583E090E00E943B01089581E7809352
+:104080001E050E940F1F80931F051092200583E0DC
+:1040900090E00E943B010895462F90E790931E0503
+:1040A00062E00E94FB1B80931F051092200583E0B5
+:1040B00090E00E943B010895EF92FF920F931F93AF
+:1040C000FC018081833701F1843748F48137C9F0DE
+:1040D000823708F06BC0803709F07FC00DC085378C
+:1040E00009F46BC0853708F45DC0863709F469C0F0
+:1040F000873709F072C06AC0828163810E944C20B8
+:1041000077C00E943E2074C00000258130E040E06E
+:1041100050E0542F432F322F2227868190E0A0E0D9
+:10412000B0E0DC0199278827280F391F4A1F5B1F41
+:104130008481280F311D411D511D878190E0A0E031
+:10414000B0E0B82FAA2799278827280F391F4A1FC0
+:104150005B1FE184FF2400E010E0102F0F2DFE2CE8
+:10416000EE24828590E0A0E0B0E0DC01992788276A
+:10417000E80EF91E0A1F1B1F8085E80EF11C011DA9
+:10418000111D838590E0A0E0B0E0B82FAA27992701
+:104190008827E80EF91E0A1F1B1F828163810E9477
+:1041A000192026C082810E94FD1F22C08281638166
+:1041B0003496AF010E940B201BC082810E94EF1F2A
+:1041C00017C0828190E00E94AF1F12C0828163817C
+:1041D0003496AF010E942F200BC080931E0583E010
+:1041E00080931F051092200583E090E00E943B0120
+:1041F0001F910F91FF90EF900895DC0180E1A030B6
+:10420000B80710F082E00895F999FECF9D010BC028
+:10421000F999FECF32BD21BDF89A80B5E60FF71FA0
+:1042200080832F5F3F4F822F8A1BE82FF0E0E41737
+:10423000F50770F381E00895DC0180E1A030B80754
+:1042400010F082E00895F999FECF9D0110C0E60FAD
+:10425000F71FE081F999FECFC901019632BD21BD5A
+:10426000E0BD0FB6F894FA9AF99A0FBE9C01822F1E
+:104270008A1BE82FF0E0E417F50748F3C9010E9414
+:10428000FD2081E008950F931F938B0121E8209377
+:104290001E050E941C2180931F051092200500D04E
+:1042A00000D000D0EDB7FEB731968BE193E0ADB70B
+:1042B000BEB712969C938E93119783E293E09383FB
+:1042C00082838AE590E0958384830E940D250F9078
+:1042D0000F908CE293E0EDB7FEB792838183148355
+:1042E00003830E940D250F900F900F900F9083E095
+:1042F00090E00E943B011F910F910895CF92DF92B1
+:10430000EF92FF920F931F937B010EE115E020E8DF
+:1043100020931E0522E0C22ED12CC00ED11EB60164
+:10432000A7010E94FD2080931F0582E090E0E80E27
+:10433000F91E0E0D1F1DD8011C9200D000D000D018
+:10434000EDB7FEB731968BE193E0ADB7BEB71296ED
+:104350009C938E93119783E293E09383828385E30A
+:1043600090E0958384830E940D250F900F9089E340
+:1043700093E0EDB7FEB792838183D482C3820E941B
+:104380000D250F900F900F900F90C70101960E947E
+:104390003B011F910F91FF90EF90DF90CF90089518
+:1043A000EF92FF920F931F93CF93DF93EC019B81CA
+:1043B00080E02A817C01E20EF11C9D8180E02C814D
+:1043C0008C01020F111D00D000D000D0EDB7FEB758
+:1043D00031968BE193E0ADB7BEB712969C938E9366
+:1043E000119783E293E0938382838AE190E095833F
+:1043F00084830E940D25EDB7FEB7319683E493E0E8
+:10440000ADB7BEB712969C938E9311971383028318
+:10441000F582E4820E940D2588812DB73EB72A5F80
+:104420003F4F0FB6F8943EBF0FBE2DBF803819F036
+:10443000813869F405C0C701B8010E947E2112C00D
+:104440002696C701BE01A8010E9443210BC080939C
+:104450001E0583E080931F051092200583E090E005
+:104460000E943B01DF91CF911F910F91FF90EF9040
+:104470000895CF93DF93EB0190E003978632910587
+:1044800048F4865B9F4FFC01EE0FFF1F0590F491EF
+:10449000E02D099480E0BCC188E290E09983888394
+:1044A00086E290E09B838A8387E290E0B0C088E256
+:1044B00090E09983888386E290E09B838A8387E2F9
+:1044C00090E058C188E290E09983888386E290E08A
+:1044D0009B838A8387E290E076C088E290E09983AC
+:1044E000888386E290E09B838A8387E290E05DC0C8
+:1044F00088E290E09983888386E290E09B838A83B8
+:1045000087E290E044C088E290E09983888386E265
+:1045100090E09B838A8387E290E02BC088E290E062
+:104520009983888386E290E09B838A8387E290E088
+:104530005CC181E390E0998388838FE290E09B8364
+:104540008A8380E390E05FC181E390E09983888370
+:104550008FE290E09B838A8380E390E046C181E311
+:1045600090E0998388838FE290E09B838A8380E345
+:1045700090E09D838C8385E049C181E390E099833D
+:1045800088838FE290E09B838A8380E390E09D8321
+:104590008C8384E03BC181E390E0998388838FE240
+:1045A00090E09B838A8380E390E09D838C8383E00B
+:1045B0002DC181E390E0998388838FE290E09B8313
+:1045C0008A8380E390E09D838C8382E01FC181E336
+:1045D00090E0998388838FE290E09B838A8380E3D5
+:1045E00090E0C8C081E390E0998388838FE290E0F7
+:1045F0009B838A8380E390E00AC08EE290E09983F7
+:1046000088838CE290E09B838A838DE290E09D8397
+:104610008C831E82FCC08EE290E0998388838CE2BA
+:1046200090E09B838A838DE290E0A4C08EE290E0CC
+:10463000998388838CE290E09B838A838DE290E06B
+:10464000C2CF8EE290E0998388838CE290E09B83D6
+:104650008A838DE290E0A9CF8EE290E099838883EF
+:104660008CE290E09B838A838DE290E082CF8EE2A1
+:1046700090E0998388838CE290E09B838A838DE22B
+:1046800090E0B3C08EE290E0998388838CE290E062
+:104690009B838A838DE290E0B6C085E290E09983A7
+:1046A000888383E290E09B838A8384E290E0AFCFAB
+:1046B00085E290E09983888383E290E09B838A83FC
+:1046C00084E290E057C085E290E09983888383E29A
+:1046D00090E09B838A8384E290E075CF85E290E04E
+:1046E0009983888383E290E09B838A8384E290E0CD
+:1046F0005CCF85E290E09983888383E290E09B839E
+:104700008A8384E290E043CF85E290E099838883B6
+:1047100083E290E09B838A8384E290E02ACF85E263
+:1047200090E09983888383E290E09B838A8384E28C
+:1047300090E05BC085E290E09983888383E290E01B
+:104740009B838A8384E290E05EC08BE290E0998351
+:10475000888389E290E09B838A838AE290E057CF46
+:104760008BE290E09983888389E290E09B838A833F
+:104770008AE290E09D838C8381E08E8349C08BE246
+:1047800090E09983888389E290E09B838A838AE220
+:1047900090E019CF8BE290E09983888389E290E0E2
+:1047A0009B838A838AE290E000CF8BE290E099833A
+:1047B000888389E290E09B838A838AE290E0E7CE57
+:1047C0008BE290E09983888389E290E09B838A83DF
+:1047D0008AE290E0CECE8BE290E09983888389E2F2
+:1047E00090E09B838A838AE290E09D838C8386E0BD
+:1047F0000DC08BE290E09983888389E290E09B83EF
+:104800008A838AE290E09D838C8387E08E8381E0B7
+:10481000DF91CF910895CF93DF93BC018230910552
+:1048200010F462E070E0A091B006B091B106ED0125
+:10483000E0E0F0E040E050E021C0888199818617F7
+:10484000970769F48A819B81309719F0938382835B
+:1048500004C09093B1068093B006FE0134C068177F
+:10486000790738F44115510519F08417950708F4B4
+:10487000AC01FE018A819B819C01E9012097E9F648
+:1048800041155105A9F1CA01861B970B049708F43D
+:10489000BA01E0E0F0E02AC08D919C911197841755
+:1048A0009507F9F46417750781F412968D919C9120
+:1048B0001397309719F09383828304C09093B106C5
+:1048C0008093B006FD0132964CC0CA01861B970B3F
+:1048D000FD01E80FF91F6193719302978D939C93EB
+:1048E00040C0FD01828193819C01D9011097A1F6FE
+:1048F0008091AE069091AF06892B41F480916A03B6
+:1049000090916B039093AF068093AE0640916C0339
+:1049100050916D034115510541F44DB75EB780913B
+:10492000680390916903481B590B2091AE063091A2
+:10493000AF06CA01821B930B8617970780F0AB0165
+:104940004E5F5F4F8417950750F0420F531F5093EF
+:10495000AF064093AE06F9016193719302C0E0E0A7
+:10496000F0E0CF01DF91CF910895CF93DF930097CF
+:1049700009F450C0EC0122971B821A82A091B00664
+:10498000B091B106109709F140E050E0AC17BD07B7
+:1049900008F1BB83AA83FE0121913191E20FF31F3D
+:1049A000AE17BF0779F48D919C911197280F391F8D
+:1049B0002E5F3F4F3983288312968D919C911397D8
+:1049C0009B838A834115510571F4D093B106C0933E
+:1049D000B00620C012968D919C911397AD0100975F
+:1049E00011F0DC01D3CFFA01D383C283219131913D
+:1049F000E20FF31FCE17DF0769F488819981280F32
+:104A0000391F2E5F3F4FFA01318320838A819B81BA
+:104A100093838283DF91CF910895A0E0B0E0E3E13A
+:104A2000F5E20C940B28FE0135966191719180910D
+:104A3000B4069091B506AF010E9457252096E2E09A
+:104A40000C9427280F931F93CF93DF938C01E09151
+:104A5000B406F091B506838181FF21C0C0E0D0E0AB
+:104A60000DC0E091B406F091B50620853185BF01F7
+:104A7000F9010995892B11F0CFEFDFEFF801819152
+:104A80008F01882371F7E091B406F091B506208577
+:104A900031858AE0BF01F9010995892B11F0CFEF2B
+:104AA000DFEFCE01DF91CF911F910F910895ABE021
+:104AB000B0E0EDE5F5E20C94FB273C012B015A0137
+:104AC000FC0117821682838181FD03C06FEF7FEFA7
+:104AD000C6C19AE0892E1E010894211C311CF301E5
+:104AE0002381F20123FD859123FF81912F018823EA
+:104AF00009F4B2C1853239F423FD859123FF8191F8
+:104B00002F01853229F490E0B3010E944A27E7CFB4
+:104B1000982FFF24EE249924FFE1FF15D0F09B325B
+:104B200069F09C3228F4903259F0933291F40EC01F
+:104B30009D3249F0903369F441E024C052E0F52AF7
+:104B400084E0F82A28C098E0F92A25C0E0E1FE2A8E
+:104B500022C0F7FC29C0892F80538A3070F4F6FEFA
+:104B600005C0989C902C1124980E15C0E89CE02C50
+:104B70001124E80EF0E2FF2A0EC09E3229F4F6FC62
+:104B80006BC140E4F42A07C09C3619F450E8F52ABA
+:104B900002C0983649F4F20123FD959123FF9191CB
+:104BA0002F01992309F0B8CF892F8554833018F04D
+:104BB0008052833038F444E050E0A40EB51E5FE329
+:104BC00059830FC0933631F0933779F0933509F05C
+:104BD00056C020C0F5018081898342E050E0A40ED8
+:104BE000B51E610101E010E012C0F501C080D18066
+:104BF000F6FC03C06FEF7FEF02C0692D70E042E06A
+:104C000050E0A40EB51EC6010E943F278C015FE74D
+:104C1000F52214C0F501C080D180F6FC03C06FEF0F
+:104C20007FEF02C0692D70E042E050E0A40EB51E97
+:104C3000C6010E9434278C0150E8F52AF3FE07C014
+:104C40001AC080E290E0B3010E944A27EA948E2DB8
+:104C500090E008171907A8F30EC0F601F7FC85913C
+:104C6000F7FE81916F0190E0B3010E944A27E110A5
+:104C7000EA94015010400115110579F7EAC0943605
+:104C800011F0993669F5F7FE08C0F50120813181F0
+:104C90004281538184E090E00AC0F50180819181D6
+:104CA0009C01442737FD4095542F82E090E0A80EE8
+:104CB000B91E9FE6F92257FF09C0509540953095DF
+:104CC00021953F4F4F4F5F4FE0E8FE2ACA01B901DF
+:104CD000A1012AE030E00E947627D82ED21840C0E9
+:104CE000953729F41F2D1F7E2AE030E01DC01F2DAF
+:104CF000197F9F3661F0903720F4983509F0ACC0E9
+:104D00000FC0903739F0983709F0A6C004C028E0EA
+:104D100030E00AC0106114FD146020E130E004C0EE
+:104D200014FD166020E132E017FF08C0F501608134
+:104D300071818281938144E050E008C0F501808157
+:104D40009181BC0180E090E042E050E0A40EB51EED
+:104D5000A1010E947627D82ED2188FE7F82EF122D3
+:104D6000F6FE0BC05EEFF522D91438F4F4FE07C04E
+:104D7000F2FC05C08FEEF82202C01D2D01C0192DD6
+:104D8000F4FE0DC0FE01ED0DF11D8081803319F49C
+:104D900099EEF92208C01F5FF2FE05C003C08F2DF7
+:104DA000867809F01F5F0F2DF3FC14C0F0FE0FC0D2
+:104DB0001E1510F09D2C0BC09D2C9E0C911A1E2DC3
+:104DC00006C080E290E0B3010E944A271F5F1E15D3
+:104DD000C0F304C01E1510F4E11A01C0EE2404FF54
+:104DE0000FC080E390E0B3010E944A2702FF1DC07C
+:104DF00001FD03C088E790E00EC088E590E00BC09D
+:104E0000802F867891F001FF02C08BE201C080E222
+:104E1000F7FC8DE290E0B3010E944A2706C080E3D0
+:104E200090E0B3010E944A279A94D914C0F3DA940F
+:104E3000F101ED0DF11D808190E0B3010E944A2740
+:104E4000DD20A9F706C080E290E0B3010E944A2766
+:104E5000EA94EE20C1F743CEF30166817781CB015E
+:104E60002B96E2E10C941728FC01059061507040EC
+:104E70000110D8F7809590958E0F9F1F0895FC0123
+:104E80006150704001900110D8F7809590958E0F79
+:104E90009F1F08950F931F93CF93DF938C01EB0116
+:104EA0008B8181FF1BC082FF0DC02E813F818C81D1
+:104EB0009D812817390764F4E881F9810193F9830A
+:104EC000E88306C0E885F985802F0995892B31F4A0
+:104ED0008E819F8101969F838E8302C00FEF1FEF0B
+:104EE000C801DF91CF911F910F910895FA01AA2770
+:104EF000283051F1203181F1E8946F936E7F6E5F1D
+:104F00007F4F8F4F9F4FAF4FB1E03ED0B4E03CD0CA
+:104F1000670F781F891F9A1FA11D680F791F8A1FAD
+:104F2000911DA11D6A0F711D811D911DA11D20D014
+:104F300009F468943F912AE0269F11243019305DCE
+:104F40003193DEF6CF010895462F4770405D4193BF
+:104F5000B3E00FD0C9F7F6CF462F4F70405D4A330C
+:104F600018F0495D31FD4052419302D0A9F7EACFD4
+:104F7000B4E0A6959795879577956795BA95C9F703
+:104F800000976105710508959B01AC010A2E0694F6
+:104F90005795479537952795BA95C9F7620F731FAF
+:104FA000841F951FA01D089597FB092E07260AD080
+:104FB00077FD04D00CD006D000201AF470956195CE
+:104FC0007F4F0895F6F7909581959F4F0895AA1BFE
+:104FD000BB1B51E107C0AA1FBB1FA617B70710F0E4
+:104FE000A61BB70B881F991F5A95A9F78095909516
+:104FF000BC01CD0108952F923F924F925F926F9224
+:105000007F928F929F92AF92BF92CF92DF92EF9258
+:10501000FF920F931F93CF93DF93CDB7DEB7CA1BD9
+:10502000DB0B0FB6F894DEBF0FBECDBF09942A8804
+:10503000398848885F846E847D848C849B84AA84AC
+:10504000B984C884DF80EE80FD800C811B81AA8139
+:10505000B981CE0FD11D0FB6F894DEBF0FBECDBF04
+:08506000ED010895F894FFCF63
+:10506800456D62656464656450726F6A65637473E4
+:10507800004F63746F70757355534220496E7465A1
+:10508800726661636520436F6E766572746572201F
+:10509800616E6420492F4F20457874656E73696F7F
+:1050A8006E0032303039303731380025732C2564A2
+:1050B8003A20006D61696E2E630066697273742010
+:1050C8007061636B6574206F662061206C6F6E671A
+:1050D800206D65737361676520286C656E677468F9
+:1050E8003A202564290A006F63746F707573206C09
+:1050F8006F6E672072756E6E696E67206D6573736B
+:10510800616765006F63746F7075732E6C6F6E677F
+:105118005F696E646578203C206F63746F70757387
+:105128002E6C6F6E675F6279746573006E6F7420A2
+:105138006C617374207061636B65743A206469668E
+:1051480066203E203634006C617374207061636B96
+:105158006574007061727365722C20636865636B97
+:105168003A2025582C20636F6D6D616E643A2025B6
+:10517800580A0063616C6C696E6720696F5F7061C3
+:10518800727365720063616C6C696E672061646339
+:105198005F7061727365720063616C6C696E672021
+:1051A8006932635F7061727365720063616C6C6908
+:1051B8006E67207370695F706172736572006361F6
+:1051C8006C6C696E672070776D5F70617273657261
+:1051D8000063616C6C696E672063616E5F706172F9
+:1051E8007365720063616C6C696E672065657072C7
+:1051F8006F6D5F70617273657200756E6B6E6F773D
+:105208006E20636D6400726563656976696E6720F8
+:10521800636F6D6D616E643A20255820286C656E49
+:105228006774683A202575290A00676574206E65D9
+:1052380078740067657420616E64206578656375AD
+:1052480074650009040025732C25643A2000616404
+:10525800632E6300576572742025690D0A000000EB
+:10526800000200000000601B0000000000010203B3
+:10527800040506070001020304050625732C2564AE
+:105288003A2000656570726F6D2E630077726974DD
+:1052980074656E3A2025730A00726561643A2025A8
+:1052A800730A00656570726F6D5F70617273657205
+:1052B8003A206C656E6774683A2025752C20616405
+:0E52C80064723A2025750A002000B806000026
:00000001FF
diff --git a/firmware/octopus_can_stable_1_1.hex b/firmware/octopus_can_stable_1_1.hex new file mode 100644 index 0000000..cf06536 --- /dev/null +++ b/firmware/octopus_can_stable_1_1.hex @@ -0,0 +1,1133 @@ +:100000000C94FA000C9419010C9419010C94190128
+:100010000C9419010C94EB030C9419010C94190124
+:100020000C9419010C9419010C9419010C941901E8
+:100030000C94BF190C9419010C9419010C9419011A
+:100040000C9419010C94C4030C94E61F0C94190130
+:100050000C9419010C941B010C9419010C941901B6
+:100060000C9419010C9419010C9419010C941901A8
+:100070000C9419010C9419010C9419010C94190198
+:100080000C9419010C9419010C9419010C94190188
+:100090000C941901061008100A100C100E10101004
+:1000A00012101410161018101A101C101E10201008
+:1000B00022102410261028102A1054105410541006
+:1000C0005410541054102C102E10301032103410C4
+:1000D0003A103810361038103A103C103E104010CC
+:1000E00042104410461048104A104E109D109F10A8
+:1000F000A110A310A510A710A910AB10AD10AF1040
+:10010000B110B310B510B710B910BB10BD10BF10AF
+:10011000C110EB10EB10EB10EB10EB10EB10C31059
+:10012000C510C710C910CB10D110CF10CD10CF10F3
+:10013000D110D310D510D710D910DB10DD10DF107F
+:10014000E110E51056115C11621168116E11741105
+:100150007A11801186118C11921198119E11A4119F
+:10016000AA11B011B611BC11C21153115311531180
+:10017000531153115311C811CE11D411DA11E011DA
+:10018000F211EC11E611EC11F211F811FE1104124A
+:1001900010120A120A12101216121C12651268129C
+:1001A0006B126E127112741277127A127D12801213
+:1001B0008312861289128C128F1292129512981243
+:1001C0009B126212621262126212621262129E121A
+:1001D000A112A412A712AA12B312B012AD12B01239
+:1001E000B312B612B912BC12C212BF12BF12C2129F
+:1001F000C512C81211241FBECFEFD0E1DEBFCDBFA4
+:1002000013E0A0E0B1E0E8E7F4E400E00BBF02C0D7
+:1002100007900D92A633B107D9F716E0A6E3B3E035
+:1002200001C01D92A937B107E1F70E9430010C947B
+:100230003B220C9400001F920F920FB60F921124D4
+:100240000F900FBE0F901F901895FC0120E030E03A
+:1002500002C02F5F3F4F81918823D9F7C9010895CC
+:10026000CCEFD0E1DEBFCDBFF8940E9464090E94BC
+:10027000D20E8FEF84B985B92F980E94BE0981E80C
+:1002800097E10E94090A85E69CE00E940E0A81E03F
+:1002900090E00E94130ADE011196E2EEF2E083E0A4
+:1002A00001900D928150E1F7CE0101960E94080E57
+:1002B00080E091E00E94A40E81E191E00E949C0EFA
+:1002C00082E491E00E94940E0E94DE0D4C0164E6EF
+:1002D00070E00E94210A60E070E0C4010E944A0DB3
+:1002E0003C0140E050E0BC01C4010E94420A22E10E
+:1002F000A22E22E0B22ECC24DD2490E4E92EF12CB3
+:1003000002E021E030E041E050E0B301C4010E948E
+:10031000DF0C84E3A82E83E0B82E21E030E041E03A
+:1003200050E0B301C4010E94170D10929403109283
+:10033000930310929603109295030E94041B8FE77B
+:1003400087B98AE288B90E940F0485E588B90E94BE
+:100350000F0418B80E94580F0E9464090E94D70E1B
+:100360007894FFCF0F931F93CF93DF93EC018134E9
+:10037000910510F180919F039091A003892BE1F4E6
+:10038000DF93CF938BE491E09F938F930E94FD1AAC
+:1003900010929C0310929B03D0939E03C0939D03E5
+:1003A00081E090E09093A00380939F03C0E4D0E0AD
+:1003B0000F900F900F900F9068E08BE20E94A909B8
+:1003C00000E010E00EC0E0919B03F0919C03E00F71
+:1003D000F11FEB51FB4F608189E20E94A9090F5F79
+:1003E0001F4F0C171D0779F7809193039091940389
+:1003F000019749F467E08BE20E94A90910929403E7
+:10040000109293030AC063E08BE20E94A90981E085
+:1004100090E09093940380939303DF91CF911F9189
+:100420000F910895CF93DF9380919F039091A00344
+:10043000019709F04CC088E791E09F938F930E9449
+:10044000FD1A20919B0330919C0380919D03909114
+:100450009E030F900F9028173907C8F586E991E0A1
+:100460009F938F930E94FD1AC0919D03D0919E038C
+:1004700080919B0390919C03C81BD90B80919B0397
+:1004800090919C03805C9F4F90939C0380939B036F
+:100490000F900F90C134D1055CF08FEB91E09F93EA
+:1004A0008F930E94FD1A80E490E00E94B2010DC07B
+:1004B0008BED91E09F938F930E94FD1ACE010E94D5
+:1004C000B2011092A00310929F030F900F90DF9142
+:1004D000CF9108950F931F93CF93DF938C011092C8
+:1004E0009C0310929B031092A00310929F032F9ADB
+:1004F000FC018081282F22952F70C22FDD2799279C
+:100500009F938F93DF93CF9388EE91E09F938F9388
+:100510000E94FD1A8DB79EB706960FB6F8949EBF3F
+:100520000FBE8DBFC430D10509F451C0C530D1050F
+:1005300084F4C130D10569F1C230D1051CF4CD2B52
+:10054000C1F077C0C230D10571F1239709F071C0B5
+:1005500034C0C630D10509F44EC0C630D1050CF404
+:1005600040C0C730D10509F450C0289709F061C0D8
+:1005700056C0F8018081863041F48281813009F0D3
+:100580006DC0C8010E948C1969C0C8010E94510F3A
+:1005900065C088E092E09F938F930E94FD1AC80186
+:1005A0000E94AA1359C08BE192E09F938F930E94FF
+:1005B000FD1AC8010E940C154FC08FE292E09F9374
+:1005C0008F930E94FD1AC8010E942C1645C083E437
+:1005D00092E09F938F930E94FD1AC8010E94AA1770
+:1005E0003BC087E592E09F938F930E94FD1AC8015C
+:1005F0000E94CB1A31C08BE192E09F938F930E94AF
+:10060000FD1AC8010E94F60527C08BE692E09F9371
+:100610008F930E94FD1AC8010E94431F1DC08FE7DF
+:1006200092E09F938F930E94FD1AC8010E94CA20F6
+:1006300013C086E992E09F938F930E94FD1AF80100
+:1006400080818093E50483E08093E6041092E704C0
+:1006500083E090E00E94B2010F900F902F98DF91FD
+:10066000CF911F910F9108950F931F93CF93DF9315
+:10067000EC018C010F5F1F4F898199279F938F9306
+:1006800083EA92E09F938F930E94FD1A80919503D5
+:10069000909196030F900F900F900F90019791F506
+:1006A00087EC92E09F938F930E94FD1A20E030E048
+:1006B0000F900F90E0919703F0919803E20FF31FD2
+:1006C000DE01A20FB31F8C91EB55FC4F80832F5F8F
+:1006D0003F4F2034310571F7809197039091980333
+:1006E000805C9F4F9093980380939703209197038A
+:1006F000309198038091990390919A0328173907B4
+:10070000F0F128C081ED92E09F938F930E94FD1A33
+:10071000109298031092970320E030E00F900F9012
+:10072000E0919703F0919803E20FF31FDE01A20F0F
+:10073000B31F8C91EB55FC4F80832F5F3F4F2034CC
+:10074000310571F73093980320939703F8012081C6
+:10075000203448F4109296031092950385EA93E0B2
+:100760000E946A020CC081E090E09093960380930F
+:100770009503822F992790939A0380939903DF9191
+:10078000CF911F910F9108951F920F920FB60F9264
+:1007900011242F933F934F935F936F937F938F9386
+:1007A0009F93AF93BF93EF93FF930E94230F80918A
+:1007B0003F0386BDFF91EF91BF91AF919F918F91C4
+:1007C0007F916F915F914F913F912F910F900FBE4D
+:1007D0000F901F9018951F920F920FB60F92112431
+:1007E0002F933F934F935F936F937F938F939F9339
+:1007F000AF93BF93EF93FF930E94AC0EFF91EF91E5
+:10080000BF91AF919F918F917F916F915F914F9128
+:100810003F912F910F900FBE0F901F90189520E0E1
+:1008200080E49CE90197F1F72F5F2931C9F708951A
+:10083000882329F0813071F084E090E008958EE003
+:100840008093690380936A0388E18093C10081E00B
+:1008500090E008958EE080934E0380934F0388E1EB
+:100860008093C90081E090E00895882329F08130C9
+:1008700091F084E090E008951092690310926A0369
+:100880001092C5001092C4001092C1001092C200D4
+:1008900081E090E0089510924E0310924F03109261
+:1008A000CD001092CC001092C9001092CA0081E0D5
+:1008B00090E008950F93882329F0813041F084E07F
+:1008C00090E00BC02093C5006093C40004C0209347
+:1008D000CD006093CC0081E090E00F9108956230EC
+:1008E00011F492E001C090E0882329F0813071F08A
+:1008F00084E090E008958091C200990F990F990FBC
+:10090000982B9093C20081E090E008958091CA00F6
+:10091000990F990F990F982B9093CA0081E090E05E
+:100920000895663061F0673019F0653019F404C03D
+:1009300021E003C021E004C020E090E002C020E0FC
+:1009400091E0882329F0813079F084E090E00895E7
+:100950008091C200220F220F990F922B982B909317
+:10096000C20081E090E008958091CA00220F220F1A
+:10097000990F922B982B9093CA0081E090E00895F4
+:10098000653439F06F3419F421E091E004C020E0BF
+:1009900001C021E090E0882329F0813089F084E0D3
+:1009A00090E008958091C2002295220F207E9295BA
+:1009B000907F922B982B9093C20081E090E0089555
+:1009C0008091CA002295220F207E9295907F922BD3
+:1009D000982B9093CA0081E090E00895882329F035
+:1009E000813061F084E090E008958091C00085FF3F
+:1009F000FCCF6093C60081E090E008958091C8002C
+:100A000085FFFCCF6093CE0081E090E00895FF92D7
+:100A10000F931F93CF93DF93F82EEB018A0181E0B0
+:100A20008F1548F484E090E00DC0F80161918F01CA
+:100A30008F2D0E94EE042197FFEFCF3FDF07A9F72C
+:100A400081E090E0DF91CF911F910F91FF90089589
+:100A5000882329F0813051F084E090E0089580915E
+:100A6000C00087FFFCCF8091C60006C08091C800FF
+:100A700087FFFCCF8091CE0099270895FF920F93B6
+:100A80001F93CF93DF93F82E8B0181E08F1518F41D
+:100A900084E090E00EC0EA0107C08F2D0E94280577
+:100AA000F80181938F0121971C161D06B4F381E094
+:100AB00090E0DF91CF911F910F91FF9008957727DC
+:100AC0000E9407058093E6041092E70483E090E01B
+:100AD0000E94B20108950E9491048093E60410924E
+:100AE000E70483E090E00E94B20108950E9491041F
+:100AF0008093E6041092E70483E090E00E94B20144
+:100B000008950E946F048093E6041092E70483E046
+:100B100090E00E94B20108950F930E945A048093BE
+:100B2000E6041092E70483E090E00E94B2010F9186
+:100B300008950E9435048093E6041092E70483E050
+:100B400090E00E94B20108950E9418048093E60488
+:100B50001092E70483E090E00E94B2010895CF92E2
+:100B6000DF92EF92FF920F931F93CF93DF93CDB756
+:100B7000DEB78B01CDB6DEB62DB73EB7261B370BE1
+:100B80000FB6F8943EBF0FBE2DBFEDB6FEB608946B
+:100B9000E11CF11CAB01B7010E943E058093E60405
+:100BA00020E030E00AC0F701E20FF31F8081F90175
+:100BB000E951FB4F80832F5F3F4F201731079CF394
+:100BC000F801E951FB4F1082C80103960E94B2015F
+:100BD0000FB6F894DEBE0FBECDBEDF91CF911F9150
+:100BE0000F91FF90EF90DF90CF9008950F93FC014D
+:100BF00080818093E504843611F1853648F482368D
+:100C0000B1F08336E0F4803651F0813681F50BC0C7
+:100C1000873639F18836E9F0853649F515C0828185
+:100C20000E94A4052DC082810E94990529C00681D9
+:100C300025814481638182810E948C0521C063816A
+:100C400082810E9481051CC0638182810E946B05A4
+:100C500017C0AF014C5F5F4F638182810E945F05C7
+:100C60000FC06381772782810E94AF0509C083E0AE
+:100C70008093E6041092E70483E090E00E94B201C2
+:100C80000F91089587E280934D0685E280934C068C
+:100C900090E290934E0610924F0628E030E0309399
+:100CA00051062093500683E28093590681E2809397
+:100CB000580690935A0610925B0630935D06209377
+:100CC0005C06089508956091650681E20E94A90975
+:100CD000089568E08BE20E94A90961E188E20E9420
+:100CE000A90968E08FE20E94A90961E18CE20E94F3
+:100CF000A90961E08FE20E94A90910929403109261
+:100D0000930365E083E20E94A90908950F931F935E
+:100D10008C0160E480E20E94A909F80162816058B8
+:100D200084E00E94A909F8018281809364061F91E2
+:100D30000F9108950F931F93CF93DF93EC012885B4
+:100D4000398512161306DCF58E819F818217930771
+:100D50001CF568E083E20E94A90900E010E00FC0E2
+:100D60008A859B85E80FF91F608181E20E94A909AD
+:100D70008E819F8101969F838E830F5F1F4FEE812F
+:100D8000FF8188859985083011051CF4E817F9075B
+:100D90003CF3E817F90724F061E087E20E94A90913
+:100DA0008B81813031F465E089810E94A9091B8221
+:100DB00006C061E089810E94A90981E08B83DF91EF
+:100DC000CF911F910F910895CF93DF93CDB7DEB7E9
+:100DD00024970FB6F894DEBF0FBECDBFDC01FC0137
+:100DE0002281338110925F0610925E0681E080932B
+:100DF0005B06832F99278230D9F0833069F18130E7
+:100E000009F057C080913806992790936106809326
+:100E1000600688E396E0909363068093620686817D
+:100E200097818034910509F044C088E090E029C0A2
+:100E3000FD01868197819093610680936006E22F81
+:100E4000FF27EE0FFF1F80914A0690914B06E80F97
+:100E5000F91F8081918129C02223C1F0E22FFF2751
+:100E6000EE0FFF1F8091A3039091A403E80FF91FD9
+:100E70000190F081E02DF0936306E093620680819B
+:100E80009927909361068093600613C094E099833C
+:100E900083E08A8389E08B839C8384E090E0909355
+:100EA000610680936006CE0101969093630680935D
+:100EB000620688E596E00E949A0624960FB6F8949A
+:100EC000DEBF0FBECDBFDF91CF910895CF93DF93EB
+:100ED00082E20E948409C82FDD27C5FF1AC068E09E
+:100EE00083E20E94A909C6FF10C020915E063091DE
+:100EF0005F068091600690916106281739072CF4EF
+:100F000088E596E00E949A0604C061E087E20E94AC
+:100F1000A909DF91CF9108951F93CF93DF9388E0C4
+:100F20000E948409182FC82FDD27C6FF18C060E073
+:100F300085E00E94A90960E884E00E94A90960E0B8
+:100F400080E20E94A90968E083E20E94A90961E0A9
+:100F500087E20E94A90962E085E00E94A909C4FF16
+:100F600004C060EC89E00E94A90917FF04C060ED8D
+:100F700089E00E94A909DF91CF911F9108958AE02D
+:100F80000E948409992780FF03C00E946607089584
+:100F900081FF0DC08AE20E9484098091250681307C
+:100FA00061F4E0912806F09129060995089582E3FD
+:100FB0000E9484098AE30E94840908958EE00E94B9
+:100FC000840968E08FE20E94A90961E08FE20E9433
+:100FD000A909209160063091610680915C0690918C
+:100FE0005D06821793075CF468E083E20E94A9091A
+:100FF00061E087E20E94A90981E080935B06089581
+:10100000AF92BF92CF92DF92EF92FF920F931F9316
+:10101000CF93DF93CDB7DEB728970FB6F894DEBF36
+:101020000FBECDBF86E20E94840986FF7EC08E017E
+:101030000F5F1F4F580169E0C62ED12CCC0EDD1E6C
+:1010400080914C060E948409F80181938F017501FB
+:10105000EC15FD05A9F768E087E20E94A90968E0A0
+:1010600083E20E94A90980E20E9484098F77682F99
+:1010700080E20E94A9098981992780769070803248
+:10108000910509F440C080349105D1F1892BF1F527
+:10109000F50181818630D9F0873048F48130F1F153
+:1010A0008130C8F08330D1F1853081F521C089309D
+:1010B00019F18A3018F4883049F505C08A3071F189
+:1010C0008B3021F520C0C5010E94630627C0C501F1
+:1010D0000E94E40623C068E083E20E94A90961E05F
+:1010E00081E20E94A90960E081E20E94A9090BC087
+:1010F000C5010E94860612C0C5010E9469060EC085
+:10110000C5010E94620965E083E206C080E20E9498
+:1011100084098058682F80E20E94A909F701808124
+:101120008823D1F465E083E215C0209160063091F8
+:10113000610680915C0690915D068217930764F4C6
+:10114000109261061092600668E083E20E94A9098D
+:1011500061E087E20E94A90928960FB6F894DEBFE5
+:101160000FBECDBFDF91CF911F910F91FF90EF90F8
+:10117000DF90CF90BF90AF900895CF92DF92EF9223
+:10118000FF920F931F93CF93DF93CDB7DEB7C05479
+:10119000D0400FB6F894DEBF0FBECDBF8CE00E94EA
+:1011A0008409992780FF03C00E9400087BC081FF4B
+:1011B0002AC08EE20E9484098DE20E9484098983FC
+:1011C0008E010F5F1F4F6801FFE3EF2EF12CE00E41
+:1011D000F11E0F5F1F4F0E947209F80180830E15E8
+:1011E0001F05B9F780913603813031F4E09139035E
+:1011F000F0913A03C601099568E08FE20E94A909BF
+:1012000061E08FE22BC082FF2CC086E30E9484093C
+:1012100085E30E94840989838E010F5F1F4F680157
+:10122000EFE3EE2EF12CE00EF11E0F5F1F4F0E9438
+:101230007209F80180830E151F05B9F780913703F5
+:10124000813031F4E0913B03F0913C03C6010995F4
+:1012500068E087E30E94A90961E087E30E94A90989
+:1012600021C083FF1FC08EE30E9484098E010F5F9F
+:101270001F4F680171E4E72EF12CEC0EFD1E8DE38B
+:101280000E948409F80181938F01EE15FF05B9F7DB
+:1012900080913803813031F4E0913903F0913A03C1
+:1012A000C6010995C05CDF4F0FB6F894DEBF0FBED4
+:1012B000CDBFDF91CF911F910F91FF90EF90DF9005
+:1012C000CF9008950895089581E080936A0080E1A9
+:1012D0008DBB83B3876083BB84B3836084BB3F9A39
+:1012E000479A089588B1805888B984B322E082274C
+:1012F00084BB0000000080B198B1905898B994B3B5
+:10130000922794BB992708959FEF91B982B988B12C
+:10131000805888B984B395E0892784BB88B1805808
+:1013200088B984B3892784BB000011B80E94720970
+:101330009927089582B988B1805888B984B391E01B
+:10134000892784BB88B1805888B984B3892784BB36
+:10135000089582B98FEF81B988B1805888B984B374
+:1013600095E0892784BB88B1805888B984B38927E0
+:1013700084BB862F0E949A090895089582E1809384
+:10138000380681E08093390680E191E090933B0636
+:1013900080933A0610923C0610923D0610923E064B
+:1013A00088E080933F06109241061092400610920A
+:1013B000430610924206109245061092440610927F
+:1013C000460610924706109248061092490610925F
+:1013D00036031092370310923803109225061092AC
+:1013E00026061092270610922F0610922E061092B3
+:1013F000A2031092A10308959093410680934006A2
+:10140000709343066093420650934506409344060A
+:101410000895909341068093400608959093430663
+:10142000809342060895909345068093440608955C
+:1014300080933C06089580933D06089580933E0670
+:101440000895CF93DF939C01CB01E0912E06F0919C
+:101450002F0662E070E00E9414220FC0A081B181CB
+:101460008281823039F4ED018D81992782179307AB
+:1014700009F468870780F085E02D309779F7DF91D0
+:10148000CF910895CF93DF939C01E0912E06F091C8
+:101490002F0614C0A081B1818281843061F48481DF
+:1014A00099278217930739F486819927861797071A
+:1014B00011F4ED014B830780F085E02D309751F753
+:1014C000DF91CF910895BF92CF92DF92EF92FF927A
+:1014D0000F931F93CF93DF936C01162FF42EB22E30
+:1014E000C0912E06D0912F062097A1F489E090E0BC
+:1014F0000E941621FC0190932F0680932E06D18224
+:10150000C082138310861782F282B4820583E6823A
+:1015100015C0EC018F8198850097D9F789E090E09C
+:101520000E941621FC0198878F83D182C082138389
+:10153000F282B4820583E68210861782DF91CF9112
+:101540001F910F91FF90EF90DF90CF90BF90089583
+:10155000EF92FF921F93CF93DF937C01C091A10381
+:10156000D091A203209711F011E012C085E090E025
+:101570000E941621FC019093A2038093A103F182A3
+:10158000E08212821482138210E012C01F5FEC010D
+:101590008B819C810097D1F785E090E00E94162115
+:1015A000FC019C838B83F182E0821283148213827C
+:1015B000812F9927DF91CF911F91FF90EF90089590
+:1015C000EF92FF920F931F93CF93DF93E091A103CC
+:1015D000F091A20380E090E00380F481E02D019679
+:1015E0003097D1F7880F991F0E9416219093A4037A
+:1015F0008093A3030091A1031091A203E801E88066
+:10160000F9808A81C82FDD27CC0FDD1F8091A303CD
+:101610009091A403C80FD91FF701808199270E94D8
+:1016200016219983888320E030E017C0E801EA8121
+:10163000FF27EE0FFF1F8091A3039091A403E80FF3
+:10164000F91F0190F081E02DE20FF31FD701A20FE7
+:10165000B31F8C9180832F5F3F4FF70180819927C3
+:10166000281739071CF3E8018B819C81009711F042
+:101670008C01C4CFDF91CF911F910F91FF90EF901C
+:1016800008954F925F926F927F928F929F92AF9246
+:10169000BF92CF92DF92EF92FF920F931F93CF935F
+:1016A000DF93E0912E06F0912F066624772409C07F
+:1016B0008281823019F40894611C711C0780F085C6
+:1016C000E02D3097A9F74301880C991CC4010E94B2
+:1016D000162190934B0680934A06E1E0EE2EF12C02
+:1016E000AA24BB2455C0E0912E06F0912F0679E084
+:1016F000C72ED12C15C0A081B181848199278E1568
+:101700009F0519F48381C80ED11CED018D818E15C2
+:1017100021F48281823009F45D010780F085E02D9B
+:10172000309749F700914A0610914B06025010403D
+:10173000080D191DC6010E941621F80191838083AE
+:1017400020E030E0E0914A06F0914B06E80DF91DEB
+:1017500032970190F081E02DE20FF31FD501A20F27
+:10176000B31F8C9180832F5F3F4F2930310551F794
+:10177000E0914A06F0914B06E80DF91D3297019071
+:10178000F081E02D8C2D875F82830894E11CF11C91
+:101790006E147F040CF0A7CF61E0C62ED12C59E067
+:1017A000A52EB12C4424552442E0842E912CA1C0B6
+:1017B000A0912E06B0912F0612C0ED91FC911197C9
+:1017C0008181823049F4858199278C159D0521F40A
+:1017D0008481482E552405C0ED01AF81B88510974E
+:1017E00061F731E0E32EF12C79C060912E06709103
+:1017F0002F066DC0FB01C081D1818981843009F041
+:1018000063C0868199278E159F0509F05DC084818C
+:1018100099278C159D0509F057C0950140E050E0CF
+:10182000E0914A06F0914B06E80DF91D32970190C0
+:10183000F081E02DE20FF31FDE01A40FB51F8C91A4
+:1018400080832F5F3F4F4F5F5F4F4930510541F716
+:1018500089E090E0A80EB91EC0912E06D0912F0607
+:1018600031C08A81853059F58C8199278C159D0569
+:1018700031F58D8199278E159F0509F5088119810C
+:10188000950140E050E0E0914A06F0914B06E80DEA
+:10189000F91D32970190F081E02DE20FF31FD8017E
+:1018A000A40FB51F8C9180832F5F3F4F4F5F5F4F19
+:1018B0004730510541F7E7E0F0E0AE0EBF1E0F8064
+:1018C000D885C02D209769F6EB016F817885611569
+:1018D000710509F08FCF0894E11CF11C4E145F04D0
+:1018E0000CF083CF0894C11CD11CE2E0F0E08E0E16
+:1018F0009F1E6C147D040CF05BCFDF91CF911F9184
+:101900000F91FF90EF90DF90CF90BF90AF909F909E
+:101910008F907F906F905F904F9008956F927F921D
+:101920008F929F92AF92BF92CF92DF92EF92FF92EF
+:101930000F93CF93DF935C013B014901E0912E06A9
+:10194000F0912F0616C0A081B18184819927A81635
+:10195000B90661F4868199278615970539F4828145
+:10196000843021F4ED018C818F5F8C830780F085BA
+:10197000E02D309741F787E090E00E941621FC01AE
+:1019800087E0808385E0818382820383F582E4821D
+:10199000C682EE24062D2A2D45E067E0CF010E9485
+:1019A000630ADF91CF910F91FF90EF90DF90CF907E
+:1019B000BF90AF909F908F907F906F900895AF925F
+:1019C000BF92CF92DF92EF92FF920F93FC01A1148E
+:1019D000B10401F14230510571F04330510599F0E5
+:1019E00041305105B9F481E080932506B092290673
+:1019F000A09228060FC081E080932606B0922B06A5
+:101A0000A0922A0607C081E080932706B0922D0697
+:101A1000A0922C0620583F4FCF010E948E0C0F91B0
+:101A2000FF90EF90DF90CF90BF90AF900895AF926E
+:101A3000BF92CF92DF92EF92FF920F93FC01423060
+:101A4000510571F04330510599F041305105B9F419
+:101A500081E080933603B0923A03A09239030FC01D
+:101A600081E080933703B0923C03A0923B0307C010
+:101A700081E080933803B0923E03A0923D03CF01F2
+:101A80000E948E0C0F91FF90EF90DF90CF90BF904F
+:101A9000AF900895CF92DF92EF920F931F93CF9361
+:101AA000DF936C018B01A0912E06B0912F06C0E050
+:101AB000D0E014C02D913C911197F90185818C15CE
+:101AC00051F4FD018281823031F4F90184818F5F0C
+:101AD0008483C82FDD27FD01A781B085109751F7BA
+:101AE00089E090E00E941621FC0189E0808384E077
+:101AF00081830283138214821582168217821086D4
+:101B0000EC2E00E02C2D44E069E0CF010E94630A36
+:101B1000CE01DF91CF911F910F91EF90DF90CF9089
+:101B20000895BF92CF92DF92EF92FF920F931F938F
+:101B3000CF93DF936C017B01142FB22EA0912E0660
+:101B4000B0912F06C0E0D0E014C02D913C911197C8
+:101B5000F90185818C1551F4FD018281823031F4C7
+:101B6000F90184818F5F8483C82FDD27FD01A78160
+:101B7000B085109751F789E090E00E941621FC0192
+:101B800089E0808384E08183E2821382148215835A
+:101B9000B68207831086EC2E00E02C2D44E069E02D
+:101BA000CF010E94630ACE01DF91CF911F910F9167
+:101BB000FF90EF90DF90CF90BF900895EF920F933A
+:101BC0001F93109149061F5F1093490689E090E02A
+:101BD0000E941621FC0189E0808389E090E09383D4
+:101BE000828382E0818314821583168280EA878350
+:101BF0008AE18087EE2400E020E042E069E0CF0146
+:101C00000E94630A812F99271F910F91EF900895E9
+:101C1000CF93DF93EC01FC0101900020E9F7E81B72
+:101C2000F90BCF01880F991F0E9416219C01FE011C
+:101C300001900020E9F7EC1BFD0BEE0FFF1FDC010C
+:101C4000EC9383E0F901818340E050E009C0FE019C
+:101C5000E40FF51F80818C93FD0111824F5F5F4F70
+:101C60001296FE0101900020E9F73197EC1BFD0B65
+:101C70004E175F0760F3C9010E94A80A9927DF91F8
+:101C8000CF910895EF92FF920F931F93CF93DF931D
+:101C90008C017B01CA010E94080E9C01E0912E0676
+:101CA000F0912F0614C0A081B1818281843061F44B
+:101CB000848199278017910739F4868199278E1599
+:101CC0009F0511F4ED0128870780F085E02D3097FE
+:101CD00051F7DF91CF911F910F91FF90EF900895F1
+:101CE0000F931F93CF93DF938C01CB010E94080EBB
+:101CF0009C01E0912E06F0912F060FC0A081B181CA
+:101D00008281823039F4ED018D8199278017910706
+:101D100009F42E830780F085E02D309779F7DF9165
+:101D2000CF911F910F9108950E94080E1816190661
+:101D300014F48093480608950E94080E1816190698
+:101D400014F48093470608950E94080E1816190689
+:101D500014F48093460608951F9386E00E94840938
+:101D6000992786FF03C00E94BD080EC082FF03C0F2
+:101D70000E94BF0709C081FF03C00E948C0704C0F6
+:101D800084FF02C00E94DE0787E00E948409182FAA
+:101D900060E087E00E94A909612F87E00E94A909FD
+:101DA0001F91089562E081E00E94A90908950E94B0
+:101DB000410B0E94E00A0E94420661E080E00E941E
+:101DC000A90980E00E94840980FDFBCF62E081E0E8
+:101DD0000E94A90960E884E00E94A90960E480E209
+:101DE0000E94A90968E083E20E94A90969E087E2EC
+:101DF0000E94A9096FE08DE00E94A9096FE08BE0C5
+:101E00000E94A90968ED89E00E94A90963E38FE0B7
+:101E10000E94A90966ED87E00E94A90962E085E0B9
+:101E20000E94A9096CEC80E00E94A90908958EEC3B
+:101E300080933F0381E080936E0080913F0386BDD5
+:101E400083E084BD08950895089583E08093E504B8
+:101E500081E08093E6048BE08093E7042FE62093F3
+:101E6000E80493E69093E90484E78093EA042093DE
+:101E7000EB049093EC0481E68093ED048EE680936E
+:101E8000EE048FE58093EF0480E38093F00481E318
+:101E90008093F1041092F2048EE090E00E94B2016F
+:101EA0000895FC018081833011F40E94250F08956C
+:101EB0001F9311E0812F0E94631060E0812F0E9428
+:101EC00037111F5F1431B1F718E1812F0E946310A1
+:101ED00060E0812F0E9437111F5F1B32B1F71F9105
+:101EE0000895CF93DF93DC01EC01EA81FB8121911E
+:101EF0008E81815019F48981E81BF109ED01FB8382
+:101F0000EA838E839FB7F8948C9181508C939FBF06
+:101F1000822F9927DF91CF910895FC01108275835C
+:101F20006483738362834183478346830895CF9399
+:101F3000DF93DC019C91ED018981981718F080E016
+:101F400090E016C0ED01EC81FD8161938F8181509D
+:101F500019F48981E81BF109ED018F83FD83EC837E
+:101F60009FB7F8948C918F5F8C939FBF81E090E036
+:101F7000DF91CF910895FC0180818823E9F3CF019F
+:101F80000E94710F99270895FC018081882319F41C
+:101F90008FEF9FEF0895CF010E94710F9927089549
+:101FA00081E090E0089581E090E0089581E090E084
+:101FB000089581E090E00895CF93DF93CDB7DEB729
+:101FC00022970FB6F894DEBF0FBECDBF982F815079
+:101FD000833120F08751833108F066C0E92FFF2755
+:101FE000E15CFC4F82E08183892F9927AA27BB27D8
+:101FF000FC013197EC32F10508F056C0E65BFF4F6B
+:10200000EE0FFF1F0590F491E02D09946D9A43C0E7
+:102010006E9A45C06F9A3FC0209A41C0219A3BC03A
+:10202000229A3DC0239A37C0249A39C0259A33C0DA
+:10203000269A35C0279A2FC0509A31C0519A2BC08A
+:10204000529A2DC0539A27C0549A29C0559A23C03A
+:10205000569A25C0579A1FC0389A21C0399A1BC07A
+:102060003A9A1DC03B9A17C03C9A19C0879A13C070
+:10207000869A15C0859A0FC0849A11C0839A0BC0A6
+:10208000829A0DC0699A07C0689A09C0689A03C00D
+:10209000699A05C06A9A81E090E008C06B9AE1E015
+:1020A000F0E0FA83E98304C084E090E09A838983B6
+:1020B00089819A8122960FB6F894DEBF0FBECDBFFC
+:1020C000DF91CF910895982F8150833130F087515F
+:1020D000833118F084E090E00895892F0E94DC0F8E
+:1020E00081E090E00895CF93DF93CDB7DEB72297DC
+:1020F0000FB6F894DEBF0FBECDBF982F815083314D
+:1021000020F08751833108F066C0E92FFF27E15C9A
+:10211000FC4F81E08183892F9927AA27BB27FC01E7
+:102120003197EC32F10508F056C0EA58FF4FEE0F38
+:10213000FF1F0590F491E02D09946D9843C06E98AF
+:1021400045C06F983FC0209841C021983BC022985D
+:102150003DC0239837C0249839C0259833C02698AD
+:1021600035C027982FC0509831C051982BC0529835
+:102170002DC0539827C0549829C0559823C056980D
+:1021800025C057981FC0389821C039981BC03A986D
+:102190001DC03B9817C03C9819C0879813C08698FB
+:1021A00015C085980FC0849811C083980BC0829881
+:1021B0000DC0699807C0689809C0689803C06998FD
+:1021C00005C06A9881E090E008C06B98E1E0F0E01B
+:1021D000FA83E98304C084E090E09A83898389814B
+:1021E0009A8122960FB6F894DEBF0FBECDBFDF9165
+:1021F000CF910895FB011082833091F0843028F450
+:10220000813051F0823029F409C0843059F0853092
+:1022100059F085E090E0089583B107C086B105C00C
+:1022200089B103C08CB101C08FB1808381E090E09F
+:102230000895833091F0843028F4813051F0823059
+:1022400029F409C0843059F0853069F084E090E0C9
+:10225000089565B905C068B903C06BB901C06EB90E
+:1022600081E090E0089561BB81E090E00895982FAF
+:10227000E82FFF27E15CFC4F8181823019F086E076
+:1022800090E00895892F9927AA27BB27FC01319751
+:10229000EC32F10540F4EE55FF4FEE0FFF1F0590B5
+:1022A000F491E02D099484E090E00895662311F004
+:1022B000759AC5C07598C3C0662311F0769ABFC0E1
+:1022C0007698BDC0662311F0779AB9C07798B7C0E9
+:1022D000662311F0289AB3C02898B1C0662311F084
+:1022E000299AADC02998ABC0662311F02A9AA7C0DD
+:1022F0002A98A5C0662311F02B9AA1C02B989FC0E5
+:10230000662311F02C9A9BC02C9899C0662311F07B
+:102310002D9A95C02D9893C0662311F02E9A8FC0E8
+:102320002E988DC0662311F02F9A89C02F9887C0F0
+:10233000662311F0589A83C0589881C0662311F023
+:10234000599A7DC059987BC0662311F05A9A77C07C
+:102350005A9875C0662311F05B9A71C05B986FC084
+:10236000662311F05C9A6BC05C9869C0662311F01B
+:102370005D9A65C05D9863C0662311F05E9A5FC088
+:102380005E985DC0662311F05F9A59C05F9857C090
+:10239000662311F0409A53C0409851C0662311F053
+:1023A000419A4DC041984BC0662311F0429A47C0F4
+:1023B000429845C0662311F0439A41C043983FC0FC
+:1023C000662311F0449A3BC0449839C0662311F04B
+:1023D0008F9A35C08F9833C0662311F08E9A2FC024
+:1023E0008E982DC0662311F08D9A29C08D9827C034
+:1023F000662311F08C9A23C08C9821C0662311F0BB
+:102400008B9A1DC08B981BC0662311F08A9A17C047
+:102410008A9815C0662311F0709A11C070980FC089
+:10242000662311F0719A0BC0719809C0662311F0F0
+:10243000729A05C0729803C0662321F0739A81E0F6
+:1024400090E00895739881E090E008951F93182F0D
+:102450008150833130F08751833118F084E090E06F
+:102460000FC0E12FFF27E15CFC4F83E08183812FC8
+:102470000E94DC0F61E0812F0E94371181E090E023
+:102480001F910895CF93DF93982FEB011882E82FC7
+:10249000FF27E15CFC4F8181813019F086E090E0FC
+:1024A0007DC0892F9927AA27BB27FC013197EC32E1
+:1024B000F10540F4E253FF4FEE0FFF1F0590F4913A
+:1024C000E02D099484E090E069C0659B65C062C01E
+:1024D000669B62C05FC0679B5FC05CC0189B5CC0AE
+:1024E00059C0199B59C056C01A9B56C053C01B9B5C
+:1024F00053C050C01C9B50C04DC01D9B4DC04AC016
+:102500001E9B4AC047C01F9B47C044C0489B44C055
+:1025100041C0499B41C03EC04A9B3EC03BC04B9B13
+:102520003BC038C04C9B38C035C04D9B35C032C015
+:102530004E9B32C02FC04F9B2FC02CC0309B2CC055
+:1025400029C0319B29C026C0329B26C023C0339BA3
+:1025500023C020C0349B20C01DC07F9B1DC01AC05B
+:102560007E9B1AC017C07D9B17C014C07C9B14C0F3
+:1025700011C07B9B11C00EC07A9B0EC00BC0609B2C
+:102580000BC008C0619B08C005C0629B05C002C0AB
+:10259000639B02C081E0888381E090E0DF91CF916E
+:1025A0000895CF93DF93CDB7DEB721970FB6F89498
+:1025B000DEBF0FBECDBF9BE19093E504BE016F5F10
+:1025C0007F4F0E9442128093E60489818093E70442
+:1025D0001092E80484E090E00E94B20121960FB6C8
+:1025E000F894DEBF0FBECDBFDF91CF9108959AE181
+:1025F0009093E5040E9437118093E6041092E7045B
+:1026000083E090E00E94B201089598E19093E50480
+:102610000E9419118093E6041092E70483E090E091
+:102620000E94B2010895982F89E18093E5049330C8
+:1026300099F0943028F4913059F0923029F40AC07E
+:10264000943061F0953061F085E090E020E00BC0BF
+:1026500023B107C026B105C029B103C02CB101C008
+:102660002FB181E090E08093E6042093E70410927C
+:10267000E80484E090E00E94B201089597E190930D
+:10268000E5040E9426128093E6041092E70483E09A
+:1026900090E00E94B201089595E19093E5040E94B4
+:1026A00073108093E6041092E70483E090E00E94A8
+:1026B000B201089596E19093E5040E94DC0F8093A7
+:1026C000E6041092E70483E090E00E94B2010895CE
+:1026D00084E18093E50481E08093E6041092E704AE
+:1026E00083E090E00E94B201089582E18093E504C6
+:1026F00081E08093E6041092E70483E090E00E947A
+:10270000B201089583E18093E50481E08093E604BB
+:102710001092E70483E090E00E94B201089580E106
+:102720008093E50481E08093E6041092E70483E05F
+:1027300090E00E94B201089591E19093E5040E9417
+:1027400063108093E6041092E70483E090E00E9417
+:10275000B2010895FC0180818531C9F1863180F490
+:10276000823131F1833130F48031D1F0813109F09F
+:102770004CC01AC0833109F1843109F046C022C02F
+:10278000883189F1893128F4863129F18731E9F5D9
+:1027900026C08A3189F18A3158F18B31B1F531C0C7
+:1027A00082810E948F13089582810E949C13089554
+:1027B000638182810E9475130895638182810E94E2
+:1027C00082130895638182810E9468130895828133
+:1027D0000E944C13089582810E945A1308958281A9
+:1027E0000E943E130895638182810E94051308951B
+:1027F00082810E9413130895638182810E94F712DF
+:10280000089582810E94D11208958093E50483E0A7
+:102810008093E6041092E70483E090E00E94B20106
+:102820000895E82F8152883018F084E090E00895F0
+:10283000FF27E15CFC4F84E0818381E090E0089514
+:10284000E82FFF27E15CFC4F8181843019F084E0A0
+:1028500090E00895118281E090E0089510927C004C
+:10286000823039F0833069F0813041F082E090E0CD
+:10287000089580917C00806480937C0081E090E0EA
+:10288000089580917C00806C80937C0081E090E0D2
+:10289000089593E890937A0090917C00907F982B14
+:1028A00090937C0080917A00806480937A0080917C
+:1028B0007A0086FDFCCF809178009091790020E02D
+:1028C00030E040E050E080917A00806480937A00AC
+:1028D00080917A0086FDFCCF8091780090917900FC
+:1028E000480F591F2F5F3F4F2430310561F780910A
+:1028F0007A008F7780937A00CA019695879596958E
+:1029000087950895CF93DF93EB0119821882282FC2
+:102910003327F901E15CFC4F8181843019F086E0B6
+:1029200090E00AC088E290E0821B930B0E94491459
+:102930009983888381E090E0DF91CF91089593E2BD
+:102940009093E5040E942E148093E6041092E7040D
+:1029500083E090E00E94B2010895CF93DF93CDB75A
+:10296000DEB722970FB6F894DEBF0FBECDBF92E25E
+:102970009093E504BE016F5F7F4F0E9482148093A5
+:10298000E60429813A81832F99278093E7042093D5
+:10299000E8041092E90485E090E00E94B2012296DA
+:1029A0000FB6F894DEBF0FBECDBFDF91CF91089573
+:1029B00091E29093E504E82FFF27E15CFC4F8181D1
+:1029C000843019F084E090E003C0118281E090E04F
+:1029D0008093E6041092E70483E090E00E94B20145
+:1029E0000895E82F80E28093E5048E2F815288308D
+:1029F00018F084E090E007C0FF27E15CFC4F84E022
+:102A0000818381E090E08093E6041092E70483E004
+:102A100090E00E94B2010895FC018081813271F042
+:102A2000823218F48032B1F405C0823259F0833218
+:102A300089F40CC082810E94F114089582810E9461
+:102A4000D814089582810E94AD14089582810E9455
+:102A50009F1408958093E50483E08093E604109228
+:102A6000E70483E090E00E94B2010895ECEBF0E00F
+:102A70008081846080838BE080934C038CE0809322
+:102A80004D0381E090E00895ECEBF0E080818B7FD6
+:102A9000808310924C0310924D0381E090E00895E2
+:102AA0008093B800E9EBF0E080818C7F80838081A7
+:102AB000808381E090E008958091B9009927887F14
+:102AC000907008958091B90084EA8093BC00809151
+:102AD000BC0087FFFCCF81E090E0089584E98093FB
+:102AE000BC008091BC0084FDFCCF81E090E00895A3
+:102AF000AC0120E030E00FC0FA01E20FF31F80814B
+:102B00008093BB0084E88093BC008091BC0087FF69
+:102B1000FCCF2F5F3F4F2617370774F3089584E8E3
+:102B20008093BC008091BC0087FFFCCF8091BB00EC
+:102B30009927089585E38093E50481E08093E60476
+:102B400020E030E00FC084E88093BC008091BC009E
+:102B500087FFFCCF8091BB00F901E951FB4F8083D7
+:102B60002F5F3F4F2617370774F3FB01E951FB4FE7
+:102B70001082CB0103960E94B20108959B01BC0113
+:102B8000C9010E94781581E08093E6041092E70461
+:102B900083E090E00E94B201089584E98093BC0034
+:102BA0008091BC0084FDFCCF81E08093E60410920C
+:102BB000E70483E090E00E94B20108958091B9009B
+:102BC00084EA8093BC008091BC0087FFFCCF81E049
+:102BD0008093E6041092E70483E090E00E94B20143
+:102BE00008958093B800E9EBF0E080818C7F8083CA
+:102BF0008081808381E08093E6041092E70483E083
+:102C000090E00E94B2010895ECEBF0E080818B7FB0
+:102C1000808310924C0310924D0381E08093E60470
+:102C20001092E70483E090E00E94B2010895ECEB7B
+:102C3000F0E08081846080838BE080934C038CE0A3
+:102C400080934D0381E08093E6041092E70483E0D3
+:102C500090E00E94B2010895FC0180818093E50418
+:102C60008433D1F0853338F4813379F0823381F0C5
+:102C7000803331F507C08633E9F08633A0F087331F
+:102C8000F9F41BC00E94171608950E9404160895B7
+:102C900082810E94F115089582813396BF019927A0
+:102CA0000E94BE15089563817727828199270E942B
+:102CB0009A1508950E94DE1508950E94CD15089575
+:102CC00083E08093E6041092E70483E090E00E94A2
+:102CD000B2010895782F613079F0613050F06230A0
+:102CE00021F0633009F059C002C061E003C061E027
+:102CF00004C060E030E002C060E031E04330D9F071
+:102D0000443028F4413089F0423090F40CC0453012
+:102D100031F04530A0F0463009F03FC002C040E03D
+:102D200005C040E006C041E007C041E050E005C0FA
+:102D300041E050E006C040E051E020E003C040E048
+:102D400051E021E0239884B1866084B985B1817F08
+:102D500085B980E090E0772311F081E090E075E0A4
+:102D6000880F991F7A95E1F78065660F660F660FE9
+:102D7000682B330F330F362B352B440F432B4CBDB1
+:102D80002DBD88E0809345038AE08093460389E067
+:102D90008093470381E090E0089582E090E00895F9
+:102DA0001CBC1DBC109245031092460310924703B1
+:102DB00081E090E00895AC0120E030E009C0E60F2A
+:102DC000F71F80818EBD0DB407FEFDCF2F5F3F4FF3
+:102DD000E22FFF27E417F50794F381E090E00895D0
+:102DE000DC0120E030E040E050E015C01EBC09C02E
+:102DF00083E0493E58071CF088E090E008954F5F5B
+:102E00005F4F0DB407FEF4CFFB01E20FF31F8EB549
+:102E100080832F5F3F4F2A173B0744F381E090E008
+:102E20000895CF93DF93EC01A0E0B0E020E030E024
+:102E300018C0FE01E20FF31F80818EBD08C01196FD
+:102E400083E0A93EB8071CF088E090E00FC00DB405
+:102E500007FEF5CFFB01E20FF31F8EB580832F5FD6
+:102E60003F4F241735072CF381E090E0DF91CF919D
+:102E70000895EF92FF920F931F938B01E5EEEE2ED4
+:102E8000E4E0FE2E23E42093E504B7016E5F7F4F5C
+:102E9000A8010E9411178093E6040E5F1F4FE00EF9
+:102EA000F11EF7011082C80101960E94B2011F9124
+:102EB0000F91FF90EF900895EF92FF920F931F9361
+:102EC0008C01F5EEEF2EF4E0FF2E84E48093E50410
+:102ED000B7016E5F7F4FC8010E94F0168093E60431
+:102EE0000E5F1F4FE00EF11EF7011082C801019620
+:102EF0000E94B2011F910F91FF90EF90089593E40B
+:102F00009093E50499270E94DB168093E6041092C3
+:102F1000E70483E090E00E94B201089581E4809389
+:102F2000E5040E94D0168093E6041092E70483E043
+:102F300090E00E94B201089590E49093E5040E940D
+:102F40006A168093E6041092E70483E090E00E9402
+:102F5000B2010895CF93DF93EC0188818334A9F007
+:102F6000843428F4803441F0813409F50BC0843472
+:102F700099F08534E1F414C04C816B818A810E9400
+:102F80009C1720C00E948E171DC0BE016D5F7F4F31
+:102F90008A810E947F1716C08A8199270E945C1738
+:102FA0006A817727CE0103960E9439170BC0809360
+:102FB000E50483E08093E6041092E70483E090E068
+:102FC0000E94B201DF91CF910895209A219A229A0E
+:102FD0002398249A259A2C982D9881E08093500369
+:102FE00082E080935103809352038093530381E0E6
+:102FF00090E00895109250031092510310925203E2
+:103000001092530381E090E00895289829982A9817
+:1030100080E29EE40197F1F7289A8AE0982F9A952A
+:10302000F1F72A9A299A8A95F1F70895282F299875
+:1030300087FD02C02A9801C02A9A8AE0982F9A95A3
+:10304000F1F7299A8A95F1F7299826FF02C02A9A62
+:1030500001C02A988AE0982F9A95F1F7299A8A95C3
+:10306000F1F70895282F220F30E0299827FF02C09A
+:103070002A9A01C02A988AE0982F9A95F1F7299AFE
+:103080008A95F1F73F5F373011F0220FEECF0895A8
+:10309000282F30E0299827FF02C02A9A01C02A98D9
+:1030A0008AE0982F9A95F1F7299A8A95F1F73F5F70
+:1030B000383011F0220FEECF089529982A988AE02F
+:1030C000982F9A95F1F7299A982F9A95F1F72998C0
+:1030D0002898982F9A95F1F7299A982F9A95F1F7B1
+:1030E00029988A95F1F7289A80E090E00895299828
+:1030F00028982A982B9A08950E94051880E30E9428
+:10310000161880E60E94321808950E94051880E083
+:103110000E94161880E00E9432180E9477180895C5
+:103120000F931F93182F062F0E94051880E40E940A
+:103130001618812F0E943218802F0E94481881E0B3
+:1031400090E01F910F9108951F93182F0E9405186A
+:1031500080EC0E941618812F0E9432180E945D1880
+:1031600099271F91089529988AE08A95F1F72A985E
+:1031700090E030E0990F299A2AE0822F8A95F1F7A2
+:1031800029981B999F5F822F8A95F1F73F5F38300E
+:1031900089F72898299A822F8A95F1F7289A2998F1
+:1031A0002A95F1F7892F992708951F93182F0E94C8
+:1031B000051880E80E941618812F0E9432180E947C
+:1031C000B31899271F910895DF92EF92FF920F9302
+:1031D0001F93CF93DF93D82E7B018A01C0E0D0E00C
+:1031E00009C08D2D8C0F0E94D518F801EC0FFD1F22
+:1031F00080832196CE15DF05A1F781E090E0DF9175
+:10320000CF911F910F91FF90EF90DF9008950F9352
+:103210001F93082F162F0E947C18612F802F0E9469
+:10322000901881E090E01F910F910895DF92EF9246
+:10323000FF920F931F93CF93DF93D82E7B018A01C8
+:10324000C0E0D0E009C0F801EC0FFD1F60818D2DBA
+:103250008C0F0E9407192196CE15DF05A1F781E09A
+:1032600090E0DF91CF911F910F91FF90EF90DF9051
+:10327000089594E09093E5040E9416198093E60463
+:103280001092E70483E090E00E94B2010895EF926B
+:10329000FF920F931F938B0195EEE92E94E0F92E88
+:1032A00093E09093E504A7014E5F5F4F0E94E418FE
+:1032B0008093E6040E5F1F4FE00EF11EF7011082AF
+:1032C000C80101960E94B2011F910F91FF90EF90EB
+:1032D000089582E08093E504109250031092510308
+:1032E000109252031092530381E08093E6041092EF
+:1032F000E70483E090E00E94B201089581E08093AA
+:10330000E5040E94E5178093E6041092E70483E049
+:1033100090E00E94B2010895FC018381823069F03F
+:10332000833018F48130F1F405C0833049F08430E3
+:10333000C9F40FC00E947E1908950E94691908956A
+:10334000AF014A5F5F4F6581772784810E944719EB
+:103350000895AF014A5F5F4F6581772784810E949E
+:103360003919089580818093E50483E08093E60411
+:103370001092E70483E090E00E94B20108951F924A
+:103380000F920FB60F9211240F900FBE0F901F9047
+:1033900018959C010897029718F084E090E0089532
+:1033A000F901E15CFC4F8DE0818328303105B1F0FB
+:1033B0002930310519F087E090E00895259A81E0E1
+:1033C00090E0909389008093880081E8809380004A
+:1033D00089E08093810081E090E00895249A81E063
+:1033E0008093B30089E68093B00081E090E0089577
+:1033F0009C01FC01E15CFC4F81818D3019F086E07D
+:1034000090E008952830310539F12930310519F05F
+:1034100087E090E0089563307105B1F06430710584
+:1034200044F46130710561F06230710509F040C00B
+:1034300009C06430710551F065307105C9F508C0E7
+:1034400081E007C082E005C083E003C084E001C0E2
+:1034500085E08093810029C064307105E9F0653012
+:10346000710554F46230710599F06330710594F47C
+:1034700061307105E9F40AC06630710589F0663083
+:10348000710564F06730710599F40CC089E60BC0D2
+:103490008AE609C08BE607C08CE605C08DE603C04E
+:1034A0008EE601C08FE68093B00081E090E0089541
+:1034B00081E090E008959C01FC01E15CFC4F81817A
+:1034C0008D3019F086E090E008952830310569F0DC
+:1034D0002930310519F087E090E008957093890054
+:1034E0006093880081E090E008956093B30081E0EC
+:1034F00090E0089523E52093E5040E945B1A8093F1
+:10350000E6041092E70483E090E00E94B20108957F
+:1035100022E52093E5040E94F8198093E6041092B6
+:10352000E70483E090E00E94B201089520E5209333
+:10353000E5040E94C9198093E6041092E70483E031
+:1035400090E00E94B2010895FC01E15CFC4F118201
+:103550008830910531F08930910531F086E090E0B6
+:1035600008951092B00004C0109281001092800063
+:103570000E94DC0F81E090E0089521E52093E504AE
+:103580000E94A41A8093E6041092E70483E090E07E
+:103590000E94B2010895FC018081813579F0823565
+:1035A00018F48035F1F405C0823569F08335C9F42B
+:1035B00011C0828199270E94961A089582819927C5
+:1035C0000E94BD1A089563817727828199270E94FE
+:1035D000881A089563817727828199270E947A1A31
+:1035E00008958093E50483E08093E6041092E70455
+:1035F00083E090E00E94B2010895CF93DF93CDB7AE
+:10360000DEB7DF91CF910895089581E090E00895AD
+:1036100008958A3310F4805301C087556A3310F43B
+:10362000605301C067556F708295807F682B862F2D
+:103630009927089508958230A1F0833028F48823D3
+:1036400061F0813039F40BC0843079F0843058F067
+:103650008530B9F080E090E0089582E107C08EE007
+:1036600005C088E003C086E001C082E08093E200EC
+:103670008CE08093E30087E38093E40081E090E0B6
+:1036800008951092E2008CE08093E30087E380933A
+:10369000E40081E090E00895813091F0813038F0CD
+:1036A0008230E1F0833061F180E090E00895809114
+:1036B000DB008F778093DB008091DB008F7D16C06D
+:1036C0008091DB0080688093DB008091DB008F7D40
+:1036D0008093DB008091DB0080610DC08091DB0076
+:1036E00080688093DB008091DB0080628093DB0048
+:1036F0008091DB008F7E8093DB0081E090E0089575
+:103700008091DB0080688093DB008091DB00806229
+:103710008093DB008091DB0080618093DB0081E09F
+:1037200090E008951F93982F162F8FE080935103F8
+:103730008093520310927406442319F081E0809321
+:103740007406109268061092690610926A0610922A
+:103750006B06ECE6F6E0119286E0E437F807D9F75D
+:1037600020E030E0822F8295807F8093ED001092E0
+:10377000EE001092EF002F5F3F4F2F30310591F791
+:10378000892F0E941B1B892B89F0812F0E944C1BC3
+:10379000892B61F08091D80082608093D80080915D
+:1037A000D90082FFFCCF81E090E002C082E090E08F
+:1037B0001F9108958295807F8093ED0008959B016D
+:1037C000AC0180917406882381F4822F8295880F42
+:1037D000807E8093F60063E0569547953795279550
+:1037E0006A95D1F72093F7000895DA01C90153E0F3
+:1037F000880F991FAA1FBB1F5A95D1F78760809326
+:10380000F400292F3A2F4B2F55272093F5009D01C7
+:10381000442755272093F6008B2F9927AA27BB27EB
+:103820008093F7000895EF92FF920F931F9380917A
+:1038300074068823C1F42091F20022952695277002
+:103840003327442755278091F300992703E0880FF9
+:10385000991F0A95E1F77C0100271127E22AF32A34
+:10386000042B152B33C02091F3008091F200E090DF
+:10387000F1006091F0009927AA27BB27DC01992766
+:103880008827332744275527522F442733272227B9
+:10389000822B932BA42BB52BFF2400271127102F4D
+:1038A0000F2DFE2CEE248E299F29A02BB12BE62E66
+:1038B000FF2400271127E82AF92A0A2B1B2B73E083
+:1038C00016950795F794E7947A95D1F7C801B70153
+:1038D0001F910F91FF90EF9008959B01AC01809193
+:1038E0007406882371F4822F8295880F807E8093DE
+:1038F000F200E3E05695479537952795EA95D1F77D
+:1039000025C073E0220F331F441F551F7A95D1F74E
+:103910008091F0009927AA27BB2787709070A0702C
+:10392000B070282B392B4A2B5B2B2093F000BB2740
+:10393000A52F942F832F8093F100CA01AA27BB27BC
+:103940008093F200252F3327442755272093F30037
+:103950000895982F80917406882321F08091EF00BC
+:10396000806103C08091EF008F7E8093EF009230E2
+:1039700091F1933028F4992359F0913031F422C019
+:103980009330E1F1943009F450C080E090E0089564
+:103990008091EF008F7B8093EF008091EF008F7715
+:1039A0008093EF008091EF008F7D8093EF008091F6
+:1039B000F0008B7F8093F0008091F4008B7F8093E8
+:1039C000F40030C08091EF0080648093EF0080911C
+:1039D000EF008F771BC08091EF008F778093EF000F
+:1039E0008091EF0080648093EF008091EF008F7DE5
+:1039F0008093EF008091F000846012C08091EF000E
+:103A00008F7B8093EF008091EF0080688093EF00C0
+:103A10008091EF008F7D8093EF008091F0008B7F8D
+:103A20008093F00081E090E008958091EF008F7B1B
+:103A30008093EF008091EF0080688093EF00809189
+:103A4000EF0080628093EF008091F00084608093AB
+:103A5000F00081E090E008959F92AF92BF92CF92E4
+:103A6000DF92EF92FF920F931F93E82F962E59014A
+:103A70006A01C801B7012E2F2295207F2093ED0007
+:103A80004091DE00FF27EB51FD4F21E030E0008048
+:103A900002C0220F331F0A94E2F7422B4093DE004C
+:103AA0000E94DF1BC601B5010E946D1C892D0E947A
+:103AB000A91C892B19F482E090E002C081E090E01B
+:103AC0001F910F91FF90EF90DF90CF90BF90AF903C
+:103AD0009F9008958091EF0087FD04C08091EF00D2
+:103AE00086FF3CC08091EF0087FD0AC08091EF0007
+:103AF00086FF06C08091F00082FD02C081E02FC0E9
+:103B00008091EF0087FD0AC08091EF0086FF06C01C
+:103B10008091F00082FF02C082E021C08091EF001E
+:103B200087FF0AC08091EF0086FD06C08091F000FB
+:103B300082FD02C083E013C08091EF0087FF0EC0BA
+:103B40008091EF0086FD0AC08091EF0085FF06C0DE
+:103B50008091F00082FF02C084E001C080E09927DC
+:103B60000895982F893008F098E08091EF00807FC9
+:103B7000892B8093EF00FB0120E004C081918093AA
+:103B8000FA002F5F2917D1F70895EF92FF920F9354
+:103B90001F93F62E8A018295807F8093ED000E940C
+:103BA0006A1DE82EB8018F2D0E94B11D81E00E9490
+:103BB000A91C8091EE0086FFFCCF8091EE008F7BE8
+:103BC0008093EE008E2D0E94A91C81E090E01F9151
+:103BD0000F91FF90EF900895FF920F931F93F62E91
+:103BE0008A018295807F8093ED0084E00E94A91C69
+:103BF000B8018F2D0E94B11D1F910F91FF90089564
+:103C0000AC0120E030E0FA01E20FF31F8091FA00EE
+:103C100080832F5F3F4F28303105A9F70895AEED1F
+:103C2000B0E02C91E5EEF2E0E80FF11D81E090E0CC
+:103C3000008002C0880F991F0A94E2F7282B2C936A
+:103C40000895AEEDB0E02C91E5EEF2E0E80FF11D45
+:103C500081E090E0008002C0880F991F0A94E2F78B
+:103C6000809582238C9308952091E0008091E1005B
+:103C70009927982F88273327822B932B009779F049
+:103C800020E030E002C096958795422F2F5F3F4F8E
+:103C900080FFF9CF4F3018F4842F992708958FEFC4
+:103CA00090E00895982F9295907F9093ED000E9458
+:103CB000211E80E00E94A91C81E090E00895CF932E
+:103CC000DF931092510310925203C0E0D0E08C2F8A
+:103CD0000E94521E2196CF30D105C9F78091D8009D
+:103CE0008D7F8093D8008091D90082FDFCCF81E048
+:103CF00090E0DF91CF9108951F938295807F80930C
+:103D0000ED000E946A1D182F82E00E94A91C80917C
+:103D1000EE0086FFFCCF8091EE008F7B8093EE005B
+:103D2000812F0E94A91C81E090E01F91089586E7F1
+:103D30008093E50481E08093E60480916806909189
+:103D40006906A0916A06B0916B068093E704292F5B
+:103D50003A2F4B2F55272093E8049D0144275527E0
+:103D60002093E9048B2F9927AA27BB278093EA0485
+:103D7000109268061092690610926A0610926B06FD
+:103D8000ACE6B6E026E030E08C91F901EB51FB4F58
+:103D900080831D922F5F3F4F2E303105A9F710927F
+:103DA000F3048FE090E00E94B201089595E79093AC
+:103DB000E5040E947C1E8093E6041092E70483E0F1
+:103DC00090E00E94B201089594E79093E5040E9468
+:103DD000521E8093E6041092E70483E090E00E9474
+:103DE000B201089592E79093E5040E94C51D809367
+:103DF000E6041092E70483E090E00E94B201089587
+:103E0000EF92FF920F931F9393E79093E5040E9424
+:103E10002C1D8093E6041092E70483E090E00E945A
+:103E2000B2011F910F91FF90EF9008950E94EC1D39
+:103E300087E78093E50481E08093E6041092E7042D
+:103E400083E090E00E94B201089581E78093E50449
+:103E50000E945F1E8093E6041092E70483E090E0E6
+:103E60000E94B2010895462F90E79093E50462E026
+:103E70000E94921B8093E6041092E70483E090E096
+:103E80000E94B2010895EF92FF920F931F93FC01DD
+:103E90008081833701F1843748F48137C9F0823754
+:103EA00008F06BC0803709F081C00DC0853709F478
+:103EB0006CC0853708F45DC0863709F46AC087375F
+:103EC00009F074C06BC0638182810E94331F79C086
+:103ED0000E94251F76C000002581332744275527DF
+:103EE000542F432F322F222786819927AA27BB27B9
+:103EF000DC0199278827280F391F4A1F5B1F8481FF
+:103F0000280F311D411D511D87819927AA27BB27E5
+:103F1000B82FAA2799278827280F391F4A1F5B1F08
+:103F2000E184FF2400271127102F0F2DFE2CEE24F3
+:103F300082859927AA27BB27DC0199278827E80EC5
+:103F4000F91E0A1F1B1F8085E80EF11C011D111DA3
+:103F500083859927AA27BB27B82FAA2799278827BF
+:103F6000E80EF91E0A1F1B1F638182810E94001F39
+:103F700028C082810E94E41E24C0AF014C5F5F4FC5
+:103F8000638182810E94F21E1CC082810E94D61E23
+:103F900018C0828199270E94971E13C0AF014C5F01
+:103FA0005F4F638182810E94161F0BC08093E504DE
+:103FB00083E08093E6041092E70483E090E00E949F
+:103FC000B2011F910F91FF90EF9008951F920F92F1
+:103FD0000FB60F9211241F932F933F934F935F932C
+:103FE0006F937F938F939F93AF93BF93EF93FF93C1
+:103FF0001091ED000E94341E8F3F31F18295807F39
+:104000008093ED000E94131C60936806709369060C
+:1040100080936A0690936B068CE696E00E94001EE1
+:104020000E94131C609368067093690680936A0669
+:1040300090936B068091EE008F7D8093EE0083E07D
+:104040000E94A91C1093ED00FF91EF91BF91AF91D9
+:104050009F918F917F916F915F914F913F912F91A0
+:104060001F910F900FBE0F901F901895DC0180E1FB
+:10407000A030B80718F082E090E00895F999FECFDB
+:104080009D0109C032BD21BD2F5F3F4FF89AE60F59
+:10409000F71F80B58083822F8A1BE82FFF27E41744
+:1040A000F50780F381E090E00895DC0180E1A03025
+:1040B000B80718F082E090E00895F999FECF9D01CD
+:1040C0000AC032BD21BD2F5F3F4FE60FF71F808131
+:1040D00080BDFA9AF99A822F8A1BE82FFF27E417EE
+:1040E000F50778F381E090E008950F931F938B011B
+:1040F00021E82093E5040E9455208093E604109265
+:10410000E7041F930F9384EF92E09F938F930E9495
+:10411000FD1A83E090E00E94B2010F900F900F9083
+:104120000F901F910F910895CF92DF92EF92FF921F
+:104130000F931F937B0105EE14E020E82093E50424
+:1041400022E0C22ED12CC00ED11EAB01B6010E94BE
+:1041500036208093E60482E090E0E80EF91E0E0D12
+:104160001F1DF8011082DF92CF9281E093E09F93B0
+:104170008F930E94FD1AC70101960E94B2010F9011
+:104180000F900F900F901F910F91FF90EF90DF9085
+:10419000CF900895EF92FF920F931F93CF93DF93E9
+:1041A000EC018B819927F82EEE248A81E80EF11C10
+:1041B0008D819927182F00278C81080F111DFF92E0
+:1041C000EF921F930F938BE093E09F938F930E9446
+:1041D000FD1A88812DB73EB72A5F3F4F0FB6F8947E
+:1041E0003EBF0FBE2DBF803819F0813869F405C07D
+:1041F000B801C7010E94942012C02696A801BE01F2
+:10420000C7010E9475200BC08093E50483E0809372
+:10421000E6041092E70483E090E00E94B201DF918F
+:10422000CF911F910F91FF90EF900895CF93DF935F
+:10423000AC01029710F442E050E0A0917706B091F3
+:104240007806FD01C0E0D0E020E030E020C08081B1
+:1042500091818417950769F482819381209719F0E1
+:104260009B838A8304C090937806809377069F018E
+:1042700032C04817590738F42115310519F0821753
+:10428000930708F49C01EF010280F381E02D309741
+:10429000F1F62115310599F1C901841B950B04979D
+:1042A00008F4A901E0E0F0E028C08D919C911197FD
+:1042B00082179307F9F44817590781F4ED018A81B1
+:1042C0009B81309719F09383828304C09093780682
+:1042D000809377069D012E5F3F4F4CC0841B950B4A
+:1042E000FD01E80FF91F4193519302978D939C9321
+:1042F0009F0140C0FD01A281B3811097B1F680916A
+:10430000750690917606892B41F480913203909145
+:104310003303909376068093750620913403309191
+:1043200035032115310549F48DB7282F33278091A6
+:10433000300390913103281B390BA0917506B09181
+:1043400076062A1B3B0B2417350790F0CA0102960C
+:104350002817390768F09D012E5F3F4FC901840F70
+:10436000951F90937606809375064D935C9302C0DB
+:1043700020E030E0C901DF91CF910895CF93DF9322
+:10438000009709F44EC0EC0122971B821A82A0917B
+:104390007706B0917806109711F140E050E001C027
+:1043A000DC01AC17BD0700F1BB83AA83FE0121919C
+:1043B0003191E20FF31FEA17FB0771F48D919C9185
+:1043C0001197280F391F2E5F3F4F39832883FD0136
+:1043D000828193819B838A834115510559F4D0933F
+:1043E0007806C09377061DC0FD0182819381AD01DF
+:1043F0000097B1F6FA01D383C28321913191E20F84
+:10440000F31FEC17FD0769F488819981280F391F84
+:104410002E5F3F4FFA01318320838A819B819383F2
+:104420008283DF91CF91089597FB092E07260AD04A
+:1044300077FD04D00CD006D000201AF47095619559
+:104440007F4F0895F6F7909581959F4F0895AA1B89
+:10445000BB1B51E107C0AA1FBB1FA617B70710F06F
+:10446000A61BB70B881F991F5A95A9F780959095A1
+:08447000BC01CD010895FFCF4E
+:10447800456D62656464656450726F6A65637473E0
+:10448800004F63746F70757355534220496E74659D
+:10449800726661636520436F6E766572746572201B
+:1044A800616E6420492F4F20457874656E73696F7B
+:1044B8006E003230303831313038006669727374CA
+:1044C800207061636B6574206F662061206C6F6E6D
+:1044D80067206D65737361676520286C656E677406
+:1044E800683A202564290A006F63746F7075732019
+:1044F8006C6F6E672072756E6E696E67206D65737E
+:10450800736167650A006F63746F7075732E6C6FE3
+:104518006E675F696E646578203C206F63746F70A6
+:1045280075732E6C6F6E675F62797465730A006EBF
+:104538006F74206C617374207061636B65743A20CA
+:1045480064696666203E2036340A006C6173742004
+:104558007061636B65740A007061727365722C20F8
+:10456800636865636B3A2025582C20636F6D6D6115
+:104578006E643A2025580A0063616C6C696E672086
+:10458800696F5F7061727365720A0063616C6C6950
+:104598006E67206164635F7061727365720A00639D
+:1045A800616C6C696E67206932635F7061727365F4
+:1045B800720A0063616C6C696E67207370695F7062
+:1045C80061727365720A0063616C6C696E67207052
+:1045D800776D5F7061727365720A0063616C6C69F4
+:1045E8006E672063616E5F7061727365720A006343
+:1045F800616C6C696E6720656570726F6D5F706164
+:10460800727365720A00756E6B6E6F776E20636DDC
+:10461800640A00726563656976696E6720636F6D09
+:104628006D616E643A20255820286C656E67746841
+:104638003A202575290A00676574206E6578740A22
+:104648000067657420616E642065786563757465BC
+:104658000A0009040000010203040506070001021C
+:10466800030405067772697474656E3A2025730A27
+:1046780000726561643A2025730A00656570726F7F
+:104688006D5F7061727365723A206C656E677468ED
+:104698003A2025752C20616464723A2025750A0039
+:0646A8002000790600006D
+:00000001FF
diff --git a/firmware/octopus_relais.hex b/firmware/octopus_relais.hex new file mode 100644 index 0000000..68d0cd1 --- /dev/null +++ b/firmware/octopus_relais.hex @@ -0,0 +1,959 @@ +:100000000C94F6000C9415010C9415010C94150138
+:100010000C9415010C94C1030C9415010C9415015A
+:100020000C9415010C9415010C9415010C941501F8
+:100030000C94A5190C9415010C9415010C94150140
+:100040000C94B0030C9415010C9417010C94150139
+:100050000C9415010C9415010C9415010C941501C8
+:100060000C9415010C9415010C9415010C941501B8
+:100070000C9415010C9415010C9415010C941501A8
+:100080000C9415010C9415010C9415019D0F9F0FF4
+:10009000A10FA30FA50FA70FA90FAB0FAD0FAF0FA8
+:1000A000B10FB30FB50FB70FB90FBB0FBD0FBF0F18
+:1000B000C10FFC0FFC0FFC0FFC0FFC0FFC0FC30F5C
+:1000C000C50FC70FC90FCB0FCD0FCF0FD10FD50F56
+:1000D000DB0FDF0FE30FE70FEB0FEF0FF30FF50F62
+:1000E000F70FF90F2A102C102E1030103210341088
+:1000F000361038103A103C103E1040104210441098
+:10010000461048104A104C104E1089108910891062
+:100110008910891089105010521054105610581020
+:100120005A105C105E10621068106C107010741021
+:1001300078107C108010821084108610DF10E5107B
+:10014000EB10F110F710FD10031109110F1115112B
+:100150001B11211127112D11331139113F11451197
+:100160004B11DD10DD10DD10DD10DD10DD10511143
+:1001700057115D11631169116F1175117B11851193
+:100180008F119911A311AD11B711C111CD11D31157
+:10019000D911DF1120122312261229122C122F122C
+:1001A0003212351238123B123E12411244124712DB
+:1001B0004A124D125012531256121E121E121E12C5
+:1001C0001E121E121E1259125C125F12621265126A
+:1001D0006E126B1268126B126E1271127412771219
+:1001E0007D127A127A127D128012831211241FBEA0
+:1001F000CFEFD0E1DEBFCDBF13E0A0E0B1E0E6E994
+:10020000F9E300E00BBF02C007900D92AC33B107D9
+:10021000D9F716E0ACE3B3E001C01D92A237B107F5
+:10022000E1F70E942F010C94C91C0C9400001F924E
+:100230000F920FB60F9211240F900FBE0F901F90C8
+:100240001895AC0120E030E002C02F5F3F4FFA016B
+:10025000E20FF31F80818823C1F7C90108956F92CF
+:100260007F928F929F92AF92BF92CF92DF92EF9246
+:10027000FF920F93DF93CF9300D00F92CDB7DEB7ED
+:10028000F8940E94FA080E947F0E8FEF87BB18BA7D
+:100290000E94760981E897E10E94C10985E69CE009
+:1002A0000E94C60981E090E00E94CB09DE01119610
+:1002B000E6EFF2E083E001900D928150E1F7CE018C
+:1002C00001960E94B40D80E091E00E94520E81E1FF
+:1002D00091E00E944A0E82E491E00E94420E0E9448
+:1002E0008A0D4C0164EF71E00E94D90960E070E072
+:1002F000C4010E94FE0C3C0140E050E0BC01C4017E
+:100300000E94FF092CE1A22E22E0B22ECC24DD2493
+:1003100090E4E92EF12C02E021E030E041E050E0F1
+:10032000B301C4010E94930C88E2A82E83E0B82E8A
+:1003300021E030E041E050E0B301C4010E94CB0C69
+:1003400010929A031092990310929C0310929B03AF
+:100350000E94AD1A8FE784BB8AE285BB0E94CD0361
+:1003600085E585BB0E94CD0315BA0E94050F0E944A
+:10037000FA080E94840E7894FFCF0F931F93CF93B7
+:10038000DF938C018134910510F18091A503909148
+:10039000A603892BE1F41F930F938BE491E09F93C5
+:1003A0008F930E94A61A1092A2031092A103109399
+:1003B000A4030093A30381E090E09093A6038093AD
+:1003C000A50300E410E00F900F900F900F9068E0ED
+:1003D0008BE20E944309C0E0D0E00DC0E091A10390
+:1003E000F091A203EC0FFD1FE551FB4F608189E204
+:1003F0000E9443092196C017D10780F38091990389
+:1004000090919A03019749F467E08BE20E944309B7
+:1004100010929A03109299030AC063E08BE20E9443
+:10042000430981E090E090939A0380939903DF91D0
+:10043000CF911F910F910895CF93DF938091A503E2
+:100440009091A603019709F04CC088E791E09F9333
+:100450008F930E94A61A2091A1033091A20380914C
+:10046000A3039091A4030F900F9028173907C8F5A4
+:1004700086E991E09F938F930E94A61AC091A303EF
+:10048000D091A4038091A1039091A203C81BD90B22
+:100490008091A1039091A203805C9F4F9093A2034F
+:1004A0008093A1030F900F90C134D1055CF08FEBC6
+:1004B00091E09F938F930E94A61A80E490E00E949F
+:1004C000BD010DC08BED91E09F938F930E94A61A02
+:1004D000CE010E94BD011092A6031092A5030F90B9
+:1004E0000F90DF91CF9108951F93CF93DF93EC018D
+:1004F0001092A2031092A1031092A6031092A503DA
+:100500008881182F12951F7090E09F938F93812FF1
+:1005100090E09F938F9388EE91E09F938F930E943A
+:10052000A61A8DB79EB706960FB6F8949EBF0FBE5B
+:100530008DBF143009F445C0153050F4113019F155
+:10054000113090F0123049F1133009F069C02FC01A
+:10055000163009F44AC01630F0F1173009F44FC0D4
+:10056000183009F05DC052C08881863041F48A811C
+:10057000813009F069C0CE010E94721965C0CE01B8
+:100580000E94FE0E61C088E092E09F938F930E94CC
+:10059000A61ACE010E94591355C08BE192E09F9399
+:1005A0008F930E94A61ACE010E94A4144BC08FE222
+:1005B00092E09F938F930E94A61ACE010E94EC15A1
+:1005C00041C083E492E09F938F930E94A61ACE01CC
+:1005D0000E94931737C087E592E09F938F930E9404
+:1005E000A61ACE010E94741A2DC08BE192E09F934F
+:1005F0008F930E94A61ACE010E94A50523C08BE608
+:1006000092E09F938F930E94A61A1CC083E992E008
+:100610009F938F930E94A61ACE010E94591B12C06D
+:100620008AEA92E09F938F930E94A61A8881809312
+:10063000EB0483E08093EC041092ED0483E090E0FF
+:100640000E94BD010F900F90DF91CF911F910895EF
+:10065000CF93DF93EC01898190E09F938F9387EB99
+:1006600092E09F938F930E94A61A80919B03909192
+:100670009C030F900F900F900F90019791F58BEDC9
+:1006800092E09F938F930E94A61A20E030E00F9093
+:100690000F90E0919D03F0919E03E20FF31FDE01A6
+:1006A000A20FB31F8C91E555FC4F80832F5F3F4F06
+:1006B0002034310571F780919D0390919E03805CF9
+:1006C0009F4F90939E0380939D0320919D033091B3
+:1006D0009E0380919F039091A00328173907E8F1AA
+:1006E00027C085EE92E09F938F930E94A61A1092E6
+:1006F0009E0310929D0320E030E00F900F90E09158
+:100700009D03F0919E03E20FF31FDE01A20FB31FC2
+:100710008C91E555FC4F80832F5F3F4F203431058E
+:1007200071F730939E0320939D038981803448F4B0
+:1007300010929C0310929B038BEA93E00E94740238
+:100740000CC081E090E090939C0380939B0389818F
+:1007500090E09093A00380939F03DF91CF91089541
+:100760001F920F920FB60F9211248F930E94CF0EFB
+:100770008091450382BF8F910F900FBE0F901F9005
+:1007800018951F920F920FB60F9211240E945A0EC5
+:100790000F900FBE0F901F90189520E040E45CE989
+:1007A000CA010197F1F72F5F2931D1F70895882306
+:1007B00021F0813059F084E008958EE080936F033A
+:1007C0008093700388E18AB981E008958EE0809378
+:1007D00054038093550388E180939A0081E0089543
+:1007E000882321F0813071F084E0089510926F0326
+:1007F000109270031092900019B81AB810929500D8
+:1008000081E00895109254031092550310929800BD
+:100810001092990010929A0010929D0081E0089524
+:10082000882321F0813039F084E0089520939000EE
+:1008300069B981E00895209398006093990081E060
+:100840000895623011F492E001C090E0882321F015
+:10085000813061F084E0089580919500990F990F9F
+:10086000990F982B9093950081E0089580919D00B9
+:10087000990F990F990F982B90939D0081E00895FF
+:10088000663029F0673039F0653041F402C020E06D
+:1008900006C020E001C021E090E002C021E091E02C
+:1008A000882321F0813069F084E0089580919500DB
+:1008B000220F220F990F922B982B9093950081E095
+:1008C000089580919D00220F220F990F922B982B53
+:1008D00090939D0081E00895653419F06F3419F408
+:1008E00005C021E001C020E090E002C021E091E0DD
+:1008F000882321F0813079F084E00895809195007B
+:100900002295220F207E9295907F922B982B909388
+:10091000950081E0089580919D002295220F207E10
+:100920009295907F922B982B90939D0081E0089553
+:10093000982FFA018230A0F084E008952191992344
+:1009400019F0913059F404C05D9BFECF2CB906C05C
+:1009500080919B0085FFFCCF20939C0061507040EC
+:100960006115710559F781E00895882321F08130E0
+:1009700039F084E008955D9BFECF6CB981E0089565
+:1009800080919B0085FFFCCF60939C0081E00895DF
+:10099000E82FDB01823010F084E008959A0113C043
+:1009A000EE2321F0E13031F084E00AC05F9BFECFFE
+:1009B0008CB106C080919B0087FFFCCF80919C008A
+:1009C0008D93215030401216130654F381E00895A0
+:1009D000882321F0813031F084E008955F9BFECFC1
+:1009E0008CB1089580919B0087FFFCCF80919C0083
+:1009F000089570E00E9498048093EC041092ED0436
+:100A000083E090E00E94BD0108950E94400480931D
+:100A1000EC041092ED0483E090E00E94BD01089583
+:100A20000E9440048093EC041092ED0483E090E077
+:100A30000E94BD0108950E9421048093EC0410924D
+:100A4000ED0483E090E00E94BD0108950F930E94A1
+:100A500010048093EC041092ED0483E090E00E9477
+:100A6000BD010F9108950E94F0038093EC04109251
+:100A7000ED0483E090E00E94BD010895882321F0F9
+:100A8000813051F084E011C08EE080936F03809339
+:100A9000700388E18AB908C08EE080935403809384
+:100AA000550388E180939A0081E08093EC041092D2
+:100AB000ED0483E090E00E94BD010895CF92DF92A3
+:100AC000EF92FF920F931F93DF93CF93CDB7DEB7D3
+:100AD0008B01CDB6DEB62DB73EB7261B370B0FB652
+:100AE000F8943EBF0FBE2DBFEDB6FEB60894E11CD4
+:100AF000F11CAB01B7010E94C8048093EC0420E014
+:100B000030E00AC0F701E20FF31F8081F901E351E1
+:100B1000FB4F80832F5F3F4F201731079CF3F80175
+:100B2000E351FB4F1082C80103960E94BD010FB62E
+:100B3000F894DEBE0FBECDBECF91DF911F910F9115
+:100B4000FF90EF90DF90CF9008950F93FC0180818C
+:100B50008093EB048081843611F1853648F4823627
+:100B6000B1F08336E0F4803651F0813681F50BC068
+:100B7000873639F18836E9F0853649F515C0828126
+:100B80000E943E052DC082810E94330529C0068146
+:100B900025814481638182810E94260521C0638171
+:100BA00082810E941B051CC0638182810E94050511
+:100BB00017C0AF014C5F5F4F638182810E94F904CF
+:100BC0000FC0638170E082810E945E0509C083E0EE
+:100BD0008093EC041092ED0483E090E00E94BD014C
+:100BE0000F91089587E28093530685E28093520621
+:100BF00090E2909354061092550628E030E030932E
+:100C000057062093560683E280935F0681E2809325
+:100C10005E069093600610926106309363062093FF
+:100C200062060895089560916B0681E20E9443096F
+:100C3000089568E08BE20E94430961E188E20E9426
+:100C4000430968E08FE20E94430961E18CE20E945F
+:100C5000430961E08FE20E94430910929A031092C7
+:100C6000990365E083E20E94430908950F931F935F
+:100C70008C0160E480E20E944309F80162816058BF
+:100C800084E00E944309F801828180936A061F91E3
+:100C90000F9108950F931F93CF93DF93EC01288555
+:100CA000398512161306DCF58E819F818217930712
+:100CB0001CF568E083E20E94430900E010E00FC0E9
+:100CC000EA85FB85E80FF91F608181E20E944309F4
+:100CD0008E819F8101969F838E830F5F1F4F8E8130
+:100CE0009F8128853985083011051CF482179307E8
+:100CF0003CF38217930724F061E087E20E944309E6
+:100D00008B81813031F465E089810E9443091B8227
+:100D100006C061E089810E94430981E08B83DF91F5
+:100D2000CF911F910F910895DF93CF9300D000D002
+:100D3000CDB7DEB7FC013281238110926506109297
+:100D4000640681E0809361062230F1F0233079F16E
+:100D5000213009F057C080913E06809366061092BC
+:100D600067068EE396E09093690680936806868115
+:100D700097818034910509F045C088E090E0909318
+:100D80006706809366063EC08681978190936706CA
+:100D900080936606832F90E0880F991FE09150069C
+:100DA000F0915106E80FF91F8081918127C033230C
+:100DB000B9F0832F90E0880F991FE091A903F0917B
+:100DC000AA03E80FF91F0190F081E02DF093690666
+:100DD000E09368068081809366061092670612C0D1
+:100DE00094E099832A8389E08B839C8384E090E05C
+:100DF0009093670680936606CE01019690936906EC
+:100E0000809368068EE596E00E944A060F900F9048
+:100E10000F900F90CF91DF910895CF93DF9382E2EF
+:100E20000E940B09C82F85FF1AC068E083E20E9468
+:100E30004309C6FF10C02091640630916506809179
+:100E4000660690916706281739072CF48EE596E020
+:100E50000E944A0604C061E087E20E944309DF91D4
+:100E6000CF9108950F931F9388E00E940B09082FDC
+:100E7000182F86FF18C060E085E00E94430960E8F3
+:100E800084E00E94430960E080E20E94430968E038
+:100E900083E20E94430961E087E20E94430962E025
+:100EA00085E00E94430914FF04C060EC89E00E94C1
+:100EB000430907FF04C060ED89E00E9443091F91C8
+:100EC0000F9108958AE00E940B0980FF03C00E94E1
+:100ED0000D07089581FF0DC08AE20E940B098091E1
+:100EE0002B06813061F4E0912E06F0912F060995D2
+:100EF000089582E30E940B098AE30E940B0908957A
+:100F00008EE00E940B0968E08FE20E94430961E0D5
+:100F10008FE20E9443092091660630916706809116
+:100F2000620690916306821793075CF468E083E29F
+:100F30000E94430961E087E20E94430981E08093B7
+:100F400061060895EF92FF920F931F93DF93CF9363
+:100F5000CDB7DEB728970FB6F894DEBF0FBECDBF72
+:100F600086E20E940B0986FF7FC08E010F5F1F4F34
+:100F700049E0E42EF12CEC0EFD1E809152060E94F9
+:100F80000B09F80181938F01EE15FF05B1F78E0172
+:100F90000F5F1F4F68E087E20E94430968E083E229
+:100FA0000E94430980E20E940B098F77682F80E23C
+:100FB0000E944309898190E080769070803291058B
+:100FC00009F440C080349105D1F1892BF1F5F80185
+:100FD00081818630D9F0873048F48130F1F1813059
+:100FE000C8F08330D1F1853081F521C0893019F105
+:100FF0008A3018F4883049F505C08A3071F18B3099
+:1010000021F520C060916B0681E225C0C8010E94D5
+:10101000940623C068E083E20E94430961E081E214
+:101020000E94430960E081E20E9443090BC0C801AD
+:101030000E94360612C0C8010E9419060EC0C801DF
+:101040000E94F80865E083E206C080E20E940B0976
+:101050008058682F80E20E944309F801808188232C
+:10106000D1F465E083E215C02091660630916706F1
+:1010700080916206909163068217930764F4109240
+:1010800067061092660668E083E20E94430961E009
+:1010900087E20E94430928960FB6F894DEBF0FBE80
+:1010A000CDBFCF91DF911F910F91FF90EF900895E9
+:1010B000EF92FF920F931F93DF93CF93CDB7DEB7DD
+:1010C000C054D0400FB6F894DEBF0FBECDBF8CE049
+:1010D0000E940B0980FF03C00E94A2077BC081FF12
+:1010E0002AC08EE20E940B098DE20E940B098983BF
+:1010F0008E010F5F1F4F70E4E72EF12CEC0EFD1EEA
+:101100000F5F1F4F0E943009F80180830E151F05E5
+:10111000B9F780913C03813039F4E0913F03F091BD
+:101120004003CE010196099568E08FE20E944309D1
+:1011300061E08FE22BC082FF2CC086E30E940B0986
+:1011400085E30E940B0989838E010F5F1F4F60E4C6
+:10115000E62EF12CEC0EFD1E0F5F1F4F0E94300992
+:10116000F80180830E151F05B9F780913D0381308A
+:1011700039F4E0914103F0914203CE0101960995C3
+:1011800068E087E30E94430961E087E30E94430926
+:1011900021C083FF1FC08EE30E940B098E010F5FE9
+:1011A0001F4F51E4E52EF12CEC0EFD1E8DE30E9445
+:1011B0000B09F80181938F01EE15FF05B9F78091B6
+:1011C0003E03813039F4E0913F03F0914003CE01BA
+:1011D00001960995C05CDF4F0FB6F894DEBF0FBED5
+:1011E000CDBFCF91DF911F910F91FF90EF900895A8
+:1011F0000895089581E08ABF80E189BFE4E6F0E0C8
+:10120000808187608083E5E6F0E080818360808371
+:10121000A79AAF9A08959FEF9ABB8BBB85B380586E
+:1012200085BBE5E6F0E0808195E08927808385B382
+:10123000805885BB80818927808300001ABA85B3D6
+:10124000805885BB808122E08227808300000000D7
+:1012500089B395B3905895BB908192279083089558
+:1012600085B3805885BBE5E6F0E0808122E08227E7
+:1012700080830000000089B395B3905895BB90819E
+:101280009227908308958BBB8FEF8ABB85B38058DC
+:1012900085BBE5E6F0E0808195E08927808385B312
+:1012A000805885BB8081892780836BBB85B380583C
+:1012B00085BB808191E08927808385B3805885BB79
+:1012C00080818927808308958BBB85B3805885BB37
+:1012D000E5E6F0E0808191E08927808385B380583E
+:1012E00085BB8081892780830895089582E180935A
+:1012F0003E0681E080933F0680E191E090934106B5
+:1013000080934006109242061092430610924406C3
+:1013100088E0809345061092470610924606109288
+:1013200049061092480610924B0610924A061092F7
+:101330004C0610924D0610924E0610924F061092D7
+:101340003C0310923D0310923E0310922B06109224
+:101350002C0610922D06109235061092340610922B
+:10136000A8031092A703089590934706809346061A
+:10137000709349066093480650934B0640934A0683
+:1013800008959093470680934606089590934906E2
+:1013900080934806089590934B0680934A060895DB
+:1013A00080934206089580934306089580934406EF
+:1013B00008950F931F93CF93DF938C01CB01C091BE
+:1013C0003406D091350662E070E00E94A21C10C085
+:1013D000988129818A81823041F4E92FF22F858119
+:1013E00090E08017910709F460870F80D885C02DA1
+:1013F000209771F7DF91CF911F910F910895CF93AF
+:10140000DF939C01E0913406F091350614C0A08171
+:10141000B1818281843061F4848190E082179307E6
+:1014200039F4868190E08617970711F4ED014B831C
+:101430000780F085E02D309751F7DF91CF91089527
+:101440008F929F92BF92CF92DF92EF92FF920F9373
+:101450001F93CF93DF934C01F62ED42EC22EB02EC5
+:10146000E0913406F0913506309799F489E090E0E8
+:101470000E94A31BFC019093350680933406918251
+:101480008082F38210861782D282C4820583E6822C
+:1014900018C0CF010780F085E02D3097D1F78C017F
+:1014A00089E090E00E94A31BFC01E80198878F83EC
+:1014B00091828082F382D282C482B582E6821086D3
+:1014C0001782DF91CF911F910F91FF90EF90DF90E6
+:1014D000CF90BF909F908F900895EF92FF921F93AF
+:1014E000CF93DF937C01C091A703D091A8032097ED
+:1014F00011F011E012C085E090E00E94A31BFC01F6
+:101500009093A8038093A703F182E0821282148251
+:10151000138210E012C01F5FEC018B819C81009749
+:10152000D1F785E090E00E94A31BFC019C838B8394
+:10153000F182E082128314821382812FDF91CF9196
+:101540001F91FF90EF900895EF92FF920F931F93DA
+:10155000CF93DF93E091A703F091A80380E090E0A0
+:101560000380F481E02D01963097D1F7880F991F01
+:101570000E94A31B8093A9039093AA03C091A70381
+:10158000D091A80301C0EC01E880F9808A8190E045
+:10159000880F991F0091A9031091AA03080F191F22
+:1015A000F701808190E00E94A31BF8018083918362
+:1015B00020E030E016C08A8190E0880F991FE0910A
+:1015C000A903F091AA03E80FF91F0190F081E02D23
+:1015D000E20FF31FD701A20FB31F8C9180832F5FFF
+:1015E0003F4FF701808190E02817390724F38B8162
+:1015F0009C81009741F6DF91CF911F910F91FF9051
+:10160000EF9008956F927F928F929F92AF92BF92C8
+:10161000CF92DF92EF92FF920F931F93CF93DF93BE
+:10162000E0913406F0913506CC24DD2409C0828196
+:10163000823019F40894C11CD11C0780F085E02D7C
+:101640003097A9F7C601880F991F0E94A31B8093AA
+:101650005006909351060894C108D1085601AA0C6F
+:10166000BB1C0894C11CD11CB1E06B2E712C8824CA
+:10167000992451C0E0913406F0913506A9E0EA2E94
+:10168000F12C15C0A081B181848190E08615970569
+:1016900019F48381E80EF11CED018D81861521F48A
+:1016A0008281823009F44D010780F085E02D30976A
+:1016B00049F700915006109151060A0D1B1DC701F4
+:1016C0000E94A31BF8018083918320E030E0E09129
+:1016D0005006F0915106EA0DFB1D0190F081E02DBE
+:1016E000E20FF31FD401A20FB31F8C9180832F5FF1
+:1016F0003F4F2930310559F7E0915006F0915106DE
+:10170000EA0DFB1D0190F081E02D8E2D875F828315
+:101710000894611C711CC614D7040CF0ABCFE1E037
+:10172000EE2EF12C79E0A72EB12C662477248824A4
+:10173000992499C0A0913406B091350612C0ED915C
+:10174000FC9111978181823049F4858190E08E155A
+:101750009F0521F48481682E772405C0ED01AF81B7
+:10176000B885109761F701E010E072C0409134062F
+:101770005091350667C0DA01ED91FC91818184308A
+:1017800009F05DC0EA018E8190E08017910709F0B1
+:1017900056C08C8190E08E159F0509F050C0DF0186
+:1017A0009501BF01675F7F4FE0915006F0915106B0
+:1017B000E80DF91D0190F081E02DE20FF31F8D91EE
+:1017C00080832F5F3F4FA617B70771F7E9E0F0E07E
+:1017D000AE0EBF1EA0913406B09135062EC0ED01AD
+:1017E0008A81853039F58C8190E08E159F0511F541
+:1017F0008D8190E080179107E9F4CD91DC911197EC
+:101800009501BE01695F7F4FE0915006F09151064E
+:10181000E80DF91D0190F081E02DE20FF31F899191
+:1018200080832F5F3F4FC617D70771F7E7E0F0E0DF
+:10183000AE0EBF1EED01AF81B885109781F6FA019B
+:10184000478150854115510509F095CF0F5F1F4F16
+:10185000601671060CF08ACF0894E11CF11C82E03E
+:1018600090E0880E991ECE14DF040CF063CFDF9158
+:10187000CF911F910F91FF90EF90DF90CF90BF908D
+:10188000AF909F908F907F906F9008958F929F92CE
+:10189000AF92BF92CF92EF92FF920F931F93CF938D
+:1018A000DF935C014B01122FE0913406F091350675
+:1018B00016C0A081B181848190E0A816B90661F4B8
+:1018C000868190E08815990539F48281843021F46D
+:1018D000ED018C818F5F8C830780F085E02D309740
+:1018E00041F787E090E00E94A31BFC0187E0808322
+:1018F00085E0818312830383F582E482C682EE242D
+:10190000082D2A2D45E067E0CF010E94200ADF91D3
+:10191000CF911F910F91FF90EF90CF90BF90AF901C
+:101920009F908F900895AF92BF92CF92DF92EF92E7
+:10193000FF920F93FC01A114B10401F14230510553
+:1019400071F04330510599F041305105B9F481E00F
+:1019500080932B06B0922F06A0922E060FC081E036
+:1019600080932C06B0923106A092300607C081E029
+:1019700080932D06B0923306A092320620583F4F36
+:10198000CF010E94460C0F91FF90EF90DF90CF9017
+:10199000BF90AF900895AF92BF92CF92DF92EF9237
+:1019A000FF920F93FC014230510571F04330510515
+:1019B00099F041305105B9F481E080933C03B09235
+:1019C0004003A0923F030FC081E080933D03B0929B
+:1019D0004203A092410307C081E080933E03B0928E
+:1019E0004403A0924303CF010E94460C0F91FF9045
+:1019F000EF90DF90CF90BF90AF900895EF920F934C
+:101A00001F93CF93DF93182F062FA0913406B09128
+:101A10003506C0E0D0E014C02D913C911197F9013A
+:101A20008581811751F4FD018281823031F4F90101
+:101A300084818F5F8483C82FD0E0FD01A781B085AA
+:101A4000109751F789E090E00E94A31BFC0189E008
+:101A5000808384E08183028313821482158216823C
+:101A600017821086EC2E00E0212F44E069E0CF01C0
+:101A70000E94200ACE01DF91CF911F910F91EF902C
+:101A80000895DF92EF92FF920F931F93CF93DF930E
+:101A9000182FE62EF42ED22EA0913406B0913506E2
+:101AA000C0E0D0E014C02D913C911197F9018581DF
+:101AB000811751F4FD018281823031F4F901848172
+:101AC0008F5F8483C82FD0E0FD01A781B085109778
+:101AD00051F789E090E00E94A31BFC0189E080831C
+:101AE00084E08183E28213821482F582D6820783A6
+:101AF0001086EC2E00E0212F44E069E0CF010E9427
+:101B0000200ACE01DF91CF911F910F91FF90EF90AE
+:101B1000DF900895EF920F931F9310914F061F5F70
+:101B200010934F0689E090E00E94A31BFC0189E01E
+:101B3000808389E090E09383828382E081831482B2
+:101B40001583168280EA87838AE18087EE2400E08D
+:101B500020E042E069E0CF010E94200A812F90E05E
+:101B60001F910F91EF9008950F931F93CF93DF93E1
+:101B70008C01FC0101900020E9F7E81BF90BCF0173
+:101B8000880F991F0E94A31BEC01F801019000200F
+:101B9000E9F7E01BF10BEE0FFF1FE88323E0298339
+:101BA000AC0120E030E009C0F801E20FF31F8081B2
+:101BB000FA01808311822F5F3F4FF80101900020CE
+:101BC000E9F73197E01BF10B4E5F5F4F2E173F0790
+:101BD00058F3CE010E946D0A90E0DF91CF911F91E2
+:101BE0000F910895EF92FF920F931F93CF93DF937E
+:101BF0008C017B01CA010E94B40D282FE0913406AC
+:101C0000F091350614C0A081B1818281843061F4E5
+:101C1000848190E08017910739F4868190E08E15D9
+:101C20009F0511F4ED0128870780F085E02D30979E
+:101C300051F7DF91CF911F910F91FF90EF90089591
+:101C4000CF93DF93EC01CB010E94B40D382FA0910C
+:101C50003406B091350611C09C91FD01218182812D
+:101C6000823041F4E92FF22F858190E08C179D0797
+:101C700009F43683FD01A781B085109769F7DF91DC
+:101C8000CF9108950E94B40D1816190614F480938C
+:101C90004E0608950E94B40D1816190614F4809388
+:101CA0004D0608950E94B40D1816190614F4809379
+:101CB0004C0608951F9386E00E940B0986FF03C01F
+:101CC0000E9458080EC082FF03C00E94620709C02C
+:101CD00081FF03C00E94320704C084FF02C00E943B
+:101CE000800787E00E940B09182F60E087E00E94C0
+:101CF0004309612F87E00E9443091F91089562E024
+:101D000081E00E94430908950E94020B0E94A40AE8
+:101D10000E94F20561E080E00E94430980E00E9499
+:101D20000B0980FDFBCF62E081E00E94430960E87F
+:101D300084E00E94430960E480E20E94430968E075
+:101D400083E20E94430969E087E20E9443096FE051
+:101D50008DE00E9443096FE08BE00E94430968ED2B
+:101D600089E00E94430963E38FE00E94430966ED26
+:101D700087E00E94430962E085E00E9443096CEC21
+:101D800080E00E94430908958EEC8093450381E032
+:101D900087BF8091450382BF83E083BF0895089584
+:101DA000089583E08093EB0481E08093EC048BE062
+:101DB0008093ED049FE69093EE0483E68093EF0416
+:101DC00084E78093F0049093F10480E78093F20419
+:101DD00085E78093F30483E78093F4048FE5809391
+:101DE000F50480E38093F60481E38093F704109276
+:101DF000F8048EE090E00E94BD010895FC0180810E
+:101E0000833011F40E94D10E08951F9311E0812FA9
+:101E10000E94FE0F60E0812F0E94C4101F5F1431EA
+:101E2000B1F718E1812F0E94FE0F60E0812F0E9420
+:101E3000C4101F5F1B32B1F71F910895FC0110827F
+:101E400075836483738362834183478346830895E4
+:101E5000FC0190818181981710F080E00895A481A1
+:101E6000B5816D938781815019F48181A81BB109D7
+:101E70008783B583A4839FB7F89480818F5F808325
+:101E80009FBF81E00895FC0180818823E9F3A2814E
+:101E9000B3812D918681815019F48181A81BB109EC
+:101EA000B383A28386839FB7F89480818150808317
+:101EB0009FBF822F0895FC018081882319F42FEFA2
+:101EC0003FEF13C0A281B3812D918681815019F417
+:101ED0008181A81BB109B383A28386839FB7F8943D
+:101EE0008081815080839FBF30E0C901089581E0E7
+:101EF000089581E0089581E0089581E00895982F84
+:101F00008150833120F08751833108F075C0E92F6B
+:101F1000F0E0EB5BFC4F82E08183892F90E0FC01D5
+:101F20003197EC32F10508F067C0EA5BFF4FEE0F26
+:101F3000FF1F0590F491E02D0994159A5BC0169A45
+:101F400059C0179A57C0B89A55C0B99A53C0BA9A8F
+:101F500051C0BB9A4FC0BC9A4DC0BD9A4BC0BE9AEF
+:101F600049C0BF9A47C0889A45C0899A43C08A9A97
+:101F700041C08B9A3FC08C9A3DC08D9A3BC08E9ACF
+:101F800039C08F9A37C0A09A35C0A19A33C0A29A9F
+:101F900031C0A39A2FC0A49A2DC0A59A2BC0A69A8F
+:101FA00029C080916100806803C0809161008064D5
+:101FB000809361001FC0809161008062F9CF8091A1
+:101FC00061008061F5CF809161008860F1CF8091E0
+:101FD00061008460EDCF809161008260E9CF8091E3
+:101FE00061008160E5CF109A05C0119A03C0129A72
+:101FF00001C0139A81E0089584E00895982F8150DC
+:10200000833128F08751833110F084E00895892FBF
+:102010000E947F0F81E00895982F8150833120F036
+:102020008751833108F075C0E92FF0E0EB5BFC4F7E
+:1020300081E08183892F90E0FC013197EC32F1053A
+:1020400008F067C0EE58FF4FEE0FFF1F0590F491A8
+:10205000E02D099415985BC0169859C0179857C081
+:10206000B89855C0B99853C0BA9851C0BB984FC0E2
+:10207000BC984DC0BD984BC0BE9849C0BF9847C0E2
+:10208000889845C0899843C08A9841C08B983FC0C2
+:102090008C983DC08D983BC08E9839C08F9837C0C2
+:1020A000A09835C0A19833C0A29831C0A3982FC082
+:1020B000A4982DC0A5982BC0A69829C08091610036
+:1020C0008F7703C0809161008F7B809361001FC078
+:1020D000809161008F7DF9CF809161008F7EF5CF77
+:1020E00080916100877FF1CF809161008B7FEDCF80
+:1020F000809161008D7FE9CF809161008E7FE5CF77
+:10210000109805C0119803C0129801C0139881E07F
+:10211000089584E00895FB011082833089F08430B3
+:1021200028F4813049F0823029F408C0843051F01D
+:10213000853051F085E0089586B307C083B305C0AC
+:1021400080B303C081B101C080B1808381E0089574
+:10215000833089F0843028F4813049F0823029F4CA
+:1021600008C0843051F0853059F084E0089568BB90
+:1021700005C065BB03C062BB01C063B981E00895BF
+:102180006093620081E00895982FE82FF0E0EB5B08
+:10219000FC4F8181823011F086E00895892F90E014
+:1021A000FC013197EC32F10540F4E256FF4FEE0F9F
+:1021B000FF1F0590F491E02D099484E008956623B3
+:1021C00011F01D9AFFC01D98FDC0662311F01E9AE4
+:1021D000F9C01E98F7C0662311F01F9AF3C01F982C
+:1021E000F1C0662311F0C09AEDC0C098EBC0662321
+:1021F00011F0C19AE7C0C198E5C0662311F0C29AF8
+:10220000E1C0C298DFC0662311F0C39ADBC0C39857
+:10221000D9C0662311F0C49AD5C0C498D3C0662330
+:1022200011F0C59ACFC0C598CDC0662311F0C69AEB
+:10223000C9C0C698C7C0662311F0C79AC3C0C79863
+:10224000C1C0662311F0909ABDC09098BBC06623B0
+:1022500011F0919AB7C09198B5C0662311F0929A87
+:10226000B1C09298AFC0662311F0939AABC0939817
+:10227000A9C0662311F0949AA5C09498A3C06623C0
+:1022800011F0959A9FC095989DC0662311F0969A7B
+:1022900099C0969897C0662311F0979A93C0979823
+:1022A00091C0662311F0A89A8DC0A8988BC06623B0
+:1022B00011F0A99A87C0A99885C0662311F0AA9A3F
+:1022C00081C0AA987FC0662311F0AB9A7BC0AB98FF
+:1022D00079C0662311F0AC9A75C0AC9873C06623C0
+:1022E00011F0AD9A6FC0AD986DC0662311F0AE9A33
+:1022F00069C0AE9867C0662321F080916200806853
+:1023000049C0809162008F7745C0662321F080919B
+:10231000620080643FC0809162008F7B3BC0662377
+:1023200021F080916200806235C0809162008F7DD3
+:1023300031C0662321F08091620080612BC08091C2
+:1023400062008F7E27C0662321F080916200886042
+:1023500021C080916200877F1DC0662321F080919B
+:102360006200846017C0809162008B7F13C0662377
+:1023700021F08091620082600DC0809162008D7FAB
+:1023800009C0662321F080916200816003C08091C2
+:1023900062008E7F8093620015C0662311F0189A48
+:1023A00011C018980FC0662311F0199A0BC0199824
+:1023B00009C0662311F01A9A05C01A9803C0662353
+:1023C00019F01B9A81E008951B9881E008951F93EE
+:1023D000182F8150833128F08751833110F084E029
+:1023E0000EC0E12FF0E0EB5BFC4F83E08183812F97
+:1023F0000E947F0F61E0812F0E94C41081E01F9135
+:102400000895CF93DF93982FEB011882E82FF0E027
+:10241000EB5BFC4F8181813011F086E07AC0892F1F
+:1024200090E0FC013197EC32F10540F4E653FF4FA8
+:10243000EE0FFF1F0590F491E02D099484E069C030
+:102440000D9B66C062C00E9B63C05FC00F9B60C0E7
+:102450005CC0B09B5DC059C0B19B5AC056C0B29B16
+:1024600057C053C0B39B54C050C0B49B51C04DC063
+:10247000B59B4EC04AC0B69B4BC047C0B79B48C037
+:1024800044C0809B45C041C0819B42C03EC0829BEE
+:102490003FC03BC0839B3CC038C0849B39C035C023
+:1024A000859B36C032C0869B33C02FC0879B30C00F
+:1024B0002CC0989B2DC029C0999B2AC026C09A9BEE
+:1024C00027C023C09B9B24C020C09C9B21C01DC053
+:1024D000079B1EC01AC0069B1BC017C0059B18C0D7
+:1024E00014C0049B15C011C0039B12C00EC0029BF8
+:1024F0000FC00BC0089B0CC008C0099B09C005C0D9
+:102500000A9B06C002C00B9B03C081E0888301C008
+:1025100081E0DF91CF910895DF93CF930F92CDB7F4
+:10252000DEB79BE19093EB04BE016F5F7F4F0E948B
+:1025300001128093EC0489818093ED041092EE04E3
+:1025400084E090E00E94BD010F90CF91DF9108954B
+:102550009AE19093EB040E94C4108093EC041092D3
+:10256000ED0483E090E00E94BD01089598E190930E
+:10257000EB040E94A8108093EC041092ED0483E019
+:1025800090E00E94BD010895982F89E18093EB04AB
+:10259000933091F0943028F4913051F0923029F436
+:1025A00009C0943059F0953059F085E090E00AC0A8
+:1025B00096B307C093B305C090B303C091B101C0F7
+:1025C00090B181E08093EC049093ED041092EE04BE
+:1025D00084E090E00E94BD01089597E19093EB04A0
+:1025E0000E94E7118093EC041092ED0483E090E0E8
+:1025F0000E94BD01089595E19093EB040E940C1098
+:102600008093EC041092ED0483E090E00E94BD0101
+:10261000089596E19093EB040E947F0F8093EC0461
+:102620001092ED0483E090E00E94BD01089584E1E2
+:102630008093EB0481E08093EC041092ED0483E03E
+:1026400090E00E94BD01089582E18093EB0481E057
+:102650008093EC041092ED0483E090E00E94BD01B1
+:10266000089583E18093EB0481E08093EC04109261
+:10267000ED0483E090E00E94BD01089580E1809325
+:10268000EB0481E08093EC041092ED0483E090E091
+:102690000E94BD01089591E19093EB040E94FE0F0A
+:1026A0008093EC041092ED0483E090E00E94BD0161
+:1026B0000895FC0180818531C9F1863180F4823131
+:1026C00031F1833130F48031D1F0813109F04CC0E7
+:1026D0001AC0833109F1843109F046C022C0883123
+:1026E00089F1893128F4863129F18731E9F526C04D
+:1026F0008A3189F18A3158F18B31B1F531C082814B
+:102700000E943E13089582810E944B1308956381B5
+:1027100082810E9424130895638182810E94311373
+:102720000895638182810E941713089582810E9417
+:10273000FB12089582810E940913089582810E94EC
+:10274000ED120895638182810E94B61208958281FC
+:102750000E94C4120895638182810E94A812089584
+:1027600082810E948C1208958093EB0483E0809311
+:10277000EC041092ED0483E090E00E94BD01089506
+:10278000E82F8152883018F024E030E007C0F0E0F4
+:10279000EB5BFC4F84E0818321E030E0C9010895C8
+:1027A000E82FF0E0EB5BFC4F8181843019F024E0EE
+:1027B00030E003C0118221E030E0C901089517B86C
+:1027C000823039F0833039F0813041F022E030E05E
+:1027D00007C03E9A03C087B1806C87B921E030E022
+:1027E000C901089593E896B997B1907F982B97B94E
+:1027F000369A3699FECF84B195B140E050E020E0A2
+:1028000030E0369A3699FECF84B195B1280F391F42
+:102810004F5F5F4F44305105A1F7379836952795A4
+:1028200036952795C9010895CF93DF93EB0119825F
+:102830001882282F30E0F901EB5BFC4F8181843056
+:1028400019F026E030E00AC088E290E0821B930B8A
+:102850000E94F2139983888321E030E0C901DF915F
+:10286000CF910895982F83E28093EB0417B89230AC
+:1028700039F0933039F0913041F082E090E007C0B8
+:102880003E9A03C087B1806C87B981E090E0809365
+:10289000EC041092ED0483E090E00E94BD010895E5
+:1028A000DF93CF9300D0CDB7DEB792E29093EB04E5
+:1028B000BE016F5F7F4F0E9414148093EC049981D6
+:1028C0008A818093ED049093EE041092EF0485E0EA
+:1028D00090E00E94BD010F900F90CF91DF9108957D
+:1028E00091E29093EB04E82FF0E0EB5BFC4F8181E9
+:1028F000843019F084E090E003C0118281E090E020
+:102900008093EC041092ED0483E090E00E94BD01FE
+:102910000895E82F80E28093EB048E2F8152883057
+:1029200018F084E090E007C0F0E0EB5BFC4F84E03F
+:10293000818381E090E08093EC041092ED0483E0C9
+:1029400090E00E94BD010895FC018081813271F008
+:10295000823218F48032B1F405C0823259F08332E9
+:1029600089F40CC082810E948914089582810E949A
+:102970007014089582810E945014089582810E94EB
+:10298000321408958093EB0483E08093EC0410925A
+:10299000ED0483E090E00E94BD01089584E08093FF
+:1029A0007400109271008BE0809352038CE080934E
+:1029B000530381E090E00895E4E7F0E080818B7FAD
+:1029C0008083109252031092530381E090E00895A7
+:1029D00080937000E1E7F0E080818C7F808381E06C
+:1029E00090E0089580917100887F0895982F84EA7F
+:1029F000809374008091740087FFFCCF80917100F8
+:102A0000887F883011F0803181F49093730084E8DE
+:102A1000809374008091740087FFFCCF80917100D7
+:102A2000887F883129F0803419F022E030E002C03C
+:102A300021E030E0C901089584E980937400809119
+:102A4000740084FDFCCF81E090E00895AC0120E0AB
+:102A500030E094E812C0FA01E20FF31F8081809306
+:102A600073009093740080917100887F883219F010
+:102A700022E030E007C02F5F3F4F261737075CF397
+:102A800021E030E0C901089584EC809374008091C6
+:102A9000740087FFFCCF80917300089585E38093D5
+:102AA000EB0481E08093EC0420E030E094EC0EC075
+:102AB000909374008091740087FFFCCF8091730025
+:102AC000F901E351FB4F80832F5F3F4F26173707F4
+:102AD0007CF3FB01E351FB4F1082CB0103960E9474
+:102AE000BD010895AC0120E030E094E812C0FB0184
+:102AF000E20FF31F808180937300909374008091A4
+:102B00007100887F883219F082E090E007C02F5F63
+:102B10003F4F241735075CF381E090E08093EC048D
+:102B20001092ED0483E090E00E94BD01089584E9D5
+:102B3000809374008091740084FDFCCF81E08093C9
+:102B4000EC041092ED0483E090E00E94BD01089532
+:102B50000E94F6148093EC041092ED0483E090E060
+:102B60000E94BD01089580937000E1E7F0E080814C
+:102B70008C7F808381E08093EC041092ED0483E0ED
+:102B800090E00E94BD010895E4E7F0E080818B7F32
+:102B90008083109252031092530381E08093EC04DF
+:102BA0001092ED0483E090E00E94BD01089584E05E
+:102BB00080937400109271008BE0809352038CE03C
+:102BC0008093530381E08093EC041092ED0483E042
+:102BD00090E00E94BD010895FC0180818093EB0488
+:102BE00080818433D1F0853338F4813379F08233B6
+:102BF00081F0803341F507C08633F1F08633A8F0C9
+:102C0000873309F51DC00E94D71508950E94C41589
+:102C1000089582810E94B3150895BF016D5F7F4FB3
+:102C2000828190E00E9472150895638170E0828134
+:102C300090E00E944E15089582810E94A815089583
+:102C40000E949715089583E08093EC041092ED04A0
+:102C500083E090E00E94BD010895782F613041F03B
+:102C6000613040F0623041F0633009F059C007C074
+:102C700060E006C060E001C061E050E002C061E0D9
+:102C800051E04330B9F0443028F4413059F042303B
+:102C900078F40AC0453099F0453070F0463009F0BC
+:102CA0003FC010C021E00CC021E041E030E00DC089
+:102CB00021E009C020E0F9CF20E041E005C020E09C
+:102CC00040E0F4CF20E040E031E0BB9887B386607D
+:102CD00087BB88B3817F88BB80E090E0772311F0C9
+:102CE00081E090E075E0880F991F7A95E1F78065A3
+:102CF000660F660F660F682B550F550F562B542B1A
+:102D0000220F252B2DB93EB988E080934B038AE032
+:102D100080934C0389E080934D0321E030E002C0B2
+:102D200022E030E0C90108951DB81EB810924B038F
+:102D300010924C0310924D0381E090E00895AC0195
+:102D400020E007C0E60FF71F80818FB9779BFECF89
+:102D50002F5FE22FF0E0E417F507A4F381E090E0A5
+:102D60000895DC0120E030E040E050E013C01FB8DF
+:102D700008C083E0493E580714F088E008954F5F8B
+:102D80005F4F779BF6CF8FB1FB01E20FF31F80837C
+:102D90002F5F3F4F2A173B0754F381E00895CF93ED
+:102DA000DF93EC0120E030E0A0E0B0E017C0FE01CE
+:102DB000E20FF31F80818FB908C0119683E0A93E0E
+:102DC000B8071CF028E030E00EC0779BF6CF8FB13B
+:102DD000FB01E20FF31F80832F5F3F4F241735075E
+:102DE00034F321E030E0C901DF91CF910895DC0197
+:102DF00083E48093EB0440E050E020E030E018C032
+:102E0000FD01E20FF31F80818FB909C04F5F5F4F53
+:102E100083E0493E58071CF028E030E00EC0779B65
+:102E2000F5CF8FB1F901E551FB4F82832F5F3F4F03
+:102E3000261737072CF321E030E02093EC04FB0148
+:102E4000E351FB4F1082CB0103960E94BD01089510
+:102E5000BC0184E48093EB0440E050E020E030E0EB
+:102E600013C01FB808C083E0493E580714F088E03B
+:102E70000FC04F5F5F4F779BF6CF8FB1F901E551E0
+:102E8000FB4F82832F5F3F4F2617370754F381E0B4
+:102E90008093EC04FB01E351FB4F1082CB010396BE
+:102EA0000E94BD01089593E49093EB04282F30E035
+:102EB00090E007C0E60FF71F80818FB9779BFECFA8
+:102EC0009F5FE92FF0E0E217F307A4F381E080931E
+:102ED000EC041092ED0483E090E00E94BD0108959F
+:102EE00081E48093EB041DB81EB810924B0310923E
+:102EF0004C0310924D0381E08093EC041092ED049A
+:102F000083E090E00E94BD01089590E49093EB046B
+:102F10000E942D168093EC041092ED0483E090E063
+:102F20000E94BD010895CF93DF93EC018881833423
+:102F3000A9F0843428F4803441F0813409F50BC0C1
+:102F4000843499F08534E1F414C04C816B818A811A
+:102F50000E94851720C00E9470171DC0BE016D5FC2
+:102F60007F4F8A810E94531716C08A8190E00E9489
+:102F700028176A8170E0CE0103960E94F7160BC0F5
+:102F80008093EB0483E08093EC041092ED0483E0E3
+:102F900090E00E94BD01DF91CF910895B89AB99A4F
+:102FA000BA9ABB98BC9ABD9AC498C59881E08093A0
+:102FB000560382E08093570380935803809359030C
+:102FC00081E090E0089510925603109257031092FA
+:102FD00058031092590381E090E00895C098C19879
+:102FE000C29880E29EE40197F1F7C09A8AE0982F98
+:102FF0009A95F1F7C29AC19A8A95F1F70895282F08
+:10300000C19887FD02C0C29801C0C29A8AE0982F79
+:103010009A95F1F7C19A8A95F1F7C19826FF02C0F7
+:10302000C29A01C0C2988AE0982F9A95F1F7C19A86
+:103030008A95F1F70895880F20E03AE0C19887FF5C
+:1030400002C0C29A01C0C298932F9A95F1F7C19A13
+:10305000932F9A95F1F72F5F273011F0880FEECF5D
+:10306000089520E03AE0C19887FF02C0C29A01C0EB
+:10307000C298932F9A95F1F7C19A932F9A95F1F7E9
+:103080002F5F283011F0880FEECF0895C198C298B5
+:103090008AE0982F9A95F1F7C19A982F9A95F1F7AF
+:1030A000C198C098982F9A95F1F7C19A982F9A9540
+:1030B000F1F7C1988A95F1F7C09A80E00895C19818
+:1030C000C098C298C39A08950E94EE1780E30E94A8
+:1030D000FF1780E60E941B1808950E94EE1780E0FB
+:1030E0000E94FF1780E00E941B18C198C098C298E8
+:1030F000C39A08950F931F93182F062F0E94EE175F
+:1031000080E40E94FF17812F0E941B18802F0E94CD
+:10311000311881E01F910F9108951F93182F0E947D
+:10312000EE1780EC0E94FF17812F0E941B180E944F
+:1031300046181F910895C1988AE08A95F1F7C298C0
+:1031400020E080E04AE0880FC19A942F9A95F1F729
+:10315000C198B3998F5F3AE0942F9A95F1F72F5F5A
+:10316000283089F7C098C19A932F9A95F1F7C09AA1
+:10317000C198932F9A95F1F708951F93182F0E94E5
+:10318000EE1780E80E94FF17812F0E941B180E94F3
+:103190009B181F910895DF92EF92FF920F931F9358
+:1031A000CF93DF93D82E7B018A01C0E0D0E009C025
+:1031B0008D2D8C0F0E94BD18F801EC0FFD1F808330
+:1031C0002196CE15DF05A0F381E090E0DF91CF914D
+:1031D0001F910F91FF90EF90DF9008950F931F9331
+:1031E000082F162F0E946418612F802F0E947A18D2
+:1031F00081E01F910F910895DF92EF92FF920F935C
+:103200001F93CF93DF93D82E7B018A01C0E0D0E0DB
+:1032100009C0F801EC0FFD1F60818D2D8C0F0E94FD
+:10322000EE182196CE15DF05A0F381E090E0DF9146
+:10323000CF911F910F91FF90EF90DF90089594E050
+:103240009093EB040E94FC188093EC041092ED0420
+:1032500083E090E00E94BD010895EF92FF920F93EA
+:103260001F938B019BEEE92E94E0F92E93E090934F
+:10327000EB04A7014E5F5F4F0E94CB188093EC04D4
+:103280000E5F1F4FE00EF11EF7011082C80101967C
+:103290000E94BD011F910F91FF90EF90089582E071
+:1032A0008093EB0410925603109257031092580328
+:1032B0001092590381E08093EC041092ED0483E0B6
+:1032C00090E00E94BD01089581E08093EB040E948C
+:1032D000CE178093EC041092ED0483E090E00E94FE
+:1032E000BD010895FC018381823069F0833018F4B8
+:1032F0008130F1F405C0833049F08430C9F40FC047
+:103300000E94641908950E944F190895AF014A5F01
+:103310005F4F658170E084810E942D190895AF018F
+:103320004A5F5F4F658170E084810E941F19089594
+:1033300080818093EB0483E08093EC041092ED0491
+:1033400083E090E00E94BD0108951F920F920FB696
+:103350000F9211240F900FBE0F901F9018959C0193
+:103360000897029718F024E030E017C0F901EB5BF2
+:10337000FC4F8DE081832830310561F02930310523
+:1033800019F027E030E009C0BD9A81E090E09BBDD4
+:103390008ABD01C0BC9A21E030E0C9010895FC015A
+:1033A000EB5BFC4F118281E090E008959C01FC01F1
+:1033B000EB5BFC4F81818D3019F026E030E029C0B5
+:1033C0002830310521F12930310519F027E030E0AE
+:1033D00020C063307105A9F0643071053CF46130A0
+:1033E000710559F06230710591F409C064307105BE
+:1033F00051F06530710559F408C081E007C082E0E2
+:1034000005C083E003C084E001C085E08EBD21E0FB
+:1034100030E0C90108959C01FC01EB5BFC4F818108
+:103420008D3019F026E030E00DC02830310541F034
+:103430002930310519F027E030E004C07BBD6ABDBA
+:1034400021E030E0C90108959C0183E58093EB04FD
+:10345000F901EB5BFC4F81818D3019F086E090E043
+:103460000DC02830310541F02930310519F087E0D1
+:1034700090E004C07BBD6ABD81E090E08093EC04E5
+:103480001092ED0483E090E00E94BD01089522E5D2
+:103490002093EB040E94D6198093EC041092ED0463
+:1034A00083E090E00E94BD01089521E52093EB04A4
+:1034B000FC01EB5BFC4F118281E08093EC041092E5
+:1034C000ED0483E090E00E94BD01089520E5209383
+:1034D000EB040E94AF198093EC041092ED0483E09A
+:1034E00090E00E94BD010895FC018081813579F052
+:1034F000823518F48035F1F405C0823569F08335E2
+:10350000C9F411C0828190E00E94661A08958281F8
+:1035100090E00E94551A0895638170E0828190E0E6
+:103520000E94471A0895638170E0828190E00E94B2
+:10353000241A08958093EB0483E08093EC041092A6
+:10354000ED0483E090E00E94BD010895DF93CF93E6
+:10355000CDB7DEB7CF91DF910895089581E090E077
+:10356000089508958A3310F4805301C087556A3353
+:1035700010F4605301C067556F708295807F862B71
+:1035800008950895DC0180E1A030B80710F082E0D2
+:103590000895E199FECF9D0109C03FBB2EBB2F5F6F
+:1035A0003F4FE09A8DB3E60FF71F8083822F8A1B6F
+:1035B000E82FF0E0E417F50780F381E00895DC01DF
+:1035C00080E1A030B80710F082E00895E199FECFC5
+:1035D0009D010AC03FBB2EBB2F5F3F4FE60FF71F79
+:1035E00080818DBBE29AE19A822F8A1BE82FF0E05E
+:1035F000E417F50778F381E008950F931F938B018B
+:1036000021E82093EB040E94DF1A8093EC041092CF
+:10361000ED041F930F9389EF92E09F938F930E9485
+:10362000A61A83E090E00E94BD010F900F900F90CA
+:103630000F901F910F910895CF93DF93AC01EB0191
+:1036400080E88093EB0480E14030580710F082E07E
+:1036500015C0E199FECF9A0109C03FBB2EBB2F5F79
+:103660003F4FE09A8DB3E351FB4F8083822F841B41
+:10367000E82FF0E0EC17FD0780F381E08093EC0485
+:10368000FE01E351FB4F10828DEE94E09F938F93E8
+:1036900086E093E09F938F930E94A61ACE01039633
+:1036A0000E94BD010F900F900F900F90DF91CF916E
+:1036B0000895EF92FF920F931F93CF93DF93EC0146
+:1036C0009B8180E02A817C01E20EF11C9D8180E0DB
+:1036D0002C818C01020F111DFF92EF921F930F930B
+:1036E00080E193E09F938F930E94A61A88812DB763
+:1036F0003EB72A5F3F4F0FB6F8943EBF0FBE2DBFB7
+:10370000803819F0813869F405C0B801C7010E94FA
+:103710001C1B12C02696A801BE01C7010E94FD1AFB
+:103720000BC08093EB0483E08093EC041092ED04D3
+:1037300083E090E00E94BD01DF91CF911F910F9136
+:10374000FF90EF900895CF93DF93BC0182309105F5
+:1037500010F462E070E0A0917006B0917106ED0186
+:10376000E0E0F0E040E050E021C0888199818617D8
+:10377000970769F48A819B81309719F0938382833C
+:1037800004C09093710680937006FE0133C06817E1
+:10379000790738F44115510519F08417950708F495
+:1037A000AC01FE018A819B819C01E9012097E9F629
+:1037B00041155105A1F1CA01861B970B049708F426
+:1037C000BA01E0E0F0E029C08D919C911197841737
+:1037D0009507F1F46417750779F4ED018A819B81EF
+:1037E000309719F09383828304C09093710680937D
+:1037F0007006FD0132964CC0CA01861B970BFD0175
+:10380000E80FF91F6193719302978D939C9340C0C9
+:10381000FD01828193819C01D9011097A9F68091C5
+:103820006E0690916F06892B41F480913703909139
+:10383000380390936F0680936E0640913903509140
+:103840003A034115510541F44DB75EB780913503F8
+:1038500090913603481B590B20916E0630916F06EC
+:10386000CA01821B930B8617970780F0AB014E5F4E
+:103870005F4F8417950750F0420F531F50936F0608
+:1038800040936E06F9016193719302C0E0E0F0E0AD
+:10389000CF01DF91CF910895CF93DF93009709F483
+:1038A0004EC0EC0122971B821A82A0917006B09143
+:1038B0007106109701F140E050E0AC17BD0700F130
+:1038C000BB83AA83FE0121913191E20FF31FAE1752
+:1038D000BF0771F48D919C911197280F391F2E5FAE
+:1038E0003F4F39832883FD01828193819B838A83A3
+:1038F0004115510569F4D0937106C09370061FC03D
+:10390000FD0182819381AD01009711F0DC01D5CFDB
+:10391000FA01D383C28321913191E20FF31FCE17B5
+:10392000DF0769F488819981280F391F2E5F3F4F87
+:10393000FA01318320838A819B8193838283DF9183
+:10394000CF91089597FB092E07260AD077FD04D062
+:103950000CD006D000201AF4709561957F4F089521
+:10396000F6F7909581959F4F0895AA1BBB1B51E1D7
+:1039700007C0AA1FBB1FA617B70710F0A61BB70BDF
+:10398000881F991F5A95A9F780959095BC01CD0184
+:063990000895F894FFCF3A
+:10399600456D62656464656450726F6A65637473CD
+:1039A600004F63746F70757355534220496E74658A
+:1039B600726661636520436F6E7665727465722008
+:1039C600616E6420492F4F20457874656E73696F68
+:1039D6006E003230303831313038006669727374B7
+:1039E600207061636B6574206F662061206C6F6E5A
+:1039F60067206D65737361676520286C656E6774F3
+:103A0600683A202564290A006F63746F7075732005
+:103A16006C6F6E672072756E6E696E67206D65736A
+:103A2600736167650A006F63746F7075732E6C6FD0
+:103A36006E675F696E646578203C206F63746F7093
+:103A460075732E6C6F6E675F62797465730A006EAC
+:103A56006F74206C617374207061636B65743A20B7
+:103A660064696666203E2036340A006C61737420F1
+:103A76007061636B65740A007061727365722C20E5
+:103A8600636865636B3A2025582C20636F6D6D6102
+:103A96006E643A2025580A0063616C6C696E672073
+:103AA600696F5F7061727365720A0063616C6C693D
+:103AB6006E67206164635F7061727365720A00638A
+:103AC600616C6C696E67206932635F7061727365E1
+:103AD600720A0063616C6C696E67207370695F704F
+:103AE60061727365720A0063616C6C696E6720703F
+:103AF600776D5F7061727365720A0063616E277419
+:103B06002063616C6C2063616E5F706172736572B5
+:103B1600202D206E6F2043414E2D737570706F728D
+:103B2600740A0063616C6C696E6720656570726FFC
+:103B36006D5F7061727365720A00756E6B6E6F777A
+:103B46006E20636D640A00726563656976696E67E7
+:103B560020636F6D6D616E643A20255820286C6570
+:103B66006E6774683A202575290A00676574206EA9
+:103B76006578740A0067657420616E6420657865EF
+:103B8600637574650A000904007772697474656E5A
+:103B96003A2025730A00726561643A2025730A008B
+:103BA600656570726F6D5F7061727365723A206CD5
+:103BB600656E6774683A2025752C20616464723AD4
+:0C3BC6002025750A002000720600000097
+:00000001FF
diff --git a/firmware/octopus_stable_1_1.hex b/firmware/octopus_stable_1_1.hex new file mode 100644 index 0000000..5fa412b --- /dev/null +++ b/firmware/octopus_stable_1_1.hex @@ -0,0 +1,971 @@ +:100000000C94F6000C9415010C9415010C94150138
+:100010000C9415010C94E4030C9415010C94150137
+:100020000C9415010C9415010C9415010C941501F8
+:100030000C94031A0C9415010C9415010C941501E1
+:100040000C94BD030C9415010C9417010C9415012C
+:100050000C9415010C9415010C9415010C941501C8
+:100060000C9415010C9415010C9415010C941501B8
+:100070000C9415010C9415010C9415010C941501A8
+:100080000C9415010C9415010C941501001002102C
+:100090000410061008100A100C100E101010121088
+:1000A0001410161018101A101C101E1020102210F8
+:1000B0002410661066106610661066106610261012
+:1000C00028102A102C102E10301032103410381036
+:1000D0003C10421046104A104E10521058105A1040
+:1000E0005C106010AF10B110B310B510B710B9109C
+:1000F000BB10BD10BF10C110C310C510C710C91070
+:10010000CB10CD10CF10D110D31015111511151122
+:10011000151115111511D510D710D910DB10DD10E0
+:10012000DF10E110E310E710EB10F110F510F910FB
+:10013000FD100111071109110B110F118111871108
+:100140008D11931199119F11A511AB11B111B71117
+:10015000BD11C311C911CF11D511DB11E111E71187
+:10016000ED117E117E117E117E117E117E11F31133
+:10017000F911FF1105120B12111217121D1227127D
+:1001800033123D12471251125B1265126F12751233
+:100190007B128112CA12CD12D012D312D612D912EA
+:1001A000DC12DF12E212E512E812EB12EE12F1128B
+:1001B000F412F712FA12FD120013C712C712C71277
+:1001C000C712C712C7120313061309130C130F1318
+:1001D000181315131213151318131B131E132113C1
+:1001E00027132413241327132A132D1311241FBE9E
+:1001F000CFEFD0E1DEBFCDBF13E0A0E0B1E0E6E598
+:10020000FAE300E00BBF02C007900D92AC33B107D8
+:10021000D9F716E0ACE3B3E001C01D92A237B107F5
+:10022000E1F70E942C010C942A1D0C9400001F92EF
+:100230000F920FB60F9211240F900FBE0F901F90C8
+:100240001895FC0120E030E002C02F5F3F4F819104
+:100250008823D9F7C9010895CCEFD0E1DEBFCDBF27
+:10026000F8940E9453090E94CC0E8FEF87BB88BB85
+:10027000C7980E94B80981E897E10E94030A85E6C1
+:100280009CE00E94080A81E090E00E940D0ADE01D5
+:100290001196E6EFF2E083E001900D928150E1F7D4
+:1002A000CE0101960E94020E80E091E00E949E0E17
+:1002B00081E191E00E94960E82E491E00E948E0E10
+:1002C0000E94D80D4C0164E670E00E941B0A60E0B9
+:1002D00070E0C4010E94440D3C0140E050E0BC01CC
+:1002E000C4010E943C0A2EE0A22E22E0B22ECC24B1
+:1002F000DD2490E4E92EF12C02E021E030E041E041
+:1003000050E0B301C4010E94D90C8DE2A82E83E015
+:10031000B82E21E030E041E050E0B301C4010E947A
+:10032000110D10929A031092990310929C0310924F
+:100330009B030E940E1B8FE784BB8AE285BB0E9451
+:10034000080485E585BB0E94080415BA0E94520F77
+:100350000E9453090E94D10E7894FFCF0F931F93F0
+:10036000CF93DF93EC018134910510F18091A503C7
+:100370009091A603892BE1F4DF93CF938BE491E076
+:100380009F938F930E94071B1092A2031092A103C8
+:10039000D093A403C093A30381E090E09093A603BD
+:1003A0008093A503C0E4D0E00F900F900F900F90C2
+:1003B00068E08BE20E94A10900E010E00EC0E0912D
+:1003C000A103F091A203E00FF11FE551FB4F608103
+:1003D00089E20E94A1090F5F1F4F0C171D0779F7D3
+:1003E0008091990390919A03019749F467E08BE219
+:1003F0000E94A10910929A03109299030AC063E027
+:100400008BE20E94A10981E090E090939A0380938F
+:100410009903DF91CF911F910F910895CF93DF93AF
+:100420008091A5039091A603019709F04CC088E73D
+:1004300091E09F938F930E94071B2091A10330911D
+:10044000A2038091A3039091A4030F900F9028170B
+:100450003907C8F586E991E09F938F930E94071BA7
+:10046000C091A303D091A4038091A1039091A20312
+:10047000C81BD90B8091A1039091A203805C9F4F70
+:100480009093A2038093A1030F900F90C134D105E4
+:100490005CF08FEB91E09F938F930E94071B80E4A9
+:1004A00090E00E94AE010DC08BED91E09F938F9381
+:1004B0000E94071BCE010E94AE011092A60310926B
+:1004C000A5030F900F90DF91CF9108950F931F9385
+:1004D000CF93DF938C011092A2031092A10310928C
+:1004E000A6031092A503C79AFC018081282F2295AC
+:1004F0002F70C22FDD2799279F938F93DF93CF9380
+:1005000088EE91E09F938F930E94071B8DB79EB753
+:1005100006960FB6F8949EBF0FBE8DBFC430D105AE
+:1005200009F451C0C530D10584F4C130D10569F159
+:10053000C230D1051CF4CD2BC1F074C0C230D1053E
+:1005400071F1239709F06EC034C0C630D10509F4AB
+:100550004EC0C630D1050CF440C0C730D10509F4F7
+:1005600050C0289709F05EC053C0F80180818630E2
+:1005700041F48281813009F06AC0C8010E94D0191B
+:1005800066C0C8010E944B0F62C088E092E09F9352
+:100590008F930E94071BC8010E940F1456C08BE165
+:1005A00092E09F938F930E94071BC8010E945315EE
+:1005B0004CC08FE292E09F938F930E94071BC8016B
+:1005C0000E94731642C083E492E09F938F930E942F
+:1005D000071BC8010E94EE1738C087E592E09F9381
+:1005E0008F930E94071BC8010E94D51A2EC08BE171
+:1005F00092E09F938F930E94071BC8010E94E5051C
+:1006000024C08BE692E09F938F930E94071B1DC02E
+:1006100083E992E09F938F930E94071BC8010E9479
+:10062000B91B13C08AEA92E09F938F930E94071B25
+:10063000F80180818093EB0483E08093EC041092B6
+:10064000ED0483E090E00E94AE010F900F90C798F8
+:10065000DF91CF911F910F9108950F931F93CF9327
+:10066000DF93EC018C010F5F1F4F898199279F93C6
+:100670008F9387EB92E09F938F930E94071B80914B
+:100680009B0390919C030F900F900F900F900197F8
+:1006900091F58BED92E09F938F930E94071B20E0D2
+:1006A00030E00F900F90E0919D03F0919E03E20FD8
+:1006B000F31FDE01A20FB31F8C91E555FC4F808321
+:1006C0002F5F3F4F2034310571F780919D0390914A
+:1006D0009E03805C9F4F90939E0380939D03209187
+:1006E0009D0330919E0380919F039091A003281752
+:1006F0003907F0F128C085EE92E09F938F930E9416
+:10070000071B10929E0310929D0320E030E00F9093
+:100710000F90E0919D03F0919E03E20FF31FDE0125
+:10072000A20FB31F8C91E555FC4F80832F5F3F4F85
+:100730002034310571F730939E0320939D03F80117
+:100740002081203448F410929C0310929B038BEA82
+:1007500093E00E9466020CC081E090E090939C03BD
+:1007600080939B03822F99279093A00380939F03EC
+:10077000DF91CF911F910F9108951F920F920FB6A5
+:100780000F9211242F933F934F935F936F937F9317
+:100790008F939F93AF93BF93EF93FF930E941C0F90
+:1007A0008091450382BFFF91EF91BF91AF919F91DF
+:1007B0008F917F916F915F914F913F912F910F900A
+:1007C0000FBE0F901F9018951F920F920FB60F92A9
+:1007D00011242F933F934F935F936F937F938F9346
+:1007E0009F93AF93BF93EF93FF930E94A60EFF9149
+:1007F000EF91BF91AF919F918F917F916F915F9199
+:100800004F913F912F910F900FBE0F901F90189511
+:1008100020E080E49CE90197F1F72F5F2931C9F7C7
+:100820000895882329F0813069F084E090E00895EC
+:100830008EE080936F038093700388E18AB981E032
+:1008400090E008958EE0809354038093550388E1EF
+:1008500080939A0081E090E00895882329F0813008
+:1008600081F084E090E0089510926F03109270037D
+:100870001092900019B81AB81092950081E090E09B
+:1008800008951092540310925503109298001092FC
+:10089000990010929A0010929D0081E090E00895D6
+:1008A0000F93882329F0813039F084E090E00AC06A
+:1008B0002093900069B904C0209398006093990038
+:1008C00081E090E00F910895623011F492E001C050
+:1008D00090E0882329F0813071F084E090E0089561
+:1008E00080919500990F990F990F982B90939500EF
+:1008F00081E090E0089580919D00990F990F990FE4
+:10090000982B90939D0081E090E00895663061F00F
+:10091000673019F0653019F404C021E003C021E00C
+:1009200004C020E090E002C020E091E0882329F09C
+:10093000813079F084E090E0089580919500220F55
+:10094000220F990F922B982B9093950081E090E0C5
+:10095000089580919D00220F220F990F922B982BC2
+:1009600090939D0081E090E00895653439F06F34F4
+:1009700019F421E091E004C020E001C021E090E002
+:10098000882329F0813089F084E090E008958091F7
+:1009900095002295220F207E9295907F922B982B86
+:1009A0009093950081E090E0089580919D002295BC
+:1009B000220F207E9295907F922B982B90939D00F2
+:1009C00081E090E00895882329F0813049F084E0A7
+:1009D00090E008955D9BFECF6CB981E090E00895B2
+:1009E00080919B0085FFFCCF60939C0081E090E0AC
+:1009F0000895FF920F931F93CF93DF93F82EEB018F
+:100A00008A0181E08F1548F484E090E00DC0F80180
+:100A100061918F018F2D0E94E3042197FFEFCF3F5B
+:100A2000DF07A9F781E090E0DF91CF911F910F914F
+:100A3000FF900895882329F0813039F084E090E018
+:100A400008955F9BFECF8CB106C080919B0087FF0D
+:100A5000FCCF80919C0099270895FF920F931F93DC
+:100A6000CF93DF93F82E8B0181E08F1518F484E08B
+:100A700090E00EC0EA0107C08F2D0E941A05F80110
+:100A800081938F0121971C161D06B4F381E090E03D
+:100A9000DF91CF911F910F91FF90089577270E94CA
+:100AA000F9048093EC041092ED0483E090E00E943E
+:100AB000AE0108950E9486048093EC041092ED0428
+:100AC00083E090E00E94AE0108950E948604809326
+:100AD000EC041092ED0483E090E00E94AE010895D2
+:100AE0000E9464048093EC041092ED0483E090E093
+:100AF0000E94AE0108950F930E9450048093EC046D
+:100B00001092ED0483E090E00E94AE010F910895F1
+:100B10000E942D048093EC041092ED0483E090E099
+:100B20000E94AE0108950E9411048093EC0410927B
+:100B3000ED0483E090E00E94AE010895CF92DF9231
+:100B4000EF92FF920F931F93CF93DF93CDB7DEB752
+:100B50008B01CDB6DEB62DB73EB7261B370B0FB6D1
+:100B6000F8943EBF0FBE2DBFEDB6FEB60894E11C53
+:100B7000F11CAB01B7010E942D058093EC0420E02D
+:100B800030E00AC0F701E20FF31F8081F901E35161
+:100B9000FB4F80832F5F3F4F201731079CF3F801F5
+:100BA000E351FB4F1082C80103960E94AE010FB6BD
+:100BB000F894DEBE0FBECDBEDF91CF911F910F9195
+:100BC000FF90EF90DF90CF9008950F93FC0180810C
+:100BD0008093EB04843611F1853648F48236B1F007
+:100BE0008336E0F4803651F0813681F50BC08736CC
+:100BF00039F18836E9F0853649F515C082810E94C1
+:100C000093052DC082810E94880529C00681258117
+:100C10004481638182810E947B0521C0638182813E
+:100C20000E9470051CC0638182810E945A0517C012
+:100C3000AF014C5F5F4F638182810E944E050FC000
+:100C40006381772782810E949E0509C083E080939B
+:100C5000EC041092ED0483E090E00E94AE010F914D
+:100C6000089587E28093530685E28093520690E2CE
+:100C7000909354061092550628E030E030935706C2
+:100C80002093560683E280935F0681E280935E069E
+:100C9000909360061092610630936306209362067B
+:100CA0000895089560916B0681E20E94A10908955C
+:100CB00068E08BE20E94A10961E188E20E94A1093B
+:100CC00068E08FE20E94A10961E18CE20E94A10923
+:100CD00061E08FE20E94A10910929A031092990399
+:100CE00065E083E20E94A10908950F931F938C0190
+:100CF00060E480E20E94A109F8016281605884E00A
+:100D00000E94A109F801828180936A061F910F91C8
+:100D100008950F931F93CF93DF93EC0128853985B6
+:100D200012161306DCF58E819F81821793071CF53E
+:100D300068E083E20E94A10900E010E00FC08A850C
+:100D40009B85E80FF91F608181E20E94A1098E81D5
+:100D50009F8101969F838E830F5F1F4FEE81FF81DE
+:100D600088859985083011051CF4E817F9073CF3CC
+:100D7000E817F90724F061E087E20E94A1098B815E
+:100D8000813031F465E089810E94A1091B8206C08F
+:100D900061E089810E94A10981E08B83DF91CF917D
+:100DA0001F910F910895CF93DF93CDB7DEB72497AE
+:100DB0000FB6F894DEBF0FBECDBFDC01FC0122816F
+:100DC0003381109265061092640681E0809361067B
+:100DD000832F99278230D9F0833069F1813009F06F
+:100DE00057C080913E0699279093670680936606C8
+:100DF0008EE396E0909369068093680686819781DA
+:100E00008034910509F044C088E090E029C0FD01DC
+:100E1000868197819093670680936606E22FFF276D
+:100E2000EE0FFF1F8091500690915106E80FF91FB9
+:100E30008081918129C02223C1F0E22FFF27EE0F8C
+:100E4000FF1F8091A9039091AA03E80FF91F019059
+:100E5000F081E02DF0936906E09368068081992780
+:100E6000909367068093660613C094E0998383E0AD
+:100E70008A8389E08B839C8384E090E0909367066B
+:100E800080936606CE01019690936906809368066A
+:100E90008EE596E00E94890624960FB6F894DEBF90
+:100EA0000FBECDBFDF91CF910895CF93DF9382E244
+:100EB0000E947809C82FDD27C5FF1AC068E083E2C9
+:100EC0000E94A109C6FF10C02091640630916506FA
+:100ED0008091660690916706281739072CF48EE5F5
+:100EE00096E00E94890604C061E087E20E94A109A1
+:100EF000DF91CF9108951F93CF93DF9388E00E94F5
+:100F00007809182FC82FDD27C6FF18C060E085E0DC
+:100F10000E94A10960E884E00E94A10960E080E2EB
+:100F20000E94A10968E083E20E94A10961E087E2D2
+:100F30000E94A10962E085E00E94A109C4FF04C0EB
+:100F400060EC89E00E94A10917FF04C060ED89E010
+:100F50000E94A109DF91CF911F9108958AE00E941C
+:100F60007809992780FF03C00E945507089581FFE3
+:100F70000DC08AE20E94780980912B06813061F4CD
+:100F8000E0912E06F0912F060995089582E30E94C4
+:100F900078098AE30E94780908958EE00E94780912
+:100FA00068E08FE20E94A10961E08FE20E94A1093E
+:100FB00020916606309167068091620690916306E3
+:100FC000821793075CF468E083E20E94A10961E064
+:100FD00087E20E94A10981E0809361060895AF92A3
+:100FE000BF92CF92DF92EF92FF920F931F93CF9316
+:100FF000DF93CDB7DEB728970FB6F894DEBF0FBEEC
+:10100000CDBF86E20E94780986FF7EC08E010F5F09
+:101010001F4F580169E0C62ED12CCC0EDD1E8091E9
+:1010200052060E947809F80181938F017501EC1531
+:10103000FD05A9F768E087E20E94A10968E083E264
+:101040000E94A10980E20E9478098F77682F80E2D0
+:101050000E94A1098981992780769070803291053C
+:1010600009F440C080349105D1F1892BF1F5F501E7
+:1010700081818630D9F0873048F48130F1F18130B8
+:10108000C8F08330D1F1853081F521C0893019F164
+:101090008A3018F4883049F505C08A3071F18B30F8
+:1010A00021F520C0C5010E94520627C0C5010E943B
+:1010B000D30623C068E083E20E94A10961E081E2D7
+:1010C0000E94A10960E081E20E94A1090BC0C50154
+:1010D0000E94750612C0C5010E9458060EC0C501C7
+:1010E0000E94510965E083E206C080E20E9478090F
+:1010F0008058682F80E20E94A109F701808188232F
+:10110000D1F465E083E215C0209166063091670650
+:1011100080916206909163068217930764F410929F
+:1011200067061092660668E083E20E94A10961E00A
+:1011300087E20E94A10928960FB6F894DEBF0FBE81
+:10114000CDBFDF91CF911F910F91FF90EF90DF9076
+:10115000CF90BF90AF900895CF92DF92EF92FF9221
+:101160000F931F93CF93DF93CDB7DEB7C054D0401A
+:101170000FB6F894DEBF0FBECDBF8CE00E94780999
+:10118000992780FF03C00E94EF077BC081FF2AC020
+:101190008EE20E9478098DE20E94780989838E018F
+:1011A0000F5F1F4F6801FFE3EF2EF12CE00EF11EE1
+:1011B0000F5F1F4F0E946409F80180830E151F0501
+:1011C000B9F780913C03813031F4E0913F03F09115
+:1011D0004003C601099568E08FE20E94A10961E021
+:1011E0008FE22BC082FF2CC086E30E94780985E342
+:1011F0000E94780989838E010F5F1F4F6801EFE31A
+:10120000EE2EF12CE00EF11E0F5F1F4F0E946409BD
+:10121000F80180830E151F05B9F780913D038130D9
+:1012200031F4E0914103F0914203C601099568E071
+:1012300087E30E94A10961E087E30E94A10921C020
+:1012400083FF1FC08EE30E9478098E010F5F1F4F3E
+:10125000680171E4E72EF12CEC0EFD1E8DE30E9477
+:101260007809F80181938F01EE15FF05B9F7809198
+:101270003E03813031F4E0913F03F0914003C60119
+:101280000995C05CDF4F0FB6F894DEBF0FBECDBF2F
+:10129000DF91CF911F910F91FF90EF90DF90CF9052
+:1012A00008950895089581E08ABF80E189BFE4E64A
+:1012B000F0E0808187608083E5E6F0E080818360F4
+:1012C0008083A79AAF9A089585B3805885BBE5E6D9
+:1012D000F0E0808122E0822780830000000089B353
+:1012E00095B3905895BB9081922790839927089544
+:1012F0009FEF9ABB8BBB85B3805885BBE5E6F0E0DA
+:10130000808195E08927808385B3805885BB808163
+:101310008927808300001ABA0E94640999270895DA
+:101320008BBB85B3805885BBE5E6F0E0808191E01A
+:101330008927808385B3805885BB808189278083F6
+:1013400008958BBB8FEF8ABB85B3805885BBE5E6DC
+:10135000F0E0808195E08927808385B3805885BB44
+:10136000808189278083862F0E949009089508959F
+:1013700082E180933E0681E080933F0680E191E028
+:1013800090934106809340061092420610924306C5
+:101390001092440688E0809345061092470610920A
+:1013A0004606109249061092480610924B0610927B
+:1013B0004A0610924C0610924D0610924E0610925C
+:1013C0004F0610923C0310923D0310923E03109280
+:1013D0002B0610922C0610922D06109235061092B4
+:1013E00034061092A8031092A7030895909347061D
+:1013F00080934606709349066093480650934B06C7
+:1014000040934A06089590934706809346060895B0
+:101410009093490680934806089590934B068093D5
+:101420004A060895809342060895809343060895DE
+:10143000809344060895CF93DF939C01CB01E09104
+:101440003406F091350662E070E00E94031D0FC083
+:10145000A081B1818281823039F4ED018D8199279B
+:101460008217930709F468870780F085E02D30978D
+:1014700079F7DF91CF910895CF93DF939C01E091AD
+:101480003406F091350614C0A081B1818281843088
+:1014900061F4848199278217930739F4868199270B
+:1014A0008617970711F4ED014B830780F085E02D37
+:1014B000309751F7DF91CF910895BF92CF92DF928D
+:1014C000EF92FF920F931F93CF93DF936C01162F30
+:1014D000F42EB22EC0913406D09135062097A1F497
+:1014E00089E090E00E94051CFC01909335068093F2
+:1014F0003406D182C082138310861782F282B482AE
+:101500000583E68215C0EC018F8198850097D9F795
+:1015100089E090E00E94051CFC0198878F83D182AE
+:10152000C0821383F282B4820583E682108617821A
+:10153000DF91CF911F910F91FF90EF90DF90CF90AF
+:10154000BF900895EF92FF921F93CF93DF937C019A
+:10155000C091A703D091A803209711F011E012C009
+:1015600085E090E00E94051CFC019093A803809305
+:10157000A703F182E08212821482138210E012C06B
+:101580001F5FEC018B819C810097D1F785E090E093
+:101590000E94051CFC019C838B83F182E0821283F4
+:1015A00014821382812F9927DF91CF911F91FF9091
+:1015B000EF900895EF92FF920F931F93CF93DF93D5
+:1015C000E091A703F091A80380E090E00380F4810C
+:1015D000E02D01963097D1F7880F991F0E94051CC6
+:1015E0009093AA038093A9030091A7031091A803E5
+:1015F000E801E880F9808A81C82FDD27CC0FDD1F44
+:101600008091A9039091AA03C80FD91FF701808187
+:1016100099270E94051C9983888320E030E017C039
+:10162000E801EA81FF27EE0FFF1F8091A903909147
+:10163000AA03E80FF91F0190F081E02DE20FF31FDC
+:10164000D701A20FB31F8C9180832F5F3F4FF7010B
+:1016500080819927281739071CF3E8018B819C8129
+:10166000009711F08C01C4CFDF91CF911F910F91A2
+:10167000FF90EF9008954F925F926F927F928F92BA
+:101680009F92AF92BF92CF92DF92EF92FF920F9311
+:101690001F93CF93DF93E0913406F09135066624D3
+:1016A000772409C08281823019F40894611C711C6E
+:1016B0000780F085E02D3097A9F74301880C991C2D
+:1016C000C4010E94051C9093510680935006E1E0EE
+:1016D000EE2EF12CAA24BB2455C0E0913406F091E3
+:1016E000350679E0C72ED12C15C0A081B181848147
+:1016F00099278E159F0519F48381C80ED11CED0121
+:101700008D818E1521F48281823009F45D0107807C
+:10171000F085E02D309749F7009150061091510661
+:1017200002501040080D191DC6010E94051CF80149
+:101730009183808320E030E0E0915006F0915106E3
+:10174000E80DF91D32970190F081E02DE20FF31FB3
+:10175000D501A20FB31F8C9180832F5F3F4F29309B
+:10176000310551F7E0915006F0915106E80DF91D51
+:1017700032970190F081E02D8C2D875F8283089451
+:10178000E11CF11C6E147F040CF0A7CF61E0C62EA3
+:10179000D12C59E0A52EB12C4424552442E0842EAE
+:1017A000912CA1C0A0913406B091350612C0ED91E4
+:1017B000FC9111978181823049F4858199278C159C
+:1017C0009D0521F48481482E552405C0ED01AF818B
+:1017D000B885109761F731E0E32EF12C79C0609164
+:1017E0003406709135066DC0FB01C081D1818981BD
+:1017F000843009F063C0868199278E159F0509F012
+:101800005DC0848199278C159D0509F057C095010D
+:1018100040E050E0E0915006F0915106E80DF91DCE
+:1018200032970190F081E02DE20FF31FDE01A40F4B
+:10183000B51F8C9180832F5F3F4F4F5F5F4F4930C3
+:10184000510541F789E090E0A80EB91EC091340619
+:10185000D091350631C08A81853059F58C81992720
+:101860008C159D0531F58D8199278E159F0509F5FC
+:1018700008811981950140E050E0E0915006F09117
+:101880005106E80DF91D32970190F081E02DE20F2D
+:10189000F31FD801A40FB51F8C9180832F5F3F4F9A
+:1018A0004F5F5F4F4730510541F7E7E0F0E0AE0E84
+:1018B000BF1E0F80D885C02D209769F6EB016F8180
+:1018C00078856115710509F08FCF0894E11CF11C32
+:1018D0004E145F040CF083CF0894C11CD11CE2E0CD
+:1018E000F0E08E0E9F1E6C147D040CF05BCFDF9138
+:1018F000CF911F910F91FF90EF90DF90CF90BF900D
+:10190000AF909F908F907F906F905F904F900895D1
+:101910006F927F928F929F92AF92BF92CF92DF92FF
+:10192000EF92FF920F93CF93DF935C013B0149014C
+:10193000E0913406F091350616C0A081B181848112
+:101940009927A816B90661F4868199278615970507
+:1019500039F48281843021F4ED018C818F5F8C8396
+:101960000780F085E02D309741F787E090E00E94F6
+:10197000051CFC0187E0808385E0818382820383EC
+:10198000F582E482C682EE24062D2A2D45E067E02A
+:10199000CF010E945D0ADF91CF910F91FF90EF90F0
+:1019A000DF90CF90BF90AF909F908F907F906F907F
+:1019B0000895AF92BF92CF92DF92EF92FF920F9372
+:1019C000FC01A114B10401F14230510571F0433022
+:1019D000510599F041305105B9F481E080932B060F
+:1019E000B0922F06A0922E060FC081E080932C06A5
+:1019F000B0923106A092300607C081E080932D0698
+:101A0000B0923306A092320620583F4FCF010E9479
+:101A1000880C0F91FF90EF90DF90CF90BF90AF9028
+:101A20000895AF92BF92CF92DF92EF92FF920F9301
+:101A3000FC014230510571F04330510599F04130BD
+:101A40005105B9F481E080933C03B0924003A09229
+:101A50003F030FC081E080933D03B0924203A09208
+:101A6000410307C081E080933E03B0924403A092FB
+:101A70004303CF010E94880C0F91FF90EF90DF90FD
+:101A8000CF90BF90AF900895CF92DF92EF920F93D7
+:101A90001F93CF93DF936C018B01A0913406B0911B
+:101AA0003506C0E0D0E014C02D913C911197F901AA
+:101AB00085818C1551F4FD018281823031F4F90168
+:101AC00084818F5F8483C82FDD27FD01A781B085C6
+:101AD000109751F789E090E00E94051CFC0189E015
+:101AE000808384E0818302831382148215821682AC
+:101AF00017821086EC2E00E02C2D44E069E0CF0127
+:101B00000E945D0ACE01DF91CF911F910F91EF905E
+:101B1000DF90CF900895BF92CF92DF92EF92FF9225
+:101B20000F931F93CF93DF936C017B01142FB22E81
+:101B3000A0913406B0913506C0E0D0E014C02D91DC
+:101B40003C911197F90185818C1551F4FD01828139
+:101B5000823031F4F90184818F5F8483C82FDD27BF
+:101B6000FD01A781B085109751F789E090E00E94B0
+:101B7000051CFC0189E0808384E08183E28213827A
+:101B800014821583B68207831086EC2E00E02C2D7C
+:101B900044E069E0CF010E945D0ACE01DF91CF9160
+:101BA0001F910F91FF90EF90DF90CF90BF9008951D
+:101BB000EF920F931F9310914F061F5F10934F06E4
+:101BC00089E090E00E94051CFC0189E0808389E0A7
+:101BD00090E09383828382E081831482158316824E
+:101BE00080EA87838AE18087EE2400E020E042E0FB
+:101BF00069E0CF010E945D0A812F99271F910F9103
+:101C0000EF900895CF93DF93EC01FC010190002049
+:101C1000E9F7E81BF90BCF01880F991F0E94051CFB
+:101C20009C01FE0101900020E9F7EC1BFD0BEE0F7B
+:101C3000FF1FDC01EC9383E0F901818340E050E079
+:101C400009C0FE01E40FF51F80818C93FD01118214
+:101C50004F5F5F4F1296FE0101900020E9F7319728
+:101C6000EC1BFD0B4E175F0760F3C9010E94A20A2F
+:101C70009927DF91CF910895EF92FF920F931F93D1
+:101C8000CF93DF938C017B01CA010E94020E9C015D
+:101C9000E0913406F091350614C0A081B1818281B3
+:101CA000843061F4848199278017910739F4868103
+:101CB00099278E159F0511F4ED0128870780F0857F
+:101CC000E02D309751F7DF91CF911F910F91FF9049
+:101CD000EF9008950F931F93CF93DF938C01CB0167
+:101CE0000E94020E9C01E0913406F09135060FC06F
+:101CF000A081B1818281823039F4ED018D819927F3
+:101D00008017910709F42E830780F085E02D309726
+:101D100079F7DF91CF911F910F9108950E94020EE4
+:101D20001816190614F480934E0608950E94020EA8
+:101D30001816190614F480934D0608950E94020E99
+:101D40001816190614F480934C0608951F9386E024
+:101D50000E947809992786FF03C00E94AC080EC034
+:101D600082FF03C00E94AE0709C081FF03C00E942A
+:101D70007B0704C084FF02C00E94CD0787E00E9459
+:101D80007809182F60E087E00E94A109612F87E0A1
+:101D90000E94A1091F91089562E081E00E94A109BB
+:101DA00008950E943B0B0E94DA0A0E94310661E00E
+:101DB00080E00E94A10980E00E94780980FDFBCFAD
+:101DC00062E081E00E94A10960E884E00E94A1092C
+:101DD00060E480E20E94A10968E083E20E94A10918
+:101DE00069E087E20E94A1096FE08DE00E94A109ED
+:101DF0006FE08BE00E94A10968ED89E00E94A109D3
+:101E000063E38FE00E94A10966ED87E00E94A109CB
+:101E100062E085E00E94A1096CEC80E00E94A109CB
+:101E200008958EEC8093450381E087BF8091450340
+:101E300082BF83E083BF08950895089583E080936F
+:101E4000EB0481E08093EC048BE08093ED049FE64B
+:101E50009093EE0483E68093EF0484E78093F0048C
+:101E60009093F10480E78093F20485E78093F30474
+:101E700083E78093F4048FE58093F50480E38093F7
+:101E8000F60481E38093F7041092F8048EE090E06A
+:101E90000E94AE010895FC018081833011F40E94FC
+:101EA0001E0F08951F9311E0812F0E94751060E0AE
+:101EB000812F0E9462111F5F1431B1F718E1812F49
+:101EC0000E94751060E0812F0E9462111F5F1B321B
+:101ED000B1F71F910895CF93DF93DC01EC01EA8104
+:101EE000FB8121918E81815019F48981E81BF109D0
+:101EF000ED01FB83EA838E839FB7F8948C91815028
+:101F00008C939FBF822F9927DF91CF910895FC0179
+:101F1000108275836483738362834183478346831E
+:101F20000895CF93DF93DC019C91ED01898198178F
+:101F300018F080E090E016C0ED01EC81FD81619326
+:101F40008F81815019F48981E81BF109ED018F839C
+:101F5000FD83EC839FB7F8948C918F5F8C939FBF28
+:101F600081E090E0DF91CF910895FC01808188238A
+:101F7000E9F3CF010E946B0F99270895FC0180813E
+:101F8000882319F48FEF9FEF0895CF010E946B0F04
+:101F90009927089581E090E0089581E090E0089508
+:101FA00081E090E0089581E090E00895CF93DF9381
+:101FB000CDB7DEB722970FB6F894DEBF0FBECDBF08
+:101FC000982F8150833120F08751833108F07EC0F3
+:101FD000E92FFF27EB5BFC4F82E08183892F992754
+:101FE000AA27BB27FC013197EC32F10508F06EC03F
+:101FF000EA5BFF4FEE0FFF1F0590F491E02D09946F
+:10200000159A5BC0169A5DC0179A57C0B89A59C006
+:10201000B99A53C0BA9A55C0BB9A4FC0BC9A51C026
+:10202000BD9A4BC0BE9A4DC0BF9A47C0889A49C05E
+:10203000899A43C08A9A45C08B9A3FC08C9A41C006
+:102040008D9A3BC08E9A3DC08F9A37C0A09A39C0F6
+:10205000A19A33C0A29A35C0A39A2FC0A49A31C0C6
+:10206000A59A2BC0A69A2DC080916100806807C0F8
+:1020700080916100806419C08091610080628093CA
+:1020800061001BC08091610080610FC08091610080
+:102090008860F5CF80916100846007C08091610005
+:1020A0008260EDCF8091610081608093610009C002
+:1020B000109A03C0119A05C0129A81E090E008C0FE
+:1020C000139AE1E0F0E0FA83E98304C084E090E051
+:1020D0009A83898389819A8122960FB6F894DEBF0C
+:1020E0000FBECDBFDF91CF910895982F81508331DE
+:1020F00030F08751833118F084E090E00895892F03
+:102100000E94D60F81E090E00895CF93DF93CDB782
+:10211000DEB722970FB6F894DEBF0FBECDBF982F63
+:102120008150833120F08751833108F07EC0E92F40
+:10213000FF27EB5BFC4F81E08183892F9927AA273A
+:10214000BB27FC013197EC32F10508F06EC0EE5868
+:10215000FF4FEE0FFF1F0590F491E02D09941598A5
+:102160005BC016985DC0179857C0B89859C0B99809
+:1021700053C0BA9855C0BB984FC0BC9851C0BD98C9
+:102180004BC0BE984DC0BF9847C0889849C0899839
+:1021900043C08A9845C08B983FC08C9841C08D98A9
+:1021A0003BC08E983DC08F9837C0A09839C0A19889
+:1021B00033C0A29835C0A3982FC0A49831C0A59869
+:1021C0002BC0A6982DC0809161008F7707C08091A9
+:1021D00061008F7B19C0809161008F7D80936100C9
+:1021E0001BC0809161008F7E0FC080916100877F4E
+:1021F000F5CF809161008B7F07C0809161008D7F5A
+:10220000EDCF809161008E7F8093610009C01098AE
+:1022100003C0119805C0129881E090E008C013989F
+:10222000E1E0F0E0FA83E98304C084E090E09A837F
+:10223000898389819A8122960FB6F894DEBF0FBEFA
+:10224000CDBFDF91CF910895FB011082833091F0D3
+:10225000843028F4813051F0823029F409C0843070
+:1022600059F0853059F085E090E0089586B307C0B5
+:1022700083B305C080B303C081B101C080B1808346
+:1022800081E090E00895833091F0843028F481302B
+:1022900051F0823029F409C0843059F0853069F05A
+:1022A00084E090E0089568BB05C065BB03C062BBD5
+:1022B00001C063B981E090E008956093620081E01D
+:1022C00090E00895982FE82FFF27EB5BFC4F81816A
+:1022D000823019F086E090E00895892F9927AA2787
+:1022E000BB27FC013197EC32F10540F4E256FF4F79
+:1022F000EE0FFF1F0590F491E02D099484E090E02B
+:102300000895662311F01D9AFFC01D98FDC0662335
+:1023100011F01E9AF9C01E98F7C0662311F01F9A9B
+:10232000F3C01F98F1C0662311F0C09AEDC0C098A9
+:10233000EBC0662311F0C19AE7C0C198E5C06623DF
+:1023400011F0C29AE1C0C298DFC0662311F0C39AAF
+:10235000DBC0C398D9C0662311F0C49AD5C0C49815
+:10236000D3C0662311F0C59ACFC0C598CDC06623EF
+:1023700011F0C69AC9C0C698C7C0662311F0C79AA3
+:10238000C3C0C798C1C0662311F0909ABDC0909891
+:10239000BBC0662311F0919AB7C09198B5C066236F
+:1023A00011F0929AB1C09298AFC0662311F0939A3F
+:1023B000ABC09398A9C0662311F0949AA5C09498D5
+:1023C000A3C0662311F0959A9FC095989DC066237F
+:1023D00011F0969A99C0969897C0662311F0979A33
+:1023E00093C0979891C0662311F0A89A8DC0A898C1
+:1023F0008BC0662311F0A99A87C0A99885C066236F
+:1024000011F0AA9A81C0AA987FC0662311F0AB9AF6
+:102410007BC0AB9879C0662311F0AC9A75C0AC98BC
+:1024200073C0662311F0AD9A6FC0AD986DC066237E
+:1024300011F0AE9A69C0AE9867C0662321F0809112
+:10244000620080680DC0809162008F7709C06623AA
+:1024500021F080916200806403C0809162008F7BD4
+:102460008093620051C0662321F0809162008062F7
+:10247000F7CF809162008F7DF3CF662321F08091AA
+:1024800062008061EDCF809162008F7EE9CF66238C
+:1024900021F0809162008860E3CF80916200877FA5
+:1024A000DFCF662321F0809162008460D9CF8091D4
+:1024B00062008B7FD5CF662321F08091620082601D
+:1024C000CFCF809162008D7FCBCF662321F08091AA
+:1024D00062008160C5CF809162008E7FC1CF66238C
+:1024E00011F0189A11C018980FC0662311F0199AAC
+:1024F0000BC0199809C0662311F01A9A05C01A98E2
+:1025000003C0662321F01B9A81E090E008951B9898
+:1025100081E090E008951F93182F8150833130F0AF
+:102520008751833118F084E090E00FC0E12FFF273E
+:10253000EB5BFC4F83E08183812F0E94D60F61E02B
+:10254000812F0E94621181E090E01F910895CF9346
+:10255000DF93982FEB011882E82FFF27EB5BFC4FEE
+:102560008181813019F086E090E07DC0892F992724
+:10257000AA27BB27FC013197EC32F10540F4E65362
+:10258000FF4FEE0FFF1F0590F491E02D099484E0BA
+:1025900090E069C00D9B65C062C00E9B62C05FC0C9
+:1025A0000F9B5FC05CC0B09B5CC059C0B19B59C061
+:1025B00056C0B29B56C053C0B39B53C050C0B49BCF
+:1025C00050C04DC0B59B4DC04AC0B69B4AC047C025
+:1025D000B79B47C044C0809B44C041C0819B41C061
+:1025E0003EC0829B3EC03BC0839B3BC038C0849BA7
+:1025F00038C035C0859B35C032C0869B32C02FC0E5
+:10260000879B2FC02CC0989B2CC029C0999B29C0A8
+:1026100026C09A9B26C023C09B9B23C020C09C9BA6
+:1026200020C01DC0079B1DC01AC0069B1AC017C042
+:10263000059B17C014C0049B14C011C0039B11C09C
+:102640000EC0029B0EC00BC0089B0BC008C0099BAC
+:1026500008C005C00A9B05C002C00B9B02C081E0F8
+:10266000888381E090E0DF91CF910895CF93DF934D
+:10267000CDB7DEB721970FB6F894DEBF0FBECDBF42
+:102680009BE19093EB04BE016F5F7F4F0E94A71206
+:102690008093EC0489818093ED041092EE0484E031
+:1026A00090E00E94AE0121960FB6F894DEBF0FBEF7
+:1026B000CDBFDF91CF9108959AE19093EB040E94F2
+:1026C00062118093EC041092ED0483E090E00E948C
+:1026D000AE01089598E19093EB040E94431180931A
+:1026E000EC041092ED0483E090E00E94AE010895A6
+:1026F000982F89E18093EB04933099F0943028F47B
+:10270000913059F0923029F40AC0943061F095303C
+:1027100061F085E090E020E00BC026B307C023B352
+:1027200005C020B303C021B101C020B181E090E019
+:102730008093EC042093ED041092EE0484E090E08A
+:102740000E94AE01089597E19093EB040E948B12D2
+:102750008093EC041092ED0483E090E00E94AE01BF
+:10276000089595E19093EB040E9485108093EC040A
+:102770001092ED0483E090E00E94AE01089596E18E
+:102780009093EB040E94D60F8093EC041092ED041A
+:1027900083E090E00E94AE01089584E18093EB0411
+:1027A00081E08093EC041092ED0483E090E00E94BD
+:1027B000AE01089582E18093EB0481E08093EC0404
+:1027C0001092ED0483E090E00E94AE01089583E151
+:1027D0008093EB0481E08093EC041092ED0483E09D
+:1027E00090E00E94AE01089580E18093EB0481E0C7
+:1027F0008093EC041092ED0483E090E00E94AE011F
+:10280000089591E19093EB040E9475108093EC047D
+:102810001092ED0483E090E00E94AE010895FC0167
+:1028200080818531C9F1863180F4823131F1833183
+:1028300030F48031D1F0813109F04CC01AC08331BD
+:1028400009F1843109F046C022C0883189F189310B
+:1028500028F4863129F18731E9F526C08A3189F1DA
+:102860008A3158F18B31B1F531C082810E94F41365
+:10287000089582810E9401140895638182810E94DB
+:10288000DA130895638182810E94E71308956381BA
+:1028900082810E94CD13089582810E94B113089510
+:1028A00082810E94BF13089582810E94A31308951C
+:1028B000638182810E946A13089582810E94781345
+:1028C0000895638182810E945C13089582810E9431
+:1028D000361308958093EB0483E08093EC04109208
+:1028E000ED0483E090E00E94AE010895E82F81524C
+:1028F000883018F084E090E00895FF27EB5BFC4FF0
+:1029000084E0818381E090E00895E82FFF27EB5B6E
+:10291000FC4F8181843019F084E090E008951182A9
+:1029200081E090E0089517B8823039F0833049F0A3
+:10293000813021F082E090E008953E9A81E090E0BD
+:10294000089587B1806C87B981E090E0089593E89D
+:1029500096B997B1907F982B97B9369A3699FECF52
+:1029600084B195B120E030E040E050E0369A3699ED
+:10297000FECF84B195B1480F591F2F5F3F4F2430D0
+:102980003105A1F73798CA01969587959695879551
+:102990000895CF93DF93EB0119821882282F3327F4
+:1029A000F901EB5BFC4F8181843019F086E090E007
+:1029B0000AC088E290E0821B930B0E94A7149983BF
+:1029C000888381E090E0DF91CF91089593E2909326
+:1029D000EB040E9493148093EC041092ED0483E0C6
+:1029E00090E00E94AE010895CF93DF93CDB7DEB79C
+:1029F00022970FB6F894DEBF0FBECDBF92E2909340
+:102A0000EB04BE016F5F7F4F0E94C9148093EC04FA
+:102A100029813A81832F99278093ED042093EE0436
+:102A20001092EF0485E090E00E94AE0122960FB66E
+:102A3000F894DEBF0FBECDBFDF91CF91089591E234
+:102A40009093EB04E82FFF27EB5BFC4F81818430F0
+:102A500019F084E090E003C0118281E090E080935F
+:102A6000EC041092ED0483E090E00E94AE01089522
+:102A7000E82F80E28093EB048E2F8152883018F08B
+:102A800084E090E007C0FF27EB5BFC4F84E081838C
+:102A900081E090E08093EC041092ED0483E090E0FC
+:102AA0000E94AE010895FC018081813271F0823272
+:102AB00018F48032B1F405C0823259F0833289F4BF
+:102AC0000CC082810E943815089582810E941F15D2
+:102AD000089582810E94F414089582810E94E61470
+:102AE00008958093EB0483E08093EC041092ED044E
+:102AF00083E090E00E94AE010895E4E7F0E0808179
+:102B0000846080838BE0809352038CE08093530336
+:102B100081E090E00895E4E7F0E080818B7F80839E
+:102B2000109252031092530381E090E00895809335
+:102B30007000E1E7F0E080818C7F8083808180837A
+:102B400081E090E00895809171009927887F9070CE
+:102B500008958091710084EA8093740080917400DC
+:102B600087FFFCCF81E090E0089584E980937400B2
+:102B70008091740084FDFCCF81E090E00895AC0169
+:102B800020E030E00FC0FA01E20FF31F8081809354
+:102B9000730084E8809374008091740087FFFCCFF9
+:102BA0002F5F3F4F2617370774F3089584E880930B
+:102BB00074008091740087FFFCCF80917300992787
+:102BC000089585E38093EB0481E08093EC0420E09A
+:102BD00030E00FC084E8809374008091740087FF18
+:102BE000FCCF80917300F901E351FB4F80832F5F8D
+:102BF0003F4F2617370774F3FB01E351FB4F108259
+:102C0000CB0103960E94AE0108959B01BC01C9014E
+:102C10000E94BF1581E08093EC041092ED0483E0E4
+:102C200090E00E94AE01089584E980937400809141
+:102C3000740084FDFCCF81E08093EC041092ED04DD
+:102C400083E090E00E94AE0108958091710084EAD3
+:102C5000809374008091740087FFFCCF81E08093A3
+:102C6000EC041092ED0483E090E00E94AE01089520
+:102C700080937000E1E7F0E080818C7F8083808129
+:102C8000808381E08093EC041092ED0483E090E077
+:102C90000E94AE010895E4E7F0E080818B7F80839D
+:102CA000109252031092530381E08093EC0410922F
+:102CB000ED0483E090E00E94AE010895E4E7F0E0C7
+:102CC0008081846080838BE0809352038CE08093CA
+:102CD000530381E08093EC041092ED0483E090E0D4
+:102CE0000E94AE010895FC0180818093EB0484333F
+:102CF000D1F0853338F4813379F0823381F0803339
+:102D000031F507C08633E9F08633A0F08733F9F454
+:102D10001BC00E945E1608950E944B160895828182
+:102D20000E943816089582813396BF0199270E9428
+:102D30000516089563817727828199270E94E115FE
+:102D400008950E94251608950E941416089583E0A0
+:102D50008093EC041092ED0483E090E00E94AE01B9
+:102D60000895782F613079F0613050F0623021F0B1
+:102D7000633009F059C002C061E003C061E004C0E3
+:102D800060E030E002C060E031E04330D9F0443030
+:102D900028F4413089F0423090F40CC0453031F0D5
+:102DA0004530A0F0463009F03FC002C040E005C009
+:102DB00040E006C041E007C041E050E005C041E00E
+:102DC00050E006C040E051E020E003C040E051E0A8
+:102DD00021E0BB9887B3866087BB88B3817F88BBBF
+:102DE00080E090E0772311F081E090E075E0880FBB
+:102DF000991F7A95E1F78065660F660F660F682B5D
+:102E0000330F330F362B352B440F432B4DB92EB9CF
+:102E100088E080934B038AE080934C0389E08093A1
+:102E20004D0381E090E0089582E090E008951DB8A0
+:102E30001EB810924B0310924C0310924D0381E088
+:102E400090E00895AC0120E030E008C0E60FF71FE5
+:102E500080818FB9779BFECF2F5F3F4FE22FFF27F7
+:102E6000E417F5079CF381E090E00895DC0120E091
+:102E700030E040E050E014C01FB809C083E0493E94
+:102E800058071CF088E090E008954F5F5F4F779BF4
+:102E9000F5CFFB01E20FF31F8FB180832F5F3F4F10
+:102EA0002A173B074CF381E090E00895CF93DF931E
+:102EB000EC0120E030E0A0E0B0E017C0FE01E20F3E
+:102EC000F31F80818FB908C0119683E0A93EB8072F
+:102ED0001CF088E090E00EC0779BF6CFFB01E20F7C
+:102EE000F31F8FB180832F5F3F4F2417350734F3D3
+:102EF00081E090E0DF91CF910895EF92FF920F93E0
+:102F00001F938B01EBEEEE2EE4E0FE2E23E42093E4
+:102F1000EB04B7016E5F7F4FA8010E9456178093A4
+:102F2000EC040E5F1F4FE00EF11EF7011082C80186
+:102F300001960E94AE011F910F91FF90EF900895AE
+:102F4000EF92FF920F931F938C01FBEEEF2EF4E0B4
+:102F5000FF2E84E48093EB04B7016E5F7F4FC801BE
+:102F60000E9436178093EC040E5F1F4FE00EF11E97
+:102F7000F7011082C80101960E94AE011F910F91C6
+:102F8000FF90EF90089593E49093EB0499270E94AB
+:102F900022178093EC041092ED0483E090E00E94ED
+:102FA000AE01089581E48093EB040E94171780938B
+:102FB000EC041092ED0483E090E00E94AE010895CD
+:102FC00090E49093EB040E94B1168093EC0410926D
+:102FD000ED0483E090E00E94AE010895CF93DF936B
+:102FE000EC0188818334A9F0843428F4803441F0E2
+:102FF000813409F50BC0843499F08534E1F414C0B0
+:103000004C816B818A810E94E01720C00E94D217F8
+:103010001DC0BE016D5F7F4F8A810E94C31716C01D
+:103020008A8199270E94A0176A817727CE0103968B
+:103030000E947D170BC08093EB0483E08093EC0427
+:103040001092ED0483E090E00E94AE01DF91CF91F9
+:103050000895B89AB99ABA9ABB98BC9ABD9AC4987E
+:10306000C59881E08093560382E080935703809354
+:1030700058038093590381E090E00895109256031D
+:1030800010925703109258031092590381E090E078
+:103090000895C098C198C29880E29EE40197F1F724
+:1030A000C09A8AE0982F9A95F1F7C29AC19A8A95A8
+:1030B000F1F70895282FC19887FD02C0C29801C07A
+:1030C000C29A8AE0982F9A95F1F7C19A8A95F1F7FA
+:1030D000C19826FF02C0C29A01C0C2988AE0982F08
+:1030E0009A95F1F7C19A8A95F1F70895282F220F42
+:1030F00030E0C19827FF02C0C29A01C0C2988AE09E
+:10310000982F9A95F1F7C19A8A95F1F73F5F37307A
+:1031100011F0220FEECF0895282F30E0C19827FF3D
+:1031200002C0C29A01C0C2988AE0982F9A95F1F71E
+:10313000C19A8A95F1F73F5F383011F0220FEECF38
+:103140000895C198C2988AE0982F9A95F1F7C19A8C
+:10315000982F9A95F1F7C198C098982F9A95F1F702
+:10316000C19A982F9A95F1F7C1988A95F1F7C09A6C
+:1031700080E090E00895C198C098C298C39A0895DD
+:103180000E94491880E30E945A1880E60E9476182F
+:1031900008950E94491880E00E945A1880E00E9419
+:1031A00076180E94BB1808950F931F93182F062FAF
+:1031B0000E94491880E40E945A18812F0E947618B4
+:1031C000802F0E948C1881E090E01F910F9108954C
+:1031D0001F93182F0E94491880EC0E945A18812FC3
+:1031E0000E9476180E94A11899271F910895C198EE
+:1031F0008AE08A95F1F7C29830E090E0990FC19A81
+:103200002AE0822F8A95F1F7C198B3999F5F822FA8
+:103210008A95F1F73F5F383089F7C098C19A822FBD
+:103220008A95F1F7C09AC1982A95F1F7892F9927C5
+:1032300008951F93182F0E94491880E80E945A1879
+:10324000812F0E9476180E94F71899271F910895E0
+:10325000DF92EF92FF920F931F93CF93DF93D82EBD
+:103260007B018A01C0E0D0E009C08D2D8C0F0E9447
+:103270001919F801EC0FFD1F80832196CE15DF058B
+:10328000A1F781E090E0DF91CF911F910F91FF9026
+:10329000EF90DF9008950F931F93082F162F0E9431
+:1032A000C018612F802F0E94D41881E090E01F91F8
+:1032B0000F910895DF92EF92FF920F931F93CF9398
+:1032C000DF93D82E7B018A01C0E0D0E009C0F8016D
+:1032D000EC0FFD1F60818D2D8C0F0E944B192196E4
+:1032E000CE15DF05A1F781E090E0DF91CF911F912E
+:1032F0000F91FF90EF90DF90089594E09093EB048E
+:103300000E945A198093EC041092ED0483E090E03F
+:103310000E94AE010895EF92FF920F931F938B01CD
+:103320009BEEE92E94E0F92E93E09093EB04A70135
+:103330004E5F5F4F0E9428198093EC040E5F1F4F71
+:10334000E00EF11EF7011082C80101960E94AE0145
+:103350001F910F91FF90EF90089582E08093EB040E
+:10336000109256031092570310925803109259036B
+:1033700081E08093EC041092ED0483E090E00E94E1
+:10338000AE01089581E08093EB040E942918809398
+:10339000EC041092ED0483E090E00E94AE010895E9
+:1033A000FC018381823069F0833018F48130F1F4BC
+:1033B00005C0833049F08430C9F40FC00E94C2199F
+:1033C00008950E94AD190895AF014A5F5F4F65816E
+:1033D000772784810E948B190895AF014A5F5F4F60
+:1033E0006581772784810E947D190895808180936B
+:1033F000EB0483E08093EC041092ED0483E090E012
+:103400000E94AE0108951F920F920FB60F921124E1
+:103410000F900FBE0F901F9018959C010897029770
+:1034200018F084E090E00895F901EB5BFC4F8DE02B
+:1034300081832830310561F02930310519F087E0AA
+:1034400090E00895BD9A81E090E09BBD8ABD08950B
+:10345000BC9A81E090E00895FC01EB5BFC4F118287
+:1034600081E090E008959C01FC01EB5BFC4F8181C1
+:103470008D3019F086E090E008952830310539F15B
+:103480002930310519F087E090E008956330710527
+:10349000A9F0643071053CF46130710559F0623077
+:1034A0007105A9F409C06430710551F065307105EA
+:1034B00071F408C081E007C082E005C083E003C06A
+:1034C00084E001C085E08EBD81E090E0089581E058
+:1034D00090E008959C01FC01EB5BFC4F81818D30F5
+:1034E00019F086E090E008952830310531F0293058
+:1034F000310531F087E090E0089581E090E0089593
+:103500007BBD6ABD81E090E008959C0183E58093D6
+:10351000EB04F901EB5BFC4F81818D3019F086E003
+:1035200090E00DC02830310541F02930310519F007
+:1035300087E090E004C07BBD6ABD81E090E08093AD
+:10354000EC041092ED0483E090E00E94AE01089537
+:1035500022E52093EB040E94331A8093EC0410922E
+:10356000ED0483E090E00E94AE01089521E52093F0
+:10357000EB04FC01EB5BFC4F118281E08093EC04D7
+:103580001092ED0483E090E00E94AE01089520E5E2
+:103590002093EB040E940D1A8093EC041092ED042A
+:1035A00083E090E00E94AE010895FC0180818135A6
+:1035B00079F0823518F48035F1F405C0823569F070
+:1035C0008335C9F411C0828199270E94C71A0895D2
+:1035D000828199270E94B61A089563817727828194
+:1035E00099270E94A81A08956381772782819927D5
+:1035F0000E94851A08958093EB0483E08093EC0485
+:103600001092ED0483E090E00E94AE010895CF9304
+:10361000DF93CDB7DEB7DF91CF910895089581E0B4
+:1036200090E0089508958A3310F4805301C08755BF
+:103630006A3310F4605301C067556F708295807FC4
+:10364000682B862F992708950895DC0180E1A0302A
+:10365000B80718F082E090E00895E199FECF9D014F
+:1036600009C03FBB2EBB2F5F3F4FE09AE60FF71F0D
+:103670008DB38083822F8A1BE82FFF27E417F5077D
+:1036800080F381E090E00895DC0180E1A030B8078C
+:1036900018F082E090E00895E199FECF9D010AC004
+:1036A0003FBB2EBB2F5F3F4FE60FF71F80818DBBC7
+:1036B000E29AE19A822F8A1BE82FFF27E417F50789
+:1036C00078F381E090E008950F931F938B0121E838
+:1036D0002093EB040E94441B8093EC041092ED04B1
+:1036E0001F930F9389EF92E09F938F930E94071B84
+:1036F00083E090E00E94AE010F900F900F900F902A
+:103700001F910F910895CF92DF92EF92FF920F9346
+:103710001F937B010BEE14E020E82093EB0422E0E2
+:10372000C22ED12CC00ED11EAB01B6010E94251BAA
+:103730008093EC0482E090E0E80EF91E0E0D1F1D50
+:10374000F8011082DF92CF9286E093E09F938F93EF
+:103750000E94071BC70101960E94AE010F900F90B7
+:103760000F900F901F910F91FF90EF90DF90CF90EF
+:103770000895EF92FF920F931F93CF93DF93EC0185
+:103780008B819927F82EEE248A81E80EF11C8D8119
+:103790009927182F00278C81080F111DFF92EF9297
+:1037A0001F930F9380E193E09F938F930E94071BD9
+:1037B00088812DB73EB72A5F3F4F0FB6F8943EBFC2
+:1037C0000FBE2DBF803819F0813869F405C0B801EB
+:1037D000C7010E94831B12C02696A801BE01C70123
+:1037E0000E94641B0BC08093EB0483E08093EC0485
+:1037F0001092ED0483E090E00E94AE01DF91CF9142
+:103800001F910F91FF90EF900895CF93DF93AC013C
+:10381000029710F442E050E0A0917006B09171065A
+:10382000FD01C0E0D0E020E030E020C08081918147
+:103830008417950769F482819381209719F09B83FF
+:103840008A8304C090937106809370069F0132C0F2
+:103850004817590738F42115310519F082179307D5
+:1038600008F49C01EF010280F381E02D3097F1F61E
+:103870002115310599F1C901841B950B049708F4B2
+:10388000A901E0E0F0E028C08D919C91119782178A
+:103890009307F9F44817590781F4ED018A819B8158
+:1038A000309719F09383828304C0909371068093BC
+:1038B00070069D012E5F3F4F4CC0841B950BFD0190
+:1038C000E80FF91F4193519302978D939C939F01A9
+:1038D00040C0FD01A281B3811097B1F680916E06C0
+:1038E00090916F06892B41F48091370390913803B2
+:1038F00090936F0680936E062091390330913A03BE
+:103900002115310549F48DB7282F332780913503D0
+:1039100090913603281B390BA0916E06B0916F066B
+:103920002A1B3B0B2417350790F0CA010296281773
+:10393000390768F09D012E5F3F4FC901840F951F25
+:1039400090936F0680936E064D935C9302C020E0C7
+:1039500030E0C901DF91CF910895CF93DF930097B5
+:1039600009F44EC0EC0122971B821A82A0917006C6
+:10397000B0917106109711F140E050E001C0DC01F8
+:10398000AC17BD0700F1BB83AA83FE0121913191E1
+:10399000E20FF31FEA17FB0771F48D919C911197C9
+:1039A000280F391F2E5F3F4F39832883FD01828105
+:1039B00093819B838A834115510559F4D0937106F5
+:1039C000C09370061DC0FD0182819381AD010097F7
+:1039D000B1F6FA01D383C28321913191E20FF31F33
+:1039E000EC17FD0769F488819981280F391F2E5F34
+:1039F0003F4FFA01318320838A819B8193838283A5
+:103A0000DF91CF91089597FB092E07260AD077FD05
+:103A100004D00CD006D000201AF4709561957F4F29
+:103A20000895F6F7909581959F4F0895AA1BBB1BAB
+:103A300051E107C0AA1FBB1FA617B70710F0A61BAE
+:103A4000B70B881F991F5A95A9F780959095BC01CF
+:063A5000CD010895FFCF37
+:103A5600456D62656464656450726F6A656374730C
+:103A6600004F63746F70757355534220496E7465C9
+:103A7600726661636520436F6E7665727465722047
+:103A8600616E6420492F4F20457874656E73696FA7
+:103A96006E003230303831313038006669727374F6
+:103AA600207061636B6574206F662061206C6F6E99
+:103AB60067206D65737361676520286C656E677432
+:103AC600683A202564290A006F63746F7075732045
+:103AD6006C6F6E672072756E6E696E67206D6573AA
+:103AE600736167650A006F63746F7075732E6C6F10
+:103AF6006E675F696E646578203C206F63746F70D3
+:103B060075732E6C6F6E675F62797465730A006EEB
+:103B16006F74206C617374207061636B65743A20F6
+:103B260064696666203E2036340A006C6173742030
+:103B36007061636B65740A007061727365722C2024
+:103B4600636865636B3A2025582C20636F6D6D6141
+:103B56006E643A2025580A0063616C6C696E6720B2
+:103B6600696F5F7061727365720A0063616C6C697C
+:103B76006E67206164635F7061727365720A0063C9
+:103B8600616C6C696E67206932635F706172736520
+:103B9600720A0063616C6C696E67207370695F708E
+:103BA60061727365720A0063616C6C696E6720707E
+:103BB600776D5F7061727365720A0063616E277458
+:103BC6002063616C6C2063616E5F706172736572F5
+:103BD600202D206E6F2043414E2D737570706F72CD
+:103BE600740A0063616C6C696E6720656570726F3C
+:103BF6006D5F7061727365720A00756E6B6E6F77BA
+:103C06006E20636D640A00726563656976696E6726
+:103C160020636F6D6D616E643A20255820286C65AF
+:103C26006E6774683A202575290A00676574206EE8
+:103C36006578740A0067657420616E64206578652E
+:103C4600637574650A000904007772697474656E99
+:103C56003A2025730A00726561643A2025730A00CA
+:103C6600656570726F6D5F7061727365723A206C14
+:103C7600656E6774683A2025752C20616464723A13
+:0C3C86002025750A0020007206000000D6
+:00000001FF
diff --git a/firmware/pin.c b/firmware/pin.c new file mode 100644 index 0000000..97218b7 --- /dev/null +++ b/firmware/pin.c @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2009 Embedded Projects (http://www.embedded-projects.net) + * Author: Benedikt Sauter <sauter@embedded-projects.net> + * All rights reserved. + * + * Short descripton of file: + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the FH Augsburg nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES{} LOSS OF USE, + * DATA, OR PROFITS{} OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <inttypes.h> +#include <avr/io.h> + +#include "pin.h" + + +char pin_get_conf(uint8_t i, pin_conf *p) +{ + switch(i) + { + case 3: p->ox_port = &PORTC; p->ox_pin = &PINC; p->ox_ddr = &DDRC; p->ox_p = PC0; break; + case 4: p->ox_port = &PORTC; p->ox_pin = &PINC; p->ox_ddr = &DDRC; p->ox_p = PC1; break; + case 5: p->ox_port = &PORTC; p->ox_pin = &PINC; p->ox_ddr = &DDRC; p->ox_p = PC2; break; + case 6: p->ox_port = &PORTC; p->ox_pin = &PINC; p->ox_ddr = &DDRC; p->ox_p = PC3; break; + case 7: p->ox_port = &PORTC; p->ox_pin = &PINC; p->ox_ddr = &DDRC; p->ox_p = PC4; break; + case 8: p->ox_port = &PORTC; p->ox_pin = &PINC; p->ox_ddr = &DDRC; p->ox_p = PC5; break; + case 9: p->ox_port = &PORTC; p->ox_pin = &PINC; p->ox_ddr = &DDRC; p->ox_p = PC6; break; + + case 10: p->ox_port = &PORTF; p->ox_pin = &PINF; p->ox_ddr = &DDRF; p->ox_p = PF7; break; + case 11: p->ox_port = &PORTF; p->ox_pin = &PINF; p->ox_ddr = &DDRF; p->ox_p = PF6; break; + case 12: p->ox_port = &PORTF; p->ox_pin = &PINF; p->ox_ddr = &DDRF; p->ox_p = PF5; break; + case 13: p->ox_port = &PORTF; p->ox_pin = &PINF; p->ox_ddr = &DDRF; p->ox_p = PF4; break; + case 14: p->ox_port = &PORTF; p->ox_pin = &PINF; p->ox_ddr = &DDRF; p->ox_p = PF3; break; + case 15: p->ox_port = &PORTF; p->ox_pin = &PINF; p->ox_ddr = &DDRF; p->ox_p = PF2; break; + case 16: p->ox_port = &PORTF; p->ox_pin = &PINF; p->ox_ddr = &DDRF; p->ox_p = PF1; break; + case 17: p->ox_port = &PORTF; p->ox_pin = &PINF; p->ox_ddr = &DDRF; p->ox_p = PF0; break; + + case 18: p->ox_port = &PORTE; p->ox_pin = &PINE; p->ox_ddr = &DDRE; p->ox_p = PE0; break; + case 19: p->ox_port = &PORTE; p->ox_pin = &PINE; p->ox_ddr = &DDRE; p->ox_p = PE1; break; + case 20: p->ox_port = &PORTE; p->ox_pin = &PINE; p->ox_ddr = &DDRE; p->ox_p = PE2; break; + case 21: p->ox_port = &PORTE; p->ox_pin = &PINE; p->ox_ddr = &DDRE; p->ox_p = PE3; break; + case 22: p->ox_port = &PORTE; p->ox_pin = &PINE; p->ox_ddr = &DDRE; p->ox_p = PE5; break; + case 23: p->ox_port = &PORTE; p->ox_pin = &PINE; p->ox_ddr = &DDRE; p->ox_p = PE6; break; + case 24: p->ox_port = &PORTE; p->ox_pin = &PINE; p->ox_ddr = &DDRE; p->ox_p = PE7; break; + + case 25: p->ox_port = &PORTB; p->ox_pin = &PINB; p->ox_ddr = &DDRB; p->ox_p = PB0; break; + case 26: p->ox_port = &PORTB; p->ox_pin = &PINB; p->ox_ddr = &DDRB; p->ox_p = PB1; break; + case 27: p->ox_port = &PORTB; p->ox_pin = &PINB; p->ox_ddr = &DDRB; p->ox_p = PB2; break; + case 28: p->ox_port = &PORTB; p->ox_pin = &PINB; p->ox_ddr = &DDRB; p->ox_p = PB3; break; + case 29: p->ox_port = &PORTB; p->ox_pin = &PINB; p->ox_ddr = &DDRB; p->ox_p = PB4; break; + case 30: p->ox_port = &PORTB; p->ox_pin = &PINB; p->ox_ddr = &DDRB; p->ox_p = PB5; break; + case 31: p->ox_port = &PORTB; p->ox_pin = &PINB; p->ox_ddr = &DDRB; p->ox_p = PB6; break; + case 32: p->ox_port = &PORTB; p->ox_pin = &PINB; p->ox_ddr = &DDRB; p->ox_p = PB7; break; + + case 33: p->ox_port = &PORTD; p->ox_pin = &PIND; p->ox_ddr = &DDRD; p->ox_p = PD0; break; + case 34: p->ox_port = &PORTD; p->ox_pin = &PIND; p->ox_ddr = &DDRD; p->ox_p = PD1; break; + case 35: p->ox_port = &PORTD; p->ox_pin = &PIND; p->ox_ddr = &DDRD; p->ox_p = PD2; break; + case 36: p->ox_port = &PORTD; p->ox_pin = &PIND; p->ox_ddr = &DDRD; p->ox_p = PD3; break; + case 37: p->ox_port = &PORTD; p->ox_pin = &PIND; p->ox_ddr = &DDRD; p->ox_p = PD4; break; + case 38: p->ox_port = &PORTD; p->ox_pin = &PIND; p->ox_ddr = &DDRD; p->ox_p = PD5; break; + case 39: p->ox_port = &PORTD; p->ox_pin = &PIND; p->ox_ddr = &DDRD; p->ox_p = PD6; break; + case 40: p->ox_port = &PORTD; p->ox_pin = &PIND; p->ox_ddr = &DDRD; p->ox_p = PD7; break; + + default: return 0; + } + + return 1; +} diff --git a/firmware/pin.h b/firmware/pin.h new file mode 100644 index 0000000..f0deda7 --- /dev/null +++ b/firmware/pin.h @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2009 Embedded Projects (http://www.embedded-projecs.net) + * Author: Michael Hartmann <hartmann@embedded-projects.net> + * All rights reserved. + * + * Short descripton of file: + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of the FH Augsburg nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef PIN_H +#define PIN_H + +#include <inttypes.h> + +#define OX_AD7 10 +#define OX_AD6 11 +#define OX_AD5 12 +#define OX_AD4 13 +#define OX_AD3 14 +#define OX_AD2 15 +#define OX_AD1 16 +#define OX_AD0 17 + +#define OX_RX0 18 +#define OX_TX0 19 +#define OX_RX1 35 +#define OX_TX1 36 + +#define OX_SS 25 +#define OX_SCK 26 +#define OX_MOSI 27 +#define OX_MISO 28 + +#define OX_PWM1 30 +#define OX_PWM2 29 + +#define OX_SCL 33 +#define OX_SDA 34 + +#define OX_LED1 3 +#define OX_LED2 4 +#define OX_LED3 5 +#define OX_LED4 6 +#define OX_LED5 7 +#define OX_LED6 8 +#define OX_LED7 9 +#define OX_LED_STATUS 32 + +typedef struct pin_conf { + volatile unsigned char *ox_port; + volatile unsigned char *ox_pin; + volatile unsigned char *ox_ddr; + volatile unsigned char ox_p; +} pin_conf; + +char pin_get_conf(uint8_t i, pin_conf *p); + +#endif /* PIN_H */ diff --git a/firmware/protocol.h b/firmware/protocol.h index fce8eda..af2c6fb 100644 --- a/firmware/protocol.h +++ b/firmware/protocol.h @@ -42,18 +42,20 @@ #define CMD_IO_PORT_GET 0x19 #define CMD_IO_PIN_SET 0x1A #define CMD_IO_PIN_GET 0x1B +#define CMD_IO_SET_STATUS_LED 0x1C #define CMD_ADC_INIT_PIN 0x20 -#define CMD_ADC_GET 0x21 -#define CMD_ADC_REF 0x22 - +#define CMD_ADC_DEINIT_PIN 0x21 +#define CMD_ADC_GET 0x22 +#define CMD_ADC_REF 0x23 + #define CMD_I2C_INIT 0x30 #define CMD_I2C_DEINIT 0x31 #define CMD_I2C_SET_BITRATE 0x32 -#define CMD_I2C_SEND_BYTE 0x34 -#define CMD_I2C_RECV_BYTES 0x35 -#define CMD_I2C_SEND_START 0x36 -#define CMD_I2C_SEND_STOP 0x37 +#define CMD_I2C_SEND 0x34 +#define CMD_I2C_RECV 0x35 +#define CMD_I2C_SEND_START 0x36 +#define CMD_I2C_SEND_STOP 0x37 #define CMD_SPI_INIT 0x40 #define CMD_SPI_DEINIT 0x41 @@ -78,6 +80,17 @@ #define CMD_UART_RECV 0x67 #define CMD_UART_SEND 0x68 +#define CMD_CAN_INIT 0x70 +#define CMD_CAN_DEINIT 0x71 +#define CMD_CAN_SEND_DATA 0x72 +#define CMD_CAN_ENABLE_MOB 0x73 +#define CMD_CAN_DISABLE_MOB 0x74 +#define CMD_CAN_SEND_REMOTE 0x75 +#define CMD_CAN_RECEIVE_DATA 0x76 +#define CMD_CAN_SET_AUTOREPLY 0x77 + +#define CMD_EEPROM_READ_BYTES 0x80 +#define CMD_EEPROM_WRITE_BYTES 0x81 #define PARAM_ADC_AREF 0x01 #define PARAM_ADC_AVCC 0x02 diff --git a/firmware/pwm.c b/firmware/pwm.c index 9e3666d..b8b6231 100644 --- a/firmware/pwm.c +++ b/firmware/pwm.c @@ -84,7 +84,7 @@ int pwm_init(int pin) { case 9: /* set pin as output */ - OX_DDR9 |=(1<<OX_P9); + DDRB |=(1<<PB5); OCR1A=1; // TOP #ifdef OCTOPUS_CAN /* configure timer, (WGM = FAST PWM) (clear on OCnA, set on TOP COM1A1)*/ @@ -97,7 +97,7 @@ int pwm_init(int pin) #endif break; case 8: - OX_DDR8 |=(1<<OX_P8); + DDRB |=(1<<PB4); #ifdef OCTOPUS_CAN OCR2A=1; // TOP /* configure timer, (WGM = FAST PWM) (clear on OCnA, set on TOP COM1A1)*/ @@ -138,7 +138,7 @@ void pwm_deinit_usb(int pin) int pwm_deinit(int pin) { - octopus.ports[pin]=PIN_OUT; // this is wrong! + octopus.ports[pin]=PIN_NONE; #ifdef OCTOPUS_CAN switch(pin) { diff --git a/firmware/spi.c b/firmware/spi.c index 2b8abb1..b3e3a95 100644 --- a/firmware/spi.c +++ b/firmware/spi.c @@ -36,26 +36,24 @@ #include "spi.h" + void spi_parser(char *buf) { switch(buf[0]) { case CMD_SPI_INIT: - spi_init_usb(); - break; + spi_init_usb(buf[2], buf[3], buf[4]); + break; case CMD_SPI_DEINIT: spi_deinit_usb(); - break; - case CMD_SPI_SPEED: - spi_set_speed_usb((int)buf[2]); - break; + break; case CMD_SPI_SEND: - spi_send_usb(&buf[2], (int)buf[1]); - break; + spi_send_usb(buf[2], &buf[3]); + break; case CMD_SPI_RECV: - spi_receive_usb((int)buf[1]); + spi_receive_usb((int)buf[2]); case CMD_SPI_SEND_AND_RECV: - spi_send_and_receive_usb(&buf[2], (int)buf[1]); - break; + spi_send_and_receive_usb(&buf[3], (int)buf[2]); + break; default: answer[0] = buf[0]; answer[1] = RSP_UNKOWN_CMD; @@ -64,38 +62,111 @@ void spi_parser(char *buf) } } -void spi_init_usb(void) +void spi_init_usb(uint8_t dord, uint8_t mode, uint8_t speed) { answer[0] = CMD_SPI_INIT; - answer[1] = (unsigned char) spi_init(); - answer[3] = 0; + answer[1] = (unsigned char) spi_init(dord, mode, speed); + answer[2] = 0; CommandAnswer(3); } -int spi_init(void) +int spi_init(uint8_t dord, uint8_t mode, uint8_t speed) { - PORTB &= ~((1 << SCK)|(1<<MISO)|(1<<MOSI)); // SCK have to be low in IDLE - DDRB &=~(1 << MISO); - DDRB = (1 << MOSI)|(1 << SCK); + uint8_t cpol, cpha, spr1, spr0, spi2x; + + dord = dord ? 1 : 0; + + switch(mode) + { + case 0: + cpol = 0; + cpha = 0; + break; + case 1: + cpol = 0; + cpha = 1; + break; + case 2: + cpol = 1; + cpha = 0; + break; + case 3: + cpol = 1; + cpha = 1; + break; + default: + return RSP_ERROR; + } - SPCR = 0; - SPSR = 0; + switch(speed) + { + case SPI_SPEED_125kHz: + spi2x = 0; + spr1 = 1; + spr0 = 1; + break; + case SPI_SPEED_250kHz: + spi2x = 0; + spr1 = 1; + spr0 = 0; + break; + case SPI_SPEED_500kHz: + spi2x = 1; + spr1 = 1; + spr0 = 0; + break; + case SPI_SPEED_1MHz: + spi2x = 0; + spr1 = 0; + spr0 = 1; + break; + case SPI_SPEED_2MHz: + spi2x = 1; + spr1 = 0; + spr0 = 1; + break; + case SPI_SPEED_4MHz: + spi2x = 0; + spr1 = 0; + spr0 = 0; + break; + case SPI_SPEED_8MHz: + spi2x = 1; + spr1 = 0; + spr0 = 0; + break; + default: + return RSP_ERROR; + } + + // MOSI, SCK: out/low + // MISO: in + DDRB &= ~(1 << MISO); + DDRB |= (1 << MOSI | 1 << SCK); + PORTB &= ~(1 << MOSI | 1 << MISO | 1 << SCK); // SCK has to be low in IDLE - SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1); + // SPE: SPI enable + // DORD: Data Order (0: starting with LSB) + // MSTR: Master mode + // SPR1, SPR2, SPI2X: speed + SPCR = (1 << SPE | dord << DORD | 1 << MSTR | cpol << CPOL | cpha << CPHA | + spr1 << SPR1 | spr0 << SPR0); + SPSR = (spi2x << SPI2X); - octopus.ports[5]=PIN_SCK; - octopus.ports[6]=PIN_MOSI; - octopus.ports[7]=PIN_MISO; + octopus.ports[5] = PIN_SCK; + octopus.ports[6] = PIN_MOSI; + octopus.ports[7] = PIN_MISO; return RSP_OK; } void spi_deinit_usb(void) { - answer[0]=CMD_SPI_DEINIT; - answer[1]=(unsigned char)spi_deinit(); - answer[2]=0; + answer[0] = CMD_SPI_DEINIT; + answer[1] = (unsigned char)spi_deinit(); + answer[2] = 0; + CommandAnswer(3); } @@ -104,36 +175,30 @@ int spi_deinit(void) SPCR = 0; SPSR = 0; - octopus.ports[5]=PIN_OUT; // this is wrong! - octopus.ports[6]=PIN_OUT; // this is wrong! - octopus.ports[7]=PIN_OUT; // this is wrong! + octopus.ports[5] = PIN_NONE; + octopus.ports[6] = PIN_NONE; + octopus.ports[7] = PIN_NONE; return RSP_OK; } -void spi_set_speed_usb(int speed){ - -} - -int spi_set_speed(int speed){ - - return RSP_OK; -} -void spi_send_usb(char * buf, int length) +void spi_send_usb(uint8_t length, char * buf) { - answer[0]=CMD_SPI_SEND; - answer[1]=(unsigned char)spi_send(buf,length); - answer[2]=0; + answer[0] = CMD_SPI_SEND; + answer[1] = (unsigned char)spi_send(length, buf); + answer[2] = 0; + CommandAnswer(3); } -int spi_send(char * buf, int length) +int spi_send(int length, char * buf) { - int i; - for(i=0;i<length;i++){ + uint8_t i; + for(i = 0; i < length; i++) + { SPDR = buf[i]; - while ( !(SPSR & (1 << SPIF)) ) ; + while(!(SPSR & (1 << SPIF))); } return RSP_OK; } @@ -141,22 +206,29 @@ int spi_send(char * buf, int length) void spi_receive_usb(int length) { - answer[0]=CMD_SPI_RECV; - answer[1]=(unsigned char)spi_receive((char*)&answer[2],length); - answer[2]=0; - CommandAnswer(length+2); + answer[0] = CMD_SPI_RECV; + answer[1] = (unsigned char)spi_receive(length, (char*)&answer[2]); + answer[2+length] = 0; + CommandAnswer(3+length); } -unsigned char spi_receive( char * buf, int length) +unsigned char spi_receive(int length, char * buf) { int i; int timeout = 0; - for(i=0;i<length;i++){ + + for(i = 0; i < length; i++) + { SPDR = 0; - while(!(SPSR & (1 << SPIF))) { timeout++; if( timeout > 1000) return RSP_TIMEOUT; } - buf[i]=SPDR; + while(!(SPSR & (1 << SPIF))) + { + if(timeout++ > 1000) + return RSP_TIMEOUT; + } + buf[i] = SPDR; } + return RSP_OK; } @@ -164,8 +236,8 @@ void spi_send_and_receive_usb(char * txbuf, int length) { answer[0]=CMD_SPI_SEND; answer[1]=(unsigned char)spi_send_and_receive(txbuf,(char *)&answer[2],length); - answer[2]=0; - CommandAnswer(2+length); + answer[2+length]=0; + CommandAnswer(3+length); } @@ -180,9 +252,3 @@ int spi_send_and_receive(char * txbuf, char * rxbuf, int length){ } return RSP_OK; } - - - - - - diff --git a/firmware/spi.h b/firmware/spi.h index d7cfbf1..8a8a1fe 100644 --- a/firmware/spi.h +++ b/firmware/spi.h @@ -41,24 +41,25 @@ #define MISO PB3 #define SCK PB1 -void spi_parser(char *buf); - -int spi_init(void); -int spi_deinit(void); +enum { SPI_SPEED_125kHz, SPI_SPEED_250kHz, SPI_SPEED_500kHz, SPI_SPEED_1MHz, + SPI_SPEED_2MHz, SPI_SPEED_4MHz, SPI_SPEED_8MHz }; -int spi_set_speed(int speed); -int spi_send(char * buf, int length); -unsigned char spi_receive( char * buf, int length); -int spi_send_and_receive(char * txbuf, char * rxbuf, int length); +void spi_parser(char *buf); +void spi_init_usb(uint8_t dord, uint8_t mode, uint8_t speed); +int spi_init(uint8_t dord, uint8_t mode, uint8_t speed); -void spi_init_usb(void); void spi_deinit_usb(void); +int spi_deinit(void); + +void spi_send_usb(uint8_t length, char * buf); +int spi_send(int length, char * buf); -void spi_set_speed_usb(int speed); -void spi_send_usb(char * buf, int length); void spi_receive_usb(int length); +unsigned char spi_receive(int length, char * buf); + void spi_send_and_receive_usb(char * txbuf, int length); +int spi_send_and_receive(char * txbuf, char * rxbuf, int length); #endif /* SPI_H */ diff --git a/firmware/uart.c b/firmware/uart.c index 02b4a87..9ae00c9 100644 --- a/firmware/uart.c +++ b/firmware/uart.c @@ -39,7 +39,7 @@ void uart_parser(char *buf) break; default: answer[1] = RSP_UNKOWN_CMD; - answer[2] = '\0'; + answer[2] = 0; CommandAnswer(3); } } @@ -47,7 +47,7 @@ void uart_parser(char *buf) void uart_init_usb(char uartport) { answer[1] = (unsigned char)uart_init(uartport); - answer[2] = '\0'; + answer[2] = 0; CommandAnswer(3); } @@ -78,7 +78,7 @@ char uart_init(char uartport) void uart_deinit_usb(char uartport) { answer[1] = (unsigned char)uart_deinit(uartport); - answer[2] = '\0'; + answer[2] = 0; CommandAnswer(3); } @@ -113,7 +113,7 @@ char uart_deinit(char uartport) void uart_baudrate_usb(char uartport, char ubrrll, char ubrrlh, char ubrrhl, char ubrrhh) { answer[1] = (unsigned char)uart_baudrate(uartport, ubrrll, ubrrlh, ubrrhl, ubrrhh); - answer[2] = '\0'; + answer[2] = 0; CommandAnswer(3); } @@ -140,7 +140,7 @@ char uart_baudrate(char uartport, char ubrrll, char ubrrlh, char ubrrhl, char ub void uart_stopbits_usb(char uartport, char stopbits) { answer[1] = (unsigned char)uart_stopbits(uartport, stopbits); - answer[2] = '\0'; + answer[2] = 0; CommandAnswer(3); } @@ -174,7 +174,7 @@ char uart_stopbits(char uartport, char stopbits) void uart_databits_usb(char uartport, char databits) { answer[1] = (unsigned char)uart_databits(uartport, databits); - answer[2] = '\0'; + answer[2] = 0; CommandAnswer(3); } @@ -209,7 +209,7 @@ char uart_databits(char uartport, char databits) void uart_parity_usb(char uartport, char parity) { answer[1] = (unsigned char)uart_databits(uartport, parity); - answer[2] = '\0'; + answer[2] = 0; CommandAnswer(3); } @@ -243,7 +243,7 @@ char uart_parity(char uartport, char parity) void uart_send_usb(char uartport, char length, char *buf) { answer[1] = (unsigned char)uart_send(uartport, length, buf); - answer[2] = '\0'; + answer[2] = 0; CommandAnswer(3); } @@ -255,9 +255,7 @@ char uart_send(char uartport, unsigned int length, char *buf) return RSP_UNKOWN_PIN; while(length--) - { uart_putchar(uartport, *buf++); - } return RSP_OK; } @@ -295,6 +293,8 @@ void uart_recv_usb(char uartport, int length) for(i = 0; i < length; i++) answer[2+i] = data[i]; + answer[2+length] = 0; + CommandAnswer(3+length); } @@ -330,52 +330,4 @@ char uart_getchar(char uartport) return c; } -/* -unsigned char AsciiToHex(unsigned char high,unsigned char low) -{ - unsigned char new; - - // check if lower equal 9 ( ascii 57 ) - if(high <= 57) // high is a number - high = high -48; - else // high is a letter - high = high -87; - - high = high << 4; - high = high & 0xF0; - - // check if lower equal 9 ( ascii 57 ) - if(low <= 57) // high is a number - low = low -48; - else // high is a letter - low = low -87; - low = low & 0x0F; - - new = high | low; - - return new; -} -void SendHex(unsigned char hex) -{ - unsigned char high,low; - // get highnibble - high = hex & 0xF0; - high = high >> 4; - - // get lownibble - low = hex & 0x0F; - - if(high<=9) - UARTPutChar(high+48); - else - UARTPutChar(high+87); - - - if(low<=9) - UARTPutChar(low+48); - else - UARTPutChar(low+87); - -} -*/ diff --git a/firmware/uart_fifo.c b/firmware/uart_fifo.c new file mode 100644 index 0000000..d4da869 --- /dev/null +++ b/firmware/uart_fifo.c @@ -0,0 +1,368 @@ +#include <inttypes.h> +#include <avr/io.h> + +#include "uart.h" +#include "common.h" +#include "protocol.h" +#include "fifo.h" + +#define BUFSIZE_IN 5 +#define BUFSIZE_OUT 5 + +uint8_t inbuf0[BUFSIZE_IN]; +uint8_t inbuf1[BUFSIZE_IN]; +fifo_t infifo0; +fifo_t infifo1; + +uint8_t outbuf1[BUFSIZE_OUT]; +uint8_t outbuf0[BUFSIZE_OUT]; +fifo_t outfifo0; +fifo_t outfifo1; + + +void uart_parser(char *buf) +{ + answer[0] = buf[0]; + + switch(buf[0]) + { + case CMD_UART_INIT: + uart_init_usb((char)buf[2]); + break; + case CMD_UART_DEINIT: + uart_deinit_usb((char)buf[2]); + break; + + case CMD_UART_BAUDRATE: + uart_baudrate_usb((char)buf[2], (char)buf[3], (char)buf[4], (char)buf[5], (char)buf[6]); + break; + case CMD_UART_STOPBITS: + uart_stopbits_usb((char)buf[2], (char)buf[3]); + break; + case CMD_UART_DATABITS: + uart_stopbits_usb((char)buf[2], (char)buf[3]); + break; + case CMD_UART_PARITY: + uart_parity_usb((char)buf[2], (char)buf[3]); + break; + + case CMD_UART_SEND: + uart_send_usb((char)buf[2], (char)buf[3], &buf[4]); + break; + case CMD_UART_RECV: + uart_recv_usb((char)buf[2], (char)buf[3]); + break; + default: + answer[1] = RSP_UNKOWN_CMD; + answer[2] = 0; + CommandAnswer(3); + } +} + +void uart_init_usb(char uartport) +{ + answer[1] = (unsigned char)uart_init(uartport); + answer[2] = 0; + + CommandAnswer(3); +} + +char uart_init(char uartport) +{ + switch(uartport) + { + case 0: + octopus.ports[41] = PIN_UART; + octopus.ports[42] = PIN_UART; + /* enable transmitter receiver */ + UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0); + break; + case 1: + octopus.ports[14] = PIN_UART; + octopus.ports[15] = PIN_UART; + /* enable transmitter receiver */ + UCSR1B = (1 << RXEN1) | (1 << TXEN1) | (1 << RXCIE1); + break; + default: + return RSP_UNKOWN_PIN; + } + + return RSP_OK; +} + +void uart_deinit_usb(char uartport) +{ + answer[1] = (unsigned char)uart_deinit(uartport); + answer[2] = 0; + + CommandAnswer(3); +} + +char uart_deinit(char uartport) +{ + switch(uartport) + { + case 0: + octopus.ports[41] = PIN_NONE; + octopus.ports[42] = PIN_NONE; + UBRR0H = 0; + UBRR0L = 0; + UCSR0B = 0; + UCSR0C = 0; + break; + case 1: + octopus.ports[14] = PIN_NONE; + octopus.ports[15] = PIN_NONE; + UBRR1H = 0; + UBRR1L = 0; + UCSR1B = 0; + UCSR1C = 0; + break; + default: + return RSP_UNKOWN_PIN; + } + + return RSP_OK; +} + +void uart_baudrate_usb(char uartport, char ubrrll, char ubrrlh, char ubrrhl, char ubrrhh) +{ + answer[1] = (unsigned char)uart_baudrate(uartport, ubrrll, ubrrlh, ubrrhl, ubrrhh); + answer[2] = 0; + + CommandAnswer(3); +} + +char uart_baudrate(char uartport, char ubrrll, char ubrrlh, char ubrrhl, char ubrrhh) +{ + switch(uartport) + { + case 0: + UBRR0H = (ubrrhh << 8) | ubrrhl; + UBRR0L = (ubrrhl << 8) | ubrrll; + break; + case 1: + UBRR1H = (ubrrhh << 8) | ubrrhl; + UBRR1L = (ubrrhl << 8) | ubrrll; + break; + default: + return RSP_UNKOWN_PIN; + } + + return RSP_OK; +} + +void uart_stopbits_usb(char uartport, char stopbits) +{ + answer[1] = (unsigned char)uart_stopbits(uartport, stopbits); + answer[2] = 0; + + CommandAnswer(3); +} + +char uart_stopbits(char uartport, char stopbits) +{ + char usbs; + + switch(stopbits) + { + case 1: usbs = 0; break; + case 2: usbs = 2; break; + default: usbs = 0; break; + } + + switch(uartport) + { + case 0: + UCSR0C |= (usbs << USBS0); + break; + case 1: + UCSR1C |= (usbs << USBS1); + break; + default: + return RSP_UNKOWN_PIN; + } + + return RSP_OK; +} + +void uart_databits_usb(char uartport, char databits) +{ + answer[1] = (unsigned char)uart_databits(uartport, databits); + answer[2] = 0; + + CommandAnswer(3); +} + +char uart_databits(char uartport, char databits) +{ + char ucsz1,ucsz0; + + switch(databits) { + case 5: ucsz1 = 0; ucsz0 = 0; break; + case 6: ucsz1 = 0; ucsz0 = 1; break; + case 7: ucsz1 = 1; ucsz0 = 0; break; + case 8: ucsz1 = 1; ucsz0 = 1; break; + default: ucsz1 = 1; ucsz0 = 1; break; + } + + switch(uartport) + { + case 0: + UCSR0C |= (ucsz1 << UCSZ01) | (ucsz0 << UCSZ00); + break; + case 1: + UCSR1C |= (ucsz1 << UCSZ11) | (ucsz0 << UCSZ10); + break; + default: + return RSP_UNKOWN_PIN; + } + + return RSP_OK; +} + +void uart_parity_usb(char uartport, char parity) +{ + answer[1] = (unsigned char)uart_databits(uartport, parity); + answer[2] = 0; + + CommandAnswer(3); +} + +char uart_parity(char uartport, char parity) +{ + char upm1, upm0; + switch(parity) + { + case 'N': upm1 = 0; upm0 = 0; break; + case 'E': upm1 = 1; upm0 = 0; break; + case 'O': upm1 = 1; upm0 = 1; break; + default: upm1 = 0; upm0 = 0; break; + } + + switch(uartport) + { + case 0: + UCSR0C |= (upm1 << UPM01) | (upm0 << UPM00); + break; + case 1: + UCSR1C |= (upm1 << UPM11) | (upm0 << UPM10); + break; + default: + return RSP_UNKOWN_PIN; + } + + return RSP_OK; +} + +void uart_send_usb(char uartport, char length, char *buf) +{ + answer[1] = (unsigned char)uart_send(uartport, length, buf); + answer[2] = 0; + + CommandAnswer(3); +} + + +char uart_send(char uartport, unsigned int length, char *buf) +{ + if(uartport != 0 && uartport != 1) + return RSP_UNKOWN_PIN; + + while(length--) + uart_putchar(uartport, *buf++); + + return RSP_OK; +} + +char uart_putchar(char uartport, char data) +{ + switch(uartport) + { + case 0: + fifo_put (&outfifo0, data); + UCSR0B |= (1 << UDRIE0); + break; + case 1: + fifo_put (&outfifo1, data); + UCSR1B |= (1 << UDRIE1); + break; + default: + return RSP_UNKOWN_PIN; + } + + return RSP_OK; +} + + +void uart_recv_usb(char uartport, int length) +{ + char data[length]; + int i; + + answer[1] = (char)uart_recv(uartport, data, length); + + for(i = 0; i < length; i++) + answer[2+i] = data[i]; + + answer[2+length] = 0; + + CommandAnswer(3+length); +} + +char uart_recv(char uartport, char * buf, int length) +{ + if(uartport != 0 && uartport != 1) + return RSP_UNKOWN_PIN; + + while(length-- > 0) + *buf++ = uart_getchar(uartport); + + return RSP_OK; +} + +char uart_getchar(char uartport) +{ + char c; + + switch(uartport) + { + case 0: + while (!(UCSR0A & (1 << RXC0))); + c = UDR0; + break; + case 1: + while (!(UCSR1A & (1 << RXC1))); + c = UDR1; + break; + default: + return RSP_UNKOWN_PIN; + } + + return c; +} + +// Empfangene Zeichen werden in die Eingabgs-FIFO gespeichert und warten dort +//SIGNAL (SIG_UART0_RECV) +//{ +// _inline_fifo_put (&infifo0, UDR0); +//} + +// Ein Zeichen aus der Ausgabe-FIFO lesen und ausgeben +// Ist das Zeichen fertig ausgegeben, wird ein neuer SIG_UART_DATA-IRQ getriggert +// Ist die FIFO leer, deaktiviert die ISR ihren eigenen IRQ. +SIGNAL (SIG_UART0_DATA) +{ + PORTC ^= 5; + if (outfifo0.count > 0) + { + PORTC ^= 2; + UDR0 = _inline_fifo_get (&outfifo0); + } + else + { + PORTC ^= 3; + UCSR0B &= ~(1 << UDRIE0); + } +} + diff --git a/firmware/usbn2mc.c b/firmware/usbn2mc.c index d9b0fdd..413009c 100644 --- a/firmware/usbn2mc.c +++ b/firmware/usbn2mc.c @@ -81,7 +81,7 @@ USBNInitMC (void) USB_CS_DDR |= (1 << PF_CS); USB_CS_PORT |= (1 << PF_CS); - sei (); + //sei (); } |